diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index 6fbf923e..3670d886 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -1,7 +1,7 @@ e)?,KXϽ0-@?c[+)FX1L_E.2 UFcs R +/E BscPa0q᥻:m+f&rzTzh(ŐHdushTVNv)\^tN& =<򞰡DwdjV/w@ ĩҊ?tRf|M9SS#HR2ZK?9ns;T?JgDyV1u\" vA81]ҧ(0.RϿ%`sIW[nJ.ȼl%/5Ԃx)`"@EW*N:iu W0\V@Tk]/ca L>"N|w7q8ϊr!כhGd^U=e]$7'z@U$7t6A%%W[NI:cVb 㙵r&ws0n1߭ +bF p][{)y>prqNXb} Oz-ں c/Y9)bQݴl## lޞ3J>L*Y,gL+.Ww=пiW;L=TkjΩr =Vn2v4 سw 9QR~ *f&tF,<(@%-F wdbaf9:NG702QMoy$ZP[]TQNa[+gt9`xuOOi ˺MEbw^-$@)S `NSYy~c Oe"w*4zbAiqyOK1C +qKd: 6 !sb&[+"AVX|g 䖷ueMsKVRIoa.Q&Σ_0;I3G~TR}gx3ImQ{ ~Ӫ;EWݟ +:w9ǚwj"^p&>1x4CP{'#ƍv֐$ؒʒ4O*/@}c0$\׵|2sC^:9]b[mbf>MԎg &z&̈U_lo狎&[0k=Ɯ{1)[Ƚ4 Т;2cGE^i=\0 UX''}e%# Bq{r1,^6|oue(Z/dЊ bFɋ +.x gV[dM&O|* i:iMi15iX{04nTsD(m%'|bRA*JyfFPkT2[Z +ٙϺi7S>f\J>m 艾=7tWħ%棠cQ)G2:{r:^bWL]p؅sFV;P$h>?}]{KЎ/=ݖEVw#] OimqX&;ͪ!0^wLIa+kEBfļJ/.0@WS-jkqk}ۇTӕvކa\ϑz0$ }|" +Љp s4 +O f<}`loG)Ew&źCXvih>ߥd\a-rQ:;;.5dP{>푯1[ 5 i(9*gwS,Zq/Sp9e ^IQL/XUɉe|RMejG؟ #Bx3C-F#i݃CE_V(I ﹑ C53E9v|5LE<-<-(qӵE<+H"4љ]|hq7 ?naƐ?uٮ1HiYe_M烊LG+nP7D(S#Y i%T4 vuZDQ^h4 d,;2HWQ4{ƭ83(sXBtͰx [Umg?X3)/rŇ>}pl}9j8S* 6*>JSIF +`r]ML  U r J5ʾeYEM|3daR0&-vvb ? `[NVW'aMa^[E6m''qz6&0T -P$85Hl3m;Q ^RĭA gdb6ݹWʇBN4wcstGJ#4cU$eV2]ܛnlC$ \雫+U%]I{P_V[~5ݤ5q$  }󹜓*+ɋ4ZyĺeϺAvX0Lյ$1S9W ׋W&jL\7mi)n,^y?MnY67NVx1} +V_d?joaԈ%K=D(Ej{y]Q`9vM%4 ++82FxG\*Ǵe1PXV2q!f,DZ!Rt<3(fYMN`6ccL/mt@vbf3vo5QwrJ=8a&=K+Kyƣ;[HdKWji]g{} Ug!30W0B~RXLqQ/Ջ1wX ,_ONI'+Grrr7n(WmF_| f\Ê0c9sՅl:Y<ɕưq#?H>%vXS +GFz_|I_5ڗ;od{C!-Fc[fW ?2i?~,K`[iH&- :uv5˹Qf !y8YnfUhe&MM>)hZn2,<=4R.J6!R,fmaAeZc mУhN0l.Y=(ut@4^2 FԂ. jw{ݾ6VC%)C'̟[vy0 "٥L!."6`>лQ[ӄZ`t!B0g&35y}@Wp:#/fGtl#'[$:WOtQJ}a҃(0qO?۶Uv*bKEiE(UՕX 76{Ki~DM~3Ƴ|'jc/7x^pwH.ԥStȧ7GKP߯."Unx;6hgt`:YG 8}TG"3-ǀIJ;ohmHHqYV]>`?AOb]չt&:OkF +h +DPbӻrH1{KՄYOgy,@t¿ N<й':)u(k7-MWfU5숄-ԓT#K )BsII4h(QsʷJ 0`nlqp6KkSV21MCǭ nw3O7:9璹wji]ge/ѨBCO+Fsfq/n9yGMo6XwA$a ]EtU Y5mnslAppYh8̲,kBk*44dI xOR *'/ˤn6MrhZg۾\X9Xi]5ʹ,{ f5*LEƜjq1+[t011ڌ תo#%k"}jO'襱U`'$|He]tHbbO$r$()ӎn8[YBgB8oU:s=cLK& FG0CR޳Cܮ; :jU/@%|&;B'MQ3q\I^-COatÛ%jl1N5:tnzw - Ę6v‚}"> |Q˗14 n.*_GuSC8"hVx"7_9Azc2q`Mb4|h8)kbx^1%#x|-` +uC]]޿iF$ZprfZ"iOP"3!\$?y/sobB נ S Y ˭ݱ0PFy<~5HO[& +9w#A"Wk\~罍F,WӻH쩧_G6w9ECYdsrq"0eALcT Kt> ;}F7I dYѧ }utg4Ҽn dr+w܋ٞ&W{&b5i˱Yl3[!^ဏq&o4F3$iHI=S cì4Cow_"uÕs7n'YRVN/7.rCN.sk/(!cf2ZQi_SH̋l&JUcKZmDi& {H$~uWU%2E>ײmRD^S5"k"o̳KlۙJS{c%.pH ew2d(#N+&W3*Ri.5zeEߥu:4z.`= 1|3e#uW0*.bj /2xv^i |``Dk6s["T2E/[r*!cL;qrg>_iRg^X3e/>#mM%r= 3CMNMvzMC,KZVΣKǮgE|1͎ VIx=*m.҈8_J^ӛ +Il +Uë,R}] 9,DFwT~& V\I ñSKJU>B>"ufrAbBX]6gtM%=Wŝq[m&4 bH)Vǯ8`Sb÷nf zI b4~ j58~|B\7:$6W̽x Qsgfƌ$dōAq8/D8PDԨe* +t8[`gT$Ϛr'm>e@7kUv"J4vS@h7nnkRuPiq䨅@@%I]=ܗ H}*!NJs`7lO8n鏶7$}=ݎ\2]q)Hc 㗓1 +L7i0^ yLRy%nWPb3 ADT!ĺy8"с?`HzB|oG-LiȡA%sV)}CxgBZƺ{j;;Z5d)xt[FLGkǽ2k!0PuO)\FdE. +xbW: 8&\ϩ>ڻ j^|6 Io p7K*3p*&xfDE1U*iȓLfc"u%4fljq+9xoKibkhc|bO荢,Eן5)%fa )FS6ztzGF-v*xn4No{$繃^el=UC΋@lzZ=ne=DaV} aǿf{J +,#  3jQ \J9Pj~@&Ve6uS j4PU$iS]z[V-gUڷ$V [{;"-h^C=?;H%s}e8߅uIڳdX~)@F5vzUh5D`$dQPL׀8 +ɝ3pk_C֕9>{n·)An(ev*t&{6uDM숔 ,q07ia>QH0 +$FLHfQvfeGGŸi9)m6auª|IPh ]XjÁrjhNDHxE}]Ňyk@L:{ʤ+MAi(_'*s,=?|'$n#쫾7ם,xtnC9JGJcC[ոd7dFw1{V`mnC2,ețR\6SG9(iJk^5g!+y 9oiSH +,)S[ 7N;sTKzQZًC SHF{;En¤r>N:oOij"<_.:E +kqIɒxPȽ2\2؍Ubلt6t kxZ-d==ڻGxvRkہ 3oRd2uX,z!u2U F<5ŜD;Jz|uZ'- 3?%MO=c=e5btVYƒ*s5Be%+A+uYU`-eg̖sԱ(iʵ3*\-at*=7%U#.&Jm\l"@j ^?(@$2”|' jĜ˥os2|y0j! &UgpcXT0$X(.Fj6eKcL2`l1)>. IUW>#u GG'\'_a=*{}*mۜ!3v|@rzQ~{}<}rao`nxR D+>%QfKC4mwJERU j]}c] ,,ꛑW V4aoZTfߖa&"?[nXA8obWZ4 +Yd)! C2 sT +pntzg@FУgXg2^W º%?- i+Q6sP`EF4{dX>AmX|gcΗkdyʉ=D %d1,DIsA_ނ nkJ Zf>N[dW])?43ѩ'GW];ݣRJ[!ۅ*ЗMТ%R]QzaJkl,#qy%';53cݐ}TZ6?"kmF5鐦Vg۔Z_/=8dc]$?母ڳJn5 g(/Pn*x.G?ѵ4W+UO՟ػ_\5h u*GC!pPq/ƒb7[͒lpBkyW + qۡ !ZqtjG/:P8XNx֋ +<I)* +y"ZXZ~`}XtO侤ՑץM_Sy[[QӢG>}cԯƮQCbO,8Ǐ_"'zrLgeGFV/|"+ɧ!=Oqyߊ"ly^Nav tNiª.[ωssRWWǶX߸@^@{`5[}(Puye~Ҹl{W/ +!հ.o4u5e2dkj6${%ě}zGMHM֘`\&hAact_, 4\n0n}mXv1sDXŵK%Z`~j!ia'>S+.?31s8e6.ȰG5%ͽDi"g4v +t2GVۣ'U e:g:lY;DoT]owUv'ibaO + i5O tAyCh˺${IωJ)Qk3*ln.N.5T WVޑoV`wE~RY,wWFkKw3 Ry.v3"L6.dq;BZYi9wv]/sTteUѝ2VU١>}嶖BcRt&/yD~W9R [;{k? `BX3~w Fq׊Zْ҅ixͻnInH~nQ3.J1Kw0ߵv# +ؐofRBz7M&; +Dd%9zF*EߚHegjs(ї #Ѽ Byhְc*]hi=Q;PU*\ :Ɔ1oJFkoҭ~J1 +K88w"Ȼ+ZAx%F#{K<3DC}ǖ(s10K?iWtis" LʆᝤDAw\$=1.z@%LP CS4~6D'̽28_v%e J wvàN +*\K.rр!$OG#'5`W +iaej8#Ro\T`vX`έV?$aOa#U*̻ SŗHy*D=+y^fQO(` f[Fq}m@9@ʸsshU1Ս: lt!ΖAMF 8CNO!+ k?ʉ@:xPmxa {Ǖw9ՐA8<펽^3}b +m9bF:UkSz䊝Uc|gg˕.i0[_ gIj endstream endobj 3752 0 obj <> endobj 3753 0 obj <> endobj 3754 0 obj <> endobj 3755 0 obj <> endobj 3756 0 obj <> endobj 3743 0 obj <>stream +HWn}W_ǀ%+pb&z`nfw%SӗR$ ":u.3ZJ+ +4c[ʨ7ۋ7to.\[]^PBX] +KLr͉5+8pv{ݯCno]^]"L1tah²?_<_8'Fpn8&Bl/绕@Q6, Ƌ%n`f~̩j"WF5ۏ=˄&LTOc.MT33g28!UY2~>eƻ2[i}-*ݾ/itmMnMrM]Ka=吾3Mws׌=*4oþ9~ͻ] ~V8!*/6 )&$SX;ZLD3Dւȍ/ AK9}?7f@aݶLDKANcK%an S$S"sv?xiDE$j^C`>Z0"X{Kwv)(.ax ]n~Hf7u͚RDĦF\sSe"ݟp LG0$#륮k3UNHs,[I 9w(#iNQM%"[9J3lqJc֤\75V$)qR[hhw9a_'<;>7aغ2)J1iek8(yW) xA\I?ّ>)N\Ȗl$܈Y&D %1Pg ffH<]YӑaLsQpa~@7[|w7,yժ*%^yOa^C˨b ])[]Q:4qV%A"._1qJ\IQvTMk +*w7SQuy1" "RWP6 ~YUJϝ$F0iT%47p82` p루RD皾USZη_9t5lB8ŠO`2 C'@zI,(q1d*I 2j4Թv%Aħ#rWl&iЄ'QQWXtK2QffaX2k(A•8 )8,KhDwv\X_~dY%)Hr3~x8̊ع,-f.2;E=@ +|sqMw&$ +1 1R<"8aW+~'B[JUPѾ>;+X_~~_u9$[5 W`&W+ǷXg, +C+yPy= ^Wh`7q\a^eT9]98e2cA)߁(<A@a,.^Xj^d-D3M?RVe&& ]p[> ⼰܀?DŽl^x H½pao^?%ҜrzF:Җ1TC,qfО*UG˨D'Ox9pesϋNu=5A =IKƆLt_#`<JfoE0duЂZxu:ҡk7O)Sj*S6uԾm{lÌJQbJ(tRa[ z<0ǼjA1z0K$>{oBb$>o8|,'i>۷C+׼K%u1zJm?)ff n7sL -SӉUt"1M4c@H2fեS_m)L0n~z5ЂP]SB2Ś F~n,Xh|쾤f1uuQ`+!Y^s }TD +۱9L3ȅS"-H3w“ +4 y0AXQN K!26y5i=@|'~bӦhR jPWJmO'Y&۽V[0;np`aژ٤;Xl(kZ6vӤI$@r,O[J#D& >% fEt[ĶG +S> jgׁƈ|q´By}a8idl<Ч,1N L+F[Yw7ܶ)]r!6ZVnS2Ue>([`J*;m79va[}mZ@*f9%c1*%0=dcRGc\T^gSO.5TG*c:^__XZ[:TnPN(CO'&R٪ 6H* +~ :"ٴ>>stream +0 D@&YG D>^ឭ@_ ؀EJs++8-LR,gws0iyezl6FGK2µFwqa}2g *$;s"zQ%`3C dW=HS b5LM C z({3crΕmvдIr2uNv[Vo0ZDP| B xJL}J@c9kR5eRyB+ nYߖ0et vԿ11_~*{{Ma籢!JOޮu=V: Zk_${F|>B);8a'ŕ@)6yg*mC32Wu +f$Mi3R*_h+dh_cM?E~pu9kȣ61 N16l-:t?ox i)tF\(5_j$@A[E5 }䦧`V[h e!Q=`%- wM16 |^  Ig\@&30p;+)F.Fx99q@$=OaA)[VĒLVYmбd8ŶĪ)fI֏7;%YpwqcT[Fm1YE?&ѦD=R(t]j%zՓAvnSMt6~Dzݫ9|sf|W6yjlB9$vSPlyY\yՙ rVԽ>cAnGþeO*|O2&;v}5/5km_/Ǻ?4C82'㡈xشVK~BVV+r[`iv H;'J08M]M3a(<0o}-z>oPX +qvN2&iI  ++ +M(+;(YgëG*x0bLᑶL6ǒY` +#ꌩiGG.[ +5ڻJ8\]coWə/DZѓXYW^"k܎D1=|oNDEK"?£d&Lu~a'b_ea)Q",Q4}ѻֱ PU`o-m2_q}YHcEǮ곓k5&&$[1;qb)1a"] (Y#]ȦP 0zNtj_ˇ"3YdsbK+BLvW8`y1TU6[ufIA,(N3_Cz' FGzzHz8 p-oq'fy% +v5KO[][5< }1wnk$fr|bm7^)B_!d +H[K +w M>^jʸ-K!#%>ϧ9.wf+ij`'k Y%I|rJ@| ` dK:Fύ%+CG.",O &9@6$$ަat>`61sXÉKuDΕ&Q4&2[N)xw&AecMuIw]n^=@A>ϜNQ Q.f  B9i-K4k/̳cRz~ƺG)\'QU1^U/ek7:qLzږA@ hSY۞!-=En_>D\-Xpfx(2VQ-5Ě~?R\^vfeLN̵1P8gmy| kۡ" I䲑^8oͅ|A4+|IOr0Q&6!q)VJT@Wsmlˮzꋩ@1'򰙥J˵s|'80~QVaAT* Pw^A"&@0ؘڛR;l/H!!mqCӉA7.PrZP#mШ: 0hwimԑm +sُEQByxHTFlօ%4c93c!!2GӁD#6mcD301*v*qLA(< K8OX6MmwhͅZ}1c˘ORxꊘ[Jta+@8OuB +`ܛ3Lta}tPʿe۫nQ} ,sSF.)XrڒPnʹ^{Zc6͠ZQ1 +:׆|&`=c:Oڐ^VF_g7nHGroU,pN_)ݥm''=9Z]>5fK{{ew{ag]쐙lMEtuztPs4jwg?'z`3tjiA޳}gӎP?TCte2' fbsMC 5(ԌBD_f]Cԏ;pW;i:.u|5Ea[. 5I *j#8AGkRk$-^ '6_uITun)__xh!L@nFO`c:)4rmslW5}"%vx.vErOwGأ(`(~dՕ&:elC!9yd1S93Et+J=;1`60I ƌWA%f}>Uʢ=GCvp\0u] Pv;&j]XPzD]k}0U ~'P;Bʧ0a ۑtC&l]X~w}6#040`Hz!Nwm Pc{2Ld~ +%8o~e6)L]jojr^%&f^_y10ttr?ASP7j_ ߊ=Ȱ`f*从sRD5ˌ^_C6doe QW5/+G |7 +mUo"=y˘Q>_upI1z/9գd +q6/$K"k{ErrBW ~t:bR1tD/ǗkzXcR}5#KKFw :Z"̺ + l'P u+Eh5- +<&zplY)qB_l؉ ~V$vR +T_]#Ҋq[`LJ>lNać׊0q^ i7#ArzZ%/2 o:rU<@ږ5؀{B%CE=XeF, |{/- ǝrƥ_}8.H w.zj g1/olg2Qufo-F餩u;?3l?F"?LNq$li$^lw̏t)@iR/%X^!`ޣ>Cf GN$/dS1|wztaxIEUH<-lƃ卍P(TJcq{: b&Q jZgF MGs[7~o 6b!gyuuy'9E)Ƥn1y\Vg?80%lHGfrq9!B^gې[nłOJZSO>Z1Ǐja\Fj&u _UU6\QFZhkHT0wYpnhɨ'4#7 +/Je_@#iz :kXdQ1 z>_ giq +Z[]֒e}[џWX0Xc"aWΘim!$M޾CƧ1ԋO}>G+X(9ӰGݖi^+-c/'-n_rt0Y*cz̓=5S?/vi`;H򌀧P.g8dG_I73c&iXkfNm0>\Lc;"sze!?Z[u\6αJhVc%㬈(|&k [d(DBEg,|5yaiG`wHMsܸ1EIw&$iMC 3V{.3"9er剣# _ʽծN0!C}6y?l@2ZL 5*5YOOC7g~.0P +N- +ϯ+:Ӯ QދyrK<ħ?y}>qFpZ˗̝ݥZ̺>c@rC>Xry)P,&#rMor@ٲ)=\-=𓬚æXP +8.ksBΆ҇&m2>mb\NI7Mֿ`|I _Shr$r,cj? [詻)pVoWk1Iy>4ːO\ *h}feZ8)[aqrV8u;ڏD1FLK^!/*0BX}WҖQ@K۟Nkq1 )ȐX]f̬իPa W^ȣ/نz4O0V\Oр@$lO rݕ>*j +J<\dy-mٍI&poSJ{im UIH!bcŠSPU6 N*a7B+hYzusR'b7dTXj2bXġ5i?;Êdy|\&T_ݮvscH/.=2E+<`', -ԱKAY/hU-0-+ҿ8:#;У1wrd{9G34s~Nu +*>^]fE@Ii ZeݘqT-`Z?Ӵ5KMHv%;08ӧC%~t-)7liF(kP~.xbe jujS"| ?9+BNɆ=<7@7^d >}.b*ԅ-m΋hf=fk4Zdc,ȚK{H,yė8|H@ G!o[\,|O[eL?W$,nTf`c]F<z +wwfU'OB=.2g /+Pfz{:vix)LFMH%j}X-ƌ G L}D|JIQ6ꭺAba`Ql7=+=pDU;p^dtcI?Kvq2O7h(t P=2$c=5]*ϰ[-&H&r<͎(cl%[ a/2ѽ< ,u`]ϔ  ](T@v rǂՆtpxu?Oŧ oߦKځ=ڿ ݙ֙\t=eF>n8=dE<#>rմN褐B" [ՍF)(nBgbzh&4s`5 l1;L-}^Z J/` if[{uW;ES7r'i`fq;U:yx-gj)@Z"^׺lNԸoFn> *\ v.ki`foEP;p5uA5+ Z aS4807}߅UȞ/?34Sf0xHd᜖QC_Dlr?}"r*Y}*=Su:4JU6/zVJ>b@ú>~\ZUd"7?c8@Y&82Htw'Vl +ìq?Wˋl lopv`h30(e< +I$:k0""қNaOkԷ,Ï΂mf]׆OZۼ#vWƒ ϼ bFX-]ch3K0Ѽ\IUjj I/dȻlQ<؍\u"D 2/_6ɠW9p~v^RPO4Fb}0C FlN̪'AȫJHÙz)iy 01ڡ%lMҕqfk ghI:#ǯ#.+ZFbVւfpiM4T ϽgOLRo40YWE0""ϏW=1Qsr߮>#Wld0\1|ߩ7kt;y^vJOUHa) &ռg[0JgF/$tSl+WxkcJ9\F,n 5jaf^,'FCg:`du,,,GJ$_>v;bʜDa yoLieix1E 05kɕ.7oajD5xz؍T44C&ű#!݊mvgVhqNͳ;QuV'(79i +28~RD/YRMhRNPJ'v[W_ U<&Pٞcz8޶U)k%_WRf*s{yUd?A!I2 4^nf%}ʒ tL1_cptH7jkpS%$c1MԸz*X8%Ĩ3ي,0ŭ8 R0LTR>_\GISII-`=D uQ5 Kۍ'8ٟ۫.uvNfOL;jM4W+~vǟxQm+A/ݭű%^F΃,QN]xv(s< Oڷ],s_&qHȌ(5*A\f\i'-sH;uњ!|R/F0צ,) + I4x> !O[h [HQL3J%s{+3e ܸai_Kl$buP+7)e}{CWݥxyhU@kdcGOU3&Dǽn{Ōc|ʺy6|e̪/"Pq/>ImM(Z4W=U!%O"ldQQs'=G +葈*€JỆ4b?Ztu1RauԶ1X?0VQX gFӉ[3{:R0Y,㌳GpdyӔ7Lqn=زt +G\f1j{,k5[<0bQh,J:mZ!Ӗʐ+m l`۪Ũ{ܫb=ST*T uY +aGJ4ӭw2=5lB]Ns%}Z)ys&tKfoi *a +hdK&2 ߆4e-Ar'+?TQad4p,XJsE*Z|.G:tb8m[5MJ۴bZKkz򷦙'*]i%lJj {; U7C "7iyFsᕡӞ?V2CN.:a=@z:ڤb6"8[iֶ SJ2=zzq =)ΓV̒}4w)+\[Aϳ3GeIYE0ymCHíY1]A6)nX$d,=tD)){3N*܆Ъw: +I8I Ϥ쏨Mxe.N?+lQ?2?Ԇ u=qc_vƔ<uيoKuj'tµ֦I0p /i)X.`8ŗ(|CSxz,OV fng|A`AbDty4j:|Iqk P1 tW8V lVmP+hUv,h1z H;CpsuoJ_͒cG!59Lآt*DEY$U>:atʠ)yl+_mw3W!zӗu)6@DAƇYw#jV٠NܝpʩʙUpobEnj!y]G¦ 9<7 MYI__{zۇ)N[.oh@<Ӥ: hJSnpv 骷 =dS{\V3`s3^~z (q)*GW赶zjޖ-T.,I ZwƋRrE5*!"-e-\"J IOmyv]5?eVWs+կdG9Xj؞|BG䫰VZsR+g`Gt!Q_I% r}\+Ƞ/@{a x=er Bd?25ƮԾ&iNl" lRorO , NaYA'5YbmʓJ4~#<`0@C?dAyW3;* `{oR:qĕ)[?HЙI¡ ]ڒ\?"zrb+# zOptQޓɅx^6})Se4w~tf4y8~17hK'+BZ{ƻ_[Z780:YȐnQ G9Ǡ7D6^O=: +^c$G+@0#nOEVKYɝ X#+wlFP_XO\Aw01<f?j}ݳju)rK !{`tWԇ[ЪGLxUa$-͵KG:vmq69|fA`7yC8+ VB#n3-iFEeSWM WDy7dAL9+?,ӔxxcRNZ=hvJ>8ʐjzi:T9<JL_=襑f\ZBߊ@JN U)0iQ9nTɸ"|`G߼{ū+ 9T"0&"uj`93XT w"x,3S\`p^" ,<C YE5I@9ⴓ%o}ba~m" RY"(J㯁!;k>j lm\c_KpMIpzYeR^sِCL}2IG{ObՎ>gԫ3c fv2h&J"aylF +[krd(}Qrv0iy[Dhs f /SfE3~dj~јK86~x>XE+E5ʱve7rZqBWbܖϕW;usc*42dBxQ&?e;i7@un4ڭ ✉/ϫ ن>l1I0ABɇ2רL޽aK|:^)y=Z6~x,Z197%Q(Dv*esdIaR = +3 +zG<ӇS[NQû(YHg y<&BhKDr.L}y,@*ihACγ4lg] hXʱN,U9>c^4&pMmj`CҋJה~I)-Je|L{!To(avס?J `#]$;ax"Ln{eA۹Bd 5 +B B~ʜH>{0HSr( ]#!`YZ'TI„/4ȩ#~M L-)cW|6:bY3툘e񇹴,zoSjD b\U_pA7ї=P3eF%T[ƺ H=Y(fL%PDc|@mvAVLmݕDƐ)5]_|Kp݄* _OT,ei{SM$Bk$g8a/-ЅmY +6{~WRsG 4y?҈ˆUڌe'1d0 =芶(#zP-7^!+˒*eN%9wO k2qU|'olG1$P`2,SL*rjT +Abq1ʋ?lQ1C:ި}J)Bic4W ! ]=ѷPkNÇmZNzXjԌEp WXnd(H+4]sa9KVp)9ɡU@1o\;'VPJmT툽W(o@gÔ,ba0uT G=^ޝ&r0MYPaR]דPPVϦv9&_&Vu.?fe)aje{rhE׌6Z*!EYu"n=XziF!?4rgCF{Ž*-o0N_F+5I|s,yqb"5o%%ɺ&,YH.?#LFŦN?p)!ϴ!6AE] qio_;oƈfWw735`Dd3tUK+7lO(X[L ͍{~ +Q.iJ&~HiVe 1ӑJ"yxv@`B̒0I_KNظaCDU^MԾZH%Oi#t]H\> +L[%vU8 Z]nIe%ۼL!K^X܅B+Mߛ9IATL,,v5eݶ xDour]#X5 +GSXʅ2ZYkhט$'tFz.ঢlٙV9{=:59LL)I: KwY!USi/C6m{ԗGmv։`|Ύ=<ϱUec>O  +b*HF +(MP~Uܸmb ! d_s*1% J41=^\#QQD`Kpl0%f:) +_8x ;(8MrEE[CQ} bmU7%{=_ a*}~B:G%ZOzͪ>J"%l*( 7 î5:-7 uWXxnkyqWz$wYwb-47b|\{G xayf`_·FQtUҝ0nL`ⶣplw3u{ed +B7I*\Tt7t~21MX]1$ }&-fҁf(§TN [T%8s\:eHrSx6h>&KMAΌjyh_ЉX3/iӄ)gM.=dAu&{FbI{P~ Fwv24u +M +N25h nba,HQWL=(+r#~7gϥSǹS^3E :O@\s.x@Цs7RYcm#-?O򍽘`j'|Ցq3xPniƵKx`Xf +P'*@\'$ЊO@)11n?%,ƾۥJ| T0KGeAy@'0sgo|/A/s1e3X%W5YeU߽7gtLi1>A g7Tǔ2H×nI j kj궾CK67I?3iI25ѢkWehYQEsmQb-})t3hy&fW#I(,6Ud &,F+[NCT[Ifp*VOz74@'$3,?=?l$QR1{{_PՈ Z&b_$D#80T|8cNzLr Dr]5#mp<:#wo"y0rJ"S (CļoҶ^_NUO?9X:X5ԡϾCj"_ߔs<{Ѯ4D[_(qd3nl`>Ḿߩ$qK<}DT]vU.lˈm6֐GD{!ـ-yiϣ } +bLҡvA!n1y;)XNsa+' 0JE[(@Lto*͖c(f`3O|'N׮DGSb?Ts7|4cNכUBAkUpAp-!Enr͐:_#&GO|}l7yz +h+q;~@oFꡅXG%m9 ʌ'AR<ڗ$XU!5lHV?!>3dGQ0m|F,Z+S y}dL`+ƶy5a=X]m5jwxUjͭؾD8:/ԅw7ѷ12o* 4`a؍3T:GZ͍r;5B·zco[J2wy$hv Rς.ڨ&4#!;F♍ 8` I)@2:p=\m/= qp*Ȇ|{ " 1hze$Ғ<1s8j %IËJEG!PmKj}LDNθ?Tw;@Z}NW}/Lۨ8=icVX [gW%F% 7%Z"e&d;~Ie ]UgSzVƍ܈XJ< I{ٮd<܅Ydxm#G0"z_)ddUMfw#ƭX=bB@ߪST++k:"ҤC_2pO:(*mO;. (WX>?H5@[賷TԊe7 !ސBj fEPJ!*OQzVe:W1RL3+I<{]; +҈sjb %7#UyIƣܻE~nziStՑ`3PGU[OjkwS;P1SƠ/wgrelDݠD[W dBӚssIhyZLk9BOܼvQD@(%{9ɨܪߵ}DU[h,:3FE&@==/@%^Ԇl5jǓy:.B.b quX\/r0X%@1q;uY\̮Nn_?o.siYLYڃ/C-QU{ߩ%J͘ rH +&r0t !~}9ӧ'C)]~(:Q:[қ\čEQ۲lF fpk$5n 6אHvvf(:P!{hGr/t D&q7 og#yWF 4>3p||M=hrH,淪@?oe!9?+?DV Pz&scb 76.6Mۉ#b"kAv;n'S8KY:Öm/dOJpn)lz7<s5#ftڜ6XA:7H .mJ|wRF,Cp'O#lbuX}q +=p1[L Mzx&I4v֝Ze BC(Yڗ@8rv kJ( TlZI-F5Ju=&͈EY=C'1NspѺHY-!O]WO;|w0G*Ok3ߒeq2_L[:v{(ZL& +Bsu8_/g7#U"U4_Qk쨧+Ǡ>0M("y*&8ӆ!ݵOWUK?Ġ"q3a\-%f 30݉> endobj 3745 0 obj <> endobj 3746 0 obj <> endobj 3747 0 obj <> endobj 3748 0 obj <> endobj 3749 0 obj <> endobj 3736 0 obj <>stream +HWr}W!V82LɩrUTbD(z\%X;Kb=@>Ii$P${:yۊN'89 L'Pnd:t3DWs_Ҥo~]qNn m8'_v~8OXDӌтȉHxN}(m7M~~=k?|ěŴ2ζ%6g'րExӗ]YL'Sg١%a^JSATSNg*YOtK1ZW|DJՐl<χC$ y.yݵ賉Ct;`խwDb7dbxF-! KM n|kH-ci! C_:M{RBJr]jI <.0+Onu_ rIPxbBL:}!)SOZ#ZN$PG0|^MxbJ3ViPG4*o3P +rs,"C.D*R#|wn$8 (TD6a + .&TeoV9YHЛB3p鮻"E;&5/M{}Ii1lMrL?},$Ta#"7 TaKaO%)( +kpHmfS1 -Мi^% +)U籇iS1T@ow7 9"e4iD4 Kd-X8YZz$x,lg4! aNf#Vleխ}P@)uK;,NjO(6݄d(vLȩZIxa=if >5$  ס+EwÿvK [|%v!D#hg)jѺ-wrBs^JsqЩ/r4_T> ,Fp#ehUJ|"~DlLna1m#HMvf_EMBT(SƥZ9%y<}7nL4*pP48C4^I; XSjSur*TGkL1Up1h?=uW[[rqzST(i6C +';d(I+ƪN6 NX̧QW t㺦 +[/6ݗWd uSTe v,䤯/ I&ݼP62ek@OBEʛPwGKbq>vئ1Y:_sWEnt*UW(Q+6R6jv'șnMxݶvĢvԢPK)+exID7 7̼ǚ\V*ܵ7tnp: +4)mi 4ʌrGFnbN<:jPA`"ʋ34F1?8652$-Y拇Q$GA^-{*B_R9^6d)'ҳi*:qbJ*Ke9T!^aeM6X:X<ujEzE[YW6U1Nu![,OxH)%"/  g?wsOOLS/mG>,Ɠ%ROzALHAJ@1Lg/(品VQ0IW˫mg?򾨚uˠ,"|la<jK+f 7Ef(#"s **a,H"l7P9 iLb"V`[Aq>A5ȹFʤ'UJ`~.K `;@?K42{"$5>vQocE([)aLZO3 Cz<~1|ՖI7)XREHDPNꕄ@ƐO@jbn+ j4'zKF +s;§k7S-hvK\נݼtYn.zM`i} endstream endobj 3742 0 obj <>stream +0 U@&G Uj'Ǻ#z@ga#9rxE_ΪXb+QI{鲢_I^_9i۴^,oa9% nICNο㚂A(;I%y9пh.A"kf-`<#F]I$lٸƢ᪈[ZtY_ꇊ.QA"{b"4BrTDuF\r_T/W׋Hz#% h#ʎDSE\AX[V9Z]( #DŽӾ4OgJoNy.?r^b؟!AHN3 ~߸'qK\jy_@Ff>V^Hyl`߶.'2LNdYrXhȽNꝗh.OOHO@u`|!÷6]Px~3A,~JyGD9X{By#y_d>|V8쵊1>)޷sq Uae59aEQPpeBS<Ǻೊr{hkX.)"̘K!<5ш݃ K Rٌʃb㋐D>oj|Ѵ?l {p}uӘ>bޯ;bg;L]u6|<쩠Hl l%ٺgm F]gZ2E?jW׶5߬O{pWfPA~U8j bWD!at(w!Ja27a,~T5eG<|jY)mGoN9SoqRSZcMIDu밒jkKhv^(\'TAIBx >ٓu*>]OǪ˞JCjmofU,{}٧뿍#e!/lq!3jż?peyw+>nuݰt S/LQwdmf(6gG ]z'XZ!ԣ.?Wu-K?I)@d:SF:1j:Uw@c=Tdaԃa3k HduQDE nπck7r75]}o$.G\obt3ڲ.G[#v^]]~C]2֟?^s*K*R3BYaJCSP{H[2Rc~9~7}icM| *4Ȥ-lLT3]d8A8dX2m_+a!!=uÞ}ôsj~t=N2 6ݔƔrKnXYI](誊wX0qL<⌙ͅkǜ&#>}Qj] V6$Y9c2Za &.S\ 4<<ΑoÄ$!A:Ԛ -ŀ X?V@[}9S6~KPz`7צkCzDfpL_Yv~(ZS'+˝CV~2OOiۚ4 +6oWUD1\'Am>?йٳ1^C x*2wІ8z}"a-׊edam0+dW[\|ҾnL05Q Ug>21$l ~#8zHUkfϊw&_gxL8&*|Z:qJLeʰP%gsvkKL3og?wR,m㖺D$ڣidbr-S +;KI sUӡB)1;Ki?ÁDm h^R>Q>qJx*bBr$ hֹt,pM)P)& 춋;e"Nc vpb C;DM0u<$u@.OVRVC-)&+Kp2 +r]h=[ɴm P.Kg7`?㸛] +#e1 w#kڳqsLo>_2U,uSW]hPE銓c=|yGڅn]B=qF]3o7^7"U4lkljwvR˜*f\V=c.\8Nw6nNX3ML&Vo !s}?kݨc>na0yI[kL­0'~ NJGCNtGͼlg4OWeTs Tdu<U'k%#.f$n&a]R5^gic{Ȫ[/~nnF:a)}<lY!H ȡ9إ"Cl/l1툄u$nȘNq̱VIYbg HBySqlyW0zO10R_ ((V(>M[-S7,ħteZ M(9^&2)BZ AITd; +M=vaĻ*p(|U}m +uwc@9Ux[#P|$7ϫf V{|΍ (xs*&~ rnNϸG?46N7UQ[Jr#\Hٟte-/ %3),?PXB G=BZaO-pu'CJs|!ݕ'pͰû \*/J-]8a~_4HE|yI~ e*])Cޑn ׾1" +kȬ HD~S^F^R~T=g,["l Y[QaGә0byFHr#OXY'_\#w]cpyBb M6%B?}(a@9Vq*z8I[iղepnuiMt0hyX0GѓYڒ w+KUe +р;ܐGI{ree&;iݚt3vbH)hl( R)n+!>E~M<l'@|CgAmv퉼/6G*eN0"5n5DN| ԁfS4Ce:.!&/؞ S9Fj_NE$cz +s"O \-FO]? [dQT%%j]Q 57< ^${rN{5ɮ U?Fj"wSFRג^0N53ō7șSf[Ѽo*3C لR@o=27deU~+Oֈ,%#2\u5-%zqwVJ}ѳki(^<oxxM?K%;i^~GKxg湢/yKZI}+( MAsۮG"V2i6:R1ð_k`QbG߳Ԏ2pA8)TT̅D_O֟ (3kvi+>Ÿ9Me#vڶ_#e:3 +XvKBJ լm ǔj738hSGuZx] >A :#<3 +2i:fa2/nNkH[UYOp=;ѰS}jg(D 쿷iw1[_0H<<[ &SG=WT \yv}j}MsG#,ѱiIFHf5\0RnDlBȹ;qpc7C\g)J\sq%^TR&_*a[˞*J~%_r}*sn*6䒁aWjF?8/6iBnۻX!UٽXbm-bmL-6^L^B!ϭvyZEC?*s%Jb^b۹i= +uYA [|N>g 1i GqvY{#!AVqv"+/A WU0FKGJ(cֵHypCdZfr% =ydy2FWPX#ʒv%8}Z*2jP!̓prWp{.k=?cCG6CMj}K7SJ¢J ?i:#Υ}"6}}lU&f$H;-Hjblg؁Z">nꗻ|A`{ەfu$=xhS:o+&Y8֋闫E]>7Qo'"4 +y)G`ဍ\I&+AX-O_ִ'6<_RWJкyzw6m r@'H*Uێ%3 % {i'Nh3}}̘<ׯFCB#rMo2 ժO+R>V +]ctR,CҀ{ w\hP}YS 3TR1D MCF[A CO .hZ> HE%SAܩ/0bL5BUaJ#ƵQUf-x +xp%X̶[*PPBq޾TwEVQl,sRrsv㦸Zy4>:@K>Sw,=7*[+'un٫[A`H".7~p<ijӼX!G7+iX{I!Z2cswAE qj(A1$~rN_[P3{646Q~ѡ*bk܉LPz AI/A>NN>tudJـCl"'N RS%X}_#߾N3;+g ~Ls3<Bjnfr'}4b2*w|`ʾ.Q/SJ[mE8!%ج4\]~$rLX=(o5QiiH O>Cyr'Gvi2[Jp&x;ڣ0_T"q 1FAMAHcq˧p(63iwP4 vbʬdZm]mU)z%\AY^@ +NGIƺ=N:yқ[U&ό_ViTV[z=,x +(f1qq'F c03|{Grl mڋJV]9,wOG3QRyGr-l#֥ f cQK`36x>M||zgO3֝*KmVd m.Ӽ$lyف +i" f`|8 /[@E+ĨH P0m_Od  <xhX#_'Ap|pӝNAǗvϮmg̎fˆApxr*qP1Wc]n(p MB0%r{.$07V &^\?!9R~(3cAhs +񥢹9Yf{o]B\d-~hy1Px.@ ~ 8+@ǧO4fI*7麱T ڇ`3r9ai@L;uQu]'Mtg`FY`e,[U)mx.-r9D< &Lx˹@6 '15n9y]WuT!l&f¶q׏Bm_ *Sm7қv4q^dxY[CQ!B56 _HO? b3߮ui +e #^NS"h +$ <"}ڤ +e1 p[h'qʸ­X#ς9 Y1dBC^kqmk CӱLO>8} L:7&3Tn"Я{,W{[R+`F5TrۡA/,#_1Mamfc GQf!ry>u?u񸻹f2uVM9)&p\ݘTPTyk &uQ3FoW|>ϥû {G ]Lx׽EPKmd1ɟ{͎}Mdr`){OչA_TCuo:ʹb R+^cem >7IΒohxz&񦣰/"-Zy~,ؒgEfq2@u[] A7޼a䙵E ,JWfjZ bˁ2 LTGqf3W*uyu&ܜ^_de0&x,C|s+#zH8fIPa z| w[;Ō_5\5} +w<7 ]a:, +JNf\CM6Wsabln} -Vq3)9Ƽ会YuRQJYɝ +Ƚ]=7Dc-2O}Wp9Vn-5QH-O$$(oJq +s` P aes)uTMO=XUϬǏ|#c#HJwˏKuVREN v([!~P}rK$p''֋r1Piww'q: {#kMS:/93r|2zνAugJ.nSh-}1ɪS#;ri|`?Vx6W~JjP}^O;uEjSON7%oFH`4#f[yaZ4Ywd67`R~/H{(Lӟ±PLD(KήPP{tG:Xbr8pJxFJvDlvC Y=S,FSI9[hYiL頽,ce?zq+{nA fYL3H~1VRNց'ʀ8xcK _ ~mP2[*΅ϫڷ=崒G;*C3h^b@>$ځ樰%SvԒgqhq]zZ5mnnuSa=[{͟gAᇛT:7zX!ΤqՉ0v!JXR+Kj +4P6 pl n쎠n]3J[v;8'bVx-3o p?A7E0|٨"ߩs ϭG57Noҙ]=zmCqP\Θ( սHwsfﶆcw%skAV <^WAX*vR!(`QUMHR:j`0޼IC +q}/otB<`#q4]L;m;n}KI Ǣ=WeHS!I&qkNrgn4VyfSi8x69İh}5~5u,| +bB0|is _?JJur(ܱE6h}{#:]u&i/OH[4ysΰ ܮe9V`4P% ́@zci9x*tq^z(1>em^&Loic~e9ŴP6t [G7SVDͱeͬ1eRa/S`IRR+ ;n#Ưb |mTra'3ŹMqYVy DDj)d.Km}&$T@ӫ(<@[ܔ|]Yh0H[ [!qB'6;(p R|=d?`Ô}C`[9 QZh&v<)"!].b%OLGX*vi{<{ + -]Ua̍o5 +>ڱ*rBDu+a/D+GēԶ-Zu~@SH1Iłv߀[U&ڭhx`ga +,RNmlOAymV]a⭎{ܭ1$EgME{@Z,GN5޹:w <+bjMǜSEQjlzo":Js7ְ:X9Wduu.qeu'Fܵ %?kz˼< g@)jb +_и:'b5>c< +OY~P=۶V3s5aQbܼL btP)ofyXt%UNU +<6kP=N&`V#Պ,E|WK4>8i)~b6qVnhl]dNp52l+MJ cL-U;7!yzbOl^w u +j%GZ9V^v2=oGMX&5LÓ=D'A_ʿCJb2$p |`+F'[z8uˆR-~`5/!:k* SX.[6q%|8Xt]S54SVwc{癮K2*L}Bjz&ƄH)>-A@Q3E1m4HKW߻+I&hlUJ{3y/~1Aж[15S;' mU7BW1iC}]m,N6@9ˎ}RrFN,q]NjSԐ6 CIP6NKAZ*l=I)O6m✨=jKUش.wXoE R=6[$U ԯs+VOfHk_OW8|ggr@~_bDma1W#(KTķNq>ޟ-{NotV^Z/KFLyJo?`u^T`e/w).m?:`\'եFL?`=^&gYb{NZxUNd襰S!"UwKQniќ>>3]n_%ɣЛ"PfNZ3|Zol4+uoҒP[3&y/1`bgH`RhMr dv Y7v7;M8nޜI؀oÉ[)+1ȮNK@e +|/d +*&RTDzW(NC%t C D̎:BiPg"ﱖЕ0|.o:B63*%򲚡jAHERUdx;uCgV \՜Y}U/'dUR|q ټ)( AuMvߘO\$PV7g/뻐(&jfĹ.Vtd` !g|~5|RRcrep[&.1i{2[ypWfXuP>0tHJy<:^A><{&ёM$I 471|B+ +%tp (ɴ +Av +y[P?yKm\c9<#eFF0q5{GXhZAyRvToԅ%򾕨~Xcȷ׻{Hl󂁜iNBtCY6i\aCS1q`cL y 7J-g]vٰQS9x2N.?.EQCMΖqs7JQmN}LV*eEsm|aY4l)0j!Fu۰%VYYJVcQ?lL+Ej8r\%-`nf_9`VOؚ oFg(8^Wf:cH67$n})%rcr] kնOƔ$ˆ`*<+M0-2~Τ w^D +""7>e6ի`2~A6;:n0px*̮̃Cd|*obN?y,jǫ0bb F'wBT"m1:okK-~kS=sbl{R#tV\t~_ױee-7d=FGDz7 +.> 1}rz6+= 䰮xh}*Z>0uzuP>K;" I.D2W9kmtW/4s&9Ts2(Y*Y>͓NG[V(|1hK(j +usĻ<cGm4yR˻<r:G:; NFYA4 r ѬCo'y|0ow8+Y~{Z`ChZ^Xm/G7.N[OrUW+ŲI:L޺8*g m d0aǐU8MJctNL<,ÛCK3Hfo(B,x%e3F~!7\EқG)y`^OĺpèeA4kο9$Ry;x<0NZޕuuډT5z=y_!u{б>ݛԒW4Z+Blh鏓2&wC_QHyU - +bu!@dҕ3 QO2,I7+_S /bww\SU‘a$'X$pCgTe=<^Rxp.GP^3dS!JY.r(!Jk}ܙ͹s>)vLlT3ւ`6GύkMe;U0w1-)8HvZ*HfF`+[q0<'+dc d2D:pf +@2&<]d.Ivlz_.A+t%m)UAIriˆK'?sBWwFobjS&M*<) ) tY/ry^䁉CtP Mo9H߳8dn<ǡ~:"d0 Hv[[GU˚NhT S9z71f5j ƶ+_ibtx^ȟgi&hSwXZUTp9ڂhO'\>GA c?jCB1Yхs(`[A@Rf^h=9Δz~i-k"~1hӊ %MOq501q-X|Ŀ$}J%-uk/%v̧?pRN/7-1ۗSI`Ofe`BXL + !:F\_K:GF!OO|Z^ea@xolk!ˎAK& +1!׆ZP XRzV +† դxt)c4(T>V^Eg72U + +Q5ьo ߊuڟڲ1U9BqoC$cQd)X2Rѩ{*B',v%Ӑ{JD0i 0g&݀|?SH :gj|}?3\u6X +z@w}͈pcprsڔ![-,^% k} +lZ/]I7]r'ݎp.a[,HZAO^u*H\IIBRZL3o2_Q ̡x/bH=XC*i+~(/9˞o>p6m+rDc bR'Y%9 Q':nGI# +>=hm4m% NO}84"JbG97?eZ_+W(2Mu?0ST[q KNdUV?n ܗxl뺚-^VqbTP+\mG.Ȅz(qrсDXaiL^ t4T:GqWc(of2OXGLL՘\# ,F"Ovk" }p\WhlKZN)xF=4)ϊY q bH{3{l1WʍU2[xa6_iU3KULwʷV\WW}iH:;]?:R"zfǺu{Ց/gpHLK"H1DvZʉ{ڵaRqU_ӹ\wʗO)x nMCf-u5`x4/Oe ySv.19R+"W2ǣ-| mӔC(BLoBeӒwKzyT,oل]Yot8u#*y2Erj|PFQB*Y# c}pv~©K\!/ BtbN:k4ϼMp(yT/% AkQ#`TeǕJJTxS"#% @)u QH1@)='t>ُppU~14l>h]~ gm+7̻ UKm+jɮ":f +kwoH/&H:Vz(j<3ĵZ< vIhĂ9rFԊa9K&۝J;]PXhuau{$ˀSaA(5jŢeqBZ > XQQ;<`6R|"iH!n.+e{n + y] L|fMD?xJǘjtm/ 7pi;D{)QBhp0YY}s^+ljԁPDsN-qJZ3|#oܪ5a endstream endobj 3737 0 obj <> endobj 3738 0 obj <> endobj 3739 0 obj <> endobj 3740 0 obj <> endobj 3741 0 obj <> endobj 3729 0 obj <>stream +HWَ}G[/a @'@<=W9V[2nAivq148N"H~"͇;^%Ua9{&e:\pDf-{V-aeR*_WCZ?{dlBۻRSdr_q_OOsW06|C/pS3pdD/Wx:?.0~ts;?~xLmz6L6ǟjb-Ԃ)5{xqe5arx&ՁD>?Ϋ?T 2N"#h#w&T7 r}~Ηဈ)6<ĶB2G9DA*/S4# +>}?OJ@9JQcaq1MFy2LmTh Dg1]A%L&AL$:ԑl7Y˴EV+ENmùݐǜtҨE+l-A!e *CL{(-=iWPb)N#Uj['k iAաsԀVðzz5h,i^SH<1cETeD9]֧Я۹(dKOT~7N)KBkD,XkG-!!!.MN 8lcJf9lJB!`JSE6FDQFWy&Qxz=t۶=d)%" /&lhhFxVjs=ˍ©4t"i(J`*ZGG|(dp+\d_~^-CR0 tFNRh% LB:̊٫=qP^eyfOz8UQXzt۝_ +n^,%s5Pޝ<#&a/S޲!~50QPnͧ H7Iu Re}7θj 43J]_IbF\Ϫ7c`}_(ggDEj`=U>stream +0 D@&K DerbØxYέDXz$doJ;DlDŨu^SHND@c5n'1m;RX~zK u_*10t:i /uڳi?ZH"hE_0GXfc,]v|d6/tƟ4NҶۑv#N꬟P|~Rno0\ei[+}~ x iց5\μ:'lHطsq e dIߚjX +mγל?5'6@/\,aͶWBdmقY2ڱ%q,@mC-&urUqU ƍ?#fi_:~G$^"ۡ-wLi ngȶB85II4+ U!2M4z0U9)v +m6ՂQʆ&g6y;٬-TtV*o 5%;RO+Gldh D\")W{ ֆ8Cm83Py|Sm *Ca;.frb=39cworM>w3-U;y|ZZX ;65ھ>ɨ%s2fˬ _˦QNs} +0'y"!ߺ" 05A0ޜQJv44cLg׹Y;%Sg'v1 n/sz~ b{F" q&aPFlz ul Ť2a&/ܥ}P@0 `ߋbzOXH'x?tMݍ3tE,?$jk֥B5eۜAbW%"7*xKU_h nLQOU?BA۩ʥ\|3?ԯ~v/404c#8K& ȝGiH7FgZ5ŹZ! + N H:(~JպeQuC4Ż' P\ŷ<9\w{֒J=&hUTs~;R]!Rh$ +V 0\,TGp(xѤf@&=u^AIꚩ 5׌qIe4ZTig6qX:6gBWz#efS,dl!CZ/!{M00S*sng7TDmf_"XO2ɂf sޱ kFqfRmgCL5Te#C +ݖ OUe֚вX)N]M!;UŮU3ss|Lr1S3^}NϙNnA!wMN2E b`P"ӿ9Ng% +w]r{a܌DIyx[rn<ZD(@t9}#`53+_O*rFVa%w^^kw i(`B,UQL,B<$?ݳa(F;7n3fI óZoPډ4Ƞ)fNW +9硉[@ +tXpڹAk^q4NTk{}YjRpA6 Į)ؘn~#؊.?ǤEꖆ z0<@ׇcLd?ۮZ !a.d0W}xGN;ߐ4*}*l`p*U6|J +1U✲>ql~ Sq"叴 igdTl?6}SJ[ʿQNJc]i܋4g{Sԗ$/;4HQUuIo]gtK9.=̪s@5JP'>d>\t(^ȋbh"DTy@0?BG" >>m =4,d_G#CoIa|o:{/d,.v}_ kaJxlpnZ,;fyzо eGcS ׫cZzp$/0X{:1Ju +[@)vsB9+FA> 5NxO 79NΉ32m\1jnOtq}8$ۅ'7-vv~./k!JQEMl2+tvLRl~ft?osloc$ dm@HTtot3V~:J'; 1ntDqri\0X(6'Ei$J +ʦӡX~t@'_t}8(*zdѢe.kVnϲh M55g%% ;Jo lNZVU5[r={ȺxaY!f4%Fs1 6 IIi-F!՘f~1a%5c^dlN`M[P%ErͅCSwЯDU6خkCьjӣuQQ避ߖ<5*fBNJDn-!qC}+S߆zF+lF~1g>$.TVȧѾg i"m9 5VLj<ms7(dT1˙P/kcT Z DRLOd+-[8/Ky)\F RB_q fej1A7R7[e&mj='Z=@1 K(#JLbwZB};ǔq E3ޞ\-+:=ыX=˺h\Y-+ghgmVi7學I04f/v9~$cߘǿggQaDO~+!j48 3oз}0Ϊ5L`iR_H{ߐ~7UEO$LV}Pdݼ88BO+oi"r'j}AxyMՊ? g}t[ƣ-=b?hIuq=L"2=l_L,t43eT1{+qa$ #j}#D8*&r&(5r:67#"K+hx^s6f]kM4~cmG0O-\,d5=zMw@pc ;L,\y7x-2%3 +J(fk>k^Bāl7vK]1ŵ;zV8U4ý4px*:9NTȩq3w8R[e>mG5}/4Bb!'r9,%hI<6iZ:Wer`'.ڃB$t A8UoLvc)aYq"6@]+ ߑZ☕ST^Oƨ$?zo^FM.\[4D|Id>p2tIhX(hytl<ɳI3+~"AG;QO@ƃ=k;h/6&"s.ݹ2t1;1P6KI0W<&pY7g;xdƨ|CP1KbmK[?;ZGpK8nEe 2<mp#lPJxX$B|@GڻL;YѵhZLd<v1+U|vm.ghg2VaRnpL}OgJ`3fABQS3=0(N= <%KJWnQti֑g [m~ª6_`O]+5O1H2KmX6 Q'&uG]!z3̙IAHqXGWE TL{8QRaQM=WCUQL{fLrI5TiOKc8hXcXw_pQ&zr붼C ȃ9@ښe![I0Z"ˋ4EWtX0bՐZV=\k#C& 0X F.D)q@^^RBgl.&}$7 ]YUJG + li|J 'vge8ғlۉ!`S,T7K^Ƿ5 +5C-W L>ҕC.wj?FfMF/DHNM-&Zq¨-x-iZT0&DVa QgkVkҟTzlUʻ45a*)WNp2겛ʹ +QW~?I!_]J:~ +.-y|t#<{#S;<\iG?(O7%D÷XFXqJ*dIKs61]i.ޖo˥Iu7>wt8ULB%?+hiFkTc1r,g58En"\w{̕QzơJA/="YɄݐF[m|DhT5bX.IO@%8lnQydVz/eb0xu[;L]Y: +%p=$K".vtb(Z9 {&KhDJ>gQY^z'giԗjp;pW1*gUNB]aj9Lhpe( ѽR$l'eY5_lL[>z 5LeyO˃Uz a,5oy"\$-5#(7- :Ƌ R?'">ߩ8 bks䙢5te$1l2ʤdfo/~q;@9j(MaKaRM-2[HB4F +;kaf`SOC4U۠H]_Ëi6G;(@I'.V*nHË)E!>V\9Ϋ[amKeLAuOvVdyLgr[#Y4 ӿt4$˂d]`.iT?Q> zPJccW,XqeoԠL@vރg+@M4u;B$Ypm)L[w4.> +QMd+ V?_>ے{0+)Yp)/ V|B?ʶ7~tax5{J9-0M:;/_搹: +7)9M.'_peZ0~$3qyBN(֦F;YNfxQ^]55މV]mESknkVI6Ib lIke2CJ,gz8RJIo 2/zO^(McP|n'dd]p}Ya&ʆX՟HY*5^D6>4N31P?""A6[ܢq\p4fg;(5ω,d+D/(7= FZ*T,4l}Py.$7qssxxAeMm*piUu>':,I"Wޤ~HhXnŢz=*u1*)s.1P-RSK<2VJ< rH.H/\J"'e!;՛f?kSsa4\~@ KW@_AzBFG,dߘFC +_g"U(,ړk;lgd}ryXȾ3a!b ~F[̱D{sn`mWXݣ]٢ʶlM^/"+H%\O|"F;:c:ίd і*CՓ8A( +/Zew Rw#L};)9{I M02 SykM La$~|xt1/BZ b^% 2HLz)0*jDFwu' X?BCDl`k#}zSLAK %ͯi@~G5,@y +.N坚{"Ax  1^qh}w[+CMbk5ujTPOON1ݭi!d,P.Qʼ?~ApxIȪߢ+9${tK$(F.J%p~E8AB$*#ML|CWLH-WF z*?#AKsEJ< 'D-.rQ6dcO|x & +o =+?w5$,Bh[r}LvO~%ưCCV=s}/קY#CY1QZ5,KҟqL}MvtOooP+|{RuvSTb '3O١N~Nts+ >m*?ţp~?,z1hj?Kve~e/dȶ3S 6p@HnUFQz0t%gMkfTQmQm;>|ouLԀL ǏVtO u+),sc;K)] Ef˗u"oOI. Pzx9Ը> 2}-kN HlK Ƙi"i|+ϟ6c&sݩEAԹi;p8k 61ȺL+n8TPlh~Aj8Ȯ +e`Ur˹Ch#|à)HK-.;@'ƫd6rlBfe{p¹?>Fhۦq a4m`tev V8k'X(W^ፉΦe@D$u_QnVJ#S,EF:Y"̲UJZ3õNxK-STHՅyejbdO6t&84$Os,1z +2L^#ZD +Om**6q˺q ke)]ߛط+{ON&+SlH! z=: +WI:]I#~(uKRaKIw2'wC ۠2z~Bί sE{Q5HCOFFLuY?l>)K-/8ZJ xc~ƻ4C5Xơ!̩w b{TR)}<sU*ۉ8Ńk{ +Ve/O/l;`[BXf*ox~C_v<s—6opq絅ڿO_0{93Pjl;@IF@|&"$1 $Q1Ց htrgpӗ_^$w6-?ʐ[bM^rS'i;=cd~\I~-L)GY@CUf~k4gWSֻr=_둯 dk:zX-?FoXv $''p +UNW&?y4۾1>'ǑaK d +e' [sa6FOf/׿vT 6`w4&Γ;{%bXXL#UoH+Zt|[z݄e @ne|EuI.RX\5y/ٍ( !;.IchP_[,L0GBϧbyz9rfec1RܤDa]ATgv^D}M f9:F(.3k{yNHQ8NLABW5cDW)/!m2IXb|鈺H8JQyrh#_6-nKO%I%`,hޭy\#!˹?©6 ]c8wM ,i XRTH]٘谬KːHdI`lzz5l;==#.\&\O 0| +|ҁ̬0y|3e9sD ly.&!EFnl0ptq)u g:lفq 'C0W%xk4WNʲ"ܛ䅑 S+H),\Q֞m~ݶAݫLcx Bc VxG(ߗzαuXԃ+7ʗc5Ns ^?OoN2v U9iPw7_EU$hk|gL]%P m|Ŗ[Z=`6-tKI:QMyS$2?e4BFo![aDOPH$eJ1;E3샮TBz =TS85FV 2Mu/O=LTE=1t}Ҋ Ghf2Xy-8ǧөp{Eݓ8ujvW`41rP +15q ܰW8$? G`~0 8=8l^]it4n)̉?u*`u|PnHt*L9 !g"܆Y%}?h48zFLx 5JR; +uW9c;hUhUE9װM`I-*b@`!}K~Vlgc%n{kr\'PNrj*6rYgrv3zY 䯭ۍwcrb-nոv{`W0i'E ~Vpvr-;l (!j/M 0#_O.E@JW[f!G9tݳ"\EhiUaV;$xM:.E wr~3[Rl(}h&'A_noa\ Px'`(5䳺}H+ 3Ii⸹aG%I6ܛ4&ģgi4D Fwڏ`1Auޠ*=TRyBQ*&vR<ٹhΜG9p + ec$Q c2~T ?OOkrQΙ ^17 Ov0/Q<@zQU4o0j?vW19^roݜngAe/bi3#W\Z ytRr34W#>+j$mh*`J e6%@ڬ~oRj;;e2xC*"Ԫ12@_RSu@B?pkQ4Ij?MST?!X3Kwڝ Tv2؄*_@&j~g{jE u{WEpCd+xhlk)Co>zuO'+1 yk0[C5'| +Y&wU8 gh-K8@Eam+vNƜ kOۄs5nh`)7aL*d>_8SLt^,Sg +X6R}ēQ*sN $ch[ L+  0 uG@U9Z8'^x&(f☑yd:Ǖ}OG`=b8|tIW*W0zxfD~0\ +ۂ0 ,#W;}1%tf vBDԐ<|Rq}zo?0-E. +\3y%t^IDcA OK:PNF*;_*&%Qn3d*fm֬=N^Kf$}\j1q:Μ@ +k!Ǫ߂qY>}Sx8_rjAAh6q5w, [~#݋28\Ou˚5ݯ0xͽ?0G~-͗`a9 SvBDJjSuIlVZzڤ]2*OX9`X%Vzy?V?9t:d%.Tp(w [0}}a%ԚYBϧY7<-Q5 t6xfsfme$ԖF4'emPz__,)7Le&/n̔o>bV {4XIFhGW&91Ӫ͋QhA -L|:Mԟ-r'"݈Ubϑ_}rBlP,MAt ~Ʀ}K GaJgݵ1W FMĮ%WټeObWvF `>`䧃М:;-.w[:dMP'W}--f{ǧ[}CLIM5axg'"VQVds^gI~'ekv.aƳ(XG,}f0-_SN +xl!,&mQ 7Χ+Wn3w00 ms$瀵ؓξb8[h WMP)rŠ|n) +Af1y"ZZM, bO,bPzg@$a5qb6:b։ME:ƛ'c+XqhZ ytT [t0l-R6+qq(3sִ>X0;7&6Cv\HaO,2*)~KuD8Zd4{qW2V.`&ӷ΄ww: +C iqMzyThj\&0)՟ƀ]e#!h7 k6 'Y ro&~O+cHĈ]{9䪍V!I9㽗URG@O;!8u,gqzdG9W59#b@/t`3+YI^jot89E)zj1~ST! \Yc~8nR`e+yj)?C$N7j T"k:"1<̭j;%x?j|o)Lc+}F \xE +`e.PeΆ¸~ټE3C ٙ΄\)\rx/runeh:DUrdF=3*Ѐ`# x^k&^'}%hpDmz}9$s_'dq:nU\iw<#{^aEfVP(/f+/v<^t/eߒę% TYkylMb}S qXB:ilzO PozJZR_׳wz(ېP}J EgܓxGԾ(\+ss4QR!q!/0 ѣcDo56'g|@,փ17pAaMq[USk҃fv{{N;#5.#*Dz!zN5؁6^}$_J&CLBQg> H[~ 21WeP- ɜb2cM,at-@;37PiM>Zp5:kc Lm6I%F`.t~>pdAB@qez`DV^d)H崫4g8X"W8˺N`7&>e52Qp9fc43Q&\2~Կ"HoL͙V66 EWVS;|KYgQl!W0U_ڇl-da\H& et +!#st/jZi D ѥ1"JςZk菊U{ĉ-DŽZTnMz(ѪNI WE)Kwi-xizn2 9uުP}bM+ fxP;`gvriB/ eSRH8Ux^hz>9?DSng${Sy|voG\ :?v/{3/kVqP!i1IrF9A%~)ڏϤA)<`!BXrA8Gri82+aVO~Dj G +,Z2Reڼ ~ϸlH!m wЈ3I/&eՆCeQy +,uD =WLRwOwӬݬ7/-,'^41z#'kX`}RnmqhC~3>t# NjX3P(0+y,,AiuDs +U0ogNy`?֝bS3i.O< s]jpV)8r"w9.顬TXضٗOB,+dF^\1R+OZ#*2iO|Ag>=9ɞX:/z鱳8ԩ |!1ڤs=Wk7"PX~T߽Ap0P+Z3o :Ԓ#Ij!0 _cdE% wB\]\Vqq[O1;k-/H.Qހ66US|) +$`MK=Q|Ft?1LZ%YdG)FrQѦ> +6uձyvzO2qq&/= b]SP {)WxLey;!}(BIλ0v5#d)t"bg1IzLpztW(o$Go+,idM_ fܐv$]G v/N(ngj$lK-O7冣|Z&a:Gjٿ/Ŷɞ +ʐoFm;M[AGiiHgJ2ӋZǾh4h-sM9j5VBiVgKS}¡..NjɬgVz)"ܩ< d1yNJXU]A- DPJbx zO*C^͜$Cι}foc #d J42n~)".iqWȔ&GWg# Ck+]f/k((!tn iP#N_yw6_S:( Adb2%g,.w11ߩDn'V_) S5u2$|H.._"ˀB}:$-5d'6[GB[5@f-+QTyY u B.j 8x>4%#NQ#-C6ԨaǿX>b`x:Z;Zu:Y9 ȎTRxFR2bYi/W3M}+!}ٍʹٍ>j󲧫 0C)f%hn>8%K$?Ŷp;M_Dlue̱hs?@n\V}VJY6ipjWu^ ̸L _N* 7iMܟo-íծѶNDPɐ_31ӡ7hqDr+"aeH눍F\v$!Fӣyj_ wG1HзyNPLid3wĶl0Ebނ46Org:t)ȀS' 0x^xT9ɸFʧ&!a1rR}N&>0 5R2|Vc=J= RbWdL1/f:_vv5,=rVUm1#%6M`qR=g àL#+=7oe0}rQ3#967 C@]y0S.QPPqP_ ʷE!@\&UCc7-9Ni^C%KiUdcf^zU2&SIƾ`xjZn(푤7*wMiLV9k3l}cl}F5vVmac$pÇv] wbFr=3P:^q-/C* }(t.CZd^H0$)8l#>vً`Ẇ= R,4@JmjqOLGؒ'ь%.hART67G ԕx¬n8) V?^ +2oˤZ#)yAſtk$xcRVY%L JqVM3$Hsi'(3\ wƋ2Fkk}bMoH! Qmwk + zf%Q?_w("݉MS.HI2m|YB@Bn&ߐN_ XYSsLpmzsx\)C9mMV/4 qY%<7L|ۑs敎Y2~gՆ2c0X0}Ϣ-RKyEguSkBL|{?C`pՈ@_tnzU +p&Μ*cflib!XCؾ.x0%B`^Et`x~h +q5{-J0Ou2D7pNb|n<o`8LP#Y=2Cr"+|cM& Ԭ]'9YяttIrSm|DBX,5 c Rq64.|Lhp*)!DtWܣv4cmvDֶ=^ ri҃0i>AC cɆ2 endstream endobj 3730 0 obj <> endobj 3731 0 obj <> endobj 3732 0 obj <> endobj 3733 0 obj <> endobj 3734 0 obj <> endobj 3723 0 obj <>stream +HWn}W ?Ȁxu2 DN@2L9pZia>uEPXnu-NpIlEf`ߣڔ2=}gbH?iԧ3|91Hit1z6V`ַӬ֚* z^9l펵"6lJbp%\&Ú*&P-Z&@RK?^Z Xbpcuc11:ws3bZ #iaLT3h7)ҭ]w8tn t2 +'u&@}WH9ߺQb?6 JPCƯ744\X2]}J@(;rD +~#ʵl*l`&s=3!SPS64#& a3 *y۝MZ/:1+c|N'^Uz_x6\堀j$ qH^>ijg_54C*RE%¥ v'.᭲=FjTY\_z/~?㣡FVk dDŽraJœj^]G +ǵ|^:wj'gT`BY5'J5~eX(T3$q&-\OC=M7gD# "SrWlH xk%nY!)䀙lrݜSIcNJ8b4d!(BDPQ-h>襚EnGH7.)u1X3%kkE%Lψyc{)NJ%lrKKۦ"X/+Gs ϿF\MJ@{Y@2dZ `aw'oQΌW q8 >!;xFXSlXB9Y HR44]"I'L=_3t:@8*4V4v0΄t[=4%=&S0om{Rk#QS +44Btr4L%Z~ޭT) Pz%7G4dwuα@qY|a"Q#A \}]?̑_@vamzb&݈ ˉW8I95#Z4eH_ +et}jz+%@ɥ4ubKs~'+*$KPH/X] ( %K3d +y!jҢԌTLgYȿaU腚|}wfʠ9qii>Ǥr^ n3L-Sahlpy<*lzJ=.3weyR oRK"0'e3uK &5X"sBbЎ~ԧL>xt5FR>tS*!gN9pz6AcG'*K95%JjJ_(D,ݾ?ͨfe]g勂(FEd$f9為-2FcbhvtY~Je +.LoP^Mw4 'ЌRC{ng"@jjƩJ]P/$)<0sOlF^#f^ _ݤL$`;??;Z +'j@͌Ϩ~\TUu|!,R?e7B_TI]tW!f61@΄$i|ť\-IAs5O_HjFҝ]`Vl| g<L=qu2֪Dy"lJRvHFXߗ cp~ v>c_׃V r ON2bB-{|Ἐ68h^~$ٝP^6h!chWb_9}V7fzKw + O\HVU!kw""߼ Q{w#U%ưG{"- T+-,mfCw9z/@YR("Ғ<98Vjy:.4d:gMkL 01Vz endstream endobj 3728 0 obj <>stream +0 H@&_# H*O +it)cv?hvI.Gdd  s1pMs0 =7%I +uEhUT͊qUƘ4PVi?BL|UBoU ([yJiP3BI8~+ł05<\XaŖo.Ms-ׂ26IS/tFTd`9gkzJcymR=9uE&WΙ X%&[U vH#,Ç\ocJ@;@Ed*Oiݣ] c&ҨsyLj~ƞ6L{0pjY8"; + LU`JB{r;$UUl&X:"dg8)Fg1Fb0U48q:\3CL+mM%q1A ["*L +lJSv\G?l T.P͕^"߾-nZ™Qd?W`ܓ$v@RSL-ց4-EfŤ5yxrOuʼn:f/MaVFJfSOPLl5j*5{oE93s ju[mW%ƭTf&{ru +C,!]F8 $Yр ً1pٶ@] v F &fNK$8YH#Ȁѩܾ9e2ŔQ=e[ mc;ġ~'tD`,K >⪍bssA4v~]^H )jYQTe'Z߁Q gI j;eFu\]AxQ1"G_)aں,NrrА\t JL-W9?wZZ%E;-HOmVA`+DgIv9`Ɏ _'P|`"I?_l϶YGm|P -"HI_GiKZ:4G0%akkrMWbOW u \X|SҺJe6Z"<)+1Zla`'`χgᶢNl8[nz) +cng7Jѱj14ju%oNS:87 )#HJ/_K^(;8*pA|7[9IgC4TQST-S8Mg36"SLmО?Lt1I +Hx`'>#_#1Eyv~75(OT`-vKJc,0/yrcRPJ/˟ 鬯…|0"zt+JDq\_}F<|e?u@=X1fXVN9j=E" @!`4{љʹvU:|Q]4?ޜPa$Yv8)HWf3Ƒ-/C=7.|mO;AzII`ԵJs2U0?R^VH+T`Fۍlv 5fd_%\'R|\i} g3oe#sLƆe$U3s A-D7>) `BPi.Hy pFчnFFf?>9P +gl ,CS:쯓R@ydMNYYA«ХK`H Ao`…#W<_7,31NU2¸=d5=U%(#@on{D;ԂD~ڮEeXw&^tCvǐ_S?M՜8ofT[[Ajk'P͗ù>Z#QW┝s:LhT> ,dp|=%JQhzm,ɅWQ!88. NRx8 uFO}XlđUȉƵo_^-׀}✪@o,`Gl:_{_ak s-nLܳ-Tw A첵dlp ٞ.= VZB7 CF^ +uk? &?;X u7߄F!#ƕ0[.a;9< )f/Ė]0s5]žy0Y*h]qpn/t4}jd%ys{UYf/0$VfsnE 4%@|il +,3?5M.؃PC=(MIK2jqQOeMDG#ҁCyeIlr"EexRa( _A__^ *!0}(fcU[Yw!oЏ7P@db7=rl@b5)ΗM OO<*ۊ^|9e¾apg !EO@ǽL16 JF{=0iCtݾ,xtDp0υJ/3C=Be%C pkV.jјƄG:S1& =g."zzl})_hVy4t9E.#&'ۮ %پ*F)LlŞ5\ς  +^"5ĮFgt!s j&k}}uǰ6*uM+ JV3n}]"Fɒ=RBPo]\|q;:xȵJGe2?5'ώ?A,đ21N8 v+V5#=e ΃|Ňuʲ/ߔ517q8t!fK4r)BȮ%'|>NdPa0~2Mao۵8S&XBj$`CN(p?%,g~ʺ|Ğ:aZ>¡s,2*zH ,!ă^ +c`{ˎx]VPC&Vp+7]#CSQWBvA`YP & ֈ=&ȹv[v1&F}Io./p\ Х( eI_W+q.n\Kr=.⃙Be^d EǥPO0‹v"蚤Q/#B N&V='vQV7@{O/s9Ԥ 2j,Dq33{l_wf]/CM[dm4Aݡl!w9MNvuG? 'Gr߄U#߽ =3s2_sf =t_鳳g&<^=phVk(YÙ&,5"v8d2|y=ܝRjt̙@lcD調EOitM%P4p$<_ e[6\ +S\\Uy'U\ =4AōhkԧNd\M/tB5w?\?r}ub)7D`ҿ@Z|V҆ gi!E֎ S{ + Xdo.馝 {s +| dQ̉jO)+88HX]Ac^>LPsNKᯃ sĠXF$ %JižfIbkQ9K<`dsZ:)n6˹LFXϵ;-O3O٤VL'5z{0ad{w 6 1\#bs7vn(7ݨ/rpHoz.[8xբ.6PWU7"HBDkҌ +)s,@o4A6S>x bgz$+Bm`eJa.{bu3,FHk;~jx +JgE"+5Yz +#Q9`v~o[>5{6NJFH9$x$:|Su&Vq\4xe<&k`C_촳~a=(9iߙ ŏQ5HEj oԏ_*ePJBC*XDgK@"MXKĕ/vDWvSMeZ|QPnM/l}I@{]k-_ߣt^ߥ$m78Ӷ:NB ԏJ:iLjš4h2$9X"M>gg]tā ٜ$cpF-ca@-g yZ u PYVL?ӿ-Iam+?NH/\?=yG-`m:~E*PfM$zh5S +,0Wp?J!B]lp0Aj2ѲO.fJ%ibLV$peIva,ZW<Τ~std;׹RJ$O3=Lպ[6`{NS {kM Tιo-YdSEMA@vt9N5z-I155!ml.pqU@LT4˖Ц1KhN3ܛ9|QW D~߯((ԵY^[L_ `y5jM<<Z+۶e7"(n$zaB@gӇ__]O*G}= IY~8iJ_0>]r- d u8%(]WBWgN*+}yk|ЀBd[i(HNU=n?.'j>I( g:nw+sk]X%QYR'^XXRDHj̳?siX#EqeMz=(N'ễXE#$Ftx'#7ujV- :+[T4IDr[Q'mw[pnQȲD/}0XAV6()Ϡ[w^e Px]{~t/F(vdVx!0i#W?Rռڳ%R,L +5"SAvLJuk,O6.s"-5MaLk!Z5m/ٹ`S+\mfVj"ROP/a$tGFzIsVF4 ܋[ڃ"nW`;B@Yn_ڹXѣ{WsRy_$'O#i dAVN5JAjϸG-guyδљ\wE{C:Y P6ʩ|'pA֑BhV*޼W *ͻ|@+)wKv[_Ǜ5{8m1Ud)xTGIL vmP\*kZ|g$h-|d۔UrGp55M3:r_]~W oOI;GV;]iv ů`S˹{YP: "axme:Pk ɄL1hM@)WP'VQ2=s{"ub,q7V/헟xU +=E[`n^3R 1^3ze 88q 8J>("`u*Bv:Zwnmh M +AEY/Ža)-g_@ .y7^/,OrwfWKN̡Kipyt32~A]ns:QBfHF=0YY^r/]G I4z^t9vx|ưUIѶ$ހWXIS[x_>tHiČ潔rĊgL&N i'Ug=,gmV[%lJɫR7钥_O[1Q7Z`X9~"[!1LͧҨi=R럤 ?PLт{2yo4QGPm@mgc:k_2NYKQaxH"mb0;)ϏC7;$E 75-O{\-vh>Lɜ*WfK*wyH~Rh^KĩPpLԼ3IU-,JN5J=# +Ixǻ`jN3^tL_daYe 9c|h4u6͎va^dĒ8BKeCpKd$ۡ\Pg9 rJH# r߾_:\q50H 5ӕz;/?]} n& 6plQGmc E~3PgMx :Nx a,."jN'u>wbe'⎨ :g?ݣ.aHrLVC5e;ɛݯm&ESDsH{!+yU_%Aw#Fbf]c}R h|=}O  +Sd؍Xʝ4'ӆD@#&0`)67-1ͦBpEi96\mzً @|˄a~?1(|w%"9@JSK +;@#)gHwTdd]X$ #_xT0p#P睬r f*{i$Ԍ3-&x Y橎yP*0e:ψaWFck!~%v[0ŭAʁd`?؀*[[Pab&9HuM/ + si9?Wr(g'X;:ԣ 5>[א7\n6\sHDor@(EOo`7ReΏnX +P"Hn"oڝ:\ˬ(ھL*Yk&2KD^BXvB@FZK ENʍ"9czOSIz%pZErL㍃pP!"Jو>}Z{ɲl]WC˝mx`C>_xy_f`FJ{zOk[$5FyWGQ O?Civ?>э tœ4|lDY~K)T$oY k"Atر"k!mPPMZX59(ubD[>gYyE_0o +2Cf?vu&̾(f.1ÊC2# ֻ#PWz>z)T7M1cIF$^Ӫ!& QnQR{m [GLLї&X%v5bϽc}* қpì iE|K>ǁ""TI +]%W> ӌ8qG3kcĿDδ6LzRbR2o]'Y2$· e:~~kl&(cJ@1 Z)T֪6/nH7RO{ ܌>bA(Wu!+6r񔾂n7 +pVlpi:8!{#Yf #,wV% n4rO]l!PB0=%ɔ8}}?ҧ ZLS[GL;pC:'.J+^f(n ]l;28O 0 ߷80EAݬ;G!T]@:\x̯/NR'3[z[0GM<]"XsѤ 71Ib'秧 @;PQ+6M'1y-$˛'7ځq39rG6s[´B6yKKVH#7to쇖xU +Z2I)t{-oj@Zb -no(%XFU7D؋ I)a|7O +fU}#9v|{uf|kK&{+hHlyC~hfzA0dG%ב:GQC״$ +)bX l6%_<`S JURjXԻEWQ^_țRc:iI\r=E#wjO{nDQmdl_v`l +QkN‣-`jZ|KɘZj6 XX`Ww@4OΆ%["<=M)Z95ddR9Pg0q K +MdotlF hR=g9/zEIJln +7%j:OD/9KÉH1^)#16Z#Be{a"jFۮ N5̌!aH„&%^S6e42}&]g'G/{J,'hj:ևx>+u30YZs2KWWR(ȃf) +b'))FgϲӞ* a ߇Esӧ[ي C6Y&7ށP{ɺ)+Zm$N[P_)s;y1alɆA>L_eӂcyѭPc9s*>*JeEm[&eɴBA Q>G_ &\wQ*DF/Er6.FQUw&$I۷4gZg$.~b&ª{XfZea/mʹCyuz7hV +zp W +h{L[}¹LnXY|48:^=9D$O^My/ T^Xz;gVśw&Yؽ`srG<K@1MFߏ8~4e \yE=S$'F0;lPYF]HL.: Hoob%XY\~U<5zLEL7 ƨW ƚ ߀@u {'j5Ec?r {N3]B7Bv# jUt +a.7ٽ9 +F<2w:JuX{%NgfZC[=80ЕWfr%{OTrXJ(^&y|̟GΟfUa]6A\-wN>( Rs(c:3( dW>|9ٿsr2D5zNW']:'$Ik:]HTdl oI@`)O:9vz?[y_:kZay5Y[rӎa%]n͊NB4zuD-P#{*36{m|2]K?Fތ3j|fI;@YKk"vVDes^E3p s1%v7d:aa!iϰ{n`$!Sk5.z";3]s/ ?߱:6+2 3Ζ\Y_[M1HkӘGe\Cl X6㦢cS"t~t:a}pVWVcrS&4}_N=_H s\+1 }/SqUv\pt2`9`ty^":;Ӎ4Ŋ\+Oƶ/6fQ[OmEO?Ia]W ,m#V݅,62Vջ"xp3)e5(>>\XBr"}9C\q`J@ܘ5vҫGDҳ+ +{^`ƻ]OqEL3p8͗W)eozЬ/Q~a68 /=$2mC'l+E:{(yhw4`YCPƷ~yH%P4b"l5CJUPmhd$i{ҍ;G0$ 4lRfH3%к|ў{:v 0g!ҭ{Zc@dtx!,+D]gPc4qPSۤfuʨB>4pb4`h}v2^v!G> ;}TRعշf)'ߐ>;Hu^7K&CvVŏc&[f<olʻaTN,b!ǘҋI´.&5z pKYJ?*1%#x(Á' cwi˚[:DZ!3ڑpNtb`ح5ԉ .j(" +m3 h6~q } gHxڑ|38G$1$**jUR Řw:ҫJNv7`NH_Dم"˶ 0E.,fwXb!I"Z95$]uNeсpKP.K,co9 93#[;8N TuaP'a@UWя?cŝzRV{_P4ԯ$Xhrgs7HfI <0ȭ +Tg0&1op7!ή"޴Ʌs +@'w9Fz|0 Ha1^; 1t!;e ȗdtodq%w0*% $•ɑ\{P +4A&%[k>$5E4ȉOַ<c#8N_Ā]~DŽ? +uPnB7QjWp+W2A;zIXG }~ R/w"g=!c,y FΒl%Z/zK@HPgn_ ~5y>ڑɦ-ɵeDU|^R`~Wak8d"F۴wsl3ⱡD'ِ\5Ѽ^ptM@ +蔻Z~[+{(e)=ھGQ!<!/%\'tcL/xm\+7m|j-4WgX:׸{cڼwzٺhpz L>%"`BtE2x] !yGS*go8 ݢRK# wb 蔣 akBI砭e!?`,QBԛM<=QI҄~5?W"/Gv"8_FBѼz'9%%5ܣJ4IwqiQAGV- ,)D$qS?mr{+%՗OOA[cqd T\Jw%%!a0/Em Pʇ_`xAJkmqŒ*M}6BH}Kc0cR~ jKTK-l>VU)Pch"ʆe[R)_RntƤK3>?n}ѧ;ʡbOGA-b\;Vu49:ے j"A"9c,3m] d)umNda?*s0`_INKAm#'Q-?.\ 1P .kK1!f0.ά*)nc!읕GϺ/m( rN*QLUu"Ο1Ɍ0{ceS2v\|=l̮Lj# CGr%{K[izW#u> P1kt*j؛-W2w)ޯ߲1[\F2ZÖ\4 +dXl /e W#76-U[3) ,@K8 RC_kL' ޾ɠ#D8)jؕC˛O3wn\չ0&GW/۩1o`†-RUOQj1KACgFm\k?dee}+ciK"tw[НFU)rM3g(uX%1q[q߈[olPBJ&5I6Tg c%dfȳ5 +Ai\J/2VɎ*w*DJ~l2LV%Dcd&1x~vo3 +;] +#O3\+`N,c'rz=nlpyJ-:*5+ə}(Ai3QEwŬ $z-4TQswmX[e۟*2[mm sp.yM-MEQ ?Bn f/Kq0[VsP/!74mF} Wu?mNP՗֍+zrktm9URcEЇʘ6N}B7Jy2')3/ނ12cX(`hQ"",vTrcK&ٙ9:ܽ!ژ˙t*lV3ޙӫء@'#e. +?W$bႍ3,?)=r`EASgu +Tò()=$WTU0KiWfa 6$/yBh#vϦ_.q&27"ܴ /;uMfU3qLA9`!Ӆ&e/wz}C#LVgNA2;^|nm'b}TǏǺ=NQ8e@9r_Zoh1i]G3Ö̺:;*{OqoOM~J`ٝGXT7.ͣ=t!gg|_FC}L3=,0vo͜3 ԚyQL.Y"N{VOBEӸRrlѽvBHǶZ M{NU쁀D&'2 ^'sjMT[kbwu;6}3 ҴMX:[\C0trI2i-j.6ې9 )D1rq<@6kF׮> I}9}w3YIru6߶c}D9?'~pe78v?K! Z2:ȟsva*v^WLVr~ $ +\wWA ;;rp +rQ<7=IW1xLxun3ʡD>%o[_quBœ ;@PCП +_ 2;mM7w^-I.˷1W_ +D`4%d2P&v!YoA"(-m8wx7v|w|LBA Phq*eҎº<9ȧL~plcP]OhO"f*v'KL1cy'%OƗ!P O:_)$?;IϩNAYk%Os~Q-R otQhckojH jI)ppp c(i3`Q'bqvjmϛ0 2q@kl + +}€([OT Ajqm<(ڟx><^tH3WZTw[JKtCF6㼥lvf\Yi[ozwS_n]/pڛW(Wgcy- +n``?H;N] k-l6)T"YX ܀Ve x9:moiMdE C,EE"RF`4: Vה0]<fxyDn* O&ikO?o.<\.JNeR+ +{0Y:,B/}re*ڑ]2Y:X ".,H҅֫Xa]M?"D3eNH+ +AD"-66}D͛{{rR a[5[ voВ0O%ױȀTȜ^]_T +&V$6Y]P΃7>/q-_OVHyrZi|v,U5q-K +OR4]oOnH֊O[TbS<+`3%G46Ie%X^`R ׌]S{unAmr?u*=Sp5fULrPG@ 3& 22V$8~۷uR)BĨC}  +4 +$v"&qyOm"B& "2CulvRݠJ'ϞKĠg,fY` qJLh>"!CYg? \%$n +JE2)mxZq.(kx& %sc4lĨoH$uc!ԖbEҾbDDÂp=TU"Z0%hk*'+M<3#4ܰo9/U!;EiHV\El!2 +̈:\RIB@?6U#N!UJ:J<nHm2Z,h!a7=kjqp?ڥ{y#XP7e8ں7 5p\ANwkla6i_ + y} %=8 It~L @\~]cъD/=ݻtQ[ѧs$git"]9 += %ogjvR@jrn-+gz\x ,.2i`4IU<Kۅ?W)h^噝U|:݈g%>|C W +2e򦖠"!fD ɈcR\V_h?bmyWɶE{XucL/:͊w#B2ꖰ~:oKFԓϧ +7,d F޲R%îl7tVLSեwǶ?$^R-"ggұh>lyrY5({sgOszNQ~kMՇ1"ERGpv +}+q +Y(g +Evb*R;P)Kot\޸]7ŢHY ƱٱO|)w_}%Qc6I )]s">PT 8~!1fnH`;?hkwZ{:P#eT2N8Rx2wBNPB.e 09U#I﯒ZliŽ`,];/!#Gd(uX&4 @0^ jzQk6 +Pt J[rC)"+y%< bK!nW)?DnCśO7*?)݃+%TQȎ*3E$,d(pio܇i)" |Lƙ-Ф΁7tL03yUn9׎4YHkh>QR_jۓԔJؽT#Y\E@f>1C79>fr\i ͡Z.pCkcrx4cpQ-;1@B)gLLq?6j% 6&9bB干[L߹Mrf޳cfJT8ZFEZ@n5IYAsVԇBiB{HZN@enYMkOELV(vB&GC&ե +lV)G'Xrmu>*6 +U)GXyg'⃒uRzW9ON#kUSL~;H?\Ӝ'3D]T1 +Em*<^"$H_]_5=& "DesG!' gX}j 7fsp$j@ _/PjBpO\:jLykpVS9Ap: 2/\UМ(ZX> J\:B_\U +[ރie#+1{* +G€U$ +wHv |Ј1фtv2*"s|DE^x]-nV/D<2ÿ6mUe8DODw5UhWj8U;98{9yUōMU4~^4uw#)J8x̷q1RsPf +NΤZG F8#C&k ׄ/ueI<+m;}+yG&ontݜur+MYOPc&O˅}ģ4`8n5 ;=ab 0.m#e7sUM蝘6}Ja?SO] 33ɏ+^(@n,FWqɞ,S$ZEf@Yp ezʕrj-֥t5˹Evrⷪ[Mp=cSw'id<ʧBmw] yTN\FadnY}$ M 1AaQ@=Ovp Wu Pd +ӄHp(gVwƯ*jtDR\1E辯 #1 !d'PћwŅ/o] қeV{X>ZȩieI;0Y[Wg7Ϋxʢ/Z&{=n9 WVJ9_ *[LJѤ;\Ej۰d:W䠥!SAJ$&>_ nxAu8'5}_^Anϭne+~v%<|ȸ6 + Q5"G=f!~C)绖Ds﫨/@gpb߯{( #QgmNlMnKGPi|DƆ_Qh.虲\jiwڪdFK.:CQE]`46?#>Ln'bT{ȴ[+k2 ڻP:PP +zP?AH3+u@y.yd#"M Q`E~5KN ΐQ㴺t3r:7,i{[}P?cx 5L\#O@|(sbDz}oӭmYTk %u)ĭ{ޥiW36&5Y S-.A0h >@22Y}ɧaE*.OIw.&bz!@쀿ɑ)p<[r$U)?%벯)GZTrz^1dUSur$rFEr7oQ1\aw:Op81K (Trb-c^[uytHwC"p-J?~̯BJ**3 Dj[#ҵV$(??,i鼞F?`<Ǎ{ɅBIu-S'[etK_!G#8իcَk|( ++_µuHTX~F *:ռndj2FsJ{{_k̂7d}z#`y0>2xGȅ9v~g5$*#X7%(w:mI C^l_Zv"銗x܃_J]/pAx7)Tjo=`AFȠ h*L^ǼA3\&R\"%FR$ޑnY)\SNRQ|ͩƣ* U*n,%RzZl_H=WT@ok~wVOrD6M:CduN$p0SWFpkSqy՚oQF5#)dR{SeNDVKq"dL_=0a)l^n4\,:#\`&^γvnﲛDM O/ sBw=Jqx]l\̰ YvtpZ1~To3ְ1 /;m'~5)!{6Y)`a;gƜ,/?[+[h/sq"3:U2 endstream endobj 3724 0 obj <> endobj 3725 0 obj <> endobj 3726 0 obj <> endobj 3727 0 obj <> endobj 3716 0 obj <>stream +HWnV}W)_}IY (RPhB($*e']9h7K ̝̙iB)eTۊ?(Q2^\M{ūՌM+VVP٢PYQV fR80^Q%(}9S]a+@CC}|t5a紘68D>+8Kuz28!ʀ7WNN|"O.7tU𳷵$Z[O=N r9N'Mz#o De9wm\~,7ґ.Tӎ- Xl@;g3wy##Ed$.{B +FOLӫjU74C\xm_yCX.dMjS\NM/:!Hؼ$hWᄛ)>PNdˀk&X}1bЮ +@q.H˗hٺ9 '-öe4nrUq 2m#-nb#v+-b8t i]Ӻ5Iv}W 5_ ﮮ/oSb/PP?Sh=̷Heoi6/ڄf/ +Ufܤ|_nA3Ƅ"1TqcIg|}*%oY}g2Y'xN=vh"vN 󲹻C +-k-Z<$ȵ2[/`ymu"[g*uj), OyMFȭĕɰ6:לJb(qh-h"?з\́(ixf6qM'MM񕱔DG"BRL#w0' +"n9 $4SH{]ksyYW.[w*% RmJ<3?o>stream +0 @@&0S @L&#Oy~wJ|nDMTz83w7olA)'iUԊs&&+bCT\6䌑T|n7iPbƁY bb$@,!HK`dwptHR{Jo0C@#Rd'α;s%b?'(!DdЊMQQX[EAN]Ίb4_ +(bjCV[䀥ՂF~ܸHNླྀӌ 1:ҡAS GůGHC]S׹f{V$*,2XPVO("lxA\A](]sľ7x% ^>Em7/v8kS(Ӂ{PwƽS#A khGb§I _@"3;; -Om bߵ&e\G">.WͶZ;P9i3=:u}Ǚb&w#Y추V< /lv'\P'obB_ gwkHECVIh~B@ư#D~ N/p %&B0&s{1Cy (0RpM4e6RHV&)atF1ڊA;qBT4bw t* +ԕM OYیmbbv3ի-v.6x"A+;F8JhOmfPϪ1Z@\:sW݉u~kg$$LCmp: +[?А9r>.r TV$dit(6€:i]ƒjsdNo4aOՙ龭"ыA۷;22hN8I*x@Uulq M7`!L#DHiƟ y?ӭzѶflgt&.T/jffw21 ~C$%2[w;~so{*m?Lo<ũm-rAF. +YBuo .kqe҄U6Fʝ⫍XuwoI3}9xi1A&$b BLH%+20v&ȑ ڳ\³WJ$.8n􈗨uB`ǦtB&SbZ<}JYF>8:bJߑ37AGE[{ijpDgJ(l xmиfH~tnR~9/=YZY\-n6lRjЈ(B6?#"ȐmRN!դ¡v^@ӌL/1{ ;sH`>][kabxKodxA{K.UhNgLX44O/IS<4B7r c>i Z6!Tmф.m"igMa5sK,{An #r-8tCK&ZK= 9;[z5[</WKσY5}n_4nI-o%& .=pmv3vwpjG6l=EqLRZ/GooDE+\ʥw+q6?f'M; x44mWQԌ#{v,dVEBW%Cw|%<\ 4@>Ffy^NyiƓAo30,'fk)P(EIOMnYڍЙ/rOE轤ftP VdG9}Viik&+%x8 +qupW}'~1Uha#fSaS:ExB&>qs +"`Ii#/!NӾIQv+?"Fb>I:SK:9UJܥXh +}Bͽ#G.394k#2}PY(znc Y1Gg>R";W0ݤ$Q +0,Ǚk/e^kVXTdO^WVhYj+^psQãt?uASQ+_?w nx(Z3Ȁ-K4Z~s9SXɫLiۇ]vhkKL4 g;/݀l,=(5{5_v=F[wҺLnT&4V.rR'[ $TÊ }gƛ%m|4Gp99xBgt@kYU_}I¤6;w 5nbeuM)ޠl +V ?rabe׹9F`6|d-\!+ iD0yNɓRO|'Zo.BH($zW#R]ꯊg(+^*|.t:žFaD n1]w0/FS,&Jo.HTΘ8"A{bJF34]u\)h!=V(a ѽ7v6ME-l#$UssҳUTKqcJc` oiyIdxBGK.0ؽ2 UsX6Ώ˥S^.о R`М6o <i#bWzƙB @Iñ?r,E]5(4rǤ{x iPñ=G#QڰR%feI$Wr~J4-8'd|aetPf*1 +sqZt*i.,NҤ2 +z̜9Gl2\k䘞?H\/#xCVed(n. e+էm];%ﰗw;7n|hNEMZfo=-itTb/ONSK-/D4v%1 +U@gX|AT?dW cFv¹x[j p]]5i٢x{tTnc0 ͆vެ Mb\.BB솟5`Mi=t;J,ׂSg/L\LH+4Z D>,7&}\h4z ^M9/* '`G;./Sv4c;# )(n1H 5wŽƧ?6'OH-!?Pv#W?4;  s CѲ.L +GdAV~"թpO[`kqa~>[MM1:rWb-rb3١=rt_As Q߳)Gt|ܲ`ڠ˧*eQ +4&+23F7, L)%t+),m2@,*4#CH7k0:yf1A(;gQ +q3MG,oCչKjEmh>!KXݻhCT(؇ è y't1/sW/&pCS>0WB{J%@~mv3/1{%n+^{ 7ۘmwD$ǍO,0vS~ԫElydyh&v؊+G*5$aߜ,V#{Xxt=[N0s7|*G Ma85#a0 uhmZ',>q]Z9CW^Lvݢ8DSK,> h5Awf syWpriүfdA}k8Rlj dυ5Ǘ"F;ۘ 6VC|3auqtKZ Ng|r6SM᫬ X_R m'&/E50Q@g?t3RƜńNT%bXo6z0.0;JU=uӥd汣gѸ>z[S)zm(X`# fV]fdb1FxO=lH@0fB'm <͜zŮ?@,7fF3Z#:P *tqJ7biܩu~ ̢ln\?4VM=Лf= +^rw!ޟo&KfOLJ#Fr7*(P}(GY\1{$5`lXM6 ,n `hwop甙[Mhy9UҞa^ יsǶQJҴ+\1OӧBOI;!$vmP heu4@ЭN Pϝ#f1Cjc +3zFY7i萭R1,?8h5m!^ȇ]GHkKKe`giPJW0gE\Jn\G-ݚ5ENֺ~& :k'63H)h={>`AN||ܽ},dteDaQF7ǺNnmK\ux"WOkfCXؠ3YeӘe9{'*|#.;V[Qr/G(vfr? rỳ:ɾV9 aX<;=LȪ)áKKTI=3m~1]2I:lTK=Yt*Y@QI9":p)&*QpV^P#&?O@(rT,&F§DPf@uJr̩O#! &ռ?@*a&isʦOZɤ/5g=@Eoxp>SDKzGM7%q0hJKmTVޭkɌ;VW sb7[7M`,ǿzuQş0ZeR³-81j];hЋma(;~DNS|tdBFFMxpF8pAx;N)F1a%Jd݇eaS%Zzx1^0 [3 +n5Q[h==LJD s2*LP3r7R l!w_-#xHvƺb3 LW ,:=&6ui|t⦰ӪáߊU&Igwd!3؞ugG54yLN}-;d%7%00#y4F;~vb_Ч0O&rʶB}.bWjLӂL^eI|m.yu1~#kr@tzt&êw}KQ+_ȦCAm^I*ef\a+v ,|tW!>N{>k'oXI D$Z!No_<K=>9aX?HjCrfE=Ks4LVr[|!6/JX?Ǿ4J y63s;?F\Nɕ>l,<-@S|AiȈ2FJya|РE -0DLW̥!$@ܨ?SK% (~Sv,d2OsvI,+_M6l#JCQ`Չf=eWr0qv":iզadA<ֱiYjBb>3ꌷP*Ce`Lw|Ii~RZix`7[|{7M|lb.BA.Bf娖낢7Qڱc0h*d(JV폮bk/dK8rWj3>yB +PBT=+B1P9s6}|sWXg_Le`=S_U0c~ORl׿"NZ׍4e&^nq!]4x28A‡+;˦TQ䤄Ɩ 4 +:otnxzXn06 @*$RO~ 67+yf]%[L6+r r9 };|}dcZ(ouC^mh,ڈ2ҼksPEҲQYtk$6gu)]]k%Ԍ8uQ^$g+N^+| C5L/(A/iFMw|*GBF]6@&Y풉K3~Z.fT)ZݕZϧ G<T#VS]0Qu@s]P z\X ]S5bQ@N1iϻH*~|tr˶G= .Mx}R`rEb4fm +AOnb0\C tV1N"Ⓐbb;^$#+~HҬgVH16dpP;^X >`! %[ cYc,R@"C3<ٔYT9 +*NsYFzĎPTiĀ&aҎUf/RҏrGaV}"0~H޽ݤ HI+&OTE;6Fs̅WiTR(@J -vFG%jӲ +Dq_k Ltl]|{9g^wU0D3C2 J$1'5pkp+: `iZb0qȔLg: V`^8#A׳GA fM $Y8l +*]fqhO{> %~QE+\ÿkRHZ*;*IW@.>fog?P#á̵~ygxxz7'\}g')O=>e8:,k}E+)w)ڭ9-qLˆcϡK>ˈǾ3csi~F3ap5v-S~aE1:ITI[oLhip=P|[ڝK]{G9\skoa=\"3dPý61*£ku^+9ON295nk26zՋ1Do땫>o:l~ < I$="K!?Z T] :46*ДD7b=+_51АA kr3%Vhُs(ܝL}ߏb@l`a E مOeORcTi!9zAD 2nYCL*ioi4k|%`Ό `Ў=p"`C,!{#[)5;TI :` yBP;niO(Mj(ddۗiVIaH{M½^WuS1HRȀaCr^l +Ga9;fbKۏqlÜ-R5\"|z|+-}g9uN#hkFY`Af)h.B YW"x9\֋a\s{%RdN\mߔc5,j~p (A ^KaI&2'd\EڝZK>ubPbz%&],5!,Nk ;i8^Eg.qKD~DӓrG_LD)f|'VۗAj/ غI(Iadºu {2;n\Sϡw r:9oS:O<\nW^f,pT +a&be+QdPA1 NI]@#iA]MWiRè;bgْr4vyJ +}RL< mb3R4K ;@ʬP]:!ucl&[t cxV jr_o٥[ӮUJ^p^uO~uu5 !eT~[ UrT D2/ !j4K*$ć\q=ڐIoz%^U2oYd\>9]:goB}arl(LcXDLg8=6`2I*Yl3&fa/0՜+B{>.JQ_3b4 ]G^ʽ."A0c_قĉlo6 Dht[)w.Z/MCf64!:7KJaxp,&+kx2l~+b9s2/Za6YΠoi_Xv+|٤> endobj 3718 0 obj <> endobj 3719 0 obj <> endobj 3720 0 obj <> endobj 3721 0 obj <> endobj 3711 0 obj <>stream +HWKo7W-P3]R"lG.׶>837|qǹg`7}}l~f.~(3θU̗,1-§vBk͔/gWۻ?C>87 }&T<3=)40e d\46ZMh9y'pZHdra[/a[F1_r/޾}h7QJ<qrd@^E|{δeOQ-27#A!VG" 1Hl29_R.XubYHr (i>g^h~> &-]0d^cx!,፿=j,̒U!ENvtjXabvJj݅Kؓ#.B݅ @{s!SrRs8)D!1C84aN8A>CwH̺VG35Fכnt Hn9Ӳi.5F/wwS%AI;A M;%FRrExjb|0S@rl֛rwJȒxQ I)yBq0QDVG dBc`7,3C FNY5$DYFsK9ǔn0}5H`ce/gs VC|h7[)pYPdkp@=Zy2(tV{Ұ\Dw +aD +\vmAkL{bsI `434ަ zyY'/ܑ2f#we>_~6M;|%bȆ/pt"(CJA"*ko"K*'P)!UuwSĭ C'RMadO=^T80bƁgm1э'3X|:(`Q¦PV媷۞-Bcƛ/0M \J4jܛ#84Nfr\)1k?@ Pnm$xFN6t6gh .N"r± \ww Ą@b` &}۞oZyt+3P*U`ؠ{GH0 u}VY*%ȨVJLiH==9aKO}77m#>1>wTM l'*ȣ~4$! TF>y@AH1(6ҍXy ۢ\w(ߕ8WAc' w Z"AMgipt-} q+TDCGn A{Ps`8A+O$#Oπ(Eqp$(yiK04@g}3skjQ})q恺>R ډQ-B\Z04IOjy%2I>stream +0 D@&: D GA+R˟+kt5"}㮄#8E/G^yP?nʿ絫_~>.;)o途 }_^=/ SFUkiyf% S&R'%XROI}3 +;@Sأ5p\ +́L]/Ͽ1 ^s *)MȾvG $lCޗf!# c]䡀wJ^'eX\]`RO;z/M0`E + #3D{py_LX # 7;*E܂7i{b3w[\h~j) Ux=TpFlqU+_1j]lb 甬ED +| mꬡ)jR} uRSttls2Oǝ?n|N  ț׏ɧuBe{qLK \Y~D?#n.T+c#Ŗ.AWE?R|ĠaJz` Y{ېeȇdr[7Mr!+N[RGslvױ^? 4@2%.hQ{ +RSLRs@vbC?+גdk!A^ 0:|||k?`.ۤ߾F /~ʝ,3 dʵk7޻ɜC+yq w,tY+MYmiaokdĘpM +=NS;LAϞ>`3GFҸ@PM~2'BTGS$o $`'zu1)qM 7*=^)C!Y@w ɂo 2ʼ4K>Q"&rb!vP]M(dJO槍V6>zHV1isݰAG/Y&fX\Ė=QCbLmBҧ"AQI2(Q{jQլ̇߉|̃ՀW[=jyu/㟲>^|%w#9>evc9;L^r HN )Mp%ϣ0m(tWOD4Jȃzx6ӭÄCDYxlEP7/hQ]iQ#ߕ*Opžu^7#4,U?9FtL8#T9/6ȢrĚrd 1dbqAzƲXas-Ʒd%GT+X+~4{E"ܚ3unIٻE5<_QT.bIN17F vpQO'"YlFYiEd9ø6Q~~ =H}G[PMlbt7稗gJŘ== 4Q;dX7ϥH㛒UL u¶\!]Z#Q8A%;MwD\7sGau5-sFj`g++g3^~Yy<F.t/X-]!A#KcH~cJE.0N-/LqSI{1=C9+Wi?+ؕIckt<߿<aZpak 5ܽXiO?Ki7j2gHi'F-z>MmW! +9ָlB|#]:")8柸־R'/<۠T]8 |fmݦeS[uw/L+t96Ϟia /LKZw\33{{9$xnXȩ5*C-!Tb#![ +y +C- =Cbg05?b1>!H>Ok;&>0$HَQ#+&^@&3\xD-C3`LjsDniB>1KڰoT3]UWn+סIVQEȅ횚'I֬~&/{/4?9tOy(-0O +xik0gI7%|s" G^^BF<~[a3 UAm쏧 `nǠˁKYzg+zʞ;AI*r_@q-Bf 1 ڀuc-=l&$ mCC#_ z:*J9 (ې/20'DC%+6EW:ZIo*#JnhBƂ\ȵLlFH:/1;?dș#T#`8o.GA  A\ +xqx[55O*'ڃH>dy%Z D,6t`5#a}Rbm c <1Iz5k\ȫBxZ j yq:eT_0MqH[q2])/gIX|:i%#{Yb::~2C6e5+¤wbz;Pl,1hFzs=-r)YK37zr`Qd@# +"?b,0gf̳Dm +F g]^'D81"svC h'ksbs&0S^DTވ8bP s G -KIEžoy9VQe::%nنzvj8&+kx>R7'!;ğ߆̏DD7p;u YE15C1Oj8e"ܓE\Xt݋8޼M9JDVuk[ + w^O9*܃ƭ\PH]pI NG`ƇbiŢys 25(>]Yws#>;" pVw`]9H4V"$> %.üY l3Ka)>dᱦ?U=]<"`|htNGs1JnŅtrBP2+[a!_[;GLyEP"$s9b!o&8[q 򯁞[CCY!ػj,1g#{3+IAs5>د/R" 25mp.׍ +<g'0W#g/7`ɨnKj xϚ`S}A3H wqp.%&he z[ҬJkkg*B0'Xzk(# >dU}ER3c|<{!E! jPNN|rnzuO]'އ"I0&t3^kFkم/5j-svHF9Ob>,;;8X5C睽 GLW-Ch_{3v&8mef )h ʂw=Gם +GElΰX lV<<`8L4Q(4ɏJ :/ڳcʨ̷ TCrJX  h"|9ofѪ=\=fIb +luqCbH6X;]WhWCMz&it*ðM3Թ7Ȳ`sR&usϭlAQиe"c nċƓ̠ XIcf-$IPG7¾"KS͜@a2s +tastGjUv z۵{;l\YCDE; +-?K8ˈ䃑^'#sHen .>*2wp: ug~<,]//bÊŲb[oOZq4Y2tSƙR$}!q:WeT(@]lG}$^yYASVoM0F+6TʆHW +ӊny2ł~~[ )&#'tvQ3sK^6aoɣmNy !7ځJZlR,I R+"5 F{떾N9"~R&^4ȲnxIKv(N< 24H=pE4̅(/E@&BZYTqFʠkN#{2-Su=ixO?za9SASzJ0!v˖ #99GguqOqNk~ÈxQɓZ&?]hsAZdOuq5NzC2p3Ժ2.=;GMrӻhG7-I)‰~eg^蘐Zɷ8`V')LVv>AqČe}@;%dYcSAɁe w;8' ʿbx%lPSD}?Jk:!lZ~9>gwsOMex cV1_ywM׺yd?m^&9W-¸9(xf孧Q"|; fF`]T TSؕP7æ#^p_srsSOo7]DJ/YB/j03 hіB`%C8ii2C:6S(;CS1Ϥ-A!E~:6w,AHxkR0"a g%}=qV:/wɕꉢz"쟑$'jW7OXcțl | irpU(L̆0t +/qm=zB5yԯGUGұTHyUT%s]uLiNཡʸT(y/gî##P{!Ƞ#!xVpkي +S=R~1tǕƶ%u]!%g/7.Ǭ~4~X_3ckNuAocqJgeA#O2u#M栓M&;$VfNR1B܂*PHe҈/h5 чsR̆g |^WwV#Q|8#͵=HghŠmނaE2HH*5p/bi]kcjlRɽw*)qP=öv0UlnBe;{`3]#wݯSsmMrY6~d(U+uyErdOݴF5|4=befecq +'\7^UTi4K/ggg|cxqJT>A$^EuRIe楃q/]tI8%Cs +Pu')#M@F)|WЖc4⅄_Pjz@sd KȱG.W/g6*Jxb6UNM LLȷ`ɖhp݊}w1.ɘ̘DL$aNT9*\xrHUHwc4\qz!=vl~=ΥQd%ȤR{ʊ%?$Æ7zØ"kb&.PLb?'ywnTDL?YL277C+ϻw$bHٜFyf߬ TXny^ aXR-p9 "2AZ[Aqz ' wr½`n גZI0_7*8??yS1מ ht8|Xt6NM ߹ OV_>Ȩ(^^Ө8~{?/zX %OhT̯/q3=+Q#D1fmϮ$~ÅF#x<8 OpЧ%Vi>K5J8s ! +FP1*pȉx웧۱3s*>wasi WO0B5o]isuͬu_ IZJ9乼^X"58j碔"#ţ%Nӷᵠ ?5皯E3L^uA p>PaRv5`*Fp[WC-tw tTfA-C::[F<Bp7Y 7W[6 ,l,^$R3>x&ldKbmQ֊ w + BB˿jgsJg`;MJr{Mq?a{|qJ#u,ifOj)LDW^$ԤF%gSƭɌ}pj>;~QYq5bF0OT?Aq ~IB޾1OO uLEwsX08s{aX֫ىw'ZZ$:3<'y/ig*Èp|’d +'Sj۶ț~Sch缭'nrhfTXQOWUdN>JNQ{D:9 vMdsb1;qY їMX`eL£ibrX^S#q#J +?Vtsd$+oiTh1nڮjfy̨y/';d*Ávcw X~`ϓ&5+Dd&? (\5M?JhtM> 2N[V7_Vyq@!kN{@rue>T?*cZ]ˣy^GFvh7t9Yps-[R_M&-ldw׷i=gZ?ʳhLG(X$r>2{5bTtzE;Hi 8 ;ggqΖ4"TϾ>f oUwc~(5l;>%d3ރ..)̵++Z W< Pѣ3l6!2gc^]PoT|}hR Pv O֭!ʥc`{L oo۱<B}O;Ɖ&vP'OWL>6'bzTtxTݢ8&L bZid؝9fDjW#9$Qkz+g޻/ܹ;4\b +ix frzR <"a_$`*JtSPc'_0IҺ1N!6]oI*Olm 6̚J3&*~\_a,=`n@1da$hީ$-ER!SGTo5^x*L37 곤ؿ/{C#\^;Z#JyWM"n~޵ WhG;`ڋdNik`m$-YDԎH0ܥ09MD+r .b`{m#JB$52L 5JE %M섳 ;Gm:mj|o~_^1rO/식_[s[@8r B4ZdM(0z{js??d m+ѷCxA@oboD1}N1ggl3<"+sukU|)ծqU- 7j0)AduavT'G&-vL}꩐$avugˡ@v^ :0d k痟ȒS)rƸUDJ{i@:Dx%X-3'FČm]ql#P +1 ?Yrhۼ]7uV{ ?f+-`5:$X<.{QPIaaԕ6+C? ]flƮwn62 D.lL_7([C>Qj'% ݁^ETψ +ʀЬ0E]Evϒ6~-B'[0Y,]&MlZ|:3;OfbuN)hvm !涂 UV=fF{qЃEZ5*QfL &R0އw"c;څٝRmAZ Fvq(lh6Q֏^|U?t) # ufEWܿa[Q1P pks[P +Flz FJ)ёeFɏ^$jq z3lD׹{E3)@n'-.Ew4m=pYh2hk7MOOқo1J:Vqe$"RuO 4$9}-!J&YT\]NF[6X _۴ AXjgkE"a>yBH&(j_PnH@0˸+eF+I̋dEȿ+!\Cqo]"q6RK3Fe:ܞ Y4ry$¡[~?G 3\bUEG)^:^RK_uL& Rh[eay9)_thȏJgL)do0'l~'q9*7Yk '.s9c:l\ޫ](*U)|?X@DCq2C&ͣL +r6 +A%oo9ZG1f`>)C 0D *]ypJ%kZ71@V&*F?̼?&:@ NK +G1S"ޱFrԟ0"c0'ⶍor֓47JAΉs.. 10Wou >@R:(M$D/1/B !ƏhFHA:Nކ!h.rXk Þ -kDmCT2rLTXA:1ɣ(l}=!>noe):bM[҈MG:h~a=sH7ň3ou +:Z6nd؁B₃)LgcnsWk%:P >"N,[XVq +綳e%#5ĥVi{#MD> endobj 3713 0 obj <> endobj 3714 0 obj <> endobj 3704 0 obj <>stream +HWio_1߼V}kǀbx;CIg2Y俧}Ȧ$bQ]W]g:!7iQǿwNjW?]{׋7ۋW[oa%%j6b6q5'mĚx]՜6_os۔딝vXC;>gy ?ջP{|l +9m#lĹ)t;Ô)ό8>t혰_}6~m{}MVԄۛpOpBa~[q +|}vձϯaԅ*km<3'Ҥϧv@p!FڔPw\]=}&n2~>Ƕ{jscY~VuJ娴]v`w]54iz &NXj2EXX%+1\TqԹ]S:=`V NJH2NC\LATqٵx=.g ,EkKa OP\BfA@mFа +u@UAXT]@=C'`GVt[$rLXrs_0䢫WYijj. }x{:<&  QQ,'t4}_\{ kc@o)3) ,s$5h Y?tx>.["j$j@S6kN47MWcɩےFG-|*S%OG \C'̬Ngs}_LZ,P kW"(S0K3̕BLDfSxdAFG8 }!S[\߬)@{OX qTC'wibr +~B7k"ZKH/{bS +7͂:_"[ +`u}`P kn̟__8X35SDKO멝AÆIAu)C,%5 BL9ԓ+C kڤPln{awWs6q J7T Zm@)I[eˎ"g%!఍UB|p qHp6z#Wuwgf D``(ޝ;l +œ(SID$n`,p=p=fn#68C:'r><bswV:44'^ІOf*=a:ډ+W|dQ +څK"ޏСEt͌1b5kl0CyM:4㺐1W?UBfƁYC"Y +uUH\?= 0;fM0" +t>hc7?fi&"VsO6O$}cIJiW$_U3hҿ\b ᗇP}zFc(/̛^A-/fq>"@gR 2/;Q YsFGWFG%bL{vTwP" !^v3]U -cM'!`e ztT.LY"Ðs> +搩qxs<&D+}_AfA7ȢϝH5a$.YkR ߜe!t!l!DbїgÏZg$[#:íc}nr:SeuiKr7S%p1T¯z:K*jxcrŒ$.O2]&^Xa8qaW +!IDQґ +UB&m]kuc7;@!y!yV+y2Ñ0ዙQmzTk@eRE_WSL*"1V /d>WO%-X&`2 z{uC }W"8˪1ɱ?_ͮ:hfBjߗuAX~*,&/_ǻUiAf!88W#y endstream endobj 3710 0 obj <>stream +0 D@&S DhG`6cY eY%Snm!.$F@FBk6vLrB zJЪz98ť# OnDs*!d@Vgċg_שcb3pm)㌼-C{9hkr*!b4M_o莓mp.*aL + ܟk8yy0W{%_}8zN.]'''n%C/SO: A_>s^Ci}pu _4mCp0Ϟ^S,[U#͖nYPg2],#/W乩2fVXJGWT*]T,ŠeDD 綦i~[5BXV=1MS*E}HH9W\\l8/ȓ-CiGaH2 :mx*@ -V9P,|\x2"oR?vF/rNC]ʘB(!6W΁+gZl|^z @`eWQ3:(Y +0bOj2> K16ݤ[aM{,be+1 s۱5'auFj22. da?#iRVd\:P|6vQӱRmr5݄g=N _j5YEy!"`zfVflc F\7[r cf2lb|a{wQ(P)4PؚZZ {eNF+"UWBfsrJFz h4ش*G0OrjY~ /-¡zU᳁\זі**&8OB37GȞr^!D$oaD1AdYO_A{(`0^j}Zz-"/t[%4hI43X^EZoܬz%m?·xKy!Y*BSg0N*ʓZVVyb힘Y.3ov'yG6l0y0Ao]'Ǵ,Uq2f%@贂XיaRͨ +sW>FVbحPk,^]А-HP;) 3^r&F`6f ~2|ZJ*abQ;oEܩ_w@BYlQ/sYŽO\M5Er)k|B"ux]Mc} E98ĥܦ\B -+:st@epϲ{MWV&`[p~)nW6zY/E`1dyM9S4NEX9eUw-uh8f 1,qz",m4z,]np{հ=NoIrMj׍+}Ɨl +  uwJI@ +2.ͭ\3Jp e#t-ꁍ28ۉX )t+Lh =A(O;zL7U& af1bRg3Jb i3@26-de · xO|fL%+a8텊DY-  +/3i:D/ +#?fy~Q=Gu79$"N癥a"Ohrr$i b~O%aG Z=huIC%-k%Yq79) +,D}%',4!?G@X>Db<J{Acҝذ9]F`a& oej47fF/"ӚivpNjZ!*lelѹ6t`^:. {ha% ٥>%,+AQ%Ҹ}%A%ρF'O<۴|Ppug20I[UY{q]Ij}q0>/֐Ȓ,$Adt2F/_Ǽj4hkF4m&ރifʩL>t THj{bK:yx~4KǙ6): +g8.ϚK%7]dum"Ҝ Y%tjMJf lH )if?L6u0k=-pr-ࠠutuh\UҳcQ1 +@{@*}/Z*hK79Qfz?yG,졣g56)rF۝uÔ ̳l2ċdw6G8\l 2ZL-9[8f']0" )L} i**dySDŮ K|HlԋL̦6%Nd;3NΠJءR& s;h y=)aWgp ivv>xU49V%>M"NNyp%-9wpq<79⋪6f3;)%Y<j'raA^M=Xߚ3GֲMuI_t3T؛a?6g.wq"_Q<|%VL˳ceB*M[cD90?SCj{򆁎SD#wĿc}(ϠZ(xT{rZ;w}V;R3>L z;|Ғ2E.& Cg # Af8<kQ=*?#;XYZsZ`ۥFf\et#PVpYo+ei"Mu,E  -%sHaoe8VL1 _LmµzYnT5s($4ϊrr*$0J.FQ5V.k +':ʊ8qF6Z /6t{{?'Jfזo?r S>FcHlD7MgHLκgW6k:YM8o]{)<%)#KK`#8͍|,ʋb6ڱ}W#;ӗq޶s,dlueD([?H/ehS-p@^g˩=Wkk +Wvr" 1Q(wlLaPFUe=4;xcӀ$u`2 +zBH +[fNE]8`mQlDCb>eyU#!T=)E ٔzI"pّ7'7EfRX1F$dZg!FLDU2~ +5'&Se%ICEIW|=nQvI}Ѿa00 ׵L?-"Ҷ,L<aTZ+ސH_@~5m〆'n+,7UlF1˅`(U`WQ(g@qڄ1pϞbx VCLrv}N>T^0Aὑ }x+h6I{bH=U9zg!\dm w%N"r(ƛ!j 7]q 7B%AM LoC?,Ew+m+~Gr eJm7z,y#|8R[c9Qyew-sĩvF1/X;Clm2szmjtd +hXlMG]z'mJΩ(xY]rɒ3$ԘSr$Oi|iͷw5`QhxXQSe 7HN Ӿ1hS +CǭIgXJ OZ_l:7mG,s4%ߢLYv` :_&B顴Ԯuuf]YJ[ J"Iz0藕JN:?c82o|@^z=x}fקŋcl9d@vM@ً!Й[&RA <G"ZdNDlnSNH}O\c)uT-DQ&IoM3u7 اk//i}Fo[jg SRHǖSmO+ዓ8 +Х: >;՛)@@{'Q\d +[2Wr|\<^GOX.#m(.G[@\ș  N`k["R1wP3mq)Φo+Ͼm1]y+_O f.u\\;dDwٸ%"ABzVmj[ViUXM IB Vv9~.'1 [5TJFEn#2Ogr|\h@?!r2R`W!o4u}"jzqb<>4Mݴă Eb>Zw[X &C؄aDn% +D&/MCeQ[Θ䇪* 4T`<4ƾÍ~[3T5ZRЙVx* %O2۶,w-F/I)`>_h͓OL'NT +XF(D7=U;?Nlla(y>h:MCHBULEѿNw= +XM:5!6y$ߛL(c9*cenAdȭ(Hv{Ž̺c%u_+O7{GPqԻW@pF H".zřٶ ԧFpeh1|4* pN6= "Z:Vŗ~1 YTn;@q[ Ѻ^t ޱS1[Bï:qƎY);X'˯׊O_MSH/",l8%<:b5)3Gm&i}؈h6/JAwO y%7q~{Ui#[+]a$~!6@iE4 yS+ڵaplιz#"nȋl-\T1N)2):Sxq  ,d[QQ4'G-t8XXGXAB/2&9>)!O+JC9.`CWܛ՞buУ$ʏ j}z`Jæ)NQ2X^8L){}BfG_a]כrצT 1Zp;k*=F&8RSZEy|4ދH@R,(0,5Mykrkčr">_Ab|n<-L9ThkN=uR hb-:ޣR(ŭP⹑:=D0lM+Psz8Q-[@>FL07wyMQ<$T#?!pW¬?7+ '*aw{5_%!d'eL7$ivHuJe7FO39b~8d^L.0*SXJ`7{`fyREwݰEY`AcnHNKEKpg [mmf=ށvC/jϥ098yUsMԘwRM;Z Qtܔ](?Z"$ X[@MrmwggiSa-]g鼩9@ӇW$HX!&˾'Sn%$^S$la[V#me7| )N>Ņ$JUv5qi""p7(O/E֣27j EȘzeQP]F$ڮc͎m4[B?#}K\ǻ[$pD.KI 3R,U[+OKyy9EϨKOX҉d; gu8 jOb&7JWn6 1V,( З$z) t̾LtSaϒˮL*ՍMaX&ց-(-LtZ' +==)=WݖZ|߬msO-uA_֊gqЈ/#|)qP_I}{.Γr|>olA*_-9Nr z )[ꞕ)x0VfH|RRhtNDJ0rg)qS<63׼/)D5= caC!pOH\KUM#fF#Df.'ʷkIq!0%#VKےw 8/{; hx_dJ cÚ-m9x)jnS6Bm @)#Ѧ"Dg5ٴ'XAe ZmBk4 ї$w-Íc>l {ĕ`:J8a!cF; +iAu6j ОF&AUȑM"gI*s~z?<,9z`x2=QT' rw{P-8B'q/eՅdBz` DS㏘`N[ BIgEVLDx[j'Ζ~ +)%!_acyea;J-D;KsN;չX4=qfǢMK@Ӈd&ɯ՚N ]YxQFUXs&iB{Sj_[k?Fqւ,FEl߼vrN݌y -9W4O=ADnƒL`c Y X}_,pX֯tHI੸kڞs Vv+΅g4K˵K)Xo\e +,ˊ?wr~Y6)j$|3[]0*!d?p0$,ۮLIVq D69~%a]ZC~"*19 M@:dq{o\ݿiNjz*g\8ThH^] W+3>wT'W,DWtu;lkγ1y[ ϦGK[:mgs]LŠ9Vv#E e?|Zx[BTwy|*FO3 yl^7CZ(h=Gg<ڂXdSģ#<4>=њV8%|並M5{tEG3_7/q45~M9␒ R@GlKѨntg;SPu9>IbW^rhQSD@!=2o}~^Z>gD/돤_\jEjyH0Gd_0-_=*q+,Z4:wYGYU?R% +;ټ/o7<;%-c njk:8s&XTS#H޿1NQYe2.7T]!.fqNK# +QS:%d e!G{TJ=9~]t[$m+&)gz6y%$2Mc텐;}Z@];cTSViuuϊc/ݶ7OI1Ύ^\Ha!u +Vi8hFAZw5-pWok=R5>wEz^K%فH4 ]P]V>~KQL/hYݪh +ql[$||6yn \U%=F`>5r'{2_FduNmQ*%j-O|~!~wxc+:Ǝy_IG P!M&g2lo '. +fx0.'.(7C9kǜ*%uD;R| +QLFYe4pRTSa~],?mP1n\v'[m'ZX'ZW0@ѓ>誂)=He>3%H aLU)&Y4Yb"~y/J{0GtZqS/6D ߡ "VJ\I_ssu9FUG[H'#nVŁ=[d h~{,qʹ4|:FG0cGͨw@l|awaQzt8lC+OkLؙYlQu-gLұKE?EGj4Gfu"pAĝq!iѲ=Ve8W({KքĒ@'izgw5kvRl afUK#H˂g7Ǿw?7ϝmS +zQvzVw|:|ͅF_#s|̣ꤺe X*ٕsl(76‹z5v̟J+f3"҈0ĺ f1IJf郺I'k/6q<0ٓGrq'ǘqcI, [C3 +3-r( 6YwJn@*w8 +wgA`uL;|.gM\ee<=2g; )Z^p hqH 8A'mVb~?Ijá֢6ϴHlu|BO ;Ą0= ` +hV]_CJCuR|bYoߩn>p`d7TkO'[D2׋m*iNe݃K@D=ߘ+Fұ8(y lEΗ'qRa{[$K}FL;zfwm {R/N%v p/dhg̃r +GZdF+aVčKQR;)?%1nL{);o tzwed*o_Bb^R3sa [۹I)c/%ɝ|k Y"ˀ1*F*zDT1sVgtQS1&m6Ec$C,PCYY(eq+,-7iKW۔H%K@gхJGT P !|e۟ +m(-w$֐3r)B2q]օ T <AȵfEAĮGt FCG#4Z@vXCנكT  Xppa + ^M e,5.粸 \ 4 @`ލ1~*/[@ILnCQ֘Y8T3_U v&ˏ {4X' Jz}~ *&"h:ŏ^jIdAVTz]q<3u8HY@?djuDt֘+3@Yy_fEwv Ϟك:5@!X<ʐH&N&O#}x~v=CYށY_j`\L'^Q@Fe r `],3Mu\]~BRh Ꮵd e, ;lB{ql/QrfٹI/ԺFAb$.hCQ{ 'LI[Ea]n6BDbɾRQx|\u13|xvhbkJi2ڼ3TvOǭAF_U?gwqOٓu(6-g{ c+‘S5K)Y4JܱsI?C`,Lf(DumPcx2Ѱ6FLFAGUQiV-Se[վ1HI3 z:TR6FVFoL[W2oY= -tD@# 2q>.m_B$@(S%r0}oBru¦c'覫 gVka^M \a}5@lT%n_k6o_db}_AC[ATu;= +DoelQ{R2V lj6a[jUzZDsX_|#(eLpC9+fÙ!o8'G(p!Q:}Uu}|ѓǎEZB{SьVxr_+Nn4L%s.Z ujuvܦP#˔K{pk z1,o޻㖴tq0$@eġ J-=2O8XRF )m㩐>TvB x&0H8dw_Xƴj_VA_*(uq4b]{bS;'We@Z=ȓ81.9\Oh&*?RȏLɗD`:26Mk *b?8q> VB][xi + (%Htl$ޜnF Pp;`ѫwz;k]'IhXVwdPX'Elx1 t!5l _י8^`Uz33~'P +R(zAύD b_!:Ayq*` +X)\ y8ڏyȝ`I`P MX~~o"\Nuu=~r̛fM +wDΛOI svߊ|6@YDw""Ĝ9;K%7G]?7`FČ-, `{P=RFn]3F<3n޷!%f)wvS3~{5Ke []ɢqnal]֧M !z + p e]"*am/b<. LN@n(0n_$xƯF=Cv[QCѪ6af™T,wIZF2tm)YeWiin% Yq:5gLP}R̪/@1&{ `SEdk΁Y* :B;(G Pf5 Ժ-@nWa渼nh8U t9TDrޞ>td[3nmҲ6d;,(0 îї8Z4VƾX"id^Uk YQh ?Y+] w:?u" Q>Z(立Ȏ 4q̬)9jE4F͍áxSWZyGkw1Nb/jHC.c\*Kܤߏc s">l;Ϙ ֩|J!F4݂!>-%"Yiz + +F1-jgsߨk~J&Içvl5*}dF13Cl$Y#xo\ }NQ+Lcd'$sT݂> N"BX*495NX'[X!9t?9f^+oܫf @i٩%+ҡ`&&J{_k_޼[}\V xUtNJl5g^=P 06/l8`ˉ E|](KKK:}(qPqЎ}>K/t/6#I~a[*#ˣ:GlCp? QHgǟ+Sv c{?ۆɓPQ2P.O%,E"_j(u@9gvqg}X/Pk~ Yjێ=vo401⚃M%BQӮ`j*rwk;Dd8|<.GCB{4@wr"ߨJR{1 _UrbLT*?@ JR~*6;A޺vL6 +h+1² }~.K5ԹTo@;)ѲV )DMČy"A(;ih!8to(L$[x VDJi2R9ǗႨMtXbC0JܖXg°^}?=g~K3iH`wq `>f;"[u~;E5vR6U+@zP«Ӧ2*5MfNP +V|Yr]*p7vhm{3) +L;17? fH3ߛe_AǪa! +Îiriăkn?&|Myn8 +@>&oa%V<3)<\4d :Lrir*o#$_)VFz Jv-Ԡ_E[v+$G*q\ԯ5+Mc$wZmħ| Wt2luy +V3;uܸl=oD`6rk7 /T + lmӰHxs˴ J$Um3D0-eZ^ ʣdI>A7zߖ2^K`l@Ra՘y*VS,OrZqIPw-l.Cq8X31)2,k"{F297#r2Ss^]t <*͇EE0g (TOB@5Sb=?5SF axsPoWjQ.® ] < wU3t]9ܴlɠk2:ܾj2☣Y$ATQbWV3nV\0ODIAf9LT!#\B79iN`rZ#9RilϽ>,0\VzG^B3o`HYtNv$6:*G/Z)KP y]J?37Kq=I]ΆH +"e,{"Cɍ#;锛p~?Z\IGP; Pʜ\>һE=DmuX* nJ+N\;jgE럄5Y|0+x~a6"h7FGx&QD[*f|FZEj:gVdWPDɖ w/wBbEZ>EHbͭt5nγ`TФ"3mwOT)mw͝'uu*; VhC"25[C_"v蘧Z owm'=ه!eGnfP!AuhiPuW7e@s'!;ڦQ.@UvbíIjGPC'9*}/ϗB0&( Qf^P^m}0铅GVa[kk9{o2 + +^Af?ݧimoJ \3ÌA'2\K5y_xsދE1 شf(Fed^8YjBYOE2X"98ڂ»4zo1UFz;b\̿\3N> endobj 3706 0 obj <> endobj 3707 0 obj <> endobj 3708 0 obj <> endobj 3709 0 obj <> endobj 3699 0 obj <>stream +HWo7P-0|?@R-. im*|4 %9\ɱlCow$%BRFk(hѣ+<[ф6QBdUc +DF)Ij&WG?^i_)!a%qŠUD,nz邎e .(;Q4O1$'FmIy Y^*?_R =Lx%9}$@(c F:0k~pR [b%y%y\ՄA8Z8g$"|jWAÄr,T&ob('i~Y_wMϏN9g ŘllBb0t$r*]#%bBTQ(wΎDϭ7y1E[th5F2Q`dGoqJ'.EL=j=8m~ӭ3Ұ-5ӃT˸8wHòʢR}sWq +Z a7];[}%%mk@8L~'TbA! Y?髷/'dWhxI2f`(Um!il#`ބHԡ8/S{]^O|QUh-捀q񟝤*TV*i8,GFS |=~ޓhmd~#K'dvY=Ls+1|]]x /c'^GTئP#6/6C•qg|6âgcg6#gҙs6^yBQ4 +Hlu$(Xm@ l_aJ!GgmҕzS &dM%HFpP2,z! rTѲzZ <+Ԋw_C Q:\ѓ:4(pOJx` WexL㘣X}!ѼH*4U$aǷl`#e4Qx^mC٬)Et-LÌl'=j [+@ ۰,"vDЛHr lVa +VXm*ox:){CBe.wG]Y}9`Fu6U|#fZVڣ00r)1ɩ;:%l*djig#R tCl&Kc )vݡ I +1,Ktϣ +]‡FtLQ.}bGvx6vbHg"bc&du5q*b&cLam)@I0x{hp9pko#@Ê O !J)Gz`.Yx5bJE&EYd4fr6H !a.5e2ur h;bQQ?c.nzIw*#h|v_0-MDztsUi]ҽ9. +wnnU _Hq3>2cib;T[SHG5/p!+"Ut*͢PΗ+4|;(O!#C`;49@2/ԃmteh Ɩ\.;@~wu*{2 >M" m.WpwTR&کAr~.DpSrТu!AH0+`t*0 sR ܾte7kjw5C ޓtInXpۚrC3]]讲Rp(a+8 &lrޢ@]]VPﱸv z/XBr+a",If* ˼ͧ[gb(!4(c9^9iL`*u^s\xKJ{u1b Olv|vrX65is#$ +OqPzQ2W8^*`_5p^}cM0IT}Ɍ#IBn枅̽7oyzW6Zf#ځ$@ 62F$cL0M H,,A4z&ll%@<v&T曘W +5,m endstream endobj 3703 0 obj <>stream +0 H@&H H‹n >t@id8sG>SUOZ}O4ߧ/R<7#w ܅:{lΙnA_4Wk0h߯{{"#s*UJ8O)q$T{d)7}Ji$LM} )$~2տAEN{(KhVJy`2PP:m #[/r4|Z[sRM}]3gs +*pg¥+L'qmrvZ#P9¨C+F $!vvp=DjGB06rx]`aʣEĥD7˝~I.W0a"%G 3*8I$&T]YN]"A2;[ (0.B.@NErH4x%t; 9Xk!cSʙ쐱wʵrTv6OrsMBv%،bLe QDfEݮ]8`Å(u)w CpRz{wtXCϖzօ5b K6R.)q#bj =j86^bie\+qSk *-"{Sfpfy!SgFfgV9G$M}YyT_̧Mz;5mlDhnt̿ad1 |=Am i߭_װb=x|Ƃa7C T~Z9Ab款\+dM9' 6 MY48Yzud SEZoSНec|Wu +u.`7qtZRXmcp:CEzB YfS(FyYډk3) vHϯAבqjʘb\̯ >Zf{f %R; J`RM]?1zoTc#>F x2*?UD'5I,3 +1وki%}N&Ԥ9]HӕxPUAx@&& 109+AFw" su{*BmMHw*unC(d\%;7FR|ыA;to:ِpAcoƼ)2lߐ Hh!A"/uxG.~.vy,f[PVo +G n I^9IC_n \/Uۊ3ctFhc,?ucn";$d*ܱ$3mIU haɕų&HjHAguѵޗsc5樻:SgU)QIfL_DC 2# 9E#|H!a +J:-X&w.$DA3 @ }%Añ缀xp<îaz)-8N;֑y"roy Nyc+8Jv[90M i%3sQ5W#+yLXk +wU8~D)Q2+V# ȝuW=REYӫiS۴H&:eB16G`Ićx+.zqE]pܳOS~rTa>36b]ʟKWA(~怜^Ch)ȈpVA=2 Q K0uG.J~4NFV})@AHI['麙5di0=b?sJ*ύ_`JNIz2v^d7AT7|_"ɦk,֧oX ը; H\jNa iq=ؓgyf'itVȀ[M*i[mëoI$;k}E˜e_>5MMoI,W(p)ĶS yBT;bӍa2 umgyb/CmġJOv)rw w:{"G1^(eONWf)"J0JiɁ1$TC'glF"}Y#r_b W2xO(pH=0nN:Z˳riVgp<8SDJfLABcВXDL:dT3KY8M + z#.`lX;߱BZy5Gyȋf13x&1`VX-&է! ŠΪt~F1Gb~/ 6GrĪu%h@yCWQld*EnI9CF)u J5 xׯN3⹭fGF?.$Va`ݍh{ X6ȧpE ++su ]Yx Xo&L- c6Y.rp&6˶1R4+$V/7qFV#I+UY}S6)KʘM$~yP~[$?UاLりӘ#*yסlU-bnˮ~8758j5 > z +Gm \`'4<@LYjTٿM ' `f_(߾E.sWAf=RPLI˄mѤk#?|nUs$ŏk#˓\8+D x ұ`h^H)%[zO_xSsa*ElPʦ MlI.XfLwR%{fK]U  *Ym_p [)?5ADP Vյ8.pp +o{wy,2 M٬?6MS :Uv5gClИ֕O$1Ҿ!'3nLdQШyO\}Ig'"3FOZ34c~M}65LL^6ȶh禲E]/ +NJqYJZ7A0r!,UeL +=mk@kzPH +I mNW\tx]jga.d1و^)Jy< +Mjzuk6qZfyO1} -,G^2x&_kleSw9Dt7~uПc; X{C((c(R|U9C$< + gJ-85;^zS[Yl5kwSܓkӂbn h?,s쀸#$1EydlP˟.;fg,J+yd0_6Z~78A3#+M@E[noN#쥰Sg/50j@;k Y gR`{P۷N݉~t/1}_%Ÿet D(08m;ݒwa0=`i.%b]->\^þQa\ Vqbm"d(ĥ6hQ—-YZV57}D}%ק:ؾԔ`տr<Љ|"1xȧKV>Z@Agd<Rjܱa1O4u0 u*{*=p b@*s%n&*pC*jYG\'E +H9 ]1UEIV|up탱4|d PA41x/5p +ߩgPbXF9u"H W5tlР!z .q]nWjǾ1v5ѣ NպAҶ>V +`QE1j<܏*^uRD%m$@pSHubp&Bw#{Qxe#\8/{qC!m As3XSi5XRYl3<L>?ef/C4$=8ϦHucZn@(GX. +y:{ZSjuzbY&x⋥g9'Hzotˎ>rb +g t kT)@*VG +me>$%m"VBy3(JCCKC+ :y_iA?@[chPwN0VЄ!@#.%j/W-Dv6Ɣj 6fs!{Yþ`빀wƁn N=4kл,ڥ:!TñUs-rMm4&jnaKn K}XxhYT&kנNXz4<÷4 $-,o>aքLv@1>.`ڮzXIRm`v--_i3ns߉)\.+21QyQWTB Fzu@))Vy-.Gn`*}[.nHa)PC'q!r7r%eJDIPnX`ࠟDaEoOb1HC➅+׼5R"|dr/ *$Kd[T0|LF b>)AF `D 3Mg 9üfy+0/b)}e2}VLU2ȝ?re(UCL 祿fWHvW@fpJoݤ/2)Rj!3} j;ȤgAx]̘zpǛ%+>tr@GRwM_3:~bKQP']75nnJF7`~M+uP6Ād̀wBt@[XkC(|{sw'F!8mw%)F9! tl?e ]eAzq7 VZ3rA};VͰzɨA/R_!Mϕ79J 5F^\ϣaP MoE_R_KEnfY%d44` j +ayGGؿ?F3z,Ujwɯ5}2nz),sOq=&r_ "<[UV\FևHs3а@i~=E[J2ԇMlҒ;z2fE Z1ŹN`\r7<I=kMXAf" .p$ +$TX^xOkTZf!"yûQqo*/voq { A/rwe:ptQb?Lh6 $[XfxG`Ű +9rq-Z}\iL^TYer2"I֪c}|Bpl21,inQ s,B +[h3=;)b#`CÏ6F9'HQh/+^;7EBca > CSWꚯlEAKSiUœm{^ecgR<;u%?Q}[RVewOYTªn1 +$:pKEUuOs|qJ0\#ӎqBF4dhMNs{.Rnr+h#PJ< )F#5jV!]Ky3ͧfR0DNm&C)Ɇ=LG/TJ@.~z +9_f>f- ͹$ cD;M +f̯5+Z&;y\/7MUw.w@HZo;SdyGt0ro/ pb|2Y"ktcajKBMCDj[YnecwL O` +l~@/f;r.%E&,P%AB6_xC6WoK{zbkjՒ&L[8a `[~sLIPq6v?Kg ƌRpHS[&K?Lnh[p]/DI͠Vc0#xĦıM 3n>Pv蟊1{bGKoG?Mt5UFU|d#0:tRȫWE+XeT+ G LTKDo#.ci:f1jJ0j9GDZ{@zLϺ|ұiYc xi1ӘWYm =3B-9Æu>VёRҗ&4Aմ"/b-ait^xpkꥯwMKeY__pT?1Ƥ#N1Z@ U k-"MYx^lǿREOei +\K Nz?&rU\alMiF ^ +Vtxi`t.'@(euҟĺ2` . + ?Ü26iv+i0˂c{-0I]LD`T9t"AVέ}w;`Y _5xnh0͙VE|#&Y& 9 +[wV=9#]I^ݹE;$MӪk1LUe/fE$#LB +p;'G) 5T `*kӧϵ;4@D&qAphRabFyO(u{*!={4=Dj̩#lJ. +9& Cq_dOšmL7󕶹6#b7gU RHüQOr˼&5"%%}G,PDz]aCXE°F뒗N{3)H}Fٔj8QbJq] O}N(sy|<׵1Y}.}!̇ l׈XjU~uVK ʽw9I3ekdFg_ }p! G oS\91bTn1K<957gV_ܻTF"K;W @WFVVV| B{E.q&) ;|NblM`#{WOq4 x_6&;FˆɁR +mG;& 0 c9@`<D܄6}0IÌ7陋@zbV@;whʵuО5 }2E^ &%qB9n:%\ٚw]DG-ZJH |9H\rS(NLy9F?zs!u37|}/ᳫǭ㣷j\ĎDKYBOir PyO 4 8T@ RA l[c D/Q1aE1 ʄB<%B@;1Och4|‘}|He)rB "^9T`^+=SaJ%9tiq9 +9p-B@-*|o +iul*1h[ߵUٜKiAP*m0zFVTGU2/R 2m.zN[-3ƑF?Q-1t# FMl?)PwWI#4x@E +nTu6 s)?baMW,|-d%Wll, ?e^6k)Fj)o0i¦1{h}paXZ}k`+w|R(w(K{|c #A/t#Y?Bss `8-[ +zEjrKq +)$nMӌTpW YԊt*#ev$/ml A|p2T)C# +C Iн;{rڅ0i]qy4aĠ9 asGͫ/Lwe֌(Ew{ҥ TBx NN$m+?'46 )G%A6` + 7=3}QV`7p%LJػS ?k>pPǾw64$Qt=?f WNںx:4CUڈ"m4p?AJt_8'i 䠭^") +^L_O {ԫS8t4~ +@Z+L}:' ujk121n& ߲ܼuwLCh֥nVP c|Qie<#;ܜ I.Fd,fzz<(GdDʋ_>6 +6 |.Yg%YkaGm1+{qYP-f+.sf ŷ^cmJpTb?9|ݞ1z,\35 u9df -ho2-ȖufQ[K q%QNz \pYW ~j $ixV3=]8VJU]Ws= & 稴Q@d:/9 SGWkMx}I>`ɶ/Z=z*(= -]C?0(W^p$;U@PGxҬ +*d&mJ_t +Bڗd Izhx3N4!+j.wٿq<ԥP4s*)aҠcYD|`6N'Yऄ0JK^L Jov "]t)KMSX1"(@kh tZoMY0F(4tǗ;G_ԅ +ʘʚ%4cd 6<9DW緼gzӠ9\~ dv,;y9 Վ̨b}1v Hi\-(wWC81 xpt'CI!*-+04c8g.I?>obCdlҚG@ꗻXkl\uq%HoY&kWV9&q0!=",(it./p]Q~/q2L^hƏf!L@RuOjV@ {*ۭ#3Kj?볝 ɩe][(cf BrY +bck-Sk@ʑ +G 'gYCoLo_p>'F0>uO6#=K\Jy3vI)OTMfhNj *udƕ+do!s!m])6#܌uZmYMۼpP:w[Ub.=8AfbL T, +g\K!Ǿ~I'Lo%!E^G 5<\Po_yڪR>b#FKѴ(,5><%mY]|ר(UQ%G{%1yH#UMJ0^YDbk 38+AYi7FR+fyIـjg GsA7:Ne:n,ĉ*}\Jf Iw&ip4(B$|Cxa\_.m XLk'>d&1#*\@G^rW1Zb"a[1F;W4JEҢdѢ=l5:\6 ɛo325/>OU9 y, +} $}٩Hr;BbJ}xr^sE㹮dƶDojZe&NDN5;5)xZiGm + 2L?&; ǚK^|R{"MAҝx佞Πcy&朐r"5XI 1 +Ncы64 |Y23AFy.>&JqnFUǬyk"UF M"tdA8뾝,TJwnm~so54#%;$Mo,8d tL^q|Tq23P"&C8̛k+:vx'YH܂ :-1ح)vil+dr,^7\Rt>7=~6ٖ&irMqbhj< 5[uVMQAj4f?FJa(3 + hYC,Qﱌɇ?Lj&`>|A3"Egfa'Fz.JMKY76%xk7 /(MK0D  ޠ*XpM )j>*3=By^* o6}+UM`1|봦(F;u٨N[ ] /0ćg>Q3hI:6\g)M} V%]#~X$h-5̟_#'7gsRf ;F7wqIPN`z $HA?e_1Mvk8ŌSg'lN;@jzP|_cpIC /WVӣPǚWȐSR5hAH7QLݹB_t/wՂ}~bs[i䩊]Uq:ܰTY1,-><moǻTv=,v!]AdΣR'DKId#GG(>nQK~؀g'nH񇮒Jea#xOOe9@1OpJ&R"z`l@\! +" +*gr-NՕL_[)!K%<|NΡ3<惘 3PMWaH/Qq" 2 y㜛z{suBmmt"ވzo P`XDI(p &$ᘗ!I9y}XUT7!n^!M1vTz&eyF5R+_m-}' 8Ȓ9ܻ/1w$Wl! +3pHl'tCeorh,A_-Zp@hts\ +c"`>nndΑ5Vn+Xf9#U_U{ji(ۮ.YT)LYתo ~EH\BWLI=M6h~lXwgJIOuI «OA5^QkK[p@f\Տ6Eof荻Pbq58GC'x;pWY)z|8lo6?ʌ:i$8E(;&oEb GYN]b|a"o}?W{C9 "~Q-v6N +n]Al9e>+̌} >T)ۦ~IʲZ`-h39D+y\!b`}\Pj*gkl;S;NLAӪ\OP# ǻˢum%Bul-T% Q & xA%Ψ@}>^j (Ȑ)Z-bfBD63qh ~mb(89)0'C,AXA^\u)GZ拡rʬB<ў9<93}̘}kC0\ +G>$dq^<}NBURuW.?5a]51gej̈́" >[e?jem(KI\1œTTtsg%q'ZX=Ms)X7O;/@{,Ж) (a + ]D+{)(7B;#Ph'֫`'!Qa `r1y|E ⃣K.ïݾ3DK1e83xO5xMk$PȕpXvţZIj@;1o}#YTr??_ 5dl~۸sbu5#_~cC=za&ʅ-kC!uǢԤ֫S[ +'8Z |ReIwb[-^~2tVI>|-ﵓͤRv=C_dPqל=K +خ d}p,-z^sfB}њqM!3IaN83nLo0ݐٟÀ[n!,ʨnz8RmBHR+Q/VQ={X2R=?AQŐ4LxT)hL7k aW4_+d Pt]VD\)3: wp;7%"YEJx9!T\@OAZ641ܶ\01ǺGb:d[Otyh +z L=lsO?(dф>2/(u|G e? Eԋ|GIx-J4J:N!n3IP-)]ӥ-=̏0 +h[K|Dڵ}t-)l!dM0sXoZԕ6eg +5D怿e,Z%i`mۚ,\@X'qYT%Wf?Wn˥Ptd84푷o)$O v-CBRA +G0ޫ}GF-EbGqXw72bkW3K"εD):ʛ 6mt?.[THʍ|jEL;lAG2[C.6Q./6fi5iQ;Sd (bî'32T:٪=oW߮tr/^n,p* ;̘_{* SEE2#Lzϫja >s\+`m1UЏ٥ endstream endobj 3700 0 obj <> endobj 3701 0 obj <> endobj 3702 0 obj <> endobj 3692 0 obj <>stream +HWn}W!6ba$$/9&KrRS}HU]]sN[[ F( )*KOٻ Y|zY9j~a)ZQV.6go.vx{3I3ZU-*gLG|ork(ށ p#Rae + Ve|b1cѷa®Rz|$BrU3+ D^o?ʪ_6}=vP<Ђ$XgR`1~ue4NCPUjNE޷SJž9)Q#Uk:a,Ӧ7]+37TPtsǚd_u#L)&|? @L!T6{oP:vM>{;1>ިr b C*#W@ 0 hGi>w3!u3j |p%,vTgH5;ם*͟?mn!+i8BA\ө6}3- ]պۆ0_'KThJ[l+AU0I=|ۮ' Q@bcݷM=%T%{Q !.x!&mfէq­әIwp L1yl~:G`?צ4mB"yFTݪ~N}h2w"bIO1 ϑ!x,B_;ϺG|)MT (/}זٹ'2]_S?S'B٢qf=,oᇄ"D+O;#fc((Y6qUKx{\m"3h6ͦ_MUr v0G"jf`B@6Qs59 )d"BD(7*2^tU.CȰŀ:kCE~Hez%j]Mf8n""6A0\`izkJŽG{t`wׯyJ@*`]Y?pBTW~%MWÛX@M0@s~NJDa1:Pߡi{*jW +&+`t%0+q: F/{D20.vH VI/Kww}YǹdlX5"fh.Jض;呓UGqZ;;`guDMfvJAW f13鉊ԜBuKc`"zuIv4^l,03R r! = h@\¶j' vQsm.f?d2vX9$׉u*/,Ⱥ\$<ޜֿI8ʎX}"oTE%d}$Q03]RUnM.+{M)Vuvg>OW(g%mfQ[~4]$ JHiS^0듥%lަ@@TمƇ'"Fhѥq +Y_qAs#YU!8y.~Z]dfv"t`GL c[:F`f4P@YdxH=V&||@.r5i}v#4I<|k +5y$!Mm O1*/GRQ +=r}׏R2HJF\Bp˚¸򴌔w $n0]",UrTdMZ Ab2rݚ .( + nie`2@v!#xI; +WtX樍X&M^横qӌ2)B}](|;F؄N:j'Bn F V3xØ&6kaԺ8n/*3 ˜% + ~]хN +۹ŐThQSt,4#"J3CSοΩ3"mN+&uWf}<&[1cщK /UE|5j.QsҪRzŔ|Q.?pd1x"4}c&)2?$LKՈIOhWoWl ݼfӗ17fݬfN01~4oPlvG)KMBH% +7',{fQЫ4.'A fҴgSMgM4}uO|@è擷A O>wnSA->T׌n(:p Z *}$$6,C`UA  F:݀d30b"x~]_dTgmIyCIX4NJ*<1] 'My4F\)QbݥN4։?M;}tQLu7H/#wnozQ;I/޶a ^EIu݆݀Æ]zqc5An~(닒ӸNRDc"QiP;: Tд-0r\I8qR岅M f1#iwK +d7.\疂S1wwd'Ą2Cx/T;ʚIOv=gTϽ%t+4 k2Q\@3l}BzD  v!`5ť$,S1jT[L ]֥JlcPvnW"ZVc0c^'j~dfmoN|Ç%,H р>rk:KBҨ)mE!cCqX#>PI/kY)疍a~z~s2]L'NDī [żḨ"n7[(-p}3}]s<$p, '>stream +0 M@&o MZ q69LBd!zg`ofS-Vչ$J(Gp2ב)bkG}的\v;؛ :Fưg!iJ'׳ԏ p^WZ2.+mրo0h9N3Gӆ9c#2'b:ru?$L z +Lr9:uzcyrY&ӎfX 'p24G^V}P.ui;![T ȋr(TED%q7\FZ2ml:ZQi=j\R7PrX$%-*n2 :9 s p?[Uo9u7sptV+ӆ]M06IEF9p/1oxQ[us1Ƭ|Zݷd,mXɷVxe]Sݺ2#KnQ@U\MvPSfka(C泓R??B* dKF-\Tmfa9/j'0kZ-˾ 9c ZZTyxq\51K@nvKTmҧ:(E=ؓx2vrwC)d@2Ķdг^+c +Jlj:1T=x]Fv (.۱""Floy&׹hشb F~2P~Rn<-(še9mاMZ6O op56j500Zo]_OS^U2`IsF(mAu>zl|y?\9實_R[kR@՗qvE|^Gw*QHC +_ܙ0>I7=7Yڳܷԧн6Ivԕ0ڳƺ]kO&ȷ) .O, +39ћN-Ki T +wbdr+;XD>mP?@feKޙx3]\*L7J}@op-rdL׋ԁcXi^A}ʼn'=mߦ茭Z}w0b7om`~<@3[odTQmHQ~WnxΟzFZI(Wޯ@}fS]R=L@7Ŝy%zF$hbAeR uaX!}†J26F+*[(#o6:m+I%ΪV֕ۡkO]|RߕpmeY~FZGCWdȿZ]x(yI +g%s<v0n-Tθ|Iky~<ѩX=Ƴ Yȡ _Tkt~ ,UK| y'U\J y9G^ڹrhHSXu<96! )zRD^ b;g)EI AhBӻWZ;ŞŝFtuiM߆xr;HHUPK<>vG\ms]SB[Bn_d|]ơAhFShRܧo6el114r 4UKo ^mg) $P=Q,::) aV'ꫨIf~A*9%vBv5He1fJ |ɭ|c&FnHP4 ]7E3Qt?eim9!oՁ8̱uLlYW8RGavC`蔇I[j;i-۩JtGJNtQYPݶd{,]>Pse'&7j޴С;r -׳^$ҵ[$x=p,B} ||(Hqp}j`zXMAkb}XJ6zcSih<5?Z 3 ՠ}CPb u#dꏬ*ibb`4 v6VXY4 nwͲvy<%t#ƺrbanJpSZJcge'e _8-ɶ 8J<]j̀p<5י> -lq|\aSn B(G-PBuѢ]Tr~Gפ*S^[7pUCZh!vvnb(T@@k +鿜R &A*'}7 NC]}= vF9c^|.7~Z<>UF?Ԡ\7ثdpE&˲29SHtдA)wO,JS +ANx "0Ŧj-Y*LXցi [ue\ MP*ik95ur;ZH۵@H^]#uH;U -A†B-k Xi.(A>}V-Eڬ~CKLt8UUkeû&15rZ-c^k>_ ߽a)JJ֕S1G/#ncnHJgLkfN@,$}7s}GPْBC'1o +'W\z `mPV4*^8UKUV圦%pu ˦̪pDGIpg%ٞXY#=_] ]lv&2M%z˰f,?UNm j55\ܢQb4 >%}l20;k숲_xBDt?Ti{>ʕ&w ; +yͺdiwl'kql7}p n':.T(uɒ@̔W %_~sBt9bihYmoKGg8pXTl\0g'>W@|B4}@ȽVAK c'i7LDm,6Aw/96 Ŗ b?SJEpzJL7whehu+G<]DiA[7Zw~iC&0- +S=oW)ÎQȴe Ŏ{qHv]vgz9E:u+SH<%v(Q%5n/^=Ӄ~yC+=7\mMٯ$^qQ/v@<%C/]l}n/ "]34dP X{9e#is;!KIaCEYDK\/0MY%*cD$MA=BCѰ)J1KpU.ɞ.Lf#;vx Ѕ,U5jj>)~2L'Oh{b|3*% +MI5Šbͻ]w^/@^HT8uۻ/qMLtu B yt`{ew2P/Gt]h"LKrge( D\|鈟wUr_tD2q\vyG +'+ޫ.R@&h]c4efA إI K]X?q=MjFy$X'׹gVBqhb k3n\^$Kvj"@(%gU4JMDw;'gWŷAGT$M~GBMYd3b! ,0^zszz"RI*VR吘^ǁbv_Z{sU-uAz9Œ0|Ô=PtvU6Rw `%Ft3] +##TDu:Ctr>7ObkHa=b?D9ۜdϛ3'etgf) Lx` 2zo)M;#ǬcX҂mN";FLXʯ6IР9rjerMiq^`zؐʜDNg<>#bs@)q_%Vq o lp -d_a/Zgvmvtw_D޴Ci흙^Ũ)ETtKh܀ZM3#ւ:&KGR +5n@'i}e?'cBo)CL|o$?g2|'TZ2N%”m.?htpE<SeX v3s O=U9 +OGeDe(b2Ѕ}| \S@)i2MŪUv }GXct$| ?CYjsHj^RQg"w +WkovdK!"_yʹn̊%{Z~* |e5R`=oXZo#2>/Fï`L~ͯ6F(0a5;Hf'K{0HoPo~Kŏ s#2dzvzOhd `/c/BWQ!oࢰ{r_][^FSJD+%n2eʖo?؉VSM䘔iB}^eH GK+XlՃ;K3,CZ&^:lu\MAnnW0EdCD~ÝUOZu+*5Tg<.+|cgFzw/g5\ۑ;kʇ3z{{gvA W]xS:C} פu+.ݳ ') 4}%~;2W]`uu=/ Ŏ-I4[#mbs]"H k1Lt+d ǚMP/;ͼ ŁoL;$ֹEqg\ ~;CMƷ_d,ۍyhz"eev$RɎ !M(q)h¿M40"h0~..`W6=ݱg`: +#P}`|x(h9 QzlE+Vr\ǡXMp^] eC// +ͣظv_P񛢙+Դy~fje4@K~V7U*d{~ҹsꢂ?) +&Od;B=ʠAq ou=x\sZ1TˈYp@ *UlJXPkw R6ًLh^A'5vR߂܁<@!$u\3S>q_\_otWbߌg5Jap 3s5QhojcE|/yn~x䢸2֎#|I̯:%fo^†R81!8χ2vr!ƻO3s!kp{Z%ܞ<㢩pCl$i7ze[LA`ryfpÄyo'۝/ɟl_;0v]A-[ecܹEq'T:~odyO@W^,Vp)3W"7GUfe(KӈnB` +c8])[e.t ˤQѿ Zڄ:VkD 6}vCa*C22cX1z{Б`8.^^f&F=V~~~޳cy$]y(u=_PqMUDiPiWkcB؁źmfkn `6C) ^bTI_Lntժcb{;b,:$*4hGǕ&1[B($_z +$`R86w0J[&4)\1횻 3 S9ܒVrEg[X؛:xz]MQ&v; 77Nd2fڋ A6"GmC8)>Nq{1#¯S0|].ܑQxG?ҽ|&8#LFCfit1voW4A@ *p3Gb\q=nkG1k COTBŘoL*]7f@f7?.Ĩ#3E_'*_(0Ϙk@E?E^|r-v *4 " +׳zb2@DlxF ~.ԗKvCy)@ȱznD`..kᤵ'MKDwi\-\|! X8U ?amn!uS.ե <,%wUw'^#y >f"kL "@ߊW&gnqZcԖ#//Hu']g4o;[[n ݆a|l]8vvwwһg+ +Mxnwh5/=:Lbr0<76jsǹz&gc0gP7]l"=ޔ"ljCŮAQPYS.Q +%Y";gCf*1U2$)|@Ef$IP}̵s-9cCOBUO0~J-MX3zyiD 7u3/>}j!A0`veVÔ#q '(?6BC ]'t v1(mχ+K9I]8l=Is{_3z_|mx&"ǁN^&URL%MC@9ўv$7'4 +wZ +E9JbAe:}I:,g4<>;}nQUK'[S'TGg -ogu9aG"l$u0XSKgI{V&2N9+`[jfʜ,W%86q.`a sj)|[6/[bkM/U]hnWon#KБFSm3c,ߋIDC4a~qkt^oȌbZf0œ'OAeOL]WŜјhUGa"{~v:w9[kxÜcNyfH\ +JpYѨ2܍HpJfd$́,-NcKm`V\xr.&.05RW +a5'djEDȷZ3"pI.]t:5#_c /fJC҅FRfýS;vPJSnm_M mntyc~bw$ҲhHx{~͸y!P+Dw8xK~J +Db5BH0nAw ҺBӞ`:ZsSɴ˭ԡh`|>_M k;% +̾nVJbRRA}= sbbm͸-5ʓ?>}^3gb)7Z^Ŀ|}` ~Z"HsKљX#]j 0 T9hU.ٙU$bb4as`\{}q + .RCYA%c +*JmNbݢr? +z)@!a1ȤMTX?nP=D +!2lϼ _ zjڻ3-$HLHȩ6r3+ +ކЉ/ p.hGyWS{4̆'($KipO-Үُb*_ﱌIqTrRn1U@(gj"ýT 2b .gKՄvbs,TW #Л bs:L >+zL@*zzQ k'fI @7Wx<ܞF&9w/+`.u`8<>cZJ +y톲T~Hrd>?[ǶΗ{Շi9Зm/R`Ak!ͲRb +5?>:̩c s9wCvtMHoʪq^x7e˺.R: x_[\bnI,*"sL(!%-k?gO^.OFލrpLm8Mi@;۬(u :ܥ,qi7J//M|t**#l?JW0X Ѣ\M6(+ 2fwa8>oM#!'5J&BM i_t~|yi'B'E%(\!K. +]s&36Q O@qE['٨*:[P`b $2Hⴘ&@'a0*%_t5!\mghb{# 7:Q\8-1O,ve?VB,4FRaia} sYF΅agpxi5䱺QQ:3n) ~|i(=H~S}~`CXS>sˏs}HEyrjJzPQ9l$QBW 7 wQ+8/|8K._XKs7mb4v gϼ3amTx>sN$E Au=FbYae@`F35Ɇ1qkQ Cn;hwJo^GH2ߵ[}҈3յcLC.g a@2}*Ph쳄N>3c˕ mݯ90֮rf_ ųJLwC;`hS䒄)K\ll0e41Fƀr OBrRUZ0J ًŞ}ތ<3:/KY mi~)ERg^DbEym髴T.sT$&@_l% 0-\>O+>$PxȾ]Z8P >G>fT,[31 *=X-ͨ~cȯ7Ob*MVuw/[ne N[n@(tIf'&SN+!ߎ꺡FXZT$Uƚ +xj9 ;QTjHv$i`Ӭm6+%L?W@IVZQeG5_癈a +F/*V' Di©E"bH=e2$t [O T <^[S@B qFpܬx筹L+iJ&@ύ 2=nB!]a- v >Zc䌡L>W2~Y`[al.#xvafH y}0pZE1(񰅼Nݍr]ho{#/qfO(;.i0 zaBc󽫌T [6.c3m +(f`w +Z] 2 v5־xkuعwaoh4~],⃐79e(ƾ7(Q -k</\ޔ>ҳ}muxS@@/n݅cP&lt@ѳ0 Y$]a#PUV)e(}/MoA Jv+r~ dN*FZ^MVEYçGCՠK5FioLнR.nM }R1SaBŚ&LӂAl[4: %Iy09&X׃s߸ξ6ֈ,0%CO.=Qn\9hUņ#w ԓ%Q4/,5l$i sf1 &"wO%tNYHRz3zr {l̸p/sh?P퇶qH-YBRO4noIчȆA56W~rXTՒ P?lM:%#IZ-!2m}r1e&结5*jQ }WLoѯhQ2'd9ɟ7!jrZa%u4s},4}M ᮪e&&@lҁQVJϥJh4zN^kǫ@SyQsu4L*Ц/v>)L%n {*\GI](UsfD??"!} KXkXw˸1-N&&X>&p,1o?g4%:8m˦a^۷R!11rwE}7tSsl!7Y a'8(l]Wwyq+ nZ˦Vm;"kӡ!_x +M)~e:gOw OIA89hX3*g)*´3%7}QpT`_ٲvs,t;sje%w[ 0K}ZnYTΣpdFc! jQ& ^!Euo39ӲTQB9뀼:RgW¥? YϏ["SGUUN7f4 #t}`(ki0CNiM-Rv0u~s9_(v7Wձ^SyQWE2(60- QLŃe3 *Y"RO3Kwͷ rJ{ι$Tq@HvE欶KkZ0M֨; V8e.۞*kX^K~G,2j@:IxNWw#9G5$ 5U/Vdej@vh)ȽRK/. m@xJ弴91 `1ӟ)0+ ˭]D.퟈?çf#L|mVק8 +VK6!gzHkKxaO͏a Oh_wI߉y'YJyWߏsolv#,5,b2^sSdѮq}v`U;*BMPy*[MrҡEO/W£us-d?wݔou$=bAod[f>kE;I}q(STU&=nxde5d+Ӏ88OcHdO\ֹ3o*k_lFH +AʱTWݭMfz_;G`6;>Oʆ{qUvbɪn`% ь+oݪMRT7{* A-34v_MMGtOGIigEwk{Q^oI.Ҳ-Nԃr  +73ʶŇRzvfIH,va*l(Bwr莵rjL~ǻxQpD2Y'.q&8ZhL-g]Q@rZӃܷTHgaOQ}ZG0ixѯ95]iR_ 6AR3'8?to7j0^k, +XZ<:<,5fqKd,HȜ}LcD "e'd2C-m'- ĞA@0lkz򫕂9'ʃ\?lEiCDxX:[@|G%nHZy3 +t?cMsH@$ͽ.tېѣe?XVIG!;])~xh" !<;%j%.Sܭz(&A9%ՅnS﫢)=AxqUSMbJ&O75^~L!֟fc +pE +r;JO[1d4OK}\>p r:++rw`p;=f_lP_]z^GEH?ZwU˻Xΰ܅nAV+}ӑuyrwW^ew sxY]xHm[r,|> ) +73tB +S"|VWz7ߟ#MI?DžՓF;ltQ-؈:>ð@(Ėm@zۥ b|  W6S%<+ur9ZxR*-=#mtR'ڐlX+uep͜SɭJlI/{F0c Qb^@$)`Ʋ8T-X{ܣ4GRFDP&V}8hE“5dܳn:&˼Db :>-(qmfqe&\׈e3=y'%4_"8 vdЙ!.B@ цjrA-~|EGUXΡ ]C9lj[űr1Kbu] ֖>3SKB'D)-H .nwbL%O(qbLry5f3F&"$VZcg '3,:+k 2_-=DkwuZy >nU|2tLW'eO߄|p@yS8܉ڈ IOieEx@|ėQ0#K@%Edo CIߏ(Z,5͂upwH7ygF\YH>ϊ!G.$:kFh +H:րUԂ@dDUf-/cmc吟>i cguXtX½S|Vn7H]%` # + Tn!5{Y;m ǕLORn;{.2TYνK9[F-7 0b?|d:{ê{uv~upb =+n<%zץJSB䣮άyϿ;9|b~2^;5kx'%ueT0Oi'\g7Z#V6hQ `*Ni'W_\VN3H)iЈz?̿2]`nCdC++! W~)Q ؾCYWH;j1PIC:"}<[tj$L5átq=v)M!Zc+a~6x $禉T0`%tY-4ONjBSVɻꢑلB2yuCA7\#>ܺbtRk]pJ_1+shU 3kny1q ;6lEE؂Ŏݛ2R +.I=P񱚵X쾢zІū<^оC 㬫wo#Ay(gLECx 2oY: 8"40VY׍!EUW]H]ݺLiQ[Hz7uy=m"A/ "^U8yY3"٤̷QwS(D1145Q#~wyN F~›n=%G"@~Zk_sR]5)mH+%hb?>Sۻ)^KjFtO52/em+qFz낞FX"\E|JK.w&^[C| OI 's +BC1' +On֠i*r eYD͈8~S4ZJgf;>$kL2 =yp +?̫c:[ϟfmTƠtOl,{nNDmugo(QQy۔yN `G } ?˼Ee͏)q j;MGG9ѦBC~< cءG3!ҡ|a9$j騐JuuJ9e+<GҜ_Vӵq~MAgAw)9a,@3>>r}ps\HB`E= 8RP+?TН:gM a,QoC'Gi(R̋~4Cߋoo%AK.qb6e:j Ԣ N8v"`ʹ҉rޒPuqkDmcA/ IGHX@@&A]-h\D1|{1ʄ[ScGh_x&VE%0kLW.d#6t%Gžk̈!w{B_; üݚp~ j2 !Diw'uAE ^J$jB >U(^ +}{{Xco0櫩Q, 3pqd*ؤ6ǺqD?}0^;Ȱ Q\ u#gtj ߒT'S!Sr@+u`zOֵOW<($L__ 7DVjlwNTIЏ0JJ)Y +t#f9SGc ], =kȀc*W 40k[2䳱Ъ2MWٗk|6:,mf>K!pxbiZn}Ms*̌QsqztX2[6Ĥvd5,`4~~]ĉ8s*bz6n=r +‹xMiosU3yj$p9lX :5VQGr}UXg8A&兕hMk@F*myMLOp<FfLRS~Sscgy?D\rׇ[ԯWh/FtgQ\}?:dgZOc??lo07җa )05ZU o̶,[Wx>b'{L!qtCizIej<+B1)U5"0j<ִrc7dJ5BPsyG;*eXLCK' X1؊-._許oLfNz*62"E}Ђ7( M I8"-D.DJ)13O<.&Ds+Cށ#Y-Z-\bq4&0'cW?9bS9Xǖ:{@EEF7GXz_gCI|PVﶊ/F.`@JBVvq_Zɍg"c,*}B+^.POE7VߏH0#TZSUr_" iLL$#qC"w3G.Zhe0V\jNs&12m|7:sT3^ A3qq H'(N;ZTL^DJu +' sL՛"huCy heyMh V[j(F~kcfEH4rN +tZ"Sdh5Kqv;'4Jҗp՗zoD}:kU)GM&6k#u16x *24R6eU1nIsY [g04{-% QFR7KƸ>=GoAZdl%#Oj!E< 8mM3XooB=5hrX꓉d2Nd@E`O)ZSMp'):&sʮW/;+r~"fuNȯi@F'NW|6lטo =jjiGW=DFU UmL.[,qEa1{5F> cFt +H[9y ( h:9x >*!6Xږc冴VDr_O1;}`c9L=pod7-u% Fm'VTfg:f-B{6KՖ(L&FhqnF*$:qt .ھK#aB4:jREBwg ^lkMjN-1ҋV_s-NK2|(E h8C) S, 4?MxO|NP!6A`D%{ߗ]¬`Ƹ ͸֦X"FDX#rAX*Qt mR +dtgPK$+CW0L>"z u? 9*XONl #llU  [bAIkB5`+0gӶ`P!PȆA֞]D3h65 *u9ZIy$F"}ڙ+P?  2MVV+AQk3D(SW&Θ6P&[d$d9sкsJd _9IToH D-2kgɃnZY[/ľ /cmc6^#f^ȫ|+|fcHta}`:,{ZۑjpwiWUrJ[~ +Z~OV^fBϙcG-u7]~.dg#3@NGF1h"J,q B}G.0"ā["ZP} +gN\hytYeZ1tFFO:*DF$>[vo?yȔh4-k)6 +[|P*K=VW9z !Bڷ>a򈎝rz=.U W4 hCGT kw0;ToC5S-Gٶ͞7ַ)!bˠzr & JX{y0c H1-MF͟ki R]Cs)i?9fTh%DjpPE/퀺qz:48UKws;wm <6)騄 *QF!@;ZrhTcl:]}0sDDn8 jlP@V 5#~q$Lh 0Ҁs5EsxSWO'g,&1 _ +k%^Fg񢒌|lo9-68/3_vpISpM,;k*kVOoc4DZd>K'QR +>761۽'DXdZ`]S{9l&\ D +|6 NoQ0')O|"ʣ& +kͮ^^p +8ݖ,q @~~}xU=Y}X)^$*b;'`)/FPUnb*74k0%%$ÃSDRL 20gTٽ-<}u ^/us7zDaFۏG|=S{#FmK9'+@((2;`v"5C3R/:d^GzsM8'Sv ?FUQ-GeşL]ʐ   2'Zj'vB.gEHuDhr,)<,Aa-.BH{IWoN3m2 T#UڬgB s/ .G< 0mdKh:@uF]|t鑐8880lh˳;WHo—-]+8!X,@1Ƨ{]"@BfBa'H,/-Q^7d8`+yӫH}y&[.GzOƝIjs,nCtm~C2w/#_iRw00-4r p=fR䉬 ~3{.3`(pɬ;aep&@&Zj.O;[ +4)ңcscDr{xA1qX.F|2bܘ'crkyǶAQ)*%ʷc 6jlYbj;Ojy<}0zmq|P# >R>"h)cwqBrP:W{xܓ EZCV=qDu=4apLV ҡy[3{E$HP\12s);j-S/7/\~3id@!^ɿ!2='pGGU-&Ho.  Q +ʃg=ݖmYշm# w +F(^vvUG\Y@I/?_ի<##(ۣ +Фmvx%# 8WΤh4`uMLME`jOBR^x/YB@$#`SϺ/`'H0=0a|u{4m!E8,m(Ya#wR&"±*D@.gݙ4kӀէxsT|ed{|/TCk^۞jOWU3k| +zc=!5BkpJd5%QGjb ɣH" Qj"4ob +wBxعj$rl18K0'A19aFc:"e'=eB!g3aň \5{~Wf U0fabnq^0B-&f {XRHw Tv$DI=LU|"p9j)#丨$_!o3Xٰ}W[ +E24 1iLʋ<3.ru;tf}} M4*5찇 _W*]M$oj of$RtT56H`"CZ2oVg&~nV07:A +'A4MXH7Af~|PZt)=TteaDǻccHN|B+28k .>XmF2 2(/q)ds *@K 3?u1 oޤϴrϜ6ti[%g~z(\=CB|n-J(c#oB0*Q+ C@ul`2G2%o#bhq,PI>VBå;Dw+h*p2{GI\\>/S0'r+DjN瓎R'>̹ $*gI'#F yB(.˘ַ6]G hmþ3쓈|B*krY]sZ 8sy`NgH8{`ZG{*QHD,Xa|&jCۚcc\M{WL4KF)Ɗ\hN~6*񫘈2ƍ/aNwAѶ`P"ߡ30|.3RXrbGKqi'!TniK'!TA-/ד;H^RgX_+Y(>eN6LOWIm )DyG!G=004n=>^YA S-6)SQ +b>'ѱ13v] r I3og(Y=fdc#zr ʃ۳h*P|TT  +႔NkcaWJ-1J3AaY-%fa3~vɎ} +BwI&oȓ*ϑS#;(YH!)mqW`j`,yI,&W:5FP7߽,OY._8aQmdXeR%pxbY\ +r&~ +h*_nG#@uR`h1_ "o5?](؈!m +b _ml6O9lڠKPm-*<zsϒF #Kmv䦔:t>AoյEUbղ[g{,q$7 YJ#;c1O +Alo$kٲ';)#&~x(:IhHY,yY&!+M`J3a + k$eZqcvtmy6ȸ+ x:u +]"yϜn6+*tL-(/)F_e3M?B@; (Ǜ⃶ WAjgԪ„rRs]7Ja:ǘ Q^ 0(.D˷tgmů<mf[o?n)305bC.3mUكΰo_mOV~@5Ԋn8,; lpH ß,ZLHY|qHf}f]"MGz***sdX{wRky1 ϳ>Ch٧Z+)pUWPK<%5#ECҋ <1oa~h> +@U,oՉ(~*(%EXj0CQGQ z--Ң,_EʮVkYP\Y3!D-O~tī,SU;~WgOblKO^)&:({g^gy[ut_^8Aq}*ְw4^1-L2q6+¤0H*~ Ð>'7zE_%su g)sBgcg!RAzt{)rJ’HQ0oz8Q[v8םO!g}ߙҞ6 +"CkmW:sOYq9D9Aڠ,wR>: YӍe":Զ&#llNE̷7[N6*/Nxbљݠ0@sW}5+ZXm1aHyqῡ(/YKv ]`i f^c'kp> 4WhمwT-iaWwokn 3#)൷tUj};1ֵr y)ʋe멓şZ=!O IGR B$2I,\4H#v#.rBB>;GNmVsßdMpS#eWUҶ8|>򴳾Ǵw9m@KM%)JNVa ht'ԐB783M&)QU;t<]g _ȃ5# +FL\\3 <>ܧ. DR6 61ExtIb^/s_ BhP;H|]0˨ +=J@Ŏaj6}j.*(07Iʸfzx)RB537B7d0c$S!Oϴ3v"n{Uȃw d|xSed+˟?BK +IQ-xf ]xB4cd@oyJi,C'oC( Cq¾Lpjŧzt_SzDfS [aB"d9($ S!㫮S(%vv`L @sg$ʿV +%k}0bLs>eݮ< }бo)EGfV(]ꃉ.YHLZi.Ma-X j<2{dYusTm\SP=vS.l{Cӽ>]11|Z@Ş[J{yFM0*ş,هs͌UnojM}㥼ZE50[+ۼ}GJjIGFJ eE;:v8ɒ댓)Nfij4ՍiZ%Q֦A~ffg|!@:s4.o[\bW %+S;e#>6ހNHu"{SK>K`X6/OuOQ~ƨ`%k>PN?\ ąbI y 0筗Q endstream endobj 3693 0 obj <> endobj 3694 0 obj <> endobj 3695 0 obj <> endobj 3696 0 obj <> endobj 3697 0 obj <> endobj 4882 0 obj <>stream +Hd͊zy8 +>sRhF^#y QG#Oç==o/ϧ;c_mӷKv|~_oo~y>}~W=|z>{O݇q~?>Ï?o+~ߒ~;%zΏx߽w;>lp?(O?{wٸ^ PZUuTGu^5P5FjFDMԤU PjVjUmFmک]uPuNNE]E5|| _#_k55|| _#_k55|| _#_k55|| _#_k5Z||-_+_kZ||-_+_kZ||-_+_kZ||-_+_ku:||_'_uu:||_'_uu:||_'_uu:||_'_uz||=_/_z||=_/_z||=_/_z||=_/_ || ߀o77 || ߀o77 || ߀o77 || ߀o77 KG#(~? +?G#(~? +?G#(~? +?G#(~? +?z $߄o77MM&|| $߄o77MM&|| $߄o77MM&|| $߄o77MM&||3,ߌo77f||3,ߌo77f||3,ߌo77f||3,ߌo77f|| "߂oȷ[--|| "߂oȷ[--|| "߂oȷ[--|| "߂oȷ[--||+*ߊoŷʷ[V||+*ߊoŷʷ[V||+*ߊoŷʷ[V||+*ߊoŷʷ[V|| &߆o÷ɷmm6|| &߆o÷ɷmm6|| &߆o÷ɷmm6|| &߆o÷ɷmm6|ۯ\t;]~~߅ww;]~~߅ww;]~~߅ww;]~~߅w߁w;;|C߁w;;|C߁w;;|C߁w;;|C߉w;;NN|'S߉w;;NN|'S߉w;;NN|'S߉w;;NN|'S ߅w]..|K ߅w]..|K ߅w]..|K ߅w]..|?|x>stream +HWIoFWdviv 7N"-Q6[)*}l!)/ +cm͘Vk3 IBU`!O[of_fw3'%ᱬZOiE=h_ ?V756M7_l~_i (3 _4Vіt#\z+>U #3I R}F`_ȡBY_N^ƦDTcDKVaLB'bGGp:؈5^RU0 lR3)l0|:B.Upy|[\q]6r[GtMp(DSt\,E<=8ӀaΪ}T,wus Ŕ{ۃ"y|Ia)D!НZOX2j1MjXvSJ0oX'95-{Ps8W;xY`.Ctćz"5kX"24- w!0f P>1^4 v W~txbif‡ T~[n!ts/O&?Dt6J)NnG둰c@ah +wmeх|H 2 (mbvO0INh7.QoH='&LM&Pή4{ns#L&kk`&E=IWOD:̜dѷŰ0"f6m~WwC vmU3H{i`Q{XI/ö5>5I3yZW +9z"gqdEPfUFGR]}y2yv)OT&-p2L?&\I1fi(3'`blfi1Oq/(.^,gE<#cP]"3 +fAϧ,"aO-6F:Qm- +L0 +P`j1Rz*̀kug]IU:`cԱ2ǍkH Q;~`vb Vxln.1{]wmӀabPrԄX\Q +G7Z +%=^6mwrIkF&JZ5c @ +My!C& B[KNWH\e!jsl:]@`` endstream endobj 3691 0 obj <>stream +0 D@&20 DQ+ 2㙊:95sJq\Q~ˀ<>( 򽒭Hg4 HEDrobD#.WC35H0jIpb?G,S^vjk~(I`f`Z?Obɉoa%—,RUc6R-FBx~>k0:"OSԧ2x]UKFO&}ao [s%$<ҳ=$=35K- A"ZGW* 2Y˸{AbK|sy^Y_k!)L?C_j%-.2c%)]+B:V6+elj_6^,G˦D8 ݎF̂(f X5)G}h2b$6P(2*f\Gc{9yՂ٪!*JeXQydr^,NeWY{*`w[; ?rsq$vS].uW(:"ɹ䢀}NxS?܌vqr#1( h_q UL9Vß>}9n.Rɕ+Ԩ9/FTn,t.R#4$//{1cߧ0/~_3 +u5KQAzU9paP#^d#H' JP~Hzb``f*o8Vfa񖫯ńw/.+ 7IJ.u0!J9Vӑ`V⼾~`*cns$}oRU 2 + ?GoD~@6zGŔߎwvfZJW3 A_ܪgi;&ؒ TLWD&)RX1SSX)z!W}?_;,WV\ť;0|y<kVO{B7z|+fg5$>j`iB^ӫP8NN+vDgexϙ;#Q[( 6ׅ%;< +lc6a#=,)#cYbi- p%UD[ }if~A 5Ez:0)_}Wͣ +IP)D(+tj\߼XsUl|@6|fᘪH-5h]M{Xd` PWw`u_^ORyre,7d7Bk(=6Fv18x(d)2B<WtޙuxR\$%@+B HTFR󙨬/mO7ñ*_e4b#~SC&"Nɐ*;R';]Hq.yN6sZ## (c- M<;-K4*}%g KQCNrCǼfJ,.3SlXP5& v=w7Ej3<!OHZTdn#-G'mD9kqk'&D *{r19iUqO +((i_T=fJ <qbLtKge葢OW1S rrs6fS[#'J4%h" #b2Eh_JbED#.iֶNE|P+W $>`VF[Lc?_'95` n+A`I*=cvq% }\4c/"c<dE-[=swXPlߢEh2t*A.FP>"xئz/m)#(:oP,|s#b1s>u>#ƔQPHϱ4"4 p_"o{d[XD64"#~Nj5қS])O8CR"f\2}`JopVؚH;]yQ=8O%R8(J9g%a{Bd`Ȓ88RK OmpӤ9~:*>#9=(XXo)vQqߖ`o:ኧKan%|'Ҟ2y_gRnwc՟,_cTw*az%r LeC$4d^! pjO0g]_W3g2,1ڈ|1 Q\Uћ^ i8O/$!WP0͔bW3+ phBUQ:v b`ԝDvMFe?tK><:;1ɞ_F*; +o.'66xbW]ͮ _Kxb &y X.ԣИTq)- 6/s跭]'&n1ofk֒u0*d + n`?e0Vȩ.s6$9T7sR:L/A@lfBG +o,Axs\]gmeqO I 6s\ ֯Ý[-Z#vq塟)~`R}fwE"auL&@a+c:W`1DU7sɮEڃ|x"cO7<$F_JpQa{X( TKI-*|j~AY&nú΄ח@eV~- r!nHhh-ĮW"e^7!n^)M2ʃ/ּO#0qjqܨh42FiA_Ewu\kU +Y|xlc3N{S7oAv ݣUDbxsh55E:|a;L9n/LJy:L)" q՚3WkE>W] @OҷF,6ye5sc,ً>'F< ևEt~xc !f0''8""}[BdÂ\JYx=L*oz=9k;yg H .=Z^' }K"VdzYađ؄e/ۃ,ew\^݂vn~E; tmG=h?r8Ռ%ڢդ!vKڤOhE-Uj53L' Q#?uدV70v{@R:K\cҟ؀Wj}#L x7ڝ!>I 6N{|",C@&R""S :w:fFDg@&V\ yAfzPv&3D0K$hpPY7( +Ɇ` {rG1 ݮ3Y(KKowi\SUk)FBqnU@kep36nL"M@fm4'fϿ;[ +TDhipj9=$lЧ׏٪mYz +*ٲy*.@j$p1yɅ"̬4Ācs iZ]x:,͙^~xaNV}Hq~.d<-S7I!R60Rfq2fʜFT,H.&&(ߥ6^9h~ |p5+4.YRld|j[3hBhB]8k(zcHQQEOԝl u 3hq~S|H'K6^ hp)sĜ$$<2Qm*o2g`w]85mS zy h&Hsq!o[\ޔ'mx8B췈ŀ!J/ѕنV$ ̜cmN=zyt|@$Ql:Bb$~xZ 7qkT~س?zED)ge&_ P<@V,1ǬX;?ʏwAu(tWP ;\Y}ZbȊ_Rx0 iww2>IFZjMlMHV>kxM :6[x\BbrTP YT7K\>e:IX1rO,*~WhCeR8`EV׹jd5t9O]u5!\aƉdzjһP/%Q ͒j#\{tmU!.[u?~Ԓ>S FGSk<\l҄<~lRsjs 4ɶMR|' \qaPH)O0鉒L*| ko$uj1n .OsUU*WEhLvőyfl,Jj*ɕWç`Dez觰 taadJZW0Lԓ*zh9~84 GfCV1:_E4tSg\Lȵ*4 tէϻw_jjO𭚦CD(Q q6Iu"aNNL3F=ي@( ~W&P푪`sP0TֳѸ* k@ƺVtQ9Y- TuwƂuaXF<;Q=SE;Wg{FyQ+fLK\3E +!hz**ŢzGI2LRR/9v^^u*lbݻv71ƻ{)x%L"UeyӹiEO5ٹ.]dݪo*#q`McxE~T@EW|7G!q0*\M +ԭxAB_CĀ҃QܦEFXiPeyPջ[)Qq=oYJ*3D<*P@?rU@{<ߌf2N5y4h}8믒ܬDfh`-<b hYO!jݗPĵJj .;"d@640"X]!}6لOWU- ]u|fﳸ^(nGG"];Gd؜&ED#t~_+4ʼnMaoyK=-6^J3;+~GuXS] ϗÎh*],Ϻ)2'UU }U;dЪ 8ԝ^eYr7ץ Cl?[2BlЩvemtk>dxÇ8I*-OkX[|.7o_^d}*sU̚)нw'Ug}Nnw1fE*hM2OuToG 7Bw K!Î̕aavIl;c,ܐ&70(bBa{1ƔWֽ;`&S1EoKsZتX(te_n +e; TC.An.-RaQ4K +I&7 o$s헥}pTʉi+KJopMɥHOj+: Ѷ!k$= /8+ntV!Oo(fzf]v]d=wUѸu&xӇcP+\QNqHt R]Ak:Qk1 4Uu=Y.+ ʌ~}ҍrzިҨU.i0Ҭ)çjxOxxK6s +q$TB>ՇWpÉAԃቩ6a,S> +K+pGkŹ'K_GMOĩ^Rf_>y=0%qD~%=#3MO}cWs9 jAm&`{ZxmojsްX'̗Ͼm"# \'PTEAHqځf}孑I::M uŊ;\]w͋h^mNac=<^~m1_p5>Gš#f562q{0M,*f &?h(OĦ!(w' +x,pY#.v+xl5]+Ke[Xb$wкxlʉg-~>i{ fw5W*C*-`YfLٻt-I޺ D\˥KLϷ&1U*f\@#2znVjRsy z%S?γu|$w 'ڋiU=Q"/+nDil?9nNw&̈-c;( X~Rab9>ifM .7$`R(9vfqo1eWױ|$eIL{kCB.,ܸ9~:TWLnJk:6xi7'*2(ŇpɥG$ -c*yMm|}r^f$7qp)d:d2d艭]`D [N1/H +!\+<N\J| /-6M@nw~d^9%Gbsm_6'bU]?Zlv>p10\Malm")#)SNr=q,pےښ +3؅8#I@q`PߞLtȡ ~t9*.oj 68| r"O7Ą܊࢟Pp0a{v'77'n}( +QW֢EMF9VP$* )!I[I՟DNDңQLd|TA_u~9>=}|xbgCBR("rDb<ĝq[i&LzwڛSxISz݄Fq8 +TF҇ՙ]GpTL"j(kգsN]0*_ ۔Iъ/Y, $R1:v $DS M_WLy 6ER9a NJB^[ !HZ)ɳ"DZ-zU9_3B3c!Š}yu'tfݞȘhUQaD#Z.ŏoZЀ'աGo"ψk(‚~Ҿu0 KKJJ'Tf\qq4Ji"l23X F.IC+~ +fmUD&7*Hb15eFwZ,nV(qnF?{@n푉Df*n1@!29˩D[F12ƐCR2IU,g[c(@)?[̪)HG]NJ^~{J\4a Ad6X G40 ۡ$%C r ם9ڟG619P0YV',Z"M+dbJOD\ ܗ+I<_]EMMǫc\:\C (X. P Vbl=).3^O_;b\ex 0Aqvik2&EҚ5Ik[KITϲ*,]R>YgTHe 0sZ ?lpXفQD3\/>t)j:vEt?Fz}>NM f7Y:̋vo| ]B,NnrtE-"߹ N)CMGK"2)ڣ]oJTQ:s ^š,lH4x=X8w;\K[\v:WaS4i1 7HR+R~?i 7A <'Pg +ۈhZoۖw$B'K\͞%&wz_rJRwZτcXzgԈK7Bx[E7(m+quO&Gx߀V͙a\r,4Sht4tKE@612hN(iDn!ٌRLiw`а@=e)u# # 0KYFDGh +^ˊٵ:k + +{RKdK5/01%+_BS_/63 sMk[:" "_ ;mfeIv52ݡ:bL:f],bqk-; ),MqOB!99h\a-d؀I$"4M€P~ `os5uwOpmҠIѹM3 o.,8G>1> endobj 3687 0 obj <> endobj 3688 0 obj <> endobj 3689 0 obj <> endobj 3690 0 obj <> endobj 3679 0 obj <>stream +HWnF}W[,`"z Fp'گ{=&dUN3a z$ s~W~p𢡊Wnln0D7IR"&6B`D涿zi蟺];nv߫o]S7Ӱ?!e|9"za?7#HDqeC +oan}z6pARfng!̰!!s2׾ϯ~y/%!c9s3%2C☋r`r +ۡ[smciJšn\~~#8| -!'LLC˧vN1wU@/4O_%Ƙ3xbW +n`uy!جOBd|?*H}}/l/4ޭ(!D= ɰ̕W#@j F?}2p(RrW~ 8̨Of%nsB4;"Pҳ> +v `Gʭ?nsG&(S5 0ݴ=LQb- [>!ՄmLmq2B(zc{@#Xʩ[y\ӦIpMt*2<"eCju_%jP?j ˔ gH0t"^ĩT54%sg$2-ɘ>#ū8eA)*F08sl;uU5yS0<2h58iH"Ȼ9ǫ ?B vAPVa<5E8+V-lr˳ "N3'L;H'*jզN!09m'j8i"H :b2KZTҍA&eTL]Ļi,_a2ws;H.B\e nD[I7m?:3ڽnk!sE +1ujkBɪ_0a_2HIB!13l8~ZDw ttNoM'P&I"&vC.㑩n5m&U \{2G^Db312;.gj{Boz={*2d͑X+9i<Y*ui2WiXN'x[VÊF0F eoG:wM߶ h]Dlͼ૸((wk)wlS9@\~S +O<x$+M_H"ig$ekp9a &S3mN%^ 4vT$FfܲV ƳPI2Wa7wאLĵc*h[7_ɅpM Rؔ|Ij]Ͷ{5p]S=tL ٙS化G9"ȇi2\N3xV:n0ƜyM6cׄEp'd.J>U5ʼY8== U ٨4@6I(R)"$@"W79 NİXBBg?%I:09$ZQL|e.p*s M;"@A<*QFS.*Ѫ WF|lN^r ;%HW0,F1PkPX{b pNKodN_[OT @#GcWZT?<+s!>C0yhAg9d7o`/=m^w9OC"O9܃vA*ʟAty׻/XWz`b/MGd#pxsJS/⢕s/E(\"6&BӞr8.j8t?p.]NUPM ?/y~5~)z0*8c6?mprX#qu0mϖ!q:oT:qW40^BoœT'PT^)R=EM̯XD^Cpd3za[n$AL+ Z:o1]КjbP%Z+/1a GF*DEL .1,wF)dfU[ ^׶WXELxð Iw +N ZN6rڐ0s/ nr0WJѡb+heѕ}Yyln N0&fym Eq^E]JrV LP[z?O~>ɚy_$D(%`eϗtېKƅ4!dY Y8 +{0Z}ֻ!~Y8-xZ?VIr#Tb0ĬN) '6o@B-y%*(b@[퍒 <<-~rt"r̢5\VQ+Vb|[@)9[fCY@ @޽a@H|ωok a."j)6 +6(Y@[H4qXqm]PDG$;O)HJйnCmf=Jߺ,d*gM7L:.vk 8Rr@ ;f\/\\j q+BT~9T|T?0f}O\C 2U %w!r%%H4 >stream +0 @@&w @ղK~a ߪr8?FAsk4U@D9} ə -X"Q&Jx-^40:rЮDm ] {͗~fWϵ VM>4?g XUrGQ&<1ېDLUMLjnrgm5FG721[Fon'IReԴVTSޯiڶCRZ0;e}QE9hdF,KZp<{|-)%Mr)\d{5sH"*eByMLs|\1Kx0OYh +!V*aEodEYUSz3HS +5r2g?jzAaP-Pz7XViMs Nx'ûG1rwN]=&"=^t:_)fV +&%=x!/.Šk2i]nU{<KզexuK~cIT(1U;\eˠ)Z^p~Uj9hu/hHCtn^?*9V{΢`i<^}!C5[IUu`gƶ=t)@h̃s|5q6#NF r"-AE +rcsuɪ|#6G:C#}H K'ƴ=2)`L~I!洨_0V-"n+Um~fDKY_K(ŌIsXJ-JeŃiZUwB,\=U=̚T"Ów6Qy^]9f#,WlV#( #e DN4w);6RuyY 3ʥf(_JO%ڟ&m|xh;xydÎE!Nl,!o ^VhJw:" +m_r.2r3t4]8 v{4cdsyMvhpk*KO +'~ \]ڽ˸>/Tk2eþ3gUʮLp_{j U30P)z5zZu_8T yQ.E,Hl .Rr2S-6V٩&R!8%iFEq-SMS>iu FjNGJ#<8my[[e ,҉TTR݊Ǫ#\{^p98~g&^Fe%/=iߩ/LQB{[1*|ur\׾>d +PEEޟ6LR+fТ6~ʦ uVe=ǁRW̙݊Q fGʚŎg lt|H?,#g7o#υqFO!$лޏb?j#\7OEŊt)Y  fEckI_g"]3X2`fha󌗍msgym@lwsnVr9̧=Wi,;ݰ̂dHe"$MεA)1%"Z5F Ո͌` +I +~GWR`@v10:; #y3l!&odѡO\.b_jzhST*S 'HT%,R?/^]Z(=96m~ɽUTzwluj<@2UL0sNcaOK2Y꽺u0 ni1N$ +⁨ao-`Y$A' lիf\ڄ2y(>of "am+/o&:^a8gk3h[5Ӽr@"CV>2;s#F3+J۽~'򅝶JH<]SU^Z17+i('u:E%5a knǸ-y>\twA0VA1I1ok8MSDD|u%؉' iaO &JIN_om-FWX,:o x2ʤ( )[WcY;(V[RULcv:R0k*Lu«G@S~fo~u!=< N&(=>_HAMdz*I+r*ңyBMN(o[wrQUyS9m;?"cl7-NT?#q)bfJ|LW˞^pJ"j6Y2ڿ3icm)LV^-/\h n~g107o؀wd Q밥&}Kbf%%M7%Yع}su7iRawբ>J~.(Cه='7aa୧SRBr~8.(-nJocl靪6@ yD]Gb2$߃:$(KҢ BSVt֜/ʆI_4#<҄f.J <#MiyPLky.}Ufa:tE{F|p.ٟ|c^)p:wTJQ,^4Ě>;ї6Zbg2GR8t==N=bwԜ$@tfiRAD/Q{su:_%? rR *{-.2oA[T?>@S)_ :2bQ+R=1f R4l;/V12@j" ʄ!wf +e]"{qiT=ajOm?=r)mB/&,*2hRT\!\?A7pQ^^/]*rYx +yUq{km/U,jk*lt}ŝT&5UXA=M7Z#4 y !v K4|ԗ-2T +}n8@}ϼEȿx7(N1 e{_0Ǣ>^¦ĘY%Js߾̝Q;=VPdܞ\wO<8CidNb)_R-DAD4bM>jڮpk:l@\p/?LO R]{K>կ9&ŝ %VziRXF*6!1})(i*uCtUK3 +<~7:Ϭ2HKNT"w]%q~šgs,{جǃ2E2*6ɫ!@LH6Cx2"ʉᵵ*#Femhh &C(kJoP!`PX|9jG?vtT7W3ءUs@ŏ#wY&'ŞEU3 p7.Y.ݸiRqֱ˹@kr +-6dx(88⑑26(n|]ेCHijNxXbWp]b(27L+&!Q0sRebޛYWtt}Y4e``GdMܭg=ƮX|cJfU=YnV«]k@aZVVMiPjqnRPQ;3t K $P) 9#K(~#YfR }(iFhN-+xntLse`4_Fv _uO+bCcxNa7>3E I;c2(Ml"&,1q H6rAƊ>:xqȼ' `y%{ rnEOWc1 `Ye'ͻyGS B7" sCXePj;UZ;eusQƗx>_U]R`?bzbiɒdE3AsV?trMmˍsϑtΧN7"wӹ49HEf*L4c3G.U(\` t ̾6RFhXJ" 3cC=*|ìͶ$!{9[U(X\~º.̅?&s4Z ,DW.ˤ0Cdw<@Kp1겳bvraaAi=dZ!4(Y +(Ğ|}݅Z1_{W(>u`^9_:11nFTȬq44r>c>MG1yjrt!=e7WF}Q Q=whd7da +\ɚGr[|(v!95j +G8^%_[zPs2'\ QMJE÷EwKluwh"qS?;?N:CCOa*Dx Ro;f?m'/'*+e_5 iu}rĢ#sǏ ;/I{`Cpw) sQ(Ȅj<&/wI:!C\,_f4Q/l3HZ,h+a;I̽|ԡG9twkvCGD~Y*zk +:gSOPC"x0\VS5ߝ9 dRBFJ/85jw*!bI I>iG +00\_Uob\+XDFa|uc!XX;c͑x鎸:!DV&kSљX'"-~;sj`6ݺ^@ g b0h)o9aLVߘ]Đّ>>_qZ=>dz#EQqH~E2AC1?,s`cJ^1c͒fU ?rq(ay3JqeM۹%ׯ3͊ꦸb_~F7oBrVEFvn Zd4L{D:@bGN(a Y.RosUlzKևe7B]Go-vxR)=:."TAEͅG%C;ZR{f EgЯ4ܕIFr"@,쟄O 7.GpNnBN!BTǃnzelP=3oReR6cV?>l(v Ȫ|?J5P`d?Ui2R⢹y 'D;G\;(g8Ҭ]XcP70LLi_ZkKhSǥ`Ok"=0_-..IH!3W"=u'M@,UQ ua:l递ǰH7h[^lqe߇[Sl~XXn +}KP+--5܌B:#9y7Ѧf-H(|%MwκQr@֘@+1_3_т<Ѳ{C^.M%NK{%2܄T\Dci^{+̡:KnSF1q(^yC9]`A +Y\HIlV#DyQ䒲e{q)B8cGpQ%I +…K2&4oOYsDIt+Ӈ%`5[%A?1(ȍ*\%{B6."MX2e͏G7e4AsYmUj8 Ks|'xߣ4bkOMUP#RҕL &{IɷxCOC7/D $1Vt3)˔qsm( ܃+䆷֟- w)_[*5-S!Pyڵ_M~a*~Vu:YH]>(~7>2xǓ?j̀P- +=mt*PU\cYw蔕7+7ÃJk-Ϗw% +uU3[I'giYgv(Q&K(҇VHTlkXяv~X}e%¬iIa +}[ Wl}ⲹu$҃:)A^mT>x o$-9CrDX~~V9v7Q;^hh-ٽGI{T]^I+ -l 3N~ uax0[%c1+^OMv/|+Gֹ[d%'/^s4^Aӥ 浪&\>% --B0)AzHHdR!Q 87]OHCܖTlW[vPպ`s=ڢPbiZ|)1 +2GA3v OAƼ-% J$\Ve9 +7&>@(4[?nq~3Ч>&% ssQ-pM.niǯYi +V~eDeČ3<+$rl/ek_Ї;9;ċE3:3z{]#oDqH$W=A芫݀& @%d~Vy۬DrRX4< %| /D ["9K~4$5.íTvM-ec,Cc$Kphx/,l)t~i` [8yX}'tm!79Gv +yơĀ^:]+m0SDߌ/J.ҙ}Zm=իoLsY3N7mrA(@n|$zE2 +JsJŇc +@AL3R̽ z?^(vH+;jCݿ +/$pgeHBk˄D mB}IuL/,Ó{} rBش:!!cI)1<Z5DFGlʞFN_-_Z4$nu *p3>C=7P؄^oc&tHf#d?BW0[(F~UOeQR%|1mꈁ-0!(M;8}h`r5 w~N8mÖ V5i7RGI}ً3ް# :sREL| q_?&od&!g-InMIgd_IGpjh2G9xIR1;`۫!o[$ڧASk<*'`1}eeMl?<0ԁ+6+#ΉG^LC+ߤg;'f4у;^b{#<δ&~o@`YvbltH51m+ q^W{C1IigŮF6Fps hcez]'UӄI$ywHKp6ID(1 78ZGl%|ٿ޽deeVB86~Ϡxhw b#;oCmE#OekGI<,L"$*fTP*ژ(}Q5 \֩c,p-b`QA~Cx7O5 Sobjz̰kkv^Bk^I~߷[5/Zǵ4_uZURaϷ}U 'p'NҠ5&GR +ԐgpW`=A N M|Ags5m"1*#{u6c@gW.,ٽ..L[Z0Heˉ$dW11% CyA|} eJ:.6RhNj$:K;,Lk|lFEr?\OhJ){7#~ZTd-0)Dk/!c}F]j heiPPnXWE?hpfS1? ͻVi@%'K13>e'Ԣ,Wf>|x& OOR+űJ͠6߶+YQ-;b0!># Iz 5aÂt'E@ol +j|Ju:x|m:B%59-$c 8$`D:Ea :Yy_Q^T1 wGC[{e+d7 |3y]B=zdXoR>>BRuZ6n/ l50*TZ`]4~z+L[rL/ʛnծOM9jhʓ:d +ÉZjUIf0mQ@9Pz0DXq0Q4*Umx^idF4M͎C#EZBl̞h! ̟n?\i#ӚJQ=\ ǎە8jQ@Lv&*7B=S +xky.:tjSG#VEJ'/$_^IThmףN$ARӅNUQF/ca2WIԏ}}Jy՟dNԮj&Wĉ@[< ~W0_98_fj^§ +FzLBiϳ9a2 2=|-OAԔblWӴҹUro-qYQVD1@&q[H{cGV٫X~+iMSI-Ӊ ,.šbw4v j`Pnҽ<&=ـ +>jk8 e:t(Ňn\z0.jf [5&hj=j4G8V2b2pxOan8 + 9C%dC <3I Zn'u+CJ!&P}J"%. ChC??`R12Dj(}| tna_YEEwNMYɘQK"r2[|9 w'[h=7P.aœ֊AtW<꽥 \G·q~fČ[7|Oe]"!W@ 6cd㊨2;ǚLf .ć.;"e^Qeg~Y\q);Pe7SED^QCXgjߪ+|+K|o(L + ) SyĆ# +fK#nnPbTKyR *$XqEeγG@5_ Ino"7vOyyl蕋?65$U[MN'.LEzqUT,Jnհ0u}PEqbׁ`=U?w#6@/OAoSqxtj?!{wbAhQSVyB<7iȾ2/`[8(˷Y!ee E2jW"b㮕lˮPjkLJUAQpۗp$bj'qaPCTO3krU/;z '18l;XQi6V> ¢2Ǥ)ONLT)ELY`SM1((ls m9R-s|[|tS06ELK:Yɣ;r~Mo*h;SC8+Ẅ:Ҝzv @ C0kU"жGC  `A],\q +.7N鵔9i.' +>twdC,o<$ps > IR.Yp/m]h 1b)8E>ҁpFvʗ%$JW,G4ON >wXxw"1d3=D*Ric)#➶]Ɩ8oٗAf뙢$[veeE-5Q~f"7ߛ3M) TPWhWZW6]z; ЅW>:}Ɛ҂ ( + f\Ҿ;uJW=1[S;L:)䍧wٍ S`$?TgYjvjлmK1F%bMY੺fU |f(HGl޷feC쿅&8p y+EȗDPf:4Wf~MgNFs-״[.T jn+|9. }½^zy"j &=ΚL .EbVl|^Ѯ㳅!:0(%9; 6D :T<;`ԂQ)i`XmqaնVeH~@h$x((ܽ]U8 :s1ʢ#q\Z&}Bt.Z)vXk $ޘ-?,|< n&^zO}ixCRzu'x>sdmQ>m9E/VwglnGh)i̎n?GTq9_-Pq! +k {ا zRF%hQ<-Eɧ ش{( +~rٔŦU̽ٶ4A +3<}E=r8jR xy㩆 +]˄km9 g,S&}=7ʣhS[Em it'7N C*Fۏ4Ipqyn鯪{jP|77D+!SP'T#[8GpwK\S~.>ݽ#סJ"i~X7E#ĪΘ왍IӏбEb&꾠YF !D0''HŎԘ&x +Ig=ue|)9N8&)|g 5F; 0<^5/\H]1'j(GP +zw!V+4S _Q24ȸ:5~$NfS@{ꜱ~jHO%YƐuk{lE?&jYg^IxlIw|/T]36jѵ'>@Aku^ *w8ه܏#"nIyԷO` +XBOۑ:+qtn~@s֨'&u"{C3 H̅d Yκc֦}OU諌dҨ\7Ac[+L fYy ۉ`V=@9Q YnK/S&ج+BQzu0D鷽.ݿ +3Ԯ`j^nq2 $y^cH6UsW؉YP<DZY_|K*-L5"n ]y{GUu"%jgIΏ*<};Ѕi* +u O$nW%>i6:wӨu7oi+Dͧ_ gMȊ{.];z> ET8k``1ښ3q؃UUvi 3eTu$OZ۽Lv&ّU.h/6#b:V[`jei.gE=vD]/-Gnc1{GWHмweJ?CGaږ /zTNRByMVE$O$=J+0-Z;7ͯF2Ojf>w)r'J5 rQd7rZ3U-cExjRpMz`B$J"+ \=DwM$U/IF'o{*\*5'teֿ)=yWgS-T*Z 1Td@u=K+[jrSi!Vs 8n+?Uec:|sm)\4K(3ݮ\#W" s㌿O|Ov'Èxq3][6wRg~~!| 8ǫPw)k?H'Ko'ObxqNomla#7EO$} Eo3ŀK4)ߜu\H@;H4QDVrYB%p@6L@ɋjhajƍBm" {y*| I$?Q4d7o=ٷȯ *0DcIWH3/5xH^j~z0/ wY^= koY0`I/m'ʮy!g)4:8SG?X?Wf(N17Maa;D0ʐd* ;(4ο{viG~z?{]/t{ #9ǀSmECzoڨ&7^Xi84^<C6m"&jmm5MY;3} }ڋ!C &ѣQT6{Lc:ibu=|٩(n=icljiO6z"]_5]xfMۢ'\gE8QX 6C(#X`n߸Ɨ*!lo'Jx`kǵ/ߚ*l ,CB:0}}}K:յ˔Z2_g'@!j=zk* gOL7 5b O  !c6?);\#<D}J14pn0ogr_oy̠L:Q n'jxyŕ0Z 8f߁P:#% +,?{ y>AhZNR3 Cv߻0Qz44t,ДGN):?{=! |Y5eFh>-RXl IvItCxYl#+۔taIOpr9ހg:e#B/"7a7 7VNyff\Jp"1O1lģLέv;䰇$Nqh7 )H>mаwz Qr2k uutp{9&{rGIkk03jm\C/vgsF;@ӗ/, oցq?g. cb˗ t"HFnsmGo+h,yq9J-Ku' m#!v(Z*8|{i6FA moUjmX 9ZֈW=fpGm{ { q7 R P7[GClpÜ)Fm8hBfn! l3xGl{Пh޷~H_qXf |5?:e>/"pRt7#5 ,#RƝ)`r`]Jա# +\4eqau'AqG_3A.wJ,Wo= H]C {Xr4v?]^}ͱu1l׭2rtՃXj0ˮVRgD^O} +8>b q02jX!QH>EX\g,_B-&Yί;R扂hP~2^ +FV8*5e[`m?n3e@ؼx(f(io^WdSr"_ANS8UUᗹkU]%  hkq5d.b.5d]07m*)[黈C6j7X.R::1h61춞XWQ{9Ӷ~ƚ8#,L~|PIO08ߘl{q|tq0zXH|\do\M}P(ɲEHVr-0 lX^|#>[>*ހ9\ۼ ιB#j9)yHy!3ԇiI~tzb(% |Q +F)PKbSPŠNQ:f5Fa=&ų5kqh8fV,k@V6FA`98k-)2 A3ڌ΁}P_B *P +Cf +熝p qHHT%]EqP9=n-A4u7ՈBDqO2m[:a3|UTB's ãMv޶!з'\Jw;EoM-mQRSW )6՞|n\ (Dt"arMg.]??ʗKVü{C]ɥG5,mSm@~i-XG /]OWy*2ww{FSҤv{b鏿k1a{Ihc3)l([J6g%|ᄬ0& +`'1Θ:f쁾>K_M$J=|70`n%Ek*T%Hz4xգ+b=P./1x;?m`qB/^Q,%qO,'l[:J{&p ɣS=v/y"pqa#np{z#ލ0Ix854Ռ{L.D)Zvڙ_r B~=h%_q.lftIoЊ˽dkjuJRVO`O qw%BxTۂlx=A;-qLU` +?p/ Fy@x'dB`9nWŐ$\T+AWDUUZA!k'5[nMb~22\2:ė9Cq4TǛF\zN,7YH (*ʟKR"YnUܔR:%5@e#r6SK<G Q޴9k> Dtx-}s/eՅ-tL}ŖJ,h7Խ0F?L˞2Yn҅8.U5辌ra +K#bhJȐ?.{vϋDZ=,C(KO-t NɌ`f +.9w-o,7֍VNZ8Sȣ9px4s+V>/$d"v:2RrY{М=zwluJy7&Z ~4xڒdHU=`8$ 0tx*| ֝"󯪼L0Zq +7ԇŇPc 4{X8DW+cĒXhMQ;v$=d.7e"r1o  0˺I3Ia,޶?F?xGmN͓f?8} +y&P讐j+i#Bw7T2p'A_&YJv=:Huz2ԪjHX'4'0UgKaf#'XV@ȃM-&@Rb.kmYa̧a.tOF!gU@HLcAPd)D^vǞsv%ؕ_UkQ$Q0h)S&U hYQg*Э,Ÿ"bGqetx{vy9jL9N*7*ϤwOe=q݈K/tΩW?%K{dL8i 0YXvN3ꊺ,uKy3,wK#\bc0Ċdۄ#ʟG4„v0.Ae=uIp(?ϵU[O +7͔c̫m$|D +a#e ~»AB3TAgGg7^vwcsu'̭X'sܡuh z튑?9W^6踛C(X k˖DbE%O]*:HjH7֋ ēI(V Θoc3}b + -Yv9μXyq̜V:3LT%^㋩( O%7IO{O.̸:)#wܺ q[$gem|jQ0FA89Q4ko` (Ҡj0^>;\f/sjL ɋKd=h(@?bWSA2WX:YE.G8~4XJ?6Lto1OPdPͯ*uKq޿u2>XjPϨͻ|_]w"ňԍv-9ϺTe @;NN 5F ߋ҄]E,+n` TA~+V-DqюVn@6PEQ&\k{K?եƵ +لVRdKL֖ի="% [ X^W~J9;Dޢ2Ə"t[_`R7}|5iDD~``Sbr&D|"X 9q(&ȗg:Jۅ^"fN"9HFx+| +=D_05 6sd0+VW@ls|]qb_u]>kͥnWIAzmKgej[[sԐBnuwkEӣ&(c-_ld֘stquR3OF) +YwV0O 2V֊#)AQ'<{ؔdzy Zh+Jύy ܺ/Vh%˼K<tOR) jfK mMg)d66#K +bx-ɼX;]XԵ¶Gޕ;qWbٮ'rf\7P.#;`} # jLg9>+;EM/}{5]QuEo ]QC'3յ,,lSC3f}EuD8rS& ?Ca9(`MoӴ\_Ѫ!pN+}eئbO VSb*p3;1dhƆm?g@;ve8+ݣADA}XA0f B&3u/tqS7^ ζl +CpDPܜ:хs )OnV/W^>Bf]|ʾ==hb~V,mA5ͽtim`$I`ڴTc@|B)¤2[m;LL%jRT ,c +nKqWbÃ҅ب9u}^GCF>P,keio?VFCtGvS8MA6F"ɪNpOUޖ܌^KN bx'wɕ 3iof=ېH_<'4}~枇OاFPl9H82r'.2,B@BDg"&V:ݧ|] {cJ=_{Z$n!HWыPW=~Lзd<=xH]T JJJ|e_xCߟHdw|@KSӜG04>ܓռ]?m3,ǽlG "f&QLy"Ps<,%ʺNC-V#C[WI(_I`qŜ件ՀUdP|? 'R֫ +VUxZ\l%lΙ˷<ʲM/\`HvuuSr +=j]O)IswU0H6͔PȬn_H S+2%]5NTdϋ?YXi3ehAH3Fy:bAr \BJd> GBkMlűCIMePU hOH_^gD0QNAp+1fﶍ>pwb +(\m+gg{* }? , +aA/?cF:8q~$wR Ӂ69fTꇴyJUx.n)9*?NZKKoi="+TLh•iM +x7tBm(!BPn8MݞQ8 H|+#OhOgsIBl$7D-NK(BȎ\zɃ_O ݽ:f#t&|P>V[W%l^^C&LR3!,8 ѝ'~Qo=7z<n4#`w5M M.>, +SQsly[ M +*&83M_(MTr Gv};FQZto'-]v%A:%z;7CDp_:L:&8.@:/ԧ_W}Ko:Rspֺ[ogHݲ"@qHZiYsZ\嫨zHd#P?$ ՅB-O,V_9]<떑{<~l-ڤ?X:`WI)'S>R4wҡI_'9aYZYpNveRu!-Egk@#EN-LT4 pL·% .TM_^e=ދ` "\#EPm{Z0We7</)XzEa2QER* Y9҂oRpݱ_ϸL}P :V,v`6:ћm~ <ǧD+MѤtTPUWU+ _L?hˁCnF<Ƴ"fiSֶS]ícqw  w[h+ -7\4,Nr!!ETQJcK1?J1'^!/%SFXɯ+#ƹ]da/ΤߋX3. Љf[AM%xa/ ܈*ENkoT(W dLP0 a}RCz*htIu n[VG~6񸮘‰fx?6YWy[6(8c2#od% 0} +mE*?BO7_Faإs +B镹^ڧXd$ײ#3Nf(Obw 0觀q LC'>1VVT,5GxV]רf?䆭1B00O| 3fiA+ ESGXm}%lk4_zK/ul$X3Ϣݶ"ȹ|WLд>m/}+;.VqpŴDPQHZ3ޤ=P;g- }\xӺQOy¨LДX0=OY,'IGjR s( "Ɨؿ'^xKU_E>;赑:}&qsl2-^z ]b^5\GXXOcj3'S/ZmTEk?ѡIF0)'B[=\ uV=d5׉EjH|b˥c+kc[?lSيIJPʕ;>n2eS|p6+s[Lc+RA,XK wL}x^Fk6j`m2?@遛&; P4'a'kduѡ"a]_ +$mU-?* zM%~ ǚ0@ϐeRG.;scŜ+噲RЃ^ q>/qR\S9A+Zt. 4݉XJijpC'Oz']8W`T6&T1WJt_hwnXTO_=lA2 =) $wm\l)TP/{zbf8PTjJx 3 |-ήb6JD^rc *_;[0[[O((` ,I"N GN.f|:K(}xlk0:rDQ +68{ݰݳVL>}HLE ~ʵ4LoE<2:ί.Ogi bG[?+AE2*˴))Q1Z1l#Զw+n7cErw,nj̫kX3"w(VpIkMY֡"LғϓН70Rv9r\M*{ EBv&d$=;*.m~1NOt9v„{wSi[(U;`VV=9~zKX +=UJGqkBr):ce} +߀b+WyZ.qZ"S; +^>gEB~e$Yk~;#]`+e]]F|xiVƈhrZtqv˱*a R"zezۛUgP0TΙGRl2<80|j+:6Kph^`͜En|>LQ0jgr> L]p#U +r﮶/x5a ~ԲͶ`Zߺp[t:? ΰ{tWTsW+ScLg`kKؙZ>Ngy<2zG܋1|j;.`Qro>[k7DY~͗uATR(qALtaaWKLї¦PNfo^o + BXV댑.ɟԋ<{6v`lCxEar +,v}X4/='_a ~!Y D hݷ҄Rym( m(,Z +`/QLJSXPA2eY~nqFp#%>rF7^ [EKCxe FOj sOczg 1k8jPrTW~sWS72 p\/± ̑@7t=8Z"]dNȎc+׉ZSRk\ q4f^HqZ#ً-7[{ܚBuH{K}d7C8{F kHX,UkuEɉHk55k~>$(BO3AyfPxI^~ΟhvMc<@K gX܄kl=W]-GK\XB}4"˺ (zp^Hwp荀ZOXؗa8(SN bi!=ud-X֢,VIʝ0يK0F@8.~`{D)P'53^l#!s6!3Xx]^v@/(!!d ff%V-[ݠ!Xcƅ'Fѻų_gOe w7 J;d``Xbؙ7֣77]Xzf+t@xYU%ݪOgPnTO!QX0[7&!.[1$0LzX$!aƛ!0Y1ed +29mz5M +"][9ZMLR#?z~_#3E1KyR"ZvU].ztO㵏;T!Hxyвn + +j$㣞t9h3&`쮶![.UH:<( usJ|@v`}Z.z,?R#2Ŵ!VOGwIew(hT| +x#AI-}d6;-iхN 8\Kq'9!*t?&)H +W2h ͮ0vΉx)( Ѩ>PZzEtNui-j=I"4e,#lX[$z =ȿ5o|zMA>ɂ endstream endobj 3680 0 obj <> endobj 3681 0 obj <> endobj 3682 0 obj <> endobj 3683 0 obj <> endobj 3673 0 obj <>stream +HWnG}Ẉ}n#Y8Zob49fWá9ddo"RuaYvWu]Ig㹦6Y;TtM_Ĺ fpJu=p@A,w>ۣ?`J4U<;A +m~6'?7<8 &.q>1hl\{Wo*r .Jϴ`BQb RNVW ?3djl~W| B"븈.nO ,H f3 LOPS1c-t0Z$8$T^: +dڑX!-<[-N;luzᑙΚHg`2\Qfts{&,(G2N_.u{x^)t/Iz]vs:r!q:qSހ:/Gs_J1rH£ւQxҵÒY.vUyڗalZOKA_BMCsr(% RՇõ!F-tMSA„E,'UoFL|Iton+o<]nkJSPtEJ$ =SEe6SK|rףD'V.N0%XeiI!nYO`,5}p5O/]瘝K@[ʭL'&6jݷ,[Tld+dYR\+a׹T)r%55ʕ2_x8W"rV+;PzJݫ7Q 0),eY3 U5`2oNASlENjAFFY0DRR)׭uR +!V1&#dBryx8^a%. $3Uhwqj:{ % ,k1tM:׿`_yݜm + N W~ eczy}?>o1HH"^}&qaԂYHz27zeR Y.Ni.u>bŭ +,Ws\h2TcSJ<O,M^3J1;* %)$Wb򂰹Ҝ8%Q܅1jF,ce"K^nPxŸv[+ñ9Hmgz b6VX Jq^YQ!-A?tz^0[y{H0RR}m+>K!poA=1,@|JǓtkyD8R{xV!c FDhXX?Eړ7})EZ,V$lgD%JjnO_yg5*&Rua"%nt%t]>stream +0 Q@&zs Q_5Az>rL!eNaD,5Gd\}9j&~MNڄ-[{$\4 '뼄Hː´BfR,;o89_Z41k,q.+k,|~jB]aTSA>Do3w! ,awEš0u-<#T!Dcgz%ۆ ݣ҈0{ PPv {JғWT +HQۘu *M7呤(ֳjyxrbӲd[^NPγ렄AU4B=lyچ42zڧ)hJA(6]Up,zq ~| GXYRiWIEPS_\-{?qzQvKP'uqOzGyd#CH\kƫ"btICJpwTSpzKǯfz;[>_Ւ2/ ! ňy \yCGf0zZUcsИz*ĈA'gھ($1㽃TgxfOӿ1O=xY=)G,-B\ri`  + yCGtʡP;w,}y1u0we' 5aw/.~Ԡ0 +pA(5%}uƘ5%ovAejAi}o.5M;@*v[E̳;"-kQa L &tW!2 +v/u}/ڻ:Mթ6P& +=.P~,j)ܿLMR1"-Q3[u(. l2P:Yx<БM$0N dФf#:cu0w~OV*3IjhzyQRN\.:&Er>^80JZx>+-] +Lbm.d|4.B:pFҍu]4 2`_ǽZ geij%QZޙg= !V#SAtM%.Ν_˼MΠŹk]JԻ/I$k" 7ӫ36!ܵa )\0"~uL3W +aJ2Ϟ+4w$T6sO !@hWG2!@N!}DTL&c*ʴ}?x١1)f բ;JEpE1<~jɨ[1VkkYB'Jul66\.t 7F H )q +! QG5iۿ+!)~()afDGOlp +{̘~PT!错6THܥ +A1QTŊ^!DhH2\~T%(8w +h fh :`J39#qR&rT۴p;MQ̈0d4(sV`|kpC(\;F:` }T4j-A#Rj*TuoZ\Qjpz,j$L;(dkxf0r:b"wXE@ + >tKl#,`o3$7JdECGR ; 9Y, +@7 +hCDT[ɊpFWa0BzWބXH/@\$@Z,`!{"(B%v8!iӂ'qpdA} }:L2ұ!h'4;qDH //@(eʝrIӘ׌ЄjT!pԤ-3LW:mb6)_eyRIqnm8Z蟭O$s;]6d^Mu֡CkFaZ_%a=hdmOɣ`iNbd\&tSLhZuO1^)nԹ_y$$ٸj* 3Hll97@^^eP$#XMR]?V"Wn =50/8l ]gYg5%dsyoj˩#P?t~Qc-ZaOǶ쎷ws@fΪb$3gb:}&+r<g ¼k,N,A7ݺـ2j9 +"0[NSWr{~V{t8#@J @,I1UP[Kwp +~-uųZȤ i m]LrM nƋ딏i~p?Eة[oHj |}g7ZiC,(e.{,Ill{ؔ5jd~l¦xkeÂeRϥ2blJCS!7 O2J_']F%i|\hMr2:a0Y1pnF|.]+8מ j(R'+xǃζrw^ڥ'{sHK!~cqT%ʊu@!baRjrZQd"8Z`d\_40Y̩\n&AG̸ ׹6b3FgX=)b\P+}-}&T$י?5w[nG~"­5)1 %ъX]c拨3TlueݹÆa9NZϸc 0“,. +/: oG[S(TKu#\?VuJ"7V`sŋX/K)4cmɄ!ڎcr)NԵe4ńP³{|C=|顊T +kbLMטּX^edfqe +qԴ6$#ٱM^VKp`kN̚ Zk}DA6] }0[&_!O1pһWoF)®g#XLle>-v4qﯝC<~98褔w mc_Qjtܕۙx9{+v +!rXЭV$<}.b,6'ҢO8ـܩ}3)#+־}RWµ!׽n~װ"*)t&hGxw}HRr&~@'UYL Y\!W\CLb3lb~cxDT-4F/0%ՓhQ{5idzc#/:}+'fEWI#ƞZYuZic8B@ +Є0m&5d90 "`PU\ƭv'CtYdC`YR$7?y*?JN@yİ1=^EnT5)C~FipҌE6-#7?p-a?L}۳szXm*ԝ%UܶDځrڎE@Z!lfHt&S0Wp hjvA> vHԅLۿ-sj l;C}wYƙwb ~2.@}y87+ +, 9F͇!RE[=Oƭ>];Ӡ$`H$-ޯ | 3A<,LxlᄑmlԘxhZXVV8="߱p!6 +p hr$ +Cf+IE@EI|b{C됃1gщJY^EѴM,Y:!J!Pw/CSb<p(rBG).Q) qaɞ2(;Ow(d;`#NoL=EXlvqz4?ǓωAAOro~&0һ)qJTMk󯋭 p# j#8jq>GD|td'x.ALA`1P/kO|KFPvLZ>qIsY++DI-#Gse{z#kw\,5;'ʙkpQ1~D@/c=y,w˿ [P9wP#p <]_ Ϲ: +5~~`o ֩YW4p6`bje_2= @'gaʼpE?gwY}}:MJ 7vFj-Q~|񜸨s}yٜ[EœFd,$0v_`IPiVDk?1Ϭ~``j\^rt6v3H jFH>\TΜt^69n3|KɛZ{Fy0O ʥ: ǦPY`=XՎoPSw<† df8" :QL +-C%5NӕL|̆@yԌ*'xdkh;y'26`Gz8xëN4-{Ij +/\v/K?<*Y(f8.]`P:743N&'17nb|naXNB}gŪ&Pj1g"OsHn\!.bI@S$|MR]v£'dqA 7?p7ĠdhrbYi,TʩWjyg}}ōeປ +b|~gSi]頮/)Eyj|9zȸKY}V:z#YwnQӿ.~sH a۬q97T׃3*9rWӭU'&}>PsmpCZ-Ve/| 06~$`Lgĩ`HwR|Gt`Ǘ?ʨx4gsUBg@ Iqwp\.7+SxjQoO{9 8~ ~%fW"LiBs&r ϿKd0|*3TdLK5tlֵGm^B-B?752fN0[5P}!mߵ|0x_d8d47?TĊ7e2;/Yd}&ZF/QIQ݊R`̫Ӓ"0T)uބCMtV(塍BbiRS:<;^lk h>GVKʘY+aQ(mn.שLup$$>І?EiZC䄙\a7(>%Ls0`ӪP;l +ÄE֞e;Mp~ O]/G|/%bU=6Ygw}c}y&f%ऋ=f -2>m8]`{4bc/lR+{}U5rfv&7n+x@*LZ&<jE7(?/8ˇk%suqH1'&u]L='/CXoq1'ļ1& kBi`)3H%׼{c|) -a^Mى_KSqeA$qu:uGuE](?xcNzW{2^s6`/x=X( \ч>hυ(8Ehi.p;z,5GεrRد uܷ3s,ij۪N61^G6r X;BjRʒYY>nT@uLxpҔ8OD+{ yΪ4{=eIYtB>v |!OVg-Xws(lW1rxI^A*W3y.Oo<˕QG 6M=Zd"z.۽*9q~pc ul10I+ "gɮ?@\Zg p?3OBG,tj#:Cx*ka9 *Dz)9G٠S|>g$ѬA2pu{VT,y3/`rv*n~*s| ]JJ"G@]ų񉕼2Aԡ3$)"ׅ(=qslnNŅp(rvJ2чJcH6n|@qZHL ņq9Ijn|h.R[Duxχ^Cu^פ̖y/c;vغ5#3pOTh_""5ҷ8Ѷb;6{يNuTRQ$]=LýmHahlm G~b58+2uƍl,$Hb0ʘnbZ>35:։إ(`Mǁǡt5S*0rmj{/* +\R b1tV GfQya~ +]/ux^EYW^lP(@Cg9;qQx J3atsENm36Ś2m$!eND,TA YWQ}Mmԕ#Eހa+wqSxat[J"cq_,j"Q3Ue<|8\|uZ8 gEX9QTl54'ܼTrh;{-=d邋9iHp};g\62UM3V0rCъlYN +fv kgg룓ޑ*GՀ +, [es:hw-AaM-qUg$"BDkĺf#cQ2Xhzr&~Ѹ\A6,˾4d|ϋ4R蟯8D3L:ɡ_aĞy2'/nɯU;p0dU,B:W'˜6L"q &1{.Å!z0BXs&>}昖F z\muЦ:A3! Ǐh񳁥#WpCz-LuЏSA< SH;zr`0 +P0kTi+c [Lr_l;fpb#L!i _˖Rhr +)ɛn%?m ߮A\$S!; Q`3պFk|}3(4$nuyILRjWgcR@Fɜ{}gˮj*D XZ|x! +4*3waC8wOݝNxI˃b%2aes=džLa`ChgpvACI"`vU$52YNb,^i*fFjjRRℹClxNW,ޓ a +e` XnZ | mSG)%\M@b:蓿z(1:`B8Y ` d9n'0)jRg!@j2_DR?ǂ/d&lLU/"ŭq]m~H6O4Es(ѸPUiy "UMNC;M{tG$%aZ{Nx~arZ$WgmR8s:ї59&,8mz 6.":/}e/^mdC2g/xzc + 1Hv v~OR %ڣ_j(WR:m#=Um-:8Ic Fu!S#EKFKs SgbףyENN]lkY%ĺ?1WrkIZ<9x).;+p i! mhfs L14N k7wSl,k2yVAw}?fU-d5}VsW7rca)N;̀DOgf5I[!qE)K(o#7aT5GP|\"&kh1#[t2^ &G nDc,-![=n\ VCoeղSrgZ, .zOCy1Tʲ#oydKv$]/U6 81SAZ!Y𘆞g#6N[PsiڵUxd ݯEDh)K ͉ 5>O<]hۅWǻj0I2u6> :_K-3Z5#z.]+XwS,I +J_5'f'z4?fyV%04]_y}\9$([yo F_諴 FQ3mcZ~61}hzDJ 0{ A;҆ ^|ZˉDeJV隖ϢdaD%LŘ4]It V0דb Pq|QmrˮiX*c9ʳ n1$g$e&ҥ#Z6%W_,ku_=lwq\gҷ/$tK3 +>~.V_"<6yUA+@hssIVdّIoCy:wy\?B1/ޤn* )eZ 켡(mՋXatilONhHVג=0ٲɬH6|A,v8v)OO=e5U8EzŁL~ 6vT#pea  y"\*|E{G"mXM-&A9MN|`lWUǮ)v(#J,f%McU+^sw$/=P)8d5YQJgU/Lg`Ȱ_>;`|?/sʦqa>+9pôhml"OrXZQ:r)uJio@3T~ϽOoV1i¹NЦ\~?;5++-_ZgY'Dd" +nV^؇z/`;fh妕%};bSkdAbM%'Rf.3'Obr&EHk.<HSk%Wn٠p +Uhڈ!oh{c=O߃^6`^T_j4}6_l3cGh&ޞ J%ZL 9i ъ*8 B)-١Ѡ;cf髕J0O rˑix^λrȩKcmǩu wKQ 0d=. G J{$/Qs\6wŋpE?S;?Lx\M@*̯>NՅ\{r o^ j+YbYԜ/L|Z+&]ӌrmIx'/e63 7?EtZ 4g;&Uw"I%x+FQۜ&7jzIoPnpD3ip?Q~QȆ| /& \ X|9t$1lbiG\EMD(`ARiȕϏ=>Qc'Kjټ }9wSԀd̹~l2?KJ/N퇄G[+ĉH&SJxkJ,ivo",40"p(_GPT˽6%`[X9%xN":''guH7'_g>'93gN6n 7CX#GDRww82ac)[ 8n+5xdaUlt} sdv拮>T g =A<$ǧalJ Kpa ɕ0S|N]OFӲNBtJxG=1?z|4lb̥T "ȇER</E#`-v%NF/(EO +YZ7;o]A-]聰 օ fބGi y2.^dyօy] ،-zؙ;Sg5Nt8EֶJ͈ g$ŋ,[e}3RWLĹEYSĈrpJZGCWHFF f0;i +]5ߩ>knmD7g!m)ylfip]6/IBdJ~r\z1?eSP.c-In>H4 +|^gyk2ApGR<3KB)`|oA.W7}B|9zj"Ou1PձF:in@z?1Ny4Ĝ,y?ڨK .JnBDžhQsCoGf]V@N)^Tj?gp>y|F(5Ya3 bV9|l::Z`knGɻnU;;*}q70(x {}P)FFkW.x=nȌ >uy֣A!wWEJ٥YS֦Ң(KJ˱)"g٢Xdk9ƻH='HfӜ䅞{UW &~_9xeW"ʃa8-kƐݡUԵC3hơуg,mB6(f EC\T4r0H&{9r ]Qc[k}cQǃWAdM %ᣧdcW)ZS!6>aNݔTf=n`1C8-s AC'!L\ S՟эҿX0IM٥{TĮƯNoו`&c0Ṽ :hnS/&Р^ϧJ8!o=l7J}tĶξ*pϊDox|#fڴ-FeWF=/ BXBFSJ6>%T_RK礬5Hӝ* =L3i\>yͲYG@tl@@qPluiGgznjePhS  $peFo[y6߭-9Rzk2kw +Gґ)pJ~Yw|$]sƌzCz4>cc$B F_q`D6k!Aa@P1[T vW{bMrVQ yTfdJ]`u'=xcW?/!#0YѢ^=LWrAiqLBG'3}eYS.Zܿt kQ +\Y9=}a{gqdG=a*\sYRƟlH۴y'x\FőutƍoI HtGԩJXs,%Nt[^}N{=-ւ&[-Yh]1MsQu3Ǐ +ț8$,圻{vƗdxT=֫[|3\J[˶T,"BDpl du9"TmrM17KT/< 0r-(w_f fI!Ŷ}DQzr @KFꏚ(]Jbs}19nG=Rq_$c(=KTQ&{4D6⏷pfx2k+]y@.<wOO87{7!O1nșEXBijY)ТMjl*ssOԔZ7un TwO]`0:Jضa jFw o w~LIQט,~{yH \θ=1umhaϥ%Vmn<視k䲒/qzr ) |XL%οF j~X>4]PNư[K,̈aGm2UtNG6pO%cCbqch3ugrj5(1>\M2̅?=g +ݪtqBF_[ id;vӱ7taٱvHRʼnI +tB,؍*JkF,Wdfr5Ky͟(AΓ\1, l, 1*@_~1g1H9wnfy(SoʡUq1&](S`} +\`Lm>Mf3|wU~SL/4@hAZJ tIҪ!A0٬- +ibyȏ9#h)yɊeU(V%6+|%&m!qgN 4 +SP> qC `Îj`EiZ+dEPLr[d E L3J(|R^O0QYBIsV,@QccU9dF̳0*=Q ~jLL(᚟)`e;zGUb|̆"ddZKubjF6VV[bp[Ͼ.h N#Ey"wyԐd((aBXאָmE٣|vH,!菱 -l a~:Q2ۼ! .m]>‡`xUf|* XwG2bLK.'tc-J,c}-vg;(L0$qRv$Cc +!=Wo߄h :q[N{5I`d[f|"&c&&ܽ~$E'S itl.Dng{D-Kid ++9'&C$%\|cΓƇlB}p"6e׹B>.;3ٷvѴ}fWk-6'봏0omz ~dj:i_*6hH). 5ؙ&}/o,yCJ{[H?e~TJ(GJwA_pajsTx^_FK۹(e ||'Do=7pzXOmҲfY lzT+Է)#f'{N::ATU~|V~Ō!>_> +*yzɘJrzT5#pIRI,8X3 ZcҪ! ^,?y|.fᓁ:.#Q!rIÇ!.9C^>YpX}1f%J[v$0&:9} +/, + jLHnX1/Gj5f$ohygE>BJ<-8.UK6P 6C=7S ܋1;d.a 4]2,Do/+ٞe5p]5ۍ3;c0tuKA6։ Mi_nMvR ;|үT^JQn.P +I3]sU =3۹H{<`?qh9Q,C㼶rH)𦴒E#\B ,3y\eznF=;ed[_Zf(lѵx"E(4_h1 3ge/A{"b(76mhG pe?:",!y;pj=2ҬeP+[h_B)V2}h̎;Ku]5qX%;k zi0wXAכJS /49"wyk:y+Wrc bu"۩ slf[[ʴt h8ۥ-k![W=Pth%y01U9RwbsS*tP1( 9ijkgD7wtfNz#g@5`3BE˳E_YpjmY$-'zǜVcsJf$ w\{>m:!c"*7m5 ->YhsLȂ,*N.@ ug&^龔6UjU<7wW+OofYt9IFF :U({8'E*2vtYDG(XPpXm8%Tc)4^N$5e:9졓ଉP=)RcI Mxܽ;MQqp=/f@R)?0p0_+xwת K8v+*V>sQtMOsOo`z$4<(,O f?q'MȘj &ӌp_ 7 +"E{V̮V$l)D曡m0)Gw2RJzc]"_;$TsZ倐Ec*f5&|㒚U7O; +LExXىz.4Ֆ|:ev \ 1R8I_|~\+cބ! +Y^Dyc[ץ@hzWkgBWʜVc2Pnj#T!XqPa!<< sp ^)waI+x22Tes]9 ]L F@${#ь״ ]ݗXT +P@3>ޙo?^;wYaAs9![F+Gs<._5EhK >.|nF3ؐ6YU5!Rx<9!B<]A>5P9'P"MbNi@UO%ۇsZ8ᲈ',o<<_^oU lOCYS-].&BPbތ7WXF/htOONl)u 8Us^=+*+lKWW]O0INn.{D½C*jU4H 7bhͲ+ q:\q<_ȜMq_A- >2۔;?`_PKCJ5/L~`DOvu88(58%ܗ]ǢP[9/hTRdPx + 8]bi(B4_J>5'\06GA-橎iܧ'KsM S@0kM4ˢM)!HkkDg +4];9C=w?]~aT5ĨKF$}#pLrQm֑J"ԿlhDv^`k@I{҄&vy$#*ͮL $y|eYH.B.|t?!ز̢=#Py{8:oܣ׌9T&!m tˁ,Roa+qb= +}ZrsVF}SufS۱#V<M!; 6O_|z$wyG53ֳA>Y\d7NrK1wH~ܘk!TSa nK%_c`;`=ʊvxAd*ذѤ^Uա$X.jas.ۘ. ݤYKbk2vy %8-JG|impM +Rq<1>D_mN +s >"_9h{σ"*|$'Đdf"Nkrcv%cps!.n6K/Ӎk gR4i@πC9Q'nj^mtl2ߤ60BE嵙.9BR)T-4{`d: s=x<ȭf +@q}}U7'"w`X%X!}ŠEa;mӼYj<7gKMiսjgZ^'K},ʧJ*дɭ2X߹{ۙ}6԰J[Atpz> @2gP*;>M7ʺtBAjqd'Ae̢_t=J;cR\ ('ܘ՞ +HDGVhw7lP"Kc3߀֧$!fPgpFY͌1DerVX =b4 bV<3^1O$=!QYRǘ}T.o:ZI{KS=?.{SPWT}h%"Q,,HlG! ioqΆF;iF/-<=a$UDޔ[kCLiԖCO:<;!TRDjМBo9f=4|TP\D}~W,_X_P|(! +h-C,uץI +09))(HMl +ܺ?Cֳu) 9_"wD 0$1fmP_T$me/.x@t;J% cxĨU{8owyVxj\[NFI-.tGt믋 jԿ+2|ӣ{XD_YH"wdt]`^܁p .gBHnT1wR_N84Lջ MS"l sʎ\<"+1wFD.dD(}R]m!uC;#Ɓbxڴ%./I7# ]Tщ~`yχNu& +oȀFIBC {ZWơ5nKp q6͖JkTD`*F,o_K80"Z?>(/_xTfW\0DL#BX\ kXr6Tm8uۙMnX\S_B YbӰswyQzDPb%PJ[D )OZj4GXTW7tnZ)*chI*_lOĜs}2L!ܶnTL?Ti'<(NDчHBWʯs?=e{Lf +c +d{1dq76úLjw\q7g\8R]tp x.wp\Mbn (`bd~8}E:-1clwFxZ>#X4,{8 +1!rw'kN+ARP$zW#Z{s#!2R!<ȽFV4[)/R^ս.2~H|j4ܚ&c>jHPC=koq-"keSQkqȄNyv c%8#an(XY_~@CzD4 U\*=kSS +?^< ֫[E˰wt}Ρ.<+ g}lM9Cl<y]WXF+wPצ1 W+9gu`^a +tP!IS8(&eSj/AF /p]bkFYÛO1>, +ET ^Yq%@I#R6ؤCUij/-%jA{UOS3JnOkc8|`ejljPy5 ̆xwM$,}P;iqx5UY2p( Z,`Yr#tH|D8GAX@uD[&z3m@.cWB%4@ +`%2tks3,!6ѷ6hT\7ía/ y_5.8!Kߢ!}Δ6o8@뼀V¨֘+ٖl+SR]/0[9E*?f|fnY\z뎬(jG$SnMfBdusk;9\#$? q|Qvk#`HY EAj]jC5<91\RN أT97,LNc4 #)ժ<=~8=J3]'zu,Y#*3l-((}ְ]'mJvKRƽ.֡nG/MsK.(i5U6хi$χUn*A'2H.vۇm 8LkF=# jW䶳{ssO[4(b/!ۣ#f?n>l2F!Hy +OCt%;GpB,TEvs0gJѰv7xF-n~8\:6P&1s e;?0~aHJ5 }e|gBY kUj2{y*lxiVYO(Ar=6=¦=q,hxf')p٥sɿg=-clZPEf\s Mٛ ΚgHǤYcbk`0驖'N]cV%~\b > Zl \uզ7&x/zĪOV6`jwsgE dM]eu$*V%|\#B /H%.k3x.??Yh`(V RG⡩K&ޓ=[Dto/:`B{4G؀ HYJ1R7!D4' 7+kIMl*}mlObH%ke +/5߈z9]1%݆@hJWslmi 5^4;Ϡ!&X:2W;8i4 +}\f2ڛ Ickpxoހ\KUp@\^ܾ(gf: "iADϘ3\]ĦK&)ÑѮ/&|#N~n>I2 {HkS Wd:}֐d{"ϱ8x?G}uZ'w\SҴѹq22{Q)\F ?Oe4B3ʏ:2չsOg9-eٱq)No:e@/] %4ws/iKKR 烟$;w?BݾOsis8wNA֕x҈>keU0c FBoni!-cPiL\qq)p3o%Oδ]z؊,OGT4c.KִzzHq nިsAMPE gӁC bscC*H̷8lN3zlJb#P"13 N#N5R}5GACFGD9S.Ǎnr>ԺVuE)'zpՠBg|Hb(P*qoA*{ + ԧ~uځ:mC %2pQ;eJeE%~ RgT~uTM˚=R(5UPƷ +JԏS5/7FOή2oG0/o%wih1&RDX(*oX!2H{Y@6 `;XҍlivTy>䚫mX/E>YJƬdEؙ}~ +|Xz( ᬓ>j }VT5`"xw ƦӂA.@? +@$ | ӕ8@.%߰mVf9` k`G`uCP@uA,QB *V.EK6żb0;g DiBÛ!FK)t5Re*u296}k`s(7һN] +)O3/4!El}aV䂄6<-^0x|tۏ]?a fmGaOx ㉅6lgF2=&%B@Cx!)$)o0&#F?8~5b:Ωם*>5-46BN7eCʒeUlk΄z^ ǿr6>);洿U"dwH-do܈l'ܖwH&s_ŵ3g{"Ms%#J_wdFNQ%wl}U}d#Tnǻ-دqs$4 +5([9|9+m9ޙj@Sv}3v'X;H޸W|Cמvi3D>-@RL[y]3u^ 9j﨧 + 2Ld 'bc!z)ٯ8ڊ_*vFe,U!3i" +suQ?.\I2Q6?H&ԓx`xď0H6SJ6ǒݐr7|Lک`eK7>B]ySU{ʍjsف Õ0ݛNhfUP5,O9_r2 +<6z<3mǼPǵv`(q9ߤDUJYeCKξjs~aM\Ȓ4FnT3?0,W~i8UZ`ﯤJz9ƅ9:%}ī 6T;t 628uh\u̷=i/Hxj\MYPxM]5{T!4sv2 ]tW/|`aK/TRXecvT6Fk@$u„9M̩ZkYBjcH#֠#U95f %в#ϵj}1NO?E[w$Ԧ  Ѝ˛y5]10:i6:]?>v0Gephd~ +?fq6}8&"=x00#i k kw |k8/R:tϴBR d6܁w kRX_k[3Vvx|2?Z1̺4{0R۫tZ:9ZK@'Ė&X>~Vzi'?!EdhA}7,1ſ<ppP\>O7(QlP\&_'Hh7d䎚T Y$w zd6z JU:.eEd>`jonMf +RiT[~t #,*l?9D@+W ~ov_/4v'9-S4ORέn0E{-&N]"96ϗeʷ^%IvM?;l#@yja?%w%L?)*|mhRڶ!_9v`0k;9buF4C h 7Z}._]>-+>j]YP7<3xrOU fӋsj H4a#Gi?b1<ήnϐv,0vUo\LO!JWC{趪>o{Fq2K"V+>J:4c1FM=+'Q'HMBPU&ª-ӥW2Ӳ&I`Bt)Y\!^8:BP%cXW6Ԥ ń|Qs&<}XpQHMO&BX2N6Тsh5 4k endstream endobj 3674 0 obj <> endobj 3675 0 obj <> endobj 3676 0 obj <> endobj 3677 0 obj <> endobj 3666 0 obj <>stream +HW[o~G~") NX-7KҪ}\wKQd휹7|g:!+ +iQÿZ||?'Iv S5RUm+E ̫L|( Q׈Aϸ5Wi*f5ꑴ0ui F=ɇn̖TTy**6 >MJpM5L}\cU1SK"w'; p >tw?#,+RLZbs†JÉf1eK{Ï~Q>ՇyAE21P(\RHw]RqfMϑw%L49U ++_zHt~\뷦; 0RC7E~l>-ys>>X,<,:nn0E8IjmN59$*"֑VgFc׏%?ELtku)];=nh {'zPh +z \ Dr]oqQ(wAYﯸHըZ|۝J IvCs6nquL'| j^_m(U+ |vna6vt]E}sB'u_x7P«SMQz؀ p !4,MP{loiԑHN>g<]:Gymn)s9bX bSoϲ>G.mQiKҒMq~"_F8D[f $xInIKyϯ3`,L^vxp _E&q0]tqpU_\W&hb~OW/ū\S+ i;ǨB*#0qHUU‘v<[;mkӈY\u_e. q`>nnjgNxb_$6} &q,h]S^9 9ZP I؁9_!0/J pJ"Q'xu*,:}#0$fI%FfHWPUNHf1]g S3a m/& bnOf LcfRa%~4HqE{Sqoy@PPY2%xu<ݢopY,+ҕazD?ҭL|iO?B&Hpɀ=0לMJs׬ߕX i\/@ t +[a2H +nw"h~0 -dhKb0ZDXV#ںLQmz|Q=7ASrU4zPZFgD/&8DbE8L3/hnn tt/-o>[8\ "d5|'pB7 ~#iHljr1< :~F>i +/XptSc\Uh{y9 X9n9pdrg?[[q9uz˱EjJ z3O!@|(rm?̦j2#ooE ]4Am P4nx>6~u#(M6O].fW4IDKVsc}hnjQ,[H4o#+9 =l!G=平꬧T$+#ZP. RA!Q.65e)dd*o*qG1PT2YQ.qtdQ_S&#`=2Rד:qBs$uĒ.0,hJ*Ϧ6tw?eʉ{)yIB 0jL endstream endobj 3672 0 obj <>stream +0 D@&C DĶÝ힡RC=1TNȥԿVDž߬]I +gBcO@m4K?v4u +%gA 3Zu/SwĽ&;OG& +E7H'pĀ-U}v2|^oq2\>wԖwcF{7"cAD/A @L<5C18,CQ+yOz ~cL| Dpt9Tّڝ+GG0] k)O_ABtA7[ѕAs^vdNL9"<A^ݚP%`"=OȒkZKSNN{K Sb.CKe 剑b{ aB o,)a\aX/ӼFGu&xR;hM݂w r`&eLPFs9JsL*qxdһOl s ;]'A 紞WkZIA%8[Ա@sG؍|RwqE&hc6p X88T"tq-!ݳY.γc+ppcﶞ ҿY(搬o{ۻ^u,u靯k~DKW3Q̚Ӄ}kΰ`zt!$Hl'\r [0d? mƧOϊԾP8`d/yշBPiҶ&Y@phBp08s}A +.xʈ'kuxnb误*f1͟&1 ɪtCyk8קl$qRjWB\eU4Avi/gŚb4wY+6"ƶ";āSj ѝ^iqDhרX%pwep@HP"sBkRD$]YB.<1LxhiC[!Ӄ5ebPT$~ ˫8AQ |'L>Fy'HT6-7ߋ%,xHLZ³ O /(⧕^x M MUz>utvGN3sPykfDz;^Oz\T_beULW,YL{6 (l9F"!93naM͊Ŋ{5[`qSQ*ڌ !H;! cpplݗ{ZNLsL%e/}NeDORkBkP /tgSQ.]JQ{ cRћOB(M8t{>tosfH\~ <:rDby%cA`R~Σ_=P{nHpSXsOTVf)6+#By +;Ŵ,`hF&tVJh256!NJo"_[ʉoND^6 m 肉ϢE'Q6 +1vl86|O?JoP'8Ex>-|{Add}}= Ë;bbHبhAu7G +ƾ}IPp- B8x2q 8bN*x'l3۸F 2Tw1'D0|mF8#aϠ ?-+Jl@D|f]=[Qv|qMSסV"w$:\TaQZZqC^;%Xo)01p =wj sc6*;T >~کݿm{ > *g>XSxO:U/MAb[a<rTз Ȅ#B"zeG ,F=;ќT \LO<| +\ds~rejo@ esM卋#>ޱPىЁC7b|$DTA@*5é"ʜvԭkQ]d<۝N M_ <_2^~~(:Q}y2Qqc`OCnqȹMkvKivۧ <;v~Z@K[nUg ޶V@m:9xgbA9,ٽ0+y c<B?^ClQyr\yJ'yrIypb܄8ύu0xY1u dܳDɽC5u& u|V46ŢSg1$Z.]{T;]'v {ۍV5`qf8\2'Lj]:QmE7" еnrT:yϥ_"CuQZ@ů t#M{"ݫ{b9aqM]a-at)v-H<0s(b!_J qرvpHAhs48ry ca}mӵ#/B{ 8T=c.D]{yeD5햂g*]0ga`k|&{)Y݅Oz8|igd.I!5[%^O&c:у:CT5>Q<:ӽL]P&ciӹ;^=(z:P,T!"V3f(Cd6aՋvKĖ^o#5zFX3btgoTBw<TסMwsgQ@WK+AK젔Tl :_7n>'km޺`Y5O3Jk7)#3)m)Cҋ؄-i+E..(g9H| ۡP˜/NѽY[ n9(8jm-߂nuhj]ԩ>JN I ?_'=">6ҁM{ݒ.^$~?B +G+>e[ź/YK4bvŖ38 Xj7/a)]*u1Eiia0po;? Q# wrKga~ }KeEr.@1-9d= ]8 +^W54FlƧ~:*PA.dI40GmpVku"h8j /vP&'z8&-V6+ߥʟ`9lgarjKpTcxr%#68[+Z8\>iy?ѹ jh@)nC=$쵽mb\<7k+T? 6O]>KyiB,-AT[E6N?X J/yj-Fc`xŪTjSq[֦3ʉ#s;MZ>.἗JįJ"ީw}Œ`tfڱnfV~"CG'/o{1õy## 5p޸2԰ 90 ?e݆ךzq0(p$u*|| x U#^XIܱs]ɂ'/A]Aj⮽sb\z59+ذN0|Rz|+Dղ'{KD8EevD1gfnp +:f/OqѶ8U^O?vha 7>.] "0>SG +2rnI G ]ɹ|$i]L@#DE@_c=&i2&s2" >l +G2Aa~Ϯk$a#TzO\~'"`{KùO2gvU_oc% kttF!7*>!|#FfDM 8_eF"zM qӪZ3d%eoԂ9+T<+,KT;-|-AΰW$~n(h`}Vxsji' +se: B5*}b'drڜX桔 +=+p N} *tDoרK*qXH!8Zʮ=AEZHc/j Nl߀ '(Z:źo +/EGNt! +P̓®2 uGO0Bݽ}ȱOPtRly\ڭĜ=wM2?y0QYo)Ms<5Q QSI@LދL44Չvuk29Dt]@@%cAh F j]lv b)ϻ/§z̿҂3r +lpоr"P7!ql߼+;B߈oST+'@7֠ZPeq y?_s;C&W\i[g%gUz%*2M饄MnR罅1Sƺ͍5ѐږѩX0mQر@BMUn /m"bʛʁdc.+z^/ji1R I˲V+ eC7rq*_/+yHmPbKj +u!-)m]lëi!;TAmF1*RfLv'U3EkB @Ҭ/5 Y2hI9x"]fʾ`SSl 6.B1%\g(L1yLd]pDXO;dm^!uD6C eijR.XP^9t" +u\Op[ r3l~ߌwFz(*ɂ[G]<$V\p  +0z39ih=p)zh'AHw)Cm7p tl&2E-T-0 )8>(Ma(ţ(`ƃHgHp* (M&i_=$Tэ, |XUbG-2 إ(g1e6ܶ#040B%Ba|xaH=XZ^OrЗ]Èa( ѭ)¬KNȃ2m3c><:t+&iV Lw/Eã/ibN6e]/SmښA{t,G Q-٢pnԨ;ov8hΟP\޼= >8"V[G/<OM4dT(f]e/L,2zzhyz.>D,jjQ} K*j%M> .\nga4 _gHKI/vQ:<\XMYXԀFxcY'+@X4'@$D~`;W0o6D]af]òzkJޒfW|k2HA6%u}IA7PY~̌{*\AhC诊׼;ABHr 0FF$SyŁ]$i))r9,Ϟ0ˤLb!ޣiaqL&mp^`Xv@XU  JX9.KmPW}4ʹ&I^zè0BW&-v\IFz㠫.4Ht̊\v7s&a[<>2PWuH$v[ +v=N_}AOzE.>c}~doOdb;ѣf,W-%zVM"\^˹ڮ4Ű.\4v;f.}L4d!,i9L}l wy@pB]Pfss\]GQ;.f}t_Oڞf0-. ;+jj DJZL$·%#cus3( +L >Oх߳ҌA+Maxλ]9\"{ar}jï0PLm%6.?36ZŪz0j<2ОY[9W<^#m +{uRAe k/@#,w^{?9@(/qK՘YW`K\t%jc$B?Kň*soő K&|`RH!{-}eeH7Q :`KEk:be;+}q+&M#9} r0v&E qWw0^˺cb!Ap6f}CUgD!3YJ貯WKsɔQ8'whrJM/hm$],b~TF`SHqV/ I~[>O!?:e_$0W@|rq˙#̊r4Z?um"!%%x?A'ZubCZ▃FΣd6;7D>~1}¹ٳ_[~D QRRIFJ>Y~Rqރu#¿ dWy[H65q̵0]Σ+hzvi1Ko`ATxd9K^=Xz_M],O`~>%mYC•>1[0 `n`kk*IȌsIDk5ejp728r'}p᫼E :h?ڞrCnɍy%'sw9Ԟ\7BPC 2Ǟ5|o8]s"x/)nx T}Lr55һadoA9VHA|,+`QԆD>\{#9qaK)05OCY|s|2t:ȍI\EԠNE#Y5x:2&%>p40KQ{=־P6fe!R|-n'' 8x.oSm 0vQar a@YW)O ]9se_Rc _Q Wa}l|:-\9H i>86L{uljS/D}E_Mm3xD{7к9iYY`k%@+[bC'0>)xD*xg菗m3B KchCd[]7W((7 渫|qrsmǐp>3 +˘(~Q7M|i pcK/20=>}OljI?Xqm$ }L[cdkknHVnE0Uȼ"_iUgkQ)}%3j+Bʅ |}HMbZbFbU_bZM(zز;G' +J X* ̗7d_sxY6W]i9ee:K'Jړb (Iуvbb ͝;FًǑUl[WaMK;+GABM0 OxfTqtfi')6=Tjh>gARA[܁Mf|˃6/8~hQ25LB55)ج)DWp&zU5\'ޠ)UbQ]%U͞rscښk]+fh+"(3gU&TL q5OЁORȶ{߹8X9R`ȲIOElvb0ʒiļC`4FCA,Bt;!-4!UlոǛۥ1 gm]GU57" T"eȎ-$(iUkD.h+Gm8s0)[[ +)92KL&/1swQsA ByGK.=N ns3i0P/cu]@հtJ閝Ï8U"6XQ6v\7z<chXu`.NVga׼Z^`ĺ JDq39F9`sւ_0O^a@ #q2h}h'Sl)s}sLU o;׌iN oÉXN? +9UIq8a#&5h$\BQ{HGmOB4.=]Mei/))|6^? +6%U,FT@7n"`ZB8S D' i}:NXOH@U +hX$w^$X#j,_*KRRĠCpeu#<1tBNjڣU ǀh~)zs Nh*VID"3*?EozCuY t!F)wɅ߉73N{,hj p 4_-jLtnIa=|X!Szm,}gE9}͎ pYy8gPN2Zt7ˆsUG(ϼA\1kIay0Bk]Ź(KO/kGf\Jwps1pݔud|>61Py].^x|>~  =ߛ1Ml $b +{ \6)رs,oSp Z =9_#!\lTJ(B.Td?WxC١P يᢰ5y(NK[騁 +ڈj(VyDQ|%]zrdpa-W >{Нq2@W)x?Y*i׸Ɖg*ߎk~-f' ԝ:T?rg7pky +Fb8U52 +tgJh3`%z1e>[MڙҀw34ۉ(knK>f0҈4or2f.<*Vf7?Bi~ d]iz|+M&u ,.a6Z@ѲV1چJniXuya0SLi~ g?"C)'&f 7Q@B.Ii"+>qe⁕ql,3d +^?ee,Jų\`a8DۜX pNe/Z".9 :h??y>5J,MK3I9=u˪d+;Iha݇V ڼAN'U^E;t62ԐU_z((wo'Jbd,~ğ4+T + +<֠xT;] ;vg2:e]|Bmϰ +7b/n,5PM"" 4(軭 uB[j6(;f|gwnk;:}])~ +h]kku+ Y/v?LJsLvYoU-1zouzϣE~m$aEsfݏ蜚c1]q`*@AWڻ9p + af6qpX ъ\QWh<&,t%@J&6y.  + zxUݬ1C8i8%|`ILg&R7T/ڍNͯXwk@l@ynyќП^=F(Cgs/{Km2Y7 h| +@wnhk׍Jdtm!fijԓ +.A8#\nDN>R:Hob.O?Ρa?~y=îԈ 8%4'p@DC +!̓oll򦍍_o) Y%펤T6 ][{l46{7vDοBn\(7#wwB=ciq0ऑ..#7lXd:iD0q YMStVD]Wܕ]h˂uTWdgyi`z$sq0J*Vo3*Kxї(j\5v?qQ Bzw(e}(4yKԸZrO K&X:%EuŸAڗ=iFk(EYMaEDV¦HSBٗCQ`{5Ocu@yָKƐOf]/bbɻ<\0ض3H9@^s TT;NAI"sAT:GY=eFWlRln7I 8$:R@|F@_TѕMKv;| sOIHyd$wKݼ π$"U0=OU''(ಖX5!*8D[+R꺼滄Dz'B,R9Z:P̝gj٤ʗ}2{T~!X\x;I.c_TAvn?d0p#*ʼqSl;0Ge؃I~&s]Ss=r qùV)F[o UNO F/Gk񯂫h;aMל/ U7}K}]/3v) Yy|jn}y \]m&tL|uL[^FU%܀f#Kq(;kmx[oϕԒ U)쒌Pw6ڠY-2ub4$8J9_Z*_khv4i X# qa566JcCܹyµ-0| Z +pI$Vٛ*!_7!qVxqވ)MUUSXAU_opר@MSVɖ'V];E:782/ V:cI?c +(ꃺokyff2:}sW>F{yr> w׆{YTؐ?zaX'8T}`ئCedm@2ܦ=l֎s:q\DW ĿXB*Z9>mɊDWaO߹P&~ݬisxsWVKBQ'S>3P+j 4*pva3GԺ nDQh!DB£ԇ +tDq|а'& / ȕ?,D0֍-ҫq^Z)Fq)ᡘ=aܙ瓉s6K my,lIn;ja C"Oόp2<òIZ;zH {[11B¶jYB0)>+jܢZB\ %BK#]Oz ?n q$E>A%^C>'2mI#|'I۠IrǴ'?}kc>9'%u-$*vvH!޸;d +Q=YZ=+tl_IL,Q!R? ,_4H:(p'i#.PhD,N!gڨ"y E Ţnj8Z˿JwzW#WPZ L}Q$p ppIW^ˌ DU+FkV.컼ڭ1-foa2δ"YU 1`︿I{ZebZ^R_c4K1x7h "rr#Qʝ4D:Z]?eǤ0L"R_ ӗTI rK3J7ܰ33XK# +Uuiw{Waeײ LbeAUKҭ)-U[ UWVcGdάǪC^X^8Y)j؈iYkQht;Mu_\*Fs E!m.A +_3?<4v}P(fUA:+It^bWОJnj%X`Oε_M b J.R>k![7MT q۫pDΉt➙wB wnl3(Z>v4ZnOOnM3r5ę^:%hW#H}6rdd̎OMdKgWxuDEPuNGbgmbrG#IO:Z]h"06 }83\9PSHOEkꥃxLY!Ǡ1Xy aT~65rJ) ɛ=DA㖺hdi>㿦$vhw< 5zm*|o"0̗z~_w=[b.rn]g^DݗP yEAu`x ms!oGpF3fЪל6iXt^}SHޛs\u^sǑUW_2rX_> x){@$ LTnU[JquKh91ʺ2 OU8.k6,t\{2 +*go҈qܭ3E]f܍&O3i|ohU^ȷ,v~>aю025fRqD*9$c R-Ճ6-k:(`|$!xa%CKF@Nɟ`2]PnHA5)HcDr,IdI?_h'LCyN4r44WdO: $?VF$- cjٍjY1-Mʙ+ |Ɖ_΂MRpD?} Ř˵L򗦖Y'MUO,.UaEohK ;}8rIcF\AS*IDܿ=xeJy=¹> endobj 3668 0 obj <> endobj 3669 0 obj <> endobj 3670 0 obj <> endobj 3671 0 obj <> endobj 3660 0 obj <>stream +HWn8}Wc `0N`tv`_ Q˹oQ(ɷl"SNu$)#NR_$;*X-]6G:z{~Ilq~}D .W 8o~[(eۣm\<ƍ$a+XPz[~?cW~=cdd^(=C .gc!͈38i{Zbva%b#T[ K9q6\n[o>ivװߞ,'R'2f 'r"r>jܶM[mHkM%h5dBzuW"ņݗc QqB Tm}ŒQʢ_4 +^0\I,*2sݴL/aR@j@o Yy9td%.VڪD1[ +Ǖ$k_}X]U]5&巈OI?D]c!ZNU}WNd$+&1cRfP،-R̓<'P2a5P- /Nh(⢚(i'4֙Ie\O$('ݐ,FDJ01D[߬]^|d,C쩙j^!'go +kB-?,O %,B)eb ibiSv Lqh(6)4M`;Z펻6ɷ4}Y_>'Ҡ% &ya +ni$F%) xq*g+Z݉箙AKQV',?Qq[2x$ }W5(e#\4 T0x-X#Z+" +l)1Qus *Z9ƹ(VMPm1n]mr!ѳF $êa;_bOL$Q H&LC;QH%t%'@ 2MEOEXk(NHrHpu :_#)V +ĖDiVϻ}NoЀ bL!/pp8ŋy!IG񠧦V[?עƉt4rĐ`bTP\%\Ϩ[>Ϳ)"80!5b*xh7Fz8;= H|VjIW޴_CJd}(oR#u*412{ к$4xgej (yX{6i5;U V`F>WS(YTCݨN"ټ*ṃ$i׏-t;Lv2"ΉE%@R%dEhB( +q9B( |1+4f  )n-KE2׀+qxpTp7hr|Y)<$} hN$W>y?+ 41n E!C,SsƫtT硟-evQQ͆ذ)#^i,˺^׻C3A>frbrz@ZE{D0Oi Śc1# +cqv~D!BGO-lń ߜPͦYU]=Lp09tV +5 8.SGF;Ə2|ܮwjG[KaJ}`nm?̛!Xb:_cڛEN/c"V|Kuxop5 U]unQ=SIg3$慁0zʬ~ +!XDա+!U]on첉 BvBt +=#ɒtM+ +lF8`L(QL>Y*%+H'$'PyϤUPo2,"TX8ՆڜR?PG4gWdsfhİV_&9:pQd*gėZ}MT#=E Hęi"o7_ Zء"M=dJ +1rjNĜ6Da(uOظ EjcE>{fXt֋e"9i뀀 +R8eٓZu ҈yҐCH|2aߥ}v{>MۑJl85cufVtP7kE`|IIJ/>z3F"z߅l@!`ǁxqvXS)"E"VƀV1`H씏fh('4рyEƧ<`pW53ȁ¶j<5&A"d\ݯr䪟 ޜ}`@M(g lVy2/MKvM| LAr3 ƧGp*S8 +`,$[@6{^!",, +`3\y?򈡍Q@n#M(\x~>>WԧfPm0zmC- |JԱZR8/Z +X6w(ɡ!gOC2-*Ef ffYXnњQ6K%ƱP4F"›J 𧻓q6h˵a]=iq⡗#UⵡowmM\07.\.KpBK"ܳPX*ɱvl(PuH/p"p}9Ǹexn8([HyLzBaM-ÅRSrFL!hlKprl^22 4W"xWc㗝Y(f}eN@Hm%Ru:"+Z [!VNcb6$]&8*ތ]b`qe^7Vf6SE7ݰif#]9KTҳ!(L8ujcy@6g`m™^y*2t-q/mGF\uBhEQx9D+4=j+XJ/Az6^$܋ +VJz`4zovMmW6/n -% *hmxzqn |7,ٰLDBw;Z[LmxꪨܲRe;$!XTwe +R*`2Gqe,+Vp\m;؆` |$_3b1Ǟ4z _Ko`2 A& drÁ`GjtpF9VF 6>_QuI}mrIIN"TZ8 /L^tuRXf +. ip.P~Kg<qJ"6]u|=Vi}0=F~k>7=߲{ o>C:oBgjGWHA endstream endobj 3665 0 obj <>stream +0 U@&< U\J550x!"0a4?$?!^/|ȎQgY陌쥠w: S`{v +7hĸ3-caNoE/FO~fse !y/4"#|kcHGXx(+lBZx O #cTe w3*uE(Rpx/lм 2wW(Pe(ydh6 ZX8]'DNJv3?͍|wAK&( wLsꠙiV՚]%)'3e&vezvxI~.3l=)0, RM?7 _zSUfM,5AU:9 (CIm#F?g<MT=`nErCDTx.b礁yΞ%k_N-/\c-ԩz7槠hzi/ۭ$\=qmZB0dBl贈B2{Ju6⑰nsy| T7˰7 +=ީ-Q.UV0 s;Yr>B{Gn9}-Ӂ]4燷&b<9ThL`lĸcԞ/RAεP4/yF2doΕ%eb`&g ki!vҚaXo\^'j@+dmSf.(J_ +m qy"U <@ s +];Mť04*X2W̌ig%0zgv}/>py'a9\CF#$-f`P:`J3mA"ܻ% Nվ{{͗.=. ; QinU'95 |Mw?`3je +|p` Nu5y)B%.2҅7M,VCk[cEYop:Uj^E+(pNp!b*v؉GO.> uB)YM^(n^Y- +6ߩ4:kY\jUj_R4'cÌ)yfY+@:djnƄv2A9cOР_䇴(xD '2)#05'r!n{I7(d!3~(@QEyd:2 >AM{9}xID1I+Aw dCN*5(m :daWBklx N`&D$?bǞ/SuPB&=z!"f]0C<^QiOzE|s'&KB c ~P"-9A?GltJ7/a8!~gUf)z8ۗlH1{sCBZo0yQ]X +y, Exitc'`-K$R`3@yr Z}s 9"IwogN z &e)}Ùc5EnX9K`8p[(5fSWzZeYxc}{x + +0 +ܥEoЦI3MSs5 tިR"(1 v,S/2e<@d`n:-=_k@QlvL+kK&͐VnHk^)-n dZ ^fm3Twd1TA;5pw" 3KTY`H~g(..o$ +jDPom J,^q~ |g@ ;lMKx}pt5Փglؼ9"`l1b+%{%hjU˞xuA ͑RCvzH:7tRգΉC|'IҸXlgU$pG6nj΄`31%r9`|wJf XDx[B]lBh7X9| wcW B߀[,Znb~hX>_ kb 3m$H:N7w*o),D&BK>)y\$o|C8T\9$9HQk]OPTf2B;b Lkl-uj26ԏd"skA.dK7ynmu(T _3,Me$^< U5ASfV)/jDiR-o93N۰OvcF5 XW!Wp;'4!}P^ra+V& MLl|]>zۮIyr#1cqYii T 4"5p.(Z!a1|u-iFfMB MyrXC?Y]dbNa밳^vL$zQp(aU6NՎ-7]fNl,`r!1OLGspc* 2tX v^1* B0$ 9!H-ZXQ_n!e̲9Zn.B= `.OsjJ8;1(=WSr0Gb.X æbb~u?7wy`P=٦<]M^){#(Jpyſ4s]o|"Vۀ胡þ, i}c$<%0}HËLTIAdmL OV;~>p 7oGB<˞1ƶXs H3L^ϨH"GՈze)K֮{[C\TUnPmʘ/Ra-`uxx.Azœ#Yn?ed 5h;+k57}h3[Fǂ-ۭ;4#/s`o@PAtU\һ.I +aX(&v/=bԅMldPU,8Zu-`aaFKT)3/ĔamLEt=;ȍǺ۸AWjlC40D즫uOfOҿ(7'{#>~ܥݚ%Н':Y@Ώ#pX&A+i%O6~vW:ѼUkӖHCDCzf_*(M xY2p{F`X\"u=tX^=̒R>6aB_5^ʭ55A5tI71#Lz 08nUYܬ:]jCT1Q[HKM'J}1ϊ۫-$ FG"!*P~q۴,%f8m +! }[_ErnjrƷ >_j8`ټR=uTC[?}ݧ%P\vF\ ;V!V\rU94@{:|d}Sl|r)E%/wjv !b5);SsRL1rr[#UF$k$93X)U(Rv3 +iqؘA*m]g曶~!Z.1X+ܠ/XJ( I N?qmYx!f j3ɝnw>,+\%5`!i[ 2 Iߎt4cu_pgeZp7Y >8ׁ~ ^ 5(k_x-zSg뙳 ^SLAֶ {m~vq[[!$K8<6-EŔ^)?Bȍ a<`@2ZA4FP;!85ʉU¾5`ѥz:07P8QmP4R'X9º:k+=FGt) O١2UVIǯ{~z<"|o͍w"7g4m3f$WikHéke\ݭQu :U!`eȌlS%TJT*tIeϝTGA1ZU1L",f-TPn}Zrv?%T.&\1㷊~d1֚bhUg-j/_6 _cTo9v\{LU++S'L2_nr`hf6V)2 Pv2KlU^Hqg/pqHoРaC?s6#H>kة;y_IqDz>HɝkdXq]MIP/# 75 ]I8TxNBrQ[~ <: TձZ,`f]#Qكw.9<FjfOER"S-$rdD/cPC>4lntix5 (u;pKQIiPMGRyB r{~Ы?( 0d9q'kDOix#jQ3%U , +4.f[P 3@0Zu}&$cFA!njG(ꡘ5 -nAJ.MW;^~/"[TذrH ?yjg<}|R[6_xY2B>EIT{X ;j|y K tc w@jKI lvYP[W}q a"Ux]a.ZrRvxCxy*?6( J4k-K!8z]VBVo`iZfBR7`Zͩ){z׾.vva# :#T{be5"JL ,ko)zfJP˒eQ='_5$}AB3PIT8;RY\< yx'L;<z +"ϰKfl:zKTz'(LW<+/6JD1l. 1@lc/T 2z@|J'`CZg&W6`#ח |]bV8 OD9@sGpV +}:ѲW?39*Su߳)F#sq1IK2LiyZ Ǒpa`XC Z  ah,F[>#a9J]f:haDu_Ǽ Q$WO2'NC-ЁvxG=eCV W\rWhnښt+PKwF>+%I\ l$T|/{' 鑁+Җx +iB qVdj@ߏZ.y*tdD=i\on0{ =Y Gywr`Lo'5_M߱ʳ[ +_80]ݝYt[v,9}ΔC2Ȟa w(2P78^f8)9%XJY ~" j 8k<NB&Ҿi `x?t%ul ;ܾ: w;v!{֕ dR> xׁddXt;d62RtÖ]uqpoTCHXəlvGۀH"@;fC} +2V=~#3`2Xt=J4S<]QCAuPgr%2߲ES!Փ|kd)jz{#9= xu6ghdKog况`R登K"ITPP+-zu$ۥwr"CyV7D-NAb.~6^T.KDJ4dTb R=i"wS!Ӑ]p} +[*߸"|72>AUHY]uVQjjƿ1AK"?[w`m~ .v +" &`~ZQ.K(;WX7xFc^J*oZ+0G9+J=2^ Ͽee=9| l{C&`NcKf뭗-^첝ި8az=aFT^.JU5v3g~iI#q(Y\R ^}F&4ص(B&qԀr` Ӆ9RhOaP.J]<ZI&=3}5T5DmL%<1?1tm5̥U 3c?UWھ-lD76K"77Q> Yy3'VηצhM3ښ}EA<~qۅsJ@5>Й9@[t|nSZvCZ ą5+#gt&|$Ҽ?mAѠoN=E]B@3 /ٞs1d*oskws$!{.wV-hfSq,%xn'ݜi܊Ae]7pe R[|.nIN5k#aaE}+Ϝk+=ST8O[)2}8yꘃ$ YBuH L. ] ~Y3{HOզ+ u5GdmO9VDF܃]<w8*b\mIN ";v +Z tMmSKXrh+ EW̡#q2tsC[ũGi=%tTJ4bXK#i^([ޯ`V{O~vzQ2i$D7ے chPGƷJfQc r'+vÆ?OshAOOր +DSXJ +&Rb +UްîH%ѡ +!:w7!`jM SMM]cմe6.$pr{TKSLP+|$R,2G5e0oHɱ&F@*z}0jnxSӴƇU7$^K0"IJ:?}=~Sj,xjlNQr_F +{ޅcϜӠ œW?q;[+rux\poM{yLduVADzt"Z}ڹVCo=dC>6lHܛc@& K# ?]#.!ȃ}Cϔu'A LfWd2k*k[V>Q$- ]2Di1<ɤoT"'J?j4J} CfQ2Ya⪛S7| 5cѤD$?/D|37f }LG X!R00KAߤBV0bOJ3if7試Bnl97'{}9t~GYx7Mv`ϞbB͈:ejd ENm&AFw8EtZ 4N# {E\`~Ŋ em {1o6:#U_] 5f>0#]8pW)kkKQMcYmTK?[#I@,觱!y"l92!Fwz ~Һ]&7bѷ7@یjo-Uԗ]\ۆn9o+ ?|Uu:u2M3E \js-mCz9^90[]"͂)7mvXƕ{xě7P_ʣyk[~T9qrMMO"C8@s{Eh|bL lSiC[njsjPO,]~·5SJdn-3M.mjXZC9<'ka{ !n~l!20F)z,aLm|1vPu$867%>6p'6ڋ#:{1] +ODnw +s!>s>< 0ƀSAKd2'8A|g>Dp6zNƘÔ"{cQ us ,!b!{}ϱ*әj+.`ƻ^!VV'$|)dm fNҗ:F!@U#DSGacE`Zܥ!$,@6'..o%Hɳ(y91 8n.8$>nhU!vғ.%=wm2@kos35F_f7G(<5J$&@lr~\Aˇ,i|LD7S/ +rدO+F"ǵ5fO/ V@$[\cΠLDŨt+v{ kΙV̤̗‰1uQRVLSA +psc uxWʊPaxCNaD1$Эx01J13"~ab V'OWa-v)f1[h}#c"6HT|G +,s\W} v`7[dİ/,1mLCO/B|DB5ij ~X{rw3I0yaCk\n=ٟӋ=Mo}L`[|J@\𶥰;8׸ZUσ*vceily8,cA!$%Q7&j/./g ~@4꬛#.?0 jq/׭s&*Àw;yff r ODrP+L7D&P{S\xADQ&OmӇ{W+:Yr*uؘv9G}qH-5E oZy}#$m!"C;d1[Ll&TLs͍'Fdmlu}v΍#O9m< g,V姂<=/(ҙ^A˿K?ඪD=/Gii!9U ?^IIԬw&^*֨evσI?-\G˭IQ?yډ$rA{@48vD[&|ѡحJD&BPK F|ejƻdͼ vYTF~ #WWua˒ !W-zs9Nld,&!p2X00"Mv5WTÙQ\KQd vox82i.0m]|k:D:~(6[@T$89M1M3Y{N#hn" q3qaza" krThu%lG#a\Jԡ sBkѩ4=,^i)(4290 Ú"#E3/2xN^,~rj:q@'ҽuD?~qTYFS6+gUx47` J=tTMX- :FZ' > BumXDž"0g{w`Q hrhd-n3pUP&۾?>˿ bԙwlV&+#,*wIuETøW~_CKumUj$°H]Q|umdͣGjj߭c4B<4R$vv!RkGBO|ܞYh2OAd?,6ʘ_`ޯ$\nI'XGuI殒Y|l6s=nx;^(:Uɞhvv@KeGCgEy9c*JNyݎX~CeyG+ߗTkA_f`,T2pY>ϏK<]ʫUkoa@v6FN%}08Jœ[[%˼P=|uWmmADHKdqhsSn Bdn1yTDϥ-P+ȹx -5J㲂{Ti]?=Ft^BoȸT|sT< +h'P3xbw|@+yXs)Gm 2[&H fbm@ UrRx眰 *@vvƛ}": F6言Oa)J`O/RzVQt -Af |.&is!!%HK˜6vj/ Xv)2(Sed?7\ w:& ?cusB 78 ޅ: 6}.^]sU$̴DˆND-Ph+B^IC :}A}r|XWlDVM'8mQ_4}䏴;`Hf! 8.Kѕ'·(DQȳ$bBy z/g/DBЂˇ(w~00{8Ka@ZҠmA]8_n[5kY }?iOJ1~ #RndW+ؼFɃ eSfGyjfMR57$L܊.NC!v/mTb1fEWPVg3)n FTRŸ~G,u__ސ'9ed6\I _B+}{-nN+ad¸O>iR;EdΣ*/)k +~ /DKm׸i7 W%^w6<0)|J k Y;TrZKQjן=#~>k=>(@\@E.:w;7}o/ɉ Yo&޺DW1AygBE9tUFt*B­};T?YÀAvh +!=}@R!K|O1qݳgdn1pܣiԋ͕(ܥwXt'QKTv -n_ ` _値KDmȣst8ax_ODX{!ݒҵhzHlWćG7 ý/9@ּ>+:b\4ѕ{sFXLG% &6?ȭ]oooͧ$ih3(ckKܹ;HWG8eze⍫"Z =[wi辈:j/KJX:;߲~@'^tԫ["-&۲ϢbvcKR+͟o)fb!/?G ͐.Vբٟ+0EhO?w *vW%(YOA91ۅF(3j%O3w,n&Ndp1J$m|ſCt(|a~՞^}bˣŋgVB\xiJm ^JQ)$hghhZ6`z,m'!FhH-րHď,z*w 19GաN׳ t!*nHB<ы 5_S8T= ]T1 !5p"%Vb.{Y`Z޺m|aBMme(swLm 鵯or2}EKw-:*YMJ1mJ ]'|ڊX ii;(_P˒h]#$C [(,¥3X?w-*Ao.bcB9_ k!%\ލ/⇴FF .W?41N;M^%{#b2UүJu^il|}'Di " +NKNV“J|Ԓr?Jf ŝ?LAO;~ ; C5PhAwlB4oaJI< ~1w|@Ha:sȩ՛5p+C?_ )\$o"%+lpY>$MYXR T5'I̊ߞd*p% Dkʠi2gv1~Riy0$%.oX{9^xsC8Fc`La"JNZ*tkeh,B\s:#ӉSۀ_u>L]iDq45g@_e': d3bY(X1⁵c.cɩ}g~ְz wQX X=Ј_:'{`% + +É{Hg[Mjq?.ћ+uIda|*V᝕*H^ǂsH ++ ?,-b IMr X ф +oQݰl4]G]s:U$ CǚIбYuH.WӼ\ 3NqaE̓&)ѱ)ko^OY1O6iLݐZթ-֕DAMwtCvM^]#ா&iԅkAc,zER-#[a{<b^`7 p^)`c` y0z}vE)@Niy!Qw #dշ T8'ܰ/FaFNbׅ2%]62N`xa\X-deH&eJ( +Ⱥ6* &-ZgJIZ׎j){۳|ڑ8 i &OβdT/mre#CzpY:WTrSrz|LFYR+=?$>ca/ +RՑ<_6jCLLS!cw՚xZS,rg4AvЌ-m)V5Z~-]^`1h1h0qmx6Fu/T( <'ʚ;OivhLrcs#I [qk,^I%{ R刐Z T̢ I}m=g j6\3 f$X3ޤ|1#zr(Zv3BFu +hXb g&Ms!oG:6iH3T f츶y7 l4A<鱜,1y'/ftQCr9o!|>Gn>~`B9t&481=L9Cp*!g `kN*EKS:Z@]vhj~)^kyTJ_WtRNSҦ0,? KT8ʾKnxaY.Xpb:oPc,k2͈3`ܷމqUViu˼b+Y 7r !.5I~!!)ȯ6JLGj@f]DJ!2y3 +_Ay^۰N\T7hYp'z|#oIfq.Rfu*j!c-\ՐaG 1T1ElFe #'O0;6WP`k-Z֡A ,Km*xhV6W[Jb$%0i3̿՗n(b#5_0[J*2DnilBct, ١N1ÕU5q^cnUx};xnlK*r6TVZl躯Xa"Qsݜ{2\+ӜW.}_Z)м6pvbTYA{[ma Iݍ#x'>L*¸2_jSߑ6o;q3sY|ϑﳈ4DA /;1rT(~ =y\[W2}d"O n.D3O *A~DZ .^ xh(սTj|B^m4}&g\Sv #:+=p ?q>@7fLx Pbnҧ8!9w420 +TߥFjjE '8=*ޔ}`߳%C&暈$:tY)39GaJ̫ Wsv\{sUCQZ>A=pZ|`xg<ߨiέ,PculEL|hg @"vtIL,Y,ȯkV +G| BCGK[XZ%ūe8ܲ9 Dkޗ [2UJN/\AWuD|q(=6Bm +9В2Hl99mHi n`2oM?`4wl#uBonDk+݋I-5f8 + ~s{j*dx3a)EcG-2VEU\d}Vaw:t2jBk*1dH섭G Cg2I}iٲ;\ gx*dˉK(<X9d?mxJ-,03Zi7*ogz޻GNJ3Kk3%]1v:⚉xE)G|.pQ"*P#qq\ʍLTă &-nb#y*Ta[6_T7-N)}GAE]qCs6Q)t] c0࡛!n[=%ƟT~TC腹<a)ZfluJ~Zo .vvȰv3['yKK7Wd.7y(cX1[BbSxVezi:`k-dS|)7741τLkv6ottgMAPVNv#5$RCIFpl!fTgnhO^Oz 20hZqWzi@PnYAT-Mˆ ĐgZ*\[pzYeD;v]{<^#+kM-k76V>GƔfd[EBRy6 xB52ߪvO.ؤnZ)q濃Y餬h}~bbtj@κ/jܹ> ;L#⚠ nsCyg+lgQD >N6%%џDC^Gsl~/N&f"p(/ڨ*JOYs"*~x[&y$&ՈJyЩ"09!LOҋ4[WL6 B0xWHS<2ȄEߕ*l.%6Z-{N$ST}l[ܣ}(|6~U@9TXsrlօaW(*lr.s:xEڢ%\onV\|TI%cuVrklpN9Rʼn}2kN4q9<$YT Ir 0Bݛڱ96˸%2)_d$= 劤08 +_jdsGc VZ!TEoLG?Ps=\m|J 7͡]V[t@"ǁX:f$h)XXQ}&"s)._j`piaCW.H]X. +m{guw>TbR'iEnV$䖽W +ˆ.C簂ڲBBDco@"mؒM"Qsن{r}u0<2ۦtOXO ZP2+Ma0 {MD̸-xM(F,kV^0YФ}&CjXvNÐXA*|iϗvRbdJb6D%YPJuН UDeJ3Y5av:*ʦxQ J0R"FV{od.3mk +f(7_9jI (-/ <L_5In89b1Ɍ10dmzI-2WsJK޴ٹ*fkoyNd3ΐ^dP +ff!mG6$&RxDHz(d:[8YVA> $3@I%Y +U^,i>J u4PbPzA> sg_=5@ģ"iKx-ֈkYR EL) |So!rG^^d0QW;2o):iH;VXu7X;F\>IawYdwo,Z+~Xu uٍRN> Iqu Pզ94ZJRtЇPhj]~)>*a@K oS +83t8W> 6ѽvx.~jg]<㬍ڑr+Q:Ba ܤ>[G1q>9}O(^w0 7ѨEg.6M85/@EߢAsIҌYӢKkI,"ÌrT Ь U[9Kl{IjGM VT:O=[a0<%,=t'󹍡(v|Oy5Kּ>O׭t[RL. { [u+ҿ˗U_B_%Նo2+1}aa:"xeםTd;DkMߙ=*̕@7sqKӝ./K%zq$$̜ǶA.#tCrv pkh $! iCOes}rWTrRKX#NܖGe2 hdL+fV`'v=@hVT2v:"[2j4|H)k?F 8r q[/VU{Uujkّ4Jj+'g^Ds>b_P]9vjTL(\N.\{\6Nּ#n'xX)BH\Y8XXׅ7PGA_]m-ap"=ddԑqT5dAraozۼPfeM<6Ofy-a#ͭ8 %̗j |0:E\%YwGB#`|+D +ɟ&Z3 `bL> ~:nJ"Qxt>vR?^s)@dwu31 o܎0_1B{IV +k`3p2 +vذ_nq٢4lDWqk1 R69NjP˵ F5Mv$-Hǟ27SRENO^ LHI {`I@Yn|isڼ&evkd-`@-E%GYxٜbly5$X@0T">^{ lwt"9IR/UG(vOXґ>+l(źV +84;JnyYH^.i%0э@0}?LUy9tv#z]cnffˌ<9Wօ?!-<4g>Wf P~̯I2|?Uw n"la9Ve1AWTT4T*lm h]j͉ 5Lܙl^c:msͧ'vT-‚Usr@X /R@r~N6n2"-8|9IUPTM +AtQ˲#LnXTh]g?[W\f¿m<*:f:w5--*K `pRgR.ǩyj`c s㇢ fxlV`A;'3@sюH4X]SO@SPX;-~g,Rg?Pp|%yjŅ +6e@`zWا`ƜR7f$F3mˋw8>6Ixn|q0y@0C5$azhH/b;.=Ei؜W[D4ڑ ƃֲ57}F| jmFp 8 O&I +$F&mz ̊k!J8Yl>]%Zc\lP?4r/37&ZM~tJ˕FCKΌcc-}Bu#FJu 5soJ"k`~Nw"Jy@PֹLsI"$J_Sq:7k5(}Vܭ`c1uC9TrfN+'黿YfI{O"XHڂ4J2/bKWaKFH/8)tcx/Lp(9$ROGH}WY/#Ή]6SAQf_3>'1B9.Ȣsq_)Ci9G/miy3/}$N((X MUD">.Y=FGYgϢhÃj ~g9Ըez[2$?z^ύ;4̬gRM|<ژ=?kB%|8#SP(24^ k"ls (ݞW%~6/[-tc@=1@,E]فӌԊ6Pޢp a):ˀa{B JGY?'aaIR=u7b矔b(INq)]80YMrWcX$W<#-(&!Vz>ӎޭo8qame49܁}A(nCHˢ\|婅cG7G&a,xS9 arAVEWZA)s~b4a]IK+mZTFvSA2 +^oad8QoUjvgy4dQJ[rUBVCyAaytȮ][F$L'd͢[ # +qrs 𹭑k]Ԏ'،i1\pW_ˊ!}q ߸L/)2O3ef1 +ǵlSu Uj$4\G;60î<}?^Ј=3yaNP2Ckm'`ŃRHK\ 㭒/ūuEpOf=\CUL.-(A$̆s &iAB`F=|ț3ԣ/V^;2I(+S؞uy[?$ܘ+^$#+ZlwȄ}=ˈܓ)V  ȒI2"b#\ҽ@+ s)XiP6_6K{`n'B՘.8ŖJs3`u"v>syyr̅_cdA[Pm~7l/grѱ'HN"U9{?m">ń}s Gr>&8EL1Eȕ9hh-̊uZWS"\^qR$V?!ϒW#M'F]pnA$|U%JXR*?!v5@RYfz +J6:6 "39dvx܇O_Xv`s5$9O翞4#! HaFB{n^d k?4E{+[TZ5Ӌ &[(]ѴdDZE^꣏G$ sQ]{ b]؏Hz.I +|M:R܏ȓ/>fairF<Kc0F|n+ޗNu_NkGy%#RA_MUP*JKs" OjI ȍ3 CupC/W-"YIDd);s0+]IRܪ-AAV.&^Bhd Oc/LMa/6,? 抳D:qfaR*ﰘ¡9NtiBw | I6E+9q8VBHFPXͲ$07*׽w:|G,4"7֮F>X6rjIpEI*,w_l=9~"u\IesT$c A 5Zdk,e*"#Rb9Z71իUCrhq,]7B8KJAA֓ C],ܾV;-mZUzv %U}|]`h/H xK} D☢D*@W4+%Fy<Ӏ%#}|Njj%I@35]}gz>CF_C$eZ Ǘ ,lhTvl]oU_A!W#DA=uGkZOts& Յ".y7.SB MqgphJw%0U[G}GCł/+(d˥,U] .,u8*iɍ+똒uo-+"KKR%H1yqU'5 E񝮝wNoEB !M^t=# &nmӃE3$avA*~^B~b%vcRjj[#$7mX6`FNZxY(! +0fxvZi .]{߈񀬴L +@T nTqPљMcvY\hM>K,KfDYQ mzVpbHzsD0:ɼ4~yIEG2P!}$n-ɹ_!XB1d] ?Z@kl&tFupڐ*&j[^aEN Qz 0+l[^ 8-꓄Pi36eh:(ɸ}PQ>Z㕼9&EO E~IwZeUj໪䳮drۿǵ +7z\Y_qk> endobj 3662 0 obj <> endobj 3663 0 obj <> endobj 3664 0 obj <> endobj 3654 0 obj <>stream +HWn}W!6i,X[Y)z&lT7E6%ya[6SpHNU_q(xxdPL\UZ%:k+4Z.wM›Z7Cųc&̉t,>ӡ1Y>??!W( |iRxnT:oclت\_s1;QlcCW s9%6V+E51,}uj7Ϲp*Fo6S9t芄ڦ3=rpRpehYu?xu_ñ|y%4&q*67#~cK: +䠄mz7DJwgރ +;<~}nw7AYbY&G4JhYOSt0 +kʪ]a@86%!ᱍ3\DZ. ǂn"da"Oʃ%?^0¸BAC_J.X6I}#{ OЩJpB.+#z*Pv`nB4m |_d?{,/#bJN'kO63hb( 7;ݬ$k(X 8 z2qK'LxFdEIޫCcPX)4-XŰ}a7i}N%d (KŻN iV(PBܼ&\Ɗ!$fM\*=yDܠ:C7fTN)u8~:FLITCw4p;v ZIem_6V8Pmp D6E鯹Rsk}, :c tF +8ݦXTjf_YgEcB' `լ3M1Y %ELǐ2dUrn\~' vHFSi3MCl/6 +4O])bdfP (&Sy#\1&n*; +4CIHd*D 27Dsg3*rykg?7)u8TvQ?6]Nxw+(Bw<&f3uw~+L*@iѥ7)K`Vx7XR*]Q,ZJ8c{Gz'UB?fL` 09g?\+&Tn c,ca81FdZ\(2@9p- y޶GPt*us%XBdQY%409yUcz`)-5^ՠ<5}gV\OQ%GCHgH49`PQIr2 ^v66ڸ!&>RM?hfِ"JY[h8 Fas.Vpp9I`|!r[2@{MY\p`ibU%d+ ߳،=Hї9>,LJc̸DZoJ%tj२)Ȕ <・:m] 8V" +B~[@sJjig׬7u+Ⱍ`Qo%9mGYDBIRDbS +(ˣv%`PMyWP #|6V>stream +0 M@&K M4ˀNe.ͅ&UtLWmê&S +-^Ab+O"t#ٖ<E fx=`wy'TE1]ɍ~"gwV/vc:H6yof-g?eD>rrY*@Q϶l1oCnM =0+X(~*9!0Q1qP*^~jGk +M~CeqT4̊q||;CMji"{냓k=%4! uh)D0HjK|4Epq$J&q%eqY2t4_, Pi[*:wܦ +(LIҩ>kz.`riwK#v|N~tʭ:8c>dr=lM%ZgCc/kf&DMA5&2c{^5=/Oo8 +o>q"krO*+Y~f\v'*LJn4d6fxF;E3yŠ(cgFnoexr%; qD"JkmwQdgN cy^_r,},Q16yx X +߁DkG|t(0YNÅ*|> s*+ޓTQ?QGe{)lb?$(vx!Ish 害hWPu`*9Y)vV0vE5 ӴCU-`D =?dqh8T>Dcu`qWpH֤tד2Fk ,VaiEaQ:UKm_HNt A/>[vutPdݾ" L%Lh4Rk28`Õ}PM|؇KCfe;,{a3`baj桑Vx;ה{؁G% UZ/hiZB K@]^VkU"4)Iy(fQίe{H\IYA`imSS av`I&!*vy.>$UQzl#YA{v:e=@[7Ͳ~.? dCeqDV51(S:pT +H?1&Z effyobR62C EcvھC87pmBW>O@kDg5\RT ![>AcQ^+<. r*(.n8W69p@OH:$wlC@'3@v,s3?XTK+8(W}78xj夗Eܕ9JE{%O@]] @W-?}a4Nr_:IJfvE^f/-E= J;Y=A: dQ> xمFo + ɓ(rqw~QLמ8J6׃1}l5bwM\oc|oh+&oC1}`.TBA:n 3z e[Xa웕HÀDI 53:@:ZՎ}{|o_ҕS-,>ې!Fs蛆ƧR_t9)oUo"{SdїG>51PE2ăӫOa*rW_-lk:ͬfl>YFK`~)!mLî#@3/[k[{ŘhV@FZe}4J~ +)Q꟰]u?d}2[맨eOӏmP՝"@hŅN-6ːr39%N!jNvX^t-2IeKZ ;śr=!4b,}sv>a۷@㐶MUFy_9\1tʤ)`mwiFEeA+ޅ_nDf&G6pQ&)* +Od(;: UeQ#+ cYWa +λj]cFۙ\B~e,ʩ#8EBe|V=a}U?+oï$ْo@OrO37݋c:l_vs#Qė y%9/րe"kjr 21ZkpÀj+{d\ݒ,䑹 {67r%{^!2Wχ %-~֣zZ%817ԭHr?q}\+PI ++h +ΖsF:goNn uNHhtOCY9vEzqsyco{k'~T0_$D ЌK{_#YGL0BEq6 ezn@26-wF$)yczIgl{B=c$5u_ >uV`,{;IѩW}v7K6:p)gv +It ^";<w]BVDn%L[7{nUBLmN-FrTnj +9w¸i 3( Yp499MN܈w+rZ l"8Nh?RD}9^+GDvjaޒSx6X?&o8!9T0ULWgK&y +ͧZ:9De)4_ule^k|Ts -?>( <%g"PM)`5*{'sLa`jcHÝBX,P74Jbɟk7kᘒ4|ZIݨO!}f?wEM/"QdTCϑng9y^K[ټzb/.ZA# B8o]pEZ׮"p2[&:{X Yp,9tnOe, E9kFW(ŷG;.ȿC1ʦ7!qYT?UB{>pU#O$xV39.ׅn\/;ryk6B,ƲFpR@z@#q"I O֭,7؟"4,UBfm9'kZ km 0EqedWnߍg:h 0-xl-WY/f"lu{c -1F6q8ico,h`F6#"ֳUvT0*^LyX9.ՏA/elc(`||9.üPi +"x:53RcI!˹'N(٣"G˶&3><8A5fԗꪔ#~߸ pģ۷ўwef@a4g8hu!!@%7:AEөTmwR8'%={]^:VPÛβ`ՠBAjBzTm;} h7H,hzyp.4 DNTفy/%H%KGW>Tنݜ^QX +I!)92T[Y3:O6W qj+Iu5K6I2S7, /0J+ _v| n;aC @=2ף;S9gf*_?K`\kpe _RaL1O H$/I.^/;" +6:cS-K/M_evAH$]f鉣]0ug Q݋C$M:qǯaJ ,بdX4vrJNAm@l+l4iXRI{ܹÅ6֕9{eZϼ[V,lIәMQW{MFzb#AfDB'֧[ (O.(Oֶ֝`ϸha;i3u0x"rѶ*ExHl +9cQ1(tF"wl/.\6ށa&l"/?R_Ao̱ց*6A$L6Av"bA%ںl`6_X z.p8eG}C(Ht:TK'3]{{x7]ߣ+J {~2ٖ`j(L }j)F { oզ!m˪-hF)8Rlg[R?Ø$9㓊LZ=-HcuN@k"{3:x g!(:)q;dd8(ď|]1 8IZ1m7Q܆EsDNG$}z8eF[S x) _7BX:eռ2j89AarHG0A  ?\˳,;>f;v;Tg7Sٗe̝%_ztZڅ]`֝ ÙJ@`I`::V8lxĦϨ![Y鞊nх5T%W走=/tIi,WS\wUK(.J"<( G LO7aQdiN0Ψ*gC޺#rH/u׫`X8BW +qdb,SqIJ\{O٩pIcwB#`{~5#0'"Q.c&Vz1 = +{ +޳+2'+LI4%RTQXK9@SZ, ATbP"֫f*pfWs4ǙwVW0pR\,S@KDt9Qw[BA$oBJ+琅`AG4M:^p/܊|iy ?öpRez!h1%[҃gPN.IkrG1f1L@6<Ic2L`*ϱѧm$.i"'AAW}C8;L˯`lo{.rIw$2\ſ鬟|I:S^3 +GF`A{0zydZ| ;O\#)bebCmwlU=%̔u/YcaP3owh[:U~\"Qr _F0sW2؍\a§!ҚPy1r佴C7i& SDƣC& .JRNC ;Җ#=&BlY(#J;tQm&LayY3Cn pqj $Vxhg~S_{\=щ3"JSJx.4$MI^hXQ2|ߩn +,K4kM:*-Tp*(F8,62 6a#`_6QhF]ׂ,&c^v$m٨8aV\$6q>JrG +XK+](oS#`c~> mby^^.*RakKʽ> `"d#r,Q6$i7Z&(Ѩp9,%}6SQ%x- `.hwA96|3WCj@{Z&c6^ e1H-T\Aj3njFFQq1p2 :ُKE9zM'Jf̑NDbmCOFGg Ds$ED.m} _ǃl Iɐ\]*WH1#,u3,RD\1Qz!+Y ʂ~O\׶:Tq0L¦z(\3 #f8 @LۮTjChY-w=$Y,,e*Ā%o=u(dtVJI`ڦ#?&,V'N~Mpɼr}9 +}v\H6$fZqUs?P"}e=Ԗ(|1~*vLq->~^!6`i#gQZ5s~Ցtٜѐp/JPWq9R}{=6xcΌ}Oa phQO&.B~T ++4(%nО9qO`=<B+l6aշ*j1<̪o _rpU2JĵU峂n&CWc]vWIk[MvQq{l=[]ŵ8^ăA[m9JLKw2$L?YCг?9)\p0 뵉E2q?SMo %7ίLi}Q\ +KMKׄ +t:xbSIy[Z,n^oTF&ٰaM:U'4\gwq79By5g+bURs7B!pdE)ȚWgh+  +yNZ|po({ xtOx̫ܱ`~UPo!᫰!6BtĔ¸#c W%",0p5xEe7m:ҏQi:^O9SkVb'`V۱ma)6 ؎-إK _&|G~Qj[A`A'5z獓ǃ%WZ3@qEXj2 /@Pu[&<3ZjXR[ JYIej˝I$#f0ګa9(ŸQ@ǧ!eɈBarTumꊔq)lGݸ2_6 Oata(Kxb-].anL_IE ߆m" {""V*iH7Zm8a%7n[F:bw}wZ5K*_1Ǐ^#Uq?d;ǓL)W%<44Ͳ-{EՈFu~C"X{")$:8m]_S,~<dֵ{ /6M,= \ic=L?[UwW4ˀ{Jjꤣrz"S5R5hwlxC\I6`/P +m+W$B{4NБ\47oRiBӰd6 Ў|i0-;!54:}D?͙ +ÿixD`zo!:Uޙ (aJ+M>s' U`b6BHK c#dT*^;E&mR\xזV_F{ɋ®  3-y9WBskBcRcC<k9*v= Sr.{Ai/ sCý0XSY7$e#w*yw9. 65{ρ,.e^$!w \WfWbNkQ\2cojEUYMsgL:/_R@>.ߗ*0 o Q@|{ lԋ%­ye^ӖFݜhUFuk^E A)m߀Qh*HQ_\kU\.-!վRMy@N|OZ~nam(;!~_Pޫ+pAJ%e51u I)3haO}7R#܁F6& pFx&p-K{ߛfH" rKX/5 mjDI%S1W5ksM+QN7) 9,|k'EOEjkPpcmf^3@Ÿg_{ݎқjzk3_WHo>Yn2 ')svp lg/dQ4 gpAxo5<."DV$-B: eRqhfSg^&z\>S!AQyu+C_Or*q77UzPЀ0ل^6BI<JX\)BԺf\x L7[i}pZٷZ.>tC![&p maܵU|[d<.5H,'L0D ~6q~v'&xvdl7_;Ti蟁SQx,;?tA2qY 3ƞ} pG#cܿ@O=7=YJxbȋJPQO"]xQrkW,b +oIvjY(5u街=f%UpK8,iV+'8W8J + Gi}4I{߀;wĎ:->!iT0 7~Ź v-;[e=l[HPXfmh|YԂ(;TiUNy{"AvlNd/\9٫4WR\Lbm-Z|>j5)/WQEq#sUWP ^FbNBduFmv.乀>e2j.Q +t5 %v<_x*Eo=SB,rۘ.ڥXE[F^ h٫|yyʄD=D]L-zȫP[V(Juz7L!.5 yz#PtʕgVˆpE:PVfT)ۓڭa`$ E[!f%8Q:AKlN\:(TN`zuȏArQSeX[ +˜C<خEx$GCB"Zav &4̴/8ub:gZ۱!b}!w=kIx/u+AUʂ~ҷȾN0~/dJneϴ?3|Ie$S%D0i,gt[@MXKv[i\\-6HYf[YlL8֏ g/\l{1~aL~*@֛ҙRikOmZq@O+19+f8: SBliij#Df Ц.4+h録{szN.!CM3FF7rxuDuBzQڼ>/aXYjZX2f;z UK(Zu,{S) THNgp^7hDYv\P]RWv]D +"V^씀}2  `n,Džd?Rwy"6 I-혺FZ?\nnjNA7Q>/?'w_"lJ:^_N@.!YoqhkM RKo`ʬ%b>Gcm<_HLMNLq K|!8E螴esZ Ox}r.a e<gG4[Db +w,u +M иEhP'-"̲uZS5okdm!*UJ;'eEEb>#ѤpgF']GDIyv4l&@ںTqg03<S{F +{J"!~7R,ű_t*EYGBkrܫ{mxb=ckS@|MZJ +3 3: y<~Y;)J8!Ẩwā$euos+ϢGcKy#P6PQr, 4'Em M\!n)X#dz"3\dea]tEĴ۽ŨNfXӮd >&k^ _xҗKBN-ZWC}TCG}%`sҧuVfhLK .w#p.a5|} "17E/$Ρ=ht]kgQ@7I1 hCjG o4mXQ&l]#ni%Coq1Wfm!3ofDcwfJLۄ|"JU.jʋ #oq 5N!=~-'(Pf 앛U:fO(18wtN4˟_CjZ$lJAz.z>id5Q M!-IF@#彤, 4joS>nA2*[ +y/O#l 騵# c{40Hœ&"|٫6/^7'KB0=R4@=0e(O(^GR0h۔jo<*=%ªr&~sHƕV!M=F| wcb/7X(2n[{zP:@CK`wTm3Pi1JZr^yg~ЩKPCDT 7/h";?ȃ"KxZ8>}d2{b9ui@"oyG /D!jVÉ7B}(N;wN0A'0`;fbʈqfn}$D2ǘ=єXߴQwCpKW<}JP?)+A gG6NI=Ϡ{ན2[o xr҄7$==nnu1;dۺdV#Z!-Bd +Aۛ6cv(= V\ ~@?4-d/̬EGmW~yestOpOy}[zϪSx +M]UנcK) O"i$6^ZG7YC0 +x7E͹c:(-rFXp|x"Vnb?٬077p ث-gOtM/UQ?ƼˡkLiظ0w* b$#utZċ|F$u$YgUz?ܬyuFN19H;֒FU}N +}q(_opi홍e"|V޺&~Wz;t0'Hk%8 e- oCw.L}." bGSgik9?Q@.&PD"Pt&WF؇q\ZaE% +;"6fsyUϵeP[doO)sѭ!L⇶sXUڠJxH[PP5yDG*\E|[IJ\e&5,T$iG^gmG(mQ2@qgkF<77\29PiYHTfnyYz,ٴ$-2nX*O(-BŒ +kPdKaSWWFT~8#5R +|ž=fC#"%@-NrȱAU@wfae9WkפGL[p/OFzC΍[ۨ$"[8&flJ>{$x5^97FC#Y~CkN}풗3F`׈.MF)dvdp|W1 ܉(ఱƇr-2 Z6O*NYR_ +ACU g %v $]@Y="+ո{~qՐ0VM畑!F +6$QU҉?]XST?jOCV˫C:`Fdu}ҿG$HhOΊAeKӶ0~/ЍS}_ף5'%J9^U"C="瓸BR}%\' -E2k{&^b^8`DwY2 *GR0q%8dm|H [VU-|hmXVnu>E{si9\&1>H,mQ_(+:v%N`g#c2풹jݤl3)#Ԩ~]K`"kr A1@Gvh VР5 Un.vi"/ +%n)x- z :K68D\W|cC +4wͭ!D3$_r׻E`,Gw)ƽt`AQѯ[COR*~[O4zQ">iy'wnR=j& ]6 jsx0o${S}Aփ_g,zQM +^ ٫e1|Ā:Op'C}&={+ +H Xn&z껛1I;9TFu.s`z<&.~st:v ?Syr^@J,gv2S(XέT+YX"Ta~VZbOͷ%>֧z} fyP&D$0"ʼUn;|93_8:պ5w]K8(1n_!P.!wmCϠ4ӻ>"U@+TOU@l +p T!-li\,Y2WˋՕfhn +::"xJQi(tZri ܰi&Y?U ͨүr$>܉5uhՓ\)Q3/Sf[DsO24b5&H-C8h6=-/[Zv'SW,8bvN+G+j s|& )rJdM0us>oe +<Ĝ΢h (ⱓUhÕ90$^.~"!عE F1It_*utgG~\ w,A]{: :ᮧY ǫ!&*l + qSʱ : ̹>դ:I  n8a7ٍx|L#7n{r}|dxWrLz_l4lq /Wշ\6-ϐV5|*meC:b\F;!Dc_75}X}|t;6É55i9B%'0!4 "B jU @䬣j@ARrfԈ outU%!i40l)gO]X#꙼2)WSU8+̥oa+ Tn.Ɲ endstream endobj 3655 0 obj <> endobj 3656 0 obj <> endobj 3657 0 obj <> endobj 3658 0 obj <> endobj 3649 0 obj <>stream +HWko_`xޏ" `1 G-VE"6.m+>w^w9+QbQ%̙<_.$eIJ\P$ +~_.^_]s?t J(Sbq\_n&J/ŋ}_jxy_3nc\^]xWM.:ӡo^po߾n dF{,K\y$[(n 1 GYxn_sÌPMf ㎟eTKu y$#5nSw#Br jࣛF?Ko{|['zx3F~u?`[ɹ<:G& jl"Y:p3d#`<"8X6MIcP30tc +'L>nROUѥB/]2„0wۜjP)˺@?Ig1#MnZ\65gATŻ\` +VRF0eSگ+{Q]ͯ$`z@BGyIF:ibXhKA0_Θ)kzjq =,5%5|H%PQR/1~b4PR0ԦC\$j߭붭WX-G4yt8PL9gU3>Bz(Tib ]Uoт/Mcs;"(cjZvԭy*m! +v0$gY3EF=X4A;Q6oǏ},i.9̵sX +4ڠTۚ<HPIp'E + NS'{b ұ3:՟OiZ0QAb2fj4TTQ00qRDٓ|׺EU0I#+KYY@Jo6ˮ,FesZ|A6fJyƁu!81mф'_>29k@9 _0fl$ѐ2I/"avt_*qUF\9's/C/CXsoHɓQ̼yl!l@DC̵JgOD +ϲ?T[,'+ 0 +EÔCQK{hW\EzrޖP*2 m,(Ao#esw_pUbf^4J!b>z ?(CFA1.?8ǂ9#d.uwݠ8b%"Mz.#-_p Npob^fY rn>3x=_ߟ.z4B:"xɝx;?Eߢ>0 w7b]Ux+UR(lr3Ϟd倄P1w`Q`\l])oq&z҆>J֏n]9tC)v Q"+j^ X黔#=JFZFuC]vHqz=a߬V)w<#`=+YZ?pA~ R*Sɏ +k&ÒM{VOr~sE0|ԕ5Tfh"&Xh~Y "`tgKCJg7cu2g9ʿms32& eof[WS]G΀B|(P1*e1!$81*ohHQ!ͪREER]r g?OPIQ\IGœYYB4AGxM~Y|a"<6̈́D4# \(BsrTEJA^(C?z3}~ bd/;'wC},R)e>vUyu̸3e,<ūqHDIptq*ƐXgC C|P^VFdڛ +d 2 4}t<T|,J[R +}"QFdKz?3AM/:2,oWn0@ [^I +*L,ԑ IӿP$ђHqo=h +5>3H4OrpQ\Ua Iޤ ݴYr[aAPn BQ<8~)Yj2;iHRדD+s7jвcu1͒lLKv\lsl+v~d< hoH_=iUH^Rt&XѓsYzڼVg7\uȐ EԄTUw-0 E;.76Ex v6k!i[DQB]̴X $74 +ƃiRfб1f 舕aJKA& WM cjƼN?JR=#P]~3OJb",~U+%I݆%z3'Tk֛LRؙd4y]P#(wI{͓rN\Yc[t64K:JS>FK3AYͲӦNU1%E8)t<<'I>wi ;6+JYW5 ?:U*:oQJfSZ'{)`^[[g/WaL:.x$㛹k&!VtڄwXcvobb,b-RƸa턐pO|i=JX`pg\HP3`DI4ʱ͚<;,qM*4<ڔy젳evg~eO'x endstream endobj 3653 0 obj <>stream +0 U@&[ U ?1z\mX: _dY> +=FĜhLqB~0  (E\JAd̞}Pv6ײ{8;U3_pr{g} #T_z7W#~.V!_i jxG\4劄8+6W񷽪c$*1,= 5o;/?33V<y'3h+Z.&͂\GkHfΦC,[Yf$,X.eeh? +BSIw2$yJ&KLkKNP:dK.'fWٶ˭ q{}F0 80T70a!2$W~!B:1#񘮲- p?N8,N e +%;q)dhp 4P}Ɩ>%Mih)vT⹼@>@D=F$cπXG}B>mrE_/b#*^ Sԣ,!.yO޲S'o3"r>2H3S~i j_NY3+wҎ2&[mƭpcXcUq=UE((̩:XFhL&Zte@Ʈ/*vc~nv[tGv  nFEY}yO^d@z?˱6 l6%=,9Yn pj^dдS2&dye_1zĖhQA0] +FcK-s;V`w>,Ԍ7E o]=f`jS$Eu7_mY]R 鷀P= jv:mu0*A0qv+@}WMY<)fA;Yxx$j(,ŭ-1(4Uve 70ю( ##~g.^+ֽD#o­[=_ |!e,5@U4G:XKIՅd'7U޲C0?dwM` 20y 7[yRӁ9sA' Usqõ?fE$nxFbD1?5֧UI@m:;:oR6]?MWĨ30iE- +-{?n:]gD&B6W' * ڿ>8٤8\;ukmLr?ДUO$Kf7K'Y7$QGG# @+ 8ͯSG\aC9.Xx;Fm'y251FBiR *f6" V&Jn~͞.A6 +AmqJTxq Tpx"fF:Z(]yGDVME+zx|@.ZXd[ˊ]y܌k 8},;J +FaAR+R^23+pvD h,gsBE(>s!y$᜵|m5J$p+(!/nE)6cahw"$\B:>=}_B1%[H+Yܾw#Tn8$k6b +~)r. 1QRX%~d -Kty](D$Q8C|U&+o Ҋs%L#'M"D~ӆR.7L=:2-6xJ"._?*v*T#I# +lSsX\B?Eصa2l 0hzT{R=hx[67t( M |qQg2s sm̀!@ P(v +Dq:DY] +<H/m eT!S0F^\qr|Cqn"7ͰmxjV#.T͑&)9 +o G h 5[U4 %Ԇ[;=n } <}30`OIWϰ"ȉՌ>?t(ȇRG2Oa74p~]v׬,0hѡj R[]\2d;wܗoF3順+W^́oZ ªqm*{cB{2UwߜŇa6akPFU~zR*3 `荍ezF19@`)W;A :SdwR'X _Pj?)kDa,@%fr eWrvjXaVȰvA~z ĝOWk44!x'Wx'ְG}5s[{96:B?Cp8鶎},PMSs@f8٥T)U8=A]`[h2y /2&n3W:d wb VlTvG<0,LQG EttA!n"6$G׺^g)3>FC,5/drCpF!97? +˯i7;J(OkR4uQU):pg>^m#-դϻ X":C>alzAu?t\:M-ǽIRyA'Qowp@sݖ4Y~ :*߮`"=G$4+1Pٞq隗Aj+MӅz o#;IBGs.az"\13ɀH_ 8Bj(^ ^ڽ㢋sĵsXVKP5fK"i%"jf| >b咪0}--P9]Ea#;J76!rzsXE(%r/1kTo{^7xjW0Ӝ%.q|gsL5d@wS".j]j _ Rs`, %f jD6o[1B6C=-$huYVUY9v G8h6_/;( LdcցVb n> cU̫ @@ćQPKا'`" Jh9Weg?IQVfB2MHA*qbESzI]^u<^AlєҼֵڦ?]ܰ\|T~lJ*|Bh ^ɆoŢ[:MUaq7x(#WCj,W7j'} 1{)v^,6{&ajO$rV Prn&h* ?+s;ՅJkV; wi-n(zu4:n$\ Qq{ţzvBfʤ/*r'7ΣZzGr~=夐>RFmwNuk*}ͩnr-z=u)9} Mn tq[A,OK&i_X;1p{e/FZ<$#tձ5}ZJ,W6bsMFwF(2;MFt'áS,a4  +YfSjÕ +$}"Ta?9f3 +X:KG`ݒ֓/N6'Q +"QBp i[IFcWkk͟AB3VI|x=&/I(+7|c:$q*@$@8%Q&fZpI2$QUY̨+b0AI^.4< +B +%է:uty/҉G KY[s. ʽnOO-\s ԙ,Vhp=MbQ¤h}Q5͐徾O֔Ǯȥzqf y\@+ӸȘ> }D_P[-\D!1̈́8#tig%v#v`tc\e43LgnxFsK ~-h(owi밠倶6~OZvOySji%sbg0nw %bs7+f\P; O8N,1ͩ=^Dရz Ϟo2E1nf51T&X=FP]Sh$Sv.)jl(Ți\85.a}6?› Li3$4Crt[=D׿dvGo &ZyFº(+yUUMmmy5z>kY1?vwiA3U=l;}bEzHx4/ g>ˣ|`5AO{DNvq{*w}sr/: ?}vG8K|Rn !AV)-X| \bgyx@k䋎"0!f6!d N+)fO~>oYgÝPjix5?UFM5Ƒr0S$WUj$FbS('u(lqAIt`O)S~Ue:ؒfcj6- Yc=h֑bs A͞ UD.>M!bp"I$'/y >GItf#7]8GUǁG禑~Dd{0*8bkBT4xmD丼o{{-n씃 +D OOƩf{ cS3Ck=|yTmX=|ofH V8QZ}Sx _4Tdbq\2zti98A/H +  +(V+2%$T +t<`xvHo!@ 녞<%HO1u9Fuʟ!46J0+g@Nߍ"i?58ڝ2hGzc_sl> 3 +e"T=MRL7SKNi1In-E̽I~!rv)p@U/vl-$!E>U!C> > |nh)K (Ĭ&AJ^S +8zw]OyJ>XqqN*"@ʵ귭L3V  S j/-E`϶TAY(bʧ)xPBP傽iU7\3<7,ye*KS!(%-q=0>Kث!}|ǂS C$ p:T ڌ ' ؖ|\ ViD|){~;6 +Up{R`F"!t>r틣GQ N4T[y@;CLN?m1@Ns 2i׌V_(0_~~~,֧dI|7D3E&}0Ls@(ǟ{P`#NbTvpu+ut϶D}do\&_rɣ%A/yM B褐ƠF}pd1Oz|=GBY%Ҷ%g1~q?LliN$p_PmѮ[c[Ȑfio8}HІ5l mz7Qz?"m 6i7 ~ ^Uz(.iu*Ow!IFlԺd#5 a שQRX_{*iόj96ʂ5Y~GDm5Ec +.>a-a4 WAϨF +}@m8,;7io;^.(Jdrr'a<s**f[r6Sgo-E)8h2S^íU+$*G=íd)t(Q_^XW9AXVEHB7QZ7Om&/|xuTBvS7{S:t\(7[ 7#٣@_gGvt_dB룍ȪE xZfrdG-2gRD0θS_mw{dUVg@Cw6>?\kl^mc/l ۓVI)FBy/ !D mC:GEvkz\g`I|6jgY#L!&GM*jtԟ?HP(j4Ɯ>2˃'ٮv6zN4_@TPN. i?ꚃ 6HӔ QA2:_t0{Q u5yn8rTiVIְ'CIŵ 1n I4-[E'!C!F 7BP!!H:qăȜuX:(FvׂmsCkTW=ˡP_"aȘ܂WGM i@'=sj?h$:jsh&Zf] n*U1 ^_'jЏװ_A`[eeb2%jԷMTsPPyBNA閯a6ɷr +qlR0erP/zVj=7EqILt/"m[^J=#qTP`o $oQA+*]TǧAeH70 q!A j#&Ȃox%{2ЦR /uxZ5ә]1@066=CV~-7Ix͸3;.?{s6hXe`Ǫd}UKؖ~&Jg1ٮ v)T + *a2}ߣBu +aObmh+ln 3UI>^|㜠ǼH X |-ۼpZ׷H(kLFKƞL'c!~2\]7<nOMС1;s-N!3|D)s)86愊uST#{CxWݬݙ~[D'mV Ou2|i' +.9@Cz\)8Y8mU#d{Cdy8JŽS";#iA{{"Ee*VUADΠ'߸mnCk,s)Uhvf|R0 a56)3I'VzDDIr0zs؈AeWLS'>UA9J7t&Lbrq֎zˁ 4;;QvjL#9z8ΌQރqA + kd3K!@R dLF*T,CPIA|R"6OxCM' vt ,s VҮ 3FhU8gYz~ȵKڭO08݄T[ސ9½zljHFQ z5q13@^+e`6tw6᯶UR$K  R_!]LP!iUzHYc#YG5l>77COf[\m5LɯC"yJ.4BuIOJ F;Q$SB@`_ +i2ʉfzn<VR&toW+܆֟K5 vw eo'Tט}{aRՋQaڵ4~W$:tNr$Zn/4hR0q̃l=M_u,UvCd +-ˈaq%H +>)Ηs\wYܷXW#$i1SprٛyUNwS/X3~1*([NW.@"[PJ&AeiuˌV<%Hg$Uπ3jLr)aB7#Db(oSwAY7'f]jPH>螭lo2@sQmI{YI@ fJ0~ + VXքȯ:ygI޷a<~( N4*<ؔ#E5Tߡz+g le8<`^ڔu`wzaUeuR_1jߢ#dzewd~spDbKj06mIs$ +w߉N fH!e"eըb8( g^Mwuk М ;S:N'‚YZaթ{rPyCO:!ݡU+ͩl(Md&!96n ,\g45~&1K>eBfB{ge?!. +'_BZlL'׳NRg3--IK'A:qJ—H + # /N[dmܥۘKXN{^nwc/Vz'z `=%] +(_aZ^]d.T21E*R +{~l]$ȯXz,@@6ȚۆȤ7=R̹}ڴX>`7pJݯ<,rVweߗp ,Ԛr'{_n l-ve|V킢W`^ j8,4rHG̀ʀ-/A!5DjGuc@P w&6u3f2Fm 0w/0J%YɵRn7˛`ƅDk[` +-0iCUqw=$dwQ*lh:A_iJ0P*n4w{.<~ǴWzCvI04ķt!5 )Aή̳wڞV!Ȼ&X4_~f;Zs3sn 5`umVX3b#a`T/H.. +ARKoǎK氺b +$kQW֊F5xJU;JORi&j9^1`%%p?Mٟ*g3yR"U{I޵Tb4i"}|<` do;{yPK'jv";۟h533xx*j@} y QQ2cK=иz!;3iA!?*r qDϋ$yUn +kܼF2qYgҕ퓗HY51ɇsȨ?j'?#޳=jOZ7F)3+7);j'VOI65߉}D#2$`d4A?mFP_oCޒc~䡵ZKU* m+!`_͖=F Y/v w4.i~b7lNg*ˉAE !\bQ]5#xu6xE 4v"_a |NSe[ 06QBV1 #=fP•GB>蟬 +`枓U8 z[kجZD +bE_U@ + ֮syYyukНH-aw` !Yq/cT `C(] V =l9<զk|uSpXW 3!(e<1v~ҘuXf#ryo/.p_gx=LE+O$@)ϙoӟӵk8@Oւ\n|$[Sۃ-1.Jdն=iduR9vwGxuEȵ4]>LT&&E2~OŃxX,\g)T|(]l3܈=^s_M9S+wӂ[rQʷpNڊU!,{F Cw7ZUߧaZ`R92gBf6)ňshس`rm ;B`I{hY2t'&'zM ktdp]VHh|5K +PؿL_zzZc{jfgv?OyYS-+s@QArEO0UGIv;lmEb^tn~!aYPHĔG6GB8r[Buv6\ B4d ȡ B~yj8uQUMN#]nBx?ߙߥ"6Ԭ"x%ܮ*߅gZ[ձ!$o4.R@@(~>&d݅' fk3i3c]Lu'V2'jl)uW0Eپ7gx3fZ΄v9&׃p?u`uK@.pda6̠&1﫝kiyV,jEdѬ(ګ_%W yxb[ SH8(u[>c + ltߑZZ@kznO+3%rS$?XWd܎\: 67 jyR '#Á섋,*Ո r54`e_de#,>(qW5R,ΰ0ŗИpm +x_DHh׋y1)FAIo( }.VZןtCL.$06 ?HniV-Gls&Q諂=`TOiPC*Ǵؖ_-Tb_S:әEu,caX`wګ,BA-Us_J~gdC‘/T'_95OR0qk*H3/Ћx4o+7Uq8Z8hP=.^84ޑ'nGb9w08u=Pda&U ԙڿG>. ȓ.>̼>xAv""rX;b}dl.:뫜OM:CO>vۓfT"?T '1:ji?NI4kk +d^u/{-B8?r+|vn*lGKd9r_ɀI'~dILT՟pGJ\M{Β2 a]+`}3Y*n\l~q)R{<= yk rߧHVʑ?n[=鹑!=X@x%3Y3%t4oAѝ %tl6=} .I_nIRg8Қܙ10Fjg[t;D} Vi8K3VHM]G\ *S@60@[ѹ8QT,ۙ.F%{q!캺?7}b[F0b ldǜH|SĹ +\ -6ʍ1js[P8/ "0ȣ>[*~LF)G@wG&gaXJkԐ eJ{YڽHVýZj4ۺzG(JК|sOdfی)gPAJv+t.zn3$n몸ե|JG`WF˽[|DSzFy57몗FhgTYis8@C[ѷy~X3PP j4ډ2; ZGP+prf ǖJ{scfJD8idlnq&-fk\5nz%yrk؝}G C`ou\jrR}qZ>:9xnD61\>: +%B/V_KA[TQ?lQj>p}፽B/W lS'a8I9°&f $z0`c6 9Er߼b':yա;^^oDZ=3W!MȐV"\4@6h8"@VSzS!L.i]9nU818w.GCR Qv]NzX$! 4kݍ(iYU*Kgp.qf5N3Sn7"OYa#{VK.6I, Jf^jJH~GlZ]ԭ5^ +C\ֶ$ )2*Рte0ZY+ Qݧ3]0/UQꦤ ..V +)Nkn#E qJ))gS=nY7#.j|Dqgۉz2VC^6ymx yT(5muMAWkHCLzIB#c3e,,WvkIyB3K>UVE-OhVmIȪUd dT)>ɵPZ*H  n4BEb z]ԑa7Qtc3C8Ҭ3n`|?>K7X2 +Ҩhzr &.ZO\0xh)хX*SL!fN-) mWi)$ oC0TcFۉ7 cWHLmQrhV: ݽcgx{LDP) EQM_l_9|6_ 5x/޸rj ėz cHfGW/5=٬h1+$-դ\;^!)K=KL3B{oԐk9x6 r9JeTt:N~>%]"<iIX~61QtЍ :gY%['8doIa1T2ص 7M8Пe x\{2ۋnAmg3_g"=>Q% +ۍUaƶgAn͙k= H9\>]ߣ gxay4(5f2V u*CzcsL{$GH^# 'rK%σDciXFAB,<ֈ BԸo'[*Yݕ٣0f,F{u^NzEmOXfwvȧf봞FL>c>ݰHc2hXM ]! NC!SLŒѶld@`r2S%l ʙjTN52O?YkɅE1(ll-"#p}B*u>hI9-=J/V`sdSE^yƖu֩2y0iBM,-coC.HV] >xP22;UEhp ViΒ&̓6']}UANJC}4dBC#\lY]V jj%kg]^щb$FDdI9\ /6.35J=T؞g|G+gkvrts0鎳ZТ^i132x*aOl=ڊK@]؋> ~mw+/:&i jԺWK;=;3ْOhvU VuOT!+IxFy Zo%Y7rm?ktetR{:z=RV1M__Nrpp?Y(NtYtgA#rijJ il+ҵ0.:1ԈTF= hML Ham"pG1Pp`3'40pPbL.N7c%Yʍn㷻V H ui 8d@w=$n2(7i0㸧~ ڑwߜ]Ā (d73‿=̯l~j8Z%8'n76fkYA;lLʺd$ri~B툜qHwQYChpD;ȯ:yV @pnt NN-|<>F/tVkR }RyB(Åfi1S`8eXB}F02rhXSX &3~Aua[?h8)2~s +4utcFV}]bm`!v4Tˡ$ȏ72`7rB2R (8Q44}@rqH w4 /"eR"u0YC7ZE38/ 9Z=*$CxǺ2!?RbNr`vk':W BЇ94ĔHp"'m̧7B`2mBل+CWˉ2T!ٵƐvE/ [>PlyE2< +4N>x%,.ץ8za Z 8jSΏbIm_Mhǭ'cκ77F%ap|Фrv'; 4[#A!ɲ@H dNW>de( +Z k̎u-#}Tg=O-W QNs608"Շl+W8sԯ@dVik4+[U^Ob +P]|H +1n-o:wM"cκhʐ'ѭ6%CLFI/$UgxtV D2yf6.Qu&-!q!|(Xw"נysA]ͺ;o +/bj|00|f ԣ4M 68m} -F^R Ņ^G*`#CmfצW{6mj̒Z]|պM@9#֭)И;+lb/t$:}Q&sə% }GYh ֺMU4^5CBE,}p¡6U(".&V._!`$n#0 Y@!A gh!j"ɶ64i-DZ$*PKw&=O ٣o|+{ň-]yRajri2@{7EفP#Vj*^S! M9o~SE>$[J xj^U{M7]eGgʡIUfƚ7@$&㯜MGb ?3uCϦE 5ށH8Mrз<nD1_ _lTəЌ\P,S_9a 8 ^㻦d{X=Cbt9Q>""z[hH)6#ϑk"ŵؤpR3^vO4Bs1ƓEIИ CUGg_DrD&=K+@ /n^5#찰muy Z"i)jf:.p8C' aU_-]P +I 8oV}{h=m!1wF;{V"lL)WVfF'\U0bm9Fc!Bce(&˒쒚NR7{9@w0-BIǶStmK,ŀu ӕ.ʝIh#IQ<0P<ȊcI]=ocT0|J(&ث.L=Yo*t\Bbw~]jGgxo 6"RCfvPȋB(]c}gﳆ ,I?3+MO7)ܥ(36H,yp/>fG2Kx?4Γ +Pr *& 'dä`Ф)``YVy]vDigc,x3֖Nd;tQ3 zхmO<&[d;3wK[A9g8g;l}5}75r㺽j;yb 91= o33ED +ӌ迴ng(;]f`/Tj-Y*B˝ͺ5 endstream endobj 3650 0 obj <> endobj 3651 0 obj <> endobj 3652 0 obj <> endobj 3644 0 obj <>stream +HW[oF~c +D_E:6ڗ ZlJ⸿~pnx> ϜJ8C YQO3F*={sz@w?Wo_bzwE TM%u_Y+$1ppqlc~Xj?zhkջzs8fBcNd:{q.x/X8DJqI޿nv]$TczٜxcI\>ߐ'8c)~e|pdߨ 6h:Nw}wׇ,88 Ua &+@YhAt;֛` t4JΩ%&%3ۛ7/X|t@sV|f +{yY,z` l 4ບ84țE_kuۄjf_0̑uw<n$}>bM%PrL'~ƾ +ago}̀P+yȼNAF4[2С{=>e@Y|h%_YXœyq5}8!vB痹5>zH3@3O\n0W5;Sg1~k6]yamy݂-bfJjtR Q[8 t]Rͥ8J v+>'t1g2fC~Z`-e: -fszl/iAuq^x9x1 DOOI^8QDKXnnLE39A0 +:"C$cleߠ%r}L֚(wҠ'}\ ez0Wm=֥]eŻ@܈*ae.tt߀ZLԒ9" q'gC}~Duv%zsg饅cIg +P=sR9Yg LRi]6æo.Pz?lgw8D[|}\gn3*r<&(gnbK/P{FYBX=DcHKbxWgN-C:L-|uVa}/ ˱)@^0 zl .|, tFR~ӫ] JP4sݢqgK2 ͗M8^/ *CiLŏ"<9]ss<ɋu0v$6Y\\"]3TAuxDҨ:.I׌/&N%@L +W^4|eJK% HAlyA)$@Kh$~P,O4>Kd&5%K-ǧ&kӀoG4cUE,,f󂸈/n3ȉ)?vSdeq4Μ?E(ZNf@INTRp/"4@(92W];R^0cAx~.sKES}Dr,4%R ɈfbDFQ!)P<zsQg\ӐBfqFG NYB-Bz̳ ؃oU"zKτΊ?#5.TG:sz.vciBK3㲲B-07$@"MB.KbQ"&#O DŹH!O(j endstream endobj 3648 0 obj <>stream +0 D@&L DUHKP۷:ch*e; 8s8ARAg踻Zo`x*H1D9W! j"b>[e_Y.J'E%ppRf+Fss~@3EgBT$Soqdlg;fRO᱇V9l{q!uD/op]itSKK}a̽h={,rLX]lJS(#%{ pKS@أT6#`o>(𗔺T7kYpO޷?c|3sZ?(7q mm T ˷sij ÈFO)r1;2jW4IL>yewUuuV%i]!򩄼g7gD ͧnZGxgM*wy5!q5rҋ NjyLȎWTl.FDִffEgZ\]4Ra%j>lo,^CbMO PG5 }8r~-Өav=FB- )!C^D&qP_$JcJsdyIa0*s5PJw)6}P;M f 7پy>dk,jDSYa_fg&g rլ!@IzīrW<*i{$t\ IHp읕'7V1"XQTb\g**5CZÈ  x:6΀Z$j!!ڈh/ fYrZȾc7`C#7~䣇dUj7l0w $d.gڔ))F9kdb3 fݮsJZ1w<@ӗ$DygElKĨfҵT/2m Fd$۳t!k7(ex]beLSf`՜q=XTTRqշV~OV>ut|5E<4LRM!WVZ -^(a >QJi1 qdlU=D~hfe1HnLXjR<p`yKKrTtj[/ߕ`&C!cJhO>7j|V +euU=|7XMW=gqTz(v}swpMɳ/6,LrVcʫ̉U is xmbNDVdCMU%2G՛dhDKvE#@:UAr43NזƅZX,!VCӋTlᓢӴه@5Er1;X6 +x5iRI}S#X׻Fw~BкWv :ç$1nWµVw_%:h Ey01Kxgѹst.376=\".'y~yȱJuB5.I+\jPj%s)d[늅zZc-<şrfG.*Q V__I4ZQ^ew>cۘVS) Ą?.NcL'S&.&E o+(p̍vhh2{6 =4A g_/O1S1Ǯ Ps߰PBT>\hӪNtEͭ1 \5y*ğ$A͇mX:kDaɂ|pko|y%%N0:.9C)H7&{`4l]$O\,ʠ@p3M#F+fZ g4pMK*-|$q H-<6P')ՑC /__RdH}PsE+P>[/:nb`I $qlKUyߖQZ>moq~^M1q.OΘ70# U,JO;\%qQvkl臩|ܹV1ғ 7#-8 bAkK7y%bPbWtKUأ?s]aU52ćIZ.|NCG= 9wZct;GjIh ZlF?D:b=ڦT@.vum MNG?+ehքw-;}q֛rt>xOW+k##eꄳ"# H;PXCTSYuGi6fI3~g)*_WrЛZI|N)qAI_7y`5PI7thNMB ~G@?(7hs㩑;!p >[WltHfS2us({f$ _m@zƓʼn6|#nGtV=f5I۳wcv$KSVZ"G/”xKvaLvەT%Tڠ儡c#^Z=.:t3ׯ<`,X hy +)`w*d"Y +cڡf/Uv#Ş"# %~٣2e9kB/lφq9ct9ș/V0 Ṅ\@0-G2rFh0͖՛CnaO+C3ihdUyJY'M [i*x$vr|Q̛sٓIVmU`s9OdZ>-s\hN:R4ERDapMr >3V8JVcSYr]yn{}mLUsE +zݔ|tqʢl, +)F,hmDGՎc-⵸W;`kt9 +Q3T9JXh +ct9~0 d-ﺪD&/#pyr&Eaa25fJgZmWR݁+K{/ƥ%*9dfDKBŮ; 6Czނw'"]GR@7pdtN +2t,%IH~I[Rf & &m:cdy=t*o;! ĉ 0רX~'~D@q<\AB쏰f4k JFƔIlm&X8~͏t sVNU2\iᙃVeYTr<|!ZGNQ?e)GxvLE ce{2p F +Ckq#'hֳc hn^.S*;E[x'yIK?9\>h-36Oϼ͉IBUzB|DhҲsY>p`HEZ;p ۰-o_ f^ֶ#~jk*I<&HdCop? +[O=#K +ˣ+ tB[U؆^T0;u%jm+X.@8zrBb )' p hzQ?ZY DD3{ǼQ5U|7zwN*f}?F`CF1e!ƔƩ2%`JqO(KJ)qe[ӑM* _ b-S&n!8{dElY1SxwGU- 1y8Aْ}szY +2fH +kˑj&dWˁ oM\)͂1g='JSKPXl3@N't,ٵ 7erP}@gL@BQ+ۃ]^5F!x :weB ۖQ&?nᅝռWF[yA<P<E\`46-iK6q|(䠁ROy( bS!B.Ǿ{e4$M.^Pcӣ9-=PYse?Kq=F`L7sZE (Vn:3id{70E/% +#= b^f +660o5*G0%Eꆆՠ6;COPَ GƱy }PjB4gr + MwIn=@JY;Tr\+#"e%BGS$$l3N"Nw?y3Z5k`s0}D'P8An 6C^Y7x_fT,9FΑOsb#A `@Lm|zQ_ᖯ](hS&]1m+/wʡh|{S_XdR{pFO0SXSxt㠒=3ScZ"te7B"j,504v/( W"nghqkmՉ̆̕xo  +_Sg5\$i>wŧuՠ$0ܪTR+),2BY +FɎ3uxBCMĎ]q3I +PKʕVXfw/0T}k :are&PGfOG}H+ːm\mf^ J-ћm]fM{Dk3a>@ZJ/+9/o[K<8MHYSנ82`R<rYW:Fl 3Jâ;2zf+fI +g5H$J",WvՌk)bTt+c( 3-9ѳAtsDA[$S۔6W4 7F}R$E1yP|)z&4~94RP-'wGТ$x{DsORԌod~*{z! 3rR-YHumhٖNޑ$#GzYFy"ݐ.O *4,u+V?qN]l%IАErЀϮ@!]U$u,UtU&op "4Zgg8q,ۂYS2޽仔]3F[W%r%GFJB>G|CL*t$iB%M)?^Pdl ~!%PL=-N+?: +!t s* Hⳑ'80U0 +δC,rX@zy0Ͷc,N"w6W-]QTʄ'8D"Qw /E%a%עZU"M `]=?ܘLD`EHȑ00#qcf(_2UCb?Lm4o0&E,rDn,1%\%hcYFCdzmO̥QmTH EhJ`糙6K'?֝,zKtž{;KcL;5dac#Xʎ'gĽ"Yetu?gRp^fŪ fW%wL.-9I1 Yb,n~K?n~BZ2?\8Ye'򀒦jUVM4<w'oآ+w+C6|OhI C.!Qp:Akc=xAj{^DF'_0_fC)ua,K嬘rmdhxMKڣnppuJhuٽ^F_)i rfl,`ܴ܃)zvb;-q:35/* HlYІßP|X) K6j|@!/eq=eNB?Q uz2o/%; + ڝҮw(yvXfg/$Y| R@٬y<6 :w¶mh:vn?z jKܻ]#wv!p2.{/?MЇq܏DipŨNuLyfq #;+Gd̜LϿ.TSYΦkp6=G+* վfR?x:{m[^6{2@t-/@oE(dJ#V9Q\Œ\@cD5^C/_}^6x +6K>*;F t/t`cCtM'偶0Ao ^H4abڟyF'׼vh`@&\H䗭i0;֡iB\'H'gK^kv̦Ͽ}yRH|%|S'ۋL<3Ph~$T6k`-Ac L+ R@}Zo$lه, .S`F4K؍Z"-ͥKN3(-c^Uv@7*Ұ\D/;Dwz;;,86Еcʑ"o0F ң~5ېXfRR&"7>!n`bmn*M.2aZhb sce<,Mr/"Igف'k Qohw4A ]@KVlNsR:_D's +#!x:ZIje(v8w3i&Trdqk-\d 7wb~U|(LF@G(y Uhkxצ9OU- [R +/[l!KOje .FfW5j,FsQo`̶cf8i +h^ʦiŚ$3ܐO.Oj!=^v>";LnD>CP>dfgǞsE\D-'EtA +{á5!ؕ΅ߨvaduvP1+jY>OMI,W/fELڃʡE"c?|)X]7\4(`:gߒqaU-y"fAuDsteN+6:Nt_WԐ`䛙8{1RPxTe2l\k +q֖a%ZkzS:tI&BQA)ph6&RBK: ,|ZtOZ o赶6~i|G T;à3^rHMc&POP g~ZyX|~[[%M{g)&jF(ls6GW$$v_ Q44 rRiT۪fefaHB'2jNrQ_znƗM_|q/yJ AڡϗJۿ{pNX_{pB9JChRvm60̭ڑz6vm_syHLW~QF |3$$@!;M(@Or'%H:Xҿ#frl 61> f'MEkg66,78Rr=̀.:&zeyLRK^ўx\nޫ{@7M!E{e :-Ĩ<%_ >YTXuV8(CFv,?/O3HH><$lו>8tTB-Re0a=VVusiO*=_vh|a Յ`( +7Hſȗ_ۣsSSlkKV$_tygX^g5UN*Rx6 ޖm?Oâ?3!$X_nւ:VoIl,Ӱ㼝2d}LDr45{Wﰶѣ¨T%|V+!4GtS٢Vl.8 +{s]"wX\RWW_x.`*˩W# NfCװ[½N,KD2#R-NYl%~ rSqZ}C6Yrb4|\mUSJuq yEXAmpq 7;ݹ="J&+ZfKzb6֫'`E'۾O-'/M,t?*x(i6޷4_N5ckGou @^,HM?ѝ<=,82|}E-Vkz,ɞ{Ҩ9q."Oet3^+8>sG `^0Qai5*OK0O,o0 1y?2mj~$K`*NgĸO`తEԄk/Ksd(]tIO ` -3pMqoNea30TI$͌ +e/Y ʘM-. a3e,cyߜ~'i^3.N( n3]9KOEM3]>Jo!U_[q#̈́XABlS*}i5S2vSOn33.;3lOrHs'>:Y~b3}6]uX}ؑx,*x)O]+o,Ovpa>W9ڞ9iiV=`l¸v20Q1:^Xɉxe-5`2 RpCZw]a0 >>$itL?0CyZ_@`<}[]>TV2gБ1bcR5^v! Dfq$rQZuZMزSukz)IJ>(db"=GmYМר=y'q 35,,غO` +~jW[ؾ^^ E2rֻyfӥ+I!:tճ~*Ȫ%6s6]ZT8 +v +.LBWH `1aC hZ߄'ehZ0=(Rƾ~Otl #to0wczu^I6Cav]#0l~26J(\|'GEEAnIf`\ B؎qxz:ٽrI&TnrВ 3:sMJkp2J\0WL92YևHi%jጮeX,Ddn5r]3XjZbTZ!ٖҏ(ۍ='w[_"Oz?jeOWF@e$TdcCl;\II0gOB06K/;.l~3]U;g ۓ9Tjx$Tj>{@Cұ2AW|qg*`xz7T:ӳc?`C[ w.; i?5=pfsIνm_f׼ +շ4=ȐH֢|@Y1'xMoyѿ5`˹6ܕv aX"ꖺEA31duNKAiCfj L +>I{ZQŁvCΠhc0P +L<ݦt14?kN8"EBzRܛ Vg..>BYhJj ʻQ$zvRSm)go\m|ny_dPP=7CQhdsC_N~fJoCڅOCi1+hIwKvCLZ6#]WRasqj눒e[Ip(<ԆP 3H;Uњ(uʊ-lGmhkmlv~լDO ߖ|Z6^BScaIt +*R|_,޷ߴY4ûÞP=K?hxKqaekv{}t?Hm>ZLig-e$ G!WSٸ_+G`aM)I_ xMъ ݭ3qF#y151"Io3"DM;B/!9Ds$!fsj&WH9(xFsN>.}fE5< jKb.3 1x+n< #PLU.!Tkn_zF 2n֦VJG8dˊ -8AX?JP֣O8L\Iz{l O͆dcdk%|r%+C7K Eձ|4,Bz,>oUbI-)B7D?&!1k(4"YZ~`:{$$Lsb!pBAmG7hũtj +՟}jprp$X4$"P[I·Wiuh)4EG{Y;abS!iYkE:tOXҥ<ܺNTK+sGK*3s&z Xsf0œ"Y >NkL +CކoT8uK^g /a\H~K5~DV)楖, d!\Hy?q_NO BLYSYIn񞜻ۨ-;̫ IƩdp Mcۃ.ӒZ$Q67kVVQx[ \(,K 4z%TzJ~9o6…[~ՄMf&O>Yq}?n ʾVܳi,+\:I%D  +Qأ-|h5biV:, 5Y!h)"d5CU✄NMNܯ~6|4βfLv1k8L't MmmHpՓ*[7I)iM;FSSY< trU'&-e@{!n&MV%/Ae 1ӒgBqdLD?fZjI4ik8BgY)Z$7MdZTa(SPBE㒃Q!zRURl'n"4w`]e>$њІ.}%*t> ڰ _!~4l1*&"hy<7+/D/!;4QkrN]VwWwq#6"sǕ8ǰчMنhI|j]^W.vv>ey^XbOT`_ kq@Z{+dj~Li3 #@9:=߳Cq*d[A7pW(}`hӡ;{8aArPUw%?tP%=C%ެ8gL 7. | ߞiḶBƘMC>{9(~j5zN\()- +KU4)މHoMiڭ_WrTבzgvSa]T3VseHCt1Oqd\sȳ6\ |B4%Hwkڧ8#OAZ4Eřbj +-jO1ULS}'DAI,r4!*BBu{^Q@51KKA,4JΣtIM'6A.^c%q!\}GM8kD:Z㹧LtrlXekˑ+bӹsNvb7{<:+rF;HX$c Jr$N,sC5| +5x85"zahAsؿFM'%-Sw:3>"܊Dҥ(-!95\۵9b칆t̋"4gIUNpޜȺ/,ES6$#~HrQt +M7) +h],ͧxI_~%FL$ۗοQ(CAykEfܠ+jӖ=g-D~aq*_)Nޥ R +>lY|Ez?V瀍Ac@96o$5dLk,8rIlXvrG٣0REV/V-{ܨzt^n65t8F/oy,)/ףeQAT OÐq@L;ͥ5 邂wG74XJ_=Y3ql!ė4& Ubq\ĿÁ{{eo +"`)!A£* +JNMqwR)# +[}B$ ހ#wn0[o>-mHd]$5AT8tKm(DgmX_W R)O< '(ނOQ|m\$Չ9u(E͞雨R?Lw_VNm̑==Fb6I`pab`&U +m"cJk80UܪO?_~i+$Fۺfd~|>' " 7~/8( [e$gLBݰ +cgoT|:YɖtVDr^Ŗ76xGD*砰 v١Ai!vE-aci2G/@{F' :İ|8B%}2gj7}Ee. .XƯOHnx*G5K bq,slL+L0~^̾оq>3*1ݥm=J~6u)isaXLVN[F0&GJC?m SJz+|j ējMLD=./<ۻ[Y+S<$yE +̹1<z~BHUx8Yle.rCP K +emF3@3=:W +t{'$bt\=ik,&m$)Y)'xfΧ ^: +h,h&JWh~@}e!\gdΈڗwrY9ɿ;K\ÕCgB*X8ת< "SC\m+ep$)aZUz:`D&:_19PD 궈t'F٨Y)QHγЗ+sH|wnb;VS*9DꦘYpf6ؖ>}DEޚV'`AaYʍAMJꔟ110G¨+jl=7Oq?1fy\x]*m"ɳl|›9i+%ZI_a$}`{uw2 Ȕ8k~=i^f(xRi373%Gԍb?m"TBNj._5rڔ.L'pIk9N~W.X 4\`΋r4|KgIeJ}%񗜺n'( 6 }3 yD1bjbz(oqN S}2:LJAی2ZކlB0ޑn!(<عbG%8)˗<*w<('tsc +8(Fd)oE~ɛ^@"UͲrˆ [8[udYMCvӭ'q\t endstream endobj 3645 0 obj <> endobj 3646 0 obj <> endobj 3647 0 obj <> endobj 3639 0 obj <>stream +HWn}WFv/^C^#ذ"ѻq,I;Tߦk.^$LuuSo8(d8H#go]}D:>kj >@9ƌ(G g~F/^f_,۟g5/-qenf>M/[Ft^||(uqRM njVF1CSGDmrYVM}6vHywS?'pʉ fn6H( Pkk붺-SD2uuU&(,ɦ.e0d1&NajٗŠ˓:tqH>z*wC +'82u*o܍Ka4N?lk!NPM9! QNx۟HYIh1jy(b]EnZ <| _jtܤTuX\ovݤF滛UV]¨NѫBmMABQWq9㺩CbR6nbQ;jzz4/Q(IBoK|֙`cӊHm+x6['1u, 8ky0 +`y" +PO Qzb q}\.~Q1œǽ10fǦ4fԥNW(&lRޭ:U(2/nZ/ ٧W?%SA8➼M&1rs7aXb;@mRu&J'67STRTcq +*\n A. 2d}*piC΁Moo79 D39x}5"_髧?DgS8$9̒4'].cΪ}|, c?:_IdszLdٴcUʏX74y#1:ڴTm]1 78j=>aQ!`Mz FPS"uUx8%a&\ű` xȺө guu.Fq.K٬6]_Vfe; N`?t{T.,L-NϞ,1KGL,'˻njPlB vxzGNHD/HHAAw_|:}GÚił?ޜiը!,n ҋ\u^F<b\ue8vu. mblXCP:V{\z(0)JK^Ev Zzث&6] ~w,6(CdB5y֤~ $! *Z$%"svE浑g뭍 \QO Y6[#žG0W0:h94:Xcx㩶/P0湤D>]z4йw%,vw#t On(Ia=̯']|&(2_8`z0̍ Cf^(|j@1MyPۮΦ*]Lj9m*46Q,#UBAc+-h[ +R)0e'輸EΌ)F4#rdz9(*Ȱ VvGcWr+ 0`v endstream endobj 3643 0 obj <>stream +0 Z@&E Z*ǯOrŪǣN0A71aFiOooēTA +AZ_=7rU466S\@o96qSJu`{`/[E^e]&*4圮q &vݞ)E%SDZM-o /Y`wH!λ#~%@zzMWRSe}5``L4VՐ $̉*p@G}@{.IL ^IJvY?"N)/C!3<=T \Ĕ],?<6FJQl+͵%-qIW{C!Pl/br>* QQS@c,+Mj{B").<8D@ijV "qg8w,@d~5͖ցV# 𘠛Bo$v]Oeb1O3oja"GDdԥ~=GWLw~*"fP]ݟ|0YKB;6'rRy}0`Ö94xυvҧK3̏KD:u[0,)) +NGG.X:^1%u2us>2JjP/sKYkIz`~d=;_g%K/m  aMBu<>9?8BU6܎~ .YIʼ5לR OP<:;ȹVY;Id]!ۻ8ć4;gufʆᾙabFWzͿ=ڵb44{Dc!X{2 # &uR%w ?A;Qs@`sʏ$D)d[wL|jH_?fz9rp`f5.ER U:'  Orn;CS,S&Ă(!6%tTE SS=aH#VICdM=?_4]uSYkN ?kw3!, .[7>@19Z9槃/T$]0f\1XlBK Diޣn8w5,k`BR .9}QHpxn(M/FYE6xutaj,v]Q7 )W/t1P ŢMl ЩA6|>ؗ!S8X)F6rtɘv/CN{;pU\=2A\4N"e֞v&B~^'6U[#,^0Z&}{ k -h4hT՟ފϬx[L l01JriMNn¿sԄ*>czı j,qx?nT%xq"aKZ +rEў%b`r&l2,}<cRI(I;ԅ{jM&l0d!rዤH%ig8vz[9hV4B #sEb:Ȍx@,pmr6{9S]v9vFۤ b4jk)%_-Dߛ` .PPXQ4W-6xr Koo\(Oz*x&ޔh r}Q`m +|żĿ8yJF TH[?˭yuag̡C\=5(y7w&S>?2 7C+HD QK4G'A4$=g.t+- u1Z1cVa숄iO T}tT 3:@fo6~WË%R&tP)pL-x+\:5=&ChI{Yr0,gpeXRalļv$ENH(jXVGV -ѷۣ ,urX:}4]A ݖr6/ټ 0kG P}epߑ Xa,;xY@Z9hʵU>Bb XZª +Jm9fwOpGre+KOpU֦PkhV eNJɎUkZՍR$ruq ;>kdӕo[im[j$G(~6z` S(ţ1ڞ ػ'AǵIE(k!*]%<,%:ͼkS W橏qۑKUCg!ax%4vK_5ݗ[l0lܧeT*c$ _GL`~80L +pc mhTӯjxY\?ޮ'qk6m[kFFYB_ \'x(;`[J?oeUM1"E%k[" qj}HFI +@IGezx`r>bTlKwTOCUQajTytmd8A.]X&Kj*ȔTT8rC~hd~p.<Wrk I97`6.!eӹ/u +x4䜆>^ L}QOiV^ù͡Ruߍ_CScg)?R)G.\5ܨhbcOZ dFeMdTe^WC@ﺭc3%>b M@g{5;CT(SA H5*H&߫ l]q3v i.ug~!λFa23?u_(Sl?rm-/ZY*It0u8DH^ϳ G b^YA \X>O_óu6VsPw>>VZƯK#( +iek|wƦk^*AF<RFz%k-.T 7s}bHǠ67qC=#yz(jd 97^C{1năE* Z@<ʴW)3shMqLh޲9A/W9L2XN5܈|2[rA\~Ҧ*FVÕZ.yI%.~l`"~x~<,lV}m:zF9hz-g=z W A@s-큲AB>idyT 7 g_&@(M9,i'kC> =yK׈sQ 0y8]$+8{M.j +&2naqcF]K:]t[#Pvg+D [0!,\M :J$I3 ٰTC*fSC7)`OEG-/mb^Lq }vd)}B KnͫR>J=r_N11om:4Tjsp5Q0_feGYN̈e}=s.?-=AN7RC;$.] mC\9L8P:+c-Ajkmoj E{5 +(Yvχf- ߏ,'Ε׼䗖u4o房uĪ{H,elWhϊ+gBGaʍ&䏡xET$ No'TCAqSPm"קͯ>};A4&XgIadM 1QᇔSu1`Lky✧tSh,iW\r$X2k SBW %ݤ4y +~j}/NF}/X0Zd.]ptuWSg)T )T`UD%uE?((:6>#`~FBQcl]Es2EVc;4fdl M7{\eb#mCeޤSۀa"-X4|q2@5VlՑ8\spN_dzdyC@ rz6O[EƢdi1Wibۜno PP̢ &&u&x?oA*I QFV:+_Lo9Dt~ͦeUwj"`$6>#1ry-WM;`Aeq*x6I=ۦh%Ċӡ:D!2U7S!%R)TtUUy_ ͜`A-]bG&9Pz ZsnʹS-Ƚ N sݢT |lH^I*psG~lUra|;'\7ʁFDHmHzQ7HYdN5X9?xYR[X#(ir~/FN{?VgnT7"0a٥SlOn eA{CV:C4mF&xl3 +lWeZ, Tо*z *ac#+yN[qO Na"HaQoBŝ|-N=~Р)faTۅQ jrdG|IIR<Lhxra ByB;+H_''xV:}\L.rurtLv"=wqqy +YY.c@Zަ!I}o# +0ItY<όeWAYUSe~vbo?ĐD5 rg{7ȅnbHg L'E kic<4 ,sOTaJ:PT@LD9ͭ#dF" e xpwaن53nELyto2\A[URI"z2^Q[*9p)'OƓ B`:p?'Lwp9u+Gd}xw{_EGujSt`d yKE׫_8cy Z+MqV[Su\i=H(,= #VpA#rÀ$i3{7.RLemɜ魡|&Q +/B`) +sp1:Y|T`)#YAІ,ٶ& wKizI\r*(q8 x@Wb5_=3:R-PeVelhnAiEq4O'< 5wϿn: +NO}BOGXWVSVAXh没$nM\'=O,;W? b)VDZSft NJ2ep\k^'%m+idHNg*xEgU24Md*i^ hM@̌h6p)Ik| @uץ*HC ܼGwQ2MDf0s MkXP]EφUߠء6c2{ w }ŠfǼcBA;)}0B\۫ ʕg+$h M!PFߧJ jxSOApo0"UtDVgèV. 4p?T7i$ Z GS5 + /mTdfv x?7a]*H%ߊuTBz8T+ۖ]u(,ʏ؊6|+a7[03rc\?@?̐@s%֖OS'~z|kN# Z& HgF?c._\1z'%d]:p\oΕBEqg7ØOyaO_Tuhߐ؉A} +ǿhVwu R|?׾-=@U e + A&nN2> 96?W{pDH=cҦب<}Fy$@~?qKzJ[7Fu7U\'ZRդ3{Jgf-Esf;\bܘ'gwt HIU/E=2jSJF iF/BLatvf;YLRU. ]m)2YQ1#ΈV/(Y$ *D)ȻyZ5jz8>z a}QT[RY`b׮ԏ[Ȭj=Nֺ9z-JFc_QxRڞx/7,2 ķ +4rΉ8`- =i0P,1<<s̕Q<޸ruCo f/xvWkALog:Ff_ΡC[7Tr?bD'@oQ9k_ɹtע#i;-$veίbJ1| UG+L10:(% u_&$BbR'vEzd15:)K-?$dKMfY~{Fa\l.g-Uus5u ٯ%젊}yjİw#Mgr?d CٰG]k_r[jl$w2)(. Bq`϶^ MRIuW +j[҇wAyF{6Ԣ[wbo /NăJ-"OwAb7+qےBc96Yւ66 H`NXDkSmYUu^6U@en~Eu(@uh=jS!_t/r,fǑ'fϥMRNXe$Kߑ&&SJhjx@ nN,'543YN+O'6-=ޏxD CT1DRvm8b鲱W5Iz,Ai0~x,1<^ EVBiaoj\8v.#̝mXfj!Q!.BmSJ먌a(%JfWfHI@0IG&[v8S?Sj|˄ U>M5d%÷rN /DXጕd9PBNYAsٜwmI'Y]6yl +WrpS>DfPMȜ1lmpQm + 2wBxR"J]rf3̵.9LTM[L׿ 6IT[BQFc}} +S7U&DTق, mi-\b6_IS׈N_ Z `Wl쵗ݞ6[^2Mޕ&D"pru;lb2i<+3㯕!dYf[><ndKs #M?!:]ܲե#I0ݽK +˺Cu#lC4 9CiGf ^_;p p +Q_O^lvztw8K̑y?gXն`1Ha&?M /^7ޙU`>߷B o m7ۡ -T2 XZ*Pw=#رmlxzi%8iݿaXrTJ6ĤbvIB%&iѡZ,ﳐM;sEJ\wMݫ?~ ++)܈5>?dk4/[Zlul-{. , <@1$TYTwlpVFt KA"0);ݘP$GAO[;NI?'@?[*3ԻgOoFBũV ؀3*pφToOT_+98"382lA|U#5vv{>qJsWeT_Q4Lf> +~X*1 |[0e1f!I2bNn ZvR3Q1h,oQuӠ jZRUou(w-L[} = +`LY HXHEh _/ 淥Uu(" O+8̹U93P?Y |,OQ86<|teD !U0<>?˾x`ڢ0)vTM MTc0nnaPR&+ښ3B|NH${,d[>^FXv4Gqw"iA}ރyHKj*]n$N(WP8x,Qhx +#U:/"Hs8b &0jQ+$dEKZ#9"H1ʧ-J`PFp$⿺)a +|ZIW9oẎ(ⷠ3X&.A?`&v [jN{i!6 +F8aj;bĢ^oɦuRu=U00b&l@{juPM=4M]W% +jsՎΙ|U3'+"; ={=Ht:I\0,([vJ^k8,;\n3Eur,U\2y}_;Ŋ3lXu0Ϊ@u"~UzȜ}"J696ڭVq"9Z]V?Q0Jmr]:XZʙZ$.LA$˘D`4PZANpݴ~+I x8>s}p@ +b1%ل"HEs?ۄZLf:u1آ+Safӕ|-#(\u1]$"Dp Ю~]3Fp,TŹ2}ڙNCLobh +5Pd~H[l=,C/AVp WXThN)ZD.(0yR{   +fq$nQZE:GTfl*4 y6,jH)Γ"(kӋ'-;<ڐe~@ [Ȓ8mo2Yrlgz/!-5(qqG]tKwghcfxt`eۮ3+~)I80F |W!tB7_lp?ڶs5aASPЄy+Rs?shTETc8Ou S .݀Ndoss%C.(~_L0\KH9:xһﮚxXڢJL1}\uY x7*$CJvp/|4yR)@ܘ2ovjL992`2}e9FN]tHzaLZ %Zqs!5P$kjI4]zbMUq!7b?nxUΈDy&W7QsF>a.:)jc([ ΍8]iYY0u$(_ [ySLMߎIu=H2k$OPˍ4*!i v0ALfP'|F8hp Ӌd,>=`7^xi@$X)\N 8|!?(_U,lS]0JMXs%,4zP8| +n| (iM+vK6f}搂odO1e#a&jY҉Ygo}f>RvE^VLI$ .M44A|5SsӲp0Q^܊aj)[iq>R.23{"hZXQozE[[T6Y7GdAW-3+kY;k\PexQZG;X@hs1r6=6 D5}J uCl5#wRe7)^hVe +`gh,~-yJ(B'~&{mKw궟j8+^F֓t.+7)P[BclJ(( Rw`cp Dn #TŢv6(i{dC32 R+5"rNdo ?bQn>2V">ͣ iX^څ2c&ZLI I8Oml=rmHHI + \I /s#= X%gS:O]{9P7?7#>-KSIw,5sgJkj} $N8ύOT~aۖS !E{uզEy(ycڪo1+7pQAەqϮIjDq3,H Il1{ `sqHGfQG4Ag߆v{I@2A"p-2lB^5巽٨F l5Cŵr6~=ϸ6L_H:ё8h gIXծ^nbˬeQzgv { t=wGn1},DA!tߧ1, {vP t," F׮bJģC>ح FsE[ɎDkׂ} BX9; A`:י9ƷI ^y9PfҤ҈m&{wrT3vrH3<;f3QL#~N>j.m֌ԋ|7==28b~ )L/ 0!vu8kWm dBy=LCvRchE۲3wvmd(Lj@{0dTm-J $DP)j:gB}42 s6xC-K  ^)F9\ D}hUci:+8qPhZwC +NQ +b`u C볊XV6nX\JEb(%m\z5nw1"X&e_t a/F]v?A,Uh㪜׸ɬlHSqaJO~~ʪgHR*z}fF0  +EYOK;4=C\e+6([B!~Wip6G+IcܕW٤׎;EC(G,|PcrK6D+lB5]dg$YcFYŏo~_?&mJD'O0{P5G5zG7AE#w*oa\tƑzIP:CKg} +vw6TJYP((@I60'x6T@Q(Z?tD;B籸[sAAʹ̀yZ_bKN'?U)N U)C) StLo% fCG?*0L"S4 z|Z`ĥDo|L՟?ںבjt\$Q.Alrp4ۑ4 , \W^8~0Ng8C!ȻA뭫;璐fn7dpʧ!6sub5 shH 4^H WЧLηiy'u0}m&4_ oƎH'M +LVD J3 8I4?N0,z)W G8| ::zIl1'WMK]ַ4Ҩ\\q1˙K}Gm=/\DNߞS4NI@-APT- +&]QKT2|pL[iF*R]ny2餪$[S gqSU.c:zj/. Jr~e±6?N(ō98̕j[͍yvb.+W=G uQL(hӶ 6&Rܬ<"`,uf K}ARwd٢\"u'mNv0ARd閯\J.n'2/ +ɮh[sU]LRv!\l #QEcz#F[]ڑ󈎿Oxt[hj^,-IAc/`.q?B i*N` +9jyqҾ>=<$ Բ-e*{_ea4y;|J(j Nk6Wu(1=9v̀aۊolSPaĆںm?JZBT"7˘GF<+q1#GU9܃)v{T +[9 2X#R +Se]l4jrՁ]gZ$ʴʪ Иp(Xc3@0!md˩2X t&L^7j濚jKGOχktvP7 u%%`ze=}fcY{Ufc~+qۥ?RфKٳ<#1醝(fk_."2=D³>w:/ȎTj0/U0%Itu;}fdDJ!R[G >B]Rz3j)#bpɗof{:qўgfqtZpCZ Yi[KDQ~hQWm+\Bk$ e&D<\/fs +b21ʣG'PyǷȍ{2eE|}Q}w ㎕鎆 R :LoJϻs\D6o5:tҠ (Yop1ɁF0!lNR. II1Y%^=\S^^M>Ըa)(""sHa8uL L.}$ Q_ +v[0u}uɪ[sP`D/Y=;ȕމjbO̩LK\Jk"(`M͒YuJu`%(c1 +u捂F_H팓/Wmrju__ [@%62$.<\+G>kP̱="G"T>O; 5[֚iGVkF(.R̹ܕ~ 9qR +KL~?򹭵u?YKT-5Ģ`kwb&jcrEDabn.>,z\ȩEn}l:H,4L*w&N{ {l_u9Ch%>=0'S(ӂS̜8D4'Ik,HnMqֺ# rŒ01]Gz9#+h8V:$ך搖Λޞ7ya(85L6Pޗ3K'LMn1!Q:q1 ?_\%fٵ88K SĦ{ *`M Z;dkqҗdOW[@5`攇~]eXU ߸$:aI ^d+NU96Gs>KŘͩx1#z$(H#a3Ec %ۇ֯74R Ms2_ u[qTѥ"QQd} K^ 1.l,zv+ +˺1 Z#~emCRN5)*jKWQ`uIh~a<"Ƭ8޹ u[vx #[]s:$beG~nN(|V]1ݴ?2eEz2E$" (Qm2_~!4b\hق{ +`!H"Jϓ++ Y= endstream endobj 3640 0 obj <> endobj 3641 0 obj <> endobj 3642 0 obj <> endobj 3634 0 obj <>stream +HWn}WClĢ~ +ˆ=A^  Gb!e^S;u0`bU9LR)CrERPB=Yuv}zMKVtޝ0V͊Tb>eW¬ҫE75CW߬^7dCًT3$qeA}5}m*2+*A2  Дz#g[xES^,T}dCF_*)-WUgRE*c7"WغHeE,?qNBt+++%H)3Ž@i̙GdTVFS?4 +PdN"L8 6/vh1AsnKD3. LۣT9Πq_]vfxahJ2<Њ ~ͫ\GeYH(#Clx$54W1xKLx VE%^b5THq%x` MMIAc i(%*XC;sBRm =54x<냼2dMvQ#Ib˻)W:F׻أD"{8 rd@yQ?groʹnV"P[_J?_|}b;"2%n@, s&>N0!>vp+=.7SAj3bBվ"W]mVsc ,t }s=q)!r娠8Njr>k .p C}ssHBśǩ'>M\==)Cq`&fKprt@<n)Hlq^eYzm5h'Έ.ko'6!iAM_PY{#$ ^^uMXL +EG'wyrA&%h MqR7U 0‹P\UP'jnܝʵ0mg:zV a*$N(,*(zL f*2d q =Ů!)5NJ[.;D>sfRMh4Qcl &^)W!.(MJYDRR"* $.]OfբfTd4L +W ]h9&88 X)˙E" *} d-F ړ!@Ҿ"̀#.0q;W F4CFwsЩ2*aRA7jdl%E=&3 P_ʰPoQX[nU6ޑjUܥ~"Gtl6x41T0AcfM:ԥNv>-1DDO vƣNrPdFKȈۡ6i?"C!WܪK$}fYAɹE{!NZ+PE:k2~jpfjDT)+LCRrtW” *]G4_m +U+6 +v0ݓ*UszBZduF̆KlN)?嘪gF~0隧IoM;ݽ:/rǠ踃AXbKFIgK9) $VrR[axX؊+H6(S?=.1JB-Oա?xa9288 9Oˈ 6hc&}sv v~ھKjɤwB/t(½F"2=E11/܍2eK+fwPǏY&K;!lg 麞3H٬JW%=Ml3N B8M`1"iWfo@R/FidG0O4'`͆&ϔ +̔U8c9 Ѐ̀3T\#Qq2;4apY-ͅZp +6['U'm=D9c:vtw6M(+4<\yLZXXpI#&Y|a9-.Q٠D6fe^c餵<;MMKt)a +zuPmFLz",Vr2KkZ FaR 8ėn:oV۾kb7_K'x@NjBN)KaS3P7eAcEx=BCсu=cwJ$|ypYfs$Kj$)sNuW|`6sx9>&EK2&e=$mg |e#V{b6$nk5} 0PoK +%װ0ؕZTL؎y~5J-w";^A )BK(>LeڃɣW7U_FmeaDn`7hsn[0EL)88hw_#b>6M%i2.LU+F͗w3_@*LScy@1F ӤZ"?,~zs6-Ɓֿ&K.$ĹI*TLDBj|;r cQ,Fw /5}}5ɕ/ћ}Q}jf˂@" <s^-iPW2XHWmmꎀ<%8cLiGז'`t%]{v8m]-!e}C5䦷403@x`Ȕ- +&1 \ZNDZ\Ee<ȟTsQ^l|2j>&Nz]!_EED -/} #(ͺ[b#` AF*u/CH2:爯 oJl.D +5iIF &AH " +ӶN `-2V(nASdT!ؔT1ejrSwbY>3JR"0ݬJ7ƳotfMH=p?h'W6#520,%mGs;GKPEAy/*wcmf + 9]d,k#D@p*H |ۭjB`g_tRm=.3Ъ4^duxSm=ن"JfCXxrP==c\yX5\XfԧL\xUl.]pjMPB`MOz!p"ڗ(dWdJVѓyЖ} }H"Dfp7 2둱u\282E5s3 fel#H5lf-W3i Zq]T#yӜڳv䤞xmip?)r|_lmvM7nS1 1]8BZnd"=~7*=9΁O?^/(e̥!u%u/Ϝ/(DE0REr< )$p R endstream endobj 3638 0 obj <>stream +0 Q@&_ Q+M|?+D}ܟT!owm FstM}.VӨ Ejhv=Ir߹e@غ ~&n7mXiUiߴ3md3gBX + l?^G_9\Bhbi'XzW%R緁 4ES}zjm^Qd"rѯV )<:> +1 Dle]f 7qCEI!ҟ+~I n%a2,-`~# UbV]>{f>& +ή +TR>w=3iU_TQ+L;BMb7M5m(iUy⬷^^uAwuvX!<>@ l%n ;14ð,ͺ |AEwkm0'F"O\be_1|$żZN8ĝX޻{\[v+=VV)F¢\A*QD Yb/yցUnt4{CyHvT1SB.QUpImB2~Hu 2 +]tb>'D3[3tI Onc M*돓]gsÄf0]}A㔒#N†l! bLi|/) Ud )LI@SbN y$QKcmlƧ:E5z6UXSpH:%S ?h.=|vy~"d絛+(sY26d&Ʃjhl +Y4 +J`ViqK}̃bQKXYD^ꢙkWwoEݢTgbL BS~i0A@`.R\: AWy}|eK+uT?*uR۰ OM\uih3}"evK|?c?WZ(m2m<(\@ E_Vx'+"mP z@ׇN6F.C\$>Q.e2^Fߤ;k؅ĀL9mui1^^YW]2'ԟ XBMaE͘I(ROG :X\ϼ;t񓴔#m!RzٕH[w˨cM2})T +V7Urx6A>%"QuSl؊~(t3y_LH[3ۧ']ˠyb]n~c;RLH?uLdiJ +D.@9v8iljLy, d QcaN%:oӸR6NͨF uu4'n Q6Qػd a, ޯ٨x1[4 %;NLOQqs40v9ٚ)iv̎awPZ-"91}dr~2׶ Kyu +;B8ج]e:n^+%4gXċO%DAwR$0}3OX=}AM>'>B,{4:gZ3C`WȣTH?I6\9i-m; z4Z#Pie9zwI dVAFՁ!.ח E򌼁1޵aw괹[͌*ǖ^5S!fU-J*EJ"`lYn_Ib),<[ +[' +76yjTp$6X)&+*rEU92iͣuH ೱ[ @l8*u^|}nO'LUM];EK1C4yHV3CçJt%rp9HR`NQhKq\a]5H5yy[H"{Ȅl8 qhC T" +( !o +uV1L@zf!p>3-9w{^&7ȅ'2+ޖЕۗ"D{EiΩ:ckxH90r%h//l.FWBz%eִ աDG9N7;;^>§7U5Y2h%fĒ71[iѭp-̂ ,L)VEϤ$r#98ߚGFEJ>?:0C+Aw{/E}kz4N=Y.̄i%֜WD\^̶eQ\(/2`-|2BƛkR0 46o) ^ҏD0@DX٨`93i['^&ReӾ{BJbmɞ6Hzm3k)8{`}T?Q{w, (LP*"ˏ{(dBen1`1iY(Cu8~M| +:nw1']GUKPrdE:"22O S-hUV#4.ۋHY԰,iL5V@u]aG͞i!f(c +WM*,3/}XIx$#M³C i*)jx6f#2'=A3J;j}DrjLwP]x Dicoޏn1| }m i_${1&u-t4ѪT%AÄDC7]>~%ذC [GT4w' 0R:O|r: tJb`NAF;dx}aXV\jU5aww_D;!JNvX{/E{QNY]ǯ=z'3JuֿG&(CIΈC}=ʁUO 257ޗanh ؏h}ʖj `غ{"!_O0~SlGlEJ29,&;l Udl4T_lSUQLocn)Ա5(j`` ]Zr1dm YM ܨ(k|o7>خ)[ FȸFwoX!ܬ&rߞ{))!&U +Lg| )8۽T]+!QJF?㈽94:yg1тH7H޴c(ѼOȷ:IҐ_\ = j1Pfo{]\qJ"Ԉ1dJNJvM6FI 9oX4a9#]<:K]IONuTw|*P +XJg*.1N(㩌<7_,,R0%WeM#*IghZ]Sk?WʍܩY}c-mo/ (/oKS \-ª^W=M6Z6n@Z?e2Tm ǒ +SlD$í "%n .i>J⌐v{^x:+s so@3Qvd~hꆵi^x 膲dc|UpNq44iu)jU0OhՆxmLz&3C7y)Z~ōtn#`Ta.O:r~`R؂U}gG1 +l}iќ InPb8$8e[PsF<.5FZ#xZ1~BLCK=$?kRQz@+i ܚ]&՗*ʱ'+U+Mz*N/f8rq7:D3ɤO(oxB e}ZKmr= ~rLJ; sRJΩeaSS.F {'aaW\KX{٩P\78u5c'/NG:k "¾F{^3Id+<%*:[BV)^cLfi5H23E %c"kefovȇp/?[eWCHkhɑ&n863*i~c,^e9rTWҫ`Y(y8-h{Kہ:*F).|E5jv39Ȼ- "oylN3;l> +!}anUXm= ݰ,_ltkzUSʯq&ڽt 7/*Vm"q-stYlDiPkػygMaM/r·Q07E%_HzQLҢ/SCе{``ezKJSg* v-6KD|`/p. ^LսH ,Jv; + k'eN<"=ўӒp,e {JD|ÑDakc.{ ~vtC@+;"|)xZom^ -Gq)4=r +B8ڕ#%n m s8:>ij{/C! +R+BpN]>쟳L2ˋ䨭d \oH.v4KMLY7/LR0dllD(e+Fi +-^&HqAM.C.dlPp鬜\>L8t.Xq 2w3 >;; -NJ2;T- N;u╝|!Bf:ήfIB>>ܪ>fއ}ַtCX[ i;c̓Jy4)o\kEEzoXF1;Og8+1S ZwhRML/?4N뗤QyyO,0R徥,Wkn㳪U!)j;c-⧕a8cL0phJ4{Z?M)ą&ŋSĂUL`ŀDsG>(nƛd;CZ&bwAoH%2$2Z3DN 0ʙ"r>+/dJ-[i󷠀xo%Ƣ8mYVp|ve1BhEѸ٭Tz#h0l%U@fo=?t}Xutx&iyMOȲX}'*XMpXD~6qI̠8|]Ai(mV 7K/ 9sq0M ^TWw!>Y5s[u^^'B&#j*o9ʒvayXͳquT0Ca,[1֟:޳}71 +`ĭ92^ѣ+išNÌFPyHSzPm]:ԋVQ0+X:yyY!{upcRQ-wW+C u2qYX< yN6jG٪uEq_K`H} +h|;n֡{:.7>;N\)oWQ6w^N[պve,dZz7j4Llܚ/YB(|E+4j_&|RÊf A9<^SH*yO*)ePFAa Xx'Uyⴰ'>EiX7U*"`BP jEv z7\K;ElOA +-X/Z9G2N?Ldy:͜sVء8QyEV5 x1?_jVD+O +1 >V +?Ǹ$sg'đ?9B ]p,646lI);2V#a7b8_KnGwמn[YP@?K>*pvYw3yJ7 +, >8 P +j!w-_H̎Fv(3 [otS ۱]}9>@Mwe`146)?ݑEu8.)EܞM:'ݥ!S+jbÒ?5Z5f_vW*Ul0P tsgϵ 5ДJf:{R(P#HbQLm)4 W`P ϹN%PQe߿30IU:Y:QfVīSf9*#{A{*GZ7PW,RF/DGiDI=i|uъzK˄K6@L뷮CvCݯ2oaU.!{ !*wb>v68tE/(vgMB>|:kYDVTzXҫ6jo /ğK;JmY"uw23ʝ7ll.K,BꎫU<75+k b67=MQ~i} ~RP4iGKQϑ9Aba^:Kt1nC篇3crU"kPƾei۹j`[ݘ;8U dF'*>n> t=&bJ$-ze)֯R`ܾΝxME%dRҩJg) VE +_4 #74̩[jZXM9n" 9t&o-sToͦs5YeE7Netb`6b>= I#xK_ũp1hn%nS7`HXI(dk=cݙ,c{\\xV}F^w˲IA[S" Wi;j_5B~펊)l&R% +TcB +CcJzJ.)&=Pc|ڶr;w2<)/?:U, K&e _Bs]aYl|0mE(i B<# n 4vץ)6v.]cS}VcBF+ƌ5H0D k %挷K"ke:v벝 4RP-ft6lZd(@7ASe(G2CB>#=>U39b^wNu#`9y(vACu<4G5AuJp N^bNH>xkR@Pk<#@_h3NH%sd×g-E]60Q[3?`+=_17wQqVḋSM a6ZGgAToB[k9-۞wC0=Nmv,QՕdבrdO+9NuyV}*]eQG,PֿMtZqN8MV3: q!mьC!VxT}QP}\#5bG;i-"` KP<3.[9h^ x[\Mm5(~a LA㾽V +vv|\KewW\+]Qx ߡ'~ªf1{%1 ~ ,?<=_Ko6~qT (uts-X[U1"XtPoBrho7}l4䠱ޢ4? +_y@ S:\35 P()H(%O!y;1uI T4ӛьD> fv` ^B:5;T[m:dצlZ滧q<\j3Ujf h?o{1H70sαPc#m5mwWe3b"MtL5ͨy,墦m YIhHtk+ϸa'r5sGUY?#ܕm#j3} &-[h3@`CKߩYppwGrK +m"h32*d[]~zr"edjuA~{0C`BQvw/\vwg1^Zn<ڢ(H$]9=Ik>cLHVPWfj 2}98xFv8ŕcuq4HֳQ农;v};qђ*bv @t?eU;M֔k +V-Wn3W_z9/NgAfݏ 3+jAs/֭1N4i-fj^oa%gf`/ +$ O -' xI6@.UȮrLOtnjCcIKO^Q9JWj[̚tBbQ[E Vm?Iq_ Sh1K, +ZW\t,B=[6g25XRܴ;, |=MF7F&s}"V*Czh TcQ^$?y{*-JNdMy_Fnr2C!V g)3% (@4/\r:0AҸlR+jhAs0b:Vڬ Vwk"b(}W<UMсSe3*ئ%:zj4BR-d|fh؅/L櫒Y0cC8Kh$Wpwؑ_QqKTjMU{pɉkDde~_@k`sx5RkiZDx\XњB+$b׳ /( wж$>bMj&c~0Ý FJ:ݓ91>róeԴ?aE./Bԙw%q\Sm%Woom_J G235}7m9κ穦scg|K +&ob L |d(KDߤ <(V426zmH:u;r8*Clß 8J#4IHl'~DU:_>Ik-3vnMCBtX@S.OPHy ,ALgzp}ao?SC~'[6+OC?H\\{7$j]O/f9,3U_,ʺ^PZk3yDu[ӉRÄ}mˊ||58`sq VyȂ&DK^<ln=ZUGy,+<BB/:jثVqX /ZZDj;HTĘ[iTR亠R0,i; ?4g:dV-.bߔb qB r6CM o5X8$PJl8>q7 Ln|"p%F/KI6aVnn +AzM0ѷ:=$ug 7a|LS ߟ(!B!5Y-+H~J}`.ɶ9CnD- #m97V U= )Mxt$Oש^@pkRT}h0Fr^󪱲S0·8UxCR,h, )V1Ax?n.cwS6feɴ@ɜkWw:Awd(|#Z˲Jy8Ji߸qލs}"er+bUQ-xgcwuTc3#_F8n֍Tq)uA@?"8*6ubӖpAxX` Dݹj݀^2UlR28n07<,vA8UxsYͺ.R@別+PI9f/&m 1Kg u>s7Hy$3ӕ_\G| h23ں*_e}Xom1y؇sPXNR'/{b_/og3i&Ddd_;cن&?}k}+m` +Է]>jCSΧB,{<'MQkU$e`%y_*wT@#U=R?S޴6Ý28gbg+z75zl +- ]`Z 'e(ז34׆4*Đϕ ?GE Mh v윮Miȉ))IQ:loFL g1)ID)$6(RNR/m hfuM{&0m$5e-C=RGXG@@+-Ȝy[HBϺPѭƣ"Ch0k |E8ß&B'~_ +!/K \2- ;:θ҈ӑqIA7={\0ϠH4pt<:&̲fkA<̓?גS5HP|o\kD%'SR]l6ȘP5 &ջ~tIfX1Sl W1Sa\IAc5eɄ0e*^?un-KC3z>;밟z+r!Q|tRa8໥rZ<$0"ihrq}{(X)sʤxږN`M/,BңtxPFj}`VS0 9I J wm4!u +@xTcwѕ{'ăe*_uJ J2l5Yj⸻Ρ +~)!8F|IQ|GJiCpq7'>_b"v}v{;VaB& + 6jAniyyVSY;hOejYXG}B4 Gou!:Mfi($)=sxmv~}gVH[XKze 3OmH5x@ذ`81ҏOj~]}}uF,y]Қ57BB7G˼sX8sQ(5%fs3"Uڅ}y 0?tP YcQNHF-B;qWD?W[$8.p>I)1ث@},cEi\EgOJ5.|L'j7Z]`-Mp`7$rr6CL(ءR'kp~amFnȩpr"kHKO$g|HxEc',_NL1IEͱ{Σqv(WḬ˲'تxpiV%+&^m*f h7q8_&Few.Q&n;dV@HYĞņ<GƕO,w0o;KI}4 f%2q>>D UduZsd<]1/oeB-{cCEvBv 7@͝άb<<)*F>q{yY),2fZu` 6ҐXI:6ў޹%#k_3߾:#`lv m d ͖iHtWD!FD%m~LӢ]}7PƈO]Nbv@P7dL؟/ZG'Tʛai`vf}:WS/pكGeiGKRP%jDW:^FLU|fV$Rov X|ҿUuQexȐ/v&?6 C +Xϸ'p(J~ђDbV>pm'6CqG&3fdr;a;,g9 ! A@nHY N){S qܧh#Yq٠:ݤA{V}ϲ}@A%g;DZg&Po<2yB9+eТ]89[M'oY *<* !"z3F +B@"R!c1IY_]啁֑`YwzШ3iA*M>/.+_qR/vG*I.OaN~=$k+#lJK$߁>QLI.y$K!M䁅ӂLlRs$i*G=HLN#"Z?( &ܭ2"b! S29C"–y&߆(Co-R?B?]B&K9 }.I_3LArG k1 =q0l$@%{ޒ+\&pf}i~4F d48aWnz4nJ5LB:  4d^f|//ᇆⴛk@KF}cگm KqM</f*_AK65 ZeBHe\|\BuBE + u&B7gA|jRM+v6O +g VYM&8o  MxbS[kz>-31WS pD3d@ 蔝L#Rv=^1t/埑$D&K=j^ǖ SDz/ǹ`zHVĜLfot ekUtBnEUZnKk ,9}fW rP\mwfgS. ZWe#`6BNA 3kg\Ȕ[vpN=biQw8b]nbhlc=F,)FY2ubmt:IY}I%UaH@\{;yֆx t Kw?Yvj6*\Ϊ mn\e^kWebh$ʰް26@N-_@-VZ|xgzŀ]q#++6;:V}A)5ҳeɈ9lɢnc 9v3tV<3CM"=W`'q=ko@1"f'O!LCMq7#B83x35'ijjvQɪ|8F[C哮[5aXXyZc3 +~%&& +msM$ۍ/9*;y[V7{!f +چCi0V SW)O\Y/UHEO|FpLj hčSc`̠ +Q.aWw))! 9[H΍bny b4{8G/y 4>$oh14꘧{J5J/"; +`Lc>_ofh,6 +y3rF +rlw1 X!mAA 9$/<.ƇNT=< 1 ȂoKγN섽NJ[ds]M ZUP3HfNjm`u֏Qb! 7 5~nU&O^ŲhǪƬ/&tؗkLU,Pm"Q6Pi 27j7T1rNԍ+f#cq~MnaLuAxQNsaJNBEeryr`bmޅ-T%ޯi ĎH4B{@el>S+1ȢUWYDszFlD`OrQ*4ݶaLt[ dR->Lk%*m +M\5ҋ\fbu)ͼVϕ6tKlo^lkFX{wO7c'.csఋa݅N2yuhi,!tl|#{-cV_]dA_|OࣼqzCҨIF tפ svaIhI!-0RNZNOsGoB j++4_QrRi SA*2"/aЧsi\TzQ| sS- T>w`d*F r3BoxԠѤQH#.;.'<'V-_1C40 +auI{;^?ǎI^jcZ.1\ Γ۴ }V ޽/4 M׃I?9˽"jR(FOS*4Bqgޗf6ś&m򼓢PnJw/f?-5<׫ ɩ(fB\-oBS|$S`0-vἹ42̤-j_x8Wq!D2NdAP. OkKZ0W7{8XՌ?LٔE PPN4! Rq6ǤOTLzT|K҇6QߕachyKla/֘|*c$?ff:$;GO $~z怕'JR'G#8ff;7G4#~h %"6wٶMZj-g?]fEU gr.~YoCA +vz%&D+e>I'ܘǍ~ |ħ_LH!6>5\HbNzs"~x`T}Ql^N{ئYY-)nfanx)`Cy9xxЗ7L8I +bГ538 QhX Ll.bjz^62%@mxmnLQsߋwa1PM +JZwЌ; +S'HQ + +".q?jnd<;M fL(nr1z|hNm*z"9 3}AB[m'%f, +2/2|=o[ex!\ A, ڋG.0UNY:+Gcd-2 yU*PJ2TDΗNnl_=t*wؽ:B%~?͘4Tjux.lz[0:7ASSI_Y( ;s Kh 0ElECuQR4vNz#.x-OȀYEfmj ~hxv Cוh H5ٿ3ȭ +FQ@RY5?D۫^kLb2o#qnz~Mmf0s}l9`+Q)e(t 6hޤV ++FS檶&KQI80Xqz^tp- xyhLǂ,k/#CukhbwtJ MvgxƉBi#21X=t(VDP!\\^RǛE2fቋ} R=}B)* _?Ov!Q8HW7ׅʠ,+Do  +Y~S-;`oQ ti)qlآtt6լ``"s$ '?^A+C*f{>>˽5A%]Cu޾erZJ nzj1+;ΐNlU /Gq:,ѾpPK݂N.Q*V6qJpg?uIB)Ջp6Ҳ՚( ٴm#P* e] Fbvvf"z+ HAD&|55l ?Y,+H/nV eesEK^wisW"b/D,|HWKG3 w[F-Q|A'05(B[Jkɏp]LIVa`Q_,4f7 Ggs$%'È L:yE*%&wW'K077Y\oHp[lAAOZ+'$뚰?YMPuYuÜ$zRDz +Uǹ=aF>wˆ+ djԉ~`FPAgS$lnjTgPX23Jsp<s6?I3g-kdl3X?BSInpau,+k(3j ΟzwZLk^|d͝"vV)\W#*^P endstream endobj 3635 0 obj <> endobj 3636 0 obj <> endobj 3637 0 obj <> endobj 3629 0 obj <>stream +HW[s~ׯ<6dRYm\Tw:%B8ί+EnžDRJ9UQ SF _ޟ~wO'gW'ؿiŪ %q]]-+Q]u%:?!WJY"Luurn7ݶ^\ +^ݜ}raWNI_/wY@ fXcRF7OPΣNlVkJQyY&zK\UM-Qli-n/ D2]6^wMr!fZ5]mP! S2Asۯ|e(T͟w};Y8af-u|GA#~]-tΓz(n(6' 1q/%Vj!жknfA2eQGAf"΍z8:}sv_cL-(󙛻IrF}$2 yfڢq1FPf=pd7xYw߽~nWV BRQΛQ|Zɴ瀐.G3XMfِ!HOsZ668#e7/ J@hnKm]E"W5y?^\9¢sS)ؙ9ύb ]Ii٠j}tB81^Ak7gnB{|E53y uy9 T sGHY@T4jӡu!zFp` 0+o.dNH+P-<0;,4i;\gAe/,(\`QP$0y)K?V\,8.<͂f8xiﴨ>0NO+ |xϹӣXߧaĒ<&I%@}FL9zIF, '8'SOуu]<OPIa@*83i;Z-old>Tfv7L4]Xbq`e>La,m- շM>27@'VP<8\ڂ(r0]]^ +v^\?C )t'ܵj OAVlz.|*h[1x(z6ؚ+jv?yXTȧ**5cmbA"b-^F&r8yaq~ṓT}מXuIPh9ͦeF٠kăX!CH]b','`|43]^?#~6K*OB 5=#-Fkw f bdeۘ򀲙mS;|܎5pˢ{5M(Lɜz".eX11k=zIH|͑܏ cHYq`{At $H#Wjʈ;Xi>23f y f:"8{`E2ã@{Útmtb(@7i'e/#6FuSN2<{l4{h$ni MO^*!~s.2A%5aL&rg3!k%XoGl!CoƋ2ˤPy5Bc3"z$_w(9aDTFB +. nYq +mĒɑcjG+\n܀v7cޚ'/<^ O!3xaKv=쉑U:KFCg١hhj\#Γ X !C3c|"I1gfTUv>Vr4.5o753B+4*DAv#l ќMI.5c3Cρ.uW/{tF!a;dHHj>Yp?7#?ۛƍp``p U=;_e’9/=lZ*1"Ǚ$.N뱮s+@(^y}} +ew9RQe%2rm7kS֟* a.*da#9 yD+kbj. (!Z[ +W9Wibb<(WK\90U< l7!Bo".ZWx&@??+Es,[f$ yf{fy)WǮIUe)ڭH)"O!8)LWaR]?fz)۩|Sr}PƂsʇK6WWƩeM$qU*2D~:j́5|x>J j[ͯ endstream endobj 3633 0 obj <>stream +0 Q@&\ Q:VSp`[}^,-TuPH 2:YP^JtC$ IVd"FpafFES.G&-{sU{{aB63-$-"h#˻g<=!hX @jG +·Qw@e., 8\(ccZ!E(0%ɕCQ^>3qPŸy3TuSA]rC1gmK!$ĿOrC UcyѦז +sFe~ H/#ldK9VRcGE9d0Y<݂nʉ +i҉]Fl" Wou O;;0B4&@uᒛM{Ua4Ev[S{F wBKXZJ1S)d $Efs/\ոʹTr[`TJISEx +yvph I(5_'޾-(qzI7d0ȿҴ6}w1g>ӗVm2t%e$}r}3XG@/49T-NKKzg5D ?e,l:%KE6 V:>^ 6rrexR$Q7&_5"A@EwzK-9~@= (|ewB }/MUBn~WOոamLB專%F7e˝1O y_9? N$Sd7e~I斴]~&c@A5 +tD5$^!DE0!ףGoHKt |*֍Vy3r!-@dz`Qr,:{Xc|ՙGurt(ֆ@! (V]?U0ͫ ֵ`1&^ce34ec\_&9tt@ GRwE:9V~ La1{RB+dO[2/)0 +Fu#n9>O]ˆdY ȰSa*In$h`XV]7x,h@ +Ǐ&3:׊,춈 ':J'>tEMBLLpׅB)dwhu*JzZxlgWgIOrLH 0V(ϟf1-,_ 4y7<1o` /01kK@.bJ Zy2YD@iML C4C9Ɂ`b 6{YiĞ1bq7:SU;o`D5&!;88ou#CfDGȓgo<%z"\jyS+i*c??00Yz3|‚s .P{mw|F%Dw㣜,?{L/a33~`*rJ2#) Jgi=4̱z*䢵LsJӦjzNau'm݅g( +_ w1S1H}e_̧RU޼w2B@>FN791aKW'L],.m:Svyܗ̌ OH v {%,[Nl2ǙWgΦ,I9-JڛZ-;IS8iDy7w³b/*%zB{x.KBx9o)4,c>\\ރQ~ +F_,B6]fmҥO\S7-sI"Ir( #GٓUy80,=-I"?wYՔyu{IW_ZjP[!v@G"oD&+tcWݒL '#̸`Jˮ JC,D`b^*'Z`gQB *-EnVլFab7*,f(8GV3C\e5)fӹ݀JXhǾ0~^;$WmKea;4 x!pc< &}ڨԈBǵC:.*oMEcvY1xyYvOzFV=N_Rm = F.;4+k@bL<=}\P  Z i]Ơ9QtƜXC6hGY/TP}FX$$;%߆z UIگ2`dЧZ&ŻW|@i" 䅧P(xO%24y@N)Iqa.df/O`Kf ,#qz*B3>8Ї,=Q6 )hUEK 9*!b?ޱ/+~ 6{RՃ')ЍoѹU^/]XTk|:'/H}EbAQZ|5|d&*F{+թ-1ؾl r=\|gY)&Đ{wYPÓe<Ӟ\AX +H<'M,tw,;ۣW؋~ B+ NF';(̖2)ُUD@MJw:A,b?r1^WH4\R:*m;6YۛBb$U&k9O ,PY )I ؛{9I#$U̩Vrϳ s+fd'ꁕ9 3e:Ws,oI~ %g+RELVF+*.9qYm](}-C$E)6Y19KN`h|rcNM !.V0Ipwx I +8@ŸJˆ ~Λĵ +|fժyJvjl,tmFY[c2[S<$["ų)Y;&8NRذZ?Dݛ/35]6GC(IbecŖ6ƊoF5)InC6 ˰ܭMNPr'._X 2+nL7|QN#x:a _?1T %N`,GF3-4?@V:*F0mיcYx A7k +;}B\Q Ԛ:~+I+&_#{)Ϲ݈@R#rw][cB +S2 첗!f |@J E-sѪw% {zeg)FjB%"~g4Z$*Eqؿgl"es% N~3q,6tv=$5d;U1ojyL 'ռq|ouohoL mx'bhK/asb P)P+~rul`ZDjVP%Nry0#@kM)6#^(f/kƼ]|*y@Y&՟6θ ">lUmv! +5K;u&B+ 8pve*t qp ,& qD.V$KA 9='5v/8J '5Cĩ^!y2/QKR/>4lt]rM]V|g VDJvtw0A6i_v"i0 hV/_H5/N]gu ȸ}#=nF-BN &[ A!' [9˽v6۠w?p1+S~&!$5>_1WPgDϥIB7mR|b\Ʈ\ ٶh8^9ԻXCmqkX:y3L~z-H*Gd.o$P_EIT +dsh;%j 9ϲWym.#S,x=/H X3е>9 Mθin>a;АQ6 GJ9-XkA},&;=.JmԼ`f$Lv@Ȏ χjL90/O +TMOcsԦ& ֖ 2 +{"9ǵ{J[3暆[ەo6Rn:/ŇUȣe,( { +Ԃg'qR0hQ=c5 2e=O[n3fL?No浥v/a9Ta\jƵU7xr>>6!xOzl)&z =Ҍpee<^\Ԅߏj8kG¢~q[ "P<]#zCYbxF@ +r?0@rƜ$GTʘXjwD"ܸ7c%K ,?P0?~]m8}l:wa .gbIvcxWޒȄF0Šc,:mQPN k3qB+7P;[}r0΋M_KY&/9pU"ᶃ-}=I4n~/6|II<RP\vr.ax] 6OL|*.!{9<Wa=pɝm `O br$$R͚#32a [6*y%$mKA@=9c^{jld CDD cB6F0GIagYfTУؿ]!*.ʐYQZN_JTaA'x6ej 6-PX(7٭}e:[RAé%1f7+-ҙ|!CYHU>nţdovZ8{n(T^tO}C,J1&l0W)퍑\l#ßsNS +S-x39>̀֟*¬5U=8ك+5ҮLr痸G/G22W`+ccD藿@2v%p<G!O3fEn +mDsv3 . LitT Eegb^6L!N]S}EJ5+ ,_kFm:Yt|(i,̵Q m83pG]@ްZˆ,ϥ꒱[3IzbnTAmH܈3bw҃/+Yn!̸ L3|[jNw9C Vv)4ٰq e?28EI'Sȭ]kmMG11kA[ߗW?&)~o>y'HTky 'WM>0@w±4Eyv@%ЕgDVZo_ƍ@ 3hmXDu\nMDf} waw;Л.f8hnXU++F0%i +(H4x\@F]釵U"v@Epp`\b2D 0G51 +;#qzUYCݤeQ*3iޥsn H<Õ=r{ dzak(<+{ n9w­AM;áHӚ.P# ;hfaIw-GfpПᯑmH`\Hh9dWB.uS:kKJ]J3'%$$' Gap[bV7/]^x!=~n_^D]5pSz2#u;Gd~FL䴮Ҩ_e\@]NP_B]=d>DOSḄ>Ы씬Q/c wA#~ f鋡YY!V) T"eid)`01#%Pϑ]OQz']h{wì&i3nl?艇[XY9r_w`X΄u>7-5]%Su@$nOl/ە:㤌lvV@~1+<}蠯 +u;-=_ݨe x$cNgS?]{83{v +EC )}},}?G֘.wLnwc[< -}+f:0 1UfGKPY[.(ñ+7,qD +.V Y~wPO*N ?۸'#{O 0ef6i[PL73-4j +z;V.VЭ@MI޹HĘ7k +nIzO!Ri'jUPpט7bu!l +QTmXc5RT7JCY'"Pa+2>4`2$HH̕Ͽ$7r= ZlMrS8T.hĘahW|ߴIt!7G(WJүퟗֲL3KSZ3![!lAn+nXԹbYIyG N ͡tBB'2$ߵ+R˿k^ÞW} +RJPQ{t.[78/% á{a68~ U/Nŀ$%ۼ;x[:VφXx9S+ﳣWE/]h,5mrN`}O\zw4:5BA%uz6a9ͭO +rթ6:tR٦ xsT'H5]E]cniq=etaT8R^h0NA$:7t;N[0rT*|PS$>%z+7zIgxsIAjΕy9 &zlF12Yb~3~6EXf4>@^42ns"X@WLbBa < ab=>I4Xy_ՔD<#EBoߪ+;K5ZY%jҨwX伏\e".Ho'#SOGw1g+#0[+brsWԦ< ;ޭ]WGaBKɣvƒ!`e04фNCR7_ ZE.:ŽO>u qSMEw:0{0&/T71֥H|#gǍ +MnK;YU:1a+nCwBldSU6aRL33ʙ)`:jgFuȲg<%I>sp4]:Q!o:2a;`J]]*Ql6gۍϿq_+UM/A!$^b5_ ;VY,c@ +!v4K02-LmW+^94 +ݟsU &:֋ Kc%'-l;_OAJ +XT}6A|{K^:7̭vCwT"MsV$Ps TH6Dae+s%%d##Si- +kd!5_t6of}A80vȊE>AlinY4_qQˮ۽Ŭ{G?aɃcgGm1'nΐ(~%(><#ܬ>u•SچX<!ob޲=>Ѽ:M @lɝF\"WTWJԏ ȿ3^ͨ_yf%e)x6]IfjnE4˫R0E4!eSBؾ:y? `,6 :wD`L-F}Zpw,] C:~(0mru=xK^U*f7t9a +sGFb68F >(paʨ XZ!g\)w_7%۴dզvϢV ֳN_59p6@̵ }$7%MM!?FlhBQl7fMSj(`k΅ ? b%2V(@{]}`n^^È|O/jl7ZF ug+̖ҡ׭H{syD*5JHSSIk}>pg.@z;Yae톤QK9఺RbxUM{t#|iE{Z^oi~ 4.y;%rxcNǰD3/Ÿ;!MsqYQt;N, [&Ý|_-";F#cIn,ؓYL%.R1:T9W}isNf9~ƘIDi"~ P_%#Tea.28fd,J٪C:XŽ촦vM p  OQ-ćGJubSOg0"매BX==rfgG٤<CϞ-y=ajH@BOa̜Pw$=f + T~ݴڨ3 G nMB<.8sJs5PD&5T.$e'?;>q +|Lcwzzʖf{^N-kUIլD?! +e7ƤYVWdXig e$@xD,yf?G^d轍CX]R`e0N`\}LC9k4i} 42&~L:YԵƻz#3}iN]>YÖqe1q;G387tdI|h0]/i{cD:c8 H==8^?%_X&> oψTw(gPfQ}F ^<=q#lnd/_՟1VSki<`J9 j^KY*UJÑ&ɣ:GfcoJP?܋.W9)Z?cE]lcW1#@B ۵Xӌ+uF8n݁RLi;X3 ]gr.-Gt19Z+{-EgSQu#*bf>L#N}qVQ?Ӑp,{RSG4^|^A{ۣj%;{["&F/ț,|F͒aǘ6kG19#w +נϿ_QL7<07Wt0!XEwwXD4.BOGj`` +,KΡ gD;@ /9IvuEǢTQ@LgSM N2 h*W@;t=QȱRjP8;BJn6g@\%9>S"^Wg! .Rඒų. (P&͘ue©( `(R9`]LExթ'&PA=ih)x!7:<UU(iSy{.+DJ_B?jg|0_WLMIJg}Ʊe0Lm.[tw}3{"IݷvW} ]ȼ6`o +N ?AVY)Lq&Ӓ`3? 䥍whpa/An;ax'%r![!9!(cL2Qsq}Wu8>Zğ#>v̵ʹk(@Hm1 ~9U0(VV שYb,؀Q&H?/8?0/\]q<8ms:隯S-ziJ!:N_J86 Aa:Dt#q{)lpxb?H:͜Ow8y:C5x@-b>&܋ :3pXPMAN);08Wpj"Iʦ4y򏌡V"tN 2Tx]ض:vp˫%|*"t*i*-/K b> ؃rI W Pc~UֳAֳrt$)Q~jBܳ&߃"GQMF;VEOPȟfU:3[qz ]G{Y8Ċ: +a`MC*Y:q۞ndB-UU~mHw4h*jE=d[z&ܙ.6N.$H!b +x +z-!/Asyׁ߭ F>ad0jT:| +Qv4̂#D%jPYG+}{ +twtlíG-zIrM84d +=0$ A]aV)?esr/jD+ފsLHG:i&YɚT爅SBZ4\2Thi+\pބXoyFstt.sys_oG˃!Y 55:Bppkx@X%9Q'u3>𧄾eqUO Ҟł(Y 5ˡ0S ˺80R3: Sx,Vʪ4tȱ3"pX}! ̓YV=4l^c*&k쮩L=3~!iq]dglN'mk耽@M 8&-sfB݂&4AƔ$dr 7S&DdNHxc73ɺըQrIM֎44`Ol4Yo8t+7\MIAhRQ{ /Xߜ֡#!< ns&MRm`?)(-PRTBq h+q܈@/bAianfkl;\]ZL{ZCQdM +b XPo^(WuC;Rr튵j/ՊFrOU+u8~zZqNŨd< l^P^SOĮL7}y@}ߐDDG7Z7\}k^j%' |8,goJu%r+]a~=~e\Y&(\pKCsmQkKiv[kQ +&h/7l@%uךyLJ4k.4:*GNL񷞉w,ED1~}rKߑ $ +աȶa9a<#^:ge #0x󯦌Yu}xTp+ʋdYVƭ5]")OHAkVbąT=}yoD`ՔΘ E𝣂f,k`Ԩ# 05&\8R1S xf-q-Sm+)Ң11jt@<-cN[ѳBn6-fqL1do%jV֬}WA]*;:SZ[ -ڀNS[1>xfW'_c0K|QSٽ!lɚ93|>>y0lv6;4 (vٲH #9J76 e"X>Wzt24|,bxA*B8Upm$E$ںA B~EB"ـ`lp" @@ٓ: ։Um/EQm:{K\驷RakjROyPkz 3 ˁ"RGx^G&ݼ@vpCޠS!fa?K-fJWC_#yY/uU<,瀿o&_(CZ J$%q2[A˶3)B5_1wu3Y-kVM 2Jbp-1dB'n&ɛ#"%t".3X]'$bz5R98EF_frTX9M,ݠcO.yB 5#1/h]֔1ALZx%߶窪-zd%; ++'!S"D -q'Jf+Wn&ÚT67 Ժ!Ϝ5t +T.s='we(2.\X`"E4dHOiOs'|{Z}S1Fp'682 L6Z9M@g\fR!{Y%ٳ'!?ߒr`ǐz%x0,}P.7_aTܗ[r!q·+߄7s=s w]-Lf<慩 ֶ\b?T33&dsdJjzz i=3 oln3D\!E_P`Etί@RYy d. kX ʦk +zW<瓤QvnIcDJNb5!OJ>ҽIxiG% 4 )DYLƄ~S$ JGVTA#Z"/Ӌ&#Ku8nsѐ0e߱BѰv&L7; amzki`!Ku&%!B1;{)UnWQB!|O5{^Ql$3ڭHG4`* ,IQ&i==NZLq׫V O(D>{bFH|z8@Q9FH fk_h$|_;˥MkMC Rܯ*Z.Mp{y1]0*sp5$yҤDgp)fH^ (=#ŝ,#TI"|)N#E9SDc5XW-KcZ>݂WNk; hewgTtO5"L|k.y+%tcno8]L.@2gXS^iiR]; :͠B,.%&U6=zy1fC6Yc`|̖ .oOh݉"#}τ7Ė0A4 뜽UkDG<7@<@?p;LhY]ȉ;G\'Ҏߡ[Ӧ*]ᦽY`>PMXUY yhKO_"-tw!xYyYzE)3EU5Tlo'e%tQ7bQi ϑ:Iw|6Y,4\ eUלc_,eMLuL MCO'"F77&6EE(xG7n3dG?'S=MN"JDD"@~`C ]"[1TʼnBk\'B҄L2-$~ 5WAMJV>D}MwmR!HPM,!="U~xtL:y_ׁT"Qpk%9g)^fK])WU׫ =QW MH`gxhR~YJ%L.z&LR;T j>&ݢؘ5HsY}1gʵ 9(E#! dCl'6'aJ)vub_KE|2*CAQ0p/ 518)+v %Jg 04VYpeЦ +NYBbe1S䞢]N~lv"tx}v1L~UvpЗoN ,V8#Co +y̐yTdݦ*R[psoKfWDĻ׳ljrqIc&, ߘpi*{h(\pFr "fQIMb6$eMHC|^F2GG~1`{ F5t-eN(T端Uʻ_TK^f:' fZp81k"E-D"dۢ(&1(wdTq`gDّ鐽qՠ]f1hv''ZB%4p1IW]b,VpؕmEC71L##^u w;HXOZT#Mӂh&dUᳪ +i@zrFhJ/mrh.KYu k&2/R&;e[uA,3PZNQ +Z@(7U J7 )u2lG.8۶ԊV-UD5l[? 6_%jaJ7"Sjs#z} oF,eLEZmZX4=8_6$G +bE 8l!F/l.`%hNN/.1z 1O@8 |ިy<К|OWBM:LȺoL3*8Cko51SdRs?DAv?e^PABOJ!×9WACрkFW+Ě&H~2N8p63NWfS"7_'榪v/gZG>^;M|bo}vŻ&%۲k~̪yۉP"XJN2Zj'pDnzp8o*–GUK8Իa}fI4VGEYvBsU|K((pH (l\ >9` "*j5jCX1uXѹ.f~nvh2?ٽM7_~DPjUMix}3UayxӺ9icŹ9 +ɛi[tvu?`P^خvn6'|ee|ՐD JARޗAOM~bzQ0Ra!.nBX;ئk8Ԕ_TH%ۗ6pс$xF 2r+VQ?\)Mrw.8boUT+Kc #d(T$ÎF\de. sa.|] : +Xn{iY 9 + +Gl3mw{łI- K_h N>OU2`*P8+&EGjV)9#7)38F޼YG>"aG~s/%Z4E+9ANq֨DMS-rB& ŏ+ +}׎.9ŲI52a4MSrq4~J2<ir_0;]H#AX gZZÜr`xR;fsEs^4"!ҿS :;+f%n1{-}OHFo߀ŻwHlFsOJj|_GA7qDMf82U%2=W_?=3.hۿ%,ݠ«NJP/`+зLlAU07,`&owv=7xRAޔfK +͏6pj,XxS!+ދsP>|Lne!&pC+OAr+2^<[K9\4@rE?my<,3*,Us37eI  Rh+NE"&zm]}'q%D,ѳMO:jR]~⺌zIn8{WEx%Bt$Oz.uԹVRXwnM׽4wa5@ TB?ZFFM<c)K1VL}]$ Hɋ&"IXb~y故wd&TNr{J*TV^}qBဘoxmf٩4#MGDӿ;R~>۝Dm.1H&ݡ-v~>iav宂BjLQ/KvRdIfhZm4BK`.lx!cx3k$^ pȰ$۪ ܚrQ5yNylj0gTc= endstream endobj 3630 0 obj <> endobj 3631 0 obj <> endobj 3632 0 obj <> endobj 3623 0 obj <>stream +HWn }W v/ ~EzA{GdfZ#[֝}y%$Y,yxxP?E_'n/]n/HE+WpޟpQ+)en?|> Mw?םqn.~:+$>p.SZLT'G7CZ)pS%l|]IRi?1/T/8(Det +U|9$F;L}O, IvtLN57t hp:; hXmw*>c%/&e^(wߤ*ʾ֨T۠8LuDZ2I)mP 3<,ES!g V6)qI+洊΢g PaY05aAîMyWZma=$fAgN^{݁z^iP<D?$swQ>!,=Yj ,Lk=hFn|#G +ąZp4=H`"1VV-FČC4\ 䅒f~ZnojNMj7^Er dZ;=Gqg;%ғ\>alFĔ h' iEh^* -Wo%U(ͻ\x?p#꣥V4$9[(UO5 %K84< +h\DN9R$#Qt"fTD支eŒZrW +SPɿ$q(Q,~zfapߟ-݁è#X#j endstream endobj 3628 0 obj <>stream +0 H@&Fu HJ]QCq]\TR%X> ۢL[5v,V:ŁEQ@JRr""?`yj7'G4M̭g#N +t`.&!-kp/;0vU^1uw z6=kFC/EQs '=Y1iUEWy˝v2_ wcfH]ECuFa#UhV1(Vi Y^|;gmVj' +.j!c#V[}xMӐIH{ +5Zp{0:N0 +?8nq9r}l=1ĶjOh}20=Vx$");(xQ3,ک evƥȟa d<_4x1Qm)?̑8dX"Vx֌qjA>!?*t+)h(5V*lҍ +1}lh_ H~Z +*Y.oNcE3܂t䯡 + #YId+:dC z ,.|_TXiTi&?5<_ ~,Un}^X|D_+YzסR6.t@kP_l4JP 0 緽TsS0oMe߁/[>W +@kv$Z4=$l2BRfv#9PPx֥I )5A t} *;Tz5#mR;|iC;_*.YZx{ $~%+( p^+ɿFxkEkj:U` + نq*q 藅X $8E(P1ߛD\\" 9e ?$o;̾ZF`-NH]}Fgnv& %UlaOop>}6J{s? wFQT0,*SRZS,,7Z"UXvx*0%:*f2A>w5!L*#p-tsvkH ; DRDi`@D.(mJI5cwJAk)Kf +e""sK ;5TU~;$q GPpj#{Nw>3x=Z1/#! \-Zk<ԥb@s\KJsJlr>=q +0o 7rq 3ef0-q$ .|1KgiQ˿/졚d\V+Ui3NzuZay(BL~ƜvZ}iiIїd0?UYLCL4K^4bZs:K%۵Jn7&]uj([ߎꗗX5rF%WJWi倀ENu`fzxT9#q{Ր0}~KhNH2(CȆ&"8!Cڽ_$,Aüz*Y"+^އ2'N!y1­={X{M`s2ng9Y-\{94Nb>141(} +Zb +N&'T +f1j-tMI 3&m] +W)\5 +Qh}׆bgbƚ]BPu.)KM=ݥOY̌uS=}OM2BU}h$r x7W}Y2iO8r؇7.Wŧ $߰]9^YСV!Lf^*orEs ^_Gc]㤧mʠߥ# c18rX'e~r'qCd@goaoi|z ))(JoO-Ts~-XkvDh"%|Xpd3"M$ iesP*쥧Yk[FcS^ + kn¼Dsև)?1/%m0>zFɃ#KtynPxV Of-ݿ3J)f/E7BS6)y$)@-m +V&ݫpݏ*n P2܏1cDZ~KZSDAF=µ~{(y}E#x9g +6m)|L+O큒ajUtY@ܻU)yh(Ň/ 8r%3͙ |ݥ9ǥrosf' +?Bmm +l&>!kP,ͬq_j?qa!xgJX d-$ԍoWÍUVONY]Mh{,heF!\G +I*-}pGk):?qN=EDDPyE3A!U& 5d5:tp+qfaa>Y3F${=iNDpg,q1R(:/0t+4a`IaR%u S?]$D-~%e͠-PF NL 6)^^N71Xt4?TI*VП(S]KŅ^hȩ HO::`o,޵ܯ:W4Y+Y'5L$z͕RPnvHT*Tʊ"}yEr 4nu; O.1u8P|}F^i mX;io0#EOvyNH&tT@vbL3Rr)g]REQRgEQJ!|#oFw,@3hɵp (\tiՓg`T}6;.猺uqHXYPdr;j`-}@>bRV (JYC{(h'yyz^NޥHR(+|`dx\ތ8g&GUrdrgb@!$䒎qJK@ ܵ)kX U.i֊mv$R(bC?w2bT9ҩ͆,0$yP8oZ*'m4=>4H+g:׍d +7Nfƛ3^TƨhEQCGEd eG,QρLdυ*ZcOT=[-ق$KЂQ}fDm +óa N(%znN`6Fa-r5v+Qeט }uZV =shQE?^!;uR(D AτW2[{wPT-vE~P))ר%p}TV?XQ+=?+Fqmx +2tKR7h1-jpi4zܽ]Ϝ┨e F{D4^(q߄*gOePJ炁3Pa-Xp +>@Fx/s{[F[E:m}MikY(eL HC-_[\~5eM~!d*Თoi_ؗ%uT]}ҳkJG4%sG%[|"N^]hJd!E;Z;-[q냘,>AV!ۍ W20[lޯ2@P ++JH>V7 y' ZGA . ~ &3aZAou`ެgrA BhT6P3c1TWh8hJW_ɭSonYq wvա3n"2W(]>!,r8d^d?!?=GG:-:gaǡGFe*r?6- 4oK5/4==@?q3}BEgq%#1OK7ggxcKU֩07v\ MuH*"5s >3sh$Dpf  K+pm(!`}{탧/H÷P.NjWd.>%m7uCSNP]}4*9rJ#AZGIMkn\vlL+x2IP+nG ۋ[nj<qկ73|Q6Íjɹ僟ooTW|+P o|; ūk@ED$%0;+)" >UF5>;/܇lMAW1o5LiCėGbQs/Nf9/{w%:,B9>҇Qu +v30'ވw# ÛoqĺV5"<աIWD^dίmSI1ׁeծ|C p~,gO7]ς7#͏{^kBqث/0>^J'7HGhBrw: qCU0Aw}շz-CyeRK}rjYSfeH1ydӍ!$ò}r2*]@],g/ +y&/fR*O\>P4܁L v:W\~oc'+n,r٠]+mSco@ +i>;+bk3,KoMvI]~8>Bb{3 :\fNΈm;O<<_Gs5Rl<OeLs8̯ F=Z9~uHf@wY KL Vn-Izra*{5S +5v,:QdiQ$ts>cnr*9;uF(Kt'@b/2s*e{Lb{4c󉊻Sz\l@@k 6c:tV$4K*H7>|+0~3DmѶ>|q33FE0 Q0-iA3$F<l Ƹ&!Uy̗)h:P-Hx4oU22BgGp?N`$QIIB[LiAwX5yh^yiiM| +h(0Ll i=nse%O>ښ~>\'HʨFu+M>ؐBjr-D[l6( \m%LX>L=Xc/u-`}rr]/ XOfLZ\ǀb$ZwZC?E7*BѮ }B'18dT~nУu\ÛV!jG;Vl2G'; +LUd,VyIB~zly}ULb;JXwPi>~ +  +R.>$v'4rj?VXL݂LnIG_L{h>d $-DHڙl*.xZŸ( #P>ɲ ٭[G9]&/s +!V?OD+RR'X.EBUL^ľ n &u};ª6lnյMM(*"B,7ՖPJF@D#6ت#;sJUU{JZU>Ia2ZI}*6RnkWcLs𦞸2yrwjU:&xaF.'Ca.WPnBHPcA34T'`"r(ڸ,(A)2&Ds͎#Ԧ(`fJ݀Dh4tƘZS#`{K!A\1Cp6og +uS"_cn"4!)SM[miApD w`2˳`v75!cU6T2U)wO֋~W+AIpاS5Gw0.{yL)!/=9So4xU:ő<(]<.rןlR=Mkn.$4a 2tURšV +*C*!C'!DJGXu f8]5a^Ocfvv"f(?mA]̓ҰGFd}Ј$n3w}:Q4IcQPnBߐěu,i)c#HMR@ -ű16p& +NVF-mr[4Y`#7X0.)*V+<=Ƃd5*Ax{ Gԓ2[6s#@KwaqzP5Nw?ĀKXJ>ssH;/'LPz$FΑvs:fRz9oJ:>#jev'ZQjjgWIeRWwn>%j׆ժ;yd.NSlP\鳍J&o(qݗm@?Dւէ'["V Wdh-A`Kٓf@Ԝ)ޯ[ ;{ƖfeWgwR3޵@*t23^ ڍ9& `0xVOHJ; #X?8iB6k-ґ_U؏bh tw8[3aeYBp, Y%]#+V9E,M[Z 5HXaYc(x ,"2CdV{Y~Ʊ_J:3s.sL3Dl$ +]AF`$HVux tJЗᐼ0Ph@C"vM'Qk}[L!s[?a,{)?d(p*!0kz ŶC%|` 4Y2f9Fp#|DėD +KtwQk& TcK+5Rl.seYw{peigUyދ[|^]]00"8w1OfFe0Pf.'o!R:' (=-!Ca}ԕr[w3?y&IYGפB75!/KfWkCYO H> D"yFkefHϳ)"\-M7godž" mp]c-}`L+$@Ŀ NM8lU-h,=ޱw c׵?.6F箼.S't +5SJѤ XL k> 3eJAn83y`Phg*w}+C:"ćZ7\ ^8J쭮΄rO,soxf7.`+6l;Dh[qVvP1Nfl)"\X6>О +T.h-L-2b +w^z|!sճ+5 I'k%z=az+)>œ ƔpМߓ0lH]Vi("D]%£-ñ}n >f6,iKS߃q2ĒMRr0:k!R]7\&M \Br:k)@"iCv8Pҥdi:#8v+ f?QfnhaÊRY0+OD²`ĩ97?~cg ,|qaKw9E +u@&?Ծ??35x˰Iզ j];kLC6fňWt1 .wMCQ.?mR"h|czk~Dw98 ++^dѾE@5,X7grlSy)&>UYV&];mw6|h<h6J yHoLZX;Ĕ_F1\#h֊UnloR= a/FFUuCi ;Db6Nljo{MYӱ~ZHDE4)2g WXg}x-~jBXb6^jkt%^VVR`; +SWbh*B4C]6_Fymn̲TXg;JDmpB*LH+:Kg'w k?<ȕwq)׎ =M]Lam˚ZHa_5a$%oή awBT86^PɴއV +4sݤ]zk-p,|BwGNK9 c3c; u:Jr=z \ǜhT vVAfܣ$PZR͠nVy\Ky&;.u$[U3F5S̹v*3 `OA& &1~ QZBj"T'X3Z?/agl<蔁ecq"kvy4:ƛ2Gl%No6 +AsDs5SrCY*>{ lk+-t=M{iƔ⌓R#ߪc2 ,`0SuRϮıo$ /~鞪ٰ/=}W6TcvمUS?m͡G ̦zHkV>T2C+4)g.΄u,f =Q^7# LzQ$P.p('3qaLDI,ayo(vd$iG)n̺`/ )VC֜u;}g@4r9{= *kbV&]V,m1Ƶ߂~O*j|;() +hRaxXCsZ_\e}DH8ެfqK>IFDnW2h$ԭ ?.9[H=;bvwJ| +rWdnw& D8kͱ2 AA{9d^u̢EDKTVp #*[A%ŕóxL5&SA?o4VfN5 .N!R-#fLyfJ33_~1]䉱V 粐`d{8 r)LL[[5]I TsᅿX\w8O{.u?QUbD/RrEN.J]&Ĭ@^}Q. əOS90e;#J O^7EG,Fϣe*z +{X0gs䉾i|sd&Un煍(C8|NOUq֍(%/7<"?lC͠x9{nX+;(>N.,9-qԂ +tHmF`Sw9HBND-9uNٹ2}| +X]c,o P+Lgf'}ko5eV:C?#Qڠm-s 3ykN֐G$̸΋M1lD|cÓ8Җ7EsBm ej̶K> +{0&]N2N\r'Uzw6r=xC^-y-1y~6V|z{]qoAjdD)Xo!2L %EP1D7rOG]Og ~diؿH߾=G˺Gy*xÜ@Qp#4څ1i| 75PZ3nG"9J0_ ^tBbd٩\"[R_jk"]yeFPA} M*P4S( R.̶v^Oa%򹂒oOp~Ɨ5OV@?+f/~e\IѶYd,q1X:9u4>g!3w>Iaj$2kC +?OIN=]0Јb~g_[#"\`3<|XCഺ(0U!~JP䎛i6 +K` Ѷ/Gvn:l״Ƽp>ܚbB"~+6"hPˌHg7Ծ 1":!{ѶCOAi_Y ǥl/#uF ùx.^G~G@2Hv~ W>7e%?CoDESf%|cR/?(jjUZ^qj.$0b:TOG; +>cOʌlkQ]Wq w{1Shy&&#K#FEԌx$ ~m1k$g фa bukb ޲8 Y ٌ0bFPhn]ːMBP (ZXI 6t۩zgͺLorx >th'N9G@Z3zuhEBe +j}Ϝ=rJz cԭ٭m{1H@w}3ٝInyUR8%SXj\)⛴VEچĚe$gːvj3նQk'wɾBx+X{Y +sMs"VOB~W,9lhFJxl]_ǎᓻ&Eׂ7Y7eV(*2ſ5sP|d7Y}[{ghY\d=΂HcIWa6#w~8:ۓRoճf]K 6"߅xhb8e@ ohYz5 ܹFL2/XV%Kr}}7L=m58>*L>lWuEz6u#K︥1V c˕Жa(`B-*xF,o㧋'Hu@S":{Z0/Q +0;GEt,Ɋ#ݥPE:դg_5PWo '.s|6`N!y CH-95*̆XFGnZ h3_|<6%C6R{:l CT Ռ4YΩ*}gH[J +"]DqFaN"76 wɦTo2~dTXP\Sfx;6sil '7nLp+N992oX@2=dX>[}\3L=b:RY/}B"kWWׯ9&m0p8rH곜`gyv)c TA. ?vF_^=M #߲gmg]a| +960ʒлA&F2DŽV7MZ#w/F~e$_A]p|B֔ճ=m'p(CZzaLr bL1*Z8b !gBw܁:C#g~fا=X6)y>-%XȔ]B֞.-?=6`bOfϩ|SCצLߖx:*"8$g@+&]×]9oȨ^TZ \N~k}UMcm!ue4s"кغxaNgRzN`Pᇨ~_ue+HkF ;ڰŶXHQbL<_ټQ>2tY$&4O!6Ww# \r2iaR9XVG#b:K pH 'dnB)t43& +X/g +xk݁M6~pK10O`&(7y6DQe,ݷ\9%TyIcغڈ0QgMwC;Ks({"\™*E/#rLP,\֎̮kQ@ Ih753ki_8܄JiĪ3OTOC*P +ްI]@5VX4 S+?gnkKF/pi +!~4MYLڢyr}ar8YP1y Ŗ81K@9Ū!ߌw-jqΧH6s.%<\p?m9(пzu"7[41gDlN^C!O,CLA +̘U6q4sT{: pa9RXyXm(,Wo.ոJxZ4.E\hJvgàrPe$l8jXp'?آ5?%ͽ۟U/B4֛׎~cڍ;PqD[V%Ǡrp+̴b&c_e8v[䌛Yt/PL!{J5H +FXƨR9"BiԢP,Q MW^oȟ3F,ҀTz +Xtz9igx&w˥#03^GF^*4ljP3 endstream endobj 3624 0 obj <> endobj 3625 0 obj <> endobj 3626 0 obj <> endobj 3627 0 obj <> endobj 3617 0 obj <>stream +HWnF}W d#f`8 !v}f8CR^df†-u=WܘJ0B\( _v/_z<^ejq\vQWݰ˺l!j_2lo.r.1wnVW>7&~fY% 1nfs'~q|=~5OY̝5FiCt?HSQeïm4X/\!@|\^ ~_H3jimdبL o9'[VFbST5h.HoLb:՟J +E/BzO8n3K>[ʸ\FKpKTaO(}t?Rh7*}NH^1hnjv{8IU+||֬~>XCn֤Norm}IO򢓠%_uѸ'_;9B2 [m9o`bt2!UI C~v\-ޡ* @!&Շ֓ј7׽_ˢ[Ƒ>6ۮ۴g2ubK+l$N$5V*SP*N>R2&T-}3 ː6qUe׋k(4~x.?HBkL~oW;~7l!<>b_Mگ1q7zCsL,> ئݝa"nmlb'Uu%Vy.oi:(/OG(pgd Tfnm2t1-Ѕ+ d)@b2H&<74c*6JIw!0|Qf41~ʀ!J;f@xv H!n.B;Ϭozh*T%jleHA ,>D" mH@N3vۮZy(\8Ø)x*$ @i>`{fifܡN YE 22-d D +<) "S b‰/{om0%hYg]e3&`1^:΢S)vYc1٬A騹\F,54,ZV(/!"ي,'fǰ=P4Mln~e}a6;_C9\|CfkAAA1`{[UWrLwZ^6 Eg*0EφXĹXD p&Cp"+ oCp ܘӠwQ:xjcL4:ٷ3mqIZo]7|ɂk'  v&~HTxGy}VB0ٺ.VF%@pDbvtZQ#>ߋL"\ +%l`; !A, +eMdEU4fJm vA\WgKt'A!5}t< Aa+HQ`e?](FK3‡L0Ugb|h;݇|H{q@ǧf:^L8t7z9K[wu* ZYͿ%MBTm~i1vqV ^yw/J#2B |L?lǾ۵?\R/UQ/* \`f!F +2Y#walֱoYQԉS`6ߜ Ի]l$`k1E"`ݾH9X,h +zu1 +:s2V\*{aT<)Va,)}#kW&=g2!ڴODo\]~LU_xڃ53/n<:GVUє$q3zI$"Hb1-$` ]QC {hwF~ļ*+lvhi]fis>7JMз'N,cEQTAJL%DMFڱw,: +uopF (*g~kFߵۓ kfpO8irks{Q"|u$n=5b`w4p@NDʒ$Hbzl]si|щZXl}GFʈ +*Z6 h#82$Yj$ܴB`7o.Vdc/x44NuRQ1.#"ueЯ߃XF;`U}6$eWl^ 7jRsߗƩxm_h(Ijǟ= y#N.JGlf+lBjaÓWц[x_#zhoLj޸2ETl2_۬9 (aXT ;(;ji>3xVHoX%#yړjH]AV&5Hxn])H[M}e(?*,$.YF /n",!X>WBN@]DNL,묮ݴ}[%ZM;fF~=6ՠʮ&fg0 e%m3*5ÔT[3>0&FG$,YuiU4w$*B U6 D +@-p_=4Azl9H$'HCX,19[F赝J>W(eOrRn$;6PQ\8]23`\BY8ig +.J>eO`htgh¡ 5 xEFt_pfay9lh#a6?mFM1W'r.L Sn=is?fwc;NWm[ƣoqRg7v`?־!D`Nu۵Cƽ.q3q36j<$cKOMtƟ ]sMGam69 h[ι~G!9l92YG" PmCN'v-bmkihǦW,#J2'Cβ endstream endobj 3622 0 obj <>stream +0 M@&a M\9rD{E Q0ȺO|CǸ`h#{49ړ `S௹&9yMy~Ntp%G>6h^afĀ^֪b$WqWYWfo}f8J  MP5_8_xɹ&ՙ +Wh㣛x1?R@VMb]ʼnˑxv*E)G,w-ayբ9l9e (Lߥ`lۍޡ-e('j*)e?*j76fjOW|ȡbcײBQzds(]L|}>]tKu2'LU+<2n\HthV%ltsa=,`?f oۙ'=gsV #u +!*Vk^ɤowuo5+f+&v>p!Gx[/Am^n̓N$jn&mί\`}i mUz׶z7B =:*F]6͠+G:4>+)Ci( K|i^BQf4oIK(y%DcQvh!nӚ 9 &IM&pjvvzi4L{GfۼvY/W HY,.-!hQ!2JN߹jgp19d:arbuź3H +XĀ;ϡ*nbRUG(v>ial$xLeL"Q C5C}JQ;&Xѩx^_f9BM {=uZ'2:pwZ>z_@~ z ?%`9PsE{u~"lUmb`isnDr+>/ +:-WmhTpm5 [(jjo"Xjh (o@ I7Z2F\ +СWS`EП!%+Gz}ޅں. +8*Tsj]{t~2GCGIw7N;Lxr%E8/ܡ KH!XeM醉PiXIk>=2zX,&H?\ le#51w6r*E2+4sbs? +q~DEά~KDcNbtu8֦`k;aOvJ~k)ɠ6R P"sHf'|$|ezÈ(6zYܺx*Y'pjCPq>Ȯ"^&PMHÂWBCWn ^D'IknPkYaL`V7Yuk3 +piYQ fX`}]8|3#U] :st5#v!eO+n>YTS43CXv߶opυдZ)g9@ðDm`$T,&&(yZEA q㍈$I|(.)u4 yg{6C_JAB&(l|3thvz9b{vZ$! Y6X +2E%;OJ!yWzl#3[ 綣Oщ7vP4KI /q%Ο$ܐDqEQ9(fH] >@,궠`Jip <#ah0+ʤUorػ/jrpSe &vj Y6ht{OXVγR" caϹ0p2iI2ge兒*kRe`O-y.9=r/B{SW#)zl´a=}OV~Io>ppDOzJb<^I)f[Nr"T%]wC=j䧭wq +aAopnSJ +lk1 .Շ!p(li)!Qo{D;֡ͧ} +(x7O5`GE\},BW:nl %_ܖ֦(;dX` ϩzI`}/X}uMܟqhS̀.hPdNG ׆1dâm'2W%|'ƋX?~xsrVB>[w1̃rݕQԂ><w{ ΋#BEWl"pɻAkY`'4` l7%5r^Rї>\TK8 6,?"Dzu9H~QDܲŽt9eߙۦO\gQFPR> 8J-N'A<뛇$ ICfYNy]|a>ۺY ~59͕nlƹm9|j| +jfzyU(=3f[QA)`m9WpnqqN!ٗ$*3'I~ܮ\aEgoE/1 AGvtH :BrL]f~q~;"S2 PtmASQIH i',Hʅ(1 2#z>)^%=~[ *h ɺDoh_&,N")S2* 8 B1pm#r1}]jSH9_rjPy\f?X7p/G8ӍlW%GrgT ++@1<#;k$EJPGv,{^D)R\ZLdDQ(!vɱQ(='! _ۡ V}2}W?rYb:Wž EP%7΍5s_rCH"p HNҏd7qT7VMږu; X$B+( m?Q7-ڏxr&u4V.gԐV}'66&{N2Kh[5O|H0gҾ5n/(ڴ^e `Uk5y6`<ʾ$E LO2HF6欢HvYaQ h C{UQvkqLŸt V7= IЉ^,%W7X5t!7ua3n<Zpu̽gTޯrFQƆc`Z-} o_qV4uЁ Eq/m*n)<}r|9^B,>dX6[0e:D ̖-_b3 +@s'np_sF ]* RB.~|@#J%p]0piB${~v)}x`ړ]8Eͅ[nN@NJ_nł6gl={s=]y[5 èR4B|U;qy`\Ʊ:+ +iKkmSv(N +fRdSpknAQ!&m9ڵ8Jj轑ոƽYM:b0Eo6hggvkg X!Kϑ24cJ 8Ä57O;[UDL [ |]JAItefG>uup{za☣vOL" ah/J]Q0z6P)Fb} +ޟlF3&)Hn1]zFON.aV+8Hp4>KĠq\vK4یJPkw_|6AN4;r5"t 3d*VpHC/h2*oҬ&̽I3Bc_pAlYVM}pZXzNS" J l"C _FtZ +$5Q#9`sCݭ~V&ݖ}\VsChe?mBk/[_v~je+,ԃcZ"\J̱l.@{ 'eWΕ +mu2[xbIԎJ>jDIQw׀$)4mULصr5 uU"FGt؟vˮ.Rk|;XttNyA.g*8){#G~YH&Gp C618$%q$ET>z@m,)!a#ZzE٧jB m:-M-<2w*uj5jeq_qM(T.Q,,mkܻ<:Xv#.9%V/{R1V!ј*jKkpr%+ # 8\XYn Z.Hsn15 a̾ʼng>gVA;8_8b'q7xm1/L|د(%(<<|՝F$1eY_n#$ Sr `dRrk8jCfaقoCڡZ08Mp_sf.fڹ7ǿJlwotR޷2,$2y67 1m7wٞ +ov;6&N6= qz'a8P!P*BQNy!C72A0ohOS:+GuFܓw0Bnev; +)̩l4U(ױqoZN^טVH& w|Z&tP5QVU)}h5T ,N:4!td/7vx#d8h`5oi-h0cw7b% VkuȐtP5&O9AmGoS)1U`kw|VmSJ&HDui29^0hu1un:@z8o|Ls\"jp5½2a/hK_&?L&pk=9Whb :SÀcr29p&yv@Pyr?U}#tSK("-QVl\PdJKSE:FAX0nհeT|{8[U @ n>althDqV]pOxV(mٝMzf&H3꒿64\]瘻JڋP QSs`a2) qNCr^ү'j@yFypIo#Mľ;I"TF0 ཌfד(5n.pUNu{,B1_\|N̋|AM2ו϶M@3SW&71tL`"Em&d=/d #I9 W +9yz7_¼JI` @"60gT\ ׳6kn>+Ԛ9Y;IJn.*o .CH:e7K|{ũVA Zk`$Te4{GhTR&*Df%ashGXDfZ;HHKFgLh!oرUNqǗYT^1N:E6;ÇTO5t"TQꗲLz3Q4a Kj# TפRS$2ЩN&ȁLVTI5g"f:=uM7 )^R9N_式숪=nvm !PsC(#;7`K S{>>Q_tC(6ƭxYq:Wx_]K7vWBO:_2@5VA(ٴ$gQĠ2'KSIƓO9'qNBrd>(i\C鉵$I>BéZz2l#c&MRT FCJX;g̛QC-fztHuWFaP@ Ύ]ݮ[uJ+v㯣DBX2+dsNmٓ7^sT'aR 7e mNhޤKgGFBk ]̦ηu^ZŨ#nb>ZCF|鰟rnt+/LSɧi(C 8i"x1p7E8Dmne_+yz\$7> yvE ߪzy+\zF&g!Ҍr-7QH.&P"6Ƶh sQIX /p(1rׄ RSI>υoO.LU9C{0!-8҆`;MYP| SZ5~ ɲaX!UZYC9nK}%\z1g&6^K=g?t-:,.Ś׽:^YCW=A?LYMB:Gz)NPcH{AtL92\V:V-;<6T^G +}2jaFS)1hk&aCz{{kZb/o- unOg|NPx93~&ķv@d4ԍ%՗X2DxFދLeW겘b8MC=B!J$!OՑmoLX;S!q%CXpL4>(Tc_/`< 'hAf`ѫrG7mqilE+!6)@[R`rG RDx9xۑx;2׏`*$baK_OP|@Μ +x0 \fv1Xa)-) x8l61f4>Y"[k8C5ҫdBm.X0'HӒJw:= +'rĘ).c-5 +DfTPWgr7FngJZG>;:e\5N-Gb 3;, +HCꚀk##C;;*\bP&U +yԾEJjuCƎ-ŝ:8Z"3%s+?YUXf o'e^-0Mٳ=mI6R(b% +pa_YZ^+4X +Az:|ט3^3lDþ.bqamcRvDArGȀPwztz>`w$Q!sQ-16saj,D},( +[=9ʦJj|F4>Ĉn6N|c@Tg_LA,h`wD%'3pX4ӄZHgu쯂Dpu&-p'HR~ g{MV76"c ՛V\{6k,OT<pen U,q>w)ܴ;\Ll s!W WP Ρ6<zY(F@…EGr\Xmhq}|~(+5VP9.lDY @ԗHؘ<.*R|lq:2ZWMFuzhϼ C쐿OH@\%FuݴŪ~߈% +|-VmEQ/㲙._ʈ]VBY DMWWb`wݴ8uYP /{MLB*(rvMer~FG7;c4E|\cPתZqD*3o-oipqCve7vdpuy8'IOG`V{θbҗv/v%i+ˬ61ݗ-~E$7b^f6ShѝpV{lDfCeF _z*ؕzz6~sgCP_koN;Es&bn }2v\[3Jͧ>,qL}'p +/c(Nk+RCfÁI4/qyMyh4*`a*)q"Z uТ"La6(" qd_T~c$Pk| J=uV 5xem]v @X{ϣ%|T[ +Ư>/Sio\"l}:\FBOE ++AЖzA;^~hh8nK~/oG1-^άH ~ßWN/mq+;rΚxuO@(ۺ+ Vf(E0Dp^tT3JenW   f,\qޝ-$H\>.tcޝADș r/!켛G!rڤrTLکKeF":u,wtot E3[ɨNq`-2SPȄtb^ޮ]s},SaލdWQbjT'pV h/}^]`o~Pw1"c +t_e"\= !i^,*o֔e{|2  xA%p)DPLwtPK=8Myto*_{8-0'E!:hPyuW.f}.l@';TDI3 !{ ea>.FEj+yuB=3-\v[ hrm޺BG ** CM iB{˦ܭ pr)n =; ]ĶLj +Drqiyo*L@1 cPeZ,rj{W@'OZ]X*nюo?^ǜ|FnszǺXK%LX~`z:8M IMp‘#]+N?$dkJCUoSc((FU]Ҥx c/Lgs$f*NXerlѥ{';,FM Χ$UP}~v; 1:K[ZҸ^QʀlPpPW@ ^/:RD}'/8tÙYbWz\ӃX ƼfVŭs~n u%?o6QdnaΨDz8o뻍z4̕I֬z9p. 0MB~ ui&*˧b\Z8m=z_GCO 0[&p>x@Ww>K7_qt(fwMFD6TʹVFeMnr9<3J[pn J>`_N2LDrp gZ9V_:\Eg`gY`j Sc&+(H{]y5mX~w}AzKP꿞V-tJV@7c`I*sx2P@z\?Fڼg8͜vڅu=E[\']p?ӥ[ZGƠc苭1,G'T>1P ]kO~=i W_?C34p`M4ݜ +E}ȳ󌭳BacAeŲAh[ X= +^~g#;-O dezhX{q'Π?I{o[B! Yr7 b];4/r`o`L nϸp߬9,̙#kS֚&{ ϲ'@hBJ}PsPG#?lVmQ\Ki,!vtGI֢-6X5f 60km4eE&=3&B1w؂d \t"#& o\Z~>^4þ&io ɤs{h)/!hZ +C^l%0uW`IG|WCWHhpwF4" HCseKG dxCtS1@U0-! QH)k?)I>uY{›,=1` _KhF:VĐUsa!ke;s?DJE EY%{l Br ECgҨW9k7Kl#!_x4WkkOY dA###YU{O VE]5qB^d|/!}(4;Jδs6}\xֈa"li^Zn`G<_# +{5%wT0+3DN?G$rhI;8*vIt$ 3_sכPd^DDs6(0ӜY4̞z6ycUd^Dj`ԔS/^qF9Şq#WzFQl'Q׵ +5؜;/W*_O*v"컔iWec:RD找L  D} +uO]ץ%,bCȪAk/ΐpNiAۋ}# +)2U7T=BīD-F,+X-vh;P$`FE>kMW2_?Flb.WY·qgxcd6i!qn-ν~YIwGwK3_(E:SUe|ȎrJ'Oh"D2cgd{& Mq@bE{󖽪x$tȡ.kj: NuʝCS0M@ +lAi0f2DՆK1ܗeri>poJr &;bD(Zgn^]Y&BkR ,ޏc#?5!|?Ȓ|H"jm;)ky3+~q.si +^,͹L5k#Y?~Wδr95`LwZY֌VnU S{ai09)]m crWiȩ—~F:ek91pg\b>Q{o f·n3+q}?qnMH"Oi^0|/LyBHUq63)-'6rHR />ShX +$3_v(@ÀjU|bv09c2"Sޱֱg r\ۉHO9WpLd#sGN2Qd+d~NϢЋBuҰV2\Ӕ5MJ.!g||ip `u$6e= 6coZZ\6MX퉾5Fۤ* ɅG<}-D^ +8?qnXߞ /iZ$+3%yYE]CV%<ѭg"_p$}{KBCaŷϙnAutA:/q1E,D +fRMG,HJB_SәM;:M𰽻ڠU~#HC}! v 4 {1ɍyVI_0 +D uD 6$,dtGZ'p OLut'VGk zos!")I]85tP]-JEe!e2}K!G_m}Er\lّЅIċu_1!xQL2T ܒTF+x/$ӑE{vm}Y`70]{ue)7<-*R %nEͲZlbe,3nb< $rwSIWMF e[AFJHYaS+%H~—}sD$AHbP58^Ǹ[T;E;MVZPyVeNWQEu|+p4׼ Y+CS:Eض&b vӗ|GXl@/%_H޽//ŌIEuѢ@u__)>Ӟ22}I(eRBUĖ\#BAiKͅL ;!p o}9d..6:_-"ݘ4ia%UA)QĂ kwvxŚyo^i` w{Z!>|߱Bf(~/MMPod< L)- |E/W b3ۚ{H%I*H'0L 8Z RX'쑦 ;y]olQǢeh$JhݣS kZ , ~wz*br+L1\~c|>fqҲu,1qLjf5T>d",,rY[`bCpL[upiZQQ~,~@R]f|叠s-+XH*qf}ĝS n +Y(XEhƷn\DPZtBAJ|g61l7W%`ݼ9\[׷E:`Dqȱ @̓KtQ#kX"?D6dX.|&VG#B_= ѲLec)PAd60a5JKeؔrVC1ƁvkF0DldZij<0!v;mlIGwqXtSBi@7}}+x]`VN]H~%iA +A_q@J)l?mb +o{ +ݬw%Q-U&i$M/:DEVƬF4LbV25b+Ƚ؍eޜ@;'=xy|9ͣ0r"??!؇Y.4 0#HR+yb"jp^% %1dɠdevժu[_I \ Iv|rygפxϳ"[vkd%BX\ZԅaN/[k=^~/kqý\='r௙\)̠SDP aM\t6~]]&m(c.Flİ9/gc0ـ?Cp_C((xMɨ)vG nH/cć*m|KCV(IzyasnB0bvv,du{Dl8"se]1ROqIB_9w.ݫswv$'u٭W;FI +4g9J33%Wjc,@ $iFl)b2j-nB&t/h)˝/FÕS|UqW@f<Fo%kv.Oqy6}ˁ|CwY|~ LȆp02l9 l80R.Z<ѴЍz$?fkUgMʩ#6r)Sh짥"U٫l໏OC20 1jאs>hɯe+ +oBj r,_455L/J蹖*u`ŸV_-03]oe<&f-Ҭ ]U  +ڶ"Ě+OAUG~=L 3OVIs r^z$$Qslj˵1_ +̾| p}XJ mjC!iKVp3y 5R~"ڀZu.Lx*aU^RO*=;>(Oր5D. wi嬯$WU0QB!u6ÿ%y90BFAAǸ:ejo.I*wpz띤MFqB(4՟'i;s}]X4_wLNI@&<O=׍9eF,ȀKQ,05ƥF,<)ޏ+k0nrɣcx\ C>.?XKzRrՆJac >7JiMuEH.gi!xJo 4F IZ'mON24(U@px젳=5,!곃;Uқgb)7sZIfz % Yʬ,3][23AVMҠd$D2kRBxP8+떙D1 Io}3iN4 }䎎m<;31NP2:ڑGJ5G{%O`q\{LثPŽ }@%:?5^$N zj K#Iڜ:¿eҽ *Ҳ{ܵn*dpx9dK#+= (3@ɥuP ;)(WF^~3]W*m0=L͝a*j/% +‹x?uq^ūR6J n$4pS;9NnCj^;Ct<|Q2`Zb^_;2߶mJkI rY<`^H}V̶u 5u0$vݳ:"9V4ޝt.uY 0؄ J# ݜU-gQ8TITK`9jIƻ {ASif, 5cۦ[+Ec6”c,\ ]LQ :sovtiUB $6Fg?Će0j~noƲDqBo.njwh*QIn/ +*ImioeR~FErtxfvZRK=VUOuζXyuIKh-\i5K {Z&N4@oIT-y )cň!Tչ endstream endobj 3618 0 obj <> endobj 3619 0 obj <> endobj 3620 0 obj <> endobj 3621 0 obj <> endobj 3611 0 obj <>stream +HWn}W  Z_"z8}H8`D*CJSn٣4$u9u΄ӄRʨ+ +4Di[؝ b%Km?R(9{}[Vo/n࣋ٛPMs,7ЧL pN[)5_.z=~]ǟW!06v#ڛƠJj!Q]Lf-Ff֘lYP!%ijoCݿהW}^M!9VijI>PiG lw]5gM )Nv8xqHc}rvnf)f¾&ż|"~Rf8{,ǝ%RaK7U;4}_eq[sh*hM%hZIhd]KaaͽʊCķm?0v'2f`ۮہL ]$*Qu=b\(„L$2M7k,ݾ.sɜW8gi)zW J +-cfdS&TĞZ&E:A!Dz.(q/r r<: S 4H (Rb8 3.p$‡:՚i1FɵI/CZa#Upb '^lzxҊ?O?JY]>73TwT4 —`'U `Z$ +xF-"_RUf$ [JZ1tu,WJdd'IOȽs=FKbP6*]_OѤ6kjmC7=Ɠm FR48-!NK`h_۾>px"M"=[J`= vVD j9(xe /\<F%)`3S530o/ψ0E:n p;b:;I + BjA  s%  1HRV3)Oܺ**~tRBz 48t + pP \C1vwxlr N DE^w%)aOYY06CvUC^=Q`vdkb/egS챾8@AΏRn H o6,0S埢S +PlrT:Lf{dRzz]hf&5~>-Cc3:u:d4 rRBuCմh)\/aijMslR1=*J5{JԔtE;q$l@}5˃y4\CQ$q=A"/t]Bӎ=OJpJSsl. Wic;H4b وėF5qFCbzH ,Uۮ޼{&g8RfQ0(uB6wMO% AQla6e5hp6K%_些"DaLC4eFBim9M|rP* uw{Jk3]<%fk1Ʃr@}= ɭB +2\SI(r4SԐevYXD170u|axtiʁ<;a5e2SBϘYWH#XiT96hrKft.EWD' KC{  x/s)߰_=>pQ =Hn հD +3CV+w7h(ƂFEMk@>m+2"5 TL[ck6 cr)!d9`rld@(R?uCmh{,ؼ˔v}SNJ4., ЇƝKyRv6ܷ,VcRM12N@VK$_u o ){~`!6 +8'sb(V28ۛkssws^SJaE6@*gh)"h!i,k~QrtQ(0wQ +P ibmH_P-vȓQ :쥲 +@=PC @ 39+ +@*l#*mf Zh +ҽ4'fmݮ{HqY r8pML(уpLy,@71gUAj#D:o<4H h wȼJ3y,__Wj=U()dVE.OR&,\|iyQ'.- 8q@;]Gcj}ONq5 iJr>zSԢqX">! W]}T(I±Xړ&bK9Y'lj _3XN,&O0-Yi"CT,2?20Y -)gya0W*&Љ*q.LVLW@X*ʂ8sQSkڎ籖BGG<*UٳEDž%{@nWQ^hȹ_t1 ̽^' B0ց%ֽ&"vcvA9K5p%YBXE\6ĭj`AǕM;} TYR?ZӢ2o&:329*<6%HVd~\Sy,srڲ&@R^1czx\I\f=`Fw J"yHX &<`-f endstream endobj 3616 0 obj <>stream +0 @@&S  @6 +; >Ĭ:6Lh_c΂0 4 ._uzCw6 hD8*XIdDGI×>jٛLz1ۯr+PBma$HƴyE5C<4%L9xX Zx/}I\̞vޅeY|~RPDr݆#*')]$ɦDz|anڲlåY:7һeI-YtI )Ѡ $~93\ؚnE.e7/\%Gf Ycm[gbL] ?C֫ҙٹS.J?7H>X5HU.ne©ҒnCf#9$=ɴ0PRioWi(A0O`Wȱr]лUy0$4?g,ݹsC;[ݛ s+XMFgȿeE/I3>9Pكë66s;U"(SYL)GI'Y"6;zC-'-󺚙_̀nP\Ǐ \ilf{I;FSR&,$|5"a{Gyuh! +eRׅ}C/WEY?(05rt?Ss0 nB4[F&K*?6^bHGCTv9 :tB+ ++oa$kGca.z(uX/f(̀Wqh&*u_j<v?;ĖBgn­ʚ %;ݍ̓}_{ւ ֟QZ1{ҲԴ\d3ۣdUcE9=#^KYzkRkB QbY^Lћ~]مbȻ LazD4i[FCȕ:WÊu8W˙6vGa:d#.6 Zluq! ~BDfAaB/_99ltrl], +~'` ot]`~kTinIĔ%R*f!}НB{7)]:}݁HC~ U24p" r&| .,1hw0fbR,{̓y3UuX,$LC[hם ǜj}}2_=J k?TDȩcCDzg$;TZ:JbGDBz 7t.һzLsP#b/>ڶOm.45a8yd_7nեX))fXGǏqؼayCH3ѦRY8ľ4&20op*hJ M=}^!g.\^:zE-?^KG+eƗ_!0BqzWATŮs7]xV. 9Du;ⳗYSqSWKBQm10㴉{GMmn>!]1Һrm|50f,ᩴ/Mml?[[_JE6-xw< h5wsFh2ɤ  +[H} $> #r|z}K*PQSȕ0xk&!?j:<nh._NkV#2: $>Wd1CQ\1{%A#J4nrd,MK\|ƭ$DVNX0b: L]gMV qlٓ}8W+cQ +vT^pS=OXހQҗ"Xߧ!](͖!/(36[cLv\p"Gy+pJrVv[31g%xw-|@tG +ЉDcjy.w=aR I55̟d>AV.Fq/HA:/m^9|PPݫY"=n~5Ĥ1t Cҕ>_&KOH1J01V ip/˨_8`lSN2'd (/"$I򓩢ywiUMf>{tEvRx4aL or[qIoJiMR9p!CD)M梭k$qQQ \ +axyj}r+a2LPϭʒ\6t@b`E@)C.ķʰ.t0d1, .ߧ&?yұ|go X-X8؊à~ J>ZQ^%aj1@*Ǖl\7M-Й7ѿFk7߁1k|ՇǸʹbT H0=4U~*0 i&[:+@qH'y/6±Q5e*ly٬XSJ̵gâ'":$G=`#ZfݫW lG*˲&Ed `Rf*5Y)"tKT3O1[!/$R?--mؗ .N/dXw)!yF dj(Ԇ>G?D=A'CeۤyLWxy~C#}!;hv%Yx l<2ц{xu{ Pr "P$~gݾ1 +fN6ZUvT荋ڏ0O7>-oB劰pr|7 7٩Qg|`D, Abͼ!@.h^ MY/faKŞ@;JXW^K\0 HP22f61"n,<$р s[ +zY9y)TJ y!Ǡ/)dNnFIPRka%ٜFm3iGR}oS͵k&ͷ2x$ؚVJ:!/NK \H(-84(W:-%4"AsTZKe}X +g9hS/'g9zB P-NTNcJzuqhɆA?\.D1U| ?jˍz[c:`= _[/qP]_N%"bO-蚓GLQ4gOeSJ߽P xz'I +V-ijP\@a叔KXimlDi~Q+=Wtk!63|i0!Z=Gژ ӡPu=up>Bn:Ik6@YO%tE=*[=٢6zP|^))=XZǷVώj-Ɵs""bKn Tv&)e m[!>mfb %YRD/E"Y|e^w'|1l >3c,xU\/I7UNݫL(]|GtpIdTvF5Tn E=)eF,tKfd]B:ZR9}p +9. T/ C׃(-ސWN\-"l8۶j_ۍE_? >#$NYoblB, }A6_[u>c0_2š@ܛEW*QFnLh{tnO3oxŮ7>yk/K$.6h* G26 02mW! qѢ'bRA3c ca-%f>E jT^֥}ђ27?6EBwe:̰V!|@1mi'=邸O؄;{B O* Dn-Gݽkr˨p%0đ|} |粶4޸F?v˲]o69RHTBbb|.ŵ1O!ﻝw$Ѱ5 럏āw2?,夑>A|&d+i E-Yr+~}1yG4OgT #qJV圉K sޢ-2ՆoʼMjb{#d]Kri0'D"B!T[Нżpnap`A kWe_cVXwQ/\3'zJ|9IU %,O֘]-`]@t;u~"3% O4L&i˜KJK!Pd =ʮEGńv. rz8mȳ8j_)-abכΗӡ~QHgsִ̉FlU";=j^S>=μi#~xN' Z.&" tJzb_eI0 +SR*}~a^YVS z6Y4V$1y@&e @ +6ˁ:3|6R-JBOkr'yiHQvjƗj| d Xd. +AKOe"?I. |/GUarX363'&_$pe7ᰑ6Y{#Wўᘸ.tj3VTآ5 +;}Ƥ8tRNVW)x9X*Q-lF z bql_(pd }2Eҷ-^0g"ERNʄ+Hӛ!G'o2߅Xr?k ~PT Ѱbi?lկ1fAo1jTP}h  C ,]w|7jL@ 2 yˮzaJt9\=ftK%FSru#E5e]`޿㳯RՇGn=$M? vYވWKAO=#|A7DT:D-!(POBZ)WGN_Iyx OvA@@zgo YyWxWR5C`a[O)@SIYlhl#jW^:ز@y%TF Ntc +YXvHZd"Hc1q5W.,DpF˟ UBʆ"ϖ!_X'Bht0_͙ˠi +lh`_zkm8FqU.hSmGe 7o1/؍{଴\ƞ&J60/ӟn.:sHG;%GI[ +(Cղ +5 _EPQgݔ :xZ3x~RUp2[?y?X&sa17Ì$(.0(T4* q=JZ"HpjJY]O_@JL_SRju1J] 8и0+1iW=|#Nqie55~ RrR1Vcʳ|ۋ̪>C`WA9T >k+y1zڻİ1κ@g"&4X{VAk~W\w} K +nk8kP3'T B0LLہU)]pot6;w*ʼ\4K oiɬH0v#Y4oJ ܽ;FGTa0/eRjӧ*FJ42Io KMh\ޅEv 3:DݚA[ڀhtNG7y6"d/Fϊ?K|tM*WBN]omfQl9JM P=UgR17䫖Oe>g_Qb0ܶLGqm(X`K*G(^AV\+Fwڨle3JZp&H k|. 5oB& +WVZ/ >OZ!~AO'u'u30.73*J;OOɺ1Ui@IB s6!HN|$1jZ6"Oʜ{׵BM1OeVxQ"j'g2" Mj1³@MSvz|.tғ;sCD'72{S"E爋mzV++!>ٙm@ IGWO Ӽo-,4HueJhBmA@\nB"kye^b#J==aj݄,q?- `&q6*M8#&Nc.84OJo +bz}k#b}7y8zөH +t(s֋+_;#"u1o@g]UsK%rfB1Q8}v/}뢙Pr˓d`Yҝ4 fP>Mh&3i62\f9 -ԃx%K_Fc?@R{(^NpwHN*/ LDȷv,Y_i ?T<هW +2cQ[v#a`Y=QΘ:MhM*?)YbWerw +xi5eKK $"Nz=<ԌnW\KxB tXԻMos +5[hs3A0\syl/N HTV+TA-OeP-/Ut?̞ ,+ꪡpb#yB.8*1l~ʍUk[b P< i]F]y~؝<qn)퇠ѽ#Q?(D,[:֞{7PD2)Y817}Y[߈DEZ!jt 3T=R8$[<)͉sCs jt a#)U*\ͻj.9UJ(Ztow$E.OLZ:f'm?b*^-]{BtZ2~({ +>C&+'0Yw^u /?R}Iʼ6Rh"ݒUdF5Ata";2netgwKsWS>摮KYO\tK[G ,)@-dA7᭛#YUOe +0b&H?&4H\``SO'k+Ga..cTs/ 5C{Ko[{T9 F[;O-x<A_wJO; E8vaS<~y!qrTc7`qO6Qت˱p_{hʐÃw op,:[+UYX]:'fWQ^N&%=kӤm®¶}J݆@&!v*k>b-v |8T -J%  U7=᨟OXɫT|ӑdwm$|/j5NL_86vzst$ &Ok~ї']" h +o{uڜZoK\:Oͬg})\1fB(/gEp+E:$!=4t 9*?)SސrnŲ)e]ė \E{"\+{ӥ =TcLƺ]6kԍp!-/Hݲ0NE msi1ڈшV/Osy\ju%^T*6llW@;@$|fK ߄g\}yF *bG($:5#U]bi +_FiKԵNU2k AmQ_8B +4BRh|.asӇF>f" s<xr Ϗ0#";v-*sj9s KZOc&aɣ^pTi·NA`>:u1˜ 1ImFoYhXJ` L&`IS)So&Op.&A[iS$T/߬N"z/xLь*찦ғ,7/oǛM"|:qڎ iᛈ^]GȢS?,Uݔc9FCEh{*¨QnBk'b斱Sc +?+Џ6I!w+'d+J zC]v 6G:'& a5} +X}X&ץb_#}E{N$昖xBQ[_(rGŻKt29*]3.X]?C֜Ă.oQv'\N pq wGcYd]L(O=G|[;RPu@gzf Up._p:=%!`sAp}C͊9)1f!{9nЧ';iPiُ+J8GДzUUؖ(&u`P?\8E)T3{ѝUx9/5/DOV29#z޷氯B1 +&`!C9GLQx@X8moC$KfLn3afy{3F8vIxx (\sPQu-–_Aqz _Lc{s)cL̋0_$ 7%GD*dWS2w5J~MCa 2h5Ύ2UWl.߭qɝDY΂-w_E`MG%ҠøAC|K UXj4$LU4)ק)~#=`R=]0e(!*~MUoWy]@, 1#aR +ZZw4U1O3z) d\Pܰ+~4ps koZX;#2u=UI Fu0[9 ŀtוY7]ޚ۽ihN=Gy`<>x|9z'6^z-Fv%_֩h$⼺iF?Y;ES 8`w:֎ox#Ug%. + +rgwg!r䞟uKr4Ϛn+Ҟˌܸ(͖`%\0y44Wd HNsԃXw^$D<]Dh =yT~|sT5'C\Y[VdGW+ |C#BhemOT +:G͠/=JG肒WB}|{eÀzfݣE}VXY:>1z:2!χQ +ϔE զ(%r-xR%;$ t|kb;X^g}QwA#uL'&=Zo_㍅C8'Y 6;?d-x9 UW9`,kB +Z4ܒ4x=T{AKsGz>tk f RA +ߢoZ7e0 g!K"mXwGnѐfw`6G|×^}?eEv| 8zs‚hC5e +|b0pVӽ  n eB +> - +AQl)Fƈ@;uEPVC"ihJS33 jYo?ȂȟrYqgR;BŢ0g.v6IүJѹE?o(f`iIbE'CǷLyD6}J֖ 0%OvЩ Jً]lnrg=<믮w Nxy~t{&L)2nD6Z **4՟lI4(s-5:U@@lw P#-3­E+.18/3E¼4n{&x41/gaOθ rF-p 5 +VeD_ɿw1PfU?PF:Z;8Brx  s.Vw$sb;ƴA+/Y2h%Q&4TvhaPHhqo<L]v/}ȴa*>%VZf/6nm8 Axv|#q4m/sS[Ȓi|јVr}/hRɛљq(q׶Z].}U ;6MC_( 5 en\yrк;gY(\ٵE/d-_Yɝ),z^cM9V/]IqOp G]6sILx9.X5a7mԖ 0]%D (I$J(; 3D\,_Dm*bKB dݰoVfhKwROڰ +8:kpW1 =oi0-<0sS ")`H'Rq.4@aB"^*~Wt.ς`Dt^£D\[|`Z4z-)KFz)no Tw!b K_ v}'KI|P娓n[Q:Wrް}_tp+w͓呗l5,ȍ~}N } d=f 97NMe"m[lߪc-wnQbٚ^/fX,6+`854`}lm9kǠڱYiİ&<Rш/_+^||+rLǚTQe氺P[t)0m3-R +r]eS'E07Sl;p.b +'{' Z ʆIf栀g1zcӢ4 +gQ୯ʣQ>@zFލ ud'Wwkh$dʈP:Q-|Q +uǐD*bv}pdZ( ̻s>*g4rf_̲ ?[IB#xҰ%*"nU@5aQ-OQIJ\1 &RI!/{ "֬ף[ [\̧)q:S'@qw*W]3\"E%;u,ev^ XR55=!x&o/%A9ydx@p Q5,]zټQb"le86UXw nbl@֥ި[<ۏKrV_$%w|dr5{;J) Cw51#Q`,Q&NETژ*qG6,WyMgPKnX)^ ]#EœMf dAUii~2.j;$eWb@2͹6UPRzsAAD.vݴJش画g֙V>+B+!CAǃa0#)YUq7TD-L5ήbUq>404} n.rUB9 ȑ ?1z]?ȿ}4'cƀr])[OtlT1Iqz0|%獎C;P+%̀LB%bKj1Fjf ?Gl#`tOq> nG7"=^o%ֱFo+%$1%|=1b\K➎L!$';jv_Q'n@^~ZjJ$RZ¯+o\lh:ɂze +7H8<ǁF&Ѓk3_[ M0#y9ʟ'ݸwdJp' a4Jnϩ *!T&AT;Gnh㧹#y=gz%r);ʙ#~Ӟpi3`oPZ~DP5bmȲm\hYB3JpUR0˟gwU0C,`Ii R\p s.~2w<>P5bim-8E3N"ѷ_GsyQTa'lk_Ӊ:.9tlb"tb|ƥ#cߕC*` +BUvb 8@fx6OѡA[w1MT*n?ÒI~Bq BϼMbJ%u Kbc2eZW [.D@hQt< ^(teX @"ePE)0yRN1 |Tdqj3k7EM-"|{qd7Ҍ5G5dg~hoN`ʁ$Ğ:]߄|M4kU4R2n?u !G'[P\åhk/'pr՛]6kӐj/$d!M8/:BΈ7Zc,~7p z +)e a,`|}~lBウDRf<ĪwL2F ]=K]e7S\Z)YZb!Lm3fb3v8\0?9BOW18u}& +uC4%=*k`>DžlQ~ +1B9yw5H ~O] c4质^#YBGmLo&NB;Mia5ޞ|I%w]MM.6)U6ξ^<r*JȂTlɿyo7]EùΚzʞ4iI@v\`0~CySӊŨ70A(E7 +Bͷ^" +: v>ĂS;`T~"|K/K@z>f][M^sF6%c & ouU ێ-IǀQT>͡aB='B->f˘E=_Y4?P6>n,sR@:\۬'3g$PcFE!J`H4{8,(]/7̴\?t8lGKu]Z@7%EBXo"t*'W,rt5=5FHemg9ֱ-'VWஷW r%"&Rp(7{K5A+q:VWQ? \tl>kgEEYx!oZܘEY`:,zP蟬Ȯi/‹dA#`Y~ʃZPS\jӉxO[X/ΪƫS0pζ}wAԻr6kz@?DdLpd|,/ڙ{C=#VΤk{qY8y5;=L.YmLs%{UۀƊA WaNʑDCd  N6b옞}B7 +$x8V-Zm1dK_nhg :P^LM$-+>D4~j(gV}&<4u̼sG4miB&N XFdHݸidY9XEQ-DEQ51Qb"iamI2)^7'9|9Re <זIccU2:/:q'GaSCT 7}.D:iҞjic` 󵤱HDniTnKfA n8CD 2*kJӖ!/~UǥQŲz GxcFDezιzYY1wfleVM&u;.MadP`Ty?\&SĂ BCs`I S2*4 p^f'9[(P)\:0~"}]c̮ĦG웨W4凣]1$^1xFa^De-p!Lr˛|Oip +D,4gn]ǀL2> U4oIT}|8!nҠ%;6ۥGw :H7&>ϺŢ1c>be嵷\[+nΓ/*zyoVcЯlF@UYil~j+6KDGT$b4;2wַSR\ +Mc hSHZi +5ouo &Q[I wrr6eE#5((ZҬ yii$Du )-˻ cM('S+_9@\o_S(42}^IZ%x_cMA`B oV9",ݥ@s_4B^n&#yM۽%LO|9TՐeHhTq/;-eyZlڊ MNM-\\YJ9--:<)DSG \Y4r +QemÆ uwtwb8_u/ي:濾5wQ&ә/ *\yƢi ȉ^Kw\hʨ&@36#DAqɌYhid):T)AQЉ ]sAڠ!'k%8u"sjџA]=w{sa`XO]95gT>> %X92sW$\-q$c-[>k¨4A s8#qkxK3խ^=|]hs0iN=;]@Fif4 ۙa#F;c7qo?S(ϙgٵTDO-]K$a桘&iLchklJDHoDis!o y#V:IHIv6]UzLْ^Ka'[r\hF3V0E=B|V +(~\ZJɅ:K={@w6vNp~7.׮$c*3 r5M&vOl#2;m$ <,K~yc:h֘ +{|PI-"moTc3r"n@ 3ZJUĀe9.]Z p 5;0oLJ̡lF{qC6Xj~`[ EV5<\$.KEy T)9kv/jׅO@x6BՀ@X]G2]IXvg͆!Ѳh|5<=(\a5 Zd_ocw]*~n$GEztN2B_%WFO:7#bW9FJ1-swϛzn s Ae;֖k;UZ֌0 1,>%/: X`Y+ bļAqs峭"Iu&8|j eIQŭ +ޞdjҭCy/t}.ï+ά9mia=Gψm}jr$hv>#ڦ?5ƓcOAΣYZ.0MfʤTP/`&TijlLS4w?̟?||1yM+ܪQ%(T%׊WAH.'l%"Yy^-Pǿn7(dľ^kf)Eh&FXCeĝFy|ٕ5EzRu-أ^C#Y[Wx*#L0{r>VU_2FA +{;naF{y dn&A_&Tqu]OCA?Jq덈X7'3v=饌Yviċ wv9Oy_K+$"L*sU"Ӿ=vY(k5>∫Ԥژ)¤ > ̣U[c%u]Akʒ jZqYXĵeq_O endstream endobj 3612 0 obj <> endobj 3613 0 obj <> endobj 3614 0 obj <> endobj 3615 0 obj <> endobj 3606 0 obj <>stream +HWmo_w@&z@c(=YtI:}gKK"@l<oDHʨ`+ +4t͇57]zC ەX%THRV뇛>99Lnzwӧ+1'RouPtm>/OcVc}ËU#rb>ȐPg$~d -1ʉb8 ,EﻋO@(.v+ˈPK9wB7qht5Ќ:EP?WǻY0i ە>1硡"1Ip戚ܨ}yԋ=ph ]qň8_YdmlGvJ{nJǧ~ߖ]zA^1W}+W0ξjnLPE~3mbKW-ŘvX1%G^m^B!A⪮ +JTPoESCy*2N#? yEK~*?7VLj4VԀ$Ƕ<AMsW( bkPxF1a%mji[=ǎY>[n "xq#88Hc +IKcS(Q&=/vl|M bmYcD=ӐJZЃMI+aI691.6&=n+1ʆ@OǭWՋCA \Iq}=wd;àcvVr>&NW,N#o t BGٚ0IEnR8^I7O+7O3A$A]gu0l00 cz(z#Z)A#ɻj/L^&U`H)rF#ҫ@T''dUN +?Dƴ~=|-(/nQM=a쌛buO:wveVc(̀Q&3QF䟃Dg%9`/ fb+Irz-d0iB + P*,2=OV@Hȓfi+…Bi:w=7"gÕ^z(9㝪Oen@֍QjaޒkF}b:cI sڽ*'-@0P*VH9N>m`l(kN  ;+Is%<N vXkS%zN,sn9¬[>s>?e !ED◁%0/4"[J \C;gߟxg"ؘ@.8_71ȹX0]$\FC9 /PkIǵ;B{mmu! +X;zMd@~ Aх#6|⯇P*t.` &b8X`>%%ZF 2͎窻GW6Kl.O8ޕX3f! mu +㉦ioj8%ztܵYh`+?1_nxb6"VH0c[,=B?cS!٩-sl*\wWG*8eq~UqP p(D]| 6sD'pOl̛g. +E$܂F\ْFaud\T рvF}nD:s2~2Ow.ɅIcui6M0UMFo?m[mn7E;oL&D!rgN&78X 6zdvv1zWցEbPhPu ``ʆc_/OwKM IN&O˾f,i8 1D_ +GS_ :;~{DZ zh +_fjneDM^t㡩Z +0CV'$Φe:X2X 0]:\ J)k}{f<=>X{PbE#A\WhL71QxX*\ `IӆQ0pX?MM):L+@(M#+|皡\>yg Wy)0AQ*# va0|)qJ PUjMk"^?_C8(Nnq{щ0Q*]9]ξ_9*0P0qJ(dD\+y%RЊ877YܦЮ1ʇsX=_̥uג{7m2  V((\VJQʴL:[Bpx!} ]p!yk#b7hcRT4܄m7"]5Bz;v:BI ^:/lea05ꐾyn3w UlW endstream endobj 3610 0 obj <>stream +0 H@&V HK9qd*A2Z`P7z,׬qT-+1%-ђoGkpTiّT5j hMqwSK7}9 ѭGE, +u69uN$kZ~YH!N%Ed`7H8djwN;F:Wib[ W f4~'Ԇe b ~tDd-o7]a42T( u38dakveNe׋^9reB貅t +Tm!Ǿ3v5:W*=Nj+Sa`)wCv9nsqfٲaREa`Isf^/nϙ1Q>x}f-7(x' Ĩn-vh֩^ Rw)-snAD.-+)QN9m_twu `;ʩG9Sڧj 9SZ-"#MY?EŤҵG7BFQ 3a8"ҌCY70*^8)GNLD[PKuIOP3֋v0@Hg'\Np?oW~DA1A&^dl: +n* %L\ޅ4Hs.3,. +|SzB ( |) D9w1~':^\f_8/ QG;$T&yFtAG&@Y8-7w +C?aQub~AˉDP8/ .\I=-G^V;QB.lS4ɳɎ< )2Kip*(2 | NF|/yߊaNxޔ~X@[sTyxcF NĂNIL$9η)hTNY#j ^Vux +ؘߘ,~ADIw".Y }Y$n~V&@^H]3p"\Աd$S-ҊvWN+H^wq 1P#5FdS&pq 1j%ooCX+Et?U}QozЏ!Af ati2n,-s%qd0//QԱ$YMFj Ju4olyigN]c*"BH{2dd-oD'P ؗpK +cX#<ι 5um*ou71der0d1*@gP3Hف6^D4ELR8|պ{t_JVc$0-ݲpAsmveVU Z97Hz*Jd_܆Ph1ÿxokK7SbQ,Ywꡄ kgl(G\H #OIby QN3vdv{8sK^+z{+2RtL_F)nvbFo+h'Dwx"3փHH>J֗ut&Ui'N@DL V6a1-ʑQ&>͋CN% +.*{:>+Ú@ +a;ۺBOC*oөN C.5QWŦsL iwY +@׹[0a~VG{k/C8#fh75*N'z0\~j{:0q̞>lotC{ +9jY7&AW0DŽS5Tt*^eN?Oe .'@24.W#iND:,N"\u )qeJF|EP2%deט:Q9!cн$W<@a6C?n[/_p x*:YLjT{/\4[pc'Vpj +Mv$ mHxvE|/^7jLr a*"@kL1 7Kv[@WIz 2!Oaa)TmI!PHx11I+"̃ǔH`dh4vT([ɫB2e(6Pc.\u)XLu7fp MSlrW%T*;x)T2KO$lJD|~i_lb2&1iLeT#&֯QyM&haB斤gPΠ"BE~T5"PzaM +Mߺz@ _= +rlHjn5+(>Mb6ͼA/9 nt>I$ 6 3#fh$ߔaVS #O=N/z-nLrRgDk*c"{䛄+uc,Oecp0 lՄp"v.MeN5~k(h&aH+é&T/B^6F_. ̮-"BPS ˌZCb`^i)(c9ItӚzϾX)Hr1֔,}0^R|7\deFZT¤ ػz l#FXտA섲ܬwЮp*Q\\+d@S}^ =Sm|qCε:zGU[@ pX{ˣ ^Mߔ*p!4 Ѧv#̯1=Pfg CB]Ńv2 ~25&<t=+ I۽g}VUatz~b-iݠzE9RL?Ґaקnכo% u&`M(￈\ fDMV(2qiE='ó!/K;ѷw΂vUzgN5 fTt]$eUъuwpΫ>N3@Ɏc^k%L^XGH3&xD1a:J$ b~1z눍9 +&=M ;]jОtR^pq+ZqM{2JCv]]un);{D4DM 6jw7wqO YGF{ 5(\`92E5dxs +eb%pMS% kZ"G) ˗bdf.tAe]ތgwVQ`r4C*OدByoጢx{"V.UGʳrKIB3$6U+=Ah1WvҖ e'=gX^06tCI;[yU)^]V +iˆn]+]'G;BHU4o\;U6-?\<;@4/Ee y6EI#&X8j"@l$p$,聺`2Sm5sX S?o$uY,jq=yn,)_p*O{B8vmQ{ڢ:8~[CL.oaW¯Pco >t̟{vb[YQF=V*ylIrTr4xc) hmҝ ?_<3"H4µrk4d4[+n0ZS!aӰw< GMm_ŏ~[0<z]F+872(aքy,*~ :QK}u xVI wuA뺂2,+3W; Nl39}r>Eąl%!Y ')15{Hw]\"(V~=+VtKѻ 6Ky[!x/yƣ e+duAS^|=?RWFYNpH9ӫnbgu|Lt2# K1Yw`~C4~+HZԊ37Cf[yiR\Iܑc㓩̔K+j-!̩Xa=7$ʚ+Mp"cZR:(n|p c`rQU4m Rk=Ɩ >If>¡KgU0gq<Ҳ/b)k~#mh|dK(hYJFZGXK7<a BTV? +s"2_v}w D|ǖ >zV =&З5?}sSnӝ1.r10^b8q<=!8l+ mDw:$;(LD{cͷut;nr7K".17E*K3(uSgs9eg\>=uskr4[O,~Lb0F"$y- 8 -Pw{WveKLL#д%zp}JP;_ BQ-N&R|bb&DBD&Ȟ+@ +D2!!?xIZ74 Vm{inRLO +c.M\tqꪴBKQ&AE:cC `!,Hj4K?oؼֹS =n?(*icc+XyNa<2* n8{}E50o5T´ ɍhbOSbX QMB:Y|uq49ݬ"&7g&NjBKDH 1@P$x3wayA r4efGMA)SuӀK|ͻHj6e* +h{gg;9C7B>wRzMoPq c"ITSJ2ߎ X'Q\ x|fx<܎qay=c+֥L`%.p)FZnFb퉹MEPN؊eX%w5 f\2 +1&]0v5ZȪL~-MoW^͆.p!`d,5*İC;{|̤(df :wė:+*3l q (<+*s& f%IjcX]aѱѨbugs>FFtL󋑳_%gS3>i J9.aC C;8`ۍ(r)ǧi#)H+F{TT%4si` ,0t+Zl*̅1zbA|چkD~ +ꧯd)0~)[w9m)>D5L?{a|?ojsޣqBZU*7њdw J)w?:kéRc.8=uw+Wjd">gF~A(鷁f7^r!z>~s 3.ϕ[83uPIX rz;éN[>^/jl~Gnv|qbEMU.斗 y|[ԑ'gf0~x3#qA Rqt@"ŧZO)P/x'ٔABI8-cneeM-I/^>?Hl?[F*]D=%9OK‚ysK** pu@ĂefMF0Z5I(ޅ:a^ 8ZFf;d0"R?[8.zc-? +e"%q.dYY)y9,j@elB-#*isnl&ϲ7_ZztJ`IB! +7͵d +. +$.7HaJYh1I1 |;:WO<l7;!!ԋRw?S^6kC;V!3Ojƥ(~Dv/4`$KLWDw}8;G﮹(㜠M&yӞbDK# Кb?΢inP{8mW<\y]/^rR1"Ipr쬝e%pQH+2ZRTŬKuq(,T@;c1΄oܙ5MzP$؝;)d=i. +3Lig>ta8z/c)vF +^r]NB !H,a phׄΩVHղa"?3Z"]e;F݂NN[W.LȞ=ԙLHXos+?ܵso˕+J(dkЁ- (I)~I]6Җ OHy4)fd j,O'!-SHa\ B q/ +\}J)\lYLR32Sͽ +=BP`'ĊHp-jnƈO΅%YvWw\8J*R Yt\Kekɬη0fK9mݽ]Zefތw6YJw| Z};2]*V*udrP=Ӳ!Nt[>BŐ{! + @z: BN%Xl뻏WkIqd&TF]%(!Rg>@ܻ*J+1sH*IY5GX{vݫ/|uT_BѾ0Y&mY>ˎ~SOU` ycҮQOH@}Ga,S!kgno7Ac$Lrw>[WKP5Ry """#*sm|u.$ճl[cjW1 +oΪʽDң5v̰&NH-M/佑SPVw5tv1=a:ć~sFњ&JРd^&Z4^uЀړTg?lMӲ=ȧ0yp \޳Z'XF"t) ]oX)~"8Nu! %.%CVC+,|0S`{J;Bp#6fSC!r?-=@qy +s5+r@â4믨͏M-j}^nLp2=dr< Jsj[XT/2v"`seI4lu#J2ehע; ԚŐƭj4!YUA(PWW ++("9>l]=Mt J x?FMlɄ)V:%2 "DrqEJsGVzX6Qn;7ΨVNܣx1LvQf-d`Sh>0(jއe[Smٜ@n .$1\M62uRy+k~ܘWbtz[__uBXy$\}ee}yB^jc);g:щ1R` j>1z(jC{]ω5_~/ipVschL> "z$.'7)O}.v*06tڔB//o% }*x@V*7ω0\܏}a`2d\^1F-![%9]HXdthM:2RWKDZ;G!j#&G㜁{lsN>dGv1'6@Y\{- ,t7<jх n!c2D-R\ 5hCd ns߲P-xnsϢ='N9T=_'1Rֻ??l9I2B/,t4p7's0/#""$cYƼ//TB}(,0`:7OZK;ިj8'nq$7u7혮-~qP8~w +E\ednPpIC` ؙw rZV:tl>3‚~dHhɥtP !+ԿQ)!!GA*ځl!q!_AM#ݙ +oRBo4RS[0 &L|9sT/S3E*.=~/q0cƄ6/BȃƇ;! aÆ8م VzD4N;,b先dKwۆe[YSODto,79WW:Ck yf*kmS_ฌ$*'qt Pjjp\-L0>C:v02'#J]>;~0r,=VX(3bU 7nfb-B%^a3֫,X.2_q7VdMpL*+ yB2f|ݓ4? +T{1p +4&ɵmJ5}bL&NW)+l0@($;.xDJ,4~T'hL KT3.T`8}{Ѧ="k`GE c9}aɈ=B1n3ȿwH;zӽꪸ56^ 0>܉(ˌV1#+sf^?)EG9+j;CKw1V0`=h8cDRNɘCe~aCP&Z#,#4D$Әb2kX/1B!C)z*Hy }>"0xS,%%&dY^ݜh^s&q5S@ҺL'w!\QiO +D Kܟrv9T.2{Cqa#&) +ϯEt˖!b,&!aWqiVׯ5qQ>zu{-;\|QhI9uByˣ/}17`jz#Oq:JrʍϠe7&E6_߰]LIv&bXVq˧UۍD=.BVFw-13%ƒ +'ܲIw Q4&9eSL6z $̕gr.b 'd**۪ 1 "| ս2 oFJ*9\:fJ(I(>1AchECRRh_T8${`i$VpVP-#ͮU4PF#ܝV{?ޞ+2G4{k"?,BZPmj 9if1 #vy~v0B9ECy(Pmۙ07`{:o/.Cڭ;65^8 HpdVJ>9'ϸ44QHr9c? w+Me82p`]_Dߴ!;7 Lu +^ģIGxCk[7qCg=0(% d]W3ѽX_ +l敁)\2z Cst@wyK0Wac/$ٵݗ/Z_yl]ly85Uħ8.˸ru4g EHś#w[wY k[ZE!tYF@&弉 UaH |fGfqOWMY}IaLx +>ǀR0IDlMH_.*}!n@\tUH8^飡 +WOt_tp& x-VZ]LP C-6ɢ#vI/bG |Jl˓ސrnl|W'sFM`ԔEYW~v^ePz*׶t.8MC < U>;L8'_;8qV a+9Hӻn ?rAhZB>2OWytxէVX+֦^$ {tuQz \[C'=YNϟ<N:ġJwGA(m>*e>M O!JHY)zˎMu;6ٗ "dݭ=+o Dh=&i(ꬁrW>{?oÇsi%H 0[_qek +Sp+!RLv8k e^v.ɳU|w92z5>p*O|Z򞵕lO_dzJ$άǮ<_/*^RD<"24:t5Oë>Sۤ:29㈵%yE!u$_KɯG_9zBnJbT,ΈD;@fvhf. Mh%$MjW1>v Q +XNG<ݙd@H,UTJ"j a@\.H~ lU +^_{z ioؐF/sk8y)JrkPԆn!=9'/k(}zPQ8NnL5 wZ/a_=i>OH`Gz(&{3eⷲ"Ma:^ G[[Z/3! zoy>I uxi6/LqWS!&ߚl_H)RͳUqIsp_#\yw7ESN+/JՐ{spnC83=7$`v#dO/PEt,v˗]OW, յ:pn/\ڊ:*6[6e5Vi\1 ٵK.i'L^1o#G +No~>ε1fr|N'*ؽjdMOG5m&YY2Uw 6FTY(L~zjZ˗68f|㥄Z{a +uY8vپƾͳRu5 &n ͎̕. kѩL jgJ^8;K]6Eۘ:Î`xaE$T{_p6qD#ָdp5onI, "RIޖblCJ(27t:Qld+^z$=X]}.J!/ѴY`&jh.}׍=Jfۭ[v{W&)n^76wTs"J^/fqVcVjH/HZb- …d5)`%tvbQ{*JXh- .Y¾}gK,Ƃo{1%ˋ*#3ns/uX&r=22ҙڢEխV5lY.1q{c)wXq̮#0"ХTƛUNW]\56)olc?;cjlC2=tK-5 pܘ->3ӷ-4nf!gA+GV.zqFf$|CEWUzS/s7ECݵ.? Grs{&,Άw\ @.  2DyS{@1Xo+^Xc3ՏE0/,ن%YItYKVҡ+6Es%ȶ](pWԢ۹R,q%QBTD*גu:V6'."M=+tB'\??Y$ˠ! )T>H}wޜ)"> +^7^C\x*M?[X +''Z!꯫i üV򫁓ZfW]- +x O$:\ ^BնW{WD) +X8.w]Y-qoչ 47wCkUd(bhQxȇҸ"j0 ~>RԖ)r`K#S6ߦ+s&Z2VJ9_B`)wt8Si.]SaUO-,Т% +*X=T{֣ TL8iJ6{ZiQ;FU lBq {Y߱B)9LCrPch uڱ@!1kIBAc'tY[6Ci2qZ8Ln>'cuhtAEר댜ʴ>!Q NɃ ŀOvf@crZ|wTP/Xj1oS%'fQ|$cH)cj6ۈʫQ4_w7 V%Da7dV? ۂ49H4EٛW<]wɘGUꗱH/آQF\$h#~~ԓPҜpyvk[~V_4]wn̤ Ry fH{-Ś'@jRq{; +zCD9QֶB _j%TRp?.'i̸e2g)Eְho&%S8=%;iSm`Ռ+ z* mcY ^aajhR+ީDxK„ gV7!fKx:L9FT?ken}9`Y!C dIRd\mog[ +X_#D~;vC|Dԙ"l%]mnA^7Ax=VR o41_쮮B8+,#˂?R7ie/iH.K{e]KCdF[ݓ_1)CZ'juX5GlYjcI>^d5~XMR2Fct'-ՋT F (װ&qr'yz rjxV=;CziҢXj3UDHO5 A aFb[K7뛠 =7F0rF 5 +TYOroܾݭ^71Z BY{qs? Z źZvT`!2A Qz3)Pz +L;J[GHXzsC42鱅<#> #nBb)QYC c.kIb'd'ع$t: 6,?/Իg/r jT=^ \x_wTNӛZwWl(Иd۩<㎭3Uڸ!o=X`32'$qʹ]a'&+ԦD)f#sm 7b 'rS +6IߤWnzD}Ö?ѺAI{?_X_(z9+v󥃧4B1#S+ XBXd[Yjf@e $dQy-R6_ΤeIL5/M2cEW0*yS3IvUȚbUE`MqLu(H!I;X2?WOn$)0ۆ-a\ +X0o>Qeq;+I<ފp@vʈ"/Ƙbm˯3e-]w6#khQݼc<˧:˲WX/=S[?)6;'Bf8P +/?-i'ٹI役ڥe5L#z9:ī﷌.>;M_*čثpF$%#&Av -cj8n YR " !YZ),8 j# +\^ņǑR,(;,.yS5pFsD^Ua>^o߄UH?-87bR +eێ!;pSSĦ//oUx(zttu6]Nw;Z Ĥ>\K Y&iM6u~ƐpM=F|>Gl86)Zo"C{Yc}eURKpkAC$77DEY>`@{y4؃gn^f6k<4@4{=:0>y;7({=TnʀoQ4$u\uc_S|ĨT.i֚[8ПR|jm1hU}Vjq[ǡZ5T-r^ vg ԢM~?WAf(_\D# 51Ro (/9ͬ~{ }Zv դ-uO%x,mwHٕΑ#o((F9`%|pYN9e7tmytsj f_5O,ȗ|QBB|L:O4R VbA5F2, BBQ*(#zp#-̉pCsSu,tV-9Or:ơ2 $kݕl-'+f8^ +XedWJ 9 eޖ2w$Nh ?Nj214&@5;(QvqkMׄ46 &@tf qGk=; iڍZ:-Us34? + +9>rodexaϴrǓ/SuE]̢yt3 -q z](Uad`%@Ҧ_ njʢp ?i4Io3 +^5n#dÖ N,z_E{I 3X>43':mY)OIJr慨hDݫU݈Ѻ8*!qb;:jU%Z.{T2JAn:?HTJW6ز3UFsGྟ-{*(yl! MγVyHp!̆^ ON x$p^+gj#pUgTx"q.7\>.Ln}3vul#8 +{l7VعҘy󾢣:LpDTwZn<2u&i$fH"-"IS@4 CP閱xؼA?7B/ȡP6]ԁ +3כPU4]j@ +h{5-6D PjtU=:q\[79l/ݺv2uko]G!gp޾֡SC? endstream endobj 3607 0 obj <> endobj 3608 0 obj <> endobj 3609 0 obj <> endobj 3600 0 obj <>stream +HWnF}W1wb;E8T4 +FlR];%GdG _ٹ9s柉H52mBK3Jl_'k\T&gI̗J(W2/pDD)EdדWeI^rW)$\ 55+WEyq1 ʝXc3i"-Nׄeg^J!NkNb' +'&ti"NPڈi8rWWz[Jy3pfts 'Fe?8osܖ>-d ZZqÈ_PyoS{PTD}6l5} 1wZ茠) ˊ: +LW%^MkjDT `plEWO&F )@+b5IllH<a2bq:dH*cvdx,-%}8)e٪/PVOd,V(24Z'x`Mx{.sƀ~,>Q*] fY,}*+Ǡ#FGjeN{} [ߒ\#51*j.Q׾uQ{|lkQ3Oȃ57&S`[ۙ20Q35%d7c3 ZL Uv\Miic7ơc^4lP~E,Q>$(~U +"Ļ Dބ91*sR,07Vc$mL(r=nBdm^w&s,% ?ORl|yt.1cIvp{KiI-=ŇOpm!nunb lQA2]N/{68N&!8M7.4ɛ~^c>5 +mL#3;bm%6͂xAF fʣƏ^;fD6T!C[xBXT@7n{_;R8^D'wW%TSL0$LC,t !SXd h(0!~1+qx # F͎MC>䰨\Ɠ &⡡&YW<*xkCZqХ(CSY)eHhx/)#bq6]d>[mڌ N#KZH3U7< e]$52 Id,^[d m"i`({RJ &d^vv4ljZ:Jo쐃>stream +0 @@&12 @ŗN _tV9F='c'zH<.E/z*K_(MuYǏJWt5Hu B+C:KM̺Uύ#WEm(`m٠t;dɊ:AC1sFAuZEt+c,E(X~۩cQp×FB&#g\;+*0eڽ =R39FՐ~d̴KiO=psb3vmXL_ xGңbY{*LQ{&掕nH2cF]B)JϮ0EkKJNh팀]d(o #:YgR\1v *ܦ4HQN`.|Xi,; T߹RGJ4RC'unUf}-&AKmiw\'ǔKT)Q`±o*DoXLQmqwV5|D_V͇{s4tl_*v7-Nj4kv9dZ$i"mXBplr{F6Y%CR'>N@5 {o7Z-V"YJK[A¬ްu4f)pos8RTaUWĺȃ +k&1DT-zU'g+x.Yst 349xBO[H&ʋha`yoB3KvnW54#=)1 Ha'm=g-\ Vu% 9b2O6$H }\I}+.-P'(<`w ON. d!6UR*cik ỉlI\;Qs'[(e ɳj黢3:[N>w>>+H:W.N9;+#L*| +u!;`6؊$0TڋG!*I;h7AқMyrn-y5_py2ͫbվRwWXN]#5t;xzU$񼙛,!&uw`cʌtYk%6O;m +t YuĴ zU4x# ̗ܰ=(̀EB(EҶN/c=\Px8z$V!D(/=Ѓe~={>Xv]+950Xbă[<E6j)Eo,E>wv+vqp8¬&D}ka ]썘|zxcKbW^iYE#x0\J,nC/ c$/jʻ\[E` sEW9%nv \umM09Xɫ3!tNc4@#bf"QPl#aY/}(֙G ƒp_^!}I9(a8)7'xS͒|CMfDV kmfid6҂eۍ~h1ȝ*x-"zYC:xzMvv $J7 KW Ud6"Fݷlچ6"낸5yNi#C'uVyv[SJ` z[& 0߶g6yG݋Ta.9 +ZOhE]F۷bҟSe gF_%ogWkb4=lT)~˗,#q*2U-r{b P}C}Qd'd' 0  +4;_\ vdč7T[l+ +RXQF eJ:Zo,jCe(qU?yˢxs4:_!le KC@'g5Lko|ٷuKG?K@}pu׃h܂tV.X qX+qp*UX])ks]k7%M$Al{W`(e( +'k @TiqG&.3 x,2W)B0~iUXqnad{eLઐMkژ+ + ]^7SQVGo `؂)zA m\!WRtW#e?b#rc+MvoA%[PMYQhث2Ʉ 3"Uс-qĤO&Q:M֕l|X D a$?"催m=y N n/iQ"X}\a}?Iƽ >9.8@ekVj41r.#>^^͓3ߝa7ukȻ}zVd{&8$h@gwKsiԍ]{x#bv+ucdHd.%Vy(>JH(?yx۴t N +MzF%o͂$VЎ_ KnLk7?eJ>Z$p< +R._qM tFnwKrC#>&3[g!G>pP;ߜC6DQ1 {bّwB˦y9=Q!YDM;^(b'BhMtJJc6SAIP~~ _yOabzs ‰%Pob⍰1䴨*2эwr8c +*Lt噽[y#lvf4Z:~MwJ%ߤV˧%]calu2ZD +$6 +t$av*J?MS1jblv^I=< zǰ" in$ᘃ,Yi3mY2FEu[r ѩ!:/B &m/| Ϳz'J")e,f0y-oٻg2>Y|` ", U.]DeJ7g(moy E .'S_5fR f(:.>4NC=қz薪*VC?7C"^a!I({#nd'!< ?]}[Ldn _i.2THƿe290LG94 +i΢M2mLPfm.e|O(OE+:&iU1o0 Rg\Qa,SI8;C1V r8 CJh;$OZrRVsc<'!~2a%9|'~m]IeЙnF)b|&ޘH4b4=ɑؼSDЏRR+?B6p9;`U\Z@~C]X +Om {$H֙JVлTlĺ9 TI +^2W<'>RH:lDA=$ra+Vc拾 +mo/p)?)R2hlsj,6g6F?u<@BR`ΎO"2Sd S`90PJqė>>`E/xC1Pll7"JҬ+|̜;*X9Z7L6S1ӽ!>%7`bFtСU.g! +ß8;Ƥb95>Eju2ft/>s& |(%՟M |۷:HtH}k[6<cv*@z^q YHmQ+ &эQeF6I2,d$1׀K?'xdw.rVaz׃PSq`8|dAHԧ\Ds77i;IĒHhMQsҞˊ;Wpx喊{=x 1u*a`=0H.3Z6i4z$^OFE Nw +i֦[*Eq7-,Kᣣi״ +^RK Qs{B9h֭v(PHD]"wnNTmm;4ʱp--%xx* ]*MF4^DФݭ}m3m5f,I%2{q43S}hȽ;NsrJ=pz{[45qE뽕 DG +;\NWȞUR}iHƳY偳IqN|,J^+@bR74&Vo!u<ґNAn;%Rto̡SIJxiC#p Bcc(({m%s2olz@˳1c(g~CqW^E|A^pWqA&@*6ѫ+?hԁ`7"6 ̘)wgEh>si\U ^2R[oC..rKp"H'jK~K^ɍV^=2ڠCmi@q2pƫٕHr!DM<0~޶Q46r6 +ߧ,jXC 8hp j$9I X(BtҫAُޜgTVqkdt΢ɓI>Ϝ&ĸ߂n=|9ct[>ƴ'Hh"6N8&Qߋ532@β|D.D)g?*$JzRo0/dNcpU^lZH\WƧ[;oX6clF#!>"ȸ;DkeW@͔'8)cTPGgCqcjBw2"&;Wu{hxH(k:muM.=H.~K4kHI#xӻv[2 vta1v;EU i@cTO1G2K,RwcB) ?^m؟ֈ6HwUT/W)<9@E MCT[z!$=(Br fȿgxJFN(dKBת=/ yV9]bzFf̆arUlXxJ%^5]DD㿹G"6k `=Rq}d>b€7&M~2𼓄iEGf_Qw;[o'x HAAH)2ni:~웘*4؝ NYSQmhlY96RSNLzL` dO>-fɂ;dUQk=0'"A*WTW1߳:_<9ĭfI,d6TF!Y5LGg:(ע,ldKUkdtCn襊wSWKJRԺZXk9׉u)ZWݎ[5\i'mʟ>%4+O&;Xvb4%m,*ЀGMJ%W.3`6S@5wltk56e.YzV "c} Y-P +f9"8yNhL$W&\*nl٭?UP7c-/0͈_vRA93mș6T&3#{h윔M_ 7)Q(u?}2ы˵ƄB,`(NX}p^ܫ# + m.x ̶)A[v$.Y;s2AZ)37cJu@Sܷ,u}5/r07_^PGL{_z +&)tvt'h,g@L(ZWm8 ?I̦1>S-I*?Q -ZrxaX?c{e{A[SH E1.ҼX6^́.Az^6v IL>|Balo [,c#|=`@EH? E/(@@wɔuq^&(9]Lw%E"xõadsoD_,2765̳B|UHH+Ql4RPkۧm֙=K.Xdq_ +ytԀbzb`]袶SFYbd N&ǣg~YC>|\\&]E i{q䗖*J-J@8tO_\6mHpWtя[ ylRwh?D:F}w~>>fL Erv\ʀT|vBnYULun Qb?_|Yb -0񈔧6hғ7;LˎJb(6y?I@|.G +A𫰡|"N)Y'P1]̆n;^bf1#z o'L+(7s"ӏ{fh%(P;:OnM$Ť1ڌԖE= $tkݝ7 F@E +L܎].njSҁTh5{a$, ($:œY !o6l>u ]jL ŚiI-lAZ"[S'7=kZJjtW{fTLOY-хi7Nl2p5' +?Cn/L/YWZĔ_ؖ;0UɦbhgL$wL o{ǵa7J#en #FS'p23.f1'n|2wQh<#Ɖ\֩vB%\T&ߗšs_` +9>JJQId txYkw8,loLg0AMp=1lv ̬[D-ꠄQ>$?F}[f]2@=J3PA8ƫJmUh~.P#i0"pRPQi+GJbb`J'!|UBe!]mF[VX$kR-.]y!"IO'[LGWG~~nΓ2ݴЌz;z@95/I8GeqP&E)Z[7G r!I(}u_NjCѱoU28V͈pq8~@Ȉ}բf*L,^#Ym<9EmɓP*[1ou0&κLFdZI~[K\Er+}fKAK/ X):vTh]P˜vJ շ:\Q |vIbsem(r8߱Bn\4ݚ*I탥]-2V^ΣKg[R-[^Yv2Q2.2I.R*f!WыWUeCH}K( 8PDfK"-q#MwA+]"%jP@B8(-w&9F1ww>AT#]].ӴqW,!~e>p8 +)5\CC_Q,CpK)꤇fq'ɹID\hYx&z@Vt@7DgT+*wZ oODYr :gB&fcplL*D&&bO 9LVݛ@eeZ+>svʷ5$#4}-e8V,$t_ Ck1s!"pvR,U5ew={ǩ@*c؎O`͂5.[{=}E4y E@FFz$σ[xA7ޏPv0f v&+] =HP'aH2@:U۲AO,Qo'j)*%W6fplY,g"Rwh3!C܎}Ctwˌqe4xzbZ6(D:va{Jb9ٻ|j (g J:%I}fv9Fķ$doT_apۊ;rgo9C:=si4(,d ?d͐hb"l\ѹ?T +V8X V;րlqfV +'G»ޣ什˥Y4q ĄHX@ DsW0 JD6\3/̲ksWЕydCG^ 11ͦFlQu('NUL+4 &/?C{z8>$E-1NI"2!PI5 QΑ<&Ԙ…#CUGdo3{k&14zQ(/_p;{!@@q_g)\]ʨYgmz `uL0!BC]fqcه r/< Jוw-d[$aBEOE-< N S4lP!ǜAoOsmXy*lz?wOf{#K: mjrt@JMg9աD( Y.&"/Ӛݢ3rbb& endstream endobj 3601 0 obj <> endobj 3602 0 obj <> endobj 3603 0 obj <> endobj 3604 0 obj <> endobj 3593 0 obj <>stream +HWn}W@@i5eub[ňI\fWr!% ]]Uuԩ_\p%FdqqqG頋\\/w>g0Og=cbd 庬j=xPjd<5^{gf^yӬzջjy˷o߿3ћlc## f7D7/WnƉ7F9NZ`ƪ502!)RE<ӹ;)ꎚ wVղ=:k=,5̻@La.3]W;;'NvJ3]}ř̵,9Q bSuYϖ-H٣^dk {RmVr;_ރ6Lf;2$rIT{AW).XrV\VA{eaKfu<5hς"iAIigoU/=韶hleC aI>[QI9ĔYV.Dh` ݀/@D0"|GBدok9Rt*$1$“R0%)(;~-Y*#فd[@  $.s.VDIІޓ:%}a"yEzZ{\?;ܡv/eUMy@_J +6x2ruR7*JCJ1G=Ph3#;֑{b'Y/6ͺcʠ*e\% t&)*! ʢиF>c;D~-gY1<6gSOR6HBs36q?(|&U]LjG|9yAoZ7ݸ8JKnYw?l_~Iݿɀk|2+hPLet etNgqw>@{q' +&{8Ah鳭 !oHx +V7@vl/־'(jw\v|qvHփk1G0ty4wT7TiTڍܯL~OYLP#ŊZY㪗"Jfj ϝ'޶lG&cSsg6zyQX[a TY&l +y +gq"'wwGO&Kfgi1ۛfI6L-?HL`xAw|fnmd=uHrP6aPQfBVDnH:Jll{$uT'Y`C.ԍIOTR~3Y,'\ z$aK KlQcaZц|Cℏoع.wsA{޵(ĉO9+mL 3My3I}J&\N<܍(` [GVUWim A9sIJsa'I,]9ZEb/J'˩A;P/AF Bh%HICA/)[">jx.MUd ZV՗/e:I0neNi$B[3wgOؐ@x湝MeM֬-DuHѫC%ߎ/1P߹WI ztd%D\&9=K]nhiqFZ&9DK>S ?ά`)$R$~fͨX8lFt"Gb</qc8CE( DjォZID/{Su(41ܬ@= ɚ8ё EJl;~:pẗϏ p<¸ +d.CP ]&Ll׭j>eV!2g%⚎.Zr١IIKd"3r_0M:.ψK@*ΰAd/0ƈ0M 9a z+Ćǚwca7vf]5yW_ h endstream endobj 3599 0 obj <>stream +0 H@&U HK̍3ʏ;9O$0_ق0[xE,1. +ԅ'ޤ(fHGF}j[#/)ȶ,"@1p6+p<,w/&h&HIH+Se.Z~JџJ7H GL~qHBtԏYp̛`!]mt}.)WѫImƔx)Qz<89*$'S,=`yre^PTI~۳9tq%X0MZDP}Gж}f7r_cPŒ( ZI2-1bx?,|b5y<ӧx:5)eё( P>!]]F3mpuc @0==H%p p|=}oH` l됚'JGGvN:;D\x??D&C̚[Ї\N$*?+Mܣ+ %GY5\c& SΒW*^-%YD*OfnK9W եٸw3-1&k@h  eyl*5 H u3-^aoKȨ2rz+ZX+~g; +3=pIj RNn*VM]`N>}̦5WHm[+&{'OUc%Xsv>vQLxh"#Z9g-}&NDhp\Q^P֍(p;}bYv2{6dA .ƩӓGdRT>ӿޑ[:ȫ5\=vlFow +U6 AB5Z kkoеD\\*pg|'AEdv3닮<Q{$hhfy^2[hPFM(Pa7Y|m=/Y>N?C vh.D/2C"E jQ;_클V/z>捝E5H/3 Dd2UK[Rކs187ˋҵ6t\ +~b"+do)C_uxu#'ھ[ ؓipY˕}d>JLujCPN!ed vz=kN. v,ya$ZBak$l[YݮGDĞ0qOSzSHZ|[7gGZ6Tv_2/z/]'I`Z(¦s +>'# +>ؚiJ'AR-slz1ՇTS.$ ᥹M-ۤmD J:F6QPOJ ^aqhB9BSDg&l#{Nc77Γ Ã2z B#BodqZ[Vwrx.D&ͼ;ڌ i.+$wcE=1 JOH U|JHQ)1#[y=1Ѥ?CVtR;Q~@ +#[>@;?؁HT&DnqzhBD(95c0t2ж֗.}zvXq͂6]XGAPnflYsĘfH> 0)U sBCJI)CJ¦@zK'0&H-#9'Mʚ nyj7vt-7CCˇ́+L> hAE) A)&bsI敆Kr8H}sȑ*Ɛ})^N5$`?o_(Nt.(6DGff`w$HNJ!sĵw[a_BCMvKSQrw&y5:#;%B&Twz!縓Bl(/}`Y^U! &hZH kTK,t[,faix';c%7ٮr ȃ~p]\+ݩ-9kn཈Ck7XR+'鬫aGuXPQ+3F}ο +1YKZ^.]|cI4.֔R }.[A62{aW;$ч`@;\y i |<`^.I/LNc Iceӥh@e(iz)ǙM[ULKݔ-"8Ҟ-ȃsb7o|edƿsy!c`s#]WpRµ%Z"ֈz&ڎLA!ւ*ŶOCd8- EA_f#N ݤ RЬYFXj)^JRh8p+~; +ʐq!g{XV(&> c ɕr~ѣ3J~,, Ӑ~|H)Ȫ3iUp˙n"Q۷FPZZB]j#X7E|LajybmRӼy#>hYFΜ rp$B |< 1f#L1JWlUt`827mЏ3AE=ݻzf6ZLmʞĞ-K:"s 8frjwGm*K4qEBH7Pd?LǶ{z,h?;jUF`!wեδvhۊaHgw>"tgCvXt <ҭ(ϨB}?͆1}:82P݅yۅBU*GDn,s~^N0wD$Jdf=^)bI שzleI +{sS6=CCSlg p֦p8ԍe]+9*%;tM E?ò12EX\$Cͯew:7bg J1\B=S i쀼Ep.<%}QJ9Z_j&t;{neW$ܾлz?H.ɡ\U!"UQ/2Е9,0ܞ8{&s7,Whm_>m>u}"Mt w܁&Y YvY.PBoP='ڝMĎi1Z4kǫjnz@0q.N񀸣U]4gX+AS4_^Fe ۺ%PQӣDq>d/t9;\a|v=WfscىOt,ņL-dC=ov͎&->H:1?PrA6osGhrz#,B$ʷÊщR6  +n(6oJKA|~l6i2_ +hM{H)`Ij-jNQ`1yű#O=8`DH;l$yMsg׸h&#?^1J]Y(g_sfRi aH>jNv:l#S$W dPd !zeIv1%hΏΗ i18 +;&Go<md!X$ܨE*F{˲5l:UϓjiqsHG0$0bYfBK"L]2 +/9]H R7`N諶eGfҐ\~n@a{8&<\7<ɽ37GKQ=MX1aK,&XrbQz<ۨr +:heM,M,B'T'!"1&)FI*L0`qӇ+Zo*]PBlv޳nM)2 "3fP-[B"ahfu4&)J*ۡc +;YA1 B/-;,_/i6X14!loT +T29߮kn85U4Z_:F'2TT2WE) +Dgp?E$;rCҕ>ɭ/!k 6Z@Xbƅ<~IqCFp%KȠT_ cJ4\j n˸6vnG٢} A\M ϽVHU5ahR[ +W'vXa"vm$'|16ߠO(L/3n&}dJwy0-Lv*[˩D܌CZf()JqZwAj}]}&a^?Iɞ!%r[QWĤ,gJu.u2cQex,$u `FPv7k{p_kkD-C_7vt'>}˟5.RT2?C:v'T$lO(jk m+D,7F 2}Zsc[kڦ*R`"RF&Mؓlɟ|AOxRƱwC,v txIP9εqoL@ sCZųv=lӧR-2UX1 ')H`8oB)nDIra=CPX( wayy,r,.mF?K^G'4c'S.<Ur>+;H*v;WHX|Qs35j;91@ᔝlwlPSͧ.ë­&]C | \wa$|:>V$~.kE7]2KA u/mI^-~=TlkTJa=ڢ oATSd,wb"Tke+ID\ R^~e}G-X<1B3p3V,SC"N"X 3BRF0xC\+IxMzH+A}Ժq`^geKAp;n]+*D1#n$K" yGL}Pzkt=K*ކ|@tk Ds֔sVaf +,[G#X3 , }H+n.Qxz9C V!)tX=;]^>Jy0gL"۔s%sGUp顪I-{Ўհ()N +t*m}Cebu ^uH~ t=Bdn@O+= 1v1^-VjŴ2["`?3\pUЃH [ ?rle9+\ǠEuMjo9G?*3v4Pa~56xʊ&Hö܅GT + +p2PCCL<gARI鷉lDh (N 3!; kZ3 +͞xeΜv0Ļ{񨺳>nm<16Ag-HZs"šL.bN~0$.Vva)ezh|ׅ/@Qn pweX( õ4`=6-;XxD0uIt8N*ԏțԩ;w0Cv hG٬lYXz<#:";',xMlX!j(b(+*AݶQD;\3T 9C-}$ m` -T̲wu[B[.;N{O:b'QG엦8;3`⬥dŀ41Q2A[a5cetssA@ypc(NFfsFIG].Bn[Bj?ؚPsLQg\h˅jQ"<OVҾ6mBp\'t7AdrqDfZ9`lKN$w:R3aYF~P YG +U;rV0Ţ].Z'yر[ +?HVj󒛿k8%w 'hǜӾ? Q]EX=f4aJ2HR*UFs E$Xv 4U~h6hagV6?E*1dPqi(3sD2мɒK'9Uгp+r~ uggdKqS\P'yN~,(J=>)t2+O؍P0oa\dp-’nG.:Xy{[[c>n.EO +?j蠋7yeBבv>%M:boMǑ*@ ")U;Uڲ,s]_,a!xb0R;V"nY/Trk]8ܹ:h<҅ˆX +#X`IItlƻ .Ωb[nwL:ҋ[A)56*b k%A +xhVZhY_{K4Z& &%aa?cЂ}0k''']-쭁sc~$A9-WML ެ݈حM6Om3zh,SӍRzGFC^ݟatL+`=O\v͉[`L6M +LEȮ82>j5m}'e7nD:Aqb ؀( h*p4E`ȝ)OG?z[Jvp><=ERkgmUϓw{Vv.(9oH#SXb'؁byM̧xr%%j25S$s$ϰ}]'o芄^g7"UOgY;tnbVкQ_xS }' Nw Pᅓy2gi?UvJ%<+'p(rY77r zן"M#Xޢ֩o"3)Udhog],<KdZBYe}b<l S' My`EݒbT`Q\d5ϷWs# .̋⤃&|=F}?3>? Rv]{F]ТsU` SSʢ>ԴERa{q6{}>8/#hIgqh +S5J7kBMӱSMТ;0 ~8A)K@@f'[Z\(W0*q-[u<[3u¯E]42E'7FG$#%% -) ;FqgdvWWth@ k0fs 1L օ43pװd(/5 ާ[5e\zv(BX(Lfl}kt,iuڊ g0h/0T$+WOYQEfp;Ihߵnӄ3so2b>|:Go FUB бjY,R-$\+ xcW;Sz!A&5ock9q/ı'WSTH-=RR -P|MN >qPߺv+JNpb>K{̄o9hA-c#D"8fP[YZE([Zw}I =vK#-nbw&J@ V~ _/ f 1S!<%֞PX>&SVFv:߅5%뜇Z5i6 o<6b˫Ƙi% Lm.u3gKXVw1Vnwy]y=p45ܗFT{D{cUS`YS3x Fh^EHq @EKJamBE ÁLN7cq7^;}S&v 6d7_k]:MBR4=ǟ#KTcХvpr7[H.m8(Ick.D/\,+'vwh祎ˣ"kn;x^u>vEhtrZ3 5k{aDz˾7m8\/sxxBJ$ltAypy("3@޾%}NE)_5$RŌ +F!ӘH&EH3c?GɊyv`%Jwi/D.(\ZbpPxXo&)Lcm'g\VהueYRc!&GK-~<~F`-0 )t1qaorf*9O"@Bs}s^_!4cc->NlnEtpKU$& D=߳oOz.tlI^hi"E=mXB}H>m .JwH܆WQ &fh9NsJs G`'^R\x;NW_O;L2*Mqf60u>#WIH-j 8T$YvTNOHOQ]#i +[!P7Tjm16Xl ӵDEόfSQQ?OTi'0j^Bu /M9I>Y[*)V٭|\> ֩pBC()n?,V!TDe㖩UV5O"f?Jtv(# F&Q0[fg%uकg6y-.u;99{U_8`uXS^Oĸ%OvWek +))SO/B('3*AKyPV͕cYl4m7P[&nB?U}:eFzLXtuv9qNB52EMI9ӈ^+ +K/3) nI,D%Qfw P7-jWv vNw1lu)$>,D@ɮ21n񸲊Y8@ZKG^`]$zpƭȌ +B8+ٙ/Ocs?ĻC-[|sA/, IVJ;ՎJ|`,GfPm^'l&yQ^ćTEMdrI--Zb`ۖO,aF"Wpf~i5)H؋^Nb(^j|$HMԪ341ζ!<נoL{{knCvp*/qZ&#`9zu{>FB[=hV|L 581R1ײ^ia;pU*`%VkW{?mB*=X媲1֭%gZ)e +l` 3ۏpY,_*ujFk8a3vZZlS fbuDLgOy6lI~7,;BPd{?w!pڏJ$%cQD5ZpuX LxT="ʂi0挧؃H1eQ ojǐbOp JOw7\xq\Cj S5|<艂P?wv% e#jjـMz)6k؞`nϮ6eIO|#<'0aK|_؛ *mśuw9+F(5_#O%^T<BŢ%A'PYe$^%OXBt;}nލÚ`F* {NNϼ{*C{!CQ(pSmB3BYQRz*6EWeǨ=!%5$uPEUz-zo}XWZ/35yL6[PU Zr1Yt Pn?wuRUU ̰D> Bq;OkПӔw=ՆxPC|2׾MAIxLՄeNfc s x n7of(;p>4>Mz_LT &d*RqϿ Un:;VMo1;n*Iqgz&\I_HZ\ Ik=~6r F)e]!9d1G_N*gQld4f\ +RoI3޶ptN˶a;6JjR9}p[Uf|AgdD;Ik|}ZjەK 866Vj",$i7,W/S'?84;BڤRϞq++8r-݅^d&!xnspcVPs!%ݨ0GMM 9_No 䏇ËbY];pz: ],Kt?C^ʇ$ufr(ݱH>S5G`ޓr|EEgb%}ddoy\gE0!sp0~;3СW;hs&G5V޻x:X礤6.vf- ^8vbfJ[t&Cmu-VҀ>jەP'A +$zdn?Kc6v=53o׃XcIVpړgt=nߺ7 +;5%+ĖwSܦ(H5[+7U7H^ ~s LCsI,p($iedQ"b%Sy,fH36-YF+Sݸ?G+ vq &w3Hʰ\$oO::?Ừ|-? +|?*~akbRZ'}j$*x,6`v[ 9\c ˰#6LHw]/HM.b-ʔͬ7V])(e_/9BE>/s)^kKcGYPQQft3CoR>=܃J +i4 a-ӿacZm%p)b)$gPO\^ d"y Ą1SWk +审?p'Gk ҇fۋSToDpc"Z;5EErC\LG&LǦIj%?̠GffTO̝~Hx; i3(}HNRu9_ᱹl.)~teC1RTKoy.g xSxm-}x -l|0af"(!Cˎbof^EqaOam!ˆTL !ZrS4瑜 I-|ϭv.,kƆȘ-Ԧ \!5~ޚ 2O|5IN/ |[Pbmᇲ8XYW*2+} +g@ EWzy"dq;wA= o5~9 +KC]l/ABhvJb>>{zhUE$.s +)<RTYهī-LxtQ9^JR#ʾ +gg`%TS^e1oB\;Z#8`gm[ƤqE !DGcA< \3AzWYSTN~Bo B47.I˂{+J=2!uņ,DdJx+D +\ܽ-Q=1M ঳/_!}qS[L S620ZI( Y8/U t[̋Q<@6xI{Z"(,帟lPG t<;bcL-*3lb3LC,ľH0**$_|٥3T?#Ys `9 +Hڐk +'i:Z9(bLF25O~NNc8-=BŤ 76]]ׂ=O| d!0]$F!mLgRWe, Ë0TZ֗I=zj/2 a&fM4_FSvt*jז5ۓ&+`>F/a-E$K7|e=H2g4b SV7ɻun_ Ot5܌u}289ras1 鑑Da'W(u  +Y^OR|(9Nqʚ\ڂ4 ]YV0p<1 [ZEU"c䙡GtvfZE +Tznn!Z+:ⷽ|97+S[b3 4~b1a^炨Jz .YW`+[Erϋ=`qߘU>79c޾H Kyxb7R-%LqP&aK{"ؠcJ=nn/M](:1a?VswmN;26!͝=¿}=\`6ϓ\y{g0~y@5( 8W%DҘ- ) Ӄ#љMaDe/uz24{c?.fx&lJ`"؃IkQ{[Π go}k}I/yI.\4\c78x/2/Xf}!,;ٶήcYl-< #Q|? C߉3~`BJ+vo!DT١BwШ~oZˇ7g`A$f- MlFdpj9*_vqt^pC,rq6*fE2[:8*_Њ\_&qe!*T>֦%>01Vr- +vտAo^ׇ(ů=(*ctiH-.>=HS}!}ƇP|i xwMLuN1~"X̚.#%v5:?}dfI](#JCGY*udf}śdo;fCo}\G:cR=G[+:ۘx![mf"l|9`]N{h"i=u7i]|" L;b U`#N~vO|'kʽlm=uDxoSNU|@@ԗ^N/Ndd'>aux&#:e.Fǧ!6kP/WR&D;6/8X +mndou4.yq +NlsR7s1 c(Bؠt/6b2!<׭Z8[ 3.|:(zeQ=g"~)"Е=ܽrEw^I:xjsN?!/Fhۭ]3~+m72^z8-< +XmaTORxoVz`k[YZ2 D+&iВȗ"viaA7ocr3&Mԣy_-!ؿߤ'4cc/eL۰ZE7K; [A;]qXAe3滠J I>h5VTpO?&@ Ef9 Ni>E#A.tHK)1 d5{;=DL*S4c/1 ੭»j"hG+m0c넑]R9ȨT5$w3Q[74z%:B-4qpΎJ +Six.\)W^+زj{ᠨSG'xaca~B I`d9iCcZ*?] L6> fJ$0vM謁eM 3b{^Ea}kU, Y1x CpQt N <Y .dh{x^+I_/pKR'oU!f/ZaZ']`3I&W~e!"rg?TJNM]8=3t;sh}oح+565AgaS>a +c[6Ñej.>sWՋHd%լU:B/ _.e#rTkNmT,oH"(oiѪI5 ċ3I^J +WhEteA6'߁/_^l8 /Xj5M` +!=F Qmt@V "c$rBVY+,F.Gwop4 +tUeJo5% B,DszNh,T$^66sc Zs1@CqJL!UV‚j +&){Jl  *)W'l^ n&oj7nq?CouǾbfgW +TU4!žu`'v_Hzt?!V˲eNd 5wgm< +m["t?|jۯ6sq:z?Dv'7ʵZ6}0{*}B`"kwv  LC+g9b*g9>5xP`e m"j]fdEa CJYMr |-Xqr^H VT7_xt(Ւ8d p~YK4s'K0B$u킫8wM-*O@6uC Vfuz.^kxyE/@t5.>L d9uuv,95 B}_ZXW8eb3`Hb':[6}Qs N<{q]j"]5oZn 7 349x-\ '*V-iX\Hצ )bSĭY~ V1~f-FU{ݾ[nWYGƇȠj&խJhs`)F2J|oL싶K!u㷻 .UQGNԷȬ} r]dk%=24/"K;{%jF>|3?ֲfdd\Ys Tg80Y{`uyRc<b`d8lM3S} ŎKݽD2Z9'۹0!O|o}*ч+Yɛ>&my:5^c=˹\5!)0+U! +!ɋKJ0& =\"JphLYlS$RVR:mW8n(Cج[ؑUB *%!z.BMF5h5Pv +f{ Ѿ j`P{#-ɔ,'("}H}nװ2=dĕl!v4S*&?˻F2O*Oe\ŕW[ĝk,dVa(-2n/o>qc as`P~4oiחsCڨt&b1"mH8de),t]tsC|W@3*?7Yebk|Y{QHblVXFUZB'4 L:'wR~fK> endobj 3595 0 obj <> endobj 3596 0 obj <> endobj 3597 0 obj <> endobj 3598 0 obj <> endobj 4883 0 obj <>stream +Hd͊zy8 +>sRhF^#y QG#Oç==o/ϧ;c_mӷKv|~_oo~y>}~W=|z>{O݇q~?>Ï?o+~ߒ~;%zΏx߽w;>lp?(O?{wٸ^ PZUuTGu^5P5FjFDMԤU PjVjUmFmک]uPuNNE]E5|| _#_k55|| _#_k55|| _#_k55|| _#_k5Z||-_+_kZ||-_+_kZ||-_+_kZ||-_+_ku:||_'_uu:||_'_uu:||_'_uu:||_'_uz||=_/_z||=_/_z||=_/_z||=_/_ || ߀o77 || ߀o77 || ߀o77 || ߀o77 KG#(~? +?G#(~? +?G#(~? +?G#(~? +?z $߄o77MM&|| $߄o77MM&|| $߄o77MM&|| $߄o77MM&||3,ߌo77f||3,ߌo77f||3,ߌo77f||3,ߌo77f|| "߂oȷ[--|| "߂oȷ[--|| "߂oȷ[--|| "߂oȷ[--||+*ߊoŷʷ[V||+*ߊoŷʷ[V||+*ߊoŷʷ[V||+*ߊoŷʷ[V|| &߆o÷ɷmm6|| &߆o÷ɷmm6|| &߆o÷ɷmm6|| &߆o÷ɷmm6|ۯ\t;]~~߅ww;]~~߅ww;]~~߅ww;]~~߅w߁w;;|C߁w;;|C߁w;;|C߁w;;|C߉w;;NN|'S߉w;;NN|'S߉w;;NN|'S߉w;;NN|'S ߅w]..|K ߅w]..|K ߅w]..|K ߅w]..|?|x>stream +HWmoI_)tV+AppIw&$cgcXnꞗq$щPLSOU=ǁpPJvDf( 2{v}ptzMG7?8Mٿ鈍)l$FbdIu'GJIbhz}t|\g9ft~}6[I+VGL6O!&~:l֗ǯ'$Ir<#"$J #U~\~DH(c5εP1T 00 K,1 9$IcFjà^@3 +;zmDggpMv?aEJ( +-̋:*- e朂m8Mc$e@hm˯le0A`lWnAl#3)$26EQJC,0$i`f 'bf ĉnm~uNe3NI4 +S +F@ (w>Tu/$#F'WWɠ^pom*ԇ ɍ +ؼW Q2MtC1OEK4ķ|b +:Gf5b]vդERyro=ϚqF6!”F#ƿ:~ 0A~l6˷ +gkTu*쮺ɤm%^)uB;Z22",xyy:.tgÒ8]VaqH:b͘+s/ IfM\zS6-4nI`V¥n`F +֊8<-3f # +ɊeJv,鎔r54Pч#0y(H!Hϭ{CF*X,{S52%Lfƒ0SzÀAqY"nbGZ`@$d0(n]T'EvEw? +H#i(yRk%2;_nV*vt$jaf7_>Rp6guS*T>xv]3C.{gnRv#*th|Gqu8X aCUa&ln}<@3u6<6Wj&xWZ^-% 2L:;ʨ&I} %O&p-PDxGEӨUn[V\1+ 4+^ ƛOnnoC%Ri!EQ0.o[>fDc'.J +Pd;g|W pid+4oe6;B_fɝuO 5  uVW/m,Ğ? 1%w8ebxYH 4emLلۗ O8(|pY'Xڟ7G֍ǖN\^7ɂ=P0oèާ3r}YD[(G\Ж?ϟ'h||r䫳 jHО}%ێ +`yޝMPLcB~8=t>%I]DBse+\1w70PM& & N !̂fIGsw ;9{qB*ʣԹ +m>Qy *ܙh +0R99OcZ\xW1nʤ`;|*&C 4ʥg5eO!")tT! +=/뮴1w97D +r>ȹV$[|'LyoDKeYwEp5&5g}9In~P=:'މʨ$\4/$3>뱩O>0xtoCXmO6hP6h0Τ +ќi\']ӛ8l8 +)ӓaXL2sx>Nb[}Tq1* 1Fx=whLn\yU=?Q+Geo:w[/=p77ztCo*W5]_D߼:@RLq9>^[J=Jk%A&cc'oNxi::岧‰[ qCopCCA ^hѽ ` =ᭀR|\+KEX[A*4!|򦲼#tQ ΟEIKӗj ѵWee50BF~ P`Pr[ 뽭/gs7(ϕdʨHZbF,x^->YW zeCmˬ̯u8Զ_gzxu#|"/ܳ9 ٴYI "Wa +D䕍.3׻)prJ͓MȋAG8C! +:L*fwt*& 8_7EvQ. \@K5QG3g\m7Y tQ@ \vKte"!\5=P?ΫeAK)&&HZ";kIO\zfwLds<_zYZ;8idt_Ґ*[P_xY]3yQfE i-.xMi}UMѴV#bqcWtGzPHjX\,_~!ܣ)eR.u7QK1d˱|Op%h]F")k6p'ܤb+Y< VޢJk슄cG{\+4.D'TYt˜6{*˺I5MNm7T{2^9_K8r0AZ>5lgTqCW}C*!@fة,lDt&)e{Vұ17uڲ6b;c쐂a +^i0~;{# a8vDbB`+ +#NH1}TvY̆[BbpO䞊`U endstream endobj 3592 0 obj <>stream +0 @@&MH @.x!dc; sIY{X3JRWb"%($=d"=d(X" AP^Lph^oG(K>(zToZ73sUM41j hL;A+WR?]:g]WgTk/ qL.+۲#c"XPhw_uv _t\՚\.^NҸI·AjIcɯ Qb/SсOOy*1{՞+ nK,.kE!0ʘY?)Kd %nVIVb?u/׮L吂i 61mZI SKԁzX <`08 -IV}f{3 6eCv - \Dg L@ळ;B#X 8*d(%S/yщмue5ʴ_S/[үzp?MvLIci:hZWeV"#'Blx ѦLr9pgJSXIЫJ4sȏC{"+~[kie6syyBTq` Ȕn9dn߷y$ QR'PM&FHr Be6}h2t +_j蒎R܄|BKӴ#TomҞU#'H+N1etꑑghov@VV'0c9 +XBr3qʘ ?8֞Ju|W<׉ 4qF^|YHy>RY+}> RPQ[WMԳݨ`tKH03G[DNgLm6hZˮJTiQfџjw`J:˸&.$Ӂ'g;T %BU'kP\k)N'y!4f~; p#=P X=+Yk₝(ۻ$~^2odrn򚮅ʦ,fZ>8{/| cOi;oF\HoiJBR)̴#!J1ct~t(aIhSa|fVlD}栴[d.?@7 Aa /a`u_ͯD@ Áwh*}F\Jgv*'%vGCGaGt!KT[>7Y/㸛WTGTrۋ8Hs'Y8^1 +XtDR;j!\{V#% ]ĈO*:nx'&E)pA(u#z̆gbүHia@7eD ^ ͡7XWZ"3t^z8Gv*@,g;aZl[fX!.ӡ@4/Ӫwjz\(uIL#(V[AV.CC順`M1cɴ{N! ~솹u &b3e烝u]C%迁6?B/oGmhꖤ񲫏}V&nfD)l$-" +$pmJX4509,Sk07#sWR ]&b]ӣW N[x3 gU'Qǩ嶽ŤzCyN]binT6>XSס(tΖSNJd*rT'q*ϗGr"J{ XsFP ܿo 'b؀wȫ5%P4 ugg]Bx${Ms1az\n,[HDaw.aVA߅s[Nby +1ZkO @-jHܜ wTEhTt0_uz!+a%Gf+[xI^^:Jk%3p`kAhtco@wA3u`o9BҟcV0[܆( +0X1Zgz +mw!'264E2^-,,5=rb2o7pEa`NuaLTOKwHpI$QemMƂT?.z>~Ki>Eߖ0#cb}͕k։[uZ>|>@hK5cHqTTp7t Ƕi%FQvVR|悸׶zSXOX_⾄jx̉$H)1Su~tsw_oԀ[YZOM,llЈ}y.%R *Hޞt8;H)в$ 72z'K|ŇG#zw`OSdǁ>/`kVsFy^U$bkBPmEVwÁj ?;%@+hz`G 7Q +Y 4J.< ~*d6KWBͲ!@x[߇pܨsEB u"/ %W2A,DBu@"voIk +ԧub3 ['TtsQ]N0jxK``+zHA?8\L?}kMTڊ-g^2L z ȄyL8ӷV4T:.¡:gdIʆj(V\E ->G'(Ho*je_APr.V:W9ڱ2QOܽk(S=9*MN2TP)nҭY6qFYBr%, 0̭|6@0ٟ'"%YQVT97 +J^CwNT;AZf#\`M,o$(!\<]9u+KW8WB64xs2%2J 95AM^5^5+[;C[ZB͞=Ju _/"k0KIE(]ǻ&U_y d(З0z2 (eB6\%Z^m`zrw +ݛcU%A;8BD1QmO(k*ՙx=5NѲ#KL;qlJ>t% ֕v?HC ( SjrxJ^WCٺJ] !)֔zYT"g cOx mUk8ڡ#P@AP L2NB3PШ }/7X* )ģfH\ 㥘!ɓt;b7_Eا vx^mֵQsô]?@6]u">Y +6^P/|gY6s-+Ԑ|{u@d eTl(E;+᠚}?K2y .K_?/צQJ&:F46[OG>M[떴c<Io(dc8(4\v.!+2CfSsx:W0(u&)!xh^Fڗ>)p#W)pn?Zeꑲ?NIczM[ ?;NĮ8ˬ(ʠ +9nJemvv{haV\蹷| vF)cz*P.iӄVܜQ̒k/ kmTmaAz%];~U:T>,Ϳ!!|*U eg-_o>Åѳciʡi+-cNW̽KCNL&+<%_̵ ,ɩ}/6e*>_qDK_lKa9äNI ys~luA`xpBsd%=G,#˗' ;Z߂ل:uI݌ޛs&<ڦG=jؤT1$)82 r] _usBj #\+lu*<^& &b.jf64>(㘟\#[ljJG^wʼ#, St#؈l(k nN&lLmXo*DŞR̟KclީT+ʜ>ÌTLi=t*CsMRG5⩩.E: O:w`EO6TX.?5.Jq.{~UMYSj3kV0k'EߏxtsNLX{FY3h¼dPJ2T3 +KbMRP3U2ӆ qLK7;z՟J)O+ŋc830Y޹O2Jd(΢%-R҃fJKdx +1lLJ} 4N3>Uy?;>!fv: Z1Qܖ-刾 :s\ÊT{otjp*$Uȭ-8.Hc9 OHjuT/E~O6D5x,?S:}"tq/⩚ +0_w% =V덛6QvůhT5ktRzc:F_u,7̕S4TdqD.Ck#}CnCO&!tu}dButܔ:Kok>f5Փ9ŶU&kO- +A*czq^E~?ͤ9[^4לV_h&LAyDWzR`3a$&.HOB<9늍Yʑ+L$tuAb_BtIa[䙄V\X7L"0SJ#a+1y)}51N%^㉸&l 毨i; +S*7@ml +g;XG/ɬD씡w;\"g +PD#x7}&P8RNS$*T &mP@3Z +DSiPo,Q"4%v ifd6$^̤yu4-+wè#@mêJ.zBG*DS8 +…`a<$!D5@s/W}iwBuzr(~ cM +xUӞqda#0$KGřQ]lxXD, DY dKv7s&4謌Mt\<bcoq$ + =)alL'ǧvQ*B!өr;oSi@ TɖAc?E3B*uy‡>^5-Q5O9jb֍Y?`Ed je&yַ#ꝳtW}iKLMV8!k6>32* ׿zI.P"!||}_2iHi Թ mL5 k?7/ (G""Ap<+ +Bʖ022F% #͚ }0w2u`f33"6Q[PZ7s(䪳35- =/{ÇZ ̼tHH 1^`ЂTvپ'K2!\ܷ'w{f;qibP-)Z=iݠr[if E+VIX 1>-y[ ag~VBkp?0DQFQ̟(khϫᰭ)B3~"X}s†|&c-:l;=89u\w$2_a>~2b!l [Ag7AZLL*No߳q5T%O<JƑ&痵uhir^$6l,b/ 4<.hyfC0|+^3;`WepXSZGI*rZj{P.-oٰtk&RWPiS^ɾ"c8:I|$a`%%;Qi7{C:k.sKXA[ W|6r8tȞ5\+EG% =9XZF ,:mP轱H{5cmf -·sPM vBdդ*'J-Q3dy[7őB$58 +ٙźBMM.N(#0Ѯ2Fe:1SdHu~k`&ᝧ;oIV|2{1{ 6>p޸]LP[GՄ 'Hak͕ΉVLZ +;@_FRRݱʭFʌVF[P_?Umd3 * +H4\vN3:J Lvp%Ox{IPQEq怜M"L|-%@#"ù>:;leZK6DZŤEr"c! ;O'+@WfU ->+ ͩ|XUN@ԩq s08 +%fNVkّnBE%RqeNlfp}P;,}SF0D i&\B]se8#GOUh ni@1Q6'@.yԘ,ޘsPjP{ft S?QX.zF +`_eڶF3W|۲k\?#ӈ@²>Jn`1:ԏZ+j%pyu#a[PE:5G|Wc`yWkUINA?4tbIC%,ehMM9H$_f P>ӛω^3#'<8̜$bM9Q;+$CZP \o)e}}&$ǃ dQ ԧ1<C"nk-e(vayd܄r@'*v? :Ty4mpN;KTb@\Y(Qw'VvΐܹE] G fZ +xV5mKj-߷9t%™1FqzdzE#-i BGXPtKxSOы9~FG|!Ez%neEv_lpA:5 +Iפ.߯ui@}m4?S)Mac02X1Kɋha%?$S +ɸmI>H.Qlgxоz=SB$jAFrb,9Gi&V[H:ةxcؓ1FdVe4cz/%(q|RПv{͛?ȹӘNGaJQ'~5\%s['kuVRz |OEl|+CeM=MX"|=ƝlHtȮ0}~&F-cjbN&4`v" f$sԚ5V:cwk"ۚ,(f٣4uQcN3ֶu og,H:AL%;F*+ I@tB$f A@[!B\3&;>tl¸68zܷxti`E ĻC%t1^k𱻟몫S7 jYaP-h&'qw2m2 ˘a gSCB +%t]|2mW:kHWƺ.ɢϮB1QŖ*ilіÁ{(85{e̗[-S8,XLY($ +a 2;iK_f4&&OS;&>=%<$v9(Iؐcsyq&}^>o-;l!5ȭRa@8wʽ{\Q`#GsrpvSwgj)Ǫ݅hQ7v&kPtyb/ĮR!; [7W5EDA4BE֡, +Պ +${]=ůxr曮ITPIFCm"W!CDέᒌ;1轗SeEnXBw7GX4ucLs:SufLEyǪ*6y(d1.)޲d捝C8¥ZaBW R}(vizeŜS_.cCӻ= 3d=JGїM$Ĥ +&@OmBux|!f W;|ז~ѥgBW5w۰Fㅋڔp (-Xp2l[SI .Yo6'C 4馄R!y06S7dG-8źiy<*zh3sKn= "@׵CʲG+tQ$oR`oq*FV7ZLMjq`H^l-gy}MH8_p4ƋhÊ5?0ᆳY *WY#Z7SV뜂!_ϼ߀#e;Lүs$)9,a@.Ј|ɤo{>>o慙#|MWwJ)cj5i +OMǻI%l>+m@OnHמy{ cj BXB䡇td<1y?(] Fexg3Y|:^bR(FrQsa^~]B)4}sY9mido&mGF ܄p”-">xs݁).9HNc\5Z+ZJsvش ~=xA=>tĐBt_79k3S])pBdWt/gu.|Ø:q6j+W5Ф'V | aOT$s%mԜ)vly1ME0"6bCFЏwKM,5_Xӱ $?X] J`Ôm7mqťЬm{v$TC- j%`$ >/28PnHe2?ϳK^^*QٍВe>\2"'lf> M7U TP;{mZ3c=x1uC*ܫ]eo T0q;$YΩ]NQG9jҒgVZ%=rkÑK^/%oV4 +]]zAa/w|ѣ]CmyG\\ɇ"֑F+9[ͻk >ꐊK%`C; d/njjH.u^M;P7IR!JHx+7RYPs?"S"8j^+:x9ɩK7ߣDeWa'*cFǂbBC7)>$E< /;ik&k [aS)Z3^/yȱo1]H1D$4UYu~ϊց~V#f]lq6';b?mqQrtC7BÀ#dj<~eJVJ GD6@!iQμ\<ˢq>%vy7gضDH(MQ9.iRL=֐C`t% r4BZs'l=b_<> @.#jL2@inT(s&,3769tˇӘXyڄK?H6]>8?~SG#کؙ\g5mq0}:jG%N$q(qL' vcVڷa1ê_p #ۈYO \Erh [k33vxB'51&#;`c+2[ mӖ3c4`g0(;ENVe(C:A#-n"أ(o􊑞8%GHr/1!XV .lbW=dIm)ᅊ|zQ{TG䊨W9ˆ7 +ƚBYBM=gC-LLu' S)m&, |'!4BHE d:VgfV +*BR *V. +tR*n rsx+*`~L]X +Q~UEBy<\a}tӞj@if.3gN_<hb6LP B$8&S(ņYp!g2TtLr 72O}Ǥ2t,d=Ko.6"T#U7י]sęJa7jg`U5sSC|)%T0mj"a<Rd0 !B)&!e|hp@"Wğ.ձX༨4F,Ñ_'~0+fSk_GCYV\nqOZLyqz_1@Ѥu)V#=3kvT. nt^.J^xs(Np#uػ (z ~ + +ț&3=}B#Y:0;Խ<%@iu#/Bi6ƐЬYQtLؗ, CbW/i.|8\ {#]w\6x3!l#HMA (yT}3]#Fc&suԍ^>Ct?PǑO39gA,XKTyd=5:Y%j> {ũ3 5p)w[K;gg0%alT:FX +1O2dmk,Y5h1kCWAL@`t%1D!UP&yGPD&Ϲ~zh/54!w]%BΤ}3a>󱓭Xzah m:~i^ak{HTðr֫Jjx.>pJj.}} 6]oUРML'; +Icl%pf VNp[P@?z#*z\do-W_n~,;JVuyg:3|"c 0vZV`"tԯPTAZkܫ8V23"3TBU쯀JjU/PIa^u`/#: ,,=_sEBG*x2dQe{Y׏aYM`z38aCV\uC8NӦ@QvMҪ|cȨ8ʓjQni\i2}i&[_b3 ZPM操_*X]se)SglՄR#aȥa~V^(d$\!{ +> Iǐi1VirL Щ +U/ 6,ZT]kc.n |pJ0\`X1^+qfԲH'sw>I;P>y 2XƬEn<ف^t*?ׅ/xgȍ*b_??r*G4$br^$w1"pZÄFԮU6z6CFHB7^ZȎKܶ +˜{_17/2sCxoەLsP`C8TP;HyXZ+ F]#^fbzHN_taɢe1<65_=vduYGb|ҙ'2:2amBc +]:aH\Q7LbÁ&P_ 1 ܷ"GgȲpXzW'ɷi+±.>? 6H ]LSZ{~>}LUTR&\ Ċ oI0Ez٘N +%m~PtKC=vM<ʛ +7#-[l 3 +V0+_j̍ҵYjb8tͮVxx98ګ6jH2s kim)h2xaRA6xCk s滑AwZTY2/Y~h+])MӞqlqJjg1A2BlY-=yLsO~]bsF+1l2qHBftF$!:E>W*+\Gf(hv}RPʛS,7[nsTs~lv 6%i,otf3oۮfF8^#)6rŌ:lH1 VQC̠Cr[f딕VTu z'|Z!لˈnR$iG1skD:x٩ +T^-:V Y^%B{ zKǫhx?ߵ NO[tqU~ej%'Y51@׬.#ۤ3W0UM*.-O~v AU(; +{u02<)댱\z f%kXuQp  fQZgx,sA:"oG7R"M?05p]%GL]K=5ůhgdYdz(MQM4F<љ Ή7u[ 7,]YR$_~>&0 7ܣYZT"iGMYUPcÂr)fQR HX1SN * =z/8;~2>^VWw.]+YwsA1˧ +gZoAq +i IK | |_87OêX.Ff)mz <*!^hA`m6Ԋ?0kltUt@n.oZ?ţkZ yƱ_ԜKy3? >,l/tJ1gW+vN[|G6Izᗰ4͈%=HRܙNSģ &[8 &RC.Cˍ;Co.~KѮmmބכ)%XZoZ4 ,3ަV{<,:CIy#FQo秪bOF!d"ߤ k1!uGX(0ƃa! S>-١j3u퇕 ]&VĎkh]FkH sL2&b.`} ud:(|!n/~Of=C[8O!?$pB0{AG s3F>@UEwyv}aQ. G'2֣2+|} +"!>FRph . =Pғ;f^X0G|82zPn?%w:x %6;ylrOJW]m#^4䠮)rO ͩ>U OݶnU^k0y P NQGBP7IuNZ$eY`PzЧXȥmB4%NAqyxn'Kکx'5y'ګPywc5<7?S [,'FmYhjYdo9|_HtD ?4}4@?lQ9Ct%F:;qtۗ,o70$ g va3Q rv2ػ)K}%gRD%xCToK2z5vg;+a'Sl92 \pP"#/ r9a_0+ݲ4R-۾+; ۻAuC_ Wŏ`EGŎZꔔ +3ef09-[)3X Ƭ`.+_9,R[vu[!hC>ԍJ~O<%I&ifG21 endstream endobj 3588 0 obj <> endobj 3589 0 obj <> endobj 3590 0 obj <> endobj 3591 0 obj <> endobj 3581 0 obj <>stream +HWێ}C-N߻|{p?(Xp$jg_jHJ3v``5rԩ^R1$1\ ۇ/,tՇ͚2W+3df6sLa97*WpK:MZ +8$s0x`J~L5?2#kLߖ mm4f"f$+2 Kcwobp_@l˾ڑCx1 Co8,ʫ'=x?4cL7?/ǖ*>ٳѽEf(c7~ +\v$7 +Xc'pu Qk@偈==MWw}\gK ~AEkvD| myWD(dyoJ8Y>6eȜ|X6&Y,lOyCy.EHғee|t.\z24($ nzf M@9Wł|V5 q;lnSXmۛf޽cvu濋 Zs?S1Pm1lxW"<.z gD"i7gB?HCۿ쟉Ҽe#L"p6YfR&a`dQTO}WSޓAj37C(%o; L3:8K:$Ĺk3èSj8Q.Kwf\}l+\@Ӡ E<\\`.$ֆŖ;I7OIg̙LY˲(.(6uӗuӥArp,!P0Lt`uh.JTz {:tlPJ[~Yyh%uΧ$qT3de]0ʽ*;Bw r['h@t;&a> +m#C3 +ub#As8qQ DZ=jY# {<.=2/y`{_G8G{(/'@p,+&&O]vH'gpsQzUm;!Pxn䐨@ǡ"<dH1m qxW3MT!+nַ8 +o!GTÂ;Tu:eQyCbx1C'. +beCjkPzחDjCApt?֫7n j=ȡ@o-RȻhGqڍ]fxIjș@<v<kn3纔Y3tQ's\dBu6.%VJ )ȳkGa P`V?Y19\0'(2yI®l ;!o2i| פۅ9ʚ ,STL*l_ pb/_EhmBJpu Hz>BQڕ7ýtF4 fVa'cQgj(9 UO-&mzILAJKwA_ +t-Jd ":Ŗ}{ c}#Y +TFx/b.]uch !X JEv63f ~x7c $&Z,_5o\7.Fk2ݦ)i%-̹܇`/u}tH]:ԘHᕒM$E%OyV4<l\#ņE)ޏT)shhh*髛R GU-/'%Յ[[텭{kD/}-G.eu`3,²fQ E 7aY36AIƌ jC](v:$ bjJ ;TV9@V怶q.xʕy! (BlN`5ZtQ1' zA0ɝ*|ȡv;ch+"@x\ uFk5NR p'=9:^L&$6Џj>"B#?SAwDm:rO$ a匒-?_qp=)dM!ٟvW}}P+&@,RJ)}?tj @i|lCȟp 6Klyȹ?gS|6ߖ^'KT\)16:zi FjreLJb6 +Ng9AiUtvr~蟐T*1~ac٫RIZ*$D~*_o)p;̯&%ןc lA?-)aC!gx$q{X)0RH<¼FU=;fU-@hqU>stream +0 H@&$ H/V76HS@2?516ۘÞ:n0ejtPY*B7>j@S$u"j-|K:^ws&A`ĕΧtd{Oā@o>Em۩q*LgSyIy%$ M= tw"s9n?TR1HKʟI([E` B/sνs "̀ ո%Rm%]$)Kƙ\Ρ'F;"߁=-iaU58U9R@*+?KjcFM!e6ӯỴ^RFT=ajUh܍N< vR fQ]O]Ąd90Nϫ,A:2D] a6MFh&!\Đ?piچqF<'lٻ2`g6m ,4gW? +O +I_egok +5G7(ԑw3`$O¥}o j{"lA?eE<_e_.܅܊YW(( 30֥Ծ˘ϱt@؅^~T{(;=D*ߘd@?pI}FM5 n[&|4ǀ ʓ9t!Z4Ƒ؊+eP^3cw`dݚ!k|ГQQ+`10{ˋItJ۬^:gҋUVadbaaA^k,vu(v9n^1߶Wc.t<#mT|ޛ0{\Օmi3BWYM :*08I|E)2 +Dus#YvJvD!@q۾S :߈MaFELUZU% j}]eejԞ6SQ>i{=mulnt?w!: +0u ыW,Fk&$ܥB5awϨJ #kՍ8E^y8᳔o=JۑpVn!p:S,Wr|ϰ M[ jPXE2ktL:5Yx|/8Y*e#\+/CZˠY\y&b{p=:Y;Ko*_`D2 LWVw?IhBi5#wlw(Z$\E.-x*PVhɰ#ƀgK)}Qyb /ؼPIR9"I?;ysU~K\,Ok4aP67kS}n啨*OF(ӜI蒦G3Rةŀ9Ԓ!%J"# s!)Xh +HU֤SЮ@ejK.|Pt=~$Gq4An**q4n/牦҄E!8U}ޘY\ 3r_Сkm_^8qjl&aspT4Wbzb9Sufïzqx("f.9>r#{#~>sn,+8VT1= Ej:$bFZ5 ef؎{ &IBaBC( Ԉ[_VWW `,WTO+FN63Nb.n=E4FšL g X|UK7uYp+ ց&y X[%%DKg 4:m~Đӭr;ƊKҨ#w_CfZv˯F*7:ǟc#w z(bˍW|Do_DǁXevgZK#;Bt~Eb.s$0MA|_kClKOͳ R Q ЭcW +]kc W +R\C7/9Ëi*Yqlka"~N:V^tciU.dIVhoI8x3vY&ODZ]_{5?A΅Eޟk-U&|7Z@#5<3aT,"ė ;a+b1@~C:Zwl.oLAH]|$ *jʹ YT=dֺ7xf}hGWK#>J&k2W+jM$n}|_h69˖.u2F(Y9l6@(V6V!BDkEhϨKr# ;vQo9L=m)K7sO9*ڼ51Mـj .$ufSOKp DQ9¢5裮ۻ{vDKʞv<"&VJVᾉA4Tm"m+Sn?ST ed8NƎH"+R5*q_Ƶ.ߑ#UlDIV)$|-I=;aԟ'+4gv#\{gJŃWs +6 /Aʽ,.rx6?*Vu87C{a.RB {[5:I༧i%z)JuC-v掙)PE~u-_=$UtoС^~CYNFؘ54"{ϲgbg`6bgF$ wn0=~t>&K,KgإcK)4K;$,2ZLRM*MYAdw!ҍ`,f +cS9.^jnK U9d;/>bD3$ `,@[at\Q{_Y0 +?C w[T-W'qq9{@]܅긾Fā+uŁH5iq;!5,B0dM03/a-W?? dd lϲ'H8LKًcĘy. 1Y6M!3#6K fuQN`yaw|Kn7_?Yzz6dU^7.P3e(k _N[EH?}^L%}ETOS^n+M^ +"v}!o:$Bn}C<""f] +O:E];uz0G=ON؋oZk? 89`d ~2YxBsR9Og2{#?0gנڟxD%On.yGrRʜg-o="c)RE90Q%!Yd/LTڐJ};TXE4ƻwaῺsh6m ?1N>/\31r"e }\*=fj9fѽD' @?U?i_8wq{N4R+LUݒD +1[֛0᳴sw˽+%Vʀ읪٥ǰ8 +dk߹|#qMD^3 +X9.Y*c1@f?Zx"{NGf9)!tiġ+ kMe`vpT,uGhD+&= + VMg+'Jjctw%`Ww4oM/PҪpk/T +OWLU Fkv>ƞg!f$7Q&THgTb&YZ W\ֆc =嶞 `Sf|ԓ' a0^UoPc:G-h5nLw?נML{g`a +Q;᠙Lq291QFBZ`{,V_Is):@|@O 7(ACsMU—YS1hҊ:Wl/Mx97OB + J>͉Je#I#'JUeݘgeqksĠFR[p=2G+l kO{yg$)Nx*;@ c @4@&$?z} +BWY?p,7Ԑz,?H$)O5H[fw;FZhIEztT));lla|x.1ByDv]Nf#w¼_^ ˦2el%O1yi/[q-m4(30ꖉz jxȢBNITӏYleE`&4'_OM~\q@kLhaؓzhͲ'OR 9h7<;ζ饮r\s;p:Yw6;7JO&!(!|W.Z `b4Vʖ3_JpL p(8rX mHq`j'#c>8fpCfd3) BJ;ykl#dqv<'X{~3Xתc D K]әZґex/eAc zxEd͌ ΁Kp4LR8,a1o3']vO1[ :X4 HDчc~|A%O-\ =9=odP3{W16(s<Ka&s + {;3rn4IPmR ɞh+kZ H[ gtF}L I9J㏓OlvKt"v?eo)nOop*D$/Ծ oQôECD)_Th-篟`|@˧.HZ}e\ZI2ꕴywJ,R a#f,w%61K#ūYX,5SR68ZO,$cC[(X-}'-.Q$^E;Xq5Fק>=|tBe-/n?$"k*=A\jkq6OPΛ:yKc,{IP M|剛ے ЪF.inl9I-nR!l,5]z|0~2G箻\L=#YV+6aJb~'lgI|wu fJT2_rUS2m"z@yQ&oj]՘lQdܿz±,&\֙~Ӟp.b-O9L)kN\ގq٢mw8q%>aaxl.#+U q(E!VTSxC) QvF3S]xvX +qz+S~+jpkQi61r=x׻R lf͌k #Ă߼)Eb enăd0x?VJUrxa{|CZgd +ËRⓩ$1Q +Xа146BKS+ƾ>0^KfjIQ&i~U;!2bYફ}9usѼؾuG~xZ-7id#ٯuL̋Vr:Ysz52G*yٕi!r4Sð߈.̬}l("ApU3qL_6N. <c`VASi zDoMcR[{B _B8]ǒzN3m??yLH 00sRZ;_y<.lw@mͦ..sCU2Ѿq 0խɖJUU*RIwr%MR'(p/i:a)nqh V4WUVjzщ#"(}DpitJI/&$ %RVkbÆlD,OXC_u[`i*kO5I +xnWTScfxT'ǹ\ޘRvZG d 0#')aU%`jyлc0%u4)jU5]-"ꏹRҋ}p'!YF@fkםaUTm ENPK@=[UElVu"ވpkܢʞ OQ0#S÷&hp+ةvC$e@[(SrK)3DXtQ 0ryj @_KjCe&N(벜&L^٥#E0g0x}ɻAXx{U>d(ۉM 6ߘL;7:gv mO[Tv^ca2U7Y?QeFm4qwlsU:r.~py0_ݪm?!(`@d/R,TqqQ1Xs7ܡPaռ:gmD|H]^>aV>ZzJGD%WrTԝ?^" =H8m~+/elnRK#W +ҭXĠp1嫔LUqy 2nؤ܏ڥ/f"9)DXN2cW 1ְ2Ӝb*QYR+]wyBy \%|bC*Q 1_t~nDŏ$q8=*y6ŽTvx4 $'ej]، &K%=I qzC^Ys1N3coR_?X9qA'n +['FZ~@Ř形J "Q\HOљP/ߪڝA&,=3ٚ '=^c(1w)װ$H8†E?W +Vq(pqPiBr6bN9Ȏi`=*0S$` y<9iu]v +PSUhpq(#cS8_Ι~&FYRǿM(Y֍.0`}^}xDlR;B^_<=PNLZE*̦Hi)pڰi%Mb`j oy劰eT _F + %pB[( s%aDdG{ >b +elNDKZϳUhf!|k°Ab%-=@0w#M;ϬgNlCdRX:"pNɣ-=5: .t2"M}#Ntjͺ1,cQa>Bs5Ŵ-EzKB;mxϭ2OƢ_ TODNj[XD)z;wt*<c.~GQW:^)UUjG2ri\rK>\ e>uFV8`}i4-P5!KS}WW A\eUTz% +>\N%qh)X\8w[,t`;'3ryu٠:V 8򴸆)0P`nM)̘HX^jwH}l1P80_(r襮{Eݜ能(>m/R/h/yKZg9l|Uvص~}3aV&sٵ#PmAhg.{f~n2[#!͐?L ة ̻zF)T2?`ael2T.gABh!ٰ`$@ѳ.͞c ˤrOs ,?J_Gy347慯Ft2Kg-3F{V,g"=3I/p<5t[C(2c KW0'?43F8FUKuBUk3th%rY/3p7 6&]$oO rQP>TfacEa0I/|aȄPHi*UVZW;$ F w|N_>&e-s]trSB+n$5_\ʡ0"6^^]hmɀYxoԳ y~4q*RK0{&r8xK\_h|?uȪ5]:t꼡M(M![> VwMdǸG$ ^s*±hfVU0Ə<3xB3JLi!l^1"3ZspV Rsw$ɸ7.,+|)'/**ItT۲~IaD7mmTv;F|s L~`C̥j ׭u >X6eF?c&dLo2P+`6x6J.N`#xIg#g > F狾ޕ%!I5X]lд)'DfL~]P6QϩAŲzS2map ʀ啪nM x_ӗ{SNF{@Utq]Xh=cZ@9/27qlLVWٿ펭xPV +fR6jD̎0udO"62rM^OҘ;RZzee"KZ$0>Y3˴#>@ jH/.%sGJCᒚ +(g@vhv3ӌ{BIUHdnÔ73';:"B<~R8n,S.]mr Zldi@T +W4V1Qae[B)jq W׏^m2ƃzut;pEj`J'P<7O7yz +?;bM~wޔ&M;)eZ=Fs +y8V:[?S||/~_hnN~rP\ ')h{j >PI`x.L2J'jNF1gf|A36밺;(TG]CL1S͑#Nhˈ֨$OJFbo5+e2mL]%u&1կ3%\E.Sn$zL^ bx 62t] fR\9$A^62M&hxpKl#`tk@ڦZ+˔t]5'U*K?L;,%`#]}"b9O-%贞b!ws5c!~qE#qK. +k0@{O&WdH}d cCe{B1Ipiua^V4&GvHFd9d*cX뚏c9I4;`[/{&V\F'BțXE~jE1(Jl4Ƽ7`ގQ;$T[ὸQ|K:{qf3`I"}9-~k3UURppb5.'L|̛gnZ7[ =]˖F>%vHxixp0\#{}Y4G? _VG `* zIN_$څyr3aP{rߑR_Ns-fzFӻ'LlD-hj<1Jď_q~GY֣O~cX[9H(], D$ +óryO}NT 2gZܪbBμY;"U/MhkC__蘲 H2YصˌRVBAxN 6j>Jk.Aeh(|NHqI9I3Cս\bSx\QooӉ &=}۟QUC l#f>^Ap.{[N9ivMZ=Ap`vC>3ܟ/T+^۱XE=ƒ6mEOT$H ~t +C'E~wе2Z\OtzU0\& g Gpe=PU%1jE] רl$9Yve7XdaDg%Y gUɜE g`'Aoky\, JAX| +ZS𛞴B&" Yj@N1B["4x2"v, +lmek_THb*|<&5M6SM6!1sWa(Wf T2r)Gў4.03QY*= LԝfzkK{Axei1~_YoM칎3 +]\Bjat9Zީ[~Hf@ZCRێY2`<80 gQ`J`ΣFi6 {=tG ,m*V,}1?S|EiiRh-^dtir_p|/fP>W{ks-|jԐ҃3Ut +zc&GˬKJt*j8v*=k2HªI^6![t=CmUš"(%H!QĂ 2`nsCUIXLL|Ig*G]7.6SB"X^G(vl1M*Ld9״n=.6&" H` ]]%HwٙL:p8T +?T`" Bj8>ze1@9pMrQL +V++mЫasMH1V +<Ԯ\b=kDSLHtP6 )oAӺBW}òZyXw QL濷d{4 $|*[8,~ٵv %nKsaK/T<d >ުڸ֪aQ9^YDR`"%ggDcz J(3ɔar1nya˛ (Uh 0 `xy\?ZX00)4߬)|ـ!Drf 9@1jG +̄#V( 3ebS +%u\u!@(q A!M-;'!p@i97 X11b!h _ew,iV쎲i>ݗoa#@VsO޳@G6c $.[2?Cл;ouƞ|[ږ{ѫ KRȒQۓygv[t:FgPmFQ'[>;2 IC=Gŧ_[wJP&[lz<>4==Z$V- \rQy~O +Oo%@}S&}VAt]beU#_G 1Fg%<-7גvc`/-@6W[1i4h0ouŧ}8TB0ӥ4,%# 0jf*HbMSxXls,k;*Tߌ/gdQU-oqUd⢬]@O =< "oaɑYm7/sX ^x"2cpENө>W~ݻB~?V6415uڥ?͌өEu TW<ެt7*Z Ft*9{߷KQ%9~էK;*5NzExКj;s,Kk }S#{.H ~ JԤTGOF7/v5X}5%9. %e+KQO>aYtCD2UkixTZ&H>tC{ mw#,N|2!mwdZHsHh$QQh0քrD +3 nWD?zTʌ'p ' #hOK+"(:Ŷ.>WQܹZʙX~(%]Xjxp^ s*螽އO5 >$n[hb\[]A"Dzn. >Z͑]}K udOevˉo9IDT,I^++?Nl sm,ӯ>:k2##̺Os"tOr ح`0wJږXL{:(HZc0dm\BHFDBY)} DꑥV}6NS:߀y)Q+&8;}#Bc*ɓsΗmxA4PMX鈘^"h1~+}:L( +p/Th}<8< aǰzt4҂n3 vk5+`ҽ` &R%\bq`,PZJh,z0Z> ĩjҞ6DIW+I HEaEUtq$: QM8qr oal̶7 } 9P^0ᕍ8v Mt){h,4p^B +0YyxGx&yUi+jNʾs?^8jICpl#zt^v5}~BSCJ_V(N$Aͺ;|vAST+e7 +%ev%<t_ 9]BRYyx5mUʑ>s0ߵmTlsMLą2 +1(ԪB;.sQYpN9 w%{YϽ>>~`no^Xd*orf˻"bN}aЌwY$݄s( F 4AﻸyG}d!qEJ fq(KSjvV\zYkI\(ůk=, +r/PfgϘƄR _EH%} 4"17$gV Gї_0UYe;{hL)P1=&{U\?M3J8I, +]!6H_by`V"4fDQy.mqjj@{|vAe`>MKfTsZZn+IU5ZQHRu>R40N sS]͔My)Wo靉_$7SG>8^x.̱wܒsMQz#HЙ09 I +WAQzpM#Sawڸ!@tOʴliňTN~hg뤫2U{ֱt@unK3LX\sZ `YP̈>" +d2k^UPݬrI璫J ;g1?̔X$$b ^3/(iB%j̅zu1&* ln?~4;v#gV50-sB)j0[`*Y$<>&X"J@8JRL|,%oy +)Y;>0^h#=gtv}BY,T@u\cf ?I'_:_;bϹ;`j ٽ y5-B壕iˇ`÷Daܹq0[t?ZƏ.܆oT>LiFECfU;aY +~6m8<  HCK9>%ց:>lwY_Qb}Ubu +JيZ N 9 &voaĻ/{O"hA H7Ql`4ٛcS(, %@7]K#Dg K{YD+u?X!XsQohU\7IuSGmVM(HNe{w+w][ ^kvts'ҲF"Pjr_M?v4e:?n2]8PPmkhh(h:.wKr"0 6wvdlM7-ʵ ZCܻa0XS}= dm<ףhRvPDŽ[Ɂ_ O(bE54 mp ax"eIXXeΨd_!p<3O2ugD9|Glp8hn0Tj:y.h +8a/D< +"dnuFf~U]U+-w"RDvFr'zax.=8T6olbhٮ0%],.pP$nG5 +HVo$\s>v_ [+UZ)4:[b^Hg* %G%hJqE^.bLjxf˿Sf 6uۘL3p!pZ>3&ph%㧔سz)"Z. dAVo)KyE4V<:Pа_8PݡrLr63O/};{OdpxhKnN ! 1AEEM=+D;A.A㛌 5ZHwE]Ǡ (o9;&w a H`|u2TxVG3Դo7b`_uO;t,!I>/?ԙuhNfaXysr B{"%Ebb8пۧ+sRbF{ǥ[]1nk+1;=1a0snlS9 +5;a@vO%% 46>gST551sR$~} a +LS~e* {LN'\8a+3f0yI4<VK5R:;4f!fR(qp]͋C{7EkN3s}*ZPUS M|}5엟h [n6z:)MHj%B~D־>s+H%0+sv3ÔTvXcÖ;C>CP(JN`1DU3bhi``Kyt'ߴ sSu2|-9$F@m3KnLfۙN[5aKZ& jT:V9;J쀄A!BDvҎ]~1'p22ٞ#V7!9\KEE+a{m-:n<ڀ?; +qb[NPO8s>ю0X*H8t4Fz1 0p#F, .gZWB^IGZ9r߁89t4 +SMC Z=K{typVn)*<RpcS+Ò J8ḿ!Tԡxh c~bNr-,G=-'?Gk p>6O-%&4 Z8O#.oX\M6$)dv[7txU=H>Yt?H +֌jfuu][:; +$Մ͏;ŽɖލvSPBA0/(O{eo vv%s(\0G0H*pm5ߊ:a׭-͔*akGgO>YWٌDgw sHv͆2iO^*a= +zr`m  ?U+G1ڥ !Zre_<=Z:<g*4q: 2SBv ׯ;U mwGn`E'|Ck&kRܝ7xŋ԰d~7z?`;f*ݠ!1W7{w# xؑF./'[b-[֚}Bb;>uŽT;Vo&yvL4r#P 68[K~4A7).IX7`omr$E*)}aKw[Y, 1\Sqo'3u>a42- ȳb,9bitf4ٰkMs?i0:BO` 1FP?1V`fy1#_0Iعb{bL߿^IZn ԅ$~#f@9q @[>MO)o mB;prF=8NIi[e%UHZ2[bgM_SU๴dy ŘnK[k[R%:^0GY;2gTrAΊL*fGމQ{f@@EiyjkG;YX7|Kʬ`r>3bJWB t0oLoᢒ4\‡/ʅ*8$8-&~af"YFUR3,X{5 y)$NFdz؝ :t5_aB)=s18DN!(Y`tk)؉"6&@_ZT{G__1 #kUGg,cԲic(o}6wrG<LJ +S?Hh2UQ٬sO}G 6V~B!%bS ~@ ?A\D\W{7v̡Hsl_KZ*a L8_ԉ?#51j9_7[M(X'_}-i8g0dI3 P4K);/x҃R%UokWF +G MS/oK)RN5ac#V(\ 1 >I`$6m" 2;Wq]oaV=ҙg^v b={cf]!E70&n!\tBB%!cG׾ sY4,~D@coa}gӶU&A&1*)'t~ei.>:R +2J)$RFo?7?> k*ګ\\`>۠3kwSW[`usi1 apUki96j`-4X;Uԯ пQkd(kwrD,`;X>L[Ufx~X̙<,b˪Z}g޲\2.ňΫ>^3L)?c ʚ?:d"&x9X(v}UtD=EN뢖V1.CfM8ҕo)[>Ƣb.hXN E>gV?ҥ/ІZ fk՚.-V(n<{O`FplDjJk\3oW\ s-]JoxX_{\)4D[l!ivD(eނN > ;ip@FfjaI=pr 1Qo|v1b$y{ףϖvK\=!!Sաu=tWuXȘ.n@$N3+-PsG$![h0; U U1GBF@?Fr)z۲ႆUUm9GI? $$ H _cN3 5m=̬^ZomRs#m q#^+Ow +ix9d7AFѿ\H|qD QhOЩr q.qӁfhI˴Т\3+h(( +ڌ f@ p/m#c䪮]6(O" 0{ Dib6T)dʚ@xWj$rxkI>x7=H<~_k,d15sr%oq-Bn[T ut}KFp; )q.0Jfc;!vyV Xk9Ǧx REl"B#TЬ41SNź"PV &V1g&ASr{*(oP5grNYF8PV Z<^B+2̡̜NOX)Dy WM5 a#ʷ"H$&NK 刺Odt{\΄rF6H/$ "Ea}+G$'EX͈ Bzn!=ɚO1b0_+T25^§1=ZɴWMmk %Ƭ&y}АIyp ͩ"<ͣ55Eur[EW#o;7Jψӵe8z/ō2+Ń|O< +5U)a'$SS?ǎg}?)2SґV}E-Y-:S-!G}!N&)W +wfʖ 5NT0w6V-_,ND ʘ s h 2x A NMD_Oc @?Fbϻ27bNnjJy=~X.Z6]x7 +zCS&,IW'"Qo^^ +'qp +-SJAL;t -+rwn[>:65SPÎGBJ+b +*_O-/vz"Tt mjss߼ߺ2jv4XܴpkbEfbZ65?"`.VZa$(d9Kv oΝ΍#g΄vp+WIz%e1UDnNֻ]DGJ`1eL6Kh6^; +&AJ5Ct |pyNu\%>}s`>9-!F Gy5ٌܢτ +}a"NGef%6'&"VX*?]9%8/9"I44.A!6kŭ^)^H*G[P2j͔L[ rUdazX>u.j:};[&fɀ_Zr.$r&DE/BS]Lq Y}K!xy$9\Uը(xQA<E)1ݴAJ,ʌ(gPP_Fџs3¾czSjN72s)Go6$.KC31EJ_a(ϩCCd9ìˆQQ-PJJY0 ЉPvx15%ݔt+S3/F'[uxZo;i@O??|(%Yd2+|45B9!µ=s 'z2פ-l^_oDU2 G} }JڢAyE Xm:e,8oHR/,~L$0)a=)q!O?cigD"=y$- su+W>s,`S@LXۿu)ulJ%d! nq=8LNPt9'rN ;KK/&bm2CS--\@?p>M%w) {A-QFu4|ecRݟ2sHojIs%%tdͧaHu;uaze^*l!sobB~G5y L +G@2Q>'ɮ]>jv{!z+S_&,̻'m0;0 +?Rôg?"l-6Jս.rzxM +&|ֱ㷡9lŒwiZvv ;@UL@w2$ëU/37w'>CJ/#=\oZy.YBfee o}"㱗)T͸\MEژp ݮ%Os/(A_&@Q57IrhsnG%.|9x}Xiw-{l)H +m 0 Ԇa$7$V8p?rdiV|~xKz]tLD]=L,- X=cv:R%; V+Wu4J-Q;̱C_MQ!ZH<~BqʩhvNޛbV"|B}”Hm;4<‘qUr꣋kafʦ0;Umv$v}:aDG +u98:ޙ~",Hr +]2*+ÍWU%vG>aPw[_o~dV[=L}]Uh2o[h}%pdȌ~: +\dӅYrJTr xc]79*0SFaO*̤gusšMxUX \;R(gAc ;"Wa景Db654Od$qaX& ]`gƫP[\$i`[K#`S6T>Eo#6l+D9]hp tE%E[NUmHJ6>qybflaǁ3b4d7LC;kФxw}h& ZĞȊ3IdR-4RQ/ >,Ez>C\/T{8]n\;n]:^5_Ur+ pX\Vn/U]fs^N~3hRTk:PGFN-\\ӍsG0y*3@߿o'fgjaY5_/_~5@$')ܢcÂ!ɰYFEYKM Gn cGygܹXyR>ԂRS 0"G.| +bK0auӷIlmoux{qDd_*Fޙ{98$h2mj > ڷfgUkJl!:6"9M.AFjea*<êY7R)#.5,5 ˸0CuI(o6犟"ug-gR@zn]_똙zG4oą_C!puSd*y;XѢ#+?in 7J̺gV5x^G̝LXX.e]MlkV;?; +u4mɼp~2wӀ6bnMg/Mv90q.& c5]+iJFdwzz9Y_c;}1:] Ф\2/w E; ,b9!@gbjkߙ<f{ ?mcbs-7_w1VmÎ|zUəe9l#i!5R[cWpe_lM0:*S>(>veheN1\T/Sj5N )eKSy01FI1Z1{Tk$M5/:+ +؋b9mϡQ[9i\Z񾠹io]J{llb/cg{SG?Z{Fx_&D&dҵ +(iVoFzSNp%8j]t9 ؊,O;GX&]LY#ZD<++UIyI zhV 5tBD&n˧;knY UIHdx&;{C$.'1)Ȼ7}Osrxބ+``+SyZQA,O4BP1 Gȗ݄ؒKTψ@hD +2>@ ++I*NFWݡX N8 㚾3nx#<-1o[a=aA}bR?Rؑzac]ψa +G^\SD@V{Y>: ,]H"t ˢoND"5%`؀߷}K;z:>SlYM6ڶeh._gT5nhwcEk^IJ( X''8_ˍ N܀TY )2ʱ,h@V%1x\Tq#ܯ y¡y +t+Ohۙ1pucw$9x#%4)&m0oxj bB bW,#pɏ ڹ)4}xAJfH{E/>E1i +vY؁Vl[!-8J_3JcҠ=H84 [ l.N,bų36a6ZfNeU@,:>|)E^ + ɲz>IYֹg'}ADB O߹2Yv.'> +"oJA/oPqC1=xBep= ̒37o7iqV7O@AT1kVܖj#\{|u$5 IwEJ.6`G"z}4-dW-!w5.@49 +.qn])̊{[}[' +' + }* Q ?Q6kq8 JDޖ+ۿo?õdv.Fjha~> endobj 3583 0 obj <> endobj 3584 0 obj <> endobj 3585 0 obj <> endobj 3575 0 obj <>stream +HWnV}W@b=I T7e3nJmG?u"$ nNq!!RPьn)Jww\⧋ۋo?t6 J(n#6\ZF)N$|͟S{$sx_|u}?%-=.qU9Q*Yh/(1NnDG`|O6hpQ48_wǟ۱yH6Rʒ|3b҄/8ol<ϩ03奢DK 0MG(QN؝|bwLYP!aa8M_#8Unx(%#R7O]o_}=Bȁ%Zh^@ j6҂uTK)*D$I&A;Ug#y@&̉`.} t+DhEd4qmeuv`8V-cpOd= 8m>(xw1sdIX-z!{3GJ̴?~;{6%Mۅ*Cl'tu6 +i㔩#%mC[@#Êla6]r z9O#s<=ɡF`eԇ%a;h;Ė4-6gV\?eH?>сfv}[J#=Īz*"S []]S QḐvhO&EK&P.Wߗ#g/Α@c*eEȗt8S}?G9c#(x*^Hp9VzVgds7Ubi**,6N`3m$I(QNU8^bR#0K<,.s Fr6 rՉBέ7ݞ7^Krl\?S|8n9by\Qr~Bw9er0)Lav F nB ?6B +c@(7]0cE0xJLco\\/HGU6I)i@N$KaAs]+H|Ur.) Ds3,'zYqBd#Tt]tgJ?\7?@-ΡqVW F;/rU/w/^W5ǖJyK"! <ɵaǀb8_⑓R)H7i3uC?>+G(MM[jCz`_FُpDiF6,a~_<;dׯ ]pDfw.٣'?}}|΄8@ӻU .2˱:us4\RQI 8m7NRj +.^(L῜Wn0z!icn?@D#lߡ!GƜǷA\Upi<٠`q|1>Cӟ|7:JۯTu:OqFNKݵg,ރA%D.= ɳV_M1=nCY?leiƶQ DH@Jr4,Ab Md_,j  /Q zvXsN`몰bC 0F'|lxڀEލ }VX ]?=Ύt^XIa[f߆';ݻi-ZUghgD{T*DlS&*|"Y)6uT^a{Xh:E3u-^D ഀ& +x+6S{2rH{ L2Tͭ l(x VPz-B /D 58vn#}p Ώ#d4=eY"yIkxM*1}8!-I6H8vGn)UlLT7SM=uh0۵4'\zrɲIf78r\T>stream +0 D@&n DOUcM1D~26yW"SD2:XRCZV9+uJx)K<)>7MƣYgqtW4UZ6@Hˢ9JtJ9qW $__yUETިs[ (BFiKd)KhWnMdΠHNΘ)-f\ 8:# h%ژ+ԭ hI'GCZU/n4qJ]QoSXDj~8I >o`Ϻ|;WʮEB}nJPTf[ʑ +Uٹs:ww6#QT,{\ʔ8hG' 8 +/Q: %V[͊k|cQI*ie5 * |79oSj7c'qej*W]| +pWRUih_ޜ!'꒤S3fy,]@3AoY=x,;8^qä[#w02ɝt2瑚b_tjvEYw+[E- + +)rKJ;[qPBbJz+u0g\,C*BIj fA:^ d17Ma0D5R)ׄ]2My&rͪ@ /;k 4 g9Z?\*H۷BP%'BHr%9PG"#!Oi5\%xvcje_k:,Q18ߺ>aO~]; v֊ZRc%o~HJa3--C:BPuE@h@[jvd0zD¾0:{-XmDN@>.*P+K)m[T#;I, ?w3b&$7F=;)Ź"P*wy\[:C1PTi A? +(^ܦ-f*(a +-rBƛ^5Ev-,JPq0Qan)j-dQr(hݪ#t 0%j$B )x6WWJ]slsKnw<(_"XT7N2FߴSyw ?ِHKXULe/t9}nP^XU^Wh$Ԍ>t~jUSF* <8}P*$ErAD/sݢ3ћ\LIQLR÷7Bw 3K/9:dKn tjCJ{8p'4]Xlya3d;p(tз +xW`WmQp{묏P娂NE6" .cq/CF[#=#@@9jR4<@`b) ɐ9U^4EЌQ9s,kWX]Jm7gw12h.<˟!Ng$r#; KhcbCҗkڅK eՂwpE]HvcmjPͣN`w-`p_FR2rt-f*YgUGǕaf@@1Enn]Ak@{Zs@(5#Dw4$?l(`΢TRqB!+E}P +@j0@$@n87X6v$"mM1Wц:D7_-$4e727.Q{Zn_T%* (nr<"B%CS1{_KcDL@0u#2U;N\.&1 #(/#  w֟Wa%~Ff5a=m^+8P6&j8Fŕ :tlHG5d;.Ru[ȟckQZn\|bZW&?Pw!:M ZMb,?3ڹ@|A?zhShW!Oǖ,;x]dqn{f1REc{tlH:4QrWO꺇r>3wR8Szpb.4gϘ霪 K^4iQgE8BN|C}D b\ ֲ?svDM8^Ѓn/s{jB*x/6][[g]k/"C϶AC8|qҞ #Nz'z8O1qŝ 'F&>0 I`ZAx )ʯ]5eOюnM㭧HնV}(Ŀ.UUu-1 +->Bb%7,/ƐI wp,ԯ@=p^ 1̾Xvr?xӿe-k]"#;>:GR~jGr178^` +Ffc̷EEfW< Cک^g(8-n7W,J3g Ӧ}'>{6D|D;rea3%1)}pLտe^ɀ4v7)p镞ކS`{EE,}dUg䝅rvҡ`4P \Zx\͒=ExhٜφJ쟜] wX{+uhgǕ)J6 +WIWJ\Rʠģ# I#M{ّs$7; EIf'|-y`կyc(⽨ Zg?0 +P8̣. A`и:-K<`]2Rtj^P9 +rˬ |`cINMXG/!2-J9XL&rjP͈7U>/9 +hrS.s^twka\v|ȟyAՉN֎1|25{3Z$ol05z1y][-L8(z6QnqV -`gJ1.)AO)dwt$1 UAnv'V6*>݀yzcj6 +,s#uhЄq$E3&C@H3@X۴pӚL##OS@FǾ/Z $j13`4n J7:PضI"!!E&8ST'^-S L|Z^GewTӀ7ʠ?\K-L} IG+1*ܑF5:.}oQn*~\0c%-uΗw_@>tk)?{wJK6l?Eĸ.ipUXT)H=$7 '{KwNb]'@7֔-&/X/ݧUtԭcJNv,.}L4[N37觾tM$ly#tr{hGlcqYI4F>؅vj RO0}Hps9Y9p DVtSF0N]i#fq䓓pb,6uQG*\˽NN*BQEwm, +Dr28 <@ +97qt^7ȲTlJxܽS!# Gܺ|0()Zs"a2MHw2Ջ@UPe(S+^ u /fJ'(ɬBԷ=/80cKiݻ}e~օcX T([p5ƙM&]OB_yWto2U[qfηXqzc? 6!Dva] 0ᕩ`pvMӊzU&룼xٝ@[pvfahc)˪ybʃnz1`sQE~mVH.rl쟂LTׅ4Kki8Yx"v96]>|#09Y3t9CN@#N_ /dd43:erw{̕ )h# /lQd'`bTk(\'}4"}Ş{hтH +9JYR+\Py6(E>D +A3f=NbNMz~TɌ &SR~D hQa)JJ:eC[K`ޤO=`x(wNIzOgϰai1~P<7vWp0,"io k>֌b6!".Nz +?dvvonj"G?uHʔ%{v+]Y#HD? ,2"wH ]LZf~!F}r0s#Czhب c1߇m0VkK_w0fAU:K6+&4Y0f!%T^կ\5L"`ܩo7i*]i¼ߞ9 +ěI"nSB#0McdS]TOXȆ8P->v -㖨]mhS03̴ iXioV$[D7^~SDZTDya!B{7ۭo3DJ^m3&'m=#|~]aav`y,o4 @Zyz+˅eDo +T걩˲̂}Gbݵ(A\=^HJDA~ȠDM7#;. &HrA~xnAh`C=N٥HgoQzŕE}Wa$Dݽ[v:̓2A¦S7Ůr}&#7H4uNC`!BXF@va'9֑W@&~⽾ T +!FFrw.̼:' VOÕR,O8/:_$nJ%{)z"Nd= zPUɭ\>TE/\m2|tA܅WZ9d:}Ä|W@  h3!Wj{gnڶ?hEiO%11s YEm%0^ B* +WpqdVa#nhQ&Q;4@`0}ry +j'efzٮZk K4?r>QɃ, ZYF"le׮^"3eE`%\,wA4t0; NXyH(mj1?'{q* c1y4J/8iR ?P:sA"qlbsچOlN6ߓYR%|͒iTq1HlQ`KDZv7/[eU;Tנz=ap'ؙ.Kt6fG%VD^4Σ06q얍0:} V/91R*@&$Q֐+vPY W.W݁+,~<T.*Y<Vh?] _u?Q Nj;{pa֣F@d+-8=e9lD*] Z$7O "TƪmU*L!5&e8=H10E ; \վ0ν&`¬FH½sn"Y;m͓ nXQ1.Xl{ +Vy4tGw +/  cl_ұ53^.`EI\ +R❴Ul`Mְ"*zD WTuVL ˡ0-(QuE,:Ik]xljb_+GkQa%>YJO+tDPPFuX z uǖ+>ȲBLjR!v +gFZ~!ɣJarT%6Bz +2w+n*s?x9X/T?i<ů 9+<[]48-Jː i8h$eug\RX՛$r +P/c<+VřVSnXygD_|+ud>Tނ8>;ޒ +Uumz +](SZԈ_xXS| x Ve\r3Vlog Ur$ +)Ri)A2UÀwԿrKT<_x [ʯCs/TG`!=6㋴޶C>׶ 3eq8>=߃J&;d5Ε(g*7BIJ^~nQv}PO.y-{3R?J\ڒX0oꩽ(RO'TGBnҟ8F=5[A1(Q\)o,k 1"q~#7b8 桮 ɉW}Y4jB.H$/c<@)RZ`XQLzLA9mʹøV@{뗠h@Ż!Q?mI-o/qh?Y&J,ʾLY1p6oaj2c* 7[*6AJRFEKG)%.%ȲKڂ@]êGd Rd >M/9&+=uW|XZsd7';{xB +!X݆t'f;P@¹dS0w\t"_i C=M2#(-9<4۩%o۩i»#b$R~@iLŹVc Y݃6+#%7"GA[wϛ"\MFZt?X.۰`)fYui%x%.a +|ecFÊĸD14dnvN'.ӽ-aJRdx|k?2*U tHqE]C21<1>onA؁۔a[y^R%N>*^2:GVm%wW}*oWWw)'P~ (%b@!՜+xw# !l&9I8P"MCЉOJLX{^x0p!yzƋ0hUܳ cM̲Avx_:-I2+X&{z--2'uEų(|&=S즐zvmbxd)'ɹHZIhO9q_^0СUߺz[a&QXJo!L (8PH?^p_iɽncAskB/gú2-3>OM~B!챞CJ2yr G5n剅ء`D|N +]9oݾ% U s:Mlyz@KB4;@`BIGYA8%͐A&/fU9c__fuNhz;䥋"Ym_$ux%HxKOa ̜>,_TMp3*nTkش#<<7 CaD縌n`Ԧɯec.V?si4ob왓kiYϩQ?y +` \ԁD)=j*nov9؀{v/sW.^**B+EIN$FU_3P=u^ʥ۬*V =-_UhK_9fpG| 1Mep"Vr1<8_cwI_|ÕՀcPE,`JekIx50lDi9mKϐE]e>/LkaV۷Zh*91We)vOڜk"MԔd0 Wuu1L .0r2X?%XXQ՝͜lD”P0Mڰ\P,ݵ%%NU!6Bt*UYa-TbG}G%.ij*6⃝hGª9uR,ǎO%.UuZ~.}ne[*8 ѫ x,K&IZWb":;;Պϧ@ncr$)goKz&ڟVmxp281٥RcMĦApQ +rXikHZ,MT){4_z8?%BԲ#2۔+C- At_:Wwmޙ?ttK\bc޹=0]Lx@*ͽ6pCfMeҋ 7)jc=ݢ}l+}yיLhm*͚w'ݍJTYGpyYO$RG _ZVއTPj~O'R{ێ{2Vr2DX(ԠiknFXKU,=zFE`0XQRWl50$nbvnvbfK>yQ֫ + 1ڜJ,c@Mvo:*Kp?L8+f*J˾GW|$Fp+5_DQDB__j;Ibꮎ_(ӄ`!XLn[u1Vd7z +sr̅kC3רВB_{ǰ.&j. Ӕz J! ;9X` rztR"iI\] "uic|*kJϿ3V߅ovgu$y[~$_;ʳ>jocHPu(̣1CԤ#I shhinF'#y*1VѦ?Ozi.@]?frm%%ΞROPn_5 @[Ϝ!/F<۞hmdL[<.D ZG`gd|T)vWؓ<( (T+!M-~8Un'9e8cٴXj]H8SMOrbw5Ӎ'l2ȿriVFud"Jγ^]}o[Igd">It݅Ю:%ДxaX03~3:yD8Ŷ^{7nM_m7FoME hM[+󤨈$F_;6pux'`*a;kBso/af++ڶ*-lJjQSO]uf'>vqՇtv/2Ƶx2&S}MϹQD8jRI ]V{C)H™&*Da8഍skJP[4 NqV;D(*/# +g\'fw3d +h7cmqr Pq5x/}DǏf`x*4ǿ$8I` ٕ蘊DK1M`_ʪcғ!(9JL5~0Wб_w9$Pe 5*P-TdlDKK +Β*ꬦ/VR iA̼'EhgvwIG_YB q.Sev*8߻>f4:aK#`dA%F F۵>&s2rJ**/UYfutoh K7 t1s7aqH8lHJ+Gh\fqh0kĆ5fun2x)e٧=!>SiAR#9 YjzZE$V9)Aq<×CFk4^L u yLO4q_GyM熙riTEօ`,?/ckAS/g rKI/C_)4NWY:c +k&$$]z1E Z@Pw|I φ0Ȭ Q>Vr}q".܂ޣE,;H#Ge{\B0>(~AJ1lTr|O"]tm dWl[gB1CD16Yo&I.=|pP{F(rax Bhy*Q}|] jdc6 ֶRK XsD(%ng O_s 4TI*8akbې֥2vd$y))oj:5EbEӶkf'?;8 +1Z! + #CAEb/<<D!}b'#J'L4 +X.: {nh"{*}6ݰJ Z%wӗA Hjt92Md)cQ2ѩ+m#' 5~zީ$*^>`nFJ*wuv3馮KD7koW1@ٲj<_U ,pa#8[XHC~`\~Zc#v46D# a2aY ]C{̎Ѳcpʯrz^R v< +W5NTRXuC%!n T WVM [eJt޵TGIŚ_5<K c\l1"XPrٓ8m(.1^,^4 [⫄@2 2pJ^-,^3#'~'m,䅄+'N ndϖWY3vTϖ\2]%kTzUOhI"A: +HNpЫ`AU7.*IV!rHaa,6Q;9 Ůq;gAdvB3NC3<>ЀuW5X=A`RVb3OX8^0zT|GBG0s vB"+ X6ډXyp{be5TǥB֢tt-=Lfj`{8p8DvbObg\O 32c!zl.w͘:9seH)(߼w 2Pa} <2$m3%܍ +6|l ݯEP(&E$YþÇ^sI%|i) +8wqJKi5:0dflr4Tt+d{yԱhaK?nB%=H֋J]L!KUTpvI4 WLSehk%ԔR`/9!ćɪPf$#Y!geKPh +cܥI"H_Ls,><2T }(x @6)GomT-”D)94qXHE΁mðFKi fr:;AVf_|z;4ݜG4VEhֲ̫aB ffU)[2PU䦏Ȁ*αa0/LًZ)jg 7ǫ P6r477v5"‡Izf_}u̞/(XAugMWoimgCM243nR>Dkx?:/+^tGpCӰuV蔓C>~oZuͥDfFu]DspmKB&2D_%L5?D};%^^fbO |![H$ "3ЬgzHĆ8yr.<+Q:c綠|m@A3h" -.鯉`}b)/ "]نo͓V"Cr_MVh"Z +FCܵنfe1=⚨hgP+D}6|ZJQk5usvW*8+UVگ62Ċd>Q; UZ_.Fņo#9?;a8L:ۈjzHkz`Hgyl)(Tǎ%b_6猁EM]%aϞG$(`jE,XǬWB#-%9].6#.uA'tPPrHQ75b`Zw,zB2 ;`6wܻ0%8Zl 5@ 6jnVr>4gj`ERz@&cB,pvOz?{L˳C{$pSl5AԜ;OnYQ}_cI߰O˓Ymsw4egO}4',~(amIEOz{=55뗣6D vK,lY_Q7qY @R iqi״5^=ا D*$cw[N8 + Mif=qvr2͓XN>ƪao `&faa"| ciyhKkۀPx{+ CDžf&Ǝ30%Jai-U|Br4~Y(yW-m,X|@jHn.]"E$"˿{(yc :Cw :9RT3)hemz%m߀ +Nc?Q2W!i/?k?\^x0:WYJliwhu6`ڷS,DY00m g +#V]fgp}kR uZ6񶿿Ac9L Y]g5~O̺ J_^?]\6R}g!U+C;\"^=I%Ar:?]yw&cmg60/qIֈ@ Pp0oED RRe*,])%P| \佗Cjq?K~,K;gpv. /knt| +DGBHZܡ% jꓼJ?Phr}Tr6 j3XI"+ܤxie5XK sI=yR| m"o t%OL7K&! y;|`d-#%`#Ah-]vgwRuq9ɱfD̔JۅOװsS.kƔ|pmIhױcIdOU,@L4|ژ$9uǥ>͋lW3DT[m~`+&޿>(;N:ܠ -G891ϷN\R>#~B!EBEF:JXW#~..ad73۵\|Z;m-a4j%PK H6gR8TKHS$L0 +2<ڃ7COF:ІiWjd.'%q +ӵIGLji{y:wp[Yqh*޿ jPϰZ,~2iT9 + ~,/4f[A'gTȱe}\hWN_Y7*gFUcTDH~OQ>-ϹOPV(K:WdvKh`D{QH كBÇy3e1&6&ͥv6נҴ"=zD^EdiZ5#ڬdM7#2=fz-wi"5\ar%-DSkn@PJcc^EeMuTy"*FZzo'DOmVگW<8!=o +9MwꥦڝG0[ +/uj,bIQQn_!!mt.* {d;^BEJK6TL*u\CTޭղqj V|tC-.OWX3`voA9oL9[?$0{?gl·5 aM_d8"МޫX3XBR¨lrX,(PH)8-ߎ ˘֟vHOʯKbJ}p4/ԛJQk2i&aI kk}2}=O3rwUx/XTYJSmYs)uM1>a{ #AWN,|H)<*A8t\ ".R2ceUp4E?k8,m9*<[2IJ\$A֖ҍei<.S 5߰e>7SF!:f9i&!ɗJP*#o1!g4պo1@pA2ʝWYJT@:vu&$jl i-`Z#Xo$sWc7Wf)87onOГ7v&vA@iTko*`L[P^^v +׼s#SZ%".ε6k6 HY Ri<=O)!|X!z0 $]xv:\eMPr-1)Kp(IkEx0z:/҇C!-#襘H8˓<"hz ڡgxJK[ԊufcxO7ӬBgK Ҳ g,Fgd1r.Fx3[[abqSݠݽc!+pVQg +WC9¸4H[exD:N25'ݠKBUJ-o_͛;4jhx$u:pV;Pâ©eQkC~?ʊ-r0vd}cO5Qy ɦ$gȨ#:DubD,n(NW\kVNQ6y@Ի~5_f[2' =;r[?99 ?@NIb*MU弎e_c`۽)ӊ<bq$c U7$9E) C'tCYp[$fI`oO J"~͊*WKNmK{(JϪCTI_;֔*dluPe*§sgbKl:ZC_(BHjT8K`q:N@;/us,q`5(&Li!7O%`^˶חJJWmҳcm%Cd*m,(SK bu [99?}+7?楙NNX~e"tjgvH3sCF V177woﰠ3b;!U>OYB!]lƣ <`J1LAϚ)UJC)}v*H(]^’Jg]ѺHT >0~GQj .IӇ"%ԃ7;UX4s BEIB8A?n_mTв\\|2uf}asPjPmR>-B>E#V-iE\Zjޔ4i[`$ظcS=eE'+Oc\oSum ,4.2?Sɴ``RDZ9ZzP;C2l|[g.Rj1HƺʓC7v6;*Mƶqusrmژ}q(R|m<01mT%WZ\̀!Ek2, +M~= }ɨ1:Jb/轞`#)6z>Tm%#r~o5@liC(8sqU VJx'.OZ' +Jb69jY8:c0i?cWew)B(GZȯ\T9 _JRTŁ(?fYm%$حi]kpQ2\ZQF_T%E6Eqk +La( J*ļ^(P1G xzDع׼Ѧ;A}-uNҙM_AިTBiU^DOZ_: 1Im_5lQYes3Fr ]ZX=n\ u@TSXeWmV`h} tdzX8hY ق5~љ6eE*MߪmmVB +~(WFZ8 Eˎ஧ u&* G;.Q;Nry\t{B@RYZrs,@v] (+I"%A/)t2h7)"|^XN+}Aޔ WU,hMC*E$Q?֊d`=]+/l 9>,CsإcJ! A峏fh:vǵT:K^| +(<֨C1"׋UOq;wmXI{::+$_Yx*omWCbGqwb崳_)}_iw[_^xW饰5 ʩN٭+ȯ7"lFo +Q_q7*tNwu,lhk+W90FK1I%NE[=E\g=.|elK?i& +]+%>6zmCm!$ 0DH1u#Cjr:JB +" %(5(>2@]Cem<~ԻŠrA!B:ieHT>$aԚ .S@%ﵹ(yw s'):u0vKg/ %ih!a[}  %A;G:$;bNYߡ{+4<[9zY*.Vb eM{X NT,\^FԜYBjT}1# T](3Au5V΢:),Ag_=vN~]= +|F10|hGhu`}=aP $(b)XLL 2l-;cot6[h iS_;d)nI $QŢ;\%>\U-?(`4 #%H~qIP^@TO|sĕ_7'ʞs-O}l}G=8g߬|9D<^@ +nP$T]+艮1;oDF N6lSO Yǚ캪sI7x/Wf|1f'r|9>ubY6X4` Юn@izwc^ƈdQ].y _q*d20swEsbmC OGeu=hXs!5-RW;9;Xod퀜$%w`{axb ,uM,% a]/ )W +aݺ].πPísc хqT1Ūk[wioپ~YzV0|wTO<I:zHCXr?W5Q,&?pi]3v²RU0.Pk2P̕H2cB{qW + H)Hr"QTMv"bB KbԖvoݽ8T^CrFd[53ÝV7'ytAAα3rNTr\ .& $| [c;Iͬu#{aCNj[$= n@Rڀ~(s/E }*?-V+,ZDI*Lww#%zHatZ +<^V"sQLXAϦஙqJ6W#lʉ=bG 蜎1of\t T"9p)f=D3rDիLپ6x|`<bfa@ʋ.nutU]MI׌oD#M%R8Q-R+pZWy!s(VPz}{])Ԡ\JX즭~IheHFQ !eod*.A-Y-Jo~cqRlϜ9HlbBrMN5843҅}K嫩 u~RVqZOafOG5RG5 +.A. ܳyC_it . 숬D*`}#_.{{/B6Hɀ^I*S&4(UBe`e3c"H`g,im>+@O$ ӥ>V"xeQ-iPB;ۢmYBXb<+{$z^_nx?0 +VkP YpFCph5Pm郄JSԆԛp/p:,ߟ'g@ O^4~ؓ(XA>:ؔ(rAĎTk6l]8$- endstream endobj 3576 0 obj <> endobj 3577 0 obj <> endobj 3578 0 obj <> endobj 3579 0 obj <> endobj 3571 0 obj <>stream +HWn}W7֖ 4I^ %q3C:CTwɒ $vWԩS?UU(8+ EWfŗ=[]g8>:ߛ͸zS>^~Z]ي7g`\zaUixaJk]p8?CsXe`?M-&Jg)e 5C;M,_:_.= +*V.}s%wQ~RUw_YaoQh&z{];SPGcnʸn٢u^\)^V6.u85/ZWCG0x?"<࿖WC{۵ ̣ s^7aHMraSM<OхO-+nηM2iCJM=EHJLqA6Ϣ(AOnfl.bH,~f^OSsw<,e- zv22T,J|>Ǻևm>xFHׇ5__L <0':ҡ*:u俢 /e|[^`_ѣd\jҮK^EB.͛@pAߎ?T{SRь7a$ܥХ_~(?mLpбf8H^):$v!G~S)s0rm]Y*X]".hV9Wtl]kf_ +YYQQуB匆cTr_ RؙzQeQ܌oSVv~OaOĮt G+O;tRgxO' ^x-~S +Z|h/%!@[ϸJf<k3J*Vߐr$~˓[6!jfQ,9+Jfwe %ڏ}AnLyri:"sȂ,*>2>+tY8=>BG/̟)N91q!AlK}.G- :OQ)--6gq2i&u-Ml 3Ք vՌRHuTi!7ȕ@d_Bu7,t1.LZ9'j ^PQriJA M \A֛ޖlbC☖1P>si@g<{NkbZ~bG'ځG6F)O[.smybuNA1+3S88Os'-l{.d,GZm Pw4gNҌy))8k!ЙC;dS(-s!g0ӰO0 +M碂.>u*nސ̔Rc,*4~80limwMenΕI T<.08Q0r i|)la"wI׉"ұMiwEIAia( 5vw7*eJ;O?ܵD#GUoqwV v +{-*V pT yާV`n>A(eR/z7 ]&YFƒr9wehP=!=iwIha<;Pq7R'xa&8,* 2A3*(qt+ qAk1_4'd[h` /_Cl*l￷82o&@Gnq#iM`$V ERV3c  Dfai/k`U vqЉz*tTx9x1YBsі$WadI R&ҫߴHA)K2tdϨWخt`,ʤ.(*ک]!H-+-*4]0r t'!DݩdhOچO+D38oVT#MCK^<v˥&F(R+9> +wWKj'z{_w2qP7cs37aa(]8 MT<' áRhs![[ +%4|p:(M}%3ks>ӛo +Kav#٨LltMnrXҜpeݵ< {N(4:wZZY&^П,%'w"]?W2AӶ>47>wR3̳ј- RT)D' \'aB&2VJCso1(LSɿaߓd~H}(|6%BI >8É` +z3a}eQPΗն aI ;PBrЁ@V/Nn>>:%j\nއ/?(B%y 5y* +rB Xv|g%A_GR-RuGyXZQ6N0zX?9/ք -huslB=b(VMvv'-dݙ0{ϕsU3`+ZS A ]>!-^l=7ghupTp + C=Zܘ AVIzL!+Ix38gcP< n#p i5M7pi3~qx$n˦<͠=`%{C~.^ߖd16:A! 3kݖY1(IHP !k\Ԏ +E)Gj CarCˢS{S]}{wLPE(jc!rv`#BpJb_F2ZJ>gqzU9)s|=5STj +.KRΘ;M(0 +&ό*[Grz}7:Xi5PABI\ ;NF~m G"> %z<5ˍRBtFG~+ /{z[>.RJσy +[xk~T.~KY_>V?  endstream endobj 3574 0 obj <>stream +0 M@&m MI?n8H=kz +^p8[Z[@US[ `4'$`l=x\~%OT!lcHgdǂf]{ RJbi,N +N TQmSk,n_B)͟O3F5qCUG.)l1K=L`}D%RI=~qOD0O\ lFveƭg,u}}Έ΃\r 1^tTiLmpNuk(*㿭ڇQ3kuT$61WScK[3VVN0Y2jyarQ+E<3$kW0>;Z8+pmaUq2XCi<7~=CӻWC_,ܤ"7+? 4+ཅ,b5)-[uϞR;ͬۻj@2u=W}~2m[QK^YKT1jZСtSnk!x~/V; >gQ,U $CD&uKɗ ּpYG1dޖ[թS|@: c3Z+C]$@ L9,V0⿖ MOb|=rhd q)Š,Vˈa `wds5oJq.9$'PdAc{D^_|s +e%jҐ2,NTJ*^a7Ai CBs:RU6`գj>t~qa[Mv1#*,wUqL:%}kY1jwh;mx bگ: y(=^t!=U.m̞`BasO;xcM#ٍ{_˴\V>Q/|Vƍ1 SZLI`%&n9)GO.ku~5[k3[lK>jCngRT85dC/ۀԴF_b:4kp63*K +_Z$ye-(zD2aNBR}kh!{~, r ݍ`ke 9aF͕令&K^H輧t6cM>5F-&F9?( 8;`vD* (> &*bDդH"T PuN2>Cs=F7@{p >Hd"bgU>":E"ªUНIJ%V~BʕqM 6+ ^_e? m̸ʦAeiY ϖ"aUE5ss:H]؎Dq1.:$T0_ J +G0=GV*KVph qmiru\d,Fap DUOB iբ;KjyL,O9$#$ۏFz|0;ȄH߰HZͰҎXuIR5۰(o[9_pZsOWC4ȓ9mΒ@gP dGYc}Rmʪ7, K<9G4 +8( eI8||JJj3* ?AݏÚ2*>|dS<{F)5c| iu!]k=ha2=6y? +'V`_.;'vnP\>)'lZ_}.::_~lxa4 ޥ!äF۴ɜy|Le*$ ;w1ZY ~@+Z w8NU$LiJ?]`=v>'+Ć쮰E7:@bc,_j"kJp4s՜"]_NuL>ƌhؖ9{+8'-, OϔQ;L̛8?̼tF ++'nBNAN.oIr[7uuQ yةSY BDXDшx ) ^T^>/a* ,7t?%S*u 6A7cEOFTz7gmsiAѹAǍy;;N8Q 'RYA)'%#F]|rE=ka?J]W36Nخ7',\F]5 7SmٴW|_$Yi +J?'̆ .4v[|[\nl#ˆ!`NGf S6nX[ݤU@0PyOH|TECjGfI&Τ?KpaUvꌯKzJ("l,O%1[Y ߳+#*AP gFq7k{CH)#8(hj Sv7_$gcu/ӄӺplCOouSz4K&Sy[ļ5kbCLW"D>q+,\. PfEM1o(H Uv}h!{ܜN M12c9(|3^eԫ~v@߂/ve Vլԇ (: *E'tp6O8醸j_Y`W__fx^f[XH$z oC̕s5,TNd=ͭ =&}D!]uXWZ!ێ(dD 2k; иYb]os*4p4)60YǒӊlfWX71d &g־aLeL,c|iVAx$Yڴ2Τӵ]nX#A,\H7is|L.[ mhr4bZژ9>Ldq#Dņ0u->Lf"X [MOTbB'fn,]? \~F z/ @c Q)Jq4twcxtX xrB݉2⑫[78:!O1ʨ>4e6 hN>NL."fB.P9Umbg+@0? Vc&\^$tKR ]5b(Npcwq3̝tb Ɍ|>Ex;(S*p}SX Mi'wl@bd7Z]]<Շye4*X:O +pvڼೱܙ7t> u93u3!NFRF,*HDf={d]ZȈ(AzMh|Zm'=g0U1U}uQ+~zZA]aAxqca#\J4)NϡDBL`S@d*UHޛ&BYtfOcPT 3w'uYzQQqK6TkA(Hp?D+6(zȪZ*.Ygq qUu-b!X2OխwF[Jw|F5`Gä>Sr;PJAgO=8ЅIBT>~Y,Mqxz릆y# NT"*K+*1bO4Km 6;=s"ǵk"[D0(jc>,y$Lٝ‹Pmb]AUnTρ- Lpȡ`bYloVj\e'g{^_#ac7D^fm"QQ*^Œwj;Wx_Μ0z6y03к5ϭc18(M=aE6)ڢ#Rn Z)(WE$ix`S'Zc9].k%& +)%P%ȿ_e'9j&R%+B,/C.ݞ\ari\MLOU 9e-*hoqȖv5%N]+pLVn+IAY%=e`y{Xת; -܊::" d;mJ7BM84)rࣱ]#_֟{C3*)] n8a vCt3m^9 1Zk3RݡBA ь{&@H qK9} RDx,rK9fM!P? smhpѴ".;?t 3UHgy䯘(d2d+'mp ō\#NAبˢmtJΝ8ǘ ao:]s;*(F7 Lj>?yHy;&urx*=Oj8< ~1z O Ȫǭ3.W#^9Nd} +h[ +D Uܬ|h%?麙!6&hg!:FA7A9ځ1GK#?a32X{N-Z(%sÉQ7$si}nG/# ?mǐ\y0[J&t*b3I>s+0#sj$41wYSN3Xs u?n&A%:}sBd1`Py'(^xݏ1W慂: +َ ^F QU(?I[ O€av@O XtB LX iggj6n×ZQ"-ĮðQiu>ܧEl4?G"F,L^RM}q}]dp5i5vMsAװƱL]&vJaDB:CZ8j6h[-UscT +$ݬ_ƈhQ6$D~Gu:jIWHZ,(V갖bSĚ6^'="U+R\]\jOzIz`9lO qk!:,v[n,c䇛|4ʳAYrBSw~g!$0ᡡ`y(8ƒ?e1UY{f-nѩ{WD6-L=|Mo{ + o`5S[eHOHDM1Lsu ϊ&WN W/ʥR&(}e屃Xi循CP#𓔭kAMMWR%gF2O/Y#`HR vͻU)k8wDcsQqIS?tf?<ʀ` Zmm2Jn4wEqBf}RDbکq0I%JGodZF3UU9㗐!"D{a=F`b(:p\mp*w*ZW=@`3poNqImIWmwnP X\+Rf;Қyz>;EfA D݋l{LD;d4r9bGbzXroZ!}llUDp'zй~Zc W\0j<",-Jl9qJ]-ŰW8fM'eW5/Y) XI <1V_ӷ$P3]HlX.?Z2FΑ&EWA]#>AVK}mH%h-_~ƾ:ꉧL$ONvXppoZU<UQ(S8ĘOZfF)x pn2[z#wdVRXqaDw0g&qj6k!;{6_ +juȏGAr,Gx9 iNq9$Z'qš᧻h &bo;xEyэDNwq|I!2"EuZ+IoM!&3 ~`")eB=]' +MQS9_jsq+5'mT\c3h(OK}slSM>€?>Dp˺[Z=h{JbPѣ^]ƙx{[?O- +}$77E`<?=zwe`avM06C3AْrofqнD{i|-l-=6`QI{tHۡxn6鼘Vj + e;G7yϔn,l_|1+BPj!XllIh&Zvppvz!y,0rn"D͑+θm.O@4Qm SL2+׊ߋހ@,t21-qJ98T-S( -Ǿޤ;pf̜'Oe! :X("5Q".dxtgh#'%qzw <6-ҽ0)j .#] iҸZJT8ATy>jQ2p`CmEa Kdd:֓FĚ*sQ 90RKt0zy(?8M^JIUW@ +waog=~5IJKAxzVhhDML>/0#z,޾\7&UK4p8~X@ln|..%B>acE_1s{}eeF5j.k.Aቲ&?Weuݏpnf֓㏴zpr+a;/`5yTw@NˡcyPbI@J3LFɽiOR<ꛏȪ}+7x]3!k?Sz枔5w,to` o^:Kŏ1<"4Tf2D0bh&X)F(b#10Q|;oi-ڄ𽫇gR4%?krK +3LmM:…l=EYf8*m)Vh喏>n#nE©CpwsI _{}?6tm|QRKYKcy!7qM3l^__oH|✅`(Jh$FnXX{ +c*-Oˀ1hب#mΔL &Щ÷Ajބ޶ ZYvwޗ(F_@ 1_HwOQ" Mbs93 %`ļNpb91;oq^u0J5X&fDGʚg - +ƌ?$vϭc䠥IAP?(s8v3masgC0kU-ûTqA-Sp').5CV@(YNMuGDL\K;s^ +/.z_3"%y{IssVZuGE{}{#4H;خs/C:9z'])wS0b9ᠮY]O㰗`/%,uKY;di{4E"7,R'i03YZwmFf.V{{Dx;s+#̄,7'"N[Y䛞_pWxX'j"^+P1(Wk#uZv=_Lc*ye(wMNJຶ><G ˃m!vٴѺwt60j*Z<'?*,,f (1,>yecm4P2k9"lA'EE;-8m>i?#؉s*hM;7fig !^3j'7U ݵ]h* <d`\DٹkN9vG8%({Ś|[R)0{r@5YsVb˜́16e-]ҖɇΖ[U9SxY~XBMy&E˧:{iѳo<<K֕}NW[|Ngv(w(ᐡA'ˌ"YOvq@ d6ӑs +JT +XQ?Boכnp4n<՚rp^@^yNT4ccs6gM mR|&Յ,2[E]Ŭt`bN2G\:1Lk-9u\Ѳ<=Edï. ;xAķrAK5 +=s3J4e>M'iyqVx3RX8_855y>A iļ²F_o =@!?x5֩8-xyGYm}D|_;<NFd//#i&_,Qmc=O຅{PUZY)sYr#CkpU{k_YgZR#PP3"Nv8ԖٓXUa+#=6vi~׾N$#tTa[+#+F ͐f91va=z f8)!3?t5+̻؛tpN࿰'-Cp }S3h+9tG2~Fj.|*.79 gۛYRU. w%wINq(G~o5i[:cx(8rM?-t*/<sUOvӵׄ㎤&X"ذm|}YZʿ`5ܔ/w[;/תd+,7$$7d'o5ԋ0$ŽΉ$;;Z8z.hy!sXw; ^ѨPw$6`Ci($t}QEӆn2Qfǰ0Rp#zuJbu*2\LQAs:J+kh$yRȪTʭ\I;By_[b5+X]^g(SFs:H:dGmm6Av@󇧷 G? +bDEn<6QɞbIgá5nZ{)>XZJhLA^aVcZy; `>#}K8r2AfoUǨ|mӗVI3kn*KsBc!s9#NآCȂS ,֧M)VD% ?5ƚh}S+_c499-Zow2̼GۍM [_ Ď^ E * ǟPZ#>O7恨#Z]Hlw- '5 +?&g<)',LZYo(2I| ,4Ԉ}eWImmm 򖋩mdX1\UDMYX`5.)S  Й*8O+[A z"b#8#fM;M1 PĖP f K֊Νޅ]^™k/ͪ@x攀p3]ґfк2RkdU9eZS"{g`p;M/p^ZL&GeCدN(QK -J~Xza~}Kz=xs +eJ!bCc2³KAڤ͘98?1n6"LYՒ!6_No%@ImQT,Ą<2z#7FS#`Z+K&x\}yOf2 ̆Q!IfQBVHJ +p "eb*R,L fχ8ϤX>(GqG쪑 ~Tp7ꅩoAK|k*9515P /IaX'g)ZpV;J J( +XRS*hf޷c?YBPn7h?ikN@IV' + m#yAmjQz2P}kIe 3Vo#yXy&N{( G|}ѬZ t5*wmL)w[;hvo~gUm1c.Tn_=#W?|H&*%D-;Z`8~btFyH%„ZFaQ$̌ ,my}|e7\ioe!ډqV+nxH4;v& +>,E zp q&"fÍkL8s3 v!ORÞmlH5t]W^rbUpTrG}E8>߉ia+LF2 ;қg=B>!?J7ٙ7zQ6]cY7ZrѺɗmٔ`HPAmđ[j֠;m}E? ~,t .}a +*(S_@شI>ی;" 3шEkڲwvҤ/d"~;~J i.b=)5yI} +AlM$QX TEm?}AsQ8&vHbhc!E{qsYhAOIhؖ2עO^pEM9bVm)mnD9ՙ hd@[Zټjɵ~0 ̓qwp:{Uh%q*ܘ?taiqɁ+̝ +PDr)\vWe@X/#Y9(bhukr-hb soY;;Ul#m? + jZiS6w~{Lte.ہByH1\&R[ E=PAM?ӝq%S#6ډ@ 9G'o96ߐ- [zG5MeH#bxR9L;bf :_xa81OQb:`֔7 ؛. lp$IToP? + bHf*?W/?poQ 4dQQH$+C +G׭b/W?RxQ^e%i4!1+)q 8Gp&{NiM(')s Yi ^I,USwGKa|C7*? %DαLMAD PV?uV)6 ӣ58<7RwZWZ DDmfKI1;ms?pC|ț +W%#ws@ߚ"_Jnܱ: I%f~Rlluy"ז;8;V/MD{Cic:\Tj|CFX +!n]J](6qJ-5dVȺKc;Z}ᗺk6"^& Ģ0 +>\KBaL ȮQth"٠"H֮ jӠǰ #*̛SP2DwH쪵|aTfJ0m vRI|DKtT %[ +g؊-!5Xk$s-~=F9h5J}=uv-=&z b).ұ<ǥ,91ds`(#]\{8氅uۂ0I ?ک%./ {'kX)IW9 +!4; (Ԉԛm9@8QTRmzN%n,Qn1v驐 {it1- U{鏶Y}T*ICZ<>O8)df%Mۑ.uԧB9㉰> +ө@( +/@_qAW6vRIo hw|/u=-V:}V8ix́F)JuKK-YXZa(V `MT]RA9A{ ߽_4( hEzGӇ.$AᲸcto"_9='-$|Ι V6ٖ%<=K%94.pNFI$hOi6!bpRJiPB`}䗈lAcQW~B"y'k@LŃ&kž}IIMJH/CʅE\! gr@B +:8耺k 2ɝFy;5O!;d!nr~oOWo)2B\f i@r]kPB.zCUx71ӛ\#(UW=(662nA}Rn赎egpV%^> #וM aSʜ_:-óXn跒LjiS OrwP~03@ f_mqb8L`a X25Y*))Yꏍn=%U$é8qp{"ƅ\gP履`PFs"}P^ѵ\Q=ؓeK"'2[qDE ׶Jt k3XO˲&U$N|B\V>g-&?Le(-Ldh0OZrƠ +S! BԠQ0ojGpi˲cA|&Q҅LD:c#@UWN%R>t5R}Pz}{}  h=l8E)8=1j8>Y" <:`?v]6qKWԅ4/a;qK*܅bH{xscYJQ67hlj \LM@boIz OJV+c:0^&bP'>ۡ,f3p<W1'w䆘N륛aVXׅѾĆV4OzJjBxKj>\#H-Ҥm<շ{$ +-խʢ̏0~鳱gQUCp)FgwJ~ok;پi4sQGYBy$]-wd &\ĄUe'oÔ(4$SWCotnMb^I\h %Tw^)8Xd2swLQWp_ZT^Q r_- +%"y͚@1PuW~?`5\F f ҇s,jVbLK|1+,iv=Uɘe0H5d !X+ʻ Ȃǚ ?Sl#2a^rpC8{p˫Ʈ0pռT:\@?S& +KwE~r|"5BMr#lQ?2@~,Ig~El{MYK,M8^V $0ͥ.o}~+l3OWvbNN26yDm"*Gv5@sU>^q҈H&Nca S4b4sb *Tڞ-YgWxbOak YC|?H<Υt|(@ٴgTȕ!$7~}S\^ +J1~Dʼn]%r^;s!GJ_~_6>vlj^}ӹc}d˴ʓ|!ytjUi-95ȢM:'@V*bc=/ԳJŇTB7%wəarm3BO 8F|XÌ7_WGrH +0>+ Z|=lA8:u֛4BlInw U r? CbFd )&_DxA(<%[9!M*ϋFz5zp- P$ R9`us^H3:^ }vz;?^u{L|1_^[$?$KU4qr_¼CO5`%,QN@_aګhKJ!aM~jgtGO^8)#i%p|{EK"MσBPtU Ti1RbbUp}U4h4_҇ZzX\ى5B` +/ ȾvޫYDT7]]M|n)V9 w2` Cd &v>~`foe;bȸ](7۹6<PuO[y%LJ ,4Qeg3e;.~@t:G6 ppTzI&a$VxAOI-?x%{e z3T&ЫA4r"Fuϙs = ZfUHؾa6mSȼ*!* ZH1-w-]!N.L7 X?0JaN؃k 0<X|Ma4V;{cb/㢌pstdzupƬ2`bK˪ͯoiI10^b KO28WܝG˶CQѮyYd]j2q mAqɲꦦQa]QQjWl ۷T#F]cnGF1<]7H?X_wiɍn2W +# v(e2]z@#5RbF`;в6ZBL"?q-Xc(q+gtKNi#wi`2+ GY{:P_B) ђNХ8PREWޏPTԢ›B,"O_wmvt6}a !IZۄ[$!IUc4ͦ{_tVa#utzvH"3%ʪj఍ }]\Z~,h#! + iƮL)Dqʂ N ?Tlw1]=OE_0ztnRmpo.{QErF5$#?n!wXXGm>'E˭0WUC(|fk-GPU2Vc^mr%YEрW|9VkfE65D>E&.,t mgAj 8 +a 0rIVA|2Fk9%}oMNW?3B6<}-ckt34˽}m2>=bHr`[g"pߤj/ĉ8GOBъPqCwgN:^t(-v+O3[f3Ȃ.jD:(N;1A4( ->ͧhM$'ӷl Y^w H[=(^hXb[tz}3rW q wќm$K+f̂?0-CμA/2(w|(5oe+@S72-9jw8kz1[/W*p"iU&iSpZ&"m1| d?#V*=yK>d)zbT_~YP:ko_-jh*[ +TzPϨ?U4;4D%i)o^{J>Xi yV=,*V^?['|:c/?XJ3z̆7D($rr;>KJ0ZC;tKͅPˆˈ"TDZb-ϤdHлw`+}&&3p>J6p# տ^(Y|ޜ#иښ$Hf_PPYUC !bҝtaX7%ƨY[R/ZcSߡ325XAyFҖ>O,7ެƔstOP_Ir/fA>9.eͣ}VK/|aQ@ɇZhKzDip<89c⵶g/Ps}wW)0Sn!uc)|Xa @8|aVݟPyx[4D yɘv7)]4*s;~\)`yuNٙ[pw)~l еU/jj1&8viH#E$uv<Q6h{)P'>y)bS"' ~@nf9߹ +ekI] ԬCa". M !^J\='1A3,ͬr΍ȴHIQRѻf-\69$wӡ;XQʼBd@gy5 ĤL0\b$xa5wX!%qW:ʯt^[6 U&ȑDSt;_FC5%g'%fV P?Ys pG0 +ce8_<M ebs +Dyj671B?qZp3B;:2˹,d ˋRcy],(рUr` @]56:^h`2+ + ⁐a 1p#X4`*mG{^F.)R# ϋ'w[5*.$gL+o%0(snŮ87X7>9BlPjE<uZ?Q +R0گM`o߆8CD%Ke/GVʣӍ,,l48?aÍKH{=nA*7n1|r Wp;[GG^-]X h5FzL΃dQgm}AR/8@3BȠIکqtuO=Zەb;X+Tp'AFfuWKIkrRxP]3`"`~BWgGZ:1/FC{?bL`meDŽzWٲ@SC^8|:ԅJ3b%McnS7ҀŭSq?,L?$geMj dW5%tc,V!65wmeɕ Q3ِaYqGVhDuv^ +ywمNxQPf.ҁ~wMOX6PP[e[ ۜ[f[_ QiA{W&z6P`Up͈PO0uQ$/܀Çm91%Dq ˙4Ʊ΢e4,v{-ױvl=T +} +_'//g쥓&oWQ0fLIbIa=c#}ۋ]r pJf[ً/F9RD>u_@"f +8(j2LT+FG()Qm̛87J ]8_,h` yVz2'n`I6 I~bc-[QwW5UI: yzϟ+ W,'JnGqZ<?[yy7NHqY0E_RxߟDJԱ;lz_IdE:na3.<$.)B^)2 erdåQnO:~vg.KTS3!KC`Tef9"t:(!l\iS;ΰGxG&'a*QT]B;T5ilVU+Ϫ.[7U a߽7CO[9k:X?CdrOPDv:}1o?a{"Y̾<~heQY`Q>gQ;Q~-#"i;s9)oKqՓ gC~exyE2R[䙲Q-Z1-4s2*2'HҚ)4$T>ޞK״كFW6۔$tA|K +Y56}X ǀߘ˭!ܼ/,iԪ8nf}R/]\G OeJ5iBO~)*yDIrT! NQZW cZ;KV*Oi.T]|k!P6!V]VxpR7NӳLi|4Ru7r).cX Dx 8EM'mſxNBNwh l5YƴyW{:Js_ lXMa?`[K)Js&)K/jЮq:%0 {>@NH\glϜSѳ.5ypCgF*GAv7ux1Mʐ}L7: wde1T'Gf;<[I#!j4(bxdRT9k7BOWk4W`3Q1+pul2 g(dKBޘߐ2 賉s:/z5Lp5 S7^/HBU#X>o-_J$4 ا5V!fwT<)rz74\:#xmmnEu'K}(Fh_,uQkKb&YMjz +s7؉2scAڥ/?5X3Xϣ2ө=\ǧXoHX{i(Sgk%ngL_SuZʟ h*\$POAXK{T3i,wi)Re5Q?޷`y$u8<elgWkj73}1#xQܥW`Caѱ3C1BGBU?%)m[ySd\;ERfZEƦNqLpT-b$Y?899k2v 4Jg"9x$,]ίp,x +rPB?PB"%Q]nuo<hU^kzf ?aFI\^ EO ΢Z4ѻN5(CliN uOw.B}>S CIC~ʢԣI,Vɝ2ClwniԶu:9 (X 'O$;X\~Z#Făn D^3O+zunїm>%_[@g: 1d޵ ,0=t؎Vj>?ɾamGKmqj I'{th?Wԟ*KsM!-67Qx f L o4E/1Zʖ9 +C J )ͼ,ڊDRdυgo{>2[/la!%d, ?sh$5>:%d!Qn<&"x6GS882ӎv櫝0&ta`7+x=2F'h̎zWJ;9̕GnVZO॑0wեS5z̆K6DKpG]rY~M~uz&uNkA{ӹQo +a Di)tzr%GI,{s1gcFEn(_Gm,I Zbr$Fm11>US9ƒ2F V}d:-R/K=|]q[2]:cWcEg@,8|gBWMyKd5%=2|hɈ| +"X(>Uꐋ+wX -<:1ԦD|G}Nl@1܆J׿Z.r4l.̊1HY,{dLNL%9x A{Cv5fySd"\E‡kd + +cdwzFJ{.ǓKLyC[rءԁ€G%߻rBN +s؝Wq+ .EDьH pAbcߥq0] A27=G} Z麎,s1=x(ЭjwmOU-Dŕywrb.t!s&APb!Rcg(K^N^B{h#J\ MUXKXȖC qnc<+KWWT yIJ x~Dq6x$|_ÓSKHgl'tP"8pvv[y6K,VJ`:L݅& +N$Kú\wf<7W})\wu]2%;/':- DRcY XkKQ䏔֯(}ï<{Z ~ 52t--Lhv:]}t:[GԱ,W :ށ{=*hC;H(bmz֑P?Y)Bcv:QN?%QYŞGJW \\`jݞw""ɎNur<{Cg=m+omu QI^2gY=}⽠F`Z~Bf-[ǃ;߄]E=? TAoS!h0Y.Kqj"4f+3Q;隧Bn%\Gi yTU^,z2rzPնtsgkG]f²Ѵ_?-< %m%rN3#eI#FC:aD!' $&k_wv$ 1ee"P8GFgx?v +* _I R֍YV- 1m4'ͩqK&=^\_шry?}_Q:&vPIb`Z9;1 $H%;B2f'\ơ<ƮppFAmv<^*k!>љ)zwP-{D@ !ĎzGdm_a:Rn*{S={,2Ew5/㛜naÁW_ "{C5oUDRwYճKRFτ} WoS|]3?oAp_PQODGFeJo/~Ez +BF+2JoY#=' ;~q]-gDvbsl#0,GadE}F̵Zrw=zwp>>^`l)6X/}hxk[P϶|o +n$(,G#%m6Fu@5UNϔ H('J)-et &Soc]4 +w{䵗\1XGH><(*(lM.eR8MWcь*_Y%ցj)x/V^н[W+O)]JDs%nAJ/H`:s?FZZpӕu8 l׆蹚u4WmM[[XU@cu?(Vu'y0sՅstx Knc[ YW$Fi`ġ{V&{2IlDk-E6t}?7r.[׬6 b9!7P!xfSUUc$IC[dƙuc:\ endstream endobj 3572 0 obj <> endobj 3573 0 obj <> endobj 3565 0 obj <>stream +HWn}W!c~7 Rqv%1xDILFCVX쿧nh ?!VWwU:uGT2=zߏ>̏Q*/˂$0{<L[u]W< +\b]pLJL͍T$pG0Ԩ$5\]wP-IZ^6jBWR#R+Mz R,Ǩ?3 H{W{ ` oW4}Gkޜ4+8NOg@n%5F99;{'tBH)(>uM0D #\B  [W.yd:R#C;gfۺ +<cQMю@pjw1;z7 +\T +].K,RUU`y pR*g}^-_ɐ%S˛bv{I_Z.zB =8&yH3𨵮֗zA2=,(hcݵͲܶUZ&岄b$m޷#ppTPs9ky?z{`&%|sb[~NjI `^6=xi^neJjq`~XXQd4ʩ@.EAd_дomW*)κt-VrakISoz}o0GW! =7 se~W1EKוrYJ̈o0(ߠ#mK74:DUJXZko|V8:J ú綨S0᮶mR^\s%B*֗=7`"6MzI.ZuL;P}:"̳%g|T<ϗ1!]25Sfب!?Dfaz P] +@ϗ.ҿQWmsUJ,ȽC2@(1O=WBnigԈԩ^&.Ŵd > ۯժyτq9p&Qi(ɰ;sND2{`9*w!8*'PhaNmMVF0&ac._>% +\w ZZm֛Pv6“ |UwyC2< MFyr3F"4k!$2MlMr[_Gl-S7/WtSa,Vf{}{{JG[ }AǍA十4fsHe@Fw-jmU=S^d LH:H"taEMWOuwғ~nBh(T`r/0 ɽ۷'Ǝ Hzd P:(둹JsoHvO]p1EG%%(*jb(jf)988Dgs+<~JV=KϚɓd=%(O`~;r MĚ^z] VE"ö9h#^4&G|KK,Kĉ m߉ j\xrd#3bR!Ar-$~_"FO|=f09|q IK߁IХ= g $ .FXIC<+S25e"+SZĉ/]{0R[k"9p#SE +Skt 7i"&b/HڒjDc@2V^ =xVRMl7M-S{9bAj)hrZis@:L<*6 ذZ< Huʈ@@'w\= 0lw0L}'xJz(z(j=,b49vgW/oj:uqe +B.*\vaGcd/ ebU0g}LfX?yG6n^"am p!}6>q4`5+0J5$b&3Kr>O*DŽ _X&d6L9C" |? +MSO#Ah^"5zIjEٵ +>y21iptÐ܈K2|S&Dea u|F-{a:|5S)%ɏ% wgBa+ }SOA2G#g3S-ase1iY[~9<"A.t^Ch_I,2?n\-ͳ#Td[=A.(&E5C[WmP&#&l +qu:|g# 4y?>tbgϥPfPeet=vhWqwTt=Sj]_',|.Mf?DĆ&(X :8q,rLܶbԖ*M|kV\jAPCO(CS=`7I=J%3CTxIe䵦165CqiNf1LM'V&Xx"? ͡ $#~303ƨZL}SP ;YGfDꤙc4q@u1~.ԿUf>`T79g0f^9pSH62*B9@ endstream endobj 3570 0 obj <>stream +0 H@&M HX׬"%ʰSK" ;0pS@Ϸx'u+[넆(M6ř@RxaޕtFV&rE2q]5rBZ>7 痔UO> :/_NE!2#--M.Lz=e{<0W!(Ʀlfuص2?7 + muK+-1D;D?>Gr&&IWօ;ʿZr^q+*ˀtKۂV鄻O_۰wx|^Y*”<,8P{iDfmW'QAO3첍80}Jt' +MRXGK;Kaȧh6te%=e՜;yvDQ͟a'v3,딖*JYUQ?ưBtjc/&HsEk#<=bJ˵M wOi& }pgpZQ@_HܶZ)@ogЁ5 )  nBA\wʹUMҧvl#qByv䴃SO傶kV =1oWƉ$ߎ,Im]8-X9t 8e)_)2A.lf:m~j>zdr߱ϠTVW2Qr Hm H91:u}ZOaXlM6"Z7P`(.o߫Cf4OʧNZr`rC3ݠfTݘlkJy,Nm CƬoY]xj"#p+}BA+ ʣ̺p&E4@֦-,ݙPSz󮅾&~46:lGbFHSyi•} {GaiWH}1rάmû?؂z{LwژaҭMBj/@ސѻvmr_)h=α[;@ciY~#LqD S5yXdfkO׌*"Tmo,F)8I9 T(vQRAm!nAZFJňy* mRsM,CeC[9gwrCΗq7U ++N;}49IʊǢ"Y @?v\S" UظK;0a<Wf=e +n`'.jqr&Jy܁=/&tU1M+JNaQ"nGntQ#{OpQ֞:q4.#39h*qGr. =O0X|i4.D8kȣvJJg+U#@μ9'×FP_z~@']?qcM61ۚmHPq'Nb_4\CtBCORjha{o 9)C'ZɦflD/y'VY#pGK=w +T*O%%϶7{$1ܦJߣ l^}#.thّJOT?oui VX8Hf/f'G"r4MʇLюtgl_(٧U- +>7,ĬN38uղa7pr*mIIYc`+2 Җ!sMˡ2샻שrkQ%ph?jb9DAY֝}J$@''(zg+` +[d'&@4Il|/!:Z7aϋ>o4WMӝ͟ jS: 5cX[f`Y4O^FC㗈*k.2$7\>䒏.WDqq=*&pذ +uIȳ%N 63UJ[8[y)o_ Ȍ$:Uqܙ^%%ԴLCf1( t|ss_=Jvq4ߑOaEQ~ø/bS(e[wً$R,m*3@d)ك9́iڿľ""_dʚ˝DUYQcN/S`QUktabrN̐tGa9g+RSބFn!8כtME`w?4kB3Wp`t$5 [)G$@7Z]uQ`y#׵ Na tU"s18H ?)FtWU+L577P vDښl9r}FW1Qߙ݀R271WQk ~O3A |:#5*so,]!">-\Ш.3TD;M"= T& +0m챃,໙<*j ↙%;c%$Yvogfq8 IRRC> ,> V7?7 ǭZ)âmN9&Op@0x杊r8hGQ\5OSd:J3I=;P: ֎f><@1;zML7降>z}11)11xMV zSg]$Ug Td2,/t?H-xfl(9hyzF"x K!I|@-?v |W%F#/Ge=E4פ<}8bs2H>O6Ki{wXJ +e2ijmq] }/u}̗RArآp nPF]hh< = l/20嗫/i|wvykbXD3~ o6iE+.7Ci=~qrv^Xrr? Q6٧41E@^8ZV uk;0Ns,P2]R UG)d,dy>4ݾX5"CD߯#H(7;Sweԃ/roIk,5N: )n~<ʃ?j!N&M,Cgat.m1 !R 0&oB.حx^4S׻,gKAm~|\103 :ΘH[#8r&lEythQզ,A|lͻd:5Fyd]^N1՗"j3XWmE # Dļl]п^ +n,H2+8I ]SmPa9fQ-#.hӏjZ ͠x+Cfmka8 x& +D“GM a_R4!9^]CRL='w rӳ +pp xDicn̑gcX_2[_\n['Ֆ+T-u!Y@W̕sLV&{`\4#(:87Eۢk 2Ja ++{_5:ǚ6v]^@E/5.6@8?tD*h4+֌ŧzAguᣬ +7&q\Q_ m +Cj`ByU2I61W'ڭdmSCS7Tu\lªl8>ľ/Ά') +\P [R|@1> Rc''dά /2( Zvra@8HU?nADMF^8 u݂耽V&ɘB|MT霥T>nCTPrj+RdaeMj,:]gX01-~qN;)H{> YaU0DzDYmYm#;dlATd҃p 2I@ZZ *~H ]".+Vw[C'ǦE|ڧpf/`mk5T=c=9ξ?8G&)ȹTgEl_b^ $HVnW6:Oˁ"P^`{蕕3eckNC;GsuoUmzwp-kZ`8w@MwQTvNmRZA'~l 139M7hlDn-9 v?ſ>A{p]UЕK1ty '{hN~~7X E*ǁyjG]y`1-7YKq鳬b8 +'Z&~k{^\^C%Ck3%ax(, +z1 8e|td&b* ."lfY :* :bPų7 9EC3V,o ̹%56y k|L +MߤVȽa4o7ӎUt0"ڎ +o*"8%t)xفj6̊1~#+0K ʮߜ_sN=f3.-5B,E&Θsź;m bBVg'oh񪲩招qEz8S?7q( 5+SҨU +W"L[ѣd`)|,\Ƌ)v /~I a ʳc` gyt\<;F;Sɝ0SjڡO3L45jTyr^tdxOZ.A(k.ی"i$ˬOr;_- +~37IDT0鋆a є:A;`w I8R m\z\bU{+SW{S;iM'f[4+NvXld(wMsVKz뛰]j@@N]HdfnasΩ +Fy/( }'i't`6 ,&%ld¤$:0>WuENj:hj;o{؄@:'!Z[ ^b B{=2RO_89;V[DL*n!TK8m<ҕ_mIV1KcFz#lMzЗ\`gj?nOHdDѭؐLaGaW(jԥZ[!G#TUJޟMK )̢GOsO{oTԂxh,FqDI8 C zbwsܻʨRU8Kl1_\V?rAT2@U (`(톜=G~|" sVc|:y!}>(adIk{ET>  '&q܈6?%C(?.$UWd^zr[8t5DD߮ÁM>{Ŝ*>y-POIE7)= q- FZ_KKꈗEx*ͺy~m]I\Y"ВAzΊtH ł[|d jH 8_و$\:s<t@y2* r"D)3t +"91vUyLN]_eXgɐ#neBE-YU~Gu:** ='(N͞q +IM,[?!-҇8Ug"Ҩ֏%m4˕j{<췬-VRuЦ6os~2f;wS2kUޣtr~xsw(g6[z<ܕR"6նh2qSO}Pf?ʕ ;/1xcӑ |!RcF/.C @8oׁ= +TD#BcyAfYA9cqYb)K^Фr9"}[GV`#(+/Bch~.y4?|iFutsIWۢUqM(o7B)iX3f䆞>-UP>ځݬ<*P-.Pp* +JP\H 72)JTG@cIukuem_No[ 홨(Vϫ/8 +cE6A( + gmzBޏ߾Үό(@9UөkAwmhow{_I[I+-OG̳76uX+ x*0fU!"`?~ybaڝ+{<79? IjU%P20u,>=m2~c& LgOCm.o0%BUYoG%>T8 d;*Rb3"XƑnCpTD9DxB;>vlb$bx#ƥ . +Y9<_aoUݾ՞_ORmDnDʞj{O:TϤbu3t}6|YdҤ1B{*BZ#Uɡ8u&GB4| FP<*>B w7`/ ݧv'AJC3krşCm\yU";ȳNrHYJG +\';yZUy|JBM`۸qȝ6ln*oD tT,РnVe/`J'@t +1xϚx((^&nnu4;廈.k4V|ZgmBѦ oWKg Q:!D6"*ʣGOpz>g^$kǗEMg:@6ybV +>Nc`?(89XV:-Z+q&8n_{Xڑ,xjxd֗xe(M̀^45]JC}i竘[ϋB6keBJ43H64A~/H7AEJG4(g3 2wբP](LR xXH֑^a& xv9ln7CyVL&bГsi#A тzr 6bE'h%Q0 I8\{-$UQԖ +{;O|J#KGK?<\LdtP +znt'z0ԑx}<9CS_M8^5Oe$zdJRqnO@(^32AЮ׾m8c(m@!󔬺<@!tpg*^wH/\ZfkcoPԸQIv@I8a;c돋e+#Jn\9x=p럈VpT]MteVG*nrW"yY_=,(( ^L`w@IRPa?1jW΢+Euqc%翻?mc +В!<2XS? 5>,k݃bK+9LPuh p8LU [oƢ3oZ-@`/ +F +c,F8i+puBl"TKIڤFrb~{Px 2SBFqL=ɆFͺ] +(󈹂W `q ] JyrO?#y.ȉ:CS3@\Ċ~Mᛴexi+ U@I`(Tu=W17:gXrN.Gl3ا; 4ţ^<lZk>բuw;^>q4~Q$%t'syYC] |WYbJe5AFO3A+;zK2F!yM©I/'*:2L5tm(Uk7PȑgX˸090'#pv.$OPx&`bm_ꛞ +1G1q 'Up95Q.Ê׀ B<Gyn`[ 2: ˁg0SuqWpHMfCg^yj!QpR]0솼FO1+U!ԋD-MQr9${[K%.8Ց`wD}8rw3pv<U}ov`31kUK38`u^ Jr/}U5$Y`_OW?Z>]"l*wV0Ul}DZ16M):6ס +[>'E9(ư 2_~)cLY)ȴ+}K<)nhԵ6пKlxLv̇Ɩ HV6~q +3E(XNSJh_N|Q>tHr*H  =dUȎS]b8z95ʿg/wXXxiHʊƧ-OU~ +~ĂDel|%3vy&jفMCAdN ; Q+J#w#eS<+;e83&z}[rnH\3T dأ2Uy1(:<P5^r;p^3UNALGI-u:@YysԟAn ųOd_,ch.h|"MCXX6$}]5UIYF/B2Fg?CaQIă7IE?(u B|OcR#ZAů^OtX]Kϵ>c{hK KgL>،c⼚ xݽhWWZ*͐ Jy$Y +6&~`NVbCٙf飚} n4KO2:m`7=+nQC\g&?"ZM" E NJrU#l. 1pi)][p6#[Fl8If6-)(_+5~v dէ:^80o9_+@mO'؞[ͫ"Tć4 M 3qA-1-oAB}u5@9Q +5EukFm4g,}mtMo_bK$_w'֢_Lyјx-$`;Q_ WĻ}s4jv>>i Ait>FQ_|/:0!`)su/;2h"W$l>Xġ.C ,N +Q*h#dq۞S򧉓gǘfNx~ZLH]lKoëV +1EEP:(w~`tܦD9F@W_+(&uZD 4|nGU' cP,{c/L!C4|eI{z ޱrO0f+_2-r>XyyFEl" '] D.ߒ)Mbo&2iBRazs<~f,QdV- JS Tc޿a}N9<6ŘgNcC6[d;3Q=rS[6&d9RH/+eH-k,]Q謱a +|-ZC3K&T +jL%;%58264󇬻!K.mL=`|%FU /s^|L[C827 ӱi,!Tlo\#JWv.RqR41OeL+Υ-rփuh  sI-qJPU+!%R:4 +;3oO~gdHb +Z8[8D{2҃/<4OBVgy)%~e39qYO!}#Tl?Lxg9VUun] 4y[ŽOd9:t ftS@X^cOCY +VΚ^9Ă}rsu>`꘍FrK~<ߌvL*63\U2Mx8iHBl4k9.HsIcK "*G4 c?͏'T mlxphՀ7Ng]]~-^qrG5yϚpLKRӴ( P>zvU$ jʋ}1ASP{2[ ;$WCg'¢>"{`&(+Z +ڌo.9;Q \|SS >A6{2KBX&@!d~|h%D44Ԝd|L +'>10c3JS#)K>O8–tF0of3\5d v5(%vf} h~/]FxqZctA`wK5yp@C+yD-ڑCt,s_ <]+8W7.wODftl3٦tkyh>^ ;B'W`WHr>ywb0.,<\UF"o:S>Jq4ߵ]bk\D=<ޭ0yP27gT7zCF +S⸾{ +E'3 +)+;ʡZw`.V _yC ЙM6y5)>ʘ<=-GXc. #)aC` +;,so " df*ĜhvVi-n8Þ7t/mm(L [.2 rD(^6_黜-WHVY_N0SyҢJe3 +E +<|gOnAl]`8 F"']ML%Fa;kOROgaP5A!tbuGT +'8sf (61!@gΖkT&nAeWBhMN`)b^=8c60 +8<\ŠkftC[& /m:F;W]/~k#r ANŘZ/L;ŅDa3Lx!G4ac\7o+Q/]K㣞yBs*L;=,!ͣrPn1,T8\PM L%kC2a$0Gèvǂd1:]x$"f%sl*_#Hl:m~PD=8o @5ß*H$! 60Yx@(ʅ^0,SkȢ5;ԩʝ1w! <ۖ,H(a3-wIqg"K481Wr!l]9&G,{".B+J)*LHFEnv@hx%ؕrs5yD<"2JfZX|}R7ʌiX/VNMQv +$܏;{}g +L$ݦY';{̮y@uYMC]-ݪ^MirT1NУrCZ{kM p?9]57&U9,{GZA#ؑ% e_#ųRjU{ +{n+_QB?K\x1ed' K/H6;Jܱ>1 ꮄ>LonR& zM#-1ol+"8Rg$੹勭V>*KcZq,yu^A-c@0+K Jk6 `grvᵔye krcA z;?)4s;,wu&B|>{eRQ+5ŝ臭zI}y{c=B{O*GuaC<;Ă`hhL'9M-#=}hf0>PYrT87h[Éfq뢮R]J6O\gLJ$Zix :| p.gZ\-@(ˁQ^ʝ^- f?ݾ\l#5LjQ.I|>A2;H(&BH(khrp!ݘ'1PK&.h%b뿄gEyv'ZIxЛ"3r.? +:;B;~)<0ֿ^6eоH +wR{c̶J[XhY8@R䜍 Uf&Q.< +J%mph_+T1tjW}5SJn蚰YpioNwW9N,+@-@{ xFH<DsY*7 |^eg`6OadM*QT~Zv͙aSGe +SF m- !eZb> +I'xa6 u`@qGܻ[_!W$gi5z06Dia3ǃc|Db`tz ~r;. !{=?R-=,sg|l0 Uo/% XU2޼h`Z蟊wGZ[};6i?rknb@ޝ%*эTs DPdI| >4plHlf=,a꘼4^:6}:p$˲.ؗsFܵ){⭈9׶m|`qniA G6@QE:Vi{jU2 iCB|*&j k@Dm> W>Y +xby'Bc0|tg +Kb<߽fN(~Y88hS zf=s[NH +T{zd.藘]-25{M< + +-+\H DyKoKdGH1Y_y A#Ha`-`!4rA_o2[HP_ΐ uO?1ҁn+II ?8dn"](u~'tp=|O('[{&Ud6N4TZg@3V6NhjW{OWNs^ +(3BqݝZøȶX ETb)IŢK[l@53[LA=ٍʹX$n;Z.Tdv`yZPcH$)ɂ@Rc!溬7̠@{[vK +Zpߝ]'Ю!|g>x&#eCp-KBqwg +hI+|_?]Rg-K$o}f"w b]^)Ԏ4I-U &0n8y ͉iY|sj% y c[nr Px/ ⦢-3Ή&*aY]W + }[@a)hJS'Ѡlgq5Djxl9w7s79{vΆw(1ZW?aȷmA<1讶I{`B)osnp8(Sh2ڷweJ(sʉAqkn,|JHrx&G$.RA)_6K>3Р" '(ISb]LS"!  U.ӬG!N߷-Q90!n5@ݏS|vAZbDF/)`&>A.o I,yz(~䭎޺w i"t[]u><ᘥr$g .l\=v;N?1Y%歚(4+z&M]'CJzԐ#T Q2V{gPI)q>@mx{7:VP􏹮NRy#6̗F7#vD= XP7 9tL5:w$9C+F]r@Qm&]x't>CIءjF?CiV>u|@G{K(0bQS&26c=boTi%Z瑠Tf`hGSWF$OHf&b{AbbS]n/EvmQɖrqUzF_7ތ@uxI=_dL'S3+0H+L9N ^6?TM`*8/(Ɛ+ȅhw.'dX`RڃNl(% %样JC渾*ӫN!㜢DF_zxKb'*D-(#)(T %xT 5e +Hz*n$_sGlpFojNAW-ᖶ8cnx{j@F[9mce"P[~1pn00AƟG(DLFLa0mY ҆%u1/a&Hq*&ê5ʓ;#x&(x +U9or#XI= ȯ֍i;Frw(T[UR/w24 UJW/F&[!ɍPgf<ʑA?)U,ViL6E:4൸^;oc0_^yRJ'zK$zțo.ͯ<@ʀfm _DKbdZdV r6 +2n˦S^#qnF.  +SYrd\^;rPl])!$o!}m F. .ꇭaȑ2 4$}͂^EEŻK80Xnnj1b8bO{:Q;zf{^2BBBHFY5Y?@gyǖĝj5x8`ſ1-W endstream endobj 3566 0 obj <> endobj 3567 0 obj <> endobj 3568 0 obj <> endobj 3569 0 obj <> endobj 3558 0 obj <>stream +HWkOίLJk(HAn> ]͚1dz{!D8u`Y(+-__='Ŭ=t~jy_ߞtvV) S/ +^̻”޶xh!.)?ex3ѻ n޿Y:K؈%]خڦt pwDə c~sY^oKD1gҒ tSQ 3ߑJ,> R z ~3bEWʸ/ Ű1%`DAP}Jmm`{W2]nV /R ~3dD/}}ת}qQxpHKIV9Pu}bt|G! +P®}~s-. +_;}]B[zVoz3N-Iv-4A0LrkښJՇD[ӑuHϬ/҄X`iljn)ad{zl*AIvcphc=@Yl]BzYf_f܄ak|i U ^NAhaP0ǥu>^|4.k3ex(2lf^/T zxfqKZ^<@n\TͮZE$GUJʆLk97@x6,(` +=0x_ +{:>4"Ԓf{H}t7ԸS +%3x&Ԃ0*)LJdN j*tж0~S4pGpn^}qYw/ٗ >|\OfjjV|TRjS0\ wlۺs_P ?ussB%&&+J E}"%jZjZʨ[Gr1,+]ƄB0N(p[MV#pGCi ٰz@A-IŧPv?СXB;waAǯ#v(>(+9~s沗a$NRct<8dq209890}>I3;mt/3S~^-Ŏz?'o-\Rb;]fB")Ł~$"ɘZ/. ,=5PL&Bz%)Jg܎X+79NM<Q7zj/Q==f Wa |tOIu;^Iʱfj]/1Cn;_'Ch ?ٮX'>IVwu, Hƛ X#uڅh]@ϥ# rMHv癿U4VàWhhcx]GɎ2̹*3Z~N)kJ<;4!iZ̿k@*:juaP-39p9=;PĐpjBp;[wyGhиzʶ]Yn!nmd`5&s kK\I@IȰRbL2Z5+Ef^(mQ SMjqjR`̞7xo%V2/gN[!RkILJ:}pPPe\-߀M*mI%4"sW2 n8HgcK!nnlNPiۍ=qACa<2XfjjVڐ6XfCB]Nqqus3E1:T=|O*R2k1YHW anm^],1&@U#Ʃ! endstream endobj 3564 0 obj <>stream +0 M@&E{ M>P+:ٺ\LL%I,sU33%Asc8ʡt Q g]R___^3 g#RŗN}6OIj15{zmscثB\@+$oBt/ Y8G+/qrA#vcB$#wYi=d\J A piif VLJLLpᜑ\&e?cfy,$IF39B>@~Y ? ᒠGM縕1iͷ5~/IzrDa 悴 Hɤ}Ǚ*Ya=dC_10ig>dș96_L2 .2';^o3y8!~ oNEu]smm#i3.^7'8k'0fZB Vc?tyI[8"HJġB2LvXRt~BY#jUH$YZ*18p+NH.BLUVM~%oꞢEg0 **ꘆ ȝKdtbO=~_U/o0A!ptaK,vz͌PUc+HwS.K/< cG@{ES'0hW\|ު}U0{q/(qL83upg?(wk74CxwKU&J#;iIg`j.FH-R-g?Snҭ,݉MY|ŐPh;R0w<x|zjQh$VZ^T _5W!R +shKv%s%t6(NB NA4?A/(+Wv0CKe[*xG A<)u>- i+x@5|$d{ +ێ:;Uy[tx>8crAJxޅ +KEΆImNZ9㨪/Yvc&̈́MR(Xw4ׁv9aJD(c\Ő6 +-eDGkbHm)R?{Ԉ Bƒ]8s#4%yQR +ڢlo dPۑjsR9`qD<, j' W@ވߩD?du^ n7ŷ4+c߰ ;iRf2z-*iիݧ.k(pA!Ff$?3[(H:NBײcS7sg`r$`6Ͷp9EV1Nfx +d[W>]6hk1Y|بoY C ͲgoղJl&y$#[* ӆBw3eEdTp3?[lIyHwG)Vg˸\^T G"#uprWUi+rQZphfw?)֥.gr;]Ib %>E=Hֺ8bc506f߅Lȳm>:vB T8~o/@=VĄ'(YX:Z! o F$J"w474?U:ՕS=\:gA JCWHI$qo0A"Wx%X48L@)tn!DB1tO/p8UvH\Գ`k]>u6t /tU]bң5}v';06a$G쬝}Nfkdn.$R,따^#ہ~ؓf9^2@ \/}S3~KBA7"Цc! uu<v #V=c? E&I58q%lwĂ2.$RRO ~RXoG^`sSF{*Υ7\'bCاeemfp4HCqîD.Q58y{=xW<_=n?(~M=Ϝ8do! I~0'i`p7yovFo`zO!"Jmr3N-ɢprX (n{lDJ'C+ rb(GU%M L=vkޟ͞P`݋ ԑ̠0ܗ~-YHA| -3g|,bh>қs߳jvZ/ v'&zvF3.XrldNf[{)Ru(sHEA] |+>L5~9ȑPM{b=5ydтɽ1ϼ SHC 8POIɲEUm:jrw JŌ掟Ueuxt|"-E0fA&pnOM @ Q@+S }av $Ux̱_.̯_s(tUm}n룶{D-+0 +2 ~A0暙guM"%aY0 B\VUigwB2 WQ{YQCKk" 19Xzs#&aL6=BFXP>BM˔̕=Y8!ΜBl?C‰>+ϐ&s<9m~]^Aª1\IrT4x0vv;a7ix@{Xaea@ -2Klv^]/%: xEL=&k|o  X ͌jX +P_),kE܃\IWVz#~127wղ]ʹu͍)і]Y{zDBvktn(ξn0y(n5r"2&4#W5 7oܽEUjcPkնT?&@?x6?z#e3n47S>hﱋ#rrtE@-k=KΞ.6dsIT,d%!4ԓl>DW<}(膕ާ<ֵ +J#c'#(4s~W 5 `-=sh . sRp' H EgАyO^F~~a4AM QS5R%kLOHyGg45xlK'-HAKs"nRaȓ&ܩ@h㞎H8<}`ʹŪg|\XӕCsҟŕ}˿M8\mF䡙:f:[yg :uWЬEdGL\hܲw:X" MQmh\ޒ^[g>ܱ]a(l4 &Jh 0Z@HkYRs˷V; ඡ lw +"ѻ/yǶb xvxLZY"!4sP.ԬjN]N;'d-"ӵWҺ+ wv^ٝEF\{ )Ք^0X2AQ`"J"Wp +'Qb +A=.k:b) ی:gC8]~WQR D A +{`b.ɒWxC;U.ۧëd< +B&df悤q,GTmt]ŸGxvj)<#ѰBb &5$6`T> +rDypB u]з@N-lYHoClO::s|u:-P f^e3LmU +Mƴ K}[*\wo⃴gsYY"+1K^}1߯6I|Rl(L/7tTtsBV$ Ok,|~{Lv*ZN^b^qoXoTŁ6SKH#o 7=7AC_y&wSC|Ryή0ǘ*OV^ʩ(S&'ggj #𸿢v{0 :LF-uoÚ!յ-KN⋨'F`j)E LgäRʴLpsUĶU&slԹ;94Cyc d=wA߻>r?1!CCK;1_uuW["0oOV)`W2zY~aJt[Wp)wg՟2ᒵ23TGaL{XU7*~%/g6TbU\]tHaVYa$.<fokM"pnʂgæ!@Lp\"o\m3,zS\Wc*H?Uj/ER`," 8Ջf|Ų􂤜ƕtY ȭ`<[=Wk]'$GLab]LQ"l%5Wy (bԶؑ|m:,GE[ B_W7D"lΑj" +h"{M㺔rJV#}|8r+Px7ly_EBlD>Xxb<Λ&N-/S6R<=x9=]$r"98xmu̥cq|(0T~ƲH܀/Ȭb KEv]J0QuѱĉXg+VdT,3qYI/C֗q%Rk? =Z̗FV;Tm J0恶s{597Mm| qtG[%-{jqӴ<?-V RrC& wT #xop%MlC1!iT4!6DtOlcU/s BAg,), X_E"q4PN6!#YmPZ1ŖKT5Tn:G+b) xܳdu 5\ͨ1F?wjqߨCJ-p|`2θrMHaM{W Rm8 P.q%%yЮ9_ xp]*_iA=.J{RhJf;L,W(X[ȶGIqB;a]` a1I:hf_ZAd`ga~a}y +~%)NX/A1w&i@Tt]S}`/_ i]-6ge^^wI}E^\Q=oe@cI*Q}ܡY +B]Xö8Lװ?)ED/;f U1?C}p +ހGX , `%78L6 @c;@cazvF4iܙW!~?sx@S>fp>c0%խo`Xn`MJE48epҪQAH];eF6NFiA8ͦ`:LuplTo.BlIMN 8# iU\_n^mĹwW{;k7/%3Eo*i*@F 1^Z `J-f;[a3 WO_%KʚDMmҊʂh0UFCtooz=ɱ;DYݩD̾{i Yt0 .a)5}G&ST]G VoWɹ-UGB"TpdAˣ[OAR֤OG|pH pCף\h1D|>6DwBw`K7z F2 }B0Q%$[mXAB{ @p"y>ԛU2n g7-Bo)7^^Tr'"HՒ! D K@_0gO uP9˫}B0E3>W ,T¬vdԅoDL)8H|>m\'zGdY(&fURx|`WGΩQe[7 ~X14C90xqh֊o:xu"uFAA%$ୗ_+?1ߦn~x B\v(75w"-PV D'w^Bj ppu@!FI(Fd|:QGLT h_hZGvQCB`gVukЫynO/'ue8R Ի۩w!zI"e;,JpͰ<:av3*lD&A}!㐶 m ad_M5$߃MɉaBӝU-2))H#Q l=m wfArQL \b8.~_MT`h +Ga(^$#cIg+~[6>UW)/ĽY6!db9d``E,^i H˜UO繡kFbcD78S)Y?/P\ip*LĭԬ +f IxwW`@"o ß 2jYB֟ahB8WQ2:tn}ӃX% 璚_c/C^o(vTWPIC|y]6kXp +u_D+$',G SYo`u C +wҵi{蚿Շ]lQYCⳛxnP`!8%t?N԰Mq5ot1:)ȰzZWWnE~s *zҩotd/o +8TW2&LSJqSiW3D8!~çk`oKB1kֺɉEʮ@'M{gkZD1603u>s ^B:8ɇ ^lRqoEp +: &YqQm7,t#@TI}K=]|Nu6;'dz8-_BVosՊ*9fngFYn>G؜\v Pk`@%ȂުN˩!T1NQw81Jy'M|ޭ eݑM Ҏ|7<Y^.6bԮð el3_]Gi 2+M n3Pl1ӑXV)]˾|S)eP(,F\KIꂈPKζ>T$HPD}Tl&΀8+"G-ѵ އCC(\Cڊjgtt5L6Iz(c5hLZY)2#l6RV~S׉ϣc$+e<ZSG)թ)TP[@:{Z_'o;lȋ4ƳGE`qc)@;+h~q?$ sq0eѩ1`eЧ@"@.1:q3üh̀t98M//~id*O<Ձ*(~9Y p6TG68yG/ RfseԮl{HZjPAJҋ:tU?N1-¶O[o*4~`yoA4,no'}Ѧ|\1U!-Z}o߲[ᬲ;&FpV WSs#8r[!W"dq𕷌eieNbϚ`_l{tD؏;ISqu қ`@\:#9f6R8S6g<|l5{W@B5:n42 sliRkI5[Ѕ4,ӽ(%עܶW]w)V^/Q7 Youtp#U@Q9Rlt롡؉0a+l=}oD\Fz1@t-{;Pީ\9:KY֣g6f"|15L$ 8o=Js6"0 x-ʓ6>3z?GA"uy)Y vqO^-k7ehCdm%:#m /ᒪpsMIS qSXtuķn$ qtABD$p 1׾g^l?ڊ8F* +vXטɋMB!v!^K3͝וݑCYMdjǘÀelEǀ1%SW_iSQ /&p 2@D4 G=ɕ)%D[d[ FIk0~C{<0+ru~;o,=%&X +ިAddžʡu Z\+KmL6y~;S PĊT$p-ovT7yLYVcZkBm"nCWGJ.7ZXzc/5pH6e&( aa W$' +ˢK yN FjJyJoY\K |J-g˂\%Qd*aOvx@\OkYPGʻKѨ>~ں'C;Dpf5*<ѲdA8duUߴ-hN4s;0핥2y o-Ph_stL|:"AaMwm_*"PY|ՁPcC@Ȧe~IٰM} %u`HM*I~惟Pt6~P0mݧ$}Z笌K8y9(MuC|!jhxu}-<;D@12Md]ȍwl z D;\eVӭC9hϚ$'&b{{HQF;j&C%0g~a椶-Jϻف ;1ĜNN%7&,I*ȆT53ٚ /?Zۢ%v&j(-&gln| mFV,':'^RC_ W(/T Cc-@tƥoZ,v&(  ~m_ɫ2/g +'s Ll+~5##;er:CYq _L$73UyU)KWy4獠@w#{A4)߸<9-4 .z%0FL1qjA@y D_ TDfQ9ni@:Pms2 ^6[^sh|\8DhoKE!:f< qhaCpSh'CsT30zNGQ>Y/A/`B#6FƯ:aS%VB`>=IA:9 3xOu+?q h/{RL~#l] +bC4%YɊ;}i:{ | +[HQH +1#ԁG4Z\?v=.m8]}-e ,^R`8O=Z)&1ޏivW-9 Z'ZssM Bo;U#'RaG[.#6 'з? ͕_pL ̰Vb +{y>x5+)mWՙp@.nM! +GN!q sN͘I﬑C4T C=#$^s.8 i6O 3th:[O[җ6'q5G2L>Du~Sn6 х i'sJ)dR@t5mEnu~l6luW<5dG8rocdQOF>x6p$9AIFC M +B`R%Xjq D]#/;h}Y ou$$:ERW3녍ϝ~5eH0Vɛ0.W";dٖkG"Ʊ]BX`YE;\&IdLHW˺(~yC1h𰋭fz'm+>([lTIp{Fi m]Il\0姑}*!PI4eCMfs{!Ja.8,Bk1`JԘ/ uaK<0)r$;V !fPo$:.x8H?{5H/חZ_>-Z83;nwv:41vl{X hSjjPE\nۗ$T1g_43¸._6](a:o_V4u:cn'_ۭ6 +\uz +v(7).-/ UJOfR *!,E{ǔXi=sf]]>͗ FO,}04tf]BtN]uW{)J#Qȵl ?"j!&2^Uz kD_܅¿k=Wa#ad ,_O?&A7gUNg*='-a!&ח꭬PY;$SW}=`"vP _2W?<F[4״79#ѪΫVa}.-VU!ˡ_+a]gTAZ2 XίTZG7-d:GL +LWŤ6u ;x/Ɔ{tdZjt4^䕧#kpgKoy0z4Ǻ}~Cj{9NakP8i!d:o +j?[pi 3_z&M)wAV`8}-SKS5p!)޽K{ltA4ܙ3*{o;K@ ~ +c5)P/?| C`l$,l7vOq*UemG8sehǀ4:햡gcGS=aUp_.pla6o%9UbO]$Kl~i[uI:+Z6G!1hp߲\M{w>!e'T=/%'D!`ؗiڲ쌫M`zc893L#ՌW:V!&=>ur>n@oWvC2L[!7% շgm~5:H,w^\*܁#oGiyv!V $\UVMYe#2xyS4Zt,nz5ZkQ cB }7k7 +5K^KR|ctfB2m%^z!`6faĮˁ \E/~j\(⢑4 bR?q3;.[-.= ' F4ʓlSI-s)9K@Eu(JIH0(8Q7@=1u6B.93UٞebҮv|ml/KX"/nqI+0rҞG2RMp*t@f*[Fwf>n!؊vA!>~&4fzC!]M1KP͔RuYJ!pa 37 "+&`/xctZnWp3(c 5߀L2 Ԅ#HL9r*i /t1Qй)OhI7G1,$g7}P)N&r  ݃(:,nu\(CsX+o%@'bDF%Y3Cm$v(9-Z!<`v4l((V3H&.yX9Lb_2!f6c^ozh;wfnd-o{ՅqKN\"f-Wֹ ^ _Q Rh5o'ٚ2 T)7̺ċ}L46Fo_0kxθ>fG86/,M*&5_h|6}tEw{Q +n;Zl`J3Wof*?[";%M~Fժ,42LaD:Bi+V~og{v8̰G jRPGQ90P9सHO2ǧF\ ZaKA9T1UB)!$΅y}T[*-CKp̧c/BI_ʤY`,zGB0O^C?V=< +U!V +$CBķe$zD>zIƛ\-\b01Ck}bqRSm£iJ.S25)V߼x"C]R{6|kcx~E6Ks3ejwbjkITcqv!8AhĎAAɲJ;/ 4uvf]Y $V|!=$ߕrvn{&<.h-rEn~A@4 +8l(@ΕC$KHv8*=-2 +_r KQ ].Cn< y ֽ#Ͽ;\Xg {*ر-ȃK}]۶TgZ鶉N_f҆oܡ1@2i[t~1QȚ&>I/:o j XKu2u8/qOD},f2n,U`4x\GtJGYh{UQdl|/+.%/Ӵ\Ik2[h=t\9iD O F`~)B!jZU a\9v°zR d'Bٚ#&W2T'B.xSh!%ve2"{S{P[GBpX5.rgRZa-',8\)ܨH($:,YtcGj Y TpðȜU( +oz#Ɲ~ m30b9xm'P@Æb'ħuRio@yIg~xƍhoi]D!&1ZaKq]9[m?͟7|(;w%jXBD͑s޴C#]  خkÛJT5.|\uHmkX!k-PZqL@6-ſ[œz"KZ"VRζ&*ɇ0w汋!ijϜ$󛼒؜]A,d@\CG+b%#K;yUWم/3RRJ9MTwu'ZҎgI"ފ7ğ`_:8doK{_~y|> P㾱6w(Q&W6j$O{B5j77"M J v{H+*9:PE[C7mF}m4,tVr}KߌK8%~lEF*Bq& j Q`Of_؆#;V dWXAXoKrU0ݬCo Me(2Ɵ`O3L糖F~e˙#2Ms6fj@ÐhawYwLWQW?d2B +{5a zT~h`#80|si!QrZ +f6ΗjϱbfRpPb&Njp{pT +.6,b % A{%Zr!ZEriXsfWLW1ł +r1`=[MQJo.1^מK/m,l9*V|Թ$Cbz endstream endobj 3559 0 obj <> endobj 3560 0 obj <> endobj 3561 0 obj <> endobj 3562 0 obj <> endobj 3563 0 obj <> endobj 3552 0 obj <>stream +HWnH}Wa aj_zzm<46_ h9( I9b-*JAnswŭ!("GQRI _޽ߑ/]t}Tji~e*o+)E}ۍMz}_ڽ{zf[Ɵڿq84q~wwp~թ+pC3 Bx[gHɐ Jʈd۹~hw(3Bǡ1`K[^5VCMVFaߏg)BM@;8S0:V1"чqMH3FvMd!+IuAaKbEnC*eC\]:[AeۡTLcCmTvrJ|.z;;kǵSNhQ+0N}ɾ3 +9s,pQ1ݻ.=L.V_]]҆|Jq|67r'́ :`)0jԦz{ڍ (olgvۜ8" Ϧu_ `W\1?u9Œ ДB$@`@ hKc݈V2JGwyM*F&}}l%[$tJPA3I&>ގFL1NuB@OL@X Xfʗ`@Hb7'(ͰVO}jLJd+ݦ|UMG7x$T8_9.9RvT/CxJ) m mʁ(~A"fb,'@>!x$?S +ꀮ'3 \p1*>T$Aw ,  }$h +%_NL؊}nwKb +CEqHD'El3 uylÙbƞtsa +j+ Ҿ lϛw>ObH@艉)4fcn|I+7KQMlC0ݦЀfrT F\D"C%vYs,s!>x x{%EuLMα3l Qb@N@k c6N0cI$EPYEfzʒ@QUرá^XAQ0|e^dH `| ԇl(BtDVb&Y}l:t@}U"w}YʅA9Eyx܎֦LZxcFI{эz )v$@Ϫ>`ir[vkST2 /g! ۠U76x7A^٤`T'W0_@\I*-Ȗ[B0,HR`^dt*_J+Pel&h6;J;%ŊQFd^F) 9o_dwܻe8s[‹|#hZb}u4đZZcsbrFsfÌ#*IU <6EWVB +bG=3^.,Quۯ;!~W@  +0M~`;G4۷ &ݸ8H Y+9.h]㒃 a9ۇ~ͼ3-9V&eq]_T-%Fѵ]du8 +/pYe ArJ8\L . +JagtZߞgf{.Ԏc>M @ujȤJCXId'fԈ5TVbV}zMTJ/DN;^C{^C >pRqC 1$APp;-"a<҅-RƱyhzTY^hVYcR`"'BǧK@.oHq=۽:3'YӨgY`X/ 7WHB1ers059H9t;}CA*W$* B_{Ĵ&%w쿩 j"6$حv6bk8F|_ JrHӂT)T*: F9bQ*$Ja[A2![4/&33~i͗G|" XRCIjQf߂.e҅Ha>./=́a?1 f<݀:ִM٨Gβ@G ~6F!}J` : #Ptrd`r#R;qǡ5]8("IŐePRy"B%I2ztΨ`=*Unh*"r.VoJʯa|WYpA *p į}ћW?C͐_bjɂ7~̡3XC?NY64<+t*(Ƥ2g@xY8sBSIjiE jJUꊮ>CKx :[Xii)ܾLE{k`c9ʼnS.uujj`#۔#E,Myy?>=_, +- ~W@=O'rQ&QX1OsB]ߟ/_v2&Rlj:Q-K`\0?ǝj-I΍p, aS@7zbm3xYn%=5T.*ۛ_fcf?a+v#ؔmZC !d\*?Lt endstream endobj 3557 0 obj <>stream +0 @@&_ @^iG)Lf3.ڡ*#O?L7,mhF+N&* KEl`"ԍ;׀Q%+45n WciCm#2p +|"n-$8zқsP6hKpF1T.|l MGP7.|OB EU[5É̚CCu/_t?7x[p V @I܏|(Z Vx|,]QLKsH^n+݌51!jlwY&3dJJ~}n6Xel,Ƕ<`m"?nZ,͙"KD]]0{mX8Pej?YdWuZ _jo v~kmNRb ȧ{3kGT3d.f)6*gz-2BYd|UocjL٫#͊lDEod)bf1C>=&iSc|PQwZI f3q+:~i?US@p+=h~hPPI7 +y >%n]].려,5a#ВkTv^9ޠ ?:+)Xe E8sqt@jx0/a,ŗFȚΖJT?_5Ϩ8t=o5q1IYyg[]ujchǍ]yߵ4P9$8m6Zp8UIZI/K$%".=0 XsbW:3}i,u%"tX%GSȮ!JX|c̪MJ˘;1N9o ax:+ 8}Iv/-\U뿒gO/!2g!Hcd$v@=!/m>_q 2-RVm ѹi Qm{uOg\/^l$"mo]4tD:m-J"Vj[QX1Ye #YS|{ILd "d?oKq~(˕3h({^/E<XCȲmD%f\ڇ]Ueg]]sH;dVY6fpŭ^?[TCtrF[q\ Tmck| .ʭ3 +F$2tLoXm^`mBH:Ꟈ]+׆ +c)MuLwZ WST/GlM i?}Rr~MsIlwf R[oFL.`6ɁԋퟄZr7LCE>MeQ"k# ;Hs׋!,?)vC?Fu̖mൕԡNB>A51_NL1O͹0s7|rppo]&LsGeW`I7{/۩Ou6 b-}ˬѕy=jx[Y>R00iu6VX]GD #SG9kM2׿@Lߖګ][?&/}y&Fҳgaa?%DfO:qΆr1uAϷ8uJn[d) S&q Dc/;ey[g}:ZCxP]yqd;fԻj-PEw6Tܰ=R}IyC{ _cDEfAV_V3@" C%dʶQ" ^vmn/)ʦ qu[.S0K)Kϒ"TjZXUAzZ~KZ@nP?ZrS9la":`.u P0!owU{IJ,l}tuRaґsLF&тW{(dz5t*ʦl\]$u>l|'Q8橗6$x ɚL Z20{z9td u%_-@ʌV\сx8KOYy:Āi!EBL_USA:O."'}m{'ފ#Zh@pn>y`PfctMD~sM‘ +f@i+x;mǨY748W {DIhByQŒB#koLk3w85X0%3V{쫽_-+6rns/ jٝ9M+#FGZs~M@?haX j) XD(h`gW"r䲊29mZYbqulk#sMhUEHNb$!r,uH'[2R9. X y+Is>lV+6bl"ql֙ǐ6'2RWg=[oےo45bՠw +=aǧn[(|k ;6Mhm}؍T|G %cv,?oDMh4rJK]mgiYz"/̸lg)xG+xI"=DbU⧝"@XbT'/{Z;TB$g%:Sғ9v"P*a-NrnWB"zffR+@Pt%U2G@P,!,Yn&0T`gZ\FȚTN2Ohh.RwCu2- Bhr_o *A\c,['Iʪ~T|PzlBI*M:rN,|G$ݢ\ĭpDM/fo-F&v!c`fP3+ +:Ț8aUKG[- +-ޭLmi#<\ hRf)ޱ%'dxf$lR'0;Mj }Yfc$pph}p;֒ 5>$1=)ه}z/N?3Aa E 97-7ImVsnWUO ?o)Ud8 4qb8wMsL>$ہ3?k?q;q*~v\zZf“.>0ɜddG4uC:Џay]:#F!JT 1@Ewe#D/Qc)m +lNOQ®+;HB20hbos +[d[??g Z(K`A +%+ch{da"O (@ԖQN [/z+ v|({:%62 W](o%Ee"؎B ]ti4|)3j/li}S5/ג0!34;b=/V4W¢~e>9\Y*K*]L ;5$*Z?bZH쭖 oEm_y@ŀa !(ȇ oLC}hX)Vq%S :L<*uk501XXee*Tߤ\}81m~Z$MDJMJ7A;rr +X5Tl}Z/R2a]vFI* ewW|1|2PM/jj^RU {3FI}]KQV^3*pv4^h5ܯQ|Dmsν+x#E; *QzJT&MP2B0`Im 𾹓3ߓ or,ent@{T1_#dE߽%$\x9& к#)ठ 6tS}BGedK2JT?d) 5h`,BcsO=$Zcok{B,Z2K˹棺y׻Hi*BxK8O <;)O"DY\KwldH$*2*  oBK=m]dFEw[]%9$$˒1"Gyvlq*CΦԘdCU,-1y|oPXbp_ѣjrQB;r7A"d7? ~Fws78 Z9DYa^ pL^94 +#$Iـp4x#+7'ЅS6 ֨;(zU6#|?' Oovk.EP0 b(WU50!|)5>d!*IKz y=*H溸F+0_Ek DU9ȍg.:Eu5@cY}:jII!~H[ 4}*Q{UJ}{نUi McaH#泩|W `AďЫ蕇Ѧ(>&վ A=g5:_ky 9޶m +4t5/uOX6s]*LU ?P)H4aJUޫ85 s+lZ`ȳwC[$u52{RorKh(S".j/Nʐ}G6O+#dNI͖\ PC-֣njm_ӎ\`O yZVm\͵p͍㴘I,rpT1H_y>nKK_wW) 1vT +e\W6~Mہa=],t0 W>p!҇<r3m_T}>t>;BɜOBc'IR,4y̕^nz/eX x'RYdR1+%JN/+ s 'ңPr)HWS,%`#TNX|z_9ZJq51VRTHPd}ˌuia*Gtj/{Bud%M n,ZxKF[aOhO.fڄ.\pv|E4`_8bY4ډ$PL'DB)Zeg7ZzPl +,_5F=p.x!ǒPxA=(hz4:sYX=^LیM4\_~`w+// +Ioc󤯢w#U 3?=!kVګJdi9_pU@kׅ;I7OZfy ;0p^zY2<PeS˥bYKITAcCz@P S!]Yg?dZ-d.."I[?MFbqLic/a=(zO~FHxb='"{YT ^H}kۈSrXb/R+!QkTbzFY>1Oijlb#]*M}: ϵ&P<.mW-o󰃨`1 +߅dÀp6*l.zz/35՘_*psq}l0ğl0P>Jb[[5Uc7~mnv.ƟPUnNWqYWBvꝾ3Pـ{bkx˖X+a8hPW_emzB1LHC#xdz7P0+j1{(6Q'ܽA&ЦCp`{!F2tM>(_gfp'}LT2-=3;E9[Gj\:h]$R(Ҍ72x?JE9 6a34$T <ٴ|"͊2^. fu2s^&db`dۗtGH+[|x3I 1Bv:,{ -}( D)K 7#ײ&V=kAG&NB|NUfjUK Hh0h;=5%|r?+4(vR-&5Il .&CrG~$<5H\NnŇ7-!pu``:_AzLx_N0? V:19~F۲qF .PX׼r/ŏ3K @h1s{Z_u.QED-:aE_ ϭ`Kkߣ98hE Uı Do!+ٳ诋$/ږ9.sVcѧ\lc6]A +2>dWf/jI:"-(m,ആ1FQv] cxRɸTP؜CŨP-&|`?4SܶƏ|M{auk3+6|?! Vg9Ysze:%ߓ,k :30(;]IAXZ])*/~| +$.2c?%3PkUp?EMG6Sܕ_QL(ihr& ҊnQQ a%hu$^bN.ǁsuaw +$WIp~p0joPi7?Ac:8A(K(,ӳ .-o/?]WE ޫ #)*dOco`i:)eآA6/r^SV6 %[=!07Q/Poʒ'~f49)v$!7N'ts$rW873"RdǟN + +CHo)!+G٘F2Ks=Nm쌳(o ܪqh/CΕ4d#>flʙW&xByB ؟t(g 49ETm(hm|U3c(;%?i`BlWgd{ +h,LQ %trLSjT7n8͙#r;V ߜ'8%9X1ecZiiQt/,BkUN*^֍4 xjwW[a֍Bg0i50} +/U=H7X0d)5KKhlh*9^wW@/Wg%MWnIp'K4؃Ѕ6.7I 퀻oAR*!hcJ]V|^`1G$B]pJ .z§Pra +z-s`f=dYG&"܄/ +i-lJ`tm̌DSBKG1#t #8Z.G&T ``&јy`/ + + 6dpD O+vc+P*g_eyM.eQ8:@M=9EY\"DAOv>J6갴6Q0|rWOkk ߚŇ E%KML ++t E*AV a?gnJ2 Ǿ/aXp< +N`ssoȒ>4µ}{;N 3et[n@ Hu`F&+FYӜD}᭥5ɥEY //Q_]S6~vFh@'0cbCIfdž_zPw O&[i̓lFX}*:5 .6qjpcьT۷ggZK։KiJ2/35S1xiyUeKEsy`\~"69V^-AęM ^R274 2h +Rɒ&I__"28Z'&sbq/}KUFMS V$f86ɥcm.+bY5c8du]8k$֭"&pf\_(!Jލд RWP@vݳ~0CQ~wʖ4ĨGrC3)\W=Li ?> @L])P:"ÁPܭK#c@e|]B۝gӆO{Ԯ6 +e' HBmmg\>x)6zcv,N,6=ۣk>QL)p/X4q* )@=P9{2!H ב^P9). +L=(}k:="61N>[vFExatrSK~B_|8.i(F,$ m!%u#L9qS}n܉U! + +BIP2+8GHsErԷ]tImƮ떘C{u))%E9:OFlŖ=>(NnkUأ4Hd^vau@0\F:"כ cOS-ޥ5L?5uu~+O +؄|kI $> Kx>[ɛАsn-oˣ[Pu%!3Ĉ{[g úH,kk8H. ]n$ PCɊ+hkh CpouSMک«C3rB;zcZ|HgJEQ2M:ִZSy7":!E\V/Z'Uq\MG,R78^LB4n^e$jLD+{pm2js7ƛ3b@TGxtI.3 Z`ɳF OmQ:xu[YZթy˚] /.wg|dS!%I_D&" {n(lH+H58Խ 12.¢Q&Fcga'){nt. 1=& &TbEuK8k% ?n\Fe[d/hfŜ u3 +@9o_ohx%j>s$^,_P#xe4S )AdTS jhrND Lܑ!6@V;ihd`FTzrƔ;U ^8;>s}@jBC(mW\r[:B4ysU6V#mYt*; _{odvSem<%nxXדl5xnk(<~1*;J<8Ʀ'pkc$wYЃ=[Ts']%mׁovIHX Rqd˝( )s"%1_zM9~xԐc@^GI_EH-H)xqB!d"^5u ~2N1i3p"gX(л'byt~}T׌{OpsNܠ? 3 +u %\Id[>&y6kp'ӯt1&e:2|E&P&Vtw͉IHRyTaX69W$O_jvK qF鸗`9q7G *]ߧ:ҍ-' »fS~IY{Z_PKtrE;HX0od;)ZNjz. QI㼑].o|V~ PlP]kğ9HL?7KtA]? fz$Xw{2Wy -<2K$ it'p&TWmwٻtJ!?M0͹S j>8je z@nTbJB& ϱu1HTQ[O3si,7ty2sӮ%#otPe^,|m56?|ڔ6q )6X:ao=UoŽs4\y@CYݺk32NIA7ցkP":6fG[yDeuV_l>ly( :|s}iRJK)R'þҺ&uxHטQ %t.VG"teѹ}^IbRf,yܧew;eO<#"elGwM5>jk$ \t6En N :D\qX N+)}K7.){13פ, CwBiyo6txs^ٗcHrB/xLOEu韊oL>*1#k%"rm,wZɉru^Э/LbLdj2<)E,Z;Ȋf%Kk˹$exgPdį!ERS ږtiӎG@}\9zf7mJjIɞuАOW A@]i,kGYfD7?yJs"v&}S['b"ф?prP̻n4$ޗ&Wh[]b1<ρf I\H+qFͭ1rI_9;ҬiEO V ^3C(vA +o9z"=i>TVWu㷑QP=#)6#TtjxZRcpj Z11܀1ujfUQ/6R 9cy7 ]~ C,345rLlz5+yFc NK]'꣨J[/ʙ[ErSڀ<᠚5ů4j+BUZ Wq +Ifl7*'9koLzJʠƅ+("9RdԐܗ/+cz'[>v& H0&r2`(>[vlքu6O̊i;5dHOWV,֯fҝB!0BgQlp2˟1DaV܎*Zg'7'ΰ&p= o¹86>6An:!]l-qe׷/C\8S;<d^(ZJ5NS<-@@թ7ï~A>&uחeHL[򒸅ԴF<г$LN r2tab %ӓS+bc:DLh$"]]PWto8K +/Q#Q}]#/ס16A1.z\NZ@V rC <^k0l*- +yHg@e7cf?7B>۾3%`ڳJIAI+1?UayԠ$mJJQ۵#YP~&]g:tWT͊Ѿ /yUH0#/-hm)_ɣ`f2St93Uz[ GJOӓt:McfFPhy3 `TO e6Ekz5",IΩ?s G;tz,}>vi7)cGls9|Дȑo=P/i P3yKtk4:R@Qf27P8WQ=@u +2?<^+!(-o@:aGTGݘ02|>kx%_!6+$i-WQH}hͽϛcSn I#nJ&!IR4l[IqrM FlPo k9SHϬnt>kes, r nE4:GT0 T9ۤ+8V$GVrk\G~aF;ÉV ?GIj`,\~ix0D.rDEwLUmm/Wnf#R8,rClWC&\n|`OA99hgcR95"gvGSuZ)BtrJT'DK>RI/b1dk{7Wa';n[Nx_:<"7H%oi2hj3!jN~4յ5Uz"w:IMQf\p4c8$4햨:zb}O7JǷ屣-R@E/PK5ByfzPotǘ_2Wg:%W.9눷ӭXL_;\evZn2`zq~N|RRHxIOІ(8vsf +?8U>_ -uO^g:}zS{%dy`lj}=9GŦwX?]_Rw}gi"ʴ=[hR8/zQROeӯHY_:l504&_vnʻާČvze aMkq^"(BDeKW c<S9'ϑQǸ}KI ɡg&Vr)%9 rAL/[-~)(".VKݿ⻑EbcL^i[r }^J^R>wLq+$L+4=ˌݼ +l=u 0Шٛ\,-S_8CaHZ3Ui ijw2n~c '/U&2BoƐ](F;Ǽp9gyCvS~Fˀ(TN}sB{wP\Ќ[T7 Y;FdBrgaɹ3;CLU,qx}Hѹrri;َy̤D_&9LNy% lO6_Q Wh&z+Lk'͐K[8^0ҎEI~R+\ktUN-[It %15^ ƾɀn[Pӂ猽q֞ ">vH_Oq!r~?:"oY|tK%_L6c΋=7Ȝ +ϢᘋlkU73:a̹`{.u.~`֧-vJO!|JDdv.E[;Vzuf@F֮c .*$D٥ ?Uv"7sXXvZ`t{FH](aRࢿN lcik9]"h"V2sF*7&6><̯:&CM JscpH}7F~!NY' LAgMИd1֭`,VtWVlΎaQs:J k, ۪\=lzp1SE_S&7pƕqCL*6o%099_0/cs!LG4pi{Eq@ybP"+k`" *\ۀoR*73-H}﷮U#L` +pwOb&TQ{ (Pi#ͷ/ep!}4"pU{t\[J ӟ/+vd^^;UFV\6]ߛ̮{2AWp|[O_u8yڮqV%2]ف$֯OBj߫Iij9ogj)~H30Y[;MKȊ{ <Ӝt5lƷCG8}r 4^ }yF2ɬf9c1 !>5fC#Jol4QewlCt*PC{>g^5kA2N9|O;)S h_V±PSxliq!_#Era6&)\8axmloj?J^Rr¡KH_X]7ezޭʰ<9QE-?"مO{Yyb@|a,…bL\]ԭgSNoAcL2o1d:!\hwUM6k;YKES&w 3r+C0g;EPL0?yM"G6߿0ZCJ MBD_(y%w> 8aXGAg!l*0[4fY.J>cy2½n4)S4NRF4:/й0[U>b<(cg*{ [Kk䖻/ƶDtѸ9{dl/eXBŘI =n=ҮN9kvqU.rS]+,Zp&u56-2E)gg5;.a 6goȵ~XhUCs3~_SC =;I]v},T&943wAN9BᇮU##MhƜa_k]20C3LXΜ2Q48qA]UppI/ULD$Q/mԇ&+g8=혫츣I ٴD?tPwPN͐DH0W_TŰPj%ƛf +ڼdwh 6 +9,%Y⹋KuK 瑦53 !TK?;=!xnZ2MQg +}ysad0Qw"VC17hz:ÓYzlQ 0:{_s>9KQd +TI,'_qӈ$f}ǫHsʫf#XTQҴsYlS! (ʾ!cUn VVYN/Ba@2;8`RP9"7a(9PMA["EKfQri/GvEcR~?ͻzEG_/}փү9+tZk!ʚbJ9aTk{vtp* uZp:E'U}Xfܹ((>m}U0m> }O Uqt +0C'oZqyTq h|Z$sLn EAh[% ~ P?(gĢ֪x_m*Zn.ϪrUA=DC&ßByɍyfh3˂FU:1#r: +rA.qAmXϝFִPc"5vY*5r|Өʎ\I1*o`z+JߔZmjdxڴjYbgX/LEx!ɍ/4;tnKhu _a xFFe,~VaZIJNEhI3{.&'99rsү.U p9Zd[{T >+]~@6+[Mb>Xz(K钙>pDcݢPےfy`7,>d{^'}SE0h;Oӵ+ez$)C[ 8JLrsRr9#JG&3\)[`x "B1]6F MjUy )msSH2U_%d>cKbO֌iDFJdo^huE@6׿卫G şf잃_!ه e3[ɫMh{T EHn4N(_wb_aHޠt>@Ů"%3*JX҂ѥ=ƨ63dmh,TR-E/2puIjlJ30Ch芷Ёsٜ1e1`{wJx$ݰ|yd6Jݰ+9ȗ`kiirsv]g#_Ӎ}vBD"owa=/GI $Ҋ#<Ѷ4lP>Ak3[0.ΣN|;džg%@eG,kK|- +!ɿ4^Bpt(:# .1Q"ϦPpXt="DXMG Lf?tu yiT9VHm.Ÿ|}sS(Q2Fl +"d⡥EUuܼ' moъ˻>3ˑ"Ӑf^}`i2'R9aQ;uX]y:U[ + ]tuj)a>|=yET9URRT!f8RrEGkw2dС0qhK6OGJڨ2{ku\]S%W#O'&*ܒ߱,D\cN$<ۨ-(IhL.rT(̈́uO)'&4Dwo'2騘!$"ITW .V,r.l=ܸ9l՚2cLЕ,j`FN?D'4P7&& !Њba2 24>e.2 PY7I4c۪ q]=!g~=tkq̣ zq o:4s({E/g\UBEmtcBQr?Å}2kb&J~9tb'7uSPLYoHB/NR\_rƽQ+*`et]TQ!]L145,;8b7=eǣ=H`Ԝ%ѽ6UK\y0U^AE}ClsFkԲde*nR=6.s|)pi8 P)g̵Q=fSQѽ Vk| hl{/M T>_J\i"8nwWBqzF\kC4fِTஒzjE||_bncL֍6d0P4>N9Xة +QֈC$רgvݛHo!ؖ T\t%"ج',ؿ60ݪ_r|7s}ɏ]9`Q577iC?_IECD F%dZUKy阞*uS6D(O.NY(F~ 8DAcXSrY4? e79QKY× Yp]] qaL[TJZ#PEL˳Li^0Ǻʆg? +5;qe+ $EO~ 2a=gzq +2ʲ*TS/w,&gaO޼p'WN)zh+,8K ?Or!pK)f z|Ev{mDAmvNH' DU[a8+K1-) g9!h^mYlGp=:#9jYU}5u'ɯ7CA1H1o2DDpo)5g^{98ث:ݙ0-#ޒ( O>arCK>U$7+6ղ;{TpJj:3ѶSO\ȝx#́К#)eDͬJ=/& #EHaNm/%]eO3D:};ԐIT #o,2ڦ< IFiJ>B09}_g*;zSQ[)NSN;ֿ0`@;!$+Ɂl1!hO:j49lJE/+;8+> endobj 3554 0 obj <> endobj 3555 0 obj <> endobj 3556 0 obj <> endobj 3545 0 obj <>stream +HWn+` r_4 it-H0a²g)#` ?TCZ@*yLBY#%4W[SD {^&%&G/\ftL#$~B-.\"~> + OnWn|{9*ɇpV_97_@XAPto #$ycnCOn4hԈ 1.ZP$:7: +9\IaiN9:Nm$8lF/R%)Ed$Z7̺@B"b-QJ ޽̡D>klsA|>O]D IX/@0Y XJG +SB4H}>fx62{[R֯þ۟+e +$1InU' U +5iB-B>!+s!@{1ۢZPsOByƪgkLNxTZw +(Vk"@YiK51LT5 f+̽d")U:^B~d5nL_'BD2>gxVpS@lh/o^H*p -liSX8YXc_w 'gLfy88mgWh";ݣ纪 Gtzc b$Sc slQOm'ԺpE9 +Vi()tÖ4% Ĝ1mR,2;ve2{gA/w^M>Ϫ, +L$^ CН{\8#rǶoOhB`N`"*+"2#=*9Crԣax:~zVt3+7DN_N)ȥwV3^CՄ!lr_ޟ]_ #R+j{MR2vk e8A&eI"ðG\Ls#lsXOZņz;Qi0咦ϻj4)ݹE&J(0Z+UJ&-`=* TVNB }d6@N1i&&|#3iv1Wn_n T=E4a`ܣ, EkQoݢ4"$fV|Kl N?{uPNxv^F/1e_[JelH~>ˇ3 +D>>}RȂG: ¡[xC/JpfGwnQue Q#v_lw`h=4`!xhyX[X&'HpxU>9{zA?i\vww։yS4t Ye`htongl2n?\ a(JLCv):}nϮWթ ڙ#3MTG#f4JMV76f~Ŵ_fO8$55?h`Q|KP=]DgBcHjW\`+US&;HnOmlu5T9L䠱&Y&8Oc S~acBxO)݀7?G@ ]Sd%po R@Q:ʐ@?t&eO-WӦϔxDRJeaHR!swr(FIO@9h\a5~-ut3#CjA5:d\o7)#vM~C~lW9lJ/$H#dl2,ssh[eL ʣ ~a?&ԛ!U9F,,j)G):qҷi?:@L?ޖPiMA^C!Il~K;mnZ$EJq5ψK:Y`wYXXᢦ舫n[^[]8㑜$NӸE`Б4})w;PJJ-!Zs^g˄61zMa6eDaҔ`KfG+yd|/*Ys[++Ptn'mFDՃf7-TXI抝Cqt +a3@BYJ.Q.\\cn6" +IyMUK]bK'ʁ;%Cfm ιZ[i{;J~>П[k-{N&$gpo[wg˳Go6G7ߖ޹{zd9h +v3I U6 mk~}=8LjFm2/iIk^2au1{akhC*\}t.\+I@r6D-AΌ? +eAAյ>Sjs`.iC3Bۛ=,jϊAp2ׇL Hiswqlq1w I endstream endobj 3551 0 obj <>stream +0 D@&_w DgOUWUbբI#e:#!-'bL6|(Yn +^̅euB"#~5/ x͉2N +CQ$ .򢆡塊͹0Vh x]A6gO +sԍ?9Z%CYOmC}j*+;%"U9goQ&OV˄&>mt>٨ čα@*rV?g3+udg5#>¶xzmBQ#Pfjo6euVx*XHߖ9yd8@ҜT/ qmB+l{`8NR9YϣDܳbi{}VoT}$ty83ȖH8r0jkF2:F5 ~wjByDuthg[;0aϪ |Ԋ c +SBZ]',LTsK05;/uI()d_rS v'yz3-\y7zblu#e,%wLs]\b 5f${dfˉE>o?46e9tg1czϾ׋<Dcx+.pjG[=0ܷn pľI(q)*=0~xkm_GAU+8b(?<=ҁ7Sg[=S\ /Ȥ *ϡo¹ΰְ5S$N +AJl?VFx)'ې!Gku"o/ho˛Woȹ P0钨 ]łŇi<$HW#X;ԄY>mV 9LۺNѫ =RVIGN6C*5Qܴ%1!M6a \[ +5]b˗nJ0KÑxI~ld1aad}y\>AfZ,\R.mP_b4ϪY2×@-rӫbex-ʔ8ӥ#"KW };&IM 9 Vy\DO'=.Y qTU#CV +Tclj}}NPѮtqT]I)"6X6<P[}`5G{TGU20YУ^K(;k\4jL8.]j3)> +sФpu /OR,D`' -ڈ|?#LH~vP}V?:pU<pn4&#p\;Loej(dX=jkj @T7+:ULe*+ pP9XUٜjeآw&EJNv#bK\6&́t _xb\t7X~jނ.E) nIZ)c +n"lx[' -4%_I \)S r#(v,564Gӻ+X1M +/fH3~NXN%3q!|PvdaJ]x4kfnn0SO#p%D~ch~tSw&_9\QH =7n-sSYp9 37Ii:'=.mu3\u;]״Ozn{7[#P>vk∼&a{@K>:\GQ >ʹ,J~{jVNSLm +< :+.{ʅwQŵK 5ick#[e\)#O5]Iu$Qu7n`WLc(EjB } \ [$"3D7 rQBY>1죴a=r<9`r^9d7\|/I> +[($* +H};|J*5|Fb$KR=պdZ•(".n,%)ޑ,+# M.OGi1?SAgDBsNh5^*0F-{)lw:oq!m찉yT!wᚊ ,7iyv(7M^aع6Zv`~d{gC:{S ĝG2@TOBӫW5%Hm8O߈8Mչ(^b?ER+wBl=# şԽP޵;:h!V#<ѧ9zQ׍Ma0awmǻ2}z':䘡b} +fgmc,k0U +}H=: +D16#-KI)r]LPYqLzqjKuv-6[}o6Mi +gٽ/j"})(\: +&-y}ߕ~UhfyStX;3k,jW"+2ْl;Xz̨x{yL9РXt|i&H# s)Y7_a#X9+HhÄG7`j("Qo# D~|9^HB~,!ѬLWG"JEJ5o)|e  B__[\78ܫN5ad.{KEI}+)we*X5O*wRzdylA7SGK|Klތh( ts[i /ւHoYEWMx8 +,)y6Ln?:a׀"ݠx%rc RM'֧2Ut op\x%cTh)fT ԉ%o1RlruΪ_Yىw~hJ(+9,m PosN=Fh*-"6SZӝĆdd&OA俁o Z!pɣU^WjHOZ@qܿiI da$ڡ_v-io +=l(>F"V1( 1x C˳6༞W^s2;S6T~ZNZat<.6̈G x^#D#z9RG;]\̆I˅uRM߇qv78{%en_FNPx@G@W8H|wnZJ"+٫ {@:1I fՕ+D TqӔ+m/Avݦ$ pv@(j&pyK,3mek/͓gjB!zjο ܣ?k:g?S`@̸"lW\/^6yш_⮓U)bqoJS +Y `U\ۑ˅ً橁QaӁ6}#dP0` AFe\ߓ +Jõ2@,i'˜>*;V8 ,Z l;/)[s?R$x ~ZqW!:A4HT^;*Ბ21Ӏ04Tpf(%.Jt-6*ΐ &&ł\ԪܑLh=1'~* OIGv6;|Gny=Ǜ2pQC=sQ 0vU6r"2dϥI wLm )6Y !Ee_}g˴6e"@1_cZuK/XAӂA9(hApz`6qS̿bC" "o.]7ӗ6-zR.';/~y?iw3Aq] Y<8xx-."`_`vPQ~ +n0p$ĩ,|ns~mm@ҺӦpגK'7v3e~ lV#E[O sirP]I%/錧g-+'uzT((b(YeZ16:2VplNMX+7f(r m^hg ?h9'&%^N89a51۹UxkMkle}Y*,9ʫѷv۬_0SA0ڄ4yP*sglg& YrvTj8 V.RKw~-wbXoL0R/m""m PoaӾ|0{]s ̙R-蜉BHJ5]ls eP э ycitc, +ی=dȅ}b3"%-_΄?'SH6gK_L"*BXO[Dz +[ =0Hc WH'MuUyR +L&w|*։ym +1|} ƫ`a(Jw +TR+ФWZ'fVe +jEotQ(-DJ(:ku{#(L1jIS!f:wmp[oCۢ!Fi-\ +D#(my~ɸ%49%Ti2csA^>~_ϊzz.Rׇʧ6tN{U@Ep#rUƄ1q*p/OA"5F>iA @6w|0s\ts̄%. *t`,akN'^ҶDˁ*vFzpqdkiuv+jy}CAtZ2}5ocQ#E[<;Jب=yt'Zf\XI0}I)2E'ꎥyv K)5ڹUe Ȍ/Yt=DŽo?̘^Hg}b2o[2r5P*@*7/&ws$3y΢?HZ u=6qjpEΨf0FI^J  +n2lNen"jSH޶7+;JZm #[;$\S]?#u"^?R_`(JPaEaUTrr:z1ЊbO8.Y Pn h/c/H߾5>%CbZr̒1D"@?݄_VQȲgrRg;W%fnىl &|1r^nYlXlH y 4pܦxIJ h&%Jkvu^f<EA%~& -wgQm K B8. #N93–(9PN\u\!n~Zd.o6:)y2~ +9u<ߡU +Ѐ !oSH FeY^)4~ŗwHUk '^n,$Yҧ`aI&@ _)'BE (U'PF8 &Qb%3 UGfT!-:)qz +JM~[c,5hg殥]`$r&3tuG<8g M c$@cDڤ(rG:]7bW0:#cLԫ' gubK* Ⱦt8""k!*zu']h}M +++w%fKAD~Ss*:I\'+a!kVflCY@[n|3W[݆RE|ym]ZNL(XJdӾ5lq5#bb,/`5_`|Pv!ؼc'J$u~xL0rGyhxci0R˼t o3GJT@}(9z8 ^](o A:Xik`i25 ǚ1nVъ ͍y~~q,w)95Y9o&>́+A`jWR<"_Q +;zkx@]ܔ%?i&t'2Fe  +1u,Lx" sìvZr1B{}}>zwBD#cFw, +\ BŰ(Y64o~ߐ6=B%iL9akR`Ksђ=g3Z JPE"_EA.>lC?ğ pVhvo2Fvf ͊NNFZ j{ /SSkhꬍhuGi{ڍT _ In5svܿ]! +vo+.#85*sT8%pq峫XQ^OvWR+D2-j`?M;NtLխg|}rA< Q*?5#s_50 PN,)i$w| $ZZt0B#*Nx5w6Se53A _0c]qwkh H9~V:`TC,+lsOqO"'NGlЬЧ [ݑ [mxiø2Q.GNDhi^+hw}}Y (QgQ3' +ݑPNZ'f%#)O`^u>)ryJ +*䷛(g o{jRD|ۆB)ɬ + +#Y"zh8JW:x6y`eO8h .5z/vOHUq43 k =4qv̙x0XÖK]BQL☖ɩ1Q%%E^`E2QGڭ'Ӑק%&QE-7YҁȔՖg"NMoztix7bfvjё?}0 |TW)xCd#p}\cѱUO#&$*ATA:xA4F&D5U~I(ťZ{BT/jZJڌ*.eS[%qf$VXacyuLۥiϦU4?9R񫜉«7Mbc*̸?)+ "[2?}9OI#v A$(K.8<I +YDWetKZG!UoLrxU5,,MC -C 6xz&j}fa4V^pF]&EUvIl&ZX!*W3~ _0ZLo2.fpg*_tE쳒@(OX u!N|r|*#ѣ/Fm1bynEŖs/+<Ӣʸ_d׾E`h]  ȟl$WŢy&Sd-s">~.YAcNx|愹$Lf+ rvb=1_qfa9i:pXG{Y0ϙY|P'{OqgBis/A( b2'N/)F H"ڻ7CdD4iT.*(^ [=*Vyd,fDb`d-ѣˋ#JA28wuv ioBZ0 *i% +}dGݜN|QLޜ emb!7(kDj26x;%:h ZFIysksiljɵZKS2f?}xdc(KVGxG}AHgx]`Fzr$'%huʣ[0Cz3`Wd&OߧMijKR/O$P=p.:3`ەcz?;sߣx|?f4mR׷ +t?zW:te][;r+, =PYbq۷Hk=hD=EmݐM@tNʧ%n`6U'4`Zd=^̆K2+^$bo +fU;l'Fk'? m1qĦ |b͑Dِtfꛮ +o,+)jVHnqsԒƴn^;OO3XU. +%+W'YDp}\G pVf +qh(LBm<.E_:DuLT4hB^D4W@Qx~ ^KHc%ʸЫg>Z:@׏NGJ6@+N,S!rJmo=zo>[eM@D>Hb7)LۓKpZFQ2ܻ7'kG_A-/RViߦ\S?}]z7.>-d &fXcNVh1y3 +QA!tݗ?(@- ,C#], +!Gr^-+גir+H:GZ3nOhg@PAyCnBAլ"\Zʢgf"d?zE8 n/2`]{/ZJM0"yICrja-/kWY!w=ƌt|lAP#A8WZ_h|7ʖ1XzR&:-\:ltW2~R`.enD&R8ߵݣ_žwץDTvaI[q{#+ ;~zB<_<"Bd p`^AlD`~^b: : Et 4{DF5J`<Z3 fSeHo-+_&%$յT L10=~䂆`Ͳǿ>bY8N#9;c 䱜dr}kWSks˧_ i   rkο^%$} y +I;"nM2c9MepCtR}W +%>;$]zWPaKBC$,L ,y +TXMh $|uΖCEř"zTӣ@($_=eU]{s +/r>:aee֣/gvDT`l; +F]pG%5 }W\C)EXY mɿhyoH7C /q1s*:L ]icٝtA$,H&jg{yo_)'*N+~p'ҨD'w8ak2 +x~p؁ȫUHtHX +'AV. xKM383ڟ_΂֕DaNbmRy5KT :jx '5 Lkk k%Ο@V.D3$F8l +xO!D/N'`iߝԂ50۫ pS-X0zɾm =[ [`'rBQǗ]\r +ZήH5z6J\mȉΑH4hP4Ȍ v!+ mO {(a+)Eclh˚`AwΆ:W F @R׈8;. tJ 5nm9,@-v|?:ms*Fy[#U~#T{N/y ҷ9?FFJ!dikH@wΪyRG8HKFZ`V=oԞAk>$9T$*b"EQ`qyJcz=m"eő V[bi +W-=Cs0VWp.tOKaGR]7h( +8qdfubWKw"ۋTA6nT')pej?aMo\a]M9M4H-ܺ/s s4z޿ unpKό3Yn k  Odxϫ6ׅ+ZeSDb'c#k +siA{,qQIFJ^`1az*a`Q3.$F%D3mByA#LimSQ +݄Ӑ! bt3kgfqni!EV;Z$ē հ|o}>KSEItNj5pɑ i+8^Vl^2.!*Θpzu&$&.',?/鞾L#l(6|ub<s eVT#adح,Xaʝ +nS N{$Y۴]`>yyVSR60h(G !zx1bKchЅDA;J8Z^pXK>3T74t'nΤ0z2m9wa\UuXf!tQjӽ)ڙiٕij)D[%4hCnϯ: r]"bȞ14ǵمɶ]hJ n$ {Cxo&bF3)ͻ k R=G[76P{nbZѹ(O 4+cOU~+IѱۧUWqr 5Ht֪=a|48QRj?vHΒAstʘz"Q4 +1#W}o0}Ƽr̓x y\mM$"Z#,Keﴮ̬`X)0'YЊھid~+hJTY/#IIN.LLX2GSz}ؑo|"IB,HrK"[b#">(4?*oL#*N,faDWQ(Pq}W b6MlBP©Q̑:{#6i  Z˝{:BXV31[DG͜":7|$ҀrMNjj>2wEY[oV{l,nvE ^˺tk4 v&NEexZ%/p*DJB,f b>^9auFЂ/g7Pn.g.8mmNI>Ds122w (pk~~9O ++nɢ~|98Am1gdF]ZSRcۇ;癞4fԶ\abd1T@uMΆۚubP'0qR`Bywٙ[WpK,ySHOSIw8'v&Uy텑Ffq.('G;F@@BV^$Oo'Ni}0?M ^tY+ +kzgPj6:ũjA$k#0=DVJS+Mm3ULP79&sI"'XKQ]܏S3-yoML=ZىeW%hˆwBj4A䄿ze.|Ϗ)o~m%ьi笨ZT^cf\M]q7e(IfNuԁUԅ*S_"a\. Y(|ܟؚ/όt tEt6HSd`?8v+aIH +!N:n@t.`hx|'ɜzW ]@+@ S:-p쎲urN:LbXH"NP`-ZXS#`-!GP^7`.7Fr^-`(EykXy'-.Du%?bN >y:18$|tx#w1)S"J [L8c.S:Ϥ+q8>~L/Er (`;ⰅULRFnX`7x4L +_-;$ 'Ă-@CA&Qτku7PtS!)ܧ~pn'W֭/aM = GIϛӟj3s  Z#5MMVgg>7:#ܮgc(=hKD6XLyX]#3ϬG[FNE[IώtTFRB j6YP؍܋R_ɐ \@=V-I0}|r,R,Nm,෍l52yv1CKn4D2sȂ9|E,Ģ-G M7 c#([Ǫ09 tc +x[qhfu7p+\,t\Ar] ֪Y4ȡG/G$'V2ލyQpװρ.(C)cJ-l5{kw̘ٔ0bv ~[E}jכ|l;;ME5nHz-lr/ZݮHUfVs)Z.`X$=rrSGFTjU37lۛBz.[[&rqUv$ݴD!5 J;_߶qez;'95m_feʳЙ@Yۯ(%krx 94J<@硯I53/!XPZ1m#}xXi Ѡp/W)N2a +: 23ѽP ;g=%kVOV<ġ]AҞ̣Rt*fkJ\2x7g~(vxv fz`.3l̯oCba-&WvSm҉}e%)vy)_z2L# ; 핌T%kA8 2K +|?!c򅆬oRƒEV=7bә9Ր.8bHRro؋:23(Sw^b:[84:T{xP3x590P*{gA^p6Dy/v +K(1"*ZvPm$9E ϩzgY0Tő8t1PۥI)s4TGZ X nˠ&=P>,`Ƕ1mp~r;RW64,ym{!4~|ݥ0:F , d=re&~@bvJˣưU(rQtA ^IM'eZ7eW#FKxQLx=>`?jscy,Z¿1U ۦrރc(uB~ 0ԯ@;ncW)RNa\^TNi%.Z5ج mBu%/AQVN2>b6HcvўOXk'd!fWANcF%,i Z6\]S׳OR`Pt`ěƙ|L50mZeKj=PdahmwULU:XPt*A_yʆᏫs{0v[K}W}QY +WY|˩PC)a)%1lۿ7v*hA@ \6Y*^r` 3fFGY6P HEq~"-\t0t=pVU?52ː5>rik;k&t!E/I{0iR2,"wQN7?SĘ9Jm&'vZjT _҆%"' &]ŵH ϸ|kA+Q7ɅD"n{~x}O'Xyosk+ޠ~ tܜ%&;u?O))بl؂DMig3%h}bJ["H`N[ 2HuQNRM, =9Xdp'2W[ewNVPҝ#P(uE`YPT[t5Psn> g*[ /J_U]P?3Y  zniF=>GĹ:L,25ǥ7¯H0C֫Ng,A鲯9mKzd"2 br Ms_FFMчI+%4;]L Ί"H9?3Ka3\ Fҟ-2Lݺ{!Y瞚Mh.hÎĵ @@![vL_4m%Ĝ+Z^!~NO- +ЂJ'>#l3lS]+q&d]&QFq +$ N7>*R"}%#$N̥U+J D~U+>} [ S1[!Ω_%dga nyD(y ݦL> endobj 3547 0 obj <> endobj 3548 0 obj <> endobj 3549 0 obj <> endobj 3550 0 obj <> endobj 3539 0 obj <>stream +HWr#E }W#Tmzwrq0$2v=h.>djI3 n\i+|}ȫۧzynFo溚y%zv/+Y͛JHm<*\A1֏/n~ +aAABP*oC]mƘytOTZ+cC݆ +Nb҅+4Yz«h-~|.6ڄ,dY^B3#+=,xam}H̷]/D(}eYQB1Cm}ݰHB,Io{hBHp'4!L. m[pN _.kDAE&˥,gSs;,fQTU9FOqI|* f| GA6}/A8a ܵQFhZD9"FҢ8-&kb:KYMt!qA)gTAH YL ~[sQ) %!mhEgD !ZZJNBH8O +,S+DK_IȘ/!X@w6mBlG.ԇFKjItQ10&3 # +ߥ D:=2U+ejI7(t^ +Bn-l%##4PSҾZ+)5#7Â|OjM=B|~@yw ,3I6$Q&~>=,Ab79ೇs*K 'WM TԐz)8DPIiˊ~ T7eY +oA#輫2o_cy leWqX3&.Uym$ЙXC;< 4j::j]x-B\Gr}uv|]\H7g0A@?>stream +0 @@&; @x7-*!9܅Η:ֿRV{t <]Yh&xeee8ˠҞ^G4=l-Bc ZɣgU xonCJ= +0oÒuQcVOALKk[(HdK0wDGuw˯0 S_S0 #w,ߟc~99\W}JQ6 \kp TC (8 +eGi<]A r2!ih t1r8?E1XfDs8FRO3+HkiܣEksg~n=8g \`eF6s%F=x&!~ \O |Y᥎%p^ = }z).c&E `,4挒_k7\o[W(GL+?榌O߀i?Y1!yNщ\ ؝Zp5[2Ai1n/ʳ*Yjma I'K], Η^t2ć ?d-%{SIV'ϸ[HEG7Kbʗ66kRhHտٿ*{\flDKƄ:TLv$y].a);o>8MhG̳It35R@n_v:{/h0_n/ىg6@u|/aMLK Јo[DR5cyl&:rheN7_bXu (Wq} ,k@#Zϗ +eRe*D[6& ܹEVJ&$ eNq瑁c|Fa c/91tdpS@pa`hgJg㍨ђY<ݺ@{{!k$1}A?~bwgC=t^"o Y6D&,l`;_W ʆ]&@K3F5KrP|ՊbTN(д&eÏ 'Ktns!k)ݯhfZ^D L\C.UɮU|'89G [s0O#4UTЕo|̗zA~CMҠ  {1ђ vC?GbtڢuKƲ XlsY qj4<d}FEiVfCoļ'npC[}m-A%OjEl*ov#J%sqM(0IF,w $ѡ*fb\׬׮K#ڤo/ ae+R_W{,97r<Ӳ?v6&IS0{ۉ4t3=M(C>J V^~ae`0#yoS@<O*u91na'fa$>`Bݒ':3ƾ^u\~SS3ξ죺?klT<נȑ{EAh0ՀׅzDgi}C:e~/<&̀x8Ə0'it>j-0_x+KR}hPkxsQ#IH_m>ތ|4 1ߩvx&eP=#YϾV *9e1D*IيZѬ@\tPq͍]{ްVś%L +yRR}b9<%bwF1V[0=NI(a.Om ) }Mu'S ooK-Sc(ΖK0t#A=sMEZ7:TAVyo삲W3dNҒel!ѓ>rj#?C Y'_D@ t)skB)X& L#eŠ~CCJ0|JH>吧 Y.zXҪ-z\;FaWP8ilpA#s1Aɥܼ9 /'>E2<cL$ĤͼRL SIyL׎r 'ښQuU6M*kRwx`niG;OkI v?gWS_QFl.ہt{cZtEӈlGf!W1 rōآ#e<5MxSzETO(F䘟S=YjΤӃ޴pЃ5\T.o!"HXӱEdχ.ť +?ݎJM[lV}ƘK;ic3Ge?b0D6z@%Id +Tf^뗜!QRuF? u` "\~{KP¶Z;KT3 Dq~_~q ZĖMQ${c4 Ă9σ#ֶm&o˔f}/qC!U"됐A`G0:3(,Cq.M +|qC\7vzz ǨgDŽ;|/|cC?C|Xak5 +)o+?L<w +CFȧiO+D'L'LB촎;9/_ܜ kEZAC/Ptn:vIR }:p2E%V娡—i2rE XJj^ʽ ^j|Ro_'+_ eb8vhQOp߸d +kJfǵZRuۈO$|#V3mSlKpldbg &適Ӓ8 I2{`}dճf +zAC@zTk|>7nm vr 0H`Zfy >Bs]/@`r3^&"+O湖W sYL~YƘOԽZ"sR8>?D}t(/vNMQF5sl#_RoFµՎ3!Xq$F9y.|ZHaamc(JT;`O[GTa@N|D2)B$Jm|Ods-8gY p˰'vYP#~WLGGT_G&M)Aܫ;aiK& Rה3;t<^Kϲc4~#Iq>Tw*2@TKL.?Wѿ慣mL'e 37{-5:өV%˖PYSSA鴤t2V K|Ym翹/A|CmXz0-L`A@pKwn +U<#+`zc8Mv,Sht/X8IIk-LxY*"Bw!zkW$0J_-q T z $k]kpnM 8N.6hpLމw +'lڅ߫.ƅ/GRo4#G4v?RMz; *&}qDdwXbߠ6)MKAI1Q`|Y]Jb&B ++n[it,qUҜMkt̮ +AX0GS[1~S-k+1!U0ކC][SF=5N H>V`r\I_Yz̊ 25(+r8EئET2hE-dM VιdU&"!X+zpd]MWȀ>TO+뉆0"yZ뫇$@yƁB14;o| )iV/;ey&YWSy<|吝^P4FL$ڨ4!<ܝ3y>uN-3\p=CSC\qbۆ +?rLyfoH>~yBPkVl3_$߳{T¿1@+$Ex搃""+zn<kӱ/ӤWػN>' +w-Z-5l-jp&Dnκv<{A߇,L9@+D4#&>qI$QWlY1__z櫏y1;)!YmJ(lCs+tWuiy-Xf5א?.+xƹZ "(K|~(5o;m(޶?q L`Ɛ5 446_&eU]gMZT0N' +PS0toV8\oS.@fUOsx)k(Rgc/ @.x?½p,kUb8K.Rha]XHSKrWݏYĂsV(lrɞҸ(`KjJ+LDe &N.[z}]Ag>Ϙ5(ud B%K^\n!<-6LrqYM\=tQ#fj%쾻r="L + Xwlt<ޔPM/z)朜!m:enD]0~o6w.?vgnꥃ/p<,vd]{nY"mէ1O{ȮSbr15neg zғjlcQQퟸ4E%H>p~ e)E"fdZ)6꭬zX.=U>Byy/9,L`v,c, Lk#Ffa| /Zk$&f̽fc{~:w-U<5 +Y@W6 +؋3mNHT1ú:r˨;7wWhK1@`KaG“|hΰj{d ~U4ᤑҎ[ 8&5u!i+&vHAݣ؄ӓmZV"Kdi: +I~H>~M{BW!KɔFyd^:Knyn'K<\0a4QЬ !c} R #:&sV=?]{4|ыZkyҳ.G:5oUX, :̖)fYg2g)? ‘7,5Xe*XJQ,PK%.RA`Y[/:l%2JV +G+n+iB1.Ϗeىt%v +odx JC 6wQ(LhXci\XiQ5Kb^KbVI_IJ옃 wl CX5<&УV hL2s:^avPW"]j{F%ܺ| =WrI'x 3UZ.lZV㋩S[lˆ1Ks7ehTG4[hfi>4$式!0@TR"ŸX$ >5c`i! uAC(9U"MHW:0 W4k}H3}^Bi1rO[  >Vp-$ՠ < F$G=aYǐ[|-QEmNw? .Ps\:.А%V<]҇!|F'|TJl}u$P;R@t و|RQpm~Kw⨑ȫ)`c2x]" m0n $ )>Y\$\rU6Dq1hbpy]% xN(ݮe-ƴ덼ciBx,6F"rɚ$O uwg f4rHf +CnZp~R??*ЈKb]%O84aq[[!89Km6 +|P~[Aȋ|xϓ57ġV(V,}o'w̶KCVYv OP|$rßg!KH6^{\ߪP5Z`ǮViqvtƂQތCdgo O*V-LX@oR㱓pـsRd g,1ĐDunׇp rwPcFH<`X=ubg bya =yms\̢dtb т*d/@鈸~JTedt"f~ M^uxM_MG;HIҏPzե=sF0%f9-~gq^ֺ4SFʁEj#dijWnVlš5Xf&"77^#MKi){߁ol̫%g FK\~Cv}[߃S]< |ېmcq!-るeóˁc6SԽZRH?j"P G< :T + w\XfKiDl0<$\2(a ZPQY"I5+CD1|LHM=ܟHC&¯gfMwmգTV4u\ek&(+¹-!29aZsW#ċ5vtws.R&nna@KQXᲚ& #/DAr'v"LSl'6 KqPQOq3pw7]U=." ' + ۽m'o=UHndQ$e$[%j =2D\^OzdFSQsYwՖ-)t( mPc0>Q!~GEo5fb(`;zddyڝ|h[^0щ82;CqI]Kr7{RQO1=F]`sVR9q|9<iJՓyN=aS5XWb388D tPIF r=|<=0r·mE%T:Bb|EVmXipEA ,lvцprꁺgE.enYXo+?CY%`gzi""i!휪3z}]kns9BɼҮ5\p78- v$btdO~{s$^ۅ8{ 5۫>J~VB@lWlp=j mZV" )e38fE0{}Fj8hilMJօ~6ɽi[=k0hB,`&XWWD2>NE Ey`Z{/@ذKL(UB:SehțfzZKjE0X4XnZe .@gPWuO04ε A&2@l;ܶs/3ނ鼹E|@a`eQ;o24Z悹nĀ 4mx2X }JU>9 c6qۂ &ǹ|iW%Y)vWZ-f3`  sf, &lMڪDqa 덵0Fsbe/3(Ay\/&BP>ۓn"۾jbY?(=9=XX[ 㽥b2YdVzǶ6^u`ͣ&ۙëlcbH)b[,#T@p%@N n&4ǵƗx1;!9k?S)P6pxMqeΖ{AMRy?}1ff"0i{JT3:̀?aћWHQ5 R}b%7u )菳d5:tmEǒ}O#"'M1!tJ2~Ih4~hͨ:emcbQhs-NKLolM^0c &j:3ZM1TbxB_XѭDsXCr}(ߣ'w+-1w`zq[:Rԥ(Xf.$s}E%937{s/9؄w +`HRڏY:ͭ݃خAZ 2p-iq)f;s##DR$rK2¶XZ'uj?s w#Q68/_eivWSoe=htf 7K;yhm#VƜxw"G6PȧOitdHTC?ۄmA/.Wv* z!$%Ձx+^&m+e((Jluk ?߶Edaj]Ӧd" ;Ng29}ot3`/~4{cc#nauJ6~YNwl@Vک^SK;nᒱ{$4~J%8 Ѿ/=4 ^->Ky-chEQX3ra:ɦV-jE!ُhzx}DH#pC.Ĝ'^Rah&INt mX*v(q"?8Й$!>ZPSZp;>3dX9XwӽN S99LigE()=6^$b۲g0z_P0<}}qtR"S p.;3BĐ+`+0! +B}[Ej9ހjW$V!J1$}cHJ(F5~(NII^?tERz>Ӭ`A"LB{\BoT-LhxH9>PZ)Jp/pr>^ +Њ]]pe k&^$iu@խfBArс!]`$F%jsDX| aƙ? [oN8%aZ +m?nmQNʈ|nD\iV4ļTujˍCJR'l6f%p`QGo._[73#p)TMfeVZĚgIW=-,Gm;SL.;%=Sa~\wW!spuFe{$Ljj]U뛞W8 T*9QT[L@{L=6$dik 2ib> &>tMX~,{˒@ )"͜ce oQ7<6ٙ0y;˙7Mxw] Wu}v;' 0uSS@ W4s jf8ll1 +KDGPΕyW!nͨ,a8G 5OuH Gǜ+^fFK4UC N+JSV7?M .GPl+k]}0υtSH+rS̀ @OqVUT\ YL IX;$Bl,OIKч NZnH!E_mǺo40Tq.zpmn{В`C?|Rjs|? FH2|W2J3"T S4&:Sus98)$VA46ۖbcY1x*.jQC|t$AGV8z"S\s.-H얆~sex/*l'NDHރN( s@ DGD-5Ϝ&-jru!0okZ^yDf՜TZ*GD+(FѸjDz\`U禅dS }O ѭc9 T[‘27շ +kKj>?"e*>`/ J. YXS@$q.jNo?/LqFSW;cvi9XjpJZb.eKw蔑w+!r4DT%u2['e묌:uIK)lq/ *U @@,rqʳ&jcZ0iQi_A5Odgze˖Y#G4$_55(D+I" ww&G[ z><0)iNVdNᩄowe\%r?ՂqG0=__BfN8O /E?vyˆ9]]ۊ)W1im}4ŏ3^TܓWyt;8 |rYzlNg9=g'AvM!$LHq]]HURΑπ*bQd] +SX*Den1x1Fʙt}2^( X Ԧj)Y7'(w@]O-0|Iؘ'kTxW/v$6l^og '<6l`yÖ3<.ӌ6l(~;ea_T]lzU$~[ 1+7|\,tJutnCjeY<"݁CT 65ɋ!~<_X'2nBwO#Ψ%Gj=g|@-.7ޞ' rt,?IDIF1877d!3NkwiZkrv'1Xަ:&4v?9G eW̜Їo{oiǯwY#!a=v D!;^m^L_Q Fl&̀iӵjα} T͘/6=D&2s1/Z6F6kN:6S˹# Բ]>ѱW)j|~!X^S: u}*38zcg[쉪Z MtfOA:y@ j ]vdVTGf0p,-_\Ca:. *< qy8?MN4C!%)?i,ht%'pZM8fRw.E{0 +@~ܢ(Z5H1ߵTƠMMj +~ӔXDvApcbHm'VW! 򦓭ڔAgqIGKj]"eq-3bA@(m.ʩI T2Yr^ǖƮ #@pZ~|/ _Ge%hd)ƮWcsJ2%;麧GY^eO[XLUZ>/{A{(-hO2 S`sto8*{zm%xbtÞ]ɺ'7U}k7V5Vŭh`bD#5&_ z,%wƓ~#*7`zyˑZUX 'k62>XjfV(j6Ղ{0Es +MXMJ5rl-E%ym ay~R"'PmlC>wKIkc I? endstream endobj 3540 0 obj <> endobj 3541 0 obj <> endobj 3542 0 obj <> endobj 3543 0 obj <> endobj 3532 0 obj <>stream +HWnF}W>؀Dbb;`! + Gbf%GQ&_jx`S&)!ZY(/#P;?{۳}\[) X ^”>DiT!--V7?^XoW;_./E)96go]uMuᐻy6\dJ01%drcuûº㬤ۦ;'R1gh|̚pͶ 3TC҆CH*gZbz_[R!UId2|6t1&g!CJD$)IfR 4PZ>-.ZGQ>Y&vkta*94" *7 J+e:BWl:"T2æP U3'5TM5ʕ5i5+ձwϟ  mxk! PATB 9eD,E,E-J5 +)J:KZg_2“" +6y? +f.6F\5tG7NOGإLj.2"O,!@wsjTiKALԎvGZHLȁ&|חoc^Kn!TN3jbțXMF{pϦ`Rx0]!g?R%"aHڽ_"WE`49LޏT]W~ 1,,֬T.gW+f@Jcm 1 㘟G_?XG;e{7"-`hx#,1`Q[eQpi7(TԤw,cW}B7cE)ˑ4-HH2#0?$8Doaz@KfmYIl'6>Dy|YQk7 +=#5pp~ K: XHЈm!k_촐2w9'Xat\zMY΍ $,4ӏ=Q 3լCQʯmOM{FӅ3\ode/9c?4jg P2a + !KGsz + eA(U~8sS^(kEZ@:TiiDBF0Dњa, frmw>É^b)űNs0CxT]?SڷJ3bRYc( MGu[ucݝO_)!?hXdd +[ M\@^RtvO4NP4GAE(f + x@!hpxXh//!1"DUgx~?߼h,BR vW?fDu{֐d-,|{sbA)mdJ{'[QZgP5_9Ës8?Up Hczfa51tx +2튬(>XֿԌ;~ˇDX8pZ4hJvKoLcӢ 6H`i 8bLⒸTd٫db΢0[A̱?٘ 5QHi +LZK>BAMyg&uj* *9~n.M+mv,9ジU6F9 "SMJOfu]1hjP)+m8XgUfQ%'c[|5˹/tPVcnudRN0 +ŝ%LxX̂RbKìñj~Lp&y]}>LKʗCb"KUl-W2FB?OV%EJο#+<^^TiRV8 +xs*W>9/}Eq~i:z%[tQ\`Tr^Xr>ITFW;B b#-_2 ˟-"U; eQ*ǹǻ2O[24퇲REa`;Ru(jTTb実ALY &i +,(]x0 |u6+۵au3^%xض-)2ھ<P`S""R_8 J臄?8> "8*`'EGkP(Is/]0.\Mq +^UﺹmmZDZ%7uJ/K'6w>o}۝fKɩ+6ߴ1C/-긻 +=&;Y"%ZmAľl5VX6)H"/O |=sQ(%vdf€ H)L,q~xO3#UHs0ʝ]WΑ ڴ5ǩka/цgv1tލUzsq^v 0~piS=@)RI}K58&1tSebkmD⿛D2gNŖ_6?l9e"@2ʓ l-PQ5V NcQF* /0Bcgƣ&Fˍ;^9*U _tZ= 9 $(KNBi(R$}mƸf=F6Wc tvnzˢN9oiq +3AMӂz /V/A&+>)/.e_@ÖoKq=>qXGȣבQu6M +zˏ@ !>f endstream endobj 3538 0 obj <>stream +0 Q@&`? Qf^Y{) pY$pp&2M }Xo6A:-su}\X?`Tmg7 +ʪV 2Ve)\1쩿 CzM:Ę0E֑Y ܬXQXn"|# CIiQO6jU ZaHw+ 4ywҦh1j׼Glf6{ԃʳtzclkp|p>MBk{pݫOFmݐʾ;NѪA]{ߪp+B_CLvF<0+e َԱ+k6vI99IJv?92yO<}UbnnnmXMF?LxVdw 7ˁXvY}>f}umKM<#,M +z) _sˠ@wJ+||~H & +bpgB僢g@9vѓȽEZZ!X=ؠŏBL.a֊4u[MmtV"5a۔P=)!h`08!ˬ*Rߕ~ ",9XuS|c1z=8A +](\&wQuݦOH)% +=`OG8Oh"Kf|ڕ^Ezw}T-bV2S锡ñ0 cZqccڽMQ]#'#g}.M +}hlTEG*N>ڐ@o,qq I|#Dq3ϑ6>@a~;X B\CfN{IB$ԕb2,@X0*/nu<ρHxzcqjr1`s ˂&CS͙ʖf]ɟLz L.u'*pnT'н˥Fڴ# t.%ֻ8v4VZ f>Vgg9`|Gn~܋}ބ D{ +Aa6<)ubbMA܈kӻkPq"5 Zb +BcUnsiR\זD=[8^0n݉DMkSW(?I4l8+ގ*qD?N۪%$Q1HNݚʕ9Aa+m醘6үC65li6>ExD] /5 jߑ~FVUyWzOqt1sU NT"ic*IQ'~O颒r&,4oRTCGR|o4کZS9"4 zPp>Ifބ`H*TezSKD,;THO8\ַEg j ƿx|:>|(66Ȱw煇z#fnĭftq +'BLx*~Q}n~|"t(=yH_η1)gXn3v x7ًt@^s\O5 1U-.K| ؾ}Ԭ.}k562\/ħF(kӆV-2](YaŲ!qՠd\iɸ< 4^Aw QlVGh1ړOu(Gi'B{גAFI>AY`{VX }bO5\OFi XrDŽOå%܃Fcr%Cg'cx ({3eqTramam#@  4 O3$"ڶ@af?I6P]B$k%vm, @yˈSB +ɢ0,Vƕb_2KSfw6vo,u<2`F +KP`TTL[eYCu09,Yǧ:8V;29m]嘩Ma#r +m):Ġ&e@T?Zk{YBP6{;ZA-fKGs +8G+%ze#|PԘD\?wH(mKTi!yA:{^+__G>j=޼ZOSwq''9!a=}^D-`\`\$G%Ɗ +V:.$N6ݖ7LMNRG/xTc4^1]3{~HūҤ9βfM6vc9Jc+Rk @$1w' ڲ*vGBqөx6I|L4ޘ`6V٢ҷJ.f[79ufXmkWCw +s7yf<Oy _zۏդ̌ȓ9VvP;L:C<)ZMOCfs_wb5B3reHm!Dw* =ҭDN|=H1g]boQ̲5+#7-= `ood.iK%Sv@{ajT(J.R:T> Nݰ/2QЏ4/Ǡԉ%iY(%v>E!X(Q 6V5)Q@ʄGӌQ;AӖ) +-ܧ<\jkFx@VG +tR\G$*r޵k274>NViIq8t1W| +xF+_646yvœbgL/;nQ}x--fݹ#kZ$@]ӹ8NEvHrg^9x`62*U! +ĂP0=ph)ہLbӑ(u36l!O3MsJԑ}mІ>JNcx +*#Jqp֨sK5.ÚRb=a%d;;]ڤXLpVu@Ex_|3imTÖSSnBQvVϹdCܒ[euDpe.Xw0g+~܉{v;U0 <_:FiD9 \ _UBaslqp-L<K+S1N~kD-PI( +M~p}sE?h(q{ۡ֔b#g-}>DEfTLݜ;Xu-iE~jW%&S䔱$t"H?@o%ӐBK?$8ؖZ|>Ǡޤ(ћ$jvP;zPx I DEEH(TDg7_9H"+ +sCkha|XeyVc_|EJ˓0PQQxqF1l*„,$6oRX)Y{NYT.ຉ A6$ZdS?(m Ցcg70`7xB=:o$L9r#߮[س+,7{_ZuPOƱБ.85 /o&؝+!.ecESI Su=9×պa> I=6푏b;֎P]f +.+zcf|A2ko_@b~|=O6!5HCkUS>lE%2tT@ฏ=,kh/_i/ +@+tb1﹊!y[LRi*5os۟!;]žIC{țxBb;'WFbt:F0Gz,:5=Y.ݠjma{=_6++CN1)S-FI3MmRG[h=vٿXNQٜbHF>uaPJIoKz#3hu/xL6V6[64rX?48':ZtYPS8ΚC­3O i•45? SR=EVAIB9ȃ̰^"C6D쟄k~wiŪ|TUs ]&IOXi|E6\l.jy3Uf$ݦ s)(M+g[ R)}=x]d Bw0?~4jD&m#29NfJ16߬Z DLTk Y=*;=X"}s@bsWy3́[%f𲱻Ւ2uX.cTU^ '0;|C2:gQ:y_9I-2 :\T ^e))J2ڈ6sxHCşOM "X 0DC_M"Y43խ%/G:,?Ӓ AP)C}z_lPk8 yߥ&Gࠈ&4p @AQ6M{R6מ +ze<)B0Gv)=iHq >yBw'0`0n*Y!Pa3 +xdQ0T.%qPB޶/eEllҫ+/^ &!h`U^߸SpVN4k+τn 2+4D +\xr ɔGJuO!aVVԚtQקu0[%g;)Y#!V{׿sX)-wT<;:E]<@:w8~c +)w:F)~L%֐:1] Jy&y&펠|}T +Ѵ_%FtLR!waY(<_b:HiE6^""RdbiGH?\Z *AZ: +TO}:cM*8oUqy%QN^DO ܗTYBvKLBP^d^G|%RB'&(_.Ǿcf4R{P-('ޤ :r3n4)w͊fY'_N%Auc*`yڀ?gQ1߹A~1_w:d:ԇZe_:z ޺"[TF~"GYCs'}$]`&89ŮU& ?|yfvQV|$ep⾀_EXz3ClGw3437ǓXɌ6hzjj-/VW-ݺbK B|`\Q/W'1L G$ Ht= B72:=5%/;á͟+>m,wѼ~ 1clj#֞6#nK? ȩ' |:~n3{B +,Oat$}5-򜡎ƻﯜ V]KQC6MF-h < +"kJA" +yl@EAsԉuN`M2 ^"ce3oF{T:(ǣ +bi~f0{|1bÖ䑊 +Qx:^Т~).!a\ǁxj:} +_χݕ˥VMFSUK Q|5@H"Iy=oekاA*y%:u[N0GH<Fc\e].V=.^m('0y4h9. ە剏Q31_vM^7IeoexSfDrq4TM/{05.09ԷܾF8vI9OHLޣ+%s/L +uL[k>A2=2/zo~ώLJ3/i~V<-uΥwQXL9aExVBۛ\y&"ȒO&𛖠,0ա"mNcT nngIpffD2M>>@Tlo$MҠ|?tՠaW2#-v-,Zv_Cc,G@?{fBؗ!ΐՊSeUօQԬْ_.sqEyUXhS3,ؼ481ʑ]3Vmpt:G%Nԥ6ٕ~֞ DH<'V:klNȳHSjhp Ö?))Yȕn +xwɐ fe'vo|9B~*M62 5=6ܬCkJ-s6[ui6CQV\Yb%`Xyv O3–DqtTk)d-4Ԩ|O`…̖M + 5~*[$B)xf R[b7*؂)ⲧ& v"zB F jJ+^N>O\ >'~93pIUoC}cit֗>@ Cr'nc#/@#?kM0fX~ g \pq? HG yp:<7$`-~l=5D'":vP}}$ڲ&\Ϙw8ъI`m\E"ʷq-f+C2@:U$- w\Ќ.i +B*|_v34#މ2Wnx{>4texUȤ>Q/{k2oJfOBXz$QH\{ +4 +K*ɰЧTA{un'cy[od7FSMv=F"[P*InTI[NGh61׾5hs,bm16lzW0#bk.8>SS\>vBXw.t ){D:9ڿ,J 6']!y"4;[y}!ދԊlJ9psV=\yy ˷B?Ͻ5+M2=cx@U4e T1^&`Bf+ v%4'=u<bm K/voZnTNDt +EVWu|F8ut`rRou</DB&u 5cA2!x^Vi/ aٿ4fѷ[wbNiQz> gLU'}Sgk!Pmw'a- Cp72H;gf7ěyύOw[eIZB1~ћ^M^,s^(>~m+:QdBL5oy/ss +|Ah!v;05HC ȕt&>ߧE-`xu[+2|&0RWH K: F7A6,iSC>o–?G:J9t#LOwZՖhAhe:DGW%xc%S \մP|Ͱְ[4@n)e9I o +мːAϧRߖQI% 6bAU;lvR$P`,&yy;F=c׮|7A;t ߒR빗%qZx;kr`h?7=o zgOy͠)ZR%f77òvk:(S1%Q̆(s>/멐56uאF´y81Eᣳ&pZklZ!Ked i#ixN-^4:8 +eޥہK"1VI*}OS mc2p=ɦ&jՓg*QGzr&@ެc]K +z-M6\$Tdӥdk/=0>e*Ei_WkRvcT>/kkCD%lęJ5~J~6uf&hڌA 1SYոc`e>T1ԸUWܭ5EڱdC+Eۏ@}Җ:Ѭ^C,6}ahkFG-Îe,D}D΄RY +h&O Nc{x rgqo#L]_ZAۃ5 ̺NUN# ++f.nYteĩB%dst,QIg ~m4]IÈ>UƸQ1!t";ݤF)?h\yL3o7m9!(3~ԏƺOC]jm\ϐF>gA%Yu #2ܶ7kF@m^&RYJ~cť={5"aBgv#{ w<q݇[&(/_/vMw> +_썖 7iq|F1X(LP4~1RL*[ᶐJMI(a,ATxy73JF#aMόv%nݴZ"֫PRyUB_#CN1_q+.0x ՚&1MD9bה>'*.jzGثӥ鴧P)P ةlRHտ̉`8Tni^cq--_ApǰId#x))eݏƍOstu=f-nG8.< +*ݐO&GzGM6X8 ,͵8:4o8blΉg"gx͉Ysxg}]n/ /l874X zьlk0B8BqZO0DX?,S{>!gU0 >BFُ>~qD@?qmڈT[01a>s;p„FY}2ʼnժ +l(Gkt%]mriJ5l7YhJAKQcpצLmo( ?/O4VhDJpOJE!^ rW'VW6=~1m*Q̲sh-HJ0J)mQg>(] w Jt% +; 89sKU<_,}P7eQh0oڴF"d-"Òe)ㅴ~@ecQ<-6V>jِwrM {8, */JK-f`?}8+ ktDX\'c0~ܶ|*By[qy#6q{+@k0mι٦V< +[JYw>aևg@4ε'g$3Fk*PѣYh1us%3ə$b0K{KwfA^Ku/y;g]iUw^_Gx1|~G̕1Iac`cO 槃R#TV]Y}3~ qr02tv肗'C8nʽrb31_(Rb 5!2 fOY 5BOM*F<: +3`Ch^G[H }Ĝ>;DqTꪘ}բ*U)ڹ-̠aRi6o` /Q)ŋ ҂j3fOEE ]y3H~Lϔ%VyGa̒&8<]▟km?ob~48Cl C>a-iԑeBWTojS^?byjc"v\ۓ=P,ˮ`t*gB,r_,Rt}, TTCH;f<]]A']r"2wxk$Ć#=zv>LVdazTK*H%qyg.BBJ?sb֞{=Q=w};$pFA/R yndj~ +x[뚰d2r\_Y,ۮEMH8䴙X>L`@)cD ҩa8,MBejh# >Fܔ |p\MzՈo:n5㔘+r5Tt7jWgTt4ő|Ȕx(==G ͽbܘlɸf&]%f#6}qOi[8hC7:5`7*ΓVU Izlx'z;߂zzUf7j܈ƿL`Y-?2bb|޴ʼÑwʼn: 1]$ WN5 ֍)u>Osm_deP3V>Yǎ)Ko0*CQ6+ҶfMacj7|k̃j~Y))8<` `綹{L|\Hb?8xJRgqz|~&R2%<4z="`R?66Hi&q"\bzB[us6.A[ K菎ZH~d;;/N}WM,)ԾSkѝ $E`ݶPnWތ RL?CFrA,fu (w)A"ݣk#퐭q-E#/=u֞WGU7&ՅG2Ka-\"^ +3~=0L7X| slP?Ɔ7aV3u{9y<} &O(~^]2.g*) +{hc{2.kv>m92$lbpP +nW,~i0yGf"D\FKy틣Ǽd¾k֔먝_^3~-f4-֋x8ts'h("OM{&-A|u 1V[(^Rfx%Ҹtq:nv?o&l&8NY4dS]ب+&߈)^e/|K :(4 +R{MfzǴ gr +eiM8Z̺vpؓ8yE;!Ww:jk&Yf<ཡA5y%W`F+QR?2tNۣ_WM1%<%2wtN LI b}8N&323pV'-Nl,}GJ{bI vEd +ڋ{Ea(uC{mۡ$R=ƃbh Nˑ!j)Xh$O U5hDhwLFWƒ!Xa뜴 +/72k׎_p`_öjAYZ qµ,WG:$XDT9e~&GfT+;BC Ii!4}P 6I0:Q*C{Q~MN.!(æ +E$=iwrdF +9U4!:Q;$gX|Fg'kg*7oUUORLׄ$cҎo1xb)?BgE¢cH`L K.j'~2ScvA /O.&n#a4oqڠ/hF6ũ鬡Zt+z%qkGS^4DY]$/[Ώ&d@'\|MQ )GΨTH{by"󄑑I{NATvS(}G.jR(VEx+xD0݄ 1xE@lqk?7Td_rޞ2~\Pzivsl!w1Mz(fU|?SZ 2cԉA4_FɝQ~10°=S&.wgS~a ;J-~:m+\Gv &_-̹,a„3FY\mٱ X0 yR=琔UōlP齯dBaTyDI kT + gE lVx-:@-4ZCsu麌b};CC*ft!:+)Q^)n}\ c\uW% +'D|)/( 8P + ;h5ڇBy1f1;R#"I47Wi*PĽp4Ag3h +1 D.5P݌߿<,^THj8mQ=XPxo舱6>.$A&rM#EH]lx&j%"R1!nt~X(|)tFW(*Y +J<\XqFR6uzi=9u 57wPY4뇖MF1f9(<FOytdyF`ڑݒ,OșZ䳦9({27kHWNI e9Gs|q2Rp*]/gdp9!X'c:K{*,j8#%GNKom8 LZb_k;%M_Blsw!oz5&cjbb1M=#lQ+e}F%Dap3h3{ez2z LS ^>K쐓1gџQ,N-# 5a]'̲|!yH*++W7dg[;(nyldY5aAQTat0vjT ω2; c*>O-.^j|McQI) 9usrXDbrTR%f+9 I4uIϛy\ū%-;jŵ(i;J.#F5yVbP;gD&3ge.q% +Ǡsl{GrůjnT!?znJtߖғYox5"dH,fÍ}N\>k7F{m\0NEɨ io8T(%@2--4n'ճ;;Rv+S,Ji^,q;`OR`F=dj%@ AVFI/z1Iy \B.>ĭ?g ~PJTJN3uOeFpCj,ѴVjӉ1l]9-6X$'/o{.PhNP$ V\j-أ7dWuOZwf + +g`?^Gӎ(5;/K(Vl>7H6A?q$%h = &I T#.S +d1 ڃ|V +|AYt3sZO+Mn^@± ޳ǮfGB(*٫'1{s̥O;\T;Su2{d/TUEqѦFTB츝|VIQpvyU "L?P%קx\g_G{ "&1Ѕm6#~!e{*TyMغwa KP eM5>`s~b,(P|4]p-n /-w@SjlBP=Nyd727LhXtjPfvEn?F*Uҹ6^jk@B^8d'trVe}ƯČ@k3/JȀnM,t,=-8/IPiX7~ۦcCwy^ecx5)jvcF*1Vr)ɽq|VQ=liw) X W!raKeo >m~vaf*\Hx4ka+i}q1^a,jt pD{#vELN5)itp[ej{Ͼx +p>_-3γFQs}ឹ""]i[x({}29.'K 3MDWܗ ?6_|^EWf>W3xxvW, l݅/)u$0u%ͧς[>RZG6+"щhѭ5.fvN45c1 g0ABH!Mߥ@Va`r;51S8e(9.Pa\㞚C-5Π^L:'!?+)=XiR $yaq QXǁ,x2p,sm!O6vxzRX"lUtnQU_(5Qb+_~|Q*+~|D#|u?b#q<,@ޗoaÈt ++i֣S&1% ⪋en)_1=|1 y3E3hFϪ km;cJm'[TIh&!* +˶Q/*1cY>b6Qʓ&QE%d/~:3]PhSk+.ߖ8G&qQ;cŧf?.zy,{H}\pW- (ch@>/i#g-28IZ_=g`=}fQ &-ɦ< Ҷ }#Lǥ`F0!ϸ֨Hy- +.hJpo[UFGGEid_ESMbOL-?`qUR K+_7F6'(>Wّ=TlA3\7:rm弤y-Ahqқ@:^-5\W a*`ܒ,kGbj_wUr'= +}#< J S](&Kɬ3;XDݦl0NlCE sE9dIT`z]x: lmLpND03)[_`E7zġ>-7Rw=z7%(2h: +ߋG<3N^ra#F-%L,y5ݨ8cgVt]#ƋѡnT쥝8@0.X^m>(!) hV[45/ߦE:+~{ТG[ͼ=>N{4J D&'c|wK_jՔm;4з0.p,!GE=gd.'X 6OtSc ph2w'ha7猛e=H7^?D-SQ,jpo#cUݽLa)j N/::ʿMoLHU$E)s;'ϊFZg(*p>z!EX܊H5dVZ]'4w~qOKҽSxNykOoNM„MC XA[uEdze+y ZRRVҥ'63%_?{S;͊׳y󶈫Of r€d$?Zh'O1Lo+?t!op18lpjّ(*10͜ZkS9_l5TS%oW}Bu6:P:ddFb%?Gh ~;E5R/n<؇'i'$ Z!1o{ktM +2#m/>>~%ElH)5!Fx ]"HQyX⠞cg4BOٷЉEl؛ Ile!~Ajš6%jɈ4Ew5Hp*\.aN1eu{8M^Zl5H5' 5<[TdiCk>=q.iJǪD98a>y fVG b)UrjWo|$O6pL[+z>>X+fU"SyR/>]2~ԓN?V +' 6oH ʧVv.dY0 ]ߴg]ǛW9A{nT4{  "?\]ā@h7ziZoEٶ^bXMߧmz&c:3;3i  endstream endobj 3533 0 obj <> endobj 3534 0 obj <> endobj 3535 0 obj <> endobj 3536 0 obj <> endobj 3537 0 obj <> endobj 3525 0 obj <>stream +HWmo_qZHJξp$GʹE-DJbA*EͿQ$8b&73;;3wGz˸Kpcp6/ow^d󷝟F;/Go@3ftfj3υ>FKdg7۝l3L3t<9;9O^A1eBQoG1_聯ի~q)_Ṕ%'+*w̤TgW){;QgFg+|\]v ŧ)bjGrM9^<ӝ47Ԕؕjf3 +~"Dj]p[{E8YG'{wlK.qw4x%\^2i_tn y5#9J!L +jPb9s:4.p:q?=hXcmi HP$H)ZO{?Pϣwς bZ_QN:v$7'GȀ29GD;$s%(㘇3%phOqֿ1Tn("94})Ȼ΄,xFx?n .Q, è;KnV9SY//g&C"z!!17Wx[FW{ {Z(`}d#Z3Zd@`(Q l\E1 +56nD%vWDʀvDp傺 -\z{f;9L>0M '2LHvD!n0]z +- $qDB5EKun)paX\SX=TZ>^-WtebiCji4nL4lL$鰁H4Iob»MיjVT^|+ -ӬVr QwtmXZ +72H9O"|a{ 4HCz%]؇oSh!B+LU6'qe2.ES5u6BvbW:Q:O Vw `]h:" •@_uьJ3;VoyNU'1ʠC@3z9| `LH+ȗU,o7qI[o:ZTߝiqI^Wȋw wXₐ jKOw= +O_-vwh93Ht!1/sU%,%c݁Ѕ6qh"@)3TӍ +ChPeP%'+gؼwj|[t1'kRd}ʝJo^.oPN*1"OhbdCKdZ#W~729aۓ'=KVM SNݎ~eĎodl͙A4gz]bTDmz=$*9s +ǎ29;Q=wrUяEpLxכhQ~~S\]Rj:TV:7y Ԁiƕ0gwX甩}%Zl-Hn1rz8Xf(!sc[//~p¦"qkle:HjIJEe?8׆BaEOšP>.-Y +HdL2#@18NA`71ꁴьij6OE~Ӥ6$ Hݧh`IUEx"zN::b?^ǫA[CZnB2Ii)-"PmP"X(e.W"Yx6f<`^iX-* ;;OwVՎu@F)L߉<hW% CFNihtCWzh|AT`kO 2I# +]ۚ Rrjg36FQ<>C2vJTH"5t=[.NAʐP=]FJY~]giD&\){ /R6|:%im~S*hHR>/l]`AXONCq䥦ޗzXh4ؤ BsS{~z};]T" {!:h>stream +0 D@&C D L$2ū ӎŒ6"q0΢RedYHFe>m5؆OCLnT+L^p/`)0Op,fؤĢ@0 +jZbA( i| Boh!*^ԇ" Kv35>,f^+O; @bq̣?yl=B-O|i"P$ޒ\b +eВ56NfVD0'ß`u7Hx2:ö́I7_@]D䅇A[ +[0 :KB\5R@,0lUCOaUbͅ˾z%}[9 $z4Gn ؍$TS=$T:Nz6CF$$J:ؿ]"JN3,y~½K0 + +KlrF?M|E]-n`oYF#ăї *̶;sҎzwNwnO??äaCL'n&?a V=7G*-R?{A<(] wbW]6J7װ/\㧶6T-l{84n$) OF&ΥMUJ"=$)PW!ZȧTX3ۈK @uՖ[$`7 +.;rJc>SZBMaX~(('z;G75l8PYz?'UQz&ny|J!8=aWSvW^)mr1 +DVed|juBVs[5Մz S#R; +F`v#Tnhٴ+SP7U[ \>|N' -ƣ{=˼t>CKIk޻Ʋ=:m!hu,Wǀ+VhCdլwWP: ]&.  +G&?L~rܕֈ0Gx]sɛ 䀬r)H\:|/u!ٯq5Yt4F2Ex;jӋ1w +I,ߋ[3҅qkpza)a(m.OBDޒ)-{z SZڻ+# +G* -<$)7Mn@o㶚A)FKx])*RI86.P}?NJHȎ yT qgLdH@W8;Ov^@9+p1S̠.4 qd3ZJ!S5^DKbgUS]1N>r4sCA'Y$dvкAQo?S _Y%ɠ#׷4ݚBPi$%))A.O"焛˪87a]Vj⟎>"M"nڔZ<⡖oϜlȫ{a &fa;Gɿ{|4yzZ HAYqoԒ7wwvEnDg;jGcoψD? +X}vl3]ЗpSo4/=@wAVꚶXMW9-[|`Lb$P[̯$- 7Ք pVW0dݠQ_k A*;&yގa*|/ ®{Ed5oIRQKDu +y +IJyeecFbOX1܉%ĜgjlrAwkIOWȕ@ϐpO;y +~OC1>ы~Fq6~~!˷YdElo-tEA$|x/pSEx81Bs^هh~ )'.,juYI2Cfo@R!v.Edugb=6qBS6'ȅ#dp#mNqgr#U(;21oЇ vbYgOB[i˳}I .xS+F'Aԗsw-9=l/VV 9YTsh2et?^gs߽uA \3<)y4B`&.;I^ӵ`|ʓ;`ڗ]~:#L(TVgQ +~,Jq ~wV)MF,Y{6$,iփ~ y. mpt.9Ke@ȅ'ĩRKKĩ@/Q1=̧!# O\QVh/Y_&F0j+$L徻6Y`D%@L!b$@>QKTZD[B▐m{qª&n'bmu( +ioB2!D6?opr +TKf]Wi ;FCPsbpzYAښgYao`^V;CDddX+{sj_iokaщ$,x"߂ ڣjixIn"?RQV'#S*jĮ祭w^e8LT<#e6{ Yzu(M(glЇ FJH3y k vȒ%pW)9KypL4~#lwaPDװ鹶!y+[`K>nX M}ؘdf,, + =!= 4b +dӘê$N[eCw$3+A \wKrvV'F%3/hB3wq|AdL<9u2/AtrX9:gp7#M >jiy\*9_SlB|=a = e*wJ}40VDmj-%NGM[1k?$M-%8c0Pvۇ.MBx9B 8XOZTlqXm휭k; rEHRyxr 3Wŗz<鑤2dpШF/E2wxH] `m[A D|%!FnqՔYCEMʖnAŖ6ܔWFcp%?ߕplH Dֹ0zp5Ң9,:`#=خh$!nTrC/>PZRj_A-Ƌ ++ zĵVk$wXVhCi@5EfB2:RΨWS6@ ~:xe|wP,i'`nhV=M/f9Etyb>t@Z9?(/y% "sD'slӅ-O;#QSFTp誎^ݖA;RPu!H C§j&j;H_Te-}p?':sQ^-Fqz$pv1xn ƑN;Ԁ&gwvr "a7N/II{9%)sAypV(lJq~3cC0b7y!fͅSCu$i.>4ٝ$7>$wF7XYJ|3uQs5$OaK+P0RVt_8/:| [t[}G`cw +4ֽӥ U \n *cP0}>0~O@).ߗd%@AJ!h)uUp_Gd\i^_%Ձa{^wc`}0A!Uwqw>]UP"£*T>Z2`_5{IZb+ -~4&#{5ЕR_%=篠@z⯃oj썹y?}߰NNGmM;>V|;X:ÞuC.{0|# ]瓥 wV`hfzns׎ POo;Yh++!7oyy%Mx'[L mqneb鑒d֓ fot*`4(I66'k(hCwjkX297FM*j=_:%/dCmg3F=%E`G/yzܛ wE .ǝ: .S44s HorDDT2HelnܩgPoȍkG+](w|y6,RpaykTm6:uD[bcL;XxTIљ q{"6>PHJEUu qT +q+j<=5|إ9k~וȈ0o>0\7 qâ/l:سdlO',c<|i[YY͠=~Ђ#*` YʾJ!9t'qɌ瀝%u6e`ԫ4Jl5 S<޾QoIok uE+팳sf#i=,"Mm}UDۃT3- G? 䦯~3l2c&[ilg .,EA}2RM6@-Zg%V6ݓ^N0~i%>BSyUr";NS@ 氇IYH:#:hVb7{^Wǂ, m:}>I{⢋õB64&v(`)RGmYR&$ۂ%!H6^EaGRZF>L9?8TqsK䯬_7O_g}Zz2H&nr*mITc(S^1K +'u&ˊm!] y{OMpu1_"40Eh\P A 'YgbDn9Y9vxNR!F l`²9+|!?4Gvkϳ~I +(ԝ^88? T+{ +'KSW -1ަ9g*}\Uhm<$ կ^X3Bg;>CEsf5c*j ө +S ]cѮ|~AsfeQxamqɮ-l01#( +~M<_0JoF\:M$^&[e/})" FAPKk03I2^>fĕe(o SV;CbF[GMש)#ձ BsNMA W&0w+R#Ş oF0\ 9( $D;4 i +04sSAӋb` +ۃ`|+#Lġb?UDe\i&OBSHR8ylhڎҀ&Rf䃆롧UHQ (YyrsI+k +jf5`_ĕz + &~0ozYm-~AWm6u4~M5%"8's8XDJ_ї ]E ^3)ћL][T;5.z~ `4zg{3n^*i{h\ +?RhE- +YoMӆsJaTp¡=j2w {C0OExo3Ndzyc Ɂpeޘ9j0-v#֭h%dz*_<[Ev7|HlS_CQO᫬sdP CsSuw9[GI:x +,}x<*!$mе#^qk~#rR~( _,>?DiQ7Yt{ēe(ٵ(ԃIɫ$(ACESf&S~3<|H6)vZS1e"}!шUEKթ>^2P/˔FOD6C\"BKO3}^dqw5X_{rPe@3X +Q$VJb2V]JFF/Xu %CFoyt Ju[u*NaAF5KXdJ/3 / ٢܈JCn_浉ԶUGa@fwX*Z0.{~7߯ MBMGRZ`J ,S00j`DK UWP[p}u /zB\"/ v=`c=k(L,G`e2I=; -eԃWdpMS51'p׷(|N4pGBjEx4 ŽM˷LEաiX'D_wiЋ{cubjZՁrPdp: [iC!ix<|K;MA$AWaCU#Su;a _;'E~֠F}TĞC##. +,}>L=W]iI? :u!-_`l~Ջ4ed2nf|>:HRFAEnh3Wp~5)=4DM`+>(aQ6X.* Q.^%JCHtuDyZx¨UՂIN o=MȃBH3A3w3:f O]OҬݲӓF4F]x4|-FF?Atϧn*dYX[a2 ^Qu8@31hj7o-8!-'R 1@t|2SNQ뾿L엃=6kG_< q4uz"yV?vK_ +P2Ro18h4'h<-, *;=ګ#)*>{JON[DL[ḖT^Lfsl4ApcO%Rɻ&zQ/5H-7urC.\")0yӿIb՘.Hqp"6Ua1Db,)\;p ];+um*KzX/95UHO.*_Bz%iN:|v?LAioJ"0_NWY/ kLH^ޛJFS 9e]NMԸFx[-aK|"uPtW+S\%Jlt^]MPJ!JC,̏LqQT8kBG??Kyzl(KB-ٞ:n"ɨీ=xU,;*$UvWa6dvˬ+s@6nv* 4:FM$k4VXurKѸ!Wg;M7 !x$ L{5rtxܚÅފ%tT kyy겉k}"tPF=ݗS Fz%b^}$doOlCmMx=}0R ji/+ڂ-았QK#-ڣ<*=Ƹ&;,+cJjG_d^4'n*JQkw%¥&<\z0Z* #Do׃TUFd ja'+K=f-熢(GS J$`T5aGnoѡ"IPG-\>FeͫxQnbv+e›( tRk:z*,@.|yc^ `**OReXǾ0hh$!(81aOg_1WL 3-'оoa<DK+OݐM-(9TkܹFU 5Sc)Ή~ ʏ  U뒽=WP|yܴjcDGp+A~뼶sWtſa˧7B:DVinz0 IXzƃO}G*jU0m %\\#ЈTþ1r4 ϧxu9Mٷ@ŵ4ՠt qFrN* iԂϪ`-h%n-жPcekq^.fiȯ<5-*fe2*Q۠Y:&tҐ`Gģ^a|ʞin*QO cucA/- %RAI:dOc_J4<+6T_U^ף@ý"SQaҪO<ĝW.G'y&Ɣ @LHzH?9kl}c/\#rj Pݹ"D=n M X.>!zG>~Q$jqQ*LhFMo\ʮ /8Gv7qe> 's;1s G3L䴡*[+4uoa#1?|˅ ?;#(G~##׵Vˍwi~E1{e>XW@=c7#f^ + ߨf@-tY/. F7W R/\XUuA.>2J(JA퐃ҫjt]c4+a@07G3wAxafe\L=?@~qd!Bp]e~"@FcϦ>}z ;O=kc㸃V{VDW8 sa0~/ˆ3ȅ`\H5Ɏ\vȭcM!}Cz|*H??jBvNO=o vM9]l?4uZ1^O[R԰x"k$H/jo ob(ZK +'L1ݙ˨Ej|q#Gۆ;&qUg)&Tf N<{2V5ϴ4ABP ^60S?]p9uvӤNN +:utdЉ#拨 [M\|N(3a&YN\ՙfq0g\=HީLSa enftߦ\N,B4p0￘Ǒ֭ A%^MXm* /_ Rց/;!݁)/\g(DV\#,Yrӆ~e +µ] tUGyK>"#RXg٧V}4%XTjc練bME*5+{\ w=D3-lW:j$8>`/KP؅)7Uvaň0ŞS{հMk4[čZb}sBN_nvuKZdXԊJx]@)#z"v6nZ8 1'3vگ?"X6#8}}Ъr"3YnQ+|ߧ?E  :%$Hm4P֦"hYv +uj)/fayyɔY$?"W1/. ZW\~+W !DoյbAOc&"<6cs;X/&&3z#}InoLQT@6>pz ԌlXy?ϫ#d"0m'U +s;%Ŀ\Tτ; حou5j~ChY%UGfTIjH}e\MuQ a մpv_zFtϺoK`tXJOYaD 6}D% C}uPl뽍yA +JIt\INƽq>1b[' tČ& l/~ۛF|Xr}I&T u@:Pq촊 {PbHd:IWSܤ:hBW+,Ҏnag0w77ZtݟkTwҷXSRVuTJ<9pdePBՐ 3LۧbY#C{/ Dm6[޶WwKΌ7_50IADVe*;]̘Zm"M>U4SfΈ94\7!l8ֶ3%;]h@o#_̈́{'fǨjz/K +\Ɏ :*csM +pu\aT@gQ5TJκ5yc.%9l Bgܐ-7~bF`֞^'G7KF?E= f)|G)(8g,& 4kNwy\4̽7Knq\M#1b|JsKM à.(  SS" /|_Ⱦ{Hwz9mH@ _Y @BݏRa/rO?gƽt8h԰\;fTPOQ-R.:ꖇd,MjN3^̒\ vN~Y" GijRekFkrƅWʻF.$[#0_A InPLlZNjm=\#]Vt{@[+>u}4ExX BՊsg!kڎ37^ V8Tu|9PUC F=hiΏNݸ ;RFQbf Ca}:5;GYlxZ$QMqf0{FX GA +,!Z)ؙ9\^vɈ>" ˅ċH@?PXCTWR?C\O:j 2~"UЋ#.x띸e5u> endobj 3527 0 obj <> endobj 3528 0 obj <> endobj 3529 0 obj <> endobj 3530 0 obj <> endobj 3519 0 obj <>stream +HWMoW!fbYA9) +j#1+ gI /jW=#i& dUU^SF( e!+)WW}{ˋ%7YrsqI +BY,W Xv ]hBʲ`pC/^/sh˾իaW8ڧpQYH NGOp۟X!f4+tt ݾ8R}SхxB,Gv1ްUahO_._9lmQA +?~y{ Lz) +1Wa#C~kj|(\_Sa+y`N0f搳X"YX]^\kaRCܿB +qʅ0`r_QFxyi1LQJ 5*+$!rk ͜ê(RQlzxhKEQ.M݇>|%'u?Ἅ:tAYz:pЂpG0د5V}g&z#XhDY6ڮnH/H8lw!F+[ixHHۮn/)(wAg&Q1KJӱb]ʕV*Cwj-ĞP@") ĭw] +F#~^QCBHwxfb̛SViK +_]U +cAXf-TܰHL`r-/4>٤bSGWJIR@ < .>B2Hn2l٦&Ԯdk*$87wͮ.Hi>t ÷C<$a%! ;Y|`j 2ĉ#P<0 rn&&SZ ;M:L ,8w(MG#V85EPF ?Nqh~!"`!Cv"QS9kœ/)!e%*_<¶B%Vf]̒°kw3<['R!=xb }yuW73d+Y`N躌̙rԞn~etû'3y_;eĄ +#Zxh}+TjAe-q +YA4ӪT}yK$ùеlNA!Pl +T'BA!"I @V$'O*X$0-YPDvi`bzRv7<\Pmr\/ ehϙ9e7'II㓘YMH,:S>h[YOZpzOpS4T]۾A5p /i9QyԔ< )>lDFABnZo!d,B,YݣWEАui81P.vu#RDWUC6l97kdlд!0@1A׷ͦlulyI&efȅ ʽQxԛj0<Ӧ,S.Ȓ{* p=BAX>CoAXߩC/<)2e.^wyCђ@  2~ oͤ =~OK%Fe!q#ڎ%?&&c ā +O<5B :xT9yxC*ub14_FzhfOxl.qO K+قk(k!z:X6+lx˧e\Eyity]mVyk>hs橤 Vs +Õmg4.s%-Q_j`UP*2qDryebt11~z +̽&%e̡_˿x#Ei-n=@=GK[v7332# I -퉴t6 O6A +Eh=,y-0y) ao[*MrsSBd6IliR ,' YSPOEe dǦZkee,HfāZ,ux$s`R|$|KMp+,C\Ar+yP7G\Et2g +DZGBАO?Dvpp`hM%MNC3aYXE>"9"62#%69 ٌe`(~o%0ZҜx)8R7X.1G SѪɅGWJe8joica)jBI;v҂cv75_4ew; rk'ƮC84*F!MJ+&92w{qO  z?`߯Soz& YE9#1D2D#_j +yJfT=Y<hRJq +-GwϩT3Oq4ѻ|w]6ˠj-Z7H\0ܔ"cƵ4k!d] coI3<^̮Ee͙f~v ܏c-;;qZAR@~{,P+,SIo# (շsp2ˉ!'g|%z/p$7?z~2P²D;a$3, R??4U_&dH­Чo~,_i=5q ~+LC1^⧵ιENgl Q*GX-ZZIl1Yw 2Ň)?U ^)ƞ㗝͎lZEIcj>stream +0 M@&n M;[U#K{ '6RA#Ig +3yx3uQSGBXF-_m,DKtu$cJHbӯR^Ideov僇'U#HJb so39et7>&xGH:@"TN2?LIjVueBxz#BU? P'[K.)"biRw1rUꝼZ(@d=i-uW5rgw*AcUD6, +b+hcEg2۫1ɀE%&HPXV.^hxBŃS*@5*x\~6s^Qy^ޯfqf2yG $7N~b']nfSVsUFt]`?%'x?Nxy{k#7?'_0&߸/Zlm7Voig^jS9!xZ +9jKQg}W_~"M -}brBUU)! "NuELrcJSZ|ظng+4.P>0|EŧCbo7Uh\Lr纆zky)lonh^bM ZЪ[;Ql%)Fj?z%+}?Xd@Rd,y) +Yq7Kˀs ?żʍ;je[~N(0XCU(;+cX+mNlB=DOU`vi8v",/B8(rL.'y4"Pj^hRzϸ})MTSHkז ;$A9j ȓrΤjo˚$?QPA6)b*qM\)xB1T_4CY3yQ6rǩ}MlMpؚH|d8Q$_1GCRX?/V:Y8 DbH-bk6O{Bܜ%?Y3ߙN*y^芅dj0@ӤE-SA</ڤ62/6-,vaF\l^&ňq1.vw_j=\ bg b&Vn^&TLσ +mi +˲.tgrd6GB}YT1|X꒡*}b_t×^mCL nϺb-Ugd~+"ch3h/#w!\m <,I%9\b̿MP/}TLn"7`lHkݓJQhJG[eJM,`$KX[kE h*`A '1ʶry4y*qA:ډu+U)%{i6%!jrC(̛;+* ڔ8^p"(cm\\3WƸ'^83[Z3n+(>h@Q=fzV(W#xFB66g0 D3^)SvpJ{*X9>qa9,.akaa;~}^z#3j5N$,·\H c93Ô[jTqSF&K?7;҆%wE&bTg6S/'g >wY m2Qx0']-{jQUX"w27뷰.3୿mɿ%atA֞3QdekY<1qTNlJI46S/ $4=K%xMz)ܬ +,:آ; Y?=Y}` ,E2޽%?TM=$VYQt7֔jyxn/knZ_euI͌s Ҏ`̘fFy9Y3]LuHdX@;y=L&YvcHRbaTcz9di1(P +KJ +[iao/[k_0%rNPO_SyG0/U1³^[o)C F-62qS}YT0)RIX<`t^|!O'$`3v' ZãHˡ.t}6**iЏ&)WA;3ݺ&+32k'8PN_;[J1<<^)F%g"5F2ojoZ`Jߔ, fNXž[<>Ԥy[Guw\Xc%8Y:vg_HFR*8Kq]1ǖ;w>¾Ok>2,|J`O teHnRѷit,J+^bu'-O 6=_d=٭C-ZPw8^)\||mopB7*SWO>dt_fҽU?a5!7`4`|ar +<=U]9WfHd̝0&a32e"Cg?; XjhIVHOu̙,+M=jY2._wc<4OJ)ONf֤.W@m߹ςSw>p"8Ew襭^oWu +!pypՐ"vMXbQ"A_[z-]U.yl) KxFn, OA;>fu;F4Dh-өH[9, g=y$(݅Sܯnr%l2w*ܒ5 $N:&|-A,S|3}kgvW607&d/Q5]ãohM%|X@vp6ף֨n˫* s&AZͮ)*I\zYzF/I6xğWTG/ +QɵZe /] nHDU8 "S3fXjl#k,_Cq*xulkhʔWDuՕ.D1 +MXӾEBoWՍV>L"0YvËΈ᫁0~4Kèpq@=PՇbxbt `Û]`k3)F7i]zt2v o,;t/y7qtn[LL>7T9RF/q v 9yc3t֟2,?-DWlf%4o_1}?hw׬;h(v;YA"50^w~sV#o,\ƧN@y@JËxظzF7xbk~4aj3?QO?c,xM#m,Q)%֗f +@uND;qU~к]^&:.rmo׭>T(͊F># dv[H8[[w&5ȧAKݪs54.pI)~VQw_2sťF/O`~L +0 SSρG v")Hu1-a>\A#fQ~ l`&AQ[ȉ!y'&*@ J<] +P3fF],0qߜ-lsh1 xB%>[$# -3#$kOsR +e=0Ys M:ӂ+lE;z0,*%D.`97yJ|ѿ0mw}M?MY+' "+[C1~6e FYs*m>$l}T MYL锃{u582c!nqh}rJPR}& 6u)K˔7kDDpʭ hz;x){D9Gdʆp (VC»v%*9][]PRaA8,}C8A+ q= +j5>ê&R1tϜ%Ѳ.ۻݷ1 {'={@^n*RJ'a:%Au[<>/lC_E]dnz`p~^KO3pvhJ;$Mͫ5l>19)4\C FԦ ~_6D]6WxdES4uMa4Y F&Yn[鼹xsJ8h|5J5VEK2%$gcA #NJvqn&.A=1j dبFc1c6bU&h2T/*:e%Xak IxvA5hfQ$dԂhUMF=^wX;Ԁ +%rFV/;4GtA9IgZv,?jsJF3.^O|K3-6U~c4*!+U,M%69PCV>5O.΍n]|6;tOp?$~ ++Xokd*m5zn6c_$erreI>>#u%(X#i‚ۺ!ϰOĔPJu;\ ]q^XTvjĨ^䨆G1W().^@.;2Mt⼝2]NƊgP.Fi6e _mciT3̓i&מ1(ߐu.D\n>UI#)RGɨ4:Q*h~TGCsK~ ͮ^\*&N"!X{o\2dZry@($P-,Yn\&}A [!o.ZOmC7'wB*zf+b!K{Xa T?}{ 4! bG@`oQW@-~=M0jLmUw}70~Yh^, _6u: ʍ*,!SF[1 n%x z},s6o>#ǞDաgDXƵQ -V']/| @X|oo3FJೖ*dtZ1c Yhm!?*N\ڰ\AQj +^ 0Z#͇(p8GP5IL7EY]mmb\ y@#Edj%M֑2OX+_oA7"U hBQ\2sۦb +uk< hkUU0 M; fTxyueuXWVyV<cxauQ9_)RhWLiV=9IXAƠF^4ssA6b6T" 'pl. S2oN7}cVi>:cs Pig hNvI3缛X̬#4O|#7o%"%V j'3Kdi}ٙ%5,^~x:϶XeK^ہ}UL=/Id)!Q%r\)N2?o(1cr(֧Ύ|bqC u(eɘ\MH]3&pkVIR@" A:b\Q?6x.&eF8A!G{U*] |fŇVeG<:UWn ()3 sySΪ pDʇ Ƒ0R_ģ^zpѶL^(Nim(BEШC \jOck~#.lR7z)TE u fNBҨ5RG3L Cg8X`⡋`'O ňUtbh$Plc3&܍2U J \s|'""R +Bf;x^UcUk먳Dd|'4nvg^Y <C^:xxT߈s2֪P&il!8CZ[S/sW\?Y~jC.eV_d@LF)Q>׬=L[ñ[Y0,yf|Tł[3b RJ᤭/iyVdog0un%\M,`"{Oã:w-=Y),+d;;3ϻTH|,6) +i\r `oAX}EIi7\WG)]XC5NqPL|#*MsZe\2Rb޾m*IʰZ@@&-hj ӑ $L?_qQΟy?K f{@!KBbTxꀡ<6Ap-A ?Zz[4]ח9{ ;GT&wQ*Pٴ:铎 X6U7 \DZObcKK?M 3sUHVQ+YTK)K8eG"ZdZs7fƫ) U>I)IM/p"umD˰U ̡%7 W=r@uib`F/fHc8) yu a.o(_FAޏ,BqxG$2ar2LKTel\1=I3ϴU)WJz4${eEq j3á;_huoL\ R_ ?#|<.'z#lr{>ȕ *a4RqQY' w#Ϗ[S=RJM[bD lI:S3y_ɑde$g%B#I6˪v)B쓛[#4i̔{N4 +Mpқt ]+؍P*RmR{;A04d+R+=抁,pcZ%ڤJ9 T &gI.̺P*0W%8+-&[hII gs=Z]Ga_ш('+[ t]I2{wEaJAڗX6/c 4SizVNRbZ<WIZM #{DZ !5q`24mKK&$7P')MNluBv%Q됬B3:L ]U87)W)˹F}saV,2C)y&Q\q:&(5îHYP,!{9zmz d+E) 4052qF@v&8;Jsʮ9P*vX&%^W]JnVA#S Oʎ}ؕf/8m2'i׃|(['rF +=<%5i s78mHfIlwA]rՖNFV^"anXg$M DM)Sz`<#g5c}-b}ĵre!T z0#ak\詖+2sCe;,lu%fّ嬨^[,h6-䅸3ƶ9VmbYeTvqWᶤ 3*a$Lzx[=sxq՟`2'ڑú( -b:"K#h)`v?mmFB t.o}1^4D Vg5SVఀ6zkKjPZ(N;ދ40}Q X rYkO35 ehVUώťpNA)LagQƦvlL{>p./zʪYkybVDr$0""msN߱s eSJ0nT܏85ZBݸ10UAНlZ޺ +4}dT{baH"96Sj+ȡc}B +l=>e׎ KHV@+ R3.~,zk?ש773KHZJdJtC/)voo^$Awl3f]XvveKWvb6Hኢz73BG*y) @)EFIkը zjj\y\jokfOJz9ʑWJKY T^l,>'sf01^>t]q\pFXdT227S=B4#`4>H& eJI$RQVF3Ҟܐ>4a7VScD:}0cKӢD}YA^o"VW;LGWbQGdZ,SÔmKx>2_t7`փ.j6tm[rcA|* kˠ\uriGPmDzɌ:Cxx*ԯkg")N_|z9F+|ߞݡej\J-IdpyX$P=$=0gY${ CE M@-2fktn+@O7m7(薠n6EfW&nh5ArQ}q=U1&l}_׌wʲm!XNѲQ +pԒLL74`k'.ō{ lSBapQnv>E\)e>rg5)H\)lUyFrƼQ'ؽ#ƇPި&g=`5 |mlǂT=0mZe[J;|}7RI{H͵ST)fD;KzB *44 ^L"PWZ\L1Q{,!jQɔ7~wlϸɯXWR9/T6ԆF)13E|ғٳӽvyH#N{6[1U!b |E*U%:_guPS=޳Xr67a:IRkPa R %gYWW\)qZ=.Sw=V( r) \C7&^DE tj aG0 w[QG }q^LSzl:jδ}MtYkNTqbhBqomǓ塣yX e寰ětCl9ϯL%0)3omLX[#1QG9IA"+ =$bV]ό9އ੘uc]/6 wtoڡ)> \q1xHzv +hIg%WDZ|d26/*fS1%W>◍skq:EIJxQ0>Fq4'JKW("}O7$Rul'6ҭŚ+`q%Wfr)UpCp'մQ0fK+v|J>i2ƚo>*z=w +˻-%riЗWOQIq)O%DJ +j$*%pQB}!*|fvΚpsI[({P>-p~/ʨۓ)H7a7!E˹`G۹$iRpQu + lpƱ!\# 89؂ + [&/vqq 4%mN$Pܶ,zƷzqYf #O-eơ@N#ucsýO-N_""oLkOUbKqX|rIgz[‘@3I61 ?!f$ˋޏo^ꯋl"èJZ<Ij_*_A@t?sPFgշG/g>*4o +ҹe4'h3&pQ%p'w<\L#($A |sn7 (+f׀tݧ ޓ%4>kZkP`-,E= +:sN0HifIe`Z!3;NYUZrwИJK~  +L;jy9|~El &穮#/77?.̙\:E3#[L&P-G'xBc?Ny%RjW2Q dFƔ,7q.j γ-icڊQC$db~oz  ~ 3gK>X 6<;G:ۧLuƪ>Og*BB +Yhhg <}Pe:ruZ?ȋTΐ"S!ڨ8uJw*x|f$~.y+!oq:)D˖Aτ>0dq'/Jnj/Z&Jj|lv~&Ѿ g$fU4)d NzX}H8G, %dq2>c! A壿l^%Nv('Yڤi7r2ڸ~Ӫ0|CM\e"qTHM" !6 B2"Y^/; S9Vv KQ\N:c/&rXzeW"R/@P=J*Mܡ`# >$@X"ѻM_F֏f[L ]9&;{^^c:tk\~xEЊr0{eP\ 5>QN7]t7r>$ Q{:9v׏M)N}MFs)51lTrE +#|Fd&O',H[f66 Pg8ٛyWWZ\6GOkz}dGW[}Btw>d ˜hlNpj keԺ:>\8%C`-w[9v~K7?!~h _eъ?ٹLfB @8DՂ&~dV>wLڪ{Ao:9Im5L ؗkQkE̵Ъ#6([/+F^ɈC$=,X5 zafwCM\![SQ1ϧd@T̩5Riߔnzv3K+ꪫ6q7)=ZkQг9䙞_4}N9MeCc]zN-DL4:M- [񌝀M?@(=CEҰ8GqWę +] +B,FD*_GJMJ5P4~=d +!R*_<쁰{CAg zh2BbZ;KӞHv@}rDRT&a%&7 Q^Yv8@`{E>ڃpH/՗ #v<9T0tS+YJWc41kMAfJfY0^1!\9!vKV| "_~S'xlktpoJӾF)v1S2UI ŧ=$ 1ʨl4 +4G;B;?5{[=j(i+ fe!eс(YfkV@r07CM:zbwb+}Ihς'VA 8Ul U2l F&~'C!cR&c:?cJ""iRf͆-q~r0p'o48Hd@¦bU +Wd "mṡ*>v/:85L[u knD.a&z?M4 koWy b8@*+D# q߅We@QC2T; HRX3+?GFPpN)|[~:fVeKqM֢}^MIʒ#Rowv(ʌzm,5P iqN:-څS@^LPpNش `vr +г+AXޖ׀PvRb5']ĈslF:t sn/6!Mwyqb +mۧAO2tI5rEFE}K3'7Kc 8mn+ۜbTرje֊bOXwAN7HLQ8Lg.rf8:a MnV'ecj +0lԉ8s`7%h7@.xCk/PSLO u;dLx fp,O̗O _-7N 6䮕-L,zH$~R̞~q= @dz1"i)%052 ~kZk$2H`V6 &ƪ4F?q@:CF\CSoָTwa^:])lt\>CSbnĂ GRzr Ja! FItGíf셪(|r5fZcC)? Е)R Mn+WxlƓ<-/!{6+H-V hCDxacMk#:%dllo0LI~J\K#NcOX&Gr~܏D6ZKax8H`l0DRtu6EMq]Rdr%0WNc8h#Pf7 E(]|Et6ڷjkR%4)NlVf(S T-JGL]D-,~]T+<;xO gN 8\'b*K'Rɛ̱XSa%ޛ4WItu QTPУI5읽*rrmjģq=e>SYQp!?z~"Z'M_[{et:0 Y~F=AOO> + + +qՊYv_)wI3p?Lg@=S6mOtZdϞ7rQ~)J]ZٺoM}x5x˕fFeS4쵽x)N#90K pۇfLD%;O}V9EyÕ]8Jd:w쉔ҿ.9_]{z +jKϞI Y{PMZO܁neP\:yhBѡwG\f;]DiΎ!QqY2WgbTܯl">$p֠21ȊVY2*˞MX^YqX7lp0#V0Tk~;'DZI/?)~[cvOŤ^@^/syqfYE=e+Ʀ\vjD,?%è X=iݵ4'3%'!ٍ )S 'QwBdaev,9|)]/@"Q̓+ n>J+\(R%KTᇏnK#ib?%3/6m[<<Ȣ3_0AJL\$]iXxy['injB|Ȉa"FβYW=n ib5@kh1l GU'Fp=?mQX7>zݻ&y~@@HbUedu! +WbrK6>2/NLY$@_Z@ňF ƦݽIHtׇ|#cIω0d6EJUf㈪e/G\8-@ڞph +Nn}IiG3h)#cV7 {*~fn8++x;:-!Ɲ/z{`8-z d6=zjg" g8O_\Be^9XVg%9H4fLgTp'Baw'u M}y8&i{n%g{$X qݗ6nЗl7͵=C"RLR=HFrZWS*cZ~ "JL.I_Cb,M!OrTWUO5]֮vIjL[Z;$TZ2}VhVyMPv+vr8|Dk!{J,"»zY`*KVsg:yT#wqҐs$]5' 7q]v?QdHE-ՆP-B:&o·iV:&]zydbroWg= ;efQv^^/}c5<-I9w6+cf#ud +!Xwݸ+`>xfgIT\c2nwX˃1ϭx;{U)FΈQfꬽOZp9o/M$ No,K&8vm\DBqҐٱ+L BN= D@0ݾxXUo 3cG-J;A̹ A[߁ {7lߍasQxDe +_e[>1hb,&Ղ^͸O9jH<o:#AQ}>*ښMVk5d\SǂvT03>@/q:B,ӘŶߺfrx@on+ڥ>pl B#EA!A^˂׏{4'f<%9\o5}ӶtbJTs"Zfo@gf$\?c ?2b##U󐿛ȣtn%T}C6-vQƚaG?74%UmYI9-ӪSɜ o91X ~)xu,]%Ts(+φALMw) :B`&rL|k=)'rSߏ^+Mo9( ЮɄhBTiW-5l)SvЖB adLS[E:  5^xkmrf@ƷjZ@$\n4]oJ'Ӡ!EϜc@H_:CO$ݥv@ +aߴHԍSj.[kp><I^$%IH텶 ?n( xʜAPW:q۪Ia0\dYeYf~E]~[8avUG|۵}1xHمv@S#fkc?RF/h@ܮL:K&>眊}=Se`%/c@9m> =};7 IPH<2uѮAN!=ozUZ=j|yAaIg̥ [$>D'H9^͘1 B_d}2X[9 pŭB.@vc9: bF3YmvCf1{Lk-4k3r WtZgR p4|sm1G/Kz˛2Tp6} v؟@qONR! Blr>phIST MYlQ͡`pveN2Sԩh43dec^b!"S;^ FuL8. gr0VYVՓf**^+NUߡgth\!o5͎ `RUBFwBBsZ^g1dߪ!o[Zd̾/Y+}[2'g]y8X5gҀ(>Afn+/M"kp{'ohHHkB>q9h+z|2s ^V=< ; k}j:*D=YV,h7֩gc;8YGSuMd!HJ;'J+ -&]#23]FbdU1WصIL2SLLiczSZ'*A8bqZ> 'DߝTImq +Z@\;n+aM'Luunב?F^6;"쇍^7vF0Q!0$ceiĝ+`8 l +K0 kd! +UxvK'QiOQ06V }|%zr5 Ih(^o{+ ?kXh&/9`:Ĺ)҈nܦrcQ2Wȷe}rWOIЄ'~U7b[vT@5'`֎w> ꠁձWhJ]w6QӬ.َNP"F q;QTcZh:zeۧ9lvCS!X fSrkpԖaV$oy疝tU!ǮF%%"MTppkиZt6p3-pczAL-bYSdm"4i?U6 ;%!̪+'&s?Jpz7]э !<(`;FcgUUNMTģ}NP;| Ę f(m^ay^6ϔ,Ў-WkiYkuҠLҘ">܃ީ+Ε?bp,݅)$sxEwOKf*Q5.$6rʤe?ô$rՐTi{ΰ|p=uB?Vg1xo#5sOb%WݡJ"[NebVyH 5؀:{]oՔA땖&4ZUb4|{dbJOxԙ6m75̹6 `949 嚆8>2}"G"Kv3 @/ %m"ESًyJڊN[1|ư4FAvwmmCsgnRLx9v { 6'q4};Uiϟ$DAG4rSS\E:/5z.A΍Q+!l8 y ׃5luw%j s*7Kk(?YFnB0Q `"ں|p&=McS3lTxGn{QF9ν$̊t .9fw&<-AB E _רs>Qk-Bk|z-8"\ I4 U/q' cpQ! ®~//X{Ky4TSNĘ!/}#hK** iS`(.:gͽF4l'E37)p]RgpWkB3MJ,8A=t̙NY˄VlޫZYg{t sT|[>(+mL;@F*@rC}μاF/]4ACyj-*r_-c=n943nMz;kZ~SiRT>ٕR`'15h",tobܘV@c"+Ԡ#|IIc0{":޶ə0A\󐪮J,D jփB8LnDt?Q:!71R 0xtH +vmV6}i /AO5Hx5XɼvbCz1L!L?p]Bݘ_f}nCaY{ߑ%yʞSk5$RQVHJ1&1 ܀vd7&tDSwsof@B4D*`6$Kbҁr/%/"Sv/<"e\0 {KKa6N"2"M72mc>JwWO4rn5k3~cf?/s[Y* ~zsT̈)H=؃2}'%St\y734@s{pd mkI*u'1>bs)$3!E#{ETc8|_bmC!7oAHQ\d1mLӮkw&r#ʽ#,XiT^ +yPBJnF?f,*ҿޮuf..ˀ We03G6/Dzz;W "D5q9a0 +uipE-uѧ2CB$Eyh[P(x(!NbCL:TXԉ𝩯])*" +">$Vjx"/T&DbqMXP1/AX Rw$H F +E)O@dWޕx.m~Xy}oxDĻu8 (u{hP%TUݝGE:T0JX8!ptvL<+7Pƒߎ-Pr5C6,Ģ.bMГg^;#ql: +9vZRΦOMl0Hgıe^>m"{u EYySb;OQr2E詃1~yBJ~8 V]ZGYRo0l{,[1̊H>vc2KzK +GT`4&K68tAGE6I!$d9S#:b0Ӟ|t*Au,84@-V5'5X;7bZT䰻i_;1k)Jn=6p\בO#DoBV%b>iIK4^(X> endobj 3521 0 obj <> endobj 3522 0 obj <> endobj 3523 0 obj <> endobj 3513 0 obj <>stream +HWnG}W > / ` 2bD-)w[(ڋ[tWԩS9"PjP#PF~ݜ={C'oڳ= Lg=q6i71D WܿY5QJa'ӛ~]~gpMrw 7"(.ÍM+%/t~5] Gc;Nۉ򉢂jnH7iIr7q0F죋c\fOQINBhey, iwMd̚!D }nr3Ñm p Έ|/vm'?u^~d/%gI9Rw* 1e2ݡP^+v1eW2HDILyw}WE@?<V +w ӂ ljXgI%8MxGA.*\r"TW|0S G^4u΅*22O$rͽb0h>_m~o:`q}X?C  rV̬U:Me9 <Änf~ 92hEGw-=$PWҾҍF8ވb+ƙ.>8 +EQb$\%'S, +VN)/rY)iݔe}ޏKʼn\R2śwH;l߂;Ժ:4SzmCkWʦXT Yp %s&J~3+ +U *p]oӤԌ_XGR`PwaCC0? 8{u*YaCv Lpo 8W#&YARi# "0Gˁa$_x,{%iZcXa# (,R[`[â蚮kV9rXy;m]yߣ pGu)ǺAJyݣ _~-C9qX@FEL 5:vzSߝRK@+)֫}$qhnl +'J٣/gXnX +wd g@GQœ\ &6fENv7-@Z$H{ _¬VDf#"U" +F+Jiz_°+椵,*4_nf8z鈾#:bA8aB5ABXIҞ=ыU˞;|쒥Ƹpw rq fe,X ] 'ۥ‰ݳxv@CKɧ>LS7 +#Z\Ci="Ui?#'X Æ^zwl[y&W {q':rHwMI.806\T2lT%\#Y AOTnI)rVhrྥM_P an.{Ft1_bFp y=̢7iuL Vi-"2kJ#d*үf]73zYgv͒9! OjnOKX)`:HIe lfyS |^箏Ӹ\tje%61a 4/nm JP=8Y£8m( LFT' =I' +"Z 8ŗh"4(&: ]mЪ~7Iô2pȌb4e#E1ڐuٚ%0 =Zp 'mIbȅٴ6mQEN‡ɰl>uTH#?_Ĵb?@ @S5" @*i@`e IZ1&4DI96Z (7@IoA@/'_&c{|b1@}[MZ=#/bV]vݾPV=pדּzcfD0' FXBHv c>r$BkqxB`p*Ւr: +_ -aOaHTE&sU8bС@hvb +JUCr>WOCCƁ$# &*zq8L" ^rиfN@V؉@KRس뺫gۦۏ +&B*B&q+;|Y^'DX\/`M\IFxB1ko6P5;xtKIq"}8V+t*ה5#k5U>yIdTѐnOy:¯Hə̸|Hlf{m2'ԚgKzuozʠP꿤W;o0+ȣ(cP/vQc1؅-iNGH8<\55xH.i46.%YFU +j/(W@ ;(̠tIG`B#4}߇yޱT/sqBC:u?}J=JV^ ȷɱ9šv"9K9l Te. P|P|5FhJJ" c@o>6J}$(o PZ:o`ȣ9yk,jjo@ڴo?AJfJ Mn֏C7,vΊ*Fڌ@vLM]W n E[* mjTD%V!c=CDfBJJDI1]uguy !_r6qVUƳSt-86N^6*^@yWhI_@yd9MuX ίa(P8&&(vX{.Lmr\E7h tA` iԏϳC!xǏErN4HokW7h/IK9p\SaG/gNPH endstream endobj 3518 0 obj <>stream +0 D@&a D2[;ֽs(fjs.HzĹ׃%ߺy鍃:s`=Sn<&+E1loS>eq\M,˹H!+fp.bYi|xީZ 6Ň &,{;:5 1i(sje +7Ŵ i=ljv/sK543үH5H4&-Y9̡T7 4M3e 9- C,T,0qTfɢ䟔b*i2 >4:!2e@߭y:M@&y1EXb(iI>| <_a؂Q*9hC2Kl)i, 0XV&s,.TW[%+lMr^dzP0]M?猩X$N&D!*XTO\9tЗ'$ȯW*C5`_FMaywA;(P,pX}&?H!4;h1N~rz=~X<{,`N{@|#(Z4u}5Cj?>y^BOp,ӻn:I'rSb]ό_^&cfa ?OHW g|WF_Ǡy}:(eXĄ״[*7ט;k.H:@-aQr&c3nj^tRŃ\]cܓ`DJnH%L>M o! G`T*k#B@{%'Wq,G"܂ƧNQq)NfVY\`=ns`( -Qj揬9ܨ03`+WmBhV|Zce|RFri=ϧ8M~yN)JC{ O)]?q(Z'Dh*̈́R +A~C9Ϡ[pؠ*\TékQ9azJx"pEgUIVP1{-j#\'A~S'FG!wL\ӵ O ;T@Koy֏:Y?%iZ!I6f=6qZg>۾7\NjkyV=YY0fGOM/K?3U2Q9igSP?a_@sldD]A>t"E40< .Z\S߬fX^B-Ж$7 N1ϲM/a\2J +/Ri@2%KF~yF'>?J:O.eŒA'?Q6\2$piZ)]'ʃA10|0;*gF"WO ZH}I[Qmf:U$WPn,`_ f3qxu;ddޣdto5TNES`aEL(H:yG`cyΓfܞ6pjOQRн䃿1:wS[4id~5M^Cekf"d3hۜbZC#QYB:zTӮnQA\\pos/"oAO ;=CK/P`ƊVl*;}7OsehBUz>ao8b\F5/|K0W4 7,F +VtD^RIYU%qNȡC 1^WŖaYA p'hNMvOEkD$i rtݍv Ä;f|X &Sp3*.f[4xKyNS k55 n:U:Bgj~ʼn}u.oM|J% r2KhъWRf^XT@뷮L 2G?`$ϧi$̥(R,=^ɺ6k z(K3>܆5Tn-]9E+(0jCI{!\e\lvf5ExU〥1r6oj8^bDv+Odu}q"< ڀhC=LbG@FO8FOߦޢDL|{G-^05EB0g7f]W6R(.{lJa«ЅШd$\APi!oH`YnXl?ߧϑIp8D&yk̞J1'1`t7#nxAV~\... +OO? 7!k "3,!WEԺU~`A-XMaI)@&6]@PLZqc^6ˎ&ȵEu/nn"YGc;O@HI%^Yd\¦ݟWkjÉ{UIx`,p6Ӌ((Eo7]N/qP}rn7%˄wj'ֵzHa $!2vpwo%SVя"$OmW]8δSW3XW~&+Ŀ32TNim{ 黕j0%B-.а1D(ۈ k(IcߛwNY] .vO}jQ)G +|~sw;!b%9SVH#a j;?Xk]1fdda+Uoz; QtA-0# Rbr*{ӾR`SGיWşxt[gⅵh+] +n<FSrFњZW.1u&{ĂPw룮=rUXɻ-qd&]^ !!o J/%ٝ俌( wiG#`"I=z櫴E =Nl0^lE!EsakJr rnzDVo0!US \@e<-Hv1j0>\qBpIS`tL:-c𵬭T]̼}!W Ap&r줂vVXd3Xt|߰F~HgC[#DxH5n?DV]l>{_ޒm|h K +•~jjkj_9>^-ԠH@9"js9D4$b.ұע sa zȋAp/QfE[0ޚ3:b|›l"C1 zTSUd81$Z +k&= +tt9<+Qk-%)f"lI.NBs_!.Ԧ{?=7#br$u&Pw%%, e|I{J5|=סBD_ e7}Uzp3ZhX$f`@W#7-S7$WR g)ExDJ^/HI8xbViWhC0 7ѨD?-?H ' BUYQv"tF:$<ͤ"`mf|\.Y \+A%-yR:`XZ`u0Q=R4 ٜo1I))vW#'ȶT™w2Us(^N4 +4K-lcj7-mHL^GDMX!}zo5d\΃F *;Cic'kcmtp6e+ΑaX@XScFP/֯[c7,ŠNT +[kĝ-erxd-Ow*>CCFE%oͺTV7Q@ťwjΣx4 x,ht2.| "a[UfC/f_OɳvKÂ4"BMoh`<x|_os$ dW.IYjeHa*_6 3+ursLo7bѯ:ێ#FFstx$bwr?+=;ז'Iu8ٿ,˙CuZkEM])lo`-+J7 5nUC,v9t)Ue qh$b=HRfaAEjWTS\={wdڸ[oKvXQd x7 Ua!R1p5r>16Fq$jzQV)|@&l=oN"ő[<پ '8j.bBW^xnAfw+,"*tVq2&)=y.Kj޺|Վ\ҒBf% |;r˪f$Icu-Dž(qWVl#~ Ä)ǴkkMģ?8&KD}C<&ꑌ=pd7z@_cMyJzL۔O#c. [hGt:%#P8qhO_%?krIX稑;s=L[scMF=[O@@)YxN^Rl£7nʁ<kFcqu24GZ + ,,@iOIx0c_iHL?=U?@w +eq)ge5ٶI"gCe/4w\$|~zeaJŰ/_uh.F~ 0BaQe!9^yGA ONZً';YHIbiUCgmQWp~W1C_OyF~j3"ҊX({at[Xs`"8~1UBMTq Ê lMA->,!>Eεl)i?ߍe)Rr[*2P +ӗ ;EB] kŘg ?]jP`]!50 (- +.m* v>"8!厱R3E'!ay}{';"=O9[s974 b+`znCEm듵1jͿեo_6Q,1yhnkRĿzYa " Ҫ,S=2sKJH>ۡK?!kֈ'yRrSOwU܆lEr_EyvNnƺ^/gRdBʲ2[%5N8M!۫z!5c]-5g8Oo9 ]jKqnXs718<"|M[?r!G?%?h%K  +Z{7u6tx F(w㻍6#*pQc瑶B]^WblNho®/kBeAԲ:HOf-dv:aɜa3=,T5fat=nx{:7PYlQ<,*)]'paEp/ '1[}D;wL|7%!oljb|ę)o+\}ꑼiQ#)0ӏM@PI +@仁+RktvAzYzs@!?lA2g(6$7w@>f 抈pVSNBwn #ێ(5e-=wV G?I +g~bfK}-ܠpg'!ٲxtЃv#:#+ -,zI/ݽWwEӢ1Jq4e)0)!W< jAi߻4D}2Tꂣ(28`FN~㡺`XE tuf/%,"cBUE:JB`U ȟ̑ J.p"q;A˒e8W0I#u*hCFbԧֶO>Z (&%׷qRpHWۥ c2&Q^14} 43/O? w1EWݮ>g_l- 1'2 DE,=Oҹ6cGiFΔϝ-ݺ AXfJMAi=$Q =`汃Á~k!TS?زK8x߷Gy~ +#MJ| tuX%%.0$`\w@[Ene_A$Zig{2٣uaS\gHBV]TوAn +pI`m7*]^8xܿ^TA2ST  `kRcIWwh&LE U#FaZҪPXiz[JA)x.URPɪw8l;(-nk"J)"Ÿ=4cg +JqBȅr2hiW‚$ ,\H +f(QrX[Hxy)_i6E&)IrZ$4p+lS)I.S6 +l߫ZlBVR.X ;ͦg/,e޽v}4Z7Xg(ENq@,V?OyzH lvZtIJCǻW V緸 ,TwŶ&0儿'}G|e2LeXFO+O"HYȯ zЕNrc3?=ȩ gW ͝6S8?t ;MB& ײQi[9f!֩6ыbufKo:tɄ-O%iY{`ˊ|OؔU.^Djɼc"ܘ=qAG&`O ӖE!C/Pz}=@`A nc5G`N##tzs:lpbB~~&/ }m̗19ְyHt悖1 gqlycPp}.}UiGyYZ!ۈ2}s;x9 7ٷ1clx eV-ᜢqQ%hv J +!qEi>"b g[R@'lUFa3Ԇ:;I^20n;z4w -;toC1W'yˣ4 +hW\+F\%tkQ;6RJdNB$} q;Tryc%̔1NSTӨ9nɨQ 1R(P8 MUMfng"JG"j=aKj.G:[BpakA-XV]- cu|,x5B>ѡέFcA\[gQ_{Fz$6NØ+Uq(2p뚱aBĥyyE+2fLs;{2(@#UpsK sC&I TȎMxIHSirӼc4Aaz݆3?.RGOH +R˅~r_ׄE EԾ;RH8*Zߜ͐ao4џ6lJGذ/8f<+SN,R3V:D蛧FUo|M>5;]9kHC>/X?tTM,*n_iWT}tc Q;=aDςt#ÙF C֡Ӣ+Q 'hK*&]szS9 C.ht;Rbݽjc\un"4IM԰|1HX-L)[,r m:}~eh>8O ַ5@9Aצ0խص߁]x8C>WA__lfvy={ a\T,2 LmOˠi%:[(QgwN`ѷ]|3^3n>W%Ӑ3p5C"'\cC3x|gь3^!7Vs5!IKD#d-X4lM r [pFxtZ@i@`4av"s׾-~Ҩu +{` 8vNJ_[uĬSdH*##uwnRdKo'Th)%MتSց -Z^:2z09^ ++@IO"Vi㳢#΁:+!ϓ+Xͤ|c}ƲMHꂮ~[r=HKPx=39Ag*-Д]ȮAi4ma1C׊ fgpk"z+mWrK6pܲ{66 :UO=@pN-%7K)^EEvO->ʍ^0HU霿 Lܾ[OSHWr- ?zZMԮgb^^ąa{BxL %͓٪lSt\3DT6lmv V#K>#gri1;Wdqg'>fIM{90.gؘL9ӉލzcK.bKHH^$+v2L7Ihբ3 SSN.VJ̦/BdS>K'VL,^_ + s(}~0 )#t?;d45D/ +X y쳀 pHXb;q>p6 A]boC*#-.ՎSդXWm \|P VMJ)BG_ `nAZ}YTiC~ D^VG1ʌ4MU~/?!}d(,#<9%ᤰ6tjP.?ĥ+;2+I/.t?z re?*93fqu@INMTُ*Wqj7^ſƱYzP|F8(N쨞)Q%{kUGnQU'pw`ySwS%C~JaR%&?{d,73IoN3ׄyNn T5~e٩#lf48sڈOm/Z{=5qa:+ہΩw"2{NCV9Vl1 sk!Hx뼖&T5<9w0MJD{ɲ3$2O&Wg_=N l֪d^cuh{a1嶋6is)$}x woT_ؿy(q-H)ltY猷o5JӜ\dQYs m҇1zJ:R +|Mg .Ǥl1X.h,5&lc JXv/xKO' @8i˔Z)RXM&@c=ѲW]Cat ?/*O{dsB(Zt̄ A''s_( +'JNVWyEd{zQdKp%#ö<$bbCCZEX^AWXKj~_:!ds` #.b~RoĿ]3>uC<8=Yq1Z{@GV ?f!wds[i1xwō{&}9e_nLt0GVv`D(2w-ߚ#02.e&3e ˡ%eώ; tc +A,Gva06i%on]tYϦ4DuokΔ%l}n whY6|;w;k6kᎠ0iLʀ#׌pfզf&9sd%%H<a3Zy[ɻӀ^_J˟9 xt/'#^)61StKj +n_cx+ٕb'9԰L.A6ǵbFg"ogZ%Yg;à.tDW>.}]! oaoF؏1zA r*QsGIw8G +X \YP2j6K/tv1'6{}r1LM7T_%_ret3nʘELQe]{zw~O^T'yjƧ +3_@Y9rI坨R'?fZ\VSY7݅ɏ?~ìE'w)dB?ٵr/0M<ک! ВC +/s檁[xN疾w¨`^] 0T!s\fA A}l^Qo1'2s4d3|o;;~Y*I cTwMj:4&lS)U`td:!\׊ةkCJ2tV("AHYF0_D=M:$ )R.$ضpaxm; [.9O!U:D'|ᖪrҎxTj* b[!%ZKd"7!;{x_ `M;X[ocG{mBOT13:2kY/qdl/Yvq΍(ܛpINs' ʺ%?r3N0G(]gan%+M,z@N.&SYxg V]˕Clљ.-!R etFO{Z@E(Ň.Zö3kY{vs:I@(apB;AH~8v$n=&o'ҙVTa[&dpfCD i V:d=g>e Rxz[:%VRҠfILAEwwXkO4pT(}0[Ϡujwyu1 R3tJ<0~kdiUe m +}<$UGើۀ6x:Ys 0_ ^dKrJ &,{ȥ6`.36yuwѥ " p#:VŕH'tȵř.Mfrx:߻ ݄]O|ƚa:U)7xxo.;brϺ^2k"m{ )'!DyiwHQqSiJ}n^!}TU(N/ϩ=~fQK ݚ?Kr%حT|,y9Mpel3YV*ӬXvO_@ cM͠!2QJ#S<>YMхPkrmg8x~T:\A5ž"C{Z$N2m,H6SfdivPL#< q)Cw1x'HwWŞTRFjO')`@E0Pdi@SQ4x%'ؔ &p*@]3=ucJY+ȋ"z,/PS(F‹sA\i,{7G@Ef|,_>ؽ`3(wcĊ =\/ݾgc$ +UP@<.Rcmsq_qF %Ꜯ1_&׳xESLofù؃RAT9"vzCcp@X"O p=for8 +c+,73ψ ^La;\fub9"2J4+0\[=_u>h,iZh0lϱ=x PZ0'jM=G({a +]nqQuW%_#4#kg̺] +$֒%a,nS$xT)pTApҷMuS?(Of.>Ug~Җ)bDb{F8Yz1`DB>v"[ufE$Z毓+exT_&GقH_Ui'ܒCX/ks8e'l8!-hb}nqȯ!BWp db|5ݔہˏƨDiF.}9v*Fr\X xdCQ2xh?K|..ZLgL!=+eH:t5BjDsde8 + L.x ټ]翙 +9I3A ֊94 9!8"p3.ꤸ4;(bb)hSr^8MǦ:eb!_q7֗g4DB\aZ,*}0MKIߚUPr ׈yYz:qQĦ_.d{,8bt'RP!>|1X8C?4M7&C+>m2XcSϟԚ>W wˋ[``!-ョ@OHBʍ[qQ4Aɂeh>neW^f *']ZJE~0GzK?m;Fb64Fog@(-=z$I2šfLz1)㲊M(.omaX-;Y/Β]<bZ'>yLneUK.^@[Y.`^%2U(!ĕ%(9\~&,+Li1uah.iYo ++lfo2CR5H1kvp~K{%QaupQM2KЇ H^-ڕ9 2vR1<[1^RecJ- ;9HW^[8-wv̩N/'mZ+Zt%,vFgrwD{K!&[6ÊßGg!]o  +[^n9(HQa c p[EP#t$_QK:y[c< 3 CbHu.\}کkxXV~rAKݮ2áj\ WmĴ ݲ#bjBeWnZ#ǰw`}xaF47IG(tDf &&K$aqW(בt+3,qtWWđyY:Sѧ'[9,5 z$)cWbZfKr}+޳00 VfBsASj5`sQ'9>0Mlq>H5NEM}.fj B+mbحLRչ#xhR<~"y Z32!Sҭ¥к6*cPn`&-udXfQ9:; s߉U=T#'ҙpr&[-bׄe6U6xBЌն ;?=dL|GlMguS&cT +59~Pljɴތ/{R nxGpm䲭hyhq,O 7PL4u"9τ`iV(VNVkYEu'ȸlc9I삵ru31Ub}{](2' L9RX1e +zL2o~#=iJ_%ezbnZw X? +tB N0Y/p޾Q@/(K3xn$kv菑L{BԃIws8u2?X@GFc|xܐK _z&/TBwaƌKn<g;@ {5B29o))`,, KgsAA.Hx`0"yIC;£d3یX 3 +#K +BI~~aj~(5A"u5;rѕ;' C>(~G0*u;DAjH +X^+&b&|o5@%.Nezɴ3 j;6D[sBߟ~zGķLoGzf_隢_R@0 +^x+2꜕"> (Եb +|l#$1T7&6yo] z6%zf=춮蓫qkPTnk!?od>^iOt If7m஥P #w1Twu!wht(ћ/ɶo (|.D"3rѝ0*S65]h4 |X +FjݷtoJtLlX!h(8fw4X<36:[IgZn)Z[=!1LDp /76pr~dQjJĹɅx֪M˗nEHeH=L4݃0r΁yLdC+jgK7ErˣYAO?JyN{H7cXyy(- Z%biMG9\y9B~abNQE!%^A4>SLiNڦJ ;?5(ўK,=0LU (PQ}0JӗH(`QR{Aqjʸ0W-֖5,?ƦTNBgUmxNPFR{ѹޟz# 4P䚢4W;N.w 2V>7*70r\PK\'l銈uCӹY%##iyVSknQ"pb~#s&tфՐM@K "CU/ 'ǽ/ϲ^} +8 +rqwV/X+c]GV @G<7 Xc;ʼYQZ+;FB<16&Bf"nDJ[xdcғn4Fڐ\&UpC#0+k*b1mFb{-=PHVA܁sl.]%JbBk!3 VUMxoI\BlbLSi69&O=)NTGIQ~! H4iFܯzKΎV!)F_Mę? ;pC +#L{8f2EJ*\ݼپߩQ"+f^%0 [ε:RվBBvS~* M§dC^J+]e4b:?:}ύ x|Ӽls>5EXRX,Iz _ I ]WU]:BǺ0 9ˏEP!uhp\+^ET걵~+tpop4buR}5o 3co9qիZ6 t)gxIb̢m[+[f(374C4nxAuEo9T3j]d]s|eM[ONCS#h8xďlZ߲ +|, $_?WhE* (8UcmF5o` +,-QC+w/dC 1,㥝NMUgRTKaij=+Sw(Ȩg-f@(ۿbF?Cg_A4/6t "UXڱKBc!wVrz] +YGi)""*wP;U-16fP06(i4b h j9z" +?A8daOvttq˄1hF.H+:q`DXPbN:.ӇZaD[ +OUR\z" =Yn5YxvU 1D<[kC>VwsULe|;ehAr #:/ W+sN'KNJ4O·ܯO(% a*`ƀRV=9i,Zbd23nm0`S +V!X6m^-XԳD@sy +R({SP˼ ^gLTNLXFUJOROC6{SO؊[3R<θ5\Kǵv:=uHbHb%bj @(: :y,Jl9a\^D5Dِb#Y5<ڂvsT0h0eЎM᥈ OP"'n%";kNU|<z89tg `D 3}FKU_ |/9u/s| S6<[=}eO!k/yvmmօrJxx=~lڦ́=s/4K1* g5|f&% gk Aj[Vto]PXXhs :Q/~&ԩ?WΈ5~/R!6IElC&61ߡ0}Cdm&-c*MŸG{![_*p[A5V_`j3OL#bjGɮ6e 1X zmM"UKBe\$Dz|)W*5rJϩUf3 H~%a?V_Nސ:^Պs~&zt+۩@ \EWN%sU)Q<jVhnͮ+l6!ZGCw[-]=gXځ1p:QuAcaSZTWcEfO5W .b+9IJO>xzo8)/}s< *]n)v߻^$~@_`"\c8WB)b/ +pqA'uU榗#jllxǺ8SO7%TC#"xڱ>P+83)2Lۭ!jY, e$ *6L2z9 ?i",QY(G2vͽ?lS,t ]90m4|FMccvN +m99\B[\hɧZF0 9Ik ǎ>q#xη%# + t9Bvb5,_S̭Kk _t+Y"V0ϥu@ˌI)$ݍiy6c%Xˢ8/dGQ.2s +1pOfR( +]L -8쁥ϨIy_m. $OSȌš?(Hb(ݓ.pIꪆxA,A,? z5@gH} endstream endobj 3514 0 obj <> endobj 3515 0 obj <> endobj 3516 0 obj <> endobj 3517 0 obj <> endobj 3507 0 obj <>stream +HWn}WC{ȆɊpHkA!9rgQק^=&El;]]}ԩSIJj( SFY9{6dzZ=_І5˳g9bXBjIjD7ú7,{#֟.nWnۯ!n[wk g+ԥJZBO-1֘SؖX(*R _{øCilpSd1ša7:\DLc1aX%ƱrRxȉV,vMwnΡ9I^,;+X8\=}Ao)Wfe6|_426!3])q&tw&nNˋ=M&zBP%zMS`I@>5 p]^M'y7XMoNB*^܋p8F8.Q{)I;Wģ22R')=0 4& ɸw?r0Qa޺9n"x!~զC;FVB%y7ԣ{]}6p.箼{OR9`ALp7+jnY?Y԰qٳ$=$QF4MA?ms)zqO~t{ݯLe7D`^z}`Qdr<ʪ06fSEIzQiZĈ쀿gע q8êI@f_f*7Hrfg+#̹-t;B R۞@_Kũ_]w;xGT W <ċ,HCjR"%>i>5Ϙ(ag{  َΎ[,3yq/bڕ9f,h~/ +bgi ݸYBmԟUa%yTc8 @=+4>stream +0 Q@&FK QPoK_,vrVjBd;& ]o=Ænhc^@7P5*>_HgꍰQz= ӏjQPfSNh tCj3 Z6L\],)o&Nnc} TGR}\e@Fl}y:U5ӆ| Jѯl:2p-'+ٹT{wf4%SȟurV0q2=I]n^;Y>Ć,ߪ@}'A/x58N [0;]Z"ez!vxIHҤ4K?<XB꾮 y,XEѺsDG1,vofMϥnOK/ZLAv]0T/:\N, Qa3/2`64ٗV]yfZs+adK^9@WI eP79ﱆ]Xrl|!̀QN%Z12cHg=q?0 ~#m )a#ߍ('evK `%M-~JSNJrv[s@C;ġp)YU V!<꣬\1|9۩{M{ba|#-9>xB ϰ6!x-Q8J>@Ju]@_}i +QH-c5|]w% VF',Du1 8 Z1N%oi<[|w 8k 8kޱX]:<|D,h5?[WULl Q2؄6` ׽ C5Xo)u`iHpFgpmpLmxjtK*bm3g3}Hm뮼4]<5}o"CY\LGW +%1cGmT> ш EîJ'kmviRv ȶc|zia(*s[Je9"}+tUYz7fwk9XqO|^fKVLFo>J\_} !9p).;qkl%h$# Ay޾g Ak&xgbB1} @23 +$f{wuN%6 Ni6b +l*ʎ2+4v.&pQAMdUa):5F u|@أi5OEz8<5m Hbtm>q{ i:Bd _?LA_ŗ IJT3fN='"wʠ+Ṕb`vJ4DU-*H4 8@ +w:A6%>e + _6“\ 6$Ο2$ugtQ"gReppܗdh`_ *m2u4쮺A.I(P=B LQ`M>̘yD +ZG.Te“`}ۮ~!bu?-zwDݑ< +bE UO1C8G4᳊sw"mrb1qO~ v;}(=bs!-Jf2:O^  c-U48xM?sޤUiG O 8мCAs[5H\HG?1`}[g}˒ʦ%JqJ=eB.{XX?A՞m<` !SΞ9 }YD2SMl2$ K-.YbDKv$%e +wMz`Wc\륶1vyd)@U/V#~zAlg[.0$SoMO<`Y! +.@ .=}or o]FL}3=}s,/TnX$8ΠӵK.w7cQۂgan6äNorgTw.Ct}I").2꣄Æhg‹x (>&z ܛt>#6J o %N'CnA%[_s K>(⟤Rd .K-uO3Ry,̖_M*"s&<;e8nxa mPy~$g,aXbd0![+ŷRT|֣S}Aٍ!XYޝ)O*%)% uBY.:b,*вjfVMTn +!`ܸp]c>Ijn8}5iNT{ٙx!6 -p}K١ +ۻI$ِ@ EyȜ:NC;'U6k?,jfyޙIj_-~|KT1Wt2Mx.W|Ҿ[BVA\lS6kAjbR['>qŘLyTH$*&U)kR `ާ]:7CtH}CG1Ղu#ϋ˰S5k_7YtY':xl6t Λ)#uI"\XN21-; iI̟湺1]nnD\v6?1+%Mγ|-.Mioo"Gr{];Eʽ|?Bu$=REQ*1c4dhlw,ꉇ輱Ws4XvCC̩ JKB#}Кʝ"ic<+ M&>cʬu`aJ=ȭ\>'-lWFGPegh,Q1цeG/ +ƓՓv(I骬Z>K#DjH_!Q!čQUz@edWP'[TB:0 9|$TG$~偗jT="'5F}2K$ɗ2liz akOG…L@dJpf$JD=pF8d +M0AQګC_Q%C͓>&F׿iH})s2|en ƨjD{MA G_\Gn?p.PR8 +Te+Q59sz k%$H("'H^ YoiPA_8$1JX_"o< kZ!~◫t9d6xG-ѫ[5ႈmtoCW!4ѿU^luj;_N.7~I_5:%UMe.}IX^rQom]Uޮɹ)>A`"u'.M-\=?3\ ٻy6.WkX]w}TIOA2!A˅9Q/[zF9M=.cאl#?Î3tNA=gU!x]ǡ_CB;ЅRF4:*oNL7811\CgӪkBrRwϡ)HἿ,>9/ed-d|j2&vjtCuiuYy?sPy +(Kȱ%EkIqBא1k0>M?9殺W[Uo5ر]QLŁcJ`Ūi8U-G{fpjxZiWǙp,rB +Px:+VmSP˘\ަ$; ,"7~04. ˎf;aG˰ <)oc8v :؁]\&,8L0 gU<[|j&rD_2On%m褙;l8)k˰%τ߽,u:U#BS"GTb{tэwYa׀α; ;wBLoB%X)`kfje}kZ/UEJG +5Dxxɬ&?òXvx-.d,__D7(Wx]Ew"~lq҆v$SMxP^.n@1gAځ;9u/.S[6:K 5 ^`{~wvΰY^>?.z ^D؟xY)r{_,Gy-?N PyZJ艗uU`*![I6W4[$6h~cLaUf +$u$oDeg"c}Ɍ@-*njp˱!NTK9 f +7D\ ,^a  [hpCcF^`^G>7t +rrdj11nWe +cKIHuT- ɍej̳yye`iQ5Tߋ`Iw% )/Khcp/Շ}{u6=X5yo*\[1^%@¢U3XA1T C'G|o`OX/'%Cy) Sgvǐ8 S V-KI409⑖g؊_M/S=$~Aҫ4o; +˯7)_ǂu}]dX\!/H\'PNG]ǵw3ۨ]x]}5ǥ6pO9k@jng.[J%q#lb~1>eo+;3%2K +!IKbȠxS +|w@EH0pDK +j~I#@̫MhEԌ}ߔк" UC-(a^U^qtR +8T::qP*}-;Z z'֤h\?ޜh8ɚCVx9;^, W6[f0~!R*$К \tPӣVLJd8< mkDbmd-:H&)wSsYoRy_v|z;u$$'ګ;f׀s~ɽ/пefIPTZԇ*pcE3 Dgz,GHH7^l +oQ%#) %(̺;D2^Y?5WdY8@ ^dBnLN>P=RfE-f`h/?*7Ϫ7u [wl1[:K "-B PNMN A_*3o`Eﭸ1jgg.bF8i0-&,WݔIk,m92U%x#f,"bC7myyRmB&E9^/[f,bQֲ6ͽzԱ|bB(f?[YpU. pp1K٧6% +@dX٫wɇQ!DܪkY"'D˱YȽ h;K#HaBZ!ހE$h2g+@"f5FKv1 ,l_d +FjOzdQQ#ړr=)g=N8Y^:CH Gt"Qo3Q2"5FPZ}KF D +I|ڷVf/+O|@xcs@rU:; Kl76R`Nm; BKeQ Ki-WI?8P 3/Y + wXT:e#e4n ŖYΊA_ƫke=$*G&XN[*r[/M9=ʐV@{;M&D?8\VTȌ1xT~sUŦf8|ԯoɒV#PRhhΧ`u$Za +?# +nsF,c9kEIԺŃ*-}HYi^IIGFGCZcEP_lb!QT܏: +e8|0io[yJ{ǠNhX6Obch}?mdbg-WS65Rö`~:4>-ccVW41նޮ޺~alO]+XLG#I XĚ -!^{ b)?\V>Ԭ=2ũwVL|;$%el^YD~Q(!w}` 4y2q)WϩGxɨe'h^gҢ"C@3Z߂P,孬k5WsP&:-i1ckӥaޓ9<}x1*2-Xa#~g+=9'4b~{5Q2E(qxxyDZ~|+z+)%eIscCc5 e (ףP#UoH R+GHV%Sz۞'r"i]f~Oj-=ܕ1NɁE'[ wÁAŽƿGٯm6Tpw]~L|AقhNt#}g( 28냾YVmun`흸MDd"tvKHD"Ԯ33sQX]ӮP]|Ӗ91BBQnѷ[d`ehCkhȓ~Y济+"Ĥ&cS^>ȉxtz)oXR5u xglt\+R"#;mĝSOغ۩ۡE,6 oS +e)V(9MۘvP-ZqVb PK$u냰U1>m@|:hf6}W|B7yzIn剛CUjCs,k@~R蹣ﯸm͒+('JGæ)ٴ ga~h%! UۯhW +I{R/`2:S\\zw|GXVr?Y>rҜi wޞ7M~B.8ry*xFy1&0 \|9 +؜̡ }dZ_ŷw +WrِsTtO3р2Mx]#D=%]XILNl_c}˵?>|B8-X}z(y.͡W&pV01qBU^٣J~׶A!piS5B7VI]K4ɬi@%bUWS:[\Ks.&tF¡nWo&OJh|[Of3 iI0S& l06/~_> ٓUY^o_])tKdʤ@ v397.'3i -xvmV*v,aE5T ЛNCyM,owz~bF%N }` vAh^a߹so!RCWb-} vOzֺNXoH 6st9g!8l q}+{–ZcVjMz#lrGk[5~- ̧߆`Һ7W}L Zj9q6iʘ0GJ#j֟ ^ 1Iv~ Ł78u) {#]junkd5Z;&gGs:4YyL(ۘq ؍1΁QgO ]Qx⍢QMb ]NZ4Tw9"VAEeILAH@PS](z_j +Dh(/?9}BZ>kwGe(͵u4#x`J_mf8*{IҰzz㝂a(i9,%̍%1KA/-GVS8NWAyK[zK%PDFVU}7$"Da`dKlt^(?[9;:,S~$ |aCr넱WO3LyvE|7^2$hY7E|( ơȱ ID`:/!JuF@[è4N< ~Pg@o޷,1~V,}WnD2> zd2AMH"5_ h$ZnDO +y(8i(u&0L֯~y?-{eDYwkDH 78݉ ǜ0yWTO?gX3Tz!ǵklׯ#—cӦlldqCAogm=[Қ~)]?"wL6޴Af^PnP@c3Y*ts4Unt"e&a'E߬TnZaJ@]D ϒp*H +#Vgh +o͜S.H. U05MiK\qlGw}'HA^5޳0 }P3?琢Vk9x/h>IȈ׽ᦍXIH;AH|n fs~p

20E+ s=Lh~z?`=!8<'|ۮ6v$f yr3fihJ\vؾE:8k9ƲDqu\#$}4.ݞ,O7R1\2\d !N!vI b i$ ) ?r* +Y}GlBWT$T\EE 5R 5  avgQ)U.>+Bm76RޭFQ$g|ɯ?V GVxw;ն#`R齝{LHU3_ @m,Ϣrnk}!渫[֢Bs4UsmXAHxֶ:cA +wk^_Mm-GoK+`JŢfw>qwku@v0s#p:qgVTܬd`_j0_b]?=^ |)vM^?ڎwIqrA4;K9~)J .zڎ&B2Ay2tb}}g9_FEL9*SxMw&/ϨvM8Gi1z06ô8}zHÑߠisVZh1(?K4~H-ndƏNsKO44COHu͉.\a=Ėm0& f/@ݮ&ʰmhK lɷ}ӏ{ +Va endstream endobj 3398 0 obj <>stream +0 U@&S U_¤p6HKB/kD4qv<)K6axIl]B{1DpldP?P6Cw+\{Ż25qP0RO#7<%\HX= +ڶ+:P$eC\֞A) Ϩȋí2xπfNԬqaB4(dJ (.XN5 qu fC1{eR +=p}8se08~LhkȖgQ%0$?0rq)sy̶";|̠ sBh{%<< `=h{ KP:ejP2_CU74Sr\_jof +Uw !t,F{Zt`hȈW%]`֗ x&Xܜb@#Zd}x%ͨt,yQvaiZ8tɣ>69'Ȅ$Kڶo13iOwAɓgSޗ/n8öƱM.*K?{/ +{vqȬcҍ+`o t-]HZjGy$/"sУֳ9 +V!+}3|\{U<*B< E-7[&9{{'2շ7().X|ze b&MdM0jSUdK@·,jBXTOm /hL&1z%hk6 z]5B@T3+$OJmTۉS)|{/'P$\VT]sU^ ̷ 4v"4#>&b}ڒ\ +h&e&aRaG_B1S+/R0L޿bCt>S tmY R▯kV" Q&׆J%qRySJFG0>LX7V7KUFՂ?Fj@"h<]O1m+; 'H- FDtz^#Jٹ>X&F) b\exh4s>B\5eYK-~ݸ/ +o +]QK1kZA0c$ob(~%+F,:.7cx jq0!+l#;yh IIyI([hJ *L#{c%X,e)uUHt;= qV{Ak'-(l\ۄ{?5yc8㚬Ayb/V=d{8--fbL\(;{=f}0#pu>$h797~9 R8}XTYZ2) L}޺ kuܮ{ ЂK~P[Cy-ҏCsgɞG,2n>ZFEGxN &Jm·~ `BhTC0aJ@.R*phmX 7(z, ?˙.,ς1Ko!>Y9_?/.//z`(z: 0O5.&L:ƒ5Ј~d"z0$;=J0R ȋ!(.wPᚕq2H[,A-M/KdC4NU+'jmemg>HkPNif{v &$f·h5ܒe/W}`)dvUK٣z\>x4Z?_-Eqr$ؓ v¶LW(xzkѧs5[cN[놃uY !;< yR"7w]O :1FE o&$Fdn:vmͦ< *[3vad{ '57ZܪЉUOFnY6{%{Łz(+*u*(y$@52f +5S{T^)ef>j,h56oU}$ H@JXD_e'*|Sp[Dl {"Om+qk?3T)K3T':RtpF&3 ǧ,b(_u>\3Z+s9/y|?f;V GaY+̗֚UvB_wwFHY."5@=%UsϱVhW=I eKz]?&4ݮ7Qzr yeeF}1~ M*1)}>::ɍ[}N9 fH}HyQv4H/M<5s{aY6HOWC}P:DOvz];T A"<3v%OHW G]q3HTE* SBpyS5 Hx {̈́xlg~8?@2MV +PvpbpMG{%>hF+oVD0@s S _ruRԁ1k#QCOcA-u +:o_o[,jIٳt֋/DvL>!:B9 U5~z7h,7#,v=S6*gM]!7,-`Ez^ġߔ-pL;[> U \; +=W[Ծ?@7Rk`q<M|ޛ'&@Z2ȩSc{o&\r0 0R/^c 9o7hUT*ZN@`Bs)l6I'*@:,<(=R0ټi `фUDYZd) 0;Y ֌aژS;'{x+Mv"r tX֐fLpʧZZ9]iJeF:z:3 r#>XY!'+~If"CjbeB7 PoОH1p¤kn~E=Va4p|FZ'YE1 \>Qo~o=׌[ӟR}u|EfLP}Pq"mj(2 z.\J FY%0[4^  uvI=+]34(]k0tBZ>ѢGq+"DVGZ^l8lpòtSY$ݥRbmV.)Gr[z1 H-4k0^O.@))3G t`NWTK ܤǍp D xL'Q`XHC0]]:pj[0WE aScBcǼ#7*,P.W})˘9$<h]?B'n]EҖ: 2IW=^HWQp-Rn&<A;a҈0AR'n ]V9X2hK~OVS +.ȕq]3<~7Ö}ca㬀iP@i׷(7WN6(ւ.ax}W 5[ãl" LH;bHN3;u DFBKn]*js.IƏ^rbV/{k/+2>d`6L=נKmW>xKisb +sͯJKeYe{򧚷$_1'W{ {+U$U [Фقl]pۋgwEk*B$ JR_n~u+`}l7yZ)PoDNR/y 3^)o66g.IF|j^ JWW'GtvM UqQCA.{GrD==dYJ;}2O1|XYn3z >nͅ$E%5ԃK jٓR>~AIf9,ؑ˚db}NᨙuIqJ~`5'T CǏszla5$'Ӝ4X _nJR)َɬ^cbHB;Ks>/"k,o>,#au_>@ vIpzXS>8bOaZG7 +rQY$s۔ZdhO]ռm2kOڑ_#]} 2~E[8y1-ؓ9~3(5up>R'-s<`346UNq(!YJ>D>u adװΐe q4juHԟuNSX`2 *T5ITro˜`"Hv0&_Ndr%D8p1@;zGZɡ)ހv!YH>0gfJ)sF7T^e+.GyFcleWmE%ߨ"XaG!ԕ FWrˍQIm|0=8,። 2j.]h7,ow*Muyx;c4U!Ŵj8;;E:7sy}8^jAcK(A񠺍#ԡ +T|zeלzr>͑tRG ؜{5:A'V,z+V/R1woꔤ-g^k)|kRv#/6>2@j-'ވۿ ;+x^Dzϵ%/J2I7,"2R8\8gԁZDl*3i/EYF;G'~$n:OSE03;NuŊab 6[P:uoM+>_N~00&fyiTn ꗴ6~!D+?dGCHwel41|K3*>*o.&Ìأ"&-3ӱ}lhr +(ܯ%af0S)@WikgPDW/~DB$rH]ijwr)m2U)¦n׊ =j)V%|-P3ɺ_J̟T (˵;WQ +1'$"}f!LDX2x[(.VXܯ2ޙ 3ThZAGс`nĦ* B5RW-_%nh)f/0=NC:\V|'OX˝cEwE;N.M3H /L +.{2欱Q]4S28X'?T| 44ð/M%2ر} f*7WE6;jkb4mKL@F-Dʇ?08L響?Qm1['8+7B錴Mr'T)؃..=hDttSe)#! (sMr]SAa`ljWu햼xdw,$B_rk) JS[[-f B +S,!\\Oᗗ}# cE ckB&ctڕ5%b'ɳ#Jg=p2P^N'XcȉZt'1}c9}^ʉMMw-%waɉCpD?Fvc; I!p;+ԯ^&=y%nho{#ŌkN3\.r ^-WԼ9m/ʼnmlF3vevś(!4Ȋ߰gs(&'Fv41i}&2h~FRK2 eDI'c +MyrB^u0Lsjq7{RVX+u ?VQ\mSd󒾅aunKWP;#gdNgZޅR6ч ztZ$)% +wܻwut|a=ZGPAG:r +~NB'T<  JZʇ؛tSfu?ִ1mH>fJ2t7s;4P+]6pWa,rZL ^R}%`ɞbᘳi ^j0O _!QO\V6;(`\Hk6w[-swYaIy_2TjTabmE#FOfc&h?\%?Dv@Y[ؿLs=Xt@0SkLm(\,::H-DmB:oзzǶ[c>F78.^GKlKᶨ#7o`w:6:&q-~'| B#\KwMTQ[llE^S~=MJ^98PDD'X`oTU/Wܪ.F8;YgpZ'#tbtp-Kr +G9ٴz(Kr4 +1.o!7o.â#P*4wW +\b C8c4@ǰ~]P v0gKnH[)~#$BncPftg҂a|UjQ-/S[~7y z6$#xeTl㋔>OȑbD|c>|Yힰ*h,}lOvw=>P-O"m^ [۔q(_A根!z{PHOn^,2JEh$swq(-jN?\? qB5wfOE>씦t}>Dtg!A*U `B̂(Dhtb(P`Fn+v@ Ԧ^k}= y͐4b-C\O2OA;?KrMfVEHz4MÕ4=4()Q an3~0U:DE%jvڽ63X娌BZwRA0 ihgC?bL}WֳD3'5ŗ)B)HiM=*εՁH +m(&cv0j<ׇѠٱXK)V PT6gk+Z$ϵ(ѢwTc;] \g׽3&Q{v!UҡFrxzL>E[ +D.{ \]o Kz|I>,;m'7 f(N w*Fb؀.%׻wPlߪ6⮘96AFGXmޫ:KvrObÝ4%A#~<¡ya8(ʤUP6T^˔̎p%ZS(scT +Z[1g^dX&p"~kv6tzv⅛ !쩪xZ(}<>ap濖Og@c'6JV}zܿ^( JSpL5D2.Mkar$pS[7 X+Vv{89qKWXҾSתi;g#)hve_tHG"ڸ \J8L "KfQyOٌgB#5hޯnK`X]q7UN/<.1S|p؆ӽi=L +fЁ1>^#h# LɃ#JWDj3Z'U +fK6It;H^@04 h'Vyk/mM;;}vkgB"V1DOEtjxR ߽HإsHf`/ lڛhEh=vjZ +_⊷Ea5/mm~qǛC 1µ/͒Cm2\aB[qi0?:;ela}ѐ {#甭O[uV+z$T.eCf9;?L 2@ҩo31.s@#eg.R_SxȮv=Rp[5XYݷ2c蹞 aF%"dү/)heMTD%Vi0y^ }y&OجLv=|q"_-<IWg?( [i-$/L_A:n(d{\ZQR5ݩԱvhW 4E夢Og2I2pSx TLY4~#J ̞8SRU\a{4Jtx;HPC9cA+R{~@Jא0#/?1W>.qRA qE BL6R[{pJ'i~8kBI]!_Ra{mp,&?-!8?% Z.MPhs\v>rJms!DLefêmA$Tb"Y&kChB<4 \.Fd  ԉ[fn$a~ |}h$=ܱWr .r$aT$qYOILK~":/VqA‚2NC5`l Y@mmc`Otj~WP[k_P&갾d$竈Dj _ba[Zh1_n,l&Y}47f|ApsoS vw,a +;D詓Q/w$Hlvg6Ju/+F[ +'D;W_WIED95zcqhB6{TLGW)5} 땹 +hywgc=D{O:%[^C{S#/ +CEbqPIޤLrf!Htw, jRLX/ +Wߥ73w;N>LrUf#dg]C0/3 v_;46adZq^_=NU o/ԟ|wDަ O&KtSl>*#d~quN%Kgw`teaWoU<s!2 g\1$Z]J&@ +2% +f+meyL;`b5i%R⚗ +eΕ#4kgߏ]Z4kB\=JQ"u"iO769EX١3Ԕ<[ ll]NlAjmTJc8_BnTeʒ-Lд6KU*n:8] nXwO4"`Sh'M1-\ʤW9n>ضd0Jmdu;WA +oOξdV;0bTb-h' 6t~`)9۞]/cǹ mucN~ |.6% Bu~5ɬV_~rai&c_eͪw{ަ/,GBdn 'E7kt.LZ~O)gcr)V$*+53JJŋĠwp"wre!;ttBC:+U{@NBRM9*/kdP sE|_S"pVhbml{ Z3\KcGDx9>[ۉ^uȖ?Swߒ 3̯؈?sIuO!Ng?s4CtqL߮p]xn@ [uϦ!@bſL7.[FU|BGaMz +Qqn*&6̽f0c'2"Rzn*-^2́ /܋'/%흒]4Oc +]4{nZ a/EL?O^t7rx|5uVBx:AnyP3(#[}Jg) anmgbI`yT;MHh Bh,ZDeǷ31m%0.>$cZ#: .F/Md\ +M$5)ONnJܤE=<2m7/቎D`v bJ o4"e` gGppjE%;yP\Z3NI[FfG +CGkq]js%'TNCYݝ>?LrG&YgGOHz\\OIEqY2/@DP)E1Jo6'~!Y2mGew(x`'7AG[HaiŚHw5ShҢ0ٝ,Xy "٠aC-=' gB*K|X>lP ɐ @';47 +;rQqmٍP$GS<2ių {]yr+,YXaq$d%{+ĎnWkAӻG>W0 Z"X0뮟<:ai/G):Qk6Zf +>0ABS`vNj,?~Fme@ܡl;+Ղ[-xco53P e'&FiyGO7*B>KKzb9E %awZگUNo-Qsq0VU:D%ň0-7HPS0<+'2xΕ==○$m Vx3O?+wުGJnh7f](mev |~!W8eNm Dׁ]m[#-TbH;UB?_™B*e CIVeI~MッQgKw63&LS3ɼXX+&Y/C;ߟ W_('V-߻,jKzw]F^;i buv*xߣWЦ*=Z6q-nԱ()eI0bmOaa_Qlm,r]$Ieᵵv\'Sү="8e>HQI*E:D&#0H]E6?z`n<1ʜU@C|;aĬ4tDQ<2Ek`ҶʇM(]^@dHcQTYo>w/Z#c:(Rg=Ǝ +wA@Me?2ہ;#5B|+?+i)br +q+Z0FJfdjM+R%ֺiˉxA9wvHhoɔeDq׆mT=#*v ?LA7=qDd^':R|}BEԱ re~"fO~w[w@ RI1T"=2]{WrVD,tGڙ Kb;+ee + Ċq_MQ0{Z!=3_-OqQUvN H3[DE2{>Vy6^T!j+>! 7yE\i)2F-xkj^G/)dç-Z|ٓDseyr1{V:;۟%J +*}5Rg>BA"'׫[&ahAI$\UtfhÝQ!6DX#z[;I*qrFox +3E0n7žy+0ݖ Σ,ӭx#`s>˹XCR3ta4 dlZUV[瘋R$hq, THi @#$l> *TXt)_Y7 6QȸP}o~MhfnUOmg![a}'uM154OugU3$tWZ}ƞ>qaXZ`u$ G|Ԥ^yg'b8˟u>m9߰'{=?"wa3I}*_ި:좯>d4 -/ +å7iX>R]exfRi")@z#gc|y߳b|<:z]Z"omzVl%gR=ZykѸ;ݐz=0W 1\K7ĥjUbuq2U! ³NŢ1@ިȠCq;laz +^o>VwqT4] XKkQt"󀽔$PSJ*)/;n_WA;J1F&z߭3l!0jȃ>(Nf:9㤦@76g"ɊNIx +rGh; +xQ8lWZ{@<er#y)3R> J3]5-Bµ2UDVK;}}wKhTB_#_BmENv^e"-0 Ύlm-k fه>B!P -U*XL/Nfk!i;o";a1xu + + 3ڒ\hݼ~ @1c1[lGߙbI7˛WX}Ysjy5SDf, Z}ɨXwY9+;׼Tx*g困X5iF$瓿S>xM(ZE|h5gs*r<`9[zm[-j']2[y9 lk hjCLq Rd^nS7Ww77 >u H0n U4ruEʏa/ppKR98RD1&>J+8 zͷ~#23~CH÷- gTAt0uUh3h=C!]S)4JKX/f2~M٭ǂU4J~[C'JpGIݒy5\[٤k$\Et 3,PK+b,쳦;ps6akw1!%=ϚaYxɛ0%2;r -]N@9ЕnwaT/WZ {ɟG7DS(Է[lL:Ł S='&6jXHZ|j3CcNq_&)5iywEٞ.[K7\( Vs|HM&8pʴ\,3a.%i$s>8{_s({_R%íEj-N2ӂaD)*wO@% w\6h]C8BHB@;MS!:#T5\xH [@Hu/kzbvz8betgknHnqZVO+2E">J (wJQ˕AXhO-J3{Yr7H;J}ئ+ϽC' +'uq#T<|V< 9.\쇗Sk +<)-~̖ \SNn~jE}" OQфOviZioouA{%-?P:_f67x: C@HD>E 4̈n^fȑЊIv[;P„Ҫ3"[ޟa (Đnt/3yת)a8X0yUr6?L=z4OyXD航'aˇ\mFa endstream endobj 3395 0 obj <> endobj 3396 0 obj <> endobj 3397 0 obj <> endobj 3387 0 obj <>stream +HWmo7_ߚ6;5).h-`Xky[Iq;$KrmY[/p^ygR ʊ(F={V7g>evfT3J(UūY[Ofp[I)gfvVg;u?wծ76kD_޿)Htf?"+$ڛ\x8,4 (F%0#>kEih&!nڴ3Œ! %TۇncqTn:tSN kmFJ,pE?\ jԕ0(ٽ`H۩b!X0bEO(:jals4_v]cU8Xuxv lweEmjpW8+_w,x}]x,MMXC?|P?,# 8a"F1.7U!ws/uBE-s ?֋RLpA.\w_/8TuijZf w<rXԣZ:2WWXkBKDQ$[I(Ř!n[ҳj"pnJN҆!%gcfY`$8p+My?)(5azW/e0!wݵvl֧0U-w⡩WXBTOOAB +8T)_S.8dA1KG96\@bQ(zQPbFeem<+|́?\?{x$m&|Gۆ ]AQ@$vs{ˎb+MzRd ӈ0v7f)R7}% SxԂ6p>WS, G1N(SN*Xj`lf*a6ʉWY +C~I24 CnxǡCD=z;49{]e63TljO|i|6F36+;E,p*e'RIV 9%?y?SŴ7 c{)Z8ᔞK5M95Ϳq=,wvޮ^l=k`Z ̿<)x}KiR1YIOPAj塬g!ƪ~8!4h~ɢT.$:K=ɺ8j4$0(Ѻ=FeA;#mƍ0$ +M?IˍWp,{1$!h.fwp%jiqo]@e󵓒~H{1S,x*&QuJkD|.]hn rQ2눐0\XN/YDǀxaߥ8tLXfLcƩ2?x=`rK4d2TSș"2`|R>q]!\xHm9zgOdBy> j=Зf$ފ!"ӄ;m|îXnf42)FV>mo3ԯ(lz.U'ɕiRAe ̈́gBaNTPbl֨%0S~fm̸aY,B + &6zȣ88WPШPa(ĥ5%cz"C=!K\CI@[2>>U~O$RƮnJܵAN{іϣu$ASCp"RK1PʍU&Fvzw|bbz q>ބoG㗯͋B@7&|N٥صy+))8P@>@X%:m]VƆn7}7 +fH&] +(1W׻*˨DM!EIҡ Eֱ' QYs +)6G,(4 luQO?/$#-mNԉfpX58~ƋQ9ϰWbpU"i,^n\x/FVTϺ'fyPt\wݞډIp;9 H![asDY^.EG]L󝬏VvW!뻾MxVB0MAbg@=#}|BdND$.c^]cS X]{M;5K<%NP$x2!QJa:P Ls0z|Z:8>{(evlTZKJ~{Sγl4pݴB,@tN) endstream endobj 3393 0 obj <>stream +0 Q@&E QTbuinwYR:ݫ>B + @8-%4):!+ +x0xjג 7fAG>2 WPP0gMF**]C]oʃ/b+!F;5?]a q_YvYNќ5#%U6a d%[1fe E/ s\V}ƳN?^o#2. NdH&;y/l\(OFY9xxv /< [JRUB=^Pt2b42,UVNnka*Y5DOj-;#){ +qn^/[&F8L?+W;ܥ33.5C3ˁظ7˜W2Kgt9Y :rKfZ ER:>*呙\Ḕ1G&vz v&3!ţa/0.utjGyzo_Hڜ` d%3lwQ]^>wncCoQ|„|5JCӊNeXڶuDsyaC2ic20X#v -*S!o7ww9 ~e$6-%zuhY4+cW,,<8Ž?"R'O!>Q[K\;$Fg1||p5A sQCKrh oT mD!-E5lXLNliկIߢy# +/ސMF,Oa_U}`v0[ 6~@K=a8Rp1$mOzZGWOe)/m@96H`)t#>^`V%_̞'y۬15ud:`|K]s_#zm1ߏ}[qlcR!abD+(αY5 8QPD f!M=ȦNܚW{ՇAy;"e3Tubl|˓+'*R62H,Q2qL~;11 I ȴJFB1~%5F$uV=BXȸkU+`7Ql7]H@nsXl=R%+qi1[ {k(+0cH23Al͈3HgqIazZ?=$;bKz2dTnFSl$P]9,¯%d<=6[,_ӥ=uYl߷SD 8 . +ynbrgꅟeb9Zv7x3RU$N7dXΜ̚q1wYIjvZ"`L7ўh*IeZ>K*'ش+kMca0J78!-(#-CgߖD^Xd%1t02ݵ^NQٻKz-So}Vi#_4.a>qb վ΋)@ ˴!C@ee)_8}WeDμk_ )Ihpן̬D~Z JG1nqk~BثGNj cx"5 &ecq;EÏRWq dv7Z_Z5eYm8m4;{tM˓;Hi풙0"y^;Ne眴e#1ntaX%;9m(?dkUy=- e˻6yٯ?a;MY' I;HcM7BxqdD[OGb_@;H<r[V}+UVS 2aTZs>G@4ޕnZ6kԝz<0FO%5߄. ЛUVKF| K.[a\ޫc~T;nՆ.F8tNۛ`KYYOؕ3>6t&#Z8zfLŜa4⫙mȕ|o&ܵ6gV<ަsOŏ=.0A#QX 'uk $IdDDH)hS=q@aA~LV Ī}n?:ȫ:b;S0MFrpt"w߻%HK9R,d`Qy{ޕhRy8 hMD_hؔ9 ` +2^kP" +1ם|>3$SpM+nX%dtkxGX 30.~8_ O͵.˿𹲣|*=M T1p;$c%BBЈhګ񷳣:(䯔(!+FQ0;S(K P~aV(Z(*kAp-۰v,qU g$I-˕vGeJ'a3:kӑ;8L!(W'D^?13z#C6‰J[AmZDH;j]/sHTqi +}jKt*KC鐺 A)Gѧn1QblsGNfrBw𰵐Lk0<)UFLv+RO5|v3N\RRtKIr|jV[j̡מ+]*<_#%[+U0'E#Z.E^HzͲs)^vQ "ib>l_y["qUЄuwKwu3uWlpÁ˦ +wgiia%7'$'ARZP +_V=:H W㐣\0\st3\Ӷu &vs#>c|xt^U~k%_WM1M[ԿfO0z DbxfiI=8=Ւ.Xwp_וQ +mkQSqrVuY+u"ܲѰ\^jKJ>m =ۄϭ u"=uՀva}F2u I88Vf$>fQ +Uϖ l2lnag,~<< qj<0jl!*:Ҩ;n+ Uܔ|4=heH4o;TrU.֓5K]rv3\0yNeuEE{0[Usk &IyG?ɵ'鯄ↃclfݲgBv! $sWrCs}*@fI?`Fwzu`p){uz>H+;Љi^*>on[=;Ǖn¥N4_cw Ql_)|Ѿ2}A3mY[4\K; +SlSh(IuŅ8 ,`) + @YeY3%~\k3+k0Kݷ;V`u,@I13}QN6 F +B߹ߕɥ肼-/ |?_XrzW+TA Ξ́Iem;{RI]>Yf<)%`b'~vݑ'%RY9_tXM:G85nx .lۏ3zL6Zװ_),h_hB- GV!.Z~;ScسSyFյA@9h e}b;)>pj䝴4TΎDtqֹp-rC !2EZw)0=8K<>2uJrm#NJLK&\,㥌c[T39w{Sf0&}un󕂁e" =1#f{g0^@n5Ձ;[ĢnQLUPXTlÉ֮k䮢/6ܟm`zE?L|%^ $ +m;;yß' 'S,Rx;9ZD)u9sd9^Yr1{K lO鱜c? Gu1m?"|e˄V)7ĕGGm9TQ B^.&B+ ٲ\hc2PJ">~f-D^}pjʵnj+ -Oal6y6$s|뷼yO"oRw!ɢRʉETgm&S\QuGux}V(Ŷ@.c}ZǼїǠU<\5 Yk.IwIan)g)]p۱U-7ãNfw\Ւ"BDoG.hNl10'Ǯ8ZN(b^,KXkZ bxC},u +9AgַX%M~dxa@KCKD `8&/VyIV +{BIȖjKA[DI@KIWkˆzVȮ5x? H V"b437>rx+Ui7";W(), ~F"3۪hYB_>7iB-j7qq6>_Z8৫i"("G7o6<|69cܴ= {\j_Mt桕mwp(8V MIά38f7"pqȎ(Oxږv:y/Jғgӥln0'7B('gB-yPf~ryia}?c8&&2VoSVֿ*pm ֢;ΤM(\<} +q(36 f7&7xr=.?bPQ q)3.ӲËj vSUfbK IGe%a-g"r f˭zR2 W-G_KL#U@ql=-}Dk5#O-`ֶx3'Qe$PacS],k ;& +YQ*mtdD.&դtbDʄIcegnA"_c~Yd̛OU^al+ zRO H=v1n!6o)B& Vg3[1"mW]N+BP +rWb_;=:M9~F4#5'MA(/ser XsIAq 綘$q#N^Oxo0 8n\Ku@wg˘|D jym>P2˶(߈{0xvݛj_iF7n he3&b@Cҕ:nܟ~ +KRHs`2 Ip˂/冮sI]Գæe~>G)6PEH ޟ 3 +zB7bN~Fo!siKta S"ѱɁXkEKޘ3Lbğ_0Tvc+F WH!5 t{؞ h AQDj,8& ySXMsx=X7W|!{o'0֪|.|ĉ$Eq!Qf2Ḱ TS.U8!>vjճn(qE3ڇG{pJ:E\‹юII07oX1iXwà [-N#͇7Mo3Fr&t $-̙(X.uZ.w/ʸ&1taW݈p;#DDI✣GVСu+D߄34DK*ȶ~ w5baqlB亨 cwu?[~t9kEtx.S;=E!Wq@q7rvm +z4}p +yOS$5%U3*xF|qqNrv?RhT8u0%eNԳMg&>9EÆV|9gFlڍ#-OM k{l)#J߳5_~S,0 Yiu!l+6j[Ƥ7hb/sye $eVt%㦪E-RLP\DdwnpˑXv+'>1HDeU6qn6ʬwS^i|4_$Uݦ1EE +6{%?:Lg+;HK͉fw +$sy[ )ûd?X`#8,iF*Us>5$S<(sy3 7}n<.2S?DN>-\Iyl +yg|@}^c8· :5'}~i!ӡ)Be]j= +o2! /e,JͧSCBC0aq_Kq|Q͙RsLdvE + fڽxL{;?PGOV6c.]MZe -:6[LC(wh՟m{D|Pt1* ΝtX BIGLp6l2:?5SNvggt_a.{4UuYҔ7怵CATԯFo+eg?sxW3(q4 +!e?'}gveȨwme +#ȓȂٯaj4Ԙ3L۹% _ƌK"/~wT2FǸgjŏWu5al;8򨍇r^"7]C'^ vU VB*6o,XѭE-R"x9dGsu7=`'RWh6fD/"VK&I1 em[/`Lπ(V Ct\>,*n e벺,tt3r;0d +PQ)?PjmNs.G5a%sT ':2jq#O9ԋ2500]ZJRM !zII0n2WS"$PxiQ2_oe[_Զf|vXS]r*&SC@2[D QBFں MG("ۙ4KFpM %p>d <8ex 8k1)s¦MItrp,"zHDնs;= NBф$Ÿw\"ΠxUl^H:ㄉlEj/Vsyp!)$qbaOB0{cxn)U{t.9蟀ax"kt$Qy[O*g)?gm.JYA=L$Qv'BmHYƥGEyF񝮹o6Xh"pw2W ءVDn j 13!6jWR.T_LqEcYq~[AIxt_XoH^W6]Y"_^4qS]lP +V1`XPu&y O2ŏhZ [|C@(;^|9SC Lm-=2tr߻ BgdYH2~A֓WvvE搈;V$SmÇcm j]W;vTauQX~F3P mUxK#akCxK܁v~mf]I;D0hpճORS^MU }ж^#1}7G_- G*8:n +'?UbDUr?VFluSSmtACٜb]Ir9Ι +-b͹c1Dȷpmqz>[ԇp셙NEτ\ȅY#kR5'2ӁCIhO!Z2,>"Y)*r-2sGj|`gBv潠^օDB*hS\'ԂPcFaPC+{V!.'4j 8Im\|1[o0y]6~>¼vn=P$t')!K y `e8[`id gUECؓMӐ cYl^/Z-m5^fb_0MF;c2`v(S{`lFQl ?M׌%X' 5/x+I0΃ JWty,@Lĺ$.r p_Fa$/ŏLg+^oZ_7*7s,(zޣ7L;M + +2zI.؇yKhE`zE7ցXY 6V $XK}@ҳʢu:nѻm˂[ Sn@piބ?fxcS;&!=ϴ ~Iz 3Lͫec"U6OIGn㰭/C 1/F`yU/4?e#wtӞ-2y\N_ #Dδ4n'O|mذ9 T#zW_dWW*;FJ(gb F$pa"\I=D?'cu;+į),tC[c֬zt[CHDė@y"#{7[Qӿ@MD X (&,ۇW*ɤ*R;Z{Q'W~U9\HU󥡀P_*fp'7MܾdM| ,UF52\Pf $$6\$I 6ẦOLXtɮ$DV%ܾ)k gZn9(ެ~&(|[R[\7L:DGIGc66>T\\ Bs䲩HWmg/DjAz7wCEc.dc%S*ꙌqڤS#axGNL2+qƄAnN&6vz!yFߴbly)' .4 DJ͉,?|[i4dn#iHYK + 3fO2Htdx]WfVBسjN}XM"vD&gB_F8xΆW~YRW܆ Sn1\VdV; /}OX-+?r[$Hi7"Q+>Y&1%EgMPWk{k\v7$6:[F]3j +&>|&dTGF}(c-y,nLg + ]lt+ZV\{}K)ޟ:{=-p9hmd_.1EL)i*6W>%*댽aڎ@N:%Houz!(QƐ)R ~adan Uv@3F:-]QqQޣ]ʧ(ɿJx06 aP4ݥmxɶ"@ +5-]8]l 6RzeP@#HPŤSbq2tqs`2r \S(UD! Lf= $Յ.DHV TI@t FVad)όTx#hsȐg}F,6 X&RZuӆ.{j lXuL5*Q\[8i*;40^k=#^+VQ0Wk&eZ>_ɺ>  q)Kqὖ +8QF9zBrᶾaVhrjpQ:*3v*$EQߠOr5Ѱ6UFϙЫr ۪(VPڦ`%t\ʴHt}h']Q#,e(6ֈ:z;Ep(yy ʖ)O.w@&6 Ʌ8C=:Z +%sQ~=TɘoE _`iW@ٛ?D/ nӑ𧙊& ݃څ,4K޺ċ;:g4|IQcŞl X j? I0&`]ٲ @V>E'؉sv+rҨ?B JQjBυ`@+K|8 3n,CXrw3!td7`0!<|7x4^B 5>*0FNXe/`PleAB~wY>+dCxm4s2A4C B"-E>[…_Vy D'gb!8Up@A ?4q{`"0>쌦gf4;wiRJ`:MɮQ̌;JsNZL;%&sK bٺIqӎt=XйUԁxY,9Ga\E\tlB^q=2oW;>BA|F%( {5p>/Wd#u"-]}]Q.,3c1LCV~29okqw}+mj*{hT*Mo)ȀsFr>r9Ehyۖ[dqf#Q.[bqM<,M{ J֏Urae*!X@c6%%0ӻ/Iqؤ[ӧMoƽ סO&J6d7< M +< uBΞ̕ +sF{xCy#0 _SZ^.9]P" +:VMV ަ`D[Z͘ i3t*: npnՐ-4/e,Ys&?@*wn;Z [Zc\|JBg@6vjZ4'Τ9ILr"1_ʝIVԾ8E;\nj :cBShLjJV|5E3ϡ)+)ٶlH!.?`Rrˊck5>+dp-"wV\Uj̓Nw%H*nI3(K +.#y?<~?98)ݶ^ ]ŌVci,sIDK/f5Wx :؇Sܜn~xI7 >$6W]-kGDqr^bFb.؋$b%F,$r fyx *dp9:% y'Pt7i s+>ֳ Ue~`35n&:̤:y +#hy}3Ou·'thdٽNį周Nwe9O' Sce1N!@BBdn.l$}{֋~6تDx99Qqēa0@meiMij?=]K@r$< L=vVkfih-WD#_)r TS!}hV(n*QT0 XY5k֡P=5Ɗ;Oݑi@?VuwS蟄2fzkW){_)XAԷo $ݿ~mXoB7$*Y^q "dg1tTF](pkVπUj4Ka6}\,]Z 4DA<~^%Mjhq9͔){"߰ZVŁIQ) +$,ӛ` DIBwHdlv$A9F끪"Uo(JqLy@2 ,(YZaS-3: +^ Fcш%Y'`j7MS̕awst*L#L%RX1g֣W@Nd*Ɔ?Giv yn<& ƅ6/C8h LS1ixoQ0L =.i*,w?ϫZW\?lSk\_ζ =X+HJN,ad /o> ygzL F X4{ h2#h1Il#/@Ado8= r|@ A?X,}Vʥ5ܑI6 _",05gp Ddv +ZW9%DU"TP8@!-O"ߥڠ`j7J6Ar=sfE$t34Ob\,W\ h˜eA?LB=L\{ RT^HEn)c &o^pHG$'75ܒRC_f'ĺ l$ސR8%_r:4?0ˏ_D8}U~H"G[I8yh*=KTFU4=Oڲ*ֆnT:sE$abxBʰ b18D""qEшlyᒙIY0=rN$ө6r͓+#bޕ M0xf.Ԗ֜p;lJ룛)c&{nv{|61=Ⱦ _S.Crƈ=u4:~a~ CG?ege`Y5iO endstream endobj 3388 0 obj <> endobj 3389 0 obj <> endobj 3390 0 obj <> endobj 3391 0 obj <> endobj 3392 0 obj <> endobj 3381 0 obj <>stream +HWn}W B +~ `hwd9Ou.4!@\rN: f , + $`q X.0„b)X +S$I!FDmWͱxʞ7̞'S8L5f8M &wp:|zx6}7/oX}7C$NFG +͑16\sӗvƄ!=mmO̊!T`Ǭc0"Z#(gTSWE* þn0r W)M*fs2* _JR8b׵G TQkWC^ޮf޴@[W% Ŀ>^b,]TeĔoXQŊ B`/J)GXNRnUoá=}^JͱF=(#DpW],UDI̳1 !bрr nCQ:3U Ы5RkO'sD(gGaJ6"+)CJhO "<+׊q)zn3-箔4F:}_7ۤ!Xa~xޕtcJ(;I\ (]qЬ Qu\ MLa!DA_GCE\I,g +B[3a 8/q%d:pW~%UD|9w?I+X'&GFx_01 3e6/\:pC"(kTH捯XI‹ghپm4S}8b lGqun$̅RۏdqЖI[Unýa& de?8A 6<%3}cFb +nkn͋WS3Z8XwfʘVXI,fطf28ZD )cd@x |{yH0yfS]guWU,Q2W]u>stream +0 M@&: M4= ^ET4@UHlemHHb?baE<ҦiG'd<iz`9dvyF%V1%Cs-|>YY&m `@f[ kxܱ+GEʉ^c#+m%'N}Zp .PYDzjUGNy=.Fy|mx Dyb#֧m#KŋnI} zE57 $HU dC9? j79%v$YdsO+I* Z ㈳8 +O P8"j +mJoiO(xdO-Z[ jNm x:kƳX8NEuQNK}sv?XrU4Sc$jvԆO[gꢌ z;%hIc贾N2m JܕE3gyb&qaNBǟfFPrl)>\tMal\dt`\ti[ (8 " ],n!"VѺ&;!AMI!BH&o9[Hl`)6@c;;Glퟮ 'VByQ A, !> ;VU&مNs`I hJΛۏZms_.;*CiH2+BmEu's,0S'`zDb~`/Rm/OyCB}*S2Upדw5^lA)!M iegS4NfO +oV5 +-)]+t3;R16:^"[c[+·*6.V<ڹxp D1)̓7fb^AȪ'ϊTT2I̞w﬉:u{_$TG4K]MZ>u4' vRR6 +PAU+"][w8+,4P\ʓ.Q驱ŶB ,Hr&XrfCMbٶ_杫*n,Z"Qws ֹiQ=FWϦSr>lAfH5rVlK@I:Y.;i>02 A^( ?Ż3媾|QL#_6A$:;#so %x9$ADpRVK):*HG56iDj&Α'[uP^p[bp%f՞}!hMd.>'}1pWMVb" GT2CƓ0CɌo*m$A=ZɫYR."INq`mII2hXSp+2,HnO]Hh.ĨE݌A6)s)CjCs7x{C,(үja4ꚈjKg2;1~AX-@.oc;B{t&1ā,( a t9r@[< Q70)T`EX,,o*Eny֒0cY^xMmMx{˚ўty 6zִqw yp~$;(7d[BDne5 9Jekz[VlLxJAi8m("lwu7SɱsL<_pC3LӇl_QԔ"bv ].K2ٴ+%M`ۨz)Ʈ¿^{>x#sTs(?Q|#mƓn'a0-ɅN#r3m_AIGXP)q>c {9ox^Z2Q]l +lh(gB1vE]JRwɕ0RL/SǍ!b2jڜMp߻5O{TYRI`L;⛗>%\!h'9 <5ko*h8['ƫ$pF`K#<|79ia-[|=e+. +4,P#=*2{B2X"[22Meau{oU1E1i3AgPAɩ;:0YK4O'; +ϟ#QFC8 +P;#(ls~ -1{!![0Ґ-Fgj|deNp"SH6%' -c ?9DI(@?ۿa|y!:wv'{y`rQra⻂%՛$8`m#ѴJ="z{%;WUALH>ڤ/ڇ=c#Ϛo >È{/"19Iipbq [y R۴u@#r+'QC~tztMl'6\&q=&+DZu\!һ& +U UL83_JWd#*x:)?3_l4\lPAzMq `nMU7<788MY~؏n~.V 8W}}\7>r iNmGNo +'Fޅ%U$캡Ӂ0psf>F|R& + /%b[P";P硰F&&ѫ\3bً8yd/gU6^>p#Fa.ӅoK:p,.wyf-Tɞ TS>dDC'6|xfL$ZnrL=t]A+,~´9 ?̜-Vokٶ1o}&'!~@A~b]rh +XvIuA\f%PrzRӃBP졪{?&Kũ j|N'}n+풺: PAǜ i 7GmcӞ4VcnzC2V꽀3H}vE.#!=|*gpMvwA%5Lt[E 'IFޟP`MxuY#Oy;G[rgĦi6P3*`o&_vd`;v9_lpSdyR%RK:eiV(2>tzǘ9VŮf7sZE")sКpr742W٩,7HLʺ^q޸al*ܷ躂ʃtQl_S}h@`{w +hxD3Ɠu:YVLt}P< +3A- :;]ewاAWppN[ښj +bMGYVъu9l _b,W+ga !9wc~ !3a4F6H+mա+qS ҂N4sK%OiA m&sYlq>) oqK XWܻZQ@^ڕg+%o@,djTW0h?X-h`XE\Ff&qT͡#kŎbZ~xrʺ?{W(,Cs`KI}neMJfz΂Lwq/LN"ùUssP@hGzi) ()-D5pO"x9R|E^|N l; ?Oc5=MSgg%D)"R~7zzgusk3崻SQat7>vީ4-]ϱ0}w M~F֢Rfҕt3|ߠy~ςF \؊ɲ7"Nv[ DI eῈGG=ǏTI NYâ{I73N|Et\O sEsytcZ$\Vy@W~cXUs:  +4"D+4!2K6Pf%lՌ{jbRk0HJGZXy[cX1k?}/F,U 7RitaKwQZ0Ԡ#!oL˹t:~eq6߮B)5t`-EA;OE1sS"e}lHWtlX,DИ[hpt9iyoDX%pJR0H3ph OG\=vsg}{grVM +;_j^h.,jP,^H}IM {Qm%&3Ŵi?l?g522_xu0\`(ӨD9l/ }SKh|"T'%VFɈ$Vsv {2(Zl|RBvYT--!A"Ho7OEF)fY-ӢҗP' ,v*6ܫq(q Z ZJ1 Hp 4.T5}E)iD Pw)}( +ϫƿOBM+[HL))x 됙v06C."#2:ۉ[Mv&S~[b0 2ٺgt(ݦ` xtP}(G](Vee mPVP9D5yF%SstO~aiG z7Y[g.nDğ9!SXua?#Jv:w5O?Vz!t@~$h 1dc|s+xhJkcSZUby ̛$FK b`ckŵ8ۂ)8UQ Gh!tkm$9Le#HVxt=3{bmS/*W{̜n3鋦\5~@rFZe%4ٶVT{LWcM\ȡO_2jB)NOcUi+F1o?s+3.Q}8n{ê}92(_Mi|m%sie6"]nTiK7ުs?kjDe.>zٮ܄ z*Ĺ8Feġ?ѬI[ + +Yb,aX&=wc|@Fا.4:;7O^'Ih"v*uy*zԌK.,` PtL$>zfL{(Ԗ ˶&{Tvļ7ǔfpϬp>O:aYc6k'9y5m<%#Sxsksd85\[ya3y9U)mU TwS b=67M0^7_N=2&k`BjZ8ϟT:I4G+ BVPT6@JFb~7(9;Xsz8G!X,lD~'-iH2g*1ٙ\c\|_T. .ennoh=G2&b|Aa1t.牸xOȵwqs] z>ƭi2t5o-s~.gttq".ie|[$,# |(k!^tڕ +C)2R~26;2B@뻱|}H H0 (}6k&B"'ip VYP5#C&v"WG*L{`^ڲ1)#k5 ԃT* +cbLFvVjgXUD6ֲ2v>ZD(Rߛv{OOEt"?ޗ'#,S1AV$2)׶@/ZKvw |!cItφJ{4 +/ ͂FP`ƽ_NG'%?j_9eŶ~Z 4HQAU + )=Z%-) R*e'uVc#!?rT`T7CkPQ;ͥ.66I/<Ƒ"[cb8ƅ )N@&n<^awguHuyP?~IGvoN_4#+qaM^=_s{POg /ڷ!epwQdQR\̭$7J{0|) +@!D/v#=q%-pz1/vU&-|j]M׷aͽNTTrKB2~?\b8VuLKjd@r+!";'o$Eu; .Q Pݝ^kv$JrEsẔiSZA?OD-/ J=IC<SyYTйUeAmE/;ڌpF>SQ#VNJn"@:Cئ" ö+k|BMi$ZD_\S;@qZ^Adm-DWӕVz b[}DD ,OvSFnTb8ZYfTZ5Bu =x6"ԣ<#(s>!d{S f(Ch%~k)Oתt!kiSZD;7o܈Il8L91(~E{A W7tdŔv۱ky[, :](;dS g*]ybTw7x!i_EW:D=|`gve| zQ:rR _,+FǹJMZI +Qy>^K}a+T}?EW_|H*Wyj&bX+7ԝp f )W΄ռ=~v{/u| j1vBy(1,ҝ vl Α4MŸru yk{uқ 07V[:8utx{SffI[xd~Qfd>-'ҹoͧ~IResK`̎a >ʐ]rITK>#?t¿r^g`GhnqGxһ{| Văꉼ@gNoq[X(O sMl)$O6g /"<ȷm#T޸ب'2h_(ҳ ^OUW6[Q$PXosWc{:6PҮY Nǁ+(@ FD'AѭR +2+{\g|oA:t,VB&u0IMb3Tvp/mAI4R#:Nd2c567OxEF'`g6p$9:c{[DX0^V4˟6N%`(gLb$[ggsB,VV̐ @\B +((RyJ+ރq^0mZܢFPS,¸O`Nyqs0Z8CF'>`3eCҪ2 *t錎Rm$0gxǮ@L4) 14Oi&(U2y6t&Q-+<0;vf+gV:]?G:N.ڝ~wᒂC]o $;Ǟ{6c +R~Y] ^XcC|~8!ʭHAD ÕFep>8X"Y)5.O6(ugPZe\cx,3{:Etd:jmf~ֽhZ6 Z]m& e_=yX72h!MBPhI*=N M06{jV:(ϱ +O 'JH@p-_vl% kK88eM{pX!nJ {BEh7| &4Nar687fĕYk3a捩=m  M9m$@\tXi;֗,pu146pad¢ޣpReq4A_{lH*o)Jjd:HBØZ eoDPgt;|E1Tw/  kŗy6t@=P`y /6>B_T_IQ9r ԔpVtȵc;NI4J7*k#KŶr""IIB¬#2HMB5E V#De.Q\e>~ޜ/jFQ"&VT/a::H%Ou3 Wā&b@?/A kJnOu`VNf+RXuǥl)5:w"-n'-*kk|j824V_"W:4 +l0ޙ q +%[%֯Xl9زd @p +aSlynW2d1T =WKL@UgW C)}8?H[aH{hV%!OͷLǶ׹L{ JT +_* @U nݟ#d8q޷: eps9P:-yVڿ2<〒N; DG'߭+ίumd#¦mI/4DsxZ~(Q \x{C9,6Io<322-|-Qum,GA1je!ɢCڲ$ Ba/ =r\:c?RzGEs2 +k;?+ffѫfB*n2R3`@ۋV+sH v뾳ág\Hu+I [8F:$)$T *ql\if^8saQ'2ݸ5RlsWa/t},BCGN"p]" .,oT0-\_Bf +> L˴|\P{QITMSHo*[]X y9,Ԩжc", +u WA=5q,$SR @ ^ LP?ʆvހQkrF&2!tR>R|"l G@j]Jp84QQPE,S3tzx-6H7rJ4*g +E _m]|wbʔ#ʿXBtci~py3NjF +#~a;6\V{VEbJk|16ù{3 endstream endobj 3382 0 obj <> endobj 3383 0 obj <> endobj 3384 0 obj <> endobj 3385 0 obj <> endobj 3374 0 obj <>stream +HWYo~ׯ XM(3D"'o5.)ͱ YtW}sDrʨ*(ӌGWj׏Wo>s{+/Zbu{E sj]b΍#Jիա?Tw]׻߽)L)M1Fdosb ̧쾯jz_VSm߿6pÇ?xM4,h6 N*esYy&kGD߃,%2;[@z짶{Ϡ!48ި4@⠬pה|ϒRn]#__(ó-s.xf<$}8_-i-O;h3~5,p .M$Y}+25 7n_6t L0n3w!k1Q;)ޏ3V ;tD:|۶vmơ?֧) 0!M!*F&[ZJwo97.\t_j 3@]S2Nh  C +:58 u3/1 # +]Ģa]A^ksssfB\95́KC)$ ؋ 89-us:c8ZxLYlʦ+aޅӎ ^^,˩yRC>ͩU[:һCcՎ/ /!'r 3)D` z2Bۇ;nA#(lU}ĥι ˤ#S!zĥ@Jգb* FrP134 j58QH_} Ì@/,؞ hd6Yzɧ%pq05 Lkd|lS- pj > +/s}E߿=4Øt:ʓiR#+ dDF\POυR|9- [/q><d!Y*bMȴEE|P>$:±"!kz%-Z lA+#ac#ő)-C +0à7# +Obr b+#X3 | YQs.*YX,1갚pbG|2&OPſ9./]6I2:_YIKU't .͈jX*tcsol#g :\;๪It_ЗJV̇OG·5PQ. bn}]>/15omh/n{b_G5lm*5F{R \ȗFP^NL mp:2B?ͦ}y/r&:]ğ&Ita~3”*rY;Z}L (0vLwݑ 0܍Oܼ5&xpƤ:H ]kVvӊl*HQb8~6.AHtr~(b7UO?})QAgt .L endstream endobj 3380 0 obj <>stream +0 M@&= M^楩n w/27MZy>\&suO]ڼf<X)Ü%q1C8s5p3bҜ>)P7@7(7?Ƨ"Zg&[J@ F$eqe0D .|jp4Ґ ]pp(IݮW'qݰ=ݯ$vՆv*J($6q[x5cVޥP1kة]cZuנ3h7*_>)nϖV{NCS"HM+Q59+ e}IXdQcǡ:R1H&a7OZYR޸S)32ÿ+\ټ3MP)Ph ˆ%,of/a*H4 ϰ7O5m?A-j`& =Xv< +p %?}-;TTcKNKߙħc(77Ez־m vFҭ.3JKj颰y[ӼA)pG3fߜR"pdXiA?ܞńAm2zngq+>0m`b T7ƆLĩOD:!+Ee.Nٰ1% N%" +=NbNR 48V?eғHjsx@9e& +xvqPōݞN []0@&0RN۸8*sl:G7ؗk`O3N[Պ*yv^y"9-P+Zl|Gt = Gp&7NQ%S.aoER/Hly'!z=P@m=%2bwEsgRR&jɰ6]a.}KwdklCs`oщ 94բ +$2 +Fm×PD +9|.۴Y!X/^z ffl((4`t%@qָe(Ѥ2ė 0I3oPs10Q (zx{k§E%p92l*fW.;%=قNBQ_sadCSU{{uc5~-7ڠ?P +LIOQdq?ݓϔ(9i1t/(%{VK=^#$x5x{,#D۔Tģ uDWtD.L{P~ۉAgN;qi.GqFāe z%&-({nn&d^8wj*obwXbCL6agd!GΦT +6X(/N܆6%0;YGuerު7EZ1a5n, +S–XFdG/TOӖۃA*;v5׾6-O Uj;lUZG!8!!%PY9<! w~|'v(zaR\a {C,x/#-Hrk7@R^CybQ{[alž}xi9EB4l qƊN޼!Ժ~MՎd1_tȌR^:!` `5wI +\*AqXq`c/U5z;f€rFB¨+|H`]#%ɟ\sXC$˧>vO3\Mu[ +fJWjϩh[We9j-r'\:2/l4C(G9ط0NZ * 1bM7:3fn1َ_>WK^:^N\CyVPk`rgw`':6:pSWbioXgbfP=d)M\Q]&\yZ|bɱE gB))MHQ7G5y`|:l3qqM*Q2PH F};)kҨ"Ch 15@W$q Z=_ߩaLQkTv^?)Hn._R:B里cY_$!'oq9YS%헂.0. + A7RP'?1[ CW gGNצџVmtD~ 36۩2hDR&},Ync"-4[҂7$*׽ۖg0ilKFlc8yA+ 2Üuj{J)RS3rP +E _(ɨvboRn/$F"5M߀xȻdlijZ}N)~{^ ?cL nSf;n 8T%.SF䘽4.Uqz"Nܾ?OTH$#M͹:䊜;Ag(| ' +fzEp:o}v0CNx3mb) |(YیO{GմNL;gԅ1rzj%&F8w/zi MTb: nYD/;0K cr(|g(T'dWS &쌲i*Mdkhu GVS/i\W qN,s>Ǧy= +]#7-R3ளn8,N:d`rAsb23e$KC׸)rem{8NݾK]x~5DzMyz%|zv\c=*qd~xib Оps~4RK6E0z2jF̆OLW<`hifGP5QQW!=SC!TK"E趐fdtN4w[V꣍eimTD ,P8O|jbs Q:WqaԌgDCf@b|;Aג&3vf +o)0 ö88Hi HiWV^WvV'LEʼn~m57XLw(D3ݎ26lÞ?{/*c '&80+͙VޙX*rfs&᳛(g<a>"?Pz dRĠnk z6x1Ҫhwȁ1} QDV &M/kLi8@)M^ҧNڢ̱vGNliا`-xNJo-Hpg}# G B(kCV2y3 ayiYՄ\˖6 rG]pYIa.pľ~jKO;*|&J&#ȡ5_` K"=ibw٘GWc`bt41Hl:$$ɖvT +ҰÞ,~IZZ Y0SwA3Hh56FoO]FOA?EtA0n@W~]zD?hFYTcbB'"f"j:F;jh4}jq6o5S_I]Fzg uL/7&wz8GHb0 ]A}_^2YJ֛Ü127[Wݰf"] ]~цb{LM0\ne`pzrcC +*¾b~;߈"TH8߲؆2iy(y'`~]0!6)@>)M[́bT,R#C% h!/;:#pI[|*"jF Kn.Ҝ>* +=k"O`V]S#VW!LHCFjB]o }R4ń Qf TqDكQâou¾xX%;rC߻ A +&fu8z% "!Fđԅ35/Mg{!iG\eOo,9Wbz@rXa_l#f~RSΚS !^g{棁܋ӲEdK1lt@UX1LEH +&_,ָI7&@pf/0gnJc`J&Rmi oS"`/Ea 0>e)/Wʦ:6Us\,Ü|kOl//J ii!u_L$H$_3)A@>'+l=p%4{g-`iTXDyw:?J wVl[FI5o0vb@́ڝvnpa4ESŦMyS:7pYkœDBlEUͯ 2b +OB2=8l䬀D$ >q柤'YV9Yu#уQc@}!XdXa ״[ƛbJl F84Ďrڗ|Î_v)VW)zfvߟ3&>L,Vj5ҕņuk7 +S+%y#sƒ)o&y]1[ҕKń۾B'B9&>wВkyGSpIwQRv ?BڌD43Eʗ]ZQѯiS j']A"IhC?|$NG+- CQx9{>&%(s +IS$,1E"G f< ^/1Ơ.4NzO7jIyac@)2dyVq]&^ NmX@=bUKbV@vO *gEiZ5DL:uJ$.iG9R{tU<+ͭTg't|yzṅNV[HdOF砚I{> iӉ|뮸C~KP⷏_\C>|P`}QX/nэ*߮;!ƗqϭJA9IcJCk<q!]qF@s:7]TW.$ªdGQtf3ߠ-oj +GTQąQIWIK%tߗNRNtn6bW|ty;,jV>ŏuJ`y~,B-B{nAH)RY<k/ 캫H`"Cwԏ +]Y#֭)Eд7k>IkrR 8V^!w7sqgt[* (iò;-[[m\K| ,kB^H? rxǵ~ j&ޭ1OS61]Bf +:G͛ihb,YfWM.6ѻKNcoyiN۹l NJ%PFrcMz׋!?&^ngML풢YadN᭟Nʋ[-i$nHP8v;@4n1v"QS :ScƌEBf*m;" [2, =(H)L0t揸N/U7Paxri>'ŘRTSY~o%fZD] \oUԍڡBc8(ޞ8hd|MTv@*[(vϛ1~u\{H1VYolqkz eX2mET Ԇp4xgуL]1;E<:>s='OU/-,sz [ߨd;:6 Ws*l8Q3=E]D2vk(z2Tuc~:; HX])}͋]Pf'=J>8Sͯa<%:j|M~>51 +[F8s0KBG =HM]DS= f喝s77EBO.-j׮<<u|A ֻ'g'.U7W~<8!]2$9XZ%;S|$|V|AD'Zx0dnj4IM uFėfA(-Ls}Vb E`ſ@_RCƞf+?h*|-xRC+')|!6N*'jk튉%#xc%ϲ|3ӵږ8$Pеv}0J/*TjxE֔p[-ѽP*H@ŀ[!!vwiE30Mc +?T}$Wb$D5޽Jw7ꫥSCN$e3-wkcьM\ QHPfY*}U883#r@$9'4c63> @w5jjo̠FE$uz!\ҧ:{'F^ldQ,zNsְ1wX*6"#pDO/i0fPL C"s"9F|@%*W!bW- NYώ[< Z}o'߅⯗= VY8NP۴W0cLG* dzI]]Hi2Ήq^, +\9A*hje1olݜ'q'WP[O7΄2E  /Ԯyl/̳P%+]"FBtI{T0z,o 躓~QH'~!we6gldu~;oc{I<|-+`LQu_U.~]/"\X؁z@Pbd_; 0$m[꼉'1ASocҢeSHG6N ĿO:%0\"1I'Q.=MlqslED+p3d;fK⎨YMf0q +ڀB6;$R?^F.ʯ˜l +*c.&<9(ًc-1JmCLH%9Ζ rXҵy>1Nk.p(k]p|nx0Zqͅqu?Pj*j?Y[Tgwxf-@[UjG]Ro@S[SbVkX{RV.-ğHK 18 Xd%?+ΗxJ .y]&ɫLG +qQ3N7T *MqvӕIjySG>֘pËDh p n!+Zk72n T6 $+ ǛdKX!ZwΞ9Ϊwns";v(-G&oDu3~P1du67P&N^{̝: +rZZ=oZI,,&ωn]lǴJOBMjO3._e-_^nZtUΣb] # 2)v/D(iB{RV_שG"^01A^B%leRh"]9IGȤǰ3-̾M' VҠd=+V|%!QSТmjm#_wQ* +Zͤ~v0ݷl/}@šuT6{Ӫ.JG~$5ocW݂jȉbMmV WP :* /v}I[Ћy&Q9FRD{Fu4qSb[F ޿ݵX1A_T+DYkDJS4NԫG.^EHTmveaϰm.=NDϡ=bD뢆'\9Tbhֆ\zl\H1aEW/wZGhۡȀev/uSkϻiɴ0ST\Fk $9m/v-% P$.a_`P07A +31F׋/мPGN~[GH7T2ACg$!FN]7%x֍BAFf֕` F]VKnAy5YC`ôX 5MAFÕ7g!`vlSULtVfU*a}J;G r|*މjPxzb+~םfd-~ +W7~VtG|G[2f|mV4kJ Ccpsl CBjN)g,7Ia;RL5\[Ϝ:3(؟ZU԰1M^$. $1C WWcՁKdϐq<̬]|ME{B-ʤ8G O +Ef0wL |$Mwz;$C$>"&Ym?x*TNu3TL +$&?zI#='F=X]&mMYPA-vJKRҗl^hCs~ZFQ~1աA."`C$ [t0Z)c6Dy(7,9mb\Fesɓ KbwI]B7R@ <#Js5Jh" %[ 2fY:ǬZ.S@~r 1)x +8\ghhKYߜAumCc7yrHhaHS(>}NᛈQv8|G+<퇅ɘ߃c w`Ԟ»QUv9=E{F|X95>Є걵 ruR-T3C0֏`(NHwb9gac6ry:/spI- ӵ +rbܠT@.Բ^.+5{Ex}TScԉWgJ^KϚ$X +c7v̫0+(ڦdU+|tAڌ"dBʆ̫!aNj`aZ 5ً7{nA0V,l@B5+* %9Z`/ҔzkвP`Po[$T +};Qжy?F { BH*½^w755D# iݻpTdLFL_'dO+ZtٽU_xFY Ξ 24  Qh;,x&w&^\HޢB_b%4"75ȿ,6+ߎأq~ǽE?z6h<$BU7:ҕO^[4k09cyn>Qzvarԩj4l[OGL=XU+4<4b̳8RZm'fmyy* +=NE2:[ب }eGDe@ 8`CÌbXB{ z\+?q $Y|1r2u$at?uE+Ћ}Xdm@[ȟb]H^@w' axpgYLPb&\##?\m ,<%lj_XIv \< _塐`+)GɜhQi)Dt"zWe+?V]rf\FؓTYglBq-n_\4'{1b/%jX4w} ݀GA͞I cϊE ,U!eRW 85ο_+؈ΜPvpe } cE,z^_;<"b6OT4Z|!- EK CCl)V3ROGvj! U3?MI˱ӴZF*?wī +tHB?\Hruٱ:p*!mU{S$˩^̲)HP8@. ԊC~.XmF{qZH`Ŭk{- +붆 (H.Oo3c[%^mT϶w @18N<ڣ) 3fF6sΤ8ƭwWuNE73ͿlmT:ge7_sCGz@N +.'w 84)M,EӚs">]}hQzD]%3fx +ɞWȇ endstream endobj 3375 0 obj <> endobj 3376 0 obj <> endobj 3377 0 obj <> endobj 3378 0 obj <> endobj 3379 0 obj <> endobj 4885 0 obj <>stream +Hd͊zy8 +>sRhF^#y QG#Oç==o/ϧ;c_mӷKv|~_oo~y>}~W=|z>{O݇q~?>Ï?o+~ߒ~;%zΏx߽w;>lp?(O?{wٸ^ PZUuTGu^5P5FjFDMԤU PjVjUmFmک]uPuNNE]E5|| _#_k55|| _#_k55|| _#_k55|| _#_k5Z||-_+_kZ||-_+_kZ||-_+_kZ||-_+_ku:||_'_uu:||_'_uu:||_'_uu:||_'_uz||=_/_z||=_/_z||=_/_z||=_/_ || ߀o77 || ߀o77 || ߀o77 || ߀o77 KG#(~? +?G#(~? +?G#(~? +?G#(~? +?z $߄o77MM&|| $߄o77MM&|| $߄o77MM&|| $߄o77MM&||3,ߌo77f||3,ߌo77f||3,ߌo77f||3,ߌo77f|| "߂oȷ[--|| "߂oȷ[--|| "߂oȷ[--|| "߂oȷ[--||+*ߊoŷʷ[V||+*ߊoŷʷ[V||+*ߊoŷʷ[V||+*ߊoŷʷ[V|| &߆o÷ɷmm6|| &߆o÷ɷmm6|| &߆o÷ɷmm6|| &߆o÷ɷmm6|ۯ\t;]~~߅ww;]~~߅ww;]~~߅ww;]~~߅w߁w;;|C߁w;;|C߁w;;|C߁w;;|C߉w;;NN|'S߉w;;NN|'S߉w;;NN|'S߉w;;NN|'S ߅w]..|K ߅w]..|K ߅w]..|K ߅w]..|?|x>stream +HWYo~ׯejw݆d6,9&8ʐ\yS=3]3M:h㫯s808j$~%n^/>g={<{_3PK.-3Q#4I29;_f[\+ ݅H],gl]GH/PlPLGg'xPM7x!ߌ<+s6 UgP#@T }hnl}}C }b t<>9N (\1!`Wm`Dw5T1Y.%%dj}`Tӓm +c0ʖy 3f3sZg{B0;[uu;f&|7 !BbDgQ}_ן:n~E޽{b^c`ZP'>7zH;4 1tӮEUr4O{b9>V\8UV\1 b/ ØMc[6OC t$ DUYWLrcQ5~AuT^uF{q]YC}L-߹X>Y @`hy}eXRfRS,<Dw5EaO]>}TNmn>'' <_L >( N$'> f1 wl9TdWBJf'׾(eҤLQS@)ЃҼw)Tzf)*vӠQ%!3z؏&IiSG/ c xq]j`|9+7sr_lrdL!*wMANpjMx:֓!/,rSbz4z}EbԁS$^ˬD|ô1t1m'$7sФp&{tߡMEmk5ͫ D!6MͰnvxp6=>HjxH\u&fQpp +[᪌kC"֖}B'D"@}BlXmz➦t A33})2HU {Z[=ێкUpc&PGT<ذOWvR t e*=x,@ CjQY2}b{'nBI8\ ZAE75~}yXF?_8~ +I1)\dfsޱ2v__鹊ytwÀNdҮ@ʞsq8O4O' ~48%9v]{^FҀ/|ʈ]Woe{&n]^7N`<J<>stream +0 U@&~ UPO;! BFQI1GUl͇uIΖ'$ ޗ#eЭ̞Gib j V#j?g[59LsÍߪ|%$Aa(ߴpDXF=z88)i/(M,gיw8׃X;m4m#4K=*hjcklTy|-lI6Dl>O T`] pj<ӣӪvDM +W {Gieh;u|HM@dCD%e k'qjouk +b'pBugN7{T_}9=3,̂w$ y-_%ZAHO$lU5ŽpTڱIiq] qG˻.G޿\hE7qmjpoʞHDsg1Y>U'ZZ*Px{lƧ^iG 3:h+Zr\fcRWe,IFFwìrĢ[o0-} +3z=B BF+&*x)qwBB#/$5ꌎ˘{ǮW0b:=bM)E㖄 s,(5I.˨~&yze[yUdC{ %KWŘ(bLjȠ8ևh&m|YOo'S6g$l <;獖 gaGn4utj쯚fnW%n3FxO'Ľ-Bc˗"LdEl`ݳ+ԟ<<{;99ninBf4lc" hK7Jq@&&/ϊgF*}lHn1y 1ZX|ˮ4~z/HKlWЬn(&]9?tMeA]v'(Bպe~BtwH;V62O!cw%RAt5{%`zYIw JaU`}PCS͘M5ӕ!mf&?p'EJ7$S4YZ)oUAp}իƓo|[|79ӾXgS3~ c_m>!4G[60~'B3eBߍYUvҰzVsiE֜Vo6za Xbհ55":]6'V=$޼侄{Q@Vfc> h1۔0P0veFD﹊6m8iGd g gyQ/V,)D5qWǦE) ~3=lG5چI+B`LEKrsXQrly툐Xsw2eN!Ds%|^š_\*KM0ˣhsKiy +01:egϠ/ѥ_?$Vtnѝ*h҄h*u|..Ve2 ȣiG5aRP}+.r)%wׯZsRAI\{1CgJKDH%5m⌦y'5ρPV4 Y+ +`㵄#X[FxusU>S*W1ņ-eJ +yy 8y +{"_4 K2H;IV#OC/+iK$2#mfc,fG1 , ]eB…nLVĄ)iG "/?"4,q;qkiғP6J=L|k`Upw}& 4Vdd_`+i@{]o4:{~YݠR̀_$y0MArW~ 04?^yxb}'lC$#g_Scg"] 5^9 !)q ^t0`iL^?KY,=ۮ[ߺU\]*/ʻn {SُyUXzw =^ \ nFpGVHryL *9[I€vbD!ȗ4D xo_*gkPQU])xer6<,2*FKՅ(Z5Nsem\[0:ޝh&Ċ0j~kF?!j;ﱃh蹄2sabb?| u|#^Y^慖gLmP{4 n2WrIvt4ݱ7 +"jY 8Q 3҇U{qpϱ+llh4qwXDCLZ\pmfsU-Olm5'&\Z['JWRMM"/,ASo gΜaǡy௮u*r7یq@8Vw&2S_p8$(],DTaag)|@ga ~gvM[ +Y}Q/9Eif +0umK!ПMH,|~pJ#5W»|je6hnaJk}1wyp, ^~C|).f{'L7#BxZVҝmCF PGϴOPBH澐;/`fߔ _&ِg|@ ][Lf=<鱗඘ g:cC\ ViFz+ R9&o R]0t9XA]gqxkf@D=VR-&wѸ5gS^&W#͘%ц_Ć +!;`;!k+.]Wך'`a7/Vj>,juP+H"? &Bԗq}.'ˑc@T%TE։u!1>vג9 ZfkzmyÑ#[@i#7?~`ç,#,@Ђ#W߹x =9;tgF*L5TWvm۝z'[{3(#UͫPXd +kV ҄PQ-fSmHpzd+Ƞy,#1ǧu_ #V L&mxi$ȁHԺ +> +ΥT}8uI36 6TcWa=`#adhovGyt\2&Y?6m`lhtN\uJVânLy ebc ߨ@ dhflQ)R [=26GvWd/{UU e +Gl7q]تl[ݡg)ӠpBe<>>_%hۀTA8.mkq!c'Yl?}~oaaٙVUvCPhKɏkf#/P⺟az?|{Zץn\1=3iJ +U\7,iqk4)yAt}k?&@!h Sl)J7H<#Z`dM%K~ẒM5/ + Y* ~@E,6C(ΒIaki;M3 ~^S2u*ݼG oLsAJruY؄l';ª@3aZhmb7ͺ + + +a5䦴]4 tXBޒ;~xT.;FO7GpbogXӞLb?.5*1δG5K2w6hű逌BՖ0h'{{ͳKΛ W|ɾ =dk^@<*x}4ԉI33W Ek%) >7V[?N,X9+prsmt~JɱDY(M&pU˲®yزAE  +߹4@}!:xu1W#F5YzcH4}6w^۟wA%_?apo8liB+uW7LeKf*9KǮ^S)敎 V|fIXQ#`h¢#iOXe`:9g Ӟ@ܣUƓ쵻pp0҄r c+ZfM8k[@8*H'tʦO(݄hji$,2GKIHi>߾n.JY/Br=!  oνg 4*,1N&/E":yfnpA"Uq ]b0&%\?Vyw BaH4|aБ E>eR޹p,q AdТ,$ Ê=ҭ6cSܰbDNqOXjBd%\}]Pwl =0]q {lޛEiLc}.XCFNgd%A)02NkL5Ŋ{iL"*;!e;~|s )؝ +xVj3s?-NXt"`qaEqn1"'5Gdg[& O~lҿ:B4T>!&[?d3g@ a,d'du.fL|cr&@bhdieqJ^i"tIMЙs +P%stFm}^8Pvy)YQg ;ԁ;,fje 0 a#U./; JnZuC*Bot`F'%#V%4X'n!r<4>vR`ʡsSɦLw_7rAћV5in: OL u<_ ӈ665\`o"%WM"لK-ϭiŶӤ +zfI_d{hK hAxtbME0;fT^&_\y>^jHڒ2bZ™en`㜲n +6͡#021K,f7mEpVf;٪B߫VV}*RkxX)Z'=Eҥ6Jsl[3%k*?Jl&E'tRrGB!r3>#W2 (r74:XpJȫ:3414X:;KL~4az]ªrKR jDʄ|~l!E!4ֻe"PM^s_ ˄@dU I.ՓnYܻ =*ɝXT: J+hǒFx 3 g-gwBLK3nu'AϾ?j /_y VGM6$$zts<QKà=KrnV_Z0;+ajM/K jE2C҅P9-<@tMXp`*Nv>Ntq2SM8RQ[VC,W|HLQjpo~.ۨXv ߨqƩLN[n8!:3q<c&gW+ g[I ܄5:J<1$(f yR.$4"\$j}pc1b|XX$~F݄_iɇc)ʷ vԵhtN<$c{H(3[,i'*x=2B~-Jw5׏pӠR M%]"ly + Ӷ':>B*脵}r_DnYeϕgSgm * rWMDm/Ob¤, +dm} +|x_Zw*F,Xߠ. 2]\OZŗSNϪ5KW42 f0e@,(ȷ\ #Y3j +\ EBgИ8UػhYfMڇV=q`_,/}n8NJx* l r;`>,PfPGݽ=j +\;5:v|6HX:/ru/}|q_:1f +lZQƞ2gj>zdnOq SZ7w˙w <ɓ5TK'm nEgbq-ǵ!1^ ]{!<"bUNHh")%;Q٪ԵZDd4^o p,X0 ޼>&\ ȫ,`p# ,ej%l/\ULpaφ,yA-~-\d_;ĕ#?{!zY,# +|;w[G/;+%XͿL 1SBOgK;875iAn!ԅc&A +t ^3kn+/* +_+:ebdhTɌCUz^KssJwGՈ8WB[r9U/ߔmoi) J d7>NMuf|b[a%]npdߐp|AyBrr6bѻ +{Cej2M޼Es|>T%Ś<tA#vSh.-tNJhe#YǼl_=HR' +Y,jMkFeMgһ.36c'rg,Ե>|DH?`":\PHQOg1Ʀx<)7*:Fŗ7aY|o/w7/|IQ0eӓo"O8vAXk㘢^M3 +Flr;ڊV`Y+B{8$j]u8(Mx1L `WR|vjE JՂeȴ$=M`:.~Ƈ_rrAHceW Oi( 2^n{}mZ$5ơYcaD73Ah6i/l? M(njI +lG/5DrL=D2.,mֹ=Feor.Q(-/V20NnNK7 +J,87 UaQam"9X^z. aUҬ;3T},|*atkG|YIz{͋ߓX8G䨤ۖW)ŐATaww22"~ea~Ha`_'a[du d;[D)lr(et.*n'ɸ2Bϑ;&J'shKC9b3J\HtE\]+t +>-c2gyX.B}_S4T5P&}bĹI o7HM'wѧO9m;gHYdr%.d{Nx95VK=@3Xn,JIior^Ōkw24!g*黛$7y>5~/ ??)Ց5.3/Ib*/rl#6U%uh:@Ai647Hc}Rka5H.j)]:=í!׹N8+F*( Ɓ^2;.IH](US1f#$b,)W\ ;SHk3 +@'&0#\c4rVmqL (HW C +O<2Jb?{d-r=,~;eZf*C(u=h3wp-4:.j&lETЕw 3#hfOR 0;Pty#*2 ^͟u +Ze?= +y?rM6Fń!'*v+LHV.]~Bg'!}258=RG|jXsgL(<(M/J±? B> ga^HVԵs>A? t[8 6=dv3}OjEz(޳aZ*)˫}PGb_j niϗlQNJph~P느CAyIuPmǩ}Dp!$4rȞ+ůC>#-+7eR̹pZ#l\8/nAk֦S_!ڎ/@g)IyG6w,Zطmcy8,0j\R/qqL)dqh9!hy<0.. o- c'"Q4Vg`woYFq5շCE 8[0E/,sSe.-c@GCY˔p},[(m`t/lJݰ["4<0&վ?2o1~J-رAg}DB\z>*~׿K(;cNo3D$^ Dh/OƢHt[鮮ݟ +="c!k7}]gX~g@Ԇa)A96}C/=f#$y%h(J4rQMs GAC}OfFnWTO +Og05a] tDO,UtІ!LZm#\~@@&UOJ{7'T+t[֛ +^u +)k*=oh5J_ܻD H0ܱoUz&ݶ{kݵH|*i?/ ׆A UߓO51vFF9SW$sӪ|zXajLGH)*Y9r2WAUʐ|Gg=4_,Qݫ9Ue$RTW[G{2nՔOSQR %5\l_gL}ƴMk Kq+01O~,ɻFdyPꋃܧ]?O"Y8>-1?6-y#؄(hs,t8-q= V1|pMa,flIh%~Bopa^0ʡǁS9=Zw -ZUl=K,A$tlmQʼ@fs ^|2S |2+;gJCC|f{3-a yD{ѰsoR_#8v ûșWh; 4E&mGW `?mt⇤M)oZ JИ//NrHCYЬs $QmCp 2U ڭbH>^Inn+GB + gP2_$؝*IJ+DU?Hn +aw?fLEWs ֨:j7cljviL}R$9PARIoTݗtlzVt}t v9@HjF4+ީ>ˆI0fm!)*aOr);j,^s#_z{p +)另[1r] d Kdba:g2#.#糧]#1!<^eclJ(W+5F, s#ed2nj<_ݜFdo"I/|'$5$uݞYI~Sfoy45~IƸ>/`tAPL1ޤf{mqz:-s݀ Ncɐ![8cA79j4&YϚTc^V5?k(qⷐoNyӋTD?9eI;[%icsH+L3ۀܴ^)IasPmȜ1u0rU=S#ɐڢ#٢=A W$CļLקq.mVrᾺ[K1r!J +43ys`u[;07 mUnbܥ8'[$DGIy.*=ϳB] A燗M #jJ + $I!O֐_e>Jz|jX =X8ޚD ǴcLfdW[hWGJ%k X+2USW1 ҇".wDX{+'4KBʀRN#9C{kǫc'ifAOlƗժק'wn,DnO}P'\*_W@Vv{.Kͼ]@S B$˒~YW +`؁4FF dZq,'+k+2ͼ<~#i>ݿKnHWF9COJWrt ""YF|i:}|<ɖ>[=s a̷ʸkF|^A++:BۼIU}뷹:%mQ:Nq<ı I<7}M9;l(`}L=gI tzs&} FP0v~ Aq>!1{׫e‚jq8eHm'K-f;fn7>qh9W)lLm:nNYV;m&DBO]yCb=H/"Nf;AVtGbI<u;@[]vlgm I;^d-_A[~C 1A2]$ ]ws<'8U1%,ygRj/[s }m'it7~Sa\_V*I,e0$U^Hd7%SccSkdfI}ߠ10a7{T_x/r4;SQ4p:k#R4ZP7P뤭'[#{&؝!x-$1Ef@3p\Zvf?( +2o^nt%v?<!shőخꇫoU4٥6M{C7̕a HyWf܂rȣp?X"҉4~{~O$>>f8yDc[Cyh% l~Z.K8\zME.~'nl%ϨQ.<; 0?Yse6)'qRVdl\p.Yo2=ာ ;{yse&#yǺ^Zv19A G,%^dtQ51(E.fd=ߞ6fmub9g`!zP,_.B#@ȷ)$fM8s,eeњ3mCاp5:1< ,58SނOWig2HvDբ)t-ͨ ȶ)yEe!\aLCkҵ,L#摟!kG"Q\bhDk6dl-n?stOMzs F4,-٘\_8wBf7:~ʔhD}gb|, e1\Ú.?ךҢ^~y Şw9x/˚FOipG?XWqy]O}0JWԎO OC*x^ X +‡(4AB>U6| cHۉ(9Xݷ$_9}oa0ktMTT\JlϚ_G^OJE;aӫiO$ כagMQ5YB<Ʃ:hQ3 ^*ξ#*=ޮ"D_ze^\ѐp-/mrGY椺<m9ɋ EP*F9^qlgX:OaAf$?~|m=(+%Ch1R k^Y==`7on^Zr éHY]nm:µ[rz;T%ix<@B:Ǣv;`]z4 Vp#gfM;]yQFʙ--G?i˻9'7e {pP9/ $&iE~hT~Kah8:OjMZ#"xY=L VIA +l:jI; ݓ||\U^NTK"UFu_;D$A6@0[~?7CƉ;Jy!H %<_豜i9krKK,âiE)c9DSW0 ru*+EapۡZИ57&4[h%tuf_-ʢD*RC+RR)ȉl`;b/Sbx\[ ìX4 FTsWb)햝_M woJ .bǽ.P %κ߂2bzY2v( +(?/6$VxW1yi,g‡5+HK|'p^[ +2>F*Qne\t$5LS[{YS  2KThKTʢ󃔲X6tW8e^h${0B g#\A!b%LyaHDZ5.3cu -pmȽ>Jޘpٓj"'La~ &ؼa_0uwn@>4J?D}a)70"~u) Լ +ֲw`%St4૰rDCpώDX9[KWPҖUdj١e!D{.|outDE>|gN2rzS xZÅU^JtZX,hMA.2()U楏sT8<~GeXsCC 蔁{*G硥6,MK3|dB5^$>PubOB '>{vh]ᩓ{xUq͵5N{yyz C`mQ"ƃ֠9an9׏7 sZJ,s~KТ.$|~HFVļ<|5י #P)v3+ŷw~$GKԄ *i6aq[0 M#~؂e4&2ژWޔ ڼ^5qrtC$@`K)kRg>+)/8p^B =aSG:3k+ 5I7`fJH_=ˎ@0ZnQz Sc2~ōo0|F.o0AU8LA4QNbo?DpرҲL5v>{gdkbu8F65i?bT" Fl|af6N !o??AV %lv/*hhL|ECj ϗad5G8l?W*o]1,?f1"'Y³"s?lG("]?hL"yBQDhN[iYi갼"j _0u0lݣ[Y~2fbk (lfTH͔}5>׳؉ZiLU5ÞUΙ՗q/D/:\8NZďhPuC s%a~@M6I_&Кmz7&N@ET@~X!?zޝ4npR{k~sDw?õ71EI?!>Ju`DbО,Y>}Ǹ;H]@ɥ#mB!t& ǖjA%GY!hOx؎#3ۖB56 ʼkunE'7Uϟa Wv_U+=|(E>%/+uFQJtJi6rH(0Hͺҟ} ^XqȬ>i;2mqhf.xhkC$U$soLM$NYc|:j+BT?j|486o>͞1[Y}TJEY9̌n)rsqƯJt7E{Ɩ6Qm&c $`dxZgR;GA %" 輮fxJӚ\phUJ!;k?QCY\g9bgM L:+rg@~ F㞌 Әih_R@;OtX ]{/N0 *B}Zr ip +ӫ9c(C-[TKȍAYkiX]QVky, -mvӂ?~Ar0`KMjhJYIs`﻽;hKkC9&4bl,@]x[H0ؒ%B{.DsF-[9Vpko"B-?&$<56Ar~|nJ0/{r!$VuڽUͰ𧟺dvMXFi5aئx ?  ߨB ޜ|ށl a#/ft$w@bpcTk$%?`z~4e |[$KtlQ eٵz4t|O,, pZ$@*F!1Z>ՖnsPӛ\&wS5(=h6+i>01i[y{k4OLҗpԕ}BLTڃ6R-mg3AbV)Aȑh'`csHW8/ɆR@ŪQ{AK1:&5md^H]aP L@pJv9/Դ@~!u|8+9k CV?ޥMM:k6tJfw]Zc,&ʱ]`'MOJTK +j6(~"*1<B|> 5rZ(htiへ #q.eW^k#~.]bH ]f]g~>uۗeTO5?`W /U=X=^>['!-><+Yo.B68J2:)=~O T/)aXOb:oY ?|G12$̮ãE9U=2{{֘ETKi&&U3!ɰ(/=; 2d%z:aR +#n. oOr`*l >fO!ZHGV6"}#H5iAD<+*s8cjAq ۩"eU-|n@ +.~jh^S0Orj-!jrs?HbT;앏9q{֒IW$q]1G,G Nm,4Xs_ +Y8!zp +J>G{[ѽŹAFs5ArԽF.·}_'LXXo'Gl3<%į?KUU픏VrRhs&ʷy2`+v(xΊOϸЭp<h/8O6+[%aY mԁ.D!)šyy=4 Cۈ;ZXɻ?L!\]t/XPOkޗQF W.qq2TP/Xog9U%^OgB" 7CWCN#.het i|/0`hc5B~9"cI":9Z4i?nba*LA]jq+Mk@Yv}y9a.ӽ0K=hV/6/)8}~Xh ۓ)=>|!i+<ezV`F­׀r?kvNU5<,xZo}^@М-s>*sQcMYM@ܢyjAhʋB# + D=T, 2~/vG3 +,箪R>lC.Q}ͨNJW:E'֞!1(؟_pHUQڅ"UNLȕ0&p0.Dz'1<o/c$x0PJ4"90kNl}Ws_"6 8# 8WqZȚh Bõ'#fN +CM,n]l{T;L+HR1RY`Ƅ# xK Vs}v'tl¿#Gtm6@|  ,@g=MˆvcЗLtpw؇u0~s^eauDܺL:~T& E @<Æ./ID;⻭z=^m, l91yr_]~[F쫻w J0Zig ߏ Qݔ Ʒ+RAQ) ?kw \=IDq%(7uI1Ni"@T%3bDÙe+%Kf#) +V琔:Nٷx>C3J PFMRdE1:@wqᦙ$W$Ocw@[_!B< d5e?J>S/3[92za ,hTJ!xR[Q *(Mn3?ܨJhT`" TO*1V5 7>N$6%gZJS*5)r_VqI:| ݸ#1(LȪ6?4PjȱI}:jk6VA \T.$t2znz7"Q ۵m<8|mYHnvg%6NjCƇLf07jnYK ^}7HC'%%SY^hRc3<"VqpMnF5H ofEoG?4# +UDݷ/@6mQP_ ..//o]:FN24Z e;mj4=E6J*H-9C){|{bJhV q +EdC5d"8TX_#w_0 lH\uB| ` +g,A&&~JV M&C&=ՔEx?!;0P{H@^7sBHF" X>>q:"W8d]r,X?)(F(^n3Ya꟫ۉJ|E'a0Ʌq/vQAZMoM`(- =PEYO (ᶠ?;YYWUd wD.C`[Z|{yA~om/ +1`1:a/)86D"ʿ-6YlkPngA f/73]lq2Ψ<7@'RzԹawaU?y~Z{fa)2Iu4J{KGiq)})MbRR}-]w=U\f FLo^\P)0!)L:PT!JKj#?sK=Wh=:8tGQW:Q;Ipʃ~mz4:{%sv9n<}/[M{b%Q<gD_ ]1m[}_voyo?[+M8zI"]&X͍qT0T8'KX JyA0'HKc>H{So^kR b.}W?t.H)+Z ArT$E '₟4ɏ^݋kCe0Q֥OאH>SYP:ȢfdW%tFw( >MY)n#X;i +O]K\]<>l>,yHx D %)e/7tXaqֺk"w #lQ Cl2 K4ÈOg)< _{ΎŹEʺ}e;4A[vaStrUx*Qh~SGIeGF̅n_g~ e"~TY\a#y.bU{YMNo7Y +l{T& )I~K:KE}p̡|o<KXN./w1fdԔ?E=d5B.̲B,X2W +^Xƒmr¢<[X~ػдFۨ3bX6td9}{O˜x'sjp (/Ye%ΤlӓKc,ik|n3ȕj_K3icQz#@oa怿K9$i߶T$$Au >"/YHebg[SGbG56tjlQ8o%<F\9Mj'lߙ(V ʖ] WQ= ENf,#_爅jۃm1J@t|זօpqJ+~nFbEfǕqЖNFy0AccFHKRLWCUda皹y af2b2C(fH<'@]ZQcjJ%s P$Vk{˯pL!k瑲G)Y@4؏i!]w8p"!V@\{J5kLN+v"GM up}>3Q)AF2wJB4[薸-+HN͇KQRbg E_a1kow\(`U, ˆw=d)uk'PBd KJw;*){>/!q!&B_ajI203fw),@) DipFGQӶLeLW&}.1A{$g܎1C)x=z +R2t5Om!0QI+V,c 3%{JWآȧX#dOl/xΒWSUbr<@g xή٠S=k|UͲP3 6ӱ17ĀQ5GisBR\F j/v[qz)pަqI,r\4)ёdiYB[-MQD;M/kiF,`wV{e)c Z|wXf!8ōuFRS"MQBlJ/c}ڷ>pmzS! -*! Dz"ޭ1%pH~~&teZ,:q7qZ)~3c@"|aCfi`P 31xDX`Wc+뭭KVn-ƏU叟9mT.k'* KALVfw[;Teb\,oMhݳȐJ?Q Dž%\t{ ++UtS>@큣]cjO4'4" }SxgXF[loܻ.J m-WB̈́s.hNT\>mc$3.7}n'e:ΞɭB_'_.B I>-#e+՞YS]~KM.0Ў:=hM ":v1.Qɧ*/jz+JjNA{T w<]Ōߚ6DyZD_W%n$'oqUl Hvd2$q;TWUӠiRKf_WM"FFz`^EN$lP3pyR0?7aOT(fmwJW~MCIpqa:6?iVZTkzMS +W/mM҉nKW 8LZD"𧩼']'lhr*<Ą/6Қ>*VjRMI &T];gL̓"\'R5L_ H{]30()6,$ؘ L%dn—f˃qڷIW(;,tr|t&՗A!/[ +gxdI:vjoH8@:p6u(HKL*rl 2+MÄ"Ǚo1x" Jk+[3Y_ @FJ[X0DQwst[ccJ,{սgEeg+7t9

4C>햲F }bi"7/1KP'LMȵb6u$LN&ժp?E yN`GKm%%GhW霫F/MXE,xpYAkYXovZkȥPa)Klh8ߌ,XooA^ƽtλm`ww&_]?ҋC ӫ "dl3}Fr$kmV ;"P|_1$B"X! ƨr|z4M#v9MckgCɐ+:?Z$õDB-o.-q +D$\LEH]YH#5fQY$5&}:h+03Grck@cwv,Q?vw'b޴!kϘ*q'])qVf\X{$3IT4|{Vli,q~7xҞ]v/g̫P}7|)&K#y:NTX ag+U'<«v 7CXx8/ A{D im~r(.hj+ cŭ+1RhҽOc-3M!J(齒OsrNHlIRq*#ѓJrP4&-{pbU~'.{@u d4H^4ao+niNHe)rGzwז$ws } ŻTz3IyKBG;sOjaikHx'4Z),{.iŢ5 p1GO)O O^(=lYCmU?xgXpa_a]Ҍ1B>jR(C]QP:6B%ȕ<:L\}f;bq}x %v`% jJ 5>Սy*-wqn]a^ Bc?sJmw=8}u{)93ߕ&6[f? 36p|Ν mr;0Uw_P=n!n0%bCʃu~r687| ,)ޏyVڡs[+ld_PLR,>+j&/f~=.ҷ]I96޴ˠpio=M@Ii n(SҔ޷2`ǣWH&gIK}E4X{MS(jA=1*kRQ 4xW9#2o.BpCR=0ggx;=A(=S8s#Wtƺna؉PL_ԤdTbQ=/WpG5݋&@Bs^қHWgJ*>W%"#UQ[ +V壙t<'i|tt:hj"[BQl@<uIdlh`Fgj^\`Jwӵ1|õ)zZ< ^($I6$bR D3W>}h f{Jb{h`))mVXиP{L6VKꤥų睄=K*Y8Mx̏ॲ,&I` ۑAS{>A.QWt%5sysL%t% +0KG,Aځ+s\BܑM3&@ L;W9oL&!T  J(, #/f80Ye#*+pt['UB" ? !AhnGZl+6;,XV}N)swq"7Ak2= +VcEiVIl{k;sU5ud%?A8tWfq!8H~Q %~:ꖕߋdG-BΖ)ݣd ~5TU*94=*dȞ<[W +V X3#j&hlI$/[ZYzfhֈR=ު(Ω\aT?#/+hbLfu@*ͼpc KШO?1&D"u8UmuY-q)ֲ-X^vvYE~-ie%u"SćpáS<7ˬi3$*JgeڜwT&#npV2䇐yPeֱ Z\OD4&7C' p~Rg EQ~6o3olJxjw~Oe Ի78nDE?lx}M d`u`P Y3tb]@L9 z) vm"r*oM!\ sr2"/RWT+zR~-ҲnDp5ie iPoHA @W.o-#jLhNh>FnBˬÑD$' 'f<g6 `^Qg#UX +B%Cph4c0{'<-_%^-/- tqVpi5kg#"<*;i@(jMfLVjuSjNnikS6&=r`kQ6 wox3d( K_dcNyYwuwAA8'au[ljy]{TIce4ʌYgxKp { yr=&ֈ_`tߩa$ ڑ/&"'xCeɷ/qNףWf sxki:4%TWmd=6'Tבa *FCL&i.$Z0hOK~4#g^?Zrg_`(\iZ~2u `[}>&n~>>" CM ]F-|4ژoz^(Z%TR|\.r8Fuy>OuHCk 8_CapRLf:)"ɸoe>|$~j$9Ny/ `𿹧UE8X2~ִ8ӥy3S?a!uM~Wb+$yas +۝ +U>C IZy?܊!a)+ڃ U-Ϭ@#>7383@\3c9P3c&# +'?v4w o^Do}G% ӱ Juh>'MD[5 +ׇ ILă4(16t^[I xz(45lTEwVѠt/FZj9}Z$vDtk ~8Y +(2gBE +-#iDJ7,(]Q7_)p%ef /Р 8s@e{>7Q;SՃ7LhL_DN+8ĻīmYM$bsiT#{Tg)+{$U +#9ĉ*/XшhǕ1;ݮdM*+ZwN5Kt:Pasd |Zjm`TJZ-mݜ,0prɚQxNɃttKtJ?R;u-XBFpsgo uFl iXK-hB62h9L~V"D͊a*1Q8[A +K҂^B|HgƸ 1! ok]͖{1W AX{,,5;Ǒ:4MK4Iݤ~2hz#){e3LVNNr|9)Z bvUQ8\U6@r+|Cwr%T8*e׮u7>t~U"Q]}z?D̜e + +P;S?Ij.Dw$9^/ $ۈ'#ENP01tu`f=w#qeU-^v5;palT[YHY0 ;rnԵSXS_2sH.7"Wqm{VfuxP]SntÚm@ +n6.~}M1\ViNϙ#?oqg v N܎ټuQ3<}XDžоk|q3:F*,17x+ehK0Qy .88.,QfІ +φoߊx' *=D} +<5}sCŚsV#Tc oE" k״: {E5-PT]@.H8>^x_vE x*\Q9J숧3-L根ջyA3:vM[exB_O +f[3*O4IuB~'K)MԽnt6Io)Y h$5);2x݋?|{CX"OhIvXnMJdrS̳]6=cLķ* ~H 2D[(2x` g^OLw!0h%89v.1pYZ9(f̔jMzGu˙ށ١ 7]?w@M7g!msKh]컫 C^xrKD\`**Fb y[Z!% Ԝ젵%/8Gtgyຳ"{td[J| %m/@8ZKrfd , b1=ʨpj^Ѵ~Y;PSdX9$l[M=P/:z2zybeqtiyNHC樒7-?m:E ~4 ,A }G6ߴ 3dVyOo֞> b4a'R637V$&Zb)(vXQzC#`2&}"E[4 ;zG~ɎF$Ub]:/h6!Oߜ8'\n2*Q7W)_iτS1{D R +DSG\(xc-"矿HH~LXJC~t4sQymppWT6 +|@{Ik$ b sF;rSv1¿Amyt ++~ IDr3sfD4'K@'͉(-w29$С/\ g q޲cQ-*9YCkɇWQ'4n<".lkaVme;RU2}&_˃3gR/!g²=ϋ ʎ:sawM"ADg/+c"0 l's0Sew!.&Ǫq 4gXP%ԟKHzڛJV9NmG,֎iFZ?{K.!`m_qp*0H>PO# i{:l%K9k?I\dݴu'9 (+ل5[5N')uPj|T)dZm>`٭eO&c3̐MZHuU褑}GK byMRP=%}W8B79 #k)W{RU`%~Z ,ɣ`_C%a^JXVv"~ +[(x wm"tsMaK@Q5%Ya}/Be;xEE@>y܀qݎ&CY*0}QD~> B4g`wHdE}fx.{2+]?f$0ZVGݟGiQI^$6q1W'X%pFQP˸mn I !>%%E}[}aڲTd_2ۿY {_ps>"̛ +\g=ŤtAfo I>i D6.q4ƵOom%{#XZFkP.JקN+W9q8eQ)Ԇ<\7&A~4wkG+0kN8åÃƟpgt(kڧh;JRLVFщMa#џn}IFRl‰F%rpQR6bL$WBY Jtbڕmko `T]4{E'T}˃F~bdzy(Rv{2el:s#c Ǎ7kZ(TI-w5Xboq́ ~m ~|a~Ww-O9;y$L߆-r:9/Tƣ"X ~@zJrկBA !@ elm:w dN;«^|5^NDI5Y +_mXY3*&v\p"m0~zh_"I6`jwfzꬰ}=% ҰVǼ?'\X/nr@YZ`? :R0Q/>*8z??*](J}_ܟbE#N)H0Pi%f_WQ%7U SPurß3z6(/YZ\loUn'6 @s M?TdȮOFmuf KXwc~ɞn/yQNkw wFֈX"$2boh.kp#W\tͪN_7+ ;JZ~1:əpoߡ [3hõ~ÔOJ{(Ѩѥ"]2gHlwz>;_QW@*7+2Wz6̏l +l.WMv23H<;9u708hؘMfU&!/JYP_ט]l~ˆt:NUO>ժ_2^f l[%8LItB(+l|ޮYJH12[hIW&Bemafqf{Ecnu + gakSOeȥ35 9?g/rEzhe Iy2V"p 1m|9?OIEZ +PWԎ 8vCovvuP "Ti2kAmxEipeL$1PiO7ͣ](Lޅvߛ/>>_0rF[Z)Gi%TvI!t2<; sE8 ^u=G&)E6Bml!D `@A*-OHXٍ@ܽ`uq +ؙ;mۂM;M9:<3]'FѵܗO.5_ !ya] >h$]b; kfR>A[k_acㅫ[qh IVLZ ě?H 7jy;x|RnQ%g*s70 +@<,U~قEXwՉ.O t @\ps+F-PjP\i2^߃/ϯ7ZPƶ;%W[`OoU$D_CuYHD9 !bZHMQTP||[3׈zR gI(ۑ۶VH om0p•S"Cj}*oRޚsV"jOK_Ao endstream endobj 3367 0 obj <> endobj 3368 0 obj <> endobj 3369 0 obj <> endobj 3370 0 obj <> endobj 3371 0 obj <> endobj 3372 0 obj <> endobj 4886 0 obj <>stream +Hd͊zy8 +>sRhF^#y QG#Oç==o/ϧ;c_mӷKv|~_oo~y>}~W=|z>{O݇q~?>Ï?o+~ߒ~;%zΏx߽w;>lp?(O?{wٸ^ PZUuTGu^5P5FjFDMԤU PjVjUmFmک]uPuNNE]E5|| _#_k55|| _#_k55|| _#_k55|| _#_k5Z||-_+_kZ||-_+_kZ||-_+_kZ||-_+_ku:||_'_uu:||_'_uu:||_'_uu:||_'_uz||=_/_z||=_/_z||=_/_z||=_/_ || ߀o77 || ߀o77 || ߀o77 || ߀o77 KG#(~? +?G#(~? +?G#(~? +?G#(~? +?z $߄o77MM&|| $߄o77MM&|| $߄o77MM&|| $߄o77MM&||3,ߌo77f||3,ߌo77f||3,ߌo77f||3,ߌo77f|| "߂oȷ[--|| "߂oȷ[--|| "߂oȷ[--|| "߂oȷ[--||+*ߊoŷʷ[V||+*ߊoŷʷ[V||+*ߊoŷʷ[V||+*ߊoŷʷ[V|| &߆o÷ɷmm6|| &߆o÷ɷmm6|| &߆o÷ɷmm6|| &߆o÷ɷmm6|ۯ\t;]~~߅ww;]~~߅ww;]~~߅ww;]~~߅w߁w;;|C߁w;;|C߁w;;|C߁w;;|C߉w;;NN|'S߉w;;NN|'S߉w;;NN|'S߉w;;NN|'S ߅w]..|K ߅w]..|K ߅w]..|K ߅w]..|?|x>stream +HW]o}C$@pgnѦvӬ}-QtIʮQPXR sx9s9_7Dɂ-J6?ׇw7W7V-Vۛ(zA~! j?PE XAbuy:㾾]oV4P EPa?l~j0+8z. ad&,\PQp`%D!6ʮ6veR8q7-n֑KussXmKbB%.OcmQHL7_gnc\RXMe.ԍ\mn^vֶKBpĝ]CLlBB'c]vSo"m&;3ą+i4ɾ;{%%3tA+jzH2\T"ɡnǦkt Q4))O#7I'mY“㓢v]㾯f@װoŅ^ҬR~LPbL 8Z`6R^ +a ?1&: 2#ľ^>KdL,dF?JuҷB3X;؁%;z?~pzp;^UBR*Mi~ffF̈%U2B'}Wq.#?~ےf`j_y%h, x+C +rU( {lUo?.,)x2ɛH% Ja=3y/'D JRU (r`^Z!IKG4؝rdb(fO_hF~oйe{2-צ}s{N1s/sQȯm`f@1|ZmwM{WDleL%慀Q_BͅBkHXq@M$-a{qEx )qq{sBupF#(J#p~uF[XnNJ}✕SY˭X`i0R UηO׀ם(7BSqn^s ͜ 򱺯&pMRp]9M]wǮ\ VD7n?TH&fiv?|X=W$s|SiUk˱P}l},g/A] OÇvѬ9 7@^]7' +hS궱$_㢁+w]᡹ExG>_n`Iif}܏Og-%["#HCm *E3D@譼u($x`ȧH}a}y:h3" gR ˴Gi}f0%H=@o6uߦY1D|Kj>je^&7hf)Tj]ǂ(*q O~BP~6 Q6P*6@)"E;`2Sp*E5ME~s:6#B@p9E;&Nd̠e lū +@Mp=Bݾ~{P@-$6}')scFOo Q\0BD%B)K79m#@GWe\fCn@/,_GYHl$5 CsL a, H##[ +ûfm8ANjL9 Və jU40ևH>6fJ޾d>R`l,i+4}=@^>sstsd&4*20)iuU +}Ux?kNPRPu;(3B8+W:\lALE&nܽHqI~H,+O8P$P%8YQc9.qϰƍ<97΂8ݑJ7 3 nx'\{CMe t1^=w-mM xR/P.Vt)-1,~,<ͥﷂаUm3e2dKi9IR\Eǒ#Њ3ݨ#  3m ++qD@kp::rFZ1BOl'E=b/C\kXz!زk)9X{-I5og@y *9@' I374 mMjR+#C}`ܥNs}74cp!jq^@?Ϋe7aN(qPšR/%*)DTk;'r@<׳3227Eh>B$iݴMa J*1·HVTV&i*DnU0 &)cjv3̜a={|Pv=( ) ͽYI$5)4ф9%l95V`jE#dmà"B30ILn7ecRvy"% V>stream +0 H@&\; HoPN~`SȄg|bYf6mypmND} Hm!lC},?P +t^k~{[ŠVj!7K\>u]X2~yAJ x >TZg)O䁩 FAAif!Z=WLVZe@ jר"Vn|T/xbAQjn#ճP8Ty;7|UΩߦN jTefwn Gq}!-jO"{Ёhk[ApU!|>02k;i+%8vq 8l 52 ,[ s0YWYA)Sj#ʟ@qM>4@ڜqhԇw_@F.HD^Ÿ{PJ.i0sdI*,WRzf}h?GGfl>GsZ,r^ ķmdqmL<$ 7a?z`Ǭ L s^ʣޭ{)d304ߛ .i8ɀ!ºV +X@KvtnqظZ9 ޳}񛶦x'0gU3x^O7X^+Q{놐Xp$\ up6CP^1|Koݥ4X|Gfm6[J: iE6uRh6ƽ.ut#UsG8G(_*bJzdn!iπ]$rV8dws!}Qgm ^8_GLlX4vpoO@GW] +Etr$/_\obt:!P + / V[T.F3P-x:zMѼӻz!/{2~OpL[;"TV?$/d`d\ +Z#;厼0;=hV%S;$kvt)1=k+}E M/}rs9 2)XnW.~KAΗ`l,_r0gK(GqO c'x=xLiw2@Sn2Rrx{޺S@` =/g7eģ@yȅyI};XwG#Zx6ybba)2c([Z}M:L[Wk{=Kz LĽB;7*|h F%|\Bt@#gS +I8xeB Z}h/xy$6woeg[`uH w'0qfo._fhb|-'"=1r<K6wZ8@oRڄG}}E-C_毩}KZz/AoGQ;*7?#g$L;W-`Wyh{I!g]vADﵾ$r:S>bh5|"Tf7= 񤶭u*ֳJ~q-k063jQ u_j6,kKƢ{³Dqc!6uPpd⃦aV|F۳%pսv*C-R4ԩo/;Ŏ^$},sU(ܦWyj%遅qg%}ofLBP!m|LO(M8Lt.$鹽 &NOרpc0Ucː@xK-"ֿI=jDkixV1;Q}NRFBK/(GRoǝ]W+C_Em1z=B 4P,*쿛 +~ΌM,H`vdȉӘ8lrU;(J *\hyo,Z:na{1jf07ځc_q?ZDF&dδGAEZ5nު&i, +B$B\C.'?&K|*惶p:QLkjִG)۽oaxX~w~3GUNJ@OHD~n͙oh%PKapD{DSۭ#tK 6MZY2;ҔO/뽧Z/|MR+lקNUi 6.A U`pQ 0F9Ъ'*}K_F +4JqRMM>@@;˦YZ"7Y'P`j muptڭ L'*J} U0u +Z='g_|ɫƶ $=eFOrW+Hf_l{P.$>a8C2^Uxr{K-t9U]E\.g J(,/(1hUr Iw/bFELV*qX*R:M9GWd#fVw+-"Y_c% <}φEAM|e{WQ!!z~fزd ȸ獢ZЄbv=㾰orw7;w[7繇w5 _` +sQ9ܣv)~1T\@p ~m- 3[w[U{HML=ŮTbGn MiWUe ;0N!U9GDT B˱Y01G xR-X3HVK%\@#ױrNg9_~qX>X87ovVf;2la՘~\F_U%g l7٘J*D G}5A#Y#@媩W1qMT^D*D{ ՙRgm#ܻiŋ.bkQHN$֍{  lF~[IϢh{W V@AlI(Tz^`c#IPؐ!ZB<]M,_'kkD*%pdR #3jHPgW =QA5IRCYIQBr:iuY%24עu&+}~ %p!xUIXϜE(!LXUijBhsB5*Tx@4Ky$ĤBǹ:2 TQ1 +Xoh[P$ΥO#iY~ed `- +͑=VqWb81ٷ1n kQ#؉gLfe +V~ #J?|1S?G~p<Иe_G t˹$Y .\Ck8F2hJ&?h~q-k[ϖtdZqG9&\ +`̷H_Ƞ~{L{T*X!Z +J%V ub݉}odd\Gp,NY{xyJ)eWU` aD)=U?_zhpDL<+|4H-Z!);R#cS6%X ^2_e9:RG6$K$2f^7yTiLjm'Z đYDp&6\ngEnLcXbnN'\'}zVL%8$5ɕ6;]8tO]Udߧ|+ (9kl%nxcLB bCu 76{/x$sV^ =hR"w>Rbe6|o:vӱ{xz4kb2!1.~A? Ig#GevG!t3(cR,kBmHxN @-,H/o#6[,"37|ĔGMY.C.Qh=:4gs %?UaKSP.GXwA/RjrvFHPrczP] mLz +=]q +N +4?QR>5!? +_3 t}?x1 ).FEq$~"Dig&"#A) +zsF#}h-=N6A+TD|l^wߴUgJSii"Z@jTDVT]$# nfUq&:Hkb6Gex~RڛRe PkB'I. ;0 B)( q(мoW" ၪDNU`]&Hab /ceW0е&c]z$Yl:4S4x$YWAP籰YFL̰imw5z3]o%: ^ iV9i%cOnE6^it1{OۙB%Ђ:L!h?V2[dV>UX {u-ĴfN^/.&Sqi6,ʃF{E9$,|m*׈eL4 FvP) +pCMXQSB$%H):olD! x$QC?9;F#/YmfQcH:}1@wR,*@HLA[TChz5J=-]mO'\oR-}L?#{ [TWwB?r6ZM+TV.nſhur7[}l 2Ju:Otj#2 Nr1؈XLa *\^b{* /fČ~ZHa-'ȉĵՓf IÿwHnb(QJ'Ja*]jiOS~P%ì|_kP)vʧ"\ w=XRn9& z4PunƲڪHqP5:Vkq#,IIh Bp<U,MOyV+ Ӗc+Լ>[Ae1vFG/ +ӆuk v;}-ZmckuR!UWz$p4+Kq+'0:SY A&KZX\8Ovo\tהL{O5-879kÉ8i:LQGBd)Ô*VPP"&a̼X*׊=C*OPU*f+NQrn)A؛BdT {VF&&6w>lQ$Z\:P2:CӀQBV-[yQ1[T<'ݭbCņނ_&(^W;޻@M.hTaF٦ON`H}:~NXb9pyAYY{,]Dh9s.0)] -hўa̾9F=B-68ᗪ%*rRa@QXߢ&oL+AcOoBS,ߋPYYlPđXď:4PJC հ5|~Tw◱-m˾=LJ12>pr04&cC[k))d>K{!&)P +6 D%M TM/?6.!?@wnpEx\Zo676Y"Tg0! zJ0A;'j ݪ-}{Rޤ{e~ѷ߿P(;‘^(rn3lPA)+d钃Zѯa?\t: 'ІOɯ_W^J,3 +d$c-!kskVBʨor4`=$Y qp"%d4tTwZ4p +GLDCFYwB1W@@`;D&D]{SiG %/1diԕhNiST<N_Y N8= Oǭ%UCM8϶@՘z DBrB* 3Hxo!ۘ84m \jMX(*[uٜG/.–絶q7c gM' +q~sqT2oOVKr(X B7,o'pی[MF +B%Ļ^abM.5!ipM/o6{`^20}x"0eoJ-} Q]%^Mm)Pf 8$·5Z m^aa4<|mU1¿+Tp +ʃ6sT/(ձ'@_Z'ŕIHu*jꐋn[K6i?7>L.Y@e RN-S=R $ \OU汯?wpSZ~D{"&k@8q1.V8 +qA7e#=UIH#mhGT&)/V**"SXol \E97J^ %p}*6omTY[%HR[|3H}C,HWJw䈯.)J?r0-%tg+Dh&A/[5ZeDW395%ϧ@9> +4 (jtxXjM +ʆ${6MKᥖ:F̷m3{D[F̈=NMV+SBa#t9ڏQR#ᵗ&"z]GlX_3]5Lsx)+,x^!L{1;P4+۫qh*r>~7f:C TĴVf@"Nݵ8"Z:g3߉ׄqѸs{JՃ-ک7'Ig2@ЏF1Fo>;)n&R2㜥Tlūt[Pt?9ү(T/U"4,%x11d].?[!#2X6ȐMaQr}?k!}I4%ZI#S+s~wW"06)M握֓&3?`*KIPoSNCt̳̕K)yN@89CoR>?Yv/Ӱ@ ;lw+W5gI.ȴ[גLOZb=v=O1ʇ0@g3⭑U`+-,CX ־Lk+:zEW?Wɥ4cZ'Q!֪@L$L)z +[އYi':_Iq¹#ړ9?%Yeԉtdz%;\Cz'߲ +qt YK* +4Y+ ^/jro!Sm)-ԹyevR]FE}7W0mUnI1OM5,E8F1f?"r]M}7t|rTq 0}WZ֎\OA*XF ǝ@zLX RŔ(7/(ݞ`"~W qxVdm͗Jgc9kWS-yٱǑF?3vzfOdg,Gݥ>I cb-bx%:hQ"Dٯe>MW'×vjHBuf!FNSz/ o]4t{0` ZU^G(==FčqFG 3w!Su(Ow~K%pOdUL1k6Y@ԇ0?hUExcw_<&;co]cf΁7UD#Õޡ'1]H@\05kſG2W?=5X&Y?@s}#40 X 6"3*v"'>1iHR˚=췥U,ocηòۧn$U'Q;~1>2_dםO'þe]ԥ +O͋U_"!(qƛ6t0gj5us<\B&/I8!;e`=Gn%[%CԪПPlВz;!85ƾ[\B #,O#{#t80ykGbA?: +a)SPkln8FP0fe;w\7oV| x8fVح7dT[N.=)KۢXz +G~6CIvz=1{Sϋ>$K=j$xZ-F@LNΛ>Qbԋ[GD I~=mbp;DVdL%&lmhIw/]r=6|mk^Nԉ_cdNz[DyP?M*O + ]C'J1׬2k>sbG2Hkg,hvM3^,Q:CYl_H4gQjjNq;0;0ϡ<)YsR`9\+uYo+جgDE6GR+r%za;ӻb{{|-FN GѽՀd4Bl+f{zZGn`K.@.^Njet#5?|vbѨiS󃀊YN,fӅM$Wb ׎.՜#9(l="T(V82y V7 1t15-K| ++r}츖䪆;] Q%[w + O6f+"877{)pΒP-R#LF1VIۧp|jEq.Ekc\9k#P}i^AǪD Q_ 43&Ŧ"n,$|(L%g?aZV.e ;od-x+Ǔf$Ymi.vD ;ap`UBxom^M9E,smPx l8cE' 3m";IzVȦ2e\=r\LH9wV + S2f[5ͦsI݂S4Y9H1ϳ$@ PΓ5{ c'Ҥ}̈HKn8CctK݌p*IHy忬)R':ݐg`0raoйqsAaH bgPGhؖ,h3V4~8@0Eg1o +an;(jg?k1cȢ:Ux =bq +˽ߘx(`CL~=!9dHԈzv!v7+J;'BMգ݊\j8s͂Av pO2˓\oQ6οU^~hk $dFTH۞YU$~ Jdo&Ԯ,<}Bv@*(,ńT~' 7Es} fV@#}/?ی6.Pjs BRӂe="1<93\3Eax/2~ХI-es0TyM~[YCXש{S>,1 ̨S_[TM5 8` }T,VtW +t?EV'ydkq!V6A(ui:XmzЬ@%94iH*Z*-,ðXXۅLP6 ٻG# HXOiBz\%"bUFl +$hbX 6NjxЊ xb'̓xR2rV?Hр^7jt:H+,/ѼLb7JW3;1T"r|VH) /Ww躗}β{!?=ƕdNovзvo +# N` ؤrZnF ;p?+q\m1yViDou[fh\c`> ?'SB'P +V!q9I kfK첆]pYz&z0 ^Y!X跙k5 +zq.P{E5JNEΕz͒GLxGY}hb@z*3>}8)~a͇KyMK n :O}kxv^}jXhRİ/G&1d}bCCXuӨXO5IgY|͠KвSrUAxbcUhWDKwkLU*ebDӀoTKU'댋yFnKG`alQQ ayYԒnݿ`gh=On +',h>Yݺ;ašxvl[>VШԮJCMZo<#!uhP#z\%Nsx+i#u2G} ddHoZ4}!ḳ[ɐt$+ ^|?ԣ|Ə*>l/.q78iL#l j 6 JEJ~ԹLJ~3u "Rc"DqE0Mt<IR$>mgoDV8F1NT͓7'sl^L>GqPϜ@QX(nSdQzZ T").B05D Ufk: %Zg+ǿf1z"\$-,iR?3,L"߷oW-\RBC]PF5&?2TEaF–3#KRs9=hUQ95RtlځT~U:BpW#!D`!uDױ>ZQH8KBe}uKx}sIlgE8[hj|e.[Aʩ@>ZXcx0P^1f], Yֺ v(dQU<tgr8nfŘXk_멍M2FB+&pxk=DD3R`"D!p653$^p[Ǜm墉>̗v='ܚWS65ur_:cFh=}pS]8;E}E'qx\R7[/7;A#W`4P]$u@T]z~l|(PrN<'Օ3feZ^+7M߂rN-icec.\d= + æJ:% m(j}XPk?O>Z}>^es`!4L RfsCoI=Mz5,<uq Q3:!c)G,|IL7̸KXHT͎9\z%Ƀj=`9s !Z Uh;,~]. q=x"Kpߡ{U߀5?\d2Ưs+;UNɭc%s&$PeRs+aK_cNҕ +ү0G]f}sQ@$JHS69#aѢeWll Ĭu6%Nl +C,ԩ}ެLZ_mP<#`TMs""T] )/P~ + 6 Eqi[n.kz~xW|_K/Mop)d{sc_J-J1mū/Lqϔc].$VO٬ڠ^gE,f))xr)PGS9'/\Z,uUgg)>FJW<(NHx6UR|,\$CCZ,k +qtځל{n׭Q/'.,G>;zVH)|0"RR(r XEts:%1~,Ad#w$><)%x<`YWGa'm8* +䢟d=a8K*;39;1%Cقp$Cxke>9n{ ˡ,i)iTw1Nk +ԗyS02ʥaδf-nWDuЉh偔uj%;9bCo16>إ[lmLjvdۯj".rk7_+\Rrl,xFTꦷך{B 8@xRF}/*E 'zsc*I:뗇d:XX>[.k1UHw:ދmTu@ -+gqq_@?mĄ:I~NKQhtkpnrrM;-HyTR"k()pk$Fڹ{;hb`r5MGWP?BY7_KJ+Mí]X#Z0F=8t@q(!w`4\ѥ?w-8XYN +pqY "V@VAr[ڭby`0s_4 k1Љ nҩD%T&̙yi TG +K 9ۖ8`/Wfw*KA7h~o_1 7>AMeңx9/ZT"uET~쐧Y*MI`0؄D'i(\Ft`N}ELDӪI0q*V; _e@:., +?-BQ+dgxmF4Dܱ)͟D7+ĭM O}e`vf +C 8~MLJ1!\$H=Î8ʍ;4M"!P!` + قE*2ݛ/f|>uVotF1uK_a;{P{W}SgZs1wLRw1EJ|`@wtv|TkpqQ zX)V?y0!"MS3&HEc;`1Uzr2 j U vKB8)z}7l +wݎw Z,EI_9 {BjׇD}e$dYQ6)?(Q3|}]K3bh/!S6U;nO:x(sKH2F9[B1G{@;O^y)]ޝbؗ .4C u +Տ\ p*H _܊7ZJ<œ-˶] i &Ђv,V$.Σ(ly7#UdH]7-@WmGG-7;nSUDDK+ G~d7{,ہέz;^4RVx 2p*hA|O[*K2='V n"ߥB%=E-85[] K`!h'(G,~%)]L{΄E]2/y{i|i1'ȢU}]o Xn*a.dng)X\th<^@T|Pl?e -70gp?$ b3Js-@# >ۯDu &AkGv\ EmٺH2H69=tS ,/ɡhCN5*:yFqhw+[E!Tj2FTeoo>!=m@=瘬;ddoYn70pEԞcܟBbQ?Ω!HjU=CRB|aΏ +HN],Q]83c%e:TwwMwn +&.%:@R:DΆIӱM.6:?LOWʔrpjZ!ɉw?!0#rt68O4BEzEUl[*_ZLn:'Hi}X4;*$!-iF;wOs(.<;OElٰeNcxɐU1}Kj +6B>e} |oJnirW<^`}@cR ްgfDfӦyx㯻2dFEqbsPVz_Ӵ@dS Q;dw&HNgljgb +x'ѓA=#gg{q⭌"dϜYFHh`Btg-ӅOH.줰|[61kZ(ǬFʿu+ϖdNT;~Au6+E 6E׊-}Ebk 3oV܄Vi_5k7EDq,qOŕÒ1Z-ywӂ> MMnt~ |Q I~U"5'rmGb4kmSqXf>I/q^/̰x5JCcn f{tSi"@gaG󀾟-Q0Р.Jp`,v"=/:%E2{OhT\ad INg'`Nn߯ra`PmzCqU>σwX׆~C`=Mb)LS +>d0E0e?GeJ&~7.ζ px-iz^~Í0d0;I8|}Yܸ2&% _g=a!KhSAl{QO|:QiR<ٽFg'R}>Z苏 =GŰ^Ue;ýˡPzV0"oQͥoit NQQ`,[j_ddhUG'?zx%%noK D>Eq||^8PLḛ 6)עƖj}B3lz9GɢZYIF_p-S]?<.v]?qC Е3u869n}ONef9%- +bjJ*],ɢt;!& t\f{I,p<`0Gј_f mܺ(l`'ꨃ%er>S0- ~~i>zަdU=44AVVgNlHNBX99tV,G+E/ +S1&`th,8ͣ:bl R+\NzI>6v>ԈZ5V +IfxcLN-޼2%҅M[Ή#ȍW܌*4E`CEp<-rzls{z ew2,Z*kOC)Ipw J^柧w՗Κ +H)ڞx4Jbڙ&|U V޸|ntMuo|;լGVY1YM&IKM\i"L!:I::8o>tmڕBC1ʅh!DTICY#wZ5(xiT5Ҍ,v5\:@ԾZ}krS {4K6ȡٷ7 D *$y~G(fr^N)-T5}[LF'iqt{o# {Kdbxz\^8CI{ZW"{S +6k>(:?gZ|z۷ *zqMeD!DJۃ>M`)H;f*"(8Q4T3(b?K_-?Th Vuw2yȁpf/w|kI&Ia ݈3Q՜H:1yT7 4L]tKF0/Dm8>y +gn;GDoR4,&7A#CEZ=9dnTh3h̎L<ުy= w7=gn` Se@ +pprq.vkf[|'Y3Z[׷'ZnhnOS oG2VPiLzLf㛮$ݫ/H۞4Ę=ϝ偅ճK!ۼIUVHTVɹrm & +Paf{pQ:n`1sWo~`Tn;RkQ!< w#¦#⒴ &lbqwқ;!Gw6* . YQ(]ASfh. xrU5_gf>(9{Ms=[!SZo%aի@uC[mOckQ}Kt7')}V2pxhc2e󟣬؋5&y԰b⑐7X[2s.8;TLnUR`㡺@; +EAwo?hd=DADz*PcmX7ǴĮ#wbWr5"/ǗmU"|g4"o0Ydd#/=RRýp{vh7/сV=X.` UNSY>Ҟd*s,&\ߵt[ ;қ]jYAɃ`D+)vNnb EA^ pCgerºRa>uΎ̈j;:--FBVXЃɢ% hSq\PnJ+&w;_@чH]ޜYj_IZ@ȏƅ߬*Z,X~Z +tMq> endstream endobj 3360 0 obj <> endobj 3361 0 obj <> endobj 3362 0 obj <> endobj 3363 0 obj <> endobj 3364 0 obj <> endobj 3353 0 obj <>stream +HWr}W!K8eޔS*'f*+Ʉ"|}zn@6KBOwO9{}1FRcl(0!I1ĸ>}}񗋛ū.H1s!ټ`lWh HB)fjŋ?AJ9wv7!]"5&1 ¢ ##|*۶m4WAҝKH +w(}+~~hռ-^~7on޿+_ecL)DýM[>j]<\breH +?'7!Ӕ=M(;אr VʗEdGƄmT#%E|:ɽ!CsrEH`WF6 ,Aeѓ]ǏZ8XC%8\lwZ<*'\as]8ÊH2FRužb0|D M:Lpn% +QWI2tA.eCtZڇS=dyƺhb)e\hթ-8@%e^ hzQ)澚e^!աuF䄑# ^oSwm~f U`Vy" )$z-rQWghAd6)Gj% Fv)t)hJw<6w#p|0e +v>),dmSDN<66I"Z&(I㥏 N2[*).⽫ OզmRؘ:|rVWB5%,/_MtE#m)]WwHMa1ov> S}D_5Jd؟augֵW,"2 D2w?p[x6)_ +/0<^')ӗ@-|_S4= +o58*f +ryx`뿝#X>s)xk0Euxl +-8$EdGMq!`c40$lG׀k\XaMب!I.60A{L+϶c<ۦ]qvĕg wtˁr` 8oiLc鼙f; zٜ:,fa,I'Չ gN3W-ԁ* 3l]h"&svee>*kYƭ߼'2 =g0,N$F9l!8TXw.DzNXCOvFXˑ~^Ďf2vtxnذpq91 6E::̱ɜ"Ǧ]EMYteUc!5ֽLfu0m$ݳ.GMɫ.g{nkXx|[\%FVaūͶׯ՛;0z"K)ͺܴ:yҽNzt>$O%\ +HA ϼ&&j@{׼jXtT3F8hY/6T,節"d^oQ~,1:֋#I*xy!k\rBAMzQ:h4%WY$ +8(XGE9Q[2MzAC䖉D[sYޕp8su*#Np'hNpgx՟<rbFIaՃwX3x!Sf7S) +ۿgd +J.u2&LfnW`o)&3nIr |f\R Kd/Bl͓%@Q*[ӗ r.0ٔgNW +}\>} __<Ht$veSN, 'G90yh n$g(ݫ&=Fqt=4)s~<6D<!hfe^{l naW]+n.M,\S%fg/nUw QXy=qlꬽ5#iw,7;Ph27mr4pTd;òRU]cC'eޔbmL7i7DDCYdW԰0h>stream +0 Q@&@ Q v9%( m&WY_ji/<0kwh&©ӿ~m]L=&(ɶgLtDoLVSM^mECKv>`ʓ:`l%qy+<J du'{xž]֮j;\ +&Vqm)k)grp?|Q9IưT㤰;_0V87HgzV21/rw^afI|Ƹ}a 8u^GD KUwV&TImD0[ѱH?<.QD/Ԓ,Ē+w|&6!ȕ̏v7 C@@TR>xM>+a06=9M~DoY8&A\*E7*VcPLac*Igf9DiӍb pas͎U61G> X<޳_A@%Ӳ\XZShG{j}亊CQp](AB{PG%\>4msBN +:T0\ ʳp.ΞqURwKI=DuOrAa弇7v u[ƶ'4N1qIsB7- a`ӕ@E ay>%lhX!>fZ.A^…5b0(+K ! +7[%Kb[iHjDaE#ѭ8=JΓ1 ,$PtlQ99/,Wº%"EY48rۺW#0/ +jC2z r;D,喴yRD X=+vD!]M@ClЄ]#S !5pX+5ӯO5wo*cd*|ƍ*h,/~q4IBɲէ`W5:IV82Z<[t4'*.=@YŬ~E;XjtjiLԃ9k(ۑtptr*l؟Y@ҢVcn}j(/8U^ҫ)Fָ/\aI]X9{;#Jd_]rțH3 q9] +f~ny`2si6cEܚF?U;ř,a^KfO'by uFwZۙuwRoLCGTv1q5wW h$6ELKddNp;T^FC5)|d; Ѵpfl qJ2̇VMkRg_핵0vv#*^ޡά5b0.iţUSc|G?}#v"vnh +ȣ‘UA71TԵ ,%80LBYFYx`^(x Rgmen_{fԯj:dT##'lúvťAK1:pueYaTWg]9w@0D*r1i+< =M][ +y^#O??H=˅vACVSJUn +gF\ڤN %t|zgTvĕ0m\& 2p P/:k|I"] RsVϕ=Gu~2"G}X(6ϻІ*gZڇ>I+-P-9uq"u縢x"&|ES_T pwm= 5T$,5pi]s JY1T_&AَDQ=i@w>j8Րh;b%A.^6ܥV&4Gw3THaBbӫ`9E:7T*l2֠[ȉ XЩAP.?)/bͼ=Ai,hH`zsױIkL۹^0z('҄ˎK@afV*ޠ+KPk9u;Kr7P.fp1:8kTlHD}DjU!q\ua;-m T"uaJ.UV:*8=,Bh] +",G;HeW Cy 6jm@sWaP;Wi6fzG ~(&S金kω'R cUnw&7%dF ՙ%6hR_ BRd\Vma8{X@!lOJ幀(ؗ3 mE× +SW7UjP5P)^ZԅXƟN&(2ݸ!ffM,O"B.]JŠt0=Nc6)vhw9eM+B} y\y"qY-cJ y0tGKR$/*zK-:XǮ;D/γzH#h; +ڽ,:Y9R|sAzѴPܫ~I:qH*OXQK֋S:]]Ƴ|Fk psD-. \2/N??%JD0~byf% 7#*ò +REz{.Nc;d[|GOlBk?-Y.)Pe0g|Ӗvj]+b,foH'6SlTme[8'lh>4Kvfe1nT5(]$R +΅!i/i)YP:Pdrc3Boy*1gd!Y÷*FK"zNO񋖙xJ&?>xsY.L4{jR\ +1>!G!v0?-C5raoO_Qp^@fVP0]e:wU"%5%{5oZA+8ķ!ǟ_h Wi#˶ÕPC _Ɉq! vĩ?ajٟ/Y铛@1JN% j}.ڂFU(;e{ +2ko5x a_U ]1aF۷3ceP~bq yLF։J ;j4_2= <ӁI{$ _Qn +LxFFк@F2ÔTiR +ej(M[ ܭrr4ʹ1;ed9/fRh w5rxėt^I ˏ\wKUI`/{emudpL| ;) z%ՊY$'BlbF<Y̎w#ۿ`VKO Y|J/u-7faY(ZŃt,},?|/E5>q>DW+ X;C@A`F^ZNugr[Op[#^8z(X|'_$BA`وRe)ؔY`YY +ty&ehZg]EvHٸU)huBMk{6IxB s[ګ@&̫ +z;U:FMYO45;9/5N(|۲7G;D  U7T{ Utj;%١`Brl[.O#Grƀ ׷~ &dB**t(2'fW $WXW<=$wa W  ,TTrye)ĻKDe045$L~>/ժkNI(q t=lûzZA ?(+$C3H˩NqUjˆ\(jX1L[7М@XkH]VU"7D/) l"R)`..8*2Pv9T\ZM- Z^wIk;;Y\8ү}gVoR/@A픢kQM<<eY<[5ۈ7*,h4i2_s_u1l1*ZTi'=&Uʜ qgT9JIu8Uʙ:Jlȑ=r DcOOH ib=f{ƞ#8jHwvLpj`JG 3E#%?I["A&?$5/E0F= +,4}Jn5v=rđ<{tEG4@8ůӑW3C6#G˦ xr%B[( կ[9$Y0~OtwV~M92{v\VqߎϞ#[C(fүu9p^Rgr s^Ԫ9}r-:5I6뽍lh}yOt= ?Md9Dd G_y[eooeqOoBFkG@zU4¿lq])IF`(]eRMO)6Do 1cd`UF=nyUeF +Z}}gJPZHh9?B +!fo;կzT><BCA+8:t8b$pFn!0rSt*9,(`[APRGf*w/`_ͱ  lO`` +Ś#Np[\oܫ0Ip7ڼ[Fv(F3A|8!2,9+C+䔈6ʕ% +p*VΑR%]<)wviz&Ҫ+!+ B mlWa_,u")ugS;?$>}.tQL\H0gvWEko>Tl+E10@ 5fQ3Tݎ [8/aDw3|+ *W(ee<464ݳ +p¶qG?yliJLI:s1t~t•80fQqgl4(y$7 MrMEDQ8UŹB{Ndت7V<%mH -rdۈ~`0kR0ڕ/;ѬNPRGRRYf}b f:if)@.",od0fv F2󋶸ft5 +,Ԇ)Z[;9'?X2u Esjmt>*^q1>QWIt@"`J'yBxzT +[j[Ndc9%yYD+}sRS hiQaevt=sXI} r t,qk[$C-ߟ,ڨ2SK~; }` -=1/nCCU,Uxζ빣1B 5}NM>V(T ydxuk])Cmyܫ}1&nUj Cf8Tg/"( }A/S6\߹+G%*6{oz:&B]h!PG] <'bXW)U*[^bRi#lqZB֖ys&fRkQdBuT8)4aɣXAQc6Ň }l!S5̝J>TǕzOO|4ZJRo%jҠ(pk#y "377mb/ U LT,¯[f JT֭yM'Y~¿Ң|kZ.mRݼBb$yJ%NK6RY$.V_)L}gl:l N_*'B mG!tdW.+Oe8sAU!`^q~ B%Ɋ4 T+xt6_W& + 74A }ǗC0kWi>XS^;?ߚչ۾h{ߩћPkV},6Fol- I|}hB@ư7y_b[deQʴu&&64>'xjTN^Q9Ӗia2( +h[QֿPl!LԟÆnHw]PwfOR쪉vD轭('>ORؐg'RǼ4O$uNAN@jM񟊸^Fr)quHpU $$MEJU!:r0Bֶžwx9yX*[98<'NuK AN>>3RAg<Ą"xO d~qXB u^k `H%^Gʂ}6íNΌ $ޔ[BgyAH#KPTB%"rg' + TP&{-p(ॼ`d)/wjі U#_Ü&)=TU\+k}80Bxhȡ7u M2le(6MIQ-.jL#BEJ)jd,Y[@{P^Г`d>g`la;I'ZdǸZ>*m$C'Mz+.J;U"(M:#޳ΝWS/_4؍73;4׆+[9$/v( 5Cd\Lb`c ƨdU'R_ȚF*ؙWln(;9U?DR{` ڙ":԰$2<9G ,ce[\zgsF@/,%#' #տ'RS`j]#pČ#De~BѣKl+eӖQh[3HNEfTnqz:)9`l?*U[J!*r_$fIhwSSk̶ۃ`+"BQ.Wւ).J9wN9l(]7! 8:$;sRL_1HYB6x{(t>OfJYwjh34|hXŁ\A'&a2ԡ.86:K0PST<XQ\) -(OPfXܮ_=h'R=Z?w3NsN^ڄ=ý/2 +hg;ABZ#ح ?[|i5s&ͧ36P6>"E,W"{1BVNHgY-/fdjՔ+(!cf>ْ?pKK8Prص> +#R4RM2YALkOBY-9vdMSYV!(&Mfaգ-saXk[a =~TQ+/M5$4&cԓ?A8RYc?Wb|?VJ=Cjh~4"ד^ t50_A:q-y̰\964@'"7LBK&]JHOSy lM.ΛW 7e-M34X*r}BT-B2RM8('By> L'AAԦ^kʂq +1ᔭ3 ي-UÖ ڿOiN. ݲa1 aSR JzQ:Tp%+?i*Oy/&o,HNTlXch}wѯd%5No[z-O%  +_jTDFL`Uyٔ1pm'n$/ݩxP*4( IDcP*Nd_L+\IĈ[#r͗FI4↑.ש^YKo\ RGŧ¹"ո*EI) O4s42z-FPb9{k Vx xiBKmD%q +?9cN!8([߀;1 +PP"47>,*Ij_P it#:jepM+A(+mPGLRܙXQeO헆8 f i>d_Giւӕ%Q}{hNiCvq^$av\6-;H`_63a| ×IC %-9ֵ&ĹF|Jx~i?y# dUI gz t=" w`L1MK$;0]KtTR}ƌ^dD$Ɇdȵ~5{FSRXCݛgݢ&0jCybN]n0!l:مhщ ( rh3ugMjgEYT^ 1 Zw 4ZR&5Ji$H-üfSGِS(2Kl`:dv+֬<4׋! +0CwȔ6ioo>h|I KrhlJ_xIocpd4@?9,ܳn!Ov<A*MMG6ƥgH#)d׼DO Y<3>y1x{U}5rYM™^Z^x<񩵀T2[x_}_I-<3)g \d]( ׀9쿅}”jэ\yLơ$(WxJZᔂ/5xr.}( +"mWK}4CqlY{XI%ic OvT3" SV%U +^IS+&)M|Y`nÜ(Zߓ'ln܆($J&8VŊp'ZlbgcΥ`P =qyW zCah׼lFB(K.5"0=gw x}kCl55ިtVFA;Lb:*fU(r_%(MpK[zFzRj}\ъ|w\㓈O (—HtNe:w5t YU_eng>"~$E[׭4])~$kogUkB]A뀳d7#{yFdLb(Xw2i#܏hTAI*8+ Xvӡ%X0)nhv 8a >HjloL+6A4&:FȈm4ӛ>wowD +/ u蠳]AFSl6nu,R=M˶CC ǐ{]ԝz>bB94 R@ǫt2y)Ô}ǮϬk$wk|:GrB( 0Sl +VyP:P!^ 01^? k+KGS.Tڐ| )J ٳ !Ӭ&""eٖh鼈O^Cat 1cd{s{XbjZV˲ڀ*t%9Y/d~y6Y>vc}#$^-r;7q0*+[M o-S1,yfwY-b ۘHH z*kHj9k^Pj5ŀ\]F͚K./S )IH q^-Zc>3,KI3W/|zK*^KR)E-/**ʆq&dž|b+("B=kV@fqnzqd,u M22g-v1KYgƊtXԳY4:FVTٔ*Hoi9ӸrI[%ʡp hM\Uc{ANq;mM鹑qZG$7z8gҠ*İHB|buܫ~}A2~\.[fͨn_ +2C^n vt#V(sFK=pf}F6ǿ`Hܛn5i@,xIn#3-y<jġ^' 6Y1?#9# s֓H8/(QZ'Vu1si`&/xf|))! +Vj]pӨoJh2>`S9 +NJSWt8GU 9V,cV,W# _ZGeG# +;:L?5;Gf ʅN :)ׄWeaD +b;j%L췓ݩ]lu8}0Ѻ9֚0̨I(FCAJmev_@m~l endstream endobj 3354 0 obj <> endobj 3355 0 obj <> endobj 3356 0 obj <> endobj 3357 0 obj <> endobj 3348 0 obj <>stream +HWn+6Lxs, `C< ]MjWEiޑ{eq9PΌx1W 1BN;{~q%7^ #]]nVlu94b +X !wg}öݮ\ޤ؛ii?|=;o)a#OiT"ƦwжoSOv3~/aݯI̟ +e?H5}|H.y$,"޽RtdS+Y^gB ee+һ͊k(N "|vص +i~nc7>u 7'Sx6CsզHf x/_t%NgW1)3'xhGݮ˂0}, kxa0JDo@;I%6tO?[-!yZ!'ǁsKdGe\ +qvҫ"]3vRR7no:Xi ϴ'h[cjRz1'jODm'/Q!bEnAmJjd7ٚ~z|^g ~izd8}DD{O*H6r s- _sO(^K`rҲ)6&M|*kv:RJ_`eT$v \:sX};ʚ>pd.\%8Rߠ83/|/' +d>6o=˶P͌D ^l{l*"M~:^_YB5$ra&~vȝnU\}F(1f6Bጕ<2WKM)m +^(; ݦU֖tf4q":%H6a$Qɚz`_$kGAО,Mu^ +OOY)"'c{&Wܕ:_C{ +1B -~^wai["$,)zԢb^WS&6>NwiG*onva=cv3;_]g+iL"]xq%KDEH/ۥe_f.$Yt7l? Hj0F` ˢl(B!!Y?F*Й)&2cnR| /s2ƿA/22a31/@J'ae})RJ2gç!j}ZPϩis\E{H2:U )Y +%Rj-a ؊q+AâXؽ +ct SPZT:R:U<2IͦnAXSnH{C8 ѭak"Kr+3*\XOT^ mL _,>-T8RyE1Ye7vaL6`\^5bC\ Tap yIskăyMsʤ`@A~NPʄ`9;嬨)f t.dof\<ܶSBtSNbKjʔo+8XKeBgY*",#Z{ڎ}q%M +D}ԏzY)^GB 80tin,㙰?ujAKz:B'VP0+J G +d~upYSϭ%+vݱr^)]h.pvl?p22ARLFljY"-\=H3 l 662fb$ Ma0賓 endstream endobj 3352 0 obj <>stream +0 D@&Mn Doc\+|ӋV6Yw-?+0tT' II)Y>Hё`yw{8C*E~] qVjm~QɌxXpgFx; )NZ<.!9%E݉led≿u0NǺsUɿu 1pXQ:T^MiuqUenpdpGߪ24ѭ>x,@`njIZ/w210DW: $rI*[6;Ū@T=c޸48ZfO8o0 'w/&~sN_4׌faA@f7(YvT;J"z}#I/3kνhc߱D-=6|2aǔgJ g5nץqMoeZ1}+M@2Q+xvehȳz \7hA[9KTBmR!b޴I$6PkT aTu8Ɠn\ 7h$R v SpteG t+AgW2 DNT"QT4kǞ}ީl M7(r7\Ce?  ſt{hwXpOI({|%! kDQ L;:\rWщ_g|nv,{( 9_W8+IkC麛S$#.D†w@rOۂHuZ]Xl4OHAR3H{ۦOLr܆/ʱhЬĪ^ʖR<znڠy7[xTiLI6)Mt,=xn0ҹ]}ʛZ,k0ЧК [oى@Ĭ/Ƌ.0!@G_d.w_pl7g˹Cop@5,IE RԡP\)"$R *M. tySHM@(ӖqU akTvn;hykZ);)yrܸIW>hvnTb](F+=)M_OuƯKFTb)zG/*s{)`vQ@}|nbuV; +T!?-V .V`Jպ* <`I~@n ޓb&&$=P?6Y~qRɾU„99Ver-i$X9c@3'zJmT$J)HG(0I+cp`E*h[;u괫xMԱEXDns퍱!abBĈ׷r$l 2兀#K [C2ǃ6Gv['0W|;z_Gf'M2Ԝ]PbID,YYīq?N){-4Z;ld92^R(nuqĻ4*Kz&?K7dZ@!tݑߊ۷Z& ?}?;Ŋp0JXz;!ol\::5J )Cihu .$"mb _>`gICRoZa6=d>ث%_0x.Cx N]ڮ\*D{Mm7xJ;>F`6j,$WL/о]gVl}~k]펈~:ua:٠od r:lC̓lIJyra\AB.8R@,yպ<1`*'Rq0˻B v@2'hn/ֺf[a+xms&^j|[i<E*wţ f⎃?VtuzȎǏ C kG9#Y矫VTˎMBIWf(?Kص=.O*ǬK-{.MII 06lU+AǥcEaWž)MUJWӄHkщ  Ődȇ=ŷƓk$Sc~ʉ~5XdLrCH~@DmV2~̵Fl^^/Iw>^.U) 88Z>Z.S>'#s4ZTZ' +&ʑz hr&G8D>-+&ցʟޅQu8 rSI^!.Z(nܹܢO"}GN%.0<?dAR'zZU:',9O RһC ƴݞ0".)fl;OAM4_wk@U*ha~.͒15E,J )ѱ]lr:Vn֝ Ϸ癧 +|Ifl,#ͯF>%+xtUᷕS= +U4R⟀OFbxP,&gJ'q10')wxN,򥀯g)w +\F$GCdH}X2TM_~$k`O5﬩G;j[u;.bo=Fk0`nXB7=C/H_l~[ E -ZIaW@<`"<87lPda` {3V_sU_ےbb":Yhܽp#M'*`#x]1ߧ>pj5"xi%p3GAH')(⪡kpBW C&;X0_1sslr]om_TFмjEl̙bw3.kd`J#`lՠōQH=U]d6|t>Q41rk'<˞P6SHRRtjWD\x֕W~6\&)B *e [%β 0: +ԄBк}?Jd,B?KhLDBiT$xQ93`5KT>QP!8$8mmZLֽo=~"z۠qOB]5}᭹22~8QN 0w>g s8taL寀z֪NR8}ju;tfDs? 8S_7s} L!568^ܘWghlrmTK~RgI +{1oق6_*5nf> vbz;pZSɂa'42+)gLsˤƛx-NYH`]> sp6^֭XUwV"yD%Y msћHW!%;WC`QyO/Zvn };7C4]o$MT1#*,9sdh6 +E5^0fVNOR]ñ0WW4|'Tޱ +w.0:>=o 48JIr?nv_٬y( JDwz@'u4 KǞ p9!=^2' PhⅬg61ܢO, +׵bC+3UxQ #d bEZB m(*0ns2qGm#(5^ݽ/{(;d +kOԍ3[<-bYJtx3{US$ 61}zbFFF' V 1t;@0t&mvE Je,K+4rB`of>jF)vz~^/JI ίyMUw^&4n[4x0CE[Db["KjO`#u]XtϘ`A=cnRבRO?G=g‡?c]ϪX[%(a[$HJ(zwjT,vNb~e⼡7=I;]6``iu]?g/bz8α3Rl#6M6eL`Eޱqmvto'0ŇdETt'9*\P3q|/C`]Za?&&F@ q/!qz=Oͭ˗k[ɯF`#ZT:imS52]wT1T4*ӦCad,+'>> Μi\P?n"-a(Wd&q~TgR,lVc9r Gox藠1o`FV#u$#!y u `c&5ퟣ=Jkrn #f \._cuh3hQ; hk[ðuv`NFqAvwg4h1b IeNE Ō^ҠM|t(x(YޮR`:}z[>3떩G 2IPkNǭ$}c2iV<6Y-)O1҆~zʘ)O@lsSaiұ{/;5w<0ӯEAYW%#h65$I_=z|q,~g <*)%*7Dc;!ZWw‡ νHڢDe\+B)B@).]%nZ?/<9"r0eB]; auoAUB&Js,G>Ec$+a+V3P? gH]oG;e9U!U \1L,$t1j@`ER&?]v~ȻQ FWh5ݔ6s=\}ѭaF1.hQ mwN m1%\+6LМբ* +D~fI4Pt;zntI3um~i: 0EQ$34$r?L3 MPU*ӭ~6G\}~yG(asIzwW_o_٭h@],Xĩ(JhD7"3IGl}!PFD{a>U̺szʈb9*٬Tt~| \9U&}j/ɖvmN')>V@J#yTh+> /d倡F3f%~RҦ(U(ҰAk!20j?8SN(]4x0PAƻ)FO6a?מnocl ˜p-<rdVxގXo1̙}yx)%ȉb ?2%tngJoQy`ƒ@w14WDP)9kl+zV:}ܺ(ν+;}Bg۫BCWNtJ)Z/zK8X)vCJw'߮ʼn}r&7 1\8jRguK| +8d08K& c*eXVIrW.cmP pL+DsfYW"0˯fؐk5"r5F_ŮڑIN, ѢEU`HeپFԙDWaLVbg3;2Ѥ0oVc4b+LɾQ[K_q: a(&fƚOдIW?W2}F95$lkس''b'q+1C玥dPfRj"cvitn( ,8FlRR!36S 8k9UfU͖[=FO^)IHx# `!t|a'=.+3 \"]eViWH1f}v,6#hs7\"Ftc,YygK6X0?y +Ia=oɖ_:U}mݨAW9ARb*<r.[h~Sn"kbX}M:G$?HfATۍ(9/Wxzn/bAzQ B!m ;E ȏ AnBotl=#{#|stqCpmuҴ wu0KÐ+\v:wdOoD3YyU rVjmԓ@eq"02΋(9!;G[ӹֻ& x)Gu 1TrcJ']vSwMU*Yikr +6"MkH#OU"IZ} s{%W>qIpJqGOL!><(lZVssf ة(/ p"^yEX|.{R1\G^NTOAp tc^#"بW`fd?E4?a7J +t#Ob?3vѭ6fϱ%l%ȡLT).q0 j/p+;RF.J\@\Vf3EX.fSדMxX3~i=q -W YLݗAe@ݖ8bϟBt؆Koko% רE& XW֝]$9O\i՗"9s}{,N[o +%ӆseXǻ:^)gay;R=O a ,?CKP4oIȏKߴ=j $KR?\g ޒgE4%Gڴ`G&o=hnUD( rN0&*X{W~ToT0#T'(:byJ=W$08>Ď~L!t).}OgI=9 +0R'<_Rp$i,ϻ=ܛj7ն؋VlIzw%>9F>IrZbVX&dX}R;>{'DjiJߘ9+F33EXMGٷ+a(8, 9ְM W0H/)-ʠk1 rIFTk4]}De\.~zj.O B(%0ԀS+MEN6|p}}$=ˠH3e5-ŘpՀi:#d՛ 4i]3T6%L1a?`::-@FC9q״yr锭?g$?r %9:vRr?f *H8샜 m\NW/2 N+(Y@C&q&U~PouC2BHw`9 S-$~5R-U?RL컰$  pTz_idPKjagA}Huikk2$gՎ @^֊e@MTA;iLplKϓ(Uc6ӊ&T1 +,M%?;39`@*Ӱ!$ FIYԷ_ׄPaۚnuRZSE7hgC"ΫE4 +4*@nӖޢ^ +@Δ3]Ƥ[:yxVVC_o@Ivߌ3LlU|6BLyFx"m&hAz&Av-O0NA!hxtge ϵacw9ElzL<겧}oн #$4U4prA pYvApe_:{{W1+no-+hf%*uWdVѠ + +V"_{%TO!4Q>H(> Ug%u.NYH mOS)īq/AQv0w~dXlSm j Ѿd ѭZq'p';d ";AȬSH0gljJmZ7wʊ'O h4ɲPBז䷃p΅́ dh.נJs6!Y;.89XzbW5$ ?IAp0AS3{dIn]HYԫ79 !O΋u` 9LMcD%۩p3#XkE}kXD[3!h_ ".q:7b +s)<= +]d&G V+])c6zL7%)+ܑT؟پSayVdY`єRX[XTf(7hk噖&%~-& O/mM+S%b% `hٖڶɭ vsYGSApYdTZwwXUQ!([vYp i䁸5R,ʆ&F7n׺6),:e߰"^t[.f>BWox'I#. )*]%"dNQQPmuC(Xĭ41DZP[|XHA5i9S+_Ov_BO@N7ļXA_Z nt=>^ euˋxA <$˸iv’YicSjg#b ӎwOB% (+iۀ72mB eu eto@S!~&BIBi10I;ȸ F5i&t H~w + (4{CeHq3̰/8nFΠ2Ѱbv6 &4$,:RabrࠚHLg(ͨw?Gh*b}jq>(m_N6^,2z}kpa;) 4 UV`Bb5&+ߖk/dzsǀhB„B>VEsG>9lA'@1AX4_fݎ,IڼP8Ca*[&@ǀ`1~b"ڧB W:ڟTa-mJުeæ)3nSGOrߎ {nol'l5u5*QhY Y/B|ܖ3vXHs% 0rk?uvA|EN:ٖVE>Ro~G7w~tNZ 40[mYS%ȞK!J=698j 6KS%QןEDx1-Qt&aX֓ ݢ(Xn.6/t]4l8aĒ_['Hlu ϐ >,*V?h]I_$4عRz,K 'U*%0,F]weŁ$fFoM{ /$.gVM;)5sߜuLeRM򨷽XKeQO'u'r1D'5,kHʔU=Kx.LLEݵntµaYp0a18j}; B88UOo! 4Z]WLB%Gylcs؟uqԎW) +vgE|CldB"Z^,+$sg-ҒS9 +6XuCV|4%:{’bo^M}J6k'i_^5HDxxo'Ml +5\my_xaSYUGpkpr8yB9'e0*"_jZtS$T'&6GTR5`U`߱y+73@(ž||B$}7K#Po&j ͠$/D(TVksb/7RT(E0WqZ^`|}yrP$YAN㖓4w@t]1z_҆G;[ƥ1}!r[$ pA0fGvLSjz7tߜ o= +3mh +b0ظm +ApR D F#SNv + v{d&h3kF>~@աx/Q VtYH;Kc>,7cPi +pcE/bр[+O+m%"+%+nH<3oTk&Z8[)G C-`2z 8DnTx)h߹;AâvMip1!Z#R]%75㠌u#MmM${$yao:Bw s\¼"PDptq8'`q2#IqP'NJ1=ϤW|dVڑB<6K٤ɔ66׺FJ8'i#L +~/w]%Ʋ6DݦEÐ(9Bhdg?- `ffixw|ޏgB$S p + +;yZRvC4` C,OV22g[)HT * pVHj%g \䃯@ }~U pa5K=&w0~$c&RoxFn:; $Q@oz҂f VX}CeXa DeA$ }"R/8W[Z'OFEmea# +ˎ +Є 3ŒX2`Jf^arkI$]GFW{1J]IpvgXh.uJMxY+a;ٙ^D,ʕzVM?FD^ yfu߿Ck Ae: tk{ +b&v6[.q$ BGCU=m3H u[֜4X@^T>~wKӌ:W}Ⱥ6 ]2\E[ i $^^ +GKDnGL081uێ"NΏ@`A[lъZڲD4 >?(柛]BNvn>қ8͂B)[]#ĴF{H^r!{kP0@*4U<=1b+ëE3x{=}{4JvB|wȣS;ں8;Mp#)5T!wX .l}|$$=Rsgn]-!ʯ"’bQBQ\ GC&`ax[&Օu!*óWLi`ۤs1D!;`HLn=Git#?Lի)ߝ"ݓk.~j$B"ww\oiZi f vh21;tϨ axғx61|?gY[d6 &p?`g̻2\7n7paIAy⛢qQ +ڃuؚ,,jP(}sS)% _eo@ Lc*5*yt{NJ[5p-Hs'jNZRwjMK[w$~HpxgEb;?mgmg*3X {$zzi_2{%O([`ZzKƪ/FP>0VqM^]=x5},{r` Jdœe~5HA B]RduBЪLLXw9( +&XRbEN0Vo7X>n"̀Ÿtu3*wr pb[]~dEj5Z; A {յH"Ie40{,N{Ub2)~K6"seJ KeæMfp +@;$/?YGge4̮=8h[3?,?#N)}1X3՝Z*qLT~ha8ƹhUTW`4-{ID9yuc"VRly.B XY̥ bӞxZAVIJM[;F¼op;w:kGx u?j2E+X2ei(U521:3rV0"AN),Mhf6hvϷe'"w@i& hU#??>|?$aڳ MqO5>q o˶n$uh]o 4&_ȥMu, K!+F"qkVd'B{,C@wqw<9hAq5C1)i ϟHp~S!=z?s$bY :z `/}\Y>5¢M[1Ml![Y;@яcݧUKbü ѥܽ#WS붛#H$2fӂ#`8uo.Aw(~u(K twAUѱwtD@IG.&fbKl0Xs}6,&F1rV|eʄ/u'[ +_GA*I#<ҫ9IMCVh$J23J^ήiUROfi:hcPܽNJ^NQ…,:#t`j?ih<^bHZ04j :M`^K{u,GU;[C%Rԟr2ϘhAd$#>ODjddLO~_3k74[K / 2q܃Ca|qҀ +;/fʱV¸R f6~չ~F~M;lHɕfz~)rqeoZWčVk>cJ\v,a`‘U*%\~  ҵ@^dY_OjR;G*fBVM7 #2P:?NTH/ ѱ ]v@S).ԗj%mmjҭ̏Ǥzޥ_^CU $!zzrDAVqG dc#++dQ"k,'c*ViteFR\!UXLxɬՙ@| (][5)${-.I."p`%T;51@[ DJ\\\_’LScI3M+U>p3goݭ:ⱺ.x.U'i2 YU?V|G̪ HlLV]E!fD8eG;a i4K‡_&*ABm/ o4B!$-Z+F5"{o1!SZ7t=Ϸ8{~^[ #eDNˊh%Vf˓JIs+([F7J?nW91Z*J7 !m'_a9jGn! endstream endobj 3349 0 obj <> endobj 3350 0 obj <> endobj 3351 0 obj <> endobj 3340 0 obj <>stream +HWn}Wу9}l6 d.$@ VHv%QT(jl}V=,rNP"W) +KOǫwxZDtx{VlWOms7}?K/`4-^AD;N]{וcEWBBvtawmZ5KW%B'5TC7߇'~DϮEJ̇gtHPo¦ a|T>JEBI:&nݕB*T!ZދcCڿS *ط*bH^(_PL*$/@;QH̛:[DhMc3D5 `Ԙ-K= $!s1cIj̎n7ECUPH莬-瑹 0PIʬjP`hP!u_UM:5=z'8t +*I罝(fA.\JQ䙖!Rٱ}Y7g\d׈+Z%⼱ JDrF2@ߟփr>U~>L~(Yqu>/ .la9vLIO>[P9Rnۡ1 :WW%<ȩI (_i,Rz9gэTN 7.ݣ& c< &+h0v&`DE r`XAcd2*Z L7X" mtV0U`4s?K7od^s rQMa91 F"ݡs@Kنpq{d0ݙ+i U(_j#8:}iLFa:q;qde@ ^ Ea l"N"l{ۮBAcQF&3S վ?hPdcNcu~:#)V[mjHvݹk}-du37uT3&].#1Q;0 +q׊Q(Q37xBvpb>L>͎\Wu`O[wLE!6q,2 0v!%wDic4%JE 37)l"?T|;(GpxE+p~?ۯ"'P@v?qг\QwKCTpv'Þ)`6U + T8,oqW(fS]-Lb -15`t̰yҗ;0RvuR`cgq`ƅbPtefQ[ > qX{qP:+}!FJ>-|ޙ5 &CT g g9m*VfAYH,L|S778W=|۠pBhQ~YjE,'y@d~~ESrML`W릚B,,-kDP"mՋ,S T&Bc @e/S/|"XnQ +6&> m|bĺ0 ǃ~0/D6@=)51()4 +(Q*|ѥFaRm3F܌0|fwJ:QG>iLD8g +KUF6P4aH[Ah3"@@Fm*ڗ[]Tb5B]`%i%1$(4>eicV^7վ51#!>D Tv]r۬Z]c@L҅}ı Ac*/V)$_ fJȈm!U2w?A9Ku6:{,NP{]*@!?(v +2Щ!<=SjAQ8s> GIW*N#fHZب)ԜTUKD~ fdf`D})/#2tZ/I*j*]#~PF~oeU!q@H-2=( ll0mথIHpH& 'V]5:{\"șʘB0bsLHD+lr!yD́a.AkSN"_k'3awdAG[MxV\ XXmȖ3*Z*/210X/ znMMARKo2cbbB~3qe= +E7 +wǜ:&'? B>q5Ef\RJ^qF.w4uA#~% ׃sig|`_e t![$b ea} +qgT0Z{"|16ℜ52;Xn32CaƘA0*>> 7BԓWoX98Df]ɨ<0< +XQ uZ0ԝƺ$teQG)LH1HW7,rP >stream +0 M@&Q M$?ʦ˥-k-?w&,YDJ[lbe2@&0vOOl< 6t{P@C{P͝a͈ 8>0~ Ukp*ʼnHg+H7ٗ;d45.Y|wczK9OWb7 GEBX1U\nuyP|g|9T ^A.oMQ1]n,*"a>>ׁ~rFVVq+d 2fSd`SءP}j|ab> q˓h.!z|rk_Wy3FT57{o" ((hMܽ,% > L?ZMWGR0xն|hGn5uw(†`Iqs} =wӡS5R2oZ˽]YK!0k57lCtDŸZj m@H3j# bKǰv,SϟY&*س:тmZ pᛝ`Ҝ O<g'~l8x )=f⫝U|5N L@|U,!U-}f,EI7 諸lLJϝ$[6X;!i"dB h +-CW=i=~$~5E+{8IzahW9uLц44~d& wR +OFR7t%!Cf{eC^Y'Ln,~mVm(Ƥ*w 0:xo'">ERKy  CyZ;Aq|5QjJˀ[DGMg8|s1IxVVtNᠠ$G7!ɛOt8}϶/.OWz +XVUtc䀃,y*}EO>\Fz76%fs0 V| 5U6kZ|%v}kd,t +C v$0X0o g,鵾RU76Vqe2Fb2Vn޶o͆V>21-݌yB4OQZe"}<_^#ҳr0(_zX,W)Ǿ$YV;j[} HKyRsц(b߀4[v.퓨I8fլ3=* l[懚$cݛK ?XVgO.zNeL`kW z%n6XkZ,#GYfб7٘B-,M[()5+]S_QlKBQ+&ar;u ži]TP}rؠE1_2CF^h͟1lA(:<|!]ULifÂ4H]W'ZO>\Cw3['kc\ & b8rCdߋ7=^;q*E; CKU>)DYh?q{%n8e|uK(wEM}yXY+z>5F=G;}3>!ZWJd&?n_VˆDi?[ i<=h0A*4f(}{!?e("Z@*  |ѩybqm辣ۣ6\ +AџfjO-cuҗ3 Jj/k*_LS-)z.I + ځf_\%uj~zf\vj,^y:]fp+l!95 TLYq]kρƖEHO¶YQ@q]YȔ +lp8LCȭc+J8py&9r`xPz8IX7r?QC['pMz-mvrR4DXŹϯ VU)cE{o6f' +?kOpK?~$>ږq~ow!rK$cU!P~ 21lw^WiTQ*MAIaP+Y5\l!`:)-b+X'f; βQekSͭv5#01ek[4?6L`;(~N4;4m&3;ꞎce.j[/3jstm֬9 AO"=Sr|PC0 絢t LB_Vj|Z{O65hL/;- ++kz +< + B쐙)|Qwpg{\'K~VB+S1(/_V[6 +G*؇0Jvs +DbR;U]UWeFN+xX˾BrC +N;Z +Qic-)miۘxN46+-Sd/Oy}Q +9!BYXiS͂]=8 [Sc9M7#Oiǡ8veG(otFi]|1WV %L'X~GvG|M:9ъS_jRڻ>j| +:)!!@ۉdx,oZwH|z"_0Y>h.yϥ:ƗXM`%iA*GVB8_IS D=>kRS ,ni`|E;ōOEU͸q?dTDžտ'N[a ˙ g{0klvkq>sHhᒧ o-EpʚJyu&-ηd bl\;WPQ03iC[εFn(qNΦEMA7C,)YhٙQc+Nxx]m 3US+7:FY}[>;TG lDeX_fI;>nΆe]0 ]Ks[ +Ne7>Fꪭj$yv<\sy5<:ag)duucָ[5ij$mSu-)OmuT/.hq+nے")_/KPk-8~FF=n\qzkB&%&WWLrj?ucX&cmYCoL!h 39њJGe&g@~n"jNT@Yi18)(#D,?:ɘ E, Kr+[ሄNrp[W"AIwloJߍq;{3־ +B;Җ|@bT DZPH-E;>ydu3*Tqm'ut %#+ھVGŷa0FԍgQ?? +c&8_?CCXKd/6U%DBFN˼) &*fnxNϮedK 9bݜ._O{!V`K{QEj/e!' |u/-R91@<⥆*|Q@YfYSaGOݪEPr59΅$yP =8w\/ 9;kPyLLJ f]蹈}ev?/\kp㓼۵jw5|IAA7l( 컝ܰS_ @KΤv@9EB8dA0_#ԻR)ZVʦ[^cK!ON/ , hkUQ?A\Mz42f)`P8] eWh~Q3,ԂWT]6<@jj?:yDPAN; ۗ!!Dm\W -*8 }rS2r_ǝI%/+Jq{zr((4Q&- H+*K4zy5Lj΅!wwA{ )=quZ=i0jwoNw'J8hm 9\X%(ʗUvϟ ia?9C ѷVIxkC55)!*av^:x#ve)ۇN]4OlZb,bYxۣ]e/ XO^Dh;IwC#bvOZ` ".X;6 l/PݔEVa@;TxWo~{n}x b" {I誾%; tIP(XC\QDg>٪F>:V(1[3[~ҭEvll{N1p_\fj]5.CqlMN+ہU/_չwY4$6n vH+xI(#PLc#[U$-2.T[]4uSU1p`:wHG-jXNbU=w4{?Ω{Wjds^#H)0P1qjS"R戦0c4vl#H>Kx%kOpWhH ɂ3c?d.:F}Hd#̺껉_,i4[E)@ug+7 q +$c}e#GM:YGӍ)-$?C*: +b*IQ^K(]IE 0B1*~PZaHm[AsU?=lJHB;P=5HoCmG!!xafmN6R7#0wt'?O*XhJWQ>?in&ղ4TP"ʝT5A.5ʎ[^$ A{AXz@"rPga+wҐ}@CWC٢-|0.J]ЭH6M1YCu Oҁfb@GxYX^ vΫI`aeEVaI V8 td Vل$>on` q])zk糮J$ ؗ@f6z5' v5*eZ`I,'= |,ᦅ\}4ڌ0' +"dtjh07 j3+@FmG|9k 2hr&^wouA*c^L Kn3d6і_U{ cE-H?l8(`fͨzO +3 yeCSE[G*|ߥ~~tzRQn?Q Kũv73rcneHɱ7l5 Vi̞S8דMyk?TUW;@k9T + 'TXp'$}i29/ꂹ嬽]IcPLmEqB~yo׳B\jcGI`qL!9'+b͝B)/*ݢ0F̅A.V **wt'*:VRN%[%bz: 8n!nr9|LAt>! CR=`Í2<~Ivʁp@_w4c;O 4c][&]db#r eKnF'.I5jZ!êɊYԌ_B鱗)Z,nEh?Mrxk%d}aXV2\]ϡM{QtKVaò=4h UrLoe "xpUkMw8,쥪=l&ֺjKn1}ad੶DCȦ*y6VxVB$,߹ah[tGBcqg?]:O"1ްD3mmG'QW]C2Ł/wbeVrMZNTdDQߠћid@Y_a>>^ūP?FF,vcL-IW镦X3 Զj5]׺.gf_D__'vXrg /eE&=:Sm-zAȻ :f7?.&~E l*Ź DJ8S0 fy~B +_Ѯbx7Ly<ٛ^wQ;ЊwKZ)HBTWBƾZuAVs~8+!Y0 !!wEE`PJO[:KRV3@BÒY^,HpsIuG[{û~l.r&Vvh3X^IiRSAkU<\QUw( +$ x#⃬V"8/ +&*8_TV0GSV@umW-!1ث +eh:jۤ-+ΰg뵝$jk};ӊNV 㗨2~aڷmw_בO7/ l{)vV\I$X\ 0h[}~l'㨶. [jwlc*FΆ"1p7rbB=E۔S?;Y m8ƝǻF_n;tUCkUx~-T IǀLj91hS]2iPyǔ2Z ,jNzbbv5iQzL4V2H>W)ѓyKo`|ޭT.4c()+Kw ss6:f2惡gX֞dg?Off8wHWhn׮SL +fjgtW+3Jf +]1$d0z/642Wx6z|.)flں衛馚@{`QYZDnlGy濚qԐdEcd?g}q@Սw's6 Ŀ)?lCTNAȽt :` Tbx!yVQ3N&)Mτؓ!RY*%D:^FOCgwp tF$$|qsY_As_a $,~J3pW<,P•r5*`Piɴ&UQ.9jϊa2a"X$SAm* 엢Zk {+RT*쥣 Bx_B3  ױ.9v:V1JGzD'Ц͔| +΃fBUptc~F@;rd $\*͖k +RNj5jM׽¸XS ¥뺰{7,̦ 7ۧj\8ʝVFk;tTBt%H9ᪧ5xyANOC5v2?U^EL.GSͯc&0¥NI f;G߻{0ꁛ5ubCxъ2YQj8cNL%h i`o}BclIWK%Pd}"c/g 3 2*}z~RT[IQ*N'.}MhaH>|cJ?5jVRf} Glǚ#ϛd+FF\Mz#t2W mLRG9PD?o4D:cYt:Y-DiOQtA3Ztw4Tu +: +J-i^Xr83 w +3\DKw ?:zE&wbhεE"$W`hO= vkgPh$l O}y M?aJ):h9vamG:mbPPnI|5\j4Qw&ܳߜɱtn\Dh"U0WE1s7F}a'v|?SNw5ǎ b%mȊ7+̒$Dɏ/Q}f݀Bkq6{7'ߪ$|ڞ +H}0 vݞ`S5D) wݮCA, ]hY nXf̽i Kp}VKvĖH^ʎx#EqsWڶԹߕyӹjcr"k}ɤuv5eBeut-XvB)U1|0\L;E[vNE J<<#C+dxtFEMd@4&)c&ԟ6nqLDuY*`XDiNuE5]w|7:6)Spwv>'Nt"ǔOY@K<@9φRMz?$jK>>dbw߯(5Ơ c?ɘ:y)EW_KTDѸ\! ϼ-rOB1Khj>V^ +`LEO^ʔo }=$&,B)p-uG6o=FFa !uО`$n!<+o +&R7wuw4-̣ߢ{#NM AetETl&ơL!qvnQn]clӵo߲.¢|kD_Уcދ9+.w!p׽i, g7OH@3'݂q ᤬+eMM^.2g ۫! jFyscM'|6BGm> +92{ 5!IVMSo 077ޭWx]̔MTv&r쎀#4%+YSSB\, + ܱ"'@33Sá$[nz,.SKdb1{\cť&EqE3eOOK{ZJ80ysQ<:旜C!P:DŽ8D7طp>MU~% +'17% ˜fµ 53LDZ3qUQv%"5k1 +;v2g*w"!"wHU_݆(`K[iLbnUjN=:&ؖqEj[Z!Oxv̓Qcq?/JY<U4S!"ͬN0teC)5ʼnr"ɓ'QcIąQ^;fN~g`80%?իIʼn'XY` ޾~oHKjm*;DyuA#۠'b6㸤a' ԟfYo/Sd\|i57Tԇ_ k4 Ɠ9HN-Ɵ&6g.Iʫo!EfR Jj IIƖeVy`qҬӱF`zj dn>7;lrJwn|kfi5o>*ȡ/G= YjpAYE**X,BP^b&ˏ &[¸h;0J}H%X ˮ.f { VƘD1 +S("$m4gb%A= kՎ^JEuE0P0 ^XyB'Y`*Է'Ed12iix"TD9)X`>Ƭo9H2Rְ# Lc;YW\![B8r{nULIgeN l@@),Y/_KF#nRZ`eN;bصhZ.8 oʪz)V$%gE={fx&.![41Ѩ,^0tGut}Sx؟)j3(< + JO:x;SU-ϛj֜Us?x7A,|L%~̾E_7*l*"`}3Iy ܱ3 ] >~-Ĺ`Թ3-&-EU{G!ƀ?Lm +`ԭ#-qйYHvMi`WÅQ"Y'i!n OFY>8$ gN])5aNHM9 G@>|P( ^ee"5"%Uoz^ƠQ2gNƖh@]E{)bGU+;[~qA4cV#!1\0JF-WWFe|:6\W`w^Ҕ5HnKw4_VG5c$mX""Jq~DB? sJ0#gyM}HGCxb;P|$HI!\(Cq +\Ko䅮FV@ +F z6UoR$$?RQPYcLO&(ҬD,;خ8 ) l-䚕;%^rAkf,n!R _,5#1#0);3r3E+e5̶9;:b҅-w _ZX'o +$<, L잻֞܉i'IT=h J'IBm+-@Dn҆ߣą:4J O*"@;'xKϜ]9GCClN͙ +Uvfjp74&Jy9S;y$chAQW,irȋ,萧01̂tʹT,jF3Qcl֫*@>[<-ozL>9/ ی~~|  6?jJ$`ƁR;;iAQñR:x0ÚdDS %Zy:.C bpW[RZQ͸ l)YXmT"*2_܏*..%[R=:(ƕ\5PqLW0Л5M|OS!Wc|ZA %lϤ0>U9̚ yA$eZSTHѹ9Gnzu%rMf<ޛcu)l혬h {|.h0J]:ɲ~ל°Er@?Q׶R+gU'4{/>\/oz( *z]W!D2!уQz (.tʳ2-n u7d+h}|=򋢛Dv\C=ь@ô6$Ji#FP=)%ZkliM!Lmf?*q=/XoHwpk[1 )`/VFKbHR%(~O Hx^V,\y=!|WnJEB"}RƫJ#i0v]F2HEaQ-f㫿Mi&`ɫ%j'=P(u:A[_rTGdd9}oPtQJXt[_[I)\KP)*n0kgg(j5E)DEV_c\ '%Q(kþ6g76nV3Tn=uu:2|,=PÎ!#]<7u[^޾漡%زs 36c=OɘKIX̣ +;R`Á¹N0=@N\z])~J72hYN,@et7ƣ4US=#4$cw5fY?_uJ$4,[UOS +gjjEؙ=TVM燵XZ˯\S-q *{7ӯ)D⍩ۺJc!sDKZc|zI<wReb#轿B|p z}zrAЖH]JL->;h|c=ji #pPċfv:bt{kݭcΜZ4j'g1,ʕ?^(?Z20|# mj'@"7ՐFQTn[?&ÞԄ&*4J9m`.I?Yaam47oh8zcRqWtl&麑# հH$*-&eJ>ZtXw):T[#t,\V"E6ls:0HF'}k:[z9#5p1zєZ6!5 θ((Qװ-E}?߿ej1|jPT /!>46b"Դ'NlT^DkAWS0I$D[| #f*$:}=wWMl6L|}^מ%ˌx@lK5swE9b!{ü_)=}1[a'(4v$Z$JY"`::7e~KhCDC:jUU2*#+4 +8c*'eB0K\t_fEa04$$ ( *; shZ*DV1#WzSe2~/a(S 5:vLB޶grDvd&v˥^Z )^Xo!Eӷ^4ɬg+fu8:uA@8|<]qic9,Ap(hJ? +d}KR2v"j_ygWhkDlB8f(loRBL > 6-ÿ/V5Pπz1H^ CLXY`F,쭶e|JJ͌W/pkes,O?Lz8n<9٥˄+~m=2kڼZcĎgz@h!@pTj8Ӽ=d$?֚# |5B!0E,Xh:XĐ~v6s7 L-tHW̼]HN|oˉkɿ.(s^~ma2;\ &cQs;w[jMCW"?|zBNmp&xfoBGʖs RJ޵b~ȉx=}Ae۰byU]a ywSzpeGJQnq~֛n+􊾅jNxh"8_U4]f+8v O]_UE]}2^A hi!FJ(mc2.ZHxȟibNp^Ki݅5 +:r!Ӊ(E4WJ*xU6ZL4\.wEڀx5S!H']s4L {ԓLGW 1=- :d9V>@m0*EIh;Φr|N4f4;q*lSV"{c m5 7V#)=ǷjAK5JCўR +*ߖɒ%F}#;dqCdJ#'Yg`10)Ztv sRXR&ߘ)#;`y݇s1 +2"hΘ8 +#KE)+g2G-rq킩zRHÝR2&qk˜deIJR_ endstream endobj 3341 0 obj <> endobj 3342 0 obj <> endobj 3343 0 obj <> endobj 3344 0 obj <> endobj 3345 0 obj <> endobj 3346 0 obj <> endobj 3332 0 obj <>stream +HWYo~ׯ H㾏]b$Y=JPfH_zzĕ%LwuW/U !eV)Jo!o~{ ?.__"+^pW|u=(mteFdp/zߓ X ƿgR7J]7f1LÝū_p߯ӉOד?z͇a޽a5yB6$ߟo?y"ܐ $ܾ2\8n.xa S8rLx8JDZ3r2Wlw}p~t)z6F̰]*a,Q) ]ӹSTF1l뎗9µ Oxw);_ b-S*C}>T# ñ?>`,<`㙻K:1Ay8py 6|V>րidIFLC,YiC,@DD́]:1X?WNXnXIޟqŠRVYWǍױ9I%"m}ib[&.cdBtq}"AB%ks&C4T@ H?u'cV,LH(XRQL#n>.͉r,ߎË[Yef[6K2ƬSvř8ݏ}5i3yŷx2e=Uh.P?" 6$ruTϯSAu:yDd4czdFTir+3s38r;r|e߂{+&̬4;wI#_Q%} hޗzӔ6"Mӫ +WT +TvX@j2ҳ4 YQ:O2*qRN'C9(* IA%vPvܵ^#f2q:~aѧ"H$q;>D$ ":H.{2UOa 2笗RIaqDl0A>L.DbfC^pᖻ": 0zݏ,s.]C)_,sxpa[nn.HMp@! 7tջ]L0`GQ6[y6yM&Jyf@SNT5Q;.<Ӊ a8ʼnF E-}/B@*x +k  L [7Rc`7. +c3hM$aA$~ACgN&*fLe;!%fM~4ߩaߔnYpQAK9GbSU+E(WMT|qPaDڎË_RegȔ(-np̠y/,SܼW|) +%Q+,z6].AƦ|-fnzS)8H + ޠDᲊa-&@BT]w:!e$)Ro^xe?tR(2нd>k'H>stream +0 @@&_n @HO/v7Q=ʏuAהFjgxf +ゖC/ld]7;֧UWLek0{IJui@ +^fM o9k}"4VIyQjO~#5dd,qnǬ, ++fFhP౬䵕,U64q^KdqɩNsBTZ_FRv =Hil0՞e8Pp 8}\&H΄ҥq39\9Z:.ꭴ^7&NO8ݵyHz+EJO[S`cx~'fyg@ʴC OhJ&uY$I6`R9vCfFAZG[.{I0)']{tƣWW F*ZS-KZ7i{SƄJ]=I@vL=ҖTyy^赊#Φ10Ox@\D;J8BX&'95[WLIiaQ!U72k$K˽gC{m߅b +4N( }72`Ur tmt?w(#{!э~W!m+$nMd768? v5Y;ha]vc#3Wc_B<rWu#Ph&܂N[ x0'J$Ґ(7IౄNS${Az|dAz:9f")| -uw˘dm'6Z;q~z~(T{a(LCEdz0Fl AӹEm%0_uޮ`?n=ޔh`HmJ +##o +ޑIc J8d,I-vH9ݤX O,tԥ L?BPf +}qῪ@~;wgM[g; _z4׳Po+5t;D5EHoT tboEWǯ79>-vۦ-ZWHPNs8ô Q:>IEq#`* @XRxl!=lj 3H@-)LIc<ϯb/S5ceN^LA Bf$*MHUIjDp&Dό\LQZub:: +B//q۷m<6"hĘAB3ݺv%5hNazzoOsNQ~}&+h +xU7U7^*}3Ђ?f/J]:U{ jx1/>:B2t4 =`\ؼVE9U_Q`~}t;UvnyO4L/⒏b.!ֺ=;Z) l=s2xNj1V +(pԔ}FM"FL?{۶ai{h{{ȡF_fl؀BZ +/I4gpH0۷D"i->>f(C]~Ů2%/uR,0M|6|#`2=ξhmEM/a<;XNBńv {E6T_S$XOiz! ` fQm p16%v̫ӱ3jNc4Hh']V,{Í߸odHa iYDf@ G5Ɠ\ RMpRmN6  p EMi\8UA$;i.IǔE䥐K}߶N8AZwe6CwGqȰJ\ A2M,ܼ;RH.`VTdLv'Qo9Z̘NrA]o,/۩*N!{n=i;?k44N7֚Y$J䥶Ò~I\e13UT5(iU5r40*_(>B!a:R%0s%3Ip(&Xvꨄ1Gv, H%M.& S|T䉡8ac`D7ΡKDwl'XywVkڨBň\ms#$qHf`u9H9w &2'Q4y X!̫dѶpuo '@mrQzUw@fqڤ͒)B|њn;q_714wh>.rQ ?h"27퇻^nnJ*TSa1A{H7 Bg@}$3WR -Cɍsfk]W21p/roq#cO[f%Ji}q');\6mmwˢO$zXGaUwCd?a䆂%[?^нbʻ ͥ~_Am{&fQ^:Ъu+IYOky;ބf|垻-xR sXD;Z +LE@ѐEdK_@Yɇ7.|fx C̊p +sީ"[8%x*z^urIlcRc'.3eHlV7gy6vuSOW׵o䩗{~d!kŦYu а + ٟL'>[OXϺ"_ݗo4NwDZ̋QuYe33(!Ç]GOzky [_]@}0]N8jv̿ο2p(fTu!sl>ԕi +l( \),g&#}caAvaYXs1&q`kne =}`j.@p2ˡVh& 6! C De{40鐊GnFjr\m ?<X+F-MRF7,(lL-eHFBe3 &#^NC=w"0i b@bX0YER)xs6wVPbj2ސBue(exHÈQl:8 +tJ_%}{~h\z߫*|AјD]Z4@{MK"5(ځx90<޷W0%t϶MާPsY=N#1ކ;#5)7C_dMf~MlyJ-Z"X}~-׌~a +{Aാ'I+tx+m" U3Fx*`4!*VC$+U9T)UO +n6Fh~.~BA+]z%C8]6hflRVbc: +H7Ȉg#vAGx3ԵDL[ @FE)S +3R,W_,lԞ;FX8.׬ EyNѪ;_U oؘw$D>0tSum|ht6un(='uБr F}P` _21A.,PM- !w37?;! QlǛ/LqX:Ubk罛=p!wm9wDof׆Y>QGBhY9>cФ  ˚ַ~Yȵ9FEyiM^:?Fq +-4AW >F3L\"ϓ0(Q邗II7D\K=4ZsƚO%[Ǖo2deC̴; -5 +ݿY*N)C i]?ffr4"عJF\w$ʥ>M H%qY%81}Y~Q|f6ōc2)K >/<$ki瘫5he" '7U4ͅuID1r.5F-0LM#GyATWO85UzY2w홟:)P.N );J&i]SV˺(Hvg Jrc5b'H{4Bt[(37#WEfoD~7'~jL!* N| Hc[X~Dv1#CaUlDS܏b6HCi&| {u#&P[˶M3tjz,C?&xFo/]OFEoGDUv,Ljɝ̛|[/vԵ{c̤rp ZT_Na 4 +ꡉxNO׺ 5QƸ pȸ8l)&qrݻـh|JK@AOԚ3ڻIM_>9Ed +5U-=1.+萭Fv7USugrh=w ? RSgG7Z7uҌ*k Lk/h/tT\u_C!e_aӽdaV wAFoFSrn9̳ Hx@srH` \kO`|BJ m(m*˵ :X-"gSfWDnW B@Ki!.>6?z!V&mJEʜ<,Rwvf"qt9pKf)ӕ>ٳT-iD YY||Ex#2F\,NgHA;M +YL2@w 4Y. s*Sf^(&}8v/}y<БO.-o5cv뗇`x+ +@Ɔf,'FD}uW>YC %ḤPQѿHͻPٯ8 >hw;74굮AU}Kfz4z<%WwtȢfmO>>wT͐Xu>$lel6xK"ְet3$کf† ۔Zl+Z<Ӄ`>9!gɗhGD= +RFe{F׉%LlI|qX9h-djg 6Gb8] kJAr uաr;;@d{HnT ½2G{9䮯9VVjeۖ:$uZC]δϖ>g=:텣z;i3v5$})yR{z?Z-= ?-=AWI9~XXu#\I"7^/WTih^ԧZӅ/Lxr5[[W7 .Ehipྯ) )8Qrp PTphFhNP\0,^M7 c-Y8{EG0e~ Cm/ +VHO]S=c@it ZIqb[J%,(joR?oZڊtDŽw-wŽ9S!ƮR1oœݮz m7O̎n^GdiixK$b]?qFbIVcGTq5URvNXZፑ &3MS(jvS 81ىK}5V.i{>ۚOzvS,i>K|Y__}FCh؟A渇g;[èĢ|ibgoKy)whh6ig:­D;Ɖm4^23| G} +Jn>M qʖ6+\Hyn7gr6si[ڡo9ѓj8`N$ەFv;H,str*1. nY #d[(Gc+TI6#-@lrU+i ~M6+aw.γ wc H#Lw#fCv$;.FE +A h+q!YAΟ[ŝ䈐u3 n||ۿ|015|c6@dV5kJbJp0ZJK_lΏ\C/a0<*>^I@ߘE58[/T@ǽe3 ?5O1Ϡ TPRW{ߒ`| 5pmikޓR]Di=lyΦ<5nگe,6]hpjϛb*l@Bv[ǐߴ<0Wzݡϑ1܍U{6$z >A +N"`@I˴]e[2d\ ]ߟ$^$v_[8#!P5|nN#B]ێ$K|4ޞ0Ι¤_%yejlچBAVqreD&gx&v +U US^ڰ9e;D7pF6/6Ԍf\\ak/:Tw~^ӏqRmL<@+bge{Y6wj'irs*(Ϋ_e>AR 2IKZ.@pۘV"evx>duhw,!m +fHtf/ڱ藼$A|}Wk@!& G +EfQo`ee8'#{<ݤVFED*ʿ/zW36 pj! +-(^WXK:織O10'I=O0E`nzξ^ƹǂ?ȡKO'7qˍϼ4Ke%e֝*G'ba;L䴱 '@>+SʻWi̠ܼHQ_4M?ċ:=LDr>zz3j&EyP@.;S[MlxbtxCFTRzHy5E$zA$?[2ɃzR"@nJb' 6T=)0wp⥊rUN0n솴.4J #Ot-{(I$n>E6@FchQsۛc0\W ʖfHjׯG =f#MVoC%2y6+r8A -nkKF;U ?sNQխ bfMdca}eΣu"H-o-.[tlLtI+ZcD hEhX[LМo*H7JBLԏ$;NvyU!Ж˄{Ӂ,huO{@Ti\*~fT: Qhh(ramۋcH򢫤U: 3QY&մNB5ܹ:#Q+H< +7Gbp}x46X꼄Or3YfT׻O-ҡ]e#K<#L)P?:C~ߺ~e*>87w79+Or؟]Z#nXשPfs xL(k y|ff{*$tya0|3,Kv[oXM7TVuh;J QyixMDdg ""~8W!0/q~eU759;р۹ngBG pr?OkX;GrMlORn{ڮ@/(J)W Bjh.Fآ[ D< $E/dYЬ 2Of YRde]}SΊ۞@v!qTR᜿*v[7US L8tL)@aBqx߽jqĦ1W2l-udU(7u2 ++b;za$V+`o{NQ8N3ޛC@CW1Pɱе5:_ +?!Po%dO#=RVCa":/N#|œƎ~ Z?+F),x<.`1"W`A8VE`%$Ux„ErȮs sSV-߷䎯^ȴSend_lCb4j}ϐё{Coxƌ*QSZA7}Bɦ&@m;6+뻑qĺb)Z% lV(F{-4;uJF+QU 1Pٝ]vDuϰo55==HY|[aH+VImSUcb,JQj\~).Q{*2pH |Sf"w# )S>s&qjwe1}I)t悺7L'I`*$D<|Wc>Jp@%К9KV^4Jrb! suwQe?KGVfPs0т+w Z" +^6%ޯhm)JŤC H&U0LVPu`Cd#1@2_~)E"&`KAe6QjV=v9̎51(f|,{w:)%8)G,cRٓi[[^޼cl t,cjFdc{ؕtXO{KB6ylɉ)XB{`35`=r0jdzp΄sҡdn,6:hMYtSWQ-kfzr_QkLFEiz3r,27{-tFc|܆N,U##b$ޏmq=??P#Y piYo<BN'Rħg%gXsrݯ9A -/+y>JԋlډxB^K!").%NLIPς0JL:bՃu&gjItz`]aq(TDwGY6UŦ.v|^ɜ5Lw٤IA̘͗%F6!C3Pnr`ɵZ- +6 9uC\."9(.eYvӄ䭋]1}(x1Vjqp9"ps˔e1/Fx2İzTDŽ64‡0W'ƞ+4CFp}uE26K}/o{i6G{!0/SxYx/38v\Gbj0hȂ+'3񯝡sz͕V7kL)W|A"m:`h M5n DX q`j]z$^ᝡܼpn@6شgAqA]m~0S?N#seH҅nzB!$L$ʽ}Njf㶤}u7{;SNpB4SXмnG:gS\l6C"tI P4IM7#G=UM@஫%_%1c!w:夐Ź#(r&1zr I[<1DlG@d폒}7Z( .TCxO9,uzYY 0.aԱXҁU~y`Vvϻ2bk7>I: 1m]9wjq>R%&(pU`˜hYeݲ,'ǶYKI21G^1a7&ylڟd\,zh(q<]dE{Sꧻ= ,VO}wҚUI9~+Ub0\%v-ƟBVfH=Í!{Sv+CWz +ֽA ؜B:]-ZJ62] eL(bf%G{e7^),~‚N}+ +' k1!eqgS f;YHmW(==MK'}; +#~U0U* `9}t%ҹ3(L\qҸ< +5 <,g~AօƊ9;a'l_Fἔ#8?yr4#+[_s_/9CbghEKiZE'`C`5,?)ᄀđ[iQp%&Դn! Z/oD;8sV<%aw"o +Mg,E6Y/v  >uWdQCiem!.=v o{Cr36f;{ ;x6:Xƴnoq;kAy)\&s22{t!bXS"/Ko *-dR{=i٪}5|VcZ=}mV3ؕ1):u>N/qnyuT9Œ>Xtn-\hFe9i$E,AD;_Ðwiݜ!D슰N"c+5婤"&R0$f*_^SX|ѵE\X5S,,࿸qkMM)Ϩև0;C:e%7/hh<bV ޫ;.Ro%NeJoq^rzUK*YReN<_WY DH5ŝQ2VNOP‰r&MCX? V RJ14p@bY?Ydlஅ*.x3t{jYt$Ic;7F#P͘ 5iR +Ԏ% `HL +I¨Qio)C67Q;ד`krh}x;L sFr8 4ƙs[9&!sOͨTFU *y>e{q8$Y4;/ll]hv=!zy{R0P1%o9m}E[G1UӾ(3N!97%#v&ɸZKAv'Ы +-}Ԣ_ӣ*Z&d&ͭ%Ȉ(}eZi;&ٮ+Ѓ]<"Zc]DFث :A$,p%k˝LB~ f + +nvSd/F ] U8{+::'j) +2F*Kco[Y5ڵkAj {#@@'JA`ԥL 8 'k* RA|:4~b!$Ec;gi96&:S Ss]YE/6Wnw9Gq/aM޶dc EB b +7P*sEp=3sk;6s7))mv&ps*zj|ظ[" mWڌ v /1IxRۈԵ?+z`@?`b7:XbMIP<F"ᗓD+k@S&{U'9/'?tԬ@ +6&x%'_5q0 a#CQfl7d]ݶ>'M:tIE WB ;Й-mK&oGqͶ&Z\LM!3D6"If,,o#LO0W%hUxsqYjHH۶%haLqXУ\J$ﰂ2;4>Fi#h. +~sORt9!G,0( +8u06EeZ* 2ީR" +z.cMOhN.>ع߽Y,ᓇ#IUwϣ`7KE/U{9pR!Sn`=5X'ej{Ax޼E,hfB;&q^q['RKn$ZX;ҔY6LUD<{HK'>>xo{ttmH.|;=pݏ7U% D-Ta'S_,QF=*J&==^f  +<:Uq=sU=)0T<;p2ep# RvK[m{+ۑܒ_+ yWX@Vb5"9@򰆁 +B?k ^]v<['KTPQ:y'xyΓ!bџ<^0H0 W)dijq@\J/)VGVHE YsXU规8U{=B>O®H.^p:זK kAn#JՁ͘©$-py=G?n4 ө&9bzj:j~/9Pٶ\#)Yz whr3D46N ~b6>²ɯ:V?00)mܯCVP7q&r jooxo6*a_u.\ יzƝ?jP ~YojQ"I+CQ·{>UNL.An~L8䊟7A}߭fcG=)MST5ʀU;HLbV_7C,jﭟִFImGU~fTN89v#ʫLYע)Orl7 a,8Uhα~Q;4o2[%߄ n!-:+fh heۏ- Ka5RZiގ 'A!#3>/FĆRZЋe:M|nkUp"pԌtH*DNzǖ1݉k/!v[0Nrk@Yd&"1v(ۚj ⺣ݭB(]%cC-=/[׀ zUI,[ ɞR( v~ <thH.d!9~B;Hgl DJK/_hY4p$*Sl@Uk;</B"ú`-<&ޥ/Z nd2y/t$/68y@(7MxQƁ^@gO.$νl@1G5t5x +I-8F…)}'u@iGA5فx!o-4cJ߻ b9k @r@\H"4{1 ^f8>N3F +=T,Ǜ;ʙ݊?{ S=G&xP2GgV#=Bx 7Ia_E 륰++'AB},~\Q&rᑖ'"w/wnH +!F1{-iGxNJ;MLU3*cZngU ls^D1Up|HaCǢĤYxAI;/.}W,t<Ԇ[ 0 ![|`2EF.{*P؋"I O[WB($U)C,Dث[NK(B@݂W>Wy~S0k@cftBmT ιBcGT-S &!$cmAwE=]d"( +u.pL*+eŭ*~y>h19eH ӦTL~!cnEDSgKFi?/6*Py=ZůjnW3l.e6Ei.0tĹ{Z!RQJCJ\)N6#o2+$ܮǹOh8_.:Q`5/o{9lTQ̎9XCU2kUT;jfϖ9 +?\]Bh0d +2^Ӟv}!PoeLNF,(k7"  ;zV7 +X\b:@i'~T~*&olF³l7\}N}ҿ5J&Q#IZ)vTC+$xY2Cܭ/WMb-.*G{90%dM1-< 5,$/ cNOi+tBlNe~~*(y&t/(]ŴIPA1 v+ ܑc=m nEЁnBO*cF&sg٠ؒEqlzm6K6_ʾO_1oAoF'M@K`nn,Χ᪒$zDW_hi׼q li.Py^G* 40 +7u-j݄@m7V nE\9_r|ĪeW +dP7&QgP/qHDql`}> _ ]wÄ́/\=\QtxK'wudCN( EH2|,_\+:u0[aiPi;7hmgKy .&쉓ǦrVcۻ +@t?Przk{?:w[Gh +,?)0W'j׌޽ Q BpCHH8\I-An[A,D`ɳJG>$GfJp1KHk95uQVߤNZ''>Jc%e)+@O|˅atr1Pc쮗ۣ*7/픨s]X s1V8j:po^c,+k<|1[HؒJT@D}~I em·yf^y>$K"P! jIB1e +mɮZ' 4d%aړ/bgeGh) H7uYH@I E]c)ugGXR1Ķ@zsO&uhTX7k6(8{hp"{Xp A²6yD 'ZmтesslȊ"dpJ$Nx Ak.P|{WxSݐ}{ohHA⼳+m-Zg.> +/|P ,&r3/ZHMx+[[]0zhw{yW}GS5$ WFP @J42%{D0!i;c +y w,R$=wdٵTW{R^)qcתH^p4 +Hi#{_u 'jJ}e*S3ٰF+oy.z!юQ^x,S-z33'M ab;Lݻl{ާQ@9F"/43%va5'YNNJY)W7eBu*=jמ!f2~~7)DҔ΃lFj8R2D +G%IqQ7Nⶁb sucI&W^X́j޷JLlNi1/d6pFmehдm/1x +=&(`aebRu½ӕ=ao LV0!Iեx|!ï +YkE9uY}2Y@(OF0HW< YK"hC_ܨ^1.DfRLefb [v-NpUO-ˍٌ+x&jյ@Ue{=N [$t{I.@&U[\G^ّj\fEu1IS%eһ B`e.Q}(b3띭Ǯ@/!/@:i}m`ڟs̠p;XHI@[SsŭNӥ@$]{/Ӑ7/{(. 2 󗭃"v'~bO~r lSX " Ely8Y I,!f@MѠܑ7)('L&P  QbCYE㽕j*hXjQy,sGC~;nO VxU=T(̣3c5 +nX@f^2+c$]! RdMވ`κ<3t)E5øj4xt 윓SS>~HYJ۝},"7($ʂ?zzm%wځK!ܩ qmZzu[EStlRZ$|x!'+0C3G2)rjQq '̾.wy w45e/o yhg` T`m "2Z5'攥x"4<( G6 y\pnލb Z߽'%S] D=DXUꭋ۬רsOʝ{d^ݫ14xF&di4/59ʨR4-ڹiNH{M䎆wvui#7K = HL?11`5K^0)9:e8 _:VYlk{!rަ(7:teSQv28wV0`y.L[W7afД.rP|?CPJCweΟXs<&c@@IT%s;HPrfZUgF'X=fYJJ=GỲ~{a.Z,\*Pet2ǛC4U> endobj 3334 0 obj <> endobj 3335 0 obj <> endobj 3336 0 obj <> endobj 3337 0 obj <> endobj 3338 0 obj <> endobj 4887 0 obj <>stream +Hd͊zy8 +>sRhF^#y QG#Oç==o/ϧ;c_mӷKv|~_oo~y>}~W=|z>{O݇q~?>Ï?o+~ߒ~;%zΏx߽w;>lp?(O?{wٸ^ PZUuTGu^5P5FjFDMԤU PjVjUmFmک]uPuNNE]E5|| _#_k55|| _#_k55|| _#_k55|| _#_k5Z||-_+_kZ||-_+_kZ||-_+_kZ||-_+_ku:||_'_uu:||_'_uu:||_'_uu:||_'_uz||=_/_z||=_/_z||=_/_z||=_/_ || ߀o77 || ߀o77 || ߀o77 || ߀o77 KG#(~? +?G#(~? +?G#(~? +?G#(~? +?z $߄o77MM&|| $߄o77MM&|| $߄o77MM&|| $߄o77MM&||3,ߌo77f||3,ߌo77f||3,ߌo77f||3,ߌo77f|| "߂oȷ[--|| "߂oȷ[--|| "߂oȷ[--|| "߂oȷ[--||+*ߊoŷʷ[V||+*ߊoŷʷ[V||+*ߊoŷʷ[V||+*ߊoŷʷ[V|| &߆o÷ɷmm6|| &߆o÷ɷmm6|| &߆o÷ɷmm6|| &߆o÷ɷmm6|ۯ\t;]~~߅ww;]~~߅ww;]~~߅ww;]~~߅w߁w;;|C߁w;;|C߁w;;|C߁w;;|C߉w;;NN|'S߉w;;NN|'S߉w;;NN|'S߉w;;NN|'S ߅w]..|K ߅w]..|K ߅w]..|K ߅w]..|?|x>stream +HWk>?$xre!]6$x -:Hj%ylB{nu=!c[yι#16FH`b/mqcs׋ /\bqweE[h _V U,?}>VU*.r;m_CwľB+TÄ ֽCRdx!BXL>1D?-p~9X|fw'E.0άŪ$SK?^`}$HP?ֻqC". n EKQ{AoRF=)ekNkQDLvmsߖۘ_| NmO|Rw_ocPjr70jő*7n6E&H Wdh={SuU1 f!.i]pc5}87϶ܭ, &(SsLx`UmqW)8JT6 z˗770GLͦy@TYRvt[(W/"DVB/Fa + D``%Hf^hW2MI,XGƛBT"-U'{S7?*Iy/w%f, {Un޾#%lRc,BTT#h>1bΣTV?~U`5 +eawղ: 1 m +.d̀J'C `ԪZnʶ,u!KhpLi2N!!$M[xi*7Ps#Xe8D'F0oR $ED}EJ1Pl{::qҳczF<ݦ0q~9BGM(d,BC}hlbԉYȾ Mv8j[Q2H@&r=5IeƝH}@M7t" CpByXr֫G\d->8fě! +Wg{+ǡλ8jҜ䶫LԶ`ZLER.%: ϗT'j&|zCYHzP<{} x=; +$Ơ!wV#vC*qy`l +a<Z:TNEYf +b,eƟc"G9&v0jl`y^j#{OJľh (d% f;-o8.j[z(n 1^p3WN emT6:?GiELSį|OTFh+\Ae3|Zny>b` +:Q17,[4KbW1Ih*hk2߳BPJ<v&w 00xItߴ7%(qd/&{&xvb?r"kBXοi%ajtN]]ȔqSp a~B7~ʹЇM`N>S*Ax5܅}i}6^=3< r[^9IS1#Hcd<,D/R0#(5 ػKF'#hZ5|yPC0iH endstream endobj 3331 0 obj <>stream +0 Q@&Tf Qf汬Ԉ9҈̃ؿ1jY*vUk/^OMDȿ].b O ؋Xk%ñNKLx4 01tz8>keWENd;4ᶗЫ?B0!f:nբK&;@l""hu/ XZbF歉&NZ&4RPk.|&ͦt^-Cxkʺxֈ@f0 +.[w1"H'"F=oLoܧ;96IW!P|Ⱥ7)[%>6\t1 {ђ࣐sC% ZC\QB*o3sȆ?SN'!@+ X1-vk?/+UMJ; E8|ϥvRɏ6ޙN{w(ߏ)~h7"\R +#ޒ=}d s̄]P6tX}#W#YAE"xEŞg[^\F6L9^[0 u"4ky팚9y7- ^K$;xdEyr`qW\+gE)qށ},&]{qV)U6OAPq7-0dЩXDDGkYX"A5u]UmKnpF_,~k=NNUCBKaOx~lY +V[ѣSKm3߂ +L$N] 7_۸-uQi2~Gý;S-*bÛ +* $#v(|d"v)#Pwh6!\h +Ԇء\ftL0"?j ʐ`=.g'6c-RPGRb +t<mAÌRWp@>=zl[\Lbn)#:˸-h؎cHj';Tj{+o5J?V>S^M6 *w'MPB:bTer)A +Q<[F>ժ]}QBw^t?]s tit^Lڡ>[{XN_ClR= 7Pc<Ÿ0;tⲇ ޗ2x:^p-bV$35-r[r,j5E2#S`"!e EZ{f=@6LzU v$jrz_'-V=]djن8t+yJzT.9!/׍q@Oso$;p0s#lƿB0RB)(0z~*,umP2emEcgP/bb/T Zj\Z3j:Tѥ`icŇ{PBW9AqT]*7_[l WD0pAyՍk6=Nj сu5|#nQwZ-]5 +<ЦeIoi W̯_C*F("UDqG\.&;^&ڈ̥p_ɛD۳VbCDCڏ؈fgo7 #.Vf 6>Z۝5S/ /e:}2yydmbҫyJ92q%c+eߴaO~W꾜Sru ,6ބ<[E[H524&0M <N؞RLn,;L= g|rڟ׮WR_"rz婸7SSpQrNؾ[>(vv-w +K(hBOXWD LbMh5H%oםػ |̘B]*+Ho[1gX]ED{v&}l턃Bw- v5}x{ѡI +tQL̀.X g ?ۼ/dXQ^}Sx8DQ5SNOV6 :Ģ3 +/U{,*O4tT-]~z<-@:Df+533 +fl;ݓt n4q ŕnV+nN~7z+ĥfa2^SdtSjM8{̴ۗ}88ڏ~0,Lߙe #*tb.b+S|ڌca]߀/\_6> զ +(-+[-5ᣉa~u6CIY_ϾMK3l"ثk!8ݴ&M }ME 8/)&Ԗu?>=LL޵mpp۔f}3~ :̍a^̙: կSE 7SB$|p!(bO)~Dk1oD {8-!,|Z*J&5IcHo*j 6aML=(R# +ha'Y} &w2?Sٺ {gM<=S JQ٪HQ3ѵnٜӕ {F5VRnKjJCsbzZzܜ·V#K }Yh<߾Aq\ݮt$ݺȑ |vnI=ϲoz ||Y*yJF +n,.{4gx-4 E7jMT(;;fqNuܯ΍iq3W}c4h愄mF)/(L"# ,(s m>v1mj6_wh}Z.bvDUvD k%,N +]΋P%KF?>=l)uKnuDr-q-V.zi/K8.%N[&;M)D +[0|d>Z'+N`:#`ri ~MUv&3 sjbzud]F{)W.dda5D 9IwlXU|K|q?`i#YBR%幗4c'v㢂#=k3nyY&2: L9VRx@~X٣UAIJQ1-k*'qcIT~DOAgPۂn@'%Ll, 9S/D{Y2= X0M&%grZ"GJccR`qdZh`8H3Dw.oެ\;4Դ)x|d@4`SOxj+3ﳦ&c:IcdDqBb@_5 coDk*,P +:}# 5rZX{ɛ[nz[e>1wF.5oG?7^$`@<E#j&JXO +MQ0(m&=(\^/LyϋY[p:NژJM-3y +d{ڠJSosDwPE]J׶Cr0Ì(W3'aӜb)BBwR CN|7m2d&'*8 1Q,S,#7Of{ډU 5(|7!DoI=f>5 m3:yBTM;ߢ<T3I(3h[;b8._dYYb-V[~41,LME|.q;Bb{I^KWhY +r\\t]=K`@4?Sڣ%ԱXw8%J҂wO.1AI^I/eJ +;X~C'NcSJv:1)rbSss f?&%FB ]d9E wۛ+i<Ɔ˛\M狡12 H{H!sh) -W"WLp\㻕oRFZ dđ\?pATvz̓z<!TvDN !eGI5~}dxݓFf؉psk}sٔhXbM9C} r@ KYbWB|1X}?76 [PzT"vu67堧 6 jb F9j5ȸTjXpes qZ~}@;ˀ447 2'G>Ye؃׺,z<(r;Zvcʤ{G5zZ_.{y(nk2![=S(2\Ŵ +7{5+" )5]5Lџc>"W3"vt;{skEeE."#hJN;FPA*-D_YHU LVڟ5RW +DPxN%t{#~A=zC/c1J-q'B:B sUz_/HWT>:S}8S'wZ|rpLX.<y!o0KGF& e9o΀ + Fp¾Z&6r +z_ S0O&d1 +Q`x!}DQ;1 .EdmT($4,T~_B-˕܉ ]";%*hV =ETT:,Vd䏲3Fyȶn@X v,vr %HX^E6.a-yD•6I~Bj5oЁj +obElכve1Yt|2ޔªƈʨ$IJ͵_ Iz*ws@k2 +C^qB(t0?f8֗ X7,ϥPGf]:|E<-^9IF盈+%e_as hsұ|#Շ1VN&3X2TNW:6vr;MFxoe9)@QM_fRI @Wmk stJZ֪I]-A1߽; qz'6#y*:Eޏ!}Lgf!FBb!!6myf eP8Fg_-uBѥFHZR(c a{㕫r|55f̯PyP;=*K.o1wf kb]PVz~.>׳iO} (YKǥ9!1'”73@ůSNkTyxf} +zN&3f̜}HCM;gqJ3AC8,2p૳3E5$Ma)' + +.!D<mEz:B7wSj7> _ #Κ\"??pnl~u'tfhgO;;M0j%ыQ@6}(2qn驤"}nhl-q=ݎb!ggxyL1}p ;[5Ba:b AD + .zam-kd[!5kB_3IjF`[b`>{"],G#P_7)ch2(d0QO`Be":m}l\@a Ѥa_Bg`өF,7G#.ȪNx{NLy i9'D`Zd>Q7i$((^4?n_J&?`u|st +N%ز15qEuz*'{mYd0`W[%LkU 5C~ʊg$6ZԣzP҈~q"E:ab4MDW)+c[]enV#x T`ţZ.>N.VWKڦΐ'mGid,ѝ4.1/`JZ1kT^!4Rӌv[9x<1{{P2>)0uxdg=:鶅BhpXeb 0+?nC`a9ׂE9Zr'| #sCCV+;&+Rw* 3hӃjpRNۭ~ b;?:~a+#Ѩԭq+!CKƘ=bmr}w-9k7E#Urɩ0rp_yȣ'%-p+tTzASHQLpmF8VKXs?Lb8eGA4+c ,% *N[J@OF^0 d#nt1 sPħg2g>߽$7R ܰolTUM2vIb _J3B *s)DZ1wDZ7YE/{p\`Zr=jlX{݃XCi\~)(!Ť(r*a7CgRpc4l%0e~4 K] 1e#X$帰tvc$z,f-PjK6Bm u/=x"7l76\UzXqPXU}(ycn,׻Vp*=V"p{ 2XȖ5!G!SlϾ۞ҤhM>7ᡨ|0 +CHN/?J Vj9L+^UHJ9kb IǓy)>өWD -_5iƄp/G%@q;cPG1G| _PX&YĪMٞ ~3eQ롭o'WtY2p#>Eˑp i0NM ZIC\t0VH 7} bM/\RR[y2;1k'6bk{S!!; t;"{+ʳjH4!G=oJ:_3MډODqK>MX;X uƚ%jpBDeƏmd!ϴZ18F᜶t+^m_Y8 PM+t5xŵvɚwyx>{ wS0i,eGxR6b͎\mh^R9m+3|ZԈ=-% &"zI˦Y6p!$h+ՠW%jɺMHEW+FbD2gG?V/-o]B 4`CR:7)cDOZ,~:}8`RitlgiS^rIO ğ7S2*#qu/\PBai%l9|wOk9&EGfCkLs2jY&,Wn^W/`r'-j#*;K#1Gvѹ&Vv9h%x|OMRRBow`K'Ԇ֚ﰼ%6mkڮ{IhI9/\9փYCZh3>Z"`Q"]p +#TBuXx4:͆dZ`/fb7/#e"9)$|ZG%tnhd3сqGL EԷ(+𽆤(' 2.D$q ̊ljiQ ag̷=NX#fp`@Y8F@, b5L@b<4rÝ3];M)PwG,ļWP8sp\Hr4UL`pyR_+@*1荱!wJ@`Y 1CU c}9-9*MHB̪D1Kb3JS|z%jjy29o3bTEF3@YjnB(k?Fth`g,ZȹhH DrF_vdkl8#:ɎaF"A8i)[_Jqjk{RdHĕ1exf0#Zczxg'T@ыG;)p>M[̠NEn%,Ӓw_t:h~V0 ; ٵ5~fw<q4gI/#EցݎKkJvB"Fy!b𢜔*!*\"3c^*`CFgy*̋e;s.R~n0Q2-U)s !k*ςgOd(`JVH0J/6P!9 c[ +7XmLJcE + lv-1gY;FZ0jӦ⬶aԐjzג^Ewq3>9B_bÆcȅ2dwsSJ 8Vd!n " H)eIx1y`2)1E + +i}ڝxgh;ҒJcUT"J6.`z2TLy%ϩ#.{e4RߢʯK~@WpДVȜ#3+ =ƟD39d. 3H4ys? VnYy08HAªD2SdӶR1[YU$3q(T!ibD3 Ռ#A!@A״ roaqwxFxQʆyP"u+#}dּELe,n0Uї;|Aoi=6SKcylu0#AKIvP7 褐"v<=VW/@.~쇭#KjZOJul&"n.[8\-$W[*R'bCg8ȉO-ʿrEFtmd]gaÌTԑD4R[|^ћ6`\--&p0pʿy-Z֢t ׌mKP+zV .{_ +=o~yN R_/mw;bksUCg2Var&Q>PR\l^J-eY2$ SDٓ[y,#b(ߞ{cM(XN($`imOHop@'&5#v2Tx+nVW:fo' +i'qKeP9[SP?vxI Xd+r׵|::[U9n=~$-WK'k)<t}W;48XA=2l>_AΒw@bC̛ >0-)hT:.=/W*䠳\}`'w"\ua0XeL ; aC֕(:&ll%1M\ig4{,`',^%̜ٱ/P) U$g7+{Mܝq-k"]{q.Kg]N@o b%jctpiWdC 4CôqL5LrщG;yЙ~{GH/Ё (~fC^ +uwr-~]I#-LBoZ XguHW&b>V7?A!OdOT~I_ k^;K|˜MFΗ5.$z~RNJX=ZO r^vT5S+wi>Z.LSf;z :'Rߏp ,":0= Q!kiJ=BPCmZ5!.(Ȇ?&%Mj0UXV>o'Ml*I- +b [R 6J))Znܝѐx< fPP1XO_d#QkupM;&?n7n4M@g-1bDtG dC1߰-.#^Xvҳ(r{vhു% ?l3{B)V5O&FNm"MBz'z%kSg|\OguLm*L/'9j0C蝊&|NŜa2JYGR.\>R+'cxe|\˙ `x]>"DF<h\[GwzIcEG*4N&ƨzr:vDitTͲb|?Zp$(HX!#q]qe@o{MvG!ZhgLY.gG}ˉP=F|-ȖxS=" =,{[*H!LBȑJ, ֊lvy d0#imȞpܟG[0J%ϲO|r#KaPˢ6V]׮v=em`lf/wr]ך邝S:2t'cu- +vH +2"S;aA{ s80hav&+9*Lq$Nk4̧$B؊"E}mjcʩh%P0w3Z&${"aЄ +TV#d%.9 h,FT²z~ +E=T&23!p< V54LJfMuG")-\Y +Tp/ufd{ YRu6\:/e}wj"e?};4LHt)A` Od2L]HhVBxbpFrzHv21O`_yceF[qn8Yz֫ e!=ϴ, _ ]Xwz(mT.78Zk;ԑZѿqߺ9{&ZiNN;ﶳe0I.* .V<[RX@ܯu:RI-ʐ %1?WSlH{Ty" m%GQz_d6p_(&3 4A0B=챝V?@PAYg{'@$i#3 $ $)T<(K^@giyH蚂"S#Qc46hYoA|rqQ&WE` +Ӈ:yf)/TőH0uf e.2+nYy7+88 ʂT0’pJpjIJnEt8Z+S3<;O cuN$ dSJ]q7h O?/ +V֩D<Mb,*]Ra`4N$KvaXh.VnR6pٺcHߐ{q}M˘py|ZpbNr5`/6ׄ\-1#eeo5Հk5߄BsaDWjA]-ֶzdnPz( lYOu].=MX|[j^`Y-`j'a-WeJS7==RY*Q5(+9hwaAz)T+Qev9 Aﺉn%5$>Sn &7 \#uh|iؿs/Z|_r,p;xRpVBd%Y"!]͔jI)?] řAyff(e=I\>Nl2ⵎ+Џ;\jϩ#j#IQx6uw:" <jh]H%l%8)bܺ#Q-f- I|1SD{{ wW-d +Bu9 z(p~$ܻ]r)+;2 +*1eWAƼ0Q-YUlx +iOt>((U!*ZD +Y OJ=;|frkjHܱ֨ڨ O4Mp;z6sAf7teB#WUÊ*/-lE6uV]CaRC:J= -ՉgzӰOG;;K}D?SlTfi5oZ[ +Q,DCx +TsX64Ϥ1OyFVBuߒUhߢ6bMKF+'ڥL͚"XnV\OO[`9^Jfx4DhI>-JRlwQ#%lbh{fa#T+DӤ˃^]Hqj|ѭhK ~y5l<xܛ'~ ?^tKC`ύ)6&Nx_7uqc<`^< ml}#3Uٶm%T2|cy''-4' @u1D$pPza|4 yef%xlѵ+KZl-.2+glkCxoPldHV}oxħϽdyG3{c*nC؇Pg+keQ@/H:L#FDzy2q 0~ N?+M-F.k0FZ86Xm?4n[u+tA'l*%%p éمlx>0MQY|fèxʼnnmBjn/M>.[@nvv!\%m?8?ЌFծXG ̓ Ն=t |>: V-ӽK>}tƞhZfp( ܤ*&kPdv"@l,q}P.bd=oƸNBI3΄`hW:btv^k\'~KUuH=33 u=U_,WՍTWA B]V EE{0ZtwZbi/uvGs u̾q+<{_Qw\L1 ?!bWvfOo;%[O_>-vK4=%^WOug@$CMsǑ8kw6ݐ#*@*y@!1D1%^ sj`:W 8|$ +:?aQG^'@:~9yV'5LO X(RcBM +N?g%9BwYUu q_5-}Xc +]Ty蔭R2(sޚYҽF(RS+\Iw^2p)L\Lv37RO3yYN䮹Rhe(O1;eͣG3;J0V. Ѷ Ӛ;?bco3LhY\F"wEr(q66ze+qdiy|g`V#C6f})e~Ԣ؀{"ZUvyXs} ,2f +Ry*Co7[l4K:D0i1NBB*@t`Dqe|$I8!hzOSù+_37F×L`1{ aR^% ,~/D;8Q Yރ.;0Z(r)6 N%gjrb\bP:\\uհlaeٓF=a.HL {D,`75B0es; T, &F (^ICRNwTB^bd io[՟ڙh-#FԒq%@a,l)& PrjlM$u[{ރ >nYq a xִRпn x$5Ԉ0J);<ʾQJp}5}R7NxУ 5l\@]j ߣ]vj진c?>iK_wn(q.\3Be$kjvn0²6rOfo,^Un^7#lU- |:o`w~1`2#|Ie\@xt a: (RCm#)<~KM\ )Sw>z+ '}CZ] 9~'qP q`anQ6FB; u³QNTP/g$KM4uz# O 7q'dRl>!-> t\Dq19-TnjZ$QL@}kckb![F VGx"\%FT~ /=\AW,<iʲ POǝkkX<9zF^hko@((whJt~G +J蓽<04c9B5?Wj h\A{zEƗI)SZ5p#UPi@/lM\AX{$ ] >ܟ=$3\-GF>j#fˀk ,\Qɦ2hBޏ-s endstream endobj 3326 0 obj <> endobj 3327 0 obj <> endobj 3328 0 obj <> endobj 3329 0 obj <> endobj 3330 0 obj <> endobj 3317 0 obj <>stream +HWnF}W1/iZl@PtBUJ\,ٹ33a' ugWlr>#dF*͊e&39K@gBp$L6{U옰fLk0FDF|Tkgg&j@[BwAR`϶. CXg|36&9,38s^&{^>ՇWf]|Q&|4WHL`rK} +Q8݂myʝH(¯ۂ`"nh)_P4u0mpDgyvwH Mcן7$By|]W%p QH@bYo  v/G,JjN^a54D WaL ӱ`XzpJ&@/*"QU)Őe,Q#>stream +0 H@&% HB=uK>td-[J+D$ +sPGGܚ2D 1$Bǫq )eV ҆PKg}rBlv.0cVZ&.?L'PV:d9:Hz>|+ =]amS_Hb >?J06Zc2+xRW_Hv"q +DkMaϠI+!"6l9)<Wվ +9ݞp 1VZ_1zi=$S&n ;|1 ok2,,+ +ªIs\:GF7^PI 6kDJaA@)y<{XlV<Rtg-!-]-U C[q<*=gFk'bl"łMn~Eي4]NhU^qqm8 0T\w8ڡ+%͍Ҷ6& 'L_o4WMyg'UW(%oNkF +rL Ii )>3H4./xp VY!Ny +X=]Pޘ/(u!hwJ:L"&c|@$6|]9sJ p\!@[9XV?%" +LVZ +x#n2 }H L iߋTܧ|. @ DߞaYqiWL$" PZji=r̗ѡ,o0 +.sK d沭ǁS#QT.YY/B| ܫE!Y{D~~D!NZ`7˂|)x-Wa ?6"H3K)HwD9{kt*Ь8rMU0J $+BHȞDo_y>Nt,l$#SszXӸr)FfvLs(ymjԂ + z'Z LE-eMZ].WZДF|y0Aq7`UxyD{D՞ 'LY/l4{O:ڗe,&s-9J,/ 9̉@`J,O@ѡͲY_,P>L%7ԘQ_kYI|{txţ>/ Ô(Eǘ|0I">\(v6\B$ƨycc5* j=V 9)io2"s +3qWR,e*pc|{ƚW(Cc-vH#:<$hʳYٓI9^C#*3 U/;WD( |.BCsWc?~r xeN~K.GG4 (lŽBFٱ ܥ-d y캏w'Un-d(fי!uĤ?Aupry])ت:JexՈQ#1- qTi0 +n9No.,+@F%U?T@I Hx1.n!ՃcBtbF*{ Goh"z %p| + +㡕FVk`Q- +s0-0~FtprCсd>zK.v+׉;;`k@NgR1> +Ϳ݂3x IhNӃyGQ'P3XD'7{^B$+R9 ve.#?rTGsV5CE[gr +3soo\;تm0!-)O޶2mt7]PjOIu-C 䘼~sr?QD5~?YZ Ǖ G]آvd;n%u` &tKCKT7P.Qz+?r״DHC;)Xvc:5rŮ: +K]~liΕIo,8y){.[&[.NyK&q0gBZ!8쿨f&!2FXy 7xLZ +Jl~c[/#{r>Ci FErփg1ῦ6OvV(f`jt\qA=wڔSG>}t|XJP`T(sNI雝c>q19NīvcjvB3|l WTIu %͸&]PW1R$e%5-= ~ozm`퉌-(wiݑtx8? B55нvM x6 ]$H ̼fwˁpDX]޶L@ jY; !AoNs6}LyaIRX)~]*gy}9L.<5*}z?t,گnJ)j|/?̀N| + CROhVtT]o&Ƌ&|L.`0fJ7,r9yi^Uw kbOJ%({9OD财3}kΔ#䫤?S*=5vt*ASu ]XUP'1h\({amD{:+W8U*wC@)$ +¶WwaQW~e{+VEΤaL2LWOJx6ӣS+77wrluqB>sϧr#nٙͦ?k +EO>7b_[Ot $rDHAŮu;\z~nOHٳVqUgVDS{@]&oD~4%b7EQ&Xr&(x<'RLiV#bq.RxZ*@CB@@iv}@ί;ŅŊXadS7 z\lJYeڱm'@pb͆Q3/_k=*,{"+%@ "m:@r;~pU;= r8e=?O^wuwi +LȠxɕoeXe֫2 !֔l:#֜ m(M4O3١A*:N³Qtl$gcb-ӝ6C`jo\ۦ\v6Gy!HXf>뭊#:xTL.dMFd-ٕHIv\YΙK{n\cX7- CPܭ™u{nq[)ZۮAt#?|2*hC,BXuaS7#pNi0:=}2hE6MFnE)$CoR +{ 2n5Y >2+&!@sQb,?7]8ȩ`˶kw+Umvb,Ӥgv+WT +F/A'X-E&gTÏkCe!##;kaLfO75@z}w=~[X<~,\&$tWvV0ie&ާbiAp@IΗp'C0-w%N4e V/Ϣ`C +N1Djv}b5'"?@rwXėx7MM&8#-/AfZ>lBѵc:wW3N .9 V3 H@O D.,|\xA*N'vЫgQdb0&*& +b2dzteG(F~2%R)kca"׺wVBx9T<,[hYC m$ȊIhHSo^krTMi"F%I?sK[ fFq0ԿDwƫjm*[8R1G?9U +lUc}H@r^b09Yv*) j'PYc0ʟx5ƝD2xLG!@.qN +Sv5kz9 t;ƩqQxp\Wv=*8 \+ tEѻ(Y@/DΕK`> dC4 .v@%;^(5L\s({bl3E ,ոmY + OdIT.- r2e@0P۫NyMGntu[sH P:@jePtŖ8IvoN* +#3_2km3&g /V fu4Fz\0?_ኧ}ivUΥbX.}%wk=ޮJ3$5EaFH T5?%&&a-"RBtc&?DôXѢPGyׯ +W7z&ͪX<J}X+q.-2lE"PCģ'MA>7{`{_BK6sn:h:}̡JF35ow뢣^Ad~s1&g+<;-9#[@*kasTNt%>8 hn>W*oOŔW}J; r#a_r ]ouB99;e[ƐIbhw~ e +x6HwRfQwb*B'#Axj+5ik҃跼AV1`mgnW3zzn%ZOF,H 7ch0?[~{l s!Q/ΆaN B Ð}(@t*5~8:2i8120q#.%h:`b?jQ(]fci_n[6Ղ-Cg3~Aj^TJ/,/]Fɫ7ݠQѿ/ҍ/NpMqCL^v@=7ƣ7V,TSnu [옏/Dd[l2AL+g",횚S9ڨ l[ <1R!(uho$ye&gťK2CczR@`8(b1ڜ|>q6sQ_o2㞬qU<ϰ؏aʶnπUJT|}%C<(؝$L=)g·]lNOo1gH"M+0ʞ#(p0r7B9]uGO>oʀd#'%aWA4{iAA>n"RtpJ7V-akߙiC7<\Sާc(}BFFzFM]s#̍z[w,>OMRe(;]"5'tȌU  @^##'Ƈ0xخٞ;5EFzԾn<2.f}0>Ҽ),fzn;EV>&E6`$1/U\ݻ[:$r |uXJ 0ꈄ 2$}6~r޳t~وI[7&w&IJ6gѫ|⯏!D 8G8NF5>eyL0jѲdw72sF(ɖ6xq3Pj-- a19V_ ~w~$wIHG9ftr:4)dG2{e<邐ck{C|zuOcU4k\k!Wy) +cyx;UhoJ\1۬k@g,)o+nm5[=~ЄgǞA;ܮ'YdmJ. wQ ozE2 ŷ˲{`HW#ZjKdv>2P Evd"yΛ8;ϨQ*Xiך1:,v,$t +)K3EL20H Qљ!/ܹ, F_Mt#')EBN*; i]Y"ζctX6rW%A ^>WN>U RZ? JS֯j ZudN|>d:@y_v,|Фקm%f+([/<֮b+G†Ģ+@0A+oLnai0Σ%he^a@=;b&H1zrh6T4LPB:j3CXL> ( &rKOK:Q 9@x/X.n*'i>cP6( TmU6nm1O@EP7#!>s`.a?!7Gc\/B 'LpJDqhO_=4FTH/F)8WyԨ*&4ɤ 5x%₤,v>^`S@8!MXj#29omxSч6&Ȉ8R5LCvfj[9*%-Vw k1Ybắy"gDE:R0PUS5#'a2L% f?޿ٗO\D_l_[6y0z6<;cĬ"ES#5#>y-|wτ~ƣZrėUq4i}{:11Wt֍Xǖཹ(zƵW +_*iża47 K]E~JehkN>'7 ޝ֝ vgԯR_m>DKn#c .M;F(LxZզ7: +yWI#Ԁ.& ln#_3j 8ްミc21Lu:Ŝ%D,5iJ.Mo^3i!j q.'fu ᲼`YEFl)+?fY5~qgkпxļ,]ryK"P\R"t}6sv}Mt/ +YYrqn)S( k-M" ]}*mY Avb|Sϡ%.r^h]Z}(bxNKv-O%4 ѹY?ErqE^K+2}~p(Pr:P387i X$]]ɆP3lEM $P>εxL5^Ls~[d! M*SӒQO4'dn/OQ%ɽ03BzE0ѐǎL}̨>a _VMp'Fi'qz`)>Agq(6cQ1~Z3"p)257>̇2[W ބ 퀉z8Kظ](@+ Tmz`D(c{w>|ʫgЅAЃ%aŚTW5Eːwx)l*f`c2paΤ\0 A"Zj^F+m]F;~ ^\j$aȼcrcV>Ej4;> endobj 3319 0 obj <> endobj 3320 0 obj <> endobj 3321 0 obj <> endobj 3322 0 obj <> endobj 3323 0 obj <> endobj 3312 0 obj <>stream +HtQKO@W 3PとƣiJQ,KSjd5|f$"&gPW*m6wC6 _g"_@:1Ɂϛz>O<)#*0*\o^MpъOV8D E砤#QFէ4mSv%?*[\T/G]d:Ag6C*)"Mvkj`"s. ,}> +ӓ/eNR$ܶ,uTuYu>stream +0 @@&}* @F#<'Xt;@C> .BRfwB^ nVe@pj5˒4ׂ0<5?Bs,z_.M'oxꏞ^qC![uݺlY^OsffhՓ_:X0 +.vGr6$˯x~i25}!ZSֶ_C6as/~iU=6) @.9Ö +?2_uB"1Ei4cs N]~_ϜW"Ng17DɷlUAqp9B3J: +ybѠmc8;Զ+PPnt% saO" A1|_jҩyъ`U^鄋n .".]Mɂrgw +d ,R=9/u]?0$NBE +k΍GAl6pĀG? 1+dJ,k@HEcm%A*[az +CE p:]SMǥ‘b2QJxċwTq9n*?mn_oZ#5< +c +珺8-T,O̚?{n{M<[d4^;+FH_eOfT65 !pm@A,w$//TnԠ2 +u},IruNoNmY\u`|E9hL'3!8mG݋Wi/)\WצH9wf'M9?juI^&Ӡt`QjOWiJu-u:P)4A%?m9KZkj_a=,{ tAڰ`hDQ)2D5ڙ]d]5JS?'SRZ`F,4H4:@rj«n_8Ú 8^(d@4QwXׇiIO7JZk7Ko´οטPZNZ:zL*$ +87DJPFsDEsgfÙx-pVI̎6Wq|5O,fe\VEɌk3\K]lOʿ7Ƿ^Sb0Fn8 3f1g]_FBDj-՝TBp_[ _PsCHO1HKaH4AxT5;yB93^; R~M?3_hk%0ņ6%l'e3'뭩ް\{y";p3yۃiz1|-='ߧPTqk;,б(}4[w i6wHKXH쩒*ש)+?3lfCY}r}V$%mqԮ=t"o-(Ha!E,S-Ix3'[_[ŧm'V(67Γ[2ն@6äX*X(ŀkrww+:߿7*~&.3{x:t>˧F$q 2p- q%y0WA-^_IM݋WnP[d +ӗvP׭iJx&D9=?᩺tj +M]a2t)mW6=J 0R+&Ig +:O0|. ܾ9C]$+*Q bM$<ϱc;i8K4Q]kϦ*O ee@9#Ŭ+4X0P ^hŌv |_, պZYtj^{ +Bt*B. 5zޒcΥpl=hp숼kf 7lcȏvȮY2A MutB_[)_ʰ97 N$<f$?Cx>ppMQKX%ͪ`4@0^ ȼk T_?k!/d`0c ڸ24M ŝ?:C:/r/aLSy UF::x4#G]MGC #^s?=w"KXkg.ۈ/, ryPgJ՛%yUUpQL$|-xI;?  Kb,.U/~.IHh'S<74߼?ƔKS~'IC <ɧ(?;ôk:cCF\`R\xl)7'ieA@kx%X[Cv@Ə.\<#W ]/iRE$ J idbPLn#XZ@''8IxM;'^fL|dCϴwP3/QWN3f,s* >:A>?K5\:~~B_Zȹn dެ -hNK&Rkpԝ{QJ;r_uD_,caxq +Ya 'dH(<uM$FoYY_\4" +H7n#_zG-3fuk o{aWmre25I/PrA|4]3TzRR>hr&_΍or 6YVV+cz#[AxG7wrֻ0;>φ)W1˫SҶ!7)]Lwv&Ƒx }oB6 +id!,)lU[)05IR\)[ +)@ +"o-$:p1!Cߔtu Zuܐbָ}" a 3Ioޥx$10T<i9/CibgB8g[=&?Kp'VsrLBme5MFj.QӅk3/|ﲌաd{m—Z(6W+b_YudKs-ܑ6|QpuR)K0G\t#6R#} z`ōc͐|rg o̓q#Q0 py]ګyDm)X #>:@'D +$|ħ4i +;0*@{2m!ine,pi.gqbRtHԽ.B`#UIGuɼo1ʻ=$YY%kYڙ\~ I=e/`B F/oՓ~1U˟e?q`NğM"&blɈHr695q׿70,{˟s @=~Rz(6>*qNJOQ"@ECe%y5ZQz;Y=Ý2ڟ02e u͐Q~[y%X'!/bY9ʐڙqqXr.$>;~4R crO\䦣D/?g|b Aa)b|'od%o Bf> --*P1A+ZFFazpb|zA7M'4OBBFli`plcKo ;Ѣ5:fzOxuWB_j<  +=|=+ eaXbF(!Y!_֢>XJ0@ Շn cT@vq]P/Vە7}Ѵ[tzeϲ,̓+D/۫BئXdy]] QY|"q 廂_{eb&0CR{oy@skTV򿞸}pyUN/I@@voXq?qj$a$9)هjzPPXw,F"+q%77 yt~tJ$JZJ.^zq(g'R*ܙt-26ӵA'tfiX +l3v y$KR^pbw^i_[Ŀt?@+ؚCwϫ@;lk1r_Jܢb *]Q$bn%ʊqP}Y%ݿ #nׂpqPƉYC:z4/ U ?΀:~k][n9))1P^UHA- LH.V^K#q/pW$6(bBSFL#-hҜ=kq/NMOc8; b] 3ѡv#itK_?" +,WTbHNx5gռ?qutElKMm#|iXbѭ'0ZNn97.KMSӤ́/՗ۊlӢ3=` yCzOY>ҥd^jh@=3LJ +a IN+^nAzPk.o#Nނ5yvcd*Sd-v#"smKU;Kiqx3*BU=cT A~{kqW}ّlwЗy2[kQ{h&m+T/Lǵm9'I'* 8, #O]*(}܈_,߱p202}UʨʬcLV: mFr\\Z&M3ؘ +F@cKm~ 訒o=i}~dB; puK_?&DxB BՒbټײYE27%c -%`0*J`k4oSm =qt )9)0(ժMJ8!|VTgHs:%g̤!CN YW`pשv*cxҫwWt._G:h`kup!eFu dB5v`>4CHS.eV 2?8vfG݆x?~+Ԅk]HcZ>S(Li %뗩sʶ:dg^=?_jЖxv.F۴PUϣC'2HL9oMH{FvhK=-cgqZjΡKiGX9YXNok@%23ZEpy=Ò1hKz;S񉆘xZD&7pi Lݜ+y|aޑ!/5C).OhwpB˫7)tpV/C~]ChUŗ-V;ٜ\hjIx v n= W3BO_XΦ;^ Pt N>8(x_, `B>{%oaiUO%aGLrmT6}{6JW%ei5s4=1Nц9PX{7_V8]JUHKTpN:ᑯk/Z*e܈3_dazp'V줐Mj42W4l\`v-b5"}5X ݩ &sv1L܃ Br|[c,*'Ű3IW<6ĞE_)( no8k] 2jO8u!`I N{FЫWu(Bܗ7.g~ Y0A_::0HH+gv죽IӍͣr)Q Ks9 !/X?@=}KB,` 'QÀA7!u,f8`zpvG_s^o}GxTɪ-5EڏkQMlcv3 t}S'H2@6_C)b Qx7nT^h" +vSܓ=|4+IN2Xn* eJҝG}7H1Cqum`ЭԭVc*6Wu{R¢!Aee7P> `d]@F"7.ƏBh%ĸdGz%'umr]j#\MsP/E n<'Px/Gܝx:>7 Ҍwjcޡ_5 o0n)3I` \&_T,C x{\N(-_^ +2u\x*ȅyrLSM˝t:}ժMN,*_{j =GGIN .Y?i'F5)度N#/貜>&c +\jdI&ӱ@u+*Cѵd}i^8{#A vZ S)qDZωY/{Rm!H؋ 8{:ؠ?N[WdI$nElfc?M\pefsiv6YlIYw ? mncX"}C-WxBa U}zYp<9f{sqQĩ/h j)̮'t{k8t[lS[M3\V<) 8 z\벲YMO_O4]ff73&C,LcEwN\dh\"?WA(д v?X*KP EZ +D0{sZnEhzM& +G׀ʕ&;|LILRg.vr~G+BEl 3{kDUpj#3wAmOP2Ӏ붤~[d0 ޴Fq;N;3R`u4!_R@/.IL,?2d-E>jϕ?5E +bwuN%y:SΆ:5C3{`:\ޏ^>]QcߌqTu!$r]:Zcd*\oܿH%W}D.豢 =9~=-Bb.l' r|p,nV 8%') m3G=w0 }:P~ωR8>}`+15G2 owDn\WGsY# l"3Cﰃ6Wآ0m̐;L/ ADrAG2iQW`4O3^xTX&IlAZsFK>3}X5)WD5w_+]__&ZF֙漢Ntjb]FM?_ g2z"j;kA$WU:&q*9˕V6N} B]NWȶ9W'Q1^KBnc&λ~ڝ ;ge)w,\LFЗk .wP!\ x G0ie%gJeiW} Rim?t͒`W̙F*듾Q(򡘝zL:HV&Sm@@Y)e g @Ն/NšM"5e}̂*MidmvvxysrOݰ\C}o$bhtL]Hpgbi_vmV诺`y6mA~!u& + s̳.Fǚ窯qegAnF$\̆O[yETS8z1f-0q9'Rke|exyc߰dф{BBus0V)7?BXEk[wJIU%qFݟ+!c'OҺ@LoJMa{`!h5# 5B_Sw; +E MV ض1m4ߒ +5\fhb&V0'⯁g*1foH(gmFzzSW2n]{"k 'n0tμ& Įu TXwc3gD s-u<}AVA]c'oEZ% cET'‰u^$iu]Շqf`+AAꚴ@i< +Tҩ/zm/IB$UYE42ˤyHk6F^p%Ҩo" 0kDh@.moԺƳEj'2oWoQ+$v]1:!c iqAN#ZUt)>bTQkZz-aݰFڶ7miW+٪oGY\k]l'&c?o#^I(c˟R0!l:*BNdAɛaH؀?9p){^ްk]p`*2y +Be${d&['J'  } v rSV?Mnj +iuwǟ{ e\r. +vFm +:6xqGl^Tx͘UGր֩tGfF.8mt<"}M7. S(Umupž[:%OEcpR\eiU#N6oD#"N#%159 zooֺ2 X(&:;8˵z`JDWqɞI//AromO2}  j19F yldCu&w綔jS(٪6\<7}>oEלJs!/6BaDPtwM`7Boia 7#$$B"󏞱!c sS_MG,$ v&Hl8I׸K 7U(9Z*0q1'lYn  +d872>! G@~6;B +_]0Y->TB~BLn`j#gnETtYu2k]/Ma}xe_uɢR/.XkU}K~hDGM+?: ~^@3t+qs{,;p󸿤Jii\# 8 a>Qy~t5Rww$d:S'?nȐP*n*)0H"_l.+2H7zP ɲz*m·=WkآX~^ׂ+k#3O $Ua o(HXXvV _JdO[1ZZ[N&=~9rA&4rY!3.uгj?~?lCAAX>qS⮋{D8)-%Lׅ/y.J43.&8loMfJ~qgnvVzkEoI~0XL]7m6b6c _p5O8dS6wҖ{M Y?I +>.VFqOTyrrڶ <_ %~Z4a!%3HRzNUkƽȑ(oBᰌ+mEQgyV r VAsY:#]_%O~1}V/)_YE^\%m3l_G&!CGX@zN$n4!vW?WQpF_i@D?@!k;z`ɅoSS@nͰܺS/Gn`IIr>ϨJ#8w??}s8ِGfeI-u9ȝS\#=vTp"vCFp._2*ʹx@AgRc{3;$BJ6nځH4PaAf$kdaGmYQK [|2+̓X#w*o4RmKA;N:ryr/stx*\mzZM]Fl@w0d1ZȬi Йd]G7S&|KrKϭMq+SU%˖yX)iG㚿W?A6PrP.={1:[^:DXq]i%Pkn\U'^SL7 $Fq{buVCaU{z8_J-t$:o+Nc[5*nsz>BL4M_osoآMoUnP[n{_Ly5?Zi,6@h4rM9m@|6bQ,D'٘vPG-ȧiudpQ2ɨ~r.ld -Ze ?r׊{ h%s?H#`" B<"/D<V,7x7ln +O>D/t2Ig,sqdu1- T(Dj4cZxw0\1K,3UC8䀅75 \\1.H*=K/amk[B 0/o-??M'˜\~q ׯ,U͉7GgMpdMmN0mT,2;1Ԏ #GmZ3<ji?v|$rER&o-2#٤4 9NW2Iيk&[kKl/Y]'^e""Gr(\RQ?~vI]ZJ3Fnԁc^[Ÿ؏K? bflD֊9|V>wm)?ǀց!z14 q!^́t\$ +G-j1HT&:ÞV!&kH,#SIX5&Jx8Lu3@ L}713)|q'?P0@tQ]` Z#{AtͲͨR?L:t3m.PMXyꁾVV9w?nxT@LPA>)FSn+b}"lCVG^LPa92wUOXs;x&Bv5[K*-}8_VN'r%>,\[eY5u;&md| ߐXU`3rYvUHY*!Lj^R'bڡ@F1:"T9AȽgo7ZY[On ͌O>yt۬%{n2V0BDg %\ϒt[wf-mŷc|CmP|b$2.iV,Q|7̓bj/p9/l4tNR?c_g;⻮*^bo v'k"]?i +iԚMFt+{y8ƠGHE,sxC`MB%!*.?Y wkգxqSp аVoH0%VsJ/$/ hԚO>'P:wQfߠ,gƜz֤k9m[^œ myF~Q>$xUCL`a.13 ;[1 5o=wr6gHR7f6 > &W& 8kgOaϤU@zN+b1VgN 0v|Ӽ#%LNDۘ9b}>[0禽)ԟ=;%P7[MPI8uh;}$b0;?GػK3~%4H#͹6D%B)-2neu +WY!U2b`748і [P:'0?5#niK&:#sW4{+2Fԃ5W0y{3&ůh!_wݣe#1AB5pk ]vX_< +zi<ׅhԅbG0fQG!6m~Wms neV9oMHd[ryL+ܿ܌Uckےo൴zI1=AA1#W#2s$]JpbvL;9y+K%lGV\^ sհuQ2cJ_? z@Xپ sƳ™o_Y7 D +b+%Ҁs&wx3§yzj`x23`: i`qCƝIԂmMS??QˠJTvW56,Zn}yys?bfx};E֣sX 4fñh>O&D'4|Ʌk!x$uog u5 qTzltU3;O[m +I6\w{?<\&w(5{C:.7>K%5r Oz<AzHpB’M[5s_ Xȕ4zTc3r`5bS/3^Or'4v8;lW_!s+)憝GnӵtDZ%m{ +_3oѿg<}rX I5 4@m'DZ+aۤzFS6sl?= jn ]L,BQߞy$_@j <EԛCfP@VM-C/mC}FH:1L'< ˋo+/!`1Y)>tV+yMS"DO}&\2q#dX03~u'<*nemoS+]SX[ H+cơA\GФh +l ~$#p8*"}C,LCNjKDNG_SnƻwI,-p!WQWa+&FE`'maXcx$c@4\ +00_;2p q$^)9*29_AYls5@M&BnȏJl'hǽz9LsXbӶwa&c5Hg KRYÐ&d-,o$tw"@51~Do h[p^CR2|^lK"(.նyMgbJRC\ƒXSc +'aϙ g/-~1O ct= [>u*{N#17xq N aj?`enUK^_wˆ߷^c0^|Q700a5x/cpѰFxlQ'6 |5o^_LB#}yւ 7BfTG0-2ᇜ${~,r6bvÞgUzك'v +|އf167Ħx[SŘIMSwƒ6- iC]k&1ٱIP,P&4#z&;fI猐m߹@4drp[~n'2ژZ:ߘ*o]Y)y&#컝>ڟ, HC5lZ4>wWbU~_wq#L,(S0:CWwʴz8(-d.V/L]9s&-5i-,{v(_'OFmk4gbj*;D22u/b/sʗ 2|(:q!Kl;L\P)*܉YFP" F/Sxr:G5cڣkqˣpEcfm-irMswSz {7sHo=_p%Q mo!mG~2` KpӛIzcD5wr(izs1EXdXzG29%nkK"1 +բFUq-AADR:5UbG'NI\,wHI@aS]s<#}i,ILF}?ĺ7r'nw^)y/RG=]۵ q. /,Kjf.VbHFZ`'{cD~[sL6 ;K]\qچ zHa]f "xm a(Wׂ!^fo"(+1T Gg~隆^=zٜZ qMAˠloE7ԱsK&#gR.0cz4[,n +O^f\nͳ54Ju`njx זED;xx_\Un):5)D%xIY ]-:S +Ѷ‹u) +kM@7F7-KrVgz>_ "RZ J)?cHu Y_#hR{koy&CQݐ|Nq9%;='osE9,JoWr͛|%aKd``!Xd3IjQGA>_Kk*~I¯*ľkOd:*c!l + @n7D-3#=p}ؑ[)FPӫ;leDJŦ rq;mg2LB%KIx,sRmd\,9DzKtb_hCMn +V ٯRyg<=Xן+xd,,,+C!p 5cO 3'uǎd¤qf`Y8cB1YG~3- %{ǙvaÙ%%g6g7k 0W[3X[ұ4*Pi!A\4$Y4{d"!~ܽCJ_xҼ"0Е,G{|qS1ZhE͛ CbwfjArQ^XEF4<_vld4:;#UWlO{Gߑ]=AHh"U(\x*p/MȦqy9w#*w 6ro W +;aݥ-= r麇=djF[gЀ-}ԓS%als0 W/\%d⭋;~&`-qx/|jSm/ݾXoS=a,P_J܃Z4Y.uYRl-ԓ}4Coo `+d&!2>٭rH ϟ2U2GE5(o]M +j=^_7;kJH;}Hyzd Q6jR1!vb.ڛ#d)J4&-:RnzBv^ >{[?svԇtc@'?O 6h^z2>E wɫX#Z;84`hf2BQa! +>Ll/y1S/C\Ν`PP@"\'%$k;+jQcmmD)h-J>E+sV^dIrٸ+G%b'R=g=hoD&!^Cً]~+aVa{ybEJPGBg{47hi(nԡ*mo2@ߩ d:>7oͿ.NWn_L߲yP;_ !t=? J9j?,l!-/)D"[ȀXRO5s_[ +([6ՙ,m(V[[zȆ9%~-Yqdc3ᙿ=)0)ʐ$?t~@Z T tQ=AeKW{c*&ԽeMWǪG/l^ш~z35?s!Z T &+ٹ*<^qyVǙ]IHaŨUW7\yԥ>"YDW+w4K]r6rhAxth`3? + x-x?E]@) 9s;~Eu p罠yռy<2EGs)1 P&`5/ EL &\'dSUp4T BL39MpQ- K 9b7؄O~Tt!Јe}6sdeA%<?#H5Y +Վ_ Vu/ @xP~յk?澿MRr8|]V}e~ LBgwt&>Tav8/(ë0˄Yv3<%Z3k_ B2uVnB#UV]U@` NYQ^^OϮ:0 Qaj49q7HܿG_Ue؛nB|x&g$d1\U%(PxY2uY*!IqƴtPi+O Aл#W!H67c[,Bd'sXF( P:eA3ӗ#/V2>2ܕ/ jps}nDsZIf40bo`)s@f]L)5ǴGd2KU4=szX~'B=am`/tWxE}~z SslfZцK!8xPJ+CvVh9 +p >D:Q= C#v;@!C\S}!i(c=f=쳚m,*`Ǎ0_Ri oh8jRrnV]7I>ޏgt(J=̉elQ~j~wpf}sh.OӘyHf ΅s5WbcDgщ|fFb۷`ݴ_Vӳ}Զ + +oOH{OS?Qn \z d,<(;0?h#Xx\ +1P+-6y錉>_rQQ:5%b\ؗžKP{siK8EI]9fvM_5:'fpy+ a@Ѕ./H0HM"\9X^ԧlft$zF ͘k[w|84 gqCyЂJ<ȅM|,eQPP-X/N(I sh}o-DA(_jqKrr%HҍY>PCa`4@Crf:: Хz)ԫ>ww?79pPB2rxz;VYCG,}[-PDveo?@"p=hYt:cϸd,ያ L-2g:v̦]I2+oҜ+ I(->t6T@lE97=ZR|9_kw ˤeN &\Ś᫫17ft-$"Usז (NE(iW ޯƕ%_ǦLY%g;߆dRbP~@z#2zY7*+'iM.H21i(027y_پYZ_{O&zvDYFM@qSPTb+^UȑSVBm# $BdݣS"! aҺUΪ-mD0\#U_TU9Lp ZnjqA0~Xt ﳁXn:]I/@C!*V_N[rƶEcl~L {Zή_1XnCv]voD% P}~O.6z[ oH \`To +5j +"9 Fv"kfT-wD <@7vَ5ǟegC̬O5Tuz(ol$-|{PoK2 5Mˁ$0fl!DDb 9}7g}W%n:[ ZլbrtI](" +66P迉b7H +mKCJv hL>dk/$waijʃZr1(=ڞc술&g.&g bvjP\EWʭ +=[an| v-n-$.@Ղ 9@M8>"=9/Vv1q]c䐉q ?%Tci)4;CD1V>{CW~!Ewf b@5)EuV,-F%Df]Y#frBp~PSnb+wIa BJèbu[m:Ҡ8WwlpP9୊azQfnru` +|? W~pӊ]r:*Qp`1>FCK?a>ifo3g|]uCK/kH񭜖\qE D]w|b/B .\۷H&G3§yyr9=yA{ +W%޶}W>^)>yA +$m|c:zCsMhBQ $B>25:F>ʩrUC5p8KCGDI/ҝU[*&k~B|-J%`u++΂?|LmlȬMgyt%+*eyd=t +ž&cce6Z?H +O~b?jȈb8кB=bE; +Sjʒ3Kw%_P2Ԩxs"kOPv-sA e`'ooXoNs Kh3Á)J 2LQ.xPS'# +U1| +c%A v]krZ;;CR>YWpTvtl~F{ yKFf9grt4]Gp`5 >#XYiT|6@\_hɉi)E" zGaDem1Gߦs5 W:h[rm\-ny=Q6V׈KQ u}Z%U1 */dPd&S<^% ,`_Zgr:لK7mrq_.oMĶY oy[|s95;\I9=wb_ cHu#4dvtz&4/"Aև{/yϑ89J +"Z3{ q@d`"_{`i$^`8Ϗg0$֡U?zD<üQ"w _8]+eɄ$I(ވ-%;)Qu݌_ΡzoC1LݡFuXE= Q +؍-Ի ajΈ_---"rڬrG b/E+?JuAk+;nOytc$)# +tgoǜs mE3aoP*c"4V +Qh&%[4Vt -\:/t`{WG4uU)+AgIf=;%B/RsT y?}bi֑bG;S2\{@]a?B˗{V& keu'1L^o19#8)-DJWOL7'jЄXO|iPi] +22Yyd|$w\Ck4C/t)_nnw3Yz#3!G uBd1vxg!rtqn̓>EZ8]<EʠFєVGqq zhu61b# E&T tY=}+H#19U>8GCyo3W=9@_S#[R`"lCF`svH +-:5GʥBT +5t@*gXy2EIz1S֫:DH^(fp*G@ + J)T*C-/kHZ) l{~Me#wSd-#w5|*Y%4AXGsejJI Yϔߏv2AXȎe}-Hur~[~v8bg6&Z$J*#j+qg欂G0}-߮WO1oah{t{mװ3vH4e:/HmOZ> endobj 3314 0 obj <> endobj 3315 0 obj <> endobj 3305 0 obj <>stream +HWiF> $0`v-Q.8,%Eꃇ0aկ^z;nm-DV)jKWǻIvTHM1n_j7VV~ /0׻D)qKaՖjVw/>]/tpm/r?25ZWiw c%֢ܼk?_R\h#,F k<^WN $ ?gw:QO?Ƕ=)eښs ڴB1+.+#@ cixlg3#Nvl%8}{)R$RZpj"l~W|2Li¾;M'Wk:imp|.O: oc󔓉"Sa4p2ux-I,?p7HTE.hӧ:OHJ@hkNA}~_JMN2O=`E$i6={I奾 of3Q[>LB-t +s5&M&|<R;XZ~Cwj.m*J2E43p +KDxM)Wx*H-&Jmr8ЀPs \Mz@Nl>yVkK)fYX20]b8aa&ȱGU)4]Y\ +P B+Gݧ¢~ ++TA%ZÜ8ò]H\47i͵8h?hYk/L5"M'v~~z~jo^NGX߾,E C0dC6 {(؜֧4oa\ˤj*K&lV !%A&QB\,,R 9&X +@!@ɸ;6V6UT8f! 2Mi49٘F)ks Jc A_,tLIkKS=3-$(v|~rЙf!PM2A\"nX8iPxQVҔjZaY-rFD6ّsm +`Khy;^JqbdNL6/nX$ML;v"s.^ςںq3YPELQ9_eTH>(IKX8i(tD}ȇRaOyylI&6tTNP6ry%mâ<<,$8)$TdA̔dEr~hBNrXo涢hg r+:bN-F#-[j,,G+6~N˹;v& o{qpgU2+NJf9iUН]+t2MxMT2EwǦDawOreaQCԗ\t&w~QؚϹ GDa^}iۍ/ot05 OxJ:`Ér)~^c"7C)~r` LU6i endstream endobj 3311 0 obj <>stream +0 M@&\ Me{4Pge79jsݞGdl3\q-l f^zm>| H#cS z|֭a^ \Q +M̗zB>ıYM|.s0bro}Շ#2n aQiKTމYV.Q0oc.:B˃{ /-1%4U-Z1[^<~{-|)8.?xTmU +/]Ue}<;L'@|,co/G*2*6xb;*F>6(i tT*lPrtCH"J_,w%(\`lgGdAk&@5t]q!MHCi0 uQ8dŔϬ f67cagbw|m1.ѴѤaWޘ#`EcTnlvtаhSK3Ԑ*\VYA~ʗUt`[u]oo ;\ܘu!<M򗺋VB*1::`E]pL܉BSDG,| +V9;Ql`>R4Jt`l?  ɭFhVJꕖvFOutKEI +! +FE$2-Rrƹk*Z`P i7ND2eLW@ j.[h½tD 7K-~=B% G' E%kn7?U9qCmǢڙH} Mܫ4@,ex +-iz9U I4enwTpΞ#ҬE:5oCMl"7 fJDZkK/cmã&`PRdGJ3h* xIXo'v7Ԏd`j;!P.v~Ld9/sZFMRl`AѲ@?`K}xM=1Ν=[,ʛK-x_O7"%WϢ8ٕ+&q,=kl M:nBc?Lfײ_y,9Z-sغ9ffK?ep&&P5EM֛1~XbSH̻uYzWE6S,s멮% e/џCq{D%,'*x; N<*!!Xc8_fJ (k*o]@uOy'`TZwdtl"VtYRgp׌sIv^pT1ڔE{ᖅ2TTr/ıoOJ[}P߷8o=b,Wa +F6іr ӨOs7r߀*-kCxcÔ{񦆺2'{\fZ6#5T855cBIlrH"e5;詎&wW:<!(*Βk!]ZݗŨօ-uxlJQeQ= Bm 뇺Ͼ2)&[C=}ď}kSW.4@^*0)#L6z(ߘ9 ?eҫW?;)ZZ\u0T8hZنn!gq#S;>>k ~C\p ~c|}Q/XOQ`+p=)P'GV0$ӋЭ%}3X,ttob*pfq 5CH l§ CF#e^XN|Doʁ.9 WN]qJ8kOX@FE+^'ҿ{ +yŌ+ꪁcb0R$:/ Snti٨)cF֦Y~6MmlMk{&8Ӫ| $ OřJ9h#Ϗ|K*~cto4us.FsǷCC;>>?p{wEEy`>M'.aEkVH୙ٔLnp~Nl]AINE||p7:'E:s3%z?lxल{hG6xJ_#?yT68e13gjO >H`(Կt|L#'.qۿL}jVnI&jp}s:'D녣{>Ŕ. ,%0詬_iSF3!QoڐX-h#zϫ$6>WOȏM4~͞7Ox5]#yrK[[_pz+/y7a9 +ImYѦ$+N%1kKqtzq=D"gVZcF{rS+¬KsfG=bDfjPZ-h:u{E=Pgu(87$|k| geU (9g<@7NUk'pd4ƒ28sotbbOIB|q ڍuU8bq57CEL3h57+/#r_#xT :T%Xy*PH~H1O&JCgpP~*B .;\]6I[j^Kh?$6k;#>5W|EE` ^?vCs~.Yus#gcL p:5Dw߆vnINrw[{Vk*b9?W?J[QLT!26v?N| 'jo7f$tzJ-J/tLܡOq$w AZm J9Ucc^#wla$f\Cb!o]70Ѵ/ 0Ĭf +%'y=tNrr!H%lzj&? v!3o^p(ۭm괮 E 헇N6*蔿$4M>caKADwaZq'bMql?^h7nO.č Ƽi7<8( +\~oG8GL cu_.TE.D2$'*N4CdI֓1P@]fReXa+$aҘyw)+;]q+1LrJҔ]>Ϣ2B0/Ћ^L۳Ď7n^+\z?T_E|:BlI _c*n7!WggbߧfzAS]@e|ydg&ERI C|T<,!/;jj'  +/=4 MxX"=8, \+QdޫbHs- 1.A},D*L/Յ>a jHVsUcCޣ|nLeKFTa^cB9fOߡaԗ(4-޼F4%.x=u͡$W;,-C __>?i6jWC0\qّ߿;^#_;nYT1 4KrITlQ䒈=Eܣ[/yF9 -FUv+*HL}~UiJ?OIb5P- +K{ڍq [ˀl?nO }`q`t-]63X?4(Fu?VEH7$#0l﮳d~}o$]/kFW8 װ7 +uiJ%~ǫ?n+&?^*  9gLI .YHwQsqg]î*l5[S6&ÃUeEm51Vy@Ӗ֡ dCkw%?ҩ4,ڇkm }??y;S_tm j@5Û2fCMBb^_="&>償 Xu9Y14j.pw,,n+:s׋q.cP9F%Е)k r/|I6_1I<WGoRf^ת9Yr1%!ÿ?"_j5.cVKp#URgTplyަV~3vlbq&:fgNn1f45 =!Kam&Cp pu/ aͅEXfNXg7k㜬ȽF޼C e{=DB!Y |NR6|0a/J`PFdmF O$M@Nȩ\Uzw˲𚱣/gl97">_} ڗҰqiU,QurJ 6lȂ~dYu}^G^ zTfp|gnߟ\%wȠ⥪?UꄿInHsMc#El`IA\OA@%_M5+N0Gö3Ib{iw#P8GḆbZhLHAɤ ^3{{ֻ n-{N"~`w`g XOW7rV +GSdBORs~z2SBy81h'K +~&u0FzxrwL͸aj+-.?+JčRD`NUNz/30|hu (#Ӎ3lQKRG~ԜS% Ao s+SlN7 PyU\ (xs=o;]5U˂{jϟoX~y:q/ϸ κ8쟩Bpp=(Xփ c}gяU?`"w$)^h,bܓ(`LКē rJOe贊I8M!6W7n96t |V*cΩsx-b"SX=:ap=F˄2 +IS +K:SPDUe6 (\|hLn$ VJ|Ga/. jLwy{I4M5ЧFygk +]|}B]*h!hJ8yWlA3S":a ƒb n⏀Q}0f5UӼv>R?U=h%@%qR߲_wo2!fsdTP5NL>c(It nׄn*BF_P?tzWDAY:q݅^aYޛcwm`:Q -n3I~b3pWiF0sv8Os/XuV\硊GVےFP$z`2cҍqzWMۿ"uwg9gyy2@z=g[^ \cS.O\˯Ĭ-rFH*9jk!jC~Q AUDroHmΜ17O-P0Qa,1kDS5vΩHf2TN̨u_42ʓf^{a?qse+VYkA +%qLUP2>SS LBdbROI;s4٢FMk4 ^:pП~ Wt?-pA"U8u;oh =OO|xQw3tKOAcy xcW1rƩgDoH [=mL-hKS?Zjk&ۯ(|,%ʾ(o礃X20 ICG O/j#j;ID /oH@s6_@jb8"ǨlM*N wXppEͰ6@!+u(+NX 6x&W[d |HJ@L9+5V:_ҥ"UIbo&6L~?Lxx.EZ+Y @I6m(4z)}fsXsU8QIC1F,H>}^d}v~[K dGզ/ڬ<`t4"Y+MO~u }H+GU\||ƂdhXX?_sV<`#MTcl6@A +c۩t}X .|?1OWWèD ,w'!FO.+X扽?pE~7UZQ1mc)PKJ̼uCvt/ʝL8H6 %ń|Xmڻw>׹|!hM;|!Q$t7;pm1q/{뽲e9uKz2iQ3wFxsw`}w6WL2u(>r$Z`c@ڋLnŰ6̯ #e1>)^tPfv7'#?J1z\9*c D;4ꓱ_\)"s[eԍ17Pg\gdKliZ'=qp)xfZge/xWxvC d6lr\e +l@r #iI+ K{7]#㋎Գy*) ~.H }VUz5&+Z}{r/9z%}+W MwGZĄEAT_gtcTA T8YiYnxu~C*/GPUNM*OuY[% 3Kl5Sc{1k]1<9Jb 簏 kHڀ=y Ԕ`DͰW[]j0dę-ձ4 ~'A1`[O+pBȟ;d,gCrY>ZT)XU꒼I'EP>gA5;ƿ0fS-F7i6b )T˖}m3 .ʣx5R|x l+ Q'UYN78eґ`Ydh51v?jca#MP![Rɿ'v2"v 7kvˮ~8?c7 Tfj5?aIQ7@[`]L|QgC<[|oD4['byxBsJEWmvz퉓 pC[_a۵z@00Ҏ,@!`#3O8zgzgsH0cAU`~s4?5d:"W̉Ovu A_3âؗcyFPv.vYc8hfz- 钿}dlS+ @Y̧ٻr;(Pl/!tv0ĝ*q:CՕFh#5}Ө"mGK&XREh2GJvߪ + D~ o6!IɷAw2f p80m'gj.),PhpFƄ + +)+@"@ޞN70c}gP+"اNݱ;5!m[E- ]62700BMiUHt9~OQ .v&_݋szBh } aJq8H,}$&N_udsPKdeZuUK <˫->87xGp6A՘fu`4z,!C)ћrdYV6~hӳ+Hod QuoP@% ]4 +̣S|t.<-V X+JwIbTsݝϐNXV*? +;1D3$ogI="Ws^.kUXN ]F +US| kdRͱ/AnܨgL$C[eM°?OWQ{ȃ;JC@?~MBߠQEyB'kg_BtCg,HW+ɬbZrCY?k.\vgDhSǾzas[@W櫷<uyD|4M1yΐ:пuiMniδN\GՅc[ؾN1< +Hgz7p2?%†Q0Jm>^=ƉIDpT/g7_SM|ׂge pZWOTf]c"\D4iyv:)RUG&if2v#)kRTQOϸB)AQG<(r#}{\$N%G F̝B]΃&0/yK i,Tm]f0{m2!jz}cELA }|W)QaeZ !PQpBEli|7R +Ἲ#4ZV#a1h{a_B8yp.hE[j9ia x +h- >e"}̷#  'i*޵tQ 3}Ml:4"K*Wf[k ?6X-QP<2x]]GNui~19*|\Q]5ɪRe;>}zJ:gDEktw%6i UnLy4@u.9 +enno -`50,Su DhST:]BzS|AhP1QV\HHCdv& _&0$ ;.cN+Regu] Gu3;l!VŴqcM1+M[!['DVIy6,~BD-ŀ v]~?;k/ )vK'M:u;G+˗Y6+7?ߝ5UJ4pkjwՓa\ v9 oj°l7fԁQrd 8ז +miI)psQ=!8 ';1bSazwrsbQ7>ԋ1F?0M9_pNݾvH=6j^]S~9P +O2m5JŒqk!x +@ *kWT˜X^ hkGUUg5,oZ0 TM+0K5s]_qc5x,ܗ@|1t-}.Q>:-l 6WƱIPH`[dR&/jjs {YjE;*=^?"E1M` ? cʓf [Z +M&ש*{9%5W~FL3jߢsݠ# rYOWResOrcSB7PEzk)X^QX'|á=}Y֜N#vE}O3.0⚴4thwn"z0M]iP CPpktv= Kr@no0<[$"_ʹg`N_Q{#O;^1Mc_W4e7,=$EH2@N⸄CDrƮßdI~P':.($NL6rx|jv$A&A]ʩC npo 6Eg > ֟m"cN\ͭ1\TmnO +d\D,{rd;N,3Iod(3թ2 +,AGj%£( +203j. o18ћ{ǤȲxަ5=]jf5*hx'?1Ҿ#ӽ9C5ƗߔWh7ZS^WTq_p2ůav@H!n>XM I4n;_H!&uCxP<}lT_֌â:=zଙ< l:D[vR զzbKD$O1@ \!8nY0X&B ]c'щ[\T??UPgkʶv49d.cE !U<]9Hݧ"6W}T$3Ìb_̚D>}̇Q{̾ 2iH_|P7 ;Ҷ9J3:V\ѫwo'aR/qXe=' TɒKuOڋ{TA1, koߦNKZAgx+".JpĬ&s-%BN' 8X&90صĕ!I`Qȼw uh|Qas]|KF_Q.#$i,x>Jar'OjRb*ܝ5s:;m%lAWvG\tֈzggóoȱ|V cV5iEщb_" +RN@,9YiI~\z3?L!.yO0ȖN :#Y,vӈ,fH/y|!7U?a-"]MObPBb.g; +pv'*/ +Y^l;}@ּE6euhmV9Rt($PR&7t V\N.9-6^6'bHJ)V"%]dN&g pP&FVX?LԿH.ڝt*6q c9o2ߡt-nLn  Dn|`YC0~Qɑ5@N]0)[ %I42a%긁ȳVduVIŪ Pgɬe׽Q0_ǍV۸mv}B/ bhC7<YMqZy,3 VߖeEK!1).BUF߉lhIS P1`CL쐗Mk4 py""V׳ӣR(-?.Weׯ+]SB#2SEbiD$!^5s,هH`a#o^$t$֠Sw'RQZR~~ߤ"<6W[>M?RW@('$v?F xnh@_S'1\8ID'Xv&QX~Wnƞi̔C@9:$XvBC%o.yC5gju{ˢ՛ xjs?b-/VFmvL0f@Y286;l9$*7S^{S'pOH0k`1GYyz|E*/wt9<7xc4dM)Hh0g)E륫)>wC49KЯS˓4[_8#8WDP=9Vqjxvh,#+Jxk%%E"KlKri"^ -Di0?N`'.0lZlF@3)3wjEf&=wpZ~ }QʷYQRsvLͯ %obqs_̑~yZ>1Ja|s(+';`uxXt~|Lp~+3aޛ> ̺*TsN@;f,Å֛G@_Ų:bʚcD<8fcBc#IP<ٜp=[T\\tS"߼ˉ"\Ӥg,t:E)`) Fj@hj?a*&JÇ +bS1An ^xб%QX=E[cRcH2?Hj?zQ\)2 =$Pa@\cU +*ax_sg [zT^?;rm]6kgV%@pzA޵kUwD>b 8;ͪI{$HPHWg >%O1^3 cZ@!ZzL9K-uY+A +z^S c~J͟H5ݯ*:svs}ˆ!|KRGW}8|1GTt$txr}A$3%PAca!!o0~o((_0BO!> ǐ$~ERݎ?0N.>T%#rY>M2NYkyZY̽[/B )kK.[u-p0$V.Z.8hb_”U#TT`XY} @}!jvIOWh[Ƣ m|oωSwiBYTNmiLi b-ʰzTg?y +i_I%!Dku}}e]p7&?]KְӟO^NFRg/Tz'=g6cc u BZI/)˩_1𸞁du|`qfoWh8>0<=9.9ܛ4+QƧo<%JeO#Nb{ޱSIǪ;XV +塞`Ѡ|agI“>;f/YkDhy_Y? h"$B[C;Oh⦪C,çs:h8H@]@.KDBVғ .߆mn_6">(N& ;Vf .ze6B -jՃmФ 9k/`(mRI"/TE4D*o^W*jh@$z"$ >wT讗\=ݏ5xs=S6Nա+'&&d-AD]8B(f!=Fn>~- `3퐘`kH +)aZ;]ňﻶۗWiͺe-.!6 ?V¶C*?^;a(;GX_(r~}w@41gϓn +gG Dm=T4,ڞv0Jf>T_'/^\T{G J:)ď_7pM>:U{(آݡ׵R## +/1#&|j\~79f(cHg0cA<òU]fERTv +/_%;y,ݹJ%|]P.q`ܛɽ2ebSVj9,ӃSdz8v)σ +ija/4abO]IH l(U=9Q9ϙ-]G ׭AbGk&z2P DtL칳ctO ?TA6f,Id~{W_ BS=dTgh1+&yg~1e._ +$ݾ"a E-̸T?GJdc2_t#񻡏H~ 񷶑RN3 /=皲Mè :GU$FcSo5e^p6RI|WR/@KX9&</iX8'9cWLlUo!L̚KM>кpb!5c4DndC{ {9w4B6Ɋj%gZ^veX+v4[B!K⨢ +u ݏzڑR2žE[[u"j##FAy /&j.}w/22$y Vb52.tWc@o$3ŋIG:B=|Vd<&x.!ĆI6Df!:pľ`=& /EHwQ;tu3g`H&-lƣ=u%rO\L(}=m 0WNJ4>O؂њ/ ʓzZظ{@`Iހ: &#'^MPNTԔX ;%w5d@F ȅ{;7M@Bio4uPt";8[g~ŴWp C%*wCNQF5A.ۮY#U+jܜn͛y+*x…# \ !n!QYuZ`& 0+3"d`>K go GtVܣ2!&\Z̈́$c_ۋ$I8u7lfs r SLd5ž{ӭmiBx^WqPjop0'A;:ބKb)8<o%`d\/ \/Fj6P? +ꃒ.#072}r2ڬ@vw!)46s2ΒfdL ɜO25,CLkڋ55ZTpNeu{CJ0Z倥8HqA"IdH[DݤR |%V#TIdCj vtu},* jǜ,X V3Ե|O^Hϝ" 冹tL(mz6=64uԡX2 +1 WHBK",K#YίCkE56Zi jk4n_@a;͗{`M^۽+eN*2|v= Pۑ/]_T?pP}a! +,$Ii*J,@e 5vfpv4̅:>~?н*~\$[eexoր]l,Tj̧bاfG7O;X?$6pOn_HOm V\sz(7& np`a`10c-Gaդ0@ʡWXN@b}}yt+c5&SZ @ο}gC+: ?eH!ۀ@x1#^[cy&xKy)WI>J,Lzotqn Dse)7to}Pk*~msߋb~>/D:-ESkWu* 4k^iiT`з ػJiDVVo + ۷H/ɍNC-^7S{HƳ&S\3/i.`O[?`Ai0'$Wu\d?4Vp,so1/{}} ++3ykDvǎBKiTeTGog}5ڜ_^ԺI8EMNK+vǹq/ '(D %o2GZy,eX/pMJQ_B_Tx6c ҫE\A8*{#bOv.2gKg<`G`#"mo.9rFG@VRG0Hii!uvh_XGU{~ݩqЌErӊ0_JnnRKoO0Y6{Ͷ8F~쀑s~8.|89Ί;)t*(%I_V9us3_|Hė|2K<'D D@ܿ0 jU Zws51ixY%Lf?bzP^or}(d#tk;/_&K]&~QUQlh]3Bbvܬ_=}4wsu;.{(Y3$5?>rpm'!0jE:9 v&'-t^0f*z1?Ղ-AK?@5J*)Vr}?}Osߡрr / zj~O^"> +YQ?{$^M57_ gx;x7ߔMŠ^dLE2a+ {:rSWa_ ooTyy>,Ņ^vqhV~`Nk5`pIמ CW@ ;4j [+umuE: %Xi +(::pMU xG9Tj6\I Ȣ)^[!a/v`TrԭKomz5?ĹjHءh^۞.dYD'u*„`1fn?qx$9[q h gXj/DWv̝3H|Nvc*׀f_> ?AoY=Cb7<-}n=M}Ś*ۭ$u,g?7zw'+a*bp')^ Kl6=4H؉ӘVpJ&:Vfy<0zܥm*]{b@R8o}^ӯV@] ﻣ(FXF-Y\errb&ŦCunAnmIqES=P }us0^٤8w'&tO,KV)(@Tʌ F&eAVˌ"yT1vcQrn^ M/J6 |]潴6uphͭ.'pq[~>i IW9,'D}zUfE +#0Kş=Piri)+ x6sb6+>D_Rz5&+"8iwkica/(~K6`l=l6g>WqZRw~S:3XŔ(uC+h|},= U1G ++]szF>Ҫ[DxOPJ[iq.XFDp({\6(H^ǬOz#45 + 盂Qri&gXX!*ҔM8(_/3j/@Xs&daed[ݡeZ/P4=m٪{ާwyJ *qUBo_{ +y>JNWbA̴U)Xqi;?oc#x#3$Go~$%z%krV{ǣ?;w3x$?Yetrj=GM#rC1&j +ͼJoh,(!&)=\@<g{!pd l\Fs%sf`;(O,\ +c1g%lN "bhOyHe7!x+89`|96QXH.! W>b#" +5$Kdrv>?di4HW.Ap*`*K=οƫQ,0Aeg!t.kwMz Hqg\EQne>VY:lEq%}JQqh:GIJag5P'vW'߃jS*P--ɆO5Nbw"6D[b fe=$9"U,'A6V~|D񀬬B\wQA]-JEqKC/t 9ߍʩR>82_NvzwWa_qa7iSsEcD#¼y:VThL$t+|#a.*&*1 +wkj"l2>Wԗ(9urdD>1 +~ojm4n IEjOR\_5βdWޖ(L 1sekiMZ\p}:֕=W|tLQ W?RjLi֝teCYK +֖7 6{;Oݥ!lՄ|IwDGvٸTF74@PX ߺ7Ζ3S%Px5}2 +4`-8Qfby +6?ѿC]e֊8Z#rCKv##k(N~ vbChюp~VrSi]> +(+yYl'jY)iV2$J6rj-WuL&G܋l{tӳy Fqo49ysco~GXх57s~ofP@^Z4Ei-@4dO1c:'4}|( i[EdƢ.qGFCpGF!`tu b Z98]fƐڕjO4Gn®:ފ5g%;h"%z<yy앃iQrsß1viS{#Q$A@J/Jz#doF"6XNy*K2w=?wRvF;X?-l < +rq ˲z{@lIa7I<:)[eoMe}vWKl; iq*ettf؞ʶde"b2q&^2Fr= +|!Ǒi s`:tK#Mh77c/&)voLRy#V0z\榓݁QXSJ"+s+gxDNq$qo$Bs8AfR@R_Ȅ:yo,#:X,x4#)u_/Nawp[f.>n ?L Kv!.(;nzoar r0y>U0zR.{E0:s?nQ9u_]P$PBsV`U(S Tg-}=.;S)hTD]54@.¢X󚹻J>ěVsg4Ei&ܴ ݐ&tS*{cG2uG+ b!֑k4 la" ͡~s2)'.ÕjVѵ?X\dHѦP44=s=fA$+#S,8.D-^bXF?\« +{Cl C<Xv9VfddF&3R{vqi2;ov†apv"~&~κ@ef!PsSZxN'+ox;S tODzkgI,4t/ujXȁ،yI_~+ni} Қ% h<< 6fY #%l%d:::T? /--nC8jPqŒYs%$_,^e{:„+lֱWiwW<% ~%ZbǐHEPK'\\#8H/E3_vGJ +J_tjmz +uf& Qrߠd7f~t7NIe;~2$xY}<*1zg=-!IhEq7؉nZctdWJwv^/ )/Σ|'d>n5zB 6)MG`{qgrCb+5/ BNPnzW_r3+g< +Wk̙aI8>%+@u`"%q͌Y7{]HTyz.k׳66$7AJ^z.x9sjTz1/ZT4N[ZV#=uJvC#<lW:OŜk+_Vsbr@V S& Č:RO 9ǜdôX +r̭|jI](o 8Ct^\ځA6g7Hcv s _E=mIMD86jZۮ-/J#L;@ M@d1,?miQ"XbAS+sdE#YПKZ JR?)f&c}U!ߐUE䋤˕{5Bq@z0rtMϒvk.0gj\P3h_uszmp@\v!G-l4_uIv\qvMnqӆ- G"Z󥺵 yl7 {XB"/2_9-hXڑ%kJ d[ZԩIske|-pB wyJmKnJxA s zd FH:,/oxW,l#?5l0 oTwϏ_2+gJ75O\!l`qһV + 0ËNqѢp'vp(L~Daz >|9mJx#ߣl0Ra2~bR!52EŸ|qCy*uNPg/@ 1ר<e@,u7xdP;]wC qM3SeD)ͲVU0gb ?dIJ!)j/Pstӡ>Ab !#l'*lw.kʀ-sL{}\$ w1ߢa ) { &rx$2/'8=tErb"B R^.ǑPh':w MLW7+- 4*0e)ύP =Aҙ٧^rd5-FBt2<\HN%DV9*}ch5D +Ղ޼-^2X%m@%8?}5.{7a͑@QqQvMV7&_ q:[6d>KW9K`[ ."ۡYL,y904h Su a7ɱ^.T|x h׎(Kc.cܯ ~p"oeʙO3ac +/?&~YX?5Av{$K?{[ˈL?_kL{6-JwoQxd -o%YadC(9§.QS '/sOI̸kz  [E_~YE#DO0vH7I`56QUN6>`P#BW֞ik Űjn6cuFC'3 pq/M̨ +޽##r-'nrNB,kFFP@r@Cu{O T<Uj dH^>qwK=, BWa.MY~WPy,!1:=g.A7Fcl0*qJ9:lV,j$P!$l ZGQA8ymLC:װ_rBA[FEȗj4d,bl;E u/AhL%`dU,)JUSIȧ-AB0&4,zJ؃Bl"uuS.89T731bZ #aL e+2O 'x?`I#Y s:ݘdjQpTʋ/NdPS2'ٖn1]!I +97((]]t0= W3!~ Ե3??5 +&BsJS)IW6}>B٫ X7?K$9> !wiSyȞqܜ` &ϫY[:F\rjȥVonjSׅI8=Z2z26i{y} s i/BD1qFO3^T_YPCuƤp +1^e HGlvawXUjL qmOJ\.0?Woٽl< ~ZKrzAf*{M۠׺f].ۄ;{`{& æӚ6 +Y/6d=R}6=Q_Z&C{i W?s&_lwC;ςZrzV!yH|?lmܨgq-ohg)'H6M;^y?Bz8T}_ *8TS6s +{F$N§+k8%ef샅c/ 03^SR,pe62z?_5TZ9~TKtzqyNP/r+As2ӐmS1ɫKC4H75|B| -Q_%ݶAlL~BiJ޶OCRI:۷f Ž2C=L%DO%_nbz.-64jw $?Mqw`6XS@ƿ*guA>=}[3,Bt*0v*c,3?aI݂%BIV=WL.0ٺ!0ZUnEʊ2N)>'\+?d*~?(#(Q^j-ToM1h*7‘ڰ:*RS(S3u<4/MU\>[ ^ݮhCrx&ȒCTh7Yg0Lvy *L<M;II왅:;.6mn ʒTa&U(U;U*u\W >VB쨇ۛw'4N-G~_HO +6^dw%YfzLrX@ +> goȤeQ_OXKMC2!⟵8DS^W#XϾ +[)io"i\3;w,kjּ)6u+ݯ+8&Qv2ԱֆibV7ת> v{ZJ-r7Ըuwxj4ʷB؋LHa4 Q*+(0< AU$SL2ǓkZ7$i@kM\:. ﰶC2]CˆےQ$*йh) 0TAZ3#& Ymo@&.Wu"K*7 +|C~K|Y@4_uoLJ,cpB]juLT94D/wڢ}͞繜 ` +2l*S׹\VO٭mS ^Ẍّ|OuU'i+o$6# Zơ07)hpuf:c N]~GuL?AsvKjS|tىV:¡Ɲ+Tx=n,sC?}Ϊ]Wͻӓ٨ p[ӿ']c:."E +ɹx/pv^`ml­(7H mk(W`7-'ZQ'WȞ!,;Μپ٠q;~~^]V;Yaʁ:Eq7ׄCa"=ȥ+?u'<|w[ mbwƕuz6i>&j88Eɗa7~-0";[|Q}h(&b<9a=-td%(9 7nG8v8ɴ 5 m|YX._%q-8Mi T_4oާ^7ɴSmZ%cАF~Uy wNmDy O +v g,N1X *] +}X?@J!JHUKAdGb0Ak)Kuk&Rʗ +rg0ۉKBx$*dCCѕi).u!$4ɩp~֡k%>-JzA P\`9.KzںטGᵈgXg?@skSkl:<9̪Hb=go 4, +k}ה`M2PňH3s!|c]M ; [԰vYdOB7aO<,id{1N%~P 8gO\ +eJϼ ?c^ī" ]L$;Ef0^);y9y"Ca`iQ\ +`$'/f{f>ѓ>%G HN;a[.獒6\ )n0J Mx>ߕ"fWq2<7x@ӀXF&WvR ,QYζ1&c=eqVj"3ax}jX<0?t0-ՃNM;j\sU>c&qq>W43L!{!^. g(ҋOC4vIN SϻAgb;g ?&Ao*\occt]' 9)`X̍ꌰ8vl(秅RV=DA #]( #Rˍ[1[+rRe %?d]P_R|mk CT>| Z[ +\.kVl㱖Z $Dh`Y#ϋwR#E +2Uw.moh-xD9k{كC mݠR~' SBS4%Q_'n@\!WMlK~XМw&V._EA%*(q"XYS፤dKn.6dWH +tMrII]:g8?fČ&2jp68qtxcmN8A,77axۑrCqJ>df:YNKa)y1n_9_qۉUtI׷U_y =|,V wy`wf1w6uG Jkr#DJ_a*xtpdN3{/ p˜xj1%zH6TCN'-<z +)ўf1KD9OHJt) ^?=TLjݻ4) #HT 7\A6ƸcDy/]^n"G^ɂ*GaU&Hpf0N50Sf3`q|)EJȤNЃa6Z#6Na"нgDXZe`azߔ:~>b{se\ @x%Ξp&cf ɷ +LI} CWQ+aXo9!6=*C=`ЃOv 4LFV&-Rd?':XDAbD SٰXi<ySu6{K. DLL" (D@Q/I:,0k$cp~¬N LJtCWr +H+J_w2rxrY1JcAg<74jcUk'q7TՍTHHG*Buswhk g yݬtTo^ ZhőѬHmgIH_^'\a{r}Wuek +i<}BG'WK| +F'[A5a]H䇼|n &iug# r.ʞeU3!9 :g`սhrK1݋j>Xו!W݇Y  N_OD3sb[ghfQ9;oO +q &? bUbO_-wU%?wVJ@`1 D!LRΠ•wrk\6=NJXA/6x8bcǚ` /f?(wbe`EY.N_JW.j 8S#[K&̇+N#+6[Uwѱ4+;MYa`~ +)IyhS]5v3Ѭ7<`9Hv<.w L?pD6EnۦZnkn!+ kPm$'`?ߘfE2r%PuD}<$CnWѪD)-U۪.x͏sgw3l^?ę&D1$>)EݶxX_اV1%v) +/D9\t*j5iMIY n*S>cDnFv5^M' N1Y21J+MO'#ݣ9t ?X>h[ ֓I y\9ϳ̍M8 ,j\zsf~8L;zl }gK u73%3VѥHNމbSS2`ٗ7H #|X!E p5)RC3 +0ff vy 7^?Э@B4An=p>O ϗ,&Z J>BHM?1E\>._z?}wDW2idET9cU(fWv7^IIs Z +1]W~ O"o;}w\inωWkt :P3rnSo)b{Im߼D&Q3"osM)Yi85zӶj|we%pԵ,mjP)< 0&|򒉃!<M+9mQ5 -9xzۅ= +liy #vìjO˭D'(UPX ƻ,R2{?f1DiA9v Gcasy( g[)xf٘3xy]Q+20whJdPA}9[`5% tyR[E{+@usAYyYUҵs$`lO*7s>ZYzJ?YOLn({#%ή|hLէ U'}_PLJ_ 0讋Pvn'uQ.1RXoeD#*@K{ CQWr K[\/:tOVoe/|7n·(?x<5FS&VAv~PWWY$u`Sxkh9]dV&$G9s%s 74BY'CЄ<6 L.ТVYe_@uzbyu׃eYtM&sut!ܪ_aB\B5wq 0q{OrP7kVn3(7F;% ڡm[/q4?L}tg;-72TyhT?"Z#~Nd`cxp2\Hu֊Æx}8=X1AWW[b"[ϽA1PWFv)MOg@t T^g]Os#X'sEw zh#! &y0kN]gYDcP+l2,jFUWRQgD*)S%$rgMyt3oaIuaggMM:["]MD [QL$:~]x{|fV)"-!žXmٌ [PuCilvE4jK!^9u@s܎bLqgy|*pvJw9Ob v"#}PnmMPQ4xf(?XYH\1#U.4s /b;I/m .}MV#6/NNqd00zE- + 0qdzbGѰ3(csR*kiQ <`h4Z7ʧkw"sb$hх#3M=@FcT}1% Hzիët;?5z#N|%~a8CnZY gY(l% 2 +7 [!| +W.Tr6Q gl *܀$'W1KY˶cc#r6Z]PS3Be +KTBx_=!Fs`f'f! +ﻩ;$ +UD5B"ܚG:<ՏP쫥v=i˝95,5d'WR3^3Nڀi)X&4^s4.!an^18yt/EKTZ@M=PJxpk%Xjq((7OH :YD2eb6_= [(BM;hރvаdD3{*QoTg^O|w>Z02 Jx!r FPkKdZ\*#K9B/esJ}L?v XsՎƋ4^ez%&/dTXd r>y SV1AWuv 7C]OЪ) ٘Faaz?\ A){d$瞐 ;DtsY~F [ 1 u]O+V̒I=D*k-@Ϊd.rv ڸ8]o~vE˞=zI TѓeU\^B V'ھ);;vV W3O`V0bayXu(2?jbIC^-%+m.{Ʊ)$jp݆mL>cDq'Rٝ80Ƌ>]<Q Gə1<};`6g5jྵٞUK:|eu ^0#Fl1Ѩ^l &Te~PXo[ \T'3>]gSgENj<_€'ث=ɠkUbٞ⛿ƺl/J( Oq"! Fu\9Uf+1Xl*421&(J@"#zeWH (~yrm.?#Qϵ6ξc +A@e=xIe!pBnΘ?'hs'=P[R +zWt[2~==oo|Zx+>cwE܍˝e8fnc4UJV'4QwKXDOR猌)90BSe8}2\" X-Wq,LKA@?Z_' vϟܰMEmMLJ +@e@*J!փedCaTD+즴1YK̼{ыZN7 N +4^>Jefn'F v͎blEqK]bzwN\L.a6UWs1:`gJ.ݵr k2pKw?|Vy!?Vgj0x[qHOe @qSO'[q+paI2 ð]= |KDHH͘n\uQsk8QhMzLaNM0IcyBg Y$ӄc)1IzsMF9Ö>/|fpp3֥ŜwѠ^W Bt=]+e~x!VsÓC{nȢ&_ahA|ъJ?,5L.QfqHu=~~MkϺHt>rcJ]T80-/+ 7YoBqY>wT+hPڻE35ӥS ++t:SgGCk!@C0{n Fw&6zT "y'!=O4%3hOXHA5bY۳-)YSe5uU0tJ8qZ +a|]-q(%OI +e. P?zϷ04& ֌L}^f(\:86)9T M|_cs c9ڜޗoIH}pzPƞA>6cU[m{N뾽EFqw,P)n;/ [r!Lʄ~M&^f0SU'|y"{,˷?x=/Ng {QBj6SxBv`\u}UEPc0h[}bLUWT w1m? +j) ;CW$}8M(ql,&P{^"F[ y?Lt($9$9'IH(-s^ }<ܱKBQi5իΠ{׻H+uyZ~x R|ljK"iES_po b!vӋw{/1%f`;6L9yT]J׺`hDX]I]}Suh4;@mwZH0%-LPIcœ>wX7 uWmеc X_/uՒO@ %wMlrOYV6="u;>Ru-o**]QLfIO`+KwfQ@|+IŊQ>)} $ x +fᚦkg ;f3W mD^p#'Dt =,넠u93?_R*#!HY+unkwu =g^ƉViC:8=>!VߎT/+"JAoEdL xr" "1Bϰ F"O?D7}vTe{uWGPؐ \v05v2A͌QsapV:FSt\f>99٤P!NHU\AUͅp]oXu|d^m> ԔUjWm]0mO1:3pnv6c%#@pϛ@ +#Jܥ|E +CsCO˔"# b`ajAvĽ3Mf7?[xޢi;), ."ӑ"#d}fYs Ź +ű5mCb[254ckno`Bx0s 0HڲpfA܉w66s60i\y*UqZ5MKn'PE]3A`ٲ X|NNX δQ@0Kلjӳˉڍ$[ϪVXq~OVU9Ŝ`FXgcu~g$$i9׵a$)NV{$R$/LJkWbBDjkA%;Q[xU +769l U %v!R3$h*bNX@i_KgSpLRbckd~ vwhM\.m - =y)Kr>処xrHZAi !];Bs\ r. dG"mE:Cv?}%7 L7d6PϢ Ÿ3[g0}5 BL9Wsƅ1Qfy[Ԙ_Qy淹,}շ5Nр=cZ@$11;7e+G/H3[7A_I/+P=AxT0sZ +LH40AAt"r%$sM.OEy *%C{^[-ՉLD'VVF&YHɦUE^zzP,>cIDx\8E[\cRwa%kiͯ!#?Fp~@|r\7ė85$vA"o <2ͼ?k0ʗP:7- [,uCuF.iit3P ljp쩊еMϼpgK[fjQ0nO7X +nhgc.,{jPy]11H^m*#ߨ)G ݞ #g[2 GvVɹ"UxS=h_?d@WD b:2.ڶƉ: Ey_[tQjNcNy!8IKVQR"d攪2sp m0E]+fݎbYqFNO.ŚU8֑k2 T{sؚW]@\9PAv;yb;`a:>/.{TFr@1F<6fL)BUvR},;tIvAw7뤜(V GB[ED){ sv:cULnSl.ZȀ/@j 2hIYP$%yoUɷ;}V٪`t'O0:38؞zׯ9nq@E:J endstream endobj 3306 0 obj <> endobj 3307 0 obj <> endobj 3308 0 obj <> endobj 3309 0 obj <> endobj 3310 0 obj <> endobj 3298 0 obj <>stream +HW]o7}У ?ڢ@>fU$ i\BJ#'_sg([>_ ,2*؂zw;x]El2B,V%*jIG)X..?6zXY'@0. Qb"y>ʟBQE +W~x{8U]?׮s? }l +GuXW7(4Q%C>W#7I5Q! +l'zSվ~EH-+YD-S2mK` rfP^$!NM8uݒ ]qG W+FrÏu;H 8&PxF?~7}T|)N\HSdt,+98o' oLp5%VPDM: czt/mX6VÙʭ.IjrTf \Yˎ.z%<4??v)yC=kw`68*n3ғ_-+H—oжSɉ1 0ԅ)}}I La,n n,;q}xXHʇ)m|UM UQeREU%V#TqեCԊ06p>3hl5 +:o2\|L {F ّb&'$0ݾ[כc-ӂn۔ė4g@_ 410+)GNa-)lS1|S4-"ˆc2/ôrO}]^(p' +szlqlġD(Qd@p,%9-'b jf=+Gѕ?vݦ!#'@߅:l5lWb3YX)G;!jw3DmR0n z%՘ΗhЁ`S=s$Y <෋^v^^(f/܂O#gV Y3<0_7?COt lxI ^:npyN$a#1cҌ +$a%[ZTo`SѸ}rg5)%;‘j;v uGD料yj(3O<ډ%rm/N5sFM0?>3BbWy6@H5x:ϴ +nfw 6V"&`X&pB.v{.!a;aꆗOC=_0E`tҋۺg` MQ;+F"  sT~'Twz{_ߜ'SRN*KOw z[G(E0~~$GlTzΏD7JF#^5ȉ&S\=ŔEC6~HbP'>w$4)C aم9Ar2F%ZP ǐKNv钙7?k<}xzPf};=K6̡$ONEǴL UGMY%&qˁDo.vrGgBr4h) }84,ZU`C֔_DB܁|<_?Lq?O0əVa  +K+iF_ vs#̐ŧxA;O@S^;dQƛmt,EpPxO2$lwZ>;2Oddϐ"IdHu &M +"6/Ra??3LIF0TnH&IP]$3=./`h endstream endobj 3304 0 obj <>stream +0 H@&A Ho'aٙTW׃˶]T) }㦑Dj]Zmma\p0;$EtiN6"pl"ըM,C7#nd~㽵pD{tٞ7B0(ysT5n:JX28{c~2^(C'U+n3U@v .b"t^`wF:?V{Fn$7HܰY|/\u'4 AΆ>yfV>o&}9K, {LȬTi)!@r"WM(Y4#6Ydk}۴kv팿 ytv*|UA]E F9=J2l uR5r\'t^cojI5)**UT xpoIk/_h<DNJ'6wA\ߖfـL\p'ɤKޭ pҿ`=QޢJ, }&vnvtF\n fry) + +,ޏ(FϾzCkɮ2-ٕU(0W(Z iYUR㎬&̞}YuC[|.G;1z(3,C/6CydFBixN8vOQ 2 +Plt? LV`p`=BDuz]`8(0 }Zm >rPB6,2 ӏ٪o;]W H68VraJJ Ƕ/Ą1(»c*(hil|/|8oJzD.p}dq͐jM.dFey% /T@kJmf!tym)2@noRp g2zj*^GT]ט&BƨBQY8 ,vzȼJ`6r>gD֒gW$HI?Hpf:x 23Ocz ~W]8#˔ uM/Mm*  Ns_>]M%Uaj1v=0MAӻboQ=1o) +=R ]ݜry=,ɃQˇilK5k# CJ8,/;| թhJ~^9**E-t9[u ERoVKϖ'/^r0,c I&3E):;`R@rC&nVh8=yZE-4,gO~Zz# +ݤX4`"vzͭ&+Pٰ8WJ',2%T])HgȈ36 M5x؜ۍZ\͠{m@Rm0!F:0Cx9z ^ſrrXlNZ:*\L!<æYUVR[S:MXp/=a2Xvpc׈@u| e̜zց'H` Y<%7XŚ+IxցE: q?Hìm]>-LD@%rQJC)MpTHl*bV1.D'39E3ME]8'[s*h7%gQ;tҌCj7i>FV8Z54a3xnK߈]^27P?Uiby Ϛ-*7 tEï + +SqEl&Mӳb5 ^#'|~*!4CP>z7W$UδZ:*A M^/%ʓN'<[۷( %bh +,VsvȖm}װg:'3$pހQAyHzb|-9NU66E8zy$>`4$2C4oE^HbF=胬906uqu8|rK gE8<`PчL'.$i hOEk<`icծt"J5જZᨶ`J38^IvN>NR8pjI h8Z|,T8 '=/˽v7* Iѓ1y@5dfsɃ0$q\k,Ye"a{FnHÑE+@ܻ6زZ y NXٲjʸġN$I'VA~FRi#рEZh5X%Mu +pML/ N7J}ٓ ˾{.=9鄨#=SM)V[TuoĹ1-ˑZjuj{"߰ t1| H}_)nYbbǞzox@k0-{/3NGƸDn;pw?^L%Sb-A5$MLL[}7:vʓx 2m>7H~=C5b8١N5J1Bwp +EtĂ Fo_vZJ ?Ͱ2UĎbɧf_0'iH8>[?hݟWlUD׸{Of$s'D)#pvbTsIK\(ҹ֫Gh zm,!F?"ЯÍyPO0G!-TBPcp `a, aNin'!JLM1JSpA]~!a9ӇU4R?04l \mVl0ZT] פual/X47E'96y.][b[j0)UorTn1{LIpC^F/;*(~5d483xgpb+: z1^U87Eƈàx͐,X-'[kn m[Y;ӥIvYڎTy=|!+vy +B˄F?aqtd%o"q̪1R?ЊCUcH[}$a ZXfUz0‚%VE%J.3U39l$>*ͤ.NPӖ`%:UjHߢa 816I*ᆪ[ȝ˼j̃(AV8kvXQ_c .wc %P뱛M-AT>CnWDw֟nM|;4,˭^Ҥ}љN3~(\IQks!|t䠃z³J~IJ3{HBҳXٖ\yb~v!1/c86rn{cO"C'wVPeOk ݿ_G +/4Q|6~xx ]ye4K89Kڠ0k3ʐ\\&#2dLyq{:uA4 1o!wVGGTC+ cR&ma 5sQ|=-`WDOS)u&܌'$>NF(tXXSNcQkdg/*ф!L*; Nڌ8)1ߺ$LǼI<9t~SMUA足5˗!gkء(E !c%~\e*6Dl%uc(OpDp^͋+7Z%+뱽8MU +--ϘGEɴ'v䒞^@BOMK %ٰtkB YP=SSi[u?J BP,,9@Ӈ葮3X4={cug+~=lnS o,Q)DM:jr +dd9K92l?5Ưh}>X_M '-5Hs 3HN-k򙂌=~{"z?nmˡnah#u % amnۦ(-CqO3q۴TUkϥl.}gLpHiBS Uq~p=2FȅT!i("pb"uεZ~F8u)+A n En< +uq3PRړL]i~+. H ?*9ր!@i@r?2^M~ z0<߀ON1o_n?Va7\O8khD(h:;anR§E=Ju_gueNQ;(\{'a`E$+oN%IT=F?/t-=!{c}_y |k +}hl} ߟ+b + ozzo,\D$5ۥKmyIbsJ0f9YS +zduʂTXv[TVz DRN {;:c7NOp-p@5Wal;%O٩;7#cK~׏|/#`oRzLg: ?}{s!I XHq*)|)hv:1ppʆO/7*>WΌo֎q +m$BuAT|2sd/$4 )L>yOPT`vPB743r[q[P1lD[sY +?&3α5;=6kK];[*4RoaycЃ1AW:6؂pObVlۉӺF\Nw/;˵^_)Ha0RCAY 58xfa%0e:")A4qRKOٵR1'\JXτ]7j 6.F,,P6HhIÐ]zkB ?̀ſW&#ׁISkհvyB[s$Nw[@A/DFؚ S1nu^/.KZ +ĔY5l6 0i\xhuE(a|}t>VtX"Fmn +Y5e ;㷝cLCrgOӫMTn^)>TnevW',0 8B?s՚muˊض|Gr&W}H1>5)h ߞH 4V4"NĎ_7Б1vڼW$V'+;ukSFk[ec-S]1wUB*S(I0BkwZ ZmtSk +lnE5Z~s +@oC)(ksP(}z`^YŗB#hxuA_W2v!^H?ߖGoɜ"&yJ UB1qΑvns>E?)Pt%mBɎD@ HcT~J&%lis"Y T$"s]G%̕`*İOB+00 !r>XWv|B|qg{gPnEqgaO6*j)XXhhXaILMt,Lk(c',!_|ھ@;$9+Iw0!(eUf{l&>}nc6`ƴbJ- +_x_{[HbKBKgU1 R/%Z[:BϞlβ[@󭹖?#H硫S/w-:Ej/}%omLf + EyuA0Z\LGr%؏"0)֔%6v2Y"X4|$z1bjĄ/:PKfVqTF6I1NV6MROX=yU{p͍.Iiq2r3:ZJ +`t):_M +Yj3e%'Q"M}˖r??Oߗ\BhR,7&O]G{I7g$9E:J +_^HU5dj '=X`=6pnJY2z'|F+i:ʕh;qꤊ0d{/=؜W=FY_ƭYB@G,r+Ya?_C6#( 㲤FX +f}Ӭ2O/ȷOުp8t6$mUl>EqGխ싯c~0B +Ը;%Yr՝~0GmʂsD~v#&%IU8דHYCe6֛"bg*AYHZݗmxa"ӹqȳdY+jhV.aғU9z3i4w]lefأt:rew\EL910f-G( ΂fKqh1I/k""8*fLqOa 9(2["݀'$!Y=bNK(^I`²L9K<<8AZgMpbe$#]*GsBS=/5D}\6]L+<+t$SD5+v2MF+Wӑ<5#Ndtftq'.2FGW]WCrdс)-|:?(r~.}(ɥgҍ ρ91. +^ř2].~-_f_%_~r"d0ٿ^߯  +$.Dy*ꎈj< ky|(Rt^UcZ8vpq1ABX0`U'f .Mn`.X5j)B}XH%^+G\O`Øl E!BLO]t hX43(}.12)MEU1c { Z>,grH3v<[WhFDS4y:'H- &/bl4 +=۔qa2-RHJTmo^4}jp%^3pJbBC,&bWlZ~(~b2xHI 0_Hhg:qFcY$75@g.]~U~&U߹yL_;'u*Rq&hÿܗ9~oց]hN9nLC78~<"ShWVO-wPG SiJ.J.67SW21O4`cR; )X@HC{3u|1?w$ߢ +>X bKs)&^տ\gcmx}S|q)!@6W[fiwtf`.Q3}{+G p*$79&W0٢}0O?;f+"Tг?}TZ#z@WXi&2fRnQ̫N*g`kasp9NSb'kr4?PB%_8DŽIiLj2=JRܝ'{ͫ$JC=tjWCMl|ϴ`.c|tev=^'I2ߣ[͛l?F~km8r{ Z.nk~4zrV5MC~6pHo6)dxJ(eFTwMM}NT 9S.+4y3>X"Iz[ӳ ox[$֤Asw."Kۘ9T)fd$)Ӷ'*Lrݔ7# 2$h]! +mG5χc(EB'9W˱FNnm50Lx{Vy'$vdNUT_C^2~qm?Ron: ny@'"a`x Jb-Yط-^v$K  =bw D~l8/nx^=@)d-i_G)gy%\Ҁ"Fc@N +$T쬔(ʧF L 2Uk0…(Y ~pA 8d}[WvjX +lfʨ +^JL@WiDityC81WU&Jlr~A` F  +Pù{K7mW^m$蔷x> u"f呅y_x>m% HƶH4?ԓ22)^OJg1sʘ#Ǘ#i#vjEcs/6Aɻ܌%!,Bdׄ*^=!7]PW1d0kUiVvú΢_z̥%m) ĨuXn >x%G#{)j]=RO3 + hgRe%ئ;IS_pn^q._$.B>2i`gP{wm~4;&nj=lXt0Fco³/,9JqAit2s +[`[Td!aOL8BW] + +_ڗ> ҅MFPVl?T|56K5Jʸ?jH[VvDRZi_fV.=%Xi+,bGH1Fā}+C$4G)+JnN$wJ#v;="DJTD9>v*TT<u+M%?Ws+=6aW EY*q.g9mc,Wsl`drnK(ӈ2*^m|De_YN {z +Qt&~۵~5D֑ +3fn@8s9IA đxk&N4<4e)%-0{qm?on0_D|zX8BLaJE73Yeev֊t=rAĝwAň&!w\7*4s9nȨ~{Ȇ#sGU8 ĚԡLVX/Q.IibT-2Ⱥ~(b}b.+`FQw&K^}YOOrL41HEr3_{!q#̭pq.Q (o  ''svkv‚: +kFAKʚoء96]7Jic<{y] D"_ƅ0\@h#qc$9e[R(n +̏RۚFf0dkY QbX˃2sO!bKyѫϽp[XоK"ۯ9߄Eu;3(<U)KշV'gV& \>r(T{'xp3>MHdW'g} N> endobj 3300 0 obj <> endobj 3301 0 obj <> endobj 3302 0 obj <> endobj 3303 0 obj <> endobj 3292 0 obj <>stream +HWn7}߯Ǵi4< 5>լ|}ݥ/*@"Ϝ9sz(5 +CI;Z5ŗpĺ|rU|*2A)$L}zW0Pߺh6I {&@e)_RLv71:TyĤMN|Sh)&_:!`9a[C'oEfkmkYR*wR?Xf hQ0"A~rr* +(Koa@yz|]Un7ܵQ1եPpgj XzybG:LѸ?aQ|'^x9o9`lW"o/sb{5\Tv۷pV U*8sT.ȶ Tzqn 0FL C,l8=_Ϟ{~?Б?lj󡚏$>Af|dfj NQ`}n ^-:xj"opAIdpAfU6Mb8{~waXb,a%KUWޠ{*HIx<-~LALn|;&t0f[ bgqjLo60>[it7Ana.Q"\u'!CBq\qX=<.ŭj9mrhbrwvXLӃ!(I󫫳9鏵((qB^{X?U endstream endobj 3297 0 obj <>stream +0 H@&  HmY6 EvVW$U\ +(!] IDN2ry=ko2ҙ_i:hO.0'ٟns-9h5sA a\HibPjKՔ!MZ?ӊ?$R9*%}S)R. K'1>@_g2[U_:Jje!> ߑ!i$KG,m=+7e.!+C!ͩ2ZL,I ӫPDv}QBytgu(ueD"oq*)~AUra>|g x5+1s3OC08Y{0A .a kIԣ/ wMXGD>IbǪC3G@wLf}źGh pݙ~ + 7Ru>)ݎ^!zϪYƘ UgI3S.-}ƚTWѪqRһtwacr7!rےHBlkm>&xGde_*0OEe26hL5+s:-U{5݈bqmk6PbJ6K>h +lcL͌Gz FCYo,š:<- +C}Ne}&ajzV:_@C /}i{ثs۔>d Zro^һ؛\WڰDd]&mUWizVߘ<wldVVaL3ɱ ĕhr16"ܩlejGj@]m5f+ΌbL]ۤB&KGOWCq҅|İ-&aEO 8S5K}rP'5e;HW#Pݴ:yv(ɨ`I {ZŁ.>Q,Fvq{#`6tOW$X4$?nd0nM1ɱ85];՚_ +}By>v lZ+p-fj*O6=-\eqN@m͟3<:;w"xǪJ'"3[ SzP:B.~--4Dx [udKt|{~.F +|˛I$e %i88!;չyX>( Pૢ{.ox4V +ŊiZ=aZxQp~(Ah$KZUN-N4sui'_zklwޠLG#Ico7U[2ntuF`97ۉ=L6T`{AnMAcƴ LH: M uN2]y(rʋ#٣}rx+A5 +.A)}ѐ)Y~Fsb>کioZ;c)7EJր/':Wah0V}}CmdǢ|㌆-2$Ϭ ke&B!nX$jəquZt t(`_]FFi2oiyQG h8:2&."9Ĩ8\Z£{GcfE|o"N %Cdp?ug(Jqj?KL ub$}#<4IBš֩_dv4APTx\W^NTy)>N7 `΃ +0!Wϝ@+_*dDuP@lb+wMDl劇,' jh/T2%j_QzA+Y~BnEK Y~+Q0O"6A{Y;g^_="W} +Z5K$#[@iW;<^Fjn;jcPzj[(%/!7eÅy;ye4IeZ%sDg/q#?-\Fun=9^]hp#Ya !-ﰬs +A@aT}'qgWq lǏ'UsyJZq1%4IkY76p*Oy'oL-0?Ûdw!^&1LJ@)tHceqO訋m)'@JT38Q×Bۥuǃn-?$wv6 &\{-(в}J;S͛lNגH [ǝwJO!{Q}CޝQiTD|s|mP|gv#ZZOQf49&;d`C҂2JdD* fEXτ\/b7^".x$MNE + +n_!:trRE0]VAlZ/0uυ˜:$+-F#ʟ d״܁DPz&յBiFi>-F\;?b 0kOĺ +rrzi {c\ª1{΂N,Bd2&!DQ4մLwɋYf/~jveŷ&ղ='_S\$MoU'w{$G 29"T=%-Ax㘟(f  m1k jH߸ fXS%p=yM)<ʝEZ1|;j; "}jbʐ_XLD.Qi"X#JZThilQ ;i4G.KEAػQ^S\abrdږ}+=?>[k4/>ֵ6{(-h&<-KނII2Ra$4! u(^NH,gol-YںG٪ D;|p>5 ⟍TNV3n|g=#^mQ[_IUWzB ߶]5{m4@(-m(X=)bR:|ZᲉ)h/[L +N0"gSq8fQmݿe^I[u*#?ۍW鋿ǁXi-` >1=ZfO]b̳ާDpn黸Jyp^opD6 [KI2b}^2ZiC`У/jF\%!m@{#uƶ0ܬoݿk ->/b9I1op) ZV֛v#H75W}J +Ҡ'-,e[7[&nV**ɕѼژb g'#a{4z/ u9U,Lx+8rr@Y}k]C[RTDnAPN 567RA2mvwT!3]3ҖkJ4{8'wxsFԤeeZ;!V(ww'0wpu*΁epUALT_Q䴞DO),랍ڢ_խF w~|ZE׶ vd\T# d䴴>'~vѬk0<"X[e#y܋6tu%m6Џq^<;`VJX+O?kQI+'eeɘt}ހP6`DdB?WjwbUtVx Y@GR +wq#zL\(D8>)(&>&{ ROFҳ|Y5Wƨ]:Zڼŀ 9/ ^& ֻt`h$ԭYE KzyL,]Ǥ&KDׯ1pu&a:e(?Vrx+VFP>tk6SaS:kH{D!G:=uH Mc峊e~dN>X7FQ{b;TIr[w; +-BJEKFQ/,\ V_29xc95 +߭O#j?{miI$|Lu)μzi=<̓3D'W+[ +až;4 Ѳ|#L=hYIŮ*3LWE>x{>P:H*2߃6g-wS焻l`+KG_ٟޥj,H/cRCkXU-V YM_."wǡ kvE&:nAjTh5v. +hZVdRq' t)ߐ V"ԙv-=^G #~ȟWJh:qPytQ`]WySdS خ&zlpА,Qq(2RDS$Џ'1o߇{&含 +9~QJ +y5K[ :ӚnP|)ݕQ˯4P+Kg*P`e;C%_ ?f +MX1MLDY\r$o1z[9 1Ldl`&ib4#M؍]#bsڪ.җ7b-˛D5y-?K/hZ. [i.,OQ݂s|Tx$]CnZdy]wy +p݉ Kl33@;hA'f8p[:zP0tr{?1cٮih;|ɊU{BЪUrzVwk~ |M +ELeJژ>5DN#hdzOÍ҂QaVAf :V0SHЭvbPb5Bù^{J(>+s>aӷ]8 ѽ"pk"Hy}FbDx夊gNSg .Ci*];D$!ߘOvJ__)8 Uk{byS[Pol<ۦ 8x R +q{jÞ|9YPd$P)X 05)[6 T'#C:NݜQMaIoAH{. 8C-n=BqL'QQ>oI|N৬0yOYeJ9x9/Lؕ9:zC`qj{'!⁆L4R?e +3r<ՅII`Cߟ^V#>pb[+B+AG$uϨŒ RE\q'D7+x7W +xC^X vУFF-A=j5909!|-PO]HPK(w/n`T fu& MijܵKԯi@a̰ޜzf(}^n G^ī@nFỷܣ?5ٻam[@h'=zǬPem^lcBD=Zն SH/nvِg_&ȴWR121#7xTUUot6a +gXw^c ECHR2+խm}L-/U_RQxo) k]S}QАf|L%I]Л)#8SKQ#bQ1P[@3ЂhA@hRVtK`2eOjmC%q jm\m%_Amšyr-u4-arS^]羝DR$6 Aj9d) ]s&U664. endstream endobj 3293 0 obj <> endobj 3294 0 obj <> endobj 3295 0 obj <> endobj 3296 0 obj <> endobj 3287 0 obj <>stream +HWiob>ʁP d"Ȏ8A!wiT==&鮮իW8HRL01 $QHh ٫pM4헫%`^=!/&]w}D b,k8I )n.eu8+RqvVb"nm{mtqp1=F$|kM2J+߈4>G(WZNi7㼆8FH >UQ%Z}|#CίD f \\d,F OS]BS?`Ӷ<g2.NA +3WyVz0ܡz f"[Y +Ǒ#))dF;$z#MH@͡fkC_k&< ƙbkx~ZO//oNY2.N Nh.E# dȡIԆ]P+?9umۀ|(w>$ЦDOK K_mkٞ2Jp)jq3J0:ĞQjҕ*3,<3%0{fawH3s">I[ʱ! m}P ߌ6vh ߹ F-`8}' +vӒ"XSCfݶݭ6# I{l3 446V "&',a6Q[,D$!Fk-3`ZAE)I3p6/n +,&be˴Ea=Ldn|=~E sƚ%KNbOb-,+_a VGP}NVŮ2 劷;U&3+G' +a 1yИژs#h01)V;9; I׿n̐Ye ?IIXe!PVyҨQ]Ex.n~™JqcG9Ak?GGf]&抿ԲрV塳iD D$YQ!M*-|'߼e-lZd|WrVt6DFA Þ]$Qgsgh7\ qj +dBQM#5²>P$UAb|2?>nc)zQM"4ӋI+]c rKTp,lMA䚰fhv;v=3.8]ߡm.WDrۿ^#aI}"ڵkƘp0dnSzDTvvB V5~&W$Ѩ@gem>Q!ҁ0VyW !g7v&-Rqne}cǯ`/ aIaZˆV>%M"Sq\Ar-uܲqJ"4 75Ea J%EF;~@I$UfvÔҗX}~v~Sy nd D{ nO--8ih/܆A ^He eU(=q8%; BxM䍇7bε-II-i{e4K$  +"³` Ea`[ή^Uw΄dkӉK:n J=O$1&L{v2ϖPA\N3Q% +tgFRжTqmYlnˬ%)\1p9  o/,be`6hwn>3G$e&XP Z1];DGx!Bκڷ="k,gN +ł[.-+ˎoOuvzG_ZRKI|y^!P!@hTU}4JO4ڴ]; $J>¡_"Ǐ[ endstream endobj 3291 0 obj <>stream +0 g@&X gǓr~=&hNfZnzx Rh #Cu1,8 ,-JJ]ƈ"e\-(8g9Ot?d)NnԎ<(N/n +0LN̊>l, +>'HVGh֗6#o{o%?/,졒ŁZQ)k4R֘)oJA,^ϡ|23d& -Acl ]tw;g }AE/kF1D.QOhcdO=&3a4I*Ma{UBPZ{4NWESuzͿZ ;S<ɳ_&A@nŸ?(.4-ù}KN3 Qݦ_'ƐYlOÀIc!`憥dx,1aLtnɧ6 n8vaaoA1fwӰ|F/k Ǝ4|3Y:4$0T6L-/K.P؊&1" QNuֹэhQVo3 +%aDD( ^q+j]n 9:%EX9 ; bBI06 +Q.d%J،QӓJY/RO8_HZN۠2qmC;0ȉ8PS +[Ƀd<#0g<. Ttw5Ԯ= 8]o~W\ yvϨ-S +B_b힭H/x!tC?w DRod<l^bJ<%Zn5fc7}"?ภY)`7;c fҾO$?674XZPׁ-e<*VD4R;_V[P|u50Y4UeX:\L %8]jrυ*$>R1 +?pb1#<4:F:ݔ':c,.*ctB1Tۣ/"=FSG ILOp$9F񘷟pqosx*}rMyf#B;F 2M FMg_ؠ |6Ӆ<0u]sMWH@\;?bex1u9'nÏ6Zԙ*m!⶗yJRA64 +qN\{l#bYl`ph58`DGbX3L`* v0;>udH5ҖNW0P@rWfqu.wN81r ruK94?{ .Ȅbc |L`t^8C7#,3oSagIM){ ( vP.6/w7:BjadDzԢIɜ~ +پi#yR:-?K\ \v`J;#>Jd;HG +]^"Oy~'5nW˶Sm%]0 Tax8_%3\V&2wp 엋a0j/:F֣l[()p~9DTv#n ^AB^APz*BcBBz?qΪ/tFK$XubFgmNwmEUnq`N; 腪'bWP,LxO ODž8;Pi' 1%dQq/\MY3 +I]qW :IY5Xr#/=ev_݆N'pSA+Q먭5,?2fuЧZʓ.(FT:ͩ(Egse;YBYyP8'x6:>WV_ +ٿ@_|ǎ*QgncRXt5 2dV"Gn^Jf'J.6wF.9藨dT"jey +3{{~kPcnA*(؁b|G"GYQ1/"j(#=%s+b`{J.6!{E\IYzn.2}n]߀(9OQ, ܁YhaڄN J*#f >45O޴I6gG980* [ͳeWVKhow(f nN 089k +DdF`C3{r' K2ä՚;"jRc@-+ul/ +w%g&UpkT +"ܣMzGeB B`I((L|'> +z,XѠuP+~|LܜpKWT\vZBVxF%U(ݵq&2 +Zh+imѝ#VF<֒[&Dن`4f$Dxq)?U0BL+EL4M`RYsC?VVZ!JWWvU Xge`yZIӥÏqyE&Dm*(*&9ܟlϢb]xGثݡ z ߻ +CW~QCȲH"WZ//~wt(q%Us9d,9!n$hȖ=[ʦNg#1:`I^z1JkYS`{u+){pYU$ckkaiLN$8k!-h]q}DPؼ'~t؍I/@QRd0EE[i7Vn gVϲF$ɉPϗD|G#KTԌr HPֿ4BԬ4D.RCNEr.=s/Jxf/yywZ.&2Mi2dA y4 ^>8ad7>ogE!3rV/GI^? c8)lq;ф~ܟ69;BkGw,[e= >ed90MMF,]͏%=qyXOJ̽~4d3CL'5=Qľ8(75=%$1juw7ی&y f&hz|iSLsB˘1R^U)Y65jqYDۑ.#(fӆ4_ZDa/7EJaW9[qSn1[MiGUtpa϶4 +2!E*b&) 12ݮ<KV{ 1R:\8p >!úW7uWD" ~Mx8=7WRz5YE0Mfj]2]BA[|a ,/y@K!_9Gzq(qrr4hYJ<'|a_Kӎ=c7aŢ`V }0"MP&XtX Gj|#g Ώ2Dž$IJWP/I,v  +k&9]TLm4 ?7;Lf#7M`9?ߗmk kKrja@ ~Y#EYn's7f&zl^Un2QD|` +S**?26Lo;CGjדm]ϱ[.qn6l/bHαEvGZr3]Wg(KC tF/>Vj  +{?p;'sČ>\.&MvKAWBI=ے"5L:ԁ׈&ȶ +V3fixl!-siC_+Y֚I&|uި#fud:.;biqii6HwC)‘]"zx9ڸE0cIA*f00>/&j0ql?(˜2~W}_@HY%8s,Lza9+ LhIIYG4{NHկ.Z-|4?W:S SyHɟL3DbכO_wGU[6mHjOچ/ށHCkنJî{Tӓ/\їVI"a0Z?m;P\G|6Ԙ4mIz̅ܟ Գ;,pa~ɏNK؇ +@0\#$^.'ODyܤQ.Z6:){cCc.,,%CG<{0q uDZog +@=Au!Ywxe}WRe +爓td74'0ac*^ +f~# #"*Xrw\\uҨn2n2D! & .otyqK87*5m +W5nQ[ܨTNGn우nBJȁ;I3q w0.}Ѡͮ,4ޥQv|*Dl%ϱ$ܳ~3ܝ|gō +l"086ͬCH78A *~ A&EF?܀bF{ x"'տ"&К|\[{AzS1T0SCZEHGd &<3烢&L~&jUU< Y굲O|D%ApX[XH&s9(|=:x) KM^uyް@2'( MQ=ܙ)xEv "'Ac6~'`0S:lVbt2Xj)n?-v`:P3/2 'x+,n[<~&:O8s5 GDdƔR͓<֬0N|Z$i4T,ᘥ>H,YFD0,y1q4\}z̆Wg (%ʆSIln-⽧q谝[!@iA^JTNFow;`?<Ŝۣg9B8`n +qAZO((Vz•b>(gש{LL{dAz2d6c [tO'? Wq=(}x3!Wȋ0,M0Kb)Ѣ +,1F%PK @xB y6p7,,&"KAT!U2p4<|hϻ6M(Fr+}ef[ Aya1֐&O`R{+zÞcH2_,MrwTY rN>\CB5;uv@ 0s+y=Z>G=Ac]ŎE_`ZV;DFeF?% +,LFǩaŠyXI0ĴXa8]`D75&زc([uJ+1!r߇_̞i1Jax,!|S@9W^Y1J°&7ބ˦mcv&6|5= Kܗ17>f.[e#A VRy+%!:&[l?C%_ո$zYM0^_8 DAY8_boKjvPOhDzGRGS^!d/MBN$t|'5 '=>9Zw"c8Ee9]*\C&\" tm\C"TђYҵe _Rh& q~ؽ&*nzV<ѳ `uH=Rr0=E18%dQ6V`Y{wyBUT]Nk͈9LN^1\9v(*'QFM8k%̨u0k\![Ԉj +^FBVnqV<.5)b:_~̑>ke?_c1aX6fQmae=hWߟBR@c% +vzME#֝Й] 戙Gfn?wx=|&gхN'sy_yLE5!ZNP'7|値;*Y=}fsFL*wT!ҾBx#b@:lYy f+ؑ r0C/CRZ.-^Bc{dkPA3&&UwW"m?>P1|U@_'"~Ł]"abhӕEW;݄+} x.;dQ)&xNBن1.<0X5-_#M}e±3 8L=ÔH1rc&2|1^j'=¶8oX%jB~BU=#XH|!/& Z ާnƒ1Ϛшa"uwt*MUEtyq*̬EDunpa: +@%j䴞p }}:01^=d@%I`뚥M̴a\@& +nf_?nvWæ Mec Z[ B."[_A3:]_c\z +QYA޺qHܸ_lz[@3,&#Mݯ3U|9j*\@黑JJIݚ}'Su0ABpPe6C+h9(?^Wu̯Lm^^ޒ> ȴ<Oh<q)2r[LpT1<' dlæ٥G\$5Ջ7R28=ƍ\y%_&+ lX©0 ֬LGuc$MvPHcih\vU3r3d2@[v@\;-~hNh6ID`ݹ <#3tb(Gpi s IJ.^e8n- ~Iz2.H*};V4tO4 v=!dqq5gv\ƠbEQsEI]!+ǿy"$`\\\V{OCE3 Lx[NXwItBw ZDun6RgPε :G˕2&*_X coy]g>ikԸ"%{<}cxKY:[N*-E@ҹ$fS\s\lز"IU_I]ΓǥH <ӠlW]|C׸_I pqĴcϾnW#9Gp=)Jh3eHX +*ܔsnuۙppk)]|Zh^WN#zyXF$=@-,zi퀞YuSyD/pKFO2t:Lj_tnL?-=XPEK Ԣ0F#C穡J ՏWU^S~s(ɲNm7@yt+nCq?L <, ,EU2U=@J*gc(ewh,P@Ӆ˝:çr/H*< JE{od +%J/ayZo`lgV6Ka̵#ĕېz,U>;N.]|T_*:AY8Xq% lɋ'O_VȒ%(+o=["9u 5j_`d#}>,oyMLkb&/#܂[&jpoԐH$;BBl"n=v/5w]*:%݂P``uov~HZ[U.^D>}i\Eܴ:R׳:GY%a״VH tg2 pfϢB4!c=]M_&GMSR8C<&P/9S [4 P\\ׄuoWޅ@+Vܒly* =XŔ[?vC?3D{͏Y˥o6Q1X!C̚|A2e-ծ>w*[N6ly &o[̮@y;0Y]c#9apԬA] ~BNXݣ"ڞӇDbّq%MEuUC6xCkK6FGA0~ +^fF';)2prÕ~#o7\)ܢcf%5a*7*cu DgOaifi;_KXؔe|9I6I85c 2}/rZ>F4K5BPG`◜u-k4ߵPdV/ڔ'8 +'fO >sG*-]@rrmhF-A~8TNj Si},[b =/`̇3ϧ)XQNڿ_w]W!)2H#2eTA=lty/U_PdR틜\^zVn;w 1[4.Pz,؋YwYylZ:Q&VA ϕȁ.}8q;v=pvP#MNz͏RE@5⸴G'Հ,!+1[㷡U++EL> lK<ԨRѵe'\ |5Tt Ȓ<9}{]؝`P@t ٞaMD85pzlCzUܣ3,1F|hXa'C4sV;:p m{+{l3-MfGʌKc쌥~ .צ׬$3@23 Ѽ$ks`5긪NEb1=R'trrrTvdyq珍4._6gªr8W*P`? xNյ[t6ݬIr,X  N񒬗uc''KvZNu98Zig𑘨7THGpB}p{Lc`8ygv=zPk۳+݋ +ǰ z5FϨ)@/x]j⩹1&6- BHۆF:Z`#1 @ku%D)lITnWڟ" M>~nzم -%E8ks+d/~B)+՞LZHzI?{F(#ο]_[!t XxBsi4xDA +&Q:`4'F{a3e|/5|2*'.ѹ; |ooQw\x^tnP^\9]ڸr! `kV͍q:n:m_PwQ߲|;ƒ_+LBLX +ο-Q p<gy˼;v69Z/XɪeڴKc-MR'clu4̔Ds8z`]\0H6ѐ[ˆ>lQG{*zB$Q8dad2PS, *u"u+̼'v)E2My +TzWE4r Zv# )Ky%N P?Gbl\Ã,HY^]TX[1P`8a8͸ ~˨%)' TcZDn/YO֓:q rz-]:PUuSGv ǥydN־nzf/{jC>oQ^eNF"I1XDݒݬːh#]E$;!tI #gUg(Lb)CW*٢~Qِo٫TèHBӵ~hq(%&7]7l+kj[N6o=Jt~HbP:Nf of6aWE swos[m8Q,5I>rP2E̒aUh纇M,TO?=2G3&&4 +EVFĄpEo&|IFY}Pف<ZeKA7MI +**j)*{8ck>'Z'OYBr}+ *L6́ [Zq6/$j+lYzzjD 7ɾf,AӲ"ŏS$+P%"]Q3FwjaQ|@_Fqm|L&uvWpRF qvy3.+5]Eb`0\.&[IB&8?ّS,(ZQ+gM N1ð6%N,\CKpCh~[дhKTD=h/Dy(,7[Y^Qdت*(ijpݠ U!M)>9+J +>Oyd}jieS9dT|O6]0ӄY@L;5rΠuK5GZ̶A/\ )$S7fr~V +қQW8.q. |gU ,C0^ nE"J^+]8;HBhXR+'_UW: Y@uVU__ԸDy n/XXD=@m65w'Ǜ-Ugh]8i_9Fa\},܈κ 1cmtԚlA8+Q*pmK^:]_!yd2K qpdq +<>"XW;HQMIlr[g}Ҋ||('qy'(zmo$'J9w`DH w9]eSo7>(,0hڥ$ZԹջh"w1 V盺|VB,zKҚgbNFC +BZTNIf|P{#i-?acz$ SzRY~Zc\ͯy"6 Yc JOfP ^b,nȃɬ<'o5qTmu~Z]m0iR7P[=tJxǸ|'iz:ۉ&q]qRx^EH-5DC}ΟJ +sw^<YD~ sI6GTKDpa420Vсl1Dg$zB%e]s!Hg.^kc ש`Un<0êb/z(~z4 ɑl-l,k9_66ZŷwTպ +Y['wq9n6|Y’0HFJ႞CN岯-l4,郑`! \B93LMM|_ 5~v}&ۣbu<~hvQ~ԊuF2'ْ%-axH4L.rOq$e-q[J FϏ8.]Pϧ7^IRiwMgyN@P͔m#uD1`JS"p|uJp5λntTg>CIr ~^< +z#Z8$("hR"y:*!$7#"-DTCW4NHC^sބ%#D`uWiS Vj@ge:tBa\9ӎJ5oDXiDEKBC{ڸ +h' T9 ` WHޫG\ +p~hF7sދycjd_ֲw>a]̩i4 @,\W{BR;&[0G#l!I92H.2^~\vm׀ /qRW'o?nmf1gԼB>,UN1JWn}rʌ(6p꿝]KRtʅ2xXXU "g $+$.eXn}mMIފ[g4\p~vGTyrS2++z5m"覓(#s.E)!n,>xjl*p]rW"AmRo]]g2*~E5_qhw> >1~-q'vqq0= +cPFwi'S}i `_4+BHM'uJJ2IF ^) Ĺd5­|Mwɳ 찿2&D[kjs\\P~c _ nhv^sLF#+H4 riumxazOg9tOG~dT'?b` +S9\j(ڿ =f7!xphtp}r +P?P:";Y>}O 9P_C}m6ǒᖡHF.ӲzJ롓E֧,fY8#>"#(*ۛgʾ93 +XJIL +'cdXV$r|?ۇDYdlAy@ERbT*e^z!8y5w#U*O/w|igt?<\mظ2I t*ӀyzpFk:Ϩ~L~rQKWOP j2MY4H $Rny`iZpDZ1Ɯɾ#E \̽D q>i?3}Q2Fe\04>^'`=#l*QA4l63`>O}6{6-Rܷv>>2[ 4AMј1kd/p,B H]…vX)ζm[jY= D*Jñb}%q!jP^1'*<]#GfNJ%#7xL{ӡM 4咴ubIleDzC>%[&*v8OHGK~Ȧ2\ਁb+}tsBu{R@gB; \r\UBʀʜG Bg׹؁"ԹwߏO {=:?./ʢeB Y /&5qYم6)ReYfq xWivLs%x'IΧ$r]Z=6$= jkcaNjX L#ԟ'E +ڈ@,98)e'/ɭqb>2 e2iVY]~R\rk-[7H1oeH(Ƌj<32Q1j'MݬZw㒾eo*Q~P ++\%/GkEK`;H^S\rRD`OgȺ+I#(S=:ᕃr rҍzA"A:ύ&l1MP<:k*D`ߊã-Rx4SYջDBR o=W|[WپuZq7&Of08iyomu(,6)j mT/IAx01YwB&CRA#ل7N]OqMniQ/KO0Rt;FM6L<ˆ>icA1vu`ekx@'uI^GC dP:ٷ29\,Iȯi fdƀYN,3/DiꪰG\dO*8Ɋ"⋜gҮџPM1# bVnb9+J(XN ReHI4zixGއ(-fPU$RCŞ7I}dF쾍ot3B)ٽ=UT5'tLT\H99BF1r%ۑ5yV%_,BtU٦hQ0/yL9״@([ޫ(O&V#&jȝ''Ty8pE"S~i 4ݕ(^./'v$-ًj~;nb XL9_aܤ+AL,@YEHTV"#3U1ܭo?CzL;aSuHQ U'zuVb)O\Ǎ٨3 LGYhE 7ܮs AmS/cQONf$>@x38&lkkI+;еSqjnZhQ70"R0KzH~д[6oD9q DeVJ G >6g}&Fr =FG2Г!W^+ѕNph#t)q\cg27(A|Qh`͢5bOQ#p&8fFz!~0bH>iFq([?gU2B*sj]ӢHև% +e6j# ߩ'NҦ5"T vL9!._i:˝ܔVu U +BP(y:JQl_p͖| 6~S +![Ӗ"S #g:k޴%dd`ĎOgj.69a A~ "zN6-:Hp :ӿwBVO}y8'<@ŰeD~uo.ܥPmH =8Qw0L6Aẃϔdq[P9,(pJjK8s6 ۡf@GZ#>s6"Khܯ" ۧd`m3rХm'%9zQbĀJf&HfV,d9&f +s :S= *̰IWL<^:qqW`KϷX6D72X)l*XEsnɹt}e񎸔&j*lս7p + NMfǙtPbMK2qjel/ѪL>-S+ A׵p\#+` +!OZcYJS H)95G2<tpvCJWTM>;#&JԉhD]ɤ;SworD‰o@vt^/y+v`ip49QJ.MPi"@R?V p.WqMўu/.v҅r;+_kkANc%\'DŽE_^[[fȀNLzHCeoN, lB(ԱiM9Y["R,)VɣQD|w֫uymlN>XeCqCN9>T(:k{h+Mm-=SsOwVPзZ7.'I%քxOaDH@Ŵ8B}D*HVC +֓='zY4XL_(,f,jO郿2BŁLmOҪpf-E-~[m_5? 4Of5gBAv3In78dj+2 Ǹa3)n"2G}i5E9.s`}w_h}h#v :(]S͓PO3׃sLJ'1A+0?#AF\kvxJ?ci.Nk~cya%I';l\{ԏE(W JݵqTfZ 7wQA"^17PJ Y)=|TJ&!h&̳ï*+ᐋfOc*$a'rY۝؞n!w~8X,jȻxj6{`6hɔqj:vOvtԴ5UÖ́_ Z8B=a)Z. < Pe3hE҇fq%Uhu*S F ZOP>@tX(pEY 0#J?t> endobj 3289 0 obj <> endobj 3290 0 obj <> endobj 3282 0 obj <>stream +HWnF} I^x7ȃ@;F5$nF<(گ{9-v˩SU_ZpB ?ZKśz7,~^|]_+dm?~AkcZytZ RJ~Z\?7 | +fƿUMhM4kM ?j[mT \ ~^oVW{cubxZWZm+㰌| +/N5ߪW.~X9]{s67xOߝUl0bGXv=l퀞1¨ѵt0ͺaOSaid +xzu894ko% P1쉈qhs36 BFo۶14"@Ξ#E0SFF Vp29 )CKt)+Ym#7D 4ϛ۶7 o#꼔 1b&c1*b`^ A##ۿ6OKRkJP// s( ϟ>YPkE㶨SF3jh3}.t~}Т}7㌕%Dh,d5N=EQQ@܌(*Kf2(NYaKx)/f3<hDr}, i^XQnBE(@]."'W [mTEQmaC|y@[ +Վj\,AM IX9),Cr'^*62mq?{;iTng:BATr,nK8=k*!e+X7!/$JgmSU1\8ܷ$kEI;L(CᝨI[[C"3yQ)W} +32yۮ۾_;)|""+~neT+o& +=I] BQhY# Cvk&`Xx~%vTZ2Z=җ69.$c3N9YRV.]I66),<ۤ$dFm섶 :Uoh`PY1RuKb|<I:"veb,SY!Znbŧ\z}7T)opHEi+.>bK˵g|b,'؈b,)Ͷo90A4܂@`gREYn1|*edOb fMSM[_<0N>5!#nnpdRB3~("屬EXۿ.HAt)R,8æ2Cbsg"(/kyEg.O]Gdac7uf2uN6 $vqM"]621^N@emtޤO =`]#[cc}[T׎cC5ɅIkъXXiS/ 6:mq/pz>J uq_V2| ++Q:ew~1(leQ$oǮ`? endstream endobj 3286 0 obj <>stream +0 c@&F cRK-GG=M_pP)DOKj/yȸClւ|ET6J"+Gz7BT= 2Q@>yuC'zz=LAǸ V?ꆟ6v|ۻQxU쬄ESߊ&=*&mp 21TҽDa.+vzHQ"OnFoXݷ8 +}Jqma;~@Fsn&Wb|};F~Zj֗:|߰ aS'%ɻZW.Q }yl=PjNǨf3b.qj E&FJ^X/m;NzaTʃ[ +rhm<S.8SV:Da2̮Oq-66 8my'V2QƺUD0MdnI\wKM@!ĒRG9 ?B>Qy"5$6@`+٫lMu&kf`5 XEV/bYBroeap\@Û(ob\QZgni4O-vP1܆c6Pl2_dQȚ w҆r3q}!Zgx猸4aK>Q9rˁa,q$ aP:)̥*i'ut5:~FWKä(% +%5xAG2 +{F PN)2z|ڦ F57r͜:r<>@3W$b+ NmPTll 7ϊzڴTyCs\QƮo(XQfqfl1\F5#!,SQE>xx?Mv P:@ Y̚y N]Q9}Y2Do_ +~<6MNm-->%:*SI-4L6sK˽"^UZQáYI!z9I*1MS.Uk1dm3^*v?Ƿ #JoWG,Gx.=Y_Dig +cuJ8s+ր֙+Kv1"-agAT/&рW@%&3В8֭'P%*-@X]M//kgQR=IFq-#^ˢ˥n >y>xe4D8zq}&|46FIM"òR1^6s{TvMN ) Şv[=~Y@yr !y7冡 ٳ?sl#jyG6* yˎqy9WHdX{Ɂ;"{@aQGGx7]z[dH*nk] d7t?%W3'IMxdj Ȓ`?=D5'&9&!/_ofωd!J!nZ!Й>z<uNuݛc[3Z˕?jːv]ᛙRф.Oj)֡r/d`@Va+GC?d@|Bwړ<6m- +vuW?B<Ϣk+2wn0t7m7Pq9~`3`eJ xkN8`~Ȁx D$zÎWe4FLÄ$Jl'9V|{ye5+V|\+vmօUX"{UUGKC;FQՠE(ȣ hS^m$okLmﳃ'I΅]_ֱKgeC>"̧Jvǀ2{h +)65*R3HA008:qQӖ`CI4g+fZ D2ХSc~SwA3xӲyK1 +L<"H/[Hf;{%4]{_rkz cRxR1׋c<HrZ轘G p=*:vZWءom>9_Ǻ6 +5ps!H7 P |>F8af/4e;"Sb@պK8)e-(=2TUVxan#ENo^N:NUٕ&@dQmV #+ޮee(u샱hF(iH_x"hvsr% !pMwڶuX8R ͮad#K' +i}@:,Izߡ >MtH{Tyw2?˃%ySpŲmnE@/v+"d Ro۹) N7|UܱH +0#A!tj&X-<\H1eTTvWОiY:Bee¸ oםpt:d"xEi, 9>5.n'9U2W_Q C-y; I3zu286'%vnZdn d޷R[OmeA{e~N{HJv `!֐5f37"FCx4 +DK"]("bwIHAo1H"^i}%iqeA +^&cx㫨;w^{ ?ƅU;$Ͱ?ihH Ve.L%&"L7 Wz\O#Ѫftn#HϛTݤ"O[7+o8Wzϸ/@dS+mSFX8ՏE=V&.,DtM^0څ5LxFz8, ,*ijq =[ה|ز%WժXbqs{MԄ>`gƵJaџe%Dɨ> + v>/rA tDrp,d8H/2SH'U@Jf-c^f:<[ ^JYWN=8$LyKWڿb9Dl@ 5]Vh(#ώGo*j^l9@{>gVuGňS|lU_낣R2ߓ[sfgr@TȐà*e f}e9s#Jb9QU~YV|YTfUa i +* + QDL`?UR!qA1o[었7 ̨P_޺!$5w7MDU"n-:rUN>tTG2FYzף0;|mlKL*|yf}}ԫԇ&W`pwa4n͟*kJTbc *Hϓuֈj @Y); ?X}{AIwnxN҂_Ya[_h T)с YלĿ0FܯfOe0-FnRLH?n`J1חZF 8,n{|z|'+b0qG3auȵ4}F+55YHǢ x|a(>w~ !/c$ky\ dɮFaQ#9} nTq%By] +g"+|]5zh"$z= J-؆5LxW'u /VVs g29뙡cL1hWVjvu9@Tm"j2 lfdE%Dc{n^3! d!v'&( V4bЋm -'dms| X#f$˜ `@ aޘ cXyD*͛ <VKeaXZKo(JmRI4~MȰ[/r!LL6,BR_ڵFZdvuru ęUVWll I&:&.H-(u(vKeS[b?iQۘ`dӌ ʍ +54qZ~ZGWs^;E;瓬͝5dՋ91Ӛht=AOJ $kf VŚ F?XZv΂>Chf-r;nLR;,jݣy! :=8\zVLXI ]a"srPK#Crxqi9oFaev]? YwZT;8&FdU €E՘;vUv{m/ĠyBAWTƬ}x6k=7I@\<c(7gcnP6 OT>;4硯O] 8_h W jV= uNq7'Ά;G%yŇ]{lC-eR.흓hF* #i]Tױꁪ0ROAKOvN!ȷGPpAK@^e{Ò6خOuw@2`|}R`s.-kG-ˬYg8zg/-T>]RYk$J1>-ī9:Yes0 ^1Ƶ1W*&OO]Yĵ&1l:/C3[{U*qF2<,1K >c7_%eZJ5>O +7q=Rv'6pA6zKG% +VqCTj T'5F*/_9(EsveTY,<y=2"Q*TMsSV`^* N񽵜5yymr~#[{pnGbgޢt/6;`TA(Ь,"xXL[$7ʌEHE" ŽoLmxu L#qANJkc|+v05eJ49$PSPwRғKQN\?9[bז۲UfLz_(0592.z&qGu2C n~2'6Il7޹Q*EfT|dFFɲ8mn+ h:'&1;Ù> l*P`wL'P`Ki_gr, ]3"heVRbjz [I*a]: ~frfWJZ AX3wihlYNщlyNi&sfeȽtL4$qf7K8M/ {e2tٜO;ZQljS[q*'V]ĸyYS AASKi; + ?0䪼 FTCRĿYVW[2\߈u5V?}} Q=L])wbB9W vjѼi2iL&zdw3K2W0"7>4q1LκV+@v?8学}G~8YPb `5#l"'@2as]mh"nk*X%~WFhNF`ͽAAǘ+Xoh&Lrﭣ!t\Sy`n x_8&d+ '/+|qmaDRERW쭚F0f~]L #߉E`;v $V&y6O&E ~ƣ-m(ڷ(YȾg^8TH7dѐO"cKo@9OVꚕ\97x e߹U3s?|ЩNN/;Yhw -,U=QS+DKE!@1] #_0Grl7]%}Ge< *<@h[/-WPJؓę%n&t%]ͣ{oV ={$Skҏ I֞ۛ @q/\X < pq+vpgUf 'HKo0;%[Xܰ?+wS;VPA+s=EQcH[)l2t#@Ѭl-=XR5ޛ]E7D÷3Au߲mޫ;5}BFy^jXӆInsꔈt.,(<3 +TI +MiŠ?$BO +%'OĤ## c!zZIE捠O̐k6.!A׆B7Ή< ?^i_[6x-\Q,ל'gߍXRg8 +g2 k0[?OK~+w-#)~nZ3نk"-F29jOIAU,ora6L6@*}x9y5Q;fgkB4~RI**C#Jba{:tK#G Qx uX'( 7=X)!ςYzbwSJ%aCm^ /؊y&I"vgA>CMMRAVvؿKj]QGEvcO2\gjB fy'#^W+O0s*~c|aUk#y}`Ugo5@0ɇ⦔;Szc+7R+ExQ`g_'+TvwItjb-U/-2}+dsSt] quicլO *nڃ} +Cf"}퀏 1+c䂳ðZx\AY9a'q^0FW1mFPvR9i0j1H@Cl@%ŨjiL[Lk\#֏K3|w^Dm&WC_!KR0猜 +aK@t]f๰@:=C-.3r#$R3t.Kd)]-9ch䚯 +E{>ԑ?b9X*'V nҳ!Pw}]0O翆GҵsY["ctDcӭ.7y@ ,_u0UlڗQEc$3OJ)E"fE pp"B(΢w)e0K=Р΢5lܡZy(o$ܶky245 kT0RA= ,׭l&7ZQM iTM>LȚ[(EAn6s}.W20DGzp4Mczg.KHQ.+) !*03p)|nU&ohl~yZ /[xf~Qͦs2FDoaO5!Þ$! =?l)(EL˺ ʍ񬲙Kpm LܛS5MWdh_ $ +QkdTwQf^\&CkAڮg@Dr p~m%d+^gsu{wOӔfPju"g @l5P^bOE$ZR nd~ۨuuYX絕ɣAZT4~,(0\=]ޞ}|/$vluYQ3|i )цq|UijfDIw7;lH_5 TBX~ KWf\kW =ON4w:8I7n/Av;J8.t~HI e_{)L}7s3C۴!7g )`པ.8-% + y#jl̨s$N3|"-ַ~uHJa{KO4 d޿;؉yhov 785vL1-g"Jb$Jf(JCFVy\_IO{|jG˄ dQ5.r.y9şl}J>*xf + ^l֖g뷘ގnJP$Y+)9ܒP+^Žm|jlƠPM+F|Ȩ!݈?Dݭ#㹾)IS1I{30p CN6TB +K +`XBdBxMrvRxoM܉x;H8ykyOPH +J 3/"tQ1}v,3Ls?2d (r)Ⴚ@[^Paz0}z3oQ޷4;u&ŗn*c]' _z`8 ݼ=C B%V7)̰o2{/;{tܤj3n }]])vSIDH)XΆ#D3qVtJ)0DE|;^&6*5̅yܖ9Jrq6 t +z?`@ n?V-}.5 +h3Zs2VL٦K?QrԶɛ`uvB=L|tO*FD?;a(7aՂԒ⣊#/:>USi4>o`4ݎQ&o Oj8-8 ,zA$:3_X$9N԰:6.߉3hiiǤ9﯃P9d,YDj%> tVD!PbSXYT K ` ^GuNCf6mx8H*fm. &7xVj!bS6$^^IXfUMm{VDw=0,^2h;֒"ZUr9v3oMJ8̿-yu{&`Ц1vr,DO]WSR +騝P *E,Kԙn-Ĭֵa.`mݝm_ߐʁ\+odQtN~:\{(tD24jLY[#"XvQl#V5LX4쌵o:yp42e<{}>KJ=x Sa5=iF?|Xt9${KF{)IHO;XOWR D Kcj(F/pI]e4/cW7b{KQDjnn>~*N(J eS<0Kxp"PcMrĮ|輈W:`'uA$'LϾb|/k dod٬L1z]nc"OC֧P!Θ?+S&XA ʗ*_EDHPM'"-XO,sEV.'rȩ`8 +PJ~$C{~PzW[ 5= x&qu;p{cy 1F&ħjb86ƻEa";8h'hmAF;}mFpMycU4E)(ˊpyc%4*Sy17"P oDQ,ڷJ㊾@r(7Ov]w27~M%LhFP/Њ kA)tS~hI03#]6Na~Mhٹax0PXvJ?ޜIKGuwŏS4iH,P^W{M +O-K:tAPպ)-݈}yq?$&e"tOS= za=1^n߁et}eA"̩W5<5ywٺdiyhԨVCd+w$DSBK?3GIc?bc|If:Y;J2a)g~9#Lpǔ'6M.FsѼOoLz sM?.p_GGxp_dU2C`) u3QKLvGAI^˨ w -J6A̙͐S ,.t{PqLϪܯ5#I +̚6] J(ZT=>{ <Ҡy(nk%HH26 +rlYa&|q'-rT}ד\?(?"ց06ˎZ|n#ahB#nt2f9+5eM&;>nmHL`NOMqr?8A8d H!7^ZV@'])Qo&6~%PEA :ͱZؤ wݖf%@pvTQEqB]=dYSy?0STŐ }r;RZA#/km-> X oK{7/76|}'$A7f-rzamqj$%L' G[ +(ZTD: f4ùeڃ|ݕNq\<$ !^pzqXn`R@ל bm$- @]vWvPaB,[0FgڢO t)(>V> G!`an :N6S&ZxuD*#'K+_m?Xp7T鰍R +L1:A+y0Aga?VZł׍)CMl9HW/,/* kx +Qhѿ/ѱ)]&Xr64wr+yxPʮU}u,w/_MQyB46T|'n_T;1)`J@Kұn_)u17@ ggi\zɂUM?)EoDWV==2!E0~װP<`6l- umF.6)L˭ؠUOgD2m,~>9Ek Oo@|}u(SX%K %Xd-L~. n;Vz%rNBYuܱiV{/"L }a&gEA>yo%ҵuyZ}BB9d,N}nVT/&Ctr2b,,i*;Mw 9ļ[LWxX58˄ e:ߡr`X-"MB?Eb kV '>Ntֳ UDXwT]D&QĄ'%#mvGj + N~iie )L.CC+薐, nD>Md)cXo"?GyI2X~ ~ |ujG*uҶnvj^F8g(|}5Er7'USnDo䆙- +l +pH2hKPt#`f7Ƣjpl%v p]Lz`-o~$%D:w:pMK:S-VNb:f~KK]k@`&=Up&r6VɗFsYMJ)/ûg=c sH Խ)*UĮT 2 uɏ?2!pSQ -U3'' ;)?۹XL%m!8evWrjOw.q[ !';hs$e+Cjy>+T$f6 1kT*x`ƒ|zj|^`\HR\ zawr(:CI"8GPH{+O?> #W#-5"F:;m8)Pmd!LkIA9Jyʍ6yϧ-8$ ?7w9hx;Oݓg*~wkL7ђKH4' endstream endobj 3283 0 obj <> endobj 3284 0 obj <> endobj 3285 0 obj <> endobj 3277 0 obj <>stream +HܗKo<ڀc؃lY@bDD$G!):仧5Se,=ׯs!!RQ#RFOWtC=َ~]#vj#6]PB9'#1GDoU# apryɺW_| V>-=[R{[،u0ls3p7x]7|<5 ?kR7`zKuq}r'7"LkҢw D vC$LFvKp;߃v?Cj,?Gk3;ׁ;hsKf dn=hٹѐzCȮ + ,åDn~vVR#(az,f܏J5Y@9CTU8g&͉qE`@ǡ-, J8-tۃ|ze>.R''A9pFČ ) 9'Dq@`?R!axfI/]t a/}~جewvKQ쁬e-9]C # +ϕ }G9`OQ{_A$yS9I-5޽1=Z&il{=P Rq~]w +{%R RO͊`^;(LM@|d GDv:j1R2 +7U\>3Fܥ[cF9Q<dLY  #]4+=N`2qk}CxQ++@xL*Cf(a'YxQebb'7_N\//EE)EyoXm+8'd _ї9_۾mK"F4ÔZݟ>b`ОJ^x幽;P&*zc/`ʷ|H( +ZLc*S㈖vyך-?xшKd<lU*-9X +/Aȓw3w;$NB})!Pތ/$$a +J&0vjgJ$8`}9c뺚>CR&%m{E^ߛ"}62 -!7fZm.kVl-"9鼌{T(J}-.wױz|^-)E0MDL>`7L8Ȧ4cV>s~}xo^=+Q(n[Ō$fB\ m' `>grvy 8\ 2.pV -TS+cW!ueR@[$I``_gͦT[(QrWv30|)^Ţiу¾5WJ,4Eʓ0tЮ@aӌ~}( @JdfR-բ̨j8-"zg>Wd-K endstream endobj 3281 0 obj <>stream +0 D@&L  DujɊj!~sg/ʞxã6)Q*;$[-tLeϕxzjoVcB6弘vn^ ͗"9\oh0L?L:iM.A5+51_{ Ҿ-x/5n +`d1<z @bXy*YQk#TUCcK#>`֣@>e e*v >olv &c׫/ 1.$ŐY+B +(g~AS9qTyHqgnnj7bֺj7VsU=>[4'kz`0ޙ ZvG C^c@7{%,.}ܴHVmr\8d-oJY +Ȩki5na;6C$01rptKVd y4R$MX{=?ƯBڽIKb^ts6SA->b`$Yg"=nt/.Yxa!!v LKS9 5yc7-*҄cv֩ZCfX&*KV2DLǗꩫzQ }u^51ԚjwN̍hRQyu[8`J& T]݈*{EZm}vd}C`329"7w𵪓fMC#2ןrs:)5®\0D m+Y|Q@D7tKiU,~.QC*i ]Mop*[/qvE!M=]6;5d@jiD\¶~>N;M^^J% $o|[Z *X + m}ȩ:=dXU ū EA8hbN,g _M'Jѱ2mdǓS+kM5k۶{]oWAZRiwܒhWOcDc&^M:y454+%GBٷƬvp);{&D! SQOOTwfIY&ƽ M^lt'pl\rrrr垢WXlk܅$'tÛUaʃ=cuG$[Ix`e叨'SDI<%QE^/k~:n<+"UՕ`2QXIecâDɴ.evaƮ®aTq@vSՆ%S {a_ +'diK-OmBPyR$joDzt5A@H$}.0*ZcjgE=24sEQoilĠfu%$O-y~3tj?S>Up9e¶Jh4׀_LhZGeAeZ"w$pbz%Kx+Stk2t%&!NƹdU½|Z|iSߡo)-;x'_3q)$YȆk2LPx4yM|^uPKH2˴7g=bz.֤^ՠCoWz`N&@ȣ5=}f*wFTˎQh6n Mk^S<+ָks?B'|AV'UgFn dmGq[v t@md1|($fg;L 8rXL"8s23޾znϱn#d<\Bcp"|# gJ]'.2ՙQ ,M v*t,!s`Nx@b(#|#+NmwӢ7#ʛN075ɊQ#;wC#Ҧlp#Q3=kdغc#`Su{V;w5Z HD^u+{)jlcg{!YVZdǬY+r4J!l3OOg{YV oڻ91wzM^V;ŕ +6 B,>W^ Ѡ ĀΧIj,F~CcH?l+QXUUIt'ҍ_bzzp⨱}_LWY|$) '~jiPiʧ,;{3RٮCSтřc3$ Kk$yteRxiW$ ]%lkLՀb֥1hVqJw߽ϧknm>*EowVm%"0j% +~(/5$+,0P< V+ Q4|6^:\l؄}b h)*g,NnXiz15V0Sk᥎r-.>,nmuIf;uJ$Ms5Cbt΂#nu !`[4J%YWLlN7(_Q` rM: *; P)}* wu@X _RD~WAN_ыqKBӉjmN9/·W&{=ǡѷ$`&ڗSae"vF:Eф!߈Ӽ>(RNN)E56Z}*q',E0:U7)Je& !lX(A4[e +9ha}&WjKZFT}{ zY^}k9##2DW㓪o'PݶkG[@Jȑ9?*4S$l8R*OY€$?wLq=A4K?LML!StEyuzzjˋbˢY"s8DSح+4 KYK*&r~a~=y8RAJMDT̾  vG[K)jW=w=8Lµ}`aG N-Ȓ˛O̥v!rmL`$λIul $` +3,J7f-x6 ؠ-]='ӢU)SݟXnl2Q^jq^WŜ2`OkS=,}M:ჷw1g೅ѩ F)|?$8r!;5)SO&\;UnIwkf _Pև&,u/0H8J +"92Cb|v( p죃kk$C60_wr/yϸ_YdRrmk .lfΓf_7J' {\ Iw[)$\!ԟn1A\+KZ`!_'$;DX~QH-#ŵq„$UJMB*{Й8\ #H}dM @aş7!g»͡=x +0!m5i>*W nD,Ɂ,z=̭"%zԈƳ[-@RcpE0U0+rxlIq*rڞuB$Y@oi֛Kښg\o`np< 'ԌYMDuWF͈iC(ٸZR~ZRCJA$ ʙݎ%a8xY°34~ߓY!gɒ%2d I?j<" 6N-"" y'9xvD-s Z_5В#m >7 +!#f +|p6:N15S=0`;A*h,4y:};^]s:.\&;r~{W?z5 +=Ii0tx5$,CK_8 +ci} +o. 1D-'>U <Tіk,v@32WB'7V*2׀`Դ+,e W=\UuK$4~LY CxLdI1(Pi +u`d.]4WFuݖudAo (FlBKa׈l~DZ#vo)Z`c%yu-ĸ/i@JL +|D5<͆ɯ,)k30]妪UB앮$*S)D1 2qqX<hn<_HX;a7Gš[6~mM>v'xFSR+Zn_!hx5a*GǟCF7 +S]?d~(Bk8zA`ÆDO` YOz3Yڮ,ޞ&b:+w-.Tbq/,Ec/Ů@”@[ +T4̌Tı{Ί ?23 <շCfהH{gn n Q`/ +dߣ$ @x~!=_u$Kf ?f,x`}ms<Ə}F=4 `sf_ 5@0 +/sX+\ҤP}b 'X] Һf1ZxL'"Є+nHcejvBc9f`.jW|גfwef!`'/ L[h3𑭷&:|ڸw/ S$$羫vK`f'-OZA+SEL[ AKRc* &=a6eTHbC#<~EʰmPAp]([z"YgZ(?t4juLhY9JDmCySKL'eU0,Y)eF\2kS&dT7[XwZ>?I +3w6^P褐1`5Ec :i seHERc5pZBFPR(4:0S;TVsz 6(5: 'sAvunoJZs&ݸ GQ~,0P6oM"k'eT٩̜|I)I%Q7zq3}vrK_wAgHԼm|_vA qB֒ vVus:tq߻(X*ALd)}XH3zJлXy 1jV|lR)rJ\gm:/D} Uï]]n]Um;~"b#xR4KFs[ume:cQxǥ ]! *}t}wFTfl"QJ)`us&!ʛ`x&hVH&J_7!GY=Q_تBr +c\H'\s*R{͟5YolIaB4dAtH'#iN;y$+m.Gm-8zs _Tb>p%EƍYh&gU* ͥ[ Rkd#, fw +DikёB- ) P0[|[$nPu +t' 'Ο.#B-h  F\hMvFچ0MTL*8O`)G;wZB4]xX L|ۑRNӹaiZ=ؐ֓7rW̠A]#B[fF@'p{BR`zzQn”6/7/Md=dz *) PiȑV"=6svMAH]Ȱefq T*qj|xYt>Hj ⧡Cδʊ)4$Vu%3IWp@̮Z+4 +5Rӑ4ߔtP8nJHj,a@<u+ D6=8Y4TbP"h!sSpF 'y钻( Sz}\;Wx .} 0IL N"'9ï1Ã99ʭ;BB3艂*Yr~r5x&j3{H[]"Fe e^7!Dh%*R÷B$ag~MYD~YBo9Htd'0*?)V UV[i±je.rwo*ptEX?T, Yj X+G((O; +biS֕XrhKe <|^-!EW٫m&~gɇv'+N,RZ +m +iE44381\(e|x&%bJ2Jv[tJN01F\/o -7h_A(-B[|. 秾Vo!2C_M}J%R@p3?9ψިԒi]Dmm#CD}~}{U/HrKVd +R[ڇD<}g_5Uh^L>4n+m- +Vd \Fǩ8Nݷ f>/xYo5?u᣺4:g|2=AwSOXFd0|I:H.NTiSc»:14njr+VWF lyWy+Sf{3X]PJ՘٥ tUEحhW'3TUk'I{{C<5gE c-n &,\P^@t 듗9Dt7F-E3\V'SKq$࣐i`\S_1y`p[ aO Xo%Op"w:~ijm.%ĞܺQ=JP=IGIM2?SuN"+f0õi:|%x"p#/,ZBs! tZ|A,s5Ѡ^Uw&y7gتLE9)gc-fzB3L΅v. EDګ}tpRZGnVkQSC^ÛY=f+hWK^]?"i ),nb{VFW.iw;?igjϣX"˵AEK>1SE'{/d8Wv\ܣCIE*Cx\дݔ9ذh +JR%˓Y%+9;*u]~0LRhHjP2@d|4d4}vޫ9w܅AbVq,WV,%S`"+gzYqMк fG\g4`Ii^ 77sԇJ6S߮­H?#;|$\m _ S0pH9z< /ln$l#a9ZM`k۽&&p+wk+~ +V4)^8)0 \T(ą1Fhٖ!_XSxdĊ0AAf'i$'LtKJ[p~0#0r|=RuZs]"~<| (h"Fw6'JiU+6H!T_~=>jе"DfT.jYv7/w)eL>"hX> ҕɜBq-6)&ۅɤf37A2zK7sPcu0h 1ɿ9<3 )h bm(Ntӈ'A(c36ğ67oGibHWܴMq +ʦ4.pQь +Ҧ'W~c8ӭ +H*xkڹMnCICҡQ cIf۱Ki< +.r:NcjN̿/V5wM}J(HipFe@ z3S$>  2ׅIa Nz*O94ԋ φMyg^NBau|w0U{=kŒw'WUe_M ] : +U4 +pƶ,6Qm V ӝFCۜ|x3_H˪-YrgS + +9hGuHVV5Rgb4/.-@۱sNZO&gSԹغ,I|nM.r}3Zł@ Dw4UI\sIm L>xl/p}2:6?ݡ:;0\p(PN˧-|7y ;tRt@Gwʙ5@~Ŷޔk^(CbWȳիdpn}l$X/@ 6r86_qG9Y@Z ݤl)6^ƦZ}k4' +%EjLR6*tfG<Ƶ[C.=FO#L%p'8=oeRG^Z2ǘؓ/00s[I[ ν1<emM sqkȢJh*4k3~2ƣۓ #,LmkKek cAcbϣ[k/G>GwD;®p.Fqz4\]U .і!8oB:oěB^]7pߌ}߃_fOM})Ϛ'[:˞JLnozJq ~|ؘr I@hP;A|x8S`4&_.J2 n +.(mNi<-uwqpiI #5:Z"65 +(y2S+J C)VC:Q y +ЧR6I#@y̨0 ¢'YDy$oUHԹ)?6bn"D7eޘb&wl*5}f~ Z#AJ 7%K@S ^Eg&xSw:ǖ#> NCgO{Mh:.U|v͍4lb)>'Y\ӵLgf`By}$=IUҶehaCSJ(|o}tB <a!!_=l20MYcT2 hQl]Ӈ.\{fwa$4 ;nqlpiNÄGÊ`b=F"τ pi!vJ]%צl1SiaxwcW!b6C󙥾9}=޶,I)P<,04pWCB& +!X;iE^4BL ߦ/hG7.!t %9^/B_' p> .$CH+u*ogS!_TGIvO=z4kM,Ϭ~-Fr-{%&ڜ~SB(`_k*3I0 /zMF?8]Lije^V gx9RGze)cnOB]vCp e-Ik#({&ޒzatg֌3Hi^p4>&l_ +|XJAECҾ/v':.ژb<͞HڬFe67"O?5͹4M˿1$J&V@wCz/M-SDMA3 #ҳ' Nmƹ %M؈3;/ҳBH%AO!TuzM_?iC#=hQ Ne;캭PpQp^Mirs~Tiv +pcAcVuyQo'קx3 +nNvv(j!dH氯iB%15[ÉJ_Vn3A&ņu#_F6TM9>MCXAp"OO̴KLfh,ɉ/zɦJ({Ry5"LYў:, ;C3EQ!J9MWjF'dv_4U1Lfv095hԫ[:@dGQ4 %>-b2_F詀>M)ڏ_Tudg(W?L,%u6e%j2UeÆh E=6w +Ig{7y,TiXNx\4w .LSM\pb'C_gd䛂3ʗF:SCr8 ΂/}BDt^R̝<#-TNydU&: ǖ\hZ܈,`!C &&xDPZ=) c_fOdo; +rCwTaEjoML!1e$ LRډ͑96\,9m~/2*r#ZqGwl?" l_1*J%cD4>O';bvPIQlT<peS%& !2`A%3-KαL~7,y;WFOii17)J/%corިC4ft/Dj9w.T@9?Y]bdVE dMXGc72'rt=`DZ;_h;_h%#<^J])mu ,0qR2qb%19Z HstN"RFfWi/ß ,P6HjGlmIvaʏ3-̩E&nBx߻EpN%ͬCSHԹ=YGyy_hMF,;ǔF&)VgOvC5UcLk9̽q&O@kq~IM ~>Lg=5@ڜPD>Ë@a%x`\Q#g>oWW5`oE͘u]}`I! TlV h80"NHTs*#Gz4T&i9T`Ҝq@af} ?7}}lGfkqсY9&3}މ透.ܕIJVqTZ3 \Z|/f;kyD#íZrϘrj" +1v2*3O ?>Zb\!U }t{0 4zGTȪ1h液ܑs\jW9Sv9xdz7:8(F(@rرa+N;v'~0δ?hD!tƈZÔ D6"Y򨂕7 +?K!?E aV4%HpْFχ{"$x?V"+ ?}T]$oQ_Z4m & TtP@Ԗ˞ah[ FC :<ζOLkӑ@rŒ؏ҤI0ƨ!RSO&5_54 f-]FW[nr`f0, + *DI). KrcHM{W\6pCw+>kzl8}̲$ToCh}\k,^RxR%\_ 2iWrYAwaO.Aۻc z=:jTqT:DYT%^TM &]-b9x԰k4Jׁ!Q064¼pš2pGy(f ʱJCPOq@Da:.]azcl/BkRG#DZzERF;9,?dXui}7i6> Diݒ*YC2iq[* ^7(; ])p#ɲ+o8_"IcBG')lSckbskx6IB;t(q*k;%6z6!#tvwT9 Y Bg1 -˳U7^4G{ }ӷeݿu{o<0 1\VY3$i 0̽%D-˦2BNl WWҿgNd"k'YI[H_ rO7,!\yE KK2KAMޭ+ k7an27f4C1ۓ>bpM_zvpئNha0# x跆o &=.!0u2TfQLʙ8+ +pޭ!qPbѰG (A‹-CʷȷT}v(qH=&D$qW_LYC2ÒO]&0D#mzܠy@t}N;aI+̿9&QxS,`IR+1*&Aǰ+]18>@ؠ51p1!c! ्'1wuԃi ?1n5VDWoRp0=-%kRWy=EWoj Ԋm?1E,Kf8bnn Jksy1yߧ-H"mJ>{-n J$0/n}N֐Nq>-WwYj88l#80 kuGGLA4i!9RYvC-W 9v ~37E+C<5pX> endobj 3279 0 obj <> endobj 3280 0 obj <> endobj 3272 0 obj <>stream +HWyo_FG uhX+q.זyň. Xvw^gQi7n/,ٿ-P&bZrXX"'HPJۋgoVCϗI^#;xcx_ScN5~766|17/\j+硹tWY$ 'bbW>3㏺-wBhBM o*U؄?*d,=܏n pe(v5.N~_.7T+15ϒ +! -C7x.:[}9 e2xC jcyP?LτPD燻i (U14Bf,/ؔFxUnNSr]wؽ߶*kb^\19-ˋ Vjqm')鸀J Yhhm순6AMWq*}[n@UN4;@)%k5CȘ:$?خ}jp i (DDSNjCڠPVbMa"@BO5\z+aP88(tUdzƟZV5DPo! 73zpB٧:|6KYr,-V6_va${CG}_ui|~Ӎ\;8b27, Di49ZVcRqj>R)"P1ZU,B ,_6\rª[3ڏ%r8:t~D`3^Tp.5YpHlz|+~صC|( >_OJE* X&WRdiTy̻\wKIW}?]35=L}U)KJN`z<$ ܻ2[ Ўqy,^@jzn +a R{hnlK쒕;H<ZH~wNe386!ƊIW{ +nwg tGEׄ`}j/z XB,u7}Ylql4nr +JY3 ^wm]h*55)x%NawklvӆchScaWe%0L}54{d\= +wf*e0YwڇU{W:]F2Q78X +)\sŰ=$a06:JDK;wjAHpķ+ S 2f^N$|^)T(Y+8)(0:^_C=/KWr,WF s׀Vcv#,|u2.҉7B_yج= +mMw@GWÂvUQslmS&*ȥ$dvRD vr봚ZK\SUAA_c{L1 &BZNԲ r0~ծ? 턃! ´ or;Y sIJX^_HdYim?hpnT\]H&9cWV$2qiĴ#P}?G4 O +&$MͧB)ydDV > z3̕ +2,4Q-$/{p"X"Le&,;,408R82QOL"I͇ +QZPiHa聹*?eB(U?WۡmOR/8mKꒀ3xۍe %D|O0[c[{Kv%E=Ufn}Vx-B{@qkuyj),E +v@[Q lfh1`kd&T#jj-߯5byׁo`^ό>8xD$:]\0Uۭ{W +:]m4+?^^59L6 jvɇ+&N;:WzgojQJޔMnS@699].TNA^Naڬh +ӂ ]5>hJ|SZ HtĆ }w)wliq=pg~T;",T]wmsJ Xe LD38?,H8Gt] -(GWf !z~0jm֏ *a|4^x9 syp0ie2iCxU3F& B)Os@p$ +XDJ=nֿ(htq MagM/Đ"suYPgK8QP|s!E@GTԃMa@~VЧ +$^-EoolV6DHϺqfmO]֋ +g{ADxXЍ**VEZ]%mBtZ+5MX09+ ȊI v}.Ga8ĩG䔴MC vxʗɉcD +}ڏmI*=/P!Graq9-ش5857t4Yi99 )·i8;KAwul ("Nzװ/p027vcY^TԦmi>ĩ=l>ffM&,M[f,Y+m$C#ZM,Ef}MʅKOi}|%x#%@s]3Nն4=cMvczêGSy2)9sR5[)M,a㏼/T6!Öq c+y0L>1t+tC6m2Ity @y}SRa`7˵ŵ9dF買 +,f{ڻ{!UbE.6ة-i9.3.뾽WS@c00 +f {?2WYh4>X!dT) S^ endstream endobj 3276 0 obj <>stream +0 H@&] HB V ;'-2$ @jPGJ]thO=&~hP_bm +N>`~~tߧ=ߣlLwFNz5ݱD[E񮟤zk9_/]qB q4_$˕P!p|[9`4о"oaBuDzPk/hWM0J)Z6W>&@lZսBg$QalQGr}a΃'ch/8jOܞYiHpe.CmkϞM):rL{II ># clAwY<pVTdJ_.:3R0{SOlBZl8}*=H.ܣ&3Z5Ma Vs"c>8q@V .'/VozF(UAYF90{鿖ԅŒHz% `a\D 8f S5gd90"s=@fS(%T.\Cv52,FCa|z%_;n, 5|QtHc` E܆Y |X=YAhQ(T -~p*6 =<_3dHRR""L1HN,d<r~V}[) 蔩*TpCGAP< J<%cI@C&7F +Z"e߹T(4|ڡcAf8%CuO9Un+[8`IÝ,Fu7GA XBD.$j Dkhij>W[RHO@K"H-i#(ʔlDВRt#3oGcϠ#(nA&qVD'꨸gH̊{c睢8tA?mkdIVg \H$-`. + Z-2K[(~6fb0CR=vE"hZ^+`/_AUh1$Th 7]-_2fC$VO +Pbso> +4 Ste5㭙@ֺ+?VTj5-Z5=ɣEL3Q)z&9ن3(;\ܣTry@i#fTݴu5D0R 2~Kj*"|uԓoj)5 !j76,Ai@"9d|xKzcq9[*Ѥd69==t 5EApf<ې;9r:_R#Q#_D?Ϟ>D];״ +a͛8>HFΖM86\q[fe/3.o :@PE1(zR%Yd p"Ӹ@rP2,Fs!g0c<#5vo`>4I h'7d:!?K6ÂVd.9mg) +oPwiLnOG'.`g_]d[(yjL Z |tz>ʢ—O L`ȇ+F>UF|k_w꽽5j +96!=TB >ZT:Tǫ1X{.˧qJ}A5,-n,O s`V mg` 3g ~~8woc>miP +=thr*:kgŀ(c9S'|]7.Z, cS C(pßEl˅7e_kE?i&+ґ(8s[NЗù&& )%hdHꗥr#G]on8塀69""Gm5I!0s%NşB[@RB=Ai1~ZJ/ړW'WROD Ulw Hrw +@%PNKGãЉ +;Ie-2#=΋Ȧk)1Y5MDsP"}S L}3#jjƪ>>kJQoKw.m~Pr䐿'D`¯)x9G"3oX 68v-,.SsUC9n1_mj&DSI]q"+ht1]Kd;E1IvPѕ4coK* +e ˑBb+~zdc3;`v,d)гIh>۵Hos>wvJs(3, o/w.nGL0vC$ +;,b\(1bvsf"a:ryC4݃=y}D;!u]cX#[,иԶ#^: ^"sSX~mΆ ,6}{\/wG^ߗ P "SY4B@'i3v_ohx1*:Z \bcW}4F%ђX}STઽCvǦ3k@ʚ#=M%CC OL)2 Y zՏ⽸('h'SlZ(|h]>] 2$\7K7ت+yB-!KǴ}IyﺫRWOtڸIC?hALqtSh4]zR.bڻ_M\2k(%7rCd`оZ7i; uļRz*B/9=ʽhC1nHɐ?;Jz)=SLfXjk=-*9A y +k a,I +zXC\ ,fvS@U$6}!-½7p$AhX1ca#bK ` +)^s^i$jk?:'h}fHzOHgVYb@aXPISl# +vlLIoUBs[/eNz"V3IX.`l\mwkDh:Q5QAǪ78FÜ> FLj@ϒ>bBɧDj:M傤uZ{`J >OW(%MbYeL:PLP +mtvak3`Z=0t,4>FQ<ojP "(n_'Ў|6󃥚Mt1'coЪu,_SFAӹF0">\l*2*9I%6hz{6 O8esyjJ'dYB.8#L(kסk4=r>{rs}2qe2y5H?ۮ"B#]˟ +"L136WW07te +s,Q4vgr<+6V9™Д/42(}"0$Q芞PCFV2 ۛK*vŋi[YrMCnοJj;=/KC:?iϤ^9zdઊ=)D$!u ? KJyŀe{[OcȞۻ ZśsCtBIJ0Z,2lF7wpV]3tA)ɆA|d1}Ξ.PtQp3Q~z|"ةK487U/Z;yI(`Ӫk]dGVe+Q4s_5F+^K}~Ԯx=0}fRI>lGE%cdZp*ˤ+pe*I:47R?SJ !i3%yZ$̘Eۭ\I>T r/,, J< ɦ|?`~c9؇48ė0W#>  .Rݘ& EϟQHP  Ƕ09qVt)>R,dDŴ@%.<\8U[yh5QdfX{wBWHe!)lt"AVPԛwD PUx +ךގ Dvq}Y"ճ4N 8-2OG'Q6ƿD9rjauvt,e>R<:l(֍\sCqYS/& Bg&ڵ_-`-XSC}r6[֐tu,@l*Ġp++B0$9P>׆hN`f D\TeV3-GSy)k&4(:1Fxg},g $K^\R?D/K2HUu- + Lh]Ir%'qe-N$"?n3`yHh_}ָQ;@54yPsDfÍ?ېn f:`s~cg1 ʍz;hĿ5\KI=L\S"edN5p/^&uy9;$<1M}^ IAWeZj}E4th`^S_C\>O كFDZڙkf'0I$.l",븷͵mԗ\s]j׭f7b8vA~!Q ᰵpApQVT*=ɏV[q†ʁ ٕPy\R/ Āb=öW]<6r8bp1sPQ62J $Q B2SU[@̥}~^v 1ն.¢$ܬ_r]XRFF{tdE]Sl4~.ҙr밳wd"2Ekm70$uo&4di{g4J?x^5\RިY[Dr]q?:B +Z0B9_1ѼEo 2vk\###% DJKiJ[ͯX!USRN!5S$ݳF -/%aL F)뢿vzo^b\?.X䝿[_n FKbikDk:||{ EnmfDLS>HU(f?6,w@kj=6 ڽ Z~L5M ~65((X"g5@d䳪f Уˏm[p8rt"Ƨ_8E T{ fH-]a6k%ϴgəC9-Ytݠ:3K-Z+EbL|L2EZL\>қ^p{/V$WVTo0yDc˅ʸ ;:E E9MXE1G0l㒀eu'{.gprDy{\߃~ui$5DfӲ(|ZQZ*R/FjBb`5k`d KM6S;I|gKV؊uBDMs,:y`.pY];_w|zZ{ +$i&8bFۋHc7d$5+pU$s+I5'Ij}gjRnkrYk~YpAco36unu+Mԛwc#r{{@Akۺ4~-l}R8 I3F\Ub1d_N1,ey//)`}?A8& +zABg ҈B|vK `_"cq12N/o~'jհ gvZT艅u\X :9(9^e)+.xNO|u}/@"v{!?edW >f)VP0!ݐU@lPL̥ +,kr~Gż8+CH󖯡Yɷu.Qr:wYAFE[1`[Ls^Y9cœ5}k/Ӊp^e0IӔ#pObIޣ;%)ds#x6W`GP?G +!I !vɞB;GǷ|OvEU\E_ϳj.)APmdnI6ɔ~O@J]GaQTXZGtzeB005i2f-QiP78'{HbWxӨ^6m a{EEFj}&8&W +bۃ)hJU1nNa(̌mF/3JOek}D4)㥛Y>FsF@b+OݠsK kc=sp\NhbGW,>/Ì +`ψ}Y@{k2ĢBko0HNNc(xMuF?XbguQΗ<b5Tڦ(n29Jd&B/^-$a#Y1 +0 hsWu| +/ ?:5S彭#r.L[HX6hcuȧ%ld1mdR فW k; cEzDDx/-F(^a*]l{>V# w4v Y6I=:ŸO*kT,.?vW2b#!v.D$2;z'+v=,(DANE7t|G)$i-;ڽGBnohk:RLkc䏰#C>KG7ׅ^5=*L]mc^Ȁ{[qftMvAQ)t45e hw h2ki=*yNU?>eOwBofvP$V`NI"%Ax$^T'"]I8~ 𛌲8mu랔 Zӭ_Xnk:U+'.ؚsM9Y&g|RxdذbQb܏Ug7Px0öd'6/di 2*b+K7au~VDKnY+Q~7r8U+iKK +OkHE.4suG,v|QsY GIzIv=PoGl4 \C|Y>0ړ m_LupS90ٕ v]#W뵷"(:&O#2|\ҟ1hR`a}qCj#̅Nm9mX/SXo(5 ֩$t|!ݶP+Ob_|ch9pv(++56?T䮝wI1N͎z1]zl}nRVEɌ잉xؼ;zɋ&\_'37j]<^_[^ҵFl/~$Vt&,\NWBim;Vg4QJC=cr"jDQ"i|{hC,a̓W%8"~TYr67'KNĺ{?FX4[لߖ7?I\bU̔@bߏN3Poqd +uǒ"Ltk0jwB|=Ɵ#ߵ;D!c܀ɓN  2֡jO3l{b׌<uӬ)j#Rc4Y-RTigQ=L1AgSc$ShRWm n@Їf _ ; z1{w3 Qy l +V.F[dujr9o3z:$'t$*'[ܮë7~^]m8zs,hYi xeů (Yk ,<"_%',,"nagмUK,[6@}Sq\ fdɖ LNymuwqhB ɘlќ.joQ xziCPfMuOvp;V);2}|Y6Yu9bW`k +4:)/ޅ8 )ua/Y{*;&L /~._Kﶴw +_<`ͅ&iGZڀqyZ9 zvXH& Y]|iq-ecZ:k@t5ObLQ-F8Nq-8z_ş7s1O!|ƝWP7?qN< ȸ'=qvwlI$ gJv\0H NzFqlKUpCbfM>zHG N:2X ;(2h%yE#ylGj8ݼFmLWW:ն3k>1 +[+voi!]haoG)Z9#:iGeB)u&ʢ?I1&ENg(yeo_h>Ip댖;nhy 29MO$}O3/> ri҈Fr;2F2uJD0SjrPwunr!茘lusYImi]ѷ$Xl+%FZLu5b[P{x=j&W}3)pIZ+]0PMBf_TJ=$7O'2H*\TQr~UTYb*A tNqdG;YܔeYP)P2ɟ<܂{cko+IX)RMEgٻ>e^hȐU(p  a̙8jor_~"Wy@ oa.e-okЭꑑΤݿ`?BufCt+vK6LNacQMQGf=g5⏡]N(==!;`7nfEOtv=QTbótf(<}}>ujz2 ߬E>(Dl4Sw`/whn?WYY#"x$pt'TЇp%8P§p CEz{6j U/)$\gbWՇRHq[#w +~lO\8BLأ BCCؗ\G<6^b,*>v:Zn!ۄ2&AA.ǽF ` Zvӟq~őT|-ZIp +uɎ! =# ҀdßBjUq6zlPs(m H $/y3)p4Ȧj⶘bdwJbg&K/j/%ŎyfD6Z$:=wGMHDmQTiJmkw\h;EaN)ž~}hTec;bIGOo=י#pI1| npHТ CzD1NT6$<0K1ٵLw)0*DQ]b{Iwj (anLivVzqAXQM OhD ;gz6XClEI'Ϣ($*mMt@jD_J:.^si$xNKݠn#XăW*= Tl'<Ǥ$J|u)]x@Xdi͌>/^/\;ZqjC}(fOuto޳a-q4cُK-&)h!kU1JT@/,ѫ1XnCDե "9x@f`n]H;k&$S׏ʐ!e!2 zٜR0`VDx̺oިtNX5k؄L/w:ZL3e)ܪMJFĞB:$jC-ǗҦ([?-.FA>jZ(&iF^4 ;@,~ѼBt:I0ij2y7Ul\TAM_zW*+Ͻ6#^FA  >T;S(oL mQ) jڒhP9y -y=xftd H+%19ͳC; !EywϰkE^ݗ6ZIe[N+Wp3N(\X_GGqk x9ul(47h?nx7m⛲ [iP=p~Ŵhe5=;5X^AMr%BGpC69a# ٨zV|'@h F{vfGth<@Ll7Rjv;ayx29c{a. 叚y(@J5A>*M؆Ps# uZb]ʈ,w ""ӪӚRYȽ 0j2x&軨Nj.}5g2G|,kK"}7g{pmG<1EVsrC{1TlC~)0\c˔7-L9*ĝ%pYE>%$3<+"azMT>,pko8ie0(>}R8YM%" }V4B+ Qjt`gA*$ +UZƅZs: :; +_oUd + nVlT#"dguh(Kvi&^MϭO΃sI )-ɉL zD𲽴 ;3,TDJk3!zG-l@$/ƳpӅa;]NFctvO\Em "{Ħ}mVTMnݙcDHs\;՜V19n}"u9̝ͦ\-D,]u b g(#ͦ'%JΥ'-pR9a͚2VXCz&Z`zd"L}2mcSnYNeמ.BHHoު͇'а3PH9^9Ar 3ƎEFX߉|&m!{,6"ncU<72_1/{7&7Ey~ۊ3%B'Jw "Q')jȌ"ڞ!9 + wQX٬&BPV\b +1JgC"8OaEaIvα @@-XQCk'V)uƧ(S:C(WnU` 4M%5Fqx 374)@/I.1UgBP ^[kDHb|>D!:ZXc _k]🗺\/[mł;`~VJAI0tK`. +[,Q - +fFҀE,W +ڦ܂#82p$Y)J<ffȤ e0Ab>u!eva L13Wcd79P^@N:D¿cwA~VТO[?]Cvy +͆qH2 Rq6y!R4+ X o*;qYL1tCo\Uw +~=E-=׽Rii1zpc̻8[6Kk Oݍ*lԈvwr}hᲪ &5#ДtC*Ld|L=Y&>HLVnaBJGU+ cPk^ZYʏ 0B-[a 8=MU,^:%``\2XTzn?QIbȂʈȥaT;;|cLNK!b rND6>08AdۑOkwN 5o2FPR +Es$1HA[Ov6]JQ*浻2AxL>x0F=]SvN>k46ʹ-HFI`Õ1q͊}8KtFr>ogj7!qS( +zMҤDv]bL(T ps~PlQ,:uJԳ+.qcX$7[_39 B1q=\|0&i͡5odc%C>cvv JcfI¢{C}Uû^at3u~ZIYF.F8;ԁ yKh5_؄ΘsJDK47ؙvh 7xjMhH+BY2R[zMV7L%LJܧ0R\ k!$}MkM9[ICR\4eDƂsr0t`NR{2҅ ByV[2 )7Q' wp-3;{ Xx94y.9I⮴./ȝ17sRzJ.@-׊e5ѼuYkͬyhoŷy{߁,hdD54i&@ayj)JSٞ|~3NK4|VfYMZ;F!?"Oon}?==p RMYPVGyDed^2T8U]1Xȑ 3k~(z Y(;pv.fϠ0j3ZKvZ7hZ"/DHtm9ۙdBʰ&)j~"vW8p^Uv"=,\b!FoKz$چwˉ|y}:v+b " G,y`v0L;!P@ c9iFj'|Jrh +\!*RE{Niۗ2|=2Bev1 ƹOf*+R' ܰ2m_;[XO6/9A@-{gi/ _B&w`4L 7!^ cÛRd#R9P;>߈i +Pi59*L(<oя Ɂ(N~ځrXq$+jMYq3萸S/Ix!s2&9„ܢdE'3q-t(HS7XHgc ߹U4,z=U +Ě0e3t? {R~j&,-$ua^F h(o쓦/LTNOvUnz1LZ[cmT?AVm_fX52ZLO{nz9>dcWb ^{Z vN5xdӓCڏ,JQo9\wßjSB&CGѓ)a"(s6GXEv$;@,)96ZMgj9U>ޘal^'XWBNHo~茭?6Y!L 2K"#/E٬=P LP"`"f8b@nEL9g`ci2)\!"ìWkd.GdiZ;;CS9֦ĒyQF4GޑisТvd?R7@QRCeg#PdСKvU ؝5*-;Q-%9 Q:Y) 9h/o|2/'MĤ-tHfU& {(^2 zd->k΍fqoz+.g2}L *k};NOT\_r1ґ#oR:^G̲Ӣk;ᕬ8 >RiR "Baǐ\`Hi>q(W7BIU?jjJ ֱf8Zdw#miG{bj6ZRYu<'UPdr1ݮhy-Kh9_p-2ݷ +NdGƜ75[/E1~a|s`7B8&κ)p~f7XHΰ*4M6PP)*Br c!u[ӱ3$?K&(\H_Nm 作M}M5+~eئbCOZTx>jZ2o.}m#VD"<~HJdq鹃Cb'+OB䒠;U;B5SiO]%p2NQUF ukMa>K>B!qӫ9IW-Q1p FPI–K/e +GYph&ڪ(oܶ :OZW(s>X#fUǴT/\j: ;+˵bD| +ϒ9l3#eL^7, $XQY49 4sd3*@nBn0 +Ī&#rGp1Dm%ۡ(:J/ ZtS5(;gJwoؑOe5ŭ 2$ȏE!:"_ϝ8,4*u+=r޹tGb3%cUS[TA8q溗/zNo]PxcI,FۋPd19_jYCɊ8X ^PZj 7 - \PD=I7MKvUĿXiKeD8B_'`.P`ZCfcd\ o|pҘD*e Ýۡ=BG GM Ϡet8^+7 82N!V޼X2&,aD2:CɤjdU!1Iꯏ]=s:ŗ%YmkGiF˗#CXN~>=`,pB"C'gL刻xTi$9bX*CE^ +Lgi+fO7?5?,ʝ.wGOh͇ Y^-^T/'ߨ#Ĩ*׎[dֹaشBp7Hhyx :F:[( @Y lf3\,u;X9Ha7( +شZ{ ηA% n^_#a쫋fA{y#8qe/qul(5PFͩO4!RK@ap5@Ze Q?]fˮy?%\G?\$!`^F'Z >@&FD9[-b ˜z2dWOA:E 7?G6P-5ta@Ꮔig6i:O +.QډWrf:ZGO\~8> +CSp3?Btx1-=Dn+A.nA&d<@(ѩ(0/2,1W"l:5H?g6#ICķjĤ]SWͳ5(K^׺-Ĵ`/%s{ $^짂8txt?lX-`nJ"A*].->&q醻(*;G͡:Q/5w M{yB D^ jtߊ~1џxdѹOV7OrJpWqٺPBѹIa% k +zطM%J`߆\e6,6hpJ ~ц(߂Ed y-K6cU:O8u捆ECnEVB}t5L6ZyTQ.w)vyd0昧m`/l3l4Ca#EbL!#]ѯ7=F5 ^]yg{p$ٽ.1i׷ ~G_IMo;z.X$(q ,pàD:yVMg{CۃodIJ@nNŹGjt]@W~vހ&?Ԩz Jtܻ^tdOITεYe 1vn<> r^Mբs=`Y\VLg({b*g ] =Ksq[(vMXfP0UIیXi=,?Oˇ+ݯm^UgH;2%s)g5suCqܰѷcdd)A0;f'1sVny8rUSnvX&У=Tbtc٧X򷨿zS@҄PÆ m`CaNk˦4RB ;"Cn 1R-2Y^;55m5\Gm3@f= ZhILet4~gw#H&"ÞxYU{w9BeO:"hɲb8s@t<|"T;0 D,[Hi?K@ܰ0=i0E,5KI?i~BmDM|iĔ'D*6y%R\/!Hv{Ǧ6w! Xj\'b HPٕnm5S8MI(Ϩ += G. 3ڬR_A~KW(ƘL FJ E[*\3;|%nj e9d?wo=+Q + n_b:bҒ< aaʛyq!tF(f ;QF~ +pn߀;Z8CzFК!3RَQ&͋ +% H$C[@9tGG\:hDg]R\kqJW,lBe,g[[7Bީm&E쉥1k j|2srVz4AX,߹8=ERW[+seFЙ,!G.={7 NH3O&/wn +KO\;␏HEo'mKܒ<_Lqp)Tęȫ35Q)Y3A1M5'.TuLb(BK`&TS-5rmti7T J4Y?̩$2f*XR׸U SyaIҪF A=|BZ?7Ӄ=c{:+R]Oԙ-MLEÎ.RhULm.!ׇX+GI#>,i۷|FS +b;Fp - xAWϳӬQУI +/u[SiӍ`9w endstream endobj 3273 0 obj <> endobj 3274 0 obj <> endobj 3275 0 obj <> endobj 3267 0 obj <>stream +HWn8}WjWL>$C6^l X(xז&C"jrf̿35, RB''ﳋzW?&y,.ق,f|[&,YTB|Q ٫eEz|\,:ƹ*Wyg>x"_f֦*7 N8ǩW\%x"FRȖWXYc=B#yx.|*VdDDi#ͽyM1'*E]yv-a+pv6?k?̤e*jW߼8h<|PuQ[z#Npib?y|c+ʻp1i{*SNoC[nFִ&.Tsg,;_o1>(pd~K&YpP`o6aǦN#v7TS"TʄKh6} kB%jk,D<©wUuqh4$4&<[>DYQ6i\=dUl0w)!k9s yѬ!>V% %P u΍S#9DeI@LglbDc +>1 r#b}.s+A* _|;G##jLdFarkt`+=("E2tZZt(Hs7C$2j!zdD-p1lyF}mOU^ +YM;lcg ܻ1!M +ʊ{4Wde0=a~npn+G9em #FsEX'JHx0Qj"x5Ѳ]Un(Hg<i<8"7&?4E~=Ĝ!9ݖs 6,s +!k&Cˡ!+V@JlE |g'CKwRlsz +)#h#~z΂>2f +R2-s's0(iXBKfۓW=Av +xFP[C3w!č (PZ\抦nP_zrLtY4$ omʟ@0#UHܖM PTqI'~8 +'F%s4}8VJ,\AvH7AJ1!S}^,aӴ8~&ҝP *dSHSJ_.~x0ʋF0zmBK,e*B 4 +*+vY 0 endstream endobj 3271 0 obj <>stream +0 M@&2 M ,[]I  b$fB թ 2UƩUH8Q6 XN1ӯ4%btH7搥lWϐlw%)5:oOo&*trK+ 5vSXgpGv-,d;rSn|]7lW4`XKO'i#?!n)]̙I Cù590TGEΙ;?M l f'#䭁âZs<ӛB0`!0]Mз-ϢB/v9.΢u/01T)3C++`1Jr5A9Kf2+F'/szCgeqV\rg,]l oމ.[qW{7h(Q/.."dt2p/ӹQJufo\QX!rgbxunb#@TģG\ؕ,+1 +N2 +]Ph]e.~ .X0IP%0pt&$3r^̋}3j}B2 ' Ū6Mcԁ{Cp̌ 6`:|(r׎)^!ٯ#E6, +ƫw\t"I3$޻i/m,R)%\Y cB-qɠU^,zk$-!߅FK-E1_¬޾F:$j)D+qg.'$r갪ļ]=A}Ősj͍{86KֹI49yL02O,U¼>J ߏW\?6;J78lSM?4aX60rF,*(8= FCY!`S;|pީ##OGKצŠ7K}z/IYMߩ`g=UK~ۣϥl _rMU|3[*8267)48JAX6 +7Sq8KВk=XH駈pHDy7 +e BnL4o#܅hqwy@Jn 2ю@ՅGԻΡR~HI'ZI4=x<΁[m(-ՒJ~.Hg``Gx]hl"y"Yʆp, oRjS0.b?@3M'%33(/t-|%;]V>/sѤ00feE7 uZa + H{hznӎs!7l +l +\&ў5֜>6_wjG7,51i%ÌG%)q J _-$3uu*ʡF H4vxrwJ. Of(U>9~քFVŰy~O4Y$> +6>_ϋUT]I͛{uT `o($E 7֞v@zLjO_<.#ZVCa;:D^eZA ]{5)Zؚ Y+4HO + @F4(1謆&> !@1u*Ebe[~`%u7hm%^d.xc3@Z:E'YSOeiSR6for=Zc^,FVI˗{2Av']ѫ+!3}4~ +h ^z'I^tX& +CZ>YN`yup'[t4UYǯc}U): GoO'9ʆLZ$Q H7Dk&:‘َ8=؜FM %eRW[=*`BmJ_KCyvl_"+..@ αn V1PvcePa1dOwa9 <mkGdؤm +P&#ϋÜDsUYΙ lNط-KGM$A(=5Ս4T]Wp(Yy=bQ[dXV]' MA.Q4X/U%r=\{75zCqUmX2>Jtceb .{5ϐhTcaȫ 똧c82"p&E9(ڋ4X}OwJkNkioSK94rS=H?4S=@~gp1-SmrT1dԚg. @إrUwY22J< Ɖu6h??LU6![؝](;ƶ&Mp vx]YF^5<7 x>@ +{"N6PZ-5&:Pb2^3yt\$~q Efq7/-jX:&$Tf޵b"ԋԖ6St @普D9 +kqn@hUJ0GPiKOVN,_)7QbBP͓EhlOBb襥 3~K #9[c3֞aҕ1RWe +v~Xg@g͸z t}E$!+!;Q%lQuE%K~#II+z6ERmԾv*E Y5p=ޟRXH Aw>b60#790bUSN#&(JDQ[TfjҎ ғv~qED}vD'ߝLܱLTDrH$!of(яJFڞޡ@P8uC X>CM^6{yi).|-wz<ʯQGl<" q*i\օT/h5xS~Yе¶7 +Gɷ^;F;LJ}GjMh2w. roo0ǯ27\Pwt?zCAhgҡEpIcfܽ|H!M]ie(7_xiQM%\J9^/To'cJSOcxp#K[N8Qa-_!;1d6JڈLts2UVW TLے\5ljE7 tŽRxX56xj?ҹ"OHph (pț8k\`?++I v +4I轘e$j5F ̃NS- w;R=pkA7rROx8|et)ꑝG'27\O%x +nuf|Q1-3f'Rѱi +wp\S6tO[AZfCI 7OdP?ކqwur_)|;_蝢lvB쮦]+2_;ٰ[L'ڦ6{a[ q·cA9_Rˑ֍ޗ2>x|G!d\ԧGtV&&N;wJkcTs|.(Ƕ{+ +TD%Gz<%ZfeXy|\x}e{Jmkͻ+";h%Tw*% QLq!=†Ϊ)տXG13:pK>P |',Z{'/ݵ9nV{!}j3KT7`%:R惐B S#QƉlpjfzz//-K{@H>ADyo&Tc(h\Vތ&eIM-stՀ%- rq~$ 0L3mBGh^flL`7#DK:ŜIN$ZA2H N#>InNQˆV*80Y;rΏn/whp,W΅BCXܓg/4D +UاKӃj >t+F:7\ "^BVJwnwD[Jz3BiWrZ3*VnSAQZ zz7{_Ǻʬb֔j\Yq{xzjYt3 +kk]j>;v=HA 'ćXcw"#7rj$D}>T%b ޲r +jp5y)ܨ+0c!kA=KJb%L@F3p?m;ܪtKŴeeIhoąf+r;tlߪ@#Q/;lXb͏)̷I<ls}A=7@=|5 euo>tJ{Fǽx,k&=7Cx1BRCO(쀋yNv>Z?2"#>f]CP iQ6[~hfw|9핽 Pa)5FԡR+$˙{#R_qw p]9GFr`C3EYd@Qo͌r(|pˠi0N*B} ݅*sZWwrXvtdr! _:O-`V/tAIl)Z̥uW!tj:kA_H-]+M岛GQ7e=t`WW ޲dӷqXqz(?BOC Dv( >i7f?ay2-&]+OmwO?*BQQ]%Bjs@-:$ҲnK2TYwf {RiYC`c÷Wv~̓J +3bLWTը[%I_7ZA;d[hB%CbkÒGNW†jT21|*=1XIJ6[!IJncPwp/yga#U3]_"׉^]Th9KhY^1CIBps]pQ%4)kqe|3BfBl~z5 Z5=% +n)[^jbC5a _m6Yu}-rCQ4w2[0tV^4"nWult_W B*f{2dIgfՐ?Lh1lxd i=kc j`$ub2Hk_!4勖v͎J5bK}DSaŏOI.!u)5Sxb5#vX`" [bf|[_HtL!'ů?3֥y 49ȦdlȨSfIn RGY>^mi J)v=9.%4H^2M_YO{Bp](9MڂvqS*Z58=(Kѝ:j|"䞷XCm?W)9EVAӴB$Җ3ER_ʼn +o. =-ɨ!prlj A70CMU]>E Bۀt:,OABRK> D7hi&uj0 E +䩿ٝBC@MpotFqܚMrA(NյL2ܪ"UPuV/>wknլ1t>WJF,#P~q KtQ#Hc^/i`' ?pig -aqd fJ{KKO1 +<27R\HBхJ +>tcW1ek997XgvJ-}ցa2hscT W_j{$}:OA`Y*3ܛ~0h4;sO3۞j=E dNGAViB +y`}w`ҕf[{ +?Ele=ElDIWu{֎-ӆOmB9WNEf*ϡFbwMYƌ?RZ6F r;00}CyAHs f>]\-Q(]k`1,b0|'M㮚_ X? +8 1t-~$Cz8CC`@Ő x ЯVX2QK}k܆L54i cQk7q귥_pV +æ['H KFI̔,skӜUnvk§B#CQҹCۂ*E$b"9+$`yo8,RtWDObf-iPxSm1&f| +$8-[>)u?d?&f ʓ(a"ǻxjFk#nvru{6QGb/g5F}4F_֢[Y3 +\K\8H9Z7 ^z19:ڀv 3.2\a}c˃zUӨ߃N/F\V@m8 +vE~w5#/sd k p׊2"o4*L"jXeݻ xms*R7$>kƷΉ,UdN_$>?N? ܖsK$bLLU Q:RyF >"EوdAq yWhJs0Z7o|OKP§B|J,޹[볻$^kK?܋->/39rY'8{(R?'N"SͲVF,\>Ǧmi7`C:2z('waEu#Aj޻F5,,+1gww$||i7dF~?a2ܻ)\L;Y:[G0|\*KJ}: +SdzZoX^E$t(ҵKxt\2xb|2( +`HF7i[IiC"ge/e"&Y 'Kmb.z*5dʳ ǫiAŇ>4X + Ӝ>\26U4}sC1'`Dґh|ȫx6=hQ(؈Ê/'s`m[(E:&5w3e"gu-xdNE!%zK @oE-fV;76M'^0dԞϟlY06Pתƕ$$< jR|n5.}TDXPUợiOb*R;^@֠w' +FM2` s/Z{cJP*@jڸs <-8>ۺH5"@hS* Oԟxѯ!q5P 8_9c {AUxgpKlս3BǑa.2M6/bmOxG'>]Y I们r(f01t\Ͷ&1őI|TqUq1Q;*@*T E4CM0솞9RjB/ȀM9ʿr;1/wC֠[Ӳc_ͲI46s<"\qe6ƹv$j][~O<2,(&iL,A+>3WNp KSE_AnVtA ɖ LNL|J>EW<[S䶧a$%y) ٿ+LEF~3Rc5dF$9Y?yI˖xX<졎XHvua6+M?SµMF^upFg[cҤs +:sl8ɇl''T ~/|9R>szihI.\dG +I]1ae}77( 9<(ν2فCtIUƆ@рJ0rY)Thf(1s0~H>( .XO׻!bCf#G50cShǽ͇.Yo@h`2Ja+re sV';y(`Ct ++OK0zolG;]w|~薕`UoǙi6UE<\0`Zt5'ZLŶ I( ?_ݪAaa\<Sn[H[}+nw)QrGBņǕf!0koFc.uGХo 00!NS7Qe,@C?sq|T{Q:4#}"ihjMMPMՁOoVW!w]ָ\͋viD$! jq5ŸlP r68J1GŭqN{""ҥ֎PHhZ +@7>:E54m2Quug(B(zOb9Ҥ eKq`M?@6y몲yrjAD7G/Wś>!c=Jwx 5=AIj1zC4ܹ%޺F ȿ,אi{YBUd$"7w9Юc,ˤQ,ѧAW-&8='$ S5-PF0)VYnfPW|۱v'$Ō)p" sS$5d4Җ: _~n xZ*^]~= F|j*Sѹ JZ\г@"lGl۱IC̤[K85Dvjs;Id -k<9j%s켶0X +0Bq$;5ڢ%UmjM '˙ax7s^xzh|jFyrmg5| UfKRLFJ d 7<#e"[0?|L90[6j9ZHݕ' DBknfb7 A + $+)>U8sPә.8>9E_KGr䏔*FQVie'%Uܚl{g7 \1{ۊ'j̤t +?M ()): _*5Z[8F%;7z/%kfk +puq*= +0\z,ڤĕJJ?'2/j![cN_RgΌ^( BWQJ!a2t)Q F& i-Qn<>&bS\ yV.9D1t836ZrQ+$!NB]l#˒9UL`[ endstream endobj 3268 0 obj <> endobj 3269 0 obj <> endobj 3270 0 obj <> endobj 3262 0 obj <>stream +HW[o~_I Mo0PP+j.)s)+ja3ob N1G b9^r~K,?W݊ j"N@L fUVT+%sV0RtQqR'sVիwf3V?Mן~|ZZY]p ƫbz4ΎIAUBHa݇4]߫wAϻ3^e$u{&q!P\W߁yDT9cڧ JRQg͟ckIRl/~Bֈ2ϒu`Kļ_]"I RɸkCِS͊X7_LcVÈ:Uc8z`utZ.@  FdASovKJ/ 7z7c3d#ܩHG![I6ti$U\cyM-,{@iV.5Wo6R-W1~}`V¡,>JNTSwY.b#TW MWv +R!f,tC&|=5΀*#"ËFxqE=nahg-%&?5)BVD^pU3|3F@p\CW 8ס7Jb-"x@OȠ뾈>|2pȎf:ukJã>͐G_QJe DgqSFXTv]Y¡b$%Y&HCsqܴ]SP_6e$mY.a*p)MccݍlENVY=sͻnY;%,`Ӗualm^7<FRZz6:t!Ĕ +~% Aԇ:%B`Mt򱾭O/YHeșDz9uS70}0n_..U*dD1""%B،IYLjŐBjxKP z >";ah!f18j5+.zh cRbv|fJ5$Y9FYH,=qbfl}a ~,JF&QB$Y.Y&gU]}7eu o}zgUb|@~v[&q(ANKH 酵JZ'i+4fAzaLmOYԒnJŢu +l /0늕.ÙA=li;HI, Ȅd"ceȍ  v9v9qdJOqf!묟%d\N؆mճ])΢+NK Es*$Kl~}@~Ȝzc׎Mƅ4 ;XV11'bmɼ\HsA^v(ڮ֣HL}}<P8o,W>sPܘʞ}hq)kf1llq uaCaSwI!񨹂mo lWG\yƳahQ lpsW)I@6u-eg^X1kJJZKj_oMsdw̃":q9b^^P} +wˍ lu_}n/kƑ)'ΊI8l|9a]}Hu$s" +Wa+M'-v[XϑkH .H%7Cx$gQl~"1$ުc:f{9U#гm4D@bKMxvPw_9 B|86Dt8&2'{ qKl,4êN4LbM'6v*pܚxZ/ W'f- Bf~.l~XɆCL, p{i)*!}S.#r/ն! D?H%C)}]5f lBtawZ:eZȮO$ù +e(h%DNz5K!DrG)ϚN7g'LlnBG7!M{Lw])̬YQ!||"T`д`3E(4,a$͎tp)g癎ܟw!0Sl\3L>!NGgM}Cng'P;Sݟ #ja6)!WIe9ہ_y{(Lχpl/NLTY]A 4#OgاR]w4T`TP*@o~,uZds7(U4ic +/0t$:h)+n 6O*(7VlKc5 cP_ejC +H*l6O珥H6 >AS%ljG! endstream endobj 3266 0 obj <>stream +0 M@&R4 M\ԉִIl†93]%u95ڰJQ2M s+NX\FP+Χd +^a> O&U:>.6ḩ +K p[~ +x"R 1_ww f=xԩ skRṭֲNBd7-C#vI= 0u=pVMipC{ZvGII*-HEYd?eB R2tѰM-:k8Pv1yN.R tQTUQ8N8C |FC +%0CzU: f/Don`JO"" ?9T(]N$DÒ zh? ۗo0D70MmM܁1eS<r'hNJ.!Y`C@g&b56BLfy[~Β77:wA~u{2;2舯+$l@=?K0vOaߑiAIj:g=~2ՇõaXpxsc,`fn'fAX'׷ea.8Uk*K۴zIGZpv){GC)cۻDK:=Nl_r=i}i՚S6 gSi"TAdT + [8>H_~099 ypro4RWcaC OxfDe/2LEQ߰[C%1YV]&qLTz@eaHp +FH\윥klq3 +%{zΟҼYYwcfEX1JPϜ@H, pUɊ.Ft/Y*vnZ6‹0]D5 (RRd{l 7>?Rs;w!ӳJay&.m-r6Ԝ6׀G0j7ͷ!cdoKX2z3! 5!r==< aN k A䠒:^ZtId*NF(5bBtPdw;Ҹ!N P-ycߞ +ܮ$ەMAsmz(* n-KJ~aTߺji) + j%̀ L(;=ݚD +[eA{ӫ( &.PI %^WvΎ' 7Hu<4gOK l cF$uO~4"8lSɒTkD%M[WĿb +2i .|oTC!4õ@wopշڟd,؞;a)O` sPY" O\A:@UE3[8{8l63\I+X_Y„{ò Vp@U`Y nڷ#Xn6*W{]o^cE3iQ'pQ0n|kTq}°AFvQC1'ZV_ÃZ!ȍsFf/e-W[]52818MG/U'3wO:(.ʐPW7z+M) Vd7M xRuJjDkn uݹ!CW'8|UZQgkӸ31ww{fɳ_֨dhTiƎKrĈNpND3O2$ =2^8!o~N;+!En_" ybLJVȳ}>t'`D\< YYG kow;R/ֹ?99C@C ]szO5lnU^|޵%i ^sءM%?Osvy"`I%7\9~/nP+W{)#n;N^8UUЀ+i^_ܩ~^Bn)r-lQ6DcЄ*R }>YT:7ct}6B 82aJw1LՁ.S@9^7N!&&]V^)6s Pr|ik6G)UVh!rh;{^U~q̧% %*wĉSew6K~Em_t$|Q +vL;Tb7c0)A?Imъ.*`}XHYyV~mE75s5@x^3|>)JHύ}tQ545,0+-LXnz{8$6L{5KK/N*nb Jy5$&gm~-ibsBdX0JQS@2NwAbk<5(\ kN:>D*a2w^EYmdd‚},^g {`1A[ԸV!^7 +/ՠ@}utAԒgEJ7MNiCVY1hl>7BsOLİgPeUE9C]LC_IQhu_n3i퇧je.[9ԭF[:{6OSPo$ _c vTKvW5ӝr)P6 +%S:n-pO22N$b0.bܟG^cKფVԿWZ?cXz,R4q$ǴnAj|W " &ѹ{TP + |}/--;Q.+!SM OA +}<6wQt7@ЀOA^5eN*%B"܌ :C* +[ +XO4%77<쉌29穇"CK躂acK QcJk8 ը p,XZYE<9tt:Rz9mBdP*"%%%ARVjjA(ĽHH§%9.+e3l*ySJx 0^_+Oo'_(1zsJamx:2 +bc*M+Y'BkP5ԖRVt{ȢPW1_]f8t8ɨ3_b ?qP9` ٯwyj +%sr +I͖ee 2-ik% }^~)s`G5[Z5ӨXbpeUō4etvl.Įl%bXR[ۋ+Nj OUVN|7}Fp~8C&+iC(RE4_`>a/lsq;gݙcR"j/`|tPOၹH3Q㫊I,U&p. CunMHg&л5qX%3:a+}dudOK8fyx12 [',9qy9IP~9+G '$RK5Ni[XG[1^\kmE=z =?oZ'_6HW<1& #qpDow,J%d=hc0˥:gCqܟ.|9.|3d$oZUtJx@<ɠEs 8}`"0g@%QB3,1}X 5`J{%q wP/;Pq&њOXHbCAo4aQ5R/|~z'SM3lۣ=4zLX.Y3`RX-yYi52F͂Eh DRB^ j4!d0 hե 2l<3ďOoc ukrkTx(GK7eH'tPVrV ԅ8 +t NAdw :+d$kbgbB&|Jj][5Z0n1|%(X@zA'R)_$e%.q pz^s~,:$[pk Zq?4Gqd+0[Yb>+g6 }6#PUVVv Z2o*~1 +Z%Qpf3T1kgf vx7iՅ6NFJm֨i$EɽχVx#,? _8ukDqj]Ln10I' |7g m3|='_ +RQ_^*M4Q{fFs?s$ҥT}cZL vۊfgW1DR$[w +9q;3Vb!atIdu&>u#?i%sg`r14*CMV7 %_hIj' 98iH8hq+↣xz07] +KZTh>n&&>֬]WkoIC9dc42 T[ըFzrmZunKUVdEF=I{et+Oy=Аڲv򰡷w\_Ey08nލ-\kѯf^| 5J.!=`LI% 4=PJ2MRGa|SW'j@~ fP&EAVH KC0;AI^ʅT7HQ)a8h`v +G*%}1\g/pQw[ +2,* X?z-6-3 oD7tD,03 ]]Hb(@b7.230dFD`p\PB4W~G  Kti U +:Lyu\CkϣC뺋h/Jʩ͘TY A4G:9C]"&w2  8q23-ǿ݊Yj s]3|37g%20Uǃ<_%@@nST;Q{Rs3+ TyZejA6$U9Ts`{,/jr"?,"}oi ӓdc"~Pnd_Ib㻮pȺ+HoAďu? QzɻcR^ROJv\a)|.DKL@\jkskjgH)S'.[Ff]J!roz^Un|gjS"PD6ia O>AYrˆ!5 +:,|ۛPz4|7lnžօm%=5 `dXgZj5+i͝~g\ˀfD51t9zM$"}Ђ-P84U34(OV2RJ-cFv! Dn\#x+F0ɫ\J2Th)"8EC0Ѡ|Az9㹣F(E2S.[@]inݷUOu%{\dт>J&΢W{nqΘQPM(DBuwy-dr%QMPGwÉ;6Ĝ͹1 2*l9hcΏq +鱠 siCMiAGRGv|⊛~HrWuB+).cZ吜w!3Y9`  +'u/mtvifa]["D̀8%zXD ⳊؔCʩ!_^rNq%(nXYku& z@$'"'͘-jNi3qk#LamICOx반v$mm⪐0ݘ yUX>?>+ܙ]!CwJn\!"a)aʒv0B=2s)fȾ/ #b"~gԳATs5X/<0vn]*M`?T|]iJҪ?*zSCL8nhPa^~NTG_Fm*&E& whq}K2=&3Yi/LFLuT7ċ@10܍>#;gn#KA,is<XUћ<;SZ7LnupP{k[ {ƒAxZ0",V>ڂibFSJI/ ?9~OTEygoæKUy_NYRdH `,ԡDe<{ i_.ϹdVS06#vkBv+kMB^߫my͉Pe`}xPbp>搊[SRu"0"\y.̟==TCk!?U ;!]"-#Ą$2*{]ƥ}o|..ԲVju75 MGvNJef:ZDe-b5qscRk碃E "zhr;"\ᅓ',gk;'3N5Cܾ\nRlQ;_\x&XZ%B!#%Ww/f{6*˚LktmԱ|\'#qd|JW UB&P t )A'.$rYu؊Y !/?_El&mzf%]ϋa76.vUEd G#^"L_rͦ=Ź!:9?ήp\pa?&-C_n:q`݋0Z$>q >; +o!Dz^Ά@ѵI@MsS3c{ɾӍ0kcxj#aCNbdV<tu2n3Y?p)S/t8S*r~w,IhszeO@_*I%-b,ukM7[Xox⒳$[$=qFz` cy+!X'kA;E,{ub *xﹺ+rN,Q4Kz?\6{|8۲S4e +׷m\>n\G^5(4_mbjnMzzdrER]rr<3eTq}1@k<5E^JY p\t v|0,@KjULt(%Dɾ[1ۦ<0ڈqa) D(E+a-/7ld/Pɐf^\`Oǜt= ж[[cڲ39ySSm+FVyݚ^`O0 +6WfҮTSُdˇ>VHz?el/aʉI&C?EdfG5^Mhf,4.qčGps`П}""Ar]xRLyD +m bHP =RˤWTe: rnn5wk +Z;7;w_"zxx!LeVt%2S;]5\POп3b^m0J]fs\b6=QH8 WMWe]я19ѦRߨZ=hW}%"ѲVt6>E/mF8\^|-wEy&͐xP}Cs@*Ҹb`9TnN.z#U=~hHƜE5;<7ԮG2[2W Dqgr '9޼^9O@_0ubZKVe=d6"!jЁQчlħjqXmC2Mtoc)h9~ӯ V9sjY"^mՏ"?෉&):kx812j*sE.yv]G}ΠYR|WP*^]$uX~u'Ig_Pm(TP^Z\&`G.QL~py݆>`)?n]a΍$+2j(:RfX$0P7"z'@-8RF HGB$IwLDsskmJiᔭ<o(qs+1'm6lFġڟB(uSQ Gziýڄ c*/o=-g39gSF,yqXHO`@-lƋT+I1j \C0PYdK-k{`gR&tS+70`5=@rS8/b 2fo0ۖ!oN4Cp#^2m½- +bln0p,J@v a/;]2CٰqkBcbP[xM6TKos ZW-2>:cߝka<͆SJX ϧ;~0n €oyc@y0 +3Iݓ`+<(ǪѝszhP҉!'1+\rUkwl֔6rI~}J2@OPxMhW~bQM4KkZ=dW8et_pQ}M\X ~omGDE2gNvG }\,W^N~Hhz[[$xgL©Ujlٚ8޽M' pɓKoG c@ໂ1?iكL0Tb-=c"XVTlRRx` &X[!r~mOJFIODq&y߾:E8Ua72KK^#PckAp$ 䊣[J4fL02f@qEJk@0k¿H yS'xTv,ߪ)^R&67V0)~1[g3 QF +N&G{;a&_g~Bvm+^EfD]-E9 /wa3G#{ܩvRޣ/J /qܨm.";WQ]{e5 +i=O &8T!QeuEt;}4-C +T.g'sdlp\~r@m,:^/xDE񫢑2,qf(j &فJ9f" +伢m7S+ Jm2F*kP&$[{+EQlo*|-y@;-d[+3Q?`xL M7U V“ć-#0DӶcL'QdJgV{:PJd0jB0YX BVj`õU$O Y +0z^+Y40ǮIc25?6|IEm`t{MƐS?;lذ(ЮP z;n8}J_Ӱ*=mkH ]+{>a0sne}W$gU dч$v]ȫ_ ףěte|ښʄ0sh GxZf^#Mx!(X]Y8V6qLģelIo"457-.jb1 + 7;@I!5phד:"+H3uA7j^2- 下KEtlB~}BЁr¥’5J pt=L~k|3[klqFY s8a2d?WCSU!olQ6).o ݂@wtVONSx05Zl#vײQy IFcMZ^ϳ2YkzB=:Lf-_&6 +5Vy՟S&*rK#_V6,Ǽ^nP6Cĝ?/'Oge@sɘ.B v9I.IO}P>쯅NZ G`M;f5S< >yF{y% + ;nwY{V1V@& +_|O41GL/,R38{~lQ)U4 +hUȧj-df#Hzlډ*Q6@YZn th8pUU3J.A::\l[=vWQMaB8}A40x#[(o/'cEeV4q-)e.wzY7[ +obyYlk"9$V++: Ը`?\T9ēm͂][Q.%[FZB `>vUQ d=2m~- X>;E,\&rqDBh:i@Y`@ +x[|oNXO@C{cdwi1 A]oi/+Q K#ëuJp.-,cPQ~* C˿Y.kZR6NG1gd=HkG1&1 :|S|orO ʏr+bQзǣ:Gk^A̬~gD-/ Zj(u;&M Ȳ- B82I{Ab*&s=W7^.JĆ@~υpye]㺱P*:n|Emn$VI$PQsQS|є#k_* g˳nc*R*qMж_aleIV1ElDz +Pz;J# n_ +be֍ZӔqBէ }^ȒS`[͝2Q*M2@]^zĚe%Q;QA,+7cWNVYhCDk -; + +tLzp + 5q'2$O=Gv)xs y>n1}? ;8T-B, ۢp'ˉP\42$bk&+VRi)#$# QÀ +7*N +`ij{lZUlb|u*/#t22ϵZ4蘤j;7FFҁ2-z}TM},C̰2:mߵr )< .4-(& rAha~{vKO#ُ 0r-R﫬vv6!ۄ + +_Ԑr^iD%ڔJ~vC[+ȯ/&FvKG)ڀLJnJ3_j7D m LV]̊>co0; +<>^@Fug@=!*sԑd)V,[*S5EngzkjI ei<;>DG]z'Z/a,V 1˜-ǕsjkY^ot.k HM?z cASHR9e}.c`V~h07wE9'ҳ(83RZwU l}XB+PE mHIY"oH>(hȚH=f0;CnW)вk䒉]6UYjn\q'(-nE) {ivcy08ѽp?9gYh$ѪIz&bhB +q}Z*m]9\J +|ЉJf+l̋\ Pzv}79 +cEdwj 0~đVCi.wh<xMizYƂC;wܡh[ri57՜e@ HkZԫ245ZTr߂@9J=HHbX\5~$8dx7v]1o'{c?͖ 7f/# A\ix[1lxWёM|d0 +?HEڒ)$`pmțpn|"xs:;I ɏ-}IWg+@UF$G7zǾv>?eFdYLAj ;a!3 )ZPmuEGyAs1ťofEjyfN3)hXoZB/M7) b\B̀lUti %Yg|p2Q|D8QGw VҪl !;? +z6V;׏@X%/w)݆Vk >HV,Q*jK?rAC oxo9j>*|R-P^^B^R_`ɠ2LE\H,s`f@D .}OD+mz+ ["f&Bv|c)4htYf9 ,@}q*~h[_\쟲:G?@\?7L}jTPlVxvH砛tF%(Iہ|) o\QA #U.3AG2\4ݹZck܁LRKzᠨ+_H՘[gG97YK~(W*h9fK>2a|s[^CsS 5KC(7H {=J>¬N5cdE,26a'([ LYyxT XoKZ̔ƈTdzG +1[a\Q*"5`@Ecn6؅/R8p >í?Sw[kPt}k{!iɜc?n]~ Y Y޽%l+6B<蹟ǥ9H0NLz_X{KwbRamFR8Qƚ!$=1G.У@T!f$BdmvP!>H +͓quZVXahCQtA$ݒq,*x7F]$:.o䚥o؉HWvr{Gr+6'X՛+^ @VnJ.[%xd"`wD/2ь@Xw5Nn?pԾ'B^R24*3>|ʙf<` 餲cp a$e)hj.lF)0B76c-9!pxxJ X]ILjpM)c%le#xb,Xe].=]AfՋ'YbtA +o c>ULbDv\"\bQ}%FW50+ c)TfٛP %|IU(Ssks8uب&}AUq8Q |@zBuiO:K\ X53M\)r{^lÈ95S=4qBix:T%yֺ՟q=Bgq Ќ_ kJuT@)q t*?q׮a)@AfNHDSs̵IɚOVۇr') +\}s +n {2{٘KﭒYo@TymJ(`Z1u}-Ա8'm[;MkNw{ī#NXBrhF;f{=C̳#Rhцf\|*C0Y3>$(o<w?d"y-I" Q.ª$HSeJ՞F.{NTocfq%fe&&ԚW:{ϲ%~CvuSD2N*ܳ̒"ںoȗ!觯 m%o פ?nEagf+SPYC[sS%VW<`yL4!I"ғ{s]jȒP'|H랒]&X7vsZ  VSf;-~-[Ұ^Pa`H)ZN|o7%|E%Rk%H`eۻN*u,xV-*~HƄi;syJf^иD.I~p@oԵ¦y*idȣ==ӮePnimˎL/9gAB񙎰 ۖ;5v}/PTDh4T#RG*c/f0a\/!y=pQ3RE3b-y(^!GO DkDҽwZYb$y.BNo;V.]%3)lGZ +k ɶ*)<)81ZVt8y;"d8|i~` -AR%=4k!ySvJ +\$'T6Z~aŒ\=-YuꥢvCmA"=*J?Q[g8dNo)¸Qrf\@ \?Bdgcw;<8Yp\*jkՆN"4-]ˏ%ɱڭ_TWlud(*}k" +$ t.7!҈2տuS$Esv# U#/ 0%^ճjdѢֻ%6 }#r dɁW52"n=kxlCWQHVwlNET0GLn\WQ@Bz!Wq5"e.7/9> endobj 3264 0 obj <> endobj 3265 0 obj <> endobj 3256 0 obj <>stream +HWn}W)ոb,/6~02ȋ`L̉)Iߧ&EjM`<=g: uˆ/4HWޢśo~մWW7WWKOjj\-b[FX,/\po/^uvr_/Kar %@ םDIsby}v}dy +8~Sm0nhNT;$$*dd^ ŋ<#KjEjtLYI_$$0̕KV 앑j8HqXCC5~]81I3D)sW'⢢9-}qfʲĴٷ5{ixZ*v/rTMz27TctLgOPǹ-CoxƧǗ#COBkWSǩ_͜BV5dTi:v6e +L]ݦv\H␓} aTSHݰ;JA7tqEFÀfG|3n)^,?"&meh`h33eWյ8Pfl2!x]VX-Cj#%Pu5ppݥ#&>~ %\b)6eҥ:9gݬef^*kOԵsdk!WѦK8gg9`zRDVboMw$|hP,/Cқ7I`oWib%R:Zhs>%+A`#CֶnXˠ 2ӄ{XD!MPpaU^u:Y e~qiӮ0y3_eݚAɾk^{!u?e̫Tg߽*6%f|<=k1 +e`H0b) U|HtN#@܇__gs$X]Jnm? /SB< +V35q(tǑU`(klV.HlXv|VScdHR z`or Jˉ&4Xv*ija6FO#CEPwqJT3940lj\Xg;_h22=ۧ'aUi3r)d:Rxc`~Hd }gfs.O* bs>lϤlmM +~x|+(RaVn1w ~(ӐqfE}$ŽhZcvE7)%3UkRmT#CIJQB}(("Fn\S +@~~gY,*>iqsl|*6$H/jgmR c mOӖ{J  Eb,P=a* 0{Y +'o#*U,>f{`eLDOIܘBAB2r'?A@轨f}gQE@8)OfbX/9k5P$wgaʈU#`˥t }d̤.tHҹb׶daˊa,}9Y1RUʾ7}9"UÙzYW/CYV;a#jCv+Uײ4Ӷӵ'E|Gk/^#[ayy~CYӵ6 +WUO%EEqVg]kgVV#4&=B]MRJUmbIęqzRY% 5wJ,n;Z{w003J^3W}FuТb9*j_):ЊޣbKbn/ ձ+ 3,//]mq ' opfHeu܊C]U|ޕ KװUa]Eǚ*QBUtjJʊ"yZ]iv"㠡мo11-%p8u%1{K; R-M$6ˉBXM.s6SHK>WA8UFq5eyhlRB-2I!v{Y ?VɁcѬAV1Ț@vYV+Z/GGlkY鷞0ǻo)Hh9s<*F P ߶Ŏ:CSի:FA +j#țB7eͪ҄"\ /DZs2=E2/X ,tʛyFz5RIzt.y;sx*}0#0ٍ!8eaD]@|( Ib2m~{o4pn&Vl;ŹlϢ^szu e<iF&Zq?xf><YtuegY+%ekn$"¨2ݞOG>s3fp7%B;ʋD\n0MVS- endstream endobj 3261 0 obj <>stream +0 M@&\ My9ݡ^Gc?XJɑ&sZFU,T6n_OtgGBI6L +Ɓnb/~L%QKF,Ʉ8}E +|6GP^@-y[ei] k껍 wR8&EW'=_ +5upQ9k(cRte T=Kc ̨xoH<D 46[*2[Dz ^?TWyY)#ԫNO(ݸJC1ҜiJ!$hxEa|C1p] AMW9sF@R^ipejWd?gzadhqi_/dɍ'5Dkf*[w_kA`[VUJ(w|m%zH(Ci>67ZHM]]DOr:^He?|Mk^Qf3Nb(f &i0t1jN z[ZXB[Q6bR5&A!yxW0}QzV9-53O_O@E,BɌGHޝ [ 1F\U{bLBlg`Yea 8I9\lgNciޔ$y n +BCd1p6`o\Gݓ<>1Iڇn8`i.dDfC3!sH}NH30?~KH{]9x뉜;5/4's-詎=.^.ߑa]ܒ$҉Dml:?c9)~0G*!9̝N*6KC N zO!?ddҠƶIʟ*reD; +S(.ELf%8߲:#@YB⸡.]+[-|Mim!iWr̺Pc~8bl\q]X4n$< > jm9f@,e* +81+ySޭYz[}m*4-"UG$uK/ +B$t6 ؙ+#c|C8jKgÄ&"=ApcRZN_lY\Ϊ| wQH-^ u9J".NdPw_B<~fI>Xߑ0.bhpܴg7JѰuكNz +\s!wgegP&@ex]@V"c?d﹁41 ,i-;ұCN#KoWGڢZ.c +fhyloX0RS\]dh؍=p"UlSfXD X#{l=(ˏd܊Y&3_0R 7 j? jr-7S|XzUjǿ Hbe +Rn+qIse̚_+T 7$ T<OpWOE*裦#\N yxk. o?&5^\شVg`4TMM $j"HX^CJ.nK#1Tخ$Nǜ"W?Pl +hh MޚxG7f^ƆcA!UȆ˪gGز9@s,}XkG (͟f#f ԅ3JJR 3GYE3bKyYIqmܣrl9|s`E{;vLPd虘H={M}DG~LP2#eybJ{1bCGLFL)6}bul +`Ȳ{"Vܾ:D3kWByH1afbs:ZRiXZۛPSfٴa?СIXuMƟ6H7+Zަ + mF{J R]̨A z-r)B@ -AքQ0KRas;8XSBaBm/NW]9 /'b[fӲQKPܝDLfߧ#{H}\Y G>5!#i_7'8 Pڗk-ys ;߱isqXyσ .x|`5?;cSoS0CwLGb/WSvWakb| \'kIv tzL^dX-j:xAZ)8h&8 ,Cx>a"! ͽ=:R"G, TX25AV<\7Hu/wMsRUEH{EHn(*6!V4a}'Mϸߔ\PtP&S%YRH&K֢gl(= _5&aQ6 +#6 Tv1Gޠs0YruB7(/۴8IITe7UڤU[tC$O_Q]A5pGZ3H> D.H12 { d 3za8(<[1Ya G๥e2䥁L~5y1%Ѓ~>Og(fQ<$* wh5ڬ"M̚(DeD;TdOFɳo$|5rY@en=S>'p3(R +$S˒j#O)sTA];r8Zcco{Aq!b&³-[$4(T΅H7̱R`9ʂ8ֺf xKvq= `?j ,耏 -Iq-Z[DN`ջ +a^͹s%+F㵟a?j΂ŏ[rh2O'v +^ڰ3":6BE g} +3;W0σJ|<*^ @25ɮuOOcIx./muqR5%('=AbG~crxi֨e!L]c=P|eV- +\)d˟HJ܊E8^byK.,{]{*V0N. l.IfKBS~,Vs;U0@uD𪱷 @``L(T~Ħ@% &|Vy?ߙqοT;83bd&(ZV7,!7ߟ|vIӣ>p)y\¯qkPc)l}D+.}Vf~/f =Nįol}D``m[CWǐ*(9NMc +@hE9F)]>'ֈ(cM=Q%1 _Kϝ ;@VQP2v~AeTtX]nD Ua)/Q*B_i3v$m\BK}~$t2y4r`=#u6{h d*K +p9zh@q>>5Z P]6הbo2Lœe5ǟͺA+x^Υ#7n5XZ=Y)ϴvBc׷Fډ_Q5xVc{$y5/n%&.a7 ,F@I)=Mbr0ɑ|љ:7;ͱT-QSvBaZk/Ԡ{>jeDU̇zZLPX"6;C$o,Yu}b>xdɴy uJnb`BV(~TowRMsfae+iSMȿ轐a{^" f 0:} ̢?}|0ؿAs&X% NQ +qeT^bl-;6@Pu :5?CЕѕ'j +ȗ˼} Xmgd(. ¼=]SCj¡"DC~p= 0u!]95ņScSbΞ:vNNQFU? +)D_sdͻ845n3T`EL>X r݁(} D[/3⇈YGSRGtH K|WnL=;-:F)܏1+2xt!cON4 ^ .s@ONFBe"6hA@$ӱ3zBCNӎ7\Ό` g#Wɏ󙚍XҨ$f^m_!sD'*PJ|Y@3#dB./ #s=5aQX+m'L-s`]R&Wo)8NP?#Xg]O~eY7h7"Zw[Zpt䩞@c3lW |w =إp \pk\e[N̛;Zݼoϲ.q)R +Hu&!5B41!֚ 9DGLi*NS2DU /S_9Qr|)6̳>g:݈+pe͉y~R2)I|hZ=v|MVe(Jn|\ynN㪟^dk >g֢ %9d-y6н~lZ~~.poRD qjM_#u>}R +faRDB>?}? +, _%-rՆ|yQVg|[1Qf} ,3Jhi >O0d#byD*>;QHPە.Tĕlyؾ%Uh$` +k哺 +FCy.ԣjԊ. wJ:x~W}Cai_zLK-ϻ,QY_΄%_ R"A xD9β !xd?LX+;3?Ky osD0Iq|$6ByNM&"O'FP2( Τw `IֵrA:3o)G"dR(<ɪf{cX3,3[>#O e4eP˻eq/ُۡ-AwKA-8 +yX}(jɶӦ[萳XKRh>5R` +{gg&W꧝%"TS޾}]ziCw/îë*4 \Յ WS +q_@@hԐjFhL.:aƕn5w3I(5]HA5xGjBo[kk $_ިZpNt]XCzáܯۚJMDc>ǍAm ㍰~䤼솣g +h"w6~K +o5oڜhY˱pcU8dU5SjvߜuG^V{$L)%=_#KhTʉꍀ ԲֆN5Ƚq#,u +5DGoFoQJ}ی@ɗ[kT@_[/FGSD}+}h%ᅵZk>:m^ ~V !=C"ImE)N5`}^;&Ie5-eVC ̿q؞֎izvz7,KHc6L'-DOx9ⷯ>-.҂mWdJq1k':'3mat*zkPT![ll^bmNeQ;ЭWDYAFgvA'- <@8J\Nɢ ./1x$zW2~Zu»8)i (o~S[0:u^Ԕ܎vuoHt\ Px[ݞUQ٥ٍ*:YQ;QbbkF?aDQۻk\EB@F"s2(]ЯۧqdŔǨ/Sѹu'NXCu쵝Ǯ9FZ8%O9&8jd6L0Ϩc' <шiX;른Ќo)F{{Dzs;3'0ttPCD&}* Єxδi0[~remZ_-ɯb7c~8դw.F?>;2<2 n9⇘`ޱlbEj>:t[tg2k׌,ynTc7E,z;47짘}d/@xUޒn^쬣xxstPM(]O}?T?,03| +tW&YZ$ +鯯|o黚_;r͊M4zAJ|A0Yy 4@Rv5S Q(k2fSd l/Cp|(!ԜދSfh-ޕ~]*WΙe%:WH.+CaW@(HRwh S.ݭ局TA;1H I2ݜ353tܷL_WR +Oݘ ؼ"B$n aB~|U b¡xpY5rQC,0oypp^km ܞ!YuY[^ +j sN*ê/cxDD+ ^` 4kxV'`14fvAy P_FDX3stak/8FʘX=|NQ%uxuT霌fd}U8q;y<> \̝// U&2L8xsiNZ> Rp&CNOhyG1qg 3 DtG!ݎD 8B9b>0ژ e +OlRxN#廀Lo8Qmn. z{KMNw +g&Pdjf_o!'h1h%Ѥ\m=@ѝy{&DM#! prg[L/ d5Z @,R^ua] ?4ʏ ;m! +4$9jhtǸQAgB! |sJdS?túG-\2"`׀ CY*.V+g1ǕeF*m78 +J\iBpG%E4 qsk ;Ni4s۞PQÈ5WE~Fvnjfہ4cQ=;s']VCC" R٫ի lNu>:_Pb8b,uv6,Ӯ r>Rۂ6Ԙ;FEXoI˳- %Ї W,'RMSb|0e2db IRAb8ELt~(=a,/%9tr +QGZsWr +B8[Ez׿4 04YR̈k*a9]]oc[Z*_Qraz8?/+\`>Vyn 9 \Ze[5\\='pë5YSN*?WIyQPIn/R9Q6B*? VsB-+=UPP0UNoᠹh*~E5kmcx,O.RNϽhvbBYtc[; %{z|0=%5 H`^?cf Ř!4!jJ9/臭qsނ|1YG`08U TKj`?1$=q#q-"JEB ^܄v #QOx; weIڄ9]Jziֿ&.I82[xxUz| +I:aL&9Бֆ$Nь˄r&5;LWјq偅\X-΀<G=wBtby+?XEaE섿nOrhF ȴt^\'w%!иoh'$&Y~{l. 򖒰!5325Nɏo2ySM6F1U2Ѡzs2,g2 ŤT8Mޣ Pw+>D E+a=W.BjVKyvH΀DzɿH'jÅ4Bj7nsxU'*/A  x*m]znL2D|c5ٰu1ߪ>%?ztGjۆ^WrBCnirεضQz)jizz.sq2xXv0E1fzsG~X +bDxa4O +hs¼Okȹ9ÑETz +u6[LӪqlcmOnart>nČ&ѹś㤕PDJ14{+ǛtTȼ>;{ >.`hg:+/%8;mVxrqױkEpTSud +k (p>̯SNB:?^YXK٢GW˔Z~Wd96F x:fӰoPR:"CB :|?g#Ô#_.GW0"%6d T:5]7aј`μh}+׈Uc*E4b"R]AyX?_@2Waa ͐Q`NsV_5yy0R-mL٭5' ;NpmaOeN>k df$oG uCwς2yV~£w/ic{ut\IQHH.VsSqK{;.ݴfRIY|`OQkgƐ^g{y8~dL]j5߷8y5Vd٨rb'JΫQDqչk{odW8ׅyDGpF?gX [FS&N+y"MY+RD܂paлsXkmx8=7 .g,dn:y Z% ]NgN#wfl + GHCS +/esu9I#Éu~!2xǢ~xf+OrV8qJjԩ(C#Ĥ zuI5'q(_şeĶ֟Ko!/ղdpHPHŹ>vϊ8$Nc>-/kWC%mBiOOt<꣉;*׏I߶sH =qjGIqwWK5j(2twfgUS 8 +RksTXk +(1dN rTJ #!0cdI)Q⼟j9t w>ZkҼd&%Hj :+4&5X-,y"ʽLmv_iH+*# =xYw;6 dP."g& Sv-Rņ+ cV&펏0䟃J2)1cV +nc}1F^&I6.CגHiR*ڎ3ʹ:"lFr^WA<t/yI"vKNpl`MC5 D rH&.;I,u3/$"А_|hw4B$ZU#GۇaيI^nY1kuVh̫wJ>?W.K'}? (g2PIUdEI3yÄKKnNn8iksYdA%6dcvm~n1:B?y?:E +4'Qh=T.V +OF%0b_Iz)HyNG-*o(lPmOt{,kJ7H{ќu#.79WGݯh!^A=cI45yVLʹ)UNvìV8- 77i\%m~#FOfA\l hms3,S^WL0SKSP rVfzF1/z?O,!7Ǯ[t]x$9N +\Xg{d>Aj?S1 ./|V*Qa]mVY)U:3 2o+(eEަ`S3'4\|W|l8bܯ~3PZ5Na]^E0Y©cP\~{ NuŹ+fq:7WGysVyV&+{jRdP tT#k~ABjmĪ:0HM{^qgf!6 +їw +/KpY8˦@߅ʫlΘ)257;d/Q}`vg9T-e;8]N=m[#T$,`Ag |p4XymNc3<Nm\@R )H% 8т X1iL(k+Q=["޿#5 6/(] :`267 eWn,k ;ìrTuku,7@Ote6inK+aǾL<(L9a7NG;R iW +wh Z ^h&\{u(mpv/+g Y=x<i_|w óc% +9/1Fn9bNnx BB_z 6yUQ RnDŮS&L#xiFb$~t%z| َ?*L DPoHڤNCvyVI_,<;D tUu!2[969aPXMHվf!z,PzƚO/"HA.:"HbBBwLnZړ6 %Yb5AYXxq|LojjpCW7SҾ>]|H.|1qnd֭wPieCbDq3~AaH+zN,IꂎeI,<3/H/;V֣չJ9w0P=ZEJ\w#{fN fjC>{N/2Y)?[-J\cm{/j/0R>~ϡZjl&"@SN=œ +oT]tFp|#/[ a58 Q&2ȤCu:~h\ |}\b@XCZֽ6<S`ٓ_HE#OIQLa;VR: ҹ,[)[is0@ jGra krNeS vanicD &+ٛ8[rFsyoSEDub{MP[+G Ϳ>ks\zU/E/e.2I Qzۜ9d(B¢67o;ѯp_(j籮-u y#QU`vUKFG.ϾJ%LCmxU@ |f LtX]ۙ-cܜ׼ 0Ǯ}13gh1wd#nAȰMeRp&f[FM/>AO"J8ﰩ}'hŋTf̣1Xn0Ax^bKïoHdgY#IXB25s75ЈTZ6EڭoVemwq鬒E/hZ0 NΪ{. Ȇ "b!IJ܂ E"9C]]46|&G :WʒE㦉r5l TBo"pN\B?jCӬ9Td-kIe-TBDU8{|ԙ> p 6 JvΕ !ofѤ"ڱR$3Ȁ 4`a '!o@~:&"˦ iP;o6|5TF@rI&8T6 IF"az|@,TbJt1iZm ("5vȅ-7SEF5㮝BLe i{w $!ZTUuZX1 + +5$ԆI`Xʭ԰7K%R Aq|";2< h_ZbS3dlM9:#Ն@Ctss7ަ:_ ӟd~YcX$as#bys,"=%8>0eSlll.MNlP+uy[4Xltq|aG B2ٝ 8l^ZX ŜjqD0,ud v̜K?`8-S 쭬A5i 㕤t.{q.emeD}vCԗ2RDYٜkAn endstream endobj 3257 0 obj <> endobj 3258 0 obj <> endobj 3259 0 obj <> endobj 3260 0 obj <> endobj 3250 0 obj <>stream +HWn}[6EbX6B`O5CY9HjʺꮪSNBRp(͙!H5wؼ:}cccxˬYa9U}͘ȍ$)rNsÆc ~m6_?6ﶛ[?{b{!9`e<U&{3sI.r6/q+v/X_^v ۻ#O&TMOzkfgG)}|s)]Pr.ӧW=Fj반\(r2!d{[!\MѱO`9ߥUapV5/CgI1v#-}v[=;Kt˒@J\dTJ#sC)ùF;|yqWCݵKi$x$]< /&'Ypt[޽qRH8wL@[ؕG+I.:[3S2bEIbhz0COxj֡n_::yȆ+q(}`AL(\boӷ1 !"̗]_USS9ɏgQ:f<ٱߞn@>=t* <F+h)C S "0D{:\#Ebܐoî<|KwԟТE4yRxΚ3L̝> ?sUKt$ߕ}ݝff#ZRMUe;:$}LyJCY A:$wp.H,'}=Uro + ̦>LߕCWFV֗zxF+&%ћ B]fTБ.T< BqW C5 ʓ2 u6s|ە. @X0[a0aiZy!'^FG/yIkdA5r6%J9gS7yMW- +_*y뚮GӃ9T)߄*Y",hRmIp'""O4aLm瓞p?SUߖ98G""x.f4~MwЛnZ$Pb="~Wj Y$/ 1CEEͧzB11%v0ԇcsXeӾ:P]3T3z +ˊZޏK&6̓ \zIâdvݽ=cS%I\r0O(Gű=/VX%:^G;ƉPn]<ɇb6eT~&\yS-Il+IzI#U$i-f87|*Dx)8ǩҤ(?VWs"ڗbIAb j-Ш*MN~z,2Thc \%d"Q> LefTY7Q>CoBY⟩n:ќQHZ ?IkV7XV")ȎtvxX^M=+ՠ +vS! +(Px<-*OTLc۪Pv|^PĊBf2Wp0٪!/$Pi{:\-4* kZ_3k&thu<^= =II_8HʘX& +jJr|@yia"qE^gFo=SٲQ$.l\Z:C)S+K; tF2 @$c_?= X:RF%1iEur(򛩎Hum q&s*<@Ff4P[Ǯϑ`fa \,`!<'ɴ:/Ƶq'5͊lQ& 2 +zKj"n f.,]e-k"Cp+QF(P*A{؍&5 PgnC䆯 I=/gzaâ 5b ʣvePLM۟L+Fؿv y`g~8݌e*a"EydϠnOgDj35|"Rx/D.ƺA灋UweݔM倐&WA M퓫r1"LNt2wSEذ(gV;$O_}X8Rx?'g<Q" 0UR endstream endobj 3255 0 obj <>stream +0 D@&M DQON-\JE>۪w#bQNJf㏿%Ti:@_0vAEr;兀 -k{[k~< H +}}Hdbm0sF7K-okOCw/lzz%x>eGک?S2C# R +ȡ6V܁Y3J&Bc?49@Dc^ diE~e%kNQ-~x^ϟyMq@'ȄSdd9CĞ82hw:ڗ*ְy[+pvjs]8!6g9- "t# He\FTDȻ@s Yd {6M^y7]* X 3{;)h x_ݎc\Oc*ɬ26 @EWsV䔿.9n94y+*&ړl@34|o +2s3CͣIe~ўD!AoReaĦ +H¥1 &m{Yyt>YDir/XՆvh0Bns +8rI:8UR=>xct"{eג ژAJhJن? 5 d'Qd`؍Ľ1fZ`;8IX·,CWlߍM'7WIW0@v X8Ũ5SaT b:C3hI &[̲ @ Z~3JN OK}|(+NbD_hvaor,8Pb͎ +\HpnQG~Tns$|dxw7k6ѯIёtTeA:xh{ vLm} RkV^g1G,sgE2=r9_[tnjm?@8b-Ʉo 1.5KM +¾aӷdP򃣳5*yL`nq R~ə/ oħs֘ҮC҉ތbڮw d`RN1*Xk g^~A +Α Gh\p*`9CVGr#?@b@=0$)mCVT)Gܵהƃk<㑎~! fp3dw)5'!^9aUٿ,GN  g6b/v+%[Vv-Yp@c^U^6ҵ'dnu)D~r +,?6wSn&P։^XtV -6jQX4_uѥ+e{ֲfF4{5&I^ * |:k],7c xe-ݺYάUi8,s78 wH^q6x^CAHlA$pWW-H%uקЌ?,т]e5Xꈤ pHT@FtI('iD:!BV=W RFap8;duYx'ܯi^n\39k:+8o [dn*h-:HԬdw||qG<"J{4H2s1IT/:_=3 uhmk@ܟ\DEEkaѷc/oyקoƇ.e +rcyLR僵 `{nTы,]\3I90ĔlRfPe~$ 4f+vAQһj 9rR5+h >mŬQ0OiCa^Fgٗ8;)ogz a Q;sER@"uG+C䌶S=tP+Yw#3+$PXT&LL+LkY(;vm2gYe@[=-NXэ=D},\)'9vU$#ݞAC(Z1^gEj1o+Qzzx܅|z@B"}Hہ[W*wBuMgV]^ kd@oVa@>s5uȼZzC)dv_Z({pH|]eTw?g4]=m~ @G}0A-xirnmˠPN5yV%ɌǘTϥcm)/<4NmQoLtcIm+U;}g$@52m1Ch ۇhn?}b6ޟ5E1W~ùtƹ }NtElDiMb81W9Yٓ>s66LNkEa^b0v>-{ xP˼`"ssU 0 e#w0^$NJApiQ4^U[ō8ąH8s12.pne#3KpM&Pdd5q⸞ ,A8Q* +Dm̮o;& +7+}_@p!xÀ[f3A aAoc> +m0!Wį +g|<Xj ͺ%wROƵglhL@vb;׼,-~k z#8T$Skl*_'&jKQ0.xE19b#>4K$ec"ν£ߥ9n[=IQ֗=o➹^0b ٛf4; +10W@}ze +3+xs"]ρkȆ;O 2E ħO 7Ο/`l7LIn-#!Vs2ZvH)wC9UjEnHdˏ@RGZ#r)f{u}9)G5ؼuwugQ01fLiȦ]u@ozY^?x!6>:Zc;gEsLmfHug{vzj(g +EIDy~ܰ&D;duf{ϻVÇ^ZT7Uep)/(Vw3БWGLG8\]ehfc^+3.QjgϐOQp}hDPZh7K3)f˔ɝh[+ ;I/p0g1ω.qP@!قrNgߚU~y״.aH#O *kuVb& X*Ϲ dWP1Fqvk?"wK)#= )C BC5[XWN7kԯo`%x뒇TPF*$kǥ! mֶдG^ cWgn|9Yǻi) +G*s-<ۓjtM>R8飺N/wشs4|c)޶G.ϭk W|fB2\oHjf},n'#TyipI^B$@{"&xVgjJx0S̄֜?VimIBshaG(K`3HABˀBBo(!2Y\FP_vG^#'>@0v=R\V.4؂\%3x~`\Xh 0پz$'A))դT>oULjv8~,U䳾 0I nL$uXHvpշ +keI;;:/n`崋OˣIЗr$4Hć`Ǟ#;r,-t~S4V(X{$XP;(u"064,GÛڧ&v*0'x*V$eD%_XIdmr:fZ^Ղl#ZB,@g, Hb7쳶 F?nqڰyP_NE2i% Zo4Μ9U x45 + ɤ .woí"]_SQ g S_;˸-|% yfBRFW$F kMH:w$BmJ-esk%3_O٧Tz .e]lε1O;_E˗o< +-(Mz|$U}7CپrEt*usuwY<_w]X:vɈ4 +%N`u#ciC;3H`wa.~Hd#ιCg?c+iytsSdgy?kc#Y)\סdpL*]Y׮uS;>%`XVaO^nj1)jл&'cr?/AAy"Cz.Spj @k: +M]Eie2B?k6l`F!aR)1#ז786vmYJ蓛i?W*[qWauwBPX~s%]޹|$%a6S4 ʇGYg©.It6H[M +TFNך9"J?c, +aTP= B8c"q^h{S ܓ7r|MQԼ4؛FAfzO֏G&|`gVv>z]ѝ9a!,I=Vq׆;$ßkS~A3}oXM)PI +5fN^gMFHr<B0[jKZŖLD,.X}yFH*FR;+3bRFą*r(tWfeo\AL^<ҽ4iYƾJ}&MZ q4J!basR9vg?hD+^<ҀԹbz*7'iۚ$I=^s:㈓ TBaJG ;uFu?YzHyih"zϟN`øTjH.E.\F֫`1Ze*?%@l9%YJl&$[):BC;?M[ph\J)9= +zHTfw~ˋiA`CHjOSZѕJ3#JΧ_iC;.v=_JGUʋ9?}uJ|uJU-.xNxIô3;$7`Q$iqs#wudXB*G"li=F/xmMB:LM܍^Sq#PKIP+K?T1;.T-[BZp pY%Bd#Fsu404+nA4g"ohWD7!qyi]X7WQxCʣ,{,F;y1<Y>MH۞Zts@ʺ+,xar>sJ[T}c?lzpaL nBLC {wp2nK͞lyrul=4Rꆑhe˔hCqS DEO_`]'1Oә(Ⱥ+U4uTaAW?Pb7 +߻ b| >aI! +KID;IkQg.jOe|5 O/KZy'$)۫RRpU@؟VݚH#\/OOIr+ G%Aɨ{.љ`J£W|6csvL4XnOfDkv Bdt=<,i< %Og0I|uG(`eWJ茨r>DA11CKFV<tXkP^Zß A扰b1]6q{dmpbʗi~)( :րW0~+V|^jW6X_DC-k,f +!ڷ=i7FR4on^LBV󷴕L ( ++k8>cZ MtV hVuNOLӨVWdIMS7]ada +-UC h cVJTYY(`-MA O3kՕ3]hy߃pN$;Di:06%̀8?w10Ȳ\Eۆ6<xBTq yV +Ɋ~gGhmI3tTך-4+;;/CG+'vY@ϒ3rr&j^W/ZL6L:׾-1Fhn N%V\Ԉ0;p +զ35Gm ԓу+]l8 *Y򻴇˂ |}?1Vse3cD ,,, +(.}$yv(PSH9BT91R9`Y yyLBDwO +W +P CHaPYkҘ.ʒF +P E:2Ϸ~d?߲}$&b +K[/O#:E8UU3t?(MU;nzА`~G^3q4Iz1@RIQF҉ z "$ o=@-⹂f6M?LFKq;JI}=qb(?}Rx auy9v 2cAKя[}6W۽wrT1%p>g\85sqj|(J(w#X/IpWeb˦kpj7>eF +\u$뜃uZ |t'蔝*{_ uٵ k]WkʑL"XIiK&4SI{gs3r";%7P kuS"ÝD7n`^rl'm,|o޹m{=A(GQbrfOn~2GBgV9D˔(Bǂ0Hl.Rl9_rʍx"RE'q&JsY9! X`ag4Sg1x=748&c xK" &,f.u^@]ʋ K!C8bJ#R0zWbZ,ӑE[\n{1A Wn66|#Š׫f--"/ׄ0vr| +|mmw5]HqJ;T]2[p6I6bj!a,ͮ [;VMSF(\1 ]YLJ=BGV Qo5A`{2w +<_u<@)Z7E{VON|Q]9ln]Ƨ2m}u`tsiJDuyLa0Lsj %X>( GH{çV8m o-0ٝ,r긜FH/lbz&>xW< ,\eiIyN%xk2$D8,?!ޚh\!8ٞh̶TӦJnm3!)(eλxy1W?2^ ?_zTM#lT9/<*z~H(vfNb):`|3@z#ml$V p7?P[}Jigi:ta#K Jߕ>!%Ԅ@d.(#fl-p_T̊\~r!O9TŽѴ&R`^ų)eVdfU,c`Jr:2<#-(%"f͕Mi.=T=G 55ЯB3^5azb2_&qf +L'rR1'br >9=},eq!p9,zYV53c+IWQ+~`GoqQ'鯞&#aL W3wHj҃(Nh 9D~XE@NV1Dx ylSwf!Tuurb,U'<eC}ڜYݡz.[*9bB/6B uvE,) +rhj/奎U}Vgoӹ +$geyz|:}@3t]%N kI(iU7OM-j5Sq sybkO”c嬔&{dr|6dKWi1@;L06UC'8MgAqv:U\}%dL)oHj5]@t1h`} o'W/-l8G#WvvFtYzv@XAyEA|ox>WTCNI0=tШaW *W6q86,CKWLu."!S +ena F@JqC*$N7G-L/4:!4xo֫Y\tgz,,$$ڠ3Dۖddv~f.ôv+98QֵsAyb[r~+bSœhT= +QG4{'xū1ä$X Vg|كrbn6eAn՞#Y|{^)cJDW.,x'N_/I?EJpY3D9,bP)Aw6t̀jt/[>-qb+}ޯ16Te_|dʐOAr +\>닾 Oj֌:Hu\➠"nڹsDӂ-K0R \p)po=JPFs)-nq˅4=l!ퟎ-~չB`PQlKʦfh5`;I[:Cu#HɶOd&/ML2Ph,.bO"=%Vf+ɓ_olwGS#S]2@=!x4bZQ.8`ULt5,@e`AB-Bӎ%EGF݄#epW/<2l9%AsiMh詠i PUBޒ?N0 +j; +@;P)<јNj]#e t`ȺQgXm>z EIw;/7f}*ĬQrA{i<_?WOemMi.diX:tXдep A9/)̩n[>|ϒ>n +p%TQb=? b_}$[*$>UQ\N{u,t$NU+=;5;Q*_,Ѵ+jTP0oS@m lm ͍NJ-lIKLC gAIbw/ _{ՅumLy +!E(vTrN7F].DU# !W>oy;9]+*"9\:;kFu |> }0ۈXh]|o(j+`[r_H)&L6<@]ⶦOJEi~rGjFEpuT /̉<$6ogSrLFO6<ҸF+D(=Pܮq +?,PlJ~W1?(ܵ=s؊51) P߅F{?N#l6MXھas pW,{@qѩfD!\/"yywz Kj4ݍ?~o>KZ|d`1X{ߛ&zn@>ǝ`KZ2n]F@su'76vjBrxJDݢieVڧ>ǪE\DktH"ͳU+ft(kރy$HƄUc#ŎH-:m~kuB1Z`GB.#^JaMYwX~d I ]G KZ.9%mAEF[TϔjE'Oun5EvX\bhqWڈ(;C=+x>u7djt2B25ZCQ1~YJ#uM$p iVȕ>9S_B,rN1E:0ł+%*ni.m;an"B;[BGg):l?(yil·4h[K7H_Sƃ4 lo1ѶvM"peln&)a 2k_FAҜA~+xR˃z0s.3-1G_W|*)1QAECg{xn K5 9CMqd^hQ>P,2CVOh|uKV5ɰʭCtc)O3(+k&k|dx֎w{medpy!$IYղU^~iQYk6Sx Q~)iPk.2$&NZ06jRz}ܟZ|mC'_xxgaUh_bZ퀍u~ gfn@:=%T\T7]vZyYO:^x3^Oɴ]bZcrak@[eu턱m>C @1j׈ +ޥwPQ耻kˆ~YjS#H|g^M +1lPĕ! }oܭ4I/~UW{&|cPȍ҉ʄsxB٥^8uy:;yt=,as76W^HQտBx 3/8|nXFQuK`"tKQ;.J}˶ pr2{=J˿f[Vxr]::oe \n2c鉆CBHYNɦOvmNt+:ƧOʜV1=NbL^ g"N^q*M TlﮦG*kw ±Ap]3+7KLeEjk:gױziwLx=%n }YGUP\@:ʼngr_=l[r̋έd 2#L xȬH bO Cc{\pTr yNZ%aVk&U bj!H ?["v2\e2i,϶p !u_Efd@#.*܃nm;fG!/6߃^ry%NNQ[>d&b[pIY62yp&gۜmG}w@Й06xUB"۲CVT[ +}fgld)t2[zQd^G2ͲRލz=T1DgĶ^\]fSGLsF)eYћE8#yGǦ +ҡemIV KY,-.D\2sET0~-3T=2gZ@?A4\"EAQ$:;@92h9I8~vo]꧿I;dZtmF:DU ik+6⫱.$ۿQoY%k4@cUy٫^}qh +HcOɽY\uJԌ{6: ڛ̘[;7"$ {YU߇_z7!ͽϏfJ}ED85ռ_-7C@cU#r5"tų~'bYׄcG1hQn\&oi(TB FJ:cz@lBIl'vZ.}BXZjR-*XDeJxFF1^ ]Xoec,>,2.J}{5ȋ?&UP~[/xg7M=$i{K4WEԯ?:ʔQS/QȬ#fjx<[͠/'!P#V9oT=.O";:\z0Z# 754(][ j}Q{}mXkFNۻy?zlWVL.~#'M@`;Kdyӱ_*`!@2U/t#Dok\;U!aӽD%A]km!R/J]~Np$B V0`!;ǰ>v]:.nLDhi7̿BVd-r{:YƂߩe$y^xn_rc<DY&BE76}QS24hw`Xrxi@xw63?Ѳ5=^bkq/Â,/h q8 7Ja?^N ߭P1~yt/&5LT/&%命^5Bqɽfg<f%E^~}9!2Pi+;iK< jNhI$c՜<|ĝDXe1F(UNHH%FHpޓ0J7Z r>ם£}z R)km,pY7 pf YݘoXXglV3*U*wZ4\ѭX|dЗjã6[#^ROcŞ/ޗAGY^j'08ws|pS^mϋ'H㛖ᎳAh oC#Œ> endobj 3252 0 obj <> endobj 3253 0 obj <> endobj 3254 0 obj <> endobj 3246 0 obj <>stream +HdQn0P؎]!wHT$IԿ_ʒ:{t8) +THLݒ p,M5ūAS62pgtXO `vMvc9ۦ3j +Bs@u}n{{ gY"͈Q0 <NOsB, SD3 +D%t)_O EI$9(' T ?ҟm9llij; Y2o}Lyng@st"ԩlg^+2~ +UylL\_7 endstream endobj 3249 0 obj <>stream +0 _@& _r67P[EgikIYl43!ӱ~. A7ڞ·yܝ6@kL"lbt WN NH~{&)x s.9?8,.X$IY&ɓGMAbҋ;xkOm5ܻi2_/{Tx&WԫUhiԄYy*7]2"uA%PrRBL uE+NHa5eƊWdž[? +a7 b"@L8ɆyJ>p +Wy;XXb|{=#@˿Rh]ƠM.bLUJAxS!NȞ}Y,{Ms[`oh) pKI9d3jJnsXܨ]x7u& "@8=u/2ߞZ-E +X6Mm[ʫ䴉d$xXdtrj4_9}g Wya +{)ws2jb/g<Ŵ场lbsP2:z#ٹ[9hȈ"qiۭB%3 #f8 ^]1Eh8f[`hD:T7\ $rU(=}33,xE;=X\鮊~v2Vcd{`IqU!_n'!'aLѱ_FojCT1M.0^72jxM Vdi[0޼ ,wl3ԏDV|5bMlRlB$_gYxZ4-i: endstream endobj 3247 0 obj <> endobj 3248 0 obj <> endobj 3241 0 obj <>stream +HWmF>B/~o5%@ !$kCc3ؖ#1SrkY u=^ԟwL׈qL0#P߽noZݽ_TF^VC"bjvn=uaˆ İQ}؏&>aEjADkiFTj,*_k^ MXkJYyAM%D:q: z} l%0rhބM18)žMzԅw.!2*Ț]HOSa &oYT%CMD&!܁coKHE&W1SOH?(O?漱sftZTI6lSn?%.E^L)%j(+B;?Q},Nۧfg7uV (Z7wI.40Pە{?gւpڐJ.+כ,錳|lǴ ,ĹB8D s ;d?z=XhnL{H?"E*kP7BHmPkbM1/$<n1U+Psվ&!͸Ori2Z_NW\h_bU`4sWjLoX+m{S\&Bhnt%R#UiOOO_S/lK !#j +q}i~2?XGb|3!'o8LIc R&,T~K 2O5b8E 06S endstream endobj 3245 0 obj <>stream +0 H@&0 HZ,َGG(;_#khi +sMt 2^Ckw)kRdaf;iw95K)./sJ$aT ?9(qY7'XF&R.PXёԿ^5DE9 +ǶS gO@x68 ʺX~eL5Jh4yO5/zLd56Ȝb29Ā =4pԻFwkDz gZ,[Xy +Vh +1 pu^jDžM1Ax2 W_H +le`muƊw U}zB/Au*evȫ6FR)e>B +$/̲Yx6X_4I6/z>OT`됊GdVm P^AS5m\]yh PMdO`D`C"y;\Kmn?g jI1u iN ~2^D +tM}պ ٢4GF2?-t +zCdoS1pxr}+qTT~$:>RP.esTߠ"-{Bq6`C#i |P[QM{2|oC=d0OY>lVJY%nUa_ j1]3SM;714ObpX(~am5cK>Zmr0P u"$v<VC 4-ۮ!T1?b%ޓHJ`H6J0iwʄ@Z}pBn&,Cz{pN|֚.5Q-&ix>f%g~brWzgTN;MaL>CfbL)]^7f;(L[hZp6(x(|-</y;lZŞ&<]wp:\s~l.\˧O9 vSGO^1gaK y=*(m#*'"*hf.D(D=i!n=U@Am12jQ O^qKO$ `F]{%%E< qz71!]%!-!odBSf/{ ɼFt *hB^0Zd1`C i;#j%ּ>b*'Zj@B3c^*}tO4:o+;Lm6<!um#HB'< u2}4_צ'`X!;jwMr\%TԘMï>y?lߍ-ъ^ D.pq&䶦I!ps^-)d\nHY +hC@QagqbYNĴZ{$pUA=Y\HT-NI:p BtRhiyPO4vMV + nݙwxQM:怜1-DW6ftv.H#g +ZhWK7 GZE64)bB诸"bD0, Ysi(\B75~骖NAt󧖖nWWE*N=xUΧgJ&B݋Jo[j&CmxrQ|CfJ|Ѻh_9gsӅPs.E(bm!9c"̊z2%v䂍r>cBBi&i#eJѠ!d.$WMĶY ^IPJTZVIbM6F],ZI&~o -ƀг, QK_Z=c%&F8D%BO{` BCY~V,ltiyKlĂP,2H# G1$ o"qGjI*kTcy +Zc-oc)ir34dIgOT8&_ȹ]/=L*:Y^eEp՘vG$T%DQAZ5kv*/kRC--lBs@+qmpm)b췍#,xٞuǬ-I-򯿀"+EOM;q gz^w))cˆ³fd~p(zB["?hx^iVA3qŧ )/C(~lqY +Oe2f:~ YD\g!إ Ynؔ.vtWذ{4C+Dd\ HjӿhtV|&+E^.(zJĤE$ +In3xћNDԐD5ga^eϪUkRNy Ar?7 + OqCPvJr<_$w E̸<8R5h.Ȝ &Њú^"L97y|U-˪1p4AUm gy'/e }/Ezg&vUi3piv/Bږ݂Eۧ@Wql)Wz3oeSFG^Q!CK +zä.mh)Zq54OLCJF'lAgy.1Fʀ<شBCmO$̝\;&K*G̉OضPP6muX 7h\|TSpKmn a^и'2fa+8'휀cGrZQU"l* ո 7y9nfo[JݤNPAʉ@`H JvѾ!@ĒvkQSʈbbSx~~SqO]E{m Vʐ$y{T͗9@V1?!9=zp=tRx*CYqnhhI a^y0XtɜעP(@&S,0<'-E'sa9mf(*A1!1ﶓh߼z)O-i `>Q2GUȿwZidǮ^Фx>(!,bl}-=cP$@m^Uwc +>(MK2%=AvVtGy̼S|X|#7)k_zrsFXB( &;&m;r_y5,ai!z~FۍB)1ĔFj +\0˅šAܝؚȞjb5▨gAwbӁy@UfW6VP5yZ<\c^FcfjO$J3JJ]15wQV>+>@'1d _ْ;Z;xMڠоf.b5QQ0i٫ 30 +e1=_9d$oDbuG7Pb WMx+ 5A%yJ\''&vi<"eLm֢1糴 3v> ,Y>E A#U9uQ.+n _tBg^Cp:!H/KT+`&5C)(+ˑEHd$}^nsMX<?Lzi>x*wt~;da~2^ ә cDv5f=rYӻӨ/C3Xf(DIG?r/^U>?*e?+ύL &)9LʹTkitZ7bm ~rDqUgo;fs([ԏT[6UF*C#xZF +d>oWݙ0C6m"o#bX4B/;+%=Ɠ憆wꢈHwe.`GCMGCKi7'(XMq`cFs#5Gz +ExphM9ת 8jїaŜq4)׮7^:y$FQK]Aԡ^Wڭ6o?ܧ$lO)׍_7ں0ҁ&jizD?[Z;i%}@CG-cᨉ.K>JΕ"T -SFUL?&K̜Rͦ&hT nc.zە($3ʜ#F}!ohivUl?ݔH܎N4~‰ьfWH[R}R7[I,Z"%wgpdk0 +K-(?[owI -p$dR?L~xϰcN}j +T8)##5QҨu3g5C:=~ė7s¾<F"){m 3@Tr(ڕfw ~"i]e:0}#6' 4M "k7|:V:c4։M*pA#C}kf]D(PK#Ɲ +f_7d]I +;`_t+Y3g4C*~mnWuPNVHߚx/R [yqO\^vbGc N&Ut{ᅠn6^?B[|.U!37;+=bntZoc>%E{J l yL)j}ZB:$= i5HcwZ((5Q1d1~X + j:U67 "ی4맣ƚlbvvTLب5zKiGckg +> T]15CΥ-1p|{W&> ??t c .ꁳpİk> +ɚ!OB N,Cz0=%"!Rm] %քM7WƤꣷb f^Jq.J_ǎ5E";ɋn3B¯ƷKU,\) }M8~e'AVqMz<* 2M#qO94ћ|M8.T ک>P3\DBV=vj5>C-^9_&C˟-2=)z?֜qm 2|;G51A[<6V>5h;nRyZz:#"MSRSvW蜇 +HNkԥ&ގhVU KX}2C&qPHH2˯p G +]osxa!tKR9opۛ dRь7 8H`6ew;]r7%Y ͅkγ4^+$T[TӒ*w A W +3˞/~52SK&fN:\XogD*3 n?/,%\+l4`~s0y +2vkM6k;?jsy9 5xh*KM@GF=!q{g͐Ons$% UY[@lQf⃁@T*.= $)=!@)}1 >تn6 ZKp4 vQߧѹg|9Y.Ҿn<>QgDKX1[<*dBMFa lCš˛ n#=fsu$8<gG g%1#,<ζ/P&%w![i 7{]L.2Jf T3%`6(y@1[ <'yxko$, TƢZreV!n% 1Oq=Aci0SK`'\ŘWBMOΙɼDZS55X*d`ݱF{fT6%JXNIxHZJy2!Amk=64FÝ1E*YQ3JMU*n.&沗Cq:-ZܴLLLxt7NTb=LduM|\_`u6hA5=,BS_}Q&F)Ai:|rZFfVN2:?~XWStLg@eOdkw6 01F``Xg; (~_4Z +AXOiKPAOn|kZ2HAT{Q8L=08>Qq"v% Hh^Z +i?qg՛jT$96֝{qw>Ъa5rB~L{aw.OSPVSK~)w8ͦO$ d +)筦C,uַ+qA[ yq"'rqKn@"{گܱS|I̤\37eXܯ00pi0ha3)$Sv2yultu}/<<;2\*:y opJʃv_p;9*-p 'NpnD'G"dX:+) ΐl}Ρ($nEjuYEܶ}2ݗ !@SZ +-fZ^ɖoYuWzCgEdžGo<"a`Σ3Bb( %4.곜;dNm $P?48t ^} 7H6<6eN{㧵`!^-{u-SK—~P#p>Ef\|J}phah`fI +_G\)kF3Ahe9+,Mx;Vm#dC_HKbd+c ]Sjch-cp)Wĝ}!sTx79O{YeopLRX}I_%u%!*ΪzcM!x``HsǭHAf- +᳈FwTl6ʄj2WKRRhwSV˴:n[!64oLlQDia߰F ]Ԕ?K`>-o:;5xoڰ"ڣ6kgBFZ* c/_xqrź]4 ߘ!EDKy-r|5ɔ_҉nd0EӤk+3* ,0mH'%̫MEo&o&MnAIWLcp7rR)_t`YkOI5~!ZdV2-XIMD!&?(<.C#]FMl:FfǮun򛄃(JF\D|?Pϛh?22$g>wҡ_1m¥g+"5̑Q>gEo{_Ay {(l%ZLz11n~yt_MjCCj(&E~X0RXI !yG+ۀ;uKڈhn }}ޟ uFJ(Tg 88T߸?Dnd#VF]*mijFm F>@W2ަt +\Gՠ7Qs]»x4XPW}A>Qf0"ĸÿP_F5*YT}V eQ88Z/Wu5$_ _uZ(M[,Ԥ#\GX(eyeS Sy/(,>XۮzP<}&hƶtxLդb'{N_d?G ĭB/)C#H9,i;?K=]Vl-+O%Ih7.]rz ~qM3c` B}X<zaZdW,H^sc`Lx1*/$NEWc!Yu"=3mc%V8_Z'zR DI~`rpC9rok6WӉ!/hf:ēqu=ijE{ߪ`jXز:?y +<"l Y t[Em4F^ABS:R#bi6?޶Ѱ=;4wESKUib<&|+ <ޢ"lrԦ,JɇB8)e Ų?=K)ڳt_^W'E? + Zќ;}:ܑas,:ZgZݏ'$Vpɨ)BNsv~!60$NɎ+vB[ݛLzs^v;LI,N-9 ++\B{ψJ%)"{E l)DuRO}ðFZ +;rNjƘiw~@ +AijO +X \"(= 2X@h{D,_o hv]vl֖1 -rx "o8-OxKcG ӎDw#լD_X,2ai}׹zFxY> endobj 3243 0 obj <> endobj 3244 0 obj <> endobj 3234 0 obj <>stream +HWnF}Wm;@ yq-і8մ%yI]:uΩn$DJZ-( SFY{.>7d X>PBY%hw["Bj|vuݸ~?{+i/+RU-7vOp‰?R~dD_a׼/LYΔL#eiRHDԯ)+{S^ϥygԕS39Ԯ~K=/$9ceDr䙟~03``ܾ.k%\͡/UJbNp" vUVͽLQO1?~Lm_|MrvUM.{PV""alm0\Tǡ?>ۺ?\ۛfhOFS,^wmob3_-|< +:oEAغR;8ҥɇ%uyL#I%:st](^RW:YU/NtJVk5矆vl{O"|-;4] 93B8 W~Ts}I&Ɠv!$ bS(!WnF9`J&mV0! XyWE(ag"_G ;ĎڿF17gZ.4njau53s\篚{]6.U=4RN8nwQ/?%" czxZ:GAa|>vUj" + +ŷj1c@`~DV}{=\(*`Fvƣ4Cp: +v[\QвAXcb8OoI0JG?53 e4L[4w}8BVa5?gD$[L*U>>Ո띠J!\0Qr/P, E«ǿ_flE B߿Ϫ9&E4 L6P̍!QQP|~?)]p($FS<) /IfB`™߻E51f gE +W}:zfXUrF7,`g4=3hg-8+h*0(PTc vHXn/s eNk- }Pw 'װH+|4ʢN1,Wvy!BAWh` ]"Icx0G1?Mv +!O#{ālD,]@W`j uyR?cy4 s\IV꾦֊\7TJ81eծ,SUN<^ -}|~(awͰNC}c]v-rgkR+R.RSU6iRsi<އ Lr=0p/0$"1NgYa>ZzG K.^Z<_YS6'k׸vM͂)6d&[ncPw_ve!=HڢxMfIrml^%+PX.vUx?8ɐ1⼜v- V/,}V.v`P&5+_t?]3)?ӏZ)Utap dxFg?,ٽL1BaꒉKqQ?]8Bۍosیdq,2Sə$l m:-q+43ɒ^J n`-ܮːA.17đN&FDk +}|3+ז"UPr]sݗNfRC!@uБ:iF+N?z~ue Iȩ:Xw{3n E)|3 &s +'& F +˅ LXF)+RLɝ~_Cv~! .@حñ/v*K8Z&q@U*|ιǂ(Vvbtye^fwwdYp d]ea{'x4ȕ +(1?*N2qKv=$;R&! Զ<oukE=eDRN7'X(H`u3V8] sL9ؔi9*iXKJ,_p5_-w=kǠ*<ڂ;LۍdgQ"%TyLVnVkC@Ü=K7`qq|ͯR#X"gN'OASR=a=29)SDmΖjAjXVt22:R;ϯ1 9y!KQM(͜q-!F—T~/H^ endstream endobj 3240 0 obj <>stream +0 Q@&_% Q\E1+;g?'ւy@*#!fG`,YwheR.:JvO4庬LT ڃ!^Kv+.ysn{{n⤢'VMqd ,H{B5٦ FZ"E xvfuu,.TssJUx5>茵ڧKṅIa@k +H^@B@C8' =xicݥvkKܹ y_{#bY=ܻ{:]9vr.)ѝO4 ĭFDt̔$׻@v2=}FN!>=cZJ20QFmWUc 5s$Pwڞ9v8Lӭ-ڼbiVɳ j3{tE`նEIs @(9i g2uE^MkG-"U)>]LrZfj4By+he4gtMkCt\yx;#Fӆղ3ta~%冧hs9I%]ըFvJC@*Y Qi7/+{E=Sg[:1XoWZd֘ +Ŋx4or`g83*: +S(z¦ )nېAUiY#zK#gf.6yE zə렜Vݨ60(0&"uH F4tPGZ7*Vذpc4%V`MXVR=GI\>Q.`w 22԰mH)h3z P1vd jJ>/n&xe.6&>!"|YVzݛ8Tq*Pu~}G!j$~H˂S +jK9rEAZ4FC\j4})/=D#⇞\Xpax3OZ6N dFd"ҋ'vza^*EqX$JB!Ih\GyqY%5? Mu*"E¬6zza rg.¥ [?7#Xjchc3sЫ8Sy6Hä}|([30x4sdӟ?οcN06w83J7"]U*LjԔ~)49]Hw 9ƙR1{.uFhhLjb-pKk}TkZ%]=tMܨWVA¸͈>"aE50#P K7NbkIpr)e$=֗g=w"4@TuYO(r4(= ٥'$Ԕӛ۫ +G;@.+~/\9A423irL3t}~w:'o6t͜Jj+hoF"ĒQpѰ>VW''cHYUofm7P6#B[w](4͗:OyXk6-5Kg^4?UgY`.~ l2PteV豯CyXFYjo3Ү\j (b+m^8C{q1wCp{5f#pxƋ>3T.A~&UpænkӞ^sބ@6usY,P U8O3ItrL\S2o:5l1Xޖ 2(4|,O/sb6A$4 Dϰv =jL2X<]$aiZ5w.ݞb9ZzWǦ"tk#Vx")d.f* ??s3?0F3&XlL(LX ӽasc{8LZ?/mVjvߕܣ2 k +AóBFhZ~0DƒWtI5'U^:Wt +rH9:<OfHcm"p}04YgZ6gؑLL*a4 ;SFv +efen; +F_Fš @ft [Eޟ &S Zs| 1;][xk"|?sd<&@ u=t֥OrڗVZE& ESxz)#$w 3 ^x +W ^FRHV>;ז|F7՘ݸvN X2K\eJ |m|Z:Z.^ Q*4+YF#&ש @OzI 9n32 i4h<9疥#$PZsZ3 LsƟywiϟ#ޖiC@#[*_O/E?/^hүH\{WضAה$œFWa 4$ƿB0Dp@Iz*F`:Κ=Om]v׃,ƅeJ^ +m)?(_reH +^@HgRENPdIA+"8O$,lȼYH೧nԼ҈[WA?Ī+ˏ% S{vT<%@^zhd-uQPV3 r gWq"j$ ڞUor9 P3»,HGTPlx[Bp/\]PX9*;~l| D*nZRfj_tn&6 ay4eXG$K\PiV1? uo):LME#7 K VjL*mj7f7pYƋ>!3Lhj,I(HL.둆4&@/>@ - h:BVJ M*Cvg 7EU1隶r;cF)2E;ǡm㝬7bE41:Uj!Uŋt$Z6>xH`ЫYaP"N +>)D5O|7-suH!f#u6/:uQF|,:XQje[X (j5ȈeB3R<"!~9m˔+=!4Dmo +<+1έ.k#7yޒqO]v6,K +lRؤ ^PFQ];6s왭%н=%.e?'=iʭWi- G{EC}vwD0ürS-@{ӣ7/!_//+@kB,2A֖a'W]6ܡ>!xU'uռ[/~@B!J{NxJH&B]xvleX#F[DB=u jF@6|g}_CʞD]jLKUT( *)eZ>JyoxnU +su8IH oeW%|[_9;OUNGHLGy [V3N^Ϣ8%vrkj$fe0vD>c|޴@dsJ̏״V\PΝH^JkŔsMdM=fMGl69Ι~1rqr+5lSK0wm{8Z"TN3ek`Fyι;?N4q)QFQ+ nOL:9O%vP4b\Z øS8!7Bwx8lKd_"v>XtpJ =C!%.`@P:Uy~*hɾh߿)2'iN-{6հLۇsK +p?ObA։Ah_0IyI6, t1QCaIF{~;kY s -szt +g _}uSuJ/@9xr"cqnQ#ph%[dQE1H%vr @7zVf[MPolߡ0OUWh,R.vB+1F<_Vt)?|ؾ9lYʵl4-q=a wUL 4=a?]>?(t5vRu'u4_.ZтIVে{IeQ)5,5N31 RzH?ߎ,RFQDH?jTt6_x-WU(9D-ˊ:meE&'7ߴ Xn#XRk^ V^i3wj;s4W` y@a^:d+7iN"u ԬOQ@sVG"}R5%r: zPTEGQB뾷pPzסThRnkW(7yf<ֺ6IyWpjm!3#ʹN3a^/ֺƏ>sP=^Pq,g+ *6jyp&3 OFM +R¬͡j1\B}[Svpu7OռuKðr +r@P-0+Ҝ-V5bԽ.ף۴oeeJ@ ~ +W᜶0ǖBDW\\w( Zlz]&|!'.MWhf-?gߩAW3Af26ۈq9 %OC ό۵rLQ&1cYV0`_`l)xh+WR 0]-gzBWLJX/ - ތA%P2gueMb7ɴROn HN6걵s 9i0EhNf6OJGE>& x-{I<@.T4 JG9e%!!Q)ONt LN"iH@ﺜG^qmp7HG}SSq.@z)Ǣ16( 휮z<*k5QmS0Fv;b:{ +YmBG2]R* UB +$v  +8oXZ놻Afk? EE3Y33)k>nD +w9glv=}! +i㡮Vl&z1vA - p Cxtd2VLobҊ̈́b}!0f]W2E8olNˏ>f-Tcw1o_/Sw+X%ǂs=SKӹ@  ?2)")dkF0:^hhT[T{Z· &6]MJ)W&(BKhAq.S9^quhÈ#3p|V) +psL>MX}{BIat6punK7l2`3 ˽skT뚽BTVKڑ']=罤g.\%Ttޤ7 hU9g;)rXutDfmͬ6>@[v<кDm,Hw!1 +{!,kqlTu/|8Y s/?줐gq{]R!lg]xcBY˝ϖ43L6ʚ5aC%DψmgTE˙2>~9yԊ4θ}3&r˄ŏ!%b~z*OKaAw Nm:)זe-Yң=yA o.RHj + _d}>5 MIA.D)2&v܋{%iUi2^hqYଷ5o⎠1yDZ%mDno@(6Rwgr{t\hBKm.c2Hj0,.+Xu+tv}o-X)]rs$h9>KoN> ?H/$3 bT54em)'+9,9x=f(Ҹqhm҉5UA[t + { 7^}lC<\fd ܴsU@ȴ>`rʴϿ+jHC:֭a<>3s8 8Ճnt5;00"n5:odU!o" rJ(9 +ecxg_KJ,H@BI|aAcLi{hJ`ڇ"_.DB}U^7}_ /<θ5.J;{yg'y,qkmr?vJ8d(L \jpSܧ: ГV^3hϘ,]dcv*ad+F#mr|lW F)O 1ͦxWgveb6Q^jXWk6W7$ɬ*yg1"'GNcHk +^k܇C#e~XA$R32J̀gbAxuAI=9 x̱ldzaRH ~̟-=6hݞTYK5Ј䡃OH}0Ǫ!lrK]W +׎fYN@QzlD.Wl={g۞ )d$蟻:K'W=z:%Ɛ? +t1&]ZI 1~lc R1*$( >~*H-3w6fDhh>d^' f͚4dg4HC/$.fjGt;;~ 8V!k M@3X~d-6,I Ca "\?  +y,h ;Dw{3F]9s[c5%Hӆ~/ J+N6A' 0[h, 3'"yAqVįn^1[wİ Si:ZG;c 8L,UI$GG\'Vk6D!nEY% Q-?R4w pheܿ>j/6,h|)MOaj5~w֝"k:OD4;adr1JYt&ZC}"ImmHK#o}UHWXVqޠqX|BmٙfogãD CWQ;U ctGf@eCL-z*s d޲u[p|.CtF0~dWX݆ +LB(L2{IWȾNBX] {>vxE`GG49[Ws$iI( +xyDn}7 |XE~F¢h.o÷Y)($`RyZ(Xc~ +wJK5bq"$Z=}Mer Ke2:U^E{Aha1Gk;Mz[ȦvymT%P]_(\[i%k +9s z_lAY$X(+) 03M]nz]ε上tfBTV1ü$}a,%T^}pqÔXҽY8Ʈ*gN'D|X ýY;Vr-0ZTKlA 1?a5WdDus%< P҇f2-RĄL6zZg0݁o̙rBzY.(j+̬zO6kW!ywj ?~Lkvp4RM.9T%)o ,'ߤGquP ר6]Qon[m~(з(=-GCyfU&5|Z*t +vRي*wzSU)i9k4aoY2qoO/JWP֡=Z0]Z̯R„\ʑ^K~LmEaEXZ&9S&۵D|0>: + Q.8ڛw=i +{2KH[ZWn{vyONg?$!D( Zf{d)iW*< VǽSt#T3a[. !HMA%8 |Fj3 Dr%t7<, ԿW3_ި +E΁ЉԇDyZo]y\g'F|IάbtrqPji2o& [y_?O5D6"D=6,??,B)IFZҨC)Roa ++o Jؠӌ,Y) 7aUBлB $5\ٕ~Z?s`H*i\ɢ(CToO"xѦ5{a3`~dL?|2Br{5kR*ܣ~g| + =&hܹwؐ*VQ΍A.]tĎިUqGBN;"6}nw k,c2^ yݕ=^h#C3T,bاO'Ntw +U5o;1'Tv41Zwe=qU8J3SNRw H?i}G]Y.BDq3;C|ΙV(:/Ow}~H/'_TsD͕&ocL$Iw3Ltd|dh7WXLz7Z-My}(ut +rm=z7o@a"׌_7q;kM~@}ds +!"ى^ ߃0*,s^JQHl.c 3$c@ }޷@cDN5"ovFЕ |QIsv)Siz&bc-nz|Ni[Ny3NʆZ>[ul{XvJeu5chO>`Onÿ3aW;% 1v"0r6>|`h"xAΧxjԧfv!bZZ&rw)σAQqD]1%53k +^cwVM!TՍ|}ܽazJP4fC\\iE kOT냾KʹnP{r?<7ݫ,qE3W :.ଝ'ceNE^^):'H7 +F X5QeQZ( n$-L\t^yg-|z(L50,Fl/yse"UFZ63Z:"LUX Ҟ͖q4mp˲0зw/ܙߚs $o ;<*ZģmݨbZ:-C01(D. Gs{GHՃX0Z8{Ťq[Ģ 02`[4/>H+Wq*N>UmJd19QF. !xɂHŰ{ +2.T\rV@ 'J~-\:]t}bIgox5&"Ocl)['1rW# ~e8Fm,?LLsY|" # ̀G?0W)]ΤZItNRk&es5.*ḥR oNrOy\Trd!CLEc>#U+߇hvެN6U&3hHzʭJ9 gM5xQ.iSQ~*[mћ*W,0'py/f)sؚѿirWt5ѣ$:`4U"(lͧ3q&2{ɭ9{6mjVo %S0~fx4RmcQ^9̋L[/_tC:w9ʐ-G5c'gJ +9stِ g.zu;`SPɡ{l4S9Q>:Hqi'`2nȚ Aj*=ϒl08HP[`q-z҃cLBl|d*&|_y?۷cAe)-_|U*C22(HI b<GNN% o)9mJhOjubf m*O+~?rnS@l/C[V"8k +Ff]kX D_tI]0d KzMW,@pߡR&O-$9 =uq3q(m #ʳ +ཱུ@ݿ.P} F)%GjK"m^Z +~Un%=rDT8R䪺"L|'T\хT|C)eUm x,``D!A^/<+Mj7a3 %f3gKN`B3J6YKS&_Ҧh"7ڢ} D+xB.цM+$˘$#EX%ެgm}ϐԻ^Rc +@J 6绞21<ɐ)>ڤ>|.#!t$LR9;jlޱBDY?=(h#.CYrA5O m"%K>br4&Gi ?{=%HO.v[jijF5`˜Cw]D_ak@TA^81gBꜜ}10u9Uyu>&V(r'@&7!+'P{Yql5dxYj{ۭ(G5-``+ E=b z]1]9R^;mhC1jM+9n_BL]p 7譊Ӂj.<!w^Fhs穯gl&.|[.qB8pNc'¤Mk-b߰`ˠXbPq2;?DoAV_s ʀ8?3*2^ x7;M-/׊wи2*'N`l| )ކAO`$f?/VboZ⡫+n܏*g}lKx +v==)857P{/%՞ᭆ`3Af=ǻֶÁcFVM@ꨖˬxSŁ+X_fҁQE1 A 4p's#J[0`3)@(k#_.r"NG"HAH]%a( `.{:!j4w/OIYy*H4U;!'Ϻ.- Fv.gI7 YPYw8ѹ;Ҹm@)j9P>ұU&D< ePGr^ +Xg"Jb]JbӦ)q7X,oT" a{nPcy$‘PVc$M^ >9 Rh1ID8.lzgbn~{X G ZxPө߮=/NهrTREXr|QO;vC}PzC]auѩU TQw]Vn]P̸ dlwĎϸSϺMepig?YG֭tui T)Gte_u*;ep + @('\PJ:ngz,Rh5c. +ٜXMW@ ,l׽->V{B06n5Ս꠆~.G}RM0$^ݐ6Sj+wO{.Ys^!Ǿrq!uYc`b-@h +6Чa54m0IA޾ X=f?~l*%hInHnGmcw )ɔ gUP\wS vh=M@A9y47ysMn~ʳOJB\mdC|8iHdøZ` <dfg=E_.7[~2cҭ\M)2  СU&̈6TȽKʤ7zE\F7­= Y*B+Ͳ0R͎1" + liPbfz(`$2 QS_/݌"^+ۑfyI⠩ "+I5]Q;BH<-Eҿeo(|ѽ`}q mR/lȢmI%[5T? z:}IG. +(Y|oMEm&P8<Fq1Q-n'UoȁYU=Xk#+V d-W/ڋbbŃ [rrfRMi +!<N[Q9:ɽGU)9!𚻶7w)$l0n]p˕1Aǟ^!Zh|5A2euw_nzҳ5ZRS8=snIaeLm`Ķn V.&<$/Zچ" +g +djeI$66'xF[1P"#K +!8V!%zǨuRH\(j!tܹvh\(*5u7_Ya 3|a .ij@>A-˓ylVbkbt7$DSX+֛L[Ԝאo~7Y1|H|-zEZ`.RɾK`b 7Rx֟.]$B׀>݊j^kع Mt!gl$nRc>"zO +i&.i%RyyU#]NX!Nmu?.>fxL 4#n5ILVCq^5Z..h'RcE0Bji(O1cX&W/VI~A"]J(IA =ԱOYI%,#~!|?*TB} R'Ͷ|Z \ߦ7k,R-Z4鐭 ̼PžeA4G_~0sR!>ܹ^]5׽M5!o Q`YbA%s4sr +SCJD!u=(Z D}Յ^9Ζ=_Oˆ,ZJ*E90<z>Uz_VEr_uؿE bEc~.OTX>k$X^;fmzb3 |c piH\?@zFJptmZ5/͸0K ԐG.vq q_ kǔ~{4)BE~T-Ȗ&~\fzzf1;є18q%|U]bā3u pkV:Az[$F N)l`N ;ZSي dj2,@]cb}Šmxom6jaŠ]Ą/M ؄cMS^Y)zo\9piƺG!F. /9ig8P}pFD\ikrFT&*]1_EMtLn!"]y, |(5n\=)Y9 w ݞi9}=B$9#.b؇he9׎FI yZ|2&ȾMJ`Q=תy п$`1BS>!ǵȑ Qvέ9GvȐ~8K.jW.7`{r~٤#]!$ +A8ھh.zp@bIYjoyh(w +RX!b}n{nw7Yd*$ {A.N%\tJ 7דs5D 7\XJjN~)9:ĿȂ~ lq?BHaS6ο*Q`cjG +4,40Ͱ'y鎯fĸ^TA: RztvJDlݥۀ}xa]M~ڢ4Lt(ŝؿ0sٺ0CRx^e7ЮZlF7Gf ECcHB.On+3ق|m5K'bWY2ϐI0$iJ:ALHWp֓x]mәF`.Q8p|Gc cjRp `NdlF] 坹zn`72 cVF>O͒RT2ͮp%baDnQ>(͇!+y v|zA zάJd)cV=v*(YNsR-d%~;qH:H95٪@lP1! xStiuvڛb_"gH ,1o.8Z +1ec 9 WlnArfUgrrHS7RHhc+ +J|;^d `L٬5$-"< _~y]Z4a!IbG9?ig(ʼ5)YVH rG@/h3r*1rtýޓ ڬ(p7-uЗSt,#_Bt +x}.լ/Qɘ.iSP]Bx5T<@xB@N^;eEa1I \susdWI(/sѮQG$FRIoΨ9s-û㨆Vk?V` l.3 p $mz;ڄcyVwQCPFۥ;c_`=5qM$:‡ w o&Y ڳwrc%:霦v%u3aLƥ#"BwG0'&4ow|eY" a} +KlrW+τ4iU _4 M|> endobj 3236 0 obj <> endobj 3237 0 obj <> endobj 3238 0 obj <> endobj 3239 0 obj <> endobj 3228 0 obj <>stream +HWn:}WwRAϠŖMm)^~6ŋL'v4E}]koW0ZJ !hQvW?C{W?t%TXXbɩ!^(U?vW*]U n-Wo>m+T Ɖ:-U~8aF;1ׄrrˡVi \Ͽ>,_2 +&/0>ނĔ`"7xAN̽kgD9hyȽ]HC [( +68TL{6ւLljPylCIFCkr7ؚDxɂPokCsƙR>1U;qjۖj}&83C%vٷ).ʇrizzW׬8;~KMTپT)i2;9zu9\e A$٫rdy; D4*`Ð͙Y!]l!E>HU-Xci%Dfj"4+2 "RB9Teb|bLI 1wE)#MTo2|Z=V/C ?dNJ+㛺 .Ta=Ʃ7ʆ'ʦhF䑃}U%d + 9izsD!>kא kFWáKqDBkekdvU>bY xU}$V+Xf1ؚta 3ac5kXnPǑ KhRcjDt?c0ݼq +jrjr|}1zyŁ , *n'.F5˜?3 +K{(lSo+r ]}b~-A)oUk5` [_z 36.jEL9_WiQ_C +"J5ʏY*VZ=-3(V5վH\qhnmp6*sA,{.CQS>Y@VM` vU8JwSex)3 N[ذLXP79w|_ g]RytqWba(SXvz;tp7<3}wwo3[>u5Q;4)⸓6PE,woODeņ0;,n8)g b.aNB.i~r 'MqWu#x4vqW# yTfwb)o-q&` +S,+LMglqM-cS; @\{]b|ہu +zD0I5ֱA$]N  Cϵ ΋3h8v:Nͅ/NM%ቋ9+v?ܤҰ'Wn3 @UC `?>?hI}7TT1 ;v+`}f/׿(8pm8\_fRifM9 NouCTnZؚС?-pea?XxO}+N u:|!k3ck}q3Ц: ,+< +:Clx}8^8~0^VGk_(Ǿ=~}ȊDBO> }Q 5.%Ί^2|@];@Eic+>T 5n0>6o |][a6e]8nkk7%Mi²hn}Y¬2+ٮ2^ dH"U. RPcw@BV'}▁fp{*0'4u;L~t"*WVX[ k +CAC0\`ZsvK+f ۶:5Zm#Jxl +8H.O$)~+- $dzL9䦱]-43i +MM畊2 + C=V֧ ~RRLU]~AcD+~./X9hrGAq(ʙ,G3tYݮ_7Džk +b?m̌*fjx v<^tCe:+ BuNc"< ̓'MXw2!w)f4=@ Çz;/-ITw^Ek;+ HD<\Т`" ݺ 1Q0yЖ N ,\N%pq _A6%sٸJʷk+aBçu:eDŽ1yiVi(Le iQArp.gץcTx_myEΨqh 3RǬ@qJuuv!p$0_Csđn\M/)A?2 @LV0yl78N9P?^A5΁Ћ$O>stream +0 D@&r DWMӬ ~FM I iM&`h~bj![UqϒF )QWs|{~Q;iiffO gTM3Bfqst3>^;O};x\`` [9Y aϺfYjIf[=؀^I1?%G< ZU`ռj4r!.z[,2M[V=zga>6q(a87(JӆABc482N!]f^wkB:+H["%4\ʃ>0M{]4$,d,NDBcħ ?}O % P#$@JX/[Ey5ѳcBgY>{ɢsϧNX{7W$?45:灋!S,e5Պѡl W-9c2tYX5<#8k[ڄkFvn|˧//lԐv߹5 +U㞲t/8)?'(lѠ%(g]"rA{5q"3hl6@zވ?]Ѧ!y\J^9ɯ;ޝS!EȦ9G k \zmØ$!tP>_aԇ:tBL7Q2Xa%f ]!Da \ *zAQr4ĭKJJ] +j=*ܪ|]@zkdpX-:ܵ-`ѩ9~A砟\[oWU 1%FGP_lg}Mb=pDHҲ/=Eovh2abvʯYqu֨qhS:=Zjuw"!'q8 >rsɥ560Sidɢ2YI‚$VC]wp^{w |ǷdGSِZdU}1TX-ؿ#/wZHڍl`o"RT>v6>*o/j,J \U0ch5cj +0tcZ( Bu#qϕo}.bLejhr0F?o_֧5؇bx ?.J]MZ>dލ' @<3uA\ +#Ӎ!-i꼽^ &h;^L;{w=`,~*f.="H9Wm4}W Mk$~LCP4cY֜ƣu>@d`#zߡ `ٶ0tIamL4 +uZ%z~.<[lzB*ve,MɟV-˴3E ܻ¦rU ›P?ШQV6v?v†*tfzRi!NR>K88Z̰-OrQ"Y퟾JKH6PvpD-"4͍svh^w!"Â~ђ ô`ήTg.DcbT6[w睩`@? t/Ёjd\ s"0d +9ejb;*5G+atspnh}U6w=#H*Vg+/S񖯠'mЕ4(ǾN|f)+ϱciEʍ{mj! ~(!bIB$_^6>}~!A};9Cwm-^B8$BYnԒyuVd4E!yd`K.n(71rID0`1LdOuL0nr>N;vwG]Fq6l*/UG vfxN"&o˷mdɳ +W.AH 50G<$e`]F@w.:TLym(TR[ϵiWfI5{Pd\H7]7:Gbi3kr˓8W#7$n\Ul2HCsWU,}lsɀ|i +idC2Yw,K0dy(r@tTAEDyQLk)DPC:7& ?\PJ +_wr]]pZG2b|N}UH3@'{?0<Ke, x ])|67 Y]}n3[qz:mS+e]SV{JOP"xae 9hugaS6x`VZuz';*ƕ +݋X[ ~KS=/'Kz052>8R 4 IA8.縬 j; 4n&͢ǥ~z c!.kVVxN̩.b:E?'=\KHGT@JbhƷD4M.0`5v5 A4 ۋw(Ȧ'kZN#,q]by J8bm g:@@j;}s KWoN|bM*{+H+C(7(N9 +\$ȼc\B[29kbcs7F\#C 7,1=3!QOe +c.&{O<޾KчPbPTXD) wufܼozgȱQlL>-!۾!T% -(:eݰWر~idW }QҔ-RL,-(f$=_,-*m#LF_.C[+[0ќԑ3Gs_? Yo2 h!iE;bdH-쥧IdXD_gx;k +I?E?q+ %0-D)[ P@sG_+xuRMRw[*lZW*xpF(];jR`r,eWnCɰw B +S1xi["1 +\e-@<9Oҿ׼}!/Wޔp̧m~,WۃRpv%KXB`b[[}2DqԉGEvr#N?zfZ``h xZȪҵxG+:oE'9Dal#A`!׿/Ҕc9KiLZ+{Qwjrj&O,x@lG! '{YBmlO Ⱥ+ĎvĂ!ʗU#[ 4V6!S~Uh+ Rw^FJevcY x6=Ҟad&>(~w.Tݮpu@xTbR39bd DomvejLyU;TK^J)n"I#Pk6ԹE.h_3i)H=a֊<2|݀2b[_Y3"zP7 1B +j?Yn'O+ϕ$^e@Hg[@Re yElspfJa7XG2Grb >γq.c +t"c6}|`>yUM[ɳL.z"Qd_-7m!xwɕ#Ջ@0C8m2DHvP#5atl0i<Y[5Nzb4VCC(XdB`N/]xQL@idT9ud,F>Our4NьQHf8soB'Lpikoa S":c=a3( +xG)<aK}"؏ x@M@N8b:>zEn>+ұ!壧aZXN6 F}F4DzP*c;~TnӶw-s'6ģ9j +C`47IIK ?|Qrꓕh5`NJ= Q|PfX/Z^cl~-*DyDCF_.\ hHҡ1Ց)J-tl +j`Nt@o2\@71yyl`&Q ,m3CpSѵ1Hȟ"+)00AEᭆ0!>X7ZчlC. =2MɗUE3`u3fE!hlőohe? i HM[UK_q?7Lmkp,&o>m iQ=$k +bA#poy{#ݨ.2=׬e8pwŲ(Goq.G1Sk:v?7oIa0R@yz R[ n`޷ ul|5q@%c`l^k4j~,br3#u:jJg*l#x cyMőh`4#KSMkMXL_BKmNet-wF+38l{\x]}w"eZ jP]{E @?9!u¡1GcΗeE5 JK?UXo+k!HfDٿ>-#k+_VlA#75B„{ʁ@𲔚i3NW=&&bPbr GYZJeU.fGtf񀂋D&) +4B%! (Еhd;ִ⨧W /q5%̺ Xs$XUUX)~2bRl30>i] ҿid#ã +; >Fb=0Z$._|}t(屡!.+#~͙Pw)%"_쮥lZ%dd $r +Jd(=65hFיqƠ&;͟36e9ݘSK;'ӞNi#AvU)Ry Vk+̧n_t+XB@懮2Ldͪbn:J]M_b tQnr 6΁=\g}#_ENXTѠKx4:͎AP%tZ d?#Aa=byóud,+gG=d_x3}lOPnws +1|M;wAܳـv@A~*/RM}.HsoCEQ]]DJ,Rͫ& _zڙ*ȝvre2Գt|M. Z0f%OZ[^Mm{8qJ|ox +@U5X}p>#\aiZ5>4uq&8K?f ӱZ2eHCZ*ޡhN_ +LqDTc3~Jtw,36SP1K@uܐC5bT7"Xs_4Ca~|cZ}LPwZ,:YA*e=)'QR.YL>y?Gg86BjV}X +Cz py!OX81{iX:#RBqSBqlk<NI Yhp y:1T54[urc,'_+:|(gZ0]rEߑ=qRewbCUw/2WVMvL%_p;4,Hm AN=8 hz}Aħb]nмC53Cҭ_z.J6ܯ@)tLE0b&AO D@AmLD`X{SQpq*Lx|I)OwBrAΝ,oسС Uroahqt~5=*֖a&_ԡE6'¬D?p)UQ&+eP;@GD+ ) +`P/VuEl/!k4,=2ՅޭQS9 Mlnj93xGNmD=׮N +5yVgr^2S = R Fnؒ.S8jKևRR \YP~t]'!z܈e:93u0Ǟ$j/4wNB~9aг[/G/QJl Z6 +mWV{2".tZ.+6`+(8mpQXBC2$#:5Nil@~`¹VKMGm^PO CyA*Vz;+ 6dAryܚYpFUT}?&Շd@Ia1M] +5cgLu`XsLl*l&LrDniPF#ܔ%'#:fC`3b9&RmkFkCHBԨ6{tP[:O#:z6xxR#2>hgH# 2,Q2Fl~Grq־wkk8/oޘ4Kt *a[  +re;lAQը~s[h=|&O<e]|u< + *{&=σͿ.0h;;$}jUPٱMB^V.I#9ːhXoS0{MʦPK6b6NO'A~nb*nj"q׮ŨO0v2v9lF4^<^nPu6e5ì*?EYDZU3 2 fUO P ^z?h*w*d +V񖯷4G 8wPC|F"-<OM +n q][p]{ZpCpkrPɖҀ4c[LA7A*l9ih@O5kkO,In` rclICʖG1u4Gh`VPt|ʺQpd`pb(/-H.pzZV'H"ljHօ.S8R~~yRT6v|uls]Jh*9N*EgQd}fx] 2>9ea>&=SD'sЊԄ w68$䞧(vM|78L {9x9|dc)(rT̀rm@Lv};tb^3/ުFv1a:ν-kzQup^2/2xdk[X*Au#&S!otº饻f7d4\Q6J#} 1[Ã\z8"rje5Mp䁉Thz"MjY¸"^m;B8cض߯=/!4%Qq)ʕ1ս|5HxoG%W!HLCˣt QjKJqIϒXG! =uGxp=GOE Uq-M5Ėk +ÿ̫5cޔFK4T/&S 1,]U81uT.{Ƭ9,uQYz$xVV>4L,9;?9uJ٧I{:oz6f>|(? $=zPna8C٥\~6^ w-قGgVdKf#{#=@bɹ*=2w}ḽ*E`cmj2ZYOESx+O؜3nQ+y6`8}rm*fTHt:3PB$zӨo0]y CElBQ ,JT_y?C5H+LlԄW&0PW^1-COגp O10! /q[eͽp%X6}A#qHnγSFԦ[Gnv＀2]p Ueg3TׇS?VTyeb +u;~9U]@>\C+jSvsHl"a">_mg ImpwfkZХ*uOgud nZX %Q-GM\] ԖfLA`gcG"0u1Y"\n)@ +!BǗ=yCt 4=@ؙlg[E׾A +Tgt]6PqA;{!ܔ:I' جqRTûq/jbf}0Ai6)2wYw/?t7)Ua]ڽ~" *G7bgS䆇hWP/k+D}L)ZIf44 [% -:h2݃=]!J`TXso&ofAER;ͣe#@#GKCjPD*- yLU\L{QjaTpJPd4 xV D@Lx8Re.sA$wA^|2,`kQ %LptL}j=o,ReLM<ōHyKVK9Jm`J'B S?^Hj܊lX^g^ػ|R L =)Xoe]TBM2sd;d9Fa +Ep|?ܘ~MWZ6Գ@`u+4=!ȀB~!w&svlfQ, +yaLK!r؏{/atK~a/|ۑ;k6v +ʫ%w+ڪ"H//u.oYd8Jq7_ʞK=8¯fbڬG\C] +6IxT#ܛBdb(6L&'蓚:rs9[?Dn>(f [(4j-Ŀ-lPs ]Y.0h<ښ&I*RPBx*AˈGj5d< b d80Nu֨ULT|"e*%Dkz06^.]F4T7Fr횪\ Ӊ/LªԲ3L }[C9p1`FpR=,/:8?¼h|DӘLt.OV";>;hC^yJ0l蘇U*gl:<'YO u$xzQԵA~.aYRHZ#|zaO-<2S'(T;崫x鷺hAڍ|aH#'j`? x>0?kCUQzeWIu0/1I^~ɅWQYw-U"TfDؼ*Rj,~fR=Mgnr6J>e3L2P"*ÄVO2VPUMC劦!ۈKQ"q.vaTADu漉>:dLy"ef  +i9_.K}xÑ"f_.Y{` +)qik̡xDg&OЀqi3cJsW DDdU_'G<6ag{&4휭KȔQSyՔ;|,O vζ8U<0.%wy& )eO#ɰ.Kn:f)afrpH%$*lhw:]\P5в/v.4}^M;kY㳋\ .71&hdwVD*ʳ*l 2gA,+_Sf7PmVUOCD** v6Et7\TP.a)R2ZV,ͺX%PmS)zH8~Y+׭\8f7!xRcgİq <)͗^E[^:iG%'imooj_h_F\ >mh&yb~3Ioç=،DU DљizV"7ķ1:H}nR`R׭MƏh+@DfWe$N G8ժ*u17'5C-s +;1&D;+2))OVYe-z3D+@}!C2j)A6gDs,۩5KpHs6c&藋xn\]TYU-htFM=nҞ`v}ʨ"]1^v:/32DbljZuZ,3K<h#)8OB,zrCװ! |IGf殡XnMr|+[,}l@H]X]:J:;t7)ҵaR2s. VXr/aɶ] q6~^:a ͪ ϴ6(upC'g2ۜ.(5 PK-zƲ)oyA/ais/ǤH˒߸k87JWj`r2 D,Z!%7j^sg3Mݽû=Ngg922 D(~`X?g©fXTnY+FʠMa ;m2)p!:SiF}㛋Tvs`.;!6%Q +qAķDv1{o|QS*]uZgf~ɶ4!~jK2*NFkzfM{#& (3 OaHEX p]fʤ?;gLZJx*iSH׻Ȅ+mnh?ϛ~G+>~ лE4Dayrϋk5^Up@;-?MS>Y\_p ++&ʮ,h$ng;0\! +HBq&: +|j!q(@ +6iF/ ~i- XZ骚>ap_fO2\]>G-hu{4#_l(~ʙ<&nãɻO#1%oߪ/Rⱁ#۫[={.v%4ڃ.7F(8fC*oKGv)(q3ƃPziX0,D.= 5^r%IcJ |ܓyoP'IolEXwϷWX}MPQU|{=BXxViz׽2GjQԲOUDZL-Zaϫy6bÞSw/i u+y#`4WeBD-p.l|i'4MdE88=ig5Ewrh\t9 +g5ɗ!soӁ-ɑw>'7tW!+W,XT<Ƥ? .Ye vR;嗶y/G؝\n^d/s+cf2 AMdp[ T|6l֯=qJ6'&E}nnQ L `34(?y=C60wF)h3t*z˕jRt:)Mcp"NY}w}r)nz3[-JQ-L!Z d24mhEQ5S'z0zRϖˀ2Ԯg1U<›X:{ReXF"P]Kd<Uԡ6&Mr\4iri@T̬&K;1"\h&^TϿbΓň6ʉV}wX8.ez;ʭm&D5]Q*^-'܅]~$60ߡK?\X.8 y<*Gޠ@Q"C'빦s;HP%x+/q!~v1ifn3h]8fB=ؙr8%و^qkkmY?, osMrMwUN 4O1/RytZK;I-aMt!Ѕ(+XwtߐV Vقl\(mAP&ll ċ~s5 W)]tJu_Hgʃ!e irBYIp Ir0@ܶ|^Ӵf8l/ @[2Tdb;:=(y=}6YbB . + +T̻FTsDcZ/gĐ{H?Dq#;?xݼ [{7SZvP;@W!0?TճI a= d9m ~r*(8&|*+vx`yiǕ34K%VսjdȠQ*) 4kt,̝Y g66nʫжӞk}#si &8ƷlPEVS4$Dd7I! 6VJ _5@aV{Sު> e5a7s9]QO(ZŸNဇM3!ex^@K̴Zr.AHYr'J2H ,w>CGb a էXIhKQB Pī40 + +hKeuNgLҁa#ݥұ,nC,c}1e1<3ۓic24j!lK Nc ޗ ?1 +1i v?<!ᇊ/b$!q=/BH0~rUt{ [`qE΋ ySTNǩ$HJY*ƗRWY1YG!*A( 3)umVu7D\U~ʡT|psH]wx1FM=+l6RqYwH_d5qPQ7;3 o`YsP%c*d–A:%ݐQv>@0$^)kCzڹ[nlujKgrT-'C$.@(R!xSDwUKX=e*(/C:!zGz<1] 8V]龽} G:I{WQcåO8BkW +&lT5^,_V-V|7܉*w4;U&?2" .~Xg{lFBj3u>'+׉e'=Ym}v#GͶ}-ng`N!^)Xa +yvG#C_t4- g#wjkQ=R㆛Y@ <Kv\c6|<)l +IQj6 e;٩GĂBBVDh?vDVobEg# =1eP*@7cwtѰw&$<]bWL|uTi>$F:B<YRU"<͖CRwzKOn4"'7/>ܡ C I8,9}B /?&nG#4BӅ=DH%)p=xY{܉Bv?J]C#%Aف;&Ċ{:_ lSz~w#DXQ*$UieofE9rU.jm")jO KWmN{y? o;7zg2FͼaQ9(:茱6C$#_!Kz#c]w^ +^Uwb"(6mnƦVlm 07Yzx#8Oè64BX8sajG+&wn? +2ZfZ~,x7N)9N +P-XJ;g.}+t"k[y|ߜvu]ll"Ng->Tgߠ[+a1n#|>|ՈCozCr(hǀnA'n>4-+jt[SƷT%7Kmc/&@ݯEG )콵kPZ8g!*jpr ?&9{Q9oq uy}PGwtna#~bơfS߽-C;*(d kwDzY!`T"$^*B2Y3nәpI0]EH6F 15۷q֚%\ҏi}'4t9[>kVά[V 6jG(-'~LH= i-W`0.jQ">ŭ$)%K4=:G;Œz$Q  +khDnBOɟ԰qDţJs.4ǹ^b;ENq]¥E6mgXI2C|SeڎW'_?Ld͖ڭU~U쉡 +]OA0ƺxVK!'JK77^/Vo>#il4?LeI"}I:B|P,([%@i,6"z/W¹\ &If\Ⱥa_b ͟|~+Q·VcI߅\ya-6bTT2 ߁LH5J!ַB2Z!XaH]X:ᅥ8Y9$,֔s0H*0e;egh +L@ѿL-ɉRߜp|i`9vCbz6}wOk%Z^G8Dw7%CEd+>k@/8;X+[@u@Z7[0%J-J]j +NT*YIIh3tXl;zl}xKT F ~ +}?BsN?6-AwS#%`n$( PH:J +0s8ue:lo(S;zE 녈6q2C_|Χ`w:RJJD܂xCOC|=-sHy\UY vƸnB:Ix. bGE]{Ӕ7.x5FӗGs`QY0Xd=)=uR$NW# 0]㏪mRlA54[țr ԁ,n?@v~+:j}AZǃK*$hŃ{8|Qtt8AdzX9Ej(-Ҡߋ̃ڊzJYnjk[J 817!_Da nDɯ#4m~Hw&Ԣs} ЕK5 E 0x?\7x6/6,L~cYkKW ne6q)]$a| 05 ۿ|Sy>ő,YWF~iiTL㥸U|MYdzc#kdq0귎+ eX@ַaS&Ӎ)訦ۉjhk#a ۺ2V1DͺZ%SQ' }m!:T?S= sDڈDt.Q24z>'=\B{``t bA$!KQ5ת]Ǜyƭj }tF<\}s' N@R>kxAAVQ^J0jr+a0j/G0>'jz3 |wz&HSig,ҭ1i:H Qc4*wL͋e2% 7 H_L>s愎åYE ~[gGd #*R[p TvC2q3C1yom(c1X7u/ Wz$M]ooDbTH8F$ ħHPAnu<v6t, *> X1 Ľr#q8)f=C~f 2 jAҶ͆fO~:shx.#lpypUsў~Nd?˦8Ïx0x}?)$ K̈2_$Lˑ U\/+?&o#U Jy(nև uDC,TW5Y?S >8UQӆR| 9ѡ+;Ϗ|KpέW JH[#\s1-kjMTg~NpZ$LK ]Izl+4q>gcWbylOPQ1V~Xo\ћɜo⋼N=~*۰#-:Y\+Xcփ%5qX҈|-ءՍJECTI5LDČ:6-\ yw2LUO%YWzv [Vh荃00xBn1UMZoPWf(vF)[>>_+D~m&8)t_eXJ %RO*w>5ytO$dhzk c[?۪8bH`ca/F1x/ %}afrEZ!nX|Va!2QdcYe|sx Сʹ_|t@ +v;V|rO (iΜpQB6MBށ#y5\9_0u΅"jlG J6OiLri 2ͼQ0yWP*:zzt&9"[;^U"n+,ktBBۏG$wMxkI:]҂fIE[\-?ന+%?dpo6c[H +2pJ}p $DM$@-&?Eui=(دv[@}w1^uڣ i#-ct=\.+| +s՛7U3Th)}dIKPuIBr}dC8uz`\&T1AKAt(mi3qH7yrՋ ԗ>6L/#:hqBZ=}VU$Z Ix䢙xyk-ՒݍaR!a q(#N!f$sCF61uoHxAt@}|Sӯ&;8 ?DVz}nG"K`(v޷nJ6./4~MLJ$w@P>)cLÖi+[ģhT|۴/.i~];E]qqQ>ã>o5 _F3r+Yuu <A*t^zxeyHjWY]Ž9# _!}m"'  +>Ywbrk 3z$u`|$kK*G`nô[$VԎ}r%u_%T2Ǒ+;R7?Yr(J"l}}^vZBIw{ԤrAc&$X݅.0v+CEYQ-@J1Ʊ1ɦ+VCVe/,5\+pSc+=١jj9Wb\0w?5ԪFfT@3?FBñ]%֟Ŷ`Fv'50@ QD*䝫otO5+A- ',zXH@֭0D>/b,y˯YVM=Y(.2-;V}9 IjF0Gҧˆ JX%RcwQ"X\NE46UR FKF _ qLbIkvTpeهPs**?y7GDʺ[Dq3E#jFիE|Ef7 V60+u/aɎ,k31Ru nۚ^kCBT|UWx?RD:,0'D~,ے܂g֊GgO'iԏ/l:Le+ WDjGx?D\g  _ο YBB1 ]㇓[G27'kCiVţCB8Gհn ;4{ 9fQ˜ʆ|i!fuG`fdC ~@uNn(6h:V_rohL֠̕ڨTY\.%_.zrc*7— ;U& I^g +9EPtaY*W?8-068k]D*+\yb#N R\)w?[ch{u.5k3!s9wYߴgﺢ;7rƯ{tZ"C: am6L=0Y>ė :pi*0=OTZf3T;_~RFV34DwE+S%e8'v簛3D_`Hw$o +|3/aЩ1Q bģfߨ` endstream endobj 3229 0 obj <> endobj 3230 0 obj <> endobj 3231 0 obj <> endobj 3232 0 obj <> endobj 3222 0 obj <>stream +HWIs[GWc2e^TeT.R'KSiSr-⢲}D_cLJ 2Qv߃W`oo߫˟tfuyu*dmwǿc@F&i1"w{) ! )ht" :42~jDT7ࢲE!i,/ߜno/"5I_ơfg/]fKr]=44 FZ(g,· h"U︎@fif8Ei~K .`$??m7wEbO] SS m6Yb㝭QeX v$*xrL0 =Ը#Y`}p>SpPe +.ijj]ݚܨP¬6뇋@P(x)L>7yӠf ot:~XNO Ո@u(*\ΥP׋c]<,>3w'u D\6wn%:N.}ɾIV <`MDg`f~Ūi)9e)^ +SM{.kJHN3dwa&[Vm{t̋6`I>pny-lѼٻMo ArȨ]'ڮ/P`AJFHuױ$b*E|'\ULH#dw*Ezj|0D)޶Iz +AI"Jl QW}IJRE̛jhh`OSyUL ݆i}`A5G p}s,f|M'ݼzh+XpWZ>XЇHGSQMnn۲MM 1a;<ޖvRu)dGl7,m{A+VDt濻e?'7`;:@D VPz>!KwHXԇL`-U"Ghn:1Iq~Z4v}Hk hQU8? aA =rX3XCỤ%B˜^"'D>xRZ 93 M|jP&H̖w yC.ϑx}?BfAݬ.nG*8Ϣu_'ggv$et<d*ȉ4 5>jĦ>zٵItQ8UyNBmzGr*_yD!noY70N0%UT3^ ۭȷ[(˜ҧ/UKS<]:EWT`3*&+-NJӜ<:- +7:&Nl,4FkrjY?BBHh24bZARGr`7G.N:?|wCȻ#B;@=DL%8-@@UuYt3rCRP S]"Fog8fba6mrOFy/ĩG 9&OvT uRwr6|y!wWNRLdխ~q2 ;2(ϙ]ۏ,<3hKV}wQ~njnJNKhC>stream +0 _@&D _zV+_%Pi(ߞ(T@fGʌoƈtP]y%9֧jcE`}keLO'߄~XÖ S3v=Ii~4 3fIsBĚj)?:.[PW,myG|C dGSֆz rTR+)hj!W-o&;Vn_V"dh VSئsyC_^m[,/W߽ev-9^V,|aܟB+{]6́\9^D~[ +\ + U f]?Th7WyKk|`m}ty%F c +GD]]Hn~̶-\'<6))lcR$ސ 8KT6 py$Rߴfdg;l_h|(g\ +8(/'R9U6qzz-{9b}`}|ڌYv$?+pǻkԨmyeo%0 Yc֥E<nyfޠ RsvYٜBE0ۿљoxc n:um8[@3DiE$ְ8Ƃw $ȴxz n$}ӤԫQϦ@uShjPKr& )| ̒lD<`I-߲B5؞RY + f ߳+|U\y Q¢g>\ ªHwolOcz4[*1nDRđJ߻vב:_5S;xn)do v;%Hq o\Q¤!'F*9vѝ%oK9L4&~MSnq]<ʎxnCΟ9O"#):SK#C&7,Ϟz_} KtC4&͕麄BK1:q{n1 @[~!= #(9$Հ"Qή/]U,8vK:AcJÈR鏽3{ +IPVQj(5f."/Y C >HDÑʡp/7V#eF(B ņ9.2|2|dy=z~r^7כv as$ ex #@hBhbSFI(I׽P8Bl'V%aۃ{Vwۆ蚂"ɬi';6;Lvp!gvrCnUmaڮ;& +)=6JAbQH8Ri޿C{e9ˮf,Bpy^^]{^"CcՁGF-ycΪBa٣>kAf5nޯ 7 A1mvnaX rش;XCqF@yKiÐ;)ҚFS.hw_kv"^I\!Qry&(q 7'܇$YSs)=;m+G##BDHJ _]xچ2,6"j[[A[c),-:ONDUD$ ͼڝBItL3%8[d%lGA?Ɩl7ڸMe75dWQ!LR`}*S j'Ҿ1KE(\[J_[KK?eu\8YΊASȼuid+޿ w8>z :e3oƉv['>ixȔ _Bci6Lmc>3Y(+,ᝁ}i`>oQn@uX i4h4pS) +kA*xQ7D/#e1@i`Ѕ#(GܷYT%v{x(r]>B)E!VXZB?@KCH_$TWebTR׫EjtD{ ?nqu&ERTrv1+Hڡ 1RikeC Տ!E@Yi9:MDcXU'[ +l'9Vcỵ9 +ZLa>' ]O w|Ҭ!>,A>l| p0 ÜnfmӉ&NU]PSxM10p,‹TBFm]v5u +T;yFl\vxڝ}Y7 ͍N婱Q"7>Rx-~C!Au1_ʝEh`03H8|m-t1!(PmjG$JɣJd!,ugOE5I-`H9UP0X`÷c Խgq-ބf",1KJ632ֻlKF c&@Ԕ ۇpJںT>[՗U&liZ)Hh:}L*c- x}(IW/DR +{2,QLǴcJKP,LVg! +:)+vƯ lV,ۑYF%/B_L\LkZJH]pD~XK+cu Y\zNp`g,9ϝQ`ڞ4 ~d +k{%)*$W;FTcՐf?jQ +*BEgLHPڮ}ʇKQbe,b }B3-b%CHB-[*I +y2IrITkR] ŹKeS] ^vOV%uWm 0}jj8Oٮ?sF2z'j0Q)n +z([OnicSxW.ь/ )r~F6n_(;[o@diYaU1Kޗh[Z`ld@;fDu9L2+R-' +GEz+eJJԵᙸU8;+ +Xls3tKR=yhFVd:n PNϡG2RI4Z}=op9Ιr%!˻#wglOuҝ;bLA-._4W,Kx^~XxT9D x[QIGr- 8܂D:T*{#Xq #ID9;wkjxCgj؃\=& 5+v=H7Tۯu` +}WK]E-LD7l?BZ='}>@ nA}cbPkXzvH͋&Kfnĝ@W?dF@+~Lc/&t5sWN3{ J^vWA{}GS'^ߎ޵Zl0p_Wtx|QF:y\I]$U +ܦ=:4hY;Tj: 0 w*ߐA1c%KM1vIjN/4wE`,b[v c JM .Oj1)7e >ʭQmS^%&i^]Qy97 Gx$ L؝Fٽ]b +NLdZO8lZmi*.5=d앗~2A^2 ;4Z1':(>Tw+OcYUXE"Y՘$-s +5QWe<i~<i)N*}|F}qVl?W?(Ed ;ws *+L8$ G)BR7Ɋlv>Y rl[<}%*;6%mnIkKb7WEU~?c )X=GcVwŏҎ@*Mz7\#8$Tw5:F!. WMD6Q~_cHU}10WT|ܓ>?g8q]1L`BD6s.?W#,$/*pyjH!j%2o3pUGuK7rL3Pk&z x^5}ޡQ39bUVmc`rhs'ELf|rMƏj_xhVX?Q7ߌ Ni n%_x\ㄳÔ E:/_g8ۼAF[AR>LR_;NG\,QUB\6t< !sIB .RKn]u0 qDoLYHɎ{6팑 jJ穷XYoH&G7N0 NCXӭcXȶ%V&QB+  + +0Y9'JT%qjfozY,7xʻ _ńy f1l(&{0do9M.!byYR6"tB3-:Yh)GBG.9s'P+>hExy>X-R/l'sD䵔3ׁ_cJ1`/ֿ%=ᠻ}B*6^QqI +ve=a51|R{i`QsJ-@f(9AuIO/MMb5arX9Q|. -3/V0veI<"ѶMH c#~sWR!&hv A$h(4SG*hg' ͱ7n0]Ϧ< Uuk8M]/qIU?!C֭ nK̦c c +Flo%D-JHꝵ}:{;Cd?ଆ< ? +teBR,ڽi.MOؕBLקH~v Dܜ`sӖe,?}DW/%ݠq]4<,#Dd3v}f '-W&ˉo ]"դzf27@| "{kcҔmPIm/wr R=mZCe #!o(ӺRAWJ:qH#JG>T{3Qޔ5STTMs%T37ʓd ""@Pu 8W~L\;_L@!5YߚDU$M{ @&9F3"t͵m>ܛMއ7Fb!GlW,N=-^h-| [ڣ["I߷@9I :/1 L~i&edQg%t10  ;0f FL\9aH٘UEPI{ . &`NITDzꇤBK6o=V?!c%th^ tFQXbWo; 6L]>LN7' VQ>2v0 9o _gu;)gA/SXP.(K2LW}b|h}GE i}Rr2S'lArڗkC~%!/@MGXʄ ; ML{2NE\hi\}VQ_>c7Dm~H+ཤ>iSdYU+a}e ކ?DO"lN#nSAcYdɴs2PHo,BD1t-9˫HѼra5}$A|chOrAl7,]Q)k&VGd!ؒ*w_ t@ ^x/x 4:J[~6ȇ&ip,N .iH=+d8]SZ1$u|J++C9+= ~IDO9azx +|9ϼ6Do+npL$P;W`RdVLLK;i=J UrdUQu&YB>]%@C;X +Vrt5o YYwplg rMXfT8*mW)_rIG2k2Fk&"Yg]lw=/U*u@j +,|StCXt9 VTjӸD_fS._sTM(uu }]Hk_[X@ 6P+{Tm].X+F.uy o|gn*#v`_7[Q~߸u!$%VH_Uw +GPG_{]&1ESF eqC#tƔ=):&w29wE@Ы=1hc;(B!K,YW +֥%EO_gѐ#[; 31}bnR7_8T@9M#b`KnS-l'$yʑN]_ {oF3iU̷T(uka=RÑ2TpJ` 2OH=Nnck_U]ȷ%]Q($KCph(+^.,PV(qK)zE7p64.4TXkϵwN֋k4r:ޖ1pqq|RCO2y-y2c=Yj=KʚgeN ̦$r%Wc{6̧M;_-sɺ|D)38N%MAue0]\Ϩ$6QY:AfڛR2BW ySAK ^c""8jU@14 -r (sj9F[S8rq rYz^7'oj#aW]I|!0R-Q)JqPqWD܌ZGJZN׃xzЭ-i@a+'m sk&5\ 'H'J7~U@ j2F1MZpwZz#TFgVgJ*@=N̎UZL+/ͣG0nWv]Wmj=4 V=^Q^~bxH tDz<ԺŇua:X?%CghE~FY%->tA7|8'},oEmX&fv]f_qq^K'UFEO iB '=nf=iY/3Se13ҪVt6Vmt伛$B9&q;DdiTI =?_hJ8Ϥ +M~45ŬNdFSiYP.Wշ:`#e}3=ENh~'9ZنOGf'qs*R^lUEwhi~$ +`F4#&g<_9uJVl1t$XE>_.$R5hq,4=j颩pk0j_y+RyEx=Hac^wbdZJ0_>)O{RKϺ=Ta(jSa#Mt܂ƨˍnV٬W01ۅ^3rSg~XGlsʵ+;Ǘ]R&!oY +:7{r N`񽓖n;8\F#iA94IU\d +6 +`P9H88KӕGq)7I0iu8gīaߚpGRsFQ3 G_mM0BM]|F#d 7U|t$)JkC.́I2\]q@P`鋾<>`uh^$L^R7&(QAّ띹p7S#{/D`U@zMrU^[1״(Y+0s fp`XV QaˀwkCғm$5orZu,6gtw-aJBw:K`XnkjaN^v1lVzPi5$^~8;SZE tq4Q +3c0drOh٨k0+v +oɗrb&ț޴*ڭ8^b7Ipwݮթ#$gе~5']a{Ÿ |G( o6[~喢ue% `IVUqj.2ZekEBCyЏR@dl gf|jg&ILM98QjǗY,7Ad<5FWAp`!Ki5|Nj=?}Z.,;vF&tLHMȮR8=ECui^OFXM8̽Rc +c=M, D^+?"_vx(f$XY{ }]?u5IE=>;ѳQ7r󖂒;e5^U;^:5)qΊ77t a .F+\Zo֦#ċ"d(ΈijCc8wevl<ֽ>|đ&+s 6EpPl ;W2y +n? y%˒5Ud<[<5fG z*.:-X/>=YF67iG3f<ܪhYA!aE[|^H׼C&vU:좘]' LYBTY +5gv1y݃+OE&.g +\k̮34ifKEXmFB ;Nnd]MD&Ȧ٪  ''Z_irw#$7cJ}xWEr*CYs%p5V=DY~%vrPn"RƋ H;:z@ +AnfC..bG\df/zpRe%761€A[֥66 Tn0r4y., PߔFо$Roʯ\#@1V@Oi˾X +FE F0ꕳ0nХ 3윢!eo\[ez{-.(H?1l( [b?fvtQnNiE=EN>29͐8+r>Pi%ǓN2]3v)A|rbMXr%aN󓗗K80o)P\40q3ff"$A?Y?] S/k~ѼW{gRE<J>^u+~2b,1pS-\yiTqZZ":עiָ\4r+}[mW2֡~MzL,st20F憰 +?xiA'm.9VPU< ab wTUK>1yL +J@N$ꂆϊ~'#'nȾ*{OI\]_C٦ma8&8{)tLhlutVч0~. +& C<'iO:[b 8KZYFMI(ƈ[2I xWa:Bio)w?$͏}МC vT(i(N +墻g< +&0GzX=X w2A9$7yjdű^֌w))Wb.Eyte1rr| r.p^ ('XCLuװ猤^[PN ic4|aS-DW2儢iH(h׾cBEeZ…veG5w,Q#q/7AP2|GI2,-ZJ?h&JP`s/vߐ)ni`ibJu3TmFQbZ,6+:#9e yL|1o8% M=y>c%avRUtZzwB$?$4n![o7ϵ,'^ + Gfs绔)3\N'M1b5މ@) QC8"kmH"-UI):" Q jfr0EA;M3NbζʦJ  / + ϝ7eZDjMsNаY @͒L׺z6yX*`rc34^)bήV+,.a}PRhRNmT-]8dteIDmzQ4dKTlbS2q ^8{Q yiQr!:F&!vƅʨTz4]U]OݚS !ϒy2O`Ae]+VB>P[+m1B-YySc)>ˍD\KΤQ6g翥 +Ad{r1*&+_h MKɏ2o→{ص9 :(*mKF >8Ǎ do$3 *oqJ8n7 qZ41 Pɖ܂P  Ta'#s, + T$F Yǽp^@A9: n$J%2V}2Vka! }k~&`e<0\'|M®z_Q2&+Ա= T +yp3@S^n +dzp:z &#㱼ବkD̓q@Ja2B=-]ɨ`~eV8ǹExGHRRo$e aHVq@撝sX,Ef)#A[+"/ߋ́n +zNWWM$(4pG3rb1IIM A+T? 5Gi^gc|(sA ޏnU?Ķ% E=8!!lffSײ*2%@m~vفYŨ79hh'8 i0K$4iDDhr\a%27_ף0 S_r)1uݢv _^j/i\[ͫzNJg] هܸ=2b{ŪQZIN-s5BIIj t`bצ&m3޸0t[XCXkLRS@1~[y83zi=]9 "TS90z236 Wj]@4Ĵ S(B7"r~r߄⶞̟ݘGW$s uE(dS$K!^!d@۾ sV'ҐW]^5s= H211oJӞv4 +΅`FG׏,!z/nen0 ?/^}(~{WT41WB& ʎG;֜JӌEW$F33-`~(zJoe{s"a?ӏCh ~%ݟS )p ^&Ξj&R'2?Flٽ5{l5P$M7v +mk:'{eY˜u&7WO m1k(m<ü09ݛ(0WISS$K?CKi仃wTMcKaaקMù;ۭ49Ƃ7U0bF^;jM{ފ/=[ +U<{Na_fLiJSd-΃hte9SOl7?B-JLyp:}h'G'7nuîbm]lol? nE2! +?XD +ZSu:TL'K.)(Y +XAͼkDLO7OڄfQ?}d'FzQG3q{m /G9x+T$jPb;پP.+6 DtC=N>ks^*bW t9ܗtC#Zi~T6,.PN2~e..k +vAKGI| SeU5J0xvM[* f_ҁ_i=c3upBOlgH5ٕV%g5hQ6riF0KZ~$K=S>Vx⬾C,yմiB޹ endstream endobj 3223 0 obj <> endobj 3224 0 obj <> endobj 3225 0 obj <> endobj 3226 0 obj <> endobj 3217 0 obj <>stream +HWmoG_qۊ,; RX*U} 43{w>)&>3췑NH)API@ +wc Y[>OҊUz_Z@(W=To$;P(l*q1gBRJa* q֦+pRDU‡BՓ6ADwRv,HCQȝ0*%0LͨNb +xtƑ]PA BFG7L +&ep^k, RȣfwsۼF͘қ iԆқܹHV84y?ӻի%ʾ~y'6Y>t0A930G⸹ivSsͼ-6Orcː:/~񗲶M*s139e11rWǛZAgqwJ#lv]_M-qny\,lӌ&c0Yu +!ªٶ +wl%ȴHzIO ^ ^hgPSܱ< z=h>֪!|w-1<35A'Lv6 W[_NSfܖzQHES1iQ`&8MpŠ]' :&|^M1Mv'X-\er äK +[x÷}u)(-D]#Y/gC)Mup$NpS۲CV/)ǣijyvVPaOj eOpn_}18`3a &1Xz!'(}^2j.|f_uQIiV7y2^r:m(5oŶЍ)u8d< 12!\ 1rYK]x}S@歳oz68 Wz-MKӂ߱Yyׄd^Ia05z%o'@^լ~Z Χ]Zldmi3-Pj)G$֫g}&ʇd9, +=\8A|j>_=tJr@0ˍxy=on@J5ʂy?iTb:I# +R +dЬgO |JS!rlä6R ^w>:3R* +?rFn櫕v7K$f [@GU=b}iE吷\*D|$^O`"Zv2Et$O 7a HL_s!#5anX\wKfDyL-{gc1澢Vm t5@Mfۇ&Ќ~^.,/CSV>^Sm pbT`Ko:ݧaY!xRx:s`_(aw*cyWi gQ6\A4ppo@A2 y\xp;ot{.$;dZ>@ 1\Fǥ;%er4/"&&Eb7IUs|S:p-y>$ s 0AY endstream endobj 3221 0 obj <>stream +0 @@&4k @Q?v{N4Vb};#Nlٖ݅:4tH$^o/j"'cĄ Xj+K^c՝zǼb>=y2_Cmy7{p9B_{+S ߹>C񥬼aPj{pm%&LYjƠ%8ć5 UQl{N`$eR g9!*.< YAE"7hi/k'&]k`%~TpENA6{D)bdH Ōj&c?sLk`tlhO~CaF>'CuIGMll͘Ḱq[6h;DŽmeҡS7;̰"quk8joRt1 /mƊ,@~iZbԊ27$3t2\ASyX/Y048CdcD[8"_O̡'(2,˵wԟIH4Qbh9~׭(6$AY&S)Ni|&)N)FǬM;{ĪϑR.S3qx97:"L[xsqc/no;-@F x@;Ф{:6DV9&|c(ƩY"!}m7(0g\/ffV$QY3*\h(@Sk6|VKP7l}y8l'WkßC*fN8[ @3fY5Q0_JPpц6dd# i)E_&a#$Jf=P :wOuwߏX u +?m(ta(+x_P:4Bwjض NUx0 :$2.˨.fO=|S5:2"Yc xP1[)'@1yS)Z +ɀQpGG:[CNp)/U/?DЀna֑ WLJk/,jX& P$olu`` nh PGh„:U  c<?y*HGÏџN(y_Ѿp;!3BC;Y=$o^74V<^:ANI92] 0H~Y11t7S=C/,]2og2p˝9n/tfjKl;,cs *3f pޕ=T0 5B +)J}ԏYblEmʰ<_29~ʷ.ԸlWhFl#9Ё~j=lkPZlc0m Y׀!~ozA:l6T$I18թC&fWrz\_Z'𭷄!dEϠϔ]? +?w7(__ZaN|;"obʎqzZFzV\[/]Dy:JuhS871C&d8ݥNƛ \(¨(~g{O];,)IT,jfqnx@~}^bj-oMV0#[j~f9U 5cr +L qsBEB_gM)pssZNԔ͓E89}%_'`g ~`A4}뙀0K>) +cx!Sڒ9ԅVMg^.;àg=•oUԚWu#v١C\s~u;f2Vz'k XD͞$ ۦyf#*4-'j XMs-/ }8p1 ^"U1n)q`\X3ȚX1s'|B^qZjmCw *b3u%/A1 2/E +3^J},+3.ԁq,ߝ¢ɖRAU&Ynju,T:M _+'xu.@d<7YW`\Q A+{m:iyZ/A3P5LT²3FV^׋m]gB_LK/5^D{ b~.al Xqb,`Vˊg@,aWv +g;=ɻJ0fDIvyX'W\ϻ{&%aѰiȘz2k>3V`QUdwi1hr9reKDs\[O a@ AZsb]>d"?qϏro\VrSvLQn _-p*T% xUl/?GhX)ޠ`o@r[y 2*H\4(} E,yam^1m`va~?%yFKp1ƽ쓥QM>D` hP }1cMA[Rv̀[;&qDL6ta0j{w$ַ YHI@Ľ8JMEVK)S%vceg>0Iڴ͒c88k"H-@kp&8yLqlAoyQ7?aiG0FH֑SFkɂ +pDUVL̷mʏZd|(EwW{6s;y> (Ŝ I6^nj/u L +Wv-Mf'hW,9.|A^4ˊU<@za β~Ey^ ѫ҉K ddhf8~PLS2pApU<<\keaF+0J%Bλ Y>hJ΂R TO#Fe+LXMv9HɂoW]B-?p2AN +D l.- + W-P| j <^3zƀ D ox,\꜓5]Ŕ]y'hrQ'*7-Y48dI}/h6LGEY Onrpur͌n ,qRa+\njËѠ"{:[zqtH?mW +-?#(E'0 Gh]a}=x5HP'bdW{.jh.Bd I@^R[&d'91y&aSE +.CKެĶ$ϦJ9ouoQn!@]||'/c< =iS60=X +"F("۽w @7{#Z9l93Cr{-K*(TdCNd|>+l\DXC#m̄꽭 Ho0m$qVB9``55Wn!WΜ +:S|RW_%:ߺ&xڵeeF#/b4p=fPU%{a{<߸|72eQj<~;cR˕XYoWd+$Őų*\ՠ}[}K녰PAH8&d7aq +99G +wARpӘA"06,8$v(wW(:_iɥ繤a-iQV9] ǎ0> L+*!9[u%桑'tP7@cnf؏񏖢]u&+_ߢf-X<{-:'u#t~u {iܓّ~߬bZZN}{򹽻VF FppSc'HrϹkh4=& D51@g:}L"0xAP6RhOgqNA>![-|/І5wϢ%!x!nbj]i^L=ﰥ`̠$V*+6x3ꎨhx[†Jy'f\ +`z܈|KxZN;A/I־j%vz+(qMA_/^eY^Li:w-xt~z+Ux艝-h}IA4H>;ƭ?LcS#K*s:5ĔA12C2PgyOܹ3M<mfQSRڞ%p/xP\&cv2plNp VqMD%vzsňIg3wau +3oRO?RWU -0BM~w:_A|+^gdAɄ%~*iIw=pIf%orP'_f|Fݴ/IhRgc]DM0`vjq/:2K7l4/tb[OC Ç[ݲ{!1gڦ[O$Ϻ'*"T,0}[ #Pki$+MIvֽlݼ"O6ūduF؂O^: kJ +ix%kV@W +aCi[Z>}al"R⪩:9;Z1_/p{:^Es!#aG &[{U:>)#:WtTN].z^dbbO24okո~2صQQ +?GU5-Rv\ŭ``Eft !2WpwF/vD1'A +YlC͙~熭Qv05FnI cX_%kzlǨ$o:@R^4$ )PT,;SuX?mw[v2%g6{ f$rs;_a'#J=$hsrh/jFڝߦo2*қBG vnH (I؋.2/._L 6:TسgޢlD;3$IOݮLf2Yejj%:JT$BMSkz]P^=lJ~ +H k4ON^ׄ }B HL|w`˶[Լ?M1ٵ?$ ,.'@L;8_a A@#O#<$&aAJ{VN0ćYf/~#?sS :`c7Gq8@Ⱦ .]w'"\}?h&Qؕ" +>x:I ffy.uz:s}3{Cj<_<]kYnb7nSoY;[o9B +ܹMm B%PJz}6@$M[O$쾡rdHHfVZq(H]bOP$".>#+;:! gwb dNN\wqw EG73]JP@ޖ!~VAڳ f*\ ^J e$ۣ֚?:Z`@Z3oVU baZx1*= $>OEuHjk a_DxI՟"CGt)w7\<~v1ͯ>^,1I\hwkBM&FPmI tV$ +OE +:FYދNSSVp] 6%ljZv7|WG~s CP4 zvk@ѝ#]F1RJ0lB-ҌU^>ܵlCD;|r}ʼnF9P^JG ߄; 7?!gRjXeeS#vR>Ny m={$ω4>;?ZB,!{P#ߪ!x'cҳWic+w?uJ /`VwډA`y:viqRpܳeMEx%phwj:w +NՒ`M#:w8Wdv˶;0 +<ʣpMoԞ(Y9f'Nxpa&A~ҵqa{ZЋ@f& +PqUd&"|p E:2/og?v.(Aܫ^J[z$rz-qMز*mDplBD[虪o!z AaV{dmSlSG-*.BU,CY*F%\+܂sRӼ@3K ebiNq] APݹDJ\, +q'Q 31 BYvy` z®+`TҾiQ;8ssbsi]F.#GBJx`HzZج ð"r~@A޵VIy %½0:wn8Ue^VJ\u1W7g$\mooxI؉W`^Uz%qmԳuas"hjjhc!Ѐt.#(#PԻG*s׸ +/[Plu_et)=4A@3?[P#^611ȀNn޽9X '2]\,3,61qҞY4D)B9pqjÛŊ0@:CnZ?hCWiMXSJo>c5C'{B44u9GWN8t +tp;]`QaO7έ!ф W ܂k!}$w(]Vͥor)" q!@a`(6nNGy7 dCد# -zEjkpX~ꛪ=5Ⲑ8A$d(43D&'\1B88ByqWit+aJ:oX ++74k agʹ3.3;ߏoĘ7>蹮EbXA.՝5|fW3?͒vs= k-sERW-On1/5$v(6T*>d$XWƈA=ؚ^ï!Ϸ shqHJ<}mYMOż5[!?E7"AA4顺+p)T1kV> FKY#_cgP9C"^8.ի#5 ._QVP*5E@7م^!o|l R}w4mA  ưp9FG1[!0XUj'FT~lxJcpLps9>Tv7: lO$2Vq|/hsX(TN&ϞyW3]P9ppF\ial H, "mExyUfi '*#نPOgZ"F/?<8Z_(uBJp~Mx\dDYL>nL'@n (P?Jet}_hjUG(Mxm9 z\. ?3֞͡4 gX!M0J!)[tMQ:k]FĨZhPߓENw:%rR;)(0 W^vT[Ľ3Jn3ز۬-rwO7c04!<';a{lzVj)x8 .Q:A4oŹtDI:*+:"IGRAFiJ( ' ApƎϧL9h:ǏA44Ys$043M8ٖq f"߆6oE$–;Z;#nenRG-9bNTusAw',8\.8ȯvH-A3"ؚ֍ƴZtrεtzl~P(Dnkloh qg/3'<H'IR[@$` +$`Q<&7|r I r\{ҲSd`S*oTꅿe%`3]DRGH:w 2Í_[G#j.pkH }[U1c{wĢMBK{ד_n2i2??Ǣpuʤ "R@..AP%!̂T akÞԍWFJUg.l=тIy3$GL%1WWJG;TbXDY͐h[BVn!"Nl8zDeF(yߙsv(GYoP߭GWt0Hk6r@ T픹j5u¥+?A73;Z/lR^Ȣ%!" PU)h.E/p4NP0Nj $k\-O/ɹ^*F@.B7?m,Z4e>GI=߭ K:8׋Ek"rj.vVi8fG_/WZ>g\p^@U1̹=dLD'U/00 ^aGǰln)ev2ӼtlB6G +^ svf45]@mE~8VfOܶ^7+>H<~"~JXi"zij'Kx` thz%8ܦoKSAߍCk'_שwPGGS[jM{ 5cT-(ʛ58= Ԛ~hIKR;dozkt5tp jjHK}|icwi#Qc8:>~Ljϰq"Q%[!˄{> eʧK xGO +MgkW}EN39:.m{'X.\ 1İv?#/k+Y~#xhmp"6\EwFjyzt3M׿Y % }k5$9Z` )h_ endstream endobj 3218 0 obj <> endobj 3219 0 obj <> endobj 3220 0 obj <> endobj 3210 0 obj <>stream +HWɎWԩܙA9@  `W[eTZ$ޑ3Ȥj-132/^NRFʊ$T0͇-~rnqfE+V-(LVe%Ů2D +,1pr{maow.J¥;ݫݦy#_; Am%ξoAg{.|z?COo#\w]޻Pu 11=2HQ„7 +l +`CiBGLJ]k!Hw,+ f>yRٮn +sA^6Cb-ux}ƕ?ksLh|wW UؐPY) + b/ATKoСB4zk#XU4;@NߝCօ5.&Rͻ !h>C-1Km;c,"a-]og(Gώ5t% r:f(c J.K>tú٬8%5UɚL4Dtl4u6454WOz+ɟFQr(Xoۏ4/oE|` l8/bP?CTց5/*)K`#>7;ҖfmC'LD|\~ +q/\1mC3}">)iK$a14k{D-x +o`m* La[{:YE-!)&0i{sif:a۬;D:$QZDN +^A2@TґA  + .R9ZP#;9Sq"B6qwLɲ +D0Cm ?_%ل1 Sm\șNb`} a0U8OkԌsâ>,Z9,3v΅ +η̗f3DTmDF9wiMtw! Tm>eػ@EHq=uNI"YJ͡(|<=(^3OKNLu!DC#%Q<tyr紐/(o&;JUm/N4x|w\nZ4A4MfO]^a'QZ"X/0 K][CS^]|FeqvM4fn߸㮿i7qHjl)b0q[;TVVh3SkRb1@vy/4|:UN=64 ϰh`W݀5y/8 d&Jh1H246e{ɳXf2n1bԅqzX9\Ǽ-xJ{p'aBNLiePBO+,i #9- +a% QD9͘zNtILZӸvI^:0PLk 36±uzθ#qN~iV8L̻dbtV$A u)jKdI7d٤6iINU,}CPiTJfQ NF;=U rcgf3 vw +ɭ1iyUSp \ DAM ߾ 2XaC_ yfY< QDybkGȓYՌ\q+$''Rfy: +G Nv8r. (HP(poaȠ@WoJ)A;?Jbja}Ic3otPOM?Me=]< hMVts +?f lTL6[ԗluER#%N/n.-o|`bf0n䭣kLZhȂ\vlNs, .5#C9ۉ\6#ŷKQ&jf}w&#kJN19(zK`w˳bIpfrץ4Ư7kQKڏ|{>R$2]|BJ*e$ͦi?'Ƌ<9fH_,ʹPM-Ō 7F"ŽdQq܀Pa-\w2e`6 /ͰDyRzݵ24RthgP endstream endobj 3216 0 obj <>stream +0 U@&P Ug7*89w +~bn9FhZfsaPWisoe7~]߶w]P٪/lm Ⱥy$Icq/i;m vwg]%NGQ]FZL,ݣ[X^f{Y8X D«UzY-sߛOV5." U*HVZ)a luPWF<J +5%Ʀ2B;'SQ+@!hm=t@O +M6DDrS?[& +RQF }:P  DqQsz74_xm:vj`>;7fw*dœ^\ID)k׆`޾a6-(Kb (BX*:sS{f"v&B0~N(+H~k9RȚy-Q戄v3jˏW|dx_ְ?:v4P׿dn>qgXA;n!n1.F isR&؄b2/?tN̸, #+h~`M~`AĠzk{B6 +o {;ũ~Ij<@"y~ YKͮqn +|, F]uʃ{y))5Blg]$8hb6D?DO'A~~5QO0|-^`24H//*ŬW`}yMҎE,/X16/^OYD!E2 41YjvQWs0{PH3쌨Bam9M\&(X@OM={XBa<CF ]~wSpiA1lü4!6CF7zRF3fAڝ** !{pD!0˨x!Yހ)ONXa3*", {u&̅DΚSЩvEˁSഡ~dyo[ǓL;-"Lܽ{ځ]XEA}BTYeD-|9iƙV#$J}ʏWk/5QMg۟ q}C7/+h0p-TY@jۛLtM~RS3?,QyFH?s7K.\eprWЗȼA84w.PӨX 6zYQRhй'^We}Ǟ>,%'[.I>N"82+1k_+N p"3_"o}pwᘤ_ 7ZP, +Ŵk77g1τ yȈ=1M`ԡ^Ra<8bnP&;:dES n3#7!o8V 4|][Ϋ0t(Su)vf:}$jSWd +%!@|<4 ^]ttlv@eΚl.'%&4f;D6` k# $Ŭ$/U +#"WW NkfsoD [6}K ݠt>&׏4Sб"o,9Aa/-[1zڲwq腰~YDoKISy{Pq2(1Uh67fu5Nρ4@L'Qty{4Uz}ktm8 l֎]5ZA"9 +i仝*9u3d`{82`}U&cɢk=2DLj4H"j٬QY78)H=ԽzmLS=y%PЧtC\=="d[(YkdB vyGJ#?*ֶu6aoB@5u^nQ Q/KOEs۸˝)wP0}2:M&G3FAHPiKOhk^϶;J E܆R[ +Uh#Kg) -4YUBThz:vg~/RУU?E~ZWJCY.ZSŸ́ƭ)ޭ\㾰ʀoS/v;v9?G v$s2St{b̭ào י/?0IЊGุvaa@(1NV2yKj__Ũ+y L;, k\Ξ{QB/xK`& :x1P +Ed֡u<пKOt>a (wisv+P> gP +DU?!DaBFOgrlb!%\,H7'hA6s scMNF[ Cd;3 8a>m.÷*׿,@&.kG%E؁/) [Ge]?i{HasJ%,(Vmh$a$5*/p+cIcjS`hхJwW?ܤi~goaؽaesF776<@e2&x(ׂu$f8R{pjy 7my[a֒Ȼ=b^lT=ț5 -lKFQj4YRtT(opW%7;)zyƹH 4[ ` H<-m鏤PW_t}iVr5l>0 +@ A/Pyu&8GX.Zm[U3}DهI74u(XKS{//KKRbqN0r^&R[Z ܼç@l#$%sv*.|Z5UqZ%CsK޸#{*6D 'Hlq8*˥4Tկudv ׻u𙱎XPP`nLUϷ|]in\ +ӊ⣗9I0Pi3,h{ƿ;QB[(2Û]݁08Љ$Oq ǿ ] +lz9XT϶=9:V`ls=fmA[kվ{S;^o/nzcp2 ?vz wDlWm W,i3(~1c|^ dNX."FvqJ%E BGnǵс|q}s +tHڽ4m +awe=(b/'~HVÊi\OT&dXZbƻK~YR2m{j힯owBOGDk<&UCIj`zt7xHK'eG/dAߌ@Rt#eT Syt->h/ +.`M_7;@YGXdA( `ucBF>H(Y >&QsMe_𡩾h zMI:RL5֍OߘXR/.nPWaW/9sPmysiRDa#>v sUU*dƃ  *>JSf1)<>-PԔvR OKQuؓ 4 -dvHZi, 凵MY"weaC0eGՇSop=pθTVK~o8$:pxOSu~uf$?&Q}Ü>:_}/KKg nEg jz7L4Y 8pOใfRO"VvJ؛CWQ8^?E~m~.bpQ +f8p3Ią3\:6F}f D8?שn8'3xo4{3t˶ɷ=z~^УLl^QUImVhcKjyБx#e!C" \hnD Rx80PG.|賂f V>rbwMGNr?n:) Ǥ^1ډ,)lQI8/"/ˍ6 A JG3d|ZQձGv]G%&(QWemDcM԰jt,&g:/LP0~ ğNv^3sƁ+8~]zIc{[I%/. ۊ[v ?lyQ햜G3#TĚh*|ـҸ,o]%2BL|w.՞6*3Z\Q#Ovr5?We*.\P &ڢ;=25_}MD%yNha2ZOW]q˴vo< Asq `<|׃ĶE&TĮR}g%G_4G}geba VB4xd@A >S;T޺?/]4[p*TF+u-vb}_UG q3s%?|8 5<+v03MD+Z߳KtL#C7? F 5 +X.?GBx8iRC=AߨxYDuՕ[Uv +5=DCuciz̕tqhFc\دk>u($vG˚J./[%$Lkm$ij5D$N*_W͘ij2ջ..>h^Y请b8( bn@Iy 6\@h)OAphfu8KYП*[Z }#,q+T'TPTʩyNd>Y]쾱А)riБtp}XMd-wn@wsaF92U1Pnq CE,榔z/Bk󙚺xnu 0(c8SqWuh/N<@cu"8iV~sG-$|-7_ +b٨?)WDn©^Ľ "M/#{Q+qoL42Ll>&"D@ٗZrp@DvfI g8doB*i6'r3DV/AunNUQQ/F\~mjLBç(ӏƚ~hon;7*J$Oau(y cl@Z|XlȿR毙Ldۉn?OM̔yobP̒FOQ"{hDz;(=)]L..i dhul!Bp'2pgM{$)녥Y~ ,pқ&D2>vӳC?`E+~(׋59w[tI3aRXdh<"v8P;4."`7iURO5ِ6>8÷xNw{GJ*Ҁz6/ONf-!. Jb4c<>osثAdÿ1Ƃ+u~Je@"@-&qU8'ݐw{6L%=Ry{/بpHРCNdͯ c"ɻpܝ(,7zs QYJVhS(ኢ1; *),\h/7)goTb#? u*2_N=w -J oNtv νT YOna|^[tRfa4JY͠g~R.hL /⣀OG1``^2FlO: ԎK|(d?e3߄-V mRu^6ц<]v~Q'+y!++OME=7 mY c|]3j_>'j5M$Zh$w-_;)[l% eEj^/Y|h!; Dw)OoQ96cq5atsErG&V nޚ o*N/Hʶpےգ ._jT#h*fZx15Yb&6Bb[>*\.Y+P``u, +g !gtx*t82,y)0b'jICw2 E5@2rdۻmED$O1z2Vկl}wȃ#r9UNLx=\ֽY|=+LIk8'#:QSM4!ݔ6ϵ%PٱDly1[*"TmKb `#Wʭ I5`E?WQm,VlFqbrWV=s1x`.9sSML&TR +SmjLb (r>A*bmno5B/"K>J1F2!$T8 [m9^%Ԝ `4("%:6<4I؆6)QiC ׋$h*(9 y1m~E&#3/1Jr Ń"yA,` (%Ǜkku[*@+T/!WC +my$/3)t.NzsV5ZI1-.}.\_FkR) n*[VIf_): N}Z/;/#}F%/sQ1uzihgY'DYQCUٲF*=,I"*9 VrHW}h&˞b^P07J;%GX Ľ9M'/g z~ 5c=  )Мm6!(sQHhٗ~uVBKwr)ɚOQT#+v/;m Ac"0UfuCpx=zAX*'i1>!dnBi'*LJb1W;F^S7'7=Z,m~`AɈR2`}X6ŌS$pR$ZrV.I|k%#ysOz~y6VOK +p$gYfĔbI<X)YWuxO13KX]Qpaf#7cPY'ݑdbVMIn%Ҽa#dŶG=AZŁy(3-FA":'/#W`^ +I@4Eڅ +Lѻ2@ΗT*sgD{B2SRlA.tx*!'O=ؙHeV-}֋jPV UIuVVH;E2:2gDvy fOK{Y_0ކ@l5n"g>U37됴K)Ec>@.#k5ɼ\Q3b6ղ]q?KTbƕc[ ;L®4HXmEݛ63;O٪F>]?ݖIrl؟eKWAhqHm[r{w& J!&Oɾ ,M//c + ޻˦%Gt$xoD9Zt)ndggƏk *Kut ҩetgb57LG n!LU''.Vf +-9Pᚴ1?!~5% [:{ cPaD<,)Pk۽#lJ "c|9BkMK g8bQ&v~E {K;!H~v txVwU vϋy/V{v+Fp˝:(@Δ'CAn;'ur'IU 0D73ǃ;ҾppH^ޥb׎–l+%:fO*2վ,ѡc5f/hҌS̆`?*.sfsn +k +bNn".hoPSа=IQ7jg97I eBJRb^Ӹ-i[H{#=o,3vI; {Uu7~CF=fBk&NS!.DGto@zl7ZGVY#"<K>s?&)V4^&|BU +̈́'o3-xߕS+I1ótN-o*{$]i+[!k =]?3]эSc p3}̃]*jjҞIJLJѾzgsܴH"*$C%j/BwfK624)|َ3 +0!"<&␕1BK_n4}7HiQ+ůcxx`g~!EvBi-5NZqj[z*;e۩$s~ ~6{v碹"}WѝUnO OJ>m"|ĔɫQHW<;1<P*OZ . 8ך^߈>41O/Lӝ9A2OݳIJ V&c %*:ʿK\] >Cd7s>ٜdD9¬/EfD"P-=IAȿN/??\U%eIlBg ɭ-U + .e$[HTÚǫoHA 0_ ) @p=Wz)3U f]X|H􉐪up۬VMc]U~)<"y0n +%LB[F:k +KӐ)\؂nę.-Z0a"O>'_=Fje?Xf/Y{je..b?%7ܜ xSjx$ *NTt)X:?n$8Fx>ocӦjqqjӸ(!m#MwݠJcFw[#:>&ß/]QmaG?& R#yZaѩE{O;B睡Bym ȑ|(Iw$Bw$;+-F49ȚxhU{xNUoHMeuF!IŷVt<]9YĂIH~`v|2T|B#rnDɖH@'AWGOs0f-IDK~ QL?77W FOS &b*h"`^$gQlb~Yw:T.#|^& [ͦ;oC@us\oa]v}z6}$,ҫɩ#ȨNIYt1ǝ?O_mXLg:g"ɉ*s^Q-uj \A'vȸ]Pnl/uz"*r:N@WFS)G-ux#ur4h&k8h{hJܮ +pKP6(}8 W0Ɵڰǝ+;] +HB9j^/"i,4'~MnX}Ə{fF!7Y +5M9қAXqJ΄X dnYzi8HLeF[)_w-'Bno׃asi]-\$wLka,Ym9n9_h6 _=I/]ZA0hzـQ,q;` oLilVk2?{H!OTüPZ#P(Ѡdph7WEWmJ:FIhY3}@a.һM5՝U/V-yE):M4!-ӝET1ըnh٩K:%(䦻i&qWҵ"Owy8y%ĻTj$]1KVxdwDa?!}# mΖuq08kn+=**PIXeAU*IMw-_Z] @k=j#2aBw +Ͳ@D`d|שr3N Mydh_D7^UN K&<ΩISyJä&Ӆ'>D'1ٟ0&ԯQy,<67"1"DPVNYh!Ŀ(mdh›BQ}H?_uTLZjr=Гu낡,e;r!r5tCͧ4.MRB%,w/¾ /d[ Puyo”t'e驼;4 zȩHznC O_iGfuӅ?Y3.GoBj R:VJFxCt."njq@4!%C~O;9mdf7Cݲ{ 8WI`f`S67 `6`Uͨ7w,QzT.objWR,{%vJi =!xYŬXH(Q귡N÷uᔼaђ)n|$U/Vw8G}-{H-i6Kd\A +L|*ql6HrCl4M5++V:C4:Cl#90 do*=[;h²9g<@(!g2GLZo"4>Bϐ9$0v] "֛ RoZ,~3E3ʆ` +^U0I߈E5ѐL^w>0nzr.Ǫ-Dr _SQWv [L$k晈J{ڙ%+Wze!P%Kej7O,A$ :Θ^OY͔Ml耉׫j!U;m}yDg@.0]Bx2bWvaB?m.4ŒE:2MEF:U_PJJq]7&P{eEHG{y:ؐ!h&eɄi`f0<,8uRf}3&Wpʼn@!K Z 0ΤՓwK,o( `]xQwIqwzK^ΗDrTFB|ĉg#]~Bʤc.wl_WS7Q\y45+W/QCU {X 1zA5,O +^OӶ4;bam$99]Jb@@VQnnfWT#iF$bx.׋Oe51Yiu?s?MgH͛ϴ`S +eH}n{=;幪%ҫi2ִBͷ-g!R +K"bUG7jD"\()b+3z1RAmh*Z$8?C),{+ YqIN2 G ͢,x?gi$ ǑvCU|T(mD@70{#|0rαbmJ;S=hP=YiVm=Nw]j2e8~bRөrO _R FL 2_gQB, ~Abzٷ/L`g=R ch]J1KB+QoQHCUkc=(؍.$V=iwʪyKJDOb*u޷h,&93^<>i]e |(P֤uCIՙyҮ\GZwa}+~gr.7N7n$ af}&eWw%g &oI'Y'[R툆u8gi/;`h* 8Db9n#bm+@3skȮ씓@&v8YCj0iϻȳq0[0X@@l:Ss'*RNh7:n j%5qVgHogr$ȸ ׫ʀZx?k(u}ϼ3Ed9LFfYоRQtYZa@hU2DY]G}g]*9+6ŠQ,"7g6\ha˰HGWQߛ_wlb#!@r%k]|xK6>)~yD@ɶ+:NLZʼL +┓,g!j[OH &F#Yֿq;Q&m3H^եnٱemZ$m+bvV/&| qq# 0ySX`jEtIDU>_t2i^o5s-/~K +Y[ew1fJ\m`h-KGr'ky ݽ?w:JV7+}[n`EǓaTFyk=ln +3/g& ' y7*EJd+.>Af̐7Lř(](|~KV]0漯sB!ć@UYSų(t# +J'-\:5f52: >VAλXňClXV̓P:WÝzx?dBY#Om.΍Ɇ[kuGX )uDK+lcȊR $2XXCJ*Xʬr. ~Z~[W\?X>+t\É/M7L99S xihneQ! :PUnn_ܽ=o~]yH&Lt>zn$Nsa͐H/ +By1K79lU6iN¹82hY0-l' 'LkId=8T|rJ_5jܮ0Փ;%PX49 +wY );GɠiQSPݧm +icoxm50oH q̱Q? ‰^Pњ洱gfs;&dx%!qԾyHN$0 TO(+JI.YVغ"q׭.!{tPJ +!Ak.s2Eۍiy5aO؟(_ݺJpVRK0O ?&)~_ h5/YB[ 8ו`YD0vXV xP3 )&ljp-w5t&+D`'hG%$lペ'Ae@8 k}]:suwT/M*ijN"7PU5YaFg@?P n%*P`pC $v|!Kyv_Ǫ=[S&@yt@ U߁טe;GǖeSh1, >*`EA?P_b;V<}n/SM2!.v n{qݑݻ[`ʳ昏*`ZDP 97#69Né< OW"xevo Wgq@j `ABF3:r[mST'K$$K$@: JĆ`ik4_Li2=* IYE0j %MVʙ/}wܛ,иMV _pm4J +(LNlbc@, \f$նGwD\kgʡ>G`D38%}$ttMnA&WӘ +)m,&D:íڅ(q nUvw^ZNGyꎌlpPU,xp60oYwOji'b|? +&+\j~'IQމM7$mO PSw,%@EZOr%A% DerSMNVc(%Hrv˱OM.xŔ,y)$HhG/_B4!-#"[#l4ѕL> #i}IZvgE-Hci%Fcfʜ\?E(x|7xYUգ}9w9%]ldyExpWo endstream endobj 3211 0 obj <> endobj 3212 0 obj <> endobj 3213 0 obj <> endobj 3214 0 obj <> endobj 3215 0 obj <> endobj 3204 0 obj <>stream +HWig޾0+ED 9+1!9+)kS}LsyvuUWg9"9eTUhƉ#5fv{vnyODj/`5#Bb%(X9'D%% nT^no~whf/ +~{=]nos6@*l%"{ ͌O_1۫ޜjǷn1;Ow:*)|1Y'owRh"I*Rc{w"tsHV˞Jٻ{hn_{/_fso5j$?\i% of?3{h`*T5_T&JD/'0?~zvqb656?r QDcy{,@Dt7D4\fhM^73NR1bHt-<j"?:_» F^6Hx +joX)}z"3dC7wT $$w7 zM4pJ}ۯ{'&"pq?pdj4O_W)~`z_.wMeaTJy$zΦ鿺 +qVl!rfϔC{AX;yj +OA ?|Yn}D 懘X>TEſw8vqЂ@JQpŗٞ48Q3(yJ3 +2LK勠Sb4f;whӟ)9O-qYIJ2yDS "q 6 +5A(z;FyLUР@b,qoC02u $GjXilYz6Ǵq/C(]ԚJ=p܀{M6aN|@BPjhUV- +q9EMnHXFuAtGվL>k=/=cH5^zw?Eڞ8OU`y-rqO,?V(,5/99Iؽ8u^#r_z}fIoQJø^|BO<+U@q+,5CCMB +(-aR5B^Oej5uǠ%w?yOkSށ6^w%#ᓋ'؍qpu}l~l?++9Cv &tSp"=2Dhdsea> 8? Q' ~sA z U8"e'h!iNDOuyHG/zPH"y)2 o}u2ƱQշ1PF,l9oM{|Vu9ޭ66[?s͝}Wu4Gû^058qs=. +$tC'APEz~wAzf2ˢNe\k-.נi%}z5PS V^9j2A']-%(<9\5k.1)('IgTiF(/6{4.a #xY4<꠾Mf7^l ,YEť!Vc~[T9IyYmroWe~QU:tkzTBbK&H6ѧcWRƋyh +1^K8mrZ2)n]>6ݩuUa +.gXT"\0M 4JAsrKjJή^6}?5}GoQͲ>Pnh7|`qMc +W~$:v3r}rjS3SvPU=Erx&}]=Ks3F\Aʈ]uSBMg~Drc~#(vYXUÍj:xqfhoo} Ez0lq*m_"6k0rk/I*GPDJw U(7ٙWbIk@hP1`O+ E8./1s)stl:,xlv6 b +yi@zF,lQt$bV]wg.AmAumm4ۖT0ۖ4,6B>stream +0 M@&n6 MMOlu|bC^C={gU,Plo XaISfn1qt= pul"ɓ#/^ ^VwٜQhuH"cvPɾV@ӏ7r7(4TR/P{x7,D|3A>ެH.7u|s2e0`.CA[FMrÕ7@*BZF\Fe +TC2#tg]mh5 `"9MOMa2?*]^9eGI`L wxE*RL_?Q>9r` V6WB@1 H/'ךcqĆV5+?~-`=eȠk(iatCCA2)*=(7$?=2S#~Hl1/_4)7F]oyEA 8W*%FVqHHX졘Kk-  ^GA?Cj*.ڮ8xPi7__}[ tXS)Yt&*=%c1U+wiws:K;v˵ MCB!Y/tiU?J4/_Ө]M8 & ?yws%#pw$w "t)B]r'-EűûǮ YeR,뚤W[xӲDZVS4JDVy.MS"IDOC +I1~NۯsiKeO&;]@_h}=q Ptp[ubk à祦*`WdmԂ<$QEUt4򺤙)+EU)oB~ W +lZWt6Qw =M#P}K·L3?p0蒤rWg&1Uh4&K!ӉCϻM-N6<;tuildUUY-RbvkmqESA ю7(Z5U|I͔]JIBX2T~^.^!x(R()8A0!ثP)pxߔg.LxRZK [ +,i8Y2c"K7} (: 4韜8_.˴DERw#v 8jaYA=ĦՍtcY0Cke̼>~KYvh +.OؒS1ǬhesME>#|<8+;t^r9|Sxf=P#5wӍRlҕO6*Tj A%M;?[Np=W¼[~QyL˺W5%ohmpA^{řZH]OX;Lh~g= hco҇H 6r~bv*ĺ^0Ѐe=p{{|1=*>2iNԔoȘ6cɯ*_јeZ Dhޡ/[LރaRcqnT -" }}N 7\);%hx7M9y(9E|NBG"g#7$ta.ab*0v(Voz%WZb拥LOyEGG+t;1 +@ˠi;jwtf3Nq:%g5Q>IgG]@V@Cii’V"բDES,ԸaKo1AAX>fRȕzߑET+җ{Qz#O*q^h&)o?(%!څnS +ʿzj[maR: CFB&f׺%6oQ2D6lEL4쁈?hXdApu|PśX4Du=yp|͞P;chof.{QUX(bdkhsTftO:*`nG}GYyu^1I_ +>yDLR 34 ?!.^-=4}l3uZ&:CJc%mE_.2`Ўe6?MŽ-\5|M:=ݑDHc W2|tkj0(D?0{BF5K+~+i0J9-LhRR-T9FgB<5vJ }|)C>)aSa֚2\YOu~uN ` M]cp,M%2E ]Qn[D=P{e&XrG}6\cFB`VB]Lwӷ b#qRh!19`~pe1/ +EG#7͉3-tvn" (E$#/GR+EԚEA'QpzaV ' R^gtvojqͶ\1 +-0N= E3n H"_*}aLqe 2 +hHlDa3 >UT(E-&c(:%<>⼪zꂉ#OBI!Qep[nE-$.?֒YTQAI<;oU<֎ۮ x=)F9 ]Ν)v0Mڤ[>h $;=/'+`U ]+Q Te4 G ` +<SB:snxW5&$yiEC^݉7/wML:*)kU AiXk@A1Dн`Q n=#sp  Nn+.5@;}>7ϩ0ˇbo@t Н{4/-lf[v#Y5!"ƻzNXavd!.f@-H(o(igP |2"s9p B$3#^k&L(m.y@[oP#Czl=OMM~Ovbz:~G{@ MJ NQ/B3JSA4\:C>X7 7Y1kT2A4Ж:]bb\9۬Y{qJt#?2L)"C-{[Z{~ymhRn-Gީ WlTts:'b\T0~5^D9Y&u"f  N7' 4 +SjnhTa %u Z]slj*bW4¯GC&-mC g8g9+E%/ax1kRL^&30bTbdnqHVg^QMKê?,?n^ <Ϫ,N]j1ƺ*6\E!pbkй" R u *^|9_^^ +4Zv_p(6]bH=~'Їέ͸9>Qܘ4k }S6/9,ty|)L\:o?C@ 5K:eq3HO!Sr .٪2z{W_AXĠƞKUJ%-)1`'S@>ZIoNeH[lLhCIZ2BgH%+PQ:/¬1VpU0W'\?*[g7PȏG;^37əih7ka1ٚvDP>ooUe)v]TAx\%TwoI/S~U7׳gFi?ywaW1JWYdsݿ`oPnL*Lo̊`oǣRtQ=xT"#j~eZ?!UuȆccx<ȓ8j[(g@:o2Mk9v<:Md fBA_OyDۛ择vS0~L*8R`d=/D_= #s}3Տ_7_+ŭ䦠(* +>7er::'eoy~P}@:8 (vH Jm/+|$?* q&:B"'1)P6Эs3[ D1v 8 sa{:kc`~qJ 7@U/} ] ʬӌTlVGfTf 049CB*yqg͖F\}dB5AS\2|o~5;UT% ~`S k7`0hͦGp +1T9,7fL k5m%|B0 ; +NfHK*Q@̩ ܯ:T}g*SVǫ U=Tcp +KP ^(O&1L%ce)18#5L{䛕tr[>#2f>ě"bc ꑶV1 ɗ-_m&-}U^Scϲr6MFb'VK5"s;y5 |7Na=,__fwh4-bTC5X]lȌ# /?N +~x2koUnۗ1'M7DN/'r7W=(SQ!*&1y66Mr2'\-"/O3R[W}.g۠ЙdE,&@ !RidXY+W0~1MUlڶ_KN}~p TaI*D`S,'˞,<%lnMt~>z)o;kee/t6/oFoF;ma3LnBs @V`G{}1׀y;}]{+V)0bM)*Dʺ;~u&|3KdFk\3us26t6rzPZÙ|~='>$7Nc.eVoi A1 = ]F#(=TGD3v Ȩ!NTWwCJTa\il#O +%F:K1ruyz-Q>u5E6G]4^j&$=F{Z7LIhj;<|sv'{ vJ*^b"/es'IE)+*1c-I?H9rnRwz4ol7%oy\oIN fL 9h~^ԘHάTsy򼁑QzBXesv>ҡB=*:p?v7.( :3$KU, 9ŽR\{ʼݿXPZht<[Bè{m#m^m*/ '|q28k?Ge_G(h(@shZX F!iXo+([uFS>0Ya0HG7.qd 3bQru{ZXkyQUa~Zv|7@w YEoPtTmD R첥s㋦q`^jWh1Wy92.یO]-X/L_ nn1䨬pPұJԚ _Ety^ M^ʫ+]캁1j+$Y(] `vvò[ȥz1,Z +JMx@CR6tMuF;K%"HfJ"~xs>;x586ֈXcO72S& x{t奈`,A%+fZ@AKڞ+;Klr-S&;;uc|jqE7\}!YEXu0~{]Dvhtg4tD (uK﮺ y+_|&wO3x?p?Fq}WuiѳDJIG*7x v;eiݩ\.Qgi-NPҶIDT{HLpR'#h3/jۣ!c HNW2CR~<1E<$^7o4U(1N7t hϣ$!SE϶>rb#oF/E-/S!g?.q5^Eꆰ`X2fM^VW5B]e E?RUPDŽSNP=>#ZqB4.G <m5"տIciW"cIjU1]lLio [ s9-ɾ .!ӈJ=MG >sNo7j7dO[ZIc8ɶ8^'kX°JduYy5Duo>΅UԻt1ő^w$)#4A%sIV^ rqհb-:[@3oԳĥ^C +r[<֦4zjdS0tcK=E45;4MGZdve>4=)FuIÀv2hή}0̚ru + 2ER>yR=mJ!>d - +> k)1u`ex +tIR2 |0.:Avv릳.lV4+#Úw:P7*qV#|?pE _?"Za`$zMyr9%2nIv}}Ѵ#_F?~xc%D kM (Oוtf?;cڰ7R)$=%>83rBeEt\Å_/lciy)l%-} +ed/AZ/s)n5re\!=,hr,X#DEn )F0ѓĶAM(BA?S[vV_[|?t/E`W?$A}6yX%5d2a2]?<&Λ($dYDTn4FW~sz9`5]LO <2],wS >; K̭%zT sE̻A|X._LǣE]Faa- ¼]) +ݰ8;_mEAL]ӳʒ eԔexP>Y,vV"",!j`;tKAx7\؆%N̑͹+H>uG4JpPmEVV\)6qn+Ds5XK 2݂6` ǘk2p# vqtKȪߴ Do#lm똯p kr)WΥ? \ INkS%8E{SHD*}ϋG|GL|f|5{l?4I# L$XRO97MOd"6ƨ̪]T]95<'-ƾmlw2,hg/0Qxb{"N1 +ތ-JڪGUI&(Zq_hsG_p|a,=Aklg#Tiǹ*ۄ4iIs+iim{3?ra})\Ĉ3]B@S +_;*&LFRgDkFtuQtķ[A8SF/y_m:q<{x;xHɸjJdlR6ϕOs|z}w{kx\pnW)"|@gq !ᷴl@T3}om1  A\<&јT ?,Wޭjb#=t X"<|5C@{ؽ9@ز*1w8݊5͕хYm5ITiONdu cYñTGNQ_w}QBk-)+*`.?tv-Fu<9OQ~Fvcͻ9Ec@AwR}9-}̼̍ {!Eν~(h['Ƌ@0-rdVͻ~MEAXo}=ݒ^YQ1LJ즨s#:kj_nj(l߀V`-tM'f0>ka U.=c]0m$>ɶt +*}t2YlćJE%`1U M2$*!߿0>[#&€Wz1BZ.qgNXO0j 4Д%7%C']J,f}D~{(u&i`9N㿳.Aj3vD$I4[7"byXOQ}lwv_p{]K w-ծe?27a~PSp䆜[>Ú{ jp%_q-^Gd9 -p B/JS# :ViW_oq+z~8W=R]a'>ݘ ߙ&;5iإUgS&&`T[k_hBś/;lӼByN벛^A>&Hڋɾ@u0`dQEgG*07~H9j6VʁϋfVLœN~^i,r_h @ZZ i2REsqt[hrrYRB>4IƦ."?wWB4ȭXT;ʙqZ~| U;7] 蓁bGSbOp{䙗Czu~آ銴gx/'mRhl!ڠ +M_2y'{1Y({U-SbE;[02P$>օVisQ{ݦG]8hXfbz'L[ROVIl+Mڱ6 +)!C Vp(3nfDG7|QxNIh Cay$B7vso:osD,8FR|O6BNcTz7x%LjS]:`'߱VB$CT rn6F`g˭{ " 2eM T>֋%!5!N1G$2WH?ǰ C3RRK=a?,.7Z3d>҆J\_$1!r`-FnōŚަ->Qs1RDHRTYgUdԄ5-w`3"#P^r111o<(IDyK{@3jVuW}6օEAB~fՏl">o 'Z6-4vn9e GZ ?b6T=LKd>\op A? !{RS KB*Z9Ϲz8'_3T}"/=A%BAxru/o }+@Q-]gb<.0w'+/5ry/KץXams/!s"QC=W{'XzXC՝¤Ϊ?;kFdxlh)Sk8 +pȟz2&~97X]?;] +lcj5C^:x;=U!(+  4N{a\NR5n'N2t*r ̢ H L- ͗:vYF{x$3!Q7zP3|C5mvy`@q;֞t7.͏kHfoIEi G>(sCx@ XIUAT2!xz+cZ?DnNVM~gz+DHߎҾ_߬-cSQ'9X#6fUAū},H3q;ǻ{ϭJ} $HmKyDkB2BIU Y";ܤV =P U7!G0 O\/ +|H;`k]N-RH?;ZpYxT&{ג=yrXXKQdrJ-Gm|]4#,gC1u 9 zc>5tx+az\Hj4?BhU cq $"JmǛ[x=ecC+:$_y%og!ƸKW +u<tfNygz\o3,ZbLEI-\Ǭ,'Y +w +Tމ4#{UcN14))A}P +TncT6VJyhy\TukV`rCwB)LDԼ@ 8iD(nmZօf@ʚ rq҈1 -$}|1Hmw`FP`l>or<8\W@{3T^1H~[}{D L܌Ƅi]_=W`k%j-F6jb>w|fn(Au}"fZ_z PGյ^V<4O7/ͱo/l) eU2V6?x0:r Yĩ_#7B݊$ nΊ$f{"pw@zI-D2nlDŽ!:!PYUZRxţ6G0J 'f‚j 5}&n(y鼭xW!$ГBf }E$9A w&gO$C>Zg"n: |zz +z*:ҜO!o}C3=ZJSi>oed 0ݏ5,s/9dо⶞NI_[8Snj ͷҸf駝fa ïATYet3W(ҥ)II#^Zt( ()*w|r̙Q N1!%.I۳o-p" +$S3 -U 5T?}'5C^ +bKJSZ@ѩSN38%p%.̄^8+^#[O/ލ1Mr1Y&ydZZdzKltQ>;@CYOy2srĠ)BYf#:US6q1 {b5ȅrLjE]cP5˘D6h,~9\LQz Z X 9t;]v,93;o#HZ%k \9.D0|t%6q0w`CGI{Ck!J>T2^ +'_p\h>y1Jj/%-#>I7XX\#uj'ٵ 62S偓E65|!bY+Y^X1aib($ʽ(LxސtKMG'&<ڧ\]niDҔKV:=ihAHA Lv#L RDp h+L;HxBR% v!h?EMHK]7PDضCڅ}4Ub ++'RB}®%}Et =ޏ9+髤,a MPa!%У*x ̯~-T1d1}<#(RM4-Erj`0pbӲ`3F Q +c>u"odlr`Rf<}dæp:{-t+FBG;4и}J(1;FTy8D0[sVgz +|_v=ٖurn\ +b_6 |_ z>MVM@{dbCV\x=syBA`/F?Rt ToBΜH5uTB{fꨪ d1e&و?Irlc*L Y@{v{Q[&*''pG{MUVdyB4af@_RH`=(ߗ{[ y/SJ +r%`oiTm63?2 wT{NN ]Jp]a74=:+n +ߵF45,4C ] OP'fb֘HSjbq{ǀ?"j~LJX h#Gʡ90N.]۟kbX&7>+$^F"颎 Pҙ]s?Oө8P9g ~h])z1K?oe84V|Q Oc9̋zjf?őWl04}P#evt)?W}{Am+p?z3{[f^aɯZ5gW$E0)m@T=eW{cSX7Y$.hνYN;EBQ |ɖRIw7 Njn1! Gz|i8MD=nZҾRW2FOIK@hcMovl`2 %܎D:BQeP-%AK_OGSv}JLM6s!xP+0N{<ֆ#n*_2ܣ*azMkcFeu=U|bĖ|Rԅ#e'SžXR7<aSN]cx轨m>#V3@N1!KƇ z1K1&Z_7"3^~e]^]L&u|-%[#- , DghDUHpRI6GrԚC8j #X^@3^xW041w_BL.r{Hw4K=)qwKF> lUԤK|A@I}8RݷFsW謊wA./i/t{9SA`#m=&Dz?ǹK8?=Ƅ/ >N#'lso%D1hè!+z837z j"c1|vM<8Cq5; 0 Uz/aÏ 7˨n\WqnI?ZtёI٬q9~Amn1mL) +X:,Z+of~>_oC^dC _r8V I̫vTfL.2cd681H9U5Ѿ3Dʣ'ˑ 60YGYu @~q <ed5tE;qׂ@b)6h2kPx몆݈$,V?9~N6vEA>[^8B5Ga{zrNG6eFj赇 k|dUVZO,FsKNQZQ sҾZ&sG'Tu}Hz! `,2 ݾퟆ|&\ 0ynD"݋WyQQXH%Y_E7?C0J3"'sR:~L#Kh,Wi7{ynVASOya&[b+# Bd)!TyAjiLY?7ѨG/UIbb`B"nt\R8_U!3oXij0t)#3B\z݁Kx̡Z<;~,կ`RBIh\/=g +!K@ԗ]kp11*22ZhHz w^;1jNh]%b#PZ.nxVeT0!Gԡ(,9W[ +>dځ(m- a\|8hٰ[qL^22ylɺn/jYJ&/_~@ڭhLlԇѶN|>WoPn Ҥ>R^ L 3TZc=%AtoA -L=A(!s]#>t'u6-|/wO%WU +U|ߡD:Eyg:\%s4X: ʼnV>o+2fТ9s=0L aG+Q%K4Y-ɶs}Β8"xq/CMpk掦"7 jPgږM np$x[tgRAD4f/'Cr):8}@b컰cRu Bd;%Ӯ'|PChaې54H|݅"!U1lt4Ժ_S2&¼kX>M;Zk%uGdTb>SЫZ;wAwzpz 뇠 Nro5mb;sܨñC!YE0xN5M.ŅpIn,Oђ)?tq ^܉aw9Yz)$bkfRAGE +k~i +P0|Bz㶿8nyȌmZW,zg}L*.-J#yު>%T XRp++t*eqB[$Ÿyo(. (tl.3ز2_hG%UG֩v)@hkV91BNװmǬ?d%G* dDY;Z¢@ۖlv dn;kag8erqxx7*'Jm{mNL*Ei̼)kܰL ňӏ~>HX˹wY6nv'.~t<ެΩ Yenb]q!|Km;Z.y(,VCCer.wjE +4{*@Ua?Vk͒6m U2IXFvá_Smh'9pfJ{KtC/a eܗN*cuwIMUM)9K+`㌡epץb<=)vbyD +9sk95eeڝDNU%J[֚LVm*{^*A~S݀1VnE,Jza]EPդ~E+98l طk`Kda;"_!uɌU0NX4g=3+INqFo}MOMσ~NPT8G% eNF.0LwVA~zu:g}ʧ q2rqH3┺nscb +2N(]<6gl~~8`@-Is]TAa0~d䐎۔\5ȷLUc:⃏J ȏKԌS'7tj8VuUv.@h-G,˪̼:Ckn󔲧)Fq RqHnPΚ4u}A9rJk㘐lJK;Ux yɸEU[}뜙ԣzbޫ\?d1+T)̺DvľG,@fP7DTQ8?GQ Lvz'[ O L}˞aK6x+G(IW25[O-yr8S#ChwQ%g+_/64r(R`u*7NSAv4fCfX,W/VDD渭hM?^OKw2* g T]NZ$O9zi8#1*قFL[zEw$V"<T'nzj*נիB I>ݙϷʿ B#^:P TOqE:0F/ +1!jLx涬Dܤ)&wf:Σ4"O<Xty`1SS)5$BKzXϜCP00B&Z01*K|2j`W`Pf-3?A AP i`Лg9 ׄ/හbPS'MC0!2k +(лpM+5?D#JsbewjEY9a)V=R !@JlnKnkR,0hsclKMm`a#Ih![;iuxLe -rNh4#=RS+T!egbC#!hE8TT0]۟Ь'*spGg#-rT J!Gѩlq_L +Hýl[ܸ4QIWl9aְ+ﴜMtu:VUѬgEVcrrMWA[ gmo@ „HuJWtv;8 +Ʈ1fZ|>=-{_|#Oyiw=iRU{#4Ff]DJ;$-f)-/<cXtoo}1>$]AS%H:Hr*9Lt(fqo݇˦.F6m%hvR `"TI#RV˜q*7.?u:O +uf]y=QR\[׭,~ 0Z0MhjFg#}S a`v9:PW(Zt>q/"^puI/6eN~>5jI1LejM6󬨇9hדNa{u$PYA, 4Џ$ZC.mF׵|5^C7n%#O-ˑ;ߗz)8phMGvH=񪊱"5+Ɵff0壸Y9IFo~v3a:]o}(, ⒞N:)prJ*; ֈQϐݺPʑ"ScQ(~l|T2;UZd׊F. "cZBU%Р އoO?ګpJ!&ĖK,tI\ p1p"=`1&C9/)ݼmʩxjiBcH#EFwQ"e)p`=ҏb0r~QxVE|W̌hmd~=_@Y&w:yq?-XP%&*6KvwLw2kC~%k ޭh&YRz[ԲES&5!i/鎝*FbUY wpL9a2Ұ*- >&MNjÁ1f+ W] Yطb٬ WLOp|4>iJǨ`YҚsV"Z!jP'KL4.-*nV"Y{N!*8`%Yp bGI7/vmBՃ3cQ?쒠jXY .uShty+0; * ~ZUO~%S+nuYx!;\ڣQ8րeQ_}LLp'YX!eɪ;#(&[ e<22Iӛ5b#ˉw s2 m*5^NZ"fd[Yn^Us>>MuhǺڲA JwqP}vawL3fJqAzLGzh/Wr4ƯaO]̸̀[Cxw:rG%#rG'nU`nK|i,J?m4YPd=XU9 ]6f27m7ɗX.ĥp~s5 .Jt%ɇML5=1&ڜRaRx`6}<Opd޹IV˩aڢ]ʘ6į@ 1&M Nhw OɆ +{qo;M~07>_QYd[{|=w^2}4:3 66çrW +™,h8o`~7ze_ lH*~t.:$``r[=5־pJW '|w,pfQ&APl4;[xlj]pRh(D݀|.j p!So屜>?g;WFׄ"aA顡+tOlǨM$`7}z+S#7&<~"C]p¾"w|;6ѩBLqsL&Fn-0 +:Ĭ!inD\{L?5;0:YzLd@KކY:->@u<=`(=RXG%v3Hm8%LUZ&6GQu%'Um甮w\_g 9*ilp/Mo8 Feո1D=TA<%:};Zq-hr6._jf`"MC^ ze34n攞tD{-,~Ł͖ +)Q9"ʚ^q)ߡ)12M٤佑["QdʩaNռcpj[GK~h*$v`}[-H`4l ,$+e,X[J;0wW YRjY~W)›(W :l` +:v{W![x('@BF܃-nξg&L` C>gKK <ܽ)+V_b¹ <ċb.xX:3"#6ƀJl@ž,}>e.NTto\}k29KPxc?w"Fq<f+xRȖM}yOB@Ǐj%24`y$v^NYؽ^nK%N>R* M?nmVIb@65U#9~FMf@,z20޲o(F{ ](}E|Q 90|šw74"R1j *y#: A( Bi@ ?t<'Gh޻˳Q[Q !,+UQl~X@eHg츾m2k.`|L]4rЗ7 H +F;ju*AE4g Zgbbyb;=\xKnB/|⼯C,?i`ކʖpsIˑ6It7U'9 Ko"@oR|mn^ȤBq5!)bP.与ev ;^TnlOѹ[Xz{͋ѱRRĂSE }̩LȒT⃴n6xi~0-B"(Y^v':A +[&l(UJ1co-JʌmIraG'u endstream endobj 3205 0 obj <> endobj 3206 0 obj <> endobj 3207 0 obj <> endobj 3208 0 obj <> endobj 3199 0 obj <>stream +HWmog +~kqYbPHB/%rw Ȣ83;/<3P\2.8ڕ h&>q+;^=/E)j$r +B[f ~^R +†#/ŧ?Myju)0a?K q(c}QC~)-nCМiӊEu%nrU8Q7^2c43Jڄ :D3fbv hXPޚgc^OB7eXAayWpӸ\\6c5kZcu?㻿]Zvnzu*_^\wrpB0Nz͔v&oޓQ%dř!MƧa1@Ʉo=[A+Ԕ:*:! g6޷hY Gh*YE`@D۾ǶR׺V:%#AcsXsSw2g#M{Sӛc!4#WGRUZQ!\ds]P&IGC 6: 6AدIj{ttAJOٟTC&n[п9cWOztAZXJQD۔}S+q6rg؈B?C:TaEnTeWC"eo#mR,Ww6Iِ?W?̰up3g;8۶@ߑ%jY\,XN׋U߼x{YC3vl^ Ah4W7h#1$lXRn{G0H[y^Gҟ &N P>^>01cz+TU1@`<뻺n$7`S endstream endobj 3203 0 obj <>stream +0 Z@&r Z[)۱ti=XR?dstވTj_LoTAd=T ܧ\R*4H1HEGÀiD p5HLGFho;z;*G'Ϻ:YOZrEg]`P0);l0DfᲬ~w E`m}WsXnMbm: ~jwie)M;V_@KVXPT҅ 3o 9ӛ4oY8'P&Ӂ!}=,;כ6F8r4 bU$\T@gMb{N.- +\zw1 ]e`X@n( iACwvttuBY7K1IT0VZ AD`64>E><٭&;3ӧ4mFȾ YZi}^ZŠ>߮ysjh`ȳ [D%A7l!q6q%IsQ׷iM"|ր$ +"OmP`?xbl6v/$*@$B`Jy,VX4 +nDv UZ0yP~oIidQo?ԑAɘa^A'=li/Z9…n֮.h' cv- qse]_K{+Xht ;j'@lk^sSe44ʔj+%jM4I wQ#Jj?<@N:DcxB}VH쥸x$l[w0cgTQmxPPG\3:[l[}ykic\TDcy)C(cZitn ~0r1ƻ8HK/dfbZqܷ" UZ->H0EZqJoG;L-~4\ ]sX85]1>_-$uZP6`} +Z\~(8d Q.}ZX:85zcSu%% !0etb{v㲋E(uoK)Jqr$W }Bp>T$oD^&n2MLK! 3~ 뀵g#{ƠZpXkJEMa3#yy.}sD]/ՙJSz,|SiU1To. oGi3Sd%-!0y`SS׷t^eQN S戓E@,ktn{oLae,uc?*~Q9nqŀ_iNgP|97!ttI +yw[Mps>yLMwDɕ\b|S;%)M2LMO/E]5٣ ib˪0-fo^C +ZC1%Ia,Xx>^=53He4-CFs-*.X`L;@DPM*rIЁeC`_C-cl$Γuy?fxr5Y2(Ѣ,'@AUnki|,Ei 6o8Ȯ9vHϡ[@$'(y3P(ᩧh]bMJ+C/Q4Q?^%"xj;$"$tr= +Zf4s^یt՞]wlE*P03CR)GD6u>+%ͪgww|q|JylJØ}^B3pHؘXFx0@2e)]hQ X|#]~^U1[lfgS;X`w'*X!払Q>_4F˂{\忽\ 9[ qf-U>3ymo6Hs2`_֖'6ل!'E>w+RmZz36 9wUeIƿc@B7Q'VOw#.POeouć$lZA,y#*1c&q|5X$հKVEQQ12"kklK}7#6+FFmq9?ᘶGr4@eK-{m{ ƶnUgi\&ާ)  D{dNIZ& +[ù!ϯ5wJgljf}hn"[7q5Q).ˍNVK2ZxHU"m7eveT>pCeY۰k1wM c.wl} !30z:}E M vآҖ!  SD>gÍf{{0%nj#o|, ߒef~<,p^\N8[Hg\uřB9B3gU-l;! 4GnӿD>Y\2?-U;tIY5)ʏ}J~pȨ;׶o-ّiM[[4lۙo'#}4xH2ߠ'hժˤ^- +nx~5uMri(Xu'F+\1qsVg*\0kl<щ]gl +_b2>1cyJ Z];C3Enhe[})u T0Ero+%5>qɓGO 2%ɀ=RәRFzP߉CkM݆:޽v1ۍ0&?@=q_ZdR%]qNe#c7

DK6jQ7Bo }sGWƷ~W; + Sꢞ!6`~3!Rx!h7 7 `G(VQI|?j8'Mef|;IBX/AYo'::KBԆc)ڒUO$.i[ ]ǹVi1{ÒyQ 2设_H>6y#"mFMV;!?I8^#up'}G&eN@R~{,OTh^fs:hRmig7KÌd2f= +CV'T"?# >R.9^3fWd0˴ +9Ӌ 3nv8O0sp.yR8K +6 #_J#C1=#A=tr ]p\e(:3_0 ֋ԓ?IO<B;t݀mUe\ K :,9s0*YMNYsõ?ð݃u ޳EZ}4}V8cnZ6Gǐл/]ңMAH`eUkzh`]hkF9 +nHai!aC3(RZY5.W8p>V(E~wP^vZz{9lKqUM3h#d)ڪ}=j@rm"ͼR+`Ruۑ Ҽ ]xBA +~"y)1)_Xh-->`pq kmٯEw^Hced cȆ~P<&o`S|?wx +̟%NV] ]XKXhsu}G 7RqH><#4+Ȁ$(ߌ<%(=x4[]{"m،O2kv8vZ.&D4-͊ThAc V]S6*LhI`Y:(T1 #]J?{UAC (?(E[_@sAG + hYnQD[#ntn(m,zE40Nv) ̀oLWy|¹ A4x-pc Zv9 JԬlF Cx({_֠_ןvHyyi"׮Y:d6iWq1]E;t!==`v]KFQE mPNXq39Mb kcfF 8ŀ$퓚grPBqX_v6KKar_>#&I. ,icʽ0 +^N 1KIIx #)[?`ٮҋ濙mdZ} @*C͌e_Y< q.AbH8NclƣŢ0vK*t*Tw*|)lPUgG8G L m?"t#b8ڵ~^PM5S<1#9-;`ν9KUx¿ѾDOCrl@$R'||ԷaJ(|RO<.`X`9[ukR07Bo]ly3F;PX+SNfL ?OJK'cҖG+0t5I]*Ж%ӽ+ rm".-ZJ–FjbR]4Yd6d6f 뀰 MaFS#Q-]%,,B!"t+MZzW_菸y=Po?2+5N2ALѷĖsGWw􀗊c tgb=g8"6{\Ag/V*D*ۮI3fJ iSV>ٛo5,W:,VET?lVp-޿E\إwn#"O'.%$aW+7[ި2Ǡ[ö-X}h6Აck1k;hm "Es|H[SKO$$_0}k0FaocSp(N:<*"ڷ#nv,2:RlP4C|gP`k%&@ũ`4N +["k1M}3&л^wFzL}pY\WV`Mw ПuTIrJDg,c' ]?@8ZJ Q[mcSmy̻L]H c|j;;E|E.ODIQ,@:o*7"&^ +/+ +7j_:Z$fl>rB2fD{ITm7PQǗ0 +!xN\J1!Ё;}0! 1v]^V_p=٧*KFBITὐs}Hm?4C,DnOr<+SĞAݖ-@IݿeeNƺѴ. YJm`)@^7^3v9".VKȬW8&$oHqNvGN0"Z,5ܫ#q%.+o=a}ʓҢl;է CTk홙nttGGy"g%e3xh@oBTdUx7`=[} `v]lBڠ*W0t]O^v +h?`+"o)' ԉNs'Lk.+\F訴N- +E߀tji xd .v.:D@|;Hf$C\Ϩ^J(It*"YhD%_BG%|l>T+ܪA D"o3IMhb,D1R^n8ti_c}77aQ9'{5)~^Y\ܮ8j 5UVQ(':_Sʿ9-/ +Vj)J&W3N.}v7C9wO)T7۸(9=ro)&M{ն< )du1⫱?p{`c1^A_~5SS` wC6?Ʃ:r A4>; sn*iP~#d0,-m\4 ˀ؃[ hL8,ɧ@mBN]]ii93A'6bh)_Y2T?\n廛h~b,)_ gb$LK$geuw/)kƅD#g_VUzzo@@ Ȳ^&-9[9bШZMpxt&[ it}x.4Ev=#|sx+qdCK.A4Fd9*pݨE.O,~`f4q +}{T +6o~?z8+XWgpM){w*Ub[^" dGhga%$[bx`q1F~O1xZAmL& +@r̍/00VnB|*旫&9m?LktwNJ=B<Eh0Vlh.nc<ɂqԄDוo&C೦W\ywZWz[T3[N} +Epp%qW&%B{$:|7XᔊGX"(P|7INQ_\cI,[PHп.GIgv߇lBDTה'/Q5m~=*j@t- V`ыM䂘; W/hҪCÈϚ ̞i S +U;M#9DIyґ U#z V(Ya[kM/]p +\ wjCvlCOXT D7^A<~ϒ8ـ# մ9ҿU7cXR+ 璉 cv>/ju4vp,-6ey 1/fAtMhZi:2'Qp:poaH|S,r鄞}¤-ԅ E rm~|vu"PGsoj>Uj}6}FQ+ ({aG,B,7G3vI7OS]*D>Ji2o`]>5^Ʈ>M l>e,5&zv?Eyǐ -2^>DN3܃Mx`J[*߸?#W)\H|QnQ%y$)-&Q1.oX![4H 3 'duc3c#sUr?aӍ͘z\jO4B+K "68k"$1 Ӏe[J;\bLRh5qIʣ{O3#f}Pv0穜$}ި^i*sBw"Ð(Rac$h፧Mo[gS[DG Jr(?09O5XǾe6;Gf{ 9цiN(!_#;⸨4pI[*GG'U.4fzJڒ[oMYGհ%uD&;8FP +/"ڒ&^i2*c9/$TSK RZ,Y7u| ݆w0oα& +U%r UQAC4P+#]jTq1P|nmiʣAjI-Zdb.^CԠITSs:U34X[! & $g$"n4}amwڲg ʈFcwS)12=hTSdqaߠY~.Y{"BNG[!iݓH`AUJ ʒ>ć%qN wZ nxJ/vfdfb%eZD{A5نPiELj<3_m]e l0%r&q*>(LWRfb:mX׶T;|f5D^U{B6 +5^/KP }kRAӸT`U16屜g[' ZF!+8m޻}fPF:$ +/Ԧ* Ѐ@ΫO4b,^8Grτ cfGV-+ѹICۘԔe" / }{+S ڤ;.BB=]bq)-̠=dΘjY*MۡS16f@3}i짎nos\܁+I,;WæQ`l/oe`+[ID9EBaks,Kl=PqZvMU|pm=??TYU]dgH'sXU$\[9f,mS7s(> n1J06v7OFnRmZs؛j[jؾZ Z`DH ~~if9|MːS5 +h(y#T=q:354 7w,5lC< tֻRG( m֊3=+Ak=k[^vfƘ؛z;}7z->8#b]VI'D5¹3c4E4d f=<é#Av!.6F{ADƁdtپ$tEFJ~g5YC|~Y oȟQJ n(XMu`%,}<ΘЃ ^{lb΋2F @@}cKKiiFa#X J V,>Vԕo$WNunrph!T<]Z`NG :"!if- +Dp'2zK )qyǓ1;hW@(~<1o<+V[Ef4B3|UJ~g49<6[ H^Y2^v1>ڇ +poӥ{S7ytF;zKz8O`;:[ox)i>Jr zo6VM / ,Rxm*"FBdVlHʿO!-%k5״91 + H T>i>/Ap,9Y)( `M*<vG|,)m:mJlnq\^zp٢|i}^{VΎ8ړ}}D\n iSau ͳFc;3Ug ,ySyycل*n{AIݏMKbȚ|/4r )ʟ=%뤂>y7YI$.ry^Ü'\ 5 DhޫkƎBk~yfe<0RV@f:\e[i@T$iJ#(Q[A|i[£Ó}"4sJk\-0'aXDC+Uf/?lXud|O.Inx(^"0x%!+L]M,?)0+B0q?_ "7`Mg9oyN Q?|}hh+kШEӅ_G3N{6KH) C|Ka1' f4-}wQ(ꦄfd5MAm^yl<Y>A +t%<]+vs^Ltgev1y}og>OS}G4=”+z{EPKpSֆdA>\&&ɱ+kjs* +bߚ7{-JFji=P/ow7e's9 />͙66_ dyڝdPHTsg>k<,G!CK<VJ?h"i_3q}3Y)AVsD%hK؇zO|F28w-e79FjW.  ۚfxD  =?9H µݿw&ÚCaBe>-\eiEʸ>JIO~#ks1ω/ԅOu),~ +W^<R0T筙]D |EhM՗b &WS><9ldL[SeWg]\3-%W{PfgmE[^WjQXDU +)oFAp r uC*A:p{ ftҩ9nkգtO_iw'FAGv )`M'dGHEYL֕V5S#] \>p  'ǜiHɜjvِ(ך +`Ë nY]w#C;_i2 \rԇnȇJ +O[ qD;j(qd'miBaȐ22e([na>smc)pfwԿ7Bt̀55Ihc#}OȂWUkz巒RzNbntjS(f̗tgIn(tAbK-O97*O˨V^)@CKg 8Sw;)6 ǜ1^+U;>dXeB@>1O(Jh˗11@.-eBK; 2f7%y]{dhIw /,.Cbu) "ܿ߀y~'DADH I]4aS3cAWc*LOHX,-8{LӨ⿍= ŽEJ,[ fp衜aZ˒aD7rZ MY9bB3(q-o+T0FtmCB?ۘXa{ tjI(궂iaԮG#yW{:ܺ>:h _:1!~,]gG"JDʔ_sjP+gyzd]׺󢇎`*o4?C,#$`X_>U&5e"NiDyjepX7x7nU|3 )l$g4qaVrmDV NQV)%d= +͖l A>/%O#RM7B1",/Do%W_c}rmv{䄿}ʒو'nQKRm~+o|crS +ua]m#!Y^jQJag~nR9 q=9 M?3Z`{@rӦ*Ј‘494)#qq{hDV*ze礿6rK>h{:+t@K.2Rt +DU2ANh$BXP;x RTptzO؟Ep/qWh]\% >l<ct }e;ĵ{.(.I_{|1J1EL4{0V LGr &KsRݕڎ>ՠ/V#qUN`)?BOt9Pvm.`R"6-6R=f?kxI=Tj rƝA.FtsRwWŸAN&O,iCQ>ěԫ~1 WB wD/)>[r}c.CwF&/LR] (\=7 ӣ>{E hq/:-Vbj..ӡYP T˗kcӂ|LtjQ#;{|CHEJ*`;俟ukIoۤy8|{\yW_e%Ŀi5!:%NK1 9>$3(/V]s_f9}F& 2#lX@ :r<\'?70Jj[ta;²$eZzLd㿝?hY#r4,SO.7ư R=^4D)0H+'u#_~oq!#ZxOk`4,Sǡ/o_S_-9.BWֶjY7'SߋuۈF_I#GžB_Nqw > +p>}wK=7܍W e-C>mW3CxJÈi[_'=Bo7dkE l;A;8z.m[&m=̇ `p*wWiBZ{gTlh9o-m1칍7/kEm-8ε~ "@UO-oor_<>;ScrMf%XaK pMW ܹ7>>>6Vݎ3y1-\J$һVYL>wwp~p +xG%3,l Ygx%-vBʢ~Xn2 sX;ip&ÂNIE)K_L>P]kg MiB1*dHRe9I+ $e=:@3x _( W?" hC'PoPX`D;B}|eyxa[~EC2vx/kZ)9I=_b/9|巨7$4h/I%c'̂[c9(|xsEfݻwS.e6 >|5l qrU2Sƶ)A ZŃZȷmy u\ +4{\K@oxË|a"!K?fg(43|7 1_7Gʡ>(-w_ DNi_5_V",J~E?\[eE|q%hgšpVzj & OJ;Bz-IwNsVg,pCWLUxUjh\TJB|#P>PY+7L 99̹^5I{&TeG-]]f_NT__Y.9yxvGEguiigvߍM^y<wѠ?k5;1>Аzf8?&E Icb<#B$,ZpbDSJ;)a F[j]/y.zȌ2MCH# :vUC`mt ) 6wE4j$`aޞ8vnD6 ;if&$~c,'?g씔bNq3p<'GQk_] 2<sר1OCE4G\faa[g\@}2}X Z2Wyʟ} ջ+J:~llC8k /PqOK ,r#USmiTR˙hhl`#!QuGuyDot3=Qc{Jw9pT" SRp@w[I.tac}/F|ݦjU O#cgȄH,OPKYI{{ 8[}Ձ| Ā '#K/wN5K'~(̌]e򶺎U +ɆN4Tq@3}z=-X9ôYzsN]'U9tOOk]"'!zVm9r,1]_.&w+tR=}>8RE*Ln0!}as,iS/ Uџ/x C7`~F]eZ֜X;f1ȧE (1 ]Y̰oЬ6@ )ˮ6uqAEخw +yY,j7i" +.9 |:I0':(hf.0aݱ8 h".sf +,7)OX-Z oPeG0\/zG"W0vקcd:f,rdWy&qyZcBo [>>AHq<hbג1 +!XnWE۰T]P/u"v}5/^kkNTa%uKWJ0c]o<m5ΣV?b hf?DtQ(NNWXR݁@5!-VAR WT߿mԞJe:wh~ZZl8G}CfLjvPgY*M#էKa)Qu*EAҏ{oky~&W81$:""y5ztTFdq=.$8F2 +[ s|LqX PfVi&`0fETY &+ [X_cyԂUv|{ƳABK8p{N'wg(o=+E +#m=z o !&d& Nb_Ā~\~M5,yEWpPkzOG=@=qUuhG- گ~׳ҁ$$R ҬWR}M"}q&REg9iy&ѩiHʉ-C[[!0?*T>fhtlbp?uo퍨lB13{Gs땧MD=@o.N{H +Tl`~Vqc91o}*,mYf_޳|@di{^"Q :gq2::I YepV3RZL'2V7#GXE}nFʼne#kZL۱hy-$:}/{&[{5Jin+~PPk.Qr( Gn*e_٩^1Z_5Qa{n#2JSpNG7TZRft Y.N9|̨׀$E%Ο{7"DP+7ТT裹.< Q-MZ眅KM .6~x)q=emׇg& +67&#X/In1dܜG7(^eקvDɈ NF!mp(GĢ*pzU _dcUO_#~$w9PW Fq Iб{:b[o| NjXOgxycz3/i["%!/4KeV}9tHqYGZͬEJL3b)c;Q_T:/H֧5p]iyF90\>d6 Ϋg6n/&@UyfD.QxT24'U^֔u{Tq~P)qM$tS:@c .%x-̕҈VCP;̸c]Cg0 패Jǎ:Cc=hiGDG{3N &0xU/`Oy[O}k˨ ,z^Z}y,uqQ)E4  +L]bz *_ļ>t9{z`)pZhaE.>6G6{ IqB[Z2W5("A}$3Įu0zzOYvL_0>+P-.lIf@˓ϰny>+p~_ + +NU%x+|Oj !/->[噺f nZًv,o yg%h"(%Hm ;0iiT-A%i-o3\,؀kO-[8;Hs7~ 3]WҊ8E_S HDeu(>~;+=17{^&[#c\G3-gAoO ]VHY22{(cWӊEfSq_QL/Q"G`Na/X} +KG 5)iExCH\Ji%:ML-LΝ/Fo e MSvĻ87W_j" ǵD#Rb}¹:$T=y*3KV~#M}F[dZh*W + Ԋ䚡냳jCC 0HEX!{K=4Aٲus3܈nKq8Rˍ gֽ4~}l: DݧIΔ7k!3R. +fMA>-s%Ƴ@Bˬ1rbh'I,ŦS&taIu?@= W ]QjLM6N+7fTPTVS wG a d tY+}!/T#om,'׋);zLtЬy`r{^?y0rpf#e%B1'pm+mK 8n/?g-2y↥DAWjՐLtZW,0aĎ-~%H?) %n_L輂oF9y xmbq/8zI$dVzMAb9Y$J$L,Rcdr܄lN)y;%rhY +O + Ti D\@-=qHe2Z`\d_hJVT6ˊ62f$k@"N + yeU>Q;G9Z ؖ8[0#hSSsߐSKMN!|&rVŏMki/wyd~p"0' 'c_Ѵنqm65!&Fr)J'_Au9I%jJ_"65L=gHr_C++T* .`wwITZ?U懧%e9T +M3T47*u3+~|%(|Tmoz"K4ϯE =_֦ +c\/==zmK%介 @=`;[S@$>K d/.maCݿ5Z7k!k8+y-&p1UUGǜs/}ڣ(Sm', 'g0 n7 +:ƭUFLjȞ\h%r/j.!xo;d֑oAaEvivT6|8%hg fZ4zi^)¶T F2=D؆ſpq%gm=/"^Z7~Z>F Ά+-nrm[T/و4D|s(Ǚ*z߰Я2MD:QLrl7FŃQT7ub=I?]#ޯG1iӼbJ&OܗewBTqZizg ұWkb dI:Q@MC֮FK-ZuyrPy~B_K0͈щz '_'}x=JPq7@srljf%#uAem#AC/]ŪeMtR,6# DrAkMKІMT +x9w돾lwC }o9[ +/ Dz<`tH?h{=w޻ƒ/t46.`;~7y/"(f+-J%wx-iwe05JdUѾ.;si8,+G*e7Zj ϟ>Y/[kKJ1*Y/[MJkQ;,PluY14$Het;]Gji'P}#ּB˄خn.#D4LRRlF[ +dK7[zxG7\nH&2Hwp"O~c8 +XZETU*+3aB_Pʱ[p0WЗEymPi +''u&O_O#P[!$A1yw>6_o8j2Y*ʃ*xrK듖h1*s[~ ]4 p_!{S{bt6o"L$d6![4bs̡SlF:0ҩ,I|҂T%d(:7_gS;7C R$Fi8KaT.ȬAOĄ5kǞ~sn.&ԭq! /06Ģ`R~xFI?F~/QKaA®O[Y #n1'IEhqI"45 >F3t޲;'WIa8}/`ܒ 5n[ش3u1l2{Zt\8a .WT$ NFlQjMMP]ݡ px2>冎s7zݩ;tHHUHK;*K0ehlLg'$Ԁy"a(lw"|V;̠鬷Z6?FBxۧW"HTA)4Twto?{4? ro)ITQKis"ma* ?Z\CEzav;qQoS*XSo&G+ +7[>s%>] NO,c{Gطbͨ*PnjƃYƒLӫLᏂb8ԛ~>L@v>.8 ֈ::.7YHKwF9Z9b~lnnV|U V/tH% \t̨73g&Ȏb8h-\3ra[0~{b*&gܳ͠ ֩%T !(&:;lD/fnaZ.M'ʼA>p1- r%PO?s @@,?Ogh`̟E6>)%u%@E@,UVob_[won,WylXe%@|{3.D!oZkVE;L EE[Tu9[?k%ts +.)8o+.e֒}Pcփs);gYO +&.HU8.5Q˂pBϴ2$Zϩq:g{@|U!00œ})8al@91Y||C77/Hϙ6O:VtM{?Gp@K pIb'FZ ڲq;~޺be:9yWDŽXTDzܣ;'-ZwkmF|{$~], BՁ#A?zKUJTh":eI'}ˁu#積t(m.mƘG;$l?H-۔#+%۲%@g5}_nl@뇶dփgZך3E88jE8ܞLA8H2#SowOu}3AwqD!i nMv+2|9ҹQߎ$ +ѵI#<@JYisWV̶h ŎއVXϑ S +=`ptIKaBrHuFJkG3{B2Q +&z,(UJNj /d,py\g5~Vv@t)Lag+7ut|c(>1_kW"ZӼQI'~~0a{GVKAten^hxCrrQrJukb.PJt錯,S:= +bӃ;o1{A VRAu۳UJGv yݑޚ_?6Kjg^|j$M 63_?UBj iw =S~)v#&9%ղŏrW!5$:..j\ `Jmk@>8"ѕkQrض\0bWs +XD`>:w7gat^L3lHT$N8Um.fR6E1@j]aNNk̓y ry&o KeL 3sCG>h?iT' +F7Ns,/UEJANݦS"w{xb0Et/t吇3n?KaF֫K O;/#g= 5ME;er@ez4ۗWRr*Ϝ{,L|=ФqfTwKS=s`/,V0UTӱE5`Oh(rbmH2tT+ +W"x+?}MjjtuEǽYlrMA Ճ!x@;a+\=脇k6QF:?9AuQ!FyAԿ&FȽ9dq,@!@ɟ&vO]i8~8,?9z#2@U^v:bf8=t'B?p=/ _׌G;ul!b2 AC ʂݩXl|`%32 KVdo\>XTlv!b==tS`)}8[wC=KP|[dނ2*j:'-j.l +h/пטaEr ]~ cM r*%\^3C+3a'M +=wC֋kQy$ yK>U,DǠS+ea-{5K52Iw=[PFPB8[E2zGߩdyE …̭N.nV}_~tv@Lto~~ŌEOʫ&"wfEP*̡x7.qwvަ<rMrB1v i$.L3"؅A0 AJ{q?K!24\Q_;bq0  z>A+\ͪCjD=A ҝ1tME|H1/UĊ'~vYWWKsp /R"N+H Zx׺9p"O]w$+#;tHK-OF +YV(N6| +ʏsEq\,hΦzp1X&RȧepLF+/\ꚸOv5j|POЅEFKёNLmoZ+N 1=4әpe9I!c[́ +>{N-8YRN |*jLoClGKuDhZeo#G{i)}9 J'6GqU(@ӟ@AWWMrKf=Xv1,\a.BZp;N3ݥ$gno?f>qS"abg%9:XB(ܣDBz*5OϏ0U\T8j*kᦒsU}pu_6,cmaEޚn։p RwHgg`0KJg7 endstream endobj 3200 0 obj <> endobj 3201 0 obj <> endobj 3202 0 obj <> endobj 3193 0 obj <>stream +HWioG+&Ucm-V@ň\Gfi!6 Q:_RIʈ:YS$zM]Rz(Yo_z +JY3.`]ʚiIuO֜*"guuGͪ7~{hw?T'Lu}e5ׄՊQ\W1_U#|Ѳ&d-tD 9#BPå |:% 75j@0'Bah}X[ NyuDε%Fo[1g2ew~M|X qfNΈY0fj>Vf+*&Wk[E]%Ol]}~G0cCݿ~?}x_M`RnUtGV<ܫP~+GW;2[gLj,S5l儇J03n߮%B \+>^ b3/!!7P5߶;&EӶ{6]hr+śR`ƾs-d48_;6_4`%dM> t̸Y: q`)d[{H}2e +Ńb\dXZ  /0>LF/$WTz .Ĭ\Bv,ڜ],J,i؄Dw<p2;V+oX946JK9 +ǐ6!!M)wɜ95g?mwuV4~N|6ߗƀ"1N.7٬82M;nQn-=;1`3, Mޢ$>Najs2Yy/WڧfDmM,Gv2lޅ-b#t-l59 +䟥b7dQyZA!GOwoI @yƪk#R'MG~+_1QK`c`ެVt$ %b3h"I]h_ Zgx~F{)J7vC8Vԓ]LOofFNL 3Xr18j +O$uʼ6"`ruw~=C+S>z߸ҁ],yy>stream +0 U@&=p UBoK4L*g++Y׊DKyPF$Ŵ>CUgK߄?|ݿ ^?r0$tTHҭ䌋ain\(Rڞm;2Kh9PRf3 1T.>5(5%Sa#k&rExQӡ'.3g؟oćb7w^d + QWixàfK7ҹE{3)wDģ-ʹ4m[g>:, hMWW~l!}DN.%] `FUU*՘!t?m总GDA_j*lXÆ"@Stbvך],zb> +(P@?MHYKv!f헪`G%(p{:T߫>$j$8bVid&dMRҋƟUyJ#wg_feTbp|G!i%=N{uD ! ݭX FXT(?AVKUU]Z#%nR !Lͺ,J +5om/>&na_~[1 0iwQ'PY.+qҝf?)|Wn[yHeA\F +9RXdOccw~#I|__+n?]>&fY`9x1،Ps6#` f9LY'F+I+(Njy"vٺv \2TDU!Afd6qU +wn46 ީY$1kx,wsKb̙YO^]O4|)3Zj;,eU^ ql̈́ ÊW7B$.W~xHxqo!YX(Fxg`Æq'k㟴.`08?퓓H0JB!Pg(c43g$ʻ9*rNVI +܂י?G9lLbzAkKm ͥ@+NO,E M!2M㹺#e=3]eAt<:w,U=VF9gO_d[8)(+fl_'iƹR I9b5Dy;.g\  %|y<#T9 SՂCiQtgj*K0Q9j+MuH<~?Ncqm{ˀb:~KaZ!W.çDܭ=Phщ- fEbcZ9y5k. YJ $Q'[' +]\< +{/O6^P.2lnZOx9:L̫Xjv8Ng-]I?N9Gۀ+J@y̮mp9AVq^ܱա{ bYRu?6X޶H:1 5΋^igI ;}s'%ٸGʥmN4~^Ftҩ$ EdZtC)jup?Or'hxIUxy*>5ٔ:7T_^;ȲbYVLƅ"[_e/2ͨi+0҇CVL^A'r>FvEM(IR +l{ [y(Oק@U5pO u8a!XPph-&E\yrw$X9K]^GQo iWp VGM K5OspL2kyٙHC40ccE@Sxꞙb꯮qōx0cv.n$ڠЊ_D%Gy2ȗT,@$ <4gaRWN5*K;B9r0;UsxZ։" PpdJ.:s6x]&YjpPnvXT+LН];^Z<މpokع;[J9&Ar޶~l`Gkh^9l1oyӳ)xerg" M+b=!e|?rvܴD=?vND_MB]5luVyj+ΝR9ԃfP/Expm,Wܫ>7@>!|u7㥩P"B9ʾr&‰Edd% q~!/uTQU? +vOR=Ia6{#pfB%^{z3 dQՠc26, dӗil=K+>'ÌOH]Ҏ1I|T#X:7-crιJ2Dci +~2N)M tMJ6)ҞڽϦK8eV'jmV~\FMb=Ц>8giڐ..?:1.mۥb:b%S + jT?\1 &$6NPSZDlKy4TG^݀Hq9vx4ytq5&+>Ly̡FZ F&k4Bj]4X}M[m$BfҊ (qFϿ)"7# IS)6l6 +U DSs2^Rꝷi6S~j.^ f-pmi@ mv1yVrJ-ABjimxpAi`hdl ~i*?$"H=R4XJA?CbsiǵtMjg0H}^brg5RHL\0UJ-gl€[OA~DA~?'삪ܣJ?Xªjlepݴ>ygz'm(s1O7LaArMyLQ;,I +uU-N vp`vH/+q!*\kn2RμF&G!S<# B__ڑ%Y%FT 6V1W!Apc! t| M2S=< S+=sZ")+DR + GgViQԷ&2ȄLrᓜêkAYȨ6tC5jz} h=8i3J՛Ӹ* @S|B,ggӇ0=+eM'$ef*A0 +?,)V1E׵i.`'0s馦?%1 LkLb!s)Zv2CS9mc˨PcjzhNq (к+S㽩wFWG"xJܳV;T]ˡolaSІl5;8-*뉪ƮU>cbjSJR?7܌~ߵdAaLx + +3;7Br{x T>jXyҿ `<ב!飷*!r퀮x\B*uAܰ,qί<0I#V )22TʹN`.BxUL:@}\&֠W!GnS4c֯HԡK\w +9$RbW`&N=Ou_Q҉TcĘNKv ˷4ѥ ,:l9ύs]uK~SAqxڳ}gx:<\wD㌵lʸ^Tʺ&H4ň9 +&noK ?u{ۖmPe9D b(T&|͘џ \]T彞2 !Lv;uQ:bC-e(!c7ڈ@Tk¸JΑO8&{kG#{ %A)IP݈:э :s&\OD4*TXnߝR:KQcX)8v4mF7pEMC[iը׷zK ;z\q5$w+8RnRR-4L=%nDMpգaų8M(1mD]yauG!T;Fidfsۥ4 + &"z`^H27ppBi)Ӧ'.lIh >kh4sV?a6Ψ,l# ~~ +HlQFA9*{f7sĿJyZ"6 fa|$+X$ <7u{P^ME4K^G+u$wPC 5^uaG0.oϖΜX 㩇r'r_0$,Ǯj.ė^nˆTd}}-~PqwJY>"pP1Cp!b?56?/tӱTë^% "fյK{TmĥPJiV>EVw6uuSp ׂ`ZZf{_y\#]0MY6#A~_Y w(8˝ƫJpa2V . }O"v +9 kh"9WFg1{( 20)i%fi"ljhGIi\&$εb@9+}AQsMMhpK"y(Yp2#K_I cޭ ʢ*Z&X01&Ļ0nqTE_鳮@ h\Zۼ|aK +RkHIHro?#lemUm(djBh'J -^W ;XƗYymlQ{;|̈́lU1UqnL٭ + DM/4\Qd k9,n7%Yg(ן*z+, /~1 %QҦ?Tue/Br_9FZ&`itì` YeVW? #i\{E9N8@B +¯8$֥oqz&Bw +OHƲ1NƏBN?MeT~h:R\8RoW^[o54L3?rER4I!r B_^W+W}^R)XaQtPtnkҮrKuN$쿌Ml1-\7 +XclHecAݹ ¸ R\xf275sT/Rgߎ/1N Ts -2ziXGBԼ7{qh!35(7:N i(&nĐ2r\/HK]OncBxyeiq'bQ'wcꙻU2L!+ _] + ;XR6)8?LIbR+u?c|}OtȭB|Y#y7؈`:?l,EybcHdXgZW bV8V3w њL9F^Χ$%93>Yk쟜(9,tE{($O'x2E gz{KDR[gR.ٜ ~(V…Xj +\RR0">~)aaój Z6IzI>GߖuF˶مF 6j` fn]_Z}X:dSםqYR|^w["I_IX҄}~^U 5vFKTؼߍf/6}xe%$Y_/$qt.wÄɬۦ.;-] l+;"R!r%=< I*.m 3©yɉ3 _m7 =Fh''Kn  +i {@DH5C%u'ko%Q~eFt)GƢk1,K^*Zp*n1 K'*#=wq;/m|f!*չ9Bi_T)пOĸ#5^B-C%+!҄ +z `*nⲐ;.Gۀ"٤𞰘6؞eӁ /j,&w (KwY:9S]N:k}>$a]}SkG8F4Tf2)ZIy6[5?HQ$ YK|];[ /,qO +v,A:Z}>T@y u Nh:]x`z1QDtǣ +>GViCoy[n5ax $>NfN]pi9v 6w83RJŇo+5)FNGk :^drԥR%ZUbXD{uhkFkd13 %{Fhaڶ; +m2i'ڥ>k0QHT6'}]v[GIźA ;q~jK `g-=f=ZmVS4E~unA=Y0޾ +#T-Ad|<}klC@6%a\_[X5Mk +vn Cta~i v=1Rsٔ>ׯ;3!4;8$$>*y lH2UMS8+K54SZwt)%#Qk +2ܺ8w(=Bfh%{,Ͷ] V w݋61& 2EEei̩wIZ~{,CB79ɬ9c'cb3fM*ߦ"K+8v :xqED?fKޭ':!iWJeʝ<Ҥ%i̊"PV)/2Vsӿb؜ dcy+*K "L] 쭡,R3#lTgLsg@$'؇ے#"9>3Ų>H'S9E-&='|i ^x; nªkQC)[D}wUEW}"W_OXP ^Kǵ.m=M\3U:܋߁}'系GN@r]᧒uK~df!srbE1X|~RLDCWڍ\c. уG SE88&O#\N(1]@DәP6̋ZNussM6װ-gy {oṋjtW }K^<&UGjKr:܄?6ҸB?a%iZ&ު6OgʒT\\ƖХ]UVOWj*yiѹ'kֺSc&TĽj|òa~HHVր"_.]?LW{4fCN>5pw!kؚ[%)—7#|p#2Qȷ*hh KP; `Ds:|v2c݈^.a6w-fiڃJr* +ybdryP906*kxcniMoȳLX9Ucz ZZJRr(oT)!qh$ s.w:zdpXc _ c'iXP(KO)`Z_ZqgD_VW"d݅U?EXv t"a'DLNIa<8UւE4۴AвMJB@‹zQAPYNX<7MuMֿBc^1{CT&>܄`0lL]>bȺW$Jzg2$#IϞbKQY-Ȳ9wڑPuWH=QqNf1.< \؝Q@à>I'Нs#aಇXu9OrJ gԚP&t&'7&bP5uדqJQQhreck&jkǠ<߷ONn" (o]!i*3-̈Zl5&M?]9mSfvVm/:6iն(]q+0 \q pjgyʁCAMVp[i|"$t +wɾe(^-+A }]jpw cL8@ hVzJ s`؋ԱKjC g-̸7S\bGzmɊGkm؅pQXaN 铂&ՠ(&PCұkfnE(!`I NFRs ׵nՂyܗF xv7ul|f}#(R7V/j90\+@rV~M*@mgqŵ X._lI תX5CFA '9ceOFO2u {UhqP^'t{jn)ۯT#da\5 4mK-l` J\!hS.O^ECg[2'mRĢ׽W6ٍ"d14¹7g0ӽQ˵+vQa?sf*5:|q6r Ge$sHqiwvyݶ^ƇLeEfԭJpմcbx zM>J,u_ye /(*H-B'WRd_:9U/z KK8.pc-Q$tx6|9z=#4 # e}̤%" +E*_ftPPw#+Du D97+旌lڈ"Bg|>~hEdUdء-ы4ZZD1+sd" å:)MSߖeɳ) qYiafx i)aN; C6Zk1 GicX :} +I/_&: 5OdQR-8 +D=4?}IH }Kt,9t5Y'[ 10u^X>d@6nمVEN)%%AkK4ߘEk>"3/մn_E̅T =(-)6O0mFQŁSB-HYZ 3eKN+F6PDáի,EӶ":20 iף*+alaB$x'0F͜tT9Ŷ<%PKnl\gS:縇iR̵|TDupE^K~Q#:Hw/(XL;pa\n=V$ߒ4"3nn ss Ākյ*RêaFIg,kևIH8t>q*(?<BdJGqEϣ2*<CvMK2|&UB^%}\ʖMdu^r\GMsW0aĔ5EK)£=]_4(H%92uȑI# >k ٵ6CGeFm>N`)Y*ţTBoAŻa"Ru)D;{kW`4eJ|wKǑ$"^ Q$xx }|( _h +ߜ<YrjIǭ`/팝ns V(/a3}M&Ȱ}xw͏Aip֨߁ {R-Ƴ̍}Ʀ^Y_DSFjBP'2^ϖw+,cHqR$Jٗ]) @zѬY7[@ &f/ 1xbQ(Z,ؑo;ʋLEZAm.(IVVk:&7g8lkOSSArǰ cofy$j~f ܇[Xx8rb4DdSy+mpdV= nN"0@Z&)$+< IۨqÏ U3u*!à޼b +w] jEځmlX>֭_yj*hes$\Jna(9(:~m6M%m Z,g6bn+1vV(?RPևږ\UL)?J7'n% mb¤n$E_j4)晙nuaφذ"Hsӻq8aĸ1 >Z@'SG`y#)4mjj4Д\YƲVR-m$&.$^}RQ$0Θ iH, d9T6e1ܬ@.M@!m.AE@T UV'࡯xyT'$2ߚ#TV 0zVkW-ּ`T k*'i*+%.,>vB+mJ0o'<)ʙhj(K80h„ !SA@ M%E*! əʃ/LoC-{\u\ hLyeX"" fYgI{f 4MǁFc!ԭ9%Ymb 9D/[7?/k}!짲4D:!L;;DGqqO8Χ-2X;%6ȉ5.=aga쫠e7%6o ZQ- +eckϟK]_ҿVy}cc.㚦ƚ>SF.4tI)ޯ,~ ss6()Y'Jp$ݥPBoEH% ExbKv/CKL8/`"dN8}U0eED#tbG =`/ʶ-10G ˄ 9?1gYR=~ ! Op I51԰F +2(BBzΦr5[<2 tUٖxp3P ~:^3h58k81К4&i+^_aQڀT5)ĕOAPpw?Y"nb[=x$?{?I^|vf+[MBۺ} !̳.]f8 +|+n.8+~ +< |m/r\ Tk*^uB^W:GO'ElLߝ GRaQtHС mKn[Hq8gB0Q<+۩bvdx/y?],=(< *aoP޸CN]$%bqPE ~TqxU`7!+\,%TWt~g Q!J m#8.v B"DA$ԗWVH:S$)xHŶ=P$8Ka[=Jӹpu.3Z؇Vjk L9q[ϭY/yőg/X+vA>Js%oM-{E'$#l.8s݇!b?5ZD dl}!"-\|;_'^.`ȼVZ#):g`,*y +[zLML ڂ + +~>}Ge> endobj 3195 0 obj <> endobj 3196 0 obj <> endobj 3197 0 obj <> endobj 3187 0 obj <>stream +HWmo_"z_$-ǩ +M#EařrpʅNq/w?AB(<>*bHi> +5Q!w2?"QnR}9ɻ^VtX'R,DLh3wm9k<8\{L"8||\g +@#T[O*eSճ ,6}c4z7gGfTO'eC qG1j uELjA\+e_Yg005V#Z/uQ&SQFBxEr-HIsmE0YTSſgCC(K`#M" +Gcusqu,Aȅ&2|kmi#5̗Mӎ[\G-?]|N)OOAg7 0opDG9Bs!_WSC9+ [ٓ f P mp!wa!`g }v9aj|ut"$`a^=;8&q1 b*(>m;w)mxxu 0!blP~UPM$u]]٪3a! :m߻j=)'=٥E?JdpSnzhbku۶MoCyҵ47Ŧ hN&]wy:VH:e1ۼnI UՓ15ܴۇy;v>MRn6;* F +aBa7M^o?WD z!&ReϏɃ;z[*=DoW):T&YZE9[n{)G"FD4,by"iͶE4VG&"E5|ŕ'S&L*<(r*usR4y6OFnFQcj; Pmͷe1Gk>>s-hj'!u]hc%HEd:dlm=-U7<pf 5 icT˼ .!.8*5a0{u˜Nݭ$ؤ4PN"6k|i(6gK*:$\)lx|g(( ϿM!$FpSxpW%bZyj1;5ܚPv +T;󇋧CKS#}{|wY$!j,ap@氒P%8 T l>^sDW;' d} ۡ7t +y܎ +Daif *WWIWϮw>@ V$AK:”kGk$4"i]-g[UTfJC)"h(PJ7T{w{A~Pa )<H%oӑFrFR&Z&Es +m]u6;V:˴܊:?8ztw]?[Ye$2nJxxy/)Zpp +GW:i.Bp;g~>j֌#b[0.cڨFE~V>tHr ;7M5KF:5ʞ +<p߷Kw>*G鰳Bh4U}Y,QMprؖ,VY|h( e`` 0#VIGdZ߻s9QDTy5G'x$(f:@AҒ +r(Xg`^"aMv29*&<,L?/\G2sCp?gL"IZ.G:DϹ"Tuf{xn+,!dYO#ˣo*G+ ˦X/džI9NCz_,TBg^~cfۺYy(vZQ,޷OE縥LYOsqbm1fs^#oN0'UX_/(9 mϖYc'vݭ'H?}G}{0&P":&4*J_fg;/Qr0N + EA{n$~Q,dI=ӎgUdENUIcfuQmz{Ԏ?rVV,|| nywN4| \ +"b:w R1:T,,ӊ\ñ21-GM_kӢPbxjwն]$, >Tr1ƞD *ԓexLrbX2/B{P΁DaDm|T%〛-:GwI$_/H_XoMOSɁR7ؔa<)x xc6T6F*o'gLD.aܶ=-%1a$4F͟L>m05apupmaUkA)NYJjRU& DBCLMcf<4/ `Cj +RYZg~C.dB 2fKde6tJ^w,SaBjI=6",2: ݁ \Wc%Vqrk7AnOjJ&jF|C),<4 dSn8 dDIt͔áQ@˕AA?Ђ)A:]"B)ar5y(8 4WLw'A@[8}6@_H̳!;R,cYDzƄEp|A0ʌ}~_yb<郦f<=z!L#u}ҴT߹ ذL$w :Nߤ˹k us?$g킾tn)0)+ݹxPie61,eM'| +^7&N R,A&@Z73EnurJI"2ڲ<۫N۰uܣ˩UyneL*X(mL/Fϙ.Z:þov;Q`M Yboq{ņ"96lQ]j߶%"M-eh6,PWm- +]A)aq^_pɓr2[Ja`$@kMJL$9~Rsd^frv:61j-3 s iF¤4.8D +oS)R&h65N8qBјc^ȵ:sa6C[CgL:x0bwI$)B +R;2L㩶f~_O>ls92v endstream endobj 3192 0 obj <>stream +0 U@&] UsA:`[r*'d7- +<^3)CO!@;ﶺd-+pygT}`FYOx<`yuS{D7@||6׳/E-INT:rlkw^c(۳ ~Ab-4M[5/+vv?L[yN(/@*\k%ʑ+9kմb21 , 7seH;mp>~4\ɞ1D9Y5F3DzM A8&pNkK1^#jrɸVRYG=KBm +?pದP)S~+_tA`wr^ +q +2|Ta8n=ע9DUbGJEz+O_),q{Q+͵K{\v2R>K++9^:D|wALW˝%_@3Ԉsjqb+Lj7E5'8P|4b{1ෝDc}4Ob= ðE7@@TCݰQ_#[rS ;L +I_>_BOk<tT oXHXT#^ͅ,<q`DrBn">0_/aR(5{(9(3D Fv+Z +b.Ijw$fiؙ /.<"J.&jU(oi@VSF? t)[ (H5}'x׵Fi RyŚh/D%eҊ*G#HųT)N&T9[L l LCho\!|b8cGP*'kh-Q"N0hٻ2E_R>r' +Œڱʐi: I0oahi[EX'G<}&Ym>[6QW-v<. UZI^%}<24,)V"Ÿn +sDӑ͝>/v_fd7jO(\SQ[e +(2biSςd64f״D&nc=sŏZ7p3n~X,ڄӓPYd*ȧl)QzNxDUa8ryC{ #0 rOI&%݌aG?sGɭ7҄_`3kU]tУ5zJՠwrr9٠05HCQ3LѯzC>㭭n_}W 'M=,rFQbWKNjG̃[fz.:]I,ajcSI\ˎXRY|)я05> M+>1%h\y,vdeK٦Q[^$$=ˈ-:v\˩p\~_eHt2  +F D鏏Xکh;hT&P)7r/WՏsd]xTQWM«*H 0G\ v"( +RN;H0 UuD*&`BPç,U׺nc2%([R@/1<38Jթp^Z#h-Z,(5WsE%7jG@[Cݪ1nc'+z| +"n0 6jɜ+iEJ$|t/?\K.ɻ ,vTޔߦ@:^y!$Wj9#ߋP,љɑ'e T +:3d,i?p*ȫ3z'ͅ,`Dˉaw7޶q #@wx>_UA&)湈ɽYQ0-m}Mǃq1/B_(QS5[પPz叭ֲBr%]L&4^M0nhC@d18 +OO4}4 Ve}([ SqZ;Y=A? B^^щ,x^h[ Os/w->{^ -!HPny*qmNPr6L՜ +-Li+7R$tlЫMt 5KHq $e˜؇Dt [~p`^z5Y XxHu6䂇ԇ/[ p'j:? |>89 E#L QyA$mƸ&*0*DJ2B X첊TQ?_; LuDL-,)2%}V/UXcxLF!Z<7I 4&D4aRՖ>IQ *z>B%if}DhU1 !$o0<~RV;ӌC5"Qs8""EArn:^8!z񌧺cc+Nܭ Uwg4nU3t "e v(14難)'+⩣ ^@s,56;E^ˀdaOɑԢbT"yޖooJdBcwmщ>.3*MX>_TC1]2a.{ 3`+$iw :N\Z 9+2 a^߾ka Ki&Xʌ IuTK_Nca;e|[jp?P$tĹ3a^:OŒ=]ҹݹӣÅaSsش ^.Alzʆvyݡ9DH}+Xl +X#%Ljp0l*R%zҎG1;lN\eUrؕTqԅXF"]eɨ^d[ dx_qGT,\E1͹F|):$*pEv +`mdg#=F֨S3 }恹@F-ȶ>Jv&^ʐpK(҇!ӱ[Ҟ^}AJ$_ۂQX ʱ3[0*c٫DpzoMW4δv#nhS^)˄1MIb^+S(UgL|aE>l?[H:i}ge\W +ua wUhlF`6qD}pJBuCLg]k ~4]!NSeP~ "G4Mv_#P{at4>5A/"'qӪ"Z9U؂ C*iG<riHa+8..iC|zaj_GXHu慰IB~޸FZo-?vPMd\n3#x}1DPYnNF T@$!1XȎ0^'ʙX$Ol/H-bF +#)eѽ $ŧg;f.@uۈ3X>kfw z2[hb`9wa<uһߖf"*:gHrU?5~ql61Qt& AW< cOIERHA$r0f!*M*0O Mt,;9 Ta6ԥ\6fHJXS +c>qWwkj:kAˬ6vdv>"gF`֣8xCW0zZG;QyKf=Do7JNQZsKqN'Z<7c|>.z}V(6g+ \퍭b6]Z܄i%Cf1D[Q,ަ'M9xYuf2-x]?V ?~`t{ѱt.iwQ՝#DF{-b*&Xr{1PV'Þ ussG -T<&m_vqdIw׬e<@QMNO5&qeU#ˉe|QSçR/riWx<ݰ_ +8XVXpZbA,ԀŃϮ(čNV Aw e/z^@FmwZqm}׶6֔uxrD$YZˁ~;R!(=ePA`VZ/t()?O3ثz(2ߕ6{,v/YMݺ&u7'Y̪gG꾳0"|cR@Pic +\D '(w?ڕ]Uy$AhM{~1׋Tw^ٔ"` 4yS|U)hETT3~̽Ar谵|UmsG{&eWx$_)֋9Ri cPK%̘b,|u';o $1ó(;a +!olQ,8d.Fԫ,C#AŲDlH8v+F{faIY繍y-o#a1y>0Ne +AtWKr)@ +oW3W6,(&>S]]ҾV5s>T,`sIUkrۄ$sʟsl +TMg6w1Iٴ_ɛti1vo®#( f$\(I q7OvcW=mG ,;}6`u>, TGQ\Euu8= /Qt%&Vj<(PnZO8"bbQփ}+R(8S%a. 2aa {e*4Y' 8`Gg ]^%a9*@i Rh7.N7S +oqܮ8(½}!I ,5m5З1~B&M@#]`!AJ0›gĤ[U + PuiT }|,a;}}*h*r$x3:{j8m\ZB=q#b1r!>r,K͛hme; =(v\\^QzrBɀ^@q8/9isT +858cl*$%\?5|C$USEu[j#U>6܂7)Z{:x=ul8^ByZ#]\x\ 's$X"k +H4.>[?Lƹǘ^HOOp#Vu²;čbj >,BY!E#b.^5W ao}0p7DχsQڰzEhإ&q2UI-Uye'#R('GZWJCnI'8w a19b;qѻa%-P쇎g-sg%hg/E[nqF^p NRڇl٧,G"nq-:/6E۶iv#XR2 3܉5: Qi×iՅjGbg؂KRdO9I_:i_dqaJ8>W&7*hċhpM +켿8nFc1Uu0}%Ai51^=]ar[\qx籔&k7+(kFg=uOb^KU~D3&p{3)8lgG%֐8~0Z#MJ`hT` * )LL٭ʔK?gD=ڗQ3)aK0|!ozQs +2urۺX5M&1d Cy@k'|rSٿg^5ef0u{gQ(7N #3lЁA=RRT+mY C቎).#]] d'@ީ58R BjߚJ`9#6ZoA_ia.S9(V0 EF \K- V0i f~ʄ%}Ei$Wxz~ = #>_?Ԇ5K Ƶ!ʖA+1^I[3\BŁj:6M|aZ=8v)z6f21tax 4z:VL9)\#CO af vHR~HMU w{ՙv@ϟA@ דxƍP} \j,h/_gx5tL0o0$^@-1v$)\^-teZ&"NM۹@{c*(N xlg#/-6T#tꖭWgo0Ov ƢU qF[,_=Rl(F"# $5aAѯ˫žW 8BnM0nK਄GxQpVDxv84u'9^`Z t/伶 4=%·xR ˝{U\60a0@Z`&B6{WuxSRxWE.u>d W/ +ţlO4@_rrshʉ>߄SJGvY>wYj4Q@xiGUeQRjMz\A5 iGP ©LCi'x8ΡA &t9{z aI~ns*Ȃ Q-6AμxY=E[p!BƂ]ot-%C30MzH.`s%[߉]>)غW7SʲڼN⬞W+J-bw?ޖ)˘p,V !$ &#u6}ыߨW'A!ػsYsTh05r p: +TfEwve0}Pݣ$Yu]ߐ_@@H eh*xG8z$T-A@2b`)9/Ϫ^,H5Ǡ}E93+H[ZTyb:WW|6=p>d&"QsȶT٬?l MjbiOY"JB[Ӂ[3K|QBu̱&p:_Osv"KB_ oZĿ#llEH7y'$vɤ>ÝoypAuTQ]Z70s5*35Si9vT" n R2D{=B!*6Â(ߗ\M/K!hUdc 6[ЃD +nqҕqh_=~G:{HcJ2q.<qmxR;k)S[ ÚyWI]}Q?.meQImmcЮq?~ (jg0 L"R;քLM~gV/D2ksE\[uDZy,%vJ*iqf;LE+H &ʖOqZdo3JSB:`En*L6sLJǦY`TO<Mqrg92Th=Mj>"!^QP:gRҬI`VڞL`G~tM1]xEՐK27UiЅ/J#S!DT?نB~,;g걢lـjG5<7nEJcb!„'9(^Jm^ qcN@+"/1 +m(-_V~i+iP9Yĉ1i{uXx#RF [g93n߮}=D.脷r7t3N[< Nu|.9~^!Ctu@uS⴮S ՠrq8w9w!7"_?[K\ೀ=;y$lL9-.fϸa-݂NVݙ,*y־9IU[ +&U'8hJ6dR$f$4.5sZϨ@nV܍l}<σ䗟A -69E1BŜ/\4G]F0j aku(VP΅> C쉩tpYj2 !5A*A[&](47ܮ|$u >%.YQTj8[wZEXb/R!juXbrщx/@3lL0;9^V)V^U=4w/f+u s֋}.1XH4EoA=iMr݁ZLn (+8lJ=8>2QS2LMꢲ8FXeO>РժiCnd]7gx/ tzڎ+n~iF24=y>J6mNFAa Dx|y]%T6;^W`ĶHMA觙{TLmjX^ƹ9q䰘w:Sn9 +)S g_<\p}NeA +c2S?"9i4yS[_Ck}YVM!Yf7ݻN<';IZ쟥W&8gk\G)oj =nYL=7'{̽]|U(2t'*UD`h3GXs\BS!9LbJww:WP$#?"ɀ\N*ȌY5S1rwm(Nw*z&)w\? MB}u`>_yZ8_nL7}g#V';Gz+:B=Wp"/D' +4HCdA + Kشmv +Ŷ"~oBZxrX"ʒM#RJ$bF3SYwiLw7JS|bGG(L F+dzP#_TrI\3| D2zכa `>ŐPw{/n%xb_ℿE=ħ[ˢ[C8朗<34/CPu |m6gݧ̦9Z y=hEAZqW]9⻬qæ=F%;G9p f`_ +iERdBD^-]^[ђW/hOK=HמUT!m^!TM=UrߝܗlS&y2e/o R-H<H0F,ODvd5cmy}Ŋ+ӂyÇWӬ,lղ`v.}֬*Llipwivh .JfB$*-J&t2_+Q=)ܒGc(O̵S_obq̯aINww2F| 5OZn1{/:E:UmѧKd1=OGHJ dQVw@YW!UK.`ʐnɈ JPD|d} +'e[4ԓ:_*c1ML#ToGEȴ<}!MASܓ<OrgKqkfm,Dr$ux|CUB* yN9+yq&; N rg6~yDyu~bY 2Տ)3^lyQS +M2\C:\z;l`1íawѢ?Sm 'ۅ6x +iq]l.T IL'usjn} oJ>BH~\3#̥ ~y#ͳ\9b+A7Ec7M:PR, ΑYETg]Llj9 +f/r|&Q/:{pq'4i; \׈6X?|xT_P$߽bFށ[7; $;-ҶWzlCQ}q\**/8 +\ ~Y/ݪU0%uQ4djNBƧ0p5!1 +2,e^%@c>:K=WE-cS3Վ8vjE B&G!Ho%έejBhgNE>" o  8>keO21h;f޲PQ;jx=bww$Y!J&`8-u!ˤm+a{C_TpU @nbT0Zn6%^l.%;~&3"79'7L/q.S(e+!ʫVGrHS^cBEVH0uUid,+e`*h9[6Awhc!Rl%2) o`1,e@1F@Qc4rsS?c &Q:S6Îζ{|/XmG1_M7͎9='t.:ک^ =DkJo}*EO M7O*9R:Qp3bGcf[pDޗ V*Ҩ]jkš6:d*h 5>;Zz*xs(VS^F݃wfvoC'Y0@&KX6̟a)*[-+kd녛_-rL#z_ aؑMο%I-;{$8hUSCݰ6"Ѱrq B\gUE1C1X$Sݫ/Dz{5UZ+{ed;5ȭ|&D +H두?`Ϯde8_uO =WT*\ݦ4+.+rʨW>4`V?B{MDP`{O\5/W:|xb}Drگ.baVA^}5ZLm9<GEOl/!YsT^RF +ѨA`['8<'VK O#[4åre~6sNu2"q&$)}XFtl1; {x"XӪyV;VF4' .KH8jO^\vL/'۪? wlv}}ecD'ƤOkc;ț!5!g'd+g'i!_H]qxI$s58` ^9%> d*WQc +]hjM0O"-pbalw%+utD )qI'UI3FMpn9&Q< +a.ї!," ؼ{6R]R{9&P>L?04t(%!=~NA/PlPѤwyM"c "HowXJ[߼9%&bFW/7}9l9 dï)Хzʀ-P5pKW8B `T*C\$vn==FBRqy5ounœ.-H՗#|>, 'JDaVtk&86H H_*{{ +Jw)n#tP+Oz_Zg${3/L!1)֥CJ+@Q719ɧb#"{F9`#0@Jv]IdYwp91ڊL|$KtRne=P`)}S\ep)!4&^?y1٢a;wiK/M_PQweLA޺677rZ\Er7k&vONI q,w;iO̖VDW.)~ :Z<AZgU_񾩔(5߉o0,4 Df"j~R 8[uL! xi XRq0jF.3xY̡}YvǏ0ճ\ӷ?y$giaÄ"6"I\(,*D uEwr;ZV^&/gIVPJIA ®7Yʕw^$]1\Ԇ69/hdw|u [:~cҪ˴S;⊳9ϫ3zH韁P4C %30f#^zVy)҄ڶHT$^bi';V?!{x ޣ̯/t#7'B#L 7?vm/F7Z㾧I0VZrs 8IZ`"Z2x/qW`·6^Lh~>>xPk$\ƼwfMlPtMJuKbC\<`hc [?3{d?n?mC14&M1E(tT?&!Rk"PhH,{ã3%ӔKhЩZځҼk"gt6<4>?Rbq+Kf+5?0{dHjlEg;爧aI]uf)<#f".RAbO6qKUE(AτF{P(_EN^<uK?Kb݉uWт6= +Ks"$Ɣډ8nM3{sܔ#L68gGJ4>?A9x 3KcP% \-ю;piέVi|HG`5^OYy*?6׽,*Z_|RsCK$k_\q |f w$cD۠ Mn{tJnfuOyj:ynxŴfqegkyfܓxb1YB]sYP:InefVG7qAݾ- flVG7b}Jm٫+ku륓Ji ,Nv=/H^xv<WS[{; vۨi0%W}!&YY89QW$vW_x-&E.$ց?9K:ew<63ce(ꊴMw./9`rVVw@n0'sɋB?-=U ?K!>N4Hq6SڹBHܚ5]GCciչy?=;#Nj;`m<%]>LpP$ ',MS8n/ +s1-̽Հ7<]yY+fYwUů SxzWUWѢw7KZSȐb"m#q{ ݴt#:1}ͻ*q_CuAOg;Gu8TU|3E#r)p+$ҧ/Gۑ]cR:]_J&0?6H]gS2#T5& ]{=, c]q4-b 39Y+<ʲ> 'aeSH:W$AY ݫ/;2rӎ_V ,^ptK1 n5ܸ'y\@#'grne,j[ybo3!y<(IJxW,7[* (v]BRA?Dsn$!|W  +(RɊKzT`IKҿt=QZ:^,N,\Cw]/8JNH:ޑf8!h4fҝ gQ1\ nO.Y>M6t[ Y0k]ԧ*J bbYS% I/AG3YU^44FpBe CƚFHHJ]l *Y{\zD2ha=T#Kog Y|E]>K`?>W!J58t;!9 _WA,` Fcg"M( N9rӛ#>9=iS4.68ujA(c$&Dz?ՉPF"EN[w cT5w_ ٍ&{I3{4 ysAUn.G໤tּkn(uΉAIˊeuDZEM1Y=騜.˯rnWv*<#_]UjWg%0{ciɠƥcmϑ𩜌xB(0̢X{N{'C ֵtݨ'@̐:ZtK-KDA3YKUdZ4<.xȏ!y0i/φo_^3Mj̣w?: @m!+>cV:o=ȏ8"ri`EZgn}7iߕ'˼feqF} f,2A(l:S'M &eWSՄr $&_u'2-NU{-SAl;%6]cAru.D%(nȉ!D!7`{Xn09\P'X߰]P-]<0.׳4#] +ϱ +~ˉjJ-)aŅY5]v@a 8 DW@|]Z#ձ%կ#rY7x oظ[r٧\,ņ{ifԶ4nڒY+fʄiXfQοB S˜{ _P9bif5QHQJ ax7ݲLzc]C;W XNI( W&n(U%bՄ 5 +p[`Nv#ks*FtDԹ9>dPtҎI}7I+ײb|@gJg@p{#ow]`pO_C |, Jzev ESi:"Q^7m~Hջۊtѕ6 ~ܚ\ +eAnc:VXr[r1Yf.noW=Vjz*NT4\F`6RV{$rTpF*.𚀾iY_ څreΕP@T>s('l\mQ}Q=o51nƴA8޿r #[ \z6 ;!T&$@ GZXee?Old^ ڷ$6&1[Ym~f¢F^?JCC2&4@`'_!.ӍmZ6lGJ ќ֟mn|AdljF)҃fꮅgsvEG]zC@آ62A!H:Gt& +21H7ʻ^TPej/``[uá/ EHe8 ?d|osK.u `w=o!=):;ވWۣ'7*nWgWib-n# |/]e]p9Fa¤1K#[xsRv !,Ey3cUrNO%1B+߲0vrwKG.ҪqPoZ*xD̦mٵ]8M< +T +iHWZ1DU+B@z/[*%gʀ ߌԯIA*['qtϱ8pC零 L-$uؠO +_vč ۘhrc*+L}2Ǹ.6`ڐA}=Z 4jKF!"|9*RH&j6k=e1 ѧb ϳ5O AH>8HxhC&{\t hu2.x {R%~q+=I(qޓ7ܚa(i!\fb~QƯ0@\~ʖs?S_l#jV"]N&߅/&^1gA@ZgCJW,N03YВNV^'XNgɖ5䆉hA8)K@ ?O2k}rMu*x3!:tc?O;k> WvklfD!~#thU@ rm-ϠWdPy$$?|lWTC.1]Ԓ4%4 #%z[Vpkt-4i+<)li0:D+k@F3A?uTs5T p=14nGUi_LKk؇HțplWhrAKAnY[X9]zӑ "qo※(&G^= +*l8\SoDvҥ֙>YC +>lr;gm"eNFoBxۖza kWv&Z4veե=v}04>Ox mmg^{}-3P4160(zwDy9Ӝ;acIcs +Nנ+nƐJ*ihҏ{Wtx 7^̠8'8'&3\rr Ks;TP +9DA[XG)@|PaՊm͐ӝ靟Q +qXcs SӅDMgbՁ:Āe+:D 8![ͻDjBOXC(TIzXɾ,vQ!LWYvC!/޽ȉY{ϓ[PPWb/C~G x4B.}] /XhV~>IG g׷jaR +ˡ MkQƸ{F"QBjE]1wh#?vcdǾMyۨѵRMx@0νs`P 35ex +lR y۫%:P0*]'0L*C"|;p,.LZP即ӖA*wOBů@G0n uxGtvbRyOH[.0mxQUOjv%' uP5vz +\߱qоQ>3(lB'9to5f1AKG"I%%ecz8 wc}_]-fK}[p+9Aΰws` +-m y'q@J.!H7>U@rvā<30"b7ݚ\Mfe}LykP؏D"1+!3k]o%.3m2\@E3\^4\*UV"ƽTNN.3lRb + endstream endobj 3188 0 obj <> endobj 3189 0 obj <> endobj 3190 0 obj <> endobj 3191 0 obj <> endobj 3181 0 obj <>stream +HWێ}W!7N/nf@|b6GfK<T/diF ̰ԩS2J)5F)SL) /[:~>rG-3Ng͹$%Du; ~>5^,fb= +&kLMwp1/]_?/3ϥ=j׋ᶏnW.??k^'qP5|. ߽|_=o^!? ߯߼8B@txcZ2kSiN$Xܕ! ֔CuC12}n DBt(\rxC:!9(WUߴ1pʴ{wΘ~Wvц)¹6KU^H !ԈMy8SXFr%L|W]U/Ȥ +ܖۦ}$ORRjMLqb> h 6hY(;"z g('}}3=DD/e6)ᭆ'jS4Om9ycǤoj3%D8AyMPA(ǐ0DXx2?0"I`o-1!Wܐ ss CsֵDHyY>2Ry\fAV7e02Tz#5; +$cI.2TqYKY NuDKhs?T薶ZUSxXH +)E|(aKlZtkfH}UI`( Dq'OQTeo4%@&a-Y~랝I]l{= Q#qglv`$*🇏7(ҘOr-QzY`z3J0B8f٫ږAE<2<.zه{~N0BaAN j 9X]ʆ +hgܶ+f.a7/7E xƌ  +~EwQ:ew+Yb>Br> 㜀$OF# mwnT _JԈӨ +^hl'w#<%",Ӏ os>ʛm:A<@:-5ה=a s HqDh%zN/CA@uó>@GW^Ԍg LU@َ{*ZM  =tW\]W; H4g"TTP()U )3M`]\#N8حsMx 謈cTS_h*J)-1 C\<C Q *e憳ۘH`ڃ)ʤq;8 8+ݴS0Bg6YWDF2Yǎ ,֠>dn +n]4Gz!~؈xnF %z hwrCŔZX5 mkŶJ)8t=H21B`u 5hvGЪ6 +XE+傛of)o͹QO! Z0Rd!Z4@GaY+q=ON:NWo3 (gfc71AOTa>>vEc.!ɰT6н]ߖ+N_%|=wȣ* M_R:̀fo](erW,h2(X5,Q^5N"R#h'2[ {T^AYy0"uBtEj۪͚q}ߵ-rˀ! +ԯ,_?{T9Ǣũz)~` #rsWX\~xLji71m;9{շG%AH.`Az_}hyщ uR5f5},>Gdr\؊~MXM HS,w H48bRY"yh!k ^7 b,AyFrFߗe}8ESt1I~ n$E.d5K?qɬEKꐉ:tbmb:l p(Z[ 3 +VyGF@yƒql)٫ኅީ5ֻzWR*4SL͌K-+.p2*eUMב2 4?V] ZXdGSʥLːj9EC6BğѶ/>#VjQ1 +){a]E܃ʐ4yuQ)N] Hl*ʡ TNIݶ+.oH@Hېr}7y$ (;=LeZ]5]1 vÜD͈bA6kJ)D.:\t]79f`պno4`H͔y-d>s!EK7^;VJif"2 vENgzi2)`] 6vp;؛ii7t313oB(_"-wƫB]`H!W@cÍSۃ[^:uD&U[Bg@x a[)@wNW˴>bEYVPO1r_j0(ebW"lMu^ϧ;v|d-?<' 焥p)uV5v:Q]]1)&InMdv[oW= CGכ6&n)ipA>g8FAaR`aKjYFqpaaӌvm n (&6:Ti|Y)Nwp8~dQR߈ Oa +&~X$ jMG073s2V̴׵ m~ fp +i}rIWS(l;D*2 +,/Q/ZWnnG/ڽ 7BO5:*Wl%_7dù6rm99ThQkw10$!HEþxvBwTѣ-oh5Hi~pEu5–¯Ʊ`J۳ endstream endobj 3186 0 obj <>stream +0 Q@&X Q{aUѩ!uӕI<3iL$Y5&17c3#z6;_ a4?(}6pQ?-%j-OJ*rRB׏:!P#DA()Ҥ9F)pb[et8y=gGd&"s%􃚴6}ks aYLhb}gR~B2iv3v6QKvIoe'&oV#><oCsj3>d(K0bAu"ݘtX1R;},>MՆן +SF JFMh\ @ y5LJ5CXSɠPxF"2K͵aia,t]9$QI Pe س9zCCsg@!(3P"Z5"?'BАb',n@0l^}-t5{f  TtA9"XiehE#n+<6$R lq'5m6眰-81&mt\Ǐ)xuW~5(EgQfro;GEuZw=3ҩd1FdqEo3ۿBlW+p\Ǖ`ZV`Oz9"(@Uݺ?`A4ŎV6:]j%1xpg?jjJ/Wn 8\dZkU R.)pgd|L2!(^n[g&*įQǛp #4v%`-9t՟Ϳ)q ze~_F`Ce\%cXEjv~U_p-1qHx"ck\]mt˒h㨾'\YrjWC8Ф!'}2- +rA\1\v]#} Pu]Ȧep] +vUgh_H(2;zG3G+>Wk,'aKS̞ܲ|52pKZop&9nQʰX@m@<+?ؐ;C¼#Q7><< {J0A +U떉 ; +OOl՘!]fO+76UJ"l[__gi<^,7#B1<%Llf0a]K?M<ѷϗ? jB0d'bY, _8-0a6$X<oL'K2&"Ɋy~ᖓSSv,ytEp0l yb^*Z5v,Cɑd,ق. F3ڗ-ڢ1Y6# a(jS^޵H % S 6sQ55Rh=c=ت#pxQ)p^`O ˮtJ^`˸Q&&%P~D!P(8O-݄>JՇy7تKkkmҷQ/ڢ2dh+6?y2tEMu{:;T06\άo8)RXg&G q^0ǼEW]C|,qs\3kyMV)8f`{skh/N~1$6L"ϥ pBKvde# +vFV76 [ um8*i z-Y FDhm\**2?+ c`xUDžR80]*һ.[;l848F9]؏iMbDw]p?}v%;"ҳ&ÂG=`9p|w#D} Yx}(6"3@-j%麳RvN s@hruPP&L NxS^Lb0W[ +!ju%CήVkL(v}RC> ?կtWVcTI @ 0<-c,nC\@Lˬ~_6}R1PO|ϲ&h-Do)a"믄쬒!.gU,;g&OT +*&z 9Ij(k.(k{WsEZ;eFnH6q߳UvbFZNtC`looX6X0 q43r޽KnocFF<")t#Yx&8!}__, +:Nx ٵ \tiv9 n6b<; +ޥN}&YCJs-gEjOm: o-˳qYiJ\9EhmK1U&ԯ+)PNݷTWl84ax6eT(ޖ@/| 3ov_FGA4(t`r=hviʯu*疚ö l_&!<(ӲנXa=YҬ/K$K?@$UB$5  Ī ٘WQ0}7ⱔ<\I7')z F?@i4vCƈ/<KٕPٗط%{ o0 ~:kyt|ѦFs{u rͬp"pp={^+Nv$$j3%&s%DmPUi0Fٜ\ס4"{q%K-%@mKk΍g;ы{`S݈5zgX=ὐHu{lSk޸R؅oHlŮNvUraƉ A\|%}e5-j+p'چP-4@d̫ s+iѷ&J\gu.VT-^kكOy)!nA9>:'$ȑbwl5@*t •Mڙ?7i F/"kxZ=O5m| rMށsYEO)F$&7ۮu[0VKB>E _p!@!~7"ۣ`'F +Яy LV鹰+F#%k\s/)W܃L+d 0'p7r"K5ܒ&}%zUE g{ʻ +C5Z }a"Fh(LVWƔN#lٚ[QH9X)⧎ zKvm^,AG ]:zmV/(S>Znߪ+sK oktgxxN&j`[H +(͔+C1.'(YLˋ:V@XW6hD0ZHSW؃IAӓFVG0 +d( )PUp?@_-C25GP"8AˆfsR[?9iY):9QQ"ǘ̏7.Y~]f9.IWw_Пi9b)N +f2jZg0~R)!U%fc$ O%er^( +u֚ %˫q ֳWY[Ƈڳc-'!Y*bO/MU 9)D\Ӑ]$\$j\%]u-Q-A 5M砗ya0Z".au_#8 V6M+G`(} /϶-OfgKYV ;"k܉36o)/\_gw`P${ݩ‘0W#iXCaF~P)#޹\ \=|guJ'K@"pi1 aꪣi. kM}lnO19F`w@b>. +>(O5IkJ`W9Tثr@om4Ӄ]*%j74'" m +CD`jdYR/g9){?  ,B @?|f0&y4O$Vcz-s-O&,Sd_٥iayGN:_ь]P!DnGZdiP#@ub42JkLBߝFYzIAV8V׋cZ(*0>hR~I4 CX"tQk5_{E̽:E9#5Yˤ=ԥ59 7n-VYoxiXlB{ ZXOUI҇aqHP=l-to&`?)%TÅ/s@mgbͭ͜(TQMG8L |4zIsbUyd'LF4'/KQ}UK XEG.EԖYW@|ZDՁJl^26|K2&#&|s}pH$XսR!7o_Čr2'&PmǞG֙Ơ,?P`iH's~5<}HwiSaО\ԐA8%_@mAWٰv)_T=_7Y*;7/8v ?bS[ =ċ*m]FI+TǨSXq`1{?b4Q]+ :MM#m(&K{w+ڍJp^]z=r@W4v~KH +(NND+_P&֠+VQo% (ܓGo1AO ;!G-P'c:?pcsM^) H7w+B#- MO]2>|i MM?9쯗DzVeJvuSU5w> hIyOƞΰǓx)b+A78*cH~#WiXw=_q'c_8vO;14!'=_ŋY7o˃ِ:i?pkwsY$J<#uwblx +De;&w´fx:DK!VlB~ch#Y rB 0co1op?ɳ%gk7掲JL tÁ"HsSP!&|jDi{n; +͌){}i`I^OZ"ڶg{FP qF3[ }ڗ@3!lPz)6 =%<!(Yq6wl>qR#?)/[6wef.BكAXœAN%4>0u3Ùgw&cFUsH)So $K>(q;>wF۶V))lŌd &Z7U~n} }g; ,Z C!\Um^:x)o0T8*- si +ٝ X!9>)`߻f@>ʹIBrԋSb"Iɳb~h?]l`F$)e>v1D߶];L~ܕ_ՌL7 u^J|cQ)4ɘOQJxx.!-~jjaұ@3mrqp욫z=xbt"t7 gt: m1Y;`>^Ttnq;G%UpW@WRJy][dgVC< +1h*Δ{WV*8٫ JXv0VtrmzWI&@RǤyۇ= 첉<1>sLXjpWёKlv<NL1)Bub&]o*p;| J3DF W56xTKcLc >lٳ OOɑ\F`S'2ewϡA]W͡j4EX7ZԒ)Dmb(hrb-ykPwMnb}IL],}ψ3*K`y|Q +J0*SۇAm1 z,E h^IКD p 1GGPؿUI^ M76RmT<=hP#]}lHR!0R.B>L@zh"Fr2=\sρȺAߖi^ėKnByHol&޷|6ҢcYZ)摠Պ8exJqkd축d|v |L.Vt)=c'j0:mwxfSaH0"%IϔˋAKٳKr%,L[_ Qh[6z$h jj)k%&G)oH?]:VW>ێتU^%O-]8匿>n0{؀C69>i U-RL=-g2\:EzVmPXӏ9ux<;]2OaU&W-|A"pB,s )MQD2]KO~v0ĤlZw6n| I>8uM+^fנYf5GsFs!)*P1a|)P[{ͱ G;8+-;mN +"amx\ŀ拠 heUHۄ? d$h0~$Ms~UDZw4RC.#(f }yuH%<3cPr5aHZ.M,ƴx Ehud2p.ӺW&7rGg!Exe<xJ.GF.?dTAO2_+ONc* P#+iL,rctel_‡Ff +c#9 +hk{[XL{Y`"J,G5֡ cg}-~QOcj/{xE=i憀3Zw)>2n"7[Og1nh-̃_{hF8&i \lU`o̖bpp9v_ ؞yjtc]Y rr\>zЌ~vw!q`}wT#6aE;_w/g~hQ5WGU&h#E..CFьRfpv +s-M4_{bdO:'d7WQ"x_W[BۑR73}V]UfQ G0>c'Ƹ,P#Zi)u}ΙgB, hB p'V%zb5Ddh !ɳUȟ) >Cf.im#Da3(>0g\ݨ̆ /H:UZţQܼ-2KorT~W*m&7uhS8 |e-!$(qBYgw宫ZK%kFR-w)&W"Vi,խ4!*>Ef XI{ԜuJ(a"fa5l8gyE?ij=8h":QQdW&I94ZB8UkzeSoڈ*f%[޵} )_JFhoI(HfMHp5m&Z"8,DF cmefX'XÓgPn"uI*)6fO]`QAdxz4SY|WU e,Sbg?dM9B 3ff.%$ʂ5wa;}.%{oRG~c]f38CK#}) Ws"bHl򲬡E453ы?75RxRӄs $,b aP^?hPv g^aYQ3d61f:>=XJ"³߫u4LcNe9&Czj9@ J驽hE: b=!ryzA|q]w,f}/X_!9|X]?{eDARCet8=5N}k^I9y(^u >/;w1IGLBb Wd52^,tAg ~qnS3jOI< ir" 8[kp)T59S!r:5 ?$=+pm +I<[H{ah *MNⱁ7y%ҢIL2)1tPوNE@)TfLz_) +0㓖淵J YN7PzG +BA7oh} :U3k?њZ9D騳 +q4Z "ˋ5O쎋oЗM,ʁ5V3i$.žBxǍGW`ukbIh,RE+ }D94ˡz`<&D=rWufX! nWv$1WÉO{zcFS@/?H'!Epo ($nћM"ڷ(Ò)*UA)︴l:QJsR{k'nOH8F jr\Ilꩭ75fFM'Fvy*7.éJWDqOwN3mwbg=9^O&;uVtl}~/`Π6j^Bl ^Yw&XUǮ=dZztnqA]s8^1lȍ`e֧B.Kh[1,q|1 iAI)XBt쪪Oc.)ȒFN#Fu +/xhFWfYxFeܨ Jxqu79J!{ޑ;0"Ǯ5W DZfxYٳPFN$u*a=fntvaG=?pVi!CKԩ2m*T9uWAJ&mI V˥dK΋+hB{#saƬ#浝3 ^R`DT#̇bC{hJ$|JZ,G<ӹMҏ]s^Ev<$Ga=O@CR/GUHg쒮{'VA(iv9ʭ]z/ShbcQdOu]q![G=QJZ?'yDSbq_ܙɑ98݆-<-=Z6)YK֪<ƦidfA%"q^е9EnrU9(-Ĺ.DM61EAͿ &4i'ƈ Rt0q8-BLжb9 ѸGA{h/W%S{e(.=/+5lZ(XYOSuu8a$<>)jl;e_*Iհ~m 5~b- k(6HH*YM +9=16d؀[~?A1('dxgyZO NJo=%$p0늊]')o2Sj +s ϭL2iX E, 7>)<>̼X2 ȗ}%mQ ZzKΒ. n5¦U( IxSųe o\ +QJAc}x.r={.OJǏ9Uf^R䞺X´rDpD^$Kơu#Df7xnaDS)?LM=Bue#r ʈ_&$@w>kRPaߓE^fubj+::,ްM\;LE`?ix݄~ aQGС($v[=,;'KD*KbJ~:ETUS+~@GD@ +uAFY2Q +yjMOoƾ6JԄؗҫB>50<Aưר}hbD +3{% I'+6d̄faʪ,$wdʣuA6n$Z43|٬hU@,Iv +B! Y5uǝRp@dȒjV j䖲]k{Vu[=۽f=ɋx Jo5\pJb=KVBrsh=]낍ٓ.Nm2ʯ~§؀)-R!~ \jBpcěhЩwTr +Ih}'}N gfjnz +!ζbyu 4APŏ]F۝p*{<ę'yz7?#U3O +NC6^؜2J\ |mhKҏ zlhܻ52_b׫;%闬6弆 o/(Ҽgܷkv3`T~!M=g60aF$'.e8/-<ٲ$S]<)8yk%@Ҭ-):Xkcz Զ;|xw:ϥ^Om.rӧ"%A gp3;I@fu;z-_\o4)6IEz=wV^'鋷=s!ΘiLҷZoRՂZ,0ֈL%ϑK Stˆ|cE'WۖmG'Dfd-:Suƫ?~?TRI{/,MqI>O}>B2E*Dd1'Kɑ*.D9v?5eUfg=5[º n"m6.!2מ!c|OL-C8 0q1E5\p/<+U_ԖnVi\)cc +8>YBu٨Yղc\ylZo5E3pdľll\vw[1&t Sg(A3w]x9l(i NHHd?qKo1EЦ NvN>*݂&WHv%惟闚bL.FEQH{̦wܨk:\w.c%D:OkPɏȯ" OjTsJVAر8 M$m__FkOHCU3.<#X).4 _^=Ľ_W%7Isg\C$&Q^ffFd3X$?{EI[N*-H{! wp2+Lw=Nܬ{fQS@tbUKa+ VWR1k<6Iz%cYf#9o$H908/q-s$?+DХ2:IrL'J1!tk?(@xyPS<.hXkSXO\TX +`'z9ӱCh?&cKwY`*n,I-s֒nsHF"wsUɯ^˶(:rA4z㆑j7vnCRwl Nhuxv'U1]yS

i98N x)fbtV: ; Ӱy|6 +f(m@<%E8#N\9US.ÚmA~oñԼ1,ul͈\JM*ѐ%f,2P\N3?KDS.ln +~Qxce^oCzL<)MC%phT`so݄0{"Df`E0!wƶl6)ب! w6ލs1#eW^%:=sHwc݅&-m eO::;y5u Nj mIP!Fzj#ݢq8KTjC;ibċ2nI#?H5"5z'Ax4] -H"/ +h>{ӹy ,z/% ;.иĖ?{<4Fm| *Rv Qšv߮×q?"@~8&rfYmoZ?ީ#T=/G,!\&X rWRϠc2 s|AJpAlJ9mZfR'tȍ{ݲ#$"琢/(xOs5eK }LfoiAh䢁YK11ReyWDObN- ^̺4>2|>-\}H'Uy7 * @6.JA\XxaD&k +::x@C/>h"A7 ߵGc7ˊ#pIK-Zj|$,=,<..Tw<{u3=)GGIqgP/ .>Ic3Q#rȞ( ж#(ps`t)e*MpdwYƠu[]r\d H<`@"5r@!Uf]|>Vڝd\%[qJ}SD꽺t$|!f%{bk j0J|HI{t>u&s+ +]VvFq4Fr ڏVQ(>`ƾH(H6&D_tsGt϶>\%i~kU o}K:ū^{MA>3_3 ~6 8jo#WV]R%Ոuae% +qJ(7?>5!.Atc|x{T0m/,`7wq_xӄn'õx* #1zQgv6Br; +G%)4(HVc*N{;  oPt'}u:nhl.55YA3D0"wI+E$~lQLJz+mU<lCpqN\m!I4&8~S8rva]dW0~ཱྀujW:B#\{Rz.r" _/3kȮ |uϸ$ysLYos%߅@&bnSؚ_B̭l +PU y Jd5zj#znW7H:a]A^) Tu?x%$9}+ռ·"2+k C6φfb^knP + Db}.ܽfZY_eN~,P,|ZЪm/E?L Gʲ*:@PuLzKJ Rʎti2}?EMuP4[BUtds~L WL +Kn^Vu{X&G_?xXT/dTfHKUxR:$E\4Dde!ݮ*H,pߙ>^Di$`ya3`S]ڊ +~hų `gѴiի-S`N/ K*& h!ydUb螑J+*{c_[%"Un AGzqx Ez¥1Y !Sxa1b4dا͠o:*6X\[|`nLRg;Bo+Yl7L8oliG)zOHyj'0b=蹃,I9vrxU[i ):-7cuє{'2UgDHbm('43V<熒^m87;-L!ɿ8l΋:fKI*mц tUr2Ny0"B> endobj 3183 0 obj <> endobj 3184 0 obj <> endobj 3185 0 obj <> endobj 3174 0 obj <>stream +HWr9+zV"70,xL +!TM5v'`wI*?WmHMHH{ttG'2bVT)&ǿQgw+Z&&'O#ZVf< %j +h2UIPJj;&[+"l%-~qnjDs-ܑۇ /hDttqsU+Cs?#URjn}[Ώp~0#e:<:iΛuΚ7r[2~*A@UN`B!6ҲEZTm.of7Wl[xuמ˗޼D #,Bu`C{td%;Ew *{un xjApP`hM8^4DϢ?>2%%,U1#LIP=Fb#7o"1އo$0r +Y&{<0Vź^X;47bp"v v%1 +T> |ƯGs z 㢁`woOy(7G9.YJq⮵dkpxnfJB 9b&ꖙ?[~Y/٣ak-XG`0cp&)l.Z*2fѬ\P;;GgSZ8n +!nܓ/۳Gg%XZpy>J 6-2 ַesc -OYnC(=ƍ+ؒ|lmdZoQϻ,jdXFN"jCP0aI?,yly^8X~U; +Hc㉢m1Qp8Zm_qbt'P9w 0NdN*jhv` +pH1oq[H?qƹC'HUpNOe*=c 侨p6T\~1l8QIPԔ-B`PM;; ]q;ĿP/ ' ܣ6:c/¿Tn;5XxGjP(\^DuPGe,K>.eK !HCk' +y}Gdr۹Yw}%{!ܺlT:;]wUPPin  2[7#"|f:qˬ(蠠LrVmWNbpMxuP16ڿ- {h7v2GF6,/Hl/J<Pl'=I7 2P {)GS ws9( +>_L2H,=f["xRG/C/j*#-7,n1}U% +&mlj;j¡HS&\$MQ1E TKKE穮D/~4/m{eNXof2З\pҜ`kgMo"sR, u{1 O endstream endobj 3180 0 obj <>stream +0 U@&# UTԴa;^?.Ȓ9tSMͳh+LLa*q3uB?޸@?"e#&\7τ +&Yg8b;:~}c`4b&( ,XpҰ_Z8PG! C u7-Nx`=cЀS"$rH┉.PT*yUhu6bPܱe2Ydyj_~g‡ &}6O+C!Klm:P]gU Y`ܾ3OݤI :`Vۅy&6j#ғ&9Iə9<- b,G8s$/f}dU`uFYL'퉯uL$;gjd_E0d3iI86٢D~l:tPkR$PIAd͡:{35!p!oX +$ ?3|ܨn~3R?#x1v@]ΌG#z˭oBj#]P@Mwk}mGSCqI XPWu&gZx|HpHD0ipG|v.y_+gϩoW  q +R1TT,)&C֮Ҽع54˄ Cs< +Pt[V Zegĵ Cȓ/Ms83ܨ3 st+zV$mQ薍ܺPhAs/DE7svY^THLPdXԾ{^%1^=,1tGxQ`0TG@3@.(ޞ{_Y, wDb;@9zҏn +":}y Qg+ ƾU?a! +W$6\+MXx'}lsHF<=sWݮ ['R KQy6Ʊonv\DiEY`"Tn!)s G&7ʄ?5IRO7 Gek{Ư[,_-)٢r;]>?Pw0uRc$``j:YZt!nm:* Wu<;$w}qyϖ ׷ k`KOl`=>\ 2|q`Z#Aai?Qc_1=[wtrװ@dpN>TLZϬ:WêfNeќg–m6P(m`D=Pb;Aޔ JW3'^6E#Vh顝D};{2GUl!gYVtyjW4.iߋnP}lql(uSu2٠B|]~p]-@"kvs/r{?ېX`2lPMN'.P0UsbsS^ lt_ںPFhS$^S;!E` +)JB͹ńyM`(d"ݚ;]1YRF!ЀaScLVLV[B|r_I&^u6f +MTr!rgxĥK"C1/!O?hx73YIrdZm aQp=yB֣5H[ys.%r9~-<[ZW]B,f5^/^xЦ_axSg:f(gS BL1J4\{;VB̂upekW;B=;ZX5ݦ!N3FqECDkuRA9h&E|Qmc]I'A(lR}RK1>ʯ$A.gv=LoͫȽ"L*\(7C}8#BфD@5j,dKOq-gr4">ZFF +Ws 4$l!LxnB,N=rh!VaHkV~ xtR//B"+sJfOlRʾ!tkGgfͿ^p逫U,΋(Di&.$žRxP4:I]'e9ʧh1mJ/ q y 3H10ohae +\re6FG -ڝ[bTi04=ۦD={w嫗ʉ;|*m`Fp<qژ rZ'թy3<>N:?D`0y-Sou>DƠ0([bw^8jU C@rKw޿F vs(]y QHY$I:Hc׫WoS%[}Ş5ttN1SA?pqg 8K^,:\Fe~-X-7JpiYo} %l&ie(<du+ 8*n/NUmT݉g(ueR"A~{A:aا(m7_v-u54@rw " eޏc!@(A2#pK{9ْ]n|tlrh(Hѡ4lFz>E,DmTmO8x#r7o \k-pUagdkn2p^Y]xwȃXu׫$}?]4( ZşHzE:HN4QrɄkhJ%7sO N ]o?;4"PEĤ'-Ohsg"dPFY:(Aܶ$ʠűWyc jH \6 +v>b|_Ѿɗ:jDBq޷rl]!/ +>( e=LΥ6ܘOzqb'!(B']:-e XhڕdʇT̏v(^IA7>UZO֓p?h 5YD mՇ'fG")\|!b zT1-ΞE-v6EiOܴZIfM#Wàg&~S۪p>m_Oh]t6O.[ˡ!@KᅠMZ-PuPsؠ4ߛBP+sT2< LSTA@=G,*@HQ>hF/QEuUv +qGv& l,DT*PN;mBCWw(? l%V9X3b\/ৈE}><~{?l}~^6'\ oۓb-ݼS&q7#uVe +dy'ד\S/ Bq)C1f:]+a+WMxFX'F?_l-hMqPq|.}ӭ@NAkh(1qOQ^ư3{ťӏ/_^BM %z$'k +hГчt L.sY4FpF得az`\ֺ2.z.To kG#sF=h(685j !*/j@JMh7a̡N61#LC`֤0 ] ,D#c[pgЯ/tWn:}m1׊T_Դw'-,PD[=i>~,7,89KGv[s0Sŷ?/p6[% \ӼLR?!x8?F9O3u03QZp.Jkħ`x=9#!q`ݛmyKyNʢhBO]mPgpqǾݧV`S, tN_hדTs~y.QuHd"1W'-jO .?om%Sb⯙zx+ +q8ݰNV٥:RX Ҕ`g9W6hozC>T'Rl;ohI&" vH`'qx TŢ)q9YPu΄Ӭe7}b| y] mœXmkinӳkU?7[ N2wSأay0=WcBEP˥1crt |}2%$hC!Ykav( <[?/svĩSY>e<oԑPW:h ?fⰌ͠!Θ l2-89f+o/QM VN.IG+-ME JDT-{;ALތ; K)lOds2]"qY [IDul[(fcGRقjY Np_Fd=,uߞNHJ)QR!mmqI$X2a؊*hK;wzX9՞Y)ޅ"7#7F^<碪sYi$\aA)/UYo~Oq PƼ qnzἪH/4H iy.h^kp|Y +} ++ )CU -}8I!ç^Ω38HXt߶`Y>$q$R8QP 7IDwLq7ѹfar_p،&%oA܄An;Ѭs1$[۰ђk޳%!5ŽH׫FVXq`^?x܊R;!aaSƨc+5aR)hǠLXEśm50?'ƞ]ajrKTPjB#&b.8.;'~L +\C wzYMuԨ6#QyST'7ϳl3W>gSH ]]|^?`B;1{7b& |K|Y3 We3PY%M"Ƒ ;/Nay;Ae*nY|a|g [ +V ֍Fe7wKkqh{6 +jm'nə;:A4MRwYMymzV<\ׇzCHv}Xo֝QJ\QOZ lplDԾĴ!o9Uޭ,$ɥ]yG-F6 (\MCUvR28ׅ)w-&6b xa.ѯR ;n dR5@ܠ^}ok#ZxP] +l`rKv}gH 7LUCSFuS +r(ʡU"h bAsk؈iVIP79kdlj0H  t`TYER;\fq!3HDw5ՕjYDe+Ja=xtm}w+-4g,j&JFG?xwHWu0>|!B{M@Ե5@ЂQ? endstream endobj 3175 0 obj <> endobj 3176 0 obj <> endobj 3177 0 obj <> endobj 3178 0 obj <> endobj 3179 0 obj <> endobj 3169 0 obj <>stream +HWn}W b)}( 7/`L$f!w8Of8e?O9UP"+e%h}9{q!՛~XXV3R.TXVZɤ 5]lM.u2pf:;޶}-۽7r|ٛ;ltMU%W߽n?vcߵˡzmw _j\کsI!JY+ "^QOD0 F`O!̛JLaJh];nd4 X3akeB.}"%FSvC2!.! +ǶaC\zؗa +-bMwؤ&i&emvWLG?ޯawQ6Tף~l'0ZmKZ0R=Se-k(]z)L՜⳯aN㲺Vo n{TR.emC)3v)>RtRPvR=,0RT\pb ݮ +}Rl]@U]l] ̃T >eT0昰}Zww"涼$\oU௑4v> (AtHgDRv/E7-0̒DDhTܞX>т + ګ\Apa0!: &D6X(-lH[n=caSh  `T (ILۇQ$TSUz3@ю,78i>s""̙D0y ]h:gVb:| p{} +^^Pi-'PQ7ؠQv@~9cJgBI~lR=~bΌ9LhڔDcAĦW8X xnj) PQ4Lƹt]7Öװ@.o.!]C05Br+o8:K^i$yqϽ|usect5C?:YT7e9ŶOr/` CN0uҕ5]pZi r(W$B@b\ډ[rz"w_zJ+ʩ̘N/FML +,x~hOjb}]Z$+idlW4ͦv$3% &>|_dTLܨG&3T3 ec "kZ(/3 6(h{4l ri)F'ohn +cdAHG Dk*jU2 uO= L*DCW9g@(Faʈn7pPm 7ٳ`|[}r q~DM n+Yi{?3vXkӈłF͒?%D*sf>/Dh)ol*lક2ml=cln ~d= ðU@2 Ḍǡ)'aZlWݏFCd`.RV(Φa*7_AԅT褳z  in endstream endobj 3173 0 obj <>stream +0 M@&Gq M{Lϋ+-нXm?8!,M/HxJGp*-Q +y+zi1<'7xpVK) +llJE TY:Jķe9>cV6D&O]7 '\T8d۴C/W:R cXe>X?Ho2DPܫb,5mQ7Mj6!7Y퇿K{_?du#VwX66q/v_4<;jd#ZZnG54[xCTUIU=sUO$:jmkDes?X X!*6j"U#hxÿ|= +;M D(a3ᗇ|=.MuMݤd!*6D-ɩL3uW[(P^S4e 6y2˵{pOh& zVB~Ko/rm^-d捦M GE b e]{}O>[wÊ\&H\@ y~#uF ˦>ƹK@IPAkVP'4a+EI`*8on&(!j-1DܱDoI.^ !װ q>Mq ŗɳ`j +nd[fR*YiIB!7fo^ַqݜ݉;P}׻I')dMR,je!?"jm8ĠִVf{֦׹&cb?׾eN) G@.U|W(;s8 +] Na~Y3eI +=wԊH/{`*YA rA]&w0*tWQOG +s jGJ_%bltՀZYDuc2~S wH"dscSO)̻Yj(0DI~_"Q>\ zy]^DLEhfVD'O y|Li--fxv,0t-wR*SP*X/ +s+l|NArGl #+紗ߺiyV +[F`"sYxia 8nw-&NC3 qqrşVsf?H#酊jq>kAYܜUGCn;35l3OuB14Y%)XWvQowc7pY=q;F.lJjckSGѲuL2n)r;AK/*yQ͡wB fu)D|Ń9{=۝B=we['1xxWrZo"2-ZZ.Lp5(-~lfD_KXFGM\91o%E4 StL=ϿOоX8obL=>ξvyYHdi5%vcag%_f/+̩Ra!ױZcVͰ[d{Qcs, /ZA(ʪ#>cBamn8pxN7yWrToS3 \A*25:Q dy`K#6;#06~EWģWn3XP] ,fs-D!}<nD!uh'v!=K4yd3朥Yć$A2Sz,+ R jS# +X%!i TWnW۬ou|J`lž$,ca$nb@ p/eN$ӆ?#<֟P.+oZwQrmy6a$R1~i[RƛDm-Ɯ~!Wuq~ ȯOPAdT6a$j82 X&\ΣK,) *@ RH?H5nMQ_7*m +FtV(l0s6536Eb"=MyP^fh"G0&׷BppЮ#@7M(}+5Iؒ%=:5ȐfU#ղn* y=MWD+:r4?~PB1kU,& +*ew M3O#_᧗|oYR%:;F$,}WE@cbi>[.]NrBq +b Yy*Ph~^EonoCGO!O0 HފFD$Mm!s ޥB0QyԵ}nਝ xI|=v' [Y흵̒&쎃jE̎n8Pr.t1/'Nq//_,tro!ӏ>,%3/ :Y?]?&6} ~<_7}3htr-*ʹ<P9i˿T%T]g +DH_ I:Jʈ;424xDJlѺGhZD ZjO|BQcT ɥ:n +A:KQG$Ff(CMGN?U>YAw]KԑmQ@-䶱:frا1'#_*s$" Vة3 o:266HЛ=xw +#]Gx?SCw̍&rXW(19d |{Նs@?DÒA_eu'nAp<3ԫ}0ҝ? +LYiie ᪙$ x;)NQ>G(e"zp)FJ^JrX?O5J:jG&Wu u(6ʝ_Z\EѴ}/O+a)y7EGi"Jz%bDn5Kk 9''P)!s- @wBq$,Ulu 9sIL9>M%yaXE:ٚZ_`Q.X ![&| n]@uef!nhpA25)WDx}xa(9䐸ڱшY\G-\eEmh&,½].VbYմeG L-gF5OGtZ@84C?Fkq-Xk̙&`kϝ4J8^9ɭ#` .#wF?ce&2nj}2?`'.ces)TuX} .&5sl.*tFXyf0COW}'Sa̅e=d)I$Ջ q КMo?hO.w/ѤEiۍӆ`t U{\#1S6ki4(ؿV[ӚR2[2ӼeScFC +dds EBBz>~qe,rm$ūS7ӑZp +bK.=\{v`pȪ+Z8_ja7bab٣k@L|D$[0:t+:YTm(ŎᤣmJaYj_FʓE9ɟJDzIJ?᭜EMDh Ҹ=@_[ހ78}43]ֶcxVTZ ި$.۵6jKs22hPEI[ Б5(Ă!gްMQAQTx鶢y)h G!Ү^B$SH.LB˖X0dD=,2#P&3%(1AZРGjȂK?% cm ںBu1^X@>3!T!XIAZ_9 {{)f;x;j^mqCѕ$$\"[HipeBeStVimGE|]aY TX\ JμtY.y8.\[]8lJh9&;Uԏ#Z@sݪ 6< ȄN}l @hQEQB~C#СO7|zTi5S@[mF(P)mw IGk 'w5kk I.mN⋸@ {r|"Y3yWnQρ<)hޖy},~F# !!Ms>.$y +/8GzK\ ?JK]PA@YXb30sC9#v曞ƊK8#3սH5!s* zpY|Qž2i}c^+T{JzTi ^];~au92Qzбz֛Y6J +m5˄N4DHSuNU j J5&JxF~z3y9ұ74[ +_׹o n +zBjX/y4u;QT*F\zCkjcT@6*&L]$4tF4_-3T&:uXyڮkifVR&;FoHgT1,BL+(>A?``69RU{#!BJp6$ZAzd:M'ig7i`g"$Q('Ry3[˜q |2о@/Zgn{k`) +glr27kRF + Vm(M4i(_Kvۀ"j*icBP9$KB?''B҇oȻ#8oK>£I+,3gnh*at@F,ɰRy3 gHB, n<h0)d90ɫ usjE@?*DD.H>Rߠ<}MLmP31kgK>:PD 6Ek ?!]jl"[S y.vzaC_esL8M+QnI7s 1Yf i;R;c\AWW.'^@ ^DZX瓅9PW_Ɓ}YylC1%V%{YQoDI\bN#v[~D[N͢Nƃ&Re Qn;D.loyn{/Lii:^>bIȽ;ܒD}W.懾cǔW ik\@c&#%4!mIFN_Q<  ]av7H;>~,^P8Ii+OyPLZv<,Iai@jD?? :w 1+I }aAHJݩEщkEޥo(RǨ53\\H0kټ2t^N݆G k,:mĕ5qmςȞ3mI~*s4Tz IDm'ܯН"ŌݜHiM%Cr6ୌ`*|DkrQ0RŨor}%X"uqİOgY[n3 KḊ>2j `NC|z[A$ZKWRdEɛƮikòCwHRSٰug'*b+,^v[0,-A,kJ tnנ\gmÞT5:'f,g:0V}vO(x;8n:\#j\hQ-@C~  @ʜW#ٟnL'Y8XZ' +iCw\'2[2p A7j`;7Pss"r4zVq+/Ql6 g1qظrFO/R6Ĉ+}"~ sRé:L^&L%sR+,|xD˰|HQ0 !gؐK@6+MpBe?#'DO\t!Jg +Udp0yt{] s5#Vi>}֎}#ƀ7 g ̯4nvQIdk&1YeǓQiu㐦CcFUO]ﰲވ'}PaqZ99 HM%O_#cqrz$/ITO1EE~@ǕzvIj:gFnȢgKj=7\3\(< bue"O[@Y*eaXfWJe/+ F}M +OkTRCJVH #4ӳ62bXsUٵ@fח=Sԃ$r TƉN=2Ahy(b+*]] pddSoo5%d wWȖ(CШ̣]jpQdH;>& h{˫Ƣ1YPŠpaWEA5ޣV~.`WpI;b( ñ@"l)Z<PXS`4@߆Vb=!||p훌F㔁)npeUFb|}aj_ߏQ#A0`TX(_I f,އg+MBnn1{_wPWuA n1!6ERy/Zㆋ2 w15n5 GAYuuW؟@odġ8rENVP\9ym&= +(@CMdeR0 "/2i ԼV`xP򝌨q}\߻r3@å9ܥVRN﹢5qJG]"xo!Gw#9sիwo R=RDW8" Na9C# f:sTɎJ=8goS`QNq">=6W0g +-$)O½Z1Q ')?%D ̐F&/Ljybӻ RiXO#,Q^ VS#8CPhN|B)cy*=/Z[8rVF/]@sKB0,pT1J !gdZ5i_ qG95X79*)Iܙi:l妦REc& `7A{f\(/xu#>/G9T rl_'/EiN>{pwqu}K到dƪ@6Ma̓Gk~L-Ƹ-Ǧ]z8TgӜe&?>갺lع,9w>Rl@d>`^6Wn`Vܒ謝"Kp([7l}죡tZPq"p<ʐ9=i06!Kd;xО; rq٪vbq}U&l V<Tq9a>y 6E$1J6̨{ҩ +\4+ݛHa.taaF?MZN% +TyH@ԸCfw[ifl`56Vn|u@ QK@* +V9f\J 19EFedAo"H;x-rƴȳm)ns שx !Xa +6ؘc}(**vWD,Nc *T+zw9ȋX}rV{{w:3V9MaܪF6}')&#< + _GJ]r"5L3U&C ++@f/WJD^8jׁ uwkz8=RC5fK*(ē HPYC&cKoĭl'Rr󟍑 B( r}8$zGP(Cs7@w]"gɮYqdpLpk#3 g!z@RS|䧼iIE'{6rńgOiuXX4ّ@0e?Aawp^ڙ봏I_U؅ +Ѣ"pD?J$=,h-)9ٙ0szG[]pDx`Dm4{ByHЯdTS.HW]|SG/NM184X5ݮ- Cj3JYpj'k+~nD¿QH Q-^p6˨ɐBDIm7op z&=~6V5_Dz>: E'xWwa O[.Qd2{akdSAl=,MO_$Yn 'zt&6G0h9l-cbg6n -+@z .P]_-GXsnZgH^p6P?V[eY5bd7sݲhɤX#ėI%] +ȑ=VulĨC WpK'/k&$G ++O+l{&n7guU+Mnd +TmFkNu۷rNarCًG_Gv(ah9$sv#BYS/=gج1"j8ŢxYh\HB(.n %cN?7Dlb~66Mw hUٱ \LϮǷBHYKj98'aZ ǔ;GIVC!NF3j3 +!qAayR'dajG>@m@)h%va-m +/8} +iX);$111lZ;4RO#Fhr/xyܦ9+ dw). +Q( !S/\e Td?q?u"(a,^D9 =&un߫[Hl,.N{kW=f!~`@bէJvwV=ݣ:qQ&;Ъ4E0UC;ȟ76r9ҷF +!u }}a(.@3)6ByPisTƮol-g\}K+ψ@;1kUSSebû ԓc"$Y|觇(H):>iqݓ2@XB`[!>$q +zCxkԊH/TOz bmYrI yS +xrIvn00]_!h;Gqwds$͙:`O@ t3wLqˬ7eEpW(MRa *c;GڪV2T}$dI]O!8H6I 'iw ==b/lF&/,zMr}""y"ҿ(tKMNUHmۀƹ>u=S3\0K2c +ԛq2NDƳ+/)]&f—_w̒8&o3Uq͉rQE_`%_d͜(/Z]ſۈhCGr 0NGK7dc;5J3ظƩ)xuI"z x^xE.-O߲C|E-rF)e`$ ,8IOlG#5I޵)_b\"ns|cƭăQAFƐ NҜܹ2K*Gq.Hn ULvپެ=6[2Tp`y[ykǦC &JAvWB`Q=2`7+.\Os0G4KQ&CVE4g,bFT#UaKWpY]ĴAYx3|?f58E~T*k;+ \J})/Uf2 }ǐ[Rdl += G-η[8_:d V +ϴ %'x CHܲ Ynd?+_&B#ʛ `cSu Lz +n8 pWG}KM9Qƒ6} _߈4Ne'p :H3I%/"Zt2K$MP.wI){PXBgaEW6fp4e CGF= Iնtm9l lD_y:fޝoҏ|c>ڐ:T A>^y]5WJ_r/Ai4LbE> ƆSgDIs?sGOgSB3D2>eGH%Ǘ)DBrM|BP!*#vezx.5lQT&a=w a≮5 +c#ug r0>0B{]}P0\.ؙ[ʃL3TyLKѸDU3Lc"ļ=$ 1>WeNca#6VOـGȆ-J' >'Mzr~PqnJcT }cڀfZҬmz B A8E,| ĐϹJڬC­>IQ3^Eճ-,Ӿ} cqR18EQ^B_;ϔ(:7GHW\K`uK {,c swYPK= Dd6"qRV->/g׭۔encGVic.5u~2o >vFܚaki_ZRDK[޺wxvAfVCObT=ע8GD`$tQGf#rarU+z4 Nْ5N8JjZr@F.OU +ѮȂ'2k#S._<>rΕ!,0' tw@&3w_ڳ/שQ ޵Ħ- [[YO}OR5u+vҦhFkfBY|kAɏt +QݎrByq8|h5jӒ볍J?Kjc6ۖi@W'GO;$`Iv@>~vCipCsidǒ7=:3]*F 8Π?/B \̭XI75a3!2lw ͡{q qWDl,> !@]:,vMLQ5I9LJiyާWXZ͐L8%?XTuŤhY*-QEPAʋyUşejxv:v:8{^ȾJ1A|yVgYB=Mɶ\ۮA7~M)o@)Cu?)wkmʇz5ʋ2ϴ1=KWչ w)FǞqZaS 7oL}~\k bCFh +TkIB TPEԃ! 9|2 C| ]DMfӘ5r2O+ +&2p7Sc>?V}-qx7ViMoh;*nK˗#~(9uF: JRE\QM#Pv3':Qp릖tJ.Ou1۳]IC/mhrMTK)27"TޜR:"F̕Xӿ%55;b]R%40&F;Yݙ,6`l*oހzQ=E&[H̾Q_ 腸 =E< .0TLn\/'R& dOiz>W[¥*tu*bd x" p#&R/TKٰaB#XBum+6&q +)Z3(67SDm'{̥ F^IDSx<4\v٭*$z+GV/=FZoO endstream endobj 3170 0 obj <> endobj 3171 0 obj <> endobj 3172 0 obj <> endobj 3164 0 obj <>stream +HrF| +|Ͼ./RJL O 8d1I*ÙFO/_uƌAbEI(2r;{~ RW 0e/ W[DHB)z٭zWvVFFݷ} ARRvqq];ΟZv˗4 +z~CkE!0|xy_w߼`"|bd5CJ/_m aC&\Z!M۷!hE&zvV}^'NÏ~SkOU'0''nڪ#DDhteb gXE>5Wx** Mu_nr5$O؁Ce&vfx/Da?v:6"pޤ!'ZCoTN4#4$e꘷Hj1TY6s )QCXxSXqp=芓U_yՐ8( HPR.)mraWY%r 4מ#C*0ݡ)jrQS Yisٖ7;NA|p +!3Ht0~bjE`  \!;,bi7!4DzDθ*:PBߤ +Uj`d^ccN9T0G]," \%@j+w:z +@bäd4rPLS  . beH܀3YOqAezr]xLW3ʄf=eMm`'OͺoFFfUբS$Zf/c~NERC1*rX. ʐ 's9N.|u;©]~Qb& Uh|WN隈'Ґg @A01.vq&ȣMzeH=né"l3QtE7g}T 0iK8y׵搷a:[<7pII81__%YUX$4Uj ,.S?bb<}ILoj28 +e^Nէկv"tq@oV^MYABJ2zI8PGCq\|GMTM3գ}G3hou,T9Wl9R=NTwX,S==LH"Aߦ=I*!!r[WٰPXDs$YTc|z +nsr~[m~|=aLĈRb#lզGtDu%1]8@-TC!_VFޞAyAi~ ҧb9"4V&K0Q`H$kacV$ԺǁuҐI_M1t~|NJNp<+/F.Nlja`;k8l7p^V:-TFc d xHu7Ėi X *D$~C*sMMmD&,ifvKmh +FavꅉM@"`f$wc}MG l;N9cF<,E1 +'J?a{XJtof7^Q'`j$8m4%(4t|Xw?ݦD,-EYHx>;Sk SEVqQ1|ttZ6.4.l11K|pϦPz1\$V~:=*zGtEѱj%2H ~q뙝m09t/?=2>stream +0 M@&6 Msׯ(饵s~AL oXSྜྷg MZdd;.RrvWaI|pP2?~ygaj|3x +YnFDrU|c#tȎhU}G%6/db\d\)0=F3R4wbt9>r\'C+մ<)}Xv]L߄?iI\6׽ +ǚ]Xn:jl< +=_8 gwZӧ\T[7_Ә+l!;H/͋[¥˘z跃JߐT6+333|;K.w /$m@VpV{:cQEhtLhX(2^L_Uwlm\*7(G %Ad-POOʌ;(ۢ퓌$簯R*3 *u7t挄(̚S[1WvntA0en.U]u_$1%AW~AM2 |a[x,-BVwR~3,rt!Ҥ C0U@ 1Z@xw0=~ۡ"̆dƒo^$w~&v[nrH^v U!)I`ًnI` i΅2YVϤar\9/+R=*Jy[rK_5M5qGo;=)eX=tظuؐſBC2VDg{yc3K^:x@DZE8Z&Z2nZj 3Kom$3qL;]PI p;87!a)U#ҖVr.k +Tfz%~.e~-)w=L,|HE{kT $Bn ٓ.g},_%8ڍX;gk'~FA2=JhauK:NtֲZҲ#A/Y(5J;1@\4}#0P8:`alKvbNq4#pIT 65i{Ws܁9ŷҐd/HՇKv"И80E oPŵK]=4KTZXW\BCZx$EF +2I`遦s)"1 Xy3P|0ǝ fvohԳN$5 PRp +- #OiT9K,l{ +V@>k-%1tsG'Fa,2Z\FpJSD(,}hفw(WIb +U PƽN%~ATqs2^hZx&xD 蟢 |4_7FӀ0kMC'lT5R_ðlxoty N*T-6#ڑBa,ޖTGBE O+V)syu]d`V2DPB2T]zp:՝ھ˱pY YO#Oa1k+8jj٘UC@ FH*}EtҊʀr\5KKֆxbr_ +ؠ}Fu.tUb@D6'k6)4e0n=suD&*~P KlsKx*Nt5_O+Pv;(.wqXP3u&xtPt]k-T+OeZPBDC}Ai,D\%ŷ{ieL!֞mnz+G^hN̂+VHs6.h].&6$# kB +g Ǽƍ~wn cPߕ`܊[) e0&3 816q +6o\n,d.e e_3 -!''ն$>o$` +Esuj%w[_EMTbtZT$wCIF╀f1Ҵtfƚ+!*b{a^!1¢.}gZ օ*&C7W*q0; ++ujRL7!,(i JIO`G7ɻC.{,®j^ MX$2[Ksc-t2F購˗pJs3,NB"2&a.XV}o裃|c;".u=$nb6jkFaжD> N + qg@o0QIIvJS<T||~#-w)Gc`(s_p+?IXv2 FVd|XbsW +DbOXnE&t۬>u5[@3ܗӬPR١0+cGk>Ɯ'}X\^ށ`E Ti S0vj[2̜ s†_ :"*+tr bMΙTe]ȏ+Jmw}n_ƶ;:̔?̊ʘ ;-YQ EO::t{}mAͧ~#G )a,xf2ȹ@J-خ-vt]9pQ)>3q!sH}H}zŭ`CVtXix +k>.F8=F0ٵHL)^"l<:_nQA.H>#BOԎ<=$*!3FdXY7䳼mS6~'z߹b'1b1L^nr:fP%tn@t|?0kg?4,Aw ]Fznj!cO π^f )BK;/06]zĤ DV{-qw% !caM" r6~okZŝ+*)VQ7=>\cˡvM$t\VpBj,Lg:P jv-Ű#.NZ&mwC"D  exK<ha&aVVhi17?Uiq[፲h7uuyQvhV}(HXO0W67gٹ1YHbP6ba$ۻ(a@{6;Ku҃H1vT*1y^5IQI3p#` s7/=AպC`ٚ`}_LoshXM.pEhǀ[>_cIrS17{7tBo8'1 LM"& 6fXvȳmwq5R24uכ)I6seKlFQ'Z]olֈwٯ7W4$OǷtb vxΆ2 TDfb޽ww5 v xɃ +Lm=XV|Zx WT)f)H$m$Tu7,ښiP&7y8O"/FhuiFV) ?P '?D@Is/wm ;Oz8oLCC|:ΣhZ^3A <*7/t[Šd~sG9h5".0AȞkϜ QtJ/P"հM7]Ա taX̓k-4X~HŲԌlx\5 ؓڠËL̈$g7|=³sQY9?%ĠM(W£@ٯ(bt `LBȰ Dzhl[.xP^IO٥kx R[@!fhlSMM|YY>5*,l3{m}%L#ðu/&JDLtSj:Hwݙ="C9C|6 =aQF3y*\⋆~ +`dyua^n!* +(U¢E'ReךYCe Rwj.=*2׆S:2f7s /kkJ.)N`o[|siZîV?J%p+ B(4x԰>+tH^Ge-U J@}"H!8--a4T +لϚ{Tk8AxE~A;`7x6inR墌99HbY ۦãQAG(g!9+ܘcDߔ͸ .Ke9&Lw%H?z|[P5-C1|A$l=z=\kcdHOK-xEDQHpuL))}?w]_YE? C6uVgXQOt"[}['XSdROKVvghUաnqgՖ q + I7Ȉ8Ň ݄FkzkڦD%1)&ZɿŽ^ v$[ +`t[]`Ȅ2Q}xC?S'Olv k =8oK>Q(К +$w|Zl3"{_[6wك›JU E_L}BNrl3p] {U& y;T'~3ш!"K\7vzI.HpS)˵ F[q9 ~1ՂV$ODI +1 [ v3P6r +`ZC}MF[lۯLSl7Wu [X lH*oh +EbEACcٍqn%NH,-:zF~} ճH~^_:Emxihإ|-vK l ?o\fh;doӶK:lDpAJac1Zy 5# R`o/)Ȝz=!*ߵprđMv[D;0N{9 QdOC%!lP-cfKk[x(^XxqsD "a;ٝ"ySY,"dg"L"h?%3. wQPǧ\=]1L?Cj ɚbH1K =M|Gc$< \GCxJ<"*<<)j0.bQ;py>6Kgz#_=z:a6;ѸhY@m{6ێ4l|mI8F7>&L iZYx X +ia'áwCtSMJ;;+PH:ǽڃ%ET%o^er-Zd5X;I=HH +pg٢0ʹ9T.ov63%W{~_S=sskоlG/؏q֏zl@'3-D}W銱aeGI4 {׸vr)[H"=_u:FFA遻4+ςI!kd3@ 5Zmᖄe(ǿf=~,1T?;x3*!Ϫ~DMvv2hWs8RzU}w-t9*MwTNL#N )tZg@o׺eۻ'@ݿA3ԊHRRϊ*}o6`gbNY-aۑ~ś}H >G/M(_&|0nn{G{kH=cLUsRq3r-]l$j0i:Чw * +EuZ'hjSC9t-t:>zzsL@E(W&`G_7EJaB@2H;x!1Z`F(_[Yѐ_1đXܚ\o]<NXž4&vBMR=WZ:P/9q`u2ׂCCG%(R[$ydi F0Iz'ZkOwbu5&9?b +h݀Ӟ*٦E +y$?bnC8f7>>T[y C){,gL ȣ҉&N@:4ra:fCo~B15ONZ(LS'd'N^{JUajX*| 1 nB)f vN9ٸU+c)LM"P@ }!-fϯ٧,ފnPTo3P]l>ẘ޹IiaSP 3Rt=JE/i1. +VBE'Ƀc*NA`ofADG/t?}{ UxfEaU sdq{jnpMD.ni,m/ &UYR -7@+JG_z$SGɟ$AJ>r3䍀T_\g;Ֆ59ξ#^su9g.6ejQP (J}9Rz~_$,e 4X/wG žp8Nr0t"rt +u:7PYLW +PfZ_ +D]7@ Ѣ .|~' +09hz,,\ +?ʺa8\>.ђ{^E5ۻ_m0S5+7^5y:km<%B>/ẇq)Sx-ruZMu d{m&-5MBGsl "x?QxMaF,^Q|E3o½X.~'Xg$7t47[yز%t/XOS8#"ffYުʜRYRgŎ,UicBGw2|5B(86ϓ6PWRAMGļrsRLI@{ CV 㴪3%Sӝ +رQ/VGmS,44izjZ>e--bj4=g@q{%wJ;A2*;.ip"3*.l=xYns]!^ϥ-LO 2eWqƸ~Zl[~(NtiAK +>e| +#f|bkfo-$.lpl +`uZv YpZ2h+^@?%WmySMѥϷ8Fd X;jԍ*ע+珡 pb4HX‰YV&[3=Bֆ'HEHQk-o-g -z,:tMLYM$$X/]fȦ&?ov$>Q_z8 gz^Oܐ~wy#-!MQn7:rlQb%2 +h$i)?AC!8jNh-k(lɪ;ѝBaUCenڂ,'5к;Ħù C?:q#mM# O;~'Na2Ps"BP4&x>ap|W>-?4n`u;4ʄ~74;!pmlI4g!]D?o_{' >zfpȵQ +TÓ˽'2{Pj,2j>ߔsG0MۨYo ͠ {I:8JnṟqT!Oy46Oov[ !Ūq@HV :E7?'PC˱Wb֖Q! #u]+{AnͺDZYs%Ϛz8CY4J<ڧCAX0Nh]UNv-AQ.U&mq=#-sX~Sx\}c[+&kfrF-ң7׳:{;vTc6 q%L Z-z +WZm)=.M7*9VW~\$Ah$C-1q%̒9o*9-L> Z_ucA OHd=řW#Alu$&#ۗS 8\>90 KhN񉋠=%r~rn067"$_P\-WjA JKe#=cR#1KA )lOworPXiLAe +S6˿ܰ"U}-6SQ4d687jgQEڵIa}3}(+DD5QI- +&c~_p,D1 +|:,0Om˥eǵ;?[!PU˓@f2\DitlIt6>\fu%g[y'tn%?M0ʛ5bcVL1J"N+#tzrZ1Q01NV?'ճUl7.TbbJADpxt _)k0nrጏ>b2$~']x"䝸(y%. e77.ة\cLķE ]e@9}jĽS,+ޟwR; KDpt# N]͍Gecw-' |sOnRRjRkhb@[J8b GT +K](w![xϿ07YųM蠥j _*1j.*8/@!IT!n$AoJa W Xߔ +V_nT˄Zц60np 8>K0M,Z**o[Mt4 fQ'֑&\gk._F1 )z LG&E6KqD?"w@E1<$eX +Q4d'`U+Zw*v+Bş>(o@f(HNHT~W''=MRxzP,zY],5 e[&b/g5Rfݓޢ!LVo97YȻQ||@X"9y8aB\ +@y[q8z 0.;ۨp$j?}{a>kڄ9kӇڰ +gpXˉB[$mR*| |NOC$ɣ 矏, RFB#c^RX:_a^Kgx g;@"\Ĝ'&hq@tTWWvUՙ,m<%u)+MU> /6B!O p[)q23yb1:UouN $`XmZ؁]<9ȼp(ڠ0Gߔ'@2ڌpׁ^~KET=ȵ +o)@)?cN 5 ēۭ 3<j1s AN>i +W@ϳֽOjMjӒȆ;uB7& AUQԖCfM n"ZسMyCE(QzcrȺfD:&9Ѳe5%z9 atl=^q endstream endobj 3165 0 obj <> endobj 3166 0 obj <> endobj 3167 0 obj <> endobj 3159 0 obj <>stream +HWn}W m0`Q6Xi,! MK#]1] jB1/vc? oM)AB5W8NfFxboz?C􀏚#aJC0 eS&43s0hhn6l:3H٬v'̣"xӌ>̪GBCZ1(uSoTԗY& +K>̅=<0ٙYYmCxb$Svd },nXVMIN4cMKC$&\»xxlfz2S ]سc93ňBia +d^VZC50c՚YIc b7]ιq{د8jQIm%ߟ@f:|*r*?SF)[lg$Q]XaͭQ$9^n"WznC =;BЀ@1lņu뱰Cn06{LjJդZ]hv9~2Dqlm!& ++?c7ȗw}w׷fN $C~.<#S +,em;L8a[(W0|u3!I a=aߛLO+x6%q7WM e"1)lhqR5c2Bzt*'JZm}QJ %#n5“&s]zjnn6c!YȞ +GSbJ}|V̡\ilӠ+tW_Dn{qdf6(,1!-?t`-X S"ILإ8zD^Fvaym-^ګ bʣ;׏7=Gm;XuyZ[:$|h*(^8&$فdGsY^q$YosR|!Ԫ"&X@Bfg6 *j0UPEAڼN!4Y}Ѯ1 bD}]KÄ*r׋T:N#T$0g\v)ج$:lFN7mQNXX 2y8`p~]𺪈|~%:Ĝ 2{76JRCM޼( j +(6.e^zS6yQmYMTq(@\E7-]rh4I,K/@x ^ + {VZ.ǚYFlWNHM"L˶`0VyI7u2’bLpjJP#:h*F0s$"F0b%iOJ.0]h \?pаh7vg')%I+:*bEJ0-f)Ai.%l~Ok'y6+dWFdoyBT&? lQIb,;Ȼe{YG ϽP?Yo/ĸ@%.!'Ud( QӠ~gyo˂Ho( +zW ^9 +STqI z\}ݷVdǥ_!YJY2x տ}0>nYHUOu>" + Qpm#b M9#,Vd|-q,lD0މ-8q=;?SgTUBĦRHĬ|Z׏wQ +U~^$Ҹ\kYy kB)ٵ endstream endobj 3163 0 obj <>stream +0 @@&Xx @TOշ 7iǭK?{,sIl:v=ݒT/B?uo9fZͯ31}v' H?p/U'[ۇaxmM:d Ȑ9]ű? ʆl+E^"֝'c*d6#,#[`5tedi^š9r^jt)W]רL/45f4k\x-J"VT6T{W<`:R/Qn錩NBon- ;xdcg*,PjR+2{N -^bS!X |H7N) r ec빤vcyT+iqVM9+47-q(' w\͉Ð)o/Ri͍ xo,= +sZ:8fqg +\X1V>Jf Nq?[zԀ2ű[5VOp2Z[H:K&$81bkJAnH`5^C qΉx%3gzHG?Q:lEf0<8EN'0{?ڞS ],\[?+Cw +#:c}͕^PHǤ%}㚧Rm@0}'D^+Z~v "~WzCy ~9Rn]~v?6>;;[fm੯T`v'V;=H38b8 &!~@3W&_ZTb-Q0)X2Ӳt?2F`7 +S97:+I>%H)ۑ]^X(1՟Mʿj7eYo(}+@͍ef AdVXXq! π8}:0H3>LWF{MDc c7Ih)0_zv,&]}h~3D:&\ +n&F-O@dJ7O~oǾ~}+IϳD}b+Ku9?񎥩s)c/zQw-QҊMN<.\@"t/֫ d6=+ώER=];l1htOkHv/;} +2ist<AC\[ d${[B +Akɝ\B-09tkT$K"k3L ~G\N FF):j\9keHۀ8 p_n] whY {i'ԸkF0_؜^ O̖ӥd})HElZAT;8Ј D86Ĭ}j;;u"LzЄ(p^BTuM2~ +W'B͖,-~XQI/aVF3z SvQڏc~3ۜt |Y-qǴ۟@i˽YOې +:cE6ǿfglY_AĉSNA<V.7 L8^4ű$/ ӑ7%m̔JmϣW:V_J5 +M|UBtm0h^2g#c37fwB_;M+E(Ō] Xy߽J-:LQg>\FY7 me&}泖IM)hs|t7OvK>bq܈ל?} +~qW}"HPj ڔ@8FGS,2R5԰KIU(mY;d8^Ȫ_,s強B +)ڥ bEPW.?RfVw?X%_.sz~c"Or A1.x[Dy{Y`>t9,6MŒ,Ɲ2EoCISS,5X2?Z%m]muA)&_ k=6}v-`pnQrnG Vb/|y$6$Ajfj:t=@ЦcO~H=q!W8ӌ;!Om!zӄOcމ5%g1W(}(aܘn}V( |Mx~;m[(7*)з%'Zgf) &PvIM|&Vfk>(Ŏ0o-Ay8d!/GG2vH[B;{c9.N%hJ6=m# +E]D'E#}eSŪi6iYGtXe +hf%k;ltѹ\cEXaeϗ}>jsV/XbѺ1=L-q:N^?PmWj2u |`=?#A47)Xx ,,-ȷRɨhU(vc +bb*on*rWANLr}E%{VZhWiwhl86T "x e{ ûҝpUP_G r߫#?uřuH#kb +nc ̯'dzu:-w;qׂ3:jqtXݏ3;TRQDG4C*jitl t"Z@ LDwKR*`׃3˚^w~dT!+&m[#Õ-, + 3 Kf`@0[A!7751!^*~pZ|^89x #=@a$"erv< vݤH0{P!1Z|1)al7n.27D< 7FȜJ$ VN llo~te.U/<'x-dϑcБdn-wuEr `ebDnyB͐:}--bw_ˉN'qTNhHL/(,ϨOp rȹN/Z|#M,}/˧ p5+*QD6c`zM'wԫvLbUN<!jךH,_4/kCBN&/]QWzƆ\mE=~(ImT؛FW6lTtr$k)ߏ9ʍ5_dD[ő8|kӎ t7m_@o L;߭lِ +貦6Bvb%edtnػW/= hճncJt% t?弘Zݍ'27vK7|:.}m*N2|%wg¸"NB!V8Ҽ a2#pp-Zt1Nf_HREqTPP2%гROk0@˫LeI;ʋ.kS:?mh7ىA86O$ ޮ ,FLǥZ*w)xaX&$dDD$qJݵ_&6>r5x;Dl .4u817:Cu4:#;n2g3|nH:uEѺ^&ا*ZȚ(qHl +gh>eˣ%8+,@>d`+<3.PTZu&S]wU5m[|$M1V7 aۃL^NTdi,-ODi.79 +rN5)fNɋ->$Қ%CG{)?d,:D͒}jK m(&< :,[biI$; &GdLj'Q)32UZSL>܃#N K }Gϵ V/2bgR)D"wRT- :IDF?7x7Qbd-| ca9[a#v@JԫFfƍ ڻ.p@2p<P#Rbyx OYW?H +휁@/L Q"-~NltEp\׶(Oj [o0$PySq$sۺ?4yzONn`}i6rv _ +W?ݧ쫑$)mË́6ృ +K~d w47í|3f2ՙ($N|dw&T"h[I؉Va 7sqA󕬉F)eCނR[ h_n|$6qzbh8ֆL;T! pbnR#Ez} yp)qާ?n7YF-.pk楐ljԏw[p̻> +Nag[BUer{VXMԷ'-2__ѐd6V|Iy)M#& vy.Ivjac> O?[BkȂu5,N3)̊ ,MlF/KcQѕp9Pӝf*b?3jЅ}םz \SZ4)[G ޣC^\;DJF˽n6;xRdSۯV½*-.%(3Y1=3_2MwRy+$1-uĐ46֘> +9t\p? +`yQx;:f}4bo+oaА]:0ziOӡt\:(]]_bZ7m.Ǻ 'К  No>NWv`JH=x5AúE (fl,WiG|6>.Lnߙp+ m! +F +>Fe] 9Z?g`mׂW5UGKؙ '{t;O6oʍ<6?H}VqM·±bpr(+ j WD!w+Bd iAHRs"Rů\!YyVk2E9_ q#S :G8wON I- ^TOC`( i$V3C 翁k1 t03]3g=hkFD=80.쉯8dKcu[yDz x b٠fHb=>lSkh6(Zmq}Yqɣp"F;%7]"E\ I6d}ZK )0×I 5Uq~"$iH "LN)RY/.d]h&ኅoZ_e;.'@Kyx{VYJkK4{SÔ~}nGfW OWwz8?ID( ɶn[|Rq@H~a:D@\<~6j">F' !RMݻ%> |TИX "1`44V25M.22 +@z[!bެqEV3@ޓloOB #q}tG/I  mxǯH}R*aQ5,(9.JSVI4c3#(KB#kL!H3Ar^ #WMstӱkfh{Ո>vQx݇^EX{2-h Gu\ +gmmvkF!|=ȵd=c"ζ=5x-())/}JʒJ~9gT<(D 8mNi6iOe}uįӐB_ D̃ ҟq vWB3hlWzSȥkxا&$PvC"j6߹% /%&j|Rީ_VGp: ^Z ~x1|S;>*%ImΤejӳxX +_ 6U@>ifm6Nՙ4v +/Z{A~U j4߃  +:jY>j[OK`)n+{A8y;|j8wCB"+Rp-d7W*fDȌDPu I*lOC"3ag9r4X +qS&P:,M孯5Pq#6nU=Ƅ-U_CS9A -ԙQ"⡴ۓHߡH?c!!u,l:I2 +MHhq,fZ;#S +S;F3M`iEzG5G%% $`*H54uwKכԍUhL@jkVpD9UuIҼis:%hs/i!L LldV~~Ԥa ׄBDRѱ$*RvVo{U㮤LvwB12QǦ]Y&qh HkbrEXm놂ѝ (7̩ZƤQ”xJg!楛S qF[Ӓ \f#.pbw.oSYk^ +:rw?r^0PW=ӝܠcS#`Cc7L\3jp )&Y-ҶHSDͻM{,O, #u@P(lu(3ȮnJ~ҌWGY,`I⾀H#D]S[ON}qHtm + 햵 Zh:x8f(0+ _#6 #ŹxpDF_!#NwsLY_h_ i8./I%Ě۷Ƨ'4ngB=a#-/x# +:J zť>Z VJ~Tmڄ͓bnI <儞m>k)X:Y=msVLkRB'8Ri7!Ȋ /c!$+[j:2` [\x`&oZtJ=RE $E\&p+ Gǽ=^ejR5e"Q/562)U_.*_=`iҙtDa찄2JCM%Aw{ЙREvnD0]C(Rt zp!;UT2ݡX{+qfEݎEhRxˮ)c<5kyr(щmC kYKm/%BݭhBa)зꌠuw%^LWLٟDz6 |>)<+C7?WEޝ.K P9bgNd̫mu=M5UYcCr"m/ +*ۃ(pu?J{nNF͵HDfF}K{Ld<P`3lj/Ds +Zr26+~mel4:4),%hj,0vRTtRA E|n5> 5.1w?h4}{i0/(Ez3&mT0}R + d~_rb60WC_kBS3F'NPϋQ"KY.BWoDV%<ҙ$8m 27񗫂=5ezBoNiåbl~W4G~ZŢ:&kj^:!Y¼(Ezہ[z=k=C4MD|}gj'{osvOzB\%?mg&E\a/% okV;lI}>D8#\PE~sľހ/n0,pJ$Fivq]қ?Ii_=d\\z%1XEfD9-"OcMea6,h `X8>h$7/7< gh_S^aMvYG.0SM5wދk K]̩#  t7l)oO,`Qߦl"PҔp|페DrDZY^+vr`{nuTf/ڹ0xLfBA.c;'`xubUkÌx,ǧR^?*kBݬ)+[ko9A닍xݲ~)/+2GlByodK)itH|~GnNG2~gMO(NE3#D¾pl{x3z|(td5_5#4X{%nT/9z4G:~Z,[lHxaOs.40Z&Qq ug}1izy]4::}0fc4W92 @ ϡd$2; ;lEےQZ B#\'<.1x}OyY 7밒_w ~7Z$kP9!wgÓƈua!5(ȐZݸb9 +y SzC 0cm J%3(ؽLb G|6۹~Ml/gKO +.-.slGaO}{ ̄Qˆrx%מּYsSg*Wul2iݚEFc`#`={*]c0%SX(RX\$|MhVݐP~TV1! ]a$ VIsr܍Lv!IyˤFŢzA?mykLU,'hwytv7R܀pf-!Bvh[zǺ0Kvc +#Oa mK` yU{;҄\.??L30LZ)}4Гp+mB~H*휖1ĶVPvw5K: 5 g &:8%2 BSWdg뢢$Orڨr<}h4ͤX+H;}\pҐ '}.Aۀ=$ igk6"4TW# @7(#y6h:+'W͋0O~l&+mEc`Dw\-B4% PԻx 4qUb!DK<~>.:g/M^$+=[5a@OM5ŀo + 2<^b>烔J*>K:4^X3 :h,^T-3]qȖ +]_W18=c)?#-ixMdʹ}MrwWF&CTcfpǚ,BpwڰWQ؜$g>*h!eޞA玁^3 ܁Ȝ2Ы-yG]N~Nʬ:C Kޥ >b +MY6hߐ'"f?F=॔[W})oPME3Ź:0jDV򁗼~U"d=OO 7<=Mz@#/gd?:KAjPOLiժ[am?'!`Ykѵ/ cui(6Vs#׌Y.ld0e +Զ-Iǫ+|A;s*tی?,0WM\6 +~dXWU;>Բ;< Zu+bFc)ZONC(>\_^#=3y]5.OXE_(K|I樦͐e~ś๜oY>3b7}3w}:E ˥ҬOsqN]F89?4n'ryAnO +|Ou6YNM^u P ,![.cR>OdThίy/!6Zrqx8CQVĪ-g/RBnlox,@g(s6K(W/B.=vj:yC+=Pv oDž>Z~$bҎ!q6ː/.Q^k0"UZ Ƙ3P͸r^$Bq4֖p1ʻ1 H0a#mB]x]S5Fd>ݼ\ѱliؿԠTGHM=yC-ux>z8$*?H@v!#ErϐXL}\:B ?fK2͐QN^C!kuw*9ONp"DQZl36Xr-Ƌ?,9 %M_@Bq~ +ĚDb2O%Qj p$ ܤ%w+/*_# W[dH_\{ks,s%5j4Z+^"TеlUZ0]D8<RzGJ7#Zz Ն@:=yEw/4KI kGA«`mZVW-mr¥u kr`e>TwyMDPi +ʡQg۪ԍQ"N. Jq @6Z7(T+?LKN3LK% `HԿқyOyvcfKK^,!U$+aH&JlXE,+9uꎛ3"44 [ Z ;HY)qh9Ye&bW}ać] l.8i@c}akoa!^8`S)$7G*i=? 3tg-^У&%a#Nl("4Im>$ b%<ƭ~vׄ+]U[ FH9&,Jŕ[_ĭ@|A'}K'} hBU8QvY]q'jJF4SU^le)=? *yWz2>'j 7GZޢ4X.5v0^uVщk +:: b*xnQPA$E|(zr$} ,tȾqS(?'(t (̅@3D{@]YǎIUa u`X!w%l$g7Ug +X" )QLΊC壖.[7ݛhy6HHJ ^\.NH/]{ #A2ٿAD`>3p~.6 %x1ē/\jDOyz"ݠhӟG7o`G°3Q&KdCDC2EmtWG}Yr[*E"G61K WBIxn̊G5NYAg4fHegSp 7j|Ck5@K{l4m;Md8hTs4.\?˅EDnKR\h'K1'`LVZz{r%Fm6(1̟klC_n6њ7$(p pM/CɍHNӌ@Yaۍp jf4+FH +Iah)Aӛ +i6aD&޲ %m6(s<1.h5p|`+5a'藎,8\Xw>@VS*;*8t`/ ͍֦&ELFI1حkFB,!Y7 )(-5#ĵV-mxVdM-!Bٛ){G-| ]Xe~;_+`8d4@F; +RE8}"l},۹4{b__U;gX۬f'4Ua5:z`*j1}τ|O#6fb|!_bxm`mtHjXA`@~7׻bG۰MGt<=j @%"{ fK^bA6mƊQ5rqCu7["npE:5l 5?T<_ _mq=l=/uU\=Z,jV"megϡlaxޞ Qsu%2YZlmj%'49xACZN/`*pG0Pļ,ӵg#^I%i7>'/RMс,=L?G#AX.q-~/x +SĀb;Qc:llhͦC[:Y(VIȐ27c9m^Yܙ֡`bKF %0&B1ʶP gEu7`+IEb[Dڋ':\ +ȩ^+ޡSYT7R]:r#\H0i̭S 1*d$-!C 4nf3=>_`TGJV9Php"2*WfO/ L'rzHĴF s% pS5a*—#y&Mbcbޣj&$oFhZB-RTRٟ(Q;dN ;Eκd;1yQ"`x1R63.'YZ8GN&@n˚=fkċs9󿥈֨#!]`F`0~<: {1rqkf}!"`usvF)մǹi6s]&ר _ +qV)2p-.VG8nlI^ #ydF:A)0^+=*񶐋7f1"wL +xG8PhT«n_~Wё`:-AM'bT'px(Ms!?Jۀlľ[qӳUm02ĹE^lcЭt:Ecw?K,nX]F'Xf|ovhL%Ӑ/+B̔b<[ʝ PY9ش5+R]b⢉{ǐ#l!΢#>ufA>\R>TvPd1 ȵq}5FFt<&?fR3{'N9 hTx endstream endobj 3160 0 obj <> endobj 3161 0 obj <> endobj 3162 0 obj <> endobj 3154 0 obj <>stream +HWێ}ڈE~8baWOmMˣ@b{>E6ؤv0bUN|#)%RꜚPL)̅7/?/߼ݼ 7P'DLf%2Zg&JYb໇g7rl'gKƢUv#٦jz[I$aLnG?lVVд؉To.w%z"#=;Nޭ_p}ݝ\Ӝ0b\pW*,MN9Cզ%Vktv9Nޭ9I||nԛ]y7 }}ɫW/߮~旷\2/j_ x+wJC#,yz1.{oK]kv^7qKH>VZ(Ci^>=}_F7`TX fR3f|U,3E 9Y8&J&Dk.s.A9"}aBˑM}˕܆Q4X'SFxk1\3A&ĶeQ͗v0#cwvY~>_X<4 2NO0,hGZ_*mu7gKݏpjdOrZNuoȧwOfțjߟ]|PqFĞ@>_ ,D2-a*~3C;A 6UtWjC@8{up .U *zzslՐ[epH?Ay,OZRHɧ嗺G{L/F83]*%Н՟Pt,{'pK$P@ + 2NVdxb=>4't&$ +;zx\էư,NC\y]ApA1M6f(3Ě̗o8ӲpO/łS|kd3{B,K )@v2@L!= w9i:̩.,f)%5أNbO^%#Ц |&,F}VҠưʀJ~(L`fdl%JB>|l2R][o~ Y}wW/ͰR)Da(&p[EǼm +晠Fbl|y$}x.kGѶp>4;4..C0ly`\Dv7gc&B%nv{$5q89j[ |N#s-` TǬ+}=/OXO!&UU9\*H)S )R8,;Li@ +N~q$V.rdKd9'PUt yaJ\o*h9sCnV#B6w%` EPW%tHn|x}]A\IM_j39, +  CM0ü_rˌab)~0$5 ) z,`!#*lnT+}3`nBv_ .QU*9%XquDN@#O! ~o(0Fy&#EWVXPԑgWUYn|QTB$<M*|rwϦz[YF-FGo,{sR]#c͖!Bju{l9#r5^bWREߐ>PnH"5UDk?v{25=ҋ|8 /N|I:5 ZD[l1dl$Cr<13=aIrvQb`9kx@ϰ}>?VIg$"X@>Na_5!9r%wA⳯/^gׁK̓ȝs~A>.@.h3teF>D>-H_ O WK5 qF %DžFK\'/)HQ^P~𰏳)Ymte3KmI`C29EKtZFq&9%gCsJXq\ Bl'`:,ÞJKR`w,VpnM!Fo@x=< }@xl"[RU8 Kl̳e]>mjK?Psߥ򬻩4'Raew_5c͍,`b}ݓ@Qҷ;r]WT ~պTULj5td~Y慨dX.C\e d< ,rC_k ?4\p:YY݉51W)=vb#aZ_vI[%C7u3/Zyݙ_'j endstream endobj 3158 0 obj <>stream +0 Q@&G4 Q Nl=HXG_}f>`p{~2Dzeѐm! Sf} sXG=pf0<0.)OKԋ-8!j|UԎUP`iȑo,&!4ʮŁ;T o2)aY|N"n~:)}T] 2å!#VVI*<_Ux}K&uR+_HrmTh;,؍^jUio;,, lF%12>R x΃4 {+ M,w@Ua"/|yLG'ubD9G`{>PԢn鑅^Q,gz+WxD) S +‰z4M1 **ECH +J`ġ`g~E~"!{O|W NQF`ς+iUt//9FlD | +Ƴd;U;7BIª%z5W1G_T Gkf#T8(dbD&@`{!ssba*t"FYwJY{s.wۜEU'C j~GwTz!TDgMԝ.?ѭѦQ@UG[ +ԡ:v%Z 3@WȹZ a}_*?9݈&ЕE󑻠G:; T_pWj!vbTEG, +Ǔ 4A^K 8OME|D \^2=2{*1[תHy[io_dQUҬ*\h]5NJ>ꦼēLq!pG@m0w\[q D7i,DgwoZHgCZxT.414h֚Vފid͆C*lQtUy +~sO!DAJCih~)ߓX\wOп=j/jǸ`bRQ6PX}, q!mj`P"fc?mJ~ I Γ>SSAE{ifm ﳃXc7%k"_L(jZ=h"T[!^SoB$/XKzY9A<ۑC$'N=?*s8:)icH@+T=w_}@ĥw4ہ$wY0<>/gbj8gK>k ҤITNDtM"85 Z2$YI#OXTyC}ay;dSG`11=~ 8O)b!ɵ5` kAok!\GX.mw碎U+b'jѹ1<ĸ$~G7~-gX)7pURsMD^g&>Rk(pWsP@%,V0zs[1PHUš|#9wvviVDj󯨧\:vZTyN= y{PU"=<|B3"ڞED?\E@g*U9O +1Brͽ|m Wg}tY6B h8ݮd#"# O3Q}!,kF,L+* 폇ǤAk$*ra7JtR&Dvb&)r3(c +3fvߔfM``Ì-jmnꮞt|imFʌ$yv\ +|ȅXeYCX9BYa@{tI}*}%>Ӓ?h@ŀƍߧ9kWuQw`RRK~$TU:aLB`T4GIbvw(xʐu&5,9#k|TMN1ɼY|a{ Etǂie㥰RjBg}TLɶiAN^SYRyPEp=BsGrpCL0ú^\tfDpc1ݘLWRn)Wޥ9&:f`8$jUAKWˬډs7+l4teD QKb5}PyJ  Z2BһIT>R@IO]dvl;,lz/iz\'jGPQxLZYf4P{#iKb?mMKu4'.;6VA[=Av*@ZJI*!.7sN4;&˷dPag{R*%PYs,)|YtBR[F 9; +de?Ow!⛞_WyvE"׶y a5}͐y$SMyD H]ƈ|hTToZ5K⶚m&J4XoW9ν*ͥc$u4!x9!8-<9!hyTTÄNdVꡢfNc.Hzۈ卮pq^:`<RR})[iO +z5wZ:e$CJ NiX0:ig}2@ HkW |Lp8'!`dboLbdWdG^n ]6/-|}M\>|ImX $D=+ӕ@N? +K `jū;mL#qnV\,Ž/I:ϥi{7|)Z3}q?aa}O}.#o'\‚!Rg":-pǗBY~LQnu 5ɟOv1^(ESbI}7Ɖ&b9/>ӎx٘0<1YA M\g" dO?(ZɌ!\g88Y݄ .:XRtߥ!h+=^"FZp@r~gbe~7)Dž૤kE#lXFBSj"W"E&0A4[?ʻ;t`hJdިh?uD֟ &ò b$`g>cI3hxL(>{{];04JhU4!6e;(iʛ@)6O\{h W΢5 +Q:](Ò.ޔ`~o$`8K>>rՒ)SA'KTk0yu9.Βc&^QV QSLog@CrJp9 ~Ηc`z~b.p,) wB~A"EʉBc%>=+ /_$g=cՍO0Q35z*_hxnkHa\#l-+h+;CRd$<+@8)H ܤ^ +W;eQ46:њ f=yx#\b Z[+|YVs$2`h&Kn&dbW2SBym8%qMUɰ]cbgQC^zyI[<b'{9OO-#_T̥AމԒJMdqcIћWj~d*}lځV"TFC+/߷058Ҁ2 Z0ܜ X8ޥI.#U/ui$ +[Cg\"b‡ls(' q؀FiQr`@= `+4#< "z--Ɏh{CP;y2 uF`zdh: ~s&"9IE(}`|MTd$]*?=l4gȩjz.WK gT\؟ Fy$\KHK};U.tdȚ)|,r_{ж^f}%N!iZ706?D.OUk?Gj-y&KC,ȅEKS"R+TŃ  Nרz+e_tԷ.)11aÂ}9Z9 /`yk{Q[딱5ǂS,:,`~N:)[Kw@!x/SÃzr~suhsgJ$KvF(~&cm٢nuoiRĬҤjXG>z8MF^T,ܤ[|,pHQ#iVn,o{X5A2P//8cWf@tf!̣.ypaw" 6K"QT|4mWmBl@3J̘ j%Q}wxP`aDq8 +ZkUZA/>V,P4$ F陖Y.b7}q=8˼Nѓ!ϸEDU*1Z׮j '-T\xFw3!lId25YЖO {i̒@4WTh`N@Een/3;/ڎl*v=تP0\4C׻bLH^pŵp=n_iï4"Ju2鄟/0C( +)e^f2 qN#)*.IktX_\'up ʾqJ3 )W@O""62-͐UAE^# [W_wv 5\W5k"cdArRuq5%81t[6qD%go 8}u6O>KsܝV:5<Pq7B|jo;򈭐@T@lho:\brwvYՅ૱|%x9wd)&^/G\k坐}5@ -> d<}BJ(h#emd#'Rl692?IIY6W^8z%Foq5 _tq?PX/PTfֻŞnd!Hs,Axxegd7 h連adbnq2PPgXϣ,1@'ڶj$Meh3]1R(CG#]M75'aO78SurHB}}2wo7[=[[o4\c!ne;t5@$q>bo:f-,H.XJ *TEc=u1so<^#v8u0"/C`&{&It2@l;_tGpKMRߐ`ҚICi1M@'$,] +V:>_͒C"809L d+*JU)xP9A7`b\2&֧G{2N5&VJzi,[W0 P5'~]2m$լ3f2x{p?CBJ-?AXD*O:(С615 GC$"vܠjٻxM!HZ?t@uAEرC&a +2#[It\+,/J{xRa}.PF '\<1D3cXw'j6uOda,܄3LlNKe8ɮ<ǿ溊tٶő2#څSgyjY6Lă'Qz}. IJank>].v2nt6gж$ FL}H%=a-;0^v;3-PNZ<vdqjEQєQ/9")8\Mdx tEKXsی`4L)\LRxQ?RF*a-jŃ=sMݩ͗6 _4/CEWqb|zmhWGȽ^WFW#V +=ؒh?Wd&YhuX' + {p WK|yWC MݴO%{LwP`]@C閭yܤݫ.8n`3_U8#rL/uV.[qt6 +A#& ++9DǪ-CՆr?>htFjK 8`ψY nVh!1g;fuE}h25?%OW>ɣC2/OeLatC#0\1ol'*oA-~ +s:ĜJ*Prݣ䏉iUkN]<֙ s/9 @+v-ظjp(+P(2ur$602X:-‘p>剻UbWd/!Jib;@%d ҆pPt9O-e!/T|iA xrά~1T PՋ)xzhrI'M)F*-վ·WUQHȵ5##@60|@ ν) d >/) u0=hm6۴mE/"10WN_aN(R4e`T׆9Lgl[4-.ؕL|Fgo۱5COz*E0xn[D‰~ƻKC1IFa +7i[R&8{/$PWb`d жU۸7ΧIq m)iXS̫M~/jd&s^1-\5&ĺ!ka*We(o WOV=%Y[Pz+F|첩}ޡ|֑% d,wvE z1r|wo[͹>D R(1GK;,})@Uz|I3fK!Z0~j5#̃{-Ttކ id/E#:-J̃ƊHEe8?lrj~ʏ/6^zf|S[1\SX:JϾ` :7>hJ!RJ +aE+jtEx:AB㣱j+?׭s3,ߢCH_&nI\*^{}:Kjk~#fU-7ALz-0u"4,P +JLNʋatsp`2C K oZDehK Um2{VY~CI|)GGlOd.?dG_Aw+qKcOqNRK9CNݑ'0 ZDZs6Y99, +eO}]97hLuxLlIedoP>H1߹$]=2{Ckw󳸱R|*Ur1 Ɨ hOΓ݂ۘpv1]zWRv)vZw1fL07RHyf/hH"*Vh†_ a1phB99P.X'm)eF?p7ء1em̾ o\顷^ +/i\aU6rJP5S1yԃX _K!Id؟׆ar Ә2u7nJ·笜GUNfph:^/ӓtq4Hؖ#ONnS,d]ΈsPaaAҊٓ"|O +\L nk=gA5wY1EB+x!lx[z1,f 'jpi@ ȡO2.[kH=8S}D 3qPle4EI䖄踟hū6%B="m=زDdsTRo23YG}QD`'n <)"_T=N7߮v7r>9`K2 liZ] UO>v4Uhv skTJqAk]ۿLJTϽū<Գ5igoRp0ÇD3K3CG}`74Y4'1pe89DR5l":0dUPLxު +m 0;+p-ˢ~Tvb%$I4$k_qhخ2c>[hǯ*>R_'ᬏ6FuiG}B gle$6k "RN OQ!1",_cmTh%s)ݚGwRR* +R(,:+wvH2RSuݛZlG79p paC̣mzT9eij7ffׁg(f Hjn;*ˮi׋vd/x)@ +T7YK"^H7pWFS/ ȩt]+(e}e ՞Qx5Yo>Cǡ]J4":h*+ne3Mn;A $ +!= y%I~ZS!`-uSXhu_:[yW1;.֠7i \AO+QNGRx = [Иp<*ĝcILZAN*j$t뭊4TblKQ3s~ԆBJ*Mmq1Z$yD+{;xwc-ndC{oS $:P>fbc> +Y#3thmT_>>j#!ɕr`Se\R T\H!^m@v'w#FV<$놑:V%Qh5|}gɹlKhpSsn:]E[mny.t0* f1 ፉM~﹛U71DjwsJ?d緸6Yd!uEE=YXpQ9 +(Qx|#(?[0]꟥ +` ^sn鿊0@$\c:J-#%=ĠrY_9"'*1$A*&fJ2Sg"8+*w B;KdUUŒ`@ś}AL 6,N2;g(7ɸTTxl$кSE<$twˆSrU71'J[A_ayg2 sq! JA.5JAeT߲Ĝ8̧UoC(1a&wΕ"-lkҽcc' (Dp"bq>K] r]9k;*(ߴZS/4JX9|F!xދ"a<(I[:2T9qq +aP#HҥR2tm!`(郀ڍkn5hLa q| \fVVȫx8^k㑵6FɊyu@05q`d㊂ds.8b;ѫ9Z!'p.{V"gwHHwx^}8*pf*6ߚEkqԢYŃV5eD\%Z$4{,Ts4Qm qUa}H:hxead[Z2B9j6=y0"28qbΌ CZ` կ)"\i YH?MQ5VЮfp)6)ufЙDܙn94$ +gYotƖYT=LH y'=YNp%\#x,f!N`JDj1hш@*ޏw+Es8atwfcTQ#wΔA<]3y(l^5+/DZcՉ,{;p*|t@hOmd6K.ߚ$8˨@==w =O5PsAN:Y|Hrcw{~=E.[WMh7Sɋ U!zbе&G,p9O`qHbjw'{>9Xlx="VkWrڷw|zrvbgVQ7#Շ[~ИD[NIkID=F!35BPBo $CMnW0 6&.i;hM +*P^;e2"oÐ6?7#=Zj7ؠ96̇#<@OKLd5W@{K(Chg&a~3)3ikX5zU4hǚrܶp8ą.3N {2ZTRR'm `Vf)GIP|A$GiL)h\;ވxs633I`b2.@57.͞T^Y`UȂWAr Ҏ/{ern: żDe)N;e_yeF)'0cKCfv5EI{!Zx'P S,u-HJ1nATT[@.1 Fjݬ6R {D>e,BYhFPUq[0($omVzYw + Hk2JqO3(D4Wj-@5ȒFU*Ã1]kW.ZNm +s+UFFЬ x~{ >~c¾4<2K+77*?# mh3AroVBp~Jl ?!k85yCseeߡo ou&['E v%l:q\7ӽ#5*JdF2[*[+(MFe:o6 ,!OBϰ9C`f`P¾ZѨZwu7A>5  Pe&#n mzR{xR+gᡁE1q{~`6r~He+j6gWxʌ\?WK0PCirX` ^*"@^Uq.@­eΝ5IA`ʗC%s +gLXOoyɿ8-by36>mct5uimzj3|sDM.8zT+wָJ)a)B ,Q0J& uƅbE$R'sf'a؆n1v22~9g-}ЅoJjE ׍KeF!ki9w]&w nZC6*EB#[x Xm8tƱdJeruîΩ7F;4 Wk%*VY9$qXЪ6$-7fv(3LyJ, !딹L\=_@bD}S1xB>˩'u3k[udqb)Lm~dѺ9j^XsQ6Ild豆543fi' }.F0Q :$\ޕ$Ct%l4k lli~j|z8J/r'fr]i0dTiS٤T-dDY6r ,ZxmZ+Iɲz;A1~ TDMxxAS$3$u%t(.cLr査]V -%X."`fh;y[R5gi,(\{9_DbF"1Bw _T2?G]xs\AfSMp^G=%Y-rGM)}CH&b& +3nr5K4Otjᑘ"o_`X !8',Rxp&ifWIk7n8F^]OB6EwVia)9p!o֤]Hpħ7MA*1#]hh7ld6XW+ze endstream endobj 3155 0 obj <> endobj 3156 0 obj <> endobj 3157 0 obj <> endobj 3149 0 obj <>stream +HWnG+(QzO @H< hj0IK`^fg9$ۜ^zU:Vj(\S0QgWnRͶWÇWd҂ %TE. Bgp[Hآ\L>wߓߜ7ݣO꼴 .൷mrw]132;G7sc x7`%UH)n9WMpVS;S(Q%ƪ,?JSL*6p~<-;C+=ms Oj[ǒw!Oqzw_l_%_1\_7@45Mv ҩ 魾;o22cY?5...a:7m[["Y' o/A)+2w{5C'M2U,:eܞ @0oE܎,! ~I3N,MM<0"Adq'%`Uૐ5_9yv0cF +1sx >zֲ]폋%1T.շj=}`|qa.֗rWmTu]mv {fu`A _ sjI_p dqYZ_&1& ղ񒬛P Ñ?(~9]k50]dzx)-uMKkrzuNKL'Uj=<4:C?:"PrYi=tqf\{r@x[NyҭV۽E2 sa~\Q=sf|h2*'r\4U(H(Ƌ&6H))1i&hsӖf5}R6/tV"-oRJ FiJ.҈Q>d1JP2R6zu@)JِtF\e6gzf:&E4 .I '7E" =>OM*:X͆~5j.A":>L N^|lMy3 X_l W!JƍCm ;J 06 ' ffZUWC-B"Y+70ߍҭtnx6oI3fAXhvTޭ-w/IP5fDlEzXtya*BA &yZpk)- +\9q^V垰O\FwkL`Gp9|>'q#Ƿ͌ ++m¿05|"CWh+O +Ęm/wvnkȀ8! lz$*F ;4P{(YWk=˻ׂ?#^y{3ņ֫j\M(!NT0D{?_^_}~4$MY}!ѯwWǦֺ5Stk27.$!"NE_xOԆs V'.7 endstream endobj 3153 0 obj <>stream +0 D@&, DU>s`~IhF;2KhwkRQ'Ӗҳ@:#C/v<$7½}X[MO}_sy%BXkAb+ŋ\H"@j(鏸 T+U׺%y/]^G>(%F MA͎7?\EL@6DR~1ejs頿Rg V&_VTZ:ـ6IQ1%֍+)OFJJ:5OT9cBXc0>e ?WPϒzDEg{wYJBL|oA1bb<⥽c߉N9W'Bsq ?uMx0*Ԛ*]J,m_LNk<[K&p@BfJ¢E*` ѓ65Yݰ>f4Ѓ3!7Wd{Cf++3H|X3o^ mVL x-_L.Ҧ l̸ZXEw0Dq4y1vko +F! f8ev(! &y&%l U%e^r/Gr|BMo+aӌ:T!NB>g}"N}ٍR)v;C4KOirR,NޘHajnjla¹3иոmŻ )~Eؿn7_)͐:+K-u +Tt dL F+e'~, f+<Cٔis%I1ifφ1QPl-'mI#K,z" %hYÛ_!"0϶#eŚH,cC+~I\+%9D2%,B'=0DA=iCoĎG{Y.W'CDA@Qߤ{%L[ླྀuG/4, +̻xDJ©tg,=AgwҬE ڎ.p՝f[3]aC %/Q6uMV1Lr!'^st7 iu{_zIY+>A$B[_1%ݛ80)EDYXxޅZ$}U6R]/nn]L=6\ʚ:}pQIu6S$Nߐ[ExSlOG9tV:6ȥL|z#pF.yX|g|Y/؈-Qx\T_OxwQdA1 _*Fk{Xc:AN4+yﺡBF l*'^#+=k!杤! [9fMI F [rFZ']qb*ĐԹ"р_nz^-ҷ{)>ڈ/XV@UTq'  +ZxPJXm$c[8ģ%u(Ǥnc7F[ +^x +:!naZdREZɨ;<Ƅh3'4kUTAĎNڹ%K>Nm{RȺ־3fSwo#c/5y Z5}UNRpvZI*ދC/ F~To!i,} vYh*/,Hk`I^G)>`j 6o K5wwɐ'"s ,Wf>;o"PB: U(W#oTIlRUeĐA=}OH+*g4YT#8 k(%1Rl4ܥ"),3RAW!ir_AOWy@  +cv]>߾A*$;kZtSBHOF`cOACTЀj[>G)x [,!>jUL[Ί&3X]QZܒ֊Jq/gW ٮDŽab`hd +:ȹVS0nG#B+ۯeeKg2UIVRS1~"~5q-qz +eTW:tTNwy"Ц^]ߡ)Y-XXT1o$A9)|a_=1W KL9R TzEf_MbM)c%9iڢv'e'ٲR:鞸}E<1`iQ>}wT_}SY-`ia}~[$Uއ÷ umpBS+nDAw=&Sw/!^8KLZÏe87aOU}ssv8j(=0"4.Y*>9yIY`KRY,0s:frUdƗ7oWLej2'm;xG4bCĘ=|Y3H(h$9+MO9y e) +P%FwH=IM ɚ%<6vv 0Kٹ\5V}Q\>GI'm}A@yy),N4s?k>e&'@S@X^ ^Pyj%K ?d"1eV5ݖ N#8oKFN|oATTC>Z 4l$5-#1gHE(+yDpVTtAN Fd%,a@'=<6^G1+z0Z)U >%Ӄ8IZjBfJuXgCN#AW8[֫jd"{Ί",cYrWZݏЇ/gjVҧQQmŐܺwc9xf> u q,`\U +I]*Jj6ypJ&(W+߳!3zA'g)@ذf5R #C@-OM*7Hr(g#>~Ǵ܍oN6{ Asҥ-?pՂK;ddTط.(-3 {5 ROgP=Pàq&z%&Vr\5Xw7ILf^IطQ_}֮A赵Sl)=Rf KKz [ @`Г F8^} +4r2= wWFfy=ޕXHf?xJA{R%馶d,E ! 2 +?BV6,;&q[EQ9(Jo 9 +2Orqhx֤h2(DtR6av%qCCk'Ȯn`eN-۝?fNAcf8^ޮA>v[t2!T6Q$<5XjpQ ߨbƂ ~C|9D^z'h):9.o;hc;m Y*p g)}lj7Ku%W{>ˤt!c }\I?uIZY܏|t-$"R."?{߹<\p(/G|g*alI>ǟIpFҐ9Z鷚t>uؒ+YP~in!. +my)¨ +m!Y s/@!/B[w#L [/:֯x夺7D~+o v_dE~eXSZ=7{)hr QR3K*=8ILTM2!D' +8Yp\"2t'L)ˑ+|U守oWЉ8 HXGDDm$Vի @,o M3YbXLZ={$"Vъ]05$4Ȯ&>ϘJ@(;t!X)Q+oC EQdd%UGZk]6 7px_oݏqcuZ+*^@-:MxsWaڦ8'̘Cr;m_p$NdD^0Z1Y)-gsL]A՞J!'č(k|$sєA72D&278u5 -m/$2QqyB 0,_>)҃Se|[YwyW &l־{/cp6_Xk~FSo+\ HE߿U@X.AvKl{{IvUQSWDG`>isfWIH[,4M<톉ߘ}\aCѥn,Biy5Wh=+Cel0 یz` +x`QgP1.jp^, B. FRe.=!%y\t9j;[Z#?@ sh"!2&TO P)r{?ʬ7S~7?X5˸ gk_ +SOM&YKL6*fLz1LLi:U2>LhR{7n䠜 j8 +<\#X W{ sz/l3X3J9Toe~rUӂ*XeI=bdf;-F>{aU+¶lq錎Wි:$dI2"~ ,RQ'o \yEYI?ݴFCBLK6ə#tt%,Kڍu6i#>2xAQ0' BDZ(HGAVB,ZIxŞ]cQhO%ƗpVGz´-FNpYfEj5R;( /CXE12Ʃ Ó0Q(>1 +꫈˚>-ݢ$5sPTҫb54(a_'<8=慖x\` x1x߮N\J/~Z|Ag:?>_xrCp\u> P4:I@\ ĵ[C[ӎlk7ESGi?*&öY3z4?/1.ӓ^tC&0ԳނGqOvpgfL#7O-(0I5|V`mO2GEH'݃mם[n:#FquC_` %|efPD oŴx6A-Oᒨ毎&|P8/q0DXӁ㛱NQGŅS!Y9>gC>dg"-zoXYu6{] jVYI.  f߀ub#Ifa-R֣BxB}V ր AX}-Qm _MH%eh/U'{A7S; eVnwp@[a1gNV02c˜9}jAW2qAI^ }2 KHY73~lsԀβO6-c9W#1I_3uG"/1ݴ"ZcKSQmO2ra4/Cb;<6ĔDk47byқ OC>\Egg:].V%zv(C\;୊sq+FJOV]$d>ҧ`,f"u:aG;Tloò[dgӉ:SؘSѦ(7=OHx,EM1u}m,Jʳi)kD_<"ab(̣Xy%$Ќl' ZG]*<:! 9R48~,-sR{t%L8;N5>"%G:6~!5*8[6z]vL{fѨ/z|(gCuQz(Aݜ +ŏ|N~9%ou<:]؁cy&HKN쮤dg y2hD"<~~@]1XH.cK#Xty*ԉ c~(Q᷵]uPb`9Eu dawK%@Ȍ8ܯPinhKnGL|:[U:w}@f|vKE%M!r }wYJ> ?h|hEyVQB-)R.&vVSop .sfy7L#)jkq=D2Cѝ03Bm/LHu ``eUz¼4KwӉ=Hj^rdW !# `LN54d]g."Ija^2hQ˗w.gyXiA#\6Nۑj끰OGNՅH l(/Y$xs f=q:, FQ4')jt&yOn3#f)o>~ :.-\)LUVlϴ[!\zt"*r%]g͠xEgĽpINj>'PSvpS+SFi5+c]BbLl8U"Dhb xq+v+{T·z3]\(* .^ *;Bl³׬ɤ)!}hН(#w7P: bNS*RxwG}j(T%CNX߆_̐J6 (JpN- +9aDXPxKzY +"y!˄CGk2n{>Uhh85̘eU?^o4y]? +}AЌ`Я>@HAhEeq:Oe5ܢ+t# =_iug=WŊyoVjb:m@BK#Lt:}oΠS` vu+J nI]GYuX~Tsm7afT +LÌ%h+0J 9(-omգ;<$+r6uN{$y~ZQGhk16 3g@žH{}4Yֻ@# 7E"ކ/v/PMy@ˇʼ7hd3s{&qݙWkT3Ȁ~ /%ZHsioǹ,* %pX8>yhZ8PjgbժAaδ(GB4mB*p:l氃b2 =4IٷԾ#|^#Oqu8gI<2d՝@aꄳ-[o&j$T73Ɣ[f)lV}n6$ch 1{A^ zALHj~;õcyCϥ(")d:+ͶtY7VN!.(?K`+&IV,hrwݹzis[_L=?CF<=vajO{؊QV; !m~xmoaT[, 2j(aGPhq$ҕq2#}Mp=so傓j:$#VoDWͩ~JGqȩ'A/"\N1&W! +ݐ9+ML9eTB^>n ]kO~,qg0BPsS +$a0h\p֓n9z@5)-r|jaq*7=d +8j7+D@эlKz0{z\/C {_R۝ G Q&B |?3{Xc=A.Ɖ;k?$g !p{ոҜ|x]o?1޳(£|a%1N8k]>OP.mD kY[Ò6O.RT?Z.H)|F 4jxKi%u5ol~JuӃ匼NQ/ق+|~W)^Clp +a %b9;ϥ@%:?c@׭0>Bp[6g|رϊTfU9!M-"oV҂{.bF6*3KGA  }YOf,weCW * +.KvUjhf/@J=Ʊ6IM9ub}h|HYoH?4Y!a +^&M>^I=eeZ6h,yn^iziPCa;,SAQn&] :J!Ԥ!^j:iT&S79rt̷>}=mߢIgߖM: +}v~Woh74^1 +=~h壍x//j~};TfM6;;Kf"!Y.LYD!Y^1KӀc-VjmJyE^pWK]7◫Px;wdq$n%ĭ)He挩t +ǂ[6ԌeH&SPZUS?Cop] $7W'm\䘘MU5El E:) N. ,Hc< 涖}TzbYZUE&5 >z039 +^csU=RsA1do %t1Cߊer -[ P'+_ܞzw)9X|02MAtR>yM~`k^<#օE=髛9cVHb%#N~a+*) p9ND 9dJL M[x܅rRk 8X7=pCu͍%1P?T:|+#:G||wMVgp/GC6"(|(/XC]/{ 3OuJ +F#=3hc>pC9j/(MZ&\R5.'B꽇H?sZu.Y(9QUkgD%~ڼb|7yx;Zc I R}>|o G0lFr/Q$,6:q./^uQc,_8ۗHvcōy]$ +1e /u2t%/ND`8; ]NX6hXլd}3gx^#TTY +eefw#> endobj 3151 0 obj <> endobj 3152 0 obj <> endobj 3141 0 obj <>stream +HWێ}߯GR=  q"MU2nz.)I$C°źs-^L#%,Jo^(7yykwj ,'@+'CVxI}_VPN8pj&@)ᮨ>wIO!?w0}޵fhtI*dŧg'B/EӺkjPKMS{Z˽I`< + 33xZ"agI\Vn +QigmC B^ I V [n>aVx).mTǥ4~;4+=đ5U6vE< + ivۆ@=jִAٮkJ]jfI~n7NӦpG4{*G5:b ynU%[t̗Rn`V:_LnVq٥p ."L@Uދ9坰82{ ǮDr +e( +)Ξ5Du d&NRi2d5Hu./t,|+fpMHE\5L`38tEC,KQ{Y 7R8+(f,-C +$F*D?I;Gdy0j*9ʃHBh]b ˃@<Tx)-f<,DWOYYy: 1 % (: ~GbOs ^P$e7u~6H Xvu7DOdNhkZ@¨^7P*Gsds@p<@7Yq ,zHMܵ]-+b:EpRʐv=1vR +U} yXv+kbN`}݃n؟RWcZN$ fZWπ䦵FL=RβLj\vU3@Ҫ-f@0(F4'jV͘U1Im2/6Q^O(]?\*Qרt[5 ˇqpR(BNtĪ96߱И`>]h2AO99>T RxB\CpE!.pg!Br?)x&3= +BF)DpBav9ceLZ 6(,'yerx{֕vvyEk\WRRLOye 9*| ;Ѹ@ R-_0s2kQHY^9wP Uֵjcf7tAt&p_gyT6*9*j>eDVR' \~f=]P$-+@RO*Bb"}}ۻ%Qyg/.0rCx)5aw AM}qXLRH3SMZ W5Wo'4:[sY,)b5-"SQ3(nz2|@@L;ޮ>1xV;~ _`o) ]ɴ_,/_ZCwS__N6T.uƼlWǿư_79(R\|Yɤˊ7O{;șRZe tvAp[5smYu\:}ۮX0Xp /O4S|D|$5`浛Դ+5 +4oVnrjjo4j@0r[°Jӡfd*[ +{="-hv~g3Mт4MIQm]==q/-w%L;!7jƬei4~ѐ%kZ;pU>V%jIDkwo?.gn - E5(o7mwwb!e +{ endstream endobj 3148 0 obj <>stream +0 Q@&9k Q'AB# *rr"y:39#pk/XbD+{AS[>1G8 +:F(bgw]< 9Rе'k ÿCPW/;lHN1VjN:Qmʬ\Sr)v0 w2[B/`X߅NRGsVW#nGj4op{*c( MšR3bi]z\d9)ٍF R9wmB+ف,G{DT [dǻɇW]{3}ߊ ^I +"#p59 )[@'} Za׫~Lmv񉹄uƐT2ˑ; SR?F^heA<(vQ&BѝxѕZ/cӸ-_*m4OwHLzŶX=FD>X(O򈿃c9aL}2q<%GF/ +;jӑ05,rc6j۶M"#BKI/O.U2k" +eyuz !$F8$٣LHlտf JV]$v0,ffT%}yRAZ:~y1"*dڑ19">vX|{ ?_Qq)!U,Tu xz.sV϶2K0Ui5,+WM7K?JhvdStCt = 8Z^5,`$= E +ԴS';Y +NyW-GcqvSr^Imqnl@ҧ42=zwU!3ǎ*b 8q34]$ xWqBoկ9x8cߍ)&!t+򝋒MX2M3wS*2"9Lf!?>Xaf <9k ؏)cۿbj 4IKOsr[gKׄlKCSH{B:^&,Dț_OV\aЊAI!Ckpڂ*ᒮ;ۃR?p Xh&)4 T2&XMKKؼ-cLސIggNp5^6~چ]";pOuA8T[+`d)0z*7p^)Z!E<5yׁ͝7Y'dC i{/K'kK_V:S>?{ԈX^uAͶb$3%!B. Ճp>>cQDJm6c()gE^۞1IU +zԛ̆>f = ͌?YttǃYJqa~T+{$*iBCG04Y >S|dB|2Rf"߈Fk^<˷rSʔWa] kp"Ry>3u*!u㙅w(1y"l}aT9E|victbKלΝ[~v,nl\k :@!#v7V)pI7k`(|5NPb2oFgN +QP|=`;H2䙂rZCJP2lt [R}YO` @]>]ިh"2Ԣb>N54VRiZpFG|Szܤ{Rg9'2B08PеOB~a,Kp +w kɽIxq[TDՄƃ V[CmUQi@W7ӣu5p~eXX?g[oz "je z t[\OC-s5qR=5BMQ}wZβTV<ٚ#+vy)"z[8&%"P6L78UarlϢbv-`U^"RG@)E`bdu:Ym}WEIU#a-Ud.-dY+YMl꓉zsG`B&S{clC`DVD!#?mgP |("" %4#RC-\=`ڋT}aM>F91eُfXBΠoACNYf؀jߤ60Ϋ&PJ=pf_Ro.TYͅ. +Ze =F>Cx77 +W$ᶨQ +f7}ZKWW`]v2 +[.Oo3Ccƅdye@lY|'NS&ri-B:`Q0ٕ-QAIGnmmip}RiTri'DQ[y}nzHUK}JXbj0o sEEk7_NңaLkoKֹ{=+|w.N0p]GPˀB*:z2Tиb3v ->]6mxC^BCa91hﰿ)_.K^c@,=D(n+a^v%jBts_"tk % _>&Hub7p*[yu#)€bLp@B =6oevlko*B̵d3 zU$Xj'O+;]^ZQȔe뛏"V|,1&L 5/Z/yԳw;-R2k\SfBbMMUUwOrMm)魞%-#>CG=?7ah ND=/ϻF9rI0ml:n2IGZRAkgH/|k##H65K7O(6NW Vt۰GXOxWkrhQ jӧ74%@DS xמCTO|>}וFlHWD!;6ߞ];Om1GqI|g1p~>4Lc9`ZJ*F@k0p!r}8I۩?yZ),ĺ +-^ՅQ`kQRtHgE0(r~VO4풛nB(R|L䬣\N{"Гߠ߰;399,"?5}ߐCDm$qoM}R72z*u9YUֶ pІraz(qcC}pT(yE+J6i,}N8iM%%*cY E۔I>}pddZ=*4w9[%KFQUBB2Ɗ>רh_1\Lb&ɁEjA4(XDAA6e&M#& &dž{r#z\E܊7KMvWc/u36mMҩTvj&qKd_^Ljk3BMG +"6D5 ,q#w9Z6kh"Ca5Ro˦"6 uT0 >DrA_UL 1_bٖEŠ[X!֊ +:|=#+(|m YqTp=*;i#j&k3__|B8kwh .6wԫ<LٔR<) w!9*pslZ@UDjeycrҷpÃf-xd]z$eӾ.LJkzgьwUG(ۂܲD@C7ΟT`@S\ $a,f:A#atYuz)oe[{)Ea8ȱna`%&~N$'ѳCOyУw 8cukg#@=*̲qOym6,\6 ¶u|+=OzY@DQfL\p*.iLh$i7R^D(:@ӕv"2T|A,O|(06⺴MGۀi l2aWnZ|]q̎"7k'=XX1 +ZU8 !]W;%1^Z9`e>o*n0n9./Zp%3yu0{2]¾3ݞTTf xlMfE(:(|q  1k>Yt_wS'%~Nh253w1_0W}VX$KJőZ[*+ObJs_Y=Ze!)M@oMf[$1d,iW" +E`ɨq}P<G5PB_àZB~4W8`X`Ov:aNf~G^ZZ/ CgRIƧ"UGQSfVC +.*Ƹ{L9PVڹzy+U-ʏnTޯЪQDs_ +xb%pT Ϳ˗6U_~lLy֐%ҀJ]qQX Gh#nV*)uXtiTŵ-ٞ~5%ķUq*t8^ ()8Jhv|"H6ơk)~,j}Q|.69KZT\n) txivk!l÷M!}Wa]L,A'5wBWO2%kd('CӢ"}i3drbcu0D3ڗ U <]fGB[;c5%?9~ơN +C'\Uב0{841ODxzXŘJZgN9JEt"CGևI0?lӵΏdFjbME*?* 'AGUH {3.j3\bYvqPʆZM<tɊ4k~:<_0aݜN9SK9"k(.vQ2rtfRAPb{D7g$텹S$W5@3Jڙ](#0l +/ÁDV?թ4w/whs!tyJUY4W<+W}NVAR&\9FAHq*}?Q6KF`8h>gwz Sbιǟ ),O d#Ӻ$5 "e fu"/.%AT_@lMw6TXu͵]0݀:!K!n@a! d5r FT 7L,ຉ2Qq0QYCPsoI~ɰ 5{vX5<كM4ԻS U*FW2C:#E?bdAS; _ª_"UE㓵SW\@G|We0D@ӣ{ ڒ*Y_`hZ ~@T.٦#&*~iQ`.XH74oih/˲arkmn!Kqz5],sq2 ]rP'*?(&N!V'tK;SVX,='YЍt{i9E̺yK7{5! 7wx^Lk*N˻Lj:Ⱥ@8f+=٫[pDn;L(?Jp~!n9&D̴6/ hӓyɵ҉t-\N)l)dHCZ]:~_8*kEQ X,l9H"9s`BO<݌bP1xjoa‘@av J8z4Qp3ZG&#̣͟d6hiיwE}D$T*r#a{#<0MCE>Tzꢼo{>|Ǝ㛹6'X(osP!zձtZ6pUNF|T9mCr'ʈPطѳe<cdq{O~4>,NL4d͠pr>!VvLMUGN}jn !}8J+| Ljߓևhkp3E&2c|nx݃tqǀҵNB̪'+CPlFqxk+oxl +F~SÎo`8&[[U{c\sdՊ;k.V>!2T|$Tq6:lx4/^*񵠯|z+?8&SBM %A5&n*ːoC Fo:,8wE _ qu{bXк,%;{b`ѧHĀLsF:ѐH!΢l> _krw ++ni7$9yL` +u-noQfP6#L,S Z_ai8ZX<Ǿ'!D(@!ĉ2|z{DM,B8g%e%?!O>aV019_ ^9+knNSd*MJ@QҰDYKַ"mGoGe}nO= v<}*w?lY%$`4aO@wnr\:AB^%*7r:2,&TsҐē@طe$-綞s l$gA)o@=(٨` ]GeۋDsaNUl\tH}TIh.ںJ1n&)(> fz J?gFSG?$C#P+xeO)رtZ@F4趀$']ܕ 3`k` tPZXOYhd3?^ +of8cUH¯La9p]Ll/e~K?܏[~aw n\e?5~?#v QZߛԗ nE+jH{;F_9 Q* +DY9A?e 9j>z$d܀:mvBT@-r-Fy k!"%ڲs<״<~Cd$$ӈhm.ejﯸ < w!a)A[Z0濅Èǫ+93w'HMfQ l6fA&y|D!~1ϮߧL%ٴ ltBmaE-ʶh_a5i|ËeufH[U.f!,QOzzǚB%ݤOk Ij3dڤv=MBUrh7GBۍFnQ1Cp& pxHR2'2éQDLm8c^>oRo𶔐W_X3*AwKX,d{>|_q1@ +oݝrN2%'v?啈́+k*^s`(<"|OqxՓxu3gHi\kIj J'EbaK P"Np]8/Q$RTRG  8O`gz}?OX%#Ƥ iO EW?%b\&VpѺ}Pi7" XCXG87E2e`DM("?!xZZJzE6,"6SKHM`<h/>|FΔR^ \QK?׬bQDzԞ ePgYc->X'dL+[e3^y1aW @b$}{P똀'.R\I^ו{?[tū T$Uh+; *),oW6 @qRBit%T?jy_*l],'BAwFZgt^,] :݅\LyBd@83]9w -2 *"?tN7.UX|EKx8T1'Ȧ?hzWi~0k`Lǐ:&g\UFIZ)&!>8j^?qmW]x ${K=zTdTQlBZt?o'a22ATDh|!822^uCcA74lgJO@C`D2N?tlc15*RZޤ%b3MC1z %rzF F})\A[!LV&2ޠ6 +w[<86@J]+UpBR.]kr$;N·y_}28;#L +Ev0| pC؍n;r=6kҩz>{,\r˦v(+n@%>r|AṖQTGp݀E 4N]2Y rPJkuMSsP.j4'swcsP&NkAg`s5xG,Py #6|٘l}0(~(%c5?_K͢L#;x +AxgܮG~;lw #_XTV +e+t51<ڞxD2B\AB Kv;3A/eaRF<5MvҌjeKuV}xp-@kuR)6*_׆7bqU ]ISwHJ[_ ,YHZ;Sa[-|v4$/KAfYp| zb%]~޼~j}ɳʼnGS\T1gY.(,[̦v 4%mV㙆lT3AI4I7aN݊A[R0>MAF-t +/r?RHK3h2%σ=B!|BfG*. jlvR a/%0ޛƳ/s|5{%`#FsagF@5p!B^`Uww8V a?A0(Pa*븵?ʚ h&~ qG%h+f…2Ѻ?M-*qO:@[Ukac}VC*{O&c uJ%\ÉN͙(|.Q"Ky0rZ!֜nu߮=U9-&Aԣ[ /UsNm/>!#HIZ)u>Mnܜ=(E`!{Q/{;?TjdSQ`Ogx Vֶ}$R*Bݕq#RC}?`-GkT7 r}%.q8ui8vEi2LhA(o{%H7'_$S4BKa:6х<&woEBA)וfjjcMͅyF-Lg_^`#9eL-Cr7\xLXpIVT:ws]:9Ҥ{ +:I9m.,1D*V2D#Vgb鼄L-;(S9;oLIr;|X54&ޘZ77uKP{[--9a5 Y + +Q3:>낟ya[&2ni0YBir([g 0*f0_|Ҝ2y "͋ʱpq!f[`n~&,pi6c`J#f3!z^Yl_^Fij@I~.4# Sd !JDêl-al6-D*6L=QD3ٺ+%`yo~VnumA7yx+h}!mm~iTe&>detkm-#k&Zc\R8<{(7ϯ PmfL93T,7 SUKՓ[#ӗy5R ݮrD@eB=x( YF.WpAFU)CR$t<94.Ayq}O=/a<w>sFwt/T6:$ +%?\5$fPRDe{ 3*-tg~j0ʔVh!N.a h]gqܲVNP2!7ں0xт6{-|o2Ta 2A n= ٌKu݊ORQr0<\1G&/ 4ս}|E;xچዕT[s;/( dbwYI~.]pcRd-2PFJ@Gohg98ˆ!Uj޻okѺh3`{6=@E/V䋗[ū/ u=s,7|ľW/11+'؀Ԏ %276zp0#V7)j?٭',&n:|ZO*JUM0O"eaC@x`Jr*f\2Џ +V]DdOa|8Dn,$ra6&MASivK2tbcoH;(0NZ.=-QVGHҊelONˋ{b GNf;ߨyiI ;Ĝ ү.dw S!$΃ _y=k62d7*`Tgbmqsy~0L!s'8 @!݅op"1H-)HZo!D#^HW:Ҏ4w-_SЧ[Þ?ON|> endobj 3143 0 obj <> endobj 3144 0 obj <> endobj 3145 0 obj <> endobj 3146 0 obj <> endobj 3147 0 obj <> endobj 3136 0 obj <>stream +HWM81bo| &gw ,nu +ɓOQ")JݶDbիWVJ)Pe +P"[߫ǫinw7˫K-X_QBAb*x Cdg~DBJIǫv6;/PfCw d87ժ7Ug&hjĘfwSƧ7tS= xzywbm[G&0X!C8ޕ]t>p/ nZ_B}4otEHﮫMy;^1P[)T.q3gՌHcRK!`%QLtgGY&{X3MAa6TmJqiؕNovƶaG7HlOóà4,˿Y׽wT3R-}ĭL7%Vǰx/*noO&ZPO>S}uB 4VQI,9Ϥv POL1dZSe(d u׽v3<4&15l *dRiJMM1daa +ۦNdA#*7[01,"G-wsWF =\uW2ת~5[ŜqP uә{, +[W~ӞI(2*HHe+[{\O^ Q9yqxuyHHS>FXk< `(a~Eٙic60H G<:s0G9PazRa cvzxp[mUQAJמ38юLOKb;'= -{|D68+(Zj*uZromwv1F 3dvl ŊYX"iBD6GޣbKw&;R(Lj{<$>L|ꖅÙ:X^Ƶ,חkpp@k@pd4p>JcDՔ$Hd"$& +.! TOo߿r\Wub|wM.C <ۗo>} ]Y3 +} +0a7 endstream endobj 3140 0 obj <>stream +0 @@&Gf @5Ĭ +9sCߧ{c|Ƈ#t!߷%SI_qw +wU p$lO{xX[?Mv/]b IKlsSΈ:nKX mC1ak먅(&&EVgTÆxΗ[ i],Tsl"PRQ/  V_WuUoLE#3}to2-b`Yv#܂h"yu G8WQ5lUá hbHK{Ւ8yQ Y&FF0 J^4+?)<lUsΆ9u8=^"g\edϨcϯtcLmBwf}3矲5C nmeiPVYR,?GcQr0}#6(];ԠmʊX&r-^ΚnirF9q Wpms1V#^-Ԅ "-g ~ˤW[/VyD ,Xd~~9e)9HW7 WOW{S#B$!AVP *x]Y=]mz:;Jq 63s>]PZ6HZr.YX_uAe vE99+v|YJ\Czσډu)M2o!l잫e3+I/ܑr?W sT U&ZKgnC +є~isx&9 Ӵ!F[" ;%ᨭPրhu7๋;DGB@bZ7&Ig,jScVD[?`']iٮ$Y+,Z>a1<ͨ\;1++; }#G>]Z XJLvj\-O:8[]؞ZbNRK#[46a`V6J;#D|C÷x V6~b0hBR靚Z:|ϥ^;,X>al֬X:c;р!jr>(r]P +։018&#ksT+=:e**èF@7m]fp//[(K`u*2[ŖyC]"r_Kتӿzr\ +F@7"?xvc5!ɠ2]^5jU9ł,/K/iQ[x<1v!l9Gf M窠 c!ɟZe &\ުcw=Oΰv|6Ȕ@J*g-oz0HsȿIHys1BIK"G|z(Wr~CRzSkOai|e^ Cf].ǘe{fzJe;oq VI(T<mQ(Ie\mvmsߊRrF-ndL qXTohU5xqGnV~0\M8o,:fkr\ #gLѱf~k]P 'ݚa#OI"(:ϱE)-zg{ aIhǍgJ`'r&Ǚm7W `E{lØ *Kl]x) Z&/4Ft HׂA7Ԇ̮7CyWo MA٤ zcvN¿_Iޚ;R.$L&zh?PZh7j}/xzr[b(=V4amNi^m"N4w!:ɓl|X'CD>j!7V! +_ou.(q1n@hqsLjVH+$h3 +ֿsKJ!;NL}@R91S'\x&7/fNrŦ5v]wY:_ DhjlWRmwz0eIP1q(̆:/Pox !o/&Eb摲]ՑDM~S9z }CM#qgηg +%~+t(h?m'[;{咡-#b:G?}GvgPhs_f/UpGJ^?;8uR(I@|oqbU 4޴C +*LK*XHѤM1,TCSFP3CYc=m8bkea>?L_S ?#5]j b.K^â<[|؃ g}vdLS1 npGm":XicnԬ]gR}!({t4aE:?>Ujd 1JTVPNJFc,KA9/Do%a7KXuL~0Ip^ G@H6R߁2<製L-O 柹L ^`ekX'?&cs|;<(N=b!DA1CjRTmh-SmF~J$|9BGjpwKաфD})2*@1*|+#㈖I {85}ISZW)O΍ +l) 1*8o)3Mi5ÚP{͈ #SNUZG? ~x&24d4rs˛C+gbGj(eb{9t7F+ Gs6wbJٮ_NZRݏ/Dp( {#8^sSGҌn{ѮuF➾?%ZضȪrQ'SRJ_s2 +_C}?'۲!Xu%`ả{O*TQ5+a'ٽz-J~qp"R*buĝsfsa.5vI8G:`l_ѡBO6ǻ,j“v!TKDu ~ sn&|Lf,"-m,lEScZ#`]EWi"x.`l uR)Iw`br1Z\f\G1Ԑw'TO͍Ú~9C~%5%g* )h]^'l>lE")8⩊ k4OLE?zk; 5솜J<8\O[` Y~zOIzu}gl +2?o x6 +(gk0FvRAO(Qu_hr4rs~]3ϖPz`ǺxډYuʶ@EVT__qU#:cj˥ovCzSq +hk6j6M=MrS[M5ӻ +`_E-7;@~r]rOdZ_TMy]JmALxG1%|.\"9Bq!hr1JlZ,sTѢLK3q5m2͜otyi5|2oɎ1xW{?t{¥UIC%#(!lCE<&ORӄ/nC;ݾ1Gd3@$./9©@5U`96ҵ 1ո E`tlkD(fHLl(E I|(+{9MykG5KOh2:[%13l")v,^FAN#xbTp5n[1Qn^jβ `rf0m, 3{#\K/\-"O^tJf ?5Ӭ#ZUرBa, <HءۢJrp#jq4]/i3&<c{|Eu.x݉aAըG`/J+Ot(ϷxWܓ`G][*h)/9p,܃2^|ϒ9ʱf cSm>imlԶDp 8 +nF!T ?*.%0nd0]ZGi=_1(y6B~rPl85t9paXL < m*q|o:)휣z-hsFԉGrF,䱜dsoVrw?ƪrXK'܍'@!wI= ̇״20` %R}8gk2xGYN kXEK\קOp`eJ4B\Wڝ* r&y*UpVVW_˳CΌm(t2[:#}(c̕lx鵌MqXy*s +qV6AƏc3A\o}[t3x߰WWWR65[ sp纊{/?dN:-&Fn>n=ڒ+\EIg +2 +FXn2Q=tPQΎik Ur|>|h^i(I!Wd& 2Gg[]g1[18q[;e-L\گ$M==s;J!f נ\W8{.@Dk"v-3uɅEm[:;aFE\ ? C(E/2T +Pv\H{Q2KFRbme9oy*aY_AYko'3Ѐmơ{e%VR?Cπf=&k¯Sf23 Ȥ+zU$S 7{+MFW.p"Q0jwŐ5WMGM-|py= Z!{uρ(^$:ѝF_Z3; f_-;H;l1Cѫr Ls|15Gpmi<΄F⚠0ꬔ- 0HU;[~(v:"Sl6Lq{Oεu?Q_~#~7 +1a.)/߀Ȼ~]Jwl`s:ѰU59W,qױz#UUSXJ;y(O mS%HcSB|4 +h@ʩcFi Ȥ>ԟ~7.'`@;%S+߸ZikG)MNXAr_i{5qHSؗ |oLuU@=F jy5Y +YO,Sxc5ȡ9S;e>-aܱ:C+[Uj ".~x43z{|1CY#>_).lfSPlMdft~ P8Uv{ViQ¿4K2_:~MѷG|N(;g,Nz.?fzJԸdnKt^:IJdNOCƸ__kȟqLh9ƽ0QT?;⑾OD5 +$&+$TR創 0-g^8.eễgF#oZL^" x_>Ж4KMWN3(?eCzܸ[{R62(V@!GI~-tVRG_ ,|JC?JG6zQM~FAGBil +MZ{27M!mkTY)xCL! PȪ{5!.KuedKqGvhǰwD,A&ٞh11ERqUFG/ae S@/o+-M[:B@M1!I",yVBZRL dq7rD|ak**'w-q?HC=EbcU^N7P KGqЈFD])g| fZmKcx :Ǒ "~9#dF" ._JcM~$I๣+ S`q~ÿx%7Z("d 7Zi)p ò]gHS +]wIʊwI׉xkoP 78~wz7IdN^sz+cx.BkA3qsJ>#M(xWbÑQ)S@ WZ8F2| onΊ NWbKSuG C$h@.IBW΢?(PJ +kMh ,GP4X؏'s9\jsYa~tmnwfYBol#tT u>࡜ȷEZ@d*Bf@2 vHE۪W9`X#_`I6-J 3q/sw%)SG~I-KmF w_!IZRtoPluW KKVӓ C1~9+pܜI42 rM V)b:$dDgo 9&>ү5緥1 XdUӆDB3R-'o^VK%T ȝG$_CcdIB}`|zg` + b^kU&B) =M v߲6|7i1$ܷ. zXNYGcY +txvʻR!rW(q0b{x̌*`ztdr|(כaHa߱I=?5#CXhǝy*unòmG&$ AGjs?9ij2GIGװGZ^f}•D +ːt,nljjpTO-zImu*%?9/5ۅٶhB<刹I a + +Y7?Ey,i/42fyԥVX2ѥ6p ,垵|hU;@YN +44v|Xș[Ms`f+rscH1WvNN46~uVm3;5z:׿zn[XCU-y4i Ӕk- (ǡ O`z"z h)eu;f_De4'S_#q*ȍpBkJgsխNP]΁/ +£x:[J"fS'P82a+LAx(uUo*FYo-N9#MZf Em)b1e8wc.蠖W;\Q#DT2%Z >5U +9?A=1Rr7ݭ*\We4@ ( ^FMpՉ)sӝ^b+u5/H+cK.뎃*Xd힆n\wEK_@G4BSa; Bvt:晕zP)}43ac j|圧"њ= +{MVn6Am:)g'YJoP uz$~4 d`=S₴ 41ZQLLC{4n㭻M)Lz.Au`8϶LH eT6I-5k +M6h?-Lew@5aL쩅 ԂG+Fy`V>KhJrEhE*m'Nnʰy +V7MJ'<5P]>Wjt1͢(/eX/ɐ.C<&")$jYKuMɟBK ^@*3: v>1~]UE@@iev7[)4dφ[kEǮ '$gD&ȩ*aێ% [5=zPlwYنEQ =jM2sv#+FPLqjw]\KVM&jVzpbM͙Ht 㿻x՘8<Ck}| C"#ftfn'] qȮΑuLma/eψHRBi뀣×kc㪏Y#(ȋsIvi]T^񪻾.}dSUo|Ee߶=0]64ߏ.CBЄ Df`X%/3\4t\n_`_o5al^yS uDpCKk$ʬM+7#* 4iDV=*y%$賥וLPb44,<Ľ/_d:2'JlТ/x#j~e҅b]DimbP8RdҪ\jA"Rd Q~ sK4n&ŃEG&MC4z+ ]v:`5e*?)rFXX +\3;[gb6 mh_I 9YׅX>#pXcDU@;f5aiL`g.oto-3\ʫe碥M,Btޙax8VVko4M MPa nd@g3#08 wꜨ D̗;g &gHdʡ'"7QC3t.fKʄ blbi"gZ+}d}pyMVܯ''"9&J+TKfÍdpUϐSLGʝFB+fO?(&]f[p n8 } Q/\Nt_ @EK*̖nqeB]+,&j"0v U9j}X{9}zsʶZ(T/v@!\ o3nӠհ9drUg/|xV;p.b: 8@1]2( Di)oGyJ㸶=l9J4 -aш]AM gwLRtt YXF7P~3$/U `+X +kPohԤ~kre +ZYhV.zPFBrt'Zй5xQӿ3CR tJ6UL4Z,cljz?j8mw¤+@!_ER?&?t͟C'ٝg{E'0 o?P@>jZ i;es:svA_ +cBHFD/|rR$r`w6x&7tpGYS8lH)-I1᎟5X4gf܇/ҧoRF0rRIjT,QB/}fK9 n_rd@2^/wH Ρ)1)A%A3߫5j!c. $˄zG'vބР^ +aJ=F$Z-,zOڶl}w`rıҹ%+1ft&Dھ&j+N t8Hi^=S=ud?GBcUUz%;gULaQJf#D=M qgo!r[3X.B,d&p{Βjڠbcz\d:)GKJCG!Tb +oT +9MNu`ӧmWHʠSRN޴U Urũw7-r [|xaN;_i]Ǻ)AǺtKk\Rȿ)qc_d`ڨJzny$?ʚ;&cRh@ + #l=}h)#mh{`#?WzOSBci wfk6VR3=NK#[Ѱ[ +$]8ꣾ JzF,Fd +0CJ;l4v%f1@{Džt;6\o Mf6m ;Y\79UUF $q60s2$+5:eZzUdg',{q\Wұrl(pX*3Sf +pB[NE +D#;YA1xX M0q c(d,ߨ>q현-CFwCD9u![IM%+S#c!آ8ࣣWVPn#82ud1#/r +Dfv2+?sfgvǥɉȊUIc{44Uٚ> Sa/9`y;Pp>7<-co^;D[[iJ׳a& ԉd>-yU`}i%Wry=e"0ۊ8UЀ115y/6kHYnwS}A_cXX8pfvyKaF +f̅4JC:q]dŽOobOҫTPK5X-Br|Q ʔB@ ˑn4vJɾ}*ճC p8A"iGw“]eb3`;#n\#ŋKCoN]]'WU({,[.Dc[zYc70Da7-Uvtk,ʆ_[L䬉Mғ& oT/E+ ^MbFNBBߟR}N}>Ju"`ҹ޲Daށf34-Bi!jlO W6GFRѤTЍY,X'c5n) U\9[no?+Jmx 08.H>>M5F6R&D) tWԦQ~w4b{.q#Kd1ΖS +{6#!p=3qJ[鋝H 7 \̍ TR|1nAQU 8nx+b1-ǰո;Ol#Ӣ8`>o[E+ XIUHK?; +auݙXpgUGr czb +xшvjڑĿuPw6Go̝1*0Yɠ2bk!2$|hgk=t%:DJ/0$GMԪ]8T2!U|;iEj`ݮGln, {3JDAJ52n8S܄ 6S "!OU[Ad \"tXIL2q>VX'@&_Ă& pDT$z$CIΑ$[c#gìIt]"5=ND\IR +BeьX޻ 5S- +lSZ"{פʣMPN+jT!ڦn +-V5uyDbx`-2z*s<(dBf+Pà<ߦ7tITSWeO:>f:yk1&Bf/RۨٛDN¶TF"IYVBu# du C %w"奴A˙RIB Pn[[fQ(䲃t KܭFTd'`@"o:Ѽ>cK+4paq {Eb̤W{q[qؾ{EW^ mn-sXn^1/zf.vKNޛлV^QqD ?&T56I/ *CRNOonbCr94[_ +<9qyȰGyVئ|]R5$!hQ5 $RR; 7ơ`L|_9b'. $}k2)ZDs{ȼW_HWo՘YCq+mjm)'L{,OEK[4+vc9𮋡"XSTTk&lWg D٢k,IhU Vf}2habToN +eB޷0 80Bf#j(HR'M"idz ,z|(h81yM.wa)GGx8\ _Xev 8^wⷭź<+C_fn隄 +2ҟ_lI2wT›Z>^x-]xw :\֛Tb J,*aZީ(!#+{;FCɜ_7pϩ.-|SQ σ^raZ y *5S+T,:0Vד8!GWuxo0$B9 f:=mXK؛=.G8c4n> endobj 3138 0 obj <> endobj 3139 0 obj <> endobj 3131 0 obj <>stream +HWn}WLn2 @rIB -;^D =շ%% +$RS]UuԩQP'¯Ԅߗ듧k8䇋?a %9\,\lKĈF)C,|[>l~''ltBNW "\.gŽy<<Ħmc%QQɋ.09Z wC"D6`?Nv&1]߮~z >œ<f U .f/ܭTH(*#a08$͗9bĽ>ظms>luQM>rk&8S󮧰薫v3ְc]}_kL_d_&jGSAm)#IoݶJҵQ3?y_)i}KІ6P%yv:(lEZV!R<|%b031Aƾ~lxY.aLgP('ͤӫ =P~mM1ᢈi`U-o痋?f t@::r15ʄPV99o= 9-x`%ίf>/àʲW{va1HH'[ĩej L|CLJȤ&աL+y/~e ca1Cl +dᡵCnLd'ӭA8]uo6~=v@@1@@!TI Gӏ~W~ؖ@{($ B/=-J0}K#_P2/qK&ˡBNXvZF/*Ʉ+9,W +.g e`V6P3/@>us'^s !bud΢ 4583|aK8+$ZW+qQn e`e1y"3X)/n9|F?vO=5*-v_+T:Ieұ+<[KUTmQ.Wf]D|g7tcess .n=,-x.1pSABϤǿ 0_ktU.O7I|=BhV< &_b-u[Aka,~`3cU~ߖf"*A'3DjD~Fk(NcPz+(s[XD0\s(,3<Pd5*\`[nw*]o] Քa\QsXgW6hi Gn7,vūW)wfFԙ!o~~'ªcjưG~t0 *m0~ogC_@1ݔ4X^@tBGO &Pe$()Ki%OKJڳX"pg1܋5d?*MPP"<qBbk16%<2:lm_Hb|ra.uS +С -&6sn,#jW>z{=!_ BZq77H9+D\^`uݧ{ endstream endobj 3135 0 obj <>stream +0 M@&S M4g2¢е0 +A;h74-TZ1+P<4 x8CsӱP3!#BO& ?*LuRνꯖ~v1Q +oצ9~ + ~(Y'}`uf Y\a(Xhدz<0sIjdZ -\`L0Zw'LatCK{xһ|"% GFY^ ؓg(&C< B͍ȴq=~)7%{8AJ|/N: 8%\Nqk7N1ӹdLqzCܻBҢ?=)>~LN$ +.?Ac5 iRvu %$ߦC;RPd ZuWzLla +`4f.UjlXCl4#hM/#QAJa(vy=`胱׃≴Mm:K' fl\~bfu _J> Ӊ[|y@vjr"*l844kcfigp +t$Mxmkhšpg*`[PDv IؔEV1MVsbfx;_0݇B9aQzuD}]Cׄ'rۂg ;e!kjB;ok"HFV}DR +ʚH !)xqE뷇@¿o% j~? 9W϶: +d$ܐCs+)GT (j{A4, ; sikìž3X/5:Y3HY8\˹ZC0'"{3_kn{}:EqN(ZhRP"P(s0"ٵRGDĄ9# +W7WhNp฻*V;8[J tݦGZÇot*Ԧz$bQ 9[hBt{ +=rU"Ÿ $\9'o7?ե] ><*[a7Bv4T]`έIƨ>3f6 ZǍ9w:H,yqUTȾ~1Z6L?+n8?Oiܱm:U9)Cb__,{oD^6/s&dĈdOzE)K>em^8y)SxmU\Htb1f?x6 PD2v`%GKFRV>p0ɲqGmNXFÛM=E6y Wn9p +cN;|f\9&b/]L!b@ dXJ_ߣiypWIMFasBl nN}3byػ{c3\Jn|\C]8\`Iw[7Ӧ+h9}!Nl z8Me@msypxxđuL &JXR+ž]Y H^:ửF$'qsu=9ڤAtVg_p!)ioꔘaN(ջ ݄mͣ]k1v[pzeUvlt@h`Jg_ X .8g&68U_z )2/)P5[|5:1JVePQr flĮ}n}7)ոƀ(`6/q-h6ɕ H_F|>l\.0 ޿.Qwa:Ykдm-w0HDY=g{ U@"Ǚ"_ 3ΟyHB-"M +BŶ.+fdyuZQ+g.*= g+͑d%IdXe\4<a$Wek7y SkMV0$YRj"8-"l}34/CsbiYM_Nde$|pB~pzI42m7?`|x'Oߞ KiLDu.ʹ',A|F|PUޱ Bokypb{[H'Kshyv2:-%LrM% +HŜJ8״3:#e!cYc#c19zY۷{3^n$cʿjJp{gߍd O_UPෙ83_+v뙑ցLCFF:s'a3RJ1l檹~ppfEvC^wxZR˸D$6عFF^nCteT/mHI(J@hpܙ.(cU΄ze[C̬N8/hnZ>I*Cб!&%|%˥[*PkA;W$'Wӏ(H7O{ݲo&̜S JNHj`uC8;ZeԀ.$GKHlv@d$"o{df4){'ϯW 1 4ԕ`ͱaOZ 5-5u ]p[gIV1'#Z (PY1 kf$ +x9C&v<&ٺzD יweӈvsQJfSj,uT|c&ί4l}ɿvAC"gvY$է8_=zr1{*/Btp1 ,Dz3Nuig(t֣́*2 f8w/` ވJ=*~u:: *f %no&J $~(E@ZEbθ"?Was[=sC$gץ.ϐ Y(BƧ/ 1)8&wq|p$g釘ө@v6@ b5rK &<G'|{RyHA[\c+]?f#Z<,f'iI/K .)rt,e3`aYÁ`n y"y5ݶBzp٨kpڤwdH]>r V]RBqla~cWLs!CKg j#8b!)PԺE;yUDX⽠߰Ivzzb4 5jb0Mxt}J ݑJ} őloπYWWENcm6szҶ!IWz=bIg"]ux_ƖMg\neqQ#e?ʗ +_<}[s TzLԌS}h-K^9&3g;5_ޠ/aQh# sGG%t(# +ْ;TH}5δK2 $UGhy'g~gXkYI]d / 8${_0Uc%Y6lny#{!t,+p>|\*̏GlHJuq '.^fgЄto̐"xv0$r`t 7 INꇚIeh3cG WPE v +u493 bmEplz"Swݷagl0j-T`Z"1Wt~_/c", ZiAJҽL@[֕XpUUN0bLlf-u2 >WƲrF#C>6,1~'.ž"8{׳XBAb] +ʺ$=J\Ѕ+.Í+.W]nn'8Kv4PL9oX%90.-dr +e^O>yKV nLDn; wю0:>K坛DŽ&(w#P{$Ϻ%&^AщbKOsx(ԩi%{*)IG6k̰6[?`Pt$*C;n)!!_\CԴEz|Uy Ѵ1I@FUI@zYo뮸&V/JQgrB@V,涯< +S0H*tܗYxcVWdkR*.=N#9̮1Lt5%@z1ێUIaN v@͔|j1jݞE7O6:pkq| +Ԧq93e:7\%de*zkԫTgORy.N yڢtf7,7 ΐ(ocvbE[IqQ$>̅nh:Ns!u!h6#,H5UqiR?,ÕÚVAc!Bi.۔+N騗׃l:xlo "ĞP\aΨt@b=gJf)>(I`x3%乮yRJzt ΊnC 9Л;07>L>%Fk-u#V`i|*&\BmM`SQ;KaVowj + +[(M`bt +3ҽ[?A = +Zخ;=xs4{T"&a$)נŸb6|r7" F?KYTGO*!8_N&%AMwTP×}Lhr?]qv]o^P*ӋՖ[@G!͒I^wo;KG3eLE7c]{G  +%>B +6[I^ɡ #=[^x9Dq8ndݒ =T/]o2{6BxAx25X}ZmȚ`R4/(z0{To-߄츽;.ALWXi\8LSy5)7WJQHRyMOU,T@6~Ʉ" 20IT%zesZ?JГЕ4/1Μs 3h ;ID^h1y6hao*=.EtTAK" l5oHFr/DxN3"#ع_SV'٨mtF `Rh xUJ_^CꭸꂒjU$B uf]@jhs]-:I:{k*i"sg"}u {0Vլ O&o5>o=nY~6?(ǿ>'gkT'[NYB9袾alKEbֹú?%$aJU,z8umݵV+.*fŶ&ʹpѾFA4"Sgzs YLJuK,{).~5 p,o1v$BZLK4wS)Y:5w33BC#q.WKU]?[uliBLT] #iȒn᜗j1FhUX$̟w՘ e N-S!WUMUb%,v@| GK7 kb13>*iIH/hnW/*XJ("_HYFMnIoy!CY%-Ś[jI_H3a-)A=(;G 6[vdQW4Y#"&;=NQM3I_X4&Iv_ ZVDZ(1@+co?oԄ[1:(9uxU)|+v2%S/ +XwV"Fs%܊;mm{2ag{:-uFA} ՄiuHZc@poz%w16#],WD?,v,vN&:I;"-YTzczd<ڣ&xbQ+p4 u21*Շqk **Ƿ#H-xNHI}vI>)1%„[uP n$B^]M]hC\X+ f=˹h}l>i ß.mevg}q#հUV˨iG&D#ΗmI:Ufd#ocȀ}C5LI_3 0N^=>teKt׈UoEƎ|s z@HJL goy'CU`> Y/;ǃx>@%)hq.GWL)7' k?sMVmb\30P ZWzK㽼럈p:sL ޞڊ; PR'YDĞW)oudz_'xE5as?0J6.4}_c_+g./_S|VXGrsI`@i6$VJ~:N15͟jGd/215D[Q⃝zp}9k]œ` 尉5 y/>V= +Y_(7>A=[K,gڼ\ |/f3\*$zD>"#}Q=N v +/K- TYbaU)y;s¤pJp! }z"½7]kz #"zPCm\ ;Cjo'LAdV4nL_ -i}tr +/Hc}tvΒ45jrBLƘ|Jr~feWF_!KcMH: сi#>^&uU ='RN+ -H~yFlzXJ6K8|>ׯ7oTpCMc[v]N8MyBq1oxFT +"ROyn ډ`RmU +Z6[WSo.HM pxV1ؾ /|)͝yA.%F`Dg*vu%1w52(/%p`GO9wjڭfZ}$AN[DaQ'CVJ'r Ec@)!Vn൑ƨ:oX2EXy *DSo-UC>,۞?$^aÊfHoG}9]rfOqQN/ft7)Y}/CSfo29}}97ًa.&+m,03L24i@zFbh^:NQㄠ_qy. s7J7a/egG1 qnh{͏Ud[ p jrC&Zy{pRCyPS̸ͦP*U6L 95))rMw_Ij!(Y4LOw3H?/Rq]QȧҋߒDQZitH5F_%IRZpw7:4n!"LАv(S2iw%u{$Ule5lUeDmc-f] +QxuHe'-Rk4Ʉ/fK|]?myP\D]vwJ*@ mtR4TIC)hr_NOrGqqҩmdvb +'w55@+6s%v?37[6^j@X't0Prca^`xޱ[Q3X<(=ZVqoZu>ڟ'*>25DZ +JtR\-{o$* w MjDYԙ%H^WW}-[Q6fbZfc3܂ R3Iӻ}y͞0g+VRnCUTdrt*'Á7_}/[307ˑ@.χc[opᛴ? +\%l '4NsOsC{lZF?hé 0}9:RpnO \E61P?*_IU(Ԋ\g͔;_7LXcmi]JgAzu +j[Jg6$+͒}$F>A&a‘' x)5 '0Sb8yYF`Is3)}D}qDQ$p4 _K>XF.Q.vdijQ(. چ,=U[y˜/w #Fle~-dGEoUğãhq,}O)xHMx h-S'-7~\keMݶ0 +>) er96l)V‚6ት4Që$'{ {!:\ɟo{jx_9>ǣQD:h ve=̿3>$'R G,EIy7yE +'8sP9*x'pF4_5hd V~f8铵l3hl(bJR=ڐ +ۀ;Β~ܜ# {ND?@-@8@ȧhuGN / B(Cq;.Lcc^>' ;C.C-O.Ծo쇬+  цilOf$OaNaUf@B+t:)?C{5?)5{bf!2eOu{fk26䷿{sqd}ւΡ%xiC(7ڄ7[Vy x?pS^S-] +Xd\K@n*'9>5P"@}a[yA%( l]_"qJq9DE`6*2lu]Sx$D?[.X6f7߹ZGsOeUdJow] F@,6wl4(S 9ӷ' +-p\R8]3c~/L[K=Yx_S L7t#cpfLn8Y𭽌þթumBW7.Kϒ"fF :O`CQ!p)PQ8M.˅oLO?ao7_?x]^xER^8JnH叢> 䐇qk ;&lr(h٦nٿyIuM:mWj\äYARSbJ›NC$#4)}1xk)4_sPg̈́q(QPǚ@.kF;CD +(84D?S}stxn5$vN+۔Sh xIUX[D51~.}ڱ]ښ#+#):moW 9M +y[Y8hij4A<^I +#\^gt󅛼<5,1}rkI+6xMˈY8BG fA'Me~LBmM KB[DGm,0T!{ gqztmD萿5!Hd.y^5o,T)+Fz8]ۘ UM].aDɚ4]=Uƪ YCȿŀ܎S櫶M_it%5xO=k.–ZI2r} #`hw^/{O$]<e{$Bā}fGBV&#mwg9t;sW?ǖF7m_cRMop1RV OPRԺ-蝞rW ,8|W"=s0cjV^Wz(!{×[GP%LL('DqWG7zϞ>uUѓ: *gѿӓuYcL? +νП*e NW#.Nż{ ^+o! ,0qm6Gߗ:x}{K*F +B=ѣpY[پs21.B %\K%;)QnϜz3ad<3{/z&(LC~LMK5PW$L+-Ok ?7>)l1"xb1D,v%֢kӊЏ2t'|W뢀e֎k 莭d`KT/U+YLm60rGAm [1 v9ŭ|﫰#)8mNj`_'vz=S9f mM*Ӊ~8h ٨ǀsӧVWR;d+>XUڜvtvGlrHA;kGqE'bL;q$ovuQ,Sx +fXXU>fL2‘*}!(-9v Y23_UֺB^AA `òj5ElTy; (ʄY +;VFQʉ,TGpՋFE6"rj^ +O!I"A{Kh `$ G|:/աAzXb`ߙ?z/gk-^LͶi:g)V) 0$,ݖS$=o3~*\fW!f?<'}FcfvT=Ͱ B!я#ߗ'i9 g pjME +M9%9yVC%H)q&,TQ[_u4v":7S7βyTʿ^M ?${23 .?N C<;9د;95"c3.̢yS_T$}H/ sɿ@[@"VO{OFJ=唹OKI'VœȈkς>r +obA3Yaf`:&u|/E% oA #~H<٬3w12~z^%\ž@,eX٪w]/cNvz $'s\3(HvI,B=AxM8#&iRjɁ+o:G!*e u7n%ho\"]ޟx8뗺VUS4ǀrx'\A +2dZ%A3=vkkQD#A:N{f cWayosbއWFSlF5LflaK+8.q u0ޕ1p#@'%Ј4O,shUIP.0wG(վ0,n*M&hjr4{d2h@K~SK : +w혝Eܭ5ZoqQZ:g==n(U5JkNYj*I#xe Ogj^>hЙ=PBG;ÄLRp⌑*) Sꛘr7(80 vi'|``)YΧ:[hRa{ofh$5o判{14}ʈ4 mOdz! _QwV|Si +>@T yꀐ/g4h Jy.[hg{$S3/Iw:qHU{4t[-LwT\_L !6HKFCf{JFυњ9v>C=<[C.J8`~6.x-0CQ >@UY=t "V+4V7쀍$CW>9ĆԘ↠돀cQcޱQ݉zu^s8#$otWrCA ƗPeث( GQ0 %@,г*Q+Wylai(t?,e% @HMfSѲxb,}%;2Z?Wu`|4\tsMo@OŠbK#d{t}U|Kt$ܗ$@:$Uhn$oBb̫2&rdsFK,@7-'áD6!}7|W`#`4BfWGx=tbdRDwn}sސ_XKڪ/XaF +w([*4mG!Jeߙ]{G_z 3J`|]6hߝ>)*Nߢ!NG+U, tn.[+ J?s;/6.@a)6Qm52J6ں!*λ9k{?$:b I]ZĤ)WŪbZC10ֳɎyL\BU1mXEU`pWdOy#Ď^d"WD ^J Pw>+`S®|oe @V+ooh;G'6fAd4j& ?{)EIN%_ly$CI]F]w:'.=kd +@l= 2\]s fD߳*v`u +8Țs[=Ѷ];c_3= #DhRT6QqGZ~e_!@SPw|Pb2'Mms%[[g(t,BɮzfDѧ|[(QlHrH-U@u*|RdX)*|e"疨E#nv|]YIX +F + ^i"h'L^Ɨ=:4*kN]|h;SzzirB,Lj0V2uN6vX{A`&P DR{k>WDSsS6_}[qwVDlBp@z{h֨%,?(%iӓXPêՊ#NAlmB%;lS+`(G$u D`aRV^JcX'(o-M Kf_SKGp%!/h +|j_dM^^(o/.D)滍s3 +̎㷦x!Ersz-=7KO<"Jqi66'cU5Md̶qpڢM^nxեMHuK ذq7(Yːku:G2}oqkN#B GQGl uP[(LةHv#ӍlGBijVQ_AGS~;s u1m!mF2fbG.9E I3 h_uӗ:ǡKO\'r߆^+ [![GwS?]2fNA9K[Xv\sΜݚv!{\AX%<"YK!+ɷ<<;%kuS̳awAnsQ s$$ȌNE# ̔4xT:=rƋ6 9FVu.aS_qa9 }BNJ ZlzQb4ѷN\ɆDP /6)QT 0_av|1oO׹k3>q9?B@4N p{GRqj?x2c> /qq?#:&}Wl$جDlH2vNV@]Dҫ2o`4O},VhYq%gx2¸Rl8 R +'b9݁%^l\Y1H?f[Rd7VnAz GgϱZamuf& +Ƀ<a{oGqf +^yY({a%]:S'$qtVvBڃU\ޡn}\`L? VhȬ‰e^9@oma *|TҿIe1*3b/x\3餀P&Qov4 (,2 +0ji>oaR=~qC5d~ :Lż\LI+B`etكD}3FUVUO k~NB>o+==;?ݎ'V-;5D/P~pn&KAi8 +?eH3S d_hn ¬cY㺖Y/_`vF`kixIc?}7ƛQ#k|@A]|6Cg$gs!٫<$K!p׺ͮsB1LL)SKN'B"eVrWR0>N*l +V!@״n t-\zBÈUIa +߂*,99 +)@Jns#Y +U "~0UĜ\B0[ y1< "74si_:Ō84O-Ҿ_AwCxܠd#s'B$* +Eߣ^K||v!(]`KSі^b~ыL5X`a I2CF+i%T3~\{i~4BoW!foK?_@,a*/gfvI5qmAHueimi8/xUq!]#tأ1#*7hsIzcpOqBC/& +'Ҥb4YZ>,z'QMhPyw#$LDP5Tf@ Oz]]pNu%Qvr@a +f7J`LdKSlwrAc2w/ʫG;*)2F$*^rܐ҉0Д%;f06U.WZɝC!,;Q%6ϑgF$S=ݜnR6$ȏMޕ"8cYIjg׉\\SHR. U))5vU\΅8,JKiHre)` <-|y-?1 +s8oN'"oS۞uFe,ߕBK`739G/,HC%RI!._S9뷢H ÷\y[%YR(v6F"Gg.[_E|]_*cۑDlHv`*%i_, Dt;.jx9 ,\PN +J`swQkgu"@a' XZtqsQ mDTs[}e,Yl~'օ `}F=-cXWƋTk赉ƪcO!V,qۧKZ [y!EE_d{HTTEUܑ~+[`N]N8镊t\9tŁSIaAB]Xj՟+A-Io}*-()HIV>4? endstream endobj 3132 0 obj <> endobj 3133 0 obj <> endobj 3134 0 obj <> endobj 3124 0 obj <>stream +HWn}WCd@j],` n\5CYg!T߻Il)xU931 fd$]^ëٟ\&+;S^҈_j$"j%DwܯǮrAH +BQP^ +Aĉ>NJ5~ + X"}hݷx"|@!7{Я=E=%4ҰpsY i0 xr*XT06Msظ3v5wWNÛWi)V2)Kqm/7z nn^{~`"Yme\ cU:x,"p"k{F2zgyFC۵b +_4]q)qA&v{hN\B7[q.0.8rǚL0݆ mʻ7O6 8 ӈ2!>++EJs7)F"L,< /,Yݷͦۿ_"[Y {3urz2_X$C>k#ʟ}0ϟ{uI'¥ eqb`r]%+%fPSF{h%OBAinO`{k@LLЬGd1v?fʒ~H4`D8^R tcE8v}N44.`Lr28<'}tS鈩Y=9Hg}l0[ Lf֏ajdq~gHvI1/ddt'K-3Qfb`Nc8es`HwPZY9Rxr ǚc⸸&PQa`k]+Dux6';}"ªnW\ϔ nEal#)|!F@Ke/ @$)WܜԢK6l &ؾoYMa)Xgw6&Q|y%oUOu|d.0JMEg9 1fB P*pڼ̥?ҙ5p=4@<[M<* C@o!e+\Rj!\hZ0c?cXH)-K:nU$Ʃ/I&AOe@\T@nE_&sIU(xT=j~no`M$tLIV8QdoZ0)nS&Mu/" +c߼ted$(Pbe\0F f3QB Ũ|w_C,ГHON +;5caɭur, T m*73P +q\e7ª찠:iLv7`$;QwF ح^G2٬j1k*9>OOpB;0&Ov!'[h^ o&XR#no]y#U*"ߜ_wzsY/ + +N&~֩"<Rw0J SU$km?FFW涒BHq@a4ÐnI]Nz+Y7/%~ȍ +Nj)2 /?"ۑh傅)41M9.7l(H +ݼѰq5P`؛[)-W, `amd HCctG虛#Ց&ֱ)8- 6629Q0G[! endstream endobj 3130 0 obj <>stream +0 H@&PM H7c.H،6 +=0[OC6B>;҈c“Ym;%&P䝜 zjK³ ~Ȳ +A'pb0녾5% +j )AK̯K>AHf3o]0n:<ǔT^u %/@|l +1|LLn{ڌ +AZWƲvYyEdEԜi5uhzd™ 6_;ocɄ4< \phe[ Z(iy;_R2a.N7CM $p/?0!+IIfL-)6!W f,Ή'qjmqzA{cs5ë"%QյGk_k{: \GpZG+qϛ.H _LpH&>pjnW4ZXπ@5>1 +1ǛB0YHqKZV%bt)@OOq 2]mxLS-z[r/$,Urlԙvq_(H/oFv8#O=ohQ%C+؞Ljh?Yd*[2dTgrO e₥,hA4D$~71jBߚCFD}.44v{M^g{!gLO5r۾CʠpLVpC۹`o=lܧgBv@L2NrMP2.e8% ; +LY]bD<Ģu*P7]b@ 0zf1Pb b|* .0Ӳ!x_;'ӄc}kv@%4y_*еP%cTw+ vAfȪBߦ8?I>Df OqL +L/:%K%ᣯe c }ӎcv#Dt ֥\R[qHtFS3j^Aɪp<&xKo+4D-CCKXIwݨ`{J *2Kji_O`%*%wjcxc1ť)8WB/8M͟l{ү~? ԋK}u/EG֔T 1\K;h. +P@ŘÉxݵVonkukJ=<@ri~`L@*1,yHc +䍺Obuᴎ]^S솣Rɼ*3Izf~Mx# No쏡AH e{v3E g:hckIa6&( _c+ڻāVaACJ$XK3@{4NU-fi ± ['wxT[FMvUx9kPNWsA*k҇zJy#BdiO|S^(%c +VO%'=WX +x\Ty k`ۋZV'| +/S1+(9ݔ}C7.O-뻳GcYXC_JpVdH,0.F&Jl:4Y#C#x Ú)×tgYR.kQoGH:V +;f-U=ğ䐝&ҹ_$ h[!K~|bD9Gl [ccdΰG #Kpo hZCZi +m`)kj%ԌM k+*c$fQt1ӥtꐢ>W8Y}uV8oo7l2<{\*d?eO2i/3LѵH![8%{ky*׍DO*th3.=\{Z +7p>cR@'i٥Ӑu"U OAx3@G.%`ډpqd_O/H +.N'cAKgf%͌5ĥ/WeIOA3@+F|{-z\ +z( yϳoO|wW:t06߁I ?M nHyq_M[fgߴV8ǫx3 R&IsdVúR +l|!(bk* +Kr¼$SEĬ(P +-~[$F>J%yc]IomcI.Sc޼5LϴKGVҴA]KmOEg]g w q zw:q?*k$ mʡs"_WX1X2Yazj~Eӱ + A}O +޼*xHoHboC%ϗOIUlɒj/2$N _B'!>x|Gy+qK[P.0#%&O1{ΛdU%54SZʄ){3cpm Mj&4%Ry 3TNY}m>ܣ\rD L镲%dvAdXk|' lwsU[BS5=%* i^ߕ +ml*}#I<3d8S;ɤp!@n]?$c(ˌmvDO‚ԕ?ygƩFmḣݽ bA,K񊒰GױaVRiDsz:h"[YrdhBPob6J {!$S>Q`OmiL'O I1G)wv;%j tf;kA>z\ +ya5Y +)piV9PgmX򲇜o06n۪2[~ģxYNڴA l( 0Sul|/k^MޞvW }0ONU^Oe]'?!l+Rqyݮ,b%y9V^}J/ҐLءT }C*y'ZՓ6PES,e jgqJ1k(/$HJ<źL#t#\(+!I3l| ^Iy~;wtWgvT JEؕ#vg6 l;=i!Npт9G ȧj*1yDٌ,J.QA +;h'>JyN~qqZfՓ ) " mr#JjV6O:i LC)~:k[,K$)tz\tIN( Vxy_M8X%((ȱF@п_Tu|+?K%rfDFWH!$g;K}9j7Գ5R':o +-Z62=}F[)l BZnUy$#?)xsIFAǺV|Gb"(jVC`EhƝ|ҩGsWNnq(zXHX(b qi50K&SNu .`ю()ă]?\j2T@65ћ&j)ZnEmc? Z킡m&\]ZxH[~(=4:# !_jU'`deԸ(w8`+O 贜L +/JZQ&:K[? +x%5*h{ADwL"rvΫU#NoQ+\!S Se|!̆-K+5J&UVIr]An~Yx)58PC .R*HDN7~ۧ֍gcd䏘n2:"`.w6#iPWp+A[s41X xt[=_OS(]9si1 =R|սk &f烮nrg7 H~OS AX^fG!˯cxBj_r%m}[1η|P Y}X(F<^FzwH% % ޶F`ԱxB򖌢_io6AH\qhe=EtCD͈`r<+*p  x osl5;jfY }2AC .ZOEFQ=nYt|EOZh9fc{\c /tPrmNJ>hQ`H~ 3("'2Px*r<#l^ +w @ +/?/Nn|>qH1)h$]:p2\Zhl V N,RBlO:؋օ!m\I2Y-=>q"يniɑE-+b$ܾ.̡W@\N|-XՊ0F%[۫$-Vf~Va&j杽N.mlDŽvnV"`: RY2.Z.NaF7qWgn1P\2"I_k RJkJw?"E[_Y*s]mm\26~0;Zƥl]` +Ve%2dX"kT*v6ФOO~ .F)v/yQ1* 7듾,mW ӯ=Ҝb{Wt>tsф|ER g|&]jQ|+H۝:oԪjJݟڥ{wNfycʲ(J#/ +8fcWzUS:pO.XPw~WU2vYɾENV,V"Fw*ʠH7d"mw2%?!JܠбJ0gzr,Y.-LA6@+uy>uéHn3Sb%hTӦӲK='3i&w +H-ۓ0?T xv#rcז\:&,]|-T][RϦnmSEb+U"wh*!dQ/bs,MWFiy` ?QN)x2m@ȁLxf!21W3 &yGC ȕf@*mCJ6=Cgn2!eeaZ-M7)&d@ d0$i4xވ); ϣWc\Ro+&nbڑ*ymN+"7Z y CjtlSvӤkv..eLgPy?sJukyY!-ܸsX)*ZILƹIgÑOXPϕ%נD296m{' ekhP2y 2*䏗+Om hsIi~q~a\RЙ3WaqvCߊ uNpVtPxg~΁*Lly9 Ҙ跗m_}]_@5%".\YmCUX́!Uve]+J{Ъ[rvw(90]A7²*>nfZK{jZT`<#wMျ f#.c_@v85}n<鳖hV0O=g*}(*Nូ~,^.SH7"?t ?\ 2ff_kqlwDɲ]gcp WCN4i=S[ch,Obڻ|Ѿ){ +3crC0K+e´Lʞ :0\M)%2پZEChFީ^`g8ӊYze5,^y,9zVT\bNF-/SaZ>̱Z ;VV%*_ +tM >7$'lc# +Dw{NFC# BӟP9VxR?Pʵw +V'2f\6ٌK0YV!o(ɵT}(cZ7DQ_6l+nqE%n ˜Fa{ 7 fC4k1͸[0.-e 19.hU3(N?A'[0MऺP 3d$۷OY*NaYxS#wJFaΛ*+=.-Y/8x?d,UG}]R3|CD{rU(`9M!dInZK|x筢Rf(Aѻ +!yW^q=Hx@I-=5+YZȱxFtTtVz7NTpffbتc6m&"~2NBvK$A&'a_Ͻr3)",?>FaK +eaʼep0*&u@h~cL|Dr]+hZ*P"HR~M7SuOH #rVa[1O.M#WĮ֠ Bċ@yM+<KW~;9`}}s.3JG1ZQ E-\ړ{&"0.E- @ 'nOLB+c[i՘)ӓHhS!1YμYbSoIߺ۠^p=&΋cC?=D*PڊLe+S8F&εSѷw}rxdCJ)4#u$(rG(GN] +q}r]?AP)b锔AG#P,KvՋJ~56!~ib#çyKU(MA^\[v;_?m"|܂{V/4<>;d7C`xCv]<8Vϥ)!@ +aiEOKyO`=fopIRQ@-h&xB}Vi>ZCENН~;.GbC+u߉46-M8;zn rYb=EU>xX q8`Wd\+@rOfx9'^ZDQ!;L<>b[ \*YN[&ڢdP.JM_/?o V\As4ƺ4d@]_;ة2b"?]bs1{THqɈ `m%L9,Ě^V~AnH ];NeJÍqvH01ur%?kNy5Bja8p{+ 939ߟqWp5J4Ĉ/cJi+k  2Ѐ$m`;N<;8>`܊ J(A9s͍xW.%{P}9jKN6;O4]%Ѱ )숨OUπ +965!L^5H{w@gb h@LOM̍}몡\ `7L( -ޡ39͌WSAe+'Y7nNOmEve wv_g$TU[/bU (g-^uw>V +u,?8Nˬ'&ҧ+gld_),Mi ` ٣>lt.xe-ǞZs w;uxJ.$jHdʅq6|t' Q>)Ok۩ +g⊈`뙕ogkI+)1zuxɗn7%6=9р{G);E:e7VsBg*ETS7 >Ow1Wl=6qOO:)ybTP ù=*([9FtiC&o-'X_x:z_cEvlZ Z\h!ߩ6[)e<؞uC"5$d_?N7 '$PA KذE܉{Hl鉻3IW jZ9hd,3 +>3jVf~Z|Z LxwCZ 80qv_KuXZCy.h߷t->'y>/uKv`ލ|fNܾgQ;V# +O I)MKPqx'rĕ;]Qm' amv@%f@:u#xTPC7K g8(dV6E9Lu=C.X̃R._\`YP1/e><1ƻJuzt<%;])3;z19n/y>PK2E2P{EH_h>X@Bz`dSZ?eMYaW.] +|Ƽq^BxmY5ap/`Dw.*dž{2}Svh(% +#đ7<%pGEmKg2Z|2nBhbxW`' +bBPnufw!\ݭi/V\DE Wg'0nҒɪUJ4} _s*T{=.FA%d|HBmh RAm^0fI өxZ3L)c ꦒ fkEMf%Usb/vR?^y".qЇ&/w m9 i/W9ZjQd㰇gՁTTݥ\#daayQiC}Y!Ȱ K# s7MDgTViœѬ P 8s0#(}71nG66#%A8v17y E +Ӱ)P!>ZU,3gm.oɅ3,teMfNhM /I"]vp1K9o҄*Ӻ-%lDzڕ-pievjS2M2GrodδlIw䌿@]aBAdb+JڕE*V7*f.[FME80x"h8qC}{ YDX rBFb)tTuqduv)^v-VGR +]04KEǸ6\!@@,E2[})K0 ̸Ek4ecqǝݸ`[;/THew"k i+ { wgxLg#xs9w.YAoع(F`e;Cј׶|Y54kC`K1i & +<>zGLa3qMZaێ|ȩL1R~Q߳Hh3j}rr*5KӃBGF{əc0 ck@N@;;>M'SV u4?nHA .gxF%aΘeɐ(g}whiAzT=2i& ?7[nSX$F8匽AeQPՁǟA-[9#_z=N7S,n[4"1rF7w "ă41'n@$܍hC7 ˳\1)Fe甅xG [ ~$BaYie! -7:m}K~&Y(9HVś~/4,Oi +Hi!LG`7 P5V8NZU&&l9)nNcXmdÿCӿ~./fa\Oe 4ҟ69TiyLSKdr-ʹ˫V-rŞ U X*l(n4&nj%wmG P +nC~cYۜ?JӃSS2}AS")O6"X]?'F(2kY><[&mu#k/Yj޾ޛKޮrC\o=Xh%SU~p+c˵PJʍ6;#Wĉ}v DMڠO|8:;9siEmV8qcn#&f7i227ߝ NU܉/$/&%]}x1/v}v/*/,ykg;LfLC ^RpLǦ}ms58cQM62}svL +#Rk-C.1AAIA,.̘^Fh'iH +z3irfZ*z޽&d/j|1;]$LnT5cz ̚AHm縣3{A~Y%i@c"!\'B0f +e[QӔdSE,,6cs[14+;NL"=tt2|W3.n ce1`4V?fPLob(d{Sfr[ygo^ +'W_[/IvyM7ԃoe;݃ ߤdl{$E.]J^1 +^ae7s3Ѡylֆ5d0Hc*nHk>c'Wcj/=̙]''gt3?ӻ+҉ QpN ?C +?~p`7EwipḘ( +ripCe)] +0m2:˛kA+¾,mG(㌓f_C吐m XBCĦv# +-2zB6c͊qx,,pAMwj89Dz&5x,ֱA?c#+'y*/]#aFUňY"]6[DH|A6|vg%C^.k1 uf.M].KS4qmVǀ JwA7N?+FϛQpߖBim]/kD`"ΗQs:<_?)p0jCG3 JPR?*$3(@)^Z2QAaa1Ħ}6"vXL-4 *;% s䴉?j&d2לgR4+$A|AMbӈ|%VIcC\dW|K(O^10|k9l#[F< G;+#OHRr!Yk$2I4fd"Z(`!.afs>6RU.PF8R*Bg8!NIP9ds3YU! pX&7D)SV FOm@.65IGFra ;KE$M#*b;0:vX&Ēmk j;w!⚢ fnma#wpY {.#O߄):fT 5L.ylyfgC󵭡^RП 2DZ`EB:% ۰ RnF2Xbo a)Lu1}Qb/z%5qk^aondP)L _ƻaROAMC2Mα*(o6f_ʒvSK}e\r ZLw_K3Fl+5X+r9_/+׏bj!)|NhÞZZL1p|= W z@^ gf2^@" +?O 8jUڰzIz+8"vAkQ]VN"td(x}`'q#0p_ێwl$r*dw^RSS2P$Wy G;<@쉭Έd )Ը?v3sΈRYp3$c͜MM-"O`-B?(]o@ӒdB rCwyjF/oWҤcIn`%@rM\ޚ" +RGrNY%Δ,_U%W1/WwVGgkWy eh'_^ȻX8=BE J,y?,- ^TҳDX 4 [+v~J gO0( !vtd]VsV3װݫF0 +ҨtnQis6$<]oL=/upR4Pg9usl5@h]`LZ7eebŇQ#_`_'B4ZW)3rAao"MMJa=bM>r`F˻uakP9MM20J˃~zYoRHx nlsjNR#0)J'+%]b$Țk!u !Jή5>_H/9PFj)ZY&Y{d<ZEsԱ7qʑN79g^vӄpT mDRpvkunF9|E|~llX\k #i='JV԰WNY/PԆ<#zc.HyyHjٝ@)W|gx߷ +nQ3)ݽ%Kbq 1 Tt QsT)ra"nv5? Vw2 gx~eCsa庚H+Pqp$j_r0+~v>LLshmH.b߼M+X_7 PBݥF(f MD'糂n95"GfA ݐ:b5HځX^yEbwq66ʆ~7N;PC̸",bVUͩ/}:ϵL$6A͠jx2E)r׆9Vg(A9"񤭊K}Ҕ;$#ʨ y6Mil*jB48`ՂA-&, +"0`J +R.nGwE>;xLRe]zAǝƛ+k&Oo7%-%)z"|T UhśC8qx~Ly~qUce7EYS|~im + -qp>8aθy6*Om~ٮOVXAoZ&2M*_":@k׸6ƍ٣#M/kkݚꢺseEۼ_\tȸoF#ƤIxd6cL5cYE'tiW:Ԝum"xURGU*'O{EVD*34D{ +I*r6?oǩ$388VXtP1sՑ1>EFpUls-wƞy!/i>7:7W6؄vo.#sI_%HيKV%tJD'8%>-T,Mނ0H A!8PwZN,`&OZ(N6dA^42AmQ}X<\;Jv!IiˆeW\M8N-Hk|*UWIIZmkU( ^ .:Jsb|*m_ؗ!mogaS>t~ 7RyX:Lm}+2Ȑc5iT \Ϩ[nLi1dy 粜ӝ tbXkܕ+$t2̛q.#; W83#n}m(vSs>ìڣ꺳z.(Z Pv:(pYu7_ٛpҢ ,D)ZP@n5L[ņmCarR/7{GM20N,K1fwqPU'L +~ucҧ^osa@`;w"d4WrS㘔nA'Jiࡾog?ZlnRτy .b$KG(#d +v췬Rֱ2 +_E?TAx!XB{PbW!N+-iP_CgGʵ/a&+S̼WK~)|CܮK(Q\<q + +J粡!oz[[M7)SYJ2}m׈dxǞȶ^HH *&sxYtYvM]8ĸ1-~97H > X'S؞Oy`~xdY̋ځB +v9(UdmE8>A[Ay趢SՍ @Z-.fɜRbqFƞ5(EX1@V[Jv LuGB?X) prA+Tn*@Go.s( 5x\B[y%N"Ix wjp?f T*z\٬(>jI6+&ZC5B!l^ +6-T k $Ζ!9ɼۥ)>ajJ@kwqD̊nS eȀ3Fz`e|34ʈ=@l{sd' A0KNЁ'G*y8׬q7 㔤( +"D9nM퐻s+QjH(=.[^FC.7K+" #vp[Ga ntwݚ8/EFsVYlEgdaƄa(oބrBB ݲQ¸$5M> ꟭l͕ϑecR2Zkh֞z|b}k gϏ7mQP@ endstream endobj 3125 0 obj <> endobj 3126 0 obj <> endobj 3127 0 obj <> endobj 3128 0 obj <> endobj 3129 0 obj <> endobj 3119 0 obj <>stream +HWnG}߯7@2_ă!Hy !Ac{ݝ{ś fN:׊8 +I(2~٭.meu^]"vUM?J#,ߒ"&+!$bZV?ݦ9ͱzÚ)!H:3T"q^%XcLTZ"j*%1P.Y稱!:L(F|dnoE nfeӋN//8+?pbNIgw۹ FFNjw1`L+&PM7a3$F(`2v wQllf) T8B8p?x|E|l۶H=3áiwG)Rvw0<|~#"U)tB$ʽbf 1f/e)f]L@zz3]i}k)Q:ji}LP +L1NcQ&=w"_oZ-l[ +06 M~*cX^֭O 72#sg*2}0cn]tA<ԙͷ/TF%H+Zwv{Iǃ#*o7QDT|$FaR ڒ T67 "В[hm3+ҏ29vq)6m#9+UX>Q@#Bѭ:.AE~hw9X3ڵKP >RE੒Jܡ۶?yd@xda*2/6ӡWBM4_ȑ(=(?% fGGjFQ0(-mn!9Og'X0?GW{}o. _KT^t'.V +sYa҄AxPKpTˬn(e]'|Rn~sPbbGfIeKHIQXjXCm7m6O v#~x6~`8!u傎à9qwӶ-.AL'>f'zY+a`py*%WCVqhͦ>)0gI˭.+}EViv5bm -qzŽ#5{8:Q.6-؂)<ũwPF$ +E)' CxJ/+ bּ$!(V,jAe]{ytᘰٿ*6.=̄vچ4Q=04YdwvkC|yiQNj uQ/2 JN;z{jZ  b0 nG!NX Uc_璉q8eA|Ma_ᾌXP +Q]dqbH`ӵOLM0˱gIz6m[d.<Lj%S~;@LL +yN:mBE Q Uf̠laH5`XLis嚲 `M~'k +!g, +l$}<| 5|%?>#8Ys Nv4[P1!`c+M87%K4lBR2bdO@:kgVYT<`y@ߔE< |A@25iN!Ʊٸs4`*ힷ0Қj=zf+U1Ea,I!kP9H7=OpÀJ$<~X֫O իWo-X~}M5i#"gL!?ֿ~~#7KB>Yapmra~ Dݾ[ۑiL endstream endobj 3123 0 obj <>stream +0 M@&3 M4gեɗm4f - 4yg,h `d/%}GW\釢?W*uY*v,UN5JH嚂TڦON8,վ3~&!dR עZ(T5p\ƽб:c1SY]c4Q^aHG5gvUe:TiN&(:ʈ40S_vPkЪX5x1P ` =xɹLss=yx$g /ʜ04Zs_T s<w8%8thBQ*ξcXؠu60;?g'caJIno?,Lz;Z#jaBg@OMWx +ɭ?\V/j0g鷦dN:?#/;"9۸R|SQcZa[MHQƿnQkql^-OKڋ^Kadq` ʬk#a՟4%axLhZlp99%?WB*7{J5OT"wr!~DgcgIA?dB |~o.W>Ȅq .'6 Ln9fXE䎲>A.,= DJa٣Ҹ$bp)ȳ;%u y>Ndm  Ӭ;.6ɂ"hO!q&8BkTx: &0}2s>[BJY\J #PgGHmPzŶz/nF>AR]Ĝ?Jq=Bpk`m6$Ԛ +FN:/oI§ܘ4rZ߆o)& +w3XIp,r`θ7̬d:rUG6YkES4F喝>}9iWΣO֚6t\W^S0oՖ7b"q'Zc3(PH(qNNRUx7FpƫU%AP}1(Qj0=7MufY}׻` +&>B%gOKuf$Jm}FZx| .]Ǻӄ"lWeuU87H +5tڐf M/hau!:KdTz׵qDeiE+͜l8G+#̡Fjo0TKp#AkYbuؾ۽/wUE3)L`Gbq  aǍ ] +s-X(|Ng-W pl$v\2ELPjC2[$`+gߣYѹ`LLrsISâQC b98s̽((~2pjMR xs#e@Aq+dQaI/l 7\,Ժ^D$ؚFsRn?.vLo wm'UYd:49S(Wnc3#FsYl?eM/e)hYʧ\Bl!}qY8".`e9=?R1;,V,:"#4CYBsF8} I$Y#An}E9Umif˜>ǀ)]u6) ׵밮.jcv#tfGm ".ꐈIOcɴBRIܮj$JGB?CK|BvKgpmHOg5O +uJb?h1["+7ZJ|imi={Pb#lV+2[(Rg=- ͷndz7/[VQ'AT,mp"T'Y'p:kϮ/dOK=f91 EU7W#Zm"cd3R1YrxG;Jr y8*Ag$;RPpo.#$Cd9޵x5?',ؔxN)*#𪧙O 0c!|1d"+jxr2X[g[\r{a^$F#چ3 pBnj֪Ǿa|{oQZ\)+WeC[!n!; XzVEET PWO$P @|(ѻ]# й\#݈ϗ2qѼ?{snr3Tk`ve$zK M s2;Nqu,S]eKo ++ @x( RB'T0=*uI*j4,si<иӭS sEqMFFs I, HR{޷<|m[ + UE sٓW緋8.c_g$ޛUsX5Ao&{,˟U'-$Ex\^݋caPY+T=O]Hm;I)g=rS=`yFW%G1wj:'^9a2[F<:o"=E&~5m~gCN)ju~Q_FL5H% DƼþn%YNXuk7KDà'&H@ 1ǚm "V"$ -Ϲ<%q!jI\#.٪cO'lqhRCMJf=D)eOt"D(XAqbή umo3BP!aGmtF~r)1ێm>__F/:Ihm6(b౲(e7u4%SG *x2at7Ҙ@-dvnl5#I %z(zoѝz0:e!_d|; 7!lXkskOt|m2,*vydn4qb >O +wrɯ~,<bg'sh1\<*!hDRr^Eq%3vZ,_ bF/V''/|%L q#欶 -Aգ3vuuDܡu^li)2xVÀ% ^TRP"6P*ůTzE +hy+SG$y6N%M;kޚ)bz[\c%#kNpI4[g#7/" ]Ogu2駠@ٵ_iaUplr}51dSe~Hۍ(I޴HI1`LKOqxҫSA |8 +6JI?sgboba?Ɩx$ADZJ{l]w5jP";t}RQ}:{PCA)M574T{Xt͢m +7QESJ +iDZ"2_xsDr).)eEKq J8׊kQdKN/xoveg'q1LLPuKW> SL tľZ5~ v`$Vy4U[kI]x6NOTX?sVow ƘFU&|>˄Јuԏ>٪:iYQqFN L^3bfi]8RP=Nxyd}ܻ:r%EӞ/ʻµέNMʅRt=̴̅ۈוoRru_j.kmQXGMԁ"<Ȋ& ʋV!o>n}'"\XU$q&.SOStf]sG"O[·?=|@KGAYjF՞fo(^fxhX]yiY{\ lGkI\ N :c+;Z: a~`:uH¸C-ixarL]m/\ߞϢ<9?'k`'Q@Y5h<T>ѺifwhNAEK?gХSvݒRЉPa:+ Ʈ,|и+R3ۥz oś&,x: GS{׬O] >^2%f $V] xO`ȍv"FyVAAja taİt[K~:gV yoGJ&"tBQn`)' ~e˺Bfс'Aa~܆5\*uN(Zq>|@>m5}|EH +ǹ@hzOk8ЛDfߨm6%൛X1pes¦0xo2& ,#u-4?ǃ&7qZ=|z2C tgFNDe+# +vd J؄l耽%bᡊ[_ 4WhAΦ~ Ч'in/pu݃:P[A7!u`۪#~TPVR{CPmں;d9)gAqiuy6<ϖ> $*>=KA`pt:PlӠ2-Kq qnl@14W{Idz@@j7݉4MmaB NǶd +&/fgy++=6Kr:4v3R:` ꢽ`a7i.%[׈FaץsXcvyy5R ƍ^-sq[zrXRwRQnLJ0fbsH#AlIA  zC$k)dj."pfnQ&FnBxکw>Uek(_lS]Li f+HբRo.pWKf҃_LIrΘUh3o]j~ly9j<~~?àXv(ĮBE:\*c SiN蜙j7+*;=wTɚGo6υHo͞gqm -3qkMV_w}CeɤO[ԙc @su7 =9JYaTʾ##[//e$صߥ5DFsj.~^3?c=ێƢ&M GYvH.̽RP"!V50_6GS" /d*t($̉2L|Ɣ+oG,!i'˃E$+JNv}hO9S" c{|,Ԁϭvt% fǓ+Ye%]~zkRqtJ"m#}eY6Tbҝ#jJm-({,|*|\h/orx,Τjj 0Jv@Ѹ-4i[bQA.APp՘qœͅ5P֟u\~/Oq3f*#EM], +B XIK{, +#QMlQrrl;ϹOh%񏐐ѱQဩgnz4{pΉb'XX:d ]I* ʉWՠ?ca(rcI:oa`E5<] w P'806Y.9PCOno\r#ZCxk;Z&C8R<)H 6^W(ga@ PC3Hz52c/7[i03|ӧ} ^o&j -F6E2ц6OoT}p 5P%V?I5ܱ;ϋ_ 혦/JXichDIGf']@P?F,%X07^YtW'J" +{ֵH^ehʫ]kmNѹOH8^w‡@LCFoYޥPpbb +Q3WH>(t璶6H@ +%fD޲Rm춥} Ʒ hmo{"P]_cXM,0]_3l#fqM.On7ᐘ5>6AHY^ wBhʒM}q}s{Ƀˊr0SgțEJL|yʩvJW>{kޓ4M Zx]&j}P/a"@)}dds:X*rRc39!?!#ZH0Pq!ph5aM +i#%*xmCF%([Pgެ3Jx/@_腊dNB̠1vfߙ!51 #%!/Nه`yy\Fg(1?4{Ƶ0Mu !qJYIf_9G pj+/&JUј!3ƕƲ*!7sqrXmo CŪ%3]{7gA$ X: }Hաs@rj˄M.֚N#Xw=@/ϑ 7gu#vU&RNAMid_WgҋmY'~%_fțH[2=y3RbI]qq3?({ŌpsOԀ-ׁ:|X+۰5Sdt9ȀF\$ `)sMYKAl|eJ:kę+U$Yep(^b X+̺jM2v-)y"z_\fI$+LbO_ݔO!wFsU leC lGܶXCˀb"7)ŨdzB/kn}"i^$"wÚ;5; (6\("{`_r!9d's>yߘA4ܺ$~AyBB2;Mև]@u,{(.^i- Ք(` +NM5TQxέ9Xī -Kzkgį ̢ (1Tܱ:&#>2Ý!ӗ#bȴZ:F<h!/d]z0[.ކհ+^2PN Q_waׂ[ou @1 s`7$eEٖh쉝ƛcݥ=d rX 3ydQS"27]5vEnDuaLgӡ{cIQ0}ک +"_׷^1['rpXEo LD`riVQ +:T& +esll@(O!&s\H:▭[m'{w൅jJwP +6(p/),6b}y 9u(cuvCr*=p\UJpA0p3 |>`~Zd*̉ $=)IN`rlGFxY̙3E+F-=A *-ߐ9&N,O{*.4|!ǏʦEvK G"ˊUd/=PGZDu_Jh: st4fڅH!X;?U + uG,3tj+R==.rWvFEf{3$%|Q +qg0>OO볺 l#!ZuLS_clbc:@g&ʱ(0ܾ$44nvB_6wB;kZ"6k@0lj3M,.ޑ 'G6#M fp藮 =F*~yHlL!IgͥM j v){#Ԅ,;+~ 2cOn0*!ݘ9jW-t4p#>$ z7G=r9g\DѾh>9 +ns4|K =|+Fdѡ9?0KC9z p!2v(}5|)WLmkcoz~y)]XA7#g";i`rӦ ‘|fq?Tj%EB%T-p2yuτcg`Isl6կ)ኺ@nuM;rvO nh S*7lu;`+z73K)';Ail v/rXc{:Y͠+B*dxLP޻p. wEJlx݊|̯oJSc:õ`J|ͭhGYUl9 κm%MK/r|wآJt/k;[~V:p.}anV-jJ2Ci$TQ0 ㎬4` jѝDVL:  +}~oiٗ@@J`{MnކuMkVWc,deMiƂ~3rEsϱ-O!Uϼvө-nZ$'HxR`P{uni| endstream endobj 3120 0 obj <> endobj 3121 0 obj <> endobj 3122 0 obj <> endobj 3114 0 obj <>stream +HWr6}WNw`JU"ik؎4>JTHNlקq%HPGIA 4rߎ,K\ +UOq3f^^ݕi{+߲D%ӺX Zc )'QYvG/Ͼlկ\J\kjsխ;s 8Hikc׮;{{lewz(I\9B.l1iK\7Co`?ې + 0a qcnuL8CnNTɤ9E&pSǯHJ꿮]W7áY0I!`SpyۮID,ɉMf.L%qꘆ#Xr/PoʝCk'B!*i={OAX'hX zmW)e e:D0$_Au#f-4.1ƑsP4w%P$cqJ)6}sOOa!|WAcuΓpߗ[D&/`|1?q44= "l3䗲3ͬ'J!ul?TC ih[aV(-XIlK4Gy̨EsڽU!1* P2==gKg;NPWJ'pt#BC dF}6HLW;XWM +L-FR3>8 p&Qqz3ҙ8YH.I7hmkrN@2a$}";0$<4j%+=%55q +l & ` TE vuԑ«$GmG8Lr5q@䑜g H.')x +`hJuJUyS&BZnb=:Ki Y-o? ƶa&nqTpT!i*#k<^8Rr梹ڻ~ƨ0Mj)E ԉ>ڶ8e\qZ8`n +b+ӤY{Q%384v{Wwk~Q=(z=(%O Ayk+ ϋƹǓ?^~xT2aDA%n4o\`ZrC,ۑMLwS0X0]"2Ō1d3us mfMsX&սVmjGM& j; +!siPj7uF"s](evqiˣX, +ȑd(5pX( +]`W(7)C0_ mkM䙥Ű=)(H[J^ *|.0&^~ Zl0VR "0V5!r)DZ%,U&-ΐ/ȸT &HtR,5HԲ?ĚSb>ro9 j߬?T"hyC+Rp3<]ASfyZSnlcj&c̽:q:kNCx@rj:xA@R۬mFN^HXhWR<BqYua!FLba&Ec1}Xu!4s +>9JۋiؤVX[OFj?᥿Ti]2Xv?|6G%ųo!9aS"7%f&ttGOm"nIV6s 2#͂_Mfp# 2@)!Q{:T=mHM S4PqjF)΀0A'qax1 s 1B#|=!:f*OH <MEiD&hl_<( 0Jxl ľk7@%.rj6nAa$p|-ˌ5%T+f;l[x1v^&Tbkž*p3 XƝJw4:pSQuSwՐ,ağR:<{5wDD+?sZ'{>n|D3)4PA}>stream +0 @@&I @E;GZ&ܰ?9tB~%7W90t + R_[*edcV7[C~; x =mAŰ2f b*m$/8GS26xo",N GptqU#Ys' #1{@߰7[zE8o5Ո 㰢EM2zho2PT\e>)TPm@W|)QZף|P׾F@%K>x.B\ʄ;KbnNY,scL Ӡj4Z|RnMf +]o {i7߀b"[8d7`wĽf_ut)^!/c&Slh=0Ê =GGw9{KByjBV|ILIJ+/ ϒJ+RUL)& )!FbH\d(DBhNZ1~#*rS~E^ZҠl-C%<! {%KPP.@RH*t6PC# ډ=vk"m 9a$|;ar2m? ,1[%D=  !N8᥸@_#c$m*W y|t +ٜl҆; ->|-'=F\ !H{`Isodj 1'ž,('S, +blds1;$IQ*b u;frk5%[ek:Ҝ"5w]. /48 ([¹=оg&λ{$(- *mI̖HN-;i885UEްci6W!>:dsr%}Wc@hwT)[a3@ifb.V9 (znA>GZ\Mqr={t9Wkpq| fGC/mf =r!U_t$eXp +B]R"fU6 ؜_ÿ);lE{Ŧ[wF !ǒ fVC~fOur{5œxctЭށaC)_1N n*pnH7 ؇ B4eJu_FXcqD/e̖ɫoSY +j6ߞI,SzrS{>Np)f]%P2[<+]bXr4uTdA7W_":W0Ok'yX/qE3_≯^4> ?FkD;6Ϣ3YB s1RA ҏ .ǵ/ol=.:MB&9K:Ph?k T$Gcd:MC-W05"]RhjmȦKP&9/78Xy-u_Cs:LJ>.*Qw&bwd4>T~xWo)'{w^@IXro2%ӰMv>QkR)f՟֭iPWG6.,~o%lb)6~t $4*y8CӪ`| ;]@^3uxck=' F g)!KYкZW&Ùr/DcJNJ:6+f?yi5voQ;UVoGJ^-G*!pv]J0P~҉|4&2 EG%w+fn%5tʏſ RmE*>Bոb LG'0ݑ\9v9wc>M sp U!}(?nGK__NLR*Yp-dw: ? 2D8y f?1wτd|.h[*7riuZ +Dx&^D!$(gu\lfI3 +(cYsTVLӲyjm3w5,8F؟cy#V>BLe?۹fVJȁ[e8b%&ӹoUo&ra-EsLQD~sr\ok&x6[p U(X[ +HA'Ǎy"`ԋՅ"X:V/5C_mDU&1E_sPr*ٞ@*'lP +N/ȤE' Vٿn<"HԢ7k!-3WB8P3R$inR=kڜqy3MRG,Qv-C_x<%ˎ,FxԹe@Iw4siH#W<GZT5 t_8MGa6^*Xږ4"e;[ +o'bK2⌐ 5Mp1VRe/> +1ߦ}twCc1%n,cn_};1Fk|2m;oGN ." ~n 1lDxEM0}hW,3VǺʄ tװIIE@GW._" TpP'>%8:a3&IPs/؊]~TlBz: 2T$Ml>% Zk8DsTi` ͐eq1F$a %V8:,n6R5 >1ż +1:gA{&V<%,iOos:F[!kpU)Ÿo G%WF)kۘȜ} YC\価t9bJ(ŠZ$cBWObP5s"Ż?Wwe##b,}TKY-8h.o8br"3󑰉VKzzt]6 4^ZkOKK4Thĵ? i XkqH1wzf[lϰcXU8)dğ$fqpm:`쨕+~mwZY#70}H~zMq2=޻reLLՌ +MjV p<+G823+Y:d1ΟLubd,<^!"LbﻥjKpѺͽyĘ{p"B+T_k?x76J+ +0枣`F4_9 +e)Oq89P +$zgg/x+7LJX(qza l&>xIwZH?b#q}QGa闻!Ý''0IˆlM6eg;!q!Y;lаQ~2<7KZ|Zc^!nmZfպb-| ODY]Hu@IH)CQ]O={#4Ջ']C=C|l+ !Kn(Ɖ_|o Gyd\'CzARA6X]֩o6EfbK}2Q6 WenXFVP.}}LBI3b7nRi{*yhHl%YRN45,Y p %ӮV3 +]óWK`o1O:8TV~xykHPiZzkR#ڳ,kMcW׍:块EWGIn?j(UAހ4]l)|V1FVٕkN@M=lz5HChG듺5Ɉ?퉒Ғ9g\.]º\cZ셄d:o= tV-f_Va%}]B3bj#bڐA_<]AF`?KCcF٫$VʱHr D1P21dzV,GuCKM)3C8b}9su|Nb|@HI{o{Azef&(rgj㿊DI'w9fhҋ +3g+Χ)g-&2|uQӜN20ff:2"` Lr3H4ϣ0 AgSQCYJp¬e:Em &$,T-g0$=ɕ`Yy % / ]2_ vEru5T,YRwm1%a{0 jz.)s t,0E G:g6S (xZ/cB&~I" BZ]uFpRHdT|«=?˝K Jė9Dy՛I=ז<8Mʒm _w^㶆ʨ`g^S~=GR=Za1I%-Q;b)dIf*HKB]FyoZ8,( +8YUBLBEd+m/\OT&{hTJ_w+LĢewQ ( 8 )3%m^3Zka̝܊>})_y~A(^5S`IvptyD9Ln\hW;HWȟq3Ac29yfԟa.7Xeyf8)N{wv̘j+@{ =kt)X}$ |D`[{ZXMhq;Fz +l $8%L|KBPA +Atm0qXd?`@nXk%h91j1RtÛd,N#1^gV Kz5;%hPdX1arzh.l!z_už20^̸Aӥ#2ߩL0ӄM-݁J@cD#U剺OrX мHnRo(͢)\O t +0zL䍐qԦ=oKqܕކTb]DBYp +c+>+$' Biߛ/=rL7 7.t$ΨXҷ1eJЏ\r %]uϝs[)NEDZ˔{8om ~$8_GQ|%q楰Ti{hK CTq]U"qq]XCs9L`vZ3@,dNO.1`X$bT]]Wy4Ot^͟Y'D>Ijm\ȼgE>+Ğel +ֽʋAΪnAHs + +`%uRQ 6l|MyZ7nZۦAQ94N Ė:H>J=uot`=.!p?tT FYĺiRY{ !>i͞sevU U%Kf[љCQ ? fǣGr2{@ۋ[R ) +bipp601z+rx(Ϭ $&Z\tZ$##%|(OflIk؇-{3f{eʧt~?zbLZl3uH16M}Yx/m"[o~՚Wwǫ 71zp0#,էUy{6h."g :98U 0z +>ckb507y "L t{vˉ.xze_)e@|kVw3~1'Rߪw3f?6,=0x1 ,af]r!4Cib#[: ]Ӿ<<OBږ + -GZ!d'P7y{5 z^Rl88JmBw-YJaMsKQ^lt<э $RN+kf㨅Xge5vWJNQK?k%69vCP{JnyyVx,r;Ÿeѝe#e)M_}$E$ƌsg?A;$u/.2Kp@sl3Kȟ :vcwOc[w J_b:r\L z:*QV.lE>7qеbE"T8!49^Ix.N{^l*" tc>[ D(se 7Z1bym"5R4ُM$3\98!+4FƵiI7qׂ3*y0唻 ]5|j;BE~NbMH~wF1W. ct-jB>xpu"݌tR `:۝9t#`-vݫmg}'F-룿pIfZL ;$ds JN&N1[0 _rC~垅9.<\.m ,\.aa>.U}NL!>l{YO*X+hDU;Sg}?1M\"앟rK`9?;I4WR'ΰ^1k̖3YDb$$F[ -O6!C&iѭ@E7n[)A,Nd#jj,OG&ڲe8LB!,^J̦$KZLxKIa/Bl>*=LoE$"AF(ỺDUxc,&+>%TSSǍ.1駳n$[ʍYN4UR]g~mg- &3E{}] |֛~-={fn9B\Yk^ \yphA[fz2I0Aك +a2CEH@ArӪ\$^&eԕ~is@?H-Ty5Gm#&" h2&DZGVހ&J$s7EVk7%>=!J8$֭U>9=H{W:fw5Ub'Лչ%-L7ɲTUS#Tf7a5iZ96A%bo +aVzOTETk= ޞ V qŧV+[ש:sNG@Q 2ڂ&k9QɌ.? 3HL1kQJ>g.[Iۡtۋjf$Pyhq4gc\lZY%r 5Vɥ). +6a8*kV8.K!eߓydj95o7gk5TfK5K& 8YU[-ׂ|WtoxΎ*G7g&I2a&]E@Hݫ~K:f7]z)2Ko=H* f1>@*xlhEġJF;53CC@ݴ?fQo= +8tz"_ϽZ7Jv1]!]2eQ]ܑBQJ0dB +B%g3ˈ\U^tv|Ag_j($$d*Gike[x'@g*3:&t T* Zzx yjs kwJvHfw=^6!^(0M07Sw)Pde|xjf퐷 %H:N*U,݌Z7Ph":v=Wp$~.jR=qqd)q?,}10'~O]Mfs[K "kKXETZ`@)tFAh3c#ʈftge^kKbOt 4.c-ѵyK9tیW }~&?"k"" |`k;7_ٹIL`Ņ[=H8/y8M 5,a@8&-LWT3*/%FXaHGIxo]pWd4;ie7\w#c.chK]okt0<%7@Dďl"9 e;PiH9{#2FAxq98s5gTEo7V K3,Kw ]j9h6-W=6O~8>]H%SfM^z{h\pua_?v{``Ϟ/[ݺf|Y`_sGt +/ECo#3jo@AՑߔO +>❫zeh<9. ?M~tܒZ;6%6͖h!"wǔ!&cG%w"r# 2*# A2M`Қ÷f\m\q ׉[@XJ]>)NԢa%H^q'~@ǭ +y7ર]-lcj颙"0Kk,vJ33T瘡g&3e*Jq,VڶGeWb^4?'5 ?jt`QÅgg#INZh<Dd\/ +E^-(U$ܓ-ԔvnPp|g}ڶRXk3 e)L|.^#J 5Z}OÇ/k #)i 1b=qne?6 +S8rD=x!M2)qLgE( +q.|[䩜BK/e2> +GѬEeb6uTpίh4 #1S]Ed/ʸ}{AU7@pJC4)ƶGezZۢ$F~k3Rҡ}Z5bI`@q6E3=d1-$u#crz๫١*Ru;U [24HJ#7 'ޒ29z%0EPj9 <N^_+"xVXhs>.[X_k +-;Efp"{Ût$T>o$m5fkK(e% +%E%*=|z ?r#Ϯ{.Zr|Aͤ ݻ(v.Z!Ȥ2ټxsuO] 'PGea"^XT|h-JHIXd磖'R얉 2?nظ (Ep_g)T,w=c=-\Ч#hP__q},ʦfxP\Oaק,Et,y%P2i)̄BE;tf/MЮIw&PW6MI3~P3!so%Df6"ʢ_lԴn+?b58N'J1rKmq,L yI $G5w:Cy, rZQE}$cpc[}gM3<Qd( ڇDJΰvM',Jf(7@gҹH>+]T33n:LJz lQh.}ٰ!ou0^AIϹrm&% @⥂%)]$ޢ[}|eUإ`q=L˰@)_|9oJ IvWumeL`W!s{lV KU Xw3$O©ufZ#ӫW"Mv!:onT׿mhpluNN1|9d([MI_WhzԘ3 j"I'pdjb`q[6UA:[;Ux{rT:6(SZ!DB˧:IT7nԺ=0 +p s|y x]ʽ%ΕPg }<fȫNJ-m\vOЂ#Ņ1~l<\@UC< 2d^6=jN EM#;z'Gcvͺz!#aCPNl7lpOSc }p) +rrA  y + o19 +w֬@v9OQ5:*9WіF 6[*YyTșbh"\,@E,b5?O`gKNus>a[a"On+MD N7\uZQ +~v4zoɠ!iCAiRGdg32jOrOKjAQP<ϟ틸4?,I6} V]zطRo|HB-5RRٟMv~#qI4]u'L527_yYRJ,-K ˁD x?)~vs_|2)ɂ2m1̑7l*gZ:)odL!bªYssxGCRWbDD 5745CaG2Y ,跑&` UX%FCC5(& +.(*_DѱRఝd2sɳgprw)1{0" HI[I|MAU6]t>Rg=C쇪ql{IAqˤX2X$TSl|)@$lϱ^eT}_RfHK +sXH;E5ik,̂0T*X| {!sa FEj8uq*f9<QOg4՝TpDSְc t;sI$s2OWT)e#H 6=AdHq;->{fPpȜ^¸)E'a}7;\bQbc<fZn=BYhh6 +Xo1,GL9_9Be@MPK< 2@Y{8w:C_i_T"NY!5 dnV8'SP|JȀREG쿼PS)kҍq)0#n(>Pt+.ﳟ(0j]l0X< k&5˟77M1T<[J'QT) Кi+gn܎dk9ۺURHzl7QCϯ A+pc&)?Qv^ ߺHɜV3*/O4Z*$bj|Kob|/}HG{D-ssXQx\4xV'/~n5uQi%?Um, + rOe)Ds +rzEgg9, 67ֿp0*U@-/;2iBs{ |TU0 pF?+bljװUr>Ao0ELE>XVi;n!ƈ:[ؚU+ 2B2B31A`Pfl9=m:SU/ӳM9;4ÿfGE5*zęrǽT5e5s5*ԧQmҠfwmOUgʔVk4/ا!a"wX7ű[W}|P'J89cH'Z}ؤ6o3ˏ7챨Q?aHڳ Ky@eջ)H>s #S@`":b["vU>x9]GX('nJ CIԐ" rjWqqKL7xt-DHbwrrRw_:7>&p1+'s/$F¹|R1UF%^pZ;mCcI{{_en }ˆ|f"<nT5'(E|ُ󫪄d};@ }h[hH۳|,/ }S>Xe|+85#ݘ(5O)y9Nd4`-jx4e d~igJzƤ ᲁ;C+Qtk: ߷ڃ#. +Vv8) ?r@6Dh;phBN$[jZ;UzGe[5нrsLﮤ =AnDvqDqDB BU|B^֏jE"zD Un*Ǩן?X:~r4g [,DX0'Яzz7u"4k3oZ9h˖%ZL";XvT6Ԏ-~aSw̭١PtկI4=%|@YOeeoZ+: Cjhk) 1Lk,(Rk0sMl6Lz{PKfcpFwW~p-ϞPRL> w:559DP1(ln @O!Kг+#^x+ ;4arqŬB.>tnq TyEH'npGb 3+4y6 eN~[kYn5_iX;Ix25ꭘ}T)ni F\tɃfGMQ۷=0}l @"v 97β yz(Vt,S< +x){NrԵ(( ^кʻ<>6U hbX[nюH&J|̙? endstream endobj 3115 0 obj <> endobj 3116 0 obj <> endobj 3117 0 obj <> endobj 3110 0 obj <>stream +HWioF>%> kl֙10@@z,.fYcV_ds,!0`fWuェj]20?R#'T|lW^_ޮ_zB%"DmAuW9 SsZr8zX]ֵ[s}L_\M5Ÿ_NȂZj>t~^~?G|mv`O?~(\hx +MTpo*U"]pDKE{.3GB^G@j0YX~̻)),uScvA5[_.>|)Voϔe"@ks}8OG&eijHl.ߍ)^JD 1ř/Җb$JSK6*Bhj!!D#WU=IDTQ Yi߶ W.Gw7f?#S3NJWŻF\DݗDQH%%ղ꓀Q +M?ThA|pk본.0${mH0ЪRCYLe/fx۩ ׇQ4Xݷ4s'-I`=5UH(Jj;6㈖~qM8$zD#L2uϊL(,C 㥘|3݄F,EW=(N|D}&J] .0%#dbon=YܷswS 9xR+`7* HL}gH_׻"\^@kqS5mݵd4Yea~8 t;7SJa,$KXC43lA$8(v&7"? ÆH1J^Ƀ6(Ci5M13j@\BƯS41IPf5D7иې wsAtB%p8!,u-!$DV47վKtDI#:xF]q$f 鸼m¢ % ϴ +į# +NGy܃]ad۷"tSv$NlDV*!<%lj}ސ70mvd׳ WM_>Vr09۾/5D# Bb+IxfRfn`@6p`xe2$tTKo̶PVl'$N{ӭod}$>d]m`\gzH,ڎvC1+8 +²?0ƒ"gNJH!vY _j82Eʨ{J(JaXjh@sbׅe&,DUk Ҏe dh$z n.޿쇷Ōp6K" `v|gմ0fƍlu*wEax(UIid:* ʔOr HBϱ:-|wuJ8֌2~}ȹbxIUFq8Gtkt0= F/) E`B3֩Mj2d%j2oV, $ӳ׊d Xnl.H6"R)2].:qb${Q~yegO=-l[4ly'{.*)-3kٵwrQEPt :e %a_2$x:^̎,k̭nx߱6Ͷ=$"ATϑYX(HռMJ']{x!(!@¦6 Z&sSTePJKp.8V΂'tَsyڟY^_Sr endstream endobj 3113 0 obj <>stream +0 M@&7 Mo+5b1yna^UX{˺*+ZDz_MM">ʬ#3¦mvy1AT@uǍ9[&xIOW9 fXPÑ5 + u-;R;na#B5)з߯TCyouHqG^f#'gyBv3~by*7wk'WBBh24  ܯ )БgPGw7>j㫘_Zuوݏ*]+\: (* jo#A"C{pOLB75M2lizC;oYIF˽G +:}eFca /_g'ΌgآȢGĮ{ƆRL3L9:>?`YGJ6 N9n*͢aplMKxX7BdV ޝsL篣Ba49~)^ie0)Kr$ԃ؜` +{_myj#lJj]P#[iu^WhpyB4 m?P[NǯMk;K2af' '}Nv*<) 9+AP:ii4ɲ+Ioh[ n"׺5ٝ\,ƋPcDEN[h?ĄD>'-QSM5Ho)P, @&5BU+pQan8_&Eg/ApDŊ 3dqA$^rax ߛ9@;Q!1ɼ2f3>Ρ#oHwȣ-7jŲRmu&N^6Aq*^Q5`O+sy0F*ύ|zk]Ŋ}hz +iQQ/̮fƖ ]F%1k4d%r"fحm޾ʭ6 kAm %P[ sNnj7gG֎j.;A^Ee9[f_K&-6Bj7ЅK}el]FrZq-HnY,I~x<204v,S96_Yh-X:;7`Cu V_p)x:rduYDP$`>SQH5|Ix'~櫬C#ZƸX7|UF03Z*)o n4(nV .DotGĬAxp2ڂ[ae>_@H1Z2P $AaLoL(D%8Hˏ"-6HO.(obQ2<Vt'­P*GcERźKsG\#v龲90ؐQf/#͉ۭFPGYyZNDrj!DUXrWge:ߡ2e@lB@\GR85/gqƊ2xw=reA4/V =ӋN:glB(IBQ! . ǵ`U~Z TV@t~ρ:D2!A5Oؐ߰[@,\ࡱ1DٰƯ;))/P`=B)le{7<8ǖ_ajۗ$0LXW[b|  $uX9ك/2(J~| yfdAh*,>?7…䗘W˞aKr{hו[: G12ނ Q79hIޅѦ?3H nɉdнRr gEhh߆U, }y %$$KaR $X/fv2!.')~)\cwJRҶ;YZ߶ fd]1RϯGOb"UDg,PVtI囻s/1U[.Z@)+Wن_3Ӽr_hC.ON^|TfGW J5.EU6[Z97!82 x3~Fy:ܝP_s^){^g.lB}chWX` #,Zg0&yMϤ-L?_W#U+xIR3go[w9@Dh~rv<8<F)j, >h}Vu+m +Na}9e4ݔ{QRh6cٸBC+̡[u\C>Y'$g)sw)3p@b=Ho 1ꮨ IʅAGsX}[Lu}249l\.U`zce8Ҏ쳰R'D7ҙpq6gNmlKyN?p((cb+z@id"'7󔡀S|Ocw"oqrjDMxMvTy7:<;pCpǙvX!Z{5$E^7Ԗ=?NutmzߓT4N47EP֔ugѧ5LF&8p&`2sRmlHMO|""G02 `OSc!6'G!CD +]x$#.X2{Hgb# #EQ0]5>_Xr$(x')~@5GFg?N +`MȓR˽s k>vDQf^"a$C͗$RD%HC|T}ՌF҂@X'DL(,4{ =Xy\b}NGTQPd`+#G}RNC^huKY7443LlP2x."{M;;,h/A܆'[@]DVG[c^q6`PtXn7y~i|J|@)؅ra(ka +1>8DCMj=&]OykT[:1~uj݁$(BR} +5ӦB}$&@f\IuϐI7%Yy M^If* ٚ-BYvbnpH3婸+, 0`=7%bv` ;ه}K1 m@սĵ6ĭCWg蕑%6cSZ"IUɾ#l1ÅY-_,Wa<>ΊaXg r5Rݲӌ4Dو;AVSif^LNo1f_Hb >2F޼}0ݯY[C"gKWZH؋ǟ1hѐ]xȇm\C ,5i%\Z(U JMІG"pnWs >,0X>44LI82l#J޵WhUpe*uPz2yφt_oV +*w9<"xBL !yqJ:&3IY1SE2mS75år~3.FɆoTQg}ӰV-QǗN!>mj>gMt 6ҡ!ص#2S$f"@Bܽ:lPМQrrιRPxK3"Sx8VoloC SxNخ f d +hOF+T2lE񝒛,};E,wx+f%@f)[2H9iMէWR'YoSh|i觓vӿNQKrB+aY=!4.w1mO0UƯ^깝`QUą ˳5ێ:*$AY7+4n`@1뀸#[! E%k~Wx; 3K,s ʭS{Nf 1|F"q*9NJEKO ;tTɟ)A7]C./V-exἎ1QgMe(߫64^օrtv@d9AJbȼ><;Z#W.s. $,ONRg)v t DCFyh}zώTG |aJ@#X$C;@#8sz``cg?)'ODB`IBk—m!y#*F- C}Ss!Ha97pGƌ1#Җ,Iq]gbOB/熰:= +]`0+^lȫLeE IpBX(*_n<Dž >g=c@~ -:d3T=]G4KaWoFXCz:o2Mwn3殖(v6ŴHY<JqpuE`=hze`n V38(TʤiH5&\4$@~M ?lyh30W05dp,? &+yBQKgU.HAtl! ̟wzuS@+rnjhtaqFPގШD4nlCd2'B,z*ae0bFVm[# +e3B4T~bq% {";$urLFm"5~p0dko s+ƪ2ߊtH& + 4KLn[Hۏ+YWYf{Imf+ن2 r'4K@bY@0Պzۤ[/2V*hSAh?w@E4``a]!jFU 4Il\:~) ARq=\38f&ႊjdӊރE_@ )5`45482U?9Ӓy7U’+ Z4ɔk oFE}[r <ʗ+&5l18w],wVmNQgyYϐ0" +vuY>(%Ҡ8,KyX>u+h.|: LʎR:=!6S|I'0FAZ!sjMԀQXI?X;EаQƤZ2ǧd&H~Mq1wC#p2b฿(>m;Zd)m`n>"MϘf g6&ث@ոRާOc_eD$em&PvMֱRPpg+MȀ|?[|*a5RV88^c-բѦ|$/45f;*w]D0vKj׌.PLN(cC 9K כ%@(GA$\, F`.]2> +CUzœ&|_#(Ŕ> je +3YkLzӿ/H_ly)\t>ڬǡ\pXQUMmEѝY 7ph_j|=۶}s{1o +x~>o&@35 @i}+XF Pɤ|n3 nCdBP tQ~KoB@b5(|+=NQ?SK$h`̈́u80U*DݥOn^E,~NsyrwV' j!(0o佔AH K +1l.&#:|׍Oq8鎝WNNB9dhFfȻ=˒=>'V|d*T=Rİ`q-m" B/Γjiȇ_0 {+`k2E@)7Ɓs6^BS;ؑ>"6]cyo̦nn +@q4xiiTd M?x۬Z;OzjwiSfXQYIuywK.7 W*3ȱ6#jE/ +[+5Ψm3>q)aߜj&Z)29G>q4ϥ7qQLZhlaIAj׆Yꂛ5P[0zָeQN/%PL|Cju—€qlywˠJliEɤSr8-ۜF1ܞ5 g_2B#*. NC9!P]xgbؔyud(;\+FHamxo[M20Qo{t%qKmr IaihGsArItz8Ǣтnws4ԷڃybE)YYw̃X;B7}A'dp쁋Q3 WDmmRfIuOtM> Q'jK)'_Y_<鋲=; g$8UF xGWaNӋrd9zv6 v q2{A"]CmP^H,򁻆 +^9+.@zX$(T|Ff +NDR*/݇/S崒)_6\G1$VsaAV +A:tFK4Ś nhΊiv\, .o|' `!(ʽ>l:LvN&$Z 5D73;9S Pd{g-w*Ve1#`wA`&6>,Ś^ f/ʸ9d.yVN!yx_H {t*5 l'A(C5H( )d}OL EGo4M+) @Y?$칑t lt>scêx=e50I9Tt_dK\'U8߉?rc *tΗJn|Y(“J4އe "Dyv80AC"Ç)ΉR۽Y]b=*(3^sy0fIR跰 +[h=rFGxMBAu 0+NtS5f=+U-BX=QiSh:%6-X;y&+&l֌Eow#b溂lh\kz䵗aJHCG"]d7o-F"NVm$ Y@z*> uBՅ 6D6uυ0 pޱAP 6AQ")N:e#Ü%YdbRqn.^}\A6&sQe5:he+uF# bE(O>k30e6 E t `BP.RUފY\2,8*wQU'zosz +;pb{.õ(V'W5$70 > {`\C<~.ѧYo%(rk(Q@GB gx?9 x:Ƃ8mRvt tRr̂_p+ɛדLKп&K4yuNkK G,P֊>P*Vҡ&; t̋hgPLBz=" ' GלK6ѢI1_ û#K}9ūimL|m(D^!CүDᔵ@3ƥTSӘ.8%NM6y]'C>"YCFJw4 v6#g. Fbd3u+6VlN@/s b G"*_4ZG\~nk~P\GSK |U 9 4"]jԆ!WfKj0`t\#v*P'L𕰷5D l1#5yJ $`Y]t}: 02X7zB~)`Ŵ a؎*,'n\Fӆ_UGG]vmY:&W{Wf;XBez'fĝ&-h* )ꓚn*{x,߂̧I۠<)m")M#ODyI^8_8Ł`Ckҧ +=k0\$y`emx4< 8rVݙ| IKPFscIN5B/a !f…7wtGJyhdҡd:V>37 +:??b4:Ek"dQTt|Ť2H\O=mǢ"lbR|%k8+/>/omр0UGg!D~x=F?D=FHAo2~iyo+>7i8lҾs0n oo*[)=fGvn(4̡hB|ɏh D4tJ:'6ͷ:<~;~I}9RVU*F5t is]{EiaWrޢˢ;LjfoݖaaïQL/'Pkt ~PjᵶS~ ƫS)h"!ϰ|`QQEQ9lY U)-4-`dGzΌ2 T\;&N2[) 'a$s|UzɖwO\"ף}O5845s=Oyhq,˄9>1YMo٠|iA#qJW9[-}qs'+6嫬\|Ѹӑ\SUf%#݂HKp;1~ME_>֎%WEb%J,҆_23[֪8 +OKk4%!Sؘ*W~qR}2ғŠҟ=phR/NNsU>E-_AEM!LL2>Li0h2oP6JᜮH.@-W. (KG\>koi9%I&x8<5ژ<ҿ? +c;,^t +Je=ұBy!x ܸ +KYBF]#8d?7 n&PGlhK8-R_Ss<:_2)GX=i)$$lMe: +\aMbsC`0MÁ01ou]N퉾}df0ڭj%Ų`nfR&Վ"~aG9ܣ(`O>mW^\FGeX2ӳB Jk[6pg]qhs2{B?5)*ɉK&&_ UA+Y~9KrjҼŀPP" BS]FCc* + %+5`V +4A)E +O]%Roo 1 ~e( q$1P7c"͋Dxmz q =(U!C7KZ5@ޡgn/Lۇ[:ʌy5Ua MMd46WgG. Oe?7ƍS*6^fXsx(&xyNa0̑aB־6inWϪ aX6ꛝF> N51To^ϲvr< v|:&~T3JNAo/_+[;Le`mo歚XhI aDg{a+˒kȄ\񀩡4{~׳3b c٥S屚D~4PLi²qco#L&cSO*S7}ISx*lplRݽ=D Lj@a6$\gἡe=`\v/?Jqu'H ZHB09XbJg<߰7Wm=}j +4{^a\ԁZ7<*/9XCG^˜E;8"f 9%B𽥟$B>lM0;,qBvg(i3/->ܴq=17"q M,Eb@\"90}Z:+ל>$jUҖًgv>Ե*NVi'{lǂ)<(EMed[dK.]Q͆, +b1^m[tYUs5ɫ4/x,B@:@ JA(ȝsYl'\dCJopF8Zcl9J+?" +fJ5pI#rA7ÖkT7D86`wxC`%jߌWSQ/y1 VUts݊%95x|2 Gti]g3픰N񛥧J֭} GTCO#?D{6kЛFЀ Bi0/hbΨdʰFy`.gZpSy4j(v'ٰF(?B?\LE)@ pNW,7OE]Hd2gI6DFdZ^+p(Fjic rZ/-ȭ?QFpbX)I3V.D|2e 9aA5ebO!k1cm endstream endobj 3111 0 obj <> endobj 3112 0 obj <> endobj 3104 0 obj <>stream +HWnH}W1v/' alX=@$lF6Td+0 &ԩS`F"1R~$HHs.5x^ ~[XFYo5 ūm6׫-֔Pg_:J5/wDHP&MG|pW6:ɭF&f +.s~y_}iv`osTse#;'x'̃s?k'Q]_ֻ; dtvΨ +#Mójc +c4<ʢ3]Z(kEB[H0^[=V]5B@xme[@iQD{ܽq!w ³F?B樐HM.s:զm}_%1>Z[7o3c_tÌy0I'Vdޞ)X#ӻ^_/^W% k@CU_Z Qm58_qh41ΞQ$O^"JS9}pgpg9b-A"E@큮T`r-, @0&Y|/adf &߽F-t$y[ho rxd}61rKM{TWnͺPe ОJ!2#P29}cW>nہhljoe[ې]F +@Qs;*P9 Dq6֩Lȫ˲ԘP$,J`49bc|dHL, 44% +W08#Eafy +W +Ă*`Lb-Óa+&BCջgR$H Cc XS.wC%y!#S̑$rȡY,PB\2]zt4N6PLG|AC0RB8P++YVrdtRn6{A`gtߌy0`&2y09qaFpq 9}U΅u6 f!XJhWT5}ƒ<&19?C89`=ջr{fdAK$~^uX?qDWjN̄$&Q¨{./ݬ-/qb[c0yߛ\5LLF\VcJ¾ooh EBlߞ]+@07۪lrΒ`%cAj[6q˶\S[i>r>\ʠp}>]D34N[,7' %b-#\ \e,<6\m~N|A:t!}&Տ&N8|`<>, ym>_w%e~I1C߮yKyQ~~ hF4#(a|6Pz#0,`yk5A>osRE&w䤊KK;a$\WgܒH +ʱkb9\sLpᖧMrWd2]x8uls}]B 4 ȡs:8_[;..8#UY An E<م@Li8WYP`צC{?4~ĦbHljR U8̍GhAf>|‚)̐PRM?6~6_@7m!Ne(t`7U(Ld[N4qqsB:wmrP/SNVðIHјXgIdiRO$t֜tK7l$E)d TYn6wpq]s%t6v؉8qz\Dz.|, +[BO|yKq殴ϏΈz886FfiB[[`u]$!8l* endstream endobj 3109 0 obj <>stream +0 @@&B @ΏJ{GrGRlݕz'ex$}]/WJ鐰 u +.@f紐;\wsPo%0Txt< +Zn*7ygNuU( -BqԜV9PKM[܇Uak,Y 3&pm.r~HYh\ֲr~el:(ҽvu q0cj}Z LLh_K)fQ?rgb|ks|Γh#w/x.^7 ozhy';*F0: \}U[ 7$s| =eBK]ia]I`qin#mI/f\aNJ +'GA~  -PHP`)qC&> Cj11OpڽϬlZٹ΍Mx lpDqW#D^̻a$n wO^tgr-PۗhfbJؑkpO+_ Nϭ(U:,`8eV( %.Zd’֤^@[kP1\v Dtǯ['I +BMiI:1zȨQҟi BOopJbȒTbPz;l.G: zDBrcU72F j6#Fj`_qJtsπJ%BS=v SvpÝEciЈ\xĽQ WT[I5 kPmYeXWO""0L*#hAv3wwIڍ9&QW~Z{'H-'i <&E97 dV2cIng]l00VBx! 'EMƭz98_TM/|ecHyxɋD/ـ.B-(_XKdMP` + 3q(, u'S<ԩ/Jt7:z I-'J<@@U!ܭY +s Bo""3xu! {YrCZYvK$E prMGPV]˟XI X=U ԗuХ(py͜}c,X鈛q:@wU7!b Za/BxLftFf!$@k ;g< +U2njXa%ÈUxЋ{ oθYPKznOAbn|? o) LwENj>)b^)R߫37+z6AIDLL2^yw oVTIJ7ģ29#6A˹|^OЇodI! P:O%oJ I. ~?xEJ)86dRvO9z`{K +,8 +? T~3KL0d؀*|\Yg3+){6ǖHpwe:i@}P3xZ[͔eur5qWJY\ҁ$SDjh-W4_et`3oxn"[< B:-,}L?&'3hpܝ9"G$O{@1}9g ;+l"W۵:L|byw+Ʃ%fq[?s=:!XoiDraTPvō1ǚ;"~.syYch0iܭL(8t!Do\q.-N)YAEOCJŋdE[ KúQ!ӡmdLbݮBivU%z,T<]^_`^rxEpMrg-T%H!S!YDhD#Qihܿދp]uۍ<>< )+EwY0YV$ x,=Vib6)5o/S/=;g +ˮ2ƴ>ي+6FܖW t0cC+2):#/贈z݄CRqdU@p%Cu۵2M!}6W ^mBMYx~񬸘@نB?% +7 nůhmEe~u| if_'wS\ T. YO~10i$}5qUuUU3jk0fĖ.jr{i:\]Z%u5 19_b5~;xP`LMϤC{7=8 5'\< &\JΗImm BVY<4t$r';CX^9k\` wGfmkV=p0Nv)ӭ0(K%.srȝDvmQ@Mr}A4Wt2PE!(kR,TӶb`X&Ċk(Jk Bt~v[@xvw_Z=%I- $6EH~|iPu$ϓTwMXY>+gl_alM_%FZKYG)5NL~zEnz6G 6XU2e@X"Uc^BL)REhKJw851 >v0>U;#w#OY˹]F_ZO9L_KZW'Cd\uČ@,Z]}+ @vs^aTK拇ASn 1miCؚyj =rg2d܃w%Ҧfe3jW2rSה}.OFZ0o]tB8S2haϛ8Oa]|*/ +ox6΁}[4ocO gODx996˼}GsO Inܖ,]|q/:ԛdƲtIRS+5v(S3@uϑ2C%2q1B!Q=|rWJt]h(-}<}d!TZTE@v:0J-8&+Dn{ˑy +}ҁ=3a#ţĚl'ԦRJֶɂ=(&2 +7ܣY=X ]%d|WI+QocOO6ff48&XSr2ǮjЕySIhQ(A.)dT#~i.䂁髻1@ʔ;aTKgN͍OF98jKÖ9I<}`SIfyU eIFxJIHǮ[{OTIRx"sֳI@vݤ ɡ̀k i"s;`=Q>^[ݷ:d ^ ށj*Ѩ +RjXp#rsB$dƆ2«&tr<ŸhX˕U5<(:ՙaDbcK D_6A@ap׹d9$rݩL/~"80@d8 jWx9[i4blons[o)--6P/i;g#Ɯl4a@O} >'tƍ ]dB8_H_+RcyY9 +ǩGӹϯ#\cgGki' A@$L1\_U?ث1d] ƙ$ +-|0;`؋ڨҚ:ryqȢLɸASGfE} J>'!4%egw5W0 gf f&"_ة +]෉/qZ.$bNuɦOJ + {tdJ:T3/N9U\yFGi'z\ַ |=#xD5\_:P†ޘC-LB\qD>Mx˷ =G-C'I\vsuԐRٻDN[9q.@*6NͼLUZgybgx5amʼ ˆ3ʴ;|G&# +.wM)lqU~`N+M[ⳡGr{H83k]V˻Td0_SS7l>Ve2,Wp{MCh -;6W=aԃ0ćJ99+g򎁸 m=YJ8U bD]:]_WVhRtYkݶqǴw4ﶌ +&@;x:\voJRoMpFrRҏ?Ws { Wu9~0}Rmz] 8O '#T1] U4>`JTD5^n+|oK(/@i(Hى츞6~0>SL#ɭg{K3*z! :؋:3'~AdжHƼ`*A[K56{ŶR?$Tc& pGed݈)%5*Hq.pP^ . x_Fonp,SV12,Vq}/d2WVd5DL wKyn`&X=]rܒg7dz B*wqВ,I>f#X}c{Z+I$!Aĺx8mI9~;A 殰72/jyOc9 xc:7Ec̽2TVBJI|]ȘG,(NkĈ @^ѕIB[,`B `&`hpD + YuiP!S ' x:04Dr+ʤGgD|Ia?"-A+BLQ +Y?/0 Y_M0$=% 7e[?1}/:UY+Co E1)W( +whc+4JJVҲOO%aU9~\v5]giG,_Cnca:a.;9I9IqБ`IϫR|PNkJ9ؠcԒ՜E eݜ Xa5WQ66?+Al U ovK H[Va ,ČZ9v96ڢ6GjC*Neij5x 9?6ss6#@YV_Rc)(7#UQ4ZOeÇǠ9zﹱM2(俄 QFe@W@+CG +:sb}yĐ&AfrM[g>4@rżSN5/8+qP6T{H1TK', +l|Xb=‘T>ekw󟇒.hb7Iy%!w .)P;_ʅ(,ACc\ee{uJ [f+x]ҋs)j +9쾕$[ѯצ(#Q4Ȇ:7p E+@*/l ̚#ەL\p3L8% Ԋgʜ0Rc(\IrDѳ#bP⨃pn&KVB|:K +Я)+> m{̑":Ȧ8G ASpw4uB0":>BaDFN9] HQޒVb-#=ʇ@Yޕ\=;f5 "Ox`y\,c[E'];%4$hնKNhh^lFs9[;}{h)C'7aB#k x+^V40FҲKM VSot`m@M~WKmB +<{B1xd"g@[`2F}!Nی2rp*Hh_ qe9F[SQS!qim5EIH"9tv"#P63q!@6oG#[ V׳!/܋8v˃uy^Y1Nˬ8xqW@)c.tG.?S)\0OhAsb] '-h~%8 9 %` =ID-sX kV8?]jPX9Q 9Xe -3F}͝m7Cؙnae @qO + 06bv@UU^wLA-FWvUV i'[ +f7J&I#Z؎[sV,⛼fD@.i;jP79`Id}=u"]hB pHQGXss荐_QM<@%f)YbWZf F0 C<OY+#ŵVbQ66-Jڶ|2<^u /V[}I` \̻+5)!@LyKZiTijoF6ݩC>(]hUN0nYƹ<ߺ^p IEuhMGSnב-d`]UB +pMbH 1lqK/jk:|#&- }83dHPQ-$S@!a0?B)6"; $G.\^TP]y]8b =pF"}8Łz0f?QVAwAJd"Il^/me:걟]0!S +u):TEۖtBr<N }ϯrIHKEdπ 0`9ȚsaG${ބC(@*<A0KAwRe$GQH]B 0/_jd?\7=m`R|!^t>_!.q4P}ΉutmEQ'ѕ v10;t"SC;Mזy{Q] ε?+|UugD&˲V"h']o`UY8A@Vu2DHd؎ " 6a}qs0*NȆ-(uhf"a5i2#c842#2 %M-nŢ&l3>ZqČ|`ԥ-w- q$Rl|H X$~d/lYvRݜJ ~ieG}UקL!RQg,^Zń<,6Xx?5s9à %D V J~?`BCO>y ?DdX_>XxTqhanm$dǘ * -\Ѻ~YH1i +ac;S +Qce\|hX^UK;Yt"t(uYDC]ËvEcO[xio:Ay]G0=[Ⱥ^Ih%Y#K+/ך)sA,x)<Ċ̜&0.$7T7uQ%F .S9YS)o4]h8ma?h4l)*NgfA!v}n /so4O~%bd./S*FJÈ7W IgݯxeOz4Iī0 u$J!7bhumm/~`rtRFZ1l}BEX׷w۾%) +uw5jc[ժGBzq + 9RPm +'2j-ٮ9y$hXy"W <]<s☮ƩbG&vz\}[{Ղ׋ne 'z7ڣ8FяgrQF%j럫 <ߊ!Mg^B,˵0 *ߘQ= +>,)\Η44*<ҏָ7`G~w~x IJ \_AhCI{|0@gelW,p% )ei܉׼_9z|vZĨUO{@(Qn;f!sF }j`#&=k{\~U[11STf^g傻҅ ^Y~ +>AyꧼiqPZRY)ꑿ8qÖG=Y`YW-g qZ#8!qvOoPĭ2+釩Y$ fue{o < vf[PN1Ot0K}$ۋ(~9lw\Co~zP*Em UW{Fג ^/PdO>JhKW:l/ FE)TkSwh9N)ߙQZ/!{wDh8Uo{z}E{\hUح Zg`Iy'awr7%p&>7eب7q'\RAo_QM&_\=W[#"Ͽfo\żRwzQaXBBȪs)JЫk;nTWGH>QAG@C xBTA:+ nNV:dlrlgJIKeZ`@o1f7FzΌquYU'h4ܭ<_r[7GwER :+b*;wHL2KN=ij]CYck +_SYnI gS>Dy" ]sJzM՛Y| (z7:L}ES) PؒCO^`,E/+T-4Scp<%@FLtF+IB.=X͞pP-vɬ0DYӥW>V:>CV?Q!6kAŅb -dzr:|3p]:(" ` Dek9Q]!ug3J8FL=bĹ7ζ$:ol,?DlqCOVFJo$jI]-㛱Rk5W,wr@o: u 0TOKX6lu[ɠ1eS&;D/\^6n ;(Ҷ㥦% bIp;,F+ o,;T Cӗ۠V+ +etFo*.Q?ۡ! +~tמ(@Ӣ}Mxj'z=2W%}P|24up7+UV#~?Y:FL)=kmчoL{N7p#[sy6xnS5F!Rex q8pow<0㦸B$H褜9#syN]a 8]s }t][[{;E7b@4ϧW!Ƶ^sͻ]܊9 1Ÿ˛ ΚHu>=2n2 y}એk[Z {wsmJH_ Sމ\gwvcBVR)ib/2TӋ, +uN:ʆᤳ!DFxVwy\?~g\=Y54bvO|6jEOk1`Q&uM\ jcFV EՖq vO󉽣8a]`8:@cߪsSS d%q`h14JƏ߶MMAޜX@]_YZAð-M {Vo]5IB_dna%M"wZob2q֡z,&گݍ镬V0~bowY',!SjCѫRzJ3ۮEϤ@ /4D%9wh!$l'*>9qD(nm~7? +eUXzzC׵f"⭧7ʯk:Wul Z\8 +\,N{x[Zgϳ֟fb-_yw"N Ĉ7r$=_[=X%|BKt3g$іI~(ihC%7H5Ώ+&ɖX5Vn7` PR:^hA:xH!iFd0EZbe +R Z{PN/dJ Kn$Aާ$/jY?Nz>gGBt.$3M.i w>t\D#CTk?7fS9JՋ$3T$.*/2]I;A,`+ +nX 0NGsVhu(7}i8ͤd ge}t<z#s]|t)wW`Xe3S$\]A.n~qǁ_Z)b' +IT-]u#X(#eiPCutHŞ|My"ny?D:+)@;'LpA% cċzTxFj5!ͫ?ׯ K`;l^&WUO7"E&gѶOٰ XC&e{v'.v_ N'&.%Fg H@=W~6Ȉ{Y#[ٛ+a|uJ/6k&8Ċs}cPE#)^)V s3l_d+#׹|rᆨ 'M QNuԎv0ҡh3XZ? ^1 XO!:J|CI=tzcVd*KP:?45~N=9.nQcY;3 bdBl>>iDP qŞ)]:Ob} aǍEPи_fn;9/cy_e `PQ +_+w]{6P Ps,rCm| 8Ls9˒?AhwM-8 nTI&̗ biUJ,60My{1;oޭԹ=!}DKH<3x2vV׷sN  $J5X"`>6= N YAw$Vl"D{5OyYq,W'u~r,]GCЃ`֧+u]ϧ!96~@B@lvXImY+1 1҉C@& ~NΟO}S}цB<>Kw U& !:@Ub;V$Fޝhd0̐~Zb5 endstream endobj 3105 0 obj <> endobj 3106 0 obj <> endobj 3107 0 obj <> endobj 3108 0 obj <> endobj 3099 0 obj <>stream +HWn}W0Oje ,Y+Y Qɡ"69==3]=C`7UTW:uG8Ƽ#_Go'lqulGV09:z Y;? /i +iGGǿWjv618!/\,i^pYs):G9Y!::] P[m3-Q)rQ(kSH.{gUݗoBerZ{pJ1B ZǤV'G#}پ5ֹ5ړJwO<:_L_Bti\Zj um|}^x#^V3RST1) -DeufU >ʺGV],kS[Fʠϫq9#'qmznovo?s +㩿 br:FMh2a"\3Hug niAA6tmI蛶-߮bXWL.'?^HǏѵ=2RM\#M9IPSϯY0ot}HmX-@sY?4*8& +9V 8DTf?oԥJ T ovDY,xӋd::yHh!tY*OdW 0C)RFSte6$YNgbLU^ju +cm}._!ګBHNvR.tg Ż}%$P =H(yJA컄/DPCw ˜Iղ_ ARޏޱR>}؇f&BÇЧ'{9E-c3Nv J6$rsiCu>o;F[a(I9!XDy09. +NaT=ͩuV{jwPq*P#l|XdI;k ' P*iYi`/u7٢U3=0"05"̸{DB,fy0 b<"RY!1Ĭ͐ g!Գl8riQ7IF cF'o@şLM^rK'cBv_Y|L]c|; x~w/jF +?ϷrOb՘ ^W @E{>;:^˫jLPX1-gU{gdA +-6_F},P]jzf\0a@w庼z3X&Tиijv! Mv"cb'|Sm[/%2T~1{ +YFdz dX.65\다Qyٰ/;29 fnC{Ƃ"fM_8$A&J29D\Axw~z! V\ɶr0@Ybxٞ&r}S~[TNdpa.1r3j-nJ('L;1`{\qj<~S;$"'I4j(c0n/3QC>vꩣ+@vKTwt@rXLlQ̓0 5,𗇛=A +zkm׾#fJ`)'.Sjy ݘAV0d#}?>;IF,U~QFDCw!F9;v$.͛޵bPbi+{*4SI҇Ij2PؔĹQXJ1S%y'Y8Z2}O&ޑq ""@eU8{\D,zLjpiE1Au]A(8|R +yAGQ߮3T+n6\KqFt&Mg.{n +4mMZ.lϐ@~(Lt=p)η)iZ4m6r[V`ȭ +]-:Ik:>K^@8}jCΓІZ͟A|r35ir9KCSUAO jf5Y,mM|%h o.B&+M5{z ɟ0U Xhދ-j̺T묝몜ڋSiaK>c d`72mxA#qY5]@gc D\]έ(M{ݚț#bz,@2hғe5 3dp0UQdڞlK $%R✡߬Io玖Ձ ݴc>"ZtgӶݳi  W F>nY޾[1.@$yIjux$=Nap޷p#)y([zeUR eI:o'[Hч:r+|BSu9ɩdnv!L>m< + ~z5Vq@iD9]-@K#Ĝ84QWj9z endstream endobj 3103 0 obj <>stream +0 Q@&B QGOϜ +N,~ „Z$/qZLc|[ t}!R?^}Xa@kd%dZLg0*\[I|5>3~1ݘgdž,&&j9dmu  +ΉUj1;yN5m; wR-١XIY1^%6 VOieSuU,,k-)pKqkIYV'sgW6{M1E?mQX +Ah,5@|ʭ! \£ڣw1w怣E)ACDxs7@va#Q!UI tQyåei#q7w " +ZG,eApU]e.lƗX R g3ۖ+jkA>l8l/a(`EnTd2vc;2@e>:ӛ1B絥AdâgTZzwbcTOe=߂4SB_J$iejФ i";̶&+]ڑp&ŧ##ZM)vZK_I4*7?o4_S2$˻"L>޼ 4>&BVڇOF+)I2d㹨%~BFWq(Ŕ\%7%-&|:8V &%qhi+|ށ[ +RQS~^0< MZ"ubx?6): ܴ+ٗ"£uk`S%\d*[:L9ҺXLLY}~'sc a *u&v{nheR1皥H!L?%- a ^u \:Y +QN88N>;!^5JIJŞ  +DՆE@3cJ8,By%-Ś啺j'yc"KS4 h &O9iu"ы(zFgJR +}D4QJ1z4anF P|r*z֬1Ik븜,j¶S#.>ߝNb4Sk>z>xz4}`f2uܸ'6&-fK!yi$EwK韤 oo" Ky K6{#N]El]:[HR+~e#CP-u]-%d}>cDXM.TS.xX'#3XaavB&(ʯ nacd^=Ȓ"5[>i~㽘m,H6Hù 1õ, Ke]*&=96؎̢Ɉ&߲c+c s`y} U: {63*6U>F4UC]c L%|ʋO.3{.SH ڵܮm3~zMH2G՗R$p9 H{2µE9z5І>σ C{14=&Dddx+j-‡Fs(OR +"tYZi6*ǽ9dL X:Y$Nx@LPnEoN.A\~kyrS};C ]:U%UN^:׆$5kẁ6> &Rjj'6릤5g.i-;a}M=}OP>U>8PDCvM,$|.;-Wtp1}PG]w!j'n%rsYuD^"VdNnyL;qiyqv"Z)f=HpYi CfC xB(Y.Varq>X3MEޘX' 5(0Kr2JҤW^-'Kk U(۫s.1;* ov/" E0a #lwSX'kGa cq^ZU`BmNN- \Q *%B+~-J&_j5dКLq;9^ַr0^˹G 9!I %bs/V^qꍂyhz Kȑ8S8PS}CQ6v7V W(ĵ,jtWD"sKsgŶ'fnt,ɔCHB.u(AeRԛfzsE[y!3q]wPS*IٌZ⥪pjϜk' +G:9{h#lYG*⩡?+R(ĜdeOKh/4Đx SA_JyXy8";[>6F?)Yw$jcYV߰e)Ůϐ8%`֍3 Z—xM2O2^QB`5# nB};@Q-fWXb;=qyڧ^_uRV5ѷ#hףqa%[wK$~3)nT/kWsG^5Jf5)$Ī1(~j:n۹)D!?+1yihW_X$QȂ?[iV}8ۛk殰[rޭ5>}{܄_un(u1៹]Z> (JE!_ES>qQ`<W_ZB>~6)B61u.Vt>|9S.* pJ uƨӟQFlb|օ%[>`/ u>(۩Uou a%raI%Κp\kAθAǻaZ2Y +$N=rCr78YM?''[_( B4Ĭ(7ϋ_@W4{2.mVd :I Nv`bs5'Q&ä`jr?[Mh8P23us=)CV2a!߃pF_<0'EA+pOR<lPKr`-Ξgfg\Y>"?+qUd7ۼ+3]pG2D*VRuz&ΩNܮ]k]AU<ۜIz9OKd[Y +aJG3+Fv?r}-m|'FSu%{=Y,ꛪdC=2i3ѣ)+yg{)Lc+%/a{x^hsУ\[r Մv5ԛS ++`Ō "1d DWq s7{Hr}yq$Ex R|!Ibb@[?f }Xoo;/w#J&,ccW|G3Uv/t\Y̓/XMmiq7V+."o ~-T=7jۥj-U~;H hٚs D.O(9ƭt[dn] /d'l+`j~PT8ӥC87]h)6 QHt鄳 sh6h?IN#>oK3O`W亍1B5Q4t;T|\g#P摅9q:F.~TMY6ci s>qy9@qy88 G#(I1dm9ĚGYqqIPڗ}LJ_jο-3svJ98=.pVVFv rL6?gv~.ZiNdև<͖~N1ѹ  An\Reoi`V#ӭX*dC״L:vWkMȱ-*jPrQet5f_lbƏgd%:07qU6͘SZM\4aQt'K-lCJum Zf5cX/%C3;#T(ɜnrV_3+pXKXMɿfApB>[ (11<G"N7E,@M@$E/S!=*M/)JeF)Y$j:fYY{gK+[X.[J` k1QC/ڬ=hk>L]b8z{cRg_DɊyԊUi2 bҩA%OZ}6(Utl6^Pnmkt:vX!!=j7*6Y}?>u{3Pp/ b6MexNuf@;6;hɆhÃJNj1R+(ӏ{y d \X9kMb  +ww qBgkB/Λzbfh-j>aUYY +[A 1D _4 7qbrqom[e. D *dr]y) cW"q\\|~F_Ct!gS֢hĽm)8vtM +MV%gc{\eվ`f7<٢+Tו&Ujq-I^e"[FQZsUS!uʹ3/qUɩ4 Ob'd2Wf8X$QDtdXl4zVN pKN1<dcOUoYA$M{u?ֶacO"V#c.PS=D*-$hp5.q FpAC1e7rfKOf+jzvLv3n"*iE[ߦh^ʱkt0[1Q`N2_yk~52'7t{$IJ3Z'x ϪWR^ʭpYgȶUM qLq1kUc!/$0ӹNƲN]Ln!kW6 gB I!O5V ?WjjR@ +BَXmo ,S +m 98~/m\CPdճP2P|ҷ@28]ݚ!fMJD+-Z OӘ q_w t]5YXm?Ix:Hl4bP5$ ,o`6m&bO XLB+|IɒhZdZ3ȷ^Ua ʠ8zs#~BCq_lޘ.nBeao;Ϲ7ހeu5| +ڲ8 `Ӕ'?K|됑oȎuT|7\s6ے\⽹6I2tKN ]G.$Tϯ|$)ILZEIH@V3z*iԖ쾾T<@:vp,LS Od(G+0QVo&'v/u_ˢbor[ts̱gJ>ߦLv2Tqa=Kߪ KqPQ#G{K@uPOj^V[Zw|7u {GLZ/Fho]E;tWOq48,+.W+Pܱ{xw2X9>5lwE&&2˔6 -^+;ƻ`\tTϲc"NὬf/Xu^ 7^\NL|s3f1]wX +g)~/hKOz̞@٦:X]F jz`7[V=ZG2)Df7qrKMrsi1h v 1_^ţ*8z)4x$^۫5-e=ţ9OQIƗܝU%Vv)3V@'.f>u`2ܥ +`KcU:E>tT+l6݉hJۉԽztxb_}J;Ԕwyu.3sy엧NGI=t N[o'͢I'F rUT&WsPGqd +L_#j +d d5hNHz %4TAtd\?28fUzߟ (K 7ˆ8?;jg*3uO{*, I?3 ,|2:=v(}{3P`:j ïuB)֊L \pR$lIW`OlerV̨^fT1fJO#(~D?~l;ultf\G'8eQeթb %B+QEY5Kbk8 " #L08EHIXou#UIf$,5\nQ/ߩfBP""=)1{|Wcl0:RQ,t S j)R;+Do/aE51Q$12n3y fhQ+l{R; +?_:$9Hb/wsA ,AE~ 6ƴU ~^XU 1kTD'=b2b$sSN!b+U<∿UI<AwQϵ oQXVS bql0 ,xR貹0Ri6ꁳ?2W9 dz37MKxXFh3rZ=1IY.tN*1H\yb+Zǀ$@e+(d1aFBU-m3@#8%iKM$d&ԄDA :zs8N(T} Fz}TTdy=oҀ9_hɍ*-># <2>ФӼJ,{DSz NBCM0TN,lP &AyenEEro6_g +׻_|/JDV,Gm8(hn/B. +I/삗)\nzv RD,߀e@˜աJO 'Md]D3n}5-H*9&edvό.$ =;ٗ%[8.+_䧓 &+78,#Z,N?QL[vZ1]mqu-ƒc)N:UD3·ǽp 4MԌH[IEݖe`;D(7 +i\Zgbam$R{yş whUL˕2>"K rY27dPh/09bGHCvT + +3P!t2K3ԬVIH%w|մZJcDtZ$hhkxm*Mw2Ii%MhمP7Dڌ/ϬM3pf rψ t,*wrڠ-"[OI&fRHgj5&Q#Cfz[ː.W6bSyVL&^Kc(쩘KdZZI *|W0ȀFj0LF,cNӰ qQ %{gi k|=Y?ɀ2 [<%=GB5`+0.[Ҫr P2+7ܤHNf`&U ijV,l`^6xO+|­ Vlbo%D +X,\ or@V60i\g"N7 }?`|Dسu|&{a&߳%,<qnn"Đy'- jۏ5id8=\G(2>yLAhG g/)@Y"Y|:K APUĹdІX{acJ^$0"בb f&\w*xS +n?^f6Z+KݚjW7 + [cQK8 Ww3CV>ݷի[ /,=$ǡk8Ν 4/DR.0UP;4|ߑ>{&YœKR yi,r+ +M?7nkO*P4Ļ)׿o/C&-@ָ*|ф@uf)'R !gܘ k;nw;3w@S +66IOm#`1Na+@2>vk h})Yp0ۧrJl5pDdmYe_DL1Ӗ1'`i^)ĂȵN]Mry~$^XgFY85L%tnо[HG K38;shu[}>B@%h),a3WMHIC7{q"қUX<03 |Dվ]JZ&zb: 4z'TdOJ_H9Zz"l<#'/Ee_;skl.f<DC>;{Skz׵)F{h9b[,6M2#h?H^ڗ mc[iqEO)Nb';5ƿT]}sMӴ64 ƉM\Rϔ'g+҃ ~ܫ1:#i軺pN5=E|4, ar8_\۠V{Ѭd&f}굑$%x9T#UVU:}d\|f`{#cuD 4 Kth%4)rD141AX3l4 ѡP"#qBon\A +@:< +L˚$Y͞o&-SnZ ƅ}dC&)^h?vC"}ϰqhOö |RwskY(Se#ihoӪy +@,J/bQdiKסK{B&PD@ K6KT^mc ɇlvyJ\57$ Q"(?{$x`ơ(AmHzKf /j{`ձG <|4^L<׃s'"E7Qʹ8 Hou"q.; wrP^EWNϯ\}Df;h-ws܅$[$1N`xa~6 +v8J"W& "DᜲZ!?'_U:R8r{JJT~# ZɆD|_}L_X%4p>%W~=[@Um @D~$ԇ|'Afм t~zݶ|),jdqR Ĭ^1XH.Aqi 8_~WxG,KЈN &"ç͔ᔝ4af/K{ϤZʷz=,bw(|S@<9lNKcZfZVxSn-U`R`7#`m;|:Vǿ1Dr6μu "~3clx_ +mMW\~;Ӗa;8p$%NnD>c!Gm,տg%UoY)4`Tҽٝ_WոQ"ۥ;K^m3_Z*[>4}u;3dzk%$ Yё"ܚM x>῿#M\i; ~}vNG~8a9="Z>޺ DžR59*[ψc80\C2)T-|!CE}HCI_od!*UIToJ>I(rujǛlI2/G0dGYhxOXLs2j50+DRڗPjcqX?Qb9ȾL| OKI?<矐FQ֙ !馤8ͿeȘNFHQカzBBגh i5w5(Xb{Ae3yvt!9 +L6;N#ׅ'̸?r04Td/WH%=b6GO{/h\T=ǗAɇ*uHP9Py6+*= +ly# +\_ .V%B4gK`}Г>~r7=ArҸM0qţ\!y8={}A-WD->p2#ğIrxV%ػ_Dm^Ԃ  nV->ۙ:d8Bd/ ,^͎Ew#Snm6fBҦSz_9>g l.1&Cx ̛+d|uw ITydвCU=Pwi Nd/oa ҄1Vt"Y䨮jS75aUMLVR +4m/gǂpNW@j+ +qg8urΉҖegBj^˚C- DX๵Wf}N~5fz97nnř/?om)3Qc]GI(m9:t߽W#N*"SXGc+m[IMGu {@صv`+s8[aLAݴsނCީg便", İu> endstream endobj 3100 0 obj <> endobj 3101 0 obj <> endobj 3102 0 obj <> endobj 3092 0 obj <>stream +HWn}Wmejb/e6b]HI,zVIAS]U}ΩS;!)(ӌ7S'oίN(L|&f盙%jgJiBM?owv;{u! +a,a#?!&>kKl$|$fjO.p\m +1!Iкy? .,vɘ%K/K@0Α J |>4m;~Ǿ/ç3\U}Go7٢Mw +E{D-QK/NTvtfU:%?U:; +!r׻m)o{/.ǧ$-9V׮؇1@ r(C]>J 8^oUi5Vq~CM@. $t;π+!SIM$!5fMs=*_g3;cI5KAm +>tjҢcˁ 8lYf͸!@akׅ/҆L] Xh#uK 5*r*܀;CCSVOcϓ8=k)ۊP6w< ZEa6Gx&(TprcPie }vii!nwAhQhjjd#nHnm gC16ƦHB"ɷ0pCK)ʸ!ٍb草^$C/ScC_tWD?R;>7^qrܣNK] l|{KTΠ6r[Oĝ/fS;X-X X t@iY,:Ū Rժ?P TXQG3٨ /~ 5Ȅ3~x ggJxqol~L(2҃tUg|IqWu9 DѼ߷`LM#X+vod1fJ`bL6+b2aWˀzoʪ*WA"<+'6ϡ.kЀ~øI+`=k7_#c&E7g!#NKw骭Ω_6P+A-F> 20h.1Ų,KkūP6nu.p*՗0y>̀`nOC6TrZ +8lR!55Bg?5m:d| 7Rƭmޥ,% _e?ͪ͡% XZ` ÿUauw@r|8QO?9nfd ފ[z`S`!''gD\ޢKabHbm8&D12760DL2ernAK0/K6,!3irC)O7QCQ#g $N#y <W2lSy(HqCw:|G@'Ui +PeCmt^MݑԝE&}-hA)vE׶H)Clɵ>iӵc K`5R[i fMwUnM*&GYA(ut,"2[uQj~$Ѝi{DqugΘsQ}^ iR*K#C(8ޕ=q2ۦC{w B\ϰ)~A Vv厠)eAW>Yn>pfs$?QO23o^(2@arPKxVgqL)-EVS5(vߖ˽`>%|,n0W}~E_4 qDu& +E:i)_;qۑffP:x?_ˆBy s. u qyH5 ]#XO U{q*wSIzČ!TZD +/eqiqzrKnKt'8lC|"E3M[ytMtqƔ_3Jfhj?9޶q Wب|H[&E7_Xiږai);/Ʌ3|Rf`Vz??j|1@PC篆SbMMPmWչƆSӸt2.kkapiLC +nZs`T6KFΙSyP+4U!`WQPm6z=_ +X њbUwj~ؔv{nwmzs,ӴB'P !-8Tx%G|KY!bKč ~ + 7e*OG:7K7# ř^:HPԙXÃ76̔5ktt(,XMX`Xh8P0S"Y +|PS"E!5 K桕+vdW;E\yp׮kf*A8r"XƩ(?8]gBcs!S>zFFM2`(c`z)6r8/_!C}4f5=ƵeqqRlu=E(2v/LͶίBR!bqnbNYUj$T@#ՙ^!ˊt僵5EgGJJŹ212դ߷$IhfAXSf,7_?>stream +0 H@&v Hٺ7~>#_3P=+r?D +6UhOce W,s/S/epv͆jv0#qTveƺKϧp $M͆nld:D[͉V[ډPU邭8w,ugN)=u ŭì\ݬ6O(Z(v鿻_OZ!}шz +6ZMMhUtc(r8>vn3q_ +)II!H&)*iI-TSS1o{]Tek0&iUfi:CI5K=1_|RA@ YFq)hk)%"h7bE>x?Gp|0bZ,,̕_E^b$*5St\S|f!qR>R5p z? n퀽Nay𵼖Yul:~YJ}, Wp kS9U,%.t ,և 4MwPu#=RHqY>NL]yaCr@^yUoesn?c[jCqDݴ0R&=)!;vSh_2xz6aI鈃/ub +8t zEy;jmwe)׏tG!BRl +!bdvN|uOݧ"h}4NvVaUPIB(7Ὣq0/dW ;}:8#1sTNCt`ܬ3rޥ􂑶,HFeMsx}SG;:wjq-r%8?6G|I+THc4zEb8Nknu۫)+u\t5ּ fR\DY39S_}>ގ$ ̿pp%I 3utb  p*}i6ȫhS|kҵ..cګצ)@o'K9W +LHhH+lbjuV'~>2H'HM=fR!;' K,tn1%mp0'O1X`{Ӫf7*rŔķnyH.GZ%\rYU|zZ6s!3`uU* |ԓz(oȲwVC?;FM>|ʅ!Nr[TO,Tas:ҎOP$(`(:Q Ixh̷)_5A@ٖOyKYp*o=>5My34?[v:s_9T.ujRbT!ulɛ(/XE3%b.^ +)b +#H}y:iQc`/ D<>&g~wz8-BjVKڀGHR"2}+}fJAc>6J @O"%ކ AI<A}RM{ R+?XX?tL'FHYق15?ruL`ꙗ>O<q%:y'DV!݊z yGb%%mWWX)`Ss$<0i:V:/٭ 6pXڑT' ;̝}q1W+zC:,w 8_&e"s<8vƔ2p4Qltgջ xqu3o\ia3;x\{ \oلAY&mͧcR) i͕^@fR6IraEْjo&d.$ + +vYǮ/8k*)8-|j*(|f{Xq8ޠOCїMrqt5T]ctLC߬Wm[S=HkDŽv@oi Kr)\AM_D͡$E @ۆ'5E>wfJkR9sC;WB?B:lagu辐<TdaûN~o9MjC34OTs8e\\xD0smHѷ5 >&3f|]SKP0O6(PZy)\uf=,ϻn8A .Qƅ@}#fUW4a8pdUubaԞYHfɅ'qg=P y[uDwy7v~7ףjt Ͽ^'z2#⫓Vbh?,C(zD@='s6Vv^r,t6lBf_#oANE[0*/b15Z;-L򴜆 #&/oXibqgh|6#?`ijKz_3Y뱷-hQ4; lSFNm.۝ Oyk3NÜ4:0 _W S/elhx[Ф*N=rK`eʾw]찞Sk̪fVO锠6T`f.8{x/ծU;Im%|'SX{d,eqhX\p&ok{ߥi>K` +$eqK'h6ʩN(%VI)V>M_ɡ6C ar?&Y+AOX=e6^'9 aQ Pnrjv2,YK/^@>xC(!ZϯVRT[D1q9c0!%wɘ kر=( TG3n`V4BhXyA&w0WO~0iS@6O{?~7%pC0/⮪ nޏq.z=L5Yps$%XTS'756k-L 7)FAG̸4'x +|.Xb*!m IdPȑӹ62xP+נּ'x^#|'ʅ?: :+mqxI"leϡui:Rq%bmf +e$ +D^-:-ڦ6v֒DQlfYa]6L9Hu7tvhT&JCIbζ=& -\ZDqd}\o6,8L>t.@HzBkվlُ ۔O﫼8赳)*VC&"JEhdJpN ia&-*1lfD-_܉}+?(3 3wI?#$t/0D/[9Q ٮNN//+#4М. E>JIYKGk * Mec#s[rpѧ0o^E5Ꙓ fk{N@+j&vqד%q;8b;l E!Zm&q,8m1a9sͳ LHgгFKs~%ޕSh_ʵ7bp)1Tʅy0ݖ!7肞bGUpZ{ oË&.ѮUz;.>a.jtpw1 vcjnIxx,7JN>p@9_Dj_K2n\L6UPqH^1mhg6N2@Aem;& 9: N\sHxY$ )y;:$l{TdƸꇏۡ0PEs^ح&dwUBڛaMYsM xBbRQo ջmWi$e|wY^%--Nyx)M#,Hc=.jY]%nK!nCB9ŋġ5m0%A| Ľl:}IX/o6=dոow7 +…H7&")ojy[Z +8!7!'^Rt2v2&g%=tތbGniga].T5>II5B@UD&aB; ?1:msV鰫Z<{,:?'9GeyM;L"V/FP 9;wНSR _zaL+,JC"[$eNP5ljgͻ&Kd>v E;tu˕!пݩhk-Yjn#%~鏾ZII d%``#N43bu) +Z\X$䙭>⯕{0/QlPůjg1UK&IKfi$ -`3k" pH,,\R|wW- +}]0~5ڸ(@CK7/-7N<2kI۝y%`G"2 CRuNl +*)\qtXnKX0N" 0oT؉vd2}diaT@m +P8O[ :--*W n|mzCmOJ(DĢvIJ*ׯk1S2O>efVP-Fƚ{$wcMo"Ъʧgy&^peb|Tg0,1KoTTµx vP؞%,3i/*zpP.t^Щh: >W/.H +de_~Ki2IeJ:vH_2N+3Zq+A%(z.K .~x)1Z p>5+e1y~IPC3-;" +ՙ y<͝q XaEKV{/zFp(CIݙ_."(^aЍ#m|x)⋞?Hm،7z`]fwZ9"1H5Jr?He %vs`Uaa#><ߦ8? h ++z#x +F)v?Ws|5)>ſ[xEᘳ]np$R*nn\s\5}mY +7CB."^J)ofU6>|v(fsD~,w^:"DZȼn犻SL{q^v(k,D;!rYI]AHa}V +fMISߟ>U!wB 1,8loӟ7dW7\r ?c5}VFeP,q䬖$i;QP?7j+M12}U:H7ӘŵxGE\*RH̺F6Pce X͹.[uCd1oMWN`Rs:wB{l^:z v9o#Ն|sns%ۨVy@+s 9 TѬ3B˶q zzJV 8Htդl]f< ![pNGs 귚iϼLiq um`!R\0l\Jof!K `)I_<hTV B,-q2Cy3ZK=Q] }Hm^JlK ]} N/d <3D21N0|pF}Sǵ/|nOVk8@9f̋r3Pyv?ƙu/eiQqDظ n-P%+KK$O%1{dnZ/Xq1뀪 ?~TMj҅-# +u ގ^S6Y?v!HcNGIk=^.R@Rs* >ƮG7w+7_&n-;[;+eZPavBn, +ТIn]2O!˭ ?҅40\$۽դ$>Fh yg=w|FC7) /s>eO"1SVLF(TM +:kz$(AŌiRybZ@e<<'r +,w4l,4Zi:Sz*#+ њ޴𻋈K$A]3zDZt pRN4ƍ6j4?v(u¾vU r_nz0A{e3_YH+Bvƨf6n?ٲLaK\iETG)\U\Z2XrѵiX4I̓d +k/We?O"E% |4Q ?\,G=շ#omhdzAC n9^@ +Ajy|+%en3.Ia'^RS(kM)b>g^;8#KFL_2}$* P$>2afG]*l|YL,8N hc +,wF`26XG_/}\lQ ձq`KzIcHC}@m#GhG\!L.2P(Yڅ|seF lWgL.R儗 <g +f!.䷣+O|CHF&R˝>6yޓ@ _b!L`#[7 =$*[JqT0G]ܐVu#.R*ɥ}'$8;2w<%m䣑^Y|WCn\~?FN*󁫘rQ'\~-YXVT42I )`NHz罿1/eJmAZA1Û$ =^ X ;N$-1,bv30xl8Fv]n _şS23nۯL.[\{zMf\F&gaHlGg)tq폵 ckJ=*?;-KHJվb6&TO٨uun᡼*F?eYD1=K_x=%yB}Q)W=Q$c/RL|੿K9s Om0L@R|jڜ 1G@h0CNܦ~➇"ÊaC w:u'%P#&P\y7DRQ4:XkKh:N/iw6F?u$w vV7]6Z4r $+^,/l9?hVAq.dLeL ` +յwC:z04Wou_B${7x|DJީzUͥa7kq30 g#!^|]Vb7M,2m*B/YQa]/eT%inh ӱ&Y?#"VbNY>K@R {C-NၣQGōeCZsϔ,ϴ($Ol\`݂Vħ%)o(O)crsZ3e1R$^Cj +{&FPTɸ;A셨?(ί'My>VLS` gм9q+"&γ#1x"ͬ4P\zI>M Nt`j7 =Sy[OvR+A0R `If,`<M0m"rI%G4¶VJ +-= + X)1heZLneY}GS~ۿK@}sʃJ=Z<*&2'_m򸮙O{t@ 7rҗO5 IWnR@Ԭ0ЦZ`|;nJ Sd*ґKV%eAS};{+HqvԃXI$q:pmV]fKNVJz)Ds;(2R:T)sHPY%7Y=\JQ ?;>k°?8ύ|4ўɫ%B WrK.'j!v8G5;UDRU#iN)XטG)Q&%mVl)$>pt uyyYA{gq鐌Ʈ8%ފ{DDiCݥy4P]شJݞXƅ2j`u0ŗJ@#pqy #'9J)j4 `F&F#y彉dFNAjΓE!EfQm4XhGV tJەӑKN+sZ݂'kұԚ85vukn]Ab;4Tijc)ELz*I|"!L}@FlRQq0%XTEﳮ'7olGYdCna2\0a HԹ `e~J+*4ȸE7>wDT}Hx41@dBt;!7q&r.V_O0]ʩ 7{-֏9xӏvX_=3_H1ߕjnCBY'-m!4@F@HQDu et哎87Qe3,H{b $@w& +/ƶY,!SAu:>% bSEBxQ^lrq=u#YX|T,|cO[| \AoU# gˊBj%ϜC#H2w_uMYs}pa_6w:-'*'P w+z6s]Ua+$5;p߾lA TtKB,y EiQ&蘼uE/ 4/ ƸY*#' Kk6yoA7c~6i ZGAz{grۚ?, r=͞?ٰxN|NS ]$֢ʥen;I wlΉ~Z(=IL^>UXD@;ocy#ٶxHG\B:SF T <*̾gDq=tƪFE3%F Z|OWvj XCE)M m26_:u5OP&(RIdRџjOq~BjXE] +IA*@]ڱ8œZ<^5=qɗ\!52ݱƳ{i)*)\J؃8〣sCB?lm22NOU} 'pUn?|U6EE+KvJ:)<=R ͼH9 0"@ ƟwӒ$r*k| SU)ӟKmk"(GN<[w0o'ÿq ZҳU I?ɹ\bɢ/ MA;NjǨ'ǒn1oa#cZONEg|>m{,x +m<֛bE"OA0HMy(ʄxԸp1j!TA3@TE)P+4ƒ#?x9Y1͜Qu+M o1w$RegY⋵ʷYP|2¥3d PkfaiR͡!![lZ3TD\oF**9_L~^1aP1 MpzA T/ +€D?X|uv !yXz;Ŕ NjeUف&>(($Z*̓Q޻Fׇ8^l,;zS ~Kζ6PI"& &rSJ MqatGWaz\+ U~u m.յ_J`鹵 b])jX'@>#Ur#{[l#iuA\v5㢨̧ih:Hy3kB'X~'/,":*3#K2©"fif[/W%@Br/+TQ>Y>N}&f0Q!tJmb!mfdw)=+lѐUXR@![qoiL +b0Rwf +j4^ƅS9O/u!hR]3& TPCv dŧlU roeR  Pmt< 9Ϥtӥ%lvglQCZ :OzK bdPU2Uւ 0#+ +ƃ7!֏Vtq_IK{GQ 5|4@aug֓RxKIv +w:S07]JB ~4, +w8w6lBJږ|mr*ꗩZ8/r2om#/ +3̴G ̿Tu"] 읟5`v2!xby:ZW-u <[^M-k%z8؝#D)OH<3ƚvo +/*1}aW?I%y0rB'>xM 0w_-MvD pg@3}dolu*EخJuSC 9yŜfNLiCc,{7$vhiu0Af0yB'A,^YW_:0+bS ~"'#]cW໣A4,CT5LurĚb۽7bk,n?,&>؋J9@T;~[K@ +D_˨|*q YXZqxUP2m*QX-W[y׳XXQj4{}=ˌw-J}(8YR$`U~ŵLq9hQ_ +s֡5]!{`XFAIԏ?j a?B+Nېg]#}EU/A 겱8AFIYaJBCv4|V Qjӏ5hxn1m!PI;7 +=jO:BE 5ÕCJ`>ߟƭcN +~mQq"힚 i,r@g0cmQ:;?&_D9HF\Bx((R1*Bhw-f'SK)z3=QNkH<=fَ ΐE]e^ħhkqOi ly_=:F*M\~G9v3LTڏދZ0I؎;ONz4؈tLU38xƛiDjā׫HߑU2|m|Q\g5CY'i(y)'iW5qmvɭA4RzgиCɺ?LQR`D(onʄ\ά}AʯMQ[zhsuU?B(X$߾] >cS}z6\_O Ms be7ڮ4r<D}H|\ .txo|;Hm#N/ubtwZ +zqX:u@v4SZ{TDzIRRb/nY_#c¤ rA@,>bXrR|缗>pɄ_ ;+aFmw>xDd&2|a@l-"+G yeȀ; +t=o0s}hн% h` IłFJ a1DD 2OHݹBoVp3fp_F%& qϬ:q VIFŭϦ8A\!5:Ӕj 'P"}Wݰ8G<;@m(DT/p {]l.ۚ7buҶa؂kdi\$DR{#k8+)aqg?lhKVٷ|eW)o*[1ru1vz o΂c\6&f'Ӳ}0G˽?CbJ#ЦY_4E"j}Cpzkr|Y9n2-B°3GP!nȺ5\ys* AFJݔrcB +ˑZ'(&j&l!P%Q{cMrݦcaMؚx]i?[[FYvLY4 bRSz|7k(q@`.we5'8'Aj)Gw,dћqKW>]E50|])GHšgOC{ReNSnUj^6k^sɔƉ +,zsTy4/% պa0xc\ +u7Ea=\?x";36%S9!lJN>f3aV!9.+l Ⱥt\h<7p.íkװzjD:J1;OQ][MV < )@`LDXb xquRQCcS K8b*wFǜRX㳌ߑ-ʹ^mw XǒCc\" 9ZrbDKK]rU({ςE"iJ?ԫoxB{:g4hd*0/uy(N{t-x02S93Jb4,^t xpQ7!,a|M ̵)`H'cIЬ\guTbQAw8J2A"y  :0q]ɷG- _^%gl;{jI ɺ4)mcᓦs0h,]}x[TiF,EQI3%”sf" ݊03.tb p3MG}QWD(b&GmnRBO}BLg+c6|i h^! Q$MP0|̙v<K"L(,rq +<\kLUuCE>VMJbj;M?;Z(|Knĸ#PJfxn)K(hkӤUs(Z_mUJl+uuKiQbեRP;ƛ!|gV1m̉i:c!R\\u +Tk`uNjCo#'=jQ8v%O^oUAZ12E9DQWj&tq%0,݊J\)sJZr⺔j ƒnͻϪ%r7ax%CG̑X>xHKkqtc^,t.s80=4/yX={HR3W違:0g!S)Keed2Վ_^A[G0y3?ڷ3G~a5d\8B0#(X :~"؃\P7$s32[Ta+"Vf+5>2n_dFm$RQ +^w06k~DdX^ :!(ݟӳ#9Uee :I[ :^\ؔJɎj}i}|)6\ؐ,Tf"g\q!Y +Q"<(Hn\EN[xE\/0+#9_<7le/k5MH5Acc,AG7he{4 C?;O594l~IsLR>*y;RN,[+g6c5`i}x0R54͢v2W[8Fڇ{=^uY!}E`wDТg_n3OLi-ɯ^0Ê ?Y. D[ )rfaf(qަ ƨj宬so#;Ntc(N+S^8PQbN8 WnLؙcb^GCCiZӴc83ݘ7ëF0,lRMdg%oćaj%MP4,X/dgm=GhR,߀P aӁ^ʧ+FQ"W`U!Zj gXJS7~fw.o6@Źz'Ypm14kM'uyv9HJl0Y_)?1G@S2, l +7C^xC~Y_=Qp|菭p' W+1czg_OMu[/suѪYtl ɡwX-. OM7K0JmyGK%0p.){qk+cZ(M|yr .&}y2v{\[o9( X^x .[D H|XjX@?SJI[-TH].S_R!HAQEzIYZˈ|Ŋ v%$@*UIDf1Cg?)GyH?tzGG tϲC{РCVDvFAL fS#$A]U8ՄYId5e_?༷쁞$DH֥$Oă$t97~͂06JB@H'7kB-&i5N )zMMaBȱn%މtY Qu5xxDVLSGExKyuN(gЍ!°AylbKCDzjN/\S =v6t9q0PL);0cukCϫ۳")O(ޓ)䯙-Q[V&]DZaK߇II<8R=.?0J B0VP km}i5x:&^gDa^(yyFV*aK.8MtHËG:8{ ~Le͆m`YJ OF,)70?]ʷ $q#ol)MyƯ_Q9v)b-lJk]#&j يzKF MG[{qYSXߨ7wB%|TV>oM^M&H)~-'?T{az#q" }l9^t ni/p"U.* $00oLBԑ^Q3$=q-- +Oa: #Ygx?y6]şbYj'Uǂ_89O~ͬ vh0XWY`3"˗wp R!lx3)fX +{W&8$gDV^0De4%g3YҧeUJ~jd +s?CiU=%5J94H.-FLլ}-IX7RZ半/Y"{|Σ1} B#*Sn0NIwٻ;*no#":(ǡl o!8ޚ/磫CmP*~6A_M6/]F[J 5'#7сëzr&`C),HqΫoM++bVפ5Hgb"r0֯O\TAnnXgM+{~U\{QxG"Vc/sGM47!pHjO"Br*=D (!Ƥ&d},5Y + ?F`wE:+P\i4ӓ4xLa*U9#aK8ڌGtLXkԲt 羸k*L c6-e} JiO33Sd*Ro$-\_C 9O\+VPEn.0:K+Fz<\TD *G7&zyT`lG&C.,RSdg0?dz0Wo2=䞟47CKVNvDQck2!d ! wEL:K1{A_q/IEXWmMQv1SD}3N_ń]Nq~7Ŗf6'J|һ^v#,pV*MէWuJ"3amz-@",c9{P\\/C5'A÷.ƴվl]G>ӺNųoph)F9cs շBe7i\ y;s$td@` 9 Dڜi|(dp/m9g38e'eW}Y [A;XK冩a +Mgm]=Sҙg6xG\Xزֳf4> +O\Ҁ -dxj1 iZF:=iT $eڙ<9G_'Ԇg=s7VBsʗc4\bd0礵n,`q|%cTP%0Yɨ%|F;"KcH" n +V'Byf1H iEjK[\r~=Hs[1a,"i~ bKv$nrᖔscZ0? +N'] +TH7U"!A(J7;~5#xn{-U*{Wx-(DX +\3&dGMk-,v$&QAey +I,ׯWg'ޜ5B[lc{ ܷC*Ue*sqL 8l9.]W7ٟxx>3:E8%tim4)E@  +܋]㩔Ki,Mr GTVrLVF+@:4 rƏLY'k_r yAm7'jE=,wsu<$էyrY6%Qyf=Wšd F׏>*D:mL.r]g!xˤ:z>A5;6ǜXS @ +9c-ڨ +A&z4.퓇±j1yfbD%q)]Z n@kgaUuk>⼧ѭ%7U*Ԑ":>ߌ] ڣA#Uc*[7qS^5g۝g(ַP`w3~?fqSoӌ|RhH.u&p/`Uxw}R&ISE^$mB itǴ˄ vK?nn]dc ~,JWQЯ8$*j|GtjCWN %Eо3e< nq@ӥ);KgjOU-s^,k(FE ŊDTPbuyR"nB( 4bb6a߶D9VLK8%c8aXI=id"0ϩ*pkaisC͂^FmTl=i%tl+aRpnh?rH6-0[ۺ=X 0 X심x 1j_J)6\k3 ^b?}Bȵ-'MnS p/ Ź cD +)1-&iy̾[|>+Z2^寿59)NHj`qf6u A_ўCZ$]wviCBYxijRd"m g tTHP+AAbփݐ{--V w­4&9iT&[dⳐ|͊]& %&`ʼ:yhof`LP-^X|7s;?UF?|Lz~)‚Vs~]cߨ"CnrH{f eD +D&?ZR5_Y)v>*TEba +ye;@J"  @3`*+5`" +$~Թr\\;drg۠cBÈiG9rVGEv:,^~GL 9e @/zt1)o5\ Gm&iL$,eEG6(~i5G]8&U_#qAQ|IMpAT +B.ݚ ebR-eX _S\nbÐ#o:qgEAfZYMK;떷[X;^zsXz$m@{@CCY_ љP^(gc8-ƈ+R,G8TΥ@)5KPgM8Ln%=abj+͡섖TuB*Laƭ+3:0A.xʾ*OC3^Nqdt #2e3\*J- :29A<!Q\JM\*|R*Hz*v2PcKk_B+Vwf8I"י8Cѝѭf %5-9|!ψ?/u[ү#nƹeЅ?rcj$ݠlP5/ތn]ʜNώ4TO-7܃\$R!?֧,DLCGʴqr?`KW\@Q)4kElM>3&&KwJ)&%-jm#W^~{22Csksuhu;qoodGv> 鄠{U{~yeJXl wʢ(ݧEMkLc߯Di:&Hm]Q=v*xFF~m"䒦혻mwDn=4󭶳x^MO/XClV8C5?'0@xkl}&x-3'S7Y<Uiy*w95KnMnj&%Ǻx:a̭X 4l__"OlRc+,P]"!Do,>ԉqs|n>rcyR=Ttˡd2d>Qa3,NNuʙY w(&fS>$Ywk1~$% 2oLҕa +~5e5)!Cdgv-n#xAc;!(93}JЩSי5G.:1;a !;͖L} x7J⇥.2TuOk%*eK;se3<$zi8 +B(B˲I2?Jaa8n>}]'Z?IYV)[nN_k誒Ia=6J"sG +Kֲ ``yU[rQBCowHy GFq>):ȍP`haհkgD(jb\gF lı|Rws{GRȥ?kc(թieo/lŰK *AgHؤFT?[EΘ'ԔJrvH2'T{Yy۳F$5nv'\lрە +DPVDz>34wo`ƒOFIB4J4R/1eS`Du=&-{e[/YY 3g%C}ߟ2 endstream endobj 3093 0 obj <> endobj 3094 0 obj <> endobj 3095 0 obj <> endobj 3096 0 obj <> endobj 3097 0 obj <> endobj 3084 0 obj <>stream +HW[o~ׯG"'dT@c+re1%*ι]\d̜~$eIJl(LG ^n^_mis /ڰfqsF B6e#ž SsD4%4ً_}nh^. VX¤V#"XhAnDF w*e|p-^w7Oo~LS97Ϙ bu{Jz_fD;ll35ƿQ%T%LvhZo((Eͱؓ6) 1{!E'm+ + 8_8JeP (ӛ~m7˨M2]rZX9͍MjjCNSUB9wD,bS3nֻnjq!kґr'vQcF5\JzXj^e(XfҶ`]Qh]C +bI^4bN9 +!{LHJ-sV60n4DR}^dݾN"F%ۮ]wVEBS)υmaIPT\)'SXH:RNsW +Si,{h׫2 Q<%~R:P]Y9tm*c0DVǕC. +?7he]e䴚E@qӝi)t7 R }k>tb55K%T&:9 V<-p)\j9sϤ66H`Fz"ex>Ā݀z8tǸB{-=tdmuw{C֖#cK_xX֮2sDVil7Y+`b .□&c[gY]/ +o1&nEvQMD%' aCH¦w'T WMU l̰/ݾb-ylj:7 gX"1mu\~;a +u \lkɴV9Q&MLpNWv[۽7K+ӥ$L.TK'nþ4/Pi}lqe >t@T=(3O;xM8,VZ4rVW:bq=` D& +1Td7.m"\62l c\&Nb ^\6//Xog#@dyR H#WNK>xKC/E*A 7$9d3~'!pL$?V +­O+ +R.5\$Qr ^Y8=!3ؕeT"Q>eGTN +;u$MU4uYl.jmt6ʾ,XEf1 YI'(U8km>% (Cez䰜ce Li ɷSցRڟŏ +Y9Ħms£RH c<r47tبG!NT`Ρ?^,?2_ +lR,L13? +k߄?&5C" ?@f AYq4QnQGZCÅ7Ye,(\5߸fDtb!FcYՓby3K# `F[~_/S6m+Ppm8KDQJ;۫n#jXùwrӍqB4΅KUSмBV:2nF>jE| H"|9;-˒# X.5+¢?p377,%$< F:q1#)cc~FxDRv) 6<,N\unhmUnW Ԣ; ޖ_/rbD`(~tWMi -ۮQEz,֗tKIU}o +ƫPX +H&>9]${Vc Ӹxia_UfNv}8c/"@Kd7QI}&f(eZ C3`Lַl|`EL MB|F5-(ҏZ~߫ʧ̂bv#{TiNJOݫ۫-QLn/΢[^z-~1jU l`_Յ]ysu=ӎAHq_2_U0 hʾ*I,6Xy;VjcZ 07 endstream endobj 3091 0 obj <>stream +0 U@&T Uf'*`>(c7Wyd]F9O9L iR,TcsB_#5 m 2}3pyѱi8`&Jqr~bCVsusv(1[@ls~1 LziwrF1W[kgwlA+yyiigjĥN,6F}{~/i"=;'62)H3.vfⶫ}AuhG2{f=iDko$vdTKzp4͵kC 3œu PC6Ɣi)&"E7JfY5a& Ë Oks= leSElᇛj%[5EW|fD^tL|ĉwގfDn +иnAWo1rzmu{ o`iپ:?iP4(¡gJqj,U_+z F9`"s|@9DŨ#1d`,?Q><+7`V\WZZ0yL?L*A o6eOaD Ÿ&NJÇ^LR@2ܐ*&Sa+#䵋 n/jSuD-u_D&4V̿SrнI=#͕cSpԨIrtG 'vi+ + c,3yY`7Y藱جKľA+]S+$(.~؈ț9}g(=l.jfN TJ%r2_6H#0U/l⑴/N؍ <'߭[V;wpJ˴+⇃g؛ +ӌ Uo⽠ɲBPx~{ȪIl2@fY w>--2Sg$]0W#|嬵6N!zl7J=.hReoo 9pZyƘե@vY7I|{]-Vo+E+ ncMQ!RƓ]\`Y~VӶ犫"kgc̷wmd`bƾ!{@AcKK5}=o#}V\Դ~08^p%+w0qy<HafUR"_j2%ZEAq * DbFx-:',:hYA\{4zMmV!`u"Rdti6!yPEtfҴfaL +wղ$~MWh$dr* 눹s/(Y-wk+5C䝼 ƕ뗨ui0}9nk(HD +QaI&hʘxR)OmY%, T7KG+K/G10fY.8C*Y.?p4<:J0]]e2 1 '\K99*ioVCH[q՜Vzr t؁Aza>Y^~;1DmdThqkfXfJX37n$M*݇17^0άVD* +\V UE7бK.DYRHMd[{]0) av s9.E?pBGWf ]|fg%~vZiyD)L2sA:\5{)5~h vCB|mE(:N~#>) 4QrTh-m3+Y-VHrWc=J>zP\F;~GOQh +f@#ϩq:IF + ©:2ǮpV -fjsHnC d>"@} tljkIk&Rǂ<- /9-,~] *{X`2xyv#]ʬj^✡Ϣ&¬NTr.`O&>\uY.TZa% :e CPulm^t,ZySh~$@bI)c:pAa4 2Z6U/IGӍO9Hɍ"#J8\ݦ3(:dmg7reg@ unO&Ac2;p ,GrG2d #2omTm Ұ{&vZ!&'7kGpM~k5Ī 09Idc%}{4zI=!pV|%^5ZW։;5rX9ce/ ^:' q"vMj{f$ B s;QjDA6.T}2iVM%uKGhsS+Cn9[]gEhؤ dbfA#M4Ѫjc;i#cSZ Q(&]h\x@Vjlp0mvaWZݴ0MP.^ߚ[5s3()n_C"s> dC, NU>˄(WyK$Q%?dxR) +ݼY;`@$TAJ/=OmNFrP\GY/&]/o|6c/ӧ>R=eIeKGm=A!֙_=Ct"oe;${MQmgUgp};E H2ivGcz2wwB@_ji r ׆죩9}-" Y%IufC6qĂ0j9t siBEȸ> l?1wn/> 9wK IM]r>}rΖVdO؄ܮkݛh-Eb8꫋[4dR|ӳ7:Ieʔ%t1T2k9FD\Veƴ.D$N aLT-ıjˉ#={, —y[,a常"*XߑM6U8\Bsאb?͐YpNeb&:7Ut ܸXܙA*t'ܡ$[ D_U8VwQ\i^:61ۈq/]Uo앛7Pց`E `5z@ȃ[J 2187+P:8^! +P`'¸6}k|7l7{]r5zR9Z~b絹y]g@bZ/dɞD0-߿UHc4BkBʳ,qn'EWfy7YS6*[] fR0V],B'ͬڌ܈AOY5!,90W8ESvce/!Ks^i*Gb+~9OQV@ 'YTyR_k +fޏ\GUPsa-4*٬jur]&n+* +nmLh̃).; IP` 9lj>e_D ŋ.}ڿ_Sd2CW:JgjWK{@[Fy&$G7PGBXE(` 4Vmk!HE҇Z +״^If+otJ"FcnXt//{: +q`Kso҇JCZ4nȗ!spJ +[oƚMBWϵ/;C]9R=h%tYmB 峩ϰc|lFt1m#PQP1V@, nXweJ c[XqZU ªۆ +^Y$q`.gM^a_pRwP0R6<<@siI r@.;{o%&yb){V6|a\A7'Xwtg8U+(]%L`oTҩP҇'`>)=kIZ]&wTr + \O+Y ³Tq2&}(؃F(L&fbbP`r5ԊcH\.$ aBy`~)1yV7$[ݫs=XxaԷ}2cd5[bUr.{F]Du&xvV*ƙ (@J5y>ק⤶7e$}rXSt!ͱlHD Q5b㡓p uD6;Ϩ7 s=P 6aqHz1͢,UlŮpS9|T`e [D$SoQ+ DUX%m3) t5%cq=kаpSmN/(kB*K?VoO$!C-p4>Kt)e#+1փpM)u [\9:ҟ0ل)i Y;zU~R.k$2[pjڶdQ)|>|tNZ\BQzN1,{k:y:iFN|BvZ߼2!W]Ĉ 4ׅzYQ"D2e[B>X˺J~-fJ%Q7{n\795=9_(~mNUuHsS\ƒnb[X^Qւ:I47#G dic-2PV~^Qh)_B{&뤻6_acgk;>$Y UidBQ^}r.5FzVϮvҴ"ģ,v_2C3Ae树L1xY._W:Pr4&xPi}#W +">γBg0-`X1 YyݯMKO9d֮K'VZFf%So-4i`&)G;NN7czt(c2dNvOb%ƽAWgC4M 6ڳ,{Q ]>5qKK=М.%~\ütwÞA/%shʶ;t140CߵGUH^h CfMg *=e_Uy'aW[bB 'R#p +*T|iQ%a0)𲣊V_@r+r7Ian(Pl]zi$c[5/pZǐD5]?yS-at\ Clm<`3bI9’٬kLݪN_,'`gC{&lk b-21g#mzToM>ԦWIepՉ/ nt{ vHb.xTHwbĶ7B>~5Â,"q2X^syTx?[=P+.#jygA *!lJW؆U0ŲS\w!ya|9חGKG?X>Ԙa`9gՇx4|ʍ#RUS/ +k>8Pa 1+W^}QkP`9,qٯclO,K݊!2L&CMЬؐ +;-9w{v? + >W9Y֑GkhX}-ɱ_jb[Rc|v(K_ȥ' DeЩ쭲Ue~B] +AG6iسKʷn7,IlnutX'Yǝ∛$JE]“I7h"8k'f(=؄9CK04M{P +ɭ~Z!7޾R{G_}͙ x #AC+mA:fjZ_MږX0=xUg$$ =Dúk 4DZB{iK<0`gRH6{7FQ9YTVUE% +D #TQCYT} +~ Úuɠ .%U!j;  _GP: p-*9Y][  yY/kdzo^]m0iFS77I{ơ,~TsAc&R92^ݍWB&r6K:)n+pcy ' =JǨlO߇R 6ׁ;y* p;DSTSKੴLY5+[n9퐎GlRVgI;?S +tNLt̢x|rjQL:-k* ?ѝ54>wSvyZb +j'cs\'GeEC(( ao"rF`ywa:,Dw +?coG +>QOyM"'80HXãƟ8^jp@S1zi%]AUs;"n. Ԓ$)Ʒ)aaVLj|=by{t鹮o9d +59BD?59$|?+ \g)tOD?BގsΊaXLt^bZgpk9PgCF$EƵeGyh$gg;N>oDuҙ+hȆFbD%ZXƮr,}nf"eq"lk >*G`b6E,kQʩvjZjT> ILlOL!/Ue%)CbT3bcF^|7j{ЌX:bsQ]}J:…v Pd K ^:?9^Q$dA 2(`!;jܑUMQ< @=NT4H:˕jKƞ~׉w@ZCo4٦̺SV~4 @A*zWJag?q@F6آ 7DeUiwØcdy&?r|֭qF8bd |w*Qq7L]0,ncù{cYUQJ %a@H6g1O݌F[R]4ж`~nSv=<%i z$]Q{/9 u;o2z2Kj*4[J֥??\ڐoчu- m; ش>5V3*0;,쪳tONo[@I% 0< ([Ps.+DBNG2nR_/$Ai|?ȷm2񚵿ޮё9*X7t-@*c=$$E4w!7e]n4GQ럏´e*+f ƄZ;VkVwKW6P1GLZ =%I;N"/7]_o0ÄVW(k1Aނ6dx%Z(@U^>ND .qN6y|K]=Ėԏ>?ȾDe2֙"~rB@+ܧ8\CuKj],c|l!gb~9E&m1pMy:xޣL:#7"ea8hdI5ol(^[AzqC4l@2V ᷅c{?a4ʖISs (O!OcڏE/˻O( X.aWgM4HM1zJVz:ܽRٲ4 Ls4閸"]OvnPpgT#7Ryx1;дd5#y814 `Y3M4tsh6.V_~:$nѐA`k»Z<늦bvQ_|tN45m"v;(6]Դ˯ct{36UXx)ѶOZrzD6^Bn9Xh%7[ O3ETd?L$f8(gRڹ>c0$0'r%' G=U\l^PhuR$SC[#w R(7-ւsSnVļ3_daWG[V\vYc >M%wo.RB7ɵ, +4䓯*s{ Q2BV(V{"dm<ȤnqȺx)Cd.nﭴo|3dζ+PiTڙ̮x{OʐO<4c3v__@$ NXx @ 'rZKvK~'fA"Gd2bDk?ncZ3H!`qz&+~h_FȡJ) 4 nH7)CNQGrlE*Â:\`|GG*#`+rwia1ʻ;(MgbG*շ!mb&JrMEǏF` b]/qX`0X8#Cd*sBs=`7Ьiۊm&7b!{CaMJ2 +:uvc{-8v {-LE1FZ[ѼPqmBkUn9$X߰o\÷wCݹC*8O1Eu'H~(K 'W{`oApw/#Uf}b^s8;7𪲅OfV:!Sc'ƖB^ cM,3^T(DyB,?O9ZS縷*ci`%t~s+ŸpƗS/E<5|dzH0l8g#S( [ϯ +-֢kTN-&; ؆n9O<,zH{W8hZw\Ќ!(܊ ,U퍖.2F߱v*>u<\{CL3W(gP +_ +.r"?K؂'YPj12bpGMA֥J1Xnƛ9vݞ[0]rCPxuGgn}'ch^SXV)N;zUqa`_Xi6VDC>qN~r{ń!Wx.s.Q.;Ǎ3GTIS%]f/t4 Xiekvqk+ oݖ҆ƷrÇYB"f (jӾbh> ^75$>m̐obk%§?.tPo)"d۰ornhA jwO}BMZb7<)_&:s +m }0֋6M/XhE%G}gpcV.3 +uk2r#u?j@+Jnw RRgq@=.8#'7o7U"n@K~KoqH|cM[o-6n-džƾkYIz3)1{ԌHٛ7~V&%W?7{|UA$(oLO.y=֍ݺ!,7_k+F8 "+jQ(@Wh]r ĔN"\>}a*I1­O0:SE12PykHVߎ_ñ.ͻy90oTjh{2ߏ1.zDRED۝N<E6Jҽ~is&?tr-^/XY rl^\/cvYJt- )fݭT횯,.ݨߩQtԢ3TPQl)B jPLV!E+or.F/>-4(c G]-vZ'@[t~]xe5wQ_ F%c6y̎1CwUU-gЬѿLwʻ%'7K'tF?(@nc[7߷BMYHsRƀيtC哚"HfXX1r\ ~$P[V_e~O+iT@laV?`& `v&N3L9I^ViIe̐U;\U;I; <8G'~%{~]Ԁcu&O?R|}Nڸh? iFٰ#ԣ'L`l;wC%mQSb չL߁0D+!aCC{ Y5@Ž˶"aЂz+wUa X#‚՘|Nup&kB6~؟.Txd-wȹ" 'L^Ɂ0J]%KPg;&ƭ7Ůzi{ɶ\76QUDŽ/A@6TzJ좽M6xd+Yr!^2ea5xʢNųSM]􆡑reMS2B=:A2r܀n~it[9?NOSt&ZO;z]a A)7sQH~+ +(K4,!ڢe(&ƞL_3 gygj/h:o8GĀu)jh0rl#)6!4.ik+q=%Fs|P!iܻ^ [VΤt#ۻjt/7a3! A}U)^x̝f%#E<ԴYnZ;0 :bo@ 3'$@osӈdn#x+#.m8eņL~cTUTJ/ +> +UϞ]AZږxa9J!5BmO- ˜$Пۍ;Ӣo ': /W=> ˶16T&VJbZP?xy+kvLEibtMBJk]>yTWhUa<\^7Xj.J$qnuRU/h,1SFa*Ƈ=9G'u.;T3<4ҎU:N3f}:,pn̢(vD]^s==;Gs2hgT #ߘV 5^Nh^qfF [ JuB\pPNWREQ{j W&|T?ݮPN -}QV1X N4FUT_生~ͨZr2'̈́sNGSIZS^Fgore4iP!(+Mrg-4CO&_hOgʩEZV;k0P,$ӈQ4r? endstream endobj 3085 0 obj <> endobj 3086 0 obj <> endobj 3087 0 obj <> endobj 3088 0 obj <> endobj 3089 0 obj <> endobj 3090 0 obj <> endobj 3076 0 obj <>stream +HW[o~ׯ؇>ب5ŹmDŊ\Ilx.)K{fvf-J4 X9s\;_QUQ'ŸԄ״~{fg쿴bʭfJTD'Y)6l}Ǻ;i \Kr,qE"m i G u8n\pv|_}5[M`N [F†Wu{  L0*1΢>'"d}x|hW)Ν?%2,:o$JfVQj +X$D]ong^hnl%4t.{g|D5.@ݠU3\`J%%A1уЀ0k繖Lw(rGm '. ;Bv{cR&2$48͔oyTb(!l|9){'MNҀ2)E)ۜQm`_&%Dzb{Ǖ%ʹ, S%CZ=6!PV68eoH9 +ʋ,|n O+)"GvAC Z[Tckz-znJl\ /H@] +lgzbhwm[ߠqތNysU@0 dF~tI|>us|p nV'J db0Za3]6òG@8g9iE)nTV-Q?rB*ŠP7t> A<5#$,bF+a@8 B\#0qSO.L.:Ѿe$İ!>",Z%b7)Mvs|1e[ 8 z]q/@zRݠ~g*y{Kx.2V LY#/V=STf` [8v TL2H"~dfBŐ#{e_ +<O,lA4c-=\ HG?r\_$o;9{{}Rq +kt~{״r@ZӀxp0M**Ǫ -YxT6!SgjSnr1pdϐ pw 9R9Wj|svFV)Y ̃jjxJř!H=(2[Q?DDPoy-x4~V-Kg_Yu8y^n9ěřj8Eڏ\>VRS󸴡Gl 353lKmSwi^0F,OQiQ5f_Rc^,^+W(K|SG$rjU}F dIYBXĨ \1BZ(Yx 9T6Cde:ob۫S)$K1GVi鞌б!Zb%)>_萐}%xX6II$]/,6%'4RٿV2e41 ],^!؏0pѲk2;IT~y< 4)M6Rm i!)?|m'Nj鲭"ԍƫ)ކh4G~pB[xw_wp]C +Yd{ gAuP ' %GmE~ܴk*` PK cL'918&<\yGf8.1O?o>d d N@oIWz~wpNWCྵ6#|!tʻ(*:ЦzK)rz`[Y}sP(޶m7Oqv +m э?D?&Վrd4MCnšm9sžyՁժGgtU6wj[>md,%@rI9Rܠ_$A;Ef@]7}}`1:hC(Y/hG6&vc +M=,7a-dx{<3t}_Y$6>V~h$s^5 0I70Ӑ&hTcRkv4vд#ҳk.3Twf=2KK6 V[रb6|02Rg*SH|wQ2Ãvuٟ[^#X()pgj +Gդ =T1lyhSMT5h!-w_}י! ? { 9,꣮N+" +8:7U/3[ @~ivHq{V?ȧpl{2gn G=$-[F@$ 3"69G7:U{}؃p7D H\TbSN.}n,SE'-g[9ymhsՒFWFy]Gj1y<KѥrugԨl($Vr:],RT:Z lƬI>stream +0 M@&X MX -$M;;+TVÏMas0$/&;sݻ.GDy%8)tˤ-V[m#ض5LMju/–YE/dIU:=r?zvɪf[' KΏ< )?R0NfnL m"%ђN/|B f2H:+Pr:/=:~ةZUO\1;nQ-~ Iqχ.1xK[6D|vG`瞈?_lU[y zKk h!c~Eٿ8Noؒy'V!}$q`dg@T!Mj,c/rƮ]ls7d\cn J,5JL-< lw@ە+YLn6"['b $kq<{b ^1ݞ/噤fըoˍ crA;aX`zr665k1@[)U"2Gdh:|[0uC&Jִ1;wlW[*F.\{> K\_^mWI 1@=[qi!c':bHiS4bXo4þUu=@ wҺ`pNǶ%C|ϑ>My׳\s2J|0c׎SQ햵^h.0@e] +1+ &"[Xn :]Nj-eacҙS w4r(r*ް;2{6 $B}A7qiMKW?[iE;M +Z -DՇwi&:&#ZrGh8ђ}IQXa^~0iЛ].q%'\[{ι]:dbi Pkܖ=rMa/%QD4^y2l.AP/rUqcU>MՉ \*L=b ++%9"Z԰ڠrr. + ԖDxPp[vկ0/Ӹ>t%Y*G{jomkY?>/(j+Esݜ@T_IӆX =aGG kZ' JEi1Y]jt?e_99Zl9OH|/dQ|,_*XQPU/d"޺RM"nN 0uz<˵zK`_ N_RL .#B]i8SuY0* sT^7Dlm5בNyHe;,!iin0FM1u)uX_ه'XҽNMh T aV桶<_^ \9NL +}|9j o9rhCYvDټicvx2". HB$7z6s\(#T= bdFW Bx_Y/ +Z1!,8YكiT{0r#7#dyz9uu(k"'v y~\e`5|l UhQXsny@x>ܞ:ёD[yq(%z+>fLx7*g< TwgT#Pղ6Z1o~a u$!PT,$",f@}13(` M0)@D7IIcXӍWMy/p 4rMb#>!RZwuПr<'x ێc3Do"=gp]Ȱkbsd~ ׮hʦ<@'9wctu2>Bk.TջBbuڇ>x6G2|h:qSiyVU1M6?1uIK!{~Wv)6ŏ[ A K!PJVZTT~eFg|Ȩ_{ icꎩDt5};9/SYmd.5AR >dɇcV4*J)T2Q۟18.gNe#0V-13x1wNsf8:3=̏ǴHd2**+hHڎ Z++UOc]uWY$u1Df {r=n7SzO0,ѩ +vm2f@˘vhQƢu'IGo$ +NCțX&?:xc[M\XS+n$$=q@Rɘ7n /d +L;z;z #X/U>>>CF[&eD@ۧqtb' ++a$d`cS2Ӄ5PJ)=#>aSp~8Kn e)k'\oabE~E! ";B '䜇KуQ:[{4~TB=vGZ!/lⅳ"9 MBI?Wp]>״\G3?٫@9BXW l rd #~{&)ʡa;sR4 /'ܮ4^);tڞ +s4|`ǒQϑhL̚j~-AGku<$ݭ.`活`nTe2)aVH'SzB+1p 6ı|]vYpEd^T(nd'2q}Ǎ#*rKj_j_Ko9c]^"܆7%ca*dhd:by{IK#Yؤ~f M0t|nuׄ\ ԃ,j?`͹ܬ84 +v29O,nKc4#VvzA* w< vߨ ByzXc#!gY?YSC&u|%[)zgW H\^u#yqDGZt K_+bB gQ HȬ.7]jm2e 9'D4]yci. +R%C`Ͷ\t!҂x}aO.7Q+%|TR2AN1a#%,cT{PƄo2ᔺ!0eճE)H*9XwJ{4U"y1'v†tJ 5Pijɒ_{Iү/FH@}];,7Z=nV4.,i{0;a&YdK]QHՄhr.=21c?Ee.c9#+1^k>m 2guD P](|sU1YJ&{Rxk2ul.lf̙󪜲hyd%\馸CG 7l0?W2S'MDtgzoPn~ҧ< 0Ƴ!n-uLZV6MeFKfDe* qoeƟ*β8/:T"BMb?;U(:V5$T(zRעYA6I-d:9pؑijm]jMqc52.L5}9^n4ZvM);oKk\B::)q ]ڋ>* 54׽yC:-S +L cGV]%-u"ԹGMkRl?*'~>GаQrD^w +- , u1`. D-L=/ׄWrA"?wifz~IߞDmα&DXrQ$+d&°N֘G\tiH4j{[QtxĴj!13yvZmk29'\pSMlo$OBg~XPq ~kGpʳ2xw<ȐA5_PXnBD<PmWD\_}d8*B`D_"IWv/o>HC$ +FW0 H.7fkjI0&JQ`&Qa]؟_vS"֬xA0 GLnfF\xzǘ!ؽqʹʝsE+_OsU3ag;'.(aE}ݲlgYlL49!ƮEpbxiG(rnh]+,(<)zK,{ 9+׆ɱ?\z#DhgZ9p(p%Oj~ r0Ȁ*#Fp03b +㻅QyiPU) ^EE6oei dq,߾.k'gDf)]޻=Ve!Ѧ;2Q8(5D@^lD𒾈xΫx#f؉h%OtJc)?P뽽 ďaI:)PW/C6){+P3TcɫA=R0JY%:i=#;&"3(Y̵Bm`%cVnSVj_' +ҟzCJAUm`/+@BR lw t>YBė87C. EG&ɐ|*9xoHl1M`~8 HR*^B1}N$X : \Z\#ewQ7k6I_ Z8t?4K[ >Xn5mu2MM>J^^u} +Ñ-ɿ5Y,,aaQjT +t,- 4I'P]ۥF?1x%J + ekLxI;T< @F2M DMi\% (D774"cz]Eh$-E m`U.ɟގ%NK\ ajk#T N͵40m =Oa4Ɯx:"@M:I2C1?bq8ߍDk7'E;s_,:͸ϒ*tHW}.@2MFih5} 9b Kc>StT$;2^R +zzڼs}+£cAcPǶcTPڒ~3a{oXvGN [-Mkݼ۠x-Lz5mQ{] {"<9w!Xì{mwIm&iN LͬE^KX`dUaqW!r7N|}i,52囫̘^<əH:#R_y^Zl 6 3BU;Txk S9彭HdgUJko@_ʙG .?Eq 8pgl~q2oN?4iY T"GGUcEOLևQ(Ƚ<$S 5i&Rzw.6hRQjIuZ"s1dX:5VM5[%)<WZl1@mk浮dN]I.桿&o[`} OP}b/H'=@YX)z(pӾBϥ,]={j +]6~}3sKֳ{4#rTOoYM{ZkNy11 +Ȕ@V˞*IF.kɢp/ƴcIfRf_IoS_+weM[p['2T F{'b69? (&eN<Ȣ.ZD&~T > /S +>x =B>7 Z`4D ZX^A!NHH*kaޑFx ;&;&hVvS(NeJfv ~UFu] TDۃ2aAj4-–e_9'mdT"ܿ)Y S iX⊜\0/]tXT`*Y%I|sVٵPKU̖=A];pYضc mρ(~,? #jV + Qt"zwI(Zdݷⵟ1&FEˉREDщG29۩Pip:̘$1ЊZi.o33\t-mhF`dAiBÍma++ ]<n1͕V| ;]X/`ze(wRń{ʊҡboe(@b/x0_@'a[:aCZglOqz@bZ~ }EM=s;gSFj,3\G@T!q@ )o/!d eښu2ii({]>] WHr6U<#٦+ٺAP|ZGQ qQk +b @:40ҴE߳qt,8&tH7?ĩO53لTw;,Xz +ez dзbp[lazlS5r\wS%z/ +[!|OQqA-TFJzd*| &D~u$SB8QIia >LxNu2ޥ TaC#y>4Vz0|^(4JKF(ٿ~3mh(OϯvNX*F~!} "'xit^ -K[5,o׹@8g9! `"O~fNh5y!Ss⭈ưҦ}h85S]1Yq61K":ĞDG0\#i0%0s|+67_̾ѿ0BAzh- c` m[| yy la41jBmp fr'ɹHF)$B^gesCWF^/ $\OD &c;X7aLs +BfX{-ܠB)Bem?޴*7렄&%1g/̪<ՅO%ޑ!hA~) K PbY| 8KZh>5 $q*9!ϋ!١]x',/,d#/]YE\Y$a^WTM|y2 b?\!yGC+)*ف[3B{O.kS.6'qпfZPYVBQPw.tm5kNV$?>'Curb5!2la˫tIvg’ ('J@c,]mz mŷU764ORѾ3wG`M.rS95c`av+ =.o98lB7@>o*єUC0yzd晶ogþlQ_HЩ%4?ލsXVt9&>*G7WHYĚ?MƷ~HR& +ȏpP=.'˅{^h֩1% s3yqE'n|̮M[#j&^k?R+(Mƅe m#R a5^?:<8Aa6ljDe|gؽnV\2ݩ9,DmG9_L4fza/(8@d唪+o[رU(?H<bA󀩙aRM<H`]# +Gz7~m۳Dzf"$eug`]^EUa9n0hFe. 0Vw;yf}IʒJWW]ƅee$/Ga +p5g%}A%Y xqXWh8E-q)Ȫ偅/R:>aIN eϙVis)G佞ԒWh7$*IiNԖ L>aq9硔q ZVyvS^82rt'hPÎTBV6{ [+eDwKچ[U/\1 O /,ނR +&yc$߽F +lF!ҽ".|ɑUɢT-<|r#i>$>uDMK4JpU-0g憏Y B2 Rh@- UU۝Q4Sױ]'|˜X!D? lOW7(դEwr`:"D٠-3 A^ɉ>IrywTl^wy>}uiݮNSyN4;^kS +6CM9OG]& +]Z7oK{o.%1lMOLMzAKt[7g!?/s:CU.|K(0ܫ9.eȭ]p2+"+K,I_8>ŵlG SMʌ9lN7#rnU=_"eI k=t*-[y)eUv6Tz@N2Ա4 WkZ +.ku_JvCn}Мx'K'F J + ,Y0*Z"ۛ_ 4jzt +xslR> @W3X;|'_Ss>YN\AI!d峂=jm,'#I)kMߛҦH7H!FqeK?9'LϏƆoۺQUb+W#( *hqxahTe/ o\Hroz~ @`q]Bohv + )Rt'&*O}NE0z5>p,6% -G0! <K$?1pCGǖlUa߈(9te5 o@^FyLK;$p~f: 1_~lyrO{WׂB=9+s,`/e񔆠8T0z=ёnVqnSv%;?LkiE` +hWЮPǻN&pe@nba.lwO0vF6kļoKj˘Ìx3ڵ-t-_Lo(X; +zIv$CC% ')lGVI"FeܙR.AiA>4@fV:8:t* +4qyXgl^Fr_ +'oCkdU&Z +?iPykTQIA^~`Ѱzep\[u)x溁9J@Bs kt2.˜:oȣ&Cbթ 񤎲 ˗RMyiǭ +Gp<|TX4/Alp~XNTkj6/} +_N<,g|%t Cd~paA@ϵvsU}P.SRI[4=Í-tw5Obb MV~ Jӎ|>v8pL)g .7peWE ȳDQ,='(Qk1r0nCe˒DIX2{\O:K  * ʧ-@%=$flv0kv%9%o74U@@!s|VL<(|,1D^DM6T-FLLB +as,ਜlZ !z$|ٳ~?`;j YwhF8ď,ʖ鈱lօ~X/]LBx7ۜf jP"-UC p\Re.Zּc$uڂku,o@BuU$o`e/ +$hw]()LJJ/פ3akÃ<~բL.Wpd/3~Sȵs4S̎;I&J;9Lðd62KK%N/yI3tOK @ iz`].9Lz +Nx)V4`kW::gyj{qh+Q ]+T_ &;q#”sHfibikm|ܫdxXuB_ &.w\' /k۬)>] 9?ƈS:ij@$dq=P K4tfE@bL+kF{d$j%+yh%J`;XNOI)~ +/nn 5!g-8&"sڊ/98=megߨ4]%9]gutcFc!E'C&b _4\aKH]P2K仝o7!xU1R;p`s, -l:e=:̓x/B?Õ0:aT6~XdMP P? Ӗ?nxNDV'#713+n"1䐶(aI2 fGh7<5M<Ap ogA%%R^`=3ɂBo48Nִ~HCq"2yzHKꆁ^y04|E`@^\HJ躲q^&}Z-Whu;BX2bD$+Y|(Q54"C4XIl]Sw%XY!@/S+)S8;JO{Mˍ| jۯVU >C퓑sFս!XP߷2<y*Ӄ u#'͸3a54⢛}Kۈ,{[2k;(t]d0lz덖Q!J.Pύ"01KG6 N;jqMÕYaYg-cw +l26l}>S2.8mP wװͼ5n!%K#q}7plY2RiM%&Uo`>jD舧|J;u❂69ݯau\(j;X]dux!DWg5 ϒ!z\NᭋDŽ91V5Qr#Oob8t(gR'1 }h}l]%C`b9g1{9/cV=uJ_|gQUlkG҅Hf}DݠFEE")9s0YuX~3'TڞdسɖxWvзY $ o,YW6<5\rctվV690sĄ,;ժBy>ζ~WwZ'ƛFvASsR oҫҨL&^'>[ȁO p0`pQ={moyևQd $O89yWi' +5|*YRrٙV1i}=]xy qD󦣲[ВAt-9,еzo$,$֝ b1~ЏL> 'zZgG: tje+*/vKh&dLDak;`lK}WQ-dI9*(h爰=B1 ^I;BkIBK9qVSd_K4̡x; Yc=H\IZA9StcLHL[zMc!>=Kpipt~7r yxUh/*shd~xN2N6[ʘRyZ'[5Н, +/%i(=DžҒQ-zQ 'Ιa '-%y2 +,T +D*}wo Sb7S4Qp]e͛n]N*8`#a /244̈ob2 4,b^JE̻q㸏1HHvS b?aWb(=^W.z#@U'pNx9ic6]l{k֌z}*o>=.^`/5U,Zeē( J{ygؠXc!CH 5ߏQ ]U-TƊ ֓{U؍D +iwwaNA,I “p^6@f` Md Y[q& I5&z%4~đ3sc #h88ʌ`N%C;F͊DTyN|]R1pin:w 3M:ɽ7BG$rz&KkgMm{9&ee\Axj"J6y;RQ \غd.o^'A2]eq4~BhKP=Xo*LۆDIIk'hVʌEmQrlu#.O1u+H p Icb 1*-7ՀlAF?3N+PhXtqk[ Ȏ!|ƼLPGyLmi+|o~?gU7^鷄р ^9y:۴l4t-&30!rp^VR2Pbh!(_pS &y~~}Wr [hk(-xUxGu]p➋: +`!9-KbMutяLºYU5]KT-D@[ݳvzP]0*gHmVO]Oi6n55I0eEh*L-"9PdiiԢ8WΦqy/W ns?v'Qp`RȚub_6&Zz8 +%ƹ]ٹENkicRp_kv^fH.`T(~닽m 5OERB~(Ø@AaA >9o";@UM݋/NBױTBNcy(3! n! +6~Ο=ưH?BDKa?^K6|g_+Њ?Tع.)>bժWi3%-bP^@H`KOYrQ xpz nNO( *է;k>\1駂0D?ei $5,=(!-5LF0z w>_=䑑/NMsKxt>`̼nyLs$l*ܳN= yZ]E $*IS|?iNt5(QBhԑӯ}֒J1 3~&M^94w0` +mfa$YnK"w4kc#w7rt76JK $SV䉟ʢsʼ:yWN%f'/wmy(lC;(b45ri]3z(,AF;gM,ʒeSf RV݇L~Š*+THs? mw\D 3]lmxt`EOW%u~5+Ƴ5Eh8^4_L!hoTk09)=UP9o\oɗGXa վ/叵wslZ(hҿBcacdHƌtnUD|% +;bXLd.} "U++`hDP]FL6ڰ +:V.-oJBv:Ć9e}4 lY1X(B|↶-p*:|E1Z0f>ղ/|P*ˎ0:YʞJ2`;gAwQ/c;j!GS#.s{:q 箦@UjJ1?kOvDUGdpvq2gfob8vP8´[?;NreN+H^( fwJp8;R9īr%=ԏ@-؊i0`Qrw&Yn"lx'YKu Saږxp ˘6Jȴ΢8@3yA HIzSQBeqaпc^`ݺ}D6.0#Okơ()ӸjD9СC~6DX( '7A?ֶJAMot&F5RX<)޶kjc*:RaGD!UL։@XuxM*+uĽ>kGW-ݪTr +%rA*r'3(xvcopJr]C ! +h;Pؓ=q:y/ԍ>f@IֿZU=a( G~K8b ׹kɔOІ3v%x*]}8 +f.02> WW$wwG(ʛJ[8O* endstream endobj 3077 0 obj <> endobj 3078 0 obj <> endobj 3079 0 obj <> endobj 3080 0 obj <> endobj 3081 0 obj <> endobj 3082 0 obj <> endobj 3070 0 obj <>stream +HW[o~c $Г8i#qPVҺ+)!\q + qÙogJ-eT4a<ڝx߻<{d X^Qj!~aI*GX(e0ٟMcϗ^kὸ9la,3nGC 77[I_(ntiw1`-T4-*ٯgj&r8{vV mӷ2dp׮ׯ_`o]L}S*V^/t~W~{ۺۘ`$Bf$r}=Ƽ+:Mn/ig`c{UJ{ә{+9͂.DӇc|J}|~^@2gi\1D<\x9|k5q;s7* !g1n90QQ‹_wَ!1.%T6a!`H8Q#f7uKR78",!#\!m>Ca$?ܩ*40ClO=D~tvd ŎUd3hjMʪD,o \ֹ*LZ|V\09\$2nvM2l1X#vJPΤzL%Y`^c(4|~C#uR/PΏG5ĄD hQ1 ӎ {Ơ15Z5 { *ر?pk.M*ptD@]/8@Y "7 /%5)qr¬$6}F s(}gpb5!/@4om FNj8Ucō%3iIc fJʭkRqUeB 5dr>RCQ7''u }I y=@J +goXONDLzDm%!n3gmY_^n BXޞS‚ {|z:م A's~r!([0aO8B/ѭm1&Xc"-2jTtvP,!J܎a!s8!meя^8m: ԰ \>5+eS+̂k&ODlb(X}w|JHqqv_9m>]kmά8̰lV$r\MC: -G:g+# ;ms RAi<P̤[*%>0QZͥ:*H4!(l;<(Ѭt0ə#;S}KD?AwNv] OXv٩v~x4._Ha%='ГRdkkx?"9ON +GOǤ5ugr +ZtiB (/@@O(p08m½NFy?z0ePxTj zy*&y\6,VP40$ a`fn{KG GTK { 6} +Q$~ei3KgQT0$*rƌzHYShCSрZ-.DūtpVp@􌄃KYXLHjCt SaK%8:s'6( 7Gs"6ydl>+BuZ6]Y{~dNA}{~՞ 5Mq(/avXq9F ]k9)*2RG,Ԥ+B",xm\hoa<"L]Tp(^<=YVv#jĞzwFq:M^EKRnCOpE`E!7dxDmqP2E1+5Dq0fkEgjT<|Y80+r,썈Mkq5$U 0xZΙU|ŝެ-QK$.'w.n6ZJCDrC>.`&81C@ݷfwhVx@VV"N= +ɇn +RW fW@+]*}';i|Uu"Nwٞڇ&хl)b,†vҦ: {c*_ʬ=&13M6F&< +tIB-V|CeD! 21їFFhY~<\G Ir8 )$/fa߭r4 P!#":DVѹŤ:DFY ;P ߑ7_"2 R?.Mm$GR Sŕ;fAOl瞒^F>yovղ7 {"Ho8f7X{KzP'nϲ) >yKSf81#uY/JAB>Osf(p3.b YKC.a^\([ٵ|m >Jk7Z[< sD4{9$p!Ac}*>muM߬5ۇb*5xy t- +§ ;C WmI66_Zz=Uqm-eEiKo .p24>1_IwO%Ƭ9gzr +6u +ES"0tZM!=", +mdX2ފ!20ñZö5!%4 tp {qk1E OqNse`h|6ŖD\Ā/X yfABdMMI8SK$JqZҼ}qDŴ9tCMAbӾ}IPOȷ,<}yr$3~Q才%R9,mz +TxCӛ7.{@"=?l*@J xp_q,H=AAn +eƿݯ+ܵQJ0WwnIs>`92I <~Yn0)<~ؤW74}`s|n^ה*.ceźk4rBMCf ֋[X&>zXY%denG d9J"]OOd||Cɢau҃R S)NlzˈsOBqK{"@ߛ4 +06j\ endstream endobj 3075 0 obj <>stream +0 _@&f _{ + gƺbBD qEc G.앑665zCeh4+}EVzIZi,CYEiVfͧ#v0PQw'܄{Ҍr6EtfϯW3=dD;!JUN[ۛOm[/Uu.A/BemCe!Y.h6QRrtı[4^lzU*x(% M8^b ޫʬ߮GNON| !˭;qp2/?oOq(IS4\fa3_2.UݥtF+1^˟qo&y;md:[Ǜ  :XYؕ;?BCZ# qL1!RrǘU" ++֫9:m)ѸYs;Q]w|l`v(&)۽mɛtv`}4 M陝- ^)f%l wʌ1rV=A9]* +B3 g1F&zI^:ug%1ƼgFL9^%Eď^> + 4M +u3iaJBЙH;%O.pw/_8C_*[?P :z??ΓtT2԰48rwpmok[qjbb98L;3V0Cw/*@fjHZe)[?': +ԂW{/H<&CC,^mWlVÞRq $&Z uF+2Q0O?!rŦ-{|+!oCFCXU-_s3Gcy[p \4e/{Gʽrig!KM8Nk%1Tcn1\ 34,#u+-O>SżmCZ^x\,DqGs<={WȈ$"}1uڦqY雲RS4tXaRhxnO„"ϑRg0 (06=٢Id@țb^tҸבQ0 j.4Ll5'4j{ɸ\% uGbC,XIf!VmRc2a 7cpn/M@8!ҙ7F4e'焉X70O9,p,0g&8V,W󧕖%.I4dm|t1'Nì$5 mW8GXrDȇ{ )唬/6 +o~ j$['$_N:9Mf_;gJɜ-dWW_j@qTxB%01ڊzNvQ+a^|JzO+C3W k$Ż`itXbDC"!|[G`W 1{?B ~MFEɜTt<Ptװ<$[g/"IZ |ob^G>ӕu=MS7LFOBY+ksb!Zxk2@+BMy-dߨ¦ᓗUBn +' +}84|ɡnXa,"oӀl-*|V4=rs[Ki +JC0r OcL4Pꘙ^SX_Ey(\Yh wT:$COsx-:,StGGDQ Ɠ5/EUH ojֿlRH2uQ}`0&!Tͺ1\NL^.TY=ɨ%QzAy98a_Y +jk>@6UMj %(NPe$Q0R'51UICRDTTY"t$(1>l+7uI%(q'vLDՕo6V8:xi#ɋ?r#xs"B3P8* ֈ ‹Y~'( hV4mқ.\jZ.LGiWNo\}ߟGknA4\b;5q 4UrQ@XL;3,wn[4= +}Xv %PxmcH NX_PLw 1J̶FA.kpJYśb&vhBjNrBހV]Qn<$+ϭ^u;֧reàB${r? \2 {ttrH̎Tz1k畊]஢~s)sEZۥĥsPKͻFT#%@ʇթ +9('Y(H'>/ŮETQ\|qbydƒe2DXATKT-ʈIßϯ +[9W-N_rnrNQ#ҟ+ #Y/+ib\# +zReit*ɆC.?SEpo=s0榫Z񏦨0>]Ma5Ca"v n#H\δ)>E*BOJ,S/Q%^s;? u`Q}"3уa":ٴ:Duܠ8JJhKz٬]P>("k +kD `άg- +`H¬9 Us'=0؉Ǣn%{]q:JꯩZ0/wm:^byTg-wmx݄~"oI\9m8$cNw<(~\@L[$ wM!PaY16$B)iDybϹ0/:qrK`;8`^Fzli3Y Hblx%tuص""dE-=0ZsMa{!}h'T٭B8LQ֡|XH4TMT],.nn K$&;ʉ[Z,9dz{_+[ 6>?ٻdqQZleW:mh L_CBY'*T#s#tbC +Y^[Ȣo cR6ɗ}c+wu^OeWoh -/J§\G# @yu=p 0tt~hxՒ/~?0vCMH̯[Cq˪(Zq]bC9.L:i4e є[@mN%9e`ʅ]'Ep2 + ? ]Ghm-A6GGwp~pn_q#"Lc$>?XOep6^>,`˨Ū@2>C۽23?#51 8{h~$HQ!S}wq5С{˸Tk< /6e|7M"Dyŋ]]qW9#O@`.j+%wC;!/&ـF`ȏįQQɑy4}?p)89৉PF@`6Cݷk€YL}8=8v7ZÀaKHygf di! ;R7eJ@{]2mWgY{a2,:n;Rw3[p'3V\G(6h1>QH2R+ݿtb0VAK+^BP +N1ح*q]+;1Yr󶤀^YKu60 5}g1FI&(QVwդ ~@ `I=wZF"^P\7 mq0Efr7Ydm>J62d$G+q35ޅ[sws@E"P_+nb*T`ݵqK+pSS$Rj"@]7ٟ*党IX_S&ĆúPr#ca +pۇSy+V +h6K|_?;bREf\n_;/䥿isQY] XuD p.dJ#}6lXs0vaJC?O`RCh0Gt$`?(rg4YB  +L [}V6v=(4䤶r?7c'PBl&ēƅ2&2y̅G+"󙑐(]UKJ%ΖLa +0b8:tFrʶ|S!0prR + +XK'/Dc9Xxà~vb%+:FJ,YK1h|` !Z[A"fz]á=@l*] wtDqq"+W`xtox9Kk8ݠQAl[x%ndwh1ȁv׽g&{z'~^v:vd9(1'PglXwRX"锸֕- %0Cxz(wU7z? ŧt6ctes%P^Mu,V4­f'1XA;w ?E"߼,hN:T{N.-1UK9y P9[AooL[#թ3{l/ZeG( %QާִdNҍK'4* A"dMH|.T; _UM|?Pէ~xX+HaIj)]}Nn _ K6LcQL6j/c6 S>픩u  $?,O9[?f(䇯y+>u>L*zIrboyt +Qkb][ЭzjqLaXTeL^!eD<%ӗi`l'HXϤ|7{F!ƒ g*",^83ON&2V{ otz|7/Fb֭0&DwzB-AlQ*t{']3= +r,tBڏhYo a41q. ˘k ڣN(A';ԧ(/nFUVki_TZRvIs s{Z|X98Ʀ!3ƈw<בLMSQd.Zk^VmĦUEGקt0"5qYwqkE75RCxS7V~z^#bbU/o 29l6Ed=<]Fr{/G*m""{[4ǃogɷqNN] +p C).=M!1u@-d<;Z-urBGDMEoƎ~~LHD*\M `F?AhTK"O#gaxFVdvAfFpTXNS~g# ]B" ZjJL6W*kVAzoD;9`-eSwg_[цY+&3ܙk'VQJZSx#0bؕ\z漇Ye7-5ќ%I#ov.>6kj6#C]P"DFYygxބA($JB̶L->w5L7 5::B[T0¬߈Yv``EVnC5VٸNgQOV.M~OK)LY,&KRtzA菗mV_A/p0hfPTzYSoSI[ }ɝ9&_*d _ܳ!KhӀX-sg%7ty+`8'Z²GxPғ05}A?N˟f洜">uSv=\~IuYX- !qb+%3E˨T_Y }7lY?A/ ,#N~L؈iq D߾sլIۭ}FN͍ Ȭ:|nT";BWR~g/ `N0حDm e"7Bb$%y)L{Uߖ@}?k@&O?J+N+lHy7e3-L@57J?6p)2Bnf3]9]S +q֭vu ɉ߼LhGkYC&V:FJء7IMuAcPljW;&ױF~6%(6-ё1YIS$uuH4|ݳZӯcS1+?v +KV KM;VXOwb#K ,)ňSZ#~.L}f"·ן 1k$.pA .^d!?t3~!lM7pI %@Ogewx}Oˇ7Qj#(BZ2 +ywvz $(*g.FA͆jA# - )9Jj>a9zj!JX`&` +KG-k5|:W0Q8iěǭ?Q. ު:ownG%ST0MESaF@a֣d$ `͌mؘaO!=Z~\(P)WwzLu>’dҐbu2/ҭk/}JPMp0DN9 y*ۺ49{Br75K5`I096Cg g>]+C[6@$&QE˨d)]NOusY6RtFCxHn1#F +_ޔwn~D,LV45\)rX}u{U +Nq'6Э6A LZ;nf:ɼX/IGP=U3x3hLK!x A9ϔO’%ţ,xj@bK%=f+Toj!;4+2d% SbDi8r`H)d L`{v=78pZT + Z0v4lfOY8yy$A1Xw潗x)vyJn\PͦhAgࣚ GVa6QdJJƲY4f*e3߻9>zES +H!R>{49 8@K bT}Tp\W;NjF7%T~F-6i@H-OƞiFKy^_^,4,v6~Xv\7f=9 Bu} M:vbTN|%3 AΔ:(q/ +'ٕ7:!ewq'*%\6#Gn@Aoc>ȐNJ]\^"xn@29Am L9sgs5BFi̦VD{ +Lt} Aa=e K~"z4/|rB1p +#vpm"CP'ovY$'fIA{c7@'%α(,2Aw +Ҫs4fJGJU)5!E @qS2QK)d.vTpY+S" |:b\8OvV&uZ; 睳}4&w9X !D.,0g;TXqQ\h$:7"g)8u0=&m~6~ ̊':]X-&3FyOkyeJzH_*sů~EBBNDy_!*F_ß"Ɓ3 !мXX?:ՐH)2X(S=G$3n{ht7xЯ`PdJ=x˪+و{pQܙ{}i^ef\!rœ_m/ã>0;{&7DlץK 2$V^.`{J*GHDcu +"*Qhڅ@ꓛ,*,3 ^KRƀgO1ɥm t9\8Aj?,dTJM9'r߯hXt_a,?Z&Qw(Y5VYzLshN*_imղs|(9/E=lQ* B=ZVeZ"ZQf_~)%hrB=t 0Q{bT\#(WYva6E>l:Wm<! b8fc(ꊎ{x|M׎xtzSd}\7ż{/\SW64KHq/4g LO# ~Y"<̿.̌IOjCbSZ%`:6gE6&ÐǷ ëB*\*Qn&_x|XPdwkN^*LQV>UO҂*L񂟛hO9շvDxWkiRw.?C}8KkcR戂]c>"[u@l4E"Ο +9v\o!7l/t rɟ?t]7J%6 +NuPYQjnA"&<=5keV<usU1WA3yי`}qPO5F?yRf1]-ŊjEwB>:w +q}rRn9_Gk}[TY9(,+GFMܓN%*]=;}> +0 U8%X8HWd ^jՒp 8LwQ4?{"]pb5e5A7!@-T/'#ơ:Ésպm-ϑU^%u(Pjn_Aq;/CKqaue1/ Eo`ey +4 h*}X|xe[8):]]6VIU3F2s:8ȁ|6֩!Bʓ)7:$^s>JҐk0]A cF1Ӌ5nq~*BX;#>l v*k A o4Y\TV,|H$zfLJO7vÜE;au/~X,JeUBwO4w M:R9˨ffg-$ K>qS5a-"v"},&CSuCg[fqlWgߔ^I MXRXǗT6c?Z\_./rPD0\wrP>#`?4ŷ V3cZ0Ò'- +1?u^ԧx'*"åqV>:'#DgmuʳN 䧸B <;] %߱t-Daݿ yr + +EؒJ_Zs@peֱgBjٽ@6]:k앂*V3=SW WQlcy z&t>*LPYty2t3\ >XƦhs$umDIE^1!LCi'-,f7rINRmѺb{7b fǒ e"g +R>تqo<}P5G#vm9{,:x#\vlh4bӳ30Rc4Ϳ7,X=ODȉߘ3PxA~kryjNPw2a:i?ڶa"/&yt\cg2J=>U^8WJS?`f~wZy"r^ s _p.vJL]c+pZ#2i욎#n0\Gq]|[e]Hyw ߅@}%`ɺ9^n?ɶE.4{xʘwJ!5g-%"eQ&`3q`wf~DSU߷O3{En-V0P\mOPyELJл7(teH6w3#`.3X$PT#P)Zp0$Wla^!! .>qoY_.gdn@%Εq{g$H2BwV-j,83 9,b\*|l)eՊOb`~̿kU˹D8'>J`zb{}?bh Ly1<ļ 6j s;DUr_hmi$x*dM7FKGh$u'l{kjx[(Mj' uAɺ |0{/HxIex ][FgV1a@tU1Z=Yk)X83Wy 'ty BGFc+ѮG7Е>œK_Gv#_ +)<fcurc?H<;V3D'zZ63N@"75l#bLdw1̗@9ÎVΧwWȎqm (o;p")8ރOe8V4WW(Eia^0k_/uuZl>c.ɜ(öV[uv\GղĀܡL:Ik#L:al{ȹoi V6Y$c>uPSp!.Do +eW@Ad|)Nh zH$؛Ka4S62璅V:clft;:tei Ntοe@ihÇ@5 f + QW6=I -lsC=ӄMвOߣp&T"*"d^dZbG.k: 1C7̚ Tq6cYP)NkF[T ,3H(B0 آ*2{b6}: 7t+EFZ`FK{y]K j=f[ +Wi/>K~[w X&MQT$U#Q>Pc^t:: 9p]h#NK!_N`*u1@HfZ-pJr/7oa?r m#iK Sȿr`=>R3兵S#O:][kȗ[Oo<*'*Idڛnj^K=]ìt *#Fry .A"<7`mzH}W60B^vrc2B(LVxx zn-gt$XȘk2K{eZ{Tc垦rɩ[9xq ΂x dWMt?RLtK +-L.{+edPB$beL${X}r(.w~pwיd\[n][Bu&lraOiJ긛†rPԚ%C霆DFպ.ubTJ@U(,$%: +~c +xb/CH;!&SS`ɱEJMb.L%0cT \KశvlAbiha+őJAXqBqB%UCu HLQn`Т'd s:޳ެ20v|bfu,ly$4NP<-l42L=ӈ#Zru,1]kd8UkHDvgQ`]9 +z;g/. n~+wfv\^cO( Ma[Őz% +ޤ1KE!fԖ _8NN8L8a<>/26JҶ%P3lf&u*q]x SWRI%2 ݡ)w6 FL DjɩY<Ӆ1y8$ cM5aPr:~~ИZ+qxKjrl}^0V@#gbGfKE> +-s#t沀%4ֽS{So*@`%D!=bz--aƤl%3gov؞%B LDvᷠF)Q%*ke3\!>I([bqj6>!C!qho +H_MSrhv;`2}dN꼜4nxIʞK4 G\Oq 9FE>sc~:H-I73%Nn!I1䆌{le_8աV ~(y!=xնf-H؉j 6&cTOt]'1'IG{|N(.#4 h`)u4-(j(R1,rlQK[utבW +w~K+t3Px`6bᶖ\`{!6EI!3+h#U-F]ẅ/v^SC덍-bkջ$0iԺ\Q'zsden`Կ^e%T2v=즮& TJ0az\?4Mc +eeO˜yUœSIjXaj.=ʅ ޢhy1+=<5eQXe6c{RG!rg)\¼e|1ڿf6N;@7Qg8C9/]w֨M)OfiW&dمu3ysfjX;x=-ܠƂuFK`V>ָYTj,p>DeyL]ew%+Ē'U`mf>:#n$m? * ? Mytk Y+ +Ze;0u . +-geL"[VvEfKȽJ^ T,Lͬvv2RswB_*1x9|p¢#Vf~( +&8f <[\iJYPZOK |JSK8sO. l?QLz?54iQ*{ w4^ODZy; D3 +PQ1V$y0< +o,\43n?l|=0jyʞi1mϧ#Hkw K)n4y f-|=y VM8/iLܗ국$D8e~2~Qq{B1Akm>͞iǑMeW*Wgcʞ!f4xK*WOV9 ^u0.7Fp1ae > +DcŞ$D_xg7 23Hߞ@IYtqX(7=ңQ 7?FapHc=}Y&@$'}RT6qÛd;| ݘ"b1;&G?\&p}ɭjWW*{!BzH6ZdlZQB-Z\Ju]F`  A*e-[wN4NľWm[Qmndt>.ɘ%TxԼ9Ҿ2йAբ!q]mהÏj L+u?eW_n(6* z>'UYZ,8Y9=0s$E֚ԕs;b6!fwܪgR)F˖p 7ij1NSibEGrtFQ LM*'[$lrҕṇ&+ +.́OA)в΁M\݈t 4 -/rFն%y\MYrtq:ug,9sjY*v,.H!ClN+@IOXa xQY9uo n[[L.ZcHk bk\ ՓM$ialDw eSuK4;h9>R!/NbOFxNt\oK?ª^im9߭dL+TB+̽EKhdi8OQu]&0?݌w )q/{OR +Z_L#,4+9ԯuN p}67ٍ +,C%zjǀF;~(/EZٕ2Xn r}d(g=qYM(ZztѦ^{4>a-Ilj~V~_*t6 )<= &VGε!/KS3|jPQZT^2M) uwKOipTPQ"Z>@9=䝛s%,x`O^ڎ+r#C6{yڀ^;Mo@{GgsS*h.&Rj=reˑ#r!n;f TkW1V/&)V ($̆tNR_cߏb8T=Ͱk^+;S1+L+ĝciIf>4=XFH4fp2a 8(+دy}S 8&]Fke 2v@]iv*p4:?twKz}\dtT`*~_T".H +YLCr7Av;:Š݇T՛OZ11В!^,jK728tl68}s^GPvI5fFnȪ?4ϒExqTWvUS0sLo'T%Bcj\/ZNE LcCؤb,ĽUYx L; +N|]&fja4[?40oaSgbJڛ?8d=Dn;:kuT{x -j6W"Թ.G٤FSt w]o|9fkE چ{qY%w$X8?ٸ2PuF~WxTwD./,+yR{G6$1sTKky]6$\Km>ZYƳ~W7g+e(6pSV\)swkO#U)|{Ȭ2OzKo"ʢ*mM}4H竽)j>݄WҾ50~0knxw]$Ohw[:Mز q<&Z ~= ~fc{dzu a`SB#{#E %{ҡb>#ɀbmPzxːÃyY"я>C 5Fxʛr~2`(጑zPi-=ltn٦_8ګY8px°@pU`F.T(۬˓Nʁ}H3+Wz@A# +h I.Z1T!l2a#0փ3K8^'87CM?2,~Ef$ }[ ZTTzM-(s,cq 954rȣڟwP1twkH5C: Nm@Hj0m2V;2&|Ios=y-IKq +[1 +l_'MF馒,.f<\C]) 56H@Y3]KuZGР`?M{jo|h:GjDBmD0Q`FSWD_Mb$Bؙ9W0ɫDjop_A\ǀս+>CnKΨ̩Bq<$ p[BB=QVy(dر7ڌ]K] r.*RQ-5Vɿ#jB ⨣D3"uMVLmW>s/hr4f:+j-`0t6Q(@l.Q.v-d.YUkj J8Uo~ +hRm(\_lU[R(WGbXD_0r`zXyzu671}U}M]{lކ:k:bkL5Q["6ӢPa>DRGn\.d7o.8Uj:EN7~ βei\r%Hbz[΃ZWmRm/ yiW ߄ :|ӎ PҸj5cDLp!Nxgi-HƄ 0:ʻR< +jeF9=" n')q৷S؁%٠S۹d4wwNߌ:<3S8Br^h:: sW)=J1?YV 1;Iox0(hd|g8Iv. ՘^zܓlbJ4́wU-yµ-? 昻 +Qvutzl0}d.W{]@vV Sy5|ơΆ٩ͳ˧Z~p@^`\07p?Ш5_^ƕ u<叹 Rgゲ3^9Q:rM."Q7"gWm1hJ~Yo83Q&ɢJK&_^wjѷFu]nJڍhAZ5Χ{ +nIn=/p)Zr0%!N^oopzR)/"RDk*o Mg [D!,zRFKI^䦅Vx*WRz!_`*Gz mc ǚG"HS nF2hh>R >]6)ݴ*Rk0U;gAϮB!/P0Ϋ g }s%|*9>OW,`ŢlA=MT:FM;&Qo$L)<弳0Baq@L 6q48W6Y78,E|7*9~-189 u#iV0'FGs-K#j\O#'DP02JYw;s[A ݍCRWbW\ؙvR_οZuBMxI .m%ߊzL/vJ( +_ 5{jT],ٓc"Dϩ*7bd $ʝQl;yrD4M xO`}F^dg}}ŧ7MoHPwt|YyQ%.5@/Kx x1 [G=_sIQ+)33h(QW4$n頳}! } "4V퉇qdt?S1(,u#hSVd3GrrnRoumdJ|ڤv"㮪tQH}_O5~o@#1LrNWhq:w|Haw$+!B-_l߸ ͚g,YX{' + S}i_kDSTL-'δzA.~ЯN8}\%K sZEDxMFƨuFL͠UZw%J^킭5JE'A'MOZ "[aL Fd-v$* %7ry ιo!m|OiޜZPĴgjqv!1/YlL_qNF %ЉwzqTƃ7qGGAkAX<3Yۏ;4O >VoQ_~$ljiي$Sux!+_P@b d^T=8?nWwǭl&*f &ӧΌT g.[Ү)$,ՏoL/=>W ȘQl.rNHa`@{`L+΁z]"CG@Ǯ8#BH/eޑ>慨: Y_be)QK1p}~fV)5%V2pҖ~_{U8\:T,y"jpGzb/m2z}3 SǓŨ#6:@J9r٢ 5@I&1ǎiy)Hꖦm_IC[tوߜy翺dU/tplؤ!P?VNi5[讳K۝sF{E1"_X$0i`\kTpi|`N&!\+%f,T+;-/G?ծ9B]ï%KNF=3n8D}?q~Syy2?Ɯz2nH:׶'淯5zjԮ̈^'U Ŷ>6zׄډZyѰ [t0't)MPj.GK{/@I8pqhIaK;k*U8]D2;px7YBԗ7!1K¹F*# Wh䐀7\']!:u Z|PC@Rj>d!L gH  Ĭ7Zd!`[{g#:80|F_r;A; tE2?(2_O*>׀ N)`4Hg0s䂐:մfi陷<C &z$Z)2($kkTe6 B^^A+gFw@Hiow-$nj[hDYA f@0ZY'us𽘿827% R4, De1tC`B̈M\G_GD?3?W > endobj 3072 0 obj <> endobj 3073 0 obj <> endobj 3074 0 obj <> endobj 4888 0 obj <>stream +Hd͊zy8 +>sRhF^#y QG#Oç==o/ϧ;c_mӷKv|~_oo~y>}~W=|z>{O݇q~?>Ï?o+~ߒ~;%zΏx߽w;>lp?(O?{wٸ^ PZUuTGu^5P5FjFDMԤU PjVjUmFmک]uPuNNE]E5|| _#_k55|| _#_k55|| _#_k55|| _#_k5Z||-_+_kZ||-_+_kZ||-_+_kZ||-_+_ku:||_'_uu:||_'_uu:||_'_uu:||_'_uz||=_/_z||=_/_z||=_/_z||=_/_ || ߀o77 || ߀o77 || ߀o77 || ߀o77 KG#(~? +?G#(~? +?G#(~? +?G#(~? +?z $߄o77MM&|| $߄o77MM&|| $߄o77MM&|| $߄o77MM&||3,ߌo77f||3,ߌo77f||3,ߌo77f||3,ߌo77f|| "߂oȷ[--|| "߂oȷ[--|| "߂oȷ[--|| "߂oȷ[--||+*ߊoŷʷ[V||+*ߊoŷʷ[V||+*ߊoŷʷ[V||+*ߊoŷʷ[V|| &߆o÷ɷmm6|| &߆o÷ɷmm6|| &߆o÷ɷmm6|| &߆o÷ɷmm6|ۯ\t;]~~߅ww;]~~߅ww;]~~߅ww;]~~߅w߁w;;|C߁w;;|C߁w;;|C߁w;;|C߉w;;NN|'S߉w;;NN|'S߉w;;NN|'S߉w;;NN|'S ߅w]..|K ߅w]..|K ߅w]..|K ߅w]..|?|x>stream +HWo6߿B!fq( +I%i8Z٫䬴忿H(c +M 3fcxI,q#.u6_7W8oE|-! =ng/͛-b{3ŋmUb{*D…?P$)cb{ܼz/TRįDz$j?x|j(~ۮ~woEVtHH@h=ǷB,f$FAF~PDy|xTfi8\# +Xmw'C^biOe_KAX&(swnO1tqB;#Uյ}l )a$v`IiEopw9dO;`0{ zN[z̘kyACWտ>O@t660~_>$sy B7ax| y8p,MvϾbPg~Eaz#͖TER*lS2(w-e~9N4q87"*-Zs-JAg39!ǙñCŁ{F̹7+аckc -_$2[(Hp "| lcST-+`~<4Sbiqx#C osԱA>wM2-[Z\TݻonP!xroˡ;FqXl +k(53c4#! T麭s;aJkg| v:@ߺ:πi#p)1/&<86"d$(~pshC?kxh2+%64p֝eGbs2".qԯgJ_'%$8c'9&|>t^)?g9=Z]sjK$TE6`df؟~ qd+,t֎ᙕI!#h(xNRLBDcNRU"T{r]qVO"zf .9վl;#&=n_GZåsWP3 ss̜ȇ.#oP3A@PI7,(dƈt`.xjiN`NRɃ=4>ʀ +577@=WhifhCw`.GF7486#Jq*#~w*Q7FVB@FbVW a| |McbgMFSɰFwQ™o0 3Pi`m6f:DbS&Kmdo :vׁ ^92k#S]VA$EX&GC%;13 BRuPӽ_=6~AӴM?;ci 4\_py`.F>YM>lU 6/_sJ-üN8+7PPr:fJij. םvD($^U~yqwxݞ*TTmnr1X#I+A%tGTʘXzmU_G5EČD, AXk}A;igwlzBi9+Ⱶĺ`8TÜUC$BE-]$ a/.6hZ-s|-AKCZgqקqVͦr:BMxɾJqudӢ-uZe`[[R~bօj0d(rv #'㋕ߨ0 dE +Wxw3Qhbt{|N/scJz_HrJ!TNQogb?ϼo)bgQҶ)=0.Le?> +ԩ9T(A +o̷JhnHz[:!sRpX%$ +́1@-o;Jq]nst>6g=B0{=9Rްsx] 5xYKoEbe#N !EwlSo=b^j>t uz/GEG>stream +0 D@&w_ D>#n*T0%$z0Zt0h5_\j䫟jٛ@JÒ,֯ס$oP6 +SL#y:Cpכ +ZS@pRgdp^[Nd {zIN)Z +Ockp*(Y8MU6Cr-n"ڝ2!j89V `"_n+R`;ȒQ,zQIo7G5ť!Va;fprYvFI_c q/_.^[9q8s;FPوcz0(+4qk?ctv'P$Ô2kps8!P:.{gZ_nu].F*X5\`ܹ.CKΙ. +,"0fY+M㝘uEMz/DʎS;fd`T(9v56 >:yg79\nEoZ9 :*b" T* W6:%!Rb12%'#FL4b%E;,U&wFg ʏfnz2&3?H~2[U"$O +J`sHxJLWVM޼/-IċۉŚpQ,2C ژTɄ-J/8| (<ԏ~=fEa{T1E(X|k0F4q2B.N>gKrWҔsx헭2|%|6b#x{O5xouI?y0dF% ڕw%0= 0@- 𗥢/9SYMA&)2ts]~ + b<Ǯ]2#y'`/u5_[Yİ_mk=>&>r +f+n  W- שwc"g17JP+1̜\)fYFaccc6gZ$pqX2Aj'n܅im ^J ׊BضagV_'T7E)ψam ,¿ >pk)UZbąp>syYQA>Em&!. QG`%U6 (s7]X s1՝F]^lTׇdi,,έY~zs~Cn8_SF_䈲t#{Z=)7G4^g<#s'kpB2{\苂3J5ֳ[-8]*CC 7cMD1?L*]r凞&?>uDQHUZy[w?ٮykb<*ga5 PaѮ\׷^3x"hC MiW@x<ڱ ]VΧKG)3dGitZF0`/V(5ף `>/158s&C+L Vrllk*Ĩ/,kŕ)XPMYHCm1Q#)BF &vc3Ӭ|ێ= +d_\cqۀ](.ҟ$h +&,p(\H +rU RAp{7ϻ, #uUIXm(q8cWT0>T[/!J3v7?6O-+BێiOcmb9UKL&sΠgrA`pi\3D2T +oձڹVjE+4pr~8n'q/{ɧʃ%<ѱRŎN@!Z?Цp +O2WNJ7%9Uj5g٦XH8Bx_S| +=2qAq j`Id=uս34C粞h_c#$nP^q,p\n1: +7׊[\%^>~+6U6Z^1 \SpäQi >P}S'w5 +uhұ"m)< r!&TQ. po0DUq%AeZꛏKo!t7IPw$F~ŴDCA'-IqqAH|Odi㔕< +n&CG㨦7_J9VLF2b4_ +$=Կp6%dw4JD&fE򭒈-2{|<(U?՚!tpBr/Dݢ'7KFYIfG؎K67ZB;\0sc k+mvppB--(AčICAbW|EB * _g["ȤNLm/pSrnH/2o98i%X>eh~41k|$ErJ&Pc ZӉeĄ4)Q_z_X9l +KJA{zͰ[]j#Zb +%E,`Z3P$ ,63>I]qXe8CX޿^t} 8f֟ X<6tc/ޅB]3^eB7F5+˰sRQ 2uN\JѬ~-@a>0BG^D~1Mts Ie=,3}oഋjEZ1FAE?r NSEj0s=$dm~/v=+?W$*^P#Ro\[i/.kVb8wu-ëq3/0bnul{ +z.4%"Y4n8'kUBaja}ɹ5$?uL +5Ą@nN9(BZNLFA0VڰG +z[7165+5:]0hAB@:=l6\!ف5> 'W%y]' GD{$X'6- 0 +Qy~TF镬Zo*Ŋg`̛6 bv| +ulE%tIЂb|%wOyLg<4OICL"_XSr<}T8 +s/h|pl ?-eK-HҩR-lfk?#<M8P8 t3sX 86\2G<&A/)Uǥ1_&\)|t7eI 3ND@qD$m`l}1dYD1U "!RګWuE"ė--~ H$&ްe~Pˀ`xt0|#by5Y.sUk(|s$q?ZofǰHQ? +V&C5EJBb-Byh lm:_c衉+}U@O<^.#@O$+csV:ݯ`55]Ξ 6*[.BT]a \imt/N[h06{ >W Y;2Y^l>Gd[lk1kP~(lœh14} ܟȟof_ތe=PHqs5ӇҎ+6Z.2'ӊpMxou4pNr]ޱ*CI֤l]rQJ!GP0_4gQ{Ipbk,W}DX(j/V1NWo?a[W{t(4k0,Xa[Yjה#jp`z=dbB%D +LHa"7 +W7G\ҹ6 59܊Vז?3o5cS+~GAX 9Px3ZH тoW+oB9a,8U#ԃ0K;ߒY f, Q#/'xhi$ϣ[{j:G;w{}R\sLslV368݈WAg9$e[Y)̠WQujcxE]]sg6eh @WAƅ2H WL=׻5eۦ@Ho\rK.#i8zm$~b3Iсb&e72|79&En7Ejm5d$gVJGJ,SՐfX?X-0v{"@3<"cަ Fd,bHNc#87fٕaqRQRѿJd<3 :KoQb{4QZE<jHg* +'W=|=4TWk܋ +?*Yi('ݾ + ՋdM5 fW$CJi)Gx {M77+uׅ(a['rb nUک=QL+^xd "*vkg?5ihTټv +aEWmʦo S]oiV +J*odlBqpÃTt [KH w|6ŁB_ӄq#bUZil:1$kn+~M4Ҁ %TV!ĖrVik(:+LLP8$fIU.Ɠ~!L] Uv%a ش@;+eW$Q/8M7weؼJxn:&4)$PVx[i/ +1|F,W-B"ܙH-TrL 񕥎@&3\t\J0UcB:֑ >$*Zs!X|BXjIوߧ]mx!=:NBp͛\}"c,7e9gmAggA,Zy5û6u9 _W=;U=sNqY3KlE"@@hLDLlP;eutPBM}cاWڎ-{^6#xQY$6X}):SGX&DanS8:5닍Əe^<+!fPr.˝n&&oz8 e׈hTXhTU­x +ЅV'#Lb3p>oCdC +l\љPe5<@9,YkrU.PU2GPUC7_7.'- cU0+ +U2Aq*`ddx\Qasp*3O;Y@ BC;<;we9krrȈaYg |bI ҥ 8uu!8ڗ#p"@7,9fA ]+K)𑵱I#v :ۣxh84=qr/46R tP#E+~JY+V / OEdyj]$n_*P0X;xwݲLu,1pT闑N;M.$O '1.tg1Dx<.9U4s0Kt?7Z¬rد q<pIɨAԒԉh;l~DU\goy|JvgOھǒ̢71 gRmJƏE&"sB`Cql0l .#txi6Ll'kEr1iem՛q.ׯxґ +d4ByK֛E`x<A4G`ݦ,.bN uS _b#.ɔH.=ŀT]v53țGb:mza PK|fy쯼>NmI/ hqobE f,~/E`&7ɶro8VƁ%ʱ@J+k(4sPG56ۓMߦؖ7i[^6sst+iVx!"El~+s:|Up徸FHޟE>tl\ +u 4n%YEHW%dxlj(&G蜏 e_9u![S]%n3\U.x[,}q9$cn] +G d*Q!E9t}1̏,s/Զ 6P}9ˆT3ϪxNȹ5$@Se R.,FI1.93rƷx KyGNe{Slp5W}H%nn]e)*j?xs`poqχ3C` +aDQ-Ba.S)::j[hVOt=9T +İ,+ZRKFٟtOc&WO)4<8]:{-p}zHs.2G"h?Nzs"n޺S1G6hY̧Hj$NA!bb +*(Z*ṬT|;)a8 +(̽` fmzy.ezۉDp{2cjۊsY(&$NtlY>O )* r@m) E wP1;co-ўW}L%!ЊZ0TpޯZ9`q#8s%\̦G8Mhb %,nь_nϮ\8o~*S'cNI[1jIrZ!FT仺 ,]YDO1mϰ`{Do4ev#.uТv>66_ᵚn +7q`#̢֘%_9{RFUn˪4 1O]t +hޗok9ԢQۃ YV}ل"#,V>qZj 󎨏pkɜMo{( "NJbq.9׭ԴԽ ɋɻeG*PO |sip#(%)$;ɤЭ}˧}LvsiJǺ "[w'u"= m!m E(}ox&(L2e<G;EΌ6rtH`VGL;)IM5 ̛i79I(ՆiVς@&c"WPR4aYLf$DbD4,f[H3;pG({pk?⸒rԔU41|{.i\L ?|2bŻՋ~YT_:=OMځ;r^`KAg2N^,^Il-_q}Zb oi&0%mc&0y*4lC Oҽ"4[.a7?%P1*HRjEUj5J]1& +r H +ϴ|#ՉAP}<̏ܪ-aԈ_];~^p#9- )9~Y 9|Eo̒ZjRLY[u7IH\HiFzPtޟGC"T(H K{VK z$+n(f3^% !U ~T#8TbEAP} тf&'/Kz5ki{@&ECG4jVXno#t1J`G'9^UΤ GmX'N7RpYV'k,fN[Х`.lF5ឯ.V +@BÜK +[YL +Mv^2Yr̐~6 +"s`ƌ馝3|..N ~3mR.&&1 kFse8-TK,$şsmgx9T}bB2 ;7R b)r:ϱ~$yp$Jȫ,n;17>'* %2CʔOï055:WMrW:~X1"Bn=F0D`3U5mIV;8D*G[9 +lyóˠ4%gU.L (Dɂ#JY2J!}W*XX]|nv[phl::! mY8% {oAgV\'@]eK:-fjaQ({=ilgˢUupNF%"'nO=쪙y:~.uuԽp\- TV0'`tB<,~+SMhn-FR$l[*WhUчApLPAgrUqd o$9wh7YFع &-NߧYiC!,2xIH*bAI# `S 2e=Պg潋'x)9;XUۓ'7'4R#tsuT)oW62>%|6s8T.[ɿ56Et{֞@~HCrZ\Ú[Dl'݅OВ@#VL9zV6 +槈_r"D?tpiOlfJBݜ_B[s2۪cwW&qZ@ Smfh:`[8?U:,Uzlr֦*/_.zOxsD~WO)%m~=2 +(Ufߕ[-yyahv)Qek0Mʟ`sDG+ ꦀ䫵RO oWLlًA\CB,@j dRI{e~;Yvw"|t]RsVŚ흭Xc=ywo컱4/*8A_%8b!3 Us!NJp|Y bTۥVi3!7*(j۞kWqzZםd9Zp]fQ_닃:YK5I +srʒ]CS1)NlM$uJg"d9ip@ ꊗIZvqܺ<J`0K>v+skޖA|FU܍p9*_Rdؠ8!%״בRN3Z{{>JdPWچ^B,@q<.Rnֽ/"dEk߷G7-Zxʷ  I(lm3OJUMOUv_sj., dtp ?&`!fV- d7@4vY i2raGPUups:ogj:O8JwA|>  $\?%)14@OLvH[@(nYM QXJ+0Nz+5H9!?T8XD͐O~;XǕ~eYB@ +eO.=`_ 43%n I\;/^'Z`[!,#IȜMS +0y,'5x?thkIـ?_D3%㚏o,&LuB0qW6ڈ1raW*%mHCEjV&b#QBq.D|)cj? ɯ=I8t[xuc'$^ NjN+EZZs^CYcIayp]Gjݰ*/Yl~zJ'HS$ I霅-ͬ#L T4ick{sϞ" |ut`¼jPcbs.bVƭFaӍkl":vF>-Zk?SGk"u}D1P+z]Pw5e G} T4xp=LM8hۂ CEPgP*A(ln6ϽS%ߪ +;|s|7&k=ЖI;=i >YA}7њ/'*P%2#f+<9ީp舺Akg۝CqbumrOm +͟5[}Gv@ߔZdtj> QX|n&A;&G&:ygy<D?BZP!$LB"+_f[/lf:VLV. 骾,P0b.2Sv6#ӻ'0A)Dփ]#A|={kfs=X̾V|\JxN'f9ͱ",C,}TҎ`f9ۘ%1g><Ũ`Zy#Ҧ7TVyd^S,iNbH"Dh \/ ;܉,sZP2"iEMEP8$h%Q"yҎE<ӍK=CoZ5ew$'*)79 +݉B0Q@5BJooL=YeREeQGqfIšͰˇ 5 "')kGMt)7)X2_tfFK*#mzUusˍ=5A3)c XV_A*l8Vu~u<@vlt+ ævLwɞwĊT-",+~\>$|*aNYW9bԠyJt :|7m]ηE93@qcoJJxf8 v%{IsP2ö3{Ĺv +;Q4sWA`hV~xv% +19ൽѱvI-1s_^ MW? J_l mƄy[!ҕ:)uN +9aY]וCYtpRDrNB6 |#)nl&nO{875+>t F9TөR2sƽ-, o#~liTG~M DQeR=6RL[/o^*e,9iEnGƢ6rMע^xCyJrښ4\)62THQW mmǫJפQl\WUJ, !,{*lC m~ ǿOqk MvTLN0_K Ex!i qREBSBaԘui](QE&4&60&n&^jP] G&6twDxk?o=왛ljU4kOCIsĥpo#aH&)" +̂,>kY]$]\CdFG>}8*f%5μ(!u<Y` $U>jF] E'q&G; 1\H^ٝv^j|tvXr -+^9c[۪Nea 0cԼ*sKm}!ds6hzF*WJ\rcTv 恱qmv;(p"C6L|A-YЋU $MK! B!H01;NH_FfoMQS;~pGK7ӱ%+;-H4ۉKs)N6F4&Ct\Sh>trfe>.|7bg'QesJһ(Kt>MmX&qk- a{^cWUiOJ10ŵ冾b} {Ae ł:=t X\{s]5!EubD\>]L^ 2O  `OoUCpKuqOOf ʑƩ- +~jIRdԲ[9 ɸ)J $,yF[?Tk@Uῳ;>PM.¢N㶃i93'?N|%1^Xz!xm?Dx(P^ ȰD8Ym՟v z1xL!2,ՋDQEE.\%>q^]o%+(G@xi_Sg6\ KOh ϗc"*pTsN"iݶO4 KC;̝}L{6XφjoΏ$T.s*1Cg! ~ܸT+^ zrД^i%X +-LЖV&0Tٵs!c=` ,B;ٖ4@mE,& r Č|F*~}Js Tᰍ#d\=\QܭV[Qqr~v]B4P]|Ɛk 2/OF5[˚"9VGce(D*%yac]<-m.2L4:+%[dyLY6}%1ղ=_P2:}+ \|jBcyBȑQZ/y Pb88"Y܁ʐ +kx09ւD9D켯.?R`rC⪢ +hӝi'e=M͈8$ ͣ%^q\vc H_`MucWeKH}q9KvҴ8Y8ǟsIO(De%e`͜./Ksl'%ĵL`DӫZ1[Xr>YI/ + + >E\3aͦB@+QGM+4#B$ЄKqfPAWK$7*m[0=EYAgTB߇{&1Ywɡ\yM`6Fo`W1Ќlne PymQ+c }AgoQ:F]-"(8<%FO;J}' NY拺R6@m as1wa5F$ JI URxY$+Dj;3p͍XSخv |`XyX/e;M\>:"S? +蹧mU~WQGϢuC 4ᫀiᥳRJݐeG=S Mc[fT%J*ס:@`DxGقZ5n#.ipq)rGٟYz= ɲwX]Nv MS?]'1]X:@o{U.5ǴxB`z<97kKnd:)q}T+S[qi{i=:j}ĦT׼Z@½E,䉬+Qm +tS]22!-B54xgُT$'TRۏR6@€2;2eiFp)^6"S3ߑaaߐzw_%ݗ Qd2B 0GgMBscx#PZI݅jw6ƪ g ;n,&; S Mx:k #6]18s`̵0Dd\C>JnNn7эLM7n5H:mOmaB|ɑyF~&kJw> =W>?3Gl6JׯibgIiPPJ~W<Tt)I4d婅v$(J\GsA7 #3zwQHESlWxsgUB@LC,^9ᶦK%wqό2mzW/u{$ac:mdi1h Q難_,GQ[Sx~d4aWGͥG*h%AYP~\s'>Rc!v~ +v `7#,! N(vsd~J*+?y}E7 +hdb6Ѐ08|At$(W0^0p 7ʔ*ۇQؿCG?XMLKb=񻊀ɹC?`7x de+)\R[_%; +׏>;{w~LF\νۗ7}w<OU [[ B^| +IrƯ2+]VVåj8nQOO;֔U*JYNj2=?PjtVxy(˞5`sm^AJXqn)CJPѦidB|st'E"ӽjFħ ⇵t@(Iz&<.BpKwɹx/6-@L} m. 2Yp:z./J9'Sk >Ңþc"L },ɕr'Fތ n~`fՇDvy)~\#i ..>!,o?(Y2nfU6$kϴ qT=fNoDVlƖ;*LCfg[J8޸kYkY:i ?0%I2)xk̪8wy} wK,j:xe"SG$Ҵ0]y\B@_Wp1ps]<@:H0KhUgTaOi-rm$P{Y<, (G^vgH\ⳃhBG뷐*kk{?"ٹ¨vtI}GKLUq*S&:)YV`ZƱbNz +S1_R<zqPdP) Iat)H"Z^p.܄^nixƘ) qh+PX : 9˥8=2).ȹKMml//Y3r권Fp :[Pn۴:Vv7I #S-װ/,=5b=q ir{H4/I0Jjɯ X}cKXWnF眫jOɵStJ$k>pwa"~( Q YlF @jT.!˅<6]wg-l\MqkeY?Ff \FV NU'c#WӲSÓËP6.Cv/\1A4QA]g-E%s~82*1Z WxwLvzIyuzgfM Lnk'@h5 e2i~[Q@Di9f0?UNqߑFR֞D_Sv=.mNX"fcadU)-l@eYowz0"xøiCc3^(}٧Ӯ-.C`BUxGZ8*OJnݑA?&i  3z, h3,Y}ͳ[\a "Y9Ф#OqA1gQʯ_V h@K+1#;*)Ӕ]Aq⪂Bֺ@r6B鄓)Sd"75>&?:rL8Z.:gp 𛟫V\ `|+ϒ|^(;b3)TH9*e\\jv& E0(vDO)Co#P +* +V:}}d$2B:Ƈ˚ۍ4D8-:SLx]OR">s$EMY< +JCJ?UnH{!4}&4 ׼0UHXl#SݜN"/nU&3f1 e.@|x,lj3@Z8m}i,FzU)%&hiE{[1ɷ><<Ϣwq-CM6#gܛ1%zk>MyLnpb;AXPOX'*4BtO=E@@oԠ#E=yV a')H^%t#p2gױm! [h;GSc>V|i[)(+hK&{{BMR59["p.p^|#nw ϭ~jLzzGdn][j>X|VUQ;0;uYYq MÍ'X[5 <ӖV炈1> P< w[uWau@ֺɱEl4c"dM`[ +Uk8f39[lgQ\wO="yD "ʲV,^´) +_KsYm:%x*~[ RЩH(z&rA`;S((>0-\c9փt:-pTW/YtK@뿣 6JaVtl[ܳrlX톷*ÐHl5_Ч׎ 5@@:kdA "F BϺ:!.Pou1n*%(cPDc6FA @>(GQ蟰FDMbܡC.0gIEV'b|@yz>PmCCEi;'\CLkPdz/Ø1\\ zV&6Hs>,9K>ҩțjSDTtZc6DlKL)*k=ߓI ctT{&rqiH;bBgvLҶ2&Q'Y~&ըmo%10:=C"3ǯ|/Z5GMC2nB H&527Im$]O/; CGWLEⲣmL|x +X?$PH*gy.M" 8b-+Y]}<;F尚 Dٲ7xz8HxE6XSQ+Єs LSZHֶϿ/ȗʼF nk1-Jʟ_p;Hjߑ|~z}0ӈ'tLERO6-׳՘ĴUee7ӾCxAQs߭FQ>_ZS%Yvߗxl8 6R.i@؆Y7]-V07huReA"ɽ[\ 3߻ycN?bZbWJ;3g#Q}CXE:\0lg=A"Mץ ­JZ 0m⟑r^wQA '/xX6OYX9רnJceXyϝzgۺu˂VnBkVE8—*/$;+պ[6yI0AY_:# +hPN%cI/1*DȽv@'pp^6\._kυ'x|VDX=c*? QT\I~-qk1 L1ˀg*Y<r,4m«@R.M|pk۶Sa!Иk/T!^o"ڷNQXP_;m,4seDhP{rKwl_u뱆Ń~ +ewuҚ)Zq). +Ti4y!K[p@GX̕3ֳvbFeMh5<+ẚv7 n@o/lƑ7Jӵ\GeW<-x;m )PUai<$ $Eq)tftxҐ5ѩ;UDm%'%L-bΡDAPZfQC1 `8qXL%m-98ҝqƂ.uv g2xV2D5xJq7ab6 +Mbjgv,ݡ0öQz:o\lN9 pH]F@U/ oVhAV4Ƣ-jIrBlm>rȑ&$⯥Y0i%?ܧaVj d'k-A;5\N>), OV!1眻X& KnW.uʝv s)q9 OI.~P1v-T"rz@o(p'fwx]@r渗6߮T%EA4{ ؂W%wlf=m׸_P>n0]ĸ;\ZG#-w^ӅΞ(',r8\zccQ)z1u/lVKlax1%-pn)1 :}1sKx'n Ci-(((8cAxP嬇ブׯI0dx7`w uqŃTfW>Sұ_]C: &rx(`OnBuhp4/ Du*vfLJp@t?iq ^BiRP;%sX;d&蓙bJ); KfΩJ2 )v*9ԯV#"_r( GAXZ}P89Aq +XREo-/$ ܎=O) -lbpCYI|D;?ZDMkb6^ka_IIiC[`W.NPޖ !pӑk/(Ml7KfeJlܟď\|)I.mȹ>]:7k;TQeB'D_M貵!w9h! :p̈<qE5͛HEp|CurUn/CFlWefr}oc3LzXKF1oF$>K tdTFyPȹGyBYQGÁ|s ɠcnWӏG2妾ٝ oZ\S[_IR!"]*^_ mH&krrW@%a'+ղLݳz[i+z 5Er[Rn"F&qJ#6sH8?Ԋe\dw[`g/1P`GCr>.:نh1S\ JSW (,3x)g0{$0#>9l/iPz>"EWs +eðnIZHūm$p"J*>j4s#U?刈 }{:Y&Re/knk;JlF`#QÅ!1ϱ+b'lMk/H5(5krwG +q:&lEbZm=#D&7 ,cuDM~6řH _c]C蛤Wb^mܬTpO E9:3ߝcy { CP`ؖ͸@F/B?z$ׯ;9%2֦/prP]W{Ƿ5_{WcoGٕhV]LIzq,}!=#j-kc PԎጉ¸CLuFBy7_WQ-و֖@!Q,M-JVKI+ Wǭ:7,;P&~[=x#&T*tntXm>ui dnAi滑`o[mQĹ^?&͚0~~;iv##ƍcm|K -wҢ~mY2++ p꨽CZ p3BMr{5@;n¾:yShLt6Ț &p~F%m6nKјzByשYF. ʖ;ٱu4s3Ola "Q ċq E(ꂰ~89X)?\)C6 %sE8/iW18ȈT72RnW/*lmܡdW%R;oM1xS?`NYV]c?,c GX[V( t1Y[םOHubDov%2}S2Gcgg|%pi5$5KH%_ endstream endobj 3065 0 obj <> endobj 3066 0 obj <> endobj 3067 0 obj <> endobj 3068 0 obj <> endobj 3059 0 obj <>stream +HW[o~cF/mQi 4iIue(Pd0`KٝoAxI!Vdk}yHO7yy'-,/u”r:J[ +]HX=|OU{(6٠e٠䢐̖k?mzM=~S} {C }0dĖZO}ϯw`"\7,)oK^Jko&cNmxi$-6dqwI!L=&%d)Ԃ gzj )ƇvUPNxc{О)EÞ/}7-R-e !pz2,_~K|EXggW VXƊDPw0>Gd*l>uCS_>2)STR'В2=j?hfVThMw•Blp*ȐҰBh[F\ F0:7H“I3ﻄH,@2ojsێ +!4 q06Gi!}eTː%x$F0~WhJ!Y8W}!✗L#9:BYGdLw96xS(]H*!꫻:k}+ l#)9#LU069WAOSD} +]ErHȟБWD=KL.pt CSb6ToީUY.H劢xqpbAʚ>Hg R1# +F}LRן<JkW L Pg=C d"G$rBMšWM""v UT{Jk⹦.5+ 4 }^X&쾨 IɤXO%l x03Cb3;9, k .A +EKrhS5x8]2a6*68ȘvoA-Aˀy + SzPziqWy\%p@Pa3n TD'Y?!F2 +8zdU_>>stream +0 Z@&5O ZgMnPHO xIM&%L |5^5Ba2?TՒ)jp_tPfX&`Z ۥaH"R  ;Ц519A"uo9 T$wt3l-A٤߃榘v7N>ց>vȆ]lIv_/0F6NLvGOYd(RWv7Au?q]/B8b i:ߑ)pʣ\sf|9{du u?'/!P^PYD L~lU@JBmO@bEf*\J_f2$g8bv:1ܡ*΢WTf?ڨ3zL7S6Dm-'&Sh}+b[OnSRcou8`ԨgZ4&5Xf)#ݲ`tuY)Zލ./V/ ._!ؠ +C6"-y:)cP4*Td@h^Dh7NN{=*73ׯCs1LS'IPQUkzC?opYG<4HyV@pJ!SH>)-V*qPRyS|^O7kY<ԖzT> o7(/|2Q܆<+Sg@!t +M>5x2*7趼ō<54+=Ț(˾OK +ޘ-l5#ušG~ءy/SvIwZ@kl:6W<{S~〸LY<gm%4XأFe$P%:(xIeen5$֫D Șq?0؅Lqo o\Vجi@ޝoƺCOYC>KN񳚧`]lY,6-XDqY#n X,^aM8ڕ@}8YoO$V2] e{˳9-RSx5Dԫ0t(kbޘ" ?ځ*$ eg 'żVaՈ=s?88H 1> +'PP boYM&&El$ s`?LK;ЉO>6 NL2|Cc65RO=fm># iP$!vL{jR>?tsۮÇwimq;4vښ~R`u`z<&Gw9Qa-d˨Ëݳc'j:{Fbr*]0-ɝ_,fyOI]O1b* L!\kL 룐O~I#aMll lrMH~qrٲeG}.@˕_[Lū~p(+^kvHa 9 +Ђk>\!WH.wTۜٓfۿS)hJFi.wWrFQ!r2g'r[NEV)H*ΏO癔ĶcԆw1φjlHj)fޥQ %\9 eW~T"rO}VaI FA&DؓAI6nBL)7=c/Ŝq \a8}r!-5/SyZCV 'yChD O7ӽV>ҊJ )0=l;gP-wDfcR40_\m_F'{{(71"~vʺA\K5ɫc13^Ow' +sĴb&LjPHLr9Y?xƼ*&lXȁ~O&eGLЫT12#x| `+Gh7ߑ ʆz0uzyb5H6-u<.pF:9PT~1|rkDv"QA{´a7^:)Vf͉QbϘ5VOd7FN@x[ݹxӑ]DָvhP-(r]dT35!6+¤5m,d xO`<:qϣþq69w +iut1}s8cwrW> 4s<١j2O+(7veM9%DcK8?y=᳾O4jSGd9TJ?:" |뻍&wbK[߽VxkΠ\YiʎΆTeja宮,=q' +'3az7zM0BoSweL|*Ґtj9@ɁTp&)̴zcw;ۉQ]>x`u 8nkkDg"{5W +fY.a*LǦ>ִl㳷7!s3S2PZ bO +W~Bg#ٶ~"8vjOol|)gy߲Y,Gw4y `sT~Op-vWY? ׵Y,"Tw818?J4!X] +Ql&_%[Y;1D@HY2J"n Ulה.fZ|Kd2Y`O#NI0_2wm?3x$~uW)66|$:zq-O7)'atpv W/hcC/xZ9:6kA*M!nWYR5^3+%Wř at9e0 +t9$kIZkY?f酝Dmߓ(û&$X{Bx:1 1i6q4#j6CƜjsMDߨ8 í%~wE_Ѓt樕U TQ-8`&ge.X3ese?yYmd.46FsK"+;Gl`%.~h˱V`8q:{\b@ZƦQ/xky֨j86~|\m3UҲ ] Ab1/R,vb#gY|Y^uɗrljo5fk^V%\+ ,N-w]Ԅfuo؍CbH\TT \h"_Xq"Dv/tAƗp9bŽMz= [`ga#6⬬{U~1d΂U'UϪ !e+Xӊ{Ám{yxۚ#uB0˱EZD/AhS}| DI3ޒVGv joK!{)OleqPLڗVq مb"xʴʀ<޾7&\d "r4\{4MK2~W)ӄL;RQD%PR< -C8NQ%Xe`3[l,\=2UP"HVwxW:´:NKy>MQZHeYr8"\k-8㝧z¤8cwiiU8VCg؋h#]= gUSyue(eA-W0mbbϢ2jt~W굪|V HqtR w[~Y#ȞjE/4[w{4H-W]#Um_O2_<C dt0cJQf5kdu8 s&䌫O hOP*ߗM`@~-,CZD'e_gߴ Vi.hHU({k +X_̵]b~+ԸWS݊r+3N oͮr8>Ɲr`3*UzHS=T3 wMJV\җ=j|atX3C|DtFSZOyqRFYuAXs_)"$=U@V/vMK +JܴT{>tZߍLMUb1~S fKy@tvXBDZzh{h' FL: +g R.AJotT#l޾7/Wx*j=kX`m PCT:oADoʦFώ d9-kSt3,c][N4pUZx>a|0i`@] +rϑQ Yi Y {O4^Z:%nQ/E~z3@e n8igܿzrLaI!Vɞ.R6^ +OHbo>AVXe953}S*('CcsV:1rpJe_:a)3|VtW[i.OGv8ܨլE;#ϗF<U5yO([6B/t},ڠ/Dis"fĤ? qT1cv2fh@yyB$03"tX~SWGG*6o#}{&/òDC:+>۠\+[m_. ^Fҿ(!d2'4kVئl6 HNUtCK"j'>D*%J%A㸨y`jqGU0Obgqg}gD-( Z, ˀMzēŵt(w^K7-%mbk A1qzRA~>&v7F7Ȱs4~ ߵE2ASq0lW}NqFgb|)YBN]0lW8L͓"J>< - ߸.c.m~w.h Mzsvsq`•IíS ,ّ,dZ0-mkw)hpJfbeÕ657oj%xA$~ŷ&C^Tn?3 L(G;=|:J|t}7D+]2 GMT>|~5S팻qž/3r[>Pk/^}elI963LQWR G.j9jJk +=8RczVEvVNyf/i1\u2lloNh-LxE:*]]p蝷Lf؜aKT nxG8L)VT LTfd@oO-??~Y22N7yâ[gx׭Uk W̢4x4-#-<1_-K>P>”<ͪm_FvZwSAhiBmHs$a>F$1kzp}tP3F?Υ?Ǡw,x[Piű24iip@kCf?0[xJ.dzfZAa'a6>!Aƻ _f=tMp^5j +jgHթHWR&~3R٧jT^c.QFI[")CAߍNIƟ[Qբj?fX+^ jK9r6PgHXDǕ{R:kGAhmsB"`-OU )=oP"n=z|6(9i?RV;ԳCٝU{brR2d|LO}&qKaTbˠv#S[A_tQPky 2H.S ` +踠#roY=!)r5Ư QKd.*O6E_oŸV,Ѓ}e&+"l}D 'ܬW/א <7QuBHKg*+@廻"Q:LYnEb)D1'4I{Am?ޏVbJX +.?Cq&4i<]삼N-@~MBP/V4aK%T_ƑVbC?mCCAu‰t|DeeTuzSbJ6p{r݅.rbRha3H.*w^ SMMc~ Ui1sJPgѶbr6n/kvĖngv,r%dOl^ͯvQB:@1\?N}q:Nq+>oV%$ PJGR$Cb-A EOYpp-T7G͸hJvhC#||ӑu\μBzDg zOϜw8<<7m:NHm܌4m0 +Q(y;C@NEes*Ⱥۑz]_*}saB.:gV ܝ^f?O#}0a3#j-˼Z3n$l6Mk(#-i +AptZl!tbbDaКZ@P`:^Ul-_ސB.g{z.)hH}J$d0*U6sp٠ SUb5ņ畣xY%DgTRsĝeG1lPtL$df{- rހAG_kD3v|}oB_Y B4LaYM09nըSIK_;zcD=U.u?OYGN r:Lc,6%aY ܎x#lfVRG"3!wim>Lbm :cs<s NJ<:yqO]+,4)_D_o/Yhhb$aB1&s,OMAxrr%bZ녍++3' țJkEćjky̗kfx+PS/)Ѕ/bp2ýjᙘ( ~ӷ3tf"vS,٫ʨR^6kh &KЖ#T.)kźڐ곸H + ұ,L,Ez՝"Mk-ewYr/*-?!~e_24nJj (iGi~>G ᠐E +ETDo)q"ƒc91*.#5 zf[-W'<*n> Gg?}ucִv +=!;՝/5"A7': xrAĭ_(Tl Y!mkg*4uoB7qfi A0=rr_ 9ZQKo ͽ `/`-x&PVC |Ѽ&V-ob[WЕ򷴅+r!^i)*'M.;@'g;)bVPN?Wn?z>_ID8œ&~kbnm.Sy3SaAb@[8—SnY.CnH޾|9ɭ̐[eCg'wiܭIyح 9XopmUK05䨻K?~\u[hM!VgOR2bs2rw ncAy|m5g븎ݟ©E@)L?3Z;3h%UfȯMŊ٣dF n͆\]ahMdKo|o'?Nۭ҆ppmօy\s F\=@K@ Nb6o\h-ȚT`,'^헻 +[0?s!K|hl4lߓi3;tGcHA2|$^-QG") CdDKfڪn"Y3ʐ\P)%sR'r̝u\TsD\EgFĚ6ҒTZӔ+rXHLkhz# I-x́]^YwA*\}ALK˷3]LJAy+mDc|: YފiidPN*@4tٙ)F.sϠˈ44I3/Iv9K,o LJٛ~Axk>Zu DlC̸c ~PU{#8m( ml,}P1*M'HnXj$JJV L /z2'~ϛD<7Z 䶑I1FG2AC1]X`}DpRaƻV& +Z & ޓXb;> nO0!,c%4gn" vi%ܾaڞ$Cie;RhyVmG'+rۗ'tjnY3czivΉtd!uOфܗÿ}$o1l? oPj9%Q9=>:cu]tO&Dz"lWSӟb(7m>r)d7[!<t(~U¶yRzUo%P#Tu`n?T8H%ZtU\$,ӋoVt:@ թ7~1J5V'D|]LA=d@ W))Ρrߔ/@M +(q@2t(mxv7 R+Vq9HUn*^0u 뤯ؔ-';`ǧ{i`iU*R{qԑ1 8Ƈs.!bR.JER#F/<>ޤ׷}mc-6=L߰m%5E`.Aʚ^X\+i%5>2Ҹ2类}gȸb_ |B8Q6t{3 |l+4_13h{,qTc )ءqUWdR@%?\Ff}\_745W&\us6~ ^29Qց[U'k_c]pc4r/| 9[H:9~pOQlGcݾgɈ_5dyAPO Zm endstream endobj 3060 0 obj <> endobj 3061 0 obj <> endobj 3062 0 obj <> endobj 3053 0 obj <>stream +HWn}W,$b0[Iɀ1\swYQTߦkGK.- %MWuuթS!)(ьŻ[zŏWtVWPj,oAf&>n/޼C+>>,ܮ%"m?y-WY`xs_˘!|rol"*?N_\yw?Bn>zX}[8?ioo r3[9'qjo~7I}9CžM̼+ 8OٴwcymDhJnasb8=+|5w_&%P +/ ⾄JqשLpLpN(˼EnSIKM6HkT\TL{Xh@)q9||(<ޠHC9맒TFr%|SbU6MReDslg:Axto :K҉+U(x>TU e6"]7(2P99% \씕TYMBw8UZ>vs1byn'@"]){b@ŸTp9ݥW儻LOi=h ̴mbE  +ƻ/P)|LQ0q,pbdaD~ 9 +Y !a74+kk5ڔ\h:|J/f,?ͣ =Gg0fՑY?>KT:Vtwe*Kí.>W%"ux{AbEyE=kސ0@K7MY`no};g= ,&QyJBf;wĊjB^׷۾^W3=l9$4L$i]{ R]0|?+m̡eɮT59철|wd+kt:8l˵3c$ay\%`"u%\Pാf/k$WO#D[Z!ed yTKKgKl3=Oc;ѐ:5v$%c#}}m'Tc/^c;3}W؀I> I īBQr+ ɟ٪999*̈́8 +B3B[竦Bkc1,#0~Wڌc +&PjoC0k0Gcon)Of==ӏRhT +NM|e +Gf=?-QzC;rl% lcK+I(f<#U3|r0~s7Z[PK .>HZIyORWxܸ0^){قgV:kge\iOFl9Si"%W0C!~9sʡ@r@p51Tvd.-&1  FDIȀS`آ endstream endobj 3058 0 obj <>stream +0 H@&D  H_ y{=(iwQ +R?f[9Pw.|? ,KPXEQ{>3UrF3(wvA/}!7F}S=-+\}JUu߈D'a6d<.ƻopvPF>MwEK\뾥- WT>[8e9d1y 낾r#B#jHSYXyhS:|l}8+u΀g.iWU^J+ < S􏚦Zυ<9?LMv'VrӎQS>n ]n]E_hz){vUm]Iv Cw*<_]uw4".W/鄀靎@`'1 ˤ7&n;l`t4$;FgK/gf6S +&:*q~a=N{tO5 c7 IV̘ˍ + ߢ/mh҃rg|baY'h y,a8&2<?i\lЁg++<)=YEoge;o^71Sy95͗&C-4(K2Ży,RUNVCCAF> 2bJ񌞣m@F\flRYNl lMUIly둬mvg^mNE&-IO~ ~$7iJ%kMu3R€KC0k)_Y2YL@:0‹ϳf7bj6R|`ZMlFВQ /MMvoXi˚M4f@ruNCD/*{}c}V(`uI-4^u-( 0tHW@a׃cOcnRL\J2` ɍAjX|Xx۩~ϓ63\ka]ZJl g [_Pfk1,/#Ƥ~)dFefGIIMGU"VlO{n [wϺ~%!{AsbҺ0 !dMSGuc ŷ7 G.ڕX;Ь1q&,66| |XqvTtuy1MةfBXD?Y+zD**oW`,ŗ&jg|ZWOE2g8X7x61 v5&ԢhY n&.y +cA>XSfm^c"rKZicn +;HE&*ydP)ip*YqI0r4;MQ" +Q%yQbEJʱz1QE +_7a_ÎM6+y4eyXO|M9?d?6ˬ<[ap&m5Ө'p $'.'Pr_W%IW:})y]4yղ.9f!npU^7TQ \k53}e4 Zw _A`$5CkCtE<LE2UXKB@~7xj#.jbГFdr,ru}9O{Q#];[+H8I=|"l)/H;S[tZ +$DU9';~"Ln%R&@x!60LzDZRQv݈o B,pq*Q}ej֋^wu< pA9`z;(V dRU t3: _ErTVG?U7Ve08FX<@nWF +xۏ-Bw xcT6p>2\cieҰ|(:=܉?HgU'؝ɿCƒj~6-;tv??.wa'W=>i"UP6:ȹk0c4HԌUo/q׽52Qse$5,.-/< +[!44 [M6 v≅T(*B{0V-._6uw,Sc.wי{VJB/CScC&4 G`QcbeȆXw5uc(Xb$r?Z쾇g~sMZq/lF%&jl)"lcXQ|>QQqL?4{@.@L"$i;o+xgQvMʐP/}YqUڠa39OINvK̃LN#ɀⵋUzvL?/v'&#lӲ %qwRʞ|rnq| ΂Xu["lt#/9V-~ +T&ܢg#4f_4(ISBfnL0Ent˂L{E0IYR'9m^V+ҴGsTwn gJF >dTCo)= 156-Vl!P/6g+\6×R,dzwSYR_Q^r)m%w?ta&OX/1\J;Wnhxx>'}WCu %>`I0ܤȠܸADkÅa|]E÷̓CLOYd39dH<,j4\5$"pݕzǤ9QAŷ|X~PHiQcU8~En,vd ZRv(-H C봂9y5Ch|SqD.&яX|%oM6JiL۸Rqܯw(1IvUhYeU9E<,h&1zB$y#7~aID!Fm>8'roWvvC=\trO%4-;_a2z3ueraS/;p|7UzHhCblأ󎇃iiu";"}7qiNE㛆$&9o +d~+)_8Lc¯8糧38J.ոo 7S҃ FGՇuUIN+5@r R͸B+l d%(CO +Ֆ#jFҌ@o$GQ"S֪+KX=%QOc;nQE]Thi/_yռ_6@:&K62,2dDk.4"ut{4(5ѱƗKC9ΟîX>+(RIs_uIlG^T1ˇ_!6~}<Ӓ\">q8k,%(!*v+3{ԴdUDM^5d|L1F@*P4yg@f8U[tl\$4`-q—˝f7}Xʦ4Hczfa` ʻQ\sz{n'N8Dk%dI5_$oj}DH4q,[CC/O?C#L>%/>m A!y9POZڪ +%߾EWs;|ЂU Il5\F-p\`MsL : {s;b܈+_<`i*io @2|J3sGIΞI_L 2>oēLOG’F|֦ң O&/AD-]p'T t:C R4 QģS +]j]EALUZkZZY8Z/&Q xCe`!.]vuE%/TJ]bZ2>2|ΐhg\֍ _"r,̱fU3LR:GYӑ;!|-..}sES?0OќUl#DžtҸ6MD " E=p'Z6@yH)wk`5ZE1 4_tmoVua|B[F%~%L`4#טޮPvC&i?Rc|6&0QdqõߍuH^OkDb{DPIMH5, +aZm:]s8ߩg&x迴,-Zb.~~mF)=ܽW$y[ D`&?8pĕjJ'GRHV^#$ ٣A.ڶS+m@G 2hp,y/e}Vn) x!inhȦtT5YY}؉B6lOAC~=p߭3s?FAuav0lsdC֧vLo'2&#.]$] ;AHk}`\| +S> `IZ&p2f?ǸZݦ8&2hbJJ/֠S>ru+Wf[;;t@Ag۱! 5PI%E7nvtk&ˏMu̒oO|e̮ḧE-e(K/+zC8tHg"a/c]X?龜+NKڋ&M݄A'7b=2&Je_pFDi5yvö)rOZ& ˓y1z9j]Ղ9_CAa򶖔EʫsAB\9艊4˴=oo9˸Y39o}!{;P5w,MGS~b+=Lj,w?$*tXpVDgT ,+Yzn; и&iEUT>Vq8tt =mGIWk8l8@o%#ck +nŅg<0i^*N +[?r4O,UwrT}E/VI4^#4qH0 7s<`ZH\8cpu- +h^@{!є2M;ZJmH9;Y,y6TƉ){`JpG^͡C4@-Bl,ѫߖQGDe)˪f[P(v4*f^@%~PZ{K%_-_ΖÚ~`͚kE3Xg =;\M;,V>֦K[/{yKva&)OW!ǀ^Ľ =’8b7YfHm 6޵paXIJ2kJMom?ֆQ6KI"+:_Y3o%5RFzƩ̀d} BkqjܺyLmV5Ict6ь_&j `CxY%[-9A[6$ dD2v j^CƴèXgn)LѨ?75}G(I"5&R -@mLjpChWrgIʅUUeEha7X!  *S:M& "8 Jq363H>Y$2ΡY^E[ +40OWM ʩ_2A jvLpimq|哟O淙O-n#mcҮBHP<~ 2֚߉D'UB/ +\FSV=cu9oғ_n_5|EthapIvG=Kn2 w@h{Vg7MրOi, 1̷fMEykSSc67if=\1Ś"?- 5yNnsj́h_?5]P.)qPN wY0+1'pkEd +`^r9p5]JsD|P5j*G +YT^'}P!/:bOpL(LL){@gU'wPPN0x6fK> z udXty]*܊.%< B,9I7Q=tQ]@L IN& +P}wI +iTQ4@-lgըu^SK[I<"{SE3d'6oo^ep.!2!9I3.2"5M@QPpN+3Tq<)e{mlB̏?ol5ύz=gE@TАV4ތ걮C`jP榎4 3xt|[*:|;zpU'Vt̺3LTjF*+Fo֣Vx;y}<,۔E.0-'2⋖i#Nܳb蔅[ fM&mtؔFpw_<eivn-CH!$udLДբe@>K#j3)ܵJ}8?FTOzNJYDU._cqsyBfwb({\RP 2qf@>:.=jCPAB6f!^ Hw#M~1~'DM?OTχ~z^H];Q:Pi8~vAv8=o?tx{qQ҄?M&G~ \/:iWmmᪿ2ˠZ6P䎦eX4#jC!^UYjrra-QqHJϨL߬uMYR_d+>:濓n +N݀B(vjo6l+Ͳ=6yS~JQGweiߘ 9J%< +25|B@tsWPT6z!|L5ߚߏhe"n5쭠yX Y&n6ڗthѾxџrRv-oYnXk +|M|Cb+}ȿ^ƈ8}wDԘB[6x7Ո5`E\HČx)BskWY _ J-xn~!Z"b6GGh!mG ιHK=C׿RA1̹e82aK_2Q+}_B*.$(&JnҜ`mc]벟Q`6,bt EM[Ư6,- +r;#U"US-Iͷ84DiVF~3 8P6B5b3%ہ,اh +xW"nŐ4<qY[$#5UncOpȽɰ"Y8-[[_KC8*2xLB_H2Hp3 Ja-7HX,(K(<9*A24m,ԙXy"waN'y(x(F;6ܚGIz05j +KP&(u//! +! }*8I/8 ˆ8+b~{ Qڭmd^`Wz,u|G hˡ3).'k&u, KT{&w iI1!]^-2m2ɢ{Y+[ۗlQЍκ-G>}j "(d 3;_%g\G!EѺ!&s=b|򮖪Gz^G1'ϩw.o3' CEeR{z2`nK +jT7Hsݼvһ о\_XHErU@fnf^e +T}nv+'y2oR)#0hGutsR*% {u]6 &86h" +Hkߓ%` t1rTqA Sx 6;2i-3qrS@Qs!ԫ{E{ӷ3ETj(*-7U*ۼxpJ +$)z7KٝcWeoHdIۏ-Jpb%G|.s|mnwRH +>T{(gXyq]2b?:6O|rHXJ6//%G8W| "0t ւN'hwsb~S>0S*{#xw3gf x&-#}ju:$QvO}KXoJ!I៌`*)m[L_x`9D 4l( +qk}]`b spF甁ޤ. oaj) I"Y'L +8zA$SIϤlpu; FL8oœ%a$C3Z`9Dar̚Ԗ/N?5 U\4 +X5p +=Su,]zR8q+ծ.cE>aY %T0H''܃Œpsi뚗u d3< +6K7n;k~%L< !1 F[WJI v}.1D}*ɷyfǣ4TI8bTDuT>==zzT J8t8!βL"drńd2o\q:G]I{/Cd +VV*HUgFHo]m,U98Gz$p@zYKQA2O}3.Q#DNܳ2%JvL 17-O8bF' +Ǝ~)ۅn˘{{).LNP.@ + DZP ' &xlםHlI"jwC|o~Җ6dBx ]x猊m Gi|M,^N}3sM?J~LXHT~HEc;n}{nysbE@5%olX=c<|( a~fXZ*|{x®?I-JJ.iDhZ?4N]KdzbXH~U(ɢ8QZg3WpczB*""#<4nfQY R( +D4D-0NSٲb 1]Z6e) ]xxW +Ou[9ۃ;]-13(0 T`yv~[sH{*_N©]62~,Cc2t8{){/SjM㖌u i{xEx0?ʽy*1 +[:GvT@d*fGwA8C\se>"O,m-dXHo]rǰjI+A6?|_^r딋rЀ*(fh?AGs2r`XX6 PQLx<̂<σ䀎0IBb%- x5^ BPaD9e=T`ced+d`xzT1 SF)icׅLe +]lw2Oo[JAJRpie4H K݉(N  + Wܹbh⥝ҡ8AFѨIK?O^"Cf)0 BM*'Q'k& atU:-%}+5Kx eRVxlm`)<F:%NmőHüiF-|jIU^ =Of툢61[Y fC8 m cxOo}?>ڪ{$!+×{ 6Ey_{lbflX#ZH +Hm ѾYH[9k64qdV,*29u0 T`O5`W7'.e "|+"ݵN;ɡ" X,^D=wKB( +2)qieeqk5,@Ǹ P-/8$;\Nl2+[5]/*֜ѹ~gNҨ~15JCthD.27H+I&,jv)|ۆxl'xW.I /c"NP?O(9L&]9;LBpYS,% +1WP8,$Zd/ey,hìoYq gGN_ql_;=CkCRNbY5m@#ewsĩ DT%C}Wpcv]2(KWNG +0:e72U5DqHz7{:~$/c`:}>XOWdQ)&Ljx)ɆR~\ wn=(Aဴ)yKZ~'FKi-Og9"Gq؛tt 2L2||!qg&b "z.ZX=_ vldeSf>|=5?P+˃)jfsCp{ M? endstream endobj 3054 0 obj <> endobj 3055 0 obj <> endobj 3056 0 obj <> endobj 3057 0 obj <> endobj 3048 0 obj <>stream +HWYs~ǯ-_JU[cVi"5L>OKBu vxYZ.x~YPB9srUjy,QVpV)刃ŋ7x ֛J ƈ pA4y_AdJI"eKKwlVo_ \Wo^WcW`1%.0R +amsS0DtolKSM\ίn,Ă9-.ԧ 3i\AZͮ曹ǩ69Dם<𷌿fXz[ջv3ɉ+F!b7 :f䣠Aaլ/w+4.9S֍rpY~I_|5!K!8ο3.~{jVz/q "Gcj&!X#`VA6|48-!@S=m#yn}D /HK?<ަ3e@@ηyNU1"Uy()7ĊL>`>W%cy 4i00rr qly2`شH<tdl,C;AP}|0RW?Ǡ5mӥpr1t䊦!]m'g)~3Jd)G*8yR*~6Snv6Iw[vu#_"}: Zmo\pۚiY᱊$߷x +L'm_@`djT{$V"Ӕ D5!JgRpzPw +/%8U?̿>xBs2{3Zm16<틗ws!km*Qpק-"` b! Betj[Xb ghhzÔ('z8֌%4ٳ煜y'[Ӛ̕ D@ÚrI@h$_̻?\rXV?7=9;\hb7ƿ;"#6s.Uy>Uibl}6 H=@k/h9m=μn7ps݀tmҜ RҎ{pTnF[]d+4$ʓFt3uMӴTB$ǤʡK8P>, ) +(, F{OC~ubhcDQu"5 qD;1"DFN0'!ӨљD1шSf XpT~qWfB:,bq{z:#DA4~UvGKLy9.,hdn&]1)MC@,,kí]J.wV33 #X?%ogIQm8 +_OA&*koB>/_?s]nyYPV(*/| ö>gH h5)MUJgۯ~䴺nU8Im?7ͩiWyc Y&M^ ڲ endstream endobj 3052 0 obj <>stream +0 _@&Lb _{v@t尾({Yb8OCё.DD4S8{fȘ;qF/#Bs7S?_bM(r\_ g'DWhrdf%|q0b3kBtij ye\DL4TPCl&i۱q&#|:revὝE +8L n-S_TKVNKE_xr n)儅RC_r6fpiIN٤LWB2`{T6%*8+ݓf~Z}2w7|M_8k:Q H1)pzmFT5rt.N-fnKMuq[崂"rŴuhJsH$&ăC1__?pNG;'=!XcV/S׋8NSh%!e +v~2!zME\ =o- +=SV",{Zuư0Hg%}{'&Cq)ǁ+L,P%0]tr|߱+oO_X"Q"Al)VI&E)4ߢ㒾Q +a%(%`wЋyD!w:ЗpSko8PW,0wr7-#n&:҉n8ے [uY ˍ@QĂXR]rKnv(n;]nev|t8*؛K'3tU=$Yk +d8[m|cy .dz~\Ivl?80s:&wO$<'DW + Us4GA=LUmJq&0?^xgRC:wl;6rFdO oӿOGuQ9&ő2p;sihO(rKq.c4]R I(K{]%r]}*E4S2eHЂ5l!'󩵼W"5:'^0,XAcp0(sV,Pv9 +]Yr׫,$e`jZϾiT,Dߚ ;^'3Xx?7ۃUx[l_'e>ݥXwG5P$XmUnC%=ȥYOO>E3ccv^7 +_~ Ir_qYd8$`iU责dC1c9bOEu|m,֢( ҝ Tbo%9u3s%y8De\_4 J6е!aO/ޟ9wDlz&UBAlc[(psc,]QQ:Tlӹ K 1Qdr|muo>ޏٴ7\=c$#ٍ%]gPh7>B 쁏IxeU%FC}]ӥ^)lEB.b1{vAZ$z/u07ebo/R|#yG pcY|AnrmA2ðqf-tD'zk@~_ /Vqhfn;7ɔ'4񎾫RemnE -Yu܀krIv\ֱp%?gXK.~.i҈O' 8:ZPu"uA?AY@IE䫵,o<uj8g#z!C#ʭH|Ǻx޹;7_9"^& qnͺx +~AgR긞IzFb{)T§C2qZ^>o  A~EbY<m8uG#Vcf[7#0F! 3SJ. ̪WX#ct.eH3Zg$"CiyV(mf,u +vcLI#<%2'(# GvySЌ=3xu,x'6LG'ijеigmR p6Brk7\.FEZ-:Ez/8Y2E\0V5˙t;o.R9r~8 {u$,jhOsy}:R9&:2dtùԤGD##+1|%tVse3zДhךX7FĭNݶp{'.Cd5zGs ]R5Ƈ.:lݭP*ڤv>yIPPſ:!D^N%: @\v"~llQJ['T%~/ JbD٠;peANl~- slG)]3Y+ͻ;ԄT9Z<5#"X|qq ++o(e)w)gp"Ί@0tpS6[&_::?(eL! |( b#}P T})E;.}#P<A]&DŽM |]>~4>:.K-jh`df޶ȷ.Jl}:'%Ej0:Ra`lgߪXorw2Ѣe<ȟ!wŴ_6V(+H рN(%%PE\_Cm~&˜%kS99?T; zB?YUlI6BKk aoxǞ^f=ﲷXbUU$as*[EA| +skv+ 0DT&=^\|爷PB1\)5 +A}$X7-_nE[.nG+Ĕu>M55w<5ႎP.Zl-_ *yھmR݅b[vhP+b>!%ށdɅVf"CV+f^G4#4)0a=41TZVR5P4-%pO臢L˒eStQq/z_װkZ#XY4-ͼe!v: nh}kF[ʃ[x)v.!$;% ,~CB R ܩ[L&*D*v18Ʌ7ށB -2r:ǃe6<^.Q4!3G ٛbXzff9(@6J,33 Nk S,6t˟ zZLu`vM9m(l@=!|:Dx4 %*uMwP/YwC{q~8N ſץAfZնQQ}rQtx|w= U\>˹X4 уӟq|4%+$t<]NSCŗҏǬ:P: LeĽ:e0;Tgr G 3Ď0 TZ6kiS4H[o5q<*%74s:\5ND.r1]z_-?69f|9Xѓ3%"Ss$Q=Vd|dTQOrٶ,/L}O(Ul ]-5 Pp@HhD,4a#},On/y> MoZ!ҵ(,-.ԵM-;.Û#?|{o̹4?|[%{Kf8G OUc4^@ 1 )X|Mj3:d[yw:ԻoruܴgcB,P6F!J#kv`^@8pYv1+='gg=_R y!]mi GpuEe5Y#29X.YX\Ay-?Jt(1KJhm=#JD8diۓ_5-SvfڎTRfufu?RYd [S@jF{XNszd9RӘ1vCh +! A\̉/sDb7*g8|ޓ|Hh[įE=]lm'dO(V7 |WϓZ_o67)IhReS<#1uP>GFf[ +w2oVKj ?~]dޟE9m8GCg ]'1+˅lM@_QpXLq5ʡYnDͤWה;uwBY_.6S^o$>C,Nbl6iՍ4f'-@= ˊ- C6k, | 'M6ӌeq &]}IS `E-W@d~ptz3/Nm" Na^Sy_mhK{.0,,Tkgs*U7y =PabX$+-'>qqNZ.V*%wXfRTxDՙmU#'Ү2.E޽_@_+n[9F#+"bE:@σثlE Yۣ3;%Bm.nf3B9|/|Z3|{v|K夑UR ͑U9H%u)+DE8f5U̇Đ%τ-(!}`FAZU n}Δiك:/cBaPZDf@joHFf!5HD6P{iϵE8ٻu'Hސ| ~V,$ 1lN3g:>eCTw) aben4s? 91#ԉǚ?bLV9ht~Urb̫ˊ|$t?mDN/{iD5r.B''IpT=T +H[?_pC$8R5iI1H]"'Ȟ %&?ϖF C )ǟ#R\a]k,7ug\tc@_ Oy>kc ( P~) ..W̺)y럕Lݓ21vM9ZEc]2:JhD?\!Y pjnTV="Xʝ\ua4"M:R%vX!. 6P9ѓmx,^#l{G_1e<8ÉJeĤտެsݐ}}s[kÔΡM4xc}mgH-R\NMyhȫ/V _6՞r Հz)3zV`vKR[Ŝz" +˛,i b\ +aF0ldllt1\xyPZM^ƚ;pn=CzkM#~{±?}XSdwY\G3*xt VK!zes!JϚaҴ7,5'߅)h1u@106sp,j|ChKB&qTy͠唑d'JN)K"SaK4S@3~  r 4Nn i0nN7k\7Xfe1Fq)#:Bu5W$ZiIٲ9 SQTNPB? 3nLfZ(ǹ3K/w +i=/N -.**¡gO)(9ԅjqo.\2,#F00LBA煺+ȸڅ|M]U1D6߆X>!LrպӒvui@3MU2F)Z$r`MX'9T\|i <5+2)3 %IUa Шfvs㩷 f}?*5k,dx23~Jt +&/wI*/DއOKJ-.> ,[閚k16*ٰ >4W>Ci[eCwU~k+c}#RI4, )rFQA' вYÚO`OKpBC +ʞ%ϸ*Lg51@Aж7x{tlNRrGANVx(#u%=ZI[5F]&!59#!dn}-2bhV|-Yg~oammy&IF02RS>>ˑ+ %15^T@)Hzr#AkhwXhֶq\1J/`^xjx򆷎P6[-"X&ALR"--rH[uѡ6PUT9Z3[)}B] ƬGN2'Ag鴻ի? A1ey&vBs݄UI3}88Ar'x+.u%' < +._CI?U)jA/e ,^B|Q/4}dj7N h%9]˱/Qn!njn&~OΕhO2v`u!;"94y[پ໙US M;8}$pQ{, %0maQW X'!@A·]䪏>ޟ E:82uQ=Eȯڵ0!DU~ қ\D3CXf%JZ*o#ab1%>LYIЫ#=ջ# |݈k4q|fSnYpS=pw,u;G-JUrOP3l;6E߈55/DyЧY:!G .X9ag1KC :ω!T V&4/ }[bxԌ߈ +hd?l$TQ0ŬyF +;L\p] +DD P7S9T)/.(md"vֶRX3bͭٚ_QŇ;8 +EoC%]Rzt CpO5)[oD<IXbz<eveك1Kamif7t0>VyLӇBe,ެ2־7*guV<9'at7:]"m;Uoq(D%S׉#&uX8(%{_VK6*(L7L@Ԟk # N{Cgqa6-c2|OJ76@`m17$( y8ΏY7rDb[HE2sݟy(HY$y6ϫl44J0pr%Gg$RxmO-)O{rz CƵrOS]s'κlq:R}SI_Rz'!Wݩ. ++仮 $,ӵԵkDl3+&:: +qYg1N{×\lKR.>zVm7EU5YG1$XK#Q-<5CGҨ|kL,5kù{-vE%woM}(nlz=LEz?:;lܯ ~2'MET5dPի6hB`@i-HBY137dqP8u;pOK$h1,}<2y& 5w-/L+m1,F`bNyR><=`Ï2eA]J²W6Cdd<1ekE'FRQ#qq\8fyMF\e\%9LތMC +n8mܰY':$Iq= @Nְ >~oa槣 u=G4$;'ԥg{y8' C|&D؝l˪V)ޘ(0C_M)@׾=G}I8w =WFx44i7 Yu+ \D^-5TzW׿d*+7ÆvZYW=Dڰ4tK|?@Liόl{#R1fdVCWFuti+Vq=w:^<*RVtM ՗HA + D5 HdLV5c퇝]@h'hE|D&3C!ezŨ0Ggop\A\ݟ}4}W`! &YxJ_ۆb"/s`-9Ip@UGYw~{&WI 8uN $/<ǝg[ S5&0N8[mrKuRd t-pqxR'̡lbեāW #ƴrJL?t@R@""Yku@ +ןepu=_'cDt}-_5z"Du|/H,q^CF Y%y}xXl˝++{]W)o,j؅(%Q̟86w~y|r5YLɧ> ʀͺ*љofAaZÖv#^9]fReC ~w2'Ԝ&3fW%Ę;iJf6% +,ijO#Ğl5EP.x:귍g V$Bow=/8Q`|P?>gay<xEpWK:޴cq -( ȆN7j7ԙ2t􇦕YS !IzFG8sO܋S"MU#3z'YLEpБWCH +BU0_ʕg$gZ +(Vn)2Q>ٍi¸KG6z +֤Ph|/2X48/pk:)E k#Suuݮ0>m᝻6uq YZDn0*u/ӌ;eQ*13̙j$t\;̫]7@T$ +gvnD$G JЖgQ xcF*loA`h}( +.nOaxAhfd0a^<;R L>vl2- +Tx N3a E ;þ  K^a5C1TX{V:6(6Jybe0VL-@Z\O\k'kj!pm?_oX]v"-q\@? q pi-$qC`@B 7+z*5w3|P`?|)!ɠdjh֦T%+E +r@s/9ÔjMr%nny +,\57!oK1uGV׌O'#n|M,  L!u6[U%FoWܷӣ+TxDtOqAvѳ pv?VLB^Ϸ*ԓI3.J > wŻM.$h߹u5q]KjE7+k[ZzW\z2 [ +ˠpOKd9%eW83<=nk5{:U+5ݸ~P~>( `KBVEÎ{ +)8!@|{Wg<oPUa{;&h(+C>Ģ:‡xn +L6%;UT/QP4Y{SUxP}r1.j`@ ! gN ,@=S:ݸ3p-ɺjcyVWnPJ¹]$fJU'jU2>ѿ:PHp%WL뚦o%A&J0RW?K܋UQQ&#tony"nw%@dAc2ցbAca }`斊ʏsUp +)mhLo[R} +O9ӿFi!ݑ[l$FM  W7Aķ*#Dg0p!P-aω);uMque{M 0. "zwlX%H+<,"xMfcvbOXcʇI`guAk1mM.bs@AN$C|sk #x՜pϺPxUyg"(3}Xjz#1ih'˘Z\J@Usᵍqi59ƹqYK^w .t[ B>J6S +Nȓ իT:0~4ȴ8$Vw'Hk+8JnRDIq z,BG%1'م Dn-:m8^1h6Q͋>PݾxZ4[~YyKu1CR:;A&YTaWVۀ%xΣ\:G)|D~jWa>L^Ub]Oeš%ųւ,hJ?V;]XJOBe٣8QfJ&&{ˈ@`> +?'^ IP؈impo]hfyPVD 8`7`ˉNE%DJ!Bߟ=Nc ݌\?^BþVbRX|B$8أgD CA#WqZv> ^Jy;9z)&j29>[,JK6I 'r7uWD pȧUqT$.M!xW냴n֊].r0sp=^! {U UHfH)g8 1LAdVH`ȀEs6?宇/W q\[Q0Xxz)Ql@E@y?ͼPҦN5q7b|)?˱9[3$lY{Ӂ ݜ2!ﵚ +seGn.RmlR` +-zRn!xWIb;~eOso:rc0dUh~wNL&1#𛗵9#w$o +M$ڹsP| 4OLbzjk GRՑD]StxM~L1h\#3X{qF^D= T8@JoLi4жo4Āc} +]OBY$ t8 l |}LntBzCF4Em9Km%.ٍ:m\{ʀM%Wcly5n$1W?7zT _Pʥ/c4Xl/h֢إ;6/cy.̬k@R8uKgdTRz1 Z6?u\)"x_cG72cلI:'Q y3L'}] +" +q;fE4Y(yuȀiDh聽 {H+BуI#ѿST!UE9Y6Љr1n+CZ6$ -B.sX8L% Ti9@$ϳ.P嚼Hqp"MxI(XJ?c. 鴐mx~pe58j`ޢ!Gz%5*a1!C 6Q]DQ,CڹϨwYĄ>낺V~glHޞ&.NdH}OH]dfJ_gHF,t (.JɬAHH  Nmm l5oVQ%Ąo,&?YŚ7PS1lw/`M}@?!vvEN&0Vn*j mu =>*Bȩh;W@b6Z//ŸF +cD}?d cdQ컈LhgZa{/ձEH8!U?&"f 'c,rR\d/v'z.!H;zI6COGX)eٹ4b\Ck jmU?'״O3J_R0`,2iCp?Ӓf80gk$JCgm[_1d2n (E~JHwvpUR_5ڊLԂ_e)gQ,Y#C +XTaaSPw6Hkڥ@|̛Kng EToށPi)\ϥ!:P\cU{) UO!v/5-󲈋@Ra;GfA/ǿX70O 7s' Tz%˹b@8b]ªMKGN^5`nJ)6τ4LVtp(ȇPL?o4Èu`|RxYArr++_* qYyH2Apai;U ~U< k uA'H_\YٱۮzoRnAJ"@6|8OVPtn+˙BODVџ2t{7aL /Ya>:jKpeB\ӱA8gGْ-xv'-fAjNKpJP91q@oaM)NԤ7A2Y +P(\Q,R9eȑU rZhEOhD`ʃ[(3gcjW@Mkݭ)j_x`Ic\גyOS7ڴWs6/UIC +Lu5 gYN\> endobj 3050 0 obj <> endobj 3051 0 obj <> endobj 3043 0 obj <>stream +HWkoSG_qŗ˾ A + +Bપ2 u6={޽vpP=H=cW@ms@InMeBSe,-SB(hr%&6O`_5(}%鼛ԇCT!'Ti^N3-хZábQaмbJS-u4D < +)7=2MBSnGwT? (Y>]t5ڪmG"RvIM'>-R4 R5;ݏKmcųacYH0ytHC+%%dHxlJwjx/E0\S?LX܄1HL޻K2w#& $s'j~,<={7$٠MzfLRZkCͬ?չ˅lI3LfKkKUd0m[5SeRt.%ͨvҪ<\0D\Һyn?\X`I$f8~p^L-wwxyz˧Ԅ˰p"Cj"HL6bFƁ1{xJ^9x9GD9F6Sӽ˶A A6F _8\qnZC} .W^ ua2 +7t!^:siAiY~|,RhMW;'-, /3۱R*47< {QLjY*k@,+df^8?U˦ ΗfՓUyŁEHS{eM8f1xͳ߼ 8߰ b{]Fj.D"Z +[WJ@[`1M endstream endobj 3047 0 obj <>stream +0 Q@&8 Q[_Ɲ;ρy- Ɨk76Fg&jH5xV!Q?Swڭxf'5¸6bc4x:$(4@$APS:XeFRpȉLK[wꉜ^NYS+T` +74!/Dd*$@c|\1A;h],XC IuV q".HU] +O!VlfWd2@Yσ4TNC𰍉p)*iy?'W݇2RSz17(ވ,vݣֱ|5,OC؀P=] +Qf} dFpywH9hKt\n7M<6uC5ϐ0#S}TV}-* \:^`(^;7AKk~uȞÙq"b/ nnwBXuxr^ww+ĵ zAL=K&mXa/c^\H/- +yr +R#idڅkD_' H!Z;,80*a&٧v<:NlĒZ|Y 6'l^QYK_>2bYWʅ%xk2 #Szx;:N"cB ջzmC +S]V HŞ<\$lϺ*XcErX2R`5t4|T~yOljőZiGВ8iCP(;,T|˙;A_kJY]{2fd -K!z}.Ht?=+9R7LIھ!+` uz#'}~ۀ{1q*"R35 ;33LAD8h܀2(=hf/mB(r9@ D顟*Bx:I8NV $^ +DI':4W7PX;H}yw-̃3u*g}?63D]0 ӻ0BaM4V&8p\p3PO;W3HHXnz_Bt/}*m5%`cÌ0uz\ߟMRY3w]@1`y腣N5gƹ4rkWS||f ,xN{eڎm;U#zdy))9R\s"?Lnᅄ.|qNNkl=~N.閊 +dB~_i!1~&#L*80[+2X6};3E͊ +xcy. IDkB)U/ꙓᶗ0.2#]w_pbiڕ{bGq )[JNkSP@]rQi閎q -gT+J[%+k1(WjǶ2CP&B_ xzA.JZ]cჄO_lIsc֢KKAEk +|Ę+OG i:=HftXNÇ+[lIfw^mj+0E<,+p],pZEoxx=]R 0 dLIWW<$JmL,-'v>(魱XNZ(,BjrIYUwc8-*|Up-=]}6b37W +k^f(5kq&wۈ\L4Oʮ':O9=wQ[]qc*~$e&q(3Ens-:p X(qa3+L$-'ӲV; l q|V]]X\j[ؒ~m|K"ҨNs+˃)CX.Sl1H&9ݾ,\4O^vA #3d_kf6]#Q)Gv#v[Z8o@xD QqҰhKQxq"*Ͱd h$<=c_}D)E|PAxGgxrՌ ϋ'8rdW_G0'SȲ|舨䚘#S<+YcٮjHRA UesL'4ۆ_s += n~Jv ,t`P7m/X,v(Y][2=l% &+:Te<:[ Sm> 8[2-72%VUO+s{֚#.i|(yl|'N ,/j]ʇɯ}V.j)Up`~TNxxyЬwEݱ/GV1s3I+]`.2H|Mnqq[tW+r;PnU4:{7oƶ*^֩ȆG/$z.=q1ȵa>ژY 0yL?VL p?s&. {=YJ_kO/Ba>o4V#: rI앝*;ʲՏU][%UzT$vetQ үYtAcpm+8\P)vTk7˥&f[EME ړm*Ґ?EJ6fy9SA*JTD$hq^;^5%bQxMMݚ&7 j-`_Gri|7i/0ڒM:k0xY8P ysW"7Eejp gj0 +Jl.f/$3AYFtW'Sq^ +9 +ڂ |msFi%?.dxVH-QtHUmgyV/yz鳡UW(}0A̯pn +<+x;#wB wAU&h$r [];;_ňE1fT{n֒vjQW_W./ӹtIckUj#w3{eQF2 +yǹ΁ж9e `\J#K:4)RŘɛ?CuWZɊxtڜ ~*ӒP:F?/MJ8.x~vօerk#߿ 5OxP8jTG OqIH*fOb+hL +䰜.+7FZ1D> @ut67puHXG;$0`qv-A/47~N'DKvjPД̹2V+ַaކ,_Px *v/$iD2eђm=sG&Plv0=hG}eOJ׃h:7AA?l2(dV lPD#n±藮A)efRn\p1{J= Ξ_Brn?(aQ؍!?QvfLlc7g3j~ZYeET$~|7*e;WŘ=鯤 bFsKqFF6pp ϷYSa!@NJjq)~Q7퉟k_Z q΍HM#H}]ˀOy!M\h?I,Xv*b1hd02\&zMQVJa{&pOI窄xS拺!&1Kx I~qMIKSX2rc`?aJYM{}SSd-zzׂh/oGP9dN'DEUs*W$_Nvq5jQpMHN=%d GKhw,<\qy.G d`46 ZM/ +dt,{Z˖xI`r%tϛ 06a 9=0!8~㖸zk + [ *ܰ +C0iwOFKʌ"E ZHw巣g̴·CW0]WM5&W}Lx̙fUi2+YKRcdOEO3RZhEN&toI _d'9g#4jU54Ưm}~ +-T׹~^=HʂMB,>eewp%[ P_ݘ !K£3y_7iz %Ϭ[%Q\zp淓z kǮIe6PkVlBg FO>08sipj<3=ݔ +Uz̻u6]ծKjRxw+$s¦fTiZU1xa$c6~dDkX\4]M)4hǒSO6|fѪEKK-.=͎iT׻|"9,<''X[[rD<ߐW]8 ^%"x)f!(F@FKZ&M{—E1IJXm3Vbՙ~!|o}\ }{IRiRX5nb";G\TC L +$)+&N-WDq=3huğt&ƙb*,ڜ&hLdl8RuFx~H?%poQgS˶>ar]j&"k<\V{.CZ wB7yjJLA FLk@x}q +yA@E{lT"4[ܢ̉HP<,WD!ǭiNY1.Jq'9;. {*+W>w6{&: 9x!f_?-eő v^@& 3Y"m\)Va]%]fkuqЧw݌n#Mr ')jQd%ڸvVfEu~[τp\2WFwbӝBA.ݹy6N's`#ؑs'rjpynZ'XT2FNԏ&.Tܩ;("t4d >Y߱@G#i^%@$j=Yl;iU*}0UuKfxئYEk,' x_ "z +UԀ) ]Mzg + + J55+?IŢVa#r2yVn!-'kZY~NH ,CƜ hC$V\=ڮhgSq~gl[\oI'qmqLYwKZStN|xN6ɾ4iZ&p%L` g*W5JčBZT 8A +& X O |:bd9Qm鼿FT%A +p2{:R 2 +|"ztq/kzD:}vd&&2X|kJ l: +8ZK5~:r14cX]uej=ӝMS($5Bt[ fG^uݦF?y$dm_^p;K =pG|U dKH.q챇8$88H񞓓ƷOvH ׾ց}ZhN ]boX_bKYnqLeVf€gʓwND6+;B3{&`K|6 +NQgN!1pȐX&ۨ{J/啾`nZ&BD"Ks`CKr#_]afW+c<_SFA5I_+f˺blu\>" wR63Of\{pκ@(yHa%Ԉ]lQhƈ; }of_s0 jo9e8K!Vo/iB/ 47LMwfY![˳k[` +XB݁;10Ũhlpv|@o mX;bf EkLE[ʏ-0-{Ω-NB NĜ0w95-h:.cL 0p*u0km +gRʿlOII6viߟA;Nr;y^M1rDݸ\C:%z_S? zk0ײ)/yΕpO6t:FP+gw"-zH8FgIΒ))c xXPY|N:\N+@%r;(`,7o|7֡ZU!Qo"eYe;õdص'آf=yFP Pl'ludF[nsC+#HwkFmul 4ecW[ 1[T2bo{6'?QPR^8᤾gĥ;Hc@L'a< ##VD!TA,n@097KH{`Ml+5z;|}"`K2p:Bwdl]pV r2Rry\.LlH!5R)Ǻ)QR>l`j :!`|Yܻt FaD FC]{覶m*^-3W`6i|>iYm=YdJAi33)O&,iEr`q6%EsA?{!Aћ;J>#wXkL5 ۠A@"b/0`煼ݼtYad ,F̏p3z?e'!1dϠٮ>besԵ!w3vzAy:f7˚ٺtm8V\W`7S:$ >#%ӕ^1uU.戝fLw00o-u; do)_WGy>`zO1L M6j;kmx\ 9rA䆩$,H&S{-/7V/MӱOQfQD1 +B0uY։/bhh^{6cCrUV.0tS'4wF %H 7Aav;݊o%S0~(aU&/Tcī3zJQ•BBFQ*6<9fػվ(7J oȌ fb] VhB F87VGB|0.VX/}I:/ީN.x=|qm4)TXV_Sv';.7Ѐ$(L=tJpK2~Rg'z)kf#MΊO]Izf8.2ޯ2*]Z;['l Y-V&7<=ˈxg];Z0.t>D1?$ n0U6Fbr*#_?t^/e'WH#0M'Zz)2 ո5@QwPov{+a/Qb)?֨tPZ&g˿ fpOdѐ[.g>6g_#P+YMKYAR ]:bA]vF_Am0gY^pw 9-Oa'*<y#OS#{Kett=n;v +4V 򴆜u7iJҤ Y`*Q%;}zHVH\2[~J٭ߵ;3;g㖤[h=ljMw'0WP|84.šL,.h],ؙTU V)Ҿ{sl'KB+ &Fy +hfUD3Xfj}R߶j0 \n}#6 0^ YBi͂A0L|;Z_xAKVhZpPPD>O택 \ěn(K*fea \? e.L5\VFP/3V +[w`,y7I@rC eT)mE"jqI)"*M ?$ _'J[aorsDI@pOĚƫEmA+e^pCty^dr0k#W(@1O63)S-=q;o"m]^ˑ}](3B[(d"RH'{ 0 +ͱSn02lg]ȁNxLO. Ksj#z`_g\.~3F6'rqcAfqFꉐ9,)&1BiXIt. Z*ĉCpsqXZa#ۥR(Znn%fiaFsrlI sl2EJ֍>X nGm6mCz>#l4G0z.zk27 NeJ\@(&a!u#ț?њ0O4\↻e  pJU3gqrgl+qR2$]XIvA@WCBSD)t*+jr$LJd[hP.@N!s bk6BǻVLQ?,qo l +e)L7T~ +RҜ.|reTw(Wqg> r z2LBr@kYqBdɹ5AxQ t +CSQ% ?z| ==3xlv LQ_B&ϥph]i׌RFY!r"B|?%_s%D +`J& +sYͣΗ@tbĮtL^)Lg<] _y@~#(gO=/IK f = +fvLuafs/ ߁n^RE6G$pBY5ҲQE-qb:>o#tpIן<_6_A؁0/*f; ݅ A0bKͽ<7aΓ/m ˔ٽL5D9&|)!rr +נk4@ZxK_Vܞwh]Vi*d\8Ȳul9 a{ } dVc XdU}tr =uQHdALs̿C{f^&k/I=KLd.b>h{9{ydŘ3 Aʩe# Y7~ kNZܞ+|=s/rőJzђĜ?I D+k@݀:SԊ`TVB[oO +)ePҨ-7ˋT/8 @L"?FO&C$5|HR%sxX0 z˃̬p|CRg22I|j/WYJ\ٶt.5+d.gHJ)&x);Qk4R|Z .)| +DTMjɈdHxڮ;~ʍqP <!;H}iIX/5Z*h8SƱ*?Qy1Ax&(PN77nG4K8a(/hqdmSm-a ĥ)dg\lLM_ʦa^E_z{u|_5`=I'Mjm3lk.0`gǀ R0,$aQfSy1{ɭe]RyllԄw RZEtV**I3׸ [ yV jz3`)`g0儾*`_]ABrx'5W:۵: )\}.jJ#2Xq!o(hA~:X_erbDbG9SCqSnVzj=g +IRgوLY5 =SX@˲UكbTo(&"S}*V7׿: kcð?wז=7)Y'X9{N!BYꫣA8 6g, y^Iyx/ 'u~EA;KX:DugEۃDO R0AEfY2Zrtٖu͍k;C&_-ZqZL[ƏjCU, +JG!>B{!oG~W_B|d5qx=d5&1H~'UwHI10EQw PR¹Xue^"24Iz4s̾+\T a`|nICe#] 3E)مHa3ݸQYߗK(Y}nW0ƦIn[H?g}oMh|# M-}VOIӌ%k endstream endobj 3044 0 obj <> endobj 3045 0 obj <> endobj 3046 0 obj <> endobj 3037 0 obj <>stream +HWn}Wy X_vv\! +8fCrв>շ隋DQ 6.N `P"ՂEUA_1ٛ7dcs˳7[}f{ G޽{7Ko)fZŲ]Bz[WQKJ[Xn^7W?~ L1ʝ)lŨc+zUriXnS/x@f =v=FZj8CQ2w[wJJ,$:esV +ĠȂۅ$W;v vr.9Iswx]>²m%\Ђ})wwU|.0aTa?Tw\!8/slz6WVsc? ,3 +뚜"&[U[]xpcʜlmC1(Sjjj)4@uH/9bqHv[!ZmU2^',1 G)tç\6JởOgytX[*r)f.^!D Y1>Xo"f@lO!ۮ1L (Q\F@:qr\T)(u75OBB{q`S[j֮.^e2=E@y]69-S'#LZ'֘I;[oC2jz|\evdQq }v5Ԑ@gNp^Uyu;E3qc}R.Lb`O;Ĩp%9Qnq.:& +f,J}:w\.jsac|Sjv)糮0wJ )^1˕Rq*|:m7}ETSFo̔ stz!8;>t][w ÃCƆ=^f=Te kaw0j#d}:9ۋ((;=&* Xͨ 6ց&sN(f `yIIv1͢4fd\a,07Iv/8h nϯ!eًU3L/mq\6 m_. 9gA4p^Pn/-< +oȍ|`ECg˱ZCЅi./^}͸wrLI=$[P%ݘC0.xRsF ++ ]OȷA Apjzzh' 0 $!%O?C.0HMy?!lmx^V+Y P*:js #[1yXrG魋xl\r7/qb|qUAs +nfOS \PpO_@)Ԁ&Z1|~ܸp& ~P=@ڵM[n0;&G櫯f~;ĜҪ4}†TҎ7ռTQRþȔDeZAx4ydA tf"M`BIiS2Z0D|إJ8eÀnO}g)^t!fRQC׋q<1B"'r޵;(yZ[(I鄎ݤQ[QUj]W a*10(1F ɋsƒz81|ȩIi` +ջywz}f@eL|f;HEPbsYO $&KiIJ:lA+N.-fk uϑv1MM#; I$>$h)V1R*FNj>0C# h!JlnHGa~TۺnھH&VQԸ |$*DE^3ĥ_ؤP[50]$xNN=E4ƗyGP p(`gVe[jfB-417vWQ&;NJp]ߟ#rI8:t z~dTDY٣,*t9S@Vf #ܚ40K"EBl]eAGѩL(H3K +ۺS HW_3AɗGǵN@ +)21~O5B?wcfӾIkdfU]r4.6V󤆞.Xp j}q9Ae.44 ث -H2YZm\7_HyM:xpj#DD?= +~6ӓPk:m zdl/-㙠ό'#VMG?Ȅd75=yf3U$i%-?W ѷW}kSHύ̯iy?@~ endstream endobj 3042 0 obj <>stream +0 _@&E _{t8!hU}} B[oV6Z^oܜrB`*ۄS;\4i U/kdoV2(0VXP)pxl)3, + efO,^vG#p +Q_?X[)-4a"LjxRaȝS44E!BR5y+Y{Nj,_哔gDR6 y,v`j;o&Nz* qctRwo(_7j b(YSiue<ټN,'u@/\J% /w;lqos2X^ XL̼!\sqC{5Ƞz^Edxֱ0~`j㣜ͮR䧻Pbf`|d> T)NHۋR +KtOs5m +9e:ybnMķ9@q7Am ̈́SC,W;t;u,&ҺJ5 җAؘx,*k,$S>#1 #bpuRu+ڡ'!X.4+rŚLc3q^ +xm/W]#*,Xq;|x޸r3t,<:)`|R בmSBBSѹZؽu2IQx1vYR BFq2qekz0`)?ą}d&^; >W=AR a1}=]Jo2דn Pq}jruRx2VG‰>m +~GB/Sgr7@9l.> UQ)I{1ɴ!\0q1aFмpx鍇5]!99= a Nx@be0"]{Z쓏4k,R!Fē׈׀&lʉm@'MVܴXv- +7 0vZ5']T48eA?\pTAS4 n22b]^|`! ;k8nv BV^(h٢ڨθY9Z"F%gj愺 P EXrd)i#,qd!hO@_2u9Hm=]<\4)Z&Xpf}/3S̢'H$x'IC_b&M JFv-YQ7E6Ki~fŸʆKf^QgGeH=Qh1&870Z &sKH,Q{YbY!J&^Z> J9ȗ}@W gt'j6[MjMAHX}WBi, 2\|Îko?Z@=pm]J +aw{|{6=bjw&I!t62=:&h&n +ѳcV0y ߅kUcj2$_Hw<0>4!2_g 1 b܋` ( tiX%l9ĔGVn@E5)^;.nمNq:-&,krtHɫ}Hdprܺk{IC uڦCpD@XaՇE_i(ysߙw$Sn.@TB@Nd?<_:3O(QJ|Ĺ:)-E9٧:i t)* OV8QDHq\nY򣲩vP2}/ ղXQД2Z+es;ڀVm F*fUȦ$X pWZZ{е + iĮϢ JnCMܣ{xNo_G-~o Y(#9CZ^<o3E/CC3~Zd67=dUa6h)BWk广{,AF_a!ĺ%S{}vT$jǩN?zEg|߉z5 mMY +6_+3{sÀ3JXȤy+gx͗ON\muTY6Spn p0ϩ.fhNSM> (=3 +"ueW ;bיg32W\a ȁDB-#faQ'li!nYޔz˪T-g{NM8njʦ]A';;!я+{ +ܨ+ y,/-ʱ)Od78'RI+|ʀ1Y\r״s$(6&Xxb6HK4Xnu-ȹ~pŒ i̚Wg +އs +C!ɆD`ǖ>E!BWM]Y?ɸ~krwx~qZ9uz)0sv $\)}%J񴉹TRveN}wg˘24/ʏxu 0+;]a",iwP>PK;_L9rȜ|Ux1cŕ1!YÐԀXүUZזA1phF7@92Y7MA{PN!K3llCOoEsW\H $]]R5w>ӅǛŠh@fh"^)̏dm>jlyL=M}R`.u34sF7~DZ1q)T+Cb*t]Kw + Z>"O̸!"x[/z)OY.0$MZ_Z+ᜲں^ {;U1e&"IYt~.0]3È’Y~s4'oNJO^1΁O_P0_gK"ldAO7r\=^#׫ Jn6Wr~".1+!SWrO=![rMucb$N C߭f@&lYPzx-Ԟ".t Duo|W#0ܓ=J`D ˭ǜn +j+ƺoM Hy-3kd"Ky"u[9y죧 #d3S](Al}5WP{{1mG?ل_"N=o56zS#1+#yocBҩU^8JO򶿩ŬAEEƎ51o2\6IlfvYPwF816)ܴ#=w $q g,/$ +2-z+ȔdV"Co<whatzF LkFFt33tEEͼ&ж"b9-XڅaփebKQ#HzM$CGG~[J(I{1RTXݚhg?"6 +8kUzR% ٽG5GB/fI&y) +uX֣d]%V? bT@E_^ة"wX( +U)蹒jmS{\lq.[u! ǚ #[}jDi; [5QOL6#6]iƻV΃b+wR2_!773IGJ_`Tyث.XEy'vc2@zixh7rxdȶ緔&Q2|0n3z@j c\M=Mw7XP9ȀK$Z[Plvoo\WOgdj>yJk,?h#BH Kw1/Rp>zQobnF<ى*Ly.(TZNرr7LGO1󀈍`A fq^mЛ.A{bIboo JxE$INx(!U +b.?1F&Cݳ#/O.m>w&F!x c*x5 jSLh1i Bq]WY &Ԉn#8}S(LDB߁ +QwyѢ6pYɂO؂id-)<م၉^ .ڿ +PؒѢ;0WŃS"қH0q́'HU +hK&wi3g%P5d\ÎĒ]v5 +VBLɎJ¤nΫ۽xdڧɴ \V +z'iRV<{Y3Fh]p2+`?JꊽV;< mawjwމ? '%=In3VHnK[z)pyT~Sp/A)jW XcHf<%YjqqԂBE1-%Y3P-.QY?}`•>HO;;YhrqwzUiϬyh5:DA:Ё{>vG=~gDsAΓОu. 3y8oK~*5 t|P{c ڌ(3j\E|t=ǝ/:P>7~äGI\{(RHMq(ٱ>^bXDCj|*d#s̸d@(2 ccgȮ٪ڤ(A(]íe86 JM1b(o,PZ]zb2+=Kt4-ʫSG g^Qϯ +bVb|Cсep qAywTބ5]EьNs.8Mf>Iuڐty{dAvR5ʹQJO䷾Gӡ~WևoR/zRdX06`v O/FuuFUE0,wyeGBSsjQ|n=&JIxfJ:|o+hUN2XXa><&+V@]ާ. +x~|̈,JoKun~DZuNQ0==p,Ni/6Vb;l+pA () PYNeXL~(cPo-4'>Q1;?BJa)RTPDI\V-)iZ-~VoCՔ:AQ_ڗdJRlVc`|PUV7l"1;Zp< +)sM\7-႔ZfW +yz_} ̤G~pJ=]FBݥ柑l|HP@9)Dw䅣x22ko3:pUO#g2JFLf\CEU$iLC_bv}Nʑ\>1l-fN@+M!j%G0Ҟv\p$aY]!ʇmL YGs:K|?:~+)44L1evLryVPFXzG ny'iK1 KZ!d1]MTAX2sa+YX5^^Ns]L8(|MXD]\Z)$jSې|[R +x;0F6W F`ZJX5\ qQ4}i^Z B]#lPqc鍽oZn +HN+6izZ<7=3G0yÒ!Mhuuw*VK;;w +D&tTW+#lq}˰'яR^;~6oM&՚$%G0o + #&s2c4&8| ~G;#q-*u1l,R[U8VT:p ^ rxtHjUj%bwb[YГ7>m8(rw_'8ѿ@h츛G"A[E^&Lq Uk~R,HiIy)ǹdL"UYj +Pi~jJ^)0Tg׉_(~(Xܞ:ig*W|)Jݧ ݂X $mwӈN]ł[ALQL[@q|tj,R*vA1E0e 0jt}mD~  s=Vd,gV c%-F7*͒3gjbpm5Jϸk7)4g90 P尡q0΢-CeEp\iA +!;/UK]ƸV,ވ#W:uuo6R]Uuq]?4ƴ<`J i]h,KG[z(ӕDwz@Pb +k"^1zTTuOLԲܝ  LJ@kNzH*0s1C*Ynw:%2A;c|rG-Mp1nsJG|oZF5,a](+aʢJ]@3{Å2=,9%ɡifUqqNpV<|3P}8#3َJP먛AKA+f?%IX^,<; mħXuA< $vF (OUtJb!oJo7}:МvlW?m*exf-z +*N1FK8@eZx-.`oZvܦaՈTUܷ )fvBV`JĮٱ +B XI= VM(ܸ5!ӟv6٪Nlt}33%pd UKݘ.];ĆJ3d5ЬΚAL1 Pq8e@H:l>||VO(Nd$ϖ$ YTӚ{J0 )C ViƣwJؗ1 Jbճw$@XuCd7-[0x8:C45c,9\`?t^~d>0L"2%le^[ +.t S-Ҭ6Elǔy+.*RTݠX M6xDPuqn޴zεFReF'^3O$HY!K}8(vs5bAe(XIB4iX9D:QNvRÈ@z1Pn>r @A5S?gVhfoC+ +_`voawY_jvUx59`d  ) hBŌ6T>ޫa2sDGHY]"}a1y.&ߣaM6`)C\*Dzd Nv#}2JvƧVjN>n݇;2x؞'t̠X6T)UoWRQ.Hz+g<]7&xҲ +4]gWmY9EC}b G-q|ĞuC1?K ]-Ð083Kd-떗݄gh 7Z黜?hxʗ sXZERyZKg\Y i4{/tKq$?C&$kS;C`M**lD9Ҽl$T.G:3-Lۮvx +|n:u +d{ l/ժr9U2K1njq+u9 ºzǶvYul}ޅr=ZpNF0ݑn54BtkQU .%Ɠ>N>®6p1 t0U'F1؁!pbU%$T͑:)QtwW!T) %i* gJ AB^(EFh*<8L_R%=FQ%,lY4K 0&.3y %D;8wb& .uaآL㯁U699xBޟJ23$iWb%TqU&g5w[Nb<0W%yD+=C>]$A5q<d&lE`=9(^IW(@+Uۜw${|a\6nG;-qvP"1*'Lz*5s+ad㤅#߲z[8I"[9Kv6uj3V|+Nn3Ρ/FJwƎ{S>- Ȳ^{EEMCoǰ0U 5,e UɴsN Z."隌M~@?gZ[T\* 9:e6S/n7- : ~fbΕ\IRfh1MrƜmx` ʲso3"|uˬ=]L>ԄX;hNʢt:beE?- +<`4.ITϦF "OyW#n\)Tv[Fy< + Кw5Br|n<KYo|)}QNFPv@2໢$-䔐`z*r=;a(3Prq30S"cnN^mL=̰ c' #mwFd^B"Op/)v@Y4|yӇ w)p4yF~.3(xZSkᗏȡ;V F42QKIjbh4TbO‘DH.d[^BK;pEnnm(1[o(1q@QԡE-p㻛i<$ gΠ6 K"eu*' +X^~} _];ڌ]NcZA*x=޸ g7K|S =ʌ<rAs[3xk{ gF5`o,jnF#vvq1bLjXɼ?Χ$瞑[voFA9E媷/z/jBJ7К5\fo^my6"ʔH!j$dzz4MqaJf .  +iXvMӎl[IC5%{8V@Uc-nL^/N*xkdY'CFWL%^c55D76Dq݇H(X&5s퐯3g"F" TyjWթۧ~@CՑTVo=qאOK|6 +}bɶ yQ;=vn|I]6tkQx2QE q}jrS@c%c#졔VP0)U!qiQ!OJ9B˫h)Npw!!~/W.zGby`L T0 D̃7Mp䞆 ǚ%~:v\y95Էl'z>q -k|JcX#c""r}(4~h*?|#0x81jDH 2N/ [g㪽3pGl X,x +9S0*+h!ևޠ+M5+ RX}܀A)KBb]G$ckĘJ$h鿷626&7?k%@x eAxw+ ~q!uκ*Ѱ{%!凘] Lt]w Ksz06E!rxWh{y2q GkF盿ɼyN' H$,H}2`XJj1Vm֐}H͊z{T"#B>= $>CO,",$P~@κt)L{)qsOH%R]?S +R]U%uC9-_}~ANr4R<y>dظ,G'X\@PT ;:,ˤXRӴ;P +J$?u>qw+UATNf!-dfܱ+JvcŪNGT\_fH'L?'`gOB Fӯc8e'4F|*)Plc5{CzlF +!adg42R>)(mibgh%,"'Ĝ2Ziwm%0 +շRZ9H@i}qH6/|9F ](hd}_(R6ݰxI _mǗ$ŔH,QaUMmHOmp U&|wGpH1~y>ˌ OTSnWyUH=AQf ʚ9zHX3^DonUaLM@$qTo( $vT͓zzUi )pI3kUovs]Zc:9hJ-dS +͒X*\dž'0Žօ2*-U`Q0 ~-\5([َM *χw3oGoFn4P[G@->q@GSC1/SMP9f.N ^2:}> endobj 3039 0 obj <> endobj 3040 0 obj <> endobj 3041 0 obj <> endobj 3032 0 obj <>stream +HWoܸ~_w@O+Їk} PȻfWIIݿC7E8||XI +*&Q>_ono~ز l?PBfۈv"UE(Ua7wç"餱D| 皻ܹx^Њcm\xl +5`;J8+RoqlcӝFi >iPg53) eû;57eN᧾o޼2vVeL+s=bWpɝ kCXwBp6mf Dq̒}MqGUB¦ڃ"& wwAVufy+8q>kA`zƘﺇ޷Or΅TЙD0k6"|?^{E1[y'{L2DKrvz|hJ%t gE^ k|.US L_ͱ~qGP L}ׇZ0 n\'* 7?>@SٕuF0i<S~֘pt\Uv[6D2Swx,3bPms!T\*Pa 4dOd*D!S3f NfhaH]EPeqt\BΞ 9@8L}t\mEDf^%;.ET\{; .<bk}ix@ +iŠWhY`n>\zT9s ]$ <9ő]W'Ҳ9I ;@)j *B-* : .`b`'JH0QJH^lvW_TgQh0 c|+xlW)`0n/^w gwkXjbQd~oǦd=d2b)u^B2X?Ou[ + 3KBg` 7ԓx2,U@a N/):;PgB0㦤>)yȎwH["m)]-d ۱8be_\Iw? . +m'9$ncʲ\d<!A*|O@ ,yHz0X# @s4_[ 8U^!>bB +3 +D=TABa5a)OR״,'a݇%-Vve< )VR5PgTL +07o;K"4vp#f[<&+"ko]%geRnzf!'KJUŬҏ9^ :in҂+Z}& +Ȳnu%ENUQ2JcDLDf80%:UE\*]Ehgw*U a0wmӃYArjz:-Y/#6wm7g &WKs/Xd>`J 1ehs U(+څђgG5qx{jCgg][I29:85*Yvq₼H'9\4\c!>È` w&ٳ&H¯,|ĹM +4+>lxƊURtqJ𮻤R* *Θ4u@ەAjb5IlX + b>!X1w=2jmRQJOEd~钐M䑌 鴱T7ެ\#T] ܀Pq%,:?{Vʄ@8_@ݎK$ 2$l?hT*K8ʮ% DD1iwr6QeiZ0NMJ!RC:slER.WubnbyQR_bS)kIil.' +d27}?v]%ȩ0- #KM rJZJPJK`6O͡GTrrĤ7v!x ڛ@XzДrʋ szi@'F`o)I-wU[|t>]srPN[ih~?C |ɔ ,.`BsG\jqYd.dTCbS}J 1hp % `v<mIp K'g>V3?=W:͈#@E ~Ŧ*^vd,Ԝ4gq"eWahml8xC,UHӴŃMۗ>*Em>u7!MyJŐ2h/aXCNI +I]b-"}wa-28&m@IRaoi$ +epSHb`|_L%%oۻn\Rzӛ^j[7@1TM8/vI !YN<5S Щew߶aQt s 䚉U)c.ԗ1Z欰m4AJŇݩO!VD*ϣ: C( vU@ +tAjٍۆe +_fU)E۠5Fɶ[c4=HJYy y9ڤX1CMwï+1HV=e~R~^1+5UpFnCe3P`)gp%JD4"W= --3=lkDf_p{ɈXXE%YL8@>ʴtU@gfF{c8l]ķ<}2*L|?|@}5dNICf|`"P8>MjKPbot># #Vd/e+4> pso RTlج4Yy|`q%_POXF񰃔@!!=Д i$6DHB|$R^ ^#,EX +:]|Rkq{:ͪcLM\k=>eLL4]ӊ!*7| +S5x{BQ 4ݰͰazx203LHezu$Z3ryn6`7ʵED"]_,C]BfG1]dƁ|Y_=GL/ߏoʪJ!-*ҕo4jS:K7(I VXqUC&δ?pns) +h?g&vCE\mkRhNdќ߸qy̝Z:4NJjkWA6tKoSVJsaBEXśBI mP>]T63 ߪ}}v!~\>DQ.Ըah(13n;ͬ Lj%b>28;7* o߇]&v8qrJnw'+~}~3.tI&!hj +KΈ+ 3<,K'dʖ(Y®4Zc[7lIX#~6Ib*! O#=(k:dҰ{|̵b(>31)C|~7v>'EBEloQx ūcݝHJ:-`ۯs#nحSn9 eɧxe0 (тCP^=$HyN3J,P5j/2L/&#jx.x]1 ߌeSx`itmO* }P}z %0t$oFbvs*@:ziá]9_<PnK;]@y"ؼLQiR N!ù*``RШAzjBT /`.? N(S/@ +'d 9JN1n.G} 0D endstream endobj 3036 0 obj <>stream +0 U@&l U݇+(@QnBHnUG(d{;)3I1(1kzW +^݃[BLGQDꯆ?S>2iFse&;$< ԵIM@'1|58D&һj QQJ,w |UOrs]!5 nyT/=Xyo]I;Q|mu PpC|9CU{:/L^~l57$WU|췬\>tkP~Mby0֕B@|*$@Yvq{f^lCX4贉a:~rDM~+UA9X0=IN {b1$cލEZ +cL~*U;uR 3Xu:9*H' +P(4Azbt VxJMUQسK'{%I $6_/0Eflp`!y(d^o)[r1w3Fd֩O ~rV|So /)#\yo`UgS +7`onv6_骻HT]ϾnZMb+ f!pK@7Qn\p692(kJOIDlcd":.,7fA0Ha WcwmΧeP̲z׬8vMd~qw<=jMt1^o9džN*IszT̍ܛPg hJ'ѹ]B|m`e,ۂѻ6YQb[)qKb4UQg_U zs$XTŰ/@c\q[kfI@}uzf>vfU*C[Ao_卤VKaWTZHBE Aɰ9 zx6H}zy䗿sߌz P4yq ɘ҂.=u\ ъ5u!H `KO>햇$^⍷|jzGSpPP|,esʣI:\zzX`q^Q[  N0yT],TTp|WqӊCohoh7Gr0ͣM%jSU㽊m`f}>HG^S7:)buAI}N>ՋdXy` + 0&ÿ&>^UFW?cˏa>؛8$iadHNꋷ0,֛bn >5!гGP0f1GWR 4#A9o%a rOH:ݲ04j ](tֳػb+8Uow;RhIl.%ɱE*o xZȄcGMbf_:;ɳy"wKk=ܓ&h:%榵\SJ3^rKDj5IBM <ҟ(C]|F{g55 ҏQrt,Ao?P9" N3O,D1/s<ߧW1 -_GJ4첒&c)Ĥ1);q讪9y y5%HG-RXMdV3/N|/^U/VX71j + =`-Xh[7QpUDs+[{q +f0/V:@}`!j`|[T=]08{$ug3Kl M!4rb0/?d(cpstVgUhbЛ%ɬMS=1Yd kUBPN`jpגSXsNԡMgfYzI ^% U +@TyH4HO7ҿ +>Ox>k[0y{'$2 mr)Ii%}`lG!BaDCRO[盤pW,0 +=8\y'Z8Rr-ߞK?Sof}S2C'%lTbK]4ܔ@M^f$U#/k4"ԛnYRQfk6&o ìgaj$ysj)kzyjb1ZVX>llQ4.e(xT{X+a^OCzt\//׷RO7N(<'<3'H>v UA*ah3NxY+r?Jzj#BzhGCD@zF!ϒ(eEI_J]Y(>1meE}p@E —tJ}@+jI&N4Fj7Nz2Hj +{ĘC`ȃ@}"%Ib[OrG:7·Ý QWa t*))7:8ev- :k׵vWoGڨ B2?eiFx$s!)Fw-ڌ?ᵍOZ"Nh@ζWD((Xψ^]U [֩XǫJ䉤5xpI\iE+ ju3*u,S9J-) D{M_-ԉ^Yo.D?Wl0/7+jksZ.lћ@0;FIYy"lJEC6q.)|/^%Uz,ӕUnfD?(<ʉۍH-wȦ?ԕoZ UWHkh\>ELJLJK@ݪ㢼,D?FO ;I)ϮR8a),-nw1=C6|L. hB.Iw 7H5@l{硊栔T4W$Nuwc[^aڭQ-^a"Rz9(~E Xp@SJ m b͘GɠA+fKgd%§: +Mr0QU'!CfY ]#` 'Mo"5p-|0Ar2 cr532sl"́[]x>(Q5MmlE;. NYQs) Reg+|=ܡUQ +Ӻ?A`+߂9M!tc*h^nVSߌH\a(ؠNIaw!ڂ_L8G 3=%5KߖkvY.UiNwYB%B^t6Nm,M夵5 o4OM|K9 + xZ + sɊKH¿AuPO;-۴6:#i'D +0D6"kϯ)uCQZ5x_hs\$*^.Fŭe穆.#`)b |͆0<l̉ +B: +:/+ھ) "eG l]BѽwnX('fԪi%džD A"+5妓 =NgDrX.U *Adc1& +җY:?+ha45(fdb+|XzLo%Jj$XF&DbsA:h_4Cx ynj# +p7~ͽ`._c +l;P6y=$=aa#~Gܖ.%BcˏHDvxlނı!ãCsGX_ =CK]Φz>yAsU4z0{J!Sn r,~`*7n(c>D)t_]=AVZU6& >FӄDUXU =ekSJ>='?tR@@6dʩ]fJM GI3I}υ&,j_섒I?$/TctDB=38aTz1S{2ݬ]pۛt[x1D %V Mm`9LC:N ɩOpj|)ȚvC #H|- |NrI0jmjE"7^$5x(`rӱu+st0zl += 24'9"M؊ E:9b(߯9-dX7_q +FCTh7-vʾXHg`;el4x\>9WcEp^۾qᮌ|PJBROioό Z#Sgߕ9;W6JrKJdG5<꾾n?0~2{yIV1JGvDAD=v@3z(EG%J +3`1=8ORj=?{L +[ ׍6shc&9Vf2Lͅhc:Cӽ(b+'VZg +g>n8?7JmۍѩЩi$>W=&> (|X3_5)1zLa鐻EB0/JdQ%zqT9Fu1ԣ.ݝFMkp=Š꣒-Ae& 5&\/ơRÞ|F_ +㪕}Q[\bG\fME5b7_^k׉lTJ+4@;ZjΘ/KCvV.9 Ga2,;e} '̚\u}|u;j>=vcq@ᴴf2P2ڮ;e|42N;"`s\Ee^ؑuIn5j}i*^ ,{wb(5^%ۍrF@9T+0PFZkzLCoS:.1djfyGzaZpCdTc]ca"k&m,(8KT@;QL>&J׶*eUu@!,E]jflZiORv,cN 0]&j+G3ciCE phaB.^fP@klغ鋿P;3dbq(GĦpry}]HuڤȏeV?jZq`.fZEDbK{,܍%ӌc|{Z6nIOǮPᴉk Y}\:b (&s +GpբzDpUegΝ{:{e'8Ҟ5AgbX)Kl)ad !o-gѹlF+1Md#)!%R1ewMHNB3iq>wq-Oo\[9~ K<3Qyw0臼3uWXzUH{hCx*%r}haIgJyc,-ly(ԵPb# qD] m8%kNwoеlA͜ ''ԏ z{9y"_n:T6UyxO ';ݾI_)XׯAa#[2 Pً^S3>d8- +5oL[{UArhP}Mbħaͱ#lr Ѫc4}ibl!t?sKቤ\:2֭@ +\71ϟt?nTm44GVQՙaG$H$B#COCGq;&/9矹>v+iћa>܋*՝.z'9k +kl gZ!/$g[ /a><;}M+?/Ԡ>f=hlG|zŽZ6JE$t][ZIY[}H&LYmXG[Դri+[Ţ$zDЬjB-D9G)rHOuj7O= +/լQO!k_=2倆謰Q7VB2VksIyMp:%e\ܟ`y)kpT'EeBi.07Mej#+az~H` /7)w(,ůu=i]j!q]qb;g zִ.KSz (,k.+M ɒ宥Fԙ`kL0;llkeEIk'f'V I Ǭrqʹ]iCZCBFta.mpOؗ!. r)?w=/HqpK;>EsetuT.p}( O'XvH Z|i Uz1ޤT73og3ĂCMJ+6.ȕV2 +4L,_3|tڼ X!k5"L^zt}E h2baekpj\w,SՄx#2CQ@E$ouGFEpJaZ. PdvQ"(5Ȇ;c;+JsM|7+ ~4u1"/tv*7J.xZF?j -oOQ&̒caUR9,Z!ZDN|?IE*Θ6V)=RsN]zH(B'૦kK" .$vY3$]xY+9x[iL=+ RE<(TzLBS=KQ"  +dEۖi[I vJKȋul-u++Sß}r9q<5 l)%2v}/ܠ*+nֈYX҅^ ?8EǨ/#.^nlҚK0ݭ5#?HIн*7Enfv_!ջ/-{T'E[얝R +ޤ`٭){ ًm"U&`"{^/ΰ95悶GUCoOyTSk|{mND g/6$F,k_w;jlEkm8 9DTͳ^m8'4%DM!TV;m3o@ylS +#GmpXOrP iX9]N46_]85jFR$Vo5^ 3:0i.~ Leݣ3Mz`94eY/;\jW:&ma 8zܞ>,5K`?6Jn\ߔAWFg,Tm}N==Y~WwT߹oՈIWi>.<'V):]H1Hm&:~&Lc[ B~EZyW]>rX,?$IKWeZDMt|+v$]СRޙ#W~ட9GYp"ߥTfh(}ifbWKWI.w?@U&e0Zu[c؝czs%Is  \Usil*JGZxZ>FZ "}F}7eqy zRkۄ8l`_7bTړ +0X}֟?B}-'pTL ksى5=UltL&gU3 "Fȿ{i *Hg`Խ +c㍟YB_?w+z}:i3t-2qw Z=SfnhwKoA1]Z|iχ.*v~JLN9E}ƕC~C˥!,>``eS*M^UEas@{>lM4v62oucE, omkt"ӵ`RtPvr͙>İfa\Xh<gN.O2'ty^/4][ba>LX̌11u*i:m ,+HUyPI;:@2=̣T(> i { +8] !PqtIE85F=! }L +s;v%roh& (!>>pAJKW8F?xy!| ^ J.晲ᒮ /@nYIqTI;sss6i9&!ٖ` +PҐ_N*^9z[|MX}o r`ab}*K,˘nhS\M&QĤjw#]=r,+:C1C ZC}Ѫ`JC8fO|JA\Vu)ͧ!lX}mc.l/HjN=;"w%%5%;AȵYkw뼬RIA7Z1˪fKV"MJ>crLg>ӕ4!|G1* *EQ 9ĄqL*g TԘ^00q*jN打l` +;T*YCuAtM+"kLD%o/D\_ 4 X!7iLK*bgUJuȉc_&G%4EZވ=6e QW +-Ǻ)-]?yMiNHWÁ5(uT?K +sY,uLj)j(L(e&) !o7(T0LdSB_;D@'J)P ~.ms] a v~,%qCWNUM},r '=Awjql{w"4JVh$:2: +"dIb0#|U0jw@ >B3I賄/.i #R k,'3]k+4*?Mim]HtQD4+ϑfW#j"hmM)P'Ԋ,ɀ>-'<&5}.eς@3>L| qu RE1ذ'Htpp(36<*+$Ne#}8쓪D7SkJ2;"ڶHf{\ +͎s;ͩ:CQPO%̓&ZkS\ [ȍTɴ=UKBs앂Ğy&uĨǰd8=H1SgCzk++ŜR\E[7FU[XnNk R4,rR>ʹ!tM4YeM}f8~|'oB(WOl `6"9b0Lێv$N3B+١VG*-aIIVr;1:FqL+w<a?-1/P% +KrR'ӼЮ'J܊}‘BaR8 o )bQvXa2\_o 2Ib3}fT,( DTiw7r?UÍyy*c̈:$4px0Ai.5Vovl/:>,2<5ƨ /;C1gv{y+Mݳi7(]ٲ1>H"3h ޞDKa3K,IE 4/LvyqY#2iQ"N3,!G2 u&,-و<V|,;pI'^P0+_xz +ب;KWt8TŘG.0b9W{c62# +)eSq1+n aݓǦʯ%T v,5AqQh{\nٴ,n*^)xУQ.G>U(̡kb_= +}"շ(`JdUY\Tpw`DNQ H#"iR ? u: c 4d0jjV]Ir}*nI9$% /cfJ_dW;)/5ǃXIPɬŠyQe?4Ebhb<)C0X9ɸbBB6AHplf4JdOJG>z#48wQZU3/)I5lb{^cַ7}aDlKVڙKňSō-0t*y 2?ΒKbW-C6 ^^ +S:\~iPDZJlot/Љ50"E'/IfhU @߳ɪ^R=pĀC"/CNG#떝m PwHg&Q? Mx$ I$a>KEclZřݟmbnsgEoj'0HA,VpA=9Yk= +W~/<ʝUc׬ ᗬ;l)o#$OtN_)̥Ǒ4~Ux+]hѳ[kr?$ F"}1ۋ1h]"w't/R"U5Dz)k֞UF6 g7H +<徽y]q$wce;-ġF6~v Sz^- +Fx#BC,~z:k5 E=ȨW%bAWhp>5فF{2&|̆lʎl'm +4-n +U؞ L@ PnB| D_ePFaE·X*DLn +ȌVyC3_Y/VÚ8!Ps~);ٺPq!8h,f5ˊ_q݃d2f`/!iJYsFo!o{bnA +0(Ok^[DA;c\}a:H.tqPNgxy%uvX3o2G;,[lSGnre~ǚK1V,^?=PLϻ_ x5IF-ĂJ4,m (X R!*u\ -d$u.u"i,Hdg5zelI ,$4dOڸ<2,ƌ  ێ$N,C17'},jelR;d_rp00@{H~5m!npYQxmңjLeލ;Yrڴ<`~|a焵(++̈́y2^ܫފ?7yO +l][eTp!eB$"=ZЕ(o&ky\);ZT1Evրf%WOx0.#,Li?HE  )SMZqG9qKAI-B!wƴ;mH 1 ru=ȟ? ?@LpEagHR.<*0\oh}U>XȢ+'c +"4?cTv +כs:q+t'mzƚN_w+l;|D;y>>u .HoZu?1MB› X:27j$ۅ rǃnP6>&[TaG'*=coh;*J.w 6 LQ>Ze$*şY^d,}\9*EC~՛!5Q^"#q[qZO ͈r@:.,"m~㷦c¦ݩZETCMRw+;a# >_I6DE) :nƵ"\vGp<#;^K~V~r4AHlZhU"tu0'-]u[䧥|nV]694mvD^ +dZO +59w0Xp+tz<Sp fchUO\8kh/Wp-F4VTe܍ Fq[[G2aG8Mi>HKC8R.fB]9Q{>0&;3B~YM }@rELZNlt3)25~q`O RH6@ML<28뿠`[9M)I0ѳx;e00׋&2f4nIlK;ƃ 2|b +?fzF7OM^|:t 9 AYA\π)9L:Trָ" + I{M*a)F9OLJ;u|^ \[שӔ#QC&`Ld VV_/|z@3ۘi]-yKRo26IW1)EvuXo S0n`;  VKsWPn=If +0Ro¶)oD'_I0z)UeHc G9ghbz;%sv zNo:oq\$3qX·g TwgMv{F2tحr]d28eUR]:2A~U-/?= KFL_&Dݨl/rBтz3vbaB\-:M^k\6!:L9[W~bDl''N_CtcIn"\5o1.΋x|j>2;ӷS$&@,`L}YEۿm,(wcBmjbaskƣ0nhq7OJ4-JZy+oSG3rP'-'bb :*Zʒ iMIye£_ŖHD<YDXY"wQ"u~6!M9;n=sQV4 ҡ5 / qT0n\cdH,tmԚ\_UMT|oqwqv"(>$O.keD!䰆081 V!KõFu4;A[,Q/WSWBI h kԂ{f1'@`aOcqV" -+2Ftn~fR_cN::+fO8][٣ʢ)2JX`x3ԧM(* n(ˈ6<  +v!WLd;| a;N"WG,3ՙQ/& >A}LQ.W: R}gaʹe7;4ZYaUF%Pc8hlu\KJe<~e(xUpXx=Fwn`n]p]>yǕsVD>B?[454sviO~dxݾw$Њ'/}sBYR^CyB`1HPoA3v#5³#o΄N>C8sy`Fj;3<͒`p~8(vZ̉ûI -ZN:eI7BsaZ¼gZ{[q^ڝCH#9@)Y$QYMFt,wdp!"2=<\9"ØV9"o;;vE֑ޚ=l-Q;h[Bk>S䬠iĻP<#z—A:"z4 'n@q#MVk(OU3!ߑH>jl}6x?!;$PM="NF4rA26Ys}r4}F]V(_JGBU0%ys&> .Zy, }E`Q|CO6/=HN u;tZf<>i|NH Ms7 n +.-hIkdB=g;hR +[{֏pS{D!îT2ʸ!|gp~y>  Hdj lg*Ye +խR!}kl.#L`Ko2{aDdey0H(~PZr@zcC)jQ4wޢj=vpi[si!yvvC>xHt*7V?)qޓ+pMeX6`oܴ`WXhHђ6TNgoCsl)0p\gb"DAۋ3G`wsCb]{,2U†p(ϱ .(b^.Ȑ+TJ§xZW§R Eñ*psU@n$#dkYƖQ@ظ&<&f<5)S')!(Wʃk*> +# [Dx?"ڙB=TS /R +@˳]Όqoof>dc5# ituEK 4`%լ ғɸ>=wOIB% /=.{ѵOMҽb nq=jvEgTOH5Yf`#p],oYTYgLr$..j<[ʮ9)e!ˍN]|@5 fhu:dϏ,.8TQ[H))|YW`f,IeR$s?U rX`.5%u׽ d&9\}Oo(`-^r# &`7. _p2EW"75¿/ :(P;jαy׼YJkgV(dXꀥC9r1kT=v(:oDxXkXe?hX߅rt@EUk`K ?|H:SnP.U4q*] da %{_z<"\H)%fL)JcƴfN "_iY+ZGzgea<&$5`ssA-ۄY!AA3^AObq '}pPtQcF $I`r%ԆQ* KJ(Տ`-t@~Lc/b-ٍ8t"/r/{]E䉵j5HZ+7!eՇMX:qHڏCЛL9Wzv^|vmb 3!AV; 3+nD>>!D~Z-c-Wsk#dmK1Ob@RW4OK_̞]SŠN^2I&ZP8G>"Kz3_([ͺϼw.QI>iwQړ`iO>,tFlRcy#5GO7 t.#Up[Y>S!@%Ob3@A> `x#4]c搀4JI <9c3)-bLzM\SIO|$1ښRUÐ F&ȞJY[v0FMma7ij&2%EZ|+D +C1'VzT }]x'7KwbF6̨\dĞ O yGTZ(7)Zg7zv5waein;^k,8Uzc!`E!|й]bj +d\ 4y&F +XP-qA" |%@V:\޹_/-˵8I̢*δ8 57.fTa5 + g'ew/2_V%C +JUڑ2ҤJl/|Z?&a-g0_Pή UK$h0aU `]Bw۔/r@zqQI1p&Pq.wD]WY|`mCL3-/HSzũ `V!Wl-3`>݀Na\_4PEzGM$xFaRz=l5ʐq߶ @%l>sa#J3 "@C"`]_*u&7uay(!~g3 " ~`A)᨝⋫ZvPhu'LNf1K$;3m5h܉ضm`|S4b|gM̽ ItQ`w+cG_9D +ˍ"^G!wi}vMḵB{W]0&@馤=N@gY7UPDB=4[mV=(k };qKlդ\@r"~JRrnI +%M̬IilW}U>Y cP-p([z.G +f"LNsIA)xηڜ~>]m.4p΢zF rT,$58ʗ ܡ*:™CjlF wvYjVS/>ĵW۴$ +$@@Yв aDLEo[{\Ao".8\W/{zi+f]D:ȫbxƊk[wAyi~жyW(5"NSDJ}HΉeG  $?(YN񌦑$=ccs a#SZҬFC$f'Hy3CBV!!XU6`d7͌>g7"m/(_ܤ @\ QQw[,B*$5 +z2)}3 c]9S +,P.Kit_UPU=mkc7ZEC3?^^.,4KKbHU.|sT2e@u(K +V%%<>,ѡ6 35SoF{~O> Td=ӹ+^!A̧4B'22^Tj?cI +~>|PMq*a"¢h!?V_yaoVSUT'Ke}|\)H}\22Fb_U^R niE(+{mq ݛ{\DKC#+tOļޙ? vd/lԭArEx냼?/l]p31NeR)$~BAɊl+z~k\;~[~TWo? 5 ȎK+vs}|E}ke覶:厓*N3aRdmQ|ߐ{ Q3QxE˕ϸҶ>Rn +rOo=aADE /net-FYfE;hE2'C*Y 厄{ 06V]1_ #,&_Ýj\i{'E&ivEoy@"nOcfx|XAiN&&_4)пKn1c^&g%cC{Tof LzHt&\8Q7tly, +&ܙ +r%9svpP=O 1MO7-=/(5&qMxeܤAFYf>1K"v{ MUjͬq/-.PyVB"G-SIqLs[SHl^bBiKl+Dl? Vyf LwTxRYeSᒙ2+1Cdދp8Jۣ5_D2sK,ut93=Xwd+}%rHrdf&8ǬO!Y( .!!8u:Vq6̃a;O a?KL|Wv՜{"0rз:nf .HCVSjy}UpmfUN-7z R vk'y ۂVcz5Lի6@#< +EJc]&ȍ0wҮhE[ZD𯆃 +5Msty/QHC : ˍ;f2S~2 Z73mTp&:qirYdRpl2M0!`b Yo!^?! JP;ޥd}08U'WӔD% 0@ܙk$Jͨ(ul-_zIj>Di91d)G|Ժ K i-B?@TB* <_7 2!F/xyBrb CAVmyKz*?^y )R-fuLS f.}ZߤB*`w,y [ԅ* :Y]|H4ρs[+-{lDf_L\[CK ;˩Q04?[HoXSݎ eQ\$wR=i[jlwi-:auƔK]k7Phs#c9TmX'i!dPTLы|9aвN;U7VˆNe `ُP:DNXgC2 Y),%qmRKzqd*k0 "]P#ciP?B&\@,[ }xG} +}h7's|ܩ!MSu^NL X`:$0SֺkyB~P~) + >L|LìᅨyӔ'$MIOy.%f8ϙwσ-1_B "<AJQ#Y ¸p?Rev 趤M .sÂO^>]2[D#ƒ`ˏy\7axMF.P ;lv8>9(? وc-(ܧm^a hwgF鶕t޴T*yϱ wnuo4 GB+j&3MΎ'ʅ?%NS[ͫ_&{э%0@a>veƘ+h>&g(I? v.O&TAz޿~CR~BUᏙGbUkZAkfBisi{-AVWzShˇE#C\KfO8ןN(3& +u?{ q +(BHЪ8D2s6MV_sa7 Dh,'10ͫHRn^f٨ +`]v݆ yVq+olMX]~h򪷞~ԩE[}1-8bM%%MF)߼KelԮ]i0`?Ho*>-VgvqGT笞?υb0Q^A8L; 1NQBObxnf[Jeh{rsЏćLnxto:a1 endstream endobj 3033 0 obj <> endobj 3034 0 obj <> endobj 3035 0 obj <> endobj 3025 0 obj <>stream +HWko_6`<9nIj> (V2d#KR?߹ٽkR ٹ8s. aXiVQT6L_iOV_x{MEVtu ǕiWFi,/^]_%|Kq +0qO]]w}w@F6 fͫuECs4DRg|䐅\w`@%s:=y0?Kc:~mvdĵ +,"8v7 NU`"+Hu ZX nB !QyܶJ[ET(5"S㧊%׏1+RI\)&&F :)q\*:2.(=<P +]:඼sa)սdY]҆us8,rFyw,0ZgKLv=_=tܭo}oa5FHV6R([?_A|`JOWJ! 3lrZ-pIJQoMynZ-1?(d5O*&B + (ƻ B:VV' 1ĵ`UӢZя@ب.PR&ĮwKQ匿ᩡƥ ',mXa5FV '6:+)WPsC1,Ÿ5'` NJЎҼ߇ޔR84+pٖ2e#w ppbϡۯ *ʮ/,2;^yYi&جkEj)Mݭ%@6Ɋ| j1 >g؎׌"0jVt9,he }40Ez(xᜋB8 $z͜K9,VPrͥg$p1X@qmK 3USNKmkMo`HoJL fdljsGu+Z$Oru]}1(Q:fL; +FTD7jʡz+SE4`_+8ԗ]J6f3 j-ƛי^E.kRn^Wц2HkVf $Hn3c*N +KhؕI Ss 1cFg",bC03SBF޺,m>C zJ Rt)v< M : 6)OɂDy=<=Zr 4]K4P*ޟ7FYm #ݰ+z6 +2_񀷽X2$t>fخ"E@SF8,waaMW' H56JĘ*u9HR[oX`*_^AGtg2\h.U eF+m!$?* +"HE4_ċ It܆=uAޘOFuޕE_dlhYp@ax8Y֎wE&%Ncu xG:%P U~tfoV5^QRdۖp}6L`vNDw@n;|jz"Ty*rr. +f(vJY/>V[l@Ͽ,>JaW](bQ%5YՔ@IZH8h<:#Adw-g|(HeJgI q=vMͥ]@}@˪>{aQu cTY{>S+/s +WjNn?va?u!|ٸ'ktӦzZ[8tǛk6o;Z VpuK<,'~4aRs+4cmwl&?(pޡ6+@`P؛,;X XZMY4s3Qdaq,BMӯf0>ՠS*? + +RkP@ 0=8`ȝ$RkPy:9@,JGB7K&] +g{طc/W Y>stream +0 Z@&RP ZONd9Im_$Z]LgWsl oS%W@X|:\DJs +&LD.fykޓjwΎ_&n$ SN;CwI}O+wBwXjMǓͽޒkoޢ66ȪЈybmOjbGףtQT:yX7{5snO {==g;P|sTF݉G3X6`uF׺k2@bm6檧Q3Aw !ջ-x=+J" +,tN#z:şr2uB*~J&@} "؏A#A6=%N'ukToALg'$oxPC8FߗL#hV~^(7Q떗pML!1L@5@HK y^sDςm \0ڮ +6xGbg|=9̋"`Bx[̶3̼ϚJ)uDdZ#zjlLԥ|. JWla.iw=L1&R˝ pO`( &-_ZU,ko_f.ү/p6g+DwOЍtB)ҡoTy*9>Ǟ`oo`乼uܤ("thXM+ΞXq5DUw}9;&{b@RuXI=3Qu-x4*R`q tMcZXyU GՃKU}"B$U<C{t(tJ xt\3N{C<v|~'rC }"Zx̿$ˠ먘?<1U TF[fVnDNE. +~"qA^B OJm?dxMyPR+xr p܃Ҭ%Oby!mA}ذ)1PKO{|۷mZGJi(Kλඳl3~lX }qwXe}xf=Pp.Q +r%[?h 69s>+ dC}ȕ dy"q̌dXA@ >% mi:C9 +f +S@w#5RNvdQ|7t#?AeZ.}6O\j <ǔ!knHAUk8Bqn>vb8|',وω3+=p]JaŲ!!2h*qWvliG;t"D'sM1}ܘk"5xQ$Ev-Hu_Q.l?-_ 6GgXa_goѾ0x9V$@itoJj'y5n`ȕ{M.*<|r0hwxQDayUUe-=salDԽ5L5Ġ.޾fI@v._gtq|YH rNMm0;u@#L;, oq=dX!.œo!қsbOjg8vs8^D* ݁SHBhv*?hAAi1>וtJ//6{7 |Q#S}n\%[z"ё1:3KU ;wT,dT'I&w(d, A s]fTOd_B}n !CdE'xӬݡaEM%fj{4{i'*y} xrqw;>6Ӭ)uʒ؈%[Wh ;*,RIu0y +S#:X+$W;]DL2MSqۆ<(kRӅ:33[xG\mFŮ -c ,O{-xHԺy+k(Ycy'-b61tlDik׈,OQ@Zme2U7NR8 + 6h}h,π ?(Z-]fv'aY3FI&ȣ1=1IpPmoflbCҐ{v u!S7VFZ&[qx gڎV7b;zJOb='zp!@dZ+2[sTC6 _71aV d,V>jvyÙ.\M͒dgX]':tt}dB-䄬Q9p!Cgᕯ1WC:4vF=0$DPZ>ˍp+`d?ht,-WEI>Q8Zs2lm/$8Y!:u~;~ݘ_Aj)FIwR`5`LWQN,4d=aS#FF,>*1sV?L7lN' *{D`o,ary-L%D}Ahbyhv_ҌIqxfER*{6iTw,i.0" Q%{^uv+{G7G7P88(K`rBUqg wa\ݵÎZc }|D/܃Гn擣.M(!665^zid,_aJWS;o sӪŦ3 + +FT$74bSȃZ2];Y]"<58j]B$&P}T{vn7{ >9L>l.A-:UAU7H kYzdXEƒS*wΟVQD;9][Pc0~ۅNi $',n}.,籯C"k25 6GO2 0eN9Y!}b%/ +h,SGҮslxC*57/R +I3M,h%LmFO +Р:yHLcķbuO0Yq]#n6IԔ0ШZG'3Gg #5U=8􎍊D6TqMojWJQuRz<({HrCbB3l`"HV(ߔJ (;A>w66WLF˳W+kYM@Q FC{D|&4R|nPe9#"q\uDW#vI2I^u'rN}҃霏eQҩ!hDzR* nK= %fV\? u|*L6?z7Y/[" Ϫ'cd;r>t]F7}?en+F' v.ﰈqf>hY)PYI]5u74 3ārͯFL,Oz /^.bĨ>@a7[Y,5K͗,y>w6қ +sF+Mǟrt +H;'W2h +fZQQaUִIUh}Ui%2.ry0caDRg 7$ơ1hҀ?m4cye\~{tv֞bfm_NSc+ز +sxY!ԟ.8"3JRԜBdl?4 +mX9TSi<Ѓ=b9x$ ށ _'VȞ &YSXV|&tӣb8ٖXL vA2( *P;eۙVGTLݸY%RYEuschEP~T'N;t(W\2d);aesPK-1DW 2I#:PGJlp7#QQM2Ƀ粃jQb3ki\)%kZӶe/S2,xSՠ3XzeS,UgȆ9'ZTGJv1mnH/Zatn|kx.eKG e4٨cMBLh0Gt84?+Ċ4%\2ὀ⑪9;R82vUM߰`$Ie`}n`d #ۢ4$'Mz4qHi2xV? +zdeu Lj'̗<,S΃hG!/Q-sU_0Ft'6F|*M"LASA[bogX×],_\ Q͝jm`2rcJ,gv4'0{$p8.QrH3 z=$- %1V%hZ3ܽ[|fWWfC+R/ϺLvya$RRT I@M6gޥ8҃L,U' 6Ġ)4#Q߰u-x +UՉ=-.OxisIP2gwקO Q??G*8 Hr1=um8@ABڢ՞çC|]R$ QZlQPeI8 ,kb%h-:[@9;b&{x#RIto}J~$Y }x~(qFCfć0qM@z^d0zpkR AtuWUs+4QyW㪪x4 +XI?&xFԡ9ay'OkȌȻg==h,T"AYYKT&/YsL1jʪ0;Bܻa3nSϣim.~c MYCԚ64պ6H<l͠n{+%/t+iVf̽{(=ot+ +.b_tFՀZ7䉠460M`ˋ([`PqEӭch 5.{?*!iąXX2ٺ]/fQeQ:|UJ#Tl`nx^.IN/l:L[Zs+'NNxKZ%KHN5^d폵."aˡúvtMZIqO8fKem[ +O/rMp}t#є,gĖ3dc9Z9s: ZP3zS}Ga@٘%܇|=9(0[%zg&+nb$W=C s2G*Y@\i] :/S~ޫڜPN*tB,j(dk!zc4 ֞ZMnXLn\rc8?o$ ;7}.ۣWG7_rl"f2ٽw ;'y'-/d4e{D. 7r3B0 4?yd?UdD!5GwDhJ2N51B]QM4Z^%Ҥ~@^o0Bp?ӻ,IF+qT2z=uD{c$4BUCy~RrKm3*bK~D8Ǭ( Tf _^ߗ۪|/! +& ?E~GyD ;c{~]?*'l,X7)5O=J v Y2{}>5#n"ݧ/|>; ^:Iju7nWE@iGUcNUsd#؎va]jL !! ߣ"5ja_ kg0x*;@ /)4~c1H2!Fi8Hc{hSu`%W5᳆nv;{QEhLu6`јWLUG:-):-+ptTӠ +*#f=+=<C2^Rc>-}8sU2cKR..ɆUw̎j}3(tD6>k!ڱT5ۉwO\!PAYټ慻d#ܯϥwq;PMI +^%4ΉA_# 3⑽q xl챳,ԔX@"0CsD\1IbXղpJD0^LS{ޛ>7 +԰ K OA<-Mم2WO8GrmQ! [4ʕb%5$ C 6Me}43m'2%ͧ7G|齡ڽ@WdJ"ΝqBz0zV~7_Qz(FQ6{-:Wt3j8mnnr9=X38䧂:[΀ À:wMHm՞m{o'ڤ:uOV,U8*%Y~  \x\8p*]c|F`6\d1g.ŕ%Gs*3:j0C@Zdaxva\YI y+$rhZ|QHK8JrAez'놫\Hb\an~tYCrWYt;{J2P,сvr[>OlfZ߈3FK!%̣!G8)aX̗>7^Ů㗂Sު\IkkdJ^u[=j-톆VMVd]QUa /$ggr P;}SB +ݹLlj:*y 7n +i}thWSף%ROH@\'kKf V +"=ltkUm0shc tӏXW%نd|w |=EϡG'zl%/ƒmY$ ИL46ZIdz>v,H4YM(Zêً.~ߩiM2yCԏhO ߉+sAvQ0b5ځRWl +"ᦢiv}wD.( +w О]s"*D\b_i(;f `P)FuKup;ɩxԷ.w +ck-p9ȔL^ȴd%Oz/pzyLWYs?^S#O V $^ y^4L*K5d},9 6>`AnnuhɛY>]|l] = ك58|s=jnr9պLuAE$=*9lˬ rOx\Iu +_|vb$C\Ԇ/ {x1vT'k&|aƥ߫mThz.B{JdD"^;9j_ +VYS6o(SG\}#ұ1۠[yb'XcH5kAss4MԔ ,&>[AƝErGc $BO dWKȣ8@Hxt^z>d}P,E녦(Hw,_>iL?knd78▓'?HMW< Q.veԹРƃۢ~~h8 h.Rr@!p*~4-BlfO w"iQN2WȪ9c!&'yv-롙sA3EIAa~ M@=TTr@.}9L473je]M)5tYhgO~pi">}I8C)v[^N|u2wL$jD?84WwQ] ~wLJz>tnޯC~hاjx@m/)^(A@7JwЖ)O [YA>#V"gU4F7MvK;,"jya n) *9RFAy"ؑ)lΔ +iuIz?ҟ-/ct\2x.X9P=SE\7~Swf /JU3Dv ôA)wi|~JW, Ōp3@, ._Z`=':!G&-% B&[LpeobM^YiψlM 7:/5}d9-!M§N6*7@Y<8Mra < 6mlƿ̗aI +,4-`=@Wqʅz2VX@k.zKѳ^ ۴H;k}TݶP|Ș%HYm\5{{tZ1ыl*8ݮ S|b-ZF^1FkB Ja[ER1qw4dqwhK"c2s^pb!UmԅS,ݸj K},7,]RFM1\%ۨf0_[I:ry"G?DUۃqK .Y=002Nf빹:i!.=/'/ +]dbZԬd-b~ܹ{gbqb ̤6|,F8"*oCo$A<4C@S +ŬYB_erJ#ޘ6f6dv3w/ThOgT͌!DPz/=`-?|׽&,)f 9@[7_28>T]Kd.K1nL;',?u^(r[1Aex/_XFN $}B#{pew+{nAː*)䵓JFOئ; ҍ_]}K#0˶)Ky,]nx/ +I}: sV#["Yb UlCH' /z/1i)pPn`G4p*k/Ŋ>ѵb0RqzvG)@ 00/4V~'ì3zt3Ru w-sfWS˸a"{rku +$!uFv2^WkmHr"𺢏܍kYByGLp% :v.VYd^*Xv\N%/1|t' UTZ3dQFشkp8v_A4yϽ;m#'E݁<7^sDF#iPkf3g U~z}$hI<YnS(zEm23jhɬbd8n70"y;wm{ #AdհO( +f ¿ Q 9t&ثBҁ +K--վZeɪVV:T-e +|}s4I> J#4N 5!L 0`|&h*E st,۔?ۆ+E:~'Jt_>jZxq] +Ҧ/Vc(A5"o ʳx1/ig$$Ϻo+FDNiJd%ϝ{"p@Bɾ",#L<k19X0\M{m'Fņ.C.^Z@Z6_R +y-$nor‚d 7R;Ī֨ o~J7 +/SQGұt"E:Iڷ>\\pӜ4-ӻ9-&-=i~C iW" +KBG?y$Sqר+ylwpO5i2/°sߍK'>{+ /WJ+b_@L Epg RY03UxpEGI螑 UG[ȸfK"eCEG[1 [b3U~qrmx//ԅ A5wTW_+}zSHGc9UIk/0+X6z1gTIk\ZdoXE54Du1t >0Ѷ1J X9 ke)"tu.M z$Hɖ'QtlM~QM8)aZWAYn1ZGmr~& ekzc=<>LNR +M+p X C[Q:VB V/uuWIK--}ՖK;C8~ eKZӷ^OVQy6*FAQ?V4 +c9R#mbN9n:"ukDPWke:N.>8%yrH,j ~22c]ǡ +(b@,S6?V_4M|%:q,Lס}"$㶕?h\ D{!®=8S;mfyh&/(Ϳ,3365ӰjIpYsf[]*4=* +*H~W{djSa;LҟXi|$3 +[̢ujx7fCe.}~V|oCo=Şݚc!p\fnxod J*au%eOi{2=d:kplt=PiHdiG^+q5'SJfMRX,W;%?yzݚDv?1۟/ȃ +c,XR9;_N![@.o2 5n,^yocJn6Qy <ȅE8PsgJrؙs+~by 2'FQe7,~=]DnP?pǗL4AXN<uq=vZqSX,>x>^A|2ǍxZ2z8Gk9\CQ_߆p\}\}0M2^ؔςC cSw>N#rC?^.#/N9q f'mÃtt ;בٽ[a+\a? 5ny\M2m[('im +gHv)M564~y]ߎdHU#}-{aM|sB("| +Au>hց䐫/f:>-H퍸 !ʣa57E,gU ].F fDhP\Ez4BDZVfoiD G0p#@ A`LBZcpa#ѐwv>PWlW4V71)NǔkPyc.:C6tGX ZB܀5 dKqq-N/7χu\I s-ʙn~`ha=)|cG~P֏@3QdvxCWF64PTX3̢> c2ejπ6cV9R`Ǚa5u oS!\œl'?dݰ?3D3\qejP7HꨣTpt|t<4o[ c!5p .x1/ c"Bbټ@7B޸A_ +:rwaq;jGܦWu:oGKhrYc +L[!4eˋ&JQ Fj%ș,֗$ +p>"?Գf%u'IOjՌ7:}n R 1@/s1g;℧7сEMAbKt > #L-!3+jGP}ʨskEECO.劙[h*{<;bFٙWˈ*V$x+8l@ +e(Ɵ]Bw~0SmRy> i$S3vlh6Q3 wƾE+ &1xt%AVzIf-6v5Bb6%6=2E 3p,ƛ8gFy:>};6']=kXF+N՗l#tiaՑ>Ӈq+jG(%%t k7,JڑzV!].z4x9 _tTcT cDgtDmuǼtD W=U@I{kt?.5j/3~$@M"W1-Kh$3ƽo7^]I{*ѭ^L4JP=B4LS:,9"u"Qimt t{֊8ޑ/d8W +ؕ333(l +96Sb@(BFMW~sѦ.웓TDiBM*MPp2 S7 aOkld!p(LN graïEFr;¬zv:Vea1ȯVCW#;gR~&^h R)ܨB%fI<13Uʀ8}aY(n3 +r6 &+mZJD& +2NI0;4jsޖefF\|zp7[FpCLd:,s49-@a\W.(Qu:G)"Ɂcp&], m۝~zVӴ~?FF%"}Wrpc_dgx'84ug& \~vKӓ9D\g\dI!T>KѶL>$ +N;n,a Գyԡ=LGo"f/"3q>N3 ~!:҃lRɊ@o>Iyl]7M2]sW|oT WpAg4K'}okQk.3Rb ?aq +53Ksmٚi\#*0޶w,Pe&1II-PcM ~YI CPM(e&D3L^\+W%[x )զW(xb+ZF:mJQ34C%A.% Ez1%*&hMm^Խ#яU4/Xp,bo5jMlxK]'e|Y\9E-W,Xu!j,묝-PPˆwN(IZC .!VV~-7g? ((1+<vKfKE(^ȿB)H\?/ j&>QE.-:_XVA:(fu?NH 6/Z|;==ŇH#? 6x~;lᨿi;IxI5* 3Wb`WZc^~A-8OfOvX[ny3ZB:n `UHŜq [րg#ͯ{5&MO#7iz,`5(ѲUT endstream endobj 3026 0 obj <> endobj 3027 0 obj <> endobj 3028 0 obj <> endobj 3029 0 obj <> endobj 3030 0 obj <> endobj 3019 0 obj <>stream +HWێ}G'S2y- pgZ3JToJJ.N:n#JS0X)? Ppˀ)=?mO*ekvթD@aܶ{D8MGsh~wiUԹ&Rc&e>/Ԥ4e厗e: l^R"g҃UgcDLWe?\h1| +D<4-5D^.e=N26Vݔ11$| '[KB b+T|)4`t[y$irґtBX826U9G!~\r8B2KIDݑ1z#Ժؙ^~twm2%R@$ŤB*9N )G*o|[H <`3w:)H( Lce(&&'M~KӓqO>aB;42c 1SӇOdT]zD]@j9UwrF:D\u%T<9?uX|&̲mqJ})lY5wc+3qs !R2"oق90_"LsEHHb0?Ƿ% >ŹOq388ASf?}CB3HҪYR򙰰~gU1G=1#Y0xlcgNpKlzNדMy?ZqS@vHj519?aIH 6ba_)aE}\ u=Oδ9꛺{p7{I^ט@X6;)囦CSL$p/tpOzy +kz/t Pm/!eʪXlSs:tPŠ,(vy3UA^L@&-[&uة>L2U:gY.vBˇ.{ Ne& aI 튴 Oa û9set4wck';b6aaNf)! +PCujCP+P˩g+iSWcHK =Z-¢c +_`.m*cME<x4K6b©4R.2 1nX-nvNwjmŒN&+PW2.:$_i)*H,s6HDTdKnK,1(rK56*RO)wd=XG@O/, 1GFɿz2E&N~2Q~*Q(@i;VsڝOR: + +N+Ȅ=%p"¹wj &m +0R +pdI}a(>#Wz~EfrYG89(EPb¬g%3q%wո%pvQBN$nA$1bQ8i ,&=Frm{O 4BZX:Uɸ-]yT"i,RaVU%s%ElD`6Cƥ[R*W}hS$zz $tLtCDQ9QN8J~j]meȾkSsƕb)AqGy#>E [ &$7%Ӫ%4/3=TBeqùᇃ^<ccD`m}_(*~b^qۀGG?]Hǐ#D7_Nlվ^|,FBi,]Y\16gYMO?(SN".$&Z|;w$O*DԀp +I#U*YOS$UuΣ*ȖcC%~萞W1;.x^[VK+e v0XWi•R+9<ъLM+⣪F ,|!toy !8qOdTlK;Zsʆ{o7"EA/MXKs 9o ) /_^a㤶~1gowf;,t\:83_ endstream endobj 3024 0 obj <>stream +0 D@&S DQU; +C־ۅCw+78C(P12.ye_!Y8|]~L2JMDu,Nc$gxuDN/-LGNW{/wuS °zey>#BƚcWO2Sk%="ؒ`N_o3@fӧ`*H[j< +όu)G]iX5Tr`b٤qT}; g#Sk[#$E(J Z#%ӷQu^C6;@*Rٰup!8K暃vؚ`i*YWhe;ϱ4P D41mL(~Mq(=+-{߹W5Lã,?Z AO:t:=Kw'QPL"yq Y0jȚ8pg8HB#V/\P΅VUi|XbWBD ](f=9p{-3KkߧeV֏([|UM_`' +K:8WQ&&3F +gۦzt0~0ctv~Z,/Fg%)c~\YY ]=[p^%)?(m` I:<:;sXRMcQPxIo}е=|;fVLwB؉D/ ce͝N9h z&G~?oټMe^S5=|Ly[Xe<*@ +CDEvrME\Ӈ5ZErwuZ}.j˻ ݚ&ei7.M!N4{"ȥTM7fMf Z$>b4]ȢbEa$ҤNӄh@pyۗ'-?529GlX!rbL5Աj %Kzk.se Wqԭ/D|+Kh%3Fۙs].^&JƣMkǹr JWr2}$zb(pSWrH_zl%䬉dyP7'y2mmh1>`kq6i=c I;=Ho8ˆ|ʃ6°Dc{yuQk;}b[ Uau[%};*%r5bYgnAH9"ˆE=z޹F7*gk4EGjX +RJ}۬{'8&EN0eW1V$dWT1Ÿٲҗ*QapOXt k! .&VY2.Db+qve_UH>vwkxø3\CG/mIjqpx{)\%" Do֜I~FTkPqkC-;Fm/H9O,90,Jg=OgdZH*0S)(zo;t#pG2A6c`'P   +q#ZIqTdb?mI1F}3ێp׌ c|V+O4KLDx>"ڑJ-[O$:~:`U?9i#ާ\jNg|'KG99[ gaD{AŸ 1l'|sPtWZLRH( {|qʳAߪNSbj'iTd6,DW#Xq>:fȸxpֲZ}R >2=cNٽ݆ o,< bɦ$D^UID.'j`x!M q/vJKe-~{b*J9 o$JF8_!{a@w7nr2Y%jĻ,HbRO%xEc=Hָ]7;QȊTM伓kr |[@s%/6d3=k %Q!̶q/fWIL&)-)n7OŎ>KWglcb  # y1˨.܇"h9õ\pSacC ӖY- +Gco5'|1`CG 6csv{;COhŷ%Z||dD=em>u#G*T`Iuc7hD*b^/1q#LQg53ghwY̿;K9|dO\9D2>LH: |]N-t"K_wCгh}XCbtF=u4_&Cy1i _]<7dz$5/Hʧh$uO ezzDnS'_AOSs+D?N~`i/N\ށnY}UbiĜ^qfn?GiI>d'#M`ʿll ټdJC =v ZDSWѤ*as5vp04d-n@%B~|(SNΡeCSk_8}M>賏 zFq˰LG˰D/9Qq[MPM&oz&z?IKhF8JLɁMޚ]%V%\:{,{] ?5Vmn?t P.P6 zeskMk]o +ܞI#? .xH<9Q Yh0_6]nRз ~]|HL1.& dH?9 +c2RMbatJ2E6?K T3e@B8F &l޴\{j;.26;ux7f?^ +ڣlVu&ϷLRO}}~Bc` l{U?e"8F3y[Wwn1cf-x  D)d𽆴61iQ^w2>C0>%H?50RUE 7 aq/CB-w,{,RJ2}bVP:j +Ոmoz4,} CV߫ѥa+#NZgƽ7E[_crpZ|hN}Nw#n<5 +k"]'VpiG2:c;}"xE0? %8 +jnfq7GfK6%HG2hzؑiEvسm[9uBU]_2:ﭝMK]^(k}aL_ Sns*JNX9`f S(Wu% 0Ɏ/[X6\GLY[#0`%\YU7'?biI| Z/0Ć!:0r8"0-&7SuWm)V=PNz{ȪmCCQw*fz=G'U]K^2Gť=e\ד`sCeoγhTEZ:;ѥG[D^펯h^ InFKvW{ +!@j|}QeY1 GuV34Sߦ'l= 4=v<*4eK4wfilnlK9ܐ]D@$Ȭ0G_lZW{[LWߠ[QH*΁\Tw#x/f?QZeZu c 5˻b;1vrT.tJxd3!z{q: [crPBiqd5v1H1z!&j굇r!7[?hwrDəj>@Ր4 N + O2/mcckF?(˓HKg~ܬ콱Yth~>5#Fd4F isN> >:ŭ{$=tbmB}dUЖ 5Sk򿣽!cfPÀ6;.^(\v3GYUb'}wA!VE x|E4i +BY5jvQv+(3sUߜIޣ_E/mgDs Cl@AHeX cQ? Y)7nTBf׀G};p>KUZ^8"7w1.U>/Yg7 A?%Er;&r~8}r4ĹZ=v$$ETuB\A8Q DV!HƘ̈#a2gS |HSf( c!+͋e 3aoy,( +|]#Bz<ɩzҿ_CN*S\rNfxy$j&5ffyO㭇n{Vtd̊n~~Bb.INf~VYjSG$uI#kUŷ&q0D$gj{C-S-/_vU,} 0V)=fh/B3M + YOTZIV,vC:]UR,/&0ʯQ=ݫ?J8] !}F%I*ȸIԔk^h6Md +~F=<ҌSׄG\){)`m;n }bϳHy̔[oJFor oN;0%GY|2i"8 E(m9[C%;֖fYo{4Β +rzF/؇[D^jN +]*4?H 򻃯6urVkcjEр`&RMM=>[/RNwЫ!xHΨV\42H'ߤو%ZTԅ0wkcMvx<RhE d;)`ѐoYG2l#j.7*19 RK(zEgèѻ)r(Z;g:emU' &a[ֱ}n< +M";qGgB,D*F!Ý[ m6JH&#h0u28d?KTmK:xnoK9{H7]'m#x]4+77IϙH%MUx%A*$R'`:eRB2 щG¡Faz{kIj!9"[S`r88%ߔf0ާarQ?lO+@۫BzJ6T_2F+ +cťϟe/fvH~Mx|qP?VnWfyuVN=UB+qsB?jrʗxܒI0z]s3m頲2/)[,By4G/z<+#̦NS8{j8# %0JOAĉb`a +;~&S.ɵKWx/z cK=n2:/J!wI>ϭ{S+c“k&i(d5Nz (֖t8 ܼD1=$ N~ɞ?D>n]SA CHq<~.Wb~8`U({[T-Pxs;uGÙNȬwnJ{yes\^|Bvq9ԗ)xGa<>0 w](S"M2I5Eo=zYo)t(vc)֠AנSl37 Ȑ*Q؄$UY75ܺ?!Ei?Cu=E*Bi!rwrBea{b?oGz`FЄ3jaJ󮕜vZI8T0&;&W:%gF. kuʇ"A!8Nz④όaRl3#٩ Ġ*՚ +%XEˇ%]ʿ7h"<)m&n,0TV\G)xHКf%{ח']n5EGcAyФij/7ެ\HlmA]l\eMLykeJЄ%ϝrhD_K[qN2a?cLA\9L>˝Lp]cntԯ0:KAkX2L` =NO'O)84.*[bXzisUճa|*JDWS#o8}"|]4+EgM7|kjpTв`.sCO], +2IYÙ>iCGh%<k*"Nʆ:)B|W3*N-F FDžam+E9lD3=#hgdd0al@l햃 KU8guWk>y1y)40¢7I"2RfU*|{y*-\8Ew_4$ `N֎DRm|3763ߥ +⾼ma:pte\ 5wr_6jU]="b6,ߩ4%H~1AXqK?)aM +8fAbճfWHxdlTCD$"SYL=O.q3p={h +SjQgO02kN2+GkӴS:s% qp~@mb+qvZZ\FڋbsTB uƪJ4;yOZ+RU/>@/,6نlvIh?+Mb]0̧b.8&/hϱ5?$P'^Q[re/' I_x pDi_]"+iGJ%t|wP.muȔ6T/*xvKNF FyuUlQ4شo*IehX0Va6}廱VK h{!:OjHjgbuJkejޅPG-jaIDa-@MUhj5|2CP*A|44Q+zZߚfvjAsy>&IGί?-b0 $"0/8g~ȓܩgE;K?=>ݏe Ї NʩF>+IxHzOS7QɼvBJLSYa ՒK 0ylMjلYsM ~1LOKtaĦf!Iđ< Fq?V/ GAmgRҊܟRG1LՑ%'eB;FxjC#<]#~z2$m ANn'K+;*C2) zhyo +O Loi`W ZkXKj`HC}fq39I>DRC:Qx=5tiJdjF@RtY-^/蠓. ! +.AQ"lyi|M@ݞJ_&Yɀ{Dby_QHk18 OnƗq]e.ѶW$!ؗeU ZSw,'od9dWY!# Lpi'\t,|B8냨.`>ΙnU l~˞C.Z,xX[4 3M Ϯog:)'1hIu#Y^ ܚf \>;­ ޗw'# i/'YR3A2=3E梳VVZcM:GprbaCϪ'pF|#rRD2K?fjx1==E.I:v/4h(o%SfXj[W: +DgGm罹_!ʻ`#-L@s*4%Y< us͉D^4Hix 4z-K? (sƩ8T#!PawIJ3y3Mn3: ˽ ڑxq;Э m4u{c~%=f~oA޼yݽ 'F]~!@T&nEɿjEzTR_0-Υyr6w Ґ&X!Yk_mg2#v.@88jЬ{BKq;pRGu"dۚ oC{{}~K R#RHU՛4Upz~L:N<͜F:"WKQxbI@HOHμ Jۊ{!p ~8P`*qXH"-b{v$1|% )U_kV <] 1~_)#):G AB3pzU DXk+Rf]> En{o^>MxAI5?j֓]?Ʌі].}eAtbإS*`6M ؉ڨ {]sa"ZaH͓^<:A1 +z)#O1pFmɑ//OcB.}OFeEA&ޞfWw +xm"1$qJ6OT 548 + ϩ(&`1? +d5_#Ղov6t?ƶ@TCTC;x[2mhf𕃅ul-t_Kf~VYOpL &%15W^ @)n>M +1+&ϜfRAg~(6 +FԾ1 O ֙,[ nnp.L=*6ԠJ>j{L8V!Phq` ў`gwQqbzV #zeB[<7̂g:eN +)iAH'SkK +}ڃH>l!&``as ă}Dqi('[D>˦ģt_/ffXs?@۟ XJV6YݷMYCbGiN =ڎnТt~t=e[::F[;XpۃzGb7(~e,*b.8WSO6wҋxtv1KŞkg3pL^QADqjN0yX[N;EXh:牏D m9ݑO8&n;Bdq1nTp+2(sLQd^\pE0QbY᩵&鈤TbM+UMZ^z'RlM)U5?@<^$Niz XF0|Z. @Q3v8݁vE7P]  +k*4(XR6nPnl};)'S֍ު,9QK?#Ql%\BKJQ+~9S̝G8]P~6ls||NGniOfEѸ\)jw f4 pڹYh!SuHMUk2SX!]~{͛ Ak!MoNVt +Z3*K¢eHB3GI + +[pQ94 +yןv:o0DkJqn^ׂ ?&tή Lcd㛀mt)+HɊy%~hb릏Y(zj)$,qL~;@?l{Ib7YK-q: yc +5z @d`C]fi]iWxXyKJ&ߐ 1g#"+ST \pBAu洡MI; 4T-ԧ87 c_*z C$kE MK@v_M C? ڇcH`d%֕Z럤3ֈ+FiL߄ z  ? s==}!D[:b2{-zI" +y|$'[.R;E1D'Җ793Io;I,1Ұ(Yqq5\/t>Εd3y1^嶺ˊ0"Gʩ$m|ZGPpuCs+Y*_fT)VM~ ;#2jIG4y SADng<$'gh.ONeM$y]7ʕ;ג&P+7X +H Eö]*& +slR1G|=9xN3bĩ)vե Im֫i AQ aI5zwQ"7>h}Pi n%JnWID}qCkݮϽrES{e˂8n3rJ bL,bP⽼оN+ oT>ʷQT(Ǝ{N6xpXN"KƈN]wԗ;if&lˡ5V~I4n%{TH:Lu^4;_,3}y{f^I2H5-VbY"9V|A;] +ʂ:DKwσLn0 +~qA({miw;o=PׂzyTPi="WE̶ psH~^'U1r5 srCjR ,{Z?8Jzvx`ڈ"Z̋SC+G,)I +{ Km!e<mFQVȸ4(7Hu \$V< 3Z .N'h̥㡕u8+s|c ع@%s@ 'XS4?%Ȟ$qPbZ%G˫_RcW#T @ +gC Ufdm'y` GReUjb)Y"-ި~LHiXS-a=4po]`3>iYk[ivIfQ) _)CPT?= pZF͵'rW(ҷ +/ X2^bOeL@ػWEmtG{kBa $|`}m +)M;ZԺ=Y>C*X:e~d3yd _9E,| *WI +LápN~Uj2ۡEfP$Rxs,@Sez m |km܁~78$yUnTk6$+;\nːh(,?"6(xsd4тC WXMy1K?{=T 5agS+êIMPAK>*m2IL Le]l*TZ19b%]C +N/KUK&kM$V8D2kYy Ky~?!-^6lp3NNg)BTI{퇕;θNK%`uzwS-ROlk*-[kR*vY.~Y(ϰwrM/kYcC!b4A~s} -R҂doٲEEJw46^"Rbz\$Ũj5DAO1914 + {[$J[Ʀ:3v2Eєrz婚QZc j }vmį3#+/'|1cK ?6vj[} &^pPґZ%_)i\\P&Df3}>7p:2 MY:Y(as凪iC8A4oG"ޱwZ;pr1ؠvo +t^R4 j`kxF=hy7i$ \ Y6ՄB]% o[SaE"3/_Ahg ^1ƕ_ghKi 9E@/zv|\hOo0q9N]P&]+5?JȓuQc[։1&_oy/ײajɘT@_;J׉ME L#UiCղ* +v kHqz q8\kbOnL14GNȁfkulJGH LA%ރjsCK~=(}lӖ̓]g(ѝ:8={!Uz*,z̕eG0l)7yv׫%mX8Y,΢{PS*<揕FHTXQ3U {쬧ދ?Mpuo?BcDlD+ n  tΏpcUTm K)ܠF)T=3G#UxFa/fKu+hʟSPakN{> .$v;/zȨ5̤((5d +7I1ЊR\gygK7P&ZKgz|ưBoB+8;Gz +g ^5ZvǍ邜=RzkC'`H3MMg[uzSA͙%=7P'-{<,z֝Yۄ9U]/z.q*k_#6xfWbɣNFYUyUzRP81DȸQ*}hNs4w,&EMg$`?/'$ ԥd#dtE٠=IG6s.q?^?[mM)=q$,ZYoSh>fThAn hεn")dz\|pBu)\̚K Bd;"7u!kQJ7ij'M.몱^jW@)ZA {CFb{ +Hs[.Е9]'P_^YDWa][ +) ` ,˙T0FuoPkXh0сw3O=ZFhz8p0%POnY1ކJG'K.C0eNNH{%g׸h>{Xt&յ |~J|-%W +6ifg,`JJv0:U~~o)0ҢXa>}.Oڢ:Xʔ'Rp4AHjA@ J$7Dׄ2!6&#}U\O gś*?a!HNIpy"c1[`&WP&dRMS}ofj,`|d~iڙ^ +n3&d6ޔiF4<᎐S1ԖnW$gpT B'sl\ zAK$4G|a~@3HK"肤Db]>נL`B_V\A6^LzuJؤZYfw+enfK;%Z37LA/2f4%{ O~c,,u;ƶ =])+Qe&ʅğccZJܛKYKRvy2 #Hg|_(]FX[4bԺ^ _!'5,vp#nÁ+Q@3Kۘ>B®J0/Nlo?Hа g Y >V([nd+ˌPlƗgT ~lo1~gռAI僁}/3/g5D_ag8?ӣX)1 KoOi(yS5vfa$0aFW|O +#r/94Q-(8y'ם m\jnzU9-TBBϰC1~9gWΎ}@Cƫ9cK'beuѪ).~1]E#aWu! -ѼS*Pz$)@3pp~™6Ԩ|P2֊[ql߷n^TB$f; ģU\yw'5<!xAizW>`H䔎~ C٠zQ](m/H*(@?~p]Z)X6w2>#Usdb2]8x 5C6΄TۗrW(٤S!d$q?FB6d4flρɄVȅLC156 -!Mi }J@]0dhi8R{Wi(;-֬_}r\6r~:hM ڌt0n#Kcr2˙jA(:2c4ൊM 9ڋ;q]^#›(VKyrh}+}'M82x}^ښSt>!tiEԅQڕ eqܝN.#zJd6ϵ!Dr 9f;Q endstream endobj 3020 0 obj <> endobj 3021 0 obj <> endobj 3022 0 obj <> endobj 3023 0 obj <> endobj 3014 0 obj <>stream +Hn1{?Ŕ`v#DQP:Z9&'K@.lK}g$ ) +k\ÚU5dȳjy}ưoU*G1G~I o+tePKPʡs׬7nʿ>stream +0 Z@& Z_1Q:;ߞmd - LJ%RLO?]/ [@Xi[f: +Jv*2@0I2r wiyކyMٍtyDDQ"͸­w>KCbϯĸ^6V3B%{]=gы&yx}D,VSC~UAE"&n=^5MS U" r3\f~DHm +zR*wj*I~v2ݯS%NwW#AgfBCeǿ@SSVmfhlS=G mJ+ꝞL:d'4)ts#MD brb1%~[G^; zO2!5:nڠ{dC8r uPG7T`Ff0琀iw(jO9w}x.c)12F1rGO5;{ [@XAhԏ+:K<"W=,N6MX"9Th#PSsw;2+;h[a?J@MJJA8b )-& +SV_۾<fԡTDa6EZԫM1c̷龮X5 Ѩ̘Hdr5!vu&(qC=k7 )܈YoB"`. endstream endobj 3013 0 obj <>stream +0 M@& M: BʏLW'5N>DY|$|8Uwk~ 8t1.X:6zACP\a{*Y+ +hqw״6B὿о􆨳;D²`w + +K\'ߚ4 @BHnV~5xێP@!:F"^c&В,,kgeK 7"%A#y6\{CeHsnMLzɯ!)}VE.m"+ZY) gь_ҷGʧ:0w d8:HwAub'Q-a CY7Kp,_^4YM<{R#f,Y BV=_i\Cz,1HfLQ|qDbi2?9R=> qt"tMFv R#7iqA?W^I=FDJsNDQR8 |?} t&M?ܩ|&s~*r4$^b"l .e^yvȜrz#nĥĩ?2Wu{s?o~ ; +dOrg*qCYV>j7ӏ/jX!h8/JOrt:ӐiMbi<%Z:yG;֖_7D\6ndJ&2ld ^5TpuZN;+˵,mePc{.w[bYY7)pxDj#ӕbf}1-^\%۰w!=p3D⭖??32kUiƁRBQMaWN_o}UfgRgu +sZ)VA =V'u^B拝Qh8BeRҜ΍ģ0nzn[:zMZ2ρ`։Lq]\H6p>i91J2]y}םj +M}HT`b0yz{[@dxb̑۲Cf*,xqt“peI 5"&>R]`"`i޷b} }Xꪗ!CI˷&$vHe.},:Bmxq͇UY:>T >tuM_I +B|$dd3&`<+𩝙=c{{ݛuO:?FחXU:\-Q㟚A +|Vj&s8 +#v4qM`t!jaz!/ƝUgFǩ Ss,;1c^p0JMʣjՃ.;jcD}.mXLti=$# TfetBfyo4-ml:9XfӮ"v uY7jɨuP^|Q:b$(,w1}˰vXHsp`I^e pnzIn,Ać(&VZa“6 +"#. sͣn} o8QcG'\ugjvJ[YMSCz0Dx/옛cXz#ٔ- EšgwrjYw,E.ܴCTx {bQqI9K(tR~M>ѰXzޟt89D ^dgafBX2MUU~16q +U*)iAcZj}23[!i wDo!7 ?#n<$0 +J|˨I:m H0j?Uqo ʓHzl ]sn9$Sjv0'X*BZ(LG^dC6V=U)zq;l.Yr8 0&Ō*T,VjXTF˃d +EsD3!"hu.8ўᚉLI樉2rUqqV]"6(Ҕ8_|}U>cjvVIڣGǫU8\M=<'vbk]$]?i(}ϨW%Q`]#tHO;lk WnS]dS|N2c5 h9'Dz 8u5M[υaI4WڛBW7Ōԑ_l^_Gl G?#Vm#{w_׶ 8fI A5P@[ nd8l[h*V sHjXP+R#Np"?75CSɼM\/ jgֺ̰?+,CELQ?IR8O^0%?8'ș|4-d" ˍцd(8,R)TƀBwdXf2"o3su57g5nPӞh#iӆ=Ё9MMqC"ĝVUԳ1ecWw=Ol˙)g(Dulu:ڨN\5qgX'=9S 4O[]zG36Qpǧ7O +6O靗> l`HK;TZHۉzF6: O +hJEƮK-B/;E2zC"a͖fh_M׉{X٬Ow%įu Qd:֛i = +fRE47ԸcXbI Q+7V 9$}Sb|4(Lhh%t7(xN 1Uk | oP,y3mQᴨE:gt0e4raƵͽB(b E<Ja hJHYd +D +ibٻؕf#2w-HxɪCxwy$Fw%̯`'W4x ڛvz-f-Ϣ{g6wY`Ͱ+|Ⲻ1OcNcA^ŨpȡQ+G"LdZ\6[\WvDAc 0Hvlxz/$,oif +$IAW9l_FtAQnuz]d0=ĢY{É!K|4,4tkזRquƐ:{lB vCI}z1qK@@MUײ\0n_JxZ~C|cX8gD+pLZdkF?b$bm\aHϬ׫d;HsCőܱ9OE:T' + l"R '!aQ-b\}A_A S.]=M s {ϞkSxQޠacw]%^[ޮF-%h/;Jl*,Wi7 H I+hnЕonQ7[Qs EKtW`dr? endstream endobj 3010 0 obj <> endobj 3011 0 obj <> endobj 3012 0 obj <> endobj 3003 0 obj <>stream +HWYo#~ׯ;Ȫ|!؇" /9&&g=w+\cv쮩_o8Hj+ $aHRL01^0}W_}?‘oW7w?xEV7a_~\iX\I] !o~;}df1H//]#ݟϔ @He)h-,h +@Ägڿ%E7Hۄt@HɕQ?oMLej/oaqb?V.ont#}ۇRE!uSmo.)A'p +3SAft`D(3`nB>}!7%u e~KX(#$qxݑsx@5>H32} #4uQ|0LUk4 Ky#$P:ky*j G~ӭavJRܖ Hj~٧_"e< N U4lX-IUl*K@ qEM7KAy?2Y0Ľ["x44o` L +@NbiZ>QIq.wID)<+]SoJ. +lL`0jsG~VS0yB/%9dǮ#f]5bKypR%ApuQ42g.kq`ڂxXԱ?ԿUa.Y2̮y9U3@\\yJ:ex9!ge cX Sp!S_j$ 7( 9J43)q2QY##04톻vn%O{?Sm9I$n 2`rq%g,A`}[XԀ}#61 g^&n +xk>QDO쒉wNTޅ]LY'xw(u,8ZE_=]9fLjggLa$?0JЩFl?~pe Y VM%50/ݺ|cq8WL(,WzNyΉڡe4 b\FI\$Vaw["vWSYE]MQ^2O K"ʘM] +V|H29q-{>?qvlW v⣬XH1&rxc \,Ggmǥ b.H)C;|v*FAafPaQ5zvw~MkGH5)yzVnHv{E=jzZN" +0e0'kњXcf#[V>$ҳuv OC;N(084Î:P @Q +DS~nݞ\[P+K.A"L,w5Ht,q|8M׋Z00֋؟垖 >mR!US#ڋJtĥ0LL$+6A%G^ͻ3 8Hqzhkj !8L-^L\f<7;~cljLs +X,b}CzF˄0KߜѣT份pDZQ~/`3/`/tV[!,Ztvc1eL.woFkGܓ2+'[(^5``'֐Ӗ65L[ɑz\=_bNe\Q ]Ў/w@ھ0/-/SҨ;$S7>Ex&-")4A7ilv9);"au?7vʢOq>\ =1hTz(ˑgJv6@"ۂ(l2Zñ S 3y89^XU]˫bpo>D>}6K../uƑ^}n7L`3?0:yV܍U^zH: V,O;X}O.1D",gSq471+3e.(zs_#u+uןFĩn83XSYi1qsprJDHD-W.1pc* Mi M "0Lg6foodA{X%4G 4_.G"c@X=܌ƒ2]8ݽZ{r{ A=Qa,(]NBX?ZU)RKNo㖙jR)]ާнj[ؑNy3ph?qFi-67BwRdA֫_Ow<؋bL?+* 5Bc дv} S~7btxGXZԂLJc\gJSo Mmی#V+z;P۷|%6'dU\:z r $~$IGRH YSMq ђJ7 +xRiw9]HO!Q^WGRaqڳ|w^].ݲηd€[A쮛LO p]X uuM. |s endstream endobj 3008 0 obj <>stream +0 Q@&c QZȢ]? ˪x_=:!{^3%m.xM8k1nuK( {C7RR(r(o,ԛ\;dれ 2F-$Cy9Siۋ{ʧ:4OYaퟞ~GLcNOPnOlrGv[#-n~!Δ6߾l Zt|jXW]/q_h*fa +Eȱ?dr.V$ 5GBA3]/5&MyEYx?P^B D&%/ WፒfB +wK%k{\vbyq5O]ޖ g/ +whǷ}aK"c5E/4{I筋@ZG?U̹fAubb*h~w]m7"mP)3*zf|H +Ѧ{eGC9Fh@2 +i g_;j~P#5| +-QȅT"fbmRF'–p6}YG\Ѭ/Lpc@Ek?VwC6:} OBQCߡepw%㚮2M--Me:`N8pۣ* fGB$Ob53Hap #vIc=vV3Vȯlf[[i2iS,~兦A{_= +iHWo +uP ZW^\|hJ#BټoTnŋk'GZw. p@.aܒwI531UQUz& Z6CZ_1y'D3klwd)kPnZ9]RJadi}9ص"A8 cfZ-:CLkU1*ɲ/I*t;]Jy75^X*(x؝rm +pZ'=wU0̦Y1_~ު +K*6Zzn4$Gz%b`-5J +Xč)ݞڸL`>ʃ$bԑx5jُlxi}51ɾbRL#QkISE1뤈C5'vؼU`VM} VU;f?Qq4 ̼6K2?g>G5$SQ9n:|s )G1h1xj +xG_߆П]\ K-,3)0RK+=\M'MzY \R^~H;m +Røob!W\St(p/26% Cy$+(@y=2-t>~>!Hz; WQ)q&4r,*8nQjgNnF +8u~r\p0+J~fuzoTmoP…8kLQx&[4ޤc Bо~d?`!5F>Cub`<{F$}~4 ) |+(^.-Qp^yzt^Ae72|bUVn"n{?ЙJMiy=k2Sb>ي0j’GǿӽX>?-(Fd)j?i'dڦ@ONy^=ף!Fbh߷f=ɥt_wgmP﷐(E0+v/Ww,<*t_1+֡࿧5h/r}N+`G_ "(%UpNdnt(\ P2}H_9? ?|MHڥpb0kMWzzoZ2<ichGb-\M(~Ϊ~|O.d'agk:z}ݎ u23 %CfO0jV Y xϟu41>[t~F1twE<NlR'IZW8ϩO"=[J%p֗XLvq)x>|?WmhYp&wdp@gK *kbުSKϡ?_9 lbԕITT=fYvT2O:p]aRr:.x`FROA>e&ek+dS_L;ce>k|hԂLhuv^rIc{6u8:ؽ2Z@2Ym%/„Qv_ +dX7,d]z=G XW^HQSuYmr%! ht^> j8e$ I_c|qtV^`}0Pz$h>9U>jմe[d^տwt[jpa٨gjIn}l}.ĤyYUK? jy[bG(*"Fd + "j]h:~rξp-P)s'a93g}1mw?x94ڲey(g"6v2ث% -Un*{nTh: x!u@j\lEnI.hݟ0kmE>ȀHld_iTOpy`n<ޛdɇwj[=B0/lŐ7Pk1ń( W[?z牷 ɫGo=cLy~Vu%ZZ?XɌ4; !Z4 _ v?Y¾|-STwk_-sW\UC:+׏Y9,Lpr,"W+9NP 4gVE䣇EO 'm Woz6U6R"\ +*GHW)CH|}AFy׫ia_7.5X6}N#\Pq77nAl3Qf@$6XcL+r~rA EDJLrg#=sd"B4ajS,y UKνg;'~b3+Yc"렦IAܝ=SɸnJ3qۙ<Ċq鼭I`Wzr ͝QawceNt?g'MyalR#)g\o}X͈G6uˌYO"Ћ!#&&F, +-u_"aPG=_Kغx#_=or:;_EC0hogVQ1A27}r _nނPu4/2f"43f) +X,#$ϘSvv6 +. +hb %ɹ k5Q +KV7mzH +74!/U%1ɴDHČ&Ԅ¦ՙI*%BFRv7_;au3G~FHfH(]]1żKw(ܖL-N厪5Rdn SRJ;Mu/L塓 Dz曅qbdU\ؠHy:_N0-~*?L|g9A5F+?CV# {KgL0Ms|X( 5nᝲL,y/YgF橯=:AHT7(R04Gqme'/+h01qq,}H?_oJ)4[ltHҞT9=\>([D[AŸn)Ab?+ltZ)[G bO5iK?k,p4Sd^t i;74˵9 EᏅOBvN\5R<"U(5^yƓd/U"@\})=(oFZW[F8MO> H8"eZzd٭ܭz|rQa'.lwX49fwO0h%3r)~7t~2p g1~WnT`(cŃ.#Z1\ +᣺ uJ7jEЀN`g(c iqWxNi3Ғb6cZy 4o9} +NGI5tK^&Ղ N={. t1{Fnw&B%K ̺HN?q [Pj3@PREp {\guuF>V%vv&4.=clk߇HsPYꓥD T]{Y/?abXxa]Wnch~~ +wzm2zvN) +gQC|ѿy$t SKRW=ܭSO`R9hڛ,Gi4 }a'l-5|sFk\?zJgݞ\gډ0w kz6Q˕8=J;'WD,tuM<]ق$8&ճR:4@7۬u +Dк \ڥt[)x^]N3^C25DB x%_=.7%!v0<9ř^k T)^A\e J bQV@06dpʥ_-yuR͝Ϭ]Wwu$3gO/t `pf%zmRc4;xkt=3q +|6Qj0;ŷ_-Vh>NOt"?Oo1>{+pi sp}$iV8HB?Dr}o_ H ENidL7 +I3+=jآ ~۫D+'8P0j Vy}ķ$\5 Y.xXa2>b$DuCB8>{-#DrNl^,B衟vGKViմv;c{_m!941QL] //*Ңx4A}-sAlJB7%* +-8u C$o{]>θ(5-LhOoFo=pZ +߉'$^2DjV$}u_da}u210d@A3Satx]+r;B`1`l(:cNݲ| u;ң [ _Mg23Vx%h4k3lInw+H&r;+ow*KXAY@7U!%\=- ̻.d~ +&Wb(lg+ӀSuUzA ܑҷmsKgR~kxQRojnǭ*vRJF@`MՑLq8=o ==t1bwkFa- [QF 1Er#-w~$b@4TpiԸs?p0bkv߭j7%N s4o +r>VܘGMGPnjJ5mw3g*2j׉8keutD>_ooye>" wr ,/t7YgL&x!QM\jN3̃W-fЭn$,W_ 6iFMuPGC7`x׆?ջ v@w%F:at_cd*LqʤX*9+a7`j#d=1IDy^~22;gw|<;HC΋np6J $}2T7밼pI޿EpVx;gF(*gENr+s[~po8<KB9x s.vQi1ꎿszXI +N.pj4T3$g-vg#7YGnfJoέ}2"%#Ҝ\1ɌW%}Q`NKh'~Nh{XɁJQ*VÕq%ެX-RDAgf&b_<Z m:vg`6zPO=txH@ByaGyX+X3sRA,neĆЦ7ǂ"aAF&L.s:WBRH\Ije#?AW%AIL9TdkPMb8N=L>{ [Pxa**@:ͰKA>QK|'@+Yp%Z_vMp xMz(xXHȘfzF$2pq>?((б?Dft86-^dƩwPx\i@@MMi{ua0vHbKL%L0,0Zkhgd(r zei9w Np]nZæZ0Pa4hB"^Z0!nzsO$''N[M]?wꅈJ|"^'_<%6} S<<бj#⛙*QPd;V !1ml P^j;PkriA"Me +*Hbɏ +e/Ds]vUL'?/FNQ[n$B sE[ޅ Ċ:m?7a>K7YL߈J){995m`3xL@[M<~I0K^1,4ŕy*i+&Ya %kk_ y+"X# .,;sd +D&8ˡQ+ݵr(7ˉNE$W ġ1EmH 5 y骤!ƠK/*hmEh%֪cl-d?3ZP ۩瞊ѱګlC.ɸh IVl[nLqzrP"VXK +(Bu!6O=}[ I_;!7U8yV.݌k^qQR ve;ĩ($ U#2]z-0˝jJj?m(GM[p]襵I3(5=k P$uece(EIjKCsE҆ j vk̎ b 9L8b[QEfrR#Bgք9H V~QZht3I)HLSmK&L$u aOA+4Ar{#L*5}Tq6?2L'۶ hksԗN;VpP4-bgv[f0cNYO:ipöC 6}3u|Eg*g|tj鏃(mDzxd^ɩVIђdkuNqu &ZU5LJT.vʂN6vJd~kP +~9`oJSEFВm9(*:yE_άo#ycZK]h7԰w3M؃Wf)̡ eӲ:ހ2?P#B ֙a*Yª0ɒz2' +#F׷9[!9hwOO3B[~VӽtLd}g'>{ ҜAP)1:Y35٥u9qX]ŏW;fdAdU vDB3-j4%̽(8;mhԳ3 q Rk-)˃ +"%;x2?Ri%j֧Ϫ%q(C(YH{+P /zŀ`ht˿F` zY3W&2h`(E3mލ=r-m6 +Rë|(#˛sl|N!m__<ؿB/ +6jD5{hK2&O[Ǐ~h}7(_d8=?AXhaa=Pf4[U\2j܆ ͪ`$w6ǧ}79wZK! 'F5 + N|qujRCTD$x M_|~7=/\Q+/G!A.#dz ,W'ov k=Zs5,f +b +|-I~y:coe|v+Mqkz ܝ_VIғ,+CtL`Y3><b͌ݰȐ8BҔg)Uc2\fbI#SJQ`S,t_AM(~9l.dks\ v.ZZCެPb+mIŢksk8{B':Oh1+`_CHv0's'2JI`zEW > + U/Y˷< +FZXŦIU5{ +D TLR'jkEkPKCA0|J[Vu24c"+NL!Q*S41BȭD =~>G鴖. 1PBt_ƆZT Z잹}?fG .PuX5-JTDQbH 8:nrtV`v \m1ŒdPu+0쭐f"90mly~ [}c]bT=#kڢ8c;{M[ْGb6*.xEH(;dM2ܠp;hۋos^{0 4aYYc{c2Y`@ oog ]3zВ +* !i͋9]K)I32<$$؟/S@њOy._Sz. XV,`je̖"}ϔH[]%rzPMXRoθّYI>[̬W1OQ<؏n <8&Y:߯=P8k3ߖ@c2]ZQ^9դXYpk LI wޥHa6TċV=tӺkn\JB]_$3 s)>ASGߣxNwCOMU}EҖՁ%q6*wU2po\gN˱r pYԊv1e(_L,ӏ^]bfEXsI-sd'u1۳IG,H_KxcV>V".p#A@B@?b@G:7Bc;꺑ҺO/"~s^IQ%XQ)dDe3Ok{Sѩq8o[@瑁^#)N1C +ܑ nS=*!2;,y*?vJ| ZONAX/ȴ]г$ k\εra'B27*r]ch#.j +CBS;,W ,36KTFңHˍ3-#@zZx,yP _lgOTʜzu7[;IV0BS8)u8r?ϙ d +AiqR}͢x_\>JwA?`ȟU=R3iM]]h+]j(XY +/:z֧1IG)'ѲffGsov[Ѻ5=͏Y͞kE>`?T[NzPhp{`v/ɸ##[vt]//}$sK+|1t{{qY7}%ȐLx|2WZl_9?Mbҹg/=~Ȕ}f@M^W/^[2hA +&NbCv1Wq>hV&w֖ +bNu!zA /c}[q4{DYZ (:NxiO Sf +Sچ[| ^zd^Q!jk8e 7h":N]CeLj{q_F Ak`a#οL19Fr4}Q@}so8$HOӆm.0I`AGG$+5}7/7*a"K}D3@#rdҘ7WF!8,j ƹg Sxdk mA0PpaNIF&7d4g}Bָcbe1 +1(#dcTz uiG+(r=nR]4Ro :#:zOXmLZNBL%䘻sqlCѼkg>}0~K[&4>a+_KB6[~њCnt j'KxMnn&G29 /cY6"oS'3>thuʇ4~kd&5 CL-Y8@zߠi DqıH'3 *5dv!wn9'u#u#?aD.#QWs;W(,F&#RqK9;s4Op2rIHEy+[xIzPa}k9Qb#J&0I|{+[{Px N(q~D9xMه03XG 8+":'߲Ĝ˞«ςRԮzX=nT}i3~TjQ/,PcЇ|} zpoG\\=⇑|+Zw679YU%Ѓ`tsIm46$tJ/47$'Ԓ$f*0J.V~ꡚ$%D+udM29aH1)-,qIDEct;L}1h䠗Iuv ĄڷƩ~ȹwA(SF5ls9P#h@sҜ>+UGQ~E3 qo(OsК3;ϙ\pqe^s_pܞJzJ6o'ۀ9:Z{ʶ#KvAV/C+D\] +݇SBo$O>I+QcWں +'ӃF֖.@4y"ٚȓ2%-]59z +Y%c!ۍq]ƈ{k+l`Z̳v`p$Paz͍Y8a)e$/Y>͖j73zd=X,Θg@e_7$)5W/aNxW +苓jUqe|JA!EvnԤsv an3S*8\W n6WľF&c>LKW?-Qp)|$'u>cHDg?gB0ݱW =y3,yryu[;>73LVZ~2k~xJP>3pEԦX<v( {VG.~F|䦂E<ʒN|pkwD֠ 7U Ԃn/y= DGte!R +(YVi1eG$,I,~a$NJpx|N팦 i*uK +th;6ºo%'[-_SVl@:?!@ +y81GuTנ̌Hrn +MrQt&s|\zoؽ'.6UG:e@*Cd!/aܨ[hj$ I`V\ԥ&>Y2V99^}[EF;lݟ0j^@-xn"_`o$]:`2\|.~7ƊDb[Bv/;c- eh562CQM;!ztCĩ v*q4x +!J8>c{(@7ֶ‡j#=Ӂ2 FNCmw@)DA+Ԏ4j>z$//YO*yf}zE_ z?Y0Y3301RyU -@$nF^휬ONA$w8w:Y6s(iD;9 ?n4ʛ_tWmq_/wm>yP2}f,8w.qMeB.rs#blǦ2wpprE>ˣN;`2U_Ø GHR-Un P"tt 2q-ֱ Ľ.8rx(]c Z\=ֲ&y ״SMSCu_*¢IjMVRʟ,X$9KGBvK P4;D-ͲM\($˜\_Q2|{;2OnCIxz4ەxLn!V2Q]BGIxV[\N=Yʠbđ/)&<ΰi3=" ո>gG=qrAЙj~{R*̅^2/jhq3=)1| +@J,yؙ1vguEx`2J8ޑu[ K2I|]'"L x' [ho h8m Ŕ{&peǐ|A8ZZ.Pޜ몠V@t8zMWJC8Kw~b(MY:\E⯡9Zn^;MXJ +26[ gY?:,`l +cu p[Lo{4Ln'Ic7܂׭h' kcx#h{sCE<@Pkz>jDy6}&VԿk1s uh"@_Ŀb!Q+U[_/d\'P;ơdgGYa8 Z +cg$ܪ̖l=NGVGgkNc205bmqܑdj#.|j0e#L+!u+=0b"'[PYV*@ClvJ4X *l O> -"è%oƅ\u%haq`j7>"JESmLH`Ɇ(( mޜSdPYWnZlMv bUA->0p쎙Kh=3L!OP2X%_ɞhe̖H-1p8f…~!x"Ɯ{:7[afq=%\"RB,,z wj x ꐵҬ1!ȉ- ~UqS;]{j7?~,ɿ95A_.̙آ[@qԊ%!ƅ+28_~{/Xc (~Zb(]B;ՕU0V$TtC}qAj%͇PW#_1PqѮeiw{T/yL^iFT-J'ˈbPҼq0I?|;{2qso0zq`dav /24g/F r5*)yonhN%V뾞&lM} /J4l){JM>G;UM`R7ėy@\gڗɅӞb4ud<\4ԫj;ǎs6&*wO)y*dOPGK^F#\ 3RȢbE^a@+q4ɕZ?73]Y}~erd6w'&P5"c?/e֎8dz+R0۔|c$@E,qܴu̎O$0CND:;|,7>PhC +8'9͸XJFcr@M/a~]>!w#M i|f]I~1ñ0aG-m{ӮDgZە:9K# ~UFlRupHp6\$#Y!4.هӜmEweFV?5@7Ǚ8?-Jr?Rє5+Qj[LK^QΧ*qFXp0\dpr[b'P~,{yM~v .[cA1^IKE{0~EGd .vU0A9Э:4v;~^8D\4B27/p1$dJA6Shߞb( 9</,E;#0߳I}{,JIS~OnQ> v Im @4|:] +|w [b/ CPq7؉5#P'|ryWyb"!z90$qw!vNap-t%RБYިqf&iu"٢\}Lm.\F7v"}ED~lN &(ohAc_t!d/vF#{V⶿dLhb[5?;4EbۀD~$J.VOۅSnJX4c}'%v (Q8RGZƌbJsT +Ph& +lJ +~Qĩ|$ hݸgwlXۧ iSH옧5_?D%҆a1bJ>(qE$IDs7[<;m@Mo(dsTʚ%@kUx8# +a eK?&ӝ硒gÆF[4D\Q+JaWk;ך+N`;< KȏG4$M3t\w5q(r2xڐ!IݶJ;lъhJWwnD#z5IdlB1KnF)$(b GӼyN7Qbɗ?o儸[HlGzagzG"w`'t_@q.|ӌ ~J3UtT\'fuc?h ͮpC>YHdX*_2EC|"РfK0QIC*Q%a)'{@<ʴFXof[(Δ4|SR2:~!Ϗ9j"K)NJu*D!Sߣ?5踙Q 5_90^YQ&޿:3xyҥePIU t :8}VϜ(֪GPw3 w@ ݤNrNBjjL DH6 ֦Ofm˰ ƽwW6-^HK=?4~ S +ELj4,I+؉ܯmdP|ahs `|#8Y<_!ou.Hy>re($R|ᠽAyUM{#1 O:*׶ꭝtlz0ZsFQi)S& ~ (*by|fzBϧ/>T𩉘 +E9:mqF OwĹ.N\Lf Aak^ ^}NkVٲ|@S%*/} ~=Py^6GEJ4e,Ϸ*"ܛ rtT].g|;.$v^ s i ̪YV2Gr!zn !]M U0{7C4IB3fcF$΍Twz +CO% :bX!Ki'Eӣ7x)KB q!XTWNLxVj/>AcsuF?x)yDAU<{'z7QWW,aO݄ot} r VnpQQ Np#@#RQWMChbIm+eW(I_j)XPCB04zKCj?+slLȨ]iBdDQýP8y/B&CvtVj՞N;^N\3?Ϻ8UDŽy4 n? '_P)dnlUM9J&AUU3Ç"K62*V{]bn{8qGR e[.TAxQ](52x}$l*_SMs2LL.)Znث871kq-d-\{Nv2!~sf.Y$>Od xGR䱇1qN_DO5eIڗBI|NHqXYU:h;8{ڻԸo_K?bNK?/[ lKK~Y7ATT}u\LT߂{/P΀,O+fDBТ=S:A(@ Yg[P&4ibyhwKBSmۚx^Q'.!=5DSYbȘ<)Wbh/Lh%uwx$%" ;6,e4Q'Q38 +e_^>tk"O84q`7\Cf4|=dn+BIv$^Ǟhi*je'șv6J|ԪȐاoDROq6Sܹ^N3N?`2 +f(`f?z;iH9ai5$4-x~r2DϪ1/osjgD5Ƶ=?ej啔ґ\Sw扺x'</̻L +flf>^(*rdVI K(5ZVmMwT]Sf7?g+V>Ϸ7I1Q熈KI UHW:jS\D,QE5LmF-Jq ,ƛS$bن -`D^S0Ͻ[<I\r}}f$ϢlD"4vKoR6c6` ÕQ[;u23֕/,R۩/\-(zJ7`|_Oži㕩LΖd:9?,BߝA/ PY o^I5,ԧ'ãV}rl0jeV^ȩ`\HWg[Wi{/7bGHH3 @x2O#7-d[(~0"\»T:"HR<]vA6 ,e%3 2I]nh<.:gqodo,yw1EG՝n(離p*M u|)xJB5%-οT]5}2=s!m3Vx\.?>aLjAH/9\?VM|;.XJk>N7񪢨\~)Xz+&ϙ5N0O.+.4)aHT!r./cqr77J!Fҁe (aU{o+9U*|[`8,iXnCW`Hc,Չr aY V=ƚBKKohhXCo/+Qz*Լt(S,fn,`%`CKWOEJyM\ǴgȰBX?U))e +F+svd~A;0M\C^\qkrec)2C|A⸊$ 5U~ +4rl7 )fM& +H03}-ΉWD̎;[Mɠ^M.gVYexRR=z'0v5' c{|q`F xor +6Ou@opC.EJ3`US7㜈.ںJ`(4"Ąyh$F,,nZ+õN5tL;@tJ;k +6 , OAODP6LHj,ٟ7މ%Ue\P_r5gEum#nRGC\&3s6M@$q)sc.=-#'p[UxJc81lfVRc؊](jZw3P9|V~0=RMWUaPӏտYCW!e[*9=ȵtkq1\6OVɆ ({|gOOD*Uw~ImX޴2Ud +I6,RWO, П0mY $:?GovG\XW5V2ܿu3Ϣx-T0}TqT:Kik}QZ%%0-8|iR&s#ma1Cn& +ZY%`OwzPs^ziz۔PDHCv;_ooe1GVV).(Ho "Oa Q?@t0ڱŲ hY2>%Gq%!֞碞Abࢫ8*s`~WD\REIEH58,1ɸKl\iŇԠ,rJ:/eբb #zPV$/`#bQjҎ) aR.TcwjN%f `W\y^ Yר'yAaY⬎Cşooī\t5rjA˻YwEJ{%$l6+>TM2`nmECqԷ:tW *=s,g\ , 7ޚTE^3]dO?:%RdXM0dvdq4a 2gEȨS}8A!7NKډ;]&owzy_Lw"-܁cbFy>_3.-4m+(LB:!#L#˭m&}LGWgz2sK 9ŮIj0(ryiw06^]|W @vyes)˧yQțfgII[ҕb< +). a\Kci/K\ak\D]Np,Uk\WTk7|mԡJ'YPuUv{gib>p'U?~Y)@uO$ +č>Y$4e"pY\l/e.}1m\4$_DQ $Nmm^DE 'LM&*MMԹ5j*aX53jvמ& 6TR{f 3+7o l$ӽKuY=k/}LJKG] syJZC 굲 +?XbC ^K[RځT>kj~nw"}(vRG-d"HqvaXJ5h :g\輜 #|:J5\L +&1{q^w_vkqphhn5^qf_an_''3l@j)(pF_y@2{'d1R`H _$\Ü]f$yzk|)nAr<xl_-@PfjNjO endstream endobj 3004 0 obj <> endobj 3005 0 obj <> endobj 3006 0 obj <> endobj 3007 0 obj <> endobj 2997 0 obj <>stream +HWێ}[lC~Y,؇l{<A[+JwS$dQ3{ᇁbԩS!)(ӌ_t_tV7Pz~e '_nr'>/0/.$$\Y8txfk`/ao+.w+łoΉR6 n7j>0ܴ}4LO6P,^vŗ1gtaD1įͶ^)HHN4p7Ž;OtܢKfJ p|<ƔRȕ$aPwخՏ?>nO?|ju^+!Mm>&F9Ԉ"A +!ohz.j!!yKA{|u@'w}cX3bBudZ:0z32k0g "HϠ݊AVlc戮\A * t\zs c;ݖ.>U>=6_]js~R:cLM.Vu)gQE"F7(-'Nh1*_{PzjS(A2n ,ս5)5v$3Xzv]m6K J@w.~Za0ݤr?]%hpx@#nHh7[c9qodH"Ӏe<_0)b@xUodg/to]/9GX,b\g`«{BZ1"JNt JUM`8mcE'?PH[:j,3Xa=9+#P*s3+٭|a/V#JШRc(#B2U5t?XcՑ$)k)1\$-bEARYW5"fE sR=f0`VtAQ@ŌS+v$0qI=1"JpuB f\e`9K[j$~lCa!e.1%HC dg]$E& J :}ؼ \u4JI`Q|$Q πru +j) !22f'K UExq3%M24H4ÔY<' 7?\*621fȂ M9.Y), |JcΩ^ ogHx/YUҟ1p#۾ٗir]jIP7>/XJ??OC[jh-SÔ\)vA(;ԌzjF0ArD;[ԯݸ]6 O`I*t$nO?tiEWSt/V̪vz~Of5 =DMw1q j-%2Ӹ3"f"9{'%9UIA8f jel1Zy,qO5NLiaJGiS&]xP1X]$1;-vwܛaUTĠU`,!뛾۟g-,D^hN2_i_ S& g!  m9hʲ'W RIT$8yUlzʠvɟe:,Gdu4UL@OwPUHM1HR + R4xR%^x>0uB8ZxLsA5&IVL[L~uޛBaUUC@]h35O!C0pjgˎ91S +[%(vS^pgK:t;d>@ ȭ2r UzFV%b +~9m_-סqxd(ϟda P$'*ɾ3N*2Ogvvpg p8gd;V9ł2P*`&ЎtN)KSv)Ն+RH;+z{)t I#+{Mi/kՎF,F& :z޸:;Q~~{}Ξ(-.pem z{^=m5H!=<6Ee6UF"!RyXv@DfEV-3-t?YQ t2s Zʫ!5SxgiȢwB03jhr8^J/^q%,Ӭ]^r7GsJ,r)5gI\-ȇE)SܯUζ  ԠtXn r endstream endobj 3002 0 obj <>stream +0 H@&\O HgC qlMD@lF/{8%ʑӁ(H,C] q*5mʇ揉$:i{6Z. +g +dyy0+.h(]0 +/ir>"M( R8ɉ_}{_JyeY^n@jgP=ƷшrBͩe2j]㤏krh ~IU'm\Jgsa7ݘ&Fg)]%xb$ʦSFo ُpʘ%W!#_(evhc#7ќecNn+?W OΙHTwxZ[xo1Zyfă J, 4eD=P ]|rDfJdpQ"FPbycxP .~Vwr{a)Jiat+H.*e#LcBp"F)"\ǃv.m:W2_]1aE->i"q(S,r4^#tmtlW] AIe7731e=47;@ilahY=yre& +d}'7ӲH\3Ln Hrh$f֐+#.QEIw.aMٻiJt +&:uSޡ9 r}A7cXGJ2<:D3a8Iy͢ W~15_5 ^{ Aa+ҌJ 9+d8Ux~U-ׅ`BhGl4ټQ$˰"@TFO1KK4ɨuO i<ǟqBt9h@7}Ƞ7iyzKNPd„][%҇yYs-5^):x^H\zdU\~RUoվJHpe3F +afܑ+:Z->wWy1'= Z-ϬQZdW,4ʘLCY//X{$*ӫg~:Zbe+R"pjKJwRa 醷p&}zrA.x)"NHGS㦉oZa&u=О2€l7U, A,w]+\>L +ajRۙ56N JSSzU +<Ə^Œx.d3_憕><ǃiKR4x@ҊXu`i?ţp^o\h̗>$E z*2{On=uLηS<`5pIV`"4wE#+4E64L zȢg=Vo!&Fs^GN,0/?ѦMҙ[a7Qtw1nbM9nFDS4`|dHP3cf<`oϗ./)ڌQO#fw2,>"B>S ԟ[E=+f`\=>c4_Su7!Q"xNjOfG O~J;i̮?2E |Wr]WX et&7ٍjӣb=Qx= 耤 G!M\Ra$ebRѾl*0jpwm<%ޣ&-z){5fb͗-tSzW6`K|R¾@ͱћN$"8 q)"MJ3E$qzͼSlze#siC +'m\eS)1 `Q hF~7]6s}\}ȺA5u (_J6r"mr(i}&쮩 / 2e\[Owm4V%\s-Uk` j5n([>Uo5_k 1.r0@3:_Z>IL:hIfz;d{hUxgHب0SZ>nCVf >$C$TPi@qClVa-ZOlGEH-7-gd#B>(QKs#",BK>I^WU?5C!ҹ +$h{kĄz +)#=?up$*ҙ&5\6 lhAV{[6,1 r1Wy,b0:[c^UXb(B{[KV0nl 9";` 7QV^쩽 + +T'd `I oo7$w8I/5>ux(BP<'vG.6^?>Uet7}c{J܀c67LºϧMWig>D"܋^w")(Q1KRysi}D״~4V@5L~EQ!h ?7lz$L ==9GGYy6h Ƃ+-'F?j9B>"LΘjV*rD2ڽCqy;6#eAUON0tEDj6(AkH}Cq?)p+~fd0疤t&C =Iܮp "ov:fic +;lڄ#\y w)\N$!e%2<*|DvxȦWJÁhl`_0sQvQ&ehZM2_>@ɛ+-8ʢKǿHvdN4 :jm2bEB8〯/XjZEE3+W rBwOlv[*M3 +o1f܏- +8sN$V3ZFlu ro4(R"mwYrPE_@[|˺?C"`ţhnSAtȟ)MSjn5W%Q6x8Mً6yCeʈ`3cks9,P2u ;CM{i ^Lk_qp-zx]yԯo&ճ +uCgat!ƶ^^QMwFK`_RԒv`rQ(2 MTg(<.Y Nm/{߯Ol͊ q8#.Dҡ߼_x!7OVʸj侊X<ά-nEV7\P;fR2z[ Qe۴6H T\p:?ݺ_#!0jK +1j~U arDA9B[k߸xuiZX @"gu*7롏=^9vs͏_v?/LeP3 wCO^5\ȢÓd@Pi! vFKw(αY>Ol&4‡ UkW wx77-A{I<܀@p$fʖkwX̲ X2 y]ׇeӑ 2o{qE`8bF~]-->AQ4~AHm'm`bk +ch;P9BFIH8| #TO;| -'x"klR\ݝ*n5mc@"W(bC#Ac}j"b 0p[Q7 KR6;9})OMPz^QlOmBg)rIR=a҈6YX(CxjdķG*@Ix5G[8_!Y &o: Y]4q7ƒMga@8Xre-(춫ʚmݷp|6b, +a#\}dX!Hu% lQh܄ЩKۢl75Z= 0'a:ˣ^},Pyxa-2>$EUW@(Z&{˶Y~ D4V$a=sxq :N)/-Mf:jW0Zm$s";INLa;SxQp$;ѳ[Q9E'?܍ È :H=(rrōu&W"ZlέҌI< g.qdF7W<5 GHBUa Z%=9yiz{pdȨ/W'-UFNaue6zw'H=WQ rdŁ +|*$S%)YLmJt$Ra]"G xyiNNHӋ1L;WVmo dN}N.-qCLS]Z*.|;6@ 7&;$9i0yocjܒHLzW9yH4__i x DDͥ+H\,7񩊇4/phhQWSSyc+Yw^(|Ԉ͝6q=GI(lBW\/^eY +SY_¼}+B.ꮥ3L-}c['qBH,Bp*@SPvy: +LRkRpiC%AqiϐJb'c)D d:g?w)*Z} ֒x>._%]z`?ϒE3OUG3V,5V#}Oq5%qVXp磶Fz~dϴvf]-j +W07Ś +`vĘАyeܥ(p{*u^ȃ8 +1Q~QPް= /BrH%26>-vդ5 ۊ׷vSR lCT fTD5RѡK{Sүll)kQJ"r9k@QR +TF=fhX%;_N!NJTHƏRԎ+PR Gt&3BC[Dq66c&IPAtݺ/p'a7O`u'@7O3QNބ*#@X֧Ŗŝ)Xtii z$>LB9Q@ &d=~OkPq-8,PT:lI|YFUbSi+,ݙF>/Q.qv 6K|ὧ QspHJ$Qkş*˜wpC6* ㈴Q,ih2 ܾP%fcxBF eNg1&# hOvRrG@d]QG65! ]]))$ٴ6b.9ʇᬠ|dVwo[=|m4OۊP_1]wykxԩLٖ0%I 8_6XW 7jC?<J*CLpF_b] ÆY8KIAg(!w~c d)CFq^Px)i$v1z,ߛ qmp&'/ZWB7Codזa.$l( f2R.2/}(XW@qle{ѯU @-.fPS9ij7 I:k܈5姯\)2UvcK^k;'SkePkҔ쓃C|̃Hg.l饺~} +`nd~eLnER?r)#ks~5eK/97:9#hW) +K QB@/~#.UP~pM߷|fDnn奋= JfHѝ"7n#ܫ+C~&4NC:%PzFRkQa7uI - 3ρC+c\JW7ƱmRUvp HDڎvv⇭ :͹0}5Q5вIҺ`gˏ4ՊjhP8X$:ieEl1&oa~bc&USAϼwYn0=w?yhiYl"sނb6W4iHUnW<-Hbȫ)nq4I{p'-T +\<%A֬p_l2 $.\1Gx?*`Tř3)nv,YQ{V9ׄ!*X-Zk$4/viyiAF4)=x\Ϫ|ٳƜan WFjCx{āةOe,G 'Ђ Xh#FTVk%%d=Mm`&},%:?Wܢ<%HT⷇,Y36-THn"-:0=pg#3^r:婰X/65$GLGk2gE:U0p(:ܱ?"v)GD+L=Q Բpi+FKl06瓐m'=20/emeqޱ M|1e@vlU +ԭ?Ԇ~W_-%0&MGk|n [7exLzO1<͆ͧ~:2GS1v>|`LX$}*X&8 W;g0nR)¯2X|y.B N$qu.q1dƞլ{9GKO렋 淥4Br}<9ogaD?ϝ뜾/[KX6)_t7V97wiM@]LN;;jt7 +B2qԼ'[-FY2OSm`Hk +H *W0-0, 9tl/SMM$0a~\3dωT*'@a|ِ۲kӧ1V圼J7@G5ݺpG|v7T` +ۥ U''|Ji6"wDR DM(˃Ѽ'If1NK":'*mB^C ?bK0;<@LJK, .3rdTWP]$^omONJ&+WYA?,4ᕂ7"p5S[ 1q)c#! RB!6iCK3Ӆ2&y}2bB@O nՊ H×i?Êy)B_egVUH +^hp˝ʓ)2".a؉VM@s%xP#pv1]kC5F'`$\6tt4w$]_;'Vty'FZkN&dGА3-CYF=hsu8v5 \{ԅBB0B3 6\=e||UHm ;-ZLbY_RHAUx654V$œڰ $ ̘f+a [kx +Bmfo"2Mv~{n5$"`a +XZ;^;O,|N=b,e0L\ >.>ie u2QJ|=kY Mj.5Z{k0^,LOL +փf"hgr77s1dSzEV0hm aB4qcC\Q:58?~ª䀀T5x2f3 4fh!-.[jX~f}ċ(AY_c+ KޟbWo- Y5co r#k~w~(IȚf8E8&6x +3w$P +d$p20XD +ӊLg"RUTjLQºTۮ3(I容>A FlJ{@"#IgޛGSeSY۟߾#<%r!7o6p)j_ T:Qxȡ?hiI?209Y{Pw1 l,T-!?+B2wDh?s,e%#,dz?L8t¦ +ldUB7V*5}̼0/?GTak%VYRG|jI 6 eovΩ;QzpKg/Oa]C\Ioz䱈5u}1)_ +F2/red/]I=&jML`wNpI5Gbi(KA2 Քw;#$v TarxtB;D!@C$%SBjq`>gWX#laǑ̶vX" J5VW|瑡ys>ٟGȍBO&,C{ UZ%ϠueAbFxSH4XǼxl7.AGE>2h] 7˨DV2ҙxK*; ݃PB1`r Og3O V?1Rӊ`m8< ,jCk bbW%%.g0,5R &(g=Tiz])QNgƹJsV9?Wm&xnSZӺ=k8B(2 9(j,ENۼa5)ˉWJak5ߋxɸAε5xfuAXඞ.Ǎq1sE3>t {lgkK0VC 7Bkl(x>?eغR}Y*..Dv5@:z,CBXPWi_tD]D-ں`G-*| +[UD|]K`X}Mh'1[ƺE0\,7 Ćɱmzʐt<@OCti^ 1]۪j\"&G"m9 /V>N̡u\A|Vx^c-2j ! (! .4B +.h}^%/ [p#4bjK X? z/nGxUق fٙxf8yy<#Ow4*~VFnm g)KN&l {}3ҰnQ'{ІdL:Wx\"[5/%9untg+ճR%W|@ D- z<7- +&޺dK$6Wt#j5/ E-ep\;P{\;(!<\ACy*黌/o< };uƂ^8<*7}9i:o0+L3Pi>6#ϷJ)^Ps#+T I`IĎpTn(lv-gP̃ɏE@o\H\↷nJgG! +Ɨt`?EJ8M 6j8S={u ěwqal$E~.G wܰ@i^E_=˭1X聁-4g=pb֋m]Li1a¢~T0{DYAPffJNl`[?k%3=贲S8=\$"%MH>lstJOʙ|'ii]oXל"q8؋fo9u1\D)GANIQĀ"c`52HQ6#IW3Lpz($RZmaK5ٹID5TdHg~o ^KxS|?`B ",7R3>E LBA'LB:ssɤ{&OlYi&% +F,3—\5ܼy2'ymofj]B%Ϻ%z;ı=KK'RN}Fӻnw{vLE'6?Зf}% ߈T oአQ!\^ϚVhӘcn,ō +> kRtI`ɮS4`y{ ȜBB]HTфmfijy>P@`Y(Ʌ.`^4%EūHV&Y u2L>4 'زP&[l Ub i)D>g:?ؕ&gb|)kPG +=ׯ1P.^D"6bOa7nsA!hBǃ NxO`:ӆF߃'Ow㮠%|A,o;[霽 +USXi*pϨ ~s- 'r`N`X-`tw=d`BР1 Y&rHTh5TU~j.` z R.U`p.mYSR}uLtشmttXOM +fF]`~p%/Ed-c}=o0FVaF5F.\&n7裊=HRh];%Rl"oi:v`wǜ$OJҖs>d39c鸾+g$`,~Ǟ`·J ? ?zI[9TqYZTJV{}VFѬ_qoɉU6E܂xaъ Dyq/b!5xLZa`ao:$~nx΂) +Dj +7IWpQx1ݢ~䓧e9 ^o^<0`AfԚ>}Gۺ*I,dkոG%d$$&] +@&ږu3L8]tܒ9[zΗ8gW7W\;(O76kY@Y <vW\agYQ['dd)]s$ +0[ $rTH[SL +@IkST`T5sgkd;DXX,2qgnEJ| ύC:tb(!1{` 5s"xܻD_,։$xIN'1N>̈>2Q>;|i(CGGwO+%)E!I\ZŻD7Z^nU:O>;>P(fk^>q_D7WZН}6uNqyS=6Ŷ-, fQ7r66B"[EįiYH 9 l (h>[5Avf]Y{ +/V}6s}$ x3'Hgm2Cnv'waNg_@=!|-ث5*s%Ӧ*;d_!])yL[E_Ǒ_k@BԥD,R:fHFY]<NA(w&6x`ץSz: )YD$e*<2py~^p:jSa e]y:bQʙb G{+ԜTݠ^Bdz}m/>qE%Qz搉Ř +%h$:D)YL8kO)ڽR(I:?w3,D:\(@0Ч1  !0nU2v[mhD݌.3Ol\*25$έ- 7t{t4jDX<fGB]!La)֑3H3ZMN oG[7EO3(Q{fq^#CRVu@8KM<9 B"h ]- iBvYpeĐP {Ip3-_D# 3c?}ocA-%Z>*kՀŭ +]{\y?*cУm6xF鲣 [f_!^OP^׺r;xzWl)F|*iTi۫O@@ 蠼˻7q2g_KmI aR)zM@5R(`n,w,_dbr?@nK~䂃6>Vevռr YӖUngz %7 w6W V–/lt zSL+HIl,d@:j,5ʜ  ЮB5vQ >|3V MǙD`!+/ 3P@'J,8adWhe^}R}E,|$]˽ KI/BD)Gn _%DEzF~uBX)#Iz_"V0ξD;`n;.>;oU H9|kYڨ~qa&ұ؆J/(Qwt1u(CQ!ԐcpP6`e_|n3IyAQ\h/JP)ը4cJ-QxmC\z8ŋ#|C4#i[ƬDO6_E˼1A3i߀Ʉ2]lEӡ 6cߥH%Y< %2 [Ty3dՔA 3}%w!?,Ý8H~ҨHku+ DH?+ 7N~z*Nt0ԯ?$7L3jQ|u?k1K/ط lxQҟy0plx_>X_JY lKO9APcʚ0~$j(xd^U Y [jݤrd#bXd ƀv1 ZpN-| XY+Y^A/xη>ӇytW?9GRx4K$5Ҏβd@>OB.r ZQIP9 41|ۡok?R eSbZ 5sl0 +FevXmR~Gt𼥲;p vxT&i8ppCh"NpŌOi5`xCl^;GA!-lם^+@tn$it 4M_<dz'U[?d}AܽQCR(PjS0jN!4U?( ))_ j^Bl{;Xe2Wl}GiV9>/} qt@EoqslŠ8מ௚F5_v_{ωSa=SJǮ$Zq*js̕mi7/g1Rt45.Q՜G(HӢ5ALZ P蚘Y:fX /5<^pYTwD)-̺w #+.;%3OX?Hy؉c<޵Ɂu_uD`QjcwcUTVI]$mxΙp-c)-8[ђFXoOdG pIE{-idd'a0X0ܻ7jZ}9$S+G=^)Le=l`&H$萔OG¤oJx!,PGvVd!eJGGz< +fl9YT*Ĵ_S +вiVI0GZLp8$[EDO*!U:CSo#B=Q!"}A4pS'a eu <{UV%9k endstream endobj 2998 0 obj <> endobj 2999 0 obj <> endobj 3000 0 obj <> endobj 3001 0 obj <> endobj 2990 0 obj <>stream +HWn }Ẉ~,kGI hzΎzfg,+_֝}l$$w!)jCf8 +R=\]xwǫ?_a_QB盛Fln%т)r&ln^??ڻ7E*( ]z1o5e`?v!Ih_8jGYK\m,87j"Β}jU/rXv1x|8>nzxjwO?]rp߾e3ÁQ9B's(Çw~?3v @PCe1T񑜆S="MJ麌-\L%ǡ`ibt]7*޶Tv8f\[uu<;+`*=lȦZVCx7C\iV269 )2}ЏCDB0s7vis*Յ ZmDq_m͢'98߿}:#2F(T| %p3BrDF2!y^62S;4ؗ"2I'Nx˜r0-P r.y\+IH,& C8M?a@JYl$C G!QS)bJTv=?m^d9-*/[I%dJG +Jp9fu/WZN㺌nw9uHd2Y@,qCp {l+OAsB +LT?jtYbxe"MU͸_I+R{rÃ'_~='+fuJ-[#I|q x\@ǻ2pT¾B@2?L8'gBxɌcw)_9,DXWD+TɋlX#8[F-a'|ep "h^@o98oC“1 "TF)/TKƑ^Sϱ\˪% /Ztd3,q1$vŠ0K#-i=rY%\T`˯C3E%u؃ +:훇vDƩ_$WX2~e +E"bq6h骃3W ]{D>w2ݱxEǟi-AZݤ;JIYwCI/oQ=S2sbh z!;tc^X!hԂ(c>Ũ4TMm:&\e^-KqʗS s)NFy[;#E0DooX`BUnv y7nC;vX8%ұz9Ml`krz}/ -Ln-zZ7//sňӤwa7ƋKZ p_|c/?ז|MM+p.&-it5`ZI9] kn`#BmN]۟}WqRxN,;! D7_l,)_*xZf٢= +lĦwa`ڡxLviy\fP=Ql6=_iP +W+;cr|&^|M=HӅ8dsi(p(SMTn`+-h}ׇ,ۉ2Zz,3-[*B//7yi|e{Tgt3nOgF(-D8( Jxw$dbB c12`TxcQ]Ogq;.2k`~۞۶_dTVnDR/Lwy Tʔn? Jy!<.gHMtvIT+v<}꿔WA .-WF]*,EK +$y:nUG`7\dx0c%nf2W욧 L?(x\T]u42Ɍ1;1QVlCABr}2-Pf2O<~f)#O-([o(jo5x2UY! +s6aYf24;88"gfVSe endstream endobj 2996 0 obj <>stream +0 M@&\; MБ2l>1HT5Eн׫b+@wNjM.=tCr~ 7&o1') e<5'0+'*MoM" E]`UVCq&>X{Ut)Ý^@-g<[/F"}+Hȏٕ:2S~Ɠ n*_ݴ!K7Ϭ{KN ^ RS奎3F&\0CG3O2Cהx#mݲh5RПkgz_`D:y?wK<5"*sTݢ"m؉ʤjvʾH8+QB;9쁬D!:-zF!r0{c|"c&cТeLh{rcTe|,TJ99sce9=Dlr>]^xu>݅[ +bIp3h2{f3d{:hDfhYqDh &E^&=tRE$= <_W?N".=%\_JQ^Brn(>_K#zF@JBoH2%`U|\btm|0sE(j'r);0o:&̇&#߻ +n'VQ-?c_mY.$7"v73_2D1ŵofcR2 r+\Qb̽ h~&⊉J+=z<:?VA)/OU(;ab:jfV[2),3!7g"%PH4A}УU3]Ih(阶Ņď.xfqlmW>U#deнI]+|m\;Jal3rMkKJӆ9)Eq;);>8;Vߗ-3Zlc[4D?_$/PUU AP]#gfQwڂTKudq,A硑4ECA<mrsӽs҅*]U'SK_0Ah"H4*T55PdvocU (uC^bYhpQ4_ +Ӱ }wOH{e l(W$߉7/$ +*Ap6$v]Lϧ¹sIw\ػSnKz"a=kTvD2nj$ZMB|ӴZ]ɚv78ȒG ř;XAwRC4:{BML]M +'vj4Vg +wEǴ`UU#dqΓp)QՋ +iϿM&Kr8a}BaZF0oW};bAlUhxow|~[͆~jֿxOUȓoѡ:/KB !J].e)!#Q1Rúr=gRȄ{;ϕ*"˾~ d#!'xV Em!ylᧂ^RPC˝XG2PjgTx؞h``/ΰ +.G 3VYaFW7s%]- 5ߤ 6gx&T G2alڢ]Aӕd)}FCUډiqh"4;PzYͳqd (FQI]-fvǦT y˃_čpDЩcKS|N>IKGSTv]Sded[ԗ(!:-k0$PX&|T&L +'?Hi06Fh['SA1@ .f3Ɠ]^羍FArm,i 3:P¨MDHEL`! 0*z`öYNy@spiDW0$zz۸%I/6`&,j3m6Kce|I&ΰ[<>Gp?䇪z$=EP>yϹ94R! +:4m`z*t;*GwUɴT8o7e6,2'`J|ѯg}8^爧莑>ؖY5J ~ZfBwRgwX.s&|A\sb.a%bw] + Q0|^J:Ո۾zn@~XJvR/nzT:D\{P +tܽRu t%`1Z?n?⌡،<(2/ipDj>վQ+Ưm"(!?R8 0f\iqyGaN:FKΔ7&H_hסUP$5+B7Kg#BYbCkLm#yJ}? +^r<#˨@*: {+HQ9arD eFP#uwvZbڀdAf 7{p&KORpxaYý cv7`Bxʒ-I45V`kWhn˽X$V ֱS^Ne42t +RSE +5H-եIfɫd >6'\7)\ayATӫ3Mkܭ5dp +2TnT?؊%j:̈́;n.Ef*CXg8-a[/(F z)d:,rѴ] #WCDq>a3/O`Ƿn .\hX=>\4E |<؆܊NLG(}ٺeAVdi*؇I +eu"$+J0t6r6WUp#>喝95Y7/[h;%ۣ! /[-A}[=$:愊/ ~n R`Ɖol>R.d uh`o0$LXY6Ɣ8P擞k. 7E禆5{*HpfRFP T+A퇕lv6| 8BA喿6T9Eg$ZS0 vDʊ|U[Ø}9u w_g`B39^wby}^Čy47+iU1" %+7`8B:_hgg:J[4=PV*'qN(geXÙy|`@x3,º +\IEBCpy +/ ϣ9̣MIcj#b%fH.h~F6$8T49Ɋ@~; =mxWsA6iE9BgXU-t;-ʙ,7v~uz(fN;H5M+nⵕ6rg5YE'ɯpH-p*BT.I)]˯q.(`}} \Ʌ}VkKTԢj^z?"ۊý!e+4X@{Ґ*@KūG>J +z@qUUEehzQBB5r]*Kuw+P2 +UJkJ|2㆖(*Fd1Z,&/)kJk/w0g"òԜrax9{[N#f( KZ]%6 #iUf[ȿ3:cQ݆SQDyu[DEA @ujb2:xT-U0\Wl5k|i&HGv|/rVGa{e:JWy* ;3V/#i,pLQo6@2Q<\ѥIBt JCHIꞬ[p0{7̫L=Ꭶቀ!K7nTySDr8? ` 2op̡wi[Ώ4Oss1=VaҸ玳 +2Kn\"^貲eIR5tY{<X3Z@jNLU;7 +UM&V{CD!X[4Y9)ԳƝmD$~ySs*@,$; +`uw^F+zי]glМH7@cA<a],sGڻ TexzP-Z[AQ}.kNDjߨ0,O;7b:R7ʳq'&~ҽ+; ]'ۼ%ϯƟ1dP4BҮڋO^}dД2]-Eb8Cv@m I|ѻ#A mWyЂv*,O} J%.-&7b;ڦt@k.zf6~X5Bj 6Q4_-̕lp.^I hms0:T-6#ڟde.g܏^c3&u-&` Ⱦ^)I+;C tͩmgPuPdH3$Y oȋD8 ٴN`{gU!V񼱘gӬ0Xz扼UT30|d70\v7:j%aqboj x{j5R8ZNeyG`92.2\%2i;f:2 +ĔoZTaس Z|fcX5.T1aۭZcdh`[9JNtx}MäO4 5X*R&;WNS*PawˠqJgo5BE3xnI+j,i 61@Yvo*vdݕG4jZAb\ceݺvĥ>6-ҷ6D *H4| rz.MM 6:Li5mf~ F\?-1nuzthhX>tM.9pm4Q>'Nb䥞Y,ڶ{ʖ:4I 0w#[}7R=ÛbbtF>-x _g%S&E4 ye1;ZO5ŝilT4l̴+pZc; YW6/~K -M)GKJܨ,ibO=4% `;D oNc <y79yuo +x^OƱj!\2;#j_u,asb[)|dwQ_9t θdv"pijGJRRu[>\q a b?tQ ̟: -*㎬MO'1m;Tq^ELՕZcOrrsk +tzqdG S{˹R \y_KͻoLЪ+ԁ/4lN(zN-aCDZ~WU&٥͏?N[r%c&lf26Det=#>ekR4%l2L@f b-B' ܗͳas X ۨ^gT~NYQ:QM. dLo oIUM5$0}OY\ 4ʣ_i'y-q( 1}}>N[esgVsӻf @iߺW0զOb2 €.^Z:lSi 4/|=R1k¶01oAyc/čpTtёo#_}T?f\!Ѣ;łڼOK$)P.|AiSa3(+&TF/Ɠ|L %Y +@4lLH%ŵo8ղ /C 6Uʺ.J)`xbob*胫VI>v8ȹl:BeS8 +LY 5ξ 轌BLm{LL)3d*ab79 `,gړ\.^B^+YahʂrzG zuĚ <ȇlyaj9x2wCօ.:c m G+J9 kޝ?=ϧX;Ҍ@j"9d3~*tKFmRep{;~}0z4 8ɂ4@ gD>JHbci;Jd PWO/fEUů1{#% LC( *wk]zsWXPėZ +ط*`^ ~ +_TE>/G/4+$tor[e}Yh [`dηTU'a4,RV/ϛbx7RL[r($ G33؜gP&T7QQzp, Jcb1ƽH@f2 ]|NuGE)_VF a@~,cggrB:^He1FfB{l֏2AX`LݍS۝؊P\5yh7aެEO#;k g5LKLw/]oPA_Jjv(@GZ҅V3ڲL {ถ lA@67MP9D]}nOd^ hr9-I+ŲsoJ}^vNv yLZQ:a;/!{R aK*6=RFxC%*Xb" +(rNr es,\x yf4" i,~%bi'# B9\!fh=AGAlG7~ ,v̄8R6K]<V6V; OW]arMFG r۽t7sDizamܞ)y,B>hYc5V!K*3U {TPiiMf>PNE%7o3(b  vXdLjm8x :< z9Ϙg7碝`WaT[;Aտ|+%f,wbt!p9%L80#WcѸ,P +GTU(D(v>>%ǹ#:Ep32?2ۭTEAŴwc!)uӻXN+??%m6Z4b(_JU+*,|.)[{J B 99O{ePI6iٺcXa@#~\!V73"zFL.Yw*x QZ"X@ U@u|.gfɔnI&mtW/rU(_Smsi~1߹:<ʚ $=bׇdF)PsbaZۻ\Q{ػ-|@$ LYK(K>uZG dCRxɩ @Moy-'#@w&vݰZ2TxW4svj? Khj:4e;?_!TUyT?\xH:nj }=,aCA|S|c4B)9' жPofeR6~CuOvSNnF_FzDm1_ TXAU`t [{|/ǻ0gjgvs3BwXag4Jkn qFv b7wN2g݆B`\EcʱMlfzOY:ʎͥ#Y(Jv5s@0ȶ7W s"/c=%88V^G.LK0сʾD@.CrY(7>W>Qߧq]?S/xPQ7x` r@TlkkBPI;~qЦ܈zt8lёOoEF*g@Eԩrj1/B>"|9-܈c}&Ysfci8bp]( +<4oX>~è[6]yCiVL>.VxGR#WU[i㞶#VmM<'Id<2+qf*C^b29 W/)' JH 9F& tG*cM0W$3۔c)U`Į{M+iqw,ڹJwk. DD#4H-_pJtnD-@_0'74!7/{ Lԧ3XHl '蘔TF`RFn9,bx 9?BfL3ՙ}0Qp AtˇbDlCuq_ +eF>$ά"8:+Ã5tM9 @Mʏj8۪Jbeq=P1%g$嵤6X#׳:%cՃ&s) k^9>.tڕʳ9.PLs1ij)pLxz49:L_SUcu^eSfbhtL|sK+*d+/q1>t!7Dڈ$qZ^诊?u,$|O$_<,t0ʨCY=g>.Ü vBL'{7b3\NE,V# +;j9g# 'd~6~ބWJ1"~5" u1>qlD5#|5vrFm8g0Wjdf]>V;nleEpWBHe`^UpŖ`!?3,c}T?m+wl<2w'- N+{ 4TҚi1'TrQ^kjMX:jL9~1_i0MXXB +>_NR{9v;& k\>Y3'`M8块(JI0odN:&cs/6#F(W!)3NTfF!洌 s.=⪂ACr Ut}-];'H]/6֭܊]VzLg "ߜ>FYA`PtY/t)Lh`13glP`uYWw.$4@k +)̋ѐ`LآE3z VBw _%z-?V:0F@q`nЬ>uyl'I{JfBi.Z.ʜ- e;E4A6N~/%鋏Q1tgVKSJ\͒}cMfuYQ럮NHbG['S#_2VwfP 7c-"a_,o}IB1̈0&Y 2BITE1H-B6bn\ U^LT7 &+-fnI@P6^J-nu&O_s +%nwiq5y 9rj"ǽxI2Tiҩa;,3$"rXu|]9黛ʒQj)p{g|927=^_e1UH'*FBc:t׼nU@XI_F3Lv7qv{` +.yI'diD#P0;X&wsWn+CZ՘kw=xxl#942c}>K;N Z6:!Z=쑴1~,-.xS7.UR MtnhtU!Eeƈ_+QB+W :~$NBxKs"WRH68y(M%3-Y] =5T؉a3[7DٵVYL0;jIiM,pÕ̐ːَBsB+]GtC,'0urP8=Ek;+vk{Wo/ngq\7N\jXf1Ջ 7y, +o,A?%OKEo!r*VBB@>_r H8 +Y!\6C?xWaxj![m'GwFGg& r:z4oKac fmv dM_,Jh ck߫5 Γ}z@ /#\kKD+O:`d|Mfe$IpFD0Von+ l]5q2њΜ % z'Ehy#ϛL''V^-3]iL5W qEy6LSb{Rѡ:tvٹ)0M̥}rNFv/#HQ-$x.kVZ{4i6!s6rڙd/OG[^n^Wv VXSEwwI!lۮ-Z S,3]V+ m6JަY9i.ͮ8tn!=/!j"hsVË$jAKP<XĭDKgY@,述K 79\x˿Pe~7'Dc^@7R]n"٢!T3ΩA=Q)/.!gIK =<j^b/I&bsRE7 O44*(zÕW~Z8*W/Q;Srv[ы:'j3yr o=)ĴGq(0)fP{Ĝ5MT3bfk^?N}s~cr[nkbM0>I2EJ7V?sӉt"M9?y ^l^*p\="Q(:@OΜ/Fnx33 UߩC" + +\YWm2O=86E憂73T^6(V`Qշhj.3&'9 ywίjiSt'Bf@ЯT$NYp +oL NeA~i&Mot\}mTa rUr2ۓ +v +yfD$b+8>3S*+~;dʹ1uaCʍ@M%|PgP#_U^C0Yފ۠EzMd<6 ~ u&kh[uQ˖Km+~ +uu~CʵB[I +*M4Et My=]G@oߪ0pa'ϕI%iY.Y矴oݎ_xBO1RGZ&R|_ Ba,QP@8qqmrxx&VRIeFJ4#eˉ10lPl 1umRjhA^ۡ#ٗ)FI-C~tǖ <ڒO92(3iq锵nYՂHyʸW:z5WMzZ^eNȨ˲}rZgVz j }Pj 2ڒd{#?T<{[3cb N[@}"(U+ o9OO( =0ݏ(;@H wUwj j#$2}W׳3'M䚠ŠfdYhP!{Г dgYQ0ٮ?Giԋ!|d +=l)ZPdk'xD&ͲalLM {dۥx!+<@Mjy X +tdk:`JM9{bEkMY#!i$8;-zc+qY}N ႋ%s1"żP2h}kLyO贺٦dG(T¯zۣF$]zE| mIЕ; @ .hP) +uj[M'~*[l9hN8hkTF0Z`4 #_?FLJP|KN1Ԙ{mE)Bv5|gecg{'m?2 +BnF#ms2d#˗CYt+lQ\1Bp``<0@I1)OB9[XQFTA2TJFf>Ce(3Al7dSa)p}YkG,%g3FSDx~P&&+R]U'OLDL0pT! "D Rh N>} nU]D;j q@c]OmβTEGFrMbfz̷P)[hɣcji@hy!C:&:NWx#bisС(H的5E+`C]"{ޡ/&ǢQ5+)Ě.mw4"[b.XS{vʑ*4r'?k5+Vbdc5 G4,Ơ‰Y"$ٍb%QAUOt=6#Z!)ǧcBmB3Z튫7镻㋷ 7RC)bb4ȧ?WDJUEPG^DYjC}`_Oy>ez$xGv^ӈFPriq[ af.s<4\(Vsd I udYAǏZ儝W2yT3 zo&/iÞ$hfg +) &ŝ1m2Ɩ爠s.xKpiT>muq(OZ{_jr-W]Źhuyw`Y^rVe԰3D㞗RS\\HB4cڍ4KXΡ=ѵ;=)Db'nǗ~\f: ݍj#?NG`u&T2Q3#"B̄"uwkT_\}2#~VCy(uY@RqԇDZd +(ϵ̰JRE5&8j^8˖3Ïrm^B Dk!F:g`JMv0_D% 6dP++)Si<`Mі(PrMUp6d^q̠|kWiU,.ͭ 2k.{xhቌAfe +y>XfaUV2xg2SZ3|N[o7<^Xɫ;if͂oW74TP8(s9šQb1BYkhsh} :]@i^U]>հS:p{6,A?WցJ$ˮnSN.yAɷz;#O~F#|  +rm[Bͫ~v t'H 과=3}hn@ŻCwXhW? }S"~3k/7/lkF:? +Od1蟖<ׯ8%0X\!`X-gʠoqOOae&Q+ +Uշmn!8eQܚG`ăY'׶e>G]9r^L)Ǐ@%Q&HB +BLLk%{/fs9ۚB~NLEz պ=?Y΅oe(`Ȥ`jJkMEzNO%͇Y4M%rq+O 7' !Ҏ>hwC-nٱ 9f +Rݓx ԗpNp;t"t[3> ƙ:ZwgW@p+3)a +`M-hAZrE!c52 hpWSL/P]ḣx:!m _gE Q?>`za[Cp|yJ_1dbo7%BPa]r$Cp6Tկ*k.ۍ17XJ݆#L_ endstream endobj 2991 0 obj <> endobj 2992 0 obj <> endobj 2993 0 obj <> endobj 2994 0 obj <> endobj 2995 0 obj <> endobj 2982 0 obj <>stream +HWk~> ql E~xmPRlw$WV 6̝<9 7尢6"]{:ѣy6 Zci/ fhm6~ZJ.E'Bn>496ɹ+/ft37B~"_k l>N.TF22xrM\#SE \#fȴ}derJR[񗮠]ͥ+75ܧ>ʹ;ceZI?,4dw.&88w .vYbEf9+ E!:JaFQ4fE媡 +&G6i+cMQ\/DiOU"`<|q+'^`lOUnhlmw>nB;ƆU bk@]*b5% H5q t")hm̟I`}bXEN~PƟλd;5,RqRfݗ*XzBα<˶JQ̢lCpͲ_k6"oJIv{z_YY>S]?TҀC*"}=%P)V=EqT=@Q,ՒHSAClI!RifdQQP-4=;y Ex`f@R \-5 O54=Ȅ-64S8*&sE%ԣ +C=,DBEѡ)]d)8"ɒ Dfhάp*SDThzUymP_8C:rZc1l{RI$tG1^=&(&ϋ +уRQPQ0y|>&DA๷MQ!Y&N@i99/;>6}PwT|R#KNj$,Yd&hE,Ї|2Vc`8zS{&DhDMlx}ae wT-, !g32v ’pXTHZ@*l݀и ᴈg"C7. +^.xIFx5lmtQK?~.t6O\A kXRhXJ3FvWw5bԧpfvVfX #W_0! *iU'Zd3$u$Ⱥ @ZD.lҪk=5xEfBǡㄟf+r%$ҝvaI ߓyrmCҍO: ’Il%MNK/yYmv"f ;^/ f0քГp4LF] : 0) endstream endobj 2989 0 obj <>stream +0 H@&AK Hⶍ^R7]QTϤ㪙"ڿV`s%"BAp ,тG9$7#;; Řwxs H/ѝ Xߋyi],.{:GwUy%*ȫ=G)[?#{HYIR?6!M2V9#g5ϧz)ocKo2<@Mi$Ͷ3^瀏4CbHŜ}v[閮;Ioso>;hߛPrQhf%A#s%&;Z11TYRP #s.x_{d.}}g6)W +ldxR@zQ9ł̹сH6P`1@DC B(W"`a~.lhZMF ٷI@דg8RIHBNۄ?yu2h{ +\$XwzU}j9$]g*pĤ zp5d:@9?.C0Y+Ug,pnMwFmc|Ū!1NB9!N&WdYGlR +Lqɱ-'52U7UlNѼ?4ΒEVfz.{H&`|n~`R(DzziG5b^<ޙjXw,hJn)VqhX9;5|*:鿇OvF٬sN84hW}>)^X{,BKU$l863C{Ek0uYan\=% D'):7wڔvXP-)*iUQֳaikd܄8GۺVw{h#&fAp&nAF.(nVO/Q"Ș*6̯7 YVeExIF!Hyɍ#t3J=N&x#!JE9ٚx$Fx/A#-Ưz.w:V^wM;as%/ +n^J9Mifs ɿD| #z 3˶mnfvY( (UL 2fE(eTh /d:<):$#1E6 CbkUnc?6b[皜RZMNjaS` p)Q"tguO*,/:CUj+)ĦPp8 $txYs{9n; )K݀r/CzI3HqDVGX_|]WHsDq䑃Ϥ~mIn[9؋ʞ%2LsKF,!A>vި>0Oj{+^vai ?tvA,Xld&h꾌3Zy߬oKjZL?e'#AYHmm&spmhZjh,^=T^_O[ +7\Wd,HJ> zd]ų0X|^JDG"j) b@m:PnӜGwD8#5 o\ݏ&LI(Ɉ1Q] +d05s)C`KK9$-IxR>U$-d#X`B6'N"%¿z(TJ*g~\KM/e{,Ȧym/;Soǹx);5E*PjNp8ډ4߄"xJ?#%iM34.-JMGSZ 5c0WS=S8i0['I\rRMZѡRa3MW=XnDr +o ̡}8mbCҦTV_=$.Tlem.9!D9- +r+~n;{״zit/KMD3`0DŽbOþfu:!38D@B,;wW}MGU`;k'&OŨz:5t#r)Vw(|$; +__5cS,`럇yxdo"yPza}\LlnE+<?NVUB۬W@҈?šm`{7񘇧Ǚ +;zhNߤS^X[5{DhǛ278j͋#$P5Eߪ{4l.+mӄ ~9]ls.XҠ4y.v )vFU!YROOX" sVB}|4y}Qx0s5ڧ4$x^Xu:62󒓰D M|aN"?nl`؁^; +bUTM4؄%P7sIǎqCܹxN'.olE:9Ђ͝:N2UnNS/Ofn 5u"፿nn=[)o ,/ +Qnn|/?tkgBLK6rXS󨵅<~ +ܷm2{Ւ2i{.,`G:ZCԄh^ )͍c;\N? XDs+=vx0H0;7"Uu]kxX*-zue#LcKiY.GBr/͚&7Z&It2.!< =KckH +t@i0j~>FvJxo[p^&vٯں(a{q].m +qhÅVAh|5;f%]`VSČ?X!?ȓ\P2>E(eB^L)Z-ofgP,VvvG'RfMxz '<P mrRMBW$\_*>$Rm$t\ o촼դhathlߏ i D+WO+L'I'܊ف:OZ`HR0$7SFJAʖO/ 5Mc~ѫuω*dMjtv{vKqtWחigDV A1Э%us!:[AE3{rpcO#I*xaoluUbzG%ܒo7rvBH+ +DJ OxAֹP«duug;Iyy'餡Z+A@!EgD5 >rJb"V mJ`]A9RXsKh_Q򘼭xJ)M\_r.Gcdٝgs ߎUw2͸ƒ ַcjTQKӆGҤcc^lw״ +N'F?[)Zc@AHŕ},mv鴑hF>eTg5REF&{V%fbk!(磄 @ 5SKtc"LTQ]kїSEC0;^ 8NF?Co7c:1eyi? ODkTXwʀwlr{Se8E0A\mG7TqӲPQ G|r{%x=QJAyf P`~IfM,z (? dIۏ[V.P>OgJ.oң)+qT<" n dQ}ʍO99D8yӅΊqľef,mNTͬI{L3;R'P5$fHf,6? M~-ƍbP{HˉJ^qUK`݁ KQa4R+Y3~\vό%yNH0=}wpQn!/C.!M?[8ܷlB` +N*S26 k |EͽP3҆ g]~ޛ+*[-åŚͅeD/SlڕxDt|:XJ<0AB&R]_=uS.]K1x7b/5<%k,tZ'ymv w ԓ& BlO-i aݜ&<] ȒRNOb+&_¦(EpDd;7fY{ˏޥXx,:@|>8PE~N7H{vo.S +<9f|%Ȝ\d1~urSjh$OLJ]r?Ҽw'#μV)r`6,*{ QlԎ>(^b p?b؂$k.J4&.7O6_+#,]~S7J۴(<3DF@[eSE?0}T,.?vOMדٶ`KctzSGxܫ)jceХ]¡k Ei6Ѣz: eRl 5ڎ꧇f{S^t?xݼ#BD~JQIMͼW G,ܩ^C٥(#okM7F[7쏝jv^pTAn GAړN)آh9M:CCsW|,!^֋Mt1E[MZe%/ Ud0?g#nېMO&6C*)Zw}?NhhK}mPP+ǧBx=yBƎjd E]Ժom"f]sĵu oq0´s$ Y%f#Qš!nnҘg: YjrA>2}GMx8mRsA.Oܺ;MX"AT0[ Xh y!eQ[)2ʊ.7Լ `G&qV.Qo瑑ؘ &U:7#}ጾX&޲;.Q-~ʪ*M>( `` T *MÉG d_ \IS_3-*]oH'>blXNe*;ԇ+P,26i^M$f*ɚ+l ¡u]oP{Cv4E69a/fA#%Sίݥ݊ĖY%apf! 'y s:dc+.D#ᲤE3'w}IFKڔG'esȚn S77J!΁ :mĞ.:}@@p@״DbjIXҌ0_ `z]6ϐ?;TQ65i~o)ÈbR!Klօɤ. -uT~g0l`xG22ɔ1}}=O7F@ Ҝ j78bkS횭ٛvRq eyW{N/ }#+/:9uLIo`sd*ahL.CU[ m!y攸{[/4T忿kg^)-tռWy#H{%gEt =Wrs-YDH6\'usN<0D_K:9x%q20oCi*uK 5{nqayBʞ_+9cņ)7FQp:V=rGťTlprQk/+_$?Mks;ƌeGeTK ~iL͘h\-Pw?D3rvoܬ,,D[`O ד @P7މ|(oocE7vq댞t3H/X_XFS|n2]d-u^OLHH6X8lQzW +0M)%YAv n pNe]X ߐ\ K,HW/]}XV/U ͟ӅNq0>E7oɎ }ӫm3vk}! WJpz< Iv9!ev@UYKR8DN;4%*F!._o<'[IlEdf#n|5>CUj{e~?k %Ko:*p:MwwTPd^!zy-#  ܗ6S ꁪh{,I˘i#q/Ww>)|CBR#Q~I(,Pi3@1{yL5밶Md*{ߍoiJbVMW X3E]BV̫qbp#KWϱ2vmӐg[gzϔp12)D50EI8O0;@Vi_"qԣT(;x_ku,4{ puH9KgHqF[%+eI |mQ Ē%>A uNM3`YnCӐC3 +N ]ue_٦2 "Z2"?ONTZsylۆ4ac)1._~]4ܵGMUTd]ِ/t%r4[CN-K֏"wȅk@{#Ԉ/JH@l-Whyq^Ɯ7&X ~%J\=śsYnhhTj2u06ўu$:Ƶ˭H%+)[h_X)$$%m'0Y{@7SOHypHȘACH +J|φ{Ad՜#ENmc$O$h1'. i4܍^y?xvڮL +;9"0r Ess(%ax2*CqYF$oD4Kg?('srɵXOGDAט;pw:+,=Vs@ס~-o>&k:NJmR닞 * ,ުb[0Ӱf## +3^2mxٱի_ow-Z΂w2pTJXb7yc4haW+E` t łURsIY肤@x4XHk2㢦,*'c*cP(T9މssxmq;p CP dև̚;L]}/ Ǡl YڂNÿsCgGm^wQ!gIXou)N`>A5sR}QPLw+D . +f)LLc@B-~oCk@+p;dU EwM<9]Gh&>]Y.t ʣ&[Yz| |H&vdQ%QTЏT͚?i~#}n1_ę Eq[I.Ե_οE[(>Y[p#*Ο#,,Qť#pJC^\0(y#Rf+s?^rpARL&>'2s+6@50SPAV.a{H4-SjZ];A鏧"(%Ip@i܂:/J- '"2SsFMv4w7Oklj2T_z䥅8jlO1GkfbC'UO(!t +~B)cBL˚lK ?<>$ܼ,Jۖ[NZ0=urR[1E& 'Kfõ}+F1=Q(߈v V'/{ԄqgcGǽagC|^ QZ2'||2)^~gZHA+/Q«R"m2ِ:T< ø3$XiO8vt,= p9(ؐѭHQlﴻҁcinEgA:67F:Ap}=DΖ9SG@*3ɰ(~RͭrKZޑs_9P e{뺖2/Kr(vq9SSE3ʳ,ʂOdtۋH3TQװrZkߛX>^B^_aEEt!.͍ ?@x #%cwR, +BD_hoERJTٔ[% +2oԖA 4YϥNw̖;r`_qCr؅wXxn-u<^r:[5BHC4@$klMBMI?`gYޯL"G;G.B]4UjQPdAS Gys05rg{f~uVMTmLj'иJ3'ߊe}ϰ`h oZa_-{mW{^'ɥ}[B"T]ה<I9W+)pTfeάc:PE@ƺo +x-QK$t3TpN+YHjɎ4N`B-7%m~41v2d<#o.Z{[y/AD\2nic3[VTʧKuPV؞cSF`ɠgQGdQ͋'yy+-;?4;"s_}c"ny4kξl+Hcm@)/aFH)4{!ܜc~ssk-4~3 +[KTht +1ϰ6`dq:X#RGIvt1훍"R E]rGMJidmSWS߿Tچew%_ +cO. Co#&i]:; +z׽ScK,2~LqJISJ7?"Lv7eԪN-]K\7Dc'P'dta[ 4!-ήXijgwRW2ufU/AyO1oW6Tb(JENr sy1nR Tz)!@[JUY>^_`0yMwMv*;SDYK.g#chq'SD ,k%S10vS*2}'ZBCPp'/Y2? bY K_g-Iy^MFwډf>^y6WUt Dx0{wi,Qi xe?q4ʴYΤ o5:g[W-Oc#h1?fVԛzMo11w`; +v!H0Ʒ  H/soؓ ʂ%e Cs ]/toC^qlZVvnD-O&Y;~j4:!O'%UN@RK5z1\YW jK:kO(/Z.RIB3pyVnm;-|Ry7IZ+'LFWc©8+!FAHH-LѲ%L~~5 wtc-}C&:9o9Tn@.+]-D(|V3Wĵ-6tlH +a,ܖE޾l`5À{F7O!z,{uJ5b +|0cЩPO AuA.rRE]z8%!] +^=k$pHfFpEQȿ2tg4*~}e3Y:I#I*Enk=zNi\uG!;o=hEK&h^Z|CHBj*jÀډ=zpV<>-.'lr(oGL߅ zWn̺?DD?&S!2ds.L@ L/6A7y2lhW*\u>4b-fU Ԍk9'u8n Vg`iۥ3GkS4@T^n ^+nnO=' :L˧SM֐vCI@`\Jf1"YISڼr!òhYtv@Nd,3( [ȩ + +NهtlR47W{:4Т<tJۡkB9ԦT0tNhuh'hQg-fuBR Ⴓ D6ULP_+3loqU~I4 ~xEV,4Br iM{z2#Axжct1wY엢` ewhRk <˜iaȍ&–H0Rqyޭ!RJef!1VW&9 72~-؃P|30ޢ*ʜ<9 kبT^$h V3\@g@D"+KyVqm!l)FvGSh儘=cgNj8ma<I4<"qOx*Δ1Xz h<#<Cl2 P|xK"̦*03|DuQw3Sߑҡo0{VJq;.R8$Xwj(┅B?[y6 ]mA5uFw@"rC%'ڇ^Jz䳜,*6+w`^E‡|EXAK Bَ{v}VuKDK۝b7He Ba-f4捭Jʜ*It C.'Υȃ|J~Xw$[?jfnlbpҔi4+ө}U^7ȴK"1Q\Գ>ITaTQ.i +=E}2  +#v W0CpbAm<ɜJ;o=vAċc7"?5:\(f "ְ8Ώ*$DE^Dp9F4 +0, v42P{f>DhY@LDRLfU}e\=\pU k#@}L)xߐ'857U +Z )]hwУ%dpėD9 MP[ _T4궹Haܒ}:UF=Mp/i n{/1,dsQ#V;:tcV6t"tF&Gixx2"G_z&n6NcGa`hoGa(r渵iwA @qtwaDk^Ys+P'(De=>l.9b(G`$U]wV${i@yBm#)]X;ގ2vG3 lN%(s[\9*+6o9=mwB+qƀ.F\l[ܓ-aǞlO]!dDGiƄBx=$f'\̿Ѥkt&Bsv~\DБZ5;ǨWϡqNo]Nկ3MsNϯfizTcȱaYp{c1ʛϚt+ ' C ]o  ?=) lro2;([+maV5߾ 1Қ{FamM3##¿=9P$ĸzvŹv\/ziX%1.^Yc_)`lΊObQpL9$h#Τ9ǘS:TiwVfz(n+$/!2_MقV8nKB{f[I<|%[ۅݰ]'">D\ͺbZg4LΕZrmI +\H/3]4x2ۦ\O#&ɽ7HRx}LQ؈ΉAƚּsu/]M tةB5"E"Fx;C?Q/O}@)8J(ߣd$0n0RiMցB Yt9p!"ӝ]e?KM/083RSjF~=hޕc([݂K/cJC (nQd>X#i85&!?DoJ6{;w#iv;' 'M?LϷ:e8&9QuzuKBU!ay0\kxﵯǐ? _Z?RhC(?hP{2(ו9m"I'rƮ]qqBiw4϶s utg|Ag(4 b$Ц<21y4xK,d֕Ց5 -ORel͕7*\!Mh^6}un`CPN$-2l)" Hɱ橉>GzB{W>Gv( txsZ4hYZoU8mPs}ڐ^U+.yh @Rn%0JYs]IJ +BLI7eSޓi¹Jч3+O%m. A[ endstream endobj 2983 0 obj <> endobj 2984 0 obj <> endobj 2985 0 obj <> endobj 2986 0 obj <> endobj 2987 0 obj <> endobj 2988 0 obj <> endobj 2975 0 obj <>stream +HW[o[G~'ù $nb_,8VkK^];#[r l`9r8Ǐ}&cJpzǀ`܆/n^~w8?{9Wgql~1f1,o#ӺcZgw#F˳Vw_zînwbuYu]׃=._q6HFmLc ?7]bm>$&n\ǜ ^^>"&ZWw0_hH9lh.1 =䴒$)diVHj,IOc(z| +†P:̄Ek"}ÚȢTv2,$q5 $:Mkq]Ʉ,^ﷻ?G4dBK։&c> 3%Eq-tYgl +jԻ=`c;y\Hi;##cl\꿭saY1 _^/FYΊZ4 P1 N+eBȵA&2n_"aRt˷8K xTLw YEQ{(,{b6&*m9rB&"x͕ )GD&"f8MA8pˌj^ l豢O!N@n*jq]:x&JK ڍ%k:%YԒQIFz|w9bI7f6~U'^b_o`"]1X jWbSD"zU30U!XBVY(P6Iy yM[pVnp1|#o,{Aii#6n0D~WQgkiFW.Fi1Xt jV't2XH~t7" !p}XGT.sU@6#/G`jÇ:2(s,@FQN ISL{:O&tL[iTcMnNljyRC +-MME)(SG5c(ɏ?.BQ.kDA\eB< Uہ rMWHMO4Gp@dOJ2Xٿd,!Mx JNh2P.Ex1F׸.N^߁.dzWT"(nWxBI-nFSݔg]:Î*cI +%(qeCgrOD=c!XOU띣FF)S ׬}c5P+)_ITiE)Fhh|:͟0GitYlN.5_B7Ӵ0{`z endstream endobj 2981 0 obj <>stream +0 M@&O= M{EybTZ睳}x?R&yJ~@7ڒSGO"[%Cqg9lƽHȌtw"6#E,قAv\)"$vޞP$ 1.՘#9XlO=j̛_>u([G`}f,q{|}A؂++\Kw+'?X )y>7(ପ\lˈH!טZ6ZĎ%4vq !ܢqVj^L$?Z̦sQ?}_`AM-{6溌Iuk ;O(6|lBboP[TM#ڻg)@leT! I4kl.8"F"Jo~FH7P6Aq,?3;FWyre m~h]~zo~5,| h` טv7 єsСFu\ +Y!7wG΃ԑ]8cC_v#;)l1deYBD~TR;#ߦiJ#*j2 PTs*C]Yck[:^MlP~ʣXg[њFD s`֓斕ƀ!Cѻ%zE0*ʆW h8އM:")W^ JsGmFI3RS^|zs"B 86Uk5LvK N6EnxRǶ-~*-;^ 1W%T$q&cHDVSu_8/(# LṲTe52-S +4{2-e+G~c&FS/!nX6W s's3` Uf׭C_/b[D*<%"T%%Mpt%ZJw{](F?l^T8DdzqK2M"#V?A@PPZqE0h#>[!̤ +iO2Z I28A~ON4W!a,;mXjJӂ3"?uTy*sCCTLMS4!̈ Ӗͅ)y2`<40 U—(kQs#a)7r4;;+k,{-JCy>{Ad(4H @LSB⚈zO\mUǵ'[=De>ŵ5h7Yn%,(7aa{p %u'%j B +`ECs7c D!pf$C{cjr=uFފGC_@8Ve_oBENM/ ȄeRڢF:[b\\rBp(1'y<'’s) +hV=eXGLJkvzNaQ0;Tpʟ.CNڎkʊ艶^D<ˋI?rBb5sX aDg8 `L璖d>-(8uU-OyP] (IkZ;WOA1?5XvY40]xN߃87vG9-|GL'ԥG)i%Z +V|1D<;7ףo NEVpk|[m/9 kEA6R#浠mD`#(>}h` M0,X`@,@ z{#7.+3jF[! w[RJT4UQ_kɽ5b& Gy fdkp?>sjу6*\(9BkjkMbw]cfɋKd0? R_:u6e?z=Ui=;mL?:S::Q&>XM$YsŪK!&c!P >0]NؕWXfX +GRKQfy&VH" 8UUwkYBtc@Q5)1jۋQ<8th G rJ[ ayHZ4Ρf{Xuw7aylwZ$Wm`+LdPGoHi򮝣sy?ۇXEIr>~mv9NPT5>Pje?Fo,+IkP\](_XѱѐHWӂÎd*s։B>,=!6(5_<βw?ifK:kՙpi3-;mG؛۴탥lj-~[*aCQ +B_Ool%R&#Mnf//H&ecT#5F|/)H@ͳ-"6"Xub/X(E6|XȩJ?I$hr>d +ڶrS KfBN[y`, +>FW:B.j@+𷈖BьSm( +0_Ej?^! SI<eˏYwlc"ps/"wb4+xW!^ VE/0~0yڨƾQ=1=^GNr鴝 @ vXR%/љ;7R ro}5~>𥪒?{X=> +G]~(a +ܹBUAUF`V )YrfuóPݷZRaKЁTJ2=^=̕t.4JumxQJ %O9esot^v0ZB^8J8|/Mb T%g;'-D_;dJ.]7/# +颯۰BZE C_*t`űP:'Ƿڡj,j'9  a5xUZij4(smc _ ̩OSе!Ȗ95cv q*l)*z/ZNc {}5kSJ@nrg>{ + ߇_šHcWGԀ—]ƝI]Ƈ֛n>%Vτy,hJkmթzXɝ|)ĵ#eӉC"UF,@]J\aXWb>lōwQeI87Ǜe1q <ϊa3|V`lq9Y=iyKӭGo wi\S YĒ$dw I;nV"CJHN+u+& &]iK7LRSFwm"\꾏炂W23A"r0b[̹̚{xҔ2oIs;ZbT{~,.^qL!m@ yLZh| C9SEc^]hu%H1hOci흗/x9`ܻv,De)gEh;5+ :neX[ljͅt1oYm|Ė]Rp)VS =\q B䇰Q J.R[vs\cј'Z2:>ȷ >0&O޺eŢPjdiOsg֠'+^zuD}3XG8@;n.&"<6JsL!™5j"`zQ>M'(J~,q|㔣ij9w V4 (2p.ܐ|'⍐M]:K\ +GS;F߬d%Llf,&^A{:+7.44r,o/:xfZslMnl') |){r2o5֍")]nXɎ=Tdž$TZQtҠ+TC% 2%eй*@5p{*bĩEVB +O,?S)O283yʢ穟핤W#VoS$!f#(D\b/^?וĚ+#5^^as21(nT!0֩V0Fi;WxY1`2c:o몡@2jY,(&*/WP0|~[1 Sj?Oz6QdKquƎpzZA#ދAnD +J㛐J$iK@o&"geeKs>aP[ʩ ,8 =jl?,fw?W9 Xf@cPVɳ|ˏ\W +TF$A?9Qg<0۲6]uz+PiOz!]yǢ`;bhfi7w&[|@'v(T>:kBqF;K|q?Ԏ! PHր[@ʩ*>3~? + V<3Ml _Z3oM iue^`]^ᡸ2K3N&inJҎؑC|M,eϜ{֏L3RFE/_gt$=5mc3PՌ像c MAD$β͸6ʻHtc +[tZia[x-S; X@д񴼁@1v3U$Ku*T>uXDZ#%〕-zr|^fY\&*78D\̈K +m5y;y|]H3{]IAE]7-Kh'ͫX[7ֵiM0= S EՌO?~ !,;O: +@35QR:n,V.Qnyq/n-z#0q" FϋxJ<ݷqJYs|•*cd7j {yՋZ&3@O }]t`R?<,k]c9E&*,-IPӏf}5HGQ۸l)W!<:JPVN6b:S@Y᫻DɇE7S?T F^\O[ŖmJf51|U~:6VKRNJtĔ(5G}X2JA:?.kpD{"-E0Hd֮;ԱXٳn3G<@/qUJ4~ &("V6NY~0d4{<6#E<44=Cd:C +[t̋*r 7-I&2!c.lکcYO6kt 6 d0n +Mq-7C3O_"v,g޻ C?D x,]@57/E^%Om 6⁂wW7PBϠv KR x^Jq?#nĒIpoIpVmIJ[˧rŎ8 +Tmº"QK0W-L"+ !O)n!4P'*.$qx"*sߘfGʽc' _^M/n'/oũv1>ˁ UU1lw"eE=-{ٺG,eoRӚB,f̅$hZNJL&SHLN:*"@< & +\dyу6Vs*i㙍8ob;ZHm%?>`Ay&E4ɻ2*ke;ՇHR(C3Ҕ'>4̘D@z*MY;Opߢzp ծkI~UB8Bs󯼌5+yy^m5mr- ̟[4(x|ܷk>+,7B+~溅-Fg#[;1 +%\Q6qa•/2j.xp$ +4:gy揥07o8?in#+TeZwRtJxS +隴ΐ weCJFx-lS; DU;7waMC.kt%[?\ +mڌl gm{cD/C@Nn[>!YByѪߙ_%tjqs*~ mo}Fʝ=/y[J+)0\OG[wBk1bAhp+zҐ + +EwA$ljƣp^c*=Kɉ;$ &Q op7f(1 +1%Au_W? KmsBP8Q^ae-A׌D=WiSͻ_hT%rX<,I[cV)7޻d_> + ^Bq| Q+աxGLEC;̇\Y4޶{A, ('g-A:P#t9 ʡ~Ӛq?O.lP9DĆ$(ѦvNLsZP:ٵr*"b` 1Q ),ע)S# v + eO&W}訁ΣC0ҹ4u~cXkjCD tݢo7G5Flu08YE<%`.\.~ƝgI}ݤ%PnMܶrN5N;/B ^]N aܷܿưQ@Pg)=jQH qR&_Ǧ'Xf?2̗/%½?&ؼx(.!T75 +zET`9݉MͽisbOЕ5;薳t=X]N2)c +Dnw6="x*"S{;) _%/0xYo44>#pGUsDR~k@$7rЩ1qbm3TK,7y+C>3Yٽ;ZjVsnp\- +m5@zZȸewpM8Ft'kM/vciIR8ŽhO8JL/ O;hoZLgVYʖ?Qmͪ2*kUq^Tz.LYI4(-7d6/ೖ(66½ +c C[d!ݲKunmsร71uμ"ٻ #`$UF"^a".]hpڮd9tPQBKYexjW؍'Udըtk1L*Tޝ#X{O[& |T-ͫJ bk$lXH$q0$Aj݂bgd׮AelWT sYv1@x9#E..D/SC% )(h{D=l㙨od9_-~+X +Dhj$L{8CIqK #iCV1YN2k*9l?Uj|JGnkIn+6l<=e!uoE.9Bl-AYƖz!&II6nhTh!smbu'*GC1rf@hi$}Zn=6V9m!g+lpi 鷑9K(7 4@+>E`Dlr~H#%o$%f/S븗9 +%Q0g>PzWوpGPٳ Mvq+k7Luve~x?rNN3H zRFXSk*-%{W;( ,\T}K."[>(v]ӏ02m"-v4X'\\>#n?&3#MrK'wb{1!\_yS@E,ӂ?gӄ頃G *5[]1FQ)7Yؒ/Mfk㏟Uge=E +[p>(N Q39xOa?g0yl`.?Ul"93\ujWS42ɋb.6౺@6BD\[C%MٶrJ{wYN&YA|hrmR-O QZTg)\$8}$x#Gk <@{Z;@J"<@9 Yy%,!H9f33Y [Y`Ϣm6z[/nn𕒘'7ϭd+vW1?I.q&A³pB A0;Uj쉍|rUw,^f1AZ j ᳯ +=yyag f:l[UE63,E+!/G4XxQQop55-~ \qTs5)f}dA|,~]H32-G)Li l{4K1 ǀA՝OkTD27T!Ӳ{,)+cB5Th*"% I۲zH.L4H5񸾳5k(/WQ+۽7XK;xi<_|{ym2uMƩghk _,<WaR%PDf-#A\j/ R+Ԉ٪/Q$G C L K,JP +cVFH拯&N!iiSq矄p(0 hօ7҅R?i8y@h͔:l%Oo"ipK4dFq *nc,& ]up̵ ƙꠀU,g=֕"VMCy#E 'h$B޽| lAhtf+ (Od}(Z/M0P QKxxYN8_j]Rb!5+>ڣf"sP >Hи+7ǚ˼((medoRΦ=i{_i!KoR[sd4j׃E^qQ)3'rJ셰 X +%EX󫬁!p'ȯ9b羅A:8ھ+]4=" 8ҡ|N hoъ˒fL9tH8J?@@fg/h'PQ>.f}Y| ݯ2Iɻ*wtՓ0kINp`r5AqzޠxJhyzqic5w~+*je2rZ!؝Dρٹ Կkv6Aao>PAC7AOTe)7Z<Կ +푭3A<܅羄9MNenQFh0jgEǼ( sv1FyaNAQAX\a Ŗ3:͂G[*8TCzQ<"77svuC> +Fw}$-g;8*YJ Z/hr/+ɭ Mbz Bu i]_v;, rW,KOk};SZښ]%CpA¬F#3H0?<փ,)5I ]uD'RTYBxJ;n뷣3XRn+mKkGd:;#xx++` SB]XbQN˙+ E܌:C8-26V +!Ԟ[1HC"ck0z,tg.(>=1VTK֩1U$u~kSYxOۼP'$n #rIF#<+(5}=V (Иj Q>;d:55Tx5x+DAowWJBdĖ# ƜߣHs'dNhArTޚc@X!KTC?+ɦ!I:+ W1\%\ + c,7^}j1\bR_XCl q3D'sےZv<8rm˸Eʧ̓q' BݐA6 Og/RyM EA?ߪ C";9+:}ٻx ϡk,S\35QG@zRe$I8\~pО?Km'//rN_/h;0yGd04ONO-t,ݝI)y.t(elK;nͮE|ʚ)\E2mt}Kq܆mH妝f4ڍ[ڬ-S7CT'oe`oT]Q?*dݚzU50: ǩ#g}oDgMێE2凿 +|6QyE>ǔ"1Hsu7ĴCk5 *K#秛4!DHhgCeeo"e|Pt~$ +)e0p9/pLܶ~7'Q`?TjXs^:AES[>|qx"C0֣yudHbņ˹uW :8 Z,#5@'H>D:$Vߢ>`r"_X#RPĨ.ڿcUZ9n&l3UF._PF1OC aN1 Z_LJ&N%PsMlI{;Xb'غl/K4'_88r|<\< ג@NMxǴb%/> k(Sd qjAE@2`2l<LNsU4Ɗ #}ml?Yι_}uqҐ#"%n7!V(M0K>UGMWp) R*57Ib3yhe> ϖXCK e}HZ&fT1U9v^ZI6v-2" R|<\H$ S[J o/saփGjKs#es"UZ- $x3Jv{JX8!{ڇg~0:N*u*^q@ҞxL*Jow(qsheh3U@Vsv1Bk wX=MGv})?jZXvlW:-4iTilR=K7sC?Xbf>Z=-&:ībP{7l$ues2'Bnf=+Qy t5![,\f43` R +=M~hBl7\ +_> #B2R߾1b#"k̎5&&jC+y8CJA)*wF7NDC4!4GD3XSO'ۏǿK G_|;.:?s⧈#&Z;\ү]9E"Ekf4HW|Q.JtKF6;p9{NisςtiFʳgivFٚVV@1)heo8$z O9!Cr$Nndt TK"]=3_xA -7m&ZKۉz5Im +vOd2V{T` d!)ğ-W[xz"'4Dr :Φ+ǘE&ԷƑkڊ{K,eiQ"ʓ2 !QM k Np>\akmb~8zT"g+vY|l\<{)UHT1M ҟJn7Ccb,U)s$e.xsL\Y z v@1;яCC*-'‹ xR{)qlvo)3`=.|w*<לCVT)W \b5 'Ŀ.nWEȐ12W_ڵzsҚ?\4VSU]UƳx?AzŸ\2 =.(s ",:C(Q/Sn]Sx%%?mIq1ܴݫH],mZ +ւs7Mڅ|߼o&r qgqwA(Fsq ltr,93aY"㝞0╏֕B4 stpD";ޠ"m䧌sķ6h +0wi#?dU +BnϒPy C݆u0 u@"j FO[D6Ԍ:6Z"F*X9ie8V/>_q)fu12 [ +5e `.uflAP9T)b'"f">yYEVn1``DŽ8<8E#ݫyZtH%\D082E%t0֘]$%uN p f)CbwI +hꜾ_ B$z' ]6* 3W !3Y# `<Z qNwcm%_Alj,((`iVKFow@.z#RIz]b/'ȿȴ~DjVmP`gh߱j De&3m)1k&+|`tw7q"cė td22s0%]bI2e0 AdYm!:ɫ\Q,T;^3@GtP|*.[ߠMj51/DmH R6 l[yxG5dLxDPה+ZJ-7L<b'0K|̳c4)TtYБ/mWw_0w:͆yV߬3_Txn{t֮(l՞2I_ Q:l3G?܄g Uy4|̌BݞPa&_b G&AUg4JL 4o&C8PYٞ iZϰ$3Uc^";ι6BYƔo[=1sA]*'am +č,tZ1s-p0Q4#&w'CO&?HE8cזWOfąn'[MaLYukc o6)A 4>a9D1>TCˇT?F;=*q̎m`(c!LAADyk:KΘ+kd3f^t`lt3;(\ *l|yoek,l`;}ԙdʃ$Rx@ty᰽LIR.dHY+ta\רfZ08$@Wޭ^N5bm\l :w!scί굺sqJS7#s+іZ91G凤6įXB$B3R"0 +Ǝ?8:Ls0@+ >UZIz^l~2p)R|p=qU(KgtuaĠ5Jn$ C"'2=I r$՝fZO4D~ȐVA:#ӪU"^><ʾ~,]eyw +>Lf%< h~ս8LҞW:$6}GǼ +VS [o3DIڟl1Av6 ^ f\!DÄqhY4'˽tiŒee`D7o>ӋnN;ǔq$lԦx.3ntvGn,] `W4v|g|`d/ѢoLPU"|D7.IqCn!ȷFmn %5}\^4Ԡ(gZYg +ulK >rO/ %#J5, 4͛oȚX!"yr&Ya(UvN˱\8d,e qp$vC,/XBthqO +$dZw$(]d7]aFڪ!^䤻]0K8[J]6S!:Wb)[q~j+l0?\%J83X~VB^I\ 4*y@Z%N*Ւq2N[P1U9B˰X>`GU-^Usv8ИֱO_U?).I"q qIZ4Z'&]y“8I:jԷ(# "/ФGVE 6  ѵ~R佣*MEaZxL'RcU퀁3\SH8 X:WCZԼ->tUtE#"A=-QPS%ĝCČru-|ڿ/Gϳ`RO| |J[E|yl|oPϠf6ɢ=k!\VNla/TqT P@Twɸ}nydDdUrapV۶<c__$dW4D0M$'1nJs2Em!FUE LNePC M8(H CV(cC z" vqjëhN#Y!hNdP.Z+gOw@aƐ 1q2o0 o$ +׻o>|B73yxz͛> endobj 2977 0 obj <> endobj 2978 0 obj <> endobj 2979 0 obj <> endobj 2980 0 obj <> endobj 2967 0 obj <>stream +HWkBm`wO?\tGw_Ep(P-BqE~-⸻?mp[) eǖ=!p0h-KF.ġqs$Urb E$v퓹:Mpr&r̙,Y$VOSq4ǪwZ 5̍q5v&&*$&-6?m˫f"s5#כfkL<9˶iEyՌ1G Ł,qf +`WwJnÍ: !~LY8&΅pϛc~VC##SƄ-MէsUs7:Z%w [ujEflLS&a/DȄ~>cB߅4&TwW%ybf8lĮ.< MX]f.I#Eӧgz٠S(ƮWnW gkg6F1rPst q;b_]dJ4=HVq>Z +FFŸep +Ck uBw᠌}-  ޿řzHQ7"xKyBʎ(?˜8 S>:C~C^:b^p`W ;.qzxæ*h,$ce &O/VL\Z)*R +7<(KKi&>[`  !bIR5sV$rpOr8PW@Mm#_YO %C^MB5ҷ麃6\"O}-oX<'2 +2Jq|1D[{fǾǪ}N3 nԸD]IF;Dՠ69H0/w۴͑{ݴ7&Hd[ hdJp#g5iZjdtfZXZ9%`e\lWuH{n O'm"HԆ}1M`9^IA݀T͹}r,8p +r=EG/eٸЗs>s3̞YLg%]EBܹ,5;3kT+6Ugfy(-{5 fq+[ud!q9A׷FaJq +6^}uDQPpoϩw:q@`\y4xo=.q8 h JR|wLh(&~~)t:9t=\loefiOz3Abdu߇ƾо[jWs  +t۞ft%@hUIl;%m|dB~^rC?>stream +0 D@&Y DPr=NFͧ9-yzOu&0LiVTpl"G`>:k+ q~ukLwýv#L5A* w/QaрM[7C;r䏶G n+A={YW&^ ' pμg-R`*7b灎%/FeG/Q +7aMxYnI"A +RV;pN?Bp4J0 E12*Yփ#+(,iఓ߶OqGH$O@t'k(HN 17U)~gr"X[jT"syr#<M*byQڤfO2Sg@( f>zv~ '/t&`ufۻOʣlJ}-+#ƾ`^OU#OǏkk]}O:|G*,3kvM +`xsϏt.0#ZL?8yn4D{>1\DŽZOx K')h +Y4{Iv Q2mV88u!gf*Q)r2G$@ ]C?HJSXZ=cKVQ^7oiQCRd0:?z_?Wk&T9fI; 6ǘ"0oP<~ ~Oe|~5kq4 3KpIH8aӣRoXIJ,}>sQV4w*ntG/10iM$3ϔ(^d0M.c Cw_-ۢ.R=d#_ $-6wIGw@ʖCklbQmNÊ*u X 8cf(r9XܚP"Y'aBD\1L?Ӣ\ذxS(oJ=$8~-!=`S8&fjnDiϏl[&ҋ +Ĉ )_ۗ*'N¬++Qr,|b4K^"e~ 1Sl9\=UN^d~b:D>Zʭ8+[5 $00HVUB*|繃9 X҆|]tRem`ґK 'mkEmӉͤ&ggF'}l 49ڰK"Z&>䊞UvkNaԕ(aaf<孽YH1xlD𞺆 _.ѝxBsQeR5mS +x)OdoZ]eV& +rYxET//AEH-nĜ1/tN$6A 'z=k` +]PAgz8R[zQZצ(dT^eDylgyhT# +zWKj%!+M JKdٞ3RQ@H7~ظwZ19;4"Z!B$펿ރ&6F(3f-y_AxjLgVP( n9T9[0jn[020n[p$Vg8=,ޡd  8n@@,㼑`QtKo29VҸO WЗGƒGzFdnmޚs4~S<fV3'HO !p +΁~;j +[5MM$8ǼSaL2|*|l*ϸΗCu N-;:=A> /3˒bԭ?FUlkRbZد7FDڽ/ +ߚӹM[ An d/fO(SA\f5T)Xԩ7wC@xr1~.ukQ7mX +. ֒i/ZY$ST9oW+0߄Y2tvP@K_|6uOSęÐ ]̅(.Pj θGQ#4ΉwZhpKľX'SQ9{s1N@M\5U|YC͠ӿs21ɒ#!:}?Az tx6mD`1ƔXkXWbLntC㜐$umPk=tǿu@a` J wfZJۯF%鋗_6۹KߞbKͧ]ӛO,2b,7 1c'F’4H;({Ɵ>s| )Oߚ"eR$[NjazZUT59Ln/i>C)@Hcf;.eb.U*INAbKݳ>*Nyjvn< S6FD"4ۛ6~׋q]V0SlA1C5?AJ%=Rh=JbAڻX>N݇cPBܻWr7pY+20oc檕H4\󶺝W: +y~Nxv ȻǾɟ)cU-_gz73*Z>?{|Y?f.cjqKL#GjW*QOG__P($Pes' >7e{@J0"G.5H; hY:bI綠e9e24:c>}V3[ +}br yi &b\pxO"31ù 2sٱэeogQ0 9D6뢨{d5$Cӽ0o .t1dI=j;$Y|"k@ùQOynԘJ)BΣa_+hYW=CՍoJ2~mN{;i[wv=oWeY9`K DxF|FCZLR +;ٙJY6d2}m%Pi I`0{8]ux0fl+A9Zumb܂ ʝZh_Q;M,XmdK7^ɜ(rU);_?=wm?}MGǜ6D[:^)';er֨{cS^ xm$⥵3Q- mڶ(Tʗ+v,TX*ieνq'sh-tN8{P/OfJnj{0*uibs|)~Jvl"q/}Yrv}7VRm=-UdyD++m-q5\X쌚/˭$DR0PoD,1{9\Z)I0\Rt.|b+J 򠙿]`uF6L$O>5y/nߟ7 (<6@YL<|–Y*nnlBYZZ#Q*d%ׇpf-g< +Cʚ{ Ic1M̓8 xc>*xF1.O (8Iu8KUt+E0+R\xd]|e`Tcaʵ1Pm)5okCH|ES|2Ȑ q}Cw5Ƚ?tB 8 i_x'T:6eJh0z0:_Gn= +H7_K+ww3#ە{Q1zcT$k2BE՞H5!e@:BXvPYu{>NC^Nj,DBZVZ\zyy`NKJג%b--), ˼PKQV&TՃ=#[??/0 UCubg+? HwV<άvoNRPS^XX<IS7O('ŁE='LjUGfdnA2jEsE2a F֟U&]jWhכ0C[L)d%i9Xt1OޞRiBt oE*[TJD_SG;1SfShSC>(#L]q`N"#7g lZܯq}OM^􎺴 nbPXax3(QN)W `>o_4+0%K([O30MtNekEoF.akŮK1D~uEӫ>pSuRv[5)tUMDS4U4EVs_i=DfF*vifn*rF+Pi׋q9[ %mDzM!n'&ܶL=5Aj{ ֈxU5{g^w^EA +I>7~K;X! =SP|S:|`~"A{K+ ;wmxVvvzj||ϕ7#Jr/jKm +* ~c`XDvi8ظIz2*ɄJ& YzP'b8hH7D3 +]yhۻ} suSߚ;X- 4yF:IrqO )uR`ϔn*4I/$³UuRީUj/+Zŋh`α`W53ө0B- G@·s"Ӯϖ =BCc/L}!][6T +g%Q%w1rjk]9O!IWD$fpj6 ve6Z,$L#<8FOE=ȋNOf` cDOF1[:?E5Id C/M$u0 N{joFMQ +-6}S[K*ѳ Ul r>}ӓ mhMG;B \Z@QQB޺JmDM@# mK-e$J>N UBF7EzUL~VC +$2v`Ri ^"d?GU |$)ɰuK^˥V}KMa{>W7 +v&R.u;H.Y\=_}S&ΪȨ9j R =0>tA{Z !Jc1 U:؍>3M/e jtF_Q[=Bxn';%I[QÜfM]^S2=5 ?$zEJX_wmǠab+9BNy}Ə0b9r:yI;K68lTbʭF1Dd"΀9kʅD]iB6&?:@2_õt( ]/MRS#Z"wSR0\Kֺ +DfUlJ~cwMX:(%RaaSf-]!a2D͞³zSi44qd5^|&Q?b*.S ,oM6עeNڇv0#l~aY47kvBt;Ls1>⁾ʎODF.X}g6/JCcS;/NBZ+fx@Mx}Ѷ 5}weDϯ%4T1VOaêHQ [c*;VkfDm[_0PU(O1Lm妢E]Yk P !*' +]pX#bdiĿ  Os!+_#ٹ!+ǺOa:-BUTNI~*UbuWd-P}d3;/(iTK܃{rE3({gg(0ԛh[`f_W4\rH7r`=.tt-ӭCIY +s;enŶ'*nviZP#`n@+JR\h=&tg3yza2EUhMkr7=a;VxCt\vnZ.>^u.k/K螥OQ"D+|^q^Ǖ^d #TMnå鵘E*Q&^@lKbL +yPtmwygrZ F,/پ*1KpJ5D"xcWtL?28{9+MpZ%S+a3Enķ{>՞3nPxok @=pE46Lm\<NFC&Wa4gNvX0$/yPc:T+H.ΛAc h0̩݄Az%0iNȘeij)ž+9a됯HoR)Nd W}on7B ETGr]qdY8Q>*q(`W[<Gb p(}~;l:Bi1@3, jCbm:1%r`A)Ƚ\:?;.wm^+FP{FYr:gJoPp t[~8ˊ>2m` LޗR- d^o5))%*HLѼ{'lzVO uo]'U[&mS-'5L^ m* ƀ=A4t6XqM-nJg'&ZpfZ71C6PLxWQ]gX܏o?>?T/$QaڮyI&}- ӸIZ> #4I2jg0!C~ddr @ʺlE+³h1pܤ^y <G`jռc*T +NzWTyZ{x`t˼\s"}g^lk-ce;čPIzzgƟi8>FeD:((ѐ7ɲADV$:QJLPˇaGf>;[ @1i#رvZ׮z jC7~eZx4!*;vRKej b*=,TگvKd`\}7oe:\(mrhޙi+ߥ [4B>wҭ''͗`>s +NϨe:~ eP>ct ԪJv\7֍vIQӫ܃l&~5Bn'8ežc'*cCg䵤T*в$m>.0/'){QÈ:N⇭&?K + yG/fcr]a T{!7&os?NvE~!0lC2;3"~^%`-3^깯gM-5XeWΣ[ǟens/γ +`.ӞD{Á"-p@fbZ04Rm%`1 ppLŦl6grSE&OJyC8(SP cUil_R~8top^ؗsԍ"Ȗ_T&u&c@T r.~nUlj݄\j]#,c @fs(ϰy!sL*6[.zWʁ榅_KiMVXd:}`Wλr?bu.O/sJn4ߪp#S3vr\ UbcBU O2=$F%e}W{su J &UN[a56(=qP3JZɀ(G>$ūrUÀIq0K[^0ݍ +c?Kt<0C+WxhwIQ@p3q )'X]Bnb #24d;KEj=`ݷKې,= ݽL̀GS;.MgtΧs|Lih70h^aZZ|^G_'wKwŒ-0f)8Ƌd"kJj@",9cLHʃo:l*fˌ$$^{0tfoF,Ԃ P8q|nL>^ +99oA +8ͦ=8y4 pw[Ax9OA49>>xR^| IđI І+.hc :d0I}IXG>iȴk?YboQ8(=Z0bˁ6[RExe28Sh"aQg]$g ǻHNR"!,wlr%[RefA<7rlX9!%不s[ODamC+*]NIT[Hf@M#}pV5HX8o 8WW(N{Oa 8 <ˣG7CzSRΤ2b@#fMScx)/&N쥅5sF:\4]g#JJO>ATNEP a8<hRUoZ(,${R|DrU8_g}fwW?. Y'<$o+xWkߋ WƦHG;gvs,rĔbJʏQv +%yW܆;GM>/ifvo6Ai{-3HqJRv;mk NzyKMQ FDPo4z{.sX(oOBSбG ?-W֧#]./{ha`}x+aW .v5]S}y֋~)"qVQ)gÇylspb8JBá[PB|kVyֲ3L*[}!y7/B2`yvu5B ±HۮNbJBTZ?.V9B7*Y0Mh(~nO44ä7KA$VsgL- HcЭ|V{uyȧW`g{3~Q n:nNW=&=4Hz%LC [әz 5FN*(鎸9GG\Q-=*?Al8Z-/2dgǎ2,AĮ.*ʽPB`EXNyI}Txe?-ۓ| ufߛÙ Dh)7$GYHjaktw}Fat_b˿2IYGupOگe౑me~Е'UQq1;G[~mQh;Tg+nU8 {!]$EUlip,^eЙZsdEvk[vn#k[l,s}^ڙR8EATƓh4DY?Q a;Dy!J sq(L"eL7-5"۽*G_AJrIF2Sk-Eǡ ϟ$iDDmtD?%2slKQ0KI*(ְ7L=\^9\ڨBJ;~|cvlY9#W/%mapD?bF͚j{fL0V`v.K'A|\e* 98h +9o3 1|umD FO;;yR23} VM2 t ^M$ ˥;@5챐Q쭧gO(īPb`nv\W9׉v!Uބ{IQ'/UjW<d{벧˔F + }h wE-ދ2_6o-&ZV6ogI-IڳW±,`g|cZ{lȓaV& +o]gZwLmJHBn敻Smrϥ]Q'av1=o^~uAv \v#|E|; 2UMSV' rg)YZD_` + ^!?v]#ڜX|kc {e%"Q%˹mp:㞓wd]0S.\|> 2\1Q$+ +{SV&_HscO&0dT݆{xȵ B(93]jKF fqЍHY~lE2r-J ^k kĕ%52!_>V`%̓"3yv5=} / wLm:wrjq >0VEiIu`'s$YjT8P/"p2p]љ`A^ܳ@$98('[WWT#zX ս^Dˈl3 Bԍ#_GbMt}Df1VP[|njv0}[Hc +y!i2rCzױ.{@_(c7|cJx.kާ̂$}I9󶺠>4fL +ǹCF7&` +o' +MzVhnF"I90榯* $9s3쑔h[.W˰ .%-fB1I訰qq3u\qykT}sPxDiD2B賶=s*y;qG׫%\\8 \*z=-'hDm +`e}*Ue~mdLIQk]hLA8(]#Ka9Ak#yoYƈ#]?I+{HgP /[@u0*8A +p,5VQC`V1t~v(Gya1Hլ@1>T"P],Qi=q9{تPm@,ּF{fm ̦@5mGB-߉;Ns29eP +{ݓڿBHII9ϛuiˊ"  j)_Ӱ3r&,8^mޒ:$h73E%mjn-"j3$.Lgu#\_0+γ>Ā$Y#m +i e-agb@" Isf 6 "hu#c?6v6qlB8NoݲѶ3Ε+VQ3RQ |V/ 7}vuc`S#,T +wG]y("]m,p>9?TĤ):?!t$ir@Py?,m]^c"]߰M3FіB !$v/S=؆v蟤~DWXRI0>j;%w&\btS|1^Z'rtzTmBm7eFŸ[/.\I@pltv-Pv+SqM.F1Qpz5wLQ !U’9KRE|`#C'l#Nek BwYWy3#e,Tb4tdbъ~Xs`L(:ethJټNڪ.YZx9;XBM>;1$lj/C ![]Е7$]fqp7:c +z"-4ix0k\Me-HC +}$CGdf{ .D5\b^c^/ Y%9]; S=f$`u]ڢ̼r#$CKʵ`^;!pTyއVGqforSX:x?X'fl+$rWFbL{#WrqaRh֬Hfkik ] \いv2Q t<cDI~Q0~d +7pG/OهTJ!*V|B`uC 9^}I9?m/!T/' +B%m[)lHLeʘX~qn +SJ#lg<Ϲ*Oݖ56?#מR ^YO*@bXux?r b (.JyV2k.մ.7li Q>oi3RmVV]5-cP^.$i6:>0ka)50ۨZa^zj=VB؎$A pp%[e.>~m:]+i< ŚES% + O}ɌH䍹ͅIjwlvuIK_-cƳA#O;]ӈyc@Lf+A=/O5THؠG*~HEq_ru<ж^|m4~Lެ3mV + +b7k*wq*X)ZMTg*͋N~ջ&N/&1n~n$}J5Нd=B֋t]By^@kl?Tܞ*B:9h=ӎS a +x9Mepi!:_y_ P!S +KBF`^$0K Yϸ \kX#w'EYc\/3>n 3n9|i}R  FyQc@UΑk4c`Cv$D/'ȃBS?{BrlbZC;$K8ʽ=h``t.x^zȦWW/0<\EUksȞ<|| +pC1ἃQ52KZiŗ lj|1o7e$Pv~ ۀrGKcNOwiYI^W NWܽan"&B4y6*IMVcn悃3 3|'!'TEv +KV/@=bGf^Y*? wO@[+ȩ*s%mr k{Kc<;vOT̫yX *b0^S_$d3 ԋ"}tm0YS iMMRp`pp?ډ`7YU&ǥhS/'cX 8>+-k5E00ï,=&ɋ|[^TsPڙb̜|hr-(mPpPLq=bӳI;Z ?[~ni6#ԶEH02@mgw$w{['7O1Te^~I5IDyz)ˈC2lh!.?@ VڄGAOkₓu{r 4~ +_"lZr\dOR8|C)$or yЇҗ Kf5>)q9-}YDT%F3֍C1{cF:}-:bѤL_8 >I fcCg@N}(Z"v7#/fLnaH],>NR{g0ۘHx'Wbr O^?tꐊM͙J];ҮI2K5$>tPӆfu6o- <3&~N.9/F6,z@5Sn{(b#k@m\ |nΔ8E1Л)ۡhD#@#54so׹ؕ٭3Sÿcٲ%=u&!E,<6rxny$b}39]kIQUpf)٥X+ +If/VՄ+ NUlCDRP%% +г[<(öuwÝ.?[ v\d,Eq ̦m|J[!K+y9$$U6A4}BX!XVclJUi][QMgb.X8Hʗ@O.fHc +2Cr6 $EŧNH%U O:Igq fe01北m<j N,R6A:2WQαMZ(# gY`֜/]F!r9A_*?UòA ',_SʐJy `,%tb$XLDs?յf|Km[N]H  s3YPc;$є$zQ7?^3~{*0tqE`,_!蒃U-7 ВKXkEr{^ *9gHmb\nاanz25Z,oG| YMV!쪡)7@%8cVJanH@5s NI$/F`[54 @j4>{G~`eqR)\t\n vbTWuK[kRarLdJi^qE)%A~ЬGazPSwb-ё~g=YKv&ϰG69(j/4Oٯ6j,Yg~N=9h󮥼ay +C5u!NG 2sNǻ i dH|kX4#[/ +6re2u+}:; +IPKdM™p׳.GhND5P&yP"Ou,]*BJĮi辮!vWwJy^> +bVG҄XH`XMrG!LJ䎫sU%]U&5|zޜm =qie Q쳖pT( C{ҷ0KH>rET:62WXs{| g3Pu +,2®g!~?D,G!.Ϧ!)}IGKsmqLVUD4v0 +ߎ|;\&t!u 0uX{ҀrNb@j׍BN/׿G +g-o}Cnʪ@TpKlOD*8H~vp9;o9Ƃ{{s-_!/<[Jr౻BC.1ĥG1-a/:tW;{ +xVصīmftŹ? +'x9#' endstream endobj 2968 0 obj <> endobj 2969 0 obj <> endobj 2970 0 obj <> endobj 2971 0 obj <> endobj 2972 0 obj <> endobj 2973 0 obj <> endobj 2961 0 obj <>stream +HWn#}Wͻ1׈{ 9&&29>շhIkAz.J8G$8q&\qCgoylrgL滙%:XZ'gJYlz5?u#'B;˫W?\*5OU9TtC}tp%.|`P-.ۭၿ}wv~f>vn a3,QM}t3xH7#B␫m[7ހR q¥,]][$Q,m792At=ԗsƈv8uN*[2A ?M'/ R2JEGٴ5|y73I *1t9n.@__3„Nk&Tș(uAUC³&>*ygϗ*3@!pN)PFXC"5vu}"#HFT_PjhΎoBO?\yp*tH-WK Upۡn"Rq=YsYE8lGL#<6SJӐ;V Z=0#L'e]!d:W6#Xna3iBNaM{?|UBsc)2~BAIaf*JEhKBNrx[Σ5v*P + ?1!u#<SŸq>oj(oz񰭇@I%sP'&ʙ/vuݒ㾻RBi?Q9QQ1()cl Q&KdpA +5_3a"PS:Y_@^W=CQĐ2Xe|hǂ xg> +)!$zT:Vf32bT Ibd|&\03>Gw\S#"d#BmL S +6~ĨQbϏic,&ex2K+A%`{e-4][O';;c=D*`JWxRC7ʥ"=<=UjȮ>˪|.Bf. XOGeEӦC,aRlA\!w@1E,jwĆtw&%1AD)[OUWnxѰi8}εG`<25Y~[WVKMQI]Y" 3w2P]X .MCp#d1Іܲ^y7N KAqIW/~dKU8hKMˍH ^gX{腦!Z֫Ng +Kkz7<:NOҼL/ Vb2D)zhϿDWA=$ ?C*KYԴ~AA6;nErQ./jo[ )9oK뼄)fb }JfB{rq[ӮW4|-=Q 0Ǿz 2F *cd~W}RW5qHxYs>)7=L꨻i050>;~[r0Ș!p1Oq]=%=ED*R5,,8}{t~h֨.67-5`m KofRXKy?б8EIg9T51\'nW NӸQ}-r{.Pž+PN4,jۛZ޾aC gDuDD?]E &"6(EعE?JE8q' Nmp15ǯ ꡔ@R NuZX\Vm~:z%`s3B&hw˦jWD=(bZe]j8Lq/@o\2QNfKC{ҨdF͛3[ pta0w#Xʢ:'Lz(|Wzq/HHH FQ=qB={,dN9vWU=Z+[ۯcr +fW#;,vFȁNGNKI@jbV]תW$Fxخ=lMZ&oˀ)d@,lUK a]g"#h`nWUTSJN^PP^p$whVgG\^xQftF1-.Hž($]tqa6^݉Ry'‘?޽0B(Τ3sofV 2)VEVH{񃪁2m! +z19 '`5jZݕHN[bX1ͲkC쑔@.XP 6k.BZ8 Sg -C! +Zn6oI5&ijk2VHqAКFy,  /cYuMd!f,7l\&ȊާwM.J4&\[ AY͜}Ud{ó rF1EwDqf;ESkIYvPY~LjQ{՗$ׅ(:TӍePL"5 w>fV*o:t^$2rS2<!q+ݾ9OF-qQ6)9>stream +0 M@&Z M/N&,+78<ҭ"euN:JxgUykBC숉4fZY}?4s(N:ꐥW3vE֧w S:V_NOx ÌR2{Dznn~MM#phTlij,f^s6mt 0\'o?G)ٛ'?_ L)Q4~bFm#!vfAaj'3 lDsP*9y4i6`GBGfXPQkdݭ΂uB/+WV]Ќ ̭3dڸ7>nh#aMq=g9QgO.x{3e?]ۘ}T)QhTܡIZ:X)X7j8|UC2oaGfl>=wܼ2fQд +w|L~yh +lhf)3cL3"#&Ee fq ޕi㷀bt.Z>*68mDq^w*cwxg]jԃ!*A*X >$.){\3h+ #D51M'f6[Of1+'it4ف(,F "ioA-l|DŽ}} K͒Ktdj?k} N~&0hж{uB`[nk㑫4OktPn#jH^ǡ˾m ǯp.ܭY] Za}7u%t_X޶4i/G|7.7' +p71πXbB]~lCå_00:f5(Pŝ,Hk h`h +#EPIz)<6/6F`>`0q8.M'| f 4rŞ>z69gdRY|ADd[A(Hk+!`^%%_E_xlbb$a2bOբUK@l@㐩ooUo@Ĝ WL?>s@H 0mATGLR. E Q4B(eAD7YnZ#UFlOR(dDEb#(;"\-Mz|F9Tgs/ŏ|t0)[a41Sl@gdM\䇺(pʳa9JZ&/50ɪ_Yu򤐖 +nc~"Cˢm~aY,aet`j#3U4/11t:7ȨI#un?{$03oA}TtpgOh&$_#QhImSUU44"}Gp2nf +F,jC,Ix{?Vx9ǭp)Y])p/Z&9Y'.u0s]ȣzW r X姉&F3@@@|=_2M0J"AnL^ KX*2+4Lq +up\8MFd7wbrn}`qrjUY+V ,ax Rg:[uTj:I ^ Rt]eu$%҃B;W~,eG\PJ lȋ\'P=Zf gr|-8pၻ [CQXfSrpv߅ڽ[ A=H'Odh޵PaOe , \VVDU nŶC^`!ur.uH^xt;;9Ƌc8@'pgI',q]gQq7!,oHtpf]`qi* b IK=S$Bsz=2?O:+#J&rf]}_Cݗuz![TҶDO"q]x+ 6qm.eUb@xy_Xw9Ә`z_A1z$LozJ<36QVaO*3ߡK#r;.J Ҵc4(SL(:h k@{4Qˁ?au/M##zW1('[@F3#[+%ՍbK>/,o:ߡTI;2[}pzPp+ȥmn5ݱ#=#Tpd"8qcj!1i3zr9ky**qWP +-;Jzkf Y+ٙ^)) +lOF67ΛTv_>Q|F_>[4d*q%S +h_݊b-&_x$LET)P&yi" WYrR8MZVk^`B^.c H0v,#O( U6rʍieUw #ɍm&x۫yz$X>A-UB c&OZq֭D|zVU#r[&Oژg ߧٍc)8p^bG|0"Jx +(R*73=HxbnMjeͰaGu +3L3#01ccٲ(WXսT'0c&%+> a[Q'"XFa;TRRF*)b|؉>˷ HA$VI 4vhaEQx4<48|@Q䎵ZQڅ{=7S^F&|r*dSj=2BAY \f,iY4'D#z׬5.R.n&əh ^ =5FT3q^COvHKc}sO›U=}\{,AqrdY*Zp~1lBOJb |,Fr&T9\;mg,==x"/p^Ȁ aⲞ?g0DqtL{@O>uݶ2pD՗u +](Un +!`Iχi \MQdN7MjZsTl*zpşF*[ +W]!7hY>sa2ր'KȻE0Yt4VtlZ9F4dpW3H1UR, VT7NOgaV8čtz[$HqF=*@Fۇr'Po_ӝFR'¯p +3L}?;i:k>䕓o6vMr[5l~"{]VC'tɣl+Z6qk +U;[aT7,_Շ#sХ% ]FJVa7AwLl)d6 wKbXսTj*xMOw-mm5Hx A.+ܔ.K$P`}cq^aQHzF5~EH떠CyfRϰScf%MTvWnק94떅/ T Ie6PyY_+?Q/gK Y#+ fZߺkGN '.rH Z'@ +d\#9 +geH}IyY~ddߢr4&3KHN{-}JaZt ׻Vɇ8 <9& +ɀRj|Q^O 'ޗR٨~8; "^:s**W)*#yf] 1L\Kq~p|F tZGJo.R Hg]^҉5l UAvdpV ޗ z@Eq8P]"RE^SFSo$}gϨ9Dlbw\AmյC=_cIonY?L5N-^_D8) z =ɭ#d\[1OFǰ=D`JZe> c4f\"cQ:ѳ^\N\݄:ޠFxhW4Q|8&aE(Jb~vU8٣:O$(GhY wV#݈Jr-0;j *,=6B$ A1h+OXK)7%K e`_e o9؉&;Z Zt>Dq'ߛ mBs!+wL&JKkZJRƌL +0Nw.HVTVP;"5N|b;WhF¡՞^L5^wXM,"Yż.k) +bDqVf|12C'sF>ڢ|\ĮM$2Pʯ ( +p?*ܛ0 G(#|6UG(>cyꁵ,'ͥ*_E69"a-mOrOXDpI>/FB# pPh Vxeb:Z"ɠC=ٙɏΈ78pê6<4)G@KW]H:Ij]4&KgKڮ^2o7rݙt00ɗ&W +ʇ4"뷻Ҋ24VE;x Sr)l|}#GnFGC8ugcIxjydQZci_%άO]J~ wvHQx&K@|W6s i%M߼I'TOoU9TfA|ebx~|~'y86.[AA#*vFG挌w:@# /bԜJmseukW9>eQxW&IιY<'eK[mF5뫖a?{ߦH7K/UrmgY&5k-r׋ꧦe6?5*)6[{iW JQc!og?\ZKQ8@]\8HvM`nN96Z).tG~2*8=I ɷ q0Hئ b1Pdu0Jce?g%ur2q43M~f9 em[(wfNliF+H"\|8{q/øhX'V^=Nɘ8ѶdTw0ۅ;o<ߺC#mC+\ئ4B7SJC\dff1Bp0Q#VWd7™|/y0UHffxQ%=-6)%qĭP!*:†F +z3 8>hgƇΨ\MVk =3vryTbH@A9?}*'hJUDϝ2Ir(ݞTSďrޞ(iإG*%R] .o%L 1 T`'?dDeOK7;+|Vn?P&ʱ_ΐݬ@ʏK)@<'d`5!^洽NmzĬOx2i . KsqWbr^Āw ΛvkU;OPTP!;_pg0і(]5Ғ]mIL2kP=;-KM #aoH.( q1T +Õ[BtTrqDav_PwS&"AƟ&Kp_+ +XeMh͋Ch=Pfitsد;*H&O,n(Tn[ z>HoJJ[$irpfwddX4$]`{#d@ˊCaSiA_S⁦[-3xiG!Jc+ D`125\dRrh 3*|aS* nݙ9$ƍgG +h;'~ӆ8aIt/a3OvQs01~ʆV7N8k] W Ɓ?g]Sa 莣1"BSN–,Xڹe&dNAT&6վ'N=fYUVI[v ?.Fle%v3b p[ +6ABL4Z961e[+QKrrz xfx 0 /.ÁQJʯ9^y4@SUsËzﵧP_?zibd,S@?OPEtdK^R!:%W qE !lzx |M@hmG jcq,p6#%# qF(>B}zyCaqaN;*r,O|cHTmp9D][lԗzCҝswkxc- ײ/)BV+c8 \O 㱗ҽuY?S6Rٵ/ȭ^ FRAl7/#4E+8dzd=IUuڳ!LDlv:/z[,E?iا~0 4-FH^ *{ܰu#MG0m^ߵ%>,wi<zJyātu)J0Q0/2{q]JK9S᫂uK Tbm؅<'WɢˠsKIS]f*𯍵[*rTf\uu +!4c?n܃rגΊ:nMj;$'{(~^tE]dL1.}$+tC[]ySeYcEղAHxxk6, W?4ݸn *3ٵX~m3LdAW&8wnf<;K:\bApZzKӴUWKUk/`Dc!/>j].6DG#=.4EAJTLNMCsQwͲ5b>vQ6 ]2gVb vGWx̧=_5Y_Fi"(+.pJ/ڕ]!3h +~:/,^:F:B-_^dJdyS$l!+8*:͸Oh=Ic]?!F/EhNxN6tzD\wzwKbqSPBX-\,MX )*A%%3&-[HaƘ!}OFg4j/PV+5\\&&cӑ8gcH&.&2H)ޘ޺RMwS ޥ" b+# Xx0C'q\#vK5Mi!G%}'*wF3TŻ wjmf(aݲIͳ- V T0+}yÎ +zX~b{ё})—ˢt-즢ϝ +5W%4W|s e2"Lz8oc۶wuXSm <̿h#Ips^#%soRaNjbugJX:Mƅ>G9y"z '.{Q`7hOgsoSc~כOF wƑ:_ P`إG"%W7+N~~5. j<ُ ȳi:cVR + lixu\] ۳HmL4:'p= 3]hV&dq$ P9a4 #s\aLtD;``u_IIGkj +:]]ĿOEhwЗ!FӢVO $q`rAh*&ך"VȷxxԉW&4bOzɢbG l"pƹo:WǢȒ,~oNVԨAv\m@وVwAgcq8 Ue3wMQj#ʖWj#PNpK$rEF+PIUo5CIBYUqE@Ǐt(v i[nt1@ +o|ڹWI""WdbBV= =W\sIRV<|-z]N3VeM6,io)ۚRS0xDʇO]6@^FVj$hkFIbH;v~UA? Ȋd+2dU2ɨ ɼ};o8:#Ÿx 'Z'}6b|aN'ʓ`!/ڶBt"'Y!L;'zG->6< ¡x!q4>U". ~qɬF@0$8"Cp'!B%pģ1%jgLn{~U6rاD++ ˇ.f(5_$H% {.躜WV3a-ڦob#a +ԣ)324t7Xr!!C6 d|>CE# Ms{E<}+P}Nij' а;aATOT 3buʾs%%mƩ~dCt$-.2z,\k99=Д|_!51@4;,7Xi!~5)]7.N%ì37 -?Xc :š?}_yZ ?MAX ˏ.1#䢼6x07Rcw`b)?죮)r`]nx|Rxnߊ$Hzͻ1Ph~؎ _oPUtD#)IS5~|)X #w IZwi*4f@ZÀtTvqU:e] fSaT8sRǵ\BoS"jS7DMIVF yT/0fi+0.LhS$9 +YaP!uH5TmyGmj- TU3ͩѰ덩-R߃AċCj )f(R[}OPN, +pzWnZы r]d֘Hiӂ8_-Y0 iT'F)A#Rɘh1;.x &6޸ybo>Sx`jRT,mff`aunTXSZ&{獕"|;e~0CD M;=+ZA`n[{޽Vlbٟ᳴?|fLz,؉nu p"1%ZQ ar%zԵSUF 1Г|Y9[z$8X41RT.3 De|)^~%U1!٢y@^![=vUg"Sp#' ƌKeIʱ[ZަA>AƿL*81Jo"f}sjtnk?a,ќ6b=KbA\!#=ؙh?ܴ"`xjg\j!ze.EkZbXEeI΀|}hRd+W)R!z/ 'xIS%X5(Xfܪm/5bVqT/'ՅKLL2ҽQ}2kN4<}(Fq9j%AMo~O!}/Ru+d?cY腔Gyh03bvػSKq-LmeT9<'ϑSuVW7?Ht eH^NyX}H\R ۹Dg~p/PX7-~z?X'g`njg.ߩ d!}F{ƽ0}'T\A}ig $/MR.hr0,Nuup~N،r~~ː}MI!Xϭ?P Ҵivm7CO(6p@% +UgÓW"^O W&CBBF]3%;p +ϗu +:鈵Gb7Pf>Sk@O~*Iւ:<-Pyn|󐷔X׮` QIOJ`tG4ՎM\ -jmRYxNhkqJH8]cđцʋ9Dm2OCRhڅο#ה-|%Ivk +nӊOƈK5(H?^Ew?1~BiB*}V+c+bOQ(P.Z4Y 2u6ԥj5E5&7 8 ؂l5=cw2ȓ3Kh*R.{_{i?WoS%0)?(= @}{t2$YZnz*7?#U:M5W`hD Q5ρW c ZY/`:=7qRv` +{QSܛ| gՂIԗdvAI]ݰYT0I[)0Qt0wlWs!|uhCu]j-?$XeC \<5:]|EYi}\ Zd"*YwnM6c[ij Hp77 h\RrAgd#ْlh3tZJYv ?`TXYbARb*bZ֍TמY7sa9_4Hw?cR\r]6w#%xa! K +R[2^CPwރo/?3*#_R=1Û8Ꞩķ]W7LXQwl3G#jK^i+P2CQKN+ K;Z&pQJUePv~dL^1y}]Ց]v&]m.L9DpI6c✭oxŶ ]" KX`dǷD dN^j*Hσ,]oyi>`n|<]e& Zx%>Gclݝ}e~8~Q9 v$mˠTjlBY''%}2kaΰ½yKKIF PCoq~l3?Nq U-kZp7ƎE=z^?ɇ,"y N^h4?36^iS5#|3 S6QC+ȌF#UK]0 QԎuyFkvxǛ+5k;Up\c쇠[`QQRm!~k +f3H; ` ]:~K,9P;F.(o8V 4 x̞ѹ[WoBiyy;Z#B+_Kn3Xp+TK_0ᰄ,V<GXT)} gSVB5u3c|Yh0Oo'; 7֓PAVzK:k0s6sn ;Ay{e\OJCb><빌5iꀺ aK\6-eՕ4eL:ig% +~߲ԤF3ڬ:(-y Ʒ#K$Q4DRYWq/eN鶪f~KCiqK@^)bU^“URס`>!3-rAae_RpQUw]~6 +{9~rˢ3WyđDS5j!&a(j=ӈa,SvH֍:Fbg84muJޫO]H I,>jhVbc㏡]8ͳPj8*(g-Mx_is#q,ǀz*2L/~E̎bV搩 l[=3]TދN@hnټ1N[_N! B%ǧ.ۄI yw%EYhr М\ˁkѤ"OopI ,r:(*8AkD$}zܳ6=ތKHQ˛e嶧$Ko0,@*0 *l[uC_vυ{OfȎ[[sJ63-aѷ2]U=G+M"`2oxs$¤=Ғ̈}Njؔ)t(-| w^Wa)ԌoVee-.+LkM{12͂_y:J5q:^IBI{ۊ#N@!{`Fy}wِwVQ H^ÆDD3< Ϣ٪7+z"ZR`mU$ EwGb~t8~l-e?]+$(J Ie!S ؞[B;.J=Ft_`J }oԐv|8ũC_{).~F:0 ٻzU5B7{&Xt&S>QޒlEzg?DB{0fU)H우[K/2lM]0tG_~kA%RX`B>ݗl|Lo8[\ԃd{lwȕ{*G/fCoU6X5A]q`V}o_M{O-*"kD3F]Ef`X|=v_Z٫bv\S ~d+¥K;*qȁnZSő|( 3J6-\cU"9RU ! Ѭ)vQ¥F0B=2G]zIL{Jށ=4U$C4S @*Gbo!+ ;_^gSx:|Z$W-H]9 91gS370 4 LNgQ͆Ċ| IqJUhaUN!!äN" +&YYUc?|3e*Jl6EZ{0 qB2c'C +Qzi!{uu: +ܫf1=UcWQ8}8i) \=T0"rWpM>B +pRiխl ѕhܰGmSf30jmaĤ| s 4dd[#Ni{ᰐ&Hk+0`aᝧ1 +zk/UH5g2K(PZ5ä+U:_ ;WzMUAZrPZ uf Ayf:Y@f\Ї$GۍD<."e뵅{+Ce@##, P?r8~7>.5W1EJPqĸ5ORMP_YͥF5c+bH\Tb"CpԹ#!1=UmًGrʑ7^Iߞ !r> +gm+s]7 o2ڑT5S!ЗҮ Z w9ݖRQ'\{e8Z$L1B)&V˥ 9K UG/+i[?RXf. gFeV?-d_n߀'k47Yㆾ n7)0I1_+׏MhxcPoAQ28QWgZ؛^RQA^㢗)_t+Rzu a$ٔjWy^M>bLcG@-i1rfJ"9吘Rm1-jW^=0Dg\ $*H}qBZ.rXawM"*CJrN9BS >YGiѲQFpܗFH7zeuJƅRM? +en=l5.jXb&OFuR*̥䶷o/Ʉ +޻ȋhÙ`祥afqRAsWh%Ds(v<ěJ &]$S,t9j:LPit'ϫ e x_ye˥B}~e& +rsp#cӌWKe ;F `![*K #LN$kt.'"N]gUŪ~4"d%q/PT]ٝ +OTS%?dsq%B *Y{wǍ UWJ%:B'sDQJ[U%[4H=9bW;4QӽBYȞ=pzSZ]FPڅ q\Q1|~&k2D~\Gjmg9AO +̺A>wjY?r%V_}0ipZZ'G $M:1:dk//C S ئe9nH:Y.Tomuj@as$GF0PRɶA ]#o">͇X7a-hsY.w +LhIfxT6)@D.?V3c5WU!Lg\=Az gr+T/.OyMp>noŞ]͛C@JX.3,P'-aǧKcg2c!2aN4 `9?-P@n#u'3\+2AT ش]=F;gnXU0%U7 $,yn { 2sD-8DH%T`G^ ,L')|ZUv-Ij͐ĺ-{;]h6(ae%44N @smEQU{De6d-CWh0`16,HԪG>&.|l~CKR@$Q L3 ybCG#C,D@vcF(]-YCx U:lW%SwjlDhV퀼,,56i4ָ; aNhk>.Ԧl u +M5Zo';8Y p%6Lndp\lP>ZodEU+.S ODzR:qtZIJѳ MƜgQyXz3Trl\t`Ajo!}͡9_BY[u" RCtfPפ*9 h-.+ E4k~?n8L% j$hS2(U; n^bON'VGo՗Wڼ+~n&^ҰdeyQVu9NȼBv#8=sSg4N]hLv4U~Yv05a)2Fa)]4:ܲ|T?ή- m09Ԋ=)hcxqQ2.3Ҡԇ/Qj%0 QտNMZ?ypR# N[0('Qp(o<bRܑ.XH endstream endobj 2962 0 obj <> endobj 2963 0 obj <> endobj 2964 0 obj <> endobj 2965 0 obj <> endobj 2956 0 obj <>stream +HWkkX_g!V!0d KXo2ݲիu*!8/ݪ[ԩSVWbX(!H]#^|Z__]o/HE8fWae*-ܟL򕔲Rz]nV[Y1V‚z{˗᜿{Rј +.C6M8&翞Oq k +Wv%p[\2#;7((ď7]:2:o=)-lKY3,~>v. yFDuۥ|0a aTTc9t `FL͌тn+1pW4$lޜH8% sŒK\'2%hpLee7f;bPpE(TVB&8djlm +Ly7 tkw p@"f)DjgC(C[keFWPS}yq8;2퇅K#`Jɭ"wEHR#`Q2b(1H{TSbMIm㩚#>̇>޿0*BcHbpEI3#(ƤHX )16`Y*=Dd2~y6 yڿC9>|xoǏ~ZXiK d!TRIĪJ{Јib +g}e /K0@.0XVU$X(M9Q\c(\'>ڤ1[4 [n`o\XpRu4~&El1^QL,b`  ^%ԓ"|xV|u{}O q= +VDZݘg%3n_v'mj."sD1Z&H?H/a$s.!N}oKq: d3e5CW'M&u{Ԗs#9trdky:v*v"H-`>%l3 4}p ]&ᇂLh +Qͨ8D5%>l57 QJg6 TΠf{tHQ FWX2KTC.ڦ4Gtm\PLJ8xЦ9>C> +񩰯7HvP)ቑnaWflq%>emybm j0ϯXlE?˻76BM<[YR vE 䜮A QNt~d\ФجߏפE(xPߍOa *H2 +Dyt2oG' ,y*O+[hIjIPNb~p?q-ݴuMMRQiPfӭT`WW]]R&CEQNA:IٓRF1P<=ò֊R iWHsb&t I6ƫ'D*%I su0 +ۯV$DjK@E?KUnmpJfOP@:afGa/<ؾ;03*;Pw'DaAOY +?/h{$e(SAS<5UL'mK +|8aM +cb'0 $&~vp`ԤFbmqQÒKj0;F; PQ(|+\O:Q4ℙt,@À2$ط j3 yeNZB to?RE +w|vCykJ*Ԑ2Skk`\1r z~# $]ؽiRRU~F cm׽)F q+3YIGS%D )M,mGB GAC,53h;$$en~6ʄ Pujؐ<W`N!*f(k7uh"&ɚBnNFI4ܤ8sqV,y(cE\CnctX~L'+&7b{8d批&A50*=n=LYMLi1i`K @xumJML dN|:feq#P7 Q~{nDJMWtZzR*i}U:Hz btFPaW7ΰJ5ˬZ:NǗN4%YPb&q)θErB9hЯ<#px礱4c(G?P6Bmĕ0d׍DfO +>e)S&% yn"iz%Gf܏+`0^v#m{w/94NΠjƑ%"(r}G Q k|L$ 3uv;-tŶ *!y3N@s=_HSBkz?ܜЂ4HTY d-6.!ufkKN:*$,4CW;erpYxF ytp:~qxw3N 2ax$x/9,b$F|syv~pSmc1NѧD&kݲR2 ]3Bbj^ Nﮥ ~726P~q''L Uî+[_xGJr +:CΧ5ĊC!4K5Dh<gg^)eFq`C Gi?5Wb]!–I0wjڻ;T qlgM譁Lb lUVZ{vlZ=i?GuG %ErMKMԳ3z%OPDM3?͇rʆ,͝Wh?(\e։/nEd+5 6YKjs$) CrGL _!kzjچ?ګZi VWM5ي G.DHqZ-r^ڢ`ddpsMD,K}l*JD@C'ɸɚ$>dKR1偗|'dS%QXH1kLVRf*BعbNk0Q6s-הV[eJ'%l-x6QꇊFS5}碀L!MޒqeX_ԇ1)qM,}} $oհ a?H&͋$Y](.*y>F-l(oͶSdLDVZE9XwR~3JP^VA_ +W? ra,R^RW oa>1Ib2N0:s+ȇJ9+cJt(@Bv@dn}GmCmػ2 C!>t 6r;YN ӹ"9CG;LE%hO1"Qosa>.lI4Z&رJJǝՉ^any<) EvقP ϒ,!$hr7c,[A׵i,Υt&ZhV}ѣ&.<[)ĩKZ7B| ngЖs#DJƏsQ ;aRD1kE5TBBq 4KJoFJPDm.^_!3{PHo@ +&^cɇK@VLB&% n@ WՖ]_rՄY͵6iXRƂ&fQL9E"e"%3 l=NJ)Dًv;+2I`pzf1L# XGis3B0m?QqI\yyh-T۟X' endstream endobj 2960 0 obj <>stream +0 D@&~ D㐇Z?ǻ +s*3e~[7j&̳;XHmN֠ނ1ꩇ1ڎherm +yWp*AD T23v2S$ikDlO!Ș0Fw(qv%f  ͯ,2cp!0aڢ(\@%'@Rkc< @"ixB|;O\O<'s>^4.l[0[afp@6]x*.tȠ}Jnt`Q_\%HH.տZWQiWqEPդh8)xs$z3 -{CةD (.o?ryLE8e!*.kl=VY߼!M YZ%~䅥 Σu&hrOtЉs';zbo0hX,W/E) B uFبy9pѤ8@4mn1 $#/# !NG}B؁5d}ZWf[,H8kNDe3?EQxˆ|s}ƜA;7Hv.hqxy4Fmᜊ(֩A}J i;݃U4Bwc2 ʝ&c8#&*NWm^6Zg +!\yp  Isڇ3jΣK]eu3ΌȅĔQ/|ua$/anxXxE_i7`yΕU6M*+V찠OL2]g0˃8o^ܶ80聋 4@П1u𙔠g4r;ma|8VŃtZ\5p 5s?г9-c5΅t>EkvO^ + AROD16ҫB Pl(S0dM Z]2$Y@dJGƋ.;]*kKX^? +d{ڏǠ&4Qg6~?GϹWʅ0lA^z + ׬Gt2?s|k>ەR.){W4MFT٨lkg*#c؍Yw]ݨ6@Y jJ_h}1P7A6Ǝk)$OU:KX(Ap~ S/e*m9ˆ⏎OdM>%$]K"g_ 7k~hp綖[y=@?\;Qǒ)ƌ!@އ?X Xjƴq jCQ&c%=2[t^rNSԶ +xoٵCJM`M$ҙPj\E0'QEt +qv.y2u>LV:QSE)6;,M,$Rק7,ȂO>S:B<hqw !ypDRu.A;aH#_F y"ДT?QT"ub4m|)QE7z4/r歅0AxMen +tj._xqUODeĘq;ge-oU_C9~^Nb+$6N+6% }Gs+"xIQFp`U ?1 3$^8IzyϽ݄&ŷ<Ӓzsp1/N@ɪ1e5/u$Lxa ak#Ⅱ*ozj 3Vzq>>"v~jDk^z'=sVc qW2wj"XTO ?cuq̨ !ueݤ ZFbKm>.<_3j{(B|eꡊ9BVlk?`J~XBx-%Mt&KuksD(5ho V)WC>/{T_ِ i/BJYM ]Fxr^FF~,j):A`g~)B,ŕ ߬W.3FioD:L>R(lv9RWO+_Wf5܄cjcausd<2rG4^"yAaP%E-6Ia`qff*#icf01D°p]-$0,YA GGxT!zV؜16?9 u?lH (!,)&3j){L`r3(CC#J^tLAGn1kONS; <։ؐk$*xf*,BVv֑"YKŕhz|. +NK(b +īBLe.u/goScinPwP\P|T{1[~$C'ˏE~n{M l&oz;v_`1[q{K3 +d^dt,@]X1*9PPdyljDms!ZgjVL%?LO_zC<q/V +>Bݽ0$Važe)"[) b%Yl@[)Oj7? n +js<ΫB. R(iW#%k1zgo̗J6ExSb(s֥ X\,,K@2sYZ 8e3\y3E}iwha*#`_xOMwca^bk?+*q +>SEWNUH +)SFkzsj1jJw'}iJ nhPQ#Wzswq%eO»`;4f8@{QqTs o|חRܨwr0IJI+Q?"6sXc_Ie Fb\'`cm6W#.u,V ~'FmB9 +r0(}_԰|ݴ:1Д+8WgN+`W_=AHj*䞐4bQ0Ҳ[CV_V @ސ9h~||fnMHgd `pN3ǭlU} 8`&}Oe KNFI"j%uuQY9uaZl!nMYUTh`( {ޒa@ZձOOU$5b(Wbj+-ePYtFb'ڙ`4~D=N4fWAkSK3檈 AVy 9βv'Z$_f%F̶֗NΘ]ҵ.ptYFbifq>nM΃9fy wŀXmդs>K `LYa2+_¦k .m^i0젋`=)Y翢Ö;5Z)kx4,2JNtӎZK /K+o sHb bK!s:,y*3S +1v \>ѵ71n& [0SU,3_rq;m.ZԹe6!tU9{E y!yGce*[{ ^#_ +TRD[0aj3cLl\fQh=*Lel[d'&ZGb秓~!ǐIUo{ȺPFF)BPGӱՊCфDlûy@T%kWR^u-Yo-G}a.ᄉaN($/u_vvQaܹk,K{¤?&}La:MG}9)\%1ͧ#Z_ |SR.m $A Pap4/>E*P"zx?.KKYe9ݕI&Ӡ̧<5~HIuL*x3cğ[+#J-"բ *@LhZ Puw +7j#>* CJ)>‹!?ڪU璆MhyzLT2;v Wl{nx_zg݂џ ٭GK2hNtW9l ]51"ZWwJ@Vҹ-¯Yu\(z ɟ_j_QztsZ˺aXB Ef<x ?J̫-EG8m|Ik݁̓_F OvoB[\fO`Wf]҆:d#pm=)r]yh(MD7L)h9db:}5 荧" $oT.?K|?aU{*[.>\X0 @0dv_*5ҨFRLY(ˤ_`dGx?e`3͉LFyuAf@9 MsHd@MS.5*odZ0eg#??M؄iY*دv6w NvD֖pLl+jKMlNkn6}Tʪʒ7yY_޽j $S =%KBz2BקbmF B:JEhɂr^ξVJWksFm$.U6+g ?:W\v?l$`'BKv %Kb}#O$V=býӇ;є)*IcR 26&# psGJF#%=| rw +[?dF;X_ЇlqT.( +y1,)i3'\d~)rPkǖ'!{ܟ4v(! }9W(,2= ŔaG2kdvfD}%Zt2m7=M{w5 @ > X*ZNc݈՟`j} 8q~p%\1z3YEi"&+D1@C\+aHeHKQ&à /G=i!~>xF +24^o0"o+_B7`P1gE*24^vFQ|+.gVtVr4)p}?쿻+ɈAA0f( rzJ )S WmXYI<tb=jU.t?Nבޏ sr!biSHZ/D@B=ĂJ"8(8 t"0\[؊C8meļя[,EdƂ4憐7jbd'G7ug6WaqQ ѿ|& +&JH`t}zV1Zd YE]`$vf,Zb$()p.7yZ&+齖]}7KH5ϸ*AʇB8]o]ׅ_Zs[,xUB鑿諒5|N#MNF58b#bÊBowZo]q?NG7 [}f͐ϕ/NtEܦ. O>A6MG\Im|(\Լ='԰ZJ9xƣ@Rv[q}~@&Qna8W[fOdHJ+jrjHFQιL5뗁TktDqF&ˈz7˶PP;ww%z7L{>&t`(f3*Ue_/_*ES_.ZH1w8NMa +`IZqMBjB;փP)zkn8M%^m;7ZOػЋ +ۼ0ḟfd-Zdy+qx@֢ (-Jv58mÈFkn"cz7(`^ҿ񆷢(,Ƞ˪)#\tWl\۱xJZs¨}uh:t:#ȡLO8kX`e+*$MdG/aT0F'h-) is8 T-A#*!z,̡v +usMkAdg@ |<6,%f„VTe O -obV yDxeIW +-1w@h9:㽲=pD0,⪵p} K o'=)cujr/D-cY/|iz&'Jv( 9z} a%u M(BYlsm&n"&9b/ 69r3 X8#߅҄Z̐'o +E-rX[>r*4q¿;d<@;(pμpDg s_E/OO +G 7 -!(jgMd+1'cVZ\&]xKrjlhn1S,vk'0p{9[pI;h~"k<:`"cPnY:pLf,{T+o%,Ѓ=dtJ8(:a0`ݴ=2?rZ ϦP}J)hUHh9I74㼙gq./ax2BTilKn{B[Z ׺zpDpn޳7xQ z"STwhjnz$.-D{A0wGVoPrvp{%\ O#Ju+ڜbMZB5ͦ7ymqQ܎/޽]qc,Blڧ@)rQBkb)\( ^|ǓZ"%|p5LRFVuaY0^-c[6Aw`YHb#Zi/04{  oZŽcwJdN3n|f[iqdc%F4Y@(׆pWH慣`Q %i$|#! mR^wx/[ puvoPtI?tm5rgnPa:l{Yd-~ulLc`G*=Az)L.)dY4}3m.HHxb7=)e$颉$mj.{΋ꂦKN\njJ,J fD{Nk93>u:ZЌ}>y `;eAW)99 1kTE{{a=ML_rF7x+;vb&_!^e +])DWI5&@0DiT)j +/c}'s!LJ*Y* +UB)cޚ1VA]2*{f =9L1N~4&[ fl)#ǍcH3K.TE~'Z]4n;r+u3җC.iOZgb@'Ȥ6 ak0YIJ +qFȮzv2GP4r8`!pYa.j{N2@wp+>|>zХ'Wd iE?]^[[mjˆ>#k`1*6:lԑbS9ُKdJt _q +9G;4PAnL4|7_SR9u\ொ1CN.@8Բiw!f9侸c;Ug +3<s_oBբz.CKL *JC3 +wux_'Y&BT̲FP$Xr+q(DouȠmW.ǥγbQ⊨G+b6oPuyBDs%%&aS:Ğտj\15eonغP63j}mYrZ{T ד؉ kWw@oa7LYk * @w"\K_u?IF_S ;IeZ\`fGc~yW.$(ɌrHJM &Eˁpw +dD߲x^;?"otS$G*JwC}? S\ػiuƺAAzg#3N 9CВ+_mfcVs*(wLVBY]_MןX1<aGub7׶ff|*Z.ӜȋgS*]dwN5:~DѢ}uY0_޾ԸiPAW]H|UMftY4@+aC6yvO0uXp &9BUsŬ ~5/倵PQ5|HChy~T= (#)1fWWC6p 5 ;MD LCBR\v[ZA~oCm> Fq|Zʷ:oj801<\D2+8sJLɓ5,Phň G[%{O`uZjJay剩m:{i_: +*"gUr)hQ y{=,ϰDͷS3I3o8*Cڥ};-3+np.ne6.PO7"%\ee2& c4vY2':2& "dI 9y|8­(;ZC,co}&'}9<_3- OwjvͲT#z]7ҫ1Y@nc54onB) 2Z`ŎR58f\F\|%!Dp+n[(S݈%j6 :߈Rja QkJFV;f= U )Jd f{-}/NߗUWt=j|Ғ!\.z|BǭDh6P}hTɋssb6%x@!KHnT#Z L9s"[WK6zx-yb,H^G_kq\Җ.H_qdDhjJh"d"/uTQ/;9(aypJ*i[i`c4V嘅Wq#;3Kӑ[;BNI;SҢ0us5oBC +zYe{ތ `sYr {[V/Zc`opiyeԭR{w^W=;p 943I +SR*91Z:jwE`x uy.ڞvB3*#aMvlJ (yAXx}Ҋ,1p+'Q([vtXOQ7KvqQnB x=N-{Z%b +0ME~9S_9oȞ$l~?;D`g& 7, 4`d?Kp ;$Q:1*EHv7\̿RSg~5ﶯVk0f}+yxDt@g쑔b|Zs{/aP oeQbts?ltBT}½rGr,\=BS E( O82/Io]|VYѩð +!8pKߦ-tU>d`@swO`5Qy^hOt=yNYZ"/ܱ|Y\iM{ӱOyz_3 n;w9ޛT +$7I܂ֺK+tl>9a١ OW混;qFːQ+RaGx^"U,bM*4{; ҹ@ 5oe +|He,{ODju~/CQoj*>>,//Mc词<}xS7_˛ώϗ@ClR+yn/vbOyⶈꓺMyw`(˗ggD`[,YP2cSbS'8'/LuθIM}L0YYGtL +GkC}< 4.މ#_osR LL-O#. `:%WkY=5m䊓tu `dTMn\FwZ7H6zkwk_@`: +".8n:‰6RԊfr%Wz /l&jI_P=+4IPOy}CȌ yj G}6$w:-ċm݌`ůqF T7e1K=> C+8O[', Η=! x5o|hGG؍/3npH +x&ɭ $ :\5cPf\K.dyFAGֹtxsmdaZUʇM۬ʒUA`]-zB#j#ݸN7`4 MO]:v 9S +ޠ*2gTb+(_Tv$ҜF%s;dKkU2I #Rc٭Y(a0삉m^rG<[>-ߟ`K3<~wKߞ$uTs>3)ze@-fЬH`$[4K1VCς՝ɛA;Ѷ\Xwe6# +c 9AQ%@coѩT-ߤg*y8tzޯN;gV,'=^qlv1dStSOokZk8L^Z37we֣^ȍ+/x52UK _uuc;N*}ؘDRGͷнA_2[슧  w!>_ƠcJ d m gAHrTBk]N\PI~cGaߏ쭬2&t݅KŚZ! H[OkMTJ +ջpYǐnˍٱR Kh0 UsM{]+Q{@D1wH '6G<\9H,ϣyVF -yY/[ kڪQ@bk& o7z%^!9BVkZVK,_s{Ĩz9.H[a]ò+ؕB' u#,=L@Q4t6’+>uT{QvCko -3Ⰹ6?KI?]W5] @(D$Xd.zmbK+a2Xd~;DH|$M;{݂R6Z ÂQr0 Jzpȟ $Nw r BL2SB=y4ѽT{ RJ~*3WP[5׃I: (0ldL!)*{f}Tp.biEɫ^C_k֫rޫyZȕbIAyٻ+?H)[} umo@M3\X?_#`C\o`0[9]9Y!\(? +Mz>صc矙a 'm+ \x|VL$ت~ nZK:#|Y X̢|/Xm4"fMHePS{m}w $Z~(x*KVxKO,+Sr^:c `ýtv΅C#5VBlS&`6379X?іI|F 2BZ1LeK)e*/_xN ⣡Zl፡] c0 Ls^~I6,^5ZiB5U>Ro2~&nq/no ءJi7\.*0xzLyP?eA/M4@}ӝ8x+q \zOS + 6|aW]`"L܅'I%)PX1nڊqi|WhKq1iKg.Β1u TKNdó mv~!:v@~woVW= +働:ܸ f&U9Ks~WpX"C* x$4~xZE)X@?O–KBu]}n'ygmOD$,lLUwb#YZM~ 39i+.y|L|nЂC` ~ +qSjc?m*Y6ʯB*x7fL@2>>NEX5vlgjև9*߈ĸuZ$Q!jԕlRES\c%)[wk(̺b9%LAޠ_kp.? ¥`°?g씮ȔY I6 ?++q(:gzĚH?BJ-Ь7ŶgJi =pzlyhNdL`DOy T$J. }rH1ܙ ps,-,x_bҰ߱ Qғ S#U[*%_*ŽYRk9P'TΙ敕|/̀Od//I S@|i^Q3H>d*Y4q+cy: kO~5иO*Dr~04_{W"Bq4vzZz#v_"QsG"/xrPHts_g6kM&ZƚP7?x2=o 9 NXv3bA^ ~+~CM\L5xb,6"Lsٲ HwB&VQ6a7wc9ew#I?[) +tmgwΛKs BgF'4Rwa ]?!Y$2 \W;:1cجK MEAXJʘ07@vjo `&Ƹ.DH#{OJu>^u&z`GiJTWrPBVCFД$<ȥ7Hr MC v51guXӇ=Nk d.T||uNC3Sd4H*-h}nbGvOAj۸1UB.PN-eئ%`Pf @J +^]i>[S<\wO M/gn%7$>3o uz8BIo3իSG I"obTr%RD^-Eb.VK׆K0'_L_y,8*l$]s1Nˁ6_{H%BJ*q2^; bbzEBk5V%S0l-|`{]l}N(va ͱ&=8b渼ь C$z@Y?`xsg̊EM0vߌqCG_ [l'%@"v:;8iDCֆ!5ݥZ7IsCWc3 )˯ZV7oucvLYPXgO.=`Jg eP-EjONT +y&Jh3ZHkRgwI!妖6*Lݰ?qT|'y>Lf.HCKN$hN'jcf af4*(fd&Cږ`]c1Ҝ9AOY23iD!: EhUb‹ʄZJ^SPa\))6,H˷{O/? z1Q;߿ ~B}1?ºCX(=IL60kKÓeac5,{%9\/g?!ls0ĔQ]?Re# dAf5&~Ri`A ctTb8.W:{3Jk}|bs‹*mO[1חC?H5 #ԓZ6!ɟZpFg5e ޶> __blB t&4>xQZd9p8A ?*^_kI|.TO .- >"f[1@Թ hiLTAuMuT-& w_dؽpJ/^-GL VhCg[yev""X{vf jy [bYww^{`QEk##RWlBe䤁f#){NW?VLL|Pv\%Bde/fǢSPeu`7ӢJr4 +"QxORZEFlN} <,['9vK)3jhAC $j$ΑN Jܗ^bʦM203vҐzWbހK~`&~sg`Al&ڊSEiwn~rh"LR0 [^(ulʹ)@6nPlۭvLeJ8!컚 Yo< \+-.-R<'aV?z&>.'X,?.S BʤS^uȵNc "Ju,8WUx<ܔT[yF#` _4V؁aߠ&t0*a]V+WMP\Y')mgQŝYfxZӾBgGAG0>l%EP"r4d]e?:Fj/=bsVS~\BLH+75x|a//nZ9!̌EN8!0RSH{} )w#ٺZkjJ! LKonY`؜@O/=w}!XAIU,c@Yl  _"#krwTRPT`]T'9X11@ɮ+([oqIZym~hyh ?ZqYXEIrҴy 1d^r%7-te@ò F##2+IfRBO43@n/'Pܭ%խ;F[O:\ut)ưI mvx>1R!?!~yjo|5ǩ'hcQFd8S%Bz +w*5YvB&AIbjQm))v]r;49 lV6@hͫ ]Ta+ +twVpulbltMJ ũީam)8>K̯uM!NQ$0H s',$] AꛤK,QVvND߷Iūy8-#@V;p{7P :Cȥ`#u@,V8)0aPRb? `XrbEŧHNU970:k._`^4olWHf Bu%T*)x҈QTFˇ*sC\O֞XxҴ.jԻDV_gOI@m%}),DU(oᠿrBkNQ ?%^O{ a ",RP<ۓq} ơa3%{OHDz{`c`|̳ޟT#Vlh)k3Y<B#ɒ5&Nj@T=`F}•e@,BU68F^ ;FʋR!~UzE'} ցi~guX}y1XX`(XtЀՂ(>^|JKJضdi畨(@2'.`@;e:^6L!2M}u^~I%b&Bt΂3D+#$? Jt0#?s֠wök[%Ӛ1C^vV+jbȍw Z!i^glPVsXu>GBa=VjEgu:]'RWk5mv}:wltr۝GIf +T,XǶMX9Ga@V^YuYwsh GL; +o}2,vPo;,̴0tod6KPcXMͪ VW')q7d-E+À2 na]3G֮(=MxMJdxV&O dmAG<꺟wjgl8`|?s +x)E`LiɋO"Rgᕈ9X5_eG&yHa ;SH_OS@5ꥺ8-!D +Lyá []'hף,o*Im%E;75*3>J@z¼PI +qݩL{ҭ`D5bGxUՕ^sd!0P rݐ}`(7ޛLe_)G817XX.0(PycURq݋$L2X[u{xGw Ԫ)Zr/RL<^=!$ !4 /e\1[]Vr\3Ǵ2:4oY 5J_ G{vσ|w_ԺDV@ XwmJ4p+|^+RK~4̦XBյW(*:ErrµS` LyX/y˰p[f.`.\m?\Ca5K'hTW2"LGNҩV q7q}qyM'Wk +h7Pdv_˂&q_A`lڎ[+~LL Ɲ w?Ť?lݣÙsZ8[#e4B S'yKKrujD% £aͶH +"ߵo.D[1MݛU#~(1+Jgu>eq_ĞWgX-UP :b$^\X|ܘ|ʺns|%lƓI.5U FwNcjXPv{FˇO!cl@}B/dYPFTUp"Pt j,eb[cNiH8I2 +UcGoyצvLpFH)p]M_#9)Rr:_%vIsnݴq)/OڔmNcvy2Vށӏ¯аT"Ϧ9gĐLB9El F\HɟLiNOU>1wA SwghOJe}7U#'Jܫk;(] #B Y˾Gў&2%X`l^5KHI踁"icCtG1(Zb=A#`G/͉)ANx޲ +Z ׍F{>Yէ]0|0-N|EL'A ^$'oE0A{.=|2VCDE7lft9.,lrKr:GHڄʾ@+M,#VP"Ek\qP86IASQV<AxI&ZR °c൭,ŴǾbZ<衰㊉74nW=O Z<#[I{W➓\%wzW?jn6VX9qNF+h$á&S+}_LPZn?M^齧ʥmngUrpփo2)c~J"Գɂ\jPoR[]הSv-h۪HR4F+au@k`uz5I`i)nMDV+5&\N ) -I>nпu@` +1Mנ".+GDM عᵑL@!ya_u5g揦3Ұ NǮ3'?4·YW1 +`pFIhKK[Wc7SS{%9(!z\CвVLB fQqN73Yjslc&֔%iC!GּU4D"a+]sdp\əaWsJzkAxsި&LMࣱTFAЙpF:X\uL}0"H8ePI)ekx88+ )Z#qXNn.4rCH]& {؂3Mk6zvA.5HZބG]tXmc8LWi~K#:\ELL_P\ιH :aH4XC{_bK`A7ƒnm=Dn g)!JcQ;)EK(sї6ICæ#R!E4szȆ_ǎ%h:'a|P+@lLj}m eFq94nŒ3bA(B".F+ ω" X؄qpVx[(r4U f/[_6/a/$kBDE{~Ə#(ʎ{lvaW"}uh(IlK&ɓ'0gE7׊ +%4BDA%ŇqaO>Yl${cX@ V0IU!F]/P [r}eGL vqf,O$(nF,A$݊ZA/$ Ty)htL{݁RdPG7iFVs*ZEvˮĸ6R`kBc׏M¶>ӠJk~Ey>f]mI*?Y.ʙ= H1C[7=%ؔ+*8u)%%P6+?fc}F6ʨ6!Qq%0SbEd'#S > ,xf Fpi/Z ت.,)$lz-4Q2Gcm:i g_8*$qNs}@UG–8Џ`t:w0mP߯tV_TjQKOjQD1d[a;u&J?-Ln}K(0=un |\7j7LtuLduH bSW60SķMrkSe"]`89,:2F H:-11,RR_NFz%0HOq/YvX5mW煆feMHo!0W "J@@p.F*B|Cw [쀥O;1X wL7zJ^qƧc~bS#n oy.J+ 6GGi\DJ̯a E3@W {LЗ.!a~ZSAVduC(/!#M?}[pj.7^eG/.ȒܞşGҩ~d?IVCqB,=xEkK sPw-: +&=%͌`4vE<޶H>߽"\c$7֗* -Hd7hF %[CcZ;_~4"ĹmRF5i=OѠ@6ςWLyy$1 5 .FyݓhK+@u5 4^N} ;lD;B0P;&z[ŋ@(5}yʴFd `f֣*S5\l[)jԔ15;}(+g^>3*3[ uqꦼ MFryf)w$j.:ZYvkbRJv+_2.PD6&М.R1,LMzeM=,bl@f@d#sq>[%½ȥ + WpK% ͠C4 [z Mn@̉И5ޑxYH3Tl8yMDJ}d")ƃ3l*Pks^I) +)IbL,x{Vlyso.^Mуu[ѯ>BxpC䜲o`59T-یPL) Jk6Nc{quy^ؽE| aR;ahI@P&WKBKYKJS\"$1F + +]CƠa3IZmQx3Y634AwGP= *{t\va& I&Zg62, $ | 44q,).GY 7Jde.`J@|Z/FGdI/4?+g?-3׽ RBq+\)a#glaR +DDeFĩ +6BP2Tv֫gajWӣ/L{,2TQ@ Y>m(#@M;u %K Џ~Uv!"]GY7Z)G6h"~V*tKWA֐PC;ݲϨa7M2,h]b9(ff5`ˉ9㑀Y0JM&"6ހyO;7gm|9V:|#Zx +[}u[ 7drrO˙&C-v0U>CdutklN krJ_Nykn n@r %\ؖ,Nv5RRUb?%J>f2v80,&34s!&$L z9%o!psSRͻy2l< Z@=3V 0xnl=sS+8~O a8*aB MFC@cI$%켪S-"@i@ +ݱba~J=Q  +kgܤfVD +GSf]zUlX'GV%u9~ +RD(N֏kbFZ*/;: !UE&K[id4>B272KsoG-ޟ飗%ӱ_G6Ĩ8q” ^jJ^*ʩ }N_n%Evp2 ba+Lk [ym+ ނ.2"<5 '3Tsct'ZJ01_RF759j~sւ[J@Za5 rŤa4!jlPa"&vR2F'J1S[ýOnl|Rijfd0 =rMR2Tw/k +[;v.[#l:?e؀ +,͑qNq1_ +ETK7V嗰W&yBj'e3qXvMscjê-O}ϙArС9_* G̢̓B/ۙM~5RzV5{.euʀ0#_W\F`; qw-fiiiɋ +9#_\5S(VTVF՛$N+n E(Y4;w-%k~Ba쓦WrhvD8VzYl!x0NX9`-K3d|ɗxA@S]H쪄S P8M0'=N57LAI*NxB1piيcҦ>$ZXv2L3L("go"b\2M- +gOTaMq +)ٵ0[wZ۝dxcȡ &`vգ7y0HBG oȓ !hO#f3xKШ{FFOQC4ο7 #n+ lk%U,\8ɛ]7)&< %+ *M Hy9Gk9$ 8v`<$S +OtI +vC C3_S !x& U-jScf-/սŽy46q.euKpqdJg!V2,ć@Tk+]1 YX'9'-c'qTx\an]D1%w{Kk(Ø5tÜ!#Pnn+O|gKDʭX!p&^/ +?ƍﻗkUv:uˀ1K~ YvvoMU&`VA`| :p$yq3h2jF+nZ?,]SHMtૹ;Ҩ/ jY,2~B&c@:Q:;"@}~MxQv*Fc81ra'; 9f+9( ++s@}VW\1B֏zܸe&}A +~{$n^ 0:cp>ѡΑx 7 endstream endobj 2957 0 obj <> endobj 2958 0 obj <> endobj 2959 0 obj <> endobj 4889 0 obj <>stream +Hd͊zy8 +>sRhF^#y QG#Oç==o/ϧ;c_mӷKv|~_oo~y>}~W=|z>{O݇q~?>Ï?o+~ߒ~;%zΏx߽w;>lp?(O?{wٸ^ PZUuTGu^5P5FjFDMԤU PjVjUmFmک]uPuNNE]E5|| _#_k55|| _#_k55|| _#_k55|| _#_k5Z||-_+_kZ||-_+_kZ||-_+_kZ||-_+_ku:||_'_uu:||_'_uu:||_'_uu:||_'_uz||=_/_z||=_/_z||=_/_z||=_/_ || ߀o77 || ߀o77 || ߀o77 || ߀o77 KG#(~? +?G#(~? +?G#(~? +?G#(~? +?z $߄o77MM&|| $߄o77MM&|| $߄o77MM&|| $߄o77MM&||3,ߌo77f||3,ߌo77f||3,ߌo77f||3,ߌo77f|| "߂oȷ[--|| "߂oȷ[--|| "߂oȷ[--|| "߂oȷ[--||+*ߊoŷʷ[V||+*ߊoŷʷ[V||+*ߊoŷʷ[V||+*ߊoŷʷ[V|| &߆o÷ɷmm6|| &߆o÷ɷmm6|| &߆o÷ɷmm6|| &߆o÷ɷmm6|ۯ\t;]~~߅ww;]~~߅ww;]~~߅ww;]~~߅w߁w;;|C߁w;;|C߁w;;|C߁w;;|C߉w;;NN|'S߉w;;NN|'S߉w;;NN|'S߉w;;NN|'S ߅w]..|K ߅w]..|K ߅w]..|K ߅w]..|?|x>stream +HWn}Ẉ} 7A5HL梐m}VH1]]STB8G$ ?q(#tŏۋ[OaʥlwKt)az%nNj7˸nW'ۋ7ק]*k?7ɅC7C?O6 pqJ? L'ˆ 1Fdi`["]kƯ:en q[3fkK9ER6 BP18! v1nc*j}gȎP\eK" 6`-_f\LMy?}B %!܉9y(P3^Nsms⒄g?Bq"n9%Ԣyxw?){I +%"1u他m;ʦP(ϧe KutC%1l;QFbB_~)QEAGZd +RP2g? M>6OU +һAa8 |$6"U%< &@"SA췇  .]YOݮuI1OZGZT .|)'W +cӷV7.\>,;Sp~:4uj[)F8~%aaT 4kl2hXXe?]{#s#Yc-(~-9I ?7i>M-&hUkԝoEt8;X1@0gJ*j@9IU&C1GFdĪftFc{<4ԘNEhԬ`Ă=.jX8^v +oOhO(ڡЊ$w%'V/DP6ۮЀ+"2qClUJ% |qrn!f\xWD$_ 7)$|׷Ģ A@*͋!Uji/x/)x`1p~i 0޿b.Fum +2bte~߈إJJe}n!@;G0z2/sYYx{LUdO`AS@^Q783x!׉C>5}@,t}@Wܳ[?SĪDH͢)`Sj)K]!qWqwtA۔fWW $RDJnY@@@^oD EF_!*ׅyV4]Zޠˍ\-$*\Bë#\R>@8:WanYks5߰.5 +޿k2}B $ ƉTDy3{j"B< ( +?K]K\<4w$4K |Fg$"6nYg,M J1@2D~< OB:?xmyu&A717~)5i}.RLhN`zW0#jQ"*憌 mlE_Dj˳ Ɠ\.ԩP%o!]fl1:-,%"rz<}\44N 蟴uZh&F 2N Q_M>_Nce7uޢH+ȫac4/fQ +ȩ#LUz AB OES -HA^ ȳ(`>ܢ{VGV N9H&hd6F'OUcCw.JA~÷q\D*ab3X[Cwr~N 9tレ BcǠC @p Gt"k>I.sܣ=` MmlHHY4/zHgne^j޹\ f;b v]>L|h [>]ۯgՄ" E|1"[>l'60*h{ w/beקq/d%QG}N&ywh'fh/2=q +o4st ܕ֐yV8,hzhߟJ6~^B"6^-m@_kk9P0\(|QU,D %.iɖ{PC:Q(Dp~ t]^ղz`x-N + U">*[ȣ#6&;"Xh/qr +pPfz̡_티$vg 2ǿ{na{QF/'\pR줣DF0{Vs[걲uazLuZ?c7KtӡٟE+hD"ðs&6|"1 *zG* eH,lҹOTmDQCِAԜCb_uʿ68FbLtIӏ +f>zgʒWIwT# OQJ[ {RU{p&ڿݞAi;yXԈBJLC/Rtqa][J GȑhҊn*)j _ґ/[2߀[;Gjuy^lIH9HA(RXrSԞ 8c޿I9GW^(W ʗPMRE0jf̙D٠Q/#=-JɊ7BGTNdzÎ4OyUxmG{O70os@AF8rCb߼>stream +0 M@&kd Msfc$d&z)-kŠ @c>L+Bk-'*n1t /Vv.b[7Wa@ԑ-kp^|FAkPJ<ڠO@mo)v$Du uJc*2cP@WG؜oU= Cǎﺧi򯩀QwDZnj@l?^%I '#o&{KeU_9*zxQ) tZ^P?n{le:o=k +W &lR?.u[] +gq4@-}ɥZA8%Pڰi7Sd&x7c,v +_Ehj?gV\ӧ^b(,HC tLѕ'SBUy.%*O[a!? +qdm-D'2rkQJبU!q%E4 ?DÈ +V_ˬ,I^\dSHUljUI!L-ZK[~8*" 3,N5b$,zDV UpDcl\Ђ:j:Ux #w"؈CM2\jC!EE&I?`îD$d*_xuP5tӔ`>Ή0&Dn>:w悒(*Ԝ%]|"IC ѴFqѴ/ 6P>g\ s'=7LM*\MF]V~Jw(; Qb}Zνo엑>g6-S8q&{e 5SG +n..Qc\xݮAN> ʗZh7m9 Ʀ c wy_l~bާuQ*R!XIn$am8aԢE^W%'@d3Q\yGsΰg,I>< ~} r{)v@mh%mzU@QX$dP U }2,rd~e˧ړ(ߘ\UB0-t71 5 EL{(m1 !# + wHR0!-0E?fLū^W lιJ\\Elr'qi(xEp^y`x̿+}]v؝챪TXӄ [ev#߉&`% ڴOc9ע Q`-|b&Xݛiy *"UI[ue' .hܪMp52J4jG=b,MnJ3Ȭ}HM&R6 +D)^d0 i`r%;ȶy_@]mpA&ge=*sL0טy ߫C$|{e GB{K~4ikߝvg@a0%b9PSk }3PbVP%$Bp{Rea.0HM?7V۬Ȁ?ݻ + 4RH#N +u[ >!At*vzI]<(?BIܠC^k Y +r1, 3DsEy3`[&n5HlP՚Geq^nph6az&H4ufH;4؃}\P)dF@_v#˜²+yOE~(0)Aĥqg5o%64cL'E`(y%X."~xCxvjYym +V՚Ll-G}?Ye̓{ MT29#ˏSϻN}~'U*%kyhg<3EH\{gNSb<+oN}Be-ϏÒRJK΃pr#V=t6xGWDq+ 4jhxTKvy( nWȅ.|,С=pTF_zz֨7DʌoI3:dyZ [(~|.:'*YU>zD(RZ+$Rm%gtNZRЯ7j5ȯ֡1䴰Ɍ'pqz-ĝbH<31{ &He+lQb&:d!?^`{RURnD4N>.[uX˚SFOQ\[ G>E4 IgZ D`|N֜3O0Qdg96aܐluM/(F;{c+gkn +JY6d }i+>yG'n="uպVaPMq mg#yDTydm'뭾Q B\`ӆRRHU}Ul$ +(!: %`wh.#i|f sRs> 9H/<]03vTqӝ؄%U|𞍙ͧܖo\ݖxG>_}AƻrM^uб7];529 {4x DZ4l~`Aau}taMT*% ԈsdLjlkx=+}H +xs,[o=E/ҾkL^bUB]½cҗ~'ˡ%|lO%[O y)"!iǰFNA NRI]Sp2Z/]51q1R@Ъ-ߌg徢־Đ'"Mll HV*3TZ«~cQ{P/nj[̯|vHSY)gD9{nޅ2sPňHIwnd(DBʪ>)YLa{@^o)I|P뾾f48ovS>YHpP\Z0a80 +4C= }Ek͋E; G%snCoДdKGq2DyaǯN᳍ w0!3$湿:C7f,B;M EٓHñ\lm~!-iF`)i<`(˷_Coo#dú,W^6P ܄0}T~w8T9 O0>I $#A|wդdԽr_R8`S#E`9GK{RTY2UJ_ڬ熂71fQxSF0R2Y9 +m3 RWkg|?KuU/ׂYUis {=ĨUp5TA'ccfOlQW.4b٩f s$>s׭b"#f0/)=ATo$#>Z9J/[vH'.[SA<vgdzŅ(p +1pY|<5Ɣn֓\T{TWGg@qX*[k \ʏPP0o7+~w_Iq#8L@, :DnMn(T˗vD1y/7d$K6&Op;Z!:vpnIoC VzfFeM?xP34 o=ll,8> ۸)_mD^>R\Ics l7a֡Nn"@w4==7c]rHtLj,a+9"@/S@w*3`<|:;wt@I o eYk^hsrkUХ. x۲~WD~ɨ!d4%4|LFfVZ)83:С֟W]H^Whh[|$p,(M+}s>/-ԌK% ^ӢJòxgaw\z>{-_a/7HloLɧ˫;k?ȗn~A)+ٔy'%Ҡ:Z}U 't6閞A^ԃ?A6Y 3MmeW4 cF +eMcAםU9<^]Q~"[ÎCm*lFթV@sP8ƥ<pѾQ>8W۠ R6WH["#H[r1`ȇ^M152mP(wK=ooh9g#&d5dkvl pڐ)uu3Sry(0x33bBs,[{Ƕp^UId5_i[mPK*(^!/4Ccl9` h}&V9~]ӴS 撨*77 }afP1B-Y$J&l-Z+G^hi_eL|Y;$װ.1.^O5.%9$f zaw8װEDM 檳q&ӵ݊&9R.F`|nÿe`L!jL4ĥW[Ii&tMBN{(Gwt|le<&eU7,Z6Oe1A#tD< "2Hr̩m&m2Q༌9eJݻYgfs0zÕwJ_q/N q]v96IC4nl9o vtAX ՒJP8&V%1Q!'DofBŮC&_i&H=Z9QyM% g/Q.ÔvБ(sz ц[&g/=P/']8&¼"=N}\peٞ.Vlo(6}LH9_2f=MVayAZO@"b?h$Kh :@_W%fDɨ-`N8'3:cأvjbR~-'dϐ_F`q>lPĤwS=}r|$膀g./\<4 $B3oO*g\$;CCj+J\ibj/+VU%JR#UIK FoP de!&Z2Ңۦ$lZd R X}Xo"sQF:VW=_S+ײ. %:s +nC6jk#(e)$u9'.w i)A7Jܢ_7AO!SlkD"tQE_bQbCeŌ?i$[Jb3HwX̨Ĺ-.養fH;1OҺ@խh*:4cyG875œLܼ\Elj(Ofao[Ӗ;byW8Rb=7>m1E_ b_HT&{x,*^/ΉE%:\jJ`h)m؄Vmjrq0M+lPU^'l=Y1 9k뗌qMJfh}$AXZzf3bU'J9uP/Q.I-1S4Giveݜ ;Vj'+iZFh(Ϳ_>*֋Ca'd=1~gwBdG>N8jxH@Qڎtg+8Kѽ QMime27^?@^N>U`Z*{yvbik`vhR2wӰErT 7%-qZ[cYJ`o/^KLb7 >&MItSu@@=ycAt&NZ&ݐ. +(;o.4H/o<`quX$Z; *k,BUcdlo{oM +A"1#j ؇( TFYZმuå&=$,SCNbXxoHdba{yĘpV"HEbez 3:Z)saGGsGYAz Te|NY9f6-Q~ Sʩƈq $qC4`Ӆ^]o5'} r'l|Xa<ߑivS|/TA f-h6U*'*?X")&{~99Dz&o㨒h'JóַQG^ΨRbYՐjjNf +hya1f+)?o@WrT{*Lǃn.,&‣_.pfeIm*L_5.Y,!3Qu?Pj@3uͣBh)0l罛z#:h02H) Hyz3H<m (KdMDOh]T{rVXK+ݡjLڟMVX*vjnWLzPqw\kóBU0mYmo̪eȞ0 / &kw;}\I25{6婎aܱZ4/C!POAdKUsN hs7D9?$3B¦\1͐_ msh42cxYi! ^DF]!]?+3 Σǭ4KEO:@`rQk)tB{D X,.1&}2ݳ۱?ݨTb5w0BRQ#K ;|6+kdFoR<U8o0E&GN=/LnH?lS"aG6؛+2fW5)E@eb͐=Nz6yܤЩ!BȟjÛ구nNAx[ckB7eE8v^<*c~T`v]*,IJ{QhSqVMrKu9=!GXW}{t\)ҁj 0-Iɲ>[}{ths0L,i1^]`:(^9Ov0E*3$XWxZ@=;09S!WcaGGKq9 I2 +M5Mq6csH=>GMY#i+0#T .p)ӸERVS~˽,O:젃wX`gY@9ϳesm򌑍_S!wҍ([(-l~`MK\{>/.:3B֗9RuÉ04!+116yՄEGdf- HVy?:g[aht=ӹ+5kb ]}COБVW5F($5p5t6"W[_lʅT^x2C3bD|, vƬFEހ_133ҴE8 +I|P%WB7&50noBvf \Lr9g|~,LcQNR}%>㜾hɀ> 5ۂ\Y0D;g(c8νPl$$^5]gCH{͹/=R\[#y3|z!H w9ӟF_ A x#"PkBTL5\<`[3(Z(1g墳HI?4 Ql@,+UN[KkS55mT:x m(ZG{MP&>K .ik3đ\ +Ye?SkLU-`8um|d!]{8림V]˛%ƑRhK5ËHмrjN]em,C$t~t@6K0V[VU>K-m|Bfe#R]JZT+YiY{ʐ!:"O#\\fZɿfXx2s0Ar:'[9q͂s Ub^ud:srnDͪ'7? }ݷS +<$.ȷY@WyJ8 +/E׈JYJ*ن#(QM0)s9xn9Ӏ+LǼͰvŽA抯qPr.#$f: s(f5\nN&w>naBeeS7ww_j*K|R7Ib٫<\h}Ƴڿ#^Gk:+;ė*4l{ 7iA0 6ȢN5U\mr;4sp?#UY ^Yd;E`:E腼`T[]90xR|_cmI3EP&pV׭IׯCAkd? D}N.?/; # WZܵ0?^v"~$W +o#"]#IЦ 4)>Qpi5m}rE>ASibl+§# ՠyT_1f#R]$,fJE-Ti5>Y96P ? Ā ::؈ʛ,y kS(cnnȏo4<7c0W?sm&I-6V?'% J˘ĉE_.vv /uFƏ`UFT̬HO5ɘH%6qx2_$ ;as)r\b/᳟~?Cn'Ns*:k,NOjh- t}u4;owk $᫏^b9iRV:2Xk;u J?nq7+i9?W^=Pj?%8x5ç2җٸٴ㵨pgky^.tDQTӆˏ*FS3)6YcF%)?, +.:y~-5|-e«Gk RIck ")HGFRzyiǬ8γ(=LUxҗ0-fRxvj&[)[lJ-'w[>9>w#h w+;\lۏ+y*/"@JvG`LsnLCzW\A^!c|c1KqѸvpЗ:׉\c8bRĤLZV6C\h<cFG`L3VkRmԓe¸Î}^KV|"i!{BxoZhRT8kr-Cc>xPOdiЎn_{rA>@M_H'|Н7b UdN[2uOķQT~LEBb8!2 +Ͻ5kQSߛ' aԠQ4WU(sI "6˷) ;hݜɂ'H$QXtP1^>U4S^r9 5MR{yh5lP:y0rvO +؊?̭ϣ'R۳f-$h(@bÁ1Et)̏(&..8bg䖮xt> >KeAĆW ܓsj8`R3oz 7 azwxh4[Xi rIJ*Ms)>gG6ќf*{wWkuuU˃awys&^ TA"Ak7}UQ-z+= Qb?frU6tUl|M 7sh3>;\­$y 4BdTqy-ފ E*V)7Ƣ)]ZgAl[ 9|9e8u)k%|>Vǡ)ėiu9!*@| N})TCvqts +2h9CkQ}F}P1gNvX*JU ;񞗐K&98C{$Kp9?)dQ;[k;S<%W/TԻܧ sis>Dߠ*h0c`PAVts#`szU8"ecpr[L|oi[i5^x^d?<ĻK,yչ)YPaN5TIWc!TEZǯvu!k0 +JI7+ڍ{a-l``~ nW;#zfZ1 sijA 9:K&ᗈ"W{&} U䆠 dλ+b'U{!_ c46Gۥ6g5ggOb h o&{=D=,00N6&&p8lCC/hm-,c,Ȟsh]b>!X񰶆Fi16jؾ:Wڢ)W2;ho_򧷨ČL +v N(lu@lXk1 }X6 qCܩaPGvI(;ڼE~x1Y=+Ekl_UFb{\mլ_`8X*Qrdt@o}@:[˂Tf߈uH&yyTll ESў 2,t;N*$;p|TK P)SK17:#|ꍖI;=h<eH !LIP6;|/FѴ:SuNt?BHjSJ$qWIӁO 3N͝Íԏ| _]?Z2 m<|6&sLUBOLRM)j6?<adt<dJ_GWf#oa&GL(~&8 'K5)xtT\D }͝"AK[TުI)Yx<"(^T3Y"K9b=s:5\zF%+faL>,FeҕxWRrj&MpDǛwV1,۸uSyUZG88Ut,H,J6`FbLbZx6XuK.69JSpzZGPz($%UMhΩ *vo3AěiɉܞTGZa[V>lA޲c( +s4U, D KkUtf%GVaDKCt`Eb0p'{/>㵜'dp _ubH\4n:QlٴvDqog&(U7#1,o[u`]zQ;gWRLXe BŸ9 Zv[^F1ϒAZBv ʀ1PKR?=6{+|x &Ց!jVo+ez 4'%OS|@X_g'$:苊@G病!J_vS : BfR]ن)͞,PiVoﻼ7JRT!m>hD6[Wȣnp& ,PfR9`> %D +Ǫu5tW|iqe44DS& +Ɋֱ*pM6K}Cl,nL +u qPW ZFZQĸ_XEidr vZʽ+*B| K_(> Z]SEhv1gJlP3%N;.0PD3t qc rHyker2(gwЦspDkUt1&RCkլ$>BqR7P 22gdƢ_=(8[ ȃ/jR8G+l iR*sMO)^2wԌ|~uvnn[Iy6./`#&8bXP:  6H1c5HgbiZ>yp Qaέ] [n U SK>ac5 M4%=̼<'-it[ğwFEB8KI~8wAQ7% MT_6δ䢂@^~cLLñBp$D"u˖M] H,bT߸^ + KImv˕M釈'6656"Uox[ c2@[Jk]=#Zv" +GkKlBƪ{݄IN9fz$7 YP$tTНOQ|nty0Jŵh ," ?c{d9c_2ZVѰ>rlR3-!-Ys3D}U/*] 6M^\ɽ x _w\f4h +?m +VNWߜqrD!~KPyd~H Eg)U8ɁCpzs4b;(yN0]7Z0[cגnaLѾ#e8c1L:XJjI2azD{w\7 +x?/B:&?oCRu@0est ,],3nU n/(L[7:@R{W[+^|bc]>*lg6+TKbl(gۋ\d?<"n|Ve:gܦHSoRM);b2 8NJ0Šɢ1lP.zs 6)~I_T$}3;[ϺVºP4L I ud8XiQ%uf,>GJ:Li=rOeTg{72\EC]:G  D +9 iŹStw.Px*EԵivI}uFe_: cH 8dwHf2m0$+ld h7 uB-Ún`$B$" Nm 9\ luaF*{fNt̞l7 ia:_OHzhUSoRPZ@L*s3>3q<,qe4K&ū;"kAFUo$HaUCVf bHR}c,=*'4^]l=rI#;AV y?+X eeiuLn^(]<"~֏>QZw®Ooeم:X}}JfYIJ)CP|GQ_ &KCLULk$Q,XP›d5`e*.ftޑ&3IhnFMn."ﷻ$<7(SLuGյMKxV58)09;VtN\R؜ 9 kZQ-5SvĨd,$e LY^Qc9iws ! D +S|qi jT$@amϿOde]ОWG#i3Ɇ(ެ3ϸ7,hJv=G|ըZ6~PϹOY;WՃ +;qFvyw:5't0qݧ| v}k"gx'/rV]#b_I ͷwH6 5Eh|0ߞa0*?8is2~F!lpj;Mwؒ af=g0,Vuiu?ʣ'~/Qo)-OsQhcu<:ז'zUT)rGo =79 }cZw@+k5;.B +vqFiX#Ա{JVjC?wS38#6Xin3i$`G1iwaz]p-W|S&!NzEk$.|5ī[7XݑZmzaIWk 3iIYXd?IMi`f +p0N7}$'ץLlZVTibf';6vEג:gi쥑r-~V;D\Fc~YLqx {[;_TRmPiwU- +5I Pɸ4g㒙z+GxxW +*Qy,zs:|r _,6]$aZP(w[4(e(n6dH  B7D@JĮ=t?,zM=0?!ԁVH kR`9O:6=K7X%/ ;ïsn~uN%-)+ICٝ{{CJ_$U#Lq\CYQP_uWFm=4И;_YYCdoT5.{C'ooE +u4#*JO16 +D}tX +WɾGS\x1:FO +)9)DZݼ x%uƞ> †J=O-f,ì=Vdmtjފ8 E{WbTfZMVXONŞ>hDchc{k$6AO)%YtƝJ]:ӿUtB?NRhzOvӗMל 7* Tf+l^KTӤ^9I OEth'W4 xl% b)B/ +"WԢ.I?Tٕxѹ_X?`YLCF2a(:GcpZJA!Ǹ\ Q7l2Ndyܹ)5cm.(䠫hdERͬѠ6. mR_ b6HW03XfAӘdԓ:"`k!/Ւ$c +)w":/;},m6mxJaeKc+kS-1r&!4ZvVԀix,>?U*ybOՙNv$&~S>bs͗wLEuN,!1Z ˍ"͞4iuڏ8׆ZMa_4M)t&kdSxowy^\oʫh +ۛЊ5p;g~}-.Gθ +0t̓"DigΛ摳ܳ-BifikG+I@Qr$bcF^ur3UZ"F`ZȽ92%}W#/Q5F83d3ib<;ԗ$-ΪW8@]%[s/|XsJ7X4̚b~USϵ-<J IdiKȅ DGgBUQ5(Q"!=pDGj)pd>g3' nu#yRo AJƞ6{Lm%NJSR5 :!;b$&Zzwԝ/pԡ|LgSg{GB9n*#!JdEX<-PM[<'I,lLT +bI;/dcj܁ *{dAO_3+~_4j-_EL"%mXte?2+;OEM~ t. +SQjK_0HSE{đZ@Z4%PQ.S]6nOJzCHg/i,I]!0'y&Y!p Q\ׁ*;(WAsBFlw4z"j!4~D>1fR@ƞ pF4h^5輪qI4"VEE]Nfׯ^p!\B2 7zZ FəIa6pS }w)/[tUK,#T9HArcm㣡j>0ϗ|%7kͯi +&VtުŐ^{(%bQ]U '`~+bzYA 0Vv[sDzƩarѭ.CC 﫾B'ܷ DX*"n_wBK +\i^7fpxo O~` pi"i۰}WlmƦsn 'IDY4ed4 [^Q\x@5lYӍSprcW\xj}|a u°M=sq@=3-/PK x@S>%}JӐc1D5b|v91◲Δ쨔(h%c lkPc@g36]@]w]D +~,/èw4c=?z}N)2쾈e7$Ք*v!0|g<J^s{.hAT'`~JyT9k{`@UmzÝo'YdIQ}CA #`txqm3aP>;>n + SO 9IGC(,yB㥆S{>zVf`1 +VY^/^ ^K lu,̴ <=Y+)U#Mg9UT/DEG>s194 +&yVʰ:wX Ֆ7M8EP%iX_}d^% zD _ujhODy[lQm$n413FaX \Mf'[ N8MN ,uun\($oeT8=^t{B@28{p|Wcy#S cJq@zڮ5_1ԋ4agXCs.[T`0[ș-ObF)W$K;/͂NfCvH8HM!Åz4Tx 6XhDC3^ 'J~ݱԙ]3K%+(f> }RҢ~mSYgpځ$-qƓGI*.(b9"SFO'24aLV{=rIGV#l +3+;v}"} hcv_A;tL)eH0*j#˘A3]RZ5`C7]^@WxiϿ3Ñ5#^Z ˽S>@8l/1b#wE!qe)gy`H)v]kK%p3vM|9Oqm%ߊqpr5 LuoNy;G^jXpI3+;GD܊@ˆ3%y}Lg)-0Ì~-4# u@ E`F7t-ryċ\0 +w]_nel7)?5Vgn^I6vPt/G@2(e%/:6=kbG6+c8 sb*Kz]KkyMwc^r)|%=e8.iI wiېfwn&BG&>l^O;䑉jﺆPQ6r ;;\q.V֍7MrwL1 J(.bYӖ?h^ZF,y͜o xBIOfj5$@z Ko45DUY~%;` ^ '"twO&Y)ĀKh&0q!ʟ! HAS }p?Mm*natU@<׻ (QU܍C%%O5's.y#hS<0qZ +JZT8;Me̽ȗ"{JcHXQ`ԙsaiR|ˏąc3MiGA{iQwb'dj.1; _Vvv#F "s'fr^׽BrG:^B|Iݏ\j:e+*`DtFMgQ<񛖍1,"`Pܽq/K*s)lbk(`"AO{C؅fwS +Y[{GƼ^)CuiRtQm^3s`7Q~jyxT*|Q>GRZ:1Y(z~펌1 i$%imHJ=nT2-HDЊ?r;QQ.鳁 9D6ղ*>C& Pȓ.f]eT\W}Y#ȟtcBkdpɶ +iqĽKYxW55:Wg==="[@DB, +ůŃPʫ6أ~Y:p]=D!C |ݶY P9 ,BgR1efRKz8pUXR&[AcSͳ66ތb}PnJݫw,[Ѵ5^g823kO|I/u;W7kfk$uߏnd<=_Z{a- U) [v~1BnҰv}$rr}JKo~qG/pssEX?ʝ{#Hb̘E~&^nTQۊ?`@CO0wWOV\fpO 4++o<:_9V_/AJ;7S 7nci$~q_6WPg_J(s( g&b iC8t% \ )k!Hˤ l( 3er656p򐀳c:FHŇ8us`k䈠DKZ</2[_PR?u;]xCF,2?-!!XhqN?OiJY>zV4LJs ,,_ocٿWm/fNS}?5S. he,"vŅ T,WΏ\}m;`62 THWVyas9:bK6se2qx'֛aD7>)Qㄼ̓VmtHR\D4{@v@r~wJ.k.o|xrN(Ai"uO``m<5 ѤrvqS"D 9f̓'jlXg&T9۪ 9e[;H("s*< "wEf7Hr}B8zDXA+dEy4@VRȉ@,׮`CT"7 @v=(ˑ 3=Sí!ry۔9U˱TgnLPGuCfQm#j3x=)]2|ᇓMh(Z`5]Ma1/Ҝfx#Nb{DԖ +z2aQ2ڔ8st-3􌼹@O=ڜ8x) .Tџj8Oߛd 1 +0hhOpkOhB1)$Z,֣lFM~j ~G2F1Hh,lab6Ht+xmӓ ֆt%ȟ)]5*=ϿdWc-ƶ]?HVP +1e9 h[.6^31ǯ\eP)#j.\sʑF0e_΄!svR-52(--\u_Li=v1<*i;  +t 8,2}p`өe{It)NL$rϧ4P+8*نZ=LH e ++W#[/qŊ<PF!QKDЅo4 \|rÒ7nfƥ-zT} +| +Ł#'S~̶&\~%)kզ79˜G72ZW4>nyW)0zX)I+WUƹډ*: 4qqe[:_U )ưHcRlhsr'z䃰}+3./CZ^ []8ůe;@\\>UKp˾~L"#,>}ˀʜ ݚҽWXb7^j+MXDёB)+~/00~9d繌J Nń M׵Wwy,o%Ж.;Ld̫1-}\'ZY`)bu|`* 8=z;8ŸM/KmdJ"ȟmX޿?}_aVp G ijB, Ν3 4jUݰnhg·] ך+j6+iuA^+mY~ޢ^Ie=f,CY?M8S>6$6O+4)RmA42z49j2T7'69t9Jgnݒ!N2q(b\i{Bzka^gb5VKɕuw cDsD+yp$H!'5XaުlI<(#_"8)`Ei81y adItQRAe">ysBDkF$^n6V͎kJPSsjr7C{K7s m&ФWT$Pt R/P)LneZ@[2/m'GS"{8`LVۚU4 +~18x%8d{cʲXtܜEzk**y=8 q_@:Ha<`LL)0AcEd7OR]}]Q΁ FJ1XC7FBJ!8j?;^?[h0zқa3uC6/xX,)k)2n96YNKT!x66W6V3XI'hJXNJ(.!5:oP姘?`sog}RFn1!uNi6禕md׻ Xxr Z% #D.@d%GadJ'c@(='ɱY5L1@*TVUkn1Pt;WaSmepfMi63A&Zl7V<;ʦ*/7z7C)VeV 3( jօ\`1+Uh_+X 1rXo_M݌*2Z ykjpr&lWTV>6VD~?4v\faώ䱏ϥy GtB #aO blrIRkOuS +.`,;F/- 1>`&W#D yUYy ZJUĺ et#F)E>` ]-|=;[omGkt-K~ >vnط,ގ$||N +sr:h0iw ~҂*(9  =HjXlxܟiHH9=wvbpLz*$)D5psE,,q_̅ث31kI\Qb>,/ ^FTͳXpxѯ4pb/]v1e da[R."Id1t?yUA_ׇxPaJU2_DEVd$CyeXU8xwf<57re~f3БG7&뙛} g,z'E3'A_>Fk3PƖ b~@8>76\h Ê" endstream endobj 2950 0 obj <> endobj 2951 0 obj <> endobj 2952 0 obj <> endobj 2953 0 obj <> endobj 2954 0 obj <> endobj 2944 0 obj <>stream +HWmO9ίh$q\~7EI.juHi`I6~vw<ݰHW=.W=T= 7gJſϯ^\hϽg{f^A5Ky%YS9G)e +*5S]=Ջ^>{/W6 l >BJ9mf6` +HաWDi}޶b,,>o7o^nhG(.#h`)A#nt wEf$sm2#ur`(`SoVގvPO_,$t' j&<׽?nE.U4BÎj,`HxZ^S5BI,. +1h"UaЕ\hFGVeͶ^{D.gOU[2vQ_oW=ي(@Q +C(ˋ|ЩAy߾M|`}_.ˋe݌eu#*BR0%mdPb + FŒ)'0f=6G;͊]lV2nP1 ÐrG1 H |'JT1+?Κ2d14NDI*$qeMfQq1*z^=\P [M͓iY822J|t3Qb* BLЅklW/wc6 `v_gbŎ)h7hQW ٬svak&OJ^\0KE'q ˜19n"r0=xKðH4XšI|<ș죣Sr|pd$|QLȌkQJaiKZUH d.-|O=[1 #7[\6k+*M& sSF&9w>iZK&{M7?{+'e޹ʪm~8؎V1; I͓XeJr(}$0`f4 (|sܮ"3=l뮅^1>^ͧ탙_~ EOy9Aœ:F&.8] ~̞LfH5eq3Hb"Qhy +~&]a_$uoO_z|84a#Nj]ݯCuPTN,6 ÉH\|M4VQNLn6?0 +5qPrظ#r@*7pO]u.0 G8.FI? 9Ym7;謭1[0SXz\qa☰ۯ77enܡiНqCD+Txת^/S%.sUFL8x\@؃, [H|Qrl  sNUhZy[rPm5aATa>S#Qu􅑡cI.DJ,C[NJ{T$@\{d$^1Fdn]^nOʟ,0nT|g|:=녎x!EGmq|"%ʛ;5ig=Eۮ\]ヤ#% (Hj߭kZ=f8oIQ +aQL Ϙ&Sڨumʇ=IA0:@0/۫v^ʆ7NTJ +Ğܗv +PU޹cHC+h1YhHZާltZ%,۟ݪ@/\ד/[`Zﲥ4x~mmBa E(L|q>("Sadg{@>@uv".> {+O&2Xc +eA)>stream +0 @@&Cq @J-HaIکW 3q IYAP[<%E e›1c2#~ɫ#ubYp,3gU&37# Y)*hr:Ww\KH:=s`ٴ_V@%rc"1 yE? [Yw?Q? XtHO@Ǘhʊ&zO\ՔdY|o0W1l`}4/oh1d߀q[)v) !K&O:Rx9 f(:M.<;U| ҽ p(L4Os*{[hn1cd>4 ơfepfH#XDr=wJ5~m̌iMgR|`b <i1GzY`3S#|'e{ (U4鉽EBk@BfHlTve6n̛h~_NAֆo)AH9+<]DP3>$4CD ^ԺA6#(lCXYHL ww0 v?0б!?`8:6 ߜSDt3Ì6r%$IdTR%yPGr6@C6KHiswtv°).G9A6ZEn92Vd}W8K8^QGbo5]{w=$.LD 1̊zi( n_c +Kr=n:I1viSMٚ؇Q8wRVʸ"zMhծh+UnJIW9^jy/-@NdGOb Kk  6u rX5_1_<沶+.E, pU3U[hc0Ā25N ~fbJ_/#nC*4E|oKCGR^T3R__l+jWjHFDq=VubGIaаNFgzJ&ٶP!ew>qsbΞT|%m24HҲ`]8m_ T/pefcʂQ#+ U[6uHG*Uߕ2ecתC4U  ޯ^`;=z̎Dhxn3n׆X.C]HYPE11I$.9Z^k,qs% ec 23MK#|8Bd)2W>qޜA[})JLr<ƀBUXd &RohC"GTy6 ȇ+0 `7z"hzQv5* !cf&\MA醁 ?'nЭ%$k U0{Uc7v^JgI&nT74H/Լ]1tk77P#Oet% Z⤱~o*(=?f!` "[H,{ 55R^:4 +*m]ͺY7v+Oަε2rؑlGbw2^6^/Yj:Ti>/<(p, -hK' +nX`Hקn3BBn{#F} +dţM?x.@7Ջ?y%}AN9ĉ 6o 2E<ө[pX:R×֒[T|1/*cCit(wFvz[da:40__ױ? }V.0⪧ +ġq\DZLv33N , +; K! x?d]bE~Q#rR{ۭ3yq$GV={4ܖ5}ZquAXyu2=w#ϴh"݆|eZ&r!O /gl_b¯M[UdƅME~Q=ȤJSP@֍V42'Ýuf (bFe/W 1pѾXx%橰3] H} +8V}@a圄鏯=BCr)i8dfVu /̛3x;0c=z 3 !|o.іFUUqvp:D*CKjIkpO`V!~ 2(0`,0iRygIm[X4 +_SSн + "?=gBUΗ`?ZV3h ކ Ęk[(&U_~9J wooj鹛SҪi9dz|(Yei}@F:X6HX5iO>J=<Z(8gd^xoolќD[Aaƥ>L!|ÄBHlz6,/g;4HZ}Ǵe6)]Fg3C +O")us?ӘN_ψXxae+|jn`ˢ6תH~gC]JG_Mψz-dWLEgIV}%HB$(HqkRr vckFᝆ֎$U" xZ/V3'I{wh_rN +yz\Ōy@(4 { +2oppzQUR!ZGJs":L:FXR DZڠ)Hބ[/a@$Lǀ9ϖ" +;^qzU^4%uh?|v +lYK"֢Eq|lv;x5IJ` lpȰ`I H5C;TUL-B29AV+9Pk&dx0Uav?3F$kSL.X6#Z?{GAGu{޽O#AhrCOB=mR $c~q3V H炰J7nۛ.`[`;A!&iʾ~Ϯ!n. +]p>fyIƑ_mrxfÉlU?&0dX 0gZ~iMLu¬Ȓ;𬵖MB=@Go6dôO0W,Sv"JFa,d SSd?]3KQ)/Sn3! .:Fg bxbLoH-B-< "9:>Ƕ)=a aIEӔ^Jo XuT3`V8Km«r6Z1.6yEڗMLoRDsb'*C7L3x9, Xa#SM+)jCsERKqZ%@ hMpo ٫I *wآdNV0B`H@>&Ԏo&N$xDKTdRSnӬi&/wC!fL4X=іCe)-6ӷ;Φxqmjʾ8\3mU_a-zNW9x Oq|oK+6Vu1 7RԿŘ%]l~ȯ^P3ĨT4]lt%NWK=yjLϭ7ד8#e!p_U@@kDRGӬ* X6 P$ .YM\ E`|_Y@DǥѨ#}~Ϲhq +e +RD^E?ߤ1(*(Dh0g5"7b)^!v+zFS>(xzn#ӭӽt@M Q"^ G,؂B\&yn=cCE-.rJJW~O?s\x7Ho'R B.5A>hl?<ʄV(IJV|56{fC(3@Ǹ@5d4iJ+*I U -4Pt2rLGo;^ _*Ji.687;cCBmnaz`rovǸHS +u`I3J:9t/䰒c PtBYg8kȓ07 +L)Wڿy I+t +K8.9'Iy@YeMuݷZzNB/b\ m gOgdq/p1G{ )#,_/^r@|sr`@ANw- R (PPràL+=&t.ݲ0Hvvc4 O@;6 ,.bA%]x".Vl_X^ v U]O/r% Q%7URPI}Pm%^i Ԯ #ѳ%1}eG~΢f#?s\:TzM:/[:-,wv +iϒ6j:icCƤLPӀ +7sB^3X}&L'b8o֬}% +03+zL{əVv +x4 ځSOSs [+'rq +B81R0~L=1VdyଷV@XQЀ.Dh!Oa/Sle/.?C.`9U A"|Q+`r'j:MwTݘo:q5X33/J3{^#F&k 1N!݋mP?^ӷ!󾅳 + a6KYe4ǤFBB$*k"||fR D12W"xu7):Hh2uJI#LYrFIڽ{!nu~+PnW^߰CZ 7`o#G5%*-t7q6K%7k>Z@W4leoұmFn ͘Jߪ [ &".Au0xȽ}ŏɹ"s CUuꐙC]Ϩc7w)W9 +T?{92S?uؘ$xAQ  BWCRd7) +v5.zrgTAI]pK*WH1Ͻc6ۖ7~HҸY/ц)oXF0[ՕJƢ"m!&D҉WAZN˶4{wٳ`|j-K´a获EJm: ZZjq6{i.z$1EV%ng_Eqg_(X 6o J΁XmτTǚ!Y_oL|C*Hr% |o3<:mIWԼ2VH(ðGQD~ݞl ̮c!XCsLgx .΅^INY R؀ź#F{MLhZJ2ilCWmS ,+7 +w4,=H[;kA5]VvG=Uٱ}$@G +kݍ{t2ъUx p8K 5U&d4{IH]J~"J`ĉ 1-Ϡ(ڊr޺WJӳ]G4}I]}VȻ:(8M@"^엂"'=6s:^XCK=>0( |w]IϦ +0P8Z-&Z -}1{w2cRV=q<'[hY[ގ"0,hUT,=1?5nυa36GfTS\ +ᠭu(4G!& Z}>4+Qfsre; 9(u˅i'.h'^4VGA&I`V's~ϲjZ\v#(IfR2:͡;_z!Ɓ:u  'FJ&*tTTta#'Kx.a[u7ë +攑T%n̋b9hi|`ʗo^=\8$VKZ'~YyBk17H]lrƳam}:LN؜yz MqǴf >MM5gMʬB~(]߀_n,P;idT[i{2L <ڑ皻FkQ fZdH^avfs'SS'AϫXY:Q][l}8o tTIOIЯ&S+ +rYt8Gi |_{p;&s`^[+]Rd3`-viy(Q KBuj)3 zES[ˎ]I9n;dl얹\Zdҵ8ʅ#FGǹu5me̳Шw+v/XSfq5;?0X)zP4mfFHpbsm=ӛ)ņ3Yݣ𤂜iX+WZ=BWD8Eς!S>r3R%7 {d% @ &ñ-ƒ"\$mvsϕz3!R]NJy"ھ-P,i 6W_9[]yṃ[("f,Koh#4V?CC+l +v<[^Xl5Nl2[~n3>z\M0EvVX 5@v+7 m,2vCa09_*P( sz"#>xJLV&ju( .73DzJ즡d_x5̰!)5Ҩ, }$^.i_HZHA׮#qN)zE +yajcFXi"Z'fQ0 +O=%LY7PY$ON|7B !5fF/IcMւ¦.RCm`=:~`hƾU$2[ cւP(c\r=Hg[Eɐk +hSObCi1TM d]˵/4hh/BzTE{Cfx.4`&S8ӕ*)jwfPM{կ|,6c p{*Rz3fj鱛.Ƴ]&S*$-ǜ9J8\8@،O$n5.eUFiiD2q[T.`g[IiAEgqӛrCjZ4\0=~]SA]` eh`9_W'8PgAN'o|?r<)1ԫT +EBcdxa(T<8œl78e#'r g"- Qj'V 7}1b.?L`p0=\gec_qKN#MքȌPʀ)Q`B*cЍs^ICDZTx4N[=AW\G.$(iNmM ?"΄|Jq0g+@-Cjgbsv2`*W+:u?'f"1 ŪadX.Cqif20;!$"iP>b)Jy@l*_L!:UmSٷwz4v=*~'};98@ Tq JjEݣ$Aw +`uHKFG֩)kc9u=7 zu~jp,@FR$3w`DPP#Ɵٵq'N@OGFj/K 9JJ;zj.g^-N"q>Sw&>ɫb}Af9b=ṎkU5dA_] c[xA6&znBg .!hH\Os2WN"8 medDr0Dbq+ߔhOn`jSO>ggnOAN؍Ti)3%vxF Ve~/E=cϦ Τ˟=x/գQKmHg V1}V9[`SOrAS@nHӛ͗$β88I[ {*MuwweV%&~iXK9K&AH(>ŞYvd۵*hв^l 6@Ӥ(}"g pKwo’!w'e6/93ĚVS؎Y'W}l 0@)qzu] ձ&䚞,w$<҇ +u[ mB3Oi-F̢8!W"%gӈm%RisG9n|LYɕuQ:0wgAw8=q^|,b&N0-!H/u$3=T `+ML912NUsT+. +orUt1*E4ջ0_dZ8ź^]M}3I8 +ھ8ԐK!-\ƉOD+?Rc7.}&y#"+|uӒG݌51Tu[1l%+D1QUNX. v{n.p$!ݯԇbI_m_H "*04#;:b1fY}'V/?iM.C{.`|H= 5өyb$>VKآ+h_[תP&NtiJ~g1hXR\37]bl7}#~qUބGn%%EXɾV&mDxmTdI\zeإ{Hq;^`r|_d1G8˒QPKm̐AW5rdNAEJknEL%]L'1Ef/ſ^AZ5Y="rBƃs׶>c04 eCb|osR` CTj9bnW"r03MąF % mCT/e4.-XwU "7"st3!a]X Ppo]Jy@iʰ< 9E*]z~B:ܿ B|9C +ýѸC_F%& lIiKr-:oKz WDc(ȖW!ufYKH?2Ø3OI(៲~ AD <Ћ#w.S7Z+lES:AQ])ŦfÍ rk MIGU=mgJ3F'!:uTXR<5i&vlR-0 yXSϭtLVBWQ#7zt;[9tdd#<_$8sS5+@ [=v Rh{UI~(%#e úp,S:aoĎ)J +/hJMb|-o` X<т``{Bt FSR +d@Z$8i}Ghz&e~-S㢔؈O// ]jR֮LzBA9[q @܉aSr_L/q! A^6hVתC& ts-c߇Da4Y[;ᱷt^$Jk@4vJB6a7բsg#5\ 6GN&\ &(^\?>Q˙Cj!ե +!( +a|vP8FbtLBGÈ[CIR: ^Csl♟h^1mJ*^_ ~EJy>)WE>t+lvc +K2HI ~QDFՈ?:dykX+'fF*̟.^1oEN"_]FAϒ䷟H8:2Yq m . ~;LĭQ*Q|5_P+f +}]O\{H{G%9/TuzޡC@)L&|>!g<_Kv;n0$xT?ޕmgxKpqSꑈ󘋷U߇9vƍ Q5k$:ͦfq-0Vw7ׯ$G+8DMbQk~"|Y_}W0hs ~QO8;]BÒeqGc E +bW eY< +I* B +!]5$e*Wm䀻X>`Z]q`\|@M>Gf +.I#^v| %MkVjt6$rÕEI` +*R2My=Vo\Cz_4H;nEͽ>s࢕7RV69֯]_Kȶ*YWx-%Z%߈>KB9\S+d$%N%3--3Sk߳0͊&z%B]$"E' ^n9ͼ;%Ss4.gZ꫎Ηz8ozFg22zꥠ4Jnx"H[ﭔaqۤn {=E{ު6zx1Ocn=HVd7F0bⲺf嶭vI% 4ǨCWQV@ tͺQ/QK=7c|l54)=-nTQ3mǎnW_d<pIp?s(&v>w)z; dAa3NU#~u!j?B%5âFPQRM`v |k5`%T (N"L\BBkAw{$ +!Ec{X~'fՄtxo)8zW[N]tu_kTU(3+ȎI}+rZx ܺP㒖@n(Ē,2$v2R\% Ӵְto^U,x->?i-Koewsbno"ò3غ}zc@ٴ``D^TLHӓs7)wN.ޜtO; GH󰃃.6&k1ꘛNAݣ*G\&@sib3E=hO6F3Nzy +-*f̎BiKc Eɜ2rYmRB(p|[#r^yTˢMκKwu%8Qv#)6͝ymAFY7-^iǾ;SO'a+!=y Ջ7t\/nD\">^#5I}8D/{$EBvEKSoDKR#L:z)S!a("/lEF +nP ysM AW-]tR8ʜy#H e!!bZ_u߉6BzcS-bzॅ:\7Mٞ'ƍxxf^ŦӱUwQd&T)@9gc /Z n0N"wU*I= + +(5YjZHѫl`Ya +W!05\jCgZMUq\v]& l̓lK. ,3 9`2vTauW&mrnsjuŕeA3&tny4KA >z_qכm*䎿eQrtϿy:.RB,e{w2y+.O57P endstream endobj 2945 0 obj <> endobj 2946 0 obj <> endobj 2947 0 obj <> endobj 2939 0 obj <>stream +HWێF}[l 6dlkŮ pW'5~6ٜG60]>uԩ?8!, Z,' _ﯞ'߮^?d+Xljed"*̧nt_{Pa/тs_99Hzdޟp{rQlXڈQϠ\ r!@\7ڟ22m}~9V(:~UĻ֬?<{x_~fG)f4-"Paq pi`txQBg5,$Iơ@{: q|X SG:?f!|@NSBi̮3`ƴ\9J\4:ϘG|!]m5hP[t_[ڽ=\(c"Ϸܮ>P3(#`Wws#ZFΑ8}z\ cK %`ӧzW:KQ`:u‹xU\\ ؞{ɽ%|ہ'" vtLmeX( M72z^cACS{[ +s>c>uo.z8nn!E9*=e&p2c2Q ˏ$f; #.qd>YIotqWÁmݙ$]޻$9T\Çv'W_}[flZg?09u[XEzRfх.v<^Nb#QmI|!Ȼ4k4= +§y 2VJoMy^2B({۶YͩMjrк%11w6{=JJhz{|9:ǺiN0Ws}c;W]DTMe&IdJ ۘCWokFbwTGܖ uq cT1?p{ꎩ'L~ Nl`W;W$ؠH͐2wQl}@98@<ҧ80>?iZoZゕmIöZP2Di;c8T+hv }urJ23=ކO7Mض~*6K$X"Q5vfc+^ap־,^8ק64L2cOfB(kҳ%@ӚYKPAյ?u5 "6:jSޘ A>[V]f `h{4>T +ŋ$&TTGfeo /ofcQ &a:Mko+zM1(YzNq +?ܝ(XD}h8 ъQᩛ`xh^ Վ۬orQqb!j +q5neo0)*2@)FA΋/(ՅirFʼnEOVL|(\(_ =ֹ(%(i6(Ȏ69:RHtD ow4ߋu -B(e?nNǡ헴(uhЏ?t2v6g9ۍ@#HU9&BuF?U%ޟ(P(yݵbvb&vƳL'w%:o攣#Ϸ9J`K\)sd-z׽P .P &82ͬ~H>$7#Ge-cq_CBUbFwqE T܀wI@/q-W(īiDUm]]̙:Qtwv b"%ͧu QܒEJ7ظt WQg0BhC2fF%:km$ Tbt-ze8QK$uis+$O3L +G[^T\ᆳ$ mtW_k܌씪R6)|JBΡ$[2@VLp*2du9ɟ8g#PG,O +d MЈl)fg+J@"21i{!܊uMO;Sor |xF5jREaVa*o}_0Qy$V)g{RndAt+.\d^(`L&>qXhKn &qTI:w}Ҷ{bFu&wi\G?wBh=;Uh!-}q߭%?HQwKoS Cn|%q$̀jܞK3Hy%x<P m\SE'زվ@<~~puڍÜu#)q M#~]%?pJhK7Yʙ;TUEBnr6Xz;w^"S'Fݰ;ӐD Dǹ*2ib?&6MnKp|T xEeV FD5`QǮ/x֪l7x"{ڟ@+C[tvb.*r @\ݷ% :%y5Wfp$NP0DF0.97y훳'g?M!85n+ Pp-fR&X/TH4 y݀TRDȧ%:0#,'*G.F2INLc=7R W$… JG< 78 6@@D ID3baK>oJ*-8kdx9b- 0P"3.,pA4)J*u+|"|gP06)!\P>,%ҷ=X~X_t-T 2ne endstream endobj 2943 0 obj <>stream +0 Q@&x QSW߯ kELZ$R~j/_i7/Z+h#/!Hv,zݢ7Pn흎 k^ +:pwmi9@֑k}"?P(ϰbODN*שtX("(.lNYz|}u2Za.ß1\HɻmQ@?&݀xq74S_8eE8 !|hA.u~٘ACA9͸m ;. w ejȂa\<~#0q=Ji5T<bi7: ;} iMTlEM'fz:w=q_6eW\S';8x>[:B,KC1~A+1w >u"J:q2L?q t*޳#9@T"JLF*q +ԁ؇J Qljw|+NM<*~a., I(! ̽9'GP)L_\0+$leJ +pαa ^Dl4] +Sn]V`oˁBlQ t%9ZiI2,\!3{>=>1 `a'!4h1v!eBP63$nlf֢Kw~R?Ԍ¬5q /Wb7 Th:LF]ް;=ASPBkD a8ϢL.!E'\j'K+T4*.*hEp+UV.K&QRlAc aE~9t:z ,ݯ㱀44>y\;i@U ; +BԵGkSml Q +a-kZg9W+qaknŦ.TtL@ >cU9ƆN#x2¬'el3ڤ44R_W?FM]1IGCaڻhu?ayMS !I9p@k4aih18g9%=IB +1QX FΐH[B3n)__wbEeKI[>o}%qd +qo V:#;=]h+y^8~PPIZ2eą}Jg_.h]@ƿ"`YN);}|\e2."&q(5.o"1[~ycY 9$Pw…7janCH_h0J$xAk +RWmեqױd :V̚;(6aFQ0,]& Wә;{%xdŽ,.%Kp -Zێ4kiMImpY4rk'"'U%JLk4>02q s!җQ&" `CX'MS㟱і[7` +Uh쁇~[f`^Tif!0gs%@vP03DԬ5T/zle%̑5ՠsy?;ܩXKf)+$nlS6wPDZ'z-ri!,JQ@{ks +bJTnj/dW 0JT UgލŎ A3gBWۥ=y\~=r- +-=PfL2j 6 <ЁH,YDFGtU=IT<]hSr h83]a8[6!o-}䄄ɣL>dTqpk/2Y@`S,3ޔF_nXsM\㊒.7AآV$\XlW[kv*8Š[ߒ-FælkA; 2c|Կ7oAR̓!9aߨ:/4sLjMg/OPhg\S}d/{1$fD&{~s(eib)G9Gu VGS474r=78j&p)'v?JLL7+Y p ᐓX̛<]PǎW,k)>mB՝NnRƍ=-H +h#[&mEm= Qa.5j;/ ֊҃e:83[yRšڨ)B=Vx 6:ט I?7esp1/vXTykcyہ+~Ҍ] +E})K[!qעWSv>Jl,#!,zJ$Mo=P(kbRrޥ}Xi *3²u)TuY08ƶ?SZ [HQ8IKs%ȖTsKw ёt9ٳ}!<M(8UU<TF];HQS1Q^U:UP/me>qL㻋)P(+:Ugcjd[,J Ѩ1ȴ9>U|ݺ1I*hTN,wG3eJWѧPҢ>gV=5 X~3]Į?H.kfc0 {Mp~WV2 JU0=.=z +=j\ySKSDo]፜suFT)ʹWC9cVpx)q rkh75k{Lhl~$QZh(Zb8ڛ.ddSA0~* zFqBl@נsrJWMWWYXnF2$'V_hl4*ggzy(CHّT +mIJ-Hă"zJ"O]^={ ?>%Z +Ȳ*>m*3`o[CtL9ىsKnFSBE а7,$"r/J@XtoL&K >qo4B2K1 hnE3YBϪQۨEፆ3p~G&8zl-y*Ѝ*E-9L-n`fdBJdR,u2U1$ U!w^[CC9ӗN~UQ+r^x+&SEn@n=c鯿f',H،u!zX7Stz$6M [BRiq,mq ϛJB煄 ȿTWqL T!O'^z*J؏?F}9.x{ubo'@?F#$& Q8%MOt 0#nSxnk( +hВ.W65E2oH'g%qZP*63Ż"5ȏJ +ͻ_ԌhL*.XG83ԇ{Htmm=u6qTm 7Wmk`@2CX{ާsN7g{g\έ#b$0k/4+" H]qO7ה94HAʒ2h +0qX!&vpJk#ެd')3zD7OjDw>SlBp$lNj'o2N  4JTYZD:}RZkUH-xp}1'lۛ@r<_S>s~;ˍ#) q2>.Z +fgv6E-6HZXqR"` QVdmgo +o?'pWVS*K<,(=B{ 68#ulL"D \\llHL:!b{vAOIc-4I 5 #GuCn=[`?FΒU=ZF c ~9=?T&cJ:#,54yuS #OC\h?&c bW\~EwiH +m:XB#˲J>9)==" +"}*H]-uUoCu Tf.ml'Zວ(,-?R,W2(ʲn+DezS+1Sw``3B)鷈 Y*vs~>~Tok:˙U<jb:{62)dYSkYr#{ؤ07TCWOnмr'$)0x ɇpW}J̽i ]ٖoRu;7왅B&na/R*@1xea?vq?OLJY P,s_$ ? ^ +xK d4AH>Ik37@ue]*MY^ڣ$Xve>$fရY>_ ɰm>K>YM?< @iUN-(4QQw Z. {cwpa^2:/Ґ֨AHy=Fn_5PAx]}[Q+ .ej':Q$\]NiMA盈R-E +!9P.1 @ωԦ̼sヌL:ߊՋ?:a-"S39N]S$$*ƚYosTK5^syWկ%g)]Cb혀^Z\vy q9ÎHlY;Z(J%~:i<;ӘüJaۧ#5q:=F'K7,3};[;+uyppco,B hWf^b1wχ,-XgQ&\FMɫ!JwsnU.n*O%*W?],Yl a?w%9F%9c 9IJN.j$kR0奱>s}'T3ɧQ6={OG,%$UrX!38#Uo#0< R%!c(қ| fZ#_9RMxphKDDnFM/:fܧQԗ)J%}nwa_.@fk?sM\DJЌ¦G[LȲ10Z03"TAC[MtAsނR.b~3ɵyh85^#?_dysƕ7NVGWss +h9&\EE@S߸Jkˀ4J2HOKMKB[G0}7&J@/9s-%l$VU(A_V_ʷ/t;/)fZ=IO|<%4cuRW݈36qYj{t":ݭ =]di%2oI7 ߳EQq]긃ﰛ.%~ [K}ZnҙԷ %\*W Z.dޭdpP"TXUHɻT[|+An+:IJϯ)Gxwohc\8qg6$\AϫI>ۉxPBxW -R~Ar8hɃ9H{3 ʸz4S3OkÕX7ŧ/ e?1!PU>R ]AM8@5~<'^k`Q!PwuU6%bQu+Vf)<]#Sr.*AewL)037p@z{J^0g<](MKJߘ#KvBݕW5%$1uamPL +Τp(2 Z +FXgdDy<`|60FFDn\ڃ1H"Cma[!7J~#T xxdf:|mNpHPțlqDEz&6`%fV6|&୽8)^)|qMwHƐ(n}t'b(/|E&'O>+%.tUF6n30չt.Fʜ!ۺO4$kLזYc] +cb\b!BQ`L$+?jo..13!rXVw_a]KDg}N*ߔvv@req1#SY`0` /FipEΑk$>}ƓE CLK)7&1Vi>@rN6s(vkTrsy$ 7`prN*&@N#,YޢVDCa%p F1UTz =l?9v_5#u?10KXV BB-@B־5 U. f"ȴIVF|$%xWrFӖk%8~'M+GE,L17-¯wgN~b,ut-5BIUpW貊~9LI?Xw{ ]8j6v SBBPφ`sw"pmi]^*eGJ2xoߡR(ZNխ4bu~#hR;H5dgBTN\q +zDwk]&V +J "MHY:]w=Ҽ JPTs9}i ^C4}fw&&{ąI`I)"WN*kqMd٨]/~HoPi^1Gn1K] eһ. "959$7+ŎN՚ +5xk>ǥc$!JS|T}3Ѫ1L̑KHZš/ݮN޲g1jGU1TbɃfBU_^ +Ը@ݤ 0spԥ ++P6z@ O}by\2>v ݹr) {YD^m2X^UQ՛h?Q_ace8:n[r*tAupRa@O-$$EPQfse(-*2olq#9?9P3`0v ڰZC}V-g4Br&1ރ3+)5\fM+碠u*5J.DG  uΔӅMLGlP?nA< iSU>#F8*a)veo#sCa$!na)k6zN4UP2e&*D9a`@5-j7ޞ;^z\;y_ mʉzICHF;fgpBD*6 @Ϙ\= CoIxM"]qn"[sK˃v8 4C԰nm@G!m "YjTit3 /HZC뵵5Ѿ6DrtgdّgCpۜCMU[39`plW*^^"&~7u{IIL@9Oo U3ڃqkVp/I$Xm-iAU7}!Z@BhȺWz$h\U]$fUlZQsn zi;|3~1ѽ%Ami(D4_?k $Q lkyP{e72ժ(~yw`=]8pߣ5;nҥ>7$Ż+^ ;!LWSxu]\//{5Kѿ4Lۑj[sIa] +=8u$N%qER}z;&ܢ*n_Pe8CT'4]G jtSyIF*;/W k֝ֆR9.O3M٫/;JľeAܥ 5EZA22xZ~8An##+# |%c۳ԙnG.WymS]_d*X^ìNSU_+Fe- zB0Nwicqw9܃ͩDxLI=+#Q +p^ hCeԗg)Qu8#y69#+˴zINO$ks4Rs$2|ց<{5L wϢODF`NA&a<:ꏻ +WaSkOh&BӰqt VhUA1!+wp &8Կz$7{x0b8"x BQIzI+L2pzĜpqM#Xnp(t*+x+! <,m$SQKx%Ўǔ>DgD&/{/h](Rm_LɓpZDFB>ʖ~|Ӌ%: (_'˿SL_~G\['/ewuz+c=,Q/NfWG[GI~OUYE+,6.h8s2*e]q۽Y8! gyk|"隈q_te5sDvJuu +'jӼo~gHvkXfDQdb@SH8e+Qp} tLd8A]p\XLTKL!iEaॢxǵb?s~G~ =vCj(2@-8OKVfB?u)ͼwhQ1[?!*̺̐5g+m㪗2Yz+|9v䵖8r1fg?ٴiuo19C p Q8GAfhx6N{B1ѪS*; m& ~,OV?B9:5 jO-ӂL[>lpmaԸUQFl]U rw3ně:v'x=/0JD۔(w#ݔW-]mGU=a;daL=R3SZ!arhq-BJk  vO4 +Gj(UaIۈexc!^"5~ceqk? 1!]\F/GϾ';&O Q?GuZJ6}A1q˞^8ᘋ,l5X>&Yc)!?q [s1c;73MyXy +Pb޼3xMM\1 -Θ 8vsK0f"cۆ +!ѫ8'~|L^#{\sNEmrȵ 9{I:,>h &3aj0XiXHЃf0C-ismHc^5"+d?(5$dkE^:q(GV{#F#o${!lg-u/hF>f5@4I-ѭh{hkΣZǪ㰱5܍i+CU=A!<:cmg6T]qH q-35$^HiHs2`씧1>u~(}^ANjvj`0T8,peǺkX5hfBB<0ڝy0e>ڼ^c".a,sqB["݆w%d4b/`@W,jZ0X\y7rV9 )T|0>-D89)FwjY< `S=7 N=])@E@ȉj|'8ا:&0a70qn"UX"گӒ7.M)3?N\yN(6zb_2\M0}\OѸ:)ޅ. sTz6h~YdpΌ`ºV{QIx635"U6蔬}[4·ou@VhߙqT<_eWb9k pS7aqvb$[wϪ]}ig6*ěIClGSzeeYx|}8wYjƃ6lw_nߺ#76NH{~KC=~;xtSU* +q׽`921:$w=e)lIqDN^-N=~\d|:x8Ʃ;ڽ$- qld{LLAVwW`9TbI;J.$ [WoΤ#WsfU:fOOPcIi[>}hiH~̕9ff-HiSᆪADqY mUݛ&6?^cGdYpi7 ϔM%7ʲguxO7c赿tȇF;;Y(w.hghabIԎ(Ex&*4K(1PCH8R&~n.yn"{H`l٫@aYyf{3VN8ު}߂݅n+׭ *L)[7WȰϒ+q$ .{wNC Jqh3It. 7X|[FKÿ#9emD8Q&7#)^iH\ԸKolg| +N4aykgC&C#dqbUSaF|Cu Qu>2V=B 3dSd̑ħ%RΪL>rn q5?{)X1 ոJ3m~@H_z׺HA3:jipn{#~ZT8R:>&-' V*L("J12Ɖ>`[T]Fg4Drdqfm_>V?s@^ ^l6EQ+7:~d^[߳Pu %aD$G &s&X{IhR9+ftB$#tw"5n*ʍ~^VsiOas#{d` 2@ Tu\^iuQ'd%cFI9.yUxU]`Q5fx{6QĚM( 5TXm@e[cOz6cȅ˵jŪH۔֥븣8D4)Ƈczr 艭I;>"•Zr*NQT +4O|3à +3*v~, +ήw0u@ n5k3wxN7v`nƦ[Aa5M+ reRfV(em2mLLڂQJ)2gXp*QVjF+eњ=K$"7+Ldۢ bnW*]|J, h{/!k6OoP С 1Pk +A"+QuP`ʎǹ'WbH, @Eȥ`Vצ9kɁƆfg+,[|~[[PU8SrJ>֬v|L(!sس ޜ88 %t}˵KdaE9MkYHlɾ[m9ko}k=Uث 4,nZ rơy1oI}c^Rr<ۍu Ɠdth8AP +uRc,UBOI8=锢#wG +[&en`1G%o?h-)}FEs|Z>ҹW +52e'?ԃ_W΢Iu{JJ&,oM6%Emà 3w0y}!1 M[<)'ϰ2{pchhg6Q>ߐRP.RMq֤k,6%!9-/  ԐyFb h1}Χ|@10gK1Xz#I'b6W5J-8Q$ K,>S~5wAFS z`0ݵb~4Wϓl틢VgojI=em Sn֮(7|rfwzY_}vU%Cneʁl"~T.tp𕿃5DtR,0jT97u*0aJ2ku*-Ggc#yIv-]#.By =!cDؒ#9IC[uE;1tYZ:`>ZNr 9"o3̡jȖ)=6;T sTiVS>eUfݛ#^j])+܈:όߐ472/Tfŀ'9IT "D)3@DISp2HEF)lUH`,)ل]]\o06ubbKvZS{pܬ xsXG8ALd%*qy1=p'٬U}۲`hp\,U=rhtԘR*&vHi ?y6'C֌' +؏N]3QvIԄ';r&Aj2ꂟ#BXrwl.1^ D{W&= wZ.51ֱ% IvWi9fC%υ;$ts|xvMHq:QU{LdžLAK=.>ly94'b8N{%bQ6؉DƉSɐ'w&(8hV"mx>8o9wG%:xKJ{Y3?#3YHd(v÷Y.N8@:e/W$뭶 #P22qℼ; Df4_Wzd$+ jYl7 kz zz@t +  M%͖aPas}ʊZH˗ |, t Dz͈(To5{bU'F˩%Mmu1dG{~ )OK߿wg0,m 5lk(eRPg[UO!j:-^}R$Z]Sx},o E!{Kbu{6s;7qho//[^ +)I.)& d$j_*Kv+;2eF<P}8syL,E B[ rr,j*Тe[Dr]ISKLrGHӹ2y=WH&&;Ɛ͘vb=ټ1B-J(Vk F~+;jb 5C^w5ՠx건@ ruJLRt" 舌8/z:[U|ʈ3 A;ȁ>kCVDi8O5X$3G11'w᜷0XhV9EJ6llq +FI"|,HqnS&چ$'8Y#e6xrBޟƄ=w1`W&~ZR< 7Ai>&2aH0V [wjɆO wshǘU1/@2 ޱcЩC)4>tW~{ D1B=^od;% *pN*B5U6X-c=d8ގplP3=Zv8 )uܧ +(M + ^0!Ǵa=(?ӎe4)d;_yݥ`|Ij#@DSHڢNE?Kl6 -aXOmS#ʨRDݑ=wOqo^>'}0=ۈ8ƜJXOS~n *R]`~ +nozXR֣=kb=调[dj*mڊo4`Qykc@G?dkb JJ? +T7,2{F1>qJJ$Ҷch I_TZ`|f+`<b%e \(Vh' c +2jvق]t1t?$ПY峋ieNzA9 RaE Hq(k/D?U?u {P෼BQQ_XvL߫kc)vmqI^D߂,8bO?-k7@<ycPz@=Q{7cZ|^X17v: *:$9~63/؋!uqy8%#Mt2tj5*7FGC`sYq_ EXUm0&'暀)lEBo/#d8^6^`Qd((e-Ψqm'KߏcT^Є$cʙD|>}!Uz:J#u,Xv.JM; 8̇`5E$NG |$88'Fvd(NÕQo}Aj^2t*r-} ԗbj @bzƱ<v0gWKk94FD'X/9[-R#!b +H~؛O'fXM0a2vkx0أ_ҏwiSß_gh z,\s% T" `<:s }~m +!ialWح MTzՁ$;lPEIT}&ǎ+o-]C"M/%hl=K>0h;j|-%jX,g.ea]e@tt9 :n|Rp/Unu*>nIC&dJԣSلC-A}n/\?*+t"f zzn@D3d}? $t`d4_Rc\4̈́ ɂu]:KkC Lبd9CF4jɤg8ӏ=7/75&s tQί(-_~IS U\EaQYUSd-NEMp^1iB"@|3'cpmiѢMaAd$=pi +hՕ> 50EkOgrzY]>iYT 3쯵#/_kvhGKmP0)"W 'Ќ408tه:Xz[m$oc9u5+귟K`?AgeI$ӽ`G1V tZJ[ +;<鬚, >H""yo=:'dqRmdxv/jtʟ |EVߡ(Ee@ Yo0K ;5L'iX~(gt'eTU5>slIf!0=5e[i2Q$2eqm^VokÏ䶛 "GX"6k~ܖÓwp.e!1 ! J#Õ/&A7ߔ~dnDnێx]}Բ +2\aic!V/kP_9V5?!CWAFʵm"FMTdk?8 +?W6hm74mF֒| G8D @ +jV3ү5M7kWߒ"{K(E [")d{B3'&F8q-%_mESץ"JÀzxVzs߲<]ED@5z~bicRkaQG{e5D ea rq3٠Jd~Ou +eoU#">zabt]uDGETO"5inZ3l1&\mᅋ'H["U6$85f( GѴ+PW+qdyMjB] wKf(w ] y ddQڙ#t"!& iEO%0^cS9 t|_JE^qgD'>+Q q +D\'.+s<\֮~Hk"Z NMȭo#Cozf]KwI2a9m۟)-6o_|5;zl_DO-=b{ϲVa-K:+\IR.Zt'1C;EkԄ.@djF!->Pu qIJu-j-H)nFj亱ĝUئH`u1dq x)<ǓW8.8]cTW`龧Oܪ猡tYuw6k:CJuG-ĵXȆMp#z \:H3Y`Fh(OmoYn΅,ROrc({}0F0s.DH́p@GBUi4ʤб$mT rZzkbˉA]UВb҂V }'q>/ j"q%ߒA#XMWQ-n+Ѩ#њ+I"V e))˧, l ̥D* U0&`V0`>:ekwv˄ DW6א]|qCR +GЙ%++(~M܎™:W-Ef3ȺЦN@4bT}Y#4"[y owE7zL ҈;5@]tWy;ke#CCRWEGQt?]mouT,E"օ9jsO:U+ );_jD>r +΁w3š7?&!LeDA87 +$xP/5RW9=k!(dO`Z`gcl| Vn$3YF?Vdܓ6K6B 2gP%MFfF3t>{.#]3"{[%ˏ)F{b.Lgxt`hXm+0f g%F=TEQ)JH ?[o7ӓܑ}ba e">|GCwi _1teުI^3ܘw^=>wBxi~CCiW̲ +]ـk:=8f&Z{M K';w(dF( 5 _g;zCd!5ow,6LJrOfџed{U>V/nG46[JO#JaETy3[ԞaA3LtLCS4K. EY\uwWL5 IR\zFBG58Ii)jƢbKs8O#uֆ8]%!com,&?7}4Jn+-m0H"L]h%)1#%& o;l`9&{}R2(f)ypI|m7|ql6N)u05W*|VyS^q+s .s=e*HzB%*'PXK$TI3]k%h6TiAbBQhݨS";,jGy8Z/*gy D1P.-m! c)OŤlia?X]24 m"$6KBg^Fks4^( 6GQ,]Z'صG?.fØ/דJt|k=$oN8CGgAxM4vY"]ZN~s8.!lS:]1pqn&¸SuC #v=ƚvG?j(l @yym%RNCƄ H8ID?.WMAiND<W;aڽGўH/ÇX.mǭIw+8`S&[cnH2Mt_ ;/= +C|'4t1J~S;cvґUIt~SeCQ#3-Z[鏧U/Cp5V `Be>ЭuE듼SAǢ~2ٹ X[BZ mSc¨W%bx{ׂH\"{ПEMSxp-%]Εʴ=-]tĐ=Zw؟ԣ#ž(OqVrȢM•BJTCEgLcgۤ!tٻ4ʤ"rT[k>D2zA$s;?[[/ ~^؏YP27WbF"<ҖxfoA\Q 4H.lȉxֺVwr{%ؚ$RQ=_4VBtt(Ew6-4Alye(& $nL:ؐ{JL.?RP9P 'sl,ոA)"UÐ<%DӠmd^~Y>aPdɊV2U֌?#7d\bZ{^jr'Ϋ2.S.3$ Zk|˾J9[zІ2SH 7DV<{g?i$4J + @L}iH_D$_nwcm< &II !,W"P{WV&edT\9_K詑fX4COd-7Bm0A]~'Ԑ6_gpQ wL zުkK{gMXrcY3>Lf,ɴ{#D"'Υado\u573~y]sly$29TT)GPvLFRʉq. LyǮE?8ThC6pԆ@AmugIm +$omu'e\:)wT0=qye >QWM #m&1ڭ[5c&9"~mW'߶xuj~ʊ8LSMطta ![Ώ:9Уc1/C[Nʦ`+i~8b@741i*f+2HOӭRW8BV QOϺn^2Nw9vUVhx^NXLıAٕTbrbƧV_ endstream endobj 2940 0 obj <> endobj 2941 0 obj <> endobj 2942 0 obj <> endobj 2932 0 obj <>stream +HWێ}W̛@lb]vr6ttUWWSuL8C YP#RF_~ -ng̾OIwhעQbxT̾,xc4B2J_f}pp]~wˇ~gke!_/7q^(_f?ޗlF(8V巏\e. WLՆR-;.,̸â;SK/ ieD ֔C-;x[r<PJ.>1E9G(qb:d3j*QXkYlTGGGD96= +7r|wr#M`Mtp @,cAX 5{}(o.(C#b<Z>,r_6=}AX:dSwQƹsf >GzmYY~\#ڛԙ^$Oj+K<˜򸸩?,)L=/fl5`ݕ.dѶA0]fdF +ȾHK;{w>sXD AUeVj[WmPst2OQE@\kbU!pV4R@*hDa} ES a"~E^{M7{|;Q%msh3-%%ѶiJ@NSb)LI7^ ++:ޱW2U.S^ՃP3aNkoi]WUs2 'aٺhzL33EXz4Ex>Hp(/nӣITQщ ,9^[UAllu` MrV ^M | (s^ٿnTO!IvwX.z{K(5SH 4Vp6]~8teZ"hOF6M ~ +D/Y%WPԫ00 1Nt 8CyMf1n'JNjX6}1p,Gĭ ĝhmZAYniAf0i>PyMW`CyU'|FMD;v%N;Z-RaqX3)#)QkB6,R zRr9J!yqG;,qm6 wRhyrTdeZ҈Lp5#be4_K#a }~-MZ)D#GPwKd;kGk>#M~]/"f6r 8F"(?yH0Gi\o7 {/sA㰝0W^>UR7µO6YfpwX +MfZNX/ S hVO#A&="f"XOV W^3gfIT֫o2hJDkV;6>28/9^MM}hIP +C鸮mŰjWZV +s_~,aFm +=X9|@,$z(oVȻ)epqЄq,+ S-dQ%$VUGCs]})T:ʑv5} NӫPGP"mӗCO/@ywJyS) sDratݠr}I3#E.t~̜q-@ ,"0$"8D3Drkk ͋ޡze]L0UbGZDͯ-FfᠤLJ]\l.{&Ɣڸ$A1fM<ܿy**yZn|0r e.wk$z[~n3sH +cH='94}h&/MS֗Jep!+}ڡ6A`๴^ui0;CaSW7xq9הl|mM/rSEG3ŷqc ̘>ww ˏ7( &Wvм39gСlvf~@wkTiil{y_1!m!~ljKT]_Hdj|ObMx *ջP}6f~m4 Ց~gArUJ8\7<}Wp(c]C3 +vJti|ml6#Vz]yp[-yepAz +$rQijn tVhz7DA>,'9Hk“u90>xzU>Twگ^%"XDp| fŒ^Y+vxڵ\JgfEU0er'.sk D0i*TQh% ޜJ-aG3"HmW k Cq4~ \w.((cUVRgĨ֫mrɽu(P`4{أb˱Pj-);77G7ÉP1}DPU" + Nhxmn)ၡn+,x,qI +F P x䔒ǙsphJOJ3VYcrIϻfBJP*FJ^(qEK1uOAY ҅6rذ vQ<^.ݍrV{T=%]6MIL U_.cZݰ/B*2xWlCܯ38 *.[,`*޲X#}l:ʜ+pd%0i[¼1tGC3> 2P$VbA] wNRnIfK=ЕV?goW+9.T ׂ +^3«quXgF]Om: xH/1ęPDba> + +9i:#? ͘.(é5ΕCm^<߯2M\7xF-0H/~}/eZdDlDt, +1 Vf.|R"VD٨~H$_:͹7UQ!uo{f9)l.̙r! 6p˜],+ r29\ L(SV @;՞;"-FȠG C%79J4H{\Z→|-|=`tCR@' endstream endobj 2938 0 obj <>stream +0 D@&i Duiy9GuR$dWgch U%o +fWbPWɞm 1_[+u?FSC ޴G LGnjbߊaV*uR hӚl7`_OR%yI箭;Y`Pm˼r k&? +UgN{#xkL <ޭ֓iV].X-]JQ!w 4}Wmw&Jg5o'T8Sb^s~L.`=_wSX;&WY\mk!^;"7B K=Ƹo<\ڱc)xu&͇C43] %Nr|~D 6s<-m[ђ! k8IϏ Q Ш`cHlvW١k\=\cQ͝u@$4_<+{QE@}/6ށk?L-KOW-AB5k8HQZq,O!*t䕕,*@~IȘCu>3SR-Me Ӯ[^"wjp#XΘ@+E:3Pz",|%kGS-6>)q`Rf O&Yt%9}\Y *tU9/R CGOpIL+tVYo +`GRL{V^¨ROOE _\˰'R{ Ez7xdkSڬa(FkYGЮS"y=;d1n.01Ba:.n{t}sR*`8n¥>,ٍЯu9g@}/]u*}ٲr8Kt qv쌯$O) v=hCpcE_smF~1*Ǹ|;O'p~Bko紤M[ϏJM- +|nDp=(߀wbRT[^ãU'3^XG][7pC} j FԠ2 Ig`N_ > YmWOsᗽt38-v-1\nILd,`6z4y'lpʖ2zS$19 7AY~ϖ%ME%Rt[4t;c +8v;D+dQG+U |`Oq"(RHx,0NRVBKK+ -m / 0`~v2RB)^PBncyHR{5|2U&njo}eA=ZMzPx^o\S24>1̄x|7,k:Vݚhb7ٍDr;Om kyۑK:?yqy#@`N@PVZJo\`qnb蹘wC(F4b=3xH:ٖi Xu pk-#+(^xI^!2 FAv]#O; 技s̡lt݆u;xs WKFOqq9D_뮎Gd!`)ՠ~V}M҅saևY3,^IU +A%K #©zIKnȘӸ]6oh0KP `aXsOYգA 40c8:2F )%c;䍾JVvJ2˶o-M#iw–*,SAv~{Z?QIїUO Q1q>_!~1onW^;˥"$t oǭ +I %%PH2"GݬFV?|)oJGF-w;Ys_"?}Xѡ6qw1k~N3u&u8xTi,B \Xi.Mef+@,X\(VY-lo{3A{5$UOt:ċu;F݈@bodȢn,A|"{>5__Ge<3@2OIPBvX.b;Re"#G'724)wG0>Kl i h@eh738JQ|@ŗI񌛱- J`XjL^ VNK#Ay8"4>"aİn~C敭AϘ)PaxC]g7`hj.a`cMykff靫P!9&dXs"BmZ_"i涢} ҿ]K, r:`zMű?|ԋ\2@If)lVuTg-}taiKsqVێo+2l0}=OwL ΰ bSV xkϚ<鵨~>pװ/lt59k݆eW5Am5=.dͥI;ZթOJE fSD`jf(\я7Y5&_%ֈõ  94Y Ev 7cƙC>7uP m-$ĨeC>ځ'b$Me}#nMuBg@2R}_W`& )/9".D `bn/]Og{FrA#څh95lُYƢ l`d-]Í%~%~qo0y-EJOF _]2۹ܘw!z~=fZG'um!wgmiB39oo&֚h}5zO+"k/ܠ̐$jAPG%[~Ϸjn3Pvn9GT`dG9A A!@Z̡M7C)] +B5>řV!C{c !#Io+i.٧5fg';N`dbJ&sn!"L¨ɹ|ů qJa(z\NkE kИiʇ7P %!)lJ%枧x;8bUˍ^O1 Z_us #j^h4nH?gGsl(-Q7V?3 0K6Cό}.bQvz%IK_Բ*J3e4W3@gP7}4 ǼjaKG`$$RETTt&;:b#p{FxHchu,Sf_͝&Fm]UQ_he?p̼>W3Rf;#_ ʯȵEJ|%y^"=qH_Kݨ pչ`lƠ3nl#uvBQiI?c~&9,k뉀< a+)vN䊷Q}<; -WZu**%9;%b!Kmj^;iBr`A%Z=5:CMA-^ qUw,+yBUYS JTt.Ҟ4.g M=ЀMׂ&ѭxfAfǪnDJdf6nbSvԫ:]GeaV]nTt-( R>A,7DZAd7Q|(]q"h{лnm2lL_ p$οNtysCR+Wps +IB48/.,AhOkr;ƧhmnQVU3#IRM~9C4-M<'Fbnyd r'+jNNi~MJΗabrTL_|k>`&g ++`T;C dGpMWQ0,q3-;/?{eTV+N2e6YS{!k*W1gEk09 uQ~k|o1~Ce(ʸ~h˕07IO O ̗A# qeTc8Fv-*8\M:?͔$aiA&;D?|y yc>\A= A>iD.us1NLᅰm~0_+: 3>N;im7i</x0ZB){Թo] +"dOʼn4it<}ÓCՇPs5##7>v3nb +4OUepY\7,*wj|e)I h\g";.;);|%q`M?UȾ<`’{]p8˿9F(dx@oRu% ]> T _44\I-0 ޷=9i D9;2_<_":#vɒWˇmsɰsA5a)%B߫v?c|SYkpӆ`[Dcx")ln`$ڱ!vغd:JfBX|S !TcGsj:R4;LeOAK)/dlQ[ga +/R3leB-jݯ+qH jՃ*ww5=hjLE'S#K-qSg{Gzkxt!)ż%&&BkFYyr]U G{ u ӯSR0r9v? )HtHb Hm1x^8>3_VaÏ*0,ܻc!pѷ] n+N?Il2)q}O=fMr[3k r:sO,CA\%s"ӿ݃7N};-.S| .<@FFpL:d1*nV5`ľWPLG(Tƛ⨫}{! PΩg!m^<;lC*A׼ƛI&Æ0uחߐ&P%sHiGAv7tZd>VX@a?xKq,oa.t֊\[m7Œ#^ œgʹ +%9)rfUh,iN:yޢx%٬LΑ ;f~NA%dH߳IxL4kq]_DzٳGB7_"VB:C$u-IK.zz^D+x;Y v &✴p7_ʇVtvɅ=U:4RT {@;Qiơ{GAYMc΢2ot5 F1uml+p`˽$ 'Pe|{ +Ͽh`2=~yUqQ +QVʄY[8oMbެq.4CbcEKq/ +0 HYV\bm83}儥)Z)MrZ:0Pb #. a`gE1GT'@ U(UqL(q2^sqPRڿ\:iP$'XˌdB&؝jm )lhkhI\xԫ n +9BNT-3j` Dc֑Oo'OK+cԖ +y+GžK Te2l!/PGztwShZQHD5pWFEW 댴]fi]ޙgN!*MhJo"㎫_}%,k\6MT,}ք^YNb1/ږijb>- ][1Gp\k6͙.pq3k)HD*uԐm>x0ӖLg-IV Uewiͩ$(-~p592Bw͹  8s(?7 Gs- ℮φf~"= 67.TE$YU_Z{`6 x?@m @d9m׆6zY/M϶ +:#s3L=Pr93. FsI|][*]Xd/XDyD#P)$.o=BGoZߦR<) +%IbN3ݍu |l9&)g-!Y,fJoy)s<Ldh(Vf_h{>!D2F؎]ӵ |rgOzhp}+웻:!v%P^b1?Ł[G3:3ofmTѿw]9$SDvYjN}S*p(AP j,Ny *!T#"!iD8N b.j_<_pǃnH5cK &حB"3=| `D [Qe?+0#d.YBy`^Y%ʄ?ϳJ ܒ@YӱKK2|{2hʹ\J}Ve96,j˝M>VߐK[MaUO`K3tbwZ0qQ =|=kQU X𣣃 Y` Rrʜ9Z: %WŜ:L.0oEU~:$ Mc'&ouOHABL$y<c>"6*bتfU}s'{Yu,"#JIa'\cux("DgMz80Ɖ/zmp- Ŋ2 TFe5AfֺYmf-ֳ<-Y``=˪Fj1Gg#Qͪ4 -^)K]tNc}|C6KRؙu%[ I'#_Oț[>:SɆ0#-V)?.dp,^AU:= YW`|xDY?ZUl))_A=W,0Z'3t\ rj+#Ĕ&wYSo݁cƪư#T!O1كfhN/6mPa=.~MrG"6kaq8: 5.V(@Ւw㰂T^-PbYU:^'OpIzP*vO#WLFW5nVҤ [+U~!Z=V7! VY1P1n(NO ԞRlDT5Oh;SOɃ2I9x)5.3둓iGƣR^%ʴ'<}gt^{NXLj*pzܔqfvx:MRP66 1D%$.#sV* +{Uqn< "L>.-Ǎhs +5ɗCSrOo+br_C&pL:~\@0M$?j)80=v\f󜥶 Y6(.JI^p1:&S ;GTt2o8|>i/4-"J8t>k x*J4$ϷWk~a ݬݽAcY.0L){%"8jΏ1Ԩl٩ kA3Ҿ3#i+WB\RՏO\?/ +en h=Es M>= +EY`sQ[FP~`8Q8ӆF1#?ć^az<~" *h@غ˧SP;)l-&.jT3!%su6]Z?#=ց>;bivrnP_]ќ`00\e.sᷝ=sG?5YsC\6M~fG83Eu=eQLiD\Z>>%΃Z~gRCƲ1q+8,c[< b6gP"xepX0_hbo +Q /@J 7*J5"w:}LR;׃QSOU’u&;ǨW\X7W/vv¢BFFCyVJvI$ʼn -13 [WDLra!pE z,׍Y?ZbNF`"S$%Fv1|lro!tm+T6 &+? b0#gG8V-&ü)Ҷê;oȵࡑ6VpL~z +=хP"_i)"NBmY=󵷮߁XG+x2'^vN@])qYoA]w%6jЗh"h}uW] Sb,JN.fT2_ +yx]DwvM#Fp-? #/n:eN5Ԟ.SShn*fTZ@+D"Sĭz6+D@:-; +xlٕє˔lҫFY(^āGzcj+%ttz=Yo6YM>ktuK!QKҚeZ^D*s[~@}8/.TnJٶ{;\C^bcA=n X렄f4i% ~ NJiyb&+ ayC ].}ThVChŊ܏zpWEJ+ }}#kmoi㻦G K:_LZ{ .&>v/345LДf}=ϔ{=*,'TfLXő}s )X=jpNO1V7a9(}!YF躀u.s\./z8+G ѻ}hRDVAqNE;AI;D!G{-|5It0L97a"dǻ-KmῤH.J0" '+uÜy18~.q8"?3R:OPE|%<H?ؓE1)D.=[/yE>/f3hCN-#[DSlDejwcRcwtY++iB=u:2d쮉榴"-jyI<'-rj+(#X)qCjo$MJF `l%uk͒˾c?ُtvBu 0H%4a%(E"~H2+|cW%vZ%޹K.Duzy.!L=g +3@yQV>d[b`v1E':R s(j>ҙ;zlUB $gm>8-WcR}i8l3R-Ć?䑟 SβT!1]"@Ii4HƥPb̈GhZ?VYsԯ{X\qV=2YO + Vy?ō8q1ޣ5?Q?SQV֩#r ;qՋfoEt3no=%ɛr*Y,;^U2*~>nڷ&X)ɦgO0J٬᧫6 ^R<3R.ZUCR NC?Y\Z ,Xs._JL [-1n[jmw +tԮ\RANyeO1?41ܹQ?٢ ?ƇiMv=DhwUЃᓭ&@QxWUjZΦvt,+ LͶ,B#bndɩ̿D&@=5k|Dڧ+Gc,DrOVK'@#©Ph\7hT3K½PmN>Ri' #A2ьLwevZmxũp3hR"SssQz{&l$ޛ9y2p2S8l5[Mt)94^(T[ht|IcG Գ<[C Vo*~0´M/rOPuUK?5Xh*My;t͎@ =ebZ3\j )M9g'}Ywks1Bn\/ΐt7jCZǜ}tF6cpD||$χzP+f=kXjN#lG +!7i+[˅PMK2)sqkyN/O?uG\ ]J_61z4dXzN|"F-<YJ6~hٍqo$T * X7t&TJt^AL-4ifYQ<%!Ҕ֯M5\qU^ϯzX'$0lc~oRTEKS(0]3gY{W8E$uԧe mR?Y< Waԣ=0=kc#̖Qocf bs|ɃPF":]6ܫmux\kޢ%@ ކL`hK(hyM(ΑwÌ7ew֧(Zidڮ{ө1A| e7NrLvD?~ +zvSh崗p~u\:$v\t}\V4P U4]7&} _0 l<^ =Mi?‡d}{;+ + ,ѯ\aͿPI{J*Jn\"p p2)/9jJ}CF *^|iמ3:̕ ޥO&|glⲺ Ub_S&`Oѕv@M Jj}&"ޔYΘ!"Jf~Ɏ}~0-,كRN&(6{3!LRZ;XڗA[܂[^Vά\V xD=@T;UxEZ(bU{ߧ hVRmF A>W!E_g}H<ʬDȵ #0r'i Eڋ2 #(#G?U풢!g+hF(aDE 6bJ(.6a%z~+L>)@YfМ~X\M0ιisYC+αvayrkbJ8flIdW@,`RF<6 >~.{/kſ֢.JO5kAէs &? F/o;v_):;korgP7=KDPڛf0<~ yȇ-ZI,W*4 ^.GreYaT'7N(`` JH5yὦ:%f Ǹp@zMg`Aؾ$4 N# _JBl o(ẗ́i"385i(l²`l}~am)ԏ#LŨfɚ2cњ~Gl\46]ysHDKc5yʖfZ>hH\LUqOHpnih t;\O~VrhP: +ٻƶ}ӄT¼ZT2f(eyR]]6𫴻A-~yh5D`o$l([_#$.}HuUHaVnr5He `W;c!*3&<0H_0aCjFybybL6f!9'[( yapߴ;OG +A6/EM *UFL.&H"Tb쫙]Eg7m{OCX>I !l-|+*][ۧzض<]" wf:O2܍IEa\P eȯ&f 1aS]0vћX[q\S^+0~B.<H <\OvFl]>!wEqq\`QcJ8 N;ʦ]һ[ *gXdU%~?$FDD/litSc %JKӌ)l㱈TV6Β!%5l$x2Îpuo*Jw!ߐ/|,Ӹn5~+)FߴQſýjuKxx׹Wf7sN6U/\] Wve$?} 3pc JzA[ҧ{cipu}} EB[ݫQ?gN,M'_Z!no;ri3Bm 9"bдz(n%B<S1 `#zɣ<~x_+YOh6eF򿃐Chw)a3+ &d<lQH&Y!@dI ~ц5!,ui%h+50+559I( bs?%ѱkдNStcL9(p0h=b`@gLb Hy]2@X.Ìk _[E82udbj?<('yw6'd3q-ޯU!MVD)0@luT7$@g_('sT %JX>?7篸{ n@(\ͨ.^pk'FT>-#1/ɮG_Դ^,Uv(4~uAR!ލT#|k2LdɾTAT=hxy$P(MLe`G_#HCiDe'-e9Us}rBt:quaD43PPyU Gu3U AgB'V77 ă/M^tij;t]Raqp{\T?zPԟ[{,3@#{2XK:7.?^|{o9*2nLn5@ +255$J|wiN ^b^rK5 ? ++7Ըnh RƽO#%blv1߱xђ*IIW(yv +&"cSmy5@#N$9>fj5 NFU?LDM +"(1t"Qt*?'X6E2 ++ +jBs0nykN@5olKT/<>Js{Nܬwͨ˳$ ۯR5, IYC?xFh\70s}.8_[_^`ZM/68+6VMU?>VuE:4$޽T|5 ރ<ǖOt]n_'u-buYnVU4_Wx4P6,-XlvN>>r3#]]J\'$gLb*8ٰ5h\iqYuQ0l h&:8h80xy:Uhlډk={9e$SY,Z&b28;Dl';T'2\蜬~cCрu-;zG2p U}.dcb2@2TBL5 Gz@ڃ'e,m44Jɴ[# CG!#ӌI6*1gZs& ̻mtv$E?Xu=DKMVVYR,;h)rb~2>ߔYg"Dl"sR& +abHw)Q|D:(v!VE*q]VU5ӽ@2e8_/šѐ~RujzyЕWimsSI>7+wBFE#fAfgW^g*H=wQB~HÖmű<:E@r` j !tN'X[tfr*R(ճ_n-ȑ·-z[gXoꎘ,4Μ1@EW/ax@aZuB܆ud#! 4@׿3.K@J@^#HҴ r^.R]b(glOE"Ԋ"S&b۫ eusxh +vI{/Be,ʐ ǵ 1is:![SVЖ +VU{\<ۘG t(!|ڭ62{R~4ŋ?]qҸ9s +YBs%Y),Pΐ#M;Ezљ?_`1}s5˦tc :ؚMdOs)Ψ]}7*ꊙȅ[B03%:ǯ;ʉKP@ +}|dGNP3"]MQq[R +pFiRe=e@ǜHpTbI bh۰ၸ9rCZ,IĎqϫ ?EY@C1?{Og3FtH?eC*0*'Ű:oA +VvT]? `E_h!7D`] f{] fb;;cĤ|Q$r&% ̕͏mnyPX]Pc7#UR m070!q)杢o`dŖՐ9hqtbiEG9.za^ dd}nE!- @"grXR0FJf" )©W7>%dP#A85hYw)m/cVZI<*4Zǒz[NL\];'d]\CIy&pBpŊ9׋JOacVu~šХEq2Japi 8-7/" E{Y`ϵ!BXG_ftSBG[v8]IH)*IŊ + ;?z3@@!Z,`UzɊR jȻ_3kq+1pRJ/^hNh=a3:@᲋RyCB*kYx`Yg2}5ʗ +Nã*Ħ<&>x؇Рc[{k,6ZT$}Dc= Lǥ{(LG z{hsDmN\u`U-6R{F}_˪'t#qn~\̪NMOM4gW}0_#Gc/SXr %O@ccS05%WTU'\AqDh(%-q Im_cc<},:~eƬj M;`>Z_ +@<9<\NHyYH㰆MJɚ$1Q*9P>#z`0K7#Gƶ|%= i}q$Iug]I ǩt&4_c""Rnӽ՝9VEؓJbaFq`s=Dq`kX$'! GLY 4!Dj_m18aD?~#d}= X?m +Jڧ*7z6<1["DJG9/'V̇gb.軛G /zzJ,/%@?'>7Ff=3t D)zJNlƧPY[,c&3aHn uT'JmVZ#),fTZZ[MjҲ&=!/s%L#H$CjؾtF,P'"J$;٤@]kdyl. *))rܨTNDۛ%j].I>чwJIb- +=^?)Uf-)4c{'E]O;61vЙR_a-1q8T(LZ 9V +uwKOڛ,=iy@, }$qsxCT4sZ: seV=HB-OEkNp%`GxH S',e5 +~@J2fݶтMS2*$W +s%v&dHմ+ذ=PX_Rcz*L +هiSDuy]Nd`)[Gn$R +ٍ N!SE{%垓`H02/B)Z  vE_.oE@p6X r77=5 U,,\l<+kJdź{h!g^P//xGh#{ګ6ZrTG %Fj2Ȇ|Q]{ŀZ0gXX`ݡ,qO|/*Ro{{:/& >¹OMtQFmՐl\LnipEӆ0SZ<W9`c +1oG#mzP,Fvz/6UHK,g2Ƚ̈́av?Q4`]C%.ֺ"LB6GZL'$:p,#{+ubtNmr4_' 7~LܷB:-dw;}X@,žL@#ƶͿ?J-_pQ9&P[q/ NQVp 7 9P㰮q"t!j(0iÒ5P*LՍQmWBfTj⤥}:_'˜&l=OQri +cW.$QrmQG~vhI$-hfߙKrߎ&F_T@``xW-pJF:UΥɢI-n-ʽ/IGPHطeOc91HhY>ψF8>l''7^c-MI*A*PsjJ /BG˜6z;r&rJ@[3*6oj/6(7NTx'Z1aǡ"G1c@>qW  X'hXݳzVvo~lD bÔ0=rK +u# GOH;[#gy:1lpZl?,\$-=w&Nل?h5JxVt&3Z~aHQ#6]=zV4/%zhD(KS.1 N#al]|bFyj<' b~cx6.7d*H>H":R|爰:b8lZ{dP~u=%5,SqoA<;0āXWFm#jZkp6nő>#9x%/ _4+=MMMJÿm?݆);ȨV{qdOuxytZ3;"U6",W) +puuc1 8>*msZG5:<sY׃]'D1 {Ḧ7H lag |\% )FJW(\P }#G&)Dd"1J 7ϥu`|xn6vlW$MԴcimFѢ`RnKks" Khk04 0ED=ˣ'%Cݞr0i{/$UǡPq^*~̖klS!hvLOdZoŽHWfפ\zdQk>T1*)utb{fVi{ kM.,i!#+~hX\τc#xTk>.Бa?n~ +NiY.&*H6@p4ev,3gFRs-!H.RqD+#!, 򊃓PQ-W:qf'Ypp*7.Aǭ70 V^U(# HMIBjqҟI'ՆDŽJ$*+eq(S#[ɏtQq4Kq]~ĒDq{m LU3s}I9,P|Bիď3; V2}q֒" / ߾ϮqV$F硢r\VZ͹趵/0e9Vold67=dA$ZDDaiZy1ϕVH1o7ҏ+?BNNm?}`'U|YW46k`\e4Pخ|nFpQ; S|w#wމn3-~h!pL67}'=B +pذ:ew˅Ek4B*n@Z'9,SkׄY.j*)pJ\qrlPPH^Gx̋FUsSpz3K9IJԋqc +@q; !_ f7u'`=7.x>JY ρ^TBT\wH泓F6f*.܃R\CDI'In),ee3&~cRMDl3.UJoHygN6Es5# tgb1؛G#@pCJ-flok6V2n>DR -Zr{PsX[~_(w<Ӭ\h^[D +MwnmY93ڠ:<2.YAugV9ӣyKܮ5ՇMÝ%TE .yq<2z2h[(SAuNF*ˠt,=NN ;)pdD0Us F?64i-)PymN6hH;aGvmדKrLqdA+fWw1 fAyp/s%?S'+fPF`D;r + [nvA0AsmYlt705NJg/YZ̓7fZh8Hퟓu󂺖7巓pF m9IADu +;| +_]<%X=͛q,JY+/62꯹mC;!$6%%}*k ;#GlYы7 kƕMC'#(5kRґ\ޓ/~=& ؐK_>56 rC@M6hZ9Q ssQ\*]p1U-xQ-5nDBŘQ Oi(2 +~(eP%H} Gw՚ ?˻yô1¶׹m$ y2hbv&s ~:=.ƮM~0ݜ-~=t={*Dda#:@b7%{$!|PXsr (>n!KVa3v}# .PPѼN e|د߷&*ި ^H +1kp~4x>g^%NX !c Hbʬzx#=V S<tEeBphrgl:w݂`ƃo+h͟8¢{$j 5zkMǖt5'uc|jhJA/A|{Sqr鑰\ }PR8?%4rpg9U% u} f2X"'s5t:L1_.7A{Ӿ^-J<>C$M='K5!KFnu(͋>J&x$)QutbkcY9 /]p5Qa|M`8-rO;느{thvy&CGcu$ "(GKK\lV>q .Sl߁6ܑ"kڋb]hmA|ȐZR#08og[i~"m'~+ۖry;;aMPUQZ_jL&ū"nHIRHe!ٗPYQkD8[vı%;}(Mw3`*p ŀRo~;+1'cYzLbgh.IC }y^D֖rFfYj[xN0}%|4xB +*Pg|&K훻&a) e*iқ)x{_,+lyG94a 00aӚq_9 +؁'3l#Dj⣝ (I f^WJBJW,9EOox/iovt;E@!B_ +^Qlx~| ;rA|/' :{N+(-i{<8;{edQQ/F*`]:g9x}?e[6+QQ9MjvQU4xwx:Ihث Rd/npvsPHCL(^>~ !FY`z1.dHz7o5w)QBh'XW 腄Y+-%}{pN2v8.$pA NJ(FU7&KR:tx?5Pg lraq=yŠW_Ҋ^lۉvax.]"o1Lc 6sv@B8ZS⭞Bv}WsvNQRvnuk1:-`Ya˝ol endstream endobj 2933 0 obj <> endobj 2934 0 obj <> endobj 2935 0 obj <> endobj 2936 0 obj <> endobj 2937 0 obj <> endobj 2927 0 obj <>stream +HWn}W̛׀EbX#ʑ@􈲘q^}E6ȋVX]uS;⦮ p ]#ѿ^/N?dA˛#RQ׋ja WJpenr_{pa/JH{cy}˛nn6>M(!'|!jタ|V:ƧƸ*CD~V Xw||޷_O6 g C4.mb\ՋZWD/$.x4GT)1TE[~|}y16 C8-啋|ajCa-Їڹ#5GT\/P_e‘6+&jcJTp%䈔c!>>uG*dr?t=D!⋚:_9֋cZQ"ݡu{s$aV9Bmiyh4u{Ϙ W1&>OU\d adEHǨ炇kcNhQ (!&HeAp|AlA/ϻmvzp$u!bM "#v7H|B\=E<<$6f^ouP?n}1C~lpG4a3ckӭ+Èj v]~g,V> +3Ťujo7|RU:ً5awZ +'#0^ fI(un& O2 nۡEZx*Kݵw/P&лHap{ls 0 q(o#3lF:Gz}j^ CgStւWܝ?"suKV~gUA.oyY!F46TIߵM@"BJ94هFcM1ЉJ91!W˶O87777(<mf-kcFjeo6)9]hW:ɤ_[3o1mkJ4Pf5?zZZ`]5=fO`8Q yU$hnGOEX, )]Dɟ nK(TٴД-~˼nr0aOK?(֬0 +_0X _}\[0E0%ˁݡ`e^w}!dw0׵q{Ctu`,zLYEeI!O{҅cabywҨ0E(Np&=ncHDmO+PDQ 0ظ2/<.*mD~+Ϋm{Yvڙ:ɭZmMdCJu w%(E-(GiI~Vn}-󁙁SH]IwӰfV&Mԓw~q V0aֺn2 6RFe EF<N&qU.b9'`ؔ2 +l_㲻6vȂ:)`y &˂77,cqcHyIp~9Ŏm3 +S/%&h k\XC8LkHm6"n[:wE^ seh`CUCǪǕH8i!%ӿ|Ӎ6Z/83GOqw)]/t9jW"Hئ,L@R>Ϭeo $ /:^78nDluQ"z [0gY3̶,#Ox=1S:A^X3>߁~?M=7M bhFˣ`M9[ .yMYҐxQh/Vl`:H0(f%FHN-Y)DZ:מKxgϻe#=dY9ƫTܒZ08V- Oᵡ ^O?x"?%Dd0Y\?H<(kIW"; O.oQ[~ ̔ :P +^Ѷ; zFD@:0\ +w[4}`'.'؊3W+ _;CB1$yb+pW6߻Yj4 tZˆt&1?||yKzq:V~$|8J[ȴM7,m/ endstream endobj 2931 0 obj <>stream +0 H@&o Hy#LKfFQ&w7_ +~SQ^voͭOW͉q2x 9[x`)]Ļ[=މKÙ|#h9f^eÍE;& t+,{neVR @ͩRW%j-I1͂/s/.r h0 >y()=MM^qK;K3?h"!=%o~|h> |ektވ'j0>Yഔq,eNK7/~)kG +IiDqbR{9Rigz +l +TT# ;muGR}ݠ]Nsѽvp1{Jh#nJ#bWo@-3m;k>QD'uAJҖ6XJ̧KL2mځhrāZ9pt.%d +9 uNґ:X3:xNo ݍ$>A3D2`K71RًC~DJ\ :bx| $3s YSxԓ.-,Usaz< ؽ+^b쏪m(XhRFE9AZh2t$6D>U'AM`rzItyF} tsQ7nT(ŴDZho?XpO~pYm3i9Pk= +9>L2NqY@s9/}hRa- ZhoeL84O +OhAŋE$ # "3eiW`%NCaE9Ž +Z]XD& 0 + (% ~(#RBW2bb[fm2 U2"*gZ.="-Y_''WWA1]rH> )([uO^EzGPeT30.U?4WͰS#n͚DG2t/kyt]*pbLNꙊ~giT p?J M:?@;Vx^9/7zw/}w阞 0)w-Nlv–B4XEQ5IzIuX@}\RD!q-E>WC-HQR`PTʀtB[iLoUb*NFE:C4]QQoS1H4G ;*4e<_Ȯ;:l򷛀χ3VR̮NCަH%si課τ&ig]3b`hRtWH ҧiAZe?:u[ov00+ܝ4uN(q V!K[3E-PTmڊ29oY@.R|{ xN9>Pl +ӉG?*fxZBR蛬sKGA}XѯPx}<5Cv<$`fӥH5_nOKzфMON"gu9dTXC9W6(y&Y8XgdO9?؛ړdα$H@YI󎉒YKWYNܥ}nPH%^I~@XĮ Tnh٠Ca.32Z lILO"͟*_>_ǂ*CFݪd1N#|.H Kʉq~hb~ F*R0O`ا +ױ w_,V?z{Mzp\Pfxo|.OqoF9zuÑǝHAK%Q|TWRM`¿ǐځ\ɶ]aj٫gw Wx .8u)x/ BZꃪ=5(s/V 8ܑBЕ72ӸΥ@3UI^:).̾gt, +eV9^#(Hue8 ngynH|Ƥd|6<хSͲ`.!%x$S&ERW$A62UXHEPz!O^hA݀FA86-[.5ftp脝 +TUL-3VGCUA jTJ._V*fj{ہGF"GF<T $pͤTV 错o^ɚdο i*c;TT~Zj͓(r#e([ &N+ѭx0(\w c]v3H58E|,RJ+N;[0 +(3%mț A̞ɵp& +j.Fg*;cLjj{~4Z xoWĺ;C,a .?k1Hc!޵3ƃT_Z=Q:Ve\/524}?wlKqKɬIR L}ӎOċ> +h2+!̑lp&t1"Ffi g 81ب+sUׂ RY WHKGGw A$x'W +H'ZM14gCBũ.EdGO +LDr$Ho1+vz1 ːZ%x$6kv"3alK-H=fp%I}n۸-&L1˲)FbD[Qr Myv1 C.gpE* 6$n-2`ftWq6ȩ64 pͥyuPKd<F+SuRE \'(ܘObh) +iͶ-J oy]WZ^$KT8 yV^ DrL7>݂>;|ByOވMwR2=@ `y'nll_K{P?GPŬE/iI2Ĵ?4NWFFfɛڒC^y w9#J'rb 꺓vG+d == +7a".ۻ|V[-Leqc*0(\bi=s܍/n;Ï5}9S\jR`K'E\B6Qv˜L8cI+)xSz˻T dF*4^ư5;q,@@Df='|}S40ilygD +x)7Yt˨./ob5~Ic!d㦹r:.~>7R)ߵB PwzWc8|@\ Hӈqk+-%OUjZ=c~l80Opl"2 "}Jw 7W3Ϛ a}c[Vb4(KMB/#KCRA5[@ZZm6$2 +|P ۢ rx =.Oe:^fbAt**~01V:\P=qɩPS# ][V=RR%2&Fu&@^g9,Oߊb HqYo\BC2iIŲcP{Za db1 òG'%tMpZO /~g~ 7#{txy(zA~5݂O&!^ob[w\x-$B_hvQ˹OQ.zy09?'k 7FnR8.צTpi z9"ۤjzaQ G$H +Sv+.>iUpt;f>wy_ӧT@AZ-bXtsuW Zg3吺馺1MZilΨMn~ASDb4F+F>H͙2!F_l "I\Oڳ Ge0Gxܻdb +f)ÇH}T)w.G|@!Uw/[Atu(ȡ4(?D͞'{"RǓ_"Do6N +f 7W٥]*Uh~?zwO7K0Ӛ"KWl@v 4V/aԺ6FU5TgT{AӉ7A1mKa1YH+ric.J2fH3DPa#_}0LNܟ2(%ᚾn#NR<]Nfʪ%$ NoOXX~? ﱻ 'dRqN{c^oqsfzQ+< u  +TnĦk9ؕ3?Py?hQ^"w;/$vR/WPQXR~;ݽ51]Y /i饜C1*2AhL[SĀ~]v_9eX*aaI ^QY b(_2Yd<.ܜٱ6* L/;?!@:-$6@e}0zZq 6{gdU7?CSu>[?hX2G~3GnψCAt95*@/4iȫVISk+jvX X l0to0:e"$3,\GNƘ s^%ƜN7F>6Y;cցm3xý(b{_D}tsZhkl\4W@dG~p4yGȚi]S2ZNaA\I'pǟ $Q8g`T-#"ji TET(sžuyxYP붿pX>#]) s[1n@1HIQ. GR :-b&Y&SgTljh"btſW+sŤPՎÎҾiI"/&bTD)=Tz@-YO| n[_ޙ +/j4up: +|(z&(+؄ $Lp#AT:RҐQ~mGG~M#)f ֲ۾= ˺BpZ9[D/ +60{"=8?yyюZo#[e"lQS%] K-]HXϣM)P玗~z^c[m%HG-9 ( /J`{Ƅ+De6Y͘LG#*h?`aΓF1%Ko-L D5lE Pn!EU5O 7l_2k)>4e?A%K :$OR_L*#&pxF9rN'huX_,;1ə}KFEKEÄ҆g{o]*k̥|XnH+FjmW~ +ޜ<.bbq6k/oוtb|!Z^A| էjp=\CP$)C&S{f %".Fn&aO[W1o`|~b˜X +i&.!8x87>E8\ TC Fo3{e!TB!IRpǫ<6@̷TȗVPe7XyRFAuH+quM?鄳VUo +!ל$6=\׸Y*2D KoU4WZVQSEt@~{[(&ڨ]A%0kUf:iMt/WoQj5´=^`͆ dŕ[3rdA#,ȧ͡ slJtdN5$4zhŴrX"e1W(Bcڃޱ0J3K:~WqO1 ,1-m >K5QXE$E1agiVqi{DLy״XU]_=`ds'\ v靹vJI</ 9X|o /0!DFsVEѱX*{tS [P:;)'رB@8jUiJ(/$ryLJf7Z*8Mz]V$$xl)q5"[xȿ< Ǣzkbō1x \OL6]_)NERjWds̰4=[rBl+hRGfav⠷#Ԡ'ؘ::Uoho^P6wDO;D#(v-2eWXJ +`I]`uZ)$/*dt@6g͋'QP PRl5*O`^~6-}I5Ů +ph Uwul0RbWѓw?$J_ߥcf3]{)ȣ;z+^˲[JĬ]%+&UQ1k" +Bq[old!OCfl)I&QŏߩV&MMAiIKBƬ;>x0v /)ֈ)dPq^[k@k6Q%ElV)9@4Yhv\YH^b%3Y<հW:qg{9?Pkڭ8F"TK^-W2(!Ï{:] zj%k|(NG["=I:=\pҁڢQy7TH߀]EY܄ gw{3ޑRP=]>'/f™?4i$n^kHĝ1̨o$.f44@(cij Z UIӼ_VpN?K1m҄$:xs֚l{bEi< ~|M>\.de)K$'Z̀Ř|'/..u3vң?g%VEg -I^@PoI,cyK.Ӓ\ٓ47; 5\K%F# `"&Vj)'ʉS1JBomEn;6.oI92K#m2Y) ,5'k7MgPAd~t=w Э0nЪEʔdŠ6|q-Z%ÉuXV{o2L3/ept$JFb \MMmĞ\0Ӥ˶^D(17}?ZopBmBe|&~4Z䐀@my>ŴcE;eӎjɢ'}چ0ji`BO  lueNZJvً55@Ah(s>iR~j]J_?nX""30YrJRcvKۼY事yƥ0s#(XHXM{B w5E02LUikBKjo,XTKs"9'j`DIOO^4rBmH`m1Sz75lwl@?>`;$Q iO"cXS`Y7ճgiUmFm%IUݛ +!JAYx[>DNp!/)Bb{bT{̊C%pMf%>JPC#F+>NN%!OuuIƸGlF v0xt :Lٞ50 ֯QƊ^C(=;o:CqipdI?TǎUEǗvxT3DJt%"Qׅ6ˢh|*F%ds3wF<>k7*>)ރ7s@'?t!ZZYK} `"lf"VH ,V&J9WŰh'@/=x `#˔be@Mඛ>7;sG}݀&S9־FRQS>g}n +v1ѧܚWDS<:`UTOJОlC\pe8Z@`\P._{J`tU`F>l(#zu"{ZXM<`W*NaΫhiBv V+$9ߩ,xDr@Y\~AJL/5:SIIFx ǫF%:iHt/IȰ@!8>)tO0Qs^鞈Ip+XX1\o†xԪήkesNVR\@sx=z_T>sm;tax"v>ⰪĶsbf{f~57Wh{.!z;M<Ǜ6\[pٝ MAD^ovjXH观.W5x{LoNkZAfשּׁɀmErjNc]d4þSDަz{/_)OS9S0ǘ jӿBK76ȋp&oZq1[JOiKL6^`@J6:iscMrH ]Gwu7M`<ϓkaMqD3R DNt,T#,.T Lff$Yh;214w]^EIRSF&f?Dֲ̜ 2]D;9b$PlFłYXx_ zoKpuֽ(P#e/8'xJ(r#71叾JqI:񗊼X"]WǨyckK'.Hh/ts?M0t_5E<~B`ratα`9͢_^R8D! + mpFn!Y 6ÿKiSU肠udHMOΑ, +4;h.%_hD:V/h#ja_."A]JS&De&R i>\Yӓ9T k^@>;0Gs;{ض8XAn +>uÁf)8ȥmƗ~ +EVڨjKB#n lz19&4ɝv*q9Fy[o'Ou<12q{uYEjFώ1CIhE7ĊnJ'j4_rV)5QTYAyg}7#|ǂ,8GMa+Xi5NV +DP6epa촉u\}!y-((: m3 +ye郓S-]7XDÚX5 SahÀSCVVǧa fmG"]Qļn;cF2>&U:$_[+΢>3oQ!<̃OG|;?/ymm80}9s(W 5Y 'kpFP*Y*ꭖieX R!čEE bx3xݤx Cbꎦ׹ !y@eod[PfM'(Ѭ`UZeG]=\z@c~.~:ʜTA|3y(Q$EYdB;(8ǏO!ZbN|B<X ë.'mo|4Y/pBbC]͜|F&&ܤ劗C+cM˴mmuP5ajQXtl +aM/2| 6}!lFā"Dd&"S-D4Wf(}6]- &YЏ)$R&+d4l0b*G m2eğNtJq;ϦV}JI. %*RJ." <5yhYB+ MjR| BCO*OP?1gNUSRXR/MFt3iޙX!ex_2"R28=čA @IOyT^ |ߥ?COO%DJ!/77tz $ m}:̀I:{ӥOwmh:7/q#bdDOc /v|dA}TS'ɓȠcTzUPqaM+2xE,(fi+p"I@~du*[Pt(䍢8*,bjvv\VGK%>1) kX0% "A>#)֏ZJyo8Phy:|eˋ}GY Gv ;/K-9<[Y|`%B8*6RHa'DHEE@k~m*A +( P +vNT׍҆[jg;Ht "?B /4p)|f\vKO&n^+gT+> p?AhQ>S0$_D(P\kZX2-l09Jr.8?$3n )yQq@)zVtTD16 .aL%n[(w8|uvGy'߹]x0,ȵ`Ko(XW>k^{.YwNOn 'i15)U*P2M%znz :\gl;$ZRyk`= f$)߮e?j/i+q#so'/1 Cc[[B=#䂹3n R7:cJ*e`NJ +q@} 4"b>n#}RP Y@fi d!4CD)+>'\G WX|ŕ$cx/H\aCzCD2'(uڒ0i/}ƯxO>e5w8$\K|8tزk8މ1u)sz|05ؗm4ӵh5k,+r-R<%X4љpujl Szv'/}hkCASC->2t~TV5_EY:Y +y9rp;(JٳRTHBn||w(a%t޹GUG 5%v&bKzb]vk0EMԇ=ۡ]T`Ɖ-8qMxIvΩlp뱏`c./-С)%5AN28\ ]a?Wh*TPKEB/iiv8!ܦ4+b?{o X*8Ls2X̕ j++SufQ(`' +J?>S.#q}>(ۚd rrDblj6(SyGy?z2}L?['A6mIBT3 , )1n}6h@M,3'[5"'OJP+Ƣm}3NޞV)i7'jGq'Ē_쇤 ^2=})3l%Za2RKTJ,iy#O},dG585= _,:0vè9;"ʩ'$GH^TY߯{M;0-y(X$etˡY-4Ո}" ]iIX0)>x;SMc7'g)݊tsobUTX>g*nl%h_~622:lgu MGWu#r,"[H3IUUSfşad2g/yc"Pp.z6_x3رۺd  oo WyNH{i{i"hcijϳL`ѵo|jƯIlc +E>iUFpYxOBhWrhH~o^:#d73\0y5|kY~!l\0k'tVIk/ߪƽ.h'?&sj,|@G*h0fKh Mh(g`uSWi8!@ ė[8V0'~4Ĩs\]Spפ[^iPX(!5ưN!\ˀi˝{H7pᙘ$oe>U|^Yo k@F=r +pcNA}Jw!g1/{b:Bă(Ҵ[Q#/1L-1Z?E-/D—\NΏ~Ъ?v;չjİ5U5fS,)=,Z=Lrc g\'`4?RB2 t:lxTԁFXom+oyT& +7/[&]8{A?f .4u;ۦ}SqpϞ;tߓ/ẨkW̗|ه9[q"ٮ0hZƝzh>9^~lHCeGlaʵٺ u p+Yk|c~/%R/9%%b`"u%*(@:we0ɨaHÉ;O2깯i27S7Js$>t )UgTLj0K%Zsvv +t!U.kO\HfGZ0ۯN#;xCK6pF0GRk>ue v\iwtq@<.Pms?M{qoFc3fy$#r&AvI ] +F(1|/4ReItbyw:"@$h>G> !2qSΧHnfG0:]=q4'o:NLvƴm[<{R+|zšPvtEc *]JNmCRC1 +Tën#}3$Ґ_Q5Zu->/6>ZGoHI31u@]YƣUojH5FQ<' y8֎Y%90.,'\*3nrm|5+L?v4`X39⟛|Bzs*Nr{tox&LpGU1)r&O`u.a5:,v\jJ w!Zl: +%lDJ +vKqЭ;̯'ꊷUOԖeoBV_K"(6$Y-vp؟ m6>,p`5fR~v-QOm"eW&Y5,;pVc*KU#Fu|* cD e H6)QVhBZ1y +Uoku"}V>95r'ƽDMGvpb+#Bk1wo![osB]`> +xJuP\GY}4~ "s0(/tZ Jhp_#Րw13[ Sʊ^bSyg*UŽ> ~7au_'Y\!pY8N}v0࡚$.:l~wa +{M"OA\M@RzbW+ ?d78MGZ;Ol2Orn:Ő1?uJ. BV[Kcm\#!iT?8%~,!D΃#1Rp(zs؄+R;mQ=R\P⢲F18__,f +e5].͟KhYN]%;4TrVL.Kk&ϩ v:5.,Y50w^w E5%H?)M++=RhC:Ypg8Tz1gHc3%a]6-jqBVi^Y?5I- Yϫ&@5c+٢S/@8 g;PK_tb[ƥ +PfW"KSslf+2K·ڷ~ɚ;At+Lj^A?c#(G1lƏ.Z#v>mRDg@wѯk/,~MK\lWޖtDCG&ܠ!OvBuv[VLEY?3ޕ-^;˨%ߌEZ~Sr76$܁ɍ%IlrsԨpW`iB/lʹ슻?y-㮟TWI[tgS\cKEAB(SUI7@[T!.|NZ\! =܏[9Z_fDU@-p@\z伤=dghS&wOo`䨘oBߌI/u7;GQ?!VLgJL\5۬*@5'[gw \~]%"';pSפAAUm:~:M1Z=Sa_X2 +WB0-cz -$iQ0Z/_,G%\Qi}%±З1;D1'$}(ƙ0Rno +Q$;KD*i5z]?~0"ZU$zuMxU\~OHAnABc+kg8Qqk03WHy޽:W0!: +~,ھB? +B#Ye '3/p:á_AtV\;rOQ;@.^3vtKп7CҴ}=o zK;@KהIЊYMpmhnVZE6GoavmrHzO[6o14F迺5:jLDߣZ>rbҢ2P$Y L- UP +L7:-5&=l +^s{yOf_Yvɂ'{Gd k]fiiЇ{ƛBBd\}?7w8pmd}1oGPiDAOS+S!u04cȒrA2s"M$f>V+%ZDcR`owJ +A]P< NOX(Cf1rU< DwYh\N\_)qi  [P2e4n/by$!#{)R3\97+ i0ceu+4Lv ߥ-K=jcjFɐ5uXlqx0ZlOi6V~P^%\7 \Hi\,fx9h\ R0I[f2!V ~djˡ2g~tG9/ GQ5Z^&oלc\vх=7M kAI^VUTU놈ff+Y]rS5%.l$72G"p^0:Ө_wˬ㦒=|j؁h*kuqg,EUtƫ2. + q̓%*߈]Cv_A?LIqSctRYb?Q'佼zQY +x E 4F o =[ۘ^ӡ5DV:$s@NSKFWF<~p8c[Sz ?nj\ wFwz|#_t9K ͼEp4ቤW“gf |DF| 2)RiʄQ)N7U:hP`|IͣC:s]I\yK6*,HFU,↳ǜb5b76%)090 PlCj.-ԃeHn6axOD9RahdVz6?1邏]ro8̕xF 0hoAyZ!zΗ1pu\-Up_xkQ,=t5,ji:KZb ;[+V”0yB͌P_Vf +_4eRD_oJlaAka`w' D,b >PCA¹ )()Յ`mcɻ)H#bYI-ۼdy-fF}Da ~ED1 )\A" hM8 eZ]&ځ*Q!KlIK^j)ֺ_ɲ#Q78V"f!p=98tt+ԕX8TWv8=g2&#av-d. $YG1 MiMo-  җMn8:Jz75A|ѷpQ"8[|8 ma!svT4!42h? 5/J_м[q9<9aFx(Z~c΁c9ҙid:ԗxS"Al+݄3-C*v` f/"R[Teזӱt gjD!yde6|ipv3F9R1:)(4Xc,^KHmA]"Qj]Z!#0o}9*vr[|"YTyln*iSdܛSfR" :397c4 +.?ӣ)!vq a9ܙ +vչ+P^ PL4/%#9 s^-=î݂%Seoj0z5PgX]/QΥ{89r̄D>ʩM$%pҶmf!7DA~}Ki E>^]C恣]B3miFR;S9nϠҹ.M!Ku真 N'o5,4?L+amU<D҆|'㐹{*K9J~iy~rT/%V,X>>.q4KV yc'Ts3~=,LqDp%X8sU:wu +$:=9sy~2Djw0t2 +ˤL6pI XC5Z<7i9V=r)z |FAAY( aBAUSȃUQ19`rR/4%2pN<< *wx\Kаʿ@22v1!ERmz㈅t2wxޢ[[WHPjs+Z4#65a¹VS42. vn!`F:(XH_ ٍ_zkI]0.o5@?w8ωdXC qcu^TCP!ڗg:>f$eӨiLRUoDD ΄Ͽx4>K,H{B/GhnC'&y@?8!LKL'Ԡ7ZjMKs"EW)􉫓/ kV Hx/̌Clf5GF&יYژߠES0.ЍdE?τ=\$ 6K 緦 lǙ}M"] +[Z3᠎T/ +ʶ[RvKPa,hBƏd;*okA.J\ٻFJ+Tdf#m51Js;#sRpe5K[6[ !H1~2aW!\AnU{Kh`%DAcvHfAՠ:BUy@GR |lJmvꛐ(+ZG`̔bfUQLdFn8"}F0^]ȍS`ugrxRX~zj8?-G?lKjN@Vd3`L*w<,\8ڱ5l\;.X pf'2;}9jpC}a ,ڭiF׮_o)t;I4 }&Қ#`Ύn"uihZ[S<)H#7a_Cr8RO_*+*4RPCzdd[j${Аt3 Ę\V{غ{InnC;mtВ1__ݕ-w´X1+o>(>ςh/X:3<%uZ7|⮳axdNO2M2;A=ũݛ u]CT/ځ\16wcq“Mp :9c{j;mc^L蠇_p5"th|[ԯK'ќ: i_,GVpbDz (UzEh7vg򾛲HU"#H;.R1*mX,s ݸgGVPj6%D85%gBU0FE|i[LD]>] _ߏ-?9 +;a@YYQ)Q[ͬzAzDZ<T@ٷYe*pѓJ9W\J+cM6*VdSHS^hҖR=z"`Ԅ,%zlPPOqjjWcQ c*[""o v4{o%Y>\dbp TZN'WC?lF(wWc+WHqX~v89:9}{4ͼԑYJÄ-y)xqG`4{S_e|cSsaMcl87iJFVOLm\o&GWJܤAs}Pr3^m]dR>z4A&>xA#'ٳZ?J@sUc58V\iHN{jEQl8yY~[<]qBZr~pŵ*o$|3jd` V9OCJ- qTr*OpDÚaD*. +@#&4{+H&WlV5]| LUCUZq#9x&ھf=YT^ +쯾5&YSj w>e  )( %vl5<xߺŰo(ϝx,"rU +Û#%RÖ~JcF@|`iɵN;^n*PH Yu{I /2_s?F!zEqx钶wمk=APVʞe:W4h ]*Onjgڢ>ƅAT'G3 .`ڼDT J Үڵnr 0bxKyMJԑ!Y()Lu5P+e1.˽P{- irM|Sa㜓G.= +:ex6UfLz3*z&L$`U_2dP΁7T aO69Q:L!{'[YlT,Rv4]^^ kژZL>|7q|qtYIht p}u dSMeٝr6@bFDUeg=f=[=5~E-WI ! }# + &'_ࢃ&ZFXgݏu=#j$5á[*ll5B{wd`f 7GCs;ڡ1e 퐧(0^is% *o!Ӝz[Ǯhx@lɁ{ Rۍ&G-ЫQjU|`;9UEmQ@q, Vqͮ"FSkE~gKYCe DndόopAQ2Hކ@V6`0!L30WYC<³9<\)T.  )"+ 'z$rf 寸km ൸nJ)~ +gWBJ*î.ĞtF숫Vx8푳ȦWjRUl(j7}D-A P6gȏ'rLQWv3i@K@vK$ 05v FŨ٦o-bLc2$cC"'T8Y̩3S,|N;iMF>g(~d:ٴ|UK^`IT nB 9_/CKS?+A)e#0`kVyNE3hU"yɃjC /⼎B>Njk|VkiC+GJǴ=W7njs oZpP>V8y$œ xAd.\f,|HVCm#쪾l͂s b,KZmՃ Ͼh_.XFQ[ ֶ4ԫ^p?,갺2q6 +ܵɜH4dHa_]V6qp\:hg LD؞a 9~(b*nBL^p:tL3V΃QJdݩ`G;en6%eZ^X8tCy8 cGrȒ EǨF\T+;z[`%F +YY8 #Иz;E +$ + cß|t+I?hzj$x`k?5kR>`6а Pΐm_W?{c +;TeȔb0%r%c@ %bE+љʺDt Bvh[]N9 +b>J(9chTbBvw͢zU}D9apk=TlⱬKEinǟIJHb$ny=Eo')z3&5O: GآȚ0/dp'{W gU=DܕW",WUļ KS/ooEA,@d'%(%DC6E +RdٯCe ++ΎRPK +vZt]/YII̖",ުqppnC9ܠ#͎Tȸ lLUlUcgpNJbZ0'=6aIpԾ0t=YDwU7\ < 5۲ۋ~R51""hu9rʯ87<^ֆ+N=ȹٳ^HUp`ZN7B[Q}@~yѝ{zu_~>xGvIb:Xj }$*HqCaAShcˤh)>qўÇL{bO2j^]Sέ!pK$q`H7cO>I0$Ȏ"A'7!^#* yў0ڏWzuP(6ٴl!zg7v``wFO ;be@\y'gB_8WIVڐ}۟\A\Wݾ6ڼzTrNSB7щ$s/5˾Ηe *@ċH*Ԇ<.\-)VLl?J3W)j8OQR-K"SH& Ѕ',C<Xy/۩> endobj 2929 0 obj <> endobj 2930 0 obj <> endobj 2922 0 obj <>stream +HWko_ۭ:q رpfQP0RbA-er({% Թwǹg>-LBJďWR8vo/e~niA_dU7jRX\->U;ғ[~%\[|KO/7p"]LD֬s q!;-<H\RZS}m l,8C< 1ww%qQBpöa 9>õs?vXImՁF8"7!n`)ݴm}*G%OiU+E*!WUE]GHclgb-#(y%mt"(f;c:bႰm}<7tF]OgU?M(9nנOn,-KEdM.9Gn0VyLBlL4#m=Ҋ$U(CU+[lS).3mz5#D3KHDwomo 8GpG6z>2lwLNA;AT/# )H&W?ߍEDϻ̰;7❢<or@o6F,CeҵK5xC&&R%2!-el'm=g`"_&2@L|3PG7ӄdWp.lx|o_ ޼y꜠Q:]巰O^5OBUfxc]&l.DCdMA"hQq nnۻ}0p5GsM ye ߃]-tE(v{iضOaXeϠI{W7CI`}P_P 4mؔTX15v*_4rmQkTb:4g]Gc MU8)Q!,SeSrioyͱNəSe )x@R?(e K "PC"W`LN $͙a@곧 i#+J{HMMkA󅌱V؄vmڭH qUAfi$xMzqoξ1f|(2QKz.1-2q%sV.ez!ѠpB5oe.B16ČTee|=ޟ:3 e,CNo$l*6ZqK3B aU\DfgmA֒ohxֹ"=$_79p=8t^<$ㄣ-|z0vaĀM~>stream +0 @@&6 @o-(?ȉQ!7҈_#kkA(֍LA)i\J&MO4gSs>(NGF`||4<|f8NV$`#>a| D[~wOF7CL0(w>7>;U@Tcv/[dVZ3$,o|u,]B wrzm0couW*ӗP +,h2\>eK6=dZDiF{ѐ5} +Szi4Tp btk/}`#g46hG~&-1 Ek̦J p~4 Z +-xH t0obh |.f4e+/VɛꗐzMea#81M"4]!?vIܸM<'`-ZHWU () 84OfKl@Tځ*(#'=WRjd1w[`Jiޯb)xw2y&P c|`qc @(-Ю-B{X)S?à;"A5>t^ Dŋ~tZq-mJM5@"$"He]CĀ^ݍ[Ї͘3=h}&uK\;ЫQ]ෞLg%a'g?y-LOҰf@Cp'gjX,@g'A)6ax?M0VcЬmџ!x> A#\9vKm 3QwWqDd/@&dgK1o7׵Mnx "&RͮZ2iUzbdSHNMsjֹ7Zz ǖbufkVWZH3nCh)~e 蠛-[ڠ\.) kF\Hkv(&g6#'bKe-(ZroM +\3Hnr-xïp|Yfk{4}5Wr@\֧g+̫ +l1sӯ r8Zu|^ڙ$L3wHs":0GtN3VɆ7=`RhƖvd۬^1"yȹ,bV0{7i[qbMN"B&uxş>ES1u;F,-)DӫA핫A`7R7AlJ5b̨,fŇiPolšɴes[CnKPw*Ϸ!q`=7)&h 6[׮k#}8#9Ĵ 52AZmnS%`9axP 7Y wA/1˥\#cKvqܳ6ʕTFض;~&F@ <GWy!4&K'4yҶbQw#ZU@(uwTia;q8Ș#m[`n9z&QA- +2$,ΛvS-L >7^nM Z>(<9G*&bJYh|BKQO r)?`"`(0h!7KvZnhx@Uy,Mz$ +.p>9=o;jXYSnۅKY%p@?|C( ;|GZja [$?[XUOcHd*~pX=O<$| #._W >Vx(A\4P~ hYkR" zւ]kuZID##ؒ5'03QR6fUA\*xhLД~P/ $Airn>V8tG% Vd_}Ce`sEVPoFCh4fLA``Q!xAi-;ˍޖN"co+HK +N(# @:ru6E&caSƓo +i;փl'x Ie^U6vԎZنCL^z;5|U?fDg*1;4~y^)–| +nc}"? >7<;ьm^|\|E,ߥ,QLRUMu Q _B}VՕimw K`"n5ȳa}zOBuyi jkoɡ=[|J , +H%W*74ۜ1?A\B_0Íf(5?$u 5t="}!&kA[yq:N8x6~FϕHG%X)ω +`]#ix.ҷ^y7ѶN~[g<Փ[~0[0 +_doML8)51s=4_\#mKe|x)𒫎|./\:L1{Q +UWM2*)<#]aDKSA`,\-j}poyoYW~p2؊0>x +xex?F8cU)CjcYbw =Xd1cv3O\H0h!zju!_)WcWu|+WHI4:V:w"8d^h\X8ރ֗~l%.]/tYJ¬дzU`alp u0}tO_5%:ꚓ|&~xb Q"W`{I֗=LK$2j\B)CR= %ڰ/kLpڔr'3%o&: Q?y G,!wn٫ISy*۷ρtRR6 +593Te2щ3PD;AְaFYC@kgV1bɶޞ$՝mg,WsDӈ1O RzpB1ׁP{dm-`kԆueJw[u.I_kA0o1I6aex9_YxiY +p'[SK7~|}fxx֯2q +8.Պ'v;[# :u{_Z-aMj?qsx`jhEO [ߧi8sYH6t:c˅Cr''-?)eU`J $IUU%GsHu9륣K02xruj6˙{hnpZټ=.Cz(7naΓL`.W > BL6ܼ:P`؟{}/{БBֶʤ<ݚo|ALςZeDp;<܊WQ_@,ײZ%L۫rd9hD+.fbj̮q{'g.ќ_~ K  y3 m + +Y4wfjE9ѓe+U#VS vh %69fe;~0( +~[0\( pO'քoOC\L4L6MsJHtT-e}@ \1/m3PZ Y~R뼼T/]@>ePQo[xۨ824+ +;ؾ6 g#nZbL wP2 +7ioX:';RS\G^W4XELtJ~iVrvh5˶$'Ri8Â_ +`a*ݱb۷"lnʮ$< QeL6 1@:MsE؁$ֲ׸sʳL_+', g\C2/n‚^ve;աm!}XP&w~)[H%r|=t\}%6F?pm3Z^囬1eayxI4zz|pm<݊F@Ku3.!?MIH Nt 2ԗ +(YB:N[Q!o +Yp۸h|DDBaMoڔv@vF!yGQq0ވ0ĴOW6Qu.8oDă =7 bQ跍vLv;4l׬~=4<,bHH>l b9qAt<h ‰Vؑ2tKΨ(ck O)S>*[Od2wS84^%2'FQҤO$KH% ƞGhw?F *0Kkg^S"%] @dHMfs쿷b|&x7jbl*M҉,6il`L5 +sKw k$npm>afGEP+rcӴ1޾ ]#e{#$ ҦV<)~.u.C;6D&B><^ G]=aIK$Zd d{HѬDҜxUF1iJ_-a.՜= Nso$pqȝnHPV^{(z;zy"#'KVšMdB +=R~mf/#49fKweܣ]Pk邔4agOgcr6Ӌ'Q@uml0~dQ`-k`tKTZ(UQΣ]P!7j1m 8R^+[g;PO +M2xlZ _j-*BപE` ZOЪE !]!"xS)NfVMrIb,K&Dΰ/"9ɀkXfE2?DID= G 2? 5ڨr#-|ރB(典hЅb{;jK4=ZUq =k`;}  gby1{ .kXwRy"ŵB>x9e}6_$77k.v])MZˑ;/cT;JS= |Nl94Q@oo%DV8X-w,GI PpY 1@pT5# "ٞi,0Qc>p ;,B¼w7r?jh7[_Kb )kD!#_K=6g9xm^+YdcM~lnǜle&@M`kh: au^6@-5wڵPp,zj6k(Zx݆* +r(DIQ8JDjz~BXoּABE_:(x%BhcjםRbǛ"$8R0*A}6@xFޛ z ,˧|}L=3)a74k #[?֓#C͛Lcv6 J$|Vj`Lf& ta@AmrUWQ|,x4n +lzKo6JJ)\{6RILVz;tbGB f q"vłO1j4ߓ :0/Qtt1/8RocQWߺnՐbH5|kCW:쳛pLsfC2tɋC eߔ^ɠ=CjdJC'\"<|g1p'?\ŬϟpY(ODr8R]38h?96:͈TGV&f +yQ#\?={2fT)H]1T1tLaw-S|]W=Jtn_NΖr͐6~u{17zТTտXKOvgw}:f7kcf_F[[{F*|[Vk4%sEzi=q60~軕3UoC) PH-$mf(Z~} %Pz͒sl/_[)jG;N*!8rԒ!ctcd)᾿Bz<"L9MUkīUV_,$ jim ('Djf]zSejXP3@)ERכ>adңnIc^ #J[sfաZe 9<ү4k Htpr}nD,߻%;ʱL갚D e::WDevo5Dv)?_(QZvRHI + ;' 5"*2&_+8516a ߕ˻X/(fhrRAq8 IJ\W;]CN_0#!.lZׅ<N0ҫFq{;#FOtO7_q suYި~zhoZm{8-$ᤣcBݦS{Eh>UВv߄A,n޸T"XtrqXH uU("E:wAyz8N ~Q^ iϕʶ)yEaGnGjB>X́kA#u8&hu̓c U3I0o٫ilFF J 1Vvc\?CAOK(J.Rb_׍ 8pZ$lǚЁrSA7A(!6o5DHv:k2,BP\FՄOG +|zANƑSN)@}V=oG8LZ.V[Rp<9<]-ޫi_I< ;f9 +FybEz_ĝ,Օꖖ]ݷކ.4ݎxEnMOU1|Ů(xևd.%dQ^,@p־C)浒\&54-2DOg^P +& əy,1 #l w >ENZ| +2GnZφ^ G$EDV7D +!d!V\`L* r;烪} ^)#KɺԻ!ىOlK=DrZ*6 +0 i)X`l*;_l {?cOq ܴ$0]t}/`lpJP `܊߅;.B!bׇaY F|Hhٷ1ÿQ@R}EO gA>{k:Gi>6_#4 ᡫGKly]n +8CCZajʢn6֨_y[~t-C%\eL_ T`DC;U x BHV4mbEeu +=Li됌ZPٸw<2 +< [2ٲ|W@}!!Ǵ!:@WK<-޻:K',EdtpeaAH䥦 ,_`4Tn`r[ĚHPB ~Naswh|yn9zB|rC?z蓜Y ?Z28Q4+HAnGȮz5SӡeftMƿXZ(S~~Nc?7=li}Mlz YEb$ڶDzH#jsPC%h\xj.TaeI{a\a޴qt!˕e|wm/N%'[l^0bg_nҦC$K ѨFsZ֕,?jчHԺJks{Oq &E ]>;}/i/dv8ْ(ZAҶ}M=_̡{nN okVԧ_4k]G,O22|B&N=1xctl)&TsV +eF%>' Cqn*Ю*XWn`^Z)gmqo,/3|tظ]NY@VfՑV@шojj#ep}woL :w3 շ3@C6t(Ä0Й2F@ꋬJ BK"o$#3 Y2jBĐmkAYJ|M]E+*};4Ia]$0 +M7C;Pa6`Q*j32*.B\l>f#Ɯm=zAr55S +;;S[ijcӾxz7}ҭe i6=PNܟijXr<ҧ0 ++?3it]bI(u4(}dbjOjyjxUم8q}|5\A:M^\<{ZC%ҕgu4v Q|CnF|:N/r\Y$yMwlFVcqXٸh'*2+ou쫝)4'V <ύX%d3C#2D?$YȂzPi5Bj>pA@\FmކZ{3Q/ht Xf@ 7 +ڼeͮɍ7IiA\69ܬB7i o1ou &%RLO*T(èeYDmn +\NeS=pc軟ۇ}`AIg1o~C*"kk-3I A#PC%$T\J#pq b7[֏Po.lE.|;w~+$ U3r,Vv>Zޙ/bِ?R05?ύX+1W1eJ-*gZՉ0cqYd/B?7MEdrQSB_L +UYGt9`|y㧽z6m Ц&Nj #@{ A@_LxbwU Ԋ2CCjԜ~lzhótnω)jI5HZl( yWv*xt X n +ڽbqw WGbY/O 뢙J C9^5g/̪=hv B9_,iBudq/mt24!8.J+"jI(BiGA|9%s$!ЯA+[|.SeakZuGt.9U'(#]H\$ 93R1K 9Ey̥_{fak94 e^5ZxƢ7r4NT5㚙W +G}jc5,T&Y䙷׉oh8h\DǙ=o +V+0ᓑW`3AXcH-O |tG^0Jlti ^V5 ]* p^:krY*+8j-Rk Hn0K#IziK Ԏ]gN5Ylj]"XQ U;f{7$V/¨dlvY K²N}嵺k |4/ zPεoH;c*t2_NnHl,&<4ҷico޲mZhjϖnܡ $2d%F~=n~?2Cs78yohmmiNlԚmP7o.gψu|^ʼnGdG+~PegnR +qL؋^ (Dn +}9h7۳2b2e44-kT>(JtYEdER/'j<(D*{n+ԊȋDW"`_K$:wi>0|Ux_-gR5Q(,9=@;2lփ rJl⒢N8^?⋣<#%sn㌹LA{ t !F̯S4F$>8/7'-'ded}[P1V/>Q? #ݕ9y6F'KIJ\YNI 3+흰]ݤ sDྒྷ4n7&J> >_;;]! {\$76B9ຸMK;oq?ݧF'uƑb(`ϡ&όM|B]2Yɐ֜GY8YHT0\E9Zs#_$ +ݚȌ",8%WY1ⓩ<ǃC|Е8’<%3L׬/Rw+DN6<iSTԌ Dmkdd?dż[Fo8}R2u]1SxN,\0.J8O" endstream endobj 2923 0 obj <> endobj 2924 0 obj <> endobj 2925 0 obj <> endobj 2918 0 obj <>stream +HWioF_1c>Aر& f8G䄜_dE6%K. ]]{J?EYa I[ŋ57YzwA +"Z7+Zw+S_땔puzDpFV7oC/}e +H2QP=X|F)wƬ,-]IWpKs*?;~:jsZ}݋WmW++ew]>c%_J^9!:됖mU9bwn6mRr]Abȧ}٣j,UӹkT~"<YWz;W ̓gºKnKˡ+HaŪ%f2fU5K +kmzH9P͹<4c,?4lKN]0pTUrdIkb;>gL[blTBia>fu#7MU0zr!KJ/JHY R񳂆?ۺ9U]buٟv( m_ah8RgӼ'i8\ WbUBGC.<ږB*ld/rP\1HiBQp<\1X]TД(͕P`!khh9dg2bz0nCO #/jowK!`dX6``27L@:AH9 +ʨ' | ؍ rpBw6wy8wXд<<XE-p*84UU}KO F=! f. %'w.oI# ٸp %UU}[~<Fdk1B '\*)vThtQizW9'{hGk$Sb6C}D}P6IL@.IP)Ij_FF']E2*0oYO0 v{gH;(DuJGL {4fvfs[K]u:w *d\²6̌yP6XX*28bA;t7tiフ]Uj7wz"l CՍzW8usr=yZLrǶ]yRoF}'L29%0_R*׏jti+8sJgZչ [Ayj$r1$\YJ<*rV7r>^1t o.ϲfʊײַ.1RM;5:_ :&!;AB4 9|ZLG0C]g (^G0; Iə9O3M%98g"{-w]7mRgj6)UUb::-ÁQB֚6q&Q0I):z E2~ q:(st  |@/`$2{{8$%1CM,xMGWަڌ6;]Un$L@9ɀ!, L\J.>z6EsS(uZ/HHɈ'`=䎪6PcT؜𔣣E@t@`y"0Fy=bޒTr[@d#8cYB: ؉wil4w?~iėȓ- we)AA"B xm cܟ=7[gOPQ|ytv nlYj թ;\^}BrHDE nL9uOaqZOi|u4,(S> ] w>A"pNs~a/^m2dN%3<̰"QWMdTCT6go endstream endobj 2921 0 obj <>stream +0 M@&D MM,ДT@># y[/,rzc'URc"š"ux~ش8L8&)'7C1>+l=} F{w%ҍ679j`wrF|gI~U[b p095%>Njt44Ti|XXİnxirݝ 4&WU{> TDl)M;Xc(fGVQq`ݙCsgN^.'h97ssQxw}ynKào#w#.`'Q6Hsyq)4bR ~vSpt +r !1O)?\T\8WĞ`w~7PZq@&= `@g?in6]g˛%ƵoJf)ne/mjr@p e`LxJRocaұ|KUy74 iu*30aVǴu!kjc!}شdVK+4HX<Khʱpq^ NIy: 98$!P'.IB&t`>G1H׌jmKaTGHy;ag0l]XXJqdna"3ܢAk*#@+ƃ7_Sy" kZ{/F.O +..@`&}'Yvc՝+8]rTKT +T\E&\} 6Ҍi,mq00W;$Θg Q:: Q"hdz!eGhpnO[b8MLTxT$I,K+Rp$?1J&V&iCٔZpf]0UGPnJN>c$OklR,}_ͥtEIi:͆[)3Z7K]V%s 3ŁP<2CZj3IdS &ϫS ^=. ĩ*~5 /{wê S1J*41,S\I ';fܲ! La>Bϓ(y{)pqǫvpyc OcQb}?gI`Au#m"kW8W>ncIg\(Ǟ (#( 6ݼۼgղttU\$YLU "섭8Ð@}`ݤ!E#p:J_w!Sƞ )}]2A≨i@K MzE \e6oO_G`PC(܂f6*R1hkgeiq+Z g8I̺Md47HmX ׉ţl #3 8Plyp( Z'/QZSaܔ=ɗ9j:i8}Y}lMtW1'xR,6c< $hOGE+˸ vXrd'KMz?ڃBU(c>yy)c ( +j'.{:suԖ +۬Stp%Xj™KyŽLai}qH l"1@9}\HÕxSe0X/!X[HUt2EpMn6Od`T-(U6lG/jҋeyMނR\"tehO?j u)iFr^ .%=o^r! 9#?Y8)0MW +8++b\KoȥZ 8P3U7M7u|0 IHUx1(1Ze_k?,#&S-/CB(Pqx/05СG5=:S :qlO1e9pb/W@4nԲA2IT\Gr)bSF:]S~$?y[,\rRpT]*̉0_+o1+L_)+0)EXw {br` ((#:ԺhT_X2@ooΒ{Xk"0 CJ=WQ i?j|Mxc"QCʒA*v#^UGY#ץ= VtŐ*Mc51J[XJՅS4h#X3, B叀mqLݙkrx:'f`3ml5g$mԯE|-ztG/=DBuSën^^˪YԕwJ(T,HJ7 t쑑 G_n`գ!/u57^go 誕^d#W?}Gz_flV4 Fu1,J"04#Hv-"Hs ]4fGMc%f&jBI^ylqux?H-qC ocTbWr[Y1+`U`!~W[L^f)j j Z-d;YZyi # n3>mcЭB3WY's0GJ=wАbܴmzr'iTg@StaeB(=Dk\dF0W&0N&t'Q6gM j]H'Q  xJkgSUaJ`@lQ3g5XEIPr2LUc+I%T!au&nC:ZTKd{@.K%oMOË{w_a[xaBufI&K06TεƒKw2<̧T[h|;yY)yd*Qj慳|sWJW2eNn>~'LMDdF6(jn=%nD9 73›Rz:{^niģjau^ݽ𑶣6Р vp,T{Pt4Y0XXjXө<.n1nK ,@0h6\tpA$zMRG˛y$=:dO[GG0־WY·?[}@a=bV9tUQjn-@=7դ{^뫵c#3g&t6A95o,,>q2lJըbKOuVX|#׾Gq̿( !"lܢ@[07 WXl3g'4m}|+ yݕ WiÂ]"NGJվQrVZ6'-f94o߰668jԒHIgv"i6-Cj^ \k7A~Cb׶h>C h,$sȹ|0Z5EZ.u+^%C^(^j{N%zKw6~yu3UOOԃe.FA& '統ݜDw}<Ċ8I|a'2 fsVFg75 h{ F}ޤo2Xs5UREeK KƬc/,b %!iqj K;G?&Ɨi28zʶAN7z71u`Գ=zv1sl8>2ǀG"b&c1lGGRA!h# mDjg]M>=vFnB\G=!rT>N_9>y'/Co "S'z 5V],\LJTyp|0@Y*u1N.}UD\ N*#e,9o.rsuKЬF( ?.'@ot͍ NEi }+0tv"i]Vk';Cבp NS^w %<:B+jH"W`%#.1Ls0 + [mˑ9DHЩ!w*w˳F18\'utn,ަy;W[(~[iM}9ҜuGDG+rYX[l]{Tư<8Kdr9 }%x}>}JQm"Y7W?7;4[ř=HyFX.GcPU_2;w7{ \=z5ODK#/\Fmz94(/+/[Քh:H0isw|ٺtmRFT'T?SefR;4 C!I:IKv;Vȭ\p|C4z==ށ4#jƸ&>w^ tC , bC@-Yw}兊eRRx[r }ނRWFa%YS(Dz5?#{&94̄n"t`w#K4)G`QE}x +ҤlAߵdu*$cJl2ečr7,)=_(D5ph {ͺO}Q%BE +)4?:zݭNxe2uai ̘~%~FRBQ;\zk$`mDì| ;]~_T# g9<~G\ˍڑ0aUjM +F|0NlRjOr5Pʖ3`ujSt@l7ΚUEz$3 +Dvf` +`գʙ3t_DQ +貇XPyv¯<56 !ϓVs) (lv.?wvS>H<筆*=S!2g_(i X Gnja c7 W?-dU?Y|ye0<. L~jv\U!Rr^yx C巓іӹlGnx.T%VS_}3)na09^=LJQ2wm3-br@ZfO Ӂ&խ.ɾSg1Y "*0I*H<:9xd!x@ߥ@-ot*q0Ę} {{+p'*Oœ(X.|1F#!),<5;vk`yq? + )H{.^3LofhR\BLgVs!f4+~ye?c-^KK/:FRѮuU\Uicgۓ4nA핗i).VH.?XNjK-ĉ/!RF=='AE•_dz8~Q&Pߜ2܂| +E@r%06D 60TPQ7:>.}6I3`״&㿃Ǡ%(*gp߿ng"gYcUh"ɳB33(rG NTs|2_&}lՙ{})DטTW926>go8 kxC1^i?{)ҢGL=G^{;gJI p~I"v%4 +exs +A~Z|%e0k:L-J:, xh63:Aܡ8e(?=^(Ptڹ "L^ p1H L_[aWvCW%E|ye@޿1 %dqK +y|V` +ewh=p ߺQ/s5.\S.- ~;/5I%6?|q`c??cgR M[;{~ɄևiA */'٬w*}&+LD/k}gSqi\ 7G2Z@!ZS4tW.pUU߲8]ʑ~q-`OZޡ#翼@A+u3) +D-nt>0LIrkDѧb`I(8/Nlsˤ6ڈBed0S9ﷃYawdhѼgMtkgJ[m47`/f[J235<[|NsY*o׫ul2EB'yuc4H ѻ,ztUICU>eie'>T pI ZRa m ]GrUe_}hn,E}B#f*>ۍct(KÄ(}#[(@Bdiw_ A k'J=%J~+ǿ˷f/Q ;ԿsG52z1Lg 1;tmJbw\9)ڼQL7>D9\s1%HN\iXpd&5Km^do8&@fȓcxyb3, ٹ+iӛ8{ˋa3P/4^]8B'nDhG,(뙯Z`T)s^kp@+\$G(brĿ29ť/+~G +3m?7ghzk̞pH7dn,|XiXi= p9UE7.GsU33q~؅Y?˭h]>4uGYuu.תz Y$D$j&mوE 8ua +(:f'ގBp_Vcb/'^kPv{OV6X̟Ԉ$Szq޹438+m{OkO^NCaZqK94/ cGQx4+#Z&cyQ2}^]-YJTxtv|B7,"-Ia>^(;S>MHﯣG)}`.*d@m[V +)2/0L9#id;W/ll۫}AxJY(/(Ò`(``ګx]B¢_~|_RY=JA}*/ =s-[ %un`@&t+k-R*!1UL@Ŧma ',3'ϥmTRgf" ٜEoMpB29qLGO5~'=fֲcO_΢Usy$ϟQ~{MLـzx.lm\ϲjWT,0S." 1O]jUL) +4".{j7z"9s0-CVc[$Ռ vYWW"xߛM$f$p%*F!r|E..)XF^w 9| Y:5$cu&ulm$`Cz:[(6,oLy'-W9ʧpr0_4/U$)>^UX8@SLJfϑJZ_ mcQ }%}֏4וE*A,g4aHq^h\z"?yI'j*Qۈ]T jۧ/T|6Є BoWLnV)0T IlEFnv~lz +x6uv:ي"B:n!bA:ˣZHJ{)ݲA]]{d^3 Uf7敜 9%W&[ҡXa^^yD2, E'& rothj.Zrm7 ey +J~3\BEdFo%(Yے~VSSQ5HnCN^5yvx>\Ξ?6ԟkgm +2T2 9FTDz\jRP9yWR}Tυ~(d-4U,$?qIrbO[N1ʃVq$}D_ ~(+AUoQ"\uPbR1~#,00*P:Vۊa>% 1>hYV#B991R&ʗqy]5)1^CƆ`1q^{-i!ЂHem)!H5~4W%SCǦ:x ?vϾk2MIM辰h({` `}Y#LZ09Ǒj—`t8$Qew{njAFq@;<{cVlJt#g:5&hn٭#l"48T2 BbI lV~ Lz"EtꏵЦrg4V[RPtPbcb6.鱺C%)#ߒf3HwKvAprH=|X+s"S,˩{)^ ?i zmr`B7aqqYOG8y'QVX;ϔS:]詉~ + )W$A?E$S S gdCMIT6sDW qmF rq6Qٛlh~Q,F&@Xr`me>%38]"r΍܃&z*X’z0llڌ=Dѯ.0hLo\Kep+?U ϳ=Dh0fTj h;;ʼ gKnQ߸ ݎrP9 ٽkYkncVJykP59.Ejg=rc5*!)~*(۸4`Lڙ+r<\kd)?ͶR,]l#T^f=+~'d5)4QK(N`3EPZDѷV?`VڍeC]B6d~TJVo;9Kp|P8p#K'86>q4u+SלTKZ6]) #j7ZJٔn9Z:;K1J,'LsbysqvaO &!`~){`̄r3rw[ ʿJ)D+8x6n?5be [<Lrǒb٢z?Ip*ekm](88%N,\R$KgNM![! v]H>cNlzj3wv[[i5(ݨ34D?%DRCTØp`i VL4@:eB]%̋-}Y7'pYX5ִ{ zn__?֭{XlN3PN^Kh`CS?uD^~zȥex6|/ەמ+Θ cLT5 #RDB}n4Hͳ`B7gD͙_N,X~ @Qln(e~g:^…{7-"< K0*&TXQcE8?,%'XAyi `f lP.*i<1T15.oy +]?ؠnۑ_;Еiy0 a6ݶ}VPJ5FZH$H̪x|32v$*bnV}%|-ʵ#-NHN,6@6dEhU4^r8lK< ^1䮫;ؒ3lcyU6ź!jp9=BR[3d,[Lys,igUwTizN:sÍYYZ>Rqo}0^p3;.4 /NtBtHQFHi?YTMLPK\CGhJ^Xt ?8UrIVتRljFl~rDzb%~iz;/^%1>~Ñ8[k).%xS+8mv#@A6E0IElLI^-zi/yҚ +"g_wn&:}"d㮓&ܯL`IAw9'bmszU][ qc ܦ}JL;%k >,ό0!iב4}LZe +k̽lK(,׵B2}Sȭ6shT +%caX]}>SBu)d5KԄOW6FK :<]K!:sz3NՏU +68N-nubDkNsTĨp4|SQ{1jVa5h[k`Pp qr npV]4YO"o{]s/TJVD +ʎ.ё6J.HrY+ՒU-&q:-Ph8܂G79$?Tlh2pgY H_ʢ6;K_Wq--V$5Q&nβhp1鱊ǡ?sA튛~(E,J7Z22ͽ{p%7t/ֻIȔ[#j2 -qM(Mڊr/&%jSP\gE>Jk&zpTţYZO.w7< +X +O7Jg5CpzH64v3aR8rӈDj0 hr1Wkj:pNkyvP[$cT/@]`nuG-Z,ءVpZLfñ;)O15y3 LJ +uwh?ȰV7jpH[ſ~fPL3)06 +9-1JTUc 5xQx$K/T!zw{\fPfv޿Fo#Sލ_OVg$iG" kCbٕ H;͎3tz"5;+6;3 ل^DcEL+%cOH`l还t[<4yAU|ܼ^OSaq%d\TΝkrN6ɦSm{[FZfy}H/Qost+p|d쇇b5bc}+ѕ|Py|" ˦&EKNqɑzr W[Vm$G.4u>bc]}.Zt4 /v%V&^h[3G4 +Σ ^;Q,66?vPrl}oOľ==0cx480CHƳFϔh^GsN&H/*]˪È6OꞇE~`bv~n/]*8LG5i2ko옡WG`+DmRNH"=ȋgUwUO9:;P rsÛsb 2>4]WҬ$4ʌ?&s(,g+2-> l N!XV=a%~E淟sKpLA&Ӌ<ȜЀFٕSL yQ:8S]!A&~c.V+OXdxQxSXؚ#qb_ed8FLVH!|N8U8=۴(a= +FGJvGz*Nv?^ɰC'+l,mY +!21Ø5{yr.Uf=ְOsS?{ +҅P j0Y%F.j#j,BElnߙۙ=$+աNzDif8ۻtK<ZsDJ$:77ѻcy<'-r*VⰐ:%v>k;s-O "Ixh +9L#v p$D4"$sO%_1&@W<dq:9%9Ͱ\ѧ~} /C@xhBn0h.nWncؔl#I5WU:v?1)tه@>aֹ33z++|qؓy"-cEu2#%&R?y+ nqE*C c5;{\|WT?Ssqoww~ղZ#\\d^:ʗA!^F:(,iОsu]їZTA.榼r0g_*dpWDncپnRKU|ϰnYӲ:Bn>us2 /f,ak8zXd(GGBs󔎈sB)n^FE96ɆGX:/HH$‰[E^e;WC[\ ДA:`q]N’`g2&&R_tAG] endstream endobj 2919 0 obj <> endobj 2920 0 obj <> endobj 2913 0 obj <>stream +HWnF}WcX_ Y,",g cGj/l* ?H2RuSg:!wiQ8Ϳo~yyGwlwwC N;w9vJ1"t]7Fac7߽e^O`|~7;f;a]/v?~롿׻ɛKHy/-y#$N,q! n'NQD̛?v۔Ja(EPs<>g:rb8^>L혎,Y6̄,KrOxn//RhYK4"IG,>~*j}3*Ė[U^YC+31; ;B͖C _/|| ̜ A\~d,(8>s T{OCq:#jwAP(`ޏ9΀~s2P9m,$@9:NC>uY#1SYGx\})[N)Ct4ZJ# 4&<߆Nڂz@]ExD|a, r +*ʸhf+AgSch9 %"KanK> &υ%qS#LO<7w!- I!~p +!kep!>Fn<ġly N9]/ Q'84=lAA ldMSSBLU +a"#ZQOrΰC.CU;Z58aJQ[^,ދ5̞x`j>?ysm/1-WUS)_ +lq籛ijqSӳ%A ϶%؄W%N ]hV9jLR0[ڱe6pF u|իx/SԬn  JU5>3"kubcۄׄzj+X|nr6Q/yWRpMT"ӱ11tz0Yyp!+s b_EÜ!!Bo[W0Uʹ)rdoiTӺ$r 9~Bu9V,1dX{`lPoU<nj7xygw"pj0h.s0ko*@T23 +I6]ZVao%9f"'cMz[oR_Ay r+R#acsvIM%u29Z}w=* #(n7e6 t2Y)^ @ RpH2}\cXI݂2y"nZ#wx90p[wZ.72fԌT{3F `: 'h?aՄ׋U'NFyKqR<8FUJ|ٚ, +7%C36D gÏF>! R:fKWZT'P;oHoi+ E Y44q1ƺ7єc۠749m,nzXzmEpf ׌o1HS`pf ;k*@8ȑr0·@B]Gb],z +bS :Xѿv=_WKo0 +;zZv`@CK^4NKJL[J-e N=ݝI[ORtG1d3I&]m7X&2.p \>|J$P@?J!㒂#aT+pbaQGK.}_ITѡIȵ]a-s$0Hh[qb]jT./tH⒓e89$!N't3OTiZ^VڳRP|v_n׫ ` endstream endobj 2917 0 obj <>stream +0 D@&` DZp))Szm +Gt>q_'LF+TF2;[6$}nQl +}(*t\,yhl )M6s<W-1wX2K,:Hl@UJM͟i @A8~ a-*rO ?,XZ8t6 9LsSjwJcq`qOe6zBN`%Z.s݇>&Xr2I5b3mMMlrZ"(s 0Dux2❳"4JnYOF#+1f]+ ~M^A +qE8ic RZl9֙Z#h<鲮_S>М*ތ'Qk~n]2,' n'~Ѳw +>CwVݫ:ɡeя5o|Nы)|M(sT`nH]:߾M=:Og3?\rRW{>Yp)pR%+MCc()\8 ,7A_&y5Νv.73a\%w0ָ]ʽ9:>OCu΁v'L_][[ݲPQ.D9V[e7JEH9f$Ƿ0@YHpAe>RP!ibAR̵%PEH OuC>駹R[BDOE)\|t +r(F:QNXdLnje*mBu2(>=x?غ`-}tؼcG%@VFW 7)tq~c^ Zjy`t֋I3ң*i%FXpm؎\aY|3n;tǹ.r)6Xlnʽef;i\d6ߔ?yzQ7|]bĠ*XYW~Z, 5~43 Vm<Ֆ07Ҹ}<PYq"Њht}JQPY}oY~4))Lc+oad/32#[$ںrl5w?ERk֊~r;rQSbe;3o!}zݪ=LZP_QeQΞQq">RJ]P\va8Gjs;ar;? L+!O2,hJkOcFK6AN> dL?wc'A4\{S/V0l7A@`DAj^BTS-:یEU\ +w[GE<*~-'Os/²;NLC-J_ps}t9c<"r).ϊϥG˭"~S[}!뽗0 + ?w"#)._ЖU7Χ9P+tLUyj\fTC] -'-aԴ\3 !0˂nK#1=:&A{Y)c.=h5>(HOVFMvúcI^kƷ<3Q&.FSZ}/GS8Ti{IemɐqZ@&}-VbZDξr&o+Cju$—Pg)%]p2?Kl&7 @~!\W~CY?&()9əc;OQvMLuTHXϊ:㧂YpΫX'RI'{%4[-㟼A9m}/+6ZD81KM)l-˹iZj"sly\;[AvE李2vTx*^#U+Ԩzcd{ MC'J(8M\&$%DAgY3rݍycv#2Uy(y T 1iSNQ^BA ӂ<'=Z$aeި.;" .l>`B1G!%Ws!̘x#:o#@%%iٓq{>}~&j񨾯5rzL])Xk#2W.TD1If~STAHRDsQQo~!W[qQF']v.AU)nU>׍c I5D :v"(fJcbҠ[y{`RC*RN&dQƂ Phve1xw_Vϕ#kA򈢬;NH͋/(P5(.=R.S'xv$a6&'j 6OB~V ##yp7t^tEnYX5Z9 ܂:h+"]¸8l1 K֕~禷ŗUxXSs.%bhlm+G +*̿8HUv1%w Ԡ?cr>;'-94bFU 2#+&"'u72c~Bu=UN.zo[ +O.¨5!iUyJ^^*NA,Ƒjh3qӃ9rGVZV˂ak#d?`.IWOU Gn]1]uFM u槯F` NmBWi+ Pͽ}%\Hm.Ɛ {"eڥm`Y?‘Ǝ +L7ġ x3 +`W(Ε7&Y$a|yn~9#CmkZfQz(gp $V le)5f~߄3̟yHMhTɚUv8?,-F+w#U0ۡ7&E6 w5m0n,v?EP6#ԹG}[Do®_!Әxʴ)q`F|'02OnQNX:TPZO:"A-V$__alYL\xPd.ooKxVVUcwsE13o\>u$6)w^W.ʧ$׆ Z (U(BāL!7FlΛs\0 3 8NYKL XlBMTl + DFH0Uxpd >|q[:Wȩ ȓ' -=s`ˉw'}a/&,nCM_b_7K7C0f ˛(}D׈)A&Wt8ݴOs̓!^13?ď<R[3gQdLsHn х Oy|CkNF[:K)4@lf$oP7GWU;6D,Ш׋b3Fڦ0'c-`.{e~z3j YG,jZ #-], se1C1_{T5({&GĚ}q: 7.?<(?"͈ ƫf:"JWM~ϝlDΰ]Xk=32 +f+. r<[?#~2pWzuZW鉐])"2! gtܢ^2?1Z}bdapy>!)遖c ޙʄB%P˦R%wiku,-#A$ ]El+\2{aǎxCL4Q"wEiԖPmFCGm@s+,̃0Ώs۪rc$60m恽,IeI:CΖpwKWan&D1SsK*5H2ρP=;LCS2y.hB1u'HHCiw|J9EW XZBB\)۳Wp5WH^tYˮBqm2{"jS)0jqP~1aG+Ʃ +ŵB,8;w f>r Ÿ;7@Vμ!ݍ՗"PY[ Cx= *`ʷV2ӄ%Z+LiYrS1Sܴڃ <wj\Ed=0rKlmoe!{/T$aF;`Hա4/H(!1ޞpGÄlOԗ#D,o`/~d21yʘ,?|l۞rZlz||30=@T爁[;QCMq\'B*wR !e/>1#2Hb_b|-qҰk:HaPw.}y"*|֊_gY%4k8 =6^#Ji)ԟjvXsw pt,N82nA1nQqfX2^)SBʺVQ.SG8C,AlģʮY t7$&t.#qe_DWt-ˢ{w9#Q)o| c)MK!E36/m& <8|" %ֳY(PNSWzʮmy8^ڷgv%gϳ,~Z銀J}Ty8}%5 t,WrAu l"Y.gE+LhWlĜe8;^p+vb\ p&w0v+D=V$Oo=q#;@Ce\Vp~n{N6К2IMOAXZ9c)J)a+i4\ +$SXfab Ga +z8N~TVK!LQL3p!ț*OWofPR%m)!R J,NқQ^͇M!χ$iv{e=02 dSL <|:6JʔT2r{0؁" V>Q.i, ?Vzܙޗua${hK7m +)ڲF%]7=Rx?Λ˘5|`4ߘ^tۻWؤ -# d b'As\H^w2ێ[ȗoth,]CGqMHܽO frYz\$O4"?g Dcs^QBe$I9NDH^"$>z~RW,#~^/)42| `D,$ +79Ѳ| 8f\vu"o6+%N&Lh  r]fA/sesqC!M,K`Nm͘ qГ"j=5/ۣ-Z%ȭ;)C_}or=;3L%9L)qX,ku:AAd<&4X?S+2qq2Nd$/o=t[0PV2 ~8PEug#&Rsv>oώD:^0"IEK>]"S/)x'^ARq/V&{=uFNFnW$c 6 قͺP-2\`tPWɷ&_m6>~rZ92ZҼN=R$GVTRqJ@ߒ0vH"IN7h䛜W2,[0bBh ҩFC6zj(OH<:IaP P?uE0 27+/_禐6$ +`I + D?uHiJLks`>f%Sag[1lp.qͼes`ya3M'ߒ3w $JK_; غ++\=EU=鳄O˞:=?F.q0(#k~#a +BaT wN% ʌ^En&V\U46}{s$uKتdc2[90զ+H9rlHSC{L4a¹B U)U_Ӝf9Nc23/RnX+?[k3!"Ժ"Jz%,6Ȇ֊*<8.*N*b@ jʌ?)fB<Ht/0)xxx#Mmvܩik˗I5;=\ 7 {`0 1` +]SUo4ږ>~Wym@ȊE3vk I: "f! pGĠgat٠zyt_8cwc^h*! "ՋArBC6R7!' X,Nέs.?euD+ߛ-#H+qΕǑsTlE7dP phb}QϽt\'~&GixjD% +K?qla#_p nq5f+b/Wl 79Z\I3a)! LMyM=P>qhC95sQ=\/~\My]ɊUyO1´yO}>yj ^rXU"M *1l ʬV$XлDztwvqTn6i1Od$B%'yߪ~~\Bxy [o q3p=l :TR?-"$DUɢC,-~h=&ޜ=u6&= GTkޯwpҳrP(AP?DƷBԨ^]9#bE+ĤOqƯW(FSbkw -}dcL)B$=g=f8e`.]fN@k!FK]Flyh_</BIq4D.{lLX~]1=sALe +{~`{sĄ6Tu\"IA(@/fWeMư ':7G$vK+l)@yNe v,a,8<+Z IB6(`, 4ZER}܏6pNe%)5UM0xcMgڂ/@ǂ6PyqC"/,c?z50FwQDZ,Ƕ]x5WFx$5%CaJ2Z#̼•!.3Po$VZ͌ŷкX[dW8ܐAx !Kt[f]}?+Q 9Ry1LO~CX/=&>^9kN!˼ϳО<|Y˜Mg` 8a$藍@ekV|8)G;uf5noq;6GnpI+S]t%ӲzRrTrfl8lEƵ~z28Mag-ٚ邙}_=KȻ7z$H"Y)D |jԃ7(}u*f+R at"s {w=-X%ȷ~!eT1;^jsb6I{@CI~[}8V;u<DH-?KWX Z}u[DX;P3;7 @@}DUVtEN{^`tb}wil80Tj4q%K/< *["oƺ1A..Im qiLUɊV>cd8g$у3GbľLHPʼc'p< :NTq;F+vQtvVpY2)J!n9`*yq0I|2l:޵emS^r@8B`" K{A%oj{!fW6Qd ĩ~LdD|qR(gs1黭>8kJ:p6JL24Ձ-^=p.݅6%N 7NZWth :pt +ܲ-RyX!wzV@&jFHEP ȶwfjf "k]:jl"Q3sW)ρqGs ,XcjhOs($^QgP@muU;Գ&J 5/P四V^6;>PVx}CcߺƎllSW$4n /@0|Ǘ ; @Jݣ.?i!VK0[RQJoɅ;]wvUaҗtmT(P1ޯG@#={V#4ZndQ$7s;6O*-.xL~saLu= +‡T>[E+vCR3ǿ +.i8 ȡn0!iфpړ +hǠkįv?]C&52þ1Qwj"%iea'YDž%Ss]y~sWK αGO\P !هfی@(!Mr}jܠ[>|xa@Um1 +8;iD +QФ20DxCh*E~-dxLy(wx`Mc"7F_F˨~aF wٛ&>f&6Hy (f"u1* #*!Q Ǯr_e0<+=[77`7m#Ȼ 40",hASsc띨Q޴Rqۓ2ul 7nת%vb?#ݛm+ŀnJs1}Z}z =Q&M|{^3X {fa"@؝[CՑ/ CWqUҩx1\Y( +(9 0dow1=Y, Nܙ-2aZ:?jnu`x#9S]\pvF smBQ %f81\XCpˋn͝KC|OC.)U1wYaL0B[\F ٤S IH;j]u"aΗ/U3tP$(8Y@cdIyth5`Ӫ7wj/P\I + 3/_ E"4G,P5,5y cXXrG2whdj!]qI5+<8UmL0 0{4w"twzیVg,Pncyb~aatp6G=oKo!e'g2@Ṣ44zq,*# Ž#>f,NF;ar; %Ѯ<õpm( +'obD !zry<R3`miblVZ^^-Oc3%XT _ciҚ($?Q̝۲X'L\" bHi(*YPC6sf-b} )0fEdž"kUԴz7z~{Vc0I +ym( lHd[ᅐis:'ީވ" GHE( c h*ۚV_%z2/77b 9X2w&su@홝E0eHhyw>  ĩLFbs0t% ٷdT,n27pq:@DbiÅ `#+?{XԊ&th(ww.BX"$7Æ@0\S|*w :!(H1C@%%z2)JW\ZC5Grhn #Tu>!er0_cްy +6OETr@#jRI%<0I4.ZWL~A5Ul4@]0n|Ŕ&n[Ml ϶P4UD~E_ު4 N!vh; 5ل:1ΦVaSS]ksJ:N 2eE֊̘݃7wE +_h=/m :Τ0B8s!]?kZHvV !Q:_|M + _ :{qW{F5Ad4<{!pAI.Sz__:IjcRg\=(9nC6&dj/8iX:-nQF6hakPfF@oIa΍9Ff샱CSy;HaɷHRt`LIp+1$8OY2a +=AP=NjX'g\19p ; +^{,F/k$&.Rݑ{5Wje8ρ dRw7+k\RQ!X#Q4K&|S㵛uT>[s)܌69V^#er?ﳫ2EѨzN#o?s8 _e}0u#V~'߉L:uv:7o ĺw oXz]o4 v%tHOΊ}BNtAGh'IB.`ZC> :H ϵWR5eߦEuMDovu%}BIXqO<%qݼ1oFPb5"<c{/J5ZmS*{ym}jK\;2K pD:)oqa竉[˝U׌Ƃt-9(,&.Ae"{ңcܡN" (k :|9U_7$]ێx0C(r<nx^-؎67u!d5FFy膇> Fi1PעKH2ςBφhE"> zk^FG_s; gb,RGV `CXij;@;m$Sb r3/¸vQ׼@^.ob Hd~ߥ )YBJȓLvWJ!.?s)dPUu%ѦSZ/;7{ō"%}+?`9bZ)>ٍt<5`4eC>r@_Q=aAT:T8[C~q?YXݦ,ca@m/2D#!L#băkHg"VsޒǗ&mxNU1B$c66x4hv|^,~E:YJmC*{VZ…r \J\u6;Ѿ` FֲG_R\ h]2Н0U+m~ flhOVgҌ'Z:9>\j5z|dСFoZ:mr@m)<סE@:[)\Ȭ^&OZbB֘т:Kr9T?GpO&%?k{GqW'2,!620MOa| bmǣЯX@E~4k2%ǯDwȍ&Q9j̨ݦ[$|3]?㕅ˎSJ'Tl9 !9)ڸ3Oe=ɾQUH5\c? :fp2%dܶ}\VJbFJx<Jy3 HIļ7@=50b-9-MlmTUW:~PZLW=__<}EʻrKv:MЃy[\qk⒨Onv閖/7cn8 +Pu'M*(x@tP^>;1sx>fZ,D)C6a"; rm\1@he JZWtlf"KtP[+Z33p0 C}D^P!'$cdcBz/RnXu:[t>w{MCt*5@d9NŬ%5tV# kx@4KTc$4mxJ?^+/G!Q%ݫAPB= oKj -a˩j$hr6"+Ryk+9rE^C_m'Qr4=8qGjfӌT? Ϗ\¢>r[Cl=S(Dço|2MxW]1r dI'$"@j_iZydƁ {{F\ы-Z׻Up}L@ o]û%nטt $\T5:`aAt@Eh6V!3Nl , ,,-Psd_qƶqF! ]v:+ Fu.Zž%qNG<5$lKӕte[M 1])7VVIGsi >Vrid_C(.~/" Q]P`~ʛՐ}bܫ19qn%_ [ p.}3H,Qn2x3ޤ j$%$E ]3!&G7FB91mRNrj2"(!U:C44zzOi,@{ӔziX$,VIL[C"5Xa)>`nrh|Ra׎r4Fa|Ĕ8aT\mO~5TbIWr@NKSPOҖMsJ2k79N.MQBrD݃.a 5e8o1{r[t c-CZ/K +&W8j0횭 uML(5.sq˥\K^XP[)#-CQ&L!RNGQjJӍ^Ѯj)d1ORr[,B`E,iۗ׿"ՇH aj 9vUNP7e.03ryiXPH#N^Qrk +Gfb_5‚AS戠oiؚk#c^jDxЋݘ5ٱOJά?]RX&|)S꟣wc_] -b\+4~ +rie4mX0ˀ{؝q{jF:2 `B\Gpy?`OŶz~ +˾.w}vB6{s(rLc$Pe$I1vQѦM +EkOk-O86 fAcr(]g}snouziiU Eu< ˑe}56q8#&7iPރ$mިD&ʆi!2$cՍ:R+lk]櫛6JR='gsg^*KFXa8"'"HLh&2ї!'_~2]r=tC8?s|;.RLJqw"AՋR=v4Xefcr4E\Yvշ-|Z+ =(-#K3fgWKJ3nq&vP~[,o,ug\' -pG)^;R7ⱳ sQ7wT)5C1{'UR\LIp +G(Ug׍hdQwhf0u)B:T3)?-`aJSkAm\;=򐚈Aġ<1ze%q$/mDfz;گ +T. R{uXUڣĞ@`*/rnTѡbPˎٽ؋+ xfCG9=rO(B5ز8P>|.G'=};֋MRd-*OK [vrT R}q~vy,ku@;IrzgŴf;дaDuz(e#TDjx ẁc&b-|`-2@؛O?ʹ$0I*$ciEǾ~/w;q}4A?\[U&j|%@Y N'(hVw1㎬UKjauw&+:kC&dLOPv3V25"6ڝY$P.DYJьF"E@-S.erWT8õ%'x;T +,dr2|LʸPTJ jWUBУ;':r0pZك|7 ~?bYn%yj +C +8fmhFw%b6n/0ÂW+[[{TѴQ_=2ߜH 1c۹{"D=RbSbA+P< M셦{,{%軹ݝ\Mf\)Rv{y8_\DXc#kc*lT]xl4LT/'Gk ~TaJ&#S"+`yd} ׉Nbi-Oɸga2h\$jq ~tWPu!DEhؒUY6Ѻd( u+='QX>tѳnFHt2~N !O/$р +_E$C7q#yByB {} 2s)*4t #IbIkh3pz8+1.='!7KRe<Gb!/NIĮ>7:!9a,W6+x'#)T+`~$[79T.}]O)y_o9 A1N* vb!gNY;$;۷Jdi>*L`"={xz98@b쀃~(v"O.aT Pu12kw8ē G4F|l nAQ.$*3Ek8S+l~6-dhjEhƱȃ0 Pg2psQDJ'W/l{&sXl|I"^Wj0H (T/Kr1 C/ +M`}VI$$g@E/@P +MkK)PEW4 \ +(-z_7"TtK0 'q1/65M #órDm1EEӝkLmL\4h{[Vv!S<->ቛDJ Sd ?&Sm$eSiQOzݫCoW_9RL%x9:7"6{kCfi!IeqA''ƙKMnW&M9k +Vox:rP/5%Qi "&gi{7|¾#kUqGY2&.>ƁF$Ʊ7Acrw;Ler,&fvP^Q-VŰ*3H\dVYP-f' QdgX1yp©:TU',ԶƜ%JUB\,MPvO}6)! `y815;Op#ՏvL5}U8}[U,૯1e(eC'QW/hp&vjC955`7faQ;A]JsNV*Z{q nC8:? endstream endobj 2914 0 obj <> endobj 2915 0 obj <> endobj 2916 0 obj <> endobj 2908 0 obj <>stream +HWN[I+"AD $ "D#\c{l39նA0NUT_`|gaRK_O'^ > Gy=^UoΦyi58?x%3.JUEIXOz3sp d"DAg.Pz w2KӀWL-8,'T! 90Yb4 +"d$BFr1{bNL k}a:>'נ7M$ +o()n +F|~~^/ܷ֚Rμûyڬ; y`8y%T}cqh_™RurԺaaRV;{?d4 +dua@ߚ 7֘ u /U9C.diX(xkF2˽mm+*1ߣE A o3o(Ĩ>U >⡊Iy]`%/̮GJUAآ ׺B~(n+r JƛlpٴB]bWC"{BT(^~tŐёx)dNjTsL[oE㱂ӰEenT.Y8߻Mp*DCFRu]?K@L'$YBcR5; (mj*5ǫ$X*^Wc4qrav/ZX!M[ʰL$yI}A\7ȠBss{s?ŕ[r'%]xE%5a ~=8 +LJD 0 +U?kP~&HnD*m?369|I .e󘬔Bs(O9"f R5q._tE + +=J'HBkVlU9 hl~ ˍU*Җg%R9,y(.8YdQᖪ +vwu,k׆$ΝDڈ6)aQ$W!迿h&j%e$c|!v2*tK>ebzr<0kb[wgH' BwP\t5K\Dg; NYt;R}]L$&Kf¦ H_Eݲ UhĻt $o;Ζ#uͺ![8a;/)߫MYZثfs\}mU0B 瘶rH$(rûzQO^ erv2F~'g'T endstream endobj 2912 0 obj <>stream +0 Z@&= Z//E0 +~'򡏚[A)? + ѣP  sFK&%EaR3eV7ʌP@ FŖp$A:0 = Xn[`D<+;=#IΉ ~M;0,~.5>;`pVTEWٵgHQm>Y޳qёKv'4qCH_1Gd'VY5y7~j]~2:WfGA"i!']i]8X]DヨTd ṉiU_i1ȳw'' ǁF1ީ0Rwg%m<N.7dOY']6c3W`z,A' aI}zgXnE|bL6DnBB&j6vj൯Gn]m-rdNTR B zG\VR[m%& +gf3[0O .lT8WsDړ (&2Jȱweqzk0tY/;؎uxZ0v9=)d&JI p8o.7 Tjf6mQ~5Nr-.g)Ɂ +\nR2i;_AE.k#&U%2R@Fb+XP]#udPnXhva(#d\%S4iZ ⱏbB>AFouL̠//R<>W~cʵ/8B9ͱgZsmq^(<К +J l<]o R= pHI06!Ijk\QX?C*Ӂ)Aڧs3% 9ϫ9 `{oڧS ifWi ~1\_[عgv77WNK=[ÐoRT]e?тl@ : tlxuDÙ[kn.>SyX0?p +tMԬ.^tvj?cpF^CÛ+9ak+j^ K]pA C\:p*!:hh?-" Ra^40 ,P +d݈k Ւ~0KnEy$7?dg+ol`9,u6VzxR Z,<;~&Wn9UM2+?bր y@0u/jo_& %ÿ͌QF5V"~`+߽IXsf/T=&kr_D]`!Fn6MܻufD;Xܟ6{^oA5Ez|ŏ!PiΊ]++8͍ՃB`fXu`bg{+ 9;/ jhswK8\ d̾NV*9)Dg0֕NFۙ@mc$r)p_UwC'vW2k) +!8DimB^mZhoDX'ȁی U"†: d[^zdٽOhV*/FsN{i݇ST@!fwkeE7*`Vp!zӮ1*+eXVfBy8F?;݀;}W>r?=hR^dό@hȫ9:Y7dGN9x3L\P,+TYSu0cV + %drO͵ߑGD3jXBrS3Q] FۼK^'R&B$ ?L-C)'r+EćkvmeI#*bZl}1}v +("~s.RqmGs[yCc¸ o mI avq>ߺ\iY.Z]| K6#wի;M([~߻330;ϛkydGzQ?m􀇤 CeNqʵ:Qw%1} "^?HʑӺhƵ_c0%8*QYHx\j* bAɶ-*ؽ}Dư8FRFD >M9i( SOiqb1riOPA{/L?ﴃjn(<Ɨ:b8H`ya6x{c5MP}R_ۼز`F)\C~|4?Gh !|P+I4G~7"J\}Vy> +5^iR[{j#C, Kxi3/\3b3ݾ꽸ׅ]<+ +،,ǚ۔)u1&+mG1dt0DgNKBj*o+ "q1u9)(;!APn h35ɅG̬m{>7S35Ĺ[<xxa{ض-)Hg7S+B\,&oDCY KFVD4#&)? l9&P1<}C-i JºYs~|2s;.lp!Ɵ8dl +=ӄ}@"$P-4B7p'̍R0Wpu$.c[mew,e ,ݹef;Us|Ւ~dpnqp~ oTHߓ5!"3i<#1]`G k%L[»ܑ1KC:*)ڴqǽ\EE:3 X /n쵧ꔣ%*w̴3/t; oYp;fIn~ xPmAϯ~p?jЌ{y28K]!\]:%ԗ]M20aF+er ױ=WtkT;pMRH mŁd}`O +bS>AA|)g`Qhnʞ )O!PlfSS VE(&sI}5\5 x)[_^|O3*M:E#AFuXRXe,[$*u8r ٔCğŸHSTnF~󦔜TՈEQB-E?yhK_gUHeqK՘~NI" >}1s7;RF~V=(^Ynm=Ag{Yc*+,[W"F$oߞ{(PPzO 1Eռ1:s +_bb^k> Zmo go`(r jYW{3}i`Vlԡ\BOzw̅<ђCqnF\kہaTRv좴il鼇QUZ'],jFʬ4yy]BkLKk$ .V_IL.R=dU絗Xl=gnth[^Q[D Wݓ?4Qzﶎ :n8 KaaueЅ`1DдD?.„#sYK:*Y?Z۸xiHuQ!h` t,6.Jp_,M +(ف5PTT[ `gѿJSW+X0@w ]Q-=RuwP[}T, <ҧR>]k]ڔ v хtr]FֲM!zF!lMES/!!`O>|:ޣN>1Y#'PqA{ŭ)OB06g"X$-FS \8?*xS5M~ s 1 mE~?$F@/rΜe/pĔTVdcqAyk`&R*f^˃_ϨPfAˣ6Ka! + [ϼ{o̤dye/J+ؘ4j8QAT4:J&,@W'S z$#!mfaPLV0UFIl P"3lwN$v')Wdx%q @5c3e#-3ŵp$_mP!IAMڢ - 6 _-9("(^[JE {ļJM\Fe@v`1jXZ`y~t˒ :)u4W5G=ltH*<DA(.N76 SW Olx -<6\* *Ezp (g'9mn+AfwNұx}1RsOT~wCg +[AP0pǘN!J“@R^{u &/Fn$V̸gV 'foOYlC cߪ/FՔ +ab$ ~ S&^ߗinXVw'{氤kIQg \)XYRԇ@Rx--0XA!ޘ#].Nye.I:E塳.Ńhb-|^aNRwq}Al/S$瞎+;%*|0Q??,k?3zF| ֋7mZ7o$:.yO (xNUtЊ-;c;bG}k׏1/p$ϩХ 8p>"-)A2wMTJZ+`^Doo5ŐJu6]LW:.1ɻO1qS"(b3h5Hw]!<ӔRfpe }{y"e2sbwơED= 7L6nÖUkןސY4/Ua_ )rQ +c)Ȩ RU@9saCk w/DL%cqޱJNan;21P|N~HfCH%%xFK~Ɂb~ۧ`;g(4.!T [iҖ(m@n[+0ɕnإ;"c$?" BnʹJ)3F[<(%x$ko.vHÿs̬F7i♣ :v<*ʞ^/-)@'!VP=-tP;Hy$sdH+*+<71?Oug]-v WgFzLQEx7B+عp˹f 'L݋͟Zӊ{AS([-& ǮEFRQ`gD޼0"Q} ݼrp(T@^ ΩUŔ\'mٰGvm-V5GV $Ɣf4<͑X+.qzʀ]̚)RF9hwM2Bu&BbN*:>p%6Qe3GFZSt*{yBbi*͐a˂U!QG[?%JQD2Xl{q!ےI` s$X^ /<'x2ہ5r!˃I7tq)%4 +]B:`uʨ} v,>Sw]-?όm`E%|"2 +ޡ(MT_z=RDEѷOdYp2 +|ɡXk.cV|FiH D(1!M̻Cu3dU e w>9ekeK1MkJ3M:Mw< 6aUxxjQ͊ +rd\e$¢`}VY--5 hPNɹG4$Uq$AY 0^ UHooCG}9ʢ+Reg+j\}9>W9dW (097Pjx߄) +kδCg{QM 2yIټy2ï)r`/OV6RN_i>,)ƴiY0L ZfM`\8ΖgF`N`HY D#זL*Xz-!j\hNyj:+Jc݋P1YσsJΐtIwxW;b檷ý\65?Bwr59B 1UnˑN2SRow.<ٶShs +? [T88$LwIybٴ{s؋[Cw-A`+Gŀ$؊@ORd .0ʛ:ћV*d'+lI,gjg w ݴ ) +9*tI[?rS@|m$G%="^Z k0 +R`Lilh*pPFQ?$Ħ/:tE KDa [ҞU@<ڲdUt.we1 +MoަVr fp+)ooߣ-۹t!NMe4&?B7)ܞn5{ 1;#|?(t9sKJ GkcZ1prZ}e&gW۠R|퓪d[)8(gHpA9RGk<Uq?>$QQ>=I3c+2VX܂ʝe̫VA՛H\OU1m zz6 +Æ?@OjG@s7LXg}/99j l=MRU$)Rd'dVU՜SiM5!&>cU'u]ZA:N[q,2bX SG9@;`Pש@8;\R]#(jI4wrB v'͓L?n﫧mͺ9y.6UJ{\4[{?N/-r쁀.mهS3Ele5PS%?DpJʧPj~T`I˵cl"$iZ:З2$&1GӇYK1(dʥ}Np@@fi#@'>-|?f9wq6^2ODk 9Tz9p!(&gf5as:Kw-JRע`DWr|CƨQDna߾"I!T]&Z̚#&:(UhJ.BzrB95䍕*(:$ d$:mzY}Q{-s,#F޹gx}`-,ϗiZj8Zuj';,9nϝ^u\.aHZ{D1^_,T8L`>zĩoC{xm$!ơFq7]Ijp;6x.c&n*b(+UyLKA< G\J]iz4^,λ G;99m˫B$(װ2ƢmG$[yhlt0_Cܱ>Xg\ʲ\ /ǟԝJM#3s p,hKJ+6n a=!,-9pV` ;C͋ iP_Vhz-:䚲eD ]׽sU<#bQZ(D4:;TDM(3TLHNm_Dު/"STXW@OOد@tnb` }~bj*[<'8aRj0`pP"oS^!sBLgo› &P蠨i2y4UѡI8.V7/, ݽvb A9sx+)`oV qcv)I/_|5JQX:zؚ<4HE,fMb B? +ɿH5J!$:X]S(2$ɜzeCό<1.43vSO6NWճrEghz7J:2^g)+k}&W]a"헋;~G%|<)_SeC7.oĥ{+Pu{ͪqeJ]BJ}C?"1D2-DMD"= --<,;8k?1]Wŏ$ 0_U=I`' FH|-%avf\ +hUp/2歝Tʝ1dqs!k8 2^!%fBn @2-ˎj}-u=7/s˗w)|0ckz#~KġP)aSa`_,feUlߘHrp>ђH@MQ<]KPS:q46i,Dˈ^dbۓDzi&"et]*\$zpB+ՄS)mH ci+:B`0|z#qwG._ڼ@c4CJ b}LƧpIzf~kQl^f&l O;?<]u_RQnFE}s7h̤G +6|[&RΪf&ԝC0{ j) +bWqie,@%!n2Z^"HSquW( Ν" '\/ PV8SQwi\`ځ\Z݈ouhaǩevlηu}N mo/ČWr%jeo.-]s/yx\pYBA MY@p*lݝ}2dr9.N9Ls(vPf/EPTݤ!qԛC@C4\#޿}OC)5"ʌJAl endstream endobj 2909 0 obj <> endobj 2910 0 obj <> endobj 2911 0 obj <> endobj 4890 0 obj <>stream +Hd͊zy8 +>sRhF^#y QG#Oç==o/ϧ;c_mӷKv|~_oo~y>}~W=|z>{O݇q~?>Ï?o+~ߒ~;%zΏx߽w;>lp?(O?{wٸ^ PZUuTGu^5P5FjFDMԤU PjVjUmFmک]uPuNNE]E5|| _#_k55|| _#_k55|| _#_k55|| _#_k5Z||-_+_kZ||-_+_kZ||-_+_kZ||-_+_ku:||_'_uu:||_'_uu:||_'_uu:||_'_uz||=_/_z||=_/_z||=_/_z||=_/_ || ߀o77 || ߀o77 || ߀o77 || ߀o77 KG#(~? +?G#(~? +?G#(~? +?G#(~? +?z $߄o77MM&|| $߄o77MM&|| $߄o77MM&|| $߄o77MM&||3,ߌo77f||3,ߌo77f||3,ߌo77f||3,ߌo77f|| "߂oȷ[--|| "߂oȷ[--|| "߂oȷ[--|| "߂oȷ[--||+*ߊoŷʷ[V||+*ߊoŷʷ[V||+*ߊoŷʷ[V||+*ߊoŷʷ[V|| &߆o÷ɷmm6|| &߆o÷ɷmm6|| &߆o÷ɷmm6|| &߆o÷ɷmm6|ۯ\t;]~~߅ww;]~~߅ww;]~~߅ww;]~~߅w߁w;;|C߁w;;|C߁w;;|C߁w;;|C߉w;;NN|'S߉w;;NN|'S߉w;;NN|'S߉w;;NN|'S ߅w]..|K ߅w]..|K ߅w]..|K ߅w]..|?|x>stream +HWio7_AK f8i' 4GcE"5V9PwH18(86v8y4RsL? 2?]^,;+GG`W#a)SlayәiɽeF./G?7fd{Zcoxb5^oʹz>_'p0NMնJ: Fr#xM>b}yuU߶McPX˒zNS.obZG+<ɳS6 b+@M@88*.863ں /'boM MM_R0XH %V)L7v< o,)uJR_.UZ5m.e;pJxr\gn->d5{U.FubC@9tBO\7flCH%xV,>>'U^VsYҽiP0Pٶ_Q񫌌?֢|T瓄YIɝH,땱l`sĉcL(2,&(wY0D@#n"پ.?]$˦Y"4eWY[3*6Ǝ|V Ӝ]b:ghҋtӀ8 @C;(D>stream +0 H@&/ H +p3Y fҰCK w^|^b@ g`o$y9{:) uz`ވQl+qi>z eg"ca;mӖb5%bS>0^&юhL~Ů(Q l'#buggؚ1'C,@,y. BO|l`gfv"iiK[sWמYTPLB+A̾*IHmw1zs;F\uM14-T0__"{zfR; hi`[k7Ms+wojҭVa(cRO&; JjboZ* ϵ344[ :9/)~}x`zdnw aAM^qNGK"+‹XK{F$ЙD"NE)~j#yG&K6R尧tf{Ls ^i<d+~ i}4#}ia|=(^)A;JdXI0A/2\+!L|>H_5 @YK#фJ$Ӭ'Wd6P"vcZR-A Gr {D5SxE=M65F7<&13`rsGﮓLn$}a][Kþ$ Wrf?IB;{Gq_-N6o +;𣵼lV27~"@4'̙ʖ[*HcK?n̚`@a{ontn0vBx1|;"OXJbeDwrwpO ABZ"ц+ξm8/b'XHokjcbY gzM|G,|M>7'}ydZlu~ V^$6_O0]Z: ۄ12vvC7cxQuHCXD_.QSe~O#Ix R4Ը=f\Bjvʽk%Uz^bRT'^蓞C vَ4m7λb|4/jJ[հGS@[B;wQ!D_\gp.N.@oJȸkn]ˋT.4/ÊdqO<ּ)xoVEY~64WD6Q c)mK_ڷ FϊӌGzc`lmHl {6F +?5 KG>҂CG+ROacB/AQ0Zy~w4}:K)gKe2*\;zjp?E?:x,2m>"@ roy=ɘz$)6WѰDQV#^[קA6ʗTd- +/G6g/e!Ë;}vB) Z J1Z*P_޳3v1P6GOT,.}D$\mȏXx .p9s?ض7[-R,qYB%n"0,/B՗ +,wz?'Slcam=id% 23)>y.oۑ0⮅,<5hbp[J8K癇U64Y7(2g:@^8׈̖3b7xyO.^OERR ޜ~pS2+1ldL@uPd?\۶rRڇp)WW>"-dϚWwpdy*yPE:ՊL'yD04(8h֚MwWMCK*}7l%ПRėx(5]Ua_}mTgf heN!jg[v'Of~^"JXu 0ySR{dL5+@?z1q9f0 ۴L{pLEKa8|:GR8 6X f\ +9йZ}W72[2 [+"\kLt+Q&5GuA|L#Vg'Vнk`$w4pi9v M I.c/4IȀpU4Gǔc4 WּT0xg !v9L TEᅧe]uӃdE3#F뜧Ǒhny r0V`ET2#s{Ps9 xl4[LO*q.uxe Q]FAe$4^3΅?Rw(-I(ۙAX!w6v&D:oy` U(va]hDA&=S_연|b0:Z|Da{|?45;*xY8BgA R/}d{P~//ˇЮ T%*rMf߹Pj(i$V_tPay\zרS#́ԯyk3.4ɋs'xYv>Pr#/Jyfu"7-RJ LQXBo`EivѾ ł$Z+b6B& ,J%ÀҺ^XՂH|W_MY2 ;sKы]G`#ĘHF7<WslSxta+YB TDB`xZ=?y֬KhVNS}E6n4y-jzQB6 )٬(A$$W< mj LGo}/`SP;\JjOeVIcm% +J /W0AAYiWFmaׄeX$*4ݘ1fp]ȣ+c_"u>B,Hn X/Q Bm4_Uàd븕T%<~CƼ*sxc>:j;k۽佔[ O言nY^f{5͜WJȨks}^Hj+ :4Z1?ܭ<d2}C+=uYfвeY"6Ǭ!uv5Sps60?f:4P:_%Z*w0-U&C*)XRy;d99l469`/w%UqWxv1Ly r9DNYLd<;bp;+~PP }u%=ҰEpSșf/As2[7-vVx(!+!viE]eJ}!l\]̺exsBN6 wXnه, +rv_=*%؏*jd.-[GnW 0mlk-;no m]kL^uw`HR=In%. $8$*t{-0f24ݨ,|2Envj2:gCimssaƁ9,!}Ac17*4z\yT ?h!2"5 +ΓZeH O!X~Ciլ}d2Wnn+O,uٻ\ЈӍ!,B"$<5X"3N ق>iLѪDvS$d hӖ!vzUzg^Ohb,`9oZVJ1+i|"*ZeI 6а-qPfZE%cV7,!%N_ﲺF*-xݹ g<s5{k,GVSSA H!%@C; ?Oj"i&I\5jҜKPNa { +q#{bmR(+Qx/ n_<Nl&_4DV2âWБ=5E5& Ŧ0BocҶv__̠O7N[g"ՃX,'QDF̎9KK,S^t\ a@^vYaNs24kϋbCڦXQ_ w*֐iƲCHF968tB'le3u`@@ep \={6iz3J$?$!ux*D+NCɤxt[ ~(vSpEWրZ N?3p$ߥ⫝RU` q!0Irn|_h}%thP034a,oRΰ;ۋJN7`9i4|s_캦K-N`_lCc `nT"2"pAݙ/RӑS +W]X8!+d1oBhlmDu~ {Io|X*=":B/:gb匭'јH !>nB{QЋ[ʠ"f% e rqZ~!Ŵ]6UNQxgW:\1@"J>lUWS>?]FStKZAn@v=b.?7),9|?]8XEy בؼHS6QuPdt'xsĞ;CE+0tbf`;V8^_ب9V74E NVgav,T=euEi6X)@E$|)eTjlPr@L?JvI>krHQZj?fOqUQ|iB{+Z\,lUz;d +=h@WiZ,$R{ ,[@ֆ5&RCU$_e R*v#8~)6d_'l`a>G$E}4ddE_V%b\r⒐qX:^lzgl(L \nA_)2Ő֯9c=Bn '9u5ԼO"[C.{feYxr='@G,q\՟z7޻DS{]{B;T33?.61T~ɷ`mD$UW|"]51 oUtW4ZFWqQrIjG~.W;i65(leE$ԢPPPd +sMDEkOX|JB 7$椊5-p +?W +U Ief{>:m>tv\@7M1c7B8=wFhj]qWAfn _Ƚ!" }@P.)cG=k>'Qj͜OByQ6DYz.50/o ^#wB/Љ.GxCحO=8>#m^A1^=gND*wVh攥/[r_]sNDݜlT;e*zHI䉋qP0vXVl͎m)_6YK{G2Y20;ˈu U‹l6I"W[d;e1H$ڐkĴj8 %d8W7[loL-KJ(ζL6-[0@R$ҷ-t@ϼZk{S{rf(z:߈,Z<^.TEKi\SFR?ʹu5o aY} sB+sT{Yx )s%pnڈ8>?Tsc2Ά~C`5r+\<"3f,cfcw;cZri} +'A2@z5[N@q]I,R=kH*w#]}U M6-`{ jqc~1d:cD ptH]J;OG[eYvG͚ct0'f`e.Rxi+[tH`k{J|m}T1 f* jc +'Jŏ}u}c +VV\rd>rIiYɞ!rt>UaQ6vS*S0(Q`Y7|eE閱}Q[~d2fNfO93TMR5ϕ!o]e8`̌RT73Y`AEUtpk>˴KoWN!YBE]Y(]7UXVF)Y 9Xqgo+cƄH6ڿٴط_Uѿ]ۡ|rdQes'M&{sZNZ@ +ރlgr ABwU @Ќ=WH  IݟIη5Z>XBR# 6ڱFD+cSb[r2'wkn6JFw7󨔫3^Uint݀gG$Mw6;QbDo)oMv49d&'OlЬT9dD<>A,bU?¬NRJlT3 .K!wGa԰*ng7(ѭ*g(93 6GTP_XQ2YGI\y'_|$qdϵ= ĺI qI6|).\9F.SFdWG=;+8a/D"d=HD5!1ck|.|&[Io;S`x(܎pDD=|>.Hj2JlEa;F6R* $~:Q0D5-hwːeq(iMKFGD5%DyoE+aEPv,5j}Z0Մ(F +WAk@f^GbGіx $c]' 1\FF2Qf|M2 (SSt|7/]6$PDNp Yw pRjJL,};ۛ"k(uyOI$L=_?UIf^S$ѫ 8!RL"[,t@o[kv`?cvd<-}sPPx5z^qqL: n;`w#-υr%?vDW+xXw$ްr }"wϏ$OqXNZBm@uzX u ~L@.e4>,jlL}>7'oo!ENhyQt5޳=SQ^/4 )$J9F9 <[*k%xMR޶l|Z͌?9Oj5lT TbUO۰OϪZۗ79V~G΅s%.e¬͊" h\zV-䏲Z*1ct %|cI+RVEG%$8Z(PT3W~-UJYpm$ +jW*!qY'{7^"ahgW3Dfk 6mÎfaZm}n5F~goba̜%f +5_pUgs 8u|- ʜN p] ^⏳ɧ:|fB!N*B Uj^w31IlMCV!7?W=V}]s[2<B70'@VDL:.na9omǘ kr&Ur_X`|((i2 +"@#7P![LA +֊kRUadj[ԩ2\wT?45˻-n*B"Җ]A;Yq.v1ƸNHz(2e㬤mk'W Zp0 ~"b34μI 7'YیẈ+ii7ozw, lQ?]o(-+לeuHw~/t`6-lO[N+4e[Đ m#pX2z/КZ 3'~|.5n7R@\M ă{僥/q/83~."!`!+iAǰs <ؐ oOIG-fbZ\7| ,DBw}؃m?3B;zeLj*:MGt!9^TȞzf l~Iair# Ջ0 .)}) :k|ۨ~|p,qB`:)HNJ  DfP8t(3vl|m'6L =e#%9@}(<7X~6E}Tr96R#wr| O~Z~!z, r!:Op-90̶ ʝîϖJxy 8н5!"2粼Qr_Zc y65ȏkDKrfAԎfxH("$, 9e1T5ѿ+zbC!AAڽ9~(HPDh4?8tb?pHX=S:>}sobIPP-kc?6' endstream endobj 2904 0 obj <> endobj 2905 0 obj <> endobj 2906 0 obj <> endobj 2895 0 obj <>stream +HWێ6}i)&؛Xh5mx[x)J\E9]PjPO3A42;x#ݼm/yz{rC7lxA LmlMAxj6JwCy|pRvP6^g"Vƛ;7n~q`;U\o`f%4kz߷c8T͏?|6p^}/)P1 4M!hAs˻f(??]rr@v_*nW1uA|z,q^_5c̲nS!󱎂HtmX'˹w7`* j8wΣ M*~ʷ1CV1#9S:OOkhhh=yBSW}FDK<d̗)|zEi +bh6CfʗMOVPg6Dk_<_ +$f%N s*_zpn 0KK9yH4rMŎ9s̥ts/clfG q"{nz&öU]|R8| km;"vPcv֥ߙVpG"\n=ʳ̡<x;[_7 +YJ/[E]rHx%> 萻9/0Q!<ɔr 'z]]^Qct**0"U8,d%I +ȄG_}YKc"Pg8uڟTI5~Xn +!Sc0IŷZ>Tr+sBxeCe$jA8 <H +KX%a/Myu%q5J2S +Y[x }R\|BǟeWW&rtـSm^7]i5S_޽d +R(1 +XT9щ+t1!Tq١^"ַpaim}L b@szuڏj?Jt@Sno̞ⅈ~zl\8|` a,9iuq@~*>nPvbu?Ms/DlfH`mvETS"IN5cuCK/EP3eAa/{ty"QQ3" =ysL&Xv:4~aS + <0Z0ìG(HNJsAO_lAˍJg{X@fb ˣI|ݮrNlX)df[}>>0f*Q5 W-e^}&fƷ""LUx:@1!.,V [TeQ7bi׽t n/T G8<5\N>+kNi2 +Ycao S AL݈S!KfXc9S=&"3y_h"OUg=OY=5e+w1m`V{!i/ָfC+XZ|5o{a.ˇmq2/?SbG=H$ ,i1@ՀnbŽ..@T1s3LGВ>>a 49Mդ-* ϐ ەR+6۩k?uMGn>` P{]7u(Z?EF`Qus:/?{`ʡn&<)W"7-3 uݜ&qEQEG̪Xe@t1|@+Uᶼ-mߕ=rkh t#09}6%1EPE$tڟ;Dz"Q+,dI@y&1q)I_S6M$ AGhS9G2![>stream +0 Q@&Lw QS?#,QGn^V^U{1)Rj b%!AS13&Q%v¸Xq^k_;fod.3;N۾mbBbrtVF^xMP.x L K5NWXQ{;Vlx:s`zի3l,<ζyvذB.߇gqYnjS-kͰ,Bp +* zq`ԯH.r$>濉_Z#-@kbkFp}w2MS2sxߵpM|DBL +{hpSH}pAX;c}# sFh$2b>h,c4~HɱZcUjkO[K0 bdnON{-U*(}jRs];َÞ XfwVHDb$p SnSw$?K^6Z>#҄~ↂB9e'm^NȦgCzO(_uYTS: q=hfd U?G, ӧ pCֈGBڗnD9ڦ|B1/Qdmo u-<<^rp{?_j9Mp C~]30c~Z<ȹsoM(\|Dw<C3PlUٗ|z9(Ĝ`gF +f%ZǧfV~0`{C^!`PѠxsj Y(*)A9'7&n{jr)vU,י4B[W J=İեuJJT )t5htga_Mej%DzKUW~eN)p^C8Rr u-:l5ʳpI[uIZӃ%3G8wO`&qk_Zڇ$ot ?Iܢ|&hK!ݸwC |hmqE2$ C>h9tʗT{m8 /@7SC*l]>X%+#A({Wǜ;tv{u7kⶐdQ5oN&Z{΅"灭Y ^mMaַaZn;x"K*RV`*Ғ+{:(൫0cl&9c$0rfW_C2ܐt+ L}W .wW%E7:gUJ^$b)zGc4rRǚSB2hYnurK蟗 LE3閝}nQ IAVN Slˇq펵d:+\*0L+$IKO6#k"u(}`}0<>W2&]_x7<LM}fj7>=d-sMHSX}"~,^5bb6@x~S X22HT)}wg;gh/g}̘Ջ EC::q i|D;ѕ QB{Gh7@[ 6b+]3[OR&p3jtMO[#ߠB11ص{}Gj-EX6_Ʌt1Z:+RJ}e-TTbZܳ4ؤF-,+$@D:}aPWOb7Fx# .aU)9h_&m2K)c?+ 1!JW]]䋼m,v"CJZH+&&M83 T|i>\#\Df&`@!|u lP^8F i3X +NmM[ϟ?B΅Ч[o*i~H _J6wyws'O}~7&kHkq%bI[AEYޙmw@yK%H;N-xwƖ+)2~݁F{@~9ǒ vbJ>(iٮ|vŽv95hwdЏ{ ju}1Ip}_ţ%gzCl_I.g1Ö#~X#+~gM6ܥCmJ=+#s7yՄIYk5 TKYL|8pڦ;nmϽq*ޮ@]U!5GL_&KE،tGP +V½xA?n b儳I.e"4'={M;Zk7٢q ssm῏'f V( ?3ƪH1)—y95 &NE]pS>oj8~Zxc48JWB替Gh\ Ȣ.(rf!I|PٝsN #pf8uC_*`̲hQ!cɎZ AcnG\І,\7D6Xh_wBS.c.+G~Bd`F n>*mN|"~.%>A +O" C0|{\{"h3N]K@:1x)ZC"IwGX)jQPfa7LaW`ZP jⳫJJi/LFb[?=ƚ(-ոl9lSw@E{6;݈ENz>tx|/ȺmU FTmLO1Ҭ_kȊxâ]wF,2Zށ֋]nn7u~2t,tO>ߪLj4>LBGDø>A$$f[QO;^G.GM*uM=G3XeYirSf`KѫEw"q@si}My74qSС2,y^f@У@vw4xP_W*jZsW)?f OYR$}6{0(b^# +,C8-j)vs| {7!Dؽ}»5Iepg7v! ]Tl'462fAN1FV~HQ BH<)"h ֗_9m7}>7U/B5mR V=IEԩY"`d- "V|2tΧVUse}xb#N sIFZZ+h K4mXq s,Ҿ}y@Fhk "5`Cf޺ڌ9GRyD_? +"ζe`xnb;dLcX '2Z+̂yۆeX +8xVJ-FZ>71M"'Fdo*|ֻVEbcRҁD,߇E݅hRPδ\Y.@] ^RfQ1 +8}Sl90us@d<ihHxa`W 8H]"g,[R$hEV'Qn)WdՀ^_JE`\*kwZ +P)DȤdf-HfGse"]i:S^ҌUY͂8*:6=hc5ireT-].!?1Ail;w&I4w+J8pI*eO2ImAMhP8zgqY5Tw !CP`^yaU/X ØỶwC󹞿{Ă6eU$ ޓ_E5Yà/}=R iGXp:-(bPkr(ef% O $[c]3?Š-Vw[ :`%i<,p` x 6 40k +dE2U[?4tN~`zn4Zˆ?(9vU;XxԹa47zBLt(|\2VX8lkSu^*cD =-&K뜚NijiYQћ *$r- lV-3>׼茯zOӑqsOU',r.$#DS֍;ƒD}7 ԫY JSwgگYDOqa* KPϻXpbeP7ƲݗͿ'Cd8kiL K&bسU&yd@FLuIvzsg^$J]I'AΑ*%GEYj[(wzk-Ѕa[=|1"}EϽmv/ث1xIXb@V1:y*l+StγELcPFp )Kc;c ECqGdf=R_@V3 1D$9;3_j ?Jo6jфs8'A-!x[19b= NZkSm &b(be(J[޺roȐ0W'yt)ŸrvHbkaf.᪫Dׄ/V a\]}@ڊl9=Gqfb__[C%Pif, +/l- f1=YJj=#٨ўp+`\grc[i +GOz^r~zJPΥwZZ+[+ս' +Ă묰L/26݄ ~aqop&HO:`sȖ TDKqKRF(ϘF!Khckv~HLח!Ok sjd4'O@ŔIAS;b*#SD[4$YTfӐb\ղ=Su/IHܶT@0wǐX9^ߡҌĄ}owe ̷`A%=C _Fe[#adChE'ҏ RŞ[֝w߲A:j#D~2t ;߉ P$@#zT䀐Nk,xGXQYFD9JCԞb0[mdW%a%@3rs|ƣ6qSƲVNTCIfWi" 5@5Rv,ƽ3\s2C\v\Ox/%0w + +"޻wgtEL]/w kmg_U'N_KHU9\Jyڀ9+Vpk@=*W`6ƹ.Kn[8#bݎ|eMe3Ş^eX +wZVY} 3#O8m|<~[\HԠ~ߕ3qCa9X(!r9u9A:^ yv=⦈ kJp>E?}R(m4t :NGP&enNP+XQHyk!`sbb+]r2\ϧCVg!ǫ+j"wyM7M 쫅qn} EyW +Lpûq &%,gvתnCzZWY<w)΃qnL>sxto.is<TOA6S5/ҜV{CƊ!Rvu[&.D 6'NXDjݩ+t[zȢ@wj*pn"G"fyH]0\2~]‘/ q Q6CgzJe. DWjo>)0w;.m=+$ds LN4TR囹vP% + oL8Cy*2%;9g ֤bidA \;Eר9iPc{/~ v]1 +VMVS'"4({yKzV~q ?Gd1JpvYUkƉE;5Ƶ9c5N*VcԚg Rm'Ш6`J\`#6Ed4WF^ J!+=f9սM :m1u9ɽ2w0| {sWi; +yݻ"] 9ؚ Eu;~ߠ$5_ͻ«.nI y|l<;*>hzyAagb~5y")it 4 ^.G">kȱD̶g/-FțhiŪFqҖwwSQbҐ儀J a{&Sc.uTf. +3$~U. [MW2ZN&L7D.p + Blr1COA[꘸;{IfCUR`GR 9=hC'諍Cm3}; v1ü9֘&z D{\(Rx@("Y1/ÚuizI_mǚ pߣeyP&'^|Qj|# +"Sb(Zx[;VկEP,j걧>؋[N +V5;' *Z4r,`>ޭPh\^K@I5o[fKKLf]_#wNVQ~aNǬ#L$ +vp\>]kpV_cv[iNce;Ԩ,]Oc`ޙusXf +D3 ${\T7Lwڹ _tE\h> h 'ZYZdi>=  <UFJvMBgi @2h)2߻sB2KG__N 8Tye~V*TۀӨܗsL` ;8}YҗѺd-1?8>. I 9elfK0:"z"$"x8ǒ xEf4`{k2@`^nYXqtWrMsvqJRJÎ{sKޝ#PBSڅ?8Ti\q薂17LF DY|ۿAkbVI6>j^yït&J`ZC &jy N4grɪ7d{hю}*6or?e2ȢD-\7* IVؒD,[ " )"Ni{%}A5ll+PxڱKJW5n-"d_~gsDxWݒQDe  W<< ،:J6byAyBڧ8 `7( Bg"0يED bRwr]xEÜϵiFf:yc& I狼$:^m9ҜyS[7bKh_~9?Ө4C|sL/O P[ç@$XkPD)~q31ȳeǎϐi;ۓgw hIEd3(zykTqKfO8YD +cr C +oy !x9\1|! D"ڊKiASaN$&A@mizn/sm 0,9>GUi ] +.G2w,Qy%yKR/:eME_;<#+&yct@Ҁ܈ƍ6hc#,e2V'&e/9X´pLkAm)O %rB`W;Y<6c LRYʒ|)>_NtNhJ;oE; e햼q9&%$BO Z/B>Z^v:;2@l@{- ,83Dw_I䀰Ukh%K(CJrC2(*k.IU3g~8b83mEג~E >XqK@2R#-u; Rf l mQRq0 +܊"h՚4 +;X{8kѯYs֤4Bٳz>>F2p4dϕ wx-SD|{1RL D: +e6ډ7hZ;L҂q +# ̯Oʯ!̲R&prJȥMKPq^\0r0UHrJ+1Xs#9[kKo'z"⩼ <]ze(Q1%RZTђ[–]G$XvXK/)tUETu^}U55!Hvy {Dw|\n sEСuvAu|{4o=*vGm1vDiChNԕ"Gf†ES6nl,T`jhJ`y{7 +Q&'pYMKV#tJ[K#n)HCF:TKY CUj=_^d}fZJ#&k5jU|նJA t`O{ TlpyU7^!Wn'1G}2" ??2 _h]}q*UK>a܅0f /?fH`%̞>M vmKn/c +J=F`N7X׆I&Γ +a:KlFO!Kb">Ri>n7a@C(T= _n|“$5X"gx+ә?odɶsd((>[]Ҹ[ލFɆu,LAmRAweM2އY2S`k>Y5AL9a MB:qy[ÅJvgfBdF~ǁȆnNF:&]DzvXIn%)>]rM,0ź+pTL*w hGL9#d=:I"EsiQ?{d?Eƶw'8j]X9Y~|8c? hXlc +._p@ 5QtPC&BXh+^磝An GXI-#*;$bO_90FLJ I15IWu S-y]/u<%%Xߵa ӈ7Gv1lٯu{۹yaVOeT@@o NQX<- +qq!z5s{8'+~~hǯo(w8zE~񿟹W }׿c6|Q2e+gѣj2' mA1R)phP,Z9ɕ>*^sxO' 1\#LQ萹 'Ձ%ei4GȖ0`/RmoaZ܆<Nj?lPKRcGW,Ч}^M}ZOj83 +mf-'!u[ y+$R*>&,dI[ 2&~'&R&⟻g~ғ7II'ML0{Tŭ&VNq66b p @MthŁ̙ARJJУ>o%KvԈ+|k>1Jt-T7k8N$F$ 208l*t_%zduGm5#CiyJ} +VG] (/ (%9qNjD4>M5b1bue @`}g#ml([vQQ*`0ke$$D(!пWy3҆m} +=~a CA?z4f)#/R\! -x[ضAAjzwPŏc~?bCv$}lV;oc_/FZNgc}_1TJW54TQ]|<(B]&}9o6. RqU {M~Rٌt4OȵEٚ3\]-l=gD=Ѹc'phwܥ"=4^$V8tUt?H~jqW2T,s*%0l hc}~%@woF7CXq/r~AQ3eU8bX*ɍպ 8;lrcV!=9gnT& +DC\nG¸hW1p:s+Ut*a٩Rge9/f"ie>jk{ T Jtf+,.;4GܫA}m }{)콄c턼Ȋ:hyQcz޹e=dM#7kWʗhQ3w-Ss++d V?dS{Z7Ph]8hz+3J=' xe( p^Qz*pz=D̥v#[2HSOhpCKtuu_ `K8+ q ZYt=C__Qv8t/L&zWpɿR$xR\-N^Il->(A{ >pq| V$bXx*yAfAy`f-rB]Iwv؃:0pب+=y?`H#jN5}w{.gׯ±κY`p; ۃQFWM|[j:O4i3=bmrEnQ2֥̐ex֩!~2%1H;lyAk8@̳{D >;mSKjeAJuLF5K~nƏ54Bf^v Č>6I +[k+r"o\Vm5pC4NK47kƵ,ڶ>Co>iA<~x TXD6`VB5k#@ctG"g;v#ߚ3i R2FE%bBC\5h+JY?U/= CP@wPˤ˛3p䣰_*}ߪ+}q-?lH:`G܉ʆ% V}N[$VGScCYDsWk(P;^uo!4&d@ִ-A=/qVkcĕ_Y*3.Nٯ>j(eHXQ+]_ ( (<~K }{i "ca ^ lYʈ˫k.zSfsp:u B<#.Lk|w2#00ZN#L=2w^hcC?NHzod͝Pteʚj<^DKMIpϥ5M_$(qejd ,,P  l` a01gs4vZʇ(Ov'S/9ar' #zs3?ОIT2˭9pbgu>B]>֊,Sj|q!7@xXF_ N4NW|]Q#2@*SmF9iVb֘J}a3qwRM!N/8&E&/ ?s<.Rפ,=DẸئh /@{w4<#j(3?hjX3 +L8̱.1ιyU.j/nu>8~Yٙv\J%O!>x݈GT V'/wc.8S '6X`ePxJul# 3WXnK{w&^Аܒ}*}$[[#lV 9)0"g i'D&˼[|TƉ!]h#8?np c[)HP&D)Gԧ`%\r݀if=gٚvxC.gI84#5G]z}ZXW-mºO-(ف)XEH$ ȯTA}:)e"3b.#Hռ|\A0>blQ}Bi@xqD^<V4r.PK&~ = јob|:HᔟĉٺԾާ$jsMz$пVU?4/& gjq%!OKx JhNSA(Nzi{}$J5g`>h 56 lӟQf#/>ZL91,7:jg[[׵!tvTOLZ¾`xDt\y'fU^`~RNO\̡%* TK [7@ ? NڼՕ@=+BTP?0LV3i# eYQM96>EJ!G40߬zo[$e9Lbߤ| +m,<[ Fp-3ğ[+Q//B(I93{ iBA^.NCn1n􆦃>FQۛ3J~iTn*/3IMΦ^÷(k;ҁ؜糀$2#t0UpQJlOK,垵 <RaWt2gۻ$D;GWjލHLsW8! ԾB'7k7=lPB ٗlx߷UY!Z\TvM,ȩAHMwB^hZ+'.ͤNqv,7D7.I1.SM}+!%e'bD tBI/$/UN7oO[It⺻2s$UHBMf#OTTq\&Gek2HRMSc@_\ķ{44#+T=RΉ~7:8$=GOjj&`81y;X(i91=(A y3ɂ{hy +"h)a/`c믶CW .ݸ\:ʴI7O2}^Ԏ32gG`m*:.uk(ʼ'FJ"ie^BJW-3c[ ^@Ԗ@g!g ip6{fzKΥs~Yx@%?*3K<LkԁVgW@M—1lӺi\.чV`I?STćFF2zq*ëمpurz9}qds?^yvA)cta'2,6Ea:"rȺLqe'OYLnl/`C*:Ҿ"tT:+ly C"FoQY z)6 J? Vd20hj3:8Eo $yCn=]Me?rpaЊƎmk +LVeKvIboNw}2(j.y~s[-H^8CGY%z&JmK+9x/4^[˱^]|ga +E&xȶĩ޿A^*;]XUAryI bfnZ~4B\a&L@ypʼn;hʐ25&-&z)3I@nDHC+/^oF`0L\ԴI5%Л{ao,dPw}B{UZWɃ#W:'Si@\B됶@uUHE?1u->RGnNe;@HLe9]DXo?r&!H&iCcw02hdK!Bâtm/̧K 5GT]$C +P?4MOQӲojqfӥ-He;êOJ0)/<Ȏ>=ODZ"]?U ~ $tiqoƝ ~m^C݅ȿGӖd Q5;irі=1@O"ݦH/zlEx7(*b5EP[֡ QE?ibc1\=nB5ZY~v2ګjkظ]T]lvs" Ab1{ xL8IMmX9`fak}J,RP.$MP.9L9fyh;bY/xTׁRiOJIPҚ`@e}ٻAu3G2:m{6/)R1y4ᅪ\&fa? endstream endobj 2896 0 obj <> endobj 2897 0 obj <> endobj 2898 0 obj <> endobj 2899 0 obj <> endobj 2900 0 obj <> endobj 2901 0 obj <> endobj 2888 0 obj <>stream +HWko6>BX{3|?@ڀi׃-Xcݱ4dF(QO⽼s` N1"G b[wŇ'_U >fqH*0ߌ Fnevx$5[2-L#PHL[MޕufX[g  *xF$8'Vg\",3A%b̙TwFW6{wgg*4S$E|uiG"D?˶Cu2PAPfRƭ.H t1t~w8R b]ի}ժCQFF&ܼEp +J`O11DE=f[qq\*|8|8$D)=!Lr{Z$' ^כMn“ AQZYKـ7H#9cSP7MDs_ ]sëHl[sG}F,@QPsmnF,10? P L<',|J199O}p7~T8ೇWpp F5&YED s<"b3 GWٱG\>pe`R鱗6u[[ E)c/b]O~>*&UbU@81 Hӯ$_!'&F:u +6O"nf1&S"5G*` BD +<o5sMތHrcH`5!BK̡r-AgTmyo11dy{⫍SgJ*ZO2᥇x87i?Cf9 +1n7*k +#>  (8֗CG͘]G!j@<%hr AۃNz`8r֫gI82 (]  N?/W#\^]Z  Ԁ, D 0'\J#h 62?7mɩ FzIP~D2hݟ $6r,II9C9Y7%\eSy@A5hTF 1e۞+ | s'h$$pӀ*|]7M@譃 ]͐")^Lа80Ok#?=;NALƔx XM;@*VL5<*'i6?# kDNbit=^|1^H$2KL|v#s@, +<g{5z:XD%#~>0*@GZı8a'd. endstream endobj 2894 0 obj <>stream +0 M@&7 M 63;"sx/m6N"mQkn֧P(IOh DI1x/%X4X%}]}eyh]ƒ^uxA.*sQ{:P=MiسQܓhW ~<[T?Btc6 ȸ9O6u4kq5D$K8+ |)J3Ψu-B]|L2m~8S1E.ZQjDdx/Ҏ-q: U|SٽD՞E7F Tz6KYJA:S` AZvYt3A245{J=ε©sU(z]3|{4DfJ?  };V< ]#GKmjub{FTTB/>uh_Ѓs.XtbD۵Xj/~wuI{85F8?6;g`ALoH=E}`N V@#{yQ80W^e>{}JfwLLS Fz3>t-醷/r҇*/|}$h9gK9 Px*݈\ޣx <΁FSx\xJ^R J_L;<m#d34Y[YS:a`yG q5C|Lj>_}G$sX[,2R42=B[gv[h3Z[@&職l A(cp}IYlȸ@9~/ч"{"4 +Rǣr(vqrIK,ޫޝbMQba;Ss6ތ% +(b=YEw<(ݴ $mk+ʱפwB{ 蹠;U`d0gmsp_|oX$`2e i{I-ٸlOF|!{h/teOe.ON0ę^|m^a鼟K*C% 19MJ9؂ls]'.>Ƀ5X̭Us +@Oۭ(`e UL9V8#jpoit6q_\I<)Η%GN8|DO/)"+"u Vdě a/j;_dLrVr= ݥ'ltjeHSȆԈ?QMJ3y!X9FM3J9Bzk +Wp'|iQ, @N@<;|-qtp ѽ_3!\ t1w'\4(mՎmu?*Ѣ=|-hݦGC^!5ak .L|1s 7,[F'e)I|:N}"=AbOWݯ.:F)5; ٖ:n { +7e-L/9b |#2PJ.zB Cn'wd. =1"':L&HAU9S2[x?/8z8_nsiVޤ`-aE&U5GuVډbMTk qaO_L2(|d~;*{r\ܩ@ٺ,l)S+qK~YubPj}Yɺfocw }HAnHė_bH <#i/BТ7{c;{> 6vUrNj[3/K +E뽶:8h/eBs fCk蚊3am(4DW('Dؐ-X֥A眑OdaC=ӊ%(ƍʠI0NEƶƜ5eǯU Dc9d}/N."tE쯻Kz$י$6U@8lUKmٽզW;b + 8",:g!4YF Xt +xhrcEϏ0yO1+?":pƘ2ƢEX7!_ I^wm4Q7W4WI-13lHywh$<4)iB-Nөg˴\,h*|y6Cci荶HB'DaO6~ TPD) g4BWQa?E:ulUR:X`훊iZOݎtYWJ x 7qwUfa걥!k cgUq?.Q!7Ӷ/πҟt[2Az7\]Y{w hi7CBEPT^gT36Y3ɔ{=$Z3f,i`|t<< $vNw1sBc|ǽnc8Pq e^e&,fIbBz 4WQ^'R-:9 Hgaf1>J# |^ `Mf\x:$|^,3:Ss3N mZPn7o4'l:R؛96%/ T5}lm@L$g Vgxq۰G$v(mb<ۍg2bpo`CJuJYH+S.Fz2[k61!L-f|Y< -dI_Ke'\+~g@bT +#Iv-ȕYu8͔譝Q[7Jj"{b?i,|$/l4 +$qE-z[o 1#pMyn:9@Ә.ʺJu{ &&]ȏ EtE8ztJ[jw^e[r:@[T +kG q`~j\ag,hV^iMaX/aa)hRvfT˧CT"r9تwI@bWs9yjã9? 3Ov52{|]o\I\pyhs<9 G^f3`˽ i{E?#5l]N=m&Y %؇M|)Z9}FGBǑ!(8 ޶ We@~19ih>F_ Cs(~lYmPǜ*Kt2(T7N: FN{I0q%pM/NJ:cd' if7/pJlB%~$aWnץG4z ML04F,ausǐ8ut.J~G +\^1#C@cZ/WCxwce4˅N瞋i+" 80<`Ȯ +<"K"U0_\ s+<-]~uuzBdϰmjUXȰ{5 Q8ڷYJ+Q򊗉?5ջJHϲ +Rjl]-e25f8= ;ϜvVrt, _q_O;(L䝷вu}[n&SIy=;9#e. 0F^N]* a6%H/fn,(YbO2ߏ&Qt u倷1 ֑]5H,)j7\ D3)+ +Ȳ)bza0ݎI(vMkd)42ƽ^A;"Rjwh4sS+Z%*k DN͕I2әdxS(q8 ^ZD7kDX{8I)ER"DOqN +œ7 W"SsIRzcN`|flגj !A Ŕr*F&vi<w ><̀SatBhقߦ֣jWD([x~st5gI se+)#g]6]aڛ YHᆜ2jZ!wuF[ҕ +*C/r"z k}.费NS*CR`ɉO?FQoҽT]Eafx|d]^~.($$ +g)[޾LzOs 5CbW-1u|k9eϼLp<01`M޿U|XJܕc@yF@H OiUc!wuv>UKpYӮm <*fKOF<9 UhWY^T=1Ϳ6ӻyW. /բ~~撠( J_}0fF 2}< +.kAwm T`_w4i8UX$iIlĻ<@6כG^};<BO0|9Mȭ-VX-v˰ok'ݨ:1E-h_.V;S!6L8:S~V)N,: ۨ +(y4xj׌*S.u2B#pP# @1 ֓ 5~`d2uk+ORb>P(4[Qym$@ }'hrp*Óe7 JYo' 0 +i+6i?CiW"Ѷ a7\ԝƁ`ZZZ.Y ڑʼn֨嫶o]@Ȭ&Ds} ( ӳ/j6SÂ\-U͙SEwAx$"..f\JoE&!gBvs& B^Y;+{!^BlG MeʇCH1j耋֯R 9_ں:xZ+n<>6!!T@ԑ4oh y [=86iP*g(N@?|Mvu]rt)q#-ZA.wU7p"nؑoƸw\.K*Ď+yC1x?'wfޛTRlk'S#Er\-jWAL܀ c='6cqAӦG׏eeKxkN ',]ff9Ϣ/L8OgQ;:n +8xp'%0Ҍdc[&ĪgJq$aVځ 4eA\ +[z Zb˥ oAq/.\#l];h(V~HEa;f(Zԛ eRI'5;oz؞TWWY;d^ +&B@T4QzȠR)>kc!9gRʼn-s@KN29s2&4UJ&tLz:cẌi,hKţ+KD~1g";%u7[Ў7|vRBw[TrBUQ4iCr}*D9=lְL &w.ĩ(,Tܘhml5GIKe\.F_8X 3꼣j>RLVnM &bN?L_0F"6LQ,hy4KS#ˡuac0Pޝ, 7xO@>+JdK=Rs]IH|uc ܛUri gMz^ycD2tWvh6^GFSx}._PEI;yJ(W?wߜ3@hէxMD;^.aVUE+W>.> "H"i:v,#<88Ocd2,i#^|_Ikg'rw;İy=/;vzڄ93=p8&[6@P@d߆OeƋ{!L%8_l W1F +|_maymeLc%#hsE͸n#KlG19$Td!f(knUl՜c!A +3W/-_rGZqrbo:l|D2$k͠O*9ufg)|}a:0TM#y,vE` 9J2I1sqCVJ;u 4P㲬 <æU6΢&.I<h lO~l\é[WU1zM#![xyDvFVu u~@ zl~g/&K᰻pXCJXr-[^ÁB,Ǫw͙a% j&qɣB`e43~G6(#EX̉U?#TZMFK Ƀʲsp Y1t? rdc#~`T6UM<(0LfCq1>w.bq?Z1ϽD1&جu)SpAfmgw[G#Qޥtu:h9:C)`V:?uvKȻ <1C da瞓Ȣ Jyj._ +,{tFy**HRt$,fm4MwYJc (7qýH / `+VݏŤ6_)9.䥝oi7cf%3*?_>]yi i`r7BoQ[5eF2н;w v:lblIBqVf:Ce6ʯQS9iXQMo=ŦqqȚ薏^1Mn af"bf>qkzC|efPP9J922 Z݄C{@du>^ +0Co'ҹoL<Ʌ5XBPJrK$SO\jOoOQ@E{gt{-Sq{#6 +dX҇hQ~GL ۟H`0\B2tc^H2 +D[B=o,< I)a E4ge?L n;3y'\Mx4Eypr 45oGX[_(QnB*g": VtKpM3/|[-Դӌm׷"~Lx.z +=ZUOr1Ϗ@M3tʋE"{hG~x:!mkB?VwZm^[ӁVu%C`x >龜cEv]A= ׵nc̈́r{H<毓#o$ ` >}C4+y*u0ۍu6~V#k燰pK?ˀ-$ORM39,l&7PIlސy8BHZ +7o)"s33T;Ovl8%krMzARq|gAϨ@7To% fz. "9ɕT2 +X:V} o|PT!]kg't\h_>R6N.͇NjM/9֝jӴc +QxiVBB\[E zaWe]_k3uś29,wtKrR@OWJ 5I? +ՃslRȇ>]KwrfnL^${,rth4f`[jopwҙg~Gs]CtQ*BuXDEˊ6_/QQL+"RBN;zlUd1Huz_xk GI*O(,J8I,kd a7tg'6.f=ԇL(d] +Nw=;ʢ!D+ +voq(]TF$)0#!vw藅)_B ''A6Di0G8X G̙R<`hP;ws?@t <-%:iZ`k=- <9Xj&yd'_hEbl~MB*Y~2Pw/xzrKa({h񋡝}4ҐNHċ?<.2=2jo&1(#h{4EJڡE3{_4QP *" ._1##]q#nxeXjOx4O&QI|A1cAG?Glfq۾vƟߕ"Zwsc ?dǜ=cC4PY'Pen~|^Z;oSCcRLs88BܷF[d- s ץwJP,'nK{<Ǻb[5*z nC!z+/">%fTmЏ`CPAT16̈[v϶D"XR+JϨI@9hHW ͛XCs@my,H$;cx!0vd\𜐛HBG@h1bZ`j +Mvrޱ?= +G " 9F"Z53^dksi0~MtH[ޏ=$!L" 1+{b%A5}d'2~@|kF}fZ V¸gG5+ l'9׭ h-n.j"фrzJY7؂HjI`Ʉ0 ; =™ʾLN '>8Jׅ +)>L +Ա.&>9M`U`zи1٨p6aU X4#V^}c*_ +,ro:r+D (gBw&.2%̐#aQj:S%rkqՇy'ӦFhΉx%7II-64dES܂4c+|!kZqg;bO>7ە +IW-+ğN\wjj;I}`Puδ +!Pƚ1,~3c3m Á{ZźT*p|l |V=B\&`A>4׋? W1+#MT0苑>.xxz4=Rn*35р/?!r`D+12)!R]rf&MC֚:J2G(-̒  [e$7j3q`p:a8^ " n}aA>޸ACvÈ>Y>dR.s,d"y͛L RV[`u܄rT}ΣWt94  +ƽ<-5v%pN ˭VBQ(Eўt⎨VN +:Wťeۻyj1 Sd~tV Jy@ [mL}1/Vo>~S}c wIoP@O[L!:XcXK:U?ZKr%7D_rd[9iezѨsNꃄŭ6+cTFPrgVS:"?_1*]aG`ѓPIs%7.oͨudӃO9^pݼ악}XK~}~ mMGiJpn^l㻴..bE;6#A (VI^ɛ1eW6k1v2;Je̝CiD f.9?gFb9N~j+<cD~c>x>%&3{%i4չzkh w|Tzpċ*O]#/ڇI*I- v)o"0FÀsCp_.>bc0NS_T}ÎNəi8-LQj5G!zIhi̿t,wH]nR;ΜՅay' G9=pcgCq|Ր tUӡ[_cJSuKa%-~ +â*>Q\G]4z\p9#hTn,"hBo6 @Zr+Q1E +rD.3: 6w ?Td: +AF878(lH6P kG[FfУ{@>.=e5rfzknŽ} +Mn)#+T +jgO Okp!5 u߮C Fܺd0UJVAg]"ׁpX $æu,&Sz p_:# 9qD'5W^"ׯ> endobj 2890 0 obj <> endobj 2891 0 obj <> endobj 2892 0 obj <> endobj 2893 0 obj <> endobj 2883 0 obj <>stream +HWn}W޾_^;>Ab!Ojh(7]f^9!L16B7D upn~uՇ[_ܐvwg Fܝ +kPHoW?i/G=c dy?1 '-(L.@'Ae?$Ap#xzi|6S>駟ظt"DŽ|L9Ң!8G b\WLX*oO{}|Kx,"|Q YõbT?Y 2Hp8Co܅A7۫.tA8uñ=I|hdCPLwݮKp"PdT)P! ?+Pq0dY@)^p}>%l"<.Z< >e)Dg(h\| D0a!p>h4)Ē(B']Ҁ&_5l|䞆4uv $ +y B%l;(OO tJW ~l)+N],"%[ + + $ :}3OzP)kq6wNS/Y\j<@fuR@XUDZq-{IK:x+0ոqz f FtS‚i9=n۩C ^aH"qt%`b(r=+} MšSGȂqBLK]JQƏe,еq8RgG+KD8\Li8\ToUCM꽙N2V$~)~x:`=kH"%| µ:0D C=V?A705FSMBhU!wppI+n Q 8(\<|*Ke?Ə(/G:v_ 4q8t0Y%Fti8[Pp#/塊lڋʌP97>&P!9 XҬ9 + 66@lkkkt2y͙ F&XL%.m&WL]¸CSeG20v1~ݦK"P5ei?Eh%&cvE߯`um=by|_h!yt:KLV\\v|B.k몒J~^zw]xwidw-ˮg[ PI0`S!U?F VZ[TS~ ۄI 8)/GbʳfI0H>MvƇټ=[ATbJy\!62+̦vNjxD)=1XLevp=+'lECE(3]b@"k"5'R_ uv`Oa97LՠV0w]|YdqXt +Yb3<^N)\.xzU |Ea\eRͫa))/|yKT>qf5 $?M-\xpAj &A3Rtq zl=ء_VBz+0E~GoLC תZK<`Ͳ\eDukDK_F=|ŐNͮx8?c^`{_yI= -Z\ ,@% K*4S&lS;-[p!ڽF5nH2̈x嬟2ϙ*Ջ*# q]~?ve\VKPG +LPӰNf*dIƃz08QƉBFG1Sg4qAf P/P\9姤#= iišuOW% +Y j8"g6n5'z Bs |cCyhy:t` ʹdeŐ1^mTlJ%@V SI4 -X~GɗeW&n}!:a]?d#~1`"n T ,HkC/MǃB'I}6yF^9=`Ӵyq |Og'7[QFLx]:iY܆3ȐoW4Z_1 ohhg_2r_IQ+W1U(YLv0]i {|Uk}ei!AAoj`@gaXb+R%#XE&4KlN"V5VsVN7n|FIsdxyi8d,n9CJys+äe_P +)!j2X5^6$pXGrӱ(eIiLYaY`g`fv8q\8l"ұFRY^ݨCwF`*?vC +8L_H.0)ȝQ+D 0`f BN \ %f +؊KBA '>stream +0 Z@&J Z/g^IШ;n%u3:fa;\+\7T|vx u#?̾knItTҎqrĶ3Et)8ZW(Z+)s^`iulT1Ϋ8&aЗly'zv +ɓMrbyx ߌf;0.釩ZE,hbiѶkyWbRAU k,V*(M8(XpZVRg#b %;GcS#̃p.^@ID8GJ%ߣ&@}Λv|Yf)4[Xvt[1ae2\GQ6„NsA72U^cj +߳0~9)![$p7к'42TʙMGgD(5[]N{rx4Zx}6xz̩j n - #ޟw] =b6bt524:O+n^+Ya_r':=X( ۱asM8P_%2.vW{E銥K9g,IM07+F[{AK}^{r/֝GA2"idfhs v2꿩$XÕZ!0:~r^P mB-I}w1I~vuapUfY$!@ǫ`LmGwo1ffQGkw/0ĥr 0Z X>%5aY?"=Fߐl~SCK9%:x/>4C51 Bh4.YN`gKsũevFʴ04էri+{\YG(ss9 ~=2X\ +JkBEꤠILrSsd J]8a.8YjE>G(=b#Js!t@ ۀJ2$ + J*Cn ˺O4ոE&mSnY <^v ]Dp]f4?%ksfZd \zY~Ҳ?FEn0l?8&FNdx:;"PyllhZj Tg2-2U[٫J{kڝY25BF1/ !kTCi- +UqռR6'x=WMɰ$q|ce߬LqnUHqD@"5{>ޙN5nsGĊj8@LDymZULD#oS7QE\̧?BN;bs头.{]0}8=Z>歞1hӓ\-q@or6/aBbi5"Bx +T/!)Lb9´VTf|NzA zK2x>^ ,Zj䌍'u1fޒ0+F +4 pT"+䙼>BCȵ̒&m6! .KwG.0[瓳^t"=Ip]=kˇuuĜ|#)~'؜\&r_j/5ȮG`i֠S=_y@[4prLEM}&53S{BC!mP?n\;V{j3CZY>=I,䩽Ha|+6w^ (Gﺱkkka&v>5ks/lnS-sW)JTCjkI [TI)k>dLg45-~K!kV)4T3XDq8BȎY4&\z 7'J)/B-dβt=2.Da)0\ ~m_f蕯OqT MjnJ|)pYd$6%@`E2J[!cDS, >6iB-΄-Ojc~yKs X.@ş|nz4qI$D$130W`|<҈:ɝ\ʉ.Ŀ׶S {t[`Cf}5iG7XFdwExaGvө<<*Z G{&“ۙLtxBzsi<1bCV6L-\ŒU9(.EAxe\N;@JGGSv2r:T9Y%L-'n\N6ֱjReح]S𙝎@5vgw^H{I-ƧSm81'Fjl.5boMoҞ!ʍmYL:> nk}nn~]WUb;'n]}p? GhZ uixN  +*%׈[aKzP48e +qUYJ>O}4+S=W^EAhgWBtRU- ?n{MwkɝRۣuvE1@5 xXk'c%@~<'ZeK#g7~*Kk=cy9/mn|6,+)G!yDxx!zc ܔMufSI[r"c0&XcvK55ػrU~WkImI$9dT!` +:UmL-\TOo "K,BoH;$HDj]r} KMS!cqnѽ+b0?`;ys=1i*!<$D!ݒnlFI +w{Ȱ_9dNN)1m҂ +RZyzdoߙҰ`> vb9*zOUJ{: J\SBTj# cǀNP݆pOcGJ|k{zOpjtN ;08I[㏭vsxVqHr.)й-JDV٣)%,{ o#xeڥI^"h3m߭n0Z3' 0!J3$T2!W&P k~D +>XjHfF{ЗQRDN0Y[r=~,.{p RM|lC$W_8mo;7,gp;{'D^)6@̿6Xb^k뤊4]8&53%HC8cܬd +N@ˢ?d\)̸״ JK]+үȆ׀PD5W }A=4)0X[R;aE>F6WۅX!~(W󚃰a07T;) u+*&; +~R)5o3(]@ S=#o|zҪM5WXݩMZ("A^][vmxL, 5j3S 1Oo)${ArduV' DOiZVXz"GQhCT?. iW%=ȗ5xrwR7Ƽg-DGo7/8-D7<;nUSz,"jVd˜]bV`C#./\n(!7ۺM +ARy2]gezf$wE(G,@P؝HY$u<]zwCo(ёu!t6A-\8 b_ْX!̋^e0>-P<|. q^|.nI),h\/I5% #~f;R UXg-LD2YJEk>O`!ۺъ#fƔqJ^0lb V]5Foℵ=jd^tDQ-3.0mH?&CPǂ TD`b@: +Xx!q;\Ke2.#6냌ٛ0!MFɤqj{9l!C3 kkH+8'uz +LQ|UCuo]zgvv)KiE)a<.X&Z4@GIŔoŌpdrrtgU DW j<|T_;4eP+)*X3V%QXK V ~uDQ ,&ȶJUB3~Bd[8L~\ _B7&G`*߯_E w;2*G;{3,hJe4䲘EK*e62_qB$y R:s7QbPmt|WwL}QfdQY%.3:8!tKіbu̅--.%I&@$(ZE(,mw<0z^ O=̮>#g)q`[N`TQwPx,%E!2^OT_2Z"2Db4[m?ުT͍tbm 5I9͉=2IY]]*S×pJvS *Yz +2J1 i6_^SX^3aSr(+]E#͙g0/{8"D +"Τ,/`T_n_7Y{3ᰈ.zQ&?":J%5@>Eh"R`G2X'(ӭc LD/ H6IHbc$]9!ʳ`߼vVIV"%[Ӭ(TќZүXE4@feOg씾%BQ(.8`]4"iI>~3?Pwlv2{"t^ܜӜ*_+x@yFFMailqi}Aֳcqh:FYڃɳ3VuϦ+4*BK M:nRL_@ːp= ych*SH hMxr`a[c"M >qLvJ YRA["EUʂM +耘DKB1s8ֲW8!zϧWڣѸ0_i )a0MD. i4R7Z6cGȸS ;?vm}7Jcu{g>F5lk}{rϲIFP()03B*ȫ>$-+]yvErʩ,8g/9!$2~X j (38FvH26aSPu12KZlIo:N(pPԵ+u1R wY}jՇXMW^S'HF^/Rpe^=z[W'?Ԁh2lV Q |󁧨 OGM %)E'3{f#|At9OفOj308LdZ.&^aj}׍BWCXN)G/##m9`w56|befBaB,RAPF r%wĮ0kL;aǵJp=x.$vw#,M30LtRc{ؔ(~ͯ#.**ތwp+aL!)Gae}2=R /v=x3}:8sf4h$-:aH/;Y(?b'D/Hxn3@;c*!I4H~Y4] 'VN0X8T `m5Ӡ`̴fN[I,> ٿ~6:Ӣ%x ctॅkߪ{ae.g<@~7X=]CwStkwy؍ {s), 5Kӑ;(b> 4Q=d`Opm d0o$lpڽr[%ԸBBje6EF+[d7S*jPƣt>f>kA`HI dcS" pU~~`#aLfR?ো*D*kp8{/7ܕ P:Uk9UZVd3wɷnx9KǑVh'bx-4D,UKҫaq kf wg,EtAL.vw|6:+PEdD#y)*#ZA]:\{&ZSB*VPmFC "|^Kj<";ta7[t9>b(4W$LK=d\$†XF,Ov-SBN77 W[n)Sk0,$ɫB-ːes9_@S>z[2_}י^?FۋE*-9>'kB'1__8LY]}.t {kP_*CƛxvCQ*BjK̢UEc s/C?G GoNplaӽ;?OT`i-d(vJHwӢp3B..})p$O7xzJJFyh&hxy{2S Wq^0aY=/}Kߤ8`U]<7@-a^2M{n=x"OBow n YIA)3S&@[0ٜ]lԶE3iV\Or6lʦMg;on] k%GAf0٫ωǯ] +8+eqIvq5k,AuH޳C6bY{ d؞exmpGXO%.lm6Pr!Ъ+;R1C0|f7LzRC@8޸r3._Id#ls0[_} xf>K6XK&2PaFf+mN~>O:8"z^l) 5*6TAwKכBo+QOpK/Zke 72oGa +WBɯ.B='2̚9{P'6K#ʽy5s]QQ7=9dR25^ك7:JF-[ƺE(Nf= M_3 BLkˉ҉:'~+J?B@`Mltyph*ܘ;Q3%~<? G g3ebsMZ-Hy ePTC@؇m XZ +!D 7cg!pwP5rӏaH~r uPZ@]՜9Rxӛd ?ݦ1_[->X|41cP"@)‚`JOܞJ/uN{[cu +-\)t ^t5ݓC "-Cv!Z!P 4Uz%כԛ_AP`52ߖ:gSUVOND!1T~}J@-48&$۔yU,imy[ᩖQM=NjT%IBrWƗCOހ*M ,<50sj5{(^ Kg8b+㙗gLz@>.ubY.s<8lAV\7Mh"Mc(M4š׉v9$欞 m>Z͇m=MTU~++KM0JzV޽̧]dd_K,4>/`td)^f( T,{v4}'K. y +HϮγ𦾄;NOM UWxv"BStۦdדנsCxxHcFLW*`ȎHԦåp,,dDƓM_؜tq!\O^台ثcoJ,/W eF yHE6\>MD袶J_RSbqr[=VOQCG0Ѹ2/ȕ%+y+k()$,0z|'Da +E޺rRu+}>UU g\VFz\9; (m'ͺ(3:mdE{ɝ%J*"݇~0ج -/cN;M0&W]qe|7`çvr+2k +:G? 9,2zwۍ_ߟE3AS4D@׀̩&]@[{;0ڰ=o,VĬwhGp(m8ib>M)HyKN-E3QiG?],B>Ȕ9Xh!AS"Y\}0Y0%DZ\͘$7HYLҶ(#aڟhFNlڏ'i yMUhMPABCy&y Y~fXbS!h9y.L|bCDKuưa5x(zcADK~1TP7;YeȬc`WIkkqBo-g 'Th I@Gl>:8iIIHc]V-<թKT1\0eT+ +ߧI>U-X@!P]d4fy3o-9bX"{=1+k0̝OۥƬiMj eգc8sCz S׆f@;Civ$ك&&cܟ+ʒJ˱pRBAD)QlZQ~``Xdk[b&޹`W5\CV?]9y/ʾhx,s4<~&N1}zT +k@E_97Nq~ )0%_/>K k*NR(#ȭ)ECo\cѿXQ @K0+"fGzVcY;VeO.|L MɩtSH8S[^֕&Cu{ Y۸+B QQtKs:Y-~KƐ384ǧR :_8qOycDMO1@IJiJ0xH72n7,NT +L&=ɟנ8AD@hN>pKfɸN˜Pom۬.  NE88BHAm0wUAS5q4Mch)ќBWfa&FΡàrʯ{u\w>rLh'L,e>z]mFҿ\ڕD)0ci_@2\N2M'뉨D>1#{ԔU1i4#N3ˍp}`j +ZLwhW3,cV-:`U &Y[r2a˸ːzX+: 5 dM(r W%2sf! +32,E8k|7vyk% +hJz˝S2RZY@>'Emv=jfȣ._əb "/ Rn4#BOkџͺm\zDb:gĝ}[a:iWB{5o:L3rr\c%vͻM[F>?ENDz:(;,aW¼S~u֔} s*M3h(2a[dp.E7. :?&`o~l8Mׅy2=w +}_"=,1@oB`H߂##q77rCYݒ?c[_zر$og[+?5gf#ĕ}[nJ[1TMei N>'" %2c2$/lk}>fb/awC&f6S@r09H656EVD2N:a[D$4LX{Xjp5hq' Z Z}#u<{yH#0w?#g>Nky4)fs~շ<n<@fX3T Yu"{#S6S +#p +c\T$̲R4Y_9`c*KfC>7j@/X~9%Jg2 OuN*c)gBg4d|y\\~AޕW(#$HbUjdǀ!שQD; pX3<uz2}Ayo|75.dx jaD>Y3}ZЊ *DrxZdoG`<]o<mZ]ͫvw:h@B!T؀p5̼ϖ(.de 56Nַ-.ҝ-+7j)ue<ۿ_P8̠^bD<"/yw`_%(k.=4jCBL@HFg9i|/\ + Kʼ'a^(Ôj*ST\ETjAnӘfQݺwP撽ߘy䫥 Wnkwش2@ K?6gYn5g e :fđ+V?+jZZq*]+o3S.-J $=AnT/ցx'`TTMʪJk4.\ӟ- f1T1_$""~foL eظ!PgH= +^(JCiFZ,>M:¤fkԄc‚y k]W[)}$e;ٍU%WEWauO7_$ƹHzծYȥZQ4NLJ-Si/v!8xhǹO@>ZhۍNY8c:,n5yeo+#xxGsY{d|` }u )J% GmķL٫2FϘUJf8 x΅fIL$|uQ_8LNZfJOO_X, -w/OFJ<"=& #3#8rڛc!aJGD +;6 a3gY_m1{B%m*MGے^+dk]f0=l$X,\L=1R^AU0kxh/SZ {vd#Y\fW +M6~0DCrUOM +^dG=!\[aeV'cdabgڵ@rr[iQ5@8+:xSk Rb: ֬dǿ( +* ?>aږp#+?R:6GZnxf~.8?_3kahi,Ä̚\c~ HUMIOF߻D{OpȜÝO~}&SmrY#g:]J7%}"jHiͻB3mV{Lr#k~C`zZZ!d8Ep3+M$ 76ŇTā?T% VE[.ez,، +BfLp^pμ6cj^CjG!5$B1iz3aΕAe8EYfjFY)Ite#,G̻8$_@E lK4Z +=H@2UϺ |+Rxg׺ѣ.s3xϐ |gxj,t +#$g3:,X˯u"Qaw"4{%0z5*5G+ +[RܳZaƤ50N,nfM?uN˺=zŠ{{,E$4ٮl~FUKrV]PxKكɿ_V^g̫ny_3m8" 70 Ym!qvf8BblrKUQ078M~-;KbO@Q +P#Ze`. !XdLݣ"ld~hpX.fˆˎ*fMgÔ\CU@LRL>$H4O` 9˜;'GDQʥev{;1ib?'ԃ2Hhd,{'ɑg#Uhݩs-F4c^7Ugk<ph#PVA뤜"=߱Sjث>9ug_\vXwK>\,NϬ%W}] DqǫdP nY<P#3{9Tg3L`tSnE'iI@@+]O?zTB[ ?>G +]p%aa6P,P5G?ÞPXC(T Wk/}d{r(ԇ5SUN*9rKTw^Yb6}R]?#Aw`d:_;G$| >2ܥ0WoOZ^MHXW0[);:\E + bHt5V%i7nC /jIJJ>9a +PswrgOuALkSj!q/:t< ɡBMa"0e,;]˨z;($QO*S{m2=7W,gIi1kh¾GV/K1+2/uE@y_c8."( +lWS#S-7P\6K@lQӪW}5lP'@qpXG{Z{qzͣg=tނlh+,d9e7 V9IO_$eH)qB;E`LۅՖ XkZ3,y0M7:c0x@NQK h^{)'|]gHJ2#9X_'pʡ % +\#Nch4ͮ䘧pKjH}-fZ|h]z pAA&|֓dOr[GK*q&57:vUs@d>%NB|tvDDAv9 zQ^" +ۃ٥ +i-(ct+Vק#i}6R??Wyş@<ߣ<æ[Nzuj+ 1MmK+tJ 7k!gK!qm,wE6>li r͝#;\~P.wqw +;r`R"+f<-|y3+z:N0HQ3Af% =D _B1k=?Toe; I^o 咈3vr}c5ۗ0/fpIXsB2vX8]8ZX!Bn7 +7s[kz ^sJnplBT:)G U[#kҎw0qn4T a=S>P}x!c}r:^H&eߚ. >&9.^F trz9 +RsMml5_w*ߌ{ىυ1q>qa]4[-aaS1O 2<9JEZӳڋ~ ,g L&IZ4%xӘ%q_WRxAyȞň O[2}UpگP1w3L%8ț*$`@-lQ7g7VWakʡ endstream endobj 2884 0 obj <> endobj 2885 0 obj <> endobj 2886 0 obj <> endobj 2876 0 obj <>stream +Hn|yH3,` 5IUtwSޑkEUl H2r/s!g +z`v//~Z_^Xo.^qƅ?Vrޯ|4+ЎYZ3WwoP`Bg;U2Ee{ۥ}DՄ`44߻CwP9$^PF[fag ۯqu]wu\럇-_~^VoA9,=]x?6ߧS[pCIEp_mV]%耴ߠ2)!=ElΟn.Jg}wrea4Ort^Nw:}62翋no$><6 lǚZc sHwn%FOnJ0!ezJDU߿lxg97S3a6<,2Bza}sM֍:ˤr\]^"wp VBr^mߣgQa%JFuPW՗Y`0.`N<:V/g4O$%հ?w1jKUF=YMs)I2Yd7lI:i I k8B&mf0ypJ&WE +KRv鞛~&}TO}%11L(.)8{LNfn'g4bT!>GxG"`?h][W+)׊16 Uzpuu?5FETѸHHTT}<i>0$JPr1؅~f|ؤWܰ!> +8{讆zlUBHwA7d1If(R JDsd1LMN%l)& ݦ(>Iv3{Tb{y=vs5>]dHU&e4%\H5}e= *> tg璹q]('("(x _o@V'3=h=1 2T"w,Đ7r_bKӗ.֋d6X^wpFU꫖0bA(a +'Q$&b^dk~h0J*%ev-$YԔ;J3_Lh9AMKf.ЈjNZ_˩VN.rumPztn[k%IYՇ 69S XL8 #-'FfXdD PJ>ȈOb~34zZ!x״mMĠÎA,ș w>Pcvsc"1D$^pta#ܜp"fjSPO*KMY[8,B.UMa[kフ,T .(A%^ #G‹ހC8@:L8SsPFP#jBؖ<~{tQWcC/)ȳb9GA=&5{w1tuX@4!;%v*f?t{瞍@@\Юj,a ++NO,!rShjqm < @a:vL$0Dj@_*pF"k? +~ + ܐL(F4X`"HVELc͔r\5~ƕ1$sQD&;QrM6 yMJFM,4o(b9ѕ4KeP49ync~9'ZT7)U|Qkw%w]mHP8mdk``F6XT%ХbVA6߽9~B1Jx>I + \+mv' +𰺥XRZkej+3V.D kz+Z,mVG;E-DYhg!~kUyt[g@,IS_~Y0-]Tx±MwMDBd쫓Bm9O'Y)~ .q6GK +K`F3t6Y ]=/{<HVBG]5eSَ~؆F6K aMy"DxRmy&7Y<@ȋ:(>LgXgqQn@ oq􉱅uئ}@XXk qa:Έr;/p7Ud8%TRS888 +1 +dVWbc'pyv߮{Q( `Gć}C#ZD(8B sy0T"/$,_}jCysWMl:rոuSϟ8I}B!a^l%y;Ss=)җJxۄLYK\$ +!M,8f 638`$( e+Αlqݳt8L+E 8N~$<#UtT~|@AEpPѯ4ijŽ&|hy5e.>iB!"9r3oi1 8$l/*nHD(b4g|@ +eȘAA /zK2gqs_ ">w@]rDE3]AKLwjҸˤouokV =5Vʊ@ )#moj$Ek &{Zw8 A4\O6'@CP@^ ` endstream endobj 2882 0 obj <>stream +0 M@&X M2.Z$m':%WIjSjiΛ)!JHdLEՖSdgEFc-ZXo?ѯOH +D|h67[=M&(@ S 4;gz#;O ?W (T³ Kg\i'r|, Oz!/4>԰n +^ t!tIe+ 'gIp>cG['A{ +h!=;Bϵ^F&e4lA -·ycn6 ̐-}'.{LrVȻVqVmu8Χ?fV1: B.Ol| p|P U!;E<䚀ZN]b)En4ohLH=q]̚Ŝ߱Bf'M>_Lx5ƞ(2˟=A +`l~Z(kIe)j|v:}D:9% xſeȽ.v#9"h$QPZNCdI2j|ID@Hb.0,I{E2>V33{l쯶k8Pٺwdfj.Bfbg?:Loǹ"c/:ߕF&Ӌ)_+ڹʾ.'yu! 5ʷgJ:=4ڐF>FV0X5w IuRT+FH [~l6۫{Xuu:Lc2mѴRӿHv~]-GD:.X\HKp1>NfQd\v.^c/7ֲn8AWAGt7&Jͤx I,F,J+s_,IW^0BP(N1E9Z9kîu[Pڑ*ewG]c +NZ[3yM?_ +f(N/j[T[6z߯7pd\Lg3r .Xj)RO?^@T'&=A PolAfofg):Wt%_:?ҟ{]a괫]5On$hYC[-,`q[sG/"vi@}[8eN"B|D: +%c +mV{RCj|t! PCIBfwXb<ʦchK &[ȗET~QfL +LHSe͜qT4+![n6E|1`ybH&i1o~+#PڏŊ|M:vհ1 btHKo^Ζu( 9:of^aC@E ܫipk\26p=K]iAiI* +%+۔)NtOW<*!FgX 0-Z~=z\UؖCx^|6E4npq?; +s軑kSxqnGhScDxLc5qG:P`K5sqL(<}ڂsAR8Or-2[=3WhaymIm i{&-~j6$iΉVy8cAKal,P5!sLBC5(Y Oc'x.S"JkXU;8wCh} $7GEՎx1vo|F0xh>-`>"my>%‚ma* ڨ_hT׽ 3$vݱ;:m^,/,qk9FSuhYU,r{ϩ>pcR4cjlImp0k:5 /#@ّ(K‰ =DYl(i'S)gE' ­.C?7߄:YHQ YS!T M69aL۲Bb gQݟ%JZma !kEyte\;"`!>4oΘnP\\<[-jfɀX'C# J ^H@$"`%`MtNu["z u;hFi7x)xr%sJXB*HM#*b[CMݩH8Y=M9Qbۓ9؜)HMg; a +C(Ќ4jTmɮ8o}P`·O=3p]>w S;ILF[1$@l'y`MW3ĔB,*T~뵿T==[J0BHfB`ŤWеdux穥M@}?ٶOգRQҔiuX0B"v ^-Xbk1`54p.<`_U] +b s@߇4 t3:kkw_@J,?W,=?tGZ=uSB|I +5++Y +(KY(rmXtjv`m8t!n +*ⲩЦ47RB)UsBaUaymh7nCAk +a)&?)D uIJR\,"~g #kz0(n&>vP ,lB6%eLQ4ỉ9=q!S4|OG)褤޳ϖ"D2"7_1]e=z|p 7 +@?3\L;o^·~H Й +"s 'uv!XpM7TƺQq*3 IkK @:i}fub.8,2 iaȲ]3)Y;r(XRzT/!`('b 4fTRiP3=jmWIbu,?$}|TvL?EI6vT"#AǯKW˸Kfot&WB&A%vNX,s C&QFQyŮtzp3HObbh$b}l0- H.͞2W{L=PrJVgU{U&ʪ*XyR8IrT_70N平V誂>Ru8fV,];8QbR7İsI4Ω3uA_ fRQ YPʼyP&yde`OI7TILI4}uYv}US'=kLXFA*=y)i?[7UZЋв:CTKaP9E~fR8 U;xO]D;4RЧD#q&01d j.C98qr+җJfRLz](LYM|0@5q`@f?79/d-9%kcc P,)0x{Ԫ QbC=>*A9C VzRHxx/Եrca9U!uNO@}Vs? +.ZHە<ؔ3I#<>/Fw2Hu4(LѮ_|ֺIsxLJg~9LO(*1(HųtLaw$T"뜸 +M7윖ڒBI,04Z.tx&Y :.ER*Yk39zÊݤ'7u3!;b?eyN\i.OXYvnu{~EZB=+KC`GUZ qbC1t#`Fp"UOG>9U5EZeGd @NFhT nO8 JBmOSL T*' +DLl(׾M$v?&kAY~//qxZTl ^y)AߛMK `;#+':]jrQOp5t]t "%&b A!<."H~5A-(Kqmv[/sL+,cM7*͡dzE& HR!dLpb!nrY)Y>hlQ2hbRvֿeJ+> 71c(TooЭo z|kqT{z5-TK oAU沄sa)(fz'Qs+a콗4m'b2-"ƽ֐4'FiǦe'3aT|΄Ɨ\ePmtiGQO ZEcG`uūTD˻F (GDȢ"~ s)b::\^|k'EP7J~Y\5nck}e +za^>iaiP $($88WriNPG|R9I&x(QBSpj-hu<&P- $4J$9N7SUZ@ai2^o[V7#!b ;CC3*(:zFqn2w/@ 1j{nn3(KKk?Lh24WI mo$Ԡ[ɨ/x9"7S=5DBV"64+ny26Al&yuKnA/`'&vQ[BibF^'nߏeсhAn8oTM )VYSd:Iu.Yբ#pvs;fYZ (J63?j ϝ/.e<kƕ<`%ܠߋe;#oo9(A`f-m`Y. >2> [ƅ~&B@|{/ Z6P>}Ա?UVHx1\!X*<1nxxSi.T`~&`U?i OPeA N~9DiJE*1_`ƷdQt?ffF2/WDQU>Y0C>]:ԫ Yv^W&A`n,z?Kau (H _x.Ƀc.‵xD +Ǎ:en^ᒧ`Q45EXHϑ`}? +ºZ&f%^JHjVEY4#V\T| e TWOHC{x'<*x=9>F(_j۞R E6K$ n#~갞YRujf-"u_;)YC$q' +%Aċ)<SZx,\rm8vҟ~/N|'~ EUwA\>V]=/v0_-B.ȄBB]}6enIlM1`;3hFO6Q6:Y^:KM0liV^2I(n+g,uXJ?beb55kx:!]CRptjYQaˏό/CȷHSYt{ֺeD7d x1wuCqim$H*"SoY/d"iB]+g C GHf4@sc'ws=∬d5],r)m۲l^zqH [nTKbDW,d\a U}pl,2=d}XPZ{0=GJ*.'+#0PςUßTeDRNιcV4vp + sQ +N3\wL`|YoU(m.*{Gqk]}nٵ 砪tq6t,rHDف:@3ܰ?ջI7-Ni3ek>(ν l#,{MT yɸzX0(}@tC*磶T)UgD]/t0)~kvmb CI8cDWY_jVrTtDNd~"sh8ϗ `jreF)>-^.~zf(h P hH dvS麺VLZR8; +@ T ܜJ#{jcX+aL!uRR M?34ۋY1 ^HWhiEb%v <5j\LvݏB`OXrZNFNʭ :V0gL32vth^<멑3C9͌kͫ im_.g<4=oXPU'v0Sp*> +YTI =,_R 1"px?h 3;3ˈ.bYwa 3xȟ%{@6?;`C*V)re![ j3@3%&"Pk/ÅEg St[oTLטĝ<&GxUDBԕ̄PT;*&`n 0b[X=}y# pD0[+-)6]I!!8NO}mYC³-< 1,0-NC29)n7G"2[E"5L@o pO+Ea>%Ntֽ #('i9Q(GM뫽0,TQ{@> RZ{ޣGUK䮘0]I*DŽPs1$.8æ.EA"p;=^LD~EX!j@4~spy$(Fm+FHKe pnrd_2YZf5" +8FQbJcW Uz\ EBAab&QYiVXp!"l0QUrH>ؔnwT"(;GhU9 Z'_4K=n Z`K&7y/oLkLtZR E0L)rCrLDYnZ*=ºcGKN_(xڠ$c39;@O3acgQ^5HvEU9 JOh&jNq6mvf[nTW# nV;K%ah M(}^&A~LQ;MŋLpPoX$i2aJ7@܋|7b7%-8Mxv:@6t'E`~A ;Aܧa\1mdidΥLhy&˧2U^K>˲W}UۄQL/U[zPE}Ӛ 7q `k&$!˳qQV]*y/ԪUD2B,IP#߱TT!oo'@D̸ZP95x9Ѳ+܏&Q;^ȻM +ӱEFE'.8#BQP-v/.Eȝr{yQgC…nVJ[hJZSP|"ꁋsbIyh{S2hHmӞ)?CQY}}P)s \ۙ|(N bqy*;5wAجtCٞԛl) 6D9յ ȟ& 샦-ЋV8vUL +brwn}r[RȊ5lO8^(u`%|L|lc;\"JnzhuӱB^rTZ#\pL|bCC籯ZGu&$_04h);>.Z hw'f<\ĢoSwyP*PeAAr U(avr|@l6 <3m,?"vbt>]]d0Z6dW#&_HOǛ淤N8'yʑNs'Q]t;HSQAn'.IjҟI%WG^x7*ON8<4cG{rIZ[9V<״(| }ww#BsFIyd\ұV@6^6L#Z+\#JMZI ,Qmh! fiMԣ_f< ϕ^-0гusfp˿8c ,3燴#1gK.qC ָ27DS2}j$FVcN(pP.Cs;]dP QlN*jfyjs-|?*;-@찙aFUŜbOy%9V+^iO8OR +Ŗ?PD4!K¿p8'm'_4Hnlބrtw=ţԶO/O/(&Cǖk`;Eg-΂45e+>GF++ޓ7Puqwy3W\Ƽ#pqZ23%]8dZBox+s%Vľ,&$-#|p^|巛c+c1]jiݽBNӑRÇL?e{ǓySN? __ U˜Θ!HfA†)3"O^flgP)g[Dc5 sS׋-Tj5or+q$IH=ymoNF1ZWK8\Y!~'SH#z&IRfuɺ*vhH½غh &*A5bƼɅ} +11Gt hdVB1jkm8X(Nh̳' XCl:82T` U$qB+ӍКpC`gd4v*muPP*3U]I/4ɪo8 6̗X:)o}o#S=N?wyc^'ormb\R Eg6.ph܍s!}_:&.YmYKI9e+nf{̝PYP\pqkS)"њmT LZ=cb-EY)u-J $~^֭kӠO 3Y;QP=(76.Sls$'bk[nX = +h'Nto`nj͔cR\qOG6$hQ>T=o %2QkClAKXTۣeAXd!ܽF 4mw%.Tb_\mQN-63ίƎS\D<. jQy|G/LJVxúLS#`M[0v͜OAs]FQ2SU䉴)5Ve`MV_~9OUÝ#:1nǮF}}ZC|C + l<;mOc~v4QN>К ), f />,H‰c#E9V@Z!s .SԊm? #Z +-L])W"ݨkƏ}g0|d"5iO>Q/܆[M{'d~Cti߁6/8e2u#t?Qp[SqtMgzx/8d& +CG讃0=ȼSV4;k imO1VIb~J]|xE͞&5Dz_}F}2CiT,&ƁM[t:W?`2*74iuY̩iDŭ)J >qMî4@-TRv}0(T݇E'v?wF]0>"6k%%HjEdTcnC 7[ua#O0YE AdWw}Bk}E XN؛&.3LN\Wyf}xhZHUik;-={c{/VF:>pq[n'& =%e +rwĐxrߢQHEwlA a>-; +  +BsFLhD? X1D1PjĨzha +^K7Cm<;+OY96&Ӕ0gЌk*']_5;In mɟ?z1**)Aiatleat)7\=$5Ќw [Gч#͗&- fzh!6޹_;,inwj)mכ6.6+s>@҇8! bV1]" &T~dכ\k}A 5BTTF9++; '?+8af2 b]6u$@Gw rm`DIȠB\zHˢ ՠoR/SV(E r?vL+xx%قшb \|9w1\E9pS=GE8jHԉp+ i܈w4iy {`i>KutNut=|f6^MfLPkqgս C\|ԋ wWӺZu (Lx צbG+JѦG'?X,Zc) rZ gH5˒C5uS7g_4i/jJmc=*Z[CIA(釿1;Ng(XlH^GAV(.CS [+}Έ,Oeq ᡗC-/#i^^"?Uu#fZ;⽁yES yg?KqwRUeH*t} s+Ilnj\bw*#d)W zT)@C2.K"v[P'q0zE=u"dH<>UR;So~]J޷v~thJRwv-'ݨAkN;YV=r[R-|-QK hʢU27! AvrL>wGp/2I7)nVNvRRw]5 mW=Zyc.nzJeT B|BboOGA_{LEOda [X31MC:'Es8Z{ƱCتdG^`/2KAN"G9t D@Ē5&9RZk!-ٲP:g}HT`i&ECbj#U2]Ԅ,keSp3dɲP.1x}#Ҫ|4ʱtr=by? 0,*wHctԥUwI`v޹=T1SRxPO#FSAl1A_ȿdrzJ;ע+54/{Gw/owwA)bvCs3]|~sS:yqlO@Rc@M-/_[X^hcy%D#NЯNgul ƈ#&,*5RdE0`$ L9J@a6/[Yw/R惊e0'up57ht `S[K5Eq\exNVʵAN 'Q&P w#uQAG[{vG6DzTNsN{lo/Cv䚳[*wE9h4-ōZ 6=S-W>$$Qb 鵁wp>e‰~Cu-xA`CU^W$}*t;eO ri3 H0$%Ns[ rMy>(jko=㫘C +\"s .lg^ۈ7q΢V"ō2T~`f{Y'ΦOo1Ҵ3.r ʺkV%͍KP|00zv۶5֎>QqEa?9zu$`ie-YHnVӧ}f;@iڶ!V䘫u(ڟjs(懌qk/`mzVE9 'b zT>fh2$j8& 4X4JbB TLQ ES'yƛZ|އ(Clnw0CHe6qp'o3b%|sGCPIX%#åjUH]gu? T.ΚPcnɠJĪ;i92/\}`}#}Yw^m;\(J3FoQ c!e]vP)₟_FtJ^k;Ο&t m\I5jnrȋh| +K!-VmNP[ϡL8X€i2fl ؛d>U8tMD0ɺ>y!Z&^C_Wy2(\g$ܜ?JZikeMw%0?)geJ7{Y輩THS?J&#m^tBXs nOlڔT ԁpjn +=v q_LFr&KT\A QqF➊i8a}ﯻn:gRqnKAG<7{hŰ.1͈>8  jbTyvYMudEk]iC!Q#'N[>ڟQO]-57]Bag2Fݴ%됁&?әRIݝIdz|93.K~ +hVttW+qKZZ|@Ẓx33 Tny ?ZOd6Wf(܉| [x'(ڼ1ώ+N+#>915?:4~lN\3&?EMa tړ[,=N8G$vGYNKAymdO8*E=>D.*\EmM2F9cxU0TfȌn(wi5`"`@QM*գRt ` }E>H-q#:EݡҌq+O0VzedLM]k^yf6]ӵZ5y1#{U,LEԩ*YPŋTTۈ$3mW5#7 +i}V?K=4I;VRm OǷ8^hKmLX5p'y-{XW*#oS0?>=V Ԑu7 +U{o\S֬~-lk鵱)= #f\|.jmzP9 iҸ8ޡʩ^5Q0˝NAvx]؞_A7bOijQj's/l(F).#KsB&BOӘ‘z mWj/F$.+JGځp6Ȳ-ާONy'YBLm;Nup7C#Tr{Wu'*.B^>{ Q@~ Uyy SFkREa'm)0nKl +yV*d}iS" xG&&m;4L{bDd SHS8R)A ˝c',EW=R"> O>R\g!"ڪG1bB' k8gwB?~qI(ٗ3ޱ&fCB [+dTT& Qb>{e~©2Aca \X5 L' 锻?0MԪ?':8wV)aǘ,AP ҋ4enWYbw:37+nYmMif3ZOl6P?$I1j=HHF(w +e:'Q f)(ޫd31=kJ'1#rQԔJa YIcE1vjf/.^7HG$Kt{7=/R]łzuV gqpѮJ,IVfk,N=wpq +=GJ"Qz*ha(\0m 'A9=*[lݖHKz[/ 99`yH(U, 0LcQ{RCƢk/u9CJSdJ˳x(`Vk.ʁ?(_6焍KC } Qjt6`6! 64r+fmpqeם"}O-.cnЊ"'gI1RFi0*h5~fXBKejA\'\S-4 < vcinaLCJZO=E_dE9PkOryo;>zq@7<+3_oXGK3smQ+eWO!1b4`X`na7UE5>rF_w速 AT2pg #k-x1qfmMp% O-ym9+{.,rL+x+J(auJGpmGV\e-lk^2giMCO]$.y"5eν23̨NZhj[ڻ*ҊM݄N*& 6H^p*fO:$[ 8f;A9-qY!8DI(T-2S ^kyV endstream endobj 2877 0 obj <> endobj 2878 0 obj <> endobj 2879 0 obj <> endobj 2880 0 obj <> endobj 2881 0 obj <> endobj 2871 0 obj <>stream +HWnF}WqH2Y d!O,h+Zjlek~]]uS 16|G 32s>u7q}qMWdb1fV~ a +A!4"z>ܼGW(Œ?%gI5m34];. c8jkj "t%(\ŌǯRxoñkvK(!v@\f.(q +x" +i݈2|e5.y=Xow}kw*xGVD + GޅOO\PP=aƃ}uX]?WC6ںF,bm`+={eSJ!5#CL!q) + P=c Ր2[@0s!!S3h,(-)WK7F.DMB: @%A&X'TLB2@+g[6}sWψ +bQ9͕wz{}ؐX@!ےϨfo0V67ňizo @ؗ}#*PפS/@)|l]b6,kHJ;V<4sTS,4HLJ$ Y2+O6|:9S,T3|[ďU23_i$DB-" kQFtjf_/..KǪN3sZMl[Z&¢2@:a~bߕU94?wEFigIP}RE Ex]o:-&!:,@C2mG/%IUrFY4YNILVVRlDNpD8%r]5=7~pQ6-Wvrcj(dj +xRF;UF5N[=|BK%&0Ωɔ"5k^S@I:&!25v#SI"ʢK++\>+ҴӼ wvg.H0$T+9EiN)h.U条`Zٴ$~U6'7V(s1/+ f #T >_gVJl_r$A&$2?5> #k4|khFTzW)9_s!~Q*̈߫X"лmoZقHˑShԋna.5Jv'>OK. > D C7"$΂K_h0юMW.y['LH_riKH +dbB?ِ *ƷO(n6o^oA16K'K}![֌g55%/ȶ!+cFbG0Þ`Vilk lp.<جp, qr'BlynB&$PFySC3E(=QȼїtKIB_aM( &m-؂1a 4Gw5uu" +$v۾dF]3رSR*hov]2?K&6vk?d4BA h.AP`Ł5lt.Ж"9vM;dLLpT-*hfÂ5^4JҰ#MCi0&0$}vNJJqG|/HG~)-Ї *p9б5ȋheS;nS,LâC3 `$dl_LM9 a7kqO@ȣB?6Z(YKs2m3 UvhfH {`q `0hŌNyCGUHH5w8[R0/F2UPac$o8PpVyKD)!{Nfȓ:gVsvb7¯ScQnߴTPՖX8.߿ep1Hc㋖֏uvh +KőQH@D3c+ K)ӭ0 1*Jn#i۾1gݐ3~f[V(Kk +@KB"+K2j%]l^/åoriv#X<`w(w]I0m߮!2{W!•r,&Mêk_U(؟>cϻsdeԶ2?~OLUIkvNV7ϰonw$vO# endstream endobj 2875 0 obj <>stream +0 U@&` U~W5,y2.|#7{- +ƕcenJf]N3D{d1R܏aCCym( Zv];,CuoљK=8R뭕{ ڪiq 8( 4R`<)XƯCb%U I/gM !5gJ(!.+r_o4M č +l{jĀdHLM<bQ6"Vv[ջ.[v(Gfp./ݦkK*D%tVl١BḚ-4G柕jA}Gqm[Ks(l05e! o^ ֚@NCR =z`cozfnS!;|>XNެ&0d/B}MⴥN'2 H}߭O?Sq-ކ +E<=;hZU{; {gD=~󑉰 4uB&d:؟zRJf8 PCȚd_%T"?7g4Ɖ,}*p@զZ9|Emj! +%@lڑY%yT] Anξ 6b+sv/DrD5v`Nm3ٿcF,&yYV?4oQM( %!:#@ʹ3Ȫ?ߦg4A0zJ[ +=.qA jUU-UF$1AxND_Qߢ:ꎳyU?Nuv tXĉR]Vb|/Oz} 8ac`٭3X ^*Buw͟u +fXYҟ)dooQFq0% idS1l'U f+!]ɤMަ4 gB0s"hH.Sq$EY-R$:L1(wM +HcwI4xt0h"=̩BdUqxr, t'Ko{mxw +9Aȇ$r Fy51gqmav`؈h)w-r$g|{!hYiݨE2h,~ ?5A+M45{/o6&r{ _v".mm#fғ$2D)$S.&- 3si@:r#]q}"ִ-ϰflL.Dj@Ae(Uqڐ6"{pbâ8΁FJsH:O$(.^ə^# +^l1Y [dSE':4kDw ,[ 6Fԃ0 +%u1qk2&8KmH) .WnY}XseuTBd;[OIy l譝d qTh#i6Cgf q]Yh9xG3 BQ5s͂O1o?4Iv!R-Eo3#o;MU`IGV5ic9ǘkBc:֑scdzBxD}$V =#9Hd5gסSq`6|Ѿ~9{l)*PvwKp0# #i(&P3s,R4A!TW CdN]kHdX*Bߒ焄2q:}OˆbZY@O?!`m0PD%oy<@4NH{g— M8"EHGӴՙ"Dpw6[9G8-x9*,T4IvTK5Pd*#o05.W4폽2jo;j%UyʧJ`?Lf-#ӺZE+G3PE)z ?։^ʾz`A <يr;HLҰ7 c~a4#.Ԕe,Z +gб Dz$,-Œé_åE^wL9+}-N мH{Hd~Ẁ؝Gp3veI~x]Ӂ& 8g*e3cOe52 nDl5Ko/_Rw,Uь %i +_/XubL]I%4DAmoЫPLհ@;1T,٠yL|2rUn8lHW.De&JR,6I2ح972xrZą`w-l ʑ|P]0;6%E|-˧<^5Ly +Y^iG ߐ4vYu%Gd%QRün%_=qbZY O!f+ω#g•0Ļ܏`wg劍vUw 5Ɂ %d)uoa"!DpH.i35 5;H&}9Kٝ!HM/0N+yp\&g +уQra +gg׬)izRYVvd3>@%M;WmZe.ǏIs9\X׼{'֓JӳU‚9`zC;K܊Сgu|9x@?JBq3I>h6; O?G+(=5 =XD8YR?`Iv}zs; rh9 ?ʞ%DŽd%2zB͍{ASt t[Yn=P8c~fĬg4X7>h)E + `ү]hF L9ڊQ ]7z:n |q=gm+i :@UujrGQ![0ΊS=ڟr]zzo"(/o{Cr˲EZ͔쑿wfg# }%5g\ufǘ/KԎ*z6өLaq7yȁ+Wc!TQ|v3FZ6"!nt>_啎M5u!2fc[PbKY@7TczIQH=QFjK2^*3ҜS +YruOh;3V#A Ot< -n;y746”"NTotXv{C?6uhř`F;( we<FcmIʤI]o j>~86:IH֕T (tPIu*1M[&<,`yE +AbҨ]e3I(" Ԫq4gFE|7!4˅˪XjM2lg߮_u>~Qe/.dYg9rRtMVRR (NyЧwQB`˗.qSŁQBNxX"K͋)XMd (""Yl/:e|r&.'f)XD.ޜ'_ʩF +礑  =}Rmo\}4n帶WH8&[?(C*%u 0Dm.5[YimS5hF +A'vf|kaU3%&YѦQz6Rkbٟq4Z4v]P/GxοհƝS1i 3]8}ȍ;._jc$C"\8];eqcTL8GP8OSd ~\q ؕeV KNХmb;]->/os dXu!: -^tM~KB_8C):<_oM+QL8f6Y*0L +;ixq ~3׼M^I49COU͈IjLi8Yq}(T9ODdsȑ +5oÙcY[6{|T#lLae񱵅L &pԡDm='ig05DenF3z7^kowhoS(·4ٓך{ZQC$ ݴ6YNwuAiYaiD PɪD9DcUP/^Jo%M(+k7TmPo:/%9<ǍrBY2\ $ [w%u]{ +p55]@VdW=HA3K[ނRG5˃7e}O{Or"6ԕ/R^C23qM[)(Yw~<3[>U*sK]oX&oנm^7J9.Bv2{@-6q +զu,`l 3i J;F  !}G.@M0nv;n B3NSR c8^'вIzޭd<ӔJslIBSV|sd|Ca< +%OԊw-v~"~]R1[ulP(X6)ϛl<Kb#'NGn*5ZU);= *u N}3{(Ġ,ЕE?sۋJO\f3}OWCB+"rzR8N.<׷4a {ZPܝ/UQ0^4r"Ѳt`q|Ú&,a +Q,!W%y +ȀS[ae[:(!NhQC^XQ:am ~z VY1ҢDZt^-1N=:lм#c+XƄ1[ua +* iZZSU޲@pʇn=1Ǒp[!vLNjJʼAHI^ʍxLS0n%/0j?A ؓJ}N>L 8>1B'O@ϟ2^I[9[]ٮKXGes5^hJ8j,0af\{2LgCм6[lumO)KHmqQlAK63]V\i=CUZSYZ·]jhûF }K/fUeuܪU5y2(M"u$LN;hWn3 )ݦ˸YډlFs!LbMSNYPX< C֬&BiK90=m<(;C !/Ǟ)< +~b*x-׈V{=Hѝ}gݡ=J"pCРRbhw NלNj.&֌nn"˕nQ ~= ^ d⫘xUjmjæ+NNKЂT`P!Ұnx)"jj7QOCwF1+GI Y zY(PƔK>X9O~0&(B\Mk] +qeMjd=3]Th O &X@j^3l*x>+!A3%wc4V0]l8'>OD<.lxNt==bYg4|Qb"wOTYF뽛V|W Fv4J3>4_pShԡYĜ\_%W|Psq@]-OGߩ*8=egN8<4(/?]5ف +/.M^bt\v"),5es3kvd8. vTbMܝqLQ5RK_+Ǩ!7>ń ^*8~>$ V֋בjH5 +k7eBҪbXZϮ,1OJN^l)t-vlKфtشgLz1$*tv5Jslb҄xwRvڪu2c{ e W6۾,/w;vc>es!62-nt|R?BB69BK$HF`<1PMMt̥*.;A_GB<5m~.ir1L<#c /8%.Y _$;R7K|6m .p84j*ZÙ Majq*x:/͆媺w4Ε_cvx>Mɐ@0/*ȶ& `z,<4bYȾ[SyDBEөOmMk MM%bƤ=xvcZ:.qԐڔ0X"Om4yR*%eZJ'iooqu-)Oe|pR{йMr5:IV:uG5R qOiPî~085ޯJ]|Id"6&J;qeyBB¹r;rsG^ʽ,&bB׊uRh 6<ܾ939H3TbMZ=бr1"v(+RA;~JNs0 %VSI&!Zp4HpZH3>Emc>JPƷ`( JU1X~9vHAi L_˭͉=u;]Tx*WGGqӀ&wG +b\ox +Zb.9FyG)חyL;qVWqs"tAdžLc F7Y]Sbo~ _و E8U?Z1Ѡ~'V+ί.Wʛ<)~ +d]Ӂ^`ҡwM&~djDDsb̋;>Iցa!Sg`mYdDcS&+k C㛌h-3|]%JxJ=Ֆk^CLƖ_O6-$M-~RzoE# y K' )Zabyy"Ine4)o7I+^uTMr +SFu3) Tč#ӆ獎!9P$ꬴkNce{y5AF)&wCn4Ȝ|HG VbTC ‰ry槔F{Un@':xPZ`/ׂ6Y t ,,/: v\XIGk ))T ?,񣛘WpglN'y| b;i&cuG[Fl:(DΙNb3H$&4Xc#o)U^.3#{IyE]dwRih#ЂҕG\ V]ܻ{|yt$ JJI;m ݰz~Ǥ/''~c~`_|Qx>}P y<OS ZSeJMl;E~B y1aVXڇt9$,#jRQp ^S]q Q{u3o!KFgQC~5pRV͚JצDwGrox^a.'zdl ~b < ?y#'R ƥ}P32/dXw2#y`OZU`Q?REÌ*x$xAH%tv?[dg +a娘8~!؂ϕ"}/ 1HI2`쒲[hc!;4wQN _d/^&!>keYf6{xɘX%\/J'aO!,:Fv(L3ďPCzQf. X(23UBu.PedƊLcrdn#Nߒd J]v9Y2@ҦOBzIӸ|˹CcH#g[^e=lQO5oY + xyXһX"j#{Sxl.ˈhkxG`2gX}r /M,D=M]/m ~W$#"('!T` lqg!Wej|(n+Ka + p7|"[xAO%8Ֆf9;Ϸ 漐>:GEO; +ə=3X&/xRw?S.KTj`V!){,M簷\i sqaPX>brhL5Fs|nĻza;i7D uphG]4y#l|r= ;A.:0."13W4[I&CK~?\Eq y@B]3m ^a M!m()-((L! ΂̌A? +~1):, jte&I2*a`9UuWͦrRM"'~pI:!P 梭E1Vp)gAJXk3JR*2~sj"e 8iM/LozOʞ.F-l a㰲+Ts PO 9u :ˢO(JxP;kU(N`{/&M}'+' 5r2G6wj> jmf' }S2?8=f6(TV^<\X|>8 K qjFDJtnx ptmwԟf=~Ԡap\5:6N+Ru#7Th2d;J fq,WWFE1Lm}?0b0׿ i,Jslif.S~oPClU_f픠]N +f 3cuuS o+P g9Ǖ5I.^{J]ʳ=mVakgFfB]>B7, o +i%1.u$| qCzo0LAw!>ZWmnC9 5MSG>m{o=2`ĸdD@8 +a"IA|6D@q= S\B!cA)^_Nԁ-=>;y\$ϏjE ӜIY&+ʠp08O^W a{_(FaXRVon*\rtUqkY{JFGtlSI'2@ +L.3sX=?rQH)I[ЇȖemk$n CQE [jP xE{}xパܥÊ<1: ]K?M2J}{A#:š.Be;%zuuAu!A:z]!1I7i"F3 dP+>e#Ki>#$r$qĩVlἨ hhf~,;`R!RF!A'l,&n(Y(Mr2G~VynP6/kb:'&u\Lj)l8l +\` k. tۻ\6-s=c֛O^;׷[%h!9,f)!3 +c+yQQ"I2HD&X*iՊYNjGgk #ҵ\k*ĭس]74;3"c +rc=h D3]ۄ _yqP:UoCrkӫZ~"WU'4kD6l8d>wC5 7kdڱr̞sГKDr+`GI^L~Z(tH' |G>s J2&.>XB2Ӳn9eFcڟ7,.żJ<<ڂyx@ +|NIrc/Y]Y:/~PV9:)$?4:fpa| ]Ԭ*:ml`ȫybK1qxYKtq'5ONl6}ϙˇEB22;ChL~(>DR_/_UmjɂO^bYISbܖT4`DW&h'FBL I7=bZU@jE;vVOllk >X@d[֪+r=U |}c`9"-~FY<7JYh4BE,@\MKU +2 ~lT"ph:YA^n _C 2Os@FC-nP8 +n+Uli6lme]K=bZ }kx "hȍUg@uIŇB{oGq&Q&?\H,Q~|q' +yLw}3ڑzH˵u/'Rj+-`#].'Ctx]^@H(Oza_;x@.P0,8A{.*ɯp7@75$_59&_ڑe YHH{DΟbtdiƃb5< ɨZ{f&F.>"Ӊw*B&>S4ga]qGR WdWdǤnhYV*ue2V° )?K# kj[`gk !!Lè-Y}^!. +(&^Z &K8S\=l]8p^E'1͇24&6X< ?H?Gꕶ:vuY" +@"8F,*:F'̵wp~Fr.&ՙdVgKzB?+9/wcZ-}*-4BXvLh(M/k?|zV!Y-BLG̜;'d/Kv _kF/WޫsՇў 8gjKk_V%DPr(pXēҙ<ßb?g1%zщ , \5K]BXPWG:)yOM0fvmP,<`֯vf[uRJckB蝃գ +弘.-`U;2_Ny7.zCGI,[jJ 1q=ek^%Zw{2jMrFoy7$p}b#g ,RGJ\Hk#E +%(&آu$E#KA78A0w_ ҝ)p_ 4!Dp#A 2y Ac&j+]Hk &_*ɋ8B~@712](h0Z5Q;$`Fcq$)T^=4hK{cّJxn5WE}婵l:W.@[lS;Din{eq`wu1OE3ps.; mJжՀ׮e("(}^BfyB$xYʏO;PKE*#Q^G-w6I%%C2 +PFPDY7*= TytK`>Z +SLsͧm$e +9sgjۚDT-#@ނ*ԙjJo.y8$#MVGHĎЗ7U,tp)){cnx߷"~}Á*MA6gp5C4ҹ-SZGG)>raAt~_6UǠ0z^$ PT :& xmH6 NQ(L|a=q_%ɫ8etEKV)lV :CzܾR۲F6])*,,$b)1?~  ̼$\aNw02$rC#vN f5.3=A^Eʆc2XC5~IOnz;>ԟ\ֶB\b3ZȀͧai, P1+PB3l[R7cүF$n5RTFdb4/>ťX(=8)P'dDLwDPf%B,.Gd2,mFy8@bh-ݨ߿EChdHiͣ ;<,+LF_[ HĠ] ӥHB&@3qP@jD53lJ<+uàl>vmޒ$K#FI9qnC (Q|ȃt&՟sg̋b2=Bƛ<e!H Ȯ w!_[u#'(O-u0s˷}BɲWmD!d&a4fRk@) |Y_Mij)8wb8@3-+ua8:4 UH]K$tsfA ;?5pODm!IgϘV~gl'(T N=i5xGx2wjPu 4$}:g^vC=9]L#h?m P>ZKX5%4F\ul? qJjU> ɴN)?L| +ӳ-MNo2Sl$s}3d?ʂ}2w=' ”^y{2di˟l vh26,1Pb Я^>Φ% NRwf ÝW C+l㒦QZӅxΙcOr*Y?pS8F_3Z5)x\:nEOG#AGJ%$M4umDcfFGj H+{db2IM_cvqW\ʶbjY>ӯu/])S9pzw8o+2ƒLIp}-p*&0~Ӫx^n2Z +{j6% i6nH޵8n z<H=P/ch[=RC.a^yC#~ <7`_9&W!nPdA"5Pa[ _HR49[zG(1#?T*J_Z;_Z_T,(FsI袕`夁&蛿0\XQɒz wOu&*sAD!lRe=]|T)`;|="96O>2Y:d g=XcN0~@ʞO*bVM(dV']_,t> +x}u +>k1fngZz^@GDx܁[jP +iv|2Ujy;gt|xIϤoE'Rp倘G䅙`̘%Iܦ S>[!*p/l;EWR"-L5dM@Zƴ J͍Gڥtm[HMG65k!4Qrl[w]57ڣhէS# +R8C|Д% -`ZZf+wiy歹 =ї;KPi}lp_m0]!vJ;$+ʗ۷v :adT +XO3(L>Gm|]fWe!hv&b5y+vw88L0ws?hݷcA^ /X<O5vG}i=U>*%2:<^uj~6gJ[Eb{|z 0ǿ6 ŽI/z9ɖ8󫼏*nײ,4Q,N!ZJ+"ZطN(Bs :C3iGcì$U-}v +0 _)k~ɡh%rKލEn$ntiJzZ? +?DC.p#S"eKN6hclŅm[7ε37N9q Xw.# ᝓ-5C1})~p=Mt>{Z:8`(J5ƌw JևU%n7 (]m"|w'l,V(5r.s\(#J?Gh(GnOf=9O7Zً`-{xoLsNx7Ҭk(фL|T\؃RuI\Q{&^ƙPv R'%5(=eo$kM'AX(()y@Bg vV)RG0^\Or pNE7ѿi,kq..Fl$Af'Lq{$uǛ7V;\\aYB1:8 +{8rݾ/c񺹔v/S8>iVb~7v_Yq\ay'+\8 )߿. ipNwg?Syow`Q@[aK7l|3B⽏ɉWҐd|nR-sI\Is±ȹF!Eu^:ߪoQk:lwn/[C'^2ͅJ{2Un Dr麍59던yм5DkHQhJ:|Y._.$"}#%ψ[qÜٱhz HQNl;$n!9'^Xp1S rQZzr}7.[RP֡H}_x_(cgExyzǍEPEm iJD[#TW{h0|ϰ#n-،h9\nOAg} mWƎ A`U|E*qwesMOu7I=Eu?ݏ<[oN`X5oӝ}.4Q 2)~[84݇Agj#Rv$b㚲)ck)-N2kl^4;~Sr@^l&[B į^1|xփȤD`E07EPq)= !MRқef8$>YSiI=7zyx"9ǁN0_k[@BLSnC@iTĘXgFq'zJ1Ŵ"[CU[qEhag;14z0 !ƛ0n2+^1-+z,;#^(\v/0wѺe- M° rez2^tDrG!ԃ*IH0j_skyj  {'`_^1~bF(VKi@dW0FJ,(EHvN;)JBRNdPϩ!TV4 @U +Xu6NZn>:k _R.԰ô UHRE96Z+%L2/*>FN fo]{nUԔ{Lli76 rbiE7h!dFP톳LTJ$HZA=81!vS>nUS6gЄ]<̮'nAAt4Hu|2xڀ-}ȗV(9L=E}sd3t0 7鄲5~K!>F-&i旉B#₊G}5UAUC*gs,e`R8d~/BR5_ ]w>Z$lRͣȧ\F99 Bq Qc,[H%Ę&J_i--%(98QlE*e ёeРςԀc #I-x`UkOXM.c%ҴđXe#Po*utr̤ :4FZZ-YqwG!P2'SA;p@*@SB@^7$'nK=V:e)}G:ݝ> endobj 2873 0 obj <> endobj 2874 0 obj <> endobj 2865 0 obj <>stream +HWn}[vKbX_0  %1!H^S;[=HrԩnMӆl;nIfqG7l>7mnj$1Q: % wT,nw?ܼxqzo˗޼n.< T9;㺑_7m0HvY Ƕ|=8nPƕRwʹrq=/h)^ ~^ ]6_m4oŗO}Raۙt+i#ܼ=uǘyBvcvgA}8q@L7=u}\b9xd"1)U\뎠%#NBCwn]w@YVPv0$#;?JTyn4P_alEj|rQ2 -IAε\U +p{FvMB Fcӿ=oY#+AsaKnU"}|߄ـ^dZLˈaoN] jR#ߟ$"I$q5D$N_+, + C СKw׿}N$K[DA.2!Ji3qq.08?=*x+d #] ҒX$QbUђzQ$RM~^"QU25$:!b҂)n/ pdWȈk-eH ҫt8?ܺT\;ũͪ 8/aIM׏_K֗V%:Jlpl +S{ IJ̵4 q>ckd~[GB-L˭W,|mǃ%ֽdН;i0*kF\Uzi[ +u͍nw|ؑ5T)$-/L8p eUSOEK'n؁ g^ׁYu=pjRbcgh)C_"L$EVqIM?arIQgRPtsKX* /uV(+,eeIVk6Sf-]]5kAx{.y#kBCڰ]$ (@]&_IhسawIDǷ pr%ݹ#emGI*c{0ć='ƍ-͗BeiDVc6ߑ,l&Oeµ;~3O+52& ZlXL4J(@VK 9ÎT\RW#ui(*kDR&q-@D؟@~LH9XRz2!fVRr!`[2M + .B`mMBbj+UAhܟ!VDFb_>=~32V,/!L^5J27ӗ2 nHAm|4>.+#y륾 /pv4RfTHWo(|FqK!#HjGBj  t\룕IJ=*DSa=D2;ngqyEr~w=Y6G( /@!^4-H1P‹^DbA +|~A3٭!O +g3q2c+q4Oy#kKPXиy0{Hh`CT$:fC9t(Ni$l,QReo~[mdjӛBjiT~PqTR"TїB3&Ndm<@i'5U)yuFB.y,{8D:MzRQiׅWSc!{ uL%52I HG3͌dLboM=-u ֖qΓ2d]mʗ?NBQ z٠COqٺR"=F(,3R4NǕ!=lX>t67~q޿U(jyZTC\? ,m +sX5gLp"0؏F ϜfwM.A:{B7tm/i/s\UݵAIxQ6KwuxoΛQ#K<Ѵ=tyQmcܕO'kոՌBTn{+ h8jê!ɴ]ew jxJw2Kz2=tmqYy9[]sP4'7e2`-~Fmv endstream endobj 2870 0 obj <>stream +0 H@&W H<ٔ˯rׅdu`+""Pj|ѨҟJ,)7ufwF@eI2rde^Kkd}@Bʰ25;tT1Dv9CZ$:`0|/)meN+Sg OmW__ )$%* aoȎN45m-<-&~|yma +Y%D+?iHPƠQrȚc3zبUxƨ@ \s73O oj,Ȼ?+AЪcTLvR%`كZ 67Ag)d 9S,F0κ^!PPr᝾??YLI>8:)-X[℣Ǎ3 [|>^Hn3/T9 +N|Gneڅi 3;Śv\/L,{ε?q%$ #h3$zyzNq#.ATя~ԳˣnW{y%WiݖSd5;^o7tF[uLt_AyfG uаk􏨟roJmIܟ:4ҝryѶBQ6`' N;sԸ+ Rh߅zc:ϢO̭ټ$D/YӋͥ޹ejb 4zQg}Ҥ-P P7(e UyKt7pu-ϬA CWN$y>EѶa|R^JwJPDىxnL]̐zz-ΈpEà'tqVZo^ƀz@e%Tlxl⸗̕fpu>҆s𦭸gH\{L7Z\z\7ƕ'mvRyJHTsKCJX)='D- Oj/$cj0>{LHW*)C= fƦ7$)93ɽtD>˾چxR2n#-d/;HLC}J] +BVVa KbL}򬄈{T ѽKpP0:JUa˞Ҵ2[/Ri_hSAxy=[fPr-F>|쒋oɌšjWRv{Dݜwj'If! s!yP%:a] j &rk="L/6öDˆZ f/Ydls@ ! }]XN*]8ɡ xiV?(KAcqeR\?0.1v$T:n1uŧ]AM'Y YkȄhG$T$2o3U#s'gU,YbɲCs?h);yajgQ`yN)A_o̓HD/o [+rKuNx򯣘Y|_a +/tz|:ǟ^I$_Z'Az率U(RFT{

{' U?0.#t;ıoIYFGrcE}p6NH 혋F-mgmy_δ>hA$y{~q^5RNR]OEF5Y#7̠[m>gEiႶ/V9֮b:As{̻8vo)>tJh8Gl5l (Yb9_dOF4av҄8 0zPJrpZl +HNt@yLʷl>ُv<!!%/G@:bV&zO&x 墔ZZ 7/S:~ɮEW+s$/x& Ƽ%~gIDM`@Z̝w$ m:vf:*!>`:j-* JD.[Ei}pMv|5=Dq_x $n=O՝tupD)ulas=ظL]2uKrr#yZS{'z?A2\;l2&$'-$Ku5?>Ps3\MקC!-J*~j~Ng61EQk+c t&R݈88atԏTaLL V)`DTȢW~=42w``Ne R(O\E&`y`݅pGzfJ oiQK;%nhڂxwu*Z\gQu ަa~6ؐ݅F 0e,1|_/@($䲑{E"* PN<'.9.wi: ~j",/$߮4eCO wĞ:]t:76՞T}&|y5 hym_iG2WSMj)}E.8YqƤB4RmJYtq +^Ry!UxLРBY1!!,åO*=+F⅑]v33uU"2~#nOD0Z;5xZ #y7؞=$ʉSX.2 ?%t /'QЪWJ? +ͮ^gJ`J# ]Ut6^"7N^qIiHi&tI + X1Ƈ'4{Ljhjf߰mxXwB][=oX2 '["Ȭv4B]ד@&t?T)z1{`iCYi۾N-II?"T%F}t53{|j5?AWjZɥ#؞M"d9gF#YD㶰%/S#;txS!Ћ\M|9|Nk$&u2v\l9jU[ٓ Χu7?G3 )Kh}-8ip56-d05l&ϕ/:НY H/_;>2&\ 2ZE o]Liw?4'-8ee,2\8nB9uդG \\SA3bxHⶐ*:6O=tė4RG2$PnDaK +G6cn}#g8[ٔKD!T67 +)Hr{:&Ut1>=Uϋ괫%i])w[>'_A!LA32rIdh&綇LkZ+1Eb턴^)]cxxHZ9Ligu&wl6┒ߑ#\Mƨ8Ce t/GbnySI}\7n7_'D`ĄX2pLw@#+?1EY7#h* /n6:|̚:~"lAUNAJix缵6P~pL C E+,^_㈵{#Z+?%q{:5^-Sus(8wpb*TRzwLZ$[&h LS_=T7mf~ G8=W$7P ]C:;4k;hzlյW~ Z;JܯFw3DeoryG$)!=6Ka&ҋ: 9p%PaklPV{ `]d)#[\#fU"ha6 y3T@#ԭHţ`&I]: +mY'ZzLmQs#ÓcJ5d$ͣ~1 +~6:5 qQՒ.=*^xm@Ծ 76:XOZGC +3zkh-9>HKicqԢIotq@QJ ?lǔuSyxaDgr, D/B ,y}&loogVp*II>BRc.JRێbcx2 (sFަJ7tKT9#G$HޞѰSLdM `om:e;MT@qd3y46aڻ*$)oOSX%˶s"_0TǐzzX Ԑ&GGh9-` Y\P6Ջfd 1}x'T0r 6~య`۫,zaL(da:/mIuS|-(+O7HD1q=D_3^qd-[ eKD".X}!ǽ> $ɞ _`"y#ˮA/[L^JEBti=IuFwߙ +o)>b1ydp4}?λWB^U'},N Wy70D9]>o[Bz@%{%} +Cm'ۑr(N`S2/A{CBn9bDyqK {6 TN-]߮0a@X HƌT-'_,3 +DuW`v~.*1K, BeVKV3aQwfDFqq ^E< +vwGSát*(dM]y[-fsYG4]xL4BΛY_92rUt_mkܴU*HV(AxYc+9MOmwb̿071)K6pP(F0-{B+K?nY 'w\ +!&}H&aALy_28Ə 礚>!u=u'A772Csn ƢMX|:ƶ1i&DRq8 +e[ӟmZV-:og'AcksS1F +Ln`"1]M'OԄ#jaE~gPXǡ(Ve\x_ yzT˿P[r&d q j؎*k ttPb5,<NjM |qx©[OOdRx9F,F }an=nywGI\Ca>cHyRD<,zFC}Xze.)P]}s8"p~䍺S2.zZ+Bi2?,AzsM@z Y/d+"$XF1D#CL S#je}G[+IH̡+6_[6N|ĴCU /ɋ|%AeVɿmZk1_P>nr#3}+9VNPnjS4Pp||?-:,!vp܏F9(,xޝ*$UZ8&QrW>%~,./foWla+6jWަл΢9jz oj1ʝy1ooÌ9a@th sJ΀54Vck둾hZɜо:Jd%͢Fo49p'Lֈְ$(ad8@#R;shG078% 84'T7m8d I%iYDQSAT1k EM-EFYx mG4PH]YᜭG}|zP8w! +* V~i(B{& Z-F yJ{y@FaS㭠J"q 4$%o%+(#m|#A;MS1hm4МK!D{# eNz6d'E^ llb"l8"Żungm+o"volhAWkDyD" +/-:%H@z "p- ׵&tW멓BիUf6n1jѽ(hf ˭lĕ +jmY2 !nC9꽙s}߬?%ƭhsRu+>aB過9Zd 0u]S1$ZoƐJ~f|E=g_Do5 X6ikb3Kʀ#n]Q(s3QI]j̛ =m;%uJh~LvLeš=q$8Sw>z17C;A28xz _4g&8蹢g `Kz_hhK͉K ?L +HG PI@q+)yP_#t6m#)ۢ@ %+dE pq] G^;UWto $gO8p\./i-Ħ g^T@ 3?i1JcoGhtN:.瞿2ڄ,N~ B8u[cOe'8 +.; +fV-R6|DOO0-zB72' @ $K4 +DN:WKH춠λbLˋ;RpOwⴸ˱@Bj563}KJqWhI{fL1X_$:PSqm4S 0&f>jWʄў?rU) e,}gIߥ@zb%sGOgڱ+m: ҩ~|z~51˽Vcئv/d Opa߅c?y'obQ"%AE6mM˴PV51Tt8( r#..;;T1}cQ(.P}V7d ![`e|6 G)= ~xm ++^5kY; -o1Q)B˃Yh@YWo@1vWU{x~?#$SHW߻tNI0bd4Ľ*_dFE>~d$=mn!MVqCTRŹ!\aJHձ:'wAx.*UGY5V08fTs o-*< 3Qǜj8|TG$E6 1 Ek=-ClPli`=ia);`dR._~s45#HM?.i @pH&Mɕ dڞ7_`BF&+~xuֱ{E=I16SHE _cZ^0-|o4Л6'ڄ >M9[]6?}` "HÈRﭜStjqN;EHa Ys RPgzR'? E@H*!AoHmtچJY./!0)r +M%PR {IЉ +!s~s=ȭ2pzn%N\UX4n#e0VZI =<mmV/+k5f\*b d 5_lZg7O[&\-O@߮oJwR 'Bl}sL{qѽUORm%2A`ʉDk MaղܹQ|1b`htHf"s +'k@٠`Ԝʆ%6 ]y!;1>լ00;y,oJ#+ ߈|ג 9TZr7H)*"vp7[23@oDN jGVRhs'~J!`D$`_T\ZBxf;DNJ|ŕk0cb/(luOT@AvИ$ b[EX*P4z]_ʄ94[azD`ٲpPohtؼW{pd۹^d,}*R$ϫAʬ5G- C5'eNwyW:v3^hn2KPQjyTc L79mu] !Gbcȯȩ HK/q `)Ξ3|o&m=;=qΐi˛T3\ˈXIJZLHaJmu+4 bⱙXuoԐ(:'o MC?EZMfK`*[ z% [4yؔEh(QW$^;\-+ΞӫlvGo9׌yR%b<7Pޢضdp۳3:^^b`CJFaOnBO _7ޝS쒖n6!t5̜Jao +[dT:Bs~1Jc2忧;aw a~9r qaNHn` L@o#P=fMͭLB~C h1wU|ɇ.)y.,Jڢ"J^Q>5HMV>̶~G`&Ci=KH/| s7 U%!>W稔ւ@n]<\cޑtƃDr;OG$[? -u2nY|ʒ kfkF'$'}p7'?gOrBn7Mǵ +_*njb6i^JCңq(.MtW~RS\=ڶ80oQ)yoo!aT.,?9D Ri>U8"Y&IZJ+^e"'=Y] anS9;.[:f}C3QLJf\C +*\85P_{+, wߔ\hm{)'bML=$W-־oE:YOi;H❰V3|C(J-|,OGz↝}S+VB] j:/΂@6.3}b cO'"ԑE&g|8 F40kQV[ `Np!ʫjy9#'D$k gO Pi'96/NtfB|DZpO.QoMfz}!;S1][&./DO9M;fjNK~xzW<⢖CG\]΂DfI1ג<%oes3$G$`b#G-˂qEQz3* E74_46zum,zx$Ml2wtjX _(t=0#9p3^s;?g4wэG ׆?G*^)ţ67+ +w[=k{ Υ]\|xhNU?|ȏ t'vPeHcھ+_k5S%eP1fRސ%@+2N2|8]"wٞE3|kv8CsT[eg! +"?p0>l!A^"Ղe!k>1#J7q*( +`oQ2#;im;4+UGo 7skO'"2ݶFl ?l$XD3P,8C oF4X j$ENY f#x|O#ZG1rlT)%Q,°-nZeT%1nOln@-Jf=2~3(˙%ƻWei/5;VMsrc93:ZJ|.m`Eg{▧1 3TQ*x-ۄP'Dj +K͉ +mD52jApIJ&6RrGwE +xUAB~Ip  nE]#+`j.}lDs.e?źi +]ﬖ +3:B@Dk1c~}.03:s+gR rHs"ͧl?LE48#G^+E'{h>)θ=z1h0bta߃Ui3H|i!\W`ٌA"ߵi)%g)C?ڟ~W8ڮ*̃;'sԝFkR0OF|e$#$mPA MXs17$u~fA:4oz):{6}HE74Wm*>X;EXc?jH$2RB(^@l\OhȲqhVM^jtN KGu\"rZ7ܓ9x}Y@Kgeqˮh5%3q-rb7$( d:&[r@gH8#tAd?6+9) H%x\۷Mr:bb&۬!0f/!MRAEQB}~8AﶴL겵ձÊXCި |=z@i18ɜ=&Wŀ L-@RwGoᖂEkQUW :5Lꪾc,]㏥x$UhFGMJ.Ӵ *_e實')~'vLfV~,x(dƛ%q͒TW WjwU2Z췠͝!w`\a Y+i@/t~7R^FbcK %8jbVZ JP[ga/Јו=0f{3k\ J|}ɴcAz%;h$K) @czdlفMfH}Y~PqjQ.= ^Gk6;"=6~X˙LE%E0pVTR&4]g(ojn0 ዪMCBY|N?S[V d虉؇!bHih(m@ӊu#(njjumdfwGU=_]hΣȳM tN7($Kп.JEփ6E/q5A~n>/*Ciz qJ$A /sYPjs2mmq֛fA\@UVry +ҞY|,tL +1;Au{F tCw:U93ѦHJmWY1`RW{R?ª&,rs|7 PTB?c]#hfd96m +ǝ`яE)| #_/Dxz92w-ųϊ]}D[]Tgl3v@[bu5 gLM1dCxgǀ64]%kzm% +\s%F!& }Lj etZ*8vqr(ߧA-K5ui+C@)&l[휁>6Yдfs4Ay?} Y˼T7Iν@8 WH +X .Q!eJu3I +o;Dq4ahy{Uϯ5͙@<9]qwi@;3cY|?yOFg]6aꔵ-V{]ߎۡN\/9}p"nryĬ?BZ*%ȿ"JڦW3d ^+b麇_&ҵO7i@w"|KdPeЬ%@fƈ}ҟeլ* +K* WnvKH=QLmiDFաC S =|s3ɘAG Mo膡>95F؋.t7<#? )Z3TlMG)dbcUlo,4A}a2e`cO6+_r,϶\ʂQ %74=zp&\nT82 ^dmo\ RP᠛1VC|BvD+ uO}G \>6( wbcctaUVLE&e_S 9Oɮ}n=APzLs%&eke,#iL +?fcccW + TPY>EuH/Vdmr߸D,a[o%)ɐ%j5ցZ"{|WH@;XWyysMvS4J+s[u @ɑxd(R=IaJEcEWs-坟a 9ӏ %tJGo#El&~FXΞ%  <&*,ʒT|K,q@L3i~8f> _pN{Wi9̭Dg5j=Ϫl3j5HJÓ!Ft{AjQb ^c~*[tB*{ږthX +i֕W5*(Am XCDvEG=m`H,HBK><,4 /nK(xUAd$Y@|sŕ(RC-mve(OI0@Sv%);,jrݲ_ċq@sF 4QO.(Yi2u}W_mH?qfE:7(7"x{8P/,žo=ԇ0n\P̜׍0謧y\ 0߀`v׫X1Ny.bO.|i7/0U{¾Z+xIy 4@ώf%ՠ7o==!31胶ؔP됋1&T9iI۶qBAO䵠1ݣxW + eFXUИU U-H{Yzy}+Jv٢qkYQ.dVqsTRMY΋\L-(lM;BMBkoD=CF|!:ORgvEM"h{O2ҙR*slj#w̼6T=n}e^:d{HC[,yWAt>őښtȽ LІge Fݓ-d~#}y92"մ>38NQwYK&^].э΄de?l|Lh@f:AL2CRAN֏F.GqfUj+Fo6~N(DӔnb.ad#^WjIw+ :)";m{S4g"4/!٥I62.qBFP#$ybq0Ns/i@%dV|~Fk}e Ejx;+0 yB: +5R/W]{>xT"-u.h|}^`F~C]b4Sѡ sϼYwįCum$Gly!'&_$^M0t䲔g~[Ϊ :zqzO[x^ze|-vb8:N[Q*EldciǐlդaDi:Z*8GE6zVGd4 =Cv<C Mߪfm/G)kO?JCEs*j7^GXw#sp[X_e2l:Ob5wMٖy)ð3-z.0PQE铻#$B5mlBI_Lup͗G`b'#6*WSdRQ Ί~|>rT|v pdaJKa* X_"unG ӈ_urI?w4]+IHAF%K6gKفcTGh&|rW ~uMtr CWa sy;P/a#Kd(OB#Ƿr %[TX+=l팫~-SeBmlZآ[#~=]#\o)CGzM҈͎BFdL0>JVh.6 /V1)b;e͊m[ʑ_u<fWpEk9}%kivHejP<=<6+qMpTw/3[R<`dcA9\:TR>W'FKVE3kANfGJKM9g}mTEJ䶸5OG)g#!΃S hU gUvb@UdfvsP0 +@ٝ [(2Oi +\8"v3xix IM\PkiMT <- j/Y+/]o_oH|ɍ&0ٯ#-`KD;GH"*!v7'YAoFv}ғV6I<#Rj˸ 'l(6d/g3)?eCkܕKh4{-'q~2vmٱ7;:f+QLn- YŃɺچwQ}*;H8bEm@ZԳ奌?/ 3gv.azh>^\FYan0f25'D!V|V5U=4I8 +\lۀ;pїj&A_gL.)B:E&)g2=&sͲɗ?Ilp3oP}khTGK} -CT $DHik4zOD8u+;O80+u7ୋKQ +;tZٍ ;/sj`O~g*.+0xob" +ʄc̶xY+?'cy%L;T%Ny_~J j,4Gi8\UwHa3nxxKQdpJav2U*[v1->=P:ЈgOQ~ѷ:#fe31b&Ji=}?Xt>2sVL#UZp!?-!U +o]nh.O|*hzWq܎s܅FwWHW kR댳Ak/1$xd@+,"<-)T֗fUoԺ;uO'gM9YPJR?>2[ q dtK:xNiׂ&E/X'Xy /XuGnB^bCF#,cMTRBsc1-?Ƙ;3 ?q~Ły'"kTx1[bGhQ,_2Ҵ7#!UuO%|:2 K(PWcI }f@WCxdX㩽6<%g.[-:t;jfr΂@ nrDMe|?l` 26p;Wm4g88ES&Wqn{6Q졕y.Qth$!\)A&lY"iHT[|ZUh14_I)S5@<郀ov2 wX,sNs"Ĭ%4 kAoVG𡑓߯Jh&i\lD< )x妗=lL S J7Q}^LoC^)|$s7j0oȾYĥW|"H$  4YD Oh&J彨 0{b97c}'&XjðJ3 癉 '{H/OjrsZWGƎ w!}9Hs_iYl +X-dׯm(ARC]9!U{%W+//tu6GRlpMzN)FI;f˸f[` AR %6ΤXs˚I*Ga˪;n0CZ-gWoeJW-D/Dp`k #ٖə3U7鵋(K%3 +j^v2qD˸ YP_LSE=\U.'5K8)FM`c #E3}\BuǨ00a='zj:*fB=vMYƘcn[цJDqXq(&;=f裤x\2 l +(={uB OL[u-,igSlDZE`Af0{#JZd=].)dOዃF!ΩTl59Δe{ p 0BT\P) o0!ڢz,}Vt;ґqؕ<à O!p1 н=mTwܡ9JoPU 80m\iy?5M4Ay~LE Ց0YeCڒ͢Ukl3jsv endstream endobj 2866 0 obj <> endobj 2867 0 obj <> endobj 2868 0 obj <> endobj 2869 0 obj <> endobj 2858 0 obj <>stream +HWn9}W[aXӞ !zmG$gb,eYLl7Y9u#ŁyŹW (&o\BhzWoG<WP]qƥըղr̴7¿mJkτGǗh}lnW Wxtust| ߏպWwWE3ZW~yz;. \rUN3*-WYr4=PgȨQ>=si'a^KY2K%ӪY5s&L87B<  1,'w6&/^{R+C aG`agsaBT + uz7k 0>y=sb@T~їӋu@V{f{@Z(zoo9[xxe7;I{Y f~;'aƖoG(EPU靤8 J 0йm.8&u|㤞5]LPxF,Agd V1{t,YpyM?:< +?reHEZa/eP"7WW9Fya 69|ξ'WT[#~__>1 "$|篾p};n&7;B1fFNb.>.: f ݯM+8i=23Ƙ6W+6:-E@A/g!2co3iVXWSZ +HQqP\HP-'><P + HdtAzhEvnA(,m-+.GḐ)E-Enl{BIDu*5VJRO$+LâaυV\}ՊR"#8닷S6VtεeP*pxVh*,ގ'g-_ +ĝ0[H]yZCṲ@9`FA}q2 MRU> ]0>w>b m l62umE62{#9OBFA=o`>$i|7:!VAWY*nOp",ħ?尥d r~lGA87zc90uZ>?/EI3mRw04Rv/ҐvT%(M&u]z*|$B ¯I)}yӚ,Bм;RnʝPl!wdjo=9pgIi +k nH>^f'Mt,uY׬Wl(WXJL"e25=O-{Q +/4_o$!瑓Oq7ƇK1|mH1Ӷ#e=-i=?6?LHZ5ƉDdzUC1/3/scWx9pׇLvdtXcsC:Zuwz$hX48/y'ஏ7:2+Tv4-ZGYŌK* =w,@ࠖn~Ť9]KPzaml]t~X?&$x[ ?EqaUo00 K9"  hFQ3Al 0 Ϭ9:0*Wrś bȀ'-r,#^v4f//(Ddg7ZK1d=,陋y`;Hx+=Oz4 ѿXTU;Et@ +X* +Ri~ ٱs@+Hw~wP<(H-Ki/UR1AUW͡ "I"*%LAW[ dYf'۰zt rݱi +9#$Ijs DM[jz Hz(E e˗Zn% ӆxF")M} /T&&Ug*LNYzX(]2&K-fH pksfJk>~6'A29? sr0jϹSHE >}(!16˫[Kqy`%h.f(`$svmt2~.S\F==Oo0cGa@]L6cEl7F +~7j3kkV{i0 endstream endobj 2864 0 obj <>stream +0 U@&S Ub}d0DhdńhPMo5RdD>麻Đ~{&Z}43u@|!MPJuOҭt^ZkF/x&n%T! 6/fVܥa,PE0#ݡG6:is| 9-tIvs2Ō3Q82NrX, l)S6Pz'T1 r@0Cgdn(y+vcm!U;T ؔX'f?m; wfաnN$! [CYjU=룑=FzA?^GfwHS[>0QEAn +quU_oTIzcNkҥ'[#m#o_r4ťk?i -j> DXv5訞RESy\e%k8Q7BW Je·zhˉfo8)#(_G!ܻ1R*0D>73B +)[uJ +u.>;[gn?1SBd5_4m-dh0gPMEGW.GznP5^`N¼%XqYEݟiCTr0n M5GΓȔUAOO|m,8~* Χ +Yt-t1RiyvIA' +l}pNwghvjT|֖Q`Iʓ?YI LC"k7bA ? Z?tQ =. +Mث}pWK鈴‡o:.Y&.*m81"Q`|9P,<4LE_+#H%ke(4?V-rf#JZ͖'Χ _PD{U`PcG,yރrS3M[6;f:k^pW4[cDD J6_Ti{ŒR@DG Oy w51(jo߮]\Z1[YI/Iyϸn20r5"03BX MqMc8URjQ3bWtc`XanaZ½Zp~hmmJY㯌WGj*W!v&CӡNN]pF-|en,Ld +_~{L/Eǥ:#W)5d~ x%h?B*⾛n)}c%sόS6x| IVQwjS<4EJ +II\T# LCN2%i Fbե>;:$]GZW|l1*~'77i'ϦLFL M!y`˻<3Y31oKJŽ*RAɶ\1v'>kqM>&:3M>Cz kzww.Kamxu;ƭE@F2ZQ4Zc.?s]~Yl'$H2u n;er-̈fD?kӒ+ZD;BpW i c .'dY+o*>?=ٚ%EVh4T"|d~'IݹԿvKl]ۑJiT1w2Į/tLDY ?=b3{H~N4{sƣl +F +/saTZ𯒛 -Mjp߹ ysc,ɿr!@]$}i/>Qnuӗ{^U-Ak;/D%֖btbO7i[98mH'Zğ~!1Z={<¼!TAr獯C gG)v)Ybf n= c#a7O]6-\K"N}X唵6Qل,]d,WYKRmrX'X_*'5'IM('/5&'X'zGhwQš|M63pe bu!q=Bl+nlNG_b S>iIacp.,6m9jp^>&"IP+S_D_@My1M !h&3%`R} ! IyŠ4S*J6ݔD*IΏQF ]YŲIVb 2D/yr ;i@Kt,Gwkr~IO\@P%8~D7p&E [T.狫ͮUGsý\x"`9-3-X}wY2$%cigT2|vZ4v5_1IμHHEOgm7?aMkRNj!-袕\D zZ#Tr)Ϲ5Lqe{̯\XyhԼՙF ɢU1ZxrI:lIx\{`C`,R()E@Ntm +x&U/bqNq \s?iy"Xv.Ԋ;$U<sWcZt~x2. +)Ubd!A71 * +qvdcR:5 -ڷN>; :h=&̩O$&0XDMUc2!Gb+#DT AQwTڔ, Zu.C7/v}F$}ST_ѝ_syLiTblj(&p )M9lҸL~3)JfRvާpV73!f--<9&&HDx:` +ZOW[__qgj ԦoTXHC4 +'y6W;Ǖ9Y?P.m{ A EA? 0?\RsnpV|:_^&?@ek${4y}<vWJݓge`r֢\m?m^~]VY'4kʤpSQ O @Ƶ\y/Xx I΄A^Fcõ\yO{,M;u+ CcLko脑Z3h]|טQ"Ǣ|lxYl CS?OEMXJ1!e*O̕r=5(`DmOmh_[9o #GY7{/ECIf +[g^=}"d5/2kF}B +OgVu}nq~˰49`D[ݰXw8YdB +^` ]Xo~m X٧ˡ$}#pt%wՀ钤N^ $gxj 3ۮBz\{Kђ[@Em3QK4SE3PPu]dw8^*}uW3>竂4y\r6@#4U=/OuvC87>lN3le*4̴8: O :$MDd7ڱֿ\vF}lT 9w "2JLVz MʉfȪ9: Bpu?V`[â2OqU#+VIQ @]9Oׇ $0yU g^EgDwH0ÎSwmK1Tkg;*`rqպ9X-V)uGxE*|@Sö  :Yl Ny/ 9,T"`nآݷ!?ISѸg}H#m:jh|.uuQG?-Bҁ(ʺR r$xxփ=Qm$WX,ay(?6n 8gpNn:Ex'SJɥt6(I.)Eڣ9VG8u Do@JAyZxnL?ÅpLu@ Eؚ|gLj"0-P.OhK'>uρglMuSn=;\ +)A'Ivme΀g p) 4' ްU}Hx,&9\Ћ=ZSuh.3TU*|+I3%Z$դp^$ e +@]Q"z)q nPuArcϓ?;N-m"=:Rc(?h!][x22fQV\~&VgjTЩ${IYQ3Q02#4<|{(zXES!,=$W<`AmBbR]EC8۪)kik'h hng]g*YuB>=tU$]5"ɸ%/bh> Xp_ ]S563zَ1hz DC]r} SEn$cԢ"[_ 4RANdhZa:.H}el)HPQH0mqu13B^bƴ)y<Cu`d"=XIX4Hկؗa=տ L4#hq~KKo)`/55ruȀ!TWk8%Ww]SD7nќsO2D0Ӟ_AOͨ> +l>Ǻ%FD&( "xq{,Ce]rh+ÅL``{@!|{m`cnɲcv CI"uq0KNg9!--y,ӟ\vL>mJ[lՠZԳgQ2 8.:Up2?# +yZ?Ό8s:A`6{PN*Bۺ>cVv_*4@zUc+'eRR>e,j9 T'7tS0#/l7Bc2U]ك!rPm% +ږo!gk*3\5X-KWt +^) EU}V/Mo.^k h CGvft/#d]b4A.?Q@oe*<+}-`d]jYGSW0F^Em=9zZgۦ{gѰŗƔ +6E#A:gp~0lNnѠfb]wdꩬVPcY+1Λ0oLW4>tNef1.}OIُD)  0RBΐ;Ifh8"jg?u"q^ pØLWBbt0ʚ 7ᔧ>NyU MymP7NQpakE,5fCZBsɬ +;qYڬi(2kP44hUp]*L?&B;@-NăOVr>`yΓ̖'&5;*C\J'N 5JvH/"G?R4̩4a +/y?UP B;*uFsܳTQ*G͎`-R r㈐>B\u2-pxJ,Mf]5T]~w[{`6B=V29JG-Uڮ"Z[ԓvj XtצK)X>j;Xqz(9kl.mW'#7{D5V'E!26%A||a-wFSu^b)J6KAlϭ4M-1zo0 {x陨 +-F KoH7}gj!F޻xbljŢHo$_sDD% MC=U51Rh¦8P5L愍vQQ ^ݍ?b-.!Qaxޥ^[2R('E{T˜fʯZ0!6SIs?M]~ ,r!º~XG?!9s1&^L]ƍ}N)+l1i7-ى=C{]qu37ǿ[^$' k9OR*əa, Ku,ʟe:H+;[:86~@DǨ]1Lp;,}8r*T@Ժ[ҋ!|S<:c)7g6{yAH.ypXMR0~ˎ9s&Fvswh~Bqc^fRl.G4W<-U! GL_"&syETۏ4 pqc4ϖb A5A7*d~1YYp~#Zz$!z}$A?ƧT +$mb;NپXP[29JO`&on"0wTA8 j(aTىBh(vKBCc1bY +z%Cjv]j_xSLQ &Zh%X,2'g̛*,~;)Cy[d }=\p*+©BS u F)Sęm6 +|{&$ߝ[852 ;@S̊v>FkD2sˡ˖_^}.EӐ901@hH1U, =E~c;a2lb[ɵ_$KUɲջùǐۊL+9%TdoN gၕ3YöL_h84i]. VWM/9tdCeŒ=jk;C;=Hйqx UBd)IAG}^H<|(UPM&{yց-T /35\b+^"_̬yʁ*Ξ/\)uCVmsO)u([s}`KY#=@i!UZiZzn +@kilL/<< b0u?p d\V :~&H'Ri5.ix(V_hQ(ADmij"Ya]U-bABŷUSQ6="Ht^.ucF$sRF`8:Ti[IRcʚ$jV͌bf$6R K8¾֯VZͤ6;Kw$ltD DtmP?7_S1v|>eX[R)vYk 7y宧SL .i߳#iC!aK,>zQ1;.abi$42_9|)#.9XNJ[<86 ~~V.9XRbIŻCN!h@=u)v{1[x>4̓Α\OQ|p G2_n$a=(*a]E]yNBl"2XU@S"FfΩԳgVv6Ohп) +{z'>ĺi ԭSGABǗ.ig2ٓ}M"oܦxmm0X9H!+o6iCW;a`b^Tmk8G۫ W:/as3[ 8A21b@JDs㑈U.=:Cx湧L:=nٍG1LbwQnhY;‘(2-:6H fm>+@cr]jϜҷzӖ3Rȿk$ɡгMNAetHmT,$qiFt}OM!wX//ֶ4t F,FwZ*+&hMu*Ss~<qCӬ/^:x{q:62ҙ=LY9&adP挣 vf,j#_:4fR0nZZ۱GlUz/zs/6bz&Z @%ԝb@vIN6{Ҷ+IuK~fJ?IE۰N$ym*si(2#\hdwon,+0ax5y\wn ϩ:JNFrv<wR Rz`Tܬ'6h?8ҜM`] Phcy%(Gӡ˰c-VIvx2Bt ufT6|Nu.G7 70x", +"N4iz;`{^mQz9b` [$V-3vb:$\XUt#WC8 ҥz rmck*0`4o#* &uK~ŷetNDұ~/@ETGb}q?)3F8)1m)ۍfw=>JS{I?o|\{k@ WTT S{)&aĶn ­Ǒ +RpG">}ԁK@_4@Olqs΀m;MD^\cmU0AAR6$d-y D͹0;x_A=Dy jD 779y[wZr +I݇/@ƬpdQrx݈4{!2v^C­EElpʹ9(Yc[ I%咱N;_-'f(OCf#_gJv/ݘco$ [Рhh}0Y}Ն6Kg];m$ +K>dA6˺>^X)RGj|iMa@ځ2Cw MowcY=$:.d8N4ݨ]6Z2OuDӷ-G7C]@F&ˈL[kE +MuODjHOã%cR܁ZZ,1? 7fͽ#F2>,mFmo/49"tnY gRt:  /GT.4SՆ &.Nn|9)$q@ G%JoI ^ېjMu}Ll ۬n򦨍8ęwl@H=V: ǺܪԞ_Ft9%ރ$k#.$s +mwi{bLV&q&/֦^Hނ uwmKئq4LKz}Vbo$T=g4«)!-0K;|:h磱kv\P"e3/7th5* R6NQ +f2[OJ :+jչ@ь~[ ꮨMDz;6{icHlGݝc%\8эg/Z,]3s~=yfH\ +iZL>1(,nssOUqXk Ѻhuji֠p<7wd{Զ-e>#ᆲ׵F&8p1D侷*g tVc>~D5OeT孌IM@C'"T$_ fL? Y7ޤfSXBMZXdo74-9wrݫfinS?;1R76.C 0SM_<OwR9pr _~ h`v})m8HH3&{Z[rʶHJ2T;1dxL.I4%[GT47FRB]VFYC5R@s -'B%wKsSuN +K^6.,gMՖuviG!ͳH3Z+2\aX-.{>M0X^V{bPb{<3/Wl) K5qa|7$=2 EZEY(iAzU\y_r \xҾ{qu#NBأbFAQp< +"| ^BT1>;Č Z(W?L'/J}eiϹ^$^o UȦZCFpږ|W@"U;uYPXqz@@ON/ex`RlؠIXuӦ2W&cq5xG໱)P˘}9*LvYuN`08R|TRF4o뙑7#A\d}eE W,ѽ(p؆.V|;7 Z,Ϯ`5dkU3V^a?rC"T3"O{OE;ƹ2t}>B} +r + +ΪP^DRm QU_x +[yE϶aS *Lt",vS)2: Q0j ^wzpq*0s<:%q0:Tʞ%@z$D9SD5N(𳤽Esn #'pPmaGil-PyHk(3U[|<5 kNM.(0cpF%Lk9H:I#qS,p˅?CH䩯AIRnqSX4"H`]ӉO| ӏ(.8gΗ.Mn!$NkC +B|=6eC6ΊRI`VnSXg!_!(1) &y]C4\GD3 +RbؐL +Q4u?̽o1t@@iѾW%ĘK j)*c^0+r&@we:<^p eǴAC#A؃H_ +7gv!H$NP`'RdJK?+ a MF+\F79)&XaΓSS Bh!!px@g0|3wM>lq]Akwrz 0M(Ӌ,M`a +-7w +`  t]#^5PˁIŗER +3aivM E~\sk!dű[\s,Oh92(K!gt*4(6-{\]њ ^rY/Lc1T 5]ɱPUqk f%;򅊨$ Ύ\_x5F x,{$QZ2NbAe2ּ$W(u~) ѧ+Z'QfiELHCJEрqhM[* q(,=t2K +yv GL7 יrr rYQ*Ȍ6\,x4*p}C˒Xٽ-#{Bwb򵏬| !Y!fʂAFrr{5@6:rO~iWP_Q%3J3|vFu\/#hL+#`ʹ`,+Q|nA#߬?\_Ʀ,(cl_ >BFƢ5}7e #<ҒeodLORIݝ ŊS†ԆU'9m|ΊgC~rYl5(̐SêO; 5 &z@?Z$;.8lG7O#ؿLJ)Z'j|Z 㭓lx<27/%S "\ 4jy/x):~0aFuWjb9JA#AAǴǫM[YkU}YQN;B:֜xHV״v&WP(F:IjOh8%h[jf [i0w +[]Dw\uɦ4xKVdE9˕+0G|ŋ|}! G[=$i(S]s9w4h[<߯_d k2΄g31dS0EwpN&qDz3G44wvh=wo; +7g3,xga-A%rNYT¿_Tn"&OTo3H o,rB)X*M,nm|Zk5!FCTs&hGӹ>*b3Oygsx@nFL %6`om g徙KJxp] +(hHthEgL>8:l,.H'x43F:FGp/Ý/;pZۨ▂xDO53t)tX=_{~̣oFFZ~}YJQ@vB :8^@++:}1AK~b"Ŋ7;;3Lh2z_Wl5 +?>_DD\wU0ΖS{y4q#I=t|nam nk {*7 HᴬB /S%E| h X k`זJYxbvb' xR:y,}G$sRdM5z +2Q"tƲ]S5t/iDʕM<;6T>P5'$E䑊2V>,eeci ^nd?GRn +, o8dܳx͓[щAX JH)OYe}I t=B =CbZ_/FRC>Nf1]ID /Tlp# Ljg#eCU.“WTtZy! XKsC 0>Y 4kvMʕ~$ Yrc +ovv[ sif̂m?AtٮmBg1‡e##d& w( pE, +׏3*l7*mYZ1i7ë__t_=:ZUe(PmdLa<{7&Yk*JS Vyhڪn`&X"ca~MiV- T@f%sy܎ [q*؏ + j[ :=[?"͔\}"=*1rq]tIb0<(W:hT` $4H$;ҢЗR"9 % 7/`bt ̋ ,pfrvr}P"c6? _ƮYНؾ!`!. ]Sg99P2rHŦGO/ =gӄt(C%Z/cAnb] AQ5 kWshqc\{cv4G0S[{ytȁ1.qf;ީiBI]YE)}$k9̥<|wp0)OФjnm $CZU˶,P&^eڋsZ҄<#i#L1"e"ֿa+?{{im`i>P` $1a.t%jM:}\NYsMzAZiг+K.J3&iw׶H2uW6¤(XYpeaf82j~0xMǓ +-rlJ,d6ZpulVCk SФqAhzZqLNZ,U 9k<u M<sAW%-xQ.l+Dui܆jk* @ ]Ė7g$`AWϵry^BhdvhKI.:R0Q5JK(j 4KՕ9Ĕ\M܅oUBAvJv-ec&*;&͹&/}˜d"'R޵.^ += {O]%nAuimyL!hCIBG ~ P0D}wb_Cn 2CAۏWA endstream endobj 2859 0 obj <> endobj 2860 0 obj <> endobj 2861 0 obj <> endobj 2862 0 obj <> endobj 2863 0 obj <> endobj 2852 0 obj <>stream +HWn}W%@l.!d2IP^+_{͐)Y`bu:8')u$F _mE<;{7c kfgPhfߜ 4mm{\ORQEpjvsv>{z@߻ ԉͺ׻>x ƌU@n%Q@bχ` 2(GnDFˏ]lŮw?4c02* ^op4FAY]S-R ps0Émn_#%\YWv^p?>" 3K!:KWr)SFCDEW:<(. clr+Ҧ2xz>l«LWS!<+8lƞOD{WBV+m3WƵ`K7x_c2GpZӫS8y0pLn3 dY گ۶"xD^166!I'e/k׻eE!hHtT<$7 ɌUey} IfЃs.eaFgk:V\O /@.| .S\ G +HbB ͺ(<;+D($MC>.w[۬ .?չ՗Ha5̽Nyo! +`LC`?Yh:`Ʈb`$%8J .cۛ['%-R#qU6e㠡!vXnn}W HbIPvm6iV +3a—S|V)ve#!q@34fZq$ {0!v4IXtwKq=nuUk7/kdݷ|WՙLAs^Itq,T%so˚pP$b <ʉu„6j5IJE)fĈRinnMj@P*d%f]گ2Hky3*t N +c<~ken~Wp.bvPfU;H҅k&G"+odVD|l7yxEKSF;U^123AL9xLSѨp4>Ci{I-h.`.F~_1\~ \e +b +z}Kz"p^[oXɾ072/l{ ǹ2KR[G.(z޵z4FnܫnJ k_<⍃ AcxNGr +x5yqI []amৎt߰o6;}5ae{rMSBȴO笹悛A"5P*7&Km7^3eL GBE,_,/ uNNw3', *D_fFj'6G3bb/#!pQ1#7]wizeD{_B&㿷ݮ]W?v ?Q}c I  ҪphoZA^H-"΍z~FynGhozs +S9tk2|Sy ۥr"RKqJB0߲F-'DM ';Zo91岢Ȗ0}R +Q +rǣeV6 la*+aa݉;ч69N၀J4OLZa*IKEF{x,M*f!2䋅N-o EGX>vj}~&af(N,&c֎$!AV$wýX r(9j{<VƏKTh*F̗fpZrW5m+x1l[|3ulHh4ݷysh%޴|;u8vMmHfi׊#M G M}ooH/xX$%t}Rot4-#+|x) "fK,ʠ<yh v\nLWZʁaW$j nj:}A1D..y.nx/A_cG wwsH**t ɄM1Z¥yɢI&I_*1WBe׳($$.[i4c$L) -k}DC-FADEh o|3C Dy]if U {A 8Ьa +`AⴽXngI{,NUI/A] T۾4֟ԁ'dpp,HKc-˟tyw endstream endobj 2857 0 obj <>stream +0 U@&I U^:ZM4b91/ZX "\' Z]>4ĻgHp`1hPhx=ԏ=|kؙ̿Ʀ@4ˋHWW{շC&.[7kZIx.Φ&u\jQ#DqN*j$; C^FN g /i r)jiX뼐91~d;\Dۥ,nI|Crr}r2) FHNfqw<`7Zt0gyGoU}/TQ/;"wqw{5[tBݒ:[%}rEE1lbq T-=p*0-'kc=4Ş[~=xo+4ĭ; h5z&W/1d"TdQ`z87oLq$$ Z7CseR5 #n0' iMM^_{ eR7҅[b5K\aPe &f/2OOφ0a$kv": AM&~1ig,T36ʬ7/;i%^Q 2u!r/g9ha!niw)b9*@4AfMv>!_YDֹ-BL %4@GT;!0D]Sf^u18o| v||!!~$t +Y ѕ?A#-u.*]42)Ro@A4\_; ,|1Q=%-8kNVl +슴>RW!|)#$.v~A;Äb`)54.kS!*]z^_ŕ'xNj&|<[XyQ؂yя:s"@/$]hkɌU)ҖՉ( Եi5ꎳI 6d ?z~;u =P}$! ]yBFuBr٢K$H:I% #B)A6ۼ8cUJh.;oD,Q󽕷;=?BO[}2%n]?5l݆$*[-랐L0jd09<[=4[W*,9^Ogͩ;~u%s,"־+ܵ% زϙJDDH)eBtI@ΞY79,XfA JMkap׼ º& +I3Ġ6&7yXkzU r~:v5:O,Bl,FDCaϑ8w^j4{,PrY7"hJF$=,I ϫ|/޹|8k\oP ^rJWn颵~Ơ+Y(J-1Atq̮KD g\Pd?L/2qWQpdAB1۴2ϟJMWFwE(me>"AQ$=Xl* }Zkj}*Wr{<"P;$:G {NPߚ-wɪ-,E+ؼ/Q?K!XTyF$Y}Hf:(`L`u07&kq6P")q`ix Ow-v 8c>,/@:tok#$< љQ{TsK[' SJ@H!$ y6ᓏ(E!eάtbtN V2 b+K5 xb>ž<ʴ݁="ڑ)>;v:szP](;foGw`f{ܿ"poW,]ҭrBwj Ϙvh0Z2v$:eՌ-W\hmIP-FJٍv% +6B?c|gE!Figü +z\frfMẗgψ@A4M1P mi\ 3Y,=ШjVH ai7 !>ͪ=E+0sfuCdQTK@C-Yiװ\h/ T ф%r g2wHZGb^Q c#~N -bW4ƙUX \6WѮ#(qj( %l!Ai!#4"gJO!t˗ $;#9űnAc+; j?Rk2õ&|5?I{,'om&gڳPN;7XdӒL7NË9mڧL*<2֔g&|-q#Fv9dWnԨHf'm喓He3yh;9l&ڝZAО "%׶ u[GWQ3899܌5!fŽ?"CH"Ɋ;+GLb-6aed;GwàB2%cj(*a1 [>9O.}Z1;liq)Z`H9PD'=lXŤ[Q%񨬴,zv2)q"17l;?/ ah`è( +[cc1\>09&'w MZ@mx|h ?<\:[nr09iP: M!Nȓ‘K8zڒiK94d,UL68լVh "uoA?I9E-4L!de!njh (?OI/p9؂-n!p&[k9Db}Z&P3dwE&G/ۓ-;`a69|> N +f86R/"y#o@Rdb}UOGlO@?T[,f"wmetUяS:-v)ǣ2'9++]F+-Z6Ui4ovDDr'yN햍=J'm︩ \P{} BZ] cmZ߰Ͻ9;va jew7Z72˶xOY"gMuM+L^i v2KoɚT熸 W 8i厖D/,.[O>j! \N"I'C/kJj11xm$j[z]+ {q +~PyUCB.)N|ӕ[6$UȜ`sx J +Vy`M9UbR/;uet1WD*wwm C6q%qT Oeo +̼.3]U0'X9Z `o@y!8{ZpƑN I|`p/&%pJuQkd+xj̬aؙ ރ" Yt%Ҙf*Ǘ$! Mf{bӀcU،p`SY/SGc y(0LђQ{>eU˨ 5E71xQUny T̂ +29n"yh-re/|I}8*mV XN$H)xq eI[;w&ׁVqO?0c"SN82URn^Qkcen1jBu4 Nh-`-WpI˖z\xorC>nj$En_MĶ[ׅwn*ׄ Ql/"TߢLn&xO"ɚF7122eB(pQu}M Mftb/4laoTr +63To' < Us7[e;¹d:W\N}+ᘼ4C|bQ?=2Tė y& [<=/AM=/],UZ{,il%a(PFo<3sT?J#|$$-7gHA'Iq͆dj[ws62>@̂Gx}RoW>[NnXcItBgVz1vP]ʆ8| HSQ&.|4/!SqSUbsbZhƯh>AD@F '嚟%ȼ\@qd gap\Ꜿ.hUrw6 .btf_+59vMGPmhZ)iY2ђIR )<-NWlǀ NeefњĥӿNO uKg:0vM+-?+7" cBJde*O +!V/N˼ũL pAs+@h^ z:6fB=s~ SEӾsl,U?$հ-#ԍj)KNRA+nR$PVf֏A+%\҅e#dGz-|>qIҡg"3;~8;(@<=$jCA +ږ>1"ф |H_>r kBR,uQjܥoDg68L??+^c@=:`{ٝ8Ohl?©' a|ڧ\iGgŒ 0)6Vn > b'_Ogqf:.tz;37K5?R3WosE"jוIiTAXמZǃ`՘+a0|yvO+PQerkn4 >@ЪLXֺG}V1m3CՓov08hD^vi@Ŏ)a]k/ȋOnh~c*ɿӜD l~c(:'0|6aa>w_ KDovE~F=G 1G!+Clѩ\C}pEv? "d=}{Կ} =QRMںJ>􃫴 AZy] n"`0ǁI,%#d_ 8 c8Hqa (rYFf ApF؞g@="W[ =Te$\4|➝p]uJ,{ S*2:SJ&hu78Z Z/PVVDkl}rHȹiR/V'Fk[Qx u8H\E[%Ƭ48ZiX1i9*Cxi/Vɥ:{gI|8AUR/B` + $5|[}וlw\ZK?h;H;Eܴ/,)(a ]`v{Ue=(:apZAe^ MSDI5Y "= R:Aȗ+?mwl峧Rt64/5Hޢ;̯ƻOڒ5%O8:IO/ÎiHH+okZTp׌.6L.-נT?}GIpتiv`xDW D2c+_x1GJ`$!өW)ςO[^n-68PĐKr:)D _Vl_ 0sҲ|ppWxώ䫱oi[?y坕qnyǪźy&rwݹ~NsqeAˆoʼ/2eD`)MWYuPź@S1aip6&jdDH`urcU?ȖCQxCII)it=ROZ]IvK,97XV`#l[TA67\ivWw-И~ɀn)7m rY\8jiB4<0v8W&kq#yȵV>xOZWS3_P J渔F-nEHg\4xOJbN[#>-h7m*b=,*eNk*)6ԜQ2>{,@/¤6]iבcL"eqgaOEєc1 FNsvᯚ}ss[j qGCƩ|jϋ[!q-ϔϜΉ(4,YǢIXL."*HA~XkӍ;%JG Ø}NX|io"Z*,1%G{a{`q'B5q#'c$>Ϝ}q^>ɴU{cwIT +X'e(5G RFŸ:(́lr#Dx>OfG{CT6j}]IƾY1T%͹߃nK; +zh@*>.DB9Ba21ӑ3SfXQr[hq'O-# +=T,fN$'90u7&4 Q?_ E !Rn U\22c:$X~ K]ܶ9eF!>!X^8IHTy9e~idɁ.'$d[7U- +VbJ#2PouGWa{Q/D'%7@fj]x!K6C*F~8['Y~'j+C ^jsS]Qu\}}3kPS8Wy(e5c!H`l?ZbSHā?Lc\4 ="]0aS?f5|10,VB 5F'~ ʤ0 +)HqfS?RO$Jt*@눹$)Ӡ:ike4Vus`(O𐘝Lay &<_pϳiuRuOVDf+ +jѽrY^?{צXg\=*)4M?)t g'aw^/<{.'/%iX7W{tF+[e]I`JCZoa!5x]{Z~DJbNzq_RԌ M샱HjqE^n;(?Oa OZ&q +0rjmLN٠a!6/HVCBB(f O_d",#=PdS|#ig]ơ ױ)~Xv|weMCȀe h)Z]W8ʩw1NTW)[(jӬ~|g:d{@ +b}'bEv~5ÜSVCEd7Gf{* "!wD+Bڿ\oZ +;ϯiіnW6|&. +ABas$f7B/97n7CZUB}22mzel*g3cڝ@|iV52қ +L_ޣpZ%)K~{'év1oS9)z>Y{)a)%='5+(z7*:x'*Qxi};cF.9$~B?χ7"֙,YrmRSoe֞ 1YI᥼ºa( B_5kߐެ~~)QӖ)vi.3ģWkaX[j GؖrMJ?'aJX|qylVd<.RBT0Io¸}sA* .T_KG"xbnh]mR\vR.1\oxh&ޅEF8_&/C?Y"cJlnk^z$HprڶZFii.CӲ(_<lm{C7*6R9yf]̆N((uV(QLD{Bz/ D^ԳZWޭ'C|K~/$|6'NlXN"h9`+ksR-G b&R4!xcR‹!/ `[HҴtHz?-s)x3tOOTc1q:_+v;`AqE7H{&ti@C±r4jNxښ62Z wYר͆aU0pJ}9́ףkG p2.= + .t5Fur":L3q92|xQOvzG\TrC Ktx J$1Z ]x]Nd~`0hAr|Ɨwv]iu60TUMnwJlZ=3ۆO0 eo+$‚?͗y^h<[8{.\MD79uً5w6אY# +GȪ ŭՒʚ߻б]+0̩g*2;-c88atPJK/4pK逢*wE)M&Wk0?9tHΝVmrN]J 9C a\0#c$\B)YM_A#_kV8輛4^6>/0|s4kMQa/N9[:TB=kyoS. #pKvS&}#j݆ _ɰ U8ɮP]$k$dۄS03'eeWH(r!Fmcl҂I57쿶.dמtU%f +Q86g^z(n?At0=IdUMXg(=a`4 . 6="RJJBb\>t]2@=Y+Hb WaVSRKZ$r{atGd3 JOOL@xaV" ~F‘g N5 3f΄b?9'ATeoSE1ΗGfٓ)BpW}Q{<ď.' `1\"6a 2|9ɥBζ?kpS6mPA &K~o /4-fX{9p1Q =񙂠 +vg/- ·4##*VA蟋:P7yIt\LRKU2U2$2 L EּtwG$‚  5/9bx&V}QV{ȑ322gm9DS>&{Yc3bڨX׹Wܓr;QP69=MUFA/Tv1 +ZZ0QjW ~Vʬ_OU e|+Z!.SMkh16P8lX]C}H|DNU6tL ;z+.Ql#KCiƳ(guo kgkVQMXV_<8Fc2T, .QNj2+W~x@3~`4 HC2QcsDEeہ18xɻĥĝ]͠)b)INGr2Jzfp? ߭,mnhTQBh÷Wd?ChTR;_McZ;c#沣}tV7OLO<\-Zj܂@Au\iUpb>gy'L#'6)/!NE?Q#l9F8 rK ã/&G$cM׭jB6>IH2po|)ц rڙuen6S_ֹqw ziv(9Obѡ NeK2 xѦSa)q ڞtn@M SWޗo$*%|}9A~Ir^~d +*QhJLZ0hXJ.gGPee K? t +OKstxdža-!8dnnEޯdU?,ޭj8zzGܒ.,5-[ vj;ַnhKٜ^yvS)Fbh'c jk +}ŞU"y[Ё܉blnyMK$RFɦ*&KN>]F:ik|G*]*`=CR=t7x?-`i`To:s\6N3)7t@5э˙{2o +VQxCFa F݈i^2Veىk$=o + xL0~xerZ桲U>(ԏ`R#4{$YOd[NAc< ݃5), hH%2Jc5\8DE1XJD+ghxh?#n]l/{m*_`QF+6(1;ypՅ'U9~n$I~T8J&TF5 ͓;g`Z< oqe|0F!{mAe.{qSܷbJ_RO˦jXZ !Qn߳GBwb7ũL*8ALfm?mbn_VE<o& +GPuj#y{t# + .,GG3ߧIU>2qj"_(J .жo_:v/GkmL|xs&@R-64i*= +5urӠcm;θїv!1\b=&luM D}GS +لe +Fҟ]D\Ǵ|#V ჾE$(H`G~p+snVn;@=3!\`qQvXP OU\C퉓E|*8^lYIL_Y7[(}ݝם*RMKa\vЇxцNVڡ{W]f!i}[|nh~| ,Y."&;(@`lh F&Z %Ak0yl*W-"=ԓ0-$-8k;jjڀkńD(LXN,~AA=I;. +E8J~*-!}LBwP4"du,qe`ё]vx{5k`װRbkt1~ o!N@r~['5OmEINZz)*Ti6͞p+ڬwZ=5>ۄD:~WД֙-Q,ѕ 7# >@:n ljyglꫮD4i=<[[~Jd{NjRa/ܒ3v1lD%):ݘCibJHՐ<+GȜ翑ߴ{ S>&.C$GnXuo1[uFQO'8c9гggYnGꊅӃs;Mdv:B2jJXIc*DQlXk: LԻ)qp?uvsE}I1KѥpvM/.P/ۯ&pfL`f+!n2)3P<8E E&O>| >7] %Mv .07S U3BQ1U x>/;%vb^֊6xi : a7&Htc;lLqX$P째4_>{a&UhSWt)_8>P- +D:*ɋGԄI|8fE _4f|PiVg~XFm-)o%6X"+W)fv/vN 4` E  FT*XE3aҒEmjf=u FVhCUst0Cg\MsKGK endstream endobj 2853 0 obj <> endobj 2854 0 obj <> endobj 2855 0 obj <> endobj 2856 0 obj <> endobj 2845 0 obj <>stream +HWێG}74$ydW^<YEO SvUy $f""#rɿ/$rJ +4SK ]S5' !#NpBY)aFݧg聋W\Zl"(c/V1bTL)x-S GeiD<^w`(4KjՍc cpdHKq]AGc̘3||7TG_9sq@Ti.a-,6P}yu2U!F_b2%a,"!u5 Ұ%,s+ + 绾T4Kgl3 %1N8L}ɣ6Q1C)Éy9p7ϓFҤj a,7I + %rU*&p3_\2rKPm^jOmr&oȺdKֲ26mt xucYvE1b,K_7~_ܙ4];Oulp񫴹eCcq<W#!9f~sn #NCR!.fpV7ɅEr>Ht(p(6Bpl"Iz͍oxUQi, +3خ+o./.6͜F1Kn-&ę&ؠC n+6ss*-qtݟ!I`CC~aXu0$:-5UH0kw#eC;BN2r~J eͽ̩L aZLOi #=>k2Vs9 :䮳kǦxLt_hKg[TTiNJIaP!Xwd@P'-F"KIg +ٿ12O^TGqR+44Y"Jk;Ke7 (`9Cg#vxQ:2$Nî-ryt3Q=C8=|K߅"]" JȊrD3sk +ALyeHS.GA/Dif6x;W ,n5?FW$E@paD=n.dx!' A9GjQUR4 U㜫xS] uxJY&RzF@:P4.gAvn,àUBs X dFu)bu6q|Ss<9װ(R8[#rL:*.dX)T@ŝ$.FP +Xν> >X>¸*8D}a*hϩ!}(z٭((gkzz,%Jo"U/0̜&OɀV9H + +dUF. 2VYJ;Jɴhk3og( j Ro,+*QV.6ǔA^'>stream +0 Z@&XT Z*>gvѲfUEZ)eE{z-Kdg +7UQ3wC鎉0 8ꮉE:h@[6UZ0|ѝc/BbGvAiZ-`M!wSni 3Dn>^BжU"_Iۇ0Ɔ +Sg@)Vj3pVIFźp* +/Noj3y>d +qm_/j9JɏWx_eHFNu @{g4uy!lޝ$sD11b2ۚDm:Y"nRn;NNI*K1CV'}Cf mj ٵvb#Å11P2;lk6?gA%R=j+J%K&z*-qIT;{Ay i촜p[HUZ@ l`#7tbZqZҍ[ y0ٲKabv$Md]+ aKٍXYs&+vS5" va)ؠ Jw2B}ͤkJn!d0Y7͙t jspu<412>ߚX9"lo\9tQBd/؏9@x,3N@*.ݛ/պ7X@_GeǓKV=@w3Is=@qZ P ;r,&uCy@Up';-ט!Z]`#;ҕS 2j9cr11̑W&Ξ%z4c?1Uj07xnne7װ,^g(WEv0QۦjRV+k]rӒm<;QtzH~a=AOEf]?iq٣"_.z zJqg2VΕyA^9$xд)w&E&6(0SPkkm2 SQ@PlCF|I= +Ta]T M Tkܐ Mze,ex5=Z'ǯoNUBK^+9P +'7 $Lž[@6S/葊˰%fio?M|J}YW=41?$le2'ivu|Wٱ0(|,=<9 u6Lu]3/dX-2f ĕ-RjBǎ<baӸJL}2$ULU]f;G_O7GGY)Ym\:Ãɥ2,cz6$vQLS +ABB$J;zؽfyI*.gkl(.1ߌM1H_k!o4)-ŒsQ","~%^ْgRu] +b?{oLC:3u] hvAقF;_ _OCʱewy (æA T +aNx En&޹xycB(Ȭ6{u$Z9k;RF;@5BXF<n.OL\J ˪e,/u'j&o)t_:]8vǍ4 6~r22NsV{0Md۰f`瓊.D 0`!nRB>kR;c)L@wg>E[9P^. i2\y ҞKƃW3^Rpy2NEnĐ Wh֦<&\`R)Oii|BZ145$\,h0iI үyB>?I|%BxkwS7>`h+C^Nés؆mﵱYtIPzQO wN\i{%< _ K'q&߾ڴ N g7;N1g.EtڠqjCXvv +b\Vjax}AcU?xxAczBpV'(g}~b˄s=+r +o h[ x뒽íO0ݰB%%J@gHYxSkD38BTeRa ӹ ,B|wv԰QmC.lAqK"LvZnnBuAI~UH3 r;b^G`vhnWז):~Zo6D=75!ʤluliS'ppx]E-fB+v[d_!!)0Vrrp_Te&IBB(n8<5nEBmXwX[,H Nae )Y Ls\e։'zd@ 4҉P1=DgҲ]e,AIuF EU҅Gno<$.^ZD)'hzy_ DmM]or"P )Oh%ͲU)-_|6.8&_u亪6#n@ ͊\M+nlgSv=lQ]p &u!)5[{:LgW[jaIcTĜ'lӮDse d> S%[|g6aձV + +qINJQTH]=<=7D8T`};Mti%'I?"[weEM#Wӧm1χ nN:SnUzH [=(K&|qG C+M|߰Fbb'k]^jR,b|_h(G n)tN_qAu)uGbkۯVZQ6+nj0/<8Р;Z?P巏QVM{)爜qtGQ4󁪆o3-_B xZA,j^&]ÎaWB+1#gNƆLAYv @wsGA+z'5U5`+.0[meqeATlf&~.- e]g^Q}Px6Pf ${Ƽ(m!:ϊ>IWe +TyIћ OiKzkȦѳn{: +c!HWjQSH!aJK5@ e\7 8 's}*oHnc?"x>>@oml&|ff9&=Ω,2/G6P-ʼnLx2sSd3w(CP[:3-T 4$&L-22<`=w7Nb4zk} +Njj{g{ߙnT*}f9XYa{_5iN-׃ ICnQ6ٳ]J?6G8UI-'uNQhABXאYMqw.*l0˵enĉ ɍPM!:B&Xc$nj\IɜwV|At$5 ot)uuW +l;ms WSQ%f;hAEaBߙغ&٣I>I}Q`;oa\DuHP*%J&TTG2)>FugJm +݅]ƪyиحGM_o9)*g&P&znp^VXt13EaB)pA'lb(Ӓ6;dM=%K~=C=l2m˃X=>Ks@b߶x=Trqu\3Q<9^u& #-1#xTuxBV;/!,H4&PZi \Fw|'V'X[pFa3KSuE4Kvm-!lc͎4c݄//¥ܧ[F齚{E5:~@W]^Qq5u/~WWl zND*%5h2d(zؙy`IKoajR=&!?e?8BP\@,Hd@2v4$}؉Q$1νJ mM +ңTu,6BH^qwP0 =UwfR5CYrͪ@jr2U3zL0ureЈܐHT+HX#^MY;b<[9T;/ 1y+UӅX$7ZRL!A3*'ƿ9y )`V%''Hr UXCRq%joZX݉:/-B(/ ,2(S hHL "ijR:v>]JSrQmey:d%Tt˔}v~wg.ҹi׫M4=CʅVԡ(a`],uP/}<+FEٲ%֕lYȚ6$lK7-<(Pܬ,+402l 6A +K}R6Bng5"gaV`U~Z@x)xezTи=/Htk*;~ēB><lC'bf5轵z6.5X +a21ӳ^sa7X\q4 BeP(+K?;Ԗ ? OLM,:+!v[!v}dֳ!kmtL1~r ~NJ٨w\<6F뉺vԎ7P=rM>Iס_:lk_u$I 5SJ;e>u7TWFLblh0* +̊~K5xɺLUGa"PDWN'.k滶V\t8<H`A@2Ui.5,dY|)/A>/1FJcBZld4|Ⱥ-&w߅|{GK>$TB !sęm.# w02SU0>%9m%L 9jEVFg4Ƽ02۪LN͡!96n!]PO<77{:.̇5dVi;v;Ag+'۹5lLԖpCja6M;HPq|c:=_bE3g7K _Mm@Yov[xZx ě\W-vΏ3̵9liL +^l9zUDA`>m%ˬ6J-ƄBo*rS H V^_"BٱБZ}r7/~k稑e i'CeŧP2t9|%_ (գ!d:UaWFa Fv.Lj>#' zuD,ތ0uMFX`BhX{ Kl$nk璵@x$S5=i~!LOPC]V=q"SnV=GXaD-<^$쿦յ 7e Հdy!֐DgѱjMV/S9sxizAR +-˨zP߷6ToA5XFykITlRa0]WG&hb˸-*xD2Ӿ_f' ˻CvH f$o^pj{՟M7A٢N ;EjI]ﮎ sMEm\OZz@kJa-]G] +} n\-lI?՝ R Dp˴XwRmw0;}wN2eiPR%Z/0&&OPGU]VGnĪmүl Z*r$ɽ/.ؘh#SIL.JlnԅV]EW}dkOX+?(zD#&%ÇSC;s>. _<;j6¸ %4a&(AtUf#|5\d)TӴ(Jnq4𚿷NMU/RVbWLAquj!S.#AjףDaϙtA 'h+&}bJ +HRQ_WAg\$Fӽ:s!u5H+Co2t'6f +e0椹ݧ{i/R'(iT'ݺUlԠlNqހk{GUY&cB)Si gBCMa)_&4N~AVx6V).YeJhBW,4ѳۍ#11 @˖z}Gf{P7"a;{O_ $nodzU,$>z*o}S1}_V;`SLooQ wi'\*x_S(,zu!YZdoDŊĬmD8_X[_{ CWũD4; [1v8^9ɽOn-?_Cs]z#]Bvq;R2X"RoM6W{XsBA;Y72>~7oSa`&Pa&{KDL?wp +$ʻ@3LE.MD|D?qz:F[+4Uv-ȁἪ]bu#6l!D[dƿ M(\QTp@x +1aӍ)ĮHY  5LavqDB5=}~ --=w;Gce4#eb5E UIrs)xP:?FmXe?~J?U1.5sL*ΡϤP +r[k򩡪LcK]"կ +3>UGcL~tV43 * d܇^te0A >OFD to܁}:d&PhuW6zaً3Nʯj|"_^G,L>RilQ ga+_<>53TGSj90:ҷw'iP, ؒZ}HvszZkgBgmex5{T"9711YCt{NOԢM_veP$Eei^h0煦c+rE?#j>ݴ#Y#|1tO3(0 ~7=i_G IJ5i"Y@)d^F)&,v:PMW[ yY7U_;\{J s#:V7"UY9,& a3}IN)Nu7Qsá޵xldW?m5O=I*+ l8ES|u=пa\ZJ?{LOK.~>Pcn@B;bWZKM]̉\GϓxmzBFEnPM*no$6,I,Tڭ۽/cL<~$: %, ibʙ,a5u4Pth+(+ +rE$ yrOH+s@ȳ}E@)S'J̽7Zq!LGJHHUu@#Kz0Īlq6V[|gJajxfh.ZH^ {R_"veo~Gè)"<<9Bٕ垜f"szkL0S\%(]*Gv- ++9F7f 0=)L:\= +kABuSqeķ'm>/KCΎ^bu\+ӂOJw1n Nv&fX4Nw>C.Nqx"ZGJ@d+%?X3a LFs}nٖbs/)xc䊨 4r@y)w8>Xo?+ ޏD:7.{H)j=l z=u6( HlRϵ 9#4䓛>N\a?V~u7_2"(E4gӔ?4 :)=nlj5*N:8CvwTwnSmY^_?g\ycQ Y)R˜mmsN_Ý*< 1IJ͂l!1Wy:X=-+nBbvhlJvbs6afz_<0dBcFGX){Q)|'Apns;&zҼ}ޤ@/(- KG@䔫߱F7!ݱ +Kk M!;f(r)̐z^ 0RaY?T^u~9Va)" aK(ǺV<[ָp2PUtZrd">ąpS3l`۰_)|)~[u/)ĦCR /Ny&Ǧqvw"n8fZ#[<%IU)-eI0i'E$S4W\ܻmYʾuJWp}Y 5/&M;3(RVuG`D3o#0bf;kZ~P}֪'(͔\drl 8/x17/iW$-Ǔ>$]jSLiՇ>m-W|X['8-3#!pDטzԤy])ТGRJx/ZQ#O=ž x)KG m*uc]w>ax?$֫w >3>3ly/u8T8o\ +2b{t BuS!g\<%ܒ&Qm{ֺ)Π/GŃLݛ.r4Ȱ7vs"uWٽiWfT}i%ih[͎ۤr'V #j&T5 &Sdj=Y:WnJ\VF[WJxٓ㰃v&TF[$[2ɾ LH%Nj\eBLF#>,%ce|Rb Ȣ[*$#c +X2Qvrb*SB5RvSz\B=/sR2wA驉F|?UpH41:E7keo"U%5`~eߥKۼBZIc[>v ę؈nE'ɦlmę̒An>Meqzu.[{5̋o|)8ln2q7(B,_\UFxH,6Hp.J؝@d}WtΏ}fso[&xʛ)OX j|ve͵cޥX@3ݳ1u>zDѓO:IzG_{ܦs a 7CCQA$=x%I2'f\l~OJ4Z]c2RgT0HYœVz&eAE ߬ 1$ޥ);@%Tb3|~@8xv5 ةuOapІSRp/CqIsPP 6^o? Qͪbe 'qL-?B%*`D1|" xO +IZSDVs/|.˥]f[-y}==L4CaiIfQԜ5z:(|Lf|kj&iBk7"ESp6fE]p''J"bDNz ȧNUz#ΚBx£2U2ٞhGON"a->8*ynp+xy纭cSs7*Q'-򕁽D̘l4gLN|:|GcP?8sهx`#eO+`E#N3us&Y%xIz!Q_ʉ/Z: =FrӐb8VQ<7}݊ 4>nB*Æ"cuk"vE†iF0eFFG +鈔+g3)PluO әuNʛ0\Qӹ4B1jK=b&{e09aQ|{Bnyܞ.z|_2c'"V#>gފBݻ "0bUx' C d ̘(?A՝Ts; 5p_45X5jy0ۈs#TÀDyTO"$VϪ@:5ч;*HFA0 +ڝ|X ;7葚T9go 1Vp)"j"N` =.Ŗ FWtT_UBoS gC1@3Tc^z 8G&e_IYE7|WL8|FodBջVJ1oUzV4T6n6__+8E٥  -V2o9̉<]+EuW?fL oE~cxj3Za9ٯ½IJAҘJ{cYJ,H45qLO ]rRwc-7pAhٯВaG۪2,@,9:+L5qkv'O74`ߎ' |jK>ɉ(_HWL"=;Ѽ'6<۞?υ'F!Bn!g%m/ WM@I2[VP;";( @k l);_ހ=,L&ߊqsn8-= K>LP3ngqoCL{0evH>KRիyӨOx^kߖ.3jjYWCyW|mrv*tP論VCw3_!5ga Q-a ʊsƶ<mwQwkFDFJ1-:HG.TSaJ)[Eְl#ᇻ5mۛ4];ƔVQѐ'>t*ZSH(ߺ>Kޅ(plh_&7CW}x`_&inl |?^&S}!3_ŴrS Ͽ(AVڿrUb787[zާl`$8K𔊢`v'Jd:d0z@gAO5LSiD=S˵l>_GxFiZ |lJ]&1;P$R V~rWs-_ V<+7vWJ8j*6:rW R`9/<hKFp| mBoTbln9>rh$Hƻ(Jv)gwb~d<<+L,7 }DG lyW/`3"#`1]4KvSv;,VxY4?> +A"\Õj'_Zj"_؛o͠} +I ب+(-m?Z.ɐw~W,=127C#YT)v33=o֎pܲrx0Y)MilB1:4.!u +nŎ +cKEM2Q)݃^9*]L>SʠC1N:fuDcm1N̳ϺxL'a%ьNazB1 +P}&ȞXhc$aI1͇Ia7c b"OTn -;pAPe]SϘ0"BwɽY,A5ӈ䭣$ޠ xPF3u,v0 v  +L3>xJdȃL5c(K͙i,ALx VSs5z;_'ϋA1z~:|Nv( +9M˦Ǥ~٨U =@qٷ/t>j -n州Bh#iۆ}[bBk]9G](jMyB"?}{' $,ktqU"_[0j*+12fZ͢\aP>(n]L#CIT%HEy솄Xe$`%̪@hdQdD//WaPt *n9*s&LvüGqz~B~ m0L i,2?S?h@OE:mc=vPuf85]К +k羜Pkuxy~_ǔʀXwɎvoX/`v LE0fگ&8:3޸XB0;7ko=kU06Ds.Ҁj+DX39/gAN |6l0A͋uMj}Wc)S?.ɗH3Tٗ0Q҇nnZ >x8+N%_>Ewvh5kF K#vƲQf%79Q=_ 2X`%نm[>ʆ|#M`1j==5pͭmNHM?[hMso0Rh9)rAb>٥cdu8)!Zh~mHs\Zm & ϿB\2%VVEdn}0mÓႏ^g"vFGIwt\0 JlgƮ)+x%jHD >--6Jp| +qi2~mV|+Eu[ JY;z#u鸰y-jɟQo E-7I;]z%Frj.&Z%ux g4db}n.ܢayvkQCᎪ:,,32Ñ6ǏATAFuݭj +g;흨AL12N/okR&0 &,b*Wك܈P N +bVz4x2hjvOr2CH7ɏ#ӇsG& ]EF2U7ț؈-/Xh?p 0p9FQ;yfg]+gڊ6}Gg@SM% ^a.,BNK@+= H=}<`mZgZO:rlJNmڳG؎ro6q=˘cq A a3)?~F )Jy9tsz[Tq墷{Dtg]Uk-~#k*(8?L5'6 .6塀4߁ 9n#0:J?o8ၦ^#Byg]I `U%ǽn.KÎi91gQ&9c8TI8AU-Q襖$߀Q G!CWzF]N*NnOvFZO*g4|qMúr. T=ɈGհYBO}*Ym#6F塙`!%6@+ȖvQ;dui,TwDvѫ{,u H(˞̃s>n<93 -O%@ށҫI'"R>.?2>hkǽYӑ +1*6{7ܒQO<_M0y$gSt_8F+\e͌gϺ|RZ!p,W! zQ߄ΩPn|KYJu0hEX}ƈk6i ? rn.k|c=dWomC853| BVI ,PN'-n"Ly<Cv'q{T;D77 QTH~gnѪ=똭C?co޿EoeOŁw786/]B,+$=_Fќ6~ ou:0Y/[P![2J_n=$o)Cf܂Gn?aUCTIA0AJШ3o4G +JvB ?m#%4v7VعYbc^\lyLV@dXYR+rTŕUBu?/# 9ZvnɰyczՎM0K)^11T_&]Etad_DS6yawo$A+VwVGDg-NN!+? n2Ł\4JFs3$eug=?fYyw[s$ԗL1V2 κ +Ka59-Sը82|)ٲjg*[&.ea4{,{{B$n&]|O1JH|480 dyNQF= cX e&,ٚJYcTr'q"{],6uH.Kh:k7YUijmqXFo.$ [f +nvv5_Cfo%/HxRn7׵N4~84/].#E oԤWoqCXM02fP㈄!3 endstream endobj 2846 0 obj <> endobj 2847 0 obj <> endobj 2848 0 obj <> endobj 2849 0 obj <> endobj 2850 0 obj <> endobj 2839 0 obj <>stream +HWn}W̛[6?]s #15yWTfjGH/ زԩSfR-Ωќ2\f ^nf>dYm_/U;K5TU\i+EQ; ƈz1$J \A\:|lWr#|[1Mlt0`|3{zy]m̟D<̗L\qJQ]0Œ &`jyw6}.7x//Q̆ۆ!ZKĦ߾y7f.3I׀3]7*fIW RYPa,=uiwEʇ6"&z?:(f8f&|ox?~#<WzGH Aa7E'Nt>]\5_'O`31Jݤ"%}aƣJ"d{>il}1H5Z\X6P m_R 1whDJo'R`EMVGdiBPWOK?5EVNKQ b]Ht 9D|Vr=ոSݬZTR^W"n}AGk4ES +!9 rDaXb 3x؃Lv?;d#i&?B{E|$(g~"_f{8w*u8j? k*$0 !`DH]`8T`dب&yucV`3~Z#Mþ 1c> P 3p]'rZJLM/zA4eθ4q<|M oz:G\n37 }Dnn=_="P!30S;jx恙!건Z%Io<@ʌ6ShJ` +AuA6|$OO #P{?9,/G +V 'te)7 p5pn:4uESy,Dt"pfA&Ʀ`.̥ns7jnUqU!00 9}PczaTVD^_w3J>plZƓV݊B]QN7n0ATSL:ptv%N2G~YPbs ff+dMwHٗ4RdiNm'ёJ#FסPiЁ\ul]A^vW '6BE0LL-{oK)Sqv9ܼoo.mn2P&L(@_C,tX\%aηSp6g\:iѫX8bIX+;Na_Dq!bH~Ң(f/g\lvAVj9Ahצ^)fcl3 1)`/TɁ<=!zw.߾y,haJǦ 3t` sٷ}y=({P>Ӥ#/:5-Qz _)zNIq-h{l"8vc@ npG,/.-N~^ +" J7o=SUd)4Ix1%MB\iA2mv(Oy4Ű2byr31"_yL^E3Yx9Q2b-,&,&GԱAOwuZCOj0sºx5ZF(tVՏX0kHXaE+Ӄ^79U«̬4H^`\!kV.Zos-yoUjڅO䋜%˞X7'<{ ,IBB^5WUӴ9ÙrCj<@ '3uGatK {!xlx[; cO ++ /bۥ 9 @M[FYg3Z{MwXA-eK(҆[Z׿vu &HT>M]~|r-Si&ĸt%SwˇH[,M"FR!dp u endstream endobj 2844 0 obj <>stream +0 Q@&a Q67bh5ɾ84)lML D\eK]YI?sZM_8%ᕝ =MXki>fLn~>$0"| zc,apǤm i4wѫ5qbOZ$?)19VlSX 7(bˇvp\+#=S. vWn[_V.X-9ļPw A-(m]F7G7 J +`p\fn%q 3B[EJ%[X:dM>F%YknC#O&Fbw1LH_Ol5M 0_[7U(rfX)/XVgTkf9cḝ92;7m[ ԑ_ +d&;FI5298 ,y"i|ZbӪwUnؾ<iIA®B$W߆ɟ[mQSWHI?i^n~,Ja8#{.zV8T oOh=b}L!dSGL'(R=ZWwWG)+njc-Z:eLJsTZe |mv1E,Ka8Z͋<{#}FGvht_x\|/:uE^eJm@ +BˮPY;'Tt! Q<™SJ'z}'z$-4ؐ\~PH^ɕ3ʶa+pɃD .ۢri \X!K T:So.(hnO pͫ~z} [MG>*R8V0(M/=OsņQ>}XhyOysk:08A3NgPN\E8UEe&5^V1OQz s7= Fr90-*E<f6yH.x핍P0wƑW% |3JQW Rm'1P%ٻb'rjơEͪ{QLzTϺx";ȶ{e/\^˷r~VLmDۜY2ċS0z(f¢tiSG}ޟX8vvQj'~abMwxr{f  :tGz {Zn %>[40:3/O,1pźBmJ'#}h6q…Ɗ?btT@z;۴|ϑ_S/o SC ZUSω/ %)*9c4dA[@__,.h21 Y:X P6GJܫ 'RG+&}˦ܘXKdj+͓[|P-UJxak$`]s"`q+}a6 Q}c!zdmruDRkNFl\36x~Uk"}V%a:m¼2n[28aƴui%0OFaQՍh% +n ߩ|%>(>%“\-,0 Tq}-D"1"B L`Tdq-rCru/V&[RАP?̤DPWY4S" <@"s'T^bUBs(W$ȡ0[e0]+ )­bƨ!-;޲QϾ{1ЀXB#},kmOEl8k*:k+2QВxt[Ƨ∁ ޙa >׋!=h#KIX { +im[bX]DrbG3G`]>TbI춣u{iuT:6Ylcۃ*l/zb>xKiAAYh<4kY4e \E! +"1rdЏ Ĩߤ>WwGyN 0Sz:*"[2hnNڧ+Ns2^/TE 2Y] acBk٨MK5ij~ÿĢV_q6E%&8uHq4Vl~+&B +8%2}ZC#(Ȃ~!!jMf%SBw}~EЛ@ *Bljyr-*9VwG2;/]FN0&3%_y?8͕M)a>B7*@/h ~F%x # ׋>߸ +rՆJ {C3gJN~UdkW f0##q-sδ pAGe n!uT CfN3[jTִ,1{z`rs6&;_ʉG7`X7!Ho! j!2ٍ=\|塌ܙ$Wh!B9gSP*RU!ڵGyb [z;mƃM>Arb)Ze-- +ѳiR^k 4hןC]=8FL#;9>? +߄M#fń[tchRՂk/+՟Zߩn2ND^=/ ?ekurόJq3ƧnWẃ€I3ʱ3y!rsj#+3Ҹ~\(14h 1[g0"=6<0>AVٍR].'>Ch9F`8XVrڤbS`y{qȪS)k %Hj7zE +tV&.zXCቍs |12Y^fF$#\ =pZ<=z0)*Ղ`eg0CrxX%MU Hyof݊Sz3K/˞O*{4:L3{NSld-cGx6m~u`4cDD@w;|]vZW`x$oSܶmqdIfFYQ0l=~y/`{W5~4]9dAOw[{&՚޷!) .D [TR **;C3R@-Tp21kyJe$UckTɏS]B,+NL.vp}g+ 8lɠ) ܽO\iVӊrV8_QU\Ӭ0WqʤYq [P +'DjYÚ²~1(3陋P`q?l B1`|2b +D?Tn#: yO%0֘)("_ґ͍5ҊY;kNEdP4Z@:+PJ=8B湓 kdWaҩkG@I'T!<[ +o 7Q7r@IJjC즂Y*kw҈:n#[h1 h[}A49Ypd4^a@רcTji}4է[ҷEpQ\ 4`J6`C^ˀAB}KFCS/%$=I;? +oiOv/3[ų@ dO&YulpZGMSn7 Hl)u|x}*rLh%`:܀]}vDF!^d"uI!MP:gSܰChb·y7_YNvnSHs4ψ{gU!Щhzas3a~AMG9*M6_}Aņ)5UTŚ$_guز3=T "Fi[L\؉X&^jJ;5]b$f.a0+;Rb؆0'95&E-*C*)XoUz̄םo4{p{Q~fJrA>EdR8Jg@LHvw@La6 ͋'/Ap}U| +.2u$%F/5 H+"Lٌoj{EZՀC%&>KW -@#Ǯh#U#b;BZ.q)95B(ثR 9a ?H˱bXzTP rwB6gbH9CK|ZOi:o2G"A{r)!H3SO *Yas0۟B'\>:ˊ+(pvՉXs;͈T&[6:F9WF\Y̔ڐEpף;̰h`Lr$~hȞ6yJT\~y +Qx;P9lyCl#yP;b]Hf1Vf~54X ̞EB7WaR+P؏ +)n2mٴ7ۍu.Gr?]s~jg$W+;’mRo{QLYM {FK-s cAM\TP5*n3=M@=((hM%\A_`a3KFnhQE QO4 ѓ}UGG=1(,l#Vkz=9ճJS% +غ<$ +M7|~#' V[75*vkcP#sEm!|wzӡD ]ݰH,GCκceD4#{C G!K 0yX3M#J&y'.'YެNb0'g;7+=-yE4t.j yT6=u2qt&,%p'Gֵ^|r(q0੪6;;EtmAE:\PM5y 2a,"j1[UzulRҴ挨n IgǠʼ@ePu߳ikU\amf5 hbDқx + {VCxiJ^@i<u(,nBKB+* ;2,? 'mozD=Vri/C-D>N?꾢#XHWVKolZ`$gZ_{/J`KBiေwL5pLgY?La4@YD΍S.]/ +)oh 3YCRZAܶa .8yZ !4/NLv)a1BqHz!Cq5B`@7R)5&VRx l#\|d .OX!:v^BIJ*\/}/]U=k͇N N=;dvA .~ڴGM)f&oӺy]^b +J3D_o^];"A C#960h&սbJ61nm~լs%O8Ǥ=s%;"YbЀ2؅0 F&u&#l!lq,3|"DKni8dIuvUЈA'0I&ҩg"s<-O㑛rQ;OGeA\D*XS lW:ڜIsBy[Wș(K(Uű_[E98g܆<䁑IOVvԟ@5x90\:N+nulڹ&0&.܃Q"ˎPy/]JisΊZEDzyS$af[n fuI<5l r`<[vxT +/0~>1ULÞ1,5 KH|C=WJoI;S#B6xN"mcEeۿl3hxK:,VPy}X"Y!$W@FRۉ?`~ 62𫞀%DMRYZ3SKf{.\+⾸8 jUa1E*IҢiMѧ9v 3%:XC;y+:0!ЭcǪiDg-㊣4lC%w8Đ5E]Zub9m=jF"_0E T?49$Ú[o5rLj%Tnn_:vbeM\Q"<%i3XB>Q#+vF׳yIV>ur*]lTmM>1L?OsNF >ӊWO[t;SS%soڝBҿ\tN:=|d.o.8ѤfL7O|'׀ Ve*7"2*',>l7xZ$MPÈ -_ݘуJȱK4;+{͍t=ziܚķ GDW6(Hc5YA+q-'U_g܂9?|%@N@e:]:ImAk4E[ujTZ!Ӑ^g +ܥBݐ"]͔DS9yPBnZǩgx)??yAP~9УׁCN^X6{\FDL`o{ӹ+vJH$A :w `%')ol⏙5[^b/ʈ4S1hӘ]H+^+;y7;jR +16"{~2ybHFE 5AOMw25_;xBD\p%TөL ѧzˀ㞛[9ڼMJFX֊m2K(l^鰾X㲃]9H0 mxM?|L Gny(ǃ5=_EV>;H{=7!)C*pCEjW+ A+QvMDu&\/|P!^\ tb4Boti{xcWyF8μ?OsPQ9 +4}4Deed Ё \?tdd|$;쉁7IK['G{z*rJkTK;r) zʩ*x.gk$5usv钳xYV~4 hnG`ƽ; +̺]%fc/4n**1 Z^_PAyR[8' !Y)2O)_Vbb'Z#?CaU49i`z|2ݞDוM J2eޥ+1pvDlZzdbH~pn)Jezd29y+/hyfyb$II3߫:(d )` +DQ\uY|1b[YHeH!f 7|婀Ԧ]1T֕H">^/!J-͢U& -@XJ)@1*dnu $IL]޳9F Q*jfs2f滇쁴`͝XS'̜2.giP K|x +E!a w.tv,A~O^N@2y+3Al,cUӥcD+JLκxFR0~8" +"kOb_ǣ 3 CH?|*Od:kDf.u.}3D+K"Ucd׆|2nFW$jgz ~oS1o՚]ԂN©1=>ɑ [CC*6OwY0?n&:QA;TbV P?gM0艣bʃnn93vMOݶ( au 5`5/p!*8 /V)^s2H#}VKt?bnzTV^-P <)#XaՂ}24+/BQ,W$]3Jҗ+$v36l]`|)oWvM3O˩mU~$\>9~D5}JPwgklp(YOFjS"Ɏxk1WFmtĀUd+Y<<&bF,cC>mzc )ܪ&NYwĵ Սx_VrBINd(kVSj3h2P. R!gG7‚5cZJ͂S9h4aPN u(kAG"NwkS4C֑A +`Z#?ᒗz`X?dijԺw7Sq`bJl׹>CP̽Me=w Sa=~OB͸6.{CGuwz+HUdh8sU& +3|=БP}TA*ww*H%qu=7Yv kmZ/@9_`[sQ'VW9~d +,i[Fa{wV\ɾ-Qs4sQ]Q /U`CCO~fspFl]̘rr"M_HZ×#4v/o(ⱈ,s9jUU_3 xc卷DQtkq{j5r +HohK\V +_(u.T)6N6Goi*ѻ9fPg\zl?N犐 +I8-{BNc(Dzט:}[uD@S'[J@ +!dՆik; ]$ALuEy /93Ѩ!Ž>IIpk)#s+#!60sQƆ^zi̗*3b?q?EO3? uB!;O#+!b/X,A)kͱ^hgg S=wSCu[Q{$~Lvy!(u>VU}BX+i oOv&'}~aSFM> Pe|*yx/*/@VLGw/ QoLH0m 7&ӝZnx[OI2%`C06S^BAub{汓>%;1˃Kv͸nȡ)i,΋dDiEGϮQZyaǐ]!gahdj.a}:e:5gR386;;d1V GSfy (ZW#hBL8i`M% f6}=V2YݿQm!sxm:_8gŔB[9FL6^~c Qz\pUHI{{ia6+zH#YyBp֫u9u!i!TBMihd67{םW?shYh{K'f 2"e$;#'ALjhl) |7o":C%!;f|k}D׀Dw>H'Le-/:@Hk%Ov8:D5U*A^ Ôk^ ,<6_EΦ)?_9Z %_pmБȺV1_ zOHPV\"ʴǫM2$5y?gp}, 9ڌߦ'}sKXSrݼ9i)]95֝6^&{aDڼo#; +at qaZ~뱪ٸNA: 5w+A+3:4u RQl'p9F^<2'9 Bwvl(0QL%0㪲hFĜ#zC?yUTò5Yc.sryV@|=fg,|E{*_2@VMeXhru~M!Wf"WT2PPniS%Ur8y$HA8D-o xΙ|eLxMvGlþ[_aJE 0|73=k,:6hr8pS*l"uCKĚ02cթBN:ifjpէP{/fl+tHYE.doLM|W݇R Y¥nDđT5az(Sx)*H\$\`e͡'zw4 +@7Ypn/'!Pfh$F@]aVٸ9;Eڊ&0FWN,6X ,ŸL⧒%C}YMo*'%;fSN'|J|RѤ2g/Z)ɁÈWUp nd5b '}>ᗧdԷq`{*( V_B,%ɷfgink=qy6H:2|ɒ|=ĉkgs7xΐ5Է> 7$DqP"JX)@* Qs7sz Mr +^3,!ƓlSL5=󇚚y8D`j~r\<{Dx;6g"<9gè=X l"8qjȑKL6 ʊ3?&-5 +30P/254 caۍ8q?UnV)葚]G1w՞8\jlģڹy;Jr5w|Mi6jy8gy] zͽYB-Vt}$H}p(3u]w/4VS_M'szGC>aZ:U oDRÂ.].i26͟)a\*0r<ڡek+RR5CZFԩI[&FX+mmeUT*38{n ~f&ՇxyB+pޱ%Uj]jS٪k&Qa]a2S#Hr#){4 WDL@63cz^Ιq z. cٽnZV$H?mO +W!]+ܱi؃P>y'lTeqe؍jYE/FbO%6Mti"w"1Rf(VIЍtEpثؙ"Qkxxk.ƨUExhc)JF35jěxC%S֏,mKZt(%OtA䶀d|_e8U=ŌamD#@K/ۭ1n9}]'f@TaL 4In;i>U*HiWWhK< ( w}un}A1bfy8dSuXGJB^K_ʚ[C ^_Y'v[ı _"KiRߏ)Yfivc)YZAlPӊOh4ch'ܚB K,%-^(YJK?K/jki2[ڦǬU{!]RK 01F#ft$2ʙ4u"C,p6$?;]/!v c:(E6W7*k2ҸY eE6!??|sEe E:@Uj}[hYϼ}'Xo`@WDQ1d[شe7 vWJQTk3׾:PCR{bY"N5Ϝik&^`{C1!Y1]L@_4YHׂ7aQKfϺ \ԴAp 1r.ؖh,5LCn'c1YnDfSd>PQ5Y/Š?{T7iV+yߡd*YvA +ⰰec`NRN8K׷IYw,\:VgS9"4,ɶKrxsN<6AT36}hfL;uc`!="@Wlo_s?V`g vuX*"Q"x͈!pF0^")*2eh4 Nv9f-}FqVtCep&QS =P]CZpMçWIz5'zA#NyF-x-z)2 R$ž洬FsNs045]-ۉ-sC`Y6ӆwL~f?";ض.ij}WQ,)v^il}ϲ9lJRL`#ma {|"\-m76ȍTp!;<[F^JRAiRBDDvp_0KMu+45 +ǶiVhuOf4XngoXKgT[~]t(yF@nrazKaމS tNΖDJ1/ٛqt!#4Kyyvcu ^ӟ X:EEh:U<Ԣb6ͩ));yHT='Vn Vά<{'I6Y@}n񍜊[q?}Sx(5V>_./WA^ڋCG8r p\a_$!2uJFᑭSh_773> +*|_HxBbnh8'XK+{6d8|0bi^8'S"Yo X6sALU1ZR3F TNaeֱz5kBe0P5Ҝ7:ޝi1Ճ9&ʙ_b +hS3uuF'B܈_kw0vu+"1$DqT9 Ȓ$wX"ˉj}9[e6\{-96yi5ptl{` )np8C)7*xt$sWY+vܤ2P7fvd*Ϝ_Dن!+!aE?RĂnrcn+ @ƭ7Dz =cMtT~~6?r7!Fƅ*3|;J3)Mv1nBv/=q\-໑Ǭx%_Ё¼7OovA{3:= N6|,kspPXOxJhaϥ>7>U'{+rdloNĝH"eܲV 0mGuX]RuX +AyIaT$uLҥT~\8L&>adIŤ;5`/k+R+p2F3\Hgawt7} @]Um[ip/Ru$36 / õ;v](}2:wt#ͳ:R62z0ī G[yصax[lfӘ.(qy (ߔi`QbF SQkt-Wcp q*,R ݁H+g{Cڧ`#7[(NԬ. y {}%.<I9[w>aL9k0b *A\En[o2il/9=9yA^럙,WL>B4<=$ ĵhvāz7zAĵ"<(q~W?֏7 ‹?}To ;wj׳a|#S~DfM+ +$`TcBkف̡Gt=mp8.u[u/;Ļf>O0$;]rQTJF_wFuEiŠF(@]!͑50TTCêY^z ]Qɓ>v`cjnT{_r)7Kp\$FO"PiT2ZRݿnp6285eW+yD#k7}i",, JT\V1l3Dη,羞*7HmdŹ#KsqYS :dOros9]dRð\7[}N]@1 _IoS*;t¬'VK{pP{muP)ꉅCnHy*`#MJ2\%` zv?+A(8Y* V)NBPi n՗զt,%"}z7My102ftRT9KWqMNM hPWVYg޽0˫R7mƨ/\@jf`13@x0RMĒ]9c:!Q3ó4"Bƶ/lN9w\:o~{#ڨO!z!LeJ7!?WzEp8ʗ2g)@l:b oMV .X4Axq9ˎ~77ՍJrg=W-ߴٶfGCrFn|R ^LH2o^U#M(c"UN;TޭS>$/L *b5/ i-%ח1ܡ "j RsS=Ss_g$Մ&V?߮8'lYҞop]jGg=-g .o浕9s]:hWVi&daOs`j|BZHHfs9TnXve oRH P$-a$e+ddb|+MI_ K]LTu^LQ*iO$ҜPkă܍V{ >V lW[Hus&[ $4ݞ91f-It7v$:PbsWE$zጵ0fq*UH%'Mkb|6FeG&%"iT9{+>bn:'R%$DEx$q-<"!0#šRRxJ%؂J$/=>}YMc (-2tHR_'5lfO`2Ncz7YζS/63[b#!/@a>0dt9$fqU^X7MrgڢI}׆csjƷ@ˢҩm7GJY~ td2.g;O\k`BNQoAՈn=UDh$i ꔔ<'<+ٱ|_Wւ%}=1b6AC弞VF*SYJ#`1w6tHz6q+2>Xޘ^ ;aobd@R8T F mhݢ~d/ WZ DH COV.VJV dl:JOSSZb+QrXRU-$Ɯi>v:N12t6~b?z܇mсx8+F*S㾹~.ojGz<̱i79yp™&Mílys|Tnl}9V0<2s7%v0aNyyxX Bː"U2wVQb}tV5{ELq]'v2VXj(ߐUFE>J=$)H҉ύh"O8IL L"auGxd}mO.&Fvgh:_1h:qbv&`%GS&3&a\Q3$jUevS{mUdٟ䀪/9bdOYp\%lgE70-w{A[ff~`ǝb̊Hpk:fg4"[# 8ܷ6! t*x y8|E7ISEM5)Ew)!m $b(BwtF-|EyUy$0nW""K;UU#HTNeK{T:T8kU +d([$%Qᵥ? 4/z|4h“j a3DŽ45wszUBpjުz+c"fy(KW I88#EEHm"E?y98+.6jNhc(7ruYlЬ3`0꺳Q~9#M\Nh(fևBdH_g$k ^p`L_گ 8!b!oj e`ѡS}NYA5p2GF BE]YWO +5$ۀd˜gt\aȎe!^s ^[n+{QL!!Hs, ,_qѨ(eڙ+USR;ƤO5t$ZmIzy|6=CƌJT7 ,)ZQT^".DmSDlA+ -pX_\BeaWd$l ``? ќ-T۔ٖJ H hJ:޷/x?!$n rz""LBYnb3B[.$P0s4k.i߲3Fߖ(r%,{&sf,s0eK3"f: [?m +Ws=6};,j8P 0'o^{aiD\ p"UH3BږGRK7SW]~\V"Uh0_]A +/ahCb}n^dS&G$yL[8XP +kt$i5P:Wi!;'A4 dBFN[7#ѕE9 +g{ta\ɪl-:Y>ܖ4s> endobj 2841 0 obj <> endobj 2842 0 obj <> endobj 2843 0 obj <> endobj 2833 0 obj <>stream +HV]o6}ׯc /ٴ4ЭmԽtŠ:r=)KR(Ȝټsϥw!P's0 ߘ}.n֌˲8}|G^:4 y)J `)RΉ eK,՚D9,Q9RzGN˿wr]M&PmQa͞%7M`pe3>ZݐyzRPpy?'0BFo0F!!ԏU^dhm^-i89N8J~|KR|"Bѣd{Ʌs*>^>stream +0 U@&  U}W6ŦTj)x3.{Qٿ-@5oZ!<^ H +&Sa&q|YiM̖H*Q2a8?UuK 'XP]&(-4qYs@"m +|\gc}(;]M"}L K88ayu`1nC+fGa AZcܸ],vɴ(M^Fv-bAg1jM|ކI!{AZs1((#=!qp@ kk9ڑzK[LGzaƢzRrzMPn'6VSΌO $юLQix1| )I\%ٓ"j+'[tY:yBUiB݁]! ˘}QDpWEf +2k#}CPquW 3/'bH3 cQB$Dhi&䛒jQ;C5 +QAΕ7z{&ߥ3>x e<_C-6TLqؤn)~x2)~n)R}r 7 Pmb+;NV.<=,$x i蹂V1H[O/ HEFζ-W%#ԑf),|F΀5ZZ%]0B[ީ 4g&iD7Ҡ;QjuF4؍-`K`_[$gOC:AkYI:⥜ [\ :C5a^qU"wKY(FIx}O@;Yws%qz;ϚKf%{Jp@Zܭ'-ȥ +CfNJG]frH}ߘ6"ڑ̈:|AZElL Ġ\Q|3?xH78S)RUP=uee#ёynr+ +OdK-(tb-U Ds҇=t87Ps4~F(IbS_NJoWZKY3Rݎy;ei}ja̟L` LZè_I^yZԁX4ke(lK L'T[7/̪-Χ}.QIitzfĆD'S.OGzgWQmg2n6a\y4^ gJᕴ]1<6YfH""ٙ5&ּ$P Pb5NLR ;Q|uߞFXqcaLΨ٤VlW9}YB}=)wMTM~  2؝,\%fخ P|p$-(D-=|<]Hq=vw&pI5~/n#! W<&ۛ묇%ݗBƝ@Y:_DNt +E=]}M^H%=qyJkZgƭ+Vy c()C3?9[p?"ܛ6g`)1R!h䱺mYdEtC\O IJo;cG}|3ш0ԣ'9$cStãM0@x{P?JthCZ3!Zy{u8<.\谗R{Ӆ®$s죃%62HbLYDT(,yaʢXz&Lx;GWƕgY-7@ %sJ:7WCOQD S*hP jd):@VC*A5`9揅45]oo Y#D/1{\ǡo^l,#`oT &Rz$n~ I!-}VQA6 +ml¿qʱ%̜_Ca +&خ'lHPB!r Nn!m AdRAf'VX"E' %ߢ>H4D7 +( 'so hwd;֮^~.HSl O ƒgEfls')4hW 5PG\NF{g@wȗB03E4:'M?GH@+N,ApL[l2-J ɒnEө{YԹ鉲mj'A[I@M Ndod~ +$.j-uo>TemoP(ĴNo"P9CKHTI╙enjNԙ6Jg]撽>+$|q=O,z7sh"7J08 !,E2AfKM&B+@.|nvgT5X=OV=ɯ"1 9ÒnAAƧ.*\6G*m# o%Ǹ``&Yr8&z W'1BxfL@[ OWQѮXD{$jVŷSKrPq.hc3'q1MÒf]o̘x3S肐"$CWvŅ8]w%1 L6Z7Uq g4"+fv*.`p/VO Mo W#p󞓒Y*DKMjG,h(ϗtܳB7:.r<b] kC-SE\[]Eanƒ7(!hdI>MFyG&]+! ;^K@un}^Hh$vo␮"XZgSvJW V=$;;(-nByj&3QPE):ۑAYvAym#`/\me8)$=&S.V+P8$wOi +ܓnbն{9Co|#x0gkmihIn rj:ٴ"cs{]Rp;Kڧ#a=Xe\S蝛jo^-HBbԳwtF|$Ŧ*\:<\3񥕘a!@J,X1"%!u(j A7Cfl +@Z (gS:gwhtKqhm,mxo Î}x;tVCLI 2U[l=**5n{Nov<1g yޠ=U}k"]鄜Td,%y\qbBy5Y7R?`ˋK/vˊ-8NohE/w#F4c$8 +!r3^[M3&~JW0B-~<]Z8Iڒ{ #Fnqe[O'>0e/dLZckd3gKh +%?˖`Apkӟ3Q`_٪erGb~tĵ + f.{'+2;htQbnN4xweGx7Xko_ Uq!w(caP +m-?1\Iଘ#yAUUx׫a~P1a;XS#EeEee5[CTAV*'͈NS""I1;+-NySt@k-ܩ-ϝ*\×D<vlVӵ5Z0 rj]Ez1ø|TrZ0tj_|נH5cPwm}q6Q{T'(7Z +sQS +IRs\}YCĐpjXuv9y.3 6V ÁR SJsRvUVHS6. X.Ӈ௦5SK +UoN{ʝEȔ((+oxoCh#fU--|%k$TFNS$ߨ1#H'>b`Ny഍(O|GJaqyLHpH]2 endstream endobj 2834 0 obj <> endobj 2835 0 obj <> endobj 2836 0 obj <> endobj 2837 0 obj <> endobj 2827 0 obj <>stream +HWYo~篘7َpl+C5<E Y9CfjR6!)if -~~}?E`/'7vF ]1VD $`ʽ_g?b= +76}=Է)>|xy]ݧO?.f|P\1_ KL 4q3{lf_ N%=WXjjѲ +/`heL #Pk"Nar"irhv?s@V +iԅ0oG?]kM4îuYO=Sӭ눰nkVF)=nsPE+juL QeT U Χ +&c$a$hey]n] 6!bURG;l%y.a vTGNfWnkަTu eYs/qLw.r뇚N5{MK _o^$p-|CZ#- yN(z`G`M`r6徆`H׍2\eyx4<=$Rǧ_~RoOA,6^eh\Jӯ,ë#N =-uc@%Ks&&lZuI +D"}F|m2@<Cr5zrS~JGJ!ZӲvG I9cа +YA;%/8zՈܤ>2L0ٿOGGSƵd]`M&i)721^Ǚ9^w9=}2J:`.!gy2:(@&XF+<ђy@ǺNfj7e9&V?)5 hvM(R']}jX\>嘀q2YbNr5٧ꏳ_1j~mAVo |N51̞_3 +UqPMi{)ߧ^z>哛Tiy hBϞ&ϡ]>v2nU?mIMdiMywDu:SwtH Sa2S7wȈʞ 5<>KT#׏(?{愓A]I=p?" *, өRe +HX|!VQ\w `EsД^@|)aoiMdL<%l h |bvt56<|L,.7M%p(9tm紤"c `(aW-"~`r앒%z?"vSU0Yfe_EǾGeL/E{=&m=2w{gGz6QvdۂTbU+JZawE R/b͆t ;dAB"oPK-z\3) Or>1SQ =/l-Vl  kI endstream endobj 2832 0 obj <>stream +0 H@&D H$h*,k$"D]Y#4DKKeHq| r2n+ 'ԓ,ͱܪB<ՋyfJXGo)Jq54]QteI4еC|qy%-=aWm>K +p ͂f}p\cxUX+2 N)@3Ғ|`pJ{+ i{"j/ʹ^ +4tѵ_A6SmAVk,vE*EiC8Ey|8,t/׻q#$+eP"*4}ssao$H|U](W> yD屴9 az,40CZ$dHL{ɵu2ܼ.B9/2M: a*Dvh˂rF4_bʶU~3ɜT":KnԬfT}j'~Mc|4}s~7Ӽd0* & Qc{EMAN8x#߄ކ]wZeURɲ)(%q0P +]fJQeJFïBvZc-& گ8ыƏs=6n!|дlE4m?)aLnhzIDx)ikquwtd-=? Iߎ'J-Rv+qd]i>t%q,`{U6eX>X-9X `-Yzgg?VJ}7<Raq_8Zx[S|Уebi_}sI^+$EM"r7w4^dW䋮'94!:oCaE3O, k(2 IZŽSsv leLw>mӨmT6jScNY8Dgؒ6g0] e 31sԤ\dhBw+LWAIl4GF*eaї 5/ zjds>8B1}+/ݤGYR% "q( u%ƒx]("AҿSu4k"Eb}f)f!I 3Xh3d Jv3@]^lnں SݷN_dDF[ +|5zDbm!o]j#!GpA~ZdEv#`ĉOZ]*rR=-†/h=e}ғ ÛcwM`<3?Itx]Y% +ʣzK5Q[W]z?au`:E,d*5.E0;&HД +l$q4mye9?9\xHPiYJut0T( UmB {3tePY{n8CrfA?8 +y\/ա%AxXl Lr5pK۾QE$G[!~QX()${iIXo c}K7ɿBPSntk /#Ҍ&qnxlh]3gV]GLs_w=8x;oAT"8Ta H?+6-T 8caSFcR%,m;9 "a>D "˿-Z|ȗJ :3 }"J2\J'  -$dglEVYH <+s$9!^ LefTW"#;*;ܬpZ5~dݸZđ9A?~1#WOoUcwd2Cgo2BD Ɓ. i6v\o-DyU2 Kv&IjEkB25헜NcB4N^i +DNzwTd~4!ߟYP+&GIr>/Ex*r^hEL'g*IbyIiZ*Kȷ +9*1cKC\zƓ >cݶ*QF׏fO1{٪7Y)bݭLK_4H)^uKSn+z@^ڕ?8Ę霋qoOdxpU{tET +ONٚ|Wb2 +H6L +F +Ct+ޅzB w&qYu| +)%3%V1ZbݘvjT;l I.Hnwh_b~$,"!hCFѕ*WOwR\Qs +,U:@ZcnD6&ΰkdjS,H2JUQ,7Qt;_iϐ"`pw> +:ʁs2vP{(8*\'ņլgT^{=rFRsZU 4ʙ?(≪mgkRrJz/Vjj1SiQj`7 |R +Vl>Ng1]cHrEcYd|jn{f?){3ΈܟT0!A+C[GD"ڎӦ'|"ͦ6k)2" Q@aݢǶ(ڽ}0h~Jh &M77N;|v@zl9vʤ;X2hyO +9L ZżLjr-QyG|h6%1ˆ 6|uXd֖QAӸO;GMIo 8 3i߿ ,kYDLjGA_9ˀًu~lt dga@x1̨r3H7vIбlb(Wl׋q=l@"VU(K{qh~ig  .^u[ϻSɼLPW6 ל R +&Z bχ]wI[y#lc({'xӑ B| sd&@dS"@Wy,p&Q븎a44'0w.\”Z89c=4flBXTr+ת2iu$kUuq~DG>|ZM[&<{+5]J ,Zq S}Y@__TvH>mNUl,dX3 씺&jqp +~xt[WҷJXb 8XkWFA=n@?'X Om;0˕Aie觕_U1C$p޻xrouD.[S0ًZJ' Nv5K4^>~PZYg^A"#KDCrh8"*?'%ͽk"ϺѤ`{ZkCGb0 ,<;-"@<䗌-$B=| -lֆ۷ODh0Px{r +:ԩO* {Ec~h бzl 9n/aB! v?-c7oƺo )CεM6Lݕ%Dd7?iP+Y48ϧi7U*Al!manƳ:0>k&hӻR + T1- ߆ܢ2~C)D(=1yq`lqpi<nI% (Oi)9apj>6.a9,}y@H0%rJRYC`9Yd^oִWUlLL6;nUo`Ǚ;=aez+骸#ZGBy}t^tv!cVvܸG]_a0 Hs6k(p":sue &!9K:?])x0S8l@.A(i~>:Ο;վ86뉚1Jh8ɧlD^9ͥF,. j8 b_/? 3iڇ9VnHMoq2 SK{$[+_(r|ӊ+Ճ)v 6}(['>&d[hɿHvMP2)3 6fEpF&ZC~LwdCDC޴45ޭʧy? }:OM5x#84zd{莉5U +Cw3A]ǩ@/h< +itnMsR@zTZ˳n<1[j2Ȟ>G3H5jcVy5)aYE›S!1> Y4N,T i7zCր;:30=NdA&H4mj6%hQg&-3eǧv>80eZ,V.Dz/a^vzLvRC]%3ЧZn +wbo*a_C\%LS `o_)*F Mo."I Y.&(K~}|㧸y#Q@'KBK,igN3w|h*NuV`_4inǟ,}hWsʛnWB +taV&'4/*斁Q(Itg1Y _LC\f+s -(_inW/N(!`(OQ w@AMxa"wU/0ܭJ2M[tq%mi@/sWV;L+zE{cEv ºl}PǧߟUZ& QrGz:ya{D3.JHG# ?33Co~ +h +'i5OR_;Kl M}A${!O.lgyAs8| +t/ًپcĂi$y $#.5< qFӕ fO)!Y2v:Ċp9&wYT7M<ᭅE(pJHqhWы:-߇4c JK*R ʤj_#rF6NcrU1ڕ_FZ_b+[$'dn\Tn oDs8}{AӃe4o<;2G՗w ZIK"mDX4d]+ʢ{y5U!N^/:z&E\|ac 'ju;x5fҸWXUHl.JN^ ߯LD\|5Od! &W=J#-Bܬ\,E^[Z{)㟮lnu` kH+ܮS,J2(vr:\QoN5R3 Uԡ';9!1Kh(w(>5XlDKWbclPllaW {@(=ĩ}^#!sh*LqnA\Nϸd)#rQ*o; U@S"u[_ugY<:t&}Gf\;\uKn+eHɖHd1mV"u=]S{REptL`rG,[(K |δ1 -pCLc_X`@SjZs5qPOsN:TNtts";J5辗/z'X98:( |gXUBuYϢ!Y9%4IZװdeyu:LuMb;[ެ *󩺕Zt}[c{=C7LRW:mi)+8'=Ûٮ\(Ԭ ޥ]F͘d<mW󏂋̓">h;}]@ߠDBN\|mQ~w^?<%,jO/O2sjބgUU&@)9|ۑx;Kg3Fc-61:7 yw6yF.mBhi71TaC +[WΞ HQfp$k2D M@Q0"Ds50LԅQvw8)Jc,T/o A+)8'@S~3a^)ZB@ } h#}y M??|cilJַ`v@oyQ9]W Eq8X ݂  iT&R1hОɳk+Dsj?H=U0B/ҭ?@R +_٤ gGb~YJ Jj׵kXD/kpRqbPXr n8;t1[嘏H>g-#Pt{{Ok,ODQ"+@ãv*iAtK c}4S~CAmJ ݽ)@;q L=lKAzN}'^>*X)c?jᲿ%[,ڷi0 -OeBZb XNG8% +.=ř"wGqAyJutAq!AGHLҢ +* R6jj} ݄IX݊? +e'mffΦԊ_蓼q%8li^Dlm7#|sTϔZ7[j>~5jhy62'N_'W*ߠDqRci[ܧofbEE?#4X̌Xy<`WWc؆ ? +@㋎|Dů%w(pPD9kO&tr"|ߛda!+Ӱn;)Vӓ r|q䢹Bd' !~]70.++XJO<hثR$Ў&XC&` zG' >^<0"[@W׶,ᓊ1#l,(C*\!ͶzDغ<,}="-m,0Xt qp>Rq['xGUˁYm^ YPzO/8ƫ 4#lJ`qEn`߯S֛BpX&bn. cg~SZטl\ckqվ?/[{qjh.zvVH{R53n:, 9a_hzuey)S艏8;L3Ln]LՈl?<~>\#DKE/_B +Wt+@RΦ̘W@Zh.q@.l$[LyYJh3!cYa:thπpQ 0V&Q;u٥3y0G̦r͒s͘hBG VFqs-j@d#6 Ⱦi[s3/ߦ5_f(eѦ8L\Rrkɍ}H QQ)~c. nP2Q9s `bzgF"ڎ5 X) cGC/ȱ0gl5jjCpO 5fތu A) K`"h-%4W(?;T&Oj,=9Ƥ?i's]ǤG_Jkjhp6U0.ڒow•u_K|~M&M;S b'=á4_) 'rLGJT^d,.'r{4eWs*WL}电0Ͽ̓bmE],TW{fQNԝÞh!q7t?GGfol}lap*Cdy;!1,m&;XO^9&"r$_qk@Kf @N XN"{Y[_#/ +c?5 Kp48D[h:EEC-KJwk@}Q[ffleHtNay^"$_ +]UIn1/øx@@m^{,n C1o RccX5%;'"|*4ŌG +ʢ[\[X9 .Cyx޿[Cˮ*s%%W*  .|vyXst-w.*+Hn,HA?E?HƕqncJPԊchs_+vGsz)8yYkY<ߤg +ᅒJ):Tw%x-g!+Is}+YOrظ3N70x,OFd\`R6kt5/cĊsMa-F55&av*XBͯ`ِc~7mCj朰7ܾZj^([m,>ߊ%>Ky# xע}Q{!ĝO3Dy:_{8*!cah0%ȡ>|nNՎ"iOD{aO)B3OχPFݤrb~u9-<\Tv-R8mESw.SA= 37=%NBKjOj*JpMWr( +)] Q%֦H +-ga5QxD?W.B8נ"O·K=>t9f>6'*㎀E*Oi= tr +JEK<8*]?9&GŒ45,nT/7`|M](j WzH=;ȿv ;g>`v %βŘ,ZցS~-c擥N'esR\${[MN p5𻈕PX JO/F-2/˖~a }>9+qwdg)aW'' Hd=R5UTs2'jZI2} +LU5P× P n2tp$ji' h~vS{L 5+ +p#&zlvmE|{ق.Bc0 )Vy{x~Wv78C-yy%>١#$܁q;^`"LQ5w^Bo`.줐G\p*:WOv$LN_1fd$9k~Uk*G\~=.b42 w7P~q_>6&ȺJR֭!(T\P~sߏVЎNGZ<2#'d^Ysq{U1y)Ofpן\w+D)HZk ;o~t AM`5ϧ:5+QeWE8x]oFz!'uVo13y1<_csm{{NX\ɺIV}e>60]!N$lZD?w:[[LR妨!.jǝ;0=YKF4n>Nh۪wOD?|M.%$Zm<0Ji-'^҇.5[Pñ(;s3LuȋΗ/e;Ddj~mG]I> z0r(ހAJ#&A2HZ8lVlǪ^Hc"0':[I-Ε@+ ?F  D#G" /m*=|8%b%ᐏ NH¥3,ɦgZX^E$B ̨K'"N۔y=̆v-Okj 6 +5<Lo Oج~8|L([0phՕoNjsYUpF0Tj]3z6MxX +2t~mWl߁1{(1"x05+DDib3TxƬto߁Sg(I`wG (뢃,'Ae͉a6"rR;ڸB68Pڔ҄fju:F ߉g>7? 2p+|3XiDA8Q.嵥 +Xʼ:0jԥ}@"ȽcT AdS]41l?;~%LaL88!""JL|J^Kuwn./jqsێ?Y(Wr8p!|5覷ϑf햩kS`;-ϐNReTN?fa18H9P A=͑Px3Azߗʪv"5gc̱eq@:GN!4u'x"ҳs(kB}v]H\٨W h?rvnpyh9k#Q͔1i q|FXr[MWOΰ"/DM@AvvT\gZ(S۟:"ol*%=6}79߃3; zdHc1]s.ZUJɛZ +f/q,7#mU0DJ+&?Z&4TOF_&4|>R$)V.x{@Ȝ"Q%iMDf^y^Ͷ]D- +l> endobj 2829 0 obj <> endobj 2830 0 obj <> endobj 2831 0 obj <> endobj 2820 0 obj <>stream +HWko[_ozGEiic5uI>3w(,J9sgf4 VX-t}:{O^n~:{>?{mɷ>yY_w=brd.'b2:㌛|1Qv♵Egqb<zbL`v7y4٫ɫydp| i.^a:m0Vd˳r-7tTD*]~~bd`&Sio"WqTt&&FC#HsXŔ"Zl>w?^Yӡh ?L)z/w +F1rp)Mͻ\C6Wn' K_َמ[z 0%RY!d@JSiqUFLÇbC`6=_=\gA(t'F/'/Ǹyr`i-'>`c-9yV^C08voY "Db~zrV7|HZWzK%Kl_ˋG'7_q̊cOO7e 7*G۵! +U +@AI\ohf @]􃝷hl)Ia^sfZg~v#MzUEjt4(K_ ]^1h_lf039sw g00j 1]Pkhmv={.ţӍ iZӹͶYhL0bgr >F/5RzSVSKr'G]ڹw8u@A߯9u"b2MyLJ7EW :zg-=IM +3]Nj Pk|Y5jPDzXW +u6(7PC0$]]w_qJٗ¤k +Ĩom,99˂}zg@M fMugK[UHh١waÀYo u}9؏jb\ +I*~7庹9-?or,܀¨.(a(wN/!Ju%wM׎C?^rD_y!,W4w>p hsqeuNmj= )x-Fhn_M(4l,O+!\rF8x^z ^Wnm}ՠ7}eT_ݩM#0= a|>d$c + +G49@]x~}:QW`Wͪ8uۡ5a4X◄~Qgsk˸ j'G"[WV)x 2€c/:BOtWɢGL#E;$&jIw/3z1 &PT'w hP (i\Kyvټi^f0C≦).!iRd]9̀vt(I p h*딯wgpL@ke}-NA5,=p`zsf)<3 +vq=M ?htZtKFqutOf 쑦.u[N +Uɵ"deJ'U8Ky&% acY^-9t ܡHfoJ [ S^J[vTPC_4T.Ndvt9-Y Ju:H`o!6Rfeյ+}*5z NÝn]R($9wIϔ=4Q +5C#ح0a mVRݬ|oV!U[+dOw$WSGBh+@&rW =̜_*VHRn6f~8E@5DR.4ZmvGXAEUM85Y.tqsX'z8I;9$ + Qb}Lf̐CJK{f8kp&+fc}e?~@M +ֈ2A$-7PoE&A +EՖF:fiED.=x,1v 6׫OD7Xv`s-{U +7tvrٵ0{da,u:ezTǽ55W|?AiUt|80+jhۅ*ݿf3olf Р"V'f&SHx^cCM.¯ !l(Ѐrg@c'xdۀ1RXTĥ3!Hݹ0vo& +q6F$tGJ3`yar~uW-`[ 4\C ^""R]OIZj: |NAoJ̐gTpWw埜WN@|bgKD"R88ZZ ~?=5,,睭qWWWobܩಷ*0?Xi>;vnX[['E#N ÔoіiER|rh201ۃ`b̔Ok9wg5~D356Hke}U|sڽ-(yZ;Jӏ¥NkS.'_ ^B 퍞S eǠoPq=?G! cqi}u + /m +AS'bu7YEoG8$#8Agq'q{jj:Lϗx\6 D ۤ`u|x q^+/ȭkZć7'W2Ãk4q)'?cf 6surRSZzsQH7CԠ\~>9%,Sq5ln늠r_!SH6.ZsLTȢ+Q(*ZzUV_0(eC/ F}P~LC6>ŗ/u[Pש3|x x3mq*І4䓻t0?% *$= endstream endobj 2826 0 obj <>stream +0 c@&J c~*sDΒbxN<CV].'Sܱtp0;) w\MrR9=eHBB!iòOB+hN@f&"poo %hDcY@m̽ZNx˧`SGZfpߺZƽsy"u|SH@䚈9 .#Bo!B5?…徲b Oi +!]50(g~3sS׎ޘso#c8Ϭhw[ioW u MɎХz ++7lP +F9!C9 8-ޫڞgd GQ?N~;Φm4wFu 3}Rm9`mqL(t6֎" 'swAM7hR[΅Aٽ ~:>+y#qТv VM"L|?x!wra4&8ߧ![I̜2-`-%rHY,t]V=.zڲ7#kR쌰T=%U~?4@+KLI=FG81 +}yR[;53krĿ +=ƀ/H5ƈVM.ـe=QT`iVzV (pbP[[$IM}~JPb0p7ꝟdo?w"%u>WC2^L@ELRJ!{?"3z֚u~ͦK_|ՕHVKcO?K gNW=8$e{~j3U7Դb:14t3q8pTVLLY@HNN&*(SgWˑfOY^+b,1`xJWkSeV"l9z@k +'&0Q 8Mxߕߦ&p4`uoa^iJH5N be[ا !Q Wtmߺ:229طi5BPsYcYc\9rFoȄj%>8㺁;:킝r2j/i%Q!@h$R~ ;nōb#ܞ!a?'|֮OԷB84IWӟP~y Y.9/T-G+L$=OBၝazdnljHҤEƯ F.s{еVHST< zr~Mr iB-kM]c APØt7\+1+MhU[x_ +D[BmԣWw ~?BmE/*0S̑G> X;~J]Qw_0HNfF]TU/1vD{򃋾.N+F稤&DO5x<r(eu#0NhQ@%hgdCoB44jwA&ڧ'Kqoǿ1ʫT8[9j8Ä́2w 5МjDz,.}H +Ic:|&EaAEgfAuL'8sCr)0?*矅]m(27/4QT`3!PM,eipBq\/.}&ҽ.c(jO4R\_'j[Z`#IICj&<'G<0"zȰw5~=d: KV( /TFIv}ц˷gHǤ A$*n{y' S Dc2:V7xb<"47Β,F__tрXzp ->l?%bgg3~ؿ +ofmg=W&,RwCR.>{& DJ=@fCM8 |M("Da~kԲAZk]Vfq (f-/&uNb̅E-F2̍8!ϖցѵ(=fHF{][^ it"ˢeGz0ݠ&LڟZkEFOٵtrj{Kmt)KF _`$۩qg$oDO>OX#QS.,#PVbEQ+u)j] ֏*!pi6g&LǍr1 nQwlO͝@K_|c|ɱvADJmKXV[}[F-\ɘٗy HƵA&)ʫI(_ //KJ`ʳu-D\ճXmP:yDlepe$sFd̹9ẦP](쳜0^bm΢;i}Amʐ f +G+- Rfd7a?>jݔJ1.OqSp6 +Ɗ!zW ΅%\! +Vj goL2R!^+aXqءE +uNݑ"U (0>9hCw vrƣDv@$!Ï/:S%"]F[lf(XuK2@?%5*fXsP\ކtN B8rXˣzQӑ>y'Gֳ̕#QL$yF3v[}$Gu;8{q㭎RX\z޹K{S+Y'F3d9%dgTzCi"kzeYgxb KACkM!*x'`{ZU7?@͓njáWslǽ 5qMغH(g Kd>KI{@u}.%33₽w=:c wt.L^oL'$F|E `q))_w*yԖ4%YN$[;gt&'hcuR}Fj ,_xt{@$@+ߧLƑJ@e^͡HT_w`$2KP*H!EP1| b?$ʆJݰ5\6,yt; 녒 iyMzajbH i\)r$y5\I _? #!9 0 Ŧs*2|d!_>8lWmGCӚGՔ yز8~;kdng[fE > +\k IhdfXwyʗ,.Ã@_tVԽw d JRuXk[Jn#)i~k#|4X2<.d5g<0'K%蹶eI{YȃۅaC 46Kʏ~D~"3(0Var:qm 0P^)?0@y5&<JԏsƲrnP^O $dbg#ej&nbؖ}ԸnLuwƸMB +ʎEƱ'2,P+$; c^`BeNsVؽ\|==v c𤕄 'Fonabr4O}5R qpu's+E6d4#fe]4Sg*?|Ha#"ǽ[H`X@ewxTzxJ?Rs*X5J_z؀+4U36ιЛo 2ay*r?(5nqB  +r)K\iyǞBrX0JRSľz.wȥx=Pzjҧw95z/ Fi8fku+Z^_u"%䯓ުL1: @w977]}b +'$$0۲rLN?5KpHTy +:Q铢@}x]ҟ(3@z5{R"I9wwNԻ6iv7&ZRbk +Ң`fj`ܺŸD؆:Iyq@B{cpLއ(A qGQaws6xhUkSžvKk}xcaL8y+Ȁ;S?pOK=iQŒVgY N% Xe#k.ꏿ+v6V[* }v<*D"]2c 7]Z%ف ~'AA&A5ΆZIhu-%84d2]Ǘƾwoݫ1lopB'_׻}R{9+;h9u4f=n܌8hL),.nex֦uA`7iốRP:S R"P"upT4F8zIcChŵn\Xg +~ qV_ ­8aC2K͵" +H՚V]BDRyߝ̄rZgt_+OT@w]b(m䶃x7(XkQ鹏x{iaޱƀ,Ґs#a%_MFW9? +ee*"+T۽v85)-ӟ@#3-i&9# /(Tv][w͊gh{xR6I a8ܳˆо@GuYbk<a\X6ÐXppy`\~})}{ +v65a (dNrOǂ}1.o)sjivp( Gqf^oԕo|oȗLwoE+ +x@: a ugU*/0sb@~NupU8p6Xeo P-7YXc"7d~IUpdwCpIWcjH$O3qIИchrL ++&x2%xߞ8Ŋu3T)2$\{uː4wͱP-c'/(n^?иgRR%(&pd mSO˜7;E/Lk]P7(/B;f셓GV}`+w?tT + +9h#3!6dYbj7Μq +6"?Jwz> SnE].Sh]tstT[%* ĴKM=9vBle3c ŵ4AO!/U$ Oa5-!Ajw@-5,XiIWA.Iz|A,SLtH9S9v5Xu(7ѫ1s_^+n_ѡh(C>fKoZ;]: q(5ȉV '+Ff]<7 m>>9sIP8] H M^/mѐ Ɩ+JعV@?+F{|Xn#.$Hf>EJm4 fG{tCydD?2b#d% lI8o]ՠF?Gm+SV 2ht =߷qJ;'WVvDsz IS(ڷ`{ :aDCv\v]-y¾5t@;2 /~k>Zr~CHpYastV;H:r9IsXO_JgUdnmV7fłejy~d"{иgTJkO?0aشy/TyBxd\lѯVzF(xYK)Nzݘlw-Ž*GzgU ^"sRFb13O BO^@,W>{ +0#j7OHty?)eATi誣+މ73[uhsr(E4\h˝N|6OՋT,K;AD ptpUնlJ3ܢA?aGЖlY|*xT1lg/i>\jmB ѭwa>ztg4(Hk[Zm P@>AdL1~9"DR}5!좕M$fD +2l1l }b ~gt:[O''BR/y;d&/±xs?7*|!ߐx2uv` +_nfÇ3<r͞Wۭzp"W7+h,X@@V'9v QniOOr"Nkb?O,5(xg yec,^4jv,x:)bRkM@Rݤő!X d(cdOIJ6kCq]J`XŶuNWj@Kkἀ.yȟ ]~oGUyb) ^),%"p ,Bq!;mtɤ+]މ_a);Q>K}/?$yFKZWFӴP=0b8ԉODH@V8鳒u*;ΔOer,LKMQn_GrvV?;O5ל/cHUhK +ㇵA_Vu ?13;To:kآ&,<Guޓ@IX`uWxLe؉+草Y]N&s9nw*;RbLO³Dfˣ~U]iwPйD~\&,I/WT<ڊKAW+0-1J5)(lr[e /ޘ2B)<_hYH\\4d8Ḁ̃oEZfd;3i4ϕeS.>`:fSaF|eFۂ31+6WAhR`=|򃋪~E3|ĔԵWmߒ;,p6#1ʚۛ2lD ݜ:K(XVt1.RR #bνjKA2c  jWTW\\G:Wc IvjP6BPw|:+ ]z9{\x 8&(~E@!]mI{L]%M/HIsa6_35!{~Rڡ0Sfcw|(tsP5A~)Z.$H+aQPM(h.Tɗ2vLع_v; ʨ g^*<:z|WngfE+9im9%A]6`?·\A*UrdRxԟmd4uS"V,mA~KN\Lj] J0Tp>O\C]Dœ3b׭rv ?~؅>J*KP`>2 f6ۃֹEь t#h?mlKb&Kpl,k6K@-7v՟;FؿsljDnl%93On̈6/XfC Jxïl ;d~ʯ7~KHfj vGwqzv6K%Gct/ZMKvwg 3z`(VBtV3\pKuıHcQ |L܏%[1Dv Xē$ `=Q^ьBkU)'Y\3Y O扃2eIoJ{B>[3x߻IvwPx"P !^ >MVlo;yRK\J٢`*:90 +cGc*1Bݮ:i,<^"4R ݾن/MWKRYQKq4MI}ppm C!"t߆IA+9h]pm{sS)G?in|&>b.AE0W +=8*C/nDsɻ҅ {9?rr.IHITZ# VYOaW;b "CO2TMu  +>p7zQ;5ν[i?Lk^E? Xaw)}#"oPz8 gN˪}rRшHn\QE}H"H" +^LALlrqa.zyƅ9X4K@`_"6_V +:Ln_ Q@:OLYm Y'ǡNҽ1P $I?lL{<">}7B}fƙx*9홍s/AD$Ƙ Ȼޚn?-ҋ/r輮 S+9̈/(AC*$,mޥ|/G¥8HeTc.zK~|W2#NJ^]P}E:ort56\]h lW|wdcyXMuh"aoE}}V{͔RsUOpń҆_w&`?|TVoh+ 3JQBj'& +y2qmAҞp.@4f36XJ*0:ɐ̚Stm&YhnQ>"o_ϿٿJtQY +RYifv,%l&k/h8pGNvNS 3&UV]`aW p[}֤b\VF V*49 `eG \[.k'Ι1طB6G O%jh|U-xwgՈ8D +"YjoȠ`k6?wmo! %?`-G昁C]#)vԬEv*kô`|V1ɐ4Kf}[Kg9T3v]ǮR#zl˔”Exy~rLpiaƬ-N 7v0PWKvU ̓C1wܱ"Z.g0mlwC7K;ִ( k 8x,{p¨89uW/EKr%BxͿT73|o\C-/C阛Z|h#IdDž'/TSwH&d/Vu*|zs+Cf6;{O(kR5\Bp0c/e,YE]ybGL䡰: |BF g&.r2v"qd\$6uhi}g> ]Ԉ0 e|O|"O^ Vf*"Dy'mɯnVgYS[L X%x}@+Ti o]Ÿ[W,:y,ӆA3eD%qi%j9΀IoyKmʜpj SpZTa 7 <6*HbNx$K$5ش[ũ\c1 4%?Ti8\8$JY +RARȰNs ;d3¬2Zz4b`= +s42A!|Z&t7 GOݚZTb`(Rdz@mvS&C{O7b'[ER-kb)ȡ8;\"PH$E^Yb +_jߨ˧;2=C,ANUNk4PuM`j;?9|KINt) +,D~iM_Uu-'!zկQ;\Dmwav$&eV?Pw#Y[º +{M );*^ӺCxzX;/!SE"am[Iҷ"0c>v|o'.O&~+ ?yEsQ(Ba[#t4HԜኸƑZDk8հ2&#,Ț*!ECGk@HGyf6w 2Cޔ}X7eS$Sw::(${0퍮Kq)fKm >EU` _?vd_HK9q oLPס+-ֲ VZKJ=R.Xޮ@jQ<,[m2=PrYTޱB$CfG E+" HwLsB1Fph^KsݑsЩ+Bz(oG y`PbNEvZ [T0ye+(ňKX2h-/s\D'fv +jAooeɷ8z0\NOQ1G11*}N0]5"\ہ;!V}"-f_i۸Bn<1(MnC[(NIdˤ+a4 ΐM4H˿'\IGIDBh$%×,_0$1sv}Tar*seEgX ЋٮNW$zkD;|F&zu5\:|p&!i(X>@ W(kEe1UnQ^:܍{-hKsO+B%f}2C:}vK~z{ǃKbWpk28|o1Op"Hՠ凁MQK؄,mC b,bmLPheJB /'| "bs-¥"h%t7-R,Ija6A~mqiF8eH_+\ rƲm$ rupϩ0X1 +m."K~yv~Tv3b* $ -y>\UBG\;"&LMC>?|Ӏ0 $z1yw`f5f܅T3眃gL.MHx!"\ ,=h0lLԀ.a<)lgPCB8q}ύ3+hEhozL<9S9Bdfr'ū6CqlQ +#)8T]Rt}Gj{p sS;K枣~2g4=$(6vEeL¢ԃ`ĭC*7ɬ6-HM}eY0 ޶ź!tIȟ/,V̕5_'C:A㫫Mq ߛ~=C0I*.#Zdo$ [=s[ OQBS`y&I7^qp w%tJHƓ "\ #bCĕGRET#/^c/⺏G2zpP;F^+$ +aTs.BzE 9(tl{(M] M&bUl8A[ʟLC*@8uZrH}xBؙ=}e9жRWC?zg; +QytZԫԶ.pH6/ +CUhpL}P"y`yWxP]㥽_Yys?=Ve┏N#y-. !gO!})RΒboA]"1 ҥvH)<."^D.dYGRd]3nݏ52AQ8|D@J.E z aeak6C]0zޏ]c!}K/Wxb ir + i/D+]OH_SoxuD^"h^7"-̐qJ+toTjWߺkޗHs>LgʃƝJe"S^0 ̓C9 #my@E1<]ō>H3(8G+g+4X$ +y4j9RO7Mj1f^01UV?4 +Z`;Ƹ0V0x^ %^\!RÊoc_nG@X Ӽl+E_ȓd=q ?T|QO櫒]>4'i +!@^Ǘ5zK\f ]btOv>U Y&#tDSCog8d]R޲<▪O?#^t"+l4m2ѡE./>SGhnyS&"s};'˩V$Z>6vZwPHpL LO{xQpoΫԂs6 4bO*T{ywu!.&=V)մ:Q2";Е؈߂Rifkg*1 v즞b4ͯ RcBe.FIks3Ua÷?Y;ERM.oU tIg0'v34"G{b18`^7=VNO^4}cF־y4Ŏ%:xo.r/~Q +*R\O943v(us#.&2\ +(*\Dz'esʸڱEJk ^2cj$xuͺ +2B'eu`<6\si.[_@z4Y yƌiqH&Q7ߕ`k"y甿9{ټ|VmRP07l!HR >hHСN=(4V;^Zz*4WQ $J[x_>5a! ϫ=7Mb{~%_@\ZpHOnk *JKP?ڜFnGgNIcv+wM(A "g 8v!v0턼OT?f7}0Л^_OW_+&J`OyDSVΝK,݀-bkiY^oEDc$̉tW!ݳQOJ1L[sjra#K}FBd߮wA/M%DA6:A+^@8w[QB4c~;++wC0qAQ_LUqT&ۂSN뾆?A'.JBMMzL W l7Ԁ5z0e +WA-. )~>؁_Wv9tV’[ȚBW.oTt,iZU[Mex43]4HϛlQ0#^\e "^h +ԪE m.ojUWҫUWǨT5N8U%cfi3uxS3}>3?|KY)`uB R~b_ T/>;:!|d9L_f okd~.$ɴ}MK2\jHcuiӋeR;1Bī3;{X82=Fz?Fކ7^%]䎰D󠹊' )}90s $'_Lk +\:ؿ `|H|激'$=n&a"|g*Fsz1H|LC̎͘ nͦꕐ7/o8ֺx[X`$@p3GˆskSӀʰWj3/t_\H|,> endobj 2822 0 obj <> endobj 2823 0 obj <> endobj 2824 0 obj <> endobj 2825 0 obj <> endobj 2814 0 obj <>stream +HWnG}W1J_ x<, XŀyLHca5]u9יpHNUs +4Q/5o:1:|ݿw3N?g_,bsnೢp=_nf1b4}K]^/nF J93 .7Dعp5_lf?ovjg4>;6C3wiMus$>yan4Db7>,{;Kl0*NK#`M~Gg֜(O}8Ƨލ#8t~C9ټ8!B*Bge^UK)+)M}1z9. +ծ#avۧdU,'|TOjWB]lzK~_-&]<@M6HI :>_ˡFߴo"f}r/M QBHEQô+Ao0vuGǏD_"VTѷ}*nSIJW9kbb68EJ_GJ88ݔf<P<&L8LWrJ=o?9T)`(/ U2Ts.tpnnXT8 V1PI3 +;'u8*jn7m?P+G><oC0F A.IcYEz +fnwOkŸQsMƮCMzEmLU=JC~\ɚ(0,sT0E{\0r~ ,bwJ Ozlb~39YuKE G {rܴǶ}I7>fIݞX( j!Bz旼F vgyPS/t~f h}8smLTJeY @$j1&Yhfp$;]Z@6`OGR>x+}:uX)aJ=+$ !J]iQmV'&bTK\t|\sGьP\"2/I>0#?/Oqm +0&IBSCj 'rQ6S}{0jlHz#VTncn*& +1(Eqޮ>k[H1xOWVckxX>a_=Ws8 k{DJ4 Hi~,eCA4{$܈( \~Vv  QG!HTF8gWsP~o=t QeYqZ4&@8D\jIB)aq*AcX[**}3]DS.j&q^KJQP' ?p&GvѺ"PL,@p 9jd,JT܃:1Sq?&l0B !`i),kD "EaN/<X#ggU穇lYJM/eӚfK lM3@5\hݾXDj0/kLB]v2c_Q><V geX/e#8::Ywm>D3rXV $S=7OHZ&%7 8q a <1'7qd3 a7l5,0ʘL&toӾ? mAZKr9b)fj,?֫dmJ>1@s\ +"'JB/M#Rv !g{o8YUp'h{hFoiv)\m{i0|m=d^D{Td+WRn̿_p#wf4T HU/`?_mS61[r[i*U3WSv +CwXu@Gs)v䔆gK=w.m{@A\Ex +䘒btEq/KxٷPBc&kapm1`}FQZ0QXhI{:l$ _eoQ _t F)6*餄Y;3mJQt~bC٦~opOZ2'Mxg +^bMѺ;Vs4-QnA"$ւK +㏾TX$K~"b]XMc tC{ B{x"i3?(om|uybzuyvLN +/$RRi.#kDZ\B<Mvd`T/'_b{R:,{_Ri!<n tZ QQ4o`;gZ_ +,9|՟&FGZ2 +D n]1#LsQ=Mim0rc왱YpD.e90mU"ulJTR V MSB6h,<_<y{bMн!d.?.I"b6/ֆ^YUvBrS\'4ɑ%Cgb$lmפIL=x #fi4GW[$b ,1w&Xtތ&Ca ^Nr~ò +/`Pȱ}76XF0(])@<=aӋVuhU[oyK+X2h3eaTy~'\cP]1m_*nQUH79R_4^q>> Z PXm@<jF1]v-Qkd1,]| +*hKQO=?]CQYF=%G~pOs1vQ.{Ay* endstream endobj 2819 0 obj <>stream +0 M@&c( M ZZN[D=wr;~h|(L+hոZ:,n|B/T?߇\0a`"LlMm +|0gQd6՜9b'T_D:miEk.^:Z&Wd6o-` K\>ZCbț#c5o%?ۑ7MW$R=q^$âcϨ\m]Ĺ" ose@'oZae$lHx+ҏ:F CMIɲYM&Q[P-^1y=Ty't:IV 7d=xF*q|KdbS~ý|?I~|;.e M,r _Y`Ccz}džwh>Kl1U\de>/5Uޘ5~ ޮ` ̲eEaQy8&E훛EIٰY$=Q/Ɔ%cXq#uA`qW xUu07{`odzw80hKKUll7iV(Z+-FmEK7#ZYi5BXs"F~MesNM&T}G wY^ࡵ"g#%YI0G!D>8C1k<)' ˂> 1 )8 (G:/ +/-2/TS: K+€_Y6  +OK&>[2?6N?Vs6)S$+$I߾[u5-VSaj"S x<3,SEr:i5e%>ք:gO@7^;Ks!Z]Mr@)e,L˶N\ Y*v>H N1 Y XK(;Ҏ$Y4x{U[F5$f1cWQ,b۵uO\L="t'd~Gr_3`'"pJ㨧33y;\9ڜb^Q%- fV o[ǮF +,z)S\m}%:WbkB<8nCa*p n{>l?, dzm6iW$#ّgɤ+JŪw_c[D_<1ڭIb0:3~X#/w({Y Y)90ლ!$f2%s4d,a-}hkݫ +.Y +] t^۳c2YQ;èBCt?:w!nwI /4MtS͢/I>g=$iCGݠ cA,)HHCQj_ФX O*X,GzL7a!Uu5&3P$f(Pڸ}nՋy | w]q:ٞ*ii[xq1H4TL+р+m:S [ + ?ޕ*;6w)xQ9!IQs8:Sʋ_`~*WzO"|VkS\}]aĘjkЅ<^S":QN&*ၖL`u 3񩫎 _UDylcXG 0m1Ijac#o#iRғUoEł(-2N\N6E*Ftl5ᶳn*s`5rD^(,%o㻰DG 5l-oUl`'=$TOw9iT;^eZ(fX*D#AݾdJ)xp8~zvI:; Ow [gle- 8E*7-a>i}Řmn᧸{=Q29FٻQ:NH z8 z>z7))P=b:<6uy }Z~[} \00)HW#*OtT3!qʡ/ԛQݵb^;E)֡nԭ6>,u< +KR"?vv۱; =a\p8.H@I%/ - {6fc +ޔ|j^|+#懊K^ALVޛXxtCp$N:pLtyRp3&O$͖QYCrezuJ/1vLhFpg&ӄ_惐uUޓg5|Ǽ.Kz޿ QTέrW]iڝfϥ([8{8\ʺPSe*pY)^=Rh<ٵ;ٿ,7ecSv* [ߡeBֿ]D ?B +x϶rӌxKlP"Ęk^>$ O2.1PRrn-'BkX`&gmmJy*JPPiaVXKS=ɮ‹RGӠbܫuA~{\V#*Twr"yBiNm"C>T񳆀Glo&8F`t ç8Sؾ]ϬnBҁZpҜ[E_0\QdqT4=k=g(bVwJANv a8Q,DrLlS! +Iˢ:Ҧ @>OpgD>&%폲2ng/2Ypw&_Q'oGsW]yTs_|J}=j$(eMce%EVZ3N*`Nj#Qs;:o/2yG&. z.;50 /m;9V:?n1I$rfS+)]^f%՞{1gXEH9b"Qu 'ejʒqYel!q5kg}NJ>9y8RL<(#dLq ey2p-iBb=$Yd5 0)`[(4ɏsO4>~ $wfi$f(!A1u;su<\'/<"^ZI Q]Y_CPۨ-<o8x2gq I+Iv}i8M~&.vRL)h g*BS ;A +so:y 騌+zŶLd88&STq^-A鵗~n%!+@5/UFI¯_@`fA |V{Veu5a ϻSw vaS9Ͽ2AUغV%VWv=:.}bᅢQC̺ny +f6&/~u^A]ɟmsi bufG/G 9r/tg!iJ?xHcDֈTr=/n2Ϯφ]")>IWn-4}*IQb6LK4ixۙjh=_ ql2(5297~2y1>Uw3$jU,٩ jni U^ <؎sVI"H..y_`>o=#[Jui BIypڸ𡎂f٣TahܩWqCrrYa=Fϖ<,n1{Mh>ɑP9|B~z|"v% }1~ +3]Apƚޔhܜ \m< +C>a1 d숿) ]x܀=8az&2P(aTU^{+A' 6;9 {Z=߄baUK](™i_yJ];/8#J'}2@w̆u̾1oL/rCnhyb T4?-0XޗuЎ y1kΒ +~FX^} I ]-(-Q LryOp̳s};1P]E k.PymZZ"[txȮw4)p0׀aR +!ը$佔}C;X ÿ%qf& ^:G. yE6њ*n+d\T]s6A"o68t3oRax5?#i>w3*pOE[wR(,Ɓ/T|*ҜfAXx4u6"NESl dg 4nu_ZO[§R47}%M71AK[(>11]}?X'^ؾ2iV zh'kW&(ϡaC +2dŚυ#?1InG9(X@`RT2K~ZWđIYLUx3|D?Q4RI@T!gRkR?ǧl7mYw_S_ si5/&=:ءj0;Ņ$,2\ QmE:PV@ZڧڄdNNbm#}dw tb>0Δ+-ߎgݑq@oPػV`|pzgfDjmRD P+'XȯZ /}fqv3U{nj+PBhʽHm$I_]\6ȑ@$/; j֊,+[)GWA\pg;Wz}4eK8,7Χ=EXTmiЭiS +uaHV)v.3e^9Z+ɯx[6SǛV'']1G}eũuTSD QK 1nfX餷"$jfmYy3UAn! m&,~,6\gBD8Y`T 'ővsm˲;K0pYfxWlcH +{PUsj} Dce  YK 2ږ'h4*.mew/mJ7ɽKk҃Ģ(? 5IzeQ Wd0\z!;kO?WjcCA (>Up5[ybH?\ +0mHrUXY݁?ȻB fpKuSϴa&w, +Pʟ:7\*wU@T!!]*" Y)=>*A)'&+ECWRqlC f +HSKrFwꏯ=8͑6pwA{`H3Nߔ +闇Cӟd ڇ]/M T+k9{n{'7c97Pܼg4>,~'ܢVRwNc^y@eb9]F-.ZeaAcQ')jZ2WTGl.T0&L*`xNojr@+tz>j+lz-AztXGLnE 3c7oYq0j{*Ds`8.#Q3~0u/-5͐$CDڛDGG:@C_v"S "#/859fs1s.;xG<;J9̲B0G+~LK .}E1+JE6c y7ewّ~&J{蝋%X/9El7 3sJ$9heb%>w0f&B4x 9pERhsp]9//P&kF= ؂4ajAQ +2DWY<?a׏'Ѱ9ɯ⡣P7SFǜd.utUmgvXl KSҬcɲ"{~Uh W>sbG{2, +&ס仳s^]) r @t@{FqL.𠙸 %j,9uN_Hu]OI逋eTUtm{Y} +-!W9ɰB9*o=46e"\E&PZ!IF+.ꭷtPd\^L;ƿ؋sR0 H 𖣳bË/|$D`X7*Ig/ձ!&MtMdr?DXN4D=?ND%wpjKP=8</[ĭj]"%3M<5YݿRZC %ԫgzA\OP$,>޺FLtgldL/?ʝECd(zo8ИZkn%!g+gt*,Ft`UFܪ)พl79Ծ +{Ȝ[)<l[r;/k<}7h\jOi|٣3Қ`ŵoOS[}_ +&d]V }Ug4:yڠuv7Rd +'XǑYY3UwlW ,*T*"~!Cwq0jHGt߯pNd b[󜣁@m!hy3TP .Н[g# ۩M\۱mb\'8x[+P!Rt'FOO՘H:}/>$(70HPE:I'0R)E10^] onYKrFO,'M4((3@5&|I=("㗝h#!rP82+kPIƲ:秂 +si /Ÿ/61h +(^e~ h R@}^}xihې@EwL r ->ٞGa_&2'0LqO H*Di/Ѡu;[A r*zk"ԻlM 6)N}%8(tU)P3]`xY +BTY,tHNH0s4#_L,V2/ACBuCԡcI>8]r^} LqcFlRb1|=RC׋">-׃~/\笰^\~7P_T!HҜ6j  WIrhf^>6tY9x%䶿 K4/=Qˣ--LK߂viP*Gtkw_+`1:o-;n񄾪Eqh :Tf&ƹo'Nm H[` /;T}лFA +8tDU]xi"OӍ n0U==yp/`V:$j3ݡo3=/VQ|hhkx5-nx7CKByR [N'Nz0 +'Ԝ![4<8yҿן~i;|s0Z%#ȍ iL tU*ˌ.e Oe,&,#vUNGS{,ǀ!\L>o~;#_m:vg{5}SS/$ &dF澝նC}-U>\H{1c4z*@I&Uęj:tB鰒2eHٳ5^,vGW#fb3=uGy9sCNg8;yЊO}دwF]mXwEoh 'uP[7a7/u^o  +d+L$;ye 1L k,EO4\vəuc.uU:!l|ef3̎&v`٫V=%MSѱDt\ưp܈r+߫c&կΔ=I1Sc݀-Q`ċ~] X5q"dwrA@sJ=H&<`P?`+_9%.?5wW?Ƭ@yъ_LCM_Ѹ]T?ŕz=A,ѱ]sm/4uxWI_@5n]Ҳe6 N싧U(Τ~|wgb%4)4)Þ5DATA)W a +qXVy+պx U>م?c P+$vX4.#Jbp`#M36.d݋O+ {,vKpz5k"uunC=QZz~15@-.<+n3CM%쫴./.#H熷f?’1n\73>V~?aV@MqA!9R `BdWSC͛I@Ca<܅/-#Wñ>QZ9"Y~9n2f#f#ᅱiL[`o?`z@V'vLeDS5gؚx.7 Zl"jS`~n3xrw 9]M"yIJ;j-:•XF:Rs*ʡq%wQrıF[W϶΃^LW̤A 'ӋX{2V=izkv ,2sktƕNS%QT"B!q@GuΑOr V K-7l΢i]nRLYu_qX`,OG8lf&fsňwg`!LƗ^=@h(\8e*b{ +t6\'|bzƭX}[TO6ZFf]@,Tb5<3\->@@:j *,=j{2bde$BEiqd0N e7 Q\T65BKδ%2.b)7rwA5ȡYRU`L^x,kt` +@qPۢ`Ҁ^AD4hŐxQY[b·c0E>J=hp|q]&ᠮ] %gY7#9'¹ b3C)+@ +2ӭ}7}i9J_b7\؈mŦ$';#1`F% ^fKɶy +(kJ1Gֹ 8dƬOYϷm.V|5">@;T+ "0쐾zsCSϢTʃjGSq,״r8cJi J<i?d`z/E yYAzYٵWJG +Kȸk858G-I]&iDE(}N/sWĉ~Tb|O&xkN]Tݣ;.dT㫵îC}sԯoT \َhY &=33n_?H]_>"B{[:7/>7=Q'dx>OⵃuiwEҜ4! qcss +w/3Ŕ}$؏}rTjW):IZzNS׿8g mH naS剒d [֍%42Uo~^`D |9[K; ZݪB6kHS6N'KzУw=ِBRqY+NDsv AZ$R ٤d`sBPonժdrKn6#iswz/}aH)n8Yj&J<|qfT ; 7J/O!SC{R*:Eg,ѲSprtYia\IZuf =nQMo0_:' OuݒFoSf9hO~"p\u2wWۍv"-]Sm1 '"'d%EuO9; +2.^8nX1Yp}27+NJO =<:oq&[@4@4Z7I?cHLm|ĉb*Ud7.d'"~3{_>t_X`@B,-Ynq9CϤS覗n+!Wô%@5gYW C~a ,Q;L(%_Qi(k<щhUИ{ LzQ 3)H ++1;=gR}+z$yH˹? j-O5[oyIKfw3Y_7g;ie]UW{IxAxK!t[ɵ̄]0H.s qS#iP&"/kNLnMh2hzX~x@d%R|'9x2{coF?9 ABZQnoYr$x˯a qp2sA`gg$oHojV"ٮW]Z:sDxSS3o) }cgJP0^6|F4H BNf;ZZWv5_ 9Q8wDz?va^ĬXω"d|Yi݁3vNil|{Ql*aFigNY+sDzƗ}g%u4[./E j3 67ؐEpЍ̋M!>0=)1b:"{\&[ &hq)t^YR/s-,buѸn6A:?ˀba^x*ceo/)8L>%`3%}Aމ& sxlK|RJ-aʆp : ? +y,tEZ_@ڳۭPr, e{? "+ĵ28Jdl{7i5Ed5 `QAĩH|ܖq!,.w_AюxE\$CBfJR aHzmK-W"DoGSfL,6؄PE ?݄hQZgX(؇ml󴓼啻QI:G (ƹ3c\tAz{h:2rĉf"&QQJDye$vN&΂z>W"Ӿ } Pv{J׵{̢4Dэ5UBCCmM-xG')ڟZ!_O +UQn6!ؾϴ邧}t&BĔ$A~"˻ +U3ӻẛZQfH'Bo^k6'nFGGh8Ti[#J*ui3h= t 5Lݥ>,o8u ^NI?uRT>4B0H8%9OȇQs5uOIpMVo51LmjfnL4ZSOD /sb5<`K%aL{P=W90x[-Ci䴡j@"_B<! '(5*C=᱑!.Mzy$+ThFaS}R*v bi_SdXxG8k^jpg&vѦ!ѺW&P"=Wq ޼hkxӆe-2RPGTY2c4;i@C&5E̴I$1֚sLAoӞQ\(L"gɠ9vANY;`CdO|b $&.koqA Wsܝ]ZmOaO +_%#!Vnp\cI#2ESoUkδߣ// jS+*RVz\;L]? 4rgq,O7~dd (7Mo":k Sn>^4ǧT8Zn Q?01@&ׇ&GDZev~8cٽS8j{ -rq?NvM596`yk(?%JԿ;ƌD@E9%$Ul;P8P(Б,U @ ' 0#Iud߱lܻ1$'A lmNbPĥ:b&>-7 vAgy; +6>ZQ`r;0"?ygzF0mG-W=YH)5tG"Iep +z7Vi( Am3biMl 9DcG+Z?Y'+Җl}H]X+#)x]&:˻ gq9@,8jZ ŗBP.]^b}6]sB x{ LS*Om~^^ ?)p_h.z_nN;ʷF9ShzZgjI6_ .YcIսkHzo95-敫RZ?Ly$$<~m&!*)h 3cb +DEIlrfO֎rT + i%2|:s+-EBfNdm2ٕl3[Drb%{G"##~fJ_ALS{y(;0h3p1Ǜv5v : AK <ݿA!L|8FeY4֭85z1AzD*Ll+jzh+C9F A|7tv +Į/Qϯ(I8n.@wiԥ !"Ҁ_UG/JSHKP.jkXUN&%G^=͢~nMv43xcsծ6sqE;G?l7tt0⡥lwKX5+-tg݂I/£ 6i&Ţz(A͵W0Io?Hx*7YP~C[W/4}#:S TЗ8m;PWtgh'}GNU7%O'+A$:yi_>N_ߺ̴KKX$'˦E dVm&+VMMәcJ]n\6VpO}qTIЀ˺k0!%\|8azCO8^`[gNLwyv:28P|PȞ[PjTrƭ O_I*ws{BxmU Cpl3C!e*v N4p! 4{nk{FO^=!FX:pxIg}m>{vn<ȱoկDދ$eTVԴ;?) _Cvyϩ9Y(ybmNd.(3&'irMˊ&3&-V ԗ.;FeDrVOٌ]IkqR Cy"8s{]}c1\MBÐC +Ro2UX 4ޫtBhT6 }Xe$ZTtOP¤|l޺SB첬P j -&vUv2(M f|}!mICP$ΞE8xPM8ʃQWSA P +}^RC 'f E]O-UTQː_0A+Fm߈b +/ŴCg1H_i%0K2 [0 Px` O;dM u |1:YúI2ˏŜHD=XIvrr6MDY2ZR#%_0GfJ R=c:҇bxk 3 +?&R"dCkujet)O>6%'*xvj}DCWYKRkUX?1Űu{OߦSj.(bP2~; hjK*$jwDOh^DUx|S_e2 BBIx>}A{p0՟ u.W^8C>(smy%JRqiw?|a=FKoCV\j xU=iɼb9QpGpkjD^0[R\=ihX@ǔ^UjV5ҎrI0@@e~A\9_ٯ9=t<"xC%'*s);&pL['|)˩s}qN.*ό} ـz1h3^@gQlh6W([]o݋E7#fKPiNVݢV!?b0ET/O 7hb 9Sum3)QOjK'A$269'br݇Ѕ +,>2H=hۘ9(H^z+5yIH1tܫ$|Gue)jgB`RRHД8} /pV;9 X25N^=gΦÝB$f< ?Z!=-+Y 2bQnA / f anxyq&x?47ȑ咜h £&tR9EZ]%h|IYݳWCigLks\ +8g˽/^"_AZeDE*^v7k' =k$> V/+H2S֞#?B7&*}cg}qQGKmW E΢e@(W;x̺V[{@[CBp0W%Z#jZcp54TQ"FCpSpjWi3U]M$mŵ俲ujVr&P- i|pNZZm}Z~x׫ QF>T>ޗ'JP_ !T&@uj\3*Ky2JbL. Pb+E@w}XEGCCŝOc$sGK}|lԯ<5Ug Nf=!oq(q!1ēτ[s8)Ȧ5 ÜzFJh8ٷCVef ɶ 5o/8cfo)1DwZ6%|5#3kZHR\P3L;~ %bWpR"u 8T9}soےq_#2˥$*B-^VDOV fl4 +iM469?ER\7"U R)bAQ=lobN)ZN68}4u}$ +)ewG>ۀߐ_GtJM3}+ĺHТx~OA=,RQlOK4s +$<і3K}+tʟ!@A\'/)cm֔DpÒjM +O^$tH DIH`!&k7Yߧ~7?ޛZ/Z(+O6IBtu5S[Ψ%o">2x:R#9.!ʥӻY%Uh2 R{Qp.HK,ª0{8u](%fv`qFI,x;>"*!JA|;˼W!-90ζl{/Q8vz欆_o.ql;Z򶖓`[+e=9ӨEWV'ԚT8lϫcBwߊ%ڻ>j 9.[+/4(øDKs@5 y1BUTzy*0 &गiˈo8Q!TGS +"{ +ߏv.jіhn0&{RrL<[S$8H Iٝvӣ +?S.f뇨[@pm{fwBgc㖀ZtK+2nh"gYna糑c'^ĉlݨ`zlRx"]7/.QTFkKD|#-ԭTy|yx@@V?.Q lHjTsӮFɩƁ zP<m2qNbV^DW%{HFl'8jm鰽Z;ϗ.I/h>7.a]?$ZCT?UL,|C%#Bx^b4ݝ3q=Ȁ'&*J;ګ+ Y,OG<t+pKäAg{{юSє8;V 0=P^!ˠ?2 6KB̊ +7IY s&m1)06;+J +)F$o:J4L`_MR.c~RFfGRJ*a4XH脔oQiPL$8torJ3 +~CJh$$}rW(74w)߼ԭ@&GM53 +1TMEtöUdZK٦"| L0n)[>/sΆAey=>;o@.U$ -biJ$|o@Goٯ7Nw$+0wv#$vB~?Rq x)ڱ,r:khU> endobj 2816 0 obj <> endobj 2817 0 obj <> endobj 2818 0 obj <> endobj 2809 0 obj <>stream +Hdn0EYaĮ,H"}n" *C#d3S)"2\ o$y5Knk]YY+_1B" w`QGxj_K޽W}IrQ:#[ʢ}XgQh- wP׋P,7J)C &SaY7>{:e1zlۦ +&m_ld') +74!Ő!<646ielUٕMQk5r}ޜfH-"p endstream endobj 2813 0 obj <>stream +0 U@&' UlB`h8'@c|&w*nFwWr&"T~xQyg+n]ivrai@l|#g|*W"Lўh/ X?(wDE; yP2Ve^aQ}tŋ(N΀UNŎQF˼0W,<q?Уa?%lV'; 6L}ZA'{ajĿAZND + L,B1;/Yzwkrh%HyywV3 ab0x~^^ևƵ 7rIbj#1b&\,}:О o=~LEj~T-ޔ׮Hyyh-"U4c 衣- Dg +hZv'qy=jܓp0K7BSg/ܱ?Trz[Onԩ=( QzթD1:#p.x'[R*eG%9,r" endstream endobj 2810 0 obj <> endobj 2811 0 obj <> endobj 2812 0 obj <> endobj 2804 0 obj <>stream +HWnH}Wq;]}er<$hX`#w%RCRv_E6YMɖ-ydvWԩS_I^pg@0'[X_~~yv X,ﮮ9\reȘ 1)ZKOMW\EnȔo-o~RNT?nV7\õ%7$%o^܆95|י&:3U?ƿE!L3gåfM<"u"cNe!0"Q`QHIG" +EK;'fR4z dzEKk D**δ )Mppy7#>p^ÔlԆ>stream +0 M@&6 M MpUP]AY\(F3=|_Np kk0 /\N +*E&xͣZo D6K.Wܒ|8ȘFE?.ׂ]7m/w={e4a&w>&aH +d4Ul۩}M s,[5A$ҟSdF?Zh2B3Kdx`p0Jw +al}owl@h>@n'iGTzuŨ?Rԧ⩥g,^(/ \e񹲼x! T( 뽃T >˟i5ӋؙuNO\aAwlyEa`#H3N%QD%y2VF}/Js(6yHq5JCAxwj9.NE%6Fqu:uA_!ŏ"Fe|S#"ڋQs:]4R]*xNτ<烦zTDh+{?֛#ˤ^Jqˠ"0|&n8&i(N.UIOu\=GCa p +Ŝ(QT ։WT< CշB.'ңmV aK3N<LFshÑQ){V509nM9#d6B2|1n5}5 jQ[8T#B%f]=A#e|FSgu3Ca?`"!BD "_0Ezإu)@J "6 '<2[^u/޸ R`-ADiZݗ%&͟'^D1Timf2 +ge*V;+xt SD>kD~}FQ5^ ykj9K +ɬ;ǧ"1&l_ y:.{4 .g\qBAP?z㐇.066!봢vpol%cT10x_v:v QԞVd:M "3e/9rfL%K_;C}(A.lM1PCepYb*\WcT4oJU&\U$ HǝM+8kCt$y٩cZb&U@MMMӝB 9G} yvlAJ LSCn 5}Z{~9ᑽhݴ(4 +!8^P_~8ed&ڬD!]l W3k,ieъw %X~3~'JPA +^`͎MUEfZ.'y&MO$\uYɐ0 }AQu44vBSa{8vO/Qs\ C&"d[oNѿZmKO|6][Ii+\iŌ spTZ:(}1s_=|9D |M{sǩvN7.xVYf%umHh1 b9 c׉qr9./fvA;9zaZS + zf LӒv +.0to|@X0/\bËDqT50y'Kn^`I&_MnjE!Kd 5R IiXiX-yɋ6}X/'ntVZ#@dx))nC-䤦 (= 9%e@pAUZX,M6/ݛU5&|e3-/DRH}dTƗ)|LROghh˝ri:{ȱPWY~ke80-c^#{+JxP^v0kgiחZB% ޫFzk= d +P|$Xm]($wXPq?pM)vNYOh_*E- +'wwxI>LTi`jO dyr}fsےɘKtA{1ɂjch>V\ +(mAhAV j0ߡV\ +_XЯ 6%v}NG)ɦ+Da @k5]sT# v@ڍvMU~ N7NcqFADҜ&Cr8rT2֚#$܉v3kzJ,jdnm߶geXf!0: o&OIb؅occ@;(C%§h(Z@-{YF0Binb9ήq7is ~d3C{/Q(͗yz{ PCȪsgp8k $G +Qo(Jrmv&_sDH{549N=6Iw5= CTMNs^T-zd/S )UeSr4<ob +XO`XVrU)dD]? `vmÏlQz9'Q4jqkY9Yat;M:}&fabݩnYx mT>j-Mb𽾝)V"G;pV[ #yW^m5%Qx@7Jb<[-}OX$' R|I{*}5gXF6^CP Ftd7S(T-NN`_pPs4xp(uAɎZ0"Y9ϫׅéO(E q _o1Z'*^iز{YEiWe=B!<[GP|=3(+x$7UC 1b7OU +4"fP)\8yI2*=fS ] Zt\j ǖ#!V-<) kqq󣻖9}P31ca:Ohg:w"3m$HVh@%vd+hr5²*uvٷW]pU2$ع2Y5|\N%_EOѩ>f0uD1ridS;{kإ;ǣ_иPQ(pqf +Y#/0H +f2ؕJc󿯰SmR{ƶrQ>:֜~LzkBΑ\ ٬28p!v3oH+9aE6tbl'G:ΖpE;01]=`]-uK՚qO n׵G@^bK%nonKDi4.e~EK淘Ws*&+VCB/URMqg3MK,<ҺU,WR-asdQ]Rs.&ǔ%̮B̊3U8mõЭD E-M(pqZZFNaCޒNSm;- Zn>Bat `\t,oy^j&YJ4LRĈ;36 z ^DڜL(FjMBvZhXz.cʢ5.2g (VWbMq*8:#jė8A;ZQe,e+r](32.,3h.WMi kHb f:>e|4qݾ+^_pÎ4s ʠۏ##Ut 馷E woa+>E39<^dY&gMGf:]Q@8QA^v-@hHPhiĐ;ӁmLCvRD%7LH;wl&t)!sW"⪉l&cݾϠhX"-f/q& 6Bg8pG=H哹+XTZ0+o+g9S.q T?(o{[(j⧰h2Y:/ʚ +SFeؐ1$džF~C3BE^̘@&Φp#늒hkk ڈ#n,9!Lt߉8 {$5n7\$ ׹|||cNO?FFi r;k_]x $Y;alY,z̔xo|<!RIzg5$p;u6$Z>] 1YUO}ܢŒ_2̘CwX-:h L,q0vU!xT6XZɌAPc$rD{6 &V~C;WTUk2.ɹg;ȱ,eF('U J94Uga9SpUk>7*Tϓڎ$'20/׬-Xmyy͈D/DQ:|U_Y>= D0Py,DFyL$PӗeX穜>_{)Da{GDZBVe +4kQ "ަn{N!%z +JY8eȺngSpH%ebPbD(1Z—ev)I𨅾&/)cy]mzG34Q3G2]rٜ7 +WZ*rhosPߖr9Eɢ,ZA¼d-ӏ_\SnS7ISA`P2V *mREĎ$n˗GM9G!G(lǦאM!n_"{AHh0x7jC4,ES.#4DtO4䱠 "Lv_ +9HuKd?Ʌ^2 Cbm{2?/&=}$;+O<{mZ4ƻp/cZ@00n i<{0tХ7tSTF r'/ZR2X:8>S%߇/,['ל ycF}a5U!R~6߫V>(jdw+G=WD/Հ L)zDu r…>VbLU-k:ܥ`h0s M MG1t( +XE1{r狎 Ewe!M27uM>i9xoˈ6CIfea[KYcß4vCJiT6xX,=@4^_K||o7/2OSQ oq*ǗWHC ^Om9T B灩o`| M󊔄)e뷾O/= Aw#xi~&kAg0-|3v'2׻E{GnBB|ܚm˞|x0h` ߄Ub8Ӗ[ڦ Y8&o*xA6"]Ng[mh +'jroqԹBOdtvG|7YwΪ(|m7u.ʙyHjbYahȼcb#VbXrH-# 4%p_)?V;4'M4?J(_1q^Usė'_? <K[ߑ uGZ9T#ٵ2Qljnjz]6}U$o2CXݏO,]E&vS~%4w2J󥠜,)mDYzgJ~u!zE)lЏ}LMuvq4osCԘ3I7µYL7I>z&Rt4#E/XQ̣Ff}^V)*]%h- -n|.I9>;SLLp.<]U ސƽȌX)5W]dmb)8@e*9wBre& .ȀnLp(yA :ktȢ$þB-Di'aNXζ儯5YKpwf#J2t?tEt +cK5%\[Dfhz])].1Lhyj䚲#NUł<ů²Z8z[R Aq#w@ubNL*3s!Nx׏К>`H$X@ ›rL/Db!&jfW[u42>6 ۠c!%>~}[7{բY+'|ԍ瘼 {W ,k sʘX%Fo3-SwVaDƲwrW*@wUJz,W j:JP4 ܳUU1M~[Ij˲*B'E74k9H;9 Z<<=N) Y fL9L%Y*7/(D z"?CͱSJz4$ӣLE6Qqo{$ |&ЬJ@"Z/%uh\yc 2)E' [4 ̸OsGۮlڿ_f#Bo6DɊMV@|G"ycK掜=|U>i@wuǍ0"q7M݆ R} db͟ĭ`xbzYfLJ2h\x'0HS9# dYiE`@mR=78۟b3SgyIkeE5bh 8̍?|֊ŔDP+U;bU&z4_ZK:'sR%Rb5õ?ShOc\4MEx~9i1)Z7iumprjzK!. G6 Tsqd##9]lJq_"YfF/ BKAQERH<[^%pdRm|JB4p_9L/n~(M5S0F=:d&wQbm՟T0)V?Z#0Mba S :0'!{Vn OpΞ]S`Q$&fi$hHxӺQ>պYyqeCksp%pzu ۱YgO=]1uK `# HڨliLfyD Lie Ov.vJ'V>(޵|EL녮:tDlh:^5Mu`D[ޯN )nŚQ"T>C:=$؏ue,VT w,rp\)"^a:ABܭko3l Yy…1k_9IQI[.b2 ;"O/ɛF9襅;:2_b@` +3h= "r6|92%v5=bm\60@5#Yk@+`@(vKLȧd~>gc,#RĻ7 R +y9$:8FDV30C7۠~E8x#"zLPɫ4p/ET*C>n`;ܽFMUa2 +H/ W .*;/rg?@7 +`Tp[YjCD,QWyrGMk(L ЍлT IsKɠ!(DQ}bt8ujT!Ԅ`%FԃvQp>DR[pu{&Zu0ĸOnڷɰ4y=D-9~Vq(ym3?ABo=e4q% +"ʪh+~,JH`[&=@Ʋ5S0IBAfo^ZWXʨI7f~Jj2fgtV%ho(lPYYD:g%-%%cq2n& +崛z?Ĵk6n~b Ɨ&s7:[ݾe}ڜ]6V懠Hj @Ze1tjT]^s.`c5#pyW~bĝyy2N|q?"-uώjs$'9tNevb%'LF C(h8(]KS޻̦\ār<)M 7DWB^=@>7N||v)|iڂ0JF""Url}qM% VZԜ|e2B oq"!!Ձu-^Hw@!(_a +$sib= 0|+\MKNQQ"w̋j1)Ee&Kc뽁;ָ + ࠺b4<3Xf_43}6 g3uAŸ`йsQOt8WUIx!IGl4B!ӄ~:zf( b#x?.Ɏ܌t_XRvF/ '5>uypcdgx +C?kgrp7r=t6k'sLg)`H#`ɑ,LaA! IZZŭ`'F.Dyxjc I_1Z/ ~ K>@HJVq5=vU`Fz{9suCR5?.8מ?l*SZR3KmvNLoԘFr}גACmђoA&PIqQ ww>!|ՒZ0 3Ch,wQZ:/?ips|) r:o;ʝԃEف^xfRk-|bs򌿲*OW%bl&L|㜳'O{ Ti1m_xvJJyg%zz`2@n\P+Oj53DE5cwp':FFqo-i:<{_\Xn\IHWg7xVof|?]p?؛"d5z'mrs8M>nZ\j7A/a1h65K$.1`=Ÿs~ BL(ެGXF{AG:1C&6y{Vci>!k3=LԞ+5Vօc쐜pf⁔dUGy>o#48:Ux|J'iM֦[#@ 4Q K{WOjohK~cl.X8xHEaO⇎2m֯YW+qL8~_pe =_EG-P-.S2s!0(寞Wص +:n>5?Ta)3 ne=3*sP.ĝ9/N;sm[\?Qi SiU@``}A_[G8kq&4{K'>jz} L?gay )6eµmRlyE@0VР?j s.)Cӆ۳5AvafB #`8{9]tGoV(>`H'jQs^M!؁t endstream endobj 2805 0 obj <> endobj 2806 0 obj <> endobj 2807 0 obj <> endobj 2798 0 obj <>stream +HWr}W[%s֛a;Y%OJA$h"%+_@MřӧsōxN(tE\_힬>5Wp{v{E2Bvv3.؟eҬ7(ڪOט^&vzrݴΝ>)8LiƝP+db9<gdLK]6 Vu?*Wolt9ҙ ٛd+ADfy+rmyTŏx+gJ̘ 7.[i$ٺlyԄGֽP/[8>}\% y(po` 8!R&vɨvmPmn(qΡz,mZ\ż8_Xw<=m=,<A%#Ix˶.1!^" sc}PΑ2MPK3mx_0ZYSj ڤ(boS[GM M$󈓪o<c(rw$fŲObWf$Uw |- :'/ yQx&~c@JKl0AL-)Cj-uw0>ߕpܿRˊz1:g( >D`ɮQ,񐵇cx+f"CS"I1 S%ױ;ğ^"M>;RRԦ<^nhBqJ`tFm +NF]CAѨ|Rb,3FRtuC6zQè@$u>ׁ%^ca9r2|*:&O*a qH1)N ܞ1(}UЖUs^ї1ܚA6嶪K$ɴ +"XFXiw{5e-%9AoSP'JliS|d猒ÀnzWEKҷ%*Ǹm|$>{tԴPFܿ(y2aFK 7@F. a87ojeqɛҦ>Cu1if L=/j5 +'1 c0Ô8!Pih<BʖLbK/|[Աh(NwK&0ڕEӣl +&54&zTF2:")yQw`d#9Q6 `x$'E4Uq&dL"~L*>M.R. Ϣ8 $lm sF&DgX +R =V!mxE!ÙENM9~t]* ٔaO8Ӕdր?W5c+@!+|O~yXEaP@+a|e}#f yOZ"32}.>%"JO4FO-r!?džRܗ̚F~=$TN~*t-<-\" KȶO(Cj~YaX[3n.$Tġ#|aC}Q9Wtl 1X3e + ')-갰By8uMèd$]0S~tݖmL׷ul'\SP3i8h$|xqW»sMByPûS,.2!( ~ J[2'"M)']@sY ZDQi@}M.qȳ&䦛ϋ(VEiTŽZ,U]!SײB[<3YƍQh:˵%,=fΙwh_2'cv|"=`HL2PUIkDtU8tʘߎٱc#104}Ji~T;`Ew˂*u En6qFWb5&dݜ +Up|m2K+c*(-C> +Ob7_$ c)DH`Ef94()@G"J +I8qhY186 K@s?Mơ`E '΄Ua|/6Ӡ/'׶;. cU}x/7jfti m]#QRMc`CMOu.}.dCLwTNeDٖ~[7ŝ#)HF$ԋQCF|(ڪZ4k7Nh8Ɩ;?Ae>mU4\ULI;pW<]$u,5C%%9CXMn+OW;fu\8uտґ„"5u4ݰ@MIwz76E+<Oڕ?ܝDv͜|G EV=THv|!0Vؔ%Mc^c Ї7L[32)` +)9+c +sYFfwX = 4Mqb8I{ zY 8u"'Fy>stream +0 H@&XA H~ӦƷ&b~V%ob8?#5xhY1[Q +"9bt +mu![BXCyw%_(__k^y;1_IƉ&DH,Ck(|bB!ڳZiDsu +ҲW9xJQRaz? &=>"}kmFKWm`1B$K|V~|Akc_:e4cTv@_sƄx[>jQ8LVj$ДvJzZB5gd+wHJXpgf2uov~9X){(Mgur Vr!'R5#S5c.'O< 5|ӎ5ʞ`[*)s|вy'gJ1TN%=ꎭvZO/}EFGT^]8{ +iO";-ѧ^.VhL[?؄צƄmoʖ%!UBܮjK$xЖaҘYz3ʚᩦHL3t$e͟.䯟@bs'P Y4k4}f\ Pu,]E?;$tb,/Z\7%A# +ySv*"DƉO4"D8-==Qsbug }ZYP?&xq Iѫo/cɊ82ߝFi{QGo{*՗:KF`"^f|cw5%ٕˌJؼ3GE"̘pi,`- : +J[qr`=H0_Mn^ M.yb/Yi@r3 i)"KX|?S>eP0Э8Tl--B@io͗N,YYYCs7S^pWshXr}"9g&ݓx(/Vw2NUy?kp*raF :OA[_wSVZgk CJhYL\d X,/#eYjR퐱ӂ4ktTG KZB0(Z(5768-h>L+48GLĤ/' Ďv)=O\kK^D͆ZM]X#()ڋR{%[zA#n4B&Vl-vPNo Z۶ ➳ J!sB{o7=F CUiaL\>%${2>K1V4 BG(}gf'l7HÁwrl-$&ۡ2/,`om6Fmm|u-ҸXG6<: +Rex~ķ J/K4&ӯg зpѺgb @p&z6?w&8nK4k`}ui.nBrB.2oW@#S;?P=J3"Nop%jpu&ɼQ$.UpM*@J-\10H93&Q.)Lu#pяQ ^[ 7 "Yɇح3)[2 EhW157ߏko=m3QTBt#g蹡==~vr8AlvZ" V,m-=RήrP|8mΎݷg,'x#c651^TŬ1d0)dmoWRό4wqֺSՔžL]/ o'Wq?_(2kQbQ =,<9YN-NNRAC7B+KxK7Y0ߥN?S̏A4!J Cb=mfNJK7C>C`)xLtU; +ia1m&eb<̾aJx?t@ 3؞*Tg~[J`]?s0FGS{ɑ9aYK"tf XL07V }rtrƒir|7f@velɏ ic.qJ JO 9&ho rd4 +qC+nN:;lnl}fxZ~HEsCPe +-CM L{ LQ{T3'a`6g}H^G<;7/wڱ%{bPѯ؆}8j111ϙr)ťTl$ef-T.7jc&%^x|.\^L?GlQ=QB=BXfGٓ@>V^r3-EtT\OTl~Tx{IaJ0lp>{^E~bGaeljjǦNIdqՆAr+S*Lh aF(s#Z}Ԗ6xl, Uve@Rˁim:8֦V:Zp8| i4P?gSã)9BYKY. +1]V@Qvǃ +DWw},^0tȴWVBo1GPeFyI']By1XPsVޟUfcPƍ1hzanwj"Use̸8yH#te)xP!_?\ʎmYW+!+L<ޙ_pI +>v閧gRv!gQ"4@EC$c*{KjmOh,\{ˤnZqZ]B*zN_&!ql&rMZfuEyG7pAit5a'<,'p\ƅ# C ! -^kC{ޣ +0 j'ZJun ɢ)Nz~Yލi欱IZDWx ]~k ."d@IϖwNR6 ,Zi^yCӀ=4l:7n0gKj |ZV0~Wxɕ*ۡʒA&_ EtLݯf,5X,{vħA4` c@"J*@D=;+_ ئ*~,u3f7K2`UK3˺Et%z'? 9q'(!kT=:N8ݔ8**Uٟϛŭ'+pɼ_Kӭ:ִ*?i}M~$f/9&+vwLT9&{wӤF=N:tۡMXgUʇV$=9}d~'"*ӌ8krU*[uKFqN\Uw.^f?ڹ|'D"7d|=To_ ƏwsGS>L#M◸縃@66}t"2#he'PMKXFPIΆj,'K*(@5x'kc}c-UX"YOذhKR <8<"9YaQʺ@ti!$F> _'.#Nq@+Ѥܒe7w5QO6f`ކ+w!xS&!Jbw0[ͅ"c 5x$1):`բ0˳iXJ8~TN7eXwCC-U33*w qDI%ðFllT4w>O]pJ TImNi;5>S՛mRܲz_!J\IwaSKty0NuAVX,V#XDov&lr$]IL 9UƎ >czd6ԋL Ҩy8D=Xk{64- RwNtuXr2ϝ(!eE8)z6.3SFQ LHJG(iXx~xl7B#2kR]x(nn +*^&ZyQe]РeghD<-͌avIݘ7$ZQؠ|}!gEC?`"klC*6p[?Rۘi}L ߕm1X"Ɏ46G3|lvzb~%cI Kt~2:iyUu(tO1]XHۏQowWgH5!JfԪO*iO6S΍V"i6'D-A.mE598Z>:ak~dI ʬĂ[$~9z$yj\qRag]CSDc0|}qWwG#k#;;fލPw.On4 |hn*w0*ʸC*\ʊnm`>]Hv- !tKfʒ~&Tfn?6 jG8ؘ _U.F }%>__8%<8k.^m?@ ;:kϮ>LBp~aӬ:1[z'\IoF.g˃G*yL+K+L"|DFQg73*=P>ꀄxެ(Q~ycŅ%K\#o'm3ׇ'0)դ%iYPt4Yrs^WSr>ǝX:0'SDYV;c() +ilgM#ej[650!?,SP/A"Âg _"W)0}o?j-C` 3-BK;T?di4 +B;hQ.|bG5o,(K&?G>anw[4 7/!*lz([f΁Vx~jrHL¢;Ox.|_$U"9ؾ1ų&L˾_92wp)!^Ο㚠?e=Рߎzu&{EJeW E@FwVg?y5G{g 2b`D[ g1r.t)עDosJo.yX6!>$4nら!,]qC@Z!dP&0bI77GG9`wÁULkд7?SMSܭPg蒁)O;{{yxDt:.VTGLj/4֦0}&=>j]'>rgr aA2zy֩ TUpD xiqaA<mosbSPjΝ"8p}3=L|l> +3%–mQp1LuAnaZ;~7ih#Wx#C7v3mn\2W*r K{ kDg~Ll(Z$e46 ֛;;!WbBȌ`Ѡׅ{!TQUu7hYjzt+>.'s>ʼneL4/Gp%w+ꈵKպxOt`VNkE.K[ sGpZ>t'k.Uq4u9ėґ^?ܭLLf7Ry0(_%'bXS +_ %x ̨iyfٛBRd +E +K|rdXfkp3_+,w`jr:6ֶtjUq_ y̔m}[с$$œpzYIr;,k%s,ӄ;I>  V'7Gcn F//h=/vpoWÏvkRT Mj{$-sX%HN皁ZSЖ`lLa8mΘ:+^ᷗ)ĆPoLx(7׌%v]̅]ޖ AKQSf +9ȭZ|<Jp靂µ\ZS%8 +[lU21eD^SpK9I7zzXٍ]\nH%?3SOhrQy@2%0g>wO';$nrk=6қ}$J"]a:\FP +aEôhGJ'\01ܞJc?qqytpj ɣ1rkQbKdHWJ)ScC9ڛ X$KWs>W[r@nĤ ,lSU{h+$z43cyuK4asٱBxW + ;x"(AdUe +c`y\b罿C,CqaɜgrO 'VWǷ:kBmѿЦR/[b@9;Yb\ Tщ uyYҪ6G JOO% +f&a1`C̅ _-/KJc7BEcGU%T,U3N\ٷسU +ɦ?rNhY0ܕu38L4=o킃$]J]"Vw,j(@!.Gq$o,0"8DdofC976# 7z0u5z$U4ToY5U u^>@w(jM4~;V26:#s#-V] +0z6Y;Y`/K A~ 7[H|7MD-TaYFvu䓐g}iCH$^ebrS-`a~C +1^Z(M ΛGW;kGڤ^<:K. v]Gѫ` + d/Q)P-եw4E/me=ym%m.yI{`+@ 0NfUWB3#vx7=j$^βk"WiOh7'(܏c u1$m͝)vT?>2eA]g+Ʊ-HOmP99ĈChrjocILpEg=#g@P>Q.&Fe+!nde?T W +y~OܺƕEK9SDXwof/hx79,Pq +U +P(<(mN4*|,}E + ?}WxAy؋IR#%QC= F\ +бU]{#*9|N*+spJܞ< gc v.Dܧ0IVK~:~ >㶆"2!:-g sew8Hő!ݕr˄Dwh@a_t}Clw5zTZUNJ##-k9I2Lí4:Z<ߎ,GfqZNuh=J3=q!x3)\Y'4Xv0@Fi֔ϘuXJFmVX? @P,%sv? ZaC=Rcl=qQgn ԹEhV8:yzV#o-ݰo08I1z<r +f6\`@<8ƤJ:{LNXY\!dHeĈtCγOfQixd![&8Bտ:UڏY<*+8Vk>}0 +x{r]9;Œ(2OEԫʁBP`_СjA֘(mMw7 eX%j>F`ia{.迌4bsq2` +v-@0o;Yg~CS',ۅտnax]7T<ˍ)H)2 KXJ7u~PTEG3|CDъ԰{A'A`GtrEƹcg\?$ڨvd0 Stca۝{)LG]|CxӨ4҆pL.s +s^N ? FXX?",5d/ydL3[Qǫ;j0w#D\$~W%T59+NO_QJѼ!J~0E_N~V $.swڊ@p),B-;e-J/D?Q|J|$z5W3R@%dD4)I'a"7$My.`--\=~(h?yË>Dž$nbrAN򼨚rKKIݽ @LG"59 Ľty^ fbMڀ̲hnGk]},裟1/fnʑHw^fY7'\"6ޜ-]кuҶ]byPSn۞7{ >*q(oE='W%yG(TyߏK؈A*Z& +MB8Ma'218#6hX׾nMM-"k" & L ,KZ0(sY?t'8E[H E:L\qSGjNNȾEZubYl) ;|ϒJ }{L\ %Wl=W'^zN3}=tW1nTG~-$DKҠ]3B=u{¶lJƒGK + ^Hp<.LO-gQb Z!UVl5Qƾ8C%GtՉ!hNȥtBfJ[ Q 0|_z,< 1y1<Ί#-b;Is>YSNKePΝ6XN8Ea,k2 w +]U +&(h^yΎ$Mlzy +M)//e&v7K0H) Ѣln:<%BFJnߜC_u'6uom(PV<0dv:ޫ}jC`pa'#6{ԫ<`{ރw .qGXAB(P|1'jOiø?zg$d~Sd'OׂYv& ?mzS@pbO u]5E-kKKwDb$h= SpI-8,11#0Fw4"-)T1K CTAӬpDg26-z]sq‰ Gّ]} *4$"u"B؇Q"I?dAXZO"97'H;;x[ds. +SjVndK@6dSVTCSV-(!EUFa8kK`FnD‹^^B, 6[Q6I Gw_P[hT +/03hlX10L<3k2.`iBˎjOJ`@U}1<̌F*"k)>EGr0TZaev2Eczwq;w}tZG~I-MZĐ&'ا_D RL9 _NCbTB(<\;=L|"ƚgb5=/~_DY\N'(g&SB##єsYc{!լ]kT2+Qz294bm^$qĴ2PiBL tr[2-dN1f8Jp R$-QkMuL W}Lnu!dAmX{fu?BH'R/O/.@5 ER A_B#MGr^8:R_ +t$ͱ?nD܃y0+{ϟ Ԁ)3>rZV5$4V[]}ӉP-DKʎbZ Y(U9R vD]Doó9u' xBb0cbAz?Vq$Bf +%))X+b"T-(VTЍl3il͸FjTbu +>?P'oP$>XTk)~XwO8H!bꙭ +ihQW ;tЌ0F0u 3Vp&\J6~g7Z f{G[?ė0sR>d.K!⭊"hY"0+ً_`W+T?c.)˗zx2Ɓ-;Z Rh\++ < 2c{)\4!z-<|G `)%0w,(2u=h*L-Ft$v ?'9(HKe 0H˝T)8b=@  +-0tk}7<<]PX…k5NaKR_hE+=+r\za ϞqhS +|Y^[ Mu@8jĻXzl@;!eyVӉ:김nE +ѿk>?6{?\y%%Bk:rmD̠;rKuZILisw}YtUndbb 3R/XsJPfbnՑ ,% μA V|@Ketٙk`Fk +)-=C#8I'4-8k:f +m;p2Ψ QnuNeP]2'yć !dQJLbC;UJhݷ {Oz" +Ld# 7iD_i'nJCLt{@5$0fpŜgw #'r5O*SJB5A@ rx1}A*R:$09G:#co +!QwMZk? h[Cza$\0-NKīmV(cVèaNbҒm!P]ϮC?ksHK} +sV*BkՇKϚlBׁAG?o Fغ<_$-1~5cu>)u܆DMgJ:lg2y%șPЧɝ•5ßģӲJ5ހ^:y}[ A"vsXi"zdEG|ҳ'dp#8֯z~L>~*#aCMBNOV:n'[aՉ$Nw]%zAu$XF+y|J W1_БbrI5 w?%&7t5F%0/ dsIeXpE7[UMY5uo0~oz~of<8YY\flYߌWCyuINF}J;\s"!D~D QG"鷚)Q8=ܿb-94\MīdApM(SKCGߓ4TfprmVgP2dC}N_"l\a`b8}D:Y+<( WŢ+1&{ +,R%02diL[exi&9'Co]X~%vb qs;52rV:HQB~bhS??Ӎ$lgEKqW1 yHӒan+;}$<|k0EIh#.Ǔ&~ʚ̿NɖН&sR-BKj- Z:ݏ?ev/Q^'tqxWO1$EԲ6BbtGJdJY0ŵu&MV4;s& *@Oxai^݅ `H_U$h[:|IiqD..?J&vw륪 VE+SNXll}$Z{iֻ ƽ^N?ǜVl{܆OZ?Hl^(KvO\&roz|##M0 ɷs].` Xw7 =5s#]톟; +6{pl6 yyx- lF?ghE3O`pzkG~J2.MŌM +$8O1qy`ftmF9IK]W=F_+߷9<3 sƞسO>S=鉆 (\]~{Bmt- ud^BWО-[X)* +uGu4铴o[|B/](&6<1Af"o\8m(jDtĴ^֏xc10yi=6za3@|@j]XAѦ_[\Z*6s|=1lo>- l 5V>@ iw@)[x70UvZ3ZᒵUcZ6sC$@Rkc_fXiXZb)[KSJD(eJ(,M/?NX"&dG-`΄1(Jiro)C-D*g€˒b+GRm_[)P./oF&zAx p(5\V5W@M+5+ +F`:fE&9]^ZsH)@@-!Y+|J [Ё?_?# E1XtU@_?-w5ЇmZ5]2 +ѽj!Q<;&e(}XkX#h#x_Acbxzx|+VW+k7O7p>[.K@^wE]*3uB`S<1svhNZ9Ӳ}~0اO/4Gz^;!)?u,X_MQZVW.;8]:RbI_4Ճl7yFhP?}~dǼ2ܘuB+{?H`EɄCg-Tv +clbrYNc%vAE= HyGbbWEO`/REY4hϔk-_Z^pI":gRH U[Z#.\.WP58p^ +!ܝ^Zo.8ŷ-ᥘL;.{*ps4h/ɀQMdM}̇e \0 ^#I] h+#pU[PX#aNf¢xԭVp~ذE+00KiQO}taWrZlljc6 0e.+ӐqZH=+R/'ȕd!hl]2c:*G +ykd +jދvX^s1R@pJLQFaU`uP±,LbrpL߯+m;mY"&c otkƤDf)CJye `zp&B?9+´yG2(rvQY! Y4I+Rn @}y8E9,&>k@F959o8~cpLSd#Y5 +2XF̓v.RWR S?tp<Zjr +3?c2B6Rl^TʀA'oM0'qFVT \ vE&D_,zC!78޻nJ?N2D (@'q.>Gwv_ziܻLd"P *F )R {u=QO;FNWA\獜Nw`n8TŶ +/nA 6K6)٘)l|oGh{K'üz8:xz¯`CqF_?0viʘ !wz'a2b V]^GΓ\w^+ *WKjk +/ttQ◉-R.5Vq m /` 3w0M &~L"f9~ ؜yh,Q.c)u fFE?!kfD_M9LN 'fmD2EVHYwKu`'bj^(jJ5M4TOq }} 'axq'm" +J5vo[ַ?.xzgՑ]2Bed%:; +֓ '3,cSV!h"py^,vd S.;P-5Lv? +X:`vo+VWru/mt1坛`4~s0fSK$M-Y"mr#QsNMȻ`0]Uھ;f|:> TUI0DWi9wN'yUzh5u}2lᑘ_;c6nd|f=.pAWɐIh?ҷԿ7tb44C[[IL4ց?! 'O@}؇ +[^j-U3PϮaaL ll.~ޘ 2@dUm;%锂Y홋|N$5%؃U+JѯE\6ۍ~4[ [FoRAxjFH^gv- %&PRaQRdS]cU@3?;|F!˗ OD/N]3V..eIc];.c+)#]N㱨 ̜Pg)Oӗ*1>#ZuRz<#aA~97>hϡ ފQ\ncD)I< V"n T=[蜬SQh }L!{i=@M̆UBSԬ޾DcE){۽fڧ"T=Tca_ʌeUfSLbHA +_v|r.i&DV; p Cxu)8)JWցFr! %kKAدDe"wΎR$"{m> % }fAW!C6s2)A8 [q'4JdU^VU\Oy 9-%M~d^j{XfRzK֌eR뜂YM?@㘨%t1t; +woRj "Er; 3FYN칓X7,7Ozmo]UL4<0ԔkLv9Ytl0'Rk ++_6(%U=74#AaMA4~M4H!IB `ym 5 +ze<~{zrNK*;Л^Ŕ"q~hHt:We xNks?w+O=41{t1Ly"ju3{[9 Y,ten)$`oQ6Fv:$@YZO _tk]!@ h endstream endobj 2799 0 obj <> endobj 2800 0 obj <> endobj 2801 0 obj <> endobj 2802 0 obj <> endobj 2792 0 obj <>stream +HWm_o>zgN/iIP$V"Ϣd}g/ځ8;;;/̧pP0?7x׭~^}Z?X_/*+bT J-/5/;@8ֺ46Zz^\ÿꖕYS7(–jrJn +D-o~iN1T|x)꛻Suu{l-@nct!K/\ +Eng/BB1o׻z8=,o }WfG"~<֛ 9=U8.u966@xDstxI|)}}wÓew)[ +N˜WX$mg:∽+괫c>rW +[+΅f_O0dNSSS0uxVIoՌObC|Ə!tVŸvcŘ#($ 'ޓJEkrLUĔzEC/$ ߠS.uCUA"Uu_F%6ͦi_֒,omٞJ3SgΕXBibxW'.,ց?479ۏͽ;l1 fL!AAGxqN>ԙ[e?k;Hr:_Tb 2WRISYA'}t"ձu_gTgkҍU'OEO,+D8i\tmJ-#!(ClvLH'.ݒ}Il32It-Is,uMXEHFغOWYS}ST'}7fLJ5!W"`>;8_Ŕ4hu$5]Ri9K@f *,C&Ei|H_VV`y y? (R"vjˢYNՅxVp(mUMMg88*F%`KjȒ:.%@A:wtgn~zB *bGA':+RŬ0'"=fe#'_ 0"Ft  DGP ` fHc#GUYfnÁ +Ib|. w$6i N%A@&;&m[H/ȥan[烋l"?4mߓv^-E$ +΅̳F 5eAGo+Tz`C)~4%N0ώ5"Ћ#xxS2Hk,Z!3 !vң`l4]0j6'B,6Tj]^ϋ"wf.(E-.sX.EQ{_LYVm"bR2La#(kAqy)(|8,gYx8sۺO@5\7c/duP<԰`h2g@ AH:H0AI:ϭrT/K^bq4˾Im./ۛl9$&f!aԾuPUAsW?TtnhiP-QÀ|DB##R̀1ɱwN2DZ&G +953TYMC @7!ZOաA3NI=Bqp1?X`&$L`#@ZDLsNdt39v7f +i \kvC Ht#r+ H]*z3dc~y|i7Rqw S ,# G&1}'|1yj+P5I @ICٺu:X=d ir?rQMBy7i.8 +2ztMuIs·L*i̬qq&I[bBnҩ.xZ3<77Dž{f6R$Ҏd;n759)M׈x˯A"a|ƕћI$ +,xNSZ*PsОqpg2$q4Ŝp2˒] +`O +š/>.T(2%]s/ƩS]KZ8p!n"on–Ar5ɈKz|5%'t`w(bԝ!V)RM\()X]F`2y+ c 4ԐΜZ ~sEDHrr$9n,<ͮz<)vC5(U OE?4:eɧgELPbWYFoZ]q^^YW8Xu7.iҮۿx7k:dXzBHyd(pB%Zb endstream endobj 2797 0 obj <>stream +0 H@&J H +F;x)D.o1ԍ%bX- uJSWo(7ܺ_wִ"1[um9!~̛Gs]]2=s}j. * /fۺX%'SqJbΈcW1g9E?^Ŋhٮ-<ZYm.$5N]O54';S+qBay tY]\e~5U`J暻72-Nl`b[Htq]>)&"f0z7h-΀Z4 Jy(j Vl- _n]VB$=?HLSҳ6OdSJ櫛+r@wϑRV&|ں7&^J7lS#LH< Vu&o]>Z/k"K.V-5dDe.cӜ|7a5Nۿ+Se@ #d7(G;t_Gڥ &!QzgTCc`DǕ ZD:!)u +0j S\"ma㗪nd.G_cHvM?sl[H۝#`Gwz1lY}Ll͠*%#;}42^NR7$.6 IV|aOGVFzQ|YHwN7lg^lK0}kV: 1^D"bmA6T]"O!O zDO\^΃- xh +u;fӥRP4bFX3wu1@cfi3em" e( RNb]f.D"@$Dw3l%0^ jZ\:Ï|:HA{VӄYw fbuhQ) HOa2E횋&FE|w*'iŸY8Eq5_eRDMKEWQFwpS+܁A'srf@b`џu=h!̴#!YeZ0zNy//3 렼"+њ|Bz;FRx]) Br>e1.]+SMUWwoNx;}DY +aW>{i\|0mfO4^oMlt.d^vJe݉|6-90M#Gi,m̻d͚Mnd6d5󱸉eO +7WݎuLG!ɮD+;a,p` UKnےÐ|o$=NvT L]?_*r-h{UsC#5'Jb⨑Zqu}ub9`p05wn lT1G0`DVQ"R +'>raѾx^(s t!CQoLǎ3^ J'S(5Ja'InB#fEo=~Q^I]Fu>n{͹6H0fo,aڐs>!9mfO Y(p۫2ρYsץ$<<sFL}}Q묶7ʊwr[7{꒒@ne}#RC =UE0' -7l'UQܸB4I*oAf'JEFAҔ+~,& +}/ykzdE5VF-GWwBY uPCz$1$^m +-!8HyOR(q\G?}V4_ +!z˨)|b *QwpGCLɈংYEY͍L##ն=yVeT=A ӞӔE\lZZM3޾:o*ww-L^^U571Ez6h%\g'HF U;,Zsfj2ѩBX# x8 ~(V0ɴ! $Sx6%n ,8)\} z ~i.4-3+E|1u;:$^B`ATc}S<uAUZLFp݉7 +v\)Y7tt)=r2l VTZtG ?ϑBƯ^B* +4S7h1Ig۠Mȧ pjjkF)O2v1gRT7^قWng{͞AzWb(8pW»?F@SU_վnM-\K_ߋV",l(EHȹRXOC<ȣ<$]YJw)A&}9h"ȻO짎$C<ۖ:\ { δҽꇦ|V[t է +d-Ю3M@-|ێGO6 K_sZj5SN@=0I >9UNh[\s܆dգkJH/%)\ ͻkX oiUUZF]h@تP !pWYI4D'T,fcfd~>Ub{`J)&7x|^Ez)!n!vŜsFm"JX#@O]Ugmu?ÑF\vm'xEe>8=QQWeCk3v'uU#Ծ.3.7+1ؾgDpG36#Գx[m3^Tˍ4~ۏfDyN(R?}VD +$CE˺ӊZI L%r) +E\ v9MuspB* ޱ:oD6܄&Q 2ᐢքƼ`_,lՠ4Lw*Xe6|cFblDIagValNTuMh +Ǜϡ;T|Xdo2c!OjquVw:Y֎~ 9otCCU+5zm;I@p5 =8{z)br^ ލiukH{L!Xe@aEt),])֫[ڨC\E4ʔ>+,:PA`W,Tº~veJ$iڒҢyKl-*"q>.YVʂҷ,Hz7&F Tѿ[,1XDsgA*I}˜` sާXăW4+LVN 7 +SxAᘮZnj? JSB{7޵!TskgxQtbH̔M%%r'W'j~|=2V|e_IwĪ45:xp"UN%M_H"gv@LQEyЙq$X!UvqyuHl'$1J fiiwǫU@O*~ev"6/G$6vVи qle@`wQt@5[7laUŎ`ɤ1m5vu/VkdyV`ܕhe&0>e_?HQ߷ftdy۴FqÉC#[zKneSXRGޢ*7c CIAۇ͒Z;(X`˻qD%Q$O_gh%kEn_nHhPX9ǯDtvLB%!qSLVwY~ w5f;>NF|V/sS*XyԿi>Ap@>"fMJ['\hNh +0y>qГI5W:^SNYUl +Z:O84x.*_ڬvLe?Gx[iF|fz-`b7E6@JIl|g3`aaySo9}avB@]N k9ؒIMrQ!ki[TR + =9p5gM`;fs(uTrAYIXMTX0w@)iСը-Gގ,|r%(]gfܩ!Lj( ,EZ8tD6lEX$)D, @@Q(i v3[zdjO=klFI׸U'YxZ(~Wl +wĿ,@OHP#!{|=8">y CA3BhM ,A>(IRt?ۛ^Euq')+s ^ɗ7u˄=H{MSF:*ۖ*&ۮ=Z uߖa41pLT~y ¬Y4fcS!BG⾛IFqL'Z >vrx@9ʧs:RO[DQXŤw ;K Paw"bC9¶P6YuXu{k}hm*wP|/׼Y5I2Cˆj%V & w@zޭQ\7^{뀶RV<+:ӢDn EebH!Wd@4wyxyfR9' +|Ke >p&5Ǣ.w^?Qn-V +GBf +‚}j2`Qi)=逞,F¢!'iwzfG^_c);1l &`*~̊>*\{hX6+aR0\ᦩe#קGDO-PEk3eYƯ6V䒠 +@Vcދ˙V .HPGz凧P>:CE˄wo's$/x)la +v&%Y²DBn:nXш'OA|" m>7vH:|=gV AWY86po5zkA2j8¡\޹Gm4h6Z[Mj:4.,$]b=Ad1ITnfq[5T~W@+ޠ}nx _z(Lk}yq\]PfXT#c/@VD\}jz]e=dJʏыQ,"mT]IC3.ѝj7`ɰgFO{۶$7As,;JepwQziEiܒmW0l#"&^ૼ9%qU<Ѓ ; KdcMN^]w#* u[}9bC}*ό2?=.Ԗ"_+tu6s2ī+mCo%-Q=x^oЉtKWZׅР$>s0~d#R!zК"lM"[Ǩ2<-kqS߭}!``aRhjH+-U1/ ~n+Pņ ҁ+O$xpBR:T2խLĬAřY)(g`h. h\x#.)|_W@oήrN9Y/00tYG֕le3r>d2S|i f3\jedc*Ǻ癵 +23_@CCKso#l*ύcAoLι+9P@ꟋYn3U7'BTRC 8jH*9OmE\o?<'3 +7[s_[' bA8~f EYX8 /_A׬D80FO…=7\ ?!hV~BQ ˈ;[KWsc) WB}_?Xj"J Iߩ=Wi)X/}3HyT1tKC~xE8R*E(ViRRT0o ;ɛ3JSկs"b1 (B?U8wsfKe 4=`ЪQīk.,otD#g92VrĀ3s ips'Z%k~{eE9fm>ǵC[G2.󢏦ZC Z1l 2Zw8Fz-IIg 9J6p?&\Qsl?\c!Gy5xXjhiP`J?re*g?O}ioTXL + sk3g[0ȭFU<䘔ͱ wx"X8y[☱G~ix`vW ZyO'bČ"~eM79Z&ʑ0DC]FziH5wf/]x ^O[i0b[2ŚGq/%2M괧aFdB)X?Sf`Ƀ-15pu+vV͹ wK{k9CƌRR%[LudDܪK,3n>62̉o\H r5z~m"Gtʋ]\Hy"LQ]@6? - \E-[ٍ_Au"m`-tNyY_5Td-Z hKֺ+3f)}BU`٭'20-| X#"\ѵf [/ OMQ%dJ6|&po%yR,|l<SgB9 1Wty~X+ UNp4.I CCQhơ(Y \/2-cʧ-͠zL JKe%Jl!$c*p$ceOG'M1l<!#AF$!|YVfqs+_ +YwnLsT0D17GumԽj!@ +1U3/{gxY@QC\ɠ)JiڭB+X ] +#rMv,G!Mf6;XS #>˄`K3$76fJj k2 ӕ5eI=@+`F6y:_Zq].SBoS#^ӝ~TpiL +L _`q."@jQ&D9 ^xjzG`,p ?)y1,c$_2 - -#xuڬi>_ ̻=DZ}w8 4ukkN^bq* ^>5*[NI1B8y1CUHyU*S6`aiw6 +Tj^@7}R(:*mT_)]cprVO4 &I e"flҢ-/ץYzzpp'wh 3T.9nի)P?CɤpVӝTWon)wz~OĄ7EL춰 JHˊ.l=~WCN8O?龒l)b gǬ`zNyAwCbUJ*~S=l$5.j (&t(VXC`I֟Z!# c>Dd[@yty>d +GV}\Kd(aU3a"[iaղVyl/AӗrA5PP(pHH^rP5 %Q^LXëzpyQFFBn 6^Q]t:xLŖ M~Wk:u&p\Vط4= nn1uGN=%.&L?0cg-/W Fֲv(GLLX:j9'qZZtmz+m4}+ɵx9©?wSz-cVd6PV0j3u]#3Wn Mmr$1w6+}EkM<&CU~v17[FpZ憬-b6 [8{luy^^lR[_)(E(BF +4~H.&{B~W7gNHY+,®RL]~}%R[++*3^ +!mr|É7.;o|g+G#*kW\/&?# ]N.l Bq9̹] \^I\C"rYV|&cЫfĄ)ժbm7HǕ|9pM ?ˌ13GVYKt{ )ŠMeUMv>nuj0fԽxsZ\){ +\4ZA3w6Չh=%H|J#_SܙI9EDu:d:#d(r?4`"XS{,܏=De%yN!`"s}8 a/*e2}[妝e4%W|ޛW[>U$ +GebE+[\!hGPn1dmY |oӕ,?SVzs}_0\Ӝ# +Hfԙ ?w>m 2ݗJCZY)10S 7QG.9° rNY۾D8#$UJCf)/5P梱XW +!(4"VQoX+^Ml4K)oەw"Ɗv՜יphgr +KJydYhݜ- 'I317%!˜}nDO"1cw21? 0|8n~N%e꩹0V_5fbԯ2TY]`ԧoɰQ(5hggjkO_Z5?ѹ8w^̀1RU>N: +_ރ$ +cky>b@L`"X= O%=?obpXOUqOv@+e 9roY5>u| +?S?Qꌽ'6\ eg0ԉe[CeptnʹuQ,3V^IKũ/@*gQ$d7j,l4Y> +7 >W!qqnjkTg<ћ?bN6aRVأ]9cjqSE{F8xP% T +)^WLwEA_kUFDQIҽ/gbQNN +*M4qTSz7xNWL|e9Yv-x)qM3K$Le"nlir]>WDR12y >3s gmSE[Wmݎ3YZ"+ <$-Pv g$_r5TK&G)RN't ӭNQyG п9sG ڶ{]ED{E<r-{,rHX{L.gX\2)kt鐚W Dri&y98KE~5 ":kkH{ס('Q/`IH+zzIWOKywvI( PQ3:wR"3NGtt5F.c?x ɘhI?\,I Đ? zhP- PRr&1=&{4 F2&?y8~{RTG f+Pw$#寴JF XBG!ꡙ%M6OmAb%IQƱqF`$(Ԏh|y1tPTFTTU0$NG[O[/@%:L7)l|fMZ)ycѠqoqBhO1:l҉Rgx;[T|}5?;O!@vwə/njcLOJ15Cjh䓞3|fx#:q8z!=:})g2!a/v{O$± bEIS7%dܠH.Xm05׷Pʹ5v0>OJ%(%UZ\/|k8.!v`WX8";s Rd? +qX*r}|MlƱ)*DZ T{HMP1Ґ#󂈂(l(V 5g`aj\r;#6 25VN Zn +⤵Ȳ23'(U{:9 +lͳQ&B#F*>FzRТ/!z`]xeNJ5? kɍ?ऎJ*~0ڵ=ʯ5z +H&ߦVd<*fX+P8Ins&*w 3SNlv4>O[ ϶ٳ1$Ak~l6*؅'I=0ɧ^bITt`Ȏuk5V KŜ0:@QՈT@π"YPzA֒,%8?.uQyˁ4't"* NԋA&"LJI귈eHL,IdO![T]\+#MSq]k; :xy{FL8l~5˚YIr83ܔIt"sޢ، i15fc"ǫz4|Ek .#$2*v &M%NUrdh$$.!w o,U蔑`&.kT 7RzG̓ϭH4deyq9IC$־ƫ"~(݌Rj0kO̭ OѽElL=TڋHi9,kmA5o7`雎y !.Pꕾ`/pdž|EBG +rUgs_:T}r37ij~NV#Uc1_ugtz{KR*~g? +G%ip+ 3όP[ u@ X;SPFqESf {ęNQ|1-gK.6۱L NĿD񦰌/-wٺ9?އea]郩=_Q")Ns[A 0x|+F/O-q  +G T г~#&DuypNAAl^!K&~YҀEIfVԌxjzGڱ82-zN#]E')JV\E?~?)bQ~W!13g&rl_Ȑ<.]B,%ZaT|idlR} U8k\h;A psK%r+t!+(Il*nx+GGwnma#(!IYA6CĎj{+^wl.NtODQzPH5kE*ޟ]T g'fed[ ~s`$^+O 3[ZAQ|dmF^T&mv2_ +jޭb-˩rQgyI +8;Yj:έJTG~䏳@;g9ʵ#(6w$ 8Z=ߜԟLѰS& Rək3hAe4R?I:FSRËuJ ŢXfzhJؑCTxc͑$N-D[NEh= x\>DR_mN'cuҽ0S;p \8v!{u)"W d׀;;PWMw#XEFu_c]M +E(yW[PD\w-/,@dnu>Ŧc ]D @~f5LbWR}(Fػ 1l_ #@Irb [E>Rt99j*Ҥ66 z6 +f`&ʈW U/wnDn{$bn=-[Hw1NO6Gs U;!1?Z Bܟ4kzv@K""l*ٓ9^B"װ]ȼ;&ѐܹx26DWewvW ]nNj!])7mS7-}*HFow0KRv pŲJ?|Gy®))KKE'Cq/i@gɹ:s|:s˒A9#B=J mz{?Tѕ֔ Rdr}"8l$BfVmO|4#i,W̺{'4 +"߰c+q¦{ ƒ65Pf)%< ;gHF#ʎVId]~8H}8i{VXזP,'38Hć`K({ߘU4V**LGH(ݽ,M䡥PtA1c%* &){OЧAC endstream endobj 2793 0 obj <> endobj 2794 0 obj <> endobj 2795 0 obj <> endobj 2796 0 obj <> endobj 2786 0 obj <>stream +HWmoF_o eMJ@UUEQe./ξ^G Tngf9Vj(\a*=~藣kP/(Lb)xn +C8R_펎ߺ;(ZENGAuq%gE(B XMmQ(ACD+Nl`Pފ!&%a +@L6^;xμ#RʔDw]v?;DjWm,PkaHQ,u1 @8)iʻQ@$5Uݍk1qٶUsuW<~tf1%M2ZT 3@ͳ) Uln$0u:W l)Y5"hN8% mq M|#^FV[56Q J)/JyFMW>MBĢN "@"00`u*ӓv,Q6 A6pձI`k x4d$VӶ`SXaGh I];DNj\0Izu!x)Mmc!"38K0X U=4LbaFӗ{?U}uO'#v&A)<76А:-kshl]+ ɲ7P6d'%ͲoP)tŠLZ0P\9f,TPШqcuA%G2m;U$+*K\wܙ4 MD({هSRL\qLgMvUY{omt~՘C9Zaґ ^,&(!XLjԤFcAo zf_Aq!{R'TO-1PEt7C@DtyUַM# endstream endobj 2791 0 obj <>stream +0 D@&8] DEY<x[Mef& j=3K(=|+ c};G1R$xP'n@뿨T^| +#Cd"mZ`ok*N߈ļWI%ljNpƆ<>o*Z7\+~RFlq-T[7Rǐr\v}"hl+%ʀs5J>P w +@xTgNP +@ԷN2',)#Pfv !"}gY{4Pɚ:'Ƅdם|18/?bɝ>0 ++UcȱvGm~SF3'7Jߺ\ǒVlH+ EhETc`8LkXX*P-)=Cx}Q*2`WxiSqHSGF1[V';|VCՉe/5W')̕{1ZYRE駷qʈ  q[\lH!(r# ~EsMCa"hXI'2NM Q/Bn ,ifZyy + +f}+’}mXv-׋xF\wB0tc*GEs $V^-ipD|p];`4K%o!V(O%.^qt~ 'V Yy._e%BI0GW,Α졐$fifdkS͂&d8ޱ0y-vr/){ܒ HqrA&f^ /èMŽn'[ pȎLwTp4u7^PsVE<;ߟOp`>IV35T^@wm ^^;9Y;*PЗVh3n-{Q:Jůd998a&h,{zGu +Ħ^IT=nB?[shbunTpCv^Lr#=J'FI 6-?("X/ku?զk@pG%ݮ5x|eZBi&y1R39gBy57g@t³I3aGzw$ 35|Q)&G!rB&pm0g*,#0'"PgOXguY5tF?u'4qeT 7=0& l[!IaMh-e"x(H7LÎ=2A܉>nyZBeyC@Hfս\LerKL:Ȅ¾Ǜ~K^FO[c<I\1}M23z |xYXIrJO +S! +cik w!S 6b*wOHʢC_ZNU,a7XC5f>E˥'5TNQ0,GhPWe le$3L!"W )5n+0olr E045tz㘮.>ԛuAg)RweLҿ_r~,#- +&$q_;ڬGQ16NyV•sQCd"-R0ہLjm_{͹yTGSC-W5b#:q9P͵'(vHyP*/R +aB%=?odmr'z+H 8j<($ƹkR^;(A^f.pN80$_h @'9B.f BWc=% A>g6oP*ꕆQsb,q2Z$,xxqf11㱑Qx@2>P Jլku/Sڹ3MVnx\GD@WN"Cʴ}XI;?At.`R~9r ͇݄_iwᙓݿU%c@9bt nm-:J61d+M"~YR-^/0q_\>y0_>5mhk/?[qW $?6/ t ϖڢ-P=HwBU/% o;!-1'vė{א?k(@zcHyWjyMRZ_ysH9璆8ߠzQwg#7ZjlC:#:>0oQI֩kL #*Lᴫ5Kzi5&~q[MUJd ?1@´`5&:XgM:1X(bvq!(YDUH2J9e& _o]G_H(`fn[LĊ`8يV9^fˋB:TƂgxa" a{7a>$ke ޓbQc("* «PHɋ8la&א| ܜطkfq[$,5xT 5X3uK+=[^bHQo:cqDa9*}>,'MW +63)͐id8[N֋-QR{Dz,:4bZJuwFV ^ DX@ajMyB~Uھk(VJRe(uĨc Q(`p 93c-͉T:tk ^*r}'4U8 +#X?T;%{6MS&LF>U*rl +2gR1+`O3]$uUHGC6Lťrf6aLD0-n4-ofFRbecKFhVtjiSqCu 2I7Fu.Ӕ!%"c0%>"x]iB e{#$RkwɑckaSӇ:N' {ZȺms:BPnQ3r/nT>oy-3.:C&gv}{Z>t`ZY's_e}ts;ḧ{ I;C{G*J:1ҷ43Ph+,қnzz]"eoy<^3"E$Ɗ搣>ѧ5eodhF-THˤΕr5o&f_h]iPN pP&t)cr(׶Nj9x 6a9C&*6:"_ec,R8_mӟa_O#+kHlRgyf#&Y?+3lWj6<~xdᦥ|- ԚSW 붿~`%JE>C|ua:YtjV~ C-֬+D&Qee { GxPFQElk%}Ow6SjT0IEVl$la/9(̦#~# +  +6Ϛ´/öx;ԪZyGԙZcJGbyS]RLZ=-Mi\Gv7Zo@sLV76_C² (w@z98lwhkvg풦hp:rV,/^ 4>U z]q$6}?>cbK߻ vc$1 ymOKC"9;(Ɂr|MB&aT_~ua^졟35ᰀ0mO"~ʎV[rUy.ƨ{9m|~؄ΗfGۍSY<:[E{Oz ׇ-pYrdQ: +=_#¦ տTx +S!qz]ԣ_MGݮn0r*G@N|+ st9T$#KDb*[\@ű 0.4ml~ ≺[iϴW)U-j J-VUnY[p`׋G۷@o +ÒX>_ZH?OvoPynsEs=2Qk 04bgu0⭖<++3,郪^1C;*:Ii=;Wpm}Ó*؂rVf zk@⍟EǸB˹c2~KKw>3IEx߄+. *^Gl>ڃ oOFpW #7n,2.$ëR2q12FS$BHACUBCKuF7Zl$.RK~߁Xzݕy#ݙI2e +h?W01d#׍`ӡ =\6[,55ST&L39 X8 w<>AJȗRîpĜ2(5Ѯ26, W+pZsXF/4&@.4ªl-lO;آw8CVE܏=:XŀDTGjmc8Eyar* wF2=m%8'R˼5'Ynm  ->^0Ua*z%Y90€⃅~Nb8[psښ&eЃK8Oj͏Y@m7#r3oFL7n +thٰI#fY:mx +|nr tRD}oqjW|=\:2r +OAÕ:$!/ w $nmR8kf4M?4֩;gtX+նݼ8ZtqSg ]2]iXUbEAD Tpj RHq_x8AXn jf~z5r0y,5$K06X8K M᷄p5%bՑNkEE4k)ev5&bBk3d|*[\4:E!YEұZ6[|)'3*qIJ ,/0 #nkR2aO@='zJpᅹY*t"$H'!a[ +AS&F("Mh7E;JOad89JƦ|&B,*glfQe"( > EX$B6@ iux.ܺ&20l_kz#8:Lm9p':eNu˃s:@@]+]zN: ]}ׄoH|/J!!%ˈŧ'ꗇ':wC|!^Z=r% dXswijMBC2U ȑw&o\_+JzS Q˫{>E,L_@vr+D{\iY尜H%g!6#˝161bsCnRGǡ Eع]NܢlzJ )|d ,טZMnW',Q|% 8m7ď 8 `-wE6[߰+n~G0>^s)-jbUvgPK7hWg%M c#d(]ƺV2C>M ӓi'U̧X| %WqEa$3RVYAU,c6BvmDCEУ(9NT4]3 +K]> !ᓰO΁u1(C"6 zɬcƕKf ܨT*Fkդ[zlxbo{~X+ô4,ZlSwmXj)Y3}гcqG=(Waχr+.AT+=_+]Y\7/ᗸ}30:IB5zMT4skaX 0NJ$§jzByM{&'@`;q =.߾l_'~Fr"6w6=1zyxG#?Y: EH}Y]B)`DUU;j|7sμux:7cXIdY휹!~^ %`&3t7v{a_ðͮ7(f{8+ dE!r MJd)ތ'w/~ hs޳:U쳀)qS+k_;7G$r!:?BӀzQ4%Aq_M]|j-<[Ѭ":$ǃ!Q2`sy_8{D}tŔ5 +[dMޛD,o\,$ȡ J üԩ~Yfs@mb7DlW +t+*Ɲ|E>\klM =m]\?#s+i:i- 2msd&֓(-Lihl"J"BI)0sWl R. U%IjQT4<2نzT;<2c䀬{>R ]uR`LQ 豯W5/Zb(,* B*Be~n?-YzpC(#'?1-qOL}o'pҺMWV&B&?:#:pާE W>?+ԥE(!4SFWIL2dі/oFgd*~l:؊AQ q|q$eOǙHVM}iޞw [/xm緩LU)ki[R8ִ, !'>4mOKh}f^X[T>G dcbEHy/]f< :T9Q5ϨzkQY +%)=1<+P2*S10™ 68&VWzSya|.}qdo8![ӻ<', hhhX͗x6u'"P wvՁs FzKaa "mn!k}$f([9tCP)ɍAٔk )!X:)*mp׿AoN֖-p~-o{*꼡 {'d a +٨~ xL ++ FqYl)*M6S[R`P/,TZ +z6vi M'I6uG>`IuLȠ}&"4$JLJӏ/011cvi"utQu.>Sٕ%$m;6QʀƤN@sq֕L2 +#d\GĨi<ɮ +BҔB3=s =9IbL)K)#mM=NRD|2?!+pm]>Kԡ_Y+3M2qbV!T$5],,SZDn@|p? wu6#ďƜ\{A0xfH^@0Xj? `,!9 o%ȩx2` -\r͏5AǴĪ) w@?WU봷&dAiLIj]a x@9F5BYM>3aG\!h_Ɗz %rzEu& ]j{jYaΠ~}O5x~U +k` khoPIZ}v-ܺ}يuRZf61ǿœU]Ic4N?A8gRTlts7$f*xl4iX`y&ZN8,qTe^<9t?gA|TM8?5YQ}Fg*Z(IqV-is{ȉWybNuH]*_Ԓ Hfd+|49s)1+)q$lu +Vh{ 6i ^kW!Y P^Uד~m!PoiD]Vnzpi}˺'ھMaP7 gu>3+mh9}8e2a(fa"<jDv=VdV8KK9WF).46DpX[RuL7 4ކ1֭ߛb3.bë#U ͑LO'~ nm|BVR>F]x]NpP-)9a9`|M3 lWK,>2Ig6IEpHSƹL6Tsȫ>t("{N1%Cr}@w̝7G`|%gW|"IԪZZ%vQs7ОG"a< ,H'` +fpBV\QQs> ޸pbhr&(9HR|WTwm{!-Ţ6U?R[ p˓}FiKV/Ǐܺ2xV\d.yq6$ޑCC@tQZXۺ&9eX32zp+~7n v݂:W@592RYB9u#~$G9}mh,ےPA[% +g/`w,E-JZ svl5 L|hF +2/7~Ǭeq^Ke_W7m}mQ ɏ0mUz>Pq|^xo LA/[hBeƃpK&ϵ!2Y,쫌fy wVCze)v!f//_<:=7Q֫ bMx+`mLdP*"w7 +d,ӵoS fy.P]T tqL[`Ha5UeXXU dEz-Ј@܏MӜB9M MM7[ǶPn}e HU$2d56@3¡k 8'üHɽ :;B X/G}mK-oɬ<"QP bg/MnGUI$Ӫ]i4 hVȼ#fh^b|G+<<.=ŚΐEcwL@%*_Z)!mZiV_v?%?H9!ۀR*R endstream endobj 2787 0 obj <> endobj 2788 0 obj <> endobj 2789 0 obj <> endobj 2790 0 obj <> endobj 2780 0 obj <>stream +HWko_1+gtIVH,`i]{L^?&1Rz:uMSM"OQZ3M(&H]MD?C(l6 RJ)Zy*$̎)a"I]Ԥ\6AX$#$,^)RR~RJNχn_YE_~Vx0Y4>!gBC?mW kl咂dc^j~zn jb8E#ޠV6HpOZ7ٹuА j{ԼЁ>uZ,PCAVLzm`IؓauZ(OS{}}[ؓayuM-0{?>z5Nk?O_~O_~Y Ld5+fiH/_a]|i43eDŤٶ޷Ƀ!1\}#IC!!ထOf=7R]Lj( 5dCIXB&[ZAxeF掴# 6c?RKbn3 +oenPLͲvf7;GI2A"C*1EtBܘ!;a*h |gOl[I?R7%kZCmL1 endstream endobj 2785 0 obj <>stream +0 D@&L D|#)2Dv)P6iqL4Eۿ_iYhv9߃xoe|CY +캧*Hg\ϮKy=03XºїX4vȎ1>["бTF2M4ާI&duΎ'-8wjN[OLD\nB. {4y,dܬ]E7\f"L`3la|Sό;`#vpy ~̙p;6ʗ))G쏕ۗ_S0*=l0\I/Q!\rŠٟ|Ke NjOoqE %{:aj> M#Q<m(`]*e Ak u p^6YkI]p~"--HEu:4B^D][ʡ}DgOP; eL*!HxĽ!N  ROM l0uj-dF*mWKuA&hls~7~WOXXI$q-8+NVϿhP,5]n)%ZH 5hq:VwɍSwdS[h8+upj HhG+z2Fd n`$AT,@qFS!jy8VykhP[ -Ljd ~;i39[jrD%σoD畝%uRM^elS!~A]Ć:BKMѵd=ov3Sx Ҫ6$uϺl${ISJpw[fHF$]:<ȏuhE@#?- 6薫0SdcAm: Ð;T`}- U|LEc(Vactb/`wDUB[yRfsXgX`T"?jcl4j+ m~^1fmkm&#ӱc9 oO}J!U?&HYIt-V![ICBٹCjP`ZaV9ٴ/A_Of Zaz1 I[ +G_7(/$C`^SD_߃^ˢi^ScL6 +˓C]V)]lG=@Ge|ss'C'*Xmmmj NH`}0>|ҧC,f8_Bز6˫ryfN +0Yd$J{+ M oCIz/) nsڌ·z#f#I0Hʻ12ʗ[`c jr#1̇T;OZF=A{/T(+Y2dM }9v6[0! pcm(ī $I&.fHX% +݄c&$֫+"$1Ih?\St7IK*):~)-b/J'|8QWVaV +*G%"pm7FOaeY{8цc"MWK +2v3Ţv5[̔IcvZϭg rZirEX^ (r|0zi.ܖ>7\ Z}Y𦱨Ps۫[*<_BnU<&VTt:|yjN.3_`=9>އU(ئõPsтmG:?68*.1F?b1-M_k=4&_< _b)f?Nccux:,4 +6sy_<3DSy"\=ֹ 4 9і{QIb,O S\_?/df'C {;9!ʆ繺f0rYuTk,X?($# nٗS˅cGG_S\\aaqOs"M|bS'&My; CېJ+2SF)!+btX˷G!=mB5FI +1} tժ' +<{}RNv|fH4Fq4OZw* `E8C2>P0-z$_-j܅ *% +l|‡t,;yH+t{K -ą "lJߏ +Xb7.gVy6axYΛmkzܖ8D9,R &XW}J(>b,`PTfo ƝLR~ ޸/u^։yzOKg۪f$1vwI 2Q~ y9^}u>BY"ʡ"TL)j,sL Ѽlfim:)3K3 +f\IVԘ"G,>`iZj4@٪QBLOw&'8:K?\Fv 2% `Gp`>"W $_ 8U.+)T7%F_msTos4AVv6cvu\:iFD]4/1!_q 1s46Kݵcby=Oj ,;894nE'UB~Xk d^"{b&-I}Cejڙ*+1 PDs.U MgT:CiSb %lDHpc!!"siI4LyF78ua1,?P7JiBA]8)̶?y3A-ХAԗiq&?TTǛPm]`Ȟ?λ!~we^Jc~HR4kVq %FQV7$ئٷ;D0$͏ [ՠgR܎p 8\P X\N#E7g/˯ғaT?w^FH) "LuB=Iҹr›fFτV{x\*S h%}(| +_&w ̬F~1`g6a(om 7 xxȟN$-Y ZrDdq45we!VW!|Wʪntu$Th4iP;Rvry>ԣD\cM_/;R1Gm(Ģ'tt`aJ,!@6<}-HKL^U<|xX(g3[`NR?tzXs#.+(P%~y#DvSNR<HފW5H e^b"4q1MJi֍NԝFfsf$6]=q8%\HF M}neв: Tcye0=*%EJ{ %,PH(Xe)"!*|s|5PMn=2Ǥ? \F/%u:. ogؒyM~U +dX5xhMl/V+` gi,f G3; gY*sV + ,ˈS9Vf%h f g)0VdI{%=2e\/:c:X́LU7}dԿSg VɚH*t)IC#ֶQOs]~bP +F!qJl4e_lI>Z]Ti,V n[benب>MMtL.Gݱ}N~:hpjxK6n]OWZ$?X;XKT=zwJ:2rNzsnȻH^5# \#"jjM%]H&5|a}}HҡCO#]!8@rO> E)} dU-C3+7khЌw/:9預c }(QCvpT= +XoKz;:vRg k#-P"٠q%$%js8ڌ͏ `OZ_A,DXّy*DEזHp%]ĹB?##l0/yF H w8N 08HlMBMG6'?QYd&۝sP}! wy:8Aq\۬Ѿ$:gH%OF0[zIӥz9u&L9yVJ}K_ە :҂gV{n݅K\W~PS +-X S(5R n?M%7vq7څUS?R>8mWY&=J!l->#ϲKQ-9OЃ8HzmH% ^oitp[D*#4tb,5<][F{:qLXJBceް#Ø!w,_Ȗo !-(2JE^ ' #?fBţ;c03A^ 67^~'`ldSbhU-z~ޯ1?nd{)` "Iрl\l):ͬ# W,eڽϚ#Q2Ӫ|0 !GZ վq35T*62` (Q(4p|_p\O揦?<`Gbudk557"Ҍv}̀/ZjNRᴄh$;p~őë?#9Й*3=(0'SA6Z|U3aoqE9RUn!<~|i= ="~rD_/F"1Ms6wBm޷)D6%̈7Bg[>\!-E#2bgĎ|׺h]{ $Za-ptD ɬw`^+Œ@;s!ʜgI,43:7|BOwn.&a_5k1_<1ۭƇ!ƾ(8<0L?k[wIj#lܖCx5iCA­yUPnww9X\0YE}(}A6H to?N97X{O/_Pι}]ERX&]{ Ê"b9$2pYpӉdJF",zhiA$lН/\?aIAjj4wp;ŹS 0P-.b!:{t7WTI #:*]Qٗ&, ̹ fAZt~Y] ],,gNԭ(lv"lGwUIPX]tyIzy2sw"lAc`5QY{*{"/9^ćSK{0jf +A4l ijoʝ/zˆbJƽѹyN¿-ЯIFĬ)0mp|e-@#&h3w4P6F\+4A褟9sʫץ1\mbɸqk +dH_:eG6hUʣ"U94WOFV$TPrv헔(8&Yt +k8c,ܬ}&nCUph.k"m*[a'53TN[7~u׌FW0mrUYUll層VsׂV gvfIBeIhuLS+QDوo񎀰JV:x3y +iv|(֐vY u2$x&ehEpD8W{Bݣu @> +/wNJ]%W}}>LRSm1U}=?%%QXSa,YNaChW)qDJGm3,N[\T3![}F?{ F\wMb"T?צj|+B͇ ~#$ 0#I>po`}O<ÅmϨRK|/|L^g6qy"ei[;% ,~o9'Žg9iJRZi Gb- +W ,[Og]j\dAPy?uV/@|CmO/zن6B'uʒ!v))`(u18 +ѪQUmjK/yr(m{+ $h e6E֜4/6lG(3Vϒ&yP`r15|! chh:r l7)$R^ +p^Qj H:pN `Gj8CKKfB8x.r:}Vcϋ9|A>?Tw:D e }-J.6LxzXSwJ[<l**b۾PuQ lJרRGsjր؝H $8/da]U.qG]_ &lͫ@Jix'OXN`7U}~ס*'4w]dkK`iqQrܿS"]ώ"d0'˜jp뺢1ث~IAS}st`18 svR58~v[ Km𸴍hH}Jhlu+EZ.:֦{_yZ`f҅F_GŸ`\[efMYHZH'sZh5^P4cZ26w˜.Q;Y҉ri@n>XK5Iwȕ+7) s1,ΕX#w|R(` rNnBp~~-_`wbXa9M4,ZDx[v0[)\ ))<`xSѳ+YEXqn(XFU#隝2ǙQ'A9A8Йali,ؙ6DI4t-Y pRj ,=_Ǐ?x1p;5 Ex3ad'r^hdR-r/ai>5>1 Ϳ` dųgzT}fǪ~rA6̴ +A&lE S +l%YUxKVږ8ОĀFA%C j+~G{M[^IWZW[]j\&]hv\`%#^ߝq9đԳ-tȄ>\?*۱G5̯|l0)k;<3xLZ5䂺f4Zχ.O:UB9tVRN$8Q`RhJxBxp4˝n +'.I@=/'@=Ѷo#gCWKnEr=<S^l {vlM%g:-.:(<<٬ /Л‹me`6Nxb2:4wuY&Is@VJTqX~F +1zz]p +dH-I}ol +ŏـe}śV}m>aB$3eyhu=Zobm9I15}w29pI$z*b" +L Io.a@hzgUs1ۅD$I*:`W!'LC7u~(`# J$!YV!ӄgQCǼtEV~)2xJ;ޕ$ҋ0ˊ^+Ja!lzg2P\6H,PɿIl9l<^ ВBHqoa CQp}'ǒ*Pk;m7-@' r7! GhYрqܛ.+{FsVݼ^6iΰEZ_)lt_9R]PPUAG4W$"K΍R6,p:bl.mV{m.(Fu)`IFcVAd@ʞGٷ( UW"B#-?BNW覹/B+3+iǥo t ?\bY @U'8͵~Ul$ԛA-(,uq')2tadphQ=*еj3a-<5d d'igs[^q5=~4 +MNtƔ؃gYMhZa_3?%.P~.Gu.)9+]!98"3ZrM5qCT~j;<]gq>Q , Wj=d>'c +>߻|~JnK nqA͏nk+^M&58w?**[dJIC&/fMr{n60 'G>o4]VSx-JXMݧa7qY#J{cMXHT*szAN[d鍇ktlT,̓jQn쒧A J h{dW{r, +,` U)ï2\~fnS.@20 ee/*bEʰ`Qh,rT֚[s.[Kcȅ4"@wN+gy}syN$h7)L;Ìx|NADgg ޠ D8 #m": +B;>ٱڬSq'`/9R$vɼ~ma6!taY{rRr k;sAF(a("P0Dxw?/d9j㞟wO88H X*i5e׷( +((T56 \>u͝/*^?$@N(VK "&awUC㵻q/,fҖv}kA]>̖`IejkQScݓI,U`8Ĺ4h0.cd> +.}ci֝|Sib)_?v]FeYv&qKp΢!ƒm +3lqZT΢R(ugDc/FfD?!-vO9~Wc4֐Aˇ\ڈRPy1Jj+5jQ+֠}ǯPL5I_NbwWن&,'OKmױށԐ_P +gtFUoK:I%:-OP6;|qZV$,zMh޼΄rz 2KCSV[h&<=zyP4k2GlE@#쀧٫.:uyh6 !$5%?T OKR*h8>HTև j!T{F*G0yt9p S~)B5|ըeS'Kg+^rg,5a0tC[as!"rqeH8cyٜr&.8hCbIc*&6ar<]W(A.*Ls2cuW*Ϸ稈 µ~nnL% 8.P3FEVIس`t/ ݍD+aMH^F-ZWMmt ŲCe"%Úg"~)BSW#p wۊ/+fL @?#6 :ظLM;hQ-~@P;Uo|  ">3߃'7BX^+,C2:d} 5턈@OYazc6TkSR?s< ZH -= |N4 K`hQ_8~> *Ʉ01+*kKL!aD$P;.6wIR*C@ AY>Ttf'^ztoTevlC8ǖya.RI 5HB:9UU) je%ZizY9]Q4"pĜsUtm`ϷpR-zOFCgzlDq~hC6aAp,e?5I@w۷GH}Ө+=ޞ Y*|. 'fX: ҂'/Ttzy-Uk=a\Fri.^L_BWvWSUzF_3YeKQC~1 +O}=͉!DO^zؤ7, ߣ _i; E뫆!=8`,tPO%Ix U\hymr3!>_ +)@<Kvb18zt~i")[PٲȤ k K|%`gj2 ܑї[KCa;e^98z\ h<` #t75<) +>:H`}'INSb sUO ˾K[f…,a/kk9BQeW 3ti7yN]?ptt ?Ǵ[ $3ɰ?%YHsٞt9T +t]97K-L.υ +j6lc[=ȎyGic*e W3ey5MA̫ihtW*fk ,tG[YO!q4 +w;RQ\eD'[po(].Mdےµ6a *pkJj19`SqC?,a9^Fv0ksTH#Hv~}> (h&"e({C.8([D|ﱦbq0QܥPJt.?E,rC(eDyP\kx. Yԫ5j7z񂢰bN [r]ysjSEKc`X\2,tyKʙAF('/yP*20!a@3]35x"haϋ3w6Ўa7i9rU5_\/XwP<'T'Sm* Doi"TŔ4?]<=;eŀCHt;@ +9n0=y4ezS٨ |aVsen,`Di+AǰͤXY&8ůrXC?Ё*)'`f\YX5G#܁q1b~XTE8&?g~>'BN\r(h5?4.83@ΰ$T[Giв撵cqx Hk?rLHxc62bZ$(B'X5] f@<۷$hsN)2#Ա\v퉂\!{Pܮ͌U Fm{],,M{DWG2Lp@+ե +ѷ~F@)Ko#h^]ܘZm4W i]v]w5Yuod֖ +r/$C=n2uܛ&جc!ShTd-XM4a <~ܡ|ntJR۝^;yLL<=~x&D]Yj$aPed}C& ƒk|fIvͤˆHȂET)%X nffp~/cE̎lLHK/0 +FIZ3g<'Ɲy$Q9b^آeƸp%6#ص%Pv̈́Kڞ #ê$]? +*ZBN'gdeÖ<|8|~]ޫe80=Wd| HK:0gWORSfۖ<:3Myz8GC\1u3g@X:U x/\jA*YorS"J1WC2i`|Ct*pjF&2hHqE(z”{pd;:Wlka$'1AIc;b"5n>_sX}a%0;ӰQ~oUGfi!QD{;hDZu!a  B3*KUO[WNp@Pa8'>2@1=T;b@V3OjVƋYTD;n..J3*5fsҏskC|kd9;ODQnS0L&ڥ10Ve ,=]Nqz +oj]E˶|a leCj|sIK)O|~0b7Fmճԡ](pCj}YfZ&2ț^1`ca v/uԏ<r0˘R>w>6믘`#2vuP ;c߼8Vma8gk)Y}Y;cA+$u*Z[wۡ\J"2n?wKYmwW\zSSdrj+v[.2kzWS$ IGn@CSΔҺ 8‹s^1h^ +c" (a續Ӌ|-*XGL&D/ +_r4:ſ1 S-ŖW\_;SvN_/)ئ LGTϸ |N׀ˑ> endobj 2782 0 obj <> endobj 2783 0 obj <> endobj 2784 0 obj <> endobj 2774 0 obj <>stream +HT1O0w7$DZB)fFQH @{l'Ere)'%PϠl3-[Y|`k&"[!::5:۰šw[W6Rl)[}3DA1bB DN%qQ>stream +0 H@&J H|3bś󛋜4{Vv5zJP1K- xd#$oph Bv%Oat^2ˇs;T/wt:"Τ!jZ/D8t:6N&HRQ]{8](Y` M7?KaoG[Z&%r4;{J)WKJ Zˤ[f3GW3))`"{N^؝Qw +\͛86QOoBC1:]f6(]?4,EoUa3ig/(kyw ceQC~"U^r9߭1^ܐw 2_%ַ[8gi[BXykB7Tۑ,Vl JFr[}ǂKɘc/~A*\Y +V[n yH_S9َ;Ψ'޲U]f %3At"G]Mףe\QU% $ xu2x+{/Z%o8da?u\ucPx(Sw6ZUimSt$w(߆(t(ךea"O,,ϦUF.aEZ"8d]ٸR7~b!W0"vIkԵb!Cfw}$CQ6b@$ +Zp h1$k5!^\5=96^3%o& ›Li! ?Or\W |Ca%/G%]hlJ㷴8I1xJ͌8{!h ߤc뙻8=vKj +(oH| _4/HhӍm-@G>< LӠ DF}30]5u+O2}('D¡Hy=",ԯNɹK*:?ص=U 7|P+- T &q4O G#W%۫A- 5Adf0MqUKP/' L 8@O +Db)  +G{ *WGfN:?@~ endstream endobj 2775 0 obj <> endobj 2776 0 obj <> endobj 2777 0 obj <> endobj 2778 0 obj <> endobj 2768 0 obj <>stream +HW]o}ׯطvrN՚jkj% ,,=]ʒPHpsΜ3nuM !?ҚBT٫֤es٫h5=#5aFWyūٮ25'WU~xX˛M׬2B]SSw]7?vW?}嫡C. 15:Yozj_!Gdb9ty`F +sQRJJRYض>eBFVZЫvzzS+5Py߯fD 2HV >çbY6Z jم@^ 7Rnji},ݲ(mgs)Qq𛄞pOP rXP~J48H]RI uʖ \ [H˦\13?m&%e8<Ȁ7Z.Dsp>^ʪasIIN2qwP=J28MB(?_7]!MS N]{v;hH,Eyit^Q2%rȌ=6g`UbL%Nc{{?wAR^YJjK:çñPPA&]JpmNFs'4~ۢ1 &O7[;c\8<H/ UجVSCF LڤBՊ,jF |Iї5_ݬV{PGɘ'<x5ޞD=| +p( Ɖ2 YğM`H.M~Yo !w ”b }t=^yn^:BQfY5Vq ˒ضgۺhL9P|С>FEr|ptP)`iR!XX7XG^y_:-+wbs[G!2FOl9a?;\̉;wU5 JIH5e3ЙZ +SfB$#աSI3-F@K;OЬbx8?/,immj$|,t >"G +w- kci1MϦ"mNwʩ'q||`iZĘ%ǝ*?(kIJk[6_V`: emk:ha&@Ypz;RHvY.4 ) xZʮf7]_Z:j*Np]⏹y)Wٴ 3)r f0ehwe5 gr|.6?_h347.cOLa]AӼ&&%j=NQoQ`F.qcm;^@CߞDi}a8#A_)H<HX$(x&9M|T|j'9~%yXz ҎH:Gg}%eQRYq9H,D* *GؿǯfO LHnptW[q@1hguDdsb j>B$ȹv*3.TL{I+paa+]s2Pc)oH͝W?J; endstream endobj 2773 0 obj <>stream +0 D@&Q D,,ST8;f2y"$-t#!"e,?{2UCfOɨ؏=SmGnfQ) +?xs4[9i0lm"ibGVe#N`Ä;<@grU8eߗm]hXMS|t{z!~!OHtvo#LZ-|[v ԓAҥ^|f5 ]<r<^ڙssfFXP`MU?#+3#sw{ͫ37#-\"w>S2{㹊F+ӿeb%)/Q[r4LlCg/;kydiʡyWI0Jg1Pqgq`9\So6$F5>>v.)n#1m.A tI0_F1:[r +r/~:1n4nLSw8+Xn-bw0^㖤C2HYjSoRF @N;}Qǧ X.$)o_ s(mDFiE h +3joB=5&䎫1‰ kD%¶ u(EzQzEDy&rZӵSug:moI}oBmjLLWrk VlxȚUjf.5*f(RpHxWTLJ\x;wYB-Qe_D}ڊ盛D4RaBZdwѵwxrFukh{aУM ZatU|.Y8kXGs!(Oh9qѡ@T7.@Lmb]8`Ck?(,M0yo;E)F{\vC? #ok`^ۚIъ:$Qx35>%+cTegu(pdp)Ƥ# ^fW' }h:8/-A\g$47{}ZD~GzQRPYq 2_3ĩE(7Ĝޅ,V~mw;,d}!Iˡ:yD5: v322>.2o S^#%R;_/yɜMeA=/mYPQ5Rn'u4ȝbt? uB5DojKPVE Ag/+tn⼚Qͬ;Eq>UqmvE.~@M :w=BEXH 1b9?'zo;k (*`C?T}Pd48 뿺i?lSɮֈjAOrG.Ha7`E]Z'QsOE*.RhQ'Xn!ew<Z&Gd ?Wݤ\]LΉjf𧃾_m%QSŵ}"ר1@qX4 +@*;߂% [NZ[zֳ%ߟА&5VJ~3i +fQn|i/| p:n R[H'138#wh3zި,T|Z*Ŏ8cM`5_*muvZbTiÍ%( hnK$ )Nr/r-H%I08~;ԴN,hFac'_? #فH ,:.A1LGuIHuN̄E$DN U8Qn2h˲+ ʣ!?#=B8UKBe۬'3 OBzB>UbJlnmXo_;Viu^L34*O&4`1Y:<no}/pO#Ƌ]&oK(; z|0bQ n!#%U[wS˄x 'y5 J|/3{ "[dzv*:Xu&hxzwv۱2`>M., h 5G1^&-"`Vv+Y&:LFH*@'}kׁ2N\u 9 +RE;N$2ފ0Za1]~M,p,+ųO&eo$Ju}B#A `nôػ$ +Ģ!c竓' B_7{-ng~̸R  o;%9v}\S5b; .n-mQM#a&"3"B~\ Yhv~a2uK|-xǎ]~>72'(žA\ijҥ\J(b1!ɵGXӻ x,!`שCb'*qbCXEp \4ܓ9!.`bPzE(nꉫ7@xݙ60K h!HXlI4KO:j5ygA!qF(i2R)Pңmer^5mwoB"m׍+_A7Sxfk{1G5}oS+jE@SD+\&-/#,c#߃_e>Ԅd:c|GmZ"wzA*)p xպ,,0 DY fZMy\w*kcU5; <"4uvNFw_6#VO^`y'S-_1K1.Ŝoӫ}ퟬ:HJPRl$7sw< +[1̘! +w>4s0E4qe U_7{}(~uNNE}cr1kf. +~Nvs#d,zّ߆p7uIUkHީV ܚA->vĚf2u4FmzZZ|v{Bևt._ +jAL]r譶sۚ5#C_u 3g&\d4WXJXO ~!n;m "?[* lwJ0WU(oS2Z8_~[* 9mg8WxD0j co7>Ow=tlii,xB3 -1(_ң'_o0hcR{Ͽ*Cɴ|\P Ož&4]g}RE椬G(ߟ$n1Bƺ9;52$8\$3#_!UXlujqhF R㕳mȭQ}Ȧ1t%=ɰ>=溿-::5$cj=댶;G=9{?+ }kL+>c t*SJ;/JX\8ۙ=ܨ@e \)L(j}oEH ͍,q4)޳^wK#CY{MG*^J>b tJֈ%5nh/K&Y{6F^aO=-YX]_fm4"Q݇{b;Y0k,s?AюZ} =G" `EmQN׌r~ۖ;(/Ffr&е8 eB빡Lw%Ss: +͜E"(1{:mi0mJ8V4ޚ%&ZrT0#a!ŹI3b)-4,GVHD%Gx9'@1ԑ/ySUܟH(d!ӈZOiYSdK(06*V{!^5ab +dE2bß&xI*2.$ZqS 4$+ J^oJG Y#x8-MV|(! +z0Z5_.88V|s"oHkO#%T^xmmtow +v1 %d?x'?73ń°z*Nɬ{jdžmB؟ݡ:&>t13Ô:'& uqgȀ3YLFlGɲ] g&o]TY*\g 1dXRw|H AͺTSlPPsO- /Kifbz Q%J\}zoqJ-U9y@אJy +p +[cUj;( + ]YJ|PfPl4MͱZd-t@Jd`\PLzമJdgGP>Sr]k|L@ ȣ@·}ŝ*k_v` w9))- x9u/p8x@,!_.TCAӎljcSee՚2xn4xk+Kd̸NZCv%UDےYo5)}'JNgeIs ͝ox35b~Iw9?1_Dw3|^g +qNT<󝠀FT +Lib_/qTIZ9țP1;,&gW5HOH)ӤhQWW])D>O +`k"_ )(YJL;vSݿ< 2c q9?s +Ɖ2˲r4 +J =ɵΎ H`!F}ݢ +\*SVu<,b{pGjF2}:å:O!К+Xv)~hԈ)MVp?Noqkj>s&S(j|yiB2iE Z5PLjQod=}M)wZ,DŽY=TmysE ^G>7ۺcϧhSј  +>v-kJ2Xs'20kR/f k_&#^;àլs2,Putt0s4C+x],U4ǽ +ٟ?+AļYT;p: +=qHߎU_[3OԦ: nW6a&]20_g6=A@zoY`x1_oUq@UT ĿO>_6q˔4'6P8!6Ai92MMYz aOvYZ/,:f!ṳS)^W1D=-@9rfl̟m.q$A.1*%=K5$!l"ʑi)q_kOݴgaDEAܥ`gͲlVu?Pt2Iw>:`̙s+|VgbiUSH7CzKoeIA#^zߊi7R+hͩ'TH%$Yt*B| %1Xل&2KVbn: x$dKB|N[5.8ͦ{ZE7_Ļevnz[Ix 8 V+#}VLVsQ=m〥q{7x]߱ײ&(ICsʥ>P7ji%BLFPwh?ԇ3(ߩ~z J>Zn;pqB7t$gNn uL}vu.kjjȶ]yM3 3{ċEŷqoNΙ:{K/i#oيqmT{Kvзm7 5تo_4JŶ{o VN+9$p{DWśAG&e|Vh,8,i ަ88U"-L-ԖL +)/KOL:%U~5UoZkU0m /4n)01ꀍ%_hF ZߴWfbȘ0لO]}ֵL 8X=crK7rW,h{Q< l=Ȑ˙|QN͉w [lv5պBwlm ` <(v(m*~XlSh앓CFN@Α|Zmlon= @I`ɹ4*e +=/I Ž۪{Ӻ( #H#y,# U@aUi3#3ExX=> j2RJy)SVb*AL0L44 {D6\ I~f1SupWCp*-I +ŰWfC- C~1DZRSW>mv٫ouX%j*;/%J\9d ]Wda2})Lj&O̅)T$p.=Bj4^; Ql[c86TSQ4~G/|qj{jMXU%bL'kԙu2[4u#rLd'C~{@Q8*~yXJwkՍ{I!ga 6P?ރޏxnWotUaZ$J/4oӢϻ~`MVClBJxE 3ƚi'X2j/`efeR#) }zup! a_ޢ +l̍afũحưW{+O.ERBl^ +A3%%K6+՘.^'%o:g AqYJ9 ^҄M.B6kiHT{U=][pG 9υt.N%q1hSs8:E*roAvMh _Gl}"M8D;'cg +#M@~VKkݜQ7 ,n!;^>H`GzY%G"B:ÍDu 98*13/)3lM-7^ֳ )d-h:8`6OJ-R#_.|Fn8߭pS8\=E]V!Bf*T0XU{i;>dP6S*yM۞/0,~{*^W2 (K[뀘OjΆ,K1[55tϋ9g.bM"N{)K^敏šos eS! K٪"m`' k +YƦ>XFJ{-昗ơ:)1>2 {D@:өBFoj5_kפ]e[[ z+$Ug0d-\}F3hjePAgD߹7`Myy}NsFLx:]K9&3F ȼ:6gҼ`Y{IK"ަ"N9f]n޽g2KUL{v̂FH{|@ ڃeT=u6ddѴlGe/AF"#s Y%Ce[ad3;H$2;|_B?[[n4fAya&OǣNE roT#R)cZAV&wP:37ͅ#͏ȿ.(?9v4YjR|_xWDr_&G3h = /|PKYLM7&?OmJ{ٸ̙& 㫊_&\;߶E7!i ~w|ˆPUQ\49 Z߆t/ta%̢s%W7:+sо*dO(ݸ8q|JYy(/ɽ +8 y{٘D4V؁D E[^_ܗI8A K|Kڀ[ڮϡ懨Č sۖp_Ȼꆮ;FtnVbbHٷ;./m <-Ğc4J Y crEEc)[\(椭~L(pDь0˴]<,O1g"UgHl`?3խ ۴]_ۀAol);[-/Zqf2ۏjvWҍD$G죞a)Ϲ$!1c,PӔo7FN;t]"Je{fŨ>u (=8N5&1t780| qĕ}CCaWt9# bUxTb#79#%UBᚿBAl&8?M4<az-"\Nk {:0ҟ6O B:(jb1.uv*`KINoT0?!5N@GZ}>kG9 gƗDG7[J1 ZLdws<:ƑHaxWSI>7q2|`bL`Yw746&)ḏ}vwl4^OXo ,=魀`]¯d !ц4|UqvH-quYƩzgmBa{Լ@jTKG#a+Q~ +hˊt|/\7]`cj|ZlV6!WHJ^CV@LCQɯ#ջb^ Z +}R,MҊH("qF +%CVF'#8Jn7 ͱYhWĨ FE)#tqucd@,ɦ髴Xr҉79 "vq=gxj#jcNd&$ME56Q3j#Ov0{YYqk8"{ja_[ZWej^t&LkhX\GΡNQwg DRBFJe2փ %i_k03{!Ǧtkɑ~-(Q>snb->I@Yya sKC,4-R@n%0|)َ*xY*G۟Dddj':A̛M,<(S/v6]tT1Λ+<;%Qve1{(ˊ"L<^=1 ہ䏑9΋fwKC+tݐ?9;; qz3mu>TM>4ׂD<\>{x.2$Ju l*uAαCB!O̖3R$HpA yXogChP`n@x 19}|\@owĹrezAZy\hvmZ1vM'?1WqDVuĖ+`o~rûk]lӞD)xDyE0*LkLҥvp\JƞpsS@';޼#΀_J)}!?. 5_\7|3^c%& OԑnspP2 x/;9TSkޏFwfg +ͽf `su(V.+N[{9H0Ҍ,|RvlߘbgA0*I1spI.<Яf94F XckQu+D_j}YkU 1ERWߊpqj>'d +DŽ ΑڌƄ/x7=Ec&͢]:<8#f')>ʇn@4SGOZy[G1Bc1 G45e=ayX y͕e y|΁b^^rG9س[#ltFDVq\BTFkh;?uRU*];z'sп¶YCΠVktۓ@!yLa6si+ٖ<@'.a㔬k'n۫[MgS1`ܷDv /y jܨvJXxa +4j1 +O"QNwY~:܁6]f^>ڃzoE=_:H;LnCϽ]rn&D ɄGB;\*AKLNYDO!"FiA[տ:U|++Hڕm*<}EO;#wOc5YBW.}4g? FV{\v*\\7c)1LMF7ATrLit(Nys`8>A(+X#cQO Ш,NP܃ƃ_ٺQ+uru݆Q9𠡬4L͟=!U#gi$QoCPe ++xv g 1}x +rcoy;S˺~IJr]Vkuv,Ie6bƣNJg?wpX$2Dkk2bzhym7 paKy觼SKR]ݯ`6R|!ߗa.^fc$AW#2Mbf +3e~<Ùp0-ߑyfŻ0 +wFTTlS3MB7ˉY&ծCJ!Ь(L^^ !O%6 'g,bh,mhcl+`D)yuL +Ws?KKk)$ &v<[^fԊ jcug)"z;JB蛧H]0At|FR/9TB۪E7'I1Kg42g1\L/aJ[Urj|VH6J)B:Sh/ ѬxK^4Bwfk`OuGqw%+I /ӷ#?kncCC +KU%M(βf4c͢ZP%4ۙN#s'+#?=؝ ѿt4{_y.$z +m7IjvK>V>1.m~f2 pݭIq7%vM^7BVPP +VnO8cr$ ?-wrHޖ$-}.y㍜N4=< .,|/ g +9caL̓:ŏu&ڣpqq&E`Aنz>ڬ0v;ۙc <fo(aͿ=3}F3"o,t15 `;l15`{ZU3Q6{-a4`ƿ9Yv wU3{q1H8\Vl\wkyى܌`q$tO K;Q[;.\}iD4Im{u{=}f[ִg^'Wt(vdu#gzH>̮Qj5FsEHkDkA7CxfBBl +P3HH؇`NSxy*ˁ_%Vͽڦ f%Үk+1Ig K!k]YP@ `J劏?3L;+.w)pƣic]΄@9Ov{SLhڒ(ER4yv*ouhgm>< )6m6R - +a5 2> D $ZȁA>ABӟ;$/&Ap2.N[xdCaI?E~-gלST]=o<\v2JIBVQTqtp d eq י&L͢:m眃.N0PdEhO J5e9" aX5bАLX%8~^'!Ɖ RŋMP'& 8> +lT@rpWAɘOwh1mhOed167ի:aj[ptl,5䶐WFb)>-7n+~ uAGU}*䈇rH ko;=r4ZN$.vGZ"ZsbFunMƩg[Q +ٮZ!>4Cͩ_ꝋK͓DͶ!XswSѐ)کA||II8VS[Km )c2:IpF Ө-Cu/ cf&9~jpTUhZ^;A#mk(CIU7Ճ&`:}ktܣmjGĪ2]vN3}Ed殺d/ԝthOm綇V˼.n6|K*k{vs;cVmWZEOö~mӞQZA]٘1A,bQ&)0Ff) +Ľglasp7k-:#zCNAq +y.e/E0!C,} 5SWa唰}fXʛwZ}=w\bw#JԍGtAy +|.: /?&S*QBmDu!Ͳtʦ +ndF%8.V \yEA;;qXnsi'A+{ԋtź&Eg+.r!KQTlC=ۤ4%.x˲tt,7[uCpvYovQyrɅ<^~ch-Aaɵ}D)% RRnz-+ewrd$|[de (L~W)*4BΊYBMU `&.ZXn^RN!95UܓT&g#7vre+~'(`U]؞5~i7 YCnz:^vk##zI+9ઈ JVRs Kk#KYǞ:v{kA^A.XXDYg4y BO6"X<0?pr9Qk.)+e/CCTqF^ 8pJbcƷo.4Pv*NVuRAߞ&l!1Ap UDxB +2*d‡5;a?U1X5.NqTCiH- PU:%J\Ku1z950:^:L w5뿨:d4Zd*zR grʭ-=ӿE\ ^_$F4z֝L%SqT_knpX]T_GQU47:Fy ѫ-E6"æCP +yŜeU;|aM[}{9&[g|i~ܦީ6/h% Wm׷D6_vzetuU( +V%>b':WvNjr<Ua=r[_Drw(n0M=gd1)PR {8Vβv`~Ǹp7Qm~OQnoctp-NmW_7ňShR  _˖4;6$wDhcO8Cv>v-b]dm*;bjڽ7vD$56g][%%mū,5d&3o?+7-!L`Y7+p'Ҋ @k^5KEl:Ker#8E?s^ 𘚩",'獒|`IJwf,oЄHiŬzKߐqԴq''4rzK>Y:RR)U[ N]$O^γl TA9NvƵ"yc=嫠z, +yVMPlG[!=D(7,v1Uuz&Qhxβk hDk;pyS\Ш{74fԵ3wkl ,@TtBE +/IL)j,89A[EU&`K΅z1;T&~s|cE|FY=lԇzh@ }r⏋MG;_^^DvvosH܇8&hU:EFJTٚɁ^+HVK`f0۽¬1;z,R&f!#2HǑ.Ji&}+rИ&ҭ΢E!_D%$7C -ͧ;w:qv"~A+sڻOt&D*s=3tKv.Uh3Hg^K,;Ulu-RD;(ol=tU:(w{Aaa>/#ߗFPgF)x3~ f?cڄ*BhڼUXcWfC}{Sc/t'W 3H9Hm:Zf1բA&VsD}֚4 ǐNz_lR? HA\+أE}18sVwvC"R gmcpZ }xd'zzJSt)Ck!#Է0\- [!n}m\j0IWGkAWAPb#sGkox~RΏ2QֺE| +ܵ>dyfZSȠ.9`Ĝ2Wwm'{֯$;yOCК%ω~"HPʑ\|;3L$Z`ا+OakEOzMU\2r3id0Sӊ+8$i8m*eQh ;[E(j)0-b7"/` e%i7 X$`<NJMm/n WdN ID_ePB k_I, +Y~ }¨DCPʿ9'&LӦCT/qWڃe0N5p]QFB X0j4_,u3;^pU ;-2pc[ny1Soиt2Rd.LD,͟p.LԲsS*@so>>?eCҷ.n'Z'` l * +c$m:HE٨r~vL\,W[_2BcMŏ*?!? Znl7k)an~Xy>j0 ON`ۨff?fKE$mDqa\.eI״!st:V=w3r`t광qcoct8ˉs1P9Virn2+Pp7/΋w nO#q->@OQ"$ӚvN,2saR=t? .l:'rY>0hNʁ#y4K/ٿzuqڜqtyqInǞ"w:Z0X;ڮ |dCkʾvG$͋)%#զ6Hc|,<;fƻ r(ul("^c\~л?&WQ}@[1G_0c󶻟q_tMn=/? endstream endobj 2769 0 obj <> endobj 2770 0 obj <> endobj 2771 0 obj <> endobj 2772 0 obj <> endobj 2762 0 obj <>stream +HWَ} zLKGo JؾM7etbKI*#enqs86i5XVT/R~7p/9udEegA^5}tmLEE.rd+s&~lL)]=վ -xFGZAm/g-VYkSnutwucĞp 魮%E $ +!z Bwvev;s߶]">1o٘xV3מc۽ۗ`4)zP9wHVTO;T-3fC(JiJS5@ I omorؽ$ehNzmtwGc,œ!-e隡Дpޤ 1áGPǶ`n^g;n0oMj9/XzHm3aRD%aX%^á*#r uHMISh2V1[^hQJ| SU*cKkޣ) ۚCw%PFLMRJ2$԰PRg rjgf&c@hRX.`,>kB%(EÅ- +^h";3M:CjzfV1SKlА?x`TTMͤWq^YL-I]S]nj@ +x3ju5L>yc`?3^f"!s"nf1ؘ̈́^6Jh4'`xfWfzBvCYFN03y0D +w2=I~pl,k +brR"S|zxAܙooff9G:F{=R zBn)&˾3qX'<aѳoKCNݐc[` +_bס._lHA\z*Q8f{=py}p9 +e5ZO_  9C?ѹTX8ilE)j=Ys"Y=91+STqЖ322HqWQA@%`Ex`s߯77CӬ'j߯_5wM}w3v-LQȡTQ oظ?@l7= bRI?70WY?>nL^  +;sCfy]Um42DnN91fᙦӚ(L |rO"gmpaI1g^YG8 Hot죯4Z,恵 $B_CW1 0E+Y$2)/VδN#Q +&|%B.01D:kaAUgUDBX7`^["{.N@5yD#HZU\X0)pekb:. +`EO^</ 4J֖vW^%9 CR5q| 5 ">0@D-,\NAh rޘi P'aTB{邓†34 ̴:@ 50T6e,)K: T^!b_cH"(^8i˂x_/0L9PE4Ydv_T⌺aru54wm= +~XVynϭ` +W0*kRG'LǝC47 Z,UymNJ09&b2f)TCXsl+.ļ0qukיP5-izP5,Î)yYeyi rs$6`q1qՂҳ;-b1 Sf/ٛض`'Xnɜo/\"7.h_uo%rl鶹27|Jf]`g֪ endstream endobj 2767 0 obj <>stream +0 H@&KF HAOz ' w,%]"~EN0K_-zch{1cmMI'҉̒v%1D&Z| Z0Q*rOd0 WQIFQFjpF ʔ^SvQj$T5c@f%;n⬤ϩդ* (PRK$iѯª1 "!s`@AIL3\Bzv,DTh Ic_^DѳqfPNjȯeli^Hȶl6Mh)_ej8>] Q ytHoV~sÄR`}$ swIkޅK}ң{&Ami ă68DC2N؅-%tJ-T#!Tƀ%THǽĢzasŦH &+˖Ƀ9f,؃ZY&s lx`W~ocȂ1XSGrU#gMWHZ]6YW'1ZEg5\.iA;9Lh7>=֩񣒑Il>!nDjӅ Kg^v@ia!k. ʗxJ/Um1d-;IWn: &z|ּvs=YBm#\Wq7냷T+\y1auЉ怹_v"I:F:tP4sT;g=f(.@?F 2ků]|y +)6z*\C&y:㼴bB$5 + SoT-=˔-Df(}@0lu!sBÑ<$r4>H=U>vgV<וE,WcZ7M4͟pri}P7)}F.1[$V#5jõ­3J|o8u*ٰ9q˩SPG[y|^磗AУ7<DK藱29X@@D D7A!;ͨIaVğ'yDFA}Ŵ^FQtГ**ܰ3-DJOrVH F2p\iu/m3Vԇ_Q`Y䅵W.2\VE`4~B̾QK4Va'1z?udܪ~qIV|G:.GXrLil]vZUo;i?񞷷>#W}Ja5N +@)9a6zfoݫc*U00[%8Ÿ.v'p!C#%r=_CVC$1ށ y$lk!,#bD HYX@׸^{u ܭ&niHXS18u#ͫ 3{* +fcE8h Kt^^8k;78ICQ*mS2,'U%|Е? >|ņpi~6Jօ #ƌ<^_<[}i{Q]R;AAWiKC)gLOg'LF vU`6ކik&sGY1(jnZwDsY>'D(8Ro#q6mˮ0]\Wu7Au qgJUQY-%6{+a0%[3etxdk}|3CR3pR%Cd7J# @u0y7d5*QZBZk+ cXGB`P^cgh4 Df<~#uA+ 6/@ tT=nc::fa qYS`9/{H1$i& @%?_$Ѧ"Agd7fl}DCi?{`=S} {3Q}lܚcE +r#zpJ]ҵ%dPgHGp.%ZTv +v]}u:TsR. ujR{+'3CR U k 1y K-Ekl1lۗ sf%-\.Ce V"0p"%W@[2 HRZboq9NޝMP5[\"Uy ۦPV⠐|2;#p_2UHcC߽Y!BBbLE j4t~[P.Ҏ_)}  jk[Pj3 AaP‹B5$RGF3OL%3]Ԏ.?G S:iytKd6m|!?"yvYԛ l QYNCyN '*oRS[D *N{f׆Gϒ9K>%#nv@-$Dc%HV`zOY2}1B:Y;ʗ}%L$v'GBhg,ogը>x4ġ:^?AK$B`,E6(9P`3n ˖2s!`+zXM,LTAԟ %.&p )jLӳli bꍲ@\0a#EꆴPƍ9\0XV< *w53 7E@cqi`ŁNs kCl7ڲ +I- +ccڝ#- qng$w$>$Q6:}`2_@|G6Ho0糽?ct!;Fmwș0bkV_EET^W2n))IC ;ij$HcDlʾ[ZfjV/X516md&'wË1 <#.kޓUٌ%{`xSS!Z# +KaEX>K& h"d8ߏhvW7/Wce5#dE>.Z]ۢOǿ^S rͧjŋF_UJ=Ggʛ4S$41=٬+4x.1aܥO"r E+/-֖ʹW$ϻ^n$IKS3[~uj5>J6%ӑCg'-+M!>b ]턭!8VУ~̃JkU"P( #*30O{^m=@m1tai,ayYtOiIN[=,6#: f⃃kMVBm'Ffk^ 5o.YA(`5v*{)mm!z;W/XSO-]#N +9 \<T0#n8XE׵|׺4W7˝!pfqxtf?Pr eGIҦJ'.W +!o,P1ܑTH;4PI[I?{\*2mhgr$+=/9qwbެ< 3L"R *GRa+PĠ`KSA}y}fZﶝ:*/eq\i1Z%qZq:Xo 7dGi|/BMuzMaRT$s֞:R0\1+w2>M,v@2uړ޾+ܫ[dO3RTPlÀ߹Soq3@F װCf \I#*V%,B*19X*{h۔ҠTs-=,3:C~eI@vg  +:Jj_k^[weR̬#kl~/ J!D<* ,1b:;nOJJ@R5 ʕ/e&&Z)[zu +"8ӱ&RR}YFA0zw4ݏkS[=~9ӟ/y!YE-E b߿ 'a9IߝuM_{R` +U [5ڣBwsD#!61? +h,Z*EOF#8u܆Ky?oQKBlcӲ1`*abռT/] +Lno yhu+6 iEL}Tw`jߢ ې}_oۛ#$ =3':ni7!&F *1m 'F4:o3q5GHO>xSvh9?Q$n5i%J}p'iK~;'asc7J(c-BaBj3PgZL)c'-3,3"[iqtXحeYXjm1tGU4"&jK*r1Ts(3Ei889P+WQ} kU!Qag ҇^AhZ(]=TR&dNn +)QNo(anVN-2&t2mDT_AP5I>M pc;@Gfb?s*_-M܀sB/*6ê X Wa=?tDƨEV)tTј 9U'3$}DݱGd?-jhwh +)i;:3u`芐`;8/.z:@%P`vQ&` +|bٛ~`z!Q;gan+K^%?Ka9`3׮>#F/"jw%Sa-B/*,zi ?O΁y9GY`Tyybci*Ǖ5v)4`=2 &&}Z<Artv~*|Y4js>*k*NΆUu?+|rQ#&c,vF<,5dy< {F2xUVn]UZ̏{YvfO}I`JO8X;Fsvn@}햦 ^q^ `iAU'uЈw<: r7(eu!?] }FH_Ҽ/Ї(%=:;S5ԇL?~T Q?>uu}"@yp F$ʔ]k{WY^zz +i4)RZ}m;9ݥRvdfEU +V΄d'rؿq$[bVd2~X.s0DHy8]VUx6F + _w-n8x #rQ?6*h7 +14y +))Api\C&|<*~7K6rzRZb ڳΊi03VȚESBg)'v*D{ǗlId]V"%ӆ=|.3à&׹Y+ "B8Gq= +qOo0",3Oa䎈dɽv PrF/}`LLEa1h@D +'[EEM&JL0tԡ"^C]nk\)XlbY-U,!lyEFw~ V0/Dx|p@HҌ/Z~^ mm]sd%|R#d yDJv_pQ,$%8*[?o_RZ~LywЬ*h~BѪ*eBc~H DIQ02H^lN619>]~9G&,bE)$A1ŋ0pZo2Lpb|Zr%Q N+=m]ن?k0%]gCQxL$t8OB\M熞ߪTY iR!xKv\m8$%TąΡAY-z5e\N~~wo?7/h{hP1 ARO@!Owk`H bz~)}IhbMon +h;2RL>: Trq;F6zoƦZ&V,?ɩ4T~509w6R +Rk#C#^6}(]Qk8O/~FX?Ev@Pg' Ǒug61:wy1w0tPOB)=gvgu*]M%و)46I1noE~rbuW~^+Z9NaH纡RԐ/wKGgC\jXPe7^W' O'3:ɼA=E5Pa1SٌJ/ǏqHd任џMy'C{_H!E翢wuyf]՟oĔ+m=[j~Sg'T`zoqbKOH])/.YekGĽ=YC:LCiodiGrV21ipokMÇ'I]J̸7JizH&"L3â#$,8Di iaP^kAOӏTOB_?"Wgߊa> DIW3"˜p1@zZt~FAr<b'[ jTeӱO](:Yѕ Z?Ya&$ű&+.•iDɜ`k'-㔨vN:RfUa;:¯{p#y8U>N!B],(kӌ2)ƖG*BIpPEڅ\OuZ&R +% ,p5}p&NZGEc7}Jy*H~xP }ɠGo\wġi}G`c%AD^zfJ7%xr|AO526C aA vx6qs3"ÖٲjG!n蝷!Q?PR1  +jdrTݷ cJ 0OEj.K?;GnJ + +k#OR+|Μ4U =aN\KMuj~4?/Swã k*`a@8A/zdi-T !/&@Or%XI]Cn}{] +Z,6{@巄YA3=\lZew Hߗ 1 ΄g3#{"Q8@-}C +j7ojot! l{ YX8)a)~IyVK(n"(c`Cp ӥoP-P_}Dk_RzQfjwh'2 jkgf4ia= !fzWe MU03lmʳeO,XcMf b[Ҭo9B'O +<'>#N%35UPU_v_H]ARC`}zLy&I+*jiN,N7~G UI  ͓a݁""=\={tl- %b$8COĦZSy psD)>tW0Sد6˲=kC'5TrSֽvbBAlvlWK1W +X%}O7x>`F+lpIpm+fHvT n+w!I ʹ3d/AC뽃#JdcζtC|]M/ +"Ơ5x+ oy'`I?4t'ƾ;pŻN_O0oh 4έ+A$=F̐UR/JMS[UQ*/^P|sMjD((08fB a{epuQV3Ĉ=^p_qԌ07%84PkDf5pg%h^LLWOG=fM!{A-{KIx8+%/)|mt&gP\~S*g>) 35 A=b;eFnE^čQ4v[JK`Gmyz 2X 7uSPwBRp +mBڤ`HZ(gBP[i$KCwM&ld]AðAUK6.fנ,Q)?g,""bDcF#zffx"p@ 셊F Kd%'v gZ)}Ua +_rڀUIa;V")ۭ{Ch3Vx.25AݹǶ{QtobÏ:"GOqלE%֊2R;]ǨX$-}) k25AG8p"#]xa(bAW MOב;JF6z_wyUǡߚ.ϠvϜl+r#C<[TTQ^=+#GO!rq˚*A \b^7pQHzH?N\^Iq?2cǒ  䱸&д`Uj +-o͚6MTt$aCFjYa6b3/ ^DTCKhzaf|E{ 9\}6; _ +Wpa=ha#_qaHQ=BÒgOF`}'j;.8J1cn!1F ڱ:haV[DԊv}yλ'uQ +/i#%c)QҎT( +ýw= 9pe`'Ge@5Y;0>A1`\xdQ+=v7MgoԹRBNrG?k'(|Ά:NPTcG{#˰`R+E ug\[r[ Qq)) l$ZQ}68b[\̥B5":( )b&B@_x ?L P^OD5e,XE߰-a%[h"ˇ"c"q|(=9JZA5a~HXZ &.` +}It2\E6;JZ'2#R|N4Qk)ɍMckqԓ҄P<q7;^܇o$gW},cbc\c/F\ũeP.`uGm ]AF*Fƚ +!^t5xW\>Hg*]hdbQVRx>F*4nksne6{oyG*ח hLGZ85ml->R{2[<}𥪝%5)3`loUYTXTm.8f9;J҈GItzMnS] AQ%9mY (?FqIAz:ߠ-m Xmq=Ȭ$0EݴNsY,ȴVt.]t s5Da_|K_`\,߁=é¤v$^V;t*xж)f2ФV`2itPQk3WCϹ璦frqV Ksj0<|eO֫Jx3?ݖwc|}siܖ4%"s}TN,j$H}#| T e+2|`Πm0r!z.UZ꿰Kg"f- !EO9O=*!+WG,;pza;B-@|g`/3Ӧh4ꡌ7I靗ha reOz]#* 25jh,+~?[؉XG~R #mhfWĆI')"f$bߍF a[ztYgX,v; C }6'oV|X g~Sݞ2-e7bԈb(g#s܏=䚉ivS*p Q\Ix6z"QĹǙů+P;he*_f8$] &,hyCI݄p3Bz.BV.S? arΝߤ G(}I3[^"鈌{q FwfԔ,^"߇Hp&c:d͎q,m3xѝ[EG5U #&ۋ`Ϩ1W +u5sy<&p㳡ʪDU%N[$5rmEX D3/z0ȎyniY{Wܡ3JGÉֲ乱gJai(43 ԣ.L8$/.q*jpPp5 k +.bu*CQ/;K:S3umrihxѴЅB7z~o׺Ry)Z/GOSV/ЋIŒ毽T4ƼꏵW Ȩf:u!KwxDnYpSόf=><ϣB t4x:,]ǓdHqcЇ{ƁɁ({~G}\eбR`|~6E7c`&F_,+kc0߀Dn](n]8XK\H:3A\ ."pxLƏe}v4 4&g(]=rI1^o¿vC= ,ZۑS+r|d)эH|L 7۽VoM]gWrõzax'{UO!x'Cs@ 9{doџ.0z_3+IX;`щĿސ\EL'":WBVQԖ$5^YMsv!0XA$BA41?gfARuBfOCj_ﻘ[3)xұ҈ʘ@`f.{pk!OŠV"YRt,LcMXsDNۑRt}5K`$Q{0Wà zc4|tD$0ȇNjv=N1g 0Aem%+ j"*| w\WLqF*D~I*Zaҏ#:rsC MK -AtfCމFAlEվR-C0k{[X>0q9TJf r^ Լc&&()b_Ӑ:Cdr}98zcCi | ?U oIbݳ,ѝx;*k3޾0KŞ$+Yov9Wp.&qd+t-%r;AMQʸzW}@i꽉un5e6&\ozT ϪAJ-.y28E;%j K ٗ4Yad` aq'?bT"S(j8<2qL1)j[(@1 w!8 C hp$Iؐ1wm=-ꄉ<槒H"8Jh2n* +3._kPgdPHϡu#&ζM !nwIɗ%ilÐ|)!GuQ7+!UR3-#\8٥G +XO4<2c,c}#=Q΋+G~زSPe= *$z4șLv0=bꦢ[\NPK)0d*sgcް.H ՛KBoT">N7(&ATO-=#ptݒIP[6|UveiX1=r:({z,nSiKi9Μp`7Wh`VsFC3wx\)1YF#^5ZϬww=| ",%N|2(W[-7,K[w(f4SY"~2 Rq䕇l ŌfeY_?1> 1O{(7S DW =gkC 8+˕ TJ=ݦG~A 9cm XeMeZ%%hV^v^TCA#ͳQA}73&X3}Z/ [6Gnfy%dTk8x^FuzpB@n!~AvM>  ৅C4&$ʫV!oVBfPOsBY/4 -r'xȌV|zΉɑZgZj` +m;Ed۱.{'299 +k \ghT`k<\-&SU!,l; +0֩NoP9w;9M?hvcHs@* Y|ņbt*#C= x^fiTW 4eZ͟MU=rt.<\S'ɱcc wLV|mJa; /x~YuG̝d䃈egЮwA\*Yݽ+ywL z: ix Opfp[ q<K&b-AK]u'k9.hpJ4G4DwWR҇5 hIچ)vfH|"LE95Evy!0![9: D0:DžQ@)+ +HW`U}}Ơ)ۜk}ɫXSDݬT }bPqǍC:\@i&&`rRc/;@` c502-0wt})9D- A7~vtD9h@6&%wT5d/ ?3Ҭ ͫlyuC^EMfq?.0#0ѐH}/ôe s%`pP*ð Y+[; endstream endobj 2763 0 obj <> endobj 2764 0 obj <> endobj 2765 0 obj <> endobj 2766 0 obj <> endobj 2756 0 obj <>stream +HWig_ae> 4\ +FKK(j<^<ж!͘qUu>&PLE +/r%^mgϾܟ@%U}{/UmfV;Vۡյa$f̙uq +^}b1{9jFjpWe?zgs5CrQ]-.g^^4W/;{Nv~fjԽ14oiM) h`E`E ,C3JM%YuGo)B@QԔ*PZ->{vOIZ `ZԜ6KS śo~dbdk3xƭ)OQFHOM,Qa?Y0'%kbhjB!b_n7n6)#DKkA726#`F*9\~ W^嵥|W +ooOLʔp B;0/wݴ(>amc8kӏkC/9{/Ϡ ?7;T]&Cz}# jU:( atڊXaL= (VC?h4Ǻhl~~㖎v8F֚P~ |.ۃjm:Dd]rX͎UM-V?$NJ `[)-"cCcc C*PXnie`ե=m/C{6_\on~秇ͧ(6 q?b Hg)Kx=Ki\a~h/~JBः0qBwAЯ͏?z甄e@M0kl8L$vnϛ.Z(94 eԡIH`A2(R/1nq^(TTkM# ;Ȓp!{; )p_:@jv@)O.HrB3'T:@RԒ&1k KJ;+l1φ~4"}{E6BQBBT6"MDў߷cJ?F +ͷ,M=Ejjjlvz!v~b?O\fYa߬z ko7]nGzV,л/*`V/=7 !7flpj>q?"B +iHmcϓE' Qژ1ػ°#-75udDXTDLIH|x[oWK%S\+Ml+17eM3'DL.j}65-`a :ti*:NUɗ辜YMR [#5܁1̨ +L+ӜQ3ȴdض>stream +0 @@&K} @^/{+ ,Q&IUeXw{)])/X'-/[:AƭEuOb C's29e0Bt/&3nDh*AIO^*hb,"D4,,ץ->f,[&im!xK6vu_y#7 da!nxb6ʃ5poh(GV\NPp'4Ao65CKHTU>\G,DRy|ukLZǠtRğDZRwop97wi \!դٻU;=c J85DžؤfsuA{,a2jprS`;zرYsrb\fiCR|ط%vVMΫY3s);s\ R +j zI@^3&3;1bعn0J1iG}Mbt:H#ڄ27ff;CN'=tC?qgg$ kV;>¶50ݡ/&nD-=ӝmIտrSt3CsO\s>Oయɓ6U+tinX?1|b'ދr~%o7N3 ~oF: =q1~$ripE\yIY (lv (-/qA@x~{j]j%[A&;* GP$dX>9ɼiA +'#+םP_6+Mu4d/Sm`FX5~u.rb-e˂V:N !za^`fY7qƙ/4yΈ$GP+ʜ$c]@&BEĺR?Vh>vaż_<׼qn9^Cao zEY$ Ul0SQxhPTr7|`)w?ka}_Leb.] [jxpq 54̾_>wvr{<@X;h Aw/!|lv/^d + +@8 +>0&h9AHyEPL?Zk4m _]ΦD)df3{SRJmu0i70 ~:KjbZ6-Xk{K~-Wbrd(| +Du(zcYxJǾiް}Qpoc|vBcIUN[9`Mo1{MDxdp͸#h0i?ܝ"69VBu:npG ՔGwh;+,L>$dV;N*PWhg%1 +#SgZ 0ɝh{R k +G}ªtL_U_R&_+9G"X&156֫d!W_͒C{S]JSl3:iX86kTmlXIra]GXZմe +eq,/Kx؅uEu.Fgǰ=e2#? H!}`X!NRM]+JA 3u͊w$79:NxBQmRBN$+HE sWn }x[;xS6[-zTB[=J0( uˊhj|_~itE2<+i1Ma &'Lkgtr]~Y&xMRDrt8MDu Y*JRl7UEN–t,8"]_im[Uy#ՍT2_,dvw6=2\nvOc8Mi"aׇDX[+a0ޗhm*pgS+⫞8ʾg6[wV;Pgt@$#_}gW0/~q^Hgd4b?I~n @IwK} q*v2DӦ txj-'$x)) +0I ;#nE] 3L6;o !H^GF!&Wh*/?,jr8x2hc\v4YC3=ZgG WBT*gefr]JCP1Ff0/z=Ww$Ȍk5qe wZBOduSD?aP1 +R޿Uj+y3 bXr,ͺOtK NɰV9}N@?[fjPηTG_\^XLck׿$מkԸYu)G,4d߄^AB?:6Frpro?C=?",7s/dKOr&&rO;@43|h(+. gMf"" mHg2^w吝&|YF>`3`Fr#ak.[FT;3FBYJv%}rwC  ,aOtˊ d7.s_La< {Yfl͛Kz$Zg~o?WBzRv}_ux2nD "n'da3w9v<FޫֻX.CxN>N8ʁ7| % eE^8Seױqrt;},/v/mUw·BFc, KoEa6g1˼s_1B49fWX8uRl+Wp73.p?k}ҍ-u>mB-t1z{pTLvO G/M^1Hp}|ECf>$I2:,|~ps艏:9@ɲVBjVכoż~-fSY;b߿|A]2!W[#BBRBS !`\EWYS^\^s0+k1>Su=} 9Ģxۙ7Gedk?RAw3-.֡о4@0\A;'hVn|^pV{t3_Qɞ)uEzJ}B ۬)V]; ~fO<`^sE.k"Buܽ;)"]]k8;otztglofFNj +IBH+2yS[x7A__RpUӫ&)+畏S^\Y ssi8_A-!Y^UC j3msn숨 )D] Ӌu7[3ŏS(2m#د*7o&Q^Ywݱk2RqB=R\眭8\`dF As YX a^M<"n(: 5l(UA'.$\'Xw%zToځ,MZZGqJKrann4㷎}@DQp񜄂-mp# _8Op_|CT҉M9tW*B㙷/&2N+rEJC'k +qnVb6)\D)+ʗ4;k Sl8qSPg]4K +%}#GHwbejXma!ܲT}tӴaYԑN]Ѽ(Zl16lq*3Z<)6NܔafJ ƳM1?b/=YjuSA/U}z@92MM= ,p6Xj1vjEppt֩߃,y7fmzn,# 1>-MKuRhB-˖άrFLd!LQfXxv`XG ,w 0m {%Ǟ?!Dι QJTmB} A,Ɔ-p=2A$ rLÔw/1ȕ=5z%^css5 N^a +h[?|rL evÂ5D[ 7Bzx\ ̵I̠.@^ڸnp{OP,c%v<<|Зoqj$ q*\:`OOY=Z$OБY%eV|&Cv 1jHXoH?l1/.wDZfV'JÉ?v""ς;6̐7.u}`ү GT޷8[PKƛ.:<@ct, ,P$'bk>koxM[-6y|ezG鼇و ä,qYpT"d%e&ww|=)v0;5ﮱ|ձ]E6[z>M9&[jEtlUn#^m=!LU L\ +WOcj۲y#K2Z -~Ą`=Ԍ=IZG e}nlvO*U*;Fߗ ׽剧o6;M@3ơ1i=:rSsEUL,ZS*g@ MI#nzV !O|Q#O>Pl=i3mt72"}o'J쎐k./nj]HgW`S1 #-u=[.Sk=_м;]CrD-g +vGy~KlQ/F~W?-ZwW%d:灬+t}l;IeGu?& +Zm?$6Φ h%ms]5j#&$Ujj0xf0cR֛ZXO>V,5f[/Lu{F*fgU"yb~Z(c++HbR ja"ETCOJK(ݠcq Yz/O*m*tykyY49Y/{ˁHz'.\tHU{Q柮)7#cgbrͤ++p!>2d.3R,s[d-w=Zˍj'D}6>J߾2 7,qfC}]k1zxqiAr򐉀e-PABFVo` y }X2#NMNڕnA%r $GKlӦMJwbn&f,[s?*fj|[YE$|z( [̂X90G yUǕ. @lZ4&;V,D`[L`Pa|xxYK-LJ- ڹZF]lvc; iI8;Lq]q=Hbv ohLj +ϺW LtqV¶8-oRCgu9k' KK?USЦMKLH#ڿ얝ByS^z"[(k|PۀXJkr[2 +2="xFG5Mz>=.(xRY4ӈ!)p3 ? +]W ^Vz$3fe +WHk 1CqaPܺ̈́7@ImՉˠ7jQaIF*1ʆ۫%x(Ȝ@iSBLo,CZy_%tL8vqIGi(3'8&$-4y뢊JI9x]9>0]yw)4pTMuYMA?@z0[IY1$oT",PZ! .aZx#XFHf x4N\]γ0$TԲ1 ɒ$.x?!VZvu v;DUwqkmJf23l`me +~l`[Ɋ @)EC6߭? nf~;_֡59?DXWvt:K$wq{m'-ެ|BިaX??}0,dEj r 1ұHAlJ8>]OH]m7lN%T|%pX}w@vֵ3ٛE^RF?C3?`l.I'v̤%!ܚUMP^@-P|~Br\b#"P +/B?T,!QҦ bٝ +<xkbkƑI&El 3$Uva)u+%sf4c6NwQ]3&%ymnޫE79K {JAvKMG=6C{ ]]V*PFkևjA"QLN{Bub +դE.>>uR; LZay-:F [|kt"BWrG]-2WlX%QfhhQ4$q6kmt!'4Bwqbˡ8- oFQp*tYf+Cr5Xnu +KnF̅S^?D {|ұ/h'4|kj2U0OTz1# ݠ"™&'hHeӻa?\6jenM2K@/Kr:B{IwI͘ʶT[4Fp8L6Iʋ <4{0tGSk)7U9oLPYfDdlY\*C9 +ʍȶhG#cdb"\"} K'>l޶G{+;Vhyhڱ'jSm*d4%H>mG( +ݼ;UdA[C=1WxӁ_…ɷ}[P4/@rOR'V[b1/ ݴ'aF/%//%%G|?!O: v's!?zgPˆZ቙_[3'NoL,cJ-R9BA^|ْ &+Q쫠-3Iª1R%uU6CHfۑr@N/N 'lgXN+Wvm crPiRP&uƋ6/x3JẼRΞx=yNz ++bI +)c *j1FB38jPf:Ѳ,qsO62]o+n~A]YD޻ԄWV m ?z߽߹J +}׋6 +]+;ܽ,e]ǟR(i*:òaZa-,p fv0/8[Lz.x??|}ȴqo1q'5n@1ؚ?-g TI׍Xs7xx [,-\GI=)!{Y1 (믓 IQ haUyʐPt(&H-(^55nA4fre;^$wV4U"urA((ӗueE(Ha`Ht mG:WYO֋11JRul=9l&1B}`gv-ͦzBl/ je!Ur ߢJrw73>+c^a2"W![CX(꾢競fɜg t6)1}vfJƼ< )6P 4N2sWDah q++ x4<fH+GWA+wW +%'aX0* '30WVEb5K[;hxN #qXnpPwoBoZI8l|nk\V iL#`ܦtalE221& 9ֵDn3cX{|ϕ e8F 22\d^B%H@G@Pb|_H@;Bq2{xe3O 3p%{`JȘx'S+ 8.z֦ء(BT˽<|/"mNlw^aŅkuYq.ӎ*%+;vt)o-.Af:PZ"^K?!#n͏Srm"<\cLU;}+́f~U cF՛5n)o +e"DSĴ\@!'I,vrr) t+7C>izMfaQ.jUA{y^[v%#CDsOk(5^Ԕ'|UI;F)Fz d?xV|GψUnv}Qr@c&v;m(,LnJP͌xD%d#gsUFOx1yۿM̙GE+>OcSʃ"t #1`́xeQ3Kp +5Ah%G4{EHZ#~idl]?t28U뾤U~ /K;i@Y|,Ff\kdD%:5[]7@q͸ њYLy#u +hUY12hyux!شZ=PR4Z5 w=Ϣ-RHbRT~RPjqʶz#{a2&&sL*85lmcHc:*&JO)w ._p QM/gր2 )0֤P:[`:jq+xª頓c@Ɣ3 JBuk(pE"vC/Z3X\7šu(BJvlMeüxTnN2ˆNܫ(%m1 +FX7ѼۓB ,: -ǔ{[6L= ~b\j@{jٺ}4zQG֐oKRM/@g +Ě;GfG6 *"6_`FQ)-~`}A>.5=Mb{2fu`:k};W&\d_Q(P"L8]7s LJdn?m"mUjuR?Ṿf5?g +l[oSpjVjHOGY2/X㰋@ӣKD V|,548I> kRj(rR]!O&Yy*X+憯DӣCqOZ.[b(; +(Fm ߟ) vIߤ]w6PGAH0I/!c׆'@]ŕ1jBky.N 8E&Z #`8|Z| GF bEdem J^fLn?b6a]6R Hj^ˋz=LS6눵Xߙ"<?S2q^p?G4DpWHNeY2<+7vbkx+إeqJub+F4>OdfQwDxn0Spg|,󱿿4ME wdƳyA`#zYyK>G(>ܢfb4VPu&YjnsCFm@JvX!_2q".p`3dIfiJAB-,NKB[A^%G^ xpd + J3$V!Ȳ[-vɺTa)2쥠"{NAדIVG"\i-K2?bI""ynjVMDӈ +lKX4p;E@\9g~3Hq1A+s):C,6blEUoz&G> ٭DKK$Na#r<iaI%KgC[XVpS" F +~ywtrGYل $ޑ4!GЦG@Q$TEh2bP\w!5pEXʬ`^,HwȋJ R$@AЌm\c8 /pӞ~kX3:۞5<9u:>?$7%r;PA [ɇΖOu^KyOvc wub)QLz е~FĉeA3GԨúȍ֬ڸ~Zn_oj:j'1>Z[}1;~e8uq +E4tæ 3/\ƈlcf>.P#n![ +ȳģ20Z!Qd/!xqYH[=scm{!Od@?8)rfLU#^s-%1'r!z?ILIz_%L"D} sa˃@oX_ՃH +`y iWEsD",eēqqKE#.M}A[yv|ܿMV[psCI9"Ç 1A~C$Ϝ9 5ED`Dw AJ膠r/hezF2iبDg5$Ly1~"7~}"2>֖גI3 +b,@[ +L*ISI hh34[m?-sUlPZj8jM*:M5F4!6;Þ>RK|@"\5BDX@o^K֡}`rgfB ČeX-:GԲY4+;'h\g٤"TDĵ42sIegΏn8-1o_MVDЎ*>E4["V$p1T67BZė$N݇*&tײyr׃g"0rU> hRTSM]P|BšA: +cJ,(QWz՚r!fĸ[AhfO:*"ȉ:+tŗ'ܣOOZx﹁6RP<ꙿns*KetQI}J*m|%|kS '-]W|OFlSbFDxJ_.V6.G[Oڣ#l ߷39[% zkφ8PoNSJdd Mma>$+zglB"4_S~r]_P|n]<$} HaV!j/eku]X+# +un/ϰYSE2s1c˲8Hc^rbpFG&yu(Qv,<)5mJP=2g!L1χ YJLvZG "w^J!8{ $DK_{y`sDGx*-}ҏmu!H3.4+g:EL}bN*paT'E„zMSh%_Q.maSSaD5C뢹a9/o=u5[ʤN@A^~0TɛamlhIl1:`;s2d ?j)ZMRVW;qObėAVR9FCGXQ +5j^!}Mҁ{G>C((ńt|'XwrL*ء ;(R+Mm]xHVU_b U[\$Ws*Сj~4R ܎V; r>5gH_?(=AQBNj^ĝ#481+E( Ր-բGNq}FΊ,h3“Ne N\8ا"6g;n/OsasE;l]".%' U ~X }m;0@ԭ4!\E5B2K.޾yْ$JGQ!I2k +~hq D~K2eFUyKEu/PDzoUڐ^92;랼kN8a(БϫT +ؒi⯱Dal NópZ4AJ=ޜ@xr$DAVlӅ +Ou*47PC_Q%v;yJ, {C@&t{USp,hk%e-ZzfvȌh8^V3R F?4sI%4k_F=tvG 5Vf1=wiנ3D㓜{>"ov,(F9%ܾTqos,0?L݄ͭKA51!F;48u-w^p/LW1G|LKbTڷt8(N(ZUBOz+' +yrA>h]> endobj 2758 0 obj <> endobj 2759 0 obj <> endobj 2760 0 obj <> endobj 2750 0 obj <>stream +HKO0{];vlTǁCy挢4!B'D-H ,K3߬eHȩ(,Ì6\Er'XăylGY0$C tH3>ߊu+*QcU&4:0Ǘ\S endstream endobj 2755 0 obj <>stream +0 D@& D}3(bAcRs=6i9~x'sw1pfPTօT8ӹʜ;\pvu~nԱp'3dMc2Gm9Y$,('`$vw܆?pɹ;v|!b2DySyTE%5Ǔ ?fz!q[V3k@\2PX2 +sq,\l-}. '/6-ȎSS=Rɂ!E=\Bmeصsǡw2͡Hw j+)|JRBQA sBH舲kc?Y0zQcݲ?s݂ dg8{*v2iC7Ma|z?793()M;&Yo5X eoX*9F0LeTu'(9XH R1 :QAa bq I*6 ZZK f&&9~fD7x%\Sݟ $0ҁ +IZݛV#THAwKנg&߹L58I$>7΋=KYb>^v'ɬJd kw 1m#R`']{m +;́{q0rz"H\]`kjw劒3 +#M^: +m[3$ngqgC@eZ󴜵UX鋰<ó4>% 3|c$[セ d/W. UiӠ=dK;-T[mt'G+G؃$; dVǔkDE<2t'$cB$i + + [VF!#Ra}@_ŷߔa$TsGnpp`my~Dǁ˄~ Go#zKGvtbͷ+ʓqCH"!٬\NdJ' endstream endobj 2751 0 obj <> endobj 2752 0 obj <> endobj 2753 0 obj <> endobj 2754 0 obj <> endobj 2744 0 obj <>stream +HWko_`Zmv@ҴAaj ++K(;} c$>ΜsoWܪB2\*[tdߵWzz&Ͷ+FE-3mr1dBfRmOW>  VJhK.ie;(UB1TBp9a<7, nka5:Rge׳uVqVKop9%ȩEǸۿLt_ ݍ,Dς>Sgb|>T3QzSndxTEOF\#8"op]ʡ5~ߐyjpj); r+'-;.sZP42fV ++!R-6}T@Vi&ș{_BJYP'/Qڍ0IM_p*ӆT?>[E D=<j+ &e|+ņP=Vbp5ݒڮqQ;Qm$C]tQ_$Xuj\ ٤cCI煴6\ A1D#nӠ̸=u(Z+u,^\誾ۦϗ#OKgD ΁;h-"kS!MjEZDf@Mһ >(F-|>]*h bb19jX5wSXm' +% jzQk=vgrQH= 8]E˞_o 1d#Rx9mS9]m\Z*;4acwi6µlck;."-Kh$s-TZ3!}E G$s1!ZvMdmWW@Ϡ( ]]U@-%BGF6 P>%@`Ԏ-=/T eSRbV>QFu0&nyvwV)(%a2` B]~ /}Bd +2jUWQ9T^?unؑSkyI8S9t.Ҵ%T੅*@r˲%B_cO7NKB})DJ^v֝8s.nV>} <+-^MwZon| }͛wm~wISklȇ cq?V?9ɤ(|ˌ>_@Q c ,nO?}f)^H+6۹=~gX5 SOfJgL $Ddo$;OU#xMŨyP9@7 +r-3$kl5AP vO_u!HH6:lsQ7 fry`^y@elb`>:U 2οb2-✊]T,!|;$n{؞&Uw T=zD!@)V,ߛxaquܷM_2١ݰ1+؞OBCT))$0.Bt +h?n?ք#H;b:f| 4FZ:CHc2:!#z {"7d endstream endobj 2749 0 obj <>stream +0 @@&T @CFSWc,/<7PߑǸhLx*ɵ}cZd([ܤp d*0q(ݽW[ȹߒ\, g?PA(:OMgp}gV!W rV6VY+-wwhq!5]#,um?Mg6H"H -Z; +(<w% +!m&0 %,UاiwnJ-FqzTbdNFt'x< IwwXt)qf2 7U4H-a$Gi-UbުCKy&[qE  S>DG^/^@93ۆE km LS5D6.8;lݾ襳.1ܽZ7'i=OB/ +4pEMHS,_ |2\]~ +8r%I``Uw=Q-gjsSC<'Qa[ɢ?.8Oٶ!\(Zg Qa CʤV?p =m:BDYTFjph/[Ew}T?KKY~ +V7vӄ)@t@y\!e1.3k1"K [0ˉ +}Q3ξ`U@ZD-`u?:نV"k'i':(m#C]baqT>' 2]|6@e2U> a:{H=uc=HZj^#3 WNSIDx}37Z~~VB͍..El؏ѬdU /ܰ*9~Aya1Rmj +7fj2;Qr8^/aGH}p}s',nv37 ^EԲyfF@B!8/أubu [iEGj/l6mbJy!?z6: S<1gډKi8*Ft[.?r~- +Hb |v˷=#$f!(m׾.Qdg`Aڼme&WLg;15ɿ{ޝփU' +۷pðtm*r@.ݳ hMC]-$A0mE0h|[`kQ&sL@X=ݑݧ뉈&E0>}P Ti[{G@70F( k}@_z}`.W9~V{G#G谂F;\Sxߘ>nwS0B2uN QkMk j7K&zqB^ /KLSNi}W+mKa48CrֹsDh8R9'UP F/'Vq й^QXSK\ WZorz&9y!6[9Jg/a0/1w>nz#trlgBQ_ +_@-6π7Gl&NYK;c6 u;"r sEUz@u?*]MFc(9z3R +;}CaYHe MQ/ʻ4Q\M͛/ڈAP4i%->eѮp!؎Fce 2O "<oq2IVBҽ9&=\Q~\ȫђՅ^ހ#&';?)‹scqU x RrGveÊXRVPȡj6?}a{^ E68xKl|ӭ&Ok!*MF}٣Z 4ۓ;_NN]P"[-$Ӓ%€qhh8RT`47[RzG k_ۻbېvFpIט 6PF(M{{ΥTkql0ĀwO\'xJ߻ְ 0V4dh~Ti%*)`ns +t#c:kwZҡe gk -OgGDoBe݄*e$ 9TH΁Ь?G]9v-7>4B띟'k}~!aoLü k?Ց9 +rNd2O4f6%oHSpK@I=ރhQEO1% KzrP7Ix "vACd[@)ƍ%DK}ɲ̜%ʑHW ֺx4FdNՒ4;pFت+ AM{}٥H:OP |,Pܑ?٩VtZb{KmkReSI*`|ތ־NuK~r O(`d~ھW@Y㙓.\(p a'Wc +uGE a?ǧGup{B9WR~>#Zh,;?5BU#]̠~ +&O??m'Ȅzze@C; :|,gd|7> +\8qɨ$L %6:FߵIn4? )EUͫ&l̖IkPO#[PWEέKƵ)_L,)R5hB)ٮd\=H|l]lu~kl(-$zV>C5(=ʙqݦQed+ybE˕Q7G +ncL;zOLQULP̔3q X@2Y̡C}J9f@Bͷ춈 H+ c]ʷ:S@F6 δ; ֞dJq!t`OAg.D8"@ÍɑZ79/?ا;]fJDY;܅#[jh\kA[d;֢ʯl6' 8a!dCcD1⟵0EЎw0=tM;TG"r%9!Nv7u%qmydG*P]E?SJ24>g~.ڊv0g=lȂɯ+O*  0k x^~:ٵVȻFN)iQc_ξ0ޘvf&lܿq.\=,^g{R.g/Vt듛~N`Tsހ;b hkIn<3[v(-߇*]HT:!ΐڐ-Fǩ8WAn +ҚѹU}AgIXf9t2\`= uuMJ ښ}YW3~kC{aXf]2?P !cwSJb^aWHSiO +3>27vgwY2FrC1 "N᭳AJPmA)aԱ d{ul b~62H3=^6-K5Bm^Zxy&NѮXHkGr'Nhn:ˠ%_Qqux)$!Mck;p.~%6 @OxSJ }7{cA1? w:?H(L{Klt+kAV3M{ +d*2K~"rPrUndH8 +i8mjh2P$L2~}$ 3EZk"9mӿn"Ldڻ8f dl!H']M}8T*+NwuYT'J)0kg`bo :eSHM-DG<, M+A; Ծf"MOl⫴<{4J…(@R{s`~esl' kaڹU9,98;N&n/sʧb#iΗx\3T qZ" G DSRC'~˃,ǻg L)S0Qh[#2jJ̟|߷P YH;{Ͼ|~FTq78,95$y!7ޠ02pi5*(i2r|y! +te3X=y-~6gcUF$REA{LJ2h_x%5%"N& y5_<5<*5iGRdw(:))ЩfoznPbk:׷ ڧ+޼fU`fi$\ Oe};^mS5Ʊ(R)T3=C(DtL/+8Cfk4 o`/#H`]9R͛V]?),E GgCw+U6A} +e+vTe3T,Rhx/G&dЈsִkFBܣFYao5nي*RrUm =hh,WDSugilڤre{Yz$u Zf܂ )uȽ ՘T]:%[7yѾjg֦{ʴ:=<5K< ˷}u5{?Yw8פ@cR+ELy3ρ!6JZ KJZ&>N Dua1}V[Q)lо^}Ԡ*\q:ZN\ +UآC/kʊvq'Ro Ԣ':ˣA`Zvm. yZ"d{  +&ܽ,@֠k04ІWVQݚC)lIYb2gW.~t p_lR Ӕx8 LEXAs~ۄ*RvX'w2HBX/YO3F($6h:7A}ib/2aolә@%[1}DCmtK}534'"\x!m6$Is'zeqqnk\^,`Ekraw7W\A)C=Cn}MoFnx9WE4SH2p2|wԯxW)mZ*k,BmstϿmLJ>9. ]!aW66a/:7?nۈ +x(h4P*o9]`ז"?&8:ex pCr:^CӈE8jg7 +_ƭ'O2鼓؀'m'Q* (SytEO=T0OqǸ_!Fn:K^݆Ԩ@[/ +Nk$]X%R89srEq~Ķ?ꚪU7 +SćUl =Ɛmzhϩ +XzT{1p>ˎ+e1 ӷ֚#oMiu#܈h'&z*&+vٖ[4#C,9cGPWT"_bptre f.JٗrjU@b\q:&#}gHu>7K {V=*So2v{uY"w-0IyRRGw=l?=(Ǡ+)޽ta҃)CI=ŗI_Jf4{nM^2s)s1p}ǀj*JӆZq X(m{@SƇ,y@#ԍr_fNQ[oAg;ͼH^P4 +<>M(0͍oTnIm W +uc:o{8ւuq1, ̌8 8~0-Tls\J%DtF"*2YaqBk\(3xp`W$1t͋bd@sSjal,8/mQ(PB6nhzLBn.6*A(cvRA+sc ]ĆwFSƝ#v_ 183=5p(5ȫ$y Ju4$(ڙE&Bz ".N[Wxhم =ʷ` ` 7zpG1il]&{isjBUk:*S_\41@~a1TrFU!o QV[½mԉxvt*|i+hҤpZU&hIZOceD6^&3 .< q/e3X +Ď*>5Д|(vZ R`-N5B.L<UF('>ykݿ$NT9\tq}c%(#05߱ʘ}RC_vm9l.Icg--z0Uͦr*t{x_<W CwVS^rmC_&ݜ,=#Y:( +e>V4V}v˲c`1[r*%a{IN*+j:0x s]]d'Qx$svNZ&Dcz\3b8RsRg<@k, Wࡣ*}0EJΛu;4H6;Á]0l{O٠K{ȟnܶ4Ե ;̇RoF! )Qgbl0OFpH?[ Wu{FrbcGn0QdS:)8DxT $y .B)4w.3:DV=Lq0U#:kowhø(%*^J>݂=RΎ}}g; s,vΑ3~~nBUWrA +vsg^FS3o񱫎ϼ%%Hzзu56|=l=hT͠#d@8AG[}Gʆw-FԋQ;J|(6?t$ lDrC`\'lR7_pM= Q==vYbr3uvaAv[4Z +fA,%A_CSH"޴‰m::MjuĨB(rȔQi8XvO rpQꀅ#ݡlл$Q'0?lp' Cd(IMtu'ZyOl_³AurMvԾ{&yw>b79=*_˕v>=kyBFs" +BkP yP,Z[HdtAJdD/1:W,*۶KƊE~*T8ī۹ᡚr]JťUėn'qy`уƍO¹ߵu ×?F1^|12,dEװBGx!<+:Tw},R +[g"zymqU6BYZ`K ELQ7\_ii)gA^Pȷ6Bz=q7>ۘu qͳqq Ew44IBV˚o gJx/~#(5VN$+KHPrxXX{dZx{4bzCPϢb%Iy+Ũָ2"EТz-٠9>'%]{+s{.IzxingbTz:aI:ćVϥgP?b@b:qy PJ®]$ЭpKAǸI0p#ЩRNT?7\6 RF[k0 Y=6jpvt׿' =gFZD$wZZ_&ٱ ++\8pmEsDVD:*RW&D!2M&7 +h*(Ap2+p FȆg]OS,a[Vˏ;$JZkTȬo&z#y7U>mZ*&4y/!'31^;a=7$dJ՞e4hsV $" Hbt>7k'e-h"3 R:ߗߟdYDat߹^IŻ.U Ek(;o%N66BZImNܿK)BW `<!}}'0S%Ҙeh=-Pm 5* sg4pBIER P`]pzƢ:u;@*d:=LGxLҡAMdpC~^Й4kY^Y8Z)#/eA>b쁳nL]Lj;aZk +$#C[b >Ծm]MfD%~!uC^ccpQ! [A`7_>0SNct~hw-7{-YI5Džp_#"Kͫ󬮹zB^\`HkSux2i1Tug!gE,q\Q%9R&rv,{(-mSnܖ!P , +ALZ+KJ>|j `d7C 4QD= +mr|z?6ޓ;G8m9-?[c;3`ߘFf̭r.;" ?a8܋k5;4|g-4+ކGխ:U !k +c> -y`ORt:h) +Dl:Ip`}GN@[sԨΌ֝$V F}AΒMy +S+ oHˏ7H5XILeg7nɍ$R CӶQ#4cwj' +f7C&^C;3FdgWA(i e3BҨ$T4 )St"@i|+PiO0_fwB_^dx?V\Z HL>Us"ſ6iPB%W3ŕs=Sf(sC gܬ8W3ۏ]HTJSUp +͉)G7|c~n˥e[:V-M*Zf# qtpE!IؘА@_]#sߛ ^aTdC3Rfc}eRoZCG4M܌nsc.U [ֆbWo ԖrD&ޫߏwy>UWȑfP4"2d1GNJLT#vkktQctY3 yj8%XVl 6?X@H 7BۡJO͙OYhVI}ijYa zV¥ 7 e"xD?;qǮ4J@MV2+ƣFI-rȇr3Nb{v5S i=~'mJYH71+wŅؽZ.6rV6]G @ @,q)@8S,BE;ˈ +{S@Y9 t(~r17/Ў5;"5& (]*tHCT);/iwLnP@B`djEo!Z< $.Ze`YLQ9y?]Q0=gK!aVW8ЉM,.0nM+!FߴnÚy}]^KmWC>5^O+(B̨ Ej8˝YN8r-pI;~tA!<vݺZIL&5R>U}WsF${ѣ/Fɑ^e!) {GCv4 ܗi]kf"UG'W05 RmvFPb(KByab25JmPUn3[tU֜; gj암wWzl-u +i4VVMoec8bʉuӄ; .f`'3 |/x.W9dO{ յIO=cD}4d^.;O&Tߡif6s~C8 净\U2ףV'f߁x^I8oύQ*|E88pA4-%:[YPlP*ݼXҾ#h['[)Є=z+ȯ(Q^88e e០a,Ŭ[]O)ֱګG`5 @Y@LqK:J(w~I~>tجzX[11SKbu\ng1 b?^`W9 Ne2j;nK/:S3{9!{Zӥ=[+}'9Ӿx#v/@k2ѡﲍA* Bj'FZvh{x^,X ᴯޮӮ/DIFs[e6'eL "ǨY=᪩B@-][=-| ࠍ1ZN&@y)R1`hZÃI#Ms} F  +.cԊ'0 ]`R!)! +V9 GFA/O67LqcV +E@؁ +,"s k9~3c۞_^u"#aX&tZ"my5Y Z[U(J֢,hQ[C|?LPt:@,H8J9Y LecuOx~}V=CNj%hΥ+1;?F/SbzM# ib 5HYXnAbvP0WeRv+_* +NX0c [H**Z yJLWAKⱬ-<&늧 z,8.신IԨ]?S=rBkY ZaϏק$~υ[u3辊Z6J5qUijJ7{|㫤 M7k@:1RE**z1P8) Fj^~Ť6` tQ?n5PpKĐLkFmj'5&|(J 'riߏ0c'S4 י̾.1Hg/|IZvxLiɑ%b&ϞF˒a7Yl^V>ع nRC_o$] ]|& Oqg C ɨBub]M|r`M +jb^Pe9%e&Z)-|ۜJ [˗_V&mq{lx>ݨǧ y | ìsKƴNibMfs;|7XF^(߉X陌l ,Y63) źG +3\vtt.5?4)g.fG{! Xޑ6!s5,;3x9zY-AG&"_̹T^85~pJCGl—Vge+znDUO6cv$Lr!Vɨ>?'3(vqKuvfƫ7[06KEV> m6 +ɐx_{N5t)^4d\g64~iB ߵaGVՃKGZfUCbv<^ҪBKRBJaX k V}{:@h!'[8]ph1Qlc-_5-x%Fuwys7 K؏#u=f3?OgTZ)^8qf#Ǎ4\m4 1>%dp3Q@\A ۿ!Q/̖sk(zZJS + 'I3|qLBW颸T +,hVXwٺ*܍$\Ԑd(\Ikm^K?:=>D@_{CdZy~sOevo":MX4Fq.*dҁs rŢ%Yvs-dSܯ-,\M+ +|Vjsg :ƧY'w8+ILbp`z51J܃&n zŒᛜZI^*T\8`E.Eac\4yp6]u)2a|~jҮ09es%uzRf[N0÷6|世rΉG)".x ޺Ai5)0_'Yhę*SLDe|f#wQ +?֤j80(XMx4N|64+];伵g(DAXE ^06ldyw6lPM%Cnżbz.&P"6%ku ޴bU,(^tdс +fdzXySre߭vK#Lca Hw5F+t v_g`}W䧑?3|8M#/bFdR3P`%Yq]jRhKl(=|jo[aiP_>t4ᄉ.m2sJf,oCػ%d:HoP5RVj-Ѣ[/@; ;.8LGXAf=O +b` ἡYч?/!( F4UTR9i.Enx8CU(`@ET?\`P6p +=u96!$AI&  i<%LsrɃQ Ni~VcHA1@M mv{MNE#o4/7ٰ 춯{pwMEbuNPz( vw +_懛5T +990+NL}N3 +vw.T]kDjͽ+ʋ5mbRh[J] vHk$yHbvKRL;jCyi ۇUu\jVj8Y} ZTbx±6FcA/|l2qf«M #/vb_Fk3vΜ.p=0WrZꏤr0}{ͯXH dl+ ~K#r~a + * +' Į.]Nm4kwaILeW 4AMaGxc~3v째 &H:a-f` 4,?ˍ/ZvbD ҋ#FklXoYC^ V2bNX|1zBi2Mv= d r6Ea}Yؙ~an,LvuǏk}6H|F??07wxakxtuhŮ="yzؿK6~2A[""V%#/^K#n(Jx`ȫ2S6߉4@Qj+g4ay=5Jw5=%Z(@QlkXo.3Mfw&d76"ֻT +8JH{;h}w:,)9.%|iWDd8,N,Lni31!\?9pDn^QcU%n뀩;20ɵ"Hy߽Wֿ,yM KoT#k? +Q'\"~e_1B[ 0sAB'Vݿ?8m2]K0{ۍzw@_$;˕S-SE^Tt~DƛY8T3^UŒ.%r<~Ȉ^EQ'lxA:pJ̨^嚑.1.z%;2L}t\QCQO;MRK:f"~ʓ'ejKLNbCᎼg )_?v0xъ{WvjZ|MϪtM5=Ly\PB[ԆL^%1aE*%j]f+Cd7ALHXb!<`qn}zi?w + _CE=mQlzh%Ի*u5*mm4N h赋 eU}[bq93"B*o Ku}xZ鉳Xp'y,: +p.B!\=[vsgi]7ֻ9;=Zp4Ә)L;qua/>x$mD1Fqu%!~ilH2{ͺlcMid®pl3lQ^MV&/s wj668 2kQMf'uW~V i:;.Vlֱ_OIbα6Ds͑$oNX/OeJ~~"3DqN2P+|U[hxfJp}&t0NVoi^xv?g6TH#|/v)cR(zfw]y y >.LEI^‡W %ʤdyZjK4.uRugx"=x$pȬ] 4mǺ AܮymhW"5 '`Mރv4 ]Զ2M/j̀sW wyE-Ű&C$sH>=1ȐA(#z]&a7^6=m?:?2V@_*"&ud;9n5Ŕk }Ҭg>keZXvcf^~-GFv +Q7 ɟuQu#>)>|~.ba+T&C?%:Kl+yOP|P3Ҵ_ +@m|8lB _P0*\©!9'0wvLfǃ2l(puxHr<\5q {FutpKw뚏 +4)oM5xtj8ٽwFR.̭1ሽNgfmfҡ.ea&a!a.U\  RȋЈ\48-czeq|:5kzj}ʄOG`S;qe^D `j)I2m50Ot&hكͧ,yCa!oB1䝙im*3q0Q/E)KV^lQ8^hS - iUk,ǕFAL)$ڰx#Ick2{]JpKQP0eUAٗ`J*x$WbJ VW(BĔٿMXjlZ@ҳb +$mƊzDtLP&LNڐ/R)m~pv QPu1{%[]4ʟgd:[#4٣,AUvZ"ךFU =([=T/鬰{9?iX>|d'Ƚxj{ʈ7fz|vMRBeWqv Q 78P5ݦ`Cѽ;`/ ^$jU|GbRSuE8W3D1 D-ux&قS>WB"/nlƹTGJ<$u+J|rG}T`_ft66_UќAn5 )Y3֒7*N̝&i[tr$'tR?P->lIiwDIh U>%cBÁ5N^9,1 I =((86`C_GF#Et> endobj 2746 0 obj <> endobj 2747 0 obj <> endobj 2748 0 obj <> endobj 2738 0 obj <>stream +HWnF}l@jI`}nZ(X0cR qN.$h401̪ꮪSNw%eB(~7Wޗ߫իtW_zm_}S^ʂUJ\Xe&Z0n $hzzqٵͧջ0̻u8fqcJ8Mwmv!磿yL P ͧ&xz`0ŅcBz6ņ[^2h/eR "Hr5Bbyj/?XWf?ߋ^>~⧫SZvcLb/&RiJ8&PwZHP@}M4\\rr]*r I+509h$ +2U'Ks,l@0;w;=e).L.yٝ?RqX=~jRUXX`/B9i7 bj@*BP\py$jmBPRL}1L5y^8S IC_vDʑ3!5 ,!]qa0*~cso2 :%g8 HF#XS,P̈I!F@ȹ}՟=+9,icoS^'c&<|jJ͜qn' CJIp~x;n_?3Q3i4<;'L(q@ݫ'u +LЪm1 b4Jwlm[7U .Ӡ "(g +:T}+n|18Iqh=rl +2=}Ѧy\mTD}d0{9/&p\"6 e0lw;OՁ1 :bwTFz:B.#zjss@:u ! Nc$L>1۬gi֗O8=E,2ED&&*l}ι~qc5X"UPX7np7މNVe8\VN y֏F_+~`ܐԣE/BE 8TmxSC/Md8Ǻ67uZ%]0{:a#'&!||!vs=uADBӷ"-/JS N7̻j#qܿ%Ȇȼw0XOT$>M2^LWTČ{PI vO#-R1i2Ʋ;Ŕ/+dq]Th¥ b\U 7ĽʵFh~7q`He_{/o2ꎘ &i)!.FuQT!gTkg:lT I=߻ K[Q%0=?>&QD07(&5enfvGKx1`^ endstream endobj 2743 0 obj <>stream +0 H@&.R H~T&yixi52YoϨب?Q"@)l/I;BrX<FOqNtqA3n\,׾7 +xKLbn{mdjfR7yJ䩯3ySRׁ0#2cH>a~)m>=ZEc(6I/-Jɻy]ps,Z%⃍9N%Ud J-Qj.]pfB^PΜ4[' \[>yk#!W7,:V{DpH@KMN0ړg#{M|Mƒu.-)ci,uZdO<5k[RjkxF:oiap' ռ>s y`^#їfo`rǫ{Vc~V=QR/µAM]w؂/n ~8b3nv2xŤ%1ZFy1)&ވ}y/_;Ir#ଞwW+z?EDdtA]H67;V-d]ѫP/%֌kKg:.?IŗA׆:&7VC\ʎrwb?Ȧ'BKӸ~ ,T&6(bd)t􄔒xHVb? Iֹ_?!7 ڗiygpCo_"7*]k,_h"9dO]!ϭv) ɞmkc91wۈQR mAܴ{ɵ~x+SXz+5#r9u?в G,s:x]KPޜL2|6d`8.o*>pHUp/aSL,)~]zu@yGLf=QȒQ* 3M>[tN/Βt sM]^#y;D] /.>_Ei,aS{7dF*_kTT*`~a_SH"2H0LlF 01y8TG'W)d;H6 Equ 45SU{ba #QN˜dl(m1<9g,TJ;WLo!9bzp$Ejs ѢiͰ6>6&֍iO[7ɄZ讞C :†) 8uF`ǹfP`֟?XCȇ̘ ]W3(H)е5cM6bthb|_ +عr elsQJx"W[qӾRiOﰿ߬N=fG.8pd-Joj0Zp~ +Q\E8Rf{> g)G ]S9<C}E e  "K{QOԒsL"TF[?MՊ4oKQm'/10jd8 9:9e)u4CSܳ〢7O5ny\ qu]l?X'p_3kH Z3t*Gx@: O2'M3 +yM5;ua6{Z+dL3%4OrN|9"^=kVZئʠ|<毒.׍y+YD$|Be+W8 I_@)Y}ML"IS h_{afUtrs;Ƕ2&àd5]+l'B5DP[ +qZM9YqcAP4!tDL*0: +sjXp3q"7V'\&G% xh^VZ4rgzAmbϾ(l4L$u Hgv ɖ4Lb 'H٠@YNxW-V'O?7hr7oĦ` +k + ƍ16F;·IBiI;H"^h6)B|uBWLd]O?G ߯q42&}ӫک~=GUfޜ< n%&Yo!hd҆g)\jsJp(+e1B䗖Q~V:Zڏ2K0 +CWC*]( &3&VۡXʬ/jf=InJ ]EUͼ :өQfDa*\Ԛ Z"aVl%:B Šj1reWW8´' tQ?: CWa祯+w)cy_+/PU: + 44y[uۼl-пFFlC\H(~!Y y{҂6O) [%R[B_6喱3nN/v#C:zb3a + dȯOtήotʞ$Jk8%:z~eb+4~ JM$|`FX7?(bmp@* /]:U  +S}?%"" +i>q)Bu p\LM]?h@ґ i'tdrD|n:dꫨ9Y\2SBҟTO^y>]Uн/#.{ȋa4gRB&Uoy=Y +ICp3s@g'=IASsVT$cHg1f.aoÏ/T+)Lu$(%!UmȹL +Ma㵃o74,sA KSE[Sjo?p猌vG! uD73t +MS=C[:XMq"ڷA%vȼŶcXfZbK%h8b Qf0Or@'O0VfՎ$̇b[UkR;"8IX~$ K˹Q0;@<̤:3$^:ŘD^ͮ?^+gˮ49R Q c0Nθx${k<^ RZp4a-4(g+ށnخx:^Dhҥ0ua9btK~ t y5ېU{݌3-|!y;ye!~9(?#@Mhdz2w(|3`:tijaR--/j"!FkMMc'j10= Vr0),I#{j`6% xMzoʞՊ#2Uh)*p#{kٓ]EfĐ?(EZGqqЫMǀ/V2.f*Ò]\d̝JIۮ˰OI/&\am‘EQLU֬W )!1Z +.DXs+.W>=%W9>=Ry ='؛iępkuh ͑&(,xu̬"$T݇Ieg\V<zN׊Κ5ټ 8-Uʙ3Su`}QJ H,o)!(^WJ<~ la$B3-8{h\aҪ6`E^L6#I9'{ )gyD}W~"\?Sjd\ DjV?Q"YZ$ N!' +K ~Tqn+WN0g8|3֍-kCvo,e$% o^xlObWL.{S/^CyiQ3m*mt/^+N*h==޴O#^D*#D%WњqζS 6L.\+vQπ5HɖRG؁W*McePqG}Hcyl\Oj{yJ0ɖ<Vw]`D Kaхh g7|F)a(L97hA ,}8B91/K8[6vgt0h`d`զJY?=,ż0G2Cf5O> 1FO֪Rl^r\ e~u֔)/P&0;~GL+vQ>T^ +2Ygߕ/,"kval\L]PC]˛%# ,H_z{2k9qq!Lz&94 2cu6!:=S}VHRWwXHtžFډ}wgʃqk eqjg,SjUvIpxz 9Fo KW>#  SzRj,a:vKŸ5%$(euvQ {86p{Yt #!?KZIFGK39p~hWx,=G,LL31dqr>_E?Phcu*>_uDGSQYׯHv嗎m(>kTz) A`7yZ = +~G>tGD]2[xaw_%,]N57 ›6Xlo^ۄ-<2nA+P4 Y'י o _?.{5$[kKռgx"6Lm]G\j$G^p3%Nq!KV + 5 +؆5uzs9 D`uiҘ}e~%,~ɪ%A&r!-X~Zq(M=e ȭʤXWxݕ~(Z^WdUWOC1wiO: -DCNX:)n`ll 55*Pb7yXN&-2z~v8!wb͟-$IМɓI)8)@NXf;:`Z{tw/u#g˘_{_&Br m`L̔@Xp}K5jYG4)k ˤ1eD4k RmdE"o'yT.-*J/+6"Ւ1",3y\0:QDjv8h朼4ja*xs,ͩF+{{4Ҩn"^n=Ck5jq,ys*-.XXPre*&aq;Z~P"oPO)5K4`w:"d^LN+v6];>j2}*oX5#BVji-_获N>Zϥ,v +j*4/O8%@kX7Za;4/ńʐvz +A~ @5Nh~KNF{9ú rҮ@_6JXw:`O_Jtgփd?Eo/[>%9:#PmO۔cZ i{iӛӽe:*=KiB +kD'.p@>J!<\Ql$c>7M9]z{\Wl +-˪Ż5i'3!{=2}BJ2C-IN5PMlO 0G!ta-fN.̓/O cM/t"Hژ^4K,7[[ށk*AC,[j<<8N4yDx%:b|7qIL +;{Ge%Ri!nrB9o,Ng;/7_/{!QpKjO .d1:ylYd kʻ[gQ[t(@5n'x ;\A=^"ErޙɍgA5^q =:yZ hr&%MjXuΆ"qAZ˗%+}|k=[ۼ)ĎgRm'⃰ |:7sr^`p&oa>%fYנN|qb6X*l-S~,*1ƫg]D}MlSVﵲrZFb]I29dmVOlDT)rrhJ<{dt0@\iQ^1v;`~ǥMղܾq6"PTAխ?ΜvcSkv)zmkmB k(,rEN6-5Mi-fmdlCѿgqYr 몍ubݸt=jlq0<()z\sv;E^'R$֤ ˝|sYkC{NY$ UhgzP 7>:3(}jq{gͱBg!5;Es +5`WAr2H'OVe '+HII>5M աM Q~1$*Z$4wkꞪfG{s=UwAކ[! ip^@9)*0\ k脲a"'DM'Uc 3l9A|}CW!%9s57\ZBfu1ptu>']xƜ‡W-).Tb[}&>eI]i儥 ?ʠo<=k"w +k"~A7C"iF(̙Ǒ;@U6M|~veA(ccLzv#ν nՌ[KZScǡ%ߌoT`{:15ionq1 מHS:,I f@ocr&=#vZ!S%rYi7PDFq4< 7u #h_?u_Y9Pr,HC0K2n*wv8݆Ri=uFb62#<ʹг0_U5Q) A#lo]*pm.>A۰rՌesUM~U@T:."g-kJoCd(v ` cQcfYܛHmw.r"Tԅ PJsMЪ!xJg UܡZ)}Xlb=0-jsd|\Oh}z޴8l<7Wl-9T'cli3Qb MU*'u+*AlQ-K3{ry{S臥XUmVy^-`|4$LCӘO|p9@# }=^Ml3~2]#X7%ŏ$Ec GzZ-Q`/4!ZlYsf؆0Drf}**?~t`pOL% ?/K^1N& _nq3)b7w&tZHi{5ӻ"!R|f b?ZYݯVR,PlΑ^$A `*k>nU\fPq RU/G @5KXuf'nL/!IEU+gm)];RE!*ŭ$故n~ˈxj*`9O,!<,2OY- !h٠1ez+ _Ou4z cԯQ=ؖH2K+k-8TueGb_ۦ\=7ȭ6ٴNF!\>Qva R*SP#ȼ`IzFF \1Vx}&}!>WH(E!½vq?^CʋѰk5V2^_E]"Ndd(/MzB ؀#*ιbo e⣎h~H-dut ': -IlSF=n{ׯhW0%-9k(kX?46)l?*ږ-A'Nn ;tA .ng5P]p_v(m.w t]>uY~]e;X#5-OS&Խú| po+Ȕ16͟dM{D)?=2Ckߡ-9,q5ࣁu8;:=Z /|pOZNEj#S)@Ki9^Z~TֻhS˰zbr]Lm'LǨ$XU&J`j0U&C +EJ#w8䎁?" |æ#cau=ίjDGvhBgXg_#K, Ýi$+j&S; B8C-QJIt<pHiXȏ$Fׇ?L`UT(mi8>h&V~Uh9~Z9P{fJfm}@X1QBi-Sxa̩+$f +58LnxfCO™  endstream endobj 2739 0 obj <> endobj 2740 0 obj <> endobj 2741 0 obj <> endobj 2742 0 obj <> endobj 2731 0 obj <>stream +HWko_o63Gv)춫~)[EQ΋3PE gǹ3eB?(ٛ4{ߜl:CTۙ*afd9*7gu]e!D5Rhi^ߝ]ݺ̇}Zv~xs+8̬yq (7s%N`2#g8Ac>G)0 pU">,#CHcHذ`aU|]b +nLaM[ۮ/ł'%ɩj(ΰalN58UAxB{~,o鈸2s"9 +>>S3@A 10=_oXl*r,NIȹkm~3&ɜqyzڤ[eTs62է%CpVx[2 +LqévXBwL1(!20W߷>)$H鉦fKW W٧⠵)5X1gPT- +b8 d` fK :0~0U %Zs3+<é8ol+VmȝMSH` mPEm=Le qB1'ŞdܝhdfSPwt Ek꩓iŴb0A`x)133לڤ͙g1-%20%N|\MA8/ +e6t1hYUw qU[RY@BX{b#3D9VjY#O}߆Ϫ*׺Wc 4YH+RTm7\ k"*:) +Efhuw +0y,'&:Db@2ӁBw`0GLI]%d|AQfWz~SEӠ,[&VXx*FWAq/SA2GX]=7j(x2K{L·`tg9eZÒO5dǥuq8yzh^sqŦ|%ei@#\6R\.0T6P{hq@N0w!}ma>՗nsb_̱z.yrH6w9AZpMٔ 0Uka&mS~98 +'ġlN(c# +K-QxMhM.͔?^XR/mih{U}=֦!Nݔd0'e[%S?ejp8jl ,%Ui?e}Vq8`%JPHPQvMAIdUcSaAG^n ;@8ڶiOnh~A~)2kv<,w6$i{sm@ ~,׵'AL{#aY&j.J?q!? +J"W#Qi*@ 0;jwҙ)橂a$ȕim_b]}loi)%PZ@.J"HNɿv-'_hv>y^"Ǩ wzYd)b2E@#2qic[P s4j:/¢6ekbi=i-hb3;^9yݽ] +ΐb8:m]"$V0k9UeEIfmQ P^& L?>U\O~Cxxwd]}[C'E4:ygPXCyYw9t'{,g\NK\B/pξ9V;:v$y*wM4*jn8zetv3Gy1B9(O R4ʆI߱<{QtB,2lH @qK$ޜk 0 +u$rA녢Q.l|Dd127vęEOhEnvg _&R`A (}؏7SC*~ .kt) vs⊸:ha+ȇ#N[c<2fځޅAJK;lgIR^::cK~U9MǮ[OHH=gH*\}R*n}{ )83k_}(MFsr͒a"wAx endstream endobj 2737 0 obj <>stream +0 D@&W D~Z\r T^f +(I#Er Μ+4fv#ó}_g2qն xOa~lĨ~Y1Cwu ̳˵LSdk FDh<|P==V]'QjRȻ[$Ԋgҧ%L"}hvo^ʤySDq&+$~ X.-GR$Yg)Q Qf"њ]"Q5."-QW…^0⦘<`V B^c: @>CL8=J$Β6JgFG2o + pR_.p3DV_uw#J 1dיM‡8i[6cZ'ARc݁8PVNJ_1QaxKbp~cE=!SWWPw +I.G^42rgKVô~ )f*-w|Jf +-׾g^OMo +K6Ҽ]Xr~fr}6%;ǠP}ƹw{$;/P:=B 'kW9Psi|6L;\_6S:B]jM1ÇQ͂ +*}L:tػYRoĜd;D/y&tIlMf2a9o7oy{[z:?3͕HG=xUqV#K3ɽVݴza^{p^Za뗯7(FP_{;9y>l0U"H|[6m uysqFB(Bnvf*ed+c.d^6sWn9{D:y T!@iQ8)T/ i8ATcker֦C@}P[3_x2Tlʃf %*=ҡw,?d7 /Ry92jLo!J70QsդQj$t!K?hr-+Ƙ;wSBA1$'޻s`,;AfrU@clRe + Σњ#  %9D | +;X[vŽIb_Yd;]Cq;j[AcKtpiٮGfDs6;BBM J݈Zc Yԭ_=Kf)v-dVC=` pMiN=@q1ef(h~_]ϼ)|:;0#6pfc9/7B)n)(>#Ji^P t=Cޗ3PC h Mt1n6e>y~p'΅GMd55y}2w}6r:fWweZCIS;-@ZO_F]2wQ'o'1)b'Kg&hs]Q>o e20c> 0}k&yhyf+L-Gqi~=~BTMs6'b6ePbb.jN +@ Bgsy BsOFELLK:Iq,A#{6 qݬz}NZQs0}qN\~O*Kmo.l[;CLh%O1 6&I~ikB "-Vbjgc5җ^*$ Eۑ>q`E1jŌ;#48V(UYszYA*UAFW_hۊĊP%E JlZ/xH$% i;VQҼNS5U.d9H!p z +M|{G^#RPR$"$>ȊMOVPfmxR Ae5ܫtKu= țstYK.~3-@fn׮%Y0 `#T.ӕ*hzlop,Ak~z~3u'˜' +R'+=OԕwMez +K ';Qb)#V9Oi 8qYP2kZ2$ KBcԾy,Ѭ4<] ]K=Lf#G+G +-O_Oz.lF:Ͳs =J~Ue׏]W+$_'YT񥟖7=y4xFH JڕV7@ eGpc0 +_m?N8=4r82~vtN<./gi\n KM pƎjUKfH{o8uoV!kK T)hEh ו7հ&~JBRcJO,II0)Ge]U#(.lVFzݒ]йہ%HBO,fR"]YH/NYsk=O)k\OM}}B<Ξ÷@Be'Zv=64^&0^GԷ>JI;e5TXʷD^'쳕S晰k4w qEE jYک/@PNE=&mR%/ /A7B Kї0*JkANi\$.vz?DEΚ^sȀe.~2 SE^%*##%mrUkL]7w-aS @!D]w]{$srB.hXQ|YD+M`m|k<-ZI-C/`]|{<9ӎ[pw A [֘KVf.yRaЩ)6jm*U>==tC#hjR;ʥsi}Dygyr5/Lg)Zy=BGB`?}iИ٦Ҽ +k$]^ZPD6È%\AEC^ A!hOP;~ֶ}!;~ԭPz#Z2+'+.$<6@ᐐ 棑Fo®Cbi*QLC06銏(qb>KvC+*Jq/\=w=9Ϊ"xwM[|O#De姢9vEoLbzʿ{'k R۫[&)5,[l:HG*i{n ,wCnY8я(FPtsw"BgI*&c]xHBP RYIs<[~d@~(!@s{r~+o=O.5Sh|F )Y6PPW+E&,wWFr8Y:'g+Ff!W0ᮌߖ5uDTY" +h9 qO>atq߶i J0Z~)^vC6Tes*:BS>N/foɂy,@gzכ[fL}4^ٙU?Vf0qxgHT0b%s(ss[MX櫗'v:FCt"U(M?uk!#=ߘu9#}z8\TJB>njrg3Tfu'>Er<nۢ8^#d0ONWŁ0\5*~QbM{G +]ԛ7u9k%qfMe_ێwt\A$e$pĝ.1+i;(uMBй=෌<^?Տ6sJDH5kQF785ӈm_#==| 7Q8[sĎcSQWұ0VӬV 8+q!%d|7<=νy +&vtIs AYHb~2, jn @{\y Q[9~"Zu;I35/ԩr?n-;_ŀ'E+JZM@ز~CY 6C!f,DHm&Dr^f5-"B b5k VcX4 뤘%}n$(a+l + W(.[\bw _O?JQ= 7T{gMJ;5Փ.R UP/-)'=>ŨEA Y\ZJU%c /|Ҥ3z )-Q"HZ>9= " YB<)H+Oe}><,8cHtl|ڣq#̋ yB ..s(5-t ݁$*9 ]i)=KPoUs`=N%S^]2* I,_Fag dE'6\ B dG(D3)*>--xi3)  + ++kȤ04%10kDX)|[6ϯy.tϴ +Y;2 + jR//-IC 89RM?N gQaYuˁ%l'ZՃ.),n PfƵrѫu>+ᅋ +p ມp¦ډs;4bejQ^C<嬙 O„܏\yq=.DM)j'd<ޞKy LԸ`Խc;` =jwsƥ"9" 9⍜fGGG[7WӢԲ'f[Hܰ֜GUDd$$)X :.-b▗e`?YeFhXU3gIߋqД]V-9[&=EQ$#h߶i_Oaw_Ӥ%tKpOQ;_O<`t=<&xđV|f9dpZF/SPa(ՇVHύop+>U  AoKRMZg{G'\!Q_Q&L[;qWj5how/(,6'<^YV/V}aJcgߌ@Q%L0pL/[x9&ju?e{Zvb8Z sIHp8h&*ų]wADb"Rn@zݦdCAr/\ +!XOG]̋hVa|ӐuYRJq|?/. ϑF(9->X{0YyYÁ*-K븦yl%eJ$LC&8jKCӪJN=3~E{F0;d9U,zUEP?L""ߗpKtED!qf<MLwt8y;µ1~Punuh]U.v7'Go@õ6!b jd7ʙl +r+WcC%H¥}6RbAӥ 4wXƕFÎc,$J[*^p4'kdZ/0MnZgN"y:9| hv{ďM:lub栝 : 񱄗_Ǡs[ՐI~8 )N pfXgM[Dˉu#A@L2鏒h(S@5Brh4{],(}w`9! *kR֊ Ⱦez- z۝ +ͿWƹ_$KSB w\ 0f# BpDD[E(EK/$Q R31>=G{>ƺ[U| +B K'5T-Sд)1n韊GT\_*,cB_56p .6mryikcS{`~zѭto胻0]CmZ=r'@!JZs-Xc\Vݟ6)cx;̤qRtG/dz)u![5pf\>@UCizps^04@I0ZWy# ǣ\y9sk 5wtb9y*N!CdWl8eS, Q0?Iˣ UwWi~VZ~MD(fWw;=4emTRuu;;3<51yꪟtQ?%Ċ/0HĿ (Pӷ-G<\in2Ԣa&*Ly[Pnr:4Zc͚뽺P]+K+o6To.zHmo}٘06)Cmi +ha4lQoYE!x=${~ͣ5D8A;CkC6Q]ij/.\)D FC*ĕwZ* Q S=_P32 y&T8PmݙYv=%7sEEc9YGQ fr)#R2m'XOb]#K3y %Gfgb\( Mth/$RxA| D׆YFaSO5Ca+\x@NxCĢ~`@JhhSq J\%4`)Q3c` N*ad3 +XZT#AT?Y~T<vvLf&fZ%]\q"$7!x|U["@aC3}`A +īPhNń&g=RBMr#EK3pkB7$%H۾ڬ5Zl=1`NN+Gg{4E Ơ 2w%@Uƾj}7^j.ȭKܥ$wg=]+@!<,N4ܠ`d. & +޽ĞpI'F״6ٞwY0 ȀϚ NV +},*Zu?ErY88ާ*H|qcr@@ܘYM93ES# T٢d)J:hUКrP2H*@xLBݫ73:8~{au*.B2 6 +TV~vE:Klhr=Ê3SC|jٜ6׏oU^=ļE}M ttyog"3+Kw|À~˨dE`E8ߖ^jY2ܥyxZ|'c%M 4ԂVM9q̷5>u*OFfgN'ZiNvor|WB^ZFoNu#V(mUd &v mR(m\|rUH<ɿ'A +d@b tj9VMJOjwrwʏbeU҇ R,-X/ԅigIw 2*U mp((g|PE#fshHGs<:[.c"C!ЪO_{Q'uw#B .鞞Xe_^`xJ)Ei%DYuPmZĹ^g'8V Y%, +6&$(Ĺ^s;@4$a`> +cM^t^漾aQp1u.E.2dn/*HHeX.5o(i9kc- r3s$hfj[ hEj{b78q}_VT댯hB;q%{VuA݆B`%n,4x҇Zb̆ULZ1-Rێ}a! .̺cEfw'뚈T*9Sߙb˘N,K*Lgv}J ڑw휱' Mu\[ם?L"[ ]ʥwd=:]>T,k38ߤBQ0)cum./}?HEmSنh)񃌼2N-Ӫ˽y5;)zo<_GJ19_9/ +r秏^b}әNMիi=]qC_yRuJT}(A{~RzbK$FsVh %gBaE""|ҟ9gǪihj~R%!RhLʈdRJyU$Sf[/TvfI{{vvOG[gQG6=3nïbpMJ1Q 21 spV[B25k&G:JR{^K3VW +0CV;D#ă`J ϫ4eƻ>;'Ϫ@$Q F,=Ua=gFnyޢ %9-Gu]Q 4M2r(5"ݳc u`Q>3Y umpLNC$|W;%+$=TU<'|/>Za1^zt-,eę=.࠻l~* +}lN$Q IX[_P+jve3_+g +u*BɒU[ Z3a?zeE)j "LV4%&]$>dbOY G\Xm-A,4}=~ : [lV,"fC(FNb8Jrh>K`sH-%*@/xzO,[)Pf;* +$u}6(rO~M39bSE^ܜV'NRHq_])kQ0GTj 35&t:c6z+x.Ж"! +|rlu_iwLvڪId'' AR,mvX0$L L b8Foy?MV@?1ɠ?Dʯ3d7_ 6=a]0`57|Z-[D'#qJOHo&Xb@`Q(!b@9vs=6 +A8'V#'Rg +y5% C &v5*( ̅H\N#XmO`_L•C m>B >DsLj˟3Ȩtl*evH8 m6aooYPet^B뿊7JS<4 +ڿ8|:#'m2&7"G+;mh !t|pe[ݮl^%x(oEYԵ"HBsp)^)V.|u` Dަ^fhXh8zC1+ED*xnlqwpxiy~'+^j;:Vٱ:W:-ƻJEG%''__rk]$I7U@ 4r!d.|` ]|w +lGaE|[^b +<[AZiQ4'#(+ "+Z?H&:S|"7kQЕwnHjlkvRc"xv{POw hݰ.?cYBQW@Fv'L&=๪kG^0iOM@49#d4g.׼*HwdT=p +9<{{N8vgDJtjDL!(LcΟb!:S.E'AAfh?gB'xY&Bh@}c!IÉبy'-:r fi"K;I+wB->'1(͜Ke1?YG o_.KC݈ ̷-%Mwk+h2Ki"_۸n6; +E$N8{kg_ f=m/&t4ubޕl):ѽLes&;P~ +X}Hm˿ q>ƒP@ jo̰HPK- .S|¬Fl7ӕhkbv +鎰VoG:]2b"|;]}3 OsnndUޖ=9@G*5pȡķr +ET`u +^pQeiB Ktc"($ vQ +0p'ع1Z*c{~/*I~Lj+6XXǧ7s!l`M5oXhu ?׿/ NlɆPLmڗUr/~>%w Ouo54 c0x +#cB_P>W1'B'-"oj}0P5@gqm6X矛tN=dWsE:yyp0@-4@)b vx1uRPXj4Ђ+fW*nLdndΰ!챧V&L^ sFY('WC#Hv8tV=cL J 8`6~,b0Hjq<ưBMY lOf~@lZi?Tvt ,ߛkͅ%6TA\%(3 +Y1VcwC<+#|Pr\MƯn#S6+ܰ*"qUC~tmr,[WM7 DJPv` :eZ~J?3nǙKel~G2i״C#zZ_nU¢Y#) 3j*c!"Lj͖'OeW-G 72g+  (NWm;=ݜ*!+BI +~0ʣ-uq{zhйs$nikP"o5ϧc +( (D$O-yD?¾XB9X7 aXPB !핷 `iF +Ǽ3f]w_BD9ml$ȖɮyQ\<`g|I&%B;6Pj%ڋ\F):盿{͢* L7ggxg +a#Bce0ߚx+;~bxwujqn&<\|*ǀ\-ϋŨ[FD7{}Ǻ`[S w̢e!+KyDz3+]QEKZ W +@ej(;jl5MmN89dه[Hm.I_*V+&>E=X\9'P>ydI\CγxsUtךlH]Lhk1thxfj 5kDzHsM;OZei[Ul<[<997"ůG糤Týg4yq?ƃ?6 ` ܣ%[zїI|DxFD3MYXOUoc+O9@-Q2x.j>bJ@3`"NYXTuΆeK#V_I&^|NؘC=G~\@S2{`9@ZZ"P +qHC,ѤfOق s%,rp $Vf8bJ\C^QqSAkmIW; ݈W袉%]j\!7M#̭/&M c) W1ےjD$oAn-\Y6ln|S%uw f>nW0Vʫ綜Kc0ZiIXx%"3v(I>*gf eDâVGZ- !siܬ-=,vh>R' +E(QbJ>.j!,KȦPw ~zEBi rLQ[*.gDV7#L !6RZⶻD^3D_F؏N3 +ԉGvdTjhAF!z@c,QB}'ÕP]awZ\l-t&OK D"/Ba^&m@C8X&)ȫ_*]'.lA6 4MoWҾ GQ%,#/Ýf]`!e!qL0*^Ï5$ +;fíIgLbJg)$o(,,ؠ!h |[/k :5,! Q" V6mBTrmFVjA#L{b[a59AzxۻXڙ.&Z7A]Wqg4@`ÞԵwdFB7NcՎ_bXDwQ$.J zw PFur]J$=Go*:e,/`Aæ[ȁr-ZF;jo;{}J1QP LO}@Țh$?œ2u[R^;=Iy7R]Rb\,?jE1p~>>g";KOR|XKv.?A0@ƌ,Bh \ w@`\S1iR"Dj/xRY&)>Ae IH'FL ig15JT(= [LqˬK Ru,y`ExW ODoqJge஠E09%U._C{brkuMB؛M1J$,𓩬>C]Tzb<Ub bG)HfwѴ'gfP$Kbe+jR"A<';*?Nm +X)֞Ux;QQB&a=clz:Ē(Ł9M8N F<0{o(V LmAm$6&M٫Kun8@f69u>0Ҝ$x5~S߷^ QJ ba[%Rt%G xw{+Y/ڞ%*Iܺx6&E- E:} 7.~ 3}ȥVqhxx뵌x4ˋDr$>XhMhpq(6Y_ͥr$JS +':WHeSW[5K;0>˃U-45n?柁4d.0X;Hfꖑh.ZBEғ%1AʶT^Anxp8٫Pol1HĜn_jeT8Ըqm(<,C3Iآ>1L%;1^o6μj5M49.<`{5V OUU]u[_M^źkř z}ׯ)(6chA=idojANXCfX( pPPfZuۍqqz@(`u?Gv7,Jə;r5]TRI#U emM,H2RUؑu1sr@NcN/Ñm9grSy܈&7eE 51d -潣=QghmPr.4- Gri[u)ج7C&[:)~+7DMI:v@sϒ3q}{Yш|j){XDATBi.LyD7{fW8mB eD5ķpUoR_>x/*ӹX&\$9;^2D *-s +_wL:8j({hZU8S)C96T7'a\CiĘviV&[J +C r|rQ:Ca,ޡ:ЬHG/6U/K-,{4ڷQ 5=r*f PWʧ bNt%h^Jxtdcھ YO&pdf;qѝ>8I܎`F9[e1d^1H^Cq|_K-\S6S> ( ?Y\kv0T e#!b=Dsco2+G2}L-^pO, [Cz7''n,J@_D,ꖵiRF칖K4XnW sH 4l%6&h&H0᮸p]k8U׫i.O󳩱㻼ta.#NXvR,6BB&6PPf50([$ |.:bWP/Q +9BymhT2[k +ѩׄŻt* 8N~Q?Moчa,_ /(F"$ZLb7cU_1չgPiAX.VkV~^ֈ 7E0/fSJh]ݻċky*(~;C6/:$F)|< Ξ&c"3k[=0IEALscoYOA1 jYS>T +6?9dD,2(VDuƖl' su&],)V~}iwŚ[T@m'QHHrrZK"+~^#uT( {jCa!?q\!~je|9OD"A|Õfw+‘U)| ,.qxMdL*6*Cy] ^F?BdOt#M{ +f`No >:P`5m?Ů`/ODG?fF@ܞ){zB<~y . =]y +NԑfWHgcɖヒ74SlYH2)퍟+5Wh`"T]H#ŤJUǀ:Uh6ӕI^֘v1qE ϛ"xKѵd&;VnLRKzbcD2z +ωo IځGJ סK2U yg.L1QRs ++iN]<DQ^ؗۜ^[ZC%Y!R2]i 'et0&pS i팱N'|Y!QL*,. nAG Oy`"`r yiX`3ĕw0<˚6ӕ59R;jsrE̗6ӷxꛃ5M;,(r +0H=/A7sݍ+ \ [ʤc`mqS@ %i endstream endobj 2732 0 obj <> endobj 2733 0 obj <> endobj 2734 0 obj <> endobj 2735 0 obj <> endobj 2736 0 obj <> endobj 2725 0 obj <>stream +HWn7}W[$y(A! l'@XgZٞ-fs[Cdú:U+ R'dAG3F*xz -~\꧇ݶZ?}ȏ?-XtE BMaIjJ(RDїY_W 030N8VxlrTḵ j`XoԅdCѣd8F,Є\M坩ZEh&eo:VHGXn\LeK6UVPEhtn/w'GTd3r1ms  3N=G0ʷ~s &Oh=e=\H:Ĝ+&RNA`41(Q/>9^lU FewBtߧ&KuZ_fVR}Re:Ln0)B݄27a ؿM.r.G죪BT蹈vYIu eU *["&hέ \s{F<qK-@UeR«+Z՗"3$d}ߒ#5fr$x'ɩ$V azpn"ELͪrjYG-eSTmդ3eb#IPI4HqEx_=Oܸ20;?ShɖBkV>Cd/1 yc7U~s~$(U:}ٴ<E #1IYW@^ 8c">ͪfKxDž +B~D]dn\O^ @E=7[&R"/[jS#0ԛUt:)(XPI/[[3\ܨ"Au!=mmSuKbF^w *yU +KT4fdwI1xCr)u3wm,^ f NT@ tP}>D?ޕ>|G GC%U1bLJt1{W s#@>dX*WuߵNrAd3)Pj[~y:۾S u|ƦMv(tS9ˀ˾2PV~|gߡ$J`>C}|Q$/n8W?#<λ]|E6?5V P|1Zm +X"/Bn_u@iH->4BjCs Okaݲ缴cs/#k`+ ~g 1B2No0c2,ahx2ȻBPf%(Ru$לQBW8Ym ߜSjS[v f„&|0>P^:Ea}3b3nF23رJU*>pqDZdHrxAM9"-'(d-LEhE*;'tl$fwN(R8hLF=ARCeqB8)`XIP"0(N% _U;8E +H뮭^NEG+%6_S!!ж +=E ]tO ~6p-Ǧ%MqW}d} 61PfQ-y]5&/0)l@rZW61f|>d*:xnZuudl:$SK"Af P.XSЍ &@RxeT&]zH*wߢU |&5|1{jKAԠ‡A6ܻw}5lKӘr\ߵ%PÙBMJ9ckݖ_Nj8J~(gI^_.SG,w"3AXr=ng 7eB ]kޜk QQm牭p{F~ȏT _]ljнvPYML+\F(C-$,mU/»LBu|nS`Sr5}VCm Ȣӹ4$ gPu@ئ#o^ѩdUJή4U_Xa":{ j̎)jU;%ج°fnNG>CǶ>.&, A(&ġ3-P6XܯԉK5uv :)u:Uԉ7y,2jVX#'aԚ@l%:A8bi( A ZY`X*:~5 66ef{2sfTnWc9E¹i/-ek`6,DH:q2 }80G,M,~UfSf;Ķ|v"} '1xCT{9;:k7_L@9_Wh" 6N&/i茬MZcKɴۖ*g+JM!ٕ4;^WK69Yo9!"C.ڵp@7!ECkˎۛsF<{Ngw:@T@ +Mk) +] ׉Ԩ&MFj6VO:iN WZ^?I,+/ iE*is3t( .l Lf DRfNooa8sIVNkea+ퟅs\: IINpY!;`l +FߞAIC֕IG꯽ia?t;>fl<ݼY u(l ` )r3@Rҟt7,kgk \N)9 ;ryͲliH@D "=("%Nq9{7: hS_!c6 +VgRL֔jVCWКqvs' eL гq.) X!ij@(M2>ME("sZcWyh6 L:kJPW|1^[a86.Q4Dr7gzfe$u9 Yz.anb?$Ymd/b/͸,jϱȴ0+FJly8.rstz@ǤM6WܕPƔ`J0=T> 'GLP2%[cx.D=/%pC<7gd^ qj*jsp<W+ ?!"  JC9nQ[ +<؜z.$Y5a$ +0"X1tƁ)5vg(74SlҘ `z}MU'k91m<:xr/RMe)vZ+h'҉I5?}nB'ct4 ۜj:z,ddnBTm}( +6qhtsn8s K$]oa~+eRStўl4F[B.W%%0?Xe~P +\8Ŀ4( :*rAptmh1 5J@pA5~_G]|$)l9^"@Ÿ+aT n?V_;״8z<4%mVOR_V :؂?zx4ThuYJMi~o'a\DCmടtFߚ 0 endstream endobj 2730 0 obj <>stream +0 D@&e D}'ˍ[^[y]-^X|bnI#̱g! 'v/4\dnN_?YTuF?c74AhVB}E(T='pTXge(wfi]b ^#eS"/.8k|G3g4,'\$Z0C&"P:-M.{`ݳ;׮qRs \B;m^^Jቑ +!\-A;k7] +gC!}!gav$ٟp+F}mk~Qt& 4C2Y^lm-^zろCd+IDAr9Zpᶼزl]xZUbAn‘OJ /͌ ( Y2.j :zYP8;+$Rӟt-$C$ IQNswekpaN?][-rscO_>:͘{^dMZb89Zg? +19# wT9 |νbb֫e1pl4CCU["ԛwlѤE)Owkp/Q_9H~}u< G$znel`a't0)qRȷ.\CYv$@YVxwji#e@ A[zQU~Q~Q _Jyz 9Ŝ W$yPdYSKՌqYAt$W~GÎ AaA~phO-g!08[-8oT~;457tC.No/{S%(; *sqAq4ۮ]\}HF _ ٕC3GB)e E)gu(YP)m\+h:m틵zfؼKnK٨3 )RȵAK,,㟼ǕK ±")gZN&6ZgittѾx儴墖1甅 469E ե48S#8Κ=thn7єB\A$<%lJps0KOMhԱq?ӾOuPFS95oO=nZ1JDr$~}(.;_8lv `$\aH2ט&rϣjWz6*^](V! +Eh2FICq 7%t>2)^𓎂7Wie|S3>Fn#+ |b!-$;;Nj FD[w_3jLQkK5cقu+SƢ?ˊt;o`R]ps!sIePe׀2]mH@R3#{JdM'Tb4X\9rV;B .CVU40jר Κ Zɑl.p\=p.g~&NsJxԶp#|̎8 l&T_>z*XeF)zǫ @2Hίb-͌24p)!ȈOU& OɾڸFA4q!A[Rh{Ӫ˯XzF;>r J_z_ZڳUg`ԛXln1͞#"99q"Fh~I?WɁ l,EmL>g2{x-fc̶.|J|oeH7E?cd$is~]"2H5/]7qGٚlԞH40dugچ_ !dn9SVNX7<_y !a>ZLb~PצRmeGt.ԣP&'ʧMu3:<L`L[48o1GO2ImjgBzڰ 7j_IRphg1 x). qY+9n搢hr#k[Z^Aruk.s{%"zz8 T{`ʫ(c7d~S8; ­/zY<-Z ":8rS5(Tsq{Q(h<((& ,ZYWlԗ~5tL^ ҟUjs&ZvV3:_zz&I{[ws].O67h af,}ɛ o0 ^r*.Kel,N߳/lTfCjjl.2L=^j<[M{qkl6Ȝ!]v14Cҷ=isHN'/x[E XXIOưMĂ1 P|3#X!cN[+.̼*#Q$lX6అlս%b{5B(Dc_אMFAW:ͻO&}\K25 a<o!S4 S:e=1V.f@__(FЄԈjx5²*Dp{ +|r]$eHs̕C%i΂!h/SgdH]0W^sjVЙWw9 @qՏLr"l"u*_ @;;no,g[qOGP\+W-[ &0M ʹl<7=-;uwT$5.\EH:|u97eΆBj74 ow;ѵ6z2ը@ӐN`o!z})MIL7vFs ]CyH(wi+v57;6̪-Q,̻v:)2!3F}a}Oo;FF#\ioúǐE/z)%0o5K'Ֆ^o$`8Vn'd]jMDu sNTYϯf}uo30cUR ?bRk;!I%ܻ(V,v1+ۏ[ ~N 6+QDf^oTMXxgA!䘸"iδ٠ͱzBtmSvU5LJW(wjA&q\HМ ^Ov츽T۰9|uQic\Y)ika~T90*?>x:JMӣ< Q)Q_THUyä7).pYOkz4R<(x(Z9WZ:JJqI| PxFsVJӑI[?웻(4*1XPі@F|yS>^pCK[3\g$^fq( kuGH)PY! + :gU]8ݨox#e~LU# /s:.H)`b|nxۨA^^9WH]ݥXcǝF3u`c.,g!Q-CyXV)<6pE8[uDFD xŹ` ]b][] ڼj۩oCtn8FcaRE}֪58/i+/*jJ6J`Au$LIt %?8FuPKQ 㦎ZdKXp+%NQ&(3Wk8\LMuNw8#z4$ـk +lRRjG}Q*ozOo-(vRL>Q(&¡%:n3%zЀAU5ڲE{praA<.?P-G-%esWPœ١_93HөqyҜ'sg))rkf e&k䁕h4~R`H"Kb<}*Ӕh_V {jDz`+4ʃ9i>4T dG91ZՂO tϫ"w?R8,`JXkb, a9uQ.$f;LB`KzH*&RkL?YƉQE1@|WVO+& +@ETQ$+1,XzmE )Oy\=wN_Z?k=HrkCJy*2;H  1LY.3wta ++.pE5^/{C˖hǚ1~ε?Bn׸1Q'I +kiW=CaJeٙ 3 ]/uXk ҳ>X-ŁCL;Z,Єդ T`e,FWbS?m'"ld\y>;ɔC]§hJ Qe]sy^ul?. lϽ8UzkX܃ЁM%8#V-wbٌƠApjp>H%R4v!hrʤo)Zx$-eڬi66סGe+(|P1Ǩ`#2^\V)Bx3I̿\Aae,& 458"I7A`:a!p:+^l͐]!VEXa@bpŸ R:dwieU&j;>Ca,!%WfXTur5D|( ɻ^%FzbSNTxo-l>D4OHNs!'@%[(a-YB0uE/׊(> 4yG37>&o{:ׂ4YhHޯ2LbWc)NkV.ފXd4c8">F~E śZNR5|tg=!K?`0A`Ub׏hyUAj5Nr}:{ 1: BQZT-P[GՉ/qW'2YoLhO@-Hnu8q-ęY~yR-N0Ȏ0a# T]&k! VrI~DG/g)%z]9i3+$\>DԂ?ȄXmJ?va4,U5*Qx<| CpgB 8fٞ#Pu5eI3U*񫸪NrA$y@0jF~uIYJ_K_Ɵ/=5nI%\P%1 [T ?ܜOy¶0w0m"WtYoϜLD`Qiq Ao-rg^T Zgw)luzg8Ȗ:enF.{l?;CTGKZr6fRq.eCBFQ01+7v7ījtTMCCMl@łcc3ם^qѠ`:d}>e=(7v~z1WP1Y76V&H8lQ KR,켢 m@i +>oȔ}t:1:|li࢓T?:}WA#?\nWukU.o^ %_I}8w=&KDYڧQ:8R- +aԪo%.0J{0ਜ਼Mx*Q(O0 .u?2ˊ:RPQzpI\qES >^he=:y:zyu"QX|j6!,R-Y !{:!W6xƷu۰5ak8##c(> m˅JF f)ływL .X`x =VX;e/i\ћnJ|y[RlًmX}|)2`GC93ڡ` !Gw 1[,]T|?>203|_ ԣ\¤K2K1ק-zԊ.rIA?6N /9D ETQ5<&}d%'u8l +wHR4La<r8r*̬F[̜g ⨀APњ+-Z +L\] &my + ͦ``bU/gz~jɶ1R:1UvK;R|(zP6%7K_^~v+zT2=g<ᇿ l}N$!I.ItpdV!e BJex +DufW<#YM9idDqef <8ce9Cd( +EFbIپ!_dH_j,oL sGj'՘Ęu*}R`2R(Gt=ff&@;;F,ճ#!EP<-O6\Diat?RTegìk2#"mIѨ >h3n!Fdp)!\͆p|U3.-&I6>L ]{"BGmץo]u\my8^"A- `ܜCNT_i1r<(t+RJ%5oC=?-4'BA#bQ&z3\*LS0Q_2^QZI/k^#GjD[jijjv!xuky`XcI YCHcIbjn(ksvܶdߣh\;n?1JGVF>ZR}0YSHtd.eu:6XK25=juTī4:B HiCa JكAx(1cjh<۶3"d7]<<0JSBdIqX +x?Ϙ͙Mfk q0y6AGy0FOtσi50P~.em -2m&7Q+\ +p4t\:p^@ . O>Zֱ(H'0D2 Nz%V?bA=8ѫE$Wro~ߖϩ>:j'wC!Sme&D{:b鈰/0 ++VjʳfyO /'#5ACAM1׌Vn!-+101GPJ2k>?Ʃ4v@;H[%rw7d$4H Bx/4ndkXq_%R O>i#w5DwTo˜=r^q8VFq[3]t~#T +6ųE 9a^}1Cf4^q58fG0̑+bKpӺ;<.P}h +p_ ?Ej)d (pOP_|=>D0R,§IU%9 [0ǰb` +l};/z Qz*zkcn2Ad-Aزz F\a,[^/,4&|h`=F/6CF.q@0MJX -)̝@eȝnl͵/O'ElQa +[c$ z?@<5uyGP;ƸvK~OM}^U7 g6Nj4켬.'ql35{h.ml[HeF>)%JmQG,KN{D%+Ωyn[>USjkT01oۜ)/p1f9h ƹHjO㶉&D̉|l91,%1')@)R%AHwB ]z!GꕛߓӥjEl`<8%esBB5_{T %qJR4-%Nvs J.Dl6?'i}KECx5/EC$H[K4aM# zԦL,O1,ünG| +cEEͰCT~b!AĨMPrfWRӱ0̏٦h|B L٢N8V+6>Ǩ7 W5|2Hh|LG4>"]ٷlG_aMy&7ÛFrhJ91`.)!zܗo]/_߁t"ɾΖǺCU +=!Aay`/F-nsŤ6YZL'(Ut!"W5X7Tq{z+PtXDZ. +iWȓv{Cv c 11t̵]zX8^ABܳo.r:}˻;ibzգ9+'@'A yK'/F0AdzXZ$ODG 7mإ͉"nK7|wV%G;dp8}b m +2=rFx(Pg%y3$J:./ԱCxG5rVēuE"~Ʈ3\|| +'v7""t َ .(]~H.33n[KSZ⪇>ZM5 /#؉pnMFfhHJG=<)uu D!<:G 7!|Bז!xZJXǧ: }3_^7xxՋ9HA +ZekM{J )J#+1Qr95j5d\KHx +* oh_tvn"Xn0{I j=푑Xάxk?rù8t+8i"sI %}qA&PU*5$8$ASW +ru=Bʷ /lNـD$/Y8'U+gba~@eKc}v+n w]͍;= +hDIj'+:E`2St,5++Bi:OA.43A:^w߁LaۛܶڍL]#/?ԸD,R!Y2Zzh\KZ}C*p*5VaA;a)M[BIpMzn;wAG>Ep]5 WT'咕 e ;aʴg"Q'*8$$n YlwiCMͳAuV$}D"Chv_$C8@~7 `>s/нWm*8$ w@ gdZv2k}+ڼ,! x"ZD㠼P0O:fNKk\W}t'a΍G@^S̋0npXj@ZnɅЄcGK 7s ?`ȃvlqlRjک 9w}dڴy];tZoL'`4"RjCm\ S$pjCW|1UPu8ů-)'XF8'2Ŵi8i%|{ku n|ܡ=@UQ kf, 8y*`9<(`"[PMz8zƟl x}1<'o *#2ȷ^zip?喩=XZ?ʃuQ A.B6d7^\ȐdiZ#RITrmA-4CqBnRYnLb>NE ,4,LnVځj}h󟿸 sdm&*G^ۋ +=N #G<<c٧L! $2.G%Pf&*Mx`b. 'U҄ʹ$CP~ij䚆`wPږQ=溦 +brӨ=6p!3Tc3fJwOj`x@s&oA3gvIR0(erbbZV |kܢ F+ZVb?x&D?gv>>RsJuep]S&%!#gR̔ + 7zP\e:EBDZMr (Z C)ɘV'}2Ӛpr]AsY7o!DŽǽHGIhDBþ)娔8Rϣ͜B7r5k?͉_zMd D˼CS&6) _⃨g Au;-,%~9M^ugL2`̈́}We?Ӈ^p!(+E熤t*~nZtqѳa'βC}]H6J^_ʙa6мB k' C.*G+ھzz<ھ:7S`?E<:wm]bQXM+ma>am2MK&X~T:~<+L.d`jnyWlO nx7r4]`چw)U@63m6>äQLvEn9@ Vȍ1ԉ})oy\fPJaG[06꤃Gabrr=FwIy蒪5O fƤU81(Qxwnm?~7m +B-ٮD>ykjK]fRwCZb: oS"o=>pzo~]qK/x +p3~K\9Fj@u*N ,Om7rhlTkG:tmZL#(:iߺ ˆFpGe#mG(?,^2.wTpР +u`=IeQY!:\6鬒L A]`ų2'+$v˞@g$ O.ZLZtB8gwx&R'k/mY[%qw(uC }Sce%vIT+Z+y"RfS+~( &8Etc, \-Hp,MtKuU?m^#hjiKC8m.z(œVhwnoq]?3x0Cg~(((Iǀ )ĕ9C4}P['/ѣD^Zr?OQ,Dj,7IgFUI?epm]Zo=1O.{.e:بW,ÕJi]ț={HV e 9e*zy{uBUE5xzou2SdSϨQApfMp=] ݶ\Nm8GSNw MUCXhSFNd-lQ[_w%٣F--8զ& }tmuTAqYۦ &?064*ڠI3_I V#KZli`&T4 \xʁJ[uPU6Hv2SEKl{Tm;dlpO`h&z\Xd'dkxkQMt0߽y}ʓc +m)VRJÇ͍`=1/EUL9J(A.Oҏq'G^6@'K7keZGMek*d"hy{'4xۜk滧FIGs%aCd8F옻[ աŠGN\mX&tzR6ߜh"<]EFCQ/l\|fyӾΗ~k7hsL'ck">#]o3%̈́w(׍ʛ{TWhNW9jI'q1#D3݋wh(пbkViӗs=<5UdQ(5ED h+S Ϭ|i k嬡E_|B̬mZh}'jr + >c(-WheQNA| 'cDvvъVrikȍTUy8u {CVR.zLĥ(_*Cz$SQT0pjA Sof14Հy k僾-V:~Mkdsv{մ^*8NMZԫf{}7ld. Iq jKdS+*^f'9 Z]#JA$=(AݺR6:FURN z1OE}@d})1|G}AIS'GF%Pռf Φɬ@TbpyJea .ޙZ=3EO@+w()}҉S\02޸}/5"5*7kFwp>:{FK(AUw)W$TzAp&xo41nvxalL1}>@㝋zsq5 Uڀ΋[gDA<7aBfE1eGFHX WSE!& prlY ɍ8%nRe¯u3a$9GƘ34XSn˪K*; +6 }~す+^kU;u]:ϕݨ(>H?KFSu&cšbi%cL0K&@Р|+Ż1g'iU3YCB^$y,wXqfףi/SQzPf Qm! U {JcS]:{n(ExMRяÜLkRǚz VmpGT˾&,g(GT=/Q3]24+d~ײ_ƭ|$WVـ7*oɒ9H&cw 5M{\@w"R#ٮوqH9 eKxaSi,:h;yQt7b9pi׌1>ׯ>TNsI8ޝ11KA)6K̕B.A;6ab4 /[@V"v n 2VqRDa;eny]¼} qx=+!XEysҮ# n IZ'B_Q"-N **T,s"J3P!Vϕu4)Sz'C-p'/ӂmdV2:8Eju%Z{5N-w{P*XQTrЦs[7lx &סaCL`,N8Hj<6XK/fG&ڃ=MbTbxB"Ān,o0 +;m,t #i#Lw7rD7"ǎ~3P4BvR'\څxYDx_ <v=\[ ڧwavT/@!;OYܻy;/~Y6 "2ֈt1G$4{; qDXjMn<~@W/k,9i(|/3gX=!6|K4mؑ܈8K+?v w%nZ|*y$̌1Je:Z.I% Q-w$/O'X8|w//̯m9( {羝w|ՕcWoonfgAh>`j&));~OfP!Hywc'X334LT9pW3Cs*{xcgJ|Id M>֔U4OnT`ra0 wYlv #KjNen+FH9,mR~|`3 BQoH"sk3NId˽Iѳ5>brWn?Y KJj.匬'BKټK`>P1Jp| "5U,(H솻eKΕSF AabK}A p{,%Tb?vXm3O9M +6MёD:&wvy]Mn7{qXha-DSbe ,pq LQO>oS%{#5^ +>-@l1y%Yr.F5~Hn0ɭx,&答`q};N5^Ͻ5' 1`,3n8ljG_3՜B]NUU8\2D @N_E<ɸGvxwАUog QmU +R9}C14 ōL +HQ+UTq͎?ҽRz!뾉9?62 YM^ԜzkJ@c;bV\r"wG=_i)GLDLO=;OyHLk(cߞ8{w S{3 JoQ 6*U;/x#!ؐ~R 6w?ģ/hSQYiv4j, z{mg*lau@/W0<;9s4v+h7YBLEo;>0V^ݠmD5.WEI!~A՚/1a/1J@s,o꟩={\Ĕ9뼾穸}Y84l,8Q10 +sȪh޳u%ё̀R³ܣ逡@`j3Do}$* XJRZwnFFYJN _YbK%DX4k~.Nw@&߰5qMP b# fMzk)wUn;F?rߴ;$*` y| !1,D&RSƌkiFrley.'4jAug ki[\{vɛQ()8)mQ{[OVO-9E,ZuR]&=ܺ[RS G1.]|îY@ﱹw 'Z5N܋[#~+9BTBFSlꦩxH óҠrKg\l&r5ҳ/g.'oić@Dw:-osg.CX0T WG +!L٬m eu`~̼qH8$?"NX7FT+^d_ ֦ k\ ].ˊBxoʏG-*v@ DexD*K6U\eG@1 +P`jQ4e9=f\\&x$G&TD +m*Jcܒ`:Ev"Dw#3-zPPz&-P4 oX$ſLĦ򫬺 ;vDGc-L̎s1/9Zǵx 瘉Ձ"-F8JW<-7͖at8ܴ㸢T$~:\I 0hkN) +.i3]{4YbDgCUT`78Х:Ѻhcv&cDe/I" h/r>o婛<}/(Ŝ6TiҨK޼OLĿb樈(-=0[뻺)vY]9ypHH¸$ƴI +tuN2b[#EZ0os32++nNj;`A4H(Z.Hn8֬eX<ڶäK/y=>);:?4RR^G\VCp| ^ԎRWBTyڻ+~bP2aH" + ]IMM_LL3#mD)eOƉ4r=D?a}(:~ij@w-/3 gOm;r- $ßD)[τ~ FC̑g{'n1D%]p0<$iUץdbCM.uS,P`)au]ɕFCNu1c*1h Xaq KGr~Ǣ 0:5@> OO‹5iyN<ͺ6L$mh`2 ܋ab^מV{-u7b< rP]HWv@/abFUrYfm᱁1Ρf +D.v4)O?Juuh1%C^BdrQsRdS4Zkܷ](=W*$h9{#s~<Z@gHP$b%X'!۾4bb.J fgS>xg] +Xo}376 +y/glb] A2vXVo9df` ʟ{'qL)O<fb=n2lLZ!>OQYazkGNF+V-yHI*i=HOF8҇$5\$oݴUtk, TN;mA'.Q㪈P ۨ*n")O>mټa83&&DKlW\!&\`e).w]uBQoӊ"6sXs<ŵxĤ2Aë5&=7uh> +dXm}O Ӡ+}`>$uʈaIJϖ˺2mTVLCl1ҲUcݡ +|"@ѻcoH1<QBml0[wQU&2^Njݗ6 r&gTl{wTc2,s* 6]HK`}l?N7 %`(<̊yzRҰNpab.xPKOEQ2>ǘȷ¶A}#:ڞb +HSSSe%4Ӗ/'m7U*[N@6塞@59ȩ {p%k4`ߚ5 +&2ZI;x_\^8o IB1'9)IW& 9Ϗ5W)ըh@jq1GijL gօ=4r%Ox~P/:GkW`7u̙C3ornVH_}(Y>D+Vr$Ks +%܇&QC[w<3'hL]W堌غM|Uxz#ߣE'_Ug.nH~Ïq]&R7|}mA[Y\Sq$9<ߦ+=oۑ1 G^旙Nj?%׶,Ѧ_ +K +W<B?6GDt +8")G 6,ο/;RHhA=>MEZcWXSeC3-%?Ӡ.y9t[A{n>ݳB|qaC'#?#(V4[ &O?n`1` wxtm^ [1%Q쓘&5xk ˺*['8AWJ~?pa [\pShYBFpRZiYmz  )vȖ9ׂ!~)朔5fdU r/ 8^ShKdmyil(9C&m%u,+|/W,_Gϝ藒) dxh`\`Xg3_$o j<3©ZAkYHt 6s>e;;zҥݡyCz\֧n V {]I'8u& +PK`ʙVɆιvuhG}2p#Q"|WGS> NCEYt#Flǝ̣Dƙ}& 2+=: {QBԞzxWphѭT ߃BNDk*F'o|^G ߿|GNzk&\a!+ +^pCR'|+561JZ{˟­X5ϕ9YOtڂJj8d8RU=Suozkk?Yf,UR:/+Fv8ѝIii܊l&*32!sE˜xQۂM7JjKF7g,8uU(~Ϣܺ> $W1BXU鉏茓#$c#wB>)'sSi`e8xP0Y6g?Զ?HC[Z] qy*# s[*ilX׮$6"`QÂzxy`9%DOp"{o<,uSEM捈JFKo@Q]6ˬL%,K6.s_J# ;zU93 ؗ6^f4H +# ,m R$I5nXIN7{W[SeáʅXaLdhkLMZ| aL63yg6lr>=R۷k!FNa[#TACOIx-1 0+;xvjq˞q"f ",r-gu54pj5Km 6&nw0W4-WsFy.u;x@> endobj 2727 0 obj <> endobj 2728 0 obj <> endobj 2729 0 obj <> endobj 2717 0 obj <>stream +HWnH}W- 䶋fw237 Fm $KюSflYe.NpHNU3 +?q(KMb}5}.~0x\4o_6pݻ>.^PlټYl\KL)A|xGS/7wW?/>| QZrH }EyX`l~_^OcO$IJ?;)Wo'_!\ׅfҶPAj-ˣDLkC|[VշqbSڌM1 ض)67E}jooI"7g;0L?%D{JI>+%dqpP8X@RVkK*9ÉeaLf[~Psbȸ`X)\>qX3I'2Ez3* 7DK |Tʦ7IK0nGI))ߜ82P`.d6 #c/.aWklOb gN7.'m(Qu]8Lf˛b"Nq=ņp(+\h ~z% `26bZ &)ݮu ƜX-km/I[T&es(XHR2@}Q2˜|0v>Օ;H.qH^$6cnp9mqq8dbvK)ibv%vIol4Fꬋ2>#% j('͖bM 9$w)#*F!RM& +.dך*u"_fDȾewۛ7U2~[ݦǡكVU76MMkJPk# *`D_~$%ٳ`VxAAYx -7 +נ ]z7$hߢgEYޤR r(e0BD;6(Ȁ7n=LDDF>5N7հ ۬hίR&sL>:G6#D2/\\p8.4gc7K9`D=@w]\X3 #~[f-&[PrS͸moY.W[GHPc0HD\;lޯ_ܣ[b3?v '4Y H5^*sv +&b=uƉT>*'r"hKŵ35|ft|V1~c- M%۞TpC`M[pE/ .ԐC ]Y\fQ)PM/YFdi6Z+9 C@ !+#2 pnDr8*xˢAIbօ $5>A"5NJozoHjm-[jVϟaz}_ndy g8C~q$iq%thqDڄ Sw~ `Pg<on&c^TS̀A[>stream +0 M@&Ri M<CDa˜z;=>!U矛ko!} +(? FDLu/ɣ:8̨fC 2^UFniRjjQ}vbeW#=$~\[/t4Xl]5˹m^gggtX!^AXyݏ9iqD@~dG}m5[fU.%f ke叁1[yGU39Q+9L%m$uƢQN޵-nxw +AM7J4_?wmL> EK<@}ށ>#]ZyCс))JJfة5"OALɬD4!Dj/Do4f sAk>Ȕ;bC%⾋J_7K$ϓGtʣITLzbPbXk&w_Ur2tajBYOi/49;$j,R ؠtRi"DW"I#!BA W& +6KqmUAvϣzE-$h,Z8C +'wmVR6]z`F^B=B$[݁u;Za*G"&-I9I{>YFf!wl7w~=-TIul L Y~"{' |.jFFA1#%yqT_K0բ:F SXI2y]\q{ܤmNdlR8 +eX ۾Zi˚]R`+ٯ)?9wv| 1P v4,IV5`4|8G\3VzCqڪ--FyK9^PGV 0FIqtt8$K3Tu+g78M@{sw=[A1 ,ϿI?TO[əHc`R?M/S4yx]ZVf/xoyH{m (R}ϭp}Z[,ޢSEkXc 7N[Kǐ܉5s2j{KK*hݎRlCHUv=utM1}{ыH_Nj ~D81&Exp5܁683] FL>Bc Q"2-b~7'bކe ػ؛N"#&$#ڋC^uidSK:ͪǐ)uCqw*劗:1V8g|]5TN=,> ,_Z F҃9g2Zg^Noh%?!rr4}vg2$$k +%X!G?g|B G1/ܲ QdQ8|0ux? 9F56L)kLv,y$&Y Œ @$sk\TJbŕ6V, p?|qG_(\Jm^yO)oˋu8k[CP^NU1BC1_a/OEB7uIίk?Ξlɒj#SVjշ8kF[hLˀd7UEp2屗@lB[i(6S9 M+ pW#/[=PoDO| 0AW6 u_CM`jMF'6=lB6;LfV?C(}Ur'V%wMo:2$Zz/vg ]ƓUgfILk2\7@\k]=lZAzQ=eE ';5xhy|X|}6zsh^y31y32rB%쬁\_pVwO ]]<7z c⟍}R㈸sF//7iO!pԷC ‰[%$t<{~po=# +@Sc2FFB^dkFɦ0u`g"'hmnzt揝PG,԰OTJ +smq$bru8裾Akٝߎq2)]IBC9:UF \4KiGѣc[k]LxR,EJ=cYT0`ŏę^uf>zEŴZ ޑ5 ֚ UU~TǾ-cſ\,%\h E!Eّ[`VTv˄*]ˢ&K%@0;~)S 4`O T6jdS$%po/H/P/M }FW +&TZ0LTJ#f׼HLT#h Ylu}1`!`@gE`Ȭ bl&2WWfD#9c=[!Eac]pI;Lj0*_s-nrG}(71̙{`)/0u>5t(Z wyv3-_9G4@ZWg7$0xatIŰ3.2F&zmXK(Jc+Q<B\bGhA^1 #ZWm *\: jܤ^6C0$17vhٌ.#(m<ֆ1KH32L8Z˽3?MXu'u'fo*.vHݜItiZ@R]HMeӬuM Ʌg~^#?m1A?N߼Me/TDŽߚ}F,ZPCpp]Fd>+-K pf +g$GAOEb2NGX|:7QahD9HIgˍ9Q +S# +#Hp;x^* peG+"n^U)9 h}ZlMZWsqQԼ(:(YC9vaש׹6(bք~=SY|$آN*lu 'dZg]1 Xse?++|}'2^8T:۪pC)D q4L$MƞMmneq$\8}[B+/1to2$-`区TuEI/jA>&ɓď| D'4/f2{!1nSTƦ!=0bm/FFa {KppiYfGc2AAlZOnQ2]^teC[* z}*ts XۆiI)ݹR 5O=}G%N+\ao[8S#3d>Xy?t\)}lO:>AZ\CH]F]#<r +2>i ޜƒvB:m\4&8|֤c\ڎg)trb3Bc;Рf\kw@m5@z#LCBcUڥ9 +6.P?@< y"6W;=z4xaI;7*#UUntdח1?\WKTB7S2(0QNQT,9 OgAw%ta}TeL*6'," $=McV!T#W4T.Ta*1|e#O 8̇dݴ()-Ca3FA[Z%ĥ6#O4c-m&돋( 2w&4ez]g0+y*^c0B7г>U#uzTjTssrj[ڧ1 T'I2uɣui!&ۋ 7$ӒGW*6`X+@R34N)9'$6R!b v,Tߟ1:**>xxAMt;bf`b{["ܡ ψB2>u[=p)"M 4ly""2|W9*5a1o};=hH/Ӣk 2@\DA &!lFxHyԷ~Q{,B6*Oq̜Ȓ /0$pkx^9&|&Sטt״X@+a줸Vyy y+|]3tͿZêbwZp_.NRKAj]50 +Umq*2|LOlRjUl%99y-eּvᮚħC[e"zh$kjW ѹV,VzS2Hm qC㰔Y~N0-(jWFNG'\"%N⏆5]Xxx*3 Q@";&^s2l)1צgQojņE(5O +F<qa8ʻFATz3a61K݀*!,+|$dKF%tM2-i1ij8th@R8&E.4Ӣ{N +@#o/ͅp| س69a"&f{(UUkQJPd ZRPg*t>NJ^[)Ԡ"! 0ߺaB!RLm0^:ysiq˗l)ҭLtS6KMne SVB2h&v_[\FP:u%*%fWW5L'^d?n2(q.Bc{Υv+fZmr( !#DCD1n >N-m>l`|_t9\gXsy2ⅼw00`ۙBNM54KX(k(}ƛ^ JRܿ8ݽ\^Yr"= EܦW0~JDXʈ=g^d=)]6lP`9wULV:RBmBPJ6bFD37vYpJU.8qF_DՄ '=S8\@6Jd=I.D>3nd1l#[XϢUZLI$0A +cT=(h+hY[u z-qtOޔyg4CWG]wxC=ORc |k?fH~ WYA[%H +'>E;@Ʋ)(mO_ECƺ;N_Ju`^}Ug T!?'+s~xý_Z} %Ťm2/b-)Bl dqll xҸ vpc1r:;kM֨-š,PGq<"gp*u6hτ%&VtR 2m RЈbS}N X +A[+hy[֧3KWXz2:oP6? )GOT PޥWG>IDcT?&gxG{aR ߚ#وQlzOS194bY*^Ar*w@D7l, gUcAe/^]=@~Sл/Dw,iE(xNz8VOk2caO=Qsg/HC{]gmb}ñ3RK[ iJZ''4^iy}9Pc,@ M q4/0 BxBycOڨ7z1eL"oQ\.6tcN9=Ho>ς|I"3n9Mv'#rM6y&/ UkM;<]'wjm,";#:KH]TLC& &3_im3c \qa:Oݎt(}Gsd7}tAvHJ>vMpG$Ҿ;(&[16wV~ּvcQv1^*SlXlbk#n^ѻW>PȌ+nՂ$t:ZeRFpґg'm&`?7^z|יϛW;)S;?qϠ;)wieΥc*KɿE^?-0üqPs@_)4T 6U.u"yp=U#A]sX\^Zm?6Z,͡d (QJlj\uUa{F怡(*eL |NYPoЖAKF^ >Mb8g*]6gg YQ(52wrȅέly6A pW@7߉&fx.j&+w)_I+]P* B 0ڰo[$ǩ=~/k +Ȗ&(6\K<6mdՋ_BsE=3:PU'pqC:~Sw63=E_F뇁m8mm]a;ra˰k`hca%wg@dlZI 7RarT`lӘU"/."Wqϸ?G=2lqxHj=8uws+ A$/&TaRa\t%ohN\<2IIb`t-ANr }kp{z}쇥Nj+j_tQkJ@&Qy-D|I46`Gקn2(LHrSfvŁN%eڷkآ|+ԫ +zAd/",{s\5-"=$V]nA8rX8ajqwu4& v5<P֥t*A T3'4*9xj~jqjtAQ{p[* '枰{ζ*8ŭ=Md|Cav@f*x )Ԭ\5[~­e_*Kʏ36>;_S`ҎJ$AJznvU'&`4 .#ꏌ T(QUdl@iF,:GC743)>͊Od%ho}eӦ1EWMs1Ӽ {|/N4fy?MQoc7ĈË!lSidl̦fR5"3H*Zǿ/?-T&L/} +a]vߝfTur(fwʔ^# .ouږVgZ\6$iw.& ; *cX&/$t֡I[=W!e'-5ƮM6 Lj3`k#')-* \HOݭ%[jO`ߋq_.%.fCUj`2BjWz G,i 8SQIнg.C1@jh6wڛL }Q~9U2_D(ωA}I0CtaHߗ.tDhσSE6}RGMq'Y|?8 ga d;OdDnd4B95ʻi(;yW~lU9Xg+̒8cӜ9[U+>i\DP޳fh'VhT*e2Z}L0{7`}m-hn]!J!|EjCԒpxSСN__8Ҕވdpdo];YF%ĂbUDW/c5k%7bl1Xs>5D!ӍQ;M]09໨X"[+p<࿃cr7*;:/E+F4!ĩƔ#Σ=g +ޗ`;La`u{<%OJdEO&#P\1r_g>NgSC7ĩlDդp}ӄ(6 O n]tB?J`ui&aI#kb-ur `1q֖噞N{1= :>occ~o$P Gj T͎TRzTaSVnbwׅ,3~Ig1X1/Nl8 +h O6MxIJ#7HCvm^N +`g!,P4b \$"ҥYn+|'KTq +}wI[fe&BNz,VFN$/%xk[.z5+k)5;nHfɰ-0q6,5 v=RJ?*)̀~a>l{&"@ O8qD"`07pgr4 +t>q ]uL c2MLS\^hm6m/GV3o]ܰ"K ٔ.ѥ͌D)[0~ + GVّ?P=Kʍ<ӧc< pOL0AhV]ZOr=Y4Z*׀N#է5u"gDZqOK ?%A8}OQW羽%$(@Kׇ4|}\'.cMDX00]3Qh m~l@Lɰ,FVt_3wPFy'dJ[BI }'ROozA=m oI97-}Gt +flCǂ{'cvُ3=6N1+94iZM V&mF{o\ + 0ڨŰq4>:*ɠdsLM&wN#:S0 vLݧM>GT0{6W )fkwl_ Zl7@ZlxԽjATZG bC,G׽3,*sT1X+:&vOa5>tB x#eפw+é *|1 k eo/ب{1.+᪈"yme@1T ҁ\|1L:![6Bx2A\d~*X2l=`њF%iJiR nճM3Cp^1X?jÉ[Dsc[7RU"v9]46Rޒ ;dbV/ۥ /V7tHb7FX;(s[v"`wذrP Ʀّ"r&!Ӕ6-j O.ց8{E53pqw0Gvך@#Մ:QټK&=3GXEu1vZ P(Բȍ+|ژh* $W "Y #~\tUo0o{wk̤~v)CB7Fxk )fw'bA`i+əI(&| Ӂ33PDZHS¤u}2BTTNx'Rw˜8g#l/m'C-$D|d0݉ WEQ/jM!%ӊAv f}[t.->\bO{<tTi ! +lyh1!}Sh4T ݇՝nBibz|KrKGZ {\TЩeP l%d8vVJ,CwJ XyUGʣrR%6Lc._,,iU#z(Г#@:21% j4姹rB*耺ʹ+$\,mI +0Oθ3A.h!ZZ^4%R䝐4?c2RUoaa!?@M B`aB}$$wؑCvnjOQx_+~q+wRXul8'u9 +1頚W2US)ŭS<&8GϜ]|Ċ;󈔭rۯZp1C!"7QRhA+&՛ NFm֖-貽QjY,4̻jl!/D_pPvZ3 k!]:8( D>X9]1j&X@0;t#VjG{>:|c].;pXL>͙7t6|J3נI7U9% ,ā6 zef7pn,"EKXBM*pкィF!{㳨WvLL2ewQpoOūUm+U#+#>v̓6E-ۯn"5UInr[8};` $~Rf5}G]-G0m`a7okuʜC>FLa.Ƀ' v%eR^73FcΦ#iCۿn\i_ Kr뀺HסYG(} χA=>/% žfZbЌ,Ue.udm)HÆu ~2sقIޓ!/.he&u&9 R^#>ӊlkA"Ƹ`nt`:m7f|}J3R\g+л1?@Hr(M^"L BG^Þґ\톭űD_E"jnJPvQ*b'do)FcyF-lZe_TAjwx >2j~Nֺx T暸 ~I`RYl)J%ߔW/Yf?0A1`JDs~ I.L] 9綈JN ߪ8dn!yJ={bSmH+vCΔ~B("6q.RL, + /PsPQSK ]~`ӁQA,ҌpNq )ӝO )Xw3,ZrꟇުR─2U +'~5K]vsh/"Y'@DtT´ epic~I$LDMu~ A].\"տ38*;0?_fdcMׅ@vUZ^墛Xu3Y$BlN"@t +BS<)7f3%tnFA;̒yT\f$Q#B mx9V .]qAIf$b?q:fFNeZGҪ)&KeDEsX$0JFg- Y@BHY.qlL0ޚ"ᰌ Y=G,b6['ne3\\_6_ɝ= IJ4TɅ5+ŒJNޏ4呰==aiIt&>2L?gFɽ'7*.>vTJcsmz5-ԛ[7rU;ncS?V\>kΎr-jGmϟGЊ5KxcVN&*yi'K/DPRL^)5h!8^nH"pIqH,uBB $QNDmy'DV{Ep5`ցɓ:4{da2|qCz9fn#3%E\8T8hǿE&Ho2Fj ֮}DU7φf 7F2yYg"BVZ%3S0OvRN}ّl:_vTYVm$ 6 qM8&tM-+jiuYE}<՟ #/UDDGG3^#eg0? +浘4] +\C쉲J.$1uIr`f\)&@ RO3JdJ8G3Բ!BI{]~$?"$@HWXs!U*~3HEr%1^5ep +HFjv0BojQndaiS!M fp-ù70 ^K3r`ܤSyXw'?* n2e^*9 +w9WQa8zOf;9P ,7$neWLAʥײ~.q[P\PAEJ(c%jGt? +U/׻Jx rL"7VgNiiȆPy骷eUco\7p|B< +toxS[#)RCx.5 s`v} 5+/d +oN"gl=ٴp8 k#u$f +>0O%ۼBގe"eցh =e4%?W8Y숈|bI7|brN]@ߘ8"#M&FqVQJq"L פ*qdߑm$ +2] wQJvJ]Oa3 =:G,`Z 81%wRoPF^wHa:٣c +B] (,%kL0mXBrD&BG~ |D(" >Ond~k`ۇL&bJn/cGWӇ rMa4CD9g '|Oh]FAw yێiLQzMD> |p 8n7-cbciRkAÒ/'+e)RM4,^$N+LAJ]7ՂݢCiVfol%m^Ν4e O~C؋9(O9叏H[Zx)'"XA$"v7l1)c| +w;B{KRZZxk:J<`t "uDеFTF}T&8?>6L"O4ūl4wF9VAj%|^m +!ŦUGv=K]68p6k3}7ۿ4x8iУiIDuVPL/ؙ߳/@Q̷T|Wo ܎M!ّ"1'2w}fڕ"+Y$.Ӄ牖U9x)26MO֤b7.Ze9xF*!oim[bZ.YO +aM*YQ6!d7e!.= VlK}Sp2Wj\T-%PC;\n#^z6\i80!$ o ~|%|}^Qډ>n +,.xcǎOdFNQTc$T ccYw%QYML{1T.x*OwPc)ˎ +V +B\VLMh#b{EӔdu6ϩd!r?Mt yALv.bO\Hcn4?-LC@)Ǻ)N!?U魂;: /{yC|]y?DhA%L3ة:JcE)5}Qȯjٛ0 (P^WD(#4#\*ioCxomfV gJr@âUF\@=F̃+~u2t:\B.i{rzNzŶ;RʭOkϸ^2[6hxӣlV ɽG~ +^` +!;7z/ }yYT5bId3 +|f8! Y\kmD4C4K endstream endobj 2718 0 obj <> endobj 2719 0 obj <> endobj 2720 0 obj <> endobj 2721 0 obj <> endobj 2722 0 obj <> endobj 2723 0 obj <> endobj 4891 0 obj <>stream +Hd͊zy8 +>sRhF^#y QG#Oç==o/ϧ;c_mӷKv|~_oo~y>}~W=|z>{O݇q~?>Ï?o+~ߒ~;%zΏx߽w;>lp?(O?{wٸ^ PZUuTGu^5P5FjFDMԤU PjVjUmFmک]uPuNNE]E5|| _#_k55|| _#_k55|| _#_k55|| _#_k5Z||-_+_kZ||-_+_kZ||-_+_kZ||-_+_ku:||_'_uu:||_'_uu:||_'_uu:||_'_uz||=_/_z||=_/_z||=_/_z||=_/_ || ߀o77 || ߀o77 || ߀o77 || ߀o77 KG#(~? +?G#(~? +?G#(~? +?G#(~? +?z $߄o77MM&|| $߄o77MM&|| $߄o77MM&|| $߄o77MM&||3,ߌo77f||3,ߌo77f||3,ߌo77f||3,ߌo77f|| "߂oȷ[--|| "߂oȷ[--|| "߂oȷ[--|| "߂oȷ[--||+*ߊoŷʷ[V||+*ߊoŷʷ[V||+*ߊoŷʷ[V||+*ߊoŷʷ[V|| &߆o÷ɷmm6|| &߆o÷ɷmm6|| &߆o÷ɷmm6|| &߆o÷ɷmm6|ۯ\t;]~~߅ww;]~~߅ww;]~~߅ww;]~~߅w߁w;;|C߁w;;|C߁w;;|C߁w;;|C߉w;;NN|'S߉w;;NN|'S߉w;;NN|'S߉w;;NN|'S ߅w]..|K ߅w]..|K ߅w]..|K ߅w]..|?|x>stream +HWYoG~ׯlj}KH6fb1<2NV3-gAB!S]WU_v!%BRF[PG3~Wwtp_^9 ۛ%7]r}A V,gXX.l&.}8?j-V^c1 +yЏ2E W&vaO&L >Tq/ uėj I"IBYhX!Q_U=sN򧱿 /h%CFC<}Z"ôRĚ` IqA"9Qm" j9|8W 4v! y?_#昅]qG\\1¤ +>~|6(6KJҙy b&X7,mV#,yɰb^-ra}vc0 +4NuZB `xaҋ, 2E4ـ2Nt5`)03+!r~w< _1> ڔ9POkp0@GY%K~i|vvю`\cR3-ZAN jṁ-H}NXE%OzR{H}΁Х,H{gSOHN':Q9~5wCc2TlF3w¥\!}mMj$tvz8?!ࣧ{I,q1,HϽ&{ҭtn4^#q_o-YZaP(&? MSeA\#kYB@AK bA>(!5φ~`?vFӌm8򒹅Tm.3ga33f}ʉ ENDuƾ< )po'e E5 sz:sɪ%a5 +Q 2Iu_iZ~k ߀<67ʭ#u1? rS>[w \Tkp5T$-҄" +9U'HFJΎZ_g;0u}FY0gDCt2bxoׇöonD߻ Cܲ hŒ̀LD 쐧6$³a8`&V23տu۱L-#4[Q@4g2 ja){E$㦞- %D?! Y2hF>Bs|9HWչVЭܬ>5c$I걫}ѽpl>,OMhIgt7Mj]XݭkQ{waE1p 6wC3sf+3y!PAa +o>ܼ%dL;(̂tL}c|LW_p9+@I$ւ7h0ĮxQ%3k{ԙe +c5'j;LEּٯf?bq.ȴJ_lJte<}\p}T.9/#q'=,A؏ڥZCئZ2QRWh`G]aVHƄ +67:qs7<@LUGwv'Vי&|xM5y+XRro,dyTďW0(j::x 46qB1`am!syCZ+O }8Aù0֡1;nx /|}gWƞ?&ݜ>U-Uf4ɑx_ h ;no CeV80菅U\pxb*.\Vڄ4*:9^¨Mtúnl)ᝀ@|"'G?ϏcDl>9+U뜞79 +ri~q_z1:[ jd)\58`8Tʗ?t9TL`|g%]2{\n",CjR_֍dJ,o$L6wP(8lb4؍4C  \X2Oi:*扑@ް1fnd46uԧ華S?_э̾2P*T0_cʷFR^` ӆ>9H5 K:{As3'6y4Nܿ2~}naUM:Z50CތnI\4S8#]~ 2Ñ -Ŧ鎀)V(RSkr;iuMaDj)}.DqWn0ܢHI)z)C- r,@ YNRK1ғ}N +P,y\K'P X[R3bd/B`_& X}lO~ `_ETͮ STCv韷P<>stream +0 H@&_ H~ T'mnbӵ)JMA9yX +6B!E@)(Vq;)lC5iz1*%yGz;+ 這ޕw2&#z{4wZF[r)?}پsw~-6mK-Raէˇ%w +ig۠{ŗd(^AH6Tf+4?-Tw3<c}y|*>W*CJSڴ|Wo,O[Q `ՂY}P%~7)y L^iWg% )ΎJςhWaNT`XX2dt\G(W"Yt ]?h@ǣLe"0?!,8n3w/;,Mr e^L7CHDw6%/uHGH>Q[8VoFPɱqa#}ð  ͹ @O(6^DGR6^Sje^ڨ:;o~D/Ph(ݾ{v(HbbYTІCΝ_yN 6YaQ\Oq,tL9t^g.ba_Z_Ӫ79Vb/xryu2V~ӎOi+y +:-N_5dAFg0cnDAPeE.dBYԊG i&1 P!x_ (FI`8@OB!j36M# ڤR5f(ƭOjq$'&S=kY #A9>^bH#(WCxp4يc: PUwe*ҖtTWP4_9,VFPDol% +)3 Ǯ]GdB 4zs + tԻ_wsOxVM4j.6y|'k B}]DiA[!1`ڢ'-R3u톴F2 8M#RL{HfŁxyæfbaNv +BT>P( ݶ*fr~z5!؆L14x_Tx5غl"uH5Lz!;%Q*؜'͹}6@ +ZU^!^]; ZRKOPZt7qd.!piBo[~\0mʆWS +VY^>[ u S/:ǜ{7,2 k!lKr 9XiL ~nv.O\uCP83u'>o֫Ļ$;bmȺ95d~x;XRk)Wyw$圛,}jNc4lũ%&GQ-ĕ! K!sz<@X: *2"76oĉHDs8-)vv|K=`L M]vz;bv/ǣ+KV~J"oNf{::7(~oRH9Na$YX+нHYcBoq,=^Uq͜S6V`lmcq3&醃aGGN)E#aҔ@*z!|ucNh|+_7bfEж6jwm,vH@EIB늛8>}ҏ|m5$*|jg@M$LX8`׽])" [\?Z#,:_ a$3vq+~#f"K'N[wy|;/hۘ6I_ +/]#e1jG(`FY>z;-c@Qɬ7ƌ1ʀ,ݴk)6=yz@-5uplCi2@4CFٌE@\tcg8,/Qig]eRtZX:I4G͐:@ΪB=~D5tÛ;2$]D_i)RW0qd(?sJbf3v5J`UUF0{` ܑ1 yw&[n20UU;B+&ǾD@xj脩@n;b# wɰL4^׈VXb6} +l"^w0\N4$=i:U=jF8CoF/4땟xwU文eiu )CJf( ȱoV3 Nxr }Ql "} d3#&y +\#z\ +sX'}ϯjK"'滫HڗX؈(P+}* 35bu9`ɏ0ehzk%YxƐ`0:gA8}wPUrWi4X/E\.+%xߡ$EHf 8_IR ƋR-|Tpxv)4fGCg;5wNC;UK.Bv]_$1IF/ɍ+jvRl7]_8-f E|TME#>bKw3\h8L ZĆC \g!BQPSb T.n?*-,ŗ@Ogɭq3 z-׹vgW]{]F$@fefbi6u~rB4~Λ9% ST8D?Oeꈻ=3)e8Q@#zu6֝/EpsZj>>71{QS{ዓG9EĨajwgԱ1kG4esiŽT6"K9p Lo.s`*iaq[@&7'k 3] eGhN8ȓGy[F꧳FLJJ:QO d1f*>j!o$C'4::+;2ɬ>j}G=bkzo6#rIgMh}?J{s$w[ 'y07Zd{,TcDHSOjWW \q#E35G~{HO*R:2+Pi=ɴѱ H;\gݾbfM1,] @u͠zۛsLr`:$ o>Fֳl66-yb'YD5p2"\S`ˍtm$uxAa}m>$J: Z~FMOX}7 J)fc,pƼ>H٣rgbC14`UXnEcTgvʹlnnm +' @L&FS"n׆1N= e;}NS'$m X<# _,tC`|}%х.HI4=rہi=Y`Ÿ +L ,Pw!L}caQii \\$X8ON!RhR]G*d-MM99 V%h$ l}\S{!ethۘҕ%&k[e# n)=C֏qdݓޡY;Zg= Ut?œ(Ep<_UCZG q0Ke 's01^{}z,33'οa^ 9"<Ԍ!3x]Wݤ۴bb߰;+cK??n W)R6R{LG"= 2[z2s[֕q:'K{3SFOWnvb7d?y1d@jl9W HL~[=!c!i#%@P~#4Ebuֱ`8^_B 5A:6<|e& w[*mlCk|/ U-{8;T^&/{&'K ́sfz¹9QGd|WJ$Ok1tъybq= + +k?5lgڂ>(] +f\{#HB+hc/O<n6Џ:5TrIQsJ9l7ݨ4.%s2΅f&ED"| 47E ^>t,WUM6 Z}95EW 1Q%VNI3sC5o +)(3lwB,Ky?|cC! uU9tٖppt,"DPȋ:M[G%3[ z@vx榙P ƴG]*J'9w}׬mV@%FhTWyiւÕ$ +ջ<16Jb$(1E(wC>Us4v +&xt<؈ +WZ0Ъ?!,hsh nMU1.fc;`j_ ? sv!J +hU٭l; ysN{bGSXo9OB~E^ +F܂XWV[8eʕ˳ BMTMoR[h`|D\XG 9'h7[/'l8<`Wd΄FZIySGS |6_֖D9zn9y*,H~ &4 3 f I6)2Xq䍿_[C(`<"x KDе~Am JS^UBXԲ$wk{F|?Mggd=b\wjP#*lƹ叆*d,kv&TS `<;hXL)56釨(2@V5iK *$ u_/ T Ua<!v&e=l vqOvQ+4{+3 ԙxjTD( vo$f='Zy77ou_aåow64Y2srqr&`:S‡*\R!+8Zӷ ee%,hM.brGE̯0|L9V7MC|JJ~7f%+\',yCn'/ =;#HO.:W +!AO%^-)jBl o(ܿ.lNRInAN2/TkxbsʨYK , Ib+aM'Ġi{PpK }Am5TNZ+ Xf篳I~M GS"A|;'h+GB7Р; t?CST5 f'4{z[K--aK{d>Ο2[_l W~\g,-H mK(QXԼ"tD,ן-͊Œy"vb;_s%\7R> Hڒ持J0z>>r k-`] %cZd M^levP ,Z1 "k6irdE~>tX[ILuZq#(\'$FuLKܥl{4~-!nn_Cm-+N(X*U + F(%Vi 0m+]vt3f3 Pi4jZ1!u,br)}1z=}UP-cˊ\zH俺toF ҉΁n}gQ|tFqAj9]6{I~ %vS,#m#CW'ϿE+d4yFWf\^T[> <ª2ଅԹoHn$a\, +Ȇap~[ 1(uzUAg/s8gGt$\P jρ>& +KFj+IQA@P|L}phy4QN8JhC#[C%XSd"o+9A '< !D-z?6m !nF}@f@;6As6~ޅ 58pYsb pmq*P:0AFZ|Iw}pLW<-[2 +x}W~PQl +8=Y8qZ3_[A/*"$΄ԑ참w@f%vYT ԜJ[D*<`9x%*N(j)"blj3~: ӷ޲ILD4$KJʺ3ZH^Pƒk{˨<z+o MbmHĥEkNX,a$X(0SS>i"F1-+=`7B;<ma{l7# +j8[킂V %%>>zsL_)hqqLhp{(6OvfA/A/24u~45UP+3^=D=q8qO"If[籊Vc|}r70,MN^xHkG٠1qhgi"@֪Ҿk~RHP&7Y-LNUqCED/`j3":RQu #֏9ǃ/:#փ&&Z9)ՄUpGazXV PW>y[;zNH%6y>`t8_Q< +'|Qߏ4[98;tAv^4́UbԂ`ׄ_돔l83x(HI\rFWWȨUwcu/Ovp+srڗCc{FӲ)(0iWvsç_ 0m!;C}kGThJpwִ ̞<\:ax-}¤ۇBUUkaU]}2R `nk/xaJSMV<ePn&U3:ws`|ӂ +Qb JMPuY;ކc^`jxrd-ąͥ`m/?  mf~O"8MP,&-kfiLVl;cfe6.rf k:}o0Cs0k۾<'SȒ#92Y8i/K1/.n-#JEvw9} )bIߣ\~m}B̼u!{lkowhK_^M{'iB9PsSOx 15_ I[\[L |ۂ8Q/4TY674n4@U[쵐`B2@AX=< :\YSb144JsVK&J݌ݼr2Qg-0z'F6EM|EOIΜ:ƦT1~U7B{sqY?⚊: FODi[5! +@OQ7Aw0M:K+$kpv'\=%%k^5A + a*񲇖 yJzWW\;K NTo41yZ𹇕 ޸+n +cKj =iZ`{DS&՗4~aE:mPT ]zIA-~owƎĎ+ƽO,n~1Uy Brtݯ1ƛ6ޙW!vZՓNr|#hQoo&sZ'525COX<'M_/zIpa'XK a`A ]zrB>uX!Z)RP-bNRC^,^n7|̳K ϐ :krexCo<% ,!709>QP&{ƭQYpܻw"bKGKk[#} Iw,vk5SI'zm&'%Nr +G$yZxvvf3<TVӣtXF8p"{6O3v^(~"3%;)6Dc6A/Y58-1ykꫫV + S7ngk@[zl.Αѥ{Dhj&i| (D}IB1PPJ+"IVߍKZ xKx:(q/sfs0Y{:ʗ[pSU„xNse| NܚD0h|{b˝Vs=;0 VQL|$.w+ B_XыnNx4iilVV}~5lOp}ed=n|χa?SMўeh[*Aʆ1@B0N3[70],V.5l;ȹ0Zc][wT[Ub#>O]̵<}H8Ū((RHC2`irn˚L5Ʌ9#} eg D9ll tpF?_Fɛ8UVeN|-LyӐ}xN9Q7I} V%qH5Z^5Զ-" Fo(&3(!2^wݗʻv!wECag~.3ti80= $Xh,'[Eߐ$ H)m9CBW4%K%n>EW. p'~c|-Ml:M8>!r<8բ?w?㠫q5.a$0ժi@l@h~D$lKC! rO 0l4 'ViS+jY[Nt#(N&P7‘oq{l/ +<:b9t6s`RL.Gco6lc{JRnnE?~HgzGpvblϱ/>mLxQipqE_ ?z1? YL&)6sWq^"v;zӻU,9Bb`0-Ρ +}`b@,%KDYL*=a׍_N9N]|i\5% <`!NDfz\E2M:b&@hrf&V@i |cL0S3R <}S`%nɡ _rmQwf!2sᯢqP3nU 9in@TC'5:&uB[BK2f5|8kUgFф͘ԕʯH?á&{Mڷ!Q"*zb]O(v@Nw +Ck6m7hmSZ{;AkOf!}o]`|jk($JYV- #Z硫Iq`P@Z,.y#l^e]:yp:Na䡏0[ +>uyl[&C;? M )fAQ]$)9L@ulO:zc>}@ЙϢi^͕=˯uvm]#@Xm8:hrJ& Zu +UxS0*{K5` !6c9-QmϢxmԎ0~ }_4d0O/ "]EWȈiX݀\}(&Fq=kB하i6.BrPMU~T'}&R19ז4qɐXߒ_}"ohMz$To{ZlS 0nPAT:cdR{ }h2 Nl R2m(ȢZa5*o W+>ѳh܈bHS띐8=bUrx1]nʣ _\f gn^+@mc p{\ XainmJ6ʴP2in>de Q%/ZJ=ņQ5wU~/=]Vt  flW^ 6ιo^FH s|C%F.M2C dvL$p7A~^ՋF֮WrO_{/~LC@[8Jl#Gİ#^_b(d[iÎ$?Rλl"|3x^p7pZK|"Aۏ1)?䊛3HXj/^⨓(/m +(ZF  gD}W |diX=%y #O WܤyVTyz2x"cs@u?|Y]jfax<6B ;ֽ,|:RnM- +'9΋?U&,y7uo)vt!_-\M8Ūxyzx++w̆ѫs]a˞ Y>mޡ9y;F+ρ〿nY2LOG` +6%t;&I0EKj&'&FZ@Qc#[tH9 5/SMY97GWoB&(ʷԑRF=H`>n1MףWDrt!F[CӬɃx*SZLŘo|ت07y a ׮oofvLOZ4<|8j>UVR* 50żSm*H{}AD'Iؾ rCj0k?\nkgv8&}.!O,VD&|"y(׼7xEcYd (wd l9.^mz>Ee`Ņ/enQ89Ψ6AKf^)"2~6Y r6 +$.̟.Frc aMpQ5(CAZm7TA#IY1sx t ȲHyZ')H6ߋ e T#}Opg=hX9 D6=ʋ O@L֐bb If!m(q(Ƥb#^&k<#ԐǴCޯ0 ,hW*7Y18W6ԋ:KMJvNAo^8%F 􌘃yĩ|RĤ AYG Fu[YqI+Y|DY윯_W*de\D X1WB1 Ǟj*gu`a$B+yՊ%rhgl t:M?B+8ERN%|æRR>C\G9ѢҶt7FSU/w;n\4qgGwxd/UŰȇ]YF%rK $,N1Bo lLhⅰ(D_tXT`&p"1_ooL}*, ljHbzvsqzzl' e`g~lf},MR9'Rgo9NѕMXYLp8T`RPEIVvse~YR+ +Z5N8bK%7+\BRήu=IME<)?0iEzO@];=0(sႬ_1?\=r~r -[ +Dw!#G~Xy51s>|}3(ۨy)zA3F A-'8>e!A@lb%A. {JijlőW&e¼Fc҄GUr_W%W yC  dQ;!c'B>-,1@*<6XpE7o +`׼ZLn>.vK9,e|@ +z.ad1$ lqPʳE5XV2FZymv3YՖY5=e\bdlZt{.鷓t`#2e ;R eY +'MLŴ1էz>횯Z+6_ K $wZl !yku瓻D4~Ƶ8H`dQ^NJ~QaX<}–A d]۽Nŀڧf-d̖:UgL՘n&hq:'Kumw \W^,=*DȘPVl42oO40M˅-ۦ0)e4b [}^tKcH4N5%QI5"QfD]dmWT* .yF$ n9*4-)U 1Kl20>P<Ԋ~J2p+.8u6Q4, +.%nj7?p@V8Fa wkTM;'i\\hu;8(7^mZ軋В6Z_In҄nc_@[op< AM_5 *=7dzx7, _@vGp'+^v]S==9mO!ͪedm.)/2  ARYOK8l 6}sxGJd`LsIuEkU`܀E҄UT>~"Qk)v}*3'M;Zi8t͇)GKrJ C{8v:" @jS0*Nł)8 Q[[%3a>J=@mHKv(}/"ri7FU`[I#1,`%UasFZx”-Hz]?MΜO}4FWL~,om$J󑸵2.Q(|]6„sHpHw̥xM 8Id.ѧ+{(ףXv>G1SR eAK-=_(~VO%ϓ {v.J!DZL)X;{ +3ZkA("݇}wkUܧr /n/r4Qx2.6 \{Dyߡb^ u%w3y֖KgKmތaI|Z~@_C%16%4Hl([圌Ni {'q)Pd iRx}տ2~sn[Z}}x l5ސa Lc{+qϡDVUa3A374-HܒXUs `O-]0E;"$=Mz+@ \ 9F{ +*KWrk4i?0/mfp?7a5wn)1[Y4] g A!9 AK9%9kKvt Ot| +ź۸_Rڏ}"2x 4KӰ+!㷳Έ6GRP<3J!o2%iRog סO.틴:P+ +`}ԥ#D I|>$̊cxd?,K{[gx㶺NJ݀;fK`P#A<4Ǩq:$7ګ$йv|;}yC| QQEKIHbp:LbȬ1}DD> +a5u*?`I(9Czk4ilwl~ǧk etҪ+X{I$p %O_,n2q1%F𻻥 eJ>@{ ઃo&mWh nB=L:_h*VyޛZӂX0iȭFLx}G;8D_G2MiKޅ +,ǐ +p?Veh|SaL}1M \l7USU'?ڝKYt|BI)ۊiQ"% G1`Z^,1aV͟cTZud'C.Jg)SޞXRTY}sK)8Y|ql4 KտͩG˾kTm"k9aE:^C*ot-bay(0"0'a6Qx-*U'O5ƿxHa.녤 ^h-6PQt[',$[J@'ȻHGLճ]#eL<IkuO`dxF2xp]O$Ui@IwJ58ʫmhPǷF.W܉~2XI=T) vO .+Uyd55(UD>9#+v-; +aQƴcxes&2N %Գ+Z0F EI@]1oJpF!kDr Pb9^>hm~9njߏYBA?Pdž +r"/h 8R ngY!Pj:]+.jO?UK&>})mh)PG voM! !QOoj P$7J:@od+`m>sNY OJPD?٩=K Tڇ9ГEJ Ŵ齯 YZIǕ8s,Wofhi$ʹN=(十2M-Xe$9ƚ)pWۀq%35j_ Uy;^>z]~M@|ʥ5^ U-n=l- ٞ$ˈ{);2 1ʠ&0rbvY2Bhbj +|wuहuXF_n1QUǷuѻjCΧ<˹ 9. ct! U!Լ}ͣҾ"YWt9badp(Ż~_QK> OR|m;7SjlZtơh4FeP)/|t VhS ۣ)J~nf2dt1U\Ͻ)m]P4뮵2mZҧRҔP amPEйPKv0P7PS' ]OJ<#:8Y00'0c~FG#Ap=.).9K<֦{('m-tL>_:?K[u QG յJbmb62DS +w GTSzI.&]~z8tL!T+q,Ą{:3ӖwpTi(I/B*JH w;HBć$8೓<]m*&"{`I)$qk,El^A%AF~,ڹ +fxKdGmgOsOǺDʌE?>V|vh65f32>|#hJR a:c*<"$*xlt/u8]qջwߡigKb0u!tf@MwF * [WjPb(c[q&PW堲sYDgRYG/"ŀcn% !9@#KDm y*вI pJ=oo؏ʜ"iat}V'4eNېmŮ?YI R0hfE?&  +lO/Ӹdѥ‰ȦCR_kBǫ fJۘRZqާUx몹#+ʝddX^~%z GPlL]Cz$!=c]BNdW:9ݞUH ."׌$e(~WT &m.[Jh'?CD,k4Oy0>Y?Ѣrd\-gKUm;~Im[A݁AWvOıdRYqÖ'>g, ~Cvl| +QFz +Dpk@ + sW~ +Q5ll5w{lL5ҢC>{-<1Gsp(~G0WF +dyKzɈ2?%NR_^<&d,-"S܈B߼BDL"q4V1؟a݋ ^]7$}py16fđoetIdp`f?[1$F4R(c*>[:/ 0lE~qon"2#92[lr)E2R{ +?YW-~q|B un))}y[/D&GnEZqA:6b˿ZK!s)5`Kyjrv5I떅Γko1ܩ7GR3y0t% 3ycvE =[=[؇LLF_p@Q/CX](׋hk6q +:+k'6!RkyPL"+M#](#Ei *׶ցgMlDgW0hS n jnW +ERroF,C?>{ MxgI> X"D#Hn](t)otfi)*CHky38Ef[/ge@4}+ʉ>3vy{^{[\*WYE\VyJ=Bfh 9gt4%xDDB|*(nX=3_"O-"8'`ZVj Vm+P6GK1ƞ|rTQfoGw=`^֋<(Â9,ïզ.t7z_z!$\SYVS^P5`q[t9ǀF_o=_ו@ ;`l `H˦{_ l\SJ\Opȳ@[WavyW39su %l5H:U˭wCp9~hͤc:'j\G[/JV 5aSM3ly%?RZPVY*}>tXViF}M@>W#'GkI0)r8: +gJqs]تPzdu*DA{!YM$G.~ѷLO$B7yC40Pݞ{v%1w옚);?ĉ +szDVyR'x=c%m ŵV]b.|m[ 8 7ri~|O~W-ڞ ,v%_B-{cN*]"2&i2XK(Z"AtLrsvA癟 endstream endobj 2712 0 obj <> endobj 2713 0 obj <> endobj 2714 0 obj <> endobj 2715 0 obj <> endobj 2705 0 obj <>stream +HWr}߯cv YIQlT*J%,)}znTAkbӟ7T%ф. +)JK %R6~>N}64-6 тT!a5?ͫ _{jCJ*Q\l ^\UJ Lia͛]}=6}0 ~]n1o/َ?zsȏ?MpM59嬐;} LsCՊ%\BQRo eH +UBT?~=NxuޯkDqFqPbl4)Uΐ r WX+\&}孬=v7M6S2x3KHs<2LFE)4>=}}!\8)ﮛ!$&|ձO`ܿCj>_m3 щM{"KJp( _rZrK +>!.X%=tUbZxH)KC[6%F3>>4O2C)oM.P|Z8e5KnL8~<$eqϝp">0ь)/n*h[ڹ:%zP8{|(嗢L<^C>= Lf,'SFHZLȲLK Y?% +qhE3ۏugЀNɇ92L% gŮY\EtcCP"kvawmn5cřq`*g3T`' ҂YDW#!sdxEb3ē, @0)ipUT|stt9H@H|o8RU9Hk/r +1HNs%FTfGD T'uK8Hߝs vp=&Ji ;_J<~er&2I 6Ly@1Gԫ|h35jF`ct}̩T3bÐ=aMdN:StQHCNO +4m9J +b[j.ԨRQXc<)b}}j&5ߨDبDAA~Bf6#"gKC\eq@iK  ]^I1("}wmتܳ!'T1ǩޜGeDAa 2 IHxԶuC@e.R7 n֧hZ*NٷvɕI + bN"v@%Sd1\YF]24FIMQ +<3^oZi.܅]Hhʼ=$p(>>Qh Mh?A f-uK}7=\v444R7)` Hh47*o:fJ&`E]p4lZ@`baY2{ؐpcXXL{|75*]knwHƙ uhna ' V)V - M24ÇK#g@ ΐ!N OE( '76yaw/@ +{6H Dbmw޴z&Ұ-ȋ1jDŽ5հM+,) Y#9jid!\]}PPxKG"4_UNX\=;M/]YYx&렼ۚ9rKӋ+c3 ^ Oau8ZF<jDP* F]`wR ITr7Oy4 _J?cB\B q PVMLulg#תuvgg$(4 +<ˤF]r mʞ:v&տ9Ǫ'Iex27;ŇѕJF<" q +.g$Ҍ7Qm tI[ {>\c˼Jc>So% euB uw btodEI-Qi)諶vk{;s'+!1<9$Lf`Cޣˀvޫ>jtI{3L:u. _Suyt/S>#r [m0ر5A 90-Q9dz#qO`+U endstream endobj 2710 0 obj <>stream +0 D@&U D +|{0|Am x˽VjԮ ^;sS0کu%: JeF\٧=՗|7e@Py.>b<6t:e9_Yn:Ȫ s{mv~tjBbre4Y(bW1>pJiITU %H5 +VLܑvV-B^؏#>)wCC7]uU~Vy9~s )Ry̕Նk댻A5F"3bQ#`5!Ο 3뒩צ$OT(ypCxɅW9h+y̕[(RߞbB,!iZVac8rcmr +տҔs-Ѹm?:[܍4_}.h b

>@ҁwI=AeAHA[yФ +8D-1ϡSQ^l9Zٗ܈[LY4ZBOgLo)1|'^z/Х A'ymi$y ~/C1Z:N \?zV54mSZCE{S^/S-qa|oLSEOr8tT?NOiʔV +B]azy[Y͂v8mTV=o:i̜ŠuĞjTԠ?g uYk[@qO1aRqvi%}5EK#K^`_n~tR'ȇ,24!_}[pD&TjGy1A#zSx:H@\%":M]h4&tMH%{;fAwߧ{wWuxtHi;ϲG4] G+vZx4۳P5u 16,E[ b@>$eV@-}SaXܠ^ $LQXjz1o4jsP =Y\ljSL`_'焴,@+ua|6%3H,|UJAP][$^HH6芵Qg≭&zNb*tB;Dl.#eAބ GΕy(hdc7-r#LC +5 K-ck#eWkWnBNIlVǞ]QUezV1~ܷ9t0hbg6gaΚ 9m`)|=sڳo #)[i% ފtկOM,+${fWʅ}X?Uq(6S4w-/XZii=yzn4b.~B+".X I7RM!D>=SF%lZRΫCs ?S #FL71i f%̂^pDs A&XDG/ >nD+>Dɒ4CFbΪCI +Fs!7]kF8锵a8պ>[XViȴֺz|UG/[1I@Qv\奿-WBeliZZ?o4.@B\!" GڑϠ/+ң&Z׳E%:(4<]˺!I S+FR(EKͬ,W A 4㌶}?ᣝ}rIC|TgD7PW[{Gyx61sV_\pob?sFMI6,“zmUsʯ֪AC)層'@#^oyvMUyAfx㰷 +F^:o](QZ%sopS aBe+KnXZHKFl;"o|㢠F0Rq5"ٯ5Th&~-O[9K`wJC4j mgvPuM:p(Q̨n_" jti:o]󧦟|dGA =  +s:V)qX$(ִ˵,83 +-sq(x CÛ`'YN;ڵAcvT9CaY_}se)HGhro&wj;"?͞UhxT~=U89KH1wXA4l#u9{ID\0( :5򭨔AD+`\-; H&[p vPZe$pS+ԋ g5(܄@{Zl5U4/)#t鰢U_4:kuBhN\ZjPy |K}kKw- ׿N+;8‚?AFGRș9`|H !x/+D;ܶu :䚫!FR>"W {KWƛ|IaaakG5GKA;V_6.h)N5yh)Vr_MA:1 +hu5~YmSV< 1Wkho>(g-^A1ԧሻ{\T ~ ͫE7G~䤁u[GP<[aG[5(3vZ}Se8ې|7d*=Ś9,uaϠ/OYm\+i9Q$.)r*Jx;sRhEvR7л *#%iA5z*]#S" h 00,×q#{v}mY]إ4RU2?QIIg];|<c6' 'rjJYA}IxQ1dS7BQU֌.D}2x僗Ą09&ǑG9R"@mX!OX9Mԥ@*02N+{ԟ?ν _n#m>ftsnAQ^7S,%K>vͧ4#:G7d|MEIcjμbCزvqX~u8XAv$j:~Ӄ2 DC- h5bX7E !Uv$uu~ˮ l-~xghGpx@oM/D v,DP d 4zjZE3&G,Q5Y;cp{3M'=W ܥ?h-.$Ly?@d_4D*7*XJ*[a9 &/GG(\Jô/%5X֗VB.l 2[2"`Sw%o. 묈(ZԼic{*.&U"HpBLшtVඵ>F0~r2O]< Cψ٩%iQHŠBr ō8k. ?5~rN#KIņ92w''\8L٤pbT}9HtG'E:9j>0LԦ@rk˸M TcżSuRe_lr- HUț hjn&2-h'LxSzCFZ!Y(T ]EjEgX7S A^]C!_#:LVc7Z,%hBOЕ7ɤ.5'~#J]ժO|j+b2EnOzq TWjp hOo|?)[`(Wo#2d\0cj.RDi"m!Ԩ gj X`ʨ몑֥"iꆸk?Mv-A>w=pg GX+w"IH|!/#sCՉLZ]&Jcr2^kO>GҾR:;Y%pzNlk{[1 KOE->mxK^N#*߶N15>Lb*X7t;ThuѲac2h F9׏O2ŸfuO˔ +0g'o}ȼqǮ/|:Ԑ&G;84n+wXARxg'6Z~5֐Z+R0KͪBFnoc9c.|0V.lſٺ˅"JVD L]4ƕR`Q brtIvy8FBaR찋\|`lO"[x*eu*6.J2W~LućG#0ccm;Y*Xe.tfŖ%1\liMUV4mgӁWvML`ۓ?0?*iqcFgHQ}ހ忀*B.='HQ]!]pW?<"uoM8}rG6C'DX +henI\r\/4P>&fjɚYp+T{^L+Us/aﱤ&##fL70 +[f~">dTp+OPzށnD Ľ7ӂ5hKM24Ix2Fȷk'lu{XJ n*T~+`9D62M.Kmt]YW󘥧coPZLpdy?ʄ4{ۂDwǖ\ ZОH#g .(4!'6? +2ȒIΒB ̂b>J #;Q2w*TBvg=d2|.E5-]&uڠ,^^6(IA4˯)Lͻxf]) ۓ,}`5 sJ_>ԤvȞw<2o~K?4>o _$_wWF1&KxW1 #cU?6;ݘ)jF (lʁg'׶sJ@LrU728Y^u#dj5'&DiL2Հ_mvk3E +nP|-B4"6Q=anCv` :ZF}B2fJ󴦡3,dQeM\ }ϝV1(:Dv>2oqŸ)R)r&%7r?]hxo`-c+z+(wug9;&SHr[5cO9 ~M?ɗ~!lf ,>c2fuWp_!{;p `c*zVwZ8,U-Pj%7E]oWxH0='1Ѿ$uf WϣW +2/ӣ p2b.>F,"$lR\`}/_4+7x;E%.kEQeQR,[N51\{?Yӥ_eOyqK6-JI'5>&=`콾(p6i&悰&NW6Dq3s@F15vG 'R"Nj2jkεQrj=O]YQEa^&Ɛ}\ZW-B0}kkڶ^ +AJV|]{LHL ]>8g6-cQ-]:NI<8C ;&A"L9Y~2k@B5(G2Uw!*iBO">A<Wgn46g "˾Mz  +Ѻ +܄zM!CqM:' 7O|o(E= 9I/;?t@FA{F%6rqQn&z0L k7wFZn53MN_/)Y.Qnҷ^Y> e : ڄС+opc%jB^+AfWNыֶbǛMG ZL=KFw~xᮛۣA6svRve蝎 :5 j?/iI RāC*5EnD~7j9q `38hp5[6 8k uċ⭚Xdk8:R*!oV$ 纱T0!?&bm}"Lc{T#剚C O e@E.oR,XPO  Tn$c R  +kvL\ +QD ~5[ +ص9jj;uhًC`vl,ߪ+5ѿ5b"#KXb1;BgTP>~ƥ.~49Iz8*XɐDazߖHBz n8և: 4xs8Mf3n{v52n0eQg- ]|b9R@e$|ǰeo!A] +k?6Bp}XSm?1p=%'-BFC_ |;:D [iUVFw]h!(|/޽zGa8ɽ^.} %CsRzK"lEE0F&[G{?Y7<%X(Jghu@*hD(UWӝSmSyuE>}Y64-şQ+*+Szeyl3Q7Bv" +\cMy裨+dq.Ҷ/ LOӓsH:6\Pe-T]:3S`󉚒wo0L4[5BKur SW:ϴΫxC@eUGR=0vZǪ7ߚdĠB6~Պwk:ڦ }& r[Qßt-]ջh|ǞvoI䌃ӕk ,mx0So~?#4slw^qd0FjqyY f`6=}~#ʱ =tTM0-!+HtӜN +QA2ESH;$K*^X}]볫?,X鄃z@ ,P!! ٩$#'UajF}b4:?xP9/ʞ%Pfl%}?cl[: (+0ЙOr``iFM6S>nMf4JlO+Y:ӻ7n3$oj$}6',S'2Pc)\RH0.`/N% ˜{}ǧ/S϶tCE݄iIN,]N6boKTHy5seo;),h;,z \ȲS"7Y5A[^L =Q +b}`D9f u5@~LBgu-RVj;1}r3ܾx$m +d/Rk8~m;hMt'vlhM <b!B +[hijU_=ÚP?@t0^D<0\$ w`g3-^ȩOVtɇ.NV-TRۀziN֦mUp㓺m_Ldo4X1Ձ"^>o[huhEL-U~8gJ Swu\$7PH6Gu=(VLH6Cچ#EBW:_ oB{a3%,fg}X-IdrxL&x!]h2 5wE.㈑䲱 Bѝ|{ 蕵4=") hմ-R>mp0̄ǜBKWVOgbiht5!/;D+=vjLF@<VO~ JaCۓ"ΩċSkC9q$XAo^GT=|:Ƃ}EmM {q9!#Yçd")>ڽqS0 WX@FEz +W%Nn#8Z],W¥&uvx\_ɾK=.FBP)j0A 7 UF4pY|V)M5n#M̲"N."5|36](z׋HO4-a3yn$"GFUriFz.߂²r9 +G36qpuQkJj? [v>ȭGF-;8KKxz$de 7ܮqu1bk ƞ_YAݏ NJJ1;-5Mn6, '7a9VrRO{f lW#NYJ? vP0U9$T835jq͟!+kC;|q+0~07uA &~ kսWкMXDj&j{C4w 5N8:B5Q/yĠqv1q5] ,?K!q^nzvQ'nc[SԨjdȪSM0́Ly[TsJ@+8fۼK8nP +eiDx5a+s Ka@W5h=t _sV2l h5ph]þ +.fw> Ϩ!y P85d՜xt7@TݯtuF9~ +VƤ z`nߋPݫcs@DVL3] y<2ьӲ>#=S,cHp<ʀ"5`d$Q]V +.$e=̳qV73 οȁTTIlL*6ȯZ?HlP)lI]qڳVC~{Wl[R+Y89*? )_\r8D;[/y]AW0F(rnN}=*xiIe'p +@vDk/)JPy5S6-|,)}I$֐X|i6yoH{ `Y}ͤwlz~-WM;H[J; +A^ɵ.@>ȍùxc ,;n1rk}/sqZLޒCQTutH&]l3|HS|ϟ<6w7":Hc;Uzහ(EԤۂ,}݉:شit8δE~"r9;6sQwiE0aU >Ê_>cUԍʞi 0OW=G^tEqnRv5ьڱtȂ_M K0 2( +$qdID(AqG?7YCL•z:e;v{ayƮ2,-,ee\OЦUX*75-J$~ԑp:w +Bڱf?i$\~_ŢRPD_; \s_&@܂-]a{*t9x M/xa*t iG>餛}(xST@j$ۨijm<4ds c&<^k ^=M+['BZ< f i) ʝ/f5bO\ɷWڥ9I4kaRDUj#RFzJpOWq]A~5E& ?xW".U vG: q:!6_{GK}>_:*uFa>f W9#Q-HQI22v]f)24Yii2rױ[n8|c"OʡpnSbx<;d h9xO&KBO(˒?Crjڷ$xkw]]?S-վ +Z&TIzg?WƂˇ=E$pYˊueEY<&9K]̬'0i8 >ÏQ=D=Wy3m 4p'8 [ f)sisI4'!w:1u4뎟P ppR?%=A f1J ghe*Tz"sXSe$dxyD5t*7Y( @4>$tY@eRܿ*sQ~,[ AsN-i*za`g{d==u3z'5yՀ:va*:eD~FLtOc>Ž9Ç*5xLE8IL3g@{ 2l +swM&V5MRųM] p@S~DjKfIvhPa;bĪ Sw6 +{Twrr`0>FP ꦬP@ODu AுEYb[7oĝt}D:W?;W~ M {+; x,Oݽ /=(f[LLU+'Bf5 +̂&2-y⧓cI;w٢?@>SgrLY `-, NxuxG/(rkZfY$*@~ksҺ`]5*skKȀ엣4popA˖캾*Pr]¬1DbqIQuRAiL:|깕ׁˤZ(DG RSIMtJ>}t=qWT0lJ94 +(8pnry,yZs }7{-Hfb@x4Lې ^@_Ko l>0G3B'2*hCYтٛK/C;RHqql梷NxSP`~aމ760( u"7eID +ApJ5nZȋ,v` Nj+Vuo [^֔%MVys7ǝqMv 2J<'jyEǃxo4ٞxBeon[1?[<='sMXx_23<;O3'e|wi d\[+.׵7%Ђ#7QA8up&i| 'Ì9G,fbzB!J%zB=} +EăyW$򒖌.,AoD "~)V_fƣhA sl?ԋԗwC4'Wk[ B 4ROX$҉k&L>/̆K:g{*e\tp׆foN7 uwKv_bvy4E#z'D@Lu\T5G4AB{dm&N`T@N7]k[ Ӝb_ØD'dڤ2N%M5#T0|=`RT 6i9ݪ +P#cdvu"kU7:H,Sb;x|c-/t⥸$Q'B/a>& 龶uԃ]NC aA~Ny قD10Y U\vLBQ Cx0٬zOq6 rd/`I& .r/*bS|Sw-VCX[~IXFJH2]dɘX0 E c&fiWnk z/\ڤQx,;TPoY6L"-)A _:]ykrx8u~ +$TBB_bT|+la 8 . ++saYv[s=z{_Vn"%Nr?v;*4Q_r{B:Fmjyk߿Is-ېzvFRNJDuwhCJ2Թz֘bE +q $|?tu4;-bq?+2 uϕXo w$ϢI^W{rxaCij4qAIUئAW`-ОRʿ¢76p??߮YEMv{ºVwxej{ɲde=%DkpeNi9$\UR夒,C;qbsKj >X%I`ٳw\В<*D^ 0w''R@4jQ\9+3t\RÅ Ɓ^8Sה,("~vCAO^Lv1tlnU~>NX{7Rk+*Цþ6c*:p_8j! t=:jqC#ӻuWsK]oTԦ@zxC_ۏyXoLd Y03Z`F_ u8概OG+=;wx?:#ͲĪP|YoahѼ#-NBRDnleńPgS2Ĥ4qSp!U@nUUreoBK'VH)\4U⭥T"NZo +zᏛ"Sfa2ܓfjܫiu{38/?U4%('wwA]ME0r?Ee7D*OMz"h/]jq߾?h|;)$"~?#2$Q1HZ#3z40`Xdrs7 O=6'y%fÙlŕ+?">S\aTa\-XLR%Z7l &!jH(]8"djfqPNgF;11bįc@z_Vk3S ' pVI/k\&c+lԕbUm'7 vjWL`Bv "]^z-F1f$M{)xDPG` +q""פ8Y4tL]F5bkv]j4'=N9vc0^,%*]j̽'׸R7?c6B|m2/r<ޫ* Q'O%Xy$hǡ?0kymhbk +Kx6 h'%. 6"=,۰w ǪW^{a0Y $I9Xs0SK +[$e,Z|r߄vȨQ7 s)GGڜ.8`Q˒Xv.O%< >"B҉Z{'P6g<-+.yRi^& ]'$8ډ G6\3c UD*udďRR7aǠą3yЈ,vaF<[tqZ&,ç1xt ,qTZopOiǵ_]k),6 Au xsLARIVs{ZʻE2uC>?Ng<{G1UUс21j2xKw`P- C8=:aIݯl|}vIcbH5PW0c8Z*77B&0S:^eģ F=ǒMs4ydH/Es{Nj%xnh [۠u/0z9ՌC#Ӎ×?H͛~EJx6G)lnV-N"W07Dq)mYwj|۹]鉊d&4U 86X\ik$81U"G7gyӓ8"sps=?%2}9zX>wlM<^!4_:Kyl`2ZHo6j[(:$fLb<`P]]tZHd@1&V$΅ E-J#nJ׾ji:- ̇=9/5л泎 ћ#뢕Lq=Wpa1G0{(1v;4#?PRCIT I8p2r0whEۗ[\fW{ +pz4Sg-6%LX9%} \|"%LF%Ѡy[,EMQQ1|ɁՒTm,}݋5x:YzZ. NH2X_ endstream endobj 2706 0 obj <> endobj 2707 0 obj <> endobj 2708 0 obj <> endobj 2709 0 obj <> endobj 2700 0 obj <>stream +HWn7+"Ajov"hND+JG1$Ga'ma@a=s " 4p~e&|.'?-^M~\6`Hs;aqH3%4kbid5ܐf9yun>(C·4ɫOˢ&<澛nժEwW$hl.<+)DqGU|]6Rď,<<(W&`kQ׫]&`T +P%jpHy:2iD!QD1v!`}e8@E$IA^/m43NX5Ŧ&;$Cʊ痸(LCH?ƀ85Ν vHum1 +*96D%~?D +L(h潎:,Cc,6u" QPfgjBёc7_Ypߗ83Fd0mt uۋ: u1lKcD:"OzPKxRMW36t{]ijKu&>stream +0 M@& M|He(<%o!o>L8-[MG/m؍ V5mu\‹+ s=y&˕С>B?r9ࣙft=fW[x{G+q~v_}8pN`G1GaY<,lײ6Dp,~ $zP,Kpν%.K'1 ȋU +`~2 *QmRX?NVW#FprԭSQH:ҕ9lوw&[wV(;`j·PcCƘƟsY2H5Qߘv3`_ 9ٛ~TBbw/[#mϽh~<|7O?Ͻ>=Ei0;rZM]]r(HT&\>Tb,;$\m#cx qS[LzrNt&tr8krj +ȍhtو%iLgKYf͛&ͥ]CcXHy`Ѳ4鰗x('WP6\_ +~ypn֯c Kd 凡u~iO\ӂ5O̧X6n.Zxxӈ@}dvke+]'ґ03Kp E(",BŲ6&^<؀j +5HӅ_ RHTg8T ]3mx9qoҌ=8H#2p^.]}W |e)ɹɒϠlO3^nAe +IRmN`YHs?}qVPĸ~y/*%B,݈Fr9,] [gdVFVS_O;_y=; ~QYUiRĘXWVVȄm!}+i#̟V`]R@ߌld]5 sVmc5IIEu&۞m*}  mg֑+v % :&m𡠪V6Tgd Ov6w '7o{*_z5̤_OJv G䭝,.hc-ih|n˕;#|q)$C`B׆  +T +S:%nCiu(9Ci|n̠ |z7"F2h&(١O/D'\Q5ʂRȧd]vk37psRx2UXo17c+aMxVmA;H7'SKk ny zՏIk#FKX$=j ױOwdNWz9oO~b Z%TgԨEqBcìr +Z)VDO^rc\>?ZوwE$ӨG 6q_/ߦPNa'5L g!x>&2$:|F'ϒFҙdwĔFEJ\yP8f0- ;\|9)Zգ)O=rPnOpYX#l<L;xJk xH7'd_1.#mojO5(]f,Q&YSN+~l\>RD~T5UaQe |J~ee XĢ"Ӌܳev}IlHu G':M;ig,Yl-~Dj"-$䒤#`؈8,4NEz ҼRLL<@״#S ;pf0ZpHp2R:W#@|.:#mS?pG4"G6^&24FXA9J~e:6f|(Nt8-IT(i9k1 #vtG ƴќ=SH/Gݥ/z#ېX9c$j Fk̎.~~Wpd)Ue6E:S$h4vH1]p] +/%.ߋi\z8V?B})1fvV,~Fm׍L+:iɒ𯊖Hzm);Zǎ_ ȣzw8,.Z_ɐF<o+tޭUL<+]PV4kp,`GkIgEͷq].jEi~^QZ+Y(=`Ht}z6)El[*ḠtPA-@.U=էdF`YIk/LrLXo||t$*id%<߃ X0 +(M\e{߫w2'R)jd{"(WZK +sV͏z':BCĨ>yqĬ9yuo+ +I2E><4<Nd +Mpw}~Tzht45ܥȦD[_xXd~rVr&` : | R6|i]ZUȄuX0/0]GYo?KY&]KvK&/<BT}ğ6%Wۺt!"m4 ͜}Geomkx7JʽrCD`pYMnBھq7 펐0Vu^d=u}u)K&M77=7U`7O )H%_h>8Dz1it@[63B=J]:8kj/p{ש՝sMגk>N"x Kh q7CQ@lv;"6IWR7G +^gB?V"Mz`KWlaDk4Xj`ɼAڪn^5i6|=EVd9_SmIy8RoLKyu "A't;H<'$G𬩷Fen8[0+0ﳎ_lJ>|i䡨W5oe͎:717*Z%' `x8 I}?opJ(Q JZH22f g,ޱK-3mǁD ; 5fNuD)>ƇY [/XY.ϸkH%Sֻjk@n?˚=Ruv'OWS0&Ix ad1 @ՋAb,O/SZJɊOVkt)ZlK-СI B.'кlgE= /8L$$^4\ 7< `T(nݡ4K%Ʌ`WTCn&JrsmdWs,&DBZ6a9UMiBhxFz i G|4lyA(!C?졜*&/ _ƌ{ +ZL0:!Ʃ8a6H~qT2n `r$ɷܧpjlִ=Y&Rs+j.C@Z|XK51W=1_{ (ӟjWzʭ FdT_1|oG{xru{:,&,.jF{\$-ceB1KXWfP{k\CCDp]Q;?]2[tl2bTd-MRTkg"GXcO ls0yz32TRSxϖk"Pv1&aeD?6(莂#4Jha.{U>uxMzfJ9Ak:W&d8{81eƜGR >$Lń"I 7:FhM +9>A-!;U(R9d 0xA|4Ӊ)4Ruĸ:K-Kx"&8\.<%W^$X; k|Foz⊞ +^d\ϚU2%&T I҉sMub |U)M CUBрD,k06 +}lwGʳ'©1lXLW.HlL;±NX>m3D-`M8_ȁHpPeFW2Fٿ}f㡜]c#!HNSktxD +M2gϟmM+B.{y  endstream endobj 2701 0 obj <> endobj 2702 0 obj <> endobj 2703 0 obj <> endobj 2692 0 obj <>stream +HWn}Ẉ M05CILfHBj/bvnԩމJJ)ڮ(ьw)7~/?>~X[(zDM_aVJ)j~fwݧO%}}~}#l~]JX]II^)2m 3ƛ>c8fz9(i\ϧZmڮNWxxn6O?}s&s>"zW F4U#634B1!B$uEꐤòFFJkg񆚽R1)cJe{ܽ)0%(t¶frRNQL>2e5%atf[dAk"<`U@SDC@ҝkv;ޔ0ŖϧL܊T&srJO%ffh^Q1s*a[E` j=ЪE 2TcG^dG AYQBJ:t!m볎3!K=lϺMYY-,9V?af^ @qvPp"wt!i}1/ E {J& +~J&& -p[,̉>Bm}9F }nы4_1~@L)THk5'Ӊ96imEc/?!W+M[6W8 ׿ۥH& X@?jK JM=baPIjTR{\pˇ~IЂъ0{T)2@;*2`^LJݒV't ЀȥvK]ʭpȐ㕴hQuoO{hό?KY5[;>A=|hbo`㹯1OSˆ d;Ȅsg-VE"S]SBq =2=q +H>ǧ( !zq&6(I&i5,TջR.pABݱu$M vɳN~Ogx +>mxf8}_b/RWj{ƣyEL-W+ ű߆+ {8v17׋rsb b ʒ_@mZ|xH " * `SH_J7S?I*r.Mkg"Z83C@7PP@R0*p\z/x|Y0a-.RtS)P H_FQpΜr% _Lq,u- Jm^fAqA|<п&Iu1h=2( @ZA Fӡq%*LWiPVS +o@~(T&уeS@9e-iH9C +]#{ıXhns#.P5]izku+4XsE[bk@"_ +Ű$3N&:!B4)FHԯ%!P*X8 ldlO]& swWR=U؉뗸03f) Mv!C}ۑEjrّvNlYœ|HEH0x2 >I?nU{t;o>Io~BbI8J 4.Ҟ!w-1L_t_R7Q<_ +8Kͮ?\Xu6UeGWuIO- +>N5(U9UQ!Бȷ4Ө͛/h K6|%s,n';ob2r3IEX6n +y`u;YhRN$(kk-/Ar,GS9y"M*}%f֨,LΔP/7Vk/7z x! +fC=F+]3˸TUj@Vj3C<]GHd??2,&DgC1ioEg 6 +U,0?a~-0>Bs%YLƗa=QZu 'lARS]g,x Sĵ$îgA }xXӶ:~6.f*ݤ!*@_c: ,1q-A(61p@o)ַ;[RGDžeԮu_\~xHjy!YZT2lSpoo )PU8Q}p_P Cvm}^vVkBt)2`{d!AwzL 82f)XR>kJ8ȷ,.XCi1` 'օ >`k:#u"81oK4`U:2U0Vla,RnDR=ko0QM؍JY,Ri:zDl[huX(!nT #hT Lidm):k7n$hcMo?~i0Iװ !\hX%tkmFUHXUDoc۬6שIXֲ#,оkg_$t;uVu" 4|:Ò`R +ԭRc4rlZy㍋#OمDIx,t:[@*( M{npSvSU^c`؁ѭb#utKjHF|~IieE6v_D!`l˄R8XȌn[){)<+yIUVL"50 + +j0lBg5MίVt!ut.Eތ8p1|rF7IE \-VѠU=FbqB{5uy"'@>K,uϝ̏_IƚU$kwTTOaU2>ɧJI$e}RP {1_)؎@ +s<`EIv@7]XfWIrj%̯+01D:rb`` ׫'[r1xv%E= hEgf9B4rqy6ɍF2:K9<FSE6dʹK4lƦ b04C`PaS'EFׅ?#&%*O_ynA߬b^v&p]c0Q) MdIFTY;fː#AbHȱZj$ZRM_Nf0RLf9(kJv3}+71vz2~IyZSGveכ4TM*CgT$ޝzzFqa* CmJ5ϫ% +џV!$gOTcQ*@48 endstream endobj 2699 0 obj <>stream +0 @@&r @l9c-` Sڇ7࢖@j78i{N +\ DliWfzx~Jd|~u}cbkS#BuwޜS p'#> 5K/"Rb I9%%ޖG=ޣ'lcZ}$ҳb[7#I15^-U+ ZS|| j;H2,ԝqNfjXW)1"s/Or.0yt5'iJiZ^祋d!L_߈XpԶ&q^>Ȗ{fZm&_. A?*3m=2>C됦~M䟱;/8A TOTN'S?LW8Y'҇Rxځi&JzzFDT kd"n0)eX+̳ÛPEP @rWog*.χu%SUa F6>t1? \aQ;u$sg:<;Va$A$]NY}YaϤoovʅ"PԽ_RrQmqЉPou;(uo'`Y?s|\5If7~B|vay+#F[;/тidI:׫ +R[i2ZO#-ܗ1^:i)Xl~jt(̵3F[8$?Ɗ&Rt]N`&3r7C"5V!7Sb27rSx^Fk:.O3 ;];͒J7*J\οTy4;MF=SMf"c&K9=ϘbiڨR#pֻծb5i'/&f=&9D*%;USt6h"JbMZ)c^Igݎslߔ(C5JYXRrb,]lG@PJ- MʥV\ 8}5u\9ZMC[l#yjmZjYs|1V}Γ?X %<|p7[꼛CXO(tR@I;l< 8A<A ZP#e}K;5 TE)!]=> 9Bgna/G}X6ݮl=75 I! DQ!W= SZ*V C]ү@:!DAMrs:%G,x -lTÑソuoMb N2rEHCRJ^Fv&sRp8g_sBTߟ X6C[G0xTgՄ{/#/%((%$cnΌ.PTNSY*j 5X5 cIϦE:C#Ӕab!zJee~6 PL?|sr| \2A F_\"ZvtfLtZvBZL%_6i|8Q2Kd́_j`DžC0\Zt1rf|`{QE27a7ma!L;M;$ NL֩>us7t!ܾ%K> 4m)X53Ә@>P]Br%<^)JM5_lR +92BXaW!MܗLߛ4 ++WPl{I0=T{\*7 Qq"˚6=<.gu|YUu|r"Ig¦r:4űiEffÜ5SF5JJbotK.&{ƞt]uy9JWOM\\\|ˣXsŰ 7vP`_%j!=}͓,c܅^3%}K^s$x0w,#3.љH.hiϊ4#X5$o +S2„1 EI5v1g.8!A|xN{WJdQyJKc(mQ{8wx7%ڀ2UJ,yWyQCU=n‚IOKm<o$,əkuPSe@{h`@KWԾ ;&E0ҁKN†p7!NjxGq!sJ,(LK&NC!@aB'jpO_ 0ɽ<-{Žb*Jծx|͚jBK/2Ši_eXQ]^,ySe\ʄ% 3OʹUYCAĘpkO:;ÛrsN7Sd@g/ /b<9ɣ7&DЬ┋< 5ԎķdꮘTфi\zDTpɽ|ïg ,eKگ3݌, U`H$ҰrhmdqsJd0/ك[ QB<ղ7rfnM۰E4qHe;wԵ0~00}O3X`ҽC#٘*[aHCS^j-{ngfFqW3ӡޙl'=8L%*stE@zgݘ,bqο,o`H63Ǔ %CwVO NR#3xMǐH|@tݧJ5zE;!tz?$B`f7agVmg@#t&-Έ8"Y}E81q*^ArP^3kh"'m޿ +ը_TCYB=r:3_M*CvJR/', z##4}s鳱@>_ȗ&CyVj'S}!\VDaI궎{ '$\ +q8lb]#gF9@ +u5{VOϭ19`#\ȫQc9zkyI1Q)coeNT@:mJI\߸0|Wd ?5.M_v"B U>/=8OZŮ"柣\ͦNm6ԕT6 |mkrx̃Z^r{Go֑`F?8EG9Lx RT39vJke9[>16wghwD@:b쒜2ːDlCۉu{ Ph( du. n"ش~qXJUrZTBdCĕ)ae4ͭ%cFc[ ƓcHTEKwv\7̵^(h@}&oS_3q_C՜ߠ\Rh'qd;5£))%f +]Qcr;j^[ÂbܗnH)kN rr+d(Y| d` a,u^gy2\jv`0=}X[sA&,ăŞ#0xUZySثtF- hh+K?eQL6E{s^F=/Y1K՜0@8W`AŖn?Eq_o'PƲ]8.NOI $ 8˜aK_˔ntE=5!S*/sqZdK&b + b̏<dcpjs6N} `PΡPzݚuv0dte?@~nfEOWjct XQsEPڻeWiGRpVjxWj5Muک /W&1iJ$ HH]HSmOKA~4O" GBzFbbp 8iI;&Mv#?o6b4x\ށ\ϓ/JζM3Ʈ:eΌoAx9/gɦWQ5%>/ZaqVx>JBҎ;zER$&M n;mmⶋS^F%C뱡ͯKql%ei-sqo#=%RRSڒ,EN^M2uPsk #{EZcW^#4 ߏ'WxK="8}!.2SwnH- v4Sl.;Z +c/}e"6f@ҥnc6(Ιf{>wUYҪd@ǃT}?{RM^o'7ŖBHyEBq*5egDMٻlԆ[vb_o~0/*b꽤[[ޛ;ǫ?IVKFAx.F0@F&9N0/?XQv h<|<xWglwBKi^Ԃkf3,b@xzrϨ:3>N=씢X`i䬶$3%@%O$ܾ{k!s|ퟵCGfH+;!L171J?G"^g4_쾫v+Tk/wђy*v3(! U)5f5ײ=rwCMsk9CIi'j0B-TF1w<`CHˎ܏:oys){P$ףZ1S)ͅ?R:<7- g.uű==ݮM'14'i[=/D޼6_@W>Dv~Y>쎰9V"k yxDhH$KѠA@;Df)z4!\s=-uF<;>u&cB 76=^?nꀼ{1eͻU8<}ҟgƝ}..r[7%k`!țVuTsNF>+xN6A M4@NfqY3-b:#ƯpZ +0X@Ry8DAc+6 Z@H*Y$81b.ZFl%N0WPHa>?zK4Okܕ+b`^P`j,8z%<4$ M0V$W`J55oN>U `w:h<&nD{N`=J.KwrK h(ntQܱ̾E_ +}BA?ذ P#墰|xsu SA6[֜FP>[|3 +ZB4?Oа>Za;MwknmqwUL-.@]U; ^dpHyuykQV(5Y]9Fu_5K;6W9XpBFC;̛MgP 0 AD7)1HюDi`GRx,x96:p8C5JY{k@+㺿4HQ}$M]lۿ\q<^6EtwTA!-zI |ޯ^vv"Gwn[przWlVO+i6(M{VpP3fmӥ"ΉWYYv|X[#m6s{ ~ʈϕSrF8Ds(,#wt{^nOi}'cf.fBC+t؈ ѺR0k =v( f|ai/}ARJ dmցB=ȸ><-Cn=~2gXEtgcxʋ]Vʈ`M=41zƭ:~"2~Y Io]B?:R3U1 Z' ."?1zh&NSz^7S$PU[sA3ƪx x*{DhxtGZjD0"Gbj?J +3h5=i9٤_LuE٢La^v&FuU!Ɠq>E䱘e-o!<7%JM̎~)ھt[)ᐌ33f)ѤNMA/ʶ|LJFItIN&r*? |K5sJ"D;hq$ +Xz O;k者 +JoUl7:{oJ#h/kh'f :]l˃*714R՘;#I.rZԡ2i!MBvz٢hL<~YlRD\ʦ 3 A2C]9󝂉G; ^L;"xu\{D \#`lMw:6XA̟֋jk̘Nb[bDp `8z1;[z;Sc@],xtYr8֨>Upk8%q֘>#'G7W< +o*ӫ<ˣY" vvpv~h,B㴩Alm;oX+yF (v@ j;#y4ŻuU޽4G&g~[ uڜ9bVR,unJBT0J#2Ʃ0Y2/ wX {1ڡL9@RGuz/J+j}N9*&z\/T%|H+~nQ%и^Hpzx11ZPl&dx޹m` 0w>t VB2L>r%-=Ԛ e ߃&L´1;6uVBE iG"}iJc9ė./fzuOY_uF(  +jti&!xc,+k,cc\`FIT)0`^Xŗn:{iwjrئ9em#i5l.9[O+.iHT/b8 E"8 +ulޒ \~ tK"=Ce05^?S^]QIiޭOgH~!V2DG;/+n/1C-Yo)Uq{nKisv0=Aɸ<6QkS9*&&}Sw4El (&eՀERy-Nu5 +&Hq`GB[+\הȑHe~A ++Y糝Ga3a#ɆGUxL`>"]oJhu*M$MnXXڟ&r>SȧqCO>(cM()dC d+%au(`Ç 4nB>&J2HH[bn%r޷(ͥǀY wZhSsPK:zS+F62 TK5 Qx5gsc5ޕ6WMk\ %u]z/Dj=IL%XiuL]]#6]O(QR73 -{+V2jĻc{ܒk/>?WۥnhU?m pL*Q +̇m ajUճk;b*n&a]"wLn%4Z!)W-x:.]ɰ!})܇mxmml`^f:GR Z~*%R1TFqzj"#`a[$4QFk=amFonW`PWd0H}bx ' kS1U؀z`Țk֩޺v X|r5}LU/r.jm_MDh1ije޽T&1^ѳ=)y]hg7:ey noL]s,Ƚcp&En=/_WȬriUߝ|; +`̛~ruJJ2qc:6WqĮp,ed,XD#^O@'+١חˀ +)"8B$!s^3E sϞaHBވC{P];s>qx *jI*r@gCT+~LOd⸥cDR`$ `Qn3Ą5|wN^M%X hXT|OPLFM< )k5aj._e|I2IP.?}gL>_OuF./0m}|b&*[lHx"a0}/rwqԄGB}V9܌?cmP c*'+ +1Q2?-K=qvHudZt9|5k` aj@ow(!XgP8s-1Ͽc˸M07qL4)e*΂4I +ҘIbN_H4y* {ʳp wtXGuk,k޼GJ9+q(@*Q8 r YC_0k9*8J@STkA!vÇ$4p/!Tʑ )`[d@ihU1L=\8#WQ<$ku +‡Q2b45c#pvN$EGIq RCu#P%U Գ }A!RU`̳8Ƈv)8"Vhq,dpA$q8:~Fsm".YdS)Rs&%2~G!/+|n~5]ry(G4tk[Ɲ;".?,Jc|T|J+'&mLmBtKfLB- smTx)t)$s51Xd#%Vi0n#ic +盧35)|̐=ܢsHD3(nXJD +ߟwDZmQs :web'7˼xe4 8|NˈK17[ОdE,F9a>ZWj8}+r@S۽WC}{(FM0P7{ǸH Bgn]QZwīx&7JŐ< +hzmVpvEE7ed # :XjڳIAwaMHDpB[tBrDî3xQH<,\sS ~;\?g9)*,_^TIFtNb] "Drmdݒwv/tM ]7Y(]kcȭ+OF'h$l׎rޤp̧\ςEܬ(Ye! %+ƵܑZk IU+@#}î xKhV|K:Ͱ.h/sqXȔB$k.k>ͯV9xZ%ʴ8ww s8c-@|~4bXJ-daiDfox48>*drQMuz)G]:LeTS'1(ρ'qdLԣept $LuYT0j(bbuv̀MB!_|{I\'hYKc9*e^!Fl~ZlSYp5p IET츄->"4a梑,V=IvG7cHgeQjnE6҄KlHu:QSgm FIWm7HGDl_I< dABZ,n=.Ymc%$5;S iH@hR{5[핋C~vք#y_[}P*;6%F/qQ@d; 0;GJf,jsp(|&7RL%ֳHoXHSaCNIOpЌBM=(c[MN{/< 8ZJV?mȃL#0m*s <:vD=@XݯdUNy|.s˚I 9GA~3;GGĝ-e3vK{R\4u3-?]3eM]#"4Yc뿻ϢṘbѲ%Mfj/ Vʷ?Lpi&7t,[J4^D\~)j鯐C lt*`HBh/n+vz$ܸOWGKTV@44$^ +]2+a4 kxt +ˈMm;01LDl8j Uq$RwLzv;eeX*G ,J欄h$ѫ yG6`Ⴄgcv=~WwT@ycF(K> #?'ǭ +o4'鮛ySѬLr$&0ipw:䄎F8hkI=݃,c8=݂g+`:~y0Y'|tuG"6FD̵[i3NWB j$iEiJ:8q.RA@" "ȝzQK/,JYo4=XOl>˾zwhWsQ3{ ki3+>zn͂ɬ 9MT̩+4@L p4 Ԍh`@ + +@{U~5ɴ^L ڸ*8㞺ay:SG!PBq-~$T8Aݼ+$B)a?VJ15!2FdKw؈Q/Gj3ӝ`.t%"X²'*syZR&X[e]a7n<[p\| n(oOVZMk +ޝ]: =kD8#X"8-zl(iQZl},Ri~Z N٭@UvAәu fԂw& + 4hhBCz!Ecc΋dD7{+ӵEZ aϣAkZF IV 78BѧUNs`a(d._xqigvyi˶"۰|lmPmQtCwT2x8\y. 2ƴeόΏ/sZj'zKݲR$8vrb" 0^3KRG#t N^ tVNJ?T;M8EF mqۣ ǵj?܆fɼ6 _$ K^QG)1Od/4A?}}l9+mh֎yFq5 90ABp{HvgM2\Lj80m"* b+Iʞ]q7 \fR@ +*#A# lwIcdT(5Idɚ +-<1!+bKc1nfv7Jr5!rѤTD"l)V '.k)AJפ$ SE VddSo)}= +_<;c T_~8%!m%/Q|gCE-<fWUlٸB^s7b#6ыUKpf:K8HcL&nX < a#Xs&N"&ك2E>g$c;5XY9hf]vj꥛u({$~{)!>p@z;CFnHE껾ؓlpׂ|0>q8_uruWTkdvճ~7I1! '>!TNkjHD x5Ȗ;CP4Ktg9@L 0t4(Dbh/H²,܄?TrG,"ɸS7n h~9:B~(R+E> { n #>)` aQ.!kd `U~O<#ȣ^ƱµOhiT?lP,$Hq _a9A1mq=!g(,=׼׉:ۄ>JDt go6'ԎIeWNX_%c fL8S`naHPJ͙oY$3(-Χ*mfh@ӓ|kj.H ͜kI¤gk&[B@Yߛ!cHQDd1HCLxBFV9e183xn5A5h}wfm\ xKBƁE/O:kA `XVXip$ <ڔ m<Ш.:IodL0VU!`^:cڮ^+)0B 4$|=O3Dkct ^umV枖L1^ezIUM@okrKjD/7~ OCP@T7%kvjڷX +$x}>^G)x>5SLU]DD+/۬enЅUk)ݴj6AGCgnu5yDF5[m%5 ks"ҩɖno㭝#F#?Zz~:if2PKh'*({-8>Rw~[C˗>p!᜸ftʕ!F** =@07@nZF9P,E;Χ SyV-SHs + [~ 5x.1ޚ7,6Q"%8LpF=9+u >CW(=;s%;)Y-) +z¦=}u^w^` _(p_3*ϣkazS(*i@~𧁲3k/DV2V:6"U@,K}Iw@;0U<@'a{B,Ӥ{]yNʑ'4Bj>qȣQxna%?Xe;ŕcg_fBi@E]jZU1hÕ2qqJe|j;z92Yo/gQ5䛝`}( ykIK^6no|1 3si1xjemq2:0a(RNA/p PEX??}*EiOgT R@y;{t㤖1I!猱~K{F>Jߘ33SNl{W1 hed^\@}z~lJZ9Շkfs +|B (Re =2dE>ҍ;7%˸R+x 1$Wҧյ{Kz)tZp|g%*%Tw˚¸K:0CV +C=%ݥ=->b0rj/VXDDCfoK[ BwLaYg@%W5I Z&.%έLrb7 Z+.g#de[B@KUĖaࣤE|U wlnVHk }Ԓnv5xJ) +*?:v"Ef s`ƢěUg&1<=e}ŠS`GX`1NfWiSVټ?Zoof&1LY832lRmp39 Bb.˚Bzzӫ)ݿt"G댧<5>m+/V߸jo, }`8&uSׄFHYoFP- !bAO˔> +QB8*F^*@826puaD^]T1vJD.ެWQ A"دR}OLZ0Ozٺ<;Ш0]~,vm45lg9*NփzmpV-Ab Tfa  : +NFO&KrElO㓨kU߈b*(&yxŞH?)M9+x|] +˹j7Z[чƉً4nN_V>:Ubk#)(Er!JZ򑥮BUdfu=2e#e0.% p\B/8qt!Pg!'%2wufn\-ZrI4k + _M+k-Pl + W.|>> Gr t ]q +ghXjP ++T9T|J169^g#~ږێd| \"RhuO !oݱc?Yueob;)#Sϩ4g_gQa SSsVUB_ D|2,:ɒۇ:Djk"PfC1ql'`s Bg Ap?Q/!ÜG +.pA}( SP81=3A:֔nh|[~szE~^ʚL{:/{m3Ox9mD2|*gOʥi2ќT]8פxt ̱ L`2ThȤ}/~#F=[h52d&'4B=+u 'oq}d/?>$?O / ekf҇#Q~[eD#sphP<)% bK5wI2T% 3>h仼ʻXgT?E ;̣(+'v\VJd'1_C1J7^J;eF6c8ZږWx4#冹HĺT`o]~s<5Nud [Iqg`4p8g~HMŇܣ;/3P XŸ֬uALfBNjeB ?Syª %AN4N h]Wn9ްg(?sew:$hGcGy:E? RV6?w8!6b|E/f\hY/έJuSLӶ]Ds˖CISYz߁JmUDw]dSޙJjaq}IVBG=J>Ufzs +.>]햜ZTK^FnRwGh~zKMVC|S+}`1%myJw?U$RG'ncA'3Vx}Dl ( P#}~ }nzIdfYZR "ʳfOZ]JkCw0]ŎliLGvB1>1zW'cAI?J=(N&1ό#bJA-4M+ ºڶؽ9T̔?D_SGAq̠֘B+D;:C͟ÚiDE9BI;=?jy'S?sn!Qcۛ#RmamDBDp6F lix8ްDE8mY"v*׿70~MԾO'v/7./uKjM=lBuTu7M6.Gؽs$@:xhG$ے܉ +eO,{ K˃ K4ٜx$8WPH6o[}Opܛ]X|8,z9 u^%cPΤ5|Q~M?V{ )8S^AcG87+ƒt4Y)3xg`qlnĊ%-޼lMhm5ԾQt_4܏_WP' 1BwAMd_c,r`~aմX"J-j;^ӿfz(.kR#c1 +m'%l-U1רiK ␣D{(bȐ_K}3F-?wښ8'DQ4 e=s#%jzăuF߭(h&xǮQorW]A8zPo[ƍHmnsn>F˷mDP>}UOM,r捥UX_qp _%Hia0^3^lB1pR_Po>(êݘ5E <1 +|{e]7D, E䗋9?ӊmE2Ui3>bA',}fŖI 7=2 8R2N>wM1,ᝈ$Xru2ۮ3}}SQ黶20 .j?].xڧZc*,̗(gJPF,1 cBpF}`Ac0]w@~֐"cE3ŵ-\k6̅ )بc~majWWxWV:Ѹ"焬V#:eFѵ^GY@=`B䐤@G_ ]{JS愩ST`lmG믑%kaD},EBNJ+9R*f: *Rumm=wX$"z#z!ŎgL'ЯD0'EO5xWTF^Qr>@Ŗ0I4h``AՑ\\ZcxTO<`nsKi~Lc"щoUCpL(m)+ c!HEfdt.@Y]$Ck}ܭhTjBVg$x˘ʚnF:vD* +3;M'4D7 HV[  + ӫ~^{knd*21qxxdh=Ȉ} ڼ@9gU/.+s_Ψ1ro =Hu,u~݄c!Dl0 q:E'B1^BuyWsHgYݦh%S-E 0yDg28Ga2vro ,.Z;] eвTK"A+Hp{'oZ1Nw FOq5"IʰrtשyEV&Y=T!{؜ށ;nr)/P `'р#VRS4?P- .1jmÈ@dbƨ8i.8!ʨ@2N<[X)O}VZ ߨ/VKHo;?: @ʈ6Pю&gݷ9ƝF%v/~*eJށ7vbmun]qke͟icTgQF[5)t[R W:s;& ̅fmXh1*.<579y4$90ڜEVM)k+rJ?tZpV!D SZAhW CTf4TVw"3"qAUZ4JᗮB]}_چj/;s> .,[c+߹?;Il4qש2(-Vrg𡜘2.rD'BF@r^Mt5KsIe* +|й  +YlXPNxP>J3w F;Ǥ}D-iϖUzHoh:~O RIs\2]@_U5S1f ˝^/z@ڦ=*$S3(!.9͋OНdiu(FxO%>Qk9,kD^OR6/ZIlo\. tT0usg$` +}a8~AvTp3rI#/P3NDhMv@qãk!$DOz"\NHZg[N +߆pc14o TSm + +RG`HFa1V6cJ9'AU˚BD*"cΒ!gO #scal^Ajʂ}&Ba IPP3\}e8d"m&3stv'jN`$XI"И7 hf$3ޝi\-PUݟ;8k׽/=]x&rgEZOg!<ϼW.6o2 N`W D|gY9MhG)nGֹ49z2@0"A?B8G#Q0SӺF4c'➐7匪s8T1 A,|N^@ᬤ&?Ss=w%. +{%}ϒmRoB2f|4 2t@{q b:s16ƥE>:e'8rgZGĭ-Ŧ/JoK+< Q>B´8Q trSvG3|'ž-.M}_L;J*b3F? nuC miǫv6#37t4{>AZL0˰3BaGazE*Aobc˨Pi4q .Q̘\z=Q +3qcU t+=Rܓѻ!n.۽Cf%[N6G#z_ u 8_^.2=S8W+}" Rܨ Fj{UarȵL +E qbKx}l! ¼M Wlpt;m?sx?&"!je3m+Yˁeo zK>+|ek#8h}+*#ε9ص:}oa^=ZSu[R_v%H)v ϏoH*Ԁ +Ax@ џJKJA7W޽g2 8n+w63f6y w@+Gm3&LUƚ5/B㍊0x$SKbE.9/}E/J5A3.yc(hSp,2xhU]{.NeN.< \zQRTY>CZ?=Jzt%ǫ f'uF\.*)h"'=S= vVQ4T OVN9fRAtӕB GNF* vl2V~cf@K{ZqDY+S 0+%7TZElƼ2u4 0tYF!pVWzog؜ԻjS W` ƀPhjz9ݴLࣷI97_4Hf +2?=@@fDÌ9TS$ C6hL"bJL`[ k]HE:|DbƩ->OWdYYHpAX @Vg!C?1,.ec_bF5bea"Qo +[wDg`u=`3Z.;/Gg'9Vp}|^wTp /w0txpC*BBnXs41WÂcLڰ_;M{X6-e}wSxH䐧ut?pm 1e|5W))%lIk8nu6ntR9 K2MK-J|ȶ\IPwD/ge>%ӣikG_M^N-?hhL!1]!p[K +|- }fQ (Ը 78ވ̩-XlL!*DcἬ=mIs3IMH]e7TQlmi{T u'8)^W >M\R5<!8ta@QpH1)};ia^}2ZȽqXz8-6nB9'++Pլ{ +;/믅9rr6=\(._Rk02w b8."r:^xh`;SA,/vfeK|6XAggBJ1{HNѣL*.^5(h w +C΀<[n#Ynv?( ROT-y}_8%t$`x{>W'f +U"mC*mREvu +ʴ02q&ԱqK̏O$Lv}/Ȳλ>jUHq6jMq",e:Y=gٶЗ(8۩G8(B%ς&a8Z o촓UC o5ƬMN662_sڋ&93LLY`RV5g/~p$莭Auvڔq*k 1=3okrhW;ùaVD.Uy(<;/<&zŸC +k~=zjθέs#3AqDRdT͸g@qNí D +, klb϶*AS>Byf(&+!Kz}456/YAdCG8&)y}6Pm֣apxÊÐ=zL\={[:z7GUd!pq + 3M$%+_@9T2ʦ,릕T*l'X3ۑsf4ZH)N~1Ā-NkõF?ny[d)?`vgTb,aRdc,sC4#%,tx eE2FԱ|T)o^Ww֘H.-*R v=r}RZu7xŻKG1KE^>-XTn7I;@NL.*.0I$'Qi|RS:0=RёS@5 X7L9j1,t؉}YJmA+Vӭ5=`4tp%z(ڶ,S-%}0sC*CPZ|g Q̕b(eh[\+m%쒸`e@3ve eiF6wD\쳷SvY7>?<œM qT󪏠  -ͽC/y+h=U(`;d>ߛKؓl;eLlX S &YV{F+n8Еa3K*+UjFޛfVs*mUZ scAQM%gn IHs:7p˄DzUp7GđOZ_ +T>h<']wEh)R9|g&EvV>6 1|_ endstream endobj 2693 0 obj <> endobj 2694 0 obj <> endobj 2695 0 obj <> endobj 2696 0 obj <> endobj 2697 0 obj <> endobj 2698 0 obj <> endobj 4892 0 obj <>stream +Hd͊zy8 +>sRhF^#y QG#Oç==o/ϧ;c_mӷKv|~_oo~y>}~W=|z>{O݇q~?>Ï?o+~ߒ~;%zΏx߽w;>lp?(O?{wٸ^ PZUuTGu^5P5FjFDMԤU PjVjUmFmک]uPuNNE]E5|| _#_k55|| _#_k55|| _#_k55|| _#_k5Z||-_+_kZ||-_+_kZ||-_+_kZ||-_+_ku:||_'_uu:||_'_uu:||_'_uu:||_'_uz||=_/_z||=_/_z||=_/_z||=_/_ || ߀o77 || ߀o77 || ߀o77 || ߀o77 KG#(~? +?G#(~? +?G#(~? +?G#(~? +?z $߄o77MM&|| $߄o77MM&|| $߄o77MM&|| $߄o77MM&||3,ߌo77f||3,ߌo77f||3,ߌo77f||3,ߌo77f|| "߂oȷ[--|| "߂oȷ[--|| "߂oȷ[--|| "߂oȷ[--||+*ߊoŷʷ[V||+*ߊoŷʷ[V||+*ߊoŷʷ[V||+*ߊoŷʷ[V|| &߆o÷ɷmm6|| &߆o÷ɷmm6|| &߆o÷ɷmm6|| &߆o÷ɷmm6|ۯ\t;]~~߅ww;]~~߅ww;]~~߅ww;]~~߅w߁w;;|C߁w;;|C߁w;;|C߁w;;|C߉w;;NN|'S߉w;;NN|'S߉w;;NN|'S߉w;;NN|'S ߅w]..|K ߅w]..|K ߅w]..|K ߅w]..|?|x>stream +HWYo~ׯdn} xmkpb100FHbC!q~}A9-D8G$q(IMr}oOrl~}B e31f?%LΔY5ًN^y=]~@TKZq7hx["X0>m{T8a&ju)Bx!IeI7fwUd2l谹/*:g$"Ǚ&|e *+d4E I3KM򇮍{>_Pt.Tfe)g_B% aq~_nA맟~~nVWRRkFzcdI LXH9DFC{V,4Drq~٬ŋb\bgZΟwU#!Xb"|U*>(8(f 8@:g Cmmw9naTİ1"ɤڍ8t0o'Id/m/^qȯ`p*0!4q&zIo'UylBQ}=UN_[.r"y=2"MR ql3ʪ8Y77Wiߚա} RG9YL.X]LhM5@m8 *&Lc 36^F57GX*sboX`Ѐ/njWӰŠ 69;^;s_/wy92kLjC"1=sxN'^j&P +A0z'g"1Yv L[\HJ,æ?ӆ(%1I$kj|Y /@ cОA@3)Fy3G.d{<MuX6 +z*uaS\&Ts R6wͺ+^M&;C%ssdN W SH sa/+ H1%u Fw>{7aTO{IIj;Bh8$Vٷ7x阸]a;Ƴ2j|\MM,L9޾('Qlf aQ)8M04&0[8Ph VU +n_7/ɇ3w:ŒXH^nҘ<3Щv:YG:bOhh +1׍3` $.r%&YQT-,]\}{4 XWUm_j@4c*g2.,:imN#uX9Ys aR,E4 C١*Ħ!Y+y&M4`!#UgX˾0Ey,/+4$Ìzx|)d݁VMv`W9KSOPpRGޭ.F+88@MxO˶";Qޙ<0'v +L??j/Df1J2EDs¨Ne>X vF@Ȟ=vaNKϺdy,1.#HW,P!r&)2χ.%+A佂ˏ7>*C4XĄ; SX +pk^pHaPflb{4appH2}nx]W _Pc29& }U6Tߔ̪7):bYK)("BR3*R,ɘ`"׻T<+aIyY#Bc( +t 8Q)Zi)&F(MUd-6XEgH~xQ_A[ZmVc>^مB@NzM""wCJ ެjҴK|97{t!ˡ<ѱiwaNmiRނodX/zqTqAqV]/GM%8 ݭtqX887.w]u{7nU<0pJ4<׾/O#ʐx )0U;zh- K4$Ǡ3 <5L5_8v}ylU0 * oDoS4r4|^TY1Q"/@q/$a]̫E=c4G߉"42{l ]~0%FB`X]| wS#vW6OYXy<)mXH҈Ԣs.&s9U|:< ]< 9D][4d${~Znn!=MaOgQxC4Fbe=uD}O}j I6%"fE$'w愑2=?{lg*[,W PXwDfբ":08HVm9&3>NCC/0¡"a|,\̋d*H3X~7&[%:#E rZ88_,f`G}wPWXH# +( h&*[zp/Y.44 ;P*5?nMviQQ;lTf|ղ'h̐(8g+r$kEYf05sx#*kibс.)DQUR sn3Qo_"IJ'0uaViaX.Dg]IpE $_X%[ 24MS YH]Nkk^CdM0ˑJvSd,EF20v$D[B"&{MUd EEp[v2#WQrpy*ЛRЩ=Yd#0I!6+ŔqvqX*7JU)g )k4Fp)MbZ,!\ ynʐ#LrJbgE4JHE ֭WE)Bg +MǥKhE N9,T}c70eF∓m Uv%$ƝF4A羛2mU9u*8(<^d|暞qÊS[sao9Gsq9Af#nFNz6zn.KhvSL)M-R?lǛj=>8xTRlw[| TIgӥZYIFA|qt㤌).$Io-5*U.:$2pwșOM(#v"_r; endstream endobj 2691 0 obj <>stream +0 M@&[ M}[oh+Ëc}^;MpLuc|'mp4sHV_݁`p㶓U%n~,ayv',y9dhE,Ե_jxE|+Ⱦ1%çQj$b]f.̚Y )eQW6b' +G.W-c,AA}>/-ϭd,vkīeO9T&n@(tbC*jm/H"9bXl[D"+I +׏fbb6%Ei?|Z<"w/(`.:mA;V65ڒM%T>Ƞ3`9=9h'R^F*LjVOR]ni Tj9Ùj 45Iхd(6,0t!ϸNjc1Zf%lJEz{_3GAG jJ RX"JD /쳰 +XM -kʧ;4̮tlA'F}$̽֬tLL!U5ΓZ do"o!$^Ugr_-+U<pOC!\{lH, pĠM!/!gjtjr)+ TA˪ 6nPT8!L|);$B Tȕ٠/&4NȪu^1G;im8Zʊ̇d;$R+;ځ}OMCL/*V=/n W1kDTA"x ;-$>pxnMm}#6t>|A)KMM;NjFܳi25`4ڸ0ު\A(u 3o+dA`7 +$Zȳ9T1L( .eC4ğ)JIsW݋ T?J|0ݿ#8sۃ1 9[I+a5v_}P:=r%$53z103Ӹ= %}AsyHDi'WN$|0}duzUtʐQXfAq'haFm?FC:`i.'Ӈ @hMΠt"Q'3%uↆ +bt +WzͅQ@IP O oӅ|u_nR6͈I _G@6Y<ŠpCk'̧^M +I}A0xA)Q51WiyI~@y7+nMt*ppZHxtNLUݘT$qԠ:Đ2Us'M׼(,;3J@7Ѵ3?Ba^sڴ:6vf~sAw`8,fȗ2i+.H).L [-b'{&JS'W}36ΓueԬdu-0 643~}HKML`=YlN2 + B0-,*,~ZƒiYc 4gP=!3smu}Z\~+o#yD(cnb+Gcߢ0ur._ +*g~ǎWYfY&!ew=Y3Y<:_rےCvݳv=2 ͜LL +5]_KE4f.a")ë~x_1%NOrTrʍ]"dB8U_-h-MP'@DsƏ0z9~ue#(}N|W)-!i7LhSd{Pf]Ql O{HP %0i{S +,0. m1~9v1b\aEQ \x>1shm ┃8;[GPu>hN呫>jZd-9M ))vJ3>]Uy;U'+\^=.4p$8$I!GS5Qϗ҆D +0Jb[/Pس=BE桔6[K{H~yHe?FW"i9̬Y l 8U>8J'qg{apȧUy5D<d+xW;M +6rּ]XRo]W'[E85KxfUZ_C* c#IG]ŝGp} +M12Di\u%%cθr&; '~QN:|Dz#@c=!3Nx55uS/Ry kl}O{x"7P{ Y]]? %F(-IaL;eXg1=dJ!kELv7VG|g^ M|Z[-qEL_p۽%X^WPcEIFlv`FPeѼyf((x`w g4WVLxrfh]{NM6oxkeϔBQ'xT;acص}U:ہ ;VOHS$EN ?msb`5~ӜO|9~pb * /c=`}%8t HӭE4ƴ݂1kyO{4㍧}ƜE@ lo*$7= PNaP.o_M|\mUm8Hi{\ K}z~ +6lp)oً*/'l)j$ihA21zK vM-O UhxJGcqB3#k1ݲMVO|5Ob2/c_ ҅N"wQH)cdO=3j&ʬxȄps)8ðO'_ߪ A^Bݓ!gD\VouK*&2Ud]kkS&CB{ΥZW(qs0f_`}6uf#\b>>87ƙjS>YnzwN|p3]͠Rtb;>%&cϷnDڑQB~r$fjMCh D)+,4LoĠɻσ" T O ?4ϜWn82wQW@-ct' UjNiW DYǨxaگ|,H\QiI .5Q[ ί mxe(p?@PhWO+Y~Qzjr]NՎqOMwxXxČi j'茗WEOYcFu&;4ϊE$KEWנTH&bHV3 D$6zc'0ut+ H1-ueQ"]:vvg8@zHDzSU9"l(SN퐴wf&|Ӳ-)>ƅKF1>3 +9a\8o'Y,9J#7ͻE^EJv "p /(3<,Ldzu}{`seI WNÝR@q92_v!zaJhh}Bl!;[p4#6n?ym/ޭ{E`9e)yEmԥ>PGϫF:khG"?v =v߅'4DfU𖽼Cq#jݕ74{)K]k-җ!^wQM:QJS4a|qV;`K=ZG;+E2@͎x%oDgN۱V\K? 5u\x`خ}f5 +* x 3؜gVKS.RemsiLEԛa!c Vv2L9Y#h%l k;ybem;}Bl5oCyMIA/bcL/zL$`6E8N@N (3k_9H>=?3̩azWjd|E/V j&2%1_-σP*%) +/'j #s(^Ydi,uǘ"_OKǤWg{G5O}#ck&xNj˖Qӡ)퐂04,jS1bdxِ~H1MBr!۩8(& L.L mrSXʆ\j^ )*jkvp! ZogBYH 04 5LS9 '&(Sk>%vK^?ܔ۔bP<û> ¡PIsH/sC~3-k/ a l_;R8[ȁREY˾tӋk蓶cgf䳷,j[W HCџ&rM8wy1n7=pl/OP\)4*ӗiT{F$5B 0;wʫk=]|n&EۈV5S[遐;ar+Zιsܚep:$UNv2g}gߴ9gP6lB$IYC19ZÅG $_cNzMS|tO*, ?98(OT?[v맚EI=N0OR`(|XhkXb (b&a`OK8ޟG Փ{_M +w*~.> c @`w˞B9*17@ѮNt! ira\ 4f}%gdj!JY#L^4?-gKRp7޺߲7l0j_fߌ/G)['NNLbPNF:?euA٭j mHzs_הXn "m*Bv&X~$X⟘? i&%#(oիSlYXoґǯO[U7y 98io8gy엟՟ _ T2^~4GFyBP5PZѸn8;o +i4#q8aeW/l%^(gAʿsX ?؁>s: wٝ۹YK+R9W*vm750'p6  늅,0 xPTso3PhW +WRq<;8&+C bmW#.YACkpK}Ӹ +ǽJ8)\"4[4ҒtrDPQYALWWt~]18rQyh>~A]j6i׶s|8ӥvփe|;T[vh9 L5ޯu2QX7^1;#&!V e\!@Y2}'f̭s8&N)~RlK(]ojlc'**zf"]O7p޿rr#/.`F`akh)HM+6<5 EO*J-GA:g $.PZqZW:~Wl>LNQm$$i;qA9#4:4#7\еxQȏ0O#&m~pGh3a>b/~@uӘ{rY6X:f H@4wjqh] %3`v`agy F+7#txwsE?7'8,>0Q2@=8XϞOv: L?KLڎE:$-&OnpAfO?9u V2ouƨƾ'645C$OWc ah#(!';2$"#:h}_Me;fz)=C5L5\\4 BP0I A3ѽZ]JLh|5^ NN:OwSʔ})jZ5x}v3G(")2YI&%)ᝍVphUլvwWFa4Q<)Y6 ')J]mLqZkfv#cT|z(k Σ!GMѺȍ> p%VHADA=KaiE7D<f^D6}0o)S#,0v[- -*};j`je +-VԯD +/0Ҍ~zom Xypa ,$B eڷkaƋ/$H Β[ "hd๲g*(WE92#"^rH2x:h{]I;b׬ +nt;h)o-ᶜg9#{ST #8#Rv#Ї56/ǀ`hb +HsOlRt VB*ja?aD9cIz> Z浸?"@1U)& QCU8vrm v޸LĺvPEPs4H*B)o0l^=-K}z$,w~U (v;h$(LD8{kL~WUݒ%34fF2 pv׫!jǾ?Oت6UaDaY1ʋCtϿ^>OvONM`Z?i"cMIk,sՍ>n]EYg`ߒjh6AѩL3j2rɋPcl13>=J$H±G2ptV!^^]hIǧY8]%&ts P`2id[+bR1CBH$e*&ѷ`ۊ + +ʓ1ɢNsc;\y2{mJT`z 6(Q02 *z]ךse;Iԍ޼baAݿ9#cª9SJKA0 ;>O".jlQ{5a[q`2=5*GOkw.9X䑣 ̝$uv1RFfaRQx m*5GBOLm#6w-Rs/6T2$2,y(?ֻ\ڐӂtkœ z]bб0{ol T.8́|֊}Z<>Jg0X6OC*5b:X8Dzޯ@(i;6҄[^ϤLJ9}C Xª؍ _G|)KO*>2>4W3wOMgrPo{.IIӅ=.|Uj~<# Y|i&TVMWղ?ONyxbS{ez7 +-nx+KiNw=([cO+ӌwh|O7i,7]I+!LO9s\YP6;s n4R Pvz ]ۨU,'By<篗h;-a̔4 {vTz3<*k fW!LSy8y,g7R~d&?{0}ePO0\AE& K"Yddt2f٬KӇHd1̤ L}͔'%G4d5%Dt9;=K[T!rB7qnlp6u +J\0X}vYcT@!\><雄F/BqVL5871M@ەJN!chXR@˚UhIY(:XmF|{<)Zd f Вp/m2Җ^oWjwD2YD>q'm-Sap:̢[q)RIc![dzؒnlF'W7/y$|1JAt"܈1;>cĵ⛸+ 6_˂i{ζ '&P71qYLKXVBףo~kFN[#/'N?9y:lCgz2L[=KA{LMP޲#pZiʌ{|،?@E݇"ꚟc$ʌ|c-W}UB3(Kzfi4\x%(AΨ23sDFOq]wi2`I`F}V:M$8>m":b 8OD1!L[y<0 I~؟ms۟Ar1b༟@vo'{{@y9t̷K#flCa)D-|-*<qe7DjOBS}~Լro(T33`3ʕ>VSw.e >~oʂjTDzw٧UC,}VBF% z̼n Dp͊k`?3{5YQ$n;| i؏&JUqJ'!,j{ǺP >a(UgoQĄT71Ja͢-#<[Ѕ0W&pDᄤ ,oRh>5Ӱ/A>M]lwb_ΉzgMCϜ^͂7Wt-7DxvƼf~E]*yc0|GO&Mqpd}OˊUΌO6ɢNx=8Z Cn/i&g%چ Q}Εeܵ8TPL>|7&]-U$E-c뽂N.XgЏrJ מkWYhH- pUme' ̃IWm< +qQG3ZlK`)IEثU;Zs=Rf+hM!(QBŞV3.Їa?2Q\LO6L07~@}~pX;0\ְ;lJF?kƗwGUN +J[K7OCdɘ=r[FPDy r :?̓!Y2暕Ȇ'Լ p +Z,F,$ ל +L `O~%ReLj[W_?uccSaz8u}yYjQ:`^q7Y".ۭ> -g?1i/9!]KOEV](Aϕ:8TrF=AߟΜvlZ +8^#S#FAŃtxymӦ:˳NB!M\(/%ˇMCaU)4QA ++x Its{׀&Jr!O΂u~"Aǰn)9*4>fa,`۰<˳GLJfoD,kН,]?Njnۍ6#W XY)T{/.XD[B^RŤ-DDx 'Wb7`Tqi׹*m*dM +2=޺`3fJ6&ax=N(ĢΦDgwc^P-a$\@ʹU5V֤8)X6b='F_ +wH +OZFdG2I43_qٶ:c4 ($=$RLS 1KQJ@@f00^vPpU2rF31BPvM;:\eب0'8X̉1|d+ uidw-ﰻAaE` +jxEgbemۥT "CDMOyG>Vr8zNOrCԭᣫP{_X<}4R!us0SĵMkruu_Dl]zsKmJ3̀ίhib:?n]CI?%e^<Ͽ8Mӿ6s Wk5mGC(֮hw 6`U}"H1gfG/T[˝ꡦ2^eKSOU:/6Sow.+RpxFo1}[xAhEu|O0ťsˣŸƝ +g؈FȰ{WH [dA3v=[|yky9e^BXi#'(v^90%; /z}^vy<f|(5G*4!HICZi 4AHrRUW k.@ٍVə5X: Ds~`gsJc.M!2o!CD-LպA 4] ؁7yvHIQyϼ'2Bgo\8vjEZKv_./ӞjA$DH5g mBbq%$k~;勳]ŶU{ WCm 4Jm7cZcϼ.ts f=qL('}Jko@:QM #uCưvt-Wy+&K^CǛ: N,E BrG;T2`:{&ޮm/Q-o'*k.@v+a}c=>1ĕrRdh3[گ`ٕ)ZO4h5=P}0G a2Y &SVӬ.uIe̲x[Q[c! Zò]m݄ozVxN.>a:O(pa0n4l&HjdVNaas]}jD$X9.Y  L4}\&qGJ0\v,8]aX?0HvR% QyS(޶ iP4ܩ'Zk +O`UNM (r`^=%rDY7JSpiBXNGdZc:K-0|qZ>;P|//!\NOk&Bjr04I1efNL쨶pR)QZ(sl/'w232A;Jz%>3y}PE0jQ,$<~nw3<ՒVMipI_wOY֙eu_$nZ#Kg0J`jߕk-e){J]J|P}|;gx)ge~_ÛYtQL{ gH HQ=qW}`r%  ,D)Xdwk=b67IJebO3ݵK@U,`, Hq(Ĭ$L˭|_c; mNsi@@kAdWڛzU^>!l3/ȵښ]Rο8~e/nGthM:QS7VTyθC9ز!GE"S(”~ +Iw`"ZZ,CybUUe;餺oC&@Nn~3Q҅>yu]#c̿t=YeA CRImֳ5k 8@hll>Jb6p^ 4l&c7 s@'$&1aP7G!rh :%EuT,lV"M=9i`(ҥK| 𤓷t^gEDzhT2RE$ Wo)W:Dq=2-]S 2mJ´#giuB>e2{1Q^o '*˟]Ԭ[ѭxhBVY-3(zaF.>CJKFH-j{1. *:kv+&Ѳwxr1mJ*1l %C(A2Db%UrEMB+H_ߓev{J9 uͶ cd*7na3xeXX +?N{.]0lg=(<_gӰ>S~hVkEYQR0g*Qz3&V=Xę Ժ,T=r@ cha:K*?[qӡ[r lY'&b1w40BV]9chN9p9?78L::Tȃн/gD(Le|Rɝ6yt{%&˗Š2-G˵o{X8G:: @A_jk0ZQ9Rد %I@ Bʰ^Ϫ;C9 PG}6'<. q,T^utVO{`-ˍmJ[=OaI+#~\Y;At<>v?&6tB-ф&0R-;oĵEF &V2 Fa WԎ kP~_&pwA[aIv0M+Wd/W_ Pp ro?COw̗OkMFG#n,QM`J}K3avpy~NVj`aqOv$* UM ;<0p/R9\(a!xL#M;1! bVG}KA0M>VbQMxѓMRny^a{26&}:@Fc5\fF\{D;ujL9~mRGfEJջۍ/~|PUyyMMf\l(f%-kOI#mU62k,hY\n3(ev@"J"'+VsғE29Ђc M[)gYM$+Ċ+2(腻EwUڼ@H(dU#h<"=!Ӂluܹ^55P:I̤lHzc:67Hw#k+s| Ԁ.c2t}&XJPkxs 풵7\z_Vs,4M[^PUp]5(jĚL +ݥs3Wc|BPp#_!p"6#?G>iHv6#ޮ=%2xz\iZY.r{Dּp G f5-Yh,-7`(OI_oU5Y0πlZyu+5K+N#'9r#yNgSkx 6U +a- 9w UsH" 0`NK +Oq7b7hzR- FhvsQp >ٻǍscT-hqt@@leZÃS78kf=K?S<>4j?4W]._:]!I4퍒i+fD`%R>~M[WdweH7AT,ɷ& ?ȩR&^c|M9RX>Fbj\sl?; Dٯ>AڕRݭWEGv⊊6h|G\DbֹTd@ .1dsD^ s Am`u{Ώ 7<*3 S~9̪N,t,} Dm}~Z;vk[kN'_ಭM_@Sкus/$jj(zPB&g/_{3umɴ8ntC- +AL@rw`I24=a@\Cӆ +UFk4-2Ӑ`jP@ Z3 bW)Eyl} ._Fl8.Cv鿃dDǺJ'Z0O.S׉ڸB\Ai]Wmo`[I1?\nssv~H)6b2:7>:HVqt-mo1sQtx>nL]g;*ra'uk*e!pE9^Yd>xw: O8.3ls/6h{;jOMȗ4Xl6 +-JA˗W4& nNURO $к09*6̿?N&+{t^p}'g9qN5t ph /)"x#QWk6aAdtKE~<'{saM@sqwbeb~]&=06"r˓1"1<"W|:Yv=L|Ý/X31 +e'|#3K -v2ҵ ig3j"n 4؞<#X1pWM?͡)BS  bqyis!-] !vSٶ#OkQ,j-xUjUnJP3I9 oXG6h ` xK-@#ϰd%MذlU2I WS["CkSd5?yu3k8ou2-p +m! +'UA؄ ԃXr8%Lp}>>IRntwV!xQ{l[ X+$ZٽkJ2[ BxKϰ̹+% n!Ƚ-hqG) 8A~lHG<M˼G-IJ Y pₔklHXsEcTF`[oyZiKSv R@RKWm< pIP7O12ݺ#pK7h[/1 endstream endobj 2687 0 obj <> endobj 2688 0 obj <> endobj 2689 0 obj <> endobj 2690 0 obj <> endobj 2680 0 obj <>stream +HWkoF_™{nɶ&Mc ,hDy- A5gܹs~R PO3FxJUb={˚&ٗV&u1?lf0<&/ sh,ጘ4QTYpL6{jv>wb$?ן~Jfoj~?rHuNL%JIbL2_n.u)y5{y;w0\{sc̏@P}?v1~52YPM5_~|{3uGֆ"\$L 70BzȷMQ;$jC" ';sO  /Q@צTT`Nvvgs +Tu!M$' S̳" ,4I1([Ip|W.4|WY/&>&o.&JhLۀ彈*ޕIA||W/d-<@0e)Q‹ x#/)';K//G8D䞆4#x`8czH)'ڑ.CfהC yAekU#웢SdDctTz/7eӽϔR3IfyRvQN/aU)^ήFHB-1RU/Xb1&~k#&i刡>t5_[ܯR.VCRKkAz ڄWw Ɠ5(h}i$`~|jWi@4"iaT +۪nP WF׳^-N &|NfTCs `5MQw.2 \B+fLD&s +vnUI)}W_}7\[7 Xrc.VGyS1: T94QNDt,M>_-h>[i|1zШ&̷1.u+>I8f* a絀;2/ppH9i;>D@Jѹ쏝}rIH0xy]X0YF-EH),MSM{K{ȸ)HwӑۿvU~ʺhu3$970bI_ZkM@tp(Kr.[۶󦪻.l噴C֣p7Ōzѭ=rcޯ\_޷~D?%3HΟ E(۳Ն̭Q,a_wuIn78L&$ܗT=5|ㄱ@|Cw}^m >_"ؒ P}%"t:Έ`iU;N3o"0!A⥑woϮV;C6Ksאmq(Ӊ +3V)1u 8Ay +[i*"MF'|l82 .پ7:YXX}#9әx}e42F6UmX[Q@h4}Onr1vn4K :L&_\H+&H >/ ) +!+g RL + UMm+!$A1T?%AQSy~vCfjG:gGmb'ّp=Z|9Ct o"Z|eNmjA e^9Fi+%vwl[ɑ+ X'nն[䫼~^O89uaP ˪ZAHy96~Cu&˫M{3r, G%t\$<8 ɀRhd0]jh4.*%4 6+UpbfM\]zS-4k;i4QՒdy пvavq0āvۿiI6IS"))wu.~=z`og},\ q{80-~ak?sy9G5n×q$E/Jj~p &AjڀT۫8r[2 jE-) -ȇHP/8ƛ3% ?;T}MSW^ + +fٵLŒ +Ec cQOB;jS! Lmti`,tQRuܞR ݴW\1gE:Q9VXGEK +V rdh&7jN"!'bِ~[_Pﭏ'(A8w(uϛ%ޑH;@K|\yYFln15fl54GWj]Fs6T:k1Mv˪=VAUՠj4M$Pߝ&RȃG?cLjhMGdFMAQ*~(?o't,1U+i ~NY醳p.ʭ/y|H҈b3? ]mʮ޶>?`&NV2= YB (״SjPɴ)ԝp;L~Z߉rXjP,suæ$|Л*>stream +0 D@&b D~(5EqED~mtZ Yҍ ".NoW[..w:/꣯-z_BBk|V_3~\6}͚D1?4G +.ww*g\VsL>Qq͢U0lUH .|,\DEV((&ȁ.$w#hK<s2U\ܗE& +MARJjyj@7+qyia,d,~֞WosV% ^?TA*Z~V˅-̏ɀX@Fz9P&E +P9L"RJ9A1-$=:څR(}T9Fz ]0浫yBէo-: l.Qlto8t{~="FJ;߰5h81w0fd܀4v\ՙygK&5"ά1Z-<17++hX>$)bbd^ʤ)#֓8M ذOfGjNX:cvore㟺o4!YջN#-VI=tl4)q?}oi]8tX;#BBAa< nMgMS&73X3 +OVi_sCb +c1^V30;Ҁ>qSm>98dNl%jP!Ќ?\]HK<4IXyJ13RR.F3(G&<_4Έ*bNղ;xnq_8'`:ێF? CYB!ݙъyF./ #P)~}s)؜SkI<3uGj +ClQuyn>՝j0 H_s$A +#I;3Kj\[ݵ.%뀲Y2mO +X9 &օ0&LU4"tSlهʡZO|;PG jD +j4_$ +c>=n텛('HT;kJXNE^ +J %737@20S5wA]*--4?l=x5H|vY2[=S[00wɩ@Y(#<_*c[ͱ"l_B(F;6mYipsNhWsL61u}Ǚh}V XGEاH 0^;3C扗gڝ +b31Ҏ6&3o;z+!vSM6lgh`r֓SX\=wJ, (>䓤?ص\JOxSVZOFCṂgz׷5,KXaA2hjM 5!9s“t0rFa(\/@p! Q&دl4z.[l ~0`=B D_\ky^WZmZ-t#js'4OɹK,'SWa+йԩwoX9GsGblZYP`4I4=˼D*2#PA ?NPpՂ!+)h0O[?*\qwA5Um#FKu<&T + @&-Q=R**փrw˩UYԤƺ,#fRϯ +Ȅ7ȗ%.VJIZ`:f. 011dyhLJO6I1MV9+) O8kau$åpԝ +x9:E wO5槌fHlE=nhǠo DO5;9HA\w.='蕼 +_vw2UefhZOD6۰:lBM#9͙.M gCL$ESXJX~ s=LJ r}.6<6_[*5Yy-/el?:S~VI.=r.ӊsϯ :^:==30bW7WY& 6V"rt ( 21^b!<'l]c^+>יWn7q]Pk[d` 5b/ ڵUg䉇 To-XAgcc>Clk9:LC 0L."J&zs\$BNUOpҼ5BbH 3~a{%ۇA5&щΠvURϝ.W/J^G7 k^ޤfw.Wnof!ߗ5QGJ}v^/yt٘ >-&]m4R}߂>ޭ 4zK0U/dSjgElإ~:EkǕdR˕c x*CO5\˒ a=Hf- N̉ 6۽D6Ӳ64Cݻ0xѰؑwBÑ`p@Cz7N9 䋵ѡ$/XBfTfq9T_-ՐX?WG( m3җ.ڠ-%!T6Ƶu{ +6i]ii!âV?2;Oڃ Do +P/7TJ'\h(CvRkT,UW\&卆gѷ;1[vI3{ؗI: jFW$wpP<ېkZjF)>D&ꆃ%x }\mP^aJ{g뾨GfWQ'̼Kԅ?Hk@6 Gʅ&]7mSa嶷yu)MMNfO$z>즜m+1Ku*n2A3ʿ)Sg:k0O0 &d՘,A!L W|FmsC;a\lMWO'کpLe9_s9Bj\'P5\& ;@Z(0/G.ڐXi<_b AA)W]XmJo:@YB#a]rևpkHYCꄯ*ɑ?`%g9]$#! dT择 `?T[\^J ,QpTr6Mi[S Orp4DC`*/IcLUsxwpFRSΜ)ϑJ;[B\-]FB':1m?T-O#Ehs=iNO s x;:%@odJĦ<$5pR`=# {&5+@*v +o^5D7ia_kz9aZCS6xGI&$z'ʝ:Zwf^qӕo脀4 c8%1,;{k^F؎`!;"-垂_Zrolz۠P1p#<\ΰKs ")Vǣ f2$һQ {tsto:*H<0,F:{zX00T{ΊnӅ-=ݺ<;Owኗ=?`oN?PV8u)?*E/F6$dG"mRjV>;.F+U2r${^p?%x$GDp%@5=!z0 bxF> d2Aeժ4x#mdSN{Z=Ͽ0y=p)P/)8$YT>XLӡ&QswWg=!O:AZْThJ\ m{vX@dR^THΡX-&OX}޽~30Rd#΂ęi^Te% p7G_Nڲt/<,<-M$Ən>_ j,M a{D8\Qw~Ƚh3g"^ N۶BiwmڂMkX UyO"6w:9 pnp#5aD%Y.؄jix9,pO!MpB79B9ME3;D%3qO W\K1² -68yX3*Sױh+uaG[Tɸ{9)0/o&핂$a^Vf?hk&ZB +1پZ_ l,DXHVkFvneE d@_7(L(Wuh˧gM̃ò[HOLͱgV,grsP+'eK!A nG8zßkp?d|^ [м 3WG !larED?{sVL_s]7 ى_tEZp0x_skAL[uo >9Rx+q y/n:N)N,yGg3U4q6^ 2{_I:@pl$}z2(iC:_fuKJǕ[:țagqbuydK߳3wŏB6K .ÆrQx9vAȖ +P2fZÀ3Zk4U;DBS<"*i&DcBG bE+Jxg*&~Tv +ı"Q2-ڬ~ "iR\葑mIn-n5() |dZ2n@3uzsrRőC9y,%t")a)=ߺ╭:\!M>C.BtYJ2<8C1Y!M==57.՝rOܧ$1NέJR_%@@=_-yyfG,םPF5w<3K`>(h!slBnglZ@}9I` kc,1d{i֠4jw_ajr٨mZ(bw}dL +W|;F ٕ4g+[ہq}"ʊh;N3T0!/#,g3[ +"p?m _4'd:e ̮ T9g7O|<(+vp߿::tm :kc}i$/t!@X MRY՗K熖8fN/uN9vGK'\ZP"òiCbPOϣ&[p%(*MD@KQc@‡0e$eShȯI+if=K9ۣN0GDj$+"qpX/uYL N'N:"'yv8-FҞ: F$@k8=YE3oп0u-|ȧ6ڣl~I:vNq=h{5:D髸:%Y9 P\wzXیr0+ϕl2 0$=63Jiv"LԊ9ԸAb`xYg\Rk^23wJa!G)v5Z3[{Ti*`(ސ"8+W~U[YYΤR2 1V̑L~jW_/)r5$?_iQ>is"?5q,X5M {`șC3a:^=8XPuFp' mh@@B3㿷-( K0ȵVzRzr9cp۶mI/ z μ`J,;'ذ?nNTG"]!8i($@keR MSH4靚n^FUsz ƊQ:m#xZv"ms7qE.t ̈́j!0eM*뤒FT1tBn<ɃV4IkwKB}dAo]R:T]GR5:U$u("M}Ѿ ;nk V lv߄y'p&*zl$t=%q]n( "7%*2w|ڊERN4!dxxrNFk..,n< 6ՀC +3m揰3*~ts}L6zG9Γv59e_t98t܊V&h~4tVpF8qf [wUMA/S;2Y2F}Fc8dۂQפ4K'im5~S)Jmb]]G>_!HR!J(ib +xD(.bK#<3QE?/üK[B{K0l(dYU#ts@]iq~A潋Fr$(vy&Yz}rW݀_-!e< +jێ¢''hv O"suGw9:~]W~'0!΃hC9L#(_oa6t݋+\g5O/Eږk*0 IY9٢D'{hkf5(AUi9vMo@r׈_V/f4-rD&V +֥ +˅ܽn ׸J*jC5` 28V,E5=`wBlILldl|ʧ4'^Kd1 +w +ǕN^xƒ7MU*1tw4}WZMqg>zΟ)e=T- %LcxYg1iA[Z{NͶ)l|Z|WnO0cb N 19Y@˥@}eJ>p:$ +Di,]Q -a?vS|=Qi>䏎P),IsW/T>SEPrY)ACoQB+ju}-PM\S9}L>كe3DN9:ֺO}^^93&|jC7 $, +"_C + y5yeY.TcR !` w6>V]&qL޾hM-I_D6gX0[X?9NГ]! :pݨ0Gy]`138E>^uJxwQO :7| md|4={ `R|-و1$3?hq#5Oa^#ü.IdaEeȾ? ocMr*τ$p_ft7mI,-`aU-7kVQ07èZz#nk\}_ƍ69:(ƺivI{6` ZxiˑhxQbf.P;!CQ4]RBSUMUեBR@>Al,V:hZtc^9fH + PSR-OHC!_|-˯~@Ai!畉-`#;:lR[,thxmFҚJߴص3JOk21)%MBU#g˝}%'rU  &e+k wINF ̶'F6"[ƶ/Lע<{XJ1 L30nk9w, KӾlkŞohϩh@hJ tmۗymdS&;uLF~Ӆ&v;uZ9B">٘*R;3'cQ=CW'٢𳩚|,K`r8{ NOaIUTz`'Rk̡Q[d w+/rA__Aw(f,/=pu'sT/Ol6W|UEYY%[=) om4{K%Bq1&S%K1!g*o-ޙFһ Tɔ~D 2$_A4g3D_#L΁l7ux,۠*CEAli[;q4t>[RybݱRpLSfsiw˕Q +@Jr @bxv͊2{l2/Y12\8l-ibZ7Hdt[{ᖢȾ `!z!^*OlLnwvQr:,d>,[`CAbf8NG|<1r'P⥳aF'vH, +9XxG@1"4<x:IVOu,^APk$0+B’YS]e +!\J"eǰG&RG3vC +>A}*?W|m|(o +S_nCNbmK@mmU^j`3Z 嬒|J1mgQ,oH`bA?JT 3ß +['ۆua)ىou"UAfpD㝯2b',tSVM%5 6xss,,%;6U;:f0xPl;g+6sWK*h-x*`^=eO|qGGP^X-ƎĎQZ4yp3Kd1G*Hz+wY3/6ڏ8M{NDC@R:(݆F + oӛ:8ur@ : +} 3ɨfW"S4Yat]gSgGB ?.(Ѷz`vL4m{To(<%7\it~ i`|Vj:yG'id.` +THC G0.ROXv=2bw$٣ʑT"C$:hS7ݠBܔfG\ō.vFr#=?n^(Xu +WlcH}P&HVl3/l4\l#&{ՕY"xaƂ~܉J $[DV;Hk4u+[A#GIˣin.q'?Tcc)l}NR}S&-iFFhƠ; L6UHj^/WOno`'khcBijr{ ;EnSܰ+eݐ[Q% h^\Kim\G (ngY|?#G͒t7y&G5(Ѫq +)ݨWEa&Mb~&7UxANyVz0rEnD_x2A@d![ؤBj, KInrV +T  +Hh2p3HP[h%?>-YN?l>S,6!5n%1;uUT]`@eFFޏ88;m"6ok eڨPht"8@@c3 =Yto.gk. \_\kaYlx4fMP%ެ gйiyGs7")V B)tM\!T̽Z#~InNp=K xرs}]]qGV0ϼ3VzIPa$cfhCU"_5+f4f-gzlD ;sH [/~*q3j3oA͙ZO4'&+V֑k 4Tp8JYA2%*0!8F J#$?x07w{zӫQwk3^IV3ƽ+Q +MXkH^P4DRxY.~S  ˕V5HiFwʯ-?%v8p!`47 -3;k(Q-1A_湸iɢLJ@WG猍!)K,j|(lϔ*'zׂ\i-!6є$ٶ4[ ޣ,d͕*:4@=xw!{KGG$*귊?;'&nGф3U4ݖt KX+}gz>! +h  Tۅy6e[ߟ.GMJRr!U#U=/˴.5Gbj ",$Ը15ۏc_mr3v!8j9&U8Rbtx\5G{$lD^=Z@PX)SǮWw^Ⱥ\8%= Gwcn!yWCƟݙtWj2^P"}>LKPYK7)una8B[/mpDxj)fۗy/+޸f;S:I4 BVrj5 \E&@Lm5E/v33jq3ޛг/e`P i#:oNL4-|? JPi}((Φmwۃi8/`ckKf|* +^(ͥ3 qDEc+Ù*r%U +.&S/ ~$1$Jsz +(/YƊ`NU.Au͇AY;mⷭOJH< D=;q_PA[jEtغ|14L2ao##B SdTA&6xZ6*)Tz.qd]?ogtYj`q3w5R=tcUccJmj !K|C.: * RSʼn71x +d:RʵL&(%s,Y2{q*$bx>6fܺ^+*MucNW$Ϩϯ):紹:_wd#6*#xR! KK;K) E(pz5P J]bL/9lկJ<|Dv[/GG5G?َ5+T~\8{JdJS,_fSH7vwӉ0@EW[Ja X$W +fVCxOHѩ{F8VjDLchF z8J'~d|7D'uNv. popMlC0B8/Klf+U˒$:wʦ;%ʛa}rVZjhm!&Rn{aCID:3M 2 #D)˫ɾ+6*!wըOS)HROQc&GݨH WJ-Mqbόȍ{u5LFLf:e]rLkVh9ɳO DyE 7|Mh] +р;dNØnR!CoGv\1 @~f./K/Aohlǡ*V{1 ԎB}7l'+ȬWw_Pd&K6<&4$̖=[+,9= jivs8JM?LyMv* IVfI8Zr#|/p0>4 zY}8NzŚ}Csc&\w*350·x 5|l8KdΧ\n:GOe(F CwƏKb18VK+IBE@WkrD0vQM \Й9V,1땨sX.d,CPOg~x}~PvwFd[ M47 H0]n p^٤켖ZXU`kgj +NП1 gxYBZv䅸sz6X!a+NVrmH-+'[Sv +ڇgG|{DEo^u\=h6}mGSqC9#H6T1Z/=^P(Hk 5H#l a$UehٸH'rDTǪ5@HKrx/y=CtH<+| AM:|&–Lm@NZ7*Sn&@Lt VA͖GbQR>d: zV :@vmZ7T%u#G*jBFP6<%57p5TKf9U;AܽYd#GqKM0J jQ.RܨTuC.8F7,8ݓ+WC yWԾm)q'pJjk:8BxuG +b& >W_>+_w2Ѓ/ 2W&{YяK)R(tf ߷y2H~0<l푕,ZLh\N,$Z%+wI-wzZ7yZI2R/%)CvFD X"EdcT+WiiHe{ud&&d FŽ5 5x_*}a|W>\L=&zPTC,-ihX)T"Ё}a{HJڅ@D].`C$mಆ"cF"NWnBO%ԓD˺vvNcnRR*GzkBN&7#,xmt 4k kYZ̝8xFb~ [ƀ}(8BS=+,4Nݖ,pvlE@Ś2 ?A@4[;#ƪeRjfœuerƊ#h$3ރ(5򞳒Sa(bdX_eo",Q0Ɂ|:R(R bNP#R&l6Q=k/)@ⷷ&t(:ԖQw ^06=*._$zy]ApzEB&L+~zéʅJjT6`8ȅpvٓz lM_8Nb{rќ4*jc 1 bsb4p T!h #,+U3Āqq`uC+L#X乗XAs2BWA n;JWyjc-&$BIU*WڞNqw}2g q_O[*Șw4DG&H5%MHad\}ulCmvFLw!;΢?ľ,^l| :ttJKdg]O91.$CI`;;bFEƊ" +d76KiPҡ J3D-(9,<&[qұK_d!3iێAtiS(sT߽A`r_  dV+u<9D0B@ܟG` 4KKʇBruP C ְ|~X ʠ|:-] +o,P$G |sTBNjtJotx ߐ(IIa ~rCV2ז޳_95ɟW;!(!=s Orcg)%phC[KχVwVy(5?^fidfLx7f΂ ?Zx-7 0sޞNPfUx]HdH8i6Qdt0`ʭa솧%a+ 7B5ph4#3I{ 0L M~[m) W}5D&j!\8 "Á +>ߣ"F9g^!QPՀ5 iEڅ;#f#{1&y]roHChZ5shm 9=BirȢZ1r9cY/pn(ݣme +2fӦh*f7Cx8'hkD4Uk\'-iQp )']ReQ@ћ!Y+$=n$A`Wy +&-ey;z=5z^b +_JWPT}=.0Q6Ӿn^0N d|PZgWU&cZ`xrU;8fIl.[Վ +\6R2H6uBuFӓf{d).}`ɩsG.]32.K} #hM|e.j61( e +Oz^|ҥTgP +N2v権;4${N63M`F30!BŬ*Fe,%!iC L +uوـ1\튫)wJrŽLh<  .[z(w( iGpZ=rIFiS\kt-ϲT%6OZD{r}W^d@.i%8[YmryˇKW,KuJ#/Qoo^XZFiGWn** $f/c;,<9G)C8$Wti}<6Sk;B]Jp#4=ˌZ+ *!Ŀ-Е1}!%TMNC Jcbk2E@sa۪us +481Zs_v ܌VuS40&2 "wak'U0/F{MI8%|)4jA^0ylhÐ%g4]3=?a}Db-+v ^J*C +Ubx*ptQm~ +?'5{U~ +T%V#,p$,u2SoXT.37љSO%Y37S+{ dZ~kM˃M-e <>A*85 9*=$NWA)4ӀQ)#u4n s^sm r#"NRЀ~Q(So#_,æZ֍ 6s?c[жԐ3[ۖR;}V42ruOp- mx LC0R +{]akyc4i-*+Ty_}Y6L>9t zVeAr![CgG8/3 S/ mV5wѓY_3^h%L?ZkP Z9b_ݶp -UX+][ +=RPHfߨ WΚ1ߍzՎqHf/ӊ/+-5:Ǽ*u%fRf}EtV[ţ6! sas:!|/{/ |*pv6Dɣ>|wd`X1 ٮ-^ 9X@ S(P^vo/lkH &2AKI<;)2c @ vp2]6Ln=0s[U +[~Wn4#.u$*#n\C.b8UC,cYdYӼ!ftHl9Itb +=R&;dGSt̓.OQuoM ORXm•MJxTn;Kn{Ho?&*/RZg>uiM/4dm9H0ɧDp8Ɠ^ݹNLesx+y + tc-KTaszgv1 9KV-0GuN\Fxi-+NлO'R<٦nM!>vz>Z랞'\ .5Gu0U6u8ʟEph[iY7" X!0ſ/)~+*t`65VcLVHAJU6yuȭ4j'T;+sTffY[o' rhWd,XiQG_±2T{i]ˆD㘊P'mMJ~?<ǔMi-YZa +t&!"RtߝEتNgIr)!;o +  1k$Z@ =y–M +/$+ )X\X^zV^ψc endstream endobj 2681 0 obj <> endobj 2682 0 obj <> endobj 2683 0 obj <> endobj 2684 0 obj <> endobj 2675 0 obj <>stream +Hn1E{+I7~^R 8u4L!c, raz\_1 )qR(G{aK +Ooq5H-3vC-hmhG6PCpٽϮ}XCzӔɥiq9cEcPH"(D=eGťNC%˸CF0 ˰bw?!:f.+6Ѩ+Q#{aƙFl M.3L3IqfS5(`f + endstream endobj 2679 0 obj <>stream +0 U@& U~<"1MxPB=L[%;h:,bz/2l@ lX>Yj+++-톾5F7 ۉol~tUӌ~ΉPij c; Vqhԋd9kv[LE p-٩Ea[t_5͜.g/gEF&FzU-@PfX@S4O#J)yjbAG;m3V1C(EU1u+uWs7cQHsgU/֎(]C:F seNe[6/VF&<(傖sYH"t'񒬦e0q +HOz}_%.+G#z?zoh;o cf +&fgڎH86\o>v +ꟚjUBY$u;ċ +?Xwر 'jN% + r!BHCe + Ƣ,6Oў")tw)Jk8#OE'6#BEkZ7.F D-in*aO8a1; ?yZ;Qh?Qs8SF|8Đ\2vTAU` ORE_"''{ cC w:U'x;>2'Kk>u@P UyHɒy-H>*"Qk'e8*{WU_lfS?(Θ! `C@y0icjrLY|w618G~q OyL$@joK[FPM-15w 2:jāz.2qW"() U }DWmz d FPuZiaBql.~ "c$om}ejpzc| 8b~5RGO6$JP3垙GZk6@q&.=;3[w'6$>=Xj4AD{H4)<ؑ[Dyٽ4&xa1l˒ƒpsݫV˵w70rCn0 v{5Чi~v3l &U ihSo UƁH8W_?&RA]~ц)mFRhb5n|ge#G~%m먼(Ý;spJD +V: 4:M74`UhXڔa>՜̯hȾě7Gjqi[eXpIlmG'lQɟ)h$ _@ endstream endobj 2676 0 obj <> endobj 2677 0 obj <> endobj 2678 0 obj <> endobj 2669 0 obj <>stream +HWnG}W̛lnb%|уldW `X(.šɡeet gH\pⰦ.:)f8 +&n>4MM'.wu}V?}7o}x_M^MٿhṺ́ ו|sOa`p7yvnvnSϫO.>yW>]jËiD҇1S 51R\B.u?!zmh5OmkĿ *[RP[)T6zT&PY#$fnr3Bz3IZq!ybN?ou.7R*P,mCVN K~njدW^A$1Hlaݥj~4z"c9VBէ2_ +JgKF#5λP"I5`3*vصG5_>Edo`{}k ; SыbvRB(6rlҔN-i%3c? )òۄ&^Yzc}y_(lyɽO]MN>Dc=ܩ]O 3]-w#{@ǏaO',!ˈof_Haӌ1Ѭ&eeS?*_N$}'xS1~sŰM9gaUlմ耲A6PMSMN9] ҙ-0v/`HWn@»5b#~V `8w4[o^.HN1Eh6A۾yt5S22L9sŋ~dy3(SLG'm%Q95|`b Xm6F%s3TL;.q+4 )Bpji&b6cB)m5InS?]J-p~́O4p2Ϗ|X&ֆުMa )(Mp%|;yo2r٘ePBy% |GS \fd6ooPH! CH Cd填49z8L3*Sb)r U_NotJӴ|q!#@VBi"cD( {'‘CpJǬòdhiݙkb1Q3nQE7 +3v^7^=n4I6|Ox'O6J~0n ucuW $}ISƩT&$|\/u{_׫!6 02R2[^A(YgrlyHR\!r,H9` +j KkU4C{wv\-cauG 5Č\Jr/eӬpr4ws=ޗrY*J1f]kLfW~zU!3x>˺ў{,HUBw?u)NYigR=5軫g}|~2Ǫ 2g6Wzg@G^X[ǷXg}Vz*LYm@.u+?g.\252og/ @b۳g<4^P'Qi^NN/>]|^ѷÇ)P mC`R +0G endstream endobj 2674 0 obj <>stream +0 M@&^,6I}p*hNSk +w}s2w\-G-Z7Q:86Jn.tNDkP+\fʔ;ٿ +$IVUkw[NI<cָ[~FUه >^,f4-p} +^Cϧ!a|jQu㐨b6RIVg|&yL f)% 5b/׹z!~k+0jjUDE$o#ѐzwp!ppiqj1۲3ofʸUT_ycXܧjeNI`} +W|+*QthHjO8Kw?pL3:8ddjͪ=,$6DH^/AgDPE_OY$l>T)Ov.]ZD9ꟈk| +XjiK|!$>/|DVԟ8OZ{AvNjJyTi,Dod\~3#ԟ~ƞ&8Pk&}ː&: qRfO絼a[FI5}OF!C@y|w 4ۘM5gytmpR)} дL=-tLROXJV$'idRa6tKjF% dc}Ȥ KFvw[B>G:[z 3ǥ? gD nFn& +'.9|C#xjWv*5pfϤ;l:JK'Z|#=+m]aA-4{/f{SeZ Y^nS66j=vu +Z*Ձc;t@ ݡ骡5E(DXU,ZOJH@n.P9q`m_ٵAb +i%So+\Gp<תV?lĉRs]< Ώd5T s4/ZWogb|1嬳rwj7UNg޵*M.@sU nAQ'Ɩq 1:`H=J)2#gXE1o~[5R UTfQjoT u? Oe2m%a7x2{RCOa:*'~u׽Yzò:OIF_CΛ6FS3=}Ef^Ez8|25G-i +MXcG7y)LP֛nY7L uaMIQ^PA{ 1Gv8nU͏'t4~gf| d7)LXb֒^Z%C[۷-n~z8MLلlEH`a{s[tL4ѭ=Xoz`߼'k) #v>E{d(a!Sٰ"ԵQLP|w_3#/2//L7 +9e󘅑J\Mo Ba!y}I\M$f7] (yt Pgܚ1?$N^=i\J oc{҆y'% Ÿ>z+Ή^(t[!ZQPp q"\/u}as.w#@EBUʎfGPZ"x21e:(J0(nsX[;{X{ߓ|>hR!`sk% T#l>ƤfܧC +Gd}TV7!;ᳶ쨵Xj"K2_vHft:y t;#FMw\땋{ɠ+9xf"* A%16=]2p$Q䌍K%q zU%$ b6wF3[^`zR5Z Vb:Qi=eؔ'Զ|͑d/_ JVd$x:yU:`DIՌ'v`~W&K+vݼ6PIYY:嘉TK #) n_ĺPSaw[iMDuHu&=0 >J)ѐ7a >ym +5v@jsSSV}qΠ? +!+b65ܞAA7x2#ycRD ,&/L݅M FYO#Ϻg>tbGsY(XF_) żdDsW}BV64^??SqE%geEa#l7g?ѽ7??WiNS+#W鍏MIqR-F +oW)n^4I痭=igՇ2Bv5߉rS%zrIVEڳGm"Zmqu=ю{{C~}>oL]tҏ<18ۙPE;4 ]4e>wιz U֒hbTǝ:XR,1ifWp ++ Q +4)x4.O# BƲ>$VSWv7xGkΜ^A ,y⨦k7y ՙBQ6%GLT1̧^ +7gF0 32dpؤ I( H`TZD Ogn+YtbܩCCI: #Qd,s{ʱrʚfA4I+Nű/E?TZ'gma)Sz(1pӱzD%x:6 ublKx79V$U~[u0qg@"d(vTwxZ^}A2*e&͡v/ /E٬"k:)>^@@Y<qvKV;[wJNLͶ9Ql ?==Bu˯:I>krrjM3jZ$k:' һ=U&6f>GhN +JazW,( Mϟ9-)eB_f%!n1|*'Fz2&3}}HB!Iώ-ToKK7 p2}J8>ew Tei]_ə^ F(a_Km}"T{ ;^Q "-̔KvuQ3P}ڕ~gX[I5qQdn qhRq8Ӿ&&<4HJa牁Z149 Bn'Dl*߈H@g2Kq1I43Gi ^˜(#~G|H_ +Ql"0pfJnY ss +n{3I]R$Ͽo( /X0_ԙ@32qPf*Ɲ|΂Hź:ݓpb5MJ0 [5{w񲓗خsQ{]Q$#{!$qhekyZ4xF?}]"vw2#? .pW0cSbG/62gaҨC% kJQa?*(M}E?1 +Zg[8qS Uw7U=c\>wCˊ`-O 1K_>G)cbLU7x|Tlw$-]5%BD[~D*jQG>ޥonIa9`5^)ry^.~ݮճWPK1ߡ_({K13]?pG,[0G|)] Q6G>0~881o,?T|?)S4~J !^CLu@ATJ0R&ќl^urde?l&11rl6euԳ1ըyyKbġg{v%o$:ohԭW!<nKoj%r~]Ŀ&/\II۾ |ӵGpZnۚ3IF<w>l5Z&g᜘:d`@DWT?W3?Gܫ.scDI8O3ɄӍ5hX`YBgϤbw +^6ZŤQOz⮹_\#["/Zv|.'q~~°I0Pu8.K2q1zH$ضΉ4-4S w@reW˘ݟL"-']I[kƻ+g p,O.Q;N/QYNxDNbKr}Bc+[A +DiB8cL_Y4}DB>,q|6T tLb,[ T3XFWE(Cs.φyDcr +Wae"m?zKNpKH1n\ʱ +igz/||71O>rj{|\2Ly>Op +*(8`D3!96ߗ^Vٹ^mWtY4 ^A^l튃 TpA@ Z'Tn8IN0&B:f\ZyrdMHϸ %K%&wdLs;ى c!L>֨xFVoO +4!pD6f +` %$[q-`/zP병AHLW}a6[lot?D f#h~h!74=/_'fjU|& sjeuw: [u $ 0v/;^ %Ffz A`b`h!a5ؼikI c]U蘀8`UߩaϭLؓ#&WgS$} ~qR賱0koHgjR<SD~G#D|H4Ѐ. rд99wDRNitϬ?1'12NJʯh2)?e1YGM oWGWe3-9'fS(FT~63N`󢳙4#$綵lk$6Z,sUnAn~JPٸrm_q*Q+(!HegB DJ|$"'2' NC<4o~4j9.i] vQmm~;ijAJ7dLb=~, +'.nu:|9`ro3G}vn[lmʋrװk^oCVa$4}cQ4T40, NJ7@6U-tXqU,S! )Wkn+X'E= I]FYIho-hɆ$t?! ҳ;DՑfru\yQ \{Rk-~k yo9Tݑicocp0 +&BBS".Sp[Q%#D7ܟ6@nh1? A"VMZ+be*-_gOF+J* ]\:QxNAУ  ֖4YrMYH$t;:/USһ"R),nB,ݙ@/VGTw}sUK[崓$-I|s^[ +C؊@+1%Z\Hﻣ9y1 Z\S_`,1PmhUVG;=X@ė$_e6WE6xCKK8mϰ)H^|2"P0&恍 iir8CBX/DT m JZ}A Ij$2-iS!JN8žẇdy3b#Z]ܫ. Mpe-ѥM2'-,cɰ>5\s1 U d`-*M>SK_ݺBzKvYۍU;k)HŮD%_R!@\6S@8$Qɷ\U@~ }2W583Kű{ЂV~K\'NTIEYׇz <H>/{\#Fc`\L̓g  P=Am#;.:m'ES,xHq8nș <_l!8 pHCS1BhOI,@kk,|.&Eڈ'.pXS"۪rm 7G^/S[ 6s?׬)vllX c}cLW +#G*3-?AHWZ:=3J䩭Kf}Q#D߅qo'>'o - 핖xt=?7,/)x.m`K~Q0qi+,X_>gB=,UIl5ԗ2czr5[4!ʲ(D*~ ҟsK lrH;!N1>(kf)qSCƁ "_$)c.-1x_AP\h6Sb8lv~1~Z) ߦOܟ>'Mp%Bc1z)2Mswp{PQ%j ~3'su{LN؃rpCU "1 p.!YWdi >](B4|>0C*zoT牰$Z|qz` qT +$@d7Rnڇ<a "M\W ˼RpF* $Lov ΜT"KvU,`\`ov73G:Pay1GM7gI~fOBh'aR iX ]bhsxNe!oi93O{AV^M";{z׃7^5dܜbɇ:lrG9^ J܊\ۀeECtfZ tUjG[M]})_Ee̚no8w +1ZLF]SEv'e:yyciPuZ,"*nDbx>[6ԥ<wאUΕo}tM G_&;#jfmfahQTE?1X–8(瘧r`yL| [K}]0ϊ\K,%I[n-L{{=!l3 +;Cqb\`6zZUbX0 +"qbO3W[f;hbH\!O=H(YLƚZICȐ=7& W@-}"ұީVmNcCPt=@x>&eHolΎ& 27]ӂ>e i?:q^P*|~Ѣ*z5=+0 8@ *t+sBm" !vj~Wjܠ`dhv ՇO ,={40\NuZ(z'~oi*?/2~cQ_d.Wy=Wt?Dk?J1l>j6.o_ U+x3"o %v3ܷ8(P %D:9Yrw<5Vm;DMwzK>~)jȳ8& nl4a:AS2O bG5~ RP4+?\ +й +l_1w@z"Y,"k!&JֳZl`T;KH DEG%߿_'gE2câ@_MםUT٨W6۬: 3l~\~Bo^X mh#*U?O$qIۆT B'/}UK` \XTSI;{}f(Z-F*awW:XՇ\8XV@i.BlO3s sL!Lrl*h-Faƅ1$79HV@|c7hP|zHT;]ུ=lb P9\$f}f='TcV`0n̋>Ҕlmx-'(jسΗ3Y<2wiAj3n0苪 ɀ՗dlw,>'{,аEa5Md1'^J":ňV.@E)XΝNMy#SQD0i:?Uc.\Œ 7>>|ZeU#P҄>?OI8.GTTڄvJ8;Ⱥq*8O9uC!WCؘmB|!6nX+b wn k^ʇ"{E~C`b{eSs|{!Z=jl}O"8pfTKg~O\==y=J޹1%$GIzǍ*Pۇ+@djw3u/h+y^^ql-l|Q3n2j@䎎6L5]|!D63}] юg_2Ly?1!^sl^OՏq5h|s6} sM@˺}4 \>4Rt"2SPE2-qIJU]i9һC + +v<TV^%ʐ}l3HgIOY܋tiq036ɶ8[KVP~>\_92ō9| +lbUZ@#V4B}u s2{%Au,˴l4ơӄ?w8a"hϐ^7 ~ TUJf׼D_Kp {5qXqD|Yncl;"^K{dІ% +s=_+ힻ;_nFtHII٥Qlr>,{ƚ׏_}J$-#g; -.[f\mQm|Cc[eLpD]\ +x ?KbD089byޗlDlc iVk6l̐4b;9%E {6!,*Tz' +DeO" wvɜti A[;XyD*UN_V_7IڬQ%&ov7e筈(/osDs@ngYR4K$Lg*a{OFR9g37Vlf=烜rYbtBh: R#_  pځ<64~_F a *"<L{jLukų3Ű |h\XwJ.;Rb,Fk"ʍA$oqOࡨ>6SN6t/40B^%)#㹝t3O rECkNB?`&EjO*Ftj.|@ؚP6qY#^>_zBMoi.FTwwmz3"~a9 j:;Il7lv^NC# ` [[1{Cn2_+8dF +X=JJܺl[:h8^`9݅/⤦pcna'N{|rFN.;n]cE~,D )dBm&c76~0ጲ+Xل ;Pz՗'@ooM}M +i;:.>+2{g#7SI$JȭIkO'vP|s*x;䲹`| },ˆU Cd5%5mWH2/ endstream endobj 2670 0 obj <> endobj 2671 0 obj <> endobj 2672 0 obj <> endobj 2673 0 obj <> endobj 2664 0 obj <>stream +HWێ}.n^@nă}YGHDloՔfF `٬:$DJU? 9eY͇~y՛kZ*W!ڟp+Mo>Nj:u91E8pzlݵ4&Ic$Dc* ۰N},N}w8`?X w?!#k< +ǣ{pg'BJ%Vx7m~q㿍sUxx^9#ILuVJU0*]3mم&?sƆ(j="Pk#8'٩8BpyBpGx{))R3JQEW\3u%!} yYoxF.XM ~گ0EM,m,M`  /|Jy RbݾnK)y6ܞM0(.Gq/"pa1iF8.n0 +zףTFI"ND2Ĥ9܊IwτQzPKq>+f8~@d9b:] +p`U<ЪeNR*g0yZZ-i?ljxQe +d]K}kR]|p5ڍ"m@8dH j}Oh7 .4Uj Q]6Pjp*ۚ0\,J +-aC4y[>X|9Y䮇/=<T>ƍV-ÙqCv}3FHivIkYA\f1f.bteCSa>]ZtInTxu!]vrQM5npcZ4n>jY 6әB_/30:Y"S$H:$jYiv;KcI52;#8l̚,4MVüȫ^`^3']Uȴı١.luom,>4†I刄j}5&K~XN\x-yX[|_B"1,ΡJ)֥ ZgtWԤwe=F?KK _#fN?γhm; dy Zӑ)lyZQC-*)[Nzl9iYLI9O$lѲACys) 3!BPt|rCpkl BVYvqe^A:5ŭRM] +K uxI6=#w-]eӢ/4ðay]Ш\kVqx6M%m An~/+8 'Q"B"In֑~@[| '}QDe/eծPgqBSMn$>WU0<à}}Y} }& +0c񂒨91ڞ"0ijJ%(Z6_Y$ᕰ҈39{j6v52xm"j}O_ND &zZP,[,ȺP N #p~mW4$"Qy+(n H怒"[{=̼n邠Cn}:`}@-Qj6f/S%.̈`9Y[(#t8a)Q +1KR$e(چxD!$y!%s=tHi)*Qb9{= )Z qN&t0~7X@Uvf֠&rMiK/5>ZD*rϦJ +KLl\U0qeђw0^1ax'O& Y!P4dFǨ7صZT z l+.yF>T^9=}#A8we=OPjΔǘ-ZjptN=ET)o#=bPeepK .;vBJ6+ڽS|~yzYa8*󣝺ȅ5TSsON;ɋg9%/T endstream endobj 2668 0 obj <>stream +0 Q@&T Q~KusTu 41d&CJPS:hI$S&MK?zvRmb;vR'8 +EBo[̫Xv_ +}ނA +f ]KFqc7W7qklk8B8:Lwtk$'(,UΛ&QI\FR\x"8J3͕Z(f֧GL` q>-)%.?I}~B UuL?@}PxV2shTYõ8¡VhD13 xyAm/e$ 2Ǜp~EmdZç xOtb*>đ :MΧS@v?dlj92U8KBW`;FեGI;'GBhŃdx'Gʾ|tή77${; +\~ Bùa!*K]_tUsr8~L/X[RIŁ`HMRw +F 5tbD>嫣C ;ggMuu<yO@ IX蕀$+XQ(bH[.y^S&JQW7Ԩ(?"׮jst)OY.;t (W C}L5OcFa`M90QNDNj^Ӂ4Y1ZjE|K4K Z% 1>w/71kV"-gUKuu>$ݬF΂dP݃; '$T 1gI@U fu7).qeOeJh͵Q3M!ʁ Wi=_kmRWeB0ByVb0_1ScxayYYrE?s|*ّ9_u†vP& &qcIYx{M&; KC&bVGYQ{-ڪ-o7_A (wWUF@ېma慖yVuDWN]zX'qtWx1$Wؓd:N!$vF6DA/‚#JN:AmB/E!FO[HKʩR׼d4ݖ4i,W/Jiq>EJHe~g`Lt[Sv&}H4R`ʙq7=3A wri]3u*L=&=CQ1aQJn;yVYLB"CZm$RzJoPje$A!pl<<(TS vz +ԞvG5}Q Sek(QRv2BW37^#q~B*lU@ |&p=k}chS˹2lva*|kbA6yLxJhk4]']ZH5t}׌uK}7 V RI\aƏuYObGŤ]=7`Uw)ugjM,jWW Tzd2 O㖕q#\MޏpO^S#i%sALo0k /R*&Iu;nvʯ"[N\slǘNU=jQKѩX89AIߟנ|_7jGP_OpE|)|s+w4I3.g{/l 0uGA3\0Pώtdѯ!D_\ei;ҎSKtl' hQc4iTzWXY#%(ITOI!٬61yY|RKrhvJjoEJ3[#=DS p'Q^fS%RnT:㻪 ډGR,1̙ĔRW|)5k yDs@Y2 |lƴILX0,\}y$d.J̴GB +.nx@dnnBK>~NflfKKiV'h"ItM&5$(o' K+@0wkIw0TP]}h ѷ-戢(`;,@lj \H^'oᓎeIcv1+dYttF\OQ?B)Bx`6w7`QUmCk6a?vV%Z7^&W3mr8KiwT,kr%|y}gpjK (yaU>̌i:PiB:] ڜJ1:S~cd UwP]!!1fZEDrZ Bx3S Ny7A[m黍FXch>[.laHx{0rp(YG/s{IVڛr}Wkz, +xғ쭛/T.Q,jVɀr4vpL^QIƳ Y^u@KbE*K,톄xBHˣK֪ޞ.$7x H:p8<6/_ ӻ'v?H J>0".<`~C !/8TF34g{.3ûţW{ zMd.*kĝ{QQXo`W)sS~C5shh3nW]`(;P)1nc- /lj. "t*: p-*.ڒ~tk(PytRW7 V}m匂q^8$Z.gTqӨ8͡t@E{Mq\{NNSwHh p8 [d\CG{y]0f! lY1^(]wx DݍQ;$ +Qyk FBӍ\1nR}Qxr3 ?;^uR\7P@eՔ `TG R `VP^*Gx'j]YX#-eMX eCb/=^a^@,JW}4[ǎ0 MkVQ6Bf1@;" +L8\6 k|@QG%hy.`@$lx([޴P yL +6l;n99iڑ"Cb̳ = Gs鏂<2B]FNle][jw$3|xKYf4>LSkV*L1BЩCͩcrǘj3lji-s<KF#ffvLL"%a\+N.m4akFA<=5#hLn9eQp@]XiC%hBJzTÄ]jtj_oovdVkq%FBm4~<Tho[F^0h +q5qL$,.T3JyV-(`YHb Z:{agH_hbeY|ppKX PFlGul淣n(5 i h-[׋\ KAJqo |~ hznm]Z )txzV Hr|J9/i7xgEBZ.XcFϳys\8>Cm~+!GFrk{:.mLcv5PĔW&cO7lmYHD;au<| BvO Qͤqҷ +yFD:o>]["EZAT%~ 7cB%vw;9H_ B4#NZo9ߟ:?5Ti0 +)kdh8d9@Qћu?J<]|BmC?ajmR fK NrsUX>* 'ї +Un0d0˞7FV$ + +P_d[=G4qmO֖I|郞ըHcZkYA}ZFzv=d,~Sjgԁ0tx!;FjI_]fyի-};8-ZĢ]k EgE.B{`ʅK%[:"*kxK\ :MR(T~;1ZL9h VL$u\<RcVCeK͗\ӳͯh +f̈@Oɳ -v oez: ؅k&Q6Kt|b{-h3C540vIY f{ryxBP +4fJɆbIƷt&xǼ-ĺƥYx>2p6cE +& = 9jTn@TVkSFGԕ'RyN8‚cGs +u\]K0r=,!狑!nq̐F5L>(e Z- } +JG؉by9rT +->W7܎VUZDRF~ /V!Ps2! u0 WX?CMԠP^&]G2q`Ǎ#~X=?R0eo'#>Fe#M8Q@EC]|Q^A-ӗѤ>>-z^(Mr+P#l|cډw4ʫ[K Mwf#/ަ 5 +,Z-傈e.0x:>f-ֳfZ?p)wLtKØsھvi\/Zړ}5u F>ZXp#[mVsJCc%~ɿN;hy5.X|g I'Z,}޲xQ.K lg!Af]gu[n׾*:.aOW~z#0~_!;[5ƳAPJ;aۯRmAG5[:"/S/gNlx^.(A[[񕌜q8 =h8mp赯/ENk}gG[I;ܿ^^>(eNrZM'fR+.![f4f  zrڒ뽨0kiTr݂o'3|aA$~jJR& #!_Ѝ#lU"qdϱ/W0@zYҹ|&SVki*\^RܝTTF)X{wZи;>Bލ]~ @IF=*C%p9- j%c薠/fZ- #I?Z/G|3n+maIA>J{ŕ%y"7 yu!vAu_@\og7n(+BL.{p+k1XB7r`/`ɓK,f0؉j1dqB % eZ%*OorrəbHr%>LQJOhqw8hc )#O{D7R{uR=ŧWEE}ő<<۬Uc#qoH7" c!/in4 +Q>(hAUwKMtp0)BcA6;YJ(tI¥xKjI7Lb=+g8x^LDuMgrߴ*2-YH?@Upg,L)L/ȈJf'Ȁ!A -I}$!$ +>E"b#v+tFBxj f1\DCmpp?!_!XG6gi =7B 9p+}KjZcS,qy+gJqp[nTUHA_Pb Oߞ>kHxU0]4$#tf"ƶJ$蓉7 r/%m7`^(Ķe\"iʃ-V3nmC ΊW RE7c꿰8ܓf9s|Ss哭Ȳq t(IwL'9!Zfn[;]| ui~/N$GL`j-%64%WOjx4'J2Aۑ?rHKTU u7DԇVA,.XDt$v0bfQF3b35lȂ6jCjٺS +?2c^d-4 ĔPK/^Tq'g<nЬgl# +Fc ^:! ѦoX%:ؤ`c0C.]!Xwz\7ݥi%O}Hx>p71Ko+nL1ȷI].t/&Id)ښG[ߞb?d +1Q xl‚_R`/%I +.bx2i[hC|=Y W?SDj,3n3iпTĹvJJ#Ax`n) &D޻=J.9]|ٸ=,z_݁0^30;%iNI},Z-R^JZkM"߯ $\|Dзo@SA۷_`FщVOSgLP I)thǰOpz v7=҆07쨵 +hȹ .@?v+)VEas%eLEP&ݺC~i)1]o49#LcREb?#?y:YԐ{a#pGtxs%3fdhMWjwuۭnQAC[;I[x^OE[cds +dJf +yM{db.yyC@/0`Kϣ`IKdQ>ZNvv}a)Q{ vy S[9mSf?pM_G T7z8 !X1˫c"H%Bl[%1{ ?1.㰥wCK=J&9.5Q?hU,,.HƑn`)iyK>93ɘ6#XQ0勜J )4j>,lկ)ijDEwF[@Bތp F%X Q+: :UxpTe:bXXN}<܅)Ш3E!+Xd_?ssV5ӌ=ʑj{/;e6R012>Od:Vf=z)Dp$9@{F3x@9RX.u tkࣇ3uWK 1dHq;o!ʄiYY1F[VՏ0L6>yY/>jx-sOkܳ3`޸@ni*Ɇ2L&7=R9\S1_>z"&rd#0ѳf;n}=Uh~Fe[a+ )if+0 +7_…]8N)<pAp,#yYc S!N*xX$sB;$T%]8X?0 +"urQ1*|AX`O:Eך M\PB4a1R<#FHw_Ig1l~Zo#MҩɡA{,VEɵehtaDW/wo]h?jKIGpVk~~<4uEyZ92lzpSV L3+%]0p[LA)xBezypSk扸UCXPr5D^L8oR'V|EaF%mփjʊ;'}mn~M?J} =$i~stmpA$X@Cͦtn(-gP̶Se윣h@ +5.s\(GXcbx6Wm[)1ylתlKcj^ȃ$ +'&2&z98Ce¢f &7~Wcot+SBeiPgN3Z֔.8/zݶUZ =QD?ם [ڟ2 +7b@zpyt皛{'UťDT=&0ߨG4QRd77 w0Գ{9Ƈ~U" گ4#bL\)7q>辎@x"4r`yQH &ܩeN&*żOiJ6(ImΪ/Z|51$d]X}]^<: SKόrۡ-q#+X<);ua1,ʰfh`Vy5}XɎOs]W+4@i(s[% "vM>q^%Ksiܖ,5L%+I}0Aa&@\]SEdƂ\&c(,x@">qq?E +]dfpP=d3ש@,eD֑xnnJV*J~ݾvU!I4W[]nez٦cGY} /?3Zbuک<=Y9>J5m,yo^US/ ISr +cS*FGq~]5 +D鄊7vRP8-~T;#,f@P6٩ZTb"Άt=֚1yՌXQ4ȁoڜ/z7ŧv e+4O9+m>Yhlߙ}۝/(ԦJvPFQY0f*&s?~XʵY;fn!7D+0cԲ:\qeُ{A;23޻I^6ײZr [jSwy o x-|ݍy݌8()`ӁOv .qD(S&n.Gs[0|tóOF]i[IaukOʪ6I4 Nzyxvg`(ēm%T~ysР73yzHT8zK]0„Bwç|e&U)8j9s@y0Mꫀ};nB^ @Da23ߌXNV}Ī M[ÞWHOqih@W~vd"X* TV{$Vu㽏H}Q΋WyI…ό舷lIEN +8dk#Y}P.wnՉc烬) U0N"AR~,ʲ*xiUjK$mb +C\,;R6#wjq~_yȚ~9JݚQO",0.%8Xz!ASx0\6u 5  ; ZLtbYK=ccG!{ |8-(Hq("()h^tZ,7UbVp +^??(0<Ԟd WTl; +zN7 &M!洦&lh~4fi9Lͳ< +>cT)ߕImDRYI?2ON|ӱ ++/pha7aήHvhng U4MUրՙE.K8m5Ve-io}Um{ƬGnVBJMDSIP597+ms}.*jC.9󑢈lfObb %szC5EeKQ’I>>`oICbNylVGXC/(gI'tIWOQgcTݙ!Kv=|%w""F:眔8R?w"()s2F\ +ߟ68L w.,ʲu"pLl1. ӭD=eYU>*H "ɜ˿]m +>ω~5>3Ҥj=6E\|f*_pgvu.*ۆ'R b?4#2YNLB93曋Ğ]MQl{Ɖq<3c(ZRw4 _w}yްk+CYFcD]t4FbZ?M231 +qc)-o!dVG"7 0{4d};dX-;h3a:S]qSh`wJ1uTÏuʄz1.1?_J鍮C!rOu@ڬ~8. fx#3v" C4{=β߯wV%=T8nb|UɬLښ:9$y_,?kp4I'ܭHa2V#,"tW33?ciinu'7WԣQ+buPTMgo8KH |*k +/39:2#=N"iBeD)y!incgz)zr2PW?Čɟ1>]s _snuDCpOUrL=K[|оB jdj [tƠ..6 Cbyܨ{lݖ{a\ +ru"܅kV4A餧 z`CaB;lŢ-BXM~C\m9l'+r"(8dfnм5F!rH߃&-'<ٵ16KJiקJfpU#Z~V Ӈ{rA,A;K58bw.3n!IMiq@xl_p_Ҵպ%ߝկLdC2?%> Gn7H V~su.hEPEƩFA-5 xg'd3{TiL84mKz]m + ܊Exn4%P)Z0{yqrl 5>)D ]ьȝn:.p-7h;X"+ݪ9=K;wShewL)RX&@(vbV%xI#:K=M!noįiߔC\WDȁ BJ#Y2Vdu䕿#r* Ksl6̃ +_Z;04+H;\+S 1;7:¢mSН]zAsnϺ.>$(~Ӥxn$l̞S>K2%ڒ7> Lm'^?/YZՋ?zh`U` +m5A,$gak J%(dmYM7qǹѱoՒU(P< 1auIEU]CCbyq)O_ V%[޹JQTD.cQoD^l?Wj1Z9[k"Aj?oN<_B-p;sc,.THA%r𴣠)IƎgn$;ƢR=\8LBW+fjWnq$vw>aP'&ɲ!{f64ZbJu6_zh[b=tlOinQ s4vt]h$. 0?J@Yg[=2A.¬N_q"E2$!\5BTt:Y*!~:4iѐȹCEdyM[dt0L۝+*`ͽE +SzU5-M !~#{q(Bߴ #ӰWATTf$笒>4C'*jJ#h m ]9VմY*m!G=פL7Ðm +1Drm_ٶLOg,]z፴p׉4 +-kmmq)V1e05?PA_#^! n#.TWmLoPu_6i({=G*,Tt}84mmq{:*:ݾ$[ @Ў5̎2B\m~keh+ Xw/Pa)(i}8ц溙y dn!}`,|NЩ7N.k$Kd#!b9ܧʦoR j-"JTdȲ>=b9x΃˻f}n7Imz4DG+1\Ji݀MY;w=mo2y־ ͲrN>H'ɱ2'SVDdo;pJ7wE (/mXJ%t Y;¬.m'YJW +K#:r=Ofb-cW_H+L ]h +q|P|lhҒ Ĩ5Hיza_R |(޵8ű<ި +hIL82)NOW@w )G۰0*rOÑ̦D-QX)-y7;}BSPg)N_t0a:`j!ܲz.KEΎu$2w*ay~"u +!cB2QH>BJI:e#2/LJ} +u\^bgԛCdV*ere;pPMV$X +P)( 7ap;*,/o="-zOB9n%Qۢz!7 +6?Qa)39CCb]F1aA\=Ũom =vWqYNs=ǙwSemS=huN/]Pe $z&lClhAr x|8BxBP. PC+em.Aː<<ۧ9mMl)"oD6m"16 ӗJYM}ھ1" L\U"TX䵨a/~hD|-DxNP’k*=dtkpCIg߹e6hM(.ams5DF8Ŏ 2ÁK+K) ҆\[ +4uNQkjVt=ºcZRԍ˚QNҌ:J31W!u'&LϠ:w壉E .J^o-HwI.6Y֢Up2Ve^8J9(l*Z_I팃,QR TDW@tcoxQI +jj?s%ʬkRωq{!drd~~;E}ވqG]>bb~ .|C{%74q + | +~qA +{ְi.W3Pc^]WYH뢲/0G74m丕6P 1*pw1l~r +` #*Ef)>LWg.i,:1EFdOX,T*hwq|.OLN}^Fmp| JǞ<[/*\/ǿoo"pI rH,%[_㘵o?edfvvy. +dDk" +w^ L:}v +h~{JSك=j=מWgzq>@u2}M ]ָQ|=v"Jjl=:HMR/e f-4Bew6 +^u_60re g`2F\Q"ҜnVk;Kff?Ut"X7pVU]>2з`gm'ݽ XidvX:ϾE@8aO'>9%jׅ[VR$u[Ӟ1y(~@lnYWEhx-2է 9BR{엷@ِD4l,<#45<{XdldΙ&&᠌Gl{չuNE)gij1g|!)oNJWy5?ďhFM,gE$(o?U?aS^n`L]d6"539:O5gs@f^nøo-7@^M:p%C- Z䰔dž fDI#R/΢/( 2<]v=YsmU #gC[s +:76P@ IɎť;7[8itnUn@zڧe+TWH[U@X= uZ a`zvK8•\g< ;C;PtM>9 ffz]ak鴒ʟ?.#K&T70͊x*0vc:7@ C6"؅Y|q< +!s#/.Bv)۲ +7ȾE+o^[|*vh?;J|0dL ZP׮NV^"]b뵝m2$gHvawڰ{^ +*:6˙kvyy"3Ӏnc&, 0ZZ6x@pGa6J 3Y7ۊ6EGJ'Y;< Ppι5_sdzVjBh_T@kǵ/T%630ہ .H GhԠ(5u<4e垿哮U| MC„C,@{tŪk_X;nԐ-}{б2S095~r#XMxvn&K',yلĉ[t#hiQfO}:??\PaՕCġbϢ֚o1kȁ'rKnr`Q 脝t.I\j&i].7kMz|u̱Bc}W/e0w% nCpDYhą8_9Mja{mc UmJL.{*39߁Vd>wCgD+$6pXV5q1n<,~ma( wp@Ӈ}ƒB0k a_ KQa1"YKloF6Fik'x\% +?FUQq"' Re #!E)?HrDU ÷:]) ޓΝRV7^ŵ 1@J/'sJkats%/+/@hZS1/0.4()/DF4c?\6"y ]g08=6;ń\_:K-a2@Blԛx\f9ŢGP`5',G,&R{zӜڨCpO{"h?yf)^mA|@S \U}e4S,؆)̃xSW!#aC^5ޤBm%V38~(eƺ̪^8hjMgzVnAg? +,>P#1ʮ?{E&-Ț]O~-SVg 逖 [dtָ׃-!s ,Trs_Ue2u(fLڿX?̾AA⪅/]a_aC޻3~#KgCNХyNRG1:{L:C1&8kG 0:qDAx;Bn,a虚Wd?A ǡ-}rp}]72,G<۱$|Y9nT~?pT> +FX].ڭBpe +$~Fs5~}=cw/[4*@ǴZSc+H?}&.BP2}X:`K7q|r>S:}`n=,A+v2Ȗ -ìe3w={qS}\ų঑?@%d?mSp3*IqIdCUz?9,씿Z8hG#)8QmU9Va:MYaJm~L)肀5v@D~q}={`;Z9O}EMGо8u"ĒDGtyrl9rM^…*GtI)'\l0ޭPa=NPe`J%)$1j! Ix0P.Ca_ K 7Qc/=`j=nd4]1l{1qaHX7IsGKxQ_|T.߼ +ʗkrwےx} +nox3o*':{*+I~M'[>ftu|ß4 #2MDTK(G[`M|:elKg 򄩥Ջ' i-?п[&j%v/:VoHr W'*S3 8fLF꫷:jLmo #c#/Q nw/nS%X8IuYTwb^hnIt| {аuO`HArʮzFbHy`R`}Ga|3~XN[mEZrDR +|p;|_!}_WxecR~KEQnM@EFp9؅-@pyd O)s ZxI*]8|1tj{MN+6k_H7԰܄4Q`Eˆ0wπ9(fl[׫/`;OoQBZ( +M.[5wʂ/J22[5{n ж{g)Ș|w/ +|z?%ks]2;`yے*~=\*[V2k +T3CwcW۵Uۈo2"7T f77:- "E@՗M~8IPg*3'+y,gXt]cNoB)SFaNa%Z&ˬ%~"2H=oV.9KY_i,OM@v іirԀǷdS֎$ \V7"|xL!hMb><7)|/3_HBzBS3uYFm ^No*JBi<]ֳRi1$ҁ"eT.҇9٘\qx7!m2ny`=ar|1 I3lflOycV!*u+5"-Vbz˭3r0)Vry9 CؾTvTlPr~ްُv^RJR{Y MVb}cKz8_X$L +< 0kf~Ur;ur˪|T3 2YB!r(A͕ (0=3ʭ+0[j\lJ=8F ,vm|Ku>g5nm3Q??g endstream endobj 2665 0 obj <> endobj 2666 0 obj <> endobj 2667 0 obj <> endobj 2658 0 obj <>stream +HWn}W [}Ȏ qE +)Mzw֔>շd-1էNB8C O3F*^m.^wxxd X^PBj!’t"ϥ%.Rśa\ ǽY|O8˜ gMmU,_,- *> +~ + ~e矖 o;~?,gn~eH|ﺻWo@Jan{nёƌ;~*gbc27~_ %iNJoUn[<ghn?izm2unxǕ)u8Wg"% hH_Wx(5^6To }~i<@?'=7NBm97>%V+j5rF&B:5:m~'5fWmnњzB[JU5cyS0w[JJP*2NeVPT(B,\WŎPƜ`<ި"2aqr=n\0\NR8<6bxlO&M\J'a^V{Nj0/3:ז7|3>9t, uZ:Qel>ɠ+TH \ LTxZ=yH:'[@DTSJl_"h1%n*Ƥx; AkD5,dMen x~jN ZnN+u'4牯 ez#rYoGEC,|y{T;fvB? JP^-)ez)1„`dڪPM4&Jd?q@<êteXC3L3pF28?џsyNA;v[[-X4NNzleqևϐZZhnNbՈ^.̸4c:o|]T18gڕzуk˓S+y.qݬ,Nza!=[@:ŝ֩N +2PF7qle#O%hil@;űNuJRbHAE[~{kG(KiJW@5G `c7OS$Twt UaJ|}*G<爑O-Ai>WO$hkRÑT%m?BbIBܡ>*(d*j,IwIdJ j!$.Y_~? +c~$Rv^%e&&0Mr)L{b)jБ <@m2ICP( IDkeNlPHɰחXg #ð/l̮ۛ=S.=8pQű?|,NP(SPduARuNӜH@5~48NƗ 2$$ıxm5cNWX&Xk>ߕf"d76h_h.fN˓<j88ny7d5 Z6HzEə\8rP3PuٝM<߇K>h AߑiWI[ajnj2j!rdlI XRj='q90dӢP MH1-9Cs5P-ɨײL>t#8WJf<9o;]9QS + ڂ]; cA<=dEC,\/_M}GC@[T@7.k0EdDH[aB;5F-ǯ>4I vй`}%xS +(x w};diO!'΄ +KƮ==[?q{ZDA6iDbKxÆa>@6}>+F`;,&c$Hs|5c.}LNov8H ڵWK""%Lp +*7-rB% 71dE>dcux r}C^7w:+Q%D-HbwA]Wh*`>"sѯ;l1䊃)UT AؼH'9)Fi&B5WM0 Gm聣z?J d@۱u7k_3p0A$nUr0oӇ`'2!GA͓(V|ȂP>stream +0 D@&M D~}}B#"T.x԰P'"E҂;S W9*逪[?g%jLd>NG,߶њ`c`$P+Ɖ)Hl1 _Eq^u3Z!ZϓѹKʣ#4@9S]$\agMy DUV0c.䲛| }.CƱB)YYU:z'`sP&[1Eu-IĖK :in zދ&χIu@Fpg>*!9Xw{6v/ьg󮋻Y0qNw2L33bUA̘׫ݞj⭬_lcHm+ yUn'S˩z -cRz{'${@*V_[0MA*D]{rG * e2Þ4}-&P_ j\*ΐ e.zM,,Z=eu4dȟ=GBΞs&vk e2aYqvjw:_n 9#N Fű9A !i er~|I!HkٟM&[QRٲ٭PC~rS "9ZZ;ZZʌ +Jy0nF 񀳫: 4hDg~[Moܤ4 QJ~fFy4L$Œ: + DbG5rӚx gLC3QkDO[-zy@|=U"\gc-})m1eԃ{ uPX$wRFh›YX#B)áoF=oO:c$Mj7Щ!`3[qSw4AHW{Q@sc9'YVHZ$\\:%sp-(}ySvqRЈ\c6cby(9iN70E\Ta&-->J\;ss8rҧ1k&Ɯ(:ʕ; BzUaF[= [`+å̰ȒؿnhϖocDtWuiP`5uP]`$/|ƒYXe,KVxTpޱ[L5BM A߭ +ַe*OHzeT-Tds}nP_qMT:ה3iy{ѽy4)[ 򲘞kX%(%#c0AuTj-+yogVh—p5lUwtAmocY.NieG@~\JJT [8NؿayWYzY0ǀ| 3N~n8Oyk'MA83++WWojAo^X{ H7}@Lߝ7PJ|U*3UED{mffI;Qq\dpDBL1AR VX{z4 fW©'4r q|# fUíGAc^j~߳&OK—O DRAl^ަ*;\]K(>^Pb&m<:-#725K;# +̈H \#6OFrGőJC<7#4xC@4s驨S;m_XޖONr0 nW@e>r7F!G"Մewѭ&s+;Y6aºI֥酠XQ|+ 1DExtM5{`)H\'7#P^㷐gцW9mFْ|: ēld>۰)5Q.4dddxR¹20{\(w]EvˠCv%p-rn(U; 7 E1s9+qn[!`sg]983ق 6k? s[L ?iB"lZ]:Te\v?&S7ge-B +!c~T FD-m^pa>nF˞~Ǡ:'%4eB 8f +q>}$`? +QAK8c $yxD\## Eq%'N|@ϏfTAdkn\],.j%BjuxjPbC\xRI))OqTCJAK ↂqDfJo|`#x!㛝JݛOy1V/e7 6a~:N8p>4o_sV#)9Hu&?;9g'pM+zy$g1M+1+Ke=ӟG_-JAi׵@w-elS;rBOɏtw C +;˵3ydp0.qݒ8CAtꆸ"$~_Lt "rV(lazqϩ4V dnh-_TEQ'MEڸa=2“Wn12{=UB| QIi.hI8;}Pyhhۑt1|kVWy{k¥eVp` IUG\ghaCu9rxpǦ31LH'0~?kn_/ZKT{e3dMNC~FAdGnm\yemN C'UygKltA4DU&`^-f;LU4ci˞eS$ң.GxAMhK˚Ɇ +@S+jED*5uCa/Sԯ,vF|^=-n҅V`VA"yl7;/Ld +qQ>߮Xe;|D!Sñ9͔)E=qx. 휔 t?gI8Vte!:w:Vz:+tB#/61@^=u7-RxEʑKxQ7Xoo{9Xg&1lj!U~fD9Q2TBƻ{:TXbɨ+xk HJ* q E!} !nbg-L)yB1v|.o~.K4R +S*xTzQSj( " { }mU@ȀT}:L^H'qڮzvEy/0R۹]-| 63uQ/B.0E<(fƌ)Ɍ Ǘ4NY ^ᆊUH~^%M%S`bvȚā3Xp>m7 8Ȇye uVvETA<f5 hG;Θ1XsfY(ұ{U20.Ir xSɭ ;y/ +,ٟaNQk%u+,{! ۋ}Č( BЏIA:^QcBM>pLpRĖ%mCzD\/LsZLu{%xRD`d|ڷh C N(C=kym`7H"x(D@tҽ.7{\ Lkn>e&@s;y<1L3i0)x7`>(U0Á& ㅣ'NDboY(NrlmWƮLnqUJE [Si/_OjZ+7Cb*VsZ%z& ڲ UKeyzEhZ+,g(qvn_KQ Fd 셭df0 6%sZFMaww-`.|b/,a ׌ksb*,TA!3: ʪ9;j-7c-e, 3O-ĽV{HT۽'cK$B/$06+ՇR6HKX7X|P?;΍"kSn賧PTDSlTjY;QX[btxtee*rq'_^(ekDZ6\o`1_;:-vZ +ƛQ]0UO_`4Ԑm K?Vss@TiCkdsM!=:]B#NFZG̷,E__O𘊼]IaPHh9}fM?Ux0I˔-^ m=ƄkLYyho&Qn)NܵTLD@Su02<'=A-^g'isN`5isVA!'Jo qSv\zgWEa9[٪x ,Hsp@<隬/ʲÀ 1GusHKbTqo%Z4j e)RbtPo&H Gp3()? +?8&X>}bS\gӟ$_R(ˑI8A;Nj9U&x1ʓr`!I}IU0\ p_~31k' d2cxu,(L#8@̥b5~9o*Jc$ 5\ԋ_Խ^fIT%B%KMdwq;UȞt㼩+Mg2A_݉CPZWִ4RL{SEN8j'q㡼%2!:e2UD`r@,#5SOVbAMe ^`|33}PdaQ, '#EkB[]j6Ђ~d?Hv~:Z[<p?Ҟ`tGNcɨg_fX,w } }|]K6NN\0`YFyWs_-?y$E:= mro\/.~YK[x]Y9tsXf"@ +#OYn61O$3. +%rg\y1Iݯ)LT5'gQg +VZj>1eK{l,y瑀-fw#Y +63By Z/fƿO&rKJ +eJ1NSZ L(K"#B< Kz} S].PSIJ[/X0 +v-(#)A,)b3VuH-ytmx8FLz´QO99e6@Vf1X5h  ܗ*\[s4svRr ,r+tLB O% +EDfXQ.4L1yg?)\īnRZ!X!El0w/*G + .%؜f6QD!;J̥a^ᣒ~ E2ssi;Gikݴ-/'Qz$>c[|UVKśq ZY_Z ź &Zܕx1M nCSLM睛S 9Sj.K`HO#Hy{[ 4 VzU#78)_- IRYG԰<WPxr0Bӟ㱣@ӫt Y( 鎥GZMy 6cj1rR480Tt" LQVwLr(8څYO`ɭ+/@ =S{;V_OT6ߚ2l#ac ٖxP}t5߇Y~PȃNjGLy\5 79ckقrO Msw 'ذ;B4 -D-p0_XFx>H1nSON`iNXD/ޞ1h G-͒&[4k/f'pJJ%ޏn<Ž1#cf:/&gBA(ػ]|ԫ:K\|H,"哽x4,t=i]N X(f N\͏(SWmBg2ƑX.y"ȂszuaD;\O7s_?.Zkn<'$=R:f.35#3*(XI:Q|?v4Yk=6Rt~  VaYj.S`:%LN?lZt_;1\|=JZzRcܚ0| +e`cY+uX-!(xRL +m 2%dq"B,mRvy4?Sl*"Í{Ȅ$D$Dϰ>'ellQo'ᒩ;BFG\BT0˻C3zx̴,xsqu{PKO*7ir]ŨezUujBy~|4+o)_7~,K7]`#$9m( +k[ /n VyU5Ec:)[ێKU [4DCv)Խ^gE3g{>MDv>Sa@Sdu_>y, &l`L}%Y.3xCRC*OƖCwLdn+Y lN$( +`y,=;B@XA2z(ӱ0s+7B`bnNP}˻D2ωc+Sg&THLue-ӎ:S+bey{" + Y %'|^f]klNrSǮc3k#aeXAL%=kNqݡhˆAă!.ۖGN"25!Ag&r+@1SǰsNs<ۦQÉ5q0UBM<_ ZKq!!3up(7xX[yu&Se \gtrfqA7ťs]1߿{hV%kY%U%Lt[Bkfngeha })Hep1Lxki*Qd ƕW OE@ "x1bܗFdpez3r^H+vl !;:gk5QD "kiM+cue"/?,8QZ;cXS +K˽9RORlf;TO۽@dLpz#IBeĉ]۸t:{>5Md:<|)hzx\Qk=4 7ftc~UCfO"gvBV<4;a}.I,4]'UmTO/vUowAߝgbxq^<Éͼ.1?vPW%ӥ {Qt +~Lβ(|Ksa(, F=(n7 "^5wrkK5|"xs:9Dy{-;]őp_PjOެ?]Di?5>h,DcU]?_lv~1plŐ>%v(Ltٖ m!QV`\6Uv,Ԝ=`QX[FƔTִ*],Kqns~*ITܾ1<_"qaoi-AKdF{!SIN^"y_/ 3|}q)Ͽ"Qx_:mx0̇V'Iep h"J Xk"EGDɓq2p&K MCLG}'P>Bh0z7SQ}e2.Ÿ`wXd96Q0MǛj2eWǺp1?aM>1Df'-*,VLWN(c/jmo>F@eZgIq؋F++D@9`kB4F5fY+l#OV27>0z^H$DeᆔqFRxF hh GBK*18XMeq!z'.`zq$% v_)MhZW +"p۷$FeH{4mIp\{J9bX+|Lݢcڎt8c^lct-T\o +\]k0u ^G~^4wVUp]_uuO+NJ6jj[cI\ ̛?`w C+&3al_ ?torF%H|YQWzG{`Iij\pfӫXm8HDQnI廰`g޵|ys:^*}FQt 9`V ۷#dz(5s_ yǞpx2sБj-ZTz#BUjox` + |ųA2%\,nr9u`\y6} v&PW>8٫@JgiA>`5hx:,_r s,.*Q:Iw[B#\ᮩ^q>WnZ km#=xeL?f6Wti*?Y6k-vgnf'>}# M5\b]-s!AM17: : +8'ߪb"Å.<.fϺYy,|Ieg=Х?QdD]Xal$mG=V n Mgدľ^:[[7aIwӴl%6ȖU C$ ;1qq޲$N&lJߔU M{} J9'_"{_o|g ϠPäuV.}AJ>L D:ݷv>M~ 9ƏC$AE9yV)W' JK~Pt\yG%Hk.П2E]VxlVi0tM@k|*_AtD&;\(F17҈ڃ#{yqH d)7.3 :KeorJF +Āx?15 ^rFFljg/mDdhZ #S=^S|y$2ms(⦷ +OF +{K˦O%G! +ه?j’n2&v[T{-~ʦjF fغ|qz0zX2$TL,Jwd;B>{b|cp2K mB/D_Eb]ҍ*@JΦ{wob"xI7Z|vd9Z.4:#m9ˉnꍃzC#`װ +;hatI>ޤxc~%:ChEcYz)n }Urn;mw +p.X3GxjjC/t9wCYmbȧX DՐ_NW fs @eG[kW}*.5>߳壬Y\0jU6ə:>(^C;f()grn8pQyf\oVF\C\#p|oj8ެ픺.*}[FO;$^|~PC:-MZ8ǔ=%NTcRNpA:)Y^{[;6%LD@&Tm +&&{vMaw@ZrG1SNoOtcL=tS<+0  Elut%qalkrQWxHohq?H{FCd:{W@J厁јdo?Z$I_h>DŦ9@o:?p}7 +{1k1A|'2N Q/{x^ ME񟄫ѫ=f+q;.}vs$"PBFŬgA i϶<` H,q䮉KEƘ'> +P/ g=⡌ȯvKdB: i>?Iׇ!SKO//m}s")6+)xjg2caa]rj UާHܓ@v;t&]xK0=j:Aꨅ{[CL _w,v3 T"bTXErD?~(c($>(8o&tTO2xg0Bkֶ*isѮ"C0\_C\T + ?#?W?{;W"fB_V&օN49!b>Yƶltnt[s~yb}=dE6>}ӥ [󎠈tg$;eÃ")hqIFuHbu܏t'h R|{B=c]~ҽVX2rA9ka Qdrt٠{;(齜ĺEF+Ee5 Q_h;)4inJEm +5C5x_|{⊨f!4x],m!@0)P( G_*z1R1jp=,?NU'/M.H_xuo#3T%7V1k%2¬*gAO*4 +C3P;;XIr*pa):PPRW[90/%!zDa&; X\;zѠFW>rM>&n +>3M\=Ɉ# +#?Gzѝ}u 7D${[ X=Z\c5;UXN8 uIHr]{bۻKNcϧ{!\?.qދn$Z ]PkCPոCGpJhH]kvjGGDÈ-!8GnBVI/: +"=^J|aAiճB= @>rIJ~j[k2OIX@j o2\q.^4ԯmdR"H}/}yrx:9mFjaV];LTlKrc +N3%p3CъޥUeOSٻggT.g{5k Hk`.wIu$1p+oy—ߦakrh@[+CCRz &CҺ &QMi@C8LǏvz[r3xm"i.&uyAm66 <`bImXtݦDCQ/.$"BK4.AM +FA9̜yJ d͠;Wa.1T$*3.+/ʘb-hħqu!9FVަ|ω|79FPS|s-q)yRJ̬MLm00_ӧ-y(j =4\9S4AӪ@Ju m6ΖXmG"zi*WY8c޾:vgTzSN=+k PgwFqBM (9hJvb>痜~4o T{ClrL +YKCBz}$ An-3bAL0J>D`jCv4CHS3'nĴ ߉zHQrLt,.9LX۳9㐲U +Tq(N*14l<ڶnl_/Lե61!̒J+X>QR3X3^o\`!RJእQݤT@1t)71AjD6$8)+rhQF>?K:T9yC{c:.֙1PVx%9.OM#ɛS!\0 zsڅNWȝ&Lƿj單U!_shisB@6 &=wL׶CpXk0$hUY(9ޥ +cJuKå}m'Xs$h9V}a zjvGA>h?dA0JapcI&aı |1©0;hxQ|z0e2^14%&^V + qrGe %KGCoƸ߱u. ;U<!}0셼TֹTB1HVlD" ,tDʩ8aF[/v_ gbsiN87xkn7:tg_/DFgٓtZ SSzf0??({[@]1xտ9K. e,qVޔ74' bEn"dܯC/8l!0ߊRN:zЫ?Uq|`@O5x̔kHʹ*p}6 +[MSxۍq>)^"}zTV?"R݆jWf~ӎ:>OlY50#*yXpfAI@UȊzピ7_3ųݫ"^L$WR '-(r Sy"Y7(^B9u",Xk"@x`I +l:¢8qAK Զw>ϏI +f4EK;.Z]I+#N NO_RN&+=44=d +v 焎'mld^Vut٘4 d{V|BOyj<)5Z',?vz} *M5#mA9֗&hYQH%Sx:M+A,aL>X',j .1.sj5S,^rAsWڑh'>{DL/ qNȀ$Mt] +,fcb GCKzWLE-A9ψJN7qj7h굵p {7|>!]l4"DW= $Z j(h +w./_8g=BIC1: Ep'f;1Z^B7|> qr݅4җ1fR\sL]҄;&^&̝i5aV8- +dN/P6 1 ֤ͽyOmzݽ[)oͽ]İ+K9B_EsTҮ7q_ndIcr+ endstream endobj 2659 0 obj <> endobj 2660 0 obj <> endobj 2661 0 obj <> endobj 2662 0 obj <> endobj 2653 0 obj <>stream +HWKsWm!5.`9`{cm ,[3ڞWWLKHx*+e'qƜ T%n¯Y'oV'?oԼzn{G^~ +hV' -*ݬ֍hVcch +(Zɓxnyɻ_;AˠZVF7vV]t +S+kl]kEeu(hԭͺr-8uן6|tH|f7(Ղo]kb"ZFWz݇ľ|xIV;b*ZXjs|ԕĻNaKoyz}"ml{ӈzvƿKZuӂ9 ZS^E9 + Hpu?]O1] R +Ŝ`4R~ŻȆFjbZ2Ӑ y@j EE='}ѱI*MThTHiMNx3SEH-ľ6JrG:rJȎδr+Elg/vðuKCqԵŻ@L_oPԪP9pg?{x~!:*acE]4/93va`ksa]\XjFJ$B&@x;QuGd!!Do00jt=t >tӍ`el< ?n{>< JѿVNZc‰5'C we<̫-Y@bMOY!ngyv"Jbmj\mW@"{P +DS԰+"x`w@rxiC"V SeGBa9~hf8g3"fi5URhl: 8٣ؒ}3mPxa2!:A!σy2S XY;ʒgS91 odFީdIfKkԋ?Ձ,Iӂ7VmD`,sbZ05$=~-,ƅM_wݖR5{)G꽜 XG_^> L CkCVg{,29yvJeQ<IO~fsVsgFv1$a~#vcR]mRԯ Ņi5}n3irn^ /G=,}W.Y'1nOe"DQo})K`3'gf:J[8U.LT)A1S{س1eĂ<5K‚2M9BB>!pjt{pa#>ٓԂf7Io'8. /_`!-W<\u}|GspT4cpyPϭc5C- +9;g}Ϥaza>-bIOOaO>}WsSi3`n>#Cu]5sP1U4dTSroj~ٕ;"Ni8gqLqnLȪW\GIǤ =V! @z{ؔ_̱b +İnN+ق +<̡4vd\Q:h19Y^}LH`DZ/cDU[B*Wnp:Xk ʌtPVQ=bGq%;B-fܽ!Ym~Cj?*`fHE9Mq~KgR*O2b1v2сwWzB$5\lYc>s0'~$? Y w[R @:duYC;9׷>DjWEFL./%ա;J+^,.2H" ӳ0; 9)) ffCb4E`I7^&&U^GZ$<1n=2\ח<>a i{=.EnT,l3CSIp"xjƉGR2mYF!p4y-I}ǽL"Sݚr*}AK"& :耘7xb,J6ؗR/1Bk!I AFИY1ZRsaJ ZGb8F42p۳Ò6G:!RՑqx:Cb7 /!3dˍ]Ny:#j?~"pP o`"p*2;Ԫ}Hhs~rjK5hȳ4=q ]7?T= 6ׁن0롻]ҭܜB+w#۲c@׺呮MטY}pҙT]"ԶXfnxxWbɅtTV}xR1Xn1KG1QDF҇澞e {Htn t xrΟ endstream endobj 2657 0 obj <>stream +0 Z@&B Z~@S.[s+OWV/B`mÚt0'軬[ M\ElE#;uA;#P^P09,;iV!o&IԠ5<>KE±i-Y"6iiQʘ iϻ{"9rhJU[FX]͡'E&R&z.'C/-a@-^eЛo &: _~AS+o^9jHQuԅ Y3p;~``x33: L>Bf Qnf g +Iȏ\R"иC[wVc֥pHw1O\5=Y1tF@ +x5拥6Tl<>6sz.tՌJɔ.7mFtYNfזEn1#lxtрRC'й>Iۛ%>b;JZpG`G0j:LULZttE!Fk  -dwX1ĉ[yF1l.ZAgC4g4X6JbVY>ւHϱ} Ny@KK0I),b _Gz!7 BK@/RG֪όR'6ṃnǟjk`RU[QU+1Q̒ßC`{[ۜ>w1\B-4TQX?EzS'20zof5!~܂q"^?(?bGs3$EKr( UXp!-N"PX*S !I`k_)] ?|t^ut9>NI+N~n"={mja~ODDyOipJE,,T@,ϺAH+mwJhR5 ΗZ~.p΄k O?N dbMV Prg;6pl' R yUXxʕ||pUnvPú&n)?/!iP^"۳%K'hphaTD+i~dvkI:0&7FlJ^4VģAKw<ȏ\M*Iu~{muPpHnGSNhR::^I{XE=sձPn)ׂ|ۺ!F#3ha />WyH1Q[mm gBף+ V@u<SA&Y_M5ZS6v Dw iۻ!|=%h*5OO[|mu:;lrdQ7hbz( nM0Pgl̫F8o6NG[b*j$eN2%ܧaS Y3p˃ՅEAI3U"`_CqAkkǼz+*TJ,0($: o!fwfy5)=;FE!͠n˶fMi@D:[>,ݚ䒧 0wBoS-\*I.\bgS8`h}ZDrk`_/(jcwo}XIҋS)]N +ZTpW }bˆ ̷\13 D|FkFZ+.b?tHTλi5_o-JEҚRwg-+}v:"L\n-SJaRaO88U"Eypykf i^/*Gp]/fQY`"Y񄧡Q؈ @@1E(! +cDSZ= +Zzt0캒qވ-c:j?qKθp, Q;'l@%Jm: tXOO3b[E[sG9Laܗ cZfsKb`42ucX,'2}Ԩ/,Emb4[T +*we7*܋ J! +UΥ0|kOX§zq +"=)Wkl&8"dB :9k6g]a.0MdMM#BUSbsf_O%FAfrBil| x]iI-W`iA2ˏP&zlAUO[ وWIGZbbADlև D:7q4K"2})2Ou{ F~NnB'l tqjziz"= Y3,"H&l<~.T5Y{,%1 Mu+ 'Yig4l8_{YpQ5|Ayd%՛bPPŒ)0y˯(T>8Fk0*) +zMOq]Gɂ;:dؘ~'ݮY8VKgDבMlI%hfRHwچ`6 d?Dd3cݖVk@^#Ka!"4f8B{Hy2 sH2%>oX Yy)3ۄtud7c߆"'L#öO<{ zc85٢1@:q$-Qy%c|Xw| u +:iOhrW +pU}ao|R([GNRt6o| 2Z F FϑVis+| kd& q"chS޺p} o%:j)mD j!U-鉺WЎtrm8v{:=cbNZA)!DO|W[j?9FG%Y}QFxn=/k=/vKjXҀ[#h9+ad-Շ9Zl*ړh}ip+ƌ w.g!jm:;?z&9 @F/P5AVA.:l9>K'AL~/FŸeJ]CPGoS߸JۣQ& 1(!.ĺvߊC-廵s+&O^wdGq;JӑyU`t5T{$6io-Z3`7)G%(%^!CBEqmp: fb Ńg +i3-0wC9Cjc![{n'!L!Ĝ#%ǩxk1!/V3%S>ЈÐLCf냊O)vpB-]z o-M?,bX $(VT'4u)-g P(NSÕô;dk O?UC4jGPB xM 4o[âNZM53{TٲsK\٩6o nSH1hN rLù _wSc*iFV|XQdXdzh*)S4nVԈF~lcل}-(@N׋,tC?kG,u㑂P 8jtVw-6#<CNOЅ :LkI^9O~7:#M(Q^ P\12gsA_}|egSt9}906JL ٻ]5kE>HN0RJ04+޿yb8Tpq-fzwbd|݂`Y| T܆fA2؏jI[kJ<HCM|&IQmY-s`[ Y-t(QKڟQY +Mr؉a ষu8\P4(7ӿwJŶ}paE;w:|ə,E +5֒x#X/v_$|.1/ v{i0} -$4I`=J1l 0y0];ߔTV7+GE?Ltnǟ6+AgqS7qtPV|ϢrE)ku"zCԃ#yBKΙ.z6KP20mJڸ0=o47@UY;f嘉cR+0MKH:0V.ЄtR-Rz{7 N8f7#ȍ~ߍZ4 "k8!bGcf= M<`G+#ՔCi{_[墏6PLOMs5݂%WSܩGݝZQv-hvDe~1sV81=҅g$,=}%cG;#HET,F2 ?dPۇ/0L5Am]0ERNxv!0О9,9/2SO*51 * +@ba,սgX.|0klŷv<7D30k.tM@5:B*~G[B)P|%#թnmKʑh_ +,1TC qwOiQ7S`Y:w%F$ #9Mg؉rQ'`C;9z2w Sfɾ!0=D0r$ 9g+oܽ  .eFBNfhz fR{. qο |A\뿼-ëV9;F1)WPiiP ܭR:k%b=]ˤNa$r"arj;D˓=o:DOvxa1|Ʈ I+f}.f؜CA[ət%u7 $uy_?V(/n> +K=җ$wXӏ&G@sExZOEM\sq;kbz G@I4d_P%"pn- c3@.ϧD'VHq\ɸ`_&#;] (}^V,(D &ोpUcq)#wHc:+I1U Fp`RlV9ޢ`}cj-̢N}z]ЍV{8>45 z?CZOss砽Cpn1~KҲ$O&myYѩNQSzQO(!1ث.IWzS߸Bl7?&?_@vd!Oװ;J\VD=g(sY\ɛ;بm؆mg:j~9[~ْqȀ6M;=2ID!zsn(EaJeǒ;uAOovF3]ME9R rfk uB +>C[IKt4'=`(S?JjҘ])~{s;<}dg 7rkuܶ0ZRczA=ϩ'y$B~ oPsE{ĕ1܊ZIM]x:&9aZ lܣ s76^xFs6kI*2Jy63idQ;Y+Y%0MӗR{:Ä"ʓJ*^3O<G XuMOЂav$_SX,T;\-%=Ly9LR^~q55ˍޯ[F%_!( +Lkp&G=UZۼ`&!H ^|19pP |yQV U.D!iB-uM#T*ȭh ,cl(Jf{=G}Y^6u61uPf:ӽ!%f6Эz%2VNeI?b-F @# )$/˙|Xky 9n mJ +*6"D'x|E\-**iA(11p +!/@u ?D|ã` M,;3KI"P[7|*a܊':P3ɉ1P{fgE +Nbf 6,B#B:uݬ?IȜS5r?Xɞ@XOHK^8Ep=lO__J}8G9H>E#"Ke;c=? +e tPBmzbfUd:gn`3E呁Lo5{NT41@8=CX1UQrJ\k3P9EdTs43Medr]PmnI>ww?Gq$"O' qXwji|!~Frff by]-] ?=1J8'x$@t$abYM8>ʃ]R\F5r&F%oЯ׸OTtnh]|P 9[N[ jx㲨X1Ňd=#؈І[ .c46^+%ʕN=`V9C+Qot}p~#R޽WD•  )/PP[(Dk+=f9mmY2(̅$/wM0+}gfV*WpNb_PnF*$Q$CڠsB +LdX'%j#bs^GηE#zQ:We(TZm-McfQ wp'D$zOB>#<~,)!RC 3:&ѤWd|5tER1m7NV3hAG|\ 6 g5;8"͆VEm\$>D8G}V6Nյ)L r{$o5KcWum`wF#`5ЏWScS}G>eA˟9KP"NhBudd1&G\ ɼ(|&#;+awAk}|cӦ>~\B̂EtMTZ&H^ [)Z"6bPZW8 .ĪA Q;b=9r<@ 戊K,_HF"V&tK4YN]j'ivm'RIv"feMXj*d5V6Cg2te:̑*eL; q:RU_zE\ҶCGG('+0jؗ7wژQa'O67V+}e _ 8&j<ƪTuX~yrp\oB0 2S|쌌;-X(Z}'gsP:/ֿ8,sը9J",9s<i +&_⏕0bFIk+:>ug<1lńUS]Tuo9_|o,? 裻%N+1Ӵ6xx&*dyGɖj;s(}Abv6 D}Qū4;4orҬii' +ZQhnKfˎ>{F*(xwl^'aw&o i7WsxDa.)7_+IS?G>g&=vl<-q:^"攸_ 9&$H1YaËu|Yxc!K(0.W~ Xvr̴AAD:_1iLinT7QDY:/]pOE;]5;rMZS,M@x5x ~(K ;C3p\1Kz_4E3}E^LZ$j +sldpA%[ʖ3|7"8~w^ t4@}FDYM71ߺ.&nEَw,֍@'_Yl}/_0ÏcQvy-~B'-[Ep.o~z rhh&,Ryؖ\tZ6N :I`1{X`GЧ5eoȨf6Ԑ_l21(9y9 OyUgR[Dd\ (\ &avȜ7hW$ +>i<`@BrIqb)Yx6]\K:=ڂ~x;2KB-{K4.϶r!,>l'g%'*jM"rZմl+ ʬ| D,+iY15ѭdž^ʻTLjꨳ &鏑( +th$Is}7+(ڠkrif[WƪF==ij`qmt$~ +od7>0—u6)nT$Bl508ii?}%{' + ^(اJ(KT8"hgf?V~aDhbάp{yW ̟p;ũ3f^EzzNA ǔvq[K?8[+`֏rЯF`8vJm -b`FDJ^|`d)cɎ'c僤t":hi=]ΰkpZ =1DqcA8naEkxQ=wp!s.&T\> +4ڋC}H M:Mc"? :;Z:ܚ#!.H{NF#imb+`j4qc?!k-XV?k?vw ! B?Su?g&I^ #at" ?ቾ$2n?MwM*1tR)?صd>rPp*ʍm8s eKC[:{}sZt7#Uf_9TA%kHV8ħ +I̶>;Pp㦩bv8Df-z\@Sֶq06]hVF> +vM~; 5?G_@nϕH`]#NJwVR;)$&H]/ˌN2bo_C%@;`Rulr8j[.̑1<2i!D +=_GzXImaRc] Rqh%,0Y55Eq[]^R ]Prw%K~_ِ]㈥Ţ4]kk0 Cl%rY:J}]^N!l R&l{ļ|kDQ$r'6;K)죵?@bE[Y |{ԧ't# "ʖ4'eו{7cȗ*J9tT$[h`b>L÷5Ʊf}䆒@hj&*n6v!KEcVϗ9ǂCf1(~lӨk!y0zcCLܥGب xw3p aūmT4}7|47ۀUCVEd4ѫ-lqqs>ʮ;6' jQ!6n>45' +cD;g*V[n+|k߾A(,360v%um-g-eYў&K.FwG0KiEl7=BAmAFiD eK4űogk[|Vλ ws'd /dB@k 䦄Ͳb/$]T'5@%in7iIf#O2زdҘt`ܖOM̴O(]^Nexc:.(n[Ev{7~⽽$ui`hYח )hiE^z 8;z֪I>HJ~;r1Ku>O5g1<8Q#j7F +΃oեGe[Wk99wy3{=ٿOshY 0ğ8Ta>(esx;ǀު~k!?>I,Ɨ֥iy r*ygf;s9V5Ω糨yQLsd붌cuG1b1AUkCtȾaW 1HyT!"V1Ӄ6 筨O)`x!,]n:ӄ#J3W \]w:i|Jܪ~R, + GjIoJ!1͘70꬈-m|[[-aj nB..Y\/, %L,؞g}e0v{;Ġk 96ɘV(I^v9ZV#^@ \*sr쨐yjċ=h^#p3Ww,O`N8n'.n3:XjecMT(aEvo4t'L2{[QNj~3SK.Iz~7 +߀]9 +[~ݘvHԛ +R}Y^j8P&N.Lv78@a_` jS0OJ+Vo0oe;3k<&^U,PXm %Hy޸K+h Kz314X۷ثc tAH"Mx_Q--vS۶Oe4!6 /-56&d1-,_/h?wKdQkD43FxٶU2mbv_p>fc+hτWye !&+"8LިBbtLZj,#nmd?%;c$V"2 eZ#{ws? Q!Fl*a5N*ZQ۩_+}yPщ?^/_ Λ6wDTdMӂ +~fu=۝諐nN]hRvN`̂WL-z]8KFtLXJgdU 0|(j.TZīWq'b+ +Vy\BuQ2w8"{J%"Ƿ($A->얣o`,1"`̀2A\iJUA}=$'wWbPhG\Iufr Miˁ??o֒5Pj+t0q!pa`)RE +9~cϼ/J7LƒoZGPQ^?.>G4)lZ38-T4:u8]Hwԛ؄`6xC%FcuNIZuV\_ |үÑDiH<-UOBDT@=cϺH(\v P"kw/$X Ką%dpīF: OLJ&8 Ne>=C8U=;X[Nxp1tIr b0ބE" 'DP f.L&|UVN_PC%L؟l3> y,ه㊈!+CzP>ZN<$1, +c,P#%&E 2t ]1bAU3]lrM%ދ05O|ZtH~cv#@ѩlTtQ!Nc5lWOQ(s0UQAHGuMC0i4N>)c3 ;JNv^[}W+tI=4[k1$jȓ4$Cbv6(9(}+ZZEW~׺w endstream endobj 2654 0 obj <> endobj 2655 0 obj <> endobj 2656 0 obj <> endobj 2645 0 obj <>stream +HWnI+Zܗvݘx0ɒɒɢeDUY%DpHNU q(IM{zeO\}\\]҆5+J(Yql,'o.5QJm귛x^cn,2%YE`plF˾ݷ[ $7k=}b -K\5E5a +R_6rr VBd_ؖs:V^n`\9[ipEMsɤ+D"_Xx?!kn 調fAvfLj903}7U +YJ$ +*⠿b-WMKǘ%pos҅ߑE9?5>= EPzG;G=t4,)XaZ'wD8'/-W"k"eaoΧv7Sw+߿קGpio+pSzir_ xLA:UChh.{R*G.8C.X: Su!;ΐ@U쐡8pj*I+ؠq0"2e|:A]&ho*=FP_d7퀬[ó~3`"sTӧyx!g1i4i^?v~޵GL" _=4<,y֞&N?DpK Z6`p08'sn$ЪS' L@p3J6f9o f'7<B-^MHEaEЄ ߍ|2%&gĂpBIآfF)2gk[:Vf90څC;Py-s0-d=C1^0:蓉Ч&0n =ck$sbi/ .HHr!N3!$,@St^$ߪM d6xi$-25ȁP]tz<˟(Lo仇ӫ8TȽ&؁p 164!g:;<&O+V!p$e{m +hS+BeZA~/ ^c75lO}AHUsgeT_<<iaGary5- WHiB(Xl/K "%ĿRV+mwǒ|oW}s5Оp8s` ]Yh0Y\ 6+8p!cm@h\Zlnc{j?f,(׈\2ߐ@șV)q%Kh+cQ]* %ey\9ݙ IS >퍅4Fw3ZL ۇvA!`9xz5wPo۾od(sb5W* +p[Do;K (+EQRN4ZqdwM2LKK1AJֲ?[%>H d y=dS4CB838g{x |0_Pvy⻒qb +%`L3u%ɗ6ya|s7d9Mi3ޮ-!ƮhZcpn3D J,q\y︆}6^oڰmD[WfXH +`i=*b*<.^M\V+16/V\D8=z]OpS-V,4#;8j7Iidg2._ 5/8ۮX͈"%fsXdK,#u-ײ\L TQAMW':%EOLjpj r7NUiX! h?]]CL;&R/ObN~$Ƀ?i&d2LJQ}*`B ε-o=Ū] ļK"y⯏C^f%*훾BʰX N~v݁ \xOE fa,nCN$-3i[e\H7e_i endstream endobj 2652 0 obj <>stream +0 M@&M M~9szQr*$qAcBJU@H^o6?Y%F_O=_)i|-ij8zCIF) ϗEfh!BggGRWw ]܇e!!Dϗ澑ԩmx$O+&+4Q$5J]>{^q'@*Pg*:kWdLm&jy?Kܑl_ɝ2!(P@ΐesd?|YH)ޣCː,p|ѼυR:y):$Ȣ^s2:fR\15s'||30D5t[YgW[xYdnlL_B![TX,:dH)> +`\ ޒcR3W`/U\*y7L2ۨB=GuV07P[~%[UQآ@%ujgv=jG~SA\YYVrK}h˕=oB83?Ƨmtmtj*I$u 1(7x[BKgiV9|GAF> Ne|~\%~ɺ+t)SRc0GEKN Wy YT8j򹎰OcΩ? | U4Dۇx跔}En>@ҫMkl z b럓SW'.I4ZS[ܙbDyFU&1qm\>1xEMDbL'OlK޹i0-r;w툏ӝCJh"r-\$^=4ZiA8(^n^eE۪G񐒼;(;Ql\nXm"Jd8S]s{3-(30rtG89:/Sڣo +Z::|`rqߊxcQT{KX0΃6VS{c(QdX+L7IUHnaa3bdptD$e> RL,gE^.r[}S|b'Cԍ%1%OK$P?%3R$Sҍb01:'U4deN<@4zSF2ė ۫,I_G +B~:AJSڋЇ WNpl1Lo!7֊&t:FƊG(6A8+D^WDL$566_0 +?NKM1ݶ\RWͽȿ=>?v".gSVT 'B +͵VhɌyz LTp@@{_^9+)nPl Em&C DS(=IX!PL +k٨ +A +-41 zޭ#V$@mtޫ{4>a$6RPLk 戭h9wݥ6Kdf.l_ۗV1y/骤HSa >6NšBKh[&au|̪ΰ#eϚgB.;s^ ܫP$Wvڕ^ ^ 7~JNٖ_YuKԴ <ڏBAK;0%ERVD4LN@jN~la 䭡fqChJFgvjӯ-Z ?_b' +WE&_ijRV쨝b +!OD*FwBb6Z:1Vٝkշmo駔0J"\-kKqgbؖZ)O#@J&Q>3 N U2ziLRߴ + 3_e+*@{SwzC!U;0sRehGkuym<[xbj7V[j"09 [x,L([nz_Um 8?` +-Dʑ^HVCMh*|]eT-S`Ѹ4xV l#Omt¤[)_㏌o_Nyi0˜b)P7U**ކ)ѝn#0jFWM3Gx&z.ƶ9mhMti 7dp:8p7 +{#'{-F'={! m,O;sm}07|Zx%gV^ÂIF`FMYVL&3n\x/-q%I)N0|3K>%rNM]k820z>KE Pه`t?7ֈ?Y(m +:=8>Ǭia;<,Mz0s{ZzUрְ_h!#RUn }eU_YAnn_v^ђ{yW?6Ԋ'GjFTMnc<U2*i];(ٓiun\`UeS|#"zWh_:5>d^dnϓ=FN( `@Aqr&L3c[UaP}ŀ{SQtV] 믪3ᔗUrԻ)էvKЖ`ڰ"ZNl+^',ކGE?;T'z׈![*OD ;68V!Le(5ʳ&-< Lw.5vcp3'w_XԀ (W0cG4lSױfȉ]?W#+/q2Kj[]IqxOGCtݵHz8BsR.Gل0%^f6O+H3qN_3 Yk0Eu"/J1e64 Ja_DsH^·N;e\t%o {f2Ԧ>&T ۆֻ5SIg`Ӻc63Ǻ)_dר:(Kn~twiwoy= e4*EEK kt&:d^ɦpGN6Տ;RH1 ^B +^-s \8._elف Szi_j:Z2 +cif+X ;|\۟՘m9m!Ӹ-$=a7OPs'I +W?>b#'Avh(ʠ`Дrid38T|6U +L,(5@AcB-k/ +*DaNQ/< +ס&?CI'~1wҾno- 1&AgjC"ڹԲ@7#)E7òa&鬤."RKP 'lN)zd5R!;"`df7{R3nHXZJ7:-Ξ7'SQ4Qq_Cy4JAF]F4|ZI|#p3UWOCV#WKE: X`u.ŘЫrHd:`o07y!Rx=ucU@젞ܿhw]<@SG%0wN?͖^]2)zm"vs`~T9LܟD;"^Mƀ%$Gl֠ɛ6T&ڞIώ!2/T-) 7?<  w{WYy 5,wfvjT`A9"3) + & ;1/m9Zq|u-"a1򼥎q,HR$Iuh1kWpJARfR c\D"pCvd%>I›)O iき5fy`"Nl |gWۙ; h ixۢ.;^8[!bU;ĴSBJw/UsKBטꄗҥ>37y4E7Pxqqvyot/K,g? NN. |T!MR'U#Xx/_ +ő pǼ}xs1b].9bK{}}awdEDރ +:xMx%=֥i1S{u,VlkzOtM &L\,C@.c5[=Byǎa6*DaV?|- BT<]x^Pe*X2ťeoK}g賶c駵c{!0?_nsĶsP]#!!ʻJ},aᠸٔ8dNcٱT/r0;4X4)Ag}0H&1-2H%Dݍh~o (y503333F-u1jMO` NE=&C,ҌdHQ+Tn ,]`UDs@.c_ C40ϙ⌗n(&{iR%姅 +o3:4[%%| [Mm"@H)$^*r.'?& οc3Z_$ƫ{3Qn&G hkkomX0[4rTA=AnnHca{$0|`^cATJ&j$wɥ6iD~ w\Aj=4(n.$6 B rUf5Wu5%X?wX&˭?P2X؏ /ĹJtGR~@b?L.f }1ls>0KgհPE5n=`O\+ +I e7]%Srԍʳ@D!b*+Nށayk^/tm/#B*<+S9^C+B4A4gӵX Ȓ6NDi~L{tGZW=oBjHW}wgƛabSJAۆEe:Pk=F +-%M9ۜHI ^.eMG9rKG^pD FO|0ԔR ?3z;ʷ=#JW ;sR鏰+[]YuFQ {%KɆ~3Fy+q''uÓ,] k哙Ĭ|X,SPO;jY{{t48!Ե?w:Eؾ҃yvKp=6'g~4<%5K8iE<0gwK44Q 8#rcw唀ͅr&&W!ղbzsUT(H´Zh:z(u9^6HgBbn5E=Wrũ䖛~DN`'Sƈa1 S3@^<[l+hs߼ew8:GȪ۬[$~#sG_diBto{%!_[ +@Nfԩ ߹Go nŎ*q݄RqWF}"=Zp,9;Oo) +hy{T+t wktwm|kQemDXfr0vơәLIdzEuQTAœjfѼ8h*4Vj{+4yc{1Ksb3bdH:#tFM"32z?Tniyo[ MIclk)B ׮{nhe)[HuDh +'f"r@U +5on,p52^Of[i `L=47}fq1z|!n=HWAV1 6>jKcft2 +6M<ˌ'S]M덗 +΍.pru$aD]ΌD/65mΐյ?m-$S~( +SEoٌéB]ؤf BGUo~,Z"ݥ{TKl ? lQ֟mp/kfn&wj"Ic}e?D?~_ZX9b`}Kӹ|(M]<ɟEV7dBK$!(^!iv8F-b](ݲjM:<MG my2B1C94Kp/L^Ygў m JGƶ6'v֩9.t^Yt2>peh{ ^=:]̔3A:Tgn. QB}Ø+9} ;^V-l|>WH(Hk?Zu"k~&&I|.6Bѩ0Ėʙ' {6Y=ୄK! 8ݓ>n-zGQ\VtQlOP;?61iu6O;whVPiǸ9b5ʙAb{Y]/i b9(Wº럊|N(%yzc19 ȯ/0z +#qԢqCgg_U{|vMQ` +LXWVkdz/ iGTUP(vYu]>(ArL@$]|@!hIjx$v _dd mZPNdxNfHeT!|JZνgm |f` ,[pbZIe\%R˒Ip?kRN#uaڽ9eKuq5h;sᦠ JMfn)/Ps#s(:b`Ip`">`xו'>˻hj?>_C{!TfLJ8>wRWiIPb+t…\ی:9ٶNiײżgT6@w\0g 1"{6]9ȵ"IHUpKҭ"iխEx| CVt%zBKߪ]`6RU7!7m Ef!CN9 (>îTE\[zJ%-Fd"[މ~D[kGMu#I=[5O+l +P֗72<(̎k+ 4F@ۊ3rq_67Dj`Vx++äuBzOD*6v@#`*(&aʀcvp7eW>nJ<ɓ󏰔k%a<ޑؗT޶So2I mOqU툨pۧPu %0zE7%6 +)I[% +eSʬnaȔnnKRt_(;4S|YlW'J14 lX̬zɃls-Ou6vZ&m(0d1h$qnػ ٣+RtSN>LreAUUz̮Um9dS-6erf8AcdjMKD+$Wb,>rn ۟7OKk$䟦0$+pmàJ8r=&}(]*i!{F"EW%D,hʪhjOYχ &ݗm,H=t;gmnԲnep/$pCngo eҿWDy;Nct-~e xYU 3*4Q?`cʹmv8HYԶt莹NʛgNzuB L&:` N%:Gia^!t:,Mjfu- `+>*]%Ԫ]ȵ# ߛ3<㙴Y_^xr xPhl)~YÊ?YzMO9О7BK5<5a¿CZ --VB_$he(62ՎSq +Z͡o›,cgwnNj( gͣ~ڎLSRwK3dIE+asb]> ^M8`.=w#ʫPC #`݀A 4#Kӄz_#ׂM9w5ER5uq`+[ +I'pI8N}8 c + +y4@^iY@ibȓ7Y%Q obm9 ,]Z6PExEFI14^ iΏs! Zjf )Q?k G[W0X6 8f5jHފ]7´PtCs\>\P^qN'QаgK ,{BE9[Pd^B/xPqiTsAeDfP`OEfnq^$%(kFMj=F5ٕwC`)~K)qFУghoQ 9|󨼡YZ<:܀@OΛ"Z)u"cq f !o6G4ViޱNגL\z>M }?4TH_ʠwoyUXδ7î>$B8C[P GG +t88ς*bP.gJjWLCzB W:`Uvj7;S[%J:4OxLscEn͵.+L}ak' {%~ f$;7 |.  &IxddB8`m!QT +0g4@0DJeM#3߄DR tJe2ўLxC-!i 1.f: +l~T3p _aQ4PbO +(Vaz[yuEXe%Q3z7l!dXYG)}(SJIi'A3yWER%%⫁nngs0)LWحD+ށڸ&n"iup='ef&YoG)?s{wQX_CC{|e'&Z;pC:lXW[f/ckC)2 ;}/KKPRGt@e /'D-\r(EwDpizеAb鍀3NN'ղDXMJ{@*CR\=_<=X&'i1h <+{?jxQ }dY~qW7,ޞ޼-D=Qĉ! 6<##ր)] ,ʒ̴㧴"!J.hgd&g-m:o>CZv/7XAҶ) uɚ,k + #9s8XY6FFGb;ݒ~=8ny0oX=&΢9=񘉕CcV)3U*T?Ed !U{$k-ZA&d%-&=9Œ#.48y@1 {MN`2;b]T U9VqQ \w8]6@ߍʓeO\ wيO׬ b#H)Ф}Wwؿk&u"ly# +W8|cByW(#ae~ҟ6Te_~p[+X|QcOlVǠ鄍,Np蝎0饂حe3걸v'E}dj*γj<}T`Y~r,fu"*_iTFMb]*B=aa8KGBjΖOH2_ܷHp\VnNuɴ _a|X ݈0G! [u'mCBj,!5桯7ĦJy3iH5kg +;-Rc6H%OsfUE!,RXo'rSEIw։~|BŇϕ.WX=mxۏPBcI027?ؗ芳Ca^>/Yz%shXٱt5h6R;sbv[|:BJJ>m*Yݥ`DpmVkNfޒ+^bt<}oxmvENh}L{cnk,<3krD5 c89`L]gރk3:>2!um߄0r'^owCpޱljj>S1Dd}ĭj#BC0=Iy:Mࠎh _ pk+k-/)b3JqAȚkY|Ϝb`䄓!Br*GHa~}5v1,=YxCYDGOS3q{v!4%xM2'͓*KƯ˴R ;]iNdT놕]4ya7=qI:#8/3P + +֍5iduXܗhX(]qaؐ E?yO;>Y`Wה=Ϡl>K~yG@.'bÅ\n҉'-Xu7n c5nTQ_&XUbb SCz[}Ծ2 fyl t- ܽf$I?eR5;D$R4x݁\l+ucgQs Pm tyl@4l]:,+R{Fj4%4/"?m]F`A[> -F fbt.oh3M=]ܘ6Վ66(=JC~M_ʺH녭6=*ݲ0]@{EgDO.CZxM\j]a -7T\O"JFDy։t #-ys#|[ʼhi)i.ʇD3SIn*V-q+.!md!RL2w)~?ݰXKepy 'Ͱ ]tU lg&`EF@y`S{{`QS&oZ?ʓh{ETLHי YFQv o_&߾ +!ُG_u0_ mosbݤժD.W# =y|wA:sP  U\~lހuA='3d}YbXzG;7 FpDᱟ jY[JNDiM5<$s^+be37'Y\[]h,£k\[%-a]i:Fut#3G ;>ɨP7 O(H#jHYj^_>2ѿ/aHTlӭjd +gI @YD- sVc5zG$%{8Mv~F +KEcx H PWoq#afuB#Z^I-mYs2}ؙG`8%U=rSƽMy5+A+ +e[vu*pG5gkd(@gz[1JoU]!z-`4TR4;1%gE +69Zp'ɖ 3F!+ !EY2&LW'%j +C,SÏ(>]go)`-oma,Afaӓ%E^&%#iM?3VtS0cmjLԠC"SG[!dQd]>%ݤ vǼU֦`;th?|A'Wz/]ǍqL*њ=A(D#k2# (*5OhxTbHuԇ|ѹ&lUgS^9!B:iQ=c5=QFWHΘ^U\`|GBP=U@0א[]OjDȠClZJ?pZ],(zlO䟖)SLuyDu'St&҂%Ncu. ӕY|? +ڊo^;&K}˸|L!LyIc p.l`R&c-q+<= +C^@#lE_X:+!1Vς 6b!gĝܽgr1cٚUY?F&iU:18fv69&]/S=` n4Z5啢C= D{;vT=cH6H25)C+^LZ8Ij{Qxa&6pkc[EmM'ݦf_鹵͗ʜm.J)a5Gy™١Jij[/?&@q_eEZ O!l{~D[7VJ`j_=q;߆t"!Rqf1*SmR]q*|؏;2 5R_Z2ٯJs*Wa(h/$eI](\@SʭE<JOH#=:)?., ]8s8eITT-uesJ*!{2ɛKC ߊ-:ZzaR\f<Q67\b"\ Wuxf; xg+B8d$K־*8`[g4r! :*mP@}hi%CDFqEKIM,$8%}Th$X9R4R*L4&gK;ݍmV#<#ׂ>LF&zNa}= +raM軚nɤ /AEmz;RrŰ ߿5{~c&:`Rli$ө1-;PaڑS5ԫPM{ s Pe72h$>j֍Q?ㆷf{>m:@0]CXzΒxkJ;U;4\P ٗ:]}TG ,ҮHTC5[jч: FU(9l@ۃGqw_p]^7lyL\q rmq9S8!m !5{LDxY{1)|)~g쳼f% *Aٗ3p_` _9 DZKϡsp~:}~0XQru,٭%HS)wx%ޣ@wHL-䬴Aa\yq\GWڂ!2V̉M&kz ; Qβ;<hN=s\,y[@ꗇG}q[ϐy(vW>Xq- -7+Q0$"/Gw +BayQ}gSCSBf}_?~>CoLǗ{֭hxfAQhmxxBj~!Sd;u9әsc'y =}jc 48--L6̡ +*܍Yw(!l^En9WALy62! /*ȱ4MLQ`hv {ee`Ǜ!#]xX<tl!@yW(+)Py A|###Yhk=jZ 2Q@?I!xDZ>X<uvgnb,h)kx_Gxd@U0_R:+CҌEmWމ͆HHU'I~j5|H Vy(4v+$P<]e+^dž\TRLaϲQӋnz*S : 01KtF:Ufx7z~WR"^sN?!3ڏC9zը'FxdU-8%Z<8sda$yT6@D2 +/E5љb\h|}(|k 4%YVX)7KC>6+.ư/) 6Y6,jj΋'O!:s@ʷЊ`9E]gJ/i,C'VdݹMO=v0ɞVs E'd*oN-(4!\O%0m7H*0zPv8Nk Q ~ftPS:e{^,=@*XLDS9ug kB3vr)2||qm.y V17QJOc8ݬ~zmŔD#V%mpنkn:Sm Ooi%oU6P cF` %`Q2s]V\W 8, +G9T̻5'K:Q1hR%Yh߿6]v_r˿sԈ#S:‚Oo{M!oao/ Hނ'1#$$ydYGON뉓> endobj 2647 0 obj <> endobj 2648 0 obj <> endobj 2649 0 obj <> endobj 2650 0 obj <> endobj 2651 0 obj <> endobj 2639 0 obj <>stream +HWY~_7QGld9pblj&gr%TS=ґ}X?w +BXQTTG8ow~>ŏ_,^-ɂ.;R"f~a*OTT,"Ջ}s8ŷ_1Jp[:Շ= B-TjgOi \BrR)KmoY [XYZ. d.$%kol'ZoEh3:FOzHS!bX28u(Jjsj^ ;WdK+i~@tay):fն5mM,h OL.L4GZYW1 +Ig|ѢǗB;P{T'詏*T˱Zv#LOƊTuZcBRs+d!ct ¤NK!g9^d]Sңp7߿z۵;07?]“Ũ?ԆꎧkW}|\]bn>Ƣz12p+"2U X7:i n7g#de+zɂW^<~OM]B◨9\"e|qI&fD<d<l&4PӴcL%0͒3S{a)/%d2P 2_ׂS29",u,д0oQ}i6<5HqǻO³+_dx)q ]p맦> u_P 1N&U"| +#a m _wJ%I/qmwcݿ] tBPrǶPʷSMoMUp˃OAWh1}1εfaIX\):)^:"^fռ i$**J&hgE3=B+Gz>_ +,UN~J|.eYGqK%䙁a+|ZףHT̴ a~P>B]S_p:d}Cyzrťy oUgA 29e!'DVϳ<"F#AftpwW%R (|b`Y=lx4IJ39N< %A"%ZTzs$GڣP.@ب E2@4|!3L]N۰P8K~x(l;|>_Ϋm7j +_ǦUQU⥫ii6ߙq$ +Og9Y-v@uӍVM_,\˲1`Gn=\S*<m bav _l,"AleLL7uWcQļ΂h9a+Iu,C4J.=L>RMEZy Yŗa؄/ X/4Ouwa,s3Ǹ4F9BXS 9>Y܌ȬsHJ"6MRE +v,WDU(ەR{M.W,1X&_E*._$k ?8F^][R@U@g+TZdl +P3Cƞ;o9$uHBrՐ^cX4DSt\Ϻ+gwq1n:ji< qq;=Lz;l~. -* 5M>stream +0 U@&ey U}-#kD=NRy:HB0ES42Do߆W3r?isKo!(ib- +%!,g 0;OfT}ԣK=Xkr Z0 t2YxxTb<HcсiI'̈́㛸1M՜+6HjGpMC up 89Jq(l:.yUm澋W%yT˜>ظC6CV/üzU]}!\4փ/&<īKnXP?80NW:7xD.=XbkhUl(O]id\-W۠ޅlx6ӥHjj/tzaFhTtu}ɖ"{.rMR7slW XRUu{ѓHO*j;Ff0EEy0A;9.`0|QҎ80݆]9A}s^@ 0qRe;0u5BF;ls@$ )+=!ZUلCu?CamRcJqu]yt 1Rqy/Ky= I.炾f.@CJ1Y_>R]`(ky$$׋fyfy0|B;n*wh*D[.& 8PR16GtIÎ$Lz޺09 ݑI5k&XxSF~/%!ϪաKcXm;~T@CU 5}#Ca.??7JY=v.dXg^!|=n?lU0R#v-{g7"LI'twsB=`]Ñ}l2Dr&F-ʘh['sf>hF1b{e-3ujױJ}`")ƝL|lNR7{3$~w9Hx' #@" ncw9C?RDyz+Ĕ*Ƿqc|{._ο΄|=nt&[@1}tnͤDIvxH>H 7@ +fJ=2',@ra‘plyJ(JQP q$xr @:S~cu&K&B|o| >煾>|䔕 +vguH~d+ޑbh*w](UDgl!%Kqzl'ޔJE#56H}}qE7Ev?r!uLq)|`)^VKcMskIK7!gy*m^ ,$gXnVIdn`8Nx+ymr%L98 A,֍Dw@1ώo]x. $-Pp?=jޕ"JB; ҩ5dt)ġc,]RCJBBkU@ )L縮 .)]t}Q`x g4zE'r&aIe* O$~ŋc` AP_{䨗!-z1{TJGT,{ȻR]]vzkpZ.yCPU5159]]v8$ێnRbnc$:o=xRsSS7RgqٽS#UڨbUNGeI'N$4Mrv8r +xSPE_\ ρD9xtqtNKS pf.*U)~À߽wv): 9c6.1O3(ѵߓR|87srM2Uxdl źVu>c ;֌ݽl{lФpR'w1+g'o]EL G -6آ'}Q[rbU360!fx4V8 *0[/daEj &)8@ָ# 5PJҩUK2\>-L".BF60y+pB& iڢ_tȊ?m7?`ːrnTn}u rpjhg +%:R8&ʓF첶r)xr+ +& H7(MAuUB|J) ~[IyOX.gaJV- @ nY.{ bĻXKm)G1'k69[_*TG<)޷ +vi[p)wN uzyo eJe%|+HD$Xlw/*FQUK]Ǝ2ZcnFr:I-7kcjoW;n2Jyq %\|֎nތpQ5 R#QF.*~.5uKN/i>@pjEn}P]xDZR#s!|Oe#ޱt%ƨUB'O\P#7\+̉V֥J +/ ^d̛o&TRnwTqk"GmB0d}j0wS_$qOn0fM㷂*MJ{^ܲo(;鰑pN}$Cԃ0Fc ,UiZ{#t6 +5|!IEC f|l  3t9lб㨐RFFb_m _A#-;dn1w'躄AxπfXEQQIJcN١.aga_Q#Y̬'tt΃`! Lhq@tr#ldf ~S]]?J$9H +r6}U c+9>T;ʞ/&u_]m?~"򗤔ƾkT% +㟢 1\M58kNqm؅ұCSfbP_/#Ea@뻎E3"M ׵ +W~LhS#D_#-:p<|iCB3pnAd޻v*p1p@7r1l3EKD:1B9,䅁\lGešeĽѪ@u+8++=yR])n +5Iqt,57Yb_ :ld7lPg;K-vϫRr 4A\BO1|텭tlFU%oDф,*@ V5 \9B̔5[G໐t3:W-o*YTcty_/rr(* ߚf3Dƫ :S|c݁w I%NlZcfXzFgӗ獃zەpg*k J QmA| /g~V;w4J!?;_<+jz=<\Hr +މ5>& ȂYRjAj d UmZ=Ic$O|.bxK0I_aE;ViqUQW4.,J:Rrnytem 0]Տҡ)/t 0 Ԩ!`p_Y2r:z8I-,{.t+_O`w5~p% w6љu /84m|IerfXu-U6DcF3TmsA OgHs|A`?$ŝ HǎO64.*_8' 曾xK"HisDL&_PNPn.Dgv@ayK |EX؊YAPى`xU8{F̺q BPFN}q?;(^7na?++O=Gʸ%=8fV< b"Lp3F\Ux(GWB%^s,^B M!(P/nPGP6H[ܤF>4d%?6҂ٞECqYLhsiPiJ/"84! Orի=m5=vfohF+ۙ&]s,XCC8THBGo٤`MB`Cmnsa!RPJKl +"J[FF J hYx?yUw R՜7^(p~n@)?ua\sѲi Aa* bgFpJk&bf(11JKK! _A?12;ht˗ 6(ɗ.5\ s|s6D4o ͩuh!_;5Lvu/St[ߛC`W#-n,3kl3ܰ'L]]i#ݟB3?\f_x,Nq.ܿHbW /b|񚼓dјSXf1VJ?6+n'؆Rݰ{oN E9 *2 ܵk*0b sZi'"rE&dEx16H'Id@}/ Zf Yò)3}jǰ>@bz*jX~MZrK4U ;8jH// %m2d5> x:$뤸{ ~lTae6$dq +sY6\7V!׺Va|LƏzT7Uvt vuYySh}WU}s1C F)}3c]Yaqz(zRCaQ{fbw![C|Y<ᤶ÷\o!R(g١^hN[[AÂlRﻖHu92@E(DZ~FF]U5)'4 !5+)$V}j43iq3bY?=3rKc(kwdY- +`xb`\GbߒJQJs6v~<̪FvmGt\\\. 3ϘÏ7GUV"{黵Mmpna=ʇ>-NJԲjҿFΆÅ71uŀ˸0)2UZȣEl~ aI+[$%tٌǎ:[`TpN4W!:kښ;@Hg+F5ߜՔvѭ2@q^q}/}7xP)OSH)2o?M+V{B֞2.)O*~4:};Yo +&2xE,=ﬧπ7hv\C6s=V + +/ɓ-8ivTݞ.}1Bj z_-$ɾg(f'p&IMf&ЮIC;".*L.L~#z\fHdr_e{Rq(ͶK\+4Fɢۦm,VN;?`,|,OWK{uq"#!L!H%Oj*^gcoDB2{pyͭVrGX~jzP^Dt,+8qz$O_q>,IS ,XӃ7^*B4Qq %;X1f) (E6ZE1@GRl[N:/(zDOwy_8q8Á ToVqClR5_N6#)lO8[Nׂ]uNZͮ+JpZ@ZKtt?N}aR8] 8[ƗQ|Y!i`q(-,^ו "Zf`/0zvֺ)9zNŻ2ѝY108r+{1iVÅz3z*4t{I;4YyD.@EqP #Gunbg-+RnhV¬aEA|sc;R E(|q% +\W~ؿ rҙY}Ə5Wq}>#ⲸyDCVOe~/˗$$'?<N=D8?jwDUp|je.J XD%=q~VͳČe :⽩~"c.LF1)M/\,3?LbD%"ȋ)yP Wwƽ_yQe~H|Ǔ9\%C"MFmN6ڱ]Y]TeDZJaLx + LO(}3Sood {qpL̜"ڒ4IPέ(͝z 88iǺge+wfeRԓ#bbvmRiOҒع5@ hwG* )_{f9>p*$zxE*cy( @cH4N"Ѓ"Iҭz-{vnf!,6CڝQ3fB&\".og?!xY*ү5F:wm+?:F;U%uAV~A1Y¬$gyS_CK^3wv^=8DM."D g::&,VVX'Z^נ r80Z(|o,؀nBqͶu i] Џ$s\49|;-,ZqCdB$G{+bhXa/RMB\k9^}mo=@(dP ʀ]#4%+7<r TMsXprV$K#"TcNlgD@]2/>X9g/5-@Mf̃δZ*%I-,h~ i\Z6D֢eCo~ZuJH,'AܣX.:G7zJQ0wt?|3tm&\GRS=g>!U;O(9a4cIyzʼchÞ#G Zc[d؂02^ڻvɺ+>߀^a6x[' + Yl}.ƪkL Y󻩷\pڱ1wί+l=&Iφ^ElГh2cV$elAo #ҚH>b7)q;:]Hm-" 羿- (YK/Upߨ~0t~Jnlk˧O^x&ҵuB:a4$eQy={grD2ivzcc"%@!K̟|݆~lDnЩYM9#Epsٌy$܊@CRMT(A-"0l9} 擔ϤSB4F}{$N:'saq5[(/g_ۚb +G_nnhN 0quv.. .$%ӀS*j] (N"dH0ݤwS Pt +l)]6E bZ4 +K|Rc.PRؓi !n:c_\U̔#=4q1qVZf֡b 2cVL>uc6Zrlɟ S]f]z~ѐ:a Z؟W)T˯XZ,Tٍqe蠒ӒVFNcMdڣF,)"n5>ZJ%i̸Ȋ#=d0N]D:bڷ1@2>gskG"$WPwUʎmꑍե%vi->n:.j\Z+X~9hRDZW/Iv"O0XC{@CjMN%RBR,քÒ{kVTG(GUUV%Rǫ=& (!9ƯApm#^m/OqUG 2,%<?1venVhS \? :lJy(2;H4NI D}`!g3M(ĶM3wٹ+ +b#RxSqe،GѲ%7/wY/_59tBE8o$Sص-b-a^v9J<;/<-е/jXFa g~N`%M8<:R˂ė-m![^R>Y7@`,wlIS9x uڔ>Yz|>fFId?.It6\b^@]r8WQ[I _h/W +IL5[&ns7bnf̽TbW"Q١ ڐnDFΔMXM7=)V1S}:A|{kkp4ЂSBGQ#8>YF/e١YS0 M'|?bGb~d(~EkWV8|=;q:rs&2HPVYN] cا݀c)[PeNDKr:+\˰twk{/08דQ&卩ټ~lH3S*n rBA#X}wLJ0˺PkSw1~ |[R|pT Nj|Hӷy dSBqjHUm&?oӳ% +GBT7 >e]|co8W>_VeE3#]uXGnw⡸GGǩe[ wcXP!\МYwj&$)m V[5uy +r>֗~x{,>Dy*j$ l ~W20:WI59^mА!Hz*sI-:b `Z}L^&0(Ȗ\tLRy< +<yNO72 )GxZBU5̐(\/y.gP|HRB}E|  S3L'T&*s'S ։ 8u`÷Qݬӿ^^5>v_!Χ=t_lr;,q‰cp?ljab!=G Hjt~V≤ H@/?zYHTMS@%)9Z=O /cT6H7||c b *z q*鵔8L"(|؏x;{zdXK]op횷Ƃ i ++9GsRHqN# +gQtggX˘E.zQwsGff_^ ÝCj:]f8Q_@buzb(!4`fO:k:2zGI 8uk-%Ԕ~;Sjb!tT9MݼZ|[dU$JMRÝ)Nt +c椿Zz.fXOavwxbXڦ{#^ Ȧ` {Cg;ZiU7f~Hn$6FBO3%*PR)%d+idEֆ/tA!m xQ&b-3Nd[=#@?̻ zz4(<>C<'h$m&g}tu5Xz|B4$IF }a.jg<윞0*ľbeʟy_|Dmc%V+d['(&n>1 c.*'6Ggԃ_rf}Ǖ_Mp/"mk+pf6)bMI'fS,Ҭ4+8n]UƓ46RX0?!l4,f_X(Y0r ˙^FOeH"e$.3*n5jي|HX ĽeA*aVct-ђ~񒤝lUb `gWALm\a(F>N|P}TK5li m@q#=/ PݬVy}Lf_sjY y3Zpb"4 CKSWR:OU:[)p˚xahh@GȰ^aoHV8xm/Ӣ=bYHX4n.G¤ [͍&YY9HZGtp=9Չgd}Ѵ^ϰ选1$+@OZ֗8Ԣ%甛1Tp@H(-vJ8xƷlUG3AVKr*HeA+Q!bs1aGAŒ/-lӿ1tw"Yl0β/Քc/n5aD:FR*XoKY + >S1~H)დn!8-Bkȇ8.2>{yH/z(fr*'$}IEꝉkG$IM "vB e>(sg D! (,Hyb{[-sq&Mu&-/lP5 m4}ց)YJUV b kORv:;m_Z )Y.M#vQ&/`5rt]fꑯ!"S {RF*E 7Y,;s|<.핹`h'$50Bړ$aLJ L\ œ;KKe/Piq6eeI6o$1ȂcfQz1؅߇CrEEЉ/'nZ}tyJ# AV2, 6X=Qod}JsAxLwlaHV62Ŧi~Ⱦe?}ftB$Wd& СEcGO&_pp.lu΃0o/?˄wSW7W-RFyOݠR W45!1й8.vμߓC;z'yY VLƌ xggZB[O)`W]MW~=:ܗ&?U X֖8H!S&tC\ &\x4"},=cڸeG>]pwpDJ)$2QE `Qcʙu[~4zhFTDV͞QD&; ƀo(o;;>EZm Su_Z+CfK5K@NPaAz92(X0 VȖW?ao*iIUHH0G  mYrg~ԓBJp "fAg +"siaS42>`\~XB0[߶qVe=/nk&1m4CrputQ9ure ޙUKiվs.Ӭbtˡ <P=#{J^:;LY~! { ^੼f .zD9@V4io~B$tʐACV6קuoFsX+O\L>y$Pc:g ƁkkYY֖%U=BD ՘R709TH^%|MeE6e2u6tS,5K:w[t5mVo-|QjqC ! +ϊ.fC̕&_M^;hp[<Ңn%k5JmwڿR&/g8(Y*wf07/w0- ?|M+@I-4gx4M}0@yJBir:=ͩ@؄88wJV*rrLůgy'i%h򰘖t=B& .-6 r _Biu6#ԕ +@l>MRG'~ϗ"{O } +o= + +%;t._p5hMt|qRF@VtQ?,=퉪5}@̟KQ=e-VyAk 'ZݣN"@c$`|U\WeyKAzjh 4$z8&ij WpTgS= u3#˗6uk go b'=c 5M{\n1dxƾݯ"Z~tU+鰩T1G* >er~rX>XP4av?*xX*=',Xl:8GqĊk.ȼy4?[r40+Yc2&շu +̕I요1f3k%u{r4J2$WR(…Ch86G"Z2}+dث &<$gvQہn=D E YU(Ӫu>jy$ 8-BD;v~ KxFŽoy vGBvDN*O9إGiIINx0+`ꝋV6c-j=)M=ѹ@>?0NJI 3\(H6)G4i菌&57+YF_rg25*7x8Ӏؠ.H7O> vevyN|ZD=΃":}|8$ wfz;MF͆8Qwʨ7/ meg3_!?zRS#;mw?omlX.2NO 5 +n6QTw36pyUQ±2v|+Y`oOud5452vQιp;Q(x-f\* G,5F:gvW(!Ƽ^l<I7*X5΀mbfJiyױONFB8X=ע4ǜ"6fLKY}b'ŅkG(5jQp^+Iiсs|bCR*ܛeZҠzU-.!C"۝e$:?wpZ4dnHg00FCX0YWA9sR]̽msVԸykpɂM+w2YiBu)̀O8:Hj:*A楐, +4޳>XÜ /QM>OVWHc)!/zmF7"u{׊[u W0ktʕ0[[IߙTS3&W!;k^șg$!&dq!htTrA!{yXF7f 6_W=h ?jvf@D.Kǡm fmCɺRDFv'0ŲQe˾q=w-t&~bTz(7gb% j)^C4(w9:7-QS"N+%]D{F=jx8^BMg*g`)k_{Ҋ \}I$~@3iˍR\"_,O/aR< F NcNR32v dtPtA [P7]ϖ,7EPtSgX'@qmaKAVM"]@M Kn(` R]kA?Z/͈{]j{t/I"xO5upV^*9(M!2Jc|va\*?KS1/ 5BWN&I"/bSwߤ88h.keq:5[@ e9ukȒ6Fq +UeKRsA7C#HQ|ٷ1 c!*+R#Tځ/d1yyE(mћwT']5z:hh5kYG]ٻδ˶<?t3 *yU6L^jݎ/-9M\e td ,ٍ3;ӌ+3lhpOO]0Sy=l,Ѯ,+P-86_2* r).uyBw%>1"~8o$}&E@bJ0. 7\O[W2(TZmXngwZ"tD̊!έuܲXڄ9!i"UD$/IąK<ڎ_wԓWn?{ћo,RRmr&nwi/hcr<booi:L[^I"{T# GQs% m\+iÑ?gO*Npd WzBۆ&'.5,+QjtRht RQgdDa{*]}l/,`(L#}o:"mtz:'KXmOES sBV4z,Z[?&+k^wPQȄYK,E]\cjt9Zb4gyn7ߜ 4]2G[5C5uxzox Aźp.z mX|` mev3mj!cPbmIQCDYu2lL.geϠ3hS<KN sU#ݕHrY`JcSD:/Q1n}h65~F"D؋ ̟zc†)Sl-8z |;j&!gZs.oB'Vh`3y4,L6?`.?i`!Ӓ?ny}SOyl#5З@Bg|?'W`U{al!&аgB G[ږ2߉n2>ABfxtJ7 AX MfR0#.mD'hy3z +DRnj]1{XF %K#e۹׮hhxvMKa#~UB< ԨE +m忩"fQJBe2UC))C~b +#,zLStdޝE+nHF+ʱx$D΋` 6!}Ů(׊8-ss^]֋y@[!{(7nI,mD +lԭt NFJtaR5goOSXI U gqqZ { <[HtG[ D S8҉4FEW$p>ۏc tpo,}'N#^ōFTBxxh"t!jm}R{YKN|hYڨ8,7=,\lRC@!ZdL{hP-3c{olWP@'ӼO%1CX*M:T< \㕻d:Fe3( &TO}A'LհW Y1AV&dd$T$v=0) +;cqZr[6KQڰa R%*@#`4xf`-U{9* O +3~7eQHo.8jY;`PL`o]#LNOq$\U^,O4(`dZ,Tքjz9ÆyZ#!V ܃z[6mtfRX'8Pa&L]G@FNzFD-Lnni478XbA-8c(\(>;uϝk f[_BcܦrKĶᢈBD<&YI +QFICQZ{o,*$B@H@PZLܙJ‘JwͦBPzi঳|S'8T83 /IAʳ+;ݸU*՞HSǨ4Meaz@lLHp^^?k]h]In?:" ~.-[oS{F!:$Iʷ(ܮ6>w( ,)t3vgg|x˓YU>&gK,*^Av=Ol%CFEGlɇ=; `cU!S/cI`{D?k2P$Ŏ3',p@ +jm:B_J1S=$B=(f84/V,2Fm=f"y>~c4au6ߥ? &cwut6S<.["hMP-#ۺaFi*2ZVz"B([1..hY`-17]dZ[E5屨79'x}ğCW,o}škA2fl=qg޻ x0s,>O/hZ_:19VM/{h#J9v/( I5 ڟK^ -_5AV_w=bU jԶE)CHq;%xa !拏L+l[Ht%Ŧ_^ߍx^^^,:&kɺ)]ow`4!ryrU@m$jpCgRq%R^JW#'sخ 'wIv;T% \;=9_MT"Po}-/ 8麰ݍZ1k! |n?0Nҕ{ k8_6iQ_BRCM C𛎻Põ㬙mz/}ɽ߅໯'Op}ۣ) ++s:k)yk}aeU׾a;}QÆ_"Dբ͗tL0(5kzW#uR6mB,W1h2}2=/L1 +U vs?0R}_} 4V"e73е?*fCHbd0pcfnÉÜ@F8G@M1L/?6x{=/5ezrFPNO_X e Kt%b=-pEqJ*fI@`Afrɐ@cM=!2L:# \L5pv:IͷNfX6@_5e/^jWaF^+^> Յ֣VT[]nY`HA0.J?NCrIp2ݣ>aMĜ.t~ O?~ilaL6NHFiv> 5< +Hm endstream endobj 2640 0 obj <> endobj 2641 0 obj <> endobj 2642 0 obj <> endobj 2643 0 obj <> endobj 2632 0 obj <>stream +HWێF}W<_$Mv싁GCHlo5,5 񰻪ԩS_WY"$eT5?aӁhVD[ͿZ+N^_=Vm(+~u .^Yݰ+݊ʔYok޴kf4?a $V~R]|UIpcsze_ ~Oݱ~{Sȯ!"f%h38ltnZ1Ilp~l?Z6d)Z_]K`k *OCZt}ї3NZ-cцWwmߖ.Di1vC"1CN!HSfm#:~l3G)mѶUy3`\b6uB6=~2.x4=+elzmr7[Y_1WM;ђ&z +V[X~4ql-$.&c0LH)z;I#n1*"xVѳph\ ~f,_P5"LM]Zn’`7*ջve+}gg>Ɣ8c*vq>!fdK1 +@>O1| 3BHuW Tg-TGcݶ?!3KP,Uo<.^;2G%CՓGjQKKj<+5;wGp`4plijΔ?"eOS(>9Pr,)|fS|80X EaH}u(#:KS.Ers@ y]u8?sƷ?l?P ?|~luٜ=\8M$5 l~X߄R#~oR47v8dk$KL*3+@a.as@ΩaΨ4O4ז]~C‰yF&޴]΅M7#ccez59 +6U]- +j -9`:ê3ާ6e3q29 @H܄QfPjl%R)!CAiLP]m}SwOu!U &ٻJ00 ?jϳPQ +r(/3̾NX?Nomy{c¸Z75t +K 6x.eprAM=f8%<{bb1 ȈPFX[Aa|__so>gim- +%fA`43 _ QWD"ǻS}[ݥZf%˰fm5V l)i [9@*NT]ޮTkWic` 3yɌ:ǰ>ܽf ʏx3>Uf^#4tMBe5v?rP1~l(2/El#\N JL-qZ\:_e1c@VOW֤/Ky=1;{PťCr\ + %b8Fom R&VU/İZƷO1}tC9Js$e$1/ST]?=r$tבRc|_\h)r_ v/88 <_._e.4hR]!HlsglL: 2._H_Hj"},uh`+A鋤RLHBOhe[Mn2&D&@ǀEtx/T3ɱgܐ1_|mUu 596|ؖЁM=wCMRd(^fo 4Oz~,!ؖT~p DxM#a^$PI|11SNi$D a9cDa[֮&9=/($~vGY@$!IGϨ?pJ-/т,j|(wnPu Vmq0K&-%ӂY^]feIKM75Y +l1E;QwǤ3; Y + )6Jt݆~4F~%kaI"B@"9$esg7x`ӛqe:cgTem@PĥvYt(g"ftU-E&lŦ4[]_:ENA1_e3ޞvΫRyE͕5= +H^`莥 -%+`BPtX $EvfkC& e2 d槺/ʖ,=@6ၤa0?T ?(Gd$A3?imXcET@zXgƻ_0)=?/bt1%o6s)40D +CޟQd {8F[Ya'[Uv.cClgaC{'K|M$_VꄦEZm}E 8JO AG$̣anRAhq7ǘ<΄`ݯϑg=K@e([גBO#M]SQצ"]C9%w)ݐ@9#8ИfvjzsMc-pBcx|?J?߇9&UFB-=2@~i󬷭N|j8<9%<[L)i-)hW s endstream endobj 2638 0 obj <>stream +0 H@&V( HRy^zaUs]Iʼn9 Rw>吏"wVKI͆qg}YΦaEKrش-uE-l.V -1nm2 CXF$DYeb<Jro:GC4uz +9Wh@ÍًYQҩ+_Attlي\=cjE5ȜѮ(#PtÈcnA D,_!ЏwjѸ/~}ܲllVUh7Bn +A9' yÊo4d3H۾謆Ne{rLUcp(s!5zsj$B +~G-Ej"\ +J`&~KdR= +iZ`AiB(aNE ph-ll]rA-z#mbcX`Sh[slLh HZsw&s[r Ih^{xKb&狜WE¡ ;dݮvxkʫ.Qۣ]n6J߇k4fШu]$d۪n,FUP]pkC Ʉ sC,Z*t.~xiɔCw4(Mq5'Fơ)R>uWB<4eG`IoaXOQr!_JԒewԱ|l2;qPu3F@ZKe45O +5<j *1Jֲ0^&*md矮 $W3e|ItۣjHڳTmj y<|H *Tw!:|P>O*̼9Z$u*B0,j69,'tLRǯu|A{2 Ov6i7q()SP^s&?K_Ob)h+IT=Fu2J6~KKndK/%op7և8 hk'(E5Tv#;G|G  m + i(qK^D럏bD t@I0zcdW(`LAt#,L#1plF_r9l[˓)28R|Lm@: ,{ߜkDW,/yM MLRī!LhoN1fo:ÑYZlr%>m.qMP8G Hm݄iZVcaN6A(wn\W8Sn(6 +iEAO 񫔲՝U~+Pf*:L Fkَ!aw)2݆<nq %qMonimO?tDҞ c'gY``u9V_2 8DG-;}60>Q9+'T(FeD/N#ǮO Z0sUG͆ mJ-b=)lBO4LqIW2*nT z)}Qr]Z<[DkCtbᆑܚ'#ƌ<->Y:qAM*@N&Q=\xE+ytzU(s4FUnB(MG"'5#Vw"?5z !IM +dtc)QUmo/$GqJn&Ss=%Y_n[Ƹ"H2m4gf=aAe2(afd8)E=h)$v ,B$ gU&Vƍr}jexoϞMZ=Q!5d=`Yԕ%qJN ¶]z,g 3ɅKqń{7?ݓ;f&r&,XU(-4"X<} ~Lm\apR|u&s+Rf3<DG~ /H9@v_2Q3^r[˷^|GGWz'E #Z(Q$}9} p;qH,[Cv7Wk,g8[vBs +6'1MY d)ڧszj͎mZ,[A dF+xXHij.˒Ǡé‹3tTD*j!'t1_Ss\lylu<ئ# Ԩ({-:SKQܽD'Ocf>nG 8oB (t$m !k ׏֒(p`Yq +ҤEJ$E)W,K)q"65o!zC~ciH,{8̬wxQ{ZCqР{}y<8XlI{=>w0 ~Z#I {&X.ri 1y[;g0ۯ*/6`%+)E'ΪiH a+mA[ˑyg4nɽ.76$Dsz䷉EšXoX[;mdI#_rhxeO>+-Gy ׻ 7f"PQEsr>lNSIDjFce Mgʆr9҆j]R^? 4:4Cr0\*d`4;ٟk6M& +e'O|mf'\\qmZifU7Iʽ0#EO$Kh9;귉W^4RVHʁn*WތiRt G)NxZqM'IzA+ci.YlX5b 28E@9GŇ|t0…p3."W#)5MgP+;;}fͭK,t4PosU \[-"ef87RGK]8,Qz{0%4R=cb3ђ3ꦴW\t {NV߭s^%Gxz'$AųGf YѼ'X.3 +K`U~U9Zn9FM{NUpm*?G@oa ׫dEz]p'V;= +ȩx4 `Qs{NPZ,OWb591[\j1jp%IPվ#2^p d +dqbm-O=Yԟ-eP ]Vw\aTc!~ҟRTz>JaJ|O h%$Nm !tuK&ac&\F議>v8O&` Ө]Ҕݹ_gɵWCɎ9C"q%Hp> w܋.}m;|$ Te0j vb@Zi>N5D^oȪT1k]1ߛ53FEUl/JoM!g!>۞/z ']%0}"Ũ85芌eByhZDm,  n2KFl-X53sJXoKD_.;qᩜ*wr~^ +g T{<_Or׍^gm:um%-x֭xH{nо ;x/ +״fᷥٚ޽Y)= )ƍ)f'E\**,Zk.iIM͛1ieOhބZ9zBDplYK(|-N4`IPh/hKԧS^O9bCd^.$zgfrsA;&;|̻Aa5?_FuBcy +0ߗ<݂&jou=_gŌXG݈f9u@;`oܒIlVtao@9qqk )n# {|6(~f0B{hTwK,ҽ}|!W|\u.h%VJHwrKC3*EjF)nim۞X{+ L_ԔYF~X[ F|h&j}k֢w0౓wY7堑L1Ydݻ=3`m9ky/'K O|rE~5Bw;RP>4WE *fA<29ְUmo{!l(uBfHo{/b!b}lE߳5 ;:AQq%9|!&*( !Bj0Hg%dRQ#Bй2\ (a@ε#ݞYլ$BO)QiF*c+D##j`r=+>s`GgT +goH*k\ 6/S_b۹]Sb?HBk1H1T ֠Qtc1&;/@w#VFRJQ]Bn⬌ROX~b7rٻcsyx^9,A6v=7+AwOc Z09`r$`濉-ϰ!M Q$rW^YR+z2"O0OT+eyV,#qpG &ܰ]W]eZ|Ѯ0|ѻ$W(Ɂ4'AVIU~!| !Q=9/+(a9 U5*+&QR*pƯ#WO lH4GsSH$3۠YTuZ "̃fɪ5-hoK4K]sqF7RkE.CR_(y]vCL'ڨkMMb'ꌢbv+ѲOL#?Y*O+bn6.6h W0NK$oBs4%U[883H찉NEn>X?烒: ÚXdb.%A'&KS)ECO_#Zog<WJRk]@hVtQ~g^E1 dr _đc)haa (S|?ܺ Լ xbXVA^t+vEݵvݐtQ'b\GptVi q'(O6OzgBQ*&#ETb2_\4NJVzs\AJJoבCþ+GZ<խvU k!˅xQ>!1 sgHS#*=8epXb#{ѭnΖ-&Nߏ41\-w];Nߴww|V/ #M+_J*-Wϧ֚uͲ9}jCOd3HL|-|DE!āF_wHc)H@Ke LA00!ՙQa.Va*嘣 Ȩ[V#Y &lUcRPw+(WmT,0BY,AwWTSZq2N͑a֛V+qp-Ɏ?3}Ao3TDCє*\#:u>hHj?+}%K2sڅU_Q=9A&Lcu;O|B~ Dǝ5lB >I ++MHۡ2Y(VkʤIIK\%".@wPf +H5(' p:+KZyr£d?QM3yuEpҗrfjW,#ce?Y +ލJq̋9 +$S$hGcey~wSv F?{(YCWזxRk+#,1 #ELJV]mr1dU3rp::Px_>=T}劲oHeau3P G"YJഫsԼ5s%Z7q V `; +d6稴!ު 9VM\ +^-_FNp$H/׳(ZՄh7@C0tR&dh `=KK2otؽP(ˤGiO-9ŐK\՝QEr˩C;^ fNCrC/*IwDJ9#w<,Ӫ6y 2E`c$gx6v$-m L!McƷJeUA|;f,M{R!;cisdg!)Ok}N0:W47 +_K$)3 EYO!q>頬a}?R@PqCo1Jw]={}s9zO~֦3v2-{|2\;mnᇉ;@<} +r,&c5q%2ǀBsUfy@E ק 8[1 iBUN0N&f/o{jͱYG-i`dNdYMJN8 +d+&}Ap80'~e5wc(?N^~ǣ5gR7Y.}JOp˟Y:T=B$W[,s+hzudtfUzgrx-' d=a5ִ7BZFa'Q/YmIR&qC .5~UN (̂9{?e{PSh?vNI*5e4aV8l*M26F/ m-zZ1kqtx-0gNq}C[t/s$#\ex0خ$M")WTqpTb\ѷ((O]I^O=e .@V+[4"G' H;OHO" '%c=Ԥ/+OAyMˏvtܹ?r2ť²ތP JRu~r:CMBLގ};^ %^^eZFJ`fU9Qšhl 'O:It=^>tf<ɲldgF*\Y &eFb8m;oZuˁXƺÝg 4Q˳DVej]hFD4epˋ8!yw|@*2xl?#O蹩R&tfLB+ D.-90ot!* a ׇWG lXQ*\'r73\w;֠tZNZŀނ'{ +A<`5ǩfc?B2\h뛧j&b%vjhy5>.qZMYR ud2۶Aԋiϫ7g=,g{sҒ9MGP1ɸ+(#k;̀jTU~l0օL 4Zӻ'A8z=B}Btu6TH³ Fb3,lEB,LA,־KN+3`oA"H=e[j2P(RІ_,)4ON{ū3-@@6{i>fdaW!D,PyjtM\.1fmbLyWIM05o"ۑ;T6}$eN Dqzp$tŵrbGO[Yda"FmY1TpQpP0Dפ$ ,v@߅.'HXpuYH[2 &^n-k C|湀-cE ǿanrgS% uZ9Ѹk(BMՕl^"}a8HM e˰vD!!嚏kѷUXDTI(Ֆޭu`qvsֹ@HRUuTMS;g gd>4E?eq4GT9'g fc,Sچ{y'5y܊k--]ezz۠I7(J^2Ĝk +A5S~#jo.d 6@K"QO,k|;/ﵚPngŤD-0n]us\ +O[Gh*o 9EЃr1 +LQ728b|&A;&S[t&9%F9>.UEy7L +jg@OFE:uٌCO'wd`[jZfn4UtLJe)'Bc' +QI8%ΘsE:l=– @w iLʨ$n0 ,x +wcvZ ,Ras1iIN.-7|qΑL8Ȗ>nc-hjfFgJb,cD{ 9))}>"+ҼBL#87$%m +S /sV›po[m*ϩgw$&EQA0uPiqxR%çbgBGIb:e +(6x0 t):=70 ns=Mԁv9ɷFf #bf (1Ǭ\0)n%t8Om_0bUs6l>AN"]C8lHAV,ڎ^].nğMRI|8kz!s^J(i ;7I-(LŴm840gF=}SFEP?LRkWƆEGQ|{L,Ր{RƒrSꄪUE,?f0F2uuhTo =f3sË(f>C`f=6 'd3}ixpt@ƚXK'p\뾿~]8TeA(9~l-B1e9k">ʐϻCw{BWutR I½$i &`x{Qצ]5c;R,;MXԠtZ>K-NE`M;^oR><&`px<M<-NP +Ȯ .t5hRR֒gKj1AmuZf)[qu8fP^ V(DuZ{ZVNbSdxǎsZG5Zњ5Vb眕|: a]?9V(Oq1y˹KXxj wcOL +5xD_u sfY4.elj_6UbOY\گlfLd~>0U'Re@8O$Ⱦ{ \tӷ}@A1@lE 7zTyBѥ]WXlJ߸ຳ+\/gJ*d)H! D +h() r^4Y(ª v!J +)զqlPpgL:zĶ+ߘ +.YfΔY3FU|L|nKF #˝!᣾s음nLN+wSwa=(Ix) qG<pZ77 N !-c{H{b3I>_Twj{Űv8B)\,(tN^0kۜmdt5uErވ:dU"%A, 7hPSvS<7ERi +]vsZe>#&[|'䢉p(laʅŹ xR='EoN<3.»[DbbzkDd/ڠ'Ï/t,?A<Gҿ4_ۂʒFg9#PixOrn>p: {)0-8T_CėF}P/+׮!lG2S2Fe@^WiHZh~ XIȘW{ ԼZozq-IP+9NxkųyM{jTN׽nɒb^6m)Po2,^\˶DՖ7JXZ_VXe&jԿGRBùZzS~y5*!Aw eCH[R*t Vhaw|9]ּyW",#+OdpV 0мd7|ˤj1\Æ%dV^, zu#F`LEK$Egzʬ?dlU-G<1׃* +0`A<>h9D&mW^&}w} 'WZ`S&70-e@ ov{ J,^&rXp \n + +t3$oD}*ܜƕS~by9m240*^X&)0vٚZD;jh swg)7f}6}0˄K'ĺVGDWB'\ź; ╧+Q|8Z +;&ICBM5|At3W='`vwt? +O.}u{%4f~ͅāI㥰G𣐶ӑ~Sc-ݖ?p4E{+I0)xŞvX Qޟ` +p]?.)hR%L{_ja$#+539~qBɳ`z+BU>hBN&[~WS Di N5<(Zi2F1:"1(>{JN ̅)xn 6")FkP̈́2-q2;kv;KGtqӉ1n3YF'UM^'0c'Vf=-f3X!`,b%+9MF hihM\-U#l& unC;B\kLTS73hFX~AeLhĥNҴpQQбϵ w[&Bt69=^/_.jY]|Ҽ)>Qaa7rf“*8H4+UFy5C9'沓pcho.{:%cqqN`ܭWm%5ҒIzƝ;/s -+ӻ%)!zOcXT4%o!MzMQɬt,:]?Az\T vQF~Ŵ1նI +4u,X҆,m;q %i)8j%T̰릂p㽦X!1\BAQ`m-&H\H7?^8jwX{߻+C)lJgeG72 vQUqn D?dk*VXfBͫI-Zy{k3IǝӸczkQY +6pEnps;`q4/;O W ̘q-GON$:KL5gVCJ06 ?|~#TJsV,W@{2.%3德l+$閳qz a_V?N6KOi~0!}d!w ecX⑈^S4A4%ɯw[W2|alq--0_V/)69MM$|%Ku%>oi/[}̹|M +IxIJiVOo Q>CaG@᭢*Sjfռ38339Y属=H΂-d8v`?䵬VoL4PWŃI-.DȘBOQP$b'Գ쟾~1+4c[.Կޞ[HnwN 1n-eʞFմ';q@ M]=b܌$v1%> |}} ~IS|Kw8GL8 th.-z%kMO>9HBN}v$w<[q|"c+`'/5!+l@V>Iz6~. Ppa)IDBb<'5]erl_4R=;5k@:yRĝ;jq> h +ӷ f# :bF_SkSJ!?o%똵Ӗ2dZ>{cEQ;<#BF)a슴/놇mo=iCMP 6jФL$"CPVXv=Ѧ47P+/ +.E'5`gYGMyk]YTfk-챞tǜ׉fmDOc^À OҞSC(5ws5&_"k/c F['CQVo2?7DU%2xrjMոl>,#ߒ $B%^VQHdGz`T~`QDR#\a/PM tqvj+q~EYX(5J [E|`UaSν\A!>?[R;\T_&7X{^[BKHp1@Ar<3z7^ Yb{xō8"%!\SϾ.5P!?T-PO+xSJ&{(uPF5 !X:qR.HOnUbMBJEڧ9bO ߒ'ųPyASILE,͝[}{쨚qG8A#%72HOAgN4\ZYС}@c"Q\lel5^b$fg݆{gehˀQȿ`h^`q7E?/.45ӣ`3"[Y+p?D8Y3qfrwU7} +'].s-7~iqϽ'F99"0k>ԀM A u+Bym d"zFaߚD?9cʊmݤS4׶ظ݄5,@ p 2[T1pKyݸ@::gbTCWBUf\rvGx`ExH`(f NH1a=Clt$YZ+ⴂFo"_!P}FPFK3S^Y]2 ovQr?[Mo k:E]Za#[ؙhhg,1oٓ9A&WP$rS.B1Z|fNw;^1(69g^OOgʥmcddjQFz;M-(ݿD˷hNpWD9ᔠX6M2;:rՆ%l@4I"y!pggNxW +8?@wEnSzAtTg=r8XЂ(լ{Gث|Dߙ_ ),\$o5H.g x"LY`;HbG҉ߋ[ mGϦvcoeͽLĐqOص鍢^rC:Tdⳅ2Ua۽Vc<=h&/GYf(763C#]PJ-/^9 S +|7eP.6eHn#HQ4Zdy:  Olh5&cL +tXՌͪ"`_'Yg;l(Z +v^hdA +V]BͶi]Jẁ R H\o1"M1gI/iK# yG@(ܨAo&<&LUc  ~q=:6+"ʸK!L%+wh=~ܦC=5~]-!4j ujUqtOlR +"AP䡷ȭ_Z)_N9GVܙ9B)700[6.Qa7 .D NPE{.;t_hMHY8-f~.@=Y+q?k*j; ̈́cb)|4y4VznaӿXo&u,w6O#֪DY PeJ1e.?4*(?y㴕y^S%vPxw9Z2.h."T`[T'(˔qB`_Pl91"Bїdq)L'BFJ$oBE*s4f ;<_ވ5)Ļ:CrDv1^P|(!L>[B](%Hn]rFj@/MsVpy*.~Ƴ,c$b!pPD +#8AD=9宇7fe-y>#)؂:+w+w3+5Xh’9S4},?~D+Š=NƂSe~W}!sB\[0RKmuZRvS;- ?}I.Z9> UpOhn^XqU`s.d|L$74}Kyqn[.J}>/.Ԗ2kt\qY'_>t=袱յC3~%nٹ̚@$Z^%ƚ7aՌ٥ : 2ԾOB܏@A"Ksi-%[ӌ +\@rx~*%[BalghM^jZa+36?d\FcB3f3a +e]vN/%bPpV\l HG(?<SFP~;nIRmqR͹' +7jWt\xlϾ69 _*{>eRsGk3^LPyB.-.c7Q}4]^Y'tECiѥo% H$ʊ=Nş+pI01pB H}ռu(>A/(:yR[P5Gt}4Z"zOqmL~>mbo4!K` #4rnNZD&ljZ WN1y䀡rձHØbaU um6i><3UM#Ѫ tG#HP!n[^y5L qY*"Nt 8l7ЇE<Ж0'8# %4I12#v2v=EI vL*=te>vI'ɒ 5;"4[Xʬ1{}g{gE$VYZ4$T"ktb(oCZ#-֛e Yԋ"Q/} endstream endobj 2633 0 obj <> endobj 2634 0 obj <> endobj 2635 0 obj <> endobj 2636 0 obj <> endobj 2637 0 obj <> endobj 2625 0 obj <>stream +HWYoU~ϯ5w_PDiȾe5Ӿ|]Ux0m E3vnW`"@%%!b.ΡѮKg|;HlX7kLmt].vQcwMvH=}[ +)jpx(õZ ,ry # +!?n W{m)N,hЅl`<7P]ĕOY9EŪW{wd"Cl-=LEzwI%jSJb|!B]=s۸jOeϓDa>xp"aˇSVN0 +FiE8N/ +O5a9%[ANA&@p xZȧa!4 Ď_`!Zao~2yJ1$RS@oDF`P}αFπ-If6z>I ivR8U~|Lw^5#amzO#v1=|H.)%w1.,wmM JaФs-Ψ4XV8ߚчzof﹡EII,O R-i>maQh@ྒ%ѧ B2N)A2c6DLժhi(gb*ᬧat׳G.b~:f=]݃Pp"C/Y2"$ m5ɕGpvrRڠftKL!l41tJ&vqc^p9Ɓ;y_z5xldj9`X< qzoMHrr"1625 ߸< e:K.,\P8 +֐Yq[l]d}MY8 +wŢk!FManj >vL] 1#YxҗCgzPp5!S:0]Uo{(-Ǹ{n.=bfv9RyaYs͕z0M:ڝ.CWZn(Ԑf> t\~Cqvymp?!P(pwگwG?Dː+ Dݮg篗mK퍔P\ܿbE,נ8{rx&H`D + Hf ^'a_o\??iG8 ^ _3辪?]m{}; +pC–•~~*W#fg +/U-Hg yo@qng73EfW'R +W#B;zjY0 ʍ$EonY9 :ѩgmfG xJLgS: +dLDz +GCsnॆcA6<2#GuMe~$ɔM3o +ƬʼdW{O endstream endobj 2631 0 obj <>stream +0 M@&0J M}×fg{1vk7#B PI41*'$0QzihdƁm^(%j00nM@jvnywN[D(k. vK^Gz&<}FPq )@PTQ ~D%ET n h##Vg^Q:(+dfwJwn@O#j"Np᫟l+!kb)y}Q^SwHX1ԡl1'-RJ +]5Jz{ѯ +_R/ledސsA+߉Ev]b.$ g'xNxZaI3NveJW͑1 t +[vc>O'%ڕV"-s6d=!N5H ),) .Zy)+EW$ϗ`<(:VX8oȋ9!I1$"mkea%Vmf\ 5Bί *xixWqN@}/fsStXSM!P H !szO\)4.Rl0FE*C~ +c" 8.nĝmE~)}U#Ɵ9pOȓݍVѫW0 Qyp s^ˢUq2Q}Cyk#|mΪ۸2p ZR +`d ZijPwٛUF[9|ҏ=mZ(^nW3BS" co07+u>(rx2 o 1'fo[s1$"v%}~ 0*C +bJm;H3$uQ9vp15uv:{1efEo- {Ûx͖>iK" + o/MGn+=G$ի[.h +W"-|%T^hD5,Zӽ0K^f gt OMyCneV- l T >zb\ +BW2Q7mŸKH~GqJ#bZ\Q3޸?3CV +([⩙_/@ql<i^\Z dmlJf@`QI hZ,!gyV~\e# ?=.C:,FsZ*D G?VVqaaqň2#7e=Ap{U +#K|ET_؉1ObnWD1)=дM[4\u1QT4eih^ꊛޜv&^fFQ3>H!!Ep= isrYR)ӑˆ]mVoB+A80)p9 +ye]V #,q +R +rS ;ck]ӟϕkYjn!BWV~k;gF.y6h +􋤠`u) {kwK!2xGakv+CTeɹk +` $|Kٳϥk~7o- ޖqEW䏄88c'nIP%CHB8w9ɯ_U}L KkXWNawfoc (Zm9^*wƴcx\3nO6K+ى.ߔ֬SMp%tꛈV9{Gb2O`Uڎ ۊd~^Σmkwc/xkY 1_ đ19jOp7m1,r\0FCo=N(0 ~3`Ɣm8xͪ5:z$"#i끦^.4v+n"~u%MxP_Ot2Uɋz|Wf 1E JЭ&͍q='(qYbԪƕgm7\zy鶧"t Ѝ4ϡ ퟮi\k-luUK\fh钛z./ +D:P/*%W ěj/GXw?c+ ^%K ߫}{5/?aUkAӴ'tU#0G»(F>9XQ͌ +g*$$#6iA}ޓ.-e( UfƟkz8]*N^ufUnI]myM=CL s0D},޶tP@sB Ds~rB֕^ѷ%&%x=_AHqI4tBʹFƁX$=M?WR9.w8< e1(<%cp6 )ߓ]n9RWlNңxNj{f2cu#` o'ӎZ3zd"3<6 ̨41ݠx#YcU]yVi]NAhNFl_ǙF +{@JRK<89fT荏&dylpY좳6͗V"X[@Skt7Ҳ1 4 aF߰ڤo}j eIZ!L,FJ#/tevIIMC"kz7hTR23 Ԧ_~܅Dq$^KڹfWBmad7VImekx4 +޹CO?':+`yΑՈ/C29NkG?I CqpG4G+1{s +IQ dL=bHXI|s:KwUڻ9b<[r7Gl.c2kfqMLainh_3F9 +&̼$gaBΦ:c̴?C'k,d8'/lڲ$/d1q^gcyXA7 KGxj3S %jÛɍ+ho V)#udGI xf˘6 |M`׸7@|r2/% 䥯&-]tqaQ~Awq &c^Xf^O'R [x)!DSR0x1'9!ksB8/i&7[!=QlULJoBހd;㴽P~u,8v]*鳺󁞌K'AYD=/?M+X1ڊX澀C vuEH28ts4-}äCug=Ftㄵ*1wJSmzMe%1wpekwA*WN0[*GwGb)I.UfŢK} 2g$( ș$T^8~l+WĂ%N3-, +ZbTfpFx>&@5cd.)O>:J`&p/9h)]5EXa3Oy%|e9ZJSX Cg?1*5}iy'B_R<Um԰>%d$08t)ȥjg/P  煆ŔnGW,OɶY3س J$ߨfGg6Q]*f-mP+ꈱ +g P"gD##Ro .txM{%c&e?HP u8[u0bEl:MA҉ExL2}3%㸽,h} +qD7d l= HL>4pv83 _d.1s황.KS |S ? ;b]9^θ{O/UiL: +4Q:6ߊK(-8:@3kQD6VB׳«bduc0.ڭ 3Z Uz-$+xum6ĞX.bMЬdDȚ_ZNP+jdMZi*+iYAmeEs<~~~FsP25 qSÝNCZY}nw[>r{ Z a +|ֱB]şes1RwtIiF-"9w׻LW2Y#E0FQag(_"f T4>F@e} L*k)&Ij??@gMqK%k|~Y'O3 w==mmF1jKIXdLpCqq zZ-]QŀoIEmGV:65L%GE[L} S3z W!$=`{\|5@7G}&.TUr*.qu : RӶj!ѡGcMZ٩;d(zpbl=7>7b؁X)6ȃG,PD76 t*U/^S!Q˷kɖb9v 5h{rP:OH^lF_㣸h(2Rv6mwt'q%|o g'#][Rh" Y!K(QϡsE4 Xձͯ:.xNs2M-%SE_}`!4Poih\2OP~|Dp_dbnБY!9M P?o)|I@keaQٔVZn2rGć.Ѡ:.W5lC@\h[}>xVBL"?9 ]z}Hߔ'`pNZM нs .m #ySm_>M:z#qGo& V&֦D2D4OjsQ*^=G\2SqTi?V8 -H-bC$/[:S zyQ9S4OsQ>t!?ڂ'--^ rl4z+G{q^xWA0׈Ո;>$ FNm)m#5J + +ݔR7|10͊4y3مv١ ]goK(i%3ɬ-O:cjEQ"}N.^͹6h'RX]pᚂHze"Ly%O7vD+q-:sfYpEU@{+7sRb\J^=`ތ Iy2D=jdmEԬܮxe=lV* n7 :X*eXP Fgo|+2]-K".\Mv@3'*5>G E;; |"B꟪g-lRoG]w \AvEW! tDӻz5o4hwzAM{pvOt`;x?qk&D -Ծ%FL=dCٝ.E *iWVwQǥ[k4O'`OqQH7UC~Ozgos=Z&YgODJ}zG2%ϽٮKi%nTߡpL1<)8e^Zј-p +CTn7NZʎ~8]8&QQBG{IӇgE1 ;;u\ڍ*AJEsٌuuo7k*{(/ \KST= BЌkU|%_U~>Df׬qUi;;{4Cj@F%0[fn4ΚtsP:æ&+䣣zbn[zӲ7 6pYQFae`pj~(eo nCBb3]H1@5htp}5`Oə2GEDuX:ng`jaL 9Q9]vt*+rbŸg0rlpذ3]4ڱ3%5X0ϻoD|HfpWK逰~ixi\WT{7H'w bBl-?\^\I Zt:-cSth΢y@1 9\+i3$*F9\HӾ2%;{pX5-zszdfɓ7swek/ڑ:N{68'ZӋ~v$}nDǝ9T||'pFN{d&"mY%9v~6#C# 7#S2 OW L F x?]N$PwZAHX&= ί!% ^܅fH :TѨCQZ;tB4fLk{|V"W υ_ LuQ2G&Δ茇 12MRD\w0wA'YRzٍͩ:L0߃Gc۵xR. k~.gCf:0%܀"咙kn*@$*IB@c?Ǐ[hmlSEI20zdE?c3$Z€h;` +Txy'v?pS?2ίBdKV^0T4#h/`RƎ +x=f +ab6݉ +P.9r03 "1s-#ȡc|ծmr +,"A^Jp踾P?!PbBAH X_Ew.[/81o?n07I L9~Sc4{$I 8Y? Rg͊N43IJh4 +#oMTS#$\PPsXWyr*:;&x d~,:h.rY̛I/dǡW3>WMaz=1步mx[^į%d>a|__6 P?AsiKKhh5iCEY:ed+4Hg.>V3ZObǩ 'Ar9Ql+R|,?D5 L<d- +1L {BJZX1T9+ 'K` gfzin4B#-QWV!9Z[G.B|joP vT23O$qVw}&R3#wش/B_a=7bN6~ԁ{b@S 2#Ll.*YL*|6  @(%N CZ7>s:s;İ^.N1L@RM;zCcQ˸~,_u5YY\h]Q +fK@m7^MB 4#, ENEe)#d t0׺ t|cd&5iR+~sGY\b֨[M"L.5]! ni [u*kQ{eQU= +:V|{,0 0ZvQ+ϜlЗ4 +NyJ ЪQX=OWAaW O,X=ۇ ,@=u* T4f7 +_MgjiLfzd"|ng-<9cQN>ɭ@HPyb#Шy4V-'tJ鲾T4Vl:UlnQh;ْHN;-HO[܂ 41w-TN<] ċ4T@M3 `ˁy*:j^qa9: ӋA?0Z(ܿ.TlY0y 2w-%3Cʔ{0X]0AP9^y%F"[w%, +pdW\s$¥M9cJ;$CBu)y {<57̱VZY#FOAlgJosn {>(ʜi}ii.ad*)xtz`mdx Ⲁ^$kU2v&,P/* -* +(0r.ԟU0Q7UiDH7 +> F'(:Q8&:ZŦq}΋a 8qgfmcą:{N٢#_MS\lv]RgUڤ%Xz[,fV̴!vN% FZ?*)9B *fxekqrيJCm:9aR&ţGԇ7OT6I U 3FAY󓚘j&xoMl +:m!0։D5%'Eo JdV⃑E[x]@8U$h0xqfu0~*dШit 0P pĆ()#)#Gь_&#D"WM"cGB#3Į||}cgdPI)"m~-IVHdR56'n13q-k\oV\#W.Ӌ*֛Q M@#wOw34Dž"vJ<1,>3%kUUռ8?rp̹`-^~ J/f#6LH!h:zɫwG> _UҖg ޽,--l[wI5$5^l?nĤn|Afy'DDmTђI|׮Wb@> endobj 2627 0 obj <> endobj 2628 0 obj <> endobj 2629 0 obj <> endobj 2630 0 obj <> endobj 2619 0 obj <>stream +HWn[U}WG(j*K<"7mNڎ=kn(v=pޭ=sy:^8ƙ6׫?^n݊~*I?Yފ}z`wNmz% ߮~sg-e/3I5{/g54֯a!E'C:2Z/BIn}˫7?IKrϷ~sAF0< dTZ DHL@TVoϋm֣LvJV/z!aGX177 +j + vG?E118j{18 TE39PW`Z[w& %٠f#9tXKHF /2@[W΂E%H]b_^ǫItm ~ ac\vby@c*xx(*2Dذt"-Y>5^`daIF: ű{k=}n\R>%ۥֽ_ooh'IN`JG''cyL@ +2ƅFa~VXBXAg EEE]T((Y5dB q /yn~lC C0f$/b4JgDIZb9C- z\[?Ү g"EJߍJ, p).7L'WJab/Vv|:Bm: L2af'qAk$-:Frչo>gj vLc[aċ%,TnEj 5m[j +)C:X)M]GBtr=]Lݴ +”I90Bha'ACk$"&aL]kOY2v._uGVv(M}$3qjz' kNq}mV.%L2yю6,23

rWҦcff XfKU|2 +LřbR㪸`Ly%O3Taxc+U/[{\9J_GkOoja_ +Iud}=*΍kNtIlt_A+0PR Tm_&i$?* =FǺDt Ž( ~ %h2$~/+mWvNGi)irl$j:9q l-W~{iB*ώzr!y[QLJJ\_gxReJ&rYSD$KSԕS $0]$l>&i23͒#89R}8ȫcJHv +E).7ڽ.M3w" +Wx/w4=+fUib'dUE=Y=;ǒ߅"z1ȟIJ؈jW(k$pt^L<|a4KPjIU=?XEypqP>iq<>Ԓ5$m}pq2L6u2 nip |m^HWY^xMJ&iTl'Z<3b6xF@u$crS꽫ʧJ؀(=Ǫ7P{z9bnov&زN&86ck w7as;Sb|!"jHcv8v1c>uKu큪)px,ڸ/p3 Uq +H 5$/oWYyUOAxˊrO:IԠ1\tM V<ֺk,fP$'Pc ŝM1\czy9|zž?!31!WZf`o9 endstream endobj 2624 0 obj <>stream +0 D@&6 D~8 Qo_>#7\ 1ŹM}匷 lvs#ҭppj4fSmPPPH "kUVՄ!.7kȒ ?2sp#waWAT)d 䫝 +ȞOZJcvʷy6 dOⵚ%xNyZ%M%JyegplW7ԾSxX,4%$(+% t4&EUgHIڂ^v!̾10BPBwhnXuO >G\Wr#u 3دV5n^"z/j*_Sfz'TMhĊڕUȲ^"K!ѡ5dA{&g"9DOLS*:UݱMAD#]6z}yVb˜|fC"OsW,*f'kgկj@̺"kwsݜ?m6sY6'%$;]י~Q{oڬ6a 'bbrˆDr5:rLV +tJuvKCOª@X6D@̷Ycp#Xr+K34z@eFhq }>8lftrDK΄&uqڒKu3 H'\b\fJ>wbף{IXQT RR΁*E^nME'N3 +1Ik72tW0S?_-gV҆tcD"' V_%d>}FnDu +'O󚺕Jԇ//{wZD!^aݘ'zIt T%츣95-'jKqwk nMuE\$(s!F '=Լ! w8SRH:?عjϰae-?EFylLf] 8kૌf4 G/GNJ3ݧTX 1c 7bY"fs +ۈ?FgX*zܯs 7B1ICR۝.MfqF3\\މwRYL ieN7s&NIuYs*d)~o1zen8%~CBEj:뛘z!$FA*m&*"J\U}dAI}# +6AH:4W]UeT9ĈEwTwu;y4D4=򺶭B`XS־~*:]OnrYgil% ?bVq Bc,sl9C)igU)j\=Z:XG;ŝ;0/`\)G }Ol_S99 +,rf,)^5{bSWshy}64M}E|HfO(-n#` +|o>Q+،I_Wtv%sᙺ`rLV" +ƾu Ivr.M Sa/VV+d_I lVFX ٍ* 3eMBУ.h|uEr/ڭ#ḡ_d=<sȝ.+'ԮJG3!4KZ +I65rUaaI,ctH|tu7l!Ua@%d6BLVZ%]ܡ\*k氛$%r2p.) /٩eĆӿP yaԯAoG.-Fִ@>jzװBA lTV-+-rJ!R4X GTba7i$j;v%%:&>] +j6$gk41|9 ::H(ʦMWJp K;*+VVx|>s[.ם& x]Bm(./PU9{bt<[]Z /z|\x*1۠F/n**yJtӭg ZZFMS)K{'Sjpi)7ȴ|BN1I@[a#|L"]%z؊f_; K!@G'H8@yBF˗>MWsNX3]0ң } +t{VւH3~@GL)yw4zGmο|RUM25|>;ZfbB\8(\ hx)2tjՉPmB[$譏ZCVFpƋ2y}ygZN%t {О' Ep9NtUP&MAPvY[i֣YYR2y5~uQ4;˙-z]<Wr"1XL=!8^73Bθk LGemC؅ :b$}S!ɕsCB2ЮcˀtcsXƾj RtC +IؐM` (nR!m%OZ#I<,120S~EAx-5miQ2u 0N5{+Fq::kb@c"j%]!8 ['b\ȮIy +$mZ^/SpmppD #(K\;͗p幬H[}#J+f͟rz`vB :ۮ} +^=IcWH+X[&#|~[|Z)p#b|+IKa&2GMeo#C R */,[TQXtl]$AzJ{IS4~`s 9%ۚo9G";zEt!Wƌߏgĕn5ޡ^WWy %)_b_ЀÐs#|ʠeqTA`\-TxZ撐 VgщS( :z{AA@TNm׻( /c*8 !n4S,㏌H| 6X\Q" Gh9&:]/B'&m5 AaAN(h+]r-ԕ~WF` +!:W‚QoDUfda͇}rTrN & +v`j&Mh~gLj׭K1[j%#${Oy = ++K dݽ[nGŵ )nbD#HAb|<O.fX.ia䉲 `^7[B? +1c+Fr0:6JD$2 +N< Qޞވ[o>ƛ|~xHR9hou+>jE2c '$(=q83q8IOh.XN.L*h$_X4ۦuF9k1{ Z;A^#^jCQ#%v ut 9GZfيn%B{bu:~ Iy -㵱*lS!.OxFO#!@xs2|?c3= n S`k;%#g(FG-*?koBϓ۫=6$W:,L.49|Eq`$| +:h{q}}~0+*bkSO/iejBx3% աTܧӥQEI̻{_[@fv2d3RKW +F<3?[eI40#:G / +R Ż)%rvsg{: +9e2p H8>YZHqs( ؙQH TW+02dR#רR(׹_T1}'jsB%XeV){G〸9A+ʉ\Vߕglk{F^g~蟴j/u +{Tigt.;xQq$YvOl4*Ҿ&#oGY̤:nS|?X]8K u\; +~EF=V\H]8>LA ﴞ.R]lֵɹ0,\/USnl^۸a`xq c_7T}Ey a$ K *Q;Y +L_bJs{,Sa;ܸxr&>VAk:AkJXng4?_Wpjl~(B9FCKFIQ7޴e1l8K[F4[>rC!.*ؐK2qivl`LC&KHʾdXFz~#B֘p`sh%MDJDMހ3GVN1Kb33ORqIpͿϭCvϯJ &Wܩ TK8l@z$KXA!5:LX.6n5/+!XPN%{q,PY\cxt1DZԦ5 ;_ m6lX`_$['T[2XӘKuhg:M?H4ނ +{EڬM][Uc#7WM`T֗Kh\uᠸc(C:S;Dej-b^1#*!P +L^}~ڰ0}Vx`3\颎c%0!w7WrQ%כϐ=5w"]NHqxLj]$J8%T.Й3 jIv~pY.@?&g;&!C]Zl@pݟ~a|#Q[3trb +FtE[ qm .d2 :6/YQ%H" c7B&DgqA7-ft(x ZTc@ĥR] TJN;2oވQƸµsw]])mIsG?j~kW!GɀxL)kUrħD~,`-:0|e;&$w cp@{$K\ӷ͠Rbma.=Q={QwSZ$n(a%7MlaCA%@rRGޏ<YtEb8äBzj.]Vl\-ӽkNn >IYi|P"M?s:)g~%ME%toaG\F}?kל|ORE2Й̸L~ ~ [A`{|U!_ݢyq 1SyH^-I +l;BS2y@ެғ(Ԋ1y?ݧڡ#,c C^=K7}bgwmFH" +)-.eܴPIW Դ TERMNTk<"mƤ|J~FRj I {oO:yT3RP ;lfGHPXbϭ +8"6vɏ]2<mk%΂yp_;"iqeY4e08.nl/ucеRw,k^:($N,bL,k`sV+#{`Hņr@ڒY_pyå#!~+P}s9&`92{+ 7F֎t(u&@uPSмS1t~_ ȏ>`Ȓbvci[ {&=M}Te[$'{"1wq1O!^꤭m6tlP#cyT7-UIm#>t͠4䐿i&VcUω{3xQ<%ӧ-樀K[`h||P" |6?ۻGC)0-'“q㭨7xRTn=,a]1 ͯx_;+1q}8i +0玂c7W\#'hEz,,}cܢwӖ"&禰86lhcx?2ѩQ>/ɒOV㒬WW;yE?oV0Δ+7<#\{7z5R4H }ѹ\Xgp78:* 'U>G{W4JΫ& Rf6flQJjE~>1^:JD|}юf\G)RPϼO!V,:+_#'"\φ7{Uq\5fda[P#`Rwp?+i=1`X]N/ǹlk0@H) |{F@0jg0~WoX+8A +Q+δV3 bd&C,+%S2 8I8r~tIm.b)(8Jg(bMڥ]]KTVV8^` L21KӻUm ᵟ$LjnZ*j1Zo7Hbx\VF~;G <  k~8m#,a*^ 9"W{up#cO2ӫG7KM6Li۶e.4A 6&إu.Ωfò 0bXd$c͹Gqj }Q<[QNlHgǍ.C#.$T[a]T97r-Vˤh cܽoڜ2v͵ޝo $ܜB J382Fx n} ma) [+AkE}OMu=nj z?&P L="kh% <Syj?@5+z8o6dM0b]!4٘ DcDGSdDcY"A/: ÿ*%4kl}z$W4-5!og~ +JB +)%sVaQ T~C?5o8&|P3B\v7+/e!Bs`R3=ADRZUc~+<fCq(OC9q QCZ)Kpk?,U ?]õb 37jaK5$eYiPטBFu QM8c9pmT٩ʣ4u&,BQ< ,? 7Fj%<b zq"+)b +,Vw([=^x40 ߑ )=OJ4#Ά$%G[2jG-,O DAs::8^uvi*Q~csIp) X'ϲ $5a(ھWK5<(.Cx $IQ*\$0S-U*0[:O+C8>xμ#GQ٦Gw_k_Us];B]oyp~vN-Vjڍà%֞( ;6 9vɬdf tL*D0fC|B 2`k:AN<}64yH%9鱬eeI$iʔӓB8_cƗ?$Cf͙ A^dHTycfs|b/ǟ*x~żĽD3U=&Y)/Jtyȓ=q +.N8QPJ'7Sd3W^ +^`tƥɾlcM7!lq +ҜjyeiW1jgnb)O%'b8~0;Ĝg= Î۶hcJ` 8o |볫%Z ;x/Wr;T2w527d %6o%j'@x6b; ꣈qa<KQ6kf4Dhڒ[>GhmzOK1u?6_d%嵟ܒX#|Awf-gHJbb:.Ѡ"[̜3Qo$ysMxyՅn`RqqO1!ӀR50Uk*H5i>v6i076G4)ħ܎LcLX\Z%n+EC C4gar+ #4v +pg8+$m>7g46j)T+E:QatLyDlA+VfիҨK飜:{6C~) H4ۘ-Bpp;ѹc fWI2:Ù/ <odrhiHy!!麯je[ΤK@ +=cSa>{K17t>nFԩ‹4POo .q%Zp恟уh-;o2ʿ91CKW{ yrݳ{ w%>MCf|0>ջ7Nas۹[Aur6S2Hd9+d"q*3hvbiO4Jfmhg4`υL`שEoNX,$t(3PI82a7QqWr`fQDҬ?}H<;QS͡y<-R-wMq#K*/E(7%ջᬧ᳘b:'kf4 ln] VR#PV)> endobj 2621 0 obj <> endobj 2622 0 obj <> endobj 2623 0 obj <> endobj 2613 0 obj <>stream +HW[o~؇M0,rT+HW_mâEx//K^6 Y3ۆϯ~~7Cw/^m7(a|Է>x9,غߢg(cP=CH=iR&דAX->ȅX_*[sFIz_ +O%$E͌ȷvI&ut6YvFt>lM3b*@)ɔE`J"ĘJ"s*]umR垴u/oSIelij%*ˊ9,VX`QG/ UGR0wf#gq?=%>]p * Jiz(ͅ~H)7\9sL%C1p؏8iǍ\Tq.w."X/,nKvlJ3U܆ADW B1E^=.5Roև~{)AUy\3Npx MD a +z? goٯ~Mqvrخ˧hC9U$ x~,E}C <;" +D"$eP`mjt٢Qǿ2i 1l ".Ytpl&)ty1fDy.HK!(#z8BSNe2]߉ً\[ -sW+n}$=b2+-;y鉪T{?5i"1T F%\%-0CkmRxMP(S]OIZEnWgQ&1?M} ueYmΰ =av<2ӾLoᗧ]{Gj"s3ܳd #e%}Q1=5v5@Қ+3Mth #!a3YooZz#'AI}pV׀ raJ-AI>'ԡgٵ7#^9I޸dLMl[&iq1ǣÆό.r&¡`C1%|~jt +.$:+x~ a9y0gdd;%e5޾ +030A|{+JHH AImD4!d;ӆˉ5ӎs =-[k*GtrYdK6T&0ӟ|k<I4^g;L]a;A2Nz١yMI]`^Ś呅ռ00N0Iu!1[ɗ~ uhq#؎Vqdz9n ##37{$A)A)13}>_\%o*\NH; )?L$%4:OHS!;=y %kL㏌35%i݀auaE¹ fQdE: {/&2ÒkeP#O)aXOP-?}$h#l^(Yn'HД2ߞrԑ<>SϩqW$pHRr9>JCŻ$o Bܦ†-xflVM9!$̈́2IrЍdk endstream endobj 2618 0 obj <>stream +0 H@&= H}g/.@Lv[mJzU+#ojQ Y\ <{q~hh@f!XokAwj{ga_p̩i܃=ر9AHG~pZfމq.{^ey%Rv ,r:z~-iK,E@Ŝ'芉Hή0?rj1B/{rE?cZ h@ 䜂 f&/~jn1Pז:FcCw&Yڐ=_<`y;ۍ?)tF/_ I pnLl1O0֟evk6? ]!qcFT~l?aqFWow{F_f޾-%0^ZkN+}C|@ +Z}+:%H'H9v%\ƫڤwu>+vrkm*\H^GTͧW|Kˠ+9w9**`kY"iXL9א*< ދ&֊8 ˗2+3~Nǵgm#i-JvXT_{*B+>hD>AzX I,3Jz.VwUR6錷a䶙K5+'$3F%cpժƉu_ur &{PFk|(mtc6Ej>SFFkCבZ_1ϪQ]TU`s`7 ѦbNDjj=[6W|mhgYnޫ#vch&;*$Ƹi/~lYK*S@7V/Ի7 +m;|ba[qtQXF,ܩž/<' ܦ͠K=1c!Qk9/h4Ik9sG*A/Oqk-n42[n?祌U?( ):T&9r#y|e82zow ,QM<ɺ(g%yBkㄒf  ;ZU uQ1?kSyNlW/=gU +T.@vI`o1Ԭ@PfDJC,L,Kr-Axޗ/j f5M#՝A N|]!,65OPYnVVe| m?G"p4-/JvO|t_}TTϗO8~f5ܜID#yܡ r׫5EX$0AATSF8J=@C hNlUWZ$T恥@~| S)ٶ{ف=qH8 ddx\U|uuORVWNC.#rUV:8K`ʭiyH3Qsre@@-ŕY4rj +yU}Ŋ :,qɐ W8s;4xEc<4ev4rpgO/? ĺy7+bM\N QvyM#.$L8ˊ+P #'(PkH O.Qb_@pbgc[T ˉwM8*W#̥ha]=COm(4̔o%S~_W/ũuu{~ Gǵ}(Q@h|$P$ubpP4ci?ؐSEh+_>˫^c#0ӣc}D/'i^]%{5MOP3`iK]Qzf$Fo1f/Rdwĉ1W>`O@Ć~j)a ߄Ҵi? [=u!nN5^bdpЇ0reOjZeF (̥>Z .aÄtZQ[է ̶mT( +Ci LIq΍j8)[ aQaS5rWcI"_H }L.VEG4id(O}_L!iX6@8OWdwP5sOrDw+/|,kO2aff:{EyVdӖXGz0}ҐLz:`4f +n!df~kcHFMclLMwwX-Y?^݉i:}Lz)A9Sx|V 8'Q/ȀO#*(L ٽ15w! # #Z M[)pOl^5|)-ͦ\8GYxtɢ +udsbض ͷ9뛢߇H9>>qs#FWe uA]8^zԸ!~q-D:1,/&ӎdyaA/BC$DPi߈n"ZTr+ǔGgK]7*cKmjIƆXwCָ\r/4p_(ĕ!>KI3`4e PْD)*vi=Qh Y3 CZ^,e2Y~,x1 +b +sH9cͺ<=3n%jn3߰5]sUyZf7Ҭg ê -])@_)jI{5N(&݅!_@ +qL0n/GP?,,+h$FuM !/dW$ȲF(՘z*AQES/v:q¸65丣7J!Hl7}+Փ5̅rtJOp<*~놳U]klk`trj:|%ԥ-A9Cuy'XBKh*]zcWg<{&MmI?)6=AΎRvy~hȪC5S]>!k܍}5->uclXV^5(D}9/)ba[#kv-SOg]/'_KdH&w{Y23<8r:toК\|0'E<Ա? }@8HG%P.>°UId4u۱pCBbNG#}[ [L<חߣw(Fײ.HI7Ow*>߯p_2:[͑i|_V۽n[77!+ bAJh77kpvn3%<ۇa&mؙa)`>^;Yx8yx=l4_]j\DBC5) %="W똉Ą_o=KZ-4Ckj)TZ/[G d)<7N U;|BMc8k%_ǘNU$18䔒nj 0Lh@?CcTFvSޥ?QvlqՃgS p%DZP`gH5Aa_~٧7T%wtmZVSCgs]-`X[V ? >+ۍkU/HJPM>g%-6e(-(4 OQVmsJsaoTC۾v]*UҥTzDٻ"W%t^V )+n;ܚy/U#Un^C) rUFͳy sXu/˂PB-KfG7s=.JTe@E?Vs%]$̗ķv*w/e[|4R<2di@GĊ `yۊ{nG\l.헻H(;JEZk&bU?h&`ntXW~EY˳*wao}-o@=9t~'kl-!|<"xXUg~e~wq@̖I-zz8#nkO#.2ZOf:1t+FB' ;a=GAYm(J +JҸgP_ȒxFnW7pK%S-P 7J0Qz M !#T*Y +&xQVwC)wc*gV29F^&6~7Te%/ + rG! sr!뗦Ir!~QHqW2T|3[M&^J#V+/t'찾BV +`[c'j>h\s'O Ł +i,YH|0g" (By4/!5Z[kۣpu["NܛK78_] rқ38awCh@ e&L@fgsslq\絢%G{Su%E]s&{dĄo \b-'kP'p&¾: puĨ?-uؾvH +IdDq&$UB8]5=upӡ GUwt|WFĜl@l9lKTPZe;nF դ' %!|$9)<?H/RwAᘰ(,ak +H;GJ-D;)inMp(Q`0g unZI4H|{'m?S$~Kp7HD=G<m`æ˘= Pǘ̋N,te FdӟjhH7qg#ËF6gs˛\'¾ q ŕSwko$wZeLZ"G㙷|!63)]xom>'$ +-4l^2G!!ǂb>C788ƪ'S8d,N];v9+uـbT "p@\~6tU 8XM8K]&*1Z`bBAZDQGzUb% DF2N޲o<@8ȓ =(.fԢ5P8۵ ;q}}3H)&oE W^V^8@yݻh}f1LZ(W^r*@ (QMV`F-qФbbjFօp5z* +[od)~Mgf!"P% oW-Spg[/uev3' +S_P$ Uey!M~F?3;ԛkMb4Q =jLaLK՝&R\5>֏Bm}Wƒ?el-b; +6ϩO0V0tQ BA [W|G~GƼ<6h=J1nx%~=5-kCKT@FO<|`O;px)%#xF'X`Lb;#(uZù"{;JHwZ Yjt[ЕȌ{Ǩ6Y2 wu2'>z?Iu,s5wy@+>/xcTi +C&B5ns!$y_<Č_yY tJtv1Fbv;O>rW5Փz#GpjqqhuӒ`JA4T0:!_`+`\BAp&tpbD2.[cf+%ٞBL~Ǚͮ.R A'vnlO.jW_o6ӃrI` a~ p +Nt +Uxʯi|Q8(JhejZ%a +nh79p +mfo˪/8sQKOT;l[+3$Qnj*_5KfoǼJcJ*S,a…7ER25GREԎQ%{k\sb<g~)aٛp +UGr}zɉ ?QlUxM~vFhNF_ ZVKc 7 ;fK1aEo#1`RYo j{9^8h0};N:åڛY[MƴUei +)Gu9TY- +VTD#t .~Oeidbm%INx lwƱ' <{E":wFRu*[;89i!ȇ A@=(g kI!ONXV& +#bj򭽋 =z> +3ꉲ1|)٘Ńy|`&!Hːy4P=U4Ӡ{)RJk6ÈR㑮31g].hzоHŏfc@(JiiX[jj׬axA5 x:`ĩ͆T󲉐.bSL=ro#7dԟr3NL3Kn']> F76֜-$љO qe!$+\/8xq+F# ZJ}P6HU : quʱ=HYۈ%eZP0%1&+)![J˛b2!`"N7PX +BLYs%y@D}lfN`i,DTLgr f{ņ{3?f@T>K֤w\;X)fET@>'158 +'5m:|}rf>:qa񛙟e@uAqB^"[V2kgp]c2+\ P5܂o&T(u8JJ_rYVmUMY囚N<g8#x~ th&UZŢ'K( :IAX,nv7b*(g^wlCĵA0P:ycBAgR+PHf~oYblu/G &{0@[EO=5l?|Ll;FCx +=;N_3*ے) gJ5P$܇{rdCJE W]'u|8 =کf{X唶i7AIH49(7Yfu:0],j`̩6 +cʒ^0g Ѷ>e=zNt ̺ ,ŵbmԨG&byip$LR(n\qtKDm#G͖@( v(#1hl@fm2Vn9rOω^W-5 Ft^Ѕ9ϽZTcT(-{ wWZ{_9Z_5*f:7Bt[HI\KN%?bVBbe:ZFb'F*wsSUrO\q'q&7a_k=`W\f$]NخWNؐ6<2V\>kAC%橠u'Ɓ_pY)Ynu%:S,<ǔ]KH{*!"H G=Ž\10ЗUBID"T0HHk];> d)"뇅tT0kZם 5(vGTdø@TFNc%җk\foc{"YwS8;aX:N8v'8Ov|m5~?`L3ŤHڬvnm옌3t)>l~#TH?ۿ )K^]*c-48N]Zθ"i&N ]u앑v@hB]e;MlRX dim0 'g6[Rf|t5pXAtqomf<;B +T1@l.\QQ*Sΰ6Vt%ɡZ d_ll6QJ OjT25&ķ\hzh-m!shXn_MЙ)EfG!"׀̐E1}$3U|+37d4D4SxL7]w9ZPymZ"9ЮxEAbYTʕUG [hgYzDN: :pjёX2K|?E5ן/tTMUȖr!P` %IG?)n)M$s:Zvw,JlA,F|Ȃ^¯ Y|]X;N!ZFA'_ePU\2EV∠FſntXgX:t^9PuȯEOB+>bRHQXqaW}YOotu =Q+'YB\{ޯ&w@>Iz%[V . ]7w,1$Y>_̎ +ѐ N ǯe!nԆ, ^ofF*0^uZC*|vHGQ /Qɼi@@ɰG42hu2'(I6b{#/XY[JõPp=h«byXW!\w'Hh%G0:!.@<[WoCg?B=@ @23%p&t|kOYN5 E*L[$#Lj;}8}h={:ڧ֮~wOZ"'ҼZžj`@7 yBlkOm4.s瞸6VepU:yDLJ1M6:'ZkusUYIx$>8Wѝs{;L$ 8an4깧ٖfsH;^YW~M<`N-VbXG0I|"Z.ۖ}SȄ'8db'KaBށ"Bx爺nYJov;{ˀ.xB퉯*G /\0<"U땑Y{o;B;?Po@[Fï|cq4TG"ZJRFvMp"*A?>B0Rg9WN #xAM aB>j{+CHR E\`Q/U7x[[xF=;z n6`{g@"1v$5PhEf&ծtF-ѼΎw{xI߷8L +>)}%!;0% <4?,Mxq D̤Mz_kaTmkKCL5!2F')XOC['.s"$p_MH*nޥRRA焮^)r3W=W'<]}pI8:)~3qX[CN 3h~x4yCxӦ\i9ii" 9>3#Jt4Bڳ&#tYDNp-O[*]1m+VfKC"a8c}nqݚ2kM80L,v{>DCŸPLŽe}N\J].=Uttl1wR`m˚i׋uSD1i#hLј;&Q"M!ki`7,]:~_#@RVJQ`u>k둈ԒZ)\8=V]SkNSr(#!;_W +@+_.8"*JWEpXʛԇ)IᑀZe&z /ly.Wg'$#̌䃇i1nPvǮ]e] Nz"SeDmt_s&|FU. +Ul-8j5|'~$ )Wi!E_Es-ookH᎟\rx1;\+ :"K aK5mG X*#kec뷬`V3@J^ +O7YYe0зB)o]YC:J ^?a C9%7AY@,{TzՄWth[Q{"#)0{EjWsܻ- (GdO(UL>y`O]2]?нʶ^8KRG^}GM<{ڲ?^@20K7sǛNޛK+VA}$#&qENj)ߨ'㓟xϗͩ+q \z)|.7=_oI~LehQЦ[vJ͂4`ٶuXeV ,2%hдZ>n@:{ηyKyaK&* X+&>6Nk'mig{Ҟtqr2ۍF)ͧ&15q=K>YV/&Ë.K#u)k$'ܷ?\0 J_\c|^<#f1 M-Uzői;XjEY~M+l4#?r!*H; gE ]B_QLڃ{բITM%OՎF6y/ү@hO/:cx4N e[XL08=RJ`vt).};o +CeUq w̝ua* yf})2@/$`˵$5Q^5+|#Xc)$56QAHH4 +8˛{<5M9[opo|T=uTS s0~YKϑANq Ҷe߯.؁,ši?s}Ѣ^VSf=EZ;e6vjD_dTO +ιE +V@02eFHn Rx^ ꤍ ~+O"_%=e8ݹE!I>ph>=yQrj]~8-戺IX=x((iI׼~9/a=qܒhGT)[;-[ggu3~WpY`*T)t*==3gKK+IͰr )h We0G:U/yZk{>䑐ô b?'+XG)L3䁓Aa8?9l2U~4Y.k`QuVۑQm]WE*=VӸ i^ϓ %d:;Qg Ӌi +?8щ> endobj 2615 0 obj <> endobj 2616 0 obj <> endobj 2617 0 obj <> endobj 2606 0 obj <>stream +HWn}G{7n" g8Rp֫O5Vdǒ vW:y%*K +O3>V?=O?:3n /絷\a׊"3zX wOW_WW?\׻%X_o߰fJ;صf'ܬgo뻱]8vLO~s=tk6ŋ^|*g+W|'?{Ç̅(F*Y,=ż?xl8Ys"T=4 {U3M?\Y3UaMC^$Hs<_8}<%,.Nx9 VqCήr$2(B$m>Sh鳙>oi?r);[¨^_1d 754-IIɂ,4!IBzjdYjmsB'dC.EHaN/rfǧ5NYpd m XaMrlmCݍǷ +xP:=ʇSu¸Θ `e9Iͱ:lRi?]E3ﱶr9a)b<UȒtNenH!DeyHDxJfPE_Q%h 6y.+pQiQ Pn#<-lsHֽIˊ +w׾M`j钬< vY9sc%f7CI]#|_<پ .*b ]},PJ qĄ ɀH5_6{$g"&d֢'ulĴ,c}%XK>KCΧ ISO#$@JJan*;sB܆0G7a^aNߧ|as,+l-76no ZC"a{?p|"MX7^ŲqT|{3+7Sn'FqR\c5 qUuhk:A,<aFFoϴ QD+ޠĔGe#!<kB-F^EQ R=iMߜ ߸ZjYhM Cx?m+ 7d,+hǁgWyQOcΊnv`;vl}i`#X*M1w"kCi.!!}4;Ma0!g/ c 뿺CRp~#,E9H Cfyyy2gL}9nM709/oa|Մ++ȕ瓓/ISs 4A'(, $(k.4TXg90>uDZ> ᡂ1q g܄nԀqzƪ +C Dաޟgd;N#K?r`8ASsÙ(t(iJU:[W6w>L*f4R FIs;R^m"\`VLm7ZQ|=iHM{aʎ<^r0 sb*mC̗ÃWK8 8F2 +_V9k6,0ll +WAe)"\g-1r;oeN($F s;w^n wI߇6薍J#?M,vo\Fy`hnжhTl]J(P[#U3H{kzgHp"MrLGi~EI}1 +"6ǰd@rי-McF~}A nd,IPubT^gJ `&wgAKu^>kʠPI d1a>stream +0 H@&Qk H傐MZvoH b1u]uZP}89q|H+<=,ն@õ$ \enB}KJ +K +)_";.ۈpwe=d\Af{t|m$ _&.g4b'~6ft Y>Ea^uU`H )SA  +g]FY5}rvڠQXo[y/@@|$o^[E8!Ut fۡ0_XOZ:\^7Ol?-I uL%bԮmR[S=q;`.oi:]Է"xx+u}rKY%ӵu1 *b/4g 7rd-нVNYn [DOj=yU~ŌD/|Wq][5HH!9jhXق%@ݙ%Հr +̉PX#rhB9ά.$ \Ն\>eﵖnƙ!ebi+'A%OԭV|f%> +: :Bɢ_]v2k=@*vi-boߖAgq(qdo;-(V*ՍO6$DX(G9Rc23QyjEN.$K*9B]?D;1v9x(D5@EKn Ɣ)UEƴABZohK 6Z@jp$"d|b7c r1#.QkM0mb I?,e(h*+o uK}kPC!f4(Kk,4,o!cɖ3n§DMVXqVJ :I^VXVM`6HLQs +rDxHNTPF|L B8Rfo!Z voAi3M.20!D|.aыRu ? e@v t*5cW 13ZaJ/Vl7^YB:u(YxKU|@A^O|ef|\do0lzƭG+M_,$m`FN)uVdO9CbR`ҕ 0)[6&>ڣ\C=@0+E~c*MH7"ݡEmqTevԂ kWQ_j+Mh-ЭQ$&>@izrZy5٪oU Zq( +hb0قjXx]{Tq65Q%=z:D'~t3TyHpNC9խ2;T;sk%goUf\T~L1YW$>{ZHvm‡v4 V$XGr'Byw9Q"DXT$smC5G^:=F)(-Woq.ًr9u6g%H6yanLSF ƅuξ&ipA>\=G71VMh7z09˛ +O>Җ*0kF94#9Wߋn!$H@#E#z G|%G?vJhEa?WοLt&^Bkݳ +fcOFr'KoK,touP(wݚŶxMÔzU85"hߪKYAe훠߹Qh( +is@iR#N5zp/28,6T01l]- }|M#6P,osB:|T$l. y4Q̱u׻WquWk]Woh4-?mC1 jܜgYP 0sZ@o}6vl93"ۧ;\H9~{DejYڠ^;=Q?.(MYK vo_J?Ǔ` gilv"VJֽ?j5.$W;(ye^n\^Cw/3H +Yy6mD!@:>+%o2yى]&o((EDEbmfQ#˵hOQ0՟L9cZl-uZlr#՚7Do0Y: qOUԜ `@z Z3rCJ[-ҁTzp9Y6b_96䤌Ki:/h3o +`!8A^}hp؋9Wt@WKLa5l֣'u|Ylϗ2 'u=Z+29^ݟqhW[kxì 9%'M(8 9@;k +.͎M:a/Sٱ_)"q{O/,țX.TDr|'7P y9z0bL ooޤmlp 돹ۄp|[!)OTX T' N],GL^ᆮ{>mO-)逸N M2gM~^tu%ԅ&9vL̳7{BC %y 6tbҟ~@@oaԤ+#;.>B <"+XtSXK$5͇HS<sS$ppJ v| %#DZSJP-VMةJЭ/hV\M𙐖 E2)MqJͪ>w0KQ1VP:p$MxZ[R$ +l~ƚq7f +kp$U +oE_%l},>c0lHkDoW8~9GgN?tP+91޴aڞnn*d2iqd\A\ z] +|=f鋸њD3߅цH Yi,r0lDCrfCV~ˆ|d,*-v ghkLѿY^d9y``lIKVo5%4/uZΏ}/\6xŝ{#5 z`A/NkfUE JEll[1kË󘩋Pu Ydв,MI \^Y!5XO8~#]6J[ezҡ3LKohM! CWSo^Jj*1S1%m}ixAwuċUo)yuokʭ$dX6xB %/ɽ ȾqG$gV:)n&9l:/PMgwak=:Q٨U5~}ئZ!Z.(*4̃K07SڔӧK)"oh.K@v:y肄ZW:)%^b#'G_=_[FvfhF߬OXjjdrl9Ӈ")f6oi O\,ICP:pζYmpeT?n$ o@ᄟocdzCV)i^ׄ-;#e<0:mB7"[;Y9<~PRw\Y#Qa]eqL;~S%PJ3veW]z_) q+L{ѧo~TKhWvZ'"-/LZ'v݄ u|U&}fkĄh*M5I.B:\D)mNFJ$S?ֳv^i,2(n& /R/pa#nW! |9E@ E<_v>zڑs$0&s[yc^!1hqL~:А +܃ xݬ %v+]3|ԑPy]Zt3I9j|㌥]ZG/[A]Iу)SYs3$_ʕ$ APNf!i;MmS Q*ꠑdLH7R583 +,/W^n Pqs${:!Rn+9XFIi$VfIά^PsKrي:H>>+SJ_XQa*:zr d* tK?E . 2/ߌ0V8S&vPrc{F4B {!~҅.N'? {JЋhLv'Ocw:6jfQ\JN.=κ4ψ^HqՑ@{K QjB9/+5)/P7(_L#_iêEts!iTL$JQΈ{uW\?}&^a;a[%y͹ۚ5 +m|̶QnK ʻ%ӗi2$V!}.b-8v":KTwIK6RIxD[gWU蔋 ‘gUDը udCr̖i_[`4"IϸkDb,(/[pgceeDrE80uI.H +1|bᯁԈL#h2OhhwiJo9"]p {sE@N/Kq ;˂TGsufGM% kYWO ަE$d. #+= +1t(YhY}CBSA7J KcG{x6:ҬGhAm-9ޠ& +& bV28!^2!*Ue(^(r[ Jy +^9U _c$g(oJa>j2v(Rb<Ƌ[OCAW"O;"t̳IMuzOXwt*  gt\&.S!ZvKa0PU!'tb)0Ym5t'[S)['NTMx ;ws1Y}zq-n;,ȷ/A95 +8IMyFZ5`+3- -EfMir(.&R Zbz+Jׄ +˶`s-5Ԥ7~N;*0K/^XwQsԱ5 +c׈f-co GJ5i4P@ 2:کeGՙΏeB0]9pɖmitՑU=󄠈V ֳubqũ. +ꄒc?<5gU7ꎡu\zٸ7*$yWrT̋@H*ʾƓ q/VM%3͚4O \à`?rx^U;qìSeLdҽ}])%v4C;U;rd 鼉j7ד[{F.26,XJ|f㗠lw\,P(^p%߻Ӥ$8$t]~+Gxr95SVˣDx{x=pXi@UxF{ r% 7M$!Y*nԷRws!#Y1(AFᒏZkY.=y__\a'06v7$EUvgۖ<5)X]/gb(blx'K;WIB_Հ\'*iؒ(Ǹ)O!>;?:oXis},vt,KJ( Pe~{I1zT́w`p{%%Y'P=-ȓBL;J-۲)<=m kh?j%)|"Ė +}.l9ZBִ6N[_LGaqÅDmwSdS>gT'U<||2cH0ρf\CȀ:Gpk LCa`OJ}6@HfI, :bѳZn;=mb`&pC9 0Ȩxapw3 TQv{Giݪ$l{ʭKRQb+r8@bH~1 m9RSru0ڕ,wX  9Ib(r3W ,j}dȝK[NEB~;*gfNi]%nŔg TgQ28Zm.YRBZ@tkt;_][bË%ZINT<u]MR)? +c1 P¾hӥ$YteT082ߎ)iNۂl6]A5 +y5#]$Uc0^vgGhOќ#Y$H*c =( +cnj=eQm2udC]Vi:)JׯWE3)餴EOu(!S-{' @Za9E1tq>{zNǦ*=U5O}wɊdX'6#\5fPՄWБ P=1.&sWn?IǙڽi~ ͳ,3zŽH tzmw65 +HNTrau#DFK-,ٛ%U+z3 s{_E`]毡w"S_9-Q꡶%zV*MhNSn-r@10R +0^ZAW9<}v[V|7c7yc{,/ )VZ3}6I7TQ,.l5b%vw8T5<N\h(9SAjڨ:]Z;]e^U*qI4cjXw<.:iF{6bխKWQܒvX,M 7E(mǡ+t&uZ*_Iۤ 9%e bU4[n_<+o9*AW4r ;Qzaϣ<5Kr)L=]jzh:ԕ#e(rM=z@B測3$_fIZ-8~R:8^: U&X W䟛hN}x/\8BR襥r}Gx*J18XEj%#-PIw>.ǭ0:4鶶\tv9?Apr#'>_h}_%bּ3/̝-b.O O_GGk@+<T]c7AsZ + N9 Sa7~ʎ"Pn̻m !{W˸ސ4S.ؘ'1JX&˳>CH$A[C-Gm *q]x… 7.S,A/VPCmIa2_,b˪nW>oŻ; L{QQ!}'8)3j?G&5t*1B\ۈ[:vfiYtir3T)2o&ҬYەxe{ŪsxWBDfcM }^YO޲,qgύ3BCzG<Jԩ{fKbYr#U{PH?"v'yt!ll0Nl۹{2[i}mٔXq(43u#Ҁ)mZ=.l嬳jk"-1 ߃B]lUԩ!L eoeī 8lU V%I(NFP!&iiw\<g>s6˺8|SFt ݠ 8 7Es-Oܤ,GmZo't&wWrږ둌Ce|#-R4H|Or 41z`W睌@fV>)E'K3tБΡ;)co7߂%?R*\%SZ3tuE| +Lҗ"dLfY]&f޷$( {@Ze(L&F0j*>C5"?w2GN*pL淿ofGྏ {nx\r]}.fQ9fx6/Zcq0m7`B68Lya;Z8PA=Ma(|<ſq׏ĿA  +8R"c|ڕ@h[@vɈC|N4_SϨ/=F0ПR[y|r)[=2$ۨșAnL܍yXXiO<FV_k'ƮV+ӖGG#I4e|<2ز7$^.RYnj4zN첐OK#(ER#aO 6nX x;&IΉ|]-q];u$qYWs! d) >5ܔ Q}w#ޗfk3hRf$F>{>QQY6(S!6M||!9 |_kꇞuvA^23 ]Bz/"B`gl~s+pU>C1In4yA ?N-#.dtj>:V'AT'H|JnM,%IHi-&a=ާ.CSHfQ?l$* n(ϖP$F=vPrԬR%龂Me]9w5C]aCcbYs _rmAЛHS:[FȬzbc; 51W2(XѕG0czrJ6&Tu,0Uu +8"i]c\w +X_N8*Nc|,W&{B/#.!J5JWz)_ͷ$߲Ǫ"`K/Y^.IϿ[Ê ꩶ+*wWm*}9 Y0!a d1qB`3g}A6ASN;~,=Aq 4X!y@?h쒲<{錘J/HWjW@Bv*>6ZsWF~&P [4gHrЦ*O [$BZ4Jv˂z_b-{Y62C T!Θ-vҪ[5*Id ʹX]/9duO [> +ǣ書Wn8=5\q[ڀPڗems*d#T +n~c2cYjp"6!tmeDT5(1dp>m"@XCNmks}#kz)m0|`Y^8#?vcV O#=`O3f`~&uLӉE2Kׯ`kDvaGA־Jޫۻ]gT[.UN/+D}5 0p9M+;WݰBSTxom3Gq۬-v +ga3ZM row'3~y5{$rߣ?xᨫG頼1~飑7]fڿe7i|1[W'Ggc>9U/-|.|;5EKҩ}EqIy)w5T1=s@/Ǿ߷;:gR-0O[kC^cdzL:>ćAL;5a3T΀*URPkڪ'MC&DӚ]s*+ϚpV)dyTU~ϖR켪)i$m͘EJ(NH*d&,>)k+9lA@t^p_~G/Qr.vE6HoCDe+QiEH +cY%.;ˢ-)J).%1I*Ը;F +fM+hQk@1{9E\R%*S(M7u,VvXxE 6nNCΖ 4Zvux'X(4: bpbl윰\m1k?$4ɯ-BaT).d*zY7ՍL %$rMS<ҥ{' eīC]я VbAGvVk#gდuY`6?S.V~_ӔQ9+OXbQR:>TD8J4IjUŭځ2aC1靳3Ɏ?3-4[e F.hw2TYHZVSJ- QړM& +)@{> $֎ƝvF_ $TuF-sCǥ9NNoͰ\qǗ0-pv6l~&J4ο:Und$\GXh",jG0eHd&paeczĤsJ<:ŠTuO\vY,\6~>fMLY4sH\Q|r< )c^ 2LӮ~@4yV,}+:DW+ n*P 5hVu cJ  +ldanЙ.nǛQ&2\[ ]`=wMCO(RITNZ0颞GdP6޵ůކ4 :_9~;_{J>%ϣ]0fV2Et>8#NEgo6,uڗ ( 0ߪ#Q(sr *1Yf鋣fAV+8&|")Olx +!`Y`҄7(>NPzMVOAՍ9[ 97sFz,vdMه7-JS_x*gM!lʚmp2ЁAތc3MAƒM$A-N?`B,2'A~)yVB!b h)Zu/~ 1% |TA( +{J/Wr_He8=ڱPDh8S(o.XUe ( ] +UM;Rff@݀wMR(+a"F^#pɠLy7Ϟo(@6}ЗbGqlJ+ +Mm=, H 4-*K?`HtG 뾘jFMBg&DB8ldOf"kf8 0kh>R`o%F B .xhM[1uU|,Ivk K& +sC 4+p`XXzM$ݢ/+/ ^^D-WDœ}~Dܤ:dЊ~|GF!+ s3D-7-4l([J4HV#NK [eQѣ@@( +/NXr' P/Zݮ/o]勓ԏguG+BT/{:. eACJg7->Vi@PЍb.8V9Rglj +$){VB[x$]:QBVs]C4lbgqJH upN5~Ŭ]bL]}hDE-@֧` .2" 姥<田̭ɹ3?h;q [/˕=` f +>Jϥ+ +`CωJ<K]) *t-s,ޘQi=DՋͫ:2hh`V!J8yR8 ѻc~Na{L+2ӈa?m]jjuTg v$m ;J^^QTR)z',.4Jͥ1/7&L殃үSTS!XM\9fNE4FUIh/~HoXv44`x[aQרI3TؼXLޔ.P/"}˄7 J+h Ԣq\R$yt +TG$2mMr2"װ6i23EO+ `9&uSJ @?f#/3MZA*?FBe jg:} ?5 6'zCfSA}  +e -$Vxfb=cB @!EZxa}5>t}O{/3LUOvsUEK.RR(F=kńT߮t&R\А fjqÕyբ3*+Q{8 ok@3 "!`u`&7L= ^ؐ) +`;!cXdio*){F* ##kGbO:%m|%|eii&ڹ1~?d!qkf4ՅqdafZy0,y5GZtԒŭ66Z&'we+;;߁l`ⵈe?v^OU 36&f * `I1Y8GN19x?MzC˸KS/"9-+=zuc..&`<8<m~iH. \^TԶھf幻?,NUֺ z<:Di=V:Ke)@M\n)nB$|2GuDEg K P1lxPXehԊ`Lx)SLMG +Y9w!w8Noy))쮂0Sy9C7ɇ&-)/ج'D=-MɓըUMu~u?]/bɾ;QAM0@GY$pqk "N ^ SsX<'_'50C&Up-/mY%a{ub?1^+E5nMa;ʣz+n8$Zyl==r]ڦLBݛ24B)Țyjy^~)Rjhr ,]xC&P{@`m^?$*3~(rIM1FKunᛟld˕gLkџ"z@@B*qߞ/n(d &=8g +7nbe+@Ds"̠5Uܥ̵Pz$ +?-ʀe=vcYLw4(Y xc鈼`ʜ؀]cҰfqH`\=TBN^XTl=G74` -GzxaCY|YPħ9˜6%6] ?3no)˂?%~WDZ{ YH/H s%6s:$6m5VS]TώZAKtt gdl;:ۿJV|=}qEBb ]ۥewX4X)#<2eY!$~BAޥŰ?^zO9ahIpĉcނίm=5a Vbst &N.qRC&:lOo/IH\&:_p[wV_&j + dlQfNrR7 HNi,qgNQ-u i>0P$=ҲP*2PAnߎQyj]}!9387GcƒئG}4GbpV{iv7w- +ȌC+g58$巁#LO I=Q J‘m{h;@,"Cf`7n\ ֿo#=wjFĖ*I4l:L+ ^nh~jT(7GVn~% 3Mg#S;VI8jioLQ +~]V;#aڗEa̷ m1Z44'{#5'RrKYkF`L̑pI )#[b<68+]c_^=%e:0bȝeA3`&Y |=YBRBs6c#7ɺɺ +@I~IfnRucR\RWUcDX\#hK]\ݗKeܷ30qu%Ust + +<(ΪpAX sf-&PB '5bUdjcCD Q +ݡ:_ g HI@oQ&~/ endstream endobj 2607 0 obj <> endobj 2608 0 obj <> endobj 2609 0 obj <> endobj 2610 0 obj <> endobj 2611 0 obj <> endobj 2600 0 obj <>stream +HWn}W-kj]`N}`<(r(MLr!e[N:+2iƉ+5ջwto7Wn-n6WP&f~aIjF,[( vW?|hVe<~,\* c7>.c[fA q*3a|]$.o&r8L7F!K\|[XE4_(* sC7Ⴟ IЬ~zo/bj3uͨ tm^?䀺f o4ZpHOU|s&عݴDr#5Q1UyVx{p:E*G>еcWjM>$(#zt#%QbG|oKS l[hG<ۿǣу+A:OoM~U +K'V3tےiY#Y-M49>]pJ 8/{N%hK԰=JPU.cUDRCL0EnhM_) +a)_ JkF([b]Ȉv29Pg@8XSkPHl8^bYZ骴D@pUܰxULVRVo֦cd \KMQ&?EAܯy6ܥnGu쏳baBK_)haEb=%B_>yiCH,y#-{9Ocel}S+I.Ѳ1Q6 lm(asdkXJcx&;X=#z@2b.hzPחP w~Ԫ\ĮHjF23#;4łM`ސR&:-ŏGԖyMp)/Z#lnRon!EY[tA_:pv k,8 wE|FkȨh"!YEJOoqP^Jrs g4сLJDRSݸ +Waxfz{N +b_07-ؤ)iWPHb4bD 3s*5 (cD@!㞐"V@5&SfnVU)~?3>u l +<*,6qnvw\ȪRrs9i,, ;|0 :TDC¬)wMqUɟ1A#Bm /ioON{83M=liѴϭ6g,X=h ([2=vfLԃIO`^XuQ262Uv62F4CZBAps)"Xb*$ӯ*W~mG%WXbG/z):}QD[CkWݶۓS\Z-QÎsQ˪a{MĢj Pר\Vg+P$ZD*pc.+6'~2,ߟ|\*Is9 %wX|3kbxm1]mX̑P[$"- ng$!>QfmV旕 /1Iv %@ ,|CޞfƚDݱw~93@Y[x~I5;tsT?Tې.ngCq h45yqZiFehmB%& rHڗHƘ1ɉ9pC%*?(5-(5/^Ag$ļR!@wZ9 endstream endobj 2605 0 obj <>stream +0 M@&U M~l&M=%;ϺִFʐ,H mmWLy.zl*JT8 wf#7bb,llZ0j9KWԾX +p\cs<)LZeZ0,xW+}#<'V zBc~@/&metu-`?f')9{}YUG o[-N2`BvaRDnBFO_&+b# 5F(~G쯡`zG2ˮ)G 9XCO@(K$D(c@(oP.oC5_PkA{>bȄkW," St+ܸCxeLM+_MЏ!i쯷*jy YfY`j1Xto@A,tk4x7Zq^}8Xfm7: x0 ޚ„6 +{,8‡WQUhcж ?|I~UbMSgn6|̒KK͆ªZӿa { +ǭ,|+@j%ge2 _rZRyT8W>?nTc~fy +Mp[BAHpVHIgB4N~N*pɮxC@̗ػ-w/I)xs5ȡs #Ag[13++ĥQ͂TKOZM1,MjK |Rcņ((D#dD>J2!GͶkC7r[z̘Z.9~#@d9̔?1Xx}P +W'`A>AQT Hu;Fpkb6m(@eWv$"2;;`;Y-Qo8ǫ#yW @nVoZ>GQ.E?smӟ"K u&"(k#+'$9 |C0cyF% dkq,@&KTX$|U/@p3]_^+ӹ״+#FFƀuZ!;OMv{ֹ#'&qZI(׬jqmABF0]BlAC=;-.@vuѵp/~AݓA.1͜_: =b|]5TUuB071㬍[urN }gUV;Ja%Vd_ɓmd(fj[AܡRۉ96J u6nѦ %E ~ +5B4mIdOЅ:z6AʹbK H7 Kk'RdrVX7 1⫮ ty@М땟\'^a$d;ZRC:dH-v+Z/s?Zlr/5ٻc\d, ڔYgy {?wu> yR2DW)`wƢ uԴ6p$3Uy0)\^z;tʺoE0kO mCwr>i=e9/.D2>G)6O0=1Y1"n~j -?B|S+\sE#!ֻW5T{`a+ʐXl$p#12iT7Crc36~g..#6[|:qv wdg!Fy-T$\A߽&dst? 2G(ߖޤs' ߇:Kcj U]ey@Rbqt',^B.oh͖ %y +5xsCq,16( R7j@u<·e*|+Մ]D-9r,mUǓBbƦh%)UyͲCx +PczMjh!2 =% ؊}_R +A`|jRJTK,_lXӨriwZN4D{}AWl!!t+S~`;F469_#L`? Mڧ8 ~: +mcb# };HlwZbpNIɩt[\ L"jGU YS3Q;G8X+UR6ݜƸg8ҧnhhpFMjwނDm9<&6&K_SP  Ng3Fp3wg4&̅%p?l;&PGw׎otYa͟-x愈!Iº:̙>_y#_vI$3iⅫ2MkumX08 4wҫ8vkEw Nz3S:axu0B hS"_%x+7\V*̅DL&OYɭ }1㞣wqH AX| Z8Rxe2̻B~%+ІJT%Х[dY2R_o%O[E`ֳW^D>ꉪسۛ寴ojI^,wU.|6̖.@OvAq;[0qWB@pd#3uޜǣhK<)X/ۘSD^ړH.H-s =`3Og(}wPMn9Ls^)uo&1I'J˩|{rN*j[\^e Bz_AFgēJ|c_f"c^Y.uv }49a^Y%BiJiS.+DT\ FR'14w5W 8Wc!c)۞(Wd0O m[dTض vQՕoꊴz#7M5DDd* ԰[c}Yܺ La䮜b?܌۶Gwh^JU +$OL=XuGd\`(۳[`Fkb#0c72|mljդF,)rq/ȅr~OMO+@>#?b}J ^gr #JzMX{` +9X |D2:| 7g*O” |E;[rcv w2 M˩7A3x r/-AK}҃O]@Rֶ}X\)"oƜ)-_;0V-gV 7ꪯ.z_wZiV|۳ s "QH8Y"MK-{Le (kFg)0sVUvH ,vIcw,#]Xgocpb1I3)FitL +xH| X?g?&دoZHȓDcZ);c3;O50\Yq 1; +eȁqS|zRu $,N&J +{nz\V!#ŋk(xk{JК~Hgq@ rRuQ (J4?b>XM$$v֢ID7§ +WD gF2=vJo@NW6$T.WgG %|kVb9S6ctf!2 警:C,޶Es'l:ZGI_(b>SSX(~ֺɔF oO\y.>-7gqCH4ׂQdf,ֿW YH.KrX=dh 3OJ4"_Orh`Ggյ^p|6Rm;b*f +"wOO(妶E̱W +r}.vFD:Oi ΅VRzy@= +J2jQS~ ե p|9I)M(\vrBf['ȒA.vF,q0N0 $}Іw}E=1W+8^pK:ZJwDg͆!0FsYUZ&1ܣ \DZWEqWݼ$RhNzdY"j#K;FߕMDj]P.2 +/.;M:n<|ۥ2ծ%Ha4Ώ* \ +@ sE-`+j1rЕ^{tꀭ9,: gk3̋\!mUmҜ2dܸ/j(N;+D+%1bP}ZՀU IH`Yk$0/zcJ1KGgd_*%W1LM`X ty,./"LH2)~4d[=,='Sd4\הÕ3p6F9!! /wE_/=C(T рd +d$8/yQ3c=N*oHՓGʻ_ǿ9Z~ƭ +|\KL]*>F# +6Ɓ ~.|Ak\iCQͰ"rD51M'&1̋F6%r  P^Qҧ $;\1?\ ]"=4$۷GFi+:s H]oco*VUErm95N20cYPEC@}1vQWb 'mװrBsн 4fXexA*izV&N(>0/r)ZvKougUx`inÊ`TR?P:tD:T^GN<gd.=`wyyx3R+s'!1r&)5"~ebPCcG?2C@fJ_ EMRБl?z-<̔lX;8ŤhQs9LNp)<uLO=)˃۶!>) + <)ҏb; ӌ~u%`;c7܉{ MP}NV,,GtY60[:c蹖݄b5ZtϚ@c̃%$+1h/@P'oO缍-!Q%@ j:vpkHp!4i5W/=j' NEU,n)'ޫChEI $GA7 Qه`q.[;g2Y#.U \;Z6`s+dR~)yz^o`+4g[?͂}a%;mK[]:/y}YJ(a(+ֱ~ c~+RmǠR"4|hNim]}͓cBk 0†j{s7w@, +? AZG$FV9ql$TR~!)inrqKU#ӗV *4 pSHMQTah͂ vf7LE5QZ֭D%MDU[]Y6P6U"Tߌ&Cp9:ƻEpQ{v^W¥H?PlgF?'wۭنiw+!fkz g p=1l@<^uLuE8R@d K2Cە+-QEԎ1fS xǸ +-Ly!WvvgV^~̼%~y@HϤƤ aZNZ1=i\4Fo|*sNl:xg`:1?#5 +臨"s~M{-"j ̝:er;s*C9Bkf bFވؾӨc/ rGc:|%k߱H@݋Iaa@?8m]a0eFD?9_T¥[{5L:*rɲCY- `~3VBhⵉf1; g"_1:(3+_i&X?;ޒJ)P^{&Q9_6.F륞q%(pXf‹ڌj*]>C}9e,>LH|fJfF4}4[4R~(Cqje4+vxs]8jlcښ]sc*7xno,#INAGX$Y4Exɰ;hO%%p w^P ۮP #)ЈKG"7'? 3I7Q=Frj!l!,A&}a`/,7!eY<ݼ_۵Ƒ'MoYeh'eM&KcG[r0ӣ*K,! b0),x02v[p;X cs1؁3-Eـkg`Ē,~Ue~3X[.E[sZթM"&|7xБxVQ>ޭ^a1=uȯ JB5f . +uՓ֠=`hX%c]q/)ZEk+$4UPF]t'D;0fU$VV[F%:b<+Q}T!\}~O63lиFP3~D/GIɇjO[xw|Ti͘Ԣʺu J g?/L +מ 6 F&\35,ť@@GAhuQ߃"\:_3ۦ"n)s2aU<Λ$~Nn)J^{l ?5|NFX5-(گζXj3OV̦8߂n,A,TzJ|c[阧c}CB/ {^++'tT+ Ti1FS1bX5Ŋc\r{4*FFLy}ao!<0%BڵkRsT?>V7N{_ cWuv*鹤jdewKE/#r1*,d :KWctMXP:G^y-{d WwCdxSu+_U9`=1"Yscas ]LeF 9wS2A8!֖=& Gc1bp0sbKEҤvv|1 s ig4ԨuDŽyj\A5 \x:L ]Qneoői:xzLIqD+IFǴ2ZV?a+م|u׈a%[xR [r`y%A|Rf#.Ń*?VV?!Weo g/DŞY^pe >E8Ր{51=9$&&9ކ*T5 _ j6^'?ҤK3Wg7"L݂R 0ġ:*=6$m?K,_F/6PWu9(0-'Ezz#Yc/ +Uri -3&)\-cּɈ@ūHdCIw7vlpHHl6DL_G㍨fK?lf|uQ}_!6TBFo[ H%B +Z|WYړLt&QZΕg un"CH==zLi<2a"ҌHDKd)/q(QJNtgcKlPpؒ*= d[~FȥtzG1)uśPM(b3|JniHP]$ұ,NЬ*+)IͯW&z倃dri +^W&G[._1Wh4M'ďk?>;R9n.?N']T +fZAϡFnix ز|6ۛl_]`[UKBd>D`L(|*_]jS-r_ k+#- +_ f!:c|[@GڽV 0bH,dW$fo4IuM\"ԥ|[R`@0wru.nާs5k ?dd}jDxJ2,בbq \Mz U0?Fw씛#5'ƵtNgUfDYgv%ŊqPk8X.T]\QG>NzT^2]]bV2&I񥥘KۊJS47&6ç2*kӵSnc~!@F  .jh|ٜdC"ьˍ(i +|ݪMt ?T,"q@Yǖ @^iprou2&֚_lDnEk,YR]wJfnBHw{'Q5J.EL;"۟[dlꬎXl_fUO9N*y6\Jڵs=df.[I%i>] KӀAYܰ):f@w3p4<:iv; K ؂l4R ng) 4oE x1w_WLKJ6)5{vb=|bR@ڞh0뗂2OE fV3 '" EsԄOӾYع7&/VbFo{PkIz8/ Bj5,o]\F{@J'G TbA93n7|=3IGhF.٬rɝE.@ &2ۜewG8V(Y!+tUO,:cRdvHW%w"%uqzXb!;n) +<; Fmqh++3D} U.eNjoDb+VXZ8k#"I}ĨLldfjpcܬ-2eǓuhC6ghֳ|&("cYǖatnO~j$4OرZ.e9&\˙ftvA6 ]Փ<f ݃oh]6f2@\5(rUB9/,=ؕ? ~Q$ 5~(v8EW^%_ ވߓH+ +d͜cPéM@([= 2%ă,*74s8L鞬!32*V{pQiydͿک=i7n=]D|0ogV&Is+K@ιŮs0.͡B +4I=B;baDKIӈ[iJ^'rG4uR˕ewyǩ-1-Sz}ORq:OIIv0he2b Ԛ!\Am"VĐ:;͟ *~bV(wy` L}X"FK{,e?mV5v')O1VG#kCLw(?3fȲ&[w@ [Ev%$h5iԴ{Hq *:=fXH9IT\Yh9b19/VCт4,ݸd4D_kt1P +WdSFvp"]>4:ͷ@,n^{ȕmjY:|Adو2 +cXVA"TYDd$.JXR_6כ'a!IzeX@;$yNg=CM[z{$yA5w9 W|={Nx1ްTj(8;f p tQ$_}@js51Q@>:l]/[r_Szr~{2 u=(~An2Bib KV Y{C 9ړ렶v9~ \T3Z_Ήv=Ys|MA5읍$U=F'* +ZNSh.D鑌= آZM`%IՁü՚٬D hn_!Ao BQ1-QJ\Ae_7Z/ϩ9u9ƈҖP/zLﰚEve+A=l_E6sWs1ʜ)Yp0X8{{H3]0]][.J#o#Бȶ"1soj{(Cut  ~BZg=0-W-! >qcD>dg(\Ȯ6psW$<*Z48"GC^vqтUJ8zyJEKgԱ.ioOXdÔ\.~$Z0PP5t/ZBcO+ F2FjoUl3Y׉6-ɢR(x $E]x#os.fkt¯B6檧E'KkD4h=4 u-B@{ڹG?Shq) 6A=c閼 \vf/K&Q8sa`҂p繐a%ϣ׺z+0఺oawqdzQwT`8U۞͡iaM\9-ڋt2!>"Bb +M%=A=JԘrzD;Y +^QE}#~Pm%ܜ ~& +uqY+XaFQJh*Qv)u#K`!y +i 8PfǠmo2Y]uZ, +yY6Tiix4n7ͮRo]˙ThjMuĸQ_F6Q4DIlU,@*X 0*!ʡm| +2;LC{"jJ<:&{+Y)k~"x?"@paudofD֑jF~ʓ0,f)Rbvo_ު~\ẳ4 ]"*)"Y1 V/<.p7X-H "}0WdJ,0O@/Pv M|}F>Pbz fI+ZIOmɔ\#=ŒUR l'N +s6Y|2{xaؿǑ8&e &WB ǭ&AM0DHgz/.;.yql`XhSn:96ȡtA}20Y`8{o' 1IfB6qkj3<(ceXFքJ[xRh$e:J8BUB]E'x?B@n=^dz)_Ɩ4k)Zznmv +mV]waʕLKoge |кړ\lRzx+0|bZLrrgQ 7=8NAE_'"I[Ն1$=gw ͲKQ~Iev-~`I/f@n `2pN1G b4bȆwgiB^fkgi[PD+f?=г:/cMJP3ߗa҅>!3fy2f&bo lj#΂'/.|ڍn2ں.ZIU"F/Gܡs).ySTnRԬvyXRUK(:tHj.}[BWq(@{=%e,epOJ.^?42ucGwCCc 45||=>fyMvTOOyZ\AMzyg۫{2j;ԻrK,dNuh|naD0HLOdk/̿N6?Qngϥx(H& ].t`Y+^6AHFX" X٘>|]G^ sW +>ϿMkqS |̎W|9Vʲ'+#`7L6TMrlfo5KiqGrrs:Я$#I۵?r*Ե ANޏo!v]Xn> U?YdB@D4=5=݋eFb:s.F2FhI]1vs[W#r߯MϜF *u"p@{5G 3XScZzg VP==b"xL9F^i03IxfE "]["oiQ (h_wei?&5TM3U#tƯvJ 0 *|9̛˦x~JnM.¡-iU[,78F)ʋ0̕p2}Wmg6On]a=VI tW#ѶBdnIhT]C<qn-Ui*( Ӑ^dၟ+u{5*,zi:;Øj"=^X ֿ̛A(hWPD/\T2_O I'}rAd,pDğm|BB䉑1Xc(a1gps6JV:Ԏd!TmeutqϗsMk$E5A2EU]E&2C4ܿǓ'ŏIy8Kiyv֙Gkغ_Џ+ٯ/ !4 +Nyb@%Ke2d -DqEwo3IuzEv|ɳ8O;Y8 .pD+k̒m!;_gYa?}W*ӑ endstream endobj 2601 0 obj <> endobj 2602 0 obj <> endobj 2603 0 obj <> endobj 2604 0 obj <> endobj 2594 0 obj <>stream +HWYoH~$}̌`g^,(eqW=d~' $]]W_}բBa$ QŇO;4n/~l@Bͻ /B|9|]6mՇc/Se^ |usAۓWdxb +'|xbxgmH% ͺ7cViOOϘqD*S>)C~)i kC5;<~o~ w~fy4bxFB8>: F +$!+MrC1qA%}ЋX&o WL1]8@ m:xm!"1kf|jp*kV0df~}k- +0+)suԋyyrSZpZ[]m34LI7SSW2tz3"|!mƾ +`tf0He.s!%Է-!ӾP9"ucn$e7݋XR׹PWuSDq4=.( +CI}jnPCVdɑ؉|w׵`huLHgAƢтx(Vf)ؗ8ٿ.1 r= .8.;S)#&=&% +h";Re↔4\6]{L LReǯD*16Li0Ү'o芪x^<Cmh_A&VqWkQL< P`?B8ߛ>C%pM9qPۢ +cWZ"xeT +grv + +tPelP!^%n"@Rd#)Y+ +U1A*ҷnIL 50Sfiwe؎i+"u2-9(]MK*l)_ce݇!=ǡD8bQdro?Qi9uO(pZ"YU =w7jn}_=SOǧ X/7eV1;4=~vYK2'C%)\_& nɩ迢! Oqjy:`^IM%d[v>o)쎙Y6MJ N,bŔ6#_RVbTovgJ~ZkۚON%]7b֘E/^(r:z=+֐0_”NIV4 a k4yOSo(  DH0f&&%̴q?̞h"V~=px рԱ -@nI l ToiqyYGϞ C5dnq$DċTrI8$ 9vG5b^S6˭fy>?C=X7YNNl= IvPOKM p2[wYb +0O9 r*d;r@ XG/T_eB5<ֳJ@CdduHi +4lh! 7F8 zԇL0ǖ?3VkSux]|*lZf (.>B~}n9ofW࡝dR0gv| AZeنIVF`M=lLZ$vV"tQxۧPy;esZlUrE#=˷\R) =m=q,t\4_MlCY t "8:{Ff$ :ӛޏA; WR*VSFd,YfgxR`%#3nᥩI(͞[Z<$R3@D]"]#]û6tb߬@;7t7I\9xPN8LA@YDTlP2NJS/7gUYI·J<]I#3œFX"^.Khhf ~CHv<)O<N%&Q/3Ef,Lr/Udy&K( -';deFetzČʡGFm'#nY5R3{1D[Pes (8sƒ)J&xP:LCsؔz-,-;Vb85QVuBҧTTtumBF2JpH\[ak?2Vt#6 0?ngV +ATQHmvq1oօ4<|jm"@KpɩjAP4@IMTQN}+G'=3;sd!5OKCDq(P L.j-~M, j$2Dd3N:VbV8 (}[)Iu3*[WWժ ;9zl_Kw"7ðAu@8T" (y~a}dka5M"u>/"+(T۽*6k۵ϟnaoj.a) +}3N(<1X/X}N܃ tŅ  Lj:63ɳl xb@Lmb@pyj .o45C#d {~ () Ki%+\=>{Sk4ր{/ rl-@Rnńdž wg4Ϧ+5i@ɕF.6žj7-m_<'G@ZR J^4p',*ئvsO>,' XYj*|XB_@*CW +p4$Uh>stream +0 @@&jH @~4,(;S:HgE³ma:AM[d:AyRd6DGОfzG.f,X$SaV5r +y6:8rܫ#)ЃZƆ +6{O?9}" 8E:&ziHED`[R 2t#97li,L%6OũiWb⾂0S])SV x٩^cU* dK(ӣq$KwՖ~<$@8f!a\wbZ0 sHwg]6U5! +@_$Bs5puO=*YOoށy\nAu9B uO_S4}_nYfc8m:'YB#'}JQ n5 + \Ǩ*$SIɲ)v\]W2=H2NM G!'U+V.LU ՟"E!E8v~M1'\l,_MT s%MLsq;6oX15Yȼ5EV~=9N; ҀS E3T&f7la"ex#Bхl ]"ݓo\SEJ?v+-1+*NB) |Q)S1U_]>x {ll$@*.<8M8/xjGϐq`*gҝi22*>!F +La85kka9"g,J\<!58o)PΟ +QRӯ58EgnfP<%97}l(]b;N/.iǥKS@YR0D_RbNR*D4X +9"_zJpd׌D9v#u)~rkxeыvQulXYI]|\w<ב*yQc\~V(\؆_Zu<¥]s7pys2(%Uoͽs|4.'J:!Bv 41 Y/tmWs'} O'舛w=/kU~ᗀu1Fڕ['eOO PBE"IN5e.y٣C[MAsld}<ȥ06FjM5  7fPW'd/3LQ:Jz ݈bZM7]G_X3+lppo{&ccp28['\ +k?anJSd۟;Bc@]P'keopk(Kt׌aS,khfemG\n\uy'-'[n^Sa9KlL?+O bQSs&z:g5;ـV|N,֎I;Ahǭ"Fu#숑+p]r栚wWL1+Ez= k˪ +\'^xN6'}|#<<ţ+!o 7aS:H~,Kx__u1Y T ˲5l0V{LP>2(c +2nDj/ztK~Rh}vŃdxtqth} +>/\q 7(YmtfUyK;V jgDTV֙@(CC)%zde)}vb-u[rśH$Z\n!g}w {MkCV&@e܌;mJ^5KLa߷ (ԚyYC]-O_*{@OehBssng{л"L1j?#ϗ,^Bkq*/>OQ%6`naGyjFSN Q1]l;-u4T{9tctf{rQ,-9@ xEl}{92:1)yU'KN +"/ +LQb 5.8Šv m0WzH/eL< @ LsH&}.wg8Ґ['l:>,@1?M{/$fg8k?DI&'C%GCa gO͍օRIE-bfOuc{# p:zϽ5FZjGpx!4>lryhe&C@idS寭{3}QBn:)V˔j+ < B%K w DW޲Pk,}gdNA*XɁsӥ̡?izH.@Rqf SR9`Y䣐k5̱kЁ.'Z%]O6swWr(7CĶWla߀tI 热虧czTqSid?5Ğ4:Sщg/)DܶMqm/91KBl}2" 3㇞ J#Qp;}f^ `.,vy+ s}$eTO俩QL8b}I%)%U>FI)6_62A1[5`kghBxY^ڡ|J΄9ח Ȇ^-/.03uo@☖$ +#tR'βkFr>,I.ž4%1fZ(?nl^Zu7߰m7F$,O6ثETqXf>E( {f@Ɲx b.?o񤫶- z{٩`ߩ[Vx@}1#+T 16#fSZE+po 6oގUc/s cvPn!&Q[!w1..VrR%Ŷ4^ɁIĻ +ux:m(QV͡,(JJ +.b0Fe_鯁]!1FVF(|MA:崪Ki(F& =[ן.;TÚt +P@E0sLxkG".i ,G9Ɓ%9Gxx=iQ@J +\)mJr-޳|JbZdNCR[` %$eǷLw6"IScI/uy1uɱ̥1нvy4@#@XM3/<&$T,OH QhriNρԥįrDL{! ~5vۘGKxʛ`ehoLH V +lTR8+o?r'BpנR&A͝βOnmr ANݝ'MVu+C^v4F(DS\LiX_xg.ajj {evttL%L"R%~j0Wh[-O_ ;K[ kt›@nK'B{1 ozvaȦU)JѰ]=rGWiv(v7\[#v鬈ҾSf \yl1%hXxs2Q vzL7_b+NMTKIYKr8iC Pҥ<_* }j}z(CuF6Oۤ,5u[[DҾ5wq"DK"O_2v!!r#(P-9`ߵz+%BRVeBUZkzb4墹w6jfWX_2n l4 brp6o( 8uVVn,e!0ڍ8~i#cmanoi@ 4M=b,Ҕ :sFnh6t酬 O&PF9(+p S'@\"\>NHjpBF${šd]* ̪xx/"g\l:]K>dhD=UG`lƕW7.] Lv&E*?o]*"((ue!a߇f@ Eڇ j9-z1h]8< |F-ݛ:\Uupt(Ok^dy/:2Tl)-qzNY&d/dCUa=l_GweX+NrsXٚ+m%PNXio0CH*DM+.^_M0H5B,[Wmd;^5]6}6?'I6Y^ׁ.m%gRQqB(i@N{  +Zۘ@GhiXK7EoLۃlMJ 7oYzK}Ullrh6O~ɦϽbY[Tou1WHT"[xVl^nV->EYKV*%}qԐuEݏBvEG9WKq]@]  { 1Q/PH~cɽ*Z2PϹnRo#É=ɆZ[sV٧Epp(E(~ \(Ze5Psv~yMAmjPʛ%%KvA .tHAػ|K\_z6 tlHyv+nF.n*Йs-ѬuҝɩQ|Mk%aD}2sz6WP,XqMDR+Q?H2O{bؐZ%Wβŝ^|d)cWH1&^㋲Ԕ]!.DYbNqe֡/:I`jgp;~ľL8B14(I@Un_'%Ҭnp̊[gOt 6m2G&]K:XY^nȾ:&&stg͟ ˘dTu|z`aPh) K3.a̕XNuRb9BY9ۛAyeJwГ $u]. {gIwkpT_]?gѩU~)li.h5s_˺gG7)S fzD +&S[E+VY+dg +ѓh"x/)TN lh;-76Ciד*2Bд߫ΞqZx"FZED+?W4v]rz 0h"j >G]8`> +7"˧nQW_0dm,oo%3?}h} +BPAxaj(Z$( rHpA!v.nhƯh)v[hi߹.ј~#Ag4Fx 1OM_*fTg&*pN&?l:_d9m +A$b;&l|ig1 GSOC" s6&jl+' ΅[.Om56X&d6ۘ"> m(Jӗ[kAxjB67gTM^?hۿ1[=,((szVּgY4酔EXaz!&4<(:\]>jM(Z$z"IMӘm:~t۶KIh}BLV\.yOU bȌWH;2W\eW+0Mp;_jOJ` 8s aBz$nq8H6fE~PvU{_wFG O"5ə/ԕ?V -eIdrtC:i_O=՞BmDHA=h882/`tO|%ɐ^U9*HlLxK}j^m3^h;I9  #лa& `4pC[@ +85[]^A$QKz%#fĦM7h*IKS[Y%b9]uYk;w((׉Yr&p+N,zމLɺrunc U:\G'oOZq+F< +lBP%!3~>n3KPiCG౟{ ҖV3Y)Hj=sh,+pýkkZ0JL[}\t1z-1#L g*J83c8{bAM4D:FV6H"fƠ;Ýܝ5B&_'n;(+|vi5D8`<ڴFn4j%nfQnGG#xB/PKF kv.GDO!GD?h71i <.NH M; S~ 4Q\ &_'S +Y?ߢDflj|k]|TZz]İbeXvIwmw_9n2~@zFA:'n3}aeۣ㾋:CF`߶>;t[PXRH y +cχT':(OtJ֣*kUWi՚lZ헪z\ۨ6ʦb-o,Ͳy'^jc%LFM#_(qxcV _$H!gNԙJ51SՋNk$hge1E<6.+ 7, FPQ:}wZюT6ǹE]Ix꘱ Qoxӳ'15_hƻ>9r_M]{wG2[ p<9v3Yy^U9e7]ڱ3?Mpv. x4 д2۳2)]i{TAtB_byldFydJ1e-l悅x\S.\cSG]~Tx6Ggly AވtsGXZ[=2?2l+zY HȚЮg(FVi ?o5sy`nh  ԤuNфwi66Pr%[ㄗvIǯae{.ۮ|hȺO[BҷzF~T!ufbgKfgHs<˱`w/Kku5kh%ʌizmJp9ޔbO7ށzx$L*8gG`XM\rD!ft5>aTQ(L ig1vBlS,bf +%);< 9?85MkJᴖdV/qZ~0!#E}]Jt #m-5.».m0;BҌSP'RUոOTB>b64`&fɦ-w\dh\:2{Nnf1ς')|j}ZGX9̅Bgc# + y*A0ICI#ߺ? 7Ğ1;ND(1pkWl*Qm3-}Q;)ɓ"< +qpuw +KQCܲ00uR>4 ^.ԽqZ^ypF@mJVEV?n[oT Z + hw Q6gqWQL}Ѹ?v)[h9_zzy׸cZ[G@h<~8odnt0Ω?vZxkNDĉ" +:̣?_l H*WD>Um{Tx(Эr}qI R;~ofs5>, :aL q{t5x +kD|*5 E׭(2,,//n6֩t +^ywi Iǚ#TdRߔl(ݶ1HGQO^' Bc XXW>ᡶRAH|#qs Fx䩣GJi_89eG3 -eDRLrWp|așx$g~]0hHPwEOsn>62Ok<(NNJ$s`T /1L<=E})8ׂЫ@>z?Sx[‹?P_6lq7,uy5Z^|W~ϭEEOX"CYr+J3/[)!.QeeeeE[[߅$;bl.D^,pyx$TkԐhՄfr" +lYf tf9@S,юvϮLyUu/B 1܀Iqd1`tDi4"R?m3"{`G1!?n*WlGR* q4rpj|Î0L07-;8DW9FGį$Iy'@?Z8] ;pK3*|Ļ`yْsRuV^I[ɼhՑѨ%b#dd[jt晅@r!ƪv}.iMx6 8P8yj +;CW% aebzedD2lLRx*7)Y YRc-'Nc:t)w(̹YEyޚبc]pqFyDfZYc.(w>3[ 8_ϬoS16ֈ}h$#h6kn7ED%s0kge)?aF֞ @ +} 0.Fn`+ܼ!oB^h;;6tEv '⩱SR7|hLx^aoٷ<9 |~1^ik&lb欭;s/ iV0qJ*dM3%2lԵ?ے"5'/.%*$/ioRgUOq&ǣ-蕕<7DwAa c +.%' 9Eo?"ʾ`$t ׍x7HEcfy̶$bU \'6WNXlZjT\)8r5r+ +3),"ۈ!86,`yF` ,ye4R,{sd vbr ^9ɭr3[z7xRbJSLmM01g=z". /1w0*Kyb{tF+JY VyH-w!(GeH_'Q VZsz>KȱPV]R H8^Y@4#MɲQ qݪS d ։~V)zwjܟ'Ȁ -Y<gx/t3K;aQ'$5,*O]h1Ҏ'ܕo`(6y}2rY)bQF1ifm w%`lHm@I%(}yﳳ6">ʨ#vޮqH S(h =@S17 ;@7;=RVyUjQ]ZU& # ']S8.*͜bY8ih\v2*j/Ϊ}_w┚9J%O_oFȩr's飤$b3!dd7ƾRbTPGOYkmFP@o+4Kmc48na$WU>7z੽ *_]{uM^\LŖˋX(|dr{3vV [pYgHe0:)?~Ma[`rM {/j&#h"L9[gZ}.X<{)t`'#vSYӺGr?$dߌN m$\hrזjrܝGߟD㠽p" buјNiT5\?/%.P.4dF}4f&7gMMfmCޫ؆*uY +SߧKh+X;+R$uY*s+:g(ʆ wcH>U 쨨략g@nzJ(2~QfqSP&8Լ\Xp!Ĵ߭M/*يȹ=H8ٱ z撗e#URzk3u1RG@iTIμP]6pbR`w>XƳ(¿J#.QeqtuZC/hRC2rH9ΈHOO1?3 + Zwؒ>~;AAisJ^dԏo]դ݆d00_%+ʾHʱ~q/ea{m0FjfrCX!đ&dI!dim.;* ` Ҷob4cec6DJ_ H 0@%ٹbʹOZ%*uX#kiAyUǗ_bs~?p&_Th6ӎZyU˜bo=u!nYƗe휤bJ"#bUlZEadIUYEԵ' P;yks P#xrD=6Im˘ҡ:G+>|G: 6@ol6D,ڠo`S/I7A=sBOwXK񃾴bƥFEG\vR8^Qf(hc!Z)_C<7i90T )iU!B\ԍ_,jϏ,]qyhhٓtCbk!MzUwbj9NDRaABi t=_͝uͬ4e~VPF`+ᖙwHr>s5cSF f_LDB TiFmʺy +PfEu_W A--wm*@KeBx-dتbH:ڿxnER)|=CZ\BO.2nA#c?֡7[:S@9 +TRiay b29b +)B'`*U"eZ$Vد( 5`dELҠ."em۲55% gGg#΀dzp] O`lGM͚ @>e_$~x~")ڃʙ+L;p-aތL =\# ژ@T-:uK$J^9Gsw8E!UWt3>t |+,B!MƴewܞM.:e~ծ{Q"ˆw) *_sz[VXbe)8朠8p a j(4izKbБ@,k\fb]9݌{m $]AS<⇻#vuHu^PdK:>JꠗK8O %?x+3VUg+:aPFc + [UIAR)vn&71*78٩z|V^`=+֖Tz~ F'*@Q80Mp}(-0V% C+4*u01T@tEԫ=5Bʖvk9m[v/ M\.Uda%SYrb, .ḛR:28[0iE"G쌫,Ap:NPo,n/%&g990?G*<(2𬓕 5@i_xF!w#݆h\S+Brd-KWvB/:D>';<7(kFց%C]K&slh4n6.|Nr;!iYmѤfkÍ0fMB+~Ӄ^STGWVQCׅMmsA}G2!G9syPr<(UK=.opj*-."%C1"׃HkvA?$bpie1")09eGG#Yh I+Glzr`oU7FiO7vEiz)M2ϴm݂2F QSg2\D#ڈX0Z|͐/"E + +9dž[*j5q]LHޭCy*s2TQ ¤8 s.ճwJgz8 L}yvW".ޣ"|; #ͺP)źj*Fؙ W }w3eR3\E2gD)˹`] Q][wKQdEΛy`7^$Q԰ߗbܺ4ߑ0J{}P_B +mm(ΙB%ק,ʎoҜŞ"H8!2CdxjF:Q rJ3cklԕ0X2ṙd ؠ +GgN)Ei Ʊ}ik3`V)IuLYl!Xb_dO,;S Z/܋ Z~Fk~u`g0'S{Cޖ W\)VJTw-HB\,O,ku5O(WTa/4a^R 1A)3y^ +B v OU@#4R4ҫ0V|e쌻yDo ^-*+V5暱zXQ{jǝ2WgpBRKxSK#!o- +j,m0ً&ꧥsGC'٣PsY=I%*R$Wo8:> #Cs)'K>QH4[×gB)EY̙P՛z@YbD2 +.l02qz3GcS*ف}ܠJ 9|e[DO*5v~['e@84I₦d̳Oϑט~~85%Sv\[텚-I0`YVX2_E|%vʜ@Y}F2] +kV|"V@#8Dd(X%Sh`8uŒ5 ņTW/v[\eMcBm00]ě~s}J*u̯g;bB.jr4 M9JH^(q4j'jBOɩ +~@i~`9sIl#;F@9Cl l OmV8}!"vםHx'|uid,;q \В7;=qK"F&?Hzo= f'BW-CdsFbSy>~(6@C*1gFeu_fϤY|߫#I~K~ .<W T{E{ojqDMS2{pX;16]x _AaGEB fQbU9j)H t-cяS F]u2`KxMI̓N +*|Hcw7J32ߑ.lA\!$Q_o7qM  ؅ŽiJӐ6!V-*T3|g(QMF5-m;+`FPTӱ>q%2$ ++\XgWlW&Nt,,p)4#'T?x> pl_wyN64f.TU>]s0E˾Uс7-iI JFxX̐&kx'bNZZDfWΝ9}Mg X`cqh_jdii(ϊ/{ MN"Fq{ 6AEKEM!8֍YS ݁IA/Ydr(;I:[̔U +u(rZ'ХhM^XI~/ހZϫ}9;褡}ûN޶;hǾޙ̐V'S>m>RM#W8Ʋc8}|D`PL&ʲq;k'AOuc>LOI\y4Iho&ݍACG +wn +-qWp޷, *[dzKz/9Q73cC9@Weĩ sA2J-z;xt(ߏzcO5E^έL"ɰ)Κ 袯D3S`/ƋxLg^,KI3^v|-{w(}S_ F/AT̙He{eJh'șmaxg'FyIY9u.Z@a+\HՎ:l:K*ke1/?:>1+m1՞!X-їkCtt0i~K)`BUy7_iќi* +#8x?piu NYf6wb\1f + o)f!)aО`z s +MUY9"Io@Nq(FԎJ?R +7gCin ?q4L)<3hS_2}4Ry/pI:_ QxH{|jL0rMs,ј "hsF2hz^3̪ge܀šHVT&l|aiv(??J:ҝ'B= +ZQF.< n 1T?X:c+ +87ݩ]돥ZgCfR` iB@!mއNH`ʇɛz?@D*ul( +ErOu!GJy&Qw:K:os;Mn4ݧ_xVQŮ)P9*4FWt.O#??<ޢk?Jșnk#QyN,i޶٘ +(T@"._-:r nU${aEf,Ow[_U,-W&NbЦo!cz3Pʭ  q +|9@wh,VϷ]-_GFcvhd0bmqID"D*Vȯʳ z׼~kd?,?'oתwuP.%CW6qx?c hW"%.bI3Ah9@og<3(u, K@GǤ>;Y)QXDnϹfC׍Řy.4KވBɽ0RX[OUcv?%T(16aо08%%.dӗ+=`ebCFȕvk`c,5mc_0ocC`]lZVY#J[zC"5( sbO 䥂GN*؀[ |C\;KeL2j Ca(yT:-e1dڼ2].|hIճoEEQuu/N;di}qTo  KHܜ'B~ހ;hj$wxI~:#O݌,G9#n/-uݚa*kxC-tvQMeܖ=cOs:QR͆<Ƕ `悳^p\U[x^E=^lnImQ>6aݼSw(oѡOHђA<qsXKHD!0oeB9eSisnXF+sk)ʙUpQH@44F+ ]c;tR^XvT%nӹ4'ul"N:!! R4MOoɳ* +72vHh +dhU]DʗƮ?ݶ)Yx(KO%?Ŗ !cڳL2Say0J$9 ܽ5"jW= 5.k}- |M6BZ?|DdF&YFqЛ[Oe z +wהTMOp_[T 7^qawZˌ@V㐺;h@^@{K"t[&;ݱwHڴfQL*fm+%5,d ^ [3s64'0 *ψDkxcp0CVZZE>f-h(u * M&Zh~:VCB՝ "DXFPUn.4_ΫIH-X%W8$׽lبLOdA/Xpرj%lp gو6 Ru0~'TqڎA+Ú +Vw~z{Ћ9eqJcM/)VMHXy: #cm @-r<ԸVd#C0#+0>η\+0N"i\MI&/ η c4GF6ةйl߁}o1կ#ǹA1ph9><9fw4HgvH89lQ֜-`RKg[::۩ i9g23S+Xv5TS $0*oCwM:w]_̄E<dzNX-V.[*7y. *wYI' +kr b4u0i憜MRf, `e݌:)6ZIYiLƷ垹=z,V)D$+IBxeLil \@HtƀW'M +oz`mP{9Pӄ1.HЕMgk.qrS{,j%iu=K 7̢ti"aUVGyzB_-nY[s5yC[Sj;H%JLRNphTq+0'}d<{npnfWF!|kθ4 +tUSWnAã~Ѧ +KxUv9y\thY:S%ޣfQDݬ3e? endstream endobj 2595 0 obj <> endobj 2596 0 obj <> endobj 2597 0 obj <> endobj 2598 0 obj <> endobj 2588 0 obj <>stream +HWnW}W-@;" #N 3ElIyv&6 Y]]˩S>!)(ьſt?r~bKgl6>l|YS L)Cg?mfhv]c?,W?/~ ?3FLpxr!&j_'l}1y.W3}ώ.C tLQC4 oe5JdL#`$]MK8#V=+9Xmm   Ty Icn2inʑTӓbRQɦYDH+`_U9qß9 +}?IiU<=*E7 @\ T"=)p>#*'05ъ℗dU-ofE$[\Q +;6RAGzxI Ej!^6Eq&mZjV&cH7 }ŹNH6Czbs džIO>C +N8ppOigj]w퀰+ʑy9@u@?{ "@[jѯ@rFUs7f-}VövXw*.y4 v5F`G}jG` +C!p +ݗf}j:^ +01(}Q᠕;u'3 +lj@IlG?AFJjr!gq M7V*UЀwM=Qn)“IZP s%]W>jH_ATWB6H?.;,hv@ޜDEu!8{\qۓw|~& +cO6pf]4Kc?#;8 *tT~/cEIW|,@xel_R[) _%xM|$NPGiH`@g(λRֻ8_ hrR׮+ +율I\W/&^peS~iwC蟨yPn2Axq8)y48l~ݺۍXT+:ds9>lUW3` {/']p(?IOY(hZV‡Ut/ܸ\e쥿n=Ҿ 7zykvw?wyXg7 4q`S h|±eitAW$r +,KJO?7}ڻEA2|Sϕ®GAT"q>(; bhql5H8lA!4д<c\aV. aUIW:+MocUt w nBhgWB{6^>vHp:%[=n1~ +ݛu;E[XT~ӑ J\w)& xWp fzG@)$|tKX%Gn$yxzƧ=SյL84WV̉&q:)v.3'VSd.s&/VR?;ZגIE:_Rw#j@P*kAY%'rX +W :<4+-X-е16E_onwn׀XsqHeMkfkҏz{=F s"жvKa ؘ(U*{#ā[I3S%$$,,56$ "tnqFDy i~ o5qvYW(tƔ +Q"*ǰ{خ0E>{X贍/Ijl}xG@~/Rg[e7(ҵI#`ńgUY x{i㤊GJvpzgsru[8Nº^;C'D#Jk"eH~f 5^9Y: ~xALvJ e`S˰MNK /l26\OSYw ' endstream endobj 2593 0 obj <>stream +0 H@&\ H}#!(7T;k9@1)spShXzYf19nxkLoQ A1ڽ*jGt NL*j^ 뗱7}rx9[=f:_h٨ I8 +Z/@)Xh\q8ִ]R[KA`~hĿjfO ӟ,&eM]fOvE~Udަ7:L^mnbԗؼ_gTqKL>mmm,U Ȫ&6)kfDc+M+5'~_-;,!]B_PU̦q_= 4+fEB8oNc7+l@,F+CL1(ч5L㎉љqċQ&M6IBБZ ɩ풢Uc`њ{(U +?ep[f.j6#:j;~M]cíx:|=q=X,"ǾpԍC,ChcG9PXMصxj& r4} v|>sŶL ` +K_`Z689=Ok'%X%p%8mG IAOn||yeL>OW6t_d&w#}<վJquk,M`AM bm,187,%: >tdZBs9XV߇"Rٔ_ J} H&A_|L=b*Eu+n[f-N;Q|r/ =veHTy /ƗP͌%{W15kCs& *qչJ}-9 2Z2gNI\W.Ե@Q<~^}ƧQ̄0>S&*&ѩzZ0O;4r[KuiVZ!n}mӌ]ju^֯eOcw2 alMEݒY4T›_1xȧs'.a-_`#ޔ ^vz{]{3[`Y_!02hkXwFcy7l̻O+{QW:%pjQlve^_T\kkP|5] $\SS[#7g-[4N=N. f=a-m^?ʈBqv$Q~6؊bQec_HNvt3*nn+~zuRf8rwyFR@pE9U:s&bw4$AgSQRG* +3RƣXe)ɔgqc@56h7isg&]A>IAbh%v $`gV1834K)}/*TCXGI +;tgѽXl:w1~GjT<᷇" >Y0ms +`>plKPߋѻR{.yORlU 9o( + +4¯V˂yvQ D!zXm"iV%Jl{-XS넼@2<ƃWbj)L>6c-5!*zӨKf]b.WSP&[5ug}m *,PfU9w}i_хw9rLh=6+np[Min7 +8ٖ2fx"ZnQLYgՕ Ug߁$K'0ݩcK [qVz=q&+/wjbY=RuO' ]\e-6tGַO|D"d.f*KwOH8Zw(Q&=]DH재Mi/b5;{No5i9W{]`R䜄b{DSAG5{*t0Ojhf UeE iU%B%32g6'&s;WȢ-F(Awd@ӕ%T[Dj?®r眛 Smu# +)>]㽲SP,RY(֋nDWJVWA~Hm@#ngB>|F{W~ WwO3Y,? +V2S +%kt|!a-SIBرա,H% u>=NjՑJ;ٿwb%ܺa,h>K.e6CM+a.$DPuI1u<_Ĭ9D𮍃1ĘU["b.0eP]iM7<)n\3_syW䦐h-dԢ]`+k0}D<`7acpԌR]{^)^$heܱGBivY 7=EL·l +?"GfGkk! ^h-~lu-,| 8¤g&0@ ~cUX^%Y5a[QZqOP.>5%bpݮrK}U{ڗc $,zM(_9eMyT;IwXU6Eh2jIDH 푳!307R$U|?p*p)K}n9?;Vi0iDG +9 v-)5(߼jN sAkH@qsvC<,E3G*Lrg&?vh418KN;Z!>x<9 Ie~O`(nULdϬrYS& gߜػYo${Ԡ;ZW G܁KzDQ7@/٦Z%}_[o=B GNy@=l' u?CHyϯR,z;%[1p{?d, +S"96:ZwjeQt?\DfϼPt/7 ~gd1d Wǜnzg&Rx0@@vD_ݯR&k +0-rX}N͛xPueYޱuW]t ,Wxˬwl37=?{!a1ʛ\Fy<\5ErZ`QN[k'%x kOsqݔ?ǣ7Nk/S4徭t8/PLc^;D;Zу4(Y;a7MVԵ:ҽ#FS2%tJf >pS[ 7Xif$,TLjP9ғX@&;[\VAC3z +Ţ"D0~$~|y\rϞ2۹3Ag|Wu\Tfٗ,=~MVm:v?sy%t--4 ˗EF?&cO~OML|8H!{IWtR/i[m"2j\$-Sb4o$;ݸvD12\ +30LlлqEq}f(>|-Ljiy]^DBpSW dF2ye03#1aB($R,'OJqm%rnS9n} Jck´ YzIreE +[\: 3mSx^%<pIʨ?Ml';[qUO%Iăp" .i0 t .W}!ke|q:}Ii@9#@෦ EnD)ƔA7%\5=wJT%iF Kx6Z踖Y_S7Z1RˠUNT=3JBi?}8n# G;6pStv0!Byy]QG&8zO?$ Pa""> H#'t&M$;"Jq1H(R//Mb@(Nk"} ci_VOiv#P)b\Շ㵥CsRL6]~=-v= DK:-&c;f:{h(#xXZcL;H>@o"i1%gQ{/FїFꇩX!js*+,qG,96WrEN>TN(2yDe ٣{0k;z%~ Zw+\ N?H sV!7 +ɡLr` 3]6+N7u*+:'x }y +byfCC]Hv 4F5՟ŊJp~ $wMqt|XN:@lO>Uo9MXiVK8!0DYV-87^AIzxc/y SDdLy}>kUWlTNȩU̡WnֈF,*#U絠Uߵ#䇟"[|&uqm.h͵ƔW;]mݙ]k^XwZ2[Y͑ГZM(7>考Ռ$0leȶ:(˸:N=uHB4OOi% $I2_G8ˆnAMH3Ë =/俪_QrG%3Pyv\:-{7S10~\_e+upH'Axr_gpTN6>Ƹۚ")Lz +mm_b/[܊& LMinxKi垳Qw~yT*oawt2d,mi848aM :n(T:W~>§W85hG8(qD:h>9on\wzyq/ga3,y ?XCu +%uxu; h3W Tm;yR86"ܨZߑJA?5Ojِw0dLSxdc_P*y( ֫,_G*o_\ρh[F0}K'o@"G,ὗHgK拾 sBTXў|`yW>s3)jVPס7-i8@|k UPǒy&wKYӏ^w7\&6FGàP_o~8\ +&_D6o8?~Z鍐~Y(L;c5}0I9,1X꧟bbUk*E\4\εdC#Mo"4:"nYH"u39.|od?sF6w0Ns>|Iw4kp3|'G/Z6o`2e^Z@*t RyJjN#e0 Ou̽E,:'IEkrh7W"\&HS5S<.J]=l_Nm}cI#rE'٣bǶc݇99Ef%!:Y俨3axX<2o4պohu>9V}8wgG4)iiIK/Ϭfk dW}A}&y'37c2 |JetKߘmNb f:$*NnLjKϡ<&A||5Oc>/ucts lX;UmtlM.Yh4wc$#\![UX12Ƨ(4Sֲ9a2d42mmhO9!ӌ50 jaAI4mkw 캗HqZgЄho8OSӻ-k!Nt\,ݘ%.;?mhͩڬ3\Q QFҫ!g3* V-75+*Dl>TXoL=w\[5_ +s(͋SEuZDW+}iU-XSfpO0UG,dt%6&h9<hZm.D ~`2g]S7\̂?CWcCTU瑆;f>.MQ#:&Xѯ`"e8$8?j|+Mcw f"|~UJD,"\q¦3$v2U%ջy'+Jvyy % ;d醆Zv6B ,wH ӘYoa=hFz/ªK h57 +HV֓d!vA4v쩴~4k:eӃj';`oW[X,.ns7WzdR̮f֝&OmQKO' :d׼ ةw߽ 1d7:K4#ޝD2ޔ;bƾ݌Ih2XAt/Jۓd:n&#ہxv[R-b!nPɴ_̕&]j+麔4Ql ԓ-]M a!zث쯊ltsVdHY2 JtC]i)ݬ0[Y2b Ֆ_LeyRVE=QBY-KRjT)|6 hƕ WU=E@XD!^l60/,2X4e@ /c@i=U]P dl~0~ui7(.# ֌M7DfTLq)@=k`%,;9KMǡU3,2a8N21[fmAlXgûq#$&&p*zWM11E'\6@ rV~tD[b宣 ^PMLؿĸlCTϸN9tg]Ԏr7޻CxsZwXh{_zZX ,jNűX]>2-CU_M5(dx]V_OO""0zSp:/_{3.Ai Z?  +z;չL rFԂX&#k!<)!ޱAl[r jβKs})ٺ)VOw^Şs7#E[u ^ы0xlVt26p r"VTSODzb)菲"7DZCӾb)isXW$ Kyu`툓vkt,$Ќ[1I@H|PlKg/R?Z{ uSi%q-`$)3xB(lpگE;9; +):~A\,V7K7@e N>%$&%3>F@@% \}_J 6"\GӃb&Kh8!U72,UƝr/EeW8^Kmƿѝ7ݫ!TT&6 ?n]RA#x9H*R#([ E.c$] +2&+&e\xA8YAĘ."g9$R]1= &bxmge^ +}5 +ݤՑAsus,EZ]U{tAf_1Lv,4a50ՊNu]Pr3,n0:>)IҠ^Ɍ3FT'd7*Fv-h)[W6vZ7eW,r +ϩq+;Uu'o@IS`~eG݆7&~MWpT[JK0r?mpZ)w44[?ጐPDP!ĝ0"yp5O+5J_hxޫ&#J+˙7.6u n&rOz$T&V?_jɞj}R +K nBBή)VxMtGq9"b|s`66%n_"wd₢ %>rZ0C˲}|U>M|7Z[oP($3-O>PI-jJ^΋ߝ_=sRTkD /7-aId4Pl1iۙ0F X7Љ'H{@3LH[JP~Ɏ3R_>g2:(ֱ-װk܏JiHSb 썒&k:8B + V?*+cwJ>&׵yCfbTM={扮jaMOa/]OGNEery6ݗs4+tchd<>ΕO#P*˳7@d +of|lD`Qe|\ГHue w?ؙE3=yY$-f:g-h7 LtVtGy-w7up>q]u I b+L^s_ !.C0A0<X}.4,m(Vl9(zfIk7M3&=\P6x=~{$+$zU&e`d(`Mv9rBrx{BspXXV!v-{{uxi`DŔ m:֑i`f%Rk:E@7),E=8cHl="M~YI=pНJDLÓqNM"yލ +,NSpbjD|52#g0[Y\,0mx#*[-n+@m>D!^ұ LQmG9ܩ"!0(k%sFAX`UG_R ˉaëc!vQ"[1`#_EDT1ҋ{3^ڄs)(x[et{+=) +\ :ScT8?w@*<ˊ$a ڧD$d'a]q3ʽ + T̩dͥԺC.Vp~W~Qؿ:=෵d;7cwק)gBp.GyZ(I^QGu}_abaE|=ш. \=&ܬE1ctP^*#x ]J}Z٭ RJnKf"S&za[~>?JA׭;;{D`Mb-`i.DtR1̕p:JG vz8e-ɺ|1HĪℓ/o(*9떔U W*DaIL>Erկ >U]>@l,"VIpL-k㍜m\dfa#J~>7vק4=f>&J;4P 1g"0; MK)N߄YatYF^co20Fg# 4G߅kYT]$(óS761;=.߰H<!Iv&ӰNd 4 /: +?EZg6VhӰQwn#\qJ[ݳ s[n,cb^L= 9 ƞBOr֓B5uHww74`0t LAٛ:`BVzzOƨfkW 岷Ѧ* u˟uZ VOD/`R}0Bq lh1"- C5(i0RIO(aMU +!o&3%ƹ-|L*-5ɶJۘ\n@_ %LMh}HSdkvEwSg=1erЀWĒ踏pk#H=XOg0@Eڈisv):PL8Bq2tbξOn}S5Obwu3yk܌'ljƢnAEOG}ڢWB;&i#>:1[+Ԇ0R׍X\ H+[wCѶ9T#n-Pa=ӑ}s&6m1;yG5_dй}(31oИ4(&l)pkiq^er[sL6FrPUW،mY P>EN/tLݍv֮x٪>q5;/ьh M$!çfYŪF~XW]P¢K->JgIo)mm-U5]u(Yh-+% ʢ|)}ڹ>oo&*$uydQ@Z >@ + +;>hC0؄Men{[ cJQz'[7tO%!fzR};51Q!UKf:wCo:Bowe7dT}P4`zJ*g_ /'j4hI]x^TRPtU@zMg j? ͿhpEW;'/u< Bm9Iy@mpڊ_&ۯ%v~\n4TWMvu=SaƁ&#K /M@rA8&Ni MBtF/c8g1E34ǕCO }y^J4ZwZ-דZgNTgMzy+txMi[ ,78C>~,lfYC>p.R4hRU +,~[H +[;R},o䯼~|&ַ lf_N4iOZwOK_%N a^A3-ܸ(~߇< "f?ne +gW\Vo*"wP-b=2~g"i~,׽!y=J16iB51lk 1FǺ\ "i8.)-0WGD͉?loۉ^?gg p^S!*{1WQeD|kbr= 8Ne6{GIKwibaXn6/Ua}ȡ?l9QWS97M]1*hWua]>9i$UAJⵆІ=x&|D3a1& LDDx.%+!7v|EEaŔ+gd_ Nq[ d\ 6f~>UJ1bsAx:SU]6j0׫q!{I>_ڐQ{g& Z .!ε +C"..U==63FEUu2G;(@BAèvեl#CI9Mp;hj: $(x}SZL,}%񸥌Tx ˋ I[;Bxfv(lCVFx`qÕ۴wxI3ZG[pP<`!̓Q9 ,L@ϱҘ'4W*={5)akpH g0 R[t,`;LHj9mhir2Q rHLJ[SyU8/MIny"Rem=l=To]B(o#[&j5ܣlh4KaBw@}xVދnWlk Xj/m_g駜俇dԝ]:MɈ r)9zp;IQY1U6 lM*ƷxL7bu +&m(kSDK)^Q{ݴ|=]~C <2W Xl.ׄjV|矰Fh3zx']̩ψv؛pӡ.U/9$&an?bw9ǼʢHV}nb" +Mag`FF,I +qmW*&4zYj1*01_?~4闵pB-Pzޒس[EKF?ߖ;Ʊe}h9_~qkcR2`om@v,g>jفBq}+!n5Zjd/y@7 Y{ .nȃ?wfJH˼'²0HV BWVsGpYָչ^ԟ +h*#ee߱eޠmu#(Ar.Бo ώ&;w\%BJ"rB=a7D^6}7:o<0 jh +Q֎6P_r'=k+σ-aO/~x+KcW6d*f *eVITp(|?7 롓D0-HÄ7R%"&nM)Z `nn!WnV*=MT*cR˷?(9Ea7!M<+*Uգ`_c7 X @0G˵fpQr"ozS+Z'0eBP$vTsWc3zrm[૚Fv}GHZs^=4/xPc Ytk`"8|zΗM2d039싟-ʚe.Fc}G&ľfZ,FY'xm*bQד I@5K rE|vڤ$ +`_MB@j/T&(^[Ÿxp,W}V= yXx?OszqvM?94 #[DMb_CSZ"xf%Ȭ pS<|j\Wa]TUDT<%55OCjv0Zm$]k3̡J{ho%>a` {p5 RCB Ze8mq$Xã (5ۗ”8RH1qp` pG(ݥcwuG Kɉۦ}Ϻ;IhB'1\Gg8Uݜx~⳦5Dm4} t槪 Z?5ZMj4i T0Rxtuy ɰl/M' X36kȒϿ~yە1+O۱ ֤!ٗ5^^ϳx)szǃ'O{tꠙ wF){eznsNw 'e2o0E,-i.hY +0S[vaxƮ8$'hMmmz =/B=EJGhyf O`߻j (0K"#f˰h^vWJA9+VWg|PD5Tbv [4o]4 G? zRIBx4֊7p*(l +:V鋒mtE`-R ɦZlkHk]in6@)I>mʄą +{ 3QFfљNC,A=hݗȹ:dPd^.NSX%I!]{xbٺ Ѵ~[äy5E[eɽuG*`[{V)p@J>ɢ Z7h^H.۴mY!Ỉe6d ~H"PMk~K?B8[wPFy[ipBƘ͉^/ 7,|fXюsR[2լZ1ͮLcK|R4˽%U_cXC{wPA.WDUegjeR_L_pq‡2=e% UӰЭd=&@\Ӈ<ٕNY\u3Q=7e3(u'$P'qNAcyz$nTݏ5 +kŖ R* +beX%DBf:Id%"7#_JP\M=Dкd]-4Ѩb#͆aEWS u֛e)0Q m\bQTɊetV`lt2b<,GaN7TQڜĶ>'#=NXH~v5u&h[ȼI5{. o+YA2Ӄ|ĥ&x3b0:*6x\ HF} +Ne2H-VshB!~?-2 +A1X$mG=zJW'QUF/pLh!޶rIF  ;b֫sЁډ,;S߯KxWe-Mjz&QEam2:a0X%4^#m\PCxԓwfV<C"T]sM]o}QE&#&e\ڒVW@3rhB@c+( 2ΦL@u +(רE4 S)OIq!g#g06Sl3ȭ8Ҫ) \θ?%-Ə۝K +e k'LهgT @ +ÎnckgеHBGƿ\jȊHBh<⍾ٓސqk9ve(`=~̇]Vy!ZшU^>v ˄ ISZ&H")oį^>H}a首~df$XStp䡥/t4(1.eAeL2P.:/ɯHme2޸S`i0ʳgdha-]-jr#gU]Jb-U?U7+i\DS8d4kcDj<~ds _ +4g ߪO|7PP,3K]{K'm$\QO_)۱ͪEK>s[1o,À{s5`y%p~.m5;JC+KR, Ɵ5UVM3ώe DwAeV?ZG׍)luN/N;]y8` \+ϴ Mєρ71 ZXFH*|Jw*BxۈqFXcޓLy*D +s +m8OhBr{\I<9c9нLçQDd>oSXюnE0̃[tDRg 1;2~@tx3+jJ 0Z40|Gl +L"q>_Rt{=Ihi^'ϻv '//,G1xobxtUز7C sʪaC:v͈>F}Av&^dh2<'Mq#YCqPOS FIW!bkE$}^($L_y1,Wuqr4`qFTL&i|c'3R9'tR=˥ш.*}BFpEN^G>A2lgO(pe)}r +~ϐ:0wH&m_7Ohrk)Kw*VDoժТb8=~8rmJyj8J,-/1⧷|H[:2'u-<'l`^dBF:.4aV>W7w~$Ԁ%ҦNYQfm KZ 3P_%_-N=45xGRPtɊl;Y@1H1: h2F!Wx&Rɭ,P* =xj]shf{ r@-(|0^v%P kV##vc{28_K)##6-H!mJL)gwLd{µ> nH 2"홺SMird%ϭ]b4yc_qˎ<}fyB)CūFIi &-oՅ[? endstream endobj 2589 0 obj <> endobj 2590 0 obj <> endobj 2591 0 obj <> endobj 2592 0 obj <> endobj 4893 0 obj <>stream +Hd͊zy8 +>sRhF^#y QG#Oç==o/ϧ;c_mӷKv|~_oo~y>}~W=|z>{O݇q~?>Ï?o+~ߒ~;%zΏx߽w;>lp?(O?{wٸ^ PZUuTGu^5P5FjFDMԤU PjVjUmFmک]uPuNNE]E5|| _#_k55|| _#_k55|| _#_k55|| _#_k5Z||-_+_kZ||-_+_kZ||-_+_kZ||-_+_ku:||_'_uu:||_'_uu:||_'_uu:||_'_uz||=_/_z||=_/_z||=_/_z||=_/_ || ߀o77 || ߀o77 || ߀o77 || ߀o77 KG#(~? +?G#(~? +?G#(~? +?G#(~? +?z $߄o77MM&|| $߄o77MM&|| $߄o77MM&|| $߄o77MM&||3,ߌo77f||3,ߌo77f||3,ߌo77f||3,ߌo77f|| "߂oȷ[--|| "߂oȷ[--|| "߂oȷ[--|| "߂oȷ[--||+*ߊoŷʷ[V||+*ߊoŷʷ[V||+*ߊoŷʷ[V||+*ߊoŷʷ[V|| &߆o÷ɷmm6|| &߆o÷ɷmm6|| &߆o÷ɷmm6|| &߆o÷ɷmm6|ۯ\t;]~~߅ww;]~~߅ww;]~~߅ww;]~~߅w߁w;;|C߁w;;|C߁w;;|C߁w;;|C߉w;;NN|'S߉w;;NN|'S߉w;;NN|'S߉w;;NN|'S ߅w]..|K ߅w]..|K ߅w]..|K ߅w]..|?|x>stream +HWَF}W1ZYU3AoH,$ɋL$R&%;[*VRSw=+nTN4!_Ai4D~=^u_VW'?#kW,E1[F3jr3UW^V=^WvErBUƳuQsg0boW/ñ'?^9ft?im"~,2Ito}hoPW믟-7/^έ&TfBWC  &5H~u %V +>sFG/Vq{NJ3?yܚ@/x"*L:y +y ޖCUpNp4ˍ@{ח ET䄇vhsSH _-'\IC_\H.7M]g5vcFLtf"O84.b)pЂ&_{T9v]g~9 X.4Z^0; q +LPR ELL9c=W"UP!C%4?!M8Ѵn 򪐥Mͤ!M]ʾ<6]{)4pfa;iB^bv*Vk sbs/Td }-GȒj  WqVIQBP_$uÓƧ\zN=)@G?VB.hCbV J =Qoޠ~bhk`4ż)VR/ehX}]L޼XI1wA5ȷgM\{mM=R0ulFz`!(W5* +$ eRcQMFқ9j 1 IC7+eBft-Rp(DYl{]p`s.Z{(eS}6Vr_C7wELP0S#GZoc|z$KO.LCh:*s[@v +(jǨj%̱vŞG!Hϧ󃀟ؘA9󃬃~LW?ԹBT#>Ǔ~:n?[X)'Baì-͝P@N訪[ǥdVmUCw9*1 }^_0XګfV)JqaZ^T0Xg$$V]<钄0SZtM8O5\L1݉'UF`IH,8od2™/̱E̠1V4[qhL QI􇘂l|0}BCǙǧJ>m"꼡f7 dϽvϨSY,FT&w_Z0J@B@M_urǗA?ǦvE3Bϫ;Dz=z89:u[a~]O7۾i3o?/sƿMzwI܄ֺ-cm8jZdqJ!͙g7W3v|iG&,1 9W=4χA[Q_C!/IIcB0 _1Fz`xA~,dt\tj I]ُΟDvDhDIҰAS0mA0j@YL{|R1mZ-T#TX5ڑL2{) Cs5"#A68+ 4zϋR]$.3e`b$T5-2Dl$DLJ> +pfڏm7 , D ٠mk@#L-$"n$0d'.b~5<ل48aU+LV +hZ{ \L>&7&0w?A}Pnb68bs0A96ڍ4691v.+ζ!6m P +3K +-1)=4#q8?3;`yNemCqq]Д|ȨSMy\#w6Q52MYv(lmJ}3}'"twU9uB@'1Аԩjߞjr̪fҖo֨33.l&g]N<;vYZpSW)OsVgL-QuXH(+QBۀk(u2 ү.{i(3>uH!Ñ}1uEJ/UPO>(d-4} !Dܮ).ɰP3];u#~So ɸ^m; @Wvڲ}1hTH~}CHK{>t~fAVcx{aw(-2Ґw5GX{!i  QW6iڔu܆Mrb'i i9YGkbH} t2;?Nqod5Bibj),s,zMЩ 879)o+cI՞xg@̌&ze}2=ZT<߽=[=u>)^U%5i +\<@P|<K/'(U|éB~t*l<@۰@$qK1F& 3iwԣBb{ <)/.o&HPS/ +-b?t=Vxz;H9Ci<2"B6:vӹP +8~p.&jQuh'~ +Ռ(/~,d endstream endobj 2587 0 obj <>stream +0 D@&_ DҕhwQ_YZgqs(yT?r?j5ϟ2Qըyun286ԬC %25f1p4c5i S,F.,陘B S[zdCg0SN& 40 ++|A9nVd\@ܜ A΍y9ev7ـܟ2m™+>"G4:|;geqBzzp^$9=JJjb28ʷ(w]8~[:{y}dxgpA6.s(93zX4nrBcɔo4A 5)^o*V~ꕇcu/DsAHOL|MIZ`o/K}uЧ#xFaȧ38aG\mN$ΘX8q2-wbmNB+%k'/¿ 2Wr#fv:[>7-ιAć9OU=[O@eRd1j ;& i8Y@_ ;$:"(%>h{!7S#s8Ȼ ːp'UŃ0Kai_ +t_/^H#5 bHj-[kk},ղp=y,v2!xe1S_S&b* JGٞ<&AbFUXkj]lhT/~uNҾ!}3^>_gLD\]sюؾ3Dv{~{G ;, > \zOKtQHƴd6ٍvu~KIu#. `U򂾨%Er U%7y ՃK^_J[,? +7~w3NiS.t.Y "nJKesu9* &AE ^ח(ҝ'S /z=$GpR (NCge>Vpֆp7&k},.vT-ur|]EkӚt+H `nJa3;A, a ?@;( zH]^7|w_7%x'3nK:4tGbإV4D [-1N\tѠia=dV^w~K L,[Hkb,aAJ=VmW TQi-[eϺJک8 +| MlDT~L˷ǡj O9FkE~_;o͂&m6~sF|/i9ˤ'._"+c02l߅XQLD$oXXet|pHyCS4nٮ :Iΰjoh5:ˆ/6 +$'GO&T9So]xGbEv,%]^Y1Akϧd)I'0'8'?VuWe!m1YB_8h +d;L`/b9ГO-{a4YyV`aCK"E-$YMev!ZȖ;6ddtzU !Jf"bur=T]wO3ab+Z^$&0j0u/d#Fږ']oGImnZHX=$]Da搜.1>`}{\ Ol,ꑱO.OGN}7Q/fa)Ei4na"A:Xz@Rn|Yl,]|ܾ|N1#L~V % 6 +Wų%B҇٣X,pT/v*z4##/m*ǖ9z٥R,Gbv5nB7S|׀psbg v5lby*3k[:0Bui Y} f9L7߅T˧9#s:i-^ ~1ev_ qL +z dU1KFАQm{J +\`o/Mr<9OlB,ғxYmBD ++~ǖGa~:kU?g=^m i +sI% ~Ȕdw, ݲW\5 +( +Q.'K:7͹&H@ N&,*DD桶Go(j_/Y+UzL MksJrmB2=<IGг+Úz(K˟٣Qa 7xt2 Ha<ϣļn24I=ѨjDbN01K0E8f޸F/L6 v+cBTo~FG$ZO;;Vڎ $arb1Rs&lK4pGg}TVP]Cnaոsq^0\Kq9$QXM l/lYobh D{Mga䉁8 Yҡ5xË=nWȒ";*հGGfN:rhn2ARoѵw$,-?Ę_FAL yԵ,l<;!oCqH4Ky*J 5Vb'Ux-~v?ڳ9Hf!B TTp@sUӞDp?7s?`x|$%|<A;qպxn^j3bb𷇵[!(R:"vz_}~y`{ +^kD]G[!i_GlV]ré&ĵ'TYesC[$ =L*|\z=Q :IYM"uKRR,o"َuڰSȷw75ɛ%)29||"WCPɱd@^tM +Ϻx ":e tvH'9pGVPxw,#2R.# i',u$:Jf#JZ,zarQc :R;d?EWjübCPJ2bЅhysm#@cCKEoUarR: vd` i >E5ړ7\5LRs`%HU-sف,7BKa\L4#Mw"/ѥ BGl hݔFIdї#(u8Kr$9eL:SGhnR˚jLy}џ۷$>IA,cթ5^\?0 ~ٱq2ξF;vŚs@Nei?9U*n281"S&0fxqf );aĠӁ20Baؘ^@n@aװb_M<#+ h OH0m)#7 +a5f_z#?{F1\IkHbg*5$p7/Y}a׿gil=h"jZB5=#*fBV ? +Z8,]B 7(yNY"&Ų#P By,O }2ɪ$U2k 2|h^ Q1A,١А"UuNee|)Ub[GZvC`<2 +w~UL{"*|[hcR:6>JJ"$E7cO@fe}4`g{?3wAJ^ߌ3h|f״j촵5zlUvZR>^kc +|%03ꪢ",."М8 M#l#s%r.jz'LJx79QC!BjUʼ{a ̬ݛTD(n3R< :6VGX4Cu'K^13Mm,o}zLj7+p/W9\党Ou qD"0%) ޘ@݌vyўA +o>lM}ȭYקojR6+€/>M݆MNI1HӉP՝g_Y_rO=׽N\[xmf $ Z/bdai"4@ֹE ۆhGVy2W!Kkǥȱ$d'O9kMhnےWTvU!W RV*dPa@ٱ502w(szhXC5UTIGnTc\tp +5~Vc})-3\lB'2)|L}" 9wygBu@7 hKzB֯_+MHnP Rtp7W;T)ۍhAE/:Mdnǃu>OY7fa2K[uN؉yB,&D"˛J ~`Ȓ囂C9=u?k41\ףTK-vŃr eܰBiL؂;D6ԂJ>-n OpKV2RKuw;#_EI[8.u:x,\S['6T8ZZ40NgcP2kj[/ JlrEdQjJbkǴ˵yYP%r#0W*].bF+ϲ~$z>, Js{d\MH/ Q۞ʵ96L e_<gyy<_3|"$ޡO֐Pێc&6$O/D/@r 8{>gXb??}BI%o?7Q!;&bq]*]hIieM~V0[~VhnҟVM_Lޡb9PMGeH0[Vs _yW(5)ƕ=DS@LTi9RN-ܱim?yط򬬾(7UnG !@ s[O~7$d ^SdAF9s;'~`9% },v|kNɃؼ騔?;8Wڴz t4j/%G2@MAr>h1B1Kn%n[]'Լrp;sNԁJW[s?wՓ â4-1snGȭ[VR;B4}o&4]N`7xLc&3gnP1V #cڞ̢Īu͐A̬Rj3G^ظQEgܚprx3>:UU 0vKprf q`ot~)IϙyC'×4wcg[sneTNw0y?L<=?&# ?WlnadMw,JKRG=sˊbhӌ(" 5-e+d&O\g tз2`vOp"hը@M xyy|b۞e *RⴚaMp5s 1$#ZPb9Փw{n@ߖrhZJIۍDc̹!c6ж6i>\s[+oGEINU\9O] h.AnRѣqvP í90M; /bx^=foH^R15Rmr;Vj[ӵJ}:g 7q{,ĶhJK!ֵDW\[4B})i٥a?CŦ!Q[W7&oWVdsZZtiNIB "3'-w9¬ +xeR*1v`WH\(6m ཞ x(j^WXL,3*+~QC)] F]oJR匮'X^Om- Y3SN +K~b%l(<7{Nh^P:]cpa^,>H6=x쨯2'0X +Cm(Qzt[Vd.-D e8͹;?郗AK6we4zv OC4cŢUt2UWBψm@ YNǣ5n'>l("].G wK#Hr6IEAq#*M*ki:n&k!bB]}!2wUg(*Qǀ]{HxO[䜶5XpF_T k(tLbB?$jTz9EEKޕݸYm:ReP$Ap`cJOg4[lB3*PaBׇ 2i0_qGbqrav69Gڈ%j'`$&qeEP)p D974yOߟ X煎\tR^&c!U.^l}:yl-Fƹ9_\Ŀg-ʷo"sT&L\;KZoB>j+r&n4\6$pUD!+ytʷ`^>wB*ZD$ gOa=:ރ3Cwq]IzA-[V6 Ut$+SPܼҌ`t8 p1ͿFnhpŸ7ҵ2Ι %ZYGqʕC'Qw(8GH:Iv{)[6mGX:,x9_O‰tqW>G#m=R:7sҹ^܁)0;gӦ!k)jSK!1 +Di_^VzOT-KfNUW64)0MUj3c=>;=Y F!ZUBxDO h +XC|nQWJhܵ-禳75T9gM(U"< +>^ +jWD`Wbl_4k$*0]t{琎-q@q2Q2Cm;⦜7}5:16e/xt}JړݐI1ݱ$T=<8kȤ0QIp1 Up@A,gJjI8*sp]\Z]$-pRl:RU~-9Y艀 u|)hCR6߭{v]>tTM`AM'ꗝL\E{|քe|dnjyإZ[]'ШtVβ'+i3KU^4qMNdjB+G8[ͬ2m;uD7C4նY /;9+ohs0J5Okb +鞺HgHhQB2/'{̃2w^H?(fů0-8߻Tf%$Fޣg\^3)~dc "ZE8udBDdtOLHxcTKr?nwr9MlN*Xo̼PF0SqD:1cɗ+eYAx7X0n%:wTbζW*$I|? #)49ǤbքB=:/ac]Δl'9RW" (.taGKRygce +l:|G`@,PBz/X=(mKA U.wYXjE +6#}pQn^ XZ3xnlAfN\gAbʌ< d/u }Ap_76xΚT$_w8ȭ9L;Re}Ȩ\-6FgA S.{\A6VX1+}Q#&/I?I7vc3] `awA")b\!z|H٫ heQOO%ܬ澎faZ0_7Z0J| _U^P#\=6gW t%bH|s"5KͩS8y(G.dOqw` qjU7:P3 +8!M#ȹ쉀TIZ%0_]#%уGR!k٭0ū~|^Es;)D?ehĈ bd$6ڿ̈F9i>3tY? X-=^p%< IvL>f34@Xy@gy":qgt@:Es# $^ || b?t U8mSUΙq6ȝT7\ 7)<6sȄshO,1 䵩?"[U4m_0#bBRT ;v+ & {50q&I_ HH~m!b葊4'ؿZ0Ӹ3]<'X2!gN?6SG6t݃>s~E9kת2"/h_tJ)Ga\7ra=;GL띻W- F~)g(ni}焥WHޔ/ۑĸ?ѴN|a/rA7eYȐ'm-0/~ت5fʞq`iUm4+SK7 2TVٳ5y?°# K+9 ]@,m P!+,*avEύ;=xX]cI^qԚ<ϞRoJ:"4h]-)%IUd!bwjfw!sǥ vaEGu(dGaڈ&_'qnxC![ +|Y1k6 U +k{5XLA~2ؐׄ;`fa9RQҞ6hPb,x[r̺҆NOe !kG yąLX@ODgި?F&J;u`uzav -v< \F)IyʅuxGtl[-d[Tn'%n(DGwf\|vÄ+hZ/`St4_`FUG9H*#-G®'BLyc[/Ԁ<9vO TàF]{!| {n> Ds1O}A-V8 ~5RTԹsi3_Xб3#dIM}i-_Dr@$m fܦǽ-.z.6/H?fR q@[lаV>u[xd֊["o r?ztD\}<ZM25mw䔟nlf'7t0fҵ0V R_yF:;XǯV>p7_O|5 gM,l體t›c*(ئc;&Ƿ͎z2K#SI\ǟHSLreN"][Q3ꌝ%Fn(8Bp#`9Ձg]/Ü+&#!Ez'13&fYbdJPgLKtUݿ+ ^r501Mwڐ;:|7I1Tjg. $(.>0 +ZmQkXq01np4%J܋<Yс:fBCU}(U!T^%E"x2w: +5Bo˖+S$UF_cd1rz5ʯ1&V%Qy(ZQӆnnIe7pu^ =cIs5 +O-R)"y?vG_Q!~3\qՅ=xVțQR%ya4xh79''9CvPK 8sp+DVK]E)S6 `wOOB]\exIZjem2Ln1p:pA&pahkHzK8x؞xYٿAm-Z +cTg$n;9)ڵzen晈w?R/ N#)&=Cvhr@rͥH#g(FZ5nU|;b)yL))LjIʅyA5o~Uг#jB-C^GLdk%+NP%8AgzBu,+! MyK+;4_#~ Wy!;Q +=QT0|=Y<A ?wb +=y52Ж%~lx2MjwijwxVݿz-8['PYJxm)S+ntM(ђ,- +;F?SqJ2ƀ;325  T$f3.VI0~N]!IZ 5Uf\:̕Ğ_i GoԱ)[f籸f 1+iɝi> J\;]7uQ]?k{ۮ\LA:8.dϖfarIp8WiYsߚnzpz do%LW*?vyx˶n4W1Iq8E;oEB^uxSkh3*oM"Љf;Nxt*0qg q֩ܥPu|aٜ +#ԪqȤʇlh:SP]J­>:9јyc=-K36B٘8> N푶>yApzAn 1:* !ie,_:VT۸A<@cy3A#c4iPUl@^pgK3J3?Ju8RuL(9g \K> 4~H*^lL{ fmo4&'\)BhSeQw}?T%*\VCb~[/=|g,vCDbG$[lP#) EKKh?d%|F3ItM7,6ũythJjQ|>n^y(IZ%rCKȣ΍5zU!aK0D Ln)J/;xs,:֜hJD: +3?<ɝ2BH©#;B2l'4^v0%\5\^Jckd`>ʶp{x2gpR!b `z1APdJKڞXeݭƲa >iʌ1e<hAy[0FF7yjz'@۴NQGi14 _Ei=PY iL=nB\GIIXL1H'ɨ[d +jvooDQ7G|8>!~0v fb2 i4#UsN¡e]qGbݻKtY9P6UWC/[۔u ߣc +Ԏ_vm|LvEQAII |R,RY8^o= +E{; t ɇ* +)_ė <c o*s*&Rz<8Q9%pQ ,"c9 +Bu 6_aK͠m(3A\<jL9u ?ho9q]~{-ruX6Vr/^Zcan3~rOypq9C4WfߣVta#C!NV +_ſզTჯ9(J(o"? ' jU}|HȒcVgx͵D;u]H?Cd}WL˘B׉?+HǶ +Ƞ1m|ŝF⾏;%̶ŇWd'E3L"vPg$Z=EkjHz tg+ @GL (-Uam #,K1DT-;UPW1Oaia|5 +688:z˿!,8tDKr@ٺS[2!`),_Bx508HG[ri|>xx_{>Yexxaj o?"S4K&2~:fB +oL=ur35-p{tF0?߯?i= I)!SS{]D7SVj=:/E8F. +&!45&ɟ@BՙZl50Jv Ч%jyX#gܾD6 yhvՊKL5y;uNcuDl<#"zy%Rv*J%<HیzŜ⃟E4X#!۷7zBOy֗`+@ ǀ;; TE`Xya-?_/v*S\;Ei7&b1:P 3`TǬZu F=NSw~DUg0CeaŲp2OČCʲkءL-Gwΰnd.b>.2?O亩mCT$nXK)ܩI!f4pЇA#a1T9t;K-FH譀 +[@&1Lr{҉rǁr״e=aEQSA)CmJ-M[Yy}0YW'fُ%t#iX }d|'Ida@'n9=׌qQ87s.yW#ʜ +rKk&+-"rdYSNvCR!`:`6]GzלeѬ3ObD?;ÉItYa:̇ +J'P (N WWͺ[ٚ؜G;mAIq'{ơ=xO8d1w!\ +w~dNۅV+`p΢ؓIehPGxONxPzuD#Vnrup+`ִtN[P-^HG)##DG@#YX85k`k*qici;Оڤl]612dp +agaae)DM e;1 rHi{9A@C +/;uɕcS 9b\˩)}΅<,|H(b8%a{ ( } B@a&,=w:)KyCb3rpk@#? Y$ѻw!Ɖ;z8̠b)|ܤ8Nv'&XCMy]8 LI dB+u:-=۹[Qi%l} +k긂P.o@0`t[Wi|OpU:3OG7?M$ľ1XܖGƹ'wU[#RDz,,{&EmjJJmϾz:=bF(ePnACG@W鰌L6Ӱk,4*pݪ`#6t*O,h!6FTEry9BݪBng$$;6Ԋq $zX%-(BW?B2YXl*M|XD;'vu p`,ʆ{k9@K+-$Aj,2ʤVfSŲx*$!s+QAjظp!e2TX/ߑoN5{S9^>|7Oj6T2%NMr,grw(uv%s,LӔnZ&-2;zNzi:\O ֓t5yGEÞ1htͯM;F0̉лf'$LFO2KŌCܴKIRO钺uKE4&ɍS ɔŢ\ϭǀ t]|3y.V%29TR| {5];.ĐɓCÐBNm2))]6){$?@Z6.$sl@ű/1:vd!ϩaVVpiZvDZPS"`rFWXd 5jWJ +IyN5gcϕ/mZ*7D-ɱ {9lu_z5<+ "زjվ'r\#ރ3$ye(w0֬U\Զu myiRBdOfT`d#Z{oOG=w02&+v x}Pр.1] LqG~& و@eM!E[ՓSI2Y:kgRT?69@tv 1R?Ix{3=Bp9 H<| "*qˉ\z՛~RB΀xQڠwweO+GQؙ%3%fKVK@w.:.-)턥&Sěv8c@zcbr +>*D"A +Uh&z%^}`-Gx?kB8\ +Ka;~ۣ r4VxK]{lKNc#EHH% TH da@jK-Q 32_fqTZZFky@;H#Z햋ϛ26h7o}J"̺9.ZƚJLxPasvFͫ&|ii" #̋hgړqc4x/+׈gzJ" GC0RwHeWw%fZ&rz*kMBkЫ(ّb5?Cl ]^I='y6,H:bϦmǮ˵_##N#N+95xANTWEdAi0A狿$gIlJ8( 0x=(TSzɎ\֠4=X#nz3= INHC֋ryWsbs:$Ry@}SY&v]zjyhbsٖ[ Uvwk}E=zmۃ/Ee> Zy-D[Q4j5a)ep&oR0r~[_QNH&-UOSl<4FN,ݚ4p'`R+Q΅P9LCymrHJ%Dj#k+mo ժ4scV5 N%JB3 +B(S -Bu1l26{B/&3f 9-q ~1D* Ba꘻%)9TUSvF9̥}[t7 [`#m&κxBv?3Fӵx@;:˾ (w;yuI4q(}m*[b[{ٚn%j}"܌ч.N=˽A]1=4ވҿ\r+J 0cfEn- ˭AC!q ķTd^y`)jpT'pPEVoӣvXՅBa9r1qD!'ˤ^NnrqVhm#y1~; v؆Ոv r%Ҁ(v-ꉶ>U?DQs +t YWkR $K*+1*| +"rԊ + ɕ-J +G tsVyTB̉Y\TlЌZg7o՚0[yrɻ}nNa~K{T$b?e@t d$v4r٦;IP1hlVFWX_f +N4ZorȤRDRαɕoS4W6'sJ +Ļ\buŌU "Svvi(g_x_aܨ;] D¨GTU͔*ZmJF$Qƚ*6;QlPN;YJIzK Tf@$2P:3e0ܡV9փV/QsmwϙwE!STM!F}d`L[,& +)I ^AX6R(p6#u we~Dc^M +LN$s,a]p9V{6,X(f唶jͩTL:3 78IZ-4 Ӱe77ފ2 + Kx +WtG :˨/Eyt-bDBBdp>bݕ)s0 +ƧsB(ۇm6;OU̼5V߽/=0Ky@tvbdܤG[鍗l<_6>[tfWi:@ǔԽQ2x&2= 2{nw oP֛ꥺF7KCb[nEFEfQ(qqӌO!mo]t,ZO_wޯu/U\a\L  .WLϺ,^ '/ZL Ee,i.E%SY,n.*Uѯ[ n2SDSk;?)YԅRlKTC0+INB4!0οb79Ab5~.q TϘwXCj3 OY.Aϴr(a*rn{XQ,3bXAfP 8Pت{lt +3[!2=@ĆyZ-a5Gmċ3騩S{rjM#KaN)&3f2Ҏ/wlWb#}F鰐C~zݽ@-L ?aJ@$BR[wAkٱ?ax)OR0Ά:TI*]{u4=ʳF&!"FS,aaCx3\*Ea]4>|[S=qt\z׌9[`#0<F^V B:Js <"̅TM9 Q~r7ɟO#R"0'7nhJ45r:m_B׍ ʋ0Gtܪ3J c-Wy>NKHQ")p +O͡9{'دl u` /idvmLH<@:p2h%U\APKe endstream endobj 2583 0 obj <> endobj 2584 0 obj <> endobj 2585 0 obj <> endobj 2586 0 obj <> endobj 2576 0 obj <>stream +HWn}W^X_, My`D,$G奄MװGH/@]U}Sj)uB.(ӌn)J/o._[\^PBY\-bq/,QaՔpP+o>umW !X !Dz?1n#<{-hPPvCQ"txAÂKXdX!"-6OgaP">'Zoq~L+"^ moWhU%NtfxmucsɈ%Rw +Zv,K2V[ݗَ+\L䊖KҘu.#%Ӫݬ}ۏK~%bKTa:Bǫ< r-ᇏ?-0DBϹA³yvxfEhE~ذ1 d8K ^#UpSu!I޸n!&jrbWz+I2׃zmFؘhW9WeJ^<8 +?͈T>l7=a)v?)ՁNj z>[u&$^zXvCcz,;d((IۯmfU-@s&f=w_^DT2h \ǺoǒD#ʼn9vxS#*̠n**CH#ϲ[!ol{attSMph8Y/{nîK +mh'?<9Y`<2g}[v41ѻӿɽ[ +7Mstv\ȫǐyҍCmhmn{޴J,t3}&JC/{Zd5D (Bp(sLUia\aœE3L W`Mzaٯ&pG⍨!Ex}ۤa4 L_Edy)QEu(+ etUMp%''Zq NpRLm$췖?Ğ:^Ӵ ^`h\1HH} ,]&rr,W[3@$KQ:cC n'"{ ²P>jm%P}xm/7ZZ)R)(j.PK!Dߙ$6%-rfgw^|?8fWbĽʆEKlm/5.-MWX%Z쎗Հ5̀8 + +|; +M= +L5WÓO6p?gP]>|.G\,<+WvD5ǘ0$pBeRGC1|`)4pbj-ۏBqw!vǻٹg{:[m&v][ cd y+2\KQ]үMC0+6k= 7,,A"'Isn)g;_mR܆4( X qNֱ=kHO%kSP %NG MfݯIxwW A嗱'77Ѐ%7_MߘED/3,@AfݴԬB)h֐fN7x. endstream endobj 2581 0 obj <>stream +0 D@&U Dyv>rh7M&@r8e:-ۿ=#P#ٮV&9(>q4RW"F,8Ekyb:m^>hSqt{[Aq&[(M:OؖEjX߼jEM2:yyۭ`₽bLu>Ɩ ]S "Y'J~͎5IE*_JYߋ qcmX\{FZuӹcu\vl;cTo0}mҬ^> +)Aۤ罳'_&OFk#aK NimI]g>] +CID^za04m"O`(t0;o$Я]pw;a&;F +ruP6M:*iH ߙ=SeB**=w)L(-DAo'J#eGZ4NK' <WQ9B +d_ݓڜI5=7A1%2&AM.vޑ9 `U ^ H)b}Mr!%^ڥ?1#VLh;HXY68wY\57*Y2>Z*+J4vGtG(< 6xڋAݚj6ey`U,7z~SBLeCԑ+ %e`m_l̒z3׍Ч7=Vۄ#Lͫk-buMkV dX˖HCm1!zL5VeV"Y5ʿi<860]QuQ(3Ԭ +srR,L!']$_DLuŃDfBlu<V3\"nj܌QR3qlCp4RQmemg"/Z$sPVW_ƶi`pQws{ҲqyMae-T8b9CچƒרI=wF*^ }C>aS&~N j~b?QԄplL;ϯ(6 +tJ*sd*mDe|` Z(dK=`} 힦:YrDܗ:*րʧWg>˱Thw.gȩe<°C;6d8-*?$٫0|gXEcnN-)`*x¯x^0JvTRaZ'F62D>$<$Bڄ8QbEa EHX,8D Fq٥:;uu^Wy/PTп/p)G +7)6+F),P}B@ ` <&"7/{c$,SjG 7s*?^` ]ZO=!^jjMƳi d?K AP~E;; h"%Q(AG'%'f-+4 &:)OBRu(%]ė7]bxW:{V ۚFkZ6Ge/sH!6%D xP_ Q̺s%UC9Md O܂_6_8*` L[Oes,nY7up3<3Cb^ <',CGiiK?V%gf:r="J+_ޠ[ߍN` X}8 DCupvT5<0UEݪ#-Sexwv9M+}y1R HKYs'Ƨ1C^A )z\F; {UryY +r{~{Ne~E=&IIpXs艬<*5}' +]q'dž;rdftxhR94/Բr eҵu#Y+;iƍˍ-%0p +8{2/ dV*:՗&Tjgm%%]_!>'&4vjw쎻0H:ъԈʠB"HasEй, ޷Cle`"*~C/+j;io+ƪסၮ\ko -c5dK~%c%3=8a]@(CS`tjĎaOdʍct!:#*̔𘱋cgU$x%g=Je3W6ֹB}ՊQ~<?p 3K7*ǺDjYۼh)RhDi.T TBĩ=R}60B~,{_/Ȓ\ldRBV00\"21(|ny`V}ngx* +MWk?z@؋dp˷+7;H#n?%(gg֕d|9[)xP@*q kdMK Eub ١zYJ DMdNnRnjH +*d56[&Ѽe~K ^ڑ`lALAٱc%b jO9(1'Rr[ʚ.F%a(#@ks}e#_/1|c#Dt<k+EB؀bC֨Eb3nZ?GHD5r;$e!O)Ι }Q:Lc.fY? ]I_  ǺůLD|q.I  :U+ +-[;PT>K1K)1@-xafOhȌNdNa[j7Lb9h)Cp%ꕿ|8K󕿛HRI ّo HE?KKGN.@oC㒾B[PU0;7-kRFSJYVV|@q_B̎]f>^zud wvuBV:T׉|,yIߞYҒb$W-rZwr R@#|^oHs}{s38Xso{OYm)R4D&yeka}X_UCa] K~U⩧wEDp7tS+!N:Je苐E D*)yz,gI_Il5_*M#L1pz}2*2QVJ(yPlOȐM,8@BcP|7c ЯJy&2Hzp-QWMV@opr`jC"h<3 Ҫ1@mJwa:LC٧GNֹ{R%Qc2]>*"`EB1qx{XQ3Pýy>Cwm')LށC43/SOCs2"iyT^X,ViZy%֐ai6QccV1Wr$T  ?efäGO?8 pQpˊhdqyw]r &Qz1s 6x%TulN{]O#Qs_Pէ9 }4ȸl;5LήS/F)/A:w HrsE8b>{O}m*k0PE~o 6󎧦V!s7lӧm.BIpg6犝ɾx?c?2Cћ(nũ~c$\`zN@4>U\jꛭܔkl 6L7OᙇosͨzLs|>i 3 Հ[HeO)=lWQjR1,yB7_L+;B+Ƥ-FqC3jc*yxn?5OnluBXIZ zE%ca`Z+L:shr)(/m(`cgK"u?91.\}ѭЌ}p nL CT4 *x4)8s0I\g?R` )f/ s7Nj̞,46v0<)aۃy.}{>6iyj*qG!J">c x;YݙP$Ȉ-* ̀1&WmwJ\A3@"W 8[@u"f?q4%VMgEvGf`i|gL6{,ym8b_ȡbLɞս~^h"OW^^ژi/JdQlJi]A7zUFPξ3~K37qp;kV"F#wѨ$i3/|m +jd 偞C91IBϽ@\atĄr9d38)4ŵkKM&Nd&Sᢻ?_)}&=07Cj߂[iW=%cQ(N5i#1>,V&<0}EtkzcSO+cE ˤ}jBXK N%b%ijИb7;J69.alDNþQn]}SpNY0q 8LbZB4*4Y G1beiX[] &*vB@Gunu<Ӈy^``)Im9ze^ +;J92H`,@TtKw>~(V`^@\˜S)9ʮ'q ?ȱKJ"4G 2]ovu6Soww&5j/:64L)f+̌%f쉝>7Fh_!Nt֌+( Pʀ~fR7ڪ}#e~E4v;IzPɔ ??s@Fbĭ>s**boTfT|q<^D5T?dsω׶(VN^.OL`ݳ )uul M^XEꭉӽH-՛~/ltQ,U"Y8p23<< #6ϗyp/^0H[ɌƘffKWNc`CUY qwSw"n]_>`G1{b x/ a?D_VR5\73ȆW[CQ$Nڰ s +8^yTOqEQG~0ɴYp.%Gt,v  IɊxO^>l-^iATo]ې<,6 VVR!""mNJ4,W:h9ӞԻd3=ַ֠!PX0 XM. c `;$cGB6PrYeIn(Q(Xxg#Z*Z"L+D$_ࠟ8jջ-p~$3(H~ʄmXZ)SL~AA,<*RHxbVĤ, Pd@x=#QS_V,t0LYMiw9͘@W|u`< :-|c$6Gd0ثgYO製#hҳ-q4˜X(*:9 +~ Cs!O`ȥoUz 3ՠF98lW  +{MY$yd +o/0#DE>"ܕ%o$_i2,#ⵌo^sO̭^x##ASOf:oْS صH6gSjRۯFʎxy5bxr>JJüaeT((Bĭ[P[vb<)ز {C{1'm QMG.6Ofɚٸ"00RGu{ T +/ژZ*v4qv4p4y3$m-9[$'+h)0l`hqf$`5-Y k k?y&}AOY$1V  fjwl:Knm<`C^uDM#Bpav_!wzzN7m +W/A6Li^ xzho<LA=SH :8QNJg梨9=DϢ.r9Ю c1j[sm+@] d><25MQ +%vJ u1=c8"]r()TʤJ +% { Ӧr/}]V?^rd"N+ŘTNGD)?\'t1֎a +*a%nE + 3.59zU +Kb2{_+A6cB+A~MDzfQ7v ͛-GzRqXO͑lP|:Ɖ(b%C3EG?Ŋߍ(6KpyD`k(ѕK~SoOA?U ӆf/opVI96'MqyѣAOB|5!f '{[J!E4 U(-@G\S2eU6jckׯ@YrCko!%ec5< )|W&8֕(,]UnjC}[ɉߘoOۧVBS>YO0*/ڥ)7ՏH#j!X%U{&V5 aؑYmBtC6 l3 +}[mq<1>j^x(Cy +V2N3bmL6<@q حiEW1cyU^DeNGl\!MeVg| 92CTSkƁ;YGȮi_2d4Q$zg\ UWr.$&pjގS0;Ր }aJ0sC0zM3! k1^f'|l&6<3RӋS>T[OBB֙|Ȯ\:`5i4X0>fQkڭ.u ?RF7.?f&Áo) zׇ!]d){G!i䜈XzCrJ>kpPp],eHH:"u Rq 'QsӴnz`ϻshŤ=^\Xrǧ`.f\nj P+s(}7^&'0 VHWC)w5a'E@7 @1޿ m _Yު_!g(k܉~wrSl61Sh~Ճm]h]mG68;兞تnN{ę'ղHW#/nRV׋-_5ljMP /!0nOq"0\qy/ъ~垖| ~[K(ҝbPhhe&3e>,W^"Φ4PS@X^c%zVe* +{:0yt`T#]0 粤C’b#8!P]4MhJ59yթL:Ǭ +al$s 6Tw04rU}3"TkSO02/pci^z9!3wը\^ᓻ"bX79K`A(ܧG +k\&~xm~/i0C#F +M=$>w~hTcQIܬf4Dd䁼pj $kbԳiy.|SgA,C2rzBjgL(*Vutx$0B;nl?voJ՟ tzo*6iڬ @9._X`}-u}K'NtJ=#>v"'L wN p=vwqQoGY~ ?͉#$:b?Cjl9EUcfh/"Bj$u^y>]"s-4أd2!,t@EN~gʑx#̪Ӟy .(}eq)ߧJ(Oѽ;h["7m7Ew_7rM%ҰWj}:Dn)l"#|kZh{F0[g}op׸FEkE +#>BM)zӘw[F2 OTPdT*k8qxԙ{~҈Ip|5W;3+)G2oBt1 [^ v[㴲OX\6H0Ch7!,P`^`;GanDuҟt@܊z@˙l +N~*e|q^ #:J@S@*lÊҰғ+fZސk S[Z[ Cfaw X=rgeY0Tmw!^5tyb_އC.?Ux!ˏ5;b`ZAo6i\]~jU4gҾof7ߥ'fkDiht.q4đSfA2=B +>h]\H%3o +T.\5I>ptyBO.: VqI a|5;, +-;S6`Џ<Д ϑGqPI* +ht]pUfF8WD9ąG8Ӓ+eՌQJc OL&J$S2<(_z<pxYK_a]FzJ,&F|.پG7/ !pɳF#;CaLo|0?5{OgmeՇ s(yW}~lzTH Nh}?Uׁ ZS̨jHxLU`0yBK4FT>{h I]I\ʹv6,'<|Ly>M`+Zs>EPAC d +}p\9:kǑdS̔Yzc 2PDOjx6/ sTgRmd ( ,0.廟Ia& /=WrsBS ~;\-o3"P*\-V2zrqKnQb +YW,J_IfG/.8rjzM|5:N*&7rhߪfyuW-_F8eWExˈkKwIؐFl!jO$-a+͊5.Xoc]{M][8ߦHP~V.hywh]M;sJvW:QePv3l;B^UzTA^0%tw׵TCIVw?_GK`ӚIY24ڈXIiLCC3j<%F"SKmpvnۖM@ya~cgaC0bJAjR W>'Hl$VaoXrPy U ;^P ?c눔`'U vGHP{2Grc~M;+.nq<-$.pvkNHE~M~Irm\'JF@r5t"L<妨$e=fSٺ~̩͂2{P.HddrP ~ei{'#_Sևʩ,v?a-[ɿFn5VX t Ũ^"BWh,NB&9=-g4zˈ$>N~d$P4(bi٫WU8b!w0ŖKX8oՙxf?紱LZʍj_X 4;K0NZ&A D+F;\~y&- #u5?˒%AAvK'Hܜ㞬MJAP5)*Cvkv[,St +p6fG6%iw5D4MA]͊e^*M6J# ".hKZ7(tr[}~Jvx̤sZWQMd>Z:9aq>I0߳m_Sت%nG-B.I1X4] 0 GQCA9Km[Dٕ ,c`jxTL[n$9Q?lfTf6IZ#.v5k + Ta V>R,!pGfv h V:.-.-6^6PS)ne _\ᓄ{T@ TGt>Qbw+*CcHrMq:\^/+6o&{avS[¾l%N ۖ$v29)pL- 4&e&{W piRH ]ZMo zn]h["ǂZq2d.C){,6]sGb^K/8I@X7!B9!y@^Yr^М-Y֣r ~-*h|41AX%i4+S4!`9mޕP? +#Gy Ks!("l;id5- 1JU6>SBCfXd&7MkB_)[#-БDи2Ǹ= PaY8;(bkxKzVfN39Gn.`", #q6cJgeaM(L{X%4y_ .*'ApQ.^f  ޙSȴRr534 +;l>(L:dq-he)Yet\6v;QlIoh֝;Ky7:j]g)ZTujBIVŭcfj&x'(.O j1c_7<ơtc6CXo820F9,c})ʄrQLxg d Y!F8df #TIыzV8RCI&A#gpJ_oq/E|\pSoQHquMt"n74R'}_k[I&,1'h'LFDiMk+~H OŨo}3'!“pf1A`"m?m!@mB]Y@Ϊ8-\ + +mvlB2g>xO>Rx8l}EJĹ l(m48w[x|KM5.&J):ͻۓGwotRO^D2}]I~ׅiec쇦>wK? ;q@gĄZR]lH]:?L]˅ l 퐳1x5\H rHTR՜$\Hm3كA:lg.ūz%'z15D.= ϊh)Owr +β֦1H;mÎg8Wp ^'ϩ1ĎԌ SqgiQ'f,䷟O6;hJd~f̙;Զ" +_q;ڣ*RHN[Rjgլ ]LB”^58e:vS KCϕ_WtO֮wa0), ) 20*5j\PUA/BKѴ8FՔ&Z8_C"My(fZ Mڙp)A^//2ue&"i- +Rx.7PҞ L[Nnf1(Wk{4cϽi-ʃz`>/H\&/(թ5&vpH.GŹfv,k vSY$sǑ"NxdDŇjkeDNӵFGi#=t*mbO;~?-4#b56>zquH˸~dFZr +-Cb,RNET<\;m(+GIS^d.0N.>йE{?_ +9S Ud\0Azyt2b"bŕ%N/sUBp J~ lnlj[9ےf^;4H]HcdﶉQVB{QhF);\66i ]Y?qOvz;s^$X'Fh z@Ԯ?]WպskY)XRv9Nȃof.p<|vBũ:L|&G>\rm21HeiEt@LQH +q.Jhb|y-{TpIf1VHM+hixaqwcɅmb%G*:8V"k|Yt !'py`6!sq\([jCwҞD:Ç@ĺSZdK%^TЬ>LhP?LzRFH,FƁJt'/OݻիԾњ| +(5Z5?)axLUt8ºzP:rx(BKG^9McȤ-xgn +~ҹRg6%K@ jS| ::vGU"˗x#f},(KRvT!>h8H}<帵D,h/U(ar+_[s 8ά/B(cX/$+try9*iL#)c5ZN3Ĵ̔ +D*9ql ܜ߲&3XL +Z=qPX R?߷[L^skbbݽ7S'x]gpaؽֶE1i#h7FAgVHW~Efb:G*{m3:x=WotO/եO͆ep8?ʌk%}Ka cDEk_7?|"޶/-gLxGy6UIO!qRf},!RH M +HG^mXFICW(X6"!fN6<"vDGBE'_B(\s߳^ӊGcIAwJVSS%rTqC)m⊣vbLi$eB@YG(=3olVp~GKr2BQNAV; ZKVsˆ G;")$,Նm{Q Y47?Mi:? F<ɰiDEdO^ŕoVjvYu.C >q$Э@X5$ĨMxP3,C6_,^,v"E.*]wv41}3rlC^Sm2s 7Sk jܿ!=1:県IizY~L"t`x#s]zv'VydWhv{f y%EܕM,ᒛgK)YJQ5ұ9ŏ%YZr~F_aes7k5mY=|* ]bZyES=1M$vo!,ndBۧqji@Ws҉∖qD3} [f)@L9FI烎陌Ce GxU 3Cvv]^p?BQ6I,~IcM'0@N_Ko~;%Y:hꕽ5U ӇS Wn[D}0eq endstream endobj 2577 0 obj <> endobj 2578 0 obj <> endobj 2579 0 obj <> endobj 2580 0 obj <> endobj 2569 0 obj <>stream +HWko_d}? À؆Mk`Ŋ\ElI.M.-g{K"PdΝ{f̙/'B-N 4c[ʨgWtswӓS:a %7&b2N,Q-&MD~X<7`8y'tN!LDpoz9]wq|O#'aY:.Op sicLCg0%ۜw-#,)'$TJMRExKfmv4 O90!̓ز=::fp#K'd? C3c}_],GXQ ֦ifiV`c}ҬÒeg4G5yHѩܬHlyp$ ]KZ1F `'Hks~n {sJLP?|AsU~ 4 sO'ḛ4,V*ꧻTQ8t+YmtyHJjA1p&C@ (9ӄ9,mYBiӬ e 1#QLAM +5@!``Q)? /'ZE?#yE>n!RN2YʃRؤ8"Ge+\\IJ{l6,S ߷PkW G$%pKБR#@Xo{q,w(/Q +@ii+' +1C3 CZhwah@5[6,%Zź&$ m;Z2132b[v43ŧl 㿧S5u3=[;{Y_ul(Őq-;0 a냠OOy8}a(bEƘ9p)}6 F +FPMx8W84t9},:N`he?xGtNs-fȜB\=JCVR"׋؁LԥΛZNDi1B %lTfhl-3 2:YCeh2d$Tɧ2,=TqMD2;徑Gݑ* #o^"IVxDY&ۧޟQ @,F |XP%oJӔ FI=KmtgR7r]]O3=4N ?W۸'Y~N%2Aϐn?3= 7F4kt$JWNFG_8=,>].<0cֳO \|o#4DD!IjWʮ endstream endobj 2575 0 obj <>stream +0 D@&R4 DJ0t†K0:7԰Ahzye[vf'0U ] Z\`:ʷH|}֨k \m GHv@ ",{vHA#`LOQ>[ ?,ʞ,Yۺ6̗{ڼ݆nIgds[X5~40x5QjnX'S"2ؙFZ ʐwX'{VJW2jl yY™El#yoNVi^tGfayI)Ș~@lYhNX")n{Q_$3xQf8`nzrDrs ȩ:nXqac% Y*pvge?SMA>zN{׃;U}8'j˻&WIj8D`T$q-bj/{甿}Ci:T;-q{S)sÀB +Uh `@ ͚汖(}#;d:0zt$8GB"m&=.}Fh RNfi3p-g9JGid3vr9J &n93P҆loV'>ZTEf>l]!vƙ ծa#16(0:?'M^!HIŭL25k^b CA)(G[b|4t_h3- pv^% _qqgݽ=%PR77*Jup*A~>h +$<,ouǂfW &)mY,*6X;ާhE?]֖s*֙E[}GompE#3JTjvE[%%v05`$0[x(+K}_tf23{0MH&)&ܸO .\3%[n5@C5ȑIp%]"egk:N'ןc3풌YͰ*|oz*M +{l+QdWCőZ`="a%.0bqG).P'A5 + n PDt#+f &3Hm[ͩY;˘7  .ʲUӢOwWEߘӲ~I@~pJh<o޴M[G1;;r~ڂ$'akVVp r6zΕNڴǡHR7`Bo9A2Ϋ2u꘭[p[˱%(TW>b(Oۭ|XEΓgs@qMIT05] IGDf O3p"KE. W}1.ښJ̜ { îuP@m1~++ YnFMrbʅPW{@=&U$Qf11l E`z;EAp?f/Tk8A`zL]5xS,k$XdnVj(hxo('H>:Jw_*JC̿Y6=BΫ)9|=q)u+kџs5zHA*gX$Y?e<Wgmi3T+k¹P3'pI/f^yH7*甁9_j&OmQ91Pk4ng[I@MSES$+;L):ZٕkbhA*7jǷم3C vS@y;VkP;Ȱ\((1 (ou; yee5v<wz: +;##T/(aP6IMu1~eBWL;T&ɷ<+Db!619ƎnO\(1l?^5[;{ؒ;O.Ҏ*%:{ur{l J $YҎjq Cp(zae2 X5=<$|m%ƞW3&f)(Mrs$,7It_by+y4 26Cw0TR7]}e+ ?+/]/ٔ:Mbo"o.leIaX#ՠ Kh)z㞔xQOk^=_Ų }aLoh ڸiP^ƾSUzʒ%t,g;"7\ H枧%,{s!ن13F4ov;Ng3#ǘL k^AGu_&@Dtj\9VOI/F8 0ͻf B#:CWuBǵ놆 >[ddL(p˦=O=Kb~I%Q׭&@- +-Pbh8:_V%s6w/ԯ zM`O*+P2%| GES0ɃXN@rL0dSs:fE1YM2A*B8Qw|[\Q)̱r'GKzoљ67HTR_{ =,R6͓FE']x^bWҡy ,Pma;CM ޫ*BzVC`)# +n9cpJ + +)P3SD_j~ΟޛRC[W_@j>܆kDqsDpI&yd. 8VfkQz0**;S5^h2 }~ xjØWᶥt!lA*W¬xHxqV}$;Q<<C|`9@\&ξ |W;d4Me`RfQX*V}PYݵoL%RO7@4x2h5[/`+A!(PQw I|d/B[-p`@2E x?$nyԩS^9Bh!)p fe Jj` BCe0Z(S/T#?8d)/a@dqd/spB^b%rk Ӧ:Kqd96$HgPR{fNDyGܽ灄:Q b^e7I|p^RyȇĀ0:!EԶ:ՠiR(_ +blGGtX<>ymO1=Bwo;8 Y ц[…-_5C+C_k} +Ur KN,D}bVP/$UPϚ}NF&wA8'SE Ѕk Ml@L& m(W;N >2v$CM iY4{qmZ8cY؃{u-;xU,>tZn@AuBvgA2 ` ,/ H|j5%+;adp$(n4Fx)G uHB5,|{f"+~n&(Rh㌌j5'-ŘD? k-5ʸI|uR8uDQ0ЙԒQѰ^ŖBU:%]~dܿdR6|$f__'oІ{4;VJ6Ug~=J3c1Exd6g vF E{WvC(Q?,gޝ%pjmRGda:c{hDУm<: ݍY]}1[Ա ^ rZ&uYqsAlC_ KIJZj /L_~չ*)~h2ů lcz}mpVlZ n'7FkHldE%8%!F3]?ct/Sh O(g,a^f@jsN2. 61MXЭ؍YwVV_7s*?Q}:0vp{Ҳ!OP82Y_\֖!^A 'kF{J'X&>|JjYUfbkl2Bs\Iun< S avAqK0\m6vLB9+l1Vߐq*Q1Do"$pFeb']B Bhjfo&u>KuV.9F,}2tX LRu޹1Ñ\ ~LjXz%n8s+ -uߵj='=LzM G#nj#ĸ^xҕjiD) tF&ʱ,aĜa::;vXc{^^Uc kASBL::攱30+Wb4^Dz-oG) +8 XtO5_uʼn0dFuUxՕ!:H }lUPS ͣ2sN6[pn밉!4@u3#g5j6I+(MT|̈VٺUODө*Gp_zk@*%Op^JHKHQ nHcP du04k<\HOsXa[BX?V0x8i7w0|%+X~*h,`63vH 9aeK6:wsD #n1"&=%̖q%͝Cvv@gĿ+\U^ơȟ]Gkz# \cIeg0j"#Dxg*=$&iCE# ?#@-ZSodȚi<;5G1ţhT 9ŲB:Ӹf;KL._<ȬExÆyekw.Im< p=%71IhvD65}Wa2[Dof?&9™ݯS aW^OOMW/U*F^E}XJT2L]pEb"ڸ@ЈbK0Ɣb63/\:,?T{!sT).dJZFͅ}dž1 $&̫q,$M8yG,B;t.sѢ$i4~+d:Rg_䨜Fzf#+ DgKK88(RӛZ9G[P="z$tOq֜SZ$~Sէ\LQ= $}Xxs$j̓˫||Pοq+yS8XuhQF}.&A왐Dp3zG^.PoOux`ӶY>Cp;`9CK`;w\T`qǀ97 \287b%bbu&mv99tc0/G 2|dxSip+T ``A-]RpCG#ޤ^yN3W`2$h>4~ؒ ք̌A]gU  + $,zˁlwgW;@5PwRL!7k0=7y,*$~;q 6kд^Db]+>$x`'JOOj~Y, +oQ|Wy'@w jz=xxsprTZT|/aR{@x8Z(MRJD0 I24]Ef͓`BX;p.Y.ĕMRV?mqșU m)%S@ V +ҞЋB,(=K 3u&RYƙZ_ʛy,{69'T(S;Gtde{O;+$mx]Q눽6c +lI@cR=<q2yb &l)DLĎsnV9a +EkZ9h f`|ګNs4M>ף[//۝[,$|YP\`:}UĘEԏZ;aof'QHbs XD룘HK+Gn|jr=v(Q7lA U]7`FDMSf8^ O;N:޲2 7nPF@fG`{m{u8_ M6)j}X˨6DbA 9Y+"KAU1M5t7z Yi2qd= {\/PtMTrO@Ԧ]Q4#Bf&8iC?J{V t u<-`@H, GNɞY'8εV;=k:^p(ʒi4d&`~)Pf75[ Q篏_Wr}Ը3u'I;"#?x-çρdCOaG{!s-q T_6fa ,!Bb^ jڬ-1ܿCN=\7gݨl4 r눋n(qʯW"O:%, xVQpuP^>UTY_U`;c}Gb9O\abJMI ̎F7a˭)`B+wvHnc9Sz T MnrfJ$ ++\ֳFن&nQ @:.3[oJcEnhφ䟅wuFǴ+ʻ.u!ur3 IQ@z;D;E}ԒPO'dA2[_&Z(i/NB<3;VLpL%Oћ8ceZͧ6yZ~$Mh\2rRtb +|PXGvj/=A圔&KLňsLZ0(0#|4>ώ"ƸȠ^}Z"|uC#\{}w4XݞՇ@12̐μa|;(v<[$`/RV;Gte+Gh]x[@Bg4-k?Qz]#zĽf>Y +{oŌ85 ܫO7r2iUs.kKm4SLoy},nDgݙU+ ѳ",Z'n Zvvy'^!: 8uAp[ūH aՓ&A=~p s Yo&R, +Q+Z5:c4*&>ح\؄edSY6* fRdFT>Q'lĊX.d3pĮ퉻vPMtĎ6\`_ J-l^$ȥ!eUNB}F+2_?:[f^l*1, UεX%"`/PelRj)K28Aø Uֶ@HVtɞǑ\pҗN-YZbp}EE \Ҁ n\{Jљm`aLt}g/Qm "$sMvMT\k\YtihJgeWI<^8d!B$R^0!sAoÚ/hs?@l >FSµ72|'3Σ.ps@!2*Q6O7yDb"a 5WN^j +0uسD[X#^My2ڡM;pJG}J&>XAFW Kl -nXu_V\hۧ'HzE@.z:c\ĴZbRà ȟLTΔkVNSk*zfI#bOmJti?cwHl{y'%<K^xUNCN>fPPV_iݶמ k3 =lh $S9*V,b&?_ ra +FԼT?G:|*mّ/@WM]GF%[ ^,oгFY,;O6M f0#йTjeZhDLwsOڧGhDOuGϬPSOr:R[w?(t G~\*o}i +֯@mVR!k {t&hcpTgwm|O`GHR(oUj@~Yi4dI ]¹냾xNWfd. X5༮ـ;VI+J%Q[SF+8fNBIj u X3MM"2vdjxs)͑zEVGk!򒞓o;\2'6(Zjf~=& 4ޔOSpKj,ȷKiЯ ;5rCEM=+raA8SrJmNhብ #ըGLN*/;}yKRhf](h|OKu[K_CG(Q@hM S--i;a@]C]|o:7-׷Yr4~^8$p3nz a Ic8+aA3,2M$ u5Zf73qryoP([ؓSN(cxƸC((8BOPz#(aL,DDU8dVn55ꙶ8E%@jqy{өU};H5lX' KC57K%R[]SpQ뷊s>1+&mKtCr#iZ[< hcF/EIEZjd9pƦThiExVd!`S/:8UOhKڏiN|#%"tǟP?֘@AGwqrxbpp0+%8i!-)ML3*PH͗Z'/u00N,$)ZK|aQ\t$DJJ4_N!mQ. +lAޡyP6 ?M2<}Ur؋9_?yQ,I~똨ޝDi`Ͽ &4Udj >CON2ƈEP\sҮ= W,NV" S9G]_vJ80KFy?*T/ռz[AA}4lv6,t˺X?sV!AoY'% +k"4"޽ЦlmpjSnk`g-I2e:kTS92k3R8&% +[lrPkkWp`@O^7-7A2s~BޘP)_/[d#F֤j>1SBǷ*GD#Q?1KeCkn/S?~K3+=dȚZEk[J R_KW16W0sqc`s +zBԙ%82~K0ANxA+dt#⃲+qsd-6)ei܈%t e#^Sv/Q/o +`9 EE1zAHC{msa F_x{m^E<$Su1 +Ri{xN0.iK-kmit$JK&ކo9ZR܈6uqavmKs=ZnRSDa@y]s #N6QA";x0Js)Fm̆q +~.xch<2dB[l .|g_pG^S/vi1w%+\ 34YgC`HKU{쭣NyD1eLREհB1٢҇co8Yd-g.#74 :!- aщ irj0U|HvBM*` *߷:QΤ@IJ?? W41PX +_6o52|ە$hNu3꼦N۠&P N^@ #4(D9BPfs9N jaKl/T+ |P_J*O^Ͼ!Vh]aS6yt5}! ZݷjuJ@obμ :]c+|^T?ǀ^GbXe\*lt0*2(xsTSYVՌ.?R䋖ɓ:՘ϛslPW? !ut@\? 31q;hv6=N W7ce\!E= L,oꐼg.$9ifF_͐"Oԋ4+itCk\'SB.ޠhSIO K;7.r"X)jX.0tf\׹TMoH5~|y^LI9a!euƓ ?Vtj-+fRQ@ +ϺH75_gJnJO\ZGtJ{C +NYl'{>Ek.̺+0A;Z׳^RøJcG@YlGǡ-w,5Pq^q ʨbL?v5`2B>&-ѹ=I$ׇ*zc)pgm0s6)縞zg7O1eSٯ=%k΁O Fb>Y7[EFbo̹t۾," seɳdݬ݁iW: 9/AQ=FܮԊP(7N NS"P_M +ϭ-u?; $-~ç00#?w(p.h j[uQB %dX>"qdcM#LH)J ߆LzU ?E 6 JjfXQHpˉ/5$O4iqm(xmY`=WSm7\*_v暳ds`" |v#1DF̻ շ~ec ?XBXcZ8x"gEr8/ơ@p,>WPUazMcPrw7f +o"/DvC07.VW_,Uǩ2_M4l# R.2i ~9Hv4STmS[kidpX +}=W@3.3i߾*tFBԺZƒr}g3}oQD[i%g%_yR"nɞQegq<Ia /;!&nʱ +xe vLi~MA]8َF w1% D#DJ2H@ 4_TW XՐ H7Q,cl̛8ɿévpa?H^ *I3f;о6|)6:;tm#rp!IHg.Di*7v̉sbuzQ|K1|1 +*0əH> e=(Q%EQ̐l'" V sQ%1ꑐZR@ͦ =Rk[ e5$r9aoMI_1MR$K]rY]7'7=O#גa1̙ߊQ%\`Y沦\8Y=rMбeܢLKw)ӚGPB]$>fn;fp}̛N +!j[@- o eyȌ䞿cDB{#$;|;~,|$0p\@7[}|f\'2D- +iv>:\)x? >УT#qj 9 'emV +)7~m8$m aC>]$x.L +._wy; Q}q/t dR-(Gt #.EDXSbCz[)c,wna=CY;LtJĄBtg@*#5ͪ!PV?aL&:,V͗G9g$6gI8TThPS6(gZE6D֊0:ŕlG9~_daWG!@IGqƅ?k#d:!d)"e0vBe4q)Se{VP!Pb?,)CP b1=?m6~dEZxR[/Q"qJ>aIiv29U=Ts՗dUWp2z);ʷĖXLm^?Ž +xݙX@AӑW:֛KqE?We1>ٙ>PղG]՚+8Bf*)vEMDfVk"\iu HO}؊av6@n;˱ȝ +W͐V $k).OA~(APn?e"ڔx +U>kǪܢS XGV.y-攏rקsؿ"($ϲ*6ʳ \11˪9@PD +<$3An'Xɾ4,Ѷ8YQP,:C7NdFM ybu֧!+VW\=ft0sx0o[aCћ8fl>UHL¨5 <1́&$Yowbr5"N<% +I ȟ-K͋.^Umޗ=FPޠ +tYb꙱k1|ύhDD2"Vck(]Ox$:A44wo﹐נ7~y%dŽG0zꠀ#bu Һ G0JJ7 69cyz&7vFr:ּ-ph;aң'S%q`B-l D_o5 iDm~"-4Lǜ+v2j\9A̪d5<@A#3[+oI\j&9IϫJ[`m+e +GP?*߇843у߬0VkWw.P5a^o"Y.@p,E>JRCmb"D') ̷Uv/5~D Jwl[.$yfuxAAJ܌1Q9H lV)`k&1˵8Fw?(W0rώUa,y\FK4=p.Pxϲ4B鋽r뚈Ve lf)?["H^?%k_.=6ӜqłJς_pu!YAeʩrZYFDfV)Z H 1~k"*SAONllA~ ٳO c÷i*:g%ȲEx)l5b4zhj\7qYߓf=\~svon$5/ȱ!zwY?~&Q;*$.6 p%p!Qܻ6 l(T0JIoV3'Ԥ=(-; k-W&vetǥ&xd1i{&Y/$9'ډ+!uLCpE'G&ÃTTӊ' 5{N5ɺ +3ǘ,,ۇyh.P ?X8A rc|߃6A;;F/fʁw+_x +v>WQGͲ0JE]2bdxUaEH,\Dт//Q+6A'Y>!Rx?(+B\{9ߜ`vW-* KLghǬ*ZuRmmcB+ua̍o-t7ϗ%R {gQdF= +Jj98a3vQ6vjQ(rcr?g.UcՉy~ |UriΩXITd 1IaT' +OS(ʃ(UK[ٓ5YhY:ݎ՚hGSg_'I6GvCkŒqmd-fوxPlˉc1k6>>gcM,r& vwlL܁EiNL]u?J~"U>-e Y 4Iu4蟱lwEXhz;zv[Ƹ ʯ#tl Y\rS0կ 1Qɢʞʾ4Z|b ^^`ϛl=, ZYSֆHN2%ӁM&Pwu~apTږS<#, O82#9!_ȉ⣪;~/̛o^}@Rt~XO&矡8 #cwUWEtD + +bQ+&NXW+V穧>5t8Deomz-!BSX?\XyoDǸ2\AyZc/0 + -89 =lV0)Z[<=QSJ2c!-aZ㚾{6- :PS+E(Tf/|* aݕS,vBrgx'*Y+]l.Y Sk\FDUV1(8yVghPu +UJ#[kDY&wx(BȢiHTgPuٺЈ~1ަŗG8&+e{38ZTR61-^0mg dm,KRkZMvZ d-,2O/0ff(O1e-P+q(qUekBhm8CDIzLI!Ka;~O̶gK hO=~o/$W(SKD_=SZ g6Z3%H{=h5]. |B> 5X,FݛbG_4z},Z$Z#1:BܹR]Jb:x'͒Ĕ>8ԠݢJ8@dx.3g-]e:%9d[b5c+E.흒ok!/pIi 馃/m&,8;z +})VV +:y+XРHo`3om;,DXjG`D:}+,[#) Kl&{bogw= QڳQur!Y#/hMKQL('+)FЭ,>1=yziREUH@X8UCYʮ3%thu1S׊>:{@1C<(*i>_RR[.bn;TN#-&<')1n2rkz߃60mC +L zr J1rtz`H+j]C0Eki=2q1,soJ [7@0NO]tHqc(Tik|rp%<0B^\"I*F 񇧼g*$2fl{[:8u[eД +v}ݖ{.{H1 jAm{\P۩_SBeBߢLmp7!]t#\{Qȣ1(S*_1F;F#ӥR/HbaƗ/$.79o_P&at!.q$&&zK6@ǯX2`jb@8Z:-!,fBa@$" ](.A$#Sy +D7Ť 0D>VW[(o3isf_hLhBs50IGwT_UvޝWjeFMc#\N ؁%΋rNkS^P/Zp–Z4Iy\dV ٣>Y?` 6UKrn`'M +oIFa+=1P]zo[://T:g+81wo{[ lj8y(Km.q|- ݛ@{8BQI +iyˆyO7T-fU.XO,g~sf[|z_Ybdy#@;쌒hn?t+9$)%obju&&р@VPCgCB,#܄&W ]ۺ|bAøVsE/"¾KC1ؑIn^?BkϲX3!`| l͢|*}Ӥ0|aDaY&Q?*MyWDO\w*/tL>>'C ZG.[P8,%fq^ wacfB2^Fc9G䌅-SSUҊi]jzuoCηҾ/w&@Pْ Uqi|i_DAzP/F8(kf16,9)> endobj 2571 0 obj <> endobj 2572 0 obj <> endobj 2573 0 obj <> endobj 2574 0 obj <> endobj 4894 0 obj <>stream +Hd͊zy8 +>sRhF^#y QG#Oç==o/ϧ;c_mӷKv|~_oo~y>}~W=|z>{O݇q~?>Ï?o+~ߒ~;%zΏx߽w;>lp?(O?{wٸ^ PZUuTGu^5P5FjFDMԤU PjVjUmFmک]uPuNNE]E5|| _#_k55|| _#_k55|| _#_k55|| _#_k5Z||-_+_kZ||-_+_kZ||-_+_kZ||-_+_ku:||_'_uu:||_'_uu:||_'_uu:||_'_uz||=_/_z||=_/_z||=_/_z||=_/_ || ߀o77 || ߀o77 || ߀o77 || ߀o77 KG#(~? +?G#(~? +?G#(~? +?G#(~? +?z $߄o77MM&|| $߄o77MM&|| $߄o77MM&|| $߄o77MM&||3,ߌo77f||3,ߌo77f||3,ߌo77f||3,ߌo77f|| "߂oȷ[--|| "߂oȷ[--|| "߂oȷ[--|| "߂oȷ[--||+*ߊoŷʷ[V||+*ߊoŷʷ[V||+*ߊoŷʷ[V||+*ߊoŷʷ[V|| &߆o÷ɷmm6|| &߆o÷ɷmm6|| &߆o÷ɷmm6|| &߆o÷ɷmm6|ۯ\t;]~~߅ww;]~~߅ww;]~~߅ww;]~~߅w߁w;;|C߁w;;|C߁w;;|C߁w;;|C߉w;;NN|'S߉w;;NN|'S߉w;;NN|'S߉w;;NN|'S ߅w]..|K ߅w]..|K ߅w]..|K ߅w]..|?|x>stream +HWkk_јt}ߏeYX{EH`=ZatOlHctUz:B8M(jP%J _o/iK_xxb kVwPIyZ7YKDjF4o2fx; w^\[͏?}݁O?}` n*u!*Zn7C+I)Ly+`k5Q `mxREQM,HFQCtBSFTO5aXQErCJk*^d + +l/`<2~t(K ^x'l# +FđSsfC:Mwn.c Vۋ7х`h2Buo\X-2bMs19@@B20$$aCݗ[d(z +rR}? p@q,mcFZ3^"TUDk\W9kc]L2KDneՊ emߍmj%M + S>>Y9_5V]t`ǡA@"ĪTέ.H.τ˕UvӍcwXLλ%D~Nv]YH?V|xZε5,ՅvZ4H)kNύR-Ǵ Y !(l))gz Kôp7LS`'dM>n̋<sF8^[K@Nr:rĘprACFdBIaD`f%ٙ+>fR͂k=Q\]!It #>ݺr j>cEp Ā+Џ(/lCF8FF\~"Z:O6,?@Y@e"Vf?>c#s4a/A8^RޙfMe~LqH0%m'rU+N+ T1?B0qd'fz'*CGk0"[> +9ʱ~|or"4Xy.:>9QcJ[4 +6D \j}Ct,'sS+&M|G4?1}$3d.,^w&)+'\W'*r))<$u.]9z7v6_b˚ڀj#e'MEq؂<燁'YiB#HSfӮ9>`'aLi8hRԤ4H*Wjؕ9@mD)&l32S@ݤLQw W)b1xb1D+>c1ⲂΝe1MB&n$̑d\/laQSy9 ?C{qN?יQayVeׂ$lr\GC׽>;cƸpfdDGw&&xgy㭤¬0Ыx-sg8gY1Ġ9 O/uS~2gvW{yy(b/R2n)pYHX`҂̰#ATlay~>uqr̯ 0j7 endstream endobj 2568 0 obj <>stream +0 @@&B3 @{f\ /݆V>,دg7%=Q>b4mׁ}4¹<[Yi\%*.ol%ͨ'4͌ V| 2y 5x9eݐӁt?J=MfδZOfdlUؒLt#T^B+wf3[5'G4Sjw_ƶ@<ajzSXgYL$T? p!XT~lGHjB/pIngtOLu2myg,FUfz L0}PTDLΊ$ctιɴgp]mtTN܌Lѓi-D̿a} O1M?FxU43{4LMTݛzBtfThzp+bnOyk΢Cwf:ŜVdװ&\0{BEvLڭ)sٺꋧ&qpeOHHB*97aI*P$W9AR>1_U&i古_ىWA$x0P?.0L4U*j[MMC?,vNW!/.)C?vNհ1&C7i:IRK Ъ6?'g2 vK + 0I_w׮NID]ǞdtCt(_w51;M/Ǩ8>w&V8ك)s|V~ZY$J ̋$W;W 﫽h5<]V^3`zp4Ş2z +r8$HON.pFZm#mIh` -`N4?Vر\eO.w5Ċd;PfUf5){Bp4`nDGG+}RY>~`IIaPMYl݂ !)e^&i<EAk1%k)N^Ir|Tw ۔\ӗ>*_`鄉<3a]#S*Fĥ:Ipp'\[oӛ45&,!VuM.qlZ?DvD2cS⬼kM)<x +xn}uքY0-ctɆkx{E^UXEkk/1N)3:-^@~Z"7OO4GF:`4摡W1=GM6&~ "p [W9a+] Oθ&yS֩q8ѻxL|u#ðƫeѸH=zw!~'z)2c_F5CwHr:ֈ-{8lj̣^?D"W(%9! +TerQ?4ӣAVžf;J eU =t}PW9J{֋85%Ռ5K>ك0*8h] +'.v5QQen`h?CuK<[8 )E;'_w>{="𜪝 +W҄B1[GĊI{N}~3EUTP'nV|/ UjFk8|6>c$13wohtYןt= B"h],eh뗱8Ƙv?m#jo/A:SXvhr4*0~4ĂP}hCMu؜;AEܶ3Q%-H" ݁}t`'2;$|FanP<scQsѫA!m>s7#Ua4r\oԑ2lm-{IEUޜ QAK؍ݜJo>@ԻԊR +%p=.m"]٪ap- +:ALxeo(IB;| w]^"r )7}$F8u=[U83QU :4\e>Ȟ]h +$$`.LJd9]]JJI.M efm';M{\G(Vq_1Ljf[ jTY/ +< g|GPԒ[I&ipSp39cպ^ )2l bre P`/l1kq&ooy?;A&4'Q̄9w=cנct&!w#j6e$n2Z"F_fFD?l"y +R`LbZ'v`LpμsI_+X& ¨wjdH+6I!pWĊ5Hj9bm9jsu$Yf".׏.mlq͎bzk7?q!(e˦jU 0Aةl<pOኩy/{p:i1sMΛHx;^՟) ޑjfA?ՔhV3Ϗ7xIZ8A[o){R(~?=? č{ۄ-f ]UzQ"S7@hsו(⅜`Q⽅%4o6C 9M7T9JUsd󀺈P{ <ZgE M5mp'Z5ɜ'ٓFFެq^9d1"#y<zXlDIMS]B'c:D=-#%i<=fCn:Df}uCӄf#[HwQE+)Va2yqӀmH2n @B!@zJ..88xjwP*2t/Yo}SuQ)<&ZUN *]KZFgu^1(Zxݰл gcB8&`'E +TfYA>8AG#n $2zIvpmÆ_eC?޲UP'*2𠸛ܸ@S@.X>X6=Vr l~U$7vEwnpm,T7T|JZIh&w gղ/|=P"j;RD5*fG$m[ʅ܃%sX4[{qY)lQ3lQ&Ȳ}TJ'J +؍z&%‚%C$0ƌPdͳQv3QdgT@*~ݟKDOYjV fzlZKS +qn4@N#~I4HT_xcm[Kf:][ݽ99dV+;^H?A΁P#2>R4fVl#~+l>6ګ U\֎?tcX.q|)24zظB_..-)4n Wݨ|CL +f\'j $>i-6W`],0Y .T3WDeؚ}FۏsL&uzg@%Uҭ}ci~7߽XHŽQ]$jiS,\S230R_r}R-*.yΏp/2?c!]Zl}^Ά:X_JpJ/apt +sZ$>+T,86$F1舅Fv! + +@fQ6jbno13\b5dB0M;/HzT&eY1ҔTsC>Ʈ&mH2Ҭn|\t6ޮ4gQ?s.bLGàUgkuu#7.l؋L)Aq6qH!h1-b@`@"s%7.;i +R$5;$ @>#3@e]߭әf;Q);KQؖt鰺ߒEQAod=OP+Hɗ +Em.,-n7Ì8ظۢi:yaąsTC=?wMyw]CXkX sڍra67٦uJHjDS{owFA|.ui2D2 -s +. [%Ե8Gޛ5cFVzS̛r?IRr_ݷY&RӦ|̭hG42hJg1>oLys${KB 8';G΅3c6_Ҫ8fE +Ú80)d`SNZ'( N> :AE1^<y%xduOL`F/)17[8ķ'@WFsXi=$GCFqzBŬj('QBfX=jԄj-Py8š,;q#,4J-EJ{teV:'ynVhA<*jX]Z${%dW \"`1+CNnߖ{2dbjJ`SO(:|̈́+UT\bni YHqX+`C"GCv>Sö't2|{^-S]Fd@TJmx?s%!?q7 ښ$hxu PR=Bo~ > S:Dfww,vkPSʆ +FD/Q 㴑3(mtľ;c zXVe#\b>ҳtn"cQ<6`Of! +ҳT @%̺"0­D?W֝DIkWwW7Nlʺy + ړBRi5cuг0> m1uJwL*0Oĥ쾈guoQqFs0s}XŻR׬ !^Q\ڿYX9Gޔ%arSFh}  +_veeW$B5S.яbJoWcN ÅF}9k8C H}|6г/?Uj էFnuC 1 +[~^QL(exiI:8 z7ޤ' g)cFZKt=)Z)2 Jw(o>{206S;BuyQw`e`aǵ.:Seʏf- +քR(Y4 iY9s2|n9T>Ϊ:sC}_[!؆E6 OJ짪XPXiM.$p7ai>XfKˮ Z(f(p vATZ5Ox6r R#OρkNwѯUπ"4f K26+brB{#4Mϛup+9}  +U.V"[Đa$us3oKy&ۚ")+, LOPbh˭RȦ4V:~s*g +n98/PT?'ؓXe}'RW]9xX6r9&pQ(2PRAT܄]cj %}}>EœJk.Qě`^298;&[`/aL=kIјrlyqy8sTq=g6Ӛg!\۪aիU_+h;1E*ez +_\>$i\jO0Y LPڟ3GJ'TOV.ꐆg˂o8pK $PIH( 2;"v:QdN{uVFN/q%ep%70Ɣ)Q]!6bbpR|:zܩ׌<,-X[}i3 +IjCp^a>iT߼Zf@jq:=>{6^Qp?:Vw SP7&jd@$@ȿ)&آ4z*Mnoѷc62-b\<.p1rd'؛,@{$K_;W+#`OFG6 +2J2 OR!uG2VbgʐB)8FSZ<Y4O݋}g Pߚ֫ |meh{xa7Ÿes$ؙyA +0<Ҽ89+y'1ݩ! M_^]v UhfUa.¤#؇q3DWS d:kFf +hNn}0{f<ۼb=rP"OmYDtGPQ`Wc7S7@K$X̮- Sx[^~q#ǂ |-E|3?p 9 NY~B9kQE|E ~qeV,#@)=yT~?x@]S?Iz6PE#k&)|f˴ǫp&H%US}޸9+!P XpĻ1 |vt769oRtBN7%xd˄>0&UWĝ$Baè gd}!OnJ JkOVS=p/FG/?#$?y}/Y.֏`'ye FX*>iv +EǸzY<bjIZ)3!z|9*kb{*y̱j08chi ׷|WKxꧦu@Twfp!{ t`O,RxmD[gӊ#(.:0l8kOڥs֘P&{Vxۊ{2N'?k-3'b}F#%̵(sUFheC՘vZe{\0*-ljTcqa~ju<n뙛 ܐȝ.긗0^lix47mhs.;(sC  >M:f5L0]>ifaTb_ 0u]PօL`RW۪{; PW rwxI̻}^l丿2,RpYU6ڤq p>x[-JR-9R&&ُIVJ&CZ&D,[8] 5o^Pw. J88ܨeP<Gٰq\#|bZ[3@~)UNtg(Zj&6wAMYOyB}jaZ[=>= ՎM';}@iUIR붔RѦ}f(Vj ֐x +3#3ȢtMH'Ə oc/?bhQ)/8~a,T>x j:ǂ:k0@G/tx79`| MIEGA*;2|fiwRusǡ|F{)kjwp'I]s4) v=p/bG֮*`b.$%^}9{[ MY#?yޞ1]KzX_Zj.c~ҵCcM-¹"!פ.p=!.j!x3>Né3ue(4e܀+M|O T4M⬞G?XH}3ֈġrK?p/S?=sº0a8iъ7W),yKSV] ƪĢN&f40ɅUPM\wPmNE7:̘L%̏s_ɄP˻oHW 2zM+~U\p8h ǪqM%@uFB.)T7pyӀZkUlBUHsW?X_J8R~ߠAò.%~Ӫf,-2 t99 +Ӓ)/ΣhS.|$=V|E@hFyG ֐?_$\]Ik=@-bZl  y8 -溓<ʈש2'X`a5ڡ.SZE+Q0 ,!W0LKڽVQ.U&6jHeŶHEx 8 F  JUHoh4õP8L?;g1,~=xP $ ~'*/!}C3 }9%*u@|BoPdӅV0ꥍ e~jϳ_ǫ @/Qx;;xj9kWų.*|qBP9sc{8==Ӱ>g# qĘjYn.&ؽԛT bc" 䢘Cډ2ԑ}^1c$R^ ?Fnw- ' ?GR}ؓj  HR\Ia;yi< +]!~\=,H9z!rvy#J֡ ׌6acp)ERek_B c?2_t%W}=o`4MC&p'쥋⡷ $"5N\e-$t < 3y]w/Q#BA1Zu($QI4.e'n)~ݔasOß\)1m aB] ?d#?+N6|}ƃHC:’幐okށqV$C8r<W2Mdܮ W0efLtF"zC#Lj4(C efZgI@[w M\1l6c,ջV$jх^n0$65fdeNfnm^)jiz튪مN{Z}Ή_V²/ƒxPĨV5_Q`ΠMC]Lg,rhR;v`!Ʋpe@·E)'sEN)_ +U?U4$(P*)D3F9/i|j3#OY|#z +XE1dIXL~zX*34L8 te ̡% + vr3;O|Oj>k%s9JYGώ[Ǿ[ׂTjWϬ,meD2IZd%MwF֡Ƹi]oxWzv ߼-P +y2 .-ͦL̹a#jZg,Nиy)oGKúר83fx5sM"Ћػts/BЬ~v/w +DxkfRwy2i?1^xM) nzWbxzl^z0@6bV(n4(ZY`q?ωxX#I<++Fw|h۔`B)k7 im0aBR d^fzʡ@"2YyeP +"DCTWP<5i<<5IXG)k 5j$HnwNyw#n^ZD0,עճFIm@\/Fn*h s i0Q?n|M{9hu?]+_ +Ŀj HO#ŸxyHycgL'Ƽ5}+y.J\p m4O14v뽗:uJeW "|_tQT*,G'>(KxOs{+M?kFly, G2+4툘c0i~#=(S\Ylƫm +[{dYv ݋~1#dkb֟h`@7K?ޚ|ľ±Ѿ, :9(]PJ˨X:'TYC|ݱwq rWe`a8=z+p.}8 +pVƷMQO +Eu(tû 8e@ڝƁCsĕm/6.zQb"v(!5)M|+$U$'SuJn{ (Q5;j7D戲1Ek4(,X }j[̃Y,>}~K.JU ],,.w5K]~[@4ӎu]!{/~ZR"Z\a4֐ +Zdn$ dR&OFJSz{8!(4WZ鏅8,`ڮi'_H~vkꮣ"l>Br0D&hcs_Ƅ ͗^f֬œ*~"# svXVt/}ˍ} ʸ!ZsXyN_YoF~_z8_gV_8ԶS]'0|ԷypsPs҂R72Tqa@f-8O%;60ev1oN~7t^^Ӣ)w=7If0"bp}̟ ف,>5rY9Kz7V?m\Dgp:4vlvN>&Ԏ66~+aA4O3\3øf/~T@okctYjP1]pVU響7*m'0؍ԙiBЬ$Z +xH3/`oR3}  Ok#WF ޤ[2}^Q(j!*T}es2$Oaj!Kd&%2 kD ]PfδK0p[sn"5l'ē dQnsj-4L6e=ds% FS7֧R@Nr @^ 5BC{X DV< G͓~s4a5AUĤK6֠?ɌDO2kRüb>4퓦 y \so*P`c~e V>Eղf-~~HCD{F)|?"jF&~,Ixqb%HO6lܑ1kDkbHM]eB?S*Rhj 9lh"^H RLzrŶNfG{0L@л$v&!':6} `[(=+ID t P=SVFIRY*?oM E@8ʸrumz7Qjm ]9gb㟚ڈN?)M("ߗ`X.0 +_}FmbQMzYf)zb/OhHmLϚb;Gqh6J7r Cpnn)ݵ@ݝt'ŶW^k ~0[Au-b]I SrВ`nB}>BdSX!xD+O;!YuZE盤CjBȂ;5Y٧^2O.Xn@ endstream endobj 2565 0 obj <> endobj 2566 0 obj <> endobj 2567 0 obj <> endobj 2557 0 obj <>stream +HWnG}Waո0`[L Q66` gdrYӷje$UUT2VWb(!H5ڒe?me>GtלM O'_tFTISI朻O\mn>y5 r:_LtRUiB75|*98n'?_wCs?GEŬ1~wb~}݂ɛ7.O . +<N%cϟf}_G#W +nw9zv !?v*EEχ?~geӝЕUbzA+jyaz{A}2(EM7m?'?.Ep^S;S!*-jns'PEƞ]3z _YJCfwLY}<}  ytoɄRM^~[Ȋ$$ w `FP׻`+"wO&eIE@RîHZSdL5s\ RݡTZB aCZx{uC9]7@v9E PPZ5M`Ƞm,$|L#l|3 'qYIdn _/&6G2SAA!f?N,&XA,8|1*Rj>ϸMI޴]rh<9J; j` vFZep =*XH g@3!*Q)9!4`d1֢֖UʖvE͋ƀr&d1h taCRIxKUW#YJ'M~E=83GoHc#q89,t{ez/^,8ӧpꠓʢOGΠr_C:v|#OASD;5<䧜BqO#;@ydoWpmöJMw =Jx0ٙb~DWx~=8 JS'` Ę_1N1iܠEWAa]l N)Y :ќ^^8kgwˏ}?S2'^٥J;19+ ƓfӬM)\O0e;$ А8bHn ΧIOCHBע7j/i?9U$VW,4L(;ӵf7鼼XP+SJwʰg'j J {$m_7 |~&hԳL'pxB42>U` Os7hhyhZqSY4/*X]c +.S`"oUۄƱPɊ[|-- +A#/xS(`#ӮB4z!} 1"@9ՙBbŅP#vZA&5ж>+T64r@{Q|8`JxR w1K+UO&eZp^7<`N>y' gI)&1(*(C߭6~ Y)rĸ-KFElzWY +brQ| 3ڥ9Aa;UP "SdG <@0&wz8r>lk4)=*+H&at74~@H"qAau#6;}~rv=j:WP&l9ԈgdC[.*aEUS0} + 9ΐ4[KJ(0-4gNW HmQPB|^1Zz,d?xvaH5zHBd!ѐ8B880Po2H1U6,at0Њ08&^#@p$"8t5nl<6VXL`놔6<(= a8#nhVisA$R`HЙI0:J4Zrށ1ݵ[.y+'˹Vee +0$䔂.7-Xi!~$i:W؝f׻h3 cqC))Td۴0Q;,E O `Z̏k`\7_k#NaӬ}&dޓBRҷa{ wUa5@. p)ϥ\πb#6pσle~RȧȰT$C?TU\ ,htP4Y~~:)i*^X/)^M=iTa7ٷIlʭ?޾{$N,fa6`2\Ft&r:Bʏ"P2Gg>3r<@,רxݮVi8d S Dp +]pANIh&|S}4V`Tw2ĔD7 xM),B=QP:jC-H-džA֑WI0 J#R'!W$ D9t]-g{6` .̫lAf_.iVl!Zp{bXJa6xnxilUѭ+c +}d)Q l*:n1.\ԟ wJU|W~f5,"jJ]1`RC!8a(`}γ endstream endobj 2563 0 obj <>stream +0 D@&S D$N=JՅ88 ?wPuQp_ 2ϢrN+ RQŹ[Z֨{5 x6pu{qG>.r6cg*Q e6,d>:ڝ#KjJ5e[|d)eT%\ZkfXdvn%3w +`U!‰lO1!^&ps9_߈RөO[O +qȦ(HNp)h ;Fo,Ct]irqlxݾ1LThRD$r+q?8jJvwl4\P@oa6dD-/&VEP}̢+Pz^?X2_R?ט3,gNI`[(ꪨDc^ک'\~"*q'ك3AylWUKeqܞttEW湚s5 +"rj΃׻##aR65šO,|\gt}axjQ$9IoZ_U9SZLJ^NP{Rk\^EQ#B7ڠ|al TxY:z3qjBBۧSJgn9?f쪅2-,T:c:e|C!K"ɌN47fnӼot T>C<@}|Wy&.<) ÿb!ԫn0TK[)JB]!I vU޹La FhRC|٭ +;ss`$}Vͥ\Pmgqv:Z+6snu4s}u)m$iڌ* STkZyhs/Ơ{(]CIU]5yig)Br PBkkz5UuD + dEk%~QNRl00=Mq0Kw^!"U9q'mqNlT庘w`afXSS;ju4/%5GDCGlW+YZA37ݣs ](=P;pCa]efєꆚC.臸~Ԉ5^Go$y"m;]9{uD իKU.!w=!]pIy@+Suf|FSYǡ4M>=4-tVTK_O̬X6 <ڇ-D6Xv? +% ⊟LG:b& AYKӁR-C"~.0$|B )fS]d%HZX:u(!3^@A<Gh$R_S>kSLUCX)!{L^y;Ն@d=i܁|n w4 +WKi\PF ZUN*FZj$DO 䁉API4'B.ܑ԰NSBTKȪ_E !it#⮵[w4N51`IRNvS݅)*Muh{Z_gj_vSlȂe㧪kDuvAń:S<0b J=ϙ 2Yϒ¶liӟsoTk3๓t9Ć3#gu)H |"U +Nѯs:)/HsLn+kZ@|C]T6H$ҋ^$YmoB=g1 u|wO41 c1"KˏStiP]a=|[\^Q: +GQ/ qo~a-tvҚ_ޠ +θvЍĈO^QIBְ|p;La'阘r@& Q[ݙPt,2ud* *3C~IFݧ#c +³=kkO&UbB64zm<9A{!Ҥe>CձWm,^ *$SIʺœXA o;=-1_ER9|dZEܟD2\5{1jPq}3XɟUF͆p +;an~-h/H>'q|۞`&xC_6).qąaې=,"Pt~|Ac2O[&xTb *@Zttg؅'7vII͸cNL3WSV*U4_|34av(P +fkAJhNVl4OVֆ] %8pajw z#6T@Z6\\=¬RyiN Ox*)P# '$EZN!&qD}Ad :$F5qH#f@_*?3|Hc`W`^s&tOR8yg"eӒQ Ӽ@_0>U%jcf55W?A=i,ރnY*LBA϶^*DPgD)oZE@q(Nf}[Dӹ~m>4nKgi3-#%2kjr+gwqݹoox8:"@]aQ{^hWQ8@l+dY%{;E̅zϟ +hA]!#4F"`/" ?Q5P,2oz +^ʓH];ۮ^LJv XV@۱Ů(n4 qɊ#N2UEwr&LXMnv.[֔\rne"㤎7pv*zOq'=SZ*k4pdn0$ì!bc8{MRmDLw9y?Jy{hBȹ$)R|zwuFvD +5XՁ2,O `@c5WXw2zKU,ݧ0,jj{,`sl@OP +(K5^e/Et䓬?(Vjn^Z.J&A N +V2 UNAki\e'! +JI'`5̻b1h*ͦqK&RRb_JkaöO7TW9j]^at#E(M.P? +t@M @kz_} Z#iUmV0 WB1NE?rlp}Z9Wvc@?0 ˚0؊`HZz*93Z8p /nQ%Hr`)ڠ|u +GyqB%MBAk\h+8]ff49[l4)G}p UgBZMK1S +W w lEᑥr2Ⅵ_ާ( +=T-r+n}<So"_2Wd#Λ\><|Bc +Yiæ%W7~ 9Z +$GӢHc\f|LR%'sm2ĝ,/SI oE&quSfI VU|ZulqMl~Ϋ1enJP/YxCFQ$UZЀr둟l_?R7P bi+-=!6hZ/4^qЦ P?p _raaO~!-IpSd$1N# +:2i2D6α9G8?k$?[6sG]%,y#+l%cG G0/Yj/2cQ"G!4vZFV:ATC=`86\I"6,Q,V3=E_W#+- 3?pʂkB48+Zn,44e\~htǏNzF5 `3Wz ؕ.3-Sq|pI&u۴$jKWʿMퟣJ.7jZ,һKnUxi+1{ۉL$p` $4@V\ʆg5\uT`3}$lYG# \A$u`= vfwm]Wm*-†KkM@&v(nT.pta=-œtTp Jbu +)u6kє,xzJY +d`v më&<l{,Aۗ!ھJwnWY"¯+)vUC Ǽ8i= ?ޝNu?C2 kqwbNߪb2HvPn5}Tz׊t³o.z5EPu8ZC"YzFvjsrenY9j˹h:Q aF2d7w;B_3Zp|i[[SΠ)`ZQ%rpZ!TJ Y+*ggI lg**0PIdnZ8 CCM1O,9M\YM0F4׵7) +e~^.S}e7(`? < `ǻy6L.^&3v]xVɽlnHTߍ)!LβEc=D7@RosO=. +ʟmL(s.xjHc'vt.+-BN.I#6ѷ g"垜G`#|X]"WVs`ŬXQ3s[{:xQy6fJz-EKrEVˤtV;O{2XS4wd_]GDM]O5UI" T"6v̠Qs%hr-U.W)-ᱡI<κ+^dudU񟋕c8w/AaHjxŝ@Vof6 + `9I&ʕJKK)2DFEbNvďd+‚iIb:%m}yN+q/Rdҏ]_NAR(ogZtZv{%HPQ/d5NhqqTTp Vvwh&)iII<|$[a] h㺇LM@]I䌁& rRObq[5`KbQ Xft|bX7!W ac _[ F99~JOIm*5IEɺic O#'dúό,1iʫ*?)tڧ&RР.L+ؿL ńa%߼ٙ1滿i!Q6_^(EX +ȕkrKMTӽ.?P):`M*m⡩ǽ[rQfiir3wk:&N!dPg"qkiMfH_ڔB} xpłC~i8>Av5pŞ.(DuSo+齙rxԏ,QO+"=44|kl0d M#˘GsfmA%|BH$A75{)iegA]L $ u{J yyBE^:cT|al_1MJ<|@5"zCeyKU@Y{O2C->ַG3@,=7B]Kt5ڇk}7~u2-F!|-A<0Z"?-e-1d.m[=LrW/f!G3*c]3sK$`eIst>AaZO1MBv ]Zg'.5 i!}+1f{\GخLR~睻o~%>9խ mTfwh)x*”tC[ +Wy*So;R/(?;.rT MbQh.ۢ%Hw +IeT5t CCbTY8g-O̧BWKP;AZX3lDAq+VָU?Z;:eŦ060MjOfFN9N38<ijb9K7_/’>gbSkjm"ߧc $'aH~l;BE:@r2sypgu$\*8mx>J TDh ~-O<^VSδm̗(5+䌙pG7z\Pv9M26-6ϧ +M #)v5SH8[Țw2@ ኳ$$h?d|h4LJ|{.8}پ+"q֊-J>Ph%iAC2t~-m<2$m^ !oA  :iⳢx0GvnMdtƘitM݊ZG">%^Trvj_%2R:c:Jگ^ !D(AXiv:>#\lTy{rl#X!)u0yje4BykD&>K85UDXFAy_:)iVR_^ 0: R15 |vh +n9Xyc|^% ;?rSYkODd%uۧwpT#ݺ/%7xMF+V*@ ?.w iXr=™83baz}`9.l.VgD}ꎦN=.ʰZ/iEj?V<˓D]`Ԝش+Zo#F55RĪ[-7 ䷈h~ 7GVgPP̓!Vpjo}7ց>FQ|x5$]K1OBFszu|z.~6E[UjWkV\jnFKޖ,*ˠ32< +n뢣=1bNcBnVwZ%|Ρ/Uղpd c,((>kT^Q7Ue=з8)y-Ā8ieB"m*0_I`p ꎻ![0l?ޟbb6;݄oXt8f@ +J=9ʓ!nSVȄȝ%+7I+*4爾d;Z|Egp"z褧 Ky4};2pO)(D#Ûڃ7o+T6>[O!ISU5e×/ۓ$q4˖C*u-G0#[VB_DO^G!'&e>RqJGVxI*Ep[{ Xֱ(2@ډd !) GU#s7TѮnTu-5P嚋(M;t `Y,Ŕ/ )ܽ^}Td- ݥm.xn]eڒn6O/W %`cq:U^iOHJ7C4cIv|y- \2:0,_gS/j Ϫzdi6u|XiHvPH g]6=&NDul6VfCzKBnrʹGCruCջ.˵4Mɨ {fdĐ"."D?1NfFĕkW&Jk1,N0cjC1)imSMjPra_ 4i ]0xwӐ_a!,LDXL eaڟ\UzN;ƚqtC'ӤiZ<5k#;h5.C7v R-WNFPϮjI1 +2,LMVQA,h"gU CU;%>R0jlo\F5M)^=zS- Qȧv o _l.ɪX˳!K話6< QݠI1s F & LfHMd%gcF-I>Om[!+r[Q9Pl5x_7z?hTwl@YpmTg; Ge]-N&r9([G5e~8v *aBlFF".{>~ɲwֽx=IX"j/$jqx5' +XJZjgyͦs/QfʐgҊޑ=@ze}gd"뙩'{LXH\<U*e5{r9" 7"EH$zbBaUDW12h)4Øޏ^^O7_oψU}NQrmu3,! ^=ʹ ЅF@ L7z_пq.b)ߘÅyD|\lnܹpet˩L%( %Gb %&g@{ju/07YݧK:1ȍN!ebiTXl&7 ԉg /I5 Qv>5@MŨce:T!yt n/ MB-tu?s>qc_6;Ft7Q_DYh#f{Fg+d$nNI/Mrri'폰tTW32fgY[e2u 706Cx!^IL (΢eCG+%G{J5񹐗g7Jzz3tE3l bI7}3s߆*f {@ Rj Mڽ灷RIx_-ԉ`*y'Sי"2$窎]X5plM8|P\(]:a&;G/Cd +-n^cc";*oN|B\09r[bpǭ VF$BuC/](c@ "edĴϣy Nj5z0YK:g _ᖷڞFK˧Xk!X M]Yͫ +Nzm\8;*ffZvy?-X7?DN!v0RT4ޞ.aЗK-'U/;t֥uv߫ڇ3|iws54-j%/5FUJYP/FS s۷8%lK $7F}?Β!{"^ FD|y-V)P4ak¥z (NbNcEZ~]Yubےt>T|D蚓e17[pijiRvhR&%miCz[\\m7 㓮/<>XGlXEAQYKH#V'3oQ29܋HnKȡEYZ=3 -|v:V2v vDJi0U!rDQzF'Iam?ԋG.UU͌vFc0WM5ҠX]J\ 5hj<%˥~c4JZx"gTg/\%"EmhKa5΃#,FA4e=XɞW_/24 ,!|YG:f/u2mʒ" ] +Ө7Q$dOgԂb"Z7'! 1}>WsFzsu>&8)/8Jɸ.k{T5Y}o;o2!'= >=HT _AR-̴Zj\i't6@-RBGilι_@$z?uq*-.N"g~ +X?BÎ>(#ٷ3K ,a}OQ]\1[p"k~o@~?KZOcwߨ6rJk˵snT BRAA0HB!PR@yof4[~t#duȹ˟,ˤGa!ϰ,]gyQXXYkYfAU$vKk /Gbxt `6!9 a]CoMϜ\ٕ73?ȕJa~̿;8<|i ^RoY_f(Gn)yўW3&5<8Ӽ̓D:C0l@jA/Btf`Wߌ ~y He>C$h#<6- J45:tC+!8Zo_hejE]!$0orY-O7wk0q(TO"<ۑHZ8oN%(>M*g~B[: EWғXV>d|\BVtM~X)E;>g4xmlXtzL~VPv*?\^Y5;"\^OCc}5(W>2nV1XG +~wR0'岣De?"oVl""}F"zIUHJ%rݚs]My-x 'нT̄-nYB*px⠚Fvna[:y}r+n ܗenK&/>(bۯWp6o 5߿$Ŋ 8ϘAU>uЇ +Uvay7]CUNK s{+aUJl֛.vp#]xFx%~OXi(h2[ZK)ej6h(_\.1 w臾 j\+b“6 &3Źv|N!P޵QU_caSER< +c^${|z:{VLuoFt_\̦ YRX\)(T1KVi(?[[bSAI{4zND'w lp6|_zO% F$<*0rZ ReQV`F.8{)unNd"S Tb)-h4B'1BE)jlsHdg>VW*b/K&# +*PU-*(-\BԘ&ٺj!REOK)ϱ;6Pr;m'yDg=ȣ+lb!*n$`ASx넝2`s:tg^ +-b,W(R[,q-;8~ƻ//F`%C#dN4ATTpIX +Ls6^ݱ׿SVpҙLגMCCU?Mg^`)Y׆n.MvJ)%uYqubNd[J@(*1l{m{|tҏTfj!ldIwgoa0mLҧ!SG?~iPzizJwr:2Ck;m;U! +6 bčFdV[M,ƌpl9jb)r]]uƤR@9&"BFK81d=/LR/d{DŻd>ɂ P JM"g>j7WTx&U~u.Ӡ3d$YJˊGKTeTc_ +vI"Ճiҟ:40U^@Zf1껎M(EhN. hul%tNXr$2Nduז0a>gu9w[P"7[ + O2&*?>_Xkj/>:q}ӼKorFExckd=ԓQ7 QUVrVN5)Ϸpfz1Va(㢝Գ+9B8n+DJ98nkM}9FE0-F&Nfi^SnMM'-]k8qlmA[& +15iQ]œˆw\鲑Z/!)Ξ/zL}݁xG(lQqֽ snW3ԎѢ3fzA6r#>?MS^Gˈ|b65Xa])yg}ЬqZbV7FC[Z|Q53.;ops7x5hFc?r<.=3g>#Y}plop''6뉎DeYHFQpd;@~8<\TCF1B̿ӕ6[Vtؔ]Bj(f 1 m T\1wE+n6Ո<]IlɬtqAAxka + +F#3[7F?hE;_]ywBu7'glٮL lZ8KWDIV Q*\ utQHS]gD ےJocEe}@Eo>HQ*pńG-lVT! =FR0amMؙ@ W)3ST6>CVTA˴iiە"PsHs` Ć~›V8ƽf>~]r}#;Ỿ<-zW|GrdyQI؂ª!eGDv:nogNBF)?PfUlb!pQp96 + b!!mE3[7#Fnd?QPژOҽAv@ +{ZV$fDS$CzuRU OĞ.hlc͛3X6Ei-_E_E .:9kfVR:9xH$RMrd֦3P$tqpA3+hB]-!IΕ@ AǼd2*{ J 3jpǂYfIb( mLЉ.ZHM*#F+EAlc@XYw{le \v`I'U1xO˨݁k.Ji'nf"}P)|2怔J/Q3G0o 0 MO,Eje +ljN.V4g` |QXP\>q%2 ,)X,E0׵|q+>ƒ̱%e΄CAb 6O+.2l[VU<$'zd +B}dw׷V skqePLy6ωԳjfn4飳W +!]tPs!ھ+vJk;ŠVi0 *Ŵ*ɌL\(3}X8m8$7" <:@FwihqA VOZ %͋WDL#1[z ᐐTnCsex.lPA1*b> +Bβ Vq`ճ*/~.ɴ'c q`8 q +L./%)w ʨr`v$5hEɭa `a*dfpׄ]waШ6acl4j$;& +Rގ^ͱm"e-lH%Dll-S kpq|(ҙV03Rڀ$]G 0 t sn$Z$z ԭ aC>qߊC^W|ٺΐ# K3TvbiF%ΖZ~4&v E4 8J)Ḓ4AУz{đb{\Rat'K|QhSb?m2rFzo@"+0Odev2GS9G$=ѧ(@t1{rG6ij6Gԙp[Gk}}@ dwRCHuk?т1)vkdrYbjcU,ӖwG,9/KOK܏{t9=ZnLt/.6_Q>+՛57H:r7 +'t3G"ˁr9Д;;U+OXݎKz+o3lRֈjbm{}}CBuYzWD&1!8e9$f->&e\F@ym-lG5U5(]=~cu_d@`sBDh{Cۜ12 +٠us_5 @v"Jsn]Ըm%Vo񏽮smͥ> 2"Z +ɪpaӛf0T4{a{eD&iW:K z~ (m8Vk}M!"6={!/ +iCpSUr UsZ ̺Cs?UK>N|%cX6!!G1B`{D |yZr #->$NUӕ)zB5nzqV;ȚK_EeH +G4&O* iNj(DT a/ d=PAH;)b&hѳO-B46-K.uMͩ2z9P*f{ q oXTo=Œ5vgSĿ~~DVtY@|re}^XF/YU6mZjҶ%cf`>glXүs @oHOl]* I )EմxA|c!WB|#K+=Y-OGCjv:f*?jb vLZ2NGHδW6 Lʄq@PqYmoՇ;`ő_n* g.t; PqeY/pϾ-m_ZIJ0uggaBXR?Jv0ҫMZ9-fb@uMu\wAS▾EYF|Ű}%Y z7-2 k\mtVd>T_ ^QJ<~v (i uQ*HM+I-Ȃy#TnwBor/>а>RR + 뉤> endobj 2559 0 obj <> endobj 2560 0 obj <> endobj 2561 0 obj <> endobj 2562 0 obj <> endobj 4895 0 obj <>stream +Hd͊zy8 +>sRhF^#y QG#Oç==o/ϧ;c_mӷKv|~_oo~y>}~W=|z>{O݇q~?>Ï?o+~ߒ~;%zΏx߽w;>lp?(O?{wٸ^ PZUuTGu^5P5FjFDMԤU PjVjUmFmک]uPuNNE]E5|| _#_k55|| _#_k55|| _#_k55|| _#_k5Z||-_+_kZ||-_+_kZ||-_+_kZ||-_+_ku:||_'_uu:||_'_uu:||_'_uu:||_'_uz||=_/_z||=_/_z||=_/_z||=_/_ || ߀o77 || ߀o77 || ߀o77 || ߀o77 KG#(~? +?G#(~? +?G#(~? +?G#(~? +?z $߄o77MM&|| $߄o77MM&|| $߄o77MM&|| $߄o77MM&||3,ߌo77f||3,ߌo77f||3,ߌo77f||3,ߌo77f|| "߂oȷ[--|| "߂oȷ[--|| "߂oȷ[--|| "߂oȷ[--||+*ߊoŷʷ[V||+*ߊoŷʷ[V||+*ߊoŷʷ[V||+*ߊoŷʷ[V|| &߆o÷ɷmm6|| &߆o÷ɷmm6|| &߆o÷ɷmm6|| &߆o÷ɷmm6|ۯ\t;]~~߅ww;]~~߅ww;]~~߅ww;]~~߅w߁w;;|C߁w;;|C߁w;;|C߁w;;|C߉w;;NN|'S߉w;;NN|'S߉w;;NN|'S߉w;;NN|'S ߅w]..|K ߅w]..|K ߅w]..|K ߅w]..|?|x>stream +HWێ}Лm;w8@d885b"=TȢZ3)y쮮˩Ss#!BRF[Pӌjw.~nvqynIl\PBыee0DWKB)KZ,w7_7./C] }5\珿|Zx /}|0LBqKc:-GCLt,LA^( +V +oewi&' Bu_7{~ql|upχGivc"yYKZn8kx ś}B9ْJl RIGFafzVlq':-%bp X9;#RowчT7JMvh;2Odwք93!pM QU %SU9@Y/$īh 7mn*]d"SjaO.m09Ąkuk3༒Y/p^9 #FbEAOjq\ͻǡ[H*(ךvb)Nջ890μ|~ST)(n <0K+U+! 4eQK"@]ZDЬfJaowW@ʳ!(@E(v،1u +8C3gfЊ_ jOS@#K_I+9ٴWg\Y +(:rW8N!;S Y #`g4Ǜ[fn:]ZhVM 9 Cf;$r,Ĕ:sri$tncc@ʹs0ظ,xq}h+'nB\Pt4f'ME +Qp}$c6:Z~N_R-AyU'_U򶃥Hb UBC`-}!X4 &/9q#LA9'ԩa@*`"4:) -v&=,vPpXr{֬suu:.8F/>]_QySbo\ԬD\}3/ v`A~]d'$__yNa:BT#iyz#hҳn[%BX^0J)Wβ"w=mݣA[=tHU"9cЦN͸Mb4\نµSim7ճB/+Yef0l[2?s쀭Zc ̒𺪡YTi ;$Tx9 뇑 +XG +mWe:ƅ$bDN ͺl} |Q2Noβ? gNiF=SSLsQNWkrZhMߢ2oVk @t>@Tk@Ss&u&qJ1M9O8C@0F8,%8?O'}|F+\BaWCvdDA('W]SFǥS2;ZՂ& ^awќR9atbTܦaXDETq: uiʸHĩʜDo>_ZKZ7ב#i+0HjOkm?ö錛<˗7dՇWV< YL//y9CVQy5-Tr3QqA1+4Ew"SM0 /ջq!D1 +>vֳa+ASQ-[cF gBzXvbfH0T 7,nT[6FN{ ѐ"yNwEN)}`@jG5} #dX쭺=a:<ְJ+QFe#$ېí|K2 +tC\6n'{*| +M^0P-;]jÀFtar0%+^=T}5j^che%䇟6| endstream endobj 2556 0 obj <>stream +0 H@&I H{WU~×a30"Y{ChdPWf{ +g=7O$@Gͥpzmj-X@y')nk Q1 54r?v6Ilѓϵe + ={qzVSӂE\{oN0E/fdeZ7߆HmU.!6dQ0Ȏd@z55=:GkwiW/h~n~[T(Z;-["0Bh2ߌ>0ޠәMflZH\2xʦ|CyR~inOBue쾠N8r/y|7yDx@9/YdEچ7wM/ΒΫr̨!@Ciia -IJ[n Ĝ{5rz1 'Jݽkb~Uq۳ >@ nzݞ e^JrsmސR7TE%ѳ8d4x:$ȈSxf?Zde󼿕MI<{V巯Rr0~G;/ۄ̩ûMy/)4BE.3& cy=a?H{ Վs9ؘK.睩>YZJd*ZГ92ޭ2ᱶں"hDQCK+Í|?-惟`4 Hd ~ g||;>$zeI{~ΕKՎ~]6sǦ +:nS,mubzƊxsQ|< P\H&vЅndmp]MH +Ei;WNX(֖{BsD\&c*ʃVߌLXaބ֏׍ R1ꭱ,Nsi[7D[$}瀹J'x-pMJ۬2Wl7U0N?1hj #RH4WP~F@@tI"ʺS9Hc # WsIB.+WQXh~BmUnh%n[(:;"RzK[o jkhDym͙ yGCr!WyHE,v髸IJ` 5o8gUcʱn"+kj"%{~V̷ ++xm̉'Ǯ _ 3s&0(3BQM=t$+%"*| @Y97?<~r -/(qR!&k}bMqT?4FeuQ?8oj%9i99kL1}cp&.!Ƙ܇U1XXLڎ촢DɻS4PC]ɡbT_ ?Jܔiolpoe<<%z屷ȞNcV ӻkШn6qRRJH&`你"W92Q'H03f+V% _0F ѐ֍-"-[~\heD=y0h"0u ese#T*f`<X!f|"_* XMn#D3w܂_Xg};:k{'*v7$8bOW< q.s""j,]/H\KV% 5qcG቞4;i0KD2Ǿ,Zr  0|[L&O Q>'s=7h w?L_2?Wǭ /̯ p!dn;C"祓 m;Y +yf*65GYF~aybpXE5>UH {9DQ^0F_.#]ϴd wǟ}k~bQ-53`8i UN\97>*1hڴ?}%L\y#1 P>jy Q<*[Nr&ل%^_5 <1 βCQu2f%8p3$%l`$1 + $I4F!*G4xF9ޅu=cPpzڒCn *Gc&s#ɼ6ɱw(t3Wʁ3^ƔXb 4m"\,Cc1"f?QSذñWUwj[Qi +2d6 {mWF,wqvy XS7z>ߠ/b]0)E>HPA&Aedv?/Wޤ>N:pY_,7Ǜ5t#3yz1ilzgS#1 +D/U?Wt:*Q뒮"7H+P%{ƿ6ҟ൦Zh ]R~50Q92g}:"_MFc vdfn/Sm~M4љj|gM,1Ք5EOÇ^ @P0" dib )Qٞ=l()+`\eJ܈Xk.$qSĈʱx0oĨUWLr^f~6R<kNwkuMYq^!ޟo^.K_bH9dTqbmafX‰,nr.(ngcyˆ1cGn=?+S*(,ew$ _Ĕ0#LN[9bt?]BEtKLh]xݿDY.TT^+๛zzq.F9US{HCAj ,MG( Vռ+BgyQ8eĵK\4@kxZm)CUQg$\hxzUD 72[3_5f浯Lym v)S,0qu_B9HALjZ @-~DP\'ql.!?Hsd<5&''^L +{+G:AeG:V@v\pE0m[f.p]: +KF oϮ9}wV}1x_4?$#n\,Clg ѭ +ݒżHժ۔ѣ6$@Yb$7n`c fSC:nsd+w ~Ll~A: +|պHUPfx;jY. _5],1&ˊ%} { C#7"fV7a()l͘]=U c~>U}-,*8 W4uK/=8q~+_R(osc}ΐ1 m]V| FǦ3=3vwŌ%(hqFZ3M<0^WVE6s5, "t(r0 /"!;5h.fuI6l<chWY2%䣪Л3iTߡ"u,L0G2m(NjVͮДdOqB $jRwec8gnM}k ^=<jǣJ3Y} J1i&jO?F* `%$9Egߥ +{Ynq 攳dNv>;au.4"}VaoV'D\#94[G[{1Xp(khn mU[r0lQe-vHI(cE74~=T}K>V K+r_tUNC]|% +SE\E9Y.C0P'An@%PQN" ,in_xi!1 \u='0dUS^%з-2S3Q&7庖nM^J11".H|Rfdhp|Exi0 .}c8vk d%EJv s^ +" xs #+U5Y` UpY-\r!\xy7d#ûdN=SN)*{ғ~QPD#ҙ +vAx"v\0ԐO{P7e \l&=Np=u^R9FJ2H.a$զp Tnl]͹0ODrpWqձIP%B\+ ;t4j273^ì<"`LVAsɎn0tƗDp~7cT?qe{NNVeċHn1(l/ȵ6Oo9éMV:FD=%iKٻY"|?I/!-TgЯGo۾X}'ޞ9wj\J J߸?e#e,NBH;KRtp7AD.TC[_ZhLp'`4W2e0]zZB-Ck s Blr$^#{V.x'& +&,1N +xjԪOq/x߅\>!6wM +pu&w~%Ty B$ 2UH](84.tݠ>^J̮frR*ֲO9૴"Z` &u\Eb<.YICX._BH- aSm\lYpiH8z-I1'ѷ}xМ%iXۖ.Zx#%rPU#v$%|=[3rs3lkGy]b+v_~*Gjgj)=`8h.;ZN3 HzgVU# a528O%h} w9%⍈ЏeEEJ|ܺLca1[ >4V'ǜ$ Ę7`(ruW EJ<\+wA98%x[0X tr-<, ):5bݮ R7 ;h`+:)ga0Hw;*1 -  WؒKƒXG̹FY5(GPrǍ]VPC\&J7|$8nފU?jb 0TB'@7cv%(s"R+2xwz/%[;# :\h^K*$VH*/e&a2+G{x̎g~ȰѥkO?LYkvJJ XC4AWH] vjJvX 9vp}LօSH%*ik^AJ6~ Q!}_iF%Heւo.1,=0=w:A$ =zRϲWӖTn;fm;Ɋ\U؝=x=?~,k-dڙwjx* +7gU z9ftE-H}ת3DJ= Nk[cS~ {IQV~1[SOtU4)D'egGa*t4əVUpbzoqv_CDџ꽫ndH,A@W2#e&hY}֞ӯxηחh(RkvL-B]\U!<6advJ۝A_xd?KL-i]w6ηvd1Nosҽe1?#!]Gv4X╖7e59ꈢqݦLuKzMqwwևr`۷ lF׏*l\[wynE9 -#TaQ$(ўoRׄIsR OHi|ذ)RhO4.y9qz35gavf+lnݦȓP׷7h8JXq-PPV aFz; *=e_1SDUg;Y_1$K<ei_u䃳gl12ƓtU$h-:-Ή!oJ~83Dbǻ4DdO, ++W6|X>G!YMWMR-FPd:H3MwI}R;g˸\4M#,5(h f6kgP1)PO˴CXxؘCΩp+wSRRLW sK\>>9ٻx49 ĉbKx.zz覨̡x&E Q w,Gw I4idG+셳7M͎m9^Y< mi +E)8٨$tYvh;ԂƁcio8FLeYm\M {jE{&6`I+6b[jKw.{+l$7eo9142HՃ2↰cnzy!=!*}l\FIֱc^-[ +MLԠ8gu;gem,R)M/,@D6UN0ZJ|86;AEOޖyΩ> kc\\v $՚.\K=?jn}RuAs G˵DHP! N_F#&t-oL5u}dB_6d^q_- 6|ӇrK2hK]:\pE[1coBr~1Y)JXH8~|ZpWa0111h~fL*Ll +^!theF(DG+<|Nw(sƝ0tu:Gk%!EN;&Tq[W%0ȯ\B4%/HY)$<)W<^Qڿg'MCU)/`9!nǣ8en#`XHV(vb߅(zM(C3Rj Hš@NRL jjY(v +;eۙ p>ð-mNu5b83َ6t_Ϗ9'ltͳN3-nZU, q 4BbmMs' 5pi"rq`L!N +j:If3[ +nz>!.DQj oѻ +ӦL!!^=<,faל4K¡o0TXnP Oɛe\, g[lێ.4:!%Ge!V]{6;}XoNlux&:D@.2mxb9?<uG\*ҙ4G,&rcBӚʮ3ʉJHȦG&+K/3xe{Z{)/-Aj2oLCV2{X"#P~o&0Iѽ)* ~ģO@yA`9 Tié~L[VaSKRN$( epTuzɝWc _~nIJ`p'W1 0*h[QE9+7E#ϰW[N-y +,BVd?,O p-/H R@57L8T) -{PfX7!hA C| ُgQ?>\bw`;$Ш"sFi j/"Hנۯet4{<}HN'"sҀQtKɠT[C#HU{,=#so'Yf- ˡ+o(-3DHr|U*Yd|C6!CBu-ގ)}\-DyL O+V3⫺`4V W#T4Ȫݎĕ]mzKN' ho) 8 ((j^'WSlo2j qΰO,RW +[/w`6-mم +21Ð_s s\?(j\WhilU+hҫ1Y[<2Y(]W%:?6?0;E< +AT%wrL_ Kn PYk0!B%tb S@咲&Y©"2B$rCsTN\rIq<{0/Gꅘ2,khR>Oy̭gXt&ސpN,f +6JwQtrCؽMG; Q~(284Z0-?|?X1ZJhLhEhL]|IcUD> nޗ.iJ*CdL0@Kdl_9ˆј硤YjtgTJ J4BNЈ<`o6LeUyrp5wFii*)8WEדzFȓ';Z1P4K̷0 }Z#PwAs\ҿ&jWMF4+nbz iŮqP@"'vtX$Xo()jCy*w5M/v)X L}ǐksrp0뛃 Ao~(A^puÛn>s!5XPc.)@q2l\0/?m\M&4bZeiMc.%(܃ Z`{s ?.YEbJmv?%#ɲli+1)Ҟ_.N1=Pxt]Fd<=:1 L=s~`d֍bܡgUgZ~*}Z.'>F$)aUu^!%9]Kh஝L)U@cm"m ۴&rc#t=4ޯT +&$ܔW(#w#c@C>'Iߗ+Zd瀔9LtGH=qZ~1{dCE:T=JwS9%63I+,K-f oH QIFII2~$ut[.cێ|5=0YwV?΍8yo@D?ʹ*~_rUƝsP=c^LZ0\ͼʷxpviņ]Fa7Uf$sy#G߹O%T23wYM:_c3mBM}}`r:+cWɦm()YLN9HuHNֵp͚\A88oY AAo6"D-8V\Y +Aq'O|Ѕ3~1pJߥ[Bv^ W6V +F2(,& >9ꐠ2y?#Ԥz v)EXGD޲$0rWl]1[F .qGyӓ@ K5xg3 HoY " a= s1vs+CM*0! ^<{%{E$pE +G7/~"<3ьZ՟ ȽE{0-2n70~L!TQ&RN( t&0=W|_\UvMb_lEa{TT +U@@c9;pI4-) P6YSTK.b›m[.[˜K"|28%zqƾ 7i`sə"=6o!IhV!3eղ2`wߨD*Ͱ/Ŀ߭SXKUQٜ\QѼ{11J*zCri&O+-᪚vBݣSΕ}ƞ5l(°bZjw};ǫ_zRpQT˺``ө\삍iNbyhdgJQi~㎳kɸ>N!꜔=="O A 2ߠ- ܕ%EeKP؏gJ!șb8ڝ>OzRW4(UbX Sx(Lzih$MihP@U^Ycӗ;嵱 +|$\i{DŸQgB3S!ʁfQ#mB(%OM +rh̍QqTPȣKZf0k X#~ +iĜvn *1{Dj|bpaGN*KuhFc Z&ⓎN^^|ݭ(3ͷՠ #[[yXu[LR +ɒQhq٨ |"S{l-vn]&u%LoW@􊐲Gד8lN*Rns/7|:nf$U+$“4~NwK&Ev&N <9"):Y\!?ýlv_>i4H"vBP{i>lYy637qx 0-  +~T^\V6c=\S3(m QHvq'GiC2ځh-XdUY>,5? \:?KkhzOeD8bդX!}{x$=7-tB .mӴ[Ue_IJzL_ ?"?nP8ҥ=HuB>% co/r + ޢ5;c0LB#e_RrUa^N" +_wf0#Y*۾bF#zpvR]'{1Ըֱ4<(v.f+^ea#G7ݕhc7:2 pݱURM3mʤϾB]+9i\j'KY+>s9 a<:$?5"Ϫx/PbG ] 1"%hOvaNy)ecxاϫwR m$&aL2VX)[vbSiX%P1trApGmcz(Jv4?E'#v/ԊM=>{DRn(JT.2ODfH4֩ 1z<(j"zw ?ױMBH|b3u$ӕh?[BH,3wgB6*XvӚevEM^ 1VQZY&eGg#E 6&(#%'kW=_ƚ)'νո[)0 l,ʹaޏhhU%cj- qLB3A|xJ|^2Jkm4x|^[-8]+$ 4Vjvf#;sBޡA%C5bNy U#c=aPj r):Q8?HzĂS孞p*L,2{];*ҴUW,ٍ ؖ^dr[&VrFUzQj zN̨wh0 Z2ӶYλڥ{r#8>j.١_mG<5?M)ڃ8jo39'EO|,y W|!)2n~3$lA$qFl0 _v ռnd?_pu߉ՇMj/􄠺_8B Rxq}( EF!Tn%2 n9jOZ|~eU7xPz‹MQci{ۧB>w(ABtsW# *Ud|3e=x`Js^@=(^Tae|{z\톛Gx==M u`>X?siW.?﫜S@ڷ˷<Þ~׼(8$6@uW7Mo͌u26s+8Ѡ^͒frqFdf |Pd$^$k$^y)/ZB Zciã6q%hN N@m'[7jo @c9 +>}EAfMEMEa̱5{i%ǯ; +"ȥ~:ov*OOl箤HF,] &+7B7,:CP`M=itpd%gbRΨ86 զR3) ܞ̮9';5wsԻN Rp"G= o/F#) (nļ?3.1Kةr6k_7mqAC Rb1J!6t^ᶍjvCH>"]098S`YyphՌѱ+TFոb쿌sљ6vYPώ#ha<$0TÐ$\s~|mk+ :*" +-)#l\FS 9op.|U_ U>y #T.pDk1ja=s"_0n#"4ka(ݱXkµ:#^.drbi)E>$精֐i=E?D'0{͔5Hq)2-@}dmMnnV&%Ln7 S~̪H~YU$7SP{aH!^ί(V ^-3|aW7\}R-mߎ]f5WW8kӔvIR Km;f!;j/\Fdȩdˢ''k^Dɧ:$`wb4)>]`̋rrPpۙgTPr<'^#`Saw}GNs/+$݄6|3`-`Xiw5!L~tE g~Xt î\LmTnp$R[P?^Cf@TM҅Zb)Z8u'=`䘠Q>0W"x erEdV#G\R=#ȑ#&Nێq + ?xE}N0!8\IK2D n\zg+|u&Vcq,Y-"ɀyp\/lJ2rC|ŽcE7ȟ$5];%/4OZ3ɣ:gztwg]2JC = +T *G/68›5'%}]:܁ KiOmڝ5*G_E +38M=yٕopZu\.HixZmWCF:m k!)rT (M;$gfK)T\,hg>zҞ2)G7Vcf~rw*l?NkѺCn<dƖ%sZ{wcEJx0#ˊmb0y/: :[ˑ9sΐAo endstream endobj 2552 0 obj <> endobj 2553 0 obj <> endobj 2554 0 obj <> endobj 2555 0 obj <> endobj 2545 0 obj <>stream +HWi_b#EPLR3jU$񬱀x/TND\*㿷իmW>Op˺/W,*{V3:ڡ#'IL8ְ>ެnV׫Wko{g[pʳ6?\Φ;XV2Tgś}y.{<WEΩg}z9Rom9]?U!WoloD)k󒗔ޑapO7+XfLH +m=^0y1a/D.t&4= Ř -ߕC?8_?_W΋pǪG@L*>@vY_ +|+-9{L]$7pM"%ZB,81E +H%Iχ*Oн+J]M<`}Ȥ1לRbljC-TH*T&WSp$ZP?t0΂O]++3i~X OQAsQ77ybl*>}ˡKx+5Sh)C=S r,/`9wwP!rϷ B\p#lѰs\8Bx@ h"4þ=xZKjrzp6v 5;"W __D>/HײߖͲd`)lv[:? @Aaee Xs=+WOi_C(JGZPpHa|," plnVq0 |܁i4>9̀ߣ]~O}}8!Zs;k܉/~Uw_qSH0YTC:@~&ha+5IJf?<@ݕOOX]V9IX,cT$|D$Jtδ2h/ER-]D#w# tz0;UDs[vmj1җȞC;*4*D Z%$KULMdZgSvy +ᨥҿW)0 +X=c7 H`j|F 5`:6 C[|&aE֞/N3 %@-B-t,Z4઻E-&,[, i0^@Ȥ 8&̨sP +jz/^jws]՟+B~B.,Y*'g@>n

>ih!h Yz[mMﱩ;-E Wc:8DŽ^-{Mmwv7//#ao4KiŘ3}\`DE,#lްʌ̥ƆS8&ehuNG|:7-?o&ʛURރжXmȎ}";nb0pBn{{5Qrrҍt=?(0q,?C yRkZ"EF*Of4HSU&G~HA%EMU\R<_O=sDb@a?jk#SJjעH? x۶ʦA +' ű/X}Jw~WK⾚۟׳@RfY| _/3N\q;aVAPH9Ӵkt@N1NfaLA&nGqS+9?I:P>.цj1*dsڗ,J Y {]]ݡQ,i̪[A?̦+L,ƯeQB"$w &m_^EJvVTh +\hTk@ ]a?3h4TE'Ad2~HE^FCnqPS[᷺p"cu>&R>EiQQ)XOC^pZ[\;j.Hs7QLC.d434ƯMS*HNdpV$[8 'x7dF+IaSOӺ>R*N sT@^nFrg#ӉzgC Fó2&͟թ1i*\DXxq +ד=k"UGuj[X+w)j'EV10apX U4㌧hɱxwQ{{n/,;Z}a_X%<E^X(>DTl~&lRTDm|Yeg5N +<咟C\n> +q=t 2'"kᛐMo_ endstream endobj 2550 0 obj <>stream +0 @@&W @GFzPyhoept< 3J6f~S|-VxPoHFuXL57bN# e}I*UD^dTb4p`Ė*07dbؔ+[1(9N HoSĖhjw?|jk(r5#df GcyNX(K~r4Nl%!kZ:tHI=Lx>*=nrD5 =,L$6D\ я{vQ㯷q- 'z.I:P3y?@ $`fR3~;~%_@2t}8mH5̎gؼS\q + +@O@Y|&j.SOKbn5];0$dAo<+9b5-T +2QQyŵ O&% 1T42 # ~g$6q+\OEEԶTNh/}P(%1Iw.Hm^hš%ԗ%=2$k$ O-*mF}((pɃޭ)<#ܓS"r[?ɰ|ho%'>QlrLAT؄E"K2?w 3'pl'E}]X08q_=t }\ph,ޖ3g]Gq>KjJ?^|,e׃FҶnBopwP/MRJȢCwhӕ%tp_A,${ QO:S4֡Zf'l};o4"ha䒬ئO{ڇqI.כ5؄#}5 Af̤z S`kh:'E"Hrx0J=5pLHLjZm-tU(CCH/YX*4k[ʤֵ, %[ 7)nڜwu~^CZ4SYڒ{[Q:: +Èb)LT*!nF= a=eu5QP'ةV4{ilKڙ 2qv&7/*)]9ػ %`̣ ({rbG8̔L uO%G0жq1ŹOGeRk;4@ AB)Xex ,VT.A.å Q>Lp>c:Ar!]_O3|]@[tRiP+N{VSeӔ?4җxv^jq>1$r :+\1Xu5Vu\S >nljU ( Uu5}҄g^ v]=k@|Y_dAAVV(#RMRf{m!-DC&F_;qc垕Mod,= |%.ΝO~cuV.[2A/rQś?â zȣu45yoP*ImHw>L:>8)3a48hhN&xLP>4#[ irH(% @Wr9iS}X>C;N1,:7̩CؘS\{Q,n6x/c{O~}re=:p.xl#c|DyŔzFW/E6B8K՛f?'B/*ӒEQ2p F3ki^ פtcd&,Pbʤ<crHQt;`j"᧾mۉL_[tA#1Z0o2b~nĥ([vW +mn-q1L$<ze'L#4#v7_12X&'mqggӭIWgn*afbskmEӺW>\mt2]yZb~Xi$,7I\;Mq9./mԿ2g6Ts$;?ȃ R..IHq,-?CaͲ8 6%IL( lT, +6 E~9JCu +7B۽jk5*@'V|Q$-IA d5ub)O%%D + +7PE +{@t?sQB/֢Hʼno)W)#-R V,E8R5셈K Ծ*x˺a|8Z-$'+$Z)S0a^1&ţG{ۇg*t5}SųUReKMhtz 5L_v+&8\l-$dAi1ܒh2Q-hG'~/#$}\ZxX+@zś+~G~{f@/ Xd@ xjFj%S2e> hzn6)=!3*]'=J'NsWIT?'w@ۥF-i^FpnzZ~qvԖ:ɖ57x`${I+}uXgQ7-Yj Z +@ѡ4c~E iW>ء+Q[6ڣ)U* &&2 +ba'&!-ncg̠쭌m2#hߐ-:S?؀M~``!'Rtn6b]ּ+Q`ݼODͻz׺Ҋ/$EaUlSZ +8% Ӟ-M 9 f6-uUb@27p3 |q#/XeLKe,qaf;NcX  ++Bԏfa ` +'`N}e}$QeG%.bS2a()GL:1ى2(Rgώbшk} hj{ oPt.{̤"W|YmШ8oE -<" AJOEo"{tɷBC6@}-1DVI[N6Xu h*j63oo2Aʼn+UJJ^y?BJ!)=G12Wo1행.柀x'Yr#ǨPnZQF^=n5v=& 9cSyEyEBqH[s`11$O84~Bu˔AhFat:Gg>qpukj +V@K +qL)Hie9rPYOcޗj 3(z;sƚ:8kܴz%R|Z)l4% fPJt[8-}O?;q=Imoa[˙ -Kbg큶A2ɯfuqUًEO'(G0PV,x+]) +p2)l%lnӳ#[OPjr1.Scz4l*H +/DI{^o:2-zi,b{+Iz yr^}-{NĘܷ+1Nl5\ $M93M%׶'?r=u`Vwđ1Pxar [ Y<]u+hxAapWm]]Ă·I&ȧ_nez ѱ0TBC%?S Rֱ=*4]Dg'xٽ֪ Io4;@@4M$>lTlHְ;>;DAɇ8X&Pl,$sl۫+n@s^=%S4Mh|;Vjq !@vV{_bR/N$`~6vt/y!ncG9\a>um4 _4es}OD K|(HZ2\G~?LG5QάRluA Ƌifͺ'I0~0ɸؾ\GOox]Ϥ_֟8 &I}鬍{wz*pnBXYRuUx])isa-еoE=j\n;y"2NneܫTnMd+ƲG +ιYץsJĀ艓~+Vk\湇S9@Nm_ȩȁ/'^/ Id ьiR =6Շ3oۺj-U@JJ|=%-&im#uGU2H 'Yt%ے<>Pe '_;w^\DcrzTiLV:>/\Vh2B9h˻?i6rHj7Z ()f@VWD3OJ[1z>~\'/耇fbǍF6z !eGJ,NΆ&N8`Z{p(;bА<9ioN&38q(|m'䂞xl}OT*>]д m =s-x{2TW'oe/ +,"#ՖB.aO]8/ ֋:ϬQ*K5w]slOt)s2 +>x]NHDҦB!Zޥ)C-q%NK]ݻ=V(EmVD@b;Mq)i%z0l;&Z'!ܯ| 0'P#zMAQu*jNGiQl@vNszߜIh9B6I |Vl1Wj'׳(\ڿj="G#kɤxO>6U}q0k14]4&7pecܪ?4nǧ&Mk!~\ s3\}/]#6WsKx#AyY"7fw ,*=eJ5ee O13_`B#ae: YLxLܣfbtwee٪G( xޏg $>Jڣ>+To3BVZ CAWhTKi]}x +f8*"jg!vȚݻ|iJ8]d,'MOJD!Oa\1뛌qi5'dM98WW4– @[Ba:i^AdSp0 q%KK|V\HE봲mV +^H/.ކ0 8.(vvߟYwgcbtE3=k%= +uVeQN-na ßqN$B%&rm$PX)ЈjlPkMdz A݈ Cm$K?VHԋ hd sQ6 c3_2tXن('V%[4bdi-92FY*otШWވ!{sCȮ$0󔵥VKµ aH2=MH|v-LilpW?Q ts mъ + H+g44r#@L@~h%MEGО'^r)MK7OqL2tIew`x[fRZ>dktD";s]- ?ǯuIz7oe׍QTt1 6C7uιVSrGΆ P0'χ׈sƣ jrZA$~8&W jqLi^OW~DQ7׆{TPq|(Mš9ap?5} DQ>6 ^p[ +!4 +0Yc,gx:~n>5mS %kqSDTI[& =̊G!An (lJ +kHemNzi-<4TpH6TIbV2/ GeR6\q gIK#/CO*ݴ)I tE"c $dtUsn̟&GD3|vi\w13AGB^`~5IZp +pQ9keȼ%bḛQR85[f2 OsA檷 l\̼WSrs0Q}j)Mf4'InKo9cu^tP?k%곈cTG6DibHa$/?a54!D+O.rsJ{QwX1[:Ktlm A.T4nl41Xu{o%:r[ꚿ5~&eZFlX=a+_.5(?e-Ү| @.T83tN S +7"rǽ-qTZ [KqTc@1R'Ki>%oМ|Rͻ \I)4U݌i,A +P gD7"x]ˤڲ@mH)/U8=,4q} ɞ ݏktަ AbB&IO +Jky9ɻLфPnDt+ Vx +ŋWa\8RclGޟ؏g^9c䠁:⏂(m%K;c@G6APmn{_4?JQWRX֭|2 +ahV=['\Gjm#^swK=dC5xJGP(A>b =őw܍D+v&cⷯ (+ V]vj*?rGB)To+v 5L2FܗEL([sŹUd5ޖd|A7(~i-r9Uur j$WBsFLkHݦg$vT+ h/8˵Q'{*V\(>mG1I'zHU9Tڜ`hyvU_F⇑)|<\EgSxVL8* w4۝vtn_+ت!ShATOHZ#Kn~L8 Ƞ@S{Q s@ʐ۠|0+!beVRު|bˀÆgLl74+ˢ8pX諿g'=,tlH2ԁbQhISu+ K?ؚ9v [}?}=@ڏf`(1-5fm36&kܩ7[2y82ҽiN"{`ꮒ1#ug}u Hx#Π3/GA:*%mOWI1S +j<9[.էGjϙrj UA@+w W?P]ʳlK`8Zc\'e[mn5m}Gpeen=aŴzT":=B&M/z&&=>A 9?(n&c*9②0=%ޮHGLe(B1zG]%9)Ϳگ`J*0i/mnw7[!@r 51K%M2&4%z|׃k).Zin7mmx$^f}:g||aeqO>!v>n۴.L??y%>N aڅ>_@RCBRWNqN`,f|.0h.NE%K ʮN1ǖUN#A`,T;lN} aO.sg,RລS+r]F Jjuᬵ1dï)FK43.eIl恋f`R*{@iVj)y_|'[PBN|Gs|r4!&Xy)'|AWyutb^5ÂqO+oا|m˃Hy$E_$! +2wh +`6Oq5Av9@f;7f_ѳ_7U"NI9%_^1G +hʷWq3 ΡYO`9]QU'Y(iju<@u͙ X33:8u873}JCꃥ1vq9<wΖg$D +-%- [֯F]# +;ƧGE`J5?B6AsoM"W<ćqٺ6)y0ܡfc^}, X;(l3F`1L.4ˊJ +ngwj38(b'YC+AKq]z9 H/>i/ѣȦFlrO u$"M|8(ŭY.ZGiEllHtc8PҚ"gR xwe4G"dMd,s;b-]ypa9^ݠ$cZ)Â#בٴSprOمK0_C%jNiZt 98,Kk>2>>rHWNŤȔɲ4cj+d Ю"yU =VKԬi,O>6Z{? ө%;Y:LTչ/AKesS@;'+Mʢ50\%Y!j͉p~Zg)X-1s|PʎCk&=9hP0j}&Ve>-3b<\ZƟ(u!R'ߙNd}% +\%D9PJ+WSC%&f`(8q𧲈]` -2%z &R 2fn u^TIS+b9ߝyι +/*خFc*m7lg-6.,{P"hy2to;*PX1©Jpo5VLhn*oK.vwҎwOp%/ YtZ%RXׁŷ89 H*^ +m(/NIx9k{ljm!{-vdh H4=>|r:XMr/12IiyNgδxI,pd%|M|QT@3WbDw֒h{$ +fWfΆĪ#ooB-" _T +VءbDyZqw^/1kpI.9v +'?&y٭~Q{{\8_o?[cNܴUjFdSVDtM`06P\ػ¯!l!Sz' aC@ӃٴvKE!jwh6 hd>>4+=A2e|jp!4 Xc 0 CYВ!WBms!=,B'$[vsg0nNP6κ +hrpHkOy߶O +fKƹYGE@I"#?㵙oWO.ܬ읇TJ%юB-:eŁ߬|Ui{Z32wX#ڍc/? ho@.39|ǫÔ4۫Vb5Fh6V0.W\҈@mwRcvRl빎*\@F sԟ]ЏgŹs&:KWlx_phyq%h/!&'bѢtIP/^*KUPH`vUYrS,9G'uRt vo_N,#8n5;!³ ___Z*y_sι@)$@P6Pҍ3*y赤L0dzgt X aޟ0Zff:d%nվM4/p#|*N)$!Fjw!+Qi)8u<̀,]dQ%ɿu4K7̀땍.xr  8qA}9{=ȈYcH&m&.+zA¹%ncdݸbT7oal^B0¼EVy8+K\ϥaWy[z4VMp+uZDsv0_4*_MGďγYV{〩L &G*EJ51 gq0db~ELS]$y?Ʉ,Fix,:tK?k(_i g1o-Iī?շEƌez _f8ޛ6YT *D"4q|! ͫIQh +Fx_\]f5S mam7)\M0?Z l=|qn*j"X=~SЇ{d;=zx )`鉅.H eOϳG5R7M"p?/O2;A}TD׊H_Ve:&Tn|qZ3456OB!7~}1WKo +`IPI:NdGQt c]tS`tsq|ma穈wB2yc!DF+YZ1I[>Qgzbڳrsשg^o*mG5Jg,3@2.CpyĨlDpV0jV|:ZOwV險kF|Ri*u4 ^KJr,gpW_9Rm)'ofHqIpǙChs3SysFb&xHnie1GcfA/|EEXp޴Zj|yMY:Mqwf|e5^JC +:ˍ_&`'..oc9+ #.G=)1mhuE,^Sb1DXB'lll)S9F +Z D!UClAKGVIZ$']h?izHM3p}>=AK~_G46 +NoWZ@Jq,1Wˆ'zV|m!O29uKeYV,Qa7{`Ҵ +4ՄPH8ƕf*S3 u] W )'GQRCvG!z 5_:CYYĿ_j_0#@P J0-Q1CB1\6 i5a2<-L06 .+: 2J[ӛ JP3e kO{Bʌb?*:Ɂo6_/CA,) SG[w:]KyE#K3T҇k*ϑ +>V2אR[=QiV ϩ)  -|]HAYEa,9ϭƘuuH?~vP:^)4-t̎‘Śٗopk@P}kE/]T~5Eӿ}fXx`Upٝ&k~f#Zi_~KNM&&ExQQR)g1Qɩ~#f O'stG}n?,mxΎR)b G/'s"ljVGM/ +,.)W6:kulWӆ)M߄TJ}D8"ޣ9]Xf[/DuT7ĉ9.׳5+d6@ca\cҽHjH4h@Pi_BcCBS|EJ0]gm(&RS׃qb{Y66?ϡ3u[=I%!.:#݊kƙ 6qd`XDch$| '> 8BfXx3H51qޛBOQ0;e}dm)O`Y%kB>* MiK Z&qy&O>Ie|kQX}u-#O4u^B@DM~HZKNv@T9…WBԶ7Ѧ(~x +׌7M:dMMn".57-CiIQ^t0xD5fU^ $EaI3Q&i^u +F(]ҟA/OQUAtWw[_~:A!7[dk:mVU'cWHuVa\z&a3[|q}#TuQD-paFaH!mcC2I@@Bn.~;KۓD.@CIs~p 5k\ " 웪>0D5"$tRRb e]l,w'Utaz,hW$l@i,ɺx}1R~(:X CQ"h#aq}N{st3Gx Brs9ID#7+ۘ728*jSS-l++a)T$7_,<[v7qoxX@:9hޑƲBI:(EE!h +cz@v~#~!|+kD^fqCƆ;bowՓns}DO!OG}lJ-mS[ a˩7[Mt wwXH# @d?Y+O" ) tadR 7!9z_^&ћBɎy:gi1pREƍzID:2 3QN'A bfm8vO1tEǬ#* e$mB1{+\zL1*)." +-aB#&CZr<5EjN}1,TFÀL~)Ql(oGeEo+v?XX>|e*`=ͺLP'?0:\4'%`Տ8q&*' !Ǧ$gKjj~Inñ{4ߣ1,:R3F=*ڃ`߻DT;cyTNFIOXZ2[u2 + A?Eф+Zb:ks~N5eV42ZM\O.?0)~ +d" Gz;UZe(r~hs%n I8"v4h\On߻W#uGjsXagJ:5)X@aC߬|U@m1ҹğ^iG&)y,Sҧy`^h7δed`M¬;7",&+Bw ԯ<&e*ͷԤDJNZC tF7XYaҏ9}lyKlsϒOF4I)JLݬ@SKpC?/RoQM\HI8d.iz]y!X ׄMg(, 3@[_צ0}=uND:MnuF FI?gZEEN#^>=>f7lnn \[,!IF- endstream endobj 2546 0 obj <> endobj 2547 0 obj <> endobj 2548 0 obj <> endobj 2549 0 obj <> endobj 2540 0 obj <>stream +HdN0EYt.Ҳ@PZFQp${ q2(, gj!v-$jFH +pHp=Xԑw#,h@{.kS(E[ܼ~<=0,U H ^QN~A1O'Vg\θQsP9 V+?v<:jtmn,7"^=I |.LpLd +ٗCU}WǪCY*ks1Z7_]ٞ$)n endstream endobj 2544 0 obj <>stream +0 @@& @}WW¸: Aj!XjBwOSAap D(e\4ȼ8RjݵKZ_N2Vk}ڜ,<{fy`v䆕R' rF/VbPAarOt4WCB-7y8&d1R-[=pT( 㮓B@Sb^WLH.(̰˲iAbꋭ?bm1o5WzGo0c5?__Hwadk#RjI5/MA+/a'x>9U& +_muA$ᢙ?虗D؟"ݍ"@C+{8F1~N;`Vro`8+6LZ +AkNE䄛#0Ŧcp<{Mb@蘌I|6 VbUmnKM~ckh_jc{"%aﻪV|uޯ/76{'X#rjhjEw:*7]10).\[~n26E!eD\Lro +ȃf6uH˃u0rl4 fsjܓH$̤u$7Йp| &ZwYզ4y5ҳRޓF^peOwO>VV?Z'Sy5-+v0Yuw/kfv +Băsr/Blfʨc",ԅ,ƾ',%8Hy~ 4POJeD]*S)>qM'ȁ?F>R@(i=Y'(Az6#Re&ŗo Z`IM}5dExR+kgh\z*1r+;~.\a58nQkSaDN4Py +YE4_y"#/{+*X%#C/1Yk:$e$w + a3ûCMz0eEJGS7m6VR4RރfԷ'qt*(Do[ endstream endobj 2541 0 obj <> endobj 2542 0 obj <> endobj 2543 0 obj <> endobj 2534 0 obj <>stream +HWn}W1N˽x2k4o.hy"5$'?n7 cUյs 2iƉ'5߫-]|l/~xxd X^PBSj!naIJ!J)"bxy(uѭ7oJKūu mUvxʻb+j`^B*bBqE4,vkhCG~*8Z/wjX|ms  7ulA\(m2yм)T0AV!Xdb 08juL5g 0{S>hV~]5v:3&q׌0چ ˙=j̫"+25}#(J,0}W Cvb}zB!Ll!dWjj0*t:jog`2unWvYr5Gլ_ ޻y70 6]1;K( W~-쿼|"LdW裌sjq Ip8f]Nn- DG@f(YTfr EKY_Xq_Zd'bl,>p_'5(`cYWj8= +R Dh64/E):_1z`<vߟA+0sgiIrWtA 9'ۖRPY"Ű\X@d.gu ei "[x6G~p%$wI$|qe$|@q +M#Nhӈ</RbE"m?`'M\mGN;` +/G{B *<>f-F]0S!fJf |D[mS{bO 2|q xTf%a iNW81sjbvTIh"Yo + ֱߝn[ҬѲz$Jj"SaarS[pmn&p]7vtb[|;}NMcMGV DbfLaClʲ/w?00T&h}bx#r(~[ESqT (L}(!i{Pqd^_|py||rjYYCA%z}fĀNh˳EJ:?CpQ 7G6۹Rٟ{4Pay %)vynARC*|ɘx r})E\kJ2Q&pBkfFR' é Nڨ}&N<L'(HIV>_8 +d؊J:[xU3BGW\}im*^s1zp+ LXJ!{ endstream endobj 2539 0 obj <>stream +0 M@&0s M~=51XjOSǗߒ{1Ϥdϛk|qA`q\Xt|ZZ0[pj'no'p` #ΩCm=f'?hiy<: UQW@% 6U2X?׼9Z-_VoliS3qM qt57RnZOqNҹY/rr(IB@#ŘpZ!:67TwdTfmk}!C6rӆI@XO}K\WZߢvT;=; 538bB/2IJ|i者&鵮5%5mcOpwrß*'{T rՄ N@;qCߏbvpD4m ?"ݻ#/ۀv@ϽY=d%j]64EfNfZĕ $hCA:5?()}@-o%D`ȈQ߁?J.-l5+; K[[:Z$C]׏Vz?0#Gi :BW+g[.vf;4%eBX`^[󑪣8YA4gl|ɣ[Nl XB(_~=eEik^Y6š Elhp穩- װso(ʴX%N|).dq5 R33~!QW vi5ڣ#4 $GT<|9$, ED* 3uV_2]2"$DH 9eX`)HsBG;&y6|dWX-Z3} fML9bNnP-ϙ2Tlxs9&+%XI8E\j7}?D3W!rPB6/mF萏=/k];ZG)ek3 yB=[DaN;T*SP%5|)^s,LŠr1JgѲ Gg ,\vv}s&*%p?q1Ccq{B$~"һlWUȟ >{s#Cp;G EFTƹ#>*' ,e"~lH&JT\,P ˆ3/KS脴ʞg)e].J%93P7+k KL\@/"買 a+wÞOk*1YP}ՠCUR4a<'4VOJ5R =xʾc),\;J볣xאEH>krx{OW*:\mFN0 mTys.1)IM"~P5UmX7XVo+oyKVִ"(W_Ɛ{)^MfܗɑpPD8tJQVQǛ%\]Vyn8&~ [Y5D[\2,ZoOuó~NeW4-|VĄeL($.6BUՐR +F1 Q*IXb:jwbw IƼZoN\6i}yQnŁrkYҐ\B/ j4\_= !uHb;ҐYT^ f݌Կo9%pni]ڡmVZN fdz)$IeT +Ul%Oa%+yE2 =B4)&/j0=]4N}'{n`@]m}8& pWWJ2S-T=~K-/Sw<9zܹhRNgpATm3{LV +YaK5̬ y+Γ`U ^SM,8RC. f[*:x/~n`k +2 !I)QHalp˚];O,U0?b T%\|qyCx (-*$ +J@" 0Uk,;5ER3&hJ5o)# ](o"¾j,6Y/a9 U>6{¦=$T\8꾖޵HZfb1OշdJ;@Ν:n[8+aMt0Q'`{!>P!_\e#Z?2"K Ě;~?5 - ROI%xjj^Za`;]$H~g 4Z%5S԰\L89AzXFn%wȃ_) ;8Y~-ˤ2l+xx5#m.U7Wnu{h#㓔ۄiCS;+e'A +.*&j;}KЬEyj4k K-Z=#bL,Sג_&zIQZ 4޿;Ѹd0ҏO#VY}Dfy&*A:X =n"ڴ]Z4n#7[-ݙw .6SMa{uV 7{6ЌC -ݿ2|Z$p˕k"NQ8؄LGZ!Pk7њiJa,՜{>6(Qqd4EdJ^V0s<7d^VePAt5qd -ij#k -MHTjD[a[,&(K"yZ8N~*wudaM|M/goM@]`Dz-J$z!E]5($ '<*T^J_z\vD$. 1RO&:tzRY8lc77NCBך#vea,Grƣ8.B|2#kX$\hÈHj܁IݟVym,KA0}3;xn\88rbYءeAΉySS4L_23lSq3a.W/Nٳ\JӾFaM䇷,JNڕ,82\F|Cm}2E y0G Rڮ?x\/4 =g.OVDBMӦ FHg +-ؚӹhsRUj +*ݤL}AsV![CcQ&H?,pg+%"O0a7jqn2E K]1䌙]7 +s;ҕfpڈRL15S4fq:}V$H:\g @pf؋{͊bxNdPq@iO0֝r F%2{'Jpx;t:44=չuǷ u|z,P4 h뙞"|>{dqb@'|ȉx'U"" yaqTƿ7IL֜k:H@_숟";<t|{TGdj5>hllYjOӚLK 䥙Zς%a\`˶5J7[~>YL r K + M&Q 4s);r4tP ?3Upj}ﶠe.-Wm}t.Xg1%ЛW 2UOx( I*o]}Z{ 1p],,'3LGTN)q@4ս| ;cمVe{'Pnq@Jv? WZj؟WbF)qK*J?>C;C3i:ete^M4x\Gzɓ2h!1r@%51u8Fya`gE֯MڜW:L7wӘ>>IHz +T%7hT+)|"zڻ.l5/z(rpնLw:P+X‡uBrOHp,.!E+@yO0_`iTXY?fgI6 iEO*/qEMDI ;-_qu &fk$MmR4y}h? h }AuhbW#Ud7u&~xY'|A-e4QO=}R{!ɹM0}(LEyHR;@AKe5rIEO\:yP3FjzON]^-F\o鐔u]v Z(M NپT%sukicXvGșQDSe-|UeXd}^ủn@q[ l2BHv'*w J5bPS/5>6Z<5A kb+ fE{o0\! {+-:.(@b-$q! &@|_NRP0G@ 騛Ha//MutG7I ~ +a/~mb 1xѕ̥=\G?^zAcX;VńVg+`#R貐UmϹ=6߽C|+O$/!{c0A'8J&қK4tq6d*uj.+?-PNdnk lSV˭j˹5n{ +3IO $e|iKV*4>E!@fABmF䚀!w1SppR>A&De.akʦ}D7Z3Gu8dfLG!MVO9YR3pCw:^o~즼O )I.'Jo<܃Nm *IG_l֦ҟ߲]Uc=ȣHQjNY/D<{=p_a|;9?eb-l1W\U +'IpEL@J(l )#:R/( +6s@AQ R]-)M=~"C~iZHh{2'ңY'm1$4IpHFj%L9!!ڑR܅]刼1Tq!ny,?gVe{wx(8CCm7 zDPi "ZБ3{gٖz I%]-]1vOtmcۋy+;~ + X8֫hgUO)syo-@Ul'Sΰj) Q=@-|zXZ+u: t/;+ӭB|DXDҁeo?BN8fz^ǘ.+ϙg@0+%͍ϩ7$!ϭ) A>S Kѫ`fqc)_5ka]EXY`keII / jcgAt\r@U/nzť9C0<0} Y\QWg,z#"5~ָ̜EMF-qX 4_s\C8?@VR12;ć/P ޵{S":gQcO?Kc:u*j8\Aa1>ضǿ}DVPR>pX?iϷ+tN*4"lk02RH۞T, Ja!_Y1Neu\v]o9=IC2\%c-Pf `wQm$ HžNtng>VɠN\B-x[U%kuIHǯ_x,3jP_xo@U]{:?װcNX_6q<.Q4 CҘ!33?ggaQuF=06@w6JV2W2bmzB$^-Dڤ#:h^r:hq1(䶟&13>L i$. +">Z8/0W CS@ ij4PL1Ul"+nֆujT[S+U{`QAbU, +weM.[pXƘAƢm Xv[{q_xh^`o6s={8g79:`ݲ%`V~m ̴nTf,[L)4c򃓙1l[^if9c>P]+zܵ$}\P羫_orjSMKrUmYVJP/q}T0}w/-p˝Ħ7)7.62=nrPGtk|$>.,wXG'$<]A2#_u+RϮϸ0qxZaƙ/9ӐV&+R؍l@=h7v, ')ø`0j" ^u1k/傏%nfvHoy-= "jno++:6aJ L" N{;Ƞp6/(s;E13V687jJN:jUS'+4kKo8HQ( ҧ;vbnJ:slF㘲ԕfaX1}̆꛲~n/[^!-<6Hץ^W֔bM=x_)kҖ:/FHU]2s; rԳ{ gҺpiDwcKdu0@—\ +&*CTUϚ `d}vg式RYQ_UŐby̶NsDX۠S!UuU(?`ɗe +䙤G%cv(FFmɸHީI,+hL6 +k0£6u.rm['1D?΅z9-&4IԘ75`INW=oZ| rb(09蕘#%k-쟪(g +}*Ay() T +qg*Af,"0_"zm;%$(s }JͶ1{uMu*cgڌM!2IVgd\H"zUKx;Ł | `G񄎉`iUFF]"GT5Dfh`VŖKHJn $ɣ 4F Ry;Cd2Fr#NQYHjC0^mh0ﶅʫ2FFZl@`Q%'э5ٔ|^ٗtb掟_k7r Z yRJIn'/5P/Uu?n f_*=хIOS|1"*/.$FcR5==sgA@bB!v&AA![y(#lzI]|uk<{<MK_WUij ]ۍEX]o5KRSRV9CЮqD1v޿O)y43n/.ǼXi7k8}џ42oW:][vιY>93Esٝj^*T4I)UJQd Sl`ot>v:#"%xe@,1erP$*3\q#%_)T p=c]WP72> H%J;Dx{Ȅm6|y + ML=] 7ow 1qVtE-fiQLp 2(P +*)H7{u<xg"]N)hcWT d.eGs-3~8p(R gkgoy8dphs7{CF W%'bFN0.a<\ +8t +HmBcFW4+ЀMvA_pb54ɭ•ه_'y滲8fDRr6+ȧM&[⪧K8d `XOO =3p0ĩ lDZ^Mqe0]D \:G3|SK Q ʙZF} +BcOB<_ȷ,I"T e4Ul3G+<6Fko弶3vֱx0Gtl#%b-iȚ ~OlPq6NAeX#[S?T\ Df^7*/P|t|UrN$* y>փInpYL=厪C'jVHG#``ηNסpC_ hG3^{q +̕lL)GS~(S.DI(;$Y=%.L Kb}G +{<]wTw-:ӕvR!%h2j<qzNM]_"J'7“EGa-Ch7"g@";iXL-9,[nM:JF1:MD=LBk6Hsn9h <.?b\LiCvX2/qz k/|+wr\ޅ߯mq[54Ipw-7=aÝ$3bF`5FSvc*v%2F`׉uDNC`sA8Aî} oJN)ݰ"h l[]> endobj 2536 0 obj <> endobj 2537 0 obj <> endobj 2538 0 obj <> endobj 2528 0 obj <>stream +HWnH}Wq0},lubLvDȢx~dbY NNq­I p:#GQ.N^ݑ'o'dFg Iz6_l^L"tLJ䗫r! 6/_rY߻oT $x>fDI]eZӹzWmE= +Lw!>c|op6uʳ28y /k8QЀJhP6J^93l"e"f$U2Ͽ\88JlѡrVt=! ,iloe&۩.p>pm|;88!U+=6JC 6ь! 8x-9ŹJTmv:0p,MD}$aͪFD[gmc- n^Y%-9`r(0~HUP&XʒK܇\:!C(ZV%7Yˤ4t _+Ak Cj$s4׃CJ,d=y4μz$d馛tjv@DbbZpݏE5J&pE7o  @.a\h.u^ĸAaSYS*+qcRJKrO-oe#N^/H?VlӲuZɒuXCׯr0T9WEg[8ccJӡt'bF'NMֈ³q j` 'QdܴD{<5 +E yU_? Lif63VAh|퉦J rk1…(+!ld9AM$ཏe7 +HF +Qd S=8[ǕNdew/bL`"fD?5dLV 1^*9|]Smo&nbBi !Do{XK.,T{C.kX.pQDbgfɰkn~}nL7aFbԌžu1]-J)q~J GvWs zj'8 0~n@+=PaaLp!~ھ(~h }w8h Qc.Kԭ%f4ArI<p. >/V1eQ>Q okꘑy;Z9(.BкulD c]Y[f]ս8';`CmdgxAI>^T5E72Mi+ds!nX,ZO +ʼnBétcS@{L*PƒݕU/9pKBhї5_,y\;wN?}5M(B9M&fǝٛv( < E=uC_.X3ZuvUnFySndsܹh@` A1>lx=aǓ훐rzgł^ R8~h$WDd)tU i&$#ct}HU3R9Gcøb;A⥲7SC9 +#p:e@I^6FM$Mi0pC o3&,Wg1MJ2IzQ{K9qISgzh[s HCjFoi$L>Ib-jd.ޡec3mU]{7 d8X(_  endstream endobj 2533 0 obj <>stream +0 H@&V HdW +O;W$I+IAw\aZ/>uM0c0}%ݹ"asX_l h4 ">E:(5Kcvx](EKO0 |r-h3wN +Tk8 '?Gv\sAƪ`J[ 4n`)u-@hҡ43;7u*qҏD3NI Ap]sOo1<,r e#T~R{Qu0"aK2Ry 'DZԤ)?_ HZV?Q=ĆK zO:RN+m n35W O'wΝ@fBn{=bPsoջt?śrnVe/]+~ͧHJS/%hGpșfC9Y)FWMq_~TSHX{rIsg>P#[rA8d!l?2Xc !d4%\Qxa77Jn\|ER,-0Cӽʮ_dRGCddQǖ)Cy@yN}͒l[=<}ArM*r\omK4rϒ% :ȜY\2B͵;B3?`4EVR(]> DRT7K22踤a@ Ha܁ ||L1W-J[gSxwõy,# O\:O{tKXG4#ˮT +2J]r1EY hJgbc1( +=j|o-M~>JOE3]ΡE{ : &u]mr^0IyŅu(q\ʹDUĔC\*/Qsc喸'akñaMVOxc$ʣתe\Є-LV4^h kүU99O򁺮yǍn~GA[vU0 HG ;M8>y ] ae^MKtY<%5Tm D2P'b@֣Լ݊evD b MjYUVg)4GHeqֵVbn +3q!B^Ihz&D;j-X | >~2)Moʳ)nAv["s$vAY⻀f.us>gU'll"dWaH1<8k3c"e}%qc{a!CKhcPSmxOF1ΊfKY6 .+LWGK?b`M,*4*K D~ i?)EXpك~1 +&b6 pEΈ/Il!ğ?f_?(L +T hE `mD8[XZ\L~zf$qS ߘ Z]@e/Pn~A|KU;DaU yDYhX"J(τGYٔzcؾ1*(V}uU3!qׯ6O!ZyW<#gpESp#\϶AĿ,O߷$b[3}Qҗ@v:POq*gt +h$H:!!o03s*a~1b"3]f95YZy+~&YT6KɋϽfUHuФOm(S`gktdÜ GnП 1;"?(?Y}ݮ4z9qzUæ +Jvu{eG9{3m^wQX@~^>mR7u&|@PpI-e2>s x|cr(N+Ws<<mE6SfhL=~2m @gT s*\u +BH6YMy`L ;hUMpOI'ֶp!h6'np;9D77pdP@| 0XKCm'@64uy%e+Y w,U* yHpnn9a>9[fa4c,6 U 4#rNҊ1>@A7$FD<)@E=s@[ lA&! Mf} !`$9߹]ma1X&OɋEt@4Z6"1^YzKĶj# Zf!- GͶĜ$UUs)Ңe$!J\+?56h˪uuL4T˗% G N0p*"QXmtMiۅT}*]zW,O0)r=ci- x+Sǔ:yvs=n)N(L3#Y'(E2y!/6^ٷ *'aDc3uVMw L5y $z.MՓBi7о`$1|{_(>S)YpD%Gԯ: A[o]v'*YKM`rQD#XN1 $?N@Cn=GIȊ1X +F0I!c.aq +P*"i~8*,To 18@/`wE*|*Qٖ’s}xRf\Jsz%Pi1pRl4*\''~CN6l;Oj2y%!dx }wc|g{ӌԭ^ZAcRm9Nqu}ڀR%6x30cPB%V)Hw~+\aN|ԮL2ص,XeL*ɥ4(^h R.? +>Nfp+n[>"ЄO+7Q! )_ټNT;`]YfX̕z>O5uuk g!!}5Z>sZՍ Qxȯc)ցZc5J:Q_ӧg=$=[8'}ad(PAq<)&|h) +ضzy:m +) 0E\IQ xGC|D RvvZ^qJc/u_םzŠ_|4x, +g 1݌rȐN*۩q{ڊNl`GCXd2]Mx62*a\=7M둡F˜TsPugޞ&l@Zj^97 KҬȞsoh(#ɱΦGTCxnlɓ >>f~?HS]'~2u 1/_0 )KPkH)a#sq#P=TE<^|Ա̘u22ʞNBa|&Q٪zt|Љ nnt֬ђn[v Q{X>{h@+t%+\/\^ /QdaaTj?޹l'o񉭝EϾ# ऺ|bVEn,2z[8RPk SA}eo6\>%5Z2.!Q ]*AGCn@+@x.@&̚IVRau45 +$hϡF/ub[PESJ5{{*[pꗙ(E@4zru >LR%o\e8iPM`oAYMoZYdokYhy-&{Hi57"lb5D@r**IaD9=\M<` 93%5" Yg9*-,B wtQS |4(ڌ+ʈÅMsZMDa89t0]bV}BElFOӭf +Nl.G2)>7: -哽o}*ۂj6L[S??aL c׫/+u0rfxf8H_xgF\9߈y[,4Ꙁ/OfÅNa)8XYO/e][EUZʏî2fL3Q>֎+>Re@d`~oҰ~}p됲7ث@6PGi#*g` :Z,nvpm%ȉSI2* FY!4%H$h +P Ǿ2;:n_1stlѦ,KoW))0k@z,z~\&"Mv? n 6r! `lO)`/k*5}vs":f}M7t]108Y2Q Czގ,y}xB*J9EdopὑIn'-g%%HILC`"Uzm_rhl˄:sK֚5-u``^0%b遟(ՓrֻB 4Q|8h98 &bz2ؠ(EӋqP :ih\ȓ<ښ,R*QPwuуt{#zws}PzYR#:ڒ6wpK&߹>5Ts'^X1ܚ(@0!%`1+)MC` 3T<pVZssq#]84"v[;}}YgwxsKQޡqq'Ҫs96 z2_d\{o2+-:k> +W}h,K%wod6#iEr+sA.sٹd-p-"^$BARP-"jۗjc_R^T5"[}-5¯"\o|A$,Cف :, +.-⤨hstKWӁ]n!+'wm3GS;c'[v^<\xƠ&4Z)^/)Ci:`JJ܆7UȄ cU\Q~G8[ÚᬁbEe}>[K2Ir7 Jd[S<=r;)3#O ݮ vI_^^h 7N&'BEv7 XTc?KXfc-~@JVa; +)iwHw.#X BOrZ꒝AR ϫṻпPMy='e뜍[[rLk+|eJ`R/7-ܶ> ӾgW`VXKNjM:72S >RahM鑻FN.H,ׄSy1e;110vXřPC2H=F?[n۝I~?Y rC0;0]#vj/][kQBXﯛ.}|tuztI%JT{D<4bX ,蕊,e&R$t)k}aG nFeYŐ&:^U7/Y%2D%ǯe ?/AGY9K] Z7 A])b"LXc(;x3ѐ3ֽBy rVfg]]V^?C3I` he}Y)QГZcg/N}re KbE{,P=hRl3sH6a0fBhn;d?Vڛ{HhU*7J _%nD?id Y_RxZLoҮ)h" l+js[ݟ/%ѻ1,RXna{-Ѻ9p*]]tbW+ک1`[_AgH46SXd)~hġ Bﴤ \+*2MIw%xAHM 0I"Rmb+/"ꊬrSF=O\Ã"[Qg3u$)YxSr^?5srA[7A(z}~Ko@-3N,0 +-|7DSH+}aֳw?b gxW[cȊ'!4n*.mH~bHl+)U֚B@ͮWYA MOKIQjFLkRY~[8-s.bafVx +.mv .~DeT*Z^׊L [ ⰽh5RNSJ r5XTI7 +6cE4R0of佞p:^3XA!,QrK(hĶ X&5'>O"cn^XT+Un--܆WB՗sh&UEh\$+gٕzƪ ("8au/j|]S$8xGn0]p^9Q.Y6Uw#ݺ*z+}R^L\ka`Y ƓETBlIutȬ55hYr#(o0' &#hjifx;O} +XpF(:ߔÇ7/3s@"f7q$ _g~WGv-{PڨҶ{%hsj$ {H7/MMU$ĊnJ@TԠ +~GFV2Ƣ,79睲KP"mdhhSJ,KƅOE۞E:rMn[cSdod8j-v%bh#Ux)<`Z-rq{2.t&{>? Ư@KJ``L$4ƌ$~9ͶA0z@ ?ˇH= +wG]@KUAx7N}9Yp7ūxyJ e-F,'CU\Flu]RLI<*#ky6VT_t33+޽9ϟ"#!hF~̸^sc 7pĐc~jIe=K3.^љ柣k3hnUu[Cn,64~Y;}@3Yo)R[Tl-I-"7UϒϡWzD Ӡ*Y?m9moXh?;^nGē,->ڀAl&Ț,Al$>\ ss1#P)4vC:$T_^\"8p(lyXt/?H kALF ȣ SuRY\<<歉hhDh\V0W|]/$׼S Vv_v +uHyTɄT(vtujSrv b\l +J9N&?ˢ-$q BԬuvFNCjdN:cd74} LOmijYk}O}%6bdo+a'z2 "7 eFЊnϛ@q^!nKSͬi tx|B57&&D2زgs+;7#AٔsNl/%nQ( m[Ŗ;o Y,W4Z\~5V+IoT!y*yp+Hx]fRL= ƔMζ=")CC\؉KڢmhrG*B|fiUjđ7H)F +('I|ƏTu@8,p"1l߷nP)'-PI%l0t eľudyz4E[527ځdW!sx)^.:tM.蕳1M_yh^!M;%+T?j}i3URޙW*"T>5,b 7O~4LJY4bgM/4V_#È~q-,وFIf S@NB \x߅蔴~b=ԷV%, At'z@&igBL w%S:{u~hyN`vHNyߴ~gEia;fҫ057C/+7^1Y6/wpP?\Z|nN v`e^G\ojQ?>Z2mڞPjU Wb"z9'^ 1"lyx]L~R\]3@2vOVWK5ꬉ:9ZcIN,t&-xwCGޱ@01~e䒾'Cڳl- .\Y_,ŐLq곽<4OAZ5*$cL0Ng?mR +WHhO Y4H;kU* T3`W\v?hI $hfj:ضg#=u!hSMtq 4hũ,%(p4mY)EkRk +OKz'=BT qZ3oT/m<֟5:j|fƪ8c?]hUG1Pyv>Ɓ4%'ѨPTEᗨ q+pLO^K2×0z֍C#_kD _fBF^Yk$ u^ @f s)Q}E/+ײ}m`{ \`qj 4'XCRr ] kR!ByxԀs):@^u+^Zr0m!@=? +KNG̷{?3=)yek" }wB~ٷ7cKYs9_i^i(X^pcujFd +i"cT9jH7&IR`ZOGK!-^ +L|Ӥ5YLBǩRYժc +=RܻwѸ1l H|Tm2o#lc'dI_$K +1!X_UArW϶a{մBߊ$Y:C>+7K)S"MvVv'mXPW4~2rLC*SJf.\DXd6ǡNV2r`˛5=ah7'%$L1f3pdVDT>\:" +$GN.6;%m=!h(ɴ$伾I(3}(yVIJV..[f˝6AjU|7`U4b#"ק(JUs] W|'78,fC~4b?-:i,((JNJȵ$/wd΄ρBlq#` @ v°%%*No3rt +=L7Rv6r?|o7Dҏ[dGχp׿åC !˲${l1"|1BjMB sꎉ#BQ=>0T6N dƸ=DU e^7uYEK0H·5 "{!+Z +PvHzB P~~UE!<w +[,ZDP-;S>DH-zdD.n@be},Tu ]7ǹ9cW^ VL8ɻQ|cB)k%9!]IWScLKTz2R!"Z r{ame&s٬KR@֪&Ⱥ\\-Йm,zލA+ݔnA̓I/b&ǬQ~Vpk0zJn i8}1,R&inʞ L@z]]ŕT-gqK?֊-yǮN8ϳc08M 십U"N|)e'rɡ3޴-@;EAI5;]e/PcUĺҝdJo}*]Ϯ޼c_Kl]~emI>۫df= "D|ΠWjsU^`Ň//~B pk7rc]8Lfȥ9U RC +`&r{(Oiw)Vq1mѹ)h=_Y @gyߎY,ZfyTE͛/NþJ}O[趿3Aq LH@d [ XxvȫYUxt]k~dJIC Us)υ|BuhZ# z<8ʞ^'Pvb&":Bo2wl-muvC'Xd\Pu7.N=!/B|YE9ďriCދ/9uNzZ. {1PL\sTJ\w3P:$ĿEt"F/M_CBƛ.-yXxf˜xmdwǦ +xnmu#K+~%)N].vί+GIgOE\b{8BC93Q_ zR+w&p (&9vkV{92bH!K6NN#NHD|Tr2F\zj%vՂ CIGșGg%Ssg_r.T~GvlksOW͓ d\sw3|u7[ɡu &][ +uC?^<9*9 L** U0*Xe _mg=/t +Z: 4⥭ib)k^^*?K%;}\Gs#^6y-9mPR㭞V'Z ;J.v55~D2ystweLẗ́زAa =<%oucfhkܢ&C8-vA!M'$-=+yܠ;D.oޟV%U\${ojā dŻjiSƦD>x1ُC"QM-7ˏA^8VGpL(0'Un_:1Q)H1P+?|u3jJkboN8׼TddXu1t^3ֻ!~25WP8.DUK1#36?+<34En5`1_edsA֔4AUWUHGXcà/A2 R(CmAΕ-jQ'-qdxw/XK)&as|y:rX,g2;/MskܮZ>Wk8yM]W$u$\8{ʹHVo|FJ$Mqkp1ףwP/sN+17r^@u@3 Uk(IQ:&k%닪pl3@nl&:>L@՚Y!zD+544Ȫ_ToLf9h=F)HPd`m%~(ŭ]**jx9`lΟ5ۯB~&|Vna$ o 9:|$hA!~*'I +rm @5Ѵ&+ Zcu|viXR 61xߖ]N}:_c,6Pkw +V}E,&̷F2Z>Zt&ݞ8`eQcl=:;眢wbh7'q@׸K&Ǚ9"jN'*Ӡ͒lDv;oΈRT`+/H) )fޥeUu>2)2&߉Yw])/\`HS'BC(Phtn/n,"(vGq8հ0vOv%=\m'u{8m໔Ke?R,i ͝4;Peu9 %7'NYT?2L*ClN*".DBi~# )T-zj + (vj8!lc;Exٶ}QV ߻sz|w49FIq؀aod{?`KlyBkZZIFdG!Vgh >Y> @&e䟆( +8\Dys\b9'{Z|vwnͦ2aQQgqVNb[O-Nʊ7bwHvf>DI~a`42y gakj9 R#V%L[6w _Y?i;ӁmJ8r +[uyjjz\3CCn;@NymTd_ B0?^nRRoJ\#&Bkż4>WkYSEB_usgJ}f/kfk]mA wi,EvGPmwEzS볇uSoej9ց F/{C@e5]JvrǾ^Jϰ@Z3hƉbNH\)o?!e"fAwXSrsIw ."W=a oyNӄ?ӑ"m +GcY2^SWTh23R't?Y9zѭtCL2p+ .Hm;1F#929k5.\^2_47Ԫ4d8h8P48ր&ޔ.׃L@Qwɥ`}t#*_j^.՘UnI\m +Yۻ +u+ ~1TE DoIA-NBP&T V ;5݋lxu4Ua9APO$7C_TB&$7:P*vj)؅q +ƒu7k ƀG'Y9T @G-b0=oKaLP3 u`۹1Ws;@iQ TT|»rk;"?bW0'1lA=UeG +-CI|pnjPd$ H ~~f(oEE᳐ȣm}~.M E6{-neE\'[C|bw_6_N^}\J~3ްJ}p<\|3mΤz!mҪW$MTyݢ4ܾ6eM84q"ZUXFAOW49yc/\giP!FDXaܷ@ӄ0)Dc\2NVn74)YL}EG2?{5zh3f$!VFr8Udu3lu%G dOXYHlp_pz~'TPM F<{_76:240CDdZj H;bޛ~N{,Eamׂ&25ޕG{A%>U{&7Q >Dh[)/-ep]WH)&MB>viu{En~*]1U}?G do3%9xgy= E>?a]+*'%{;^:A8Rv#h=CǙ\,od+P_}%Ki|ȿ{\)Þ^+ʯa4U3!UC?! +`l'CnRm};9[/>{ZHs@N\f V!Q Uj\K^TH߃P9R{Yy,aN1ř^ٔ:2Xoʓ/`U==&cdЗ rts 1x$1̆zҨUq}Մ"* DϾNCWy2ն70u_ ZoS5ujlY;|AZZL.]mZ)c(kO#b3LEvP1cL 5j&\Cv)Nq2xÑ(cUX\H0g.ŵY +(?Tj5Vz%tq{>:J PAGդcC8*6ӻMwîx'c:/֟q8sK7o~c`N\T{]Z[- ŧDaL=<6(P9Ά|lT4I6Ax/t +pBkTM t[!hq"S?3`om{=JnK'{ +Oub9%bt]vV>/w/b:" DKkF;dbChm>F!|*efD+žX{?E5<:Wc"ׁ18Oam:%U;ʬ@{2y`,({ݨl_.ŰNFkvugj$(u7\v"b;tҐ*S#*v7L v`>ڧ8Gyu +Obd0s=ԊalG-Q3@T0 ܢcX,g^/2:s=Ӂ;mU$n<g@7lVd#1+ k*F_.P6¤A6\ Hj~Ê pYh_TOrhF_GiHÏ:\ȮnMRHbL*M{ѧ - |"H-KgY9`B\G{@bLJ1JZ >kY^!5_s>k2X“1(+-$=.=,_;]Z7L: Z~;Q ~4 QOХbbpSw81Mh!ӅrD$_7ҚW Cq QPhlU^?KYd;AG\C/<#c3t$|1lA ]8ɀX+&bݭ_ "0JI*/ܼ +qPMx[AS[`e9O7r͓`e#n0gwk#^$.ak:pkOeܲ |"$DiKϙAh/͉KN;~-lI +Ҝ`+fva9L s;SnE-y q\%mXϼa\jyCQtʕKRw- +%Qȥ_LX 8_qp}IΟ바f蕪!v~q?bDH}4w?>x.2XCg鰻R1MIjd!ƚ1tV>q*:\vbXjsZANa_iSʝ8ʣvB7DX9A]slPrKp/_MTN@\pfweۜ@IP3QdZXJJsASč@I9bsʾuf|EP~B͒˻9YGx`ւHML:,yxOt2j rǞ8`m\XKOn/-_Sdfjh94ljW)w eS~b,lJ<[)lL"UFx֧Im܎5 ?lizװ&[фe#T%גeSȴw̼ ,A vlq ׎"qŗ). wJ z8F5υʯ[z8~_SR:\TOiv,W4xEYAH9.3 y{*UQV_ZYcr%#Rc92 +]ͩdtS:z4a{`eHUxR-nybן l.eib#Rk}0[T^SB\2p͗5w5x(Z5x ܅*yQ6q7KN4>l\ z/WHI/НDQuՍdF[׵a6%ߨ ؂*i)/2ǒJNQ˒m|QERdp 9K#Up6ø%K;s`B/yU%1_fGv%M @z66.T`zB] q"\9b!(Ҋ +',=9/!Oˊ 1tInb D* ;:W9 endstream endobj 2529 0 obj <> endobj 2530 0 obj <> endobj 2531 0 obj <> endobj 2532 0 obj <> endobj 2521 0 obj <>stream +HWkoh Tvɼm/.'P]Jb"erWIr%K + X+;qg>/cL`$$|͛s\j?->/7+j_~~X4 , ~HA[O FlGŋ%Z/OaӪ`Ų+D +ugaLYyWrĈl^ϯ=GZm'Oy6'`ًW/Iq5$dux~楻{p/Â]N)io}.j{VBewvyLpDoI . Y>j]PDeqՁ:8W9ٟ s gڻUL܏zn%ݗ97)! +t9Ebpp%f``X# s/G*D%TGae! bXsg}ulۻc,E-d7HZ`}z] ~2MdYߧD0G]o]9zwox\<0 r,mZ"Z:5-Y*8йt?`YrLg;r\kIHsfyX0x`6 Q_iov(ADeh/@v:jp5h} S ׹W6y%OXXoJ` N q i$xp$߱砀x<TfP 2> ҩZy,`7$30 e +*Q6hvA8e cĤ i + ?y'>N~" v@2?> @Z /zP?M/-(疁2of2A`(wm,o\Bնn$~@v90i8r)'r~>WUդynmS<..vBc'(~?C)TٴWə +ʾ zڮA'=e4!HzNLASmS"09/+,_"]Wކw}TYغɼ]R'axI۝{5X@unN\Pս(7R΃"CٛQS (J+,>mΫfJxC.$M5| /٥Oٞ` r])-B\瀶rXUJ!>{ztϓg1"4B‡L y{7ݹDe06hwܕi35.ьD=CbutKFLɢ)BHA zZoն5?PQVJmw_u,){Pao g"/6^^ 9nٕlj2y#Z779P'WAMJW@LCŒ}85 )vXОy? "(f̠A3'>1K(I~6$Z 0LP6k0[2eKvv $!DlNdxrm@If?RsoDD})ra&Uаs?bEqZ >h "`+VUwYń |?ݺCn=BVB5{7ܗz pW@f[vޫUfs4nl,'HNa\CkR!z >3%!U-صeyֵӳv51GE}w3 ۵$E ;gfWn}m\՞Eb0Kˉɽ/D#b ʿOh7`3T!yd&d]f/IPtF(yڟntz^ a~߮ bJq*>*T\0#c|481Yfx~+JQ`سYU^9dg's[(^ᒍsf"V\Q䆰$T1'\}*RL'fXXϡm[CV@BQ0=E +&Aҏ6~ghPT!inigXY$e^ǼP4&#ށ|ϫCX"Rܬ@C3@} 0y endstream endobj 2527 0 obj <>stream +0 @@&K @ '}-?cMON%oNt$0A;&U[]ؠ +팂S5^,`љ =h/3?=ͣ`񌼏Di)=(;6gݟN{FOK_ +q`-wCTYOYVJgtHy0Pmnb,ٰ:(`(%0F\伤iH_ަEW_/F AǎR.-S콗']?%սJyyYL΄Oqڴ8')v!(0&V|˞8+Sے +d1cv Ҥ hߩgE:2{S82Q`Ro+o6)c%V\-;f1V Շ*M}^&mtCqR+.9yJZpDkhɚ|Ua|`j'hd@n5c7S3|˩0C¼$+hvEvUޮ¹@Wo>8 7ѵN*4R0xX蕣n*qlwv\vQ 7Dc>w[{4>JY3&/Ub]IѷCC-ȋ[s\>!z*@G 4Lo38p7zmV.5@&4v_ +eCE!fT*0d&0{bT=3[W +Ș8Rn-l9_:pAwKjA@oYj &ja }H2Lyt%D` „QwE{ȴEVRpү~h_ (0ǩfl2BMgOgeT,؅q.ܞQ{jp6яfF&twV^w# 8o^tbnd}pZ'S+'W><v-@drN/"-Gax谑ŠCnsĬ HdB_$^qksrk._H %LT' +qkkL99sV3 +o p f2&zQ 6GŊ'Y pZ Aҧ$ch| + + x$ڎnz\4e;gRд5-GɐP֯ghft3xx*d*)YI@]nվYiyk% Slt/ꓒ$4dH _+-8*([W+G%y9^ӊ^S DC)w:q2$n5ExLL`A8|?MɊ {$uEŊ{\Wp9ҎJt-+TtOI-1@G,mWh/}xު,v B{%^|P7l4>L o@yK3B"#KGoIZ+^_-::m+Y};ӌ{6ϳEe} '(ٖYJzV  ;RvP//3U6&jl:4F7}L85_T0 +ourwanjyxNx3XPjFAXC)o$Z$#9eX1"/>-L8­bޗbY4Dj. uP +|4*Q$}nsd Y C_E3AVfQCS+u_6yr-:Y>WPK8./g/Z0SE#kdhq 7~ H;1V;C[5)e2pswC2 5+QF3TMKuheOj@vUe#ԋfGw!/h4ͳc˿^Xw9XT 0?~@MWfQN(/O U+("bOj-XKKiЏ0g9DgP|0Zs8xBX6peCF'?W7Bre0ճp2T rR#^YtqfƀoCՒy:T}H y9'Dx9Vy8% g); cH0=XҮǷm ݾDFToF ro%ϻ"id ;&+,h'E8hq~zMH:| +Z,X|8"~L}eꖹ}Ck l8]E +^N'8Ѧ=sE&hިt^VA> c~r cw-k.ˡ'uUE>3x8ql J[Al 74%WrwbKp@οES:򧜟稨yc_)kW&3r4WwTNFRy +7$ ͭs!ū  +mГ(ТQt̹*,) 4wB2p4B_R~'}njYq!#-5X# ߽̃w0BB J d bLMstXVK1Rb-'N i"^%A=cdu?j| 9izɰF6!2ǚ(,_UCTohpE员(Wi. e>(vmqsa=Ml +ռcvu-va5t:+ GYaKY,6m,E3V-]{\ rAzѣ!t3aվ\A-_6v[`\,kw?7=Jb9/MEO0LvC6g3}GS;g981@sS6ʯ ̕ +J|Qѻ8Í@a\=(yBnL'Cqˇ%h2zJ?yv h9U~|j<f+OWz$+D)Q69uiVm%OrpKFgݻA<KdgXN^mGDIho3dħ&7%]̖P+U<'C~#+f0GdϤ11\S4hiJevfr@d%(+SjPYf.؂UfDZY߄t'9SDrkp, UUʺAuJ-b%)ri91+JL؛j4bsӸYd>j0U敌lTŹke\L1%sS k@X*BȧE,>ca!H&9L+y h6c<6|;*)<?@9<>蝖3dI! +7ipg@&"55oOm,J[/n4m} =bF$rr[ve멘4+^΢ErxCS2zgCzʵl;Β`* d +kϼ|  *Dne)Լcݢ軀ط{{=&Dke|Iڦk7v!>}gZ:]-N<ĨS %PeU@yQh)3qv)ٍeU{ ܒf3ϻҌҥ%o`ٚ"ruSp++i08.,í0%EoQl#tVG\գ:6@kf7c'NuvGڌn(43 33c$BDVCM `BvV[[9a?'% 9myiZ[?Al=P:Y>lfxNս?jEEĮ#/LEudHxTuԋ0۱L9ƹ`NvJmߋc B6!?ґD'2r#,\l[AD{:qp۲\ C#D̀j-k2 2K:3Um%u aqm{=S7 D]LR"iEzx@rf- ym0?;cFtŬ^V!S?j@ӬB(#0_qV. )C7Qx{kkB2^{qiX*i\YۢG\9{W:KJ01ʚegqŴib_n;_@Dko0]%0QnnoCĦ =`ņ::Ũ@湿vq&Zoi;ݠ{+bn$e56T mu\%b $6TP0d컲/X"|iB*I +ia] B?s+k~lmr`u$AY!#L^s@Wr8P5|`\ّ cZeePվY*f_YP5S3d|Y*gW@^Xyftڴ2MD"/8L>m{-G ,ٮ2QіDxONPR .; W[%e{"dɾCgW%v:r7946}+W1jSHjmSZ T3 ?9)khLU{n(0-и&N+"͈̑$ZjSRYwMTm)/q(,qqlYe[F^YT&iGKDK?PPrF:m^t^BwxEi6pS'Gyֽ@w=6{puG^F}yT*>#xmf>qbk{]t_dCdˇgN?ަ:5}*g9mvT+ꍊ`D&6w$% +7;"Og O,Ty? $a:L^(f >ˇeNPs) jI))xJEفp,"xйQcUN+&lBv Ń6BB*XjޯBC&7˻7<#(jOp]NSwL݃ybYբrلΫ? cق;X;`KTքS\H(2)mxJCt}`gݸFpqn0tp363M3J +ZU}! v45>?"+5kd0>B? \"Gc]Ca,-'G8OLp')b+kbܡc8O0/*Jk{mL C⌅Ust7fM:\a2{dq5ؓfw b+VLIp`>U3rM{(-L5rt Kl~L{L^e0:+ԱH78I&#M0a(OA+Y|ͳq&-FiңG`Bx,Hh̾SES Rl'{Zl hwVt{x1VF&JFgT˫1vsL1xˆ}F8#|mG*r(հ:kz&Qdg k]׭ ^X_8qAPs-{[h-I(ɉsx4ny7]*M̭F=a0}7{Iݳ.9}KjlJ5@ f[\9Xh O\Kcs")Wx5yQ*cqaGwܷhtX$1F+٠QV(}g]` /԰0U^!!yZ=IJ5`~q W,4{Tb%Sў>3.y}nzbJF%1WU݌@L/6qg'a;Og(D:R +8qtŪ:Q`+_ )K:iDJ= 3`-±Lj$eCۨ{-޹j:ê!l(}4˥:#ΐ @{V\Ւ +шR%Y>rקܬ cWX~fU[ Jw ¸-sUA${0W V\tdSUv+az) ;Z)KcP9oUnPFcEI3h=P.&c@ ֪8aԟ^B&+:!xէrWW{dq0d-uēw)=ܻw»00$uc"-,0JRm`݅&B B vB݇ջ*vXL6YN8|!}aIΧtW,ȷ};2WG8Z!ȹR,v+uhXy}d]b)dݨVy5kSR5\LƯ-$1ީH6^^Qw_ ^$".薢4z䕀Ã{(nsqϯng6a2̆: ){) F.Y4m;F<7n7tV7HӋ<%qk9]uY*&.DB˘N:Mn>]Pj>Ts*,h[[g*v;R"4/Gw03{(#^5.8 FR=A +7XQ沒<'7 + a4"Wh`$(F>}LNJ)4w4DmY[lۘ ċGm~DuSfԘsqOԣiHtKڂȳfc]_G +10LMw5ݶ=M=EwC&wŽ3TTc`'(ۗm/*.2+JF+?_"q$Z_lOZyĵWF.k2͝]i]Y_2[U\b"gs;2_T6m,Fg^>2mR /\Vm{4y3 sFӫPOVBz أ&åW`LRʡZ8KUcR$H Ka/'_$oZk{V ‰|.ХzͪVNm(H1p%q+&㑾G.el gw۳Y +pTI|I'6Wj:&Ϳu41뻆qXf? +AVxá~#=Z^p\ror{,$?"XFZ>ڷ#>?`[L-7aFٳ8tُ9Jt, ᤞʤ ` 1o3=U!&̱+6?~pڑn?חf=BaR@f)#q!K:>,\ p ?, 9RCC˧" +1dҼ=``^\$:l;?c^ƺvNSUIȍ}U/MFaU%{O;e!%*)c,ipN߳IXqa@H]iB>ѪpCw,M0h{" ^ Z{Jv0RAI.s;څ'W!ƣ30%0,agJq J(4մZRG`bhu Rjl[̽ZZL˝59i2kPaJ@hۭo[jO+-VB Umzw[olg1:tHWRn5FLne\("9%E96yk<~+ɴ*7UpO*>;>y?hK$QQy6Y +wMfzN9h)L,e8D2Db +TUOՃJIaFÿʸP·m/jz +^ʾ7ڰ88RCԔ`0.ml{y_ 0?ѰIӡABPyKZQy}^5b) y<>3]Oܗ}~jEq'oVS7uS,`$aSXaJmq;_Te4т1_all5UEo +#xzϛ"̌1_[H G`␙KdQ^xP7*،'+f@@raH|3I\1UH*^i{u$EaMpgǐxUp^ttǝ\o M]^, tq0Us&aOIQɷB +=D<=!}@ZRn0` "%R|MG*"KBOQO7:+X3l<ijS'd,C@4=t)ԅbxwszLL~![i +FV!yjπfypt(8O_ QpB=TN#E4ғƷHE|Ʃa((M fI1nwS oҭuHdވw +#3H_lqOƯN̵CY%*1Z gkmH@sKdNa3 1P|b9waMY- hVf:5s>1-b||K6Zweh + BfM׊SM +ƫB*n5ʒFy¡,ו,uޙLR5N{Vje=udBT8 #4g67 4ezʔw[7qH?VMd$%t5*ϱd ˵=8.v3jx zz U](~u\s.s&*mK\Z.*OX2 =G"#CF/Jx|W,̈yZ\1>- AiX=p)um=9\wdӒGy_ڈ)=\ŏɥn{1sTϰ8q-Ϧw-رOKd4ITDL=7dA-J'X{R녜vK ^i(Z\Ε6)pObΊ_O#Kl:Zꛩ(6Ƕ*oHzZ 8Xx\TR+@k X6': +f o3٣:}fr .,c4{^uaChxN/VӕFܛ BBlr$ 䇙?*D,KMΕĪKm +AT3OS~Omc&Y'KScV%پyϐ0@r)85M +L)5qÇרWFލd$7al\)1ArA, 7҂yY[sIo钺Q̴Hь\ [APm7=aIPT5ʣ5X7&>FN7VPo} QBZt,~7{+*闒yEp']TإuQ3>8GTp&g-?Y+1KFlbƬɮJfyQ{X,E^4p{O.L٣нj ݺ!JYfllYdyuw$̀ pnRc;6^:!yf{u6 *Úoۇ?ek<+>U,cma>IݙRH&2͛ϫqh +"VV;6̡ +_ %瑢pg'C[syhVbg.E2ΝVV:!U?e^` +8V灷d@t +&"g7Af%a͂@g{ZC&$j0V,QNz'q+ͱpUuogRiV͌ʩه݉6OVSs4e +6bO8$f0!Wb?>]iZĚp/E Up5" \[dhQ_ZӼZO䌊ԼƠ&fȢ=weVp[,Ƀj:Eu/ Pz4߻i+ +9#l%k="x5* zt*Gr}S;q睷&@0ץ=>β 'D E9'{ӂF60<>wę1vM=;yMx0^@hCnP$݅7eƂ&_E.*s-h)]RgTUG &\[[@;j#k.9ڸ8oG5(&űekKѧ8"o?-mCި͉r^2*ie4״Zy- Yٯ"n8g{!h{'@ x ]rtY"轢XA/Aۉ: yL֓)rZIC} +/+dzr8$x5u ;c =sĢi eY$2,3 3b"1(LY֐Ҡ?:(;p`1U- ROНr2$ꇻy#AM58g#žI'f`aM7NI$UoNؿ4סs`\QZN"CO,\ Ɉl!чyX}-"+mc)vX`svU=gz +q6;vÄ_ƑfUVz ycih,-x^SA`@ʋ = j\|:)}R0 i"Im{L*E@QgJxcW r}Yƽ &HhQ GvXUR42 ''TMn"V5RNOn@k+>A13J @?]i97`jZroPѳi";ub) ?FX\;|W l ୉etAi>ذϑ]B | ?PC) +Ar.~w^K9fe&KV . nBL\eD]GnOmްQQr*ACx]y^pR:EY!)iFW2_}q3XX7 +vBFxYVl;X/ E}!$JTͬUXl +L(ZYp(A#,QgWXMй,// /',NF϶} endstream endobj 2522 0 obj <> endobj 2523 0 obj <> endobj 2524 0 obj <> endobj 2525 0 obj <> endobj 2526 0 obj <> endobj 2517 0 obj <>stream +H=O0w +ezŨЖ|F8 !@,K< kAfH8)&_/*vf= 'E\w5AG,Ji0`F]W_6|2ϫ6Pl1?葢>544߮fW{}/i! T񛧦2.! !9 yn ?%+U!h*ͺ)-N=ޑ'%PE@MD/"ƖElзH{k +I^C$0ybŧaz1 +uq((! ~_ Vk;Bw» endstream endobj 2520 0 obj <>stream +0 M@&3 M~:}HRcmMfDK*]sB}<@?ȇnMĥmVol̰+kn 99̤+p4`6"O"?yuxFf8- xxюpt7@'u/"N7  D6ω{̥E|:x7]a^JM[T D2;zG +f6K@LǦ֪-I1?F!$(\$MH$F/~>]?Ly ?OtE0$@/gn~Z,Avc +U9bl\k0'XBu8{VǮH;;fOn( +sudi+,hr6諱 '~&I=8۹T$VcW^ܐYd/3riPԾ!agEgv>4n0qDay;?΀:Ҿķ/ AйLeiPp8VL4h8.Z>gp)tq㓟I}~2~V2IM) ~iN\6c7ѐ/L U|H?D~[/Cok`~m{.!S;\Y^fZv,`ZmBUoكZʃR9F!7aDC.T!E4 ޳C\+|{?>|j궸gi hb:hxI( u1=9@pL ehADjp0IEaZ_I|k:O4\RKpJ>{x# +zY \[<|4)l =aكE6sfT:35`CPg|c iDT3fjR]A D3' endstream endobj 2518 0 obj <> endobj 2519 0 obj <> endobj 2510 0 obj <>stream +HWio_o@ $^5NA@i8+&vߧ&)1evWի/U-!eV*_=i^o/^l.oHC⒴fsfslL+iUm)mfds7O7xΧfjkf̽lfԴU߿{k3OC`i#i++0oq3dB\2Jkôjo}SjS F6WS\uieTionvW% [x}wӝrA&?P»kUrH" /AR1H(jow?^Z{I_ +߽.>-=Ty{"}xoBtUj!IIvAZtOxA[@$eIgil(K12[m0g.[6|vg1%4LBqGMNgs5ÕGw~ѓ5t*TwS?MGV g ^r q&:?e5-l9&<%R Ƅ{dҔ}ws;۝`yɝYP &>2>,`u ^@lV +_cǧWéG]y2@E7o&(c?P+\NvtBȆidsGnJD氅)Xvޯ&P0)VMkz .N`Q_}>0np"+s CaEN_,d0F:,VX 'zN2m1sȋI2R\UzëmAwl((Ջ:Sm_Okȹ-@Kϯ?GAڰ^Z{زbZT*߯6^ OdЇ ґ<#2={  c endstream endobj 2516 0 obj <>stream +0 @@&9 @~K)}Y$0:IsHftpaq*`zd + !CXF0O5K_!d;1kED8C7\{2Y;hؕgf2">;|\ҳAw駬I#v>3+6h7W6u]ye-( uWK<1NM#t +Xs.LJ&og16=:! hD [3BG lְ:qKbك}:p[z%mP~d8Kc1qҸoHci9)_W70|Fɳgp?W7ck]}t]TF@+߱HG%$^lUx߱Ì7"ƽ+#-jt $JۮKQ9QBDt[aW,S8&YGUY}5aR)x'fV^]Ǟ,q>䌷-4${wC1У;{vrսo(C0$ ~HQTXUEJ(Ų/_nKeyOà?Ũ?,c*\>[.!-ATYޙlp .,ASYnHf;~*z +ȹ, Vf/K=/y%}rH[n]dfDmuIޒq2湅\L 䖱TUsKtb~f9*gl"T">g[/29|$)*8tm"&#o7<~ [TQBF ͢9`Yኣvo9Ad Z$ +Lmo?FV$0YzJzD;M3?w_ĵI4wB]vD@=ˋKJ2t+ׯ]s$͝iL|6YG]Jٮ3d`@@L\o&=B)̰JUqa%Xb`<+ +~:Дbs_c{@֒v M Uf9P+UJ|\s"' dv2ut*L LmqҚj׳ӗ<8šXQ'0#|R4ٱ'k]"8WaKn.[ÛC*ܡxo)H6 PvԧiV *<*pϝO<5{=GySE?1y*98M/.f=rcx[+2#ֆ?ԫ>v_͎kl;>*z+OAv&BS+KKf;Z[z.L w)F@0P%25 / 8\ s-c52|z`b֦x"PgdKl`jYI톱諩X;J?{)m9Av6R`tN&l8{^(!b΀^hDXLTs4W;:I<7{.z0[0BArk>6pV$xTAC#kf({3ĶλV3܈nhjƚ|ZgsYZ~hυ +uCV}g<w8,зf2O˼w _•o׉@ذ|9*2*NxO'YOAS.|ysazpq+B?n#MJVnSY(?9XzmVD& ^ϦC}Kæ~게ȎLVr\;(`}Gpz(P DA\&j'֘V, ^Ab _w'2벫ӯm5(]~@ +yE2\ߨ`"q~lv/q`i+EH2/o󸉡F ~:e$`zhn6zXEmo1`Mڸd0N}a$"f:ޒ+Q޼5\t8ӭ]EVE*ٷmHJ%tCن%‹Ɲ ])0P1b'²~CLVQ r!$v@PZݶeEbWsU1$FE?w* ra-)2S$G7CJeT ӰO>=d+.{~Ż(yG.?DZx#Ujs{QPhi@G[. GO޴";Y-= +᭾_1LvT U_G=ڝXDGwZ`l%׀!03;QHb k݃3/ ;!\H7obSͲLLjIXp ҩ&z gǣIszI! +i.6$DNDQbXeh*|;^[8:;hU_*Z{ Y,O"^L r(E(0V~VW Rj& R]hmm߲;<)VxZZ修`H=]O2F_uED7@9Z`duW߸W/9 OUiS"Kb I.s`%e?2CT%Lfl]Q! 3 TBR5fov'Zx6..ԑ,Թ+~Mzrt$[TŎ6 ƅ.rPek( w>@e+7,Y.Gee_y0PZ#KM6xr3;`Ip9{vNXIQȃ!͖3~,FH~c36浪 2RcS +>OLe--s2sfݵ)+F;s:% 7̤evw(hY~V) _!&׸DHH~#~5Dv#RC;aɴazܻOXvWɵ!},edZ|.Fi8ɬEyƌHj&[1+ȫltDq (I :RIj?1!/Js%#nݿRYҙL"NnS _SmݦfP1MD(Sk\U2"&;7P~S(}4񲳙\x&'CDOIe`|NWEA(4G-RvECvb2Uɚ9\UiVKV`!)t&9AjOTVi_<9CjWJΑΉI!&lkޝ: 4^Fr9_@xs9]~BlUfK!~p*ck[Ppo -”E^@9 >|zZQ +Ohc{eEZm:)<,{ԚOpPtAnh? 'DDW_YIڭUÝk Vq'jn?vy/\ɏLw!@)gqӗ(~n/c mh9G9=6$<ʍ +/6g +;x0w3A+Paߚ_ w8o旭)E{[U(,mTGH"7^&R%cxc|nOEewS Ng*+7R}'L<9Bޡ4ͧzIÞ4+=L5F La9x>5u @F3_:?G@S s[/W(uLf̝+Loׯlt;:!2FD*ӈ(ׁD^L2W]Nh(d$|Z6l-RV׃ +&>ʼTfBTCNFr떒Yb.U4"2ݔ pI3~S@u 2?s@m7ĀߞB |Mn"£o>56]Pŋmip*!i|s ߎg,-܃Yk+echE:)AZ* c'AB&$pjNr=n(UԥX ػٶNr2nt36VjHn&t%&`"8zYF!MԎ=z㢜gaCJ_wd -c/TD;O *h_n!w! +`Y +iQM(JlS]`G ; NJ?!LgLao"q:&/AGt'R}AZJ]A{WwMALYW+\`|҆(zU8$;_m&n&"3FX({D(M.Y1aIZ`~LFV}QC'r*EDŚWw7|:מP]EP#*9_#7+eO %T@]^0wJ%—KgO/-|]n'OIr[ M=1(>D:杒ڐďq$$w&pدOJdC%s9U&@G,|b.VX/u;zH?0T1oB9Lr|pF.U1Ǫ&F>MN9Ym &jXز^x{JwvJ oijYd.Y˖oذ2yY!"1߼*7hss[8qC*C{F~+2lop|_y\KPi[㓎ن_'1TxCEm8@E"c@4?j{xY]̞b)~h1m"”^1X S[a&[@m7"$N`p۰xd;fL녧Ln~CoZXY kcюMrV)KC{!K OwNfIihuK]YEGmUgY|~x ];Vyd]dZܺxl+dj-O` P*|Ъ7;'Oz,|; Tav1$ dC}Y kq!X1ӷźt\$$GnЗ` +5Q} QFaN Q`d*B4>mp//:7Ɲ'w fAO-˛,(~UY!̈́(ײ=_rucEeҰKrLpwJ=N.wiwXֺ%ʂ;P&h-Sd.S&_i?#_*qbP- U]d[Xr&@bGUX෗BQӅ@=YR⚸cUd #`M50D JdPߠg_֜L +| +53OXqeL: + &癜&oHWPZ c^A\IBdADI+M@}W-9)ZXIpgt; +1ES۔FT҂ ̠8n:Ls)+k}L]߁KNY qR~/vM +nN D=f?տR<_ ~ %?}r41wO(yR@6hc%(h>[ᢤ|jX>|%8pߘ~@:Ή +bdE=?0DoR~-2f 3'/ Z9?BޤR8˃Xu'n(Op!"wr`}֚ au y̶{7ŰjIK#3>u5N.;s=l+]ӯC*>*%-A\Xq[]*GW-Q3f>ͩ{8Rִk3mG +aL;4uBG;2Btѭ +PJ[9^Dr&O0]XV3 +0zm 6>zenGSeJ<.J1zM'Mb\.8EoJtM5.p}25gQV&FOݫDBC|\L4wq .~8]d{!.䤰iʧ:`+5=2L44}X`GYw;d N՜{[mHE27(<[HKp1|ő}LzدAg:Us/elmlY ;tVeA`X{@ajBXހ ~vcոvlJ!AYx-t~8ؿ衣eyivI@񢢒ʓ:ɞG*5QC>zUĝ4EeiMrAgt@o)n9 T2Kgv{P/T[W&{ns/!J.DZ9P; SJG۷F&NMGw]  Fv1|2)ca֥P2`krRLy"w@ٞRs6D{I<˭d,H JW0k|ꬤ&Bb#:.Ξ +^-s=@ܨ&\Lh|FhFH{繩S·yS`M4ˆ$ 6b`OHR7XжAEEciBhgeqjD u :, O>7K/ ;,͵ ._H@9#;k{eqR!#2q#n2T OilOv +Q/7 ѦG6 F5YshD}:IۆТl۴ + -?"Ś!Q8#C g^$j dh+ Í=os .l.zkzN\WJMeyU7m)L`j^ Y++vl],CRi9Ni0^ P`ZM8 @u4T. +B迲ǹ7gbDeы"7.N*e:-6ނXF tga$"؊5!Pd9?Tqjt.O+oi6{78S_FjKݙ}n: _&YdQkj_"ի }֚us6jI#J{&lgT_@nzօ~Nhwis~RW8ِI 8>*o2ֺ*$Tħl05K.ԟ+NDZw Z}2!yFRߢiS'ww̯۸ [%^XC2D8FfE:HJL8Kx&XQ2H֨jH% j_D T8ʚJ!+bioş"AV6D5'kPHqXX;Ė̽^@1uڅ`ܐqW詧B,6 W)LjkvGʗuLK_͍pq`c6Z(\nhuF^x#`r8ZsUnMŦ\\q?Qe< KmT_}[Y6߯M &]gW3iAKX\oW ʽiׇ3 {C.N!^U=u25Eur~JW"|՟-= R>dEwM +8% D_+x|0Oc(ȱELrQýQݿICd+yK7}S7L*ڋȡދ\KOU#Qq߁s +u&LS]Ĉ5S N`35Uxj`uɉF +`z]۵=mHlmM)٢6; +*9!1?tBg%ڛWϻe 45L8Rdhxϰo>#YޢP&00e/,o#+hޯ`V B!I7 lWlfeyO@T,=<~&,Rͬv~62hVnNaiA) J)pU}lZGഓ$ XN$sKa>yf a'  ?I0x.+>p.$cS}4dFZz:]zu<2rAt&nVBm~)R©K2mC}&k&GO2Oi<ӪbCLʋlWٶOeuq'+IC SƿOsTX*MSid0Po)0{c +_|Fq-[}2L}&W>P]Y}CKBQ}4#^Z4CE&uӴ(Qqq}0஘uH̡J7C&)Q5ڪEzQ'_J>x!UDJ$wQt&N>cxL{[ҵ+]rSq E ee״WD ۻ`bv_%U!V bVF0ߎp 0o5`ۄAؚXoQOPbB3m#PGcSn۹b/G|@%#;tϋ"rքRYc827 +} bCoߝ9.AcBJMBx{ܦWĈe@LKA1vwtA]/Y' e0t,DSP@,j!yaҼ+@{y})V8M{(N^;tL`P}߇CGi[wR!b-Cȸ/JpKڷP>XsxQԠ`>| jo]S_:9(`h7{Qth/OO*|ie١+Mw9_J5@0qȳ*?"*y g!%P~!YHF+ 8ak%P2prY7acVn!DgKJp +)Ww9zۺGGJftvAV|) f-KN>.eznVph| O-R3qV%W?.yN8*Q4. 6De<Ӽq1pibhGKڍQ@JxC08ZT +X͗C@7wu7/MY2 +ʠ( n^[28+xm4Zh'\1.Qm-HnYBKmuڻ-Mkԅ&ah|RܚiR@sXʆAM8ᙯRTzHc'QhM*,AO&Zh:Ȣ!ܝ5/bF27= %1z +FL XXG*UƓf[&] s]]T\m6[,)TIKژõw@i W5I G5: + EԬJan;Ęe[&C#l;/ĭ^Xcf{wɽ!&f1d`'(.Ѓ_-%a `Le5zE=L_bD9+U5i:6:GVw8aq1ix-XcJz^<|JRBHL> endobj 2512 0 obj <> endobj 2513 0 obj <> endobj 2514 0 obj <> endobj 2515 0 obj <> endobj 2505 0 obj <>stream +HWkB}? EC +imIQW)Q%)og.kHZ[0ܹ3gΜnuA !?҂BT7?77/dEW)fWne +)JBȕ0pdbP[~f=ywfX}a_ë_1Fֺ`jW?Cp$ 'bRRCۍ4}_]Ix-"1Q8S{Maܺ󴰊 m0d̄Cl +E Bxp4ر&Ʃ!**f1,jW7UzgiO9?!+9zyNsi$ 2KܟҜ4U={^c +e*KLChllPB{Ђ[s;g7481DC +7q7~°sP"F}uB) G]tO5l*,p6]p v<1" +5л(K@Iko08<27ReQFħP)*`Gt?> SԓIVy 5U41OS DŽL\bnqtLFKco +س/\TFB~WThtH|}[p9at?uKD4,'Lje"K OUwp$;,Lj+")=*>KCx-χI3QY"/e䖜#ƍExހ맿B|'ӤwIz{@<}T@=]H0<,W~TL-#Dl~HɻRauv<rܵin7*;)@bLrË|Z\ɣCmU".\:5΀;'ᙡFzR׮*86$Ơ_$>K9[QD.M{ܑL|d_nn(13S +|]:1 vfjacb>T| |$~  +0)/VjH<`?If US aQ,jz +-CҖ@pp-ęy5Vz}_%uXm;CԚ9I֭|UH:?X.4,‰!m t@ rW]w?:\Q Q"K9|Y9E,&K%s.+6)IRvM,fmjÄ=cguURlt9m:[<> tѬ),קG+~ +"(s] L5@|oXП,=ƷȈnQum͋ +[GTn'9~k!{NCG[㌐KCY@ɝDi 4%=#:J|. +e5 [$솳nh} uUgN(F"P+ +TP +| KK0iNj Dzݶ7);NF܁#21*TL>!5c:9QDZŁ@L]G̤ħqxKg>DћPg (>笘tPe@#F~ݶY@ā??31#R}Uҩ,-ij̆.X8@Ez"*~9$Ôn( T "D<||Tq hdG5Ō)RByYM -8!]Y7QyQS @%XJ؍E)J41 :ҡ<  Coqn-R4q^g>O3 xHhXLlIIϤL9uon)[D.,X_![0fv.MtB2ۧE4MZ00I^n0 _eCm>nvPl2lK$vY~DRtMo-1Hvf +ҢLаu:K@Ko~-?F}ZodxV ctH$`< orx),ziUI$GFjjy?'_L"DO{COB;a{͟wq8l1`URI< +\ƹF 5fZ&d 538lW"J>stream +0 D@&c DJix$$ԝcUL*=.1 od!DI;9P;V%*`݁4%iLx!Ns+@FHn!(I913,d~)&jHzHkB ~}QpA%Pb>5*UO2-}l݂trl_v(RY;6#ꅴ#N+Y mG>,;WN| dku&<{ifopph#6M(#!/~$hwSS}:f RJ_?odl +k<"=@|G3T48rĸkBtU5i,ٌ-.gHif>6>;f--G2ߑ;%Gv~sqp %|j֨F.ץ/ucTM'[P3w6?cDMe{84<,4 SYj?6YjtT-o-OȦBޕ³)aH|n9bkc6Lfio* +ӑ6wBEdrCH2٨N@Qq$jtu6GΗ^ql0Y"V1G{HyKZ_T2a,(Ņ)G~pnz4.<#CHt\1r*Ct{FI(j>=2keKoBEX_:$_P9MfGOW@OͿeמxڳ_EKS(>dbpCN)*TsZj8gTrB6qtNjV35 ]O pV9f=+mLGs +{$׃%jJN\c9SHѲeCF#xSQN;M]spbMSAalp"72N\(=*ߨKQ=)zigvcb` +l j1*Gr6+Wlg`Dq.,=^F, ƧʼcfݙbÜ 'x!,1( wF9E﹠Zs"L/:{jTEvYޟsxl)E@SJfLӟ+LD ]fqOgۯ7(드ť\s=(" l/>MmD:ʅ5NKѳ 6MUkt2(lKmԿ{m080ARJM*m+j$6T~ËhG gǶ̍ XT;`rN6*܉,|uY [2;[-4O כ#m; 3x-{$Z\t`(Pi) M+h'0oU}/4U?{6~6ш2:f8Sw^6Ikim,zDZ5Ǣ|4|0A]ڲ` PV<((EͱMEzR\(?TSljM6y錖fsO\uVqr\,n1h{R$nא|q[s-K#JT֥,'ub-{%ŅPK1/+tc +O,ۭ#& sY4U׋]HEd"H곮`"TEH)3|(ѿ| +LaIm5(Q=HbT8T&j + r8viufa%mދ)Uh:jӜ4|~fv_pAXvIoӔ,t!kJH {& $R6:/D$Yv+P[kUczJr#mwJ"Pc\Di$oai63JYb1ԥ^o8nr |X3йPj'"^k@@>0yIJu8US /@ݮ:܎F8ѡWHZIt,EAOaKA?)i*Dbv?3bcf2OtR|445xZEklQS^/,RôJ*pZɐР4b,] @]He(iZ7_^Ͻë)9MgEC&{9}^^Ngٿc<5~(G~=+yuo@,]W!p̋^TF"wASۭwF]!n1.0΀Oh}lڡ+Y>(4>̴0) Զj8i=?wQo(ESJxhbҌKS%X=f\ȷ!BfM??ٴߜ1t ļAE-D-X*:<|-**`|UHCN]W_u^<:#yO;*ԴMp q|yi nw=s-Wɕ%#h@:g޼;H-o{<mP0B+JPx_v-VN?)ȟ<ÛZ3jVh) c621V[>ݰyӨF%T'_du+MXKlj/xtۨ~W,>,^'=ޗ +0 UAmEj KGZ2dexϺ <nrKy5"5z! ož2ձH4 ^0n.eTjESzs,ٟxI_xo眜Cm it$4.y)kƒxR"Y_6}hyy7 yw"=ƿzH1>mЉPvuJq _ʯMfN)샯B(i|ٌ2Scl$́ + #}%>5_{}OUK}U}5s1Yiϲ.GKƯ'FcV9Jc~#.@dZya5,١HШ]:H~oiV`Ҏ8<EW]6g8ѐΐwHBn@_4},xH)`eVЁĆD:H/;Ebwh.!ջ&hEFH[FH,447Kjc5vx9l{$O(o%\=z^aZ.T)-MAN|ח#k-8,ԕ%2JBAVV Û~V|vJ6| 99Xvh_rVW$cOQ(c:hαmq[e57oCZ &X2V ++\ij[ﶘF%3 M8Ðk鐙@B/E|](Iҕ? 6؎QAZOp?%6uXe@.p4͜AXk5MAs6 \.CS686tB>=3 /#3tA@Sq C t~o}n׭m|jHz<6߅Ho MVh[:T)1M$r]LzoN":eZG>7i`u9 ՘es.0?=E=D(zGZ + ++(3W/&lN hGaWU}#`42,;Yv7n}`}d/c`17'pM2d&66찡lAd̵YԆ5*_#Xʹ9mܮ_*/#6'NlC`L-^:l+C1İQcWzmIs(gy8Ō8ށ-F &(d:3QG ~0ѫu3]7 2~ISEM!mzAulOdYFEr9_J$tQˆOJED8e߄OO!!АT[= < 5m9JXcm6xv*\sF J򟂺?9!kzYԄnH7HU*3\-t +-@ >yZ-63YujC) +x}Էpd$ Q$ƍ#[)ו3X̜­adGnNcC`YL`zЙn47+M̓J2=;hڈs $H^`dO᳠t<,x !UT(:ٙ5o (y9s l1JېfV14Wo,*ey P07g@~ޏ1d8?> yuѹi d3gf$0G_Ɲ>Z}]aUWD2j24bnYK#Ё%Rd~:n/Cwˀ)09qFVv݄Hg¸iY5;ͯ?P[A0#D:{Mt$0{V9C LlT;'Ha?|!>*dYi&۪lS/d?^Yr$h;|-feˁN\`/#.Bm<u^4ˠ#X--[*R!F8=PC& e7{Dokd5EÀL1ϼJ/yU^-WcL[*f]ܔX<3l :4p'1[iߺԓ*4b 2if ׿J Y寶O&Ansvj_B+b-[e:ǜBn&kƳi7+)<[L=Ѷa'zaֳ1ݾ#^ +AfXV ,rypf1-V[XlVS1v2fso'ʂ3*['=vq-tqB9 6>] 7%GEzSh8J%bP+۞OC/ 1 բ&:J̔[ B6MFHqNP4WC@x͎ۉ5^S({.؛+]1I(kykKO +xkLE,D,Nx 5҂Dy V5tb")I5⍱Io9Z,PoZq!<Bkݬj^\VHځNȻ x$>F:f/!2Nф3nYZcpޔZWnnl?hL.l͏kSS}%y8+R:1r?.F?ƙe8o߻Ły9>44/o78)jl8"IC21r`?9`ټ:1) (3HrU-$Dr(ys&ZG~x"b(˷7bW5xʥ|%s'OSUk53SmT* +d@=1aR*HK3dcEK5_ҙCn͟1EQZ~Ydhbb,_xP_\ %`ɦyz9ٿ +Z苼W[&j*c@4%ؐ$S*D nbA+xȨ,$W\+畇UtG#WDt +*51xI[/r]i"h! *Jx1,aODk Dҙ ͉ @J,L9U78DTlL/_'"e 8:u&+0?a`~E 8-"+8]!-f/3]7@^L# j!"znx&XHaz-Y aa.E zjG{R M} +@7%!q|N^'*@'5Y3HvnTv&oa;Qu`pй$/c'?WV.>f. + WV^0)u&=jGO^i}#/`f(˿?l1uִ+@Η3-|cn0UvPCk j?'SK5AyYI,aK Q㭓&UM" Z]|1P ! xNX8_O^Wk060Lv%pmO \֎np} P+fCGv'q{t'ܹ%\$ +_$)@޶J@s0q]OR ^Oٽ"`wIY&Unʲ5M*m +=I_bFqR+Zp蘉LH>r66غ0rdشu(~Fd`JkmXB>Cc &AzJ_dY8\ǰORV?TH%5zj` +8')Ӊkc SRTv?ó4NݕbOaLA1k- i?vLvkXzhl&:³NSآ jؔ<* -ȑ'P+ `o]6Ѫyt3#׶ہh,;|F]sV(JE3v.ZnpDt4ӉQGZ^hSw'XGaMis&?6Db4~{ +Y1lIXz4ʭK€&m,KP?V\3C +b 騶>P \qG [EI)7'|kDy]z, st"y|0ewUy{z@*MlĞ6 LP\8ލMH/V ~Y@`,Ez820X4 rWKSXBҰbț3[ܚ{;]>dKş^-tjˆidc ]=@§"TʸrU塁iH.BsWrSA&=4NTe=O{:]S _E6@LZo0Pl ;Se%z}$E@}"ޖ=n0(Zԍ˦hM#-% "m ߺR!Pf18R;n~Jz.Ț XAre۬HWH "\e,?^[  +9? +[$^8|#һLnk&ߞO}:0m4*<KF oU;Ƨ8;Trbf!i1H48RQ0JÀXd;ab[.˚S< U1Mo[}bM,KNji[ MNB8#h*_<z1[qbpu=}xʳ-|{BSud}Zr(v}Z)k pVK-)Ow\¥LwևfIoDE/"M1 pY@H=_g=+V@7cg[Wڍ+"'ټijqTKsIϓg]m=?seijmSDL`EF$P=E7<)͠\+`wJp߶d0id|QWʘ ?|MbqֶpV H"d*>0).u"em 1®H%ر?|5TP*(RHKb: ;e*5cmI%DA~7v?cEaOHή2^#! -n^}kɵ~i;;}k@؉;f";oVh_Aɔ$qcR] Lsw]WG$`vx>#(sXn9ӌd.x #ܢ?Nxc&czz;* q-8}+2%^sRٸ]沱͗GBo3cU]"Ёbp+hi>ʄˈ%łڟAz2R7aP:9I'"O9v Yi͍_TtW-0'plߵ}~㒾 +sV/=J` +C<Sja%hۆ J1 X^QݹFզd2?͘+ѱ%EyM[L ~6]E&o015fh'Ÿyx @KʡҒO2؂ +z Z8|VKDTjl=DPwqOz(b ě5h^Һ1' ;8KʄשE0O$s:`m@gws=麄b,[PS`1YHpEMчt >iB(p.4#MxFB7І$ {Rn/aKUeڼ2udɆ͌olJ-:oR3FX&/.[ςeB_dh~5JKSPLYD!!-<\!:M+.g:~i{~U:ﺠP|a̗uܗ~q\W"$/Tt)eUZ6VZ4iCY (/xkԯ?cԫ,sbThHuN%Q't3 aAQ *r,5ej1yi9xƢxCiϹ끞-ʿkY"HjT{$ 6] ײ|1x-i<'nϬ==e_dR}[(e6[zhK@ ح(n[`^-nņu i G>150dFXʃ׶ȧd`HWrNu}TjIySDCuH>PY 2RG7L@[0=5P1*x׿G}ɂ|SiT3B9  +v!ZK>0+'=B8:]渠 X(K;DZG"#nZ_Nv-5ٟ(ٳElJA\; OgcK6Uc_Cts2Z܍9e/nY<~*-w#ʡ\"xZFp'L^1B:5c^O4PNA=gMzmm]ع & ]R!,v2*X +64%Yc!unWj iTpovU;&C3uL$r ;z2E-'uI@m#'zpx d؜ @'A0;O4N򌴮DWG&$,<#qp Pk}gLK;DM΅@Oa3^'D WA +ͤX%0wZdirpcNor~dDR9)@} ׇ%5ZN'OW\i/+5hdlb?iv֔T`.t ⏁-9EW(lgs l$/D0-(W"uG̽-r8\TQg9(8 opGna^V2nچ&# +@WطB Ȕ|ezw1sG Pu%!6?8S}?h ܇  & W?0V߻.T&Fo8RiIA8hvų"j7NWcܴr|G+ Yhr#B"f!m`5т7࿲T^i +P{pGgg()8dEFl7 +8b;yU8 uX +3B;և&SRxyS>aU!{`L*N` yJ6(0C~~2c?΃nD;n{3N,\;0wYV(q2 Z_F@zbV=2ߜ?gkM@o6FRZeQ ی+p(D^mOظADP|g ʅښ1Vf(j٬~HESKtv(DB@X˸Xk˩jGo’Uc'HGAFpxrU -2esD=Ku/ gkuQk8A4WlS1^/ٸc!U@ڍJ@^Jim:ڶ fp*2ULaƨ7Grty.nM@̞J/+AewJ4?ġL:`Nzj oON}23$~cADB'w-J_ް u6P* \͕sU3$fI4Dx&U幵&6A7A%vfxiD^_ Lȱ7ty, +V396 F'$#mbgB%hU57z7d㠎edS,umcrO@ywQHQ5{(Tpɉ]1l4cx+=a@)P-k<ڼ4ybWD#1._:NYVA&OzPHiݦɷqHzR^_L)p!èB:7mgOOQL?Ύpu9UQ7~_Mɹ9ہ{~3:@a_m$G +\rYG o޴N@/>vf0eSH=Ww+qٶA98@CP6gѪD"K]C&c1Eʽǐ,הD{j˃ B4_!*PB^XSJbFAM0/0AY)RrVb;sНᖢ˕v8G1,e#-#i ~ƳR/q]]Rbow.CBi6aq:h>!S +Gw7anj5ɖO9n'Ŭors1d."3&QUzs+d_ȐbV! .JYT/ {̬Jar^ |s/CȸA 1(1y>}vuG*[=yėڒT6HJw"׵aME'B̼#Ld}(q%%:MƎ-L4UA$i `\Ŧtk&t<~yYQQJ+U4N2bMN_-kUPڷl]2mqTlFs[a M%0{WY'J'x%q"BDVYI,C.k "%P5_b[sSu1WRjg?y~ MiBy +o^W8{*o]4аl$3bցzu1$B-Bkq{ mH VV>>5+gs޽H/PzFXc>)F-ҋ[D<4toW|^jj1?"M΂8Y4YFjk32t. +Wk8R|I{:3~ 1hIv&SO@1`\K>s*Ɨj*bި38f tr(:XHHgEDıYO6˧zx4߅LiZ+U^0#ho`yGc raZlU)zs.JPSNb xGǒv4Jeo(8 :|b62 tO2kK"rҸvJהE*ѯpof@: !‘ѐuڡI&DdE0 =)Ps:12:t;ijBi:OIT:++k;՚mXMPnKhPR +|Q #Hum3=8vٖP-7KF;eY4X>a0cm N~b.PȌ<6)p}i8p^3djMc&k-TڸV#N mѲSApm;#Mg/j٩QTNZrZSʺ~F;Mjk 9RRIsNHlq<íJz&'PC( c_[Xd휹5䲋.%btp$⋔_D ~oMMV)^"$v(E5y57ލ d\}C>WYJܡ[+S͈nR#MEDg%/8" +awlj R7ka4r?+&8D" CRM`jو+l蘵fc$p Y,+~U3Bb:םY[UqSg!d$ rbzVhmͼ>8=rn`P]/F#cR2E$r:#r`q4ԫA~5.&{!oVY$UoHg +ۏo\A,t#b:b7mC6[qk8i9 5%:ǡ:hs1.sw,{& gD/fu(IΩwљ>Oy(y:ڽ+GTe1)2w,1!T׏Jt&)S-;uΌz'A؀wxcHE,n3&YUhCU^:?brpLzk d6Ͱ`!m rx_@a͆\h^D` 6 +#GVxÇ}VswojEk73lsP/%L,JĦ!|k /un´W34F:ph\omD b>wcnIYUxS\qtA8zyB\bȥ')+G +ޭ/%l+XT2"R˳SU.ʺ藐ѽCpb?)(Kpx\턎 FuhLa DJe]kf3"WD?j)Suv~O*.@pP*,Y:fKHd5nkK\/ ʱp!LL̇nl-IY%Yb-<4$vHpXv-H,T9Re'bR$*.x.T6#,⇗~43xTzcWp,(6fELco4*"EE{Ζu*xV9WHz`)ώpz͓[φ𡝑dV|N$S"$+ׅn{{~1'l~dbζ0 kp])A5`QxUc Sj>!`c|Tv߃˥Tӊp귡Z)Z -v ! CWD(>Q T b\B|Xu:dHOz=bXV6o?pl1SyMvb̦}qn^1커v+lͥ_< s `o[M61h<}hӝ} r\;hF)#NV[:8K:fQj~O,7kSL_|- LB?A(Ɨ be)qNupN h*z'W;-l@zႪ} Xv<5W ݲk\IVratkțHLzc2ZBO,jW<7\'~BXh/ZY6Dyti'Mw#+櫗JZ;ɂ#. I O~AEq4A}cq8*.V-T:EC{ 8, +mBxwJ /?Zn6>@Y{?J65{-wCJ5!(W?LEcPj˴amfi,d՚` r+'yjj[^.ƶ +4MJXT ;SV_p~3wvaOP[E} 'DjHTLGQ,f Q6^6ITM6ܶxc"6aDD^ǁ`1h@cy/[Az>`UӲ]醼4'퐅 '~r#:~psY%44XfIj?<: Ei8$&iQ*'Hӌ3$&Ցn4Kp60"&I;p% ܫE֭'m;95h%G<8ʉ0M0KyGV^Yx4 @dbӗ]bƅzY+C7`0Ӳh)Ӯ"bf +k|."~.Т\L-d6R:f3疎Sb#㘄EuUѷӶQ349%BBl5;LR"iHLb*HJo$쥂P+d$PZFs?Zik 좝apl|!tWOv#C4o +Kg?k31FwMwZY"0(rև]27v4@^&(\IـJJq5yw@m]ԏf#׸& _z +;.ۃtPÒ$""ъ[hz 9N$e2-3j) ;v +J᢮^zBf?#([nҿQ[G׈RVlHNB)E:m]ndSZ740?Wf5i_Ԟp.³R%#QeZ/aJ>\9uA_+ MA vӰ˜ClH>J iu>e"bA`,ۿYOL:dr(oΣ]7Ql٨c߁ד?sNi'\7EA &_6Rߥ6&&nų MXRіM?9|`n)+|Ǧ1-C2/,#VvUs# P0@ ΎISb'MﶧvYnl(:o >~C@` z <,G>s%2zv g/(KC,?ּB$J&wQm{Nj8'i +˂Y[o<V r(&1̐& +7B{ák?Q=%ʹ`klI#pހ>jE}m N$ Pxғ4ߋ?mkF'ZՌ: ?*/xOzFWW:N\SU& Ү9Iީ03agVJٵjA2;eA@<kSxSp@OyĒ#[zeqc@&N#C5r0t&meOYI[:x;,?Ua8YgQ3aSD~K=x4yY;2כ Cj# O +VC1*Qܤo^.t.ɠo1fӂ$piͼhyc_WUyňX ~gv,O\/+ Vke^m +Wz&j*8fR$ֹkkF_ʏ$'b7cɩS6>_|PB{1FvUV" ϹS2 \eշiR⿦uNa_FTDtVޅɎD +Y>E;룓w;RiTTF&,jΚ7,-ӷmrw,S6>sh*~A{kgaV;Eԏ껥?b2Qگ@YzOp2,6VS¿bǕ;jpҋ2Cm%[J(-v`L0ɌArK(uPK75qvry?=S:hS |CY=/>U힭F_\,,x6) {8z]@!ґ/2INr +RY!I#I3VʋvWSK~w<#Bs$L\%LeNC@M ~m[j55ĖdF_X5!4 I@ +E,H.U^2hKi3n 7[jA欲,9:*tf+@ ;$E}11ءdV`ҠYR⺙d|"^LghQvw,}paD!pHT*& R NK5Q5cQU1t xHCڏU[>4Gg?:^V`הl~)'H!²ߝShpT燐`M^ks:raOi\mԊIbI{BVo7;cRtE~:nG(5\9A|'I*4ÛUINnE[t+"Uߧ)P.>Gqb߈'` +Kw4.1Y3mލ^~;7bXF0pW4Gbn@>hPV^58ol)褘at*6ݜ8Mp1lSXŹlC Xgx}F͂iP. Fw6Q#atPs14 nz\6ᮼQ0*c&5\SWs`WHVfM@ r)x&#YM(c}&#iy&x+}TSkЛ)Y :Z*lBU +ObUjvxS^pK9#:I^.5㹳e٥"Mh &!َ$7ԱyYɪ'y>wb;s| XB䚷*Wb&%ܮ@"+FLcߊmJ/(K8hY~Qyʟ_fIc誶"1hgֳӎ;UZe^k0lB"pUW+w-%Qfho?߸g,=.NoVP&RN.t9:(: ͨVW`F=±Q2(u Mhwk'?k$ ,X4b#d{*Ҽ %}zbКHʕYP1$7]5>'Txr_DJ!n_1/v/YO¡'ɂ^H>*nd9nLB73^ud@ 9$E%Rb(la=4gѱKh'X͏ pqj%Tk28]epi C:ӏnL 1IJ[QM~k}G endstream endobj 2506 0 obj <> endobj 2507 0 obj <> endobj 2508 0 obj <> endobj 2500 0 obj <>stream +HWi>Bq G^ bkaqp$Gk 8kߧ")it0zǕpPJvFf( 2{q=nur~lGgl6 +&f ffJ WOwWo!͇^ϟj[XׯfxϘFˊԿϘ!PMj18ϛoȯf*vͤ$N?_nڰsl(>[1LC|yd[Wn`܄*>ݪW.~冧uqWu` NhkG1UqY4`b$W}%| , + A:8aѠE~&8a6uwvr ++0cw&p '8HuY?Jd)2~П.%(;F\XDzRrx5-bM !x:Wl\$1Tpڠ1wJ:wr_W>\1e"@kVTsz@qhq8ἧ ,}W +yxNIČiK@AQܒ=kdPg\B@}ۈS>qy~pZyIвKp7޽S+|SpPP}:*kZuRHu;h)M}>iO*\j}LƊL47^BWg5}y>LcP3rw](U0 ȊҜZMDqQ]1B%t87B5l]C!lWM^?F(- +[C +c[h ;(xӵ9kvtv&F_͖:x%8 'u% +,aYF ;߱YQ-#Jj6 ZL`'0>qY C,R].%giO{ZƝwv(M۳[nj#*r?b"}]TG^*.r 2mߜ('JܿӣD:h` KtqQ-d`.eytܴە'81ՠ3< fSNM%fLiL?ίtAkQb,\\ɡaIz2J5! &#闋8T#fI"no%4zxeb/„\M\8Hx9娉10uͦ#K=y0dDhDI[v 2njhT#X#G[5|?ڮA b f|W{IM0{ {vʽ^:SBMcD!\QJ f1^=|@rr|<>Y'hf3ᤷ!:POY5z/cQXS]h)g/9"Ocd_L9(҇i?c*4d.xU8Y C¡p\0*saL'fnlOieۇ&O!P 3]{!ss/ž&.If*ir99|]wC*TFBgl tle׳r8C\QB"#EvQt<:3U<94%ZiMlXl +rDKɔb,;'ȲB=l6ul~͒?;P[59D &'< +_ JI! 1nrL-yA'[0Pآ'2@&luqjn~RZ)*uEp{ı3@1D?5yRJ ?^fԔA8Y QALD:8Q &$ZoX׻v}˲}RˆbR|ff34A?|Ym<Lw<~q=U{}U}_wv6PWE Ӂu3Ԉy#pԁNJ:Ѣ4YA:`*iy ,9L*}/;VoSbxKm`H/>;Fw8jʐB 8dko\[Q7si} f$oq| ;#=`hE1B }dT=ا^PP5ÏCyv%;v[=mPO-ę +ďȁyݯLr,P*Cł^mǹ.K0M2Rq6EKrE>YF wְ>BH$ >}ף@(#->WO^V=U]{a`栚 iqVߊ7T4e dpyd#-_ԇ +Mvuqs{uIEʹ"XRQ!%g UBD }RdY=-$Ěz tGˬiZ@,vnf1}a:p|KDʓA.XJsZ]s;G6(6%|JhTd +C©{(N$E[p}<Ӎ%(FMO٠ȥ%(r6iD5cqXBcȑpf0GE <gQRckq6.TB0 cEpnG2xۯ+I}². +Pef*YekDž]v%&g=/EqͻaB-99c>}5'6hdkۉƀ ׍St.2af>tIe:$7"R@,R,i;|$prqX;{4bՑd4dj/+Pm6_YoOIdjwM=Ff*3YˊvtH79nn,3J o~g\V 8(%q.8-t*k[y!ç'""rB3Yc \WqMPPa:XqDXx=) o$ ,erʣP q4@ +B='vܙB$ݲ%hcIU. [N0EPCeoogͩU4-8|a +3e/Q7zKP#qQգ0S+]֒ggzh68!rG|TB911d~&@))@>!;j:C[2vgoܗH(_S` +mn.v 0 FGb0D=yW8H5-9B˛M-X`y]Gʻ.1nHX N3/wj@>gl҉H! @#5SE'b?=s&= Ԅ+v&q=h"h923e>K \^(EEц|d-QڊlN@6r,o4g_[ DOWRkEM9l6'*a[ N +]u㼪9˞"),2^iOHz +'YOy=}м*6ˆ>vʆ ן.}~ZyT5E}rk W?Y;9Hrgc<)-zbD\ L@S 06O4 endstream endobj 2504 0 obj <>stream +0 @@&o @4gcZ0UP;‡sG;a$jSEӍ@i܌6\JⰎC>_NNoj¸[|l:VH؍f/:0ɗydITz2 +udVz}}_""NS/"+4ՒL uM;#JG߄ĿRRix7%&&EI vܥ`8bˍazb }FR&,yA9XeDЊ>Lh]QC53XӾ= L5V.x"mߞ)vB2cZ̄3ػ + x; #l$;O_Fc@F;lHVoȇ +Ol祛Ȱ Kzwʟ=7m@gIs'KjWF#zuqj&Pئ>QݕS8@b@$[(tVnfjcT݉mNC1؈4?M½IYIǰ4UE/c}E,?t]r$1OClQ*bG_g +!zsiP;fh=MUO)"2~ +KϚcs䪼t:@qJ|&ze&R@a k@W3=Ĩ[4ݥWbTd;'8_5gafQC~6-x2RS: M̼6QM)A\rXuZ?R肀#Սq5(H $R&A!}1Cp=Q?Y\;ʦ!F0帺qPN_jk/OV|D2ί$MB![AI +:R%YIhM=O +jh . RZJ/%usuJj73c1'Wơ-TrRI!ѩ+/٣efd?*.Bh C`@،~U%fΕ*¶O#,ً 7 7Tl.Zn}\x-n>u)┟SCrq| pƟS +^•rwyHj1 T1^ +[fhd#`҆>acO%7Y(9㗌5c/".-sD/bkdj;}B=o)Ƚ9_AR?#-ttFN^v#I65_Dl:¸cbaf ɪ#N<2kV +kNQ˕VGr-jFl7NuBˆᤍ.$=6Ճ`mQ[*㵒^n3~0*z 'xO-ry1wW1.fF  + + +E}MiPt|%=tAX-pyQ-V+-Z|, +_I*CbmًRXoG:w[f_ĜL!@1?ʕaoAY1ƝF4+/oVC=a-h, ex vBuꄚ;؆ibwߜW4 <Gig[ qg'eufn&-K%5cK `kf]CA@6,3g:wyZ$%ѢUKI}T_ǿEPI1 q'=k8w㉅ΤH͊{F +MyiCu;1*RXckE280V\%rug +jFZ1[!$k?zR˫h Hm[qBE.}zO )' 5gQP}ѥ^2[Iet-n_͆öX G&x^0GN9̰xWB BE)NF 1F2 aQp.x.);칫 +lY@;6@em,DOb*b:,uO&[s*z `jx¶ڈ48OZj4#R K$44҆|0١$ :}+A2l|!g guv[[Fx*g+C)ъw1Kl&$Nͼ,cI [)HO{pn՜/&ƔIOL$F2 \§@Es AE2xAE[/ cȶz;-+ 7Bta7y^^ؖ@[ nC ssk7+MlgDnnzP[ ݏX+ + {y[w*9hŅ+"r A +ȼ֡0wuҡ/]T̺upu|Wc!-;_ڈWū%"ثb3(796楾gOWuG ^cC}m[2 #m?$X ~σ, ~ ;S|cG4L!r8!&.j?wֳu@7^{.9<~6;:InC#όG,"#揜ł1N쥒|f6vR*û E1.@ }0Hͩ2}i-kw+ m1yrenDUug7ݯMZm!5Z<<3q ؚ@RYD\1FwOm0 Ĝ[/b.\ ?aՉP-UZb$T=C$\,eEJc"bLJF0w7CUOu/oD;)j~Xq])؝C@p~o}qrFGkebȥrå%'x̡[geQhjh`5<,Sha'ȱ'sdg:A'|Ȥ|\jcb>p<<^s%R#͏ gJdf5'67iws=*䒦R<8nYUs$5qp5c6\)|N6|]c v7+5l=mc\5T" w`^9k[ȸi B~o9kra—} sZw- U3 +}yV\=WCfΞ%;b@)ZBɶ5w!J=5Bޭgn`%5S}:&#MzNNlk3kM +g"d҂AUGAppb0p$yҢ}:KrNWD- )!Xc|eQu^}O%vr XZs^*'y)l7U %C\AQ\tA3 mNDB'[2cCkZvFOn+#qo4<*C5Z_bDʓ-A'\.zƯpD r2:ݖi J +#}WS4r&0- M5DŽ[-4V6J@L͋v+-DŽ{?;O'֗*-C?0Y8Bi=]SDa/16ʕ#\۸JuXIAUbDZ4HC>BR"& z8JR꠺H cu,wE5a=}Yu'J@G? f &EV 1.h-' X)#?-bR.) "_ejdorOuC }aɮdVY,$aV{N0yАJ<#lKUz[[ڞ|g0uŸq }^/p .:*f.lv?";&cL! F0T\џ|X'Jjև5Lcpeu]}5uAa_ӟXeCEӝ :C΋oSX~؟a-PE%J 4%:Ҵj>k@0>3Dz k{26j󓯛 EDka H[ kG&H%2_kJe)֔ "RepS̿\Ua4Kݪ8Nyyn?[ r\'_rbjQJBX$o|cCEL\ +8!ABLaaKvHilJj܊lCuAdlRs0ƚ6C#/t +lx>.LD|-ST6#3k5r!;RHxeQ,]AzeL:?0tD` +k+&i ,q^Oanm)Ұ'SHX%f4?#ly]r_s?@Zhq ¼ޏ#`ƴӸ&[/SC{,ːbݩ>UZ XoG}^Mxs"p'U306Ȍ ^*I.wZ⑙n9ź +nfŒ +?|uo!k=r[CuBrƍ՚GLzK45xIF9zb7\ Ɑq<`"@{0=׶?Գ V~rS=lU5b4R[rDD u=y>~!;lv]PԣۥR-g, +j ԇnxDః/]$6MtXe +&zHYhZ%yݽ_ +%/j'.XҦ㏀+ Lg"a ]'$?y{9^@8?n]H^ׄd@/[b)*oW$gݤK5= +;z"bh{4c4IIn6j\]2MwړܴqLٽЉ0t܋DWD6c0(bRtfD| [qV lT c{XHjǹL`aq D@R(gsy"uQ8"Ye],1MٛIlrڞd\-\8@g(k&z[5F7;'^Ujd֦wQdt9p|jn短O3 + r2]ig[tؠ VSi!Xtk2~I顺s<sO2[cK}:j$o˟ ӏfD=t.o#V9PKTXv1q9n(x_Q!ډl(g߶n2R4^-#a{9=`$$9+d,RwS"&L\I_ܾ5iS5D?o 9@#zfx~TCgԿE<~y'Vߓ]69DY}b􄸳}eF~ldoV7~P*2~SA=Uz;vzkiQXlKݏMRíki'8$+B ^ԕRo'd)~]Ŀ'R *4W?QOV#6a'>c>)LoDm +'lWUH)"\ ץҭ}\1X8EIr_wٵrK@d)JG!f;-X鸁jvoYhhCӤӆ`) ĔrRrn(9蝬-~]7͏^ [/ %Y˛+T6. xǚ4ޒ#w-{>uhvfVIeX|nZ6cES=tޛ!>AQCzX>eĄK\9mTr1nbY`1/LzJ~#3 +ܾ2v{,y@wj)1J u^ߐ#@%`'x|c'_biDޔDԔI ȥFDIXO61;P#-dɘwG/>d Ն+ށLa3B}b*RnjL>7yXO܇/Us { %|,hᇣ>~TXL7g.LfρT +)0(tH¯͵/8۹L(IʶyZԎ9O? XJUL$-t^9PU $du#Rf0FŮ.q6h=@G# +սXZsy KlhTo۽Jd{Q1?Uv,k_1b,@m$&zL6  :@Ɣ_&>z!hL`jzѕ6+2ܫlǒi<,![DޕLEHHI}B%W&o{LOZ^U jpbl}Z4ޅP% 9>)ʇT4[:ph6DX+zU^7Mb.5Xɭn*Q#{yA,?/$Ӵ .ʃ&8Ӝ@h.fLz|!Kj*G[޸C2tf0Fhn mº +9Ը6^+C?XXy|Y9‡>q,K|'ƪ|/V`Jg:R8]MR]`Ixqg߻^4 + 6ߣMĽ 'mh@p[fvxҦ[7T-Z>w6,+UCIF.PAC/H!Y5)ZꬁB< aDھ@bDFJʜP&d_ FU +}W}6K԰unː2 ,@h"4+Tހ ɖǍeZzE|DF.MEYkR)7X( O'[nyi .3H*K?)<?f䙈eJ9,6Gj L94 }Լ#jLd/H)$X$W6D6I!eΕ F׶M``nibTX&+zB"LK赮AWF!ִ6I-5^%$_(gNݦRq9->b˴ŃH>v"n;VK9_"_Zg-t3k4uB]) Q閃7K5xG!X:?BOzbep 62 zdE ,6eGXS,-aUsVJY5gEB!<_TV'=)|%YHo\JSWr46āC Dg*sT4[21w"!yȸ\ 2l=\6sk5Z0(gcPF2wbnYe ʯFA<ޤbZ;5kkX d^1B#39t)5& +iP`xR\楮%X4MڣmU"#JB_nb|)JP[=_rxLZP"&- )yўM̩SFZ"Y5/QVH-x sfB{,i~½g;f~TH$a}yQ .e=DD*>]L=ea +o1l8*^-C`#s!L91c([=WabV.\ Ou ch!b[*j<(S'iN +n\+ +͒nviJoBLՊ) qHsYtxb&ofbzݡݦƮC']p2P"5`K*'$@ E?r( SodgBHzI&K5iK:j##-Nڒ';[l̸[@l rG8<>Șs[CJpuRO;|)l t'#L|tWujq=vXץe3>?Z ǒ|&UJVŒ"&'ǖ[NݘjZ?O"d%Ix%.h onG4ա pF&T6)1t5с5zO 4-k >v.rRFe4h-CEeO5A[c<@Y鋹Nx[FGF%YupEjITa!yA.5jt2$ a7$zZ0yC)ߌ~}9O`/!4NK }}KB~\g J92RlOҪBo+zY1֒QjIhτTn26i{n`iV,ua^_ՔsB ejrxUE7c5qc# ɩTЊ@Ǧgb{lùt +>vl,`L%:KjUneIC^wK9g!J+Q=#}Wc9# ,ksZXv@oըd6T!6#;GvZc>3V3bUgVԅul~F}|-Ay! 1m*;Xs>RA4σ9*esF^Be#Wp+;^10k9lԘOuzqkfx\D*0/I>"({;E9!4*@`wv0WU\ƣM>ĵθȚZځڌsTRz;Wvuqxاb0c8<&ct/2hhma-Yt|Rzqnh՜$C0eҠCCɿm1r!PF)[.ӻ=7*}be[ gǃM'_)Lg4@%D[eqhq .B$\LnH[-,1/+x JYyL3_!ARVյt6(JvSb-v!g‘UuW(u e1i(N +OF! )̉z8#G6V"٢Q9BoE|g" 9(}m hǪ.pbŕcUMLWimqh+cTQaܐu04;X{\Ut.bT]^c7ˎ| n`{8C*+r@ʆVO +otwp.Gjpy >Zƥ+VQ:'#F4vNPE fXDPY/,iow'ܚVA;H޾:`Dwx b?0oֈ84 _mOb4ŇTIGQ35&xz0|3Y1?;]㫣W*"]ρp N)0'tuPNOri{@ @gbKeD^HߒLfoT -dy(ed2[U,zRn LqAWfV{K8 lD#ڱ 7"XwHL2Nd<^55!@/yء MM  n&̄Ӛ$.%RVcU~ 9=CeXg_ + +/qao_nl=`fM9_t90G[DDS_mbR̛"I"풰펊mf-xP +$d P9Ko8+(مQK,S3?BIj Ý"Xy-K~Tye{w@^u:„K>9uB}Uƕ ٔۋMF, + +ov0c&,@H್'6 5-%fy;™5 B\T};?$*ƿ.eG('8ʶJ@6i z଻čj_l9$Il1o5 6a`Z~8D=~x<™OKwUi@KC#'F3Zb QbOlVkksXF#.LꟛA& z7J8) $byeJJJNy6RÐ_s#U`()P,>xOGFh7`.Y /*4 i`ú6y;,Ԥ)dF/Z<'xM"{J2 +3JY'k/51Ze9(LX}-g'[eW0+[VtZo8 KISaȵnFv~Yx2v/]jU R)(ʵ KwBӕ#DY]up~:~xQvS;mB}FJ4ӇlS}+_һw->"bdT R,*SۢeFa]-(w $g:J0Y ^jNN(Ir(u@(ݎ*|zy՟^_~{d-!<شo+hv%jZZȨoE~:AS#|"\{Lgd~e;sN|zE&r +c9E؄OPiBWT-u>HfΛya7 u*foU26RpBGչ@˘Dvإ{PF+L6 2K |va*,_(^Zכ4 =kN!"383Id)5i -imtO+!sI>vQbo K ` +˽.أ6Ͱ,Ӈm`=ru}am+~&$a)?}σaOkZIȢ5u؏u `f>%Ů&kp6 +l@B}zБ3m:^ p.P\2eTvkOb+u P6CJ%D*DG]ndbSa?k#+EfxJoR+'PX-x*`t Svta-˪7OYvY\l%,=5if}iZ@FDS[X<5S=n-dR^ އ׼bI}Nݖ38mȆ~%qڑ2vQǫ.~KnQ#HѦUT߂@u>QOjvb\[Dt{؋Qa)(6?BN8痫ęQXa9}]$l@GY[I)D˟mmYl̀Y)Y2<9NG۹eNA}: ٍٴ ĩcad, sSd>&{0N|b~`躎:@W輝N0AJ)ݷCp&* UYxdVAN^1ŜG&6 )i&±}K:!P:]4ԗk*3@zmdA`HH)6VV+#zgW ΢TP*by^}&eg*Gp!Dw7_ⲖAufPÒC*8,7RQ, o9J,[,OQtO=dhy[7Hڅ8lnHsLTu[ռO`ͦfȱY1MwfD_*+jsdRܮU(*mzJZAHD$QB*<'vA^ˑ"DDe8=FحSY^)j-$S~Bؓ@e3y8MWQ]2޵J<.:ES!B\{k2.0[P}PDR4n/t]翶Z%+Nj *^l<,Mޓ=C(6kqzHHzE^9DQǞp<%ղ`KT-UUWڔBH[K^adp޿0Tʋ#̸G>9K y$8Z]Vp28oS@*k:'SJeRB)|f+l f$;z>{m +-_>d :bŐ_iKG8&>bҌvX';>9 >͑H|EeD(  }af4c$c':OesoQ2}=ԤLyHE?+#<_ܭd;`Ztq&fZkMguQ2S$^a}f~oDcB4mxYx.ZDM{B2 dEXWNPx=:9%^gVSF;U{\⟧y"}V]1:~,:_"0o’n9S: hڈ{O(w[. Ng`:\i^i -lEAy&Ǻ03r]Z#-?CMuLA]BzRT0yYIaPK,o2#^uCķ-pkq+)JO? QtQp`f29?Ux3u.l(F6JbPq?hV~Z[%hd ?tL0; dm`Twi4ht(_DACIE3-;M?gMgI!խ uN>CWLɇLJAЫꗴ(48NL7bf  :0~,ou $vNs'rYK20J dI gretZ7pnӘ^i#LΠ53l4w[$6\n@_wt8૆YGp˧r8j.v|p kR\<(Ssk $z39[mmˋʏbzyUv*(QLS #$}In@p0OZ:ZB _t&a:W4>MͨCcWY.Vhp|!z6` ~j $I4@9FA- ts1|_8Z=RS4!l-kB=]h{0vmqg:a~p1y f<[[9xӓMql<2hVH E|NU'1NQ:&$iQ"c` ( M<`ck@8)m[el>vWr ׽Kc֑hx 6/Pɦ Vi-igAKbTs攘;8GC0O -{B R_Z:{zcjwB y[U:A/zֺơ_wOn!:M:>`^2?ډ0qŨq6wO%nCKJfi!.8+ PW P~h-oFc/M̙+qZrn47f `@ 6JJ`g7Ќܒs ,hs2nOPHGg3upWgNEn{+tf +od<nŗ$o/lR^׏^u_(Ϻ, vVl oqJ8@xj~D,z +}5gtWFX#ּ +yP0V; v}D +ѪmBo) .;ekrv!]Y=H/1Iomܛ AVbJ(0,bc"Y!z-oz%&84y>njKr;)G6\qx(f%K`i +0q#7p6S:WERZ%l,r\lӝݾOI0Sz@NF(OMtw}R^j Z>sM8h-Y4n{.b8ntLd+~W@Msc84{1Vi{FY$0CFL+2NhyǥfJFa-nOfȣ@'eV@" "eje Rhb>5sBǛQjbi9Y˘"8X-xe]¿a`+&pQg7G&ā!X<@6ZUӡ&p^EX'ʧs?Tł兮*zY@$!{u}8+@@$guK/h@UOAOu#5! +<&9Yeuto+. ؓ>?g&Ӏ ;&)& ΌR?w*s!VOe"蟙!+c(+(~͌~U$Eb\uV?Of$p3T&jޯ糧9@o/r]uqj$~fMqI`PM7'_ǰXeԞP}I9[ٰ̇On~3Xl$5;l$!dCW'_cOƙ*-1]3eAYs +YFtߩ~? Q́})zA#z^Zr}dO;şn.ÿxWٱ5f42hgh] +u tPgWNۏlW"̳94Ep N; +(vag1oz +G썉^QEsAmd! Uomo)m_^T93œPZ?*`¸ fV RypF_6@c Hgk`L%u]#=l Z쉆 YS) +ٝ;ܜ<8U LW +F"5:]z sEz~ox$|"OWx1[7y<"B»Xyq}Q:\%lC\K #'Xq+| ւ+[w +/AM{ 15)HN sJEcVa#S$/ŏm4=,BN~^l8W[c0P2SbWEϸ_7r窉^_%PܩaTFqy݃Ƒ H+괸|Me{ϪϗFc0.*dkȌ찔]rAE*w*dS yQ +7jk +<$(|@t6 5t YįҼ(AU}¥7"Ϝ!oTKᇈGbum='E&fQ NM?K5i{0q gr/y@oG.>]b}m2q5zk %VSx'[AB?`VJ*5䯯jZZqn=u^Qqv'~vO? Ҝgü^$M ]7c?0  uMx}fPtWa#7LeP-Isޑ@S)釥CRO>DU՜r A4Ie_ ֝9Yfdab8KjS`[GS%P%RJpYUխDD]?;JEhHC0L "c:4,_]|LQE6tstE_k:>? ++I+0=%_rRY jq +3t}9=j덧.i8wsC<uLW1]'T*&/I#&e1W=C76nf d)@x1æ%26Ʋ#nY{Ѣ|b|~Z\^JbS9]K ]&{`n{c + I/R:L` cFR"Ŧ+,;3x*wiv#}>OiBR9e, ]*ʫ=t/8ju _#T) Ji@=`Kzzdy{<3di{@Q]uq%'auG]~D7|;l874-YuNG]qsAbpyo=Qd=Y9)L@|xr5ϔ-Ct ,^6O葫Ӷ.9p2c XYg>XCQ+ΚIY5,s 9xF*M9IG%%#ĤVR/x'(ir0Oe Eȉ8"؛D4`[z8)kʵ]R9]  + Rï\!QhXH/QRO |U$]9}* ϪR}]He]]O?Qky iƶ6Qmz?MZ;vJ8U-NjmH\ѫONlуTRv'~k]|aEb[fQ^-@쵰VXQ_*S]ENB/=N,Py):Y|^Yw?jyb*RyȆ(#l5(ܴ; g, L > s!碪C*"`r&qzjbJUalt"8dW {&nΤ(9:\~w};=%7%{]ll:䊡Ϧ_-v +iK+|f*co[Kd4QԟuԵXspZSW_FA:!$:t_1I-\KFNa^Xhqo#SΓRo!7 e!,$=: +PRoA$X‰r +mUı{DGO7>6GELݽx}Tw2?]Sb'Ry#b Ye9GS}vތ_CU_yQ:'IuWEwpDzr +2h*m;/X .ħnhE"lb1(|/T߬MH~z"׻0aYmdT?h SP3~$"wTc!“D[AAI^;VVۋnW3ן(SO x,G|(3 ajϐ{9) v݆GJ+1|}uG!SnfXdb%^VpǤtLw pf+3H=F W"ƣ=@cOxM=2UXy>=].'20 R{iqUK*wHQ3{Qc/a,Bݸ()gWӲԞ 2@TsJ +c*oIה*B) >/ȁEg_g`E4j{"CMc\} xfnL8YF_a4d̲T~qi ! +I\.xhJtH )FCV4w7=!vpzn %- AՀCpzcK_ 92VGH&L~czs= 5c oZUC(%ZԸYiEynQ1Aぴg/69B~j9q+ʯ=U8-l]ܻ?-+KJ7["qpi"]U9VHYM Ba! IS-P"McsϞPnЦp,5lhN:͜P6{8īir}V -}+ock%cCL +b={>&u9Gg$!iDԄ`b"\"uao- OTE]mij6}D}lz=tt +-iRBT8 +ߺNVP.G>… +0rQ׊ 躃m?dHPL6k4gHk1(uR3 '| iSc>t^($Q{owͰRs%W Xdٰ]Im{GRk˂ wD0-f x_W6'L2@*QޮA"n$;sX]-t-BdS<Aޙ%4MnS&PbZ:.%uԇ*J"빓/~n͂(ItK0/ߧrr +ZPAj7LFA^vWL~D5+hP'OZ( &pIc`TsU+_v׼I[ݪf%+GIsqQl/W(T"~ttvA1iߥ%-dkP(/ *9[Xxw5-(eTeA^661a.D H` ;S<&M19Y??65NU}x gtΞ>F=?`5Mޚoic~f?4v/"?bwG;d~;2{d嫫 +3Y +~Lzʣi1_&LϵLjx/i$j=4KVFgi{Ar Ldz +֊ :eAو5~9{203̀EUdeO)I,ݓ5ϿKXV*THob5½m P5呈M ũ,ܹ; O68bn 77t8!A"%xf-)UNSUb8qVh(-E߾D] +~f mZk^C.V |UY1@fS6?eT:nBFX"9*Ċx{* #x*`f8j_cv MQl[F (`o +IUB?Nj 4lwB#N#74^+O){}?\\AڱuXz޷,I/m]UZm֧8ܝI +ޓXJy4uޯs+mAlĵ@$y<)l.́t77YQ{F:K1kh+-'Za͍I#/1S?SCwM]fs1_yP>vǀ6 廻<5kGr4*a"h#f9w5PQc | +TA3r3#eBN,F_ȆaP +h0o*c}GHᠶ_ǬDIiƆ|j|:5*3j-66Ƶs$aA}4ׅnRzt|Ez{>2lsBn7@1H$>t( z̛fmdu{;UC'VC h )A #|mK>J`UW/*Ѩ'` у]C/pb2b<λ]mU,R5LvGgz3ݿb 3?K-3 M*;0`Sku"/VbCk'F_&[Nu@); + +C] HIej|1t|/5-`sh̝G Y,Tƀ>L`0S}a?oK=F&5(`HR@+0DN(j%woB?gZt ō 2ݴ +K IrV5= AU'{r+Ԭcz'vf:͙4rMO)_K~OeG_N(}QJ?{Ƃ +|Pڱ7ɢy;d8+yFmowK)Y +(B e!a:-&NZHw|gHP/۸\S0 +>0B bO'@^P3;8E$*Odnu_͘G{"M5fj?ylrG*?I.hw:PT c,b5tKm:*p23|5OD9}[ ,d7*&_ Wu2&^|L`kBi<9LK}`G>f"L_jLWDSD +}}Ň#%XÄjN?IA/˦+,4妼!#Z׳kyS)F| +i͌ơx{z%vxwœ)3~NZd ? EA3G'csd,J7 )튵 t724ҍC -Ko%/8U +P4 vRn;iw endstream endobj 2501 0 obj <> endobj 2502 0 obj <> endobj 2503 0 obj <> endobj 2495 0 obj <>stream +HWn}W%@l(LI681L(ˡ8rg; ſOugdHԩS gQit?tyzMl<: +Xb-,ҨpP؅RX0>zj/9 n~oհx~s ޾=}n1ZogcgDr1Jn>\tC ~a.sQT,ׄ3MH,X]^mvbA "Rdqެ6=QDJ=sdqHȑ )! ra"}^vf&Bt )5рl⃥ ʏiiu5YAbBfm>CL/LJŐaZNb:bKs 5u8bX;ЙY9Wf>ld@u;Aw,KZ7+DʎɹLu>lj- |5z`.WgTD(PE. ?(`s؏0)g"pau@:Xpo'RP2KБTI iZ.TS\ku2S l6wc[-d>ow#( i)/Fg6S&ckN"\Lr)U bfsX2aA|~x!#x>v1E ZvleDx,e K)@lJcbN ZO0_AvJ_R`'7m{oBMK9}LE̳)ggJh:ᢃ*&u\=kFD~{n:FN|BU8cA \GWy;tf$ʜEe&8ϭ'74kM&o"@pLSE|rQT8_?O5+I\Y=9ߪl9(W߬PwjyLE|鶏 +KVWY6W$mmFyBę,4n:4p"_WfnQLn4o W:ln.Ф*('(3@7*ɨ8lC+LUE<ȑ.D +/`z_^]{R&ֱ)VC xnSj??)%1{4XLٔx?O4vSceLD14x䦽gGa<6ik |ҙ*c7p[ =w"9=J򂤤r4*2/+M_T":[ѯ) ІYb>-I?ِ*9Ik{۩tf}|h8B㥧Ʀ(?oV_n`z|G~S)SxɁQO %;+s˜}bǣx~eno tݯ?6+/*mIe:ѶIgߟz6C[,6^_I RC aӟy8K! +ekAh#X)K"uڎ ^okE*cW)2]Iu2[6QVڸ򰪬4p8v<2;:#cgb'E2rN`JBp`Ī0BlkzYdw9Hi*S].nz˪Ewy"fG5K6O/ޛHrC]It?8Go2X ]?nهdz]+‹ yguFqc-`Sm\Ҏ5.5@O6"aFf[VD"#r9ǀPc!,^I@uM0Ou~w H!̪fvi#/iSh?r@ss%Fv|1%e,NwA.>NqU;]w PnMŊM*3mBE%=LcT&y-@mV\an;S|3)G +S'rE~b7^>=,I'Ӑ#c7H=ۘ=rѩUZغE@}7U,A (F^̯7|&<%+jؚܹ(`)FU% iYUjyWA}vW۶m;3dɀY|vXTt̜=@[DV(FMt5@ekS?ÛhTla83H~߻R.5hvZ)ªۘY/OYPVDڑq}SܗP6e[| h0 ++"vP7 $vF4- FXݰ7h\ V`MH胨8=k8>8,Y$ƒEJj$E Tmtع}W4t,2OiR@#J&1a +=LgULQN_]-*vfcK/ʹK鎋ШΓČ3cʚ11WǝΞU_n>xgdy/ϐ 3.P)~?W+e>U􂞩d%rkC}L~@4] endstream endobj 2499 0 obj <>stream +0 H@&| Hj6<8ݕKVFT?aw}X\Mmť#J?(i{|F{=q?g +4}*1s p?nXQY=vhH?+l; ~`ٙVZ{q-;Q:6e0? +"3ryU~xjmX4oY{AֵϢax #j#KeG /ǼO&*Ϩ{c +t$F6k)HEF?^O`Ei/!>4Z!P>4Z9 s`?0yzgt FP62:ka|*+H<Z x.5eT,Y'ziy0TeJÑldG$ms}irEv2A^졒Q!{4~oA M˾Kz%` +xA G߉yz]OO 1;@ch cN%Azbk.W"NQ :!8W{Q ¦=+ JFP/%GHzM 0-ei QS7_6t^[sw  > i7J +b[CQK>ތVi44vͬ=[V<1w!OT"U\hH;wJ(7`P}hMёPĒRdGlΘRqXH7g|9RUkӍǩb⇶|-EZ|쌗AIaW;.yq4|$7=2*؊(Wɡ?WYCU}OǺTkĶumHTpۮJtiANx-QlPua$$X bQ|`o˨=°Ƣ2h/w2#p>JfLy&(B(_G)'_){IW@P<$K5.UX  >dR<`#-Ť +8C߷N~+&^ZwI#:Ih7 HL78CTC^]klG5\aDžIUosV +ִ_j:WdA5:8Hm L%]lz$Q5 N`APJ'k3aXnU1:TGmԮdJiqݩ +U)7N*H6!wfwi^ZL@4Caʿ?>* ;'쉀ߔPX;!gso r1#(D*CZyFߖPQRG6r=yV4۾f`ݎXmSx~K|āYƄckǛ_2{Vj?qFuG>(Y׌T.jsfC TMJTd߄"#>DQ_r87ml2RU\]tV2; 69`1Y|N@G N^(QР_XpC9zMe~d?*># fx\Ԭ5!:U& +\ kWA2|ub܁>Hs9??Ya4Nn>( Uwdoar!nM0xC,p(2oeǗ`#ƎI":v'Du7<'z@2/|e W!d5YymҹFA'wH.ATC7K/PyK;_޺ +]2i)'`^/|IclL@Xa\v$YM*G1ޏ>j~z6d}s +\Ò+yh<3j0e-9Y|U}4޼uGX%'fQgtD % 0%!.HKUy9r)2xKL~Ssʓ܌l„INjd JF02@.=` sH\&uͫ|f^1H2B-G+`HW1{{06drPIGQK lµ)Hɛ›4]xRpm-9{~w5h8u `Cٹ_; 2Ux$9xt"i@*5@ 43oM`XBJ6fI>qKs 53BaHإi~hS?`KgHR:$`VXLڐ0r'E)4ɉI6b,=D$T$LFrnѲBALa Hs:梯k9c&T1q$812 -cnD5QOp<# >Bc v5ҮSWs"!S 3Jշ lv7#4MJ"Ѥ1r`'"˙Q =EQ͛~&?v$6wQ$XV"; 8ʀR1vCkzIȖ܅#BKE;n {?Ͻ:-Ct7l^E4{1f)}*99X^ :WjwDI=ʝU)4X',&8O#ID~$ٙG\̡Om==_Sn'޲2he&U_( w81 0"*u$)!X>w)ӞZ~vvAx yiGU1&~<Unk}J"7<_P.@\[A0Ys| +7 +886;Ʃ^K %aZ{r5 +hqz8F 0К-ݯ25+p+[@hU2'#sث)dK$knCj7 e^_ UErdizb91v|'1,(S +"(Uk\ X1l¥7K` WPYe}ZJC~P+eSGtufMikvu'.xFfh.0 єup?`er/([: +*IQ=tmU)'|}@`I\$'QWrB_TR;(jqDKP'3䢗/-M4wpex Au-ſ62to + +~.s$Hz^\ v1ipgݺzPd`0Hesf1])1=ik}VNcx +6ݜဵhut@C^PRwG/j{93'iy"h/d`쭨1p쑌Šjml~^XK'{/%_ G;AH1b@ϚV03,fι/}ZRY \Ņe0 쓉ɱ> E55VQ:4P̈pm8BNNIIG 6c5kGl.P4>x9;1xd^~{! bՈ +kc]H݊&EŽ߮o ط.L yE,C"YMjݱMv//d"o0uj+FtW̞$W~QE"Ƥt$:Y"x[txQbܗ(|nƾ `` iu0f8==kpV2*"8 E&л6?ڴM0-)EN+Co*\)uO|]f-'viuz+xoZs2ZHIfK1<7/4K`cb->pw8$ +_1y/ܕz 33<4>t 7ݔ)'2Uփ*jx"*ٱHH$hKn{=z?\5>Gcm^vQWn-q?Ÿ̚x/[γPȉV jh1J٣4l|N6Z +Ƿ֎Lq9q,q3[ JʮxzJ35u kS !p݁ERDAZާ&H54á`Dt1,^HhehSLyFH+vڸT+B~4u큼mDMuh`3s?E\]n 2YqDޙ"#+퇓Q<Dž߁e?}B`)#n}4!*c$Y ٗ +EZ^(Wq S'N˄|@A +@Z^2rqCZQ6H#;Aœi9ޱKBTkIQjdp6 ~s='_(AٰD#w7QԺ,zg` =5=aG_a8U>ep}L7+%G?璤n@{y6*MSrAц#"TU̗Su{8j® +`Ay p,c"Űo.XڦUsʣuz@3t5''&(vWt>Y.ou OuoY 9G{4Uȇ =iuc:}::ߔn!De/;4&4@K*=!ƥ{]hg|yP ٍZWѽ!'O?} +|C\DÅޑ dƄ9\V<{ +ѿ׏'wXYF=| "YH"8۩'|@zUIyj oft`*(G(c|5BYHp\(vMO9>_tbsrp$gENԘЏPzFzs'OB; >@B;-uV-7@ 6d\f8_lZPB=`' +31gV? zkeu3qU2Wg.|αh@<FaN 0F YzPX4@XC@GR4y$5##v/J +qaDr*:: 4ץ`f^Jxr`xAiWzu;+]Ty,N+q4y!-;B)&cH3}tT+:oT~7DW~"BƄ9XՐ&9)It!)m|uE}2%fPanj b:7!Wdk'nx8]=2)f1BoxNgK!,^eZVkO !7s@`[D1=SArj +j=}TfisMyKRhS5x%dCXtI_1b4,YG/AljTC1GiU 4JK 3sZ߂&~d~Y=0uE:-C"kȶ,Ao11gTj';+n*3UiɨT#QECenܞS-u!H($ݛJ7πJTy6*xvuEDEўxÐHR1AOd~Jje֓/#y? }`F \7U.X%ۘFl,~!_`﮽_j2\/tp,sԊ! Gv49@o2Pr =X'R/6y#mhȖw!o[z-0! +uW3JhIbI-ٲOh'L^Gr>鏧hCdiBl:JXK;\j$٭wEa_|m&_+bJ aƌ̥yTH {R֘w_ݜ$ܑ DSq֌ *tc.2膶ex`=礈: +=Ylf{QHS/)]BTʖy?1~$ӂQ^gH0?DeɁk{ 4p;%=<HktV28#^]}OعXQ 7+#7M +SHO+U`$LC(Yב3ke\vEpla Ê$x>`: 1 5"$94仢O$\ QXh47F΋̀G-RO\#Iv.1乊{z4-Sp.BZ`sEh{x$Lp# dv}26R}\B4 mC魇ڑP +0;r#I5.s\Nzmy?~ -y].P?ݦ;\wzݱ_oO#KM0='ӎa&@q%n0h]"- ib\Jl`Yӹ`|!W! +sh@Kg)qIJum%1e.x:c*% bbRSɈ0`YG5a }LXJUI@>0*H ۫XHrVN\^=)> Iąx)b"T6:&]tJݳ~_Ð j)-9-#RW D#x5]z+QՋerp Kn:M3S;o`vϘ=wo'J!} Hs(LZW WA;`_sHŰAI`0DgPR/!d*Ub<_᜼43?n@ Q~wmڠ"` v\͊A_2DD8 +V8@9f`w:,nqe!e./rk4Xf?!62Y=8RC23~{ *1_Waz]4s\ )w;U9i`U6:Ksd׷OlcUS~HD -${LSUW P=mm+16wr}tIZX3A\F&YCH:?y C,Z8R +#Lߥ6/9k>u^= Tt:+͓E[lѠ><⧠)G$иפRz&2ċ"L'z+ƏTbpx?.$Q +o0w֠_ЏR\PdQ|coW-ĥT(睩W-K]I@iW ө3vnbLh)gM:[N&p *-B0\귃$T0VEӗ)%pzF^SXXKVݺˍ'5[|cѾ[(ܳ/tEQ)?^ZA$NA;{;~8'kP,u +Ӽ!縚+K0=ݎ8D,X;#K䂛=p'שvo\^™K*h~(K٫_UY |%fE5 +5,!8ǂ'u9S&v㼔X:f#*@dC¤(D1ARb!K={R07/e eX!Xh띷XH6 6}GpUw&T (*E;E'YhH# D\'*&G=ui<ΞuNjxPKq+JCn\j:xh:ߥsH~J 7O tws=G Ig[R,l;T" ;:Z_ +l 7'Ipٶ]laVl\RH"٨}ZU1uJJoA\"90HT^5f>x#>u8Ҽ +vE 5yJ/1d]p`H)<=ʷB[>",X_S@PYZ@/Wi:dFK㧨T J;aG~.:)Max +*W8-Aa5ކ_]fwoP4‡p\Y]ZƪRM p?^IǃhJQd1H~~q۔D)-jdaZHw*+o G;M-J}tN@Ϝ?y:&yS|d0t?qpk,UR _ +W ig@ VnFQ=;EbOV-g:n]ja<$:fe +2T'РγfP>jl1 [ *kJʄѦ̆RBKin"e3ZgD! {cNi0ļIs6i?#1{PVry:kp}& +}"wX툭}AaP!=cध8"4r*MHXOzꑋ"52;1|vA;o L9-mf؞e(' o[2 ݈D\!BÒ46c#[7c-BF]E塚B F^7"4}G{yWXª%?辘VX!sivokJ]D$0]I-=C:űup[iK߬QP>X֝%/É9&`-݁vY֪}HCU4`N ٝOwg: aNW!WZ\ޏՙT +yNb>T"m2f,_ZtS]ih8?~Skt +1?8@fۀ#uP>߁frKu(c:(wO - $Wa8Tf/=>' |2rF!T1H5 <_s:D6d1jOrt${x͙ %Tኸ*f~0*t*n%\yWv(EAYiW}3/!y 8|GtO!5D/ Apfl +cKl`mٲE"u"zg>Kl 7c=쐧zy2; +Źpfcb3am'jzS >)vJmގU:шAJ=m+C?'*;#KZɍ?`/T>VfEpPMbxq_[?`X.>&K:r3UIK(W+@Cij?/S,5 Gߒ_qAXq#}+{݄u.6M:)RYӫ>Ō`CKCw'B|wyeר4_썓T| Z=oi\rS$jwK)?EWH9\=سIW!ѿeL9$p`';`aPN? Kh i\~%>2|P"dOT?Wʗ_}Cg"񤬘p\Ca! bx%22 |X +p>oOHD9W\[=uV=JʜƩcv':-<:B^3iPI )Mډ`\a=^tEz7󹺧Np)IԛkY_u4<[hQ u'ģdܷ$E`LM^MY̺rt 2{͸fzȩ݊ ;r9O8SjaSe:s.QUXvpz$ ZO7J;kb-aA e>_l0wķ`n{⠈?C{/`bgNPirU@LH qi[}-s9}HcfLp]. pT WzU-$Mo[9x}}![Œ# l>G rwhT3Ջ !>Yn}T j*H(M1 +`=}=Y +S|E7]hp{U:q&X&p%Җo["pWܰH\rG]6g~ 1dp4,w Tщo6l&k==r,1@dlFAѨVC[LҌ+' BUYi@ *@ɱ,'Ocןtgb[vZnj%^H..YY cz@J1D,C\ P12e:cB\q LNuCahe.|ژ]H>X|~{,q# +8׻ +X!e^%~\k/•I˞;:gQ=InV&ȃiH['{Al%a厎x(=|`v¹2#R +?1Yq tyP : R%I O ߉=#RE"s cP쏐_c6R= +"Ꭻ +EՊl?{昺9ϭvy<^Ng^IsǪ4juZ)Ů-f)ʾN#ñ3_i;TW({wpPn?gn3dD?B_v+ ѕJmrQ +?@LUJןOA<1N>1a/'lA1%iAB3 +Ѣ&uHI;(sEo]{uN?̉j)՟o{F7FGUfE +φ(tYc&*am:W[^i29Wś3S›Xρ7EAuc9qBKip3]qJpEH_ w|џNGzNf!%æ= BSe`HremKXHi.k?:& \" U0V$ɉ>_$Ϻ U,Vw]]թtORvXYL*ǖxb%[ӍkfFCJ2ysOoYP&NGqw9%IEKP%ei"ҤD;d9 44^$dŏ^ ߙQOsʁ;}u #NԿRhQzg!Za?g BW(/]],ͰWVF̭+Gݤ#ZV'r09mx8fxͶ8ܺxswVP9ghe~vS_1A i>zoۉB:9(f%ӓ藫=EH5ӎ\q=}C # 2Vʥܝ(wu:b4v@k[qR'mu$5L\fQ!fkUW, Ժ߻^vQzx&2W. y+ Xg܇J)_%~H]()OhTNv\0*<ZvCIHbfSt+/&sPwp@PE1R6cOU B>^+t_WOn|.Gq1=ޤ!ԄDT{en1bB=B.I  km2j(*SO2qQMD%$yڜEׂD7uw+}9ΕkMMX҇>OŔH) Pv ql&A4Er[!w'%5`g4P֛*3 EaQfvJ<=\?X ך'yN;?9 َV2MxnIcmMCCo)-[;tw*Pҫ"5DtQBB<-\utМWN \ȃP5yvvErc;!RY: (9ssvP _k\@SV<&Lf,Y v PVPt7Q(ڒVϒc<);M"u_Ia^9&s0L>HCʪa߽P2[)ʉ`,.Ն*2 Fr55=,×3"[Vr1;v &&aFSӶmhGSl>,n9A!&1 dӖ2õyLu:[q3xh)ⶮ+ u5\s@B3s w^?5@YrPE:X<Ј*juб(Oe_5t~lKtE4} g/ׅ#d}Y:TVNzIFEcB?<o#~=ˤG2YZ5J3D\-+9l5D"d`Gb訫klcWhrf+AE=8#RP zRGvtkWc~: +r'ē@vI\gSS)|wr]ؚ`B'GdڼqK+vm/81MLjČ+ L^F/^ǎ̫/V~o8 sD >-?HK)uQ[,|hS4 sIΙty!?WN%0E2~E:  2E- ZNQ]H-$Gӻ!r5\AD%ui F fU1sC]=,_n 2Sł4ܟL+X}sLx<Ț9]{>fb?;M!9"ARGˤ]U=.!EMiا0,o ioNJ:#z$MvG4Uvt2$M{tA y Ț$jz2, hUYsR9|p ]:{[k|Gv$HF3ߟol/$RT 4+x\v!l m /Xa&^k/d aPwpM9z-n$#) `1vOR2opBq%, ="Bŭ&s1)I > 8"We{2=SPL[h6v7..K Ne@(!<8+?Ty0sg/SDǬraϚ!!ǀa]ݚcgIyq.?1l<1\$܃j!l;XBjm/[/G`]%qh +ӠqS*]CPAH2C%Uf]'S/b/ě`w2F\++cCSט0M,j>I[[\7NbJ8}f{ p $48qCgZnmVqed٭ϬaԫcdĭGvO q$Wض*!t?pԅy W2֠PnM?]H΂bwnU>)U@7_i;3k4w0d@+[5Jdg wi{,ʟ";$V?lzR09ord~*fL 1uNh/v9)^s⸑l3}Xv\N86Д$:4h I"-G#Zgb9$ZuM yF2 + rXc BtO#?eZ#&,+C`b"0PĹؑgG彶ōTZvJ躧DnAT,Nt/uɇ;N`ɪuO#a( Nz!^u7+6 +O?|}yӹ׊/Ʃ*t:`khd:V{ U0"YlfaAVbSRT$ 0 88A-OgI/DʊZV/LF]X5Oe=`o4/1~U.mL{=!u,-}]MlZ3ܔ)#QdD9ԓ[qåIL$ARhrBa ֡zLq\ (Kš~*ߣ_Hp#f1 $ˬ% L!~v]ߔgW>^81Ҝd.l v`#&sJ+ 10&/O. ݾvOQqCz?%adɬ_Υ5EfGL끃7V4KBb*ah\;TWa5]**NuƁYR3wWB30Fe(8)܋~DY; Z>K>e4HH v; !g6Fk%hH8ԗRHGOOH#PuR' +#/zhѵ hF¬NgT&.*҈ " +ѲIw9© '&l9ӹ?뀸`͙9>T1*1whG΁a( G@t&rT*c _Ѝ9&Xj/EM=@vA|sn3LKw`$#~xɔ >Ƃwo\9ګγXGk'Š Rͦ،0e R0Xf g8:UIR1h'}qXGZTG lcxSDaE;Of]Bz,^@lҭJ_*=.df0Z 1E^!@7qU./ B%Ki)>7`ߑ]:L#8ѮA_tpR/o,p0!cir!>I[ygG-G ƗǿۅZ>VeҐxW1KB!$:D>Ey{X'?JW2>"D3lB^. YQ?Dch+?~p7UMjy38B7]B\~@+4V96zPHB  zva/fpIZЫDLr~QܸS jUX_\v%`&[!Wlh2دkc3qLYؚY܍p@侖`I^"Fpi tyKJMi <^ +q'҇ƼqE T_`ۀbÃH[b>uݍTӲ6k>C2Wd43xYj+U~]uTVn @w75yt)vU(,e3m QeW갤yDi\!zq>cBosLzxB"Y= Ya%B3a4%7J5H~<&ר\'VWLSdq:uY-4 zff Vν|BѢ8}wjmFxDar NGCqmll1ƹJF$D Bc5sS4hi׹aSݞ:78o=5 qSP;y' tQ1dDxi,I,#z@:+C ޞB=-+9汦$o*goDmkT8\h~j Y1<"&߽&mZM9&v+eMIQٖvž'Kbtq>=MW׃uU9ixs,-)t*5!r9$ 6 +w+ +T};$DJU7)~b\@eкHj1w"@mͿ@: *>rj#"U%gcăw.~1?ٰ5NxN#j@!UJ?( k0 M:KJDPhVU |dАQ.a@ImLA +ޞu!B6>HwL~V7a_/ `;Z^> % BOlaQ[BH'6"-cI KD"^\,|^{k!'׺@oRAZo yJYWNj3ΆFP2i4*R}ђ@>rjJ Ԙ|vICz䦬R3{q ~O94%=\ݯ!BJͱG~޾Zz;6~; +;ʼn:l.LI7YXM0TĨ9>+*k99] fBq誽?'/ 6r$ϝ,*ڗVCg*.0Ҡ9/TK-$B#Q_lDz,6f((etf ] (F\Ϣ@ia^OP=6C^ˠYlV['%*5pcJ:)Cΐ߃8hNj+86| yzbRU^;҉C]25bs +%"g;J"1onaӦx+:6tA9s1J`lRZ_m/f})QFJS'\Vwrͬ~vvĵZ=g$`/CZ}}|m!љ]epM-3me#'/aL# #iXB]+7,OJ֕iK;gHЯF֑QT kp=&5,~lƾUڲC‡[DWK/+ UO<8"6 )s x/x76&iURoA*ӖǢs2Ygy:jJĕB(?Z`X&F $a'~k P`\=wI# q^hQD< bIBϋcSF<HVeĩ?c@Bwu˕ \2!'| = gN U;4OjfZhcjl9Nq4~+FAɚF^ +00cu= T%GZav.:|LU3b}]V LC,? % gFJ i`"+27NxpGDFk$]V +WQE~0zd!~S0Ү](ýxʹr=_&r,,$z+lz zM=jӿꭒO>, D[jQ#3s1OF!ƴygoT1~/_ soGT̢n!/pLs8yɍT5<;r}+ +fb=-Ҍ&?]4gjU*Pd .<8hOӽis2,Mr2` +c%윷Zi uv}\ERP8sw~xJ#^obv"&L'NO_k3M]:"ЌiABEΟQ+'oS]fÍ; .5D@.% ~NBl0b~' yiir`7v,([ni 4lt 03Qr'O| +;]JyWqad$RyqGDoyKkl&|/ +;ҌE>!? 8 $^>hNU*ҿ@ER\=GAla""6yڏ Xz3s<n;\r%[_+W) o1C-(A'Ʊe+zvhX* Ssk3taZ_~) \ +20PqM98yHAQΎЛ/|E(W_ +}f_iW@j<b͸ +$7a(pVHCdt?MN5Ҿ|i)3]nS~E!tYkٹ#ǹ B<g NZqY9sUL?͵Y)8\Ȫ&v&m ,]'2Uc2e:x1T"U'i ɈcMv&qٟ9#:&Ǥ0X!͇v@Qc јYYB)5z'$ڤA'f%Xa"lxMbg._$Ǧ@B̪Xp,tb~a:x6%v %g ց|*q`L!jmu|3AO` +4Rzgڡ"'.\mj R7\F.ݽ?lXqhBnǽ֣j$SU@M<^l Rz7%_^[ 1t?Pوy8bbj*eү=FDžw`$jժ`Qz0}>1m' (O m9t)3$ /q0E/;q) +8crC~g[g2nq`Zi>*H$1\|)7߶ #rRbԤVBG!ص`'^B1!nHuR, tjjG찞 7'QQ"NbAlI)VrdL.f}-Anfu~كE5( -+ᾖZMO5, X൬iȏa/|fHJB yt)M4gAXЩCXhw'!BnNS.pl endstream endobj 2496 0 obj <> endobj 2497 0 obj <> endobj 2498 0 obj <> endobj 2490 0 obj <>stream +HWێ8}cxr[ 3^,BglGoQ$n=<8bթS~B219;6X|y?y=e3>nnY3173[H?d 3e %fJ |]^4|hE7{zco߾a6Y>FcEbt~@N +騛OMW7U8k9x΀Xџ~w,2^g{) +_lj^*޿Wq8I0(}ϧRħDNJTz"Uћs|ڻhu-SBzcClޟ,tQ3bUݡNDa&M}i6!⢍dWv`y4]!DhQ@B}y!mm7ߟryh*1xbXf_s˧O5GZW1 [Qr{^ "D\Aq}6@B `o&C$痦;ex(j&9"`l:-Й7-Iii&Mu@cS|ZCVC-"XjgUX_ γ +~W+(5dqǡ[ +V(nf}oD/kꉢy$&.u0pΐ MjHO*sQp'a<ԇLĮ?@un0M?!sk#?}IgdVU#hGa}up@E&}פ&BD*HDT *̀!COwDOiP3ipE={R&RG&1pҷØtȍ2WıT dmW6D41 QX @2}ԁ18NGA1"q >3U 7!vܜI qvH`niœadBf +M<|U1FO1'^R+roˇlq$F2&&kf}"[CFwƽHb=$~)Ȳ 5B*`j؍8͌f:?zVRd}_-ʜ eԼ;$6;n)WAqm*t> +*ǵ=b i.Bc{<3__FJ@ 1I e8dD_~oGJ󫖠qct^59'>Ͱn-PK+J=e3Vzo +2T³yԴK^vոq٤nAO_>}[-CEaOJH` LPr~\(5alEOc0ݭ+٫7PUP/9#\v&΂;qq>}J6 "宏zHfrIy+"N/𑬧*6\3i $h]u҂t5"*v2zSG1^#N\n,]d)c²IiXdKzKttb5:(a>M#B@xؘv(x3* CI߇i2G)4kYr;CI^.$ y"F$\>5#_6Nނ%EQ{x%.wma)=ɼ1*>,K38]l#pBDB:DS&UBsGcܺ%f'2^J %9)z]gd>·-ǽ`6á^F¥KyBo٣ ? J|)禃aÓN(DZv`6nj*js9͸$<`2' AsʫpAbcOERLg4%k+3k;ٯDRਐ?GN\UlZ TQ?XÐck [g qj]?qJFU@L>8sR,>stream +0 H@& H fZ 08TQjBx9pcY~_;V=\-Wh۹~+X4w{?h\Ђ~Prjz +jrU(Y2޻:#Hth fk4l5"hӶR +8fd<L ^ٖ2upO@@סF-otaePa)> P(glu;!k j%=ö^oLJ~i:K2'+\4meG)uѨyq(,6)Rբv6ӞAw+Ђ$B 7dI [ESk!]|+N9rϗ44:?B"-6Y]tL' +GhQ)).9t7ݰa) DչJ>ENNcALÝzǔ*o@G +Scb/ Xt`@G: { %tm%aO|cg,(ba]:|DZMEG'9]8EC|Aɢ1ԁpSnLʢu:aӣWeC^1*4+F-?'. E g_ZTuB55UđR)|mcZ#dB($RDEF86LDZXi 9Y=%.’jtO_-Biy/ j ՌCXՀs3oɧ}R4EVr"5@A1?3gPN4!zC,ػMZՂ3s.Qsu}gElPvO:L ,`Ӊ4E *l捑m9N"y}E.N/ ,[UqlD0=3y&GtH,U$-[&s@b8drj077Dkrf`ZQ}! er7fքo&c7Y$RU|v?;Y-hoH«eı~[HdTXqo,RKŴ9я-IIEe?VO܊J rG]xi}^5-me_d+Ljg;^͇䈰S @uaϒ08,o3ji_о+:*˕? 3zLBX5M:0:YqΉs( ju{SZW1,5K=c[]ICbΔwl]6hWi36p.pp(ףyG_7dSkB5lAQĬ~ >~Ϡ([MH@T6__SmW@`fY +Pv!^FFDj.nMϒMJ&C&pEC&|4TgQ +gn!=ޱ=>|G ~,9:Ix_5}3T, }{1Yǭx7y12csȣ:ڴ>Cסו9ZLVVטMǟrI+3yDP(oASڷ d6ZSO7o~)tjd +cv%|׃{)*r|"FS"j$>R zGHOQ2q쳥s do@2__Yí="=(7+6[Y3#1aЂ+,[8yZz#0s7B*f/=:ƙ!meS1FeyoKIy*-ϭg< Kj y&r#ghvmG%d;a,{DdoId Fs%<xmCE9};,h~ˎ+ŷ*׆>腄LpwͫJ@c%Of˧TPњ\1`,4>NL!o%ڻĆ J8.RSI9h/((/?kTU'~۵;6\XP(|TK^S PS uEMWl>J,"vZo3/[?Kox'E,B zlZ{0-<㓝GH= +E*I7vA![6v߷g_fe2e0u |]荣&u!vմ$xjq+ͼ3eqoB!TU^D nq/xr/|@'J!uUC&:dٔzC1 Ō6xkWRa[MTW>$RTkrJt+̀eo)@ W7*9c!}ʄ6M1jC`O ? +n: aŖ_Sr^^*!!~h7EV'Yp>65?RNsJ;^l79&movq+'])K\gjuV"zRbp| s[a8>3A*i7񭢝Sx\PAj9!pRDDevj'>_S+1 . YTZ&hN< _ziiS{kSX,vRۄϽ睠ZP8F·zI+cl|@MU!uz3Aӱ|<[=Di1S͘G&6u:ZBF AQSdVt~ APj7-VRƸ1O@T!-,; B P5fR9AI "䟼Us5L/ǂ^G@So@x0K!h5NuVN2'O:!jJiяKDꭌd8|.;LA0u#^_=RŊFx&tʗy5;X|UCrG AF{-C V#"If{,ME>ܼllI^-=)(~O'ۺP?֏oer| WJ'cIa搫#tQ<e4r*:'2+Gn,cI,ϑZFs +p@$?mF,sָ w1dv~@T䥪.B[*e v& +.vm̙q;XjPp;8dc:({߸F6lyRGn\9aTnV zpr{cĨҜd,(]U Z},^S  -r8p,g8lEM,&W˶1H#Mǖ',xi}%ߛUg.ij8~܊WRL \^Qəˆ:f9wscW|(ֿ0}Ò OʍvE8bl +e z,M|ԍ]1プOrE8 7\Dv2uSBq`F2gP۩-fޕ ׯ +L!`%/,nvm<+ D' MMji"Qd;/]8K9 $Dp/صE$b? +s#5d_v0v'9v G^a +&R /T"I]Bx"V9w^8s]u˩96?cһ[6^n8YwƺxԷh{(fe:?_ I2~z&&G89xy4͞-cLj@%I*+rwO%^PfE2]#gY(?"ۜ;h]_S<3/IrkmH0"dhAΘ. [vS*M}=d/迶THߵ!' :J&wz#C +T+d9X ]E帎FZ@T9ίYF U;;<>׎>hU}ByF^Bqt +ZU%CVyȖaX?pXmr<cr0 ^ܞ C` Y 6 潚 a26&#"8::9  Y<^355_ާBƌTNKDl-N$PNqQTRmB-Tͫ˄3T3t;+Ρ'nCOAϳiCf9bC[>`@Ftc]-[@d{D:&|KtJL[6v!AhExsG=ߦIY^$R:] UsףjuS t.?^2[u2Il 6 +&HxɃ!k[$36٫) {/|UۖZ+vHvxm٥FN8e9o*t$dhڈZhW;jMh%DXvF׏0hq9a=ݿEt[p[ +ҕg4D68.(3g +\v{qKv?10چ} H(egZF"3h(K0,n[3xי襟.*:(@LݨB̐֝m/s=1?/ +V}D+polAcEnULgN_p_VDWDڀBb|=xA}*,t `bDE|f%N ֕bvv͹Lӱ1oT JÛ0_ +9XG o7ţQj'C,WpG>.@'uءuƌy߫J;(]!NfVڞGy#p1V<~{mA"Юֆn7~N0 mm+[n fbR#yͬ6`F=2=m YKGJ5IÁs঴aQ1X$AUSt7 <,u-G'Ђ +`TQ6_5`0ʕzvC7s+ ;,l$퉃0e CT0_ݕZd.曳Yv.7[!G7?[e2qZp{VFoev@[ρ)i%QQ)U.1{KԪUuet +~-9`}D&PG!1%9zdU,!keޒG꽪W2ERڜ֟A@"~&ٶ4= \^5';AdMK-zjG *uAWek 74Q_v]Li6[ЅRP;Bb!֫Fї29{ѐt7{[{xBr[τ~to*LzXȅ}V".=l@R'tYWaymۮ|uk;pbR3G}Ӥ\0Ι|(ibdtgbo? + +Jq) JB5 `?$o-4sa+27`U}^ O7$LT5rѮޭxXv0n>"З^u[h!{mPy VbHBt9?2zN +AhpGCh\VOf_T`h○yVxu\u 0$x"m |Κr2^xI7ooȶ< +xS3 $ri[Μ f5m~kY: @lu$/qrȈab„䳮L#w͗4Ja"ah0C:]bhu^pM﮿Dߐ#o&Q׳:8'v6rH[GpUlȬ| b+OQ쐟}2A{%R +ֆWk.CѼ5NI2a=$##=ask}# .+8C'/y#(icoxkpamFW@ S(>eדSǼx}msHd̬a )\+A/⁗WL6v2xa~˥8#L[^@Qe}@9Kʼn2U`XfQ`ރS|wf,6ʿ %y-=V0n&<"M+"$cd +:Dc?ES[? E0c$68`2C`"9Lk7SpQ{X(lF_Ѓd;٥-" Qy}a\kܴ).atE3aX~i`GAJɽtiP+|ԗ +-h0Bwj+s9J%~\y,|X:ѲM3BBHy[*J:N\d J8xYCJhgI%D0ӕth'ו! +0<={_ʣ2Zn6(ft-y/٨=@_9}m rLENy=J d1?Nd,>ȴ6*bHAyfet UQ\^ޔm!2ؕcGO_{?@v̘Gc% +O: 5ٺ},uٟ SGF_s(K4 sI +9ON~6&SǻYt~sCnhI]7MvkYBˌUskX-UryU&@4`1|fL{xGP#݋ly{E/U/ +|^d_ `[ . TU,=]px٢_~>lmp\Hy>~M, ++-+ПW{vod?ʬLP7שF6IV +e1NΈa(MR$Lt+A?3T%?,lDᎊ]2lS50ZU[>Mp9ӳW(_Φ\TJ.އz7kOH-(ȸL@83'@IzV˟;J$+&MY,EW`6/:-/K$;G2~&o w$VwÍMYUO\}\UmW:c14 +!Ѕ1 } +41` @oƧraXiE昞fAD>%+ 1g!ܑ"ahF`@I1Q/!ŨX99CbQG])L`CJwHZPg[T[X] +*Sl|B˞ߌytZÂڒ`Ɵ,oqLzSNրa*b(4w齢ܲq c+D'9F}eų ÏNMfP@7@#O-E ≟>3mqJg9$$Drp|uZ%^{E#"hkLDk[:># x9%%K VP +Zzo2ܹS+RFHN*{|C!FKQ9u9=z/juKA9_[t|+2ӫo&f/$ow}j%#ĭj^ lG{X[ۦp+~ƢkCZu}~e~WgmM(o*~WgEj1tP" czDzp;("Gʅ0%w6a)T2v>Gy÷BAZGsQ +&=~(pNŐìY[b +6B$%拄ޞ%V!* Jd _ĜL<1J Yv4C <-8ҤpמmQ7 i͓V:\qNp\t9C*:?|PEtč^Q<Y1K㬦q˦C.K>_k`5L%2yi›o\"jo @`]w smY&j#Q~1h51'T=3i5/v+?w@98N5vK2 [9a3zˆ"sPt֪YFm2 reN-" *⩌+㡅=3rS± drp$vՇ)1W]!}p"c] ro|čb@%-ck4uF].{*XE4x \,mIU^ @a@iWr  +M"-j 7PWvq(Y:;뮝mipV$ROy=v K$tVnD_QJ?ouUՈJX̱4Z0P.5ɍ E@TzӤbU#U(BMfLΝO뇧X2JÔ&{sݓX[2gx<ĺb% *P> K='y`1"[XxJ؇:]* +;mVl5?rgU@ صv{Hurp/"?68$׷/DZ6=ܕ^5X9”R`Ƌlgs!J}AT kqOe%.TCq+`'ZΥ lz$׫tժ=(KV갮:ƿipq1D}2 c3@].+DtraGM}|7194&J$9YDU͉M +ɩ)ypȅe]jVt!/y;!&YU1vmM"~<$~TԬe+ԛa"%d+ Ǜg%R@U@f5* P%`gdWcb(ץqϒ+ծ2#[S7ճX6x c&jKvۺ˱`lD"E)k/IBO;)6@%dkXV&=0M#c#C?$6y85/Pf;Q +nTXlhrC}Lm8c앩#-Ff0> . 7W ؀H)h^\z;ͻ_n|KsbAzjٹf6],{9NxqHТo1ee]aBZ~O9z5tfo%iY8,׬&,ͫÎY(*xxۤa+ˮDv奊=_fW`p-- h6HaN+Do,iK,=ϣ"/?hw*^KSmO4MA+J Bbb9-s՘/%{/m%BhÕq$A&&iIk* oGى,eı%G_+v Zǘ͸R^Ej̛tJ,lE. >9zF4|au@4yl WVq;F"f'7q_ؖwV ue[`e1*]W4:nmc6nJQCי7y8$G?̐`(=l+4b/Z+⫚͍]mSǞU N{ 0jWvXq2ͬp!2H'M]V`F9_R`id^>'ra¢ eJ د.A/詏?A ]Ҹn_?l8ۡ9L2Z; &֯VO>% ;_D%}gezB.Gg9 Gv!'mXkMcF]sǵ赇t = [PY\$q`W*~ GT[4) s$%f h4|t,!Oc8ӫq<)sS.Lo Ěm2o4W)V@^{<.A56nz=l8uSwFN,YSAtZ8uYX)a*@$(&*;Ǒ9\u;[L'ȾhJҸ D͍_YaVRA!F4y (F]jP̌%YeO9 `lɸ(myso{t31<4=NW0bóQ.@E&hCVC\l|wD̬8K4heKphikMV@D%Sf Q7UP*6=uV9ffuN-]eu'(=sH 2x>M +~^ a1Mj(1@<[S*ɎH5|5O]5Jd14ͅ=10nϰXSbphᮃ{'{߲r_\X.ctNgjGAfl +Gǎxo%jKԚnF@Rܩ6aZ#q8هlEoLۺ ֿ~HҸ@egb6zr$L9QCژ}N-DUYx2'7G[ +zx믫'x_Tfr$'q)ru:eBPW?1 )|ՑnjLnU.XzO'u,w\ +H*ynDFɕ)%K7~aoI2@NѸW +H =a$3馪). 낣`ԛ&`VdG]0 1챎6oZ@Kf*Sj|ƬioAi*iKpH@ 6{jntP9$<N +a*0&s+3!#Vx rk :: eoLq1"("[t .ӣl  ֮o"%5E}.Grm}kS<ѩ!kKGd);pPɹA <"PpQꙮwWVCq +]>BGI9u{ waZ(<$ba/eVWhhAU*rpƷ9~%`I7n' xbBjCuQWg.$ 7L +H)IQ^k@\畷pj.=aÒ͡ӵ`âb= agr] "d: unۡ +>z 2,:7h`jU1u/3{@X5ϮU +|.D-*Ӽ[Pf%9/X!'*Y~_X9.p:ID"2W$YC*0*'ks͌DCVԐ憋b68I9|š~wr9[Y5 PXl)aTo7}LW l+F@9,RyF\PP}mA|Lo/٫gCx2*pi L 6῕}b_I|<tOc\K[49jEq$όAX fg2 ]sG`XZ#gR4m/my;iajnV0ƙX/3"ϴ촅S(s0a0# f*/̓؊et" E,ssPՕT( w}35nLIΡ.dJf/a-Pv&R}=$Z +2sT֬dlqP9)nI[ީk&ߍ 7f'^}AC76 ?yyѴdOXxd+܅u<)()BF4͝7wttJ9?Tpw29ZB߅kyyUc +a6Dba7W/ͳi.J^{豺U|$d3<*^);w`Em*iӍr *>%&-֥<6AJo{)\4 *e+3!Y`1ގEI({)|G#(Hu+zizSa3&7#l90r\,ܿg)OڲE}y#~v\*A`Dp4;c?Xˆ~,"tf@ hp:tlܡU BGvT\Mg-?;t3njAxq2}XnղF1+D,1HNYJEK0cnERBOKnBpW%peH4;H>ni;s' zq祟e-D=:;:$`RKjBP+Gn&~ +1fQ IE2~@ݿY(Q!_x S)KdpS}Pbj⦈Q|n''%AHVHSڎPݟ56XZbrsQL#RW%- + 9(yWceSSѩ&58+ G:!oߛs>އV{ +8$:e1I-o殏pu*AX_Uy_jK,ps#O~>t|DaXw f`_% +CySxz 3GB(sz NQ +QX!{1Oq6`%cGW,Mp|.Sg}2!ė@ר\)}9p]ÍS+~Imw>u)*>+&e)CsncOB{Vg/q +ϝg(Y*sz8m1ԍzTGa+=kJ0w"J콶MF4;,1=QdH}PX6Ҡ}s*H;XDL܍ T4<&~RȄ9rZnD iA3M!#Cd?/=Qir<+3[ZGAY}&L ;dyiе%Bwjglj.=T`.yxإGM3亍&]\Oֵ㙊4Vkkˏ3‹Cm0~P܃6D9C n8r%ߗ1=, +Ur*ܷfmNB HD󺩋Vp>;ԹXu]޳[!|BsݽZd}~\>zdIYa<=2=ܳb3E /ydJgg?3ɸJ +^S 6i~v7w( +$39ç4uAٸk4tQ j֍D3B鏗\bE|jSEOhCPZbZtδ=NO.cC bɢv\dH/7Gl*;m+b%@}TϏXƍT4QDm.X1%`peE8c9ۈ*[x29 ~V.W L]:Du(wVaE-.ofKBS$nQ7ri9$d{XyD~UҫʧZcc4aP(+^]0$zam RlY@gfS$9]WTlja չw? +j[LN4>J;]ϛ(;Bh^!cq zN:h իko9$^nڐDQ1@XY||pK/9j V,w +KD) ܠ ɶQ>87м;{KUVqShhHǁ3rR1?( +ov IĒWP;vǸם4i"at^gիF=1 +ډ|=)Ku]Nt(. ?̝ 1/ج) dמfmn^s0n!n.;`lZ:pgF\D.$=~wK5Z K m՜rEy4OBB IzIjpg[MmRN-c{yl^8aH\t ” )a#N$9h}X0P @|E kV}/{YK[J #%:>2`W- )('Vr˪#c~la P+ˆD6`7Ը%GI^>n#t7﷏J`)/Z~7/Y5ŁsU:Z6woDof }4Bypj;fvc5U]q/Z@ȫ o~ˇU)R }s>FWE*:tX"9o&T/1Ƞa?Ppt/sd4(hkih̉dyGb>uӃ&mtK_V|f>:Y|cUCViwf#6*u!#1Pc7њolwDk93ff6N),2;ڝg2L2C*EALfYF)]nnDNZ +î>Z:hmDS"@d}l''bGh+m]:cvT^c9. tܐX$-C{/h /Ax=`+vn,tBu7nVOq # V=eus3ZG-E~M^1u7 xmZ[J-qTߕhm@}Xd* Ei_ϸΏ+w`5lEt;1z@hh%9CYuXPrZ~ 7;1$9.Z0SZ[?ĢdX: +ZxG?dQuoEݖX2ƌJzMw$WY\#sDj$趦8Cpؿۊks!*r4:rs7ŅJlAPC+NT.LBgl"#GIY;z:>bD!JÏÀ;dƁm Kd2%kw8AmmoIG$M>EjGCaγ6hײKcAk/<19(Q-Cr!H+VZeD'GAbc[WiS 8\d/KJj)+ gK(Pv NjkFW~yU\sAs%?Dߡz/#;mKsS*OGY(G˥mת 9J>=ƙ<2dDHwJ&RJ?+kNU#JY pʛSq*@n$Ki>_+M]/#dquB'8;3woKpu,U/a  [fT$\Kk›ä't `ř7|QYQ|Er᪴/(Ƞ hW +HYV5kD_U}sO}ٖHu;.T/6}|5h J ;\$c}LDJni>TJK5%l^'5|f&\Xs2's߫}R@BKozrd-oIg ˜nP=4C,q @NqSfLv 4ApBkudɾ%UWDx"k@@5v'ΘfH$I=O,$ Z9EnNE VT^ `]x 5 #.3zʹQh-{ C~!HTb]:යfq$hbghhw75; +kpva {{W/D?ZLl%0_O|hty qC*ݻ2zkv+Ъ֏d $;:H.뵒!i:dz8!zP` +]An{)_$ @PMќ*eUKvFu U7n9`lW$(bEj˺N_|KܦpEkh;fH*/TwDA"Ia~?$"_gXHGpI@֠V$xeOXSz̙(l0ŗ2B|r56Z>dyUpky'ԬXaFAgB*ҘSWՖ|cK([>2OxNKZ7AUTr-.6ZGE,0ʆU?ô?X^u}-K`|U/`n)kaS:q? ̵>Qq7jQ7c]Nn~uytj6w@;ڎhry[\*phm +7 p/ڑ\[Fk_'FLUUT}x{i|<"-8YYh*xtmcD) q?JKHAͱ V5)f#.:-+'iXt)p;j@ɩ]cwPugk.sVUT9:9c)>V{3{s>rcˤ7㘤a/cT9q_w-{hvQ ﮧҟ$2uX V.z""NVzG}ӬYOTQpc@GͽǪLfT*O9 DۥĹ~& r ʷt-U1E`'DCʁHʒGW?g5m{;4J͢Z7S.h>)4cNNn|4/n8Ĥjg׽k !ubONBvt3kzDS&邸CaSHt +=g`? xBQp%/`(&l@8n oc[5Aoչ~ Xx'lb$XH82.UtjvI?.Qa4H9(az4%XN]7Uގ]BQBԎ8)GR վ;n Qj .ñ +j $&C>VR¿Fts3v T| &+ULM*.V7ڇlUD~ ]FNuz|=¡FP"zɃpFnsӛןƧˆ{,vj.$\qp:F㥵H_g沌`/d{!!h QO; }WRZFF DŽOQWB_?*yFb[J5}7{f&;81+fa:K[6qaȄ$TxWWDQ2l҇KJYP30Rjcf*[^v9M(HcJS-g䂘hM2,xŭzf=Еqm>/C5)"ZB> .Ruk<Cɘ)U,ٍ~Bf*WYY%¶c 0φ +CfkM<~F+BcVzɇ@5.oԝGte +A>ioK(ӣa֠'ļ`|+C]5z}ݮ(CnU&lu&F9+c-M"DCA߶FRzX;[X8opf.w72,9Aݦq:M"?ʸXoLm5SySe3 AЛ~I"74*Ya@e +7Pt_'Z;a 6'2Oiqԧ*ެaM"kɱh;{J!k"/~ ^Ҕ'i7c;ڭ(̔O$Iy;RTg}8qk,(ArY.{S }4:Fa <̞OTK1l +iG/?ױdMo^45&'p܃ͩy%m#)<3%NJk` >i<WxC w>-G2OUyBL]ˀ_Q̄hge/sNE5 +_OD^%b}[s |-˜j›oBf.oGn'-ӆb<oqYrJ#`'У4g);{IF"D +3% #<7~K`svqde=BOl"TpgxCm*/=u&Sg8z+~C^nZ?K/v؈4H&7v}x{PuLTgpC-C3 m S&pA!pNI&:J;ڍeҼ_z>8W9Bi72߶9E Gex(f=='u+ݪ)qrвp +??~: hĥÏ%;- Xs@LEřŎٍe# '|:0#;O߼'35oqbn5[e;w_X[GRJivF^ ZUޝ/Ly(zwɧeqtݚQLX'RS(dhZ;wdM`D8kj \*0Ʌѝq(i2)wߝ0O W/B%<ֲ)--tVSK?Ӻ%(xF=Zcs'aXq9RAsũ,%NaHP +"5V%7 sjnn-0{|2%8"bCudtM >aY\$*TʇIh3zP,2bJGh%}߳!eIT unGMx]ȸ@] K7}]]"=?]clKb ;%BlCpb75ٙSm ĘHXSF~;| c6e,Ҽ_/ў>LiB>S1%灉qc.`6)N3D'z|4'Z%vO{;([H>Dqxe"yZ5Ǜ鴣5c:zp"а$;33 *­hI~> !b5Ly@X +/x 0MkCLn(h yTO z몛APw-na@Ys0 +~%2F&JXҨk{ې%t3˄ΰ`Oò?VyPk"I"n)3s'gHH9#xhAlBII=\Z +Dk ر#ap(;YzAݝLјFQ_9wBYԴGP֘{@&*"5,CdC`8];\p8//CIaϬNqĞn8^|40G;$%6YY,.r62{/3f퀻l[LUy5 mJS'#qŢkTZ%XTGJQf#>w k-vҦPdSN@]Pv=BԹ 4dR 6ǀ [ m>Nϲ+ gcd̟L#(teHK @'j>btׁk8;.o:(υά}OmPYuDX7I 61*RAgC\Y(,#2:y.# Db ֧<Wt3rY@Z$HcB62E[ gf:_ܱX?>JuX£XYF +-^:+ir ǧ._Q*ݍSdh,qRNF`"X3*ї7}3v +/yzO`oH"ȗ 0øFJ9tR=tM O3Bfxق7q/;NL a8s+VJy'B}oa]|w`V\hUF%+ oԣ?Qx{ +RƘJ$Zթܢ_}6juYHM|;+NjSZ\| W~Wj&@Lw-aeĨYbSN䪫N$田G2V;s& AϒIga7!*a7 &e\8?}<&cN2A.`E7O7浦j?i]r}w8O]c PqZjcX؃+Oȃ\MڇoUսdP*f§?ބdg(f߄IdC\=в#*@|DPmhea'XVSҲNi^Kݛ|81!f)~ougt!*$. :ؼv~n#OSqˍZbJ0'ƍElV.S7{ű^=,ĵu/]LPo6UUv8=j3Zm,W8dާ ̅OZ<}Bvںh_r!+*B +X+ ۇiC6CCߕN BГև%F5.Z + g!$aI3zKh#}$&p;BBh ee4iuv,VW$x@%']M87E-f*' 4S#P]~*d֍/lkJ8 p~^32>@oy%-wq4Pzgy @{bJ.-5?r~UF|"P.AP}`5|j]]SiW b:-EMpo{:9 D#ҹEl%\26d$I\Ÿ+rQo 51}O1m_擒DXF>Dmw^5-R߱φ:nI^`H[iad+{kXQN0CG9~`=~t< F8:UvCFmnEș*~ͩsې7qYejq˫AuL8=~P` JiE%eaَ`һ/m}5j-iHTѷ^kY[yهX2 +[GNј%}{;$l,<ĎV[>zeEv$bbE\50NlV$Sm!vo9YN$m/Ir&D.CA4!y{qq&=a]`;QΑ@W`+;{B-t#DnyuP-Ѧ'{,WQ|%OqD);s^uRRNyh,!LI, u ^U/W!iT lNw-JBRv,=|-Ý[2bT@w3 4fk8Moڠ棏Qb,"-j) (aZܵzhKTBdyRBY`mO7w dbY<^q:'G!/:/;'TlX"Vhvꐤ)ެQ-6̅7ՀG^2eM䳙u7gmańL«%@E8}U ?Z"͋S`dN Bre|XvuVT|ٽ7G`,@>Z{Y* FB"/z}@J(y=i Ȳ 7 ic@.QC[y׮- . ?~ ,eB=) ]I￘[x3:Bf 8n1l,19 v'ibz2 rUք9E@:5эl$6l9tRș =3lɤtɗwͅq\c%-/C9NXH8k/+B0$ Za5VVh۪)xi%Pגp>gA{PQ| hpDBhdjh;k`bro8ӫ !}&> endobj 2492 0 obj <> endobj 2493 0 obj <> endobj 2484 0 obj <>stream +HWn}W_l d= e1!c>[5IGtWԩSTb(#P;~8]Dv^_.HEѻawag*o}J[)T/\VޟLJ0~u_~yzy3-kyo@x0Õ]Tb;on۩fC6AR05vJ|sZr7XeۋnS:EAx6JSduIjNPj+vomf';䝸oWR Eiΰ +ԸT*cO)өnWQ*M2J4VMF *E4>\o Ib!i.b}|Lu"\U#=RYC{mO\"S'v+dhNh"]9}Het=6UKRhCN]qhKwW}e(ތ7Z|MS੉9w^fG'R:qHELք56q:}!) Sv\PD +YR$[z3 YiiZH&Cɪe< |cZRZIn]rr O3-w3:t7xjoCmy0e~ *%BZ&$~է&U +]!wJ\@ >D#]/}{`f?OM}鞨@2hlī+#k98pzӊ$m\>M(iypBoĉHIgHqx2PDBk ;v Zִ>nXf7LWQTз[PsH<<&/[LEhq[(ADž[Óȯ9 +"HH;|57gHe$ R=}w +Dx3~9{U0F:xa ǘS3f΢$Knjf5Y1*)p7V֬eu-\0?՞,TBGo7wP+eyCa]96c*0s)_pIq#ԒWw[A@O*K*a͠\ t.ƀ^,'\gr=_WRypU9a)8b>V4b)ن4I ^mc"sUƑK.ULع8Ŀ k.\o$ o` (}E ȹr[: xB [nxeTDm!5Dja9X,QKdpCK4]4Z1L 4ktPQAalYz,e]Ʃ9vy"?Hjr-|xzێx?fƀxsۦMiV[Xk/ +ŬBksN=fR9GH=hi4uVƂ<bjpO$PL~q-N:n:=CdslR],-^habG樋η눍 Nv-⌁[&/v$r=δ'~b.f<!~F)t_6@ _=;4M.|fG=V[a T_n4za EHZg Da vocA^au8 &ڦrM`ڊ~k޵1x 8i +v#n[-a˭W0"*sU*h+D> [ځX_mSk;c5 XX[OHbr0i(-=qvdOb^`P0$5`\o("~=(/E?rB9Ιz8UցCyL CN-|4_!x a]G+ymoReHhh/|cd1\ .($Co sK#?NÈ8ݎ.,̷gf$OTB~L<3ʭDձ!d3 w-@)_Acm>)h|m(tnplIrM xlS $JisiuM*%rM+ &+yeӃ YBr_cġ0of$02:;I÷:&yȌv0}xA&a[Գu$pɹbB);\K ȔCg6 >Ek^BFGU1uQ ;x+C>䏯np+x@&m]I B^xt|.֔/rYc nI2hSbBF:1AJw.U<ZZjf& ƟEJ !^y'6 x40b˩GQR> ~kj +7$vUXzǧHmD22=TAmRȭ]O$!40+Y#cIm=<4 Qm1bMS[V؍4-Az>#R8zIfm^p +MϻdB$<|ȋCKIw8A  »q}Is*>L#<-J{#JJ| +ZǞ^Ѣ"P*U;5xp$lYOdKøK$g=yDY&xIdWNU7҆$\aKGqCɐyY3?.+(:4X2Tu7j2ۛ2eS2BLt}:FurR 0?k endstream endobj 2489 0 obj <>stream +0 Q@&p Q}˪{=+%V(r?XZ%=h٨JʇXI$Մn)f)22$;-iwYΝ2Ek lݮ*޵v#i0dv ` .t/J(4;hD _)D\V܈!8弓2 /U}⠪;O;{l\+SK +)r9357G:ΓnA}{I[]nmD +[CtPp^@I֓^Uםi[mgմV,S^"NfIzH +AY`ytBž[Z:۹RH/,/l{(BBnQd^Sǔ#bD  +)$)a|$]+5Wm'?2w3)k_? *ZkޏpCא9LUq1οP?@i +/&'JfW=flVanUiSYh.nء?cYv oQKO zFi` +j5ˆ}ƌ͑?+XըhmLpB׾n~M,WAjGNrC9h0f y/t(be󭷽i],;EiqVc]֊/Sϩ(HƯ'lJ_`E 諉G92cr7c*-#vƲ c!]iQ@Qg1 =]j2pz:ȎC:d_s똡Z]梽L\D~53pdoObE[BM|wνm+ݘ\C]|/kviC\7TES~oh Oߵ 0gRUh +Ɗ:iJ.FIұq,pf@CwgXf&cرQH}?dGtGqײUq$tL@q?pq)8(8e"fbofb), >\Vԇo]gO֥y~ Ӑf1TG~}Y#l WR;@Ȍd &LFe2mr8@k-ӻڂB#({Xȏg =NYvje+P)2\0Z\D)1 FŔ,6({]>UCwAs]|`5MGU꾄㣷Bt[vx7ZnK Lp^HXbrޟ"_Tˀu- }ex^rrI Gzhq7.T7 j>ba8}Bg"hcdlXm[5`y#;luNvB%gs/gZgѺ5Se@O߆Zok:Nb5cjJd߫&o $zbWiHJw{l͹2D5Lh5K[I:ƮO +v4b: +K#}Tܺ]Ƞ3hKccRT!F8c*d)mh؃Sbx$!tSԾU1< +qR'CzSϞ(^:J_yVC,'( +UV̍Ahr`0›< 8XBuq+bQb%[H}Ru&4IE]{kp]h;yh Wvgm)3oPL'c1>TOwy\]ˠ<=up,Cy*6,poٸS] VT%m@* +^n Wސarlխb+ưn5Be1;ٱtq׻_>N9%F|GwM 6֢=Vy76(H7ŁINx>'ECjS3>ٰXٞW̔C 2>*\wDRɌ{vV`cޓ?O:-CX–9q +-+nQ[@d̸p7w>y-DctvnUlYG.9m2"⭸P1c?5Ad.+r\Ųg hqT}F7 H~Bbyp\hU +ug*Dh\  >BQ4 ;Q1CU;q,/'it% WHWl1[YqPV(v0n +kDKZ|.f-Û:Eбdb{?S*ľzc1,K0f[D$ubχOw2t:ohE3<=)J|xë20mWQV ݥNWCL؛m^W\q'c'XΏ鹷E}z}}G_Qs|I;qNQ%S.7i57F_VQl3W'?!/}*Vo_At +Epht:pt?JD>db-f/r^Oڙj6(n*݋>|BǙ$,ZSR.Rߘ2 L~:/rC{`DX=s\U@n'խSL +*]EE慽nc&pIYoS2%B$5wɂRPSg%iC]־?V{ l}O uҐZC gOGN`xRaRܨչ oԯ9ȲN!x:]e3䔠|3Ό%hl GV5Q^UW^c>Ot0xYrFp)we]O`5,@Fj3)ܽ$&A?W(:rݖ*b Iͼ+`rKedwf1_J%E[`O YCV%\U7CEwfZSE^t(]rA"Ƿ +u2}'_o3@ /Cr`VS] +5OSBLg0 OV4QJ"3ٮW qZ pm.Eʮ5z &roc̋ɖHa7}]1HÎU{X@ܩȌvžtn"U,\-*䥇xOH54?7As9f41 jUäE4zddX0FB<ЄlS el]gy>wL{wԽԖ!eC.J3U8h.ꭾ״릇&մ +M{s넑|޵P}dѼc@rc#OGmO)׶(Z5잵T/GlZn7F6qY}GPy/|;@v?"O8']oI䃤7Hh,M@3uѺNΤcKVueD!QRԩD٩RȲ_x$aԸ6΄ޘQICI}b&>.#8Qtu%U("l.q荧h:]8u%2j>}hꥂ-0RQɬJ?x<\ #'L!SYW?M[5-7O(1AP'M)v]?G ^y]]ɚ $.ޔ8t=IvRMf5hԊ rwGOR%&6Dڞ=|o``+8Њ#lABT9rF޺ WGؤB쯀1z-$ZgGy7;6&䤀]RnMc/_QO?Owk\>.{qs(GÎEIv}Љ<A%>,n<"L$n4qӳB54 8sB80mprz&͋h,5ri;܌x+PKQ9`tiCV{΢9^_/3:JJ-v#BOŤqFqX|s.w,F={=y\GNT~ k.kt%83gZjJ#aNůh.Us(n+Ix@fG91\?ɫ6+fԐIZ9 D釬o^/$5ler1l +6jȕP劅vN@ϿƠߔ&$!ǎSfX_cO5 rkp;wg9xTͬ,:ʛ*fcہ h%.->2^Y? m\OYd\*%xB]G g8ۼoe@wq.+6}u{B=Sz\0elPmO1a>2&gﻵXJ;#CO%,ΗUlM9iO߂89Mʰ* b ު^L#*}b\82)T!s&€\)S=pg*jS;>$ gaM+V}^x_]9|813HjB^\LܹZ:UR5G4|Vڢs׫ gbX_2~-T3^`۪ +"tx̀,@#'Qt-ܟ/¯UCZуl|c}< 鐀HP2 |@\តM!pBGȨyrl\Xc4!8~S&,9rn_h17[_a!nJ&WJ}<i"ZZuy-yA TGJY+6UB1/ _d\:%5AS%H6EN/Q”6W7J:=*S@p/P=WǁT(PO7$+g]~gvFbvFmzy!ÒT:f+E=w\Qb{A+k _S1OH2)Dg QA+|BKH(1d;\:wPYMV""]@@|nY՝uFe_ãQ؏8Tw@7fcVUD_3~WFF׮y%Qz_s>ҬVs˹o'#T+Sei:t* ECY;h^:gՉzzf FɝoDBJ&3܁91F|÷;:g+#Eztv, jqөs8P[2k[) DYYK8\zpHmФ7 Q/ˇAkKu _ăxff $v>PIl2淞*2z )SMG,AFhdjʜxWe;a9AZv.{U_\G>,,j%9x!S԰8Scg )S;wVP98Quf9]HB-/nxz" +_.8RYn0zi=e_߻~G?! tZpȟ㹫FB|)|Bt둍?4C]EЍjn_Y(^%=JKo8λ*~EJ`J3=YN) aŽ+8K^'Dk~8Uٌ +(2?۹E8Ƚi +oHCʄ`-}F (p0fWG^bf5S}8iCC e¶וxs@8:iz\1GI %S41Gݶ}W!01B_C1Ow\pNGj@FOkOWx]!JLA̐~X-#%hʤD@U~ _nɳQqj]Jf`+̛AQC +sՆ5MA%6µMLSpґU B:A g[@jKϰ4f.1{XG)9Ljw#1ս_kYoCsyZni+K|K!\uR}ɋTWi3Q' *\1{aB}D?YEKZoQQI~3/-T'QK5 B<wpYFkX_w ]&>z|mK+Uc?c_J~myimr $dGY]a`@ z+m6> wEqJEcw9X)BmpmM[ +oX :+{'}uOX *G_b&j%;Xy/[++8_5e|`Luؼ]t;{t/2 &q]/~5}Ru7g2лt?f V{f,^vJ\_jn,ZZсq .:]$Te\(OV4BT\,> #+{,y)?}Y4p#hG1jKNvhzf﫴 cTc]5Uw2BK0+"QQٽx5zIh|.fI%($Uq*Ƌ=K1 +(<|GՀ#%%9 +|\$]!sDrzL@Z& CA> O`3wQ|4N|L6b{%okvs=07jKxZ,d5LiRȦUpRc@o:9%UT7S֦EQ2=ec2>J?] ?{'c;%?z*uO0V\X33VUևex,f[a l@%ŝ!n qGh Y9 /I8x;!\s(u +6 LA?$g2WVvFqsbڇ) +QO6]Mֵx}HDI.䬐 5\Ӏzl&_蒸BZj'׾R9ff> z3D\(:l{p+kg[u-d{dpy)4GAU&H,GCr^^ "h +',Ӫx1A7'9wБ[/5~C&?<'QiVA%q>'d֚+ +'#+$ 2Cܽl S])Ӭ_ xz#0tM_e\uE&H}(rYSD_ W*b#K-ˣI"m3 i_oD,䠟7}nSڒ5ͰG#܍3r +d)ܽ 8b{rZ0#~'<"ގtU-;v970IZ6*u,Y¢g +gRv62ItWD3&ɾ֍iRqB٘v^k@ܘu:2 _v鍴<@3ျlƦFzzp`b+ӷImȯ~z^Kfo&Nވd \E?z@iլ o#a5CerQg,B%[]'4O` zDozQ="US[v`xh]?IfJ[-qos3r$ v5MS+z`}jOl~xb/6n",JK_KQTby}0e~;mWq +ٻ=\AYR@)^o(i",guA|)</` NәI>bCO[onM,3>uGy0I`r)Tl$5< ;[^ݒSМ +?iu,K-H#4k2^y 8}SI78t|^闁83unEA.q2p`uz#>+Ӵ,*oTں7iقo%׬ 7zON+"!T +Zc=L8 л䩭8%E eKVnRtqq䭮Qv>:XIR-Z$tp-wѲ̷lѕ@Ra+;񭀥{G$E(0ԒC>VT.`$Ld0*#kKR^bZSU6QeǯƢo۹?0笭6`"4L{l؝ ֗rHh?|)iɉeGoTE+UN~L߂rCde]G[vж95!6O xPdl!F'GtX_V(21W‹й2mF묏O?8FXZw& b`KR'x&[EF(k+|S"q7w-)^_:^a oÌ(وiA(EL{'N51!Π;Gk*M|c`/1y* !`:Q)WZ{$zNG TmS>+ ^2,R1w7ˆR>XE%?J9/GןdaP֖bj6Vu9o# N]&;$ KJ#fPcMA> G6`|/ *ͱWAb9wy|-ۀ̊tk4^YqJvЫHT/S#OBY;${Ű`WЛv$:{68-;B].m Y9€mxU_;o&r8OFpڜP215FRF!]J=!9_ZR1iM*0~mTҎ6q&@ߤ;Cܰ13 1&>`eؒy`7xJE:3DmM{ש"V~Lb& p,LEt0ȰrWHg1O6ߥ=F- +U{T+ /8+Kb8QGWڂmc~ftlCb; שׂŽh%&H|m. ,?/p1Is}ʷ Mg_@==p񟙑o?ԃE9Jgt5嗆*&o*rKv-u')Z^VQ-vIEz}‷M6a}j,9FIhj1,! AoɽT4B'9c91l_UbWR/㜛S^@ flur4K5-q}#T'j׷9tRըD]DY{ U TqEBpx²fuf߁DiKFdfsCOߦ W |I=ј| >zjݺ- KV35 +W;h*՗][Mb_)yEVx,#yoJ +K5%sFW 3@)#5|Yi؟i5yMVC6~xXS>В_h3]>JacWPĚjg55͒tz/7 C][ > wY;%@춭0dtPczΒZW7FNT1]mewO&oL+SMn2%b#Nl<8?杶$& +~Zh+WX] 8*aRďos Cs/ |D&>,ÑD e}~< +*B3i-j s GAvdLW;?cRR1Xh5nY|j\@Eț,/b t +l꠬-y4%)n,.!^?uuB;b:+F>ϖT/~oZ65,J<)9;mOŨ3l2ހڤjAQBA%^xsTބ)~G]hR(tLh"%{ⴂ opMVl ~I""xB +b?>tX]$.{)B7O6VάK] q8A61M);mY.^V_SLb}z;]o}D'T"2“ɜSyE(o<-_$ЖlOW,Jmu3#R2@UI L۹txÐpN}]lCbp="+\/]ٴPm^aeQ㤵QWOJhoO8΁׳e +V3-Ė܋JO&_=\=6^йTKHpP1 ?" #GJimRf$ãL2_(?=zit `r~nLs*6GA {۳jX!b㟣q2. KBJ<NԚE&ϸ>o4.#D"#L?F0ƕr -{?'-TTM>em)T"(RD ?f'xo,EaI(%k&@¤^k-b-M ~QO:RGtVpbJnKDj5XUF5{ nT; 9 7P3k`wiѝT]9kl-]Kg6O4+B_71$j}]7I`P(?P5!p1}W3=?jWZ!lР. !X֥ +Xat+N_ e8UBIrzlt'fZkSDc'\|CEO17* +}ϋn}|Po0vn~kͣA>J +k|n\ITqZViC.>gJt<FQ*>a}o׶*LqnІ_!6r)3k͊¤ Ԗ3JFs`rjQkO(u#fR4Mi|HL~P)#)I6y풦IΥ1Z_J}R +Q!꨽pGʤ^J9ンv NJ&&-kw)p1P+ao:S3OB_`Ws]*7֕A`wKh,k8n'~W(1;[BmlyxI)m&WR AƮ p3UilUj=%0f9!kU_-ZI$1ogjX)97.6X>xQ3`0gC|rImEj 5+= ӧLЕ̲At֧(:gxe`ǛFHqFH˓8O%j5W E']O9rMhzX3lZi"pzMB3^A +fgZE#"I; P~:7z(!o~qLFH7/6E1t{״3bCg;I@%/Aƅqķǥ5G?jc1g={3Rۚۤoɜ+\Ce-ZT"&=!Uj@X>5?01:N0OK8j:=$g=N8PY‡Z1|c"6CP>RBp‹3-p__> gZcƤAI5^b;G9(6/jQ3Ua7hѾv#4R80a[WֈX­O̖MBxݺ^2qzd.A {tQ0<(كyb=]Qt`eԟbw0 +,b|w68~G)^Uda|Ѿgn9/,ma z2 ml`d6{TÁ0(iN!:yׁ`YFsgG HKF}k8_+~c&0_zbM[f"zb83qĘ~-jZyتJ +]i 'Ꜿʁ׿ 'ИO[9M/rOvPETR۹} c(?sbz; я!BZ6܆vs͡k?("9ɕŚTBunP gӆ|ϟ=+mALH .ΚnGEvT"'hXT͎ȈM-I|s*s>VkQIe=Q>v +yXrj3[# vcvέӟ5:DLFCRc Ft\)Eh @A޾|Z2z]LyQm$'WFcxvI^yW[mFQ ]{z-&D8Qdd^.i-0b8%.ka?IF}xЭ 6|pk&XqwM榊u\- iF^[ZeC@a=:gjؓco7- F#!΁kǥo};=xlJ_UQU,P/rKqƄՏ!,UA>KtqH d2ҽ0 +F 4H$UN4ic MNSVR}J'%6Sdr@?˧Ug9iQ /Bi4i R<AāAU6ǝj'IydL[nfn +$5Qae dZ$ 8Ur&~k>"R| `_|1seDx֖欏T7MSM; +:ZpK]#gN1^JZ?Sl53ɥܩVZmHaAwϭ31bw -6lDBieǗ9r0~uV 94%ڸ7,- +_ +XYv gXnѯr!`*_H/|mYO!"cm{B)R3#Eaգ*_(#Wt}QI@lO y[NϏI(6۷zEqn\8L:%1oۋf\QeX]dxyc23 +.kakn^ۚlܢڗ"sPuZ׉ܥtm[ա5&{uq8/ݻ$@ (ҷ=$F|Z + (·]s'(ON9e LO\09Rn۪[/ +ŴhR1a !+sxjuGQ1S&g4# cRɦ6ݦ}ÂCT]2),jʤ|"LjdV9O[?;>:hU-!>AaeBrRPA3Xw,xqO=7b'eF)'(< ; ℛ(g)~PŜbcI>8gJ@FwpW٦0X&L í}4p$HÈ@_09BFw!)'Br>xe]` Xxum)*5\?3wvn`d4 \eozY&##=譹&fgMBZsB\(tMMsW`iߓ +P; ݧħs<^@]_Ha=i_`3R^@*zvk`Ոؐ+c:20v*FX+I=HeԲnV`χ .n{D %Ifǡśj6ft[ xYMFf8:%։}XUxD_nȐ T,T_IнI 2? g/qXʙ'E8ĂK[ 1fR=*ڵi]rJq"3A+uD%__(& x(y舄OXb42;LRGZApxeDS5GӬÐܝev!7nb=1 +'oZhTӅ2 +-yFZk~EBBԮbakVWұe#̭)"g!iru\dWJ}5r9wi,#\sF;8BWGQZǾ)Qq]jjσ ˧KsEgAhz85YaE`(ŀ8whG+pWQ?;Fs6´N:9[vF\]S .F,;6xWc1wjΓn"rEShΜ dWdZs@Knv>%Va}:SH16𡒍(1}пy{zY:M 6S X22*qNGXGj4A/DB'"Sad|^ M(DM|FoK +QVNIxl U:xShy6YKRӫT7/.]ތZzF`eIu">ZeE78hz ߌ0Ӥ |@&6rBx]GEڣ]YMA:'L6(ʧ a>7w}~N5uf8E@d +X)W丫劽nJ@5F;.⶙8M'w ;WJAPcQzyJ>2׻%ׅM.wج5"j1ao=O %()\2_Gj<ǠFe>uGp/t.}MR+lHqƞV?LJiimy/K5Y`ɟ~ym2B0M^6uДt$g/͚.I\b18xOT4i0^ɴfmZ}8˻aEZdWHƼlDL1e79JZK#`?k]BhQWf?_awg`.̤=@e @~? +]uR-hu}Jj胕n{,^{_dB")A{(&| W,2ڏt,8`ߦX!gv6澦 nDNa>2-xaB%XuLD)Woj$#&ڔz_Vw*ZE>bLvwodOT_ȅ 6BzU"_arٺT,L8_m[.xCm)l~ZK܆OUhR.'ᗃq~ +/N:G^^ްC}|q@;LdHb~g. < m\îVQ? ^{uwe5}[V i4fwF`Ts`lʗP>VWDg@o0):I^HcFmgOFu*_d,i:)õ3-*hȼ~bpt:fC )-]T-,/f)%mpxS4PI^uEZá.f~+zی1`3V'F졋 +,Uݱx}޲3dr;f=ŏZs;qTנe'_yM@5걣MleRNE8;ܺFLbKA,&m|ȱ/Ak/u,[6?QYCʃVT !gBN2g))'>DJ7!h:DdI 6 9ڥ2oqEk ~\sZdjy?nV)r?nǚU4p)?dpլ dt6/<,F]|s]kh_A|B(vs84_6Y3h)xit( r-6}Ŕ>tac}R2;v6gF{1SuzKarTT*5xCl+cOa "t:u^I&WD'? +}i4_Ol){$ a&cd1?e1Wn;C#԰0Ih~#>Vȷz ܨZRɂXM,a#s X #ű;rT@d|2%D9g,ѻ L12~/5OB$ &R醍 t6eMR]SK}i`=TξXPwrVzVAۛo0m'9s^G͆dB-TmHA`mf8KP@&e٢d +,^ +ycb{*iXO-(Mi4Y R,{Ѯ][x =oDV4gK"|31!=Rg2VWߔoM`׸[p;D6,?۶ ?w*勋2K%+w(pdix}NVrhsIi-6 +|=8xZ¥UnPvpĵlY #ѱV(N` y2yTP$ &;5/m]]< g$<[26d ZE<M*BiBe_ +8">MW4yPhN?9rgm|;, iZ|)%2bx]TaCL}7.bA=зlثdVdDcx!|&:3!oOBg +*zZO=kH4^Ȏ5\j|p'.\ 0Vm򐲜Cu}ՓsTfo[<XOfdOؖgU2b\}eY[u*ezޏLy@aƓ #=j Lӓ Z^=[l$J{4`<I~]?CUw$+dSru\]B [?…2 #7`پnu^Gst"1<d/18jfQFc[$_)h|w:p$IJMTE\6F+5 +KՆB6:h`h)NG[*%`z8TK碙oDjӻ":,xڈ$=E|վ4^1ik_{׬$;kvn^E|LfQJqqOHE`5I`Q ]6b!rop 桽 h Xݝ3:hV%Y ~Purހ-<る6^HP b8VCJhD5W"Ifdd,ӱ?}zckĿ%F=!/Qy,زx;kxͣG`FIq*}f;*r>ڛ5I5Wtݧ@U?n۫x]IM:;:e.^xC +lLBJcD|Z>vzʟ OX̮^aGr3l0TnK7*V+4g`@aܲ6f4a4zz_uB]%LfErZ1k~TVܺ`b\AA=l U+p8ڿEpꀙq't揮Qwӽl%wg,M!-CؼU[%}UKXȗU% b]^lIϵ#s> 'eETfu" %3&0I[cL`!PCRzLX]ax;YO[͟A}60N?<2}umhZ!  3vLsS“~JjI}׻ȝ\M! Q_ Q>kaZ3 m~la>󓞍ALx`r%W$ߢ'q=u=9ޖg'`g-wmKuU[d`tb[kx'傼e}| Gxjnib8gbu]1YL D\=3F#I/aJ ֐b5 @hw:+Se)Hh,֍=ba?̮D8o!#R16WPLԂrTX3CSOoF`>({Ι]Q]dDr8 )BmϩrC\/}韊,cdby}M+p(Z/ٿ  GZ 56-s 07v05.ʌ7wVfbrC \/.b"z>cqSSS!؏S'7=8L\|I_"S Ii\8N`!z;VtVL$WozӴ) !Pȗ/oPiy{YQ>mKeJ;'r +X +DՉ3CIjLY1bxS LKAeH !kүfC$?a a@rLEc^0k SM P9bH$ƦLWun{\^ v@y]VpMTNw?Ui0T/V,Pyќj|a>9|yxY&e?"SF*/u` ++.!ˁnqvҝ.s#'.\1Q&$dLMB&U,Xhg"x&[V_mlHЮMC2oT;o G{dl7j w2. D:#[,pxG2f!Co_G n?Gbcʻj)(;OrncW9ʼԦ3~UuM!>;R4Y U[suH7eeiK6< !*8Ftポt<> endobj 2486 0 obj <> endobj 2487 0 obj <> endobj 2488 0 obj <> endobj 2479 0 obj <>stream +Hێ);}>n" (גo"xbbwu7J ƙ^1pQy2;9ܼVoܼZ߼\_w7b֛\+M%pl}׬i=pj6?|wُ?zzE/9wю͏W)e%,=m{kbOЕ+-LÇ?N^}F3FOͳ~۟ňd2eC<ɯ rCcBr pgiq-M!ԗ!g)RNKe*0Ɵ9&.>Y0^8kP,4z&}X +keV":su;  =۶:.o=Bz Ѡ \U'q}'#&:NUHd8DM1_T P^!S~hoA!~hdGt@h\,m]1Ȕx=@.2{~ ^uOYjSQOB-~~%5{gMYi]X)`a@|)RNeeP=APы5{@j+9ndorαCqncZćQՋZHhX( cIμX:O5(AQNMq0 +%1 sfک#!s`r`y6bH0nپ{* a?4Kzn1<4.?LK_CN ~pf#~|ѵ?+Y^ +~^[$z#!\0q|R*h[*EtбΦt4GӋ)?dC8$lq%R W2:_G%6K_4/}}:5uO+R;logC= l%R:oec44ZgT$E}s# (4h +A/Gܼ,ʭsZ. Nhѹv ']whx[ e/V=89S> #>c(>u* f+ςԨ4&j:>j"МL8HԶr>qTJSǢpryˢA+MuakK[6 -(q'|:qYg>N +}@pfߜGrT%? fڇˍa?2\tf܎| ܇ a:H&IC+2Ig|%[TQSܱ Ԡ3%vj4+?ݧv Q/V)tNQ 7e$NoN"#$T,fR!"xb!Vk(PHre +'4Rs;E+M)EA)XkDs?s౏Oxz!'&9ut@AX[I ]>]ѫI1~ MB2*d ^qB4.x w>8Ҷɝ"45`ejBd1c6z.r^T UliŖG1t"#&dRoDl6< 05)_: 0fr˲\K`#Ǽ|lva0܈hb2 '\guC!Ї;J+2g;K ,;I6>ImR(4*T$2h,(YkOEES$4D߳}LLv3F; .Hq.fw y.y+R%^W +,G}AR݅hc դ` *1^@69(4$N~.R)̜!/cS4RlԱ8;ɯOp7do@)]8!i@>yH O +.q^-= A)n|KE&-k w(7t2{xߥ TJq xRE?f@ ceeƫGQҿs>Ծ/I_DCPW-$znڲze%aFtɦBVHd:8sg]3Q=3f4>n6fAu($1ȥpuєBijHU+|^2p.:G|b[b>1GK]:ͧl靲Ě<>stream +0 M@&`2 M2Zʫ6! +@:V‘xS8*Y"n+Q>l +Pju1EBg ܡ=[s^ux;e &6ggh Dꢅ3lH##뀌]$G ~tw.:&xp?G- a,0]΁Q\_l2]ۗ>aDfxN¼["׾bd̺as/_4?qC*X=ڛRپ9RR᫹=ǎ9 G~"KO;YQhKM>})];Q#g^g}?9\1DRm6/LM$ 6k(]փxU%nV5%Zs3oB쑠a@OŊ#k=4{*TN_Gޓ~AѠvYkkPA?<MV 7}>;Ȫ}x?? gZ>n׉UɆSB?E64&\ʚ#jwG,սutsPy,ѻ*t&Z uBPKn]ov ))=i!yG4jݖݦA[4&'h E6rQTybuRKU==yIkǞc$Hgο aX>kem2_~߿6AH?bi|W+JlcsW鉗ij{2.ֳ( *_t \7}̶QPFS89 >衔CY¹οx +K^(Z7׋fw%Dbe:XB0qv|g7C;74bPe bB(SLFI_/Jmn} Pd]jhMkݸgB},0Pp#6aP<Xص;/BX RA]%+d|xV3;\@n7eAk "z ǔq . 4SGz *8Kn$bDJ@5Zq{,Xw[pd?NPHp18@f+W*&v&cצ$7@̇U5cmc7lt.Lt'NlG R%gQs v(N، +B9ͣ^#6Ml 65W?kii.˶CS}Mݡr Y,//Œဃe1 f%@'ڋD=[_ аz _(AiCP +nfXh|s r.s(:*dY_qh?zC= !; Ei:& zE_S4|2hi5됾"a'qv?k-4J/x tZpvs_alL r )m} 7yX PV,2T5/|nYbﵦ( Y^@=SҨٷ?:U9Dc*}lŭ Wi8O% gW @N1<ۿE !4kPJ Q  ʿ6{}z: 01rb@;*;47H& miFwNsߋx[N~oa;אK(Us7BJ+u, ƪE?CdۻסP  p$u_DeͨmۤƀKm`ņMaqœɎ?d;X\ +SGVI\-fHir@گ.f2rxeWkҙX~''La%Rw|?1r~zCfnTs6\ni*^< v~G՟5,oVH g+X +԰uvA /&Oq!Tdbv?C1鶯7@V>?bRGN0tE? CDL~욋uT4}(H>#E|ocLjip셂]f_R5'x(b&Ϊ0tB>e o/Ǎ52+ H g8R7b[yI |Y;C^NfmQa * +N01ޅvDf +c`|bw / lk31qtpa yHEs^{Q.Z"U=XoJHwa/SJ$jvJ-Vh7ޔ"΂r)L`i&#❘0;xS_Z&}R| +T<+~hA v +'VC½O4@hKH$.v=͏ ]Ƭ=VcM\35)旼Yti:3h}SX5rŁ5vy;&#j66Cl)ZnWbT>m s=g}[lޞ*Ej~ mNa7e@?VTeHɉ- ! 0l`0lx2 Wv2׼OYF|A͊ 2onO4vZsEU_?D0W!!̷f#`&&AU!Pgiv=D3`z2 57WYBWC- }z%4nOHxL|,p4Gb%y jP'qfΓЍ}>5~,` \fH^t }fvh௣@h]Vrڧ_ |_4OT?n?ӑAf:/+wCƵb< G\D|!J 65˩z UTLx$S0z f +`2d楔B>q``nљhar d:O*1C)ުTisvU^~TV\Oѓ0鉝r9ŭ+->=xԳϢ 6|QkQDtc3Gʘ/qօGLe;@ ֣f&Sf veejg&"4# 2=GLkJ p0Vԣ9U3.6%>(8(tB6c4M|;,eI׃JxA Q̏Xʹ@ +V|d|6%% e^U@-CAoHSR]MtwW?O%;+?s^lRj$,&_gg~."bW䲻t<ˑA1ddc$ShGzP}\N\-ft3Pf5]6m_qyU78dsqHUehR$]"ÑinV+-L`{J(c} [fk Ӱ찞2rQ鮱]O ʰh\g(QZR<}|oij-| P#/"^9Ȏ"EQnnNl*F~R3,P:=M(Ԁ(u,FήԈj+6vMTI +I9P"bC\&IcE#^0B~iP=(IQ*#Ѯ΂uǍKVU*)G[x$x BMK)$iDC((T_ۧ~U1y{mWCC5W 閰~V0gkm2n+="c_/RhKoK:XBD<'Z@ݛ|.i5l5ᔾKI{vC󚪭GQ\}nM&c*nCAtl$u zh$U<:!O ¶Ct@јdzo=h1G܂㷲`l +ɃGNTT[=׮}?='m1 7zJD>bZL;Ix~blB&Ĭ&`PGk 2X[ [mf"Ô#^-=B(/*"T7:pmԼ-2^>N~] '܆g?ŧWAԑ˶ oz^/_|nd?F+̓QɢUƚ +DÚHimsU^{r\ yTo_+N?eMQ6l(T&P!=Q[>hRTYӬi} $`OW(Mhs " #*dSGXSwA2$+FݔcMJGi4`+x?`0I!Ay2hVT);oiRmJR|wǺt=:Xznrv Ë}2Rx:Y"C q>ySh Z/X3S|qNYCHajr;k3tbuTX_,tEܳG%m>Ajt~*ǩ)d!j%]2kj-C;pR(I32,٤zȈW+ v STs;[ITbf9x.7U+' +Uc.NݛX Dfy F\{'ZBs]O!V8zi ŖnRSB|,)qw[SiaVҡ~A\x& Kdb2+q]G##Βu8&-]`'/ P?{;(̎O,tIU)x"L.M1qo]&2 duʡZb圶r*͓gTk %͹N'4΃rŻ@iS?h:~ȐjwbRBvNvy61k{TY,QqLYRq?(D8\II5"“c< (9&vi~/sx0Tt#ʉK}R'_#bR#_ !iqV9K~N^',都ߥc(sNc"kߤ( A#g尿i>î T0"욡=K)g +ZMz끁@"-I'v a>}hO^/ڵܥ%>.?0vx@^qӑP.DϷ&VmGO)i㔳lxӗ>W5+= Q'3O/.\f?ll2/Md546=Q,ftVKy0ɛɜaJnPϹxe-,µ@Jq8xp*Z*˅ :cvq9 : >Jsw,*׵V,~;;xskQc]M᡾χÅ&cn|L( tOyZ4,a2c*1%~*\Ѡۦю:IFK6si% $SNՅG6_/Vt 91|G\Td۶l:/^G5g"{1.`fQNfߌj3FbZZ-4 '⼑NianK/I֍sS0Mpt4:݃UL=%bUrasCR߭B y0#weX-}xI~.CBYڸCi NC}ls@3 m,p2"%tcI;1†Ə\0 D0JFrgsJdEAn6 1]?Ca@(_w;ՂFW\$5z6ר*nitUB L]'ѿazߡ[ +hG3%_{֏{ў/V0O1kWg6a,1ep5o>U矢Cv-Q9qzKHn/bc#`1ˀh^7Wp/Ԏ `zҷl`5AR>XToCQ>N74|`3B!U"j̨™md5UyFgRXQX8@eˇBa84GiM';VCSsw"W~0U/J}8!k:U1^"erk0]Ruz.ircMr3mkeWQXy8\^E hrSh ! A}D0v(l._jK_]h֤Udry_vHLsߕsn^U.n6xD>'xBvqKI ^$-/|b6s^`E{ # 20 JhuT-q\{GeFQâƒ5Bx-=\Zq;@QbP Q0ѣ yv3~, ?Sd(y7:fOtE.W&_ZV5LH+b"OC'.a'>r <׎ !G+,=Cv筳Aܘœ6ofHj0!B6D1 + ̾;#}Mo"VFĩj<==uY`~Nx/ "|Γhe*VC,Q=3G4&IhUモ%. 3F?'|bbD3xLG0l V%ȴ/;:AxR{QW.o|iܽ<U2-Jk} |&.@#](0Ovs ώUQKG%+ɭ15X.*i2q:4H0vYj>iXS\؍̾F>$2GvÛcx2Cյe$#htcFz!bY@=}x9} `芮-ZUkFɯ :([I`Nʪ41tثZ{`rWU]x$N +60U&<2 +/8$%:ygL҂x4+t7Wt+ʤOjX1fi:H u^o϶ '}e{SaD G''s+OXb\D#j]&H#V^tߙ1 ^=$C(Bwea_ݼN4-7)+ȡ$\2aH!{^$@ ` N[R=&Pܯjofhyg 6NHώ97q=,aNg)@<:fx=CrfG@A R> L_Mr1 y|tͫwEӊ&h?Uه0F_֙@۵P +K#Os0{t3< +ɟEdίgaکF?@34! =&{QwNֳduűR2G:l$Bn{?`3QkOMVj0XY_zdwFӆIYrr2nbd+t]g >-L䩸[1UUgH6j`ixT01!8K VB~3QoМuf9:S5kc h(>(>DVKQG0 =AiB6hLmܩd_ B>?}1' ު3t=~In |+`(o}V;Ai}-4B_*bryh3WEIO,$KO_|3݂ SmoxCWG)ø+ Tczn9ҡZjuěvzaH2&4zHOzh 5PO=R8U#y#{9f՜ns>m!o![1(=U +sV=OG|5_ߴ ,n~z(>=U| ^_]~ (%'92s,"ru|̽ݘ¬4늑!/vSr-s OJW9'~-A ɻJ`Z>?Xc9R)/?u $CKkb|_?Uoou;K`Myf{u7 o" /\(ܩ )e;@"T:)49FZʠ_gHn_3H@X's?Pٔ낟ݾoIоvNk +:9YYf棑` \2V6+fRn=8||Vއ|\x48*+tҨM$%3)6Tv˖urȢ- AhJ]kHIf:vuU( ÷] W,v/br~q! +YN8}Gj&C̳Cv /$t$s >r˹ 2@˜n^$sѠa1KU%ޙ8W6]LS4݇&U{ Lvvex2 6Ao&k!fg}b!eiCY <z ˮECuFĪf VSgY G\A~v{J.hɸ(N J +K0RO]W_u+KÔhk?si]MO[^^b 3B\{-!lVkZ+#n.Zpc.JL_apƝ㭐H} M#^B"%_˾kg}ᒪQh72aҩw$WVT X}_xh}Y|=Rkҿ ){)ԋ hvr +y)#9AsWBL1fPa3l@NLBl Q}'틅dU)c)E +)\J;i +b-{MTKv_ ?2`TZlg2BWPVBXD?}Tp0:3hwp<+ ̌^ ȃXm{"s",H}BAnripM8O >( z5QR 1@*"}m]b&V60R +5 Em :֋YXq=gZ,"UԜU~T /jP VAW<̞< Uڙ͋<.GGZ+Wptj؅:Jʱx`U< _*=p +t;"˱xBENǤe(YcwGÍsj>`|3?/xF; qgD31[u1ݰ8D_GVMPzi ༘L3Ao(4)`iUv1аcZUgh Ʉ NSF]amZ[\3%t c +1d +{5h2} (JZRU4 O2}E”y=xi; *Rz#o͈+D$ZdfA --la`^n9HeP:ngt:'_@j1`7^ 䭍m}|!I~ ~| Zm}X1sm6֞&gVvMU8b`y >7z3MV\XA2,.UvnW6 RR:Em}}\--_k.`_iR,%{Y>!ȭZRSWDyTLjki"=/+8xJ@[d_ -?Vh*ib8wpUA/6ݏ(S2 o$@QoџtY,g3k_\Cv ~;-SamI4Ttkh \~}.rhR&slֲ3Ujaw܄ 'CG($Pvد_N--_ViW><օR:r_zI#S .vOq + :Əڨɔ7J1Cѭ8Ejhi=1!^ݨ5-t8> +t` ok8Oa[r(T67~9C +&R†?#U=n)':Lh'!6 L`Tj!;b;fkƛpkmRjDjdd9Z,S^@zFaMQʻ5`[ gy)!zME8l :bZUq+MW%8%iVq}gٶ$Wz(80:j Iubv OLo l0Zaҫ f:SntPJ *!fe1ыA1 )$az?6V3SU`0[` jlʹҨ9 + .(v8,`Zgu|&DWS/0x?8>">8F)q85Zj,;ȑ|fW4[g8Tx]e7 #47AZ&+ދr6GUl:72,^^i} p3j U ((eI(Fj @Fޤ-DTrƏn']V0uJ-Q Ʒ7JEat!fGA4b{[tT3k|5sG!\J2'+?'zZn)pMB^tUׂF}.& {h a?`alȃҚ+BB'"r%Rn+87f;bH:wЈ˯I^|8ҕd<.\0Ѭ㴭!;qnUlj˿(EX Fb\{Oyͯhc*D#YVg@6 l20R< *&`'rtel]GeUٺ-WrxC(<f\^ fu,%&=g+ +o9f5w2ReY1*a=4hk6SPMu,5jWqODs!{ט7ϐv,Qs DjʎB ˃K/q8yp$yC_!tҜNs'ΉzϷ>ƭ^sbj;}g,81( N&<~ `hdAPU Z K$2WZ:i + –g:{bk(K 9n%9! ,V%"y|۲rıbEzbs7z~H :)]=饫P͎<> EwHIFo°6y\INݝ"zY>ܒY8#DBQ*'hC/>̫uUo>ؤ(Ew6 §MwƸO +`\_Lᚚ`e3=,7qzJfh{,)hdA jEhKf]Hb*/]$G2i ubAuV)pz2>3Ez# x޽`2cqm+ /n4\"nonJ(0,{?[K^?llaM%'u="Q+ 0( À vG|)\[yBWtsfwA4K-Z l5TেSAgg_bv+wqL@|sCF͡.jmОlS "" ?-*lI^$qD@14٭륒 G:g& I*?6⤲zEzn)bjIo:4bo{^Hi5pRbLxon1)y$`ik a?Ū 1psd+^=!-WsCpˀ35J-ÁA$ /8.";4PD` #V^w ÒmQmwI ylh~r̩h͈J$6ڝ*4qDJIr2!cD޼#4a|9(92Z-svĈ44<`h-& 0*9wVPav&Pb +,wϲix`" z$V'=)PxC~pxe ؒA5vx^u3(\GwV-j{iV\We5o)c"0#lBCx#Xevr 6Q +#'d*Y>>snDX/7@(]a5@-GjЁphȊ,ùJ +POӥw"[z T+J0u& +aN֥ n)0Ň8@/0p'_iŁwa\4͉0FVc=Dh&I) qI g Ο= b|{HZEL(f`4)V +"Ə$U5K? +*ȶC"eɃnt1rAUO/6Hc9t3*UA){Cza rID b&w'nC-TrX8T\4j*Pd \2p?qpf}\|3ܦ M $0k)V)`07] f-Msf]SA(IGfHɥꗄ˷pʺAb=jFW0$RS;tGU? w±Wrɶì~BFž@Dl얧 y5|44X'e̊]rOe"};:ArG +BoHG$OWdȆr3ey!*w9Jol3R <%#f^8Bb5J0̷q~,4URN=H!>FB@ + y( ;W +cYIKi0qs&xoQ?&"Q*TH]ݸ`e 9]= 8c~k剗[K ậ|l X[|gI\ 积|%}NJ:~i<$Q?"=י &0t[wUMϟ?F.5C(TkŹQiO!雙ד\d,kӨ)'AZw4ղHsXf}X^@LŮz@{d|*~;D,$PoE2  :'c)P(qܲ;:w> +?,x%r>(ys5a&+ҭ5j*Gh +׊"YC +gWb)0 GPϕ̱@8-'$B.ҬI70Q=(mEL>^RSkG4ms( @??nl +p3#g #e1O*% 5rƓoKC՝pi qGt sc-V"Xv㴍|ȧ(WΤئӧ\B.q.?DQt`أ< +ZhqTa!F۬aK "f{.CLUJUyN=YA T=~ 1#1:eQxQ D,8QfYa +T0ږΒ'J7ymrbO^V0cj9*OrŞ `E^ %;Э?_{;q&J-K}_TY.Qf)MH9z@?%eixSYVB=MeUz_;hU WX-`O/J5"P>du"Z\8֜ 3kO7;4J +]g(Lu'vƋd! +D(?A oMF"\v4t3/G[)a|~\IɃ؋_^x dmI2$@#} {a2۱;jу, |+]oJ0O)T3kg@'1I \5BFֺe\7Y¥6(j a{UŲ](iS'nu*V&΁qfsj.f@GZjFpj#㴅cb90G'%p*Y?>aA+-.$XD}~lJy:"/hݯҭڼXYHc!AK5|;/IY3vEٱ5/C @A8Q. U46?4~À\S'L]twq(`iٝ *ĪOp.~]eeD8xpy%'oo@ ٔWF@4;K)hm~,"]5ˍjh21I߽6_ncX UT#LzxŶ + m4뮳а*3sĦtxslyV0>cFz{$|m/yE }E@kAR~qjg3i8N"f4 d^q٭C? 6qOwz9UM~ +sgi&FR2r:4!lX~ םsB,o2ݣfHzqYqVCڅS-~=T{5Mfib6 &y>dڰvFNL3왜{.c\d%Ѹ S ,2>suG7~ P_ 吷HۼJib,$p+d`tݝ.ȵ$v x,Xe5'SƄ = ڲ5n`SVEؽ-nj{VҾeDbN{Ė }me1w,Ye׬6lbER3|e0ڙG+$ZT"ZnL?j(dcp),75WD+M,zw݆Lq¶Jw̴_P>\z-YJIRI4ai]CKh+^&BXtR_y=6T-gu:{'"GrkEj5VpKR!};~u`nB`[ц8"לuƧJwY`уD0I :yWvJ/1nrmo\ggTPp\umjQ'|3!4qE(&@ Wrsh5ُa);yFi7 t ,Rp^#ii861IRf51FaT"&+_W +Sݵ%}EM}bUMYPV_}:0k,͐dQ3%vA0/ 0Ai4<-5Q!T*9SM=p/R1,Ų`:f4/+mBJ5ߺnA6xKϾKꊎ bS+6oä{;)/,V}0 h+ S3 ~~Bwp<^}3ArO~)Spr cAȉ[XQud9G1e5XVu½j墫T~(%^MR!F*תŁᄕ +cPb. GYt!(.%cii=!,@&5cc94B \1iRRo T*#=xr7ȪwJ +d@Ea֔2׭ G}=V7ZW8?oNi |N8U f.4$~~̳#f1"\4ҝO> _VnfX7Ҫ?;.L|XJ{T^Gr&pS i-'c09~9z2]Exe[]:L#"NJl?Gm#,=fY>i8ʷM`at'/W9J~6Ƕnq-V$%c% B*%muFYR(x 7_-Ezg":U{*&_bH7L%O^UhԥeKz$ ՊXv8a۩M`Y)똬eSJ`#\G[@na P vw2d=*m*V1Ԟ.i2 kHis뉜P=4h]8Sc0+S\w'MܨmtG(^| SKN  38z/Zo ȁ4ᾶ= } w=UCL<nɌ* !6w JA פ@RZ4j-Ix%>"p9Ǟ- 1l"r?L_ ʟ&~C5ҦmamZ=(nO %/v<+;CgqS.2%u$2ihF؜i8TkƧ}V;BX9O6+Ԏ dJs$,["E!Ĕ/Kn̈́Ԉ]ݷjNIe<m_@փJ)0CG;^ۨÅkzΜv;>w@U>˦oM3o+I~ I* +=;!<߬ EG;;o( Gk#B`>C͉A l]cVdrLX"뷍U4z @|7\{飊EM-s?!荸Pܤb8˰X4A&/VWU_Ca'ojkz2F̸@!= _-(2,m 02FjP|:*b ?ɫ?S >e%W]WdVT`ځ욅ƸOQ޳; ,>aP/Z*fgGWnFأiGs$C@5HZjB1q_켫k4=ܪ.foJ@3l,hQ l +8 O>r_ɀղ\.+(kJZDrGڔlm%ibsw8NpR?hݡd_n78 q. 9k5TPK#>1Pӕ0ko7R׹0A$2˅ Fhd\7+^0m{!ʐkoGh@Ký4:|6SRM8=^Kvc +ENd3L,e ' DѶUxO<*9>dի~J&rNjvK|}@&kإyP&D j,S[\ 1-x;\ۘ|UL /*P$eL[*ՐVEjVWxpl;.#>ېP! ,6)STh,Q_ yUӛ0mgeYg7> endobj 2481 0 obj <> endobj 2482 0 obj <> endobj 2473 0 obj <>stream +HWnF}W:ėA]#q3Cj9SKqz4cM -N:+I)іRԊќ2\zwo;z?\r /]*ZݬWbu3,S9@Y)egW7껛]} (z?io ᇷ߭0>Sm<| - n%.tDZqXTvqU|H 2T&\H/[b%#|~ֿpRnvFr[ v;L3#ڧ| LMYNPh/n#o8xXJ>,WM@13/rd/C66K[7cfl +Yߗ59BC?8?S_ȕB S +a\K6<$l1啹PJdm7]wQWEBGɱ)OcyPrrNxwc{}Euf^tfj3'VoqsCg,9'2 9Lu5q|~xܞڑ XyRSd}y2҉xè&[Y^s}ཿb>,PiX$xS0}w/n,1|9 QWN ¹Ciu1ٳ XL5HĎ&ZaF\n~Kje&qߞ $-9Aeʗo *\R#K'@s{nix&'`OaB8EJWʒkn,h62WQwӹIȆ!5Sf!:oMᱟNk4l.xbafFCѿg߲hϣz$ֳi݋w,~!CY@"BJ88[Kmsx")9zh,X¨8hh;mQDozP9\S&j4ǿk_)1Z"'ƎX(M]d۬/>4GFKcˮD̖JSqL5ąe#W*i} w[ǔb.NJ+7HK\ΕC[EWU#C@)_oɳC; ezx9Ӌ5 n^>i=hoqn)<4\0RJhMQXf +e즩dHaFgD¦^yK&=tۖNTev _T,=Wռ-ͧc*B-ƚMfb6gF,)\K.c&3Ƞ'؟b,>eF٤]Gvq%7vt2Z"P/4\D#߷zWTmt!b$I]m5E=a)Gz,7lBjPM[g+mߵWJs!7 NYu0 EԂkjQ{ æqNX# ЗagIFo$k¶Fȡș~O ;_DT#9rA9{S0#`bڽЃ aJMoYvyP(2:Cwl(e#ڸFz%4aЍ 7LK7Nyr;p/87T%_-Лl4_3 䳄~μC_-6:rY۴':vsn3BHEB"C]0]kI,¹,wB*M< +!R +>f7O˞1;mDM\ECN5~{Aس94 +:'gqH!=FnQO-L{fp0:BnPo .JNܗ}l6~)u0R*Ģ>K&OaP! /Bʊ Y)!dd)Nh$2%OLų֫m#AFmvm CZ)TĂRYkȥ$!K3|≜Ce8 'pNY@8& * PW(gRf=&rT t19*k}ɠ@PҦD|cdk.h\˧@{w r6e'o45yߝTސc?p-xLnKRKA7M :0)kcAD^;'Ƶʜ{{ QJ/cDVV mO{,B%0@as]B\+O?Rt k8^wوo:g5=5ۮoag-Os½)B4 {%R俬]gjgab +f|=UW_CO0T)jJSշyw&! +;*i+5z @,%``X]yb|!u!B8^\։JBz=޽M}]L|yU-ɯ<XD{C4|sR;>eI87$ Z xQNЯX oNF&`Blc ኝ2!Z:I؇dB1 2TR"Mh*gef3&TOyQ9Keu]'Ǫ!齠(L.-mH斅 .*/ +Av8$٘9' +O0d{FL؞ߓ?t;wRI/Րv3zBa?l&gldfnAPܛnfYAOۭQpIɔZW:!q2Btx萤ۦ@}{ Xn)fUĺgח̿,* +0FcBY~ ^04OH-.]'K0Apۄ+i~u<˦@*xAF‚sS"J-CK zh6]lf/zZ 8HJbu_Ĉ$Exa}}1jo'cvҴ`\J_Y4w& V<-\zݝwa=KRYq\eJ]'vV^Bm$y!L# Ui0^a9(I#rkWV6 n_ Z]9 O2莽AHde`/ϴeeiNm( 0*A&;}Qu? Iw$˟]l>.~=?>~d?qO,w}f(Q(e*wuXUm4p'cfNWdAA}  4 endstream endobj 2478 0 obj <>stream +0 Q@&u Q}|wyA3qɅ=r#Ab!jx%ptWmJv 5 +Z}q8ܺ+cOu!9T4ڡ^Gn"-{S%Ál{ h+\%…3>I)~Y1lCwԑj~gU0u:q4ЀlbR}>yv248JKW +wׇJ[ӈ$jbLn3(w)[/E m>7 @g"G!m>V "T)_/=zV9BRp KÕ8zXTPw@pyjQ*{O(<+qTȔA{(,sr>hmުL`:`NK^9]0d9a Y'y:M`l1]Y^ +ZAu4v6bCo> +o+4lFÄe/PvV3eR C{8FgPqT)J FIT_+%Lt}@h#./O;gP@gtijEY '8vug1o +d;_9&}YYplYt/rcolͰwf0֠53O&ife<~%!}y:(|aw!yu]CǠ): YK$ޣx݉գ"zŇS!qrLfl :Bylv}&h%?&(0avvRn{e"t3(4thq"%-tᅯ*͎.kiޯ.>194G^"5~SbZkᇬB+L1ljZ us ֬j@v|4O<+jx?~Q!W6MKr +sXk7~A(DjIa9r HCda/NSnj܄4*A@=|ܳvTJxڂ3m^cx Kqv fhqlT9p 0YU}_g7ƈw-g 5XR !Zg#)=5cfK%^(]ٽ 0OEWQD:&Ǔ{c.aԠF/jp< 76I$ >rj]3aIs3LWiY$PÁڪecA%1 _w0XOky<~Wj/ PLJE EÍ(yUSdg KS*O@A7,WCJk!USzBzkǗ5k|`*# :pBtZc4ɈY̚GQv4Ō<;t[ݎ76xhML#[KQD[SVd8Iw8dO] +~=%Js(p!k<~Ve Ŷbh<+4fvqur5KGۉ48 D()F>9q} :a L`wI%tE õDKyϾ,УM8*ʶ&eSg>$ Hi ǿj?+nS, ?\cݼ?z} >IʿmXxF"NՈoag(GC3_(nG: BiNI19*W. {ṰWDLj Z^;>ܱKVR)OpK8WV4: M&^@۳˙ EbVNT n^3uL9#ٟզnsE5/2QռKY@Wf!)x.1Vͨ7<9 *udbtM"#735nr[ 'DEta2oO)7Qt+iLj<ŌI(BƗ<dY~GpE5?tz`So\@^}viKJŊxA;+tщecZ?H^miz lطHuIk&{'\l^ĉ!׭&l/5xfT C@3H"jl^8ۨa{PR.HvU,G5xOՀpLfsX}'PRPs+q< %+;9V.70Lt,6CmlGtEXc`tH`;e/6#kKy!JEs0tJpn3!0b:/EV>O< X!lXwfe$ "b71ʇȺ9p2u;EVeu&6tjY/CP!J WkJ3(:YAcBnc#w)DT 4ЈHeX.X/gC|BN{_IU|#Q:pQȞEpdAF;Apǯ-cY$+vQ._dH`RP N80ɑQ߯㮮*QB >Ֆ/Kn7Ww0{1ۤZ Y]|BVOQX=J&xc7[۽L?"9ugU%#w}䥠'|Fv`^o#?MA]l*.t܃=bp\[|.GaɲE!8rW]h-Oah6dd[oH A0~&Fdؑ:f}/xWWնѳsΠHOj@GV\A9ƔjU8xi8,"i + !36'K՟f$jVj-Jc L;^?`&q(,S`p<%I4v*k]usAX[Cz;۔:fJ bm]~ ~TdfĨ&b=٤ޙ&fPy5:w4x2Gn"Is:SLaFwWVg pȨϫԒiS0p-Dc9MD@1"nc8,(˘p|)Ĺ-jdRE\.SWY(mOoy]U.S acL^N̷fwO(%aTdۄ`Ό@DƳK4>SC=u)/:GIjG l-s^8̻B-(O}pm;4}hX轝%A_`nÍ?9h97r`Q$he6ORWs mrW$<ԡbh!YXn *1hNܬY:Jgai\Q 3_2 A[ٚ{fM$P/Air0? +vԪ:`=xV Q)oG&t;'gbbw)98fڏ,uX/< ~˩{]E+7e!%ĭ8h|%ib4ru0k4YW²0'9^c*{̕ nuٿqwa]"}F*|SU]]nJ 6Ňaޔ[cASl=BA u$gkq|&bbn9g_I=\:(}5[!4ֺ6lR*( ?iQEЙS]"y fBSF2ૈ{Z=XzwC;􍋹}^yp.➰vzbtɒղ0g5@E)c*kWV] 4Y_ b*mZE-Nn)LR^X2^U_Bi%qpmlb +kw-Wð{_\O_F\=>uz6ӊS;Y?A֌d +kY*-'סn4&)y^66+Ϸnf +"`vhֿAeAM%meI>o.>jg^A[iL䪌.E5R4`ojF\Fi'X @ e&PT_U%.@A@z3|":]ƙL ;eQV? .%TA;b?Wl(h`5=%v?[bźdTCgk ;y"s\H+D!) +8M^I8`֏+IXWe̶}HD%Ra % ǽqK34_נ +}8):')-V38 }tJ{3Nd4:cdX5TF+tgƫ~BWJ{ze߶y"H +JuI5Ttcq~<Ю,yjRw`-@ZU2R'rmΧۣQm[(gZ)g(*{55xEkK͇,gTEGup >s92~H<#,}m K\dd +/ͰU`{tc?@/@ PuMLo蝹vMHOni8pP4]Qc٦ЈW7tAFD |$a{4a'WU`PAbpjF,`y P|Q.Hz<=}SOq821)]XgEH'_\T{7mM+N3á{NhwK]3 Xb0k7=kG \$ET}d1}g7rB^v~cޣG;-x&9Vu]Y]'ړ0T%Z;PV9, p[aJ٪6=.@ȻKX17? (2eH[=!ғ|tfaTkikzH}K꿞zhA:bHhIn@R/c@_ _ýx= +NZ\L>yǴ]a?Cz;y,iHKMJ DUS'bAA^TVW?E2v9qƕ=WC算Ap`. KZfG;ݯ"iTzKxFr.̱}vӜ- E~ّU$Y[[)A׺L#HkUXl,']32X/P &>2F쬗{Ml7:wP3ěQ\מĦÛp!dmo]cϹ*wLE )ip_ +V>!(t܄PﷰTmDGM %.UB(0*ퟝGѻ{qE/Ƕu'&WشouQY +ǓZXi6yMN18-%"[&Yf0G6=Nbu2[<{('pu^B#?8ս_DJ٫6%˼ji]{ݢɡA:s RC֠_ǨI0P]]Fx6 U.YG4szؼWl%ʦo@'+TeNeBnqƻg$\-q?l'ES]QhM_E5@1'F~0^AȎQB y{%jw^e7j~>c q9-)o>fSqlƍ!xӡƋ^fb{tY?'Je#/?W)υ E11nSMYRyo10/vihVp5KV+g݄Zr\0d7L;0Ér #(]qU@$QdNq-H&5]wCGQ X0{}eRxJ[WǐQ$~]7 L*a5,nYXS{w9i#j8迵j2ФYXGb wE\~W1p~G^9^E QϗkIԎ02`f:0dzݝ9OL[>u SΚCklnK~&>s,G9cp݌qIK޴1rk)HP%m# +CY'^<$ऻG}2{#~֞n!$'L*,SHy9Pfjأu4EF. 4QZ^a)6ynҕ][ڏ\1s>k{"P$7.@xxpএωA!#\g.+=`-9[lC|Hb/Gw_6T,dGuq{$!|l֙k+`㕮YpI ǴTƀݏ ]ByDMg4Īwh2~%YS}-͝fABpm6rJoHc60wU+[jFhWABAǧ}I(V4x >$8;+hkX$鶌8Ίۈukh&#R.mctF y_= ˕(ʦh?.e?ٗ\p9a0q% l(RaW["XuJ_kslV|Mk#}I g:sK ٙͱ&3}TY8 fJx,D:樸$Hԓ)E?jy[ni ʝF>C,: ohp:w:fqWMWdMȼTX7 /qSiLνRR %DM~ٿ>fTk8D#>/\CgՏeάPe/9=륓6r ++^8;m]1g qNQFv: *vo,<==/_6{,cN~B`n-$0/'*Q ӓ`x'}L$X +^UnЁTDB4{)H{'w/*vI:'mmnf*9+TBfZdEol&}):n̪=ǃ.HBhԍLftzд.RZ? +E#;N<e~2,LdP^LHhȍݚÇr.v\he!6( 8 D6Yy@k͵&螊% 2]o\yX=2c.@ v(fH. ܔ厣<W8w}J|DE}BUG(/3&A{X0lHiW>OSTᒰZJ"煁!:7!D'qwd /j]Fs;A'O +ah5yDfڢߠ QmS4Gܟ^n]-B ^ߤiIÎCD{ܴ_< -ԠJNxGZIb9q@SpWS jeRlLR+Bd`T[|ôM Ei׀ p41nI σ=3oC{$?{ncx\Y]'1A֡;<ߥ$, 0/?ź\߮Н$ީL'FOG Zp@3iyソ& B`&PKgI"1N=$6D sB!!kl uK2`zPRSsUw/Z|Cm~AATH$u 8B+@*+j&BKXuqFrV^Vkj)aYj2 s'; ќiaI&< +<-E$g |8UmuSǣ‘.n|ݏof]Jq"70.&C=]Ҿ-Xe~"Qip>O V"?*gbUfFP̒Wn̆g\ŀFͮ]EP8{:07>LUW\P}L׸+OP D\ݸW]\<tS1b L 0 jo+dT½, _ CblI|' +}" +Ž}c` ƻDq&u}a`B!?U:.=ػ1r~ +O̵ϝֺIox˘ir 8p+q#A l"s=C@Vnmש51۝"ܒaiZ%*pP/g /^i;FL6kEow#E +d"uBbD9y %}}I{HCGẖ<_=|z'pjbvk{蕋\tyT&-dzzMÿ1PqB +ŕi|ⴑcWݽ\OSfCGy;,!,a~IGD3Ѹ*b6E,"gMo(ŏK5:P @>'~Œ'KA>Ck^Z)Bp7;CC/S YoQ)!}X6@9%'伃!BB`XJ(ۨIɡ[6.H:Flr{$:轗P )]`j(so%O@jA+HӁx!2 +Jk77"zhaÅ7Gn=-IwuJ9C^롍&_jsscCם80 &apM$ !eT\xx{rRɃ_G퀴N1ьTq<;^fB_-㋳[VHZe/ˡK@AE ǫNqxeB҄y7H P=>2>@o8Ũd(L-KZI0s Tx8pHg"hb׭,0 W#*Pumj0x󠇞(ppn&37/zEƴjy'{WPe܊Cg6v|k3z_F5#Y$x}m}, +E4K"02)cWIvzW싛 !IWp"hݩO2Q*: L:~T9$Jͨ{ͱc]Ցxl(qNP O]vYq"&\cpO +_Ak.R5+DEi(gߑcG5#; Rqå.v79-IJOLAM1 ywψӅ4 kڢ Ag@5O +˸tBV!Aϝؓ,4 +w[ 6U>1Vi @l}lD%a Lrc@cWħ6߬ި\֎]z0VǮee+!QS֐?ET!CKi}|)gQ< +r]%<zr̻}Q@U׳tuEh~(ia aBsdZ<'vdW1mc-.Twp2S fsG9~!mms|;H"ho3I"H2Ik[1eXMqv,ё.eNX AFOn$ڽ_M+p邀 ǙRqL!0Myi%aBL~ё v9S3!_H2YQ "Q9IOnBŠ΅]xC@`^rczx|5ᑢgpn^w? +4Tt~?+R~JBG~joB|1JNs@Eܣm">bG]܆!|aE=pPxVb{W_aB#lfw`XjrKedmLx>Cۺ=+6O :rOLQ;+m{iy!=c&b/iCĝʆ@]sI (jLr㻡8ּ?"rR0Ev*E\nv } H3 ,r>hթy|ko;ViZ$Xi31.v: fY~Ie)nH I:j/̓BFR $k1$6.GQr,nX;Kx:]nSB;(.Kh殫n6M {7HT&H̀;!Cb$)9PD]6HKpu s7&a1C]mF-2x0d; G/IF,)2KMD@ŝ4 9mLR`:O"?S[5WW WEcPZ>aF3eDRnYQtĐ@8zMtyeYvGx_P; b&ňPYqb,e0\\N8U? T1` G:z;їٻX]c=32{[":;ȿ/$H/ar֏PẽA bp#> p/Ċ^a-?Il=F۬31%b`ŔB8:  ) }-5麙ƌel@k=b4a, W{M]VU?XI%[xGa^:m\0a,A8W{w]FW{jA"CRVi ] +\D^- :(#|vpJ.NrcAIP(|udSI=6IGC+.ҕ+N r4s-axG1zH_']m38IM1c,c?⁌tNE6:k/H)($zF6`pU 2n-ΰ5ֺऔb'd,$&XˠS)ݖ?zEr-Iۗn{:dLG //AjO|%[HŦ+S+$U#8gZ֩2Nfeo&L{%EA˴1 }둺y8[%cV'1&qQ/n[Y"Hr(=ؠ0U L"I^8w"RSŌQZso&:#[R!mإ0٬'lZt M((Z>͏)'&j4JX T/S]zrK3g(MEгu`}l~ 1XxV'UYDcC)Rc;CMRVF{kW=٭[ *n 1V8/oSki{"#!;~-PO:c0,p>.s .L CMGPgӦ +]c,')lsaDuOxG:h!DiK2(07zM`8kf(&q"eɼhwԬϲ͆hiIͮ`pr7;! +EzlL0%_&]Y#HFiW ..L)90p,/fO@jI@DWWf^lfM8h3ƣQ +JC|+W"֭*&1cQ0./SRYF,&'biCÈ02Dt!Sж [K<)o?9Yh>M~ +){-s#!Dk[SMe]5pw~b,p kAE[+5DvsC@d? 5,7i0e]Mx}5d7$=@{B)cqfdb([لdU*~'7g9&2ZO?k 8KsK"e%L!&S9bmWqs6NJ׹W;P; -6*+Hjh< B(s@g1s$j*Eߨ)_C:k`htk8/3IQLoJU-e^䢧M؅]$Z-v\#RnRrB\_;1wу5w)Gږ2C߭íCR~H5SVARK5 +-sYԐ)c T3BBMفVV*G܊dΧHP~[?n-~>C_I-=' #q(|y=9,n5]!)[_AS5|.0uy2ew(8sEN]'ݩnn,Q*]+~ cՊ8ʒjp!@~ۯǹJ9XD lp +r4}^unEΊy2z^PN㬃Np#T&σ.IV-zDuy]'sr|-U\3^ Vg6`YAw1ԕ3 +(].(cOxaɯImaco<,sY>~i@ucᄂ^Nd knBF, Me@C-N;|eMW,t4q}gPe%>6f[ +]^+6L#wr(28Vu{2GG111#o?ڇ10+B+=0r#C'ǛbvXS9hb "]-HVYʐƖ/v{zD?'q7eGKHnȝIMXALw6HO{e h%祿zqqd-P>IB+FЎ"~HlOSSmy-N/P6$Aǐ5`7" e#f}Z +&q~ݦWOx ,iI:؆1oHdvP$γ -JTe\4Ú5seC-ܞ2;~l-Zi!NqTd +Uʎg1?Fc{xQE`GȡL |/y''')w9]6BJSjd@ڿd%X*!xd{޲lWb>G&{vw%Xt7NNK*'3iM5 0MW=PIYS3 (ˢl k۱>SZ_<",kb>+H3ܶ8mqx|'QH#bT $FCEƨܝ4CIwJ4/&hFNjeT/\'5j\4*֫⠜3I`p +8s_ 0q#Z*(FIk_2*/S8my1/t.6b"XxРk +qV΋\n#j̻)NX p /|#Y̳<Ke"{W:\7O$LLBq8<&#%QKrF|+4/4=HeWz1!#`TA>#g5)yZ?ۿ`<Ճ6XuYazL + Zb5r^5i, 9ɋ ^mQ)Ap +D8#P Cى~ඟd9WخG0jV%<1C:Xws_Y؜<R(Bt7PoQ!u5p 6Wspљpm$Ί6Q,6+х]3Rx7\2-MЯ$ϳYo@>Juh6DSUnZY~뤱yi9Rl+[ cHAZaY;%WQ +唫\1%ꎪa!)AG%In' +WP'[A(= +VmD*_-D~{5r0Mq3;>>joϟCOЯ/OqoVE;4gpݦ/ Pꍦn_\,=DW޳L@H_;dTVAۆ9ݐ $͇ 2‡bXk$߮LhVb%I@p^2sV;XOhQ=&ݸ3ƔP1w!ϱBjpFuuɨV -Q 6~lĎ)jAO eU"`2sډ\{[˘8,̛utMϗW.l2og6LiڬEEhat GcI杹fsrB߬ʪF nc~%qf{*ELg-@7_Ώ7OGZI*H \*+'XmG~AfWa䌤e \mϪ!oz;([E:&&񋧊8nj9dpS^/<,ޠd +0a/;aޥ BWEή , v뵖_b<) DmAaꖄYB^+^{!{'l49V5[3缣.kɐfVj0)\=tD^Q !UMPB`˖S>Mw#l>}h489Yd ,w@׼y5#~.L!4a1Z/׬to+AIuO AG1 ꧾFL>XJY44X\'j'+`hҠQ< W)Oݫ e6>#l`)ࢿV<0qW˿zQ.zVRCy'̹ PI_wk4vd{X^dFe! QxK5\P3Rt@EZ a43h@z BSy~'V.ikzO+r X Y:Gĩ۹Op[DķYsAZ @-M'rou"]:J+.wl-QbOFa hs?Z~G6L^SU"[w֧!> y)arC~\v!ӞH&^+ Iş +mj3й9 x4*x5AUoN\-djnGK2KHYrz)&0k>Mjl`W3zKocv#?J)?hR%%Y`qr[2ND+Cẖ6`.)tx aR.#zaoisKG vf{F.t~{4J8YAs g Ki2.jE 6#jWL9-E!'|u[L{eˬ`\tq: ^AE$>7mI2 ya1-B4xy ]jX*UrE>IfE`ZюTĐez +f<8B-h[W}ިi Xֿ47l3DA_ IZw?l*mO<ƖIK? șֽGmpLP/Ԭv.s2idEՄ㡠70v x3Ğ6K|ynC}rD sa׫?ˢyn} qаث;o:fuTw>L뽵LJX<$;a;aymzaIZcn+:x{&{xaؘ ElPl|nU2(ýrX:G}KxƸN62g[ +pɣ@,zW~oV#΃CGKާP|٦0f 0D䘇Lmhڏ}h|hq֡[vUQ5L$ϟ7់Zf-\ g ;$)9H[VۆC}ove=/EMfw_֤Bp 1OU.P#򰱽4_Q]v7vd_0 )Ԭ24$,t^nv-1 !ra=v/pTg[Hkꅲ#D/2/]UV1~s-ۅ8LŽ uQ}M1v4@hv!},&=Xԑ9ڌZJ@|Җ@K#Ƴ5fG͂+y@ptCw{ό#_^_*!Ơӹw=49!C}`;Aa{l&R ]7ʧa 4ǯ[HaRGC^m"j@Bo<ɌRo~ [ˉ4 kL3녭!&'8J8={}BE%B܉ߛ|X((3_43*Y2M2͈i4NmXܾJlvC@hRq+i..Џ^ࠬ܎V9U4m[t7D?{M=:<4e? -Iy˃`[Du<Y<ιpJݖʞPgԟDe*pLLqi> Q4y([)6:cox +OFbx~An4 hEa=.BliѲr8ĘuxF4x**Պ1w8}djOb''9A9lUW[Y TI5#nI"bzT{Y&-L; 6ض?/4,WB8~f*tBNd ^2L{<+x'OxANp\.iyΡvbP_QӊH``p0u 0(]W?O> 'g"x{,uoZ+6 ~NWbޚQ,>yBn!٫J CR(>wj@r[[ӨhWЋʱR$rxS_c8GHeIj#2 -@ +:,Zl]!]KMM+P÷2(46Zw|$qr w +1Bɜ7jC_`pGOV J'|lw;E$b\ˡ|qڨ en\p$D%>u,>={h'%.5>,Y% HL`Y0wdw;shU3D6/RHP3.R(2=Vu3ƶA5nlZY1Zh]$>K߆{q/Cp[p]ވuL*`RDG> +,d̔2ЋqR|h =ōB~%F=4أ1KTKT B%U)eU(u=3!~q`C[=isZZ/jWnWP P55˳Ca%3|p5\L"61b5n po {>3MFB+_\`WJ&ƽ:<-d(R'„u +Up`M@"X,a=tI\6i%N "_rbXhh(62F..B(DH>朆Htz F1D>oWFFkxyq/@?-Y)' 9 !Q]:Ayu}0[_aQ ke\]m3܌VgJ jW8~;lQԢ G#ii/sI4)v B|b񹑓Ho"l];`O@PT@.׾ǰP#4~e<%a3e_[51NMIZ[ v#u,^xAju'bǗ__C؈ @Cpʹh]݌57>suTRpg^Ŷi]K@اQBt"u49ne=orw7 i mrƖUmp1Y~qK ~`emHHD>EaiflTF68y}IElY`\{R;~<[!ãOx a`w#.&pvrоJ`4ƁfNT聞OF&R-A5F嚺&ٻ +p2Z]Tƾ7 ŞTI؞,lr~OvM3K}VOo \0^X=\&j8I>6*)nz4wGʘ7>%t" ЃYݡQ.r=gK@Z +H$D{Ƿy u.#2$;Uoذ4綾_>ON_&G\!B~4EŸ}N"OhfV6S1NlKq\>n-"bsA r6cQL6 E*.)qEOWbCڝ3:4jI ܑDKGWq.M qW21HDj)GaO\u +}SgE%:6qʈo%I +79x0" Gӑ?qAѥ<ɆɐDr롙H52~˫/0S5'd y<-g` Ӷi3ՙp&I1T)ϾcAJŚHۯ'r9lRzYzoǽ\5Iȣ}[]_-wxDbE^j &Qⅼ} "$݊=j]–dhlk+[{ɇ$ ) ipHa&-~;(&,ΥIsc%x?0]j#sʡ[/"h$+N =ṲhG\nv.qI?GFD-J&q֥J}qQl&MW(U]ЁSX}XCzO>"?~n|s+yMQE̷2i)S1N 6[n?w0Վ;U%j@ fՅmxԧmygRL5l!&&nW.6azpB"`~Eq2dkct[V_PXMתRW#f@|B=[$5zOǡE]n8#RlW9J$˽yJUg7&ݐu`Z9BYy-j-:1PL=4JD5Nԅ2F׷+QFg%kQ̽KݚůmYshTK `;q qyHKyώ;8w$`qFLiӨl};B3A&kc+ 17I)= L>**%@vXJ9n/F:+LR +򷓏e2XW&^5Ѳ|[\V +;X~\: BP_&(4Ģ} +$lR=>dZ/Z'1?ӽ0AO\, 13vHvţpAxecSgT,3HxwDj)p4"(p]z(6N =˘ra|"\`UV5b@nsaoJh+;=u=GExsYWRd/cdgjբOk/T82A2clNְ-[| V F*fT'[9̏@vlIJ*%2P[nDAbb1|=0SPAMZbHג L1.H`Gџ=rq5bav9k؊H;Z q CIBYS;lM(ҏ͢imT&Ձ{ZK+C7}Z̏-!oVm2Bu%VGLZwf +;p>TKw +X:JTSd 59|X6ro?MdWSO[ʁIp{b0~!B,V[^$Iqyx$DX|p[}"0*Ő'3ٟ,Z=G1"u +摁-s•@su]svrO[9Fwq>q9Sc_US<hĝ;^"_Bvfi|Ӥog(DX̊*/|l8r'OzptioiMW=@.%[(Z?M"F +:iݏC'B^bY8ۑӺr*/0zXbjRrR.iC +_W + U\z i%KR%X8nէ vAżr +aŕb1|nn$37H;m˩>I F 3n)E^uzf|x{SXrZ&A؅EuΒ1 +oQe +L4,NoKF}lc8 $q<& z8 Y.Tllc)C]v!}q ??%^Ѹ79ϸA#?4=a,,C:xbW.n8H=ÈW]TnʇaT2R/}pF78t[š>φ- .._v\e~h +,x<ّ~H2L@oĸx- Px{јZiS'WzXdK/,@&z;"gg_A;,L#%6b|M<~-d@eoőz\/-["OcL@`8^/Ctٽ3Q1DlFX4Ph CST:qɭaވ4*>D<6!?ݓN&%AdmЈLV%9PU9+a0[I#Rt9>B"";/ۀ1"br=Ogb.u$T7>迀'5c0Ce']8]h(FXQi::Cy:G}BgCq'P]yub}.#LMll+q'N~XD˺ (ͧjf-CQd㺴6sio%Tt.Lh@zz/@5Vn`4ޥf9أEB͏0}zgW;̰^Ycwҹ`-5uStQ endstream endobj 2474 0 obj <> endobj 2475 0 obj <> endobj 2476 0 obj <> endobj 2477 0 obj <> endobj 2468 0 obj <>stream +HWn}WQ {w`e#MN(rQCiLE.`I]]SN[K+h!'S[_l^-&^]:)8\-&|2k')JDJI8^]>z+rM޼y}+7l7Yvd/?y?@f)66!N˪k;I뼷n{v81`IdozW1 i ƶY+B(-uZ]:?)%wov3{"Y, M$Bv˺7_`Y4'ZÏ> .mYweKꓡ +wݫZz]}}μ.T#H5H)E7&iR<@+$S|/ǨK%y]mS%ΎVED3i xnn8N`HX&!LuBЈHax9(,uag:< 4suUiGfx&>1Ѓױ%FO#SatRBDWJMI K9hj#h43XVvM~bWj'2ÕD0_]Rn Bn¨ +}ʠ +0*?5$(G[Ƿ֔;$1vE%+G'=xe!z. ‰w$YQKP-z6T(`,R᱆V>bXl/O>0;hj0Lm٠#.%r-6 N2)Ed,߶DH^`!FzMPu1B>)/`?P9Nm2z/Pݿ9,*h +k2H<F^;G$ KxRxlVY`$wձ]j*3a]` fVz0!(CyB䷻o<1tGwl\Ei x}`];̗A3 _6MCOcMCD~1M9Ň`l~4FOF\CjkdRIM6fJ:6e.63ʨ"+[W/Vxmz Kѿ#̤ۨ͞GX 4b)YWv~ہs\9e8۴՘!dJ6X E&z> +%'4٪؉GEˀ{D… |VAc7QDFm:/Ҩ:,(qh΁@C=aݗ6a$%]fWuU u 23Pg +pPNC.!/lc@,8x$ e9@VTt6% nn>d#XMjXP^'4N7 &/23挅u"0fFҶsDC~,P(ʙ/fwDv?JM$(T` fImݫA Kq/Ť1nƌ$@b^cx 7*љC]iʠلB;fxX*X2- ( jbքe1B9BD&|Iȹ&sL)G=9g&`ak+z~r +Z΋ԑ kڿDt s mIlM"`oJ vHYd ֫7"Ga )HGJxxfc<@=w̬=ے{"B' &6ǰw8qwm0pvPތ1ga/済0GMƹ "WvX~N%F +P tu__bcsz2UbGm8J9 +RISA0L(خwo/U>F0T b\W J[k7躻]onUn8as81Wl6-/Yj(ԩScFh[=RPXrH/>,NN)]|8=9=cz~i3X=p/R@^=R<.O?#ɯI M+P?mUoܣY)j߆Wذ\FӸRʕ_t'zeL+}ȘzJNX +5Y<_U6C1:c>l'GcxAI%I`ϭO`H&.Np7@G5XuG|IJb7)1b+ G"[i>*%ġ_&cv,)}M+["ؤ~]w`Ad:t9uj-|sE7ؤ NtYc|0kEUs+L֔2H9iM XS\__@zYKd/+y*"a1R@:0sPV9M˃b\urI֝=q ߱g'ؗ`Ca`a7(41AYrP:i4,z?Y\4[pO5qF& k:~0+1+ᱼ|pWP[AЗB.HU* M\&ƒQlNTQ G/]E +^oD hW7mzL!3tWq"N[l0n<_ݷ-f$>stream +0 M@&r MZQ)u[.9MVH94?  W(ɰo'?Pso%&Հ 쯥w b+HkaҔHJ:=k"f:VHx +"S8=x\yX{/ Ͻl3P4 e)̯ 9$ge+Qz0r|bn~ՌCeQ`tW`chῘImg|ڟYrxF +Nt o5-5'`gԲɐT|2[ rWAK-V?TQjɬ,HwwPDh<6ˏ,A zy>Lm&sm> +Iׂ;9%\Yh;cGOC?qS +ni45^W5yFTaTj6m/Pe$@MO(}5e2) yOBxǿ$#ݶfݢbM#}}JG]Wؾ},8Ux]vk*ū{7|}&}L*@ "Ȃ5!(@mW]GT_IJns:,5'N(t>}h<ŖDQƇTCTsLf)PetzvͫH5`u)Dug}kg6cI1'3ϾSscĒI2Їn<;WO^ռyy^BK#CӄC9dsZGKdknm!X&K`EAD + Eh~bꅊnW*oajZJv(?KuUM$)P9{%z .Ljłym-ùI8D +ܕ}騺 xN!Ln7֡-~WK-ir"-[7KȕhfmѰʛW{*=ZKSGf&˵6C'*9~/6U3{vOOP`*VW~N I% c;P <A*gz'kU:%K9&4)Ϊ0\VAbh"cR~wîQ]ܨ&BF2ɟBg%t!p S?p¶,=nqDg7hЫ"ۀ +!ABPFos ռc uVmbE]ud1Ð+ۥgƹpZa,2 A~')|0WYn"Ep ^`QOL1݁SqӔ73GE|!:7gg$yV"}'}?/Ia@ˎ9QCj2|:^&z ˆb}.N@0>}co^ڋ}1Fj#dsn Nx5n~.}*+ qXVMqH_XFl\T2 )-m3+Xւn!HB B&R1ѹ$9ZWl2/c^H%NpН;#~JPa o9[nrp_^CO܉ +R6_aˏ 3}acǽWdo͈r+B8C.uZجp6H?`w#!=+j%NybT3Yt >NMX#z;Bh.PV"֭ZfMnFL.v)3#7g88ҽ}i\LR +l8Mj +3.UfT + .iH OG,|b/FlB).>9Θ<5Fo#iH?3SB:d%K%*ߌVL׺r yCn͍E<5 uNPBF&c-O(#F^.H#zKC* ^ڱv*;ּK[$JHt4 EaBٻA DD7颢ƩfjήX' (4MXاG+:jcCXrSBIJp7* +[tri?N&@dI-޹59Hɤ"T||3ZOLn^2?)G ,B/42(XpkD. Y>}ӀՇx{:js+\|wH[7ՅvUs +MkNf&[#oz ==;67Y9cZO4mj@Tij#x%,_a5_UFKA2>&OS)B26~VmTusNj& f?ڀh{:lKL+f Ph|1X3!{^DLDXkn̮D,q+,NiH@Gpkb;b^l,/6{kQNcە!R5pGPK)ʤv 1#8mo}2]_ߍP]ڗ" ^ +LM$Dg֖YaԊJ"N@PtVIOUJ8(tM0*& + |]d)B'`}DZ+*$1CMh.Ryİ=oS;e3Xi.AZoEd_Ԣ:: gBzt k0\SQSgvHM/m{xQ.WEh^O$%J'[[a4kB'j-jzYR@;)cZQ7摖Bt;3 [$}F!6;,RNƔ@BzFWflPR tR(#Jb]Y֙moTvƳW4 v0Np,/]!eTcYẍqxW:-Ke ]ڞƤpEafD~`]Q?*)G0>sWϳC.2#S}IV˂nu(L(oMhT^ႆb +[rgYzL9s'e鍁zq> +2#FWXT=Y_d,IP26Dbұp+aاX|K?+ ؕ"+=܏a}DBԏGbPo3S0k! ޻UA[ߚ[mvFk_c6S3#f4ƟZ5v_,-t5VX$0{9X%5rU':ux+`^aYD4qVtH[@mW2_45zPUKv|as=`(Py ڮ]^&M|.Fyޅz-X2~(5Lii/W,|vqE&&j᪈]﫫RJ`"p7|$ EDQ>I.IK(bV%ǽO|ߺ]I׼GwL:ﱽ-04 +sԭt4g'q˂I#oTu~ ߙ,;rUr)Wo鈘\&|WK}0`%".%9}Ŗ;+햂ӰN+DS, Z(;}BۜAy +ıBN_L*}$,ypK`'T-r04^v%n=H& r '--hv5Ԑgg0C4܋mt%hF4|jI&@\;Gw5j!<[Q`MA9^^} K/o{w>jp7||!@~l^Zޓ-#[\܏{BIwaqt;UeYgdY.7 U^XJB ]OkY +9ߍ~ǦrܕN=!u&d /g.Gw3l>r&s 7 ֆs$BY\a짓l <V/:;dY %S5}NiG@Z 1Ztd]VVA>4'܉WlsB#30)I$,nn@39Ue1eJujΌqkmi6JmP\7N~T*~&SkjkOyi.LwtR&y {]-N~r]V?-VBb!\ʤbLVB\Y[8D8\DEDemu!" %jJ&o1qUqXEV[='zBI;}!xOsշ\A2i8D̄ +Qt 2e$h}e;oͿ5^=S <RWtJs*TY&^vg^lXG!YڳH;,u'f%f犭3jxB~#Z:@P'1C%R³x:ˊKy  g_uM4k {~#"/{>[ |P_nzWO,Дt ^np*\8,S,4.%27B^# "7\##M1̐Q l$m'(EUJpQϰ?n3 S]5YDw% %V]4.MvĽMw?A*P_vf,+!Pf(6g +0_6H<%v8ݚO/bdSNw(b3 U O|eA=Ptз{t'Es¢`$ٸj4$k WvC5h/nݶIQvﵮw3xkNh#u(^(0sЌXϑ.J?ebd$17 '3nn`>@ *.#DHzZYs6q- ~QrK>(VU +o '\fVDŚV; beƎt;(kS@vh@iXK{b^9fqSĄ'[Rlyrrcq;4Uf랺3Q|?j"4̺%G$S8䦑ʿ6 @C;A@c*gŝCcb[*-%DhyroϩJ?sE0L"-p3:>dc : wvafԥ BFPt@;BnYB&@D gl6E}Z!j7y|7Y$:6}<' RY<7ݍějmJt&:^`%&S3SK9QKh g7| +nzOz +Վ{[=::h-+F0pDhWpj`VS4TSKw8R%9r-c8 ^0f2B /Hg3Ն{*{rqjpq7mǔQ]9PRt4= VjFV A x:jper? %kP wf-MU|ZIڹ`3Lo< ЮƲE?/#FlP`B)-zwI.B㓰"YZo'խ8"DR +H^+W]̓ר;Ыn DZg\Z4wx{4Sqr"z&bKOYE b +ͬ4?d +Z[SH%C +MO.\'8/K&5oґP,ؚ/^o] "'.!Ј<2w2d"]ҳ͂*|tڼ^i {Q7`AB$-00?q^u_Q5p~ +`}-ߦ/&AW5 C >ZU;+*\_ey tH,"2j ? CB_Laןh50-%^YffLB iYl2%0 ,F lLVj? _n/vK_hN.7P); {"x#\)@v{hm6955ImʪsR̼qM9D5ٰ-C`RKqvVu=rߑcfVd(c (n0_D!K6 p@ҶʖշFyd!\(38Ke&1V ('.dv`BX)#FEz`+Khף1KZ>tcbzjl@Wj>Z!kjSzrwn%>4XAEXQUVO+NRn +Jo7bH~b5c"2g8w4l;@Δ{ria v̯w29*b3}u8-jBWjQ8?fUGzP]XTSUt6> aĺ]w:1æƐd SUq ])9n&D\Vp,ӵyI#vFAPl8/Fr8۟A DP Gyk/#u)yIͦ=Ҁ|%4: _;(LVg<~%uoKGr)BK ,5C3 h:,>k_ C\rmPqL¼ '2:*=eCޘF7)&eR,DP!SĆSg6ě[5eB Q+t]ν09 K=w\8Y(;PAѴ22p>zr)qAųwoukBqf37;ٙ=RQnO1v K>^Uwr F|/IoMI$؟=a#aփFbUDs~օ`@돵~Yx-l `\ ϜX2 +%{<(ٟs&52 EvUH#7̶e#8 zOt9e|N7Xa7l2+}b~5og@nd<= C_yGg +QiNA,tϻڏ^t^(A6, 57:5FJ +lȽ7;j BP($4 jK;N1@\s=ix1<|j)]  }8=$ҎM:aZQ(PGf97e)h3}17ok4ˆuJ=l` +FpjpB&t^Q墿BNܭWM&ȮVQz_[cvNV@yc_04[Jݢ%Hg7 _DW; ?Ծ/GxjCLd'86ZaSܲk84NQOoN Ym +bW~7 +,q ,yG<=WGz]Y&j?'>BӹRuaLlӠ @h+lE4^躻L,yf1uc<Zݕ3ü댠p;bgp8Ÿo'֭7rU4F| !O(䆀cs@G!qVޅwn} /@h]Q5W|?(S;_hK켎#zHdN)=Ti6MPiBW/SwJrKoU ~-*MGvkI^sg+ÂUY)Ė(p0d||Xh_8I#$:`DR/1ڐBKbڔSq!ֽd-ٞ-N/."H} 1SwGZFdM1 -7x#U5R6 2ͮuk)lufh2ʀzv +A^3ޢOBϢ ºZ9+Uѻk(mP*"n4anĜ|j#2@ ޟR^(Don qw:lG_1d8-ϗ8Qr ,Z(D1><>ˉI;.wxw8 +A+ztJL<-uk3Qeh =hBp@&Cgo1G-S*K3LBʱ?PǽY~ ?ʹQ꒐˔z`q߁;@@k*\ACQ2?O 23DEέ!߾\wJUEO~O*/0wclcr'W +&|er|Eqzb4P3a^;ohW(2mlGj }ub$"DZ$7kBMWh*oMK.=ΆςD? F͚k#?Ylm:)zQs|āujJ"!&>B+7swH@ZY1!۴#9sU]SԂ36H@_紙%(HP[e38ѫvs"[َhBXG(GL*ׄʸ΄9$}N#㢈4Q8~.c ?0"~&uj8e Pr xR$T/~fqEG%.ʵ>t#4{-}gm \祭PvƨtqR BJM3 N cI^XܾEe@s:k1xsáŶ͒ܪ>Pxԣ<8z\GSzPU$,t] Z[\Iԛ)-A>/8YljQ[FN7׬[g_6K1<=OfٍWXC\F5놆d> +|^G7PcW-$3K88 {v86`xqyybU:_HZ풫kc 2 EO0ڥ '$/16:Dρ }Ϛf&i9$ n ~}" >9JhF=֡тS +L /FcQ!eɿxX~`SgyfMHEmTv#>Vj Zs{ݚ/ݣ@R2gŞ_A:?L赉`->0rsCBL̚O* 8>_^o'Lz%;"=HwZwm _cx`ZѩlK-amEOrcFjPtr%-N `d{Rv[0P{OC"cX5oyZ+§eV 8ܲ& slAI*!TOYv D78ٝ0YNeɡ {u@Qpi =xXҡbX>:̈Necr +|4'<$>#BkGmeׂ],Nv$4vNe?s[$rpewLw0-?$sYN-eW8 jP*`. (y4i?Qhү\+3[L Av@#I4 TVq{PG|XU&VSڹR n6J0](kJ=$Mu'%ܠubdrFoq&H݈(((^,Ŗs:ꟉYl] U* S X W89w5\>g4\ꄑG{* ˶H:ܛDt}?{ͻ(>:$&ĵeX:Rkj,Rn<_z$k]s[1ۡd;Cf \zALPgJc߫w5)-Z6sZ=9E:.ܛ)va?H쏖 ®*Xȯ QMYKIX-iƲvӨ!񳈣C_4rZ' ԭ73DrTXdy3a '9PJ9*194RpM]lJt1 +i f%Ňlps&:#,%uྎFsD0>0Q@AS1ȂYDlpQT$7>KڿIHז5*\0ؽc1ǟ J8X! PW6ml>lJJ:-̔(CK_=L3 ?xM/.lzO*Y`mR?.E-CLvKu'H4Ύƪ+joQG~~|&X"2Ų~EQH*p|蒓ⶄ)u +H][yr!~RPS=WTigu)2# o8'@' ;`v zkELYXObؕ1②f_vYoa@`)3PxQ3ԫWP1XI- ,|Lf-!X&3" F@P(8RPyϸ<=yT ~qXD;oRZMu=5l Y(¦#>gy7!FEgm،R.23 QΒЎ,m37sYn↵ZØJ/ierd}@ыg::! ܢG3WzLrq,)%zmgqo0ڪ'2Jh3lu*u l5N HW!lQѥ̈́d^,k f1>05h b*7T>a pC]?fN2qk'9:K%F+_. 5G򨟈z&F˸ +J 7ZEQ/qrx\ӿ*91cxxV3IWtEPR)yA<|a^Θq'2%>Mƚ.ֱ0zΘK:ک )M%𽔍1 mCMGW]h(H# +Oq<.͟ӱW̻1pmqn6'AQŘ0^fDfkɞ F4I_.a #"KDltð44 թbvXU0j%¿z^VZVqr9SO8 .jǗdvL WΡj|hGxCÊ(pHʻT==?D LTԖӖ~{.uwE3$=әo 5/߳= pQ.{>1mG9Ľ\2NwB6%p%(#Nh--f-<(*bX>]QT+jC +6m7"9X=D%aҜ- 7.)څ:hvW_RuAg1U+|')GCF2ji+@xu88CV+-j] NH;qvٍ,q!vm}֬AcZVTgV 7dRYKYmu.CjZ *BIvX/@++Nf If;UWA$92M$G'a>M<|^Lbdˠ!}";?&w2g``} +N@ڭ>)ܚ},wp;(-<֧̋(?0q ?; CGxOPOsqpq#N^4s%/mT(4d|n0*4aG4\Y?uh>ai1x.i*(mj:0hc"=ʔf+/78P^:#!vnng>{Pʵ[/}Ĵܟ4e*W|[-@ht8k ,Fa\J/c:t:*!Aǂ뾑Ϫ9# .O aJ?ER +rwTfFֺ-?^\ |vO ̟K%BŒ"Œ ` #5߸XcQxg_z B\킉Gy0FsGBWH)b>kHtᩖɻ 1ZSln]4CKj + "Uo*_5(dQ.aֆW5*Vog'VF"~A1FKq$ f gʜXńpy]Hݚh;wƣi*fGmGm_*/P*lc H;.hTϭ—ԏF?9p +0pۊYg7 1qԘGֺ3i2ْ%؇>:лVHϬu<^c-9ЂN͂&nu +q<{|g#G]s,Ha6qy/_7|] *7e:FI CofП}Tq28En\3w}HY ~ABJkUie/yGkE0푵5tv>GAF'N/#m2C [y8..p@ b-j~$_G<$Ex&'ɶe#xJ@} a/-LZOh/;M#b1<1ux )b] \VI`$ԎJ ?kH&!h=eMh'E8c2]_}W| x*QM^"'[I\DZ oy_I\{҅VN(nɄ|dQ@մo%bU);&UH"X݃X} (b!3{ST.V⏛8nuڥigAIñhSˑh] p1Fy(*6ehBF\,mW=̅q֪f~57ȵ@rtU2f/}fRW7 Jygsol=UCB;1]ViZ\`٦`["w݀qrPk]&}6AtϮ UQT]g%nA0'Ul=g"6V>-] Vpp_/[3 +zH=^bP[V(Æw[qp8d évv,o2p' ]0Z-`IJѵ6͙__ap#zu9_dm!`І@lP"*鎉Dl|#rP"Fffj48L$SL-{N [tm5<%.n?EJQ/*`cHrw(LWD[dI)ԶAPE Wef]Ld~^_kUzS d_݇^S)CA !=orZ+4Nt +>㦃ݫ(GFgavGW mw镻n@Yh\75+KYH 'rz)\LYYH&Fdpc5cd wL7eyts{D%dz0+^%֐Q\*rpB1"Tă.Ɠ|iM=]9~"lNAc$SovF2w@D.HA{U;/FWpHozw%~g r.8lo&͇EV6s Kp-:3z[Q}66~zWfp_&8ׇzUTp42I-a#$gnjYߑM}r3W(1Fq[akWy 뒤3A̻.8,]*@* )i)%^b lZZ=bS!B jx2r}$ N$#g+V*\ +tПA68aS{WUb8 wHyt'<++BרܬLf͙ ~Wgu f9HQ7Q -} byK)`BR.+>3z mew ( c?_́>>a裐ea3TNn8)*u ?µ)YlrڝF&A1 +R6R`y@\<4zΐ?tQZ4doX85ȶ&k1a׷DUnU]HBhCMb0 2->`'AVsөG3|jx,%BKnۣrJ s"U%K^{ +GJZyzN?.kө7M@3Wg3;}zEt/9Wa`IA|0?(JE/b{O7iu}lIw)wݚ*| AE?XjQkenj jʑg^s1ũl +#' +P2ͨh=!GJX-s+Y@%=$b1: 7&5:ˏ!#h\eحCJ< +^[|yقc1;U|f}|$?Ww)l%%?Xp&ΘO'!c.{"{닻L"3hV3)\nZT9|dl}VB$TCOiP ikT89E)饧 #E@ J/oOʩmKNW|QQ^L51ڙhD^+π39bsYݹXz;6io/tjB6WYSpcPh7+a6rb 0w| [ɩ",!z (HBjYOnlPM5j gaKvQOW7dm`tDZ?tV-{9it' z.2v:|j_3P"-D$-. o(pƞʒ;sriL*vAsnەh +o˒SD + ]f0%) /t=,LJ[WMoPr噣7.7Lb->#(dtkm8X_.amon%4t: ){/&Śq 1 +(VҥOCG`|@ƕplЪ'C"l~y)ɤRo*AO*@ zg'ZcoRҽ"5rx1u/ҖO֩ _@I Sy:xÁO43UbJ x"0poQ&Tg1bByAcdXXޝy}T&X Fox7gΓ-K>n)<C&4D2rTTǓjdKK9"Ky0%-ɡQo)T*W2f'g.rַђ~W7Sq`:MؽTzi=;rşZv@*TDOYO n?;FQb}'ֶ3a0:@ԝrE%)@&S86 l],1οw="ekk<zo$=wWПB) \@_ +āLˡ7LYh|=M_=*PcGV&gi9я zBb?"$bZ,t|R\ҷceȐ:_oS2v/3(GHnK$^ +6I/y&}1u_Miulql椟E.yJ>e>qTh<5YZt|G)&-*Uf jv!t?*~#6-AN%7*1<]1=+)u4bA[N:o"-U٘M͵Q\.11C `3bo빚u2D TVH_qXC =\V Os cgn|7ɼJ@RVcm?jIrvN)_pz$vcidUdaKoq2"dT@Iɏ(3PkԂ#t/w ~W2? xX|-]B9: +#&sqnKjZ5Yye pCRdRb!cz=e +xM%Cbbc7|c4_x44l B ʖ t$ m04-'w^={+1a BM=x|"^|)w {ՍUD|Q eU] Fh,c%@oI7 |k =a##6H/lJloKC\!vy'݆h#xᜂ%2-_<jɾPD]ks o1,Lm*IviAhYeJin/m/QaJPx!Y#.RVRb޾Il(eX #bш;-qݒ#ٶw:]57u/퉓OU35*'. +.A,~YcA]:RU\wOupZ`q&hHuv =Wjdgg0,yۅ +ݥ'Z'Hx5-}S +2Y3 E}V*j_yy}?{iAhh5u`nZxbv,ÚJxiO@@-|B,nD^_?A-P#}غ=RD/V0ێC>*Q5OW84wDZlhh-Ob9R+OraB.sބ'Wҩqs:i4 +sIA$$f,{U%"|u]IE+* +Y|P.4ta(sPvq0Y +KW hk2ӁL"?9Ƣ TD*:_٣۾{..{Ms^ҵT>8 n봇&Rq=s+b5eoÞtA)~N으Zǰ-i="aݤ+W$qS~\ʇCc +gTPL_DN4H𷐇0`cusx܋2.LNzW7'V|yXۑ[djI<Zմqa󶏿՟7y( +؄xTG?W#9,r{_?_ anN:sl5. ]sҝ"'zzNaSC~RkIw'ʶD`LlpXz\wT :f&s!N %JCO|Ԅa,9zY +e<&La8!h]毷WY^aI׉= D(P5% ʇ:Gr—fUT'T\[~u@ݤ@j`jqsd&x Uvͫ.u-@p5;鯅cc,(2:.Y es.y},4=XuyLC&@pBT1A'DE0/k@ې=V o7kܕj7J64AmKL쾇 6y%CCJfB9чM{N&?0PE/1s|{Ƭ<CO"HM +:<1"EqC{);TVRk )AYYu0/]YbB45X7214^sB /&"ǏM;u*b aJ7A۪P˂8^)`&F-~~U3ݞ /;Z#g`; +S(W1fMTJJ+GzU:3U?6MvD9o+,R7 xYPioc4g?PT9Wn *sWGw +=t$(]tުD]w *F96DsC_jJ ۿμ>"k'?jG)2C:W8ҘݳḆPEdLLPBG*rf&A]·j0t#Q4d"yikGqbG殹yZ2 !5җwvyӟG̙22z7DY}Y+ ^޹&S<||xC]]A\^(! ^žt=gɯ&ڌg# 0Z,(ν~r2I:@Kʼ5s#6Ulqgzlddb`r>yX%lU.mࢿB碣'>L`8J4Hku} N.ӳ;M.ؗm,;rҬ˲Jr/:BO5:֖1OGŴvĩ'LJf@хD8 P0~LT<}(<`$3&}D)>lжV ZY;8l;Ɓkcռ k݃裒3BWPL "]a! +ITʑ =[>Iz4iOǛym< > endstream endobj 2469 0 obj <> endobj 2470 0 obj <> endobj 2471 0 obj <> endobj 2463 0 obj <>stream +HWnG}W-6`~ <Y#0bLIv8[pDN`0^vkwJ<'%<&`V6Ӊr1 [bqQ8j:)Ύ<>%?=q$Iۡ풽XMqy2dJj:1;ݥM1@oșNq"AB^PmjP)lLN8&Cvз# ^6nSz٭i>`( +OfF;60?ڠ"go3mn#ܻ问?Ld7l>Qg>IQ .Abl)S4ʅIc-@nxCL̺mf}q-t8ec؈}3פiYhmn¹y0[K265_3758' _d~Jn8}4s7vKt9< \Nbr $cǴA0!Ek1L_2NЌ +v01qyj;HgڒIqDZðf,^Zd=H-4A]̨yT]YRW=$+?bF]iL zLQYV{ +yihV.EŏZKuBPr(e m8%ⒺhB/0d8cqhiߌf3H߭#ɡW>FaK*m^4gjߠ#|THxT9+t:sڌN3q>)&|dJSA( +4Ş`-DB DIj=j5H54H5BC+RShB<9dQ~{(ʔLDrDyfdSQ=&*G(|p}fH,AE4TD#;Z< q2žGA"V$=6ugǴǀ tgjuЮ7uyȻ"ZFL`#30`4-(,biC N +-L0"Zx^0D0^+/1beU vj[AbH,Vס^Vft5}FCS_+(1He7mdn -),inU߀0T?Q8F1ATpD.E?MX"JhSƨ8l`m[dq%5I'fzZФL;c<>}n61#mL#@KԞ0D h‹1ܓx$my4ǰ0@K&2xMA@'HL tw׿؞9tvin H +ywʔp% Hg7f17ԫv<~@#brӘɥ FWMBHT*ko; ڒ/HlЃI&l+Z]%2 )&~#,YLykJ ^ܜ#dӾ] P2|boWC,Wh IEfiX)j "b+IxW#,/ Zpʻ­-LWM\Ns)sV4k22~دaVB03%v|B"+qDܔ1@.4|X6/ˌ2et@ we' ji endstream endobj 2467 0 obj <>stream +0 U@&] U~|ӄPÇYr:[LiO5` &_wtJ6k;*飤$ٕ#fl 3R"S&'aOIr~*0P l7A ?:ʠpPUwf9e"bGW]n M{P4*s!I.WQnώͩ˯l=8mjהչe: "9&S3e[+P2_Ăyo[ۥuzXX: qj \X#޸Y5O@fxS".K9(H!wTfS`+# \w-MO%$ꌠ_PI'U(hո |9Tt%y?(t+wISsUs)5 +k`?Р=.>;QW0<R)ºP 7K5s ,UM ZϿKgT!ޒxg+-'Ip[wqަ,,gT^2qmSgH=w C1)/? ߃^J޹)%+er ,-rwuNs÷eM7 7 =5k×ΐ1m&>@yP)|' nfWP _`Afi}c{ =i Za?FʌkWYc?|,QY6Qn)5{d)a \ZڬCФvR N#c|h+MY:]>_j;lP#8=4 ro`-_V\B(S!rc[{$O:CZTБi{onv%~?:LL +扮-_+"4&@9Onc/FzZR۶I.Pd+8YT83B-T&ȸDBmƈn^9!SqԤ7B3NV{r*LmһU!VE . ģ\oh5BGh<5%^DHAd|q[:G@zSdIVQ(6L + DX]Gθ=!.s(6~W <)꣝`|P>N`'T}`&EcF]h:ZX SMqm<3JVc\>R$ +i՟[4:ȄDW JcnJ\k~H(TIP9cָ,)FhbZ5[⌲ +<_)h8Ԑ&=b;|J\AR`gUM*nRז}z3B4#ٓaE-eĘ*uZЦLYTtPÂOL#ý% 9~@`%GgAq!W2-&R+cteXEM!/_iIM11#Z ^.pXZ\ 6ueΪMMWQ޾eT u:"\5+j#g o3+k.GЃo8(6pDunsTWš hY7&\L(9#Z9ă.r _Ơ|NK. ]H>\r[HnB  !gPNZ"f]S=Y6#ԺB<㱪0mF Thn9ZwXq{DE{!LOYށ@d߸d66_ trahL +LG [i(84[)_Oxː +Yxq CcR +?眇-  {l̙ /C! +nBZ}U1C=4<cA;1QuJx +7NO)jMʞP{\27-?oZ4:| ڹbcgM0"} p~X'#ٷ~ŀ[9B}$j,?[|Oja/:.s“S:(~+ _atZOx/)H1DjջJUv̰Mii~oNs/:±ktD QMS^ľ&OvgYnD 9{4fw%J "9<ԕw05u`]kVCXi& ##?o~xMRMB̓ U 8:` mE,`yfN/UHLVLӬW=Xv!:/]j0BHJW =ͻ=u KbL/FY=okӘcərvcş +$pv-UXi3tBQ3٪7:Rֱ-/p2$5]l_s/>%!s\0pfhx;Y.J=@3GKBdEqWL#ge9i<8LYZЖA gw&Zc~)DK0BFծ  G_ex}#f6sʧ%@-Cgwb2ZWH!=懍eUʔG:}WK3:1"S̻{m`5&?W2% spqUMɜ1AKļO"v0%>ck.|.a5Q~h֩)xvyHbn#` 3 {S1su73e8?nQuU,攟6@gv&`@J5 0 .*7u;,#Rw7;b6J8L;)va?r0~c:)J#s(@\GHcJmw?[Zʯ3:[ +saeDg `X%GUS($aр$ȅb2dOqڝћBd r2nE@>(˰99 +Wd8 wP8hcU[Mv`JM!ٍ'r,پK O`/CuIYr rC2v)"+ ӝׄ83H#~!yw{~=Pǥpұ+ EL*ؼo}i(|cq3:`#dIO[c5Jfs@2Iڤ@(I(4 8&tȗ9`rGO@`bؖٞK'|k;D #-%S,0&ł}k_ŜrHбZ` c6 3yl^闀ZLK" 7dh}FG']p݇&̬Ժ r[M +ك1.Z2_P+qv{~'x<to{;`OCvGfgj΢c웺XgV7zC)iBNgS)6oQR7WJtT*mZa !Ԏ&Tn=f-ɰrHK#<'FF㕠޳\M>{'}r0UJ.. P!c<.7Gn*X,3X2JhL'ȼ֏WGz*ěPܞ0TwFY}r54mbu67~D3d3H7F&$ FMM( + +wzkEXdx!~}-a3tx">@C2[=4"y>(O8>_Y,4DKפ)0js 3Ndd:Sԙ!~vF-?αX4:]/\]ko/Ymݖcb]33u:3(AWL@8~iCQQ l%S9tzvB# 34-;"l1B1Qϴ=?;%XH$7Q? Ĭ`.qFYo!--槫e0s7>D Oc#'kiO+\1[b-klZDބ4bg5"V836=5>!5IyV0cꪲWGI>93+w48 B{SWZXQ +Y95m)O*X*/5&4) QԑFM?ic0@N`K٧q_[v/!o?Ylwo,DS7Zk& !%N4=nVAD)B1F5_V,1-0n5L$',hpQq2j T)~`Av&c;>~F` /41mhB2̕>gRq)ثRqދ;'G۴7ܜNjY"Fcz /e.gHb$+J%`2Knǯ̋9K 0AW@C6.O 'nG/HaJ ?Vu5c89Œ+jvri|~۴GxCyP NA/ ~(t ~%^}b"Ic:U16C AozӲT4YS (л&rqJ ܾqȧl +ȿ{JgA.IW;(B 7q9q)y3yA^Ѩ}&؞YyybQ,Ec7Egd+GМt=;ux80DlPwp V}p{WaNv+ [1iz.i,fU~Hڍ8ʨ/NJ~r=keëk; +t oB5Bi&֑0fJ&[xWl`(}7Gg!Yai\j!nDoDrs"1AYɦi8=gLdq-G##Nc|('sY8b0s#)xV\ّv;r;!Q2j}"qMQtyٳM8 +ŐVW*~YV#وԉ<ʼnT,Q qAuc Gr1qK´4`GF:;ywRhz>CoG"COf)*{1z5xX({]+RoȟdEamx1yfS#-\c{R40ImHU[XԶrHn` ;?M"g-, scژ{=cn]eFp|39;5Nr$J\!_սO\?A`H*vmp%21FaYPO%Sf^5 +~p!>kރbMZR8|q9/mIvMts1OS|`V53w.P7ԡ\{I!` ȶ"!Ǩ"eX冀 1&tsB9ɵ6%Hެɦd`E>m~#ˀ__M ěrd Bcs9)R +7XEqp֤nrz#2{'u͎gpClp]W[X|Zy.{q@n謄try.fe9j* >ixP]&*!pfr!0aohN'g[WL*뢃\lLtˠ0E +nt S(ewH$X=?gAfSLiN!!>Duދ^#)wQߊa}&*a@ w,ꖯCrңp)N3MzDvcKnM$C<(j fbNMcr,}&˼~X,A:\BO96>XzAPjN)ϻk_o{Us +a,Kp-Bu!;@XBLN0Gx7>B +bNɗPfGω%;Bh# 9Q\v)?47 KZ|$_4y .0uxa֐v:*ȼ@M4i΄!5azx@%RTӐwLLHprDػ пr01%3n=Ԝ?ogra{u+yVy'+8?*VFgK?/g kN`I3+Cc+#O * B?2ELWЩv39?mMbcX -@: +JP}*KPظG#<娮C;KlSa(NG +m%~_ 3#UC`0$n^%f6ֵCB>:8|Fm\qWs]'|.խ b(+ 0T4jͤ_H8[:Tx!|9UL^pA8v%`r϶fwRߩhD®ќ'E5՟3q0#; +B@2o. Og;'k+3 L-:턁C +kk)xxN+cBd1 +%qnjvS骂Ӌ9ss_ƹ4nX i]FWsdɢ $9pиkC:@⍮AEMҬtrC@5.]_I#袲i-"9s̢C6j2u +^7Mw6 K Kvizgĺ%$6NJ+2mPoKV~y pHG`>\o]>kz6L &@T5mœüf ;>Dk6Ȉ8s8>Pa7,5|yaz/AسLG'GކT8au6T&2n EK Q(,4%o X~'+E콜J%B]lPWRSZ) }/bqw2g$]f`[)Y ׁ e H翚@O@4j=Seu_Tn5-܉1m9w:>ê=)[H_SfhіkWF^Wz +lU2;^ s*KRZY2ht"QaZvi` #-5'eԯS+O58Y P)1w2Py)7@.%M㴚W>@ &Yo9bkuKn{V6esB,1kPVb8j6S6{ֱY'?LChrGo&i_̓P(xf 'frvO2S#R.'EW蓜vZ+setg=R:Hҿ{ +~$thkD/٥ɋT;$`=dԐsǍ>4}BTg:mu$Tb@5աdV *hE/,z>W[ND:A#Ex`F,´\T%ު)Q9+܆y r Re*4-~TFĻMT չR3WݖaL9oNMJ;O% +z9=iɱEҦ9LWl]DhufŐ]ݽeKxb*3+.hav8l1֫g=p_L{!+7ֻqXúJW(l:7h3n8 yߎf~9ͼac% +gXޱdgPU* 1ynaS\qWX.Ƕ`u>pqz Xhhx0EwRJ =?5,fnL0U=6DSsE!j MNܙM#ŦЙKܟ(Z:DmB%/KQ=;Ty<".窖=I ?֝ &<}:bu ut3 7A{IɮL5W!D"'lp[)vg/|s=uϘX1J9(E6㆜CӺgH)n-=3MzC;)WL#99Ex +]Y@6;(/!BXhhv(&`ސ[gg(\%xj)gQ@QtF3DB_F7Df-Q" 6>5Ƹc<;8^m: :xJ<:_ Y}uTYяSR)c_Ȩ88b{|;|Q&ɲf1O 0ui`Ӳl&ӢгsF4 ,^={xOv ?G&[o#VO;~X*کi)=7Q$.KwT Km1ꠃa'Dʫ=HisT`(?[7{v@T ^y}lEi,g(M>(Yzr(%dږEV +Ǎ}yۉùD?-U{SIhs:8)uGFn$cW{ Z㮋7N[dhßrÔfdV/%_{ѧM[={jW:y(ډ'ikfa4N|{e-~E] c* g9n.v.Copۓ BObs*cmC( XûkԶ@cP;iFI]) TMsoctd&wrBOcȑ;u MO?yd$/'rѶ4bO!Ҕ! rkxItC~ࠒNom>š.*Ͷ*_䣃*wq(L2 I K{>Lcub)\hXn]lQRxQe4brgT׫?m*MY`P~FW\=ἋG,Dn9(2V4,Ե6߻|CCX2M1tZ)Clx\e:j>Srf5[ǥY}5 "bulƝwW%kh$s^ ]ȠSD YE$%GEDf>-|nX|Tho1ŁC% yg TRwTz@R:sZ=kb>F^3b^w[#kuxFx!  Z8牙K7MMD%tXj?'&sD]3Gtu?n_k%jt1l|blNFHF,R+n"vDPXsaQ2NOě#1#ҮyD0 pww*L9S%(,DrakZ0C|PKc:oye}&'dA8a- UPMԅG!zq?Po5$Iu.#Jl> uۃvB|"P- ɵ5˖r0=g5E -ֲv g!_c^78xkT8Qz!"iIqT|Vk+cSYW9]6&&̨X&{e2p#hݳ7r")ֽݩNs02 +Ŋ۔TcBWJ '1A": ĺ8g7"러4I8s9[eX*|?<8\t +o~lA]EGr>t , x&G]B8H&kdM۩e^!ޯF;䑀=09OL3#p TܒN7D}]C𭾩V%nW$nBwͩ\ص`=Gd0^M2Hɣ +I?X*"/%s#VFw`+U½3dw+J1s_OiDPk.QPQGS8 +aOuV; +k!W +<@催u'h +F͍F_Α.g6kxGhIl2`^&{5Io*y0cvkiL wOlNҫSG #._}J%*RㄼVTtzkd XDuamG'`~ˮߏaC3D!eQ ^ ͭ|9j\Z5spρw:"lȮym$'!_T,`rz\=m~ qh k?*=1nj!28}Lx& mUꉺmK'7)w;QImG|bzZdཿS14Obwškq07]0 Zpw3zR3(*=y?,OdQϯD_ % Fɇx̉psӻĿ*>Q6nP2f8XS⹾X*\~{SpŸoW.WNXY FjYsw3tE7S>ic<;ӊYZCn\$ώ~ W b2=Ca8Y]6ѽ֒IK#aWg yG&~>;أW32%mc~fjk%;PSٓfAψwх`t{5&z?/%?0 +/9ͨ)NLMu74H 1՗J"<8R6/@P9 #r5j`U7їN; G[rĔ(zYi׆9Oy4mo53%kz=&mQ< LKRA+XZ,lºb,k}ځ"nۜS,&fJnbA(uU~yݯ%٭ B]~浥sKN!NU-Фe^P(ƾ&84WJk?`Em(^3?-; }}E,oqB%:}yW3CLg֪`(˭+̉d%m?vܹfBj|$$fy6oP(\zV2EW^&+$$gݹ ^>F^ +6z:2} ?-JzT. [5;]F 5_U)erv#!A06|0˶?Bh)s@&L1a22yIn#ׄQAE"B{V[%VV{N&?s9;Ty&`$_I= K`Ema4]DNH<"_Vm 6GAT:a]{^TE^c¶{@wĔɱKWrL9%~촳W]^]x-ņN1'0j\:Җeofa  +?rF<^jn 8n+o)rNd&>r]7 4\^w*y " J*@Ί;`3B)Rӿcqxzwk.FL,䫘5o6_P>s"O2ee}C&J7MΗ&UnBLN=!F +9jH+ +]ѨvJdOqILe UyxV2)|1/< ~ +L$L@w?D;qE`\326]V$Ǎ)y YFnp]:dab`S Pw\vH7ޒ lZ$«(2i@:w_4.\|nkJV:τX=@+#}CU,t9'I鞝/iCzIנr$rtM$mS{oO-'JZ4m<@ҽ{Sq.ioC*!B0C` +6WyV!zK p.̵V8jJkt]+˄`Pt]P @BRawMD)KidS'Kdw lT մ5FFCK߀NGE +繬v9BqkPk@DwR8])E<~vvc6D ܉AQ&@lȥĸ2T-4ڸÿKBD"^;ɭs~d5(%>G'#OFQpC'}޺^BnyXc\H槅j΄y[!}=Ɲȵ"Z/4`bw{`:D.ĶA.3p]ęEHCazMQF# .u aUq]]:;Gd.@7P7ѭNv(kW1ڿV8Ocϭs7(oc/bSoPDe^ɘ(7F ˓U&HQK"#uZWܻqXU 9e.1 "-2AYA"< =`%R`b?wb(b. +A7::c@}1"Ĺhˁ3 +/d-T;J:z6d1[-W8'~^^H*jD CDtm 4txw*wgw6Eu/% n7QlIm!썂zb%ۏޗzE9\T ٌ ӆr{)V}YY-TRۄd<VK!;؁9Tynv[Do8,1ZJ2`ղdW5itҾ158fE$EbsP3fd^~áfg=bA =t;YIM2~ u/.{>%Ada"Rav>أLuͬ:hϖVc1!_"8'ER1 +f] ϰbVq׭RF$xR.O3 >? &NR~ڪ|DV\1kZ +F|k)Kz=+M[/ flj +UN֧/4Nj$ܙs{Zj&D簼&,bݘ{pE7>~ī0CGB+n}/]AILGir0F / K=0 R%;Ii[ TM\r/$"60?Xfyyl+b^Wjw3Iy֖Ƹt]P8wv;w `[(ݶVjd_He8:3{OᖢC r%\Ra6Tg;!3 xNAO;5IFq4`7:Ge]Eڄ--~"@5'k1樠3{ezo%\ v^loǭt=vN#X}_#_.iWLO7.aU|3(&\1i9H;y@B01ݚ>ɾk 'l=#kӜMS- wй2Ĩ$5ؾ fHdq#-s?la>]ϖe.T\IyzEHgFȕ$E4|]ʫ7t=ӣ5#7[m>O7ʺ^U4˗M\[_*ώz1{b{7!AهRm A% + }P'xb2kPl*KODGo_c!aokdcb-QԠm?uݒAԔ q9ՔD_^ jt"୉x X) +̇BK#} +csN9G6v #:.x/ph[D3kg8l%y2B Wu g``VP }{ / ;eBT^1Cz5$`nztl5*Z2J3oA*<ڒsãPW苗V1$Aȕ+X +(BϷPSo.(M8KmJִYw~EHef@-C_`UK1¹H~ )ӚW %26^7cߌ%ݠZ; RC.f),Tqb\.*'&.\ޜxj8 ã9x DZd cXw?G;ٙfډ/ Me׭7K]Lē}[讍ʎ*P?rr>{ xMrwPwY@_a\mT^6CQ c(ZF=]%E^H '|/o9[)iqފONӈY@qU[׷D0>6x#v Q%'~L`:!qyXbzh8tlZ2{ܤEZ$n?Fi˿TQN%j9k"qws6֓PaH`p%!O(dx(J%\7tLD5e&NU7P4sr0bNݠr7'bz_G~z&l'Mc, ; JtQ Kr?ً>{\qk`޽&l=P-!۽ +PZH!Jtt _h (kCy#YCFMZeFNx'4jFO=% c jdGZP W! iJXlm<<)P&+G~xs{/ +rۓ4!x!QU\Q-[2G k*POg^R#UUMwdi'^1 cE)6s4DH{0)yI^#0?OX}1DDñ.fR4,foq]hw+$$$Trs xY@J c? !-$ + S(s7Y:o/o3V@QT=0N"cs~AiNA( +j;T3Xn)6$*OyNdԢ5q=/6Ol,CJ\&"m=T79iWnw}8l3BΎz#SN[~(}O(=&553 zun.?`Yl94O;;DDٮĠmE +<=~(E\IDSq^GʾeRUG"@V߭ &|(X +C8_X7N 5<x +5nO)m@GˁEO⨖Oa_ޙ +B@>ﯥ僪b'zz;hAXNzM 9JX4l%j~PMkbJx?3G-5cȾ +[oݨ:4 fwʃ9&YI&x47%5Hg= ݕZs\ߝ!7ԓ,TXHj7a48㭚6^zbmE!\bGU!:IlBRO3y\lYW\'<[vHc l<@}C@щq®SA^3 %ubHJ6{F7MW6~^+OEa%bp|n)E~^2`HU/\&[ +Fj+-)m] }e`7V6'o1MZNF]- ot6&(k{錮+!#t<%p_ nFUOzA2apB{^՜/շ^*ni``X"@%0ӍHfZuzJGjuVRWyΏT0pf}0aƚUH]A@q}mmNz ~B%mHtf$P|]@|]EbrITLCM endstream endobj 2464 0 obj <> endobj 2465 0 obj <> endobj 2466 0 obj <> endobj 2457 0 obj <>stream +HWێ7}[lC$A<.$OŢGjy+u+V[ݜ, X,ԩS0`FfT7xCw͇xFf˛[4=gW?SH+V)9#g7On>>X3m3f}kp?p7(c0-~r #)X ]o $F]= I>#.\vzLQaqf=;rR95bz73+$%RL3cGY 1냯uK Cd}h`] 0g",mH+fp8#H>tWrZ` byu{MhY{BUHaG`QQ 4 @|{~7e0F ?$GDv׫ HQ0As#h"ۚT#o 28s[WT:w_s'ݼov_4n Ahlv' ^VأG3" +MOE%,X\px7][cIv "/5_)- CPˌi.2pӢ{s*9dx1)b.YǘZEX@BI)F2rcW#W.\qj3Hޟn& X0pw-BCLPy5 b1`BU :"1IkT%mcuҦ/ m^ ClWign\Kڤ$[ lSd.!leן"=;;MA%6$͵Ae?D օs8߳F`ODI\c욊N b.K>.ܴ:Hm[ EYS2V&{K~t03kÑUu,se源yz v)H $bQҊ4=f RJG +2?۴x6ԑ4VU놝)Km;ZJpl5t7_.0MpDnTAķ)36Vz. XFTv! +z=;Cb+Ko;)'F=e$5:hHo|zwv՘ea O?TJj33DDq; ө),y+;TҩpJH(Φ w(N2EٌBah3K&!Bm7ۦ2l;5~IDj+v-n3&ah;Y? +𗨐pDz2t?`$tn̗)j)HgIzCdcxr4¼Kq$Nl3)@sL .lL%-:%(# h D1:9m C۲̆-ͼ3Pz;y7ώv,mo#™)A zc'1(lT(U!H~o ܯY)Ʉmt [NS:eV'br)'bpKWRhbp!4ʥ&lq`8NsFF)΍3[R"/rReo`A) +hXC6/x&bV'|1@>hIZIV: 4¥bWHo,MNZ6c{~=O.<U<85+P;#T M endstream endobj 2462 0 obj <>stream +0 H@&\ H~="((]:3l>P..8T\hC0YYdCf5xnI@Bu)iA y8g>D`:DAdYw HI +Bb3˛. р^b%|d_"囹 +;0z;0aR0'C&Kf(cR&֗#2Hr!~MĎ{]¾i w kj\z_;DFb\EChHPҞ&Ҍ}+@Ë YnA>i!6O) zWŧ;p]Nlcw D?D!9Wqo/;;H]E fKcxv S0rM|K #PX=-kkwAdO3{DApAnۊڛ tC[[B= 4`h%*&A\4D"M.Y;:Z+/՛8g>7rڀAJ~5X1Մ=*K,{ ],G[jd)NpT(vp\}ডxQe} NzSRztTx55~x}OHˈ\'F.¬za '"폾B +\Ph!-NK4rsV[*lq#^jx^ϻ>Es釛ѳUfQʕa,u<+#:9J6|_TщAϱ%5tZ]OE~H|uLtNw]]Tjez|H v5|=!؏c,'=2ԟqRogv|x2:N$`(e#MJգw6x-iGo(8kJ%pCZA;M~J<"jL,9q 2dxx!WXelI>A\ گ+R'% mh\dDzW>">vS9MgI0Ó&g +58g> $pVI_##RE y\,Hڗ>_) e0vFйCtҢqDm|6_=@I {Ui+{FK/ܠ#4dVXG޴z>bE-y-Du8ȿpKRwbUhV;>+EM1}M{O*d zF571_ϲЄU|dk\+KQA +w(-N:DW2gB\6WA٦vSF_1ޫZ#V)8x6z +uMΪyK/H. -ϵ#ZqqْqguEz1BDzdo`P("klnBsSLuNk8pK  & +r +D3ODAfȗ/v"{$7hm=쵈% Yp*Bb5 \dAiKӚdo--|ԳY`yTebCD{#NE08|>~\ +2kkY>72]Dh_;81awbgHRXQgͭk( dyy,ִݩCV1VbM<ѲV*94:|3dLokJqxgjKf! +1lsQy̚LV!.斓 OQw7g.fN1m"d1tm_ ^DzoͺdI^3gdy~?9Iҗ!#}f`#'3vO3mH0y1-I&JFFVHxZQz)]8l!JiU@F 9qm:B~g!mfΞ<ڦ:!8;n& TCpIfΩg~?+/%E\NlYl!/ #ՖS! dIBђTy"_6z[3!Θ r]' NP0PZlqPJ$džJJy"2EݞF#x r +ɂG h?`XdX]>v*==N7b]W-oSQ-W&ÄB[{9Wݬ`{!^%ȑ2ezvT +$$^bT4gRMfk{Y쇕1'+$c 3̞[ SY`#I\G`FSQ N=j3|3˄mi{V!M +j+ѹQ(bzԽHp&Sh PaO4 {{r~*8elaYvkwVQdb0#ˢSEdpH>[cȖ?wuM7ȗB]hЪu!zdBFcw/ lujZ!GZWk:q-x*nRɣXMc~KoeҴ>A=[ld [ّ~Lh81ўnn87T UK(.R 6 #Ө3*$p =OK?rkFSLU2IUTmANɃҢX=qFՎV,7'^c2lGJ(f9.4ld.MdC`YvgVfay|շN:32oݨB6᱉Odʃ灔IX^Z5,].kFQ^*o畂mÍDѺϚoo;">W+C~@(RN֗䙞u7>+xj8)H܍g}hΚ%&iw*.%8/pPm!C2e g !·.z_NėLn1cq]ZGsDs +>aNS "- &oa` @֌)*n +5] u9&;fhD l<Y``I蓥'ldܥdǝ V֛hp 4CD7^cS6YypC3z6EaaQ04E\jwX|# +/tGxu)' 2ŭmq]?1q/;X27i\`rRp ~H6a`?xPNs]s9M)\!l"9mQ 8(Vu_v\9!G ^SAbrD(pH%GvLP<=x*!}D%3>Bތ1W4؄E,[1L\7S1@G, +YpHsTNz@ C>Ym8p.]f))b2|SA\J+48e?d.{0 9?a.9H φ37 UO;[!݄.ym$547Q1'L﫰WSqE|p]w ֵ,6Ь& +e?G@E*nVeC4J(ru.z9춀O9&.2F?OZj)Hr&Y]iTq$IeԎV-p_DnbFQ}ƩF.>Ot߀P>˴Pg +hKro 'W2hpzuEZ-av"qUVIr#87IKJO__:fx 42.-V jx]V,u^unZ%D] +YFyn=9e$لmh#>m`x:)Y}S.f_ݔAuH̊$:!%*T?`l`5铺8'd+p_w؅j>w.Sesq'IYyZR|b㒅KԬ5WX@΀ + +ƚl|q(~]`+cwu9BI[B$SsLQիi0`*Ў 2ȜUs&T +jVBicQ1И *+I4[`#륣  \ +*ؗO8"eXPrcIvFS. w %3S'gf[zI_'4eu2}" "J#S5zvWYwÄOES8[F8!(j, +9h'%x!u'$C @`l +9V-NWvEj׈`ƛ?%}rU%rQӧȩ8Ju(6"`d.uԅ0nKН C܅$ރDt'$fz]K?Jf7%ez;C#%Ҽm219`=;(x|媠%XdK"+ÄH>jCW ݽc })`+ +Yؘ!ٯUa 3{G-рn@WJ=.N O~תGOw]oX G`x,R@G|r[MfBwڊ.7s hÀao#7.S3s^ FI,;5q[B]yۻHr@]zmE{<ʚ?^?4h#Y҃&#=땞~] bYTF T .pPZ*K,ӯA5el];YSH{摟Q۪[pu Q mL#0΢ɣy;ݺ2 CעM>+8f7@5/ E|+"Pw6?߰ 1y =h׵yI5oGyj>qXw>&3Q ++C@)Ge&8$հ֧B#E.A+BGBc86Pi%[]"t!'@Awiw!C-)(XӶ2yJ*<„I"&E)jy1@1-럠GL8{6x@aH W,$&w$ld ؇ifئ 7xF+'V5fwYK ol@]ԤlM|`Rߑ;s>:Qbӣ.A9aՠ3@`d$ĝ/w6DX:EcDӰJc=}A-QK>҇-czKiFlƹ^+{Cعf{:6/UPU o@/ۍ B"# } G-;;/^l1BVBFf9V3[>a\$0|`W< |ڢ,ݬPK\"sQqĝ2rSuǒπ *yMbm[UKV/żn +ݒj;he`Eo G0OHX q[,Xa8+l:F!B$Uqd39V4gJtN91NQwQ BǞҹ^ Y# pA 0i)+d;ܪe%i8WgWu3K[ S; +LF[kEx|m8m(%<̔xQ +UC)rƽׇ?lMC\*jfhRBPJ qWPl^X_ͅxL/f*Zwx.X0H{j(uz#`v;o]#&NIb'.6-MUd 0^Ft˯ n, ߁ ȇ>--/CGۥщUlk;BIFԺꮇ s)%O!-Cqp q 7|M1b|e֡&?oPhnA xylR{+9FB"JwlBZت}FC؝U9o +Pb9TDtEdgeKD3 ӑu05 vp{4,qqD̾6i}Qc8\檘~+KF?ic v)rl˰Nn9 \0#ėHuߦ|#ȁh#>=dWK2کmE^f,Œ}9W M.=I"D0x,*[mJ6'cA3 +*"fw+f[lh +T³kF]A뗯 'C5rGΪuSQjh0YTi׌4-ˎ $xOLF"ݝ7%O9>Ut&5<7)4+"Kw+az8䖯KYifol?> )eq|:3r) .irO/@j+G-.IE,GĂPOF1v3v0@W*SU?0]2,LhzdT# +:V^tăM2\b3aGGj?(𢱎 t5P?J7ɵݣ%f [XA!x ? +ȊL:f iڽ; +@#Pz!y“s )cʧZ/xD +>gda fg;,:ihEo B1}x8_^sẒL+?zLϋܧ"@ N D<[qX!ΞRcL{a_p7qfYN.JV<$-RQ?c8m^ng4ؐO>aP%;$}@ +< (T/fnvmoV `RɅ #W]“| Aiz7((5 +sz?&*N83BoK*/#r x}!Qg:9B(1\ +CYHWZM|_ F!pWDŽ4|;ɋ>K1B>%NɌRGas%3}J^Y=>K㇐Jz.]/>MmRj}ycPev=N79{oL(Ɏ5A܉KA#v]m`z~7>3ӘF%/Jˢ^SQ1#62=ݕ8CH͹-eL +k#eYm"jM= qZd{mU9sC;j=I(Yz/5f֊W&Dz!+`팃?~@XƓ9|0;fy/sG/>@[Zy`j kӞ+Rf,>jQ Z_Ym(OKb*PEUi0P&*rrnlCۏ.5*L2qf$w ,Zh,)5} kҋAA 6 +# gj.%VF5?:=1Gk N٘_~ )&{򉀛W*>nk >yX5p[,]Dwb,9`kz4&#VIGɭ4l')`h=a]8\4tv/2R a'2E/#̢|ѡ|a{,[c \);)::KI'xe"@Pa:RLhS)^(=R>c``ܱ(ַU,%b?*| ["sJ0 "ס Z|KT}Cr{.Wg;>"vT # YsoWM/%3{,F̑ +oݗ+b^w؂9|?û\kYr?L`X\< ΁UR}5PRbs;|t(&`IKVKo$KBS$U^ksX!*کiTxS{^*Yj~Bs02[:,.49dU>_yz +==uIrPmFNWV>"]`7pJ9%ܻ.0>m3& tb,жݗToFrf wF֦wo ׈}'7^1YJo?Lxkf t29yd7eː[ S'lB7B2mm}. wǾoQI7OKwAm2P |hmAjCqK-ZxM)p\fDøz『_M +ɼX+']J2o1PUF35Jͮɴ'^pQmTD'rLFae"̕79#r,-@I+^uŹ_{n+,EE;*o =C1ku @:7ph{n׹$Vj!"vOkOi`߰~'G1" f5sеn(̮$鼺&-EY+(wv'dpw!}}O@0WAG6U\|Sѕ20&{DcBһE''+Ɋ:Lb!q[1`ȓ?SrpBDrT +|2kapeഔpMd-%1U +b+k2B$OMˤ`vs2B^Ud`7ܬxUbr`j[]Ž~[>5\DjaX }T3׸/.(]aEMfLer&+L5D`h%GE6/pLG쓮pc6@ӦpU (ռ+pNb 4_($d ~"HE;&Uإb)`VJ #Ϙg5ܣuZs; Ϛ!K?Vch}I+k:?)ꉀgf\m=TyfU,Ԏ_6fh:.?ʀn ߈6Ms ixSqzWo4l oySJ̐ HkFKֹ74zhȁ +qorQȄok)bO,@FW"1?ast~ WĬ8adǵѥo;ZkACVVtR>w3D'=JdD.UK90vv2 `h݈<2f_x4*e w>JI'aZ`a|o0׵c8UW]%+ݓMRfC=IIYyV#{.JAٴes^'\i˧ZŢF~"3mTmceV?պO5yE7B7r?koB{q2bȄx?<bK%d)A 0E+G*@0Fa)2Roڋ#TҍPbס8i+Jщyo(Z_=vTc%Jd9 TODb MӛHE.5[v隒*: Boq^%ZD}kO5:+aΨ1htMZ{=<˹ +ε +r BѠ0]v>m +dA #0NrSp 3dN`p5gQMQ-,2Aߩoۋe$L +N6'>J2 +úPYazc+y"<* lOZNY&%:], +O<5OZ4%*, tܼLJ*ڶ 5ȟŕ/N'ZfÓQt.and@4U0ny wh-3Z䮠" 6zc*)qsmf$ R0X9 +kcf%^[=V{W{&N"_./6ȭ/Ud0o,lu, } q*3E6=T(O [Zm^JsenM# P#$Q#wб9bdgock]qp]FXJ 2Z23נvPV[ãOa6Zsw؜H3%x9蘂,<YDɮ`idܲ'ó`VrwרRrbՕBJȁ&Cݼ'Lqoӥ$%0_'Oa-s~)<8D:SCٺlL$OlykpotI2 r_`k!͉{IL#yH/T x(kC3#-?ŝK6^^AZh3=y[Fq8 UuK7. I#} <8) TC뉙3E3' NATRԦ›;^826) >t-NC!%ֵ1ZX!1F)T^G#K(1X`;r(YYc_6 +K+=/6IVxLo$:oKT#!NK + ULd+ gO)#cOh1HO9.=͎=z<@KB{?WXW,e:f0=-S#YDy/ H.ļ^}N!"s  }_bXr zZ |J}w4\U-)/O_kΖ)GtO^@PNx&uծDKa2u{M1JP}ٽ/+8P[F_B0"Y\9ݹ;]^(zP+ Z+7:{&Wr\vm^QNNv=Q #`B `H3D 1'9Mw-U 3y*4Уòj@D5j s-a$9ϞSpunuTj۰#Ycovt+ˁytb#K*ъ F2$/F:Abw,JYqJy0wϭTiv'{kWr SR21$Uu!h(HRs(z͟AR[ߢ;،Z#XMԝ/^xd'kT}uo0zCwpY6/8GwW)eyZ5+D 7: /<T%8gz[QD5*{5-^z +YXܵhc΢v("r/'r̭Gr+I֚XX d~GmFVŚt?RŇHd3jc Yy`3zl +xoO@^"$cxlΏީP055dhTץ4yc b5^&%+,ezJeɂ +iw1i4 C$TaX~=dV-va8Gva0Tr,H'aBm㛉Xq!-&A)]Y4ڞd愧6{.٧OW@mr26<}k[N L9fo,43 na +ԛ +/؃sclmb55o_ju3hh\ge6CDIjJ^mRlbVܼ[xj2@Oe#y8I*xtE#>-Y>?]@A;7yu:a?p C@t7ʚtnHĖ 8A~. 5Ve.A[SS +"&_A!I'ۍX9oZǂ4I\TK;:>`Y.:l,;@a4}a˘GtCoOU EjD#0G *B@=||$h=Z}Z| LIXɦ`uz8W,pT8:@+cBaO;ۛSj%Go|f+rpQ%ZC7 СJI[!c$ +.+eb'nz7Y5>tÑ$B~qP@9߀(pJ$ +h)͓XJd,BCj{ytܺ]njQ. T_QQ\-×.E~ŀpyH5n✓,[_"7Ƨ7$9~3gu"6|lPM?s6əT oI3'an:߭m:gL #wk9oKq9LGԶHJx^}C7ț#FCNG\ii.#]b$I>:ԫoFF]W4uއpMv@'k%]^Qg%.ZdoiжД#J Ϸkf;yszwX$;w&\Sϰ+lt-D?c* Nn$TU}pYПn`On,۔Z{@j%`)M],5p/p.ok0p-%~n[?Rj5& -1jҵ#ܘ|5!~Σm.2hE`ѺwM[Knkľ&HZ$!4e[7 @fŨXРSNV.1B }$@y'aD!8Q㮚;_hv0YWW̳LS%AH`ZݛKN.#+Hۗ\A: x{AÑ,+jaoERt#SoeKyԯ [,sfMJIua_~uV!F~Z||:[tt5,~{-mqNh=Ӟa>Uc؈!l"d$BƑ²ttw?۫vFv^ݟek*7 ^=Yۺ}È4Nݗ)Pgw9tOBI V}"&44ڤΨ\U񎱯&acӁd?\v蔠˅.N|yI{ZsӸ )]oo;@XҾ n. +USET%'=Kv_6(PNh$; ̂-TQ? endstream endobj 2458 0 obj <> endobj 2459 0 obj <> endobj 2460 0 obj <> endobj 2461 0 obj <> endobj 2450 0 obj <>stream +HWko_ +n̝Ncp۠H$((r% +IYu}s\RQ$̝8sQYQO1 T>off_bbJ WEV5L؟&URjd5nfʧ]W_zn֛7{_<̚-kE,,  +3T :aڷ[gf)HZ׍B%A~33n)co LMly1Y7W9TBQ駡D@f鬘 cL|~nv1-}]|B vצ p齦'DO̢ɽc&PgE-/B'ۆt;X{h nP&rlBl30rwo_߾LrQ9Pbwf 6Odx?v{JjS9:^ h,uLJ6.ݷY#!jplk1Ҁ?n,nZt D+̋c7]H6l 2i .JR`xnY^GV"ઽ:Xf3vb4^$ܭ2270(ӻ}{# + GDD*pLh*^De2Moj}m Fig$d|ьYpFr9q8ySJj&8BL?`zӤzO~O\yD.uÌVWoqqlՂ50[f%{V *q(7CB~?&PaP|(br@)QffPIpg zvwRp쒌]6o +@=IG4e. cΔVg&9S]<lzsZ+eN?fG{ Qd :X"%ً^WA=XlQ⟣$; +NB!Y\X#(^·$DHT$}R^)51g(h:ސ9Dfv<KZgu3Ģ7:IYa87V-5K&O3ٗbua+[NpH]úC] Yvp\@>`O DGY%$_ j B/'t9Jy4":!ɛJc~raQ6Y5^zi..= VecR(6}j5%fMz ixp{]}|?+ endstream endobj 2456 0 obj <>stream +0 M@&` M}SG p&0'hrZ\0Ǟ2GsՄZ^8?-pfm6LHw$c'dB' mwX{WG'͍.dT" +uRfWqJ5#̯V_瞲b>9}TCVߔ7،wf(ǜr.i'.8XO ؖZDP ʏmUl,-p_"]9\3b +F]A<8NbnfIVNnk#(drŐp"Q4g5aFM4AѭKAFT 'UVG_MZeꜴHygib1/*Yc(o^ + zwUrsşjJFG=ۜPܒcu]GYqd^&pcd~X جif&Hs4nM}]gX}B/B^T|CU/n*N14k ҕ@<!{ HQ[/#X}5([NUXM#=҈R׀% ēݓ@,'O!aG bG[GhvoY8@eOH{}P~Ųu6ʧ +RQ&ՃZ0f`AE60e& r,&, +y3~' Un0<׳)vI\>|TdD6:MqW fUik鈠< +j 9T/RI\Um^^fx`7QU 2ʅii9X]`4>EY)OVZ û39ӱ03~Aa +V+p P#ŧ%w, +cIBY$ď-8PK6|K2R}HqQLOQs:{937Xk@WBiV=,d KABMZ% GWƷY}黻'I7Bޏe#c߀Ш}sCu6(c+(Y=kg?igp@Y<[ :yPF;h}]՚!=52:zJ<@%bN0?!x3ovSt&_NTEb4Biʢ NBmr5T$Iѻ-Rpe" +rC0({)2 +]~y)|c1ԣ^8pn#{ R|ӾDr ^N,aDSϩsHR|$p0tdl + k)*GSg0nwRSdV$6Kҫs:<9ȯUH? wh7j Z̤ X5x+ˑrIޚFmnX^=܎kMaUzb#$G_PYV-Dj 6U[W *`'YhcW&k5tZ:Zݶa'FO):`j4d&LiK)Z̬rT"O@L=_ Q3MGq *=c#ue7/k 弭bց @I L Ǯ+vf=˟Gl) WR%XZ[ӕt+JmSj0dFH^S0/(7Xn X.Q*-Q|#r%%qz3+$ ZO|IR + A_#J0l@NDS &ZhҺP%֌PŠ'E΅J:d8˹~]@'YON. "4d +Ӡc,ٍ9c: $(~X I Սa5KƼ_.W|e~GH#_҈, &L1qԈC OS\WsV_[ªz QH XI^1}YK_I-#7!AJ[W NNf6 O^\+c I8JS +] M0|a]H&O^}Ǟ74~S昚'Sl$:1.w7me'VK+[dL#,I:m Y/ <զqþe]b֒m研}Hъ%'LyO{Ú)A_aQ~HzU_ΧTt6䓃k,F6a'\2yL +e# ][2\۷]eu"! +E\H_=@:6`n6C}_]u=\m.(gb 7vn᯲`46Tg㛔!Rropyܸ:J!ao̧mRR̙';*&']|#ƒ5zl6wF9IܹTL=j/,@1ޡPk|kЙTPэZ[ɬhxJQ]A)|}ҷ5sU\HaȾ6ol2])[Br}"'&(dYYTGQ26 D=%I|uY6 r>or~P>UMp;t/9x <Clvs '߿ #wQm0Wsz@/ Ja٥'A|jBKf ICb%@2G^D-+ꅄA4F{ i; +E JVEiO60ȡZ =g^߶u@nw5lSLϢWѶe݌½K(U/ +uԑ'H7Bs$9< E0f#:%|-Wh c+xww R,ŌUjxh/ H6l[Փm-ľՋ<ld -Rl #:eV N{q$QMaE/nR73'~a"3 I64݃MݠO 7ҿ U:ϻ;UgN2yt^&];HepH4( ;Avw  $yy3:xzMR2s`oFZAb泮x a# 7~!DfzܝP]6@4ępq~YV[6ןs$ǑZ$a]}yPX4%}Žl0J81iJ''w,clfSE2WPߊ'(5'_KB>E3PfN-^=3P$;or&t,HH^>^V@ϛ؆XQƚ) 3wo"cb Q,6Pm1HdWٖ͆e/*nؕ%ALB<8)rJө_zU:=歪AV*1oAlhvDŽT$$|7} y0)tքϨ3*]CkHgRYr1JgXNvΙx5.XN)EMLdg`LR u#9MdݻA0s]\?ۘzW' 5ow6L\ JpY7A>)p d[U,A\\f4w:km1Ui%Vd"Q!޻T 7( _(T>tdD;#CZ/64c2Ԕ0/IkoKJE:@~XJt%b*)A[_/p=ف~ӌY\@6.M;ǬO5TGe< slx:٠'#>CXƴe͇R_ KM%] 庅9hԖ!=?+XEu{;7浆qOw\xyVs>TᙝHyvWF+Ю 8t\ 0eye޺exSW80=Z"\-3/ +nH>$Phꃛ+9ϑ-^+!)G e>\êNDKWfi)M$4ZT?.Ss °X$q˘aXj典= sHǼٱO `&c$6B7]C$P"HP_!ޭ~l^D6iX9JegO0x/-l +r뼂:+GU ;$*HuY)eEA@Y.yeJh+?=X$ `f +\xA'ݻZ㐏Ѷl Z֛^H ,%9i qI;7WAv -$ QJ-Vz[>%2crH#͌M=۬Jx,`Hta&~L-B[v.ELz}OO2 d^.B¹x9}VnkUn'5}\* QiFdK $r%iM[ œ{ٟ +F)a g ! Y+{Hڇ ?C?5UKviHkK'p3Zm.ȧ'o4j6L,>CPa\.@I[#=AeŠ%A 9\9d^4焒sը8E_*߆C=o +][xcQ^9V W)h\$r[nnM5Vox'T;ː@\ Sx: +yɴiDךag(L&lLZu="p(iKz16wTIijE+3N]JRh+7ɳy"P +A^+^HM3- 6ns*+B=0e|ncvcCȀfM#'`Cx{y?BD3_(o} e?7c|5IN(9RfApMvD ̠ TPX5X֝8y%Α{$_M?laLP6o_3nd~h[ݯ<6>bT\2L0E^n#6=2(1vq]'.K't=-N{uV4_{["Y=j0O2M%u#u ܦ/X)6YUHM>5L|,*۩ߓA|C*7d{~+DuA脌H=<ܬ_h%rLE g)^]_KnWbmΘ"YmLyJpMfLQª`wl}e'7wUh0Kk Q}H9blym!A$ahΚ", M[FY5r . Ṛve +G_~i_`=a泆ȬN!m~qk1\54< +ԗ<3^LPmh=ڈ?W[_xs^rʲ&]")i9Č?;E<)ՐaQ!Sn4&1G +V~->8 )ۻ\xs/l]m1KV0{070f(4<^ iC]NbV9w)+% +$X 5"@A&e֒?R쁬shZh\$ +[696ɖ$RuT5ܼіsU>3,x S-2HLS?gleW.])K`wh%B5ժxfecm(h!Xf>~ +{ pCy7*Ǡ[d <0ac~5+7ݙ}!@V)J/ifVƤ)["[ +wo]?t_eTnDufBvҚ>Zwĭ=vga~'J`<8Ef) mv/S/u׿Q:}witxڎXHgbk z@J@uB%/ixrm +_bK?w\DQۈ*$2pcG~ \ggGCj]ͳ|MUiw7BώPTp2o4}5ub$G#;EUntc`|1'\Z l@Gͦ[G;sxH6xJ"%SC4 e"ٿ1b Bq,qíhPвXᪧ4'%AC7']/[899V JPމ .nnSθMWxmۇ^ږraJ^/Yokbz6e>#*sGzT׾aAJ w[c1$JiC-8@+ Z΂FgV!5yI'-,8G!ľ'"# S _W{5v)v:ۜ;YsDg$S@@7Օt%4PeҸfxkK巪6w75 DIJ1~zl21R|D3;{kȣ=w,X !k0~.rϵ^ij-[c` ,|2W"[kRxuЋt}CШh߁Smc+ 2k+7tk!%\2(p qEMq^Izaڈb6$Jn`~ Ӎk)|Uq`kp?)Zpk&{fo@{+<3&! +ZoPiOKύa\0\ XnkۏŠ ThN|c!;fc)tpdc6~DmxRXHR:%e!07o [7$؈QNMqY8Vcڂ!Pj.?P%_R#I군n1Ҏ@URD=g%1ݿ}>k=п H똝i Y[S&&>   h@f1 86CC^,XIthyM}2G2J˒cEW'%h*1xP=QQg5nf w5v3tVN(n,j瑡~pXt5J"X F< O'@aZ`Ҋ;0t4:p-zB'4*!TxWr\8Tw/ꚛHc\,&#W|C oߊr 绚!tQH3Ou[٣؛'ōQY)o| ׷w$r:fbTp%Q%DpVWߙMù#Vy }(*=7wU劏5Itjjs_CõB<)lK"e=$Djn~iGj߆kMidX2ŸƤpM$WX*1(?1iuj5mroc0 qb]Ҍ +S$#ǟzKPq9|vLǪ +cg |`@"gӾؕ P&2u2to_ʖ \դjyz >sT3܎L=AVW0-_ЙwLrTбtza;(h7! Q RMy/;{(>4TCgEǰ[Wnۚ0*'icJ{׃m +)`3U.emŸNS(:﨩m' ^.tZ$/~qs! T{ГWqy) vڮZ}] &T۪Yd䏚}?ipDI4GkK rqd.+)RlRPz繎IJwSTdDyZ  V74fOi"E]$<<ܫ*W.'uҫil:O \H\ښ"`G> XA' + ##"˷W:Qo +o*:$Pã˭MB,3Eg/%Pd `)-SVJW2ήr=aY4z"鿊 \"x (Xx̸ AŲX-I^,_\Vři}BY=FQ^lcBy"_}i~٪YfȴܖHKg[[P?oݡeG7IoVHMhdU$~fdb*QҔY +Q7SiV&4~r6 +RV3*lJA@Hq6CcqE8;˧kW o''!/J_)_bXÃ\x0:N >3MÞ2y\75Ŵy۫s?pw׷*ECFqxm|T: D+&23@w׎yc)r{QBjxsKD"!/ B)|2w-`,6&s5U@F*J3sAW|,l?"S7&%14_.)2;ҢMRqԅO#4#F}3#WG-jyq7MVM?5x9sw^:2e(ۯ(Z-qtϥҿsF{v"/'e܌(SYkkL5aRd:w2F^t"CM=l diɝ)(m^/gh 7Ml}$*JG/.GF"“iSHquK+86\O%CqO'1mKUc1Jm(."QYP12=dx:r|f]1^"~R ڎfBnNK;|\@ KgsmQ<ͯwp>h @Xn7 W^2ЋsܯQuB~" I&|v5Ude{ sz>WbW;|J-,LWXP‘9$ICaŃNô|~wOQ_xWcl`mG \ Ьpt&1R8?3+`]\<]Z{GJU3L&s(]C?$S^@ʲm^Y> kܢs<*Jg9z[Hjq)$;[PG"91\]~Z bn8"ߠp6i4ԟ{x䃬ΰyЯKTz`b "jTq 6g\{Zj+3a 𴩩Fb{y+~/· +t5tݠlIhsx> Z8HP9PAjf(`II6w S0Ga5P&5GGXyXp= n+V>a!/):3G#IJ_ϕ_ '7QoocLmn:lA¶✖#)B@$BkftۻMW/iO=ȳL) OƆY/Z߱b +Wт//*!k(+l"7%ӛ#Y{WtG?X@ ,&5Kx\p!^BGj;mՈDB"sTc>an8)7dJ#A׸K2+,7[1vO2sϝo#ƙj =ضD'^_{U_w-ds v%q/eIXJp"Ca=c#`qEPx.71}I:fH9K +|o;Q$7=z,usA, gqy %°~ ";s ќѩN|Z ~~| YdD6R )ƍV*9u$ Q:[bO"O4/w[ItC b]0l퓍0ëg)oMY@žn1j6H@~U\3pj_/$")U"$&\ ;Sȩ/J8TD9tXO{;PW**U"j^7"-s +gp#MHJsÚX]{YCP<@ГNB11rCN#o$/JSlAxW+"H~M% q4y奒JkSFH9Tܴ +sr.mc&{ ""vg); 5$%|:v]s]$({q'UXyrGO*}=k]ll@wJ@9 }2z eyg˾.QV8qB":,6B{U5q˵dl&d|&3ie:*؞+ඐL1e"URAr~Fuzݰ wLin/T'3z&p?d0$6O"A=m.cECuCW*MY vC%e^sj-ڤ76G2;!dO;y6N_:0_*@nt"N8jʽuZj,[d%3)gזKsxOaˬ8;/zZT[b{a ;yL_Xf9 ZUe4E' 7b *"5帐5^a]c䴐>迍A6v[#?N7UEɟt)@(~`nR'P1BdnU!fWr{P?NjkݧOvf̘/s\8~olr;Be|&z؆ [z-|!R%!6I J ߕ hfm}-Vi{~+0F怐% '[ҙXki9-p& JhI?q@r~#"`Q׈ |VotR>ÔiI-OL9EaSX@^.cJJjyi'/A.;r3A;q$.iU%Rx2Ej'5esMviو(>!+{:,[9sdiUQc*Tӵit0!alBO# :Vn#%4sJSqS2e%0dD/=ܷ< bPosHGkʷWn*0mQ9c-xr_5ts :957ngw~H1gAұNhELς0s!y"*Ù̳q"2´񡨭{Rw113UJ40DW=%LJ+Dp9;(ç?$-ɇB}U`(&4-(4 GPu/* !@> Mi.Jcv&[|Vozzu'8Pk࢈ˑȠOZ_0 m sQ0LK<ҿJߒo:F)U {?N$P?op^F)2Aw^dʌ0k5K Isq.s+{jGk܏,5!?fu Atl=ĮلJ+XPr/h'|H=#l"n#T$چElRdG 9?8) ɥ:}8+Pwa\Etsn[( +]](ݵq !korW1 tN͊<+!*W\`0VKϜ4TcxIwշiC!< ,uҐRiK[ hԈL +W'EjX|DGN&3msT|#7-m;%5+nA\X_fr֑ϊOqV$}%I22s =c>!av81<n܋v*>3B'=ղUKQ@963TWs"7܌x|A(EC +_=!t~z"l˸4bTp|:A,(F Sjpm)=t䩏&|ö,'_ 9 YW%C >C g*R&>*!XڙZlLԷz,NEFSbOŋez9+ۃCO QK?CmH,׃t?YŢ4Ftis)v&Z3G5,췒~{j7}-( q0-?cwE R=??X|u֕10nk048:jkxdt4"m}k.s^ {>Iۖs&[PvyȞy'4C%pԕJݘ®D6٘9tTޅϬ?8𮮆rgvq 3koҙ+,55JVQ]7:L?  @1yp/[MscqZQ6~䵰ƋK5lZKKZS<|5u}F)ҶZvE?&MG~qhy;Z6mzJ͆I&1'3.~ȆEEYgKu*)%8[Vx;{KP^vyI:jr +A){w߃Q6$)Oӭ1d<#z"_ N1Ĩ(_.BYNӼ|, +᫳}kkBD2M$LP +-:hW +Zi"!m:` lAٯW~F1agi62V6Ψ^]PP7fG_%Q$kT̏0o4|nǬ.ض XpGZd1bսi5,]ЄМYv("L Orމ-!tĮ=Ytd 9E&ǂ|iz'n9ʪjX 5?i*Q1XqTs}IcW>7%e'vOU7xֈO Q? g',) `RӼuyUcrWE=EZ;ڕe<rw)sQws>Īl?pӁ T}<8xyzH#\ޝc8P>5y}/v;sj俈x>*geu!s( ޕ|SHv]MdG{v~:~7O+a;HU#|HG%$!`hOC4f#\K4Ҙ+Μs5p>꠮`e+BݕHB8uk.Gzw)-%ӣg#a_5n#1KUgإ/.a/=}K1 |pxůSupW!J@ȌLh! (io@VbR}e=)7.A)^xik1slaa*n,} aLi ^UV9{k%b YP®ިCYzko }iFe}܁ N- ݒuT*dk; )F9ĞUv6&? n?kޟCA4!0’e":drtX6g)1|skeEWͅ]4!;4 eHN~M;uvgb NebrBv2(1,iMX26w +\k +6-8Ԣ2ƦDxT>ac)}D"!Ϣt($Z[k.Y#[qSዳ;u;ĭp{5 mB+3T7I{>poT 6ԢIKk:I޷ʿJ\EHy VRft98" g FOsQ 쾬eQmJ0U ˈͱv%ў*3X-YS>FET8ws[2V߳dfON;蘪' 2CzÌx-CN?3Vx|K遐RP ,B x*Ҁx:k8{6h(ځ1l b?5+@;=H.nr}*T"SXpqsډi žy]L2!zDM?h5#?"xc8ziU@ 'UjTP3:?]n# FLTst| GͨwPSD{@ OK^{S[sr4BGh.+ab;-Nu(/Qx5@{ztkn h ?Drl2䯪\"pvq5imp6o4 37$o,ΥȆ~l9–vfBg 1C(DMEUPP3uMXcA.4Fli5m&1j`c=6r#Htrǃb%gI2rrUN( G2fꭷjQ2V@'φ} Ǫ7@~2>rn/'>[af$)c:B@7z?\qAOƺ)o/0,ÜkDnљFjuI͜])w _llY [i)Mf@ӝtZTW|A:3 X:7Vɚx=Oh e(.K$ݺo!FКOW3KRSȯo!GTUeV2dgMoXeR60PlN䥕'|¯Ǫx2.ف3O]{ t/w. 60- \e&$U'˛#KgCպ⪚Jg|tQV28]Rq|4+ ~zhM Bl?nZH`Ǭ!`]&i9Xƞ;>7P!5687bJٲ/ڵ5Pt"^)nllFs@KtEN1S9W)NԥL+XBϐvg+:}ECǀ$l937h]lm`QəOZ9O̟pnX`NUtNq5EÉkF9\ːՆFʍ!0qDb0^<෍>Ssl@`q[>aɓPF?.= C Eg[6^Wj; +~≣XV㶥Xx|(H J/FKosOF.$ڀ3oyyX[@3k@#֙0> wl$lߨV:%ID|GS *gUv)Q1N,dP/#$??pQy Qӧ. E{+w{WXaHnWZ;X!?M`'z8Nz3Y q,SIQW4tQ/M8F7L3MDVQ B1H'.= +A7xauMOė'1P*j܍B(#q"Iׄl6/:a 7Z +G,lOæW2BEO E5dAF{/:+(ZD² Eξxi_r- 12 } =CdpebaNP$Q@ciSC􂿠*CZ|(]972{[ +uAr< ]jڝzIx뽏7ۍs&x\]oolbXAA$#"7zr܊{36dVj'>Rzfo%=jjc-.\aHJ!'+Xz.1p|V0!ll%#{gψ.94Wt@h='3hX*B9+Xk?[k_\~kTW?@h!_\mCn,VN!un h9h#?wS>b;7]" '7-Z rIN QRNw X /h_IV2& x Hmȣxhǰ endstream endobj 2451 0 obj <> endobj 2452 0 obj <> endobj 2453 0 obj <> endobj 2454 0 obj <> endobj 2455 0 obj <> endobj 2445 0 obj <>stream +HWio_oa,6 b ,&9в}gRa@ꮪW^L8C 9O3F*=ܞeKgͯ.)|95\9bL)?۳yq>wղgϘ  +󿁇pC[9#%`?Wuߴ#0xڹḛIM).{}?om%E_W]٫Kjw?濎Dž Q$ՙR O/EŴd@ +jW߇N N$m墯V aiXYF8n7@c +*}o_m#t1 9uo+8U<Z\׻rm8|qӁbRԗ9IT2BCln[ +hWT cuHI arٝ*:X|~ylGJB:iErWJT1Hh 9ϫ'S0حr=La?m[U?2(kbjL.^"A ؇G$_wi1ZI?Q lRGyXOۦ.\鱋=ihcelCր.a1&\gEI'5iͼlb. 髃 LP4>U&-Iض/cErKb[)@-N`+ݴ5}x:. ,6ffɇqxU]An5|tD:UR}+M *f-3D@0# +#2s:6VWH_ gps#qb2Ae2l[e~b[׎Ȑɣ\믋^"*v^mAuor &ѵo%B`!$-mjv'a,48FA$K[`?xm--lfݿIg8Cx +>Y I[p`0 0K '/v+X`Ei5d3)1/ǖ_rnLx , nb5o# qiRILKQ",xx$NBT3fa43ob&pNI͔R8dgDfM\!P(d6SJ!U`o73t (UPcPC  +%28 +=Paq6;LSv tar4>$RZ 3W_=R,@g'Qg>a'́n]ж'Y`Gv>ׇ4YTxeK%5C~ U +KV +z"8F~l[,9ՉqAyiBe` L:PCGЀHJh$UJ).( <a1)MۆrzgH7Qe|!=(n$.ؚ8KEai%2vpvر>gGkj(x$ZHQm D/3CQGFC +x|\; p7 {l-"6,9`a1EuQOU ge%YפױR2 +5"1P<eTatf^af:T^R]0$!,߼9ʯCc,:],G6㎅u_N_ZBSa<@?N-M&S8.n/# +Er|Uo͢_<43seQdc5o@PR'Gda&p/"p5g=R Dx8͋ +LoUX!](GZaT= +1YVj0H:6LO:=ȃ6 >AN)xɖ[!Oo&OyM^"z6;_F"y/ @!rߧ{=kNe +F4V Rxȳ["Ò .'{GReeMvh8< @2DB6h0Aєfn? m@!+>XdRhW#5+  r4<x<؏BD({ 4(e.usFL&Fg?٢.W?z͕pqx6X0[$~4MjVƔ2puW8\ۛn@H]7a6bN`HAʏT0C8`3Y--juaQS~RJ+`D]vG'78ѓޚgIlX(\r?qtBww c<(?J!mp[u_'q=<8^n_T86p[ !0|Kr˔Q(zG%A1鐳 "% ܩild'56!-%#KC#zu^t1@f9Z nZdvE &Q9HE KMJt(P  w{Ō,Qw8mFЕLS2,n/X6 L~!gu j Ȗ jYP_~YX1fG&G鼮`Ė&2]kƉIs1vD9˜PҖ17V9eb">Bz8:~>IQFg'hж, +0m endstream endobj 2449 0 obj <>stream +0 D@&Y D~|{0|w \@>:S6a\:MoOûY<8LA-y԰yu v`[6~iBlGtO!&2liËnPn].^TAy Pvvz& +A]@pڇRZ2ȷ3[E]jNɵGCWwigNһrGE'φ$xqF4^b)UVR FrY~g +˅}0"Qϔ~,]ӵsQfNL/Z*[=\qӂ˸O$o,w>R6駲D#8 `}gཝeJl*DV|Q١a"nYJv]׶,YM]P +$ŸWlzoJ./x ZϠjJ@**e"'\QElYjXZW` 2_f1( ) +hU.೧ Jp8b`4(B伅5ERrs@h_dSv˘^6]*u]iP=FNfR6䵥OmL~ `kn96c.ߨ߻p/O/CzLŐ 4+2 +"\1 BҽT.AO Q V ë.0 .VKRs@,"t޳) !&{foa}%2SY%kW ϭ"/PBU=N5PD}%I {tA;"A'@5ey]e ,$aܨ%n_pve{#:pˊv bοPZ>82uGQ k~gOnD`t0LiҽZ҅~T%e45[TK o'ؕi(ƑFG*FL8刬d_~'&&]veﯴR"*zf6b4WF`~&FEtѿθ5ǩM[r)D܀=<l)I'馩,)%):5• nf.VIr&"TY;2F?zjUP0 脦 =}^' q J;>xKH,P2oHavnE:<EA\uٷ,եb=+~ MHLbν(;r9^vͶW+@m980kǽ/ʿ)zv +VKCAJ!oNH,;Ǵ`F*I0E"=ymQː鷳؃'8Կ@!";s]PXuXm~:\l*g,⡼Kpoޖmk8 3p$Do6ʨ?gж~4ę8b|)'{쯰izchC"4*Gx @S?WZjbRߥb;{ȉ#%2G@LB`\|*/ٙGw!(1N ~nЇR$8W04flq*~iE2(yw6}}37>b6|oёzpN~xf~'{3)nx/S3TՕ, ԙԡ~HebD;T,l<\fٺKjAa& ͏7tCz}"rHajo+/srM2Llu?t/4!9HD>ُiÒښ.wmcFIKiWTf~Wn[ؒ9>Q=:zWm d9sapmI!-(|x#H=ٵbtC͆#,e-;G? $Cu5EP72jW}sMR $:! n$=k[ڐy?>|thjρls/li=Ŕ-TKu0];^'xqv2N}jt!;܏f )xt}_yDpb*v^%fE b־./: - hWknќwhVLC؏8 +:>.BD:zGcgWw ,m<,ae^&3)/ +{$}:UGW!{n^*GXwHhb%pj)9L,C\g(c5-H"X.% `a|tX!ؐ!yg mhHU&}aH+/Fr7Kbܢj  ~Z.]3Ws٦e"loDF .Zs;˩/hx +i"Y(2.'n*6׈n2O(._ &[[qw"73 \V.׶P"ALi=*Y7̰'"(cnr&yjuQu8޷R +[~+V +zi曻)nr| jTǹ%恱K^ -52W DP" . )E!-á\w>6qEE($P.^֙^8MЗR(uNg{L0=YJ!ώDa?CpmKiOWyF%Q8A4`1s0IaCQ}n-wY %\MT*5,9F)yQ9Q[B BWʹ".(8ebt)*th?U{c(v?@ʐPN%ʞSlh!42mbnEHƨ,Ooߢ4@'ª3/9}E*A[i^IX;֘Aa$8면)0d8!%1 XrypyڷtQ=y䈀@>˜,7{*7ؓ)n '-xA7!PyfBSI'E,a:hv9y3O_`=#T[/Ga}LR>N[阵FWߌe'&.n74{!zq^{ҋpc=05ioޮW38J rZ|9#}w Ns$^ +_lGoN)#>}g'ڪASPr,V5֜ u644W½0̧lO?7 ܿvmq5ߝQB'>24D|.\Xx)9еǔ(őadlǶd)q4ʔ^@8PO9pȕOPJOKFE nbbM1iZ꬈|u\OHdbD,VB* !Jٽf"p \b,q=W>jφg݂35s6a\ qv4=ҼT6oa.> Q:J +d5>&R&״Ձ?nHMa驻n\%>•y.= `k|C=Q9ݙ5A,TԽ{E:?83TY Vy':?߂ +`%KQ[($~qs*".DBGzcMwnO½1iu_/G|5+HpQQYRYhD4W˜şĐݟ>]v(ga"awwxۊ 'nOZۆBS<~gE%%#sA/Ha՞_Ʉ=ϝgI}Xv +Bf[єd-ʾG5C| &,=XHVӢ; +6zM!+n ILȗxo z6e#-AgUV $X&LKo5P }_UxS+`5}?Am2/#CݓXt<ĸܱLJGĊҌI[E7G9& n[Vh2#3XG,Of`sM +&pbH>i0%t}&Y3ƻO#[uAxtl1N4a`#US)t dczTOv /AwP VJ\AyT]P^DGI}̟kHշ(>8!V +;ULh*P[2c뛇X+ r3m]'7q&N^O ~bS } HZÀϊl\e0 bmwś"t>4*Nij=*qHPjz `i(N4"1Pb)> bm7xfnOr؊UD BbM+xSg AC q;EGۤS,YZ, Ou=uYv^(m+VX곕z3; 5c,nR^6z˅K(J D+Ygo=QFA*etۀ7YuΓC2kԐH0 ic,59ݹʹyu^"\{KG/tmxYZr *x-,r04.4;^&Wj[h ŝD\RRxGl] A4(׆ۙ|d` WxS bw2fZ-wPo@FLCozĠh N GS)nj3@N3?,\3TTՌ?EʵF, іa^:Ciqt\2XWOya)+W_yR~Oy`a!L@fI斐C͐UDm-qf]e G=rF=_30"%Ʃ/snܹR-TӤ=I mL$4D?˄w"#eb&3> RP9YI3 x5رPwyWXCt+{&fNI)S!ЭVD ,@kN@g ¤G( }]H4 {Ks|;rhv4RM4uh!ui3aGؾpH_Av4DJnX]!%"M_|&uML3^4Gq1I+uN` \;(ڡj:n[&y:~n%U'lnZۧڷȼHjUfT_s?T,RR Q1xotٍ6p̌NM7ZW<ފCt{9Is3%7qa ҌzG w7ZFyA!lL=*]S$%Il2(i@IK4־ɦP=LQD L]'e9M-k8K5os,)5|s.)92Yp4eD@>jǾ"T?7t>l|g_6>uz<]Zt,!81%Ӂ m5}=^uzN:ebVWi)g@H<ڈK-ސK~XxȑS] N'YdǠ/=w?[F[:0),a498kC- \e2(( iq /k0!j2XӾ6>Wr{DeI/uK3B~D#ZF3 XwԲ8l5"%qGËo|@:# sis+p6oI/x'ѡwmlnPXM֢vfDq} ͈"&rb!E~_%8j@(3|:CrBIe ]rη,8.QEUD]隠9pqnƞJyenX=_..M heZdfWi! Lbɦ +g$y뇞:v7~mC@iŁJMq|s54C +/`'Δ7QHoWo6O +&B[\sdMh#}BG$wݡ-{EF!glfAw˽ \VƟ5db/l̥8̆;oL~1enݞ*b"\ ypoGPT_FA [ph5gRb%ڻ&`3~ *cs݅r1QPt wXCmτ2aߚ:PL,SB&$]O!\PaZ)(9XbܔHܛW(NpvYB57n`a8_S!=k|䑿[XiUum;1<p͈WT +kx'2⤸U?cG8$ ag=ҧ #4|>ն~OU6靤 lT@ZXlA`b ~!I[ ct&Zⵃ;!IX%-&D%-v\dȉ:2E MQw_C:ߒVAk& @rXhAZe``v}P 0 %rxV:XgwUy8áp5}Sf)+9`51̙D( +5&IpHT!{>l}.0{Xdޞ–uJdj7K25ת-DE33dkL[!2o<4WCN\Vmwl8Q8/6K1~C-@9.X|;>[1mI5EFJ d7i * 05ES!`'0iM1Ж]YSQngfVKmdb,>R5W/\1X~:ɘ'>Nyq +Bc؀W7R0_H]Z'K9Q?$Q ꆷ4pgs%' =LƋzyw^xw)l ' +E~8D.79MWAO7TSVj6bD2-5M/!4g(- l4oۧHlŝ9s%:5<1< |U?:s_'[Mz9G \h?DHƏl hӊ,2-_"VXc@z-&APQۻO&#чq$Ъ~%By_&4*-KS>CCPc|D<ΗЗ ᢮Kr!9""O%<i^?mircD{Nd$Lu*ic wE.7'SE2ɒ{$!\I:9R]xeJQ5j!v3B=Oӝ<~aT =?`ytx}'rn3N?蘣 +.[85lKK&n /73CR3̲Ei{z"4OAKqѝ§A B0Ks <X +A GRDA'Ѯ~]5MJz3mC:2dRY1rFA(ppvڡ^ęNtn\ox=/uӺ-'ĭSzHldX=KD{W`ȄP=@BA"2Eo_lBAXD~,4~iPGvCdq:L jv5Es]KwƋPoiW(Ptŝ$8ݏ4`$;Ge ]Kז6dq=Bvy 4Z[Rv17eXL&R|aC"-`6N7?3֢ܞa^ BeRYgB&~JJ/wT'o{3_i߁lVfyRZ}S,l-k&&nnV9ߞ696Dͼ {|O931uTfOh IU.SqvwsϭەC}lQC,1I@P-˽špҬ#";d1Pef+h&<Ϙ/T0®a!RT`+ly~մyl ]#~ϼ7ٽfg5ҝd(XQY91&}`GV)G}~!=mɟ6̘@&wX@]ngC2py9EcY.b~%VJ(I(aY5l+rac6jxE?A>"TRMփX.=ΆXqw(;k2;Di .b9[dGl oj@8 +}M~Z*" +Fgg:{ +7""{~KC P-@ 4[jYbrqWMb$0s/d"_`b>g.|P?u&=Q@Xu꓁0y"E\&F0 0 e&K'ֻ*#v>`Q$ v|ZFkS$D9:PharFztP'-FdSi`3ji .mc6>2n@\š$1p2gQt{򭿕Ӈ e iVUL@̑F +@XoMI4fAG+_Hv:.hV,2P[;sR[T'k"!KeܻubWBd.'7O`Q&^__X?g3={_ %6LdT<9;Ic<=q6q+9563j4bE#dv+$%⦖8 V;<:h0^ +V{w+蹮,֓YJaLTql*(w .dWy$u-OiuC0#:*ʐdF,"0@O&t[b8 [JnfXvvuA5.Ħ1-Cx$fDs"%t˭]YdȮ껷7\Dm(s1'q*w0$!/{h& ++(DR46|o\d832aUڌn㢅YrahJR _aWQhIL&~u +aK차zJUlq.G '/H(_B顗3Q}m_vv,{6ī(jՇ,uQr_F$uW<5qwCnH].Jvի Xj? +uZ/w/I`n fFe5$ShqR @ѐ|6.+p>a/KW>F9X[L C05@H,G +W)K-a:W +ݗ>cR063fJk 71C^*,UoaQ(b{G]hU>./QI5{IXQg# +1i\ .J#= kWoV&os:D2̫C1{}yV ^iO@Zύ4WzC5br[q[˭|f`]UK.I +Zvd at83Ƚ#u(eF8 e TY[x22'S:97O 43*Gz36 E.b6@*.->}jw: z&:y"%ٽGPI̘oh uJ%'yќ I=$g<6`=~G sIpd85 +_uIxiZ+=Gc-LZƍa;hyC+ o7tIܻexUt g?no=wOU. Eۙ\ o b2T=&6.GD4Ojķ>GOqN7:v(8lE.ha .z+&y9y-\J}W\Ln,)!̓* Ha cfPdd3}:"A/io0M/R o;O!9#Hʏ=TߟI|IF{ZZLt=3"뷬u1b3hKvw@c Zh ߒD@ZŤ[$ɮsPOʿw6'#GjF"CٗmîCӡ+P!LYdkYZ-fɾԖy/.;@Ana(6\K0u/T5{g.4Fv1”S3ۉc +8"3>1:<͵f!74M#52 &`[Z2αjhT0m>Y T:'蝈dY +}aMJT#&Ɇs7g|We8w09!䰕"aeyW$MӺ72L ꦃy&V~<AX2va4Wjs޳ibA*-({mDO .d^Ch- +`XLs6Y bLv솔",:C:J+8CqW#4Q?b6M.`mm9a}c ۛIJ`Оt6Wk6Amo6s/ޠ?ƅz|WGbWϬ|lupgqBO8vvPL!2ۃ p=%կk_(8^?(xË3B]oEg/T,hJ{p{Eel[ +&֟XY"k}tI=!Fyoncͤ$VŹCW? wa 8M[ifs9Y$HIAE)~,ԨR?l y'b!m*[fFiUmvEX9vA0'|WJùF`+,.dV帞η<ο2 s6A&[-Rgdm(͢kT+RQG+sj>RFR`4RPKvL;Yl֖cE);B}IΪ3A췛Re+pAY|:?~,B, K0P%q8?MOˆ-R# _rgLzn$g=:obԂ7Qw Ƒpaa%]OH^&l4| zC -`F݌t^i(40rE宜qt HZ=(ڢ >qWxKK|h*[dC7G;\[5JdY`L<ʚ9`jk_((8<[L q3N-׋_#ٹg ^L-TnB—$+Z~F=ٽqD(G +cjVD_ h7HsXVsmbVRX 9b\0`rQA)b#xA_T<V׃z8rB05G^XcPP4$:08dc' +i:/ y^MTYxĔs;պXp$ y _)+d&cNKC?R(҇pGXQ rjm{9@[{*yN$⻻mjy]eߝf H]dȲ5GݚYbRƃ2PIm!qX@9" O@i+Exo7AiFV)>L3v*;kv.D(&n3;4ybqn}eMÅJBn˕uY{y8Ge+YS4p "jehl'r$FrFk +f%%[=y]dUېF܍-XSYa+!.]A4Q +6D+2LJq⣧aH:BZFRP\x5Gֲg]$jp'm|񬳁Ʋ+ܩ(8 \9Na;A!>dc8:'+!4KeskYӃk2>2qg!;&qx@ʼ@WPwwvOqKVW_`?;Bg +fW`m2)'werx!O#y}T)0iH~rH!㒻cQұΑȷBgM ^e)2:g7_anh(W!p+ڌ?,dlUl2Ef +Êj35I`VQds5i?Z& ky@urQ<~zΕn9Lϕt $?We/˚tAg\1^+&Sa5nAZH +R"^]ISʲ(OݜCl$ۗR.m)`dƇN?ze"j5s8b )TqI T&$.ܸ!o)V;D}|lVCw dm=v+9Y<`t!?mcfW8?m@$[Et4rǰ`0#E#U-5e-cQu]"STz]9G @Nr.6ŘOc #_ w@>F*+l^چT2Ań9H a?Ϸ x6ON$B)ZaKC?ÚˁپN6LX?"fP ]ǒW:r܏m*|3 PKUxIE2j VX$7{5PI@|wC'뚉Hԑԑzdx`)YRKD7e47O$Wů$V'{M|l|Ib qSt3ivK ȇ^3un/uۀ3dVδguqqh"r{_2J+ 0l=˄U]y)pc6'D lJY 'oy& wAPvm/SY}u'}3L ٠U !iť19pwÇ 7AyNuS*V] +ew(YyryQXeepͺ+5$Vs%yI` +` (Wf9%w +5}zK"L0a'NP# jz)ڪs.5QKǦ|{A u,J2H7-5C fzpV*KG6nِo~h}Z$[QlC'A =v|_kw28I6f*PȆ>aVZ4/Oq8;ieEb4CJ 6`o?G .1,)=WJGCZQI=5XrYT,V?` Kjoyi[tWR)sHAauH07B dh>ףk%(ųvX~>\ Es(ɬ Z`4 ɸoZ 2=4 y`:|UsS6Qy{A_ـ:P$08!4'[gEsNf+OS]bb?ҢQF2fON-$d@ xrزZ񙤱4 ֗MLM~^ $yH=Rnf$[tH;u}kG %=TG玉./E^c ],E$>$htnNRvשoXشוb:X˃o@oANFi/_G./_0 = Hݨ\JFkf"N+cǗ 䴭c=GۓzZ4ycCBqȓZE Y,HD=<ŮH eSvvަu_r#iL-o=nIld{y7-7So ,޺6L䚪-b{q:FxEx@rAb`?-Y S۶y۞Wdתq_Ut2GY8RKB2 +-@Hn.+Λޡ('%Aa=fmlbhaJb2AgI2oOCuYuVPqSDH΄w, Y$a*$fٗ8rIƪԳj.s`-19yv[ޯr);~ɡ,"!h0-Y̒')t- ];jMPև" :h|76gii ~Jwm? endstream endobj 2446 0 obj <> endobj 2447 0 obj <> endobj 2448 0 obj <> endobj 2439 0 obj <>stream +HWio_6 >6Yd l։ H#qb GS}W ۔]]ǫW{­m#?hbs~Nzv~jN?ͯNHCl|F :/|^snM|tia{޼y ۄJgr>LG.ԾJL$nO ۴ȣF ؙ!3t#vwƝ(%nÕ?sFxɋBNW9^KUeWvhx-f.Audq,~7RVT4İx"恄 ےmU.SeL̲;MG8iѳ3P#lʡk0 $4RTnX9(|~&ntaIEIT{ CL}M+fLZdveى,;.[;?yVǪ&m.5`c!*\ RŎG2IE,'5)Keg<+8<0 ;Ց:cuL[i @,J1NU#&q80XBB,1ԍ~ۮOS`{kp0g>SCRfB*TW=g@`F1"(jf؜PL h#d1z8wGiY9@U6,tcerDزFe@D芈dja\"&Ei7〙ZF 0Ѣ!Wkv,ؠSUze׍)rV}M)[t.ƤvWH44Ç=x^H7$gjVK MΛ'_WQ?SPU87Z;u$#(ےwx즶_Gu b9G!U+xA 2XdM퉵JъH,$ub9+ԾdAÑ>r'fB&y&`l_y& +̈-!V%FU%R_oQ.7Y X9ֱGS2%@៦`sa+– u7/HpA$7>LѸyR5!\sJߒYic]@'vcwDr] +hS/EP 1vލ!`"3a_׏^X +"m@[fTi=4 LKKkT(+)LG&^?ȒbڤƄs?-%1NT}D&l'9mD,O]"*m7V IC{;tf:Bg.h/C[ Cy^hJ-O6jlH Vú>>IYx.j V!hָ}B;q[6F/_7ngԩ~*Q-VTuyb]i68R{IW>q~&^;eHDQ>_K}e$NY&tv?ǒVgMH`OOyOD`t:$OK)>%qNxYz7fJE -! +ф(fTg_[9&- R LvFƇ&{/Qp6Ag_b7뼥R΂ẛP Ap.F qgE{Oh3qΝ p/d@LrI >G>Rqk ~٨SVpKb53t*6in]$؃M m +jd5-P;ka*7OK,6`2 ?6u ?f6@lg,qHj3ei3}h,.dRN ! +KNÖ һ/.q}v'`tH?>0j'[ 㔔+"ًؚ /=Ƅ̽eW.YDNֶ)qX NG[Ĵ~rj6ȩrZݞjWWO)9GxVUbhc4NBEm&-ͦQk{46d~{ +jAN6v*̨}3uԨ&8m +GI'F! wWȌd}"lJ3fO]]U=Iu7Z^̮]h8WD(뤐jήmQ;'%e?~#oyAtLt@Bwc׼GqәB^Ӽ^72NfLDI,rRv~oJȘws|4|3Ab"Ƀg-,s=hwb@m ?~B4>"Z"Dqh/Y8 $jP[@b@6q`{O3o˒S'~.{'"ݛ g% KdGpf5d6FK +j"A%$ҎWdBj4(S5xŃD}=qrFq@³dF]R$tE\7 w?O)ڤKe/ endstream endobj 2444 0 obj <>stream +0 M@&g M}(ĕ.(%բ6pQS+1/f~x O2oldt*#[zt&akdW8`oR\;?'TGZci *#&*ꬔjtqx|*J`V牍Jx 2 #p?m{=IcUtÌ;'-ZE-?)Ԛ/ >+G0(k7p~eVwL) > (Zar@эԍZfGˌg!v<-rGaX N3bdo I\0jڵ-?IQT%a&a=N?ҹ5AUocQ$E#oU苎L$wght]#V۽w%&Kp6q,5$̩#2H54Ö́txIZsajѼBs $}'EN|v?VH2ħi "gvg +t)EjZѦJФ N"%&$ Nt=<%6CSu#qMwFX7yz#D^Hոh_EV L)p@nh߲C=zZ4s#͈[,ǐ59DTxYJcH1М F\ZIʍ?crB03T@.Foe-n@#G$0G*3rֲ9փkZIlHՃ \\vF$ X{9 6;5ݼߝ&8[{vpYwt1 Hߑ_ ov_-=D)ku$?0P֊WCkt/pggxl;u>Y *4~!-ґ2ŕgV5-Q", lYaXe*_LEBKE|Oԓ:A]+>eh)n gn5%ɿs24 K\ӕ )C"TH7s+~#!sB*G;foo14fo'YAӃxȯ2yuک2A 7$z8^lRnڃвo/DO,ViP$DgVc.:&`BIfe6N50N x#dz>؆(&bj|eE⒗+t +>Uw KK)^\0z,43F>U#sk8Y\`-+ц޷#Fp2zqV9T܈k@scؠ. g {OJ>t'd= + *NI[7| Ae9][Z-wt 0ߨVwqZ4In"ϔ5sI}F2"fz +o?Ϯ e5YSv}fKYOnF$|v +>c;VDUzO+5}VځTkj]'aS̋(7ȵv=AD{XQƢ>aM&+3gW*{S&`Ml̰ ++Lzd7(R SS\TB$~Y#c"5xΕ-<\?z9wr2mNI˘O9J湤]6-Іc%9'X.:ԗ9\o >>(sA:2 8%2ybԣ (:ii\S 7?8=F:d?%wvKϓAIT_-WKpW˒#rr<޹h؋'#\8STk*Ai HDc/!L7snkBB= x_"ɒ۴3C1a;YesT.Z #{C? +CÄ\:d7)eeD`Cӎ#> +QU9)q?O$+-@b쯔d)´mu5Dl?px]n'Ѝw;cg +J)`ùG lK»Wh;G.n V>]tqP_ͩ-Yސܴm=A^%>-7=h"FJX;BE %m~ǫ0L{ +%hXk<;IMq5s$ٹ[MO]V|3vNzb(C"Br9qX>9acTjĬP6PUc|`gBa\aJ@%EkwήT. % dL6E}I1.c#nj]ޏ[L[rΒ2ZW %=b8RcM9@W@Ko\#M2JK׊O@y=f$* +r +I@N5_l':ƤIrb9嚑Q }_\ǫgVIZ?| (%4mc54?t严l.rǔ M{ +Iq2F: + %h]~8%gwxqASkI8N ۬ MiSH.@%3t*̽~"r-M=/̾ao{aY&uͽ-LWK[eM068MAFTu'BCv~691e\ttUFO_5(: z&= &7!Wte@=ഴDM|¿% 3#=#]{BqW@I'8OEX:|kAvZVE|"o2uN:g)6QTu.g0RN!63% +2A⋮# =Ea9޸&ʍ|]L9U^[Fa.W RPe#}@%G Q%6d35CJ#Z͊E ~`' /*%KƀMz8tRPZ|s+aY$cG޼*tC)D%C3.$:0t* C Y'G?E ~8FF[o`윗֘LZ x eMz+- ,ᵼNXnwVDBGśI\1T~6ի,? FSt*juؗl@W`mA4T½-  +Mt9YGPFMHZ \3H*k]7WPǖƊ8,ժbE)Ue A rQHR \𛔎aL(|1UN*Oǔk rc~$274R-LEׯ°529NYލ5 ךƽz^C$!1WDW*dfTfB +*ey)fsDDP-LoxQ]K?ttwPcj%A|Bz ̖=20̞\}F!Q +Z/Ə0%?J|poqZ&` y]M#Hu7Nj>kN6A }Z?{U$m9/ק^͚[%2FNF<01}sUZ><aJnje!7 +S@gXK$_Pr`ÇJ43cz 01ITKV) ?\ G J-9]0ܡЪ;z$ta +bQmk[br:Εj4b0Ӗ1:L `|Ɍ09hwZ s#ތ3 3`k8B`^VpxR# vV,Nq1J1+YsIxo=aYѠI*/yK1r5@5n ULӥ&8R B-owlJ:l$_2h ;bҐnp +c2ѯW7}.`{CMЂH[rO[p^}:qm燬Lͨ[d3J#9rJ,c1)sg䜟T 1:K}V9'Gj>*$\zڭvlLu' \^]b "]`ˊmSޡ΀~N%:a`zKo|)j0QKߊ S-eߛX S=ݫ5d1_=gPt>to5V/kk8P2J-|u۷UDFF{^IcPnP+[{GDB^RUh8QpxjS)ޖt9;>V%T}#jؓPH?:\"+[&ͧ<}P;w'v t1tfdv+5m d]\E`)MTflH#ɞӓ_`LtCFOJ̗s"ܦ6p 0 ȏVDߍZo0Bk^[ۢp#^0ԅs'vL6|1X +l- =}oGHy"Qv{Y*n!CK ەWNbTM0PIIuLfԱ }Z6nUIi}h[0y1&:INk>p /]ZYԇXn=,m^F 7n95l] CvOJ v>3 )8w0&t@ic BP߁v%ъWVI%r'}j`#uUGƑBv"*[l=Y;(+,AuchF1c<ݪ ݺ+a{`QS\ID~P~cYeCX+[G#D.!p#X|ϝw5{*wv(O('ʀ|ƇϯZK$n|Qd|>:'tģ40Ȟ dA#Xn#Ci=/O{%xU{gJ T00ȐGAup(SU_}I%X/ +.>h*u086uw~NRd߈aw@İrǨMYS$c3&f i\L{84ƈ Tss+魧%@0OT#Vx eK/k52GEfβ䵐Aʯ {l2>Y&DN-`%K*JGΠJg)(zaI));,ƕ RW&UrnxoJXh0%)K~iopnTEc= ŀ1,;6|-ܪP,6rCêU'74śg,ꍤ&'m +ܺ!e~A,[gQעE8'z<үL;=1`+ a56 /PN 1{ +𾄥m8\T +2i#oV^d78'A4imtlM H3jD[y_ >ٱ3W۱ǽ<Ć^}&Nj00BlzÆIo2ioc06'suM8[/D(I䑥b 0Ӧ)DjtכסRM4d zyuvۨ+YV-/+eHz_v .g/ҩ +3~z.N%d^~#_bnł4BG\-iri\JVev +-*̭yե%hg@`[=#sQ]^ڸu(skhm Ô.XkoҼvD ~p#4dҹ/9j\%BߟN^֝Dtn/=s|ia%| ^Z. E%^]B:ۭ bѱK@_ +Qf6iqV +%o?b@-w>#-Zqрn)YwB#>P@(8qv ~v}W[l`:RUT#`AXA /z~[QȇYkpdte˜9bDзVuJ +`yp.Vpa` +"k'g@^A#SY_TҪ9j[jt8us0,|Ay֔OFڐ iܳBiEVG~$`?J8$MwX>hd/")ʹ'O! ";Wy纔6*{7yt +uayDT8\<4*#O6-m{-Bv?ߎ̢B}ec*_e@DB߯M9걋_O#"k~tʃje]/,Eǹgcwb̳>֧uƀ4܉aTK֕e9S'YJ+!ú;=4'\QT} d'O/DZE\&Mox^hveto{G_;u +~C/0Eqht}iwٔt]qtݕkw )U@q!Һq(ScBH)yha9N;CNGl\O4 ~h׹/&z:$p O_ȅF݂xEKQ/I4E1C<9mJi["uA- =їZ%E䶐JZxufm<9 F THZLM1޽nG(l0Rϵ6"䴒9f* +&*k&8(U 6}ڑ`:_*X9Cs7TME vӎvjN,51'wv=MD0)ssG ՊPŔޕVZg0'L28-eۺ_])dxatH8.ޫh"@loPx .< ò2W>ǻg`y c@p^[+଑ w?~>˫#̧Mɺ闔ꞑx1[&51WO<7I3\,KSz lV]T>K?U!ۛw%;+W3ON8 !I?2ʝ>FLh +3/ǻp'&% 钪JT_>HAyS+ YL1!uOe*o*d +8}FP+}'`zW3( +f:Īד]euwu&mB~Xc'^>Ijw sNp*b"6rdw|)~冥Ю& mWnN Yw}J+QiGzJVeE=sYDz~ӾzѷzK#]D\ji3/rK{ '1vX`ݡ.$syނ C&.rxy~v]3eQoz_vbӯi h::7P?ZDc?{|5@_tJSS#\K0b⟗[Q${hZI& 5n1W=0qzgb!v:dӈ +jhX3鶗>t!sS%X@-)$.+zŀȫpTNuH{#2뇦l-/ >A8l$zALB{"zxas,!+$X <Ii^٬5OXN<‘lޗWџ1 ډlGMx$ܗ?ۡt/2T TS&z,1+rg%Dh돞ʄ愹`pւ YUұorbM?#1"y׃8~͑c=ᔘ]\M!l +Iweg5b&ukڢyAE_I'B `YH0;U:1uD;&C"Fw[wjBFx4lv7Udpg +9SƎ8'\$L.=E~Ż;'M奃.NozF2M{ECR{$YkC" D)-ŕA5xX?-FklU&_0# /Bc?V^r|{>^T~S3x23ҟE&Yuc7H.rFRTpwaF -do?n2 m%v"4IMlھl o'FI|ӳZ_; V;RFn@ai:i1C9_A| N [Z_BC +>7g !/'5g(YEddN,iMYl?034ۍI7>"cNQ,|)u`o~?zGEyCZ"z7^Wt0!DOVm8Cw_AźXGLrA#f^viщȺ]y0{d<F-$*p#qo+ў{ AV82ukJwwۯUOqWITbPdsn(a)M |YX>v9d+_ܨ)|{:#ΐ*O% mk1W @WH 6I䫀YdڲOQ~3zCQn!3UaBJQ>qEVyނV﮿bmMO&B)`y2厯LU +$;׹&ho-wIr`wfKI'f;rfCx3)F ~შ\GDit%J&6llZ Dװz;*ᆸՔ|^dRLt ĦRb>/H? F ڄ閠l)A75II45e)j@x5vp*cCv-D,[n??M%2{BNRMF,|wJ.;fT Im Ņ +3{-J{O`يbFA; yFL.ZY4)Wc؆^{þ |,IHBW !z _0_!ZS{4;@9o4c ^% +e)M:gW¿zr2i? س)MRMyef,E M tW*i. +Ho36#T@jٍ# K]x}1*g)LLe_;4U'&oz)@ٯvϺ}JLwuH3Ju#ݢG1uhf,,Ւ@sbdhtX".W*.YTup\unwgl-0nQ%K +dZWBeKw\j޿1OVP ۞c6!﯀X Tvf1nZx^쾻`UƂ _bAt`s}-ru"\|pm'@)'Ñ}Kʮ uRO빜)Z!phf:*~͜>Hq%ɓHWqsΒ"婐hJ:'˲OQ"Lp q|G3hu?]h|Ѓg +U1{UġH[ :J)jB3>OF^;m+=STciz~u;=PmO_-뮶}~2u eQ;]d.0M6g;mvb.*Z̏&DV?65,dZzaXQ]s* C Nn^jE > B,5rU)s l_gzNČ= OJ*JĿkPJZ` ,G1WϘT3k>" t|uI9#&8* C3/n?VJ 4RBW܂ k+l$6L}k[5 ++S.S?'$#1>rm%{O"s<\agvg0֎# +v#_5!=vվjz +2j~_Z])O" m7?(AN&ǎ؁A),<[>j21'D'\L{}5 3~Gy7QS4ÂO۩jQN*1QE3qhfZԤoP ~(x84SMoLL!^#~e9f3\lB},OP aer7]2XpkאA`T[{F'7^4DAH.Gyc;#ˋޙxT[ṥZ'qkt{m>YrǞkp'\ <`"_AIB]nѪ@44#`spQ4|*cЌMW0>\Jy<⭧BX1!=BhIپx豾%f5@MܕpkܐǾ/U jb))dnzD'Gƅ5\oGZ7!9^$]ǚIQx:`PtxnhC7uZzwmFHK}>AB%_f۾jRIu1=&Z/E!|> GBQt$F z *{0Ft}+ڗ蝙,PNz6Μ xZ^]m+=5S"EO\ļVT@pLmi6Q> |wMkzCe*(P*PzF0sAzef6#)k,Xe:gXۓ~ܾl沮Plv=i&XA*\;udf@ ck2 WYɍ +i-ԤԤ\7ljv-d;2| l_>,m/q5,6 \Mj+0߼zk7)s#; +id hfU96B~`k]CX1whX{\+xg+ +O>K wpZwKL3һչYY\^׭J6vk !m&dzϔBܞ9SrYt4՛ŎKֺ;pZ5UjzKF +IŽ3tCU&3 h' 0~[9"]mӹfC>M\G3Ќ2\F$k2ZQ8wñ28 V11!3/0vyN /9 L +30yi3&Z%6Ynr/]E 䚚FiM߂.C]Q4l<O:'Cв|f/\_,mgqf) +ֆg S6ggiw :YDlmo"wk F$֨@ +u2U +< +;?賢!xNF A2B^n7F1@(/9AjΫ4AΏQ@sٳ"/[<v~a{>|Ar[)U!H&lg3pw{>̇5?+Wԭl\(tnA(٪}D~ ~]׌j^&jt\>b8%>tMt9a]ӈdr@m~rɎ=sܯrQ(2F6ypw [mj-~l%ԃs]Z(tK6)k1b+99 P51Hs7k7 l +Imn _w@Nj20O7ջhƤ%M36@lr›\ pUbqnD ^ehh|Gw2N_]X[W#ٜ܍{PfέA- +*h[Lf(q@a5pɧ[^'loM˗:9D33u`1H^oZ7>A0?ZF\D\hr#}VvjVv#J},iy]ےN1zv1#^p<菚3`AF71# NfPv󢅀2WX+f1,?t&|[S y }q_uaX DdojS +[}KYYا!G<[gD[3?)%QɁoVz*+Ў2X锑E%-X3uf?:*ZfՏ:F/ ore|c@kӥ=X;)n u2^&OFQom@-Bs. }05 + pHp@gy5Si2 HY@\F (M/_qxqZCл|\1qtS솊MI>qCg)10gL]Hd+!"{r JchAkה8t>[+#~d͇! oa l^<uUC!9Q:89$-%3 =dͤ]͛?">/ 6{#b5>Ա2l)c\΃ ^ ʃgApnspp+P_)VʓL/*IK7SBQ9ld洐:biBtlO=yΓQU3dM#٩S5|}A\qӊ2A-7r@yD#U7-5GS^#tҔȇ?Q39w> YIYۣlh%ebQ5 vJBںLL1 i}za$1Y ȀYO^ =Fъ6O$|%@U`.DoT0eph}SqD^t(ӫ6@Z9 +Z 2g0'ܹ3eW>I1t\#8’@Wؕ`YҶY˵JCc>O]=S1},cdW G4^ja3ɶY5we6ќN62 +u4!-ehDDv=.YqAOTvdC}B)93vg"-=V Dn7s?iuAj#=d#Ŀ6 >۾q <>ØnC)KEUHXmJ !8q3u7G a"?7O jɼ-'z"NNJ +(-H=/eiʺCNn(ckoIm0ĘjG%l$7$Z{knȵ?BkT2 Sd!{,_zw=|F^s亀I3\)(WWέdׂ5Y7<8kpQC;A8G'!֮:4}GIkܥb/c-OYRڱOr +7mR*FxĀaGa{bA?)]Exm_, T3E_x;쳖 /GܥsÖQ>^C4,eź[#ai% Ț] УO}Fe͍31ԠTg7)ul!# AA)@'`m±\9oR*(FQvV8a[UD׊`N+Tcw{qGL.k nX†p,mWe$[>MIr F/k׊\eoc6E`o{{p2zY5Fxt$Lh]fR:js{XR7TCI7IҤPaN*\ +{n^FGQYY+L–v=!+\_sc)N)WJ3%: b% TE})SSRz u:1yqLҍTAʛ%֍pMP i XXrlglH '+ ʅ{lKjǞ7[BnzjuۛjKށWK Gywhgb׼9 L koI`6S_!6HIF +4u=xx]:#~"5 a`ly Tۜed29jȝ~C\@ 9|s^>_ $0& C?طَRãˇ3 +MI7-aB{MQjw\Z*M3CeFA7 +Oy YDQ6wš/RzDqEhIG̴4 E0ưQbps`ܑ 0BPE,I#r~yTGT!l:(4V; 0cLOɇb){Y'jw,Vj-U "١ٓ*r:Ur0O:YΧ7Rev@ٻpQ>O0^d x%z]g67)t&4j򹮬:if%25NXK;78P@w "0{AME,3Iݚ)1׎-mRN: CãuS^ Da&^_6z_{Z`!1yR]>j5thWJx"PvX1.Y\-a|E;Ը@13s41k[C88Re%Jr݃7mIuE._Mm %UcLW۳Ѝ< sXBӂ'Jw{ +XoRCJGvB,&v1eN={Eoο' [6N^>=?YX+LLv2TPOr['^@ Ek^ !l[L,|BDЁ[λ⌳pnL IM%Oֽt2'J*]lwH@,4A,EJVP rOf<ıϽ R233F.3,+iwCJ9.~гxhgK=KeOFd$0 ?MUߔM6?ݲ+~R$s簗Xf8wWoSvևYU=[SkU2ȸ*^jGaS$17+6NdD.{r\H#`hg o -1z*:c;ti]Аhs֐#DCX:4DI.+rT0kjg&a. uL)\'UBU aIҙGDE۝UqpQeHW P\ 23~> endobj 2441 0 obj <> endobj 2442 0 obj <> endobj 2443 0 obj <> endobj 4896 0 obj <>stream +Hd͊zy8 +>sRhF^#y QG#Oç==o/ϧ;c_mӷKv|~_oo~y>}~W=|z>{O݇q~?>Ï?o+~ߒ~;%zΏx߽w;>lp?(O?{wٸ^ PZUuTGu^5P5FjFDMԤU PjVjUmFmک]uPuNNE]E5|| _#_k55|| _#_k55|| _#_k55|| _#_k5Z||-_+_kZ||-_+_kZ||-_+_kZ||-_+_ku:||_'_uu:||_'_uu:||_'_uu:||_'_uz||=_/_z||=_/_z||=_/_z||=_/_ || ߀o77 || ߀o77 || ߀o77 || ߀o77 KG#(~? +?G#(~? +?G#(~? +?G#(~? +?z $߄o77MM&|| $߄o77MM&|| $߄o77MM&|| $߄o77MM&||3,ߌo77f||3,ߌo77f||3,ߌo77f||3,ߌo77f|| "߂oȷ[--|| "߂oȷ[--|| "߂oȷ[--|| "߂oȷ[--||+*ߊoŷʷ[V||+*ߊoŷʷ[V||+*ߊoŷʷ[V||+*ߊoŷʷ[V|| &߆o÷ɷmm6|| &߆o÷ɷmm6|| &߆o÷ɷmm6|| &߆o÷ɷmm6|ۯ\t;]~~߅ww;]~~߅ww;]~~߅ww;]~~߅w߁w;;|C߁w;;|C߁w;;|C߁w;;|C߉w;;NN|'S߉w;;NN|'S߉w;;NN|'S߉w;;NN|'S ߅w]..|K ߅w]..|K ߅w]..|K ߅w]..|?|x>stream +HWrF}W)eCsdSmFJ$zEĄd e K9}tb41u4q}}}8gśfԹE[?zJ+/SC4^hVBKVj8F?/ssSX'>By?C>?t_y],Ζh]d%X Y,–p/Eyץ^.sq~ ΗΖ\I5p[W9< !I3sK./y`HPJᥰ ;UZ6qQZ&y I2%5" A2$RJ<|Ri,=Ari2\vW(:u.j?2CK7E?y NUeg*`G#]Y&ܡdbs#"_jxw=}M#.tGa&q(m;:4ژ H`1" jɤ`rK3s{YnqlPW%i5\cP%#'hs+ }wP~#/c_q/7J$R9 us +Q5ȥ->W]٫.QnYh* }qE^&U)DzuHAdow)@>/s]WDl1:n*tl#/񫊑y,J?̄s"q_A׈EI,*P@a/%X%hV#ۏ_;^|U1AR +zCeUp}?ׯ^ RR͐-In8P|Zl2oR~D_^k>tmnaePcLV5+jyLcM;CD]C 7f/7dg(0ij\QYQ!v K"U >g4"LXaN\YZ(UOlyW؇ +.-49JJǵ*u~>i""w֝?2;ROe9̈Ϡ=|VjA5uI^]V&@"c(`A5W(HaZ?^5SAdHcgOY"˂GFͤ ̍OMpSH2lguzx9pScNG`L<wxj֘&Y6fhdX?l0W8rqF,Zfp`IMii߳pJ]ﳢN)0քo @zޓ1)xQ*mᜦ^xTS& n s<ЉOPDžR}_sF\-n>Z7]Mp0vIpu ùZz ,~ o'=iqPקzh{Մ y)Jg qYE a:=)ZR.'BKqI˅stȵK򒼍t܋xx̟vxh̲5pfiUEirD G/3{nuu?HXUaTO2 3Fqy=,v9)o&.OYu~GpeRM<#_ ʁ={?UV⋔(3rokhΗ;OY@AgwfYAJ@vs6U`q*bEZ &K6}w6ND,VƿY]_hAٱoA fmOCpcA/]?Z%k Ԑ> QZ@k>]Liگ "]Ef]i{ݚ0zzdw{vTO&MYbn?ow7.RYx +/*4;ht? S endstream endobj 2438 0 obj <>stream +0 Q@&Y Q~JB~:옩+V o,$6Y q\P4,"8ؘ]&&~?û[acPT||i>NkUᆬGt԰{tE;Տ{ }]^&BAhEJ%lIO M϶((aԣ@>d@Qg2VSgs%o Q- +K I#zLm0<#`Y>%ih_ kH^i0Avm@]Q&,ZP!Ak8$8Wf"Rt#J: 4bvAEB?aH>BA`x{2GU)i]_,bŘ)Ǻo$g-뺏5E G{lϋfbBh ܺG?S!h\%;/ho5g#p&}@` 3= h 2Ra{*1Hva }ќ]gX[Eۻ)1LzH?YI}/h S2T;7:\ȝr -㺸^#%b> ]n .4tLbWF3W+Ϲ.8|LPTO@l@i"w ?ŗ|/Zjk0kfGK/ nΑq7wcD,(9n^^‘UejBO2f@@WZSn9nN! 0|k[HvˍڻSۆxY*rUF< :6#+!]CJ2^TR⒜?Q?Qyf1.v!7@Zq {?Tovn^oƷ zپW48Xdx?!T94 sEn Qc_~'9,FY +7U D@_knmo.pQǧQLh*) p\5X?NC%6D8P!?[Bo-}-]"_Z-rWe$idXk#1G_}=?b:8v Ɵ^LEGHŪôL㯕4rzf~rwD.=8gCoN<魯R QG#D#gM$)Dcx8{]4{T&,T1 4\{pvt[4O, :K:f|Hd^oztE-a$oR/ehRP/[HgfzJM t:. tREm2DZqA,JmUE&RY8/}l"Q ża 㬤fÿ)j"{0:DE" e̚y~C7Gox){ʍ! +at1 y Dnլ02*$C$/yJ`& +]Ud6Eܼ"ܒN'@nhƊtuo+v9 >[=m1zx?uF J\ rqth Ph09Qcfꄙ 60[maH+M/.`0Xm3XWQsLr<8uTz=˻WGk3AEE~lr<g$ޝ>b|4 E Sȍ:Fa9[2D Il#C!MNGfW z?L{OAP*#'q oSJ13گ]B+6BQŦ (,"J8i:tAGYKh Ͷĕ'gq͹.(Ff TSK/䈡e$@| V t F׭x_كtv 7;;z5& +ܚ>GzG^Kү<ڑN62 N!]et1|M-bm߮+A~qVAa @2 +6z9byYV҅BWb˗?STvKo"wQ)g%.4T9EffebSXKñ?;K=2b:l +0#K,Bօǿ!ϴ~4i+7\)x]oP^5\U8 am0LdUoeX0&\mhETK>ʩG7*݅ ima (]5] ՖS3+!4A1A"2:4q ݕ rP༌Z{eG]IH؍c8e?0,W~%XLlRoU:趯x98WGK+2R=s5`).i +_zL@եwXQU-+ ωc'>jys*iM?(BV/q=H#a".t4/.DYLp.)v:`%urxɡvJC9 wO Z5]>!(Dd5 }>1` 6%})y?EZcZ;^rSF@Ҕbda" ŲEދ,qL펼]O15 P7KlɜJ n'M77u76&qz^7(U2#j[V/S:-;.#PC<BÝ1+_^DMSR1W9]$4PrCӍOH>زVUPxtg6Х8[qRHWىL6֥"Iيg֟ԉ9Z)ě@&7[%4tQՕH_kM.q]|qBhH_˙к=| GcSX%:( +cn_Nsc5a]uΔ(C)<"6 \̣ +s-]lyIeqn@QEdZ{3"r/hpsk~^|0,#J3"&Coq7R"//[GsBht3o+u`k@]NaId3M%`ғc.V]iIrtŒTߚW詁WZKH)ű[w"&<M`43عw^\\74ң6+p ,(ǩdJ4ri)5A+9?3jj#p%-X];+[(`ٮ! +B24@b<3~UW3e @0vkf[m +f~uP|f7?-iB[xsA?YkBFi9-9BAFSR`][{p)b&^'2|YD=^+# $lFɂ{F;eT΢$<z\]cJsْ6R ņd_ p-@]|&u4C@][KjV~ 4Z͔BUM&;?!ԉ.NOԡa(N4 FBL0?]]d(Ă]mL2j{U! ْQe& hU I'vR ֕9A{oeY\i(fmEmK8mq,!"vv=z'ꚸZ٭""bh>'9wcJ9@8!U(Abs29ll'ȩPMυk20IvqL^CS<Aq!vօO7D'd+*QkJM3C^{'/m&װ9@(5 )dRr_[m4 *Nl]T-ի\lo--BZmN>}E:JIlC$a|E j ̱wTRS@ ͉iPb-akxf_+׺eYJ~Vo:awdٸAX<=fQ#>p4&K0 Y:g.%g(fW8 @)QȠlaDp\>488 X{KN܄VEY RUbhDü#S oM4٢@#bY F@ٖ$FmSMAvm]\GQy^.-.*'(u^{}ye +ݤ+,.b!8L _ ^,2MC` *C\֢qNǛb75E}20<_,WW~V1ZTx{Z׻Ia Jm"FWNБ` wcq;4眽H Rȝ4{ ML#S #_SЩvC*H7z +9Eg=|#Mwl=@U~1)*xJm}p5#f7L+g` /{Mo_AQ$7SanKk+*lAkґ"g^iV.VVTYN&EBY5W鱾;.6?s`>-9Ej2Ձ00Mu';GLVx)cˆNeG&X5`X ,kzTZSZK|P%pԈc༻%L5xo cp@+-6A + |eÍze;Ao>= ^7|bP0l6ӃBml68:7РrQ @LF5S/8j,yYP`v ++n+ Ankf1'ؑ a]SZqmQ4k7h. qWen'W! 87'78(+ +lKdz˥n=Ћ2]>w%-g%?4(a7%Tqz2\_,xj %i7# +U̜b>*_rd@ ݟT{O#1}= Ú@b.n7m+ϴ7HN[쮕Kgys:aE8wF]qvB6Cֈd4JB"w +b~`4EP1jr rTM Z$_}H |;O9B'> Ƽ9[{'d[P]rp߆~Tr gHD7 Y7+ ƾ3 DӍȵq\#[@rw7G`<^F#uA0wL /Jڏ0XvZ)=KO+P"Dߙ<$rי thɤϡ8GG]fԠ)Z\U6?}]y%z3M. v 5cZK|q܂}L^=ϸu3vSqHy꽡suW\4'c/6EJ#17V 됯}}[q}ܒPd4X $r Hy1LSܸFX X'Vd+1divr|\`WДdp`Җl-H6LEf[Yͪ(pF5`Vλ(;@{pWP>gd:j  Pd;,z68!BpRY( +hsxI%pRYܖDz2 I{;-֏x&_Fʁ_)H-b&Ґv_z Ր T!hxiM ##kG뎋4O3wI`^^H7zQ)Vl3Zv1P1ABdA0*ԡ"Bj>)5[̵l0;b +^2{a3w?| Xc{plDؘ=ޟv!º+CkK..elm*#'ܾ"%k[z"d& =;ֱ@`YlhiMݹjϕl +]}!,x3}sb*dτgQےT1- @BQtI +=}gtP[`j^3[.}Pb 5GR9(xh +(SurStwf&Jl ++) YwtJ^cի.]w8Mz0'ruбĭr|\Q^d"#JƊgH)c2"wڰ>50;sۜńͅrD%4'Ծ"q4z5?K)zeh6NVH8nA/wO`Ʀ+nѩXpSXrXȸ39aߥ6vW,JTa<6t 8R>Ls<y&R:P[)++mU~]1 3ae%!J~mZX}tLylNwvQdpJҗeU]ڢ.5+rJL#eW[j}9"~Wě9z]2.Vj&6Qi*CnZvW߬udWs˿<#Mnh@/M {.u`X*H6WZuKm'Tr3X̿Y_\n(\2 t~)[% z&}\]c7>un99IZ<괢qЎ{%3J@2hBJ*;YCH'owJZh7;ku~4dV")p/#[ -Ӯ:=X.DvtGuےB (NM+7' m+M+v ivyE['q߫,)S6.P{+ + G!{ >ŕuòdQ<4>U Syxp4]"έhX8T3C$BH""BP,r4i0fVc`qck)2wiTq_̦fTiU`=ad]jjGx5aJ;z1[Ŋ8J:AL !zeNPX^a#Ҽ(}"G^a + w!L0.&`E܋{s'|A: t=.O/M1_VpD,C&- +w$rݺ.9~ƺZ˩lMĪ!M˄7PZEq _0a=&[&|ǡb<2@St,49HUsO{4{dv>ufϺ̐jueP(=\ޮsuދPC]u8&Nrg/ؕzʸ aKܨYw(ɗ]CJ)~+"I<29LZȗdY%qM1pZ Y@]Ѯ0XNg:A{\.R%,fcUW eAϣČ5Ke@E@[nH^_u0-O'b!Q&ÉW[2ךEt(Ҿ0q{~ҷ<3VL*Uj[m*RB8j2tn -^oɺ3d!Is`?H΀d<^5f۟7 +wV 5|lVAJʭLs/" ]+T,}eGurS6" }4ê!zIiv!_N +/窄;b)"V#i %y +x>)#;[8۶1}DᱴPV1Kw }Ftq3́0jpy  f$-|ӄ^Qƭw}cXn}fL,Cd!&=i5WF;u#pٳ(l]o%>nYmNBL_$r\&H6$JThL jR|jdZ[?*n-zEVr~ cb/ M+iS# +ԩ͂b)4.p(ODTHZF0G5/S<lsNʝ9RIxo%<h`ٕ~t[ )? +*cd9Ç{l|t&#hyrspJ.Q_jCY8Ul t 2 +[qʬ[]nE`Q&P&e5pg`<(*gYl,y̏vBx_!0Xl#׉n ytBj` t=FTxqlƥti -)t4_^F|!s^l((J?ZRjN%ሉ~WCթm"ɉح*^B~ 4RUa ]w ez,>DD$G2e7>v4TW5BK]^65H=dNlTR߽!lNQj6xAQabwR|`";f:Q;9^\1AXFCFU@v&6asQ_˙|~D%j"b~  +4O3EUF[Nj_a&L/BJ9/eڜ;!1ޜ42M9Onh bD(<Ёkqs!0HfU)#|}oX΂0ӃDaMK*{ aYg8Eu9}tu#`{&۸ 6**kջA+C@<@uHZ b*d&2F5qA, +Nz|r`%Cy7_Ta&o<oVqx7`n _^Tr*!APtfg`MkVVX5؀s2hX@Y"U,e:lD"3p^)HrQU$'- rYƾEhRHظ֔G$5 ikfv |x ܹtC(MlQe `įo FSB"" 5?X/JϴC$2{ڵXƖ'Z(s))sݠMߛ +wbR9vrVPLlzq|B ,( +֑.X1zYDaCUȾ4n\܅/*z5ģk q&ϊO}S*r?lCyyqc>Gp7=NݞI?pCfgf.'7]ՈmfΘ6Soroo&gHmM~9z;W'4|{ϰox<gY~OY ,a %c?vby `Rqo% S:gdɕ|(Cs/HN1t,3eF/H!rlq6Azzʄ[Lߙ쩲@}ta-?ĂP{zd"nI>x,:(ʇyϻ"kwJ@Xe4+jiN&ɪa sϟ)idM(b&K]gͺB8ZxK29J"^LO˩[7V?~#^"|O ^WH =(6B162K#Ǣ:|zfojɕ+0$LckyFC-<{QNs(*)CwWD״ML5Dfs3KK\m-P)^ L}6r1q+Wi42j/ø}VC+GfWQШe8v Z3o- ;j&˥]\%:o`sfEbS'%MMvڷB62W|znX=ine(t?nRkX0֓Bϲ|kNByϬ85*ԟZ JG8rJ*i5lOc3x;F Ŵ3 " ߈g;'vFJ!bSAI̔x -V ؙQH>%mdz! o#Hw_\/>A<NcDlv݇7 t" F^O)jnt?D,dA5Z%iQ;]dwstS6a{JVRS^%VzlGRfD ߀u/eZ(sv 6nB@nj(Y>$ >u'8A~8x:r [^@&Yl7|4OZiJsNҪe bRX-͔W@ um_Xvl_L#{*[XyjT׭:1աɮ7BWn6ҧipS$TǑnۓ\hn@2Xn~ir፯Iagm@U=0LDf^C7 LlKZ if܄H$hAG,nѮݘ:ǧ9BH[Zb~_o.hjVhqrxC}Hzpj 'Gusp Qx2PD),rO2sa9zGLi^tO}|" oѡ;-Di/Hg1{ -j'0?hɺ7VJga))}!f >bZ}`0zAaOJb6B$)Mﳱyk,x1^ӥتȨ!u^lbz+.*c-A5WD +nVkK}ouǏM{诖Q1nA <Ӛ NP pM/U}*d$b^}kg{wޘabWipOW~WK$XƜdƳۭGXj +JEvׅfFrSρ隃YOҴy^]+e4o4F3lhsBF^Xf"Jپ:'" u!d3 )ιx Ȍla 97Dg+zB`IdM|$hvFWO3ɢ[Z0 ULi +Fwu:ֽfՏNYь*+ ``|k0țfq갽!@|$g6%HE妚pY~Clr+)O4M F9%!zFr&C @3pIF {x>_MzEp/=2o<$K;kSOfw';#&iq(a [*moV9BAgL}^g\RF.n]E8aFyNh$U$\1ϱJ ;MoSnFd:q3ŵ+rHi%rjlX-LLbbzHں H/# iZؾgQDKzO+a.kmb%g01/-;brQOP1]r4/m(?;t5}]yMCt/0ƙ}`b'oh18&<,av>r. B >wzG Ӗ3sZ?\$yu6TQb5e N6R$#CG2rs|o7H!sEto@Cw da~jr 4~ HG5zY󼁟t!E4XUPgD0-Oo̦M1=Sw ]lSE)2i&7ۭ I4 m6R!v V3Sj Q`*ص0&Q0G>tl ϟcPߖsN.C:n *O8Q1T|^!6?nL +1@{p`]1Y}!0y'ċ CQqyV@ǔ [7ɁUPbѰ9P XS}1K\xh5t˥"QBZ9.1}"W`-:_S, +bVPU*_ixpRls{t7iN<#;2@a&|xZ\RRYU,g`Oexa)/$ X4fD;PcO,tLƿ6h-\$[0NcȮ@pTV=sZEI{4ݭp;n `x3F}ߠpO]} $1f8:9J2$'ZOiߙ4pnpe77<]džӒ魫q=UB#o-=),<ʠrCbMMhnX`\"(Lu[$ޛ Nt nXĠh N7ntaU6MX:.3]= iϖrkLfuv\\ZI/g;٠aII˔2)n-FmqoOr_[*>>2 j ;v]Y 0RhuV&kѴn4gʩ˨C鉌yyylrtըOFM6tWHDǁ](E\-g )R^ўT'$8 8ʒ Ph'BZTGXALYk;NsyH!s +6ž&f*mQ?xt` HĆ1Fֆ}^b%ĵ.Þ{v9*ɵa]~HT9$\XzXv,Yk*QPt0)d=Ϗԃłg:o)7gV/EW\oH"/Ԡ^_xӮ ChuɴH,hhIMY A"`212ܿIYNpLZ# 3{5$)"O9јO8H(i7QLU.:qeʏcw^\ _B?QfwМܥוBos{;8Qh҄}ҫLo]!Wm"Vp̼Vx::!PQ:\x#@{(gKۡĤXHICV@Q fy ;C) 8@t;5*:K!ݾ3vJCfm# XbIyxq%d s7{jF+mq, ) Cm3 xV6#%&MB?t6/ⱄHA)Oe5.yNuc)p !kцp(-H+<+ j}%sCۋQAQ:J%x~')S=AFGD*k}qy&>/62T{{zZTLB-eǣX=<YLV56j+EYᳯdEf8ywM݉øAPz,IKPͰ21I"UYg8hAreA ΰtĸ._ T z=Z8ijTt/`LՕȡWX,} MAE=(\.c\xƀA?p4Bu +!#[Ho(֩!h :Qfl\>!2XUX=Prt~ AYߚ.wA͖ z~Ÿїw^ /ICSA]csjڧ:εazN.uaA.%wf:dye:F4A ,(uݙ@ׅ }\ 󔾨+s] 5Y:CNK#!} [Y.0 H :zw7[ICtR-Ƭ0r|8Ũ[+s){-žH+w{OFR>=44Lgu0۪/JU1>l>>ۨBE`r2yL +Ffzj?%]y t7ElPN0e(2R{>Od:dEۄO̵80V3n;1wC__V.ji1:{yvHqۛ(TLvU V ;}AX2 Xf؛tͿt!BG]3a_(`:Z{bNz%ՆJ3Z*vd=D 㔠Epi־Qs9_|e7 .LY=BVҢ\+Ԣ(qSUn΋^P?n;sH `]Yvx`*8zF9bKcxl.g8q+|&5AG1X?&#~I(K9gf$.K"9t=b|85?B?"D_#` +e77BsUL{d| Tw#w )1glr%L!HF.%'1?elOyb &TM~<A5įU';XY lC槸A> endobj 2436 0 obj <> endobj 2437 0 obj <> endobj 2429 0 obj <>stream +HWێ}߯ h[}KVv| rvϐGkS;ՐܕV$a]U9+ R'dEfpKUzp݁VW\\ڰӊU5%;]m6Ce>+[)2pbsT_msv3|:6۱Won|Tq\O!!P@< 0㼽m~Yv2JqM>BDP G7W/λܨ|GVJ[Icӕo+i?g`JJVR]wj3R_3ֲ2R3}pZk-e0}nA9Cnc `XkRMχ&*U KH o8dמ`$<؎fp}BebtSKEN۾kyn8cR&STy8E؇'N's76%7Pb0'Ҫ _ J45i#)A&z +TQcXxբ Ov!_0qB{,#RT@/ `yQ[sELtPB~j\'0k"LFY?:4"LO@Y? eI(5(OGfeIX gU&ғ f,L|.J2gg)>w93M"yTc0 *$4&m)O\c({Pof8-\B{PYD E}l_WCoyǛJx,~cAݪ/'|;5rIRhƭRp); + s=vlPY<45S2q4Ovg)x?T[=3wO* CT%93gx݅+@痵]z1PEnCufj mT?U5/Ĉr-؟KxlqŇKEݰy(/ `R'-Nx4[\:#X[s6xhR %d߽w62=-)˞0܀\47㰿G}P]ADfԛ2efW/ͻ8c2h*865b3FلtHH1,~ I>XHNSM +fXk0w_tGH9/H?@,*tQnQ!CޕQsigM/S1;Kw$T1%3:w d.Jd2‚YGL @DXuܺq9 Y򍺤q=ARF%!%zkԉ/5%]ҭ5Z籿nˣ'Z:@C޶8IpHþm;DqI ov;(ӳr_0,n|AW +E9 R[wF}"]>.vzh}S%Hcfʝ΂% 00e3tr.ۢJHXKPOZ 3Đ)48zT_} QY/:%GÅv 'ZE䈩ƩJ-0~w?w?%DB,l1Lbh?4/ft$5AA>x\ r@TPL!?~!'攮E!BS.r`uQp8J {П\ /J-o,7뤥~q+ ՠ~0&lge4[5ńl)RkWNWXbϨ;:OgO+"3f$9Pn\eWޝ70c,XD툲l,ːk7$.z&mos@]xX3Vzfc=+ `bX~ޣ̱fbK-L>y_{Y*ߞ<} U%ݙZ8|Ȁ{$@~xfʹ֧Ԕd=`/>hOw> K +O$*D44d3ԧmqY,Z[w⏙SPCF,tX|<lhKr6&18__l1LHh +3WXrklqD* v,~*TuX tsBuBFmc~WVCaWkMp-|Tl uE,W=MMظUc}X`ew?;_ˊ ۈa`ڮX,!}s]Lʥq_oJVj?*jקHsNI^)4"UTc޴6\C[ ޼ތ37ie+3P-WN)4|zm;`z%1l?;Yֈ]FO +K csms :bNfU;`q"#Xz矏$Ϭ5sz"w\PwݩƧ-0M Xrۉnʡzi&lEHZC۬^/9|? a=Wb+Eu G\}iQ=NEH6IО/dq +Hɂ~sfeΧk?$.CË_ lekN5LJ'.Q5&-7}AVw gC!<Q""֍_k+jd0xXJ7wo=+4YmR|񊅑1±nO- P"bb?fZq5 OVPzd +t~7RNA,o@vAd#TG)=_{H&) N9KsDG7] oq@t-}"ݒ >stream +0 D@&a[ DWM~Jo!ǑVZ* ޫv00!߀D'WOPԓn[a;M7/ S+EbƮVGL+ekRʺ[ַk )La5 +-F|(3CKi& ي՟I*n<%r*n͇$$/Hh!>LUj]f h\ ڋlż; q9L+qM^tsrk#,UQ&.↮㤍= j"٩m ovR&{gڃAcWdl^顜~DOʑXˍMNM.]"W/_:OzS(?I@? δ K;&~luz&Y@\zRˋ,(vy5 L'9MLOAʼn:Dv:K'(lĎ㓈q~s +{0ڽ.>c6A2{e;ngm%=uown̷;hP2 +/qIteWQIYN. r![D^y_@Nh .7DC?8|`}Ɓ VD[_O#)r/KLg!cpS1(eb9pKF~[<݃n˿LK׳iZs ZSl8uTɬ|ך2~ÿa@Vn6K&t 壢[c͸:,Iֈq' L5!M鑑1(-¹SΝa~Y`-Y);?` ڈ4YdO5CТ.ݢv+B4&q΋A MMzW:#n)6:ċ"eߜ"Tڈ0-ʠoAo</ se7o$#N0?8V,,N6.Ȁ&ra#\/ TG}JMn9g#FV=1շa5:mF.,៤,TNaok #3R #ä ZD$mxWeLYf\?aԒ55Hmwd-eWM@9_rdxiF] ӭU]ȳ&tUV4F)UU?7"'=9%yIsr."B75 +A?^˅6PbSl\K2\A;[Btawj\׼b^ɌO@-@{A+PIM P[OiqĜ*;`5l'IiZa + e:ac1*Ep(쯵(&gbK&5#vKp;AORӞ4LjzjW^xpr=6x" +oS`X[tc˓[-6Ql~``z}F +Ȭh.p&t}U(Q[VF vAk\[93W"4ϧtA+И 0Mc&= w/cJV"Bl81XFA6?YKA]zx H\Dsq⪤2毗Qk'`"?EXʖxq[lm4}UZLTwt Cg#%_04^BW@o'>zV{Dd)煊|u~z7Y¡9ڌʴ=B(SP,y &H[,/98'lЅK ^$5g؆v: m[BXt=uq/|)o/40Rby"kkA05:/oT3U2<58Gf=ҏ}ma;~.ge4tW36=e>M{h4azLv6~Y+g8 +aE~jǕo"utb ;qy2kI{j^ȅo?zR7oiy?g &$R +. +5di$CCef +.@r\cJ"Z1&@^6*w].KSg1FdTp\җx;)vEtl}=i7+f[]ʑ t.HLEaxK'0ɍ +N#;b+[Sۚ-M'eaDB-Y#W9 ͦ7v % Y$Tfy#u)]-8 9U=2MbǛP;{> >C +A&0*#M#̉Uo%T%ېTâTM$hc.Kh-x + `XƙUd51 HZ +"ezlGCh_3JC*Z +noNjկhੲUP"}EU*4Oե܄0j$F +A^K^ ت`f{ao慿(M=*[ZV%<%ig4-]'6'j/r wჶА8C+ x&ڈM/S>LJTsYb@lve:70;xs8F49DID'G`st6:<& GPs#Zr;Y|[Ȼ0 +?*q1tmI[ƄA}Rk~?;Y$v_X#3s:РrGm| %'dٔBj#*da@tf!m$4a{9xZSy7͗|/OqۆM^>8g[l?B=/W\ttH7 =H,}73(o\_弞]mϩ+H}!m$L7Jeda޺Z>L%k*[kǘEO΃/d-U1{yec%voGz?qS^##)7#ilbA9aѾ{MH&:Vδ]SKagJ t4X@R$7&~LF_&hG(6ӏzgNTm8$70iMqc^>QPD#kK+,Ag6Wg'Dѐ]N A|+̳d汹_1xo:eT148|fm %0Y2``1gK̳g,馵UJ34q`N +w"#N9n'sm3 pՔus_"?;V au :EKH.NK҉@!#(|.R4lu9ZSAn8bSп/=;r_O\S *7H!6K3W_miiN:K?TgU'3Q'*LPu1vSCdI3_,Ծا/3 +D:{kiLD caaJY N2؆3%8k8z2j=j'Q֊td8N7قpaN"9tɂ*ˎKPXV8q TKj) @Lݥ߹niڸA>m:Tfg5{z8IB6ݾg)7R-~ @ZŸ*#be(~DQ>u,õeQOͬU$erD(I2ro^$|.d@;C1"3I<XX ZEA[6jP٤%M |gB1ѩ\uv:yT%@hu(uj;9ߪ\KjkۈcG9Өn_x7|x`mArdN`(ɈHx8pлQ|dG'C1Br_ЌU!#4*b1JJnӥ~}6mZK +tXԦث {|{}W1;,1nR" 87s<5!Inb{"ur.>el.aM/ToaGA5*w-@A> +qf<\|ۼ*`ˏP4qOR;ۭ; F[mKn֔F9yά`sXﶈd5䂴h͌ߥ4/%,$t.g؄5xi1aa4~ Kgq 8ڮJeŭ|͐6%##^!N¨! JƹӰ$ +cj,ihdvX5')yz[9- ~v^ؚ|`@im?_=C&JvcћMS2`>$t4d& ~kUxJh! !icdyoc4AbF𻨋"k#+q%QYPt F~i+6g&JÞtXx&RLyd#LMI]'f :MȲ[2„JvŔl>*u,FٿPuhC0Ex@G~ z ɘt]ph'1(PfzQ^a¶ +E +} ^)-?HLe&鞣*{ԁC{⩸,Y.>yД8VrcrvZCmSIz]@ nQn(Oݭvn.p jaN$5%hEfo܅ɮ"ecZt/X\VݓӤF#ہR`?#$E՞3 \M!QY5$(ksLg?ɩ +`SJVuA 6uS,XmbGʽrP=v%#pgj|(j:WxCVh)&WoGݩH!Gʹļū/o:4e0E']hKV{QPr+ȁ2쩌"7 a`RR*=SӇZ=klV*&ukW77:$4&e}fNib, "|@nZtx?8|:0&gι .v?5auW~{T*y+ f a[^<;u)kZWUT #>U͙c8ERrv F#`Ng6ل?wU`CǐVv GQ<]P̜־*2^iSye֪GTuu.qkcxL;Rv.?פּA) Lb@Y銀F1^ Kba-;%!3/`kUѿm|D6Ft8i{k#{2Q@ :#W\ƙњԬDFU_Dl9cD +˕s۴{h:0( 4+7VOws׸hԔb.sU6Ɖ +{ΌψYttUq8psNbjb{8Px6 QLrY䥯4`.* 4g/Y*ө)|łI]L8 l)h]Ɨfn/kz|ϰ?c`V(MY>C?ɋrAi=Nco"Uo܀al Y35X!#ی Uސ1*BK++]l"ѷCz40:ݫLȥ-,4M8N*!"+ +YIo lRjK>VDQ?!lp!F(%댗h+mq…TTnH6z=SqDSN@H#c l|5nJY+\)q_K7 ˮ{=iPcfb0r]|9 ]ޛJrH8#A #<}N(v9Tsb4+/a{Uo[uA㊂'twuǹ-kTJȡ?{9Xz@ԨH7C/a%&ekݍ0zDպhy^Ƃ+쮸BNM&x(E.WlVgBd`R i]A0納c /X#K. >Tku{Ko޲9ܼL/22&K> @}%_e-^;zILG |!d6t*ߜ32öJV`K51RDK$eLz D3'H#]U?G~%x9ȎfOT.Y/@N?`o\wf`vkҁ *w:fJU*Z{ /$ح |lIo'vb5m?4nU +(G\I +$KCHZiy]#n%&`=mc 3ɘ6{Ou<ۄLM ?JNТ.I7 +LJ| JISdsؖR k_ )99[3w[iP 6=TF +W1$dκ?R ݽlޢ0}qcE%a (^u^ AG'wIG&+?'s+dI91y\ +fs ?{u Xc\Xt)g ž.dem ߩt?e%3!Y)jXi憤<)d"sѿyCiЏ樦Q dfPSG7ےg^pSchBoOy_ +MCUbdǷ8[)>;p3ÑBy%X Z,%Dږc͟I~(Rۓw qc,4fzi6)z:X2zOn}ݤ +ݩ\Zσ[& %صKA6!iD̿+HnIs|tJ5mNt3v'C@HLT9`x+;q;)u*šH9øm0p$ +<@_q>7ee ΤS7EӑB +s); {c∽:hfg{/=W땀"Lf[ n- kn\A=Gik*'pUM.Z\aJqӹi?zr~g#juW "<2OkjR4"R?kcֶI^F WNfQH+B&CZhِ㲜2ж@V+ɐ$eO̿N>;P(2TC? =PrX|Mq WZ*9Pq;V2ClZAic(#N}э +aɵ_AU< -TcOפ BǸ $^h/v:E ԨcU 3N$}QDLlj]ig]D)K*yD!da,jvQUZ LXͲ#6 ֌zmoK i; M$^e)K6y]Ǯ_SG⇿F-(j/+]/a^ڡE#Oid<Nu8.d+b=P˓71' >k C[8fo[<|{ "r*AokCy$&ly"O~0E2zd:B bl{47(FK|q9"ᰌc)r혭:Z +p]ZWIpTi;+9r%fYF j;#ׅi3G%wql"=VU͔U:sFmfhZ[)\p=T8]1n| +; "Ev`$'I&U)֕.={85&A4Lq]"+ \vT>fh7?p_%E &"dv]!QgmL,xҋP[ rENT6aQTLlvC>bQ(wv9|g<(\JU_g6+^G@Bodw^$DԒ!iۧ#\^m~4~juRn:f $m.Ӑ}[v zύ0[Q,_Q38^וLxt 1(Wݯپ4M4OQ@֥^KRР P/5$FGe.y.Uп%K0O}QFVtwn{^%@T2 aҠuß,9Ub!Ap'R'Dtq9G|MM%{D  Ǥ2c;۬5[G Ygb۞8Q1dǺ ܘ7 5൥D*w6̀:,K&NB<ɸ-n^fEvʫ6 nĦj9bncSH,|mE`W PWN@r*mN] 8N.Sx9M.&(m">X#?bT6g˟6W"rAXUi>P@ ikL{:"FA7s!w5˘TMQZfTb;ەX9 dE'Kz[XQ7t+1&t'eT$ؔAÀg*18D,0jrBQ<,U B\M(Xw:*IvH#Jx!cuG'́0s? wO= z`!dy4?r|u*vy~OQ+ q*+V`tf6;ϙmĊ?L#CP: zFv3IJ +$mP)xa;RD&DuY34&v$`:^cxkFU$ gK(I_|ewq'A*GX+T?L?DeqH,*`Qp$Es)P|~8GL D*&x)(e61`m|3#: V4xa(;A;YgWu sNCCAbP +؏!7S&AwK$29C6ǼI7%D.W-A6;׋)cA&5j@'^tnnΧjoHXi͗͜ԃŗy%Wj% +[=W1{xDYE(Oln'ވ"$dݞqW +*6د˃fQyXIlgzqxiC@BzNw(vY/|NQw)'-I r#pHNl*F/2xٰst6uj6IT^s㳏v"ownN+ƃ2o|Щ/,qw[CokRw|4 ^mmsֺrwJq1ɰUgw ^/3Ӕk2Y6F>G7ۨX)a@\K  DW Zs<Q['\bΗxұ"|rŞ7gDiFp*S_  a"_=[fXޢ Ia_ThFFb b0N/3+r|i}:s<`d0JԁV,MvD.0r'/'.uï X%_;k k? cJߕHXڱŗ8ծy = ~sJE~l8EB\콓|FV,Cb)ZEYn\|L ;f5'@UL~&I& n8Dg{5.謎NV +ykqI!h1c.aD4Fd0$ %@e(*F6'}/\@'&\eX5۞'%s5[ ĐTe19X^~d#ԣ&0"zSY j{}?o_lnoN&H(+Rnsˁ8 ElHxLJs}HIJdR ۵g]Ova&@Ŗ韠R~e٪s<ƦlE1If-XNcN:{rhK#na@<H%C8LV#*fXR\p}(T);e=Zơ`j$t]p{vBzn4Dz(bi L\iQINpA BfڧΣkL[c|> H*  +1Hoڿ'`;F4g,Wb<=LɏtHY56US ʜ].e-g4-[)B0瓴wJGN%Db ~_6pVZF Bm&"FV0\IK[O/7r6|_m;-{( Zn8\]\QTCXb:Zs~rMηun),?>W-ZGl)׌$+g e +{M3ՒRػ-z{QWQ*h=vWֆù{fW R4$Jal *(KD~KRϟGbkD#,%gaO9Ԥ98eC܁(CMnۨ/Gbm$+^e+C8i#fs%x8?vyKKکu8uc&@HH,cmBnxW?q+syїb\_:a3o +MιO3I (4qX̪I/T( զD7 +x-3.~eϾ=~fxr롁*{gN_"M8қQ pϜz`Q'ҋ·P9Xܙ"l@pO `(A ~CZ\r8AdH! ¶va&0ĹzSRyvR +&w2Cd~<-ohw&|V 2^Jr,vHہLlp:넕^DLjR#^-;O(7G+|ls:])p(-K#k&#j7X .Hߪb <.y( Ҷ&>-s ShHuv + 65c;jȾ5%:QW)rjlQZoØp8 +WElsL ;NEBBje{n7kCFf'ILi$aPRen3 pɳPZE~ZGJ:-ECnI#bscyQPhQ;?U>:'usó*gsazE&aWYbZ:! m(@nɖKb JK0?Kx5!8F37b;Cܡ(kz@XJ/e#i2qmeTA)]&sPGzwZ8f +HFl6"l;4س{&l7k +sH3z}Ch:szg !h +N|Ĵ. +H>%U*tqgXD[a<+*H,sf]~i caL)V6q +C_AFI{"bK7LjQ~ۿ]P)t"܄ i({TJEFa/\aoH#@$&?e+@E5??/Nߡ%MI:8qަv<_2eI8YA6ycƝ _m)bTShЯ-d@&6N.ى\)qr4rpyq@t>ni=Y7%|WQP67 1(fwO8fܹ3I>3a!bc=lbsw`k^&h'U+ UaY%*r AA|M +1]I6b2Z4K֣dR폑5.EF<Ex>#V@P-"Vsɚ :%1 >J 69]Akqfcd/FG).p@a"I'7{Avt +bQ@u̙nkMLu2Yg ׌O + :#tbW4-_&c! lī\5>.ğ; P~CqL sHAu; r]q3=#¬y)V9X"6W]JHP~pmğwӎ?._zUX,227JyP 8@JlZa| F"7tTpHIaѨOhqIC'Kpoin}fWSn@fo.h\h;I//y{g+HY-y}#U),Mx)Rp?# !KDkq'K$w*٠sR@#;6K̊WɄFDr VuoB1jnZW%7PRbyM8r̛̝wBSdYi8 eGզ2Q(Z8-ID u/!hHL. XS.dz$-:a~yߴ?E6c6^A]R(|jD݁*$:*tT@/>c>xs%w@ HtA R;ßU?!l+#T$9|9/bgѠN +o-hLhsJZ`נL~.ԃ Ko]^>ՃźDԙ{2>L%f9C rhFiw0EYd|^zYﭙN4ts\dx.b0d;Tf}Fl̦sE]KTJHǙ0]0v2aҨc +B$)`XKr} պO `X9Ԁf kmqkC*boٟC?zͰ w*M:0eA2jH^_c>bN;)LmKהjյI`&B9+ut`Nyy2plqiƪR#-Nz}t"L.{0)z>.MtgY~ږL'<+>#|%z}$IIOs5:JCYve&iԒAa"X7tq'bpon + '%ҬSLtWdGZ[(VRoz&T+xH-zkq( F8tEJ?[ҩ~rRRX=Aٔk4y^kԿ(*ED `N +k!)-鼏~-M {LGeص H{C[ԶHz߼XgF~ d@5e8YVòq>_;3c>(I//p6J,t6V̆s +C+@@Y'pk_B!$_}Q{->~MQԮ 9Ds5.#I" z-j|6\g*Lc%K2xouoBeڼtmmU%+.jNrnw?\K. S&z +_9Sz@$w&Vr0HX=p LPA1ƞQ'"fl 5T?HDnhq۶Vl;XQBa󒿲3-)+p} +4$"-Q p 57Q-(tv(EE."LϤRg>vN- %+OAY0`z}&t\>ņk9h$M51\1 $m(=8}Mmix]V$Dv\]Pe;5P!ZpQ@,k: +%' 1iԐ)ViXb0|KSԴPkUްA HEqo ?}_3^ڰ9{JܛZ[TOhC8.a  -/]˯4~lt Uae ,F4'/Fɔgtq~17:fW*ōjp*E߆[G1eU=f(Ɉ:*gK©1N ɱ2z=۠eҔ}^S.w#r+~!n)r +N"+*2sMgoNNmw%RQ"&o(/ۄ2c>x Hba%I.Ls&LzG oUhokZp5#q,cі@Ė.%H38hm8Aquԥq +54I4Q{'Ipd?33 `H_v]$8E|槛i =:7Be>wk*nI~1jk+79j;W:Cݕi ~B}4 ,+k ?FZ T9XE2m^]#p4(q6F5y.0'3TW$C|Ւ#z!"6=.c!V&?6)+qD 2r?&l>L$m]%5 XPI +-ÊGF*p %:m`;)]վ8VwDOޞsMUo̵L,$`E83- )u Ca܏ 0O;\DMk74HGw >*4 @()8,MR jrgI| mL1$dcv܅d!Fk§ᬇY2'#tGc"Y;tRHMzWr{lI(p(TܚK4Z>7\Df̂½ k4 Y>Gɖ- YFf60,KA{pZS7`xZN))D+> cx7JpcVJzc ~v)+tSU=+Qq7o,]K0Nhe8uDwcDu ta/iyFV|L6}&l +rQ$@ܞTrs}S,U+꣠Q^&DMn. ?//ԩfV^)7@}?3O$.7!ab"gS-џB`ٖRwO`s9_MSt +p^ v#venSU;#N}mہuNN{8s-5a9%XP.U]\(f/>>~$_C/jr +eJ9Ѱ;%uQS~N'A韍; j{)ixE.T)l|!<\{@ȅ66f:֒h cxJ{DS' eC~z;70tg]<"L={{{EVqyvzR|di˜a2CCY {CGߤ)a@r%$+M:S[SUwxȄ$)KJ _l@g#sCSg;Y O؍ݪ-8oֹu.ՍE,>_tyC 6ːF޴w +y7t +N[3&wa6pfBp&׿Cucs9wtN=%p-.FVeD\ar=^- P9W/,S̵0L9y6 @>{P//1MQ0 nb^c.'=iIgCNg4gA%0˱P8p`SUDV@Boa7M,FDJP=9)a,xR cFKd/!*1sp׌o)&9ѧo5|"߫ +2>kND\%X }&>獥zOZ0ۉ3>` 55 -DiX-$M!I̹Teu$@[t}ȶ׳2˓ABe鼵< !z܈%z)l&f@=^'*'veR =cވT5_ >\ o7HA23}5kL)Ef;oJG|Y}k3SafL%drz([ؘ0ҍb>g~"QXk;;Ga^ { +c+WrΩ&;6(RG_dX:L%,߇˫.Zp{<1[6|):]JGRc8 LfG 9u#y/kBGqQr|ZK>.Һ밮>UMo<6;2@MkG X5dD}b8b!(*(Օ_+z)>LGvo'zdP: XM]srgo(*Tc`m%,wLcFMRh'v`Ǧ<:DV\H%b+[T[{ːNp$X_vg@;rEc[`c5(4rOᮯ}w c3)b 2lh6,Zj4-Y7iRYTc cLL7B2Ӭʌ##`22uѝ<,N&cq#)XR ߺi*aaɠSoap0_mo. +RӰ2E)/tb"ԧ?:;-ڝ=akm#I/ޖD #~n"Z_XAH`Ӌ+͆{bw}EOz'FX8_u&|tSu;0<ሖ,nkp#PSǡ1 1مquղLVZ]ytƛ^ 2dyWy8/WizƘzQG+>f?-s<oz<~[RG >5m u.;*^1ܿE{kqEb7*1J)h34 v!?4v"CqD齹 +7;5uO +K־@s e/y``,Zret_{=L/b:!SxzJlx%4*2U!&j/^4̡(O;@#Yuux=~MrNLx\՟m(c12{ڍ9Y O;Vnz׷úyk @ظ<*ƴdzZ7a"̳w!QVXx91pQ8[g; } &<Ʉw+i01qJl@dUd5؊OVƢ"~%avzr(ctӄ"DcXai4[a/0!p"'K5ݞ-e-c#zO2Cýȶm͚?$=Fk@tʑT#je${#{Jtk~"=NΚ{T( =۬DI-FimGmNs ? `Jz endstream endobj 2430 0 obj <> endobj 2431 0 obj <> endobj 2432 0 obj <> endobj 2422 0 obj <>stream +HWێ8}W-U7y!X3q0ږӚVG"KQRI#@Xd.N$BRF[SS0ݝV/ޝMcee]˟ZWh_G{l)IEJc_O+^jRHqs׌1"y: OI?Lɟ*-]~w6aӜb +@ RܤB hѠ`tʣ73D>.uu}^O@Z2MMr| 边 O)4rv ñVg:ae[#Y*^$0A )L%KK m3r=y(׎8b$ +" ]gNwx>i`JF_;(pXh+а^ Yc#Nr EykOQ"63KhߪOٴڠ1z C*F{ps7|nu +]{ 2IH,1ȁXf4dWOˉfZ_!XF:)`$7^<5gOh9>CnwukeB( 룜 iAp9{l,\xJPש:R +m$D[[}昧<ڧY|C})%`UD^H@] g]˜aB1^:W}BeAD,<_2Txf  "`]/\k2mgf - Sv&SE] +Hܷ9.{iV|"ݳ KC +=F,!MKJi5E6\"@{N;t.`C XT5'{ԠByv]s4*!, 77 ae"tCi}R"6/}dk''Ŷ߽zB46.dשtLR?C}B%~H7k|G ad{ܖ>qu}x4dWIѮ^\lBw.\Ѳ;AXK8Q):vu-nBE܈=^S`k+ ]}Y)@TbY&„:%(m†M!+PE@b#a4e#8<7+H +.. b9qi(s + c+!}std;+] +8h +3Nň;z5i!P):7|Bf%qtҺ4-fͬ荒?h|q;)z.i&0t1kRxYV_Qm,\ׇ쩈|u-3$b퍺OG9^[ ef= p 3pAMao +$Yl_XZTSICꪻvPD,]`7VnF9#] m6XP LvX 9u4 ᚦ6UN ИZr巼%.OJVO#=~ka.K2 +s +ʏa^ljU,0Vx )=}|'aB[`.H'L 0X7< +d"TDY,Sק8^-Q}JF!)CQBgU:P,ԒE@ +ݱzxb,0ݠ^ɮ]V~@H|Oc)/sNV)D xS*izSll9 zV h_1D+noHS@BLDO 'IY?\F +dA~;jC)Q+Dz5#"8H?7mcBtxK +E:`.,bY.¸MC+`""·Hˤ8,^ea\ w}dh8"cQFbަ#IFn(Wxk+#_6*l +ڕx dfBQ}Iذ/\K6wb`rE*fgH ^6[V@mQ +d8ySy\0 0h;L T;"B&ӛ_V +F8@mD*҈"ÏW@#(eF.\N'}FܑӴ+y>El64u^ˆv|j) EOƭ@DZg8@ +r^Ik ?eA4&{)!I쌑i>4AK,o;%xܩ!EP"4_>0yHapN տ | s+]A߂Ɍ+`"c$J-c;UQV-M + m'ݾlh𢔯%Iycn'rp`Snj6Ȳ_d:2a'5IpئA+Po^r(=@ +领&&>whޝuSJV$xI$M&KfY]_gd +)wö +٭@^ݲQ*! +maOZ7 6DPd^W(6v̄vW0Q#*!͸7(^_DyCyaKL!e,N%2>. +L0!\G$Y- ZdKAVWƉ|z"C_ad$4G=Q8u?ΡX S8 =*Xf>O?+~17om$uTaQ9Ls(i?f$H8E*`Y&e*ƪ)5瑒sAd`AhUN aSr5MzǮȇ x^g9(9\:.b^), قmU]$~-NG)|7H) )^wE[kB64R66SXtUy" eX[Lh,qrqV];47,бkhTQ5&p9zg6awˤTy[tL b3ۭ,H@@0a'RQ_B+Y: +` MRqY~טXOdxiNJ _q=Ϸ\)3`3ah?flFG8FWWO_?O闿F01$A8<|Z=lÚ{<n[[5 F.椾?<È5hspEՑU 㤙:"E7歬bkHD7痿*[L :P7WvDr=|{4THCp[C( endstream endobj 2428 0 obj <>stream +0 H@&h  H~m3 TM!e' +\,Gdj8B˳qN;q, t u'glTwE1+d*zQjEtqflv + zsU#k͐e"+.L2$2KpXK@,A|y^McRCg_MFEf9gћE&:~R@9>,$CwF׹3y؃ğ`kmgwU13$#ZȻ|;cZ@“50?&^@)TiZ4ij2ojoޠWJAֹ;\FϚ圱Mޟp?k b"|?J6-Tڄz +YCjm@%ɀ~)lϸTi" mȍ#U>Ehv!h$.;nolifqegde#Q(T2tEN \ky]O]v 'nzԏJRhɽ'\*8[+r'y'd/Eq[E\nh+hDYugy]?~Nv=AsCh R3uүہiuC3/I"RPjUU0Ac3ZgP.@`ieB8]a-[ 1l"ÀcO{E)eXgmg3J]vWTF +LNz&X}9_z x//HIvrЂhuS766Bٚ >T*pn.8ņ?u;``¾"XC +He:}%F)P=JM/}v]k'<Fch"}]<3x#ց*U-*k汖e~X; ׳")P㜌݈5$4#|e0|2p6!xnkG!ytWZ+YJ^MO>(/Tdh0st_gp3;,;Qa[ Uqi/R>x{<Iu(D}L'o^|L-=W/ngUyǿB#L&x5,HfLCwJ 8W'-<>TQ?;2ן=w.>(FTdžHRcPښ>0]yCj[0Lj&p%C۶NgYBw{x7Vݖi4;|u&S17і84.DOVVw.ء~zN\*45CFuq ,1r`&!0`ONũxqn%ɅT\̼D>Gt}W.<8p9yw̲"6쬅 VfT ?쀘Fj\*t_ZLa\=[t{IWOM3 +(S0Th$Vݜ|scs1n{5ŽAO$qhuFnq,a2`quVnLfb+5tۜ\+VHarWx ()jc7CyV-Cr0P%uV?=*4jRykq+LU% G&T3.pnC`2OCҊզnIז%6f٦CwW3&א;J~-c?6vSE,N+rM<_K]v#(Y`$d#f˭(o$/womF#3%'@}}Q {ƿ1޳Gt 㐵^ @3e+;sm}`W!K '˚g⋡17{s]*cdVF#c +76t6= +.A:{@N?Qq%4uRO\^L~2J F9~ +NiYgFȬiu$J/[[͠s=$l"M]HK,YOR*r0tȉ`&fGޕl=pfӈ0P'0g7oٵBNT`8z@u~Bcg}cz 97>M+0uJ<0ڮg&WmEhr2"2m' s?P +O]1sou|3N$--}2H9Jr[N(IVPt'~\CVW&4 񥼡!6~4=4֤~plV.P똃/c@LR!\|vA(gD6Ua1no>x ״э*5~ctUJ=gͫ-<'3/q<~T薆Tu/s&?&5iѮaEȼe6;+REskgn +0': +EIJzB 5>#C{%UO +!ĭ[HȀR?ߥx| H=H;L_ztp +>Aa‹wk@(WF]I>7#7g!.'f+X;!.wO8RR{Sy875\M3mi7So3*zίco6DsAXkvkf}P\UTS-![fE4MʉMo=!׋q +` +%SO*=:l'"Dm;6f|#nA@ȳhDd[CW͌W$=f95^`Pl@wi4)`KKW@j`{(ck̜f`tf~ƫrT|!UZ_'a@g,q"%T"?Ķ|ޛ)w|t;$A`K.lilqg J/j$^×I@eş.Kd8ОRˁC/#I78!ל_w*DG( gJfiͷ[x'bO`$+BNT(u +s 4 \i]iZMX)e>oMGXg40t8,-ĦWuFrQAd7Z/]>JF⫴KZ! 6}O|gMv'=*%%>?,*.Bj;f +-(=oQNҒҗ|i4qFt\pgޱ/>\]ZWdΰ6ijDS,65.q? )D|wo.Gs$BaC)cUlÃ/EȰ6^câX3~n)o:A%?=; Ŋd ZAڋC-rC;偡}Rtim-H-;(uNX˃Y~">:UHUPC0_A0^?(2?- F +<:b'y"k@PT@rz/z0jƞ/@uaUB %YA1[|<]%Tȥ) ;[}zA[u+* YtgЬc=%yfG+ +_95D. /G/eA!|ȱ_OtCe.)U ;2 +w;fS_Ա ڲܺ7Se(\oQx +Ez5ʬ7rRfρ^hb*_kVoxSkȡvqmʒR-jb$9j4O(Sl|vŐF<%l$ B9ӵHK{.f(VdЂ s<^4i%U%pa ]D;FeaޱGVq5O]S>tֽ$| Np/oC ڏ 6mCd"?߈1x6'(oחFĆ0k?E@m+mI:Qt(5N,P;kcCIӦr&gTQP"PAQgRR؃ڬ;ǃk ~} JeƁq\ V7^b in;j =+- +Gd>5bL"WqDEH|I[q7#1,ӌq ]&e, ON_Uɭ* +HH/WK:ᔎ?j03{گSӕMv|h1]4t' +J )}IfWh6 94,-)v;RO1H3g)G9}>9W 9q,= +`o~JgNlz03?K|8NK$VU3SOw=쪡GrkVޤq)Y>&-W2ո4F`8J]LA!NyYMΜA|y27~d])f_>LJ-`XW&dp`$_N`쟶gA!TϜ8|sGJ$%C@dWl5h +=WMȥ"%4OX~|7 ,N*7:f0D5"эrbw+.&WQ][HVx$!ޅ&W߯"S@1;i^HX)*5XZuF5k;'6s0׸FLd + @8%ZmvA\ővczm{boN5(3[RbLM/T˳)>@z>ԳLt+ 'ھô6b(!F}iPX_Ph!Ei˿;_0}Y31 +Wop:*QjHiTwNK28{lpf9g ~6<+Hx4 u Du۫}rfѮ~lx +P٨A&|rB34$׉<n̻c2dv4c0D*gDbDyG†vc6VXQZCX]3=^W/?(׸"vc̐H殖AԔZ +CySM:;kzTSH~>X#nH*>_?]v5\"uHG"RŦZ{064^ ?EI㓼1aQ!"Xz"Mkԛ[ R LhZ 2pV"9(7*{ezԟ}( %?ILBdz1aS%b +(}gq>%h?~h?Q2K8YޕvΉCd=9;9KմFtbۇ3 { vY{P}Y4m,8֞ Ӟr9a;>H`M>9:BBoV + +.(~O6&CLT2+=SVG1$gUQsz92eYBOyNc!ԢDM=>=0ݩuFzb-]}'AbdEz*)F"Ǩ , L#=fɬ}$xŅ\r9F 0;#]j:-ZԬWf\6(*n$G[n&š&`Sr  +l*~L'=ŬJUm+κ#=>& DF)= +yP[:gwJǒ!%b䨺~s0)Zη + Y]vJ7{/ٷJ,&'^Wr*Kݩ,&JDc~tzi)$G szt%(־VX~sX{b+H0>݅c0)!{n6LSP1CfB|@jVpiln/ߣ%>^^J=Z(m(GCA*s+8 +I+Jyoqg' 5} gN6N/z<[B4T~EPrc%5Jͱ-ld!Vbuȇe)Mm7ȯ-#cpҤ'Z+Tgmi>K\P aLKJjwU 8hcV'GN6?zk22cB9-XF́ +8'´nG46ʘ>,q]ypLVwxkt֍\ܢ`08|F> M!m.f>o\ZuORV8E/xV& M 7Tm߃㧮{;H{Cciy֛o]H8F||ëW45axsh}Hx,ɫ̆k(abQ+P4<5d=݊` kNW*UWAZ@)/w\~7㜪(2Z6 P rѱkͥkdz+(wJRvw]fe<lޔ5F$&sG1Wwv,ƣ^-Z[ru'Q==R5W lQvKí5U-иĽ-|)WΛ>a s (uYA)?2J&nj I +I۹ǒDr͊48"y =c`o,S.\FưcJERZV\F?YN'S#716X4M.cWS 0׶>̵﫶&mlԬNc"#\ȼPؚT +Muæ>\JaAYD%ry^y 惷;W&7@uHN3.Zd5v'!O`c,CY0[98oG8ԅ낊K .1 +H QyӔP`fG6G^2bY}mZ.DWM@Ӌc$ݎ-ƭfbe<1@Dځ='zbs8؛_=4i2 ɱ,Wb14vdf&{a3Ez$$UΫgx@#"SRBjm"T}ZoC͌ ÊE.^q'CMy 2+aU(zRz4};=EhX+U7?NHߨ{Gcq@c +Ħ,QRnbJX.Y>^8?_h81Pכs S7-ezV1U'5Ck}Zt"0vSNs?~k1s|pcXDMi=U5ǻ:&ki } ]㏈=kBLPrfm2/Hks*weB|.Z8̂` + ~ϖu%7M?Q ّ1t韠[x8QZ}xx#EQ/e #")=OWaWI߷?nze+Qqi*]=pV{BN1LZu!{ϟ&"Ժ6i~e 1 @?(Y@3,6DV .ٶB6X>K }p=@{>ɣ'w&Wov߁o~(TJ\Fcɖ9'B}5@qo^x#?[:§:hjGyui+hݪXUG8ZD(Ao-,AO*EkJ{]NDnPtXcR ?smw-$k>iax̛SHj z~N(3k]_*E\ !W^2z/ؼt&)dB\WYH/U^ xr,o~(z鿧ZLL<'ש-|%YDzYnҗh~Hg%cXbQi)4Ĥ?HUmTVqCVD6Sq~AеF1M{jX3KU*>IPT".]0".GqL9KE4)cI][ / +X8:"6>|uknob:2?XBUGYhX/j鹹F +5d B`숨E|Hm @B?_ |H6|N8љ9¼kFhߜ]bV"g.dun5P +\7xĤ3sxEąF:S@1)8a{z!| f/#\pih+#"YR (|sZ`;W*0ao7YTOtA]RŌkׂn~{ӳxɊ|[T/et6g' +B."Bz!tD@'5I7#xy|\.1eTD7O1/u3=dLx%Rf%hg|)x>KÙm-2.[f0g5B~mĞͦg!;ƪpNa}9gԇG0bpg, - (jrl0s E|bmQLg;Jul$UFg{z_n\ |4IxB?U%ϕE4c5p7DrF?\M<< IHKx,=]c5xn8&AʪnSi`wiS$7׬# ×Dn?(Q"EsioFx2+;g+si*=?l[dTWVRWDz0 SARk'JL}8N1R-UMywAf"41V(f2@<%qi6Ec(ȼƶ73= 81!kR!`6RLDeV, 79Xlem8." '$T r#\B)n͝j0|#Ez >-0d?B'Pu X뼲jVp.:g=}UTشWtvω,kxeGÎ"ؘg2Xw-C(Ѡ:I\v|j-jE{ ,j%x۳Y[7l)PH;#.ѵw۷ݑpne4Od[b8C8p׳T-vVZ,34^ccU t?<dT;< Tp<&Ni{$>ܩ5&8XN B>n$xeW,M p2ɻv-,P{_Ge2,E 7I$lOjA-3(p4`/moq~d2w Tr'(@#d2SvtBΔ*,81,FCf GY3Ƭd +?h~=cЮŗ~iJ5hz4 +˘wi/N\b#˟U4*z?ږbzՏkIysυ@2ՋJ:V Pi(Ş|K%hL&ukӭ)q܆ j+C?cpLGyooc!kȮ,}B({\t&7 +6}:ܸ`ET):Vh d.9Z _Ay +8C0D+YEt^OQ.Sy̗/+MVH/  \x"gwM*lwgt' M~<:X*3)497Ƌ?}VI8#?C쟘dwUgTq+o(ɄWv:'8d+iu cmPh鲙r 9y55ʨn$YƅMysI{NR@hph8i+dKjyuu=bv_`y*%x`(aYɽ)cyc5.2|fDEӽ +.ld3_/yY# Y'aiv>evv 잩VB=xXxDOl;(ct$}Dt9$ugs?6[9Qϥ3+c"ߤ!檀=}.䭧IWµYf6-^j +=M1;xogwu:,1P%c~Pd̊)-ԫ˃1If|3yb 5y*d +P5 Z<*GXM HUM@~;ّ2JjE~ۦI8:|3\L2lWP%1:H.7R QB 8 5^2͍9hm91EUDk-=Peqnw1=KD=J6lK^7yv7侅!dl-[&<<Ы84> qA%~/ ~ %>d*=U^f~ǧSkG!~GѠ7_g;?~A/}k%xpBEZڧCN h-zĦ! FϤt #񄈣7`;mnbbK 󢋹49"{G;±׬}Ȼ%GcU U nyK*;g7.3%kYO6/>X}܎h"4ui 0[\ w)R)$XukC_4Ơl \M#I\Fy[uany0և^uHrJ$E)o7Ka%ҍʈNt׋]v\@Nb]Uilo}EvjݺM#g̳(*XCs76Cqq2lRa +ٜYK}Iz4ق,3o +h fc ӜxSXNHAGe3r~xұ8=Ov% xvӦ +Ah.`붦4dƲv!#-lK 6.[ӊ36-cXacቕ7Vޔ wù`2PH#ͫ;;^f60?JGC7;_m[7Ci4|%Y/ yͦvsa 6b~ zݧhBelrY{`Fܯȭ*|rˍ]&>~4s6 "E,Hlt#](;KFJ`0sؐxZwӈI$O9ZNKدNԞO&yVq/C& k)jש!mo^n{ +"F(*SdCLn +8hewZɏbڀځʜň>xzf1~IxEAĵ՗tDd|jE ,*ʨU^h, +fN}2L#[fJq{vc]5slZr +bE5"}Mk:ťl05f-C>N*'u7z + 9 %]bZ>?وwɕ2Q3"(9/Wƿ xkZ="`2;U >eB+IAM`ܼ e76JjwgjDVs]z >~̃QFZUzΗrMW6%Km84CF#Bsw WHQS;11U=SmqؽTGqM:;/}2$BnLotCΔȝF.#.?v4u7mV` aw2\Yp.H `P%ALrYWzɝe7'{M +ԁPY)2ElZ!m?Ch$gJ3x u4a#jϻۑ1_KFṌngǬ+xy'cYC! P%A{:`1VV\/ҟkӐĴWmxr|wݹ}u]u_ʓ8W}tүR6)Gl jB]9𺗾ѭl-; M8fé O% +H$^L>ho q)XdJ' 8h=#M ] +b7b5b1rAO8 SSF6ace_ J6p/.?>L܊PF1ʖ=4w,g ŧoY2Vm9;Q#XV5yn.6 + _wqYڀ9zN8rAG1]D@IV'abET%!,%{+1Ӱl7&TX YnZvxv[b3 QHz䔓(v'NġW>юc~>^x9*j]Pk Y @bc#N8b~]T,p[qcK6%˄E[RB;hIvW Gji7s?: U0amTm`It?Z6=BM"_Xzĭ#!Re؂](o %5|Y/ $fbzIX6m)oZQTAy|dA5]7Ӧ (k IOiۚ#UuWnev]Qb1/1%#d+&i\ԙNØ\=5f?J"`*5\+( rsDj1*hy^fb 5zs|y$Q4^:jzQC(8c.VN#EA@ / 5/]R|+ /*Ezٝc"UfYeLփ(5Xz +R4>X=6׃@֖el3ZL[xJh 2vU!j) 7cp`"𶵗] ?,*4o@҂I+V^"K$̷bS潌Y3Gj/m.IY*pA{GȪZ'>MӂiA@c7u?`9^@BNwvh9"7T|YdN')uA z ŁV7E`Qm՗9q/P_g8Gԍ48Ixx0õ % +yy<ث-Ҳ܎+PpO.VtcznS5Lsh3MCZN*̀Lxݜ0@>ܦDYDhǞTTUފ~S>5jhJ,ʒ*D,(1H^*G3]RqB Rn̟UgB( H?loǍL@忉#m km2HֿĻ]/@l'.(&j`b[&_kv(W}+yC\L: +|~ڨ35ߴzk] +}݇,Tt&J٢UKe`xy= +ʻf/g"ӵ/!"X VzTb)4$W?Pj +LIjk}.b-c,3Qy"a=m6R@ZpY6 `hr +HȷܱHE ۠J,S_ͺM'9hL~fyHDB|~]?Ֆwꬳ9NV][ka+ +l킻|#hZ[МBot*2ҕ1S2xFڣ+fTs"}kVfSe#4Wo;t0=Nc G^Lot͸? ++8Sb^ƣ SRS0+)2x +@ߺp)&)ۻbx^kĄSWhԕQZ[ȯ+*VLʠ2-k#dr%әtUgT{.(e,[4 tts Ze +mK=P?z7[M*Y K$r`t<+QgO4|Dؓs@ +La0V$u239[xN|iw #(8A*[Du~=нힰ('@ +ZQ ,2(#\W-8T喔zUUvEy~w)vΚ:"0ذ7(8GPb)P֯kGC}z}aFo?F婄(8NWaRy/ZZvgB994 5>b+'݉L%aZmP G^WzwKORx]?o<O\; #Ԛh, '#Ic:-z=ߦZZ ٲgB;7E_S`n*[/U4ZUN:t8 sU O߳ +Y1 ~;rY,4zsr'E,/0{ imبp⦷b98Ƌ{1i`3[Sv1qf 9ic +0f,q$`VbH=ʚ}枿%Yʅ;qӵW̎u! A[̚ZtB)J/n }Ġ֙3[⨽].6w^<.M*]}8Z},ȷFZUQ4 +!Ha\eYڶפ51v ¿ͺ# :xl)"lSbt}b yU* qY@Xcb3 cҒ6npFQ;U0x S^ǜ!wCdzlgLG@Ddzք#\&3)r>2󰱬,4ZpdY8&64I?U ˇL /t|k-=[4uC\RNS%J9F@.:,1Q/MW r'pd2o$"$vKͤ}H =(C? "ʆr ZNc<@u\ $^LVnDKpC.ȫ:;›r I fomϖ)"]*Z8ap<[Xv#)`Ka:tV+b0z~5R R +[6B`kZVqgcIGXFkESYBJyy{u.u*7w}ӰHb|N=~Eju,g`幱(30* y\"1PbM gGSU4$I?+D԰a-d<o4V0#t!d=w]V\z/ܻ$*dObm>1/u`.v}m> 9ӊXh^r icڼH +7E4hjzrdä["^N1jO?Y`Ͻ)(z /KDw;4=hy(zb=q8Ʉ;9$o̥Ł૥W F1j]XH8fɉqxs 83״TNܐ}~yu66vʐ^4.np@cl+mpp­[!.;gvI?" 4]jXoH3/XXdcy}8|wO0BT<-( j%[yIGR7&픉A(@KD#nbovUham d1^e&L-`k+] +缴ڳvLlJjyw/,]eb١o`2tW(踯?KUG&'v~{MXkqLl{)i/ѶxlܽS/RH $s,xy=[,JM s.ף|ɻ|3fMO +,ru_覤 ,}S$Xϒ`62DRnr ] &^LMZ(ͧ:HZUOM3K) nŴ.>?SIf6c_VTlO ft/z'Q\MP[ tn5zd:< 4^Ne:EWn6-JqK5}Kú:(H=G1[|MNs`Cl)x]u]: H[a]RR:Jʒ*͓ Ʃx"A'6s"'APLmR`dfXB8rUAOdftV;d$Ss6F`-R1z>?byAeC/9x؟o[ b|U^'_++!iPuP͘|z=W|No:|)VQr3?ހ։u AAkNBuѴ73dEGr򱘧8([[`2iQnT=8Y +E۹GԩK&B!qr7Ÿyz%fz`L!e + +V@kZWF'z}U[X .f~@Tr0But(ɔ8 +.Ap@(}C5 "@=3vs<;@B qYTi|38bW +bq7jG  AϾNRЧc +Km: -4oIA D!e)+Esr0 4ָ0A.[?/B~K6ǎc&j贑+Nz5/ +) yZEpbڗHD~fl-6W0%.r8|#L4]j%53e“@zn~>"B.UA/ȝ|QkR$\Ĕ} VԶ{eB H +0OUͼ;ZP3|sv3+C98Z7V6wS +Ծ2hZ"m,aQ c8;eнs4_ѡoc6k.$H W?_GjcCgY`d 9R*: P{!KSlӋ1Qm-+E2q#u]<>3>^mİ~\"5]_c#8U?Xu~08i ɐڟ {ԄP*6W[ wQ\`2wKI{-a^( +M> T-Mu͖z#(VMgZ׬43!701A^CF0ְiPA.v9Ǝg.vTS` +.pjd=rXólzcf_jB`j^1!ǀdMصK{'q[oc`,[()8+ypwTPG'KX68;b~G”_JָG zF:dEöȣV8`9su:C.tl; +i}4$4wyŃQiE9 [Dz9fӤ& NlbVE*)_%Sܵ'KePF>C&ubvr ܫ]@ƄżN=zs9DvL͐8U,#5>>|S~ V^0$P^ ]?z Ԓȷ*U"T4-ygO*L"et=~I='Lȃ~, ξT $8[ep7> *ΐu绞xF? Gt#aWAȌկq +9MbQ-%/oO"D*e\^Ah@=wɡ4BgUT=ci6p:y ]Froۍ0,!$S^[vθ=B ~s3o^I`V]"1-IØPXbh).{z,4`o;igsJQX;o Q@(ߔ)]([XR@~GglenuƽIt/DRT`Qnl_qhK3a{*OCiZs`HaZSMۺkWbh 9YloF*jp0'tX~K{Z"FP'paЛ)9Ȍ$61|¥#dg𼜝SkOnS}+AҔ`GnjT G⏶8KY*HKTvϛ@ti^m[/0!9N#g^%pP i(yӺ YVm=hkz+"Bk3Bdp]|F$ =Xzhɽ#mV,WD< e)Y#lDg0s܏Mr*@I2[OUobN"m/$x-ɼ͍*u"m_mS55薯.E&-N6{i݅&b*cp<]S"^bn, @2KcEH[߀(Q˰u򕫃Y;O0ԌVcgoF:?S`f:M\3)b^ 5LsT2ҏPP;*CW (6!m= ۊ+[wv/mSVP;P- `\KQ) T+AwрI6vt?;i}7Stԟ.kОR\X %; +Zzy| Rq"k|b[Mu@gEPkN;]gV4e3'f^61LACtKp22=4I?WK[K3c>׬&׸I5hu9-4[-U[ij obB1'iMֵ0C`Z'6:_$A"e]FQ{=ojd t`ۂ-}͉j@mi*a;`cIeO]D`Pq2*`ҩH%fC +}QTLM%ҁM>\6Gk7ay&?:@m~gDiO9; {{6b4S#MK,(EXPsB:Z>Lwt2IaWi>/;AOn7M X ~3Cfǩl&_MV.p{ !}u1%;lqsXL1N/f9PP/X6 +\ݼ4{ыIش|wnJ%>~4{:#ϫ |bEhXsk;} NKnTi%iYe&*1兔N b򇜻?a6Ax.x͖Fy]@_L7iЏGo|kֽ>Z)eNkGx3%ZO[^͚ҠQ P|1H=E"|MtAiDpQu'_e +zt7!#JE +G? 7}!Ǘ Np~3=kXTIN 78bkL|1VFE6$0c)(X=fQ4ѯ)A;gt?d(3[/֕P/!HZ gMxMRSLj/d|Nhf[t.jM  QUiռ"^ԛ2#lsjۚ7l956ݧ_z7^ }g{pmco2*d1m@YrA!eƭЮ58`sVwxTDgc´ 0vfN+{gw}a-Js"or!^ܩ$(ufƕ=4v%qJR1?hzO}!l̪ep(Ѓϳ*q1q9Gzlj>6.3ۊL4wΠ>,OiLR͇Guo^eurb܌Hʝ Cuz-|6CB:{ksXj籄,cA'&ᇒ15$_blآs{YˇA^ʳ-wD\  +_;D?D|/:W cTxG,{3ֺ|]!JU@TD[~^i~>7Vϖ('LArй/%ld+) q6div% +$lZL]~ޟq$?U`U6Cm0FD#O[ <,SzXʹǮmyM-KnMN}Qc8Ċӄ[ _{ T=B> o,zm jQvƟhQ2 oPmyJ{O&%aJu`81Xg^+RNc;SbHϝ T2+zEo|乑j8ş31k?e6lj2"sD{x +f&'??gL$6 ECɁEwGqzpy8"H +NF^B*+:r[^xs.QLɔ&fF鯝_+־89E7uGJO8 zJq"7F[qh^(_) +2Bwp&@@9N3W}aiWK f?DYǕ.q1!?XWmpdv,T%^.3s_Ѣ9 c5`]},q(-n޹6yLLPL-U?˜M:Bg^÷-45".}|q p<[a,[p2q5#TA>MKVB3uGS S;p"_7;݂J_it1P0CDYCx0C$&) 9!z@e׫Q`NRY18z(zf2NSb35HtIn\[c8:w B\V5 +*&#o(@{%RdsU;̊ 6줣͈a,$B:9g7PN<ۯ{M"TtN܃&X UOz4cH:yC.JY%׮& ZB? endstream endobj 2423 0 obj <> endobj 2424 0 obj <> endobj 2425 0 obj <> endobj 2426 0 obj <> endobj 2427 0 obj <> endobj 2415 0 obj <>stream +HWr}Wqs\\N>qV*O)%$@)W1>}WZ"9e,(SKO~zb+V۫kJ`X / &ܧbDۢ,-X~Z_V߮;vp 6W?}ؙg/d.\L@ d@=Z,H(j_T+xB=\a"v<}/h"s>ʇP~ "3Onp16=hpjr!͊Ef0-U& *f)8 ٥gnŗF)vX#*'avaqqϣu_SVryH_YSTcj(9^(KS#v,p11c61K (QLN}­aO_Mׁ#]FBh +e< Ypr>=׀xJ1DsqU2|W(ht#A #EqsJ+m&LYDy6 y'266膜 %,t\<5?|J +"B}0SХ4,KӇJs%!K?;5H- dTD+$fkXMxBXvC?gTrKw 04hp8 吋"d=s[\.rDPbT̊_^P>Wj@*'42ü1H93ޜ[isX;K~;9SNUaO3@ewEP}Tr {jXWT2hab:hǟ@`' endstream endobj 2421 0 obj <>stream +0 M@&9 Mi-ǿJnjr5S`!Fݓ(PpsiQXbm(O*d6z/~jǹ 0$5o>j}8)fCYχq``6C6A^ʹ̴nPcT]3->$qz!2RŗFyFӧadn͚P + &S4Clfb{:b7Qѹ!mjRu(({,'#?` + f܌]1qYn7;YOOܞF%5!a˙͡?R3u1v]h== f)>>{):ILo>K'nUdDɘ5yXtG`E0i}b~J='!>M^?f@*ek$J0ΑStB%`-L5\vFʛ_To MiX@P3*W.CaA8c]D f1+`0YqY~%m{kHrI*ǽpoţ-Z 1Ϛ^ZH;Y"+QpzDuq +6jfy^g5?]:MPЏR4CkFO!!SYvH73+At+Xyy@YML4"nd= ,S;nnW*x jdC3]n.bgg36n-6 g#sbݸM6#vӷB4%79Gcx7\s~K"cdnzih\\f2`UZͫ]~NYNrNH PU.RnPlM躯 BQ!0rضZnD#3һr-ه{ΧPYDg74=0e8[Xi.~!ym*p Z[#C NokͶQ 8Vh+&cMXUu+xS[ʬ/mhA'?<޾O~j|ӲEC9?S/t„KLSM* +k* +߆'9uϯ$W5ؿsB:)ף1LHc8H/='4_ 8u2i(wγǽЉi㉿ȫé;Ƅ a!cJYg~,z^oDmnNԤfQ)XdN31Kb +ۧq?7b4s0~ԶCqqf[DyŪ_94Z@ah⒲F9t! +Km'{S@6૿UZ7uHܒ03}¥l-O;OcTeTSnNڟXw`$#qyk n=m>*^)v>8A'bs!"憇E Bu[oYQ_lzlik1(nzsݬ.%pq|W356=u * :?YF @H1;Btmp°fSbRLΦB>~$~\zZ*HkQi&5I:_SK*24d(J+b% 3RhQ®d9yz_Uy֨Gs\Xl<m={8ۂإ[1F9|))̻7՗1#\C셌1|LfX2|·kW~FqX5s^]h(wM*z5C%-?p㘑[z4$CRcy31˓tXBόz[hb/! Xn n*y+ ]hTFL{4.u"ۛ&/@wAMK4ݛEDA Vدrlyam/>EP0TЅu 4yAeRAOlYlɳ/d˞5\HVᅵ'\_"bIĿnxn'8~0u Q9v^1^ ^򧴉B!@ǻδ]"߄A˙Z (n'w6ÄW>5%~|9C)ܖ8WhBQ";9`'tC@G0C\eRAoF 9Kp`h tuGh?U}nP! ӡxCoZNW@l0)'Wg],)o'*Qt{DQ\Exp'rXj7}eL4ۡnd +Y>%f.RH}o~JfQPAyM+ytՁ$'<9 +SʌL|c Q^5gvW [3v H,TLLmeSLBv8ɢLET(hXu?Lq~Mw/me4~ ɨ*yͼZ¨  Ta7\^M{ZRɋkkuzjRi +f&cXsn ؤ*I;(O'M+)d1GdmuX }҄ɷc Jz0Lljʥ +kԋnB/;;N2ӯk3kILMknθɹ5& Ɨf_`ts7x+X0Gqt? L0L蝿+x?!,+ECILwvmD *kuhBWJ1,>:>{Eyg78 +Xx[Jʘ62?\>:ќ ,s.YAi/6;8ynJ<}ly>mQ`QzeprΚ(ʎS Qes?rA +:qf8hz.Ka7%lBok} jP5t(-&5LЗ>CH^ D|-\ɣQGKXwakq >oITxIz)7R2Y;y0}@e'mNӐ78>VVc/qjBk3c|D5n[+Rđ=g>`}-^H0.oM_8`v&W+KY5})bi]ldߟg^U:'K*4NFȍ1>y}^X3C<2%2w ZIߙUћW)oY0cڍ Fa˻ l-׊N$iamtGd#[CHtZ1' 7ߛW ԣ`t倏\8A{1uDB7Y̍I˕|`Aݳ\ N~ +CL݌/~eRY^F+J4**jvI"l%; !!g/8Z[!L^tA!tQvavTK u\0ʮL߭qbKZ zݮOq-i6 ",/W+-P[p %DG 7 { BP-챵Hg,nF],LJ0FFRцr0L SNVIrRs ~d.hM;\(dF$9rKs? +)M +13aJ0Q(!G=p,+8&d-}hSt7zw_y~9^Z*gpSr6w*;$f(2uxޡ;] Vśݪ*#>_dG8F2΃}]}Ödz;!!`8$4fKoMcegUpu@Y}ڋcTF!81ݟA/Ise;O8ͣ@oz]ժ}6jMax(QJ"{cEckE^ ݓ_SϧKpoØ!=WqÝ-_X8FFIGQba9AL3 D}aK~g*FR4x>m$\G#X9d.oa[i41E̸_35fY|J$ԤEv?؁EoB{H:& +/kd/L>۬ mzs_Gy`W(4_^Mdxs=I4kP>缓'yqqA:P09&'voI(KR;_ao|@w 5A<"7ިMu=DNK xVP '0Fn8z5oRe"e|Š3y^HCꀬH{ +ͬH>L /iHAW] b6ܸ.nϞZ<!6J@BT1<_^6xeYEo5`1\{ X âQ^lYfH<[0])DWW|R^ #uS?V`Y=v}ٔ,Wٳl +|-v8)>!8×d&cLsMhqdĥ}Ab~2,C~;H)0&hrxe ϦcFtw&@F)/vza}ZY1\)N5|uM("j2~F8X]Gd0E]TeOGY-CaTq?IZ.R>h%3)[v1tknW"-WNNۚ>u&TXgyaZ¡{I$ѮHvW0 @ަRM|>o|^ |ƺxNnH/~CojSYJ9}c+G؝ Jcl!6]6`W_"ց#*˷cz[QHہkée-j{` Y*OgpW$oHKS|vh[ILmBݮ{g!v*'y8j}ubj !4:DsU: z{'\"䷛SeY5}+$3Bqd}мdlE.{&x"٘f5N;bJ0_ln Ehٷ^4'EGLpq{ #nxc,KIqo$cGa%$dG9l{fkW{0F6>=zk|T c;B9wbH^ H)u,=I>8ӂ,H w4lYc_) mHj`kv/=.$woJ7RsmUS (l;gP \XN>5vQ{"db[=C:@v7T{yqbtdܷ+|gusT3@g8݂$ߣEPHCz7Eҷ"0&Fx/UL$9B @eD$) :XHWpAY_m+&kQ׆{sIW~b7LlYih 5ƴތA4*I &.=z +${Ɵ`qF/΍htE2ȞK2n5yB2ޚ0 <.GGZGJl#yQ:Vk&ex+45ЕZ~pvwTU(]n\6zjMȐ2#j 1W4C"RJN1U(2U\6GȨ| q-0.- QA9NW!˺͉';eC4bwnj f I֭`bΙشS9Q(1&msfBywIJ@8vo 0`3߯@Kb@3$}- 4QK,Ltf}x0;L."Al:>&]2xCts42<" ʓŮk;A(hA7ºnQMT,i!my~"hr5X9 9}vP?US fcOz +' .Ԫ¼&)GF,\_E?r2A4p/Lwd65iv /R`r/loFPoߗL?le~ +Ci#SN:sm4X{z@d< z tHeJ,ftN ޒʟU3-̎# ,W|wСP11KӬm˞WUTѿP 򵰡![{雞_S.A|@o%q=8yQgr7goՑvfQPHx,Sd0M=D׌ĵĮ 4+_D48e"LkB!|Zj+8@jPIƓ df/#}0 +eQ$4}N@kIk{AJ.N*؄ -iSMoNǼ#Eh$kIA!8TDev{?eXGc' \-OVz*+ޔᡀ>Rgİ|ę /`*5` T4Zj!tkrUfufW!-av6x1C,$6`5uh'*,5\ҏsSvF)MR(ݟgŷwt]+ύJ/Zsn~ yjLCLJӱ+Sk4)eӇp{Ä\@`kybUΛ C-hH3=`j#4P;̳P=zl +sGilNR߫ս#YEF,]q\_1'H[E +U?geF?G֠JLG?;NGw̻H<>_@4OMrD6Xǂ|`PtUP~aR@[1nFbZ PݘoO,tA4"X g43Lg!$Q q'.ice$tz5l~"Gxd۸VP$ +p⼙w-8/g}~2.L2=hEˉ.n,9^;" H~uv̱Bs'f=YGNQ䞙y|Iϋ"OL92"҃9)hW3PNNd-Oʽڬ)awn=9N$Z$9Tg3`1YGVd*MH]P{7 4' 6S>J脩 ~33hތ̖wVYHYTIRA™-FKOz#ѫNQ@ +&"`1 EZQe(O;Sп'-Gqia ٝBc6NY2g!e0;;z~[)UN3쐺+nѦ{[D?lnjPaOu1x.\z7+34kA7kUۊBARTza!%N;lpUchP1eNG!Ɛ%Y򁁱u6NՌwf&!:h|[R~-e+KV48Ƿ]5%Vcp;Un ӦlpEH m$ยDZ.4QbwY<ls?ns'Ȳ4wٽ UCwcRnծ0x9c8VfX->_48d'†;2be#C1ŵz _x`FQ/O[2[6(&`QjW1ZVm1TtIt g ++|NΆ5o$lEbP%H@vP\6wU?};f$˿!WcWNi{ ɾ FheD9# y䢿1$K;6U?E:iK; 40\(;Pp-TҐm~R +|pu._7TX/Jţo3Q'Nu9,/ +PRoECV3@X#3Sit`DUۉi@J!ߋy]ui0 +B4,Wʹ%-IX +d`nAн=cbH(Om %)-"-}#c poMУ]̑0`"E'%ѣn>J5* 3P?=&%PBd ^i{P&x$CV9_c 0uN+i8Y\1:? wTY9ۖ9RA=1ICCc}4iR"1x& Tƥ`3lV>zm?b~!kYUz0Ib>(TudPNZ-?.31>ݛc;lhdkZLu0LIl +:6]`OyA'84IQYe@xiN9NhY/ endstream endobj 2416 0 obj <> endobj 2417 0 obj <> endobj 2418 0 obj <> endobj 2419 0 obj <> endobj 2420 0 obj <> endobj 2409 0 obj <>stream +HWnH}W1"`0qlM ڢmn,Q# [}cٴeixSVWbXOQZ1C(fs,>vx! X^,IE8~?|!([6oVQ61vo߭~ɇ?]H&+&}ObsB3bn!:3jS٘] [@p=_ckn~{moax48 +ŸĨPZ;$Qt/2lQLaeĿCIe4^7 *&"nGUqEv+.NG|:^?e}l*B Vу5@n_`mByx~ 1n8G%P?KQ|/8#:d%uJxQb\+Dɢ4q]wz(Z#Eaaq$(T`V@]m$M{,EWU=\YԖ4c}.7 )}$dRܕ5YQCpק\9W@SMwVԑXʼnW (K 0 #_lW)Rx 붯whx+8:qVR X0OZφgUڎ9?CS RW"AMouxB̈6ÍYb4h%ݦih8ٚIhe,aB\"`mMe<]} 4jȀƖ%Hbnȯ%5pV1kE3x 1:O%& ]xSe_?|9"D"@Sh6͢J곌-+ZW + Ftf2LW%9q-jdUpE5?FPݾ #`~t` pjTD.sHD@"4ն?%cZ<9>$%LR6|hv[?;3>d`^\sK3_7=^$TED&YvԤsfIy˥ es9"{mSt}Vl ;>QF!FQo1a.a\B]%`]l: 4 +L&* +a!%RE?`/ImVl`f^/$wCýDL%3t2h/ 3nzsFRi$%AOlZ~Lu+c F(笈N9o`d;~T8Ƹ -9ppR ʏ8wNW9CN78phύ$KڪEeXɟY C* + m g +h:nzAq~eA]L3E[1CXܴ4]TTbtg-5Yvn@b7,4IoGU>#ro>lNZq55˧wDu("F ŹYr:p1aNj ik{S|b^l(ul05fr"}j #hu¡L=XpW^peYN6'zaSqD s!dȐ䂿o  c3i;L PD8h1a6%7ORբʹuNS?z+ 6IFqhN֒LI臮^GjCʂΌba -4JAϜ0MӞ1o6d09ϒ(QqՉ=ՇUlFn)EOQFsbEF Q'(̧o:C_%8T[a&c?1$! 4OS,E 5,ɺ=]CWi1ѹ͚&Cߏ$$Ξsfnuv )XQPjPfX xށ'f*ٞ_Ɨj09Q*KP=Ęh4 fYLR!p$ 01y|-*pju'Y2 41[&s!༦[yQtog2WJKD鰲H6)uUv$i2?Iq%v@Lx|bDSWs+AK ΄͗S +Vw7 cWKb^?+J^N&:Sk% Sܧ4YIb|l,($t.Cjg4 yDI"ާo*QI+3N*zr:JȌFֹyu98iC(W {A8-_G@A@$z +idS06ܭ2kȝnj\bEVj7&dE:kyTgjuhz"C5iYޠaؕgUG])b՛Dw{lJizy[d3bB2=^1 6 kjʓl9&qJA':X-ceCDC_A"4))5r .\;?{n! +;ftb YGtZ#iϕJ{or\wNyB(A&'ڶl AJ_aPe1R6b Lҗ,⾼\24U[$dzv@|'qtK4qqo ze^ҌVkzy$٢q$$IT gTaꗌ .~Jy7cg9YSRۃr*8,' +e>stream +0 D@&` D͇aqf/KNw%nѿQVuf@'p +rzpv +2W>C%~,;xB' 0W [O$N +V|VvYF&PwQ127=6pɣ_@B3cqլ7hWeڍh۔^_k;d|M1,_k"礼[GD/ +G)d AIIxK_iOӽk×Mtq\b6JTctNNһa1R\Xt>_/̇Kмf +7A\O5ld(c,GZÅ6}(y^p!s6 Lmd5 h;2PUyTB$^V+MItm$%BmX~ƚbeX?D0qw?ФXzME'z!\BhQL/쥹딐h5dBۓڳ J*%A9\/nsQ:B-ۙZ6L/2 aB +j9ъ'z!*,~%;em0q*1 D!Fh kqʪ?ڢ &m@dh "8+R 9~(+j3dܢRN=C_#1zxŅ$aLiQΐS䩻#ԱWLS@}DGŸG/E-X*/EB֎7M^cPp甖r(}풂hetpeq5[tnƛPtle[ [sr(=OWAqO\jl(2-02܏A~nhM8/cc^tsbmDK + CX0q)s$UwE,ܶ\QgBnCh;θ37܅HzGے1ͫԀ ͮPwz@Uν$ynӃV``װؘT}  + i}>CϢKA7Ѧ.PJl-,B)Wg͓I X@OF C]8l7_a+іb4 Qg8VȘ"SU5L:MxRv '`٠1*8Z~TZW2E{K35--z_KoBDPizC߰>ǿy(2 +:ɂJE,t|SkkA\|3WPBp.H] ?)5:nA!7ǿk=jF"',BR()sm%5`ruu?_vpspO@MRpd]{8evt7pōJjPHR2ˀʵ=r`RX I"Xļeld/Ӿ䫑 cE14xc:?q HU@)iA?8ފis!(QsMxXIYJ*KLm HhGz9|[m`@%T7[ eroc8PY,!UBM1γOt.X\?$LÐnh9nQu}KS1kH[IADBD]οE7Tt`ѷ2b-kJiy +ҹI`0gɟ +zpTdݹiyƞUXOژ0rraS=Y%/.{ڹ2PWv["4}!qu0eS)~_ +VgYIuaP!{NW+ީ)h&jqЕєIGaIŽ{jd+@,[WӰ(qxa,fY!@ΦVſ^&6m4[y + ˢ0.rbJly*hu64s7\(jQhD?tyS'"9@^E*1){Xrqz¹%^t820+fK C+fX@zWx kT)eP3&g eo pB\$TC3%@߂IyFB 5S-x + Vwssnc%}(?RyxzXNih6ܤR<Ģoy.D +X&!vqwzsvF-LnP& +Ypgo$ettB +X/jq~k!vG4ص4|5W'~Tx;BWa覶.,3""΃Ps(ejg/oC'c$32E6mWjsO a +qtm_(_(*7wcXt.7xxlF6_Hh?k9f,=Ob2c4m^%MINAK]i+hsX|h:g/xe?( oſR_pL6xjqOeWDC +/ƾ;VcrSoYN 1vMﳞ"-.:s$7_ !-PV,q-`I֭[KhD]DtsݧLc@x.8U^%@H<ńaLӞMEA4:GVn'\Ay:[v*rEr`h8aH|Ew.swpxV".Snֵ{ޕ`4d"X,"N^G- cB""4o+>6/! +ǚx}s!ѹL,6^E<t8-Ye? KL<{jӤԘ`#EKlȬ[ p9߆Db}=iI+p>?%5&ZKrV ␪yse*~#!_N@  +]x)d=wZrL2{S'MI:#ĖQ QQc)By7Ōt1yi=L9/߂>IZ吨SsB^-~kv"怃ZMyf8B p7TQqӋQ#sxڲ=5*bPW + gHB +vvq#Q6"6-Xк>(}Y؇tlr# s,h/]%6YtxGmTd40G}A _ %|P:/˾Q[a})|ܒ` _1…Mo0 E͠8b Yъ1]ӅZ4uM@Wy8~ɚ^VS zc74XttPr0ɰid0a\ywޅ>1z<5#CcDL#EB<漃1ymMUO֯GS~қ=v6i:͑Drm>Y 2ӫY $O/}#?VUQֽhGa4@N٪&*p_`<͉6m gQaܬfi6~UA: VA$n:,g#ⴆ&W21܇޶5YNH>&`M~4]jkkJ.-Ƃd)ꋰL:0}}fFXaB.,r"ܕj&8e|u.h@`LѬbLN$UCntTʱ:ASxKqzR7a =Yiԗd!v9zq@ҙxCUƕ!$ f v>C +b?1EIP8j4pcEyH.8Ŵm|wq̝$ \Q>}5N8h\evezIFVeㄭ[pVv3+ATCdiO 5_ G^5`ۼFW7 P4SCXn +&NBO|.8z#4mH\@ZA~.΄A ы}1Q=M! 8z0}18OhHۚBp+.>#U[x6SB0 "֛$Ww&`][i6T1JN_)3/Ϻg6xE63pDE p^f`Ht@[" zYЗ"پI=#`} t,p?'t."MLQ> DXnDB!ëdv@N Y[VAN*W?HnOM VSOS!}<|sGoWg,G%-0>`2scWcO8F>dv+L~Mh8^~+nWtaϬ/`@19=f"tAkp!㿘Q8d9c'L**kᓹݵ_@KiۨeL,*h'H^ԆA7+ygx;t-4hwLgѫTl_'pI'EѸp{M9pj1Yd|VkYz~EpսZ=5z6Rɍ׾Lt N^B.B=b2$bpިE}'̿Ҳ|Qm kxSnS4J8mu-i&n|Ȱk%ZL܂3k)'+QV;3NETٹP'sۉ Y@ǵlqqRs_z$S}0g; +P{ׅV}w^kcLB,X3q,1'pϽ,So(3}"gg\1Kk-26sC{´8~%TcJ#h |'WJ Hg8h[uj1KiB#C gTDOu(TZ', +<^s[u`)к9:#@ᤨjѿM.QwHN;C+.V (xۯGi8*ҼKZd@Ee@T}:\ZtY"C~b{93/"~3 hH;FѭډXG-}4ف3ZP#s͈AiyA%nMlR kUo9`TXw +IRJ$J8GM99^lB>Nœu8 _ </J3\K}۷u &AiJW3%G6Ӧ^˒Ar< U(TKyX[>C#fe;y_NX4WSZpŏKvDu" 6!令,H!>9% sh,ۮ/7\0w'3jb8N,:Knᮟƌ,AÈ_IV|<9V]D^z'?%-|NɅVKݣNBC L1ϙ\]BhŁHu3=j[iԪ^2uS*N<ƭ\AH[8o-@i{ѲN_GN|S-Ӈl4fZݏnͅLOH|śGB[U72xSA䌎>"D ^7+9x% ڔDHRoW]~^{IYp-KiX;L&euD|եX~A$Kt2CҘ\vDJj="iADEq̢0v GL49bDM՚xq{=%7 b"jn򕁞ʓ̠7&tF +DH1UPA +N +2NyVw E* +7fQ¹>?u+_C0P ɘy{1^V8b(x?+֭ dlPVRf/qѼ"(ZZԣ\ SJ>da[F>PYC4#6=zyKg'\1 a<3yMqo5H ++sQGVJ;Ea,5j89]T +0h5kk$q]0͉ ewkI2 ޖݘûۙ2ǜZ T{csłaB"$n|3)VV&pxlޤ6w=SI1}[[ ?]pD +ʏnV\{E~x7 xN`'}*|x*2Z=6d!P•t Ɓ`3ZQ;W+OX@uJz97QrR!oJЈa\UIzϪm"f34Hxz;`-$C&M{]Q̛:wW@BL7jָ0S^?j98F'DyF%+{Kb/Țv@s/jI؎ą';n'E9{)AE|m!(7' +f{A1kave?{LXp2;{7_v=gv٪NiVοM ?+6>sdR*{-վ +!Eա]bSb}2BVe,If?mf>P^-npEs񒲄'Nj\}r&ViJa+$F'V;wf>T֮@]s (3Jrz +B6Wcqf0:{ʕ +EldG1$N`4>7f5-Omb2^);ֵy'ht3RzF`um鹾ngQ2J@\͋'`+ +blќȀ^悢 (^ WF!0Apd%j9P@(jc륟-ICiwO| I-`53C 7_NêӤЯђ9#@;Yg$mT>:Yj;80ӡ9p~ڧET Z1܄*]siH1[aE%Wq`( E/MmLY!߱$uS^ni0*=s^.3 h"55P'π NⅯoJuqT{dj9hh 4THIeT=S֡jc",X{ 9 +QQHUmʸx4oF%OKyCn|VDޛr HQ +m%F-&R%F\#+3]24\ٻ0z9i`T㨠5̪kA爇O%>D==I +ϐAaΉ{>ξZ;u ##3&\ +?b"#PnrVA離&VĜ_:76>JqFM?"N 7 *5+prjP)u^^?4K\!op_U/lDIRm]p;XOK]@]ol$yؙ\U Ȼ W|MiaF$tE:Qe¯H lbv5) alspE20{hhmr,N|A,.bNgTM׮ ~Uj +8PL[QY+>O*cZχ;땱z$Mk)DLDEyz:BPfS9(V=L"ePgUKK)Ȣk% iFQc9}q6>Mb'PSǰwi0hQrݭrw-wEj-ˢqA'%\,9Qݪ E4 ʮɩh}z YlnkLV..Q7&`c, 帀Ҭtll/&Y:.WQ(b?^'P#O` 3\-@;2N%aL8 g<%K^D+IXM%NLZ?Ȝ;78]CB[: HsXTP0F)ǽ2r:xbϥ^stPs3ᗤ2Ru:>xtcjd돚Ŋ-3CQ†tbr>"=(y>3{g(t6V5,"/sxXN`i-ю粌!|Wڄ&;`UDkMs=}\+ zEZBb3DFGd-MT*Q2B߄d.BYckE|%=^]JL\ZpFplJPH˱Ev3 ;9O^ ffllR lȃה>I-(:O= +qݔ|a) HkKfx &{-J$^-zl m>ϨL1F'lB$v-o7vҕhHzUCK&ʂc^=UƸ4724ybFF!뮧!h8d%%&Q37mZ}>?f,< Q*5=)+.ͲA:"7/r{8'jāwSy88bZ{dzu8=x1]0-2ﮫإ$י6e=]&72 Jo:,K9`p0h-uC3kOgc^iG\1^fC-0yb 1՜S͖ȧD|=hqUw q{3}@3x\6`AN߼1GUoX@+ӧc23r>hc_q2Nf\z.X̉q: +aa\ff ++︃hr߈I{{ 8x_zԈa=3O +3B%jY!,{'mF]*T۪ċ=~TLQUɃ"d |;Ip_YEk"t2&K#7MJL`;,yF~X j +n郎d /VJ/v  N9Gen3tgh2T+|p$Yٝ,??eo|i,oՁ8ߺV-Ui^0-$$%oðkmڍhWd%sp +$vLklXu] +k)򓽢n4$viTwm+n̨Zk'Wp8FxWMNNNgs:uI*BXkTvӞTjxVYt2ͷyCEhUd!@cĂhW^WZ[*cF=7%q<|=0_^e4ʗǍǧEflc %O6Wz_SW)-k+F@?pU_P?$,snsdEX(Hי7dR`I\-3Vwvuau 6uڞ5`b׾(bWgOZ h4/j7=vA$sw/@ySU3#;6q;F' ۱Հb}/SXa +T J0_ꏉa'G#fy4$+PSol* ׬RUф0Om0IξUQ N({VZ6q8W70[I.5Ԣ3ЗOk_-N48lu +X5NT!),!;v%wqfL$qkch%GuQd…wj/eɘ_*r%{nh`܃Gպ&UVs hy|z j4iルY[n|07e4@͒D(KJy?@ޙ+'dL@_K9ij@JS,ɕj׍xɟ9w0tNyWM:O#Vl6aKns(u!duFxg\@ 5L'Cue) a+ VcۇGJT4IvOx7r,'m* HՈA>h.ZV߲K3C.h~KPvխ;BiRřs _)wFF^%aWi'Q,Q?ZE-:T6[y $nE۝ ԍ +C)&d9j5MmT11e=ݿq]+(fpiyBbH'_>QOi/T5qnxF.W?wv/c O -Q~E ;OU2;ӷHQA6)L.%#ٙI7T>H컱#p3Y/8$ARw"4d[Ӵ6PΪu`Gnp䰶1%κ숔&>/~ֲHu|нebGPIA-&`nPNN&P^Ka[~@.VdԻA=VPfx~+w님1A8of.xP2|2= :FWwAC;!k +M&96ۨ T4Xǰs!rc ^;Z6Aѧf:j#s)]D;n:r +:;4i-Ŷ!R0U + Ch $##J"6ε r6d=JX-%V,O3LȥD"rGx+cߤ"R5U}8%Z#齥 u&w +F#fDM'!w;L*ה)b(d0pY S/`MJO1YF}SЍ,.x-bͶt1y4]#<ʿTĢV,bP"4Ku]>˰%γ$Rt»Hno[hm!kQY.AƄwO;@e %ɗ yP*޺'x9wn B m&r)d-wb])_$ŰNR* ŏ6`LS;JNCRnKUGRcq=Z#q;ccT|&8DGZ~P#[w cb(MD$Nw^C8uך\ nG<[Q@;% +3 +`P'4 f(ߢdv:OPS%##mɇm.ރz!elӛm:cD'z:8MWt&^%;} J(3qQ)4VR[=jg$zzЁ?r:ƾlfS} Ki-arඋ=0U`j24"aJݢ]M0iŒBtαN4 +ƺ{o y/񭁞-">rejHI)+7ŋtԫX5')"8{+ɝt(hAAI< Qʙb0|27_vм笕nrqXq=ozݯq1#4E9zП \\v0#CR_ovJ@x #g 9?Pr_IiF&@TMfM9qlpۧ!%!q 8j,t4rnkhIA`ApVzoJۄPm8ݗT:e:5Sy3:Vs@qXFizZ1z@ I>۠E18黪jk^iUQ~㠵YS(L(LɈf17mc Gnp:\D?S/Ď\^+Cvn~g1Yp +ޏ +!pd?}J'G=wԍ6}-Imk2#Mj;1˭ċݪz^L릧Uc-:$֓ʥZY ԮGw܍)-r<8P2sէؘkc*{@Zr.D&WW?6J0bG(̜FFVXqVǻP|."/V2R ͺjF@ֆ#A c_e^5vjߎ +:~JL +xMQ=(ͣ#IRwc> )=Lgafpi-L)'ӡh ʍVTg9>@ XZc%!|iFҐnY P&cA V6iȦȢ I%kT̉ jD9liEO_Pl( b"g7u%f6ƊޱVꖸd.5] K B9lc0!g~`f*,W\жQlS \+ΧG<B"<裯"Cܡ*G}/(M=s略֕ ˆվp!ء+bQ +B@Xbyξ[8˼ c]S[ܱ-QЉЧYjcYpYRYoXDQ 9t1(?PΜLp88nM)blM3:̆w r^GJ\#$\s8a3nj +42J"-&wvfy[WZ/K3YϘ%N0 ڪ3&n.ZGR_v{ۆˀEZk"kL0ZS.Jw*lq ,FDՄLPT ISGm?+bMozvaB\=.nN۠KEn!#\݋D}8EI$ˎ=rj V;\5F/VCUΏUxX@~r6 +_\z ]Kh]`ެb!6֧*tߑʹ)IZG aIaf,).bvL#U[ֈ8ʺAz^ Q7NVttʆ +`!.E.{M ِfXafc5`݆[>7}Uo Q*cIu&`d(z@4)Q)˴}Izk)`P7vc$= 6 7fmƘ?qϭzʜcBE)fd "4JS_)dBd.&+ k5&(zF78']GCp*"#QX峇y,WGn&8씘 $Ɨ_Wqf7.@reTۻS]LH)Ӂ3WylFb Kf +?8 IXC2@Y!6Vv#GXfwj\Kp + 2a8tC-jw6R(<LJӄ1V(*f9>Reuuhg-#e{c*QF#Io=hxvmm`ęm/tj >M.-FUฯ(]?c醽<#}0™(ܿw(.{yb$'dW:Aqdֹۜ`Ӻ8ݺ6leX[^|Fn"_47K>4$jК >]J 2|Y# 7;~g  R# /mdn{**oY0Q9߄pKL4Nw)ntR_P'Eh3L.8z`)Z(.>PB H* 4mǥb"Shm-Pwy +k++6Q+ӻg?U!JNZ!h2Vv_HY?#rۛiuhH{$:yJUx%>y=<=WZfpCc*Y_T_q]۪$Q?Adx^#21sTú i8E ڟ3RXj,:^,z]4|',rqXu# +Eʇ%8\q\7{T8 RrAcz²^Ū1v1hDU5*) .kPΗruNY`{6>3\&XK1ć`:+Ε$?C;LsŽI_ф`9 mzFM'z+& MR+ +-^iKUf.0я/]ߜmNQvAK o@zXah ) 45.⭮G}1e#  eK 2Ga? Ŝh15tpG +:=$cLI0…u~'ʍb$)딆Kpw:b>Jk!>s1M0J;jD>=zg6l{'-2WcyscS ͔LJV'_;Yh2Sߟhx4_>_Cy?p2$BgBfX>r\Ek25K,gxlwj&4.a҇ngFNg;2,^I'7i^,Xm:#7xܻpim`*fY&9QfxB/?]j?R: ׌G +/$g3 l}H_L >3oq6v{GpnhVCojRkѹrhzDY#^DHNAk8urWА #֯_m`iًZw3 =qhSǷ4fRF?ҋTϱ y1 +rR' ]~'SSt[3sx̡}AoWm;?CB:]3i6۷OV ^Y0Ԇ?Hs9=qA0aQFdr72PW_ |I(nx [ ޸g俲f&jEU ;LF:(ziy2ѐkcFmOBH!ֵ&"r0 ^S WUxN xO[M>픰ChMzm]5KHgYãF>ϭBanDoZ2.KFrt:g2"LoYNM6*+@kP4zsk[R9+M1dg$=3RYM9O;NK]ѨW7sHi'zOgW9cX"Gֿ KfY'=Z[q )*ίYS ⟙AR`Djq?Y͟G;-rOwR)o_-7~pV0W\Vm'sOt92l(v&s=5;%Nu/YK61FD&s-4Z- +B'A2*WA魣`Z?Uuv Y%S.D,LFu~Ѽ;@?[dAt)lzX]jJrGNt.Ա19sՉMw{ԧhH~{w,0B>n%'^AHV~Kصհ*Jbʠf zG9맏̳˰ul.T~j~Gi2_;9y^Z;<jaË+Hg֐@qi{.a+./샵QQNΰ ޮcI+⠡TI^ BЦ!Ev6 %`^>[6?>Ky{Hz}5H :˓ϲAO+$^\ٖiM2b }H'3;2m/U/.ez}%i#ݿ(]p}]M?}򑴞I5CP15K!Qc16#W CG i6OEXz +oA~o}Nttqߴ6#t% ] ,m9qwxs ] ƻ+T?Dn_xq͛jFCq}`1ʎצQ)r<>AGPuɼu8"T$ ,栌e۾RZ 4=ҺЛD۪fX_:eD%˸4M1'<=6/^cF?t9nD]O쬠8QNjxy8I͙ Wy֕If`nJ"g MCB(2 +6B.Ը}E)Gl_č $S< 2zHG~uFjÔz%б G&Z/Fy a:NmID+ endstream endobj 2410 0 obj <> endobj 2411 0 obj <> endobj 2412 0 obj <> endobj 2413 0 obj <> endobj 2401 0 obj <>stream +HWi>>+1E +aqvmHHV1]M]5{GV^Q54ȸދqkk%"GQV[%z-^ g<{8{%sRNy]ejoXl%%ؖb{hnfj"_,]qSd^6\E۶2&Rto]!;6]ZW>]z ?^a?C铗CcϞx*<x^ +?_ۻ`L'N ؑ!Cj3uҥ4t\<_^~l9ؘxYCYhS.? BA|%,45߆n.[ JORvjqj:Iz- 0d "=uv{ܼ> +úl17`a|q4k&cVaI(B;S]% %&`cSWsu)Da9>>:m -r)֖ð0^BMZJ"]_72dgnQNk>EiIBE7:NuQ3 9t`i^' +G9˜ߵ2+ :TEnq{ [!#sZkΡj +wvP?L3sZJ@j궾ZcI\,N/ftXD0]Y2Pd3F&3CJAjUmZd46)IzڐMb?/Ip5 OjgVIoƃ @It GF gGBt-c $cE?1) `O@(ޘɼ=i +UBn3MAlp̡M^X7PF66R-&*4"i5u!<%qs33'v:wh1 c՘"Op,X7edaǩ=EA! !e/i?a|9Nx6_I _z=#Ø@SJlӣo}w_o)bk|b0nȈgn1B6~nvnQ 1WUY6 + I/DFdlղ9`Ŕrlsg F [EhD) Ķ7t,E)5LSdz%)s紑IeQT;=zf|:*yp 5XsmjX +P 5L uc//-&~L_hXDv92SbkS)*ƭV{}dQvי3>\w32 "(g}8i mSnm86bW>#+%#ˡ}}W)"<`"bxv(t}6m3Cg-{QD#MPTL'w 2>K kD*.uj7]cWˮf 4IBY(b(ϭtء3{@,=%z<𓁠m`BYG%d,_%m7S +`#hiDC宿?݅Amب$]GСF:bIēMx5jr ->$T0V(9n~VaH+O(EM}.v&x6"AnkebB6{ QliDOI#՘U?cah=aL2"JI} E{BX:J}B7#rbZdhR5\RU.D@iLq%PzNt +c)R{:ItɅ Ʀa/Xݶa +Hq'"hK.4j)RrZNz b̛\"WGQ0(4L)E]I.{mkMC}OBs62bL=q؎E/av*x@-R8u׾#j^YhaA':^$G(4'ĪB>,Hs888w{s:giZD5W(sV`RWromQCeUe@Q]U]ʧ"$)gBV HB1C,-6ĥBpB.e8ʎDBNAWNF!/6G?cV1%$FsZݸ*||D͹h} o(oYHd;$i ^P_d1wy2 toV{DI}VB܈sMl}EAYFBנ>@gA/f%0@1 \̀ҕʑ |3.Ij +3ofhbM]nQ܌(@xð֪-p*[oNj`w;L xKWwܸvߎʹ{#('8S$juǬ5mO2,5s:+ƫ .?Mg2Vduw>stream +0 M@&_ M|h2E)&*4s:Y@hmxѸg|Yz%6Dȹob_2x2պi;v-W/+zYLU4-ջ,EE u}p(hv1Jr4"` +L#t)H[=,>ʕsDГj CiUzÁV"iO x(VBY'/H$s}t*~cOͲHwLy Znҥpfm{T(([>ނz*1t8sa,k_Pv0#-T5s I]1j#_il.q,ۧNؽ'3[|~tUxmT1w2ԗwL(n{/n@BK`(.ET ShDQ VݛꪉzgX$vj[Z-fʝ \[8q`C~7L_(c̓ N ӹ֏ Fds xE*`Nr AX + ,$` g'ߊ;-i(f_4lL\I"pA;9Tվꟕ}gz*s9=y);!tHN5o[3|(ǐٝ?Dmݜw;%q.$_ͼTϰKA5r2^Й|<2Xۺ#&H+hrk|”LܤǍڲ{XhB< + +%[q9ܢCQU:MaO7D] t;4I`5rE}^Jt66%I*4K.a|k\k1PjgUy}O7`DE(s<+:@zOt9ry"A&_a +4X4Axx{:UzA)> l.hR^؈ lW!THE%} +DB6Γr+2ڭa%I.Qy$$հ9}#Nj@ئXny8ig2([-cFIb.meOO}r;!)}i"RᮌvA bQBDQj$u 7UFG&)œr\q6+Ic@@MՍgؾ!Ȧv-7ZVNr2y:9DE$ i1PLF{YgVr5d ;6ҷ<.7YAs-6{⅂$ ={mv=+Z׋߸ܨr֦>oVi<ىWAE T8NC{ |jbr*_&b~!4@Je6%L}nǷAP f'ϱP}b|ԧ+iySUȫ?Sŋn1J? K6i)n*)ى@!5O޿p}>T|}3hgq-`{^dD* +ﱛ}i4GYS&ȅ) [;PP[{CPϯ( }N#4YETE]ި Q/,cw/DĂaxqQ1f҂efYb9p'v +H`+9z'cCsj_W]bςUh|E'o''֭+!ɨ@_9t۱3Hb6zY]b1wvQyB:m!ћ)ـkKCV NPNWVm8ر"C7 ]ᔵe4.@lG ZS y zMC;)(JɆfYg릱kA52FN0ݗ +{A0ٰ9Ƽ׭wV~y@ +#gt<&B'5V"ÔX[5Ҍ.Y2}.o0ZȡctGZ:b'=!lwowlOny:K紎f&bSmlaROk)+'u" I/P?j]vZѧg^}Ꝑݔ"q`_cq<(peq8B_Q?"FPDvRȾkPlBs7&M}_0u]Y\$0s3weO?)pDChM-E"QJgTtLPϲPI#il8\:_.e,1D +Xk}WJI x|N 51h.4 }@z-?6-!!?mw. 7/ AK[pvI?MetvO ȑ +5(L!JWVAA. ͘= />B6%{1fzk0L#ƮBXd +Д<9CMw161eeXP=]x1L\H(m?n>ja͐c71g5OU{\cKX_!7fY<<%xh7} ԯ0SF(cm8dןN-ѧνN8[4Wbh^f im9Ď9V9[ NN`&U0J12So ,9خ']oWID}Sd12nPki.ssbwm>Pзj?@i|{_{! S|/ĜWtHja2*Rkеw%zV)m6'WW5QG53A@*FS= _5t";=p2 r.f^&4`Ъ-Qs@HX5CoQߔU p;-2_ta;;06ac>f|{TtKeVw0)"lrvL+ {5 wR4n897Qy`)){g%' ͐.i7AO9ؗaab.2D3F~'Q]bn0>d<3AÿFW?B)K ~O۪gE >P*9F{p^Nƶl_K£&r..S ұ(,{F66X>nhI|4ɟU߇L2V̧!2S.0fkm)G5|ܯU3%W>) + Wؑ@~Ten>J$rL`;C0aqK\ق;9 "C:gD))$! IM[E%^ScP ; QUFPTQ#%qAvi  qQTqr@M8P+ˆ̾ƨ@2.G?@XywұQ,nW]%fϽajrqxYik[=CSm@ӮIQ;HGՁvH^0ȸ?m9<-]E9r$F0V0'AU o#yVƀoBnq^O3N9 +fm +]WԙUPv6t^%rT)TV64km8\í<ƍչES4L|<ZbwnfH4@AS&K%/& +e{˃^LG$n i[DžTa~owHWѧ>ǓpiU炇"G +ҽ\_,LE4jTIBX +J5Ж$^cylXeMn5 fljݔ/C'xj̪@3s+Han$rbND0\GhixEf?61*GdULzD{34I#}@+b=5%LS#\YvNC\Ͳ7V8P⯥;  +onsDJ zg YaiG}B&aIʥ22~dzWU={ Z>xLSGQC +uآ+-t`#=ٙ&+aR݁!3{ݸS["F'uK/U40#n3&qI:v,^@''tӎC560J۰8U!ZjV]|%=q\z/4kK+sǾצI7b|tk; y *=rEEF}@aa&͙l莄YZ!MbLs4S8Q5Gd͵[Sn 9\nʄ8oW+6%q>Jw[O-,lB# "rWf!Z#V*`Mj}cݝ$nl0rfūs@:\+?mỷ 鍅%J-JHpcni։"D#@%/}㨏%޾v3!e߆jRdި}U*$[p0|UcM~ *,4/iŘ>Aw^Ol=[n` w Y8U K?dQJܤ5=R{-τ}5bujqG @Xm|1XFg7 4mX.&&mZ-o&\܎LD'>SA϶0MLcAzhEM -%EjW1_11ATPhCf;\&+7M|[p>7qAcCd<'XV5-j!?+P(mđR+/ zR8Qp`7M62vܙ8|B9tNz 9 +ƍp ^CLQ*Jti*lҫt* h1Y36D.w8Ʉr%xuv/ [qыR/\ڹA< q{]=.gǍk0\BLȇ/.Nw"{40ts"62Kӿa;}^¶)!-Yw eԤ'7ГnQ0;w *_`-^0}@&iKKݤۙ!of[^`͸I⭞Qڗ]xW#zΐV0"^ch`ʡWS</ߗx}ݯмF-DLd vJ9ĵRQ_sDwJgJBo;PZ"UH4a_{ =$5|V:1+Z Pcy>&7lk%F +&/7stvW5͙,*5 8U!eiguIQQQn4|,y*>Kb>f;՛i{!wv<'sd1%7Grw{[ya-Ca*ԀP"?yM12֋,31sm}rN+ۦ0Wo0khcaJBj SN)eTׇ ݕ} 5l@OS*y}Ue:8j[^nme$ŻEMa.wunnpF`W vI;']d;R+wAXjrfltNn7/_4f (y= (̾KQ + >zB]R7㻔D6M{p&~F9G+z=^Eso`Fˋr6oAY?}Ĥ!MyeooRž8-C 5ɝEfX@p6K>xsHavK@7r>u Xv"PwY\V>v?{y@9=627G{=BD48BxmeպD\ öFl ǺY|Bv ɈC7Ý|vm)E#sLe'&4/JW9)?-qS?nZV9QX\XVc&'oi>Os%dt "ꛜiJxRkJa7~g zPOiu}ZtbȐl5@3F'MluҒ+Wk_FEK'< ]tG\89ujqpZ?=15 f; sqhJBQ#^$պrhiUWޛJ]NEqrL4'$.HF0SGb6\Ld(4?|8QisNa5=L;El#Lg_# :jW| {zܶր|ty@Ƥ5[`9rad,>AHkۃWd ,nQ1nxf"|n< (j}!JESA%_zLpk%料baFmȢ/aqt|酤|@@,SH驗KmSXf^+'Qsh\MelAk˿s)뛊z_PwNjlcbťIWד$\([NH7 4YҤwMϧY/45{Y&KV:CiBm:̻R8|P R %Uڋ#yKPrvtR͆ܟ de$(_PB?tPADtTm$ptGpfL/!/0UMϵb}>CK狜A>}z?Y5ExRWbE9? :L&!| 0=8(WJ~4QzXj4|FT<Զ[m`mw?<:>*=#Nts >'mv\.!lMO(\#;qvj@Aʿ^2R@;S$LȞ4x-b0>StQJiV'Cӓ}xBGJWys#r2|w,0}:zgQ 3@2 ( 5|/'/Q( "[pqZrTbm2oG~ 7J-zٓ}YX|Gz>mqMNx1/ С/r󣾭ʝ3= tjzb^\I`4LD a_:2S5!(-|7m~[i}R4<ŶfВշ~:0.Ѓyk}HB(j-JmmTNL.Z H墉1όXpaM<߹bd>*>IYyߒˆԌ{Kb!O.>\zAo?et#ľ+,ɳWuӾ9-Qvxs9-bnTYTke^$^0罗 ,$֝i&8wFo.+kZ7BXk&8:eF6H-:PiY5+1taJ,BVgAz1>ԥRBWB2M>wj#=%˟UM) 9NlnFZwy0X{=[m3z[kziwSpPU^rRD, +pҁ2$>I'wIł6ڄ|萙I]= {XyZezieU$QSPQ!F4{,:Mֈ7UElPoCb+QÅJv8DjtwVķu]22^r#,ϴmқ!w䥂K3¥o )jkT@^$l.踽h@%M.>v@ ~?i@{ufIjrx7 z)&cELH1M E|-y3!}ƃgf[*NOx9nac^ZʰZHDJXZwM0'9'; +;ſ}ً +bӾ=ƛfP*E(q#K;Œ!X#oI=ȳ rbm)~5wQs\&=b +zjj ~y9MvޓPTvZյOm ȁ:=wQ,.[ +6n+>k2u{Lצؽ:R~?ʎO;D48}8Řs)_: +Q550.ؓ@RQ]WOe8D4k1(*Iς9RX6 ̑V}YTBܥ^(O3Y5q4J[%/m1ojY9B-aTәoa̍bxcl_geb[HA߉PNj!v>&Dy|S9mbL83sO=aRnB΍/wٞf@uٜK)co'FSBFY3|iBl >f$ZRo&ȰJmҷb5+8z`Q2j{bS /t37=#:n JA:_K(zwii`ٽ՘Q,s/}#cPdT'^Ó>:pMo$Hm3Tq=әʖM>`uj_ϜfHϰ-]p`SʮzV،o$(TcP2Gq_h FJ$('?6X + /,q``R\hҏlU OvN&,v("j} b6Q_uH?L9z+V,Z<~$~wkƖ+d^*ϟ궽!Gf찼MWf$D&]5JPzff?Xs(Ըp^%:`9 BFUvBEsPKjA[Xb/wvKη 2plǩ-*Mt($)RMy!p%=3A>Si&[)@ĩ݂x!ؼAv vjƄ"!Nj㽱\9 L404׶rԦ|Dϳ|5k̎Uv S\GBI Zd94ܯ:ÍK +S^#;+U|\KPjeZ8{3#[2 Mۧ=&4ya1g0@thGMZ+!5s%!Q'BE'.;r78k,xU:qJUX㭚I4Vd"/bo{B({ 1a,,夺c4N9^N`9}"r c('ErRv?Ը?vt<̘(ͺvO[1-km +$`AE}+D__C̙e6|4b +(nmtq,<)Zg)e8;F5@M-oiax?VP-4SȨWzvq#ף%"sE;dxJ3J/㔐ɉY-߻D83o`,Yj 7 C'VRW'2 y8XWq7p}S~hVgPHLH{]fMQ9qxms3paС3Ҳd 9.}MnʡrRd>4 OG `^7 {g/ɹ7xי&Z8#ESPOIGg"-DlEMƳ Y$G +NΌEulWEs֙ͣxƤx]/'dI[3y/jtorr)s;F, F jdG.6tz#GF|ogZM4r:p=wXغtnh#\K# j;˜MRQ鞭˃Tv|.9A[(cpR#F +.mJbM +W37&!QRR݃z~Jt*)w'GM&pkΫOXv=*Gxl)F|ݘQ51eɺz}i~d8C\жݨn|,:=:ɕ=#%zoiP +I$ qR c{NVH +IS=aK]&bidՅ ńI$]QDs-Uf,AKIgFo w5R0:.4f +]v-w2 螷c+7F/ei-o ڋ &׀Aׅѐ3ꩡW^6J^d=PqM 4n;K^Erζl'iKL)IK=g2Ѽ~Jk/"U8- \!j+B0HJՀ4=~+$u$;jg܇R,_u}CSZOdï`UdZh]J>', ]mwE +L@~zTǃD[҇b1XaP#D)X+5$1L1Q+ l1}b27{nSP{a;wecw(Zط v~瓨Ѝk-:9L};=w`|]݋%7kb8Nc2:L}u cB;QO,vQz ^OYƟhT秽'|D16zz0ؑE2/_킗:7 Y\<+%FܵWCM"†z`m%tzu8'jZuo\eϼk q=eSDID-$/2ָ^GHl4S}w}$@y#5'8w Rc~v8W@k#JLِIFbTyZXOfÅ[CkU{|הWXKw2oM/O;(@d)prU8k^pAPnͰI5zKzj#wu<< %1+K qz1ڭ5Sj"z~*5*xt_}e- "Sns" : ;|": G.#&{%GL0`To-F >|]5qQyGVs:{(? IL(FW  y1=_}"ZΒa,{0srmGiV{^5ܝZvnFԛeO7v \lhC5:'3V~kcTQ4xܞz9MZ#.DoSs7X/p8cjC[h熂~XPкN{:At{V(feY>.|u,ˈu1|T!3n&L[ ˜(`5ׅC9aY& +.YTYCZ'WxZN}cL|IQ"N \+)j |]eV(J/CRAv{%wT3Xˆf(o*ݼcڑJl\-䀭fȚuL̈s7soqie)P"k;H}i ]9tw۠ +|#t"RLI:بNmCU5Yga #pYc_F<G^Y|] 2Hdm`W?Z8M_ښ5o_`",MɚgH&Pet ,z{=j%o/*P&tUS#PZ-|$3՚ًDO>D:S]Vka4CtߺYg6)]AWٲ舨Gd+]I Kp_B A\̇3:{c~zLa ' R6$MK;RUUҼõ072IPFIGv=rp[KBI EY~i|yPVjN4M/OڋnXY;f^M0zZ@6s cށakC߱sr}z&T:@%c#jQLs%NEЕfl=B#ӵ:vy*Uv,3v5r ɇ}\qZl;Β &Hg>Y^F=OP3P_sv֖rB u"m%P9:Ja!؎tA ͭ3@eė`^tCd8: +(KBAԈ=tTG +}DL`b Cl~Dz3/#?\t8Y^{/_-b|wD68X|y.hm3* Mkov<}cIM1 KrOH6 sCO ?7/RUEnz8 Lv#7؅dBy UξNƙA3ѭ{P0UIK=.a<%$^Jo%ճ/5~} a@4xiuc(]bre_r3gx ~B|͙EaG*Hu܆¦ +4Hh:6(οK9@D f=wU0"5gx(xO)hJ$;<v7/}YeujpQ%AW~ȦmX4LMNrYZunҦQ¿9rmM'r -=W\TD~/p[CylC _G0kөVoiJs +zG(B +&WNêa/sJ2 QR*Bitx~XpW c|?ZmUO5rP\WKWW.j@UZ$N%)MoƕHGBIAI?i5"Skr9J%S/I*TME_+(񎚱!p!l +HIVAN2Ck'5 +6asr!ـLergȺϴ ( c ! <%Vnqɬ0)[5C{EN1] ㊘a&CL(QkU %|CI$ýQ"YJdxPcG4Gĉ7.j(XP9<n|Oߡ  Zmmk"U;vջ[Pu6Got f|{'-cwK:1HMGyE^2(2\ZCҪK6 <5?}ں1&ecawط+}~˳r]E +#af;];\ue@RCuX iwOڛLuUc,$![Ё?J%@Fx5년k]<= hNho츙Ak8L$,N3o~lThd#GʉrU>5 {Dt) /a$GI~CgxnrN%ZM2knq+z\ +6`)BZ~CܛuXw,O҈Ւ༈%B }_4nTGYX/hbv\KXT,+kD.&;t>R(S25uUړζR6ddLj8U ޒ&6ҩk ke[>fћJUTe>fYT29BzcVwN5+xg±[+)pgT' {Vܯ/pѐӐd|#+g57j +E)svlG#+,\8yp?i>>vJuTb's +6_KVI᪖#a>s@{,IA&ԕ| +ТdG p$ovMޟ9Tam&.@X}õ-ä}1i4o}LMcӈu%ZO&t"*J3,cy~c3CjKP&])=aRw롼P 2HQrT<́RXUЁJlی)餪L+o0-tdǹXXx2]#~po5Y**mPjSyS_$N UxȊ] ݑFHQOhZIAʃO|kVcI)weKJ[,2W[:n7=G/==9i +Sjx^nٰIvxsHkϚs.U:+Xm̤+'GO~[d *ׯaܾ.cN#~bAV¤Ӊu.6ruˋ&[t~@)ÇoMLl +AxȠpbP`|]$N*}RP&ހ;"eB8EP^^Lgcj yWuJGUǙdAZ#޺(&`?9gmc{V9硍NiS^xeQB[֝eK/X;!uL e\,&/%#o͊ Pbν".}y/4A09 Dc p,:cj7`eRl'.u8f[+,Zᢩ"ߘC+/XBiApkh,d;(|i,e։KR0 =Z>I}iМW qׯIv^}W缹ܖaͨՙDwRnuJ+Ywf߾eGifD7{M2s/œ gsʋE6!2KWD- 6 YJNyѥ#KBb,~ `L3Jn^oKocK(m`@b"mP.pj9 !vЩ?]q+|pNிN5Wj'檙WMTdtpX11b!Dfz[.K +[8H&|ý}JCkґOډp-Y5ۓtzӻlE\6Cwy#sjD|ܥ1i"^os[T}-Hm/2x XFS`zrPYZ.Mc]=,#ړ aSr`;`b^`& 9A~j7 >@^N- >}+U`,`~LI,;o_*v vN9j׃hQOYE0qR(&`?2N4jP6K38[ߢK^Ʒ&U Vj +p@7_– \9/{o9'RjSq.7Fb?\S M2^K=qf*[)cYa>G6}UcMO2_Qo#*1\DmId纨&H߄Mlcyb&4MֳV-q>4{Ġs`T:oѾ!yrKG?9f8H'lJ{Kj% RsauD?gRV[LmȰMn w  Eޙ]TPAM;耉6hC +GʠCه>QE+1R!B죰Fhr q} "YuDŽikEg:sft]4R!%T苊qB* EWT"=x<VG΅=_4+؁ w}|r3)Xtc3p÷`jB>*IZST$vMw> qTSyEd"88Pb<حsh0ORk4 *X`LT^MS_ 9){_ûu"}(t2}Cpϝ[O1N@y,b_K"qi6_(8hH@GW&]#Zƈ \ljJW@JYXOT īׂ$,ثJ:_#n5JSŪ)NkTUnG͑Tz-LHo6Ӽ&O.,m'`kʗP㒴IpMP%c4VxF;89‹ھo OE^7%B|<ڳ;(>\wɢM`-HG--&/ͫO"0m)w@p7J_sO>)!'EtYH%Dp*pK%RlˌM@y:||8Qiz|>"IVS["=@bS>}N|x$9=,HVW~`a^ oT)/ p`$F1S YgG\887]V3D!uZhbV<8N,+@PX̽j"SNC0\ ̹@qHŘDCXۿb$96 = }"§Ȑk7RdiY=b.RN{>\9$x>Ws F9`z,C턣y8%g{)k(+LLd10A)Yu)WS^T,rg3"voL%y{X#F endstream endobj 2402 0 obj <> endobj 2403 0 obj <> endobj 2404 0 obj <> endobj 2405 0 obj <> endobj 2406 0 obj <> endobj 2407 0 obj <> endobj 2395 0 obj <>stream +HWn}W-@jb16 @0FlHCS}DQL{rԩ1#Ƙ`gHoݿWg>C׳g_xFf۳ 0!|6|;ӈ+oj2f&B\櫳vogpSb/Q󛳟>loN +{D)ζ=iMR]{|Gjdtyö<"{v^]NnfHK>f7L8 Mbfad ߮ժYH\z=ѭn>8~ g/ ^}<9D׋f}}T!}9wX6ٛ7[8Ϧ4l4 A]'kQ֨d>wT2^f_\V4PbBP#b-ub1COY ;ٶ\n +ʥ27=Sm=\#SA=H4AE('lfx:4Eo w=yJ: 4KSVToGlDi'ns%ādƁ,:F m~xS>d>J+H<ےTIha >5z;.|SP^33l LA +C2<5ƻPCIEշX(cr"}p~cX|6sȜRe$w:6t d1w/ 󉬻OJ0krLDz]uf(dp|*nX(P Ńo&\)`zro_?hIEWFFlK?#@⥑DbA7OC<߬'v+]3@*y2k0*T0*$SkF㴟eٿr{a"H,dȓnxaS&ZtC|!d6H*3VAE%(H+S +)8lZ={v{oW:G ?Or}B"F('l:KAZǍ#ZG6c{!EJʼn?! 8E R|✨,9M o#TK.h m̅*:V{).cchQD(vZH +ļ&kw.Qz"-oD AU3t`iUA`G`alM+FZdҥ9p 4}j} VySεmVeTD (?&K3Sn,D ሎ_}ymB(:.gQN,' ] ,ȔFTat_.qS1mse)HNijzAuLcR[:- +FjKPM4ꆊA8@#ş_ +#VڧM!FqΖܠk:s `$>lU34(=w[ͣ1#-< ,Ut'f,߸cffY=D@rRj, Y\.ޡ5pmSnLL3qkc5'”%Y<|=܉Q1X)fbGTOw$<4; @ +> mUN3j +YUa]) MSU؍l}@Ϗp Qց<)~SP eXSK Fj"ff(zϊ4{^{!ڔ@Xܩ٫F92|2!%J;nϋ_.ج"+02Ih_O3z[VBC+/(n˙'<̠uj_?%8 +L +V/EARIx/ e N'C x ϫ 9s`QdD=nȬfX`i)[? A帗]s mi']̅aLmr,nbxLWL3{dݤYh:,n5Hd~kŐ shnw3YSDT,\LKPRX7Vh,LzMj 1f@8;%GN)H쏛/3WϐchYz2%+ k;ž,F+BR1X>U8ba$^O.UIUW\pԕg%}K&w-ڡq_e- S05A5/uº%=e5/>o>,9@eD AG&Z1X9bT 8zBvfWJ=P۷s.7J$ +zšL8,U0*[҆8SL.;#EYF<H##?#,=c%]0x\ ݕ,{y? ~ i`, O%WQ%Ӣ?rS{=m+6[+!ࢮ l endstream endobj 2400 0 obj <>stream +0 @@&V @pp\] Bb,=Vm[`dPeLA<.Ix=lJW&6ZD+,K +:/2<6Ƀlb,{;W!)"BA}wEĈmn< O ևP<ѝ)s(m9XK̅gl{g8s}%^|R > Ak$ HwՔˮT{:2.cϔ]~IÇ}'ļ@|ώ|Y'Puϥ-Ae¶bG9*"y>ei[İt֩nbBAf :Ж|7ɝ} ;)6$>ݨ􍳡$Y>޲*hrOh<%B4blb(cEk4ϺLޅ|ƾ=yjVt*f<s3sWZh֓3}N&(#M_ঔ?6!:9,ٜ/~I^늉jLre_%w b:P[ +̳ Eg7< 3njj\R=۶BN1א~k2^>$;&ŵ~Z:Y3M\O8j-TM|*7!C/g,Cirg/]#I\C!nw6W.PmqL(6%ݠv'rx5#Y: HBu/gT=(1Y@5>>$ޚV*Ns@POo>Bdq'Wi*LOrơ̝rdVrц&( oЄ ' + <+N+H +Xզ7p'3C}o6_cYj̎fIFO2x sQa \TD +6}O/AKJ5U&RH',fEFӽ!c,X6t{$ '9a[K8ze+k$6x'q)#NKґwp -΀skBܰ#,+v&ބf7[>zGz (^j˱SEJh傢[qOls`V<:F4 {8u6eC"NYX׵ׄSq؋OX kPSc]@:axV 3ڕh=".EyQoS2%L?C(; +A>̮ٳSg||CBs9Etx7y`^;dOi xAQ:tYK&e6u`HF8Ax Dx%DTIޓxJ3Tʻr&}T&ˠ诌YLHP$Gy("~j0lNqnm<+a2UAJ'G:=$o{vDv;ˇ#bJ %mk^RU;h˹2;94vLEg/6I)4X,"|(@Z&۽sxtA LR Ev8D7>/5;Q.? +\R'Cg Aj.wbAV|rs.1_fl̘wS\_wGB+TTq:|}n!mc=u[sQBG^WDȕ~0:pp*~V3]Nj|F!6yQ4碐Rxc$dש H$KCVup7?FA96u7@YQL9`愓8>npߟc7f8ɵ>dvJEW~ +1*=v9}7\3oZ2yCCԬ!%2XN%GW9 ">}hz)F@ + +bWdJxcӊv~Wk o} zz: gDዓ9E';K=JMC3hߜ {DA^P6Ր7LFПV}n}2fjw]'+M +AYRE/ E>E[VVy揘&Ap > +9eZJ&w-s fAy3Fb+-N_sZi)J Pt//ϸ4o(N1-FmUx$Bǂ5Ȗ|6U1DzF̀=c{tGv"@t0>3 8g(;E^\Ў­R;VcWk %r'.;.']"c:&1 A1v8E4 C[u1By1M/3`K!x>勐p鞿y3@ӪܨdoHHA&7kA-ssh7|0ٗT}T'*JFw +k@Az'; +̰rQ>rDNV8JLw_Vʵv(iů[,ZffOb,iojPy&/íW~ᐸ׃.ٞ@ۻ{Ewg{`Wԓ,NK\H#ɔ~tuωf7{ +4_tz UL2]32(V"jQS,~Wn)iK!~[a|r3I)EU&W&l+mAtBWyO ". UYry[&1˪WrY uOb^TMu$2r'nqkMT(zY;4ƒqX4tzO%7fڤ %6B9tVvӺa5?)]S8 9޵΋R852_F5l mD}J,I$$5 GU^CsIJg92%ɥۡS ݾ\TtEKhj\}#jlؘd=)&i” & h*ߞ5k_xl_~E\O;4+FEb +0+gA_:s*#uk4;{ Q;HO݀&&ثB9ʞ03VQdƦ~-%9= vgL4x}/hPhđ=@J#eW*WNx0Y F&L:0<N(v]p&1X +-COA8DE^~ьWy,;u5-ؑAƀ[5$XgnΨ$Fȿs;/mkm%B$xTdA5E8;MܿUwKUAL6bNe:o(PFVRI(c~wa>E8B!(-&idf2ADS^G|e#+T&aqV@]P۩HvڠOuD)Gh+U s*}h5^f/w@4l f`uNi'\ߐntƓ;3 +bϙ(($LmW,nءpBȩ2дg^?$}](p] +XL%1|hKurnPzCO%alXd^uhK>Aw>y~oʐG|Ynz.W?B6cGoEӯ?=+k?0ѯjZ/:-zvq vx|̅s֬dĥEs+๚҃ +jsޓGu,CJfދ8_'00^giy F^:Ip`Gx!!Fjm;BD_)^ CkK&EQ{UN ="cyC/Ԁ\9io|ٱ*{0zL9\R +a϶71sy.jDPJ>Q٣]奧>tl/F'el96hKƎsH]\{P]{צ$ T<nٖsAf͑g}n/feі*ޓS*!lKC^G8ٛ% + +jq>^ dӽyԣYiHVez3?ʫ6 +TGr9 wG|jI#_5f9X}!vKfLOpkߢK*¤c i ] +?PݵW]8w5"ZXͫ%^:7 +ݖb.)G>+5IW4PjZ0`Q-l_J7^phLnv-QeogdI<ɮs-Zf'Ht.[;`^)dYpBZH={8)~{3?CIZfDkL=/C$Å eG'"&)i9uc8Zes'ln N’?ڽt[A` rrr,DQ"Cb9m]>X{"'qR,BQUbaqpM +U#!Z1JQdY׶IеB|,tʇ2lj*GeO'6۫`7t&E}/+6"䣔2`zԧ.[`{kmV̬_Pz_(^M{ČRtwOϸn߭ܿ˧Ot3~/oNP6kf15+P @ה,ҁD?ﰙE"&k9obK5ЙVhah 0H^v +Q,*-6.LO$_FAM+,o%$.Ip= *vIS_8p! +>u[F|e9 uY>kkQL)!5"~pXRmO 56j3vT M +H.Z6T0_E?{ +.[H g#O.*x*U璼v69]n̳@0,ჴnnFUǝ &ÃhbѲ*]-*f$z'tx@!T W[{^-eҠNERSӫPo r׍fG H_7Tgv>Ule<3>Djٗ&_P&ťit ;l,D(?jҥ T K +rLub;u67'';6<-s&P?}}F| +*'͖< |[vq +&E&y?MFQEj? p +?o̒9 >u?6rɰE{=I26{h" p"8J67Q9OEu^,R (nWra93.z2O[\{RX`!0Hw|9 u"W}Âuv5W>W^t.~o_xc$-,OPWml~"BT>)H_ + +#ϖKao4tZ-88vs5̽\8%lZzFBPE yF4;vPSO( ն;x(PvK(;+w*`Vb>lҎ];?Y^<qyAvro:z`/: xlEEsCFƑ7̃޵n]'n+VhkU{%3/Vs7=x7CjAx+o&O$Ueo/F0(I]@]Kׁp#Ismc*cDb5ۄyhGEt ѪV=r.aRǰ߽ka׷ȷZxQ N8^_9,ɿ')6@:QK(e1`海 P)4ٳr}Xy`] oKoD.g<m#5|F !yDPA[ha\ʻy/FΖ:̦(i+TKodL99To؏kTX*Iaᔛj-fpYپx "uisNiFKtoreqGJ^XAB ANu9F$Kz=ѕAlDxo(㥔z&ekK[Ǒ%=\f4Ɨs؜e4`ͥ:PH= >j 7–ِ"'u6at"Y? AؙV}djg1-* UXa8xVRg|֒N-[QYe +6; @ RR) (x;9ҧ%YNIc\y|yl旒oMlKoqFG#` @_uQdjSbxЇry錙?cé2jK!2MJ\MP%LD\Uyp~{-EMͤJ?3r8c^`/iطt۪) l nkX( v#׊?WEӑ'tFM`(FZSgt,UH0 dm7{ZU[qxc +..pJ;%=Ԝn"bqm/n2`"A(U-M8AAw9r6E2h`'ǁ_!14+﹡Ԑ:L c?_ٽ᷈n=Yz}i'7ˆJ٫åUv'5,X.s4 u:.v)۴ #i}0lacy Y#GQLE@-! +p@pJD~[M>?[B5cpfM%t9)rㅛS>b`^r]3x®oP a*ـ䑀<;C r;c(7e=RbԾǘ'Z;5amݸK܏0ϛeTeҤBu}pG9Pui7F^OHUeLT*s{]|[ud\SVN̫qILB޺p7VXAs[O4Z)GDՐٮ{CN 'Jd C}t)xHU\x1X(յ-CնzOd`23~Cбel|!+.N8ILrBG\;}rw.G{2ovzI.z"sn  婻d}h$דㄺK se˰5%UEAmn]de\d`7hĄw!=!M|,ZI4l2z"M_3ӫ'm͢XĠ랭~V>Ynqھ;T1 ~vr$ڸ]>ǪY7DސPQ_1AoE%\vR<'>12ԇJaNǦ6bg嬮B$.)*rw]7O%} wz!XӒdZ`8vi̋ +WtP#8ԫuAQ/dYPFФ޿L!FwA.4q < AEМdJ]u>P +FW͖PjNO! KWgb{hdՖ/ąF @Ro;uESjW`BuX3 { p3sZ?6OlPS>q`2Zz ynxL2$+NyԦ(yNL_*#rn ~TzCiK3ې1{CރIX;{DKĒfJmn`vڃ/UB"*ttk;2 0Ž^rwיlOG6+GA_:;3Q;lYQYR-iZ X}8JB&8[8#+b`\n/"oWl5 Ӎ,$s)OyrQNT-uϛvqOܵ_٭vU3V]FaW+L5.UኁSg-$u_c +tį}Feؘ<$Ph%*U%-0 +@H9)ì5p7=P[%h_L{nRq#{qZ,G@".s.| @3`/)N`n(H,]5{㈣>fAN~ypA.Z1\<P? ԡ(Q.\G 2H;~!$T[]R`"./A4* +]-d+`WMKN$Cqr=Ht542F4<% +tm_Ьr~«^1%vk˭$GvW_^rZ8A="3;x-idve l9b|nQD͟jF0QFrN +4l%"luCEkU-ЭI/V}P6&Ș"=`k=:iheC"f9PrR`->?n7J49n~쟫Ⴓ&xVCBxc GI? ̓}0I3鄺i+V%$,f<Oӑ-$b+gM!($=<~@}'6ȇc`Н~=KK[Z%}*AY44zIh7Se9 #9q>0m_QMM YUcoЄKua;4O)TIm{[ݠF>KNc$!SJ}]J h#b."$s{c-/Bh(upYkzlm' y5l. Ke꒟qM hgK3k# n ]ǞF.>в0Xg쒩;`uD8M=6ͿӋ^ i39Ih9Xw|SNty)Hj(mNWߟ?aQ9=5Ip3~xK2" zCwr77(3oFt}haSiGQv kozMMK)"O_3uL~0bc! bg" +5]3:w` Yʋ.A=3 Ak&IAT4BѿwXv,v9KIX`Ҟ9 -0ͫ +F^@=}5^? _:Nc9&T]-_&Ayb>yͦ´;ʫ@;6O HÇ HIBDpw}P^0. +z/+ecx`j2[k/ޥۃ,d9ƍ 6ȟyx-'}IB 5tfl}foC/Q^?#j:MWK<4V%4Aߣ5[=B Xf=FhN=#e/OVɃ.ynrފA|?UYvEwXSb;WS [ژN6c)anW*JPRO־(W ?x>T3CDԌwK/ML/7,b}NN,@b'/;z=me8:S+_H YH+~Ā,,ښc}BB*UP +砏Xg _il5j4f[ߦqڻ(z~.px}PoRb-ZA<i !" g']鷎Jgү_Ϲ []Х~o B55ΒgB]Q:FxCVSݹ #("NR3⎏k%db.!B_o>UT{9QOc +9V uh!>.kr3$ B?yxJ_! #. ;S?R+wƜ`Q~AK=pi`hLxÝun~7m%lMW!ˇk)?`٪(kU+(1Ǐo.% ^+j+uu1$bTATou`嬁ß&)If>?:6B?$5J{khN;7 +|ku@Q D"r2z=H`2 L_>4ͫy$IHKN^tiQؙVW%9/ΉxiMbY. $݉ 5y"Q{q}򚴰R߰? +>X1ncgjg>_LVip+|>}17:F]/ f5d׌{da Q[<V)â}{6WrXJL)q -' +2[>xIZn v)X,rHt?`򥕍AG}du9uhVAPE)zV7LH)"z#azZE|"D4Ia&NO# r0b_)wvQ>+N{caX-~tpF,*I&L@VIT¾ "gBHSk t FP|.,#ו$K،~aJK(MBsqЌ=8:$/r\lw61Ch>5S~m|fu[N8ӈ3 nϖvV_l͇kY6kȯ\)Yhtkw4^}P"/ĩQtd@/aG6Xbз<A{ĒydnO5Q_eqqxjAXkR_m${G#ML|̨p:gF_0M y{nE ~ O*}w{I^ήiZ =ک%.a>G`Utr3$Ɩ5fR^I^`Tv9~ S6JK[S<>gHLv%M?$4IoqES,8_|Fo6Uz8X?pF}࣡0Ry?zg]sϦऐFkߎJcf=yQ(>46$bwIxkd:O'{EP-RaJ`sҰٔD(5|t5X 051ns]P +=cJN*IDnfPtj@>%# !0:tJQ-s%>Hm[W;&xYU-f:#F S lCIR.'62GJ-r%1ކk~ G5HTG흗fr S + 8vU8NJ**D!REHh'Jt UMܛ^{uڿW +VL8/Ib5Qtz1_A_"cK0މ'omj ++ٺq_`? +s4$~'(>\X4],p>YރY%vX+5&9Yj*L#s9W%rr} +A ukoL,9OsR؍R/R^'/[.4@z|{+< "K(FKbU2}D4:"^9# +Ҝq q(== +wmt6N6 +`:;0"uIۉ;p#>P4w:8cEέA ao\H`nfAuwQj$R;+_y9'-cbTє !bI>i+HRnBpI?Ry +ؿ$9ϖٙTņ/5S@Rz)xqQشڸ} I}'AnIAΕ`vuaQUʯt&rlgcKLsJ3R+.jfSZn4;[ GRiR;s3bpq$꾟X\qOtCA$|$~BشxJFD4,^DZG`rk2djx$sΧPT?bLMTlIF< >[[@sobŕ#LKcc4 r}UDA8qލ&: hﰿhI6Mb,*3,t,iQHC\A'ں02M/{?vgL345$Iı6~!ݪ݁Ց*/>n8 KNC/h r=PT0d-2F&֤}>i/+LkޟHXu5_SkP\ڏVǔZu$k \Up0l.&uqpu}4hzF9knwa2NBO_ puL>$i}ۆ2֛i1}'"R+);P_:31oGdWߑwEV9'(̷bfpH.Gz +,:%4Ő߯p>ݤ$y(gRߪ823v1MK'`ˠa2tYgMH(1 ^^}oˡ҄7/~Dݪ r`wjG[=vnK2ͫJsFmUxDf*-reC?b[+"f4[9Ya(֙9Ґ悞G#~JVKB͘zdC-Z)K#N`c]{{B &C꥞9!gBNv-F\X#Dx-D\-RID6PG׫an֝6;Gy @Uh)ʅ#,yB\a'ek:~#LЫ苞vŰ+Se-_Ci6 PWRP8= A1WNQᾟۧyIE,j8>)%dqWI;b,sWk T?:ØFfqF: {Be#J 61'#[IL [@A@,oeiLHKn!$0Ml/cH'sA|W̎$M(Xẩ{I\PA)1DI8*"DJ퐐JBV13D<+ty[gd#O'\shZf7)P;(9x*AUoRUvSٮ @4+?0F(mʭ.o~~@$/">`xοyoJCD6*ӫ8 8E{5WAtHpJ`Dq{b%`ǞJXn%>Jb, EV8kkzH͠P3N2y9=H<N |ʻU.(D((!Sv]M6K4+^p\MyDQ7Nڽ +SC#)x`[n.vo3p{dkd eC6(8~|ord<~a)?n5P%=;P_3 v$|Ǥ׊ԕ#\_;FIg x<@nș<g}`d\%$ IM o6~Hb"h#G6Yv,3(|uگg-`^4{? ] t<.q7ID=`zE:B ; :e0ZB&eʀGU;U]K+3JLSF!,Gݡr ȭvPws/,yaF`D̢ۘerlʿ%&/@u0)K{X-,_V3 +G8. cCI~2+H +ɃfpbKڏD'q!iXOi:3d7uSG̰챼t\n-+JʆyDN$CD>#{]@swB_wT~ êt<^{2K'V!+$^x8h~FBf7+elar>U,%$L)Xxyspv:ЕqRM1Ey=>W9 fG "CYUfMW26l4 ~ ? endstream endobj 2396 0 obj <> endobj 2397 0 obj <> endobj 2398 0 obj <> endobj 2399 0 obj <> endobj 2389 0 obj <>stream +HWkoF_om 3ody-P`iD[l%%){KQ,(3w9sZBr 1FfSJq^~ޑcuo +:5 ,eE.r-2 _w V~.sr^Ȝr!I̖k­&I ss,rjIgw,/ l"E\e<[v}O%r3)MnL-~\nP¥o|^j O}xXI+) /d(4!܇'C3&$*2%sXn FEʃyhSPun痢+Է}[͛W} Ƕ%$8N^7PnP g|Pj? THWfx+6*}"TU򦬛E,{rU%/L ,XHP b@Kٯ8c90FQ_\(/pI!X|J痀wCEv+ B9$-- s"g9b|q~ DlW@m]/d[ꪪyVmM߮*ҵi$cP"CUٝ^1pT$%u *ptl"8oL:sɫ`s>/DԄ ofm ,uI*,6S!B{d?ЧZQ$˗6!g p̄"5VJTLx.IZ7f :JGYgP3d2M;J +\@զZ9~AS&"\Zh3l.9 w&SKH s ,VeOT%<i'13vۛj >h d 7z7͏p6ߡ6^0ҸrvNCøC=hpt6f\"N^>ukw|v‰S=)0Fg}ZåJk#@> (vw Y k͉0(ǯɖo]+ I\ .RƥCZ !H+_7v,m8ut91I˭mBGÓwW÷{x}inZGڦǑ#yՌ` + +su>L.mʥ5Znd]~m-O܈Px _OU!ǷjC&1x'x{$݇`!`iȗw Caw'nEK:E'K}|2d/fEgXTtFavA_fӮΩUt+OE%EE| +å ɒm7@AP9VУ[P6^`n-9$N dݪB* >'Cyʙx}]{g)J]鳦qXUأ& OHD[QpocyĦ3'麾b5c= N_/AGq626EE`,̙s"Yd`-YExV *"nV6"zY hЪ}g֜ +c Sͺus&Ũw>scBH@O0*$ZFk1A#6K0[(D.&a (isP}?x ԩ);Z2mV663,@K!)_̅҃Ty?k;/aҶsՊ! UZA#vQf1n$@OIL: lsLLY6}yWړړA%%QОFRLsc;>~[g]^p@B p_|.( ᅩwy8+eX_~Un댙 A%ҝKa|ܽ0섁b6#bMnX\ ]9 EYPtc.WUKmW}|Pԁ0( HMB:eaq\ĠbiUWBbnrP6F|nZ"޸ܐHIjQY= OǶ) +$uJ +$㽉O Et$ܔ3. Z?o_ Ru>iBDxb|BgF|؁fpw3̺Z#2/չ*8ݮZ[oz[F)$'Mo4}.3{xH"}ݞ5VG#IHEvݵcbZ/XEP$=H8KnwiOqZ AgDdƤ.BE& "dX$~j4`4/Zi-$QPsʾb;v# eA`rn&>~,1yA <=`(gw쓶BPo`b ̎\(V^WMf5j:AcePaGddVF\'8 )"#^mէq ]LVHhZ>,A_bu88"'fc U4\!ߣ2W|z{N@lL^jʤG~NKASd#)m +&n ;$M$;ZbC[ޛo&-@ `B;r+Lp !='W?pv6>OA/O8zlJɤ9ro ֞ +cww>uVH?BIit/[vʆ@їʄ}i^>gxrKᥠBRd + @U:|;ky0۪NL(wW endstream endobj 2394 0 obj <>stream +0 Q@&JT Q|ǧok6~r%Rk^M[pzaz֦ +A`gHCf?Sz,E!j^1V$/o΅LUwoapY*YGLyjQNrm[OGsm \G\:h".~ζ ʴut =0Tago Ϧ։r$3=k/ۣXh&7ʆRĂ>5N%&Q +*^43 Ty߹z^6#LYAYq'.]2cXlb(OpQ]PWKEbw/cUf]b:CA2㴸.5՜3w󴟝B_E2"{[Džgqu~}pͯ j"UY+'&oXlD͌OX 5Th5U&TgGG٬F=%#;a +?e]NU[Pod-Pƺ՚PTS|޾%lXUWTlaN/m",Ib2ąE[OƷjݑ6S-2(ih^!:g](,_(/TI?7]4 5Z]z[mVщSI;蹥2ˏ(XKU"-R{~䋑gPNn(TLh,M6L3j[eYp1lGΰ#bCŽ4y PЪLmEB-bX7M*[,wBw-WFthe>!ے!@%8GMU c1?fuHQR=QD3E-%1%F +G~S ѼՐ6%שPP-x`Vz-yZ**ݎԬk$ +ܶhn}sҍv7:ʯЙz&wadcn=[W5Phj6dnbߊl]s'I{w. aSooDBUת4h&3vncP+}U}CZ֤]^4% K6J +Q|XiPI޳Wޣe{V0d⪈p.E v6ü!ȄJ3KY!绽+8{(7O5΃}1*dnS;2c,^b,IvwDRgq=[ȕp=:Vn:7*%Z:aL4:sM>tAweJ͋j%T[Kc3㓦}UųhVRzՀ0hgǩ!(H]$ϔƀI)w,l$'9y ^"{PT\{ɕJ)&V f9BTEeȎvdؗ"PO;+7|\ 9 +"h^ [D =7h? CM? }?>{ρ)-V"%G >ޒ%%rmn;::먣I +szK Ļ 0_"]bWWq%q9ܑ +g#VCL%uvݶ|y:V]s3G(%S| 6uXA{c3W_m~'46+'In]k5 + +!IP7IAa߿<36͠^pڡgl + +Y0" jki&zAL |I_c -20_AqF~< Q i`ʹ4s?P'i"r{?$4~xX)4 M2؆.&ӣlpWT:TnR]fI޷?G̚b槫˔*Ii aNX$Kœ#-)uܝ(+2J)5x;dQK.vT5Єw@-KDwhz%Z 6HfYQl˾w'[Uu.mn\hB?ITJr>.v X2-WBx9BD~/E4si3[cUwrB%fC*P?pQtQ]!n_D|]F Jժ˿`y>)tJ.'˯ k;KbrJ8+C$gyoҨ'WAO͋᮹vHݩsYF xEYҶv#V=w4q'5ۦ~=buv>s “}{O1 z14$i kI:V[)T TC7C.$7p^&$hSRzH5Eͳw3`:?5^ɲDt'U*1ph&,m'ȥ܉qpJI],Zl4}"xULlȠjI0!GD9nEMMFz”13skDH:Z7`ȳ*x5ډ3 a}gH|yJU +L"O=iyk3 M޾G;5&Sوm31i)WO2Ph4iSuv8ZK+89}qu +Po߮:sS +CA<_2.^K +БTN9wǒO }|1=o 8*CH M1{>vfՉC6FD14t1=ԣ| i" 5cZɀ4z }~-wr:BKQ_ +vDa[PŸ]ۗă4M%} e+[{ Xj@\~ERWl]ϊllⓚ]4iAk+=QxTn&5 +^ le@_= 5mKYz+_J +fG>y1F1K +с!--SB-y'HH <H-;K^mE?infg2:~20ޡ,ySqp)#,>4?#,=|tkx +4)uR@ 6Vߑ5kQɄ]6I\$)7 %+WjP} /VTB3sG=,+!!WV=˂S*uh̹Ւ$66px1妱Pm!JdѢVqvI1Zq t>!CsVK1| +UT}̷ %D65QIaO%pG +p*!\9~{CJ;>VѝQ4&gIHj?b$,ܟN\ :_ѯΟ=%3W 2y&&c{5^ZjvXx2}x{zy^xC/2❢75t|]uam<j kcxS@%vzW  gQ'QT5iVo=M븹ˍ Wֈ nR`;!}Ծ\d Kl^m}1X̙OM`~L!g~ϭ C/U" Ԓn>3ftWkx/R%݃ * spT{}w g=<{35BAXC`cL'eE鸇S`Ţ+5~GL7.o9Xե *d]1rRsCIOd0kK_|vJ?SsG *tۃyOMSX"}rd$S<"${1NSsp t<ZN4"Z`.(*.i z&rWQbbo٪x+m+vD۠u^TVbbUa1"t9& uj}tp'3=vG8pMV[^sѫ`eLTg^*x'2{5?ѪS'MoEȬ% ipdj+k] xYQdB;sBnaiQ AC|2^"H *%;Zȹ#=ZZ?B:KDLoLCJ|LIe>e!?g<78:K/4kDn{x'd`2%b#|ZW0UQ.U;v+_\b*TxYOJ4hJ3v~DTMOۿC,'vZbi8UCR/n+HGvL1..wR5]F=aqgupIyLseQMN-kl+19˗×9qt́㘩E18kPDo Æl)51D'K(;A#wg懢:A]NrU=91Hr 4D ڨLzUN^;+{%(&QòX3 + +@(,JΠ[QG.lAقsrN+"a|au_^ + oLl-oimQv6aB女ߡ{ HI +m@Fz\OJ%O* +z=(n|ך݈d=Zt7T1uss kV^N '\rկ1ŸIM*dPܥ\^<9N`r•*j4'A"Z\WL@&eظ۴h1w|A${hm=5= ڵ;-]LsLL\L^a7둃g\Y>5(` qMR7w`̼k*W%⾻1$v%)\9VxqtJxWĀ:mƳqOq9ꈱ8S  mƳ{dP)}{uU Q'TMQTܧ7pnu[fUf7؃7bR_R[=ɨd ƿOX_M(/sw!,Pwp~k&>=y}M|9At25jev<0G21_(F  UXZ*A-e1<צە`Jc,1[@d +.T|`2*o&Eib=}D v3;r*MDTMQ "\me|g/7EvtwO 5ua( pV-DE'_ %am}+`WG4`<Rbg8kWѫ!;G++,>Gwō +rSeɨ d3lD6^.͖ق[1JC{IN\nMbg Л%i^LW&_R]F#"td Ir{Cnӄz%T8,Wv҆[>0 YSodi]{i^#Rh +n.] +&&*ˏ;dwߕs^A>[K>#" }TFԶ: +%O}0qqyPGloN"IV%s/s")˅lS~ %lhj~9w/Z%2 `JsQ6vGEH+">52 +N6)`Issn%2>/CRͅ)/:O {<9ܽ|? ;}%=4lAۑyxV$tBn2Kr) TOzXe fFِaaxѰygtbx!+ȼKx AZ !8u/8AzA29WjѴZM[ Ie簸uL͊W4'ڴL AbSРD"{T`KV*/C" >N-*])EdX4]&sᨼu~װBM?81d*Ha%2QfI5EaW Pk0d&gRci_D$\:ƾ$58@\'sk\ΈFSfFyY +~0NUN$uD~C +,8 a34tEQb eЋW3&PY3%7',dč61t{:0/6I**p#pX7zE>xX1^[y?Q,u)yQ"O~PdBu+^!?7`.CYR#:AZʙY4i?àf-(b&εy > PDw̹l=^$`1ʖlDE9~l"6r=b_ķϪ 8ފ1M$ͳ:M!{q%dHLde!@1aK5s,~Գ$ z.*HTzocm>v%Z+%Lj% +z(1xfd#^_g|eFׂDZрtZݦoIC@]x{D:%'׷uf) (*jH-``ANlY?FOtu4,c!U#FC-–l!@{x% qM\a$C +V`%^,:8p83-dU/WU\9:[_Cb];O OIPnIaѲETu̻Išn_'YKP>^dcqE* r"Ԕ{MZaao\<%p6]Z`$)2~D#;K,æh +%~#osiV*U~{}PyVBl;~khnq`X,*ƒmJb{-3PZ,1 QZ G>`B|2qCNcV^9[ rŠ`הSl [ 1ڢv rdgڊqO[楿IdŊFQ,p>}e҅]F:B|ǽMҲ"]@44%zūf8$(:m *VtwAֻӒYw3: qrm iD|讯~1u?Al{o\8/bV6&{5u\+uSj rlnZoc$稸S# xQKrFIȃ3p' {> Yǵ-];,ܯa_OJYC 8nE<,:.UPk#9F<>@6)*t +tx.xsyjrhFkis(=t b)݋/7 <VX@(ꯣ"W['ZxHe<XxffwvRkG Ðs}(T;uÈ#!(`T!ZܐQ{ȅ2?;MOZRݍ5;L|"#VUϏHV yEݎ{K="-UG,&χ0zi//Rn K !$051PO&Pk5Nd01aY%W (gvUe?D79~A5IcCf0K6N͌5w|X }Vsxb7P s}#T'&TƅG-կޗ9jA M!W뽬$mjSϒt +/kjʶ")vUj2MV.C3-ʂ يȑע ᐟ'p L!9bQ<֣z"DV !{+%-k#MozD>؛[elNDh}N>,/7su jYSi=8.g!e͍ +9 #${?nc#SЏM0FDn?3+(=̀G\ +@ xA254RmP3 ɴ"܂pDV lV(L ]`YV-%WU2&M9j YU\#n T) +&6KԼQ +De~AΑeO6C] {!t p]#~ V:S<pcs&{x4.uh-u@;6u)YO.ƃo &Aeٕ:-٢ , j'k.9H50/ML[Ax-HS +%BUHi,%ܫZ3TwNoC +{hVH~[JO-~ʔiI+rc[{еIvk+ZcZgr0|#j'}s#V +446߇p{lRL'jzmk?'jº05ǹR|ə4Ot [7Dѻ])3@m ׅ,ŹV+EwQP2VNAƙt [%OGl0`JbʙSjC Gb73XHI֡JyRuiKY14{ "0DXUC %q9h5u.ycMFIGsa, _sxՍ?S W\ùM|UaRNKL2fBTKUyez1yO?uv8bRjkp_WH~>hOM7fH֩lޭd!CӄMm.ffa^QSEaAMN]8̌^X98^~magAhoKSܳk`>@ˋw,ba?>>v0/s .OJ4gfOt'+ӾMs7D@yCRZՑ}H_J?I잎<62Zdu)yoNMǫNls NpQ"f`10$P[VvL{XoF͙A|q+^c 2Mx-mG[5WPhqo~gh;!Z/ an#/I,>CD9:ފI~IG_6.fYή{wL1f6q.1r[Z3JI,¦E}8=/Zz!f4R{9~=S9̀!|.^ZIL9t&"kuxo8Ϥ]"A F'}D#l]auq3maް9)>';+~U(rvҡ޻Gd>lP !L6dp +)o5:z@ q S&}%,ڲ\N}MNw.-aXekN"cuYdWx" ƿwF;=H#q:sM&##0H[hʯ}`'P߰kN(R_GHSa8X{O6013f m?F.znHlDۙD=>y7XI3 +u%Pt hFT!0ZWI+NFU垈V9uz9r]9+3MO~Ggv ;#ujVM>sD1zPQ4Leoj=>|=!jWINX% 3a}eǫf$(v cS8hY5[o$u;mQЖpH4g vwzKP~"C%Ba&3T8&v 6o]g?ym$e/h @8kJɞeOT?|P!h9xCivyB!7T{,ݿ'%aS}3f73c&G#բ`U_&H#_LW]oQU)/Cun23'晸ӍOl*0_߶Fh9. 13oSF|~UAK@%Ÿ]Z>C~>$qշ8e-_yC /|P>KoZAJb ,ȇBIL MKrm8ʥ:rt$I"U,xLwY]o7jA k1-dq3 (&ua| t' +o1K]*`n*).jl^ 6; yD|B|RQ)I0ReX +M:}5dnsjτp{Yי%0HVv϶X%Ϫ[0%,.(s|R-W'|^*%C#:QܝOSi]K8wURh^>RWTHЭq"wߗ!]bhKYYU̺Iؾxo[G_2F*nJSrJݑ@[c;x.%hI귑OJ}'SJ\jiJY s<W {33Кoc(x_#:kfkB^Nl,@&G|4L0xGucsEs͹j7xPY*jZ,ξ.["G<{~PqhX{ wCvR7ɌOIޡI¿sG$NgKg=i*woҗ *ZԤYdjycCn.]7aZ-Ř+Ga"g$>&C/Nq4@|N3qd` .(waǂ"jE%c%SVTc.sw~/I7JFcJR-Գ +uF/Yfhzs>"K>/4N0K# $ 125>?TI"`Udt!TMif, qރaLj?gF~f4j(ɛCp{xz'tpLt;%nXmAE:"nSobmGɘhC9:O]'k+DLNwBxՃ,XzY{1;O*:6|7{^y5BE/x/Uʩ5"TRڜ VG*gέW2NdsOU۷m!DTF,t%uYyoK(8c܇]a!71Ulj}@iR%˞^cw-Z$En b UUI%xqwpY@ѝI%ά~ W|yL&i0J*_i=_f %, { < VRc2ԣGЭ}{2*XbVxN+J.f?5` y_JSъv g ڲ,8.VP^ ;ގw~Z}a{/u"J\iDZg%*o>%=mwek'Fw^Bܙ (I 9j]x[_Kg/#E'śd$7f$!`YSo\5ڽ{ZU8<q!F)1WhZG:fxi!U@]Ը]jZ_y/(` Y&3ƈ5o2D^>X$fgk@Z84Apx SZ$$XLDPOE];JՁړ$ q}2O6ݻ CAXTq>h‡n-p^2:AjrB ϋZ9نOKP(P]QSZB~mSĪewng˜hE khv <ΈT|trl3D{$ =7ty?-KxO6ʇ֬:]܊^6%/\R +DEP?TD֞.6&6aS7ˇjZeGdxE4UH >` ;5b~{s+Dsz?ڥyȫ A +l-̻m:gE.ac k:N ú}o1~ L7sI pm[[p/;ǩ)ٯGѼgM!Y) +fl'!4%' Y{K=vEmPݹc7Z}ز@GiԔvTC;Y`o9Ͳ܆XϷ 'owL-jS/+Ӕu1ΩdBBu$2_?淳s90uدl{Z(7t s@c~v7e<'DDLCZBp 'xxBXKl]~7wN~zƉ"4*GNcD6}-'IlXX Gxbdԟ}D`U;bY1Jͻo~l!yH9=_LcjY#RJIA\!7Y2I4roN}zG'i g<= dt% <X\Ӎq"MjqԴq!+7st RBi]H +S5oFu`VCnaK)BvY$oR-q!a٧)(dP) qx!p8m?TWYob,8+ +n a"js,;Gf0 LG\<5Mjinh! +losǁ]h|d="%t@x)¼^}VUH(Ҹc0݂^{c+lJ$>bi +, 67 =L3iݣ3#Uy-&Ni{fZfcc=dVՄ` ^Xàdj]04jk6YzAQHI RC3u>znB HO?(0|2S\::=h0#7=}x/oyAy>қ#F=&ZЦԜWUϘA3]$ d~PJop-_?]r6*yſa?ag UJ +ُ't@9QGZt` +~ +EX$I˽]0@ISOLcYDcy]b-@.@ku`RajP6T=Mfs׸mX3 +5',9'#R͈}o씟 ` k/OʀIOx&H(OT5, D,|j'#L 1v!n5g(V ΆժW5@ait7vU)ZSQT)>cA-JGYoƆ.9"ͺ|[Zׁyh<ÇH UoM739B|a~q|zl"!F-:y¶RYd!`*E]^4f78ƇvH`8 &?}y+PvRfzp a1*CF)p9,2Gn]x)m'`{M +ӡxgraq(XT:SsgNhzX~ .qo đi4o.Pf: AM\_ܟj-ERkkMmҖi_S]w(x9 H: #6 :6}֩Ad"}jYh:P2ZD|s"`%&:p\MET qw(ފ<^oCQNP > endobj 2391 0 obj <> endobj 2392 0 obj <> endobj 2393 0 obj <> endobj 2383 0 obj <>stream +HW65bIEK9\ j8\-gu-W"IN7^MBqHμyw2%c3 + g6oowo>XSw͚XlTX+*+֥pq8}}ncc qe} WJJZ1oMغ'q( ݫ2.U*/+CɻU뛇nRT~=pj6޼;b"x$>X_~0Y0Hw7iUaj\=lsr `\]Z"+wk XiYJsq/Wݶ=/bBa6ŎZIQr+đnu7pgRBs^US? $$hYA/7K6` +hH`8M +sn*:'/yXi9݊c)4tQ%8_X+HGC툆/<vVTCA E#}z%9R2'iATWmM3PW9)Jɔ/F0?9 h}H"+ܑ,$OTK恩Oҳp ݙQIL\Ε£C+)C桒*nwHHG.ɮoV +MGhwY +yM+&+J cn#ҥYp۠];,&cw/Ȱ05[dŐ^&$` ѮHf 1'>sHYA?xAF^ +w蓤rDUpO*Y$NUaU,6q#zNƲ:|,8vJKXmOh.&h%ql6~ΐXnϮcRG7^\x`~RcCiэ;sA{Ҟ[f!5c/$]HvS2t t#4AȦUumKG>rf' +($x*ee AHiiK?g+r^ j ]6{h9f8u"RE ҈$Xiab/,1%FH@5*n8_z $Zр 2Cy V<]&7!MD!g >PtjxTb?t_%/@_0Ҵp]r]<|FX}yx? 4/nQ?c*V޶;9?Ʌ^QcwO'פE@D\y9{D]I$Drrx1C~IqGʵI_G9)6`L2M:fOdcFuZ_UXrK2/4VgqRQKwT +3?z掯Q&ҭJWIL/G rrA(iLrj2%2AhUܤA=%2qt$./u9#VנU +o]\|★cp'aM%i&B *r`r0Gfe0 ə^mk1q0x]vvQR:{!+#\^ssEpC[jb..2 zō 3̲j{:\6ŇNHYS"4 +9}}xp"KBfYL*Y˛jA0 ^.ļJ̫l׋o Q kiu޽ݿ.y㣂1ޮ7's\X6o.*ۇm}' endstream endobj 2388 0 obj <>stream +0 @@&W @Z xeCr g؞ +h5l`=D,AviFC:VRhI <-B5L3.X߉`]hpf[H?V;+NN5 +-51|{1Ӳ'krm-sb]f͓a;`n>FϬ/#}}6+c+pDpjJO]dr R?4M/=`0-^A@:[\TO?S7b`α#T[C8YY _O jk 3 /2ZN,MiXWWMho'e]:I] 9AH .tʼ+=ml~Q^j֝6d4m>\ *M9KCt;*@1'Q; +g46Z}]ܹX_s0n1a`|3 >A#gw2 ɘy_&PBY^PmÊA +H4Q2SQQH V6 ? N&9v'6s[[gJ|F mҰgpC"G8lOx#I1xLLpCq 1}W/Hᰉyh ~#OlabѭͯtϿRܭ ajy$2vLmhRQ_P $0eo@u$zj&D0ƶ"%v1ŗPӽ +ϰ%5*2kl dժ.jIAD?nX#KxV! Do7kLDCYg@v[vő{,EzjkJ#WWen)j1c\0',m1ْv + `.l{9 +}nXJ:.2R#rċ+=~ % HD>/lRߏѯE+8^-q=3.Kx)~Oa= tmR[~hb#3[Cc`>~CH/@;wp|`Eڹ{C՝W*F" &aC-FӊrV78lJVĒ5 _eM^~<ɹM>~(81Hd@ZF6kcNDVC/^o5'MӤ͎R +LNp]FIy4l_"J_Y1w4P@ E/na}2z}]K7dIXDӆ1dF0-8ӆ2gܞ+X pro`lVȉŽCVX\> IϹYmT_MhZ:u)]3ן +t/ b^pP̃?[v\*7盁jq2P$]/M@R[q={?M 2K<\ttM-ӊ ku 5@ kefIy]+48ϭ oO(οļW]pw5pbV5:L[IL>Hc>/0q#:|C0rG.q2Kjֽ+sUs[PH@4p`NivJUM cմ(G4č(<յhbm@Ӥ(_$p:E;5=AyfmM:w-RN3K 𕻀9K׶2e;-Ɔ$'I1~XL6xs*cPK`miY݂~*ŗQ& g I8<]5Ц\tFh:w( S#8MJȏ$^Bu ?{i&&l,/C,RI`Ursd *9X+~. 2oHTޒom(JI.Ĝ(*0[%6^hEdxQǩًGV-%:HW-U#iBQhTE@ĈAY5CXK|Ȳ8ZV³^$L֟y޵bgaYۖ|1㻥p\9:;[ZR%9!DNfE!hp I=X#2^nr8wmBӶ# &ra,.26[ZĤqRت!bTOqTM,_վ#)FF7_FJ<ҕ9$a5P؆svG ; beG.wk@ A矠 Lj^sf8Ѱ\}MwE?؊`Sd¥·DHn&1i)FL{i~%rQ*G -^nbϾnLuvlm^C0yj»{d Ukd*TrT#R M4$-Jan&5mpP(Dmo/g:Q&I#_ $lo [߄F7n*N4G~q(4ޒ?rxޝ,]\y˛Bh|(M|5vTvힽ!,Re2IOHy{t )7++VZZ$R7<9CY272+VdTgFɑi//c"2̷ ڧZNLVWSJcTg$Х-,E?{/bfh;,9ؖ^hgr@"iݎ˹M˭@+P'S蝄@! QY-]BUrpIpK.7,.)R0z.֍xOq~W@5hYZI~#v_d_:aRޫe +Z3脾؃}CZ=bRw'?9}13x6Ej҃lzQO?AQ6yhX[O=80ZMB DxȰޮk|pzVBvLW.WjLBxH&dT]rfAoND|ۇ[?e12ֺ_NBugqW|Ns?Ԓs,@HHҐZcuRqܪWD.+',sz)׽c~fm|zeK -C UN +@t޶!AsoM??бA>^4^?ӕM' f -Rp/EaًҹwOt`,կӔmSR#{BQBo?ZǡnN|0;o|3x(~lO&=[m(u|;C}W +?blVr5ԤJtT0 =-Гqb<HP؁ƴ_&QDAF**wh +;l_tvKNsٗ3_}t~FNcxXDѻCB#(o*}}z~a?^*9E[D#hG3$5dq*p$;ven-xWm/Bވ_/?(ni[!X|r\Pw9U4JPRғ/ [}j%ɿ` pYwAj)dN`.Ʌ:wb'OlW)% ؞ l +m!bμK./|Ks&:i{hb758$ 6XZ:A$(&"ajz+ec. o{bB sߍMi 䁉f.0̶H1n5 1];{>ot +וܧұ4'+we[}B]Ngv* +C(A r H;q=T0)G"\pqE\,ךGGul H^wO}fFx",DDhh#x.~&`4R~6c?ڟm̟lYV\/ k}6^ +-G\賥d. wB:Ő`]* )lPT +2Xբw>TEvWFp5؇,q陣=B{odߖ>7p:֬#*s}MV'>[6O=U Hd | 57X=Tb:Pycw7R]9MH|q)΢Y4CW}Z{ޙPlm +&75 O$J҆~[/ԈS)n"dXTf TwM ja(uO]o +S*(o#%i=|yMa d.$^:q1qv sƳ5C&M1YΘ@tUw*mX (yVQ[I6vnm9(zp=m䠦_anY gAr$-fSr) 6åj H8wwTn7Ηlરx,7y+ؙ0_J̙rjWōgzO֪hM~E["\$ۺIݒ~ + <"Epk竚 +&>ԀAN9bLs%3f +~aeT<>MegVM[Co#=R44UX׿T<=eZ.=q#.ʇ~Ac"i@4eU8\0JFE8Xv +>*AE8?b϶@2!6Mg +ppԔd5pځ|V} ̩p^YaJ<]faTYx^Q@@xLRvK"E3-A:lD#_&Lf}=H/B$az!޵h pNUecďDX9 6sД!0sut!<AVJY= LymG &mdVC^$ =!0f.75yWDYO>ceZBU[|a =E1uBL>奢aHKAہkxfdؑ{1mfڂlNoe-uFuч +#wD<(PM̜N{-pgϗȚŝ"= t+08Q.2c=(e +&]QQi65Ux\$(L,IRsi&4-ORu2BH +)( އ`Ep.js{.3GO K)Q!Xȕ78,#|Lɚ:tU)$ƸWR8_*W3ŵJpA4#y=F+FUaNeV];<.`P\+Yu\b4_7Ҁ{Cd{ձkjs&BOL t)IIS 6[ +{UHbZ^ y5&jǹ?/Sw "pp3YE8O Xږ=8GD;0URWoN>+ +,"5_.T2 \mpk::Y^ Q!+ߖq`fmR/5VObNyi>P*WLz͜p4=+KM8!;޷1,3nI Y 0 }]/Ħvp֯xEPq5\<oI(?.5KX|X@ zNn_ M&\~%'Lqq |ue_nI|R,$V +OzC! +ș 0]Ũ|Tf]xI f&v$L>QJjVm,\ e6-HcH-hHod1&y'HAݞyQ3jcwf- @4mI-;"ٰ*W MRۜˎԷ[gkkd:%/zp!OL'ޝÌUܻA낗p/?5{95])KU|7;&~Eʫ5RPاJ-/>]"nvFl}du# ˺ =<֪gWIiI̯,c:QP 4b0$ɁD 3=,OcUimwB},:U޻ б<"JF4~ӳ>и}x, +e su30*W{5]vx fHŃ\.fM&hCz#qsˬl.5uJ̏jĎ5;|Z&u ?*:`}+ E9뺖մ̹od}ٍvm⭍@u$L(Iz &|4?Wlb,e7W-+r[Yy-H6Yg?E9cF l^f 6_{Y]ye|BgXeKu A,-Zw'f[\G@x &Hޱs)|x51"\V.fPK XȰ G +*r^AW&C;a3>-BZ*VzY=퇐T4P^:L]A@ +ۅ`ZD1l9 Uk|6U&,Y(i&!A.Izz,}߮V-$8ɻxyDY;^oɈ1$AͿIȦ%bcJR Uism2kjGsr׬bۡo$I¿*gI͹nϡP]D]Y iFfUG H;1p`;g~c!q GYVˢG1^Xud_VhM ,x7 : =ä2j6^DUGg-/u}]yϠgv[A|#9z/#-w d}gP7@$MWxr+N]`/~{//tǖw + )׀G33PU{%4KQ4=6HkgU-덼ղn/>ȏt,?tV1ٕC<$p^ Z䱞RdҮ/{m0]Fh]txaLRZA+qP_AUds@p{_T=ی aUDbKu5 + +ee@}{vcl%M0׆n T"΁@\巧0AgtCq7].BtbkU­)_(lTg(ZKŲz r^D܁!$+;(&пPӝƥgVzP5UvJwiK5c Fͪp y\_m"SۖAۇ@ +!h݌WuZ a9Viij&_v"˿g1å7' M;k_v=vW6S W+?Wr'<-.Quѯ"4XTz{2"^Eo*$Fur=4-Z,%"v-vmdUU'CqS֨YG!R +z){>ޓҶ ^Ũ(ʂe@bnHA,@&wU AFE${Tzcby8wy \`%(A[ҫ ._f;%(U Oua 5)PA( =2t֔+u<رE mI ?z,̰o-ǍNLve5A/dā \CDKb1I۲!p:Xbbr#b.iY`蚲0?t,V+ٖ^xxֻ5\Ъ}EvPL'/zqR"dTw.pҷ4]ѧV~7f74Jj:&trlQ B= 9@@w[ gRd$b^ZB䎻H[nc-K7-­Np d[Bú3XlhNBBl0I,1s @v_#=apgK]{Y$pnI=إ2) `-d²piFhwc2âݤF򏁔2H:6e7 kfZ5tR"qdr(.=f&e88]^\Mᴉ]F~-F| IZvN׊dKBE* |w9EhC~ݚF Zi9IQw b>]V])%?<_ekFp(2jJ׃m>lJ@B7m9h#]3c8O,XcЧTzػ}8Z9tFU7LЍ}WsMۤq#Is|m +pZLRt(b S]:${e|-iX&XYq,V;M`"'ޖ'#f_1r~ X "f4#X o/!t )~U Lq&9ш/: Au.Ϊڣ یmUٓҊCϽdeDK?U5DjqMRffJ"cތy1GZ?wa45(،\p5V%f +(^EYC/sa4F0drg%U(f5ćדq^إsE-Fx˧9p'ҡ YwFGkD{wGcUe1k–xh{<$V>#RW>H\y%ddx'xӟlA'%InO'f&ѝ5T5~R&G7D6D]P +AE +9 ;ؘij`v 8C6-X;^ʏ3^@9O,}7:{H!2<_,B`LzB@^ \?d,(h!phU:E(S’>>;-|ȅfZct0JN3+8dtCscpM@'QZ-#%NA.'㏩ $_ rItQ?- w8>OR + +D.K9 5L ϴ*%|*'&14vY*UGcG5M?S ߒZT9+5ƅM_e߬HL 32G,IBPieU +tVDϧ +K"dj+Kc䟞9aw3ĥT6JWHFZ4_S<[Ț˼Vo bE/!iF_P"\B<'dS0ZN K\s)\tI3JזĨ,:?M}o9ke:s yjܹMDc1a!5٦?tmD*?G6PuRhj1&bwA@0RVssL[1jz>2rDRq^j69^=3 bg}}+XƦ b + p{ɸ/XEHgyӯYӃtR<|L|t]ɻQEWG& + zXbEp4ϏvU@?`3K',r}YLpP̽$+q;>xYnI+x$5!:nsZWz ngǎn~\'BQld]핕T|pq♶]n_n uyQx,@8˙():T \l˫[Qf@hl=*E+?j5Zk9R)7g yO&tt ?|7qЬrqhrFZ8%$gIub.|-(!vST ,jt>_!_%a-o!.oijՉ@!` +IjN3GjaDqKhI:4b7f8Z]mcvߏqJ{ќs`kk9bl>pl^N|z!"Hcw&q2 +n)baK 'Oogw*w9|vWB,C6q{ət gX̑D7`yqN{ͭ^aFeL..1٪L2Jy ϟr +Q4Tbe]hϺM-ZR//_eJOˏrC-"7SX =&p_n,JX :N%VUvJLDu?xa=^K8#I׳7S.D&qwd +{Ж?7;AF&*Ӄ+~~hGPd zcs7Ѩ-P0XW&Tn +|؁e=Y +i{d09M@}t@U EQ,ok^=n 0Wl`Xq\F0G[ӄvRmQ~ǸOxDOj{Z 'nfUWkiD`>?&y߆eRt)ws#' +Fyc>ȭ$u-O\ +E ο;' c&c[\r,!KH1ty`TV[+NderQvhϾЀ`U K޴"yاFp#oY(Yf +N I'܃,ETtNNvNf:LW5+ 8D!lZ&_Kr{<"vGr{ܡ/)r7LIE[%x+YC EC'˕~y?VJ>1lg͏$Ny?U$RX-=KdV9v(؜>ܴNG/dVIZMERpQ@%$wvqkS]SnZm-ĭW)Bz'㬣J-?c_wA{|Q6"`:V[^3)fI|ĞV3^e(]ns0 +}يx9<:,B_э#[\b UTNWFc˥s,7^o9gO[iN6v iH"[22T痢#R<sH֔[  9/bt@/w<K^p|&ID_I)ܠ9:q(i!z$,5I)/Ej>- jHj^jOs90<[֚m~Y{څYX-.Bö|%w _' lVpqj@F>x)KRwSqEQL/\+Hj~&Oh:ٽS;^*.(t@Gx1ܦ +T`4Dxamゴ_rlry!@UjNipMt7$$;Jn4+=U=]t&J5E.1KlYX>+r`N' + 0Z䖛9fsG!hĐ~*%Y.m'pZjwJoz 7ư8~ &0Q,ވs>p5=G}.;yYzbW[5+rNʀJw1M+u]C{e=9]@X~{M'b:$]7O_(*|NUITy^"{wf(#.$Zpb&GgV,(5\6p !*(F]t]{n+vO&+q8%lqeyW'$+]p;r^?kО*6:"oS?,f@ҍJxS<^LQ<ʒ@=P%/qNJe lr/Tp8|cj +ӛUV_V`&:Y+WʺD}%H?r7eXV:L f@b08qE:zy3g9=uLBGҖl'Ԅui"xQ PQI!֒5~FJ8U+f"/?l#XWP"w|ea3/#WDh3.W #scBjDJQU?s`{?f.cyV +?JSjq&HqAXXz}m⟎[!{ѯ.K OBn%J˚ie?н#K״fEOݠOc' |j>W.oX,O[ 3EHALQyF=CJ͍ MTRvL*va{gQ:W VsR86^~&^Pv"0 + Y-"l5[^UX/`/|(Ap +^siԊ*Yf unmHW_)ʢ>Y!"'y5,ޝtگߪ1^>"ILQDh*I)4e{mbviB{uk)(K& }ZHDF_Ru/$a̸ @ HL_[eQ֓=?Q |h5#3i@lб1a#m7 aF^mvHCdƁ֪<*jU; +'bj5S@6QǶoH o9ncG{W8yW(|-)ʔj.j_lcPN\صIN԰Lol1@(d!K#n x+”i[~lI> u&yǃ9O#}kVr[[d_xuběM,()DhuC,y KƧׅUIrcܴG +ҳήK ;q5`Ҭ F|4[d +t9sp\|<,'1gՒ[[gSPM8p|yxtq Nt.r>MyJyhK Yy?fJ|3 Ucp:p϶I NyVd#wpREfY +Oo| x/6Aa$-kg'd?zor*Dߑa!*meVO)5 +忄Y8GҀT؆~~i?O -P6yOȹ"-E xd*W̅;V\P&iz8ӼPum92:$.;r[)\$"3*P qE5|nNE1lw]}A"1EE $ Ɩu1 7Zе˒ y9Nz8!dTxDBUǫ5}&*\8eM,-mk ċRUH> +d.Oz[ը[$ʼ$uNYhs`YOG5g''4BAI 1R&V]O^V:uξɭK[ـt)VO<<Je`d-tǮ(:xX GCѼY|5x&qy~xLj^:KÆW 7v%.*(Ṇ2x$W$;5aSz|"c!q s["Nc54`2:G}w*fh#cD@kb/,^j-`qb-Eৼ@h0e_Et^T=p) +Pq?zuRVw^͹N5X&w]IJŅ\48'ab' $ gEs62/݁jz1w'vo$#tX;0JՒ,n~0wAF><2BZZE[(:k4 Шt^ +Ws'"J*,&IHi[wC)+!3뺘7,rZ|(S˂͐Apw{GH)ypA-}v5^1J^,\N/p=QjA%KH=:dƒ엃n5@7C?p DkhUHn/ kPO瞆#]B]tF0t&.pAI}Q<? ~͍T4o6ԐPy|dKP:@۾S-Pg+xq0fr|’s1gylwܕhM0ʘ0|7fDl6A- nc/!(B?y#z&; +{;z}ё#ZVn8I= +|x#X̝|ֈ2+E\rT\WB\N"*(βn\8+:}~gRc'mX.Y?͸!^9 +YɩeVcߕf:!'x2?ӿp^@>2(r>ֳU C)tܶF3I +m0'_,\p F_N%{9S$@aBէfE +>y6Dy2k|&@\cc>uZ#GcZ< iyD'L6m +x]_: cԐ7WfH]kAօc=kGbG}] eHxʪf{ y[,U4Jh:38~&Q2L8Hs/x>pfSO0e +wSK,)}n ۸ ~:_g݆NBt4S3O%ڟRݢ)=vMHJBjfB@=bfZDh-{PIۈ <`XٸZ%K{ֶTn%}Xq-a{[ҩ'vJYU y{Fs4 &+"~: qM6妝xQ)h6!.} +OF\m?_dw-" +wV z ];@mK,u-6G"HF}1P~㿣1{fL0O엠(AD΅{N,`=2(uD To Sb>W +cmRO?Q?Q7~QDS,jjɼ{4:KL[c|iXWx™vlI:u5}p +P \r_mҨ rlu@q7/5f sDo _CXTT=ҏSp tuhW@9ȬN/'t(e̺6NdP%{m`W"qG>\%Shi{7gXөqc}dOly!idU3ML%1ʵLLht6.$-I 6 vigpϽi#{1ph9 ͞ڋi& #g:[i[8,]A [Oh ͡m,>yܓ-<*b5a?d} Cϛ3IFz.e{.bmi4͹ +%3_,I8H(l$&C12|>xI-Zfk->>-qrжUe$tv!MdHxc +]iqd2By,_*p̀y[\ YFGztfc 4KqiJ-}eRe$a:[S/87W +sGxrm _r A,Wݹ9` +4/Yp?,5 "cZ0WB{B|cCVY?DQ`bHBҫ`4^WEš:/Ӯ] o=bfb|@qR.ӱ)Bj/.PcXlϐE=ܹh]GA6)*K@ʓs}G""m wpyE'VVgv=,3#D [`Y~-;Z}҉f2㞂P;1ro\Ra!42ߒ9#8ɋxOaW@'W`YZnƑإ-GdH152.vo/~͗HQUSچؕwK]oMfK1-/:/kyz>0{^bWgLشn%Z㇭{=֤ܞ#s2l}Gq >3lp +4j48cY :k#eΨBo%5?I`\3>XVց2=J? U?MUrW*Dt+.UJWڐ1_ 6jw#xǚ^Dhx7L/Ńf/>'v,]gKLXlDA͓S +3H 3^տj@Y2FYf+{qvp]l1GNEmw)9W`9*QMr ˠ endstream endobj 2384 0 obj <> endobj 2385 0 obj <> endobj 2386 0 obj <> endobj 2387 0 obj <> endobj 2376 0 obj <>stream +HWnG}Wc0}A[^xElcAI# rzbE2XԩS_Y"$eT~VŇŗ)Ot/j^=T/U*+40Cw/v+7SDU;20x\u[bμed0 jj Vw2&Mt(J)CVOiۭO۶^u;:ͩWmsֿE_5hy!|Ko_}qɽ/KtV])j Vuś +4#! 1LvB| +eR>)|&SpS7wd@bu 6uJyu;Ι?fk"%Cw=yr⣗+/x=:#O9;Nc1ea;Qp{ptQoU4\۔BFeHY$Ȩq'B +SIg NAA|./~i=dҍO>d|<i{]W."tH̀P)u b_w}}΁=mZ BdVm +ڥ͹pϣL|>oOS:CYIS6{n%hm "F.˧!̒k8!<{^mxЁ "+@܇1A̪Gl*N}\ +*& +i rچ}{&ZJ&Aՠ3aEiΖɉxati;tIqrgU2 4|2KY&24w䗀>CØM-`s.,x2e!4 +Ҭ}]ɮ3tP>lۡXr"(?F΢Y "(V[{ƚPMSPpADW= L#Nd1=uwvBؐR+bRW7::K7ӳXA#ECMgIN&A]2HZTY} d+TO=js``I/8;j_=Moط8q"6u3]c fz[ ~ȸߙ +7uu۵ 4 Q -ܟI(^ Ǽ1c4}"c HPno&;XK#@# [ O.kR钉<+? su NJuƞHp^@El +~i7QᜣEL !ʱPq)4 a{\j^9,JV8d|ڀTԀ!T^}$J%7ms6ga{LcDBw?s ̭g;! w50uJ,-^Dʵ_D'}aMf"J7øY47.$eiv#`+I8>U$%F6S& xfi v:cT)'@$J^8`2n°N?ZkRm1S)|5A_p܏:\r<raXa dnayWxtÿfp,df-cGk >~kjgVns;\(^Ā9a=QZZ\< + RL[D(pEAQ˧qFUnHLX)RQ<UinaD tk)P|Jg9x`~ɣ wj EDX"fe3ns⛋HCPf?{}FBn`|.sV!AJT$XHb`<$Ar%AR FxhtPm# -FWx@h5dkJ6yZ%%8m2eG( +kf=L֨f^`fT_mv.:.k6M hesIXT0 Mwk +@_s( /)8֑)r\Ӟƚ9dT45I.թET "B#3H$y2]~U `&DtxVc%@G[ST b5&D'qH2@U)]Q0$`SZ?ld4n]&m/Š3ig!0թI;5)^o].śO/2;)3%gDJs TD(um?! 3GIfNPv' +xG2=g܁3^%5{M[SE +O}vڄ-pr ўltB ~? 8f.4wn\nKHʬ1AcQ.ct:$*=x 0MX endstream endobj 2382 0 obj <>stream +0 H@&W H}"IJ!Vk jv\Vuu* +\ıW#\4xzg0^Ȗ&P=?r8GI1n;r*#ȋf _;paɜC,Hv +<Nˢ+k?BDN#rt+SOIA bKAr8c(T,R5pe1r <7Cs i? +oI~ +ח]MW(Ǽ3ue<:5&u`x3,x[ٍ]~"UVZ|Zs0Ehwgb{b:>-R[v\:S>GNTDઔn߷Jʠ +ɟ[ִ|="E^t嘢e*- 25(g8G˷ԣ gHL^?G{ [ЀYai}fxQ3&QDȆ-30^# +2SU>M+H00E;A؊kDb@Z%:!!-[侙ھQ2k}4Y?ktH8p +ކ3GXc Yw"tv6*@iIB^1%UNg%u2_hV[r~Rͪ818exؠd[3Ti"6J0 G2@5c+-п˫[̜ ]wJi7la)Pp t;b6;<'?K pPV ¾p޸27|G-ANe6kI'v 5Q4˦ ! WO&ouCcob[[wMa"W2,|cd;o* +? !SӗfH~*@"cT'4 )LV|rMZzzaI53COVO[T:41 obf%tWNR(gB戌<hfxek3L¸og'tζ&= 7̄n)+"S6,DxOLR>mqTXJ8}bpgGaNE.D-<_(ָ[ӝBs0 U̘Ls|m#p{P$PL܃gh9R*M;ZO[ͮPLd`i7BU",>6/mD6tIEDfU+%׉%Y ImS"jo[%aD@MB7MM{T#c Mt0&qSUImqe|2Lj9+NíN}ߠsHTj՝q2 .r,/ 0@KY:Z\ʗQ<2Qz@:,Cֺ2^oK 1~p\=wnCW9kv5H*V&eAcH`@Ğ^Cܲ=Is]YO2Xe"$r4d]I_\t7p5+!\VRqǧ>:.et6qAQ٘ 4k +nm-Шҋ%Lٰ&<ȾS󐸗 {~*p]re}j$]4Έ$sPN# DTnl󖌑D3i9G+sILԵ#ȓa752|"k&N͝%B:ncAZ|#)3|! aV_Gj艹H'mck„4 H5kNi/Xd_Ypi p$w7d_w̳o;T&]t'6c.ꨠlZNMO06,۝!]}<~K|tmY<܎$x퍾R<-r+4SYq?O)-9]oaPڷ[/CQت_ [| s X+Am_ddO;<RrD6h$Iث+宱Jyrj>aHaPATQvںgtU">0ꍧroQ'1r[o5ZN!X_Su`#p!8pf\i#͑ 4VIU2%)ID yb4|bnFP?qwm ~.AB֟xǭT#"h8SGpt"=uk;,Xq,CP<:%?a6zOt{k4ӟO|/ˇplO䗖*bDl,c#)J\S)vg(r>w]:l(]8lW z.n=I!E3r4oޜ&FIhdi* dTW寓6,PҤ3$sA�~Ur1`E jXWa, +&' 0.&WGD~+#L:B^$yFDkgo^؈)`v D7dX} [<@Wʱ<6 lB?#;&:4C!k(U "!˜qcQ,ρ|(9yd=~J[EL +)1N]$Q+(*txb^mQZbJ lh@-8oms_تD}WDd!jIqW塤J.mml=BX$٠n//8@uXnrDglFQ f< +cXEQ*d)("JW8 + w%gӷ6_tuh=f.Ń w:D*% h(Cy.C܆XbnTJ +@ +hKڹg=Ԭ.SL_URͯ| asLKy;nԕ/WM<߬YC1ɕ2)7`#ߕ^bpfD U_`O/a=ª+!KqFiyW_f+Lʺ]Z!d.(c&"̀ϫqHBcUw8I q2.>rlIDE0A}'^2|ȭm0Yp ۆĊm@},O;,Xg`5&5XOKxkpH+\OyLB'/L8[0XBC01'iIGr̈f-i #ϬQO# ۧ޺!٩fP^Մ]hkhJKs%巭> >H$i nl,NW5JTPM.{Gi%GlAYPNʒ +LdagC-!1&a+C mu%F@K` + K_䄎͹}8 +~B$b 8!.FZ޲Su8aW5:EUg/ ^_g%`qK[Kӛퟭ Na9@->5Z1z@8} +H2PTئW3>9~$yjB:,\&{}ԧ[ou $KOe l}_6# +-0lSz:H'1ҎO\mõ:$#b  zJ5<ZsW^\r/d&Z]Gs +4؍q$]8 udE`6p`1*ue7!m׻;ONm iB{Պ9962̕#:gp:OVt21f H@|z>fHrUv*VK3ʄ3ʙh+tSkyN1qѹ¸St&5SHgCN/jC|6EF0qῐ0k(5xk%]`%X`Y_Xn \tCVQYv4:"QP0S+c +RW50zrT]hNWqe`9ǭ Y&7;(p<8u>WNf6"ʌ7q$ nc5\JQH^EƵ ަ)k wY@n/W &p~]V64:$֫[gX& 8GjC΢uzujD^qlq弆jW؂Pҝ[a+߃ihWrWb*9vsՁox-[K",Ɣc6~ug^vˋkfAZ1BqAkJI +!() hc†>Vّ* l׋-z^rooK+B Foy^R"H!hyX0 !"4FR> )01b<p;T]ݜI| (GI3P9p]h_h-EBo܇Y@OC+uUX|1¡RN?2UmኀiNv2?̐miq^i"&= + 'z;uht8߫1 R\$j0c%H:KpnTS\)w CjqPl+O6Q҄ QU"Kܚ':Nh~c~RedkS f/:q]v +~C(j!GsJ֨1{]l3[qmrr_%Ê)ƒ4iVDK&AD:5oۀ2SdלO;Wvh^C.]!on2džthO>qF ^*si&L+6Α +QO<`a!Ԝ\Q^hx 𴆕*? 쐘D6LB*gcĽ>aن"y4jA/%ƨD(#lZG[`47q!҄ [^Q=c,RPi+9| P ;N$1BPO3 Hͮk)"/~CGD'7Lh3Na771s_\lyF1Ra="r2ɕb +;G-ewWTCǿ~_]ޞT5Fa;Y2?OW T%N/ycW ++Çn-S@h8ϗHo:'Q.Th[}p@'[#ɰQ9› }g. 35S#n?}&|B B;:2KPSdKڄ6քTB<9'zqQ M87~_u]1ߴ +^kuL2sq=7(v^ 2vc[ϭohۛ(t>0u4U5@ %2~Zxkܺ_n@$5pgQJX0`uF.+d^|V@OU1[/"' U +Yn/'{.[dnv:\k')Y|92?tƿ|4JYBi 0S?Fvxc趈5W>Ntmx_OCN =_V,GWygu6RgCO4ik usf|깳:ć&ܥSWZ'a|k+)8[$|]cBǫg - +;^f/JC6x $iO0+V2vv| Cz$]~=H8"@eP8Cq\ Bq馹f}R$K/4Z- +U픶sa/eISI!aL?ۇGjqP=7ܣݭ$+)ƓDQJȅ6wH9&exY",\jr56>}{N#*SNnJ4?x kwr[ـ$t g 6v%FcPxiy#\<:u g+Κĉ:w +S3]WR+6V *M]Z* :%$f *ny'俏*']a؄ADа/Zo[POW$ Fi򸕢XMymĹRoczv?s%y֙bw,gE w^1f%zQdJ\Tc #&Y!e(%A.xq=겉L+/sή?Nm!5 9$A5d|k-,gVڐP l mN *ТDSTQۜEovkK4u?J)K$j&0Pb +Lyˡ(oHΛy}laCKr1BY#4i$!iڷ6]n҈R453זi<[sO['}z[G wp4u)w8u9s yG,ב 5Cz$:x{{+hrSGoreP`埌WԾ[ r9!L/OaQY dh8&)9DjkGst5~ FjvX,CaM)~œ7n%7nBF־*!HqNQ#ړHwFOC//ܔUB5SZ>ꜜ= gw7⏏Yl4C~PQcpX#FXm t) ZSL +38%qՉ7=hqPWcn7E0qǑ߶_bU%$EPg& 2!{ЖFut&;THAAa7{=bkeu3VW::zn!XEI>C2|w11Oc P]nMQ{UwG tmϣLKL M>E%0HS}fC!@mBn}v"{St wň'=q 3~խ(qk[Icnw~ ޔ1>r"@k?xf>a*ˋG?`D[f)VεsEG)2h/:q5OW~+ p5pM- iR'ioUDHꤚtl2|őۚiNte@ӭfzNKg7FH͸ .aE~3PkrI>n jF0Ɓ-\#.;;K(Fu#ErLe~6y*c1 bHf(u +*Fo }᫉p-3X$"TmjJva 96~ͨszpQRv>'23-3&* + Co|'bq@&b'[#cSHdx@.3k#U9[a}X_8Hc#t@D>pd4,I#X+ 8)HIRݠmu9p'R#x-DfP +iE*~F3>`r]qc8a>!#-@?4EKd% +o5Ø.)d{Y mxBqfMK>2n0bXoDSbftU<2Kf0-jc.eT:Yht֛IAMxzk;t x,/fK\bp12dsdY {]lS*vd27lY"s?a-NI7]0 ɩ$,p%=dl_ 8ǒOwGpMy:־*(]yM-bc|eMLZr*^DXP$Vf"R aB>2ךhp"Kc SbLDd^GfD+E@~d"`SL\V Q'qX +_)ƌ*J1=2o/=`Qu1@PS?bbӭc$q}$֞ z&C\Y1^Fs .eNGy͗'"G ʸkQ{5 ]#D|3:"|=X f_2?|<0ۼ<ۘژd9Z51 c 1 +e?S1g +(:3 u^"JnaF>j<X(iM78J^OӕXTVs!ЛùTY,=d:={g' dva|Y}_b}j# +QAf[8ZJ3l[J 9> FLl]pP!8QZ +Xf_ż_fr? +zRwiSBN_Qtn u2ޘ^y`!CaJ9v7U;N+e C`%)#3kԼ-{F8N · @edtտ>vҟ,Ɇ+ + 0 +uqbZAHo$#E#Y`A5y ^lBG^T2sqA8꼩Gyւfou{*Fbo20 Û@Ɣg^:ʺ(>Bcҡ͖ϓWa0.M$>wԩ]iijr5>OOнOZ$཭- TګjCln93ܞoP1neg[m@NjS`Q|ǖM=X*.àd I1IoZ** +[ϩzstCC1|ůJ:N:Eз`/N%՝$"~^_p]Vr>$^W/ `)ڲ;E˓EۊlԒ 2x7bMhP7k[/`LU;syXw 8F_g XWd}H fZ)>(QͭEA)-P ܞr!L"|;V+Y Uzr#0wGuA‰#xqY^Q3`7i}^Nc;,"v^Բu<. CT;)M$N3] +-Cǽ{? 4`[ +kL"-boe4F]~'7;˄֟Km>º0㮠7 _6[8ڞ_SN]8U5{=0'HINr /[BSMG@< Ԝ.v`B-ȣGa>sNFʾqx:kޡ0rVG=ȎH#xq@~ ϚagYWʽp>9 i wd:zyZ`&=H:>wJ"Duyԃ EB&q5FS''7Tituv LqVؙfZAH z;^@{:1v9v}bj[49)vLcVyQ9|K#2 ૢ0x͠_)|ڦɕwPsKg!^tH+/2`sީ:c57XMRH1ouݔ*xeEm6cLڠVB;aT6,\~vb/b@>. 9enzP[7) AmBw-AY(uT\c$uJ11 ܡ( +hbUp#pZ/t  _w>L!i23a ~pNE*lx\%BU@5d +6P%>#@>enOՇxv͢Ȉ,]/m7OW5l!*!J;)5a*H~? -$i"F@2>ZqzϬW?uHfX!MRna=Yh2,/-I^k"z#2rۋ0!#qLhyI@Mx6":.ͷ+l:&UGzv8[zKd&.UI::U)Ӷ#2h9ȿa2.+o7O>ë2%:|hfYPP{x CXeS["ڄYO=w"&[HJ{_츛# Ęev SDcߢzla~눨 mL`C if _DŽAj0pMm_kĨڃ"B}Nu!ܿÁ;{ b{_TGp'@ +VMkkӬRJdW#օv64:237`O L~cAcldODVl<˂ުL޾ HE&OX%з + I3}mDC uDs^-`nUT0#F՛ݬ鐼IbRP.X\O"y0LI(%{:xM`=q,_,T>cl-A^zeHOnQhNw{E}>Np ~n$٢d&q1x/Gpj3|,ncL7."J1&rb1{@IL6ykXkN8mO굃9w%w1yWBNn{:r=Vo)z)ښ!b^X]R! Ix^s+! l +sʼ[͖:ؼEǮfVL_ )$#f!.r}LQOL=Q(Ƞ˧v;ptCr]&gv^ݛЦD7D(Ckn̉:\9DMuKu*pf'?k±W9|bޠ7>j[p`8#SZAO.wgld~q +}d>QNrw),+ޤj;5f1 DK-`!w,/uA.|ߜVPҴF'*>X6>i*x#w؈$kdgfmTModř2JwhHI4yRT|MU$(-nBR:Otq8,w;H@2u+ Zv[]D9*&0A쫔KN7))6O¶a.F?mq闚[eTLq`V-^1+FҀU:V˜Z+  ٌZ3#>lw&Ҿ-M߻J ;ӶlrA`E+=$)궾 Q3ڈ!0S:펗y`Y?$xjBj!5I9|[z_` 3jHer@ ~eo|Q}{C. 1M*c䙕WGNc8 `ȸeSy};XzPp,%f1%) +~ΊBY ^Ph~#z|jԭaddBm,"u-akێAL5[\؏ecbΜ汘Wo +2ªNE@j + x&sL4v[GAWyqZLBn;]뚤Hȅr I4>|IA"ܑviP8x7/XԙX0=e)\.ww\e[/"΀.q[o^n:pN%8U.Sjna"%o*ҥZqap"FZRL +)?47lPy$BA/ccFzpƊb{>hHpZ,3X *69e+U+l Q5=ECY:E)(Z=io +K+.Pb؂6$Ͷmm m}4'+LhOc0]aXtM̿^taqES!D" >⧓i9 F"vt{\׺UFcN\Ł(Ch[kJ~ YcШs3r6tn%*7;NdG H +q.K8(Ȯë:)KITUBW&: =XܒO&GV(zs޼*¸UvlM +/}iF/40 }DcU2%Կ( I f$7M}:u)з9qb}i0#c؟y+MTMSAs& [p1 M{+O7 o,⟓+R5Xڶ}{ OUb/3=qA < +`iBP3a؈"ɟ;\_`tT~6 + eHZ; P5 +T?Xbw^ KNҵgMoCA0vk`ɖtږ?"lG-S8)5N:!?/2MQ[<NdEZt[fRš +P +1Τj//&U !ѯSCtJ O8[ڥ0H lXQ߳CLhk}z'&*8: +[c;YD=W3phc4D <=QE3ϊ.~8bݷƗnV.^"j\6c)x,L*>xs7;+Y5I{9l,*3v"$#ЇPɥh?zc!R1ҷ!w.\xx*Z"cq~ƚXf蹮bf ~됥5X_uaAo*-!m_:pP[&ܡAROs#&@F';ha1K>9uo=A0b] Ly|RɨZ= ]OS fu_eE{1;Lb(mQFu =[W@뚪J"_<ʘeʖFB~@D[QfKQ7i7G8 'KUцlpD=[hMs|P`0âh0RZp+{p8 AmVH+ U` +{ ﶂ,xw<ԯI6&MXgQ$Xe$ Ro(E޵[X>rLK׊ :5OCأ(<rn:yqto'h^λp@i8gd#`*H|ЪJǜ֐>Yzm`4Ke֥`p+^m"mF+HADp +,KHo$.b >^5ɟ)e>Pȋ>էqHz~=:X +F'&0wOI9c>̴[!781\朋 Sy/X\y# !9G(GEMe'QaV9k4's<߭@_xkp/!cB6t[LO)P1`="UC{ Ŀȟ*:ؼ+:L槫P6MT eM~; ^eK7U09<^Q {(eЂ QbDs&-'ڥzS:=0 +۱:n^7!n=QFmS]fCr%<].v]}ʒ6 0;YK>dߤ f.+i6 ^p!Gs0'B{,\UOdD [pxy _(RՐp6R18,;;Ԑ^)r:ӯ1өe@7Wz^ss9`?}@HJ9.uqQi7Kc˓#ez4W֢Pvjg8w&~1Hfvr:`t6+cS+9Aŭ<*#եD1ЖV.M)W׼GX#ZFp{нc86_ +)Y{:[h,SMz7h0U0J7_.$aNS=gͣ +>%0륌㴟M Hh[K ;ϠDs=Yw9H?JjN\urЩ^!Ji2VZV;m'1D Oca)Uc^̰=lfb oC1O< h.el5A~+d,b +RY|nժX}ֻNJoPO`x/Z2a/ҾIk?PdЌ\j@G h׌Ѓwۚ!NS?gyGTv7mIq^5 M4*5*P,uAxK(zX䏵r-lt OH{t#0gl W|ݦM:?QK`7t85 +3BiG?{='kO>Rd{T loazram>VBZ`4%:G%vUpRbYX j҄h-c~{ +UGtcx +篃)26ph'lw_";' 4n79aSgZNh~svt'J]\ +P~#j ;YS 㻁uG:'PF$܊A[̈́ιOO6~`gZvsH'ʙFP$Er^zWԢ18nR֔rr_^[Y'<>8Ȍi>`2v{:AU{W͑rD@Ԉ(=V/ӷVUH}\%k#%`Ɂhd OOgW| Uq,(SÜU:lw,'>5? \32Q@9.bAe YgGƠ<ppdn0Ć.&3\Ɩ6= uF pȪ6̪ܺz?]1lHUѱ_z"7Pd_ i| x=.hiJ}e[ΎftOjH7KkVIrϹs%~?Qmep0 q)ūk(D:f,c"-UKw&wlG#fTyTCJbkQE ɘNJ6(HrSjRN&aZ0Ptq8 Х}W4<oS۞spTP!"|9T~oV!w7p*JAAhB0Y$g|dXT$Pug9=yXE%XZQ;,ym W`%P`>gYA $s`ipf kS+>yON)*ăH >UJmҘF@rQFcncW GRϳ\YGy_ +Ǥ)m_}tÐ۞G_G3 Fcow}?G,;LU7yx.0ґ"hO8&wx{y+}:` j endstream endobj 2377 0 obj <> endobj 2378 0 obj <> endobj 2379 0 obj <> endobj 2380 0 obj <> endobj 2381 0 obj <> endobj 2370 0 obj <>stream +HWmo8_o=lXt6w[`6^,(pPl9ѭl4")R[ǹCQ48Ù\"\v/ik{7I1M_w.=A%B=֍[Cɰj\ңfph,ӶųKW01㌥H]uUm4f4P4һX_g?ʱ.QH3NX +NS7D#R7]نZ3!h?ey~2PfJlKj0{jRbR֞ XJj[ 6Kí|a_v;Dy(f_<1'jki~`1qED f[s= A5홫wiTqQ|z3%~XAZ~~/eQIqƛ[Z3"`~q +D:mB»mIWIƩ?D{¨ǃ}\ub?$m}$SIS-"%wEUuӱH18#o$X |4X \LTo+o_$Á'Lk/l@;.C80GZXJKK]k/_k8ȹHͪseRP̳}iYn꺹FCpY QYByULHČj;6CRc036a"̳d(/C}ZL|\?$_7NZnrJkU:o:$)ڶYVE. XYd>i:p}|۽Qk7:kc]v]5߷w15m ,bOl:XLOPY#<ڏƒYڌ>\0eHڶPﺰrjXe(MҐeip I&ٮj8Ul mzq7ȁƊ. !ˢ)G8!H3o.aitvm-xI7O˸*eA&99ow $ 2^NBXĥy_?S!B> Xzv8d=fIJll@x̊x'ͦ\YЩvs +3NSAW+Z|УXP]ҤU6DQM꩸n@ .PȺ'- H677 ae]@SQJF!Os$r#QͮA.C\FB>MZ`9R g 6"H-m8@gBȴ/ kb%^I>(mI"ȧBkDyJĩTX)P~T`3O-ѓ]jS̳KMxR*iU:ɼT԰CHV&!b^ {8“厈2^J j+O 9/I"ZiWw?V'8oN^ #qpz{VLo؞٠hQ\҂kו^P+ NZ>3̟-šsjwupB4vC2fӬg91C ~֩ѲNj4kL^; HʗS ZK@80  DyLFlZTO%Q (k;6j%}H#k,id릮j{s˹jHYz8Ӎi-<.>+ wMTXtC ?HyWI[. s5 ˔_@%F~ΥN-^ U?2A1;דݒ =D/ ~Jw7C-'G-a"Lji╮=#Փ;y4Iςs*$jvE]5c 虫c +0=PN8qȠWٓPQ# + 0ZD'F=ҩ8n]^vcBK -h|}Fa+bS R5fY/ :֑JRb>m{Pn,lE @{lH#^xV5ƾ& +9v(- {H+B#ۗ?Bbk`>b6B Rms?efiWFZ3<\$ {;MR+cxh&u $LW jzWTX@XJ'aAp +B,I +g1dc/!l Ih4hr=jho>stream +0 D@&?W D}W~].^WWs;)&b҂j +ei!|2/×r\l 3uefׁhEkWWƸ=~70"*^z0N_rk.զ\%fG>'еp(bqXmA`ՁxěEI!؀# Hau7@Tre#?tV#:GC/ڿSj&b *\ZIMw`c +Ev9h\m6y)=]Ԟ#A ǯ +uT!XdgpAC(lS@Yљ ;ozyNzH`· + vU$)8E-.1/%I!8J*yFz1/;^P'bйvՎ+B{_" +| ކXkcfYhW#}CnHO!/Cz6ppSFۍI`Xwj)s/; +(`S2V(t4홃66pX>p\+t[P:d[A'-og4/ +بx&z2ЅJX\c~pR(WCbnLzfJUQ1pJveIm?q;ڊ3\eA9./4YcPE#"c.B+0ZQp27?;SC*^(,)OKдY3J~/\Ŵ[7e/b *>/ARcbruVGm6S;@A/m.O8yzL!BPv΍c ]ޘj_u0}D'<>PmN ahXb>]XuJZ>93W`9Ƅge@m>)2D=pA#3AeЕCbn`+J:.E2tḻ>."N +hꕔz/ 8 ey#!YaGtJ+cOb%#}5=fԫ_<^I*~ *Gz!VO0.HKvsCL3.;F=}ՂKldf)" 폭U&%ʤk&:0o@h>bzvHMtCȊ^OΨ;[IvGghNwMſRm6,jvW*@מ~sm&Ga'ICt!SȪ+oR?P Iʕ24XSYk =kqi]|O +~Yǀd=Q|3b?֥U*h_fR=8 +y .| mtC&:%H|6R%f +teEb|<wkf zbRCA\FϺ|ZdKu6d_Rx Y3XUCO:GvcSr*⩑2-RAQ4FkkVbkfitJ3B=YYO nV1IHghծ2?~^=BJNױeom׋ PD,eDFND@`e]&ཷ|^/Ke%U +>+(ݒY@df~td;EM%[X^ơt+Sl5SU'MHPYh%V |yav[5[n~zp) gwX(q!J =ΔPIGfL8v&U<)t`>cD{f% +4b(S`jXC3z\-p5oǾײb IdzIANŒ+ N1!ߴy;r,~6s +%_jBW Wp/9SA"}t Q¾FuT5jWT}b(4y~-bō7탈u(_X@Q'`>g%k`$ ZY10ee55Itѻ5Š!=+E +~Ӄz%]"[_|@w "#Q,Mǰ)&53 im*sაNC39.$_o쁏I>o=:. vEެjăwCxM2 OC"*' +e_>E6$P<GmwZT +0߿F!UZTn&34 ${}bOH(i![Z?.$:YD["X鲐!T_]+ѯ0"OQ. UýM5i2kqUH gk^P"yԉ`Yҹb೚XQğ)#=$F07jrMZ w=y.f-W~/ya6PũuUƁ}A(̷mL;fאD6\KtHWFA zxC\95flI6 TN닸B9O0'!I~nH#y?2h n_Yx勐"Vp6hm}PIY7/w1hu8mHF rw;>Vv(9/06a6å;(IpvF4r_\ f^xd$L֡$_XCA+Ie7V}hm?8 ^[>=Qd;m)Pa~F*6:%Rf*xMz`̴S+HZ?)쫚<xp 'peV ++UvK +}-{7nr^,zv&ZJeA/0l.s bȡʿ1ty,ӽ'ޖ")#>K=褶`&4 m`uJN%9U<*AShu>IkQnx$zjc`'؜+o=w +&%r/8IϯloDj%5Hg 5W5C]?,0 j_Ky,ƊZ5K),SȾغ9T 4Ot^JZbɄKJ s yr~K*f߉nIɼ gH$qX2֩s6!MV_<~i"'n^{#1 /vKpe¬̔5MH ېϮ֜R1 ?玝<+ilr~mÓnA/@ [؅H#!S .U}Z#юT^,HHˠJu;r}{m dG_1.cp5 >3-PԪ@=ȵg1j@9:.b_MS P Pt] 9S%3x:vo`gj tPW&g$!]*q +)mY +*;_|*n`p] g~15RjbIbxy]:=j˾3#ޥM@fMJW&`sGʾbQ5IQ w=M_L +)#g%^L\<6$v9J*= K >9zr,䂎["fw7DL$.n`XK#|/ +}\n:&艾W(ҾkɌ՝|4JVB@#ٱ+[C%Id1f-'3:!}G0=o%75@8ECXKEyN@b +3=:P$_chQB?/>< 8_H`ՓeA(m/SE@4NTP֘E]wZ;( 9XύGgLF w>xt; (L'xakJ720b[bpQgեDTs \?&nNk&lh P)j;=l*ߗI0mwS[3TZdӘea|^.(ב5U)&0mZ tISLnⷄbl.5(ħ +G]  :azDD i'wOfg +?&*6 ps=Dct!WY-]_@Lhrߧ 5lְ;5̆[x87͈D׉1?BR̼D|,^s?f: +-f$HvTZ$`z(}~4Yn@;t~!j ;@_)  "Yϯ@&{ rRlH/HqW'ͿQ=5FE p7L{˭ v˧8W@á}/ ltfX rKrmX+9*ToY[l&WB2O*eĸaypmSM(mi8)EF.S`ֆ9Io@2=2ڹ&Db17뙱T64cgZ;3$JsD <@̿\K6{/VBڞDo9鼮c  +"d.$uн_7MG`~{~Ų@2s[ᯖuMFȗoq8`4LD-뾁#RO>R- ; +2 s5$M9Mּۖv R2%Ȃ~t;{;aްL%vcT:#.nد6| k% JV~j +g7*n3zJMQ|Ė - ]e!@_T,G^}142 R[_r|v N\ktKD/#k OϪ⏧NIΒm`NN5DAt&eJ+^75BtCWb㺇әG)`k|cChDW,`F́jsbZ{\= #'/EPoL7ֻΚ +N} 2*Ǐӣ'Q"=Gɏ$Vk\Nf̖3{oBBrj/<ߌXTr w%uX(i28'v׏ ݟ1t.(g{,mULh~|d˞M~䁅/ZMGp|G}ԩʻ#(=RZoY18}ע ?֐z(0w!Q,M6yTjOdbp+҇MZu\̢Q1͝*c|<jDwaS;lGaƒ\c䡕gU8>5mEj%Ѭ9 +Z-Ԍ]-4RhdhC:c g3>DrU`m-ś(lѠۡ%INXj3p)]$aZg)%dq?WpՈڬ䢙eB#F,SUqN;/v%L69,bv)c3Z2IN +odOok?IV|-'vu2$xH^5F n*p"+܎,X&^SDO]o b-k :gC\C r9j.'_56 +֔Sn)E΅ J?2hpM++s}3`=̖'#|Q+ a@ǡoE~A-$QIn# ndT٨0VNMKՆnLH ,+ $ykҳ_wJk0<.٧ D~D׻'94h`ਨ/U5d|n0(?:g ?Hm=Ed ޕg5p1o` +x{qx3piE)P3lrOgTd,suySxRH!1'vwZA7sJS꣓22WJ U&vy07-#"̈i\4]G?$hb=he @::+,a춌)}xeV;Yn70OF{r [ eK&i1)כD +GvOGKѼrg 쇆 `$-] .Śڸ^=,g5+O LkyU),jb + H^;t X/7F'et rw"$%-l&R.P@X!ks;H*$#pRmV>?.7{e:<.uvBOMM~iMG8qsЦ.ݲcnmצq:COz+?%џS,905gicQk#*z%Y=:'g6f4ŷ(dYכ# +G)Mpw &j9FD{}J5J)t?æ~׿.2 \~¢*\n +]Xy2/IOUihV绖\#ũ~fO +nϊ3$e$(zs(Ϥ9%QG1_[W֍T^Vy.P`| ވ*%4v.$nb5!N9K%d{;M`wyɧ5v` #ı4%rX4W_Sm^v˾wM+V!FlD^ƥpjF{8 k^]9MsrG;} +##jqh "L +;M +>3Zbٺ@(6~af="/Qj.,m'$^f!Gr9= MuyMwݗaRIJgնlГ`HƇ#qh:y֣"Vs~N3EjtZ]+!ֶaMY` KSFY uSzQӟK +[C=n f9KO;Czø怏 +uEqжAjA**s^52&:-]>S BA_$egEA̴;uCJs,Ax~S:LJe>1Zj01v :%DM{ @)twRVcwҌV() %ˡoYF1͍Jhx: UNsS`) T罹D`02)] 3,,J. +[Я/.4!VQ`|P'v,!: +R&W':4rbL5>WJ)/jFi{CFu}F)h=)5bϴ*iL7YBIOWT(qTdX[a$$ 8_I2,u=Tl*B+ܘ X'qgp 쎔g9 +?N$HSY+Oe$+Q┲ >:#` |GI^G@Fp,Uw,@X%bs<ԝ`3I.%$ 5R&l;1ia6xOf5M3J.3J뿷Nw&ތg=~땳`R /쭣 ^u8b] 8kbpQQve{1ʯa& 'C[r+,Ĕ %g; H5 E(Znxk0 XKZbwq~"}$-%4&-L]$J |'T0/(&)E3S4дT:еZ0qIK kA(BFӡb:0Kfj9&-';0Q^Nʬ*lZc@)K|'k /310JfOtA +]X_v2TsJ},QvDIJxJNTr4YxT9ũ2X%o!;VӤ +w= 9Ɍ`<-U|ql5mEIL>AKi{!{~K~5va|+}L]sQ@yy/8ir[ ]UH_㨪 X|@#C{k]8Ai ԏe$9X.e:U\J:,-eŧnJ yul,2n"QCU QJ(F!Lyv\GuT0gv |W :5w~DagoZ4!gWX݁aes0h!nkv)( onrܩ.69cua5,9qF},/Թ& ʙὀ)|bG> We[u)QmRHl4 OQ"cwz}Ţ`Ž^ezyQXrB{x-@~.P~lѡ0F(e +O 5jÿeޢ!KtWW5R%)ݚh/o~<PJNo$6HvK4bڼprȻ m8S3 }[tYsA% OTo/"Lr8LcgOI9CEGBzngҚ!!vnUMۏ(sD۰tI WyŌSE؜$>0IPN,4c(f`]#NR6gm)rId7g@4٪4{^k 8Z5djqED|UQ$(Ɖ:U 'zg.%mu65K͆P7˶|Xڬ=K<#eY~I=c<'6 ^"ڡBh\U;2d@y8~ Q~U TO?pXe'jHhoJsщ[5{ĠU$_SD*P0צͶ`,E{kXqC>M~_ K2E +JG%ag^ѴR('fu3zokVMܜ{' TI=ss[E&#A0 Wzu7طmщ}u/=:ݜq->ƺ +ˮJwCK`0{}Sw.Dڰm3*י) "ToM}NKVq熬P>#gMw\2P+x?[uOlU!`y,#oХoD g ˍr7O/k#~AX-R۹] $hmIԠh剒`ѥ0h$TA?}%XC9 4P,\4ϑ4UtZ -bo|ZPض5:Sߘ8"8t)izOը *!WϊtKEq۽x4P0B,'^nr3H':w={ 4|)W,Eo)>*lǗ1kخb;(yL഼(9L3tmIv\1-9V;oGuc+[MbKÿA EUin2R;4pGvZKWnB=8dį=|/]`I6MW r[( p+Q1Gr{#cC A#V0^0;K2~4nFo X 360 zAoت,MwViDH2T7X'2 гztyF,$4. ޒGY +>6qu!H$Ldްqxo_Ex|SoG]ܨqiMvT饑rcmk/[ kUɜeWZD|EmҔ,;F0 {tsZLB< FwRi`[ +Tti6AixWY5fߓ" EB;.1Ss㶇Kl&TIY`?Dh#%Hz!K.,8w]?w=Kn\j]3)-beOerz^$nW!/xT#(Z +p"\݊odIG+SqemMݚ3/;7 +V=+=PܝmL C8e" 1*Hn|#U-5Ot-Tf9`çwGDД 2sqy\G9 "Sf2DSg;;HG2c!8 >)6|8l;lݕ[`Q흒J{,3rȇÖ+[{u3wZ(ɿ1eqa{IYJQ.LR7l|z)ֹ0P^of) nIRR]*v!K->Za)z" لn,ؤb߸FqqYڍgkҬ[ UHp{,?6NǂI8ų{n4u9mmXiF?@0}pS`4M-KטG&q!f]@.\Oj+ ƃp5<;7|tt>[kT\I8p֜ xԷEe@q)ՙ'&azoYa }@G{86RqѤ:y0AVF0ȂX`U(7c4.1EGF +jc)ޛXee)bi+!C"s(he =((uX<̖ `_RA꿌/+W7^42+*8ĽFM* p*&?'.m@ms/S#1]nw1'c.)QLV7,Evp7Df}rX8V|p_sK njO3ׇEc~"dj]na7I\ h|$6ԽЖlGۆ1|98 \-wPU2rRsPx.db zdMTga9$ ř +Ko^^HD,au5+|s Xd;٦~v|r-g Xӑ}^3!&n͚](m1:#0`=B5`8H8s4Ia)99uCZUQy!Z4G8o gty#=2U&-k)">oIO>˭k):W ճ $JnAǐp Q)903|ixb8̏,lsEK6/sm<)xSw,bv#`ƭoͥ?ܞǃRvtiJ=꫼9m)-;qn=y*s-ٿae +١( + Vɭn_vb87B}΋=;)agbUO;bZb#ZdpRmxSS;S BHx I$i]Ud?"spa +^na-•4W`CSwE"rZ_b-CE X-R![ [}FVA6`tgY?D"S ŃՌDYt'Ô ߥ Ό_6F?\͟9nʕ-aJG*q6*<-(FlGͅ`jM"F{aZC2 M>˔t٬иRG)Tř+Hf! ǣsR"=qkR>JN +E* vf Č[uDqX7jp!DK35pOkxN g3X7߽ P$+#6lީ̅eFr/*Er(\N#ءhwD(GT07a7ay׻I৚y` ?|fc8ys^ ~SsϺ*£$,tܣJ@YaEey(ʃ/1Ʊmx@K:1)i:# goSD3k3\nӔZkY"􆢫ܞ9"o8vʯ:F١|=JS䗊.Osv}p!i&<['wlf. Zs7Fn F6UhmJ}( +D;a֏$}o Wk(=[SA:b(ǩzDKbA5" Ìkѫ)aW@UN 4#=1-,KwUa݇R>&Qe*ftSusaa_{5<OJͶm?ԖaM7H3g endstream endobj 2371 0 obj <> endobj 2372 0 obj <> endobj 2373 0 obj <> endobj 2374 0 obj <> endobj 2363 0 obj <>stream +HWkoKa)"-ZcQPP\5ɕUޙ<\=6EYg9s|Q-sҔeD!^mP<63r[YWɚ%ٷ h8S<$cJ毛Q"~g9r3JHNU\_05,Hz+6^rLʆgldC2?N oa;!hXfTm0@ܜ̎>mn[5?-lOwmf?mְOޞf;g ixs6 +佋}Fa0PˢnP솢_*'rna 2.VT_C=`?YBr m~R;P9Θ'>\Zr!3r AL&ȯ7e@$R baK`8Txp|U__E[aQln$"- $%<ΆSiH 6Ez1iǍ"p6T9L~꧛?!)"rBRnxqm +J"G0TMQ;1! ^{MQyBWub%\n##@Ia&-784W8)vN^uއ8u Q۔}_\o/ <5^wHxpv0DܝCnL$@XX'~aIRv}6;zad9g馋ⷑ13peLC2WnlNpRl,vDW]l-!O(/N/@7LFu.i+}?GFzLYG˯&Shaf(ѓtv 4P{JG5)RkvRjå2L{AuwEPu*V|љI:PL}ݪQP!* c6Z[v]yA4-05Y:t# 5NLa?BU.]\T' Qz1xb%JC{u}וᎉ!-\?;̿t/7ag~r\y%{ߵi9 0Xu1bfC_;3<?{0?fSj] %y?u kD|̔ME_>1`.mhmPӟdPj;+ 5  NN z21s" U5jYlӒ /L_M,vJ_-"߬ΉZf9m#B/#LGSF +*w/IX W1 Kۃyj%`LC-6uBӃMCc]&_ ]%"~A`gB*R05r d,_wbg$%&*svrg!f +TN ? +#J$ϓuy" /mo9_RLUnSW͋c-\+ޫe]9z>}@Q ߱s8-vS-o\dx)Zve kVTbRIU˜zۢSpI0&B`?mwԼL%R=喨s&ZiLbW$?s۩6.W5"Nvm.r Wx1x=jӈRp`Zۡ)2 l4&Wl0;qs +jNrJo<[NoHPzDm;0P";cd,9j ;dUiT+۶C5en | 1;wY L>&qftķ‹lMH<Ü̂bݓr -1cH;^WS64 +,s_u"uUtrYPӮ,V*F]5(PUMRk'30H,}|b5hҗG:B7 lwB ڠ#i$;tUEb :O{>"CM݁L +GAPR$_uU^:rm]<\Οaq2דVt)is{kI;s-VM\7c<`#y3WkP:>XG ;~/lP<hS<LCkEڣNi.lmtlЄ`g,V#K:A dg^`󪃀#/*1+ǿWR"Tn^Hʁ&r $[!wJ7,Hh\Yr`(dn 'K1 c>dQEKPel +ҡJ + 4vC-[۲޼xRWa0lJ|(eQԠ4<>+ed/1rw^4wC H 0] endstream endobj 2369 0 obj <>stream +0 D@&> D~ [QƂ_Y)(<<[o̺f{b2x5נ( GX  4F'X3t$./\5TwCuHq :D^m~v.VqꢀbZQЖqӮju=,QNC$'Ӟ LkYi^<z/hyfkM:!ef&R;(>zڦY4o>@:?׭Jqn0,`ѩwOxgT(5Fm#jdGug{>n1 ^@[Iv)eF-f3M; ك5j7D:aBWƊ X 3bBzmy9H#Kh~?J|vW cD$:W_7ޜ@|ᚭ LObSJEaِ$ e`m`H+"!R8~]T}ڋ.9e"Ad0iVjUY4k3rXusK&`l0洿/T/LSF U;$y{˞cko>TyI|*ކ7Ý{}I+4qYQ)w+6\qAdNĩG>'IٴO;e\d` 1o+<+#/le''(tX'6P\QDƺCμJc۷`(IFes’߀,?XԳH`SF zs) +#e "Sa@NAFXeflv(uЌbEeN +ׂvbY8SԞi29RO͚u=!̦&35PΪƁ[,>ĭ}w!- flYH0RMs*oWNDR< 5ߚu&=[5G@5Hh0N61˧{` D8o=R7ie +rn7;@&6Ki(q(JG#L{ЃVPG &@ jK3SiBm +{85&[ݤL;ӡ#4XX]=-v3qK \-9FI5}4j +Ǐv n)3EȎAF}{ù*Ǭ`؝}FxR+Eהt[y6!cw{C<ήreî, S&qM2WmƲ~hw&t7%_߮W^z1UFtk6&* +ަlډe},lܷ\5&h:f`2+/;Ap%#wy`e_R*mjnح{<3Oi=q|W.B)-)6ԡ?i{Y;>度&;:Uw3IOVf١_݂jn  |}/;x#B:JT\Dz4+<'NٝV #Iy;]<%"tA*%4N&xa1tI=7W*iLl2%qRZwK9:o-4r3υLi' a|5fvO6KAjo2c j?y ["[qJ&^xJɧ' ;*ɗv-2էei #OAKi.Nh>Ab0!Ҙ[ho6oo =BfPV۠%"]oM/?gI5ܧ-,x@ï^)N)LW +_J:e4|}U +씧DqAxoU1Btj gEU//~$CHFLiܴ_‹eϗYjovC # ddh|ؖj&B dCfdΝEyϗf7:M@S[#W0uqYjKHp)vR:0C60kix:<6èG7,k_}*7{\DC2)Suh,ϡf4m|$h',|\7qtb V;r'Cltmˍڎfѭ|7g.Oց| +9R`cDgIY{˟61kU)N% '|# +jG7KBQkwri4)sPe&4G n()a1Lﴍݡ 5:4tDQ7SÚ47Rp dUiT!`:^efg H9e簐s$4AGe/ *ggwyMkNHHҔ*Zm+jwZR$%KҒ! ?2C=@Ж4pB)OƠ!h)8.@ѪO琯H )`GW%hH؇! rĿĿ0H{Z`[N"h6,4'yLBcq$|:Jƽ.QnD1*Vn5a-܎ֿ{eαm[$")`!>uK [Ą>7FO4Wʣ%%‰I+/;Z[8 S@Y٨Wg<Lli6eq֕@7 ψ\6Ug^Z-ֵw)Vg=Zz(gU/KJ*w*,#m΅7tn h8|^dz5tƪ$A"< ؓwM Ч9{lf,&Yv!4CUв@x[/oJhsD9». 7)=snsƤ?Լlx_t% :" +yA,Cw=BB!Kf9ZPX(鏾Rtus݄CI"t +zъЇOe Ȗi'sʷ IV@f+)C}/rlŹEӑA4BRZ~{!LĤC3xZHM'O8b"P,s[=AcU2aWP̈@;Zm`zR eOA$VneM*SVm%]}iROnfь.UI8j'կ S㹢`u +. Y_Uט=^Bo_#i M]hzس- QS?O88y6%,TbC~JK##[.PiLҜH!Uyi `e(7*F!ejCo(xi}7x]yW1)Uƹl*yUJTh ?oE"ڈ2@ϑNo0}?ސJT-5rLBkaNK/ؾXfNq±lt=B<+&IwH"c$0FBi$@ײz vAtL[`f#V KVcx_8:/ƖF8F +"~#}5;*\2~F9h',[ldbz; +]^Au1%у74c.D!X1d'ƅf -<9M5` 9| a޵ Q!֋'_5Khd 5_:s Z1h3P H䝇_HqQwK\A,%;k94/U9WX?5M[SӺK>r} fSWR@;v;2p`CLlUB+ه7sGbd(3 ]pEhxY>%jz]#hYz3-9GKp9M}$6G-qO5k9,9PNL8:i}`/ @kf.ܕ +7?u387(F0aP[Ӑ7p3U:L# z=k6tC$E&*D?~! +Dত^kGL{lҎ=[Wf} d>r+4HIAWSqEҀ7U,cJ(?5ժm =wxqI#yHL-kUbNWG:Rz|}uKpUFrQP7"^pJϪT&sE\F.&dR0'%ώUU4,ʜg.['agu6Q ;d{ +V*QV3?~$FyQj˭K p#!0r]Av9 +dhb C~9 wJ zWjھmir/b4w1kCk QXaIF}ܳs +]#ji)τW1M#UOiJ@r_%譜?7D%A{dE4WXCPBsVC76໩T*Hub5e6&ki݁%+5^>&vg~&ʼn>ckh^g6w60"7 lDrGVy])lskf jY.zOwLc hp-5WԩvLiW;9X3 +{tXt [hIh $GVrB~Cy> e؜(U^>Īs`w` FgCk#cC~7m|3H;lOoKy8 rgKR0XS2;Ce'#S -榰7*p0]$I;R"l饰M .o+,_w[0(oӼK/A* ql&DLa)P<6o-)8p|"7ÿfWܥ&U)GSP;1VyI1`,Fk]G; !jL.Ewyla,t^OSun%;ŕr?窑anc\c +fYk?7¨HP +2A #I0ҧ 'lmuΚUDq.V="kK WF[2p F=>`rEʍf7aQno&swҪZmzhZÕDjdAH]h; 7랝kL{KL- @<4@ȟp䝂k Bdod h;V, On hVs"YPʖw`F) WAv ָ߻0ˇy1. ªOMp& ^\@#KDvu3kMmC]\v u}F]t' 1n# ek#˷b5;_<\ v +Dlq?;XBiwtpM5\M`ihD)ep@`F`J+8|0,Lbu7y~~֣ 8'Llܪ#|4cC_~!>i&R43פu*@L_ ]7QD=,4I=.ig_f0̤ߕ$=]ح"G}[2=7-7h] qn) +(и^ CnMKTڭS ۯsq%q3}X/zpN;-}"-> ${/%wHzT[/wzɭAp)_fblR&5&>\CVVaHՌ>qֿe̚߻TcLzC"Du6Fet\B6 ,?_PqO_O!! D!zW'k8i8dM6ug +)&_73ff.͐ s^:ȅf=v@{ +8p{hsc Q8^#Y\6=cuMc]ZϷe.];"pxA} o )rWc`96"TIe|%MNC^L4u^WP  + M<RuFRLdrZvZeI_htJMn=G_|a)EgֿՅߕ_`wv;fkZ +c:ݓ0s'JYߪ[U֕k~ c 7ϼbCȉ5o3.؟% ogЕ eWٸD 3Lh^yB监_a2ߜGdKq,^"P5D|ď/ʫTW(W?p&Q{ -F'ոb?ީ,Q`Da*T5ryV%Xבˈn[uxCq+_3#T@*U7aY![,"Bu9Y[A&;'Yx ZM Cab}aX Nݬ)fe"|_/RtQ˧ Q1L7^8t_Zr$~2` KwV:S^>sFrR==|PƲCm +& +h`h 5_Vb2pQ } e)!F]-ˉkS,<|Z {0MSuWlyF-Vhptm~2t@xlpj?`H[L Qyd7IMB{zDr|BC// +*UUʛ +S.9'):"zEZhJHԯq"L/uZ^ݑ@vIeV"otA `p6ߪf[I?$8#Vk=ڷu͗8 wo0yfl9}JZu_T0,6X_W@`R#CLČNKSm\pD +z*Ze?`226$x)ʩ;I.okZoL~vUԪA#vލB0&R9׻6p"s9x"i61qݱ9ڤ +lopt@3EF/M=aӫ*zM'Rxk +<:EXkH891tDJT $n~( ovAJVW Ϩ8TyO v=_䴕LjUarC Dm/9R5-<$̏UMX)%|yU~b4u#}uJiަ9korh;L_3܈䲌.3eG!T0tyx$3FJǾsgnLá4jO:Ő:aK0rbm͓Ԑ-|!EI\DSbUA$+ xg;&I?lST?Q5F#Yfy H!DR8\X]:N؍HIO/`a3ʀ,>L;sŞ_ ^J7"Ū,X`wT3\e\o-Me!M *):x'oTZRʧ"i#t,&?EA6KK=",ByS~}v;wٙ.ldqsGhA`ęw1b NOcsf~*NMA~-a!9Pg޵M7ly %115 _Dup:X(D>/? !W^]`yAhcG2gšaL ZhrYzsV-8aswއ + + +8R4N~# +O$+3] lr%cy'pXd&2P8-Ģ?Qq%>w+Hrm:gD'W`i%O&47 NF*\1hX,ƻ + +5>>Qh"#¨:ޞ:ۊWҁ,`RVjTPzF,(F)ၡYw<I+x;npnQw"}Q ,Ap Ԏp/K;o&Jd(/(`; 6NRusK$Da2Q1]*HO 3( +9O'(Hq֟z&HrXZbGgkIs? LO&`bs1E)g|ևtɻVwB yp! {bzᔍ4IUh +O@RӤpU^Fir'vYs+yIPU<.K}RkhoOp67t"g޲:%ܛ:joDfd#U yj1w4ӊԁ= tώ?pH}L)LB.DqaԋHD5,@#z5=ݏyVP3Rn׌vc >a2-ya9+HڠK$dm@ R$O4A5D`םìBW"UY,,>}N.Vlt]ᨻ$b(ƤB!1\9P>mVBR!>(q76 'pY\L^wcmAV&_AI~mL(opv'IJB<#t^[ֶ3w*(5⃠)Wփ:0I $U>s7A.yEܦF>^`γb6OesUJM?o#Q Q~`L%3m ,H*u!e .RxwoDb[Ԝ! ۼr4v`ؐG*}Kk^>$inegvwkI#[.!ż"qk 䆃Syrkr;(&JF o2(P-N3R~Iy+FIJN_ޓc(X6B45rgK#J]Ժ9B8t@D5 N~9HbC"t\ʾK +PUpK8ii!:FI 1]*%l FPKZL|$Gtb p nLLޱX.d)P{1`d×A#'%>װ3 C?%@Eϥ6J u,! ##f*2k2 WS#ٯ/P jD-h'Ld[X@/lrx]en-ܺ¡f& +ˑHXD`tsY?3"G+I% ( OZW Gc=>-T7*6DU4m1_(F zOyXM?=m:NJro>B#YM٤:c1 FBZk<:t“?m5iVx$` d}qZC{U-q쩉}'PS){Aszw|myg[K XSD]DZ"ՖW%aKybltg,0veGpŇl9 Rڰb >MwzA 9(< +Bߺ,K501jè[&LEjN}7D|fN46*[2g(x3x@fvKuyL68s߱h+a;@.tL}TU,21]Ȼ <+uccAqG;EJ VɡB?_.)9Cag/ ε$rtZ}?Kx'pN470#)'O2C~^!@rw7ؔCqTzGYdT: y> ̲U +3v5=Xz +VopFo endstream endobj 2364 0 obj <> endobj 2365 0 obj <> endobj 2366 0 obj <> endobj 2367 0 obj <> endobj 2368 0 obj <> endobj 2357 0 obj <>stream +HWko6_1S f~E6 It,9ƕ4m{)ԕ(iC]gB-N4c[ʨݿWvtfW˳K_`9%ueDu?9SDR0XΞc-O]v.mj?՛ èЄ1\sWs +&*pMٕ+|_go6M[of_e֯j7[pa8P\)}yy\#>\1֗w[Z +AW的FTGˮKC]n[jZꯃQ tGM3x}# *e%ZBp؄v%a s6}g '*e]6G>!նvx{;hzna׫U4E}AJwԱn#B9T[shʴF<.ܤT&VF0.٬"4֧` +A#F"tju-Gx6oZ*{ nX[z@Τ W\(HN"!5A` W>c 눁0Mf/$K >ݱ]} (i eFs}!w/s"YG?kXbspڡ[Nl?M$\_Zq9F)ONI[k?<_RRePV?ʾ_7<)4Ij h^`Bl#f ttcLF0Ď +-o6IMkpz͵lս:K2El9098?\ +e s!`h2,"$N:-LgBW TmWn@Nc[oPmQ};ǘeR EO#Ȝ)}vA;),)%%!M;C;2v[r:qt4M9< EV KACHOA@ #xray i맂*: i!Edq{ $|l+UqTp7u6A`"T׏l> +En)9Gs%ţ70b^yAv! Ag:ۢ-ѴreBVC%p .\Opr78MG;>юqOhXOh~L~@11zD˲tL-]~$^j()D/`f=tuO^rQ_^}>*@xF !cHϳQ+#xBvilϊiG_!D19:%Ï6JH2 +? J"<'/Tu}>AU.>AQmY|ˎ +!!I6`uX:SIhVv;u7dY0"xj#Q{όv?aR <5 0θ900epDc +dx}u]7I欹-Ve&kTI\34ccs:N^@4 cc2HXcjNArJ`A]|($*@SיS8!iԟ2 LrF68K24Y1hӹ<[ 0HY.BP6z0ru]rr +5QA?`dʠ;n-^~JA]PλE un=drLe\s]wS aIø9x0Ю':f#廧;փb8҄QOa*tA 1opz7}6`ﵞSo&+;1pMЄv0יN2 WZw0{s].qWY(y1%8˻i +^- +Uh 7*^=>].8xrƍ:<6"˸b.TqcBZ>OsZCKQ7%zp(cD~ 'YV;y1/z_fo4AUߞb S +,*<^Wbs/s|qz"]*S/ܚ endstream endobj 2362 0 obj <>stream +0 D@&I{ Dbiw$KLI{/fazR +hGW|DC}:(eD%IX)~-b6% +9#I73NJHZy FYk? BsDh 43lMe?U ~ӂ/@St[t ,D^V_ɖhR{D0bӪcnx5}=o:RM޶(Gf!nH(OZ堻UfZ}4뮦q_\iP>#$۲mCDѧ +ŁAޣ5IP1ToOK e 3']a{ˁVN%R%j?5c2e3[xjS^DMtT luxߩܮ?kuվ~Iv ߁|քd$DKݴה{ K?="N4сeo]ud bάDSkxUt$%9xCB/ f]RMȳUmjq9=k}eWD#AwDHC뾞}'|/)t}CSQ>KQRiR"uF^Do2p] fN$ b".T(}N쵨x9{N ~-5g1c)1 FfQ2P}*"Xu](<&rHngǵervY2BJYp(O>I̱.1b⏩-2aջ/=BJ }t ^bјbL +H.&)S܂P]k=qJh"f?a/&n@c*Rn?oe,Rh#kMXC٣fψ9)Qe{hc'u]cit>,O酑TX + 5aQYeCE2z"6V3Veވ^bb֢R6 fMEM?z!+jYd_2~jϬۋ:<ИaCzd^2?@ksO&Kyщ$Y$|JkWgT#╔r(\GS+USo8+0o`8a_5k7MW͓)  e1v9Sg:!J/%WisKQ@B0Lƚ[D&QAZP oFU*{b/x33|"Fh,d;c8|&d*d=}B ͚1MYB,?=es0J"xEG"t aS_Y]T ӒVJ1B|ڷ6ڨvus?byd1NN L3h"ELIAdNk}+/_3L3]UhU)f7. S7T\kChOLDhHO'D5yS~CWd2}1uGsLi 1p!)Ӳ5 ![cڊGWOuC$<'p) H{@]E8|#U9Rt os<L㩝_>C=2 ‚*-뫾ҧPY)Gci67DtGUUA6('*=g!Y"ïD2ءN 3Dm1N5e;Y68҇Bme#ʚ!_LL*Iui͈Ժ_1@I{F4p7uQ~$N㡻A'߼>:.$g@( 'RE=|"xbJǕqDR:v`H{ +mD#"h .}\Fp؃: z"[ ͌Umr@m7+BϢ͚Bt64pXK m~ j9ʱl_xgz+3~>WaV,ɫ;8l*gйH%~Q|˅(מ3@ؓHnǝv,=az("E&X"{bMվlazbV&Qٮ;$}|Kg:͘PLra/rR&R(|upjJ + 6v!@$F Lr5U/㴥WxU02HXjMĭdD2wAgCeNR]6 1PWy$JY59,e1[X|d8Ơ^t3\r-.UO]LҞZ7QثR5`:-Eraw9۳X!SlZI pHppڵD4CZqdd5ji,2XJvjd 6KD{[f)_Mqz* Ƽt7F`f LϩÄ?cJܞ˚;?dY߄ ý +"DC$QcoiRmU_F_E^tᕼrRt?8.ض.L3fr"F7bPP',G+mڊ4 &`X YwcN::\\^IX-,Vw(y84,q2 ~ϓƃ5&ޗbeoH>%&:^r`eL"-:AzܶߵG]J2X 냶$J,8590[S1܅tj2 12CAw٭+0No/:AFJmeB1.̻xw#Or!dI|'pO4ţ{g#ZX'k%XAد&f=\?ߎE'J#H0Q=vΞ8=2qJ|;:[/@ Oei%-vL~o&}ȩV0x I_"j1"o"٠BC1>1_uӍ>iQ@2`q5&w]O=/S2c‰Xr\݁}9}V'g?æZ1ihmXÄԟCyݤɢCIq;#%-M RcYK/Vp~/'Bjר؂iv%..̹(ΊbNMToXPԤN?uwH [2njcꇷha՟"*MDS{W`tuV04܋2jLRVw+2pTJëDm܀wrDnik +_xYOjHraNAk[)2r穕jIaW2zՄ(pl[O0RKC0ЏBa^مzTe UFs +|zgЅ&>`YCkEiNyKwsZCƚ.9<&xvX +Xg{ Üc6{؅)dy|yj[_DİT ]\qfXʈ%p8VcMۅh? d`w\0;BK0/ $U \Rt^n8Xs#/'"_$Q漿39KnF@MgZ C(lSHnjoD )ۈ_ +Ui2@hys *fUgC):X_i@Nh+x%hsϬNJaIB\ZCKnl1#$Nms@ A< q-R VO}Rfif]aGtsVi97G1.^ʚ*NHU5M؁N[r3")"=Y]ØONLH B[FzH5(Ap*Es_3Bm~Gv<#R]O.+t@.rڑ{!+A +&يls';"B/TWqM 2Lgԃ0\Enp\S̢л|:ZLc<2wTQ/KgA !6ٮ&s= cx 튧FQMl<4`QE'T| q^[gOg=6LԬ(MebAh MӳQ_e6D9C4J0ሌT1Qd@fas7彇:KTe&/T -Kcqψjo: #"'L'qƿUyˏ.[M /\KQޤyph6̮ae)$ޚ:{n{9>gs/Z<} Drκ4.FsШXʴQB|] g2jN[qY&a ]nO}ʼnOǮ^\29YN\}qW7TUI Cú?Ħٮ-WԊRnuSRɲg&'ID~=ENo2XA2^NDZ +y;:KVV$;GpO|od&o +&+ӵHkҺ܃FHre΁O]J-f9IF)3n&9HSB64AS=1-O/(AaitԜhnKr]*N}<{ɻ A}[rL*&/ v(_"C6X#AG )><9uӊß+Yni_]er@\J#ZV|)竺MtOى e)REhƁUzN:V\Y%UMl{Ű=Ltz2yu=S&t \< (zkP[FȻnX#;Mr3؉KDs2R~攑B|WESxD82kt:^%q$iSqW 7="V%8@c7WeeHG`* zj ҎG [9fvQ3"p}$*|j" rG N Qh=ԶVNШ|b%twR9 XA] UӅ35V JHԍA$gwczkξ Ve ~۰|:xU#xmR)Ds;N#6Ra/f աge)U9WgK(P"ʮRTA`hɩ7’l4+LږY4ڔ2+J|\J 8s=xaG7GF[X+MN.MԂU1<| +<%K&7ndjרlZ'ۿiF;ɹv)>ګL5<5|N'RJ*Bm`՛H8ba+EpcƦ +f2?}Rupc3RV+q&J nU8 -F9`7.,ZZ?*a।x<&k!'ԉtlݿA'FH΄x>kİ֬U;~Z>Kyi;{fL-w~p^FOcƯ]v٭H^`u1NX(B࠭_:~dŭ8lh˾2B(:ԿPcN SeĈ[ Upn"\%~Fu lWcȤ`Ye0J'e³A5̏~T'yn=pR`_x+,rm*/$2ŲvHXC>9BRAmD/k:huM|`ffR{_}T̬4g%G#BW+oE)~E-o#1jV[<54=RHO'"ғža&˼ϔ2/p@p擿mD0SQ¸=;*z0B 5ZG LjK,]"\X*t +sphǍG@]Amgr/SpeRnkeu" GaEXn|v8EE〈b"IjƔoQwRƛQ">YdL8.u~1gkU]`IrWJIͬZۆZ'|M0![XI Q:07{_nQqҸog ꝰc]+R:^R ?w uXSD|P̤"tkSI4{s-E\{H z[;0ĉ +,=\Pmfnb|RR"HjHlJH< q6kPC 9 BOs8Eadۄ:1rŽ8`?We)iC8GKV +1¬Ѯ U/|5ATGכbCOIȁ`8x\B)JY W<Z@:G(Jcq/ @qTdKdNu++7RɻM y:{6vIv('_<ŞBbv}DYȚ= F='Қl>)S13]bNK# +@F/~N SIa VP/$12|E 0}(sǪ+]>βJ5=/ ?kJsTF)Ƚ]C({fF8'yL;mS,=c33G$0uMUIJy]osx_/GK%V=?8[ua? zp vnEc9K 7*o0"B:*\ #Rer`Ŷg&B[T+g$ 6ѫ[ywyJ9oeP"hAPqjO]Y ED6p3zcI;R)ʰБq$T9XV9D{T3aϭ(tp Ӄc8 di)4{I3l[ʫƋ]|f?B2h~`Ri6ϓlU#8ү+ 3w$Q8mS`5<$Ii`fwǵ(A`n;qx%'yG+jcBcVd*fp_U~KSs9ۘlt@յƋWmp,G~c_; )*.AoOAiEyxr +ݾЊxq{W܁I_h +IhӈAl]Ay8i pLuX; e?5'W0D_#:?Xv!I_:\M7dwZ4'"Q0sg9@94+ٓ]x ?̨^I`]ٝN`w3S]]ƵDŽbr>θ + k[$'GnfU؎<ޜľjA1 W#;e:ܜ4cpcȩb/&YC |e4Cf`\q[J vɷ bd.B'G7.۞FV:ij4M+K82â ,+pnfI(Ɲ4Z<:U01@4(qX1)(i-~Y$-ьd/2LUw_́0Y}cBYڬu0O[$MxI6+`]#&$5Pz{n)bV@S밑#m46b3s&tlx(q*?GS* +8^K})Хl~(6Xw+F1\~>i&\ͪ= s>g.uC eobs{< oZqdV}b^؀ln`>y ƒIMK|]/> Bʮ:|Մ/>Q_8vM}n:V M)ፅmZ3u<{U4h7N?jq @Æpt5ߢ7I¬{{7:.p$Qwyz|'t be[^0q,äpjkNbc@u4[ba Te1|D/VYV;o +!O"J܃UT |̬ۘm%-8e4D ?8@v+=y8 ʷmͶ5y۽`%90h? :@NG1Be[há9(QbӨ~D}SaT?E7r)ڪdC$\ 7rss\%zF4;0},ځ:Y9Kb";Ѣ$kCQN%usQZ'u4{ԩq+R_÷8˺5Cx9w+[J$vZOl4A} M"+Z%B6볽c2%KB1csp 3]@|WGܬ"yov`SߟGj*`ձR# V>K^5C: +CYcmD-F^+v&t#+3ӛ)r6\\ ^#V fgr, LٟgJ QY_))Q5ւ%2?$S6B$raଁuƅEL$f4r[w#ޖl xH5&@}zX{gc/x~ !x%k_Z!Z E"[ЕcFgB&D}r6 +?s$s$yFMn[!OI NUj ̟C}רلR29ږ &V5l+J0`÷l=VvIepI,G!q``%*;vM0?y3|gDui&pyED1[x>،k`h<ԻHIXt3R薃͵7NowR\3frTI['<:? `_;-a~ 4c1_`a@+X8l#3*\hRcPc2z4'}$*X4.*處la؆Zx:ϵcj&;J,6a%Rmd *Sg  =eٳxE#=P99+% w~x&c 榢`U, +hCT7C +`@OEZ=˷' M8#L7yBg U]bhUh%7]]G\|p |:>q%].5(.F EjW5>;jɃ^?ZuYR+&קmS_GP'Bi~#XքgKx+rK +4x ;#VֿcDe\%#n +BcgPo7xg4C'w.MM1;&s\uw0_e\uQ+jpJ\ +O:֮l-y6x5 O~ا mLf{N-1ҸX6Ҧ \ʊ: -T%G# w˩Zleiq_h}P.61^r5ix%"E3'[/lS$%1RBcu5fO[sC$\?t j+:{V*yh=Y^ ӏfذʏR9D/}j'=nႇۍۃ4"8P +ae)@.Y%1^Po633Z:Ursy4ѡI]>] + '8{3eWMZ#$M$bBb`2}! pn  yg]ߔe%:3c~EQOGG +n:xN: +Ǫ\$8G@:!C╫BPh#aw֛$ΩdP8-txvE—t-ѱz,uP B,9.RxsTfb[ +:iWK,'LŰWow0nw@DxDd3dAB)+S#'2Y+_}իK +tQ)qBЋtג[pwL?L㈎Zsv$o%@@,ajg$&|y.(+Ec; +cp xs9K +_u5QY1hd9`à ľ{ Ac!h1,:4Xv4 ^q粓)-F-axeaNZY[`ri2>ӹnx7l:^*I9M ocL|ܝ֕ ɂ_GOӖ x!+ 3JAUSyrU doq2kf0XХ?-o,00wo_KИqC_t ȦNϘNj# BAhho禑}/Tꢽ d&v("p_2+ͣ-gW|<H$~Q zwb~wpL5Owea O*ZP{F:U7tT`%:%BZBI5\\R֌UWk _gV^-:XFH8 Ms`1. hû*@";$ _WV.dsw@32!OHtILD1lhLYgR%h^$Cۮ9z(Fh ++uuy;YRBڡDfQ_$oE3b"[v$~%5rln2)btNA+NY-.7|VO׬#g},3UO}؃ORB4Hʖ5b\Ln*HBq efqCWb󶞀$iC,qP %,D(7Y-TʐzQQIKc5%+yBWBy]}ȅD/<vʁ1cMagǂ[xVz11 1ڊL1G$e +VZn+, *0b/| +iH/'-m պp]V1j2EYV<]u6DoW*g e2 +݅-qV⺥.ه"qgV !4W2(t_%W8YXJ ~%cI` +]Hl.ӥ"ݣb1Hj. +-?4~}21}A6i S7KĹ7A'Ww "[=瘴6!l CE#ϒc"R=jTqyi LCEZ%ttThEغj{V^}zCj%v=}-9Z" +uWGb/4zSAXe, Of΅ vq +-lZUeXN4%!$q?VI`1c&3pI%~#sWrqm;>j})`eE4"=K"I!Ћu@#@{ ]^k-\9TvG!pKĘ;}X4i$=Lֻ )ڣ";~)p]`+G"Dr()؅dzlPs'ߊeuIۧǐێjza?Ո҂^)TcܢN81w;z6^~[,ܑ$ERCN4ˑRLsAOQ᳔ʓTK&FFMJ|auUd .B(fYzcWY[͓=8к_) endstream endobj 2358 0 obj <> endobj 2359 0 obj <> endobj 2360 0 obj <> endobj 2361 0 obj <> endobj 2352 0 obj <>stream +HWYo~ׯG>6b{x6k%yٝ!'$Ƕ}KԬ^ QmW~iFo)o/M{WW/芭n.tJ%jdS3J)E_].i.~?z3붹~՛+|x58D!t71d,?*$JqE4{BX~P!4.w竄4̒8$0NB:1PPfY*Oݱ;vev"R-oHm +[9d[ Әmj(Pc (6yܴ}iܦi+}.s[>VK]~)&LDYѾqF*XfT84"r7>׋Mnuۮ:|^.|EEM{8BQE33UEMdcnh;;|Ķn!M=ބ,nNO@c5#t-( &Tw;|0adY13VRKWTNQ?[ (z$t֥h + luw5ETrI +IEէ~p?\ 9/C,,oirhA)[`[̤R +qӣty4c#׹W#^ +{y:.!.'h]"]2%w&OWZTj:!GH.koZ">ǺW͍'%tjT iD)aEwE깊=RL[r:~xYj +A,T>bBexN2s牕~m%nl$8C % d+d708/ B8b>tf0h$_ \峒|`[CL^ou)%G,LpNj88&r*#%&RT~?a<T&IDd˓,;4<1Q6A'l?qqnN8 kOz+L`ݞVSZFmZ:ü{$ g0*$JLPDPs y&l;q[*ürqko Gs&.Y 3g+6#Flڒ.*#)JMN.+fDE]R;tt&3L?:$&{x }@|A\"ɈM7۸fS% "ZaLZi~)w'ӐRPat"q_5,a&(iXf2Z.+к^8FO),.@8ړGJvw|JK۩ϕCMЮI?qd7:aM[וd)lE^Ls:\]܂PSϥ*Z;3Ɯ1qUsV2 GL<^0p cΘgfQۦ?z+)|::d O4flsLd&M}#cS16F΋EI63SJxTM Nħ(*c{D\mD!.$,J~OjDiL=b'\XMC@$ 3 ,%\/'t/'5Mwя4ꁺQw(.CC#8yЋ*/ L2y.00! 5[WfˍqcBqR˃Rg%Mgmf5MW5o4<퓼5s`_02[C(:{W:4mhxcAd)tڦĭTn#gTe 'l+X}lSeRQ\v bhD/HXdnV Z/}y VUc~Z3f1V}SOEZ~bp`3ln]1=TԀ\ ~D|2$|Ul:ePvC\pUB߸X (΅M$FC]`H]`4a/uTF/a6}`I;ה$hė"+2!C~_ h+sJE.,jfɢ6s M#_?F>GݞpÅS$1,A#Qd]ۢEEiq-qsxyeX*wy]$-Xv|,Ŧ=PQ(qzہb òv/g[)/@(D{r?S)@<m +zɘ5O8K6/QC}in&Bcmkns^IFCfM0XZ0i,f.5JPcnuR`yeQDD t4Vddx%lƳoöwWU˞ooNO3`r|%.a+ D}x Iud$Sȯ`ieEX<.RwH& ATd4RIJ5ݴ`d :#dR"_<{@ 2^p*axSӟu,JXAS0¬ztF2*^<|g`ɶCKTGhwwsnBgZ[LS%DT,1w)9p3ʠ =ijB8[*3q+(T6/:9pL&?I2BhgH2W2 +L0K֐oN\}U +IinlV(C(4áOTz#QX_Hl39xVe*B\5H2\TifsU1qJub"3-oby /KRQEYĻCiЉfؼL 1 7eƶ}iۓi->stream +0 @@&^ @})3)Tjz=/ŭf$?SSdK!hGZ3 #]e*ϳ,gP.$/ƹj5sEM$ij~ѹ}Q`i ¨]A)QdGNFvobI/EpIgfG +&J=Us4S׸|XiGBPݹ][Q Y9_jl^G]vyR$+-r[Py8`.ci0dE;lO0j%614:Sa6$O +Vݦ)zN Woz tw aOIMpdB5=VQ<--96sѻ` On>R&1˓'fH!Eˣ${88NN7Z + ^xR?ZC0fAVJAoWF Ơ}oIgㆍ +Ӏ6R5Bi]IHKo&*%\ַuZ5E4Cٮ:wIX %P9qv}|9jMNl( 7~<FB^VuKK^= +qۣv&kLVrDT:3;OJ;~&{! +b/WJֶ16B;/}ve\)d1FRkj/[d<I }ef;.9fwktjzxœiv[ wƙ7eA*êoOVt]Yڈy 518G mn[(ek KAaTGD q6frFv+6S`%vek αJ$zrp-Ҭ +K m{@1fawENI^ӛP!"|yWk$M`Tl&mҕgRGs6$\EĢ%oשWBD; +&HN8j"ݍ8 +o2wqjf3*3^p}>ZenXK-0JΌ&gHu͠t6KVϑҁx1A xUÁ; ^C[pд{C_ibA!wхeTChRXm+ +?ܦ@Ii@3-2 u0WtRh +W-0SytbMU~ŋs'| +$EsJ"Xh=A%4]"^ ]/Rmܓ_S9ɕ eivn!i՟1m}aftu K=fCΨHk<Ѓ^RULuEKU|W4¡WMB;L~RRHcx(:X&`;uwn)'$D%,2OH \x&};_O7 Xև) R +hYE+G1*QI]`CJ4I}}s \Çѣ@lJRatRˮ840I`0'V" 2"Mo p5|+rjE邇$,XPPFlTZ)2{'-uusWZE[&R2W- ko$.)w<3! XdRxΡՉt~r1\qUN-Lɲ4 >Gj9gh o>pI!ŐwyYcyblT]DY'4x[Ċ]zH3N%euMEhDB>d lS CL\ձ5.nd5Qw+S+dYPH^lL'K?WzI77KtzA˪ɶFZN{́ 㙚7B] +yↇdž$tvUuz5jqQe9ql']x%c2_vƎl~b'+sM?^pw)Nm0gCBÜgXoz`gI$/\tXD-G6/sN۷Mݫ,EO%ZnY+.aV@ m闚#1h=N;d2'x]^TÕÀUaVGz ֊_R5'^,)[@y njͲ}]FTF"c,G~_()Q#,x*Xw>8\3|=˒el̅i"djh+tzMDp5>1w4ZF)o2¦I À !`)gA@`^M<$Rz1RGW}a"`ewA?l#f'FS|_g"7۶5?GS۾_ bžī~ o8Lx̽]i|?.CrBlP?(r>6w8k:U8m0W]'w/dwdQN'[c!]/CPLսSQ“i7O/cJ&ctgAVR?_" FVfd]ƙeuaqܻ>aCM*8u+G=z;p<[+oU-]e-v׭fכe=&Q੼cFÞᰕw&B {BZr:K01'6 HؗA ԨMz\ˊ^i<'UQ*V|`w! M[Lzyjr аTQO=t + PqUV$1;cdD(;^b7x~NMr:[ݲd3{11M2T%A5X׺R;F +bgd <ΝA!t&\BEΑ ( Ne\\K6lZUHh Djh5}bGGY^llXӠdʹhz,4*u\]'aAK駒j/N:apke>jЄ~Xi(r@4/K]H}%~žpi ']UOwRC +#Ng|"˻y85H϶?fHf)yBͿ/^ +\ƀU9C0/u7y04D )V3 "'=q/s)lt8ݚbH,@[S @* u݄}i3餸Iy^e9֢iLs6l4f)$|ZRB/T:-ԕ"\5ugX[quRmQ0}1)>vzK HauvY,ZrXo)O*'#EmTٔ3K GyB`‚IdcyGM7o +D%WϾkte05d-3\(_ cyX[ zcO2 N뚧5v4G0#_!Ŕ5w寜M!JOCR}%Fb淉*!M4P~5t큂e'8_3NxLA{J3"cu)z) FW; ep?R빪5-7WBzS[0j#~m}t2b<Sn" 7)"] T[uP'{l+@On"[RQ"#o)CA^BVܫˠ@ժt#=sۚw\[Ѩۮ mI*@D(k UaTh1457(%X8uMo[mJN=>fd[~B梍 "C\~1>l/iM.ccB 0i 5Dj;]O~XI1"#ģ4I?.:DV,NWO}Setf_4OOI\?B):}'Z 2-RTyf,lHl/<)‘qs4tI8+]0C"!XЊwӼڪkj2_ϊΌ1j{Y~y[u#pT~6P^vvnזG5޼v֒FZ&{I{@*bGok%$@CtiXn-\s Ævb=e@j6t9Nx-_ ͂eRueoX3J}j@r6FOm<Z=7t9!Rw5m_ o9Ñދ^F*5Ξc+nHxDޜ.Md]țD,S3KI(t߼+׍gY{q5Z&綆Exu亱vլEw^J?R؍-"ޤ+*dE: |]PxL,l5 ڄjLǡ<zHDNoꘇO¡?Bp\ʈ!!/īSL; +!XTh blGt-(Jð_4 YFt,\Q_M>Db\T<&HB2#Ҳoz0%|HoYToJ|!΃;?T Ŕ~жܜ56u&Fp\WKLh GŃu xߍe:Pz8]P^hed`p7k:C)oxsK_vzXS6Uu139|Ġ`T=J%_a왜2'}*n||yҊԁÈ̵^T#bf kwt,GGkd ڻcCN}Qx:9ZZt'Ni%!~4v?[*tqWB7ߘM"{ܺ*FԫbN} +$#:`*xŶ-߂)Y׺Z_pxHl-GϘ:w7Ї&L:;}]]BmC9=v4`%?垩t.D4>Ey0H3CRKE`VFi:' nu-ǀ/~r;Yy67CDǻ0&4({*ݧ)X ] \2bR8ڒ;6> ǧ~(l0_uvHg^qk,)y2Xߛr{r>fM] +e8%krmȴV#]]wCJ`8E}~/7gFݹ-g += v[<E^xVUbr`1j1uj#QVŢzArSjxSu坊|vtS9Gtƙ%[lܷ{`xD<")iGc'{pjBOW+Q {}c"DB pjoh̬[5ŸV BB![M1*Bo0 F2wb ֨{NDc6-ucAڏYjX+5hq3\5)+-/(Q#r9~h萛 rU m42}1-iFϺ)eYⱭ N9h֫ FaTm+*bqN\ELIQ)ziI4^;\:7-_ZKR(n<܀:ДVMSGW{MjѰYzsr}=9$y2fm)j;v>ܗVQh 1 G h ٿK8Dp3șKK| d[<|Y$U!;FQ[ڄ?aUh8qE;bsFSke~{V@t%Z[BfDyFqF=X(?e RnAk5|J8iN++5-M\{"J._Pse&pIhY\gl/?IR?hNMz׬)Q/X:m\ +5+w6's􌖵ϟMxLY%K4f(خ(WƣcO"s=8 FWOtsp\oܰdvUǨsxsT{Wg*j~aXz@4CRQ3NtDܾ~k]ӯ0\1/`5Jh LNj"?>T[, +~)g@r~Uic +2ePzGLXCvvސpE NقkG;>$q(Z +'^| rH `O^M +@}r Qoд YZͅ+k3)r]}͉}Z~-?Wᕴɿ!@t%ce5t^ru.&_qͅ"dbVC "F~9h"]K1{cϭ-)(.J4mժQZfIdG~!O2:ZiRdA"1Eh.b]\ﳈoSx-8ۄr^񁅾*i߅Yk4c:1fmr[Wmvd'*72xd*BJx(5AVZ']&IJPowjeq.5G_S0V)["t|=Ofy]Tdvz<"e~ffBfX* +)N;owrGחyf/ ydG]浍5< mB*X5qlAhc:5*W)FtIlޣ[}rbB'9X P(,+N[#UF-l,VդfoѼ>zu)Ϗ`+ ?AnաČiPmvh~L&0O(Hεxw{滫f'p;Tyz#z'~e* .lUZ3vW{?Dj0y@qM +ksK*!~ǭWc 4?Xgu/{PK=_qͷg +eRwW3ɇkkPTprARvYPJo?w]'u/?_0$Sȋba;?۠F+1n3ޓtsB7 SF)nyߖ$7^MDiL%<b5\Q{1x$_߾/U![͟K2)qyG-}/Tzy6g:Ǩ1aeh|;4\G^bI5F~{, O!M#֜85 V"&Vk̄9 He|3M#}rYe`l*` sjO0y/Q3TR$FUl1(VtES2/LAw8e'Ìa7B^/z +|9S+noCOy_`A%νB/RP{85L-8fVqԸ^ Vq™޾ca xpD:WxYt͜2wGpm±]tc:*+VjW#N6Q̱v"< .ښ&pB!\Ψ*,TzxmFCsAE_ʬ{-<0Xz'89!@j+KO81X {=tv v\}n@s +/^^3#3>$"&;.mT]njxN@u.4A}J<qજk7L JK OAd7^Ijei\E*@>]:aŠXڀbE܈Y"ڂW Jg,.+_<1nXL2p]ǜ"gKcoe=¨3_a6C,#|6j-WH8|݆EHP :¶ED@S0bexؒ WnAb-7M8 +1ELT̡xoę^IfKZrl)9ֶ̆q{B $Lc(fGō(GQ`L_QG2&yTP@+8 1r*QyRb{婑;8Tcr4|ͧb'4%v=h&ģ>{8UF BULبT-ߊ % +4ceU<)$ {UgW1+֨EwwXh,L3CGt'岪 ʚ~mT :̓QRJ 8OKyHH(@ /7/3AѰ'+=„YR{°c,hZ%"xDBfCmh8+(n]]%47fC͔x-%l>i ߿Q)ΥhHuZgQw;ٔ쑼 i̡Tޑe]®UlXȥVHꆒE,PgywtN"tr"ڎdǞe Z\q$$W(.}nDs\pMO[oGnJҮ''壻\5)r'pa`bq(ukFY֢8T}beߙWA:iĪF ] SK)9[G?Xȏڹx9u֦,h*Kb00E2g?0t/c/?Vn^NIrh|lI|}/'NMAΔ0$*f^7[ǘ(q(!@`-ߡ0p3K>W `αqVaMW\bŜPfwvymd+|G"K4hX/A^h$rܮ_"}旺wɗfEF\XYL[@%6^ ѐ Vښ_bp*uL + 'g4.ݣTT O*Jߊ>pHvp1 3TD-、p6AoN>B-eU(h}}/@/س饢G*~*ZyUmZTr[H cy ౓q4}6PD-uȄ#W\WZ .Ooh' 7;nNulzxUz|-L3oj1c:B\9"Rwhx!Y%mE!z<_-95]}6X,)N#0}(`EwK"e&̯:5@ `pO5TV;jJECn~]h?R|a%\Y:jO`R 33R40+tq +ժdHrii)ts E 3=t%+b(CTe~1ŔԿY.9/},vQK\5 ݜNTƅqʶ+*SX6i?1Qh#~uG6K+1v_>墚B|zAY*L YE;0M^Hbras$ƜB-fd7V? >&."7:.1R bd~YI)Xw_Ttt̖la¤JpO|%gN m]2QDwl\XQ# p f8h8XJҡ_WBHokT|<=X{g^,8wϡXw8D  #HAh;QDlRg@Xq_>k] lo6 -5G8tAg@'Wy]6TīSւΗ,.)cнT\ RO56\"x@0}N^ir9勶T7zx8\oN:l]_÷B-p "]<&eb 2 +/?~k0S# 8!)h Bӻ&4y=!Zk`Wh $3qeKCC(T "Yb2Wz^%̴PV7F>HYy$'E@d?za+Tk䧔s'tm3@i&4kҎ).%"mRvjMJԺ3㖌s}sT @Ȉwzt7:sY-qLzaJ@b393? Ij/-xIы(dTՇT9P˘u4ƅ$-Ք wNKIX.@#xU@k;Wpp֮TI )}{xN si6Ei+V2y͵0]#EUdP#+SP_}fЗcMTSoo701W|IEGc w,̥*]:,xyÄ])EDϴJSlA(Yr++FE9Dơ>e؄0?\|֯VskVH˵) !m3paR&[#@,/8w9;}"O_-+%Pb8:?GNqd[[}m Q34V["-w,H(R53tu^RuVwR uUCoe"591"-?nFXv<W9d.3~PbK5 GxN#Ij3vЈYʂtpl{Ls 0,fU%l"TfR,_mTUڈGu  㴒aet Qct)_WZ,bo01[~es^lj&P_4 x0`:tZN%&ھhWL,ANrbXt%ŸkeCXGR.BmTTEF2(pl)z#k [C"*#LE*ۯHO~6m߶hqlF|4n|ʬ8)G WU4$e ':.h1U]'jʸ/ۉ_2Փ~- x'I +a^ƻGbeOA_ʬ,< +xh5ry#.fxtiۅq!P@0/Ɂ!Qۆ64U+ h{h=W620>\ SwA;kK/S'P +.cttET'uJer>^ɉr6Г.\O AC0 |tR?aN*&ؓ䇚gh笘c%KUm<lo5:H(q\-XA;=21vKsKјʶc?/!~ H K'mԫ\X85b>e/piWjHoT1gF +}{hop3?$ ',h$??oXsV^s,-J "5#sٍ&)8\|khc*XGDZ"IlpZ /%.p2V[h'$J +t( @v]H3Aq32n/+$ACV*z2>JnHչʦBcdmhh^J':pL_ȗѹ;@ GR2o$;P!;q!&1_if>FT@@u4", LX:A>A F&C,~LmVF[- 241@r)o35,@+xGg%ow[He,#"@K`M?>|e.Ap8VFJfa$rrP#yJ>M_߀ h*U7[m7St>m(0OA.X~@/ +Z5lgk:noDb哯HʬjY$s}\D L#U}UV `$::5\.-ّGn i"PB\_-i8jk$0:&͓@ ?o'V)\( 3Kit3qZݨ(wMU-t(vgοacG@+]"T3e;fa_ 4㼏zG.2֞Pי:_]ה]Ti!'NzM +#|GJP坯~ gi +Bq巵-ͻ& U׾H́Kh$._4 +z,YS| +f @O;/+hS?(pS+pޥn7:GruzPw {W5uf".TNpimQ{\^#3vD9jPe:|pe #&(Tg̐)˹ RĎ-2W;yDf"iJ!vxvC1(9oIZ[Q*>E_ %Kwz&k ^x])$[P^.@#VBA48>`L[1)"ޫE> 7P6{]Uc3P-N"'1\BZ"0SNgSZ={|sxYgT1e%<ԟWUo>xcMO@T=d7W\-lc:2ޤ.eeT-5̓&ك>O̕T[`g0\g̀@Jӽ<u QTɬ663a +i2lփh,&U +EJSӵ(ҕ!LkA3ѩ{ؠݽxUP8l%kK N)ơ;tiKcCmM)].|0*udoO.j^7DBE%E&RZυlX{SK&soB=]tq㹧D3fN9)i2!fPwE:F͞95pyǞQ}J;ɍNm~ |z.}&nӀ JhYSL?r\ +rJܗFƻ ޫ d#{eks+-1\QV7)o^V6aNvY,v{Q<ˋ׮HyhDuR6 IɤVM\Ê|P|K<3ڰ]ғ''.:sFheU#`)=|(Q_qf; ZoaXkʱU*K1@i|.T"xOv`=KG1m桞Wci4S-yA)_k2|u_y\;C},92DlF9R^ EV wlLC'7x|tUfrqxC(8kWBk)h-cF2ly;#$[gqNg3{EՈT%LPxkL֍v7mrKcFAzıDY0"\_[ww̅բ˃!o팁v1H 7E"D<hxn4 X 4!)F~ljxx\^/m2kj+XX)K #R<$$ڕ^ `Yt0A'+ ;5Izž=qīv%᥵H?ΓƓNhEm(%hB#z%ʍ\\$^d7ipxW;9W U!aTOTBHa_(T3skۗLlh[^Okwٍ^Y-߇qq`n$9JzG4vt@QWhq +@*jٝWhn}ќ!MmP˾(@HO7+TXٱRu*60rG*|c_6;`3}vNLJ8/LPqS9+='zbõ<~܂ηl:ytbb{lXhJbȻGljnFܹ.sY AP铏:wL6Y!Ѹѽ@,{^%WΚ1v 3JWu_}3O + I/5k:ΑsheI ٯ4+{@,;4EA y+0_\jegdǬƍx?^ 2Hɨ©@d~ +Lu1ѽb."\sRP=j|RT߁g\4{ܹ@eEL2N#T'=ίU&CqmRbP1l_Q=joDtP;sR>:d#ȱM&pVI 0S، 7ֽ]3>EiYLs4`J +>q&) ؉D[鶪悬wha.Bn>͏QG֘;K9bؤρ\\%R\Vܮ9l5bB)dU劌tgt^SUĮh R|o,P,sDrX32Y7,g~("Hӯ֝mяWU A gq=̻א)$RlrfcLhIOQ#5Y6}9+ZUP0RXddꨡTy+h2o7 +FQCبh{fF0t̽>ws[+^ŇDΉxmC*+t>W (d JrViG +m̚Fa5<#$ɐ@4:c#r ^>+yj,>k (&@{Yb,[WdsF"ʋ<,6kSʭsR(&dR`UM)[)ZunU|_rXNQln(cp^[k3*X"=+"n Sgbd9$*")>VWs÷8ám>mX{%y5I ]$<:n v_y4UYOqT˩,3ըIDťdAebQە*:"|\q2HjE$nMH/oGTtzg!Z +2Z/{ +OpTQ|/$-m߂1} yWɪO6K^+e+7uPSatyi:+0`ux[| ЗX,&/',"uL K +I5ydoɉVVގlG؝)ʳ Fa=ߚ 0C +t4(eh08@=K6z;:c"~o_#*i4%by_fOvƙ#XA@쏝Sugw{{%QFpOÛzBneQgjWI +>fe{|-Ł͕v =qRSǪɮYE>5lsM_SJw.Қi*w#m_3(M /'ōmMdG@mM+V>Zd!L0bk;1&dn|U.~Q¶Qt . ~;|er.q]!MyVEiI6ò+=)/ !X2D@:j

R=H7N.-hwfl(W>mAljq@RɳF, +E_|*gvu>su82cTfiu9ǮӦ{r(eJ\`!"2s}0ĭjvkG/uZmH!޷U=KV]?\ +&Ip-@VgXm:zF=M~ڽ2o1 ۶jqyMC0lfV>i2MAH?tvщ7@m.ղ5IU=lRiԍcڷ LLyZ$g;3sšƈ +:|P,;(U֐:Vьp>є4e{qthpD/zYQ}8^ڣ q>bL]Rx &[!,<⌗8#jĄRt%7*gNs-Udb#{|cxylhBm %>nOU2&5[be²òhf彴! Nw# +lC ,[՘쎛 PrŋӠھ~t1#TF_'4[npX{<):XD PI>㾙Rukl^dWX$oȭqNwnfScW ͌7^;H0@I0M1c!(惸hcR?=I~\5~#%D۹GWhB-R]Wkms;At;]ݿc$VcQʇD>]Ww*zi;2q@+]b>nՅ2>6uL 85gW;y$a$_I쑌Z) +cx^ +'H` œ ~7ڴ0$L|s*c%? endstream endobj 2353 0 obj <> endobj 2354 0 obj <> endobj 2355 0 obj <> endobj 2346 0 obj <>stream +HWko_|jZHy? @$+r, +EŊ\J[\ewiYڝТD#B3ws0`Fדwx>sbG݉Ϳ1L2z49Ȕ$s$&֮z=a jr O?vq8R*Q5"iIK$4'gɻ1[N0t6ŸfJ$R3xoTP(\YO~nOkf3Ho\[4ATfpN̹A1糫#"Po@D>\zvq9#D'rS̔  W|;.p켵ף ]CS3 k EΛlCQp/_EMw]$ێL|6mWVEW՛!3iLEo0Z,6>Ȯ BMzalv‚eoy`eĭ_Qn8l2uħC2︄&5fmWO Dۄ̃jYCi;HF9/KmnUwZԺMAS)>CkY w0JY ଊ3|~uiK¯x`4EߚA0]c TZۜiMW*c :6Fi SXU.ex`0""C+7mjo;;#Q, !s; +.[#2lJ9<9n2A0N}zwy1TjEHmETxk.A8v%Om:?}uҘk5IjQŲI-_^[W65nZ +{ +,CkɼGM,Ù^!juH?a00+ubG*ҹam*k3lhum `ܖo\'IA 쁧rS~ 2棢N ,П +{X^@\#RkE3p!eHf]n/ʌjL$l LeeԶMkZ# 4uovKqT2f;@CH5P ȶ4QƑ֩e=L`eH{XٙxvJKI\QIN a̳_ +v8_k]xy0n?+]rQ]SnN:TCue>#O9sZVAF*=γ9;\bH/=L$Ӎ '릺6|<`XHGGѱ-P#@*pSHHbD8\mPBhzLݬjH 3i4$Yr6UȮCkmB!X!>`KFh1DKcgnk[zwOl = :*3u FNb-̴-BmrGCj.o!(>  C"h=HDR#)j`mN5GdhyٶXwcS)6lr@Anj )ʽ/g5~jvև̭H|WK +@ HҊb|NS.d^z&ZNxj@ e٦$|x f8y-,ַap\4Gx"`.nK_b=DT}#Oݳ7]SJ[~ͲpT!\K,eZ]K tnj#+#4rP,۲WGِ/Ů0N4ofQ~KD$t_Io^P_.үPm8;,ɮo*ϛYYapX$V:nlo/yӇӹG7ShHσ.2ڢLZ1 2 yyQ.;BTD+hR[v!UFOb(ʗ0-TJPdz=_928&󩊲m`,2Y?Ax9yЖRp(uW2q0˯09 ΐ$fb*, *={Y-f]m>iTrgl)R$O Q>Ox>?5 +GHNS)p( = eHvi{ƉǏ8ICN+E=xzkQP- CJA,&V=fXxZƶc=vvjrZy&wZnvK+|mXMqMxCɬ$d,1 SHL5˭ #_C \yPzn; qD2N%hgvx9}tlnƛT: +Y*mM4YlO/3l"'>M)L0 39sk%cWo(󍂞?]OmKQ ޸C8D(c7BY)d,XLn5mCl B%s]ȍ520GܾX%2Nwp}e虘_2@rEyiBĕ\WlL<ˋEﮓͷT N^P%{'. +_ȃ(1&؈Ċd_[2bmsSyBPiMr]at>Iȥr|Z(ڇө7Uj Ej(ٸ*Jp͗ƦذJ.vUn>_-n btP?>,/NJdsssu=v9nΠ(Ӽh1I'C endstream endobj 2351 0 obj <>stream +0 H@&\ Hwd Akd5?v+Ji~?j7sd:&yoF>47;_%'}9`nyi8>oG40o/77>IE![4VSYO;G9k] :\vETJnhÖJТG~eQBCΨ~ d0jz/p3EpL2-JS8kmXUͷc;K*.kb>i6?vvS]e1'cھsbtƠ`3jS(ڼog;,ˈuB; +WЊ%c1Mhy?-6ew^ H^$!.MH;7bMࡋ +V+N9U|z~y<.Țd: (0>Jv75bQYHpPO N_ng$&U **OSS]~ܑFf +Kd^աG(eI>3&U]nY@VpCiW/eYVSd-S4% 3nQ}i<0ZkDG&tm-DɗfU2+sfq 촺j|hc%TCZ5xXgex C/'0+EJ$c뎲O#;wݟ?މOdn9̃.CKˊHMz7#4Vlڐ̝_ sw'Ӧw + d8:M/5STK9 ]T2x8⮜me+PW,5ޤ])[hi_%p\X.%FFњFd=w03sHЖ?͖֬3!6ޒ{׏jUUln*5Nh9@94*]J_iOL}&OPێꝄg9g 540/QX)BQcGȠ؄Y\6ZkAV0(!=~1&eHsd[.&iS3װohU=a;#<8Y҉?*Y[y:~SjOh>[vi?-ںU=Gj_`ctթ+v8ſ7NmG_VvR9 }?Hk0n(_r'$MGjq s`V.aCuw,zU眰%@,gr+%.n7 +F.V%>U9,OJ'N(Btꩣ$i>Ua;;&G)R6f2]~еقd4OT_w˒l%]F5+`TcӿwssPhR$UWHs.@0u: pa>|:,v m첒ET +M`b>h?`dg;3R-;}GmY*BAK0wѩ +@P8Wq!Oz1 +=ݕzQ0hK 1|~& Q.zdlsP!'Oad iW-_p'h(T+zeĖY; H~ C61EIoV,Z\x!hEIUڏSXJ YPvaxioXrB@?[}nY@^|]*|H ,|vHkohD}7)1[# k1FɻfA@nܸIVa22+˼ L?@PAYQJ2o)/}e{EgXdٱ CÅvBc9bc+.yU+R4Jh>&ܝ, E 6ppS'mO6ST@k fBDU7d( vUf˫8eCKC +^%Re8O\s橠1%eKE3e3B&νi_6\(㎠54|G9dh|\cr98+{76.nz+| p錽c'9*8U驈׹&㶨H~!CAʎk +L;y}{ +fwKǶlOo Ex]uP>H9f޺$cf* ~ pۛ@fHBjP,06?`3Kc]l!vcrm=ͨG{nT=Tvk'+0&LsZwa}`  +fwo'p' +f^Ӏ%t +mmJt:s<]YQ2W3IԹ8ɭa>TJqT{]]l]/|Q`Bo{  +_2gޝacyOʰ 0+IV\wF +8q!uPF9,k>cA-[15?,R,}}YRNvwXf`yiF{i= J4pս)ϰV`쁫D/$(lMp),O^lp V\ir ғc$~uӘ`+Kfd O%ݷ d, COC )p{ -}+`uQH& &YL![~٘;dzҢ =Hgx./ͫʔjt*U;}`x<??׸QY DTLۃExVL"*K䕇5LYQxskO20dZhYɡawv-$=eJWވ%e&#-xK\`4U.%tAd ̞kZl&N€S}%28Ȑe?W +<@ZJ Sz:_Mפ q0F!EՁ)f ؑpO}V9I=Tq2X TT`ց? /4׽u@V^*. =H'A&"2.i #.]й-Zpl"޵0n_b ԔPgIqn&ViVI@Q2{v2U<`nBZ;f%Q r4WL^|/v޷ 51]4>4ۯ!qQbDԺj'58CaN)ߠrxǟnzC7Eu(<{Hv!DkPBP%02̈́- R*#C"g& PZ=wj+c;eGȢ=wJ^^N lO޵_ieiolJqf`SFwLR'3J:h+_Q#`ّםH7jBѴ*`p&\P, +1Qbc*؇A5r8N jTK5onc m*I[{zdgє1HCT %烁VMD[0 [gv A^6d,CSW\ +:ء\96F@),t ϓCVN(y%I7wuƙ+)ngÜ^A 9 .7v{opy_wydٔȉ E {˻#]eDsoEo (ːOrds\Fxbද[0̏K7Z;Y9fY<\}Ȇ!N8^Qtg=2\E~Yh\/|?տt` $fwXfgtGsH)BF<)A00#(m) +wƪm[T&XayvYxӽ%.g=axsz"N{K#gbKӴ(:q+b'—Mct{p6U X[` W+$hl += $z6oؕa\S L:c>U։5YhiYSNGw Pg%Da XC+JtH欘ϹrL}!@ڋv*!pk N@x_lNug`^Иھ&HlJwѨw`,vcPX":MD!Sʎ)>{6L0W3`fDɴO0TG"#$焢AU"{܅ڈnox4;`Ԭ!"DR.d~7!SczD_ㆥtRAD5[ pVF BFH|EeɅc+Mg{ֈbOZa7nm̕#pxtEXK<>>z̋፾9Z 47v>no&N(% dX(RJXT:*x!li]{X4(k!J4 [pM |_ HJ AwzPR/MqFTT"^)N d匌^,/~Le8-)Y3D;>}'TpmUh \ͥй\G6n lJ遧 +f5_NByZ[=]T%x1ZhpVc/G2nޜ{1#`AlZQ5dY#(ޜ'/"dAs +.M%gJˋaY j#VיִDǓTXYr~t'\ؼNzep|:G%Hfȏ*<g6#$=fc.)2Ǐ^B *(a ?BE8 ug'C =QPOȋpm~TQWFsJ=z<남4"/t&bM3Y* `}D ͇n~I8o$Ax.Ys4[$C+'Ndz}ڄSg엦|u:G.vC$ja,EPYfBOlMQs Ƿ⇹CthRِ?xi (]lb@~#Cs2|pEN)]iDm蚔*L0S [<;gS#HYd=[w :k)爁kTکŷB}bYk-?~P+aF!sQXf$,"`HDm,Lȿ06=j?%Ƿ#񥰲5dl Z4_/D=;%pb?rZlqMNbɰ +ن{Ll쐪PCGb]>oSQ?B2eA ?KU=Jpf )E^C咓P^c ..aC$Li'',BGh;sp[W}XvڃW~*nz +IPKvWغ0E-&h(U/ IKkE5!N8`VG߀\*aj~ꙬYoS܀Ѿ&a|I>Zx"$T +,8vJ^Y)2&Er;v_9xJBSν焄*qZ(]3*ї4׉dCXb|}7\Xj09KC6a| "t#[.ZSturS}Oz"'}䪸K( 7"lG7O4qq,)֍@T-n6axzh?̊olgQ:䅾G,$Z(??u *{yD%J Y0si0~k.mN2M2ɞv 2 r|SϹ:'q5!G1Xr9N0`apB]zaX]` 9^UYPeHiGd31 E +}0A&a/H! +Єڑ aҿaEߌrJ5jкM[w5%oRG&͟"3΄dNqRUlN,óJN2SU_(O? u#]"РZұ @UNiLY++uL8L;n A}jHI%u}qiX AžDA2T|:8rN($[͹fBDI"U +}wt5(V_@99C#K`fj?ACx2hC >C~; T1r/p`3?jKeV2=/oAa-Zeo7 'F2v71] r+HFrɧ 8]hR5%DdGyFp*hP$'s4i D VhmZ^Q$l4{k^.Rb`ҏ ޿PРlC1]Cc#cf]T/lbr=()Y..mATFo +{1,c;/"yLc(U!pU06޴8n!u+bgXhl- ѱ|'87LQѵ 6WGT󸼔j庮2צsumV\[-U\y2{*Rͽ#C׭ƯjpߡɭAw PycY*Tw{O#'PrU }Bd \$䶬D*tS";`;zI-Tԓu^M>F/]v;9}!/cBD9Mϲ HJ^8UX&s+JK O܌rUf+WPZREY5SXq05ǔm!r3e^z#5t4CuBĂ$!R7*H*.Zĥ+eIU(+05cA^#C%l\계|m!ه?`rF%36 $k5*;(~Fn쬺B~_. LR3GV +X8xgyH`7,M]k[:3WT7CyMcu urϼ VcFAÖV\Af +_$iٳV06^LqBFa%O0N<^%-;\t(N)R POGa7FqtB3g^x1nc\x;e' kf]"vԉ73L)9c9opxK |_۲7rZr>an_5FV(m2^|qJ0y lOd ,+:saH= BmrjmZmkLyOvNLj,%&n,_$7fW/o$6nLIK>"I<2[xì>Yr +}{]]b'C iHyLpLs=Ѕۉk#)a}UH<^z;`dn^KU| DŽ˙nyG::TtV' +EZ"cJ_1qEIQ^GwH3 +MyTÅ5hpLʮ7^ݒ͡~Nqeg ]A$U~d+i+(_]j`b }u;iROf|T&!1`2'ᢔS t7Z8 u x&K+?x8`šjz06 fAhAҲ|D\bPJcZaHfVQK*x,X"̮YxOMA'CHH('T~o|` 'o?UPr;$yF0l2R3hF9#fpz1ms7>|:SբԒ UR)o84(~ 4zɜ;ِ]qzj&㧽GU Bo$^i߯;$=Ju X7 prTKv kK';padxjߎa:%Un!i a0m-T 8)Ni*{pĀ +6) JFOЧ~p*G034T,iTEnG6`A|C/2 JA*sM&HdrtVm½Ks "rPx=8Q}2C/5 <-8{Lm4.ؔ$x~򗆝E -rQ̂\/ +ŷٰ͇*QU7S ]>{õb^e/0f]M?b$bh<Υ36S%HV;D ;hHrFk ӣŢNHb> `)(}26켖ks6Ζbt1 ߅uAD *py[?$G -OeReͲJm1^LY;8ƥ^TS.A,dv5 A>0")fmpn(p?`3b0kؖ|S(6Q2[rz 5u:I*F Z ۹ѫ;̶aoA9']5,GCG 0"g-GPPq$j?ۋ/(l¬q2t3W(]i3,ӳ!qU^_[;/zb RFNû,6<ʧptIT;q +…$qullfYWVB*JoT&?N)gs4+?2Im+S̔ſ F;Ts#hm\wDш!fK!cT$BdzpP'~m+^XFXuV;PqVSX^ +ާҊbMB45uJ8KV<Q-@"΃@J*J օs˘ͺΈbfBkUuQ%ӛաkgl +|3 ȂR "r2vlIŷGMd#.<_f(>u޺̩KvЦ.l԰Sz7vUS62r>I7tƵTifnq#C./s TAJp@x,F.MH7<#Jobq'?{Q<և_eb7ۛ `Iɞ(r,חN\Yni͇f9O/MwrZStrn/ӕH((-dz'{k6E?LwU.3?jQX:32`sV>H3tk\ڇJ4)&l Ai5`9Sɸ@ڂ,#O>CHVcG^Aȿ@Xδ#<$\`Ri_WyѼRYWB"kȫ1[ֈd,?p܏O '*Ht|!cț1>S&d|L Y +X4Y E'}:RtM Z!9;D]:MMB/׭Ӫ=K3%F6zo?${c[%mkhmUƓ؅; X46"ʍ*4C `,{%Ɔqy8fS7RU?jA¾ . :sI[vx˻xIZ,,#@/Pex5҃O +D(N`ĭ3Ht U2S\ʞcAVMZhF@Y97b~QovF ̟A &锵쓂C]""rР&E'EpN@̗ w`iy;;2o >' 4T|CU!0 fs |>.[ Fڠ`o[P!Qn~54nڛ9d\ktN)*JFml%-&wZ]i#+3nf?.6鐆_\RvSV߇V{ؼY xhpP4Woe@=NHG{(EJ:\4fd44(DHJ;z뒒c~ǝ'oٞognpJJ@o;Mk4_{J [匌&y#o-*-cMt+{)˃R4I PV0rO> NI-Zvf? 2# Rj(ZzrhBC= ~195<>ŬFPHFBF,T0*}w$W(]iiJz ໛ +#6e)]]v(Ql/,u&oHcAigCBo$򯘏=jD`*Kl7!3a%\!tޝS+_x%Db =BIEt٭Q/BO[N}S6DS_k)yX*nx6tXf5ZYJж-hIgy^ޤTC*3=^p{QB㉛^dX,s+xtB(-4;/̂ ^ܯA&Oo +Sk`rÜh\PY”.0..5s?BO7l$h=#v?E}=1]7e[ ָ  0>م%k<̙#>/R .~@`.ȋ|oꂆn؆cdEI Ϝ Q q$+%6"oCpK ,F_O1)@iɊF4^$0J7dF^F5k9)M,nNN 8$j^E v}XeW-sB)!2\3p;V\V>i1okZGsg&Нj7͖ݼ7:]; Oe.2`{e˶0}iWɖ(w#N& RxQv-5 k}Y!I[ +s؋+T%[M$䖤X:H(䀺1(M{=]1C~Cφ0ϋFй_qPU 2.Xxe҆G䇼Ԓ8V +f;IL)ǧ= .Ί]0,>Ǯ8[ws,2Ub!@on/-i<4;#\ TE9^Z08(a|_ΏR k.ZY.RTZd:IPqmR&5vV.δ@]mVO.ˈZ Dkj\S[ۅ 4 &s%y[.fċ> oiv7h2J lZܼQLvӊiJIgYy"4Ԋܧ{ycSW1.u+ђ,P~}F.{I|$ 68_;zq?X&padӺU5 ~$ߧ]YG(K@'WTM8-k ;͟n3[:KJn.б%\SI,\%} NvX9~0Ӝ) ׻ ( uYt!`l AkeXDc4Qx @v aLkWDIt8)]PQè_@'^8m,MgSB +VDw#SvTt9"Z:?`aԅWtĻ>Pb15 +|1TIƧ + +.rdmCDZnV9M5w`+3ntIydv&g(q!'7zNi,U${MK3c G4|~3'N~ܣdol>%jV]cc>`a.̕Q;f(eGt/X[Bl!d/T(GrӇ>޲> ;^M}EĈ]Q5l fNK책x:^RD1bGK؋]ȳCMa> +GOkzߏx|xǞ?ޖQVQXim }~I9>Z*S]҉Ԕr<;{lbMIhܡR[±㈿H #7r#R!҂F,/2;2vDӠύq俴0E`KFh\nW2,=v|I׉s~jĆK[J` +3^vL!T5P=4^&봙;'wuQj6%PWFL8*YE*ϒkwr[$+ ˼Z +)5;4E jT J8\2ko]؃=T9^ a Rl 4Uҥƶ߶Y'r@6Y)* 2<-0N=ϰ,5[`}MՅ=Ez ʻ=<ڄ"ff]?ZJvϻw?[i>T*J2+G]zT[6DRBI{T]2s6dz?w1,yU5fg+tFܽ"M۽ +돤3NFsY +ۆ߫oZ +HmN1;U(SbZ%^*5C3Ń rd TlVE+BIKBi,~qڈ'x.~ƙ'C,]0!PBcEBBղ.LkSSMpȱ_$w7e;bNBvi;0ֳM*{"˭;Е냉Ɏ']bիɬKhbeeo 4bsp#oT$%P&!4dG0,Nɪuh[bQB]HViEZP.ÿ$`+27Qý{">B>}Wm2\eTo+9VY:T+2MpAi2Q=m͏ z#A9 AQs^G;y뿁 k%3fƪo!TVf'qIM_VHQ߲$SyW=S㱗pQ g!ls~gnWV:y z{ &Ajflξa|i>"_F/1Gn՗)448/1W^`>9WQ1rRtfPe /.C6%d]nTsIRD 5e$1^pi`+h0t{ L0,ϞKqit¥@L,Bԧ +1#ii'kH Bԭs` fsOثDbKQ[i%t׮9Ӥй`WՃ21H&\xcEN,Rfy$gŞN,b=ggL e$^\: +Mԋ5`#˥[X;tZ|,'1uҖs C:X,mvB0rfb55]l#8YݘQ?{&/K@VCoE/1\حʳA|qf+E Rl{EƜ35J8{[?Pf:MhP}-839*=04LŻǑXu ܽ7\##NӺvLeX +D3~S(b[ՇY]PumbMvkrb.Jdi kyV)=`%?NzkP]jV t=9%*[]os;ϾNaH+hǞov?Ql3'2H3չ|'9"~ +-IB( M%`ѬՓ_ԒsNJ@{{pY[=l1!†6P˽, wЦCO 5 +B$%M=)UBIV'/  [Mm48%P.=,1Bs:C**pr}A원br([ 9#-/uaX/4C>9ёU$OBj;5[~U݇NR\a򐅅 wUp;V8cJ$?7oRshU9v(1ǖ?O ϴcuɫv@eANHL]W+Baq[(l[=.BY095}o]| z34`IxaV׺Q< B IIJZ\ĐMrUE\;m\,3< Ldn㔨kQf>l."']Waeel.2`a^Ȃz94n/1\?hciސ DŏCSݴvf: 9ysB86J52Sivpnŧ!l ݼ$@繻AcLNlX|&Uj\$>>͚.]jk5|HZ%rvrSb.הKI4I~5BbV0G0QU^FlpxU_aḴ\i>DNbWuװ*8k"{l4?1 _O2⛆yqn Wl/lTY>va TEHsQ0'hTu2!D0ζN7($LP,X[s2C*`$ıy}}28=z;N\ud: z2[LtWB }#CN)S௒t,!)1NzgE#D§+4% +wc!ZO+\*~,u뭓X5p b0..N, J*?lt¼@R_(V`⎉{qVtKRӲyu#ēׇpQs"#8Y*亘d8m'y\ Qˬ=ζqI(!dEoG5)>UkΙD!b6AZ8S0xg뙈DUhƋrV*%tRm+;o2Q0io(O_f52YI{ϭԄV,a!$HG#< 3ёO2 b+]޾/] {Ï<S}JC%7DQ#R;KF%K$楖/yd4neGϰCrG +z1sڽZ3O-![Z9@ \39q1JE8z@;f&5%2sy}IBmھq +enģ[= .ޱeꗡ&aIh=`*6 q5T(%w) S`,VQ >֗ƻNn00hz[ QޤR7\JʘdCU7u p>%<^z Sz^WfW:cCoh mڅ̝!!AyF"\֡f覤' endstream endobj 2347 0 obj <> endobj 2348 0 obj <> endobj 2349 0 obj <> endobj 2350 0 obj <> endobj 2341 0 obj <>stream +HdMO0 >n\iM;ta|pFUma?WM(R,KP I2(=# I}UqzQ<QƋ wҁf$Rj hX<8@^Q\Dgh NZq^7 HY{J}|q`pq5ud4//dB+>*['bxCsfY`=YV endstream endobj 2345 0 obj <>stream +0 @@& @п 'P-!}?-;-QU<2N˲yw9]5˨w" t` \{ȟ 7oV ^$d5 U_ETR{D@7AVپxΗ/S=Tfd'|ʃ(5Z\tɋ ѰnR^"diG*߳@v [z~X b5!M=G:hf͚Sԥ&^iJ6Md}rjo]Ww(*]3cQfqWQl%3d??^KbH_ʉ~e=LfbNqK14)n:&zdk<xg\zT)A@]DCY C3?Lo}79#$u=QldU# +lM`_X-ƝcT%&M/ i_ݳ  $MthbIKfG\g?@yJLQa $|G"4acov $r|\^+oʜ}4I_\s/$t3tlEobW3 d8Xi}8a [fKMtaDDt=P?4&X.uCp +\S]^(`vgmNi@O&3 +ȧtC:f+gz`|玮ڧmrYZ,YT^~V"1BCwl. +1H۵!kCp endstream endobj 2342 0 obj <> endobj 2343 0 obj <> endobj 2344 0 obj <> endobj 2336 0 obj <>stream +HWNF} AK D +l<(f3&cؿOMFH CW:U{Dc0Hs}^^qvQ/~[Ӝ3 \e2cY43h&D ֋̎PDXö|k "c_WUۗ\٧O>>8Rr +fRb-3)*V+`g $U@SMD߶8Rol|(!-=u\L"AK>b@o>*#9 ~iXHiƣ(Sk{@-&R4v}(ּ+Hj[6ͪ4}hP &*;!Pᬓ &t*`57m֣`gW29̒A7`]';GP-̕hΦ ff|'s+Td6Q 5LvJR!4uDĮxn'=v,AT^*=e1hcHQk5ѫ2*,C@|EӼ}2 "Pdu6RFgAm%rq [ԓ*x}DL:q:J|p,7m .$)ZG? #i"4*zzC "A'JW} WNpUjmoc n~wsv}+ccB%QpQ2;Ԯ6})eQ  +>.G(P>l (:K2#5 ֱȠ9;Zavc<"jl)VN=[\qa/&Gg"N#msX1"y=-YxG<eZtjp@\+˳ UTAz慎$~ҞJd3b&м1s]닻=.2acOG^_H(:z +03 endstream endobj 2340 0 obj <>stream +0 @@&| @ġjiHSWˬ/}#8PE{4E}njZg#԰ pi1B1 wA]$@g\Ǖ~E]ir&a,鳸?jPn*7%,T/Y6rٹky +3WUwiuc_]Ow.>C>TZ?ס *`sԸ=]CaDk-,IZX\y)6 XjP:O:0IRvNfe ;7YzŕNM&DkB/ C!m颈wm9;<剅.$G*̚ʓ&?xd/H-G#QaAш:֡Ui8$QrYU ,d̃V0+~avz 03=z0hțar6;HZW*:«o/P6noIv,ҿ\Y>nM),m\^W'R$Iow,ڀ aIqDpޖlfF 7S[|;EXJTF$=fgw6ݙA4d17`JFDhX  {;;>4I]>GI'zl~\` P$e!=<~ÈW`$@ws~ɩ~V$+(Ǯp= 0:'Gq=D/{,z\(Ҹbƈˮl^7|g ྭM0:G~]Ĥ 7*.T.r۽jƭZĺ´'Wdqo^G\,ܞ + yO6wgh="-O斟j`uTitthX56'fMQ^s\jMI*!A^3w!ttOSLUݙn/MraS+Vgͯ;E:cMV,7eK{$dVjucPB13k(|&6q:k?ϝ<"AC 51>6+R-=jMs."đ5gmٻL+Ly&sD&o☇@)cTWˬ4a"5YtΪcѤ)0yL&/5jB̴CjqklS@6goAi)ҡsQGEk:A3wzn' ̓ t=#U;1[ǬࡊVrŨM99%Dy}R*5:yS}FwܡJ]8A}%Ǎ*b^GHix{BϦ~!YXcYcא #~j+D荘r>ܮН r 4َs$Oy2 PCP>WBJ@۶np3J8 (0pERco?R] 6_mH!#,Ňޞ_MĈtL$Xuu>94pix|s6ZhwT1i*U!S +hհsSdSF`k0$N5D2xwzq̔:b RDYJ IJaKL 0y<`rO@E=ZލbᎵ!0,xS܉Ti0`@ߠ\Tbcu6U!VE?rr:5~M(,P|z ejlQpɮg "4E4m9X.JjԼsȰNyx /NSlR,VHC. P)e2蘊FJb$+\ۮ +'?&_bmRAjMhBSynI`F!l&܃!Rp2:PyLUsn`,]c~4\ɔ!U?zyda"  2dRT=hzqz =*VpVXs@PEFU"PtO_҇_%o9!rqư$axAGyeT{.Ʀf\HQzy 'g%ۙSu,d/ D4/^ 4΁NqPr}<Д`ѡ9f1'"UR%@]|eͣvl$Sh[-{Pe;9GYptODc)7@ 95KfBIy߾ݧBD.shSB$J!Ut*z>^'dH)2*H챧=cH}yBeOШt"y [?t;nM&!XGksn]W\JGHIU<6rB|;dll ۓ$T6AiC75]kը~f^k]# ?:]y\b) c +U\sǧֿM6t3*Ж͉_8?zշZ㹡}!1e ّѼ bt[0nؓ@_- |u,CY?tgEއ+~Gy~{NOi7S#'oɛxJ^\!;0kHhW0V!SbĀq< ̗SgwFعM"nӭ-|It{2)o"`sPm{,Tm;&|%)V'*Lt̪ph$0l)`@_й4FpO;-ZLCe+#V[%o$v3VRTѥVWez] i#̟ί5\B2-KQY*eQg\mtc94v.(ݢ=1_ tea[Ʃ$5nhYkwy-FM뭊qdZi2/ +#+Od\KzI}VDv-#<ɾKI0՟h~=jkF%H1GvtҷD +,BJ M_{vR)hza6ZwbMUóZN\Q,eԕ|'WEK l$K2GؚjZ S4o2B.r4Vr-Vi홱a:ƒR3fH!G%#} /XỊπ\ǗjzK,i)x'IQ,iBybJ"eۛĞU,E;V_(q`Q\?6l9U_,dQ5N㭐 NQT>$yam`Z|z%HC c9I% +j ;EnW`a&'}mHZ|ʉ\VOgv\ +]d)^|'ýLktu)'L+ +ĕtP#>S"rN㲶<:@{TNS96+`7}dʽzTĘRU%61:@W&RI=o.Ec77R `|btדQ +M$k s}/5 hb]c8)u>9 +;Qi~qfD^uE6*,av5KZtDE`K>Pevߜc)uznl_C9+NAc&ʤV1a)G܃dSpɋxtm%OGR%7Xpvw+&f!cv k,J/r2u%;}!Ih]lffNk_35u17CƦt~78޳nQ# $d'T`D;y$C-Yk/`6jFlbyQ ZXNOK奊N؀Z@{o S#cKtGLTlQv#Xd,N a1e{6<`4r`QY$TZvO%kўMT +?Nsȱz1F~1*BV7&6_]e>vR4LvӵHO,NȧP + +m wO^'K hb~̄(ku]ToOC@|i%򇽥\/}omJ;kRbpvԀ(TOGzWujV,p3 4fS +P*eж&6پ|| ]p)G$Ӳ=㸫 bY^m%xO",jBƝt!Xyt%z:2W, sb!/ <5@$=e,[%+Ќ[k6BwॼTKVQ=R!J6mHF]e57mg+F@Sh|APRGptRt`0xQ@[A3^WDJ\qB\P|I)oX VKUkR[VeA)R$X`?| w +Ѕc8 +p%IfФf6qSa-As&b?߯n H_ģiqI)H>~[+̗KeSKl3J/3Y`:铣.ߣe +ه)Cj3O{E`Yj5xjTb>Q*iMhLݎ{,+Ls +-3un{<+p`&47+'q,hӍienC +#bkKiu%儕гWvwgzV2\Mߪ^3)|6bԃv (a}m!U8B#S-ztˢY} +8Ya3Sy(m8j8US8m(eOLj ߽6Dg͑v||4׬jwe`D;#!f sM.(=/7}es,G!-bf\M!V{Y5O{v쟥ۙIJH< }|UYdti>& u)-ӟ({)1(t㾎|d3E`_?b&ܑS|uO#?ih}f*-HU߸.~zFme[zaOl7_.r~ \n-,?psĩNTUA{*Kg@`sƁD@ !+c W)_e@ 9F4*`6\h;[&63F&{Wp{\Ye\!-^tt";TU\ːث 6xP@GK~fŭ!Qfp +Pn+7ҍ?Yn NJu95)z895FKdT\u2,-$uuU?O\Z~: u\d\P]WjȂx ]wi^]fЌϭѷ.* CEJ?y#3z}$%nqj~k12 ;DڽEnOiI-6/3|HD:Iסܢ&r^T`UF(3290/7afpi_C`U~L N7 +,/V_΁$5b[8I*TlO^_%*ةnO`v=`i_{ĤˀN@m<hp7^aēT6ǣ2x* ]GB[;.V"\(t1tr$x+S)8kK.NO+} endstream endobj 2337 0 obj <> endobj 2338 0 obj <> endobj 2339 0 obj <> endobj 2330 0 obj <>stream +HWێ}߯h[}oa$P;4A 8]rBr1奄7J0`˚fuu9Nipf$,x^]ޑF +UAu!D^NXn8$!8%rIZ"nV s" +wbzy?NUHC8N8__NF\v\XIw?c՟.ĥuA+n,͏P%f/ +}32'\Ss3?l/?SS߿~;8o޽- aBy>B_h4.7f!HƪDkfk_\C{U3f]Ѿ+1A\єK?sBǂX 4qY,X @yao}`+T<ؔ#y< S3}IcJ@h)hQH,x);C_%f̓KUp%!m +|edK(GEU9ǫE%a%kLJÔ"0Ere`*Obڮ;O󘥈5u1"NBz}usuru9Bӷp&ST"qPu%*B >N^LK/D PHdf0ҥD}xF::q"UQfjf2ͽ2u74KPψfɩTq4SV~֦YK+ތll>stream +0 D@&D4 DV)N0T`GAW_Gv*' N]|l2M`~{+4.@S'"[cg.h㵈4/J>=ğ@I2Wce$]Vc_V.ن sPBYM/&BzKuqV=Z-&s +"JyWΌ-Xo;Lςe=I,X97L*vS)HQaQE-ˑ"啡QfyPI0?} #jEWP)ynnK)#~ LŒ!#p֧s(CXīl X;xT(vw:Px󖱎g#VPJ.wyW?zǘM0N6Q/`A%@C"AtVϟQ9-/d/1 +\uʉ}Vah_7)p'Y%0 +;${f#ˤ!d|z&ht5FmWF/ֺIˡcclg\Ё%.$SBʉ +m&S W*Inw+58G_5qҒs~3,O ^c)bPoՃͱ"S:lqI`Zel ]9e´jxlp.ȍb뎾_bC (ԻnMN*F.F"@ B4؃,ȭ`k93SۅfFqbK_ɢ4}YkzXC< ,=8FQޫ(ӃV^3Fo}'jw*k2j :_HYpUu}I+k#%-Ut]0 1v0c=b IGMA{WQb6:À5x]'NcV Rk%Ϛvba-ǨaM'yItLM6~ʩX*UeqE@tтfCYhFhwuD۔toEI[҂t:6 $0ʴO|ep Lw_ۢRwb{C2 (%(`Xc!9Dέ8HUTL-{oWڃY59V9qw ]wi43r58/im!oyy$ya\|h +{CXTmۙI|_ldo0Ryy%PʌM'wR9ipo1 +3O: fBW9@YZ5Nj.Lrb\9^4,p{*Bq6꾰Pk/˒U!p߸K+=ZUt(I漌V< iN g5a:u!.TiY@9hn0_!$uM?0Z|+U nn"'`fF1Z8t]AuW=3pIZ%\b 6wؐOWD4,a3,[{_bvKį-(b9O9 ,XP']_h]ՔEr*jq}cDNۢNEk)"Q[9}rB!^? y#m/MU +zGgX8ڣu]u)oX#)fYLy2-Z-_>l01MN԰N\8څy\fL[>vK~D/mYΨj\=vtB;.|}ς0vc B(l[_yXrx +Ma'%#K|ו{[(b v*3Ӹu"6 *c.NN. }Ts-QT9U=MyZ@qbRl+4tgqzShLI"EJ5hw6TO2eZ8Th<5)&%#,*meR֧OV# }|Pl]{$F\5]_&-<;&QLWTW^3I\tI7Θ&璘CkS[ EjtB ]r _W=+~A@l[/`P]L0sA;НSV䏲۹Xwg:_+Ȳ&vS aOr^URDŜG}l~12f'كGܙa(FPf+# ^"dvc_lM`/@'Of#@@ApgR +,|I</\n?M Y;wɒ)).7=Y( s2DIM67ի hiDSF +l)-/ҨyO ?LvP&}aՈ ~ɡ Jr]tȀC3{~J+Uإֽ cbW t@U7TvnL8qIa9,x$قK5a*|hɚ+P!P{6T^/e'TŎ.4ONZۥy)Mx4~H# Y:#IFlMab;p/]][$:N4ƞl'1S~,/S8<<Tefw/ f#/i\0AUW4r )eFTcX^{ 㫗EJS?{.B!v&+MT c_<Ξ8fd1M){a"sxe Ta3X).bo?Lد-ɲ<0!]|,*@. Oՙ"ŗDtFwk EEfvþy s"v?.L? L#/ @ <} jz;:4 ,*'|WWCC$:#H~ `^(U^.y;;gw9K-zsZ0z;̺K7d߱+]@)t|I[f!ގ?+FߕӺ!bk(`9/',S?Y:5pyu9c'.҄w,@| {KtAe uw~ ^'F|*!"xF9wvDܕ0M +iOS3g4M2)yWa}_t& )yΏEhxCW@a 4K8bЛ X:8: ^@TrfQuú)\\@z@*>DyA';d>?mŧ]$ցHᥚºcba^O>Z5*K 5ROc O%WVLw_5^G[ LF锓N*NTjHWV/:XPIf/W-'r{V_b>gсs]p-rit5J mGb?6c^ߌŚr*V3],J5-yÕ/p)+(m)rp*H +oZ ݍS_: +@'H.:<>݋V׫,,rBv}_gHpCGQ[=%.I\"H}t$TPo#;vPo  6!IҚx;xE[5Ns ׀r6G-_qg@?LэD/sX&(1bxt<<#gxo(wd&yCt(Sb[.*spChfW)nG_aLTovlއZ_^FLzTEN(},mq?SA@o2!9[2 qLǮ.p!w}a3LEjrz ף&N ut\CjMg B>QSaG!@Lf[-ԺuNӘdu#^&,E:zMX/)i܄ Ur>n @ >'. j*J ⷔ"NG"C\4y6E&Ѣ?/# Tɔ={oTZC&Q߮d$07@l ^h+}).i īVCvo;q4 F葯b%ҁh7gRSW6ms0zM*?roHP^\;/7]\3Hw~E$Yؿlęvj%k0m+up5oW4MؗױIJiFf:_L،)#?7(=2=6+.Ӄͯg޵]sy\VPGo`mʁfL]!dHf^Bhe85TDK2R^[]U~![WphɫQf/N=D3ta8yUN=hvIyc8:7X-q%ԚFȀ)ٝwIv HįE@n蹃D'o.T p9 I_+ úgN}^ئ-G+&50}v.%Z%]8_ua37FJ˽qUӄj& _( xVHTݓFh?T!G 蠅kF1))@)l +o*).ѺH M(rM[ -q*հy?Yqڸ=g[j =/O(KAQ +{v:tgW1+,0:1fbcA-mpo7yu4fU%1ٶTSt.dygU\?ЃA*0BPE۴y9!_uΦJsn#wSV;>7?Ց Ij-@E4Ivʷ(Xaw_ٔd6f>w:UҨZ(*jc`4y!j}Ri3]P yzbC|G?S30Uy䚢&X:lܿHEj.on$IzFAdq/rNO!5ZCi T|Byu OkO P{]0%EId# Kò6T! G!`6{7P?y/[o6bB(IEux±U@/F/X^I"3Ѫ 05JZ|b~t 9܀EƤ Vb秧hBw+#?)`'x@0Q7Ch#O6n-=`,2OP:4waqjӷ$Vfj_v e%F=9PB FkpY4W&Z 1Un7Eկch/"2 +bʣ*6wBkDA05cldu}Ҹ(*`(A:boZcXmK&9˰P+_,__÷34jkkN3%3l%" $xx83,/ƞ_Jm8M'5/]$!:@@( k棟YDOWz T;0dLGtێ*Yt~oJhʲiFU)V#/1N)*`\VgeȚz?QlFݛثn :t|kĨipoI g6Rn<`&LBטZAkyߪ.JBX-BI&xs߿ou9(+Bo+5n9n Sׯ?:gFdMT*S'= e^uǓ)a8zLMd%aljI(VogZC.S-V!Nߙע@Bh aOCQfr.BCѲsmq}w_\LT ބ 1T1e;EJH0Dh:D:5k]MAԑf.2g9ďX%dQLeQ_fVkH`%$T9v9W@hCh"Azhv#$9bgN3@ ,)&Ӈӟ gj #H&;C3+8rѤik +¿"gUN+ELfy&8*ވԷDW*jXw6-|6m7]AO(XHzt!3⺧Nrb\՛O+A^xo{^[m(4sLp(c/0V-lƇT4pAtZP7ڡ455ㅪdzBИo(C] vNzLx}ǯ@Fga8Ju71D#wĸɝSTycz;e鱃eUprnjO Aب|Y'9 w"TF >OKlqXH*0m`tZݏ 㠉tSwc01غtpb0FS]vNWtN +$hCCA|7ؐó : g +Bo8P@Q%?qHfmRO]Y o%vTq-v[T3BZ\ 'xw Lq&Z1 +x&&Wqj2wƕ}fNe%Gk{SMY^ #T]nfǛ)~Hh%6gnb~BAFIV SG6)d.YLYSv _4B,y=E$W6y +*!1._l};5JPؘ9|)Y7-vOQܨeW+sv"d"G"gO™ b1sF4`;sLжii6*-. +A1f]o +oYb~/$ 7aw xYN cXΣg; "DŽ"y}=L!BV5 b=El*>c>L]D){h} >AF𔧘 ˢ ;>+K W1-Pȁ #+0Zolg0qUnsIvv8~n ,Cz+`Qϖ!v+-3ZOy+/%a5I3'x^͞3Y2넺U\j/P)5]wtZ o}uA^0LT64W Ot +~F= (m5Ba1[\f`f Ϫg)b/kYgZ̐pQgRG6 +,%  +.lsxH܆i!D +)[Qwl"P-m.\1 w%Lxڔ[8"7cy> +LĴ#K dX،7Oi܍-$|%gٻUb3`1hS1;VT`O ҚAm2(Q`\a= ȶNZKDSq&Fu;gnyIq,m-cbq*<ʍ _V͉\V8kD&ZA30&\A s9G $1VǴ+Lm_}eW UgID]`w?One+ >qjg1ALl`;8/"T@EFvzL&tkþh~0CD)ke)Ê=ڂGB#Fɠ2V^g1;1PS+Ζ+'oUںEwhH.۪.n D$@Q[OMdui7+#f$KG+j9E4:Lbٚ(JJ`su\杁e⸠$5lg ; .8 pR /Y悒 tCA)7JjY: ΣhE!ȢUr~&[;k>t8孲$\"ݱmC9o^F\&ݺ;<8 @!)U.9z +@ rVT G;ni}Y\ψ Q'{vI|ߊ<*\׭Tkcp4 _0uS6Ck_u3\KԿeA:PLş%/{d/cr4I6a=NM\JDic#ey [TSI2,ܷ؉Ý)  U{O[EDtkysjϨ!mڹeOn2ӂ;r`;*xzITퟃ4F3rsg8;sZ9ʑq>ǢE'?@g5u.5LS%@2fdggtP,3!NgS' CtE {skMDn}j`h⒃c5lo p-ð+o%-T''ogKti׾۾wZծɍ-ܠ?s>a|i!kǕ:lFGofKx{6q@U1$lG/=QU ?-l#[!ٲ{@lEbBũT$;E>~p&q sk+ޛ*"?mr[( +#o|4mFٰ[}׌NAсÙk4;x@YT8AVa% +Oc?,s{w}i0;,jU 1B3I>]#LҫdMwyLaQ}ɐRd)@97 s z" #AWxr|LD |^L#F')MjݜfǷ #J>O0#I}0Xr) c(!CBʷieSBxF>+lb_@{]`\GYֈ;T1{CQ k7ngݽjLP* bc@ɦn#SdcoF|'*|`lp[ƷjB}(}*f56cH}WhV2jx, >`K=ksإS>~A FWh9q$@RR`V@*ybcK`n(}qY+FtDxj9wKk!"5 Y"pܜi +RJ~253g9F>BCZ8ݏ}t\l0,d 3=K8e<NV2Yԑ5˯aGFj$xn](ĉ ٍ% 3PKA/]j`)!1acK_UM$p D,WJqXtYŽ!1}rPh=|b!]jof0wH@ȧA+JFY|ļ@bVZcKOzkuEm >#.w=Np6h 7X@o+^OcًS7c`әu:wߑ=MNPճ\㮽/M~vEXw(va<%l5OX%1 6XLs-w1bjպdZ2D +|<=t[xGJԤ'k?0HY&r$dd9,p*$w1#=]aZ(WOS-6e(Z2pUv3jF]j^)]؁S7Wͩ{MU@) /fZIV"{Vaci)a,3vœl\KsL&yme n1vo忘!Llղ#1 &| qK&7nN܋}^8t#4S*`J +,`9rV@5Q~k@~dxC|CQBϰIɥGk#g, 1WN ~(Ȇ8GX>(G> %IFq <7ݯ@ {1Ϡ(}9kb>HC۱DSjlʟt侖-*Y͊A"HOñFb觓Եǘm eQ$1Sܫn7A-ZE;ȃҘsr&9Q63ޛ# О|2{΀ؘj2@ +f}+~faoJw m:n s5ݣo!dzU+w~Mx^Wvވ-l6am)-sh>deeDK9/7VC2\~ӍT7.K6l}jrhUyBKqD,U_DU /"m&ačȯUPe l)@X1iWr}'apV+H pH9{H$b⼍?BAi}iԓ\mZ&2 H0]zpZ G'UHK"SšbkZW UN  hW +FUʬ^_K3f9Ek3fx;f~F>K4:S% ${'Ǚ'.yy^6{F-b3-PdyU{Mғp/nNlAաAQ+l|^9JLcYXZWǒ$;J 4>՚rP?yBR=K0 +4;[n[bNWsg\!\cL4t/I0%lTC_cB vW!5'Iub>4MZ2KzPGqUHPevg{̦8Pҵ(9Tu]ւKY*~[nyhڊW4[}PP -,'8TD#!lRXmq@~#3%f*[l4gQ>bO\W nְ')@r ? 0mFξ[!t.3.}XKf`q|i CA%Z1L̥'1 21z öHg2.}ӷ9.۵60#[^0TDrMOeqv}uH!RnK#;&}Vs_~謍M`ֳƢc^(C δ^:m~ =cپ5#xK(&SԊ^P~#*j(6'^&1Oyp_(K9asb"-~=d EKRfߴʶY?"W7,xI?OIaLY 5ܼ'kқ0I)h8(b]K34zv5eO/ endstream endobj 2331 0 obj <> endobj 2332 0 obj <> endobj 2333 0 obj <> endobj 2334 0 obj <> endobj 2325 0 obj <>stream +HW]o}cp}Ӈ6ݨOMQ(f+ +I9|ܡmV ܹJR!Z%E%T7wdջ5Yz{uM +jݬj=*i>+& !W3[Wo_veW]}0|@0dzC[_./`ionn ~V&)х"ecA?fj1?c OB<;Vw҂c,$XLegV(>1c3&}qJ}S^g+K; ]}?`({SuU4e5֘.̗!VAxԝm{3ͣ dpEZUBGocJ?ZU}Ͳ5yi}tg5g7vkP.eݷK*`qٛn2)!Z ROھ߆FєY%SSR}֥t[N B(y +QlM=_?]1E~ljt0 a2HuڴY \@wjW/SaNʢb>z20%0o24ڇ,h@E/n0㒇Rؽ2kC@umz8%5.25<-UK /"Is9pǻۜx M6I0CI2HYοc䌋W̒TY0ƗtZ431înH$W9;-da#t\Tnu +0^Nx0{Za7'`~N#%6Еf)XYRZf/j*B Tw0EqnaP!I`#*[d<Dv!ܪkZPwLMGSBWa}mbNc@BHf2(@_YW! ҘO@ XYVF5k L淆u9ՔjIv_ߌ_IU=: PS=$Jڧں\sjkoc+sPpA!rXV<:9g0K,|&Sf(2 +ѝ^Ro^Z!cGɬCG<8j]jfƜ5Ddd Ch˜bw2]6Zs")hо +uXng9Q^lAw'nsbh VO5:ϑaR`x!%;")uzfQz64*>${oprf@Cӻx^:Ç~ɪ9Cƌc^;!4LEmwk;Riѡ8УǯLK&/퐒Jvt0Svp6*l~q80᜿~4 2E| A)&EDtf0*mŘg/N_ܾZѦ.)X&o~\C<:C) gu4a#XgUΙJDL?]!JQD[\WLAv³H mu3aT~OtZ\*ue+Lh" >I&jm\PXSgMFѠ`uJ=K^A"}{bzhxJb6z;2)PP-" +w%앑MxãI֣`Yv>T 6!3HMBKf_omHH`y@|]v/ !e4 ]a؜bgU=Z%-^{Cu٢A)-TyqaEJ".L< +C:-HOwD,6Ob5J?Ľ3R:@ _w͟F`|+!JaSa()&&5ٽ+r<9ҹzݧ/k]x"ƏINt4iUh%ۮ׋20B5*x;I])Lz_ΫmL@[[뤨]VGJ+IxM6H"ܤu< ã=CȒ+tsv6Va{|8-\#?xP3$iw$A-kKA +s,|4`X5(Y9ꡯ/Ede,j)eL% Ez2a|I/ӝ*IyR(IHPF}f.6 I `9aUWͣ̾=vݜ?r,JՔm*(̏opuDqk%o=ڥb1Fr˜0vD_<茜07sU$85u$/L~8q LLDԄrR y1%"2$ߘ +@0][u?5Q5 I3F%R!YLVPU6}GݳzyYt?ȖHphuȹK̼* K۲ICYbģI˶K}teY_7v7OׇUl-6.R/|#y8Y|/Bg_ھV֊hWQ;IwO +oG endstream endobj 2329 0 obj <>stream +0 Q@&m QZAf:σ t|ق6Ko&eCn vK'/BBF@Z֠7F`m$X*DvM *A,*,̌j+ aoG369#e7[~Lǽi@j/R.7W`@ ["AhfԻ?*BWޏcrI6b`Dwơ< +8 "}x_E ֳٍiRcZV!u"l0kF45gqW1= 8rhIq6X4ncL݋| +X ϩQmnm!矔\>#3t)DO"p YZPp2K7<404cN`~2jbG c>ݬϣ|pF-U,oBlגMQK{ +9Aoۏ&).bQC=sCMr kԶ  xV 6ԅ^2݌;.L/% +U Tһ(7?1Ql&^"CvOe>4]M4qk fl ɜ}]|tilHD{ ƞZe3ɫ&O=ж<㉐o?L70\Ri*F_[=>p`s8@lbDDsxchId.)(#̣S("d?<p:⍸7ߓV *o \3ɢs +j+[sT?Q}2n!å$+r*65":Z #??k{~\5V(C5 +yj"x\ ?05>\FTCY&Ƞ"ǙP``<_vUC`,]T3B_~i!KL9Z*^ 3]ʤL[x900RZ2ȑF;Ko¥|]7=|ASQV.p!A5j[&QG%wJ:\SD =Ɠ^+#-ܚf{=|\P14CI'1+BuǙCoF!EVOHt0"ǐʯ* +G +9r#fY茛do\?% 06rO5vMp.*T[ƍo`+`u Ҧ3HP(SԲ螜:LG%nnO;)_foc&EueQ'wݴ/pWdE'RbkP7zD)ٴlA!Ɓu—2|nf[S#[`pϖI%ֶ[Wtw΢@s(!U+~h%8Qϴi]|e.c4C)  .HCًa*~n|m}gwӅm{9P]~ gK$xfMja1M0VZְdi-򗖁FsJ`$୙nTd pIH'3vA^iƟlV8]ZV4l4]cnɰx̓ ?|QI*-IW'pK?+K4S~Pg: OxݳJRE~~DTr!^Xi³|-8剆PG45+$ᇒ-D `qWAڅ+hmc3@U$euwQ_9q%# 柿 R|0e2hxLvh,;li3{<]4{jȻ;Q/ۄ@kEx\k|[I'{'J!ܶJ4~LЮ+Hsd̄y=o w+i]xgakUf% 1 b9WJu[m,MIuci22 W Ms5(g>+gyUf=ث, a͆#po)IxU'\:ߔvZ[Q9zduL gHHqQiIg}QştOԸxQeհXR-#{)Όm&Y2|]=!G h]_MF-;J6Qř'#@gl)%аyT&Bx>wvzTqO>+^"oichIwpc?[%P6W<Д)3P;ll]1AjQ2t׍싌u ˎxQgj뒔yob|(F&,-..MDǠL'}˜)V4[PUR~@j$KIg 9r>&ɰưб7B+U9~'ۖJ3+aݖg\]|xx8a `òkWoo}ir;'/< +F*H^lk0gTfiRY9q>hl#GAf>iD3ZVb|#nޝègƷ{:70VB88Phz)]OW;@'B@_w+6p[nўJ:$3|HR){K*#ff +H >j'PLy EjV\-jgdGN Ġ_樶E% |XP-ǙcXSw*smYХ=W{y Zv [}30 |D^ut$)Ŕ|\FEO usy@"#70m)e1Dy{q!=/'{~!kW/"0X  –, 'lArEntN +,qaO>=X֌BWM9HStˆ3.a&=z>Qn)hrMcݼ96HFk[de|"ue&M̉{bJo1bkOWťZ-ʦ0:F]nXRҪ[kD3}9HVr '*ApAʢ'u/"[ 7{VPcDf`~С~x^*Jl(F>dYQUu.D9K׍XrqTr֒`9fv3R85?{ap\Sw6Fa3t1wheg8PH{&O9= C#AƟ;cG0nו%2좡j:8b +[f"l!(:cxtvpw% s}@6)r-17K'a7AI:Uܽ>9%`c(C&?Fpp٧tg(v|:*zH]Ĕ9e/FMflZ6 u~(HMq"?4x7W8Z4VbIT[Z[\ gRQU*~6SPLjr-=m Qz1z͕[U%ÌÞ{%6elhi` +hm{ר}nrx8Lͱ&YQ$CUxŴؕ>̔dߜ>z2qGwmڴ_āeDI.6\C5ћU{|0AI:jaX2dC{$aq I} &P v׽|ƈJ}Ruufq;ʌυ%k,;eS)NOy=*;X %94Ma}I48&9 +H`b@'x๩ +$ wpr<6AiM#) `лut|H$ʱ؁>>f:6vq1-\r:kYז?"DfUQ<RSk5&|@IۘƪwKo\lԹ{Z |R*I!Wؔw5d\ȂC ȋҶqRWķ$px0C18!r!6{͑{{gs±xH+O3u7ZkīE%1zuN+Do<+3@*N|nz<BH~G򲠞?9j"Z z3w1GqzxJ-NneZl‚EJϹ7?*F߂}58FU޳$sHPȧOW4T?Oʤ&teX5)H{2,~RS-A6ЍǠu3էGhLG3IրTF|Ǭ$<ءH=x(^жrZYMǁI5| +poN5  ^g4\O/޼EcyX4{}yʐRҕ ߰+Ϗ}kZX<ɠ̿Gn`]>nΒNGj7J2I*>ߛ\JzLr PL2;۹kϠug@l CgG?]Kz3fu- +Dj=:::+IZo-U"P+1P}(*t;aZ|_ +hSJcT4㈪Xܰ鳙z4c^h6u ,E*o-:tSV"1ET +҈\jR c^-' K^ 'I_2#Rʟ +L<2k&^28P˥떯N#l4bWj+L0ّՋ{O {M3]'TKGg Z,;DJ\nBي?NKX"IEk嚁ǜrJDL FzԮ0W KWG؃0a}lټg󷾍PFa>XW92lHWm#21{ +[?e?d݋TФxRݻ[;wxu)9G4֋qܽgک~Ҟ%?:g/=%=AnefCc mhɆpb+9>nPб/`|5k>FZR!͊%{ Ei6-s#L9ߋ;:U}娳([OmZy;]_^wL)O۽Vj&% *=Eީi +!+8n%P& XA/O:e1Ʒ2 +IXDC0œu.al Ye.=XO2ֿW*);`bauȉa_7c.pԑE5\|2D ~4#-8`:#LܗTu|,^#`8B9=,IIᳮ |X JSIA!#JЯ>\}ƃpO-"y7]?tqJEY~P<=|JFt?КdC_Tj lsf6 q)"gņM} 'nK &EyIoY7$Uf^"슛lVݮ\,‡|Hpq=6}'C2cwwqZaU>1XkfIP"]Ƅ񻗙h9\Lm&:y#Nr^qHK4t)? Fa%74/_,?sCh'@o(|Gݯ)Njs :5P,?n/RcV}3dQ~.8`_duTRMlzAm^f| bnl{;I +`H5+ +V.Lt/\`\@ 3p 7OmR/S)&w@`8PG 2mJu'E.~'U|d^0 h,ެ'ˠ`muל$,?Yɰ@fgEYE`JbgZ涟3XmU Lf~(3] + 9ux`NnmޏjA;sp!-E:Y!?뗇HZ1f}@}:Ī +[GkeA"d=&P`qS>Vh7bnC<6C +A"=D^us)~$ Ŝg|[ N>of fJĮ⎥y Dsgm FF2vC;vهy Q#EY 9.vwiM \+\Rs*&o%8qClӌU:>? $6]ߍkN ge-e!xkGK[P&pI u7 +l',w/g + dS;#=b(CµŘrFX|5V/a ˞ +Gm5QJ:t0mb1 z~ɃXϔ$UӿU\)g_'􅁴^8?_z2&$~6KLvDټk0AjPP|#^š(FCChBӌc8-1Jb@a!Ajf]MY6Y}]ok4)R ϗQǝvK*C-Io ˢ#΁J:J^ٜHbgPEٝ 82\ִUcT*73Hш=Lk񟷈4(i8h$_m^(ܱ~ѪR 8fB}l驺eW$3ܪ0۔V 7LC:n A¶QUiVw|hAV;SNN8F3ؾpb؃aL6_W[x=o0tx>0;vK[Q[cI 'Ox60&aCW:$cI +[݆+j5sq[/]@OLᶷnGr2Zl C_6iӝKޟNAِ,B E%{tz9jv"&t)H)'{v񖂲VZzojZI|?j]l %;ȕ]1Av`it,_{,z+.Sf~afNNvuz|{_-V#3Y*g4)Is3KfߧTmNn0%`/5JdI¯){T 'P֛43M\ P?_11J+EȲTabd zd3Tm}6H?lQ`z39.2`7fTv(m~.me{E$#Oy8i&PWVhxa3B -!Sſ҂ӇtG^%?>IYF!$UHۡhhClZ;"5SLQЄVJiH s ߇H%S7GOB8qF+P MKP`ʭIZ-'O@8KUww63C[oAmul'^" WZ]X!nl+ +is//n;Fǫz`CɦTëJ#%-ngitEi$EKlN{2 3j0x>MGG9RxZ;=Yi7XphaS +|N0NIp}Cd$IjaI7N@1[˼fF ܤ} ~*l)^)w|m`5*lioCI@gƓ<hI^WfiR*DFV:Tm{mϡh 8٥m} ^W;m1P+}T̥WaGXy"LZ |CFC@IÙ7;C-ߡq(#SF3'f=sJ"T S N.LDlE.cR%Qw-O59o:23 ?)-sxuwnC&gM!d LHy VM ;G;oTΧɬshN_D{^~^mnF0+w}ܽbr@ZΖ:r-{8B`h8!/CmjV`[x.u;x+-qiޜd+W)g; _i oKOj `!4," 9Y&u,W@8Rfbc 0z#];5eՔ/!z)fi[:݃TIi!47v4> +nZsJC@Rz>/ƚ_uVG0P%B-B;"ԓHeQu +&D)YVj% \ 0^T1]ū@-[Gvݻ& )5eaždWFԒU^Dupa/FlM] +`UP5@>S>GFcM N廓wwN1f.Cs]$nO:XeܚZ&E݇(O뮄&&|ij@(Joϗ +γ,E)/5F4K}L Zƾ_ԥN|ʝ{#>c  #E:}E$ԢՎnR~f@t?;+Ig@13#h Xc/#j %6u"N&fJ!ichglNnKKX>k nax$xwMY}#ʷ>/L o nyڟ*28:H!=+WIbŢؠBtۢ7N6$>;u'_PϪ9x͓#j<\Vssf$nl7 +069_M $c.+Dʞ>#{ 0^*:gFH[K +Qay-Zsm=(~|<1idME)MS7sC_˭E4D)1*dZLnS54/rC +^ _h̔ {.tn}Y0p=ق.r-0h':=H#,a9Ә_A2߲ #-N;X|tFxp7^3exmb ܛ.SNBK) .^A04ۣg +I-seH[/5dgƇ3}XqUbRk"pb܎nI mpdo$Ӫ0םꨵ]+ +Dj!=>x5Oݑgq rvbI27)f)q7klfVLKX/EIxH q5{^@Տ0HTΰ z +CyuG1:wc(6ryryp~@vaL/a5#6>p߈^/+\8;i +j=FrnfptU>xKKsi9Bao2Й']3ȝv5Mz$urn/vfd+A$JW8K# !5]:\g-1* +`=bli6&t(]?0yOk4˽50sypX3Sj:^&zy^8>G4N*]2DJG ws%Y{6 3xKd˲zMB&ȗ`"*{Ijb9Ēj"\(V+:;^31Nu>ᑫZ8j<$>!ZN zuOKc6ֽk/N_Dv;N*gP+5v~ Ӯ +H-I$mρWo;Tə*N!iF@tޝ\Aq"-} d/ëj/ꏩw><{P8#/kx@F>?uNKK"HP7_7٣a + L(`f:ỪM/u[>X'{Eb0pߔ,Dpߵ+}oUPQ[\k<]榛p.Lb:/Ġur^G +] 8$#g(:_R≚mzIiIGjL誝0 pr:ӜhݐVb{u5?ܡ*'u :2@6@b{ Cl[ٔX +ڢ?$*Q^A,+l`=j(靌(R,urvnv}պP-яG Y/V%4HyY 9שv޿T\VoH_m7(ŖxV/F )ٚNB +(bM>ÛWn-Pvsℓ"p[pƤ$LBg3?eN(ɰ*\r9MG#o^P*bF,gs&:;O#fu#8/^ +]J Qzh!V/g'9ʂU>ԟ/٤cXE%!%_CPơ%,ַ0`kl4I +An$ܣA1 pC6zC*`- 5o~}/`}da(ڭii$cS=m(XR[Nm0}4CVX뾿vBUIBz/a⚻nd9wAO ++.w,*#(H>qƦ?0&6 -#3$=muRZ/#m09ؑ%,_xUT[:5w 'v|Iu6ga9lTg0 k߁Խă^ьwITW^ܩfx>)fҤhzyUR4/?wۊa _@ArkI*9fIy˷y RSeAD4ƵF׭0E̡=5t2|L^;޽zu Aj2He,]r:CH {x^aW"r'MFLZ_yn^=dle G +(\@E:ʒem0?ԾcE |c9bOhm#H+/ֳAl H4˶* +m{Њkvޟ +"B%`|?R}=O֠?< ~ ak=93JwFt &hc{8 !E^y~Fޒ21aE>Gy'%M*b[&N!ksfoP!"۵ŕ,爀y2@aHAVSoO(Q<|;jьjZP(]fHYnԗݩtG\yqGj(kwYxd3uۡ*Ah84 MPuK(Mi{.Uv]gةkv=fcEL!M^N?h|gnCye O8KWbҡ +]xk8yEß(52ԸM1Mf2M'f!DWY&O;dwm#JGv[퓘qi~x"AԏUmtrؤv"O8=6[;&H|Xv5@Ǔ:eCHxSx'^#C@Kl{@/ܛGN~8i^W; =>$yE_X ޓS9'n9@sK"unp@zu Y6*}>l.^~K -aV2 : 1B1,jg+š9 06쑄Vb¿YF"7ռX*CKwrp䨣M#6(C;9AJe_h GTaDScnd’>>H}=V2 +{ǁng<(Z I鵫Fۇ"|Y8JJhzGGc[a^/iq[SV$.DmR=;ٌDRaZzp>yWy Gz8[*>|~j5ز;d߰?$ v]L ǔFqUW& Ē;,g%܌ŬI)KbU ^$'Yn}/t$e9h)h\H25X@e rLF^rͰGS9͗ȷ%yğv4:Ւ 怠p:ƒD>zA 5iݬ5c]lUl1 }+( %)A@@3n\RFGյndp$\aɡ \a*L" +uNFp +P c9nހl"ŊOY]Di)T)M4B7ra6-nw509J¦'/.Fh†MtF +.=̺dEV3B(\xXiф1(kifKHSo/4fi@Eb2␗-`<Oٌ56@㶇 TUP!QYV%E.~"nݓj9'DKEk]/$qxw*4wRLA_ Ne݈3xz3wv~4WTc䉅YLm_ rjRLS4{j:o!gEU%%r%ŢБ~,ڷdq@7b ɚ?6̆m˝0ȣ0(Xsq78>2w_Yĉ9$2AOU je*>D),zx;j Ux rYBϼuHʢdkA]'O/ cGrbS||pZsYJI9#doҘlO8j 7ש #wP|.4$ܺw%,}.aPRa1ٝflYi!L:G\3YM8鈮\ç[;wPhKtk%x[(HxߨBwΤ+)EbA>ؙ>pxoW{sƧ=cNcL‘؆Mk}FVi B(u&'.2ث:OKA|HSOe"y -,ͣ"DzeYl(P+\W)N6lCmK7djdݷr[VR=νSPڸ bO8vpUu](#MU<~U0 w05ڙti C){Њ0+&lm`ET_!~^S$A9ef #i!GAIHh: 2ksuP҄ v;GP"Fg&rX(45/PԧC3^?M$L`jPu ArSqZ%6hV&3z!nnd(ڊ[O[°sי>PIEBkO~7u]AQ'<,_'` _x:;Uj_ێ -35 +Mg~+=;Tf>&7t~ڍ S[ZBuv)bǍjæ3o*us+|TƢ 4/œxsQhCee 9M5>KR 7hEK*FB]i/9fmaDpnf:6 ,M7=E1r6c?98]cSp{_^cGjtwo&i!aphԭN]nR[, od*_?1zWo$dӦqH/CÓde/8nxo^g%Lty- +.s߂Ps򕋷x+ +N,f,G:DD2^pZItqY*\}*+Rxb?/3]eϼ&6Bb_WGpdJh[Bf~~egln=~HϺc;(t?<תuw`{($h;~/ώH v6^Hig?#u3R'}[F'Y@]wcxPy-| 1u~~u`Z7@< +gVY1p8 +[qLb큌s_N~P㍑n΃{3M^S4m7٥p?}^l +yEkIgBHp-S dA9Qg5?&I[hŶ3aB +?,#IV^p؇@`cvNj&-Nu4ȰZ[l@W!n~Q9/5V'߱_sl{cw"V `Yt (#ͧ]2ZcY'psiF$õ|V":l_2#Ϳ5=>d\? /K" A:^;!IPQΊ]y['o}[4]| 6(%Vc̚D9.QgT*jFĀV+a: @9'3fb K2O?couJek:Nh]UܕCG"- #4 ~Z Fnf7ZS ȀY8rI%xe;4(_^cb~O'!dN„nt(,1-hWiV҇ޝ@ \V0l,i`c.jֻ`5 +">x-II'u(UG},rC*-_]sBkbObԹ#w Cv"[RǀU|#8 h\6kTDC^^7f VCtGl4̞2\eNT(nj<{5]_*Ԝ-Mhˆ!:Guֲ)Cw$%tЋ b+oc!M \/^ރcSӆ^2]@Р&MoJ.DJ6add7FYa=: ,˱xk +b)t넧Y`G63Y>`afOtR0t6'*z= +p}d) J IsDHPN#j:QoI~Uz fR5:%ȝ&7!bu!MQ72g?r.jpu6YS$,86{!eSY@|D1Yyy<5*g)x/*dȑ`={ oh;Ik-v@-긛I yjUz^|E /([;P{s`k0/ Ÿ?w]P;ܙZNSڜJTu -AzE_zA8_Df ӢzEduԄN[Wǂ4q[4ttܥ;Ӎw[(-m/mY=.IŜ{0< +1'̶F*Uc& `=b}!xаKp;f "iQ!^xa1kiO=/T;*AOiN}n`x0SL9)'ͼq"E{_-I @wxo/]qp$ +,XcuO.xӂ`[Դzp8cu^Ifm+^g}B9gV؟ P(kh ͮiI&a~+2<,rCxi +5e&9-MKg]sI"9[ylBbS nFS'J.ԟDjR] ߸e=O fQLX(C.t @4no `k\CR Ń Z'bt-)lqRh:iV`g1\?a@|W'D'^~͎ f'e7k~M` -$:[bT" +BW|}p"\uX’`cO`$w]P’?DgCFm^8ڦCEV! L\ +׶vB=B))i% /m~>:FH>_'GK[r D-7yl1T \CDn%lq3 ;85'K| ᦽ!\YB̦ú%Fza,#J"ڮ!nx7ZBIAۆu"p9ezO:y~>x~2; eCɭ mQTjUqmA7O$*"RU8dS' fސ | E2()u&HxW(s٭tGWr>(j Dkw?"!8YHcqCYHֺbt}?Cwg2g={<;E5MetCR677]'hʣF&Uvp^~8%c"եGJ[ 芗ǸQjG +޺;WS'ӓ ԝCRo4fV>8.D598M'dA Ea񞒏+1jsyZNWi.Cu\ +* "gF%4':T'h q22}o͡D;JƎF5 +c0i4IG52zdhOձg5H8x 2^ R4& YET9ױF vy Hr~>_Qq a ބl"Gut#i>sA0}O/Svkl%u/_8w,rBCc`rbzຽ|'w&XciRuItS0>L[qbNHaKc(6ОOFp9r|KVrC+=RŸ2Ci+8@4 v"H'}ҟcyb?ێXWV4I<֓S\Y=]+1-SA#@W#ݻL_8" iT^KK4n?>fƇuLe] 1pĚkNA~_Zś +ra^6Gn6+}>4ڒd>gN3AѢ!) +Qo;OWRWٮɛ!q a[Q7#Af@ hP(5\7v1ΓaC\|!p+s@gd}  +@lhlHi6'> P +ri}d(G_ +%)׏X̹k&aB{+Oy" pߤnh{kt[f8f6Ϸq w#xAq7{41Q ~)&2 vtҚ]:k=m7@&]uC4Ԅq+ʆńfS8) a#'+P'1-\f"xi鐏wsҢ6\~NTJ8o{FKw[ZTvmP&yS|'~|qjᾥoE5--@-/ +V"!RкQmKyojl%Tyt\m{:Q%R/`.7kP9IA +L Q> endobj 2327 0 obj <> endobj 2328 0 obj <> endobj 2320 0 obj <>stream +HW[oF~c_ @㴋ؗDIܥD-ETCc̙6Jo,b!,V_)ЂڅPPzs\jr9V0K},T|+|hTÇ/M!9_,ᛔ Sjfa +>]cduL~Z\nDnzέ/P$-VBXE%-XH* +v{{+|C=%D8<xYA?nʾdzg.uv}:0Jј^;"C+W2_*CBCTQ,&j j#;Èhp38`]a<^cn8Mnn1;TB8Sylv9޿{PO CHp_/M[O 0/'ѴP[ +/fͦ-S: tC ,3QBn +yR=J(ߎ˦>V)#bv^bQQCN0:Qn7g&X!hL$%Uɂpus*_刬fQlhDe`\  j9ȿjkY03}{ Օ>0fUvWMBVbSMIyUʴ(@-8flnkeԵj,;iL L7t1 .<3|`qeW9 @`7H0@S9SnH>]"uUyr &yFx!S%pt[!y 5p׏_^3|.f\+ϐgLw0 Ѹ`70H )4 -?@st`_%$'ݥ(QR~/arcq~F1X(j܃21K`6yH 1Ϝz'!$5z#&dT[h]TJ'cSKcP$2ȨPsa:b>FM_w_f4x}^=6s{Ҩ73/Ѻ\yL?DޠU!jлd %sSuBhöZ>K"dN:MB+;!"J/m}D`yYx*.Dmxgh+o[-;zğw$]SjE0ڐLP5Dg;mP"pcNъv3͜ >f@c9,j> !UTZuUMs q>ݵ\<56^JTؑ|!ĉֳ$x/ `J %!c&^DUwA\༨|r@}|H }lx͸N5 ߷a6ۮkh xRqMy]N='M}-\vՔG#`o@jLdnV,N$/D) +[N9)G;>W!+ db8|Bʲu6d=<2+{MJ<*K)ܙb //zɔ c邟O%}u<_wGsP=}2> bTB6쑧 xM15 ?@Ә~L.ïϰIfO)BQe*} F0Ti}s Oh!6{qXa #0AqȨvb067J>u+Bo"YǺ˚68H.!)().^mח gY UXU8ljtB@QRۄi D/c?,Qt:u,8DPj9NJ2Q)JMK-JKF +BKCHY/}(@4 endstream endobj 2324 0 obj <>stream +0 M@&Q Mh0uR7&+ >K8Z» zߍcOn3ބ$7< [16;H1gn6j&Y `I:}N5}D7,L˓jShFΧe`6‹Y̬=iA|}i%m.ˤx1@=4%>MP>lsNkF}kg7R8 nu33`FK:D mvS)>Q5]?+aQ}Q8#6|:}#Qʅ80)=93rVInd,?H +ZͻjwwH5!%6&l$ᝈ +i2^_Ql08R_ԚTͰq ݢ>#:AXQl\ԇ?nuy>ΡYW8xX\鶞d+ªٯܔGd/ECA|+;<" HzY MGeR}}``6c$#3cM3L s4{̑#}G Ϯ=;_-AV!'c[қ<*$HDT'#_UE6rVR:umFbGħ}bNK`]_h]ڴ| ӷW; +xA֔2hx4=T8U?8ķ-^¥nى+v/Ȟ,PMS yNS,}Wu`wA(Ki*eX3bz.3hav}Nca*<VVu>(,y9b'={5*9&{=>cJ9|%DŽ _E&dŐ7eS[įŪ])J<8dv5Kh|˄ !NP0(!tlԜ]CC6Ū.-6M3lq"XK3L xUi/iR~%}Oy_dКN{ +[ n^C~d=W/S6$c,nN ޹MpT:vJqM⒣-B,|AQ1ͦ3|H$B|;%j 5g1{WG?+`uO8~aq0dB̄Zp*ҪlvPJuqd5\]1Vr|u1~cqTfF64i7, >ε|k+1CF\YEY $:Jˊ}~|T7/^PQyn(oۚS+2f˦xvSAރv,S oD3MQl"(T$k׃TN*=RSaJ#'_lFRǩvXDCItS#$p3Ҡdu*Oo'3K#ŌtFuYy54H yH%71Cd#EhOM,_B$ b{'[GSR- dz'u3zj+pWKNY&}bhwC3wh`"w>iLʧxhE!>Тw͕^aYV;KL6EYDAwjpIگAǾÊZ_J bٛ[gjhS@~qiaI+kK,~ 3@xBi?&á#]>27ސ=p + +IoK~d_rmHE9?Ԍ=hhDŽd + 0N!X# w-S0%c}H/[j/ܳ~o>)L ' f7_[.>--\HC>rsOwf\S8- ı#XE ( c3`)_ha=KDpO,d* Ćh@'>RcxWˡM7fktZ1f@0i^+{4f֖_mZ嚽Ȝ6{ϰ3aCf"8Mt9P%]:iHEc[Ge/{CHq" hy8$$Rm?2OU_TCEurrVnA  $tad(w9?$z>$ܿb_ibX; [dS-'PT7f Az`FkQ,fojAv.`cE*mxcc'%azܷjdsnk{`8L;Zۛ=!A1`,0v Ȳfߙ<;#~Nv~\>JXS~2Kzqo7?D.J(\"vzd>+\ȴDv5c:LG_5?9|mh7X|/kmk +ԻFMU<{؇c ʳ@KO[n*@BiARJP{X tu!WG^&P9al<.4{N_; LNʠ,+3c:bCK(ƀQ} 0p,>f0߱=.Up%сZ%2&3%4_=cG+:j%})j`))ml(a=#m!(o?^>s-jsڠQҺ,T[vFYf'٩.5n4X8 iImipksX6ϥ}(-+y|8J%6L怭X)OHe7wȂFz% G=|!QpAҡX4'fD+q V31"kk35##1rfs,ma?2z&-~=u@߽]AaL#<\⥪g%B_*c O¬3H?jTM% 7*w*J(^_wY,Z4nH$_Y{/wFͽ|?_ |JTB(@ }ˡ%.`YiD< +\\E(a,؇`mQf:Z^- 78F~a-tF$}5EvD +Z9X˃m>@he{b=#A&VLK~cIYV$ dfMJi,ǣVďramIWsW랗wvƈQ}6.h*y%?s;FP6E]>&Vj`](ʑ +5XsU)}E D/USaorvƗg+`Hd÷m+ vګFNs-Q lƕt4w+Z ,f{ "_.޿ɸ}גfu_x| BUѐVPIv,rqD@RKh{PZɡzLt֪M,BǢ'_̊hHۑ1T[3k>Q7vv[c SZCA`jQ%4}Fq2Fީ};[daԹUs*~~4DP-Ay-'N߯?5i^coE.׬K?Y013q "hA_iZACn\8FII\/@ {,p{P cL rL7{ 嗤GQSb r/`EOȨ!w)lInM5x7ƅWh]l ~\*(>5)'il&zt{- s|Rq+ֻ- L5g1䦯 l|ϒQ0?R֕)7l:Y+_4% ]@?FQ:Va**=*( $H*=]M箠htjE%]m}6IUϸV2crṷ!A-/摎xaV.,=Sʫ փ1=هPQX +TZtF`49_::F1XŲ>8r%[^>>r<1R6/{)+k.t.+Şsv| GWJZKي&IW= za'Hu ?7v 7 gS;H1|QwcĔ!4)3- SYpΥ}i9v^ܗ,geνP*ѝ$S}[4q,lZ':裌 : J K>{r"}1ҋR&`aIc˰dCD4$>lߚC'=Sje"3kG) WY\S,R`Q( + +PL:;{Rme$#AQA{װ֖ihiYH/WXli!cu +?ax`6&פ Ce jGT dW=Hw$܎2nE3E[Y ޮz %L:L TK [",M +fc%5dW sY;00vn ?)l%rIBTpGF›7X-Tl0"+1"k(mVO[TmM!V~(j/wRDPI,sռe$u)kuރ3MHY*ԯQ/jIq'[%``(CDViyլ%X$@i`l'5ϝ#M{6v?&3?{ur{$pNf-뚨,3R~]"rvce8c};X#f`ݚ5>Ty{(` gX|i`U¿B~QeQ0/Mژ%^]#I)|1_[K^֮! `O΂i*Kq{' "wg$sq"발P[ĆdZ xC߼nJgQc(аfR?Z#ˁ>CLg$) b*rE&Ê:Xu64E+zi8Oh=M. +QNd_@zpb}PUjw;d=7C{+,7/Om9'l9C̻;B N5)Xa*Q^,@+ Bq}ѩs1;4c>-U٘I 3D'br70]UsbU#9 > ~#"F ^B:]mlv'`2ݎTwՇAl;õi!; $yZg~1ѩʿ2v֔'HZ/]sO|<]SQyt&ȤOUd -³ڦs8?3HPi17Lp:L{o#RNw' ~9@#(>oBAYW]fS yzjȇe/@oB]MKp+OQ^]u؛Ht#'bh<%yr$ :蒥q~Rfw/&L?ZЇqF,g2j?yIGtŒ6J,ë6O[1S.jerz%_穇  &O6%Ӥ4/}% 7  NKxh/ 8zX6"+&/:NmxMpGP3; +B]E N#[%q0v)d_o5z%ra _Re@ O jm']x 7p*SŇ%2~& xv^Ch}(uR|g1Q9=HeM2kV1܉NjxDzO= ϏQ-85} R(ѽHF[t[# ]MMNJC rwꇘWcϋ,?/24_)Ji,Z 9rȿZs9{Ѹ`.ˠGn$I,O@ ZkRL1nlPᇈ>քtQ֞)>Qddf'ǐz0̱ s(ulvgj?r4pQVB_gw۪ydT-&N@BU1ZVT +g𶍚r&q\CvI|? &^n?'g!Xg #ƹ^@W0FO϶ +zY|xM _ +ZØ`(U+%Q2b4'pB8SZ3͆6瑮RFMZۨ 1 R?H~'~h(\/GgY *(6ɟU_9\FX©v0@ \˦vY[VOJo'Rx#/̷(49rD$$t\,p2r.yjM\IV ; 5jR}F bK[Ȅ$)!]KΪ`'iόb( ϙ"FvS"ھɧcm9{iI-S3X2rAHJ^GuA53yͷT9aZK!_zd72dz EQ8b+)zy)Og&f\h6'J)iE`-MH8s GP|8#W&) Jv +w$xR5 7ؼŘLsp{0Wd8*!p#Y!,XH*9R< 5#>e<{D9+39jF 5UX{4!x^FW{Dߕ3v/] 4ޕHCo-Vxاg5Y/vvC@;HH%HBl"rT%%PωBW\ +jCsQRD<\p[!iF n!pXЇS[%.4+]kyУ$7?F]QCkk"&BS-0OX%XLF{`1<.OZE'Q"p];;裉=׵q $8܁wؒ㷙W+t˕a2ϯ0rIcH~c )h\VA1.h@\PӛHu_Favg-ZHn]*zs 1z'q)rs<@CHedUjbx{r#VkӰŝN}OIQQze"%δ6 0;_ƹ69("C$\}7%6GeEu0d;(S- C^:kJLP%A:,y.25Rk#rCpA4q^sia%Q_-Fࣔ-TRfܰqzܲ\##D.K%(DO)S7K]Ѷ^Wuq|Ibo*W~-a(>&Iq2Q[eǦ|x lt<&?oW6/~Y`uȓT2Q|(A;a2s: }'2B##pZLsm*Dw kL"8ɖ.ڜYZEOfr!U7d=L2r|?FXvopuX:KX.rV1&u.khXڕJK>hD;K9QǛKuAx %=6 ҐYv܃KuHr^J,#V\y嶭Z-rL\q!QR +T@`K39j^}fs>?BAh{mWcV EnHojbD`LiNj?Eſ^?#O@ZJ9 aBH ׻bxmK$1u,?BR\#f#$8WW@gYBƧXBeuZQؽ8%O`04jY rqUp!lݠ1SxH +SXRw^o04sfivMMJ [Vg,M H9cY_@sJ' tJ*:#RD"s@_;&.밦&B4d*Ȝ$o۠R@b遆[%(+'Ĕ[oR'k0npvr\e,>c[X +BQ_Md>IXatԣ冣]A=_^˗ @ܪG\x1USH̬U}t^y + Osk% buW{^FK #'Z_ŸFt$O!t9ՙ8A0< KC 1J6%~nٍLj 'h0éD(v}@}+=uHȗ\:2@XAoyOa% 5ěp+FhKd(vq[ZCa# +)NưPNcc<wn4&4iN+‘[]MxGzĸ*ezlr5g0v]S¸gbIv>&yWF*B 9ҴVR|_|MU>g܌|nޓa'D̕ũ3.9F'&–Q+ 6|xs3bu6 F;@:1sם0^WӠZU%Qz&[df,^C1N)J_qB 2f&"+ cR%nt-,IG3^|v1һgrZ<&-"91olq'mh2_]AvZD Z Cb˥'hJ)yE'*?<n<)rCI(3TH fZcñSBiceԩ$>w>J$*H|&_6H=A9#m^A͇T.O1bٺ<swO1Qr)OŞEA|%tT+5L@C5*Bec'1{5hOT&/N#g!^-5s۹ c5jŤSчĊ.J@$ӚXѩtW=hG6,i +\TP +m& 16lɭ"eW:Nkyv6Obrq0V]e]>^B4BW(T +3N'"ʪZ(&/]kj* 4k8z1sH@Ů9'ܯL |T5υ<2NT[Xb~X8 h|̮0z]qk;St ȶ/3U.[Ruh!va* BFI*MhE_}Yi =cBQZ,VU<5{)'R7Otroɦl?S̔=8"{~3>mHK,n|s=k&  +pkwAQ!,^绔*ɟf&^+$GW2K&@e[SH¡PP]eEվaHHZld}FGG%[ۥٽRћϲ!PMd`d09"3{4.W8 +uկ}fNgFH;|uNu/k<"6aY5v!aE5hҧgioNV,:lĶŕ~0Ƌd&xSD̹G8V['%+n |1Sl:jK'p?d]H8]W[3`dF"hٓVK!-X4.^YL \Gq5l?fi"7i#xBr/%)GGJE4+E1D ֆՉEM.tW^;#u +CL+o\q0cp MtIUx88V͗J^? ^lm䣊%d-A9$nKtM\MI 㲻8h3/Qce. +&?g>@ycSt뎽kbʏTA%&w]AhJK=X9V_cumo1'Gd1ι'-[Z:aiaaU Kюjڦ**S,GzPsTH6ҒL_K//8٤ >&G^5-irz\-,K!@(6G*2!VJs? Q; R8 /S% +驻*em"EԬyP@z{ّ$&G ?XZ[K*G +``rx sk#œl9r^$_ZpDs?R5ל۩V~ajJU Sg+J'$ϣz< 2KPm~*aSohfv ]>ZW}e21z)SWC_D(z1GiV>Lї[:e!`U,UBI*olƨ\0rғ*?~aVjRBH%(F(Vkwl(z"zLnqs}- Y v.3>6"'8 1S9^_L.81pZe,>w G1wȵ}缆 {qx`aQ/xi c>5 jl w2IES[hLG(z 6ƒcʉsa-+X!:ort1C4-Dc<(=j,2ӟ_&0Զ@}UÚ\@a E"R{|1I{+#}Mzՙu鈪'Is=e+-'ġ7I/?f$@.k7.3|J$tW^] +:4IEIy3#z.VANzG%[2= [6"! +I9M kI;+Cd>Fр)*(7֣rE9NQK#KÁap3!*(`cҬ#`s3![$VOp`hAIŃ{NP\EοR q9ïQ}qzDxXXm],9%,v:/?|vp_iAqzW7~9?1Ƶ"L%ٳ]f+12k)XFf4xGEFc'[HD4QDIwQ:l5K4%lsVtm-">;b \0s @3OiZ)zƺ8':V;*yB!BI^nӉfƽ >?=Լs7|ABL ThKy + .ؤubrMu;uqEy:a:g&ӧe< )xA PaCw I_Lִqܧ)i &6݅%`kTR(BDߗb@lU>ÂNPg4N*ŜB1.ڣ +F+5<;LC$CpRk5L{cm6PD"q.ӽ 7IOEX[ǦQ9%)b=b {,9mx^0-a} +}Sy V"LAņj[KPzInu3w @t)_Y9aeK; E!h >zeL(x*:1H` ),ҝ*pY67CNz4 +/#Ž5-<`j,]rRfbv0y $_ hVrfO'N\ y(kΥ" yv4lY,t2z>T^EďyX{RIē^.T(#A6ў꘷fEC:wӂA\ńMrDEyMWBzguNnoGjB.!)g$Ƙr2>0g싃U3+ylנMv8h!C26Rn^+N^؟u 3@tDpz9Rp$eyPI'lw^DďvOwCDӎ.uu#Qa +ݯ>pD~a(Sa'BBpSn4( ^̀pSgDw٠ t\f hA +D KږQĹ=7Pٿps2jÂJpW퉫r$v4SjjCL춱 + TՓ{-hTcP!sEoMa٧g@@ /ܜ~+Qc mP;*?ИE' lMi%=>' t:(_$TȰc>`db\~))WJ$t[NNb#/q_ۤ[Ӛ^%rQQ , m @&(S*C.NSX hhĚh +pMUFXqDܾجq70|O"iӼK Zk'TՉp",eXIu%nqv+o-0`]hgRu"i|gJ>kPR!Ck]فo_hy6t1@"homkI:83m۷HF*ySzJDHdYqusM!cͣJe·lg0O1 pN?(tчjZ[SxB7#FcZ>Tl榾P[-& v ^' իKl:5vO57o`pY+m?RAp C/A;lo+ࢉr;LE/tNJi|bɇYo0vooK&'[wNK/Gim`b40o[5wx3D o*tdsUKRjg{{<xw0w N*N +$d =mm09 F |b@\ԁN/ysw:A2vbeq.P4!i`;>g$ķzb썥2C('o4ijŒ aArpX]n֠Kv~Z5mFыN)`ҕTcUt $3OmY'}n +*8_FtO@-h,۴ endstream endobj 2321 0 obj <> endobj 2322 0 obj <> endobj 2323 0 obj <> endobj 4897 0 obj <>stream +Hd͊zy8 +>sRhF^#y QG#Oç==o/ϧ;c_mӷKv|~_oo~y>}~W=|z>{O݇q~?>Ï?o+~ߒ~;%zΏx߽w;>lp?(O?{wٸ^ PZUuTGu^5P5FjFDMԤU PjVjUmFmک]uPuNNE]E5|| _#_k55|| _#_k55|| _#_k55|| _#_k5Z||-_+_kZ||-_+_kZ||-_+_kZ||-_+_ku:||_'_uu:||_'_uu:||_'_uu:||_'_uz||=_/_z||=_/_z||=_/_z||=_/_ || ߀o77 || ߀o77 || ߀o77 || ߀o77 KG#(~? +?G#(~? +?G#(~? +?G#(~? +?z $߄o77MM&|| $߄o77MM&|| $߄o77MM&|| $߄o77MM&||3,ߌo77f||3,ߌo77f||3,ߌo77f||3,ߌo77f|| "߂oȷ[--|| "߂oȷ[--|| "߂oȷ[--|| "߂oȷ[--||+*ߊoŷʷ[V||+*ߊoŷʷ[V||+*ߊoŷʷ[V||+*ߊoŷʷ[V|| &߆o÷ɷmm6|| &߆o÷ɷmm6|| &߆o÷ɷmm6|| &߆o÷ɷmm6|ۯ\t;]~~߅ww;]~~߅ww;]~~߅ww;]~~߅w߁w;;|C߁w;;|C߁w;;|C߁w;;|C߉w;;NN|'S߉w;;NN|'S߉w;;NN|'S߉w;;NN|'S ߅w]..|K ߅w]..|K ߅w]..|K ߅w]..|?|x>stream +HWmo~ߚ>zߗlb;P(ӞIw6$OvmrvwfesA(4#lݟ6/_HiEo.1_,N*)cD奘w_=lH\Z tIB\@Kќ=9! @Ր|v%+r%H1i;/B7;ӎkP{۹ƅ"ֶgAh!Fay0!uG;oB?*ۧCJ,)۠ 1eݳbKsːj!^[+nU%w@Tm!9SPBܸ` /LDd+I=GciehɄ[*}h-_hjբ]<˔*ԾBSܽ1w1e +|!P㭕Rswl:9٪bgM +KUG),t0O.O>,- o%͉V.ehK_uE^(Q-|PsDRi7^7aHE +IH*ZRroµ !91*΢BҦ@B2H@rˀf'&ܫ '>UuS6HQviNӑKU7{4E0%Ыйr1kfUڑ6uC +\ƌjt}5VML)[dK'* 7[|컻~dh9-a6<*úkRسfr+fN +LBsc?M8w}B->9u=,u qN_6m|{۝qcLEȣ5Ajͱ9H'ibj:Lp^ĂR,‘&,|TyDD +Kl)iFCӘ $&M >n00&D@V0.&j'NH,!辯N`8O<gj-0-gt9;3I&E9GP}w0À'NyRCSD/~& =`?.xaCָ9(}hO1ޔ)ﲵ,F!w .e=v?}DvTp=aqEJsP +qT5ɑyQ,-YlJˊi>A]oVsQ{T`=pnYUDy!aթ;Cls0ћv{uh V 8\s̼,IctCx4ڒ|)k6_~u~s/ysD&N+ywPuTs !.'j\q)3 *Cw`˫z|5rZjq< oLҨ*U'L ]ޙٸ;uh"0\gfKXV'xd8#Z?QYzrj rIb^v/,Z*yEFp0&^r̩,[f .'hŠW2x` &pS^pa>XjR`d*Cg d{%slԕe{>u80<\d 9͆❖Ƭdu1%:kC1ƒ).C5nASEKM +֚5U\'"AjNݐL{"ΚUKJ~vlW +M}fv.3$9@-_04+H_S{̫ &|}Q*sN廉atZ+걻2hz땢,Q9Y*mW]h} `${k;AGxՋ] 㦙U*p<|2 _'hhK樬OG34#&3Eޮt`dnc6͹xO>;N!rO QeGdiJaahX;O4qGS7Zi+M4$ Ǥ]LFaA8=`k S0YES=$ }5)VK8 8;2tŅ^hɘq].V`Y{\~ ~SV5?d剣5: dBV^Xg$`Spno~kB}s֟깎4eFyNِIEt줰gP.!OFv_f7in0EfM4A~0G2$9qCiHEI򆢇;hLs;Scb*Q_[ {mCcaR6bG/L"sS ]L t q:TdʎiOPj1Z׳sIļ%Dc\3J343P#E- ėKn;𬶞Hg:] gIܝ''} V*xi{ qb*f {4m$?€'Mm?=-ëylheq Ke#jDz.!EV,`j b?5# q.!)CM[X6E(h?Ptc?/7h}VrЇC?R J1aá`DeeS|h6>VmHQhis0 !L͐M2H"!@dg .bt, $xhwQ'Კl"MWJRm(5s(xᬈkZ,2,^34ͻ Y[C,h?5P'T)Br*~L }ӝR f knݱ1MBj5$O f BX+q >`d?f Ű?jLu8k0<`@]nh-1腞g&k*'؞K:7uj6ٍcRzq +'R48ݗKߧa_ax1 endstream endobj 2319 0 obj <>stream +0 H@&p H Z kM8v) ̷q¨[YmƑT۶j1$fv54~&us +;riG[zz?x˞sBa ^1Ŭن!pgjl S[ᔓ\)R)& OFa^GSmӿ,{2/:ZFsV֮i͡Po1%p׌A^95oY+Ǐ N K1#Wa/MXNmsW +L9:BD*ttX vZ \.n,,AJLZ{*$=gBЈƜYfsnQh:֟m&%.I m}Y~K2Y.7*xuj;Y0\x\7 >̋ ?U|x܍x>!_ܢOک'=A*E䎧n2}|k\?z0,υ$j-aa46j%;D%fZ$S" U':{vn +"[~=Ul}~>r7}ȓ' aTjJP-ffUtl%kV6ONNd|ʡ=xq,<4иɹDK}z5j(8s3Dgli}XQh:ZSϩ8Lj}Ub0VrU6mk.vV:;`F[zFE}Iهσw:ܾf$J$gKecE~6RClr ]rI$eG:^cKl% DJtӗ[`}\wmӰ-kM5T}G1ZTou&ٌ[/.dǭT(kUx5 Ĺ'ۯ&l*Rhƛw]~tt5DpMk]nhW >50hJb᪦:)n㴾69lo!bPצvǨo_l C0 B3{/uQD޽oU-`=b+D̞6jfEʼn@E_umg5UnW֓8ŌTw#-7KsYoZ;JݖU)V IIu!6WYVI 0s/970=!ϫI󔙀;MW_b,)`ɦ tNGʡԸ +8ǂl2qX+6 + _|⓾$F$KAu}Ǡ=]]B4W o4ZQ?i[4~{[؀INmTraqA@wtsٗXܛ<*VTLdMǻ%mf%a5'w3ڦƎE +L {?J報FP z\`kUȪ~r؝sɗӞEz9ɒj"$0n%⺞4q$/54ΜMq9J2;%jʕe=qw7`5lsUyq $H!ݦ.8P$j?])Nxf1}{W|Y%R鼥FBiGAT}=_pA3kbUBGAsaهa5=xH"Yzl'Bhen3g#IdvmlVĠ[!! så9Kt Td pt˝J 7vsȏ>'بϤ#GNϋ YR+c!1pWs4z i䃈ޟڟc4c x&Lws6$T#mB$WHDRm%IgՒi<8jqOפ3].X_u91 #z*ӛN?fdmˡ1OYӾƨ;}2sV0ks&47Aa|T4y_xUS^u<3^(`0Sl`:ɴ4&ʇcVzKKp[NTuERR)<5ӄx2kcWV}d[b0=0 H%ꦃc Hr/ QlڰiX,"RP+.-d 'reN"v<@H ix`c|qZ𜋧VO7 (U5\Qm![|2ZItMT/Wv\.H!F|:Kс`fRރfʥLC ^0#ze^q%^A[\~ʼnr:m+uu̡_L%ۋKӑL +n|#i\Y|hq1mw@ !DC80 @=,d +F[ ]MꅔFa9T 721\TCNg8]>;y{mA'oJXQ^sb{U-&L`]n u.դk%h&çmVHkr$. gf,I{"@^iX0;{-"@)R'/(Bl@wgk5|ђ忤CA(E jfؽON=. 0hEzYۆY^`b0l}Y E*]w35ve̅IӢzZP!&fq \Q;0*irbϫ\ʙdRJlXZN} /۸ED}aY%cT1>mpYPr8.j׫ZF׭Q!q?<4&!QM} +RP\1ڸgӤ䴮Qmu&NNj +ooCS wR&s[%if`zF)-Ԣ]AP?qPԽ*CzweP/xH!Y l"l$_oJ)zHjt\C*ЧL ^Wy >驌ee36¬#c i8:6(_::,-@ໜd! 5%pKٷC90kȚV$8 ۉX@M*+Nd4΄He% &wX?:JTu#;SpCuyW2R"1*V%nF{68q%n^&p}z,]Y!vFjo95c. ֏X7"\V +gqJ1EB:1%ۭ8nzz"oʴɩ;J:IYW!@~aDCRB@ݸc01RUDL9ef:O4=r3QMBLNclݵPrmbY,Whا&~(1EbêDIݾ.B&xHߴ3. l.e l{t +%ճ_JL~i(>+.NSE$??{-N]@O8;g 추7e +1з N͔ y諥O_LQhkq#OP\tUq%LoSdfD;s aRo.4g)ˆڽ +Fce/!$`:a94[ϥ + +\Wwg@l6/XTI^'B}6b#lc|L4,1iIp{/lӏbq32۳vNӽ EZG쒥tb=d3[NQ+5@_ܵ\Ў0d\p$x/R hIi0nɳԿBdWB-Eڨl:T4JWfd_EW|)u]pԚ=,V?,3'ѓ! 'WMI.VTCf&)H+f Zi4ey[|>=,TeX?nP["Qw6+N|etZ2SޫFiI&j/(c[0ҊK_Niy^̀6l%Iɶƺ: 4 2U:V2k`\*_;.w@2'3hN:@QhNd_ +{Ax%X|xLwN'fWʚ/1^,RyelFɟV7&rYŎ_2E +ŹEyvTmEOB+A]b޿&nZa{nB5'B +W" +Tڏ +Wc~y (WL׿ʃ,ܜ$ڄec#Apҹ+̀Lgw_ !vInjںMK6BEggc335ɫր%'v1)ԾYs&BGT0%u{8fފ[{wm:GGmaҜr-3[ބ ˁxJ[W/LM n6*IleRĔnd\^Q/: h @\ULxmdŁBGVΝ窻:1 ~%Iov#b/Fu2ֳU!j#%wŮu!ᷚH)n+Yy]"sHZ^Qli82:RUn r\kM $c,b[Lմcz4 D- Lk1 +49̦[aǚE֥D`kIRX'~@rT|n^t F3*,odwF:d}R<#)88'8~+7 ?MUWuʙn3˼tB}) a\WBQbekثRJ8sQ5#NPP6; e؅Ͼ39,hUt '2ၫoa|!Vfh1pIcPK=x`b'Z;-ؠHnDӜ'}NN|RjDr;{4A lQh8]{ܐT{\TF6IgL[Jd e%\Dc74p(v/Q'=!<tet6ɲ}ީYߺ*O:cZFerۊ͂EK4ssU"u3 ~iQJfEV}@O aoRlfYgv#~8zwB,˿d Hr]/!mҦ$(O<*RQ`˓N:xy92Q[Tha y!RJO zfJWjU⸃7TH GTSHu3}Mk!ֲ:͸S+~5'DGMi|HN|$)8; fhI w0yc\ +n3]:G?0& ^p̢Ǝ?N&%ä-L#L ̡πw4f˱[Ee ja1S)>l Q Tؤ$Qv%֒U]C6dx>FW~k  tvE@g uŒb}OCs)XDk +lRIjңyS*EB00FƹdړwxivjJA}EaUtҞ;-Q}\[b+*h*zf Xɸ0`H~R81H%8gΦ8z6!Un'7=׫q>EtT=qMk_dzK~MHUjVyL-"UfT5nLWmsFV|ZyLp<ʉMx=;{E +avU + +D2"Vv1ePUd [;Z$sy!' VSF)k71cg5]CB3ׇe&n_͙#s'U?%^j^5C?ȡI qE^ N_ XL[C32+b ζ c"&Yp.41Oܐ̓tdf**3=Y)YuMيD NMU`yEFONy'x + Hn?ң5}*g`u^]{3\Hw3C@ *:)WUܾNS$֞k'~ i5t8r<ʚcH%\5ICKX+|' PJ"HhQY|z?7%x$-*E v/?cI\|lŻM2LBMQ04]_h{-RK`M,-Ckɑê BM4 T|OL5=F Xqǧ_[=n %Rw :汛UsÏ hfD gx \OxcLڸ'xGZ u׌y wM7*?%1Ѕb -0$>:bx_ H|CBƐ.74ڏQBcǕ +4ʶr+~}DZjrǟQi*J *dwӓx^gr#;u@\'*>aѺ|T>?XTBM^`u@aeCg+{&jZ !܏wuq罙{D]oD3a{IMVКBVsdKS*sj +JF$_Wy.pH^IRcmN(I_8S,Bh( ~ +S?/hXtĈWOp(Ӿ4+:5s70hw P4$U+wn&i"Q3xkf7)5j W} e +K_[)Ѿsfr&$CPOU{ QV8!vÊd5s )PbxBA _W/wo6U݂ 6HXW/e +,Q!"ͺsU"/D r,G>x*R\Ubִ%wpAEh6%sx0-A,*ߝ#N2Y YuM*2)5[{Pv61`ەKȆU + +4in tw'Aۈ`ZɏK9<6+( ݜI`ǮR\{`ץBIV->O[v]\ +W {ʰs J eWs]z/#fvшSiQF|_M[gT7}Y3{lŒg歅QJUbl F:|7c69ξe!N+]?1jeu.jPshаBY?kpGZ" ߘ߁2k-k3K^0`#,o{Tg.'ſi\rRP>fMڟ-vG urlof"uً:YH^9udc^~E"H LҴ]ׁ ?QGتV|D}-.NqHyP&zpELy'pfZ6nZj"5^vtt{`,pL>p7c()+~Tyy'h(^QMk VKI Nf[-8I1‘6\D6!sMjv[&nGò=W_ FjD֌&?=ġ/ؾW-Cq4ӄ$=5d⹕qЍ@Jm' bxq(dOjNLNI&[6F]zXyFoSaT_=QtnHѰ$z0! -Pe]rl1cٽ%]y?^@hF,>^9 JoG$\ ҳIb˟Nb_nk[LP9Żpds- a Wpld8Yк1b2b7 Je\KmhLb?c~U[e\u>jc>:ވP3#dQOϬ3Ie8N韁#EW,b #IE$cᨙ.p'X^R&fϛ)\|}oޮ92f{7d9 [&CW-kK)by KZCttbg'D Bg+"MR?-ut'XuAeąj8&)Hez#duD* Ye;))SM`KbO\)mR:./AsTkտzp#gREIDaohԷ_oK#vZG8beQW~l=~:c`FXqǚ c1c5\(ˇۛp`2h\OD{;-%܂AEZQ:̊ #[$Hng^WmX ++cOUrϗ|Mkw + 1᫹0()[Y(qkü +ѕ/$&DLwM/G3\(I$/^0Z|ӖScxfnΘ=z+fȏ f'^pYV^+>+CY_r.{Pe>aݙ5"\w@rZDt}A,+ttpaSYX-[@ ,\Є9Q)acN ?{aki67zkw X6˲>,>\*g"աbfJp ڡ*qfDns2^ǘ#^ +]"5S`H?F4t6 biU*?l(sWù^;ʦ#76zuĺHli’ˆzbRKs^. #yצUSߓݰ'"qj=|{ J~F{Bj0!(w"Ԇ.`b +аm|śF"1lcJO'yM, q0*|BqbFro+KR,lqVqtc:qȒKQcv2T-|!%ڋn_|e:Óf^Oe\duF"6T4QkyY`?I;1akZLO54u)ir^v٧EYW1W_&DˁmvYk37=SFX)K-Z kGQ0z폎ê.DN4m`q#LoM.Tv;F x --5M}؉ozo/P8"GJwc)֚#$@K5&^O"=h֣ٮ9,vqs Jf:^l~2vfmX~h7 UW8Sr.ӑ=x, 3v/g907Fh4=+XfNοn +-diVΐSKY{>$'ʍsW`'44{k7w Ǿ|%vhliJT}#!.5aZp#>^|=Oth(R,(p6E5dz7ʃXMhueL}ڕ3g#=gJ}^l%I#{mE]A\ v^.ֵr'`CA {ͩV\3s_CPw6ڰz퀨 41!oa.Ctk%$n6-jT0e/\OHlWǨghJEs hSSݮH&*+D`/nʠCJ)TU$Gֻ 7?;7p^<#z3e2Xni~\;7dv}h +OH5=w?$)RZ(*Ud̰%\ +B0` +oaiGǟ k\-6?Y3|Δ#`Nm@$KEJfL5`Ⱖ3/^a[Vu߾ zBN OFK<@8*$|zkh;v`/_ڦ*BܒTo0z r.|fXo(^b\ˆvQ[MPCln*y^%WD[EB9P&ltB*7YT[1BM('r[ pR94qk94+X7uqu]7Q zU Eج6.-x1F9<%+roC-$+itseoGꤵhWڹFMLr.aR^s +'Ny rd˘Yy)u/W{firzgܛۋ؟\/5!RO]Woˆ%uCjOgtPIW ))eA7&dy>4=k3M"^K_M}3Acl(݅KʅjKfYö6_,2(pGEufPEsT^SYUB6_>X\ݷ]]lfޅ)0:* <)-^S ZeLJ @Rn?A^l;x,%Y9#c"#":r+%ghCSm@ FZU@/\.;@6}AGx^=Na|HyNZٱK) $b>\إs~8H)`G hũ)8Y]^-< * $E=OL]b΁3g%.T i~Tz;#l$ .tQMfI&?ӟک_w5Ѳ''%loQ'7Mr<zgPaݫjj9r,T+_|@( rJLͤzw&,W_Z!\XZ+ݾoj\Z8'ziXՃ\$@"aO`.xkirhX@5^`V|``:p>׮6B:oza57͹X"BM@.ƮqE%VV@\rf6͒c?w1B; ]bA~ڈCߡ^/\|[FGQ>71]RymL3V#/om@<|ko6} Q_U%4P v>Nxso78c1 L"/`NN?ky_EZVJњX=F-+,ia˹,<<ݲY?w!75?b _.=o5Uq0o(TspBC\y3ܐExeuY{hlϬefv`ĞH 4A\fËis#^pV}sk6&cz)\xU=70$Mi$bI<>+姀SZ7Hˋ>X +/l>;E&>WS&R7MOC-g5$! +hԹ#l:^gִ9CJ"e<ǥLV_Ɍ7vC6uq@{Mpb cO6!oD):SGPGg֦G m `pp[#?UIYƄĿ XUaV0taa)|'6[2FJ~ W%zF-eY:jf {I+7/Q𭃖V,PLZ_ d! 1[ +Y6mupOR((W͜C@פ;6sl\NDp--/eQ\rɦ6vB8d)΢D*ٜ>gZxҦ쉊Ԁ( jg<Hc< v'i&ѯ%x[%CYcJ":_p)EǴ>lx/QJtw3+ +'6Et`aK&+b^KO}`?yW% U$S{qTBAf0B'+:a4OV#嶳|T6TܫԒ-#D&u]fYLwVNDu1\*Wuh0Bѯv%Pp$݃IZ^ Q%:Q~M/BLUihH}84C#=8ݢ7 +"']FS1k $-YA'^+EKF۔~ rzW7,c7"q*:;r2ifg @o+po X^ qבbmWO Խn.:V+ArX C%-<~q ak $em* s8AQG` X:ɠuO1?}qtgۉ} yLL TYK*+?A:׿x 3ٶ|p+-Ỷ$(9~CzOS;zTz\(Njadw Fg)%\ϙ40U $SR]#:%#mZѾ66]d,p hѲ ^v|Iڮ".FOh@* *$m3LlTM2e-? ;dغeGpb sŸf`pUnh,@S yGYzNx(I2Ii׶1). ΋kVR<!뀊k&puBꎩNx:R^$, & $%^r$xy&WcyD,oO'b^HwipyQEg +ed(8 +)0jf-*lИ3/"mc؜N> ԃ~<0Ć mT鐭0Q-mDQҨAx?_?,RJ;X!֊loih:V2C +VfGvc1+uiVdW>#㮠Ѷ`hKQ{]-Xo0s/B֏B16 U +{iME`: mv2*[(|:#pe tݴ^žtIn>9% դS:VRZKЃ:9'8`]_k{!lTH` O6g>J }~‬įAr`quq,@(nK|` +ˊ#z~͌NF?Q & L(d> Jf;fB +q*ZΟ:溴fv jHʕ +mr7kXU-?dF$nDXڀIiC|Ô=&f/y%R$CxȦ;^}&` z98͊tI ;o Yww=6*Ka}ٝUGouiunP?FݙΑ3vA< 5%?\ULRS!% Ɠ@Ϊ/&d@5AF2>rO8-AV :2]"Uډm<'T$t4{iKIRB(3O>̩Al~C`mc,6'} MdZUƪ*mzwmNJ$(9a$(y &5v$b&="+i5 +rhֶ#,_t~",\kq=C!hXXaԁkd,w;q򬄎žBor`@Ҧ PÀ /kQV~ )媷֙_i@XsgX04[&,\MO cRrي%5-[NUD/@YhJ|mxZ%IC *a7GYDcUcZl1x +ئ.0ldHWf!%9\ x-w&ƈ+K2 (Q9s0oeyB z +%4 +ep6H[tyV]O@ VC?olS>0k@z]K c=UΎՐ=[F.`×/0 +S_E̎>zR]E23Ċ} b@ɓeV'ZTv<;]rX8?(DNY0q)L٩^EByh2#.ho%1?0"mȱylgEwvX- bC}1z^r~Gz7U6]Fĺdc₻6D*Vrcar?v̀ho5Veɡ-k$/!v|(MoaeGg }>~ྟȱYd@J6ٳMԱ(~sG,㚐r(BײM-D̤C5l * PvZU%}l8#Rl3->!d: Owtz>zG1F LeZl?  DxZ\KH6@>juj}X"Z^gX>cdQ/ +ڐ|1.t)fX85!^^ķQ}{' Ug:a̝z''7zr;k^;_Qqq2MS;E[ŝbLNP\Y8DT.$HAJ/^qFZq-F+,&̶wYDST~JeSM \0Mee>#BjHcrdNw >yN7UzK{;w/%f˄dϘw8Ǝ0ߝC-HJjh|i?Q5A.P2ǻvVCloA|g~uo`&;B' /mgv:t)oS-Lk` |9~!bC oa5NY޴wzDy RnD'X*kCb!gslK +u"xW^WZ1[cWt^}[uaGmHӤNe98.\Bk1ߡ*8VA쬿inz$9A֝9R,[qApu\X}rVm+wb!k[PBg| 8_O/ܚ1#7=5تekFXN&bcDh8p䦙1+%Y6B/4TM˝cO/F+:S=PK[a4H IG+V'<Z a Kkz}ykݙ0 fY'k͍)WKRS^BPק!%rí`Qsn)\(r` +[^9"1V+ž s2..\5Y +Hi a.CVF'_\Q"ʆJuԟ(6ͥd}9X 227c0v`@|{SSSy5ytޅ6iD~Š' +y pL:+;lA@In*fE7^]>ːw4p.\r.&IZ'Bꢃ+beT)*fQfs29D~Up3U)D 8mU:m" }݌۬WIN0'+ܶ.ȕӑ +d17YC[o|"PZ뭑<^'g䣛KE+g 1Q"rE_暦ۭ cUZ!Zk_$Gu@VtaRka B+adUхMabCʥGuoy2w'Γ)~j0hoKj8{FNC)9+CϣJmq]"h`v8huDn3ǯߺ)a$Q\@B$ /{9p$w򧑷] QuGi(:Q]@2.)t۩۽o925ZkjUO?Y>9V +Zp:Ú(0{ς I U|E"ה6u~R; 3[p}~d;1Q91&pY4"}{NqcVe&hP oӊ-Ӗ <~oh-LH /36BRã+h&?j[ I{si3NNwHd8n"@ +LB5DE\6$^atSNfM6S d|εi^@l +65+&+aK3{n IUGy俓p6Q=;;Ġeke(G.9"ȁ{:7Ɯ1+KBX AvO@0~iv;p7#'pgdcISPka$e 5BX;s"T_48w1>ڌS'S=,A./%X (f <GRA1ëŞkݪ2JSm%'+%c17,*q PDڸxgI@T&E0*ђWDlqoؽLR6f.OK!/Y\XۺY< u>1Pt~.8f7[FK Ȯ䌛Wz -e5GfQQg&_m[(B[_1K<>+H [(?f][&嘶AZ"}9{.h ?7mҙK)h> +ńlel9%L_XRVq. vP_2$a;~Ur|&Ő \֟ bE_ko?ϬLāB 6 c :*Ā*.wMNnE´It}EptQs }E[k.t%BouqKܲ˼Z k#+4>^ BIbi&˜?9( $ ޹(k>杋Sn} +@!ǙJ m a2gV00^7KyJ4P!#'%X@^ a2 DL~Tϵp6ƇzH&Ih5p{B޻,idGYov +[hgMF\vV]~<Ϟ.$@'B@Ne0g׫s|^K)ϘYz2٣;$ A!,$ D;snY:7Ao$ JO]چNy;d*1uvOZ)}\!TNp|Ng3FQd]}vlZDyv veNP^x_eq2`8I&] !Yov,A8,yAPFr9aKc޽[Zl1_4H(WX Ěgzp>FZ}n!G+}e8 W3rЂ6{}tDY nz2̟q/(Vm |tHmԅmP$6}͋?OLNR%1_U!@Dc#CHR7BXH̊W{vDLt$d.Z0Xv,z(8lBB9q !)*C.+0|bLBݹE{zd֋6;RJ'rɷ=􌵘Qn<5,(P=+nUho̹FiYC![*Xg04G[CfZEqUp"%Dʮ޷U_#BLpuߊ[qƔ2(r ި" nB@ヰ+4*ڊM{ rduY\)HTKrl pI\{#BS8m&ytVl;_FҬ43\D ړ%T"a4|7`@KmHT6:`UWJz% 4}'ZwRraU e̢ +1t?Euw x:B|Fo0 cF[ f$?hK؋ k>it@g~/pVkDé2(MBG&uާ8[<ȨLdkuy~%s9xFקb l# ?nKvWX9;"S2\2fgf}|@f51,%SL?3@϶@KpHT*v;<^YR-AQYɮ[mYjVQc3nJXZ.03I*sETq$7tA;f^ +Hpw+ͦ}K)^vX\q[ cU$M``cLc,~.5y=7():״_yYc0t9K7kg%ml9!h`p^GcXCҟ/t8:(grTم)} iO\E +)ڎ!kk\@, by+E+LIvf21B"pIu#O$ +f(Vf'_>dOYxO@v*yײh6.Aņ^ 4:vOJy{DusoMn $!7 1QK " T7 +1Vg>[nu 'ȣ#Ozh|\e-#A,Y.QvP8VHn֭K#ZV (pq\HZ>fc>8G`slw Qi;pTjBbh"wbQ0VnV*)H$tv!35JU)$Zw*_e\oM:1彌>; :*˻zȗx,poogM^, +סn _(Tq!^ܡ$W WXR0{.Õv' ٰᮚ{9[KR|S{N\ʕƽ5Ʌ8OFڪ*Ϗoz4ߊC(;V$q_z?beRwm}3?Z9) ȥ<6.x,(SC*'>>j9!~-2r$'f|Hu׊ꁇDdØz@8Yu@ySN{EyI*b@ ܉]I̞]C Q;ՕϟξԀKA t]퀐6vOF'D}uM^Qc1ELËb_t.#8'&p=%ga/hy}0:[uGWdd:xJqا+JZl@?: ˆ%Hل"iF_q.<'Tk-:fwe=JYh7P@xrNZ}*i{p6+nQUaڜ`&֥"I @!*^!CJ7@țV6"#5 2[.j)r  endstream endobj 2315 0 obj <> endobj 2316 0 obj <> endobj 2317 0 obj <> endobj 2318 0 obj <> endobj 2308 0 obj <>stream +HWRG}*>:0R\$ MU)EZ!陽HX$3}.')u2$ϓyrx2"%ңLyN ]ZTS"m"c/`( $#)d6w +0M3ʮJ(3*&He4qe^Lk!#V`|8˿ $PGӄȿ<2Z(8O'x Qښ26<͗լXTFTwpl]\eEDOʦ ^wؿ(1(Nu &%U~Aj"Ԣ4a"o<t>˿:@9BQM2-谸)}W-4o\>S˛_ce[:Y=*RO?kIp|2"2/njTIP\~R%0P 1KP,0R?u⸀zelZ]kVmA^3#]j[(^aٶLOU-${﷈ hf1[+'?-}x20 h  zR;֦ޙ`S+ C2>/~Qآ4( YFה,bbP:VbC`Z\ G?oi:ٵ.[h6b:=t*+xpI$cUIz"rUH2Ԭ>.}/MAz0w,f +wmXI?J ^ ,b)Ge-xMck |>!v)v(1ݒX d])_VHZQP~LpGGG5*jZjrW0jr1wi7ܪ4{hDEV#SAmM/|/&y-480Ƌ +HY endstream endobj 2313 0 obj <>stream +0 U@&&E UZ/ :O9А/^J=bV)A66b>a6ϋؚxˌe.!lQH iVŸeS˾e|9jmMԣZGRcʟoMw-g3.V>)g gчxp{xJsxK~  #lKF{XmԔ۶K ! kAmLJWrzu +~b1ӘY= zTh?`k +vozpݪH{_.FT +R9}Yj!sRNk(\aZސ6NG [H*:oq4%2F:ћsW,qgw@)Ao>?ZN4MUjN}d@d/S'͇$~]iap"*j%Tcݰo:ȦjxNM6!84mFQ< [)xi51,_S]]mJ[B,_*dܜq{;!,qMuЀܗ KPOspao} MX)sϣ MaXJwtKnpjfD@+H/2>r#vPw9t_@#@Ѵa/O! +լ/Kr7 ~` ς^o~d~)q%XT1)}P%n P>al00W\ +qфqa -&X_&(v;A4؍Ԩ ԩ 6=ujWOUn_;7`f/=/--SdJM1Uƌsfn%,A-"rԩYs_a+rVʌ>ֳTnȾH ++@B0{hgwu`zђ~) ͔3#_̷;AQ'aC0)N~m?ek{dAl%Gd,B"%%Qr xbqLhš+2r:ӥL){㩼ׇ߭dA`} +soJ<; +i!LpWxY)9gw#4o%Y[&S)"=a0f(C %m̓iМRF(W2!ה14*\t5;2V̦o/&˝D9r̘t2χ}oQ_iٴ \҃h9ۈdȡz %S+SY6Xjoٿ/=&(BVuK$K>>4p_E^)MĪi +^_H߿"loWR̴|f'*27[%#R(]t5al#wk:HIA5rϲiRipaג¬2NH_pUՖYp'_k (L<4(FGsVi fq_÷+j.4^Zp+4 M?V&7` ;ȥ:rC_n[Myzv#5@/hbR]ٵhbc9kW՗UҴ5u#[e:@{ܞDZϮ( ~D{4`SMfu6~ #R.6y%%n<͙ +Y$͋^=֕-':{uw>#mhOV$7$[:Sۜϰh7v]£u%Ii/PW*L}%h=8͎zpB+ gakV.-ݿRԹ<+y[Ju2Q뜥P2X6>.ab$/|xc#/w=֍9<#d;Hpl S/"4ʀD]5SJ6|SS7}?|jp|xEZDw1*YzwFUh84v!@|I~ t 0?##cWK:=< |;J*:A-#/{BUkq7wӷI{P +\t9 0(>:RE[-%գlSFI1sEZ͂8Xm^h`~|3_n"ct>" Er- oČT8F`,W]FcPv(T!ao\ikeS&7F@?S G Ja#܎aηpOϜiȣնyƨv7:aku~XM63 r01=j)=hC5W ]T!dHAAa6oNOw:Ģ e+okX-vv&\[ྞ6)[} ߛ cL:1oZyͩAu"ij_F| Ǹ{,^s$w`ӥu|K?:`.gSJ=K r7 +x׳:d%Tx9HE +]T(1&!CɑR*"Y'4?vp9$5NuI4=yƫZ/룉;&98+2iqȰ;lG; wFnЙ@ =..ܲoaib%=8W NCgp!M2zֆGNYz\Ȑn]nk_^vݿ޼@6cXSJKءs%AHӇ +#X츞yȔ K)%EP/Za74lUmov?;Kl +g>|;uF6$4<S*喩x=Sqo%cxlR6ø}SvV +)2rrmkI{WXE5`ˡ5HgG%ܴ*I]]ޖ5_omy+jo)ʶsPpcяKDz.Sk2LaN(x 8RAqhbn-nUjI3/Fm0͟lfYh0ѰgT%"\#oxU[/Ěaͩs7+Bٌy3aeN[_SnS1p0κV2+!@$pvˋg*yцrJf?[b\l7Vx nV?EX +@#4EyAhXI5.S1;ר7XV*G"L2wT:=a:}գۍtI' fv: ýLonQg*7l_`Uxr;zbС?L_Ka! KERbe.\ f1Î^ +m]UR}ٍWiХUt:yR&28/u=>f oGK`(bg%CA("d]HYA*҆80 cNJn qQd,B8 c9p.V@OCIy\M&;VmKA!V8w0ppl"wf#"VhλX`dۥN-m!caH-a.5Rt9Ā갯(hnAd GX2PVҜ>S NAzVS3X,t:4_PvK=?XVЬal9HX>Pؙܯ^Pݸ/gW+?K)BgZتyEl[K)&eKWrOOV*R=<&u!T#(IB'zHϸyUf<fpUZ~]5 sTɥ`L|jSBR(/w&|v> KfOj-g #U5 +V?G]%ia >@/VA^!XB$1%|0[L ;P$^ܙմ={pqx2L,whhBO KW U;})vg d>Lgrǩ9KI`b-ǃ` 2".ŀ*(""RI29:lts GH~{xk#~Dm`Y![_|fOEO9!Fy\dlWoVs=GjBU// !cvXi2B 4d1]tuPe{PQ[f޻͌Gtk؟fҌ@{^2y1\ OԘd#Qsj z(+g6F:ti}Tg1} Q)tqzq=xpO Vˣ# (8$ +4;EvA~rEcd*1B+ ƪd J9ټ~"]Gx?'i;C-5 nݍ. +SVVÁO ocKV- p+፟9 ET x@8xG0> `q(qkm.™Lt2,_'4 F@eZ` <3e/@3+*х)B5Do!,Dن+#eQyŭ75{m#<a29ܢ%PT8iq$Dʼn{YCm͌`z'96 je{)5)J36gL8 tԂ@y&(Y}jI?b*'n<~X~z.c%LlLI)튑RF~ї*A\}wu, *5ns6E앤xpdѥ @"j^ƛN.ɇ榚Wޙ[L „@GW&A<@nӵA)+D@˹ jfG`^L3~#?\Ǐp:+EJVu~2SWG%UچB-v!Vh+uѷw'SNnϫ4V >~|S v6i\ˆQ|L`i[LQY3! gm NVs>3Ȫv/K %͂cs j huѥw5FtZRf")a+NjPO gLīRs6Wzaqc*tAX2$) c;ZI:o^qpө\ B15'! q~&ԟQ="̛/:1l1NRҿM #>%z嗈kj9~SW7S9|h% - 2Lݛ=(-i+1>,'>_(~D@*5жe D&=j'TN%B'MQKk)Vf3O K~z}XБ8ѱP)'>݀ WUGNz;_-,[7@!4}<*^+:B ,މLQ y<7M?K3 əvÝY7p2x%@HU'&;fEc$0ogMUev2!NїfS|}Ӎ Iv[>ᛠ7da!50>~3#x&'S'(5@%fjd2NidL_^-* VN\3Ⲥ FLu>z[QtY*ݽh%S8LJ55%!j2&RzGXQ3dž~r`G=_4" ª韌z~n.ԃ3Qla{+"Ke? nN0%P% + tܒ1DH*1T?R26oL%AoK͆2[e߂,|a@"J} DֳX)sڭ7^ѭP#qU+> +BK9oLB&IJ!.#Nnwm^ +<:7PXh]eƗ]>xoNG&IVX!%>tH +8{ p?zj[bSP‟9_*svjbu)~{[Ekş@xk񠁣E%J@JqG-?\c̭x:e=NdM t@)\珮LE@E DrɊfxEFF}$_P πMilA7]&kSSD5$G "p4Kä/2{0d-0o(AzS5rI9*20$2m3" 8uym=F4Mمqm.ڶe#UXs{Hm2#ΟvLg%o5L Tܛ3 LwhQ4=&bjfɞa-nCCrSl/@4VAYI6s' W^R Fv`B Xw7a&pؙaraGuoV+1×,b2b6_-X:[x57f`leftө}.YՏcc# 0'P_5Թ 6?у|%xW ufnU`H8L.zq6g,MzV#3EBI*bn/>L^4b}j[{IB>TS;jOi),s9s][s{YaR{<2i"A_ɨ>OK.n;|y>57ka.RgcdtYJ`fE^Vi,LH13T8fְqX?aEv.smżRg6 }e*k|PE 9G ҕ{%Y1Νu4 ob>{ $@-)ެ[|1KW0ed\`bC-5GmyXס]=t|i7i]g߰ȷ43W ̧l/#L=8*.;5,G$_CMHJO;1{&pBkH3I4@Y[- XFXUsL]^ +Y^d_3u/ _ò IHA^x mcY1,^ 7i5e c"_2Q'Iy3>=4j+vsygKyr9ؓ$!C k'+ޓ/1l[Χng'L dFoj9y_Z?'IZ/+fmڎ'k~Al*3Df4t\aE% +zFx"dۛc3L}iyzT9C<.JwHty&gl,/bqDKbBnSt ȝczU{%eub}G1xaB S SZ} z:y6EV䣄#H#_^ &c;\3 + +KF]]\'˦&)ξi<3%d"EiaVU]~WO9p󹽔6yDP7I3.9t9!L67 wE`! NVےbI][XP A2Z&iRƉ_,Q8kxI䚚;{g74|ۓZoC.ԉ.uDTXB fek'ۏ;*#ΗS_L@;𿕗/=]9,%v}iT a7GE^1N3Y'+@FOI30kB}I_$ Xƍ܃ޭ_.+#v<؂C8̮zbVCaiW6N"T `u5ǿ$bf=J>e&Cu9uVȾ5l3Ce/l?&hgU#,v +/Al%+hk4UߚRZȣWuqKyD6fGXcm/w4V]N2r[cG~d^7!L;z%DdĶ-.&2d*9~F>Aj|M4%8 ?kF1 cMJTp F2=JFstU7O#7=P]־|T9qD[o,&Efѹd#L'+MfiCat2MJ;0 +{`)-v6?Ë&n ,0芁??Rqx7 +V}JL* ?nthY6 |0b iǐ|9 vAHjջ'0f\#cӢ,s*mOw[Av endstream endobj 2309 0 obj <> endobj 2310 0 obj <> endobj 2311 0 obj <> endobj 2312 0 obj <> endobj 2303 0 obj <>stream +HWێ}'G%[}KZjm ,G jH߻z:UC=hwSS}ԩS_Fc$5ƈ?ILL|vwϣ/#'?Y4[QDd[1R6)(G*mlGxϣ7fR={v ~wo) 5<9},X1m +"ؿ ".|v2-:)҂3^=?Y)aofLۋud>F7H[(Y dL84Lji\ |jjU>UDM#.V\מ$jdb(5bC5RaFhqHIoUڵ7>?^#Do2ߙ "_粣T5 g {1A1ϐ ܗCjto4Zpq޿8"Fp} es|嫤VT,_'rY Mw+YzI'65הma>ݕ#:j) H 'šUx%rpquG[DQP$shJےGsRk4?hi=-6Ě,ïU\~y2UZWC<" ([ȷ9HG4IFy1D+0CzW+jNs#L6ۆjfԔO&e9f1k2̾wh9Z;-8510 +scD2*ؓ99׮S|/{X8餲cv^xA7U>1ƩVu!V k+?\ <@ QY`h?]Ud*dA}nYv|L`px"ؐq=N& k$,/ϱSw$:h֎92lgcdW\9,Ӭ`]/$I^eMm~~Z}]{?KK-ːN8[A> GQyFI+0܏Mquux~www?gw=dmL0i-'ԙqX7#R#f.B].Y(}%mK^L4IM>[.CfΛ0c x =u5?3, _٠Z[>SeDDa #D{_DOUи?u"|YB]m:݈!̕N2sSC^A>nu=OhTiMkd:bʫCuC*XbU*(^X2x0`&4ZԝE%~KWR^ +C}`S8 ISvipvT 6ۄEQKUJw_2w%2?.xl} aPоF{e"Y43 +E ]S&%I\ONCSf*ovȹ v9Gx |8UB v(3 *zB {l^;S^jm`޶Ci\: mjhJ}C+?E:CHIjcs<5lALz.*^J v]v6+p)7MGa6k@U:ӲFޛߔ))9tVDCcAeyEuN?9IƜՈ^VB&Q   Ie80/_XKY54)3ȩ~.ƚx{ V&"\\ J|+G`s*E2u0e9]{=y*0N"3#ܒ̞{i= (2|>;ngr/;TijM`Ǧ #Jպ|ΦWO{}|:d.7Sg]I~ EZE8y/-eQ" iE|dLLDA`Ԓ8mV뢬/Tef*:M#1{`,on6E(٥xx$ 3$ط7dI`P6 )`daY|`. endstream endobj 2307 0 obj <>stream +0 Q@&e Q7Gu ^ 3mŶPZۢf +sHo,UK#!fy9j5^R܁ FtEZc謝ZZgOߓOmeGʟ iDT~Hئ ]@lLєijL_Y`3nz'4" +(v##yB2_2Ri3QGfWzf"gmaudinvq$UmnwF`#tPP8n'&߮ iKΤH=Ԅ# 6Ľ&YeIfzrjqNJ%WR|q=s%T-¦?qm3 >ɥ̲Ck}5x~ ?;񲱥w+uЎ&Vݑ]9&fﲞxCi8cSڦ^s۠J1ͺ^cn]3%"g~(Ct۸ MDs'r5tWOR ԭQq4.E3ݡi g;O/Vitxv.18f+LYi7Kk:̑"s[>Wu̦3qh6+Tgc**!@kvXeӶuNj)Y! i0&ϗF0^&KҪ?hHiܟVSa EJ82 %f"]^|-|+Oopo^okuz$<_]vփdS KUpe2*z2q IO)1{VODSIńEOx bit|)QɁDzrtSɵtq yS-σLfك0R\3:)zOe +P>XnNMO% J͞lb·D9GO +Fe%恩!􀧱|JPXo\Ϋ3{ `ʞD7GP=* ⬢=autF> x7ɶ͝> +( 6vV`\XWJVcdV@gUyq\j +~7]L jzȏ<[>1iXxKH|)m5}u}e*mo-j7%x&ؑюmONTp^2svqSE< TDcdӣ6/!2CQ}iVM]KZ׶HW g`wѵYGOIB7ܑjc|~^zsLFmxAYd,<Kb9JwO;TUXP'y ܸ;q Gܜt{A?P*VOԿD?yM|V?Ri6*pG Ɂ G&F;nh?u vk`9s5 tC =jn: ˝tQ_AvU<8$0XFMyd%F#*rdǪYz3Y +Gwq@]JN6%׷fwU7=+٘V6e'S\acv4!Ji q,e# kƯ".= ܂2uaH7 N;ޱњmxɵ]bZ5`kB[mD.VKqnt=JP̽џ~KbohW̨X\ I0}I70&-|z,!'! =h*Uf<I'Ŵ B۴ON{}`|Ȗv̓皀5?")5 P3-?SpȺ.)7X4"Y^Pw(uD"zN#s;Uymş~Dp:KE9^BٷJ:Hlgn9V˕}I95UEZK6~ܧ]`WVwS*X0)%&)wLeE4w>$$0Y=ȧS|?=n-/`;hLhΚd-"s:TV5d#ҫeaH<MqhFmn6&#@$a]鸏R +~?:l ^֒l'/}fg(=D>64X#yS04Փx=4AJٿ1bfUC;Ɇu +<tG= ;s@ 9^XFtM +NZ L`D3E?H\|8Y NO|eVr5ؗ5*܆O~i x0l&YǂE5ي<𜣲8FAT~q8="l{X"|(}Z|5~<H x[*D%J_BwV6 +%ayuR'9JN_\B2=֩+,`܎0;53FqHs~,738mtZ}Y&VOZ <,>$#RJ>czːSƸ +ʲkCkz"NLqD)5SD G 䏗PQY0:"cif;#5lXUK`1imR:7׎2G[T1D"5"s\ޕ<Hd-T`𥨿!7q3 LYD gBTkhYRKSż4| w4DGaF!;? cR0^|&>{6=q#i~yUƩZIΪ`} ޯ/Ѷels;p pJr/B}gaaP޻^U]m@%XyN. 7lwZyWQKj+dݘ3޽$/X\ȷ5'$hHʟ{m!2j$ӡr5&zz% 7fvhΤOݐxv(i(le2P22+3}琰 DhV#^_ ~=XBDU==~#'Hl$h_<VZ8T9z!IC3w{'o9>jOdY0{b W8fDq%CSh} nzYd=jX gO?-ێ0GT46Qde&|t4blPk6OEHYE/#Z)HkLPh3 @%D~!t$x^0;~ +0k:g^#vBo+^/Qփ/uj xȈMd bֺd(|G8M$b ׾o`l)rZ2E |2@ pH"'dgTJP"s :)mL)J[ rE慱Qb_Vksj'6.V^GNmRcoQ*ڭ^PiJY)J;AX8ƳP@hhҏ[Ԓ9Ͷ @]^F'(jĐ}Nf-0sv3V +<W#ˬ o¼VΔVGԉ "wXYH@:Gp@}$FiKjT6.>o7q**֍ fl6 +z=p4K"g{9IKZP,#>7 +@'!s0M+@}c=WpuZ^Z6d\f +OXTd3.UjR/ CCgB76]4,<Ϗ1v>, +=Hj +HT4r`!BVPf\h0Y c+{0vI&x[@!md&a)m^Goc6kBVuA.ϖ-6Tx{⡛@-9x#bFDYs1ˉ}H Cܯiu>\?&DT[hv+W=k)̶[PjưKK4ܣojڷ=8zjU^OƐ/'yޏ_ :Կ# J㢎(ZpZ;T^ЁmW:3 R% "SZ(jSh#kR} .GI~LYHXNBڏ]Rwd +(#ZS-.5pͷ ?Ni P4& feN$ft㞓?wf qQUtg5A2͕ yIS\(j?M/ׅFv=XnۉHGS^݌shxNG۹kۇ~`P +jO F7f{ :TjKF픊Mp,8-N&'UITIO]=/߸f9^C_k+Z;( #(o] Ȓ XJ L} Z(5i_uBYfr W[b +#dWv(|wڪ+!lrCϥ4n w?XBbG<6/D?X q}9K+۔ƆO?upBP" l,jQ\ +|*%zo- H`;zP)Zԯ?(a%^s#Ã}豄,֚Cj?#Ωmh3H;BIj0DGvJ_fe @OuQ(ī`*<#-~U eAWEdvW>mz{s Mub +퀻,oMY2 b(NZL>"Wbc蝾wy025i +{+P6Novq#E3^-1C> /tt5O8.ZGqpK/fvdauW(@x-l2rann-#!Ϫy%e%[Qծf& Mڟ뙝[@-^Bi!$\_t+!ks*OG*˕ xcs]Gž_;}E(]ĮdzK4Ww+§0‹;'hx3ȼ_bۻ ږ03w[4Z`'q* (ECA@"6o&hy<9g&\ &"1 2 +K/DZ)T )*>m(3!$Iy<& AǯBFEsXsV֬r1@~ZFYq>ȣ9ㅐP]mO;ݨ*'ei.:VGuG!'MZ`R"ȓITGGD%tl0.I_ƦrIؖR_)@[5鍛&'$4Xݻ1NaYXU\]D+U2M&6+_4 + e v}=НJgt?B[nubi)KP45d0H= QMm@'  >~ڹ[!75'R̠0B#Y 3n +:}dqڊ@2Εx0*hŻPGn A^YsR95&0%Wj`.茺{#'Bm":0zٷ{]{! w(R+KO xyЉBsч1NQj;"ii@_fYZ(6mQ%NΔ3z'Ԓ@_.`[nwt6qBұ?V{ (?NPq~OR 8/4'JJmhœ-8&"Y_pk)[J&f6A֪ PY3fΝ#L- HLDA5uWڭP~c?+or ++.wY^^x""F64T؊c3Tk·xX + +7V3u(MXm#&fG +zyْ'q$`j|h9v}h <ie ,04/9L*5wA(8B}\H} ,1aZ+alqf^Ͽzh"DŽcrRx% ʧy +6b3XD=wu>  ݀Ha>7&WT׎i'-L{"+[D 32V ~ umW5\-M}S8dٺtw./uoHw0ADKHKEn UB#a\?bV_]R61uH%ae2WI-4((*(jsO)/ǘ:=;@e' #w7|"uOvEb)# #*u믯Y?ܔ|NO^&:a5J=_՞UYf'xO_w }a .,; +ӕcӀ3n#`&x=jw}I%t!.~U˻Y.ēzfkbd jLTM!dP_gr*Toɣ.z"{8 z +d#.|u~u w gD¸[1zޣbXz[ɇXMd 뢈;׺|MeH*&e<nV꤃ &p1kb~GM>-h# re!9$L9G +5 a6Td\z{pպV0MыoBVu\&m`ӫnwL>l"ɶمW.\Gpĺr&b/7LH +:oAۇ 4[4v2GhK +$? P,բQUS[nȕ+0TDOq pX@yGgo"#3Z" u+̍I{*A4h2 +>.\oʿs[7 9}%+mqScrWo=[@' oMY=֘ mCkzzv3ε™Jw6(ӴyKaTˈԭjPf +jI[}rL8)mk7?qp@=#y>b{f2䤝Tm耔rP\ѽ k? /BT<$I27VP.*av &[[Ag}*?GO*D`rzSF[hW: vBY/ZX4CS`nS󁦻E 39K_CWu +WlՑz)7 ̎Q,HLnry,Ӿ,h5^Ml@*+wF:%9&$q`' ӵ t=mO`?XbOISDWbLi}<Pa-Vۭ`==EĮm,g\^Ǭ_Ů5WY~ uSdN1yꯄ{lJ'W>\^čݍ9"H|~-?Zq!,/͜ S|s[ _dB廉/&d yA??p U +UdSwE‹U7ሴXwi~r6NE?16>ߵ+^}6%a=G-| k!yPZ:;6 )Ët8֝TДWM!B΀֞vc XúBZhЇh7AȾѳڼg33/dwLD );@}ߩ\H4݋iMKtc~ȕ6ǐh +ЌS&DDRM_5=L9gzr2|RH:l73[QYBS\&GBiYoǶ!vcPV-|w}ͧ^収EoD΄Էk mAMb-* q*gq[^3u]EbwYHJ%kB4v%hr2E9WIp5&ʁ0c79"uG7B%} +u-&3M4FA(,kiQ@%cجa+lâ`9pb@HrJ RQ]|0,кjs[!@- ^&H1v~;b%M4;\}Bw H=3 asJ4 䇅UQ@[>SmevWEm>#>:V'Rȁ;b>MqKGg ;bHw4o^3,Т^VJdwIgPti̾cyCL7í{H%[Fh?ob#xe-[YI5ľk[Ъ4h?PjUջ6z*H@ʿFHi?b%}z$M ;Wq>AhT9_ڂ+ )3쫺ȵ'~u:ڟ*Pq~z;ބ"^fyz (Rt]1u81 .Đĵz8{G1(Mx^E.BprĔ$,˶֧jY+)&Np4s^Ƈ3O6Mm<6DdwŤ0B(\sP6yKZ)9JA) Mq0XVݭg.e.O25oU-ahFO`:ݛX$W\EebgoG+)fV{ء _SWADQפf-)P)Lhݘc kw^$I}O$56;m#=Uh-7Þl!U*LaEұ(Z!_k?frԜc' fZ;e2VC51eI%f/Zj[H/sf0҄Jx&V eM hV  '( p wR`v9HB#8z U3nh_q9snwte:70D@&I@x5Jpx⻙%>Tdmq"oDyaGH .QGMk@?4^]b Q&xOj|B|w ͷ1NAÞ}C&RT E&JVw{z=&=eqc (K$vl1eK)Ze~!RW4`SwD8N!:Mib\պF瑷S;+jm6m,γ,\ I*$ZdQ=z=t1N\|T"; ȦXtccx4ݙP6ݛxq;MԈ ,gCTE +4]F@!VF,95R6*糨e- )K$J +ٛ/l~vxv S tkC[:v1c?2s>!NNtvB2kȅs. Pu0y}(}UĤHQJ8SF#%D%Z H|Y";ͷ!@%x`Y}]Ip~n<)A}܅vԈH%ؗ1ۑL5MeR~Sz(caƭ7Gra6m{oDGK.>u[n~qۘP^8xAuc8.}LgOϹکyU?F3oq2ˁq*Db3b,"ۺVlkpuôbR8BlpS2F3:`Y r0Uy6!y+z@<:Iڶ4# kXHcUUǝ~ "pa +(e^P'_Lj--tÌz CJˤlOY< BPU{FB[{n^6r '4 Y"%,VZ +~ Og35;.T,wmI@0o6n=,N+8x3Ή4`+mC& \rudpPu߶"}~#^ԝdպwUOA&:l8Vc,eWeo^Lu +%tuhHP5SMmՍi,Cj\,-rVh#}W(-]&sv +t+2wQ@+ G⪹cpkU4ȩ9[[V/Y*ɾj:XGRC]#Dț4koɌȐr@wi7idy'ARQ 6 z5`bŎ|2KCo59}+,EE@>%N Rw9eCݿkc_ercx𰾸ep_Ͻ:^Z޳a1{~+|JTv=q}{h:MimoOxH tIAT9Ӭ +[D|2)YuH.ZYN& ) yZg)kVBPS\Xv+vVdmj F~yI:ZHR?&ڳ{i)o-RQyl&PO_ԊP EnȞ]*7 }0)@[j]į5Ÿf6Gtrh=js:ps*YYt Q$עf423N$@_C,u&h**bR;zy_mz5mцpWQPb *t?h 'H"Ђ#;aA$6.7a6hXnyE=SaP[=` e&:aatd>Tl/.v4j6A~3LٞAGG," 0q,]$ `1ΛEWsn,0>b JDy^ .:֐Ti|ZhP+s=?/@YqKQ,ƮoiPjΰI`ee xl{uo;Ү~ t4^Omk yn֏A^l]ӡ2N^Rfj-,RGEHۜh(-Q"J?Q1uup v 7KFiOX,EҦ^ $=P'u}!U:Pw~ŸRS5ʇ^~m/%$t\-_!Ǟ) >\Rn#ەFt}I&0#(W]^e»$P|su"k8rjGSn\u0nuT SҼe/\ZXr?ckV0~xu@ 5neՂ۹MWDMZ68$ZCRgJz%nCx֥%Mb) +YzJDXMݵ51:t&~丂wz맲]z"tuzKg)j D0&N Wmy-_5ղ߇2%tut&N=#|;L .pH+<$`S-:7i -xW6SvcQ>qs^)$BbJײJxMA7/vU[=WX'/Ai$lD1FGۮ3 ąʝ>%Y +B&!/^B86أn%oc"|;UW U#uuVjg_|٘| 6:? w yڶM2xQy;+Ln3$}rHsV{sUC5vp"|U$0oHt+RqG w8!LxK|ύe=>]S/$HiSTVߩ *V7:Rẘd襭I|QZ$^CW"֠eOr Dˎr3rd5oOQZqŵOA*'&o!}+/ wNx@)'$ "ѝT&qvԢ_U^CpQh~,G"yuYU9D%- +4OH +/=4n]`qσ.N<7LDt9heL!`Gri"q<q}0i-XٖFeB*)s M2l{i̝_s"BWZ=VboQfw^[tl,|فUEe ̹sas dA-RC~VU,"W"V*dR +NvFVY(|覇WO(v8UR !j]%` |Bfz`_Le02Uq o+PmfT O1=o/K |Qqw$1-?WcsKJs~%2`OVOdWkSVϜ{)pE4I})-իG %]cnFg 4%\O" &;^f*i ɨj銔׋JGfYهZnnQV'b F4$Nɷ3]|W Q bMO5q9Hdăwڜώ]]:^z2!{,ŔCYTH镔T /8?47Sl[$DZ aGe";~}1C:.JEA!UƤO*$\Z(UFAjvG:3Z bITUB ltsF *=1ukR^?izMT ԍ)_ExĦM]]f%v~^g(*N%h91SMCP h#}-o7DsҪRoOdvB8rN0W_}!< sU!W o} M:eϏY#w8 +VC:zX-wt Vlh +mdz%7qpT ( Pz=Қ+7+؛"`w{4o#C)L:`6rnzz)>7+> Ր6tPuC ~$e(_i|BV.'h=v g5c^udRD͂̅O{gy$KCF9;bw&Jc8P ~ +Rbsϝ{3V oDU]K<^̙1 -tn?{P"0ȶ٧z+s,g\Yh-SRIփ}zL.+0\CiZJE#vϟE^uov2id뀜|U]LѬfr{cZX@<*3-֫p[/g M/cvSYXxG,U$,wg5^F25EFNpwRv'tPւ#|p^ܱnb,?*vT<ȣo=$kU ̀!.Yx{#=qćFNd&]8 ?|xY3%F7(;tpUCw +8LT bju#:oG&V7c84((4,4@pJ^9c4#M}v2Etl)Kr/^!Z (c6DU4p!XO7v^C]/;;QL.Tc}֚JS"ѳ\Q"^".;EXάy!w yܲVfm풖{ +RU&̳q7u@Ӈj p-֡MoX-V bLD2{6螺1ҭt;!fU*nyL i"(0 + #7pUhoѰ?{nH:d$}+|k '5<⷟9$#2Wx!X0k4&մJSfUFl6]ȊdY,z~ ՈE{fDUaYM{Zߗ_ZP<`-ڤc$WqNg r0W3A<׮Jus!#K%d`.{S3;HȽ!JvD`UvQqYq?M1".{.,'d 1E,ˌh7c g.o0Q6ă+g:zTcq },3[71ݵ0Yoi+%SΉBd$H +#ZUߖZ: EK8522fn +1qnp Ոnvxo]uY I/'g0o~ $?hPuq^rCb=<@ 585D,2.kC:;A#LV(BCS1b[5p%(RNJ{7"hc J:M^=šϚ;dhCHAp)6=Tؑ}$hGh +Ӯʋ+ܗVJn%i;;ɴ3W-ݫW = ڏ9_<'VQ+"T-3d~c]L&ej>az%ʃsV`ި0‘Ʈ Q$W:ocBJ6ԫ#z=eK'p!}6c+xTH2<nZ^a"U¨~Q[é0,XKâ|f׿fF̉ M e ~$? +~^ =ZeGG11l pl!#Lpd}ti U̠m]kYWzS| uI9FX(Z{2x|Ĵi4|Nn&<;U#kTxOtH5,{J=o2hlC)aS>,{4ԍfp#L(QؾH52\cWy,N|6|<2o91; +-PfE7&\pټ5\>vˁ:ohN)I0⺯3=pKvwz_{KEO܉a,KDž zi˪&ӤC%ȍHNC*b] U?DRlh(c7^D F0QZ/l'a?Iس;DhjSώ-f8 ?t)rq;2_F@]mKoi:j5`F픟E)SУ҂a1D09-c9I;0I&õ"=7& uζkGYΠm=d`|iY TI/BAK\_W4Ѯ}0ܑ @:~v44 sd *srRw.o | +&6G! ;oW +| ;A} Cfƞ).rGZ.I6*FqPgej;V#7muXE9H d<-Be6"(VV};/c%)AaS0Q5qS'W㣹oWgB1X gPun48Wry`]#(^9P.2Uud@׭TNj-@_" Gر曀quoIynRڒ[Sۓ~yg|>> +?%=yo&>ZB)6*kL6IN1e8* 7q#IQ܈֢h.#I^0K[u ~(HXń9c{ķ&}O{q}+y#Qn'Q %r?1*~J/ߏaO:tK#tYϮ5H~ ;*FP$>LO62:W4gd {6ŌnnS<FFo9!TyTQ7ȋ'bwU"0yݠ- *S5hu@h(_9z `;O1+;%ġ*\3`l%]P6 Koz|(uc;QB|?p +ϝ!GDCEdy!u\J }-'<\)3m! >l- Ⱛ HE׵Yַɸl1I9al!d[h] sd/6Df 4G IqC J; T2(y)/H7a٨,/pn''f ֬"&Ps{#BHq$ qՎ+vT_Q5ykT*%/쳍]"0#݁+!R2NT +,O7}\RVY<Ρ1QI//Hu݂1+FU!/kS0z.V}# +.VbgMs{Er[މ3uB5 :C6oHJZ2x\"5IuoCɴCusTc5~E bgg:鞕nQjr +ǐ\9 qlunҽݞ4!V2K2ČF d Yq:x)<@*i7G'o^ݿbPfi\ف)xPl`IO(ygэ FZ-i4^ܿI5TXpb +Ej?6MTayZ🦜_Yx70oNEGX}HxC,ܱ{%;뛖 0 ] lʗ Q%UGڻ\~Mƾ xۣ생>ťbɋ-\#W(% ."MrҾ:Q+g&Mf5,_fHW{W@(]vv[p_Tx Ô.9O%)+(. 'xdK $2n(E} endstream endobj 2304 0 obj <> endobj 2305 0 obj <> endobj 2306 0 obj <> endobj 2296 0 obj <>stream +HWnG }ؾ>@Q+ɪ @!rVZr}9+ ǒu,&pxC5=Sy_-OkW)Ϛz^OA?>pƥLfSpNHubm׋h0]@ 㙑Z~_iI=cO+/}^.Fǫ|n>՛7`6lm.QZAS!J0Hn_;UK *fz =ޕEH@ceSjͬgK7n1IaH+vr + ) +U -@'b:ݻͯ;}ۓ3ZWRqb^#0IV ů@ >6Ac X* +p6jҎ(x\ 'j<JOpB8ke]rY>))PSBc20Fn8\LqOaCFB9^.&×#D3v4AÄ+H䂄EOA"8oxĈJC& +`l(k=W_kP H4ņ, %=e( y$O»PoN "_R'Ȥ{N)HU7woQ5ӡ8vӍ؅>&vU +蚍H@v58 k@[Ae߬3U +[<Rry6<dbpE|}.HB91{^No*}*RLܘ7{3t=WA +P5#ZQeDrK5ũ/Ve,-ӆ,_Ѵ₪P{h,/ v,/!兲@KBx!U|Fӫ{Kv*=T=Y6|r\ےuEX^ߢ!q<1{kuا2 BW ϣ`S A@B"x0(%)(}kd<93A:,DdةS 9 +,sӿePBhpTo9/j/'z QDdRof.??/%o>{t&ԧ,Gĉup}|t jO!5ýA.a Ɣ꾁I9C!q4ݏ66*`4Emp\a` 0XZ endstream endobj 2302 0 obj <>stream +0 M@&(p MyM%W*onW e(+3(8?L `r)>J%c5 k77{FEF*{JX˗6Pf}@#q`1REڿ-!'OgwkM]Csǧ,t!׼Jض֚,灲S1ZVdGo0>z ̣1a$!GCV]A1x^_HMQu#TQBQ8w^m<͐K~o!/V^#a.|屺5 ,E#Fx|MnEi=4Q3>ˁG ߓ xjJkls + 7~ޏeE:B6lz˶$K0<ۋצvެB8&b+VV>8f +@LȜ#[m6_$'7=͑EB(1s0,L 흐ù9+,Q}dƝ46\HkhUfИ^7Qʥ g7X9xfLqxzt)>ypn_FKA5wWVD1Y‰ Qz۴?4[ +cߧ *Pԛ5X)'T⺚m1ZWv2)qXmU[3ր^G1u0NJ@KOM928?~[]%% +"O.8MV}F˚jXP{Э+^S98Y /Dx_~|[x_s2֭,SL%#9j{7-] d'9{αR*#OD>k)V0IJ;O`렾oY&BZY7ǝQ\a\5_Z)T8 FH<{Nsp +k5vwͺn:~ \w(Չ~gjyi;֘8+16r/"*G5Dq5-DŴ?kZ.c@*FR77\WRg +nog1gT][=(hI݄lS!>;ۢw#$=kWP~ċ:;@Yj5 +*aĎ<%##MSiNUxGa[M 33ô?!;/:F]׮A>Q ,8h¸9fFQ 0[jA͒u1v:x=oc/,m޵l/!&:ç 쿘DKU[[O eLft4xUVzCGSC qd0 ?Vfz%-Ͻ)- Mk+;o7߬0"ihyweD}$CkyV'`Trl{o5&ˣBgvsͦ^XMi:1;¶}sZžVt,jڞkz{S])eFX| ]nb*yEKp`iQlwS  ӵ \W*PA<RY yzz a3r[RELej"+O +GQܲ`F+04 k˞.O;Ѧ#AoIj>_%oXuϖ7͆y79pІJcW +eM[,saofU|:a`- D޳.%\O=Y0g;^@?`}4DzƮvުFwc-C̶5*Z f|0@^r# 15dXW"2h}XvM7_aX;ڂtbOcn!G&^X{ Ƚ6 +?\{$ć?g40)n(/yth9\:[EZ% - +G{ +Og=ePe|g׊s +`_V /-YOw-Jh[P<ʑcs0YE8뒋oe 9Ԇؒ 2utC t].6QT-'\PnmɳR=B`h,{'45S ťQǻP^9:!%1z YpϣI xջ+g0i}`~C̾?J=f}8C6`w"#q$֌Oj t 8Ynv- )uxopJ4@r$=P +wܿ.{0,u=M̝n虥ksǚjs }/:6}/J/S^+(hW4aԺYҥ̹H8 RojP2z}O}tMϨQ*[Hh`(JaV3k:$J kS~>-rYd8e7XLؾ0<Ĕ-YT.fY8\](syޝpЉP&3vh'eqBD㙫eFE޸x+} ϽA>\\2y69ޭ TEJ_y*7zWAj'&JFBy| W\@b> tWD[IU0:ޣ՜-%n'v?c.>I{P拌&eCTQ})3I#N2 e8@3K5nirUlz haYvjQ@Bx=Mt0딉Xc-NP'NZm"zC(bwWxQ^ieۀ]Wbg&ĩ5YoZ,Vݻ6^7/&=x*e^HÇo6DCdѭnsJ#9 k^*{Si4}_|V os)`|Ze3 +۵C0*Hu2/yo%!(aŬED FY:jP.t*0֭yW'] +J`#cx2^P&:DLJ nL0DՋ=D`#W]cW?NO07 Nڎ{`['byl,hmzۯ{l;^+A]^&$f8 4mәO {B&wDj !' ^Vv H{ +f]::LvU ߖZ#J;R ;9T;^co"xl~T6_޺5uhc?WLjU4a@'ˢ=.}i_k%"PQNXpK`؄I9ΓKKlI\G v׳U_Bwwp2pl̽Cjqܒ#^͵pck<{? XA2 #,E<ؾ)"&>Pp6Κn*(/X.9iI~*,1]ኳ +s\eAvGɶؐ!܄Ѷd1tO*omr/NP_<R8k갈ݖ/\70O"- Ҭ~HM{-|L/ȭxnc@O #PorE&M䥼>'%,p moB$|X~Q7E+K@mc|{PlZccQU=4'C|0+Q!ӅdRզdr+]E^u\J[XjAw,ҒYvMz\dOl.Bf/R:N.FOLI-"[ֵ0˙DVEmoh:Kȸz-N] 3[F!{U=FcfZwjls bz`S0]mAIp<5ESU26:i$@Ԁި/ 3w' HGnZ{Qz!H%:K83ngIb}jkgfPg^Aƨ$~d,f/Ї٦O;H^溺O! *˓}D`k-pF߇[SڬSXlY[|ޛ2,L'Ͽ/< dY1! *!q+1k0xF@Wjl.YD`8TL +MPjçjx:|/L}trIlbMEot(r',]&/t¨U8޿AFQ? +2v*>j>si8(7`A志7pjטIP<ѥ"8Kex#)z6&#sg FÒfT9ՅNrޭ#&!v릖usHS%v.ҫN!q]Rdtq4];]@I`QdGI88^ij;zÚNV%xN6Kb;}{ `4-w&i]4Lc>t OXSٳ*߽8dsR{,Ü +y\ JJ +F_ȑ#>3_1uUF;89y4_`lf +/oW5;e81p5G },5 +O5\#PB1b/ hG F`{Lj=CIH\Gy=a x).PwPCB8ˀ6w/,P NƦB8@/N,r;5CQnuQSg!]G;u?H\QP6 bӡLo-.ҚO f t T " 7cxٜ o!I&Y9K:C-@j<3Em7LHԑb0}(_╪Rʖ5<~`޾ ̐V#oU6ɣ(&sVhp gU> endobj 2298 0 obj <> endobj 2299 0 obj <> endobj 2300 0 obj <> endobj 2301 0 obj <> endobj 2287 0 obj <>stream +HWko. a?:@tu @SUv[4EHkD+p;ws|q/$eIJL($FjD_..f_4a%%Tdvd%HjEJ %JHMoN_Xbh46h0_n&ǫj ~u?8v!NQo" +PL(5~- ܄0f2IFA68p%|@]$JG0ZׄF4 +&i*Cr"m8dr8OfYG&5Hgpl%%< ߃"w Se28 +d \Zct,mZFM׋4+!gm7G Z0I9 +47U&vLgzHmA P*b',C0j g~<&$PU@dFI]? +,cW RLUD]+bLZM6$S*Baˇc+s/79Gm\{Au +fe>-s %795ImixrUVT%m؋X"GȆas 8N@ :8\lc8 VN*)؆(P&VWn pRt4ҫJ)8di "j5&w P9M8N|hJ0 zle%ج֕)&;rGC={xcʩ!@I.ү|iB;.N{VpHh0؅K@ԈZ ^gv-0dJp}*՘ +!h5 +;.lnv1H#o2'1?TVv|%oU\tvx#e0˃~:F1;LFQiB#ͶM¢Þiؑ14jCINBSD_^?t@'8ļhFS}CiD@5,LY)K@ EO/K =!y{/A+gVL%+70gXVBs{H +pnڗfa;6{qQƅAMY~TR\A|P_W؀! )I? J +`I_o7TI0̫ Ü:85D +vlҐ!BkP֠ÊФRaB1KV; +pV-"L[Dh]E NpaTa#% +wۧ_˚`2!ɎV]0Z/Q:]vWLgx)jyn-vQ*0@:^dp 2L?29fC2/vešfkȄCjti^-jPC\eDhQ݀LwRfN[8vl~&?JЧ)p37clxWyyxҼ΃8"y9HtzhGpb t +ѹ7B"By=*"pkNS)m,6}TZ\mZL2L# q~o +.F&}J.dҰưK( +O*B1Y8m_@{DX,^**+rX f|X-Up.JV]otv! +iHgʊ[}X|ݍkT-P,p"Vפƨ +]eM.KهZ9m]8%-s uѳ)RNgx}˅AZ:MM9iJ&:AV;*TrIz͞YiJ,|*9<XnwniDRe"^Ѹ@vwM躄 C. +JT< 0M3fYU ¯Udغ$G~v ŧ[et.e~ '44 + &/blu>l&q wuuR2 K@@jVɖ>`Γ^bcy3RR$|$ 8;+W/T|? +EA)ݤYS /cn+`~C r. x䒍jJ,H0Dj"5VvF +"j2ONIL QGw3&Bfs]pc*>LĴG0,= L^vNF lpʠhp 1ð QbaL:E1%]{;< pVH&Zr9oNi\^b5O%ԘAvjY88n$$`&n$&JE?BEBIv7޴2LqH9K p +E6 ê 1' |,[e L(}~]k-+K @Ŗϛs,HKx2z.,:"B Ѯ?e DpM%LHHhMtwH:A4X1}Sc~T +`x~G3 ΊJR-a/ӡ ɰ `1c}I HЖfa`c&.G+*Mhz`e)]F`Ai/JLE/ڬ_-c킏/D2"ѱG(g6C(1hs endstream endobj 2295 0 obj <>stream +0 U@&b U=~] ;%cԽx5&rwv;&t\Ѡ~U>Û&/ BAhsyzDURxvސϖ?H*g1aGUr(z<hwm|.㫯S%|URִ}^l 8YE-&w_"6W\ űgƽ/rP÷#0LP,Oj;9q8{lIn+ ƨ+ljqb קVʙ$b[t?ApI)qX]./eIgAu W~i^܃G1 /.uDhW*MS[ ԩ]%őth<þႇcm8HG1tWk8\a?Lߘ.;~S[# 5ՅG~V71'ż_)e<K79zR~L0 ^ +; +wc: ԯ^ww D&6ɋjرcsCRoH8 ;C0EoS^Rɼp+ӳ[1Mt;-@ QGںًu jCIqV܈-ndYzrJ.!Pu݊y-{FR{rVDla52 &_}E']n&1$/lPOXX.=' 4br(W +!MF2u[Psj6&(qlu',s7G1*L40&-ܶ}YqHI"8KfG'$N>1K_eG|3mʿѨcpdΕ +i'av Cg-ю8p9Kȵ@8޻KXکy}kQ)aŞE2rs +2ۓ +EíΣIySc!o|Z;Qp{ǹނ0YSAgr$7r;MDv NNNtC# s+B)Ƿ\A7L"2VqRLL$pJ({]a\_䈟uqZ.}ϴyNH5/q$T/g䴔8r'҉i㴛U мL,NݳT6^JJd_sYe*=t5fnh^q2b; 1{[XfG 8#Əȿ&U :ҽ>Q1e%VH/]Ø{ y&fN(Sٝr6ݤKk!SJs?0C8]̿3֍ۚH:Vw˲{E&: % mwxȱt);.$ ЊWa}#|lŏ3Tk$W&I}SRK~i~ 4KyE}YFV3*BU/"YI/ +*-L=\"oHy{m_ŕv\`P`t[9@ {ӧgIg)kBy(1’L+ŠaQѬC JXiO@qv R=pҪLĿ T0eB('f{XgT]ǁ |u&[愋i1r,˳v Z+:xS($`?W2cD5žIEپ'ͩN1 +5MI)[&vs[V ysK%L6 +ZO.L8?%kUztD_.o9Ō3!ʾ] I}9K2\^NSA55epHYV͚OUHW@hAʭy!3Z@s Pj֧Y)lbskl[A7UU-/(]:80n/& ҭH)۩+^ +UHc6QCrAQxn 0I 5Qa^V{[VkѳM״}&rJ>"Qފ|<)Cn9zKYu8O@x-oՊkx:}|yY'@#b)ET0ҵoqO!S HX"xDߑčWx"^I YwyK]q  9q-eN_Ī&[)1,1]զɷǝݪwp4Fc.|G}sFfxb +Jmt+!`Ev:EʵΎ4C)*=eaՑ * J{&_E^aޏn{&Ĉ !qTAzfum|E|,M8T*ҭ}Di`hO*B$b⹍i'y4 LsT$qA9F ciSj~LrnUG85TW*zKRE?.HPD} n%=F/"zV*t0^*$"}#}`x+aJ  [y$EqcGˁ t8_[V6k> ~X`߇*Ў{r ͸6AfhEfDuH)ڂ/,QÃ=լVrRnQ( X1_O(mrV<^ʩгݿ H ѣȠ\ |7ok +i>%>jbtdGsy,u7iZ6ldꁸ"(^W*6\9_?DfvRwT:nK28@N-j\rj +y81;v?ʺ侧T2j- T\Ys-Dރ|303" Q,z]L,7^EAC)2/]eY%.1⺛=Yf gXxדwųtɨF9Qu+wyopTT/QC7 UwL̺=܀1ioaՓ$x̰S9Tfz-O#'Nxhs~sھM5P9[Qhqq!\7We&s>:7jI?4*0kLLUt|(C}5O.; gfD.?7ԫ)CtdJz_$8A# V_-O/wWl5_4%3)/vdmO])ˡ Q4-%Һg[9F@lj +n(=ѡLs?%$M_eJSeպݶ?XG_0;m1`ems($G23U.l @J JY9/%#BqAk'. pjf"u1 ֧q ۝:pʹ/rJ.c9F Ur@_Q&Mpx3kI1ҡԁ.@*̳^94c tj P6r%g }b\UCu*ᓬˊDM:zs T?dt;x )I[;EHPD[T +έ[KDR`ϴwQ NFE<!4nD<-[`UH]yۊ.`dt3Y61\FkRFưcg?Tsa1e,5t$dyIL4- fmAUC!&.l4 wCXXuB< p,W>mt)$'6BI#Yғhs +^f}.RŲ@ۃYX ,DpFKe˽@$u^ER',A{{q=+bf"n.L8OŹg Q~!~[ S tS>e:e8wa2t\9̿ph`Msm+JUssg'7]}nC4ęxTT8vh:VWG W4w2ޢZfu@ gLw:p_5BPB0[rUE`Y,ǯb{r4%xbewQ,M_ΐdȣae˼&bgha%']~ IX3[hݫg¬~NgasЌHp"OC!gpbFo@SmzF}LAIN3`em6 +(IW.{:$zlDaAWCע}2_l8?ԑN|s62}m״Ιr7Wn4 ~) |+w^J`:P/R;oLBgH5ڷ\Ɔ!*}DCc L~-(T"T7 +WJq ZGzˈН_ߠj?^!El<@{K4C5%|ژZ,XwE6rsJoj ~zw.+)G)§PZS5~B^Aˏ᠎gHg?n- :W)LN:a<~ٺ00Õ+AZџ43*R1b ,9~-uAY Ά`4Kl4%-rd|a fĵtH".TyFZ!xIoC[.+AXaeo +urbS 8O)*0Hqͮ爓PFYNFtr4VDK7m~@cih{r I˂ K3UylTLRKb;8H0VWr:_(Q:iU m'H>!%!dd`F&l) m[}jo,=@+ìd f.\˸%7I5;`]k4nMc~`10^a~c~_Agp_ pI?7RwȅK~ɹKJ#K r1 1,`CاK\(C Lb6ED3f 73YTy8a{^b^:#n:&ɟlJ"vwvYݰIǚ:* ~ {PN|;&V6Ut*B=7N?\d"W%pD(>+LkrwF+EOœIScb>O孺D3]M w]9^UVV~`~CՁ`FIN?lV`[XT&MۗUN#TU򹆨W0RPȹG-v_ +2/͜)TTtdugM%jwA8 zZF4RcGZf2~&dKR`SB[sx=9ّ*F}0^ʄ{ f2M,z=<-.~7:[MX\PXMsߘ^9:yhH^B>O"~7KoKwe k=wR܈ + +wk(4xky]o0q.)lűڽ +ͺ@‡XpQy{}C|I eZ, +K[ % f~]C>|R7;LIL@m7BqA-.dVTgٙwP˝Ctc=zȰד*QQް5Ǵ ]jcNYrz|FC%NdjWϿ1}Pg`DEW*׳>8;rnِMNzy$5 +6e[ 46saZ:T ={__XwwHqn.]#BK>kHVW&dyS +eȣ8qVޥ6ʘ |͒n-iH'\X/!w0%pZU0Z.?laj`1|+mS8Ir {wtr%铩Xi[`^gҟ UKخmӃG[kY=n 7Lټ, XUїFRI3%\+ u2PI~-vRoRsw?*\5c#aN/jj$7S`2.{#cT;vٮ pRhb ߺm7ktm8i-[ %݄م0h}ߍR zt '0fOZ^3e腓V +6\CcG'@H3FO7]#1XSL3w^]t7'Mï8]1`mb.7@S\+w讗aS#|c0ϕ&>I虲fjX9RZGla<nvVq&2c>c8j?6)ɒaRjPl"Fa;( + ;IՔN }a5Hu&J39[s Upv5"{wٞrF_zvvSj1@|Lq7,U|2/kN()LRC|F(zZ㑗q6{|un~OSqR X܃+8mh>({Z_ SicKD@A*ixoFXg`tp}_YyN r+{4x WRQ}ad/'@ݾwo<ޣO4G~}o\ q"gph&0я9嚁 R[ ThZE ]Ƈ(?$;4z +n4t_;(דT2-7KT͚2\^'g1䣋~^ vNݭ) +v$HPg!KXtlPM.ޮ,ķKpAi y[V, ܮ?]#7U$ +@~_(BΊa& *RQS6  'y> ӃG8G@0-tăzvϲSy>aPoāUDy-m> NUx U#b +=_7`Ӭx>8/ ?xɼ>}1&g:e]v2brKk:⨳czGav#aeASd" lui9PܓU< W|M@ Wjlʙ +*O/k` ] +)fZ)PcO])N]exCL[#j:{1 F vza!lyмsN̊tN_2|{aOL%IJl&wm2@X>mCǫTԽPҺ +͍\b'f.g07Bp@XHHqUsQe 7w%aϟ7O}o#`h|w?6GW* fB vFUBIʁ6_x nX#l {bDSb / PoڛV&Du;o3 j֔`D̙*fo4CVF"Owx ZeT +xSw/q]Rޠ|\T&w^cਾ9]WnvXOR[HslJ< +GPv|MCtp-a/疬Dؽ0)|Cγ⑗90|Z +ߓ(HV"w ]KNX$dvA*e[Šv\뜅*2@c ׾E`7>e~~ Gc$Q.}d!_g뾥|ɥ3]6K@u&G.%Lʝ$jyA2V<@@w/LB!$iDU_By:$H'3WѐfB#C/)G-CNt$!R?+I$^޿gbYIMum~kD S)Q0K._I51(XrcDJPТƵ0"9(>IV{@\oO׭շߵQ+MAV&r ɝ*x&x9~SnzT!2'*Xg:iC.`Af3EaPtOjE`C/)Ԏoįc";8V3Kˑ2FrMy<d=MNl4ueUXAY2Â|Lמ7SU'b2q{ܘmmTZ8W: +p'N"3# +5M^y9N"AE cҸZ{_Yx wОLW:' +1C3i&uuM' \0 +ALOf)/AgcXMi y4!N/} +ϰS"(Z;^i6\,i)xd6PU#=|(]6 q%pcdU fB4&EZYj$9*-=LjJz%Baݝ(uVS|,0OOvLZ1B(kzb/^b`jU +g]L,SN~\V +P0AN@[#e`֭lu/@>]hRҫ]A%]?70t]w a9fMx}kg 0sO%%t:1m׵Qc(֍7EXqΜՂڭ[|fqA`w% jB +D=cA&+ =mBŠdH;p=T>`pBuAΩirYpLSF U;Fi+ht@GmፎU!!7VZ~tW +g"%ILr"޳>peU@]h{*f/'RS: Dg؄-3Lڠyi;Uì磽}X5 `78uM 9"=(:o}cT@HtB +ض0ɵEfz x[C748UTt|yc8?ep٭rd2Gl翡T`&d]҈VOzD +:?bsgXmP3zCgM۫`}G#ɶ\8FIOT)uȀJU"'PU:&ԡ?q7kڤ#PSɾVGv O[̥$b&E <[bjiuΥrY:6X}5k;LzON /p)x`w(A*GԴ?))k,/,t~~yF<]woQԳB/oZ,ՋM(S8qPsx9RreSrMO"q 6~yl|sWu)5kٽo;r 17! A5?8 c!T_|YXK,r}=߈Ia drNW}ɔNa9u60IZbLt::h{E'E ][C-XF,j; tReVU&jZrv>0{72*+[vO ݄g';(̒nΝ3uXxZ98:]싂BJnpûrOۚb)MYL.3U} p2KH6BFZYG]儆_`9@ lR5{GuK4n6ż~XmWWf +̃HJXF8=\8x>5dor+TS%%j[|2^TY<p-%OpO8xXѹ <^h|qu-ص8iAҭ,.gʚ|(@v#{!đZ ^JFsϥb ‚/#,=)6 (Q@'tIKv3: ʮW?^G'L +TFۙ{gCjxT0l^Y5P7L|>ԠHn8iJe)iؐJE.fLk~9푢< xȡ*$jN+W* +Jr 'F?k~r[&wƿ&۳,&݊H>ҤC8Ms!vrM%ڽSkewcyi;/,Oxȓn&R]R(GN SxR@05vE);B@PI7kd0tv82-cP_XܱU_T':вUFhz-PbKXM>}mJVDD7ؽUI9)OzޅdHST'z&^>k6.E#.{G;d#2ތe=J73X7`~ôWXrKST^$:jS58XCAamyDΞ:d[A)ʚ\%㾘"6CVǒP)s³R~%F;*s-rSqv,}e۽Y/CIϙpT|&P*u߉Bp<6 tȇd6hŨ,fWFQqC:阵(DkxEΖOxj>~J+YSH pj%ۂ(u?Xu5G-O:ܘ_L #E#,إ<" _r{FPh==J{UfK81'\9Ş^ѕz9t;XFSJ͌jz6R谥5&mBmdmΎLsku`vlgZm C`.hK5Bq}X0TfE;7*Gőz}Q{+Z IVgqiV|B}˳oݖ2Bմ$Q VRO[brm]Ere\lq.z fx)u>?/XX2AƵW!imENQ헮ۚ +m򯹛)8] XkaB`&υ\!W6\tL:pMMfmZ#wt˳ft-/|l 4M.͂ό8UGmpF^07im7Er >N}0-_{h!k +;dPF QT-8W9KO%.= {XYo;ƽL(-2eآ{C y|@sx×r)Ы~d] .4h 9WO?,+1%0fxOPXA+AK-h^5˽$#`yXQPڢH6AN0Lawsv͓"Erٯq$P +4c>O]0{Kb#򊃃EǎguXtiIvVA0ڱ +R.WZ#\$lܒ2>3|ϟ +6]^ ԲEU[Lxe&.w՚(OSb$uڥv+=,:gq ,~ؐp~Ob),y`R'usF~Д +nMZBd¸5) ˎU"Fe[o +XE>^fPf=(ȕXsUh)$U F?^ یyqP  ^nƎVEKjB0x0.Qq9]n $2  "#GI@gy1ԈFH?#Я^_uƙC]`ަx~Hekgݗt!{D.;f*ygOϩ* a75HM9Cah1ĔP3L;HXrZ@cZŎ6~cL@ +Zx| E@יB{~P$-7fSG@xct.DLiheU>C[hr|pAX 3VM2+˚RVg5 u;?BUG2;1ΠKՏ{b{9KԚBަp^,.FSdrJjg_xѶaGm3P#Qa$#=]0aa|]!q6P+D[ލOc)[_ǂfKj\[)w~Y(1ȫs{wMsT&iLBF: +zua|e*+k{NG?kA#Xcy[ +PnK>>ckoʮr;l -K'ٻ~ԯ& {!DkƜFH]M\R\8>5TKS!XmHX|:UxE̚\2ehE9ґ X <--*2OhpTڟnu!4.&ΨJ;<*{$ b$x~ zD=r,0_ Hp9,"}қ:w)OYԘ)747dKl.;^ )mRp0fkQPݍ"RJ&jh4)|P}4jQ:;~']_7vԷD_l+U5f)'-¼Lw5wK%o,U񮦉@VK(ͅxdAA +?>T[sF.}M;/QN&NL +liKW4aj|My,Ls/ƧgSO_: _ +[ Gss7u"WI,E S!R] Hdj}jcj1m6D_25)$Y_PuF&Ĭ|>1(9R7Sq +yM σC}FQ g%kMF}G Fl \>n"(X.SCWX/`iw}!gV[BWמKtVCP ٫DiSӫ^Y +sډ!_O׊2&t.võg*jXJ%*6١ڿRxC|JZ@w:et}X'FE-PxFZӿ>JLJAv6;jz*"(E3 "l\)a4.S(!>ZO Lw_p6$/X]t=c]Kur(#j$Y;`6b֛aq8!-Źe%c#ҤёMu%8*/?dıH:JoĽT)uۃpP0E +'A6CeH(Q^oyh[J@ӂKNU~oT?ɖtA)f_ k^d-KUM>ӕ6c"C̆:qe=%j ZVes枲%HAP8'֜Dfm?!gI?EfKդlwmkwd"LJ疖rְ7+ɻncIEMWzNV">BdM]k~6A-g܉=!)$/C4c¯׶y+$|!XtS;&az#y#䐎5E&!q؀,J!NP}*;$2ؽ<1EEف%HuI^R |k2O id,ijn}uv.9Ǜ^$+'e!ʮIR>,G)e"Qqz +qJ ڽ8IJP;+OiH؉T{@ 5^ +60a_|l-,؊&>xy.'=v'#/J(.h@-j\nCDK;.F%TC8lG`\F7 F$ߟ6~3A-I9lZcB u\bH3n&u0ȖÒiMB7FM~O(B[H}'N;iֲ +o4O9f&jClU@6T_- `$FY?9$ 8dyo ȼ8V:ˀ c$y!'_Zy2x~PܻOO) C'&xEdiLW*ΰe,_l;8R0{k`AgP1(B )cRUN'so +~jq17 Yi<(T56r~P2ҮzhBJR KroΘLbL|9SRe΄{CBI&L,tѻƔoģʽ$wZt6ɮA*qb%oT3/J$6gA6lrq][z Z $A1֭9REߜS_D;24v|ht8qD5ǻJpIj6wS!b[f ^wƗJIx -drlS:nf WQGwIMAp#V %a 3]Ab&2l p~'Š?a𚓆[n̍S{I9 `X&Zb@жq::N eF^z*-vcScg>'(`>H^%8 rԢ2$gaIj?aVoC˜i1/@qEwR"#dң7<l{c{!?.;/KQxn1HoO{vJ{Ȼ7Z`+ %>=l+VRi]MkyE鴕 qz=?+7ZWԿC%WmKaGp$Ws{5چwP.H+cXu;5ut|_wJgu9F_G>ר6Zٛ͂($rz]z]5MIH+f4HXZ4bax,%1%oQfxnԄ)W̬/r{.e—^гmhRQ3Z0 $HmnRKd>os.rmPWRs/c!rs6ܹ7d}q1@ӿ !LӰ2UZ(޲{@X{Rb@*ButX^WM(V]OFbŕ=N *bx"E  A{E ]Kp uiv q1U5p N#><d 1fiedXUmo:X%R`W=IlBR]R>|9Ęc)}ƗV347aRӯj(?~_ͳU_f_[SmWp.ة%NNhgbnCYPBZKtXzuEAs'ֺ@J1duV!pQ%7r>Q VN}*+B]ua`4h;\2uA1@ʨs,x@&Whes!IWLNM f'21v{.3urj<<_).(8&qR|ޯYܥgY{\îjկ i1 |5ӣ9Fe@)&d/4Z]Uf +#_cm`o_>wSi(H$܄~1mNGVYyMوf |#, +X$M;l%[ՌOa{o$ ryTQi |"/,$It0xѢʏj@ +wܐ$]s=ƺȓW(|;ugy*oU-uV{7f2#wPTxZNR`@E4!1tZo+ +4j*g~nkW?'YOʰ`cA?iz$Ao\ܐ012sR nQdR\ydnKNVqEk.OfxeTV:fZRjWKd,uy^:MV6C62;PH)H5m3DPSq\UpP0#2!đr[ +=(RbmL;k-?jdS>GGnLIg$r NG5 b1|7!\!. m7FlMfL -A29rm4qX6|93S&`@UA$Bs2cɊ8&Oo`#>3&+LOpg%Jg\'&c4ZFz2MU}?%{W$n[Vj +4ؑ=nb}M>"a&h-83"4#οgqVM zp󸢤L>]j*f͌HX|Vu&9իzKu>D.-b{ScÜò%,OwTCVLP0t3] r7^*&K0^jHpv21+ HDr;;7vzm9Ke ؝}yI?3WIx<VrD]{È^ oQfq[adMKe{,_dKwoCx0-tT¥0(lK\,P zud̹=^Ju֥@8:dŒb=r dV>#Qb%:bRx3.[t@4ȌΙ>y|G>yQɛlaz?A|=aFm|Fk-C~`߁ofBK.O9݆&8@'Ge|"H?Lj($!]X]~تM遳sɈX׀G >{k^8m/9|(֤pÔh_}\3;-Fc#aH|8 +`D,cʸ!bWR9;Þ9 KyUHƔ\'̾Mt8屯3 e{H,"nENÿER!ھ +uK^ c^R[[_׸X=Qod $D*jT (xĘr ¤eGGz3f,\+!abi/ٔr *^}]8$@ Ÿ>Va 0eܓ NS;o}?\sJp+Tv7(U-uTn0-); =Ap[[#/#IR¸,yztϬsRczZ=jᱧ[ w?X8V8&- \ȀZaimDŽPX9sey!$FP }Wi;+;j~Йp/R kk:{2Uj V⚘:߾d(Bke)<":^CA +7n̈Qafio~ W;&VYQh>(SBAyǀ3-8P]@Qa_*"l(`m1OHTnTOca նU} n6u^7aEЯvYqC9K@t_ĀhJ)i;4Ci;NGse|%7Ӹ4hAwT`Q7..; + `M(-aܦ"SYϮ|]o-'|GpNxP`Rf8z$yGu=߉'7k37c`cτ ++Hʹ00lyX,nᇾ\ka'UyHƮTl<5a9ֵMLo*'Evb%9O3]?##7BS{[oTxiP].vr#Cd>XђVčʀriX.>s+saa_h_m}[qO@EKTfCoi(ՙ2 CIV D#aqڍ>O-%ZOy27mg#Tz+1ǂ#NP, O}JWWqFaw!Kxح/9Sy~XxӚ?Þ_R3FބuuJFFrH *%R; +B>|ـ\'<+_eL͉5.O`'&eZ_[->X8viʃh]Ka8ljRH\ %# + I~t1mw-}>N-;嶊ssr_$*uK꺟|TUQJ`Ϣ\f;]yU *h<1:J[AKop$S}px|*:f0X`sALtM]=/!:LJ*D&2F h=Y$Gm + 6͙52npas؛|9.lrbޖ{8avuv&RC>q,K|,;FP6A:7D6o#P!'3D '*{~Z~wQ`mjQ&˯0"IaݪFLsE9FE \J(>>mZP: Y*ׇd(( :*͠*m3;Z(ܥ^Du4S-+,9!3,MMo(rLiZ-BOs_Hu&*B Nf+">;5m$tIE :"I)XoVd C"|avENXT7}eNuɓf'Lwb›WSf)`&Erm߯4^cH.L֒ +A1_5!j7G݈5{wWUq!K[jӢ(Ru" =Ujo8Du?3S&B$}'2J9gfӪ}`2M]dw$Ԝ)Rq,6lty4m?,n;* Bi,}l1 甡3#17WѬII ,f3\F :1G\#>No^KM]V"AMd(G{^I{NqJ_^UV6Uh0zAR.hj1qr4 U,pcN@!{+K?/{иm2v[0sW@z1qz6j8X:Kcv~{4_V[2%x(r})}5#YH3`m뮎|aےKz'9V/kՃ 0h)yU0i2 endstream endobj 2288 0 obj <> endobj 2289 0 obj <> endobj 2290 0 obj <> endobj 2291 0 obj <> endobj 2292 0 obj <> endobj 2293 0 obj <> endobj 2294 0 obj <> endobj 2282 0 obj <>stream +HWkonAwb?ؕ,P2+K,߹{(Q%[H`px?g 4A8B3EJ?.><gWó'9g\pSc4 +e&lG<*f74?e/KFdj9Mى(x4:}2YQH_RrIˬ&ń`ӗ UlBrr 4z:"F['c5;fa z<Ox6-9Cmx2O+QB< Of^0.8ֶQB;0i50j%Zv 'Zy%j g_.@CRm(J5Ske">NkޥiLhZTҳ ^kZ[ϤFN- f¡ىy+;,`2GO?]\Ϧ_(5Ym"'/}ޓq2'=PjSNڸL(s +Ͼ8PD ۢ8+ijQ .@S\̾.Li*<ߍ'y[S{ FoOIa8Y׊WJRjM%k,IkֲP⯿eeؠLmXIu1u B('9Կzԕ^$R+DW7%}>ii ix9{[TIʃeHN׽ɀi[gc7_֩hځӇ鞾ZpthCB[y@P!;,4K}>@J r1vA`Xe^6S,4%'b +<LvI[Zu?~mµ qhKώ*Ma*U!(@+wex_VQ-M~`t%OgV饘$uL: ! +=ѩJs8 ]l |7'Om",]2{W~^)MbF Z)]$"-\72Zt'/ +[*;}2{W^^KNM +IIkrh-tD%pu1^&vCb=JgQ6&U~Mh4bh4AJ"x\BC?ꎔzڒ~##l-D"X¡OStڈaJ;{ 72H)51@tU'D8QftC^ҾghtQXdCK9}ȱVRq( + +>ܻhW,|×6`Q*.:3Ƃ~Ùyht=gPк:3P|ž +Fɭ`[]B飆E7NJԮHI2Ah)GDD8 ."ZLks|Kshk|&!t[XK5̚P/{MQի[B|3Ɖ̎cy{盓9r_؝4pʛr>ϧOb띮ML O'vKB{&Fwᮓm7@o.7P,Yn׷7JLBp 4&'zck\PSN> tr\MbJ(ZHv֤-0njZ^7(4J0`ҟN:(5Bƻރљ즓fTDFֿټb rRlL %FH R/1/B^KR F ,Iۛ[.;O^0eO&4^P̵d/ Y]-י! 7bL9iK(dVlb /1MHپNHh +6E%J( 7R/(~>ɖy@%t-f>ltc!ɂ?<^_o'Up=^SrtHN̹TOUFF^C[}fOIxh6(UFH +- 2f3 tu4 =kU]S!{D>C?A662)"\21ZK^~87kDwn,e!y[?-DXvk$ +6WA/|1 pxݙ^fL&wWvZ,U5:UIX@`y\ګc +ZR&헜Fw_a9c4^ƣ* :l5п-܂Bbߓ ϿO&tsB ڑ\ą j H0lR1N0z(eJ+7S| e>}J+w Ahl5ER#Z~MDOa*4>stream +0 U@&j{ Ua.2̎1QP&LOO8ۛzy7i]GJKY"zf Ҫ^|Ȭ}y$I@F,qs>񹒳PW!Bakdg6_KϒiOrAdI.zߧ6xY2yQbBOSEҳ+.4G-\Z;(ℹ$ +;l=G\݃kgf/_&W@C"C#8w:/ױ>;-tva>&vX kȱ aʑGCR0$j2Zt~lI);D: mQu{D8 ®)"l%ARDRsG3׊ާ΢t i6=zƃɀ?'Ɲ}{ča_ +ϰq` 6sx>"H$oJU$Yh>7 .972#7#]]b}L~YWN*{qӳY&Y8b!*u 5QÛ@yԷF E?Va 3gez i}` 7) Çhschu]һ:N)&}$TgNJW!oU6C՗I|'lU +n@pD@ )_S)$?ip:>WudLd=hf6GmƯvټr[c-N•mBUWl!^T+;rV@ ,y\y͞8 pcbܨ1Ι" +;- [z֙x#_҉DF*0Hn TH.ʫ GԀw;?PDfuBh-cr(=y}3kJ=%xs+scD&v2Z|Feڟt 6@51f'> _p8eޜ{㑆q`m!C[T̲ÑnvIۄOUHhT6R&A-}HeN*)&Ha[12v>AG +{oq z̲Wjf15w'[- |r^ST0) Yxr9(1 +?!J^.Q.lU0Ԅq4&5 '=/ܔW yJYػޭ Ƚ`b–UToޕJ:ZZjB@U,JMYA?!~L!M FnBiyQ2yJ_sWp(&H @}1/y\>uז_ h=w\!Bz.>N8K'ĵ+zP5av%~* )>P.f9nkjߐ- +zN%4Hf NU2eoRy2s' +Z!}Ve&5<)-{@9*Ws[a$f͐&P<:؞KAHMEꞯdyVe(-to`D<м3 e_[,[[N2>E|Q" *kdM艞f>Af {&)DsxVS$pѡ,Mō<ƕUoE`,j){յS_\c9?xguO (WLry ]$lӋl!TQfwd̥R3XfߛG.\v n}2z/'B7A%ϴ" Ӳvc$mI|hsC7=J,ȋ]{H+uNdiLW" ޘ5~G>M;-V I̸ pA|My&xiUgTgzBK3?ZNIAQ1A#%!$)_pX7TRQ̎ :_=Au U&{8mYQ +9JŻrP"a7!nv5PFyR`}~$66E`OXğ7_W;ҀNÁv.0Fnact Cd=Bv_dq'|Sp?2ra"V?t:g/fʙ'W懱qN.0ajl c#:3mm+N9 ydGE@@x>"K+5mmz,携crS嬌nx׻:wN#o f˶ +`23{ 7'#Zs㔄gUwV#"(9JtCQX9[X +a"bb$;Dk h+TNX1ıMpN{mb&\Jd#>@[bZKFa/\jocF w 5T~D,o׃3e1nkc,k*զ1h onh4/K d-V%1PtBbg?J:h\ +{4oEh%PJY`zD;; f&eQ?aR®u/6aQ5,c@m ~ȈK c_ºE= k1!O<G$!}ڍ +API q u}Y:\d *\}A&A%\/5@ 4Q'SkK8 K10XߧF+$TG]./M%б9qNDA2òQ'+יy[NٔUb0ِ9jPNoFxp+qoWT/D5qLm[u] + nw+MhmQC} $-v@`g;0[pAdA0F-I>\JE"X9 !/*@Y QFkjzDV|A9dTzs0+tcm`>JrV7m[<]f .q2> Vh|{cX>)1/F:!sHMCȊ…ô<_ijď,ZA&2aX]{fAŠmY ΝCC1'#>,%,]th!Ğ/(< f +AYoy7|]LSmTB`:B 7V%\GBMr YƑ&Z\o?*Qd2(Gͺx&Ʋ*t9X[f }naXlSZהfN+Vlܑg~LK앝:8aEmC/=r,Խp^yco}ep׼ArqCc˙% pSxժJk㬋sR,ɡ9z ʿOWlЁ5}M8 ݥLb7)V7 'ʑY:^PUh.wZ[FzbOkTpUx+;E=)H(\^{mO4őѴdWe/97uJAtugnb֨2*&ë[jjWӬ,w94=JC5?y3̋7d[xR33 + +%;~Eer)Ea(ڥh*W| M˧^z靍M<9+ +<p c8zlHZ?}#QqQeXT(@rs_// +_"di zb;Խ+Ma G_qb}^ Ͻ=KÆv4qM6QVp#|v0K]FPR~LPGPԘOeIg|ׂL4/pǸQ} 8PGT&GZʙ* >߇aK}7:똄6! hi93H֢W)Ǡk9+m@OV|xHH-T1r!B +rx +`(6d=!I#=GEqkP`5mnS&h:udCnrjb̿(s߹K+d=БNGZMaf;P^ %ӻhs&ugFfA_ ΊV ZgQ̉IЛIc'&-h\Y@0'In^|mҥd@J#?رo_n"gzRp^`&$􍑨̘|UpiҖ +4v ٜQ ãgK0h4K&j?sp|z +G|PsN 'gd>X|Y&u +x8@{;pXs[5Xݼr@9sсnyW54Sݤ;ȹrVHq_d@@HMGxhا* pqf%,4z<~lb=YZfiBӘc`ēԈfTS_ִRT7Fʆf{ӻ( .V~h>BY]4싘u/ֵ3D#6ŀe\(37Ŀ OXɓ;ʶ0VHZg XekO2tFaǫnމ-܌?Z'hH +g[@\jT\)px2:WH'eRac#[J51 oNjݣ> Rr[rYRe_/ߨ78Y/QFX T9o1[ ʥWpv* _}IPLao(uh:Qts݅bvD0`nSIuB˷[bXJ7&AzFUeZy; Bf%kx蚼A.=0 ^8קkY*L79[]/(m ɃxHL'5sI%12XE.Gio:m{N{>ή_I!&?[`%9,ψ%4{"*/,鴇lDA -CH n*D+?\qߘ k/DkD\ h_jǸ&(4{RvͣC\XKC `*KwIJiXLۜ?%? +g\z_JY:gcx`t;ӏ,A@ #uNanO-RtGD!s@x4ε~fiTך޳kX|SZU ˣ+5a|4g%d&nd%nЁ,=Z8 +)D ǽMO쒤07CLMcWiflɨ{5{ +Y$y\(f`ƣ0E}z)gգ,Id8~̀\9>Oۭ"asQxfΥIa:zhë{x{9,.<ɤ`]Kk޵V#Z0VI):j"Im3m v1ƵT$Мnb@}ǧa2LZ%yqY:M8HCtR%ԺT +Cj*̹Ky0ɑhm(7\o<Y5&L튤25TKZJҋj$GPH)Tl!~-F-97p{η }Vl/q=dbPb'C%us}w +!^@Z%,&9CG%91[˙F,D02-Pn) TF Sպ9!F͸6-R4vbr$E'<B2Bϋ> {H>m6bHB,iid!)Օy"{B>c,19ny2U4q qbXC2וcN\;/ +|"yFg2|n9KZO79*gw\OxeʷmuYãKh'A]o7#A ?sw+)@sC=/LA<@Oh沎+ye騘'W;&`i!qkec/ISѕyy*6C;ڢQ$ɧ ,.Z1ȇD!Y G! pFU< ;;dt>H춓xRv ? SPf67S8-V^Ӷ{zUxCF _/-M.7@vA2V72N|Ye"BlZM{:V[d%.(#L 9R4(18 +&4*m˪tz`F!03PN>wO$>f{xQ;%vR&w,16c 8bVU)& +_۬O`=m +4zIm +_OC +>XÂd sxD!COtQQi\]Win$k'sZq2MfPz4بO+?SS]R.C8ORXK|Nw,?,sqiMdH(o*>N<\A't!wS1;\ƫvV"_-A2͔癐]jν*DsfiovL92ʷ2xh:.I5)_z5|y;.g892[zS}Y@X; B# % ݦrIN$0&\p'Z,wݾw@nCg k ؛%Ź;qOl$okpQ[G5vZD's&6|>!d2f'KvNu\IuG!_~ '8!<<,-ښ9ܞj8v?4ٍ*8lC;F^`SW7;MC >U (`1̯oM|bDsx Jg%eϽzq=6y ?*M.q!%1_!\X@g+{.#l ?g#6P3c] }F}-=(H*zlg͸/r|TcF+kMJզ-3J/'vR5=7wv:QS9T' +'j!zttz"A㗱p$LE:,elA rj8O=G噗QZR3p~IO[Az[}[uI$M89qv'JHZ7 4! rAyx8Z2mI72{#sa椦:oFVLBav%"Vf9J'% +83m;[%]vwkh i2F,%]%X҈Rf^?%)P_Q|_,-B&*=D]9/j&IfE+?Gr]f"_a3Kv I}=#-٢vGU-f>L\愕Mt+r' ɧy\}z:Aj-I5j# GP"|6L0.)`AZhU8T =nsqAi +&:-[Sod!N^qg]@܀_+}u:ZsKwu\pToKX~?N8,3E\Ds,)x*B bS># k:! ݃qmMɛo#7أa+KE`'_bz +8(DqçvUT,‡H9JV\ƙwvϿ:WQ +wF]K.",LJak&$p|R9iܔB0)3Q,fnP&qi}b]G{ +5mm)e^Bh(<_nvqkmW8R ]4 +~=C71Je~*GH3(.~1|Q:_rc רHtZUA6lG`LvO:Sf캴U{Xh#`8Mtcw"ОL2[>1{tfӖ MX T +s@l0XHNvL8-K9h@~ \Rz?IKr£h>:O{VXٕg|]y`$P~݄CRTeR1؟cYϛ͏ߴP6lh5N;BXscű!_N@.9 h!"z(+W7pbmmt}$J|ŖZb Ul4- .,MA.[NYOvE?RE[U TRI0ةf5|B'-@FgT$fHQN{XXMͽ{ls1rlp7w=>6!P[v6j(;u#*FmGRҰ[䵞jp +T^I$[bSK=u[smAD79`][8e`z2sE SDh鿄}ޯ!#B0wKAS1 M,0w] XOԗ`V#v7 +py8;>l$l%fAVT#y`|Ӆ(OT.¡@sei{Şsf{lWw¦nbx]+C0W no]7|8" H7Ur=kr&,>jg%QWBEZg8#C,)`}M#OaN[)1o_Grq)~$ޕ9'gnؖO~ GxuI˖ +l4^)PWolx|7M5܄G#~ِ=o<(J|59O|DԹfE0(/LuQX2&[ℨ,W-]i| dvݷ h( .]Qu>ԆN υGֺo{`q3Kc#,b5A)q$#[DƔ=5iwqz5 +3jCG`=Q}ja]`C ^V@3^ 5^a0cGހAX:now!B?u)'RAMh@Jhbr/I ˲܈kx>3WS"hا~Tm׃_x'.ɿP(5oyύEƃ@ЇHQ_Ig-'5eU $"K"Θ {%{PBX_aĿ+IA pn@n?1}t<vA8X.%_pZ ',g"6^..L_nHX9)ِ,߉dIbiujG52yRo-18>v>-r8"`YfCOFw8ëGX9Aud: ]ǍŪfZHIZvEj3x_هo8`0v߮+HG2C**YV @!6p-dIlB +#qiV(]:Y.uId7/0E/HoltcraPR`Zjwagjv ~X}=yb:"%IPj ue*YV?ѷ_6,e-y?"S4EXMEׁ,GH-:H3ēKuwc߹}:' k໔57%7A^k˼ mM16<iʶ-*ٱS~DKsz;X sИYڴ-3IGGk1bsU/ +]yf I5|cDLLkԱ"M,`7rkFǥ;`bM#W+9,lwK;P2ZOdVpTF+ȯ ?ذl;eϽadGR(uϖq-fkQm,SZ@Kjl} ǧVwj#LdL55'?riɥ XY$IHa$o7WbSQ6\Rz\ qK˂b7RgQ^W[ +FEU0$auG׿tUѧJ@uC7:U,IΔ¹Kښcoѧ~;§FB=:@)vL$P@M~MQV3v%w] F͇2d/҆-٢sM,RLꆆ{}wG`弥tIc )(}dC2,\U nqQxgʟ'?Ҿ^6rMD&n'5ύjK#,9ks8hVsIZt&ùPFIRuo9*<"}Hrm+FJ2K0+;^~ozͅءDrNÐepw< +#~ +3tͅ +M /ʪ&HsQKˡ IӄqC,NvtwZTlEX>8H#8%Q!Gbpcui"iHS>U1s +]Iݚ9P #K8VI^YXZim]ZiSE}rGG8]ur] JREr&2Gl8_ވbε*d8s[b(5ʺ'>^unZDa#O6i,*1^:^=w %+ڻk}KVqLR#9\bixv ,+ q!EjvׂhQG;i_^UuEx+'ݙ#5<4Xh6Y-}͐$Cvja7f==/P|2m7W!^Xtމ&YlG̑,iuƌ){bO bڷ&̸3دқ׈񚚽~x?ާ}c\i#?xPV]s+']QX2Guku䲌70SFHSSh6d.,=И>h#amQZἵ/1h V|؏76A>7l"wUWX^Bw@̩gHE2P>Q;GϽxΓ;إQck#2!os +7abFkD'{`%8Ev-ou{t\:[)^&V+5?r4W;L gK;O;=ѡ:^R>z' +%BWބQC 1!AE;jv:SϏ? QQ[%00(DCD4L [J{\$yZi$5_! k\;WlHjSq3rL`P TXWCl]Txˠs5ʞ~U$yu| +UY.y +\KrJ KYmL6mvVSy=_Pz1tUbLcƑ/)wh1P $ZK4%{f'UbFOE%q /qG뿨]Њt.JQW@,_0^ocVwZn&* 6x~ЙrUmRC?$L5MJce3#QYJw_e|,0z!j6Er@zJ*˜"r5!7P!ˤho.UoKӘS';\We$$rjs8| Oyi(1]->=FyBWכ%Ex{F64U?Nss{vF;tM8 $O!9=-H1  ڹ"b2ٹZ7cmrV!kbb4聰 WR3 v,CպrT9qa9UBV,d[0Q(gvOXӤ֨f%NxJǮJ<w(Jؕ}+ z '@<+|auhOPm[ 2D-uݥkNP +?1.'V0h,iٞqLLx3t TsD3ZW̕`YfbZBEO`Hh;\1PQ!9ӍrvE{!oR-6Ftlc +bX3ٿ:`9qN;L|] ŢGa^W! +qgL3 ahjD++6X`cZ94'H h՚Oa30cԱxvM2PC7?aC"s;Z1-]p,V;mDпluǵ[ )SwQ~;'`2?d˞,d9O,"g>'/f41Xh&~@5j y;hK4s#"1.[>}R( +n'S-:|kiڄCS_]F}Z$7>-&~}HH|Go6F#lp AK5!Vˆ,_lWk偋܉ş$D]ߢd(8Z_R0яZhVN7OY ed>CɵeE )tqbS?bE))TQ~sap]M.v#Ͼ8<@z{3nʯq1id=4V1#y}O;:BM?Gu}4 䑝6.oõ#Z[U[(9#Z@ +zz['lɸ& +rxTtԏ՗:M]f|Ϝ  VěH:G!b0 !Dg0 &^ߡ} '!! q}IJo,)Qtg )MpG":}Jհ i(TѸmciJ&E +ePWk0sD@~} ѭk`L?}Wg D^Su حq&b:qEOq ivUl#aw-f1Rςl¨O1 +6Ohؤ0 +APYp!昕O79h?b VߊZů>} +d; ȊSnL2!M5{JVg;B5✣c"Ve"P R)Hba U)N7po`]uo U6_Z଀Y`H)tlf5g/)҉'X@T#*Ȃw$lcB +'tkåCV%a.H6B&Ѭ{I*#/@Fw;" lƶM5~v.&%HtiEYc{r3*0~Xq.m=LV0gӛEώIJ!t?YtDC□g^\I0&hkAzD/bWhԭF}A6VϥG<N΃S i oX2ǗFX:6+ғQ5ROCY~Rc`ۅx}=E6y?ycݻeL\OL^JP3˚Ϡd׷p};U!JuvԹ;M .H^YN3Poݍa+8̼ږxT^tS|k%bWqwij c)i8A_u5o}Щ/;z;ndB'B! P4ҏyG,p=Cu%֠G}I>ju&A'lvcnz`kcu!323)s3?EѡRS-7W!Dqqٟ05ej$2ΖAO0S9> uSh8oZJ? پ֫wM +/sλPO{3?݂B qXWp(I:|2,=A@N.8o8*c +nGiU7&Bm Z\[Ʃӵ+$/יՏ; /4?ͫ\ĉ)C8ҽS8( j]bsLl-wu8&cd?;Lg9͚:QKpJmDV(hUB=)G3\خsו._ A*Ks-9{)ZXwhqM1kU(ƚ^=\:@ #R4> caE7%lj:Rӕ2̖2,4h٪I[CiQI1&9+N!p_j58d?cuNNU<ہ(&"HmCU_Beak.Y vQd {id2Qxd5 rv>%Zwپ\6{- +Aҙ4r7 ɕ +gf +q nЍ +a +8w=~_N7 O +`]؅*1k#Ո]ד^o?OzB KݸNk"=8E(PhnwCi9nb`_ғvqF{1|JJukJcϘ?ZقBG $t6r^ný|B; UiDG ÓsV%Sdc^瘞g,C)_WYߚ)[9wHnE'~"T\[ZHe36hۈqۭ?YH%U=v-Q,1{cazG\<½S+5ԋ䢹8.E 5MGRL"e+;Lh3z/)0&'k \CeB#MYl&W`g1Qni-p_YҔ;v,n>4~;U9; P~'?zU<^BP<BGj8 Q5N~{嶾B TH RQÜzϫHgǰ5"}'|2к[8#O?2 g~~~ JFW1C!z3wƠu2&Čsy"x~qsX1s<2}`>u!d$^'w͸|  |}y/)ơ0Keapk6"Q(|+uu>.bpX`=MWQ>M[<}Ӝk9lU'%|lacEF68YRZAas!=lF]q4.? :vE9#X.^/(:E +w77yd5ovՠ^\ f[įALpyO's]FC[AGvbnnV˩(*r*TBTo۔!C緞,!R'M75+z,yq?NJ5`=L&5]}cE~ψWm\[h %^?5T1'6_6=V@aF螚 0Ņ;mPC֐_7ecyY}%Zc߃2*?R#ȵ7N۾1= &RRՐSzK.йHd +;N2JEˬi䟷_|+ +b#x ߬OʏSe7uZmkDiiS ĸ-u9ܾUhUBx&8ip=Jք+'Jg6V,"]/'tzac.eSm<26ցg"D)|6(Sp(?mZ26ȜP-cjcp~WMLZr:Va3 ]:4\B}.LUړZ5͡I%9SސuܡW?ه7?C27+wswK@j 2@ +%xc?q''8]ʹxmV)ƟA;v'!2vc)MlEq3K+?,tO);+#"*OY"ؤUAgaCHy8V{% p/qhq צQGl,yh.g 2>=cZ eܛTx Щߝ*η#TbT92 D4=X~;Txѯo`)@N, +qkZMeoie %mQU}3KNYz#:]Gh8LW~\̊2ߺ 4D{lw0L, G{+PJ+`l3nwySoR/s vZ!kJٶs a v*ǖ'Q px|3q/L\br[MR˥t+Fw?;n+l\I5~*'u@oƬ(;9IN9U1fb"U؆'eolB裵5and_ +S?KK*?α(Ɛ +[>~^BbtXajL0}=m^o, ll3sx:<6j`%q~04sШ?lB| +ގf84Si] K8WScP +@=Ʋ9aEY{5g!tJ*aJ B1v; -pJ4!ćnjRNpbސtvF&=U?rEn\ +Dg>P'^D +͇Y|N|.h[.KK"qi ^u oJʆ&&-1:Ps}2MA/B + q 1ΐl*B tdx JUS%.]ᡶ^5<Os/%h! `߀^: YRјAZ: l[?͍k\lU&{^FH [8BYv,ӹ_lYo Yܘf3â r ~T~{ JW4?ƙC`mK޻LoGϐ!xBMvJ_#3 :ʂ޽uOR Q j3!#(ߧ@=ӗ*RXIJbhP?uN3@\vq+MPRvx1ؚ4}!RFD3)N ϩ5#MaXN %nB1VCaU.ƌm4Mňfx)wBRu D_OZ@ ? +>.] )pC;7CdRP;wm +08vkYhK!eP] 涵Nb`+J9FMR%vsewDW3}YwE]o2}֨Nl݆t}H{ƻTC#Q*l%kIWk7(S0~/rR`Xs7[;y<Io|QAORsw +ۢ8CftKm_[>J{3+'mHLIPvpXkG]aeBғ,f);@ SG/:`ﲖ nUYVrbpK )%}goj/es/_0[s _bBInů𢮌-/:B(~9m)%WNȓzk&͉[: 2$ 4>}ߴ7"-M˕/0OT`<cBǣea[5mhۊ3qjmYy.N~N9  qӼf`_2ui]J*^م^.ܛ8Rs5N/55Ϩ*Z-H hޘu ӛe [D s!YF܂%`Ջz 33G : zJf|6,@4 +fa#{0v&)JhD«Vt*4>ۭ`o_HKw$ßv!hE`@`F4LDKR%i3*2<`RNuT_,tue+9׽1$> -\\GkjQ~ +(_Tϭ);S}o*|^&~dj4_w\涃w.[ӯW|fLl'R"U!?ePl8``Df]-&& /[sg(u0gиjq#i"y}/ga^1eq7'? F +6@:'s6hTxg1R YQ~Bf[ӳGh͘$G7Rjy~l{-=&XK|i"o{^A[aG/b-)\J!&ӕ[.bkj;PJJ DlTұn=&VPJ\f|M+DyԇbёM(-Dɺ6]`a֪ucӸtxpVn1ό6fHJOD-}͘#ƴ+Pqn_܂GL*>V$o8D#$ +wBUT1GbPl}ZecZ[X64<61pҍ/@Itg~S7~v$7 ~ZA@2tF_4Ep-CSRAK$0՟ܹۨY$URq掶M3n܅A$iCj-8oG?QúQHf(Mh@vmg~~P ~,}x*iZJ]HO'$Y<yjiRM3pBXl9S7]/j l{FLOH,Ӣ ioďw0sX~+lv}¿\#[: +s,D*SO7kװܬJ|C}2kiLmD77ZEyKyɌ]]AV.F~KE!DpwSdq6Rrl)3Oʫynv'75׫&/e78Ī zaۺXgCq&;:!@3rl4V b7G>,S!j>8P +ᾢi ]! 9[ɼB_4:T=/}mHڴDiw`?bMwٝDr_BrҖhV >QRj Fsk./4D~edw Bn؉nj;0"y/Pc[o9˄רd(Q$47y 8{\ailГ%+[ ;QH(wfƯ)q;VOdžHk`)1WJPM9@ߟs%8s\וw"K]l`rU}}OyUZ+ܸЭc{xHlVϼP;8:9;((S+t(u +8e"]W&I[Y;bD3Q1mUWbX/X#뮷͏mIΨѵanR=Mf/W`Hq.Z9?OЀld{mЌUފ| !#mS&#x/p#UV|rk`ݡcW3Ձ=7RXycqxLeG=A7>AS&RMn QR-޶>Wak%8h q;zūe O&bD'n endstream endobj 2283 0 obj <> endobj 2284 0 obj <> endobj 2285 0 obj <> endobj 2277 0 obj <>stream +Hmowl=rIc@,uH;Kr"EI4b8fv?')urAf7*X^zyrMl|*bZŲ\X%mX}c矋M~?W()tklف~jC=G Adl%3]s…?],~֖E{Z{rN\sCKC*-UMc0@H6>s(bTdB1dɶB~palFp%(FYh:BЛSMmiJvw?vx 财!nxYUl7M”3@%ZGpI*L# 9E%`e [UY?H}IrQCg~i,$az]& {*6U^[nuU痯ϰ_o^/!i '~׀Σ>溃I/"~W|-/ ' rMxoM F.B_xgVOQ\4uץk1"<`1`o.tMB@OA~B;ٵKo% B~E|Uƴ\el]@-T7y!.Y',vfYup QKקc‰>f U[_ˈZH֤ʉ7,$q"}RX]o3P`re +|MGM!Z}Aav f8DBߍPRA.%꠾*nJPUo~"n%B04 7Iu$ <S f[/f*t>Fm] p)Y]m$y*qi}zc&M2cd%64 +:6:O=TZ!?QZ + +VEU7ޜNe4g-ctAv8#Zƽ7eg +':NY#4 PJV+c q 2_;ȵM6d;aL;Yii< JÎ1!bՊnOj}DleS9}<ш.81s+rjpdP +@,UsܿL8]2:r3?c;y +iE%z +AOkm^'n*Z&H<('[ٖYu4ThG?g;ue*D A`а1]jI `Ə`Ǽ(07#DW,?5 0u95[e<=&oz<dS(\dCQñZl})1 })?CkN#Qnl&cj}$O%ikBpMES2"ʼnJ^Nxc0SB 2)S>6?4SQ ~s:ӕQKžշAM{p!/_c9Nocdi5siIš~鐔7G xZ1lIah3& -<] Nu Ɯ +~U˾ZY?D2 +Taa0U[*Ǒ&EBx紻 U18Q[e}$V %,V pK'ZӐ+ +خp1 G3o-&`4Efh*! +{N$bqw~0(^&Cx0΄܁*ZCZ%6ABsai//a2^=I DF8MCDc}W$&I'T314 + 1+|El=vXaORc1esfeảU:B6d4>#޳5`:s`-lv"!3k&󟞅*6T;osY9Vh3HVF4J.sZOWDM61ƐlmYUWq<M%͗sJ" i(kJZ<"Y`diFbd!Y#ydft-6ZJAp@ŒKwUտ*X9:;aqyZci I<;ZN N]oVU\A'1 ASۯxiʁBryXqA2E׼M$CC/0zg< VmYJIFl(,UADlthْEe;K(Q@:_oǻTкrMwܩ4|PDu=7^E> endstream endobj 2281 0 obj <>stream +0 U@&b U_WI>BBڱsI.ʜ?7WKj>gkq=X|ڹ>,$ljU7WXZ[ ]a*GyOZ2t<'JKɭq?"zV;} ,]䨛^px*u[ҳ NznjVŷqN.ks:ːA]6p3Ml?Փ'X5^l4R 0~^x*UlMy6|otQin"GywH^m<6@ vMv pFNK0G`Ul͌ 3AyBz5!]$\OՏ)H sD01i*jxs='kdO6h?d? #55rjcd PaL-ʢ,= + Oh +)c')sr 53Yw\D?bh8LVufp-mylx$~]) ; +)\3*aKr;]?O͟|k ʹbi 62[MI#cQHl ,/0CU矮JE$g~ޖP۽s@JgIa7!'3*.ֿa$~֔-Ӊ꽠J熜\m8GHRZ53ٞ:U]m_ )>3F}5yjljcPo=nfGX:W(Ȼ^,~7^Hners̓!IrhW)_*wyď%$ ݭ?8>p0W~3-TZ=y$r&\c8[l Y\)_QӲ!I}׼>`_;RPq0G;0.8$q/X(ifJZPIkM^s/ag`D3p _ +|k'S-e"ݷ*R@ŌG'{8Eh(&iؾ>e JuP/`H1\0^̹oϦ} LFa =qmvC?9[d=*^aýAbTy f ] 7W|SN1Iϣ3ۦdTk2@>WLO( 33L5*>rqH_ BQL}ۡa,kэ]zA`LƒLW.\΢\=,ƚ͒_Nͱe^᎖L*b^/o*>*Q; N E}}}ae(|cmG0:h '+|qO8~w +MĨn9W&thAcvl"9y1{mg^4u?C:CRk?2G&|^ɦz#'cߌ B,¥ɬ['^̰~̬v*0OЕEbq@Zj%Hξ*r18|yם1~CAi/`gUxnt˜'Sc"iD\(HK#.qB_PpST=ȥ-3"MF mHtL3Ğq6Ί8y@~Ԯp{}T]WGp$P^ bHg[TkclǴLkpx msUN3 ~!AɋS-,};@;$N6|^ky [X6w0'5Q2sn#$1L楙 r?hmPB8Z=ɳ5cr} +@(j#۠!]oL-Uk9e%䴌FWqa4f}"E4[/%6o2:ot_D (qM{1Nq*eN_EB- Ln5]\ɜ #ڹi/r @6j8_@f"o_x/DSLpUo6mjIuH Ɔs2r8*Dp׏P ոR;w7Sof\ bS{mگ+>&'fjMnyN!'H]cƋ{Ə|p7- ,`'G?:-Ȕ>Tbj!U8Y%WzDKuVzؑ5ٔ`w#aɐx0(8ce^A,`5N%~҅T">i` +_皆(C:L*zM%-jUλɸ")\7h oS Nd,)b.p^ d\p0˒j Ke4'6%C%^qX{X9XGv2RkD(6UoI {=lj}}e&w-(k96J$C+=< K%^VSS4ueu23,V!_޷rO.^Gwo<g"~w&fX{qm0Ɲځ15UxI销#՜=V\UYG'7bnv)ټO҅CL^sYCԼ}+2x"M2\+9 MLߘ" +bN7d}-5ßXJ#odq> &#z9GI{ y@$U-Q*_d0 uY,SskJӪ[ɒH:qtk#3*UU|33?)Z6`JI`e dH1K}^j 0|U8u^+mIȜ>CmK˚n𚗂Ԝ>Q[1CodPGi>/~xmU}e[jV%Zd-)28jqVԍ{w)rĂr;a4DV,=}UfMyڙ +~OgM`|6 {.pҼEٕ2z8P\c05wh@%U7 X.YcFnm-z#iN?<,@ }=V7"<56@ho+e IGz, +LEH+"h)IBM gztYQobH(G9F"ri7;dq + l%]^ n+DWpsAؿ5K #+9yFxĴO5S-m"ݲ _{mFj#E/C|WՑEMmopng\w>"]Ü^9%BR4?p1r_<{UqjD`"Z ~3&3rNZw) EJ>?%1.s4R pJyj*<+źEi>0V(_:/я*g"*p2]X%-+;L?].YMQ=.^l[} q^V|SDK_Ȧ`58֫tS┴o&AY{տ=-(v {xAh̾ϰ72]8I<+U8PL-( .O&G^Ci^9 P]B6y_\&{J_n~,<;:4RҀy.dOc;as>\iB!G +ע E` m(/%yɻ GlQюU&h';ՋQ;qBbo[5x{]JڛMJu?AD(Z!7A/)3[&7},*F Kw72!@N;/єfgհւW߈ߩDm F-xxrE$E#aX%.Fɰ2i m2)&s"P }@ 'DEfi_wzvȥa2h fB_Lk.e6 hQ[McC+8!mbԱlວ")OƁ4 :]xp9.r[F[%,JspU˸x{4(d]OE-z" D;F._xaC/},;z+\lAoeݷFLE`cI v èDŽO>q[Cg hI^pT^jO;RL`UڷD>,}jz^5X{7$=&~0HoW 5HPEVFR9R22?1=$C՞ 0-Y $Q +]0l^%0a7:Hڋf)߬))B 6>ַT 2h6ܟ7 +I2*hBXlmaWaw+uNmfs܆>.h([ȯu׀hU .P]gҽ2u+_%Qr1vڛ#˛&{qAD,'Z)ĵQYEΪe/ -oy>,le@WIz#3[˜)20}f@3%j.X+~(CL $;M@zDFr)x%H7sdpI5UfTC DUyQlB醎.Syy, +[-Wf K0˙X .YdA|`/\lӃR}IY…Ų6rT2nPq[R\erujJq%jG='~YT9N|nKP [8 /c˒*Z}OOPi8`Y.crQS*ZS&&G{Mr +aZ}-9>S"5YH|XH]^"d, óQa[G6C3Jҵ2\*651Ўߧ9dzOFg,p+@?#O[&"qn) +#49=l9e%4sc;1q~i# ,~Z~m+-bGyE-6稆O]T7zP#R7/w^rxJ4!(~Y9@єfow 3 +mFtY/f3 x\0auޘyYi[cJS9+%XlqJp0Ud%[MT.\_(Jl. zbw!ɔOp m^b:,S!!x/A@5n*&`! $%S/;yQUx zℵp޵Qnz0} *}uV J\d w?qCLO6 r1$~(.X-X QnC6e}%>-STr&VL+(ĕ ,awOqڲGøz@NRҐݑRC\Ο(Kqx{kRD?ѡ@Rw4h|!m k#I x@vu~rA(8<^dnc/-jMbA'%0_B8Nrlȴu,U}RGr%fI#h7(Yt2O~7m6EcVݫh++v]ѧW-8Ƥ]JIק.,"~F}OYWzR磻Rq4R<-tS[pӯ7>GeJk\}O +l;*lX"Or9\6u%b$FUy=@ NPcGUu4'PKAјb830eF#;RrS I?Gv;n]^oQ' +,WtyOS{^L~OzMrVkU;#OJ뷓U`ѱdU)Fanw_K[r3ƜM U/lW%8ÇXv Za\]f蔦{[(l'III?έs+Bvzy-ِ?pOj˳w-lb !Xx @O0/W(rc N'ag}պ2'}Wǿs1-H,/Oj\QMDYZc4f_TVN4T'ͳmf?QGn;Gwa;b)@ȚKK +2{.QXIZȔ 1g1 TcPIb2r6I E 9'EI֍uΏo)p\ͯI4HۮMS%Һ\ckJ t<\5*851g?B?@!D1D\PŦդќ`Fnؾd8:᩿s>wiن OC˜^tF 5~b}lE؎BN˱A٤y5q^f4аb}-V8+wj|s`h_myi rbAܢu5\tB /[[8Y&q + @N]㻛  W螨9n!ں=3#6#u6{ήvjElϩQʠ>|<<0z3ĜDm'e`<+p$0{%L:O 0W(q4K Nxk[ ! \n 7b`emC5#'EpگY.gRlNšW .IO1+ ^ЯD4."WY s1$Ҥ"E&ݖ$p&7,noVҿ"=7'zi$H`UH| {^l)Xq2#SRAǜ:V>LsM_"*C=F=3PnV>(˞ݿl95|C܇dߍAsdol}[>2`jM螨{V'] FIe |-YvM*QJYɒwn2owTSF,4kq: +zM#Ϲ5O?ix4 63L-lsA}](Q,ءk5ۚJXi?MA.언pо_79Pkar袸}Q X3jed~HOL(UurIHC @ +#H"sе!ej4EO*&lg9pz 4qډrT$3,kԥLrD`>:U1Q=g&qS+^=9,a K"&&նS',[[Vi`*\q7Y@84آI?cpmr\sK@kCJ .O1I| LQ. YURV:jLBIWCXD3t1W9saKFTC/&u8oƘ}$ŏUOp^ ތ\S5dMze}kR[u[6_=)u-i1[MX/O+:8HD!pIbڥ3F*|lnn..IR3bHU[6$9,D,eVIdCGbګSȬyJ ؓC wiAٛpNQǫ~~tmbpEz +.ey^2y$[[ԏx!@ +Tdp^ZiHx@įy\`O O>Ltb$MxmZxqA4ǎU0Ɣ9urf+W)|{g F4lsSŝ.kw[Ȭ" lEf9Qhh#|,D\Z&e}%O-w 9[~@"Z +oDFI"+3?mBGt_{.N +YSeFlHfn:o_ +gY꺪ؐ'bXh`~x=ޅ|k.JIW:<˪<>z!DHq\/'rkS\ qCx jg0h ;ww;0vg(YB[Ԥ %i Hrw=J@EhjCQPnFq[t0Q[ - [ +0Gr睨&uph,k:9856[>HDPC0!!4HHq5\Tނ&sZxæ ݈7ժL#K-Wx [ɤ Ai'm%Bј~n<#spqwwk@,DFeCbЈ,xɻFl^H:NWL.= Ehxf;nV8!nyBջR + ey d=R %褁t%:IKB_K9eGA6#\o+zч 8’o0oGFxZ ԹSH42H+}4pV,L} !cZAPC1rcWJuu|z-b1tZAJ?$2"־w rr-mhXIJ♫f }j)[y+ 7&I0Voywcc7MIx"x)={;!]ZEyoUvFM~%_Q ͛̈h7$y\gnG[lNaĈY)E}SNv'tpjx  ; 6?,'** WBA;L@&h^& 1qA [ +l2^M:jHc5f$T.-|wdR'DWu`8[łѰ%@'q&ẹ̇ŗqzTX`tib]V+ *\:Ǩ垗\οt?]t+qpNŚuDA&=>P.0?hTXSl7!}y=Sfδ?Ī"ud| /ܔ2DɗɦY3@ْ H-j2/zOӥ6)98]0Z聕a>u UGP {._Jm6+HШ$Z?G7jO l(jX[KESm΃|[+Ƶݻ$⟧"^Db-ӢGW >rv@a4lԴASH:$շH2 sqKd"$sƟ@ƈ&^I,}. +COXBⲼA:/J o`dhMH]Z;JhРJg"/ ([*3hw5vzJQ$!k?VvYO4;,h~'}p(_HFk,#lrN!\R)}P!'w-~m%~9œM6{Yl7HuBYYf7RFCs!t;bbYyi ;6$s]$7kL.;фX@ā3H3q.3}4a ? )^Q[U +`FUe7eա~ shVhNAd-.2*Rjf=yBQXg߶P Zhz(N[gb-==<)Q6Cr @-;H1O_Gna=u EAD T{e"'P$&9S6k-G3 +݄Fx۬wx*3v1>q e Չe ݄)1ìU# nWX8={L=fOg(#/r9P21HGb +'B +E˾+5تC_HK1Pi oɺ@M 쩈|nPXYgJ;sf A8KLۤƒtFngWy E +A`,1CfLi|+At~آJwޢηUԓr Vd,:tѱ,É3uRHP!X7U;{vǍ+bQE.!<8P.P)*/XdAvt6KȰ@u^"iխx1M +XR{Lw`}!r8-) ]k'i|PnGKt 9i2K@Vmvo E+w4 n ,XT!;9#\IUv;D=O M!1 #ٕXᑽ-#lxfVk) (+] dY9AxQXmp3.zJ)Ly]=$:NV4Ĭv<ѥHienZ4֛\bd+WF",\9&GM_Ү &07fD"ҨyV$Jx" -$7alN^KbdӨAOЬ`-fgb8>R0#8RÜrbLê{\_3P +{'sԩZ3yzϤ"a 7< )X>Cy׫JV)ZYS&զd__d쫼5esk.М u{WR&|=vq,OBpRW, wIFe /*i>BJ.uёlYU)(/55] ƭXA ʌo38nD.0 ޸TDyБdvP!>fLX*oԒTmX7Vnt]bO^!"O,CvۤSzs%2 +Cd +nOb31oIS YV>"= i( <}/K,{q``Q6k BGB +O>ϝz2[OqzUXk'IqOG>nP['R|z]gI>e7 ZO@tkXSp I&zt+J(˪ԞN[BL +*[^ y]rG|({6R23 &؍tKh5A(-R{ל?}}w҇:[] D'V^X'wBޯRRLk 9]y0>g{ +jpx[W{ͧf֯{þ#竱ogNe= Wwk9Z{'ڋ},/igt"g" R"[#GS/*} R,׺ 11J1?İX2[+}y K皾WJjeNc'8/l9|GNVSO\n` pAfVmQ1)1{&;灢#)V?Ģim7~R?Mڞe^@.kӫfE[&H P't@n) NK?icWe9:ՠ4O |Y{Cl8)DnG=%R3P. 6dg'*7*fZZL_k`/_"(>߮ցL,'(ϊwzW 5̊]e_g;E؟,"d./-.i1H1"PX8#Hc8A ƀ`];J}D_ ;adwOS/`4!M S\ciC(u^oڤ9J)y!ObOQxu~NB1wC f 'ng~GOL4-4CG8eXT沭 ģxR?-E.jj[ފSܳ`0-nki1/ފkLdzKQax?]8 +8l&0G9g{-tFmY²kRɛ6%Ex)?8SWs9+ۉ W)*po~qM0625@ط& ++p ֊| ؾkA% W% >@83| ;鵋`ICZ\6,47>{s5 !@8H>lnni 7W|8^JcPB. hy!|}hJpk‹?f=Ke_\-,܅D-&N%c7j=!.K%;u]'*ΜM(#1Z`I#Ah}eWtᤴpI!"t.=ɂz"#h@^;g$I/BAi>lQsV6 H}.rޠ< 1Q"/>aac20]-Q%ӗ2&X-€52(oK[ O &"zA1SuREUCP + dcR E_)V-m6,{fkhӒ4q)//9'W鉵1k m^p8c}BF) +i׬~ +i^XGy<ɧ2$Hux:6 6?|X.|{fy{fZ;~hoD,1 +`[VD'ϒkJ5֠_d HYUu-1&HӞ&_RU-%xy/)VeܔP9"I3CL! wc@3uϩ!&9AY58(ݞ>oןOg7ɤޙlc=` IV%]U&g>o!X{[Z7ӛQD#Ҙr*VYf)ZD+Z3rnuU_w3\Ȅ>(Rt@?ܤJaܢ[VfFTCj_QbJA@V.;>Ir!L3lWgɝHuE)Z{TQw-܀FO_OGҧZU'?9 ,k +e_v"*3S~1dV| <&|̩Ֆ6TL~g@.#,.B_"*tSB"C@O) @) < 0~aodabBHJ/EB}SU1\n!J*V.ؽ5 Nȭigߖ^!z"a mлeZxz I6c3'q囿vo_0Fm:qiKcش#|a3 \_Hr\"D &~wru=RRwi󭍚տYLfZt Iдvk3PStݯ>N E\k.΅j4ǖP??%;|dwd;b-AӃ]3ꉉlJ3"=?\} mwz/_ ?.iKbTTrA#'U1 Yj +KW o.^(2ooRIx9T7`;ɱjh W.ojC:fAx6cA)FΎU/|=Zh9PeaM-LP$Qbtj]3(*I(T|=!WߑT8fuРb ?eIrR/ 0Tw\]]Hzmz)+pIf{○W-m;(fh]#J86AxPE_ޭCЛ-!-g۩~M` .5anwِdfKHЈrx"F'l~$XsHLQtzG6GWy +dl<ֻMU왵.YK, Bbt<҂uUh#AD2b\39iZs$ t029vԟz?ՙ Z]-jW-;k?N}{1L5gB`%qe>ҳP,Eҫ-ih/ʢPn"zgdEuF RM{:983߰iM8V1nwp F^eSfiU*;?m/ʮ +(nCI +J*[ Nvkqqm{G9ݨLϚpxY2pG2!|pU Rxv?d!<>)qLWKv Kܠšx"e)@I +WVl3)OT\B6ti(4sxڪET/!ǹ?uFiBz==:ro6n;U`m%>X}@N3%FΘPRhGSk%?$jD-ߑd ?!gUeWOg^[mȥڠ ԻZAȔԌIύ9㚻֚w%.: wlv-mH9EOn-4H}𝁫QgkpPZnwQob)#]1aS~w65qv25v@#0O=b+`Qf 0 +<6xf3!wƚn~Rz)W_gS x|2k9)^.,o({07Č&g!+g X#kMdtӜE7 +PjF"yruc2IgS(O5p_~ Y*ei_-GyŊ F!`L/lF?~EanĶ9in{zkLa5쯳yS9VZՁm-é]?56xἲ?ﺃ1]t<7Վ  +b0vawB2Lо?L>/{Je\ ^їv=CN!W.CjXnX=D$BE1khJbD`OCLT[l`LL[*.#٣D%,fq[#q_Ngޛj9}s |J\"xh`b6h׺CXo훺s)dnj0󨳃//FCiiT U8-zPU6Qe%IRx5r`2+;5>E< Eyo)L_n>AQ6}N[͇!{\a|&vtwpkI.Y!'"zJ:gMS3Zƫ*MR48q[?_r jZ6DSx~Wm?bo60:3L vkQ3'gND_Km 8FT[;"x\=9՚ 1P_V P TmĞ]8. pBۤ Nrn&q8Y؀wts^2yud|(ۑd`2"8ޠS[(h*xg`7,+"t [(6.\%Soxgh gGT`YAf$dkEbFPTb!0~:xG(/_vL:Z o,Xyj^*(^-%8U*y~]!KW8u3tK4!KWMEn]ͱ(eC^'3Tt\ N.1& ( aʶi\xC=]l-5B:ppnP='qPy +o=%o^)E6L 0 $̨(4vs W=\>N5 lٱ=[>ǎM2np/#Gk +`1O朴YEF,N;N#% >@2ޓk,?@t@Ň}o4VBsehs`NOhTQVls'Jze徥#Զ M%v̇3Fu5O!G+쿚91^ݠD4(&D*=څ Ӎq Nζ_c4p-R(xB?_PZ3)<$ѷZf0 -R aћ{Q; +1.Nv+S h8/=wZobT|?v3'J0eSxPbxi1(]猺pf[iWpnwҐpHzhXD:nF +TIpWR+7a7 ʃQwfUI:/>Ƣ*ZsB?E/r1&IM- ar2# mߒCWuT['$jY;\%He|(>BE><)˒#Zxaʎ@CİX?V~cM*id)Nيœ8*z|@+ٯJH#XGk⿜NUcYbB+4ĕ[>TQFxV^'=v\ZpJ"BiǖZ FSg;& QL+F&ruآEdIhn nh$l52(؝gH 9A`<@>"1ٕ\Dϑ%?*dY.ژxGyQ=`lv:d%.̲5~0vSb/m3߫nImjCҽ +ƊQxleۆ*Rg#@W8+oW "\ |Z;*f"6.\ 'Zi/yJO(qx~1%|j|ivCx}#d{Nܢ㉁9 xtnS:>˻s`7.]i2' %)KnPRQA+-xx"Ny1p='eV{S0їX, .Cx+zn/LAeb(>\+Hv]9U~1'r~R-;k#}5s*HZ"oFيiA> 1g TopR-'u)-;߷ĸ..`s5*pU_lAiOvos/سEd&1IF7ZO&JrqNU 7r=Q&k;m4BF8)閧K-=k{q?hͧ~㴄>Z%'>F!^v8=&kMmbA \k,ΙA >D?/}9^daj&:(k'oSa4usqwJU7 +v<3$x*\%Or.k< L!MovGZ䕼G.P$\üG`H\r#*ݍ%>cґ(߳ijQn3l[>{HflC5%vIB+la{-f܃)~b/:}X&u@N3$rez{ {v_yDjH<\g.lQ.--h.:Qʈ`&yTPr ^cl,#(G"QxD޳7:G&}]L{Og}P_vi\uj/.6C3n2A[*C[19{IJYUVڞf3Fkn?RM:~.Ss?QE؄5xZsp'X.ƨǢY[H㞠>}rćb)/ b/iiQ&30b#,I")h?0u i_ +@QkM_Wx#\``#g/S bq+DEm:-/Fe~F;\LH1-)Dȑ<&25 d>4E#J)o$r07(vZnE )lOܯ| i{qv!4Nd +\0Pex. 5=l+(?&p+BDap/f&$d[>ɳʅaLug5 j?:3k>xY<<7tM  \-Ko=(uG%0-LtP:k(NSQM&2F4jM4?bOd 9)ޢM3䚻t̳T=5='\q78p m+zƄ\Xn+[J`Y5gź2h66JT¤tu>,>&٤Kt UǷ+ Fo{< <5 u;cn;`*){ ]>> endobj 2279 0 obj <> endobj 2280 0 obj <> endobj 2272 0 obj <>stream +HYo;cD`eX?8Vdfx82 Ʌz ɡuW*x4\Vlquq?n'W7_<$?t~|{\Ly"5g\d%*gLb-"10wq׏M^,y?QSxg.JGK7iRB&,*f]~F пa& iiP:0 _j[9äN4LWfzՆ{sZrHD,$gQs>ȍ<Ў@.m<:AW'ט<xc6y /Y:OP"EJ*q1>'2P%; 3kha:1OPyAP =6i MҠ6PZ$:*6l/e/ MF"qIOe಻<<@M+A%hr|z<XAWV{ RN J,6q<+w=IahEhk+ 921fm14 +6-CW5qgd*W&?iQKj~A)*{SԎuuha6T:D.L@1c@(9b4dȥ+D!aXr{J0"л3"/K#Q &SC*h$iauƊd!ɼV:u>b&JYPsH I1F6h 鬒!-EOJ*z&j,z9.o.!1k3@(١5-f׺Mƅn%diyZC8BFw ;C]jV@ۆ ЀIS! eqDi Wl +[@ zyZg2$T@. #BkC=n2j·[r[QV:]N=.P ^ h/y@vU-I%ȄN q Ct*PF+ +AÔ#Je1޽ [*6JvXFjSue-rK%j8M7F #"7\بRK[K5(NۉmAV7grOL lUL02CR:8+ƑL["c`mea6ղ1t2fVZ?|38) |+;+o$ ESWW T2lbLWv4"ӱ%O$*S!K8Ұc@iRXpȝ|٤#sew#Ƈ͛d(XˠKovŪxi {Z_vle-_P6AXX|$_P=&4tGjLҰqa 5ڿ-}q]1of mTt>|2xۉC*$}x@3*ʛ7\]ŸMS&KAKyݴX!h~X4hO&~!2 d +b;Vvj2}P]b= }.xρ_OE^tu:J:3t,$MthltՇ^éաPI!J$ +hC)(<>HY:Kj\T}h?EڵJ J\W endstream endobj 2276 0 obj <>stream +0 H@&bw Hҥ +MIBIX%Em~ʲ!6zT,S[n˸r@{U}YXВ^sh> =,_O[ݪ{}٤R-ۭ+] + +YY*{]z83G])[SaT¹rH13݃dWE^NV1o{X8y^,G+_nBK}_Js;NIcO5_)o)vA$}""k7t{ft1&+7=uv1$!&8J|A0Ud#F `^MWҝQ;-Hrf"İU9`~@yyaMaʯ7h]G7Yzn0eBlMX-#9ᙸTV%+zEG2g!3CZ 5;E_P`BM\t_:C ݿ?{Y%8N.ZϒNb VgNR!m9C  naIZI`Y=}~$k}Jg+Ն:F'Uؤ #A])/ yТEOt -tvjM3FP^e{V`7! vҾ*8k&+hMן|U$Yl\)pU֬xsK$!sM"BT!9)^Dx~Ǭ@!;~Ax4Mz!X% +7M G&(•Uٷ]w5Wu +Jfo/9yÙ?(AN[TI߿8⏅@$V,p:&%I&Ndb} 9>JXHHjJgyJgoUeS4C8' RNfbDbͫ?bp8 Eec?ϕG(*qsKŖ:n -/*~LRe9cW ?m/?NoqY<+Oy[ 9y/5Y װF?~Dj'~KU<;Vi, i]2@Ys83|gq/fp~8Y{_B;)k2Q} **jRRA;֍;]=R}]GbBza $o[l`,_t@\߹AyQ|T=@_grB65p\bvWL;>u70,p`xb]Q}p!b## ۿN@`w{W zVfݦak1t}5?>4u9TC]rϘ['A-ݩڰ01(G&~a9sk.œIT\SS͏*;3x+ ['b 7)]Vݟr,ǥtQrM\hsG:Ep +9 g:QVcy ' pt(!ͽ(Z{?Վl[tM?zvO'@e:n4a TEpiD΂6CBOGb*cԀAryTե@FD'gR E2v:\27H}H}>쮁qgrĵ7kq99Ӑg%u8#S4Fݹ0D\dՉ@= ޱ$ՎX~Zn̼+8fV(=q$'t/:42t3ӇS r]/DN0uqP144)crĵń^A/I,uzAw~Ӣ4XUKEga|PFMxAO':?OZ* +.`YȜ\zBx`R_sd#K_T,cbxM_Fd֍Z +walnftz_PQ4-![q%/ wA0^ϻHRDɊeިfI!K pz/MΏ~{Iw/fA-R(cju҂)JBqs[hi39Y3"_!"^:ԱU0 N}ٻs=(j g \0S'pnku% d/#G{D k/r$V\)N~zS35/]6;+%`\K8!bǏz@ˏZ Bt!FtV}8ǷwU<)W*Vԁ:,dZ]рoܯi=ܷ* XI"VSNަ8mՌRUd`hpr2_}j0aib)v&E,qU1n6ÄI chJݐAGn ZNQ! zD h6"V3b fbF L#>U5tPۜ_塩EMuU\y,bFK +i{"3PJbnh[`Piw4긧 ^]1*~Pį6}s0&vR +^p:t9䦅<,ڦY'2*zd ^YNj!q*zLO:ffzeIn M w{\Oϛ+bxٗ*mbMԕ>IX_|Ӹ:-J`F0m95j,L]lV8XV#LWhg0hAF~ J{쟤dSGIHPں۱|&QS61kƳ4γ3OįE aruN|270=RGS>esJe86ƢG`gV1I}!;#IaxM X`,]@R\"-0+}2)B}aĮ,G?P,1vt8YjyzhVF{{ҀN.YakTKJFazZTr9=RF֖ Ȅa9 %Kh7Ӏ9y$|etx;AA#cxw`t猻|Hj PYR 6(a^Lk>OEԎ;3M)hx=R Ϛ2e.Gqtsޚl8 +.[(I'P 1,Tft7aaIZң6ed$bV{FdJ@Op|=' #H" S4ݿ`u8G\n7[1SZK\yqQ{c% FWeNn"m.녀E5<|1^6.foS8|UYV^VD!"`^M)aǘP.Y#! :MF$P/iݾ P)u?&9 rZ J_5K\&°k;w 0q!üFTr-u"A36o@c#kU3*9…brV ȑ(Tɭ҃)Y c Mt&RN%f"}N}L#A[01R97LԸcR58UʿEH5_ۣJX>4c",U=<.6DH6sIԈDXN4oaJj'FtyRՇ*5(ukQg h$Qz.]X^<Wpk<(1Zm4i!2._9O M +A)GYihEڔ/,GJJ]C\'{' i@B>\#yuƵ Fd^I%瘖Jȃ Ǥ6ȥRl"BM*g'nYU k 3NK;eHW-C!5Kzۇž!~K#vmRL 2'Gxog;10ZH[/ sc\#9~hY =db!#{+M"%d!&c z.1:2څOGmcΞ3^sbЫPѲs-vd| Rd+!-*SWLxNY`WC5 }P?^S#=" ,x@T;jS "b7I\_BI!CJg݄ܹ3m<ԝNJzlS;&X! yU #U`zW'I}YKРݠ Awdȶ5c6%7&?d A-_Rr>Wch yo59e9f/Poa!"9#˜mH򖚬 *g\ v_DV#; azW2]P<[lG37cJɗmd5K"4a_eCPb=h-< ?v'#B.>s)g6qyUNO}~Iޑ~yG?D Į#ߋ+F=03m{eW|JiDru'@btrE\D3P5NQ9V:0zKxg+g.hf3VKP_FxRߵh pZbfR|w;x ซ3M6^T[lT][!QcX-Hy2s|Ӻrr ݐAwKҚ.F)j[ h.Up$_"૑~QTp3ajC9 aTuxY"Z7S]6,3|1D[.aJƵRE lkt2C 2W!bAmO1jOjV. _m=Q_ڒ;@D:^qGQĨ[b>z;1A=^&?m0,&O +J,͖$ݱ^^YGeD.0h=vy}߈ "9?qM8imyq5#m$:RD 1 o.ʭfE^i)zbC>]I46S5c:$tG61DR{"4 i#twٯN=Ai>Ftbm/m\m7DT欥YGj3uߝ8+xl_Rj&UhK5 Df@K[YGӮECeBjQwrt007I lZv9tNdBdӶ\ӎ~N3ːq=!0x37R4τ*w[L!νd29eQk6 NO{׽.=^Gl7$z+duc?"i"_E&ҙ}"ː6fDSmm'0X;{RѲ"pp?"RC6y´,Y'HN +KZՋuV!%c#ht諂=F7cְ~X ,G({0:`C2w3>]X͑"@@Wja>&Wp= k?De EiHw\RFe$`~kKa;'s(祰+"6ß:Uܡ 1}*gw9f&+Ua`|BG9]I㏵kh]­UV~ukqTE$;m[H :Êy:=c Zh NQ͸'1.iS@ [mWm>PhAK}|բEcDv- +-aSx]rmh$M_}`hR+TʳK 0{y}VEzhb `_ֺ!UЉ8EZ ;N/ EK䏰],rY ~s+j]]8Vt"=vMvIFZC㦥Tj>iF~3PG@6K:$JqGU׃FL노'_Yi0c~F4@.ˎǞDӼ#t^CcUp[cj\4pk2(_g@!$ M̟e{_a ;;C;[iYuʴ۫l<_|o!L?tŭN4 T 8M>zwM$.QgU- 4 +^at"Cunbq8/䦸UQ 㨐8S`+#г6ſ}A,\$aӭvALYjhc IeACi= QjͿY"s 0/b`l@$ݾzEJTV.ʿWPwH+b.>oG.b~;&=wj;ymKxJycwPr6Wam4c72mPϐ";/cZ\8k⢏^Rk_ P6tj=fR~ܧt:?ϐ@obHΏs=;͓,bԗUaO**WFhcqi DEۤT_Et:U', }C|Nτ*AsY?M9r Nn[.n0E)"|77Xi(NMk:ɮp=V;7jHhs/{T(C mfOMM6 +j}NeCo`i3; RJ*.RNGpB|Ey ' xi]SNB2YJJTBnqL9}t)G g`tzReL  vwAB{j2^ ˍPD,ѭM#2-Q|UBtwR$R +8wGlrʥ ocqEZ)B`0tҁm+8~T7]_z~ w՝_>] dsyF_xbiU5%MYl" _VT# QƳ8D}2*-58%(P WG6{?(,![Y7Ȥ1*  AZ`0Mj33)F# 3Cl~EUӎ^'((κT^00 r׮,rmuk 3AɮJSj VXO. h[82Z/tHk۞@ 1.<͙U@E*y9-^9_/o+kL"62#xS͓T㙂c%6яr$s* +D*dQ7T?DdcM^Y˰=)|o[ҢԼ` fi& !wjf@}GqlQȼ6BaZ`BHD:W##}:s(ɁuV#Y )vq 6SJP{r#F>uSVbrn9֗`K e8Ms+)Xd!㷲C̃u"Cԡ-CmM2dH6ؑj\-s W5So}uyB(ԸVB5 sjooFfgeT8(c't>eHXvDŬw{YD`'6WOg 5叏t~lSϨIhw浭b`:"mwiR/W.Yو|F%9@3n_քS6k^I9U(!*/ddgc4ʄr2X1)#!bŚ)=4ڮ&dp*9ꋇ2e Ő1Yp &b7qK Q~ (TMK\}"aGY79ەSoC!nP8 _B e!|Hre~!j.: 11 ȷzrx7`62ZֺNsO>`1N)FJͲ552hQsNp'l KW"8Ihur@%tnsX۲do!v8A-][[*!u`[D=x-'gOMWty@: ]<5׸(ЏUآpYeRxg2e ڹbIVO=:PEKP"Sc+:׬{]ߣ1tuN(77eϑyr7i%1Kb.+mꎧ笕 IY瑙&/&)oӝ{Mͅ-OC'ݶE9M r 15i-HD0  y&R:-ZdL_0~f?e:uhE7gotHt':'U{:T[s)f@,Npszۏ5cSbe4{܇AW:kD!]sMXRVbF#_d3b$4P b^7ލ!"=BY!)x;cAs1"Ne +S2%uri7?[,-bl>d= ;|z땘ԱZY2\RHiA&TgS?%K7Y7(W~A) J0-z#;ږwńK8N|weT#& &͖LDԮtH1N&:AmC!\jWWƘiǰxRxD"+c2c6b2=կpwQw 5ٕ)B55zo9W)|όHƗ3K-Yx$9pTh1ꢝᗙ)KdmO_ntn]*OV>wP?g'g. ̈́bғM +ğݟ37|!5D$F ߖ()߫#ks4:۽9n:}n'9&Ω;aS[6 +Px(}L'wslzL } +`p:?3XB?;tek< \"[T,|柱'RҗguvsP|i#vF?Zz>bd;[HF̬ E @Qws{mx5u9e=UuI-MUi۵ɱp~k;_ CJV5TEfV$HR3 %Zհ ݞH7N<^$nBgl˛/瓱05 rư*uiҺΎ`ͅczDW7Z*778V 옹 Y{y7ϫ4^аk[jK=X0ЦGgҹې8DWs" GK'HRIs d3wY 0WFIJ;9 cBZ`">!ܳiȫA÷Y +Mѹ*7ńgNʝP2%#Ssk,ފDpD>3o=:f>䕜|1дf~ +kB{ H{1NJoKZ9nE\&<9`n1rutJ8``cΪ0I50fD%jB]@X,5K+bO'QDttsÉS~]>Klg +s'Z +/DrzX>L; ^~sB7)' bh}"(oԑrQҒmY~pO]rfEZW@^]e/m)rkͦ Y0\$0qk(iod.vW"k ?{szr 7Jn,T065.c0 x)y?K( /(.*!VDyu6Db&2՛t:gjCԦ<ۧOd{JbYb0֩hW+fy2:_aޖpٷjY'1]5 :H=mη|TptJByB6-SseIRD*U>K<4d]A$g`#vd`t#9a3|n #}#o_Ήĵ2|l B BY/a x rv÷YT7bПq[O}IAdRk3=1>ԦA%E∱ӆf&(}5ni[! 5e W +' 1[8Iy̘$}v"_E:*}tX `L>w5ClB!coY# (~g-4[ę~-GĎ >]q t2ʂ{ճr<Cמm%f ?FR3&[{UQAs+]r{cԦuҧDLe Z ͘cH4Z5d`F8]AqyKul@\=$ZI`_d,!.UCdGtz;UOп5$שR>[M$`/&U8Jg %Q\x3Um1=MM7:\"zִV:@FunΜ -ic&ٌإPLN2.yy%{tva qn>%?ϯճ2tYX@jp9[OzD}~[(Kռ{Nt,? 9 ߶ʟlmN6B:;u>X>aKӫUI% ˰Lq&퐇+`CMp΍Lh Kbn$MZu%E6 뽅YkyJ u %YaGH0+6+1ƃ?|k(bdx >kp5ZՀymY1^ͳ SI/b ްi9"nGxٺ<0A:t1EqAZqY0T/oB?IsoQAڑ~*rN0t2d2$d9vVL!Yb&c}(Y'Pt)؂Z8/j>QN&搑(q_p$U=HDŧ#zo)1S{Xi6ǡ:(}kV2igCu~|چXkU"(qU +P- c Zc!ntG4ݼ:`7Z#Ln״-jX(<(w` :Y\$а%-EgU.Adf6?_Q? ԉKoN^$KW:x%gb̹[3>!O0`ץk?K9,Br4b9#F&h؍ oSlPCqCʙLZ$ud3:4jxV7l"yUyeăb(gK^ K;˽cT0T.;.'1kD 3L>ǵ6[?~G[js| %[Ò[SP[F[>ų Q(GlX4ˊJ8jx3qX. Fui]9Xs/7Nqʗi|.if5*tT|ءDA3mG޻@cMدKpY;d x.zn2>7IɆY6,oa\0S:Un~#k#*C4>pQm ZWztz6o`V1zvxް`GaĎw'r#KޕN/Ӥ5- +u5б nO;ʖw&Q@ɐ4AT&}d\|U+}  HjMRR0,d[4s};z*7GHZ2&MF?YD)ىČQVr|-^SnoQO?^.1'nx):>)mxYzp ;~$#j^*!3('pI6 +9{e*%p[.(aԸCԹc$Yߛw_o&{s TOE HxCYD[N6l;R#$Fc=9)ٜ_$QW~mtpzz  \:nw:IWPP0Zt!1FY.^j Wן=L"QH?I 8'Ӄ[&dke!-24}$VC_&rXtH:*zRR6cꢠq֒˳*a9ׯ k 'PClqG-^Lz1W0{~Wt_V6'#Iyd6!{"-kI[ypoc,M!IĴ9cXI+}~Lg#Dŧ Y>ocI{`hX~CF453wW@8"]ߨ-{&,,-eGLn[nr*jB"Lx!ǭ alb/oȷ{Ofwe}j*%sU{oIHt#yCkێ}o ;wE _Wusek 1ڌe62هs: /|\=Yw0%O|~%6actA Q]-/^ y rX4P"~5J״C qa@ٕHo3jE:2o6 ;v@Ĕ;k-rUŕL{vP7PbpsL62;TdsOsד]K/ if R-r;+V Nt߇~vqwAjf,3:yD@R'lNO5y+3A;=Ҥz S2v봷)8C\d|0^ZmR2R}*Ua3U9Wus]٣poX{;/n3CyØ+󒉡36T>JJo"vŤU;&F+1.PAfIm6#ލ)"۩eYU//\"RDCEp>~0L݄1(F ݊OL+'-2A2*\+FMl k mi{A㩉s)u΋4=qzVsU5;(u+oE_rHVaUPE M+cO:\/m̭FH)5 uW; +T|R0O |tvNjV鐲`~W)oW*0Uj!m0@/xɀe\>+b`}MwbNz'{L6ekMVˇUenOzyP|[Q+ II@hp7٢1ӅJ1j!L_-~KL +?ݞ N({a|4akw Q 9\&IY50GG"jؠInG׬ak%LpJ Ej{J@'>U?$5gE!P,M9k5oI!?c}HDQt+y[Kh>*BOخfcN&W'w_bEY!n˺4incw3ĕ +~s ECS>TE/Og]}etj?KCPF?c%Nx,ڑmkb{A XD(sݩ$jZ =JGq͋0BYq˿~̤*NPs4X!=V*4q+~ɜ|j.yR|}ܲ]tȇ6S<`XIxQ@MK;)Pes\ fux{2 |? Sѵ xk?Nzޣ87swp*u+*R/T8:* +!5:Lh,X6aij8Z,e*i[KW&')kFT;ggNEX?nUc+~8 +J %l7Nn]6VLds=W'e͌߮T22oz;׏,_bZ%ay/{B8K?uf9s ͿB,k-X`5Wa!rݘӸE=&b.}Qǂ Gǖx^lYWGq +X:Za!Cs%|#?wV#B!ϣcu6#vL +R;HȧQ_[˪XND>)e > zvQ$Mlדek+/i +s +xI$C k{8D;(z AמLsb~Yɫ}/OR*9ehR*6.Ix2><*2?f/ X^1ݥФؽăD[JMˇ>6/AQL/k ZgGѶl 3(M1xD|fubg$(4w1l2d=O*WLcQ(NrXD#(܅3gT=F2Gˬ8׍pj|E׏]S ?1w{3$5s""ɡT@ste= $ʵwOX'$ܑ1l3^7mür!qEr4:J5;eܔ2HGM>O :˩`e*%HW5$z /O >9O6 tŴ3G-^R^ :8G!AmpbwJP><>zghD?f_ ud?(Wa|Ƞ>Z=ǡhˆy&uptj ޒ] T $di!# +6[7ZgbZZSF9k-kbwlB%(¼] '?3C ~1)F4:.CӹTﰿuſ{B@AU̗9BI_#)L&#)hERjRKP;/f +RC܌58:h5vKS8qj& ̽S5љ3ͅ5o8?rYøC"M\\EÈn"s#iX{GT k×.CvE881rpl|s $tjΦ}8?%SwqO{@&;G:?Wko(vXFיZ_4^UlH:g*%PWc(0 +hmˆ9TS, 12L'$ZJX4% ݁gl9ahJ[_ț?G'lpȬ"bȟ_t=tvϖ hGrX3oϟ99^ +PRcLY#ybωs9כr Cԉ'Mk=qQPjK :AZeL?YJ +MۑoߓOҽ[gRxkCmRɴмl.^Dyˉ SE7W +utQPqow!E&ۆa"UuZDQC?a])ʘѾKj`i3LGafs[~m/"hNm3rMTR0c3 vUgΫ@OLbMzz=-GSgn СmI3׮ ,t3m7p:߆toӔ\)(칁0MUs{aCYdaI_ntJ%L}ElXxءiguY8~ avi(ŴXF#xۛ,;wPfizD%z0)xgd{wʰe|Ym x$BYc41B~6 qmBULVhIb_-q )bxx*0f54"H6tz:Y8rsU[ ,iBšf"T]=+pݘ|dzYF/q8'?}1Jђ:,4({":o(rsuc5h*jKcDu2KjZy˞P2Q6^Jg-.5-:>Tjg0x0ciK=>kfd^M*EucI)L[!_eR|.3GVw"Ix+X3-eE?Wl2ⷊBgdI=ijLڄۺӎ2|)ʊNJu) +",ֹ/x?ݐ'y(Qx%1}/ʳSE.fx05IrJm[:#%#`ƦIzEp<< + +%t`PLXm($CewjHKHKՋ-4@8*-f%…%03/ixy_n8S*Sz3kp %Yҙ3 aS| "ρhN޿OHڡgeOovI1+0Ow%̸&֊faTs) p~峟G]kB pN +ҩSR XN.} \3SZ]٬)(0ly@&$zimg3C# i +D|8ڟwt;Ajv W dH5JgA$ԃA bxU@8UH08U`p259c:vM'o(0º>`힅^mhxpӋ3;o`HjU;}ni? dNS x8#sӄ̏#74?zR +>>"%t=vmL};6L_:f啗 3ZgIb@ɒ&V U҉P$Ϥ[TD5Ŭ)Xv8 ?@xH\[~׿I>?*5xFD ?Y`.G!G'~-[048 +|& צ!b)G&Y{Oy+8H$+FY7Iq3>AIW<ޠm=S6FߣF , +I:N!u"tdCw?લȩ3 eY2u= :f %{C 8bTdZ?&: tDޑ +oMGeD߈L4ڕ&Oͤ"d(>+j1(ww 낅)~gc-uLvBg,tSWJf rGyZ.wqYW4r6rңmɇ>E5PK8BlH'tG4/t.?Xz8%g2Gf}?47fXMK " @q5 WhDkDFkZlo+v&ʔRK}Y' v2qhQ4|̴!9 |)K7cy"!,k% 5͉g&Ζϙ_.G~}2ʯSq3&-w8øa<'X<@S EߛkךQ#QN(ЉDŽJNܐ@+GL:w~v]4<ŀ#įtv4Q>]Co22Q޴J֑#4{Ra#,)\Ynirq= +E$.K|gvw3mN +^Ϛ2?l^{V( :b`t%^F0y=E,Z.38Lg\ 1|$rV +᫯ː}\ZQ-h̘H8+g_\ xw~;gA*Lg~2@B~QU9)=[=lb9$_q{QVϔ@Hh Dja{~tWY*īЕʉ{K;^qFj(z.+(WPfle9A٪)-DMLǧA+`}D,#3ly+42do>T$ srcu'¡pQ#")QkTZk Z ˻ïiߕd `Z\7ݴR<^!Pa'aJPm*phrYk~2a +;tx]]u0P y"T_EjǏЍS"׿9F&PJ*,Qv]u"%7 J0SK?Zû7!e7֪yStOD(PTRŢ[:67_e$r"ʋS̈́Zwtb\^xN"mpfOBgY>p:XkLӿ> _R/ a2LH2pVϿk9F<4o29da5X?ՒB#7gTk̗t \=vZ!P?)1;zn#ՏSpwaSi}ǩހAl="^Όt {Jg7u\cՍ7VkN< &ߜE."R]+߶r]vZf.״^Imc,g1WE|J}4K&?H\,o1o!2CyQ`_A73a[*x!._;.hs>,cE~-H8-8 Q =2RU4Ħ,UeL> 5mNbnTU`L$F)k@m:QƦKjiօ`'f6Pd:ņ,Y8)F@6oQ$X GC^fy.nYXl;Nkjw bT +[OpW\]& 2RXڳt%Wd Su?,I}ܟ}AsM"?JE#Gt:jiqߪb~;E/&C=ȸjQMllilؗMxM6axK5m)qP+梞~w 􄠈:b.Zy ViI;D8> endobj 2274 0 obj <> endobj 2275 0 obj <> endobj 2267 0 obj <>stream +HWnG}[}AYKŘٳ А ^F$1dWT:Uu2$N&LG..?hr3&,=]PB5hdT&)6Qs?F~r' \F9#ݿ +2boյO5)k&MKZ_ sAԖ>=Q@HZ91g>{Χ->9WO?]^ϋ'p7 %UXcR8sϋE\@Gl1xFlPn)%a'Ջ"b.||hGTW%Vgp܏ۃ +3J#Q٤l3*% tkՖn1DR[%j*uD} 㜲` fE>[Ά2g q8|dah0ƈ/fUJ_yr~+,  +jYlmo*m QaW!`&\Eq4 ?0z}swPi,)nKl?Y* _J o,we.QaӬ_*YW5r{C|GFu|_`Z\:hm1"|a&Q-c h Hv1¯ubx{e +>x BXjUEgi1ih l,t]y+ϟ? hȠw0,lmZ\CߖE: %shmR`۲4%u:_!dH%8Lp41-'9L 1wV]g3/p3AWwE/\ C*\׈qDBdքKip+pC͟78Gw}pX'!%Ix̿eG |Me/(:;'l<z@ +t W$hд +%5[mc ( 8L%("Ᵹ]D`ې!+x]@Jya ?XZ'8 ;o}qjP\P{[ +p0r*+AhQv}mPe[ {cyyd1MAN\ n%xDC) +QbKzDBrnI-còWSH1pmYvXD@5+M *~[7eI/HL_Ϲ`$Ζg}u)Mײ/q,J`⼱ӄ0hI6۹2f`+{h[ 9)\ǐBS4bz-PZ`9YyPM8p8Tb_!W9YvFxOF Vᕜx(I٤V)`/,R`NN w٬H9T1%j _N 9H`Uȭ*ŭPImyYa)n +Ew ivz 1*%ZFW_[ 2 +ppJlUO0jjN3C6Y!>4â"U^TY9tK@PXMIۃs*4 b} +¢{|RdH>FHx2zW< y3!}V"Zt7g'l瓬'[p:K1cjHMj@4]5:T0@(/i1vfiuꡌbah!ĥ:\htTBu]Wrq=8,>s}8!{HA%ces QNxz;tZZ a·ŝXO0COOǾhǶq,@K$M{ Be" endstream endobj 2271 0 obj <>stream +0 U@&e  U^g[E2nB3MܾI|Pmh'NGz- CL1+%d +w޿te9>gȱvVe4A|_^E*Zysv 6N E)O4Ϣg9bwV%:P|3*H$t˃7‰oԦ[z'qhн˵Ȫ' s?v3S_l8n8l-m +s^O +Inr.i7 R0:$ f̺?NwQ=;+k4,FpY 1!BG3 =/zdcTy7: |P'BwhԒ!&P׃ٍ!~W+0sސ.k{u1lBMÅoй@ñK BIU4 }~O#$eB҈|USzv.-A6%h#K`tb+a);s?vvcLF@a/s$5b |7[;ԳF@#\]عZUT/sYsRa?p_vTeOnA_=:_,'hI6I_0T%ԫ-ב,;FfiNX ot*4z%Jԝ4L2PUV 2|OHC د6V#jPf/o;M$j8M#zםhN=]:>&'vw_МeczUyrJD,*T20DQZwʷעA`0IlB +$հ%80ūP-Vvm,3t&(;\|ӃN [if`IEY{}.xvLde::=E[i"V͒')釭NbUT^' -v)M#I 9 +]uב`BWىsn1љ Gb"6J~'?bho( +߆ ʓ9sPZؾ_{zVj)k$$Ix1Pu?"{Ut? N[I_LUSzB"|Ht&bQ}nφHDe#Y:!|Z2Y`D-}c;uBٯ[ x}FPAm=پYlv~d[* ?vmٿ J먃]Fo a+=)7%[k@ * ?sA],.tii!:?n1;ku"ygVJt=*K`IJmVЂIY]+nr6ivK*:b븏ՍL+(FqFnU:o_kNc-Hh{IUg%o"d5b^S$0~~ 93pi@|B.V[>46:R}vZ}},{,6T߮G5 +H71 R.*IG.%<;7~,)P7`8d3PqW{I_C1Uv#~mNmB‰ {[DOHdE}(!f0.[*Qkד]&ҏtȭE]SGv:m;6C" [V V"M{Eʡ{IcnzѠE LQ !V$>_7C^d!rl)ΘӁɣ!F{qi>O,nl b  _S +P_lxbE:z"I!i-8pT ܮ}K,UlAk:s|S@.D6]][ci܍ {g}g9mUVcaͤf8철5ybPL?{cv?QAc~c"R;l59Y:~hM8Y9soF`Yy/N*Wy|2D;6}ƼfݺH2ΜBi=X/4%{E&zd@ %˒Tގa0oakUrCgc@SPs_kN'„H\ YD/wXȠTRK.4$L +-/- Ui*EXÚmF ";W vw8d>"m`h)])nʂ˧'E];ռ6Q}0i)5ʇg~w+q#3LnJ]֔go&"׉ժS1f8}v cBAN@VM4iN6t4EP25bX5[ؠ; 0|Q*C~mhyiH ڞlSҜ2m&讇(7' OhyS?!{ڭޯ@[W +<ԩLDz]у G'SI!2KUYK_23Ř;ØWGu`=j?ZmZm'y;i4kh ; JzӪM8ER7\(F$*t4Ë)}ChJ?;,c4GuSmUkA9-OYǧ8fH|`zb6SL.23UƼMwe3913e#=)+.k@RI:7hQ f C^K>RGyMȵԼt3((o&Brj!c4Ww1\G8 a)ɞ)_[ަ1N-^0;M[Li=i.0|qm"`+Lc~W2% +Hů@FFVyVZon%j%j6>k NbctMS}j^{׿CB[A()fuCXUwE`?r>LkՓ0᪇#RokfnXNv2d"*}!qK%tdluPznܵ6yiҼ(-Ls L)- Gb\Cغ<)s73 iR-UVN?JT{}*=8C4Ug_Izuu `;؍uo4w/fWC;/ :67f 6P篤TcCV +C%rS7V_٦!N4Œ{^ ̃a2׫wt ؙ79u;ܗp-z XA鮼G !" g%VHUIߜGUZb$9p*:UC [c %澐 +P5Qg/ .V~(}dBƺNV)/y~W O7*{‹ƎtgJÉ2 }ݽ+! i=jPCT!{>sv ;Q=ruC%4蚻0B&``Mk8ٻwobdn[Kx:[ t,3u4:ԩ[+FE]TbjO;P: +|*Ojי D}@6zhHqIڏ6Q@)^ ؋kB+Tw“EI4Br: +sYtE|Ax(bJ6AؐwbuEή"?yfۃ(@̜;iɬ$RGY~, +xo 9b@$+I:·[Hh+.)٤Z'5:d=6*tպ;E; xӞJ|D?|PušXrs=^4|#Tgx7*UP?j y 5׮oDni#'Aw0i<̌^e(/T`qMI ƽy;6fO|02A/ ޑH'XU;(&8pSӍ->ru= +W D";וR'Z'K&  +?xetѺ!?TRř 䰬[L%ԕ|*e&N[?W15D :@q)ٱ!."wk1ʫ-KpZq,dT9}NdhǾxb5WPY!/ +W !%[V4Aǟlyƺxo)#+Q~{/ڀX&k2mf(~3~ +0= )c_Oe. D"PRo-$i(7 *A֜Z : r 9N|Ľ?c1WB aǓKPpiNtcɏl-"`Oqʟս(FeM 3ҘrkDA+0wPF..޹1k(uLq$Rܣ1{ WJڭ:K5aӇj ˤy:Yqaxmd)\S-<H:()ݍoml(ܕ%g߿x,FEdoÇWQFv.7n+f*lݲ S˓#ZL2\ BAz +Hyå$97cŭ,$P4T8u5*· +螅j)S8u'g%|i:=;!l+T]`*Fҗ"WBJ]"ᄋ=+ly|8'g=e1 ~n([: ~^)kzetL!#"&]:Z[PY*^¾ +}Fv$d/D~,)4vX~ *2#qE3"Vܕ]Y{L1P@b:P)[z7/`&&; @IbF: +ò{ݟ)kicM +yr`4*OV3x\%v0a& "0@dwRTE'/~Ikٜ^tZ)+*.;zSF  +Q\9W#4*3e;l.#9ۚHl4_ SRZ F"'{e5r*(&XL[JD_V(63LAD+ _o6;ܖ#z,l.\Z[ :tFGXkg] BP=xsuPg߃=;l}0hko,}MGmX;5SR6 +,IխrrϞz[K|NLiRUԺSˀio&%0Qd1b +lJڥ8am'R@̶/ŠŢyX FhG +69LWxK[Y$ȩaMv;I6QK*tkQcp>y% : gѱJm'J]MTEJpI2%G*vp@.e#uHE2`e!"_eUc܊q+L 2(G@ 5xQ`T[^έ; +SlK(#X_$5 +hbzfdfR -RUM7FG b)!|LPW>D/V޶]soIR=xYfg>pN\Ti$d4meV^l"!TsIs<50~b"0Z/d-{MjH;m{?wr٪fY|~_u(E?EoLP Jj-Ә=|,XnV s飾}F᪃2Kz9BG]@cU)s^E?_P5~28LB!4M^trH꾣ឧ@yI=Q 399VP)an c1diɶqQQc#cff Wc#l 1"~FNC1^n.u J?\tRr*(:p&/w{da C`C&#qcS_z| P9kӦ"FՋni(M"=d8Cmzw;ܨ?& tvx,F(m~Cv1+g瘣]KT3{c\r>K~`Na2R-aD ?Ո=1!EF%JUd0SdC-ϿixIh>c=-N7U*Y"FQw4>[_⟄ܖO"$xe({N.u0En5oB%Vr 웬MܲTW8y91cFw9>\Ecf,'j}=+̫E.=ӊL=2,s8315s6W K}K :J۰Q'*Px.2ɰsb`Z,xt .zϪcE @(OR$kY.LwVM$g,_LGBk}|   __\ WR7Ju Vg4wu8ҘyZ3RSi^yjʗO = ICX!t5{~']IRE\ ^+' ykUq޾߱oM:g6~x5"Q"TÀjuܝƌ, :6>Xm$z(gePY>/Ve69Qϸ@=Bs?l-N8(B Rd-,޺+n +Zꠘ0:XwpVί= Ǎ>PݣH=&<\n/qGDD=6aGiCР|0NwA7*w'iL:/wХ)Wy^0C\V9y +4:.i$fݡ-v 90aIP?  l" FDn2jP"e/Ʋ $?1fyDC<ҤqDNWF_i2eSW{^^=#hE/yMbZRRg ;L:e71!T|G$T2兌(?'#~$8FܕTPs;J;Mkߎ!'e/.0w} +R)ǫЧiH?x0%*c˖ѿDi)$2`QPxMԇu$q= :rAN({RֶXD%sbT0>C9$W{/-,bPOk +ػ%a lEpk&^Nѡ+c +/NzfhXL[ .F'oT<ң~@¬D'2< ODδTOlg8_&%tsoL(W+%qJWtz}`l{uNpni' NJ,`h%81fn$T,.M'v/0m8ͼ-?tn281Mam{-Z}!n,S?SGGG8(/2-KԾK$SII¯bN#eZIz]濅" &OJՕmNqܵMT65?˥H \M 1$Lk ~5}+(KU G޵f$"/6h&fY +֗#%C!ڇ ٹ aV=,/,0{ߏ(~ G'JbΝ}nUO0>l8 _:,^X4ގT}T@ +aw}#ztiN(q<8,XG#8Cβ!wJwPoC9Ԗumo_K~**EAt=X%IZ"W!mKt G۵ü03clSoD#Qڨ3Dg?O>0/BN ^!9jσg~kbK.sqjA&ss,?PF4Q4,+Jmv/ (: AE okPV5zhň;Gvg;@4NZŧm{scK~|nF|IT4J[kе9T#%cB@ԓbSdچ^{Qm5_A34rq .1Kb" 3PMh5Ɉ>awe~JK8f"7N@&h#\.Wy4E޳R0#[= f]U]39}DRufUa&`$97Izoz4h12zQQo-K/Z\`l?`19g0ue11)g`0|ڴ\¦sDʬY:8O@=4p`P}|k١vFrg'(~Y]Ou2v-Kμ>,guMhNFܶцu1agQ[<j# _r2d`J}=O7VX,5X6ʞu.k/wEf> +0=p_sڬT璅@)cL@I -bF'bcd\AaK9jbEq Ž**(Nik8Y e❐`A7?T&Ǣ +$"qqt\|{jN(O%+OI:ψ]G>Fy$x{\7sXpYv\\~ͭO5F O`2a, ws#f?W wI +@#My 3Qƾ5EP$pCkņ8PjcCZN;@x87Xu1A쎼s:Nk$,PC 9{44'q}ÚCƨ{JPO S5#a֠ U2s_^MFuF{A1&UNNiE¿U11pG8d7aOvj}+2l>d>FB=.E3mSX? J';?8&j?ǹGI.F_vZ7p֎Ց?ނ,(^&zP*4\6,r[7꩘VfV2";udDSdO*`{Omt#)6o Hw.w*>$ څFH<<A{А26D}`a(?R|ŢZaΐ{Ҭ(:2TdbsC?κ[Aq_#*5$yvGTCJ U&dF^ڒpU0f9]_gDZ!w _;z#^5aD+9U)3g)/)Rv#W'eԟ\ [D w +tlUl?]vf VEOY}xSыՊHҟ*$ !P5kGqpm,cIų1a,=s.Ӓyٗ+f[gjTi.ϕJB.9Ȕ$I=>*PY;bܗ?^`|DмbFd=@ڡn3Dh]"߀Jh.dNV6pwpd*ܱ.IgK*C(m`2BSp]1 %ˇ00s x|QN!0O>(6pE;u CP8{b`dnuHY}bp;-=$W'MoE#'vZ 琴 +13 wCk JMi)YvB9+:]cm$f:nm'D$lzj Zwr4㌿5&օBH]1STd""4Qh?\+K"%_F1"PP›btM '8 bzl䌣_w?J578AlK~ +"C[wa_#p> 0~`pւGsIJ.}^[#əS+4na%YVB~<,Ӌzӎ 9Zv_/SM,~V̬DKP}( F9w7Uϊ;:kxDhp?Rcak>r/oqEB %3}An=sL"p FaUp~#wE_.\祧wr̹5YsxMoXXdW>d0HMFtUhaK숥j@{G2H)9C8VJUzOI苯 +(_@D^J;m +sFzyRFAr`  gcd/2뤥!9K0Q]j9OC̶ iw 왼^9W Ydn[z4YNJauO*;DğʶY][?#tb5Y\'B9//DJ J]qrrb*xcBט,ql]2θ> +2R Tc6\䶒rH=J;} aUk]B3;쏣y'pCgmBd~flZOk8 1PPTŹRVqArtI<>1 b!)GN<0ٙԵ݇.Q~Ʉ"<Ivg\Rpy1u+ + 6} A>tG\E#sqAlҶ @NqMQE ' __m +fKUej}6e ϘצҦÙMu_y ZZ1g@ o +kbaOTPNϥ-aX^CH݋6']rnmF{&jp6SWOM@Cp +vQ|!~۷]'&ˆd-~f +D2?eNmg;mT{*>;~y1VFCpI2$j hp!ڽA ܿ~;]^TKS8`Z0XM +2 +D]LYę/]KG yob *[O {oQ`u{nDYl_X-ʪ-輻?lRؿq5ߝYoޗs +jv,ȷ@¬f՜1P*:}vi=QOg{P)']rA(\mV>*]yui5_+8+ dZ@B3?yGVժh:ga6pB4p6km1[!Շ6d,@ QNXHĉ1BG֏lbYAi !|bG}nth>h}[9Jp!,)G̓,;t4۾˘iEE6G2(,5nw>lsv{Uy΄ `lupHL{j 7I~%7-Kty t,]2jAY& nNo#?[U&HcrfF=Xw8.n +M{,{MRSzR)hx|Ǧ ݴb +@1ն$h]KtexOBJ ¤Nag3]0veϬM*ᦌ#%g;FGh2vB*Lm7.5c%ç~Y3Iлdq}p/ZW(+Uq`~"`.G,՗K'JT 撲 #m UŠ%J\bbvflS`[2ȀK +0&*0"{0E#J*jgT%[طuB&p䶬#e"b *oqu.,TKS Z- 5`sݾOU|@~Gm! Bδ(WꪜC+7(+(棯twH͋N2n4| ++rZr:Ky9zdn,tFygd/iG3$@i%z!K^Gҿ#wrzTOSCBw'1?Rc.7_tR+Q2>~YMY 3 ر""P(uVa7N:n[vac Ɩ‹W2>{8hl 6;O/׭^g So箆sl.Ύ`86NgC.l@[!U7 +J=uX倨3,.[P*k02N&D\-KI$k݀`ZOFЬc-8_a +*]䝵=#;zy'H#rƥڌ3M}UqW鯌@~EA.m8$>+a;q TX xULDrKgùǦ̰KRDeb̐%xP\i/f +ceZ؄u;sX]u2[@[Ä7SOoc`9Z &yr^m<.ߧJώe@D:[-LOMp&JdP'(8jO,@ci!zbQ$?2#ס2qٱ*kO0Ӯ;W?ޓSMz5`kj~'R2̰ۜیux&ZN0/q^TtU-æm +:sg)m|!]b6< *֕vQqyp_^ku[ ߞsፘ2TŠjt-swJk콶vTb ++2_7 +,Y~@mz\db=E"m[s[; .pÖIorak & kL٦Pq!|Q%CTvO#WNC>^۠f=xy{>g!L,D^uc< Rx 2~ +4J08'RS\dh[ɏ)>@?F">kcQHK67ۄͺ1k¢V4_e~ +m)1Cf)gY%Q ~]Bw}pc~,Lngn`HZlذşGYԱ}6 c8bI1}ʖș@a Ǘ!OX[ +^9u윽1J@.oX}$|4ś֒e?uZxRD3 [SOn,IZ8<`Yw&L-J005񱴃"< ,*ˇ&ʳD_jL=8K.fqItR?ᡊ)SCڊC~VyL}%=] -kmGٲHgswevIް\D7&n:BJ bo2BX9p2ŏ3 čBxPa_Su=b3< mnMdޥ "^䟋2pJ4JT%C1}`A*_2is3Do~SAoࡿsϩK!$RK %[ݸ|b +ײf!gx9gJ{Ё[Eq03>4 +WdƄsdc~x ict\j UzXm@Rk۟ c7ɻ-.O4%# +d!pX7m +P 9 ^ѭ +׵ŭ(T03sph,sG੢?}qzO|ԣܨZ@~ r5wGꎑ B\lx+UunkY@E[b%Z]Yrn|}HU/<,iG!8+Ji^Pm=;/WDt*BدgQ؀fJx\v֣2c=j/&Oy4cbeG1Ò'bucCRgU=ߺ(-=Jn;9f9+pv=[>z~31_ܘ~B$KM&u(TD{JW4'wrNA_0;&r" Xpԕ-cw#2|u/tSxq]r#S0nqWV6'# [cx:Gn͆[r{<Nu? +rz)a_r9k3tqe]P_놷 +08 ::tиz3B4S3G/AcYYj + V'"-IA}`nPS6yLu}vZLٵF_λrΦx+"3'RNV $iD{I)KϮh(_Ҷ92ǺXED*TҢO‚\̀ ,&lwl9r7䇦)n?]C7If|uv-iplj*ln$J :ޗ)@i"#HDoouR hedv>N +Ô 3W k>QA1bNk݈IO$N EK!z3'P'<'i,&ꃙZv`iQk,S>\kXȂPoZU[ kiviqJH½g &gLEa-e[x +}W?y^Sx ).#)1iˉ?RMӁJփԸ!}ɫ2c 9BLY!W +}j<^jl&7u1JCg4!#-&@_SA +|=wpߥ<ז+PR{îԹ(JC\f-j7ў>fbm^,$y]vךһFdԯ |~M]y +{%/73ba*$A0‡q"UI2z鼰Fwa0N G~#|)H.9 /E<.šJ>}vK_Fg1(iU\ù&MDsr"* ^ŋ~i\%  +ЏW]!vzz%R.$@O.'5痱dEm וioO͇e},\!,Nb +>?5θ1$BLZ[K{9cXNu/L2wxa>ֵ@8Fh 8uX_.8TZ%M<$l4Ttw%{zu +)$<נkI#?<+bg* Ny@e-_\BF7"іfR^'y1f{U;%Ʊ`l(~ +Tip fV:R% +7TBb@S%B%6 ]~t[l;"33:+E<.H 'ίWu;S+T5CYZ#6,zvAbh +s!4CMBbu2qPْ\"FO, +P6HD(K2 y;޵#?C ӅSO'BǾp:8xK-i{PwzY+wJ#CHT,E9"VX}faXgk@9ÒdWd{&+<Bzg2^_ 7<יʹ[3. Y )Gn:DW|^[eWE,T)vCxUg2@hu &H {`rnPO +6<1çI;ND`WA@3Qpc`ಜFȡ8εѓYnAYkx=jh#z:q *#E8ls-N:F~Buq]`@8\R}إO-#iRQ?Ekg_8/IgoHLXzҫ26(${|s4=3n[GFkqE\t:xћDK=dG! $Z%(ѻژv caPiz]։bMY\g?kƵ ,d$Joܡ#S_>DMf!騭q4^٧558kWo-tŪcCU\gua4&d3ѺC}d?LJ.4[Lx/Y7 B0#BEtU*0Y}|`^u>oVVװbߗHHe4Ӆp(SI a+۫(NzV 6b{lP9ܟˣ]ZV\sqǝxD^Rt݁U9B>+`j%(Zr+ī^2] |cf%m'ϐV "XgbOsRW mL+XI)S +pl/ +BbtJst?Q:)ǣC{\џi(j3vY)B3H$LJ\_18FGxSRk}$zF:A>&dB6xbx~pѲl9ٶɒj^B:5 p4hBk#ȋwD聡& n<=^f1öS;CE#]vR +ܶr{6#EpBAʄA+Fs wr%1IN\?l2#^߱lK(/s(I-|Ũb ?DT5F|t Q=A_111sMTc%3,\Jun&pΓ h +-{jaom*K_x. ~n۷orr'ͫ7Cesn~.ޱ.v* a2`ʚNS,*q  + zi?#WAD,5\-9hY5J(@^z0W_Xvϥ1lA&ʗ\~׿ LN &&K7H\7IX~/ҨQ _@̆t+hϳ$Q<*ST7>9` +ݏ x6;whe~U ~4a'ybv|0D=4e?l՟Q޿" 69<ޥĩ+oy $5Ά)$EOTI-{ aZDTl+tBliO' x +M*\$F7Xέa&O03H/(a؊ugngsc4GTie,'!*L +xG*ntדD.JfYAí^YRIKOkoҦF_@x?/-=0?R%M?Ge"dP:9xRF;-rtlԶ駃2d+>_7q~ x~lL eJFzi9Z{e͋pfqs˛PTBKĩոcxy+N$i٨3A@ęYI~>nCrˌB#hOl˄a<= $%WÝRW`R3| +åGE + y ^k0ds@] &#SD-)D÷륔H Nѯ`a 5 ntXί.D]P +ޝ +QQORXZ`-E3م=~MǞ +O%zܽ8I [Bx$9^N܁؀|e |ɶ1 {Vfb/gTe]_|A+?Y:sw0 *!_J*d4p7> ?ܱ<~oT> *y 4 8B3J$,j]F0HAW B6ߦS3TC~Nb~~JxT7e@QcH:'yd'Z>F*?-YnHuTxlʈ7kآ~\A^_GyZfE.=! yGf8cXVj~Nbw7K 4X("t+>: z_wyc?ݫb+ +|iu@-N^^v WCC3*Y}n>_/#xBCd[Gɥo5#_g^QD"[1U`%(?SGNG~ucoAxP82e:&҈dS[,,ZeЀn5fk):Nl\^^"2maNR |a&7Qu^eBH \2<3>d-˭mҾs6) C`0y9j> endobj 2269 0 obj <> endobj 2270 0 obj <> endobj 2261 0 obj <>stream +HWMH7AC*.`0@'=3sY`mlWɿ_>\-[vG8 I]IN81 OnϗW/yr՛HfW8R'y"Y8fug:19h!ly2{"{H5cI5,o6|b|`_/9WO?~*1~s6ymR4WMqcVxhLClĐԮrGabj Tc$/Shw9)@P.\5AWe51<AK~SATĆ(=C4x|,1ݦWx\hiܷb1_3[ +1샘hE ޿[ +וι=e^Uم +$R^L1<U$zSe ",5F3 H43\*6( O~ӪHmdrZo>=2]!,[9N L̘~sR^劉&"/(uګm&r _!q߮:|9"ےi !o1|ΆFF&N%Xzp&5|*i52 T=ď~LC֣hlTXM]7<bJZKLξ=gøTu-TL:⭓8J> t251kg1eCMȻ,xzDH} +rI +o + ڹ9it`χTz4*p_UbU|/h1EK`Zj*nm U}u02D~b(n! }vxw([ݮG!T8NO҉DYg6!L2E<6}bMW(dtt$B40kB@L=ߺ?^wY0!Õgp[6_8*ojpt$+<#w_"5v7K*=wbM.|typ,) /ZbY)gRG7%IJy%]lH7˘%4¤e +5rBVkaֈ^T"CmlYQӃAv2ܺk:w'cBi<~ZhV"C,Z ")jxin8zMJL'b D̞7vi.CJ ~qt|1/Bez +=-vYzg.j=E\/ԉ4&!hou-P*y٢ C¡8$:hz HaI{XC`9ko9i".(E8_MyH˱<wIK3 bZ/ˠ(mVSH`Ei ڃCJQ[_n5$ƋvV̋L&)$ĄB4?׋Ҋ Y4ϪNq}5TAu\17rٽ ͥpʋSTd O|v*>Koho2։b%}IlQkwJ+^Pûl*5B%`LXor(O-f@b Vcxʫwb^嫢5%FfQ RKjI,Dpє81;,}H S22KzӃ>o8ZMXꛉļYde8@HixbQoFZEc![oՀxF +w4-ҧlP;r(W:-w,zI&xAm}DÓ>stream +0 M@&` Mt_]˽d +?c{c +-WV꒒=\#ܳ5(6k[M.?p U3)lSTbYm4ٛ +y6!`{Xt=}9,6^?u [M~gsW41$&z)B[r 7m3Tr*<:;`/;rN|tjb]Lf3'tA8Z4$?aƢ +[iFёҐUg'E8242n6x\<:L:kkU2C0T*\> Bcf?~NO}wރ!XqNz Kڋ9rW5QaYt)W9%SH<# +x![e}n_b/>\ĜAk䵵puG-Xf("#^K)&.!Le["/'y[F>-@CD k՜4㎒=Bl>SUUEv>dx6PZ>${8+VEKU$i,+` +u>4z' +hTYv)gTi+$/QaDUwk}Q0W[L G⇉d[Z|Qڬ2dPEiďEd (cKq|)h4c쪌(5O Q%y]qȗIr𗐱K2e!J@>7QǒjNNʕ1X5S=8z8tQ 7Qava],s,O]D >o%6 i{/+a-aXc~7rw9;jعHK2D; >:,IġvO+)(-P'z:xI9n?-ΡvY F5(?R(lW|!x; 4_ytDX"9ŸWS{=J_#E .sb_`\aThfh.X=9V]/ExVz)1f1Ak]'J+@~f[\fg +eyZɕ4\HGLv<3r*h CN:7-Z"aEwk|c6E6^5Ǚq>mpx R,SCgTxP}{顾Y:pޚ "voSO,>*%;kKrS٥NoqazK\T;;IHh%(+ G)eLL iD*Ɠ6qRǑs]VZcq fG5 sf*7n ?UK$ӛ Yw-\i?L8#e3Q +WS=܁by7I +^bJ_fp@V0Hߠ rS>_D7J(!>̓s@_B +x x.|?ni'o/}rQ0-7fN\rB%b݉Nss |~!\k}~~I.̨RF MbЗdY)KCH]֊V|kos-tYAn^&~%&HW]AbG=MGkenozhh?xogkMZ&8bT_LB*ԼcaQ,+F$[lN$X:7cx"^`>#:'d C^DGrUaMϠh8˜ߞ StChs6wKfًKRbuWؓ\LnC+!nRAjo{:Y6;A9 Wi`gZg;%̷P,㷦xt-7Kᝫ ob8Y CX>wiZZPwf556ESG+*& "=z9šȟil jtr2 Mһvw~ȁ*FO +@ZU2m=`PE`2CkiEWo'1Qx ^MwGԱ@G׳B_hCG$LcTC5#ܸzbᬯԒ.s +$ QpZ(%^sӞ0K" +S)? C<~@$9Hb q ~pny+{T+TnlUye a0P:F<"E2\WDtr9.Z?K#Wz c**$|;; E2u#WŝIRӵLaU` Pv:BP:Yau8~7n' [OIleYBmuݾS|mVT=@tM`1WY7- 'Ĭ,e +oD.Q*^=zϡm۽] nBt敛@$(F U:/}85U#q6TLkn݌kf` tMVV[58m'F!%!ܢi<Zb0^,XC M`'Ѫ f]8ˆ4YQZn1$=T?Y m&tS Eet_Gcea\Yk%9&jQ4e~ +ߜ6(ȱo \ &;翋Uc;v5[]JB#Gs`+OD]]^lNo)j9u0m~݋Fyk,3˥iS.#~ƆeۅÊF:oy 䋎 2@B{ΓʨXM6[}csi~1^< +4؝9p/#IB?&U>A@zKNk#e q +1]PNTy[E"beM +6XD +V$YuKo(MyBoGs'i0 d10ت:*$/B` J@ETi!.Γu8ؓYVy=F%ˬx볭ۂ8/8^Vրm`kvE[(E)Ȏ4A04i*H'@ֶDiT sM17I71Y"ֆ` A2>.7jDߛbwoJ$3IxE<o=[g FfxϒU fn /@<z}ňivK5MLԟ|3ig㶦KUL|QN ZIyJhuՠ*Uvm{CiX1)udzV>DoCF݀ \qZe>2U8HKE8챘|wl5_0`BDcg\"ڑ +K}Ο-$lot+)y21?Yjv{J#mG +&#1!s~|sJ̷ƯRym`eOM9!X9GW!bZ $=X)X\BњA +IR\>>k)]rs qE&iJ"v`OLa +l4IV: |xPߍ}{GВ;eRL %sv)aX$ qg=(9)Y6?WU)tu?FI70Fk_j"BzIÛf[L9NVᕲNe߅%կ8׎AF)?pݻh:]x!ĶrϿ^{:ח ,DfW]$ϑ Q9}{4RHeLY͙6q+a&B7Ue=Id-z2 ~ zS +0eX_! Ff)=8.)RU*Cq@U>hwoS{ +N͗wDx*LA%LV =q6. +~F@ksZ5CɌ$\>.vBSo LTx^VD)TW^9Pȍ`lAXTtMd7*x)3@KK?J9'V58 4VwO}SU7y=Q|YB(y~ ya[tB7oZ,lpЉ,; } [5^a_]QW7CDKD1v#pW(|R]F݂͘&SU.V:: +N\)?֪NMr_&3[+q}:YEze`N`{ >8ZDq=3InLːע)TfLVF86)f0\[PkfY.6ؓF?כY 1YZw 3GHaO`APƒoAj=YYD.n6i^j]5ΊIjwWȺ`~#U&IduZª8c+hʲs>"<0 搓NS%'=}F4<4Ÿ}ϔfV$/>q6cPzGڠkc"^ŭsN[dzb|V|]Yaũ$r<2ؔ퉜qzLm=&f@Ѹ蒮HNRKohmCJeUJPG{Gkb7E_.1 hKkf|Qs.(m?uYj>w97}yJK^Y@ɉzܯʳn 1pyM u& $`&>4mhЋ-9B0Y)Bpv:̆?="]q;yK[gPh +eF@$lW0D$Q}XnݰiOBjp@i@L9IeA_#4zrxXnuEZQwOlrXDtT8p?b;gw\ 1k)`KuKҠ*63M:syАkdYf5DgŤnTMU (mqⒹ@^;9 J"k3tqiY@m3v`"-|Ucge n9S(e SZ?WJTO2)`J!LA9ӏ@ w*J<f.o3Z6wNN6ݖ~;̝+Kvp+CbC/,[T'-(]J(ݏ)& +Ӳ}pJZ>;D[bg*jl>UT6fpA/b4%Xr]f|dЛpԈc 8T =e`"l;ROexd/C<1 GKvlauߊvAychMhj\NC;7^0Z7*Z!\GdN|vQRW쑡B-;D񎳘k5 &|Gc+ kST1Rbb6^,&s .qx3TQ!U[/ {`r+'yA{0W~.sG%؛B w/):Ζ;kc2$ؚK∺2mȯK99b-ULᷰV@ +M(#y`>IOkD'"Dq؇w&HwǸGBLčͰ2b|A"61g`zJ?KQ)vЃr|iHP^ł1 +i5ğ2%VKK.;s,YDqWL3^4\8B? +Z-%lt94nV{`1 N>Q}CbwҍRtH1ΜVag +ʮ5rnm3D2 ʋWp>yj1„O2TznǧJ5u5Kz0 F}u*#s%upN"(Мqv`w"p]H199֒ՀdVh1m˝=C:'rJN1d`Q` d3O&X+;KֱOPRU}Q +dHB %}bN[\ +(_J?{~'-.gkPS8ja0؞aD~tgr<۫ivR@PьWC@yHCXj*X.gPgI =Nq`QM򝚍P& eҞx鯰;(NR3_dZɧ1fyZM{8ʥ\Cv]C{GWx`cqWkEh?ґ[? + ޱPΨ4:k;b 侍d#c:OB[P|X䗹O2 gx"B -EӀԛ-ߘ.tvn hp*[ + v-K[^"S!\Ya@}Q3x\a,|BϢg % ^c|Wn Wxs1 +Mj,1M?\_8Ǣv <:? h"`LE^NN~eAGv5 =TB4va.0WqőMAr{.C ܺe25.\&IvdwkheOkV8i2Dˑ(N?N,\VTN "tdDeܫMOhjY[ۼ5](_*әs]UANBo:laM(G&Wv*xolh{` -y˃NР7òH: ;)hcn8"I*u93ym*Pw1t4ADjZ !TuXqŒ"MwfQxE1?a;1§ +ƞo}-˸_fLV P]r[yP*wq|]h,^ KQIUԉc.Do:KC!] 5i[mQl@.@S_c;DQ u]:un4:r#ΪLr *{{Т ++ϝT'PՖ7=ffe-FDsڗh2ZÒRWE? p B}wjIw3<)٥pSՁ)XBj.sEjb0x UvΧ 䧴wa\[_tQs角W6Q4ߜ+~xZi^p]YՂhX*ԧr_m<V[vFJϬy) +8~[{ 桬}aGEgPF(5G$ݪ異^h'@OyA\Z_=$ۤVGhL:OŖ_(0'7?HPso, ONQTa ~|2տqdy%azH >Tg".zq!q$QW!l0;6^4 7/V36kL\[h~Z>дM AUjR/ #i5lPuZlwդ}Gs~a?TuGhC+)E]-S/n}y4-C9YI+)Ɨ@/\aaZfF3rETsz`?e1G1}ƷxAgSWsg}Ź(HsH`N~،}!~73 6]:5,M  !SAp@6u1rnh$ۃ"xdTa]{=[5J95`# NU)ʤ 621V<&>ǻyilmk'8RQze"EdzL}ӗ +/dF"f*GU5X;#<TЮ2CR(uKT , NyRv+t;~%O1Ck[:Cx/أ+{j-3UC~rd'׈?Q/ocG,lA3/ĸCVF/6f9Xk ]cyEp4şLul0f7j+4.#wb|FT@I37=FL^o'G8Anƪp{Q\~Ә3+HƞȨbm%zymXJbL<$'tzO Ob lM g84e;#o8@gMCۂpU af.w;^J2Eӆ1v-\nKGw$ǞM`sÄp)yPytT9^D˹rrP1,ħLiKzYB-(P[/ V]C&㳒>ƌ^_Z҄d0D:Q)CLk1tf0+urV }5h6NFn9hL +;OuDzY$Kdh('7ҹ:M]I'֘ nCpYMv3jiA~pm|pN#dELѫ[r/%/ED#VKvdU;௏\<m&x{a*fG*5ꌴP]gHQV -kv%3.)%sWdz1yiS|W#KdCA +Jy^owLڙqPى|9[! 5߫VN@7\dBȨF>I?^:li&(T!l:=fNlެL/%ziOZ3#)0TW)D(=_͐×m[Q:h@W/]޸b7?,6am +$K~d%v +4^ `\B$?|eOq S~ ֆ̭Ӂ:GBҤ(E:('GG:qpZlՂ{KUH/bntM^-LTya[]qߑm v s9jhۂUT,mZhLjRYrI),[m%ѣ0c 5!{tQәXA@:?ƣ6#<1kAT +DGT 綏X +{.hBx0G|A͒_@3U6;27no HRua{IhTP"Xm>i/ŅzZh'(/)c@bRw@},H>r+Ms)MSgE >ɧ:FRM #H˱C[}u50AQз,MM&/۫njշݎ bsxT~HW˰uga&غ"FnrΨZ]p\<1-`9J~lg!neոIHbڧ"D q^[y !&Ӳ|ORQ]HWzG%Jajg!K +'t% sڍPK?(Xx7"IՔ }e6te| };ijvc'_nK2+^t٬ݲ2G}/mKQo" IFYeXJrVnPdqE~6_:}xĺPxT$̳2WĚ%r4T mG1b6p_B>Jmgu㎵!:%ab0 оx"ژ44  }UF<#.jW6=;UٗiOٹz;+ :>G?/x&2yE5!=9Y^ O^.?<dY//&oڟ [Urvs&T3mD֐܇٤m.d~{gg\e3a7%&*%SS/>S6gҗ%R!Or\WQLg1tK3yX9L ݉Nz|5 &\lQD[{h۵۽4I'Iptyapk }ƒzyYBGXSAT`W7s^9+YdW.WgOn儜-/4*+ӣ1<<",r aXFI/7y+"2_H[{ 98WST"u;A5w%e QEaj1W4X> Vh.rmiDQz|#vIo~E)TlQ۽%_1|cyRca\L:۩'#2(#RzeLLot+G(w-+(1I[j"dkpݿqEGִ+g\IJ״@w՗ LM(N +dt=N^#1ʬHE^e񆰎TWc1IMO LƱ5 BHm[Z3Q_-2k8yV$leT4ccpH[5߷3ȯm̪ixc0K-R]1_ڌ{ϊ;Is4`M%V8'>wl# 7FdVvyW{ZҺ<.Lc6}Pgݜd{Ϛ\rPv:)TM(]J=gfLGIh,Y& K +G{*,I0q37"1N%ty P STrUp*;}B +ȷww[X Tpuw!|Q:c4tXQcҹkֲ`aUl&y灿Ԭc:S˱֘auGjI-uL[}zސcelF.gv~Q=cgO@^~MRe)K2 +L  ʽ|;=v3" rٳ+=s. +|PSV9t.Z۸0}]FEHe ԱswCCuxsK#2ߡUT?ZjU%,jWS%f:\< j5Iru8 Xd5+M*_0l#gFf UT|9Nf^ƚ>Q=h$i3aRFW`S f I@Xhg%C@ICQ":݄ Z3FfM!= r&&X9H_Nݒz1iLؕ16 +1 qj+'@ћG)fqז}&2\NEWأ{57wu+! ْ~SEv& V.}ЛLkpX$*=5 O@~!8kxjtLvD=J!ȨtJ~/~#Xb%8F;Yz} glo݅P洲a>po,&džw,'OA!3ocaߧjlußBv\S.=#'7wЕhj= `\yiCm>.측H؜.Kȝ 9h CEh"/4|˚FYb2Gdz׈*%.c|/7yy)F*9ǠL)Y+r߃,uz4at"҉?38cOBi "pHZII|{T8c3Gn<@g %%DvS}'`WB?yewZjY ",rlF`?yD_/)/z"\JΏ|$zSHN4PHd{ppV 8h | +=*R.}wG³%Ζ)+/k)7!mr5 aP gWZ>%I:c/6V5XBhFg;R(.aw-*Չ,j9(0'm!)zd2y3ߝ b1HȜίQH4(G6ЄBGB2h꣖=LOL˼c[: Gw6G*V` +]1"űs^mxJŃ(yw*Fv!.]D~=F:H'oDvݣ+o1pwO:znb{CqL߁9/kIN_c;jXKv,88o'J +^&K jlI>q',@V0b{9@7%wVQ +pL'ApئbJ,nƔwL6sFo| .:3,:f&_!ofw"_<PMt|t LrH)imM?o)gϹtÑو\ϊeC߉9iKC5m7",SaYkYG;!Ag,!G 0Hia/ZxE7Gkk }ʷkKhWճuT=ObS{!14Q<aP8pw|5ê~;8PD."G)b3r,MvETCk Mj|N֨F %G.}q4 +iI"T%#Q^cn8{(XɁJ{JZ`g-ih5./'׬bs(' +@yfH>@Zc$<0MoX#JiỖ>xuc΅v X2:26tlq$b4z4{PvMaEh2@P9钯[7irLQ LO}t!!) .fb62|#P l^w,:ZOXM\;GkHI1t!ol zHd$FgW= = [r+5Wo;_R,PE{">8l]3*gCgq0PhHto$r"[?vԭ^GG܉UG +p:J~[ V{7J(OZ(*#uUP*toZ6[`֠)] +fOd?ւ/5Ͷنq{HoMO7}K̏yXIEfOnK Y8 +ڰa,xu/4яknXK5K|>w R;N6񷨞~{msQ qIw/HR wb-̱ Ƞb0^^&|JxAa^1k~:k4eۙ2@jh:crxK^vZ<ݶ9ٌ|(H9<8mgw\Gn_q +=)CW'l#ݨdA؁Oo^)CDVPWk"7͞S8%p <1Kw0ʞ̯iE+Mni._1");F]u`za5;{6#.Pޣ,@R3KxLi)Q`#ݮD5\3@2Hٽ0T՛(aHSҹLtǣBDX ^VXƁ*o8v>FC5 +2d>k L*C>Aڸ3KY9tN?Q) +)?. 95c' !Q_biԵNLNzbl>wnFD]6nMm7^djP/ YCb0s0 +jZ6./>{O?qV2e݀X#WOse~1gbȮh*֠1 = zA@:[;""{ Rz#̺{] 1O_dYoDi&F~Baٮ̵R@4\,7:Mpq͞@|[\{ڈZTX7N7*7N [9& 9~J4rkx {|8h]Y?ux F;f`b" .m1er֛$'4OR䓄3tsFfL /DFh8On$f9e\ ZٜT>Ћha,zM=ɠ(_n<n-*z;tN$8x.u'0Z_tb̬}kT!bSk/.=&P`:AKE0̦ AM&BEE\x#z4"PYbkbʨ,yAF{n< +;5?P[5#bri⤒9 Ahv"ʪ-#Y: ;Y?W$$ j `Π%t^Ǯ?LF@C:HceWj3Fzpb#`Z%՚΍/W|oHg?y.Soc3v\EFNΛK2q0PcdEđC֗d"$Bzlq^ +Y^}㜹\da5s)`\u;Vd< hzXƒD(>[A;3͌BJ EZK9+\ L}ZڭzVW0-7 &kSLuO*c*r:Эv4W5"竔Tb| S>%.S-[xiLƞDتLDTOA$+(W<׸DaDk+DMJgqP*.6,=(2ܓc~(E\W&1GJpg{HoUocD6ǭ2`|\O)}OF?<~q\O#dѻ{GkU#͟|09!i +XJ|>ˠ8e?MW_/;둩#02t̒` d np~d}VC}vlg]~Veɿw®H 㬿g0'_2=3 EDq֝U?' +@©efvőx6 D!HB6g߲4d + meݥ4yUK>k^@lɻ6U@q6.Sb!ܱ|l& +I$h8MlR\'M3,t8Ob3n)[UZE7v>Ť 1bk10:*guBKgwI+]BP.R7ӕ5oe0 endstream endobj 2262 0 obj <> endobj 2263 0 obj <> endobj 2264 0 obj <> endobj 2265 0 obj <> endobj 2256 0 obj <>stream +HWmo. ȗ@ KNk4H)P @AZTOd`wvyǙ%;`3< 9̄ÏY!{xv'׫\xu''brwqWfr7]5,H/S`vsbba +{qV/wIGiqa#}~lo“\]xJ*Ox|<3{4 HKvrvN9}}=(_tRO0ͼ\׹; )IMVŴ=Flwg/Z@IIfu"C ' +5 w0H_}>-oRnzV{W + LXYǤH}ěwgCfջcd).on:T z#BDOCk vB= +9#)g#$1ڴRN@-u{G1#b{=]Oi:I,)L [QqDsד 2hRw: o͂fbCU4ˠ2dY٩颜5fcߣ48Pk4[I٨Qa>:nOA[yk١9*~pH$!BrO֫-Li@Nf/ym2B +pe_Mi5]uaC`gSmY4|Nҩ$>;H( Y^Ŏ|"87Uj+CxtJwwhmE(x +TR6O𹥍$ZF};aXޗE4`)1;t E|sRaOTƵ"uryZWj=Zne=Kf{|*fu|SH$tPB+e2@170)a#>@_& hYupH"-T"0T돍dKUYj5+Jd!̓ +h9]FZ {0? (?0zmG1%$$,XB!증}BQ]nO Z3nsCG}_xEl$Fḧ́83x?& +ie~~cwH+Q^U%z9~z'At ٤Rg=ahc]FsPfcǏ ]N IV'#?*Yt 社kf`xRv F)j^ +,,guxxTyBDxjHWSAC!ڮI:ŧu35ѶXG 5@b?; aҞH qs~Փ 6cxj^S- n6#xD@&"3zLbzj|JNtfOf^lP͉]rƕٞt-@j |BfFE?᤭͒ GE<̼ +%19b~I8S$zky\sγlNq$ittr6}8w>vru{9kVB7(#;>TE}C'ylV܋ ^ro{DޱAƅÝ6&9U1/+\-Y2 yd9=婣dИ(G!n?1|>ܕ`˞@rNH5a %n;?<6Yr2YVC'+3 6'Gv灿ɀcJXzߌ #%3,kTKۦ-,Gf'UTK:%YH,Suw-}€2q|l}Rh,S s]  wr mSJAEi ;q9HL;s.Pa +~bO j<{6 *&x"v2Nw!KxMn#^Z1qLeX}@nNK?)JTzf{=]>G4:EǢefS>@Ϧ;e{v]U$czqcCf߳H+ʣu9y޳VAϺ0n\ɿ1[ɃB?Ǖ%qb9VMHĞ*zblLvx9L߰/<-־/';w9 A=#|hHG endstream endobj 2260 0 obj <>stream +0 Q@&k Q[Z-֖k ry %@4s큻=܍A@IGla V<vuoњ$\;oW*ZJ9S] 1nz6ўc? Jѽ3 l)WEy"86˦sM>j$k +!r>)JQPYҧ*1xxp>p"VZR 25"@dgJޘ72w gP0-O)D<^_9=R76 ;[x4K3ָ]Nx(E/u+u-5'k*)KRRk-RCᧅp33(jگݍٕt-n}&mNYiIX)MW/qd.⠪w2^ėk_*R*%R[J?U9Ed4O\^;;>"Y,} kNgUٰCz +p"%C:P/It?JʖQ%Hdقo@z T~ raUu| ȱ>[=ǀT;Y}o%W vw#-PEkԀX%:S=ƾz9 H`WN!()BNrY\<:u9e UjX\`L.(E)(=Rc.&~ؼޕX(+/hQ0Ӌ='z1^3k ]K{& f9Yđ.7vi\\Yy<5wsyH8/ժ0l}G$1oMtڔAdB{G)]~ڜz[A#q?k&;b@TX1BQR\ϴYY3*`qrWYQ>1օBƉ&+>?rHN.ŏ +ł8\kp2 @LxWƟ3..<@bX+ cj-')7 jx}#`QRc c[pD61s/Fl塬 fsKO7p{z%/ɚGN hO6Hl0W;ȥeo/dmNuܖ<> dk@R?y.E;~-Qx +V, kD4?q[%cg)U׻!VXhmTs\xabe~=ē#]CPE9ᒕ˳ W`rI?NX`]4ŃVs2A44nuҤ'9v5ץz/+XU>Yw(Q1& + +0Ѕ+s%F^9 .U850-yy'O%T#@[ KZF)drcz1^`p-u|C- $C!70zK_L||QjEUXZq9 ?SNVۑv*2q!Ƽ18 ӆEmi¡]Qʡ>TJ? ܅V"JX5 #U{Yoqbo%x8!:7IR NrQOr-:W6ͬA  ] +CWִ=LMY$?ɩ7MzTjO5L_{ ;IL ɻg0+c9!g.yB=qJR UdvC}K%'X^@42+U8[nuXgqW)FCI^Rd8?b6JDXzns%QIiB}7 ,eK+ ~g ' kVtU.Kb|"RG#yd'^@[]\p}rPfɌÒ 4er +oX7 QN tk̾1ao="nfMfp'uD•AK"#. +hkLM܌1p\yh@ p(h%ٺGzKc +0\2ח̦0Qq ]›{$!@C*zP J^J~lC84q'Vu]bz-2[KN«+[r>I1tl(ȆL*ǰ{-1}v$Fߒֱ'\1_<NRgXgq OF2|z +c Q¬ LX-C3:Q^dF/UU֜ Gú>TJZk˖n<mf(]5IX8PX8pY)YB{; +JS`\ZV`sF"T/U}5fʥn\̈́ˣ+ u=˧ $b/P6ď) $"GPva/(W5so,2/)ԏn6b"S Nt^QgNe|auOJwz_gE|cW7=1hN-QIW_/yExQjrEv0!wpi@i_CrVzeC̿;~1=\m&tN mVL0rŜdAR1^pZq\Rr,`7i|J"C7x*GC; pD"|7&EwOMcͅyo&#G+,hMlߒ +MEcѨN\?^4vrm9OplJ4Rf059|^DsXLB%!_c;|2ꎀI I^ @>S4 +>mg{7w}"I:4|X =kBahExM%fm;zg';yj>-)q׆|猞hj 'fB-܎[>"9/SgCR]}(2ǘP8pdji,{ν@ +pP*sVJ\|xE) Eb6ŬX1iz4i=i'P3s ? b`+ +51q/ضKHDqusǢAgnX \ib8Q V .wo慣+=Li$d=*m}Hu u9 ㊥0sUF'hӆׅ:$ڃAiLè/iH{+t>qΠv51ϝWJZ-ol?MDzU $߾BC>E4?n E]x +Ʒr[ŢÞ<3K#@D#pɟx69\RylGڭv^U9 0.# RmVW&ʝzd:ϯ Mw?@zRsdߏV QJVc:7 /WOwn[偪a>LfFpL8P>k ] H@NM#0uTÉ2p+zMr/pΫbzNd2 Y"9.{ mĦ7St8JM?jY4JÆ +|0 $dO&Tk"Nw> cqVmzt L}Yζ ɞjwy"=KNwnQ7 +vf9YYI|b Ol|"I1B#كf']D6D퇟[XE2 +` \E U9h)1vhDT! +ʷ%33:k"g|U[ʤfn0+<ԧT6b\=#zB3ċ9c"% +cfO@([A *3B" X+Λjx$ +F/ܐI,BRڶtzZ_k>4p@Dk+ɈUկ&W1y\; 3Ogbd&Jh-ŕࠈpXU\1y +;rK-頝[.nUre6z9BCS~XNo~dDlwLbF/G zYx?9ORgd (,ld|N-cT <'mRJC| +s BPé2U 2cEO*q թ%֬y/P5m 3vUOW6L{ុ Sa FTt}>{NYpd~eT|_~+\0g%=7@N@{3sfPhH>m]oXΡ$ipyLkCOtE=4U5ٗܲ(}tL11p!T!T}o+c{ƒ}~?^$;{8Y˯ nbt3S='U'_ r=NOH52 1 0}@7x?CCJ47!`S.סͫWm9/SL[ 2J@w7D[}%CUY;Z}l˒zA,c݇u ?Oj@Q̀;#t\^:y\[Nzl  o ^mzr>ʼt.11zsIU!7:M3yݱp.]X~֜ң-qڨqV4#|DR)@׮Ia!=%IsU( 6 RFKB~1`Ez5!)g][!'CMR|})Hb-~.ಓkb,'tFŴlN(sߡ/3篅(BiKX? {Z9޺_nܡueЋQ0y9pO;HIE >SNf߽bt7U}}he%ӥT'}AY%IB't,B[}np02|]|<@q؂~_+ovy'QIfKux[9,r$+կ9:bL@Kv꿌$~%#[-`&Gis;iJh-5 Y{EM?к*L@O)IS&n -G,]%u hفe.Gӑˬ L/{T6pA>DP匿fxhz0ZtձHw[ =^)yQ2f$)2$2S Qy4`^K& @ea o76x1/vlx}գTIB[:AA-ʏr9s'zT {S< L}_#Q|S* Kœð 9Q?H{\MT,mNANSE+Ow:^<}iQ* ]yI2P,[^E[ ꀙ|TyVk0Ͽ0qQ^f`5b"\rL|g5JЕW)$yϙ݂=~$.Ԇ2s1II|4Glq=& f%ltA&/j`~4KWf5Lkk$; jU|դy,8e +7t=CTzE2$6X_wI 7D[E%JјwTcTV>s"x4aGq-d;aYQ wƒʟE羉B EְrF@͊amsGEbaO 2}ezR7Ǯo=&7C2+.u-ﺕ{ᦧ%c +؍X"n'KK_NN; ʙek`WK I MDえ)n|gAɬ,ߐMALb0k>|,;'Hlg`"9\&gvNcoLj>ߗjK)tZ\Q.i(4f <$Et O%IR47"_z4oAZ[3ƣ%1 )v;9 +kҵc'ٮr0_x!D*GH7x3wI&o<Վ sݥJ~HT5 e6ah$k9߇wZ6 wO?VI{{T jQ +ђ CjzB.fƽ:AMEh WQ~W?Csf,^+Q)]3wֱ9bqj¨v%I`j7zQ1Zl };\OG)+.HVSs.$40•\uSmPȞզ߶f3h_*#G֯ҷniXyĴ_laex"Zʥ$K>'漡Oڂ;.`hN"S-Lɛҷ"J4^7GnHommNʴbjVcv֦-!BRWj_#V<&qJ?`@ʼ@Emp2(Rx5aDBGEd?-M(|WEF-,UJ;nE4^ŠT7(-hpIG+SPf>?6 +1^jޏXe[7:2I& 3Kpߦ;~ͧvR49Gf),OV6SEP6 :ཱི7e6hU00˙XRt>5n$_:Y;Z C#4 8n +4MW+ Ƥlx>Z OļN* XB[2%T':Kxlw,5UC$JoY2Y>7(+fp2*9.Ȝ=,-ԫ<˿4t(D J|wqđVTH]7x||{S +R9m sB,<D~E0Vէjyj N##?r/S@dcdˊ>Ҵ cS8-8q;j 1t֮\O$GAwl% BӰ>5 Oq.>GT_§}Ig{x +sTS~u}\ާ^C*?&}Ck<5प^J#;W=3枭sN6=>MrE*qm]c #kۋRY왣{NSJdtlُӾ$@ a+9f— A`Mk[GiP,i^~,m RSf Hh% 4i]wiеB0(ۼJCM]m^&Zr]4 <>B[ q¦85p}.; H~$mx~L4 $5TH\M}SnmN#}ד YsdzLfKCoƷ!R%oK&0ZP^`9(j>2#TXͯ٧fغ;P-W'q<)MAF\ubl;'fTF$d/_P]4:?f\yHO" NO2KnAu#K{pĽgLz/.FhfB/up9P14OzvJfEޣ)H.菇Tq- \IHYD2^'޵U /{t _bU.SY*_,)[3 D2NĊQf 6,a) ݟ,3rM}P})I|&<7cdڪmVւbR੕Ic+u#B@p?Ya^͞:v2!n˗bk!C\О0,aD(;xu9PD zDǒ@ w@׎Gxc0[#KuC݂ Vg_3B$:׉%3/n$4`$Fud 8%c"7;70zGvc5mtħ`6C%rא*>Ec[ZpTQl7dQh3[=꣥&hTcľ7띫z{B&)NYB_^N/|16zpA_Lt&'f% lm!҆Хn):5 ^>G?x͇꟤&5_&u%ROHҺȃo1d٤`"`7-9Pl?gcd!.bǷq緄RA)'ہc^\<}N+VB(=JԵpP>z (,)1x+Y&–:2']2/ݪ@FG ^&|)Rqc 7 uf.3栕N7=)%[G|b I4,=雠x*Vֿʗ8i|s &u%՗-Nx?\|9u>. +~SrÚ_Kף6(3i#dVE<{br\XɢBsTҪZ)|XT:k9ޖ{ł@>7ѽ.&)7caX`ԍ:6v}U;hg*6cf$>_B- .hUQy̒ACga*>  "ieKoo{ GaC5P|uA ڏ:ٯ(#^.,WG/bOWK~vDt@;为 fn0k6܁DWeJјT\]4,E7XA'uSeQ1=FfF󀻶'qfexwOJV9<80> +fia;gGPLxPn71hX!ۑK[2#CKڊ)>=jvXɋ}SҒ5%0̋6*F>m TF^yǠUVqi?k%/#m]M~>E3@7C doi߾?PjxԾnIЗܰT2VutR_}sLHwz*8ˠ-Y=r2ۤ鿼>9gzx. @6+@I).j%8#SԜ2Xݎ2SURmUpA/VCF9dku/*놄AmVT) +k7SV3Ѣ@ʜL}QuQ*0{8[f +I ,Xn^.g`嫵V[QOxf~3Տu',jDɌHw4Y9C3UR(7\!k@o2iu<%mO +ؕ&[B)ŏdKrC\ͅf-|uj67wJ%vZtMY +.#w(|Z,ДM'8AnoЀmsE9aD!gCd::P÷׍1~9*9 %wtO\^DPf]<=`Wl[lƆ]ZPNTr%DhTh( lIjD\T"vӽkBroN\:BJ^c~*Od<RB-& ڃVNhHC y<VX8ǜ\k5> 1nZңX2]$hjR{?A>hvI;ܮF+Cmq| vlS.4qu &7e#NR-e#?GBX9"nc18 (#y4:LSZ܇u +fR}ecŗq߅"IB~ /7A%E-޿qOjndt'w zLE6fOd;|G K*P aϕJH(EQcJDFVijH]:eRO(#Yx'_:S%gnۧ,U**)ʾP.7E jXqK_ ,WGxYώS3@r l &KǏ#V Bt?,p2 2#(Kz\&PI$o[߈3K1xO/@g}u/fsCn];.rÚKlUCyx)) v(L79|KA[b^>~\$K&N H}ua(y|{`Sd|Vߺ$ XUD%$cclx 0#b2T X*n1,+D]CN٨]Ww37;(HAW-Q;@yd9*:ZLUjlr}".l4X`&3^Bw3u-p<!GV暑ȂqD3o +_ۓ$kQtQr0tvQ1~ۑw~4k1B =\uӃ+ۺ#Hc/FKlE 5XͥA|Bt&Z"GDx+gQ(@H40a#כ~ouqO]QFG4zPU;r;uOђo΍kQv`T. ]oW-:;AQGHT +݌p p$6&PZ=( sNY7'hOi$Htr!8CI ␃I\$@˘RYc'|\qP#yN6]g|m”0 ϔ찐_QF> yڐ)5 . *@;h jq1 DhJ ^ѩF۟j]G۾#=UG1K5aIc瀒B]x܋T c׃L(f"Zm" O )1tyә.D; +j5IcLNx: bZqmf0V +J4!1Ml:Fj$:ςvȣܒX.MjX`R8hDqXh{EAK'4 +yb2L .tn~jݛ 6 C9B9zΪ<ĝII3Q!Kqȡ^$GkOAyęeaYEZ j(4YUwҊM[wDL^D9q9Q( }idF +:BLv9(80O2Qq4e*v[ظ{ȏgLDCPh"V10QR-=]-Ma,Ǖu{5a +V{[m '*f}f^KY|;Fa[pq^NОx{Ky@~1tz@͎XWO'Tu9x/LX<~~玵U&*E&v夃\ts6oJ HF5d|Φg"N?GBQL9x5E eaCU aFWY@l[0u:lE<(F_Aۺ%ڮb#$ )aFJ{ }K,kE3U|.?hsƇp qxB1Fن>e);ډkW+8J]0/MUk~4Ğ)h3Q<[;mf#Z|];?ֺ1Fm`IJ{MaDXCBע>j_lx5.!Klu.L)ǹYVFw(OPq-l}b!,JZI瓶 >S?nsWlxmAtu|Oݗ#Gގ Ci~9 +z)y< =w:H135.MVa^Xν͆vwҰ>`Kozh1V'4g*@l՜OrŞ6V`J{!Mf"'Ӣz +qX#h%֮v^5g 䵴E2:DȉK}Qv>Cm1-5;˱g'|!ѭo^ᄌ%nPr"RD}ۍM">tYT0,f{OpV63 x>` +7)}^tP'GyfY%0_Q y-{U3Rm[o\lҵS44H]Qg/8D)~xEd|`pv/3G&}y'! x_5u=uӿ0hƁrUY9cZz-A=-a2 K&,=\D,mگzq=>б?Iq }@f[8R<.^D-EkF% +XPE.R&G'OVA[8F4[%6+pv*EF?WbSWĵj4&(})&Lsz>"`YpZC"Q?F[Ro]-ں/RUe5{ʢ<퐽>m Pȶf]R(}g.!TyA70:qCů+S#LbwG;WѕF+MP@6oNzS\6vU`+Y"΃S᪛k+>׶m<^nb7Z7>$YkB?Hd4@Hh*#Rj{mz F̘ +G3⹆ڷno^=F7Pne|]~РB?VQ5-57zF o97Pv=`# +,#ھIjsH m(P Z?,@(;R*Yf[C,r,E{WY[ ̗ +zdg(ּ'j}|Xczh"A&; @/VH]?/ʎтC=Lm/axhkjP8+^ dCASn:k +K:e (b7"ǸVm:OJ`'Uy[ym(4e=N>b?PEZ?*#WsȌ7E*2v=MP)|~2d 4j1D`J+{(aQadxCe<ĝ{`3Wp~1EIq&czOOəZEI9RP$XũAXT ;wkdNTNq3LQ39K20i +X0'*;y}@;ȡUA-tⓋ8w4+'<}l ^!>ݖ$e QGXBMBCLPJR#Wx$؎M;}=24Jtw/^Iw'37o<Jk`A EoSܣaj.H"tB⾰X@a/$aF7{Pٛ5kXt2A^%&41t}+fފx+=ijKa"Z^>& lkta7M r+B +Շ7~ԊM!* +J1Ljsm ù+^@-U_Ʋ$+#(052J_i˸ +Wڎ){Q?+wbF;gLRq]5?g9g[@9A/1}h +\"bl_!, GDvf# +{Oq=(O2: ROBSa%y97Mw/dg"iw . +|Ž4gUgM";\>.0ӈmsBo i"v.-Q +wy3 QtUtP6V|{ Ea{˄V`?[atdt< ,?ķzNđ2*dIEYm]u1>s`9?+OiU[E؂ "z%N=$ړzԿE;Yϟ:X9>m1 nR1aW~PM ~~>ﲺb`Sߢ鐹cToJ]N3Ld;6}N-曪bpDZn~s;P ;D -QW<2I U4jR7ĮW陒7[y6؞L@cWr50.+LEJۻB=_O#onk4Qr;GAFe%bn\OӤ +7bcc@fy9>C- yٿ;rRL&ӌ5 ߤFfgk?OnNN>;i[2U4 McB{S[Cb=;hNNdjvsyE|i\W m C|I Rƕ$[yn5yy$6}fcb9jy рV +پuFHScc&2) MɦVHlMMQ4Ge/ ̵!N*+(נԪ:xҫ ѱ(D7TPυN Hl0ka yH1em:-b;R,2uV)57;*>sKf{*hluX!ZGz ǣ4PFAg+\#= +UO:~'%K$V = +D\xIRi:Eo}6zO]$U~n], 9v.((]$/s>nw2+TPrը_I:KR[rޘ\C?ԤOua٘mm7d8K@"( 6Pi+W?'MJ:\wW20k#%G5=ľbYd>ژ?Ŭ)MI/1(Mf v,z[l_QPzY! pU0VoqҞ<0U18W{6]-=.M@F3#C,{eYb^;q_'aT֖l:>Y̌5C#֡wSw[O&xF_RdoXn04o鰼 sh>xG)˜8Gw5uߧW]ȫS|*cHe0)1ϊ-$ `^M-9N.Z` D  ܒvrAО:zNN?T;iwZARz?XED-]_D"?O?tвiut;wKw:3/_Ic>h%k(F/UͫnwDz0JqX4K*G3 KlOwc?1;ЇV 'd?Uj'"u⏮҃Oދ6yƦUᢚGb g@I mt}J]fdI3fu F6_i +i1F= +vK*\ef3ĢVupVq>KrܝV@Nft%^ +x#!K7ϟtd +ʶf<4cnTt)Ԋz_9^_E!4LAl kʠJLM1fi$xOݹ\!QE "4i8Nf(U^x4~ћg'q+Ըw=CuFegi+hܡAkJ 8$gvx9 +3V7)adNvr'Bw6 FNYtى>z y0scz+Rճs. +_Lv=Pf/@8:8?$=5{4 q`2kSK nAxZڿZړo"JwlZmi7a9iPxmIkPZn~Z>4./HљK>0Ej^Ѧ~(;fY:?1/*8q=0s~ +F79bw~H6 5 +r=W 1a>^xҽ[-E{7]16T` +%Ts :U/L5j綰zpSVxɀG@>i#$Lxqc#csvQdZSSwqonO^"e #|IDToh:/؟n17NuAE:Zx02a(кtg23thmB81&E#1/7: ưIB3|DB.dmwpE߼b )mI9ܔXkݕ,w3:q2ԏ3})@$.q +yAf;ivzmt +t9| `4>dBpѵ7uZ)=֔߇Tguf/0&/LR2P@7ldzLcK֌#Дuuq8;eO+RmMooX٘8W츋eIQL\pM7B2E/K#&,Y/Y}:8TZV?R  B%pMsdvuJbs!1tR"))S FrXNkR%*DiHBT^ +G#jL*?eO6ks: e'UZL3 C +g[S5V~6ffGga},1vRB fhkAE~X4n$p1X̔Z;qBZZƨ#n,C]FLV6ܡDk$HUgy{ +4+AK2??SHFLg4CFn*&a{d$J Jj+vu^'Ye˄ @|z>*iv-%ӺY i?#RduPRb! -+jզ\&9o;j\7}<|fVrbL86׏ͫ6O[y-zI9j\Мذ"TVݺ\SK.LŠ+L3f,|w1ydJxTt;ѬzSLF&cڎRrA> endstream endobj 2257 0 obj <> endobj 2258 0 obj <> endobj 2259 0 obj <> endobj 2251 0 obj <>stream +HԗIoVxl}yj;д =(T(bJu;扤DRT`(|pHNUq(&4yOٌJ#n'RBfHD4Dq-r%CX"ׯ!f+%q,.Yƅ\.E)^Sh5H/_;Oʨ3G\%P{3@in>Njmds Z/^\\]F34,p> 3VXdqr%oP{2JgY昰x˥SꃄCZ#1jIdP!6,e))b)XPi Ԇ1?nƅ kaۢam$LKf{6m}| 3K:#*pAIOO +G9R.:TDj"m7{z':~!יZzs̪"k/WCZlT"+`K=•~W`BRmGuZoQ^uDDA!@Ȼ] W \ BmX_-,tUq<|IJ/BfßPW1JTyyl1q^Nh`jӶv8R.i ,zfV\Tx3hp _̨ ɸ1j:5u6a4M1k Xf{/X?>ލF>Ziati<0G{An5a0+DV?}wA|cFn5Ue"-L:7KQ[;'^|b4ԒF +尡\&1_|l fσBmY~t bfI&ӜVj ӗx֜[)a`iYƌ&Xؚ$\?EJҧyͤp~ágM+|ld5% 7|iU-E(ȖV˸hGqm -_?vޭʡ@.7ɧ*x[Câm~ܡ{YnЁ +kS?$`|wATVW)#o-,m*II4/JqNUT*!+ #[Z{xdmfFYؽvwJIX+Ԙ;`JJX`%ro[jz\srFN-}Z"!D2Y'iTp%6rF5!)bu(m NS|.vĎ,% 8FjJ6V&^:}f* J}ôZl$dмءo^ӢW7kBWE 0&dR`}|`q+5a{|?Ww5M;wmPGQJ@A|XmSHC:&`}I'Vhf7a[:W̊Skԓ󿆐Qp)S-ܗ nT6֔w=2)'` tӓ:`ǣDx,LEFC Gj#ѧ!~-k-;y'74$ë5*U:Šjչ`n4.K\h8{}cSzmn[p"a1_W.  ^ǷC75RVHN4G(;r endstream endobj 2255 0 obj <>stream +0 M@&] M~̗xep׹SV) C5%38)Y@0ISmä69'XXQ~P},ﻥ[tH]K_ߦ#q''%E +r%5 e9g3!pqB*Ž9P5D٬-:)wݷ?0cuŰkDPtINo[:'˓Z#x?Px/>ޥ]>' +?I)5띕F[[?u"0-!L57j|!]wP4 .w@d٭Q#V\ĝ<Oආfe' : z@XpC z|Bl,g+ydHs\K[JUz1Oa.AlDd;*uD\u\ +XEn>)ЊOx9J폕~ͫZgy/G +. +p#o/QQͦ+JN{_p :FTCV _X:ĶX]O==kŴ.OЎJm|p8<y_6k.pOK x@ch@́b-GQ3ƘST4d=`-8#m>/ Q|.;'/&3NcE֦ /#xA1#ˌpȿMn.q^L$@ k/@-f S]j ~ؾ oۣfOeTTЈN"@v|hk3ŸFn~E?([|5NX) 1|/ RȵRn~^빀=}\ 4,*+e̬ۛnjժ&|_K'I} :n'6)vC+-Ջ/e#iϰ^Swvx>߰ܮK{i +,ҙ<+ųJvĈvqfwe<OաJ(X,2zX(LS],ڞs&k?z7>s+wr'DUӚ+nb԰2JL +li^$Ŝ2j!1Ǥ?sqv +_kMF3AntR>>p)Dz}L NL{j&f*V_ИEIs 5JAz2WZ;e (@qڦ[9:K.vHğ]ӯ:ou7. :+Ii T2[ҳq?kpkz= u83,^w*1v.0yTݚғ[΀;B_ "f +8 +<3F@joօ3gPcڍ Ps ؋ +s8n^^l{5h%AqPy}RCiq" ry'qw_3a +`+Fiˬm68ѽ(%)uzoBJ:p$zI bV!ӏc%oi7 ~&UtIBfS"2 Ǟ4#-a۠vvDI{MpH?xܫ f~L8;cP\S@(3pMU(Vx oo-x/18$<3ᤄRt@aQO߶S %*2qP)ƧANi$mcP'Ӽ}OPK*5yFB4ۘ>oSdֽ#댐uHV(;\_h9O\dD\1MaUgʋ:ˠ$@_,`* ,HgؼFH)D#l¥@WnpU>$##O"a!I;K ~oS=D/X-n;Z=7\ҫ88Kbwbސ,eNX.R%$$s,[ ~zxv9I֊2f__gY8a[TG`2UR brOx&r~zi N0G*~ܷJ[ڷ{福R6͛rIJ39R,xZ̙n0f)-pQ@?hZᤧ;ޗr~b8NlNQTĥ8"AzzCmpJ (0K(KƄ:M҄00|(X qJJtY,%G#̯Γ/nW7Db7Vşgx5%7%lwÜ\*IM& 9c慀m"kPKc9{x^/ZwXݗu][҄Q]^@O fZVEJ2c(КqWV/8I1KyEȋInӿ3|. (Tz$n873hbjF*2~ɽ̒@H1_0_fG(-A\ˢ5X/Puљ~Rtgɴpe65s#]oYTH 'BpePˑ(/>?u@#/B_z' n>SϛmFLPQԺXo|>?ڋ0jX;viY6'ont>;)I4it7z ~?E qì<0;*WUrY8){kQ'eJ3Vs,l@ N31Lܶ#{삣.Lo (lU%~eXsWI^`6X?nKWdl;mNg/g, _:af\jK> rhYGpZUqm'ߩvC&<ލ1Lڳcb$>T'IhRqt, +rh 3i>ZN6B\,n!K 3 j0#Z\ +"m+E=t⫵w`/!&}8\ K c- +' 0oƦ~\v\Ί0ME^"NnW/bSrUI!ܚ4,>7c|Q5v3mRay)hP]L; 2 AsKԉv? +sKq̦6# K}̑W~cpŖyS }(́+=~5OƮQTagNU[!"-jXƆVi$tE8{U;vY9I-m16mS7^kyv1 %㍼~@oB㡫`fh"@ uf]z)Tgj^(I)? DlpC[b +q Z'㦥B!>%O ER[4 L;$3[Nm[l}q{C1a`|&Vc:IEᷜ\v$*/YҊ~/.}!yY%& q=ߡ\g}nSg+Z !e@E ͫ^!aC%\n)ǰ\C?qFm[VFnBB}Rvݼ#_À+ij~^hGaMN%bM& |,q &^]?ujG281G?I +lh鎦=KHVS0&^J$'n&9E(\a—<ėp@xfQ*l/=T"R" kgyXwwx=:O2.QESrl@W mWYcU-J.BSw#Һ\ cK!oCgEBjVg{̶ǤaNJS~$ewkq'g@EW&#B&lbW Q`ڲ*n +BO)K Qi{灦+*5H P)e&䜑iү3\ǟm[c7yQUح`?NXPw0^<>kDwé%db#C\g o ŰRh8jc Nm9JԐi#YlKcoVDLjRDBM;v!\D21LW#Tf8kE*P@3{'#Qc:@]8+j/NE#>ɇh-yhn@h!Q#݇R +{Z]7CzN!O$3tԶnlwsj8Kǃ{2ɝqp?7|,.H\(fv{ f`DwrCsֈBiU؝Kn{MxeYy_6gwy&,[8 )b~R=7`?n>%ARE G 4.E&!y=^&[5\(];>y]|:I":bN^^ZGj_vf)>2,{ >ArSimҰd޹tQ.c_xBS6ȍL^ݠq/~%C̯K{v,jdUNEg9rfҖev/۞e {F"qF{LlZi 44ڭWI!P!ݮ9X;}kD>,7Uԛ֗Ǿz8CQ,(ik.v6̛V&00aN+vH0`uYj1;2O}OZ wWOOl?eBR]؆Gy".8ޗzC!Э#ބ2,I? +˦r䢦nՉrPYȣB妧=AI +yXQL{o9zphɿ +pYIص^$, 6w_CG} +x\6!U RrR!Co/Hi#u頁Ev@\Zۆ6?!Pgr-Ho;HJga5~.9{4UjE]!XJ[0}T_J5`J'<z_Pvb}֊>e+W|A0qr5p X Whd=ΞwoHS2mL:+Ogr\a0DL?U2 /^*;%2NIK|KMIuˊŇ}~\H>ݠ:p$ *B=အCd5"qD]XlN4pBqIHf7eYD 9W +HeUhAIh~X`Bmh:+﶑w˛o懓u62j /IbM1'GQZTK;\$Y&4{DBg([mWxR. Y/ +0;BpiA@#0wԻ0c?t2jú g`5FBpW<^Qn_,,أ.k7 ijC3}s}|LIBu-i'_;ؙ926nbyyTii|Q7Ex;?? fɼJ,_f85w_6+9],Dv*_oߟl |GCAK:o3%9n).n8mc BqULm5 k4RlyPkLlzcFmn 1s0?y@U×ybø==d頠}֤NPq4gaO>mQQ`f- :dq)BIV[#x{{ڷt FTa ٣Q]> βVg0$FvX+n+6ڣ;UMR2HP$'!<\}dC~14ͷcEocxڢѬ5y +Ȑ.'X$ud +hDLzpvƄzᲱ0+.я{'T{ȋ$ƍ=eH[yVw8oBa CpMBJ^t:hW%T0VCЉ}} +!Đ·0@n i p#cV01Ewxs] wԆB[l7f.&a}ܵy )"7̗f!ܚ$ŐOyP0bTS<9۽8\AgfT6ʡh/ƅ>o~њV:^,Gmx*,jڐX;7Z+п?hD]~.~9'8<pxpg= 2EA?@)zo]MOd`k<ƼŕƪPhH1S\NG`A> [`a@[4ގ>Xu,|qZɒ=2qWqw(o=BVc}, 24`D.֔@Lqn~\АӇF9|$赻Ì$kA~q/2rCϛ DW{hΛB{ wP슐}LL-OkAH +Z+Y3~gWvR˚4?GEr(IȖE~q4͝M wy]>zAOU +Un\GBV R(rJ"LLw{2LRwڏpggM)'5]|zWe7Ij0DEQFЕCr +:[JEJ*6rͧ*[YDo-egS N°ڟ-9 z*'6V9wZ|PU!(^ySb=q0f+}_*2ڎ;Od+m>ːqWXo +O84S,ϽR7}a.ˇ4{T:WOP@ AA7z0l~oMW5s\ΪW/q62sH齑s$WE+arvQj9:۔Y/fΣ0(\jTO,N6Еled6n{V_:G>+^X oazyN_P(K#Kc;"` +֎Aڹ/ +G|!QP啊={ ) ߱6b +R]9SbZCS~@[Yek(`q㠻lʽ7W;f𖊀 im088Qݎ)C A/nݴUNf& |hz>{'B¸n`H(1G Wzz9 ğun '׎*,<ޏ({+N#̱5;V_X ޗr%߶ڌJuMa!r yIc&H%uN5k=pWSFuq|B L,eLC8k(7Gs +i"uB}LRJp+~XC:P>Y(7ms'Ӡc9$Ղ3/(t1~uhP@0/$; ArfssgD)0 ">oQC*Tܴp-'j Qr.?yǝ: Y@bS~k7G2ϑ*cߞl ;`iJCacaB#lO- +ir?+#c@/#k/D5mzqI:0j=?&,)sjXڎ~>5Pgʛ=b!psFypd[oA/ހ4g+P4?!XU\O"M Ԋ,p0NijfKΣh(=C,$+jhcBgݩ_Psw4d&ãZxvG4EbNhk>>Jq o ~k=a6н{8Q23@v( ?A 6c52,?w~&sɳK4ORdkǔэfY}3{Lm1EM0,t-6!,[!ulAU:+a*?QMZ"7?%oaY惑 )*9vÔ8 pk+># ;jѥH" ;*?M>5Bus|'#8 Vsѽo>Xn +bvٱ9#S"Lw t +dFNS(F1I-LRb> `x*ÔLj;\/9lN>9Y0kϗ7>q4c&oyW] +S-98ڌxx0GDžxk 5̬- D9Z O>wu\Ikn~n!tbݯ u|QqXwMJ9K"M 3) ٰ.WH1ZY\ۗɓ{ѽ5L ;Ʒ|N_gZ(mU"ps_>P{XK@ǩrW\'R[8kWc!37mP!PFku L sz؇j٫XTǛ$EUAd@0\cq?)u~o.LxD6ITs,V3@[#^-?yKl7%QTR@z@-;V `OTo.|;v3O$:!q9hpp4䊶IdJge Fc}j2ih^@DLJOBмR;4=LVq{E,"q9#kW~LW5CA}4h#,MN%Y`gsbw "8PF-0"<ld&'UsӅ/øp敏hu(u=n2tIx`ur0覓E4C`jֶ)[ T23@ jI})X.QX\iFw!jAf2D@ +B^p ϩZfUfT26s[xq\@%1# tפJTJ0Vbc[ LA"lGN+D:G$~'\f+^,ÄiqN g2]!5G)4FUp wӬdCS+vNNFOw{|뢯5uNMݒwşpUQ]sG7ؙAxZg(4L%..wc5L|tn}rѾaO3 ؟KFyTJTfJ!w9No_~ E&JMXhXO8/O `+U]J32 (1ːH3抶X)hmUk!1|~9u^⾨gBxR;^ntCUmmq:w+ybQp?vbMڦ{ IzR +tJDj'j #G +b%tίmt.r3+.qp23&>hAZK"p(Ɛ R2dlE%炜VD Z( +qγUJ YwBy{f8;%6PWl "#lX,o1픔} æMGfe!)2Ԭ] l\͑< UQPhҰQ\u!l!e[+L-hh\:BA,;/3ZZa1٫n}57u\ Ro6 KgBr.*XeomcQ$B;> g&eGs{qûz ©n:m>ʣ5SګJ'~34u㽙c vM3~7q hi_:8ȨSʍRshej~?o+ynMKrV?cm,mO*B"cRm3c\ˆzn& \WB_Vr$}q sB<u oԕi,[Ƕy M_߲8#6> P@?`ثJCQ{b;BW8 7$xtr=7*xHd`Si^4hbdx =Άn$\/J'.T/6źkﮤ'%4[0jY4N( RAԊc\& +Ɇ!Np@b .j,D.c:!gunYBΈ*^&Y[<fG IEdjLr^q^xuzd`QJѦ‚l%gQ+>ԣ`ÞuϖCĜugTZ`Լ|G՝тy0RD~₠ste'.ZfB՗u&=Qmw{7%EKdTJ8re2nWh'uD>J_Hˊ;5z`gԎXtmT Fw:eMwm"ԭjBN"˳=~,ZNQ85(Pt HಣvKI0ߣAaɴRF?rd %=/zʛX5];ub;uuFe YΒ%4*ևv=Rfm7B$1jxWR$| m}ϸH)Q^E'WσX4DD\E#sstHuܩS e}-ھ`nd7ݿ⪡#fyrUξJ ϴ!(#e f/ oF8njU;lTTG8B,TCja46J}FEY4VlhJu| z~D?>6qe˘ Rqh AoC~g/yQ0s +2U\L>s/.}O慻YAK@k՘R{'L[T!ǎ2!=)C]掠8OU̗~sa`Uً v?&+hyTJ5U(Xo+*}cL Q.ps͕6gd +9@~WZ 3 `Wx9 qL~u\W9"&1ܗtG4BՏq n ,=64-371d021ZNڞՒxM(SDf>CXXTU^Wաw$ >hp1k➝>@&mwցI@y.v' &v} lEw +adSJ/] )݋0z뭕4Ih+Y*@UK2z}: ̺c\vtSAzkU pF":A~T_1Ow 2s+MS[8zZ7Ld Xp7 33yU&iEp$mO`-ȸpg(𵳆5H9ș-PfRL_+EB4in>g=%ȁLL.82vR0;\izAU/ W{VxU>z768"%S(I֑FLAse {.32. /)G)V.mI\50vwUlBbn)C`EI[41&ws*0e#kf^\kݛ7%iX$BadbQKAlFU^-U%h}ilkg`wYc՞1vR&L>mvz~sds[x۷d%Cnp7rV7YtfCgkpA,@yT1dQ_s3{7YPM9xآ1#µUm la>ZN;U!"O5z`Pc4"$bl2/)@i y3ڪ°a}S~#~)EU<ux+ ՛]:Pbҳ6]8t,vTU1Ct3A<@%) Yo_*t,+ PcWܠnwp=}~1JYϥK\`{xc9Nw8L~|ćׁ\Ĕm?+ ++,:xK-gt,Ȏݏ-Md6g6rRrO}(} ƦLޖsG}苜{_11Ba ̒'Dt!)aqnGvZQ~X[ho@obhڇZ3~򰘶5˳:1_#lg%P]2%]Zo}벪]'A0ȅR`e9X%0Mj~nXM5E%+td5]ica)_\*ԉxlި@AQF928i;^RO{z(DLwb+;> Kh|Fo%t? 'R-k##F-moTd@1"s;أ0vjNx 0Ky !Mp#@VTC$;]&}d\z\+?GIڠE{!Oȸ!&WdSSt` +L@],ˤ7L]D_va4AHk!T[7too!?o{$A" +"\Y*9fb3y7cY}t}!&izΓM!%|@ȡOwijT/d&FW=L"f;L8{\¯jR}GaM3Ƹ`L"ed5|nFj y-̛(Fv VLZ-yHNH)sZ-*U i}o j{ŒViN; QIwqv?t"y UK_ta+wEB-!" +z* q_zߔ[%˟ `3M"J,!ULk.[N `4?kl&gq$`?hVwrwy\QN:CH#J +F&)WdjQ"6x*g~_v8 3?=H滆Bi +^hrdTMOJ0W=KxO6,_޳Ӟ}OzzlGZj4thRCiؼDel ѼKP"~y,9$nSۇ⛹NRN{ɹx;mKWռ^5{-"Ii,XmGKbs{&dȋ.H_`ߩz*7m 8kA|O qj$攖C*2{Bpidc!Ƕ'r'w} ܽAd 61 Ol.AׄtoQ[ ۭĽf҂Oڀv*hODc3o~׀.nLZ踑A%cs7MTPܶ*aQ%p҅[IK%DNy[݊K4RvK+M RbzgIhԡ}'Pӥ=N6J\UbMcO.fܽK4(CMc-)UW:qhT {wQ\dY. +m4JuF* J4mmXV]V@ޑ:f$Hofe֢sLY7lb=B'/ѠC> :@;%+Iin|AJe^x@undF:{5Z\e!1%HM +1f~Q6CnN ]RFB)Lk nM#oa Mf9wa˴*ϣlћ=S uj:r2zs!4,hVɭ"(jE' cs)sY>Oؠ*w5nVHjS5c+wP'4QDSm ﭟO-[q1w9 hi(A%EEaԞ3`O. , =b{'9hx%l5Uh`ٳ+j=E5a'6^P⤎C~7`b!8ąk5S&oah3.G5RG'Px*SY/wf8 x9'zU +?-bAgXڋ" =SPܭ :ԗktre +-p+ q +dl)Bq}^k9u 8n ]xƵF_z-f  +2|轡& >FWΡCxlc=_S dh4NrO:`8$}ڂ%Wմo*!4((K1?sWje0Fp"Xzp[tHenZw{ +@!Ɣ,Sfc O.f1]t)dՋ5c"xSY?{tw곻'>N}cv KTgrP?<.M`zY5IWKD+tޢ.79ijqv˸4OMPjpc_X/4iԀZ8{4ltOM|3L=ø+hC-zWQɍcLnL|;j7I ۴zbsF@J*UXEdWQYW~O'd%\- +wy΍kw9,᫃8 +p|}KdԲׄd68MsrtO+Kg"Q 2>*oy~}3WaK<,C[g8L +"v6?5d/IP&#nc!r|˸=η-z@m{+F&0$T+4QuB􃀏dY*H8_D]A6)Tþʕ Q5zng5Oima'Fn3E1y endstream endobj 2252 0 obj <> endobj 2253 0 obj <> endobj 2254 0 obj <> endobj 2245 0 obj <>stream +HW]o }70X,hl6@b шi,+]yH#pAm&Z8%AB{<=y{1'# ݟBjƙFeDve63 FӓFe>[e?'A8j7>lQYG0MGNH╾YA69h: U GdOb~`>G>=dʭ)L ʇ̧~O)tb)*6RŤ5z, +hxJ)iCQb[`c#"XY\6M+1R7#vx3fR#- eK.E%P 3ÀK]8WE (Ql/2) _/ &{r.p߳G{($`W7)-Vp3kbp9CTt4J:[;H'wjMq_l\twÄ2`rcAKٳ<kv[ؠ|s +3RA^cu`vxvq rOسLW2v+, {:-P]p5G#QjظH=r8[^tddZ?7}Ҭ#*^hxgqLjȋQc#J꾮:Rr2?ϻHRQ׿Cb7j3VDG1^b%xqŜŲ;@pu!`Fq8eEpOJl#m0J|Pυr>e 60Ap޶&2_iҨ0s>C$X{2ӮP!s!c D0A2PiX>^2L_|)8ǴYPJ ^-\Lnx?OCL%k7TǕx(/n~[0*b'k&WWO1^5=B;ԳAbYN|I˯`@T<}1}/ҹ;0R([!>SPG6$LXolj^u^F繁VVY̛2P3|ҩl@M|u>PZlbS#u_ 8=+yyV86r +2Q@@Z[8"as?j1_r|Ci5e72M"iC;>gKZծo MIDԛif46G\kDp,e&P DvDz&Ѹ2\;@Qx?┐] ;Aj #!/N/w($Z )s07!DX&b!>. :SoxwP$ݝ`"X *g_E1@A@cgyNd1qY^ƭGm:yc, pI)_11xH:4ٍߛ n|cbyt0Z_?rjOs#5ALKWC0/wN>[T:jnuӂ<V VNl> -b R y> N8!5?RΟfwá]잛F9N#!ln S6aՐ.. a,սàTU 9`vʤOdX2JY[kQ~AݎVSFMxQY0jT +Q<*ܾ_Llp; ;%ԝ\uJR7#ZPHbwO؛ǡV,9p*Tz j)) U7,įMe`?C= endstream endobj 2250 0 obj <>stream +0 Q@&]u Q[Z ]p;ikvq_tMLyL[W}{.9竿/jˀ^0cG9gk>qs; eT׭mJ>V b^zhk"ݳ1ʉs/q%;)=0ԓkH u 'd:IFݷ2ݕ+q;Z+I` 5ˋ#4}yrm/G~eߔK:}}׹lCWu{|64s͏3!8 ۑ:x1@?S)[4 +9pĸH.j- P D}q"wF֮|#LAi?PTJgO8;+m+p'kweIs\lf:6̊=xSS0%%<{5zF'>3>A.!D`q4=yRҕkeOEC)"?-ű2~,'cׁ + +ow܏Dc)&NMsrd)d.l.U̶;&'g^ׅ[`s]#:3EWيTbO[9A#b֪(e~YǸ*޲t'%TÕOoR5N,KSEӛ?D |a-(lc/R^qcC(>ϒ(Cuqv㛤9STIB*md!lyGR3a--Fw!5%#SdAy9^:/+@;mN# jx=-$E]@U͞9yB S*O])t["1XYJ&}{ϏD'@QR*$w@G +sIkAwl9;yMs͇ }?'_n.ou{!N ʳ)ąD-Y +O] FV_x=\iγEϭ#v mU|mC4U:ɥIb0߳zZ@/a#зgMd7I}O FM3L+S)znh (h6S?1AXz7lcЉ*#/4 D~(b:Hx+s*%mh.ԫs\_YD7h=MHKQԹ(1!a +zBo`WOr6wn=(8{T\/6VhO;ivrj.!>\U= =/G`T|iQbSz& S3TSF 񝑯s);َH6ˢ~S]L]w5ΝprV*xuS9|-T5~خ$]2uڷ%5JC͋ħT(ߢvμuAANt(@T!oCK4œ4&Qʿ& j4GsA' 7 WR.C' `yqUREQ,=HFzNbJ߯nS! JU9pnI}zi-[Wr]b +{rCc'vSt6z` Q!O,ڬRf5\6ScǍe))`m k՟)Ӓl_0}礔m 4䶆e\0_pޖi~k{S ?Zȷjvěy?hzGUJ1ﲻ!k-Ҟ?&Z[P.(+Z_,߉Kr2()ϼ#A]BkW:6# |Lv ( +aw>/1@ǿAK>ul )ĂVw(t<6#᫔源BN)o& 6猁E , Y969Ҷh>, onOMĀ\܂B5y׉r,wI.|WgxRDz d3Y:F;A&I4Un뉿o)J'h׉vqb.}3-N`joaasN&A(fH'ȫkV2O3&G ky63'\%y&u5e9oKbL#}7|nY 0{0Jy(6ϭ> @>1-L/gd(pwgsퟨOع+/,xH~N(Ȭ,č=&92\?$n~@Qs;J&]],'k9,OaNA~[A"TS';xi@{G. %=̙4ZH )%UJR,7I'hm6@Uq j:tI\IwMWwlgӻAx}$˜qZčOOg>lFuMҷ'52W=b*:aM|9)'YǠz9,߹4^[uPY mt 2Qv rM__ܜGiΩ; +6pY/]!xU +uamPJI&[lFBI|guiH-PCo CF嚘I3Ƅ4XǼX:tUj?+1ORaք,]3 8Zv]V/G T")6㜐ԇu=Tm=^^1_tB9dSs [XvOQ U7UH~{{?z :F[S& xZwtE>jVnݪL=:*gt{#p/l}zu@;Nfm!T6  FeY}?qfiFÍG+ַ;#|5zO1*Jbj2%OnqWzʷZ-Rs= @U:`6&6E(ԤYܰL% v;HMI7uJALtq~ + ~IFO)4i݈!%m*7]Ĝe${86=}(~54z" g0yy4{.9!Jw#S8k!P>vQ:+5Z> Yd <_|Lc.ƀe=đG/-t.x^qIGQU?xWP~{k˔8P^[g .Ks`u!_Y,=]\B$V$?t80Z6V-…q$sy: 1V,ߵ2uіpzm+9Vkl7h!.sND`9sR<},kQUǜ3#+N~'MMqbV3pU([*p ,n-5: 0 + O7mW^$W 0O.RʼB JTwL5>c)MJ +W7 +O1y]!K]n)#T}<ƐL8%tua)swAɕrDJ.gf](/̢ἐKA4BCkkjӯ:-T9۫ + 9BSm`2 ºdۢ:w*o,K3;*$3MP)F1G+,R71OiSV;[Y,T\b{FTe l⥡`] rxEHX>6 'z <~0M A(3ĥЎ,+na<\#_&j!#8zz˖k^o[qzN2qfw%%pۋ6LZ/9F3<:œ`˅K/1a}ȧ3 1IgRB(rVXP"l"|Qh^ Ǥ3\HٲY~KIJGL-ZA*!z&/рFkY^EK2ޛU6 +Mbj^3 bSASI{l(nDv:jXyZ 0}"A2f[{v KY^j,\j8arJ@÷N:Er";5K[}xdг+'}?63Cȧճ޼1mF#۠ vI4MVq6 `t 86߼}yAFv$ Ov -XH;<3,ҧ FYH#`&.[.D$ J P0b{N.`6Ǖ hnbI]Nބ['Y YYwN*jOa\3m+ЊcwiiszQb|MpgJ_ !&KÎG؉ +>G~<#9.X'E0ghF#{k06By4([9lMMu|!a2"qoƋ20y]9ê I)9CfDZn^7̒/d@F} "Ĺ3ʣ)j E.s r4!.\螣؍gy2WgwqF^VΐIBJeZ;'yu)vB4DL9Lן۠$luC .vwi5=Ұc +&/+$W0vQ +d՝N'}x_9Պ2$ef $߅ *3H wӳP), piNa7h-dSyi5&Rh:oJ~6;o͘%jI08*Q 2҉c mҪe+;֩>Dop-/GDW +\8L\4W"z;vAfY}JzVF ``{^UG3<ÿt4|QZD|`%A /yOf;2y>-ʊ;`}P~CRkuXIE"Gbrڅ{G;ֳ:RS9Ml]\Ͳ8gzz?ao{oYͶg)\aLϓa}I]PcCS_ꫬ.JhC*G,J$u_me|=&%H<:"4,t94,Qz)q%y CN  +ɑ+ *Av SB)\8Dz[k~_Ũk賙 +j}8ewt Oqnc5qj 46't&n[V!GKWxʤk]A!?N}9UUq-mp )}(S>w%VՅHNu*׷f6pQs{Mj9縳̄jsH5JJL#޸;'tݻs-D Som6*MbCå2K$Avxs/iהs{Fhk +[ċVR9DGƎnChh(vo n\[_z" -m(& +h21B@fjOSz6{n PA3m5@7hU}6stK_iK )|W430`^^x=.%1٫+(ɹYY#t}l˒&Sf}d:Q9뼍3!: ̏~&خ3.4&:T"os>jMg55-v){EbݠY^+N.]5J=W)kt\Uc9%-W+{^\r&1&;%050J <rlCX rmz(';u +=2""v*!+.(5*qz",Pmt1%90ji' ];-Ӭ9Yh1 N$ʟBB&-ԌC VɬTEܷj a2k4:AS#65<_մH ņm %-0I (+ +$-D`3d[/ f=s>5Q5_2mn0/Kc3x}FxU1HtwyUpm ;I: eA{#I ^'BǖrkJخ[;\n,v%*FJ;R*b%e7¬?#!U@@CbR9h2!6EvwQS<dd]KB/npV-bJxK C܎]ۨ؃DΔF /Ѻ^ywP8%:|d3f|M Ϯ?0ЬyНѥirNv1)#-[g(Y4Y =?Uԥ_m1ypUhh oPCldef+z{uF dׅ| (h'Zlx B Qҽpdb1pW7x5Ȫ+[~1%*2#]1(%QTcMhcTϔaTK) +qdݣdo?3}G-})aHzw !IK׷U( k +v~>Mnr6Z}}x5ʋn4>#.|1%1lfKx> T}w +)]~t#u㍺qck`91k&!y>fp;W Ltpx}uDjة QCԵ ^ա"/I`3QܐD﫣B.to5`_#E+{5Ƣ+pȺKv[/i#񱦼jgl50™?hOґ(T$, GZ oa=?CN{/L_o1wm^PRшG;SfLazk.G7w3F5*\+)/3w3]+zw} &#+@W,z.D)yZU~UoME`4O51V 'h(BU3++y[ ƐΰNnICxIAO} +2 h1BmT݆YYEͧ6yjf[;s&8ԉ\M?U<+nD$$#?ueo[*-cMOz"YU#(@]&plݦcF)W;s*;j$|P}ĻBB-`A7S:S|/`堺'ژxLm6,]=Ƕ5Um#rJ;pwSn5 |h ;> +[!2fȭ@56ɂz;9>'J6. +i'ku^qU?ǶӾRFQf6n ][3=v{H@n^eIo/[gʐٔ 0H2C nHur gjZDx>zzYusɣIѰ-u`JQT.n(@\&wD,EDž"rxK*%߱:N::7 x:P6 }R@TL -y՜4 RKOaB9X-&h;4zɄKf5[06|2Q!F|K'L۴E3so֪Z)bVY-#kM[&t C~;='n7#h"E,^xbɝh"ٳܻ&(HX>h)bw5E'89;M>`ڸ,MOBMFHկ<]VWD147/=y_TQ,!Ǚ|x)v?Yyzhʆ J#k!btR$ɛEVKz +wiT9 <לz~ @37 8 ~$M0afZ\֥5X}s{@׿%Ł3~5~?g [cQdE $ }LۧPsdz@8id,KRdXT!gBuH%׌(qW5Dz!+EiI6Kq Z: TLbSZ="w:#P*γ-pc&mIHK3f2hܮʭq `R!m\ wX<F# 8jŷjM?V uqb5$%yD]W.x=*0ɀMn*"QPVVԶ0hxV;L*uW`F8z5&wHF!X20x9>1P)?StQ4֦y42~!ScpǶN jtp{op50D +J3᭱5FVrdR7nT'`aJ6 kkUwo=a,)Ne.. jtQXy73:epRȒIPPn>]u6|`1U&1 +c4^ZN(bxn-|oՌY>\Kz+O2~E[:?b.O`'0-=xg/ABEF29Ԥ3/JjΦ񆁬auv_Ukәa֢3tS k/jx?.ĸ`}܂A/|NB­ 4DɯzD+!4?lu/ ko?ByTB4ڕ~ϫjlob.Vyr5~u" $ KgZ:3ٟV형z}O `jVPQ6[%Qns{=5*uoNBU8ATZJNvC1ﲊҒ + @73 +\H٤h7d WH/VI< fN6SG"KL$/^s3eb#Y#&X +KE=PHF.#@ʃe "o *Dbem@*Q;@iN$ Qckp|dИ_l;=S˭_Yw:w7%>Cg)g*W±usԯ:P DP- zT".7ǩbF*&".v_g8`}%BWq WE;9貜{: @u;^gcI*|y +sSUe +c gkK"Tf$v`aigժz\& cs&xlrlnj\Mk bDc m*<4!#Fq]kcG8[1Hi=+3 +_r9DUFbu-h_'>N[F/uZ?n)ϔ$H v7iΚ]m7^6:@~ pR洞++~L6vOEğǭNvɟ1Q.bP4(>d4]ّq8879H،_;w!]T#oݼl]/طi}I*=CK!q) +poQ̇BRvUf8@ +XcY&Ch*yx(:Q߮{6S;H}S&m81^+V鑟&HlrcNS 5mL*D)rdGhIǭ% Rf ARj+ 7&ɏ^gq' +ڱS"W} y?aR60 {az1@5;tf.tM*BPs{ty1ߜdq0'm#fW/KΟsެGd*Tut@圥>φL6?] LO85̕w#ڼ_)/ kk+:UTߵGWlJD]ԐNNU4턬aW5x&;wkf͘L,OWvOeԍ.hA>a,Ԝ]%Ciivw./f3:,R5C6F`!sidon*ZfLZ^uHSX@G|HC! +9 ^RTQOP ٩mvS)\7H:O@Ffz<;^"-*DDa"vx +®?I#p]`KkP 3~"Xt#OlMK `;Ū86^8ؽuRȑ9[jȇR + 6!D?Bg`#űC?GLϧW^6_sWno/ O*ȡ?MOq4[~Va#srKYh`BP77gW2ߥJ5hPr+2rȚx>wrn;$!렻qG0^:]dHi 5*\YE]R?`xXR~=jmP[ +ш'g{ێ<=|băgDu:jU'j![Z}_Xt3 AHu)zsTr NS"pTDKoG?3T">BTkIR;zz*-nlyIQ`}rK\OPMA$b3.SڎlÌ*K҂Z#spzwm~apvqjB=&wm{<68™w̝+@2 +?O/yڗVЊvy^rR)vf63G1k 'jw7zf߭- C:y5|> /Z>WXG8oHza&*HMj|[$5ȏH=TE C;EbڤkȍiM+:@;hftX[񴆦,Sgt?+)ؠ }( ֪m&\3bvj7o@&צ7u.dBk`Z`2f|>1>[)~߬ q Re[EƦZ +;\ ܥ.9P"#Boq0϶DbK޼ A ]{BS` l,*$& +MMjP=5Sbfkn(/ 3xL2wQUj6~XahR(oH!uM̼'|}da1OS):`eZaOa'Ib-W(pیS=%:b҉ZF +tJTN'q,`xgtc`ecq=VH)S&}k)K7l=ɬGJKEVo߉Yk <<=  `EG+3's3@FD~N +Ap[a~ҝq*r;#-x'†ӗ#>zBܩXF%Rmw7Y#pl94,Y10'z5+Shs`GIG"9\Y9t)q$,Ñ{GfW(1``3-GIBTkid .kwAzvF<^LrAͱX8[9 vin"$.){(w͆Bbjq))EDzᛮ&6= t VӨ l#3I47bGIT"|QƤ`1PEpc7طnpQΑVR*]I#mc|]gS&2]3)E(\}A;b^o:e o{K ^ F`asAMÛ;Lg~|Xf7opaB^OǓ͵mS`o.6;"h/!2o6sjA}؀;ڑPMt*M2Kr>PTq0$mSR{Li{T" f^t3b!kyDT:wQSHY*+c6n {x/̋|Wfd,B륓vK'.mPViE/l>罩ZJ<A(R6>Yѻw(yuKa[LNdy8i*g$w>َ2,7{ae0.T8o@=<)SҸcEq){>>@6s zˆ"FJzM aMRܭ{0I b:rƣ&ga".-ڡgoUW!eiaMm@g8et[x4a +2+f`a}'(:)[E.sQXZpD' +Z0S!v\ca;$ۙ y3EGuxD y4Em|V}2qo&]4^cg_&l}xC0(zs9⺀-*ybSl)sc$iȼlTPH,g)nۅAW{#'.)XJ;/) _`+#etEQӋZw_葬 οuo}t-M_ƳfZZHK8+6RB_gݔ`2X6?' +4a&\*f:#u8!(UORn[+ЕuBMGrtHX#t ΂A + C;}m TW\i~ }-EӓLV: Ǧb7|")}]cAvb(NLݱvv](ׄ#'ሮ'xи=II3^cE([K gȍz6/XPQ_7=$DQP3_-PPů>298J!TŘt]8vu' %&/LZʯҔ]@tJOජ0(ӃCW +*lޚ0MX58lbL:< +4`7^*is@GL]ʹ"|n$ω=پf1J'V + "3F_5;C`5i<#K +]va،hjg?% d덂xk`lͮ7͉WUCNfS!1`cbXD5_0: ( )qVJb:"$jGS(<v`8@N+5nc@5&8v$ө9 .v-vqԮM8ׁԶ&#+ص%|wޠp'4A)Nv{.Yu ~4ajG>@ảavq*yySdηnwf4p?ZӅf`k`&Dഴd fe W[qQf!#a02[npGb_lu +nÈ?q$;x=ξ|QT#}DB"\ESэ ۇc:_׆M]Eohu6BL6I'TkmGD~:c_KDFm9v]jưCY {AQwm0ZYEw)S;Hlmّ,͜" +R=] 3OdsMk1C[؇S 8mmUOÿr 7[>6{Jsh;MAmR:-i2|3NlH 2_nm`Qk)h +HG"Y֓2{veϒ]F&ؐ3&Ps1@f'9'<S4$t0qR" Ctw)r<`E*bIna5<)f`g(4ޞZ<9i)kJ9'$8qރ +{XX9/.#Ywt^^<tN0 0q uR#;GQEg=m!<\$⮒¸;L?NK1[8#^[\ s]j$( 3,>Η6)SjkZO3@V@w@iLl*`x bmCFXa)q7vwMQe<(4Qo3MNXߝ_IJkL"JGw5BJk.IJophGV\d[+aЈJvH0B |Yي(lG&Jpev,m"vxߔYea 2F Rt85%=g|/"UheJ|ek\ 6-k{0OfA2Ki٠SLMrtQD#h886z{h*Wp֥ +.yXHaÌJ{fɣ [5`̟Wz,P)FeEяJܸ&(Dbn 5s/`@~Z%D랫S.Y +oAٓ8B$%}l8i<@Iy"fFI\x.Sae[fMMB8*%>X7VyԦExv4nXQ1rKoDDd;[ ܡ>;Ɨſ8Tߋ&/;9(cS)ষ 4sPh|0h)l-Gh]mg*>7KD X_tIJ oSF?^Hr4nE\W#iY`_Vl~:Tw;y7AW{}wͣXwbfƩ!4h }7\I9=D&eW{N'1zalʆt 9X"7<7@PD6V1'Qש\~0@H.WȓJtn) wEJ%4\RB/P5:wb?>~**P3%N +ȯHt<8!L8h8C;yN)bZ[&L% :#3{D +m]Q lc2&A}ҤDC[dKJ7|^ɘer0ͥxi^@ ظt*,O6r#Zlv$|rdi40a +,b(x2+z3W2o 5L ;6Jmg`_^!z*џIf3o~yP +ާN=&j! +#> endobj 2247 0 obj <> endobj 2248 0 obj <> endobj 2249 0 obj <> endobj 2239 0 obj <>stream +H̗YoF w[@dd'19bk`$Ύ64S$jHɋ0]_JRA()PO3E򟫇4_}wrybM,_ʤLD$ͲluH>b{F_|z,qLڣ#_{X޾y]+0 l(+bp+CNj'Ԋ$7G$Ӳ~K<4O2x):cX O?G51׍n|¡~~ْ$4v KSPXZD'ҁTywĹ9V&|h -{O +"2G1+ 8{iu(%ւb<|Oy6VI,4lx&TIꀄsqfL:QF +|RCP%v{u8Z'ruA'BqH-|N]3'虌S8ۯ劷xkC 6Mu6-RU,~;@8^Π?+Fa$_aee2dCTT!(6?}%rdrYςHDDrqJ7l-xER]5x"䎀%'P yza bG òP>0xQu;XPe,/ʡx-o%:t i,@Ec4ԐB2B]n}CYx+WmWŇ4IöQ8o MkW*La6v`w2V 7~.t2b?#'\aiJhK#@mh$(hPyq6qǙHZ|s6dxHAW!#HSD2^4$g5 W\<#c<(@AvSyGq*C٘*Je;eD<Pu}*&R^jִA]MTYQ2$$Ub8ZE[ R]i@CcDPLmO֪ vg)w1u2G^]ulB<I%.YY#Y +ʗ<]um%hwz4;Э#hn1=􊌂וa4)Չ1lgr_3f,kPx Uz2,6ǨPN7!ۡЂlnBB2gY;(]\6qOv/Hfж:$ &_qOm҂D>&.Qݘd~7!t۞;e =􉁇ՁOP00W!d0ԛj_۴S*y?*±Ȯ" 'r 7 i%$\Wzm7 k3&0Wi33gZ&2|f㸍H + 8 +z J vr::[$ ^V͈t?V/ _ra2bE"|wM{(raEi +oG(>3G#Nw,v,t$ۜt`h endstream endobj 2244 0 obj <>stream +0 Z@&S ZM2R!:z0ZMQu)\:2x ufhun o=GJ.U$TlWMNC@!>#O`[m(Z@Ml ɂ"Ñ̤ ˵/ѱyS1/KjMfP1izkWA_;  Q|{$۲ρ +Z5]j_&)jk.47n?$ C+ W9S䘴Yӌ=ce+*! Q+ T|iCPqMB`U0eZaMߙFF=t3!bi6L%=Hl>H:s&IHq&}Bzs ++I2^Y9cl^#FcZFҹ5Gx"#i7{4Fk357K Q"{Yԭrrcy(X7HPT_Կ[ +"N*x:"R)ɐ5p +FMZ8MMn̸ :"z*pX{Z2Sy^ѷ͙>B:Gd^--G6aXmA,[~f@퍮O2a֋p .Sns#&RJsQbjɤn-yaDҏ }C_uk>5 IHAׯ=\4 c:JP^91p[X^Sq +QXENS|1C;ِetC!#Jm՟Sy5:(B$ +T,.!zR ڟ4N\HIZyM%ۗ:Ƹa8lwq4uK[l8z<+{8l*rEI w>,d>C)3o\lVgLXE5'>o\_O&o}_$V!scQ+zM@^뺏Or'!9{J@7FZM%V9,8A֌SvUwTbt-~a8Pm"C.>t"{ x!qS`к}Ѣby| ^W3nuԱHx[a9jXikVߐ^*5mv1KSw857ɋ`Oj:ތ:TC36>OOQlLжڱN`dςa6W827MŨZ.@+Ql;7I^o}dK-C%ә 8jq4m\eL% +_1/'^( +^|P()QdCAK{Rۥ OoN"qʟkՍا9""ƁAD4' W,vxx4@G37(Ϳ.nGcRuQ̛MMk*\ֲܩ2 ?t] y?%8.aA,{M Tr#Vш&L3_#W3MSLצFWJH +dr`ښ8\:XEhKKJפoxB!Nc p{0X.]2AI.HQCp":䒈 5…d e. +.+|7xT{yHt_#]( +Fvof>Iuk%E9Wm(h\F%dP\rX Xi>;~ Q;T'E+^Oq)8ɻ8ZK(1Lu؏ء~Y )_HB8V/R+&Ynj0TLj vieگZ{aT7n`Pvf&1p$CwA^ݬ+z y3Mf9O|~oPj~.lGa;|E湬$vnNXhq2mm؟@`3sXR<)ww~nu~X:!Lo$[)?ZQLArstc&' 1y"$|2U Nj /bPMԛu!>G.⵰Y +u=mu_ɠuYnƧJ&%^U5Tw.POoIyr]IWP'Ha +Ԅht`^B5jU}(K.PS^,;Z: +3H;:ʻa7G_EaԦl^*ϗ}/"OVb鎚,qFFK;) +|tAG(ԄVE6r']8O~-^oKcE$hkCvG&yJXǩTvXKu~}tU(MMBg–?[ڟs +QZ;鏊/5akY:kibIExUGeyĽC A4tnsؠn)G =֒I_dغEZ0ܫ1)yg ڲϯkHPFV+4v(M8 /T4Z7s:>3,_tJDŃ SDDHc ^CAMć: +P@&x'L-HZJT\ TV xԥ/Dw,h2>bm%d'f]ݩ gw:FJ"&ex:aƜo Sb9}?B \41H[(KOIy]eXO>m)>p8O#Mށj;5T?g E%.20idqrm*e{מ- !ҤičߊOQn +_I +VT/.LggkG%CCjiUiQ`U9V`<Ь=իm")up6@x}t#[_ё a-1Qv~UΆ\!6Q}g4\ćƇZ]=M Fԣ<|6 r-X2xjek)o pQLHcMG*~nٌD"K mPO83sy3!ɛnz2oxc,r;b ︝qmRhq~AsK9Ru,Hy +QaJ,<h~K1xv3}N5tM@V@K뢖k+bH1~/ +p +Jx|>b4d/{ž292Xnw<.$;L9n!ƥ}2a穆LU3hU#6$ Xр{Kk;軈zP"J~_Kn=I}HJjvk|Wڅ8m`ghOu9E8֡[5Uf3ۯ[u{4%[ 77CM6V;5/HjW@%Ad^iu'5@;cO` _6lUl<)rPXh{Za@E *?8Gt[@nA;0Ao%+!jn#UF!t AM!&9gTi\B~b ĿvDOfr:֥L26K -6E)=ORZ\0hbh=V!!4[*DGYc$P-?Fv'FIa<Rh>8~LeS8$ԅ}.kZ|@OF:鸘)M|:' Hȗk."mv 8wCA8BA?Nwp/Zh|Vˉ>EtΤooŽg- ]o#%')%-@?c܍* /<[CxnKcC*;): 0~G  VM[;S7҄>Y+^yAx\E>#1m#tԭ\wi07^/˜ g,/mn$/g@kuCԏnt7.F#4(3>%':2#TζLI뇪)=c_*72M-f$CY'2r6#L \/&%tWU]r\w#rld7~(M$֚yz+.sBB1eų?6RcR(K'&717s'>;dw5)؟}6۲}4d^"X-Si|wlŘR_jrv˷) 7BAޢe1d>m(&Ĉ9=%cgC.O;J}G+?\]\=Cz9uz xLzb*`Ϧ`L%0eѬ-ݳ7"27dN?NLN=qfe`˲̆2;oyA4wވj0S';g:@0DGԄ?.dBǐibk9aW`4݄xĠw'CCjw(>X3 f&TE^~63Aa3F7z#6԰m rPPZ%&] DZ~A*6= a}ou +(8:r:&ySF(6l , ?MRHk8bOl)hUF@|MN1?.e[ed.q?VQ,[$UJMhH6~*:B;q4O<ޟ!19:OxT]Biyeœy)+!vZf,y;bG9+'S8el~MCjtWʹ1'vT9nl=5۠Tho5hObBnj[Vk YQzdh +(ǡΠt}iUBIZݲkAxUۄsjF5쁒.X K]1j.$]`}L[rQ(!{" h=RIHԏXF[Vʌ wil.$lJpmyPG(Xs*G^sObtlMۛax,Aq5w!8 Y~NV^)ǾW `|OHj~G[s= GlږnoRi= u%FE 鷏#,U`e*{AO OC=)ep#QS: WbKpʲ$^"sNj%5N,-Nvq M,0ؾ&/߯Ua?g<p0KCAu4aJٮ Ŏb7lv\ѹVG Dy]9߻EΩ?ԚzkQD#0lX-ZVpe2>X1"4tŬߝ>r,V ,J8'z!(QFİ6 isPNjާW:xJlƞ``b?m?/xn9~-u[6&?GIB`@T=(fp)kb]l2"o-8gũi >ۍ.C%1DΖK[Ǐ}+t4^eHQvofqzu Ś8._2xڅl(^PM|^9[&)#vkh"- y/k6GjW8zk}gXn& #Ѭ˸ɠLfz0mf9B\2Yغ;EyxMix +NbiJͥqcmzbY0YiDw i`V6g}-yA\]$ôïú)YP[G>#N{r}10κ+l3&`~kyQ$GA?})հJg!z8`t7kuoT(0_N͢ С`14^q?ߔd w!%;ȇ^/`i{W:$ o?2l5EX7W(۾sJamfW"|ZOx&]B槕Ϭ`1V l綞ՇPg4CiEM2Z5E{ - /D<ŦU™)VgU7gL2|>JA;0=@ ہht ` #y&( +fdRcZD㢌6z(nbu JVgBA/);KLDwmC;{;(j{~~0f>֝^mD5  +ĴyJ8 rT3;҂7v?vUzOn"tBHZcuA +g} ݜ$7CYv־ +[So~JqOե_B"fOT11U~XlYYK'L& rŰdDP2&y B./{ƽad+3E23FI5;G0pۭpu5PmGa)Jw匴Ģ<@vH^pTsd6 5e2*d[c)>:**O/ZqjFЫ_}s +⵬M Cjy=EO$7Z_z[ң:I.8{P`Fp@g޺xJ[*&'w{K 4 :69&rMwknC p34By?TTyH-kн.0rt i2 +dݡѤ $r +KQ.?Κʹ鳰.͕4~fmg4 +gS0Yiu [UTcO߉@Էgk;#e'䀝i%OD)U?o.VH3Kp߹ +d73CAj%2/|zʸG586A"c^%k,|. ,|NjҸ:}K^7aL]lo|p4QK$! +~c k0rO; ++rص/3{G@n=REʖG.%L*"1b܀/f՚v#a  +-,v6BΫ"} D4}A\K+rs,Ź'Kȡ=lnT} YGeygT?c/E3)I%bnp+~"s|3 ?PƜQZHI;bslHT-tv8e,,tA-3a!4lA}>rȫ+qcG! /43DرεA+evLhe_c^)Q.}ؠMUį+"Y/?1xdxhuC/Q~>=GkBoOn)l U xꉅZ58D*c-1R2K{8$g8Iljlh$W(ZcCDqڼUĻD7~*(Di CG/b> :"'_]Zv5}g[Z(Ak Q)9kDn]f΍h]@<ж+lvNY=۩ms副^k‚zzɕ73WrT$=(SPytJ'Z2,'_HTT d1nާIy0 +;V% VN-([9ٖyPf[P'[wb& pxF? ot QuSfvVo4ty kQ`B9"%[ϰ۾\m3мV/r/璏tR+&WXFx4|N[sq>Ln,cC$ʛ'j16'l2amy<"n.wy9fVz]1h{%(< f)?` HU{KGP@u4E\ebGw;u`^`" pr$  Zpėk/둬 |}Klw!Eo%#^-JO| MqUædYy:y{Rgָ|&1o4GtE8iȷ=őܤ_2b`.Rà,Qy;zNII-J}GM`ZpMҴ sUl9K>nb!xff9e1*M,zio?~xY&#^RƧQnugDQ10p8HAbRaQ, 1iM=](i!@X6rxf~n\^4$Y*tcQc"tKHiq]W˘b  + ih, +؞:鶧 !ݹ[mi)vi'%’H/5@cܥ$+}z G, +&˿QQx6kmj9{HJڣD96C1b?bYpzzDv"ŞяEvߛ3m +8ո:L&Ct,z@%zi굑kN]%_~y5[5p>5%΃WGX,6pWb8㦸v9N{]r`?%mP_l+ɭG[kYIJǴ.{T.RX  xc \,k#'Stksv2| + ?6Ʊ9HD(s)уQed0:j>Lm'sCT7&gJHns~&u$’ spTE5Rj8<;+3!nAe;3Eӆ҂ۼ(3ҹwb̄IE1eezcn@ D3˹da- ʗW јe*lM~cIFrORy4m0ukJ36$%fLBXk9Ưd6jRl9)CS%Qm4'i` % +Qc#@RzsgO|pىߕbv0MsHVk/8j~GR`Wxr`QZ VŖzHʌ/8EiB hȗd?ڦY"Tͼ!!ybH*+Dže5q9 +:&mvG{LEWNm?q| ̭,8m r6uf781{ b Tͪ ۋRZJĪO;2Ba(GT̜֏J + _wϑنꏜ+ ᙳ'jpc6^n$5d)Ŀh{z4dkԒ5E,rE\lת.kr굞NtImcv`ޔD]^3K`cfտIT,HDF{ӋNu)NLtI(煺l܁ R@ +C8<Q[ R-~ZA53Te}r φ2@@ RNgo*k/+d^k#Jmu++ Đ=7><77b&L3NJP>;UsD`7*|)}z]+wI2#BaZ+g}XP[ޙԍWg^iw`~KwÐڷKDwAb{~|GOrw?%]1%R+ ЕK.E7&*:~T?1FLR' Z{cɗ._X.Psu?Q8 DC<^ROV=T"܅K_N $$ɽ@"|C,!dy BmckG$p@aR?Q&?(&SMߊ#qP$LdiGfz81;BNcQb@Ie5s>+27~ydKyVIl* +=3R)kWgxƽ5.S7{Nj8ӆD,O>+RHK6-ϝ{]t詎t2sbXEۢ4;4VL6/Uڸcd4۩/s$zv}E߫@e^@DsdQ;x@L ӯ-՝EŞ *=43_koIN'Q8]'d_&=Lsѽ1#Uꮄ +(YpUXlRF4djX!$rdF&1 {_ ykeJdQf*E- U{yp8L:yzw2pl.O 78$\䔉 dS +]R|w2޾|#rJ#r%(*K6d^v1첊zcJ wzQTElZCqA?DQ[Gh?#ARfV!IWSS(AC>:U7nJ20Zwj_D~$jS)8v*"F\w[4K~9wkX\GոGRtl#5yy10y#y걎Jx#=jq?lHsmTcd[W'{PɅ9M %09Sb\kl9=LpiPhUW9T?UkhabSN6tSӇH0(ff( Zն +]33ԧ 'ڃG/eDqSDTl,?YFr "R]& *j@Z{+ȎS2 k&gj6;ந5^nLH&beEV2z>#&ZkSf1! XHS!O c`*JEI7Ѡ.2R*T!&eCSNoΰ=.JN mYP\] \\zhX}5-졚:!&C˟ћhхU6F02\jq<HalVB朶fotF~/TZRsI$H3/`;qⓎH@f`)p${ֈao_uM]ոCEO վ2,{OJ +a0WgdZ\#OU|1-L:& -XL཈]2bp~?^Koe@hJܞC{@Le"c N?'ELߺohSQ<øwwa* Iaa͝5K@I}Cy_վc8nrͪصl'V͕=)C5qKO"/wwO-;{M%btA7$G,!ãG9^Z6$.y\Ŕ*lLˆhN~J +dv!ɴꓘ'^''^b8,aPZ&`S r`꒲MAm M_ps|4EK7%xn#y}?ޜj 4;ycj=L^Yu7$=7[|`hmSOMy)u`SS8*3A +O5ux( yHU|'iM?'.g9-T>~gR: eSYk|"չ%j 0rìJXFlx"[edV\C B4wUͣs!h,y~TQBPH}7;BA"S#{$ u\&/(e/͒T+ xtdH> 1V<)?Rk)8ִuom$#Ys4!e K*mdy)*_\ź'K{n7M.YCUHοK^pFɽCH렎!UtbRX"#afYU=Xf]RM~Us#Ze XBMVa 9,uM?m_tpq>Ss*ʰ(tM5"hnc|p=%Gf ("=$Z63FHBvO`#5Ea>?-Qx +ASʓj 1,7Q+T,hag/]Sj9 CQtc'z]؋d (c-ݤ*v 4Fm~Zq;_-5#|(R?50\`:G1o0/goZAnɜ_kBP߰=<{Vg;7qFux\؄ߥc$/ka[w?cSjQY޼qTjv+0vt⊦UD]qZBku?NL]lTؠJť 9 Q@ GNw7FͼSvӐJm ؖRN+-9 誧OG~rcIpM`f6h䫕O8̭'0&fZbyd5u``%^y;Kh:u7@X5_S2lHuH{)G\mK# ~fBIGqLv0-/(C~ԭ~0bpouTCYI!lrf0w-Qa?gL˛V}SfC<̓>1d:Fv$Qhx^J^Q9kf,n6Ss=.@$?`&,GVB<Ί6^\W]6McWm ub'%U(rO3duDJ_EC(Fdbs6_";>5_e?v:/Fe=! P ɶ +:-~71ODx1;.zYl@/}7z"-Vc5{T{ +o!IL*ٸ'"dUPnB7Q#|"ǚA ƼVu/`7.\~ E إ6[3 r`|UլzGǩ50֎AE`[6aI|q.~k+wBd noLE Eu?]d?x&\5ŹȼޱU[4tG!] >n:[M;nuuk8,dY%l^z>7e]_}iz^Cx86}{پ `M8ftj@e#/yXR0m ],qތKG?lDNQ/9w~q4Ձ)uݙvsL}S \j`-nr.a7'uhjÊ/Y7a +ձ^43ME(3 ticʤs(w:ud +l6`ٛ }Qo +C}־V_8*.9D~]qYN Pәi!lv84_P6AĵgI0$[9b, +ӕ5uB3E!Se.:^ l=\U +U!/o}nH@=|٧l++,~)3cb1T1y& m/34yZOV_"Z%)#rV{#+ ы skKbk(S1;vrY~)Mภ0X&sYpkWl;r?RP,0AQ}Z7n\ n"yԌup4apJߚA`n.FT NWv!%zIU W08"h͙y*Mq悢!r"}aV('k f`_No4jsMMoPo uv3!6тEeVg%)35M]gEބ[=SX +UP: 5,6, \ \5w/֓PA-rF'2P[;|_T:H&-΢6 -&y~EMUWnc12#nFx^vbڣˣk{Vްf=?3-ğ߱#DDvB|^%]ę$ *:]|҅k+6ծ"&𷁷|za0A kJ3TlR Ӫ?n:P'dѤ68[Hp/=;]6C"~Phh5 -wB=մt3Лs)';Fy(Eܙ~HPAԌ4 zO"sͳZpyx j'--MK3‚!q$YmY3/UtE0Uny.;7_bo*ym9,m]?`*GY]_8w֖'ԘT*" +v"*3A NZHǭbO5_EZB0Ԑ,}D+~2ϳSR͍t;:JtbGŚNM EzBr[I saSz4́}ďZ1zJ2m h y^Fn\>- b!X`oEMl˼xMHcǪ҉݀\ja}m a  +;2EKx3A*3Ovap1:KuY `<_8z7}Ys:RUyשR=_}JZػkU,ZɈY8(ܝWUVO_pګ -rҝYHHԝ7-w%+$Et>7>t(3anz~N9F4՘wTcq~4e:٨}[USwwR^7͛D9꒾hnr %I.I4pJQW+2\Pju t3%2>jE-4,t~Mq/29Iy$G\KeҚ0_K@nXz~tT:"*, /M'A`䟅+,~JIE | }mM%>.Eۈ$A۟UP)ԗF7#g +c]q~4E5>f~qV8 pϲ3b㔖F$'`4z} + +;=q:X*+/> endobj 2241 0 obj <> endobj 2242 0 obj <> endobj 2243 0 obj <> endobj 2233 0 obj <>stream +HWnG}ش@R,& jp-ZfzfzӼ)qrt]NDqΌ{]qǀdFpۿOoONlq~TO'sƥ&JVeڶFJU`''ߞ/nt>2ɵbV%Pz 1(n"7(f#@N\[ʑQG7#=^ &XU +Ұ3 O>9m~B&ݽ7JU >"x?×((*-:[#`?5]~2¦< ȋ#oq$;cGS=.#HnN?uoK.Q3ZTl,<]T, +Bt?U/W/JaJ`OfeJY/nJDQx(^:c+,; +l9țPJcil`L$f30v8Sט4挩.q;p딹Aw}qAR^S;})]1ܿ +õm﷋ϳi}*[ѵ`ϚiiYJOv6^XI!IPo3>˘JsZzy]:Ŝ 7ItX=\G.:2C9F꒜ҍ}f~0 I{ +F@dn a=<}'/]sW㊄ mWd>hP2hEKb^.aٔx$@ix;PDoX"­/'.od"lZMN #?req^Mw9߶,E 1iwqoa)nB.8A.&<職6K~ydk˼$ b$Z yY/f,ے\eo'!fBDq7=*.'lRb!7[az''h I +kHx<_6:PL51,bTl%T2$&6)N!ݡf12,,{/2?mqiD˅sFSՙ"'mqi3ȝ|dEh+dDHl!:oN/,JVTfe6\}D\nQe(ЃǬy: =-ԺcXw l"yx~r!f8uQI|Myy~E۴bm΂9C1} ' u)Fd5fX7@ףb&ט`FPb69qi+<pHZ"ǣ 0%:$A^ਭWk,MI(@ᑌCY xP>~WNqfbwTqa["d$翱~%rY ` XkaStme}*U#2ݚKȾKLlj8U>5Qv6[ Bޚ{Rtb:t5]s[l;.PJ3n1m7 ON +1Eכ"_/̅Vq_"ؼ~k=)eN;42߳Il `#R%pRP}3 N'x|FQBZ[&Pb%f՚|@a~R)K/mטs endstream endobj 2238 0 obj <>stream +0 Q@&Q` QtҢ~4N$?Ȳœ/ 1M W2ΤΆ;k u6W͚\~u_#9'#Q_o|ahf"qz9"}ҍ81.]$ ΐ YauE^`;kԢjRޱq׿{nQ2vw 5ki& E$ f_ɠ }1#9O$CzjAB(y.${ `@"1鼴il.ݫA+%:oUEѥ=י肮T\wi2ֳ hU0oB2^Bz47)$#ԏtP>fWrðeV"Դ`O$o?772tKpe٥o_b +9Zj%lC? +;_,yδe 4+"G :h}mRbiiF޾HϭdXSZ ;:#5d,U]xC*=H`d=dXGb!ѧ"W)WC?Y.澶pf#)۪0Jrȶ_HCU#tc^fUK͔ E7)w1oˌ@9<0+z4jT]Zq27s(U DiF3X`*%Γnw0s=Ö 4,Z +BAE8W aBaHN#uAg2@'3ۀҪg{>I-5z{v>*Z6+0'=1B{{n+bq0(U/S:܀Mgk,/P]QH0C67fL;IO&Qz Ĭ͇OUE\^F*a,hۗ<vqiZ؋QFB {qSy~w%mY-C=w5ZvqyXe]m6Vh?=Z}|=o?fgO|5FTɌ:yH4RH!ڡCTSdGWь6S[Us !4@d#[ȫy0 fx܈vs}/_&P\Tz-rUnZLHYA][A!$ujIх݈`Ĥ<%8.KS):>څOT")E;]^ !ER{ 8xW㫌[xك"}(KLQ%yRv 3SiE.%=v@v8T +h}2 NHkTIuKn"Y_ȶ)B+u/?w[d j#(+<>K^dup"L%\rHt FU\y.ÿ;k +Cm"w J[W1W>N!K#Cx+ۀ  $ǹcS{,-¼N&1-3Ʉ XNj PpVꞶj3q8?dkҐ"XeRh;t=P~pxa`:f2r彔-16JK i˦InP,yPJ]׽ާs Iؠ*@(hM)Y V f;P SJz2TuٌLDA\l x hXi0h X}&´Eڶ k0-|ZFBfɢUF,q֛o9uhOE<.?A,GkY@kA`~!TBtX7?!5`XАRDG8RJ$&s51 U$NMn/rOav`_/T6òBĿ7;ݼHUW{fē|5iуe(c:\;⍐9;,;iڂ K20%]2aM U> r& '$-ՏaM=N I +|cPEYsÄ"d$ƈ#L&CwRxw[{L/]P ++k̙qk٪6S,$A!:oƙl;VO>D5uE3_cz/K^uU6`| ޟ JU&v| hBbO,KJWdޣW/'2Lp[UJ^ձqIH)%S̔R*k@V9+~t;8&IsRN0ڴxNσtK~'yk0ފs̍m`辥R|$@hBR-^yNJY#U_23\J4ӳT6< zk]ER qQ7ǩ&|PCǤTVJff$ͅӛaFO6͘%= 79PPNR+qTxH(N3z#֡`I(7sC]&b@N{<6>Ƈq5K!˭"!>e=|dPx!<7MEIzȚ'vw#w F3pM^+g gWКҍp6/NTSDc `@ Ҳ+o,+\2817SSY=s0zRa͈UeUV?Z W \_G#| QxR$b^QVYg翰_.=S! wy Z < h1yM0C*J[F{x56t]CaB;8I M S˴a@ODZݤ\੮S tux'1C@8"4$W1)E"TFIJd;b4hI$B +p;t9lQ?wC+hͨiBG9M\0w;-MU2-݋IMyP`9 +}FEPv"Rq ;7%pwp4ru Qij9Ny +nYW =ώ R^5X5 @p+[f1I~#,FDܻh|1k5uOL%JCF71|Vi 4fH ֊yP +0Q .CQ!>|Sb40ޝg^Ƣ Ոi *74dٮxG`F+mmprǘ M"9K2͉Ha}H$797hSb|ϗ+^=X{ |L2@i6 Hj!Gt7=x2K-چ*I6RAS T)PӫR)+d.]_7mpqi&F&M$ď\ElQ%U4A=_*3š#]o7cف;®&JO ^W]6+Hw}Vɫح>t &H:pO?/- XwqOnWHt +%Eξf2enᳵܷ4[37KK3۴j gVPyJ97nǧ*BH#a,A a>%GUo7<'ݱy"@BQO1Mx^5­oD-2n=k |Lu)WsA^Ҭy7v0nNuC٨֔+]MI˹p"+a>Qķ8}$cE[\oYʵ`5%-]t$Oi]H*b-ke)q=OrtX'3k)n<p`NNFyrC'f+"tKaEce <u7˰ʤ]W7?ux;qzٯt.u B`+:|';E`{l֏v0SAG>"Xjӭ@MTC2Vחw[ Țu2. +$h"?bp/큐?xw+)W _\xw8`弟`&,?5ǣx4Qt5ˆD I_̲VW%61ö/:E (up =4m")lE62a8r9=rYQv^ +7žUIY!Y' xCYqr{)N 5qzdp7mEm#KlP‡7GF'3WdJ1$Yb>{ XxxfAwwu~v .V_G{ʞi$:M=8?G.Ĵw@!԰^qߖ'?u< N?|6aצn%^Ȍj{8 Z>d#\zy6wu =Ɉ b+CXekV rǍngM +IJLY_Í`NHO + |cFES"XYhߟ`~AuQ7;DkNA#Pַ/_8TZ}u^t]!#eRpgMxF˄O;*ܝn d:iFn՝E4d:C҅F3䟼"$7&j8. w\܌0pL`no%t d{s;`q`;ds{}Pv ,>VLf8(RK'|}e$^z? /K(3'`F(J#|At-P"DPVj^2P%&x"$vId;/WBXL4fM7!P/SR>K3{%?Φyh)yՊ1U6W\ߠ/θ[W@dE^T%^$^'{D9i፴kL7+QI $Κp1w[`} +eXNЄf$8#;60 [e Y?#8ԌoQpwWy!pFNh)tևU \8վ#%ڱߍFި܍F'MDwCdiI9B;bmuB5 +({ɞ=>6uV3PuCD~pqf +p5[8%~96F(Y-{sg"b"]q-mhnbW{"'ͪ2˵ka*^ jjY$R\ +kĔ')2eNj-,PY "N)r{%?[;#`z̈8B;:2};Օol`_TcԅgJ63UISJdFWs"#_Փ#.VŨHo!rJ7sex'Zݣ?yt qL_Y,Y*?nɪ7E%91we7%?RZ(\]"Sd NK!XT)V\`SqjK&ŊiUJ%j!ViӐ#B*a RdD6.9~46<\Pj%ח(0u&1S}@<}sp\ݭP#@Cһ ȡ>,t9Wm$Wpl$uoDӕ !Y6F}_KQ1M -eυ=iƌ^XϮ)>dSJ>YK3MRo;$`S)*UR2ӌ`< wVC.-~{Ċ]hhHH)1y{, D2{ܰ{u)ՂСDrߛ9BHGX̵2<~qf`NJUנܟ:;j%e 9cTnJ ׄ"n%}79P2NprLH5I0g7ITxUl=oCuTJƪs\t(8?4)]dTxJa}K)s o^>I ,TiRJBcuMkxnrjh^"y/{ QA)g@2qK`41[9P)$$,bRXAuQiEoL!lԡtY ֺt2 Y_7*}3C؜żE SVXDVǽPF%@Gug\tuSi'5gN$ַd߷ʑs6WNa[g|%=N($4uL49l󈤺_ͿLDQΨÔNj[ӗ98[hDm4wNŗ=8XYvfO_IJA7xbg |i[zZ}sؖ ؚ# ^oV7-1/2x@_ _--JtQ}:lq=tTBQOs |u+]>DW1NK*Sü1 )t5w1&Hi7 dLD5Q<т$QI1ؼ,Vo7A ttJ[n7ck`{7w`LD o?mqW K9ciH킢 0(yϢqK!6sy! 5v?oɷnKTg9Ejl_L~nX_"x%Ӏk9aQ(3ǒGGrm[:hڱpEƑϖƍ8ަX)ES{Uqe *rK L6Y#šc#e2.|{f9`iITܲPp\R;]P]s8%m29^澈6K)4Z ؉,}h/!'1FScnjWX%K$d\Xvr8(ķ DhM/jWb;V6F3Eq1t3h؃Us@CUpȑ$uXoW-^?rɫ>j` +xϓSZma:׀ 0!m/|ɁMePAo"]|ϤO$oʇ{_8f-R-ia,}5RAçWH߁N(;)kPXɂiX+5UG΂ ,gρO +dNC" 2,Y/C6[--8\"y0<.y=06TƹEoRcif,mxi0-p+E|ei!d()l^VN$d('f&?UwZ00_˿%?~sEI5dP[-|9Y E/ Hv/^iywnJI 5xTU>eTQR塩\MRB*8ՒB ȇjoa *8r|=ivmL*^SZg\E|| ᴛ4TĪR2LS[Wɯ@B5Jt8aNϸ5$չDL/)t]/ʍs 58m3Kk[={ydGXy8a>tC H|#\iJtcV> ~gb ~?P"D >>=>DoX;ۀX! k慯+&|3 Wev?5C|촕5fWnVuZbV SK?,tr)6ei^\J0t6tP{J9Ηz\)ণL`n+Y:Hn3s4 #aOxXêr:Z5$Ae4Ơ"S7t7}DA4.E1@҆1Hˆ1'uDY+9/n +LwEߠx`:X.|=q݌zl\0-$2ഔeD,s]Wӯws#lBmPRÖl"k?qfIۡa4gn32c8y>I!&&[XMPN8R2p9k[FwkˬJgSC\;):B_`?j┚XX,]Td +`hD2CjY213,Goyi.AbkFSp=4<)L#dX;ڜ #BN4׋UA`9U )Q}gQqOD3IyZ93o@3EHb8TB7g:uB O2&*(QMWQv _{fhތ,c^5OGM[t+Ert;RW +o V0Dfl_n(zEseM5U$͠gvMTqUxxi n/~W += I02d7G{ j4aJw +OvH kyr:nG +3z0ҏ\PPo5*Fj7ooPIZÕyž$a B)P$D9ѧHw= qꟋbMfQrQd! +:!36xVGe;d\R*~ /mU 5_$H*0#5\ ^ƭ~n5̢)'joWЁ XVb1]?{J] y7i# cztu'+[!XE: *ҰS}EDD\vhƞ@|-] YHGz'|ݜ_HteV 8Fe,+$\&m-yr!+LIw+ mȚ饭[rxN3"= e]"Sҧ q@&B\ƴm=9g:2Ӷ3@-ͺ$Qm-سppa u\j +TNfXUe\><{WMRa=F'nY z[S鉰%5S;,tJf_Bu_n~帍/Gf6} )_d^q֓@/as)YF/ +nhJƒFR|c҆fm߷q#O\W-" +`٢1K +#ʐK~8UrJQAh ݜ6n׊Åg.N+R2MI5K ,&>Gh0#e({*{>/N)[%YA 񂪳/u m=e1tց3NxPNl-r.oEK?I/Ʋ;ϰU# Q"zd OnM9' kE46ITk>OyG]" Yj9X$5v6om yoQfqe=yцb? +dzmRAm ;Vk.Jqn6|y;6Qn]X`0?H,U|k{ jdžϽbxvN&2MY٥iGK!-찇G`a\ +~~k/c(wXiY"z^5*X1z~SŊG[jeE?gԁ{Ky=Ma%wŌH %owh!6sUㄓdMܳ'!_B^|W pyG3' +?5-;2  h|sKJal!b#rr\ 2j|NcIn]67iHK4tt#edwp:Mllw)&g~BA3/*$ƍcib?ܧinKЃZ>y{#G4XU : ߲YoO +}1׶ +ZkF* LpA_ ܝ@Z; nCG$'q^(뻒fq yŒ=Mn;B,S5UP{XuJhtOoyx=Fi)cW/D%4vhn #-̸37.+!Z s5NPY6k:wAn8gʺ}4˩r"oL*Z3Dr#`y/&ULn1 UΰS)Rq+2{j/ [u'㿅M$ + "c蝑 +.uvLՍ\u5"5}_g 3F<ʪ3};`xъ$#1R7fiZsG14OIQy9?ɒRĽKMDr#x'<6Y9h&Edx]|A΀ρ[4CO@zqˋ+qXX|ΊXf1@⃝၆>9z6zj]թBMH 7ۥ dG&=OQE nC_ f1oJɍ3U]IӮ1_fO)4I{MfQ>|kSQ!r .x7TIۉ: S`&PyZ3HP8h 8!_g+ss" 8r\lϡlAx>C=\e}d|;?M*PJن65[G\\@Ր.έR +ю+Lī3l cC2]@ +&q?(O[=Vى7s-zԵ_-R!ufhgp`F*?=Û琠;*v +e>TDH4I`D'mЅRоAKBƶ^%/K{ *_%y=Vڸ*{ͺA^ + %^\f:4#ʏslHԦt]v ^࡫%ϐc$8g^Vͣrb4dW >i`霅=7(RDJ}Q.ez]XͱsO+NFru^Ca\$;UyYxGL^54`Z19.]Q|Ir}IwgRݱn8Ш53O;d}}jQEUzC|PzWdQN:jad4)?F}$Ft%O.GOYE˺myruGW +Ba rہYּͱ_ ٝfM7 H!_ꅉ<6ZH] ?K@-P'r0[mdJJj WY"ZNQ[x`qQ"r_];K:(q,/Ez:/[yu_s`lV0$86WXmy0j@7ETX+X +{1J1\mkbHP8'`<ΙA1oiYy_^׼Erπ#jAzmtS;*BqJk V +#xفfVF"},_4Y*骦Bf|H]X!5{cWL1@ۚot]X`M'\)`vG+08NĪ:/wR@Ӱ'mdL-D橋FN@g1nLS]YD_&6M}W^~:bq("E;Sݭw^B5ME0czFptVJK cS_bptAJ78u"FbcX4Rn`PTgYk8BdiI>b~ Mc d7kfRI(ⵥ՚_cf\~y@E^C)UF+9q y;LޣTkH1{Cj.V&]ǽUnm9,FSDSN,%|l +RL+-g+c,3ύKhߔj[*9B.$eT67]^@/K~$!9"HIXv ]Go/| 'odp(BfM 9\ 2G"ԏ]v=T+Z19όΰvf!R-3 W?Ǚ&87fp=/hp?tA/l[a) _t!(Сbt7On_ɛ;$ߥBE['8"F1jcg1T 8YbSCۃ%HTWC?ne + 3%{-ŝ~3 gv!VG169+2]pSaIqo>E6[~CDnqdsjH5nkV|Y퟉M=H0_̫䋜j-\Y#c!C^[Vu Fo3|ŋh|2 Y IQuC%=x6a=/MOj[>6Bx$8 CLN}n܉f4!8{ ֶ0 vpN5bFp,>Dpv(xcg>0HJI F9k)xQ6Lq_u0AepmvힵUr@+&l7vD8:C#Tyx^7߼(YRp\ Gc^p%9jN%vyvSZM$ @ROO2>_qZ%[5[}w;5RYAs*( U迈]LfhL]P]aAEH W G Nu5dP7_ض%+iM<|q΀wAi>Z>0U S*AYby1~|ڱEmnJ>]VT)yRkbpݩ0f"lON 8VhfHcF9k虎w}2D}ioI~@;囜yn&05ռQsHlhG>%OZJq&9^ĩME,o9> endobj 2235 0 obj <> endobj 2236 0 obj <> endobj 2237 0 obj <> endobj 2228 0 obj <>stream +HWmo.> `[2"\IEAH'L$>ow#)/b33̿O3ZJ 4c[ʨ߯>3mNNzfvjAnN +̮V%RZ9F;D l?|sY-?yh4a{X^mwugc:JEg&,Q{g?hbJ -b8"bF+ckw_U<,vՆ./rҨ,#5 :я#W\wM-$gre!.YFZ@&Dn㮺9?K$3kGZS֔p 4ױ+:kJ*:j'~WvNU509#NeDgC _3B 1=$ع:|X߷W^s_lN0f4|| Q!Ntg}8WDd91Qj^Ux5f15RJcKpZ.u(lv, O}`| + M`"ǘEWI3%#6_P9p9Wg&zfقµEɈ`x)Gz(n\<2ET`pPW~1He8] +A["LWHM ~siF:T:JfBN~pY\/>565+)Q3uqqjIus]utzjDp "A2pԄ1L6!Ůϊ`D1'CEA U܇U{T{=z YObjX4 |gi6gyS:eͽ/O$kcRB(jSB1",n&@FVwξܷcvVO:"g/2p`s&!ϠUZtv! yCv=]tK UIʨꧠjUش Uyu._oVW\kKızf?`(:{~߮xG@[<z0O +V&Ȣ&cǥ[m0Aآx"3H$ JGH@dHDTt9{rIt !qtLjW٘ &&Z"kJGNY6>]e0 rg֏+l%ZbԿȹw5e)ui^10 й39êIyޫl|R7dױ|WWQ=]Y7CfM5|SE Fdxb^ZTĶmX1yMtt!*.XHׁ°__FbpAp@Dρv I' RY"ְ0۴(u r8L^< 'qdEuUduNO2s %!T>ﳿzaYKiЦa.L\'G)!E-\*wu +t"@=ñX%%[ F*ss-7WWAHuf`Tz_ư5Q"\TJL.[,Ϲcv֞I3V-:t @X'l'(xrH%a9 +;ͽ|gke9>%A* 6 +hI-UdJѶyr +$'5 1h4 + ^ԡ4ʳ'{؂ M# "ʏX*ҌDu|E6 >-j3dS`fMm;9fIJYe r3I +^ېi{X.6 A\"\(Z. D]}anbJO:b ,19~VT{iVX$v<~ӊU WA܈+ s^|ܫKXt1|t8:|r`j]-6>L $`%6:5%w ZRRvԝ+R?${! MϯǓe7~/ɗJS F\~|$uf_ cp:ׄY9+ W{ d\?, 罻}Xzf匯^*GcF4dS[zn֣BLr v`% bSrAFZBw/7@klz\8O@ś16PK@|}5cr (^7]^%n KD=ilϗP_ endstream endobj 2232 0 obj <>stream +0 D@&X Dޟ|"<~4?\/}K`vaٸ&tѣ4%6zܛ*TWEhm cM@7̈́:䪏+,ck|' iX/ց% 5 +MePhى^e_-Yo^ 6^@=o5}*JaaaW\$;݇Ę&;6|YDp2Z UlԪ,YK}լJ9nw)t2on{[)-#nה}b&%%hnnLߘC"7DrԢIZTbm L6HОu B֝)|IWU ga EX{ֶ_ΠhՀRMٔ +D=g&'f6]֙rvH'q`X)?|{^{p. +cEԺE3; +/|K&Vk? 7D|~M}$qay-P0UEs+T]5 Zq4PWW + n.;3:k٥kt-YE]e"~ +t 5}h4%^Ydŝp{_Ye ")/SP +AS)_°Winp`ؐ MFZXUVzi`Ys~D&5udBwvL闰EnZr )zw*,LL[vBD\1T<͢JXz'F~JMmmMB/CP>1nC"zZ6>U*:vNnv#, +pmgHQ(S ѕABvs яH*h*'+iJu mep,O(ůy A=vvO k\5$f/L?Sa$= {X;D% +R{7 +MǴWtby. 0XEmvu.4ePA&Lգ +Aߏ5Zj:CF_,C(ܬ%4q%y4a?͇ hSН~64n$ЮGؐMlX9RO" 3eJR^Ioxb#r7 ʹ]iFyw myyZD͘SԎ ,w mH|NT=;>Ǭ^'G:2FAd\6Qdt{ͅ + Y,妚z)5DT>Ac:N? .]('L\U^՟+{VՊPDc#@?Řm>;F$Jevlbm֘itGcaq%@0`63ţUwvː%Q4l77Vx ߾ ɣO]3CRX\Dej}ƺjJw eNtZ-Jfˬf{f}E>#'-P2Tv:kh4UE-[E{"n:l3z7TQ/rV0aerW9Cw5 hd 6>87]%tSr!;OqfyuI+*ɔk0ڳ>3 R  u"bPjᇨ#4Dyd/찼 + Boh]Sk76.,iZ`*;0e~ahGzr l.n}}ԢJQ>T>PIBP1eOz~۪-Q$_F-6kgPs$e +4JK]QҼV\^ dV)WO_ѓDħʼo:h(=_쥄]зlÔ@ֺ09FzJ/+P #D4vU@ڌ]"|[QK̜#䊟ic֋:x_hD&ĦW)4\i}f8*-&cbE#UFr@&mOe+al*trZn%'0LFN=u1*C|-8ܐ|&Y[%0"lW/yK0$k:+Re7T6 +8a\~p[4Z]4I`,곁] bol٪{ +߷Jq2GbX.-66]Irm|Eiѝ[Y|˩nH׿0D^g^Td) 2:uV%LZ7 Ĉ_J~%y? !te(Y`JPZ-y2L\Bd [Uq~)-0~0Dd_Y`֯dۢ +|BfFWX*u_ (>a8گdG,'1(7"eGٻԠ2. g)?/04PG4<(S?=vX-`+}8}f"mNrlg׼lEih,k_+>Ƴ+oe)LN\[ҘYǞEHؚtQJ$SHpa9J㞆P;;zTQ¦)u4Эg=څ xQi/T/7c |f4q$!dߟUDoJ]4z xLZ`VŇR6{wf 0C3ϑMzf *ן)T2vX@:Q߶ʨBi|?GQ3Ve sI/m'JuN99E]ˁ4i!5xoiOv' ؇^ݨ,J ir60.)eؗ{GI^=5SA8jo(6~"iz0bb6De$_&lX[:4\k/ᦗY BIو/0gJ :gbr{R#i?k z- X*Z#i[D,G nml *fHJjWb+rMnbit]\/ϻ_5|GPl5Are A_ifI%-/=ĝug}67"zղ՗CUq0lq^QN <;O}r)i9E3$ohJTODQySXZP5ػpz|,cZ-mLJ$ l.!hSn%'[9IQPiyDrۉ.2trj8*Ppޭa@O~+Akl +@'حmUiQٹ+4(([l~,-t٠Q +H&^hW}X:qj6vH؞/,x{g#(Mm):Th^'=qnyRy"ƍ"aOnDmm0q_i +P!USz +ڠGv9!?>٥ >vJ + Oa +**.>W9ĵ'~tR{8$iW@E\P~tvlbʓp={:\LWZ?zX +DJq&8Hx!ntKXHCLUŰՈ}Kl!V;x!0xvwRǰXP_|/'{2.Gd{y$"1`5䝼їP",]V2w,ԭSF3hs&HԪ%,P:ڍ!չ,@`W3K݈ =clGiԓKXOHy;$L]_v?KJ#,0%X%C୛>]݄M_G`Gc%~^|tk[9">މOHϵ<.j:8uSdbꨩYL})ڲQy 7grײmwXB%Y8RxbqTM$g>Mijɦ;uj).8[Sƃ/.Q&OWIjV!Zf6]zYYAC>ovR1:)p/>)v Q?bityU:&;l`Ջ\f+_gk6Q>;~sFVg)R~iϵ3o:$ZvzfufXa6~~%n\h0i#>O*ϴջ3WpAQ! b58ԇGzB_JB;M7px9eu cGc֢]Tbb9A٩fa;, +kWym v8,}Mw֒ͼD4)jhABf ӻ),R3ǵ |(q^x4g_x)pD4ѫS~^ѼQ%7P]m:9Rs2PS>0% hJ½'?,k^8mQBXiүQǯ>wd|G5;8"?4UgJGQ֣e @Vρt5EGY/Q^i- tOA%+@e9 +88H`&NS6NJd+ޤm4:1lET#rnA~J dA;T?WtH̫ɛaOfi-U^wW,h73 ]ni*A_$o-F\_^*9 IVRi`9JrfS`9l;-Ë륈eOr(5w7]G\8wz{ݷe0 8Jo3FgiGvy@qI^~ yʇJhe-~2gsuezsP9sCR*v^nXYZDd>%&/ګhQYP X1KXF&wH$,=zkDt$yeg*^S')' ZYB&)[Seʾ~BN*9 Cc^p=#%~Ph{,Co, ]f +, sFY;ڏ]ZE@6fZ pHz*\»oX$L9T:Xs^?5뢘*&Y渚t\xT[9isb}>h!STI \4:jSztP]#^"5,P%Xʋ[V]dbl֤5oSP0^BZ;,7\`S(5.cVm37 +v6͗-"d&n ?}P]yJ I'PW9+qʟ4hэV|Շmt09 +Co$r 8U +f9)Z Te&uL*413X= BתJ$_Imȭr(K߱%|HOknq*%H +w+2?n~ V 5Ѫ I.LY B|YNO"Z|j5hXQ'7GsEʻ~+կ;|l$o:PmEm/1;} +6ZEh M▙zeL_\r+J +B8(SQ[HeO b%@p5=RrB/dM~~G;lTdF>t¨C ܱqM->K&|Rƭya$EZa/.nzAq[WCUkӀfi+狳&=-:( 6:;N?\͚lv6sѺV푻^7( Lb[K$]uՃk +^=}rşg6I2!Il$ }5vˤw_zGnNoAXPPH5i[kq@$I 7#@ +ǒd++ֳ|r4gj["l~L$8*f+,:ĭ2MGyl] `cJBs?eumDŽq6ZP6y7n|g=NCjЏu !L'&igBkTDqaFe{PE0mv]p5Rp gwZN~5 xuK7L>92Ac~AZ%G!(ѪjQS,ZN (45A/-NQ~fGb0_#\Jjp@P{/ZqV+|ݼ[U0K)eB+u:/ez6Dh`˭S殙PYnuvD01}CLeɮnd^IZ^t[;_dz +7 /lf1XG0pڢ -@~f;]/84H];?Msxj n"ti.A'ØRgPҗv8clC& +1f8%sm.6X|[@ 8Śf̵#V lZ+t39cu}K+uysC_%$N54%qr4 l}(}Q$Ɨ?cF`pS@QJ\jQ~EH+E%#e^kOQՄRR{Mf DTݚE6T +u aϋ۴50qjR-lʥŽueNP m\QdM9͋=-yK*%0jBcb |ldx:y" XoF?Ֆ"v 6j29Q:#kIC{snĝF4'Gn<wSLLuy߰/z7S&*Ob,"O $G]M4CߘdYZFZ bGb/c[<x\cɍ+&p^7o)Kb"A +y^aR5EK*q^?+%MK~TW=Jǡ 9u+.!5t. 4xa6LUw?<1:qE۴ "ϳ y˗]1e9*|CSnNqWjQO퇧NٝߊDkt>!zYM HJZNme1{%RxWą} +Y^~{ r݃4>lţl?FigO]~W +Cw!S;z L]xH2*"@6B6D{H)J$DZ$ys d%q5wɊ*:Fv +ÔRѲ.B̅ҥꨁ<;Sşa]ܤbv<آE +mMn[ef-#|89 kmA[y8 +g0kʿ˳+g1ײ{!b0bG|Ld1rT\~Ĭjl7YN6[/;#%/#v.g-J| .MQp}Xn{B!p%MP|Js%1AFL?)on`,>k<j$pqZaL*>\ҨWH4sֺ,v'n,"Ttlxk/KB1/A}y]QRj&/qnF/8kŽ&b4zɇagd۷Dy }6:.ghuY:Q˼1dRloY6-"*oa|eጡL/$v"(܂- +_L 46r,g1kp{tw5[G|b3ڼK\(C 1?dB|-ewF^k6A +LX6WL+xKemlD>Oc(]%q:ҕeQP2@Ȝv3O`3dv8('/];<-:E$`rW;6bְ6~\j9^)sum-he +~w[htw"^iW@â> 圫 h-\Ec .H})Tz:~9B7F^7E&w45Cz7e~U-O8Y}JE&Qؙ )m3=$TVOy8C$8JxJ צ–juy&xk*z^Cd/6H5 HBl~ + O\Lx2w~L-&ʩm(q +lb1C#`t]*ty7ǻv_DZgq0 {bhu)tȷa|ld}n-4uSPd1@Apcv L[wYN&cz2ҢO:S{8sr.d P ܞt +xIxV~+lFNӌ-nz% c{(F ߶D_9gPu/XUG{[QWsٚBvw&Ċ1\Q^^c<$m8_HA5> jWM#^b4iк{ku:#Dg[ٖ}#SE?|я6ZvEZt)G$ǩbi×'-N/MhԽeZ΀jƸcـFa$c cmߦo0<40*e顙5 f=MCOJ$pC_6jºHQ?,4] P_o*j}Si䖀4@un`j\ 2_޲I8]^idH?qJcV$h{F?No]Jnj.ovZyեNvoROU`{ Ғ61=^2CK(ˎ&?pfҚh?'O5 4XR wP8#Q:L !1l@4b)cE2>ppp E6uM,l,I~Lb.o_ D{Tą y M镹)^i~3 ,Ȱ+z5%{/&]I[=y^λQF^нv_{i?B#m +FEh`WUH^`DFޗ):d; _'ʁrwiG3431>bǴȓg-{2Qt|W<iz#)- h,ڬUHq wnSgQ +]NCHN1Cؽ3C@-_i%pV *5>bO뒕X'Ll\}w onS3,RV&atW8@ [@Ž7mмkVFCM*8oƖgPh SJ}12$ofTX +2dIyDv<(̚"*6ꀜ݁jPnbW7osb,CEu;ks&?쭣TH0GM {nPhbjw߼XJu 0Jstš$쌘+Cǚp BѬ1 V kbe*pl\`"*[vkC͎!9P^V?{pd'^}9  YUNۂ>$3)1bAG{z0`^)Pr$̔}E%X#CQDERmdI>c +Y{Ȁ˨&OFn٥_`'vʊrʜiFVh8cB]ӷ @v۪/+]>Аr$WwIn@[fil46kP\lغ.4j޶Pv`f^7OB)~H0)TTB_bG +'wF#A8D5.b\%w$ 3ѵlJ?OSnƑ&s; wb ,7lDn_\%;wQ~i5O +kGChu +-RD)fׄ*]uYCsEOʪdgJ"AP~2,>7/BBג2N@ 9Q^fo,yqlhg&y3[\ot xXDz+PG2]T^EB00۠Ӹ@4, p;{5~I\i$$"%T.21-oE(h/XՌr *,yw *^h,lJBV k[,ZdETY1N QkWL]u?;)#SMZQ$""!oΡ5'#u!J7СuT7V:v:-~#CG!Dsr,O7WƭYokm` +m)Ke4J\U*yZ~_RyƜbq+@x+)F6hZ!-Kl O[k/9/ ЪOqf"Aq~5̭툪k 6[P4.FC :"o~ ʹx'#ړٲ Bpeþ<׌]'龉 ٕĠ]Y,7͍49Zs"Jy!JΪUQ=vO& ve|LܓŅxZ#ԬGETuɰy{o2y }s}0|Nu*nϑ-O߶U +ʪ{!P io " dSCt +1zY 2yi +%7V2zSĿӱ( #ʇHuMLr]KjXϓؽrŏ^k6wf)xa}ٵޝ9fqf{ci4&_B>sP`XV*P#PU:֪۠C:k}PgA¤y#?`!7U)ʃ(0ݘI7boP e^xOQf*.5k\P'SsCq`*kV{% +vװy!I{N` x4!T߃'iiňlx'?V噐2usd5@hZGsS='x 0#Zjw*># LήK1o$* |ҖEut\_`:DK,-KwHe1dOK cfFDs9uZ d]dרLl#~@%nXmeG=Q)@(4٪KVxrX"w1hC9o-5.m@چ"Jh5h +q-]V*~dD(! ղ8+4f+cSP .+|.rX,r@؄dNd$ۥ4QEt&+S=4yaY= #^+f$M0QN4@r]2:^-m_ #0؟5ܙuJ +کņY٬ TJOZWZ< ᶳR=q~9ϴςU咀_,tNKO^nX730 T<7 +TH#M_D~ ɷdCߗ","2[E qP`刹߼hSfHz>Ϛ[ 8/unoGl+u/3\tGrW?9{m4w{\g>~/Uf$ѫ3#ĿZ{6E@BޥٷWwo MosejZ|u1X5Jfѫ(g2cC g󀯙OF|BKoŒזd^㔴Pɳe[}P8;ͣ12±+sfؓyE8L> Asz _#m֑nY\Geހ&[R|RWySǧ#2YY5o:ܚRiC>c +ſȩ,׮Q#&OlL]cz%>ܸ(A+r7Iۡo`f1@S(t~.n) ޸}n\JQw#(w6rj;0r@/o/x&8_Ʃ\Ӯ̣_%Bf{cF'dC9TӷϟxрPxNEN6iW-xQ:r1j=;13kVrVIh73~gU%zl9{F*4+&_vIXvtEҪ-B.<z.Ajc~vvvS;kxyB]h71਴-Kɖ*mQвrFQYE1ۮi_AqM$z)qܕF.ėx2pf^L1zV~G0©牠|մW׮A( "T%FJ+RyfCK>k +z,Lψ|͝ՊT؋`,~DӪ`Z(#{H1Uxyw]k_w{5꾯J:n) đ "QO-hQ\C{\Ile[F, 1#8 LGFwuG?La勂NHԸ,wwVy$PRwJ$bi1 @@lB%3̱+2c1WmuPvc82FYl&|4nGD@|ei%.!Z.u!˺ELb$WIvUSv:Ѧ`wmͪE8VB-P hO]'8 Z>̋XY 8P 4. Awu_OsfѰ͒$sQ}Ht%pҳҋ؇(uW ?A&M/V-P;PGV.I]c +x-rb:gNۚ7}p4LL0[9++e@ /0RN)~f&׍M[ pd!̀`@3ɪ1/tfA}AܖMWS*k̕~Q_AA|' ta,M#ӪT\ t-/г`&-ko:{xˋPoSWR@jRCu&gy R|id/ ȅu=7djȯ28=yzPHd;S Hw|k2 +戅vֹ}|岾gxg6;"D.Y-1 >F"mKJ:ЁP0|-,Z#5$g=`cGgAgTW)[4E* +.溴4mS|L_^s+ PxW |rS`kɶB:NuMQzūjOxul j5QЂK`3î Pm8ۑW`;| _Pr{f92NUQ\:{.#\{YÕe[;_gb(3W=Z~9xMlS{mp,CҌMat1EMP|%E4\ԡ~JmXf{b@uO2#DJԓLGu,c6qM0o'ZL*x;66Sv6]ν/}Ecn2=`>$ @F]DJ;7H+6H`'UiKYPvj?=T`kx,^L|+%aSeV+|V ỦT:«SjwӲkbEH0R %R`NV@ s;Q *vLX4HbqEG6AdN͸;d塵ofI,NRIc(^U{9kv{Ll< 6c @ *b{q(/ͧ{9⤘AcaЊ̎> endobj 2230 0 obj <> endobj 2231 0 obj <> endobj 2221 0 obj <>stream +Hko ؏m2; c\ +(T{㨵%EwH.ծ-Eؘ  \f9Sï=M\?z)xl[fINMfǢ`U(b?Bc ͜y?Oj2ͷlD& Tgɟ/,6beos0r(}ӹa)?\>ˏ?̚p]*8O,1H4FerEtr(r?DQG4LDIH] \ʊ +@ ,}~_ϙ |N5^iէ`n<_VLH]BهGc>$P|Fr9E.D2"gUb9jgK󑩓a!?|*Dd%IHrX *KN3a sx/7ߖRF.Պ1q."Fd}RM>F %LK R w0& fy%<=FQ3끛`zh~8V3ZTwiMʱs{栀aay,zѶ &_싧bP6.IϨd柭pe@Tp';7r\WRWk>,'6 +S̠ÚmO]q$>~F#hS%'dZL\mˑ2As~_?#5/B'eTFBÒ2\SԳq{^OlS:{"s|(#UYEi4 Yp^ qk1Rީުgby[T"m@h0/Oau2h:n gt>%qODIůA +~9] +XZc\!r4;r?Q5x]l:$y|*r=9T9`}:t\Y"AWЄ6<.)Il6 +LFq#f>7g-6=D֩A=ߪ"҂veVuo.=DaoERjZ4N=B 35CF4ii?VAòԬș%'Ͽ_R-0ЙK>C ƠXx\~YlŶ?Y &f Xś]^tq8J *H_)~/oo/nO'o59t֖Fe 7^߼>/*ug0PZ/|, ;1rvgwȮ5hP/`Ѷ^Fw4AfW +]ɦ:Ma;m~+q&'OAךQ&yܧlA[/`2z7W}4%&! ʝRe ~6Ɛ gaUزd˗Jd]킒6z(efov}W~b݃όI6ʾ6SR0"2iXcbZ(A.&:vRh*E*׫]ݏC,cQB ]8_Cɽk;h% J2:pĄR\.Չ/X endstream endobj 2227 0 obj <>stream +0 M@&W~ M ?ӎp`zΜ"7̏ +%,Ժ]$2m5C`QOr.EA +jYJFt,]ϢGT/ ^.| ݒ7LW GӵȶQI+Ӊg}ܥ%Cx1ᐖK̦S;QVhhu0:YgS<`W˓t~y{/Q6 Y".]wȚvlkVmyHtUSMbp-,k8\0S&ڒ4{?㥈)~'op%O\G&t l4 I2fb#sm-8RM~Jp"4cRWh܈notB"9E;\@hSfS jòR[}Hڷ`/J}\b\|ƇTʈ6V/|x!LS ZM#̋IP;b}Aڧ03)H%|;o$& ^[: V XrvKw{#;XeI]qnf R u߬2V +U{ȟVr&K=| VW}*1?R6Z^k irs( 4̃NC%mWyyxƸ*AC6^Ys`~K h< ﺜ^&{&17xs=VV4z q7{`- +E`"bKpa|| +>k$ry1>*|?8fsM GXV0mOK\-nKUAIge1$h b!zxSʕhoʪ0ҍɇO&bڿG.mɉ=;nd>˕:i6@TSQZ3G7͊@# +xَVWv_ԡBrѳWۜ'}}`4g~,=7) HGqB#2=iW$ P'!9vj20懲>{٬oeL.Z1>Q@$M5l6)OrGA1 n$4>ΠG 1VPm;nAHUX()3Ur|"PIZ +P-dYw.ږfϳ~W;htOFly ^ +Kcّ5B>W +ܾj_C@eRE5vڵ9h*U[k †U'( lc! x j}$;!z%''D뿽4Z1bhhCLQ,&i Pq::L>^LQ]g ܳm̢d|YeWXxaTJ2e]d4NRtv_fVByUx'pXSY?зαA9+rJDzCܒyZVOץu|yXq=P+2Rk,Zb Alj7WA/?$gӤ +EG6kןunyd؟?v$FT -ެM>' ~-'>fEL;Ϡw1b0ސ$BJXԯ>iWIΎ*BV߽G[~/eܱmH>RhKp#jF 0`Y8zU4rhs +Su;c'申"M̓ q:ɚT%Kн\_ENl+?\rE#$Z6xi3/-٭iN%~8y+/*6=u +`ǟyb LxDIQLFJ/t!}j4l+URȑ +@[dZl9rE[m7O^ZFPB= R +1tB,9+G<ϐ>Ü[:qL՘X f j,m􉽅ᣆ[8ܪ4wd OӸ7Upt?v1ں[Yq>f }3Ť-v;3b>Dv-/qOߙ?Y[qgXlh06L_*|IIF'ZaLZƞoSpVy0` W`3HR[_vmI(xJ,*D$3BsU?ƘZ.j\a܌ +@CY ܆%DGA4IFD$VS!l5:CCHOpE&% O +x@uk͜.Zׄ*V[# 5csаpMĺZ?ވ[(=>eeU~'jZgjރMl^| fW#a|٨L)6+-]Cyg0M$l6A{ v3( p2G$ZNcd|1)'k!z[Ь"`E km1au}u0w +ڟ$ejkMNGff/;ڲ:ﴴ}#̪6١90ԘſO/wlM l,eLܳ)T˚"PO(7!Zrk~s _@Sz[k,$ư`!NUObpZg;am %0D]c :Eƹ_][禫R6[`FA$|Uܙj9<Иe eBtxhrsPkf@0F.q"<}Z5퉶plQY( W0ytM n<059%\8r?X"s* x}ߨ[Gh>!yA*0N(ox@R@;ǒj~bl_`&DK +;1c|m>gp6bpu}7 95l7"@Ɇ<ٲU\JuԗQa.߂$(% :ɯaSil*ZxMUAyRo?o]ga#Jۑt + +fAsտBw-+7`Rְ/CLzCs^!Mͨ{zB_AG荋\mˢ9+?$Yڦ:ݹu?.&jk)WB5ףZU?|A 8lf+QVepXZ:<v>u\F+C/ID\PsT4%jNHs\vF88plq1`b?~;C),y Z 0nך9% +#.Kg-KCl|oU?P 3Q=s N< ^ˀQ?$PkْZ'|ĆmbhŒ]ѡ_ !=f֔&\Qڏya6o,IixO%J^V-\Funa~Z q̧ $Y{p"c vI 6+`̍Hm5b3wTz4t( +k۹Y=qN-k^Qv5 k9KƋp5VΉUuUFUH>+0<)D2sMedžs,29A)j2m= 4:!BǍ: m~~-˖]HxStKF`ևśKxWdfWAЎAiш/5~QبS8{UG¹>RVnZpp*~bq{= .=D0dT9Wz'x =:aS]A|f+$^s;j ̪RM&?\)(lۿt v^U#FD%㈧eZ0=_D4Knb=]['Vq.+u0Sus x ǰp3[Ԡ(,?*FL5&:fEӁR`Uַ9Ybm=2U=݉EÖLa*ҭQ[d]AEoS}x^Ze1qBNlqG.3Vߋd r`gOmzlG)M7 U%)T=d=̌fwaII}܍sn|CC'{6H2YHNQ[ۓD*VCP@D/n lY+wob`s(Q-< Igr|sT`gi*Qk˓wJB2Kaa=2Y܍ E=Ny2Xvyay+ٖ +vuu!aFǔaEǾt_+wYbq_*M[Up"=(&_2UK 8\aډZ~&*b?ٛ 33z26h[ҟ*y4 ⲀtPa Pri_B? ]Nw)kRP^ĺi}ycU=Gխl8|% ܯD83!wISku\àx[ +XV9 m&UDḂF8M0rnY4ee r4}nSj6t3V$o(^h8S"ї˜1hcW;.D\LFp{ +T՜`g/-qe#IAaqqK_y<δJ *ޜcmv!|  LI i :]DW>sݠjzRAaD_Kꜚ ͩj&Pjj?MvMh}ݜhL% Lc3@ɛlQMό*4sQ{,'Ƃ=['DNatT`mJZ*Xg `֒a4ez|b*m+?@VrJXV=nDX!!~VjAa'f9e=*/IcL8)/-F, ~rmPJ8:9oL"~Qhyj7Xv,q?)BUu-)v_Zש$PM~HO +u*!. 0A1 1JhMifВ`W8`FV[Tl1TZd- 7Qr6SKl˳3Qz[TYؗ[IY@ƈ=/>RF m)@d,ބ7j֥>&qg ̆zI1 S])洫P@a|=1;=PB(vLwO(X5G*i@GWmUdP"> ~{gIpj gڹIU*¹s[^*X LOlc{'ܠRjH d݉Eo~J"|;H֎vE–ߜWt]dxc|^dH: ]6*XG?<5IDZ73O v1x@47ވy\ z ۩ҹ+,#ܿa[s.KCO4% +W=2ב/Ka\6|PK䊝9$?f??5p˃ i0Ѩ;hꍡ'g9!aѶ/uhђ)>ƺ}nK 6+s 8eR{QF̍bU"{U13+e<rN>R, iH4|+(Qޙ1 +Woy,o'唜dwhHW?E §*PV^#qPU|m(ٻ[D +#c"/4w?il4xI5J D) Sr >+xjh9S7f^zD_p%#̀5Kx;Í#CL&䷊)r&\8@ +{̀[>94@)P%:Cmy5۟1:xO sfX UHyKzBKwu T)#|/jpy@_"=㲌{#χ<͠ $KWTk~ ErQf +%|R=N? E1BY*JT#y,SE|>G׳v2dDkʻ7p ^q ` x؋^0i^WՍ=Saeu/)̠Sy\5ͣgA(kY鳳Pr"ԍLN>4q[F*2Q=10y&Ⱦt$X]ZSpjwEwj(̉(15kPjX۸$4?2s䱺b+{POQhSsg(۟7ٹBa: w2-L(,gw]5yŧR6v)Af^lpddnySGˏ;LLȌex]A$z"U*%NO} +RlANat R{\2`kdIGw4^rcFBl +gQ*VD7F4+viC $N{xh&$8+rs,Dd:P9i *f׵4NOf LOg[1/q_=#ẓ'M;aO櫓7w 楳Dž'#icf]|iS^F-׵f ٙo{U42y]ZWZ(M+('SrFlAۑ*Uyk/x'!T_zO$QްD%0~(n30 Yy"٥lhrEQq_lEphƳʔL +yLn>5yD?q-PԠTTJ^.KYd9FzU!AkiW>?^R8jE_E5mO^BZV` zVe]X%A'TAĤ.I$@Hl-{{+|k\Hoi?nuj}?kUNcf/ՆEa7C;=#īþK{my 9S٫aÏĮ(*^cT Fq46i3_a`<,N3E&΀H-qiL%~OT1>2Ɨ' ,t_4&̆feC]+(4>{p)Ӕ`v7F潌*h`.L|HOnq +&l5'ӄ1w }[:;5Dm>F$3e:FEX%ɤBl"d^:3⟜S +Y(BB9̱ zc2;W=ik.k?ͷX]n0 +A ǏT#}hG G[ E}>E'd>N a(+?|I%nLʍehn.^Ok\ rըŌ?+멚>A~2bm>㷧kuҳsc\'Hv=PJE-V,Qzf3; +Qi['b0etD4Ny\v?ڑ[1}!UMgV͒0E*/9Eسݽ%}87+{UVoT&Syc%k>bt $^P~9j +)5sWکSQM Gm ט2‰5mdLJ|Xi2?DK뻂,W t?[II;P3E2kI6UvWDQ6vg|3BKzcl=3ꭴjbYHsO-,i2'ĚNY°=z8֚g,5,\e,U2"l`ů0P7#*8KfH`"#kEDZ=s'-n>v5"HP[R1Ѷ| v񻿌҈vd8Ĕ TOeP0a2؛-CvgzT=JFT& t hRc2ׯ&ͼ(uӦcv?3b63k6>lZ|fPٛV5>>Ô$vjYMTD@ՕLOwa[;.C3C?+pCs\܇J5]J˼J{lzi@igrtDgBa%]ڑ +]kK0B XJN=Úƍl k۾81b 1do\ch-W_~S8qK4t#tLl`]I2Nc~WE3EVh 0*cHD2X!ҩ󸬐evbUj@ IOFpT=0.=:H'y_kGc UA8siiPTr$n!H,}DMc*k :8D|8o,ʬ$IUƀu+l>C{iHeFv]nV!ُ[AC]H iඔ+j3GMwf^˰ݾS)ulg+Re(jn:<P-uf~o˞u2gS'HN,IKd'\|p@.1 +0;p +#hB-u I خ1R ;̥TpN2NzJ^Qviᝡ$?+2Wgzu!aOS%/l]9 N/I ZLô)3ыܣCI"MI.}i&(R_z~swȐUHtgwva>/oSP~n\&CΑnʼMdE,oS~ϧ2?`8RsPd`&v= !䵒z8ݝw-I*B-\Y42 Zx +*HX"g=q~>H+ɸp?&= 3;+s׬+ IFM_%"9/%YMnA‘MHDH}CGE\f!wȃ;󴁩S1oI?l.od(-tϭ~'" *)i0fVO `ܨZxA=-GQw݊`[ Q_ O$3ݐ~&J(!irBF +8*XO7nt w:Tެ%+=R\dLvAwBPK Kƒ?4FwdHs?6ic2n˶Z` 1hښ 跪nmb4ςQxW㏈}U,`V'2<5/ñw!Uߺgt(Qj;UdDma7rHAYqin:2"Z)>p5ޣQth0EDb>wCur &^gWB0c;[:\ZB)SݽlC䀲25N$֖[:Nt6[`܏C&r?8tfOf@{^zSq,&`޺za!΋/6TZoDb$v $v)sguXlB9WU}"3y fM?Q+6hHCHr0+r(FVIe߆l05cs'lcOl=۾P%In8Lu/X]C섕/˜DOE#`үjo ILk sȘ񚉢;?.oPqDܫS?yWs߽Y^=ʎP|\A (D"RMu>\Lr2=1?_NG~}V~ &˾ǴIR(a(zU3icB϶'NΌF>|LF&hBSA3&ة;{!n>h薢zUjBX˚jͫۊ ӯry›XW y^${gy"<&wj= 麗*+h6!,7sAxنpAM'J5v$(pH?.>0Q]}VŒE:,SKX2<L+` @ +zZSA<(< Ues<S U)J΢]E-G nhVVL@j2^LWAqaA9qL˱%9"q8-*VjoRlCpݍӾ;# Z(`DU-1$/nu=%+˛a摰2xg%9ͯjLo1Utn;>M* tcEsMﰡVNwN*x DWEwk ZܶX;<$> +}$ľp_]Y$ønlc9,PR ׭J/i۰2~b/0+ͅpCOHE)NU ҠfPԌ!mZ:> y/I4 nj|DgLss ɀa +z SꓨH#v ?QZEA`z`Ժc2UaK;) |)ۂsל1-Nx0<|v8zXV7%b.jyZIvCh(On@{0θvzi`dslZ\<1WLY w9v)Q5%!f Asx?,0vyPgZvU|nu6"92tZe2l$%cOU;Gl~g֛95:u@'zAH# x<!scIv"7e `_;eU)T@ P#yn`gQ>*6-qdPeenyf=p!B2a_ب_UrۢK牣Ǖda&(llJMIxCdRQwqeX֙G$Gvpo +޵xG( P:wZ~ʯ\h&X(mUѢRY yvn.>Rq%bDs/@;hܑHr`ZJ>1NSJҭ u\k:hބE} hqu#Bn,˛cBE{ dy۱MƠRp<լUE gaR-] ryJt ->$1K(3d[UE Ңߡ3(- Zg?ީuFP( ^6tk\ ^GL|{IhzgB4#_7 +MV%ƀQ4[HA5" 3es!=J+A>02] )EקCc"B4gog+Ә8P0oFl ߥRf~6HeQ.viKCDH—՞ Tv{ei 8z5>aEvbq^_!OP"e|_>yG#?ԟERm rwXFcu+_Y7AW&k1kw7{%ˋكU:r /9_LVSFa6Lʘjze!Aa%AZ􆈶I!H0+PoU7a庴*z}f\p'c"> =,rPv֟GJ `yR6s 7$9OlBM  sQeZSIF1G@m,W Ls6QOԣ"={)9/MU9lY_^xNs`6e ct^]~ˋ1:{ܞ嫝adUtcN6 #Ŵ )O$$[(\|BNiD'|h +PNYq2ʰ3dbJ=`=hJ/u*|lw|RqdvH= mƀI{t氍jvں>݌0 +I/Z#һn;$ mOhYR{dMVpljfyE"nȢk1 +>n]غC>mBS`?jj{aݿG } ȜOhY>$RXQD9noicؔ\%/% +{ܔ"P7@%XY;` +9}m+CE{*5 %-a 8@^`25!s3e@ϋ,/@=چn-)=V_,i9wcTKߋitwz}aȧU&4Fpχ/L} +{&W`s8>b.|-#X4"`*8% ++ 2Ѥ!NiȞܲ1s\IrݽΜb,Gާ/Lw;p]QVڗr+W5sn:^^tVÉE[ED293Pdӹ="8g< dy3S7plJ?/ogcEvܷwJ('q b"AVh /23vyu.5rbWk e~hʲ*Ӊ {>)u 2w?zd6Ǐ3>DH{bTw&`"ukf]i2Ӿq3"#S2a1 5q'd(<"=ɯsōY۹)֨b((?ŐI,(8~gECVza#8=^vȂٍk7y,'C8Y˓&؍ML>4z):fŊү$Yuw^fw̘x1C;?toNWhsdct)Q-/\d9M\YUh")WxڄJCO98v8TFQ 7"z䄟๵%z^fakiQF!-A F;mt3t?~ ̗ji[b6IF hұ#XX7 &Y"YkPDRrl2SPvcPHqbh0PUxj&8{ >/9>u~%nmtw%GOLi8Ō\3uM" ԓ]ypGGMJi1Uɤ/iq6eh;~Ю}O{E\p8PXqrт~2PyEX@&~Σ + 6B> endobj 2223 0 obj <> endobj 2224 0 obj <> endobj 2225 0 obj <> endobj 2226 0 obj <> endobj 2217 0 obj <>stream +HWnF}7=}ARٵ=^KN,M;e"odM< QXuS0`F2 ?Pa~g?N&''?8##L9l4 [a$H&B"qߓ짟>/O? ϳVx.\84Y#g +40Ia%Ȉ8N8,W.)$AI@|8|`4#d)ƑO1T'qƋ\/Lqjt=HB3lھ"$sjDCc`ZY #GZZ_2 9\8Vοuߔ)JMl˰)$k#D UHkJfdrw Ivk&QG ~uK-- [>MUo#+t-0LY,cY X t>쁊LP!ܒ-@i}؛]S/`G/N7*ˡT99=F<%Tޥְf"Vjm5(G;Jy:Rz8}=|J^|p9y*S5h[<uj*N<"tx/5n8Um7ҸUXjN5S5Eb%ŁH'pW@2vF1!6^) +W׸uwT25">m#bm:ȻCg/wBw$iGsYI ˰T}jchad Ļp\eoAVɘhr[04g Ch-/0SpqjK@qa+lJ">fnUys~LdPu~17lO֣TVM`< IlZb 0dա^GZ/oyE[O(s߶  s`uƺa*!es_9I}QIbC}@addN^>Lg+c:X@'Ga8]AVӯ)Mx.ߓ5.ejX%ޖ5tZC"DLp3`kvFon?_5,̍ : ?]_pHnR\% %*0e>rv=횮x cd{,Cw)$d\xZnRZ3I}{f|^󊳵xI #؃'qԤQ L*"yX<@7o谾/M \C4;5a40R3墸/Ԥ$8&$ ݩɯOy#1X8JF׬4MKiV96iX8Ԅ>[\ױ=BT]HRc{7ۗER0މCwơå*`k 1 +V ojϊ&Rgb=K#L6LZ]mZqz~vÛ㪔^//1 |X"apc,jTEqu\%~$ָJ|s$ 0ZQ.$&2#.1n}-*BN*[(̛"WWݍ 8 !\ILtBS>.:Eࡘ[ vX&wgw"qC:'Q|Ϫ|9~9NOŪX<9Z4|^i_ endstream endobj 2220 0 obj <>stream +0 H@&V H,~6S~Tk +^R_t.6(;#wM)͏Qsgv눏jd:c":x4=-=,?"WZ<괿PmXRTkqFinI%1_m7~QbWV2Yx^ۧoyw_Qvfgڨ$\  3 Hz>` +MdUKFʸ?y``Z(|sFȶ8eF`,O}#ʞ6<71b/z `N5LfHR;-5W: +ws}sze0ʓl'3OeBa 𿎄JMD|Sa`bgnT`f Hf1ꘪJR1+ NRxKT5>o\Ӻ=vnYza%_[lHit4Bidž,m^$SjH6ߒ竚 ;U8G$%yڟJ*lE~J~@V4| VQWIۍa|p|lLCk=|어ݡ )vϬ nsGS%/| 7?\U<$U,n6&Qf+exwx_ՔݖL1mK.cVAˌR5r| +QJeUxؑ$l=Kz$vلUs+4it0bG@@~9^Sh7Ef_(>$~(G-d2] +"IlX'utL;>X+_x֠fpz?lWңjdwiyB kDOL_^&9;| m0.Q2xp]BG/OQbx4FW";,dh`FTʧmG450D'qD6ސ cb7Š,WI3"bqˇ9*],C;0vp&ii3/VqSM.ұyMzu-0hڿo%#U1*L@Z1_3L(q|m^U . b|L̿A`a= h3SDO0Qe*~Bs45G,wA}uG9B _`s> 꺑E8t6RrIO܊-D۬,ßG5C.B^vmĴCUqx~(c.z17sHKmł.8W@`lEȂ3Ǎ̑>̣HOzL%C;WڏV5- 9|0Wv7Y\`_Q&jy* +nw3!fp_ +uz!@`bzDH,ՒBL~~[tuHB٪pR%w>1nKFq+2Ձj6Onw$(~t(Sۉ߫ydU~ͺj{OS?yQ`*9,xq+{Bmb;7r-gBYP:Xv}`>WL rZ9dbcM<۾Mg5ɗ&x.4,HsU-0鳯MwaפoL8L6ob"9ɒZ ¦KlH1ӹm| z z.)Sr^>4Bڇ BO{"zXzYDoT>Ghe~k= ˁE60ثc(hﳜdx-K_%I-y=dUp̓*|HP)5gtMuo=K$rF+ D1+HZT9r) R#&I6mH6 +3eOOܘ%yyA7O +r,6ȫۙv#G9/Dn [9*W3 xWӄ>|]d[-}D=MVrH<}$lk;PwI(Eg Q4÷PO:$3kUzm[C@Lu ~f輌ݛAWfYGsM:Gkss(H-Ivpaqƛid8DyLX 8{P"%!hxh+Sp/"RV6-=8|dNz39s Q:g'=@![-_y9 j[6{n )ݘ-?p"Rnxl35IYP[:Y)gѠ1"U^}@9bL?WZ rg_>z4:yk[Y.rel8k cYwk$WcïEnl=y`5o@eNEMMEpVd@A4H}IĵeZl` ]8Er4Ѯ=s)wqqu-so*XX~3|\}|:FLQPGWMi.ި⢨1^s&ƿ3S"SP,gܷS!E Cse$ɷ9ڎB P?REzq*+" 앻h"YI 3tzB/0>n'Ƅ#ރj8۴uzlIt/6X}Я,,/aƀ kɎ'}ջ08ѯɏMX"( T=%BL\%@_DiC%5s\.CQӼɜ"BTX9= m^=M@V&yo(;c8/q), JGK.S |?eG^־= Qur1lCȲÈ4K"+qb +S<\>@VU@;c{:M9Aߙ w4Ѡ3GvY AF<پBTX3[fVC{Ŷ"-*;j Dr瞗rXRղY 6 +99JNBQG9!6 jtF~k^5|Tj;4.e<nCzŨ2F nL|Y9bny$lp6=9 >&=o0t'5~Y\E! Q!Z%G(-Ѽ`1fXU&DW +|y=OҦΎ7&VR11W!ݵ tn(&[g?8oR}HȱfQȫT)ayf[,ދZ&v_Py>jrNil{;훼U|ԍ"/83^18fy_P H 4Okjcx=cmbgŰ$d/F]׏Ϝs/iAFva]@σW@\^=} 1yY pHw=cph)bfEm-f[Y#Pw 1(DM ΐ6fCPa`|C%%y~sIu=Jf;="픞3|:3 J0)H/Uy +/cUd1a''t0pNUG9brnE@j9!Vk~(  +]9OC})PR5m۪zzڕX$CH +˄#N+O9rLe󕪲 b1Csl+gD7؛,tgk})-JBK{8㗪"Uj! `<տѺƂNnlAc-{𧸉LڷY +D[{`q$';5Yj<^m|SZn@湯\ Zn5HPtݢ3fPLe+NL&aQ1ҝbaa~7t@XI+/EC-+tY< ;ې=~^PV%ojqH=q1@qcK&LƩ%(VԜ\bFʍ }ݲ7K)ܾ`j4۱нXh +-qo>$v\"#\\A$tAN*DJ.31qTyUv| :&`{}?e#PGcm1Pg!!xYRS%w9QT[|{ s*\ZPd ;jSA(P}򺯋 KD@!5rwxI ZtL|ڃxlc:S`~PcN^1;s\}˪{Ødhhl"r,gfzÒQB- C/(79i\×m㠸. 4t>*tsM/N^;傸dH.Jo^g;Т_-$nC 2y7aAC)?~Qjuy5@eZ)R)RW"Mϕ8v&pV 2J)aDŽ2+)_i]lvs.4Ki`Eǣ܆d/=Ky=?ALczL#(h93m =/t|1 +d;!K;v,r>JWpVX9ݘt6*Xa|RKAn`4p?cM*$s;wMK]Bo3puuW}WRɊ) +21`Ob^[SȍF*H8u.ts +d⤛k3#܇I(єJ!}֦h&K}by:|0 +YRKG}4W3O+?v +oMk;w'-&,z5kٓB`$͌q& +4N"DB(%L ^v>}%Nlsg=(CY#-C #y7"_{K"f$t$-\ 'V[qm GTK~_-~z.(dme¼ҩX|H79.Nq]Dndy>H*KZ]AW1+3yX`bŸ"p Ny)}0@0bڋܕ?s2$bLS!TEGƈ"j;=8UY#=ޢ?? 4j'D&};PŽ8w/8j~2G$Zyd]4Q-/Ex/4ǚK㱠zVR <($c2!VGx"(! oE!Fgi i ob: D݃.'^rTUs;ǡ2w;pR~ +EUGU OSdte@:U^ЩМ;F?OGE%EգHGh/GM_d3DɍqD;A; ҙ4~on݆"w C0CRNH⨺> 4ny'3‚FL-eMy/P\uǸӠi nT˻|*y.#1\)%zL}5 (Aj p,jĐd[ L3=1j@\,岍?T +FN::gj0_f Lz:]¥8CUH5޿m{U<ֺ27+)Y˘*jTOk; ehq1O`z O9.0& +[(a0mB>v),; +)uny`eۥuA/q;r@ֻhb24^ڿUM!ÜUAb1.I$/Hh-G'J-,cN-cn;wђb=f^h.!{hCme Wjвw1}X`ܝڹv9J>K̆.o#H KLtJĦgw#|Rķ=Ǧ96L)9C3FT |ˋlW|+5gZM#&D? +`5B#ߋ"Þ*q7R$&o +$1&Q!qm[]mi-pTcԯPgdT_@:^bUE[RрĪFׄ?[uwEvc1־NޛɀϠo nD׶Qc&(A3t!g;3,f鍻׬=vP-'! )(Բ̜"'oKUV YmP 2R"HZqN65+BeAȓvw膃9MR+p)J'Lrh5agP-6NQ`[c.' +2D ,W +_c A] nXm!63f0{sn#pVm cv;S^(=gىfrh-` &UT[v[# t>N0.`wH\wl&$|m :Geg]Xr6-EPuTdYʏdݭs0еT6痞} rY%+Hv3r +=Paf4)zK!gdy/,3td_ vf"!%ٙ5Ӓ\ݲ5>EB->N't{{@E>Vr.Z?J^P6Fz sjDWg,?2J>%M5ɜẗ],m2^t= 2ׇ*$[ؠ,5` ]i% +*l5SEi[脼T 烕;/*$lٳ\Pe$щu_w:bN *[Y b˵}Dz^G{9+̰u#NxH$O#hUpʜx%;<]m҅ dSfj;ݪ*7/c8Jcڵ/Mg] *Mz)$޳Mۍ>g)[;+55L=L$+?hP.-ʍSi-fxK`},jnr!@FWHpyVB,ri ('5ov{DU~Gvz8]Ʈe =%te6֖Yڊ4bNoǦm}TƇ:}sID01-Iڡ$Lֱ`=ґUzw\>: 5 z&섂 db dکn0|h.+<ljDAG`yr(Qh$BaVS-8]!W*RTLmSnlaQq%f 5- (^ `84SeIU%D{~2,+>7.KK!+:dƇBY^fP#ʫ+p 0yZ؞J6yV¦2:▟ K:֚5di¹!ntePގx:E ϒ3`K+{$7&_4Ie3JؤE%3XwA:Rwl:EV_scYa7as|$XU<=ɸWTEV%_E4޻̕J. I]3TQ"Ȗ\sCR{!lS19ʆO^ScWȴK{t<yi!*gbG<sn6/gA;D~dަK,+%"2{`+uBx4?Kf?7 *xn#]"}ޭkoM\&^/fsjzۅi73@0~9k}9SJF[@u6Z:O=#A#Rn}$<$^<(Ќr_hy|a+Rژ?ޏVI}mJ x1,@m*Fj'x~8+Gl#] ??,h.PPVjzMy?NAZf"X7a?k{,ߐ(X[@*AZs=/{8>g&D斑2l`i]\]"{J_G.\rUoR\/&ffPQz} "{;`g #Mjw;/zN M; 9FlGL/X0zFU{N+r>+.Z3\IWǕl*i{NEl%;ܜs*!8WY&JKs ?y"Rk& -wK Vܚ,Nt <%7VVW)ڧKR9 pfpAg:])L>~t_2Nkt~V@[0eK;F( +LOU EzL\!E'1WQH$B#^A/jS%++_fSh3jsm8 3wM:Ư#?)X"hgxC0t3Q R(S*XpC:Y.i%X.gh?] +@eũbK31j'ngA/fH#8~A;9e;pV%|Fk^*į\.TX_!v)ZXL\漒ai++;T#nS1MWAF |gT S|l5B-ڪ`IxA /kc\jwYZ!=/)AS]DoKXNO`-M1ErV7_\@2*|n]P-*eG?'\+H Y f< HBDILȄkw $_hf[{3htxT85KzcR | +caċl:Śtt$@H)CM +<oO&77I2pPDObhǡX-7OF~ץpIpe߯-)KE9l&B$u*3}T&jPCmcY%cDRϵ7xX/=QE~\>b:;adYerCK# +6#~wEq(>k7*!1Q W6]Cf0\k"i;=<\XyۣҀݭ8z~1gQhUW~Xq]LtrY} |Ld[>k;H;`e@NFeN-ꁯ&(-JVF{#t*g/7NÃlWaN]e[LyKyj\i pwҶ +$)?֖+&W'D%[)-=G.L%?;eUzn)(MAꇰc_7^f명'3]W+Bݖ=60pM-Kgg7 D{1~m5Q1b +&ӅFoȣweQk8doyv?UͲFq?w)ʽ˫yMDhQq$Qz| 5JJp`wP1H$Wgr`F8V1- +k1Ր#l1w Vdڎs.(5\ J d)`X7=V.jppG;:2AƸwSZ3pM~mnz`V"2bݭaB@CXb(r"juW~~^WMWB*|*<| [1d3e4 S~pdȺΊe{?+R(m\ YdB9؞2Vw1GjӴ)b-&C!ظ0Մ,k~76S+d-fWy wNvl =U*_9? +a]=HF~2; +ɂ4A^#{tYTL^Ebn*UQL+MmD6m}9(2\~%KYXF$;) >{]$j `Jedqq2awE?CEc\rTGVsFz.7D +9ʉ6uOEI7G \ϛ(b.ΠOoXת&PrF6d#`w %o?@OAPWXgbLjTե5 c9j]oyj#f3xY\5q <ůydv&y 'H#QP9NwYT͢ [ Kb8yZu6iT2)ojNhsRY rt]|5| QKbaپ,.vl͕ņL2(ӹMڕ CA$3„Ni֍2{ X0oQaqͮ bpoaUyVڿ/`aXSjH? qD88|a{Qg]rp~߸1vbtpE`rȑ^U;^2qeݟjVv:dhk ohFAnh_aƒozm{Eg[,(ӌ}MxgqQaIa6փ*?fh|y/;ΐ!5K.uݼT0û+*]ߖo34p\ |c1Y!Q`ſ=Ԓ {+&Zv`7U9QBpGSkR`M8/FV#W?U ϨRШ?z0 +!.,tvXe}sMti9^`ħۢ-Q{ߖoqXoLykD )e&ۙ:d̈/vb2d;f.hZŖ,.'r$k?񭮽k }LX+^ +p`u.cw; Z|tF"E\2Z׌JYVH14SyR@RlU:͸_`؈?h: / K^Չ((5\̄E?#!dWPZ~+:סR1Cevl[e0(p̞!x @ v*jya& |xaAL,`〬 &C?tC| (fN2zmJby\Ltld+״t{s}R}wĸiқ=mRyRb§][=8Oԫ|#^?Ppd\HdjҀZF%o"=HAF|]O7>1Rs-dgEk_Zzk@f,T?vL/r^s&<ޣ~WļHed e%DF!`o8o|q)b$SW $s"`"lK${vܑ <xnM4幹NꠇRV8lN癘r;- +kg1h)U +߬۬#EY9$-eGKw'=2sQ,h X$|u 3q T<| ‘`-qLڡ!xC.#j\Pv@s.V]RO1br>cN8)G +:bDRkR1y+VB*te(TSA7a(?~7'bv8_O98yH'W<.HcD4} !!z' +bF +/%`M\~V〈C[ +.q%fh& $%ǑSC#-4d24yD;Pm g ]/6Sorظj]='nt+!7V"rue_b?-i(>x{ْx) +!2pQQd2ؐ +pM [Izq;W7x󣎩mwI HS:*t2pB]09_=1ǴLj na#ҞQt|'ϓEC42qbKky跆0RC +Q^/h {WUe,M/}n $ 먳][AwEޫ.=gWCM۾ - Z Xo5%rqb"x[Tef"M[ҙtQ?1>_}G3 bW90r`QGǬY1ɳ dždD_Ԡcַ1xc#›{S J)'(@7.\X]Wcs4"0v:q\Qtԛ˚r#Do^)9Oa3B4UbiL+y{ּPI 3ya[)a?մDWе8:"dG(>Xh^Ja>vyB TwFnXZ9ڵ")^</x>vkiNEuw>;3XEa5P1( ]!m}߹hu Fa#x̉7ޢ7A+a: =!'~fDPfΕ({cf?C`]A[o,~ekȲśK&Ѽ/_>{|fkd#vFCy8/ };lS, " +bى1 S"\4~ RPꈸNA=xQG$= Ss#Cc$:v3ލ'krfGdY,RlE~H+1sᐒ4UuYrqrw(@OaȷDQS-X̕ + Wz!Uep|Ń |w?AoB_ n= jNɓ#Vݑ3KO4YFI'N'pꥡ}MJ{GSͼ=G N3§.i2mՏUϼ +zmoTkwˆ:jN}ƣ-ײeھ k=~U~z=CBF;6t{MObSڲU{r_bXt)gOb8N KLhISI|;ǻh>{VŝA^n{+;*boJ0 Х|5 +woM>_s qjckJ +7DW +Fr*d -ZM[RD9vyrvlv*/$K{@f S1PFFg`HiT8MA,G˖(.¥v@ҧ_W1E]϶ق27RmmTޟQ6坋I<{S8`)ު_q :}ӗ >qmɀ$q.xזlxm\_[ or-}3V"k]g$=+3O 5 m)SR@U1v*Ahrp_}i2)`E͓ H /@)͞崢ftC_DQ\+SntNM9XOX0vZQPo'QM0>Cag< Q(酇 T]9Ȣ99^-+7Nz4g7Ca14?S7#2X'M8~R l䞜Ŋ}X1`oy@%6\5z#v)tZTfFmDiʂ"{Vcܾ$>c3t7?g.JA9EfCRݿ9_pJavjE$-cHZZJxsD{N$Ľ251<01p=S>_P' ~@=hwmhp?g3SRt(NFۻ;,%$Q]҆`^ +#P:[t;?.l({@:*N;_KtEDcRrLoF8i1=M +(˅Bu'm+S 0x1a5K̇,5cgRsބdфG拥D ޼n11k\!O}p H/@[.̐w̗Wl`u |kvxM{5 _v$J ŭ7Ė_-NY8kom:&c*J;8z(wTh$+G  endstream endobj 2218 0 obj <> endobj 2219 0 obj <> endobj 2211 0 obj <>stream +HWn[}'2 2ޗd0hqF%"F$f$RL껉dAUU}ԩ/#2hƉOj_ݏޞzqe-ǛEj ǣ/cVbc.c%,1҇{? Mᐏ;̮GP*xv5f4u4. c%!.܏ttٿG*aqxޟ? o c!sՕ1;Ȼ2qrpl\@41a$iRY8jwrq<]m6бʶhdX+hv|M(P| +#PBh~@=@OOΞ $(a}?~~sѸpu P)_—hQ;H>Y<^mz -A1q ' =kCYJrj?UMCa]$%;#l'yizvTUH7ř|PZD"DtZ'+T_󁹔-y-(]?E\ցJՄ/ucS+^höv<`XCjąz/3eUF)#HPI'ϕL4`1<_}S1#OEknTP VK +X^% +KXD\[FeÇEOH_jliG\8 + -kYaDиVy-dkextnry/ F8sgXfK|/V.wyZ]*TS9;\>"e895LU=;0t1ۅ< ƴƪd@b2묘p/NT +č"MQʮ.* }Aַ 9 @kwj[7JeϪ9d58,qiR`mܫQiegvדWqb6Nf6^pF/OgOÑ + P*6Yv?ιBm"yٓPP!e~l"ǫ>cח_UK +O}Om$ ()||IF_dhj y*QPqj]uO,l$P]f0=&Eʜm&#@m|iuH4qG )Px w24vUE(5WW.fG~,|8-6:m PcL6j8RT{/ڭfjJ;*#(ƂT4'e]Zg2ޱp2Y\C_i4i(:z}QFt3֖z cqo(^Ӑ8Ў!2X8hh@<Ҷ"6wGXR.Hȋ|̓H(@Bn@ F2PY_GyTyVN?/;ir-LNѝC'-UDxa&%;ԺĺH6>hPrduX=uP mg|ay98jLZ0 oYe~}s yRFHfʤef.cb4l)aAzas? "Cy)+~Yo~K ,]E1/ӄ 2{.U9{DHsm&TbʤKU͗!L510ufØRׅi~ŗ:zZa:)q+8PSPU~}u@%߇`jDd(DӃPdֲa֋j>xb)L-y(~ΩP!vTB"e4as2|Zu*-RZIΚ٪Kӫ.юj#ӝMip5j9-!Q8(ZǛ΃]D,+k#WoDCֆfs7Q^U͛ v$ǥ1"6`jR|mwed;Die j@w L$P3Ř+79P/{I(Гш~$T`D +WzmauZqWn(Ǯso~h$4-I X}L9du>MXGqOG/@_8~MwaDds"\YR{ &2de}sv}ΌH[dcv\-%&6 zaZalT+lҐ$lqǥ`W堶 Y Lpp:P4?2`XDSR$2Є./ۺ kR  V"PPݬbIRDdy;̯MwK ˒7TƍX˅Dځ"Xet^o`Y.xS.p5Z;J,A6ۿ2QZ)c8̄&8fW4e_ji#?rvF +P"-9/)g+0nOȖ8+ +8 + qDk)1(rG"4]h=짭 p3O<e2%ն@i[cp(8I(r/ &Ǵ&%Q6r_VK If 5%qax-$v"='ubn I&+/6w&ہR@*xSX0Ł"V }k8X5`Q(gp)0 a0i*SPPgRuԑPq9z4>ʵ<9gJfx'bwKSCb4vUd^#ާ)@I^qg: PЅ,9|T;BG8Hd,I8pj:Ōvn\&G?qC N0q=;fs TJEl:L/Q 1 endstream endobj 2216 0 obj <>stream +0 M@&^4 M"-5k;@^TDf{ +/S a+.[/ė;j]|E q70_V]f;'-ˉMK п{۵R^1uFH`*\\MDy|%30DYv>Bk +\Pъ/Ҙ=P[#M1P$l1,oiPp[Y_vvC`b’y^C?@l &msų)HV_Ju8j&ٻd(IAruUiC z vf7/ɲj`vy!}wb'8_&H"B>i8LHd9GU4\.ͺ!+/aYB#\1{xV>X@*CGgHTbvt=(1X`e^і#.) cJ +IAҰqGcj]w߻ɡ{u`A J>pQ$q:sJ#.C eD#v80/.cP0 +*HPlFeۜ4!ْb;<|z4&4I8+7#H?#+(,`J~mKBD>gwn}H8s7@x.kɻJwKZw ':t6/t&].QsTSm6;fÍ|I |5/ւHG_HeCp9V9mQޭn{IU*4H"lB鯪8_r%*?cz9mfb/8lrؿ1"τg{ez\=p"r yXTj죦th> +Se""/ϣK1rcOYeɫſ֮j}B@LϲyUW%|0C+aY*?/˞8wO[:>q{@OD& <-@gw׭m߳` :*ɟ X +zj%( zW`,hDD!Q8F&=iLӵ1W {]wHKgG0a.c?bP~ݏ9&dW +j響e{j)-D^rx lpjߎ~qcVjFU"mK UʀC,URQ)Pa_xOifa·Yzj;ۘ{UH>౔C KC}ps +Yug8ycٶS&?&6/䭬)Z&˪[iA&y4w)a}Ng>i'GhYċ?t +ȟ̷}ΡjNZ%A˱@㤹\t_{ 1ø[GPc<;JvbOYFܾ=bIXNV4pUDfV>i[2oE~f߬)j%ع#lrOGƋ>NoPtݲvYG6M.J4 gڦtӗ*,t sA&I\MD!=7sx:]rOQ_< 52O(#H'$^Rmjhh2 * "ϐr}H_ts?}y ыb=E!z##r৔dM>QalVxq yYDoD z!Ү-s>~X޽T2ipz!T3? }RWHL>l~ BRCsx+^J{"S6pI7N7G{C{VJQwNSa5 <^S(~߯*d@뵡؎ +w̓4Gq^|W?tv M E3߆Vq3A_nO.O.fCL8^Nб:NhIr#?e`H" Q3BQecd2w}0] qF.5M׳ :DklCC-F{jDWڴCJ^QzRpL#dB|k|ʀs5qLZ R?e'|$QeEe/ 6y&lO;7ѩJt\yL7*y) +;1Y;^P9:S]IN6*H0m8@ F03h4iWBǣI46xÎ.>4Beri1&]è7YPUV`ڡ7zc fC,: db@9*FA5 }>3/:z羍H&`*?-arzR5t>mfwOhL2N\P`4C:-}O/Nw|4~1<~s LhZc_c0LLs*PT@”2s]:5.7mȜU@'쭋 \0XɏEVlfv@KFNB넎D 7$5r%.E5ܺZ<~Kjzvz\DoJ@0wʺ .ʭϔQ룬g 7=w%giޤ~fU]m`m;iZ%']3osڥZ{Χ[s;',Mf%KP)m|wԇ.U5S,<_9T7BA+/;HXk/prU9\C?]w,oPE]Yۆ+xw?ryi nQ9sx$#Cw{$ +2YV'WюnC|򥪀 5_NUq1(=U-hֳI6MMo1eq 6bN>bxwB҂*?oFzy=Y )5=jo]4j:z]!=_XݽXؤQ bA)_cz(Y;1n>:BdJ[0i/]0D%³ugڏKYu6 ?XC2f'Lun0FUba<,~RKP tL`="i gCvR!* .;8 ᦀgůŌ7 v[ wEŊlDi!_9~&1x/X4jOr8Eo)kSV.Iu܄&fp 0ڴp +UĽVUn Tĺ)mv&r)'C{b'72_7f9q-wS!SG2+ F (ќqci:\8:viWqrR(aj>{mK`?jerp)V Pݽm2m@yyaS(pw .Ri0'3s(&1xo-vՖZn=gc(ȑX bW-.(5<4|uפ5a<*dPܴ + DŹ3sXt J VNcAODgt}T>qF90vӼ9@BUX:unH^bJS0N%6(3c3}V=³195po18e_mwZO+G%kЍF#ՙONCLMVA&G]p)f8.YP}}HpB w +Y}mťzz5VXΏdCa%1MgDVzDUmފ juOI0|ʺɋȌ*)bM&A@5J23s-@\#)"E6^uq5t\xG&oSYſse(@RϷ.F6g/V t7Kpo׮&Т źbDtuzw@"$d1x޼֜db/rV^`槀T*UtH*7` {! +Á:ua$^9J6"qkjJA` ^u<P_''oN@~hi&ް g{g'dvɄ[*"iqYO#YIw;$^Y<ڣDpR[Hͻ^zB:g]< /Fٗ E'$&S{si> Yg1`wttЫ"~Ht4CTQ[R.ng'I1ԍ<\ȂKg.ڝk=0Fa>Hf +Iva euJa]!vVވ$=}18{seH54} ޱؙRZH+0bSU0NaEv:TjaIGJ0 +"ߑv{XLz״%[M;\ +̼ =6"eL q ھ)uuAnSp&{NIW=튾lb+9j"w$ms~gBIc`O:Vd7u +PcLF֌p [DM0/2g[zEfX20LvO԰PQ:ծ=?\-S9l|}&^PL=>OX?s-˺ul'ZbiI=6R@ tpv1xN=WN uhȋ`S&+~?0%naPlY*Qi-raȶuQt.fH/~8dkI;J&qOۥK3I{ZVN'W8mBFmL&"iAVeFlvRXav`-_OI LօE5@`H_+ ^ >|+ʞ-omT`ecjX-q7y<$ABd="SM*(~ +}<6EogI2JQ iepB/fd/+qx1DeӏKJqT}k@/1[T{QB#+=":OZ/4@Go-lń"[Mk#$z/Ǜ$.T{J|ePl7QrEy.R0.J=ގ̰%P}B~hVȊ l~ +5ġlLz}E+.u1zaT$FT[ j* 0ge4UKطp|[{|ڽuC#Xzmx.^~&tB58f0dk'}Qɿ}|\N ˀ'JʆH j"a%"֢&u wx2=O_},Bx /IqV]0 d) & U4 +A詀H6FSWlfRܜm&RDX/qW0tP.''p@o[7 !E2%XT=ϻyOb( + A;b&ȧ9Q];#c&\ +Nч:4L~'P3w\u.POnqW~ Vw6iN]l?k͔@uD\r%xG6U8Hn+$E ƶ츉3Fr#;OQ9T{/; eH y8R偳-蜒ߩd'EE"'ªuy" +/1m[0y&2Rer]JWWO7e‘Va +]nBfwf<m-1/}ncY [H_v.HVmrZ҂>8 ]&>:5N4_b֑N{~TXT2C#V4PRw$q"=,R@jZYfP|ttuVeLܭQǜ軻 C$3vzsw:o`r'ƺܱ I>dlLjFxiy$̐;62揃wR!hӝ̹5plUcY~He☇k/3(?U(^Z`' w +). ߀JKϧZDh;,A9H4%H5_:g+e|S}U>^lSQ@OA=}I7'/&1Bo\LvV!iRZo޹B&ZϞ#8>V͑x#f ݵÄ{|ǒ =jS!+IoE81zD.BЅ|xV N.H^vC2Xs#ܼE oI>Rq2-)!xxpt16q<629iN lQhs#øΪK1S5HiKȚ A[#'UÙǮ$X6(JKmwևQ*'䘡j:*zM IT^bo٬BMHu[E9C%ңb`!~FZC^"(H J^aF\wA}T Ots>3*)CRiz@_49ze"Ϋ0ӸǬч.!íJf7<_JDE,S,;a˥R-(k6%.7>|76/_ wkҀ9)"KȬ[?7K J'!}>嶶.p*tzZ\yZ.8pe+Q)|rɴ<jfFzƥH KI!sB?̖ jo|pn\Yӂ]ґϰdشTYqJY+KwUQrfy }6MqbeUP'A4 +0%U ߂88=*԰ KC,n;^7~\S_=9ںJs]2b'r5L3W QCQûPmc1hsfp-a}f loSMZ"+_HyXݟʩoJ2mVe#"y !;0+'= aׂ"Pd:j2ΉV /H7}x-mN$9^AL"*woWiu/V@a-PdieH#"~lTc_hҏ N Y +,FQMivfMRdf}e7sɗ "ļؚFI2V:QBV[ؒ_:q`Ξ!#; (bRaٷ8V +vy?)V"mE9~LP˰GE,o1_KC&5A|9Sc /,K (JʶQ ε*kqCQ:$6S;}C*5+H,KܱtsSTw<{;AHmRWSCɣ 4>ŔpQ0Rsk4o5!1cBHIh~7RLg hx(AKD@~_Ј^4E]6;vٞwHܽKȵra{bM+`p MV9e`,@gRbN+OUQ71VytɅ}IfCa&UVWw;+]lBIQfKM溆Bq%H]6j +T̓Aw&ѻ0 m3C`d1p_:Q[[@Ը\T(Z?tKо4KuڱDXD3'=u2U5qz"=3qTtg~%l T.zsARkz(!l-{zU'.G2p~*pk `5H@XRS'Rk]o_i6,*ӢB؏ݥRWƚAVHeva bՋW +wd(* ;8--!'PKyLUUQko9 +UygLetPڒ +M ~wN! 8dS,?؄CO(Xn]7⿼UNJq@*O-U&5!:+D"́jA^=j ~q{Ï:RG/#(r[pIMvD9]>wiW.k4z/=EdR0x!*͑?RdCK#&y}K|t%sR}4Jr񇎂n,l$IҠk,AQTD{4Ͳo:Tk+9yZ-ED NJ); 4jRh\Cg-o[,BFBe| ~Y'iur>sUsUYSɫU1o-1 ݎ{$oJs`Iģ|.c[3|,9  ^'Q#{HcK8@#\Oܖ;OynM&~qtC8'6B$ТVSײdnI3%A'l ?G3B؈&WAyMS8gA9BDXvj[=Jqgs H# 7b> 1qY'jBg·l5ٖ`߬[k@T2hз}ٟl& 2*+ jNV7HcpU}Rax%lRЇґ/8bzQOY#Y[^I~k.*RsX?[0+ÂgՓ#3S^ɮL3L5En2wYiE1ֈLI\}z \JK^P<^蒓1"7ŽD8n.j@_Ly\30YU8'{зuSkR@^ +)8ㅏg؀l8܂3Y|ŞUh-e +rG8X,՞-[:"Z8Rw#/nJSTb|'1h=h#+C_|4a+!ܒOnR'NI$/1.^fY4#'/IdHd{ #-c8gJE{5,tyjwI訤]bZXRM˺fHWc^:Y:um2לOVCASNq`Je85nJ8mHV +`vrytM!8^؝<Ҭj əlre ^r迖y?@s(V̌F7QAK i+)+v'A$pb ,0&ژO䐹-fĿP1(cG/ U>煪=iJBeSf +- #?c;wi]wn®d+˘ Ip R28԰ud/]lgNn*PZ7nǭ>CGӱGϳ҉π8e%(ˁ^Hr - Kwং̔*R^RᦼOM'ơW2\ɴN{\ '(XN+^Y3$ q*~H>G u*:9rw!Y%ݏj*WnWK8>S)]iJF-E~ۥY6w=,SxB hg.t*zHu&SM 0z-+zDHi /V_"iP[נ /4d+O#jw׹" fxh癪]! b(wʝ/~h&AԀYU1b'j(v$·P(@%a()T&_‰-(h4y0EA.~b^վ֬a[#{6}d_?^?R xG"3y~wʠ.螹 5n="ɣQlHMR O%L̈́;+x-5 mRkTVk5xxoM>hgL21"S<ocKN2\][*&Mnwj{&:% H~!8Đĩ3 >07k.dd7:Z+Au +v1ni_3羔=wf')!8#:siތ~[\dbH< ;t٠s#7ojЧW/VRU9u3٤&$%odX ckѼ5T "(W/ӹfrzs\1f9K,Wӊ1j{ořڣnppI||,_:3w0DgrRp*PiL92F ^^iTtAMRGgsmNd~ЬB 8>=( s2%QV&}ZhpFiwqSU/ +:U˪|I]-Zs= f,ݜ}1I\k#rP,edZooA3vl΋jF$ R|횈)'t>Q\!Fne2[)xT K3l-c%rz|zP;b`ݦJ +Pň$D>CG߹|/:|21kdxNjHvW&9wWAZiCh8Ʉ+g7<7$[!Ve9fڟjݬ= 0).m)D_7 kDhzN}YǎC%3rz"Uzy +⶚}O![ _[)\/(d@TxL]R iŊ,@B][S,_Ws@jr-~/+,,}:\[ }<%ؐ*2PpJMG=&$Pc.i}M#i };Izv~WPu5[MjqVVS8au"?I뚮W^!i9 lS /p35m!cj>L 6G(4Z *#tSfpz$)z^ >t3q)~ysQTEaDIO_zmϡ(B/íR,ǀH'[XAqGb!^yH~6W=B%9rc7P.d +aHD Z6`y(Gc 8+7L3j*z P!'.BtQRHts/#|<3)IMR*x1#,mxh*O!>yս&"3"on!'?\{_(9S\FfţQe"ُ>kVmL;+X\5t,nLgHhe5eëĽ "3[\?z?EMneImX4׉BtqA]oj\]Ft>&KZ^l].j, mi$3-FJ3_hW?+j;- +B(?桀`P8bSTA|a{s@nml<{\@Hd#hU;x"$1OxU؎d~ ks@Y0V846{N|<9{JӜ~4Vd{ddz'!S ߌAr YSqp}UI`-+tS}+T6韉B}i߿|>\d57ieؽ8{Sʠ;}Y+ŀwI &rdr1|3Q'! +ifl2﹗MM|#cΠ=$Cyԛ|G.lpR&6ف|w}Z%[?K^ Ϗ kZ4;κҳԳpU[=Sv6۳CsN-M Iq#U +Ԡ +`8z鱋vSN W4| P+FE +l88kRJfN{5B'QWx 'x|_<[<[Wц$N8P,w{TDƴkNm9I7]m]&'i='1NE:e:CW<4eDzpx2<}C *vqB16 +i鈜w=?bQ( f8;:xt h~ޮd!mxZ7^8ZD_}cR,ŏ9j𡯐HjP^_A2zQmv'VӅ%l7nkyЗFs]RL 2!8G2L +*VlҝLfET[գpIY%.Z58H\GNII°Myy@48Srn\sb@>_M9t3_3ENۛUg?G6չF!%5J g0 ;zWݗt[4/bP`c'yJ\CN˫)W}Fx|E* X Џs/$u 2"&ّ^Y`.Tŀ)zCI!p.K';P ]<˕,Gmkb!{@ +ErvU_`ɶ;= 2WBZ|d[7#\v#īPJ68\699u'TEUړ=VIFf_51#'_[(>|n!V +8qtg/i1F hTVƒŬ>bJKxϕ* +2?$әykkj/}Hs+˵M+8g4 +TVfLT>&tguKM,t7VeWTfAQF@k:d]!4Nrskf_8&0\VdB\p`3KWlA[|K=@t ˝`d_иa% !y#g=/:|KZ,0C!P3D1d|j5:4V~Ϩo.pxws%'8l9N2_&yl}2l>0 KHrz@u<:Nׂ*+6n ? !^.+dz> 1Jַ*zhqjȴviU/q$)Šɝzljq R,$yNf[uBr(8Ns`zQw˹eOnGcM`gaHURRmZ1C{2y$;'B?>HT5K֝@}dg)!l}6B#C2{[S1} ܷXv$A=iUYI.%|I/OgoRįl}i`J*gbZ1Daٻm܄sRm ~+[t`/GJQ|J cͽr H`YFP!|TgoVPmԌ ƠF)( 2+/5`K׳q6dեLT6#;t]=XjĠ@љ!uh1Z-6Sp),ЩH5!51dy :k-iKQ]-K/Gx.DCW#Sٗ*CZq[ST9yЭw)hpw\઄0M1["c)G7thvUf mީå4)̬‰$ nS%QmpwSV&'v+O$e3 +#dzkƜ'X-c^&:G)ЋUGvX#.%Ka=uݹwr=47Ѓ/lB_FV]|^CĈuD]]+cz?0Dkg9?`pү?dIn ?&f%f)Hv5]\|x*WC~u&mkML/o NzkV}f8M5r/=|M\_dC@NbA_$mMʊ*:Typ_?Z3$}!f +c8X vq7ý4;nU[}JQգoX&+Hu¬K4`(;kˏ|Rpj9;*䢙-0tR (QS ;n M&[OscCJqPhY:GjLɗe%yx̂{j;)x܏q(j߾BBIB4GCeoP^y* ycLij5i}'|"#v1ItBuC‰m"3`pa$rS^>Tfv@Qo"| +orU vozGs_>%Lpɼ2uM㌐fi%qλº~]!ˋs@/*Tfzv6΂m4V>Ӿ./ܽz-kRrXhtcfN|:WfmE7!/7f4I-TqEj3ŔKe.BzFfk!"P.60|S8ʅarMeVSGL~::n:e G,Igu5čz:]6ŊY1S7P :wH-,p$pʘQCߩ-(lW:eȶ 1!6k"G0s8_ҫ̆{V7k@_P g(qߙ"P`djW{ T`t8C~Ԇ!зc +ӾFUĽc +tJ˟[g$'v rVt^r^zWd/`XZiCް݇<63ӺŹFs1@_[>,4`aw]iw6m文_,l*1 (dms)Jun 9l{UiMQIU#B)Dz |U^>0}h)/D>zY_L$韓c R=Am_zVXZu=yh@vKp]:aw]aD~@)ި*egm͎htJ?1& wJYKQR(kq/sra3 Y#tsy`Qe +2gRI!!K{ AMר͟Mr6.Pa[X)^ձŋk?ɋaVeV,{<mba6߱ծgrj`2dl U%?n KyPLWTrzd"ԏb}mƼ +|Oٔ2$mKW wV}lbigTYX>+nfΩPb-bftՋP29^ZPOIYj8t* i;xi<0sXk`;lTHR,i^eAf=dꭢ~'޹hȇs\l;F0:N6Vj+,3D}b^!j"St86 +u?Z7rTɪҜy+pugk手)#ܴy&ֻՌMGhOq}~?bsiA_|lש~o_t".|Pf6v 䖅K*v!ֈoUձ>jf4MMJ;/gpF%x4\SAԠ0/5=7 +%gL״@#<پĨ s4&5{}bD0p\DL@A˕/ endstream endobj 2212 0 obj <> endobj 2213 0 obj <> endobj 2214 0 obj <> endobj 2215 0 obj <> endobj 2209 0 obj <>stream +H*24300040P0B3C=S3 O5Pp +00 { endstream endobj 2210 0 obj <>stream +0 @@&H @ޫ$( CLb_ endstream endobj 2203 0 obj <>stream +HN1U;x|BVM*l**޾c6E)U5όǾc*XB Y`,}k9? >Z vI06[V> &-A.E\RrWL!BtK2`GۯKTLPnNr(ؿK:M\4sWݷWKĻ_6k7'i}iaPU'!t"\zhrsD $ (ti@lTf})Qi1nQ3iYM:(T_tq7&z iRp9G;y?:\ڀxPy\:jaہʀ ɵ7UJ,#/zE^3%t6k_E0jo5(oB!0?jCm1|JlWûӄbB⥀%k8ׅSA&aFW 0-. endstream endobj 2208 0 obj <>stream +0 @@& @S$'m8,IRM ͓9~jt;-R+ÊG;!Y-̼!w*?.x*b68UT{!4pO/NLKuJB4{rL +seAزS Iϴ:؃3/N/V鈸E9MJTk5^qsj$X?˸BzN28a"~{(r%WLELJ@ E`:ݥ\d$˔Vy7D9F>L_[':J:VPKҍTivG߻K|7wN?$`MˎhH$Lg`m# oҋ_/4kyοh|ϋ$юen,S~ fAGU=&?0*Pv#W>-"#s&p1DNd15 4o6,wjB9k^>Ӌ9z _ TrH{ ;e 9KNv1#d›1cdStPb۵&~zE&G{zB4%ײ;DzIkpej6 2ڤ/9|1"~_AG2e{W3#)70&Nt#e>p+Z?h`GtH|Ge-1߶Ï.D{=;Q[/J{S"jrEq+2݆kS$73hWalw~Ҵ@!rέotݶbĕ?}0 7iyg*K;}1D5>«b:0&^e,No|8'ݼd8qor}G  Kߣ|[1lՙiQ%6'TC4g뼅DžӗQMդXSCbmEjKjWš̯uUy!J.#?Y}Q!b$:[om{j=!5ͳV+?t +1 ,} l_ xP0bq8 iS쳀 Ek{C/ Oi &:g.s`hNVUGI mI5'0_Q]:zD.6fkºu/J"vmUb9yXֺ"iC0J4zvsXx봑{˖bz4/¸*U2UOAШGOUݍ O+ ;<%ר2ѻ9Pu?k(18>hrӆ4:joSQhNl/a $ӞyvJ&[$XNU_Gs$} zO?A-y7''Öw EșT||vΆǣ7ztzcfP;~c + p=4j[@<5(*oiǣQ찳<ms89K\7C`0_9.C_goD:?| fIUo!k7koĀ~G/qlWy}%Ӻ]F^wpE38b'd`fx=IagRѕ@LjĄnc//Bʝ\rm;4̚%8:}J/g)@>p$P?fid3sԇKm!4x s;"]sVosӤ-ĵ(>˛Βl[2 Ԥ,ieucyPjbzj)bq@rTvw: mgD Wu bKC~"DѢcsK+?yIB^ۘ%*Q>tfzxQ4L3 "v0?9kszhby˜Kka羰;-lюŒIjpṴd5/6vU؟K#a4"< zKZB NLNwȗz2yxi=wjX_|:DTb0 +,i@g}c' *)(=: \QdɩzBQ9:ĥpY>z, @Ǿ!ŵV^؟oJc"K{C ݯ_ W01 gƣ c)CsB)?Ug蜼6Pv4rRwmu:*U劬߷ebCܚϾ >Qu4s8t2{D. 7I ,H"I42sQכ2af2 j)UلrSԀ(/}%=զ.?'+ ґ)sX`Hŗ +FzӲ92ٺ>oxI~83AKnZₜ~hXr@?3HId4 :#]"C`w"?NnSZ|BU`؏-W}.xDD2 69 &,VXN6p2&YzA ڊ57$xNWoOZ߲0Z͓T~I"yE]&xA܁y :(+Xlw,7-LtUV[1xMӣ8\-*P(}dzanUF N +AlO G􀖬HXj.,&wV"^e~!%wъ]dKh@jNW&HP-؃OhzsAv}ܓ +Ku1h7L-6ʞ#!tWIohѮT^ ?ٹV z(ٞH|((Y !1H'2zX8?> endobj 2205 0 obj <> endobj 2206 0 obj <> endobj 2207 0 obj <> endobj 2197 0 obj <>stream +HWMoGWpsHi  9,`1F wfh뷺磫G6,ʬzoՄRʨVhFO{ÚjpsGIZoWbnV30RkVԫo}zlŶ[}݇X&EKwp|_/4,s$7AS"WJI…wnvyuD 뻟-hEbgjp;גP˻b_TA^ |J2Wd )W})v zrO^3^O!<MAf$f lNSdq"xĮdpܨ)$@'6B+CGԔOeO87 %j?/a_ǘDr }Y6K_uES]YW J) ]ST|ƒV-ߒ w%/Q~*nɨ;8YB_}NDMߧLjj\#zNfu. 8 YB5㓝c]y bdeK֑.0@?.X~N9“ *çK&>E+-Wf$Cep 龼dWohyHJ5}Dşz\f€a]bOޥ 6|XR nrN=2 6LW촫Cڔ75:`/lOג*`$!QC*2&C*\) 34IMvC,!]8,t"CfhL 92l}Ei(?׃~SYkG꙼DS nP +UrQ$rɷWYAp.2]$*{T, HŸR0~$z +G͈p[+J +2_uʗt,b +c`z CnѲ5z= +fXoOCQd&a]`جOI `Uґo&=#!t =IlEC>c17ӐW$|),0"|`ЍP8 틼joy @7P0Omş$t(x2Qѻ%yL<36ʊJx)( bF(Dd[MFb Xtt >W0IJWhfӅe: UɌj$v|(ىk@!8 cA,ni%<ñֳ +3g\P`"MQN[ڄ9nP_T >n +lfXl8z8vśyuaY3ΧjI | ݧvi;nჴjae.ѱ32sxW]Lhxj)W.,QТ%a.4ʠ@ '~ p߾N5#Uث̜E rS4ݕ BX(#s>^/- ҍIHC\{M1JQ_pCD4'D|(Uyw54T  cLλe{U}&<7j9 {s?;U=iT2 +& ~ +qʫw]Z_<]8DkZÙ%QMO,!lNQ +g sʼn<& *Pv%\R^<6mhC2 ָe(˼X +_4P&^h*p򄆽a=ٸ @ em&J\_TKKd`&B@P[hr jWEK[$ѹQ*SI +bDشӽq IGqhTu˫wHk8é))8od `u瞆 nu%gl)tؤ`P:\)]o/\5c@Χ~l+y]ЊF\IpIUtTyn.P?U;]~ȣasSv4RK+J8^,vZ=؎;;cA5,+[DsPpc.lVt?6]|3 x h|T%3H:ԪXF#g`HW[dYp!X6wZBz, U`.~Gn# Y"GG |nAа FOQzwM(ԩj{}FEO9e /.ú/TC@r[T+/%*CQdar;^}$rgZz֭_ OQ\޶l pql[ΨH,t +(;w b=tp`h/$)K>"CIG-OCK;N#XA$`9NhWyeg[A]șx5&-Ϫ׊YXW~^7{'sUTpR}{ތȶ3Qcpލ]ӡfP;S'0 +T?,aĘ$ ʁ =C_0=M=^z.J%LߪL.|u0㵭:k8"b +"B .6nQvMD!,)Ǚ;:ߐXҤZe&LHVu$2ss3BO)J*R\~C L&&^:1ŮXXOo=K70Ym9;še#Q>?v0L;bIA|I_f?ͷgr[pzU5~Zed$Gj\k2z2JRHtc&{`b2hLRPh_qB?øB>IIڰh +v d(ZX(x߷}*n5p4O{A +0 vx}}157 +( (seq +@T[Xj.r5^녌ǥxe\a@]"!M~Y^3Ip( ӫ0};;diB-y6 + -`3XHibkR4[j%.YpCǾ{e*˭!ƙ+ShU@l8Ж%=~5"7<>i5*|96y+Aj{q+}\˵ +\;ʔvnpĝ45?@.Qc=^L~*,w-^[U?>dӏ X·yjt᜶PpSw1yy]&3Ljv͚4P|*u}<7U\w1cIW`8mp?5W*nv?"Z̪}hQP.8ޫo6>Qq^ ၥ)/L[P_j|[Nlb'Y r\KBa +]VgbƉ}[i? ɔ,mEB/_#[[/o5zz_=t9|C$*S2%7E ke&)DhBVXe_2&~PI/_ S9D c"Tp% ,FKzu.S|}:5PwQ/ +CV Il~-åۍmv|"D3d6yǡ!4D +_|c 1S`lbm l22m +H2rhtS:=&Wfb;<NwX35˚* oߛqD1j|աnWzBɴoz¦cӍu xM;fψ MОд38yv>7]TXKx!]GYa6Ϧ%\yҝqQ{ ߐ@FKr=8xZHPB]J_BܕQᶧwˑUK2.J)ceaT'PԛmzGdt!GS;%=NP.$3lU+ӸM%ͯ ׵b+ XٿPsh*Ve⇨}ZΈ%4?h*GS4|8㉄~;E'D`+:W>J*sa8/JK)&Y  +695~MZ +HƬ&.A&uhcܚ(.Gc e'8v`jxscmvy0[]`mbDl,@T/S2']il]c g>W\ȡ}lv{acRWو +HoN0>i[lIFR ^R XVQa!E_:0`|=8LKR`s6,[&{/C?L<5ϫ-zOzmC_LcZEZi,ۚ<^./E/% b<,ݪ'2L$5=DoA$`;rm$:y V}S_ +=02[NE#137r3lHrt˅)bJdm>pA.Kʬ9v͕!Œ#S9**=eIϜEN#@^ǑxP10hK9t_kz_DB`a'E~Y/ǗKk}@6v }-4*othDַ=H_hФHm]LQhz{ڴeKeEE:MCj|9V][>ӛ'2"3'ɦ0X!sAws$.7J_zjݺ8jhڃBcDk-JA{Ud jppq*ݯO.zu~6+etA xJwo}[〈¼SLQ`uE]1ŶC$zv씄h<Ht>J2H7K5^a +zŒDV*kiG~3wn)bYk{Ga[3h o`_Lqvglc6#gWRĚz@y~3ȶ +b,9C(~,BW9<#"U>vWC +&Ђl(LC0U:[)~T&2?DAE0g@Yua``ҵqLkp( 9.=O+i)G_w.Bv.MYI7~NDGeEA3[oO +,*+ʌ:'}p条.Yd_3޼4?AIƓP( K@CMZ;WRYpj[6˲(FhuR(|8}#NSH$.<5χq\?@||~\b1gB  +c2U?~$hRt2~yi֪ɐ+%h=EHrnRJӤK û9S*dYQLwl׾9_] YD(c &y黔@4aRxe4,X%R',d:ٶ>Og/X\OXlÍ ΆVZgP;nRW A?P lM5[ۯs/mU 9 qӎ6{Ӡ{`LZ5uAmeh{;F)*J +T??4h*n O?2,4;/ endstream endobj 2202 0 obj <>stream +0 @@&Y @>Ih _7RPP #QWw! 3d]P{ K9Nw +̃6')? a(@ up{ A6X7 Ul5rw6nI #(jDƘѢZ\ A!+x! *E L$[/ P! +|ƞj%/jWdF-nuRGfRlv'/G2&:ncZ6ʙms8JYToh /JJJhVqj٤\03M 5pxw=u^ Mx UB@& +zFW!ВPhi27%6pF5bk.hBJwܱ> #wЂ0{ꭨ@GOa4S!wru4"~mXd%My7:5fz}[?isk~޶"FvKEӘI8.UrRSdEA#D9Yg?&]#O! ĩ:\:s[K#5\MpxDڐQFtw_0dSV3]}D#!ai[K!~D>.Y[ʟ9,R沓!şHۯRʙqԞhe JCGm0zF~ѐ2R iɍ>W%˦ q}Idm5ĐguZ +)Wc xK?s!Rped@W;'nVRKWslKT@(tnqo;t(QT^łF.b)[)9knۈ 9߄QcVCf:D~[[ǃ 𽃚/9tN0/L#yxBɈ)1ou#*IF/77~㉘ ]RIyb;( Ȋyi8Z験ނ>DU)77di b\\9a[NhXP牟ĈA,P[-N\/*|:mGֱLmo<,t4ҟ<ZˀA3jVq17k$#eyuPGQ['$yUPM:Oلy],\̐#UXL@I:Bd /ũt]Ķ FB".5lde'%ɟh;=OY`fUCg;yW%) %OtI6j7?F8^lDj]TzL==Uep +9b4^cA$y*9D§A#>H"g. +_֪ơeP¡9#bX&z^7D@|\0K fcFNrR{fe& [X'S<$>)?u!'1P8/?; ڻr2 }ONYZRpmRh%M?Aj?ElIUG*1[Gƽn{dhq$U<`\jᛁv6RJ> 1`յzR*lz:RBѩ)_ %D_r[<}c{ uXelەmU*ڷh|j ap^  b^kWd+,q飘@[3?iYaD6WY g>zO6\YXxaOz6{=w"L<>͚JoϝXKb9Ov&-x{i Ze +#-㵿c  D ~IBM;nj>Q3M|L;m^3w 1v씔U+B:G0~5Ovvq0S?`uaʫRh7e!՗P'j$N0.C*xm +n1A\ [Gn795w^i4MrT'2! 1dwo|R@kW{sSߘiJϖzfEo9䖖UM2_Vjl@fqz\8RiJ A\"-esMV)A+6ȂbW>`OVi@z-CQ@;^cy*S!QLY`.D Qb.^#f),F:Z \ExNݺ#PcF=YX'Oء9U7k$6;mo-F]PN:LN9lT{/$2 #WIwS~-+5Br)p ͒T/G[AEIõ$xSC[/(mo^bQNԧH%Llr;Z_o/}esHJV":&| iJrk!y"4.Ր쵈pH} y!,Xw}Og3 :WABֹѱ3wk\;ԧ3FoRHaOoBiʀ~pٸ OB߾ 0ǵ8+<8:vT9}L{2Ef8#ݷ)b!G%\Dvl)ƚ@8lAu`aM5 p&9Vӄi0Hhf=G$Z.E1R54d%?b{z )Wlr[,2{Dm؉qQJ@BA{%(=ojGXv]8d+M5e]_PiMT[kNۇ=N|zQd#yn<^^ G# ʭd@6IV ǯIE(sl ٵeL^}33"Ao}]m!'tȬ#Q0݀=罞ޕrT9ES>x_w![7e +n"lk)%TS,Y2ʂ"Γ-I<^Dp4V;1\Uˀ6^'t>|9ci F_6)nS樨)u!6U7 ۣˁȥW8& sBT>:b?&I4*Iw!dh]Ktٽ<@*- ҈b?" Ɗ˽]&F MXFXp|๯.LkaVBpqSH!!0j]aDJ +ުPyb1A*fI񊢲JvإsH5Ч꓈ +U&ykx &`:NA[20܋!z:)ᙃ%Nb2P25E{gh&-߲h6e">i[Xih hcvG㳏? t ~˄L#3K 6f~VCL"$UYzi7*4d3 +p&:ȉows9X?öUQRHWj>x <ٗܝk?Qq%?6dIj^`ɅJmDDE/C 5⤐i+5xȬ ;:%8 ʗU d nWUDI7+(~i XjU3KLuowѪ\MG;vБ}7ʙܟ?6&J5|L8uc::׵N-&Wb9g1SV.΂RgiE >3WHtg` +q2˫ +B< ӉWB!S떗&T!1ܗ1ٳ$YVTGbq1Mgkހe\h}n*uՆ#—bz9Zy"E14SJjn|-\,y7O +U9=ˢK3B%nR! !V,O-Vݧ /ºg[Hg.R|aϦADy>o*Cd» +>ĢhxC<ђxcW;9OUyԗnf2WiOHxjG+(K. @RebDh ldjȶ| /D%Fg!Bƥ$f.t΍ر Cٻ`0p9{r:M0 !REΚ9z`,)~cÝy!|fϥ"]P^K~u\ dv"YK`,Z6(}wwuQ"-Ǜ42JRXU}͓fYz$Coldt @*'fboTNp])x4F/e?nn&c aPN2_M)Y{nyQ4﫸rAUQ"`jAt G;fVV?<ɍv Xaj)"kseQ0G龉K!q:#~XaxT*1-h3;KYbS)KۄŤ׼vD!kfcF$ +jIj0ӎj B7 +F1j*/EtD3Hh}X8#}@1Me1͵?-bH-/9|#/&Y."uWJ[rOPD} 㱒@ ثV6gu Y`,ô wȽfә|SkxUl' +-rɷy\ܴl7Qo[eID\ +:w0m(X(G~-P'B>:aE]tjX AiEY)ϝL::5 gz +{ @}4#- @/ +)C?9#UjŔe&劷Bu$SjrLyB [, [u iWIv&k;~#P悑Sp4_F۬Xg5ՠ  v|b}3ZL%mǶvk%AOY +G6ECJբV&6 dpLLǚb{XFzL@yv_"R U$c1#[:7tqCJ6N9Cpp#ɾ̐37!g]KX$_7y fL^9O_N\/ހ>d5FFktopT],'v+gBwNhG( a@"c2MIX2<3dq+JofY9m ڐ8]t&lP/qFE]f1^@aI3785T +O]( uR? E.z$[[v3 t銟?痢=!0Mn3l@e@UWŁQ ˚vT9B́6,T ú~sjqb$n&p3NzT2qdf=T\L8ʱV+锆8I1J:nOڼa媕&e$UfJ'\ {POH;Ot!h qFEC+( AjK6A |}9,`("tl +hY̟)?zlNF)@hCY3 _i3Z.ĝGaM Y>B +r:u~+!zi4ܔgw{}D<#_!DP 3uj86Ԭy1,E[;E s|gqQ GT 96j"a>HB Ph'D7oUj +/Ė: XPCdW+rg77DtGT>S~rM.d= eʩ|ß(Wo'WѓYUV |F]7"1䱭nN=|٢EL>^G=Ts; Pl[Ď gTKJ DA3GSA LǣA[4T@(U~'(߷ҚRT/?eMr"5"Vgb$0cXʀ-4Te[pS_h%m̕GrL-tUsqݯLS3SHf 6-۲J]~䁭g㉝2?;b^gqKƝA5D!^dGQfhإäW׳C 4aHV{OjT (`WZ ph1U ڗ)7^eXTmeopΓjdI_ۥ뱊].O3̭=]9q@1Z+:"2nDO *Eu͐hC0G%G ء p1?=>=J5_3t?.(}:p9u6"3@ߣS6<PR;0ɼr~_;쏚UxĂ!֍; +d*r*19j ȇ+&HU&dv:B[BR>)x`f ҙtZ{0|Aq X$+CCRsUkt?usuCŧ^ Y-GL]7鲓ɧlmeغ!W.nߢ+[)JI#j#–&tO#sUQN~? .d:hKkfфCxN{f**AvO;O$^6zsL;kIy'PL@eUf9lw-.I\-]|?Z a`^,Eɿ^1]].w}Ԣ20gZj;AH#$#U ŗW\~)kYἎ*g}fcmQոTozDmW"7+)beO +]!gvNFx Q6*u!_"GWFcOe^AI_?pDc}7lڃ׃k5D&x rg P"YRlRA vnR\2x@~~8%p?te[2I{O\c +vE + QPFHK/B/M7'iÈA|RJgy76T,,g{r_ࡕR(/3Io~?s_l1G{qQT{B븡$p%_o2$*{Eؚ +~Ъ[H/lظӴ/spH}8-|%zFdnB5\a: ZSڵ ]Ih*lq|y7pP=Jt޷&T<~Go03sd" (T@_J,I:b{NP(EoUHTmN`hr.1 #H1SA,}1v$35&؇ҖF1$=MG\VMO +M czLO%lND4ʈf|dLjf= + +} +Ѻ +F=P輞V8sY3(J@+}V6I|)kÝlWu 㤼'?'RK wOJdT/VOCv.7įyjX߄4trRQ7n23G y!P~J*2SQsD jK&vqJKWP;AI'1`TvN5W7>1&7\b*Ur:!&_O#GK. *R Yt*?!]>C&+TIMx ,VXzxm͆C.=# #9MPq 闞7IѶ|>G公&w +c/ CggFyAaB>h%.i-y9U$ +W:0kyp:Tu>>|iO=dde)\{X;{UIλ$ +\X\qe֨bOa:/ <ݩ%1L*ionH*jIgP~S׾KS-'C%2Mr \e#p%7"W6'†(:WAajSgvgZZ!N%‡Sˌ7M +N +ؠ+Qv/toјoR% +.O|JFT] B v1gCX@88F䁣MZI|d`Fp.#VCmC]KԈ%[  KVvl2+[sk4&Ck bxC4eGK*~I)v2#rv NM,>#(>d?aGZdO 3HElJj( +jCV[' #_KDwL7pVs"n]NCq74APoN6稖A4@6hYAOȻU@E0 +C3Jhgt;}묜EMwVCϚQ|"29|7|p !{ǝnO)jFrH;ILT-&: dZ9t\yٴxHRޚ2HuPTbz#/$ &fVw|T8;&>o3ױ/KSr ׯ~9<D?o(ښRX@ VFgV +ekPh\cV7_}̊n Y`0`0&Ÿ3&xU\Ӵ3T1S|} +C ^V뷾eoe55p*kdvHt W|ÈPPPs/26܃X{2/0Pʞ?y ~G&IFڜWe0 %K@̛a_?X ȹ&F@h!wM+Gs\V،?[k\5p\0>VSxWsug_O>k||kVlmyit \9@^6u3е̓Te'sɐL IKiJS7.PnEM\2P:cߌWPF3{8P Lw֙F\ܱ\x*}!2<5{,v~6bgF" +ZЅGyH3 + Qbt\ } X W);E3$Zߪ-M, ovݠ +5sC-uHXC\u'EnejRAcȘ0cD+J5 !tk ds=wxpDC [m3P= +Vԗ8Y ge[ #9+SxT0eFAZ /@\ӆL?  &><(x;%uAA-V;t?[w/VʔqeR1gFxNӭHp5ӺǜE5)D(Cp-B=2"`/`jqsnI#7f'!ުAC

,Ut<5ƗohfαL4'3)BZ}x8Pu"w6ߤQ吽x~l3Рę ,4%+ +q><})%".*7iX]]jP/][y?P=}9,@KnЛXd>,zUg5<;ܰ*hy߈b!r3 N8w=1qfBfi9h1[Xn[{D l(w|*Ӳ +84$)J]K?Xr_sM Mn1w17+6#N/\^ƈR?8cmK䌓r;V9,N"JXǿM;ktLuD_B " zF*[8̈́bJea//ndopyډZ] ȢD]tG,Y[ ge'<]HΒꗉvU=. g{"pfO;`R&ᜢArؽ +ls:٫i +Ⱦۀ{r3~J|a8DzY5]$x}%/"Kr]03^yKHk` < $TQ|wae#`O%AǖK3! 7*+?"~}CF;obxq 55@եWuT?U Ts[A}J.#ϯ5& S5~.?:5=]jY +i,]-7Y]{V̼%#ȕ?ŜKɻ2N0u-Y5e gܑۺW:u!AGIvYx"Uz=$^ey&oJ1ڢoBu{&J|*)q0Śi՘&ǹ4:My[bRa=g1 dYmn Ou v^*8=9璲av99%̖q+HZ Z_|8{d 0^190ljKNiʮz1B'(KxrnGskN"L h34 +Vj}t|I%ECeȭ݈թjLXYx$LchH[_0hzwRi_dЍN ՛ ~mv8,.#nrr6ՄI&ͶNr]SP96Ẕꡙ|p!ȶJ$X}b 7ῠx*F>ij^J#-$Y![5x̉{Փw!KS^@ +#*r:Tv%O;HwXD?߻ nw7V7`'+&i+<(5qEi,_qa"xjw }Bv@ ,o%{Ȼʘ慐MasĨjr} ܇΁yd&ưͳZK "ڡ)Ĵ"(Qv:1f3$-҈:F[6Y}" $R}XAO3(T+ŭUtI&QU8h\&'ptTfMYg^p^UQN0p|HzxYVt_A],d!46Xjc> ċ-t??9Q o +nGrt06[ 7f'>G.k(rpb1je'b:@m8y|:Zpb ,Y- mC֝_ D} H7*5sؓW̧'K>qN^#ѨQn= PE7,rX\FS%[Y瓅,]N3ڤ=@Zɻ(+|(9HA/O,NIBY mǔ2Bˤ\ zܣlcYl"4T*Z| Enl ozOP6Og׽*Fn1NP8/֕PMG`I%]mKhFm_<ŪE f?f7!q,Ija ;xZ_4K$%mکI 3Sw7X6-O\;茜DTJm:'޶/k('ES,z7KHT$eK=w"J&WdS(ڻD +kwFX@ҔTv\c[N#Li[T}8l1.;޺7ǣoV3k௓pF<*9F!]v,,z4o6gHkx!u3-Y"o[q7` 蘢<+IPw"hsl MOn?v_o S0-fg6MI!҉^;uGuEd֦Z-|fs΃uU6xnIfJ\x$3% ^28QD`ƮWld`-8R䮰LB"4$f<p6l`)GLQA~2f-#u7IÀrρTSo(}SgB7&?E0);S輓h(”qfAjt2$AӲU9épX}<^!h +qFh_Q +ypm%m3FrѸ/ln=`FOu!YY,X⷗`LsW6%SY$i5#4Xljţpoh )N:_32["B=97.FBcN$xgF=<7|هCv| +*iڜ[WǘȶrmqͤEX^I#n{'ǭ(ZrU]s+KjRS=Ig-3 'lUC}c5K^zsMHbz%Y*# 2y-El;[sނe4@Z@XZUG- |yT֭CBz9{X7J{RqzW %0)WD,3PsHP=aߖ\EЋd/G1 =xzb!GWB0Z^Aͭz;inYh>Q4[;>E*m!AT;|h/̩ɹό\ 8895.(MCV/P?٬^\8E'O r~|(wn.h@ >dK<dg"Q4|X6ARCLm텶.SRQ-`d}zMn{mKuh<"m)k-џoᨴ_\qAⰹHvy\"נpWv+ߣQ좉jl08iuiĚC\:tVLV+[U15A>W!Q}~,FidX6?ôhab2XWe|£b.8!A,E'n,S.kyPjh |!h?Dds0&u m R7d<^gCZ0 ф}i0_`1掬tv]񺇅DWUXHn\egP(V۱@3O@,-V967d~Ԓ9 İct3㙆 Ć9nTmE3+pDuEϮKDHf U?Zl=e6pQ=c# (ѭsW z 7Å0.'8Ñ/ {"iQf*$$(Jp'tT۔É%duͅ&,z5 \ى<׷Zt:"L/ xڥ]Nqu.-[//" +a7:# l60F5oid=*#"D%`+ɔ:YxKk2$ lb!5_Dx*I |4r,ʒ ^9o2++uD1|޽1pXeuJ]Rway I;08-=VLJП3r6FSO@PS{W @iݘhH ;N]LN7иi\i2"whfסZdX۪i`ʎ[|}K޷E/gBzYui>Xs \x#s%Jv~:.XM`+ +nȚq`#ٸ}wꉎ[hљ}W;V cS|ɻ$`e9hpc(B{{$RjJi#Q{ dk|)E #T7ډ>Vu)>4jy1rkE}渋^ɥVUS}qCt5~9e:mJh{q뎟t?`իP~h\KIoX7W}O0gIl+Ҿv PX&C6.lzxON'3ؔ\i + Z!#f/ukh~=<XnahȌW+1r?xp~ ʋ*foey0*hp:+N\<[/*H1٧B<},+"S-g$'Ud=Ġɬ*Iw1P"; ;|MIS :YD}+v{(sM;嚇+po* LPZ-L˧!ZC|px<lӨ@DTE"4!2wxUGj?XE Xkt~pL5O3tp(rO$:o#x |%/Jhm>R乮;IkM0o +'LC_5J&G㣊ikyK ,*lpkv#M+=& թVw̉2i3bZ,#<ؙq2K{* *Vq0YmC\ӫ rCfX£ +8L=WV -T!sy0OyaE!VwVz]wSKYɸ(!*խ#FVG]K![iUɰ l6K |gVF$-(§Tw1CE)og^֏!j'[,'uޖ瀏Xȱ8FK'MΟv0w C1sDdw/Ged+;Y/\,f3L`@3SǺN}3M={|+jWG: G7nJW5/zЈ# 8- eӪ#nڤ㝦sѾش$P1IJ.K;tTB/<W41M*aK/c,,}]2*0z3sfVPd 8&!Vȿ$/kŌ5T]@߇R_D@H`q&2[rILR֊?ltk8=pvǝx1"5j,1}CZ~"3ǹLJpׄc8?iMx=hG6V@io8EQRyL- LV$k[ c3B剴 ~ 9%)>-SO^ѓDVu ƃ.^(M6Jy&N۰jRO5{E@}d7ϋ"%).Y¥4g$-Mpj#}>Aj8SCϦQKBMtm+?o:?BaVS,/F9?<ěBs gf(X\0?&&B% +2 +RA7-eqQ8<ժgt-de.viLaϣ% [YEj9?t.xm0iHc'.ueC1R opIsGfx:kھ?}sgE=s.GGOmjeP*\"Z&7/b+kY1Gds폘!F,zk9t]|'hïOg〵o 7FGgg@\zw_Y Ԣ'puCԒA},4=nۧ +0 q̝ ] +D +s>V(|D#i(r;&l97z;]d%=$^Q޹ I!rii +ua޹"c* G;鷖ܡWJl.;rĤX ++?!l)5.,cHܱʁ'JEiLd0ջ@HO| t|/m#k'8O &R ӝ?VS|' Ӛэ. 5'ayj8 ^뇢)Xa}ݎb5M +TQXNxY| LxONHY0{K{ /Hj|0)+wR{ c0]bzVSdjp}Am<Bڼ|,x '/h%ۻ*b=y61eP3pRTٍgl66SkՁ%X]7jsՀFRS sl[ B ʾ|R*s8gS&4 d#mz2aCIEnh#{.NIne/):p3܀+CzhJ@p)wP}N + ~% Fym<׼YaLt/ɩ'e<}ԼKw"  +|@fcmw*!.0خ"p&T@k5%ߨaJj@н9s៕!qhj+#7F8|F΁)S+M'' +0 o/ms۝")v0'fU);QdP@S.nB#q*fo9zi}=O1;YcgQޙ9ڷ b]qb/EU0J ֠pazZPdZ,S"! +it(Od7zAA+ +ZnD +}HIBn+SW"q +/Rkdun9ׇ8+}'Ubxc왟 rEmm68pR[/opzN51D}:zF' =Ɲb*`>]TBȋw.+X"bLcS{oV wT=Xjaش#KL@KGG"uY#zq;qQbkT痲5.SYM7.yv?8kou$ڞ&eT_t0 跨d3Np &!lA@5UيʍM5)._~망µlk>ˁ.J(ti{b.cb_xgs6*~}évNE.`FvӢ=5s <'Oi0P_ڝ LaQ L?Z+,ʪ&v^GL( +}܆UsaT[egDHumrF*1EbFxbZ*葚c99nBG6b o)UJc!|4+Lqq`G瓬#cU2Cgk.4b!=8-"tƶ[\!$e@< c؇@x#W#ž>#(֊|4ȪUQA=P*zYJv:uOUWH) +bƳݽ-g/_F(a2>*-! 뾑?:8%|vPzڰIE} F7x`h^FjAp.&f^A3J . @8 Ph>/luV-y>+~q?XZ4c@L_B=O]y-NPt\ "OE?րk|+b>=' "Ro)\_˱57v&a~VB:]msv# [5j7Eg>$T/\oWRp3.UQ9wTu;(IW_@]dK[nku& nʍ^||Į!!wiƮa`kU8U~ONyvӓzy 7}1B'@w:l]ٰ^4KF F[ +JXOc̽ +4kBjİKXLm盄_/TpNpv |H q~zEsՉv&Q}B; pej4\W1e/U .koC)PRYx/S4*\y[vS=s兴2nl5َBM$<v?Ee2*/bPO\U[K/ u [$GzQx[B}(AtFU=,n&r L0;,Ahb@Wu-$oQ k7U2 +.#T^tA@ LW^ +3k7]x*rGuVM&8T o) } {Myq0.2 eJQ;$H6Qd.G~@ 1'>y7/>7~լVBȑ{:&2'ȒE +nj0?/ xrQO)G5e.+VO!x@,Y`$ZOsfFS<|)Y=_XNĠS7E6Bvfe[~!W65鲕 yyڽʨN1~lB@gR5s%omXt(ޒ7 qt,n%[f3({EŒ6qh#{WBℼ\Am- t-Uom|^=_R˰\83-}m᫯f3&d +ZՀRXbs+O$ǃ؈؛{cn DlV^lD]l4=9V*yjV7@@u;*whzx>m8xp @p;˰mCoQ/{(#{w +R*X9e::h=5<l^•z\z%+*JҎRE)sS.z +o>plᱶ<K/9xyMMn WZhѯ-K6KcH"4GNEDDc#zD%imK*<ڄXJC?Cm&;<} hh(X(^Y@ P&ΐ"fx{/}H$ZGLv:$Sz;|!W{򕠫ۈѾ8m푪@2ttC&;$!{ZB␞#J?FN!IʳvNTX[sC}o:-, 9nN3TwŽdq}@hDr.uS9`& +SK5/pbUx9$H$dεe%BE1L%RprdWGwݠ-拙6|! 0I$7ʷ35JD̲$%%aNmF &cR&= =މFt5&ȈiZLyZk B||CdqJD6dOcV6-4Su;D'>s_wu +#:<< r4vfmKzDj2T EqUZ;ǐ=eVFz.ٱC!6 b'eImN7dQ7XrNj9ymsgr٭[#k̝ kb -O{'‹` 0ֻτ>ͫw$* 03vkpr؉"J@zM9k]G[&?BxrQA`#,-x QOp~IB+">MMa}jmo$qBݗʳ,N6S"}T ]?hXOu5J$ ){9p󀁧x0eY='+x=wSG{KK7`F1M4s1]m V)2/_!o^ZĵU,4ů((}P.ڌFZt;閼U^Pn+GN#~0B* fZ?~BPg-Fcb:=`UwE'AsB%acQ}twcO6rDAw6L-A:nFNCsظY(.0SͨT+kTSI0k0FK$Ч#')S/(%#Ib[M `N*`("퐙< e7,i5uҍݥNj|&g~btÃ٧\\K;Iк?EK|CM^,ėkWsWXS̪Os0q7LQFۓV] 7XQ\ѫ (7:#Ayfk}j|eV||朧w#HSy/*r&{=ƞwy3 mR|h=P.|3CZCpU=2Rɭk:~;%k '"53c(Wc&GQ&x ΃-Ecm;*y)5M`DIzFUf%i",&Q<= +)mF +}GKM>MD1EbLIXޏ⚷d%AjZ+l +_ƁN36JyP"Lҫj +dX˾0Y6NcB+kH 65%CZuL^[u2G'\*`҈' g4w}v63hC?yllfT6 }Jm\~GKZ~4KYghIjxo澷 )1|B.M1D-4n.7ͯfX /# cbt|Ñ]GoPq7e?ai-|ɲ7-. +4>+)Wܞ̒(Jۘk <7 EJ1 +&z 튊^D >u!XB q +糱H۽Q!z+]MYh9(#3o(BW:q%$j'cQ^,-u!^nЄqrR>m# i۹qD\RQX >抽XJ{yĮ:hixmBA`ŽGHR ҋ vs-T#aجH<ܳW}˰L~zXo+ruͯG{ r3G5USIE^K,(i"#^&fewZ#GƝK;eTSo}yn źT@ZMbK|2Eypg($%Ku I$د0gxU~j [1ox8qqD~@IfJHْ]:,,,Xw@>Q"3[˄4&CG#z6k\m˺W#[U)%|{=CW3`8,䷽}: +ZwMVVHCm|oFo#m,ppnE0LL8nig`/?05U{O 8!h Jh-7CB,"k0E,o*/K̓K{\#}rͼ]"Dr=̊&GOZߐAWDȠ 0=zDtrjn1 q %f JE z!I.ʷt?=s*Af(gt^=?A(.լ -!]{Kj-: S}i>mcsR71涭x;(C6U$WvΊl `a'](ڊ)}C(dӂO"e$t}Mgю +E׭w\4l kϱ.ds'IZg#La}T5LHfp̛2j7Ŋb<"ߤ%LO8fGYeB /nUKBѡzCCY{׭.CYNT{GxhQwӐ]ރ=T}5ħΏevw-`ZGnx]c~0_*Jy d {:0㊁l'D=9QB8|1NxtW˺(-ၽԨbh|xŰYF/HʛPPY9 +㹙/&܈`LnkI%yMčƧ#*\TDMH۱pgև'VO{l`46erZH芕˗l]ClFނ J }A;b!YMFe_NN8AH,q:j{2# ᗓBbg,˪80/l5G6͑eqja'[wl|cǪ\ٳzm-—OŜzCs-8đQ1C#%P,1Qzׄ;78:s?(y!j!nhQpUWD'&g^8ϒ->1ϽI8-z)^:cl!Y~m rj-ƅgZN3yf"4BDmNwxǖ)۞adS -Ͼcսi.o(VȓJcW!'d[wW 9y|m]"ӄH(O(:$3DZ~ᡑ׮̞g)^8GQb*y3Yr3;Uَٓ?-q)AhKum M _!(S$_I>kTL[ ~4$>;}G + +^Ux򌷧N1"dU2A +}/'%~yĄqJhqqR hg>/"~,_ݢ4w̫x&!z2k2h/WN^/b h9 'xWqnN(Q +o}کE6.qi w8?Aq7"l\B)Kj7vaGL +5oM"C{NJH&~c_Lsat#,wε,tz L>A,-ś&ziA9zB]ARC|kٓ [!ᦈmg)K)ڂZ@c1`x! i. +~9d)гx"R+r|dԻ>wɾ8*6mtNCQ ! }c!07zMo*Py"/c+H} 7(QiCr#~! +9e%QzulC].0jAl*U6aEHKu& i=A0>E:3 +B#?G`t~frׯ~)r'qz.ñEl\{ L[dz. aZFDT$>ܿi:ׇOA>Vwgz_A/r58\b'Oxv7H khb5 ˻?Wˊ:Dd˛ΟBѴrN /҉IR7+"⼯6}PcYL}@jRgJl~5Ffyo4l}:RKp*EI7>;!tƅ Ⱥ,C*eYHF]'Ê2'l"* EܡjUK[ 57vmbhZD9c *KN}hS66(t !lHt}{-TMh8̈́21({v+:E;em߉AԜk}ub:}y37!b]5>Y~ +TEdbȸfGȅ1mSl[~Ո+wH,&[*`];1,. +A鍪W<ؚ@{d\I̫gyZR;Is^7pF>Vs]]XU$ Uㆍ# dWZF1xusMܹl[w@*fjq^|=eά/̫kUEq6E~D|Ur`ϖ13VL!6q~*ڧ#k]{͏-Č~'c^ )ru( Cgh7W{ `*Eލʘzpp~ L!:UVrY튨+;4LbW5@c7{ll|F 2yl]+3`A:vXWDM]FvΆc}#K,K +Ց:ՓO+`&kFśFV.\Yؖ`NrO+a^~b_O5Y^ͩzj@Pl<[i~+ BS~)8DE2Ug=J`mG֩Vu +[pm{ /0}&5Gܨd`Dϙ V.=EBh\,MLfb PFt ~l *q'w-V18LV*ZKjVs5 HUwV$|ثn:jE?!7vhpQP~X<@5wu@oW(7x!Hv H ujɏEiK}_=4g-=,Tl#_j:P' ++bl +LSh"Sv2#18n| F;ow?x;ZsX$Tq`0B!υ kqtf]/7#Z +@>-s`e^SJƲ4Lj85ʩsň͹\c}R1?mu?$X Ç9}#m@],jkiBLs[%!E颮%5άwH5xUTϙk40|;1z2"27i;茰n{]Bun̫Ş-h1Wu o.*2h롞!G=5w -A-}'( ;\kŤ#3c2-(i0 VCj4$Ԩ*yNHpekt @̈́'05.h8[σZe@%(]M$o`1%Ave w6ʾJtd>TxVغ_<-;rs{;BF+|:cjd"-#߃r2:P96h>%Px",n_ثꯕP6ڪJp&cȆ=6CAn^~ƇU')Zќ'K@"~EOH[H;OrF- +ԏ )1,O <61up+ck5sgื£MՋt0@nYUgMG襸LW=ikNoqw *ç/XI'[gi0"ojbS4HM97(f##B:kQ8LY&l2UET)lf[я3AԠ̕z;1}Qk/9Pߊ4.X1"0-i~f:G\bu#Ie!ײpB +th+:D'"+|/Ìʸ_z'mdˆ\iFH$0VDPG~3Zwfn[ 3{#?ԣ]T0.K-):|SQ|l,R8-_WΕI4zz_S@XŹ~0xeBR]k0˨y -+e&ISwA@:-fl~d{nw_^ᤱ; +_c&dWf)™1Fbj'X,n6Uh6N ر1y5$p]}!.F4ԙP=m&yDȱ\S4ZI +^,v%>/Hyѽ!xxOBjX+yJ`lIB,:? 99 +BCd2O)G +V`P*"'t츽w&OEqbBhY!.TѻhAIWD-n^W4w%Q^4~\26W<XѰh1ew6Ӥwc}pi@5!1YiNr&|`Gmt!.CAs#9:}MOE3X +怈^bn4ްIwQf/.|%ܻan=?_Knt?8!"ԟ!e  % G3@BbLsx?iHJyN<4"~4Q},<-FǦ|ذK$V?͈C_),ʎ\~`F B:2k^8!; +/Du&|\!0EN+26;yn""TH+#4L{Z&Y8M4iP"::UxBHo?a!TXm3=4Y3)by3`_aJLnP@@~BA+т +EUpMnbH<裔;ZWSH =hYvL6Pu}9:-h(AhUA&,Ԁ6Dl7Dx̗noj?A U3 +iL7_xP4_. xT=?}WxN^).fс_Ș1vٹYqTz½ ZG$ԏNZ|v 5GoU;D,V #v;ı3@&[l|(sF:' xE}g LE;7ŷxeՕ+JטH~j_wzlj u`@fm(mmiI[W?"v*3Cs>e~ci +lKHrRgbwa>jw/`ƨXATٟͫlMa|~u]LzJVcw?[3yZ%醉WGЗˤ}u{&1mdǀa>gyR * +%E 9#b4-P8E T_}J\?%;{M;3 f,j#9WiSi`-XQՖ'gkv~Ev{]zZD;Y;#d9qg5-l/0=> C~0NfUg̕ cI7Z=. + CJ_&Sq=44>  +T V/Dž8A4d92up-59$˓8/>#|o(7Fs#}5iLzŽ٨);N?暣N_RYߢCS=O6YHJ~fFuAd]2h8~}ǗVF (}%(&fea㩉l]t}HAz;!5-jyXN {ۭ[@@^oV%s$C̑(wXLNӭ(@Uoxj#¼syŃ{{LBaU.K@F=\"@חvq5'k潷NJ622R'>[w|Q@0!@H8cz2a{f9(Cn傳uQd\@[X:%Qqn2*cd `V܀~4ٌ +e"Pl|s3eJ7&D\+>D$ϡ%3rٗD/m R\x.[ +,΅?+ % h.,{7n ~ob$d7.s+b:\O JC(<E)> q9X;+G-t> [ +%Q[7~r[ L.#zgx[&mŚ0HzUTmX2Ճ`~Ӊ&笵 ρTݷ\uج>M60~ Ծ7"r8mk M| l@07S+P:h/nUl`RsC_6r}z( $fSL0M+h2P3`rC*FZͯy3hXJR ; ZwiL{,(LsiWyRÂi9/d,NI.~8v&,5}61 NFhMuXb>'M&hnD`3 p~0,_A5)SJ z-}6'άNVK9Iم?5 :^:AbSRc̩o Pc{c(+KWHf dqѲSOwRgj>L5baw6KnɂAd-WLM@_k]])*0QOS/[QlH!Zޕ^5mx[fmTܕ7f{F\)O*K]ًMp[hVl+_b2M;I}hIخ 9#>SEJq8`,tL\(DcKi7Ycz}b"m|LkFk@ $xR=7"`ş +;TjȭkƠvR#ӌޤ( OtoaL.2bΡJBAw{ 4!?}m·~S,/86a \ۤ8w~sq8z?M>7䊔8%G0]rqO\"B7aa /.U߃a4b>?#,K˺e_PŹz~U +UWZdlrq%o,hqI`H\mʿww7ي7Ri=wp S+tA!۹*Cvӻj}qd_=VOZ_ Dk0[Fi\HKfE<`A).b輔^(HDPqr'eb(}LP#ԗ%:T&/Zv3rbKrMr +&EwGt);۴,^bګqPJEODD5^:/]7LtX'œ"Zw +5'Qp;D9PWݦE0+S$]XgD78Yx%'R&YOx)G"pHoľ=DƪAF}>dClֆ]ցr-}N/blQ/|DFS.ǟ7vdHA?~j6}RfELU1#e-A ꄀ3eu8DLrRގΥЪ`:>M" gY2o\Gb?k{ހcY85G( SEhzahr/\im"w +hl *|%X4bMJ }汴ePSXrY />I:\ږօOJJlHk1QVT&m+BT(yI_gf^q{S*}@3B{\:2aD:)^nE0Ý~ΎmqZ<t"&f7I': C[S{?ŠeÅm(8nm[ $y6$+%t8j̀jξ9CuowQ!Ө\Y%!>I|yW,>*佝^0caw|,A5j ڿs/'h 탪q8M*DE4ҁs͆.os–R73 xND +$&9p#cD=T.@ҟ{w6]Wg5E1qʐ7.b##]nCձ')}W+c/WF?7-V{csm4f̙ޟxzLWTARHNܦ9ljm(o}(TJ)A 72Y+9{:MZn){|a:} 6t|=oMvx6䲬RAؙ9)&Wd"x;):)r#5m&:D< nc_XA4 fJ ϠG8 n 2. 1oym5azh%& }[oFRB%T.uGUڬS쵶ZB\=x~o9[+L4 GeS4UcxR1G̼jd[tL;4q}Jn+<q> &Hѥ1 +v^Q` LTfCPY9+B/~ܡ!vgtIGeGFw,ђ&ފN|Mvc--B+y7(jVxyg" i&NKp(>YI|OͭH PC厒%lLPa GNdqŃiSRPKOegET%NgpmQG{fXnS^UerN  ٵ )2#j*ETDL*9,X6\ƶ|Ģ&-ג8kt93Ƌ?XR"jsCS3\q/260=@*}N +NO" 9]YГUZQ0nttĦOgdƼ#tϹqQѓ.Y騢i F<{=l*y:xE^67+N,%MVڛ<\eW=Ͷ4}*; -1`L;͇Aީ%"&\8E; r{cUG zZQ/yHifU]VPx.I.2'd]Ñ?JȗbC"&kg($ѱyd?.X^ScfO!VSls%Xk`ĶζEAHz}cA nWo¥8Khn@dFT/ֽٓmpR WCi} K 5Tٟ,D!dv^ Axx2}h l JT_t1y(l$ h` =sL2<:K~/B7 w8XR4z73m]Z_K HjK_?N n9 +iLL1f/t(c',_3WRɪ>{%tL_W<%)b6[b; ^wГ7?1_Bj_jə^if%<۞bO#k'Wɽ9E}x񉶺 +c= !kL:}0IR5eW5 >HS%Z< s>9dLjELC*:jú2gZUfݺGtTՀP)(D;3w疞1l:ɓo ATijuGs ;StgHjĶOKŵh6VII;r'b6 S}F2H$ "$ֽh߭2.4|5~)MN%I%4G2|c󋉖YUH9l"(CZH"谐@֌EOsí.P\xq#\,F xEsu{E3J +< %`ߑ(Ϗk3hd?sQTRŗq9L%h+y N.E<4'H i_ͺ7-֣Ҹn z)\jZ? 2dGm^Ï*?ɛ?ǣßN_!WB_2bؕ"] +}U_7VCX `mI<νJ[ԝS( d칺wC{ͫ4輪3AJ-]s9 / 0MXZhddzzYK,[_]1/I4 :;`ۓM`0'̑wrkF\UZ a+)1lH_P޲' AKF6~HF+tܣbveAEt#;Fs7(U{r Q WCfcM2%RdvP Ǵm~\H8t@[!b@"ŝx^}3T~vgQ>c:~mp>& =H7&iAYFG6w<ۨYhxJK VaЂs>"FVBmҷ&5Z[5m)(JZggg̭>ML0~I p[|9\]nrPp2 +R;S;u1ѝYMr"/3#JٽO<ꫠZ0$w2 +Yf,ڀ\f~5>$&J |%8Wru!^a*?pN&Mu =CIE)~*8p)פf`5a+4ԙPõwα1AV(s!w0Iӧb!)]y7)sİǐMe\']?=xQÄHPn|P RAHL9+ Ū Idu$٥Bu"JYEK6MZ|]CC#XW?ieҟ~H1='X@m+Pr *?~KXy"_saʢ.T R$|\VH_z|ī$]s5T!&a(??KIfp+/~|+J %<xu۸ʝz[1!)9 =>e=4e75Pa{ Y :(OƏ#+us~F s+%?B>*&q +m81@ bӝi82&9?WVO[cLä +:ir'Q=WY*]c]/{%>HO4ieՂr% +,lvbT@x;PXh&7!d2C.e¬- endstream endobj 2198 0 obj <> endobj 2199 0 obj <> endobj 2200 0 obj <> endobj 2201 0 obj <> endobj 2195 0 obj <>stream +H*21030000P0B3CC=cKKKcc0?9K3@%+ ݠ endstream endobj 2196 0 obj <>stream +Adobed  +$$*$$*'  ')%%%%%).*++++*./45554/;;;;;;;;;;;;;;;;;;;;; ""2(!(2;2222;;;;;;;;;;;;;;;;;@@@@@;@@@@@@@@@@@@@@@@@@@@@ "B +  +  3!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw;!1AQaq"2B#R3$brCScs4%&5DTdEU6teuFVfv'7GWgw ?g/wY`\RI)g/wY`\RI)g/wY`\RI)g/wY`\RI)g/wY`\RI)g/wY`\RI)g/wY`\RPJ{OwY`KJ{_wY`KJ{_wY`KJ{_wY`KJ{_wY`KJ{_wY`KJ{_wY`KJ{_wY`KJ{_wY`KJ{_wY`KJ{_wY`KJ{_wY`KJ{_wY`KJ{_wY`KIOk? 㽟IOk? 㽟IOk? 㽟IOl?yowY`\T{?ş${?ş${?ş${?ş${?ş${?ş$xKI)7}~΁:Jww/xX $Jww/xX $Jww?Ns${Jww/xX $Jww/xX $:#?w`JI)w`$xKI)w`$xKI)|>(-*))w`$xKI)ny{S?ӿ )w`$xKI)xGI)w`$xN~? $Jww/xX +AxKI)w`$gz cJlֻ#wZ=ު%6k]wGURIMk]TSk{/U$wGQwGURIMk]TSk{/U$wGK{UI%6k]wGURIMk]TSk{/U8%6k]wGURIMk]TSk{/U$wGK{UI%6k]wGURIMk]TSk{/U$wGK{UI%6k]wGURIMk]TSk{/U$wGK{UI%6k]wGURIMk]TSk{/U$wGK{UI%6k]wGURIMk]TSk{/U$wGK{UI%6k]wGURIJI$RI$I%$'1]ŠI)I' RI$I%&!5 V5|W +X'SRI$RI$I%)$IJI$RI$I%)HJJRI$I$$I)I$JRI$I$$I)I$JRI$I$$I)I$JRI$I$$/ )I% )I$JRI$I$$I)I$JRI$I$$I)I$JRxLJRI$I$$I)I$JRI$I$BI $$I)I$JRI$I$$I)I$JRI$I$$I)yJI)I$JRI$I$JI$I%*'LJe&~I)I$`⠝2J\&I$&I%)KH򢔤$I)IJI$)8DBI)I$JRI$I$$I)I$JRI$I$)JgqILŠ$I)I$@CDI$I$$I)I$JRI$I%,I$$*1%#I$RI$$n4;"VZ?X%?L$I)U$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$O%*+uD?Imxs$)pgYKu~LУi?~g{{<ܘt~#~a{'6K +~?r_`Oܽ揹;z{愽| O&tߏNhGIG܏OMWx{MgBck>|oADZ^zE}>c?4}{T| +F;'?0}o~)\(^iƱ1y +x )$IJI$RI$I%)$IJI%&N)I!2JRI$I$$I)I$JR}$I$'2I)I$JRI$I$$I)I$JRI$I$$I)I$JRI$I$$RI%)$ILM ΫwoJG!pqIN| +KGr'J7M Gρ^:%_>i?>©>+)&O.0|'>" ?>}_ߘ>©-?>G +{eSd{l. |%u/ieꝻȮK;YbƐQMDI%)$IJI$RI$I%2٤)$$I)I$I$t($I)I$JRI$I$$I)I$JRI$I$%)$I$$I)I$JRI$I$$I)I$JRI$I$$I)RI$$I)I$JRI$I$$I)r)I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RՁ95X,nK"RI$I$$I)I$JRI$I$$I)I')I' %)$IJI$RI$ E a%&Qx]#c֎^-kyJJB)]`$$$IN$*hN@4XR:bI"U+jE&NZ)(]W"aNRxp(H%0 LP/+y4/@ʇ`\~kՈlI"!2RJRI$I$$I)xM*Nyw*))RI$I%)$&IJI$RNIJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%.V}ɡyw|f(LPz NBc\'!%1DLBRQNDd$(l% %hTzE4]ZA l⹵G5Hpx^ǥZj?#䦄bIL$$LI$$I)I$jJY)I<$I$I%)$IJI$RI$I%)$IKdIJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$)I$JRI$I$-]g/ߑXPIO $J~UI$RI(IJI$RI$Jd%$eVUm(:)rQJPS6\Y13RR'&S$$I)I$JRI$Yb [/WX{ȻTɪ\( +.t(ײM/>dAO+x&AƸ^F%0BA0LB +IHO԰S6%rGdb?rY):H"b@EA40.x'ƺrVO Jb!vY^Cl}故SP.fu{7J)(]O7y^ w;7JiB?oޟXE-q8i(]x-OޗU<% 'ſzom2GvSBP,j%C*A%dCʠN,lC4∢I$$I)I$JRI)6$2T23'E+my di.%LʿxO?>k?\dc[ y$'{KOI$JI[7V/cy?8M>bz?hdҳXcaTK:ۭO"nH=U9I$z7wC|Ұ$m2&%=ڗMa&eOS[qh6V,R5Ki eC.?%+.oZ?4B/&Ws6YWsZbzX߼IROeXHjt%"a< )[SD'("!{"ϴe86ic[hqSxiPV>s 1 TB +.A8M %s\$O JxH$,&X&xI)!-E$1>З *HB>ߨu1 mbкb9ދKI= +l0[:+|{/Sw% HECW?uƞ4~mƐ + e+TpܥҜ M&ҴBpO.ķUY l9JtjmyOjh +T *󽔚Gd5_]>m6k;Nrr"e4o{;]+N|9N4JGDK"UNj/e q hఝodnqqP~u'c[hpnG.,mPS.&Crӡ~W-NF>BƊ9H&2SR RRf j_pO u$La"Qe +q *[a c㰽bܴͤ<, $$IK$WCK껺ұjVC7/S"$+gt`1W9P!Ej–0!21kS)UjNk! ZCtD YE+d*y +*>+lgBt >-o;ĔJ+3YԝϟeS#_~ :_I+Bl"Ge˳Ɓ +Kv2"SNԁMJrL5N(9xأ 0.o-.L Xd&4 R‰)xy5s=KYX?z՜zY}W&V_VC='c+ld)nU"$IRĀ-hB澾}5x }Ť~ +Z{-$R!I$JRkcnJvy âBS +LK]mBy+SO$Yfpxiy±f),I'I$JRI$I$2r$$I)IS$I$$I)I$JdRRSk7 PIJZU&,Id>!%?HI)U$IJI$RI$I%)$IJI$RI$I%)%'W I$$I)Kkb̚üebiФ: ,ܼ^{*_Zrj(O!y!*~EɏC!Yv ĥtkŖs)z/?Sh-r +CUR-ZS$Yz`o/w.+f L{)eMeSY}5xht.eۏXfHJ|m7wcQGԷ]onQ.^jG?_]kPorb!V[VZJRRR+WRxtX {Zʌ9ܟ%]Vܽ,qp*HA btP1@])s )VA1œJuʵ̱A . T( +^CR{߮YV'_l=ԁ^YN}]n^9uǢ*4rE -Nt'^X?ƎCov7V߼hT\wD2XNx'gTU H0J%1,C 칿^ΕFL:@F"ʞYW~M }JRSTT^P,`% ~}uJYG)4[Tr3a^3kL BAmB`w&"KOW{\;zӂ?- 'k_wE +ߓཱིtK)R?0kܭBR UɵM +r@Xy]qq9J-IrqIOܵp>cljKݩKrvn@P%"e}ZOk(aak?I]pYW1~Cе&|UP]Dc~}~߽t/ouO;kYP~=_7up%A}NЄXRs}"пŮq\>(xXŪtWOE!otNx +)L +JbX"SJ*X3K[><5S]~Օa\w8%WVԻ?aH~Aq>kD%s %?E </'~GPKXߥ'E-*Yrmq j`TIM%, b&({ۊ9 +l%d1<&ILI$Jotvxx_=BΩm|=(m uS!sQ~+a{0DT&%5r'T βF5 nayԱad7$26DJuI$RI$I%)$ILE$RI$L&D' %)$IJI$RI$[)I%)$IJ[?U+ߓ\X>׻%I$TI%. &I$I%)$IJI$RdRI$I%/2I$$I)I$JRI$)JI$%)$+ܾlf7/t$/|ĬV`yNdS +NQMS)?vo~q^J񣙺W'\!V1Ԕr)JI8Uzk|HUo}LVSaIO5p +!!Ju!vP>K13ђ[٠J~sՑ$PH؛Z34M+)J\3;ңgw/*]-mcDʱ J]o^جzON +p%^ȯ5ή".0ggrj~$iۓJJkZ^/z%cWj.?짶L0T.GbE1Rlh]irzՓM^~Z'CKt~[[GrS̠Tʜ*X0S_XrՑc\V\L~,w> +,+wܬX3̇^6v^1Gb1)Be>]`jiH z~U6(['htw+T*"mͥS L\ +jm%Oxde}gš?BMp^~]*hcRu#6.ʆ)V;l,QI%=՟w3t+]뾍Ll.iܑ03*˸*%>100~͔8wet O[u?KUk;K[[4JX={ZD$(xr@։bALx\wR{_P ,xDҟw̦밦fM!{xd$X?ZHO ^z-}1+) uBR%4!$M)da!mR9-a/ ǩ9.:Va,{z-MQ~̨9Mڕ)a('Z =^h706(FoQIJךlOuvyLq;?5߂|dI$BI$Ԝ/;?zhYW?t~E*ME~ܔ )\pwfA%yWV G UrN$o0<fBa4!51L?ƞ?&EVRwܸϔHX տůA=~ߑBC~ޟ[X 4PSPWrr^Ξ *c:c ^abٝ,bga$?5,᎖+ou\I>jJEllc$J}?_׳EqѮAkL:_T~WPm {t3EPBAe|ӻ-#~ M+L[69(H߽p#%ym58eНTKDI$XJi7։']AOg34㫗DTFUmR<W@'ggfY>Z< A/57 tR&g6Wl?c, zbOgG|ʓ $ƤI%)Iq0wpIO]V`UY2ED&-R:!6+#9~N7?wYjXTI$$JRI$I$I%)$IJI$SjVXUJRIJI$RI$I%)$IJI$R>Ig>~:2YIOѩ$J~UI$RI$I%)$IJI$RI$dI%)$IJI$RI$I%)$IJI$$ +XѢOU.}9NN &N\E)*FKJ!OtNS  .YqI@VFjI$RI$ M>W<OyH#AObNk^WlC5W33=}S$Fŧphan}P^K%>Ҩkk<V(T`)&/ + +R1Ǿ* +6fAqIAVz L/x4 +kh >}!W2$.uNФ+鴻Jn^~YC5;L/ M )qkBerm5LuGRt`S ON>}WtEiTJ}Кe)PY۩\WClmEkVן#R@>CXb^ysP= *`!1OBJ@HPdW&mT +M )i_Ii xh+/i9^%l>NOJ:2⽓WJy"J?nc<^M^ƅ-)r%BmeWϦ]m/S.#䟎6vJiI%:$I)I$JT unPҫ-`p)n BWߦ>yoKӵZ:9oe5b" CB!hU:Ma+ +IZV?oXo[ W괏BQ*~w"V ؐ)вI$h^3<[?%4/XMeʽuݨPetRpS( +q`$9E?;? W=k]U7^7wGՇK hLs+ +Ѡyg龵hzye&,%0Vog.AE{3T+2(I%2$I)I$JT $RS$SnIJI%&rJtzGwU|VѠ}dtk ;+:2X + -sGAIp;OsQH>aYja+ 2,>C?} +~t ÇLզ5$yvh/H8ZYoB!F|(–Ue^VgE|a{OrWy;}Χ{{ò5I%*$I)I$J^M !rYy^ 8{ݩMBrB\[ʮ\JֆX\zwG(/uYn#/hxg >̦={m6ZBEɵQ.ZTJ$=*SO3׼lG8G*'rOܟUo_R!qx$Qoi y_H\Q;GS5[}O[68%X#kOw\vF[ |e>8Z&JЏUWrĪi tZ\ +Z 4)€\Y][ 8rAOXdrBIvУ\ PܗF|OeiʌB@Ҟ{oկصI2()R*)ܘ95s}RSggVPe"tjOtB Q +dr+^6ce^pfI$\b8t^а-,gB1.[)&vVy˗2-zk/iw}L#ԲO0I+ p%<$)')I$I$$I)I$JRI$qdRaRS, hI$$I)I$JR,58NMq⒟I$I$$I)I$JRI$I$$I)I$JRI$I$$I)I$JRxL\k䒑e Ct+:-L})@ZV0~ّ[Cs>M2/Uz[X !@^S2]K.L)`y/6IZ|.[SH)9R"N.uEFzMdX=%DX;^xM`o +:\pSd}?BCh{=ò.78I(R;%*oI ƐmcQFTJRJ%%)82zk$W~]ߣ^*=# +[{~S6Gⴽ0 Rb{'˻`br_bSoPq01 .z=#]v !i E!yHꔨAs,Qe-~k^X(xc(Fn ߨk]eaWQFNt;:UI︯zs<o~~p#z/TXÆS+INC;H>!wS~=ey[6XַB4Vȅ_+V"R.-v:TU}A_:E)%4P Πd ¾gt][}/{.{_ՖuGE\sH>W-n"Ƙ{,S$&R_};?<2$Ap?}[5E 9W>7\~ؔRa.Peu5?aS(~0m%."yqkf ix.?va3+'E=ZqO@Z_kkj1 6Wra"T}U9 \W<hcrWڍ?~9N?v?ܗGJqZ)3GbH)8QAs?_H+gV=I+\ ±f),I)}YVEmTkD,?_ B!C, L +S*D9OZ\xWLoqw}} S1Ɋp+W1. +U}YH$~EAp^S,.?*}[;+q47츯#!(H JI$I%)$IJI$RI$ DJRI$I$$I)I$JR> g\K?׸IOi$J~UI$RI$JRH I%)$IJI$RI$I%)$IJI$RI$$RzޝLf ܾMh$: S*b NJ12jRrHrdz^n2ez>>0OedI= +I$S?͆^$#ad=EtŔ}Ң&\?T][SA>jXgGZ]Ո;HH5;@CFQ{2ԮSD$r+/qװ(iy&}^gY]E%b3x_9 9ԫqn 5z44 D(WaSiQhR嶪]kTu" &>TROi{şY4;qWg[5yՎz]i)`@Ж*.Z;FPU.cNvN__Ykp_~+a1IS}EQq:h)BdxQ"xO)Aht#U]q\!|V#NDߙM.2UJ:ͩĮf9Q˗>_Q/X.9n^ϩ7[et?GB~TCLU HNLBJU+ ;f>Q+x'RA\ca)d%TLL%r*g a%Zu?/o;ЬGNlV>lUGw{-VzC?,m%JP)ʅs'6R Q d7 C#sQqLBSQO$u0~^O+jS%UHXӲ.ܥjQ9>JS̬8dR8zuC~e> n7O:ƫPtvk+"S-8% vVu +2Li3cA>) TWnOOcMm ϕ+XA%Q~UWhx@Psŝř1؍WĬ~|V* $V Ӓ/% XLI lNW _Dgw !9jV}I^}]sPÔr2L_<&zSzfpWWYz1!񔂟>ƥVCtI+2!)d*\6'(6?w.^U3~L#ԲOI+ I$$I)I$JRI$I$$I)I$JRI$I$$I)Ksh|V)$ԒI%?*I)I$JR+% > +I$$I)I$JRI$I$$I)I$JRI$I$C7{5~@{ ̦a+AM&)I)=ㄋCKHJDEiVȹD1?X)R\W +[\sْ % +dI)$IMpmWt.ާP|[V~Yէ5 hwX*ma׸CBcK&Sxm%DJ`qۡ$e8u` YwvNE[_Iasνܯ#Xo:/*cE^dž_C%- )QMw +)I> $%)Q#EO<ƺn]'׼d8o\Ҟ+_^lQ\k1|Aܜ1ރw6y=8ʿƆosk$ g}&ǎ&b+1X ^KbcV;'Gƞ 0ƀ;2옶h楺T4W3RLj_=Ң 16TxJP%ELŽ\{EI%1z^TT0K&P +*H] Lp|R!x ݁S0Q[<&U$6 HRI%*$I)I$JRI$I$$I)I$JRI$I$$I)I$JR*[?T&IO)$J~UI$R())DBI$I$$I)I$JRI$I$$I)I$JRI$I$e;a ϭ,VBI)?\rBn>7Կ_ $i!,~RJG-` X%Jf瓩A)I%)$IJI$RdRz3_w0|B8yY)H)_Uƍc9y(pFk̬}@:S\!VwgĪR$PI%)_v"$,~-Ϥ)?_K:JzQ] ILKI)p[]a$w?>eͤ[ӷb7.ygjJLoW4ToK_7ԇ.i$*ސM?x}˜I* +.#p,yY: %$iLIQ$$I)I$JTJmbu;0߂ɿxҩ?I|,~arJS}/5jA?4~`eprr\!V]~';<ǀejL$˥4JR_YoCmNuIOH?X)㇕\) + +? (pr咔)r_xrҔAOT?.P㍓rTnUR^F JRGe)$2JgUƒpj^ϥ)R}~z?.~RW +CP.vROE?2PUaʌOԕILaaާU@sJJzON>r撔OJ~r_,~p5)JT?_r3>q)JoT._)=.Y$Vʰ ٌU!2R@H"nSV'y,!;Gq,N4`"G^H҇UZ<͎'˲I%)$IJL>hV4;iJPӪԤ~k4egV>wȿFĮ:R܏E͹ly?5FRI*RI$%a8[l2K|e* +{_Be)J?PVIPS=&_థ)J(?bJIPS#(m}f$*RI$I$$I)I$JRI$I$$I)I$JRI$I$$I)KoꃃrY>+kU_!Oi$ +~UI$RI$I%)$IJI$RI$HIJI$RI$I%)$IJI$Rj6IB]kEO.wܗqroAS+|g%t]O~ʷ%2wܽo`sY[I @!cDNKHCYFS@2֔I$$I)I$JRI$5o}2%@צdti%xM2J|* |E8Wi-zSr x 5N&*$/l{/Ť֏rښl/q5V Fywp96Iu/^ٟ[m᠅ s'DTr]C){ %t\1k{[4J|$)$IJI$RI$I%)%suM䮏#\[Kwoi?rJyA)I$JRI% )xOtQzSz-Y^>o܁%ݩnwsPiݎBV|%tt Ow +rI$$$$I)I$6RRJI$$Z))I$?DoTx9@u@IRH {W@^ߩza*H|VWW3=T8©ėMq.e8BS'L"SI$)$R$JRxRˠљ.`v/VSqp}x R)$&IJI$RI$I%)$IJI$RI$R )I$S$JRI#c㜇I&JBOʉ>IŤj4Jԉ$ILvzWoT,I'}G`M>' B/@[K \JEʀGa )$IJOL6u슘$RYWGҟI.78(I$JRI$I$$I)I$JRI$I$$I)I$JRI$I$$I)I-.\Hejwlvh+ +yI%)$IJI$I$RI$I%)$IJI$RI$I%)$IJI$RWXKoꃣ&!O$ +~UI$RI$$GPZ'JG)')I$JRI$JRJ`A%)$IJI$RI<$I$||}IOA2᤯gۢH?%zѪ&>]^A+`=|Q>"xRKRX%'ʰ-K඾b \f)WzH\~乻4Y;\ + hX)iul05+Z97kvP>6 qWI:.șѥS/@YW>fi Ǿtq,o:(ˉN +I% }+Wa~$Q>ϊ2M8wc~f+b7!>{(9_ Wkמ}LFSd/.1%Ϗ{?\58i\e:\\~(c^a*k|^W0/2H/_:/=` kcyw)@QyX "n`]'w}W}[lW 2ְu$k롡߯@ SᲬV亟W{ h0ߊ;7skxRCW(mp/w"^kӠ7kBVi*^F >[|g~F=1 s)8{|LSJ>?N#4]oEޱc+k^(L1 ҕCW(p]ں$m{ܼC< +BVi/1e&Bӵ"IQ }Wb.Ϯ}4!b?G$~1oRIx/yU<9'Va}bac5$/wXG  *`xz.$ScE{7 D^G|#^Uchg @Q~R >Kq:-]5ր31inZƪ|#jp]Ϫ`]4X k h|wl&ںk` ^:,njy=Oщ[Xh'}LȴKI;jxf945G{j *ahrܽWa}zH=*Tu{j)Ke$|Gy~/IY[+e~&U?Sې^ &g<}| A ݽ +@wzK\ O ['A="_#{zM6d>B/H5T`mE!Ulꓙ q5ڴkyy};XjxMsߩ8#h`nZ}p>qSe +s#skn&kjU>2UuFo1.7ճl)^p'r{@ʞOG1 O)_VGElՎտܺouЫȨcAh|jߪX ,YBjl |iBj`n?Lub$ .ں{=qHKU;x.Uw+X,iH+>׉T!6)ʊұkCU6=md}֊sp\q44vgezZKSly?_ia"R5%"^-%wl{A$+ݮhΉi41\!!}꡻Zp+h@pB3ҩY=8^wPvKIh 1pY{CviT@J}KGQ\%WuN n*4|U*ilef[+ \g -렅Ӊv"Eҟ,#qMxw^zH:4|%p%=^>;+}uSD1*=O"YӬRs`my ^~H}XfCD:&šS6M8F*UqsZ7S}:(^պ Y-sFM8^2ޝ? کڜ0xV c~ /b6O|bWW|B3ז4A ?'3HL*)v3!Γ]ihO]t5pJ@J;0_g ' +R Oi])dOYIG>* zժzsDƎp4A;U5%"M,vJ߫Y`n{ĝcW6t=eg6cJS+1?зގ+[73kB]Į- Gw5))q%ANI$JRI$I$$I)I$JRI$I$$I)I$JRI$I$-.ɬyɮ?x"&I TI%)$IJRS"QI$I%)$IJI$RI$I%)$IJRRIJI<&IJI$Sq}έZ٥sJ+E-fl$G5 +[Rq>ӒjX3}_z n^v|?6ij\mc3`h!yP5B1(}[Z8ygVV݆֛,쮉M]%Fҟƞ M z}iVKrv;Qq6-^~b&ܞN@vp?G3s_t_r|xK(EoPtyO[$tvM^_Xcl+Փzs"QSSbfz8@\ι}+O*=:}enB:AO]rK;I%Õ3p\ߒ;Jw1\GN +HK^Sv4 /ϑ@B:>8.2uY; +s>Kg̭5ʐJu?ŦSkÉ-~zXTXp{콵2tuz7>eӏ3,mUxkoQ֞uϪ_EBKX}Hv3C:_h7ۢ_mjhJ3y$u\ꮧeLq$Ƌ4j?_~Օ5({/y(<YeecI]gC!~OVh }JrE{5-koy']#pv^k32}KoDY$M +Ik;'ޅ oУ׺:Cle]fƁOtMA* )t:Gz[0KNk+5.qͯ_z֫ǵ8@vToQ7<5+Es\& ky?F6u7WsVhp?;6kj|J;%[9B+.cz8~ìa!t[}s >7~r*rPQjVw-/eOu0Wc\ pV/ן! `mpoM/8_d`D4:TO[[ܿS 3[TqV?P 8 b}}dn!G\NU|d6^M3s  84.æ}\FƉBRP=6{ZlV[`􁑤/ ~cIߊn#%O٪c<^a22l@S>Orlwǩ!:e*۸_Xؾ0qJlWq}\-~\KYȢi| ^?h$׎aRms@@^_/32MXx_YMGitU0͌ƃOއ)13&1 иINav"t~ΒNҧ'bG\Ou_BVV22WMw= O~?K.zWGyqrsEcн'b*BqiO51s*KN:K1>S;=G k]|V6h)ON2`4^ј}nh+J>Y'WXGDҟ/dbtz-Lgpм]Comr&R#=AowrP?N@ũ ̲_Gx5z~u¦GoRV\duY2fSzE)c|ʧLG:v?ٱ~'5WVT?/Z?u1> 8x}UՎ'攀S3`R +?QW:_O6>z=목w:BO_wֶ9ܟg;:'p3-?8?zREN'p` ๏񧓽WkSմR +s>uʁÉ^K~Cqs]c+: +t?Q}|y{<_XDXgd##is4¡ayL]@j7d@:V+Ḧ́F)c}Vجz?XӚ0w 51 ?>g2v&rf3>&y*ɸWdDy3b<\ֺ(GS}\?Pf;?'vWPG34VHhF9AzkӾF5y꾕Bο0k}r_"5yb:񭓵grevRx4/3~@g#%8{ Q6Xx+.YG;eM~q".i}[Fkk7 {̹yO+۾ lVOގMЃS88Ĵw.OW"rj-EK c$9A%zpk~KdzK<zQ}kI'^s1zݍcljuMg ľd&v5S$XI%)$IJI$RI$I%)$IJI$RI$)I%)$̤$RX,š?)i$IOʩ$JRI$I$$I)I$JRI$I$$I)I$JRI$I$JI$ +Mf vcD8J^D7٨cO_ifmp4/,Y>៺?*:q?Ŏ.\B?cI#AhzNZy?o2{]xa,=d4Gs7L{OY?dx4CWgOm25Nx +r+z6 ŷJunu Fմ'Z3>=6%e-1KaWW&DN}"CI^2~k*Yh^)~l,,$ޛW 9>Ȳc :?@bO12|?tϩ+'BG^_onS/ez5?ƞNUoaU_׉hntѣ9 c^_ٱw~b})}˰YB<% "sVE1nls^+yן@A)cEvx֜ߵg]?x lR/Z6;?*>C6{Wq[-q]*Ԟ1*{j+44p Ρ*%vFUOpҼ_sL W3PO/PWy/=1E7{BG4?,s)^n:LBN$d:] kD7?WpJ ZgUo.;m8e{sO^={^ʜ 4 j_ϷmHgh^'#9;KOwJ^Ks)I`JvZYŠ[:)-Ξ)-X?cnѾKG0c 2ecOy%뾥dٕ,ˉX2y0ϫc<av!Nh$NzA޵@3DoGGۖ }۾K1v >6ި| KE?XYhy$ `/3yKX +u+$I;Ч-+i'%sQV߰Sn+޳{F Պ@@Y˧uMOzm=^M^u.lߺW2x埼B^{J:AGw65QLװw>+DCDIN +I׵9]H@[~Y +u YYűQ@c@DT^~] ־\~^[+|vPꄥ<:zx`tX9@t K3:9N@jTM%7j?'(ROܸ/bU< .]5xB2_~ښOLVY٣][pǥ=SVGKz]ޛ 8ۍ|>}BZOԜq9w޽VVVl?}nՋatْ9h.5}A7ݚ%zM¶%/n@v~ Ӌyv1cq|59 nsy>W_XNh#踹\A/;遛tAC'^hǭ|ķ?Elg^AfS<ݹ{#=,22;4v?'^U,9~HǭJ_*3hs%wc@5im h;&`+Kk(}l`ҍ>?QrO륡ASoYg!o ַV+f}ܻΩxĩ<N{F%B8}Ul+ُOhBjrlZSIx^MACqzݱP|W\ԫ_ s{J@JckϏWF'ٱ;wޛLSm65>%zǮ˱+i20-!dɤ~c}"7;]2wy:-}g^~S{'X5Nw` +}-ۊZ7OoƷde;tB ~f=__Vs mnq0Zg +,}B5>Qbįt̆ڮhuPg,o{e4%::>%Z^[{7PQ[OW)?hc|RG^ e}*ǩ"opo ߺf?c|>:/vhRO3=l(?Kni1^б~C4%/ggl7sZe4!- [kc3L[W]/82Q@ݗ4xV_S?W*]~&V:~ϊOV`]> +?Z_ӠGh }k5IRєw}˺~>+ۮuGJA]_P}O^{q?>e \wi\h5ǒ#u\߰?t^sOu ӈsⷧKi}tεZ\_A->O.r$\go[(A+~8gwY 8a#w}6JW}Hyb\ Wq#M!r\ 4z}+s\MsrJ9kcE1-&))PR-RI$I$$I)I$JRI$RI$I%)$IJI$RI$I%)i}^ dW?ʳV%?L$I)U$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I8H)jӊxCZZݓgq"nL/*͞:C FnOmC0yzyDCN팭'qE^peJ}'z(5K)Cȶ]X.1:9ZQϧ9^^C$;3o$GWI\d.u-8rR:"ۺW֊sıUcЯe +z}j5a6\!y/85A\N~%Q@+XK[mT⼄Jqqo +Sܗ13)%yyw*lkE>1]HcH21ťs4_L xBnڱKW7ifji&S6gTe,$hu_S(s0:*r ?z0>X5,>[G+S |UTjNϲ5"%qP::}X`8hW*l%6){:OHGygV4\miy.wwK)OWRn>#5x㸽y+)uXH>J^>)EO}tV:̼e岓]d@.Z7]\hԀKJL@Zg$G>+ȥO$H +RTRI/^T0!K׎ m۸h x'P~'qoG'9sO>weYYSv NCyHWu|Ey#U~KFC5 +3eyƎi *].*Ǒˌ|\Ԭ<鸟\*zO}u2^F|W+=r/U>ӺM]6MMV'?L¬ "Dʶq'K!_@ g3 0T,EUX^7FK2AuKlďl[W22wJ^MfAyGI :ɫ0?ܽwfgs#UtoYf|S[Mh֏Uڜ ȆyDo+##)s'Ħ~){h6 +VGNU=W uM/tҼFPe-NF)J uW]V] E%ם$40%$%n[[<k.$솞JUl?=zoUq>2Eoq\wha"I\JD9ď9n踏\=׾)|Do޸q[}r~hrfGPTe䐍 +S[8J}g'9?BAB>W5ǯQBֿ9I/9kwR7 +lbuﳴ.Vs$@ E S[zG}@`vSKJķ>˛$y*l5 +QO294xFnG'RwQ |UdDžI2; a05kæv92quh܉:0\ݓC;ٛCKԇY\~4Dcշ22X=C;=ǝJPER +)7)U64ILI$6YBIJ H)%0jrBNrJRJDwHEKJl&()E2GDn䔴$tNR)R2}Ȅ9) TͺT$ h:X. )\ JS$B +\&S e'В +2")H$Ή9ӄ) %.S%)$JD$QIKRI%)(R-RRL%*R L*Ru8y$A!" pCw:WW/ +ۺxɒI%"$I)I$JRI$I$$I)I$JRI'RR$JRI$I$-.s5hz7锒I%?*I)I$JRI$I$$I)I$JRI$I$$I)I$JRI$&D/zD?gG^=]7S!_p"eh#CrRIBJRRI)I$JRI$I$$} )I'.)I$JT$:$$E%))I$RS&ꠔ)$JRI$ښ$RR2I)ʌ$ 'IK% 'jJY:d%)$IJIJ$RJTS$xL$yS(@89ۇ: 0=nXkc %7ݍ]/1weNNtZL g⽜"$0RE%/dt 2pL"&N&IL( I+ S#2JRxDRIL鎩J@JT&N])rĩF3iLSLIX (RL))Q*2)$. JI];a2E%) ) 2q﴾왆ےK IKgtJc)AK)#YT!%( p2'^ .dTTKlD$e)IQSEGu" =HL)tBlX{6(l 1zeDKm ZXBCnQ"RR"ԃJQ)RXQ:&ڂT$EH%$-b@:IK$JJ\ LMJQI$S'('%,>ԀIJ:`BiLI:dI)tlCa;f?x^յyAĔxTI)$IJI$RI$I%)$IJI$RI$I%)$IJI$RVʳAl_RSI$RI$I%)$IJI$RI$I%)$IJI$RI$dI%)I*LԢE;hg^=xWXU7_Ѣ=8BHHI$I%.Z)R $$I$0Sdq}ɊJRI$xLRRJIJI$RBJZSI%)$JY$IJI(I%*TgU)d)$) +)%*M)JJ_rd))hI92%/ I%d$O BNIc)I)#.5i."pnd{vU;Gi5 +{m,'}iis +tY}]HŨD_ KJ%yN/MH*GU$-*:Q[M^'/hKb''j`K-**ĄÎQ<@JpLBi$jĈJ(!tHtLRKɦIIL`aoYcTbѓG/>[!eBl< *i> +cgP;c`P7UjdIup³_R{;݊L8 *WX:D8=iYI'ќ~ +NWVY՞4:Pe^̪&==GdlBxVr0O#wQF"pBFTȿHQRڢIٸDIHdJZ6S=!$PI$IRTJ )hLQEJ? )b$ +Rd<ȩ'OԔNLD$!dS73II'IJ-A8b.iLZdF]Ze;Z +.:#i*xS_[R%bGjaZ6JH!Zǝw$Ȁ綍Wcf<^Є`J$jSIhkE2BFNIGgT~d]ՒeFUƩ&Up#7=_]4 5b +rd4l)F +',{ )@Lt:J-}hAjs{FNӨ\%-(!DI$NI% I$R)ΩR$RH|B&?#;dGPEۺW*<[*JI$TI$'LJRI$DO#JBI$$I)I$JRI$pS$$I)JCn(TbSI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJRjS=;JQucWt[??">L)$z$I)I% $I%. &dI$RHI%)$IJI"IJI$))dI%)$IJI$R钔%)$IKLxIKJI$ 2J^SJt)xLtBD% 鬼JD)䊖AИAKE9%0lr) !*N3)rTJAЙ$LQR*2I$I+R*S~!<4NvA67d⇑}^\> &Qu?D—܌dQ :EH*B+[q* +Ҷ2k;˷}! Т)SګLfߣl(TpkZEFOWP}\9oEe&EZ-':7Gw4hv}TӨL w # (LyıFl⇻HI +sa42 REOC +))C 2tT)d%/)IK)')dTR@Jm)psv蘴h*GDO(-Y%H29S<-X6^9 +Ye3'pGFy[# sdr6V *Lr_ )Kl<g Ɇe|bg1#"Jv2= +;6袔,bm#'Zq'0䣘`]a?I +EvMې٧ΊX a|3٩P ' ?@wP-C +i*OB۳2(9nO H" dU'Y'F)h=a\s||$Jd(TSRSI$)<$IY$I +I$R'!"c! Kb홱wPE{xgS/*<[*K$JEI$RI$I%)$IJI$RI$I%)$IJI$B )I$tSj{?_RSI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJSbSml$Z?"**ŌP\QKlCcwD{ +a,!3>,A,iT\@4E{!R$dIHI+% RC %(c!|HR7}} bWuCe3Ȓ$jI$I%)$IJI$RI$I%)$IJI$RI$I%)^WvUE^o)q$IOʩ$JRI$I$$I)I$JRI$I$$I)I$JRI$I$)ʂ|$T?K=q1!xvv;c^~V'R-VН$' 2*RI% )I%,)ZĠ1JBHRI$WRI2J^JsdQPdB ZNJRI$O 8 "BhN)JI9)`a9LtRQSSOn)R\$J*T$)I%)$BX" '+9ӄILa(R(JRR$S()PIn0RDRJbILvHOStp)$% +@cJQIHhJJb"Rqj|r'oQX} +/Q~1.!F#0!4w[}cCnh#ޑFl_#Ч!Q7\)CH +`A|h%$mşD½GZ{92TT(~Ӧ*?kַGXDp$untk*<73nAViWU`"/n\D8(=7iPm.f pH$\ӢDa:@#v J>N=ҖS5 @mFk<qrB +[FAZR:!l:$tm{㊵[?ܡxlI_LD6t_`g?}_Qu! lTj?xbN3O^dII$jI$I%)$IJI$RI$I%)$IJI$RI$I%)_vUA]WvT:I$TI%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RANRSCijXʽT??8?7E )I$J\LӢ )A)4$Rsf=1* s.YA*PdY8)XVxJ!DJ'%%(2t)I$Ia(IJLRá(L)I% **X<$.\;%?)d@JW)OJ^#ENRS:*  +S''1II4J +V8N)VUtۨDuh A.r-1<+aBseQ`R-)&R!2TR.QO R)vjJQ')R0;R()nSRڛ-mM)Ge MJ_BjnH)0r,51ȼ1{Whn+(JI$TI$$I)I$JRI$I$$I)I$JRI$I$$I)JGzM]Wv~T:I$TI%)$IJI$RI$I%)$IJI$RI$I%)$IJI$R(B|J}ށ!U٣ܩ?^PŲk'J<$)dxJR'.-%9.L;?-$㸷UUu snRM"s|a9)r%hJJb'2b˽NS`,қ!JRdT**TpJRLI:BrԊP +" BD&J0!9I$ĈR%.SH Q4AWqpF;mDBsqz{qIV@Nq:,!ND")w¥w V1d +Hp]Aq:]W+8F0mbz86THFpB% +f`S (RT DN'H1';&**Y9J)CJ %-h%- (Q(0NPJ%? 2 +c)TS(셈L[ +Nl'k%IMrRRke7()b| +ndp R2H:4M*\RwDT~>wXh2A3kC]¥էV8qn^Vb +q05 l7PaatnhoF'Z]JD ƫO?يeZ{fЦֺx-, R)I\Ksq)?RB+܈x.ڳ'A·U1x7K½V?o/w]SSPn?ײ;=M/cfPܢ?|={_Y" 'LW5 5?_L+IA6]e9  $J\ +If|RwoR*PB4+]Jh _zYFJršbZ<^"rv虰YNã +oǍ?tV*)<?|H- +ثuK |uL_IHIq![Y"{)Q- ƪV#E)Rk~0mL]Gk6 +#^5lner8Bd4/UzTb|J9%MBv6voj*Lk*͆u(Vl-2V m u7AQ5+p?HoӇ>#hW:ӶcYG~B5{_lYG~B5EeRI$ZI%)$IJI$RI$I%)$IJI$RI$I%)$IJW:G]ASWz(J~I$S]g{3ų0uoꊪI$$I)I$JRI$I$$I)I$JRI$I$$I)@gQPSIO&U,w^Wcij[;R-yZ5HV[8j[PR L(ґrFDŽ +e3V(Sk0.[IKK6nR&R !¦*DJApH Rp–ĀTI:D%¥D'<¦3))اN(iN'! +R))4bDtJ)XT@:GVl8UcB:M!1in w 0&)6ĈN'nMa^s䒒ޤ_<(M1Sk_|)D}3+6ɰ&NbSizTB)oR8)h +@&)RR)BvN\1LtN"L%zp'B)bS)JiBr7H›3^S0\*StH>) +R1HF!;Ov1mmagNSuBj!;L\TݩN*`Z4J$:2^0 +#A![xp +ӫ?ln{`:SJ"8i2~&y,\_kBop 48qG"yݺ{Ԍ,NN*ٟT]^}xI*nh%X}'ȓ'DEkcUeyfŒ:c?vZk Oh)Ls: ^?[۷~ܪeeu,;t4܏g( ۿ|P"{"~]Qw(U?Ȋ:RxhQ4׺N6Ϛ^x +l3j4Dmq>)6()uAuĈE@(#2˫KTŶoݯ- Lg٥wli 'D&T澸 +iܶmoU};̩%8ZcTߊC[VrU5.n+FʫhMHG{5 U La]ʠ +2@*l¹cd"Z64"8B1sʅ:y=8U?*lǤ=xaAxjCn-?PY$R-RI$I$$I)I$JRI'IRI$I%)$IJI$R +%?Ez5??}O)$玭QUUQURRI$I%)$IJI$RI$I%)$IJI$RI$d:N⠉O#⒟yc'mMy,t'NW۵$] eLB()b;TfR {Y)%+Q@>(-t)VhsestABd-(ܓ5Műk4LuSh5 +JR-4KV$YM9Q2yFkBSRqRUsA'GT;JS)$LvʟL'*S;_vxTD(5H5*SxO*cI>J$R;'ݡ'] +\)X尦Y*)Rw*q:& JuPvԚ|SdI[oܐgu&be*BҙoOjp*U@M*LfiL6“LNZ +DJ<*QD+ԸQjcpz*bStNV5YjտVjp>WNj.K>@tFΎ_@ !`uяkm[8~ạdep YNU9;(!VܮeuL-]E?âOAuD7We 'g~( ›L^VȰvb @5pu"dZ *^ZCR6[ܦ .ӵԶmEKIS_@Dc6k:۷SD?:|s!W'VXurj]U[v`葑ʅ8O)'QƠ&n7f;)z"PKQ9=e\n)S9LESA$ǗUqܫQ1|E*c5#GN?{&&{#׎j+#E0kyR7UxX'EHO*sμ%yi׿KyQc +nU;$ʒ(awEZ"K|P˽M#_4쯀]PiNT$5WpY_eUQ[,QpYtN +5ЯݢSDs!>,GFJ W,w3NLdcPj?NdɏI]Eqߐ^N-r_ɒ$z$I)p%2RJRI$I$$I)JB#E$I$$I)I$JRI$a|A/o$9dG$YwUZYwU%)$IJI$RI$I%)$IJI$RI$I%)$ILӲGJM~Ԕ)t?Qlq.$%♬*/|JɬАJcTZc1)Hh%¥# KVUh? ȍ(شNӑ)!¤sTı3DSpؑ 5Ap +5[R +M[AݔCTRpM(KSSsOt*'ZBMvŽ&.SD"Oq,kH֜Apcyn\-^cuS85Iڠ +T예1옺SBrw$JMdptHNА +<^J-i5yvFkLZ4L bETXy  +blܗ +>lu{TJ\*VGbԋRXJ((R.LeN!;[T[)NСJj*b%ʓGdiJiw& 0t&BTX3թLt)VǀJ7'TiĴ5Sn*Mka (CRSNZ[ 2 +gڄM +-aCw[&r *l7NHQڗ +7j;)12" F7I풛†uWǦuV~+O:g3lhe X8ۇ S1j?ןV+ȝIZd QcLlhY@{ '|$R ݃^UKPOB K5ɟUP*G/`Ov4U +࣑\}{~|/YV2_ +M4YڱӰޝB67A ʁa_W8mx'Z_Ջ*Eoa6;xA}d+Aԝ xF}%3.RYWr__?>`~̷DfxҮS&Rn;]ԡ$rԮJ 4 +.(PSg׀ekb<M_uUeT:TрZ6ހ2 tP뢐T٦*HS,_QcBṪ$ܨUxXW/ULjUd l:TgTa[ ZJnJl#obJE"{#Jź(E`%KJeN`j[S Rm}Ң +MJ'V8J[R[%HnN\_Ta))gHm@$]8yHMHIL Rm—)Jh +x4Br!H +-B@yIڥJQ)L3x$)p9ӵ AK8Sj,I +]xJ8R"*E@)DStԜQb[*nn)v=Ҥ, pR4_WUʌge!?tO +|ILK]Ύ~ @ 9QH69Ft^TS*DF U7n`ZYN{ʰQD RxT(jumQ $6@Tv?tO$䩽S׎#5T1lZٻB"W=-'>?UVfP$Y_Ny]Er)6{TtZUDٴ•٨R-T;'U6+wޘ״A R{sNk6(hTS'k"@D "QƝJlÑʮI[#eot[FA4F|smpކԢܴNi=^WxW@~#kH&=%x/aB9{g +ĢeI$)$IJI$RI$I%.JRIJI$RI$I%)$IJI$R~!Û )yMmIOuoꊪuoꊪ2RI$$I)I$JRI$I$$I)I$JRI$I$#b {~#a6GIO4~g.?hϒīnCL)Q]aQ N%1-N[ TIJ)ݺ'%%#ܦ +A;HFĔIЦڧ'k'Tjq'6T6$%S)Ǹ蒘5Qfԓl4NY:e$)1 +ERS5 +jl 8RceD(hwSlNBk)VR)`ԋv(ݪTVqR 7W&A(o!AUB[-h:W݈NtQqQTKTGQs[itS:4S% + rgAO=L!\#0(VFM]e,vG"F616uL#LR ܦv' NBh9*`J`Fk 8LХ0 Rml%ʎR-ܣʞU؞ ;SI#TSnB`7Tڅ&7DdJl%H\H-IUlh7hBTJ!L8up`9HAN%ڨR}u-bD9N} mL'`H `U3Iޥn!bڄ'ݷ@֤crڦ!&XX*mDƉL&;+,h­Yn +]@cl;c_1-";ޑw_Ⓢ +^@?J66S6xMc RΈNiw;vV.WNހ +u:(΀l;;^? CVkVۜ!bax"!QF` h߫L= @V'V'GcD-i;-Hk‹wD Bײn[QХ.ɽ2"OPfê!thkÌ~(B7*@}[8ScՎLçTZ7ZlLIJBDq|buޞ =r=E'e=9~tg3o5&yFY`j̃qtYr2Z0۸t"Bx_W\<ʍm7:i +7WKFn9`+F^LKNꥃЭ׺κّ> +HMNA 9О%MldEB!`)ڝD5k&~*x*HN5A)NRA@vI +NS,Ul-heZSsȞȘgmd)c>!:`pOdYB={V~aA^ l+$ITI$$I)I$JRI$I$$&IJI$RI$I%)8H:S\o߈BE%jJ| =gTUUk=gTUTI%)$IJI$RI$I%)$IJI$RI$I%)$IJGc?S?{o_xceUGr.bM"lmyq[S)L)D1, TNRJ4LD)~U1ISgFt?|T?)whQ7쓚 ST]8PVh1C)sȄF5Eb]xCunߪ!b :"5g uQ$wx(xLQ(FIp)2 +)TZς H:)8L^=o~Uy ;[[aSY\K?W/p-geI$)$IJI$RI$I%)8LJRI$I$$I)I$JRI$džXDD\So$P켤?jJ|=gTUUk=gTUTI%)$))d)$$I)I$JRI$I$$I)I$JRI$t͌gIO_y&I4W q>j#H%6JmU:+' ݢMLRJmPE|6-}Ӕa3Q,4 +>HH-Tdꕢ 7'RpFJ -ܕ[8 ‘4ax{G +Sۧ`RLvBZ"5S@MRi;lLրoFMOSi>! +bR11JZRH hW+!VkZ!2lYg] ܦE)ܣ=LB(H +@n)H6TQ(ڗ) +!Н+LVTJNfiF]$)6*N B^)Fp2QZHGj+hFH~DM&lNΪNlIHTCQT$b<ΩɄIR۪t򒩃[)')I\,vƪ.%+hE9ӕ!VbkHI(I IM;tEKJfxLYSRh="嚤 scTjns3 QnSR!"W +TTx b4DiFkgPRת퀩R̨f3A4SUY_GHM|Զ kPU!IHTB3]_&:uQ-OnGiB^{@Bʎ>>nUfp+h8*WFsua[ENNJ Թ9V{ U/ЬKA)X(;}ʻE+H95P' }al˟[6((ڲ](nLJKWq Ҙ[:hY΄ۓQ:'-1ʓ5P)(" +›|#}Ʌ|Wx~v+7U8Ie>ӉgWmT7$z$I)I$JRI$I$$p%%,I$$I)I$JRI$I$#b(>!%?Aڤ$VzVz)I$JRv$LI)I$JRI$I$$I)I$JRI$I$+]7X~UU[_γ)Gj?+ogWOYȹS6Ԛ|UXؖ8MCDRӔ-Td#&7jI$ΉtRs|yMvJa"-T'ئ< 'SHrڕ#4nRIJ'T&+Rń:+Sڧ9JSJjM Jw6-!OnΪ!Vm3bSHTSLFVbS;E=NTt+,*D0fbB-A`wh68)4G2D3 I4Ĝ`N)3f2JpuIv8xӕIZ 0'Lئn3ZB؀T6LN8RJJn$(1ŠʜVegtT@iRC* 3Fe!YT*~+bR'T;d,HjŤh[Nj%"ŽE/Ds! 0&S(EI%3cXe&#*x-??*t +t,>g,[OUx Y$OZI%)$IJI$RI$IJI$RI$I%)$IJI$R14\q.$mRIOoꊪuoꊪI$$I)I$JRI$I$$I)I$JRI$I$$I)JJuoUΑ??*J}GtX?^Wu{I2=JțQ0`aZ Mjdj5ΩZl&Iq%d&sIDSJ҈6R DsHR BԌ3D):-aH7'()ƅ-ѵ,*| TEd);Iw?o<$=XU-B#U2'E"Ĭ)l&"ByR '&B! )[ZCT8$ +Aʐ(<)ʎĭ \;#?:a Z'HtLQ0U@`fgQ8J^<+ajTvh;pZ@e-ک4Lr]mZ͍T²-!򍪘ڒ ƪ.)RRm:J#J e;c>$%ݪvKo"s!"cTA6'--)kHQvLD𒑁:@%-dvIHSR2#J'Wb%+R!)!OjrԓH8S$ +(Gv*ngn*~Iڦ╡8& Rp1 ZiJ@)wHhjc1Klj%h`uLL)IN"eka>A,Z%!Q%89AIZaaW`JJupj収jTRΐ;DEI7D'Kt"pSƚwDsdMj_ +"ͺ)*7/DFV{ޛq$0*ԈSP.HTqErFA8//'c6J"{K`ָh0!2lkiԬΞxXZ:v4c!Պs aI$V_hjpQyڣRRMЛrtj!Jex$RRq_ܚ!\-& Sjm9R&En@)(2/CwY`|6\?UK>ijHs FƂT%iG"Qr!r (1i7jvEJ"ROnŁ=f8%k +Œ h֎9)IԞR Z4*o2Sp3@ŸᐍMQOh슑Bn0hXbSSW<G;ImK3Di@m0TNҕe 3*FE vZVxH (NR#s!6T@9OJMęHN*mO +Dm@z±U.+fvQ-L-l^%dVV=ޫf*Z&nSUFIP@ 1c40*{)$sLnGT C'o +݆5 +cDFt+SPXPy'Q\4|P.;%jcND Q¬U}-ۼʱ\ -qXU@֕3L{ + z@LPΈU+tLjcd"uP5DHw*&*a:YkjkΚ+:7bnNQҫE;I>­yDe!F/qZ{*A4SU%Bvpe +B,; +meCl!r {)kgdUf%68/v +tLha J'Xf‰z;REJw9@8 aCryՔz8(&Ra4EaM]r(H(H `"FRX߈DYp|aF%Q{W|xoIdI=jI$I%)$IJI$RI$I%)$IJI$RI$I%)NJ9?$ʒJ|=gTUUk=gTUTI%)$JY$IJI$RI$I%)$IJI$R=cI%)$IJW` SRkwW NtV~y۸_b'mrD|s#lP{ZW +"-D)a+U,:*{ @I';x)m $:%ja͑'2THjuD,;&,ڦЅmړvjT U1'DI4H+W GE?`t45OHj|!L3𕪑5)4!4o@SL) 5Mw(کh)%LDu()TBv%m|Ҡ24H3Rs+rzb@U&b5Ne3] +*N%xH ڈ5#ZVR۪uD^6 i4RQA{P^̯pT~tRF0 +A0j;Pˡ3-۪gm6SmEFRx&)SOt\aLy)BVcO*&-ڜХĊG5SrQ)5RU1-NKh*PF PSv蝺R'XR2'DMTϵ3Lh)Gg5ANcHwp.%R(NHJ6GTigrHq*FHWrn4mE C#DV`D'ܥhMXNgS꓄RBɜx %2i&{I);k5ג!\LYF:V\4NGp{J~*Y| "M62;+gTp**x Ed=m(1UGVZUĶVY)nC.)PRZFSfħ whT(2"JvKp6@D74rwV%CQTdztI'RI$I$$I)I$JRI$I$$I)I$JRI'))dI%)CE )yROjJ| =gTUUk=gTUTI%)?dJY$IJI$RI$I%)$IJI$RI$I%)hYG ȯ%>џͬx^ջWħدF=ڦS,ܓ\+;U څ"e>c+J蘘Lw4JH'%+Ή)DŤhyjr#DTilRhw-Hݪv>)}-Noh`&uB0hHiʔidx(R۵D!)Jr Rh.()bu0!#ZXD|klsʑgoHQZء)YQw|\ҹ+XNb]ϔ7L$FR;D(Ot T):5ФRVnu ~Ή :>jLtΪm> 퍌%f\LY:H.?+PhJI1$hf]F+ɟZZLG 5b?ډXQ-I{ IILH {ޚ-(ZTj h<(FT +dD(JV<'y3uD%3ҕSlQ"xN╩š`%DmT܈59TH=8Hrm(ITĶ +V@;[5F%#)7M +JG^R?GAtSSѪѵSXI5Sx$X;jBAڦ!n +#y(7R$J4G<+:"M(oz$h|zW + tO;SHO!Urĥ2W3w +Ѐ RcK$i)-蓪 +"(mBa Gʐ6tG'XR6x's;)HiSƈn:Rq*ǒX$j^9r5dNRr:IJWE T p"V,Q/K|LJ<$AtP0# +a=Kf\ +X*p%vֶ +FF<ҸG2TfI'T,SL&$Rv3qLD4S{e8l#I\ОB3JOBiSk -N%#7UXw ☉A"o ęG͛tA ;EkA)gςu_]n%⪶=rY$OZI%)$IJI$RI$I%)$IJI$RI%)$IJI$Rq~~! s~!%?A*InTS=[?][?$I)p4&IJI(I%)$IJI$RI$I%)$IJI$RI$xE 9i}^lW`qp+*Qy.2ޚ{%Ul/l Nr0i[CuDi!!+ꏊBxdӖ +NfJRS0[&w}.m ΃ G\+94vK\* U>tQw#ķNӷaM;%ĥN!' )DRB=8R +nlp6dBma N)mMADK=4Hn\JbuL +[wiiTJSQ,F9MltvǐӲTA앖J9utg JNz`e ;*$ d@LQTTQRhh ҃!9FC2vrMI)5ĕyUn +BKL=w)xLoʼnxR,ݪDJ+؏"!';jfځ*P;tQuFuQD58lf#jX@N]K`Sm%":(n!SJԉw)q)fGqJTgtKuMF-nԭKn3 +s:k7#jb5$k"t +S)e8 !my +GOMjS&8Q ZkIw6Sl8tH$ӻ<,Y)4N^I)<{+R1L2x*mnh"aMTcoj[+88uV*p ]f?rwhgU"4$u舠D&/O2Bx +fJ UDBAK^w!0;A*&Iv0TMIQLf"5Nc䬶j:sBd_]|/hó]WdzjK$ITI$$I)I" +ݧ $I)I$JRI$I$$I)pSIJI$Rq$Z 8|BJ~I4I)>QUUQURRI$ $փg:SJJfm‚I$$I)I$JRI$I$$I)I$JRI$k_ZVG5X$TnM\P-+ՇW9 kK,:n;lvh"e1`>8Eh0!Z[T8UalJS% Z/4;g wu2g 濦x&=,s\ $' `=D5OྂT[IX]Pq}q8I[lL!;D}rKLe;E2g?z{OB5# [JBaTmPonG u@c\')q#f2Ԩ~"?✍+Uܦqz` PAc!<$N-Ac?(زlƒ<)8j8SNr;m LpR$Krp4Dʗ(h)41IPFk25A)ǻT}mvSW%cYp2C!$͈IyP.RZjNW0 lp& +~F#x `JgPNt(I% JNA3q%&jZRN4*EQ ZNQ CGqu"Q5 +@y'߼' R1 ܝ"Hk䒑(8mӁ?1on !Sp=M|SL 5MkJԎRHh'H S!Atd‰2uHƊauFЎ7hRwH)R?!Ix?.*Y R~'3o?yB2QV%){ 9RkFQiT#$G%6\ݖc^O]s vn gUS_D_VTU_;6BV{?KR7\Z!3.Y?S1Z} iJ;u*m>*BlI9STkc|X`T)r7h-uRFElV(26Xa؉B FcSRԒ65R kd)ʎKZx L\dhJ`e*B; +VB{>[" HE9Fx9I( տ*տ*JRI$E$I%)$IJI$RI$I)IJ)$JRI$I$-_ ߓ_ZU ddkm¸w "giEҒ5D5vO\(nGp?P!R@S &9J#R" xQ 1URf8h{#77 +\chSLBmQ@NDmXDQt'Tq@d9R5)K(}=X$*֏G yM蒚ꑎ;rDIH3t +B*`> +h<THY)) Yd$^\)ǒoUi$ T7 2IUqw +K=Ķ8S6 +SlNGmP\uM +%+e*|pHHw)S) +HJr{(0B^u柄ήS`#,\֗&LBƽ5PkSVuM(3n +M)@nt+[7=eTJ錋<2m;^v|/hij]WdzdI'RI$I$$I)I$JRI$I$$I)I$JRI$I$"!Hr>!%?A*I$'VzVz)IJI$I%)(I)IJI$RI$I%)$IJI$RI$I%)j}Y1WZUɫ%>ٙDy.*q.!Ֆ,-R"D'N8:1NTvja;*q< _`rA7IJԢ߹1)9&61kcDG Otn *MJ˜ƪMca&ҰY->ih*.Q96X¨x$[TS}[{a6U U:-Bs`<"mE6;UcU"Qav#9 WwxR{)-Q s|֫f,)#,Y~\Gb5,rD2Fe۵#X=!a+`8#4xVN jJuD+T'V9I[!bR>ғ}׷XPۄ$5>QT(t3DG 44*$yꉩC5I.{)%FڒԵx ZXEnCQe=m|R,W +}Цj<tPa.0bڄO %H;'i +jg+RU\hkjD'E#'R/+Sg@*c۪N)ZQTqF,B7sxwL:R"8GW Znțd)Dt*Z%"!I:ZXb@ܜ*|Jgdh 4l蕩0Ogh:)LsmѪ*[ +AAॴO(DPx |ӆƅ&?ޒSL[;))5dpYUQ8´GVs 5(2Cb5Q#DuB{xL74hLt xN^mB +pjvh0OWvUmI(7E`QC6tR S8iMV̘T3hYvU`=r3T~Iv$Լ 1qɔ; @LOd0ڠHG"e tORMvCݪw:P%$ܠ\ʋV1-M<PS`RsDБz2'.\'D) MotV-ҤRRS%Dl&-R0bɶB͔QkeT5 c{~+JkPm:_??e{7p^2dzdI'RI$I$$I)I$JRI$I$$I)I$JRI$I$"R`CD )$$'VzVz)I$JRI$I$$I)I$JRI$I$$I)I$JRI$iWZU95Y.}%?\gͰfTOQtu\Rڊ'9HΉ8wK5'‘SR)Y +aL[S~*AΡ-t8jBVwM5RݧMLRoZRv +9tj*X59lh;)̺8PN)HL̷1⩽t[O(] Ⱥ(Mv R}ۉ>cKN4\yϫθ{RG`'OWaEeIQ2FXWB8m!MOag)ZtaWEsx:-bG? 0pOOs9fGv)c`^fʥU}0X8TAڂ7.P9{6a*xז P!cTMz' +YH6Tv)eƪ- MJV:Tr[DK +m\Pm+*(|~wSf 9E҈tY"!-T<>ڌ˜͎P,…`XQ~הXaNVې޳Otxh˵ D +H9ބ$Z~hN] +N>)Bu@KSE4+nRʾ0Pv)){ĠCjoCSij㐢[xZϔ)8hjil)uHLD1k$wS1@L˜bk>Ɓ11?"`JFMk[`BVp25MƩ)Am.ȩmu#VkۧVPpSiOrV%9t Z#R]{'.%)L& vjJP3hTI ȌvPGP0 eLU00c`UZw#TJ U^<(ؒ$z$I)I$JRI$I$$I)I$JRI$I$$I)I$JR%&S DI%> տ*տ*JRI$I$$I)I$JRI$I$$I)I$JRI$I$-+9UR;)n.2 @PijEi:I-@l/e$Ų$R3ex)$xXSܕ0i˥H3ǚV{RtQqJV)DKm:ʐC0RVݡIG& +=$җÓmBre'4 +$Sq#XV@ȻhB~kgm8'T4DHLa$9 KU/P&HѰWVk/Ja +Aܯs"@TRX2z+]rU_yQKe4CBǯV:rc%Korהqw _uGv;]/տQ<A wʪ.aF(23\ɛ^՚ô(4z)re y8hU=cp +aZ>AB4)PX)0a t*Jқ7I+|T|Q4Y +TS6FdO8$ZftH$B DpPRkڔIE+op +xwH[IQ:"};q RirD@nLW xXd)rU0 @A%yj.- FE}. +F7$"Q}4M2eZu(ZMpP^1aH~ieNuQu3uf=Ge9hQv;d#ƫ}n%JG*.0\ LsQD+S)@L`hX6U64s!RӀ8Rx@+:jI+D)m>>JRݺ'4Rm %bǨIKi@4zV>0):*aD!V(/oINUkź'.SPq)Ƭempo+;+"t 9,Tv(8Jj.ܤD8NcEQv)LLr$.jSoN!:RC2ԃALJmЂT&*0W>  aCQ$ŒKLD2*rBFRܞpam2Jl@'TղeIuLEҒbhvҡiIz\g[;WvqҵmfKG^/%I%"$I)I$JRI$I$$I)I$JRI$I$$I)I$JR%"HbS%=?WI> kuwQTMgTUDI%)$IJI$RI$I%)$IJI$RI$I%)$IK2U8~_#cqii8 +q-jjY)N1Z{ q* '-pgD-Tɠ$uQpj 9Γ Z@D +.gܜ-T3(کq8jv^QRve3;Bm!0l' S5JԳYuZ}-c~*<׌e#׍*WFK$JEI$RI$I%)$IJI$RI$I%)$IJI$RI$J5:y%$z]EUV]EUIJI$RI$I%)$IJI$RI$I%)$IJI$RI$U~ ˯Ak?ȗumʯ&!ag>uQ$MSm̤ r&>PR ƚNKvxFJr%3pt%jN)4BN)*-25+W +ЧQ&NҵQf +ϽEΕ-hAS>i$h*j%j@(-dJCC)ւ8N97(HE G711w 12B0EKt'!o$z(]8*A[Ӄ + +% +JvDo2&&4RPDBR'q +%B%P)bq)JSTe;|$%hMuάhR; S5O K"4,QE,Q֘e uq3htKL"24-)5YO*rDPr6du9MO g$ 4"tCv (qH)Z,ށN})E| J '<}Qv)Jăot)H1)Zta2uRR+KtLLR#YC !$F;tQm U2sCMRE3F| ȭLkw)8G" M{(횗#()nXW -JL#J8R.TF+W +T4*#+M2!1JBV^7(ęK$?"IR7Dj\@RJQݵ"gJ| i[¿ +.;Sm/ XgT,$(r|.nV%SEeDꥺTg8) +;-THQ"?P5 9D!H +K8=ԇISm&2uH*3 MK$$[ '!b3vrtVTˆJP*IL +O36P a$Fœ Mf.^5Ҏ -J.k~*KJ|L.ϩѻืs!U[x6S':R/ܡz+vKD5NE䒔)C|hJ2oQ ژ+E.\STBpa$䨂{% +M%(LxNHƝ 4D )wJLDNO>)Z\< +!RtΈ9ה;$pX2r]N( CquZx>W+7̌G +gTRݪ&٢iൊ@'(o%<2DQ>L$ByspL$n !')Ð8N4MBYQ%2>i(:*f\%H"Rΰ +!t!ScI1Jסd:Q!B5{(ܓ[ N +UI*EewV(V]|ByL +6{a{vDJ +~P5W 0{$,CRDڦk(HxWDIj(+*'jN1t5tpq5Y~)ajpÅF90%gז: -1")ag8J`NtEB3f8@$(N> Z6}ΩdstVu?9M1]4ݦ> +<@M3 g >ڀIp .!6LB$JNLˆ21)Z)oiΝPS=8 ?mTtБb6_r&$RBS{$瀗T¤heLT'E-g΅3L;uLU(Nrv捩_HJ@Q $2s["8FsKU,[5h ݯ*ݖbPSnt',beDRRAIRK'N (ZV)Rܐ%!>)PBrd % 5'Q-&R*!#J^e;TC d +v*ILiL\T@QpڜT Bm 3&QkKjRS2HA;F)<$o)BO2tjVIt߈YVJo3&ŗV~? ~SΌ)$ROBI$I%)$IJI$RI$I%)$IJI$RI$I%)HCS#mKyIOuoꊪuoꊪI$$I)I$JRI$I$$I)I$JRI$I$$I)u}Dϟ\c-?ȁ!b|4]VS sU<9q> +n4* Tlɘ%3\{.irʀ1J%1i)&2i}ЗdDIA +%dqH@Bbv⒙'"72RU2ܓvKhIT:s@9Ȫ:HKt'IMlwQ(n.P,r|F\juE֦r3n!9R,8 +$' ;T\80SмFHLT +rbLUKrBv jrv{(IT(L| [T÷$CuQ$m2 #4(9 < +1 +GTR5NuY0I sܷ5Ov@!y "N"$e ) 2?Eۥ;vw$$\7U9OQ%p.?:&@!t&IT|%RY'&tPg-yj%yU-Jxx=] eL'2x(:VpY)=,"R#U D%0VrfaCm"I1h + L1)NPe.N68L}A ÷&dO =SS >i+uQ#X 8PD?%"IQ|m\,IX#ۼ[N:OtlEC"\VtU[R(gN&l +s7L򜱃QUҠ KbDA$BQMHbuM0.R^RhSJID D$NBiNZ2TRD$5NSL:ʝEF"!@̍Ƀ!urڟjP!6QZ9IKD@ODVt.\0Mc`k~9!z ZYnz6ɱfǸv Gb1ǥTų&%$OBI$I%)$IJI$RI$I%)$IJI$RI$BJR\|&DS[?Qu*S"IJI$RI$I%)$IJI$RI$I%)$IJI$R-?ȹ}EϟH옾EN\`v}\IŸ9or.!jcIڢ2ӹ4m$=[CRJԴ)lDꙮڕ}~䎿rv&lnʉM "O;=uMrJ\'9!$2䘺dN֙<&rY =q)m#JA+NFqL#E0`b[<*J)$/ +1)I0K ؐ)bxN 6KV-BLlmV{%aLÔhJP +QZL)&yl_ aH6Q;-Jǫ=CoeY'U0} WEHK$в wqƂ@Rit# ؔ&l0gI`HIRS +\pWx$̧N~*:P)j8JI6]ꓝ%RJOV%9 |Repu'QE/I +%L4H>Sw% ))*fdY]frT@}+rb uRً m~8NfQ/}қl)KT|Kl(uHNJzLv=d(JBn!H +eқoc0Rӕ0TaP(T$D̺ELɯƒ*K-iYZ]Gbˋq##^1]-L_+%IRI$I$$I)I$JRI$I$$I)I$JRI$I$)֠Y$I)MgTUIV]EUIJI$RI$I%)$IJI$RI$I%)$IJI$RI$~g.x.m?ȑ#w:&G:ϲ%OTsnvX;pSo懾 ٤eG|TCNRmSGchw! T6TyNⒸYNE AۂVQ) n ZVqRhࡾ #6HtQ@5JvJ;N) 8NKr7'k@.e8h&/g_4ȌeqGւFA\|f?{w9a"_/]B*AcbssX=hNJ, H4T^B}Ħ&rhKnD +So)bK "eCjp!%)$p!9LTa0o[~!0)˻iQg)RE&MHZ P'd Κ$H7)!jtmeW OE3-tF!5MzƓ@+qhU J ޢLp5J8R P$$ȺG RԦ"S07@) u(:voNҐ !i^'6TvptiJsCĢGqg>(8Xƪ$vߊ\JS&'D®SM"=rgD\,:{)<)+W >tMM9HeB`'墌;GI !i`ݜ!2q)N]%ĎJtG<Τ*$H8e!i<;C KԄy\.Tx,pQ\9 g!98Wns_+- +p,2 >Tvsݢ6O(NR.J, YxuC#$Aخf*"-&F +|DBz}`qoS9@22mXUPG 'DF˧K*INP.w +4&/ED("r?aJ\S0* +f+JJ;D%y( rXH*#3))*%ҌKWr: +RRp<) +w@;U3IL' %Ja ϕ63iD6VS(<&0H%&(2YI +MW̋[Y-.蹿̻;qy^18>c U1|)$RR!I$JRIڙ%)$IJI$RI$I%)$IJI$RI$I%)J: )I?$YwUZYwU%)$IJI$RI$I%)$IJI$RI$I%)$IJI$Rtіϟ\?J[$nZҧ|v뮊\PЬ#pf$_ k!H8RimTr1ti:{$r~DKu`xROr)oCTrhڠ n q* QqK4>>iz3KT)C/Y$p@C1dƉq# 'D䡋!'#ĎPs(J2 1emr&Q.;ϊd~JRxC!ZVPpt !J0r4PR@\R&H& >Q!H4J#[* ˜V3j-`7Uj7TE֜$kR]:K}% 4oix-Jeh,a+ZBF9it!g_>(/(n8cJOE' v)KY9ҥ?D>5L𕪒> HPvJsCԍS7]eEB“|hwtL;LhuHJ<)䏊 u T˄P.ΔIcqJv =K|8».> `W &BM P yjfIT 2)Od*".E2{) a+O 7 )!)ܥƷ3MPˡ-xY&Cu+O +fړ#hH >]Ћ1ҕ!L,tKt𕦓&r %ĎӪAyBk1J–'0@OGl3(z, M2U! pЬ%Bs R"^;PTvnIotVu7W9 B6uv=cQ·UeIO"Xga6OiK3+`*XzO@kVtBuA|B[EΕM}1;ܢ^ev>J@Q.PT163r f&) BCEQ~I)n*N%1stUmd+DB[%$4w&.EPRYNJ =,ΪLTTtU2\ JS(-]'7tदM0$!=I[$ CT)I%3O +l%KΣitGMʄNeزCׯq]ytI$ФI%. I%)$IJI$RI$I%)$IJI$RI$I%)J⢋$$:]EUV]EUIJI$RI$I%)$IJI$RI$I%)$IJI$RI$MȹmCx+;Vo364ʇ.m1rpCkQܛG@(&ݵMۓ(9Т/QH9 +*`P,*"d!uHҩ&M H8T|&5Bސt'pw)t$({bTJBM**E/2:nP!:+2CґD;E6<jy/ssɕ"WQbΪrjxB8Q-Jʀ%9Kw'sD4Q)bܛ(,*#Dv4k~)9ҞcESR*;>5LySd3!>Sm@cjmI8Ch$ O +UV%L-4x_dpK*emS:uSb[S!DW +_V8O 7+7  T3TN WqMSkfq@JKO9fPf@X:]NvWӲrNbor94rrPJ%12R.J&I)%@J1yB4RM昴L7j4Q: mTŰ ʫpTv@0!JuEs' +E E'&LD$ &)T‡( )baH9FB@LID' ! L)S$v_TիЌ沘蕣4G,2ʼz1~#TGu$IRI$I$$I)I$JRI$I$$I)I$JRI$I$)PS%>?h_ȒJ|=gTUUk=gTUTI%)$IJI$RI$I%)$IJI$RI$I%)$IJ]?pn[gd.^~[~)lX[#WuggG$E#rVQyP6};qZ +8⻄ `jtKw\CayZpJ9nw|ֳ`,>*woA `(9 +>pſzJI x-X{&'*Ws^ZB@$t& !Gwh0H ڋK> g`"T`p9KU{)a'v\_A?fqhHD,ɒT AL=ڲci?Ջ(L?UXʋ(“. p +қ&JI}Ң$F6w+ F!KNcHb Hh580)^J”!M I͖I@SHJP-? (RW^VRyjXkWbL c@Z-IZ墎ŌaN9s}2V|p:Jg / Vl$*_$S9a8j} +W +B@Z~rqP +})B`H0B'G1Z峪cX#i^Kl-aPL܇ We3^ViG+rK3yk +zУJ;^V)vP{8t=ֹ n3GnR=(R%k qς R{0+LKG"Qh.{0tNP.{c]?9;Vٚ;&8K^r~ @ W)} pNnN;Gc.{V0ߊP8!{neiBo7ȳ-_5gb4 +哻 R pd6FLbvLf%¯|9{NZfo0mn4j7  Gr @K{\D%l'uRc鯟%:veICvkx`##!z3~!y#L{:RbRH$I)I$JdIJI$RI$I%)$IJI$RI$I%)I*M )I/I%>տ*տ*JRI$I$$I)I$JRI$I$$I)I$JRI$I$W.`.[rR#wzI)r~mWb' #lZ +Q&(Rl1D!Ie)aGt()rGRI+#ܜ +PD;$q#TŚ`!.9LxO08AL87))} +1; !I-3+Pn'kڔL]@3{wYGLn'9+" `0h +ݴXQ,V^l%kZ0\>^֐,)zEɂ`,FLPƨl3ݒ0N9;“uJ2u%[*RAL#%HH Vr+N lRUۢ3E1 jSB &d_Rn03lc# 4jN+; n c%(М !IPnv$蓜nŲSTL@ỴIrzRJm(oS<)!f>*@'H$;%D7JEЙą2E =E2cD)KCNS!Bޥ S)c\)7DI U.4Kh(bF{ i*WDʋt +E%J@‹$48*عЗ;[1)I,^#D "R$TH71׎k$4SBT Jpe17 Sr )N0O9 %JbL@ݼ$DY`הV7V>iyLT)9qշ(,*gT4)`F%9B +K8vQۻBJ\=ΪN?* +`S00TH6tN<&J-8I6#DLRhۢ+dX=}yЅF&sTyPshED⡶>h7O K8]S DRڑ SD[& +M)9jJ\0-RS!`#Dܛ%2?$g2"JdLn)))0BD),RR!!AҦ@hSmBL9=LnSW- B,ΨIN;5r}Bev7td(!I|'["% dᰕp +mL?gEb0u?WSf#z#Uqlu=L&H$I)I$JRI$I$'JJRI$I$$I)I$JRI$IOƒoI%>տ*տ*JRI$I$$I)I$JRI$I$$I)I$JRI$I$.[\UgI!-O~K5rٕRq@*<)O,ȈH[%hp aOdkJx#QP +x́$%3'wL_ ]kdqbRUm"> RxOhɠJɝM=Z +JˠJA *;7qF.Jח%7/MNk7@o:uRsCZ4r2K]J$(.q +A"7$\0үQ1zb%!(Z9'6HAAT^a\pZ)giAmA'qV))ԲLPNS̩kNF!8N[K>Ɋr9M2BrKY䡍SI6TBBKxY5Ӣ#]A1j:uEy^"3~J).K&?("Fޙ_p6)J *tsjNgQ$|+{$YGޙU8$% (d%,YM#J I;]?&OД8 +ȵ!Mэ?ײwQ>i~C, H=ڕ mAg;O~JNil~(&ؑTDDwjmx͑=ԜyCp*eҠtm5PR*%?]U< ?GYvV7)_4x>V*.TZvCUNhzB'Lۧ +Z&;DGwT0ԥyJI:|K'"xMiSPrbcw5KRЧpH{tIL\mΉc%(n:"9!|hTAH*]Vk&F+_?E͕#<8¾3>,l@ SL','"S}'%"JTɾiiQrp H$3P/Q $)rR. +7TڢlJd^„r!I&nJ"%䟚p2䃐kLJJm&җN>(ʐtmʮ׺(t~)nV-knN'pzl-Mj{TK'L{O-\̻\{SeOz䊦ђ$IRI$I$$I)I$JRI$I$$I)I$JRI$I$'jdIOII)OX?`˺{UO,I%)$I%)$IJI$RH$RRI$I%)$IJI$RY-Lerk҇\H}Kkpvcg乗?cax2st_56?_Rp.$1a{4_#{GG#w?B=mB0l Pw 4n S%0x"#"{Md&;TX3.0 Bl-FI~Iڒv>i{%J[&s4AĪ@r&D\dN->[qRbJBUbB]*H;YCr1qN1*) Ψ)*.2R,"Q@ Ҥ¶Ъe[2IP@@I*[:EH_ENH>9L l +Q(A 5Ix@ORFW6C\MQd*LYApi`x)wUYd1ѢvΟ?SB΁W@-FkI^Rh_QJQg)7Q.?׺[gTRWn30vIpUKd BqAfC:Ɂ_ ?IGCy?M~ \ILcHؠn + H24O<(ʑyLF?ו }>A#aAs"{< ;uAKP&> +@(:r[ԋS*UyS5?4(ۯe~O +H%P})Yhh?6U_ ܞE-҉_pldrXnB}RX[K+3NS _n +6A Hz|ڔnęLZ[Ruk<`'h>&|הOgm'_<$vZ.!%*(mJ(>rTV kxH r{(rDFW%#I< DqMlkNt)z\8[)N:GŴ8{ {獖 Iȅv-"Cjp,lbv)M*E(7DʼnoX$M0W:|LD(-]E12mݪRS LIL(j4R)nHh|SR )Dh9DƩL> Sa@:T +S6 _p)KRm_D (j6g8z ieշPJ{EvYհ'FT8u CPN +OJ~0ϊˤHoá23^Fogŏ5y"gD$OBI$I%)$IJI$RI$I%)$IJI$RI$I%);S' )Y'q G$"[_sJRI$0I)I$JRI$I$JI$I$$I)I$JRI$i+%rKrRut_+ds?/7*)~I|הOBG?_FfxHХ˧6O=I쓙m)Sj`W34Y25ǔG.bqҦ4*Q| sP-!-Rp~(V8[Yn<$CbOuNGuRōN4S"N'%mҒDBҥnQ.Ҡ \"U{΅Ad&Kf\{W)dȑK.4RcLI'SNl(䀤tLjK*[7)Q[&L$@IhD%iN +Kr>hH) 8L{(5颲:e$[^+?- Yɩ|ȳ=`BLp?%4T[c0tM_Ar÷E ~ޒUE7v̟m(2.I#"V o>|~TL:,Ai2SPREVIDzDNe%A"11ĩ@,5H:u?QY<" s +8jBv{U51+=lrPu?Rn8ӽ|99dWێ)#Y,e +[ ۡR GSĘ YNN[zTs +C>h❚"hvse;:[Gu};ꕞ8L*c @_SN1كikRmmo)h>B}_x&ba@|F`>m/l&R)xOBnHzϊZ|<^^HF#s()PEtē~i4S0wC^TqwJK^ܢy9dB@^R#_RR3k`ǚvwc >mb@-D#nrl\Q7(8' ֱN NB8O— +)+' .(SܢL!DHA=7MR>i5Fw\v\ؔL%)-\5-g D!] ɔИ% LהD:JJi*vT[R \SoTZԥ6"FY6A i۪AMXD_]Om1I4_ӚX[_pI)FZW ^ϚƩж>|yR_5y1^2>WDI9 +I$RI$I%)$IJI$RI$I%)$IJI$RI$2qJ}[䕟IO}X "IJI$RI$I%)$IJI$RIJI$RI$I%)$IJ]g@jB[$>֤W90G֬Y\@2Op!&wO(}ou>]rL) H^P&$TTMtwϔ=g>uMW{A^UN4p|ګ'OQsЃ!įl%{!O|Nt\( +&)&Y`!W25جDU|*^\z0}o<Zr$Gt3*HF) 6ǚ9BtW$.Gѩ^L6ql +`'v$T=ƞHRO!ohG~ DsKQ5K_)NC-|0HBqR_}Wq8lL:D@6-uNp4~) e>?הRD( Gij:]q_QSbDsLJ(+G g"J(IC-E#r$Vp#,Q-Mpd6%Ip +q^oܠHфBBat&uݎ_$oM4M#E݃qi(y) ) +T٪ O!Hb8v捫5^;^Œ%Ğ)*E9$5')Od#ڤ'aB!LSXD +-l49RYG(Q.O + @4“Du'0"%0l6;׎_Wv3ff6cUw]fSܬ6HTrD^, \@a*)o-ju#,^"R?/$1lh ȕ7_) ;$LFƪ;^Q/8ZRQ ; S 2ٸyQ6l%KնજǍ +3qm@D4{Ms[ڶR5)Z `!6r5ͺBvWYڛJ{ DTX-8οԶxQr`Mto!eFgo5)C9(6gOO8mM8Yǭ4DwT.뱞2 9lq!ĞT +\(h( +q:': MLqh:O yj) N(D峪w?הuNkIjH$Giȏj:g2POe'XFQl&~*>*.p +D?AΡB<'YSRm@{g஖mDI<6A*kGgH=hzgP"Q} etCZtF 8(L(!'E cmz̕Or[P-)z}oN_ Rm#z-l) 3 +in:%alb%U¿,P +&XǪ9*8D #OO~vUI=m/0 ~5_.v(%ȳGM}3U:s+#Ek`LŒ%bM`jftR'pTê)mBakR"R.Q.EEtr?|]l#J%v(D 2@Cl "P3\1̲B纴DANRO CQ0m k]HL $B>ɶx%$`*D) jFNFQ~ `R&YEo ]ÍS5"!STK}eTCe FRsDI4oIψMaAτxH1%Q_dp␶ 1{w2]YfjFoJȍSVv'NUK.9r<*MaQ!Wu9%», 򩗦®6p?rk +1ɄGl1Y!7HL .* ܜ߹(sɔ*@'1(13)'1) +)Q, eH2U?H{,Wَx]'ՐymvQ^|؊Oomb}Y].ɧiʴM8"2 hW7✘ %}jNД(oA,7۲JҲB9 +.(dIσ +E GCVcH<N̑syT"&sSma#6DTO(! + %΅LS +m 4F`E= D&>"0#H+4RRpE_t)4Yr@.8A}|Ppi5YKG!ݕg ~hEҏl&|=jʛS:uA),I{*LN@OvNRQl;O2Osʉt&be83Ɗ.2%fA)dypt_ +M#(~ ).n8EC&N:'91PuYDNNYn|UWg7݉DSy\`ALBrS{𜴭2ĨⅥ1 Ί;X:"8Gtԯar+gTrg=%ҤT@NJKUKl(ʔ!Et)0Bxc,HS2$ &:$ T 9 SD'N\)bRܑt&nڙ TC`ʐr)(WTt$%M C$0*@Ɗ). I <"MP+>JoK*W> 5B8l^Jggi??bʒI$)$IJI$RI$I%)$IJI$RI$I%)$IJI$RfNA(>#$m;?w J|"[_s +RI$I$$I)I$JRI$I$$I)I$JRI$I$.W2W`'$U lG^1\kt>Yu~R͛qIʛP4!QHS Oc7()򍢊'xad)H2`fPˏ*.8QStv$=Ҙ-p/wjn(–ƃʏ +3&+ &ܓJU S Rw1 dQQ[:vVp__>/(EaZ1rUT˄yTaF㪃Vܡ%Ht/Eh'1iT^S$PLYLCQa j75=a5>a^on}]W/;Nl}['WjS:$ uPeR 5(4P6BvDh?TxRj9U:vp$u ΀g>xBf'#w(&)jraƾ3FY?$#U#)@/B 5D'-9Q8B{%[DXslɕY#Uy;Rh&Sx(DBu-dx_5/RהI!I*Jy(PHѝofuUgIPg~^rlnϧV&hr|5jE5ґ1i1$i4(JE ӳ$B7zϹ +vx|I 8,l +0 $MtC@I %C~Ȯrt}\%xf +;Pa<WO 5Dg&p@ĨrlRq x 1~Z` ٦EF(Aޔ|KP\3DSpܘ{uEK@蛞T` `gXeGlrH,Q)<#JbH;t DmB#jnAjZ_4 `nqBΪ1UaV ++T1d%9JA'~IvdpDx"k-}ɷFM~0"'HE +Um< &t +H[3dHlqMLgD}ItN!*RmCO/1*v(.~={IjbB#*} + ?[2{g~*;L_m#BHIOE BΈC%tWMUgX"骞Q.ԱDQ)I +o9Q64ƪ7r>QY~^ x%tQkcUwua'V'  "xQ&;hN9EVFd{)PS S9IL4 :$Ȓ-Mz2IQd,mgj^dJ#qoUfg@+cV5Ӫ4FJi쓝E +'E"]xZ')BENE10.CSy@}d,C'Pn\ΫJ}ҤŜ$JfA)7J@ADElҤҤHrStL*a83mY(t nP)GDTh % PoGTaL2!MdͯHQTr\5PEcv2h\}nkKG+?L`??rShyZRI$$I)I$JRI$I$$I)IJJD)$JRI$I$$I)Id%>M@?zI)~O,}?`$$I)I$JRI$I$$I)I$JRI$I$$I)I$JRcw^)v~(Kd~0sA_6E56ENL5-~{ +()!B`6Ts&hwxO a2Ti:mqw?uQHD,BLjiP/eR8J)ird!avH2{5BS"$C o?aqw ZpY󙕝!@Tk\3:NXwNb1IxP5"&܍ʁ2TRV(1j-A8(+uL)RkAEaJV˵A(41ct}iS1hk`+ 7Zk4TlveX̵9{IvCTd 8ЌsNBRSDPkRZGt0Ղ7 éH%iT0ra SBR F*Ug +,+./7P{d:\x\dwM\̝7JI6$)y!JYMU1 R-O0tJSՁܦGӓrS[2#[Ҵ:r9շNa-9TvI9t!U ZM9%BTKT(`ZD$IP. ΅-XXJ-lf &p4>!Xr3M2(H3V*,2ِ$ +-;JQ (pҝKdj*Bt豖MQHqs %)Q&ؚD,Sa/RJN])JH^e!))5<W*`( T٢H0 AAJ "T^Z_V> -i}Y;oO3??C; {7N$IRI$I$$I)I$JRI$I$$I)I$JRI$I$) PI4~@?zI)~O,}?`$$I)I$JRI$I$$I)I$JRI$I$$I)I$JRg\JiQPuKs3%tYI#sQH[!AaqpƔn۬(qUl%@Ñw6(ntiDGzt$L2. +CT-w (%L MPCЪww +ݎ +~)sܕ4B{)J 8)ʌ+02e >I2BIX+ZO +'Tbil)=&6!M~ +op0%tewZCob9%O73a./VOf4z\5q'U!!S3l3*$nJ;x&A+ zv|GB !pN=edL% @Lѹ$TnPDϊIOnVdd70٩Sm2f[Xm +YR[) +gT]Tㄭ؝{t@Id'2S% +ELOdۣIRDY}e}O|q,AD+3/hŋY ٷvS:xVi+6J0<ʿ$Ͷr=ѨO3uS]'x)T(5d$Eg6uN Qqڤ |ENh&-$Jde[($mD ,6&4Eke3 WuKlò\)Dx Od)YԷN. B|T \H(ϊ$k%[|*cO3/ˏnퟚvIn)r(KFGNvQ&k˻&q+r@LY$?T&Es&'nOfT& B`KbwWRxGܟl&[)Dӕh)r%^%IWpFC:sDSxC-V"Db!<':I N +NA"W#ݢ58tʲ +=XFNؐL҅.F +J7*.4Ҳ52Up66,LG] +!HӲPR&V$"S NҢ!101LZ|i6NO'E,ZN %Sr)L !qʇ'Iif +paDhJVh:)$'r}ˆ +9.fJ?N> 6VcpFL_8g4ez?ʭfY$NRI$I%)$IJI$JRI$I$$I)I$JRI$I$' @?zI~@?zI)㾿O,}?`$$I)I$JRI$I$$I)I$JRI$I$$I)I$JR`3?*o+?GB[$=C1\͖"5Uf[8RPŲt +;g'=e9q gDJbʈruEI4ą-fx$D&-:j\Ɉ,ΉDnl0"%[EU5Zټ{!9ЦBNvtbC6J), \hqO:qEHQ:)6:oE{t`d\r jf@{ꭲH?i +fLۺp+d5OJa#H#QN +N&kL8}kxT>\$\ IԎRa-S B +1@D'Q!`#pG7!iݩP g>b4};%[pQnmV!9$'j+GEm j㷗 iP?`g"H_E+_DoTS&Q*D4MQ\4;IRc;J4!?َUGJ ! +],su +_;'GRRxo rNR]=^`_DLx_K +J庩;?(K.tLT\ +pdcSt+6"nB.$ZtDC~bL(Jr|S92P-(Ų M<6MUz)$庀uHRZJi Q!6E2[*ll&HXJ +#ebŒ8-@eK@) +HL5R&QZ1"+  HV%- @B(TB4 eI3BВ +`m Zl)Jh%+{()BK&;֧f| +!]%:Pz3C=u$IRI$I$$I)I$JRI$I$$I)I$JRI$&I%.d%>O!nzI)>O,}?`$$I)I$JRI$I$$I)I$JRI$I$$I)I$JP]BgB*Fu<0B龳\*mabF)4hQp"ݢmLꘙIr$#]wF)r{LH %[<DAH~IQRRއB od?oGu٥dU΍UG\?(p+9҄kT ':ʃtk5ѪAB; 4`+X Sa` u=A(FxG[%Z,xvrh4EL7^c_(ũiIοR JuRJ `_| 4$أoE?$bmHׄχo?HÄb;O_yw<|LIx _"pId5#PGQN<iRmqPzɤwH4CTcT$ +w B?@E. +bS +Xc+'1VShl+x{Z`*9}A&\tU+LI=O4 4*jk$()Iarr5M* !hsJ`x*;Wn}.ݧ;BNYjœINl2{A{&*a0t$9%S  +-1RZWe)P S pZC0CuHP?)w v~:RMy&GjDIi'x`'q!D=eu_c ލUE@9$&DP^ +Gj?- |E /מ;&go(d,?x_g_z`c~H%#LH?~hBZVCM&#|Y_⧶٧)l(,`/FuN??XF*3/P;o<$}p2,?ȝ'~#_1K+l>nR8}Yyi^4[eAfI$rI$$I)I$JRI$I$$I)I$JRI$I$$I)JM +AO}I> *xooX)I$JRI$I$$I)I$JRI$I$$I)I$JRI$V&T.w_ů%C}g'k~+.3xUf4lqbO\r3*cQ.L>u RX{'#T?xsAJ 尐wdrVAJ!E9(N r7Y\쓯|r!Űq3ȬB39LPpTTxI H̒m`tcU_6@4g3qW:ΉR_sழN,,E"ک tM)bZ1rEМĮX +\pjY*,+*CHhR 8t%M%|Y4U|"i +b;Yv"0SS"A{!V{[6Tυ"BQ(d&INILT!!3 #Z$&M2%hɍiҞKx:VpnS?*lw3!v3lvNt"}2InL\aKv >Lr^(\OuIE =}q2s#U{_h,qlR5 Rv! FP D=ГTd +DjS=L2DkdjS)FS Ps +XP](n0LQEA `JL&QQ*@D,f'EHT%-TaJ!D +FFʉM+ZvhQ!(ݔȤB JL)4! 'P岊M0RO)R1!L$AѢ@&?) ڦ**l)Ba#BPS +-o_|QjHE?8[i2/.+Ɵ,dz|I9 +I$RI$I%)$IJI$RI$I%)$IJI$RI$D%%>i#$_s>ȰRI$I%)$IJI$RI$I%)$IJI$RI$I%)w?H%H>X>+&u+}%s lSpn2X#@cֱH; bM)Jv)ޘd8RiQ%;/‹;< +VGV<9W3iUwOuhl1F5BsTTH32P!L(X&.?`rTkd^{C lcF# UUpcP+h +Vxg\5yCS9ܑfGt R1\)5ӨOj`7&b)nQs ! 4RwNHL=Μ':A~TMSn1'퀜p_%8 h{wvTċMuHJڨ8djSZϰJ56RYh:$(wVJ * 50d@Kt&e"TZM p;&J KT\s(m +#ە,:>☻TSgE ȏs((UacP#qRS;M)Y"YOl-b@Y +k@cl(:Ȇ<"(d9B(flMTF[݌۵4n)N +`[  )g30$('8) *2-gQCD473[ +O e< ƊMjEŊ`QZZra8KSSJ&(W.(*SJr%1饟^^W34ˊfI$rI$$I)I$JRI$I$$I)I$JRI$I$$I)H45 Slo[^Kӿa$T_s>ȰRI$I%)$IJI$RI$I%)$IJI$RI$I%.{*}* >πB[+d0|,N}gl̐X4NC%=gw1/=U!GxJZz\w&¹%KtrTORCC&SD N?)2܇iڦ](Z5cmN.t^eZqŋBqFrb`*E[9.%!=+G.4SaSK -Ȋ $'5D׻D +՛Awu77r blW +mexXtI(NS.O;%4$)mv%3]|sJ NT,y'qyAxэSL:‰"RD&qS$V&4Eu(g +,":ɧU5\?'l#V$櫾iպTedAXT=:k]U*jI #6']z~Chq!~SIՓDr3 V%\JpbI\9JQՊ` +lvȅ=ҚR>SƪJ$F% z(EӪApDn|SJp%$J;n-ɀ¯F`vϫ:yB,f.8HTL@QsKzT4#* *e֫dtEd*<7¿4jdwƒh?)\췩) TKe1DP{S8(H$TO2TLPHX9E {|;y"cD/ 5BDItSp-L5Nz +E—U^tSm%5)7wQ#P&xRպBxGՏN)܌Bݻ^ɷKl$]*4Eܑ +10*`S}U:PN}hEAΈO5IoJ'UYL2(k꬚((ڸZ/hI D: Jp0  'pNp8PN֩AM)ֶAm4LtJwҵ+ !4"Q,%x!:iH]-OǙ[U}%~1 3H3 +oԒI'I$JRI$I$$I)I$JRI$I$$I)I$JRI$2pFIgIO'}?`-%)$IJI$RI$I%)$IJI$RI$I%)$IJI$Rzv|A X~OHzߊy]/֟W0,\Ųx!DGt0$U%3D)#KQ Pq.Ki RYJZ&N! +J! +D{&~(0w%c4 X糙s(d@eQ7:1k5avc7qЬӽc]U;5Tϓk>m⡺4Q¤5Fx|Ure8RT +Y 9OxP'/Q5+CRLu3G@nOBSrdhȨ.*N'‹HoH/ +(BjP0$r*`#BLvQh-ꣵ$irXZ`'FtAD4Ίvnׄ?I+Yqo;$ g\r[W4Fʬ$!nSQӫW)Rs + an4OkJ–C)Ij}! +a;JH5{IV;T gD|P*M;uAs9&-)Tϑ“Dj( p5rJ h^N2R"SF*:ft&t|R +-&j(dL +U9C>ߚRXZJ#_L_+KQڈSoOcaO4?"4M! RJ11Rk-+ $ ӄ4G-Ԓ\d +thm%l)J_:))D1D +G]N 1ǔYQ&xou%2LZK^%@—L nTT̰! 4"CH"gDĶyP-ڍJvHFk3h1EiQ4+T8ϟ%/Hz:H~O,}?` $I)I$JRI$I$$I)I$JRI$I$$I)I$JP пG6|?⧛>HOH꾵FW4O\HPtl bl5Mه +vrxV.)Ljba+K%"%H{w+J nt%hP 3%+nY4i*Otbɳk(,Ԡg#7̌jbaz BkC(fF8Yu)cp +gv%Zk=>Jq2(($4MAaRRuHꕄQd%8!$jܘS(=8@yOBA`Iqw[:{xp^X 4hZY"KrXnHA)J +ѯeOw +'D?zoS~%r"g>:Q_t蠴H{^~O6Xh@˔@J="bqyIbU&Sdud[Қh3ܢY +jуդrvH"[4ۡ%+]*aKwd)C4A¤N5>M!pf)7))&n)&v֠vG|6(rgNS- )U!Є߬)9-5ݢ`a& +*h#eGD5bSv *=|1]ɝ +c`4H@Lj*g)b}BBZĄN&>H)q)L$ +@FҤR\j3Nva%AU+r[gT)PNcɳPHlPӁE>zF4^̤_,͌PmhHSt`pDa v*S +rA@S 3T=򜒟t(tjbl(|jwP_;(QWT+m\t9 LʔY(DE1tAE , By]A;pC&Q..&ȀWf븟5s`ik\Q^%+!3fѪϢVd\6Ns²e\vROAN $uK&<B2r4`y9ܗmJv30&+atϊ ׅ)ƈ@7dZ9С22isw&C]%)lAQ[vXtylAANtE)}%6Y˧ry v +a9B +L(CCaԔ'P/hc8~b֢5*D:8) %@65E+Ĥ8 )pSQ +S!(QX` Sa6yS"Es7"TC +\:hИ:RIHB[ʮtV1 lgCM +:(c6тJLRX(|{(n쥻2K2QqT;iX?Qn9ʎ[c;J_!#d5 wTKL:x!!8j-<J›Ot|R&stB2$(e(}Ѣ#-BNV`Ld%It}QrgT6yQ.rhsq^䍀rxS RۻD7 X%Hl:E rc%HҐcc?U!bTœ0-Q053L'&R+-]'^#D R"! +!"; 9CE;ϱM Z:N H˕-І +\|Cc!2JJJ?zLhF22[TZw(|~? _į5+ƿѯW[I9 +I$RI$I%)$IJI$RI$I%)$IJI$RI$IOo$a$_s>ȰRI$I%)$IJI$RI$I%)$IJI$RI$I%)z'?|C[>HOHzNdKh\nU͜l'> +1>pܜ%#fh*':"[a0Qi !y3撙cMg)݋.mN:%VHuWĪ\ӡ +of5wWi,Z`n>HТ5Q\tSBlid&4%3 L&.Q-B`ç'җ<'IpΉ7RK#D2{i"LZv(%"E%H4e\ݺ&&5Q:R⒗F!hT6uD!<7 <)"}c EZ֘\QhcPkfԴ{TG] _j%40vRٯ].E^;0U7G !a) +8OMt1)zY*@0"vi)Rs#=4Er OQLPLh\|):&H2%&N樃:BJ-tȰ\EI$$I)I$JRI$LJRI$I$$I)I$JRI$T >KΗq !~;湒#El  :6q,JjJ ])w)sR^mOdajA ȑfB(aELL981y m%9n +BGv<+Fѹ (^3/5eQ% %%xVH<2 +,06R :5.tJht)6 + dfS.@[*.:(GަУԶhP*Fx ĈR5=ײJ* +$Ω "s=NRka6JXM#ӷYLS'2> znIb[(ĩ8SܡVTݪbY'U&xCLv҂Y(p X晓flԗҀcD^()w'cNS: `:'EOtFY~R9C0T纁V-ҢuR.CܜR \[)@Mˆ L7HHHR& Mĵ)a!)061@%Gi(:xCswBׅEn +yJJ@mBf)Mi*VU'O2H?uP3?xB_K_JELGV-vH1yuMRf╫NtꝢ:%2Gq:pL'!ERw +ͮ%՗!@ +/rJĕϝTI Pފe2ࣽ%WR UfPh!uQ=PW%Ol!ɔɯSP)+$V&)H$@BJfҜT$RRR&R!Is(Mva Ljtrx. F1wA(=\3-Ғd3pT!iUC!|'K&)%]T%5Ik2! 'JRL.?+sxG,`_E?ҿ +fY$NBI$I%)$IJI$RI$I%)$IJI$RI$I%)8LJ}a$;vIO7}?`-%)$IJI$RI$I%)$IJI$RI$I%)$IJI$R@ykA|BlHz͍O]'W48*j&4 ȅ&?ޛE3sK8%2/JBeK@&`p>))l81Q&N$;cL3'33Gb6 aJл_07S8ԦKuiH<ׄzrŃ$P'Sl_>G R|(vHPp _)s3|}\1R)jH|u?(t*EA^7o!I *9nq'6ky"G%?,#㴭3N'\B6][ZcBYB[ "!:'5œ{D)Rv_t- ұ >cV։Pܝ{$D Bp@)R$x)+Y̩1T a8섛Sr +XOmeH)&ٓƊ%pK=HP{$&=,aH% UݹFu&m$OJ1œbx$3וhlؕ;) +júESGt(Ҕ'&)0=ӄԦĩ3ĥHT +Ae*!4{a4e(!rra5~Ғ5J +E f#Ub?<mp|n1%.9_ȜG:}ĦiNNY t*;y +jc93$|:ޞ~VU&80 :?j B}e µ_N|;%.P7n׺gLЧ>Y,)]~'T))@pPxEtQ^Q+nX&CS^Jzb{QAK62³Z(Eie0(`JHd KT۪I_t'hܣ0h)"enP&Sto@RPƐ +.]T-|M )cPdZ̠\榘Ml5R[ݘ|) +RC1 !( <~ǂn}NQˋ o W?y^5'/9UTI'!I$JRI$I$$I)I$JRI$I$$I)I$RR$IJN$DI)ӿa$__s>ȰRI$I%)$IJI$RI$I%)$IJI$RI$Rg/8^*L6ψMN\]?oʈ 8\Ru:53E=ԁЁT AzUD]J \j4Q6Hj0*$Y54jҦ]?(6tAU-NRǗm!A..:B \)hu H[27rDžRQ=yI:1ui1q)m1#H Qscs3$j[6Q) )H=1&"NyyP~BҼp>?zrӳCH5; $jm9)+$JyEK 52*e}((Ѓ)MR}C$Ή]'.-T5r`1L (%*ܡ!RqNc]R + J[Mi +`Hkl%kX[Sk),V9?o4?ư_į8+?yPCfRI$$I)I$JRI$I$$I)I$JRI$IIK$I)I$JRI' )_M݄iJyoX )I$JRI$I$$I)I$JRI$I$$I)I$JP0I$/IF[g/6^*>=䝫st׺>~j^eD6l`A)h Z%郪Nw%ER$–甗(:~Ja%TwrƉl"nLJv蒔xZX#4ZxMD1f:+/$F—6O)ߌ 3*ڤѤiAb&YM# #T09dpO'6R/A4Y5uI5HB"fjHN|”SN-o,I=91"x.S'f"փʃL)o"V$44jn߄JHHMRu6m&Jw9!*@ ""Q3)1 U렴Hq92K*ݸn(dg$(%ʇ8E k2D i_H6Rfl)˜j jJB+X$ $X3NLdKӀZDAARڟj+xV: 6Lh5J!8)D%0R +h-3 PC2SPRFJL"1]M$"JO&.f L[(%'V +Q! Y bf1H\7j dZ`kGT-M!(|rưҿ^rWgȬyC6NI$I%)$IJI$RI$N))dI%)$IJJRI%)$IK)I%)8L%>'w$?o$w"[_sJRI$I$$I)I$JRI$I$$I)I$JRI$@JRRa|BU_{?gCڹ^]7.d1cY'۵#B]tO rᒅ.fNF* Ӻf2opTNN%Z{AxJ#BZص@X;]xZwGtw`])^r#MZ+w&*PArimHAo*GDҫfʓD];_&=-a?)SDvL[:Β$|K!I) e3 TE2<;D9 H'LJxHHI)$ӷ 4˗Nm +<4đbYɎ 'E04Qi'7o/TVPׄCFYq X+h}e +lh |¤!Ҧ?*Yr%WVR4vXּC +c$ buI1 NMv9Y[G*@S%rxc*HƩA ) 'NXYЅM"+ ?z*s# +[MiQ7$ Mi'eI! +Y0RF Tƨu5U R;jQ +A ,) EH)uŦqPUA1ʋԜXľT[yNKbaIaL5BInQ Ή!P/!IGDB-L2iڧܡ4D. d̔1ct|F@L1NȒND @hIv!Kx'v8!EHK4DcP B2ꣅK#DKn3;I;,g;|p_)%Dk3yBm%;mpRςHBLyEړL{!³ER AsuH\UΕL4di PJv)x<}!MLDROYSAǼT JD($50p, +PiUvL+U|z4e8M`TuD{'-g 58-,}ԃT LxPPJkU*eJ[j\ +(R9(!'6d¦vt€RJ-d-U'nV@u +XCV9G@ =)2F.n@B2P.NΕ%11/BTIgQE[:PC'Kt$NtO8!pOh)NU& +H4.&&Q +ȀSDg\~U2-F ܢ4Fml#T2e-ׄS5W(U/`^ݿcݧl{tAB5¾^\ʑua"'Y  +;U7ayJE +%D8 !Q­kYk@n[.tP{aBґ+bo6P[dN +NcW !1 I TT\RRr蜢D-Kv҈R;T3c0rb))|!R !#SQ nMRIRjD%6JLJ#Xj0J@mP!q$)BH-'9B6lLX;M)>VElR5?Ʈ^pWi_yPC I$)$IJI$RI$I%)$IJI$RI$I%)$IJI$RS=/iJyoX )I$JRI$I$$I)I$JRI$I$$I)I$JRI$3U ק`Ht~<{GsAҺO5&,bP y0[wPB}Dc,La♆D6iN`S M!}5IݼRkW8nRTŚIS΁B$)*ۘK&{['C_9OR Ph?4)Ge"Cm-K1ӵۓCARa#fL擘G +]#*&.[Ϛ}L $g<L"#Ki:^4LHw"ͼ>+J +yf`,d?$;S]siR +;Aoڧ-J`^S:ת:)\+`p0d;yӶNfH-H +:6Ǒ]W3l<cJܢvw +9ʫ<ΊEyg!^-A`5D7Rj$)aQ8ԨTYPGIPDQ ԦS<)~VQa%8Zΰݎʌ–D"P۪ZY&ܙúv¸2$6ShN贤 3ÐZ+;QH$%h%NL(S wάsBR/Icf'o*lEL[QW$̿!f5oz2j<*?7I$I%)$IJI$RI$I%)$IJI$RI$I%)$IJN$S3/IG $>Ȱ\EI$$I)I$JRI$I$$I)I$JRI$I$$I)KYeKӿSwV%C{륚湍к퍟?ȹAuPO<$lIJ (?$*;SNi,|GJgT2!= HP EtS*sE;F7!kKzosA-O-LzF<ME߽@Ts6Zh!Gl)C(Z+EQn#ё橐NF%>JȕQ +LФ虈g*m +L:+ (JqIf%L= Q#GDe!QYRrA>-iZUr#\/n⍽4Fr+Px̩)G*;Q +KpH500TșFa1)۩MJFZ2aWhR F֜`[ + *aQG ZV6`UrQd0Te %E ͏ PQ㏒ MeX3vDy(D +-$įzM;yN5LL–{ÕL1Dp_d6OL!;E4{ ϕ'2PrġPe4AT(B & +#{Fe SLP:&$$#+LT0UD=9ĠE$¯pAݝhDQQTK BK "Rj)$NA+'cTe3O).fB)ħ!xKwdҐlS)LB}!rmT +wQOS$N + T)F@QBh a00;JM)T +v 8PSQR[RXBJ*[aK1ʎBs*eY*^/,|K$bګO7spLOtBgP5{&h0%6% ,Z_c )*lD%"DqTpdoW3\~ ʓDp$8Ll!3al(Qt?P1=3y)0T9L%tRԋBE'e{" + |{`zmʖR.Pkӵᩒd LD&U5ʍ-sFŧΣst~lzʿ%]-x5ߩSms(ܚTPp%2~H+70Up%Z[UJ,c]. l})Wz"nS'GeNhN:}HlTK)PIWMݬL6F+LNRVIA* +"-Ӈxdɍ|ښ@&2T6:.UK$pffZj_NreO䈥*DwL光*R,bA*$*@B$@M)Z99jj bTY*aHj;H)(ԛZKX0ưLF,ZR)MTGU (͍ۯ`(9#n(TӔvL]K❭TO0 B~'>>J˗­x":*׺JեJ;]% XBw^kPe9Ab+:&h/IE-%ܣOv)nJ;(T)D#hb׷R +qBa@,( +#JAgJS V2 Bt- BGDM2V%35%HI+$BrA,ۻ% S4JQ IΔNB[k$)ڤL)2zl' LS64HAjAIN}ADΩH*l+J24Q*I)NXnc +<ͳa_kJOu^vTټwRI$I$$I)I$JRI$I$$I)I$JRI' )d&RIJI$RDڒF;vP;vIO5}?`-%)$IJI$RI$I%)$IJI$RI$I%))I$2$Rzw?xW^bMO@Y\ !rޙVyMQR,R-Ғ +L$ٮ;D䣺R/TʷNL5 +x9JpQv) +ގ@STg%aV-V)yR|HL06x. +/dj@Mx)0hHW4Hӯ@ A*,vTR!LD:gJ6C# P;&);tAkp3ʈdAs9ERAkU +D8L–%NaR-.$ +Njasb[m۩x:vO$'@ S Ï{fx ! +rb{1fl+V-$pu@=y셅SW:ڬ6?4xc}D%9H1Wac giVK[,{4> UDTIր8Tq:((EqkmO;*'V\f5EV_h.kp\J8]-JIHHr' L 6DeAB JB[m+Ll;rJPR54ʀ2У*gb7ڑ @i %) &cT1 $<(mQIʒ,Df7j) +;'-hQpTOt @N#ڛbԍr8R-$ULv1Ήp + 5- +vT_j^M+X2J+ZZǏeѰ'FK oǕ85Pnm%rs% <{G)kMHY&<ӏ.ud)8P ۯS<q{'T +H+9TVl^ʛUV97j (jpn#%E)'=%`*k ,eXlWrJlU=SԄTT:R)k(t (&\ +`Jv=Na$tD R&cPO +P#DB &.JTʐ IA*ڜBg$BH' I2@ZJrj SVD@ʌrC=ˆ )8D.RRAO)oA(\*A (ҒHjЦ Z-ߨlwaL﨧(6YGkj^xWj^zTٺTI"$I)I$JRI$I$$I)I$JRI$I$$I)I$JRp$7vJ?EI%<\EO,I%)$IJI$RI$I%)$IJI$RI$I%)$IK?/^\~H] o.\9t][os!Jhs9SvT L|BxP)-\* NRMC*M*dש(g9rU,"A=(rcX3w~E,Yi*>JM>  +/ q>濕3הVZ9`|'☘DW&&~)꜔w I^ +r v :(` "{#tPƿ)b|fD:|TCU@opQ2G D2B`S^ǒӍ=TܥAY5;%J#3c'*ꜙ]tBf> w51;܈_p~ܜ<SxBTtIwjvo(p)*E/PB5niWĖ=yܞJVTnx!sYٺGr+Dp#: yKj2[}C7Sgn<ը0 Dylhq柈Yƹi:kܐj)fԶvRH[FpiEGP]PpVfN aR8:rZ73] r7A+Ž&$.v +`Rk@#y$p{5eL2!< #u&tS6&qZXLbjɋv|ϔ_2Gu~[vbdLҤr%[$%7FF 4'E\fYa nSPyYfu$IBriHY6_tBJv>_HnM!+{$ Bh#Ùy + ^IH]??4䛃J4L*OSд9Nj^eVm!9+"OXY6\0 0YFa *\,Thd2l|t)mGe2w&蹀yC$%C ߖiD)gIOQsdi+X8!LDJf~wƟ?4YS$Ķ `_$$ODw^;Gs? &51V|zfG"4~hu!0d$]?؄㧇QŠ_$CN{ό|Gpn'yL#U[6_%bcAu?ro_SLJ4_ ~<5d *$ds +)d?Ps?&!9 o +QKtZp#F3~u.}c㹓4N3 @$|Nd-hC +g:u[?=#8YE?إ>CXe$RcUO"u.Uki+|-<`M.沎؅=|$4SŌ"=S9)Pjr^8BbNX0"ݧULQM*`kD~E^ u_Am F 8. Ug!mԑb`&,'^'*\%05L[?$BInuK| ` I4Ǡ@<a&9n49#5$Ea[49@XH;hNj*QH WJmRs'_aImEf2!zPuޑ'6K@c;?*C?E ۏt?v<__ۏza|Bs()D<|?ܜyA*M|Ov),IalȒW?/3>ZDO_jt6H??POEllֿV_Z<whs/(EMDX-mByD"veF*p*r:6`V\UbQEn])áCt)0',!b 5Ss "m2U5Umlp4LO` (QTJɇ -0 H2&fVNcDH@`a aIM P8jbSL$P*R'rIPiRijiO)!`Tb%vN  (̧&T$ڥ JD)TRi5IZS ) SٸhN+b|y,ܹhsҫk}:\ PCfRI$$I)I$JRI$I$e2S $$I)I$JRI$I$$I)AK%>?IW}/I)澿"\EI$$I)I$JRI$I$$I)I$JRI$I$$I)vR;ܼƪw;xN(w ?] 9W4]/0 ?s;'Ug9v.I)6LBޜwJPDZЗ)cTHYT4O.HHE ĦnDgF;)L$[5?ޯ 4VC`&.͌95.%k "?ׄVUIؐMx!'۵FBRm 1) ?$p)+ܧ~L"O?b+B!ܘG.3?ހO*X:56~ tN l_"6JI'Eps +wbG~*i:4dVx楄{'|@@b#xR$5 iƟ ǻe `<*|>I YK? QL<%2G([3<S>jw$uT))alA<oG8hG +-D.5*xM +Q\G(.p'{GUժʽ3#tG8MXtS pce@ncFr(;|"S5-;C@Y-^5(pĎNdp6ߑvN<&*Mcuw=w:!ƃ|IN)#[Eo +uKt>dmz 74|܁aiFCieǻYؤh?a LI>Ϟ5ވξ ۡE{P2p~ls5G>p)q&9|R2:)@>iq&So@6"-NkLz Ԡ?&];wLM^SwxAq'jVvS蘂<Ҁ?"IY?&MUadR`S&Ϗ`^5_&v"BҠ?Fc/n|SrZv~ +Lu=1?7RU @No_&-'h@l cU#IN?Ǘ(WVcvxBxڮj搠D)-g4)\aS'w +>w [f4dU_RLY\t$N䜜 NJ)E Tf^Ӫ/*>/; ف(-B+TVR!-e+SBM0Aa_ryܢE)rL @HE 1jpTĤ(p Q?<$DpSK &9<RS-+$)ThS P`)jR3DFK'>,p\]-9eC56UrW}5 >VRI$$I)I$JRI$ BI$$I)I$JRI$I$$I)I$JRRS^/~?hIk~ԯӘ[BI)~3wŜDn.T]ȸ2$RI$I%)$IJI$RI$I%)$IJI$RI$J?^w^X_[2|{~sEs +AZ6KS)X5LܧsaI CCj- DyC0)Jl%j\bO$(j:uN$ ):|=B(&&3*vZ )|;U`ElUp~ߜ=!2NxD`|)36&j@kI jTO?528Ph<NT'(JwO>_堻\_tSV h;#'r )m)B,UnU؟)mS_❕n(7?j2A b^I>i_-o{D2^51_Duo8 Y"D'>M ^l )au{ ]^B מ;o)R=|?%̝|ݩM`Uq?¯t.qPt"ݏ $vRʭ>4:cU;֭m4U DL P OY[99^8Umq#r2岳k{O*}K <~ +M@;b ?t6ƚ!I\~; 2C5OumD USIfa ;D)U u2Q(hSHV;Ru y;F$h˶|Q/5J!MM7HŐR HհH|6Ψ jƿdMcLUK=3^x~?r32Kb #IU4kth9UX恒h\|?ڋY>1<@1(Zq^>HwOܓqw7A H^\V) +SE#UtDS1ShQTZ)ʊH!QNFƳP$B^%;a.T!80C2'!G&A"+ "%G-K)iR$1ݵ-ҤuI% EE#'`QiD5+rh!IS].~ E8?I_˂+rJ+xI9 +I$RI$I%)$IJI$RI$I%)$IJI$RI$!:be$ޗ?hmI)o_?g\JJRI$I$$I)I$JRI$I$$I)I$JRI$I$?\w^XL$&H߂%t\ϽaCK?YnvMƊV*X;)5bp-B]kMjKU5n%*!DJ[%$((TDPҦ֨qP#Dr?2P%KvQw__"١kxU3@,ڕ7w(-t)@YMwR gWqП)(ײpB2dMuR~ +3R)hM[?f$J 0<esdRՔlܨB5[x*#Yz4Q.R*U:YU[$RD0J-#vD/Sl.vO(X9gRq2|g:#>ͺ)  +$m?CyQ +mywZjϷy!)!T4xM; dA=S-xp6wiUxVBZ%αtE9qǺvkGx(cORiϓ\HS?8xʮc ԥ:dr^tC5X9I z0 ;h>LO?)4XiS>]Mn?UH 6*A B 0ve<G),4XUw5OU}FXP gITmy8r` +I@wDIA@N + :uIΨ[E`A"IL.&LcV?eL# >h0y;&Ȇ .dWF8A4 I +9Ѷ }zB9Kv t zL {|TDR\=kS‹5E<e&|M*JPc]xƊ_ApPLl8' Ji)cb?SNށ^Y-gDc!4YC}&.Xz ޴i;?UDO  53-(n٧\7NO-ُ~Uk-߇PBkB~͚|B.SÈ"Ot{N!VΔ꽖nLR#SaF$qMAJ%AxFPa9Le"ZADx&!I)QI8nDIڒxج(2k‰bF%4@PG o!Ij +M(q5$̧Ca2K1Ak0&&(58M)JJ(R&1IIU&xjim+&a E4o^i)qxDv9bjVSB04I +19)vH?D)4&&S&4DCky$7=WF1L)m`>_޹ٕr$ky]4Jpe"bRN;[$E`$tLjPH#Ik&쟔BP':\JQC-xOafYm28 Lsה(G :CWCO NB#HAkԧU %sKH@KdI GP:q*^7H˶{$ +9XkEM*)-:9y&h!1KK7؋^k_0 K>6u"u  +Q͖9`!uEFLi],pЧn=X˗0U_&Y-Hy@8Np5k^ad41A4|it1ۄ!?o#ͤ|⏼T$ F)W-֫-5v7Lv@U9 z~E #NON_k⡺R&G#ed.Ta8Y Ĺ0rN(D$$) RJjrQ6S)O Kr8DRC–@RZWTJ}RhSv~$"{% ]DI bg5jҸQQhD(=kTP:)PZT))(,\$ 1ZKpV5(!y)}4X(PRM\Z%"RȦiHkIerDovS:Ф)(KVP"yGecThY©e%!qbjBpRͦS&SaI+ }.uΕ}BOo7/r?ƷT jWRB㺒I$)$IJI$RI$I%)$IJI$RI$I%)$IJI$R $S_ICo?JwF~E.oO?g\RJRI$I$$I)I$JRI$I$$I)I$JRI$I$ڽ[XF?+ʘSYՏf_!n.x7Uh>KkYr9lJuR5Ҝ!%Rd|SR=Ka$+@R 1jH\ܨRBÍ 8F!Nj[a88(  LI \ +O*d-P&I!~+Rb5h`pY#c ZzĈFiTmYr$΃\"߹#ѱӡ_✤5j]$fy)U\;iM$YU@&dAaEO*:d EZhJdD#DJbٻe!-)NCvq=O 0fổV ;x6HSl =0 j8ӹݓƩ[cPɆ4DGr 1Ѽ(ZB!N6EccDlk Hlse*-T8RꫧY=9W0M|pSc-~ff*N:ݔH +$FEKƈe/K'D~)^RR3) [92BrY&NJa"tM4Q4o d 6%I e*S"HLuI!1;m\P^ +%0RxNҒXrzܯюXJ +VZKh)MpjAґH a1-RR93RS N& M9&6uND `PiRA,"P S$֥S&'iRؒ6Đ^`G(,|)9Q)Zʥe!))Z{4]Ipsl@oc,-+WRB㺒I$PNВI$RI$I%)$IJI$RI$I%)$IJI$RI ߢJ?JwF~E.oO?g\RJRI$I$$I)I$JRI$I$$I)I$JRI$I$ڽ_YտW1zlh1S:>ް[\ Z !Y_ '3dФcf *$ƞ*^e X$BHcN4Ӳ}ɢRB)%RR7qF $ RBSNnN6"Ejঔ吔jjpd꡶JALڍUU`QRP$+-!cҴjpWhVN%S5q%H-B)U~G)6)GQ Q6V5_AtJհSSPH-TLfzp9TlnYg⥸EC'{QLDwNXX7 X*lDMi.P3oU4X +OV('i~b{[$!*ęPk)$.ëO8?Ic8URffzhk--Wz[w$&gFvCsܦ"~dfa{+YmRB|8 AcA93HlזcUn:;\y)ʼnHwm`66򰃷j4O3կb@NSR + {B`h~*nmwhNgxR TÄB8e92,A8~O*U>HZDaQ~Hӹ#yXyPk߲ZY2P'OYp<'X쭳n|J7ð_Ȳ uh_ H#CO3caAú@p򲬯jHΉISyc\ xHj#BrSC ;)J+)Jܤ|(̦:R@OCHjҿ RA hҞPZTJbrx@N|TP_9"$(J#)J L^]SVZ"/AJޜIiI BJ IK vMbILũx SJGe2ܟzB3 H*`®f)LT ]AS~h@5Ђ( +!mڂm J7P-YPX`@CU%pl)(EU.&)Fwh;E)HZw~%6ILa8IRZXjbSES N:~n$$Mt)n!? ) )@>BJTq ZCƋcPv?$ɆlrvDz=6#Xf*spSuϏ50T9VADu R7SP+)ZB) }B YΖɈ] +m-e{dA;D C]EjJ~SJ gRѵh8nU*ˎNm2{ݔDXO"mDFK>ϴ]TND \%:9v\וJ{kp.SC"̘;C/`k|||e ͡E4KmkGUuN6jѐ6fБюPqs(n&#TUIe(s^k$TAحaX#TvANrڦ%q'D|{CJG8th4ByX!e`[i0{-\Шu ?PnA uWL#N5I!<'[Q-*NvI oM2B(\IR_Qv$ @IJ B;_s[;5:r.pH2,lr}Fj= CK@ ;ۄAsZlTz@K{M[ٷy5=GB-ljf@ewDhTa*թ S*pĸ0BQqNH]yQ "#U!Z B=SKTNBRAxN)JjҐ)5M4fQ%I3&be18*0อ(EmA+ LA*ڢ IJ'jpgZGۧt˅())RQ rHd +E !F4er +D bahPFi%5OT0m%00!! ʼnHK2POYJD& +AJC}{S۵i¯!iJ龢3,nuGB_ i˸k\;QٸI$I$$I)I$JRI$I$$I)I$JRI$I$$I)Id%:?hgvIOA73.)v{y?"RI$I%)$IJI$RIJ&RI$I%)$IJI$RI$WV>'$jk|JlU5g`Jm`J L1^IN$<Dh N{[R.4OΨGT> $gi%(SL)@rE$c]R"8R-O4n"e7(+Y +GD:R)vSQN +*foP!t%v4_ʲo 01wQHSn΋#ȋS 9Wlo+ fiw@=\ĿN_Yhx_ CHg[=].fô42;y*Znu ͏%8 iOwOCfANG m5gEk"eWȠ" l mk +cNc(?RǩՍK[(#k4ZaW#䍐C-:#ۏA1ם~*MD Ne uBݯto;*b<'&9N)J[v- +-5T"OA[1aV'V,v]eN,^3!=h\ʌF\R^>>)ƺ"Ks?BJ|TD >IZƩڜ%S[l+U-Y iƞf6o$3i=nJBVm|jc7pDyT5(xTDiCl/|?`Q1|5FAfڤ@]C. +qV cM& _]>)\E^y'N}Xκ/Vx.*W&Z=Õh%s[_FZ"bP6 yx t+&OGp+e;xXީ#;D.d75~Eվ^Ywk&U +QH+S̤\Le8Or`RKt%r)۪Q ڂҭОeCrrj{6&J8Q&PUidj5*!.8N f()Q"I($e108)a0)Lޢysk:qjj,w%Cvu'~j#3E-h DYƟ +eʡw\yXPe!%"\*%a8oxO`EibׄJLTwCi8P.ܚF VWEp>>/Ӆ k@$P+W4A§c |R0Os ُ'@ݠƊ㪎R-zmtzwre'k=ё!AvHu;(w&~9IK|n(1(f@PH;r +efg v)Wvvq8Il{53:aVB x]54aڬ QdٷHB!j$)BQ Zgiׄ3QޔG]~ZuV qv$-L?*dJ6L"pɈ4wN. uޜZJ}$wH4Nd$<> !F%%3eܩXKCOAE1s#] +ͬ5bEKΩNDLi_wz~xQxݪHQ1Ήvq4Q=%(D!KTOT|"cwy.ݠ_چ9O"5ߏIk-ZRaXX_'K%[}SL|G}EKuFTQr&#i!yoL~05C'TmTopY4P 9;F-+@i )3lMQYh}j25[Uf!DZ Yqz-cɀ#,Ú%#\5va9!iѬGe-ͼ77oDB3杧)ۯzD$!7JβCLy!DpRħ-<4D 1D庥;D$G'>)"p,>)bO}Ȩ= >",uvX>IROyJh0uTI.))ѕ"Pl3`0\z| +Y m] 53yH #݌j0A.(OtN}j%ķqIhR"RBږH*e90VH> 4“R@ʯHQ¢Ni)*SS)-)xD\M)J!LȔӵER;=*L%-Ѣ*XI4*g2bcTܐ2qNhBjЈ + a6AL۪t!%4BtJa LrD |S!R).H .ꞻK`Rq?ƏJƉUĕvm$HI$JRI$I$$I)I$JRI$I$$I)I$JRI$&I%;/$ $woO?g\RF~E$$I)I$JRI$I$$I)I$JRI$I$$I)I`J]z?^F~>%7'ʧ?냷_A` w됋Aagy~r8z`I&)MRZY8&/Q)Sa S̤Fd ̠"-<ƉgTӔ|(b{ҊpI'<ȭ^Rv<aLEKQeaIxI!n_XV%ۀədhOwoĥ;m7B Fs7 ;M CTdôrc]Yh\Y(6Xn>M0g[U"F#LzSǔXH\r(ExL(t*Qz@Bw۵ELy7)S9BS9DCpd׶:{IVȯB~etݡCKZݼAHB'IYQ3F⒖-SK!)Л3DGY8@FN +2BJg~IV6!%qL(IjV9@XQ_Na?cU]彵V۔Leΐ\dzo=r"6c*Or&zy:4-ŤBg 5I:0'-KNvR)4Ei]M:EIHˆj=\-%!YTvKQp^0eQjC"LeN0RHZ<$F\|u|A CUPi)Ky +F%-R4MDsTK{ + 5PnD +Ѫg;OEc1[TEUQά9sYqiZ8΢ sh˼mQCgk'Zbq;4HZSJO L#kT*- +CT +iS&):S9tFTQ"Psg&IT2HN )DSDXHJܥ*$OJH-ɣ*^S R)rRqL" yA,ZTe10 MN4A ڒOm!?*;LSiPxژRj :T@.HѢJI ]"}˜KEw(3Aey/fUq%v?UqGjI$RI$I%)$IJI$RI$I%)$IJN IJI$RI$2A%;:z_ICgvINȸIJI$RI$I%)$IJI$RI$I%)$IJI$RI$Bq׿߷?.WM+s}?˕|,L a9k9ORIK0l$.])2a0;QU,$)( +ςn RBD bv))DB'2(c3)nq)8E BNRk:$)EA*fޛhiQ2=C.#EsZÃBKj„J@:!}ШHmHSexd͆aP{É=ʿdDGQQf"fݣTkbQ#j-L3mu+DQ!T !aɯ8grPaKvJ@ma mN_D. +d8N(E1!%([&܁ +bjKV*YpVtҟaexU}pmR_IHcD8n"RwI=%ࢄooo!ET=S퐒Tu6)av$Kh:̧wƈd 'kd!QwHE̸LХerJ/[H;P"RhuUBr҆"ah3SvUf-Е1oeTDD6, +Cm&jExf^]Ys@tCJm ++V6 H +?G)U))ܛt4H3^FH>I&:hl! Zÿ&()tZ%pS69+`;G4;ic YS;ZVਿ*%НQACQ;pcT%˰Sm +] +D- VUվH-<\h_1-\l<*U7f߯ӆQ[JPXy(95nPCISSL$ьuHJ TFQₔ\ri$D$PRKlЈRp|zW:D' +ܦ +O(h(D:Y ƪ (g\Z6)NRI$I%)$IJI$RI$I%)IE$LI)I$JRI$I _I< $ooO?g\RF~E$$I)I$JRI$I$$I)I$JRI$I$$I)I$J\/`1Z|/`Z?#wc ?N~a*>VbtEaRi8R +$$Q +[&#\BȅR%, x$ HJ L䆩CөMJgEJdTZԈE \ NB )8B2ҿ:DRqI +H=3tO!.(hxvP+] #௰gbW[#]x(dHw +-Vò7fՖnPeHVF$&7EX`TxZc&IQ2xR&J1&1 rJw92LTHIL,y+Ef Ty6] :$&)@efYO~ "D$Scz PSf@>JN$TX5/M1% Js@$IDivaJ%'|qcLvOАDc=4\;_p%;^QIrT6Dy 'fhc?4qc3r5ùVo:q'k9 +ag\] +x=DJN{4pV=m&Id+f +3=O)s-lAyZ`UZ`c'+Kq6rAP!J¥6P V5$I2N*PcbRdHS'JPR4JA9+l$wLJpJ<[(̧DrUʐ3Qj}Ғ>R':'-+'NRAbLvcXT9JcUcE:LI]v$/ +0nІőJ`B8o''tU33Z"ɩcc%*CL'n2ZJ;: kh;SA r:Sn&d]2(j%pcKob/'+)ֆ+[sUwA \ؤ܀Uzqt텠AbN4U߂8Ff[gms.o#D27jwV!sl&fvQ~ Gg\k՚v/\1| S={2y}|q`3HoMק!Dx滃 C{)i6lArݺR4LE)3nZ{!))%GA;ԩ,D(Fmk5Ɯ'+N5!-MBgVP0NHM{'5B.0ITVu|"xIi6ZZ|0ݿm29RcX'BD.!Ks}KiaйpH8#QAƪMly.INo57Z.zSV:4!0)a<, *3[g!A9>)*ISD ޜ;jqdrLjft +N%0ۻޙ +O82m!.U䒢 +AMꓫŞO*-mwtR]ݪHd88SrHի5vm6:H;7_ZcZ{P-*  SrSGt )rMEJs)&4LB)M0[ +.jx\Лt.Q.MzPJ*gSILSRUArpJ`{) +>aHjD$ +)(2iNv6zvT +xҔjAS%e!u?T$O.*2= /fI ]?*I$RI$I%)$IJI$RI$I%)$IJI$RI$I%) pcvM_I%;{y?"˳))PDI)I$JRI$I$$I)I$JRI$I$$I)I$J]Eb֯dU`Mʡ}p1{bݮC0h QfNˆt8'Sr %hT)ˁIL`6J5ׄ hg b%(':00J@Bb)-+DHHb-jD' JSBirJi á,D)4gLJHש([R],%"4BEtN#+QXN-b +$[xeB–!* vHrMw4( FѝS'{{'!2Ahcq#R̬xײ}G#{ J% $ORжkF6l+],[9 .I(Ml|u*$Ӕ(i8% er8ƪgEEM,*Zɗ쪝T7fŲjI4P5Ld {%%1n$JHJ纃 4jH)5Е0<(Dt>I9Lt uSc ;"W̤7OGIǁ@R )A +#E0'DvTeV<+9 )dmQyOg3iH.X̕o~ ]kv,-*tfZE2^Er-hyPu{SJ)j䕤6uWF t u"9@ASGr oAQHgҒpC E铡Bsvr[0OBK_?'@i$Y@RmQ40;*$B;)N0𓛵0()@TRU.Ffk@h)-::JgL7QYf֞4![oS'X=;&xԃL9!B m ryN Q*pN7{])LyU.9o? pJea-^^|Qs9Ƀ4x%CE;d[ +'T%-BD$$SBVzRTe8.\JIL5Q/O)%%iPsRSBXҜLRJXwYIPRA\ R L +(-`+TJ2JܤSkaF%@jiK9N%SB H?}Rtr#][APs?#7/UȮf:r$$HI$JRI$I$$I)I$JRI$I$$I)I$JRI$I $soO?g\RF~E$$I)I$JRI$I$$I)I$JRI$I$$I)I$J]Y^0Rr|NCVEfV$D=IEЯR+2*~O 4A> +s: T0qV#-Zҍ(3rNt T Twh=''[tgd6DhYGtN hIL |#J>j SpLD2J!$ҭ3Ps_=2>I!tIXL*M   k}fѼFvhd-TcES`()%D)ʋ( e4Za:t +N[#+p:'-%A<@L|̢۴Euΰ?z#sKL;_k]J\3r5UR +&èUà8iog8:_W)U~ +`?/.> >c FՉzr4V%T'^Ʌj3A:C0C4(n(B4A\\|iRiAL_ R[@E5Hh O_(CBUŢ +%[DLl&ye J)T(!.31 W:Te;J!$䒴lJFyڠN( 1A}hz%FIEf-Yr`jJU("s7xLDV8IԂ\b7xrœFpr%\!3`2@$F-(G*?w1mQZlT/aOKiƆTd|BXJykDd8VA5 .YXzoiBBؚg*>=T-s.̡gV [XodCHG(.HBHY7SyC0my PVy B@"[rJ[SF;F\Sa*%*4FI"a%F{y ToNR"#jbӵ8)E!a(N+"T RBDxK)eD R"QRr7& NhK;ZwTʖ ҒʛD(<.=AMNJ +A)Cvc; QA)ߪ,;]wv?#7-U\;7I"$I)I$JRI$I$$I)I$JRI$I$$I)I$JRI'S_I< $ooO?g\RF~E$$I)I$JRI$I$$I)I$JRI)I$JRI$IIJjV|WHo&CwۦC);g!n;42|śd)4n:Ir+m3G@ŒM%!YtR81d>iB`e-%2"ShϔȺJ@rEi`D&R"R韪L"\Qv&.Ve"RS7$SJHQ)n%2 LvP.T"Bv$*+SUg hɌ_y*2>rn?A ܉NFU4QHhAN_/&I c{|k[{#IT2G#hjyS4zBi%Qy}4i?l=pe?ݴ2#~I >=*ti 'q+2zuQp;-4:&;yxF9(8L߭B[g 'L +sA*m +.ZʥSbˆ%"aL(m>$DvIKx~ {"PR( '"S폊utlxהǂI +CDlLڔ\ vSD쏘} < wHوD>%6^w!j~Dx.nN5nsáNb)KO0DdN-hNP҉V\Gw{*G"ʼ yvv;xGԵ +MQkʜqn4l.M[ +d猆""^n*RmO>/!,n~г(o죊($sfm1BC+*8[x8AsrAP =ya܊01MUa!2l*2ͨ5!Ly1dJwݵFR=:i iŎUX fZܰ8@L<յ)L#,4ݽc4Äƪm+TTrSK[8_4t(RQLS\6ak—P⡄$'RHLQ];5WٙQ} M(TW ccV ̪!AEپjcla-%: B#Q> +5"Y+p%eʲ9J)R甊4yN%J_t$tQR3])ŨPꓝD",u)~J;]:YcPG>ORpO()`&Ox [2dߢmʐEF th9/G)..~SCJfWSjRi*~ $XL|arW_t\oW9mٷN˅kUkj5˜;0!-*<"_iqbJC%ú]Eu![ rY 4Jڝ*2 ۡ]egFG +%=PpEE%5Uj| 2Q +e(;wNVZ,g5m8hV` ps=ڤX~4AgUJ:eʸ +15ZjY8z14V3r3D('E2P$B1˷UwUh6Gq%]ħndr,6J~ G " C`«q_YY*9Ҋ\7mp2ԇ%UVs`LJg1 +}/Bt+8԰H3Gf'ɬ@{N LʼS)p|კxDx&)9JHP)$2iDB}RBb)E**%Xzi) &j*X QR[a1)ӄVp yIidDBZ!:ML8!A8LN֦&S J !ȵꚖCENt]|T~wBO1?\ŒlRI$I$$I)I$JRI$I$$I)I$JRI5!Gq% I9LI$A2vf?EX݄?a$]ȸI%)$IJI$RI$I%)$IJI%)$IJI$RI$WHlbY61k&T7xϭVF1fXJ%8;S SxR %ME2Ԕ"TZTe%)ݢM)vFS<$@骉 d$KKSv!Jb\))`53R" ZTBR2)!bR$ QBR#r&S=S,REKSkLpWV(b4z~jiB>UZYڣffVk 'E ,on_lhB8T[XXl(7h{'L7wTmOQ@Qul?N +?uYla=3m[  #`w)) +QJvwd%*8GqSH!ȵjwxE˦ *f: E +qr}QVA\ICJ*xVˏ?>ԉۢ^^O<,^ RAp[v'MQS :$])%,T'jL:I=v]*1N@)KRi)ԨO 4*fLsip:ӄW6tQ2RSahWc@k&_k/HPX[lj [nxհ|ʛS$rU,)o#2?ӢW(PEU['m"w{>V_^p8)zWh kTS,^Gj{MqYV"~&IHK|peeP*fӻD1C2 DrrhB;Shy#ճT/Fnۄpif&7 ݐ¨X`yHb'?)LeVoCY1Rlܠ Qhu2Gb˪ +Q C 5U/w[\Bф&u]') k8E*i1II1]UNɃ ósG0AJ ҈˝U| ++(C+)[ pv*%QC0aHjD$)4"@ILESca%3)ۿ& )\DjL_)qKJ)L ܢI6E (@EjƒSPt bE +R. e.S4'ELN=BH)!](KuBQ蘝]q~UmS-ԫu*)= &3tae >(ăŠB$P|=;ܲ1Qa`{*ߪ Djf,yNyM[61& +Z鿞a<sv6u CTZA 'T'DT:)a EC"9ZF\}\+drgolঢK11/k~ +m T+Ue ,M5R,y +QLd P:Ω)t1 ):';G uSR,R.Ƴ%0l-ȩ$ E2PZcDһ'~)ݯ +o  +'+ɳy}a<%ƽ]_6*U3y6Uok/zqqu݆w3+/MK[V*吊q}``K3`2cb{wR9>t 3 hRVѷ׉[hRTqiNBJ6S?Zz3έ gCcཕءe-~{ Ϡ>c6h4^ZTd5 ~g[33V_q~a-C6a}&)q\3ji`cPF™Vt(ju Ru:F&_৫}AL۔.I[+6SY&}[uRպ )]:;k,LJT\+: Rl%4S<ͩRqTt%]A\3>=}S&kd V~1|lSAY;TȔl8BzO OD#T"; MkKlj[\KhJJݮTtqf(q;TTg4'*2% +DJn L(.TCWUeJ +$pJB*E'`3JvS&Lt&')RC&$ 7TRAe m!3JqKK-ДhOCT)T!p2;Y +`!nEkHK쾧a3tNwWF-Ӗ0w.aF6m)$EJI$RI$I%)$IJI8N`)I$I$$I)I$JRI$&NԔlcGI)F~E$I%)$IJI$RI$I%)$IJI$RI$I%)$IK{o^$Ttů>TIV[Z_Yݻ!eUn;4'g;OnRkDPɭ1hN!%2tRk4E%2:'Ғ%@NibJf%yLZZ'ݹEJ$r>hn2C(‘PqtpRZrQ$-*RJ*d l$s)0(QAf +-aS=7nUݻQ[ Qȶf+bw$v $! vDiS2 +nZuUHVL٧u^nCf$;WKڳ '`}d릠)[cNʏWvcx{D8['KC#t|K1;^~!fβ:]eRx +Լ[y$w-v=༔[,WnIc,A nFU_+^tm{$.ǐA{K\&W^XZt?Vz̈́}JlSvn>+۳pn1js\BmF|Q1-^g(Jګ.E`L&a zR]>dQ,[a;F0Xl-vNIpPQJ D^_լ}`$r{v X6질y!Ȭie->]֝@h_ hlXn>KF'b[*V[r5;uQ3YE +k`Ol+{NL8j o}[1h . ݟJĕP<-W!q6 =L;pJ`%}zعCv柊ltodUŲ*'wBŪ1*MB%\U7{rH6O22!'E"HOPI*/HrS"Wi.R fB~wNH`\RnNQ!#vCH'̴ TN(mL匥HhyA~S"b)3uO)SJ*NbObVPJP#EP|W p;_#c; ]/3\ҌlRI$I$$I)I$JRI$2I)I$JRI$I$$I)I$JRp;RS?g_I%;{y?"k73.)%)$IJI$RI$I%)$IJI$RI$I%)$IJI$R^IWU ^L5 >U >ӦCe~2,n;4FEc&x$ILڐt&OS0%;!Ct'))+uR BJg25K)鎅$ALII Hħ.L[<"yM$-S%%/r])a7t!ʒRJӅ R.2D.Omm?I>c&H6`*SOTiU<f(OqPdTizY15ŦT-3 |VI҈p*L|'xD(.SFP\͟J\*;'#KW:S+1D||L8yB5]?Wۼ.i؜[鍑R1&nJʑ@)m'7v )qNϺVcZwuT-Sti%r9aJf\i:-։I.3 +)TmLؤ&SRB)JH(:|ZRAS%`bɄ|IieLdyD`8pDm0`OkkvSUl;?[s#-%Ψ͵$HI$JRI$I$$I)I$JRI$I$$I)I$JRI$GS/$<QqKI$$I)I$JRI$I$$I)I$BJbI$$I)I$J]~ƯxsWW_BfMϬrYcA+OXgtlіU)Pܝ-fa%% !'7S&S G*e JdDjD a'hdhS +%ҐidT ""Pe12BL'0CR'" +r)2T̺S-% ƉQAf-!)('[Q =$[8*EgC8ݠr]鵿V;Dd:kU FH{SmQpP cnF5r{U(A$ûD[U`|P\ SjJnY+@ʺylS^Gio) +A\-;wkr"Ρ$nR8nEkSȯXt(Ma}%Ges ծ̅0)0@tkS_D0BxMXSs \ @iM+, +Vj'䒆_>\ +-<+` 9Sf}p>h.^SѦ"<yJv[U~KE mW׌w 3JPV=~澼uY!qД\6^Hos%]m{Z x/#jޝ>BuH&@\'Ah.ҩ$ {a@}F⣖)q= χ Su2~\`'0tz]>U3{P5a^i^})ꎆv8JTL{C8J̀\j~ܛPu ۡZ&щ\M7cK {bZ.h*}`EЭn4џW?zm xGW:2dRbILw^?FJon&@]t%fz$ + ^1+/Ԙ\ _3_JD]!4rEިfʽUkRY6W}FayI96ܯ^CCOEцnHc:gu$>uI;Y; s6\61]Eo2hp=,VLjYL> Vi +c@w(~*@hjYB讇K:iHw*<ƚ*.1oEb"m;Y.lu%c9[\ԌL)*0 'v.2l) +TAQ)DS*~"TBvbi];j1pORɈR-ĢѪ'ृ%(pH(쐉L +Rj~TxAvPkH>Dc"e4SuN +D$TM)M;QBJvMRviDLWWk=?56y_>o[s#-%(͵$I)I$JRI$I$$I)I$JRI$I$$I)I$JRI$&NԔJ[?EX݄S73.)v{y?"RI$I%)$IJI$RI$I%)7JRI$I$$I)vq?VxsW}Y_BfM7|(V^͈WF#&PkyIaevD #HjJ\)7MJCTIڒ=Z%&! +eOYL])$2!Gj Ω$; 0E a8 tjLm:&uSl.nwY 8ȽjNO5_x*|\Qlr"0#[IcE!N%͍|TܥWMO1sg9>??%$kB䝚y'{R?PMh +DF%M0|o`ݸ4+d-]c pݥuYiXW4YsM"u%9Q b]:'iL?VH{DxU2@IH_\v+GhU*[(18ˢs`[V7#iRƅ )*9l« YdѱL5D98>). BcHS r>I]uPue%9Ta(D)pHNR̰d*}鶡eLu\eBRfԬ7zWWOv^ҾӚѸp )5P)~w +G[%yP܇Y{ItItk2;.h`<\[+۷ˆNmS17!aT'H` 7W}dd<{eqUv^<=OW}d& 3n|^OL\6P:T|Wr|O5t $ϯp LvWhlӟs{G}W2{O޺~S2 v- 4hs^\",?Wd9ۦ QShm *X?cO[VW0`S#MQy꼫?ݨԪ0g:L,v1,h9=gi04RIY,x{<rFFCoZG+7nviv@)$T^RBP$M ХRR_puMJHHTԄD8R&ijg;r(+&<e*Bw& ДLL)"c%A ILLEK0E I;`JQv|N\ +"S>񔩔nm³CtF\G(t]oUx69?,݄8xen3չe|ُ/1z߷[g ;M-`H_k A!d@ߊp] +S'iD;S@2 >)%rcP`[%$k +]#)9 +aYTAc^w*Q Ω:XOFklrNR긢k7)5;˕ 8 Tlh)5QqѺN;Uek=Q se%,q . vT&m fTjqE3(8ΐLsIbA'D*ҿy(dΈ$lLD)DK;Nmꛬ i:+Cf&#UIng!u4*hqO^"^V-]GLIl|;Ҝ9wZqBsdn,:UrҥbVrbTߎ|Ȅl(eH)Z9ŽSp%(7'i: LjbR1r"B RDDD0%4"&ؒ{8qGj ҩˑyq5pk%iV{Ocd| +ѫ5<$J/cuzrGƫ>kK@_tO{W@s.um>K]IpPPelC䍅2$cJ2u7#VZxiu'UHty,cC.ԃy+Ga7$APqO#V c.&8pCU롔 ;|sA9 gDn*dIDvP݁OTF8N$zW:JzU!j[9(r(=Z`S))pCJc(%0 +A@i})S-'ܘR:')qS pS T(hQWF`œJ*RN + +~$ҟ Т$)Ё*iNԩQHQ%I.)`e8)#Z+٬WoGZWF+~˳?"[]eaF͵$HI$JRI$I$' IJI$RI$I%)$IJI$RI RR1 %ko=%'q?GJH73.)v{y?"TI%)$IJI$RI$I%)$IJI$RI$T$R^pP-~:qLɲ}et?ⳍ;Pqܮ ˧@j8Iae*MrnIjG98(|JeIJa1S)&CCBiYܘB&$) KT4sdP6J(\Q-NʆSS.RDܠt@RB(J(f +mQcOe&ڠp3go"4J]qbgFAKF ;(ĨBi o8 .圁 i1a O ?TY |$c'q5()TUDp1.)ltB|@L]5/]z21{?&K|$y?$iC|vS:PXSOlޒJɃhCjEʱ:'%oɯlӑx,r^dWDC,R^ 3YY&(3 +úk06OHSPXvΩ0uRKsrk"M'i.泯dz0w.A'.K埢y]&Iv +, U%Wqw=8$X;uHpR*sy9ڋz4ΉD %ʭ_?%ї${|U ATtF:r U\0*l;x( mU$VsBAV:*ax&O#\ bUUwȫ N-M୕*m7%«kS[K+ZsC&AWYT%v]P*2tgI:|%G$jg[ +h=WjvwP51zY>.>dv+1#*z6<J>i>>+h ʴbˎbOX֪aZFz"2>ZatMW7+K>PL-3UY10TbPRO2C)SDߢ`eIR0jB\*AD4NC6'1Er&sa& +`Iie)6BKJ'-Nrw6PB)BE$(JJ.Ф𝉪]+H2]"}#U<}ug,5]#fڒI$TI%)$IJI$RI$I%)$IJI$RI$I%)$IJN D)}?*G=$T]ȸ)$IJI$RI$I%)$IJI$RI$I%)$IJI$S&_Wc{_BfMgu?YBuWFin{TM ,)CR2'rKTtScN;!ςv$`B@n1N +\x()x(*[AC2J%"*PKDjBx.M0:)S$L&&RLiBH/œJQAe#tC Bv2ЉiǷ&9)2Mt& +[%(:yEBbu]9B`-W2ujm-<;}q:s <^K +ll&s6SB"mvJH٤8OTtW\KKd4q-29Z;n]U }%^n57Ώ`ۻNy\D]=ʼd + ZHY6w*.'D-upwpE'c +Yhw(a *+jiNhhH*R.P4kCcMm Ĵ.UJ}~khf*b ##WekQ;_#uyݼ矚woA2j/=o!l?ATpiWsL^J :'qp*t=ԎO5UĶc)hUD7ߝE_5Cl4It\}MS]4- +[D9'CZw¥g՚ߨAj2?d:%w(;Zj+@O^tGE]mo]A^,ݨѣ(fCpf%KyK+t-?P'lvA6SN蝹 A?Uo^m(.T9Xl:%A#9.mGLf'P*2CK> +k|? ..-,^ʋD'tGWtkv.lPLyB&;qþ iAռ 3.N=C b35-6|,#5L9 +!\Z.]NKe^ݮZeV?l>_F]V#9vPjI$R&)$I$$I)I$JRI$I$$I)I$JRI$I$Jp;RS=%/ENȸAJI$RI$I%)$IJI$RI$I%)$IJI$RI$ɋǯ/ bOq6H|?Vx}`wT+f7)5j)-!3'Ti +I,d)Am$5Qޜ12YrN7>Ҝ $a靪}9IKB12ȨУ02$& &%>KJw! 4)\& A( ڢ +cT )\P*"Sąp#!"JTw( +i. a-,d,e2qz~A&$DUCHbn77D26? }A=1T)mƨ*ٞɚ.=ԋ: 'IQK8j@3))xʞe_la= 1uH/tBpZ_#x+> E$Lh<{K)wNG~uZ#DH> +dJg3w(ڈk[RϺgG TVH-7u5mVBq}jEwߴ*L743&.F4h,dDaR v(N$e ƅ%RR$vAL^wh9ALAG~ 'ru.oɛ_Iiz¸PG0=SoOk ?5Ę53u)NOCRPޛ$|VNl.&řP"ۖzW o2 +=~ԥ +H?rM:jtNpX<}OGd8g7XAϳy%;L%T@J >GujS8-K8kĤ=%SJ^Ɣ%SX#@?%7jn)(r8+2Ja %{Oh?r;;E-WJbgTڨ I6 HIڦhJyN=ˑJ2N5N< RIEQ +9&I'=k85eN!$+l$\$i)ЊӺRH)BEkRf蚥1#BO&5J}UGOkUiWg'N] l}o3oQJI$RI$I%)$IJI$RI$N $I$I%)$IJI8Dȣ1Β'jdINԟK %S73.)v{y?"RI$I%)$IJI$RI$I%)$IJI$RI$I%.=x[Wt1Q2lG_:?Vp0,* ݋J+J^K6=@#^XT=,d +@JSRC&&xLj)LT)Ipe)JRsR%2uOD2'EH'TI7)R&$֧ )@JHP T`/102i.S:h҉:BJ Q*"R)BQ=d JВ *NЖԻJV!t; H0:~yۺa㍲⑌(~ e;fAB8"1. 7RT&ɟn4` jd Qb#7otliT rwdLВuOQq +OWp3q.2+sw(X7y< Tוӿ@ӘàBtrȕ;VWK8<}_qA\!oem-BvnP k֩Aݐt!Jv:Sɬ&ɓ= +:݄0E e"cT .W+auO|eVF~[/o3o:g*6l$IJI$RI$I%)$IJI!E%)$IJI$RI$I%)$IJN' )=?%*uF~E.oO?g\R +RI$I$$I)I$JRI$I$$I)I$JRI$I$ڽע g^7&Od}wTKVۦ~UM[F"5f:"M|r)L(7E):Ta %/2:!qKJBRܢ5Ij'&=В )L"1 +@.$)JwhK*MlpK)BS)AJܝ1)B%SȡE 7'nME !80GTW;A+vmNA)́Nl>O^uHx'M2\֓I){ P|-٧ t)vtz>i5-Y94l6pe jjǚ&>NΜq(n(Ni?"JTy$%5Rh!9l&l$M=0ܓ&y?KbSSqt|T'U pʡ2 慙PwÕxjQSX*,oϥOp_+5Z?dglA4tVBA 7C}_\4#Ɗi#hPv7e3jbiH<4p8nǟy[( P$qi/ 2ծ)R#/u[n{{:^v$O({o[{D+,U; N⊸KϬ򬷯xs*.y DJA[ MtK|Qh:!2h(x^D@<8odtN\=x +?X@F.б뀑¶Ϊӊ@L7gƈMqb[`Ckh5 t) SF~ܤKtjAXj3*U,ܞy*'a%ZγMS)ŧ BVP@N̈OVlk{jO!~i앣6~'I͍Z+Z.kxUKQv=Z ŵf@`UK@TbtHJ°Gtir])q\a,5BN2 +NZvЪbT6J dJЋnԤ*<"$'a!qQyN|Q)ThhP"J*f:&T-Tʺ!YeaW(+ʖxڂ# ɓA9HnQS c +$d?< S73.)v{y?"RI$I%)$IJI$RI$I%)$IJI$RI$I%.C?5{I҆U&d!YcUVr7T3k~UTU2j0Pۯ(EaYH% @8%HZFI0a캐PTDX0T`vRAD(LD'pO -+4KrxEJv$& BJd 05R$Ž|)rl% !qtܩ'. +E mIjwN4MO))5AiDBuah!NjJCvhR!?Kl'2q)Y.:}Қ$wIy44'$[ `#Si!3L SUdҲC Sf刜RM=-*> ^5' .3T͇x]0Fd2Q]$)hG8;J ]ԤFG01&d9#O)n*RP[n ;ImiU,Ovœ6bm;򈔆I.Q-2'sԦ2S,HӮ)߯h;7 +A 7WHr5J~3LD06b}9%4*/,|U&'"8㑤!9PQp)){L[kU" +ٷ_ >KCr؀~?jhm({z'?Ѵ6o<Cu'e.%5یW6~*;f|%4'~+H"I9G}Pv#k:ĤjƷv!obmPv<' uNigQ-ޮ5ۡQ~$'qĥ +Ϭ`Idu(\J}ADHViͳs۔ͩP8U^gpEYP@x{p+?⸶uwiǚ5_X6w ezێ)9۸Y\X+4a,$.E|SΫ-Y|?ܬ4a%-'+SuoUqKE^' 8J`(:ELfR/w@!P\"3ۢN$O ))Bsٔ] lk.21˄_7~l|:ڣMjJLO2)JJb +E!g+9РR{vJ"<"T7M^%[lj(ri+˜=%ҢD':0eKtTT7[B I >;v%, Bs"RRr45FRS ]c+c|Ws`|JoGM+-igoL6TI$$I)I$JRI$eR尙HT$Fտ2!)$IJI$RI$I%);S'b!O_ArKOvѩ"m;46_橪RI'!%,I$$I)I$JRI$I$$I)I$JRI$I$ڽ2t~@W 2iu7~wU(G[_ߕ@e*M;IN,(1ƒ@NQXW=ۓDvf "6PǻU&-*r(eS&j{a,HO)$KMSspSTG`a.S.:N +HeSD&ܜ98!yO4mf d4RTA])#0P;uPXSNJ!H,b)ʉ2(Dj ~ j`FDI*Mn nNnL5)s +Klp'[Sǜ.Rj~*8<ъ{ H?0 ^wǕۄ ɢ4'nN~PVՉ8)=I+E3m?qԡ9OfSa}*sJ/f?@yU \P[$TOqwQ~^IaKETلMP줉07=?1%\NF>KGlwdvN!\AHH-Y/pL4_Ut~H.p"qO)9P;yD:w|QR7 +#\#rb?╩1 ~Hb5XZN]ޔ*sCvǒf{ZG T䲝$\f?$TMG>s;G9#Q,?7c0>"h>U%O_QNaG3O5NtNfB9lO%Jq$R +v>N4 ;k#/JO<#ޡc4W)obN% +[M^5VcAЕDmʸή\_ٶmO +x޳9Ti\C3_YQo1gwN~|FYep҂aaC¿OTiIOt1js{1:$6X'ddX0$ EUkߪ;[>,$AcDuNƋJ=MQSa0 +5j.3nIp.T J+ޒ^Ʈ 4U$DP4$ƹjQ %$2'xQqL +H,xHLp7#JetJrTMM)JJR*R2/!*ZW!>䛯)IWw\E ʸ6Y3C~'_omYO7VblRI$I$$I)I$JRI$I$q$$I)I$JRI$I$)0ƪ)ڈS?-?4ݷI9Oc;^j+w=OT1JJRI%)$IJI$RI$I%)$IJI$RI$I%)$IK{L;hHxC YߕrԏcPc&И5Je9i]uS NZC6SpB+J!i]fT5&)jHΩ M) D3DI ^~Hu$K&|0F?LAgQE)ǻT郛h8+/ZWj<&D(5۾I|R:y=R~ܠ'6PSޣuS$~}坏' 给q!6i \#&D y*#hӘL!&a%#Dn@f{DO6c73283 +\qdь{r̠Bh FGg=Oq^NmpcO_ʜ9H>Iwh\B)Lne[39-ms*zO@Gޑ vt>hUB.J4^@:*_h$rȝx00pn\~Sp%UkCaI+WcL~eYo}P)?T 0)%s5(NkGӺoծZu BJ(0uK Z' ʋ;ϊ\J0 +.w In#PGToCv A#)\G 1'b|֘qIp'Cn,3X' uOqYoE*XG q#k]V)q'^tf L04I&.&NY?~g7~7chdjTp ă +Qn|VRܒ DIK44BI)v̦!H* B&Έ3. Rܜ\K@C[poUSre=ґfNo$NR @5I楷5@F&jQHJRSfgO!42 ৄ51؜ ӿ$TMRhr WyC0#u΃ +WDϏ(ۭ)Q4 VTAmbAv|cg*,>idRvH);^:д[Z 'dyqUHW3sWI1p)@p?/vVLǑ%I"asOf:\&4ugNs]fԧT ""Sg0Z n^Q}!dOo,zktQHd +nLts0|s4ԲEqѭ^!tO_羹0;.f_eZP@gjEzn +nR~6b3ohV[)$۠>Z3l͒Np]n]d{)JakTY^jU':wMmL!4H|gnBxhVinAىR.- +-`r}6S1i"r9! yK_#jm7/wmTN Nx)ZS +]hm)FhM0AP8pD W7 Z--=Hd Zl(ݿ]O/i:EMGNvz,:{~;`A$5cT푠V!(f8I-|gtinDCDzfBN}#胪\$谡2;-0 'Tq4>?!7Zr +k )9ds{! ";,VZG*gmݰ+E RCH&`%ĪjO+Rs?QCES5BDD1,qqP$|ii AFYU*j%\"5РbGDe>R +$Ψ<%!@ +rIũ$H RRsGU?!*R/. /O +%%3k]noy0W}ZdcUnog/boVz[w~UAD6l)$EJI$RI$I%)$IJI$RI$I$OE$RI$I%);S'j!N%kpҿQKSI%)$IJI$RI$I%)$IJI$RI$I%)$IK{-'W{?2tH|S8:בGҬ,+@vMpYJ@‘;c(ڜ04?r >_vؒ Pzg :tE +֬H:GܷSF268|]Us[Ƙe޵ !S}䕇|F dߙ^foKt1ǚ:Oڝl{w7}XM +RGTx^6!(A2!Sݬ2䀬Uظ8 OtLF pbC<.n4PtV *]$K)hWU{ sWQ<\˝ƞ۴](J.|7]|yL jo36FGY%k3]:)$DwxHM?ޜ6uFRt SI?%GARL:J |ǿQS}GRi۪H+~) c$(t)㿂Z4=%/$< H%^cH*_YКp#lQ_d+gցݤ+}f$&r۬1$i!S;GS2)W;B'3~fCO#R0*kuHwiV![D'4HJѡwN'=CNB.TN\y K_&0^AKc;~sF-ڭIֈ[;~?#uuNN>GB@@۔UD:e3uC]Y:!K7 ZИrF:5!~ +7qjFH݈)V$O"z&'_DI]91qE҆hL0t|"RBqM! ]69U;>Vi!Pr}@{z=:4nN)}ۉ`{w6@ 躐_hS22 xq̨xH2>i];"IR٧U'vޑ% N㻅=ƟzM$D?O1 Stnᦒh%4nL'O*a?r)ο +SLTxDi&OʝQ:ꒃW3`2B^%qVc<*\ZѲ:eG3[?7mMd1ۧ?S^A)u; kUh~O3ròBuZDaa{-{no  ܄8$|㗩 Gl9ދ۠qM]+rcBf ^U6}P!-|Ё2 aDJeP;D(J}-,.!Tt$ғtD )`'T%}N)iI SƒTe$Z$$ +D$9r))'ʐ$iHJA%&) + rtm*RKZYR粀> e3 +HN J27X5H 3cX'$L 8[SNڑrq~{}%kn;>)n +lBS;t?,Qn%mLtSXLtK~y&q廸I,QHv[@[$.}ҞDU\Bѱo_t^Nl`Yv68gtڝRts  +[+"% l|ywu[U'|i 9q fM#Y) \ކ}2H:<(,;ScgHwXF'"ca7Kw]Gh(u)cVDa?ԛd~US9Ï(1ޥm>H}š(ekIp?zHJZlwPPoY(= -B%J*aћ⡐͙-=ҧeTzVG8n5U̻HĠFH$6WUtǕ^άM#P eԢ7:qИ*ۮ ζ})^@|?n+$d2 D74oԂ2xuA.|hY}YƷAИ!;?Zx y-|~Pq#@J[p RiiTFʖfsqKwxb8 %sX$!=w ТPM4Pe.S&LG C#総fjNn*@l&5M2I #8)h9ILZv`x'w )baH:-RR53dqt9%D>ca"WYsZ75&3EdÆo(7%@l=qbk}_GkQ^5CSc0Jw +n[7ʃgA-' on>Э?Cz:C=~@DTq#ZS=yr4!D9o KEY#<Վ@B=3A({(}`$:o@^!?5T +MջV^CU7_{>U&õ=H$_WIx7vsvς|~ʪ]WYߕUPI$$I)I$JRI$I$$I)I$JRI$I$$I)I$JRp;RS{>qI$8cJ{?wRU_)I$JRI$I$$I)I$JRI$I$$I)I$JRI$V`xnAJz^@Hl$>#=!$ġnR8Je8-+̩N3 nӵ&Y (JAѢ6 ÉK|RAdO`ПNQBF9hyI 0OAdR)S )yRC;JHH d(%. [pʈrD$4IND'k&9d'R"7dМt&QfP~ ݔF56"9RR"PdǒMו >iB b[ +UA)\(Jba +C$+hq۪[/*cʉtPK&aP9FITJc_ cR d(Jnb6`dVVd;m04ub[☴RR/]V0ߴT*(%y]]SZ3>\JqY!31!j'M<'ޘhENMv,7NK8춷}(QjTe69ZKVkmijw=0/OO%pa6Y(oJYXU;q(u +V>CGXKu QǃV(V;8Pzkw-gӼ?ܛ04pUS a}-Ylȕ[2$WPf̊ψS/hT:mdgF\W>a^iրuD\kM4:+$@Mn)u ޫHW^lm=^Vx(aY<#}'%.܀zly*ز|RQ2dOܨb=jfer8j#pSf]l) +v2j>mAN|*WYi⟧h?4!7murS wHe{-t&vHװUzg#tz 6*t4:9Ws=JFRvEm4fY$uK间JNtk{c~Ga$J~hhs|D#UQ{!mn)P9l#S(QUZ#M9ǚT嶷O)&}ᜧK-˖%WPBc~#̛+g/ ^) H|++韉PD2|JJJQ5(,˒S&hQ2 %) Q)D/jyܠ^Q& (jۢA0t'%O0H*&R!ANTTRR  JR+ZC a9&,*6ܒST0) RTaI keI%Kd$t9"7v46bNُ1Kb`ҝ5H.ME&=AyR ༥# p I},5(BI^;MHAI8HD?j}+JS00%)5a9fȐ5Z}?'{vB:QweGQQL)Ή۪ dS1nA"T;rI=W7ӽcU%,~̏Q|ʍ̆j׫PiޥD=W1jӬ[O#!ƄS/F~0`$ uõ>jUOdVwVKLj/ .`>;tmgqjDuMYaUz i+Tr]?\ nT)^^KOS}`f-)z&GJ)?>p*wJJ-EI]0<̡tFZogPi!'X򕞷߹݁Tx.SUGN=J@=Ġv)6/'Y GvPwBw!]vX"ICk(ַ}D%P#AJK3S|:C6#RضMΩd/g]{r"]D8E]d{APO"uZVSX}zxBp.V?],1B~d.\.]B:dSdkq񏚉v̩ڟOapDRAe;^j+w=OT%)$IJI$RI$I%)$IJI$RI$I%)$IJI$S:|Wѭ>{>!{g&ϢC"~%eK {Ĩ EyM~REj0pԑ +dDS(ft +'E5lPkKxʙ2@D>thyWH8[IC}c䔲Jh?ӏt-7}UɏUޏg`=!%H +OYf.ajcb;)X$/--)޸Ĭ AV2 n }jzSdjtN޽I.Z$JB5ʹ>KrXt/BƢIrE}Sȥ8YN]u }+b ?`tnBtP`8l8tKogUB{UȮ7$2i"Q( `_,K[&gջDy.'W[E`IG^67f6ۅvZ8 +ۛ$+_Z{tU_`32 BR/YYaVD퉕çGuUn!@R *:5cg 'k%j}Mmu%V{~ Hgywb;xP{.u~py\Tk)𙐶X1qZVv+kVl<O;Aʌ䔎/-,P3%(A:7VjnEGȤ*n+]L!;u&5 b"JLgiIJv 4NkSb%IIivJxH )\%) +dOd)`~ThՇ +yU9ZXTMD)4SC,V;«`X@&TD1rw|sDJJ.foZxb^TG8*]5:c ~Pn@u:T~ iaKM>JApBJ~ n53mP_c~ g|tN/Y9R.R|4 +}g&KRV,yny! Ndz^{E1t~[UΩ^ u ,K7> +4r/IquMBП{O;ҊoU/_֣ yܬfE:Y?Ty>7* ޞ zoﱿ4y2{ +4rOR!->!9`'gȅee7uN*x`WS|@-}=t#8_`JGBJOM\ZkR{R3y%($jwOa,ԺXS|b#D>#̦VmuR]3@ƥCzn2|ZYx!N u7|~d&#un `6߂Y!MA5(%Dt`R],CoO!DŽ]C zyB^ݏ@Juj7[?}3 +c;ۿҭ|ge<fbn]SV uQyyQ7!R+T(@O5,"0Y@R BI)EFԶ䔵);D%( !81I%0k1yCMen}^v+(niZ_V!S nd Qs]TbF!ga +L&9yg lP"V\5`D&R:(pP\r)@\LD'&R:Ted&T!8E +iOÒ0uQ$S&Dꊒ^c7˚(3s(g|C0((ٟM I$RI$I%)$IJI$RI$I%)$IJI$RI$I%);S'jJM?䔶I%>;^j+w=OT%)$IJI$RI$I%)$IJI$RI$I%)$IJI$R\O߈ݛO8߈6L%6{òq(E0(AHw_NZHЕpԓ$r_e7JԜ n⬒G ]'/ۭ󽿊h _Tω]gk LLܦ|YHkdI)NT"Ė&E;Z"XqZ+:?_msZHZR0]i.I2KzK$^޻K45Np/ul[!ޟz=Wl5+r40ΡF!›$#8ձhû*]_YՈ;puz{H׻J^}q䙎u.X'gsZ>OW14kFD15 ?+]D_|o.3q?__q ƴ׆9 dcȵZO.:8|Q_fsGDVT4R <)pݴN~m-<@dX׸w\ BzO74 Eo9b}\S@?%m hǷT_#z'W)ә\TobϪ#3W#,+%G Oq?;WwFQSpùLw[i1dO~\( +UrcP6S> $)͞GtNT؉IJ ϵ 69I+R5P %2w$LFQ~vAA)Rq#T >Oi#wdiy3䈞; 삘(zFG +&Gi w%"ݡS+2{+-Z#淺-nhk +2 ę&+lrjg{*Dn (ĶGD$|%1Jcv]Mg'{e!8s`uzkuZڡNӸz"01N3Ҧ&Kr G*=lX5PZ !M\z,%'-\4Nm9@9 # CTn`h5F){AWg!uLC̓ȢQkC{"_kXJӽ Cw7}noh>|F?u`xz!;fSD}~PאJ^N窳 +_]auD:>ZGq5? 'HC!.,q-sǁPevE<'Z6BJ*n8E|P5|%XoY#QرP`,#@hѝ%~z+CA2 ٲ˘֤x8+9eNU7T(wT$6 +yBAvGܣNH)}]5enB9c(SŻ%}&èъr#-Vk <#=r[@>Vu=- @B-drgVNlceЦ~3P]_`RӡUٔEYǂa > +\$SnTTU ʗ:5GE'>js7)zR*̙ ܛt!EZ1V~_`JWQAK#(B=2_ˡ3j([[WA"ݯ*պO/I\W=2k+wG__ j_yZ @QDŢS\S?ײTgr?Wsۃ{lxy@F|BVϚm!tPdÂ<;cQ7TOVu-ߨ--?}p VVeBK,JF@\Ozزm ]}bG&9hB hW.uWg$ VHgD6l 7y.W/OhJ"S%q4 W)22'uXޓ}v%hAB8.=l.-sFkL kQ?N/Ma0Ј q~ۿ"<ه/8=@y+Z/8ɥo}KcG ?༻}u]UNU.cfH'C  L)N.UŠ긧S[Uv+[cIʇtl ޳!\31ck`: f +7 +Y*pDp%?5Zo|tCi?r8$XԠK,H01? ekU=* +v(BCB8))zBRPiR.%sFHPRc$<)813evAJ<)'ٵ%2)QJdxQ||J +cd%ÕRPH\T ' +J xiP%ϋXFAC6P[#hYrRN ׺M- #.&b9Ip;۵1~Nx ␎>J$\Z.Hf)g 4HHzT<%D"XJth$)M! =4 R'(8T*U |!?%\*x@e am=F.)nJ٘G$M0S@[td" x|sC#JGtE9Uw?un)$M4:eg`B )2F! )klqlQ[uGU5*#7W>wG_;Fu,Soc)qSJnZU+-R%,WMmH +#c\2Ͷٻ7Jg92Tpr9*g4ZiacZv#Ru`FJB<+SHLRX]0=J7Yc"S:Щ!JEyjO]uZϊ[*K,d:Qbiv0UA.Sm* 07!0Ajql jNĮς9$pҪw`Uk>T`+A[-1sY᪻5;A=Z4q +[ڮ/Z{>1y2*&U6b=|{( +G$#gH +/TYeTexc0RtTƎVJ: p9Cp/17B#|#EedX$:H .Xݢ] Ʃ%D)@P a4ʉ +@J!LIRqLR'E,"Ra8ETrCT@*f֯TAگSc!Rv 7|G+BE2(JE$I)I$JRI$I$$I)I$JRI$I$$I)IIJ)$JRp8IN"H_I)QKWꗚ$I)I$JRI$I$$I)I$JRI$I$$I)I$JK{XMWПɤ>q8D↥QdNBJ$([$)0DȂͥ<&*Lt'P' R )rg]PT#mi TeBD$Vs8 + '#jlS {)4$(R@ʋL" -蕆SPå$ +Ii ޢ4ROt-[1laJwBt̀vLꟄ-tҘ uR*JB uB7_[ }83 RYO* P3 +Rs*J''DG%Hd\ƾ +3<'2{L0)OI hyE"c )p)t)*D_1djtJYt';bi=)Ԥq+<*geSv BHa?w+<*i@,?fB~ aXT_ĔBop죰H\oQO:.{$?*0VDhݼ~%nhzkO+h0]%u/Jk )v '`;&ph" qtR/Snkt{kc?X?rAAM)p6ZfW=`FKesvkrCyG@+pjꘟ%:bOJP0" +LKDD4J*dtP%MFX)ؖѪ*J aU 2_F(U9f?HJ&G?dRI$I$$I)I$JRI$I$$I)I$JRI$I$$I)I%671$7SꗚJSG/5IJI$RI$I%)$IJI$RI$I%)$IJI$RI$?*;_7X~Uu'&M!4K(Qd&<I2J^SL)!@)(pR ƪ J$.STOtBLB(,%8AN z,H4Ot<RQs! 2'ڝSC&D!ҊJAh%K)D,)/`TXW +$\[ %;tL@Kų'96  S*D鏚rg/ Tܢ4NIfOd!fsYS\"ᤤm*2)ƺMOt!I%}ʜjty$BIf'D̲uLpȻK|yILɔ(R=0; ($pLmDnM5j~JH;p$ht] zV%.1bR\MӨx-P- Ί;S&([!6)YRsXJjb(!rLʗSmݒv+Ӳ>ޙ΍~ KpBM;z#ĮOl(? P8VYeV58)Y|:;h)Zr$zmZhBYf\JsQ A4,.SIv +úsǜ? H(8^bmnzwJ’GSRKE%sk RݩJ>R'l}ʻ\u)4_I $:ެτ a8| +)nJ!!3]*M|0w 1f d%I)tLk&#M~H{RRai!B`IJM$^׍B.Bʩ+ao:(m.G xbhPnN i 6 'TAG{w-WYo._2qZ?:4i8(MA%j4J*3 /^%1 ) +V +CUIKv5mL Nqb(GJd]_9z9WTEq;$I)I$JRI$I$$I)I$JRI$I$$I)I$JRI$I _JͼSꗚJSG/5IJI$RI$I%)$IJI$RH HIJI$RI$I%)$II?o^yOaW\& MHJ.PB +DI(J RhELSN4JjID" ~*GTKT +RS1ЖRo`j(*mlvF֕NvNd %ĚToOKRjrp<6H'R KV2υ0RAN,BQb QHQJ<Sp!t($n@20wN,O)hG*aɴ?3@@,D}5 Jim-u_ʝH~M( t w8CD|HByP%Kƞ n$TfI,FU6*%8iDLTjQ۵I$,ݪ'^SƪPa!? J|3w1&)R[-%tQRȍ%0;h o_v]*<-ڵBPHFRg׽g==_tH4j's +p&Rf >K&Ls 7A>A:AЗ+9׾^"bmeKcW U2f!7H6~N5Ui5۸쁍$NoS:QRJmTlQ +@^c_ʐ$|U> +p ;x(PCD5=q4Tou"$$B jq&:jRM$8$2i~iȟJ Dr'_OTi w9wdЧ)J" 7a0H*'9Q2uRVPbk =G(I.z\Jig&H!i3 y=q*8?HpТka%Ui'bQvO"rwbDjDM`H#;;C#d)wdcDT$.} ));m e x%zFA!JJNB$v]ۢ%58!S +Q<$ͤ"5DA y(4nN23۵tn~sMKTcTW!m^%H@W7D(M2.;R Rie1 ra8)v&TbuR%%R2! t[JGT*fF/?ۨ^Q_Sśr~%ANOA@I$JRIIK$I)I$J\&)$I$$I)I$JRI$I$$I)IdJm~o%@SG/5^;^lIK$lШ$I)I$JRI$I$$I)}dI%)$IK$Sc7z/~#*eV}ɲH/ӻng)ex?8y>l{ ?+\0y^#MW/lޣ(~;Q%?x}{eOy7`~ bu\ Cܟr^O{L) _/lO=ޟo r_eʭ.ޢ?0~?8}K*x޸Q0]7K=a3&0~)|%h?zC_ ,i}ɇ>xuhNQ/ܤ?W=գڏ}G2~/s+<rs12q%.O?qaK<%.?ޝPJGrc12q#.꨽Gޢ>{;1Gtp?>?yjy +?r_'C}p~Qȟ;~|W?FP߹8#~@upCT;xğwK}Hw)5>.5;7j_d{~s'T.5~㏓_d3jWxGwޘIw?g#>^N{~(]Q\aYK̏}ҹW{TK+;'㟐5q}^}I~NuC\y ژJ^{_Lr<1WڕϺFR-YS]c\9߹HuW>KտUg6K~q\o߸Ը^zKa}Kgww5#3?ԮI^epW&?uGdtOkyrGkNGϴ~c~O)+zU}L3>34-?>HKwLߩ1g+};~r⹿tlƅޕz?'?TW7}>ѳcJt#~˒w߂1FcJt'SG.dz_YJt7vQ.mMzt]}駋=^ ix03kUL~xt-w)4PsPK!i׻biLM-q Hw s'\/YSJ2GFx]Z;0S0s vԙ#FآK~I:pNEyk +eMtU:Ulm,萔duFqtvU]S$^$^>嗇L#CWps+ |! !cEWWmc`2p@1ĄYu 3Hi&+ߨJWRk9Jޠ;XnNa:x$9h EEb7 8vQU[:ncOeUkBIQ$)FPS:P$%+\!'';ڠjE@5KꂩǚJ-yN{%j\0@}jȞ@Q%BjC۹N`!j׻O4j_ (ک/IHRu!Vڑ ZBr+=} :.$p S~'ʉ=ŰT-ep (Gr:57F6**sʝbmױ܄uSP:R +㱘FEM`aDUb0vAICtg5rΔc + M,ۼ_"'E?&/~ox&wkLJ޺1x'cK̑>ߩ%2/ws$6(~=֟j/>~Lߨt?b?rvL_?r'6dQy}Fzȿ.,C߂x(b3e8pEяGQKqEԛLߨ]78!||?xΡ/4~_>}اSϼA)}2}>.*4f[9U~$4LL:6|JuQR-RI$Im1@rJY$IJI$RI$I%)$IJI$RI$I%) p1$_D4Sꗜ%ꗛ5uIMWce%E%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI a%)$I%)$IJI$RI$I%)$IJHI$e$IJI$RI$JRI%*RIJI$RI$I%))I$JRI%*RIJ$RIJ$R)I$J$R$IJLJ&IJ$R)I$tIJ$R)I$JRI%*RJRI%*RIJ$RbdЍPBCyOG8`ƇLuSɯu(HfٝRGbwESםC,saonZWZutrQﴳs~YWx:qłBfeB~󹠀8+w' !W>)\%}390ᢛ.-wѝVRcHsGj&L(Wc |uXiu!FH2i4;^ZpVo oeS_}qS R]S`wnΩk +EM\$]Nsn]ʼ&.r[}!m։S'JtֿPcPfm79 += +\~HWRmЎ_A!Ra( "av*e$M #:QU?!0k p&B5J[)!AUwu:t8%W bR v\Cǒ+*xPZ4(PYv +r]vF&cت۔0YD:ݬ+0O)VNMU[3zָLUh@tN[[ckemBTPKPi9 *@zTRC[a={"3-}Mm11HKnMs< ֔@Bd +-?TQ ) Xx_a;qς  a-@.'K;^~kKOpwtGDS@۔w^ݣx#B]zdhPѻmBVLvo'Rww +L3]<%4qLU)$JTI)I$JT)$I$$ +I$JI$)JI$$I)I$JRI$I$$I)I$JRI$I$$I)I$JRI$I$$R`RSxV~v?$ҿQKRRI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$+\pR1$}uB撺!TH,ɠ8HT6vZpPW`" +7:cy{j0܆kqx?fk캬 m F3 I +,RHI$$I)I$JRI$I$$I)I$JRI$I$$I)A")[fSI%)$IJI$RI$I%)$IJI$RI$L)${餒w=OTzWz;yJRI$I$$I)I$JRI$I$$I)I$JRI$I$$I)I$JRI$I$$I)I$JPRI$$I)I$JRI$I$$I)I$JRI$I$$I)I$JRI$II%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJJRI%3Y^g ~yV~sɳ] Q}n`^UN{7<U3ǝLQh!W (y.[72kOk#eq-V1ˈSN]՘03*}B߿6sUCG bhrNc;[ZfVF]NvᧂE>)lhZLtdȹx+W/d =W:w]xlfr8 +Ƭs ݀擦+U~=R8\[aeI,1._`׎@+Y^ {JOBr=&T;w pe|c!ETɺ:c-Nދ8UG=@;T}]MKk9|s]m\(w_H@u7ZVCVҗ}@Xs +V#Zf9CvU#ORljuM_Oe'y;*de6u@J'lOGjְ6ЩvYSpRUewnULΚ^EB!{[)BGK%UN֚;Hتӈi(+5CwRlWcx@9;3A[[~ÂP=H  'oFX5 "\B!^RԼFuPJ?DxJ@7oSeѲM;]wH~)!SKD55:GX! U.rAmR1uD+51*ˎʧVS 8{PA%켃G;^9OD, 譼Dnڴp|~-W`b|4zp !Vp<܆[a mf"`Ud"qYzJ.48'ȠZ ,U1L/{8!^֪Y$EJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%.a2I$$I)I$JRI$I$$I)I$JRp in%/7o?$_ҿQKRRI$I%) %$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$R$$I%)$IJHI$I$RI$I%)$IJI$RI$I%( N`a"IJI$RI$I%)$IJI$RI$I%)$IJI$RI$&I%)$IJI%:WӺs~^Z8Zr+#XT 0>*g\!!GW3#!fBsq/`?r#~CO;=sK@HuJztDÅ>zspw)os;zw4HwKzNΦ'7#Od3ì*(}Bą'١:!Gʄ*JqzHfd$G3%w칗`g{d MviC@W!ܶpyUnxW +WC9O>*l9LMH[%ga; \+*I$RI$I%)$IJI$RI$I%)"JRRI$I$$RI%)$IJI$RI$I%)$IJI$R2v{I-4S㱻^h QKRRI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJHI$t %))w7jdRI$I%)$H IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$*GiӸYHOi6F< +~uӀ^FKr@#2Btdc௓66{(6Q&#VQg}ƻ'_f1X{ӊICO k^jqۄ$i a 0䝧 +'E&)A1h<"e'JQ@U+vZDU Vj>"VYMPgr3 z{;cyq~{. +vfl<")Uд˪i{]MFBq@2ëB^e*Qm]ѪwgB!r=EizN9Mߤ[O2( + 05V[[Kw0Y]RI9>Hպoڄ;|]n򢑩hN`<%hX pU֜i"* fGDzB OMo!܍m:X5:W^kE@n%]=:5fWQeF40! R+gt-XuC >%_gS5P5i!"d@ѪSQ粺\eAVnxq<2 +Ru=pY8ŮB>5XXl{ +|9еg _>)"]YPզ5$I)I$JRI$I$$I)I$I$R L#dIJI$JRJOp @QIJI$RI$I%)$IJI$RJmncm?~I9OꗚJSG/5MRI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI%) A%.LHI$$I)I$JRI$I$$I)I$JRI$I$$I)I$JRI)0JbE$I%)$IJI$RI$I%*Q}_E|RIMպ7O,TzR[7[W9)J\!6^YiwҮ>c<.P.2ʮ8|(͢-#渄*}/?zv^m;nsx%'V~jC# ~^x׏?z5}ZyK7>ِXh:~KY/EgֻMIW׻lտcMGvsDaH}rsA@ᗂxްu껟ʛ'p}paY20?7RtzskЮpuWi +1÷B=+е=›i\Ӿxq5aTGP8 +xm$Yc.ѷ6Q}FO0 ܐt{!?P+& >iۛKHȗ#L]u} ewM›H(lu;B* qw +<)36uo|L$0t²`t7cT8{$ZK|N!M ( Tg!G)'1iژ3Y)E+UAL] C!AА)JX;v"%(ӈLHAR@`=dJAoOc-C=&]ܦ5slK5T>+iɉ=:l꣇]@ R,Ddu"AWzA%vv;i)G +ӌvдցJ; hSy½CV7hJBv`Y}zpĽt+֧徴}^&Ƽ+x3YېReJ\>䏒O7~{'>v?0L,}gcl+Uu?O` Vu]˾Jwk< 6 }yVIm5 R5n:9%#Qa{)r ǁ<]?>I{W#1lsvU[u_JϬwi {'}qئ-eHu^$FuJ,ӈfBINZk#VPeZQ:p +Ӻ|Cv{+(K"?ҔꗚJSG/5LRI$I%)$IJI$RI$I%)$IJI$RI%)$RRNLI$$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$LP(=ٝRZ?lI)?wRU_)I'ВP%JRIBI)I$JRI$PIJI I(I%)$IJNm2I)%q䡤IJI$ +Y$kHpxADI$ +RI$E$I%)$ )I$BI)I$$JRJ))I$!%)$E%)$xIK$A%)$IJI$RI PIJI$RI$I%)$IJI$RI$ I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$w$I$I%)$ )I'%,E$I%)$IJI$RI$I%)$IJI$RVd;w7IMT7nF)&o1ܗ웿ѿrJj~ɻw%&o1ܒ+_nF~ɻw$J웿ѿr_nF)&o1ܗ웿ѿrJj~ɻw%&o1ܒ+_nF~ɻw$J웿ѿr_nF):Mc#nF):Mc#nF)&o1ܗ웿ѿrJj~ɻw%&o1ܒ+_nF~ɻw$J웿ѿrqnF)"o1܋_B[$߲.k4VIw&w7IMTnFw7IMD7;SQ%oMc#nF)&o1ܗ웿ѿrJj~ɻw%&o1ܒ+_nF~ɻw$J웿ѿrqnF)&o1ܗ웿ѿrJj$ɻw%&o1ܒ+nFɿd;SQ%oEc?웿ѿrJiȻw%"o1ܒ+g;ɻw$K Jy@>g?P3? )[?@$%03?  Jp]pH@@$Io _?@'$Vzmf$03=lXLYmNhn{ -/iI$_I)_JWi$iI$_I)_JWi$iI$_I)_JWi$iI$_I)_JWi$iI$_I)_JWi$iI$_I)_JWi$iI$_I)_JWi$iI$_I)_JWi$$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IJI$RI$I%)$IO endstream endobj 3 0 obj <> endobj xref 0 4898 0000000008 65535 f +0000003527 00000 n +0000000016 00000 n +0011416807 00000 n +0000007294 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000013 00000 f +0000007487 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000018 00000 f +0000007709 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000023 00000 f +0000007932 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000028 00000 f +0000008085 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000033 00000 f +0000008344 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000038 00000 f +0000008576 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000043 00000 f +0000008849 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000048 00000 f +0000009100 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000053 00000 f +0000009357 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000058 00000 f +0000009613 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000063 00000 f +0000009870 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000068 00000 f +0000010115 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000073 00000 f +0000010358 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000078 00000 f +0000010617 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000083 00000 f +0000010860 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000088 00000 f +0000011106 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000093 00000 f +0000011349 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000098 00000 f +0000011592 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000103 00000 f +0000011891 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000108 00000 f +0000012164 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000113 00000 f +0000012408 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000118 00000 f +0000012666 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000123 00000 f +0000012927 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000128 00000 f +0000013173 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000133 00000 f +0000013417 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000138 00000 f +0000013683 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000143 00000 f +0000013893 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000148 00000 f +0000014103 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000153 00000 f +0000014364 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000158 00000 f +0000014574 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000163 00000 f +0000014840 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000168 00000 f +0000015120 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000173 00000 f +0000015386 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000178 00000 f +0000015661 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000183 00000 f +0000015885 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000188 00000 f +0000016143 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000193 00000 f +0000016367 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000198 00000 f +0000016655 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000203 00000 f +0000016921 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000208 00000 f +0000017195 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000213 00000 f +0000017470 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000218 00000 f +0000017722 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000223 00000 f +0000017966 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000228 00000 f +0000018226 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000233 00000 f +0000018478 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000238 00000 f +0000018752 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000243 00000 f +0000019013 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000248 00000 f +0000019257 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000253 00000 f +0000019503 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000258 00000 f +0000019761 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000263 00000 f +0000020007 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000268 00000 f +0000020265 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000273 00000 f +0000020512 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000278 00000 f +0000020759 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000283 00000 f +0000020969 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000288 00000 f +0000021221 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000293 00000 f +0000021459 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000298 00000 f +0000021691 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000303 00000 f +0000021929 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000308 00000 f +0000022190 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000313 00000 f +0000022450 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000318 00000 f +0000022660 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000323 00000 f +0000022884 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000328 00000 f +0000023145 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000333 00000 f +0000023425 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000338 00000 f +0000023635 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000343 00000 f +0000023915 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000348 00000 f +0000024181 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000353 00000 f +0000024447 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000358 00000 f +0000024708 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000363 00000 f +0000024932 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000368 00000 f +0000025192 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000373 00000 f +0000025467 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000378 00000 f +0000025728 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000383 00000 f +0000025994 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000388 00000 f +0000026268 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000393 00000 f +0000026543 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000398 00000 f +0000026801 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000403 00000 f +0000027089 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000408 00000 f +0000027332 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000413 00000 f +0000027598 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000418 00000 f +0000027842 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000423 00000 f +0000028102 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000428 00000 f +0000028346 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000433 00000 f +0000028612 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000438 00000 f +0000028872 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000443 00000 f +0000029124 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000448 00000 f +0000029370 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000453 00000 f +0000029636 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000458 00000 f +0000029897 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000463 00000 f +0000030185 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000468 00000 f +0000030451 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000473 00000 f +0000030731 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000478 00000 f +0000030992 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000483 00000 f +0000031216 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000488 00000 f +0000031482 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000493 00000 f +0000031706 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000498 00000 f +0000031967 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000503 00000 f +0000032233 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000508 00000 f +0000032494 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000513 00000 f +0000032760 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000518 00000 f +0000033026 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000523 00000 f +0000033287 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000528 00000 f +0000033548 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000533 00000 f +0000033794 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000538 00000 f +0000034038 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000543 00000 f +0000034298 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000548 00000 f +0000034575 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000553 00000 f +0000034836 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000558 00000 f +0000035094 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000563 00000 f +0000035352 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000568 00000 f +0000035623 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000573 00000 f +0000035881 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000578 00000 f +0000036153 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000583 00000 f +0000036414 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000588 00000 f +0000036658 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000593 00000 f +0000036932 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000598 00000 f +0000037175 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000603 00000 f +0000037449 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000608 00000 f +0000037735 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000613 00000 f +0000037982 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000618 00000 f +0000038225 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000623 00000 f +0000038477 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000628 00000 f +0000038709 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000633 00000 f +0000038919 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000638 00000 f +0000039166 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000643 00000 f +0000039446 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000648 00000 f +0000039690 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000653 00000 f +0000039900 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000658 00000 f +0000040174 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000663 00000 f +0000040426 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000668 00000 f +0000040686 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000673 00000 f +0000040980 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000678 00000 f +0000041254 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000683 00000 f +0000041543 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000688 00000 f +0000041817 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000693 00000 f +0000042078 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000698 00000 f +0000042336 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000703 00000 f +0000042582 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000708 00000 f +0000042825 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000713 00000 f +0000043091 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000718 00000 f +0000043362 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000723 00000 f +0000043606 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000728 00000 f +0000043864 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000733 00000 f +0000044108 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000738 00000 f +0000044352 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000743 00000 f +0000044613 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000748 00000 f +0000044856 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000753 00000 f +0000045122 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000758 00000 f +0000045380 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000763 00000 f +0000045668 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000768 00000 f +0000045954 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000773 00000 f +0000046229 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000778 00000 f +0000046473 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000783 00000 f +0000046697 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000788 00000 f +0000046929 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000793 00000 f +0000047139 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000798 00000 f +0000047385 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000803 00000 f +0000047660 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000808 00000 f +0000047906 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000813 00000 f +0000048116 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000818 00000 f +0000048402 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000823 00000 f +0000048654 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000828 00000 f +0000048898 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000833 00000 f +0000049108 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000838 00000 f +0000049354 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000843 00000 f +0000049600 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000848 00000 f +0000049872 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000853 00000 f +0000050130 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000858 00000 f +0000050388 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000863 00000 f +0000050646 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000868 00000 f +0000050889 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000873 00000 f +0000051149 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000878 00000 f +0000051421 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000883 00000 f +0000051631 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000888 00000 f +0000051889 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000893 00000 f +0000052155 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000898 00000 f +0000052427 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000903 00000 f +0000052674 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000908 00000 f +0000052904 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000913 00000 f +0000053170 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000918 00000 f +0000053430 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000923 00000 f +0000053676 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000928 00000 f +0000053922 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000933 00000 f +0000054169 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000938 00000 f +0000054421 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000943 00000 f +0000054670 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000948 00000 f +0000054917 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000953 00000 f +0000055178 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000958 00000 f +0000055453 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000963 00000 f +0000055727 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000968 00000 f +0000055937 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000973 00000 f +0000056226 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000978 00000 f +0000056498 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000983 00000 f +0000056750 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000988 00000 f +0000057038 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000993 00000 f +0000057290 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000998 00000 f +0000057548 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001003 00000 f +0000057823 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001008 00000 f +0000058109 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001013 00000 f +0000058384 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001018 00000 f +0000058645 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001023 00000 f +0000058918 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001028 00000 f +0000059163 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001033 00000 f +0000059438 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001038 00000 f +0000059714 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001043 00000 f +0000059975 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001048 00000 f +0000060247 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001053 00000 f +0000060528 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001058 00000 f +0000060786 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001063 00000 f +0000061045 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001068 00000 f +0000061323 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001073 00000 f +0000061568 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001078 00000 f +0000061840 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001083 00000 f +0000062102 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001088 00000 f +0000062347 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001093 00000 f +0000062595 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001098 00000 f +0000062848 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001103 00000 f +0000063129 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001108 00000 f +0000063416 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001113 00000 f +0000063655 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001118 00000 f +0000063914 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001123 00000 f +0000064181 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001128 00000 f +0000064442 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001133 00000 f +0000064723 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001138 00000 f +0000064996 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001143 00000 f +0000065221 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001148 00000 f +0000065502 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001153 00000 f +0000065727 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001158 00000 f +0000066002 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001163 00000 f +0000066264 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001168 00000 f +0000066497 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001173 00000 f +0000066764 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001178 00000 f +0000067026 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001183 00000 f +0000067251 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001188 00000 f +0000067527 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001193 00000 f +0000067752 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001198 00000 f +0000068000 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001203 00000 f +0000068225 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001208 00000 f +0000068486 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001213 00000 f +0000068748 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001218 00000 f +0000068993 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001223 00000 f +0000069238 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001228 00000 f +0000069482 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001233 00000 f +0000069735 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001238 00000 f +0000069980 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001243 00000 f +0000070241 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001248 00000 f +0000070500 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001253 00000 f +0000070781 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001258 00000 f +0000071040 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001263 00000 f +0000071265 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001268 00000 f +0000071546 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001273 00000 f +0000071821 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001278 00000 f +0000072069 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001283 00000 f +0000072350 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001288 00000 f +0000072603 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001293 00000 f +0000072842 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001298 00000 f +0000073104 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001303 00000 f +0000073385 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001308 00000 f +0000073658 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001313 00000 f +0000073953 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001318 00000 f +0000074226 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001323 00000 f +0000074485 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001328 00000 f +0000074744 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001333 00000 f +0000075005 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001338 00000 f +0000075266 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001343 00000 f +0000075566 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001348 00000 f +0000075811 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001353 00000 f +0000076064 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001358 00000 f +0000076323 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001363 00000 f +0000076548 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001368 00000 f +0000076815 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001373 00000 f +0000077110 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001378 00000 f +0000077358 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001383 00000 f +0000077605 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001388 00000 f +0000077849 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001393 00000 f +0000078110 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001398 00000 f +0000078369 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001403 00000 f +0000078614 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001408 00000 f +0000078859 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001413 00000 f +0000079084 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001418 00000 f +0000079379 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001423 00000 f +0000079646 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001428 00000 f +0000079927 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001433 00000 f +0000080188 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001438 00000 f +0000080399 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001443 00000 f +0000080610 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001448 00000 f +0000080858 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001453 00000 f +0000081111 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001458 00000 f +0000081387 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001463 00000 f +0000081674 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001468 00000 f +0000081946 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001473 00000 f +0000082191 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001478 00000 f +0000082436 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001483 00000 f +0000082683 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001488 00000 f +0000082970 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001493 00000 f +0000083251 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001498 00000 f +0000083513 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001503 00000 f +0000083786 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001508 00000 f +0000084064 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001513 00000 f +0000084325 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001518 00000 f +0000084584 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001523 00000 f +0000084857 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001528 00000 f +0000085105 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001533 00000 f +0000085353 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001538 00000 f +0000085628 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001543 00000 f +0000085887 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001548 00000 f +0000086188 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001553 00000 f +0000086469 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001558 00000 f +0000086744 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001563 00000 f +0000086992 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001568 00000 f +0000087254 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001573 00000 f +0000087493 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001578 00000 f +0000087704 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001583 00000 f +0000087966 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001588 00000 f +0000088219 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001593 00000 f +0000088494 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001598 00000 f +0000088769 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001603 00000 f +0000089022 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001608 00000 f +0000089312 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001613 00000 f +0000089571 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001618 00000 f +0000089833 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001623 00000 f +0000090095 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001628 00000 f +0000090370 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001633 00000 f +0000090651 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001638 00000 f +0000090926 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001643 00000 f +0000091151 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001648 00000 f +0000091376 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001653 00000 f +0000091657 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001658 00000 f +0000091960 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001663 00000 f +0000092236 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001668 00000 f +0000092481 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001673 00000 f +0000092748 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001678 00000 f +0000093015 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001683 00000 f +0000093282 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001688 00000 f +0000093527 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001693 00000 f +0000093808 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001698 00000 f +0000094055 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001703 00000 f +0000094300 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001708 00000 f +0000094587 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001713 00000 f +0000094854 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001718 00000 f +0000095121 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001723 00000 f +0000095346 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001728 00000 f +0000095594 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001733 00000 f +0000095805 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001738 00000 f +0000096002 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001743 00000 f +0000096283 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001748 00000 f +0000096494 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001753 00000 f +0000096770 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001758 00000 f +0000096967 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001763 00000 f +0000097229 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001768 00000 f +0000097510 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001773 00000 f +0000097707 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001778 00000 f +0000097974 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001783 00000 f +0000098236 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001788 00000 f +0000098489 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001793 00000 f +0000098734 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001798 00000 f +0000098973 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001803 00000 f +0000099220 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001808 00000 f +0000099473 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001813 00000 f +0000099698 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001818 00000 f +0000099945 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001823 00000 f +0000100206 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001828 00000 f +0000100451 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001833 00000 f +0000100713 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001838 00000 f +0000100958 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001843 00000 f +0000101231 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001848 00000 f +0000101490 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001853 00000 f +0000101737 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001858 00000 f +0000101982 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001863 00000 f +0000102227 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001868 00000 f +0000102485 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001873 00000 f +0000102744 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001878 00000 f +0000102988 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001883 00000 f +0000103241 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001888 00000 f +0000103488 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001893 00000 f +0000103764 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001898 00000 f +0000104026 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001903 00000 f +0000104265 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001908 00000 f +0000104504 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001913 00000 f +0000104729 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001918 00000 f +0000104990 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001923 00000 f +0000105266 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001928 00000 f +0000105519 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001933 00000 f +0000105800 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001938 00000 f +0000106039 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001943 00000 f +0000106320 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001948 00000 f +0000106587 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001953 00000 f +0000106882 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001958 00000 f +0000107144 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001963 00000 f +0000107403 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001968 00000 f +0000107676 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001973 00000 f +0000107943 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001978 00000 f +0000108205 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001983 00000 f +0000108480 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001988 00000 f +0000108755 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001993 00000 f +0000109042 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000001998 00000 f +0000109273 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000002003 00000 f +0000109531 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000002008 00000 f +0000109775 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000002013 00000 f +0000110020 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000002018 00000 f +0000110265 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000002023 00000 f +0000110476 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000002028 00000 f +0000110721 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000002033 00000 f +0000110966 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000002038 00000 f +0000111211 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000002043 00000 f +0000111459 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000002048 00000 f +0000111707 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000002053 00000 f +0000111965 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000002058 00000 f +0000112238 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000002063 00000 f +0000112572 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000002068 00000 f +0000112848 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000002073 00000 f +0000113134 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000002078 00000 f +0000113407 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000002083 00000 f +0000113688 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000002088 00000 f +0000113983 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000002093 00000 f +0000114315 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000002098 00000 f +0000114591 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000002103 00000 f +0000114853 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000002108 00000 f +0000115106 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000002113 00000 f +0000115353 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000002118 00000 f +0000115600 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000002123 00000 f +0000115887 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000002128 00000 f +0000116176 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000002133 00000 f +0000116449 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000002138 00000 f +0000116736 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000002143 00000 f +0000116983 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000002148 00000 f +0000117287 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000002153 00000 f +0000117590 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000002158 00000 f +0000117890 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000002163 00000 f +0000118045 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000002168 00000 f +0000118200 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000002173 00000 f +0000118355 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000002178 00000 f +0000118510 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000002183 00000 f +0000118800 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000002188 00000 f +0000119075 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000002193 00000 f +0000119362 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000140 00000 n +0011191039 00000 n +0011191161 00000 n +0011135188 00000 n +0011190666 00000 n +0011190758 00000 n +0011190849 00000 n +0011190943 00000 n +0011143012 00000 n +0011129524 00000 n +0011134810 00000 n +0011134906 00000 n +0011134998 00000 n +0011135097 00000 n +0011130225 00000 n +0011129128 00000 n +0011129249 00000 n +0011100900 00000 n +0011128745 00000 n +0011128841 00000 n +0011128932 00000 n +0011129025 00000 n +0011104424 00000 n +0011075726 00000 n +0011100710 00000 n +0011100801 00000 n +0011078260 00000 n +0011050160 00000 n +0011075246 00000 n +0011075342 00000 n +0011075433 00000 n +0011075525 00000 n +0011075628 00000 n +0011052643 00000 n +0011024064 00000 n +0011049870 00000 n +0011049966 00000 n +0011050057 00000 n +0011026933 00000 n +0011000251 00000 n +0011023680 00000 n +0011023776 00000 n +0011023867 00000 n +0011023970 00000 n +0011002643 00000 n +0010975944 00000 n +0010999863 00000 n +0010999959 00000 n +0011000050 00000 n +0011000148 00000 n +0010978181 00000 n +0010948995 00000 n +0010975561 00000 n +0010975657 00000 n +0010975748 00000 n +0010975841 00000 n +0010951431 00000 n +0010922351 00000 n +0010948705 00000 n +0010948801 00000 n +0010948892 00000 n +0010924502 00000 n +0010891004 00000 n +0010922061 00000 n +0010922157 00000 n +0010922248 00000 n +0010894220 00000 n +0010862951 00000 n +0010890615 00000 n +0010890711 00000 n +0010890802 00000 n +0010890901 00000 n +0010865600 00000 n +0010833828 00000 n +0010862661 00000 n +0010862757 00000 n +0010862848 00000 n +0010836591 00000 n +0010805472 00000 n +0010833538 00000 n +0010833634 00000 n +0010833725 00000 n +0010808126 00000 n +0010777059 00000 n +0010805182 00000 n +0010805278 00000 n +0010805369 00000 n +0010779653 00000 n +0010746376 00000 n +0010776769 00000 n +0010776865 00000 n +0010776956 00000 n +0010749305 00000 n +0010717098 00000 n +0010745708 00000 n +0010745804 00000 n +0010745895 00000 n +0010745994 00000 n +0010746087 00000 n +0010746179 00000 n +0010746273 00000 n +0010720189 00000 n +0010704710 00000 n +0010716626 00000 n +0010716722 00000 n +0010716814 00000 n +0010716905 00000 n +0010716999 00000 n +0010706069 00000 n +0010675379 00000 n +0010704424 00000 n +0010704520 00000 n +0010704611 00000 n +0010678151 00000 n +0010663516 00000 n +0010674991 00000 n +0010675087 00000 n +0010675178 00000 n +0010675276 00000 n +0010664990 00000 n +0010630328 00000 n +0010663137 00000 n +0010663233 00000 n +0010663324 00000 n +0010663423 00000 n +0010634098 00000 n +0010604198 00000 n +0010628142 00000 n +0010628277 00000 n +0010628368 00000 n +0010607005 00000 n +0010571599 00000 n +0010603915 00000 n +0010604006 00000 n +0010604105 00000 n +0010575617 00000 n +0010551172 00000 n +0010571220 00000 n +0010571316 00000 n +0010571407 00000 n +0010571500 00000 n +0010553555 00000 n +0010542298 00000 n +0010550889 00000 n +0010550980 00000 n +0010551079 00000 n +0010543649 00000 n +0010540541 00000 n +0010542010 00000 n +0010542106 00000 n +0010542199 00000 n +0010540854 00000 n +0010512682 00000 n +0010540162 00000 n +0010540258 00000 n +0010540349 00000 n +0010540448 00000 n +0010516209 00000 n +0010484702 00000 n +0010512399 00000 n +0010512498 00000 n +0010512589 00000 n +0010488114 00000 n +0010462534 00000 n +0010484323 00000 n +0010484422 00000 n +0010484518 00000 n +0010484609 00000 n +0010465307 00000 n +0010443259 00000 n +0010462061 00000 n +0010462160 00000 n +0010462256 00000 n +0010462347 00000 n +0010462440 00000 n +0010445812 00000 n +0010423732 00000 n +0010442880 00000 n +0010442973 00000 n +0010443072 00000 n +0010443163 00000 n +0010426460 00000 n +0010397471 00000 n +0010423250 00000 n +0010423349 00000 n +0010423445 00000 n +0010423536 00000 n +0010423629 00000 n +0010400621 00000 n +0010371153 00000 n +0010397085 00000 n +0010397184 00000 n +0010397275 00000 n +0010397368 00000 n +0010374395 00000 n +0010348483 00000 n +0010370774 00000 n +0010370873 00000 n +0010370969 00000 n +0010371060 00000 n +0010351541 00000 n +0010322104 00000 n +0010348097 00000 n +0010348196 00000 n +0010348299 00000 n +0010348390 00000 n +0010325622 00000 n +0010293052 00000 n +0010321528 00000 n +0010321627 00000 n +0010321718 00000 n +0010321811 00000 n +0010321905 00000 n +0010322008 00000 n +0010296974 00000 n +0010263643 00000 n +0010292667 00000 n +0010292766 00000 n +0010292869 00000 n +0010292960 00000 n +0010267639 00000 n +0010245823 00000 n +0010263161 00000 n +0010263260 00000 n +0010263363 00000 n +0010263454 00000 n +0010263547 00000 n +0010248117 00000 n +0010214154 00000 n +0010245341 00000 n +0010245440 00000 n +0010245536 00000 n +0010245627 00000 n +0010245730 00000 n +0010218499 00000 n +0010185423 00000 n +0010213870 00000 n +0010213969 00000 n +0010214060 00000 n +0010188742 00000 n +0010158467 00000 n +0010185140 00000 n +0010185233 00000 n +0010185332 00000 n +0010161959 00000 n +0010125329 00000 n +0010156188 00000 n +0010156323 00000 n +0010156422 00000 n +0010156513 00000 n +0010129481 00000 n +0010098086 00000 n +0010125046 00000 n +0010125145 00000 n +0010125236 00000 n +0010101877 00000 n +0010069234 00000 n +0010097615 00000 n +0010097714 00000 n +0010097810 00000 n +0010097901 00000 n +0010097994 00000 n +0010072831 00000 n +0010041148 00000 n +0010068848 00000 n +0010068947 00000 n +0010069038 00000 n +0010069141 00000 n +0010044934 00000 n +0010013580 00000 n +0010040865 00000 n +0010040964 00000 n +0010041055 00000 n +0010016838 00000 n +0009979102 00000 n +0010013297 00000 n +0010013396 00000 n +0010013487 00000 n +0009983679 00000 n +0009943598 00000 n +0009978716 00000 n +0009978815 00000 n +0009978906 00000 n +0009979009 00000 n +0009948388 00000 n +0009915124 00000 n +0009943315 00000 n +0009943414 00000 n +0009943505 00000 n +0009918484 00000 n +0009881479 00000 n +0009914735 00000 n +0009914834 00000 n +0009914930 00000 n +0009915021 00000 n +0009885685 00000 n +0009842877 00000 n +0009881196 00000 n +0009881295 00000 n +0009881386 00000 n +0009848006 00000 n +0009806109 00000 n +0009842594 00000 n +0009842693 00000 n +0009842784 00000 n +0009810638 00000 n +0009772670 00000 n +0009805826 00000 n +0009805925 00000 n +0009806016 00000 n +0009777008 00000 n +0009742928 00000 n +0009772387 00000 n +0009772486 00000 n +0009772577 00000 n +0009746663 00000 n +0009725065 00000 n +0009742447 00000 n +0009742546 00000 n +0009742649 00000 n +0009742740 00000 n +0009742836 00000 n +0009727463 00000 n +0009722674 00000 n +0009724870 00000 n +0009724969 00000 n +0009723079 00000 n +0009699588 00000 n +0009722201 00000 n +0009722297 00000 n +0009722388 00000 n +0009722481 00000 n +0009722575 00000 n +0009702659 00000 n +0009673502 00000 n +0009699208 00000 n +0009699307 00000 n +0009699403 00000 n +0009699495 00000 n +0009676816 00000 n +0009658423 00000 n +0009673124 00000 n +0009673223 00000 n +0009673314 00000 n +0009673410 00000 n +0009660516 00000 n +0009656312 00000 n +0009658125 00000 n +0009658224 00000 n +0009658320 00000 n +0009656663 00000 n +0009629986 00000 n +0009655933 00000 n +0009656029 00000 n +0009656120 00000 n +0009656219 00000 n +0009633319 00000 n +0009607466 00000 n +0009629607 00000 n +0009629706 00000 n +0009629802 00000 n +0009629893 00000 n +0009610580 00000 n +0009580411 00000 n +0009605091 00000 n +0009605226 00000 n +0009605322 00000 n +0009605413 00000 n +0009605506 00000 n +0009583428 00000 n +0009560216 00000 n +0009580128 00000 n +0009580227 00000 n +0009580318 00000 n +0009562976 00000 n +0009533547 00000 n +0009557834 00000 n +0009557969 00000 n +0009558068 00000 n +0009558159 00000 n +0009558252 00000 n +0009536585 00000 n +0009507546 00000 n +0009533168 00000 n +0009533267 00000 n +0009533363 00000 n +0009533454 00000 n +0009511037 00000 n +0009479142 00000 n +0009507167 00000 n +0009507263 00000 n +0009507354 00000 n +0009507447 00000 n +0009482434 00000 n +0009449402 00000 n +0009476863 00000 n +0009476998 00000 n +0009477097 00000 n +0009477188 00000 n +0009452915 00000 n +0009417508 00000 n +0009449016 00000 n +0009449115 00000 n +0009449218 00000 n +0009449309 00000 n +0009421603 00000 n +0009392226 00000 n +0009417131 00000 n +0009417230 00000 n +0009417321 00000 n +0009417414 00000 n +0009395163 00000 n +0009367585 00000 n +0009391753 00000 n +0009391849 00000 n +0009391940 00000 n +0009392039 00000 n +0009392133 00000 n +0009370705 00000 n +0009348988 00000 n +0009367199 00000 n +0009367298 00000 n +0009367401 00000 n +0009367492 00000 n +0009351378 00000 n +0009332344 00000 n +0009348602 00000 n +0009348705 00000 n +0009348796 00000 n +0009348889 00000 n +0009334423 00000 n +0009317279 00000 n +0009331862 00000 n +0009331961 00000 n +0009332057 00000 n +0009332148 00000 n +0009332241 00000 n +0009319295 00000 n +0009291393 00000 n +0009316808 00000 n +0009316904 00000 n +0009316996 00000 n +0009317087 00000 n +0009317186 00000 n +0009294547 00000 n +0009261277 00000 n +0009291007 00000 n +0009291106 00000 n +0009291209 00000 n +0009291300 00000 n +0009264825 00000 n +0009238000 00000 n +0009260701 00000 n +0009260800 00000 n +0009260896 00000 n +0009260987 00000 n +0009261090 00000 n +0009261183 00000 n +0009240765 00000 n +0009217753 00000 n +0009237717 00000 n +0009237816 00000 n +0009237907 00000 n +0009220376 00000 n +0009194186 00000 n +0009217367 00000 n +0009217466 00000 n +0009217557 00000 n +0009217650 00000 n +0009197305 00000 n +0009168430 00000 n +0009193903 00000 n +0009194002 00000 n +0009194095 00000 n +0009171990 00000 n +0009150202 00000 n +0009168053 00000 n +0009168152 00000 n +0009168243 00000 n +0009168336 00000 n +0009152411 00000 n +0009147924 00000 n +0009149915 00000 n +0009150014 00000 n +0009150110 00000 n +0009148295 00000 n +0009118218 00000 n +0009147545 00000 n +0009147644 00000 n +0009147740 00000 n +0009147831 00000 n +0009122122 00000 n +0009090601 00000 n +0009117839 00000 n +0009117938 00000 n +0009118029 00000 n +0009118125 00000 n +0009094184 00000 n +0009053917 00000 n +0009088134 00000 n +0009088269 00000 n +0009088368 00000 n +0009088459 00000 n +0009088555 00000 n +0009088648 00000 n +0009058528 00000 n +0009045947 00000 n +0009053634 00000 n +0009053733 00000 n +0009053824 00000 n +0009047089 00000 n +0009020210 00000 n +0009045568 00000 n +0009045664 00000 n +0009045755 00000 n +0009045854 00000 n +0009023470 00000 n +0008991323 00000 n +0009019831 00000 n +0009019930 00000 n +0009020021 00000 n +0009020114 00000 n +0008995179 00000 n +0008963977 00000 n +0008988845 00000 n +0008988980 00000 n +0008989079 00000 n +0008989175 00000 n +0008989266 00000 n +0008989369 00000 n +0008967543 00000 n +0008932720 00000 n +0008963591 00000 n +0008963690 00000 n +0008963793 00000 n +0008963886 00000 n +0008937287 00000 n +0008905882 00000 n +0008932238 00000 n +0008932337 00000 n +0008932433 00000 n +0008932524 00000 n +0008932627 00000 n +0008909515 00000 n +0008891332 00000 n +0008905496 00000 n +0008905595 00000 n +0008905698 00000 n +0008905791 00000 n +0008893433 00000 n +0008866234 00000 n +0008890954 00000 n +0008891053 00000 n +0008891149 00000 n +0008891240 00000 n +0008869085 00000 n +0008863777 00000 n +0008865844 00000 n +0008865943 00000 n +0008866039 00000 n +0008866131 00000 n +0008864166 00000 n +0008841173 00000 n +0008863398 00000 n +0008863494 00000 n +0008863585 00000 n +0008863684 00000 n +0008843868 00000 n +0008818507 00000 n +0008840794 00000 n +0008840893 00000 n +0008840984 00000 n +0008841077 00000 n +0008821319 00000 n +0008794088 00000 n +0008818128 00000 n +0008818227 00000 n +0008818318 00000 n +0008818411 00000 n +0008797042 00000 n +0008791782 00000 n +0008793698 00000 n +0008793797 00000 n +0008793893 00000 n +0008793985 00000 n +0008792140 00000 n +0008768696 00000 n +0008791403 00000 n +0008791499 00000 n +0008791590 00000 n +0008791689 00000 n +0008771506 00000 n +0008751662 00000 n +0008768321 00000 n +0008768420 00000 n +0008768512 00000 n +0008768603 00000 n +0008753687 00000 n +0008729232 00000 n +0008751283 00000 n +0008751382 00000 n +0008751478 00000 n +0008751569 00000 n +0008731951 00000 n +0008702734 00000 n +0008728853 00000 n +0008728952 00000 n +0008729048 00000 n +0008729141 00000 n +0008706055 00000 n +0008685939 00000 n +0008702451 00000 n +0008702550 00000 n +0008702641 00000 n +0008688203 00000 n +0008683770 00000 n +0008685652 00000 n +0008685751 00000 n +0008685847 00000 n +0008684129 00000 n +0008653698 00000 n +0008683391 00000 n +0008683487 00000 n +0008683578 00000 n +0008683677 00000 n +0008657802 00000 n +0008630483 00000 n +0008653216 00000 n +0008653315 00000 n +0008653406 00000 n +0008653499 00000 n +0008653595 00000 n +0008633909 00000 n +0008609399 00000 n +0008630097 00000 n +0008630196 00000 n +0008630299 00000 n +0008630390 00000 n +0008612483 00000 n +0008601839 00000 n +0008609020 00000 n +0008609119 00000 n +0008609215 00000 n +0008609308 00000 n +0008602917 00000 n +0008572753 00000 n +0008601460 00000 n +0008601556 00000 n +0008601647 00000 n +0008601746 00000 n +0008576406 00000 n +0008546597 00000 n +0008572271 00000 n +0008572370 00000 n +0008572463 00000 n +0008572559 00000 n +0008572650 00000 n +0008549454 00000 n +0008524340 00000 n +0008546211 00000 n +0008546310 00000 n +0008546403 00000 n +0008546494 00000 n +0008527080 00000 n +0008498803 00000 n +0008523860 00000 n +0008523959 00000 n +0008524050 00000 n +0008524143 00000 n +0008524246 00000 n +0008502164 00000 n +0008472590 00000 n +0008498424 00000 n +0008498520 00000 n +0008498619 00000 n +0008498710 00000 n +0008475922 00000 n +0008443625 00000 n +0008472307 00000 n +0008472406 00000 n +0008472497 00000 n +0008447351 00000 n +0008417025 00000 n +0008443143 00000 n +0008443242 00000 n +0008443345 00000 n +0008443441 00000 n +0008443532 00000 n +0008420196 00000 n +0008394412 00000 n +0008416742 00000 n +0008416841 00000 n +0008416932 00000 n +0008397377 00000 n +0008377075 00000 n +0008393930 00000 n +0008394029 00000 n +0008394120 00000 n +0008394213 00000 n +0008394309 00000 n +0008379460 00000 n +0008353703 00000 n +0008376501 00000 n +0008376600 00000 n +0008376703 00000 n +0008376799 00000 n +0008376890 00000 n +0008376982 00000 n +0008356721 00000 n +0008339112 00000 n +0008353420 00000 n +0008353513 00000 n +0008353604 00000 n +0008340940 00000 n +0008319066 00000 n +0008336924 00000 n +0008337059 00000 n +0008337158 00000 n +0008320923 00000 n +0008290295 00000 n +0008318783 00000 n +0008318882 00000 n +0008318973 00000 n +0008293847 00000 n +0008269918 00000 n +0008290105 00000 n +0008290204 00000 n +0008272473 00000 n +0008253355 00000 n +0008269635 00000 n +0008269728 00000 n +0008269827 00000 n +0008255392 00000 n +0008220085 00000 n +0008253062 00000 n +0008253161 00000 n +0008253264 00000 n +0008224230 00000 n +0008188162 00000 n +0008219603 00000 n +0008219702 00000 n +0008219793 00000 n +0008219889 00000 n +0008219982 00000 n +0008192518 00000 n +0008152222 00000 n +0008187879 00000 n +0008187978 00000 n +0008188069 00000 n +0008156732 00000 n +0008132083 00000 n +0008151939 00000 n +0008152038 00000 n +0008152129 00000 n +0008134469 00000 n +0008099606 00000 n +0008131601 00000 n +0008131700 00000 n +0008131796 00000 n +0008131887 00000 n +0008131990 00000 n +0008103904 00000 n +0008059713 00000 n +0008097420 00000 n +0008097555 00000 n +0008097654 00000 n +0008064787 00000 n +0008032129 00000 n +0008059336 00000 n +0008059435 00000 n +0008059526 00000 n +0008059619 00000 n +0008035872 00000 n +0008004930 00000 n +0008031557 00000 n +0008031656 00000 n +0008031749 00000 n +0008031840 00000 n +0008031943 00000 n +0008032037 00000 n +0008008362 00000 n +0007981202 00000 n +0008004457 00000 n +0008004556 00000 n +0008004647 00000 n +0008004741 00000 n +0008004834 00000 n +0007983967 00000 n +0007960993 00000 n +0007980626 00000 n +0007980725 00000 n +0007980816 00000 n +0007980910 00000 n +0007981003 00000 n +0007981106 00000 n +0007963706 00000 n +0007933609 00000 n +0007960511 00000 n +0007960610 00000 n +0007960706 00000 n +0007960797 00000 n +0007960890 00000 n +0007936695 00000 n +0007906184 00000 n +0007933230 00000 n +0007933329 00000 n +0007933420 00000 n +0007933513 00000 n +0007909394 00000 n +0007876093 00000 n +0007905805 00000 n +0007905904 00000 n +0007906000 00000 n +0007906093 00000 n +0007880105 00000 n +0007868109 00000 n +0007875807 00000 n +0007875906 00000 n +0007875997 00000 n +0007869256 00000 n +0007865961 00000 n +0007867811 00000 n +0007867910 00000 n +0007868006 00000 n +0007866324 00000 n +0007841068 00000 n +0007865582 00000 n +0007865678 00000 n +0007865769 00000 n +0007865868 00000 n +0007843897 00000 n +0007816491 00000 n +0007840586 00000 n +0007840685 00000 n +0007840776 00000 n +0007840869 00000 n +0007840965 00000 n +0007819309 00000 n +0007783908 00000 n +0007816208 00000 n +0007816307 00000 n +0007816398 00000 n +0007788228 00000 n +0007762631 00000 n +0007783529 00000 n +0007783628 00000 n +0007783724 00000 n +0007783817 00000 n +0007765447 00000 n +0007745776 00000 n +0007762348 00000 n +0007762441 00000 n +0007762540 00000 n +0007747592 00000 n +0007723193 00000 n +0007745493 00000 n +0007745592 00000 n +0007745683 00000 n +0007725734 00000 n +0007702636 00000 n +0007722814 00000 n +0007722913 00000 n +0007723004 00000 n +0007723100 00000 n +0007705188 00000 n +0007686397 00000 n +0007702350 00000 n +0007702449 00000 n +0007702545 00000 n +0007688498 00000 n +0007651291 00000 n +0007686018 00000 n +0007686114 00000 n +0007686205 00000 n +0007686304 00000 n +0007655254 00000 n +0007618866 00000 n +0007649012 00000 n +0007649147 00000 n +0007649246 00000 n +0007649339 00000 n +0007622559 00000 n +0007592086 00000 n +0007618292 00000 n +0007618391 00000 n +0007618482 00000 n +0007618585 00000 n +0007618681 00000 n +0007618774 00000 n +0007595416 00000 n +0007566708 00000 n +0007591512 00000 n +0007591611 00000 n +0007591714 00000 n +0007591805 00000 n +0007591901 00000 n +0007591993 00000 n +0007569778 00000 n +0007531471 00000 n +0007566226 00000 n +0007566325 00000 n +0007566421 00000 n +0007566512 00000 n +0007566615 00000 n +0007535641 00000 n +0007511199 00000 n +0007531188 00000 n +0007531287 00000 n +0007531380 00000 n +0007513957 00000 n +0007491116 00000 n +0007510822 00000 n +0007510921 00000 n +0007511012 00000 n +0007511105 00000 n +0007493511 00000 n +0007474335 00000 n +0007490926 00000 n +0007491025 00000 n +0007476466 00000 n +0007452339 00000 n +0007474052 00000 n +0007474151 00000 n +0007474242 00000 n +0007454963 00000 n +0007436593 00000 n +0007452056 00000 n +0007452155 00000 n +0007452246 00000 n +0007438560 00000 n +0007412406 00000 n +0007436111 00000 n +0007436210 00000 n +0007436306 00000 n +0007436397 00000 n +0007436500 00000 n +0007415349 00000 n +0007387660 00000 n +0007412123 00000 n +0007412222 00000 n +0007412315 00000 n +0007390645 00000 n +0007366352 00000 n +0007387377 00000 n +0007387476 00000 n +0007387567 00000 n +0007368894 00000 n +0007348597 00000 n +0007365778 00000 n +0007365877 00000 n +0007365973 00000 n +0007366065 00000 n +0007366168 00000 n +0007366259 00000 n +0007350874 00000 n +0007334933 00000 n +0007348314 00000 n +0007348405 00000 n +0007348504 00000 n +0007336665 00000 n +0007313385 00000 n +0007334650 00000 n +0007334749 00000 n +0007334840 00000 n +0007316217 00000 n +0007286719 00000 n +0007313102 00000 n +0007313201 00000 n +0007313294 00000 n +0007290249 00000 n +0007270189 00000 n +0007286436 00000 n +0007286535 00000 n +0007286626 00000 n +0007272213 00000 n +0007248728 00000 n +0007269906 00000 n +0007270005 00000 n +0007270096 00000 n +0007251412 00000 n +0007237073 00000 n +0007248257 00000 n +0007248356 00000 n +0007248448 00000 n +0007248541 00000 n +0007248632 00000 n +0007238881 00000 n +0007210130 00000 n +0007236694 00000 n +0007236790 00000 n +0007236881 00000 n +0007236974 00000 n +0007213775 00000 n +0007181864 00000 n +0007209751 00000 n +0007209847 00000 n +0007209946 00000 n +0007210037 00000 n +0007185558 00000 n +0007163405 00000 n +0007181485 00000 n +0007181581 00000 n +0007181672 00000 n +0007181765 00000 n +0007165552 00000 n +0007131619 00000 n +0007163122 00000 n +0007163221 00000 n +0007163312 00000 n +0007133717 00000 n +0007099660 00000 n +0007131240 00000 n +0007131333 00000 n +0007131432 00000 n +0007131523 00000 n +0007102821 00000 n +0007075514 00000 n +0007099187 00000 n +0007099286 00000 n +0007099382 00000 n +0007099475 00000 n +0007099566 00000 n +0007078348 00000 n +0007059591 00000 n +0007075231 00000 n +0007075330 00000 n +0007075421 00000 n +0007061607 00000 n +0007038854 00000 n +0007059212 00000 n +0007059311 00000 n +0007059407 00000 n +0007059498 00000 n +0007041438 00000 n +0007004391 00000 n +0007038475 00000 n +0007038574 00000 n +0007038670 00000 n +0007038761 00000 n +0007008835 00000 n +0006976116 00000 n +0007003910 00000 n +0007004009 00000 n +0007004105 00000 n +0007004208 00000 n +0007004299 00000 n +0006979348 00000 n +0006961146 00000 n +0006975833 00000 n +0006975932 00000 n +0006976023 00000 n +0006963151 00000 n +0006958619 00000 n +0006960951 00000 n +0006961050 00000 n +0006959006 00000 n +0006935303 00000 n +0006958240 00000 n +0006958336 00000 n +0006958427 00000 n +0006958526 00000 n +0006938076 00000 n +0006907688 00000 n +0006934924 00000 n +0006935023 00000 n +0006935119 00000 n +0006935210 00000 n +0006910993 00000 n +0006882914 00000 n +0006907405 00000 n +0006907504 00000 n +0006907595 00000 n +0006886156 00000 n +0006867593 00000 n +0006882631 00000 n +0006882730 00000 n +0006882821 00000 n +0006869387 00000 n +0006839910 00000 n +0006867310 00000 n +0006867409 00000 n +0006867500 00000 n +0006843274 00000 n +0006817347 00000 n +0006839627 00000 n +0006839726 00000 n +0006839817 00000 n +0006819954 00000 n +0006796391 00000 n +0006817064 00000 n +0006817155 00000 n +0006817254 00000 n +0006798750 00000 n +0006770081 00000 n +0006796108 00000 n +0006796207 00000 n +0006796298 00000 n +0006773367 00000 n +0006759715 00000 n +0006769702 00000 n +0006769798 00000 n +0006769891 00000 n +0006769982 00000 n +0006761168 00000 n +0006739771 00000 n +0006759233 00000 n +0006759332 00000 n +0006759428 00000 n +0006759519 00000 n +0006759622 00000 n +0006742259 00000 n +0006691611 00000 n +0006739293 00000 n +0006739392 00000 n +0006739485 00000 n +0006739576 00000 n +0006739679 00000 n +0006693940 00000 n +0006658667 00000 n +0006691316 00000 n +0006691415 00000 n +0006691508 00000 n +0006659069 00000 n +0006646715 00000 n +0006658091 00000 n +0006658190 00000 n +0006658286 00000 n +0006658389 00000 n +0006658480 00000 n +0006658574 00000 n +0006648265 00000 n +0006621578 00000 n +0006646233 00000 n +0006646332 00000 n +0006646428 00000 n +0006646519 00000 n +0006646612 00000 n +0006624422 00000 n +0006590740 00000 n +0006619100 00000 n +0006619235 00000 n +0006619338 00000 n +0006619437 00000 n +0006619533 00000 n +0006619624 00000 n +0006594465 00000 n +0006565771 00000 n +0006590166 00000 n +0006590265 00000 n +0006590356 00000 n +0006590449 00000 n +0006590552 00000 n +0006590648 00000 n +0006568993 00000 n +0006542510 00000 n +0006565488 00000 n +0006565587 00000 n +0006565678 00000 n +0006545461 00000 n +0006522422 00000 n +0006542124 00000 n +0006542223 00000 n +0006542326 00000 n +0006542419 00000 n +0006525317 00000 n +0006494693 00000 n +0006521951 00000 n +0006522050 00000 n +0006522146 00000 n +0006522237 00000 n +0006522330 00000 n +0006498135 00000 n +0006448294 00000 n +0006492215 00000 n +0006492350 00000 n +0006492449 00000 n +0006492542 00000 n +0006492633 00000 n +0006492736 00000 n +0006450412 00000 n +0006427340 00000 n +0006445909 00000 n +0006446044 00000 n +0006446143 00000 n +0006446246 00000 n +0006446342 00000 n +0006429841 00000 n +0006409422 00000 n +0006426954 00000 n +0006427053 00000 n +0006427144 00000 n +0006427247 00000 n +0006411660 00000 n +0006388242 00000 n +0006408940 00000 n +0006409039 00000 n +0006409130 00000 n +0006409226 00000 n +0006409329 00000 n +0006390843 00000 n +0006363326 00000 n +0006387956 00000 n +0006388055 00000 n +0006388151 00000 n +0006366474 00000 n +0006319278 00000 n +0006362844 00000 n +0006362943 00000 n +0006363036 00000 n +0006363127 00000 n +0006363230 00000 n +0006321312 00000 n +0006310279 00000 n +0006318797 00000 n +0006318896 00000 n +0006318999 00000 n +0006319095 00000 n +0006319186 00000 n +0006311452 00000 n +0006300986 00000 n +0006309900 00000 n +0006309999 00000 n +0006310095 00000 n +0006310186 00000 n +0006302260 00000 n +0006275718 00000 n +0006300515 00000 n +0006300614 00000 n +0006300710 00000 n +0006300802 00000 n +0006300893 00000 n +0006278879 00000 n +0006259584 00000 n +0006275236 00000 n +0006275332 00000 n +0006275423 00000 n +0006275526 00000 n +0006275619 00000 n +0006261600 00000 n +0006232941 00000 n +0006259205 00000 n +0006259304 00000 n +0006259400 00000 n +0006259491 00000 n +0006236311 00000 n +0006213428 00000 n +0006232555 00000 n +0006232654 00000 n +0006232757 00000 n +0006232848 00000 n +0006215697 00000 n +0006186637 00000 n +0006212946 00000 n +0006213045 00000 n +0006213141 00000 n +0006213232 00000 n +0006213325 00000 n +0006190099 00000 n +0006151244 00000 n +0006186354 00000 n +0006186453 00000 n +0006186546 00000 n +0006155128 00000 n +0006121982 00000 n +0006150762 00000 n +0006150861 00000 n +0006150952 00000 n +0006151055 00000 n +0006151151 00000 n +0006125402 00000 n +0006093073 00000 n +0006121604 00000 n +0006121703 00000 n +0006121794 00000 n +0006121890 00000 n +0006096843 00000 n +0006069886 00000 n +0006092790 00000 n +0006092889 00000 n +0006092982 00000 n +0006072831 00000 n +0006038241 00000 n +0006069603 00000 n +0006069702 00000 n +0006069793 00000 n +0006041944 00000 n +0006015439 00000 n +0006037958 00000 n +0006038057 00000 n +0006038148 00000 n +0006018322 00000 n +0005998300 00000 n +0006014968 00000 n +0006015060 00000 n +0006015153 00000 n +0006015252 00000 n +0006015343 00000 n +0006000415 00000 n +0005965214 00000 n +0005995822 00000 n +0005995957 00000 n +0005996056 00000 n +0005996152 00000 n +0005996255 00000 n +0005996346 00000 n +0005969675 00000 n +0005935411 00000 n +0005964732 00000 n +0005964831 00000 n +0005964922 00000 n +0005965015 00000 n +0005965118 00000 n +0005939313 00000 n +0005914129 00000 n +0005935034 00000 n +0005935133 00000 n +0005935224 00000 n +0005935317 00000 n +0005916834 00000 n +0005884750 00000 n +0005913752 00000 n +0005913851 00000 n +0005913942 00000 n +0005914036 00000 n +0005888496 00000 n +0005851831 00000 n +0005884373 00000 n +0005884472 00000 n +0005884566 00000 n +0005884657 00000 n +0005855985 00000 n +0005831183 00000 n +0005851358 00000 n +0005851451 00000 n +0005851542 00000 n +0005851641 00000 n +0005851737 00000 n +0005833995 00000 n +0005802597 00000 n +0005830701 00000 n +0005830800 00000 n +0005830891 00000 n +0005830984 00000 n +0005831080 00000 n +0005805857 00000 n +0005784637 00000 n +0005802213 00000 n +0005802311 00000 n +0005802410 00000 n +0005802506 00000 n +0005786708 00000 n +0005756116 00000 n +0005784155 00000 n +0005784254 00000 n +0005784350 00000 n +0005784441 00000 n +0005784544 00000 n +0005759511 00000 n +0005727454 00000 n +0005755739 00000 n +0005755838 00000 n +0005755929 00000 n +0005756022 00000 n +0005730976 00000 n +0005706363 00000 n +0005726981 00000 n +0005727080 00000 n +0005727176 00000 n +0005727270 00000 n +0005727361 00000 n +0005708989 00000 n +0005682878 00000 n +0005705986 00000 n +0005706077 00000 n +0005706170 00000 n +0005706269 00000 n +0005685892 00000 n +0005651018 00000 n +0005682688 00000 n +0005682787 00000 n +0005654420 00000 n +0005618467 00000 n +0005650639 00000 n +0005650738 00000 n +0005650834 00000 n +0005650927 00000 n +0005622122 00000 n +0005579737 00000 n +0005618090 00000 n +0005618189 00000 n +0005618282 00000 n +0005618373 00000 n +0005584057 00000 n +0005556094 00000 n +0005579360 00000 n +0005579459 00000 n +0005579550 00000 n +0005579643 00000 n +0005559371 00000 n +0005528366 00000 n +0005553719 00000 n +0005553854 00000 n +0005553953 00000 n +0005554049 00000 n +0005554142 00000 n +0005531573 00000 n +0005513378 00000 n +0005527980 00000 n +0005528079 00000 n +0005528170 00000 n +0005528273 00000 n +0005515181 00000 n +0005487664 00000 n +0005513095 00000 n +0005513194 00000 n +0005513285 00000 n +0005490849 00000 n +0005462515 00000 n +0005487287 00000 n +0005487386 00000 n +0005487477 00000 n +0005487570 00000 n +0005465823 00000 n +0005433151 00000 n +0005462138 00000 n +0005462237 00000 n +0005462328 00000 n +0005462421 00000 n +0005437095 00000 n +0005412069 00000 n +0005432765 00000 n +0005432864 00000 n +0005432967 00000 n +0005433058 00000 n +0005414523 00000 n +0005384816 00000 n +0005411786 00000 n +0005411885 00000 n +0005411976 00000 n +0005388013 00000 n +0005356059 00000 n +0005384533 00000 n +0005384632 00000 n +0005384723 00000 n +0005359802 00000 n +0005334936 00000 n +0005355776 00000 n +0005355875 00000 n +0005355968 00000 n +0005337759 00000 n +0005312216 00000 n +0005334653 00000 n +0005334752 00000 n +0005334843 00000 n +0005314809 00000 n +0005284566 00000 n +0005311933 00000 n +0005312032 00000 n +0005312123 00000 n +0005288244 00000 n +0005261741 00000 n +0005284180 00000 n +0005284279 00000 n +0005284382 00000 n +0005284473 00000 n +0005264521 00000 n +0005221582 00000 n +0005261362 00000 n +0005261461 00000 n +0005261557 00000 n +0005261650 00000 n +0005226281 00000 n +0005200995 00000 n +0005221100 00000 n +0005221196 00000 n +0005221287 00000 n +0005221380 00000 n +0005221479 00000 n +0005203580 00000 n +0005164776 00000 n +0005200609 00000 n +0005200708 00000 n +0005200799 00000 n +0005200892 00000 n +0005169057 00000 n +0005129449 00000 n +0005164390 00000 n +0005164489 00000 n +0005164592 00000 n +0005164683 00000 n +0005133521 00000 n +0005113895 00000 n +0005128972 00000 n +0005129071 00000 n +0005129164 00000 n +0005129255 00000 n +0005129351 00000 n +0005115919 00000 n +0005078738 00000 n +0005111520 00000 n +0005111655 00000 n +0005111754 00000 n +0005111850 00000 n +0005111941 00000 n +0005082755 00000 n +0005056718 00000 n +0005078455 00000 n +0005078554 00000 n +0005078645 00000 n +0005059634 00000 n +0005031439 00000 n +0005056236 00000 n +0005056335 00000 n +0005056426 00000 n +0005056522 00000 n +0005056625 00000 n +0005034530 00000 n +0005013793 00000 n +0005031156 00000 n +0005031255 00000 n +0005031348 00000 n +0005015939 00000 n +0004998879 00000 n +0005013311 00000 n +0005013410 00000 n +0005013506 00000 n +0005013609 00000 n +0005013700 00000 n +0005000735 00000 n +0004970717 00000 n +0004998500 00000 n +0004998599 00000 n +0004998695 00000 n +0004998788 00000 n +0004973940 00000 n +0004948041 00000 n +0004970236 00000 n +0004970335 00000 n +0004970431 00000 n +0004970522 00000 n +0004970625 00000 n +0004950594 00000 n +0004926523 00000 n +0004947559 00000 n +0004947658 00000 n +0004947761 00000 n +0004947852 00000 n +0004947948 00000 n +0004929018 00000 n +0004899554 00000 n +0004925949 00000 n +0004926048 00000 n +0004926151 00000 n +0004926242 00000 n +0004926338 00000 n +0004926431 00000 n +0004902889 00000 n +0004874205 00000 n +0004899081 00000 n +0004899180 00000 n +0004899271 00000 n +0004899364 00000 n +0004899460 00000 n +0004877548 00000 n +0004844692 00000 n +0004871923 00000 n +0004872058 00000 n +0004872157 00000 n +0004872253 00000 n +0004847990 00000 n +0004811912 00000 n +0004844313 00000 n +0004844412 00000 n +0004844503 00000 n +0004844599 00000 n +0004815834 00000 n +0004775837 00000 n +0004811533 00000 n +0004811632 00000 n +0004811728 00000 n +0004811819 00000 n +0004779972 00000 n +0004744558 00000 n +0004775460 00000 n +0004775559 00000 n +0004775652 00000 n +0004775743 00000 n +0004748653 00000 n +0004711859 00000 n +0004743890 00000 n +0004743989 00000 n +0004744085 00000 n +0004744176 00000 n +0004744269 00000 n +0004744363 00000 n +0004744466 00000 n +0004715751 00000 n +0004691123 00000 n +0004711576 00000 n +0004711675 00000 n +0004711766 00000 n +0004693640 00000 n +0004664822 00000 n +0004690840 00000 n +0004690939 00000 n +0004691030 00000 n +0004668060 00000 n +0004635573 00000 n +0004664445 00000 n +0004664544 00000 n +0004664635 00000 n +0004664728 00000 n +0004639442 00000 n +0004614727 00000 n +0004635187 00000 n +0004635286 00000 n +0004635379 00000 n +0004635470 00000 n +0004617228 00000 n +0004590549 00000 n +0004614350 00000 n +0004614449 00000 n +0004614540 00000 n +0004614634 00000 n +0004593428 00000 n +0004562355 00000 n +0004589975 00000 n +0004590074 00000 n +0004590165 00000 n +0004590261 00000 n +0004590364 00000 n +0004590456 00000 n +0004565918 00000 n +0004528894 00000 n +0004562072 00000 n +0004562171 00000 n +0004562262 00000 n +0004533357 00000 n +0004507355 00000 n +0004528611 00000 n +0004528710 00000 n +0004528803 00000 n +0004509967 00000 n +0004486459 00000 n +0004507072 00000 n +0004507171 00000 n +0004507262 00000 n +0004488929 00000 n +0004458331 00000 n +0004486073 00000 n +0004486172 00000 n +0004486275 00000 n +0004486366 00000 n +0004461929 00000 n +0004424926 00000 n +0004457952 00000 n +0004458051 00000 n +0004458142 00000 n +0004458238 00000 n +0004428860 00000 n +0004408805 00000 n +0004424643 00000 n +0004424742 00000 n +0004424833 00000 n +0004410790 00000 n +0004406404 00000 n +0004408507 00000 n +0004408606 00000 n +0004408702 00000 n +0004406775 00000 n +0004383534 00000 n +0004406025 00000 n +0004406121 00000 n +0004406212 00000 n +0004406305 00000 n +0004386564 00000 n +0004355394 00000 n +0004381056 00000 n +0004381191 00000 n +0004381290 00000 n +0004381383 00000 n +0004381486 00000 n +0004381582 00000 n +0004358891 00000 n +0004329628 00000 n +0004355008 00000 n +0004355101 00000 n +0004355200 00000 n +0004355303 00000 n +0004333077 00000 n +0004305931 00000 n +0004329150 00000 n +0004329249 00000 n +0004329340 00000 n +0004329443 00000 n +0004329535 00000 n +0004309047 00000 n +0004276832 00000 n +0004305552 00000 n +0004305651 00000 n +0004305747 00000 n +0004305838 00000 n +0004280424 00000 n +0004255176 00000 n +0004276549 00000 n +0004276648 00000 n +0004276741 00000 n +0004257998 00000 n +0004229344 00000 n +0004254893 00000 n +0004254992 00000 n +0004255083 00000 n +0004232561 00000 n +0004213092 00000 n +0004229061 00000 n +0004229160 00000 n +0004229253 00000 n +0004215134 00000 n +0004187907 00000 n +0004212809 00000 n +0004212908 00000 n +0004212999 00000 n +0004191080 00000 n +0004165459 00000 n +0004187425 00000 n +0004187524 00000 n +0004187617 00000 n +0004187708 00000 n +0004187804 00000 n +0004168256 00000 n +0004139687 00000 n +0004164885 00000 n +0004164984 00000 n +0004165087 00000 n +0004165178 00000 n +0004165274 00000 n +0004165367 00000 n +0004142957 00000 n +0004118870 00000 n +0004139200 00000 n +0004139299 00000 n +0004139395 00000 n +0004139498 00000 n +0004139589 00000 n +0004121594 00000 n +0004099029 00000 n +0004118587 00000 n +0004118686 00000 n +0004118777 00000 n +0004101520 00000 n +0004073330 00000 n +0004098746 00000 n +0004098845 00000 n +0004098936 00000 n +0004076580 00000 n +0004050945 00000 n +0004073044 00000 n +0004073143 00000 n +0004073234 00000 n +0004053657 00000 n +0004022411 00000 n +0004050380 00000 n +0004050479 00000 n +0004050575 00000 n +0004050666 00000 n +0004050759 00000 n +0004050851 00000 n +0004025797 00000 n +0003995454 00000 n +0004021938 00000 n +0004022037 00000 n +0004022128 00000 n +0004022224 00000 n +0004022317 00000 n +0003998961 00000 n +0003981567 00000 n +0003995077 00000 n +0003995176 00000 n +0003995269 00000 n +0003995363 00000 n +0003983716 00000 n +0003944550 00000 n +0003981094 00000 n +0003981193 00000 n +0003981289 00000 n +0003981380 00000 n +0003981474 00000 n +0003949301 00000 n +0003916844 00000 n +0003944068 00000 n +0003944167 00000 n +0003944263 00000 n +0003944354 00000 n +0003944447 00000 n +0003920472 00000 n +0003886968 00000 n +0003916467 00000 n +0003916566 00000 n +0003916657 00000 n +0003916750 00000 n +0003890967 00000 n +0003865302 00000 n +0003886591 00000 n +0003886690 00000 n +0003886781 00000 n +0003886875 00000 n +0003867991 00000 n +0003835617 00000 n +0003864822 00000 n +0003864921 00000 n +0003865012 00000 n +0003865106 00000 n +0003865199 00000 n +0003839550 00000 n +0003809867 00000 n +0003835334 00000 n +0003835433 00000 n +0003835524 00000 n +0003812944 00000 n +0003779340 00000 n +0003809574 00000 n +0003809673 00000 n +0003809764 00000 n +0003783128 00000 n +0003759446 00000 n +0003778869 00000 n +0003778968 00000 n +0003779064 00000 n +0003779155 00000 n +0003779248 00000 n +0003762196 00000 n +0003736319 00000 n +0003759060 00000 n +0003759159 00000 n +0003759252 00000 n +0003759343 00000 n +0003739351 00000 n +0003699509 00000 n +0003733749 00000 n +0003733884 00000 n +0003733983 00000 n +0003734086 00000 n +0003734178 00000 n +0003734269 00000 n +0003734365 00000 n +0003703804 00000 n +0003677245 00000 n +0003699038 00000 n +0003699137 00000 n +0003699228 00000 n +0003699324 00000 n +0003699417 00000 n +0003679969 00000 n +0003655810 00000 n +0003676772 00000 n +0003676871 00000 n +0003676967 00000 n +0003677058 00000 n +0003677151 00000 n +0003658511 00000 n +0003633520 00000 n +0003655527 00000 n +0003655626 00000 n +0003655717 00000 n +0003636473 00000 n +0003606706 00000 n +0003633143 00000 n +0003633242 00000 n +0003633336 00000 n +0003633427 00000 n +0003610054 00000 n +0003578566 00000 n +0003604333 00000 n +0003604468 00000 n +0003604567 00000 n +0003604658 00000 n +0003604752 00000 n +0003582222 00000 n +0003566018 00000 n +0003578283 00000 n +0003578382 00000 n +0003578475 00000 n +0003567692 00000 n +0003544360 00000 n +0003565639 00000 n +0003565735 00000 n +0003565834 00000 n +0003565925 00000 n +0003547051 00000 n +0003519474 00000 n +0003543786 00000 n +0003543885 00000 n +0003543981 00000 n +0003544072 00000 n +0003544165 00000 n +0003544268 00000 n +0003522800 00000 n +0003493991 00000 n +0003519003 00000 n +0003519102 00000 n +0003519193 00000 n +0003519286 00000 n +0003519382 00000 n +0003497160 00000 n +0003470608 00000 n +0003493520 00000 n +0003493619 00000 n +0003493712 00000 n +0003493803 00000 n +0003493899 00000 n +0003473151 00000 n +0003450562 00000 n +0003470032 00000 n +0003470131 00000 n +0003470234 00000 n +0003470325 00000 n +0003470418 00000 n +0003470514 00000 n +0003453083 00000 n +0003431630 00000 n +0003449986 00000 n +0003450085 00000 n +0003450176 00000 n +0003450270 00000 n +0003450363 00000 n +0003450466 00000 n +0003434070 00000 n +0003410568 00000 n +0003429351 00000 n +0003429486 00000 n +0003429585 00000 n +0003429676 00000 n +0003413270 00000 n +0003408130 00000 n +0003410172 00000 n +0003410271 00000 n +0003410367 00000 n +0003410465 00000 n +0003408502 00000 n +0003388973 00000 n +0003407741 00000 n +0003407837 00000 n +0003407936 00000 n +0003408027 00000 n +0003391305 00000 n +0003362980 00000 n +0003388500 00000 n +0003388599 00000 n +0003388695 00000 n +0003388786 00000 n +0003388880 00000 n +0003366254 00000 n +0003336906 00000 n +0003362503 00000 n +0003362599 00000 n +0003362690 00000 n +0003362789 00000 n +0003362882 00000 n +0003339532 00000 n +0003311851 00000 n +0003336421 00000 n +0003336520 00000 n +0003336613 00000 n +0003336709 00000 n +0003336812 00000 n +0003314232 00000 n +0003283967 00000 n +0003311465 00000 n +0003311564 00000 n +0003311660 00000 n +0003311753 00000 n +0003286590 00000 n +0003260204 00000 n +0003283576 00000 n +0003283675 00000 n +0003283768 00000 n +0003283864 00000 n +0003262312 00000 n +0003234281 00000 n +0003257829 00000 n +0003257964 00000 n +0003258063 00000 n +0003258159 00000 n +0003258250 00000 n +0003236670 00000 n +0003210804 00000 n +0003231714 00000 n +0003231849 00000 n +0003231948 00000 n +0003232044 00000 n +0003232137 00000 n +0003232228 00000 n +0003232322 00000 n +0003213086 00000 n +0003200989 00000 n +0003210323 00000 n +0003210416 00000 n +0003210512 00000 n +0003210603 00000 n +0003210706 00000 n +0003202062 00000 n +0003198364 00000 n +0003200691 00000 n +0003200790 00000 n +0003200886 00000 n +0003198765 00000 n +0003175157 00000 n +0003197985 00000 n +0003198084 00000 n +0003198180 00000 n +0003198271 00000 n +0003177576 00000 n +0003158984 00000 n +0003174778 00000 n +0003174874 00000 n +0003174965 00000 n +0003175058 00000 n +0003160667 00000 n +0003135097 00000 n +0003158605 00000 n +0003158704 00000 n +0003158800 00000 n +0003158891 00000 n +0003137823 00000 n +0003104796 00000 n +0003134814 00000 n +0003134913 00000 n +0003135004 00000 n +0003108720 00000 n +0003080307 00000 n +0003104318 00000 n +0003104417 00000 n +0003104510 00000 n +0003104602 00000 n +0003104705 00000 n +0003083159 00000 n +0003050250 00000 n +0003080024 00000 n +0003080123 00000 n +0003080214 00000 n +0003053840 00000 n +0003018128 00000 n +0003049967 00000 n +0003050066 00000 n +0003050157 00000 n +0003022297 00000 n +0002993613 00000 n +0003017554 00000 n +0003017653 00000 n +0003017744 00000 n +0003017840 00000 n +0003017943 00000 n +0003018036 00000 n +0002996676 00000 n +0002969246 00000 n +0002993234 00000 n +0002993333 00000 n +0002993429 00000 n +0002993520 00000 n +0002972278 00000 n +0002960944 00000 n +0002968866 00000 n +0002968965 00000 n +0002969061 00000 n +0002969152 00000 n +0002962016 00000 n +0002938485 00000 n +0002960565 00000 n +0002960664 00000 n +0002960760 00000 n +0002960851 00000 n +0002941050 00000 n +0002904553 00000 n +0002936299 00000 n +0002936434 00000 n +0002936533 00000 n +0002908381 00000 n +0002870460 00000 n +0002904270 00000 n +0002904369 00000 n +0002904460 00000 n +0002874790 00000 n +0002854674 00000 n +0002870270 00000 n +0002870369 00000 n +0002856705 00000 n +0002824652 00000 n +0002852299 00000 n +0002852434 00000 n +0002852530 00000 n +0002852621 00000 n +0002852714 00000 n +0002828279 00000 n +0002822113 00000 n +0002824369 00000 n +0002824468 00000 n +0002824559 00000 n +0002822514 00000 n +0002791385 00000 n +0002821631 00000 n +0002821730 00000 n +0002821826 00000 n +0002821929 00000 n +0002822020 00000 n +0002795408 00000 n +0002759154 00000 n +0002791195 00000 n +0002791294 00000 n +0002763539 00000 n +0002719831 00000 n +0002758775 00000 n +0002758874 00000 n +0002758970 00000 n +0002759061 00000 n +0002724755 00000 n +0002706285 00000 n +0002719358 00000 n +0002719457 00000 n +0002719548 00000 n +0002719644 00000 n +0002719738 00000 n +0002708260 00000 n +0002688993 00000 n +0002706093 00000 n +0002706192 00000 n +0002690723 00000 n +0002678477 00000 n +0002688609 00000 n +0002688708 00000 n +0002688801 00000 n +0002688895 00000 n +0002679929 00000 n +0002648373 00000 n +0002678098 00000 n +0002678197 00000 n +0002678293 00000 n +0002678384 00000 n +0002651673 00000 n +0002611331 00000 n +0002647808 00000 n +0002647907 00000 n +0002648000 00000 n +0002648091 00000 n +0002648187 00000 n +0002648281 00000 n +0002614927 00000 n +0002573881 00000 n +0002611048 00000 n +0002611147 00000 n +0002611238 00000 n +0002577608 00000 n +0002536367 00000 n +0002573410 00000 n +0002573509 00000 n +0002573600 00000 n +0002573693 00000 n +0002573789 00000 n +0002539929 00000 n +0002524721 00000 n +0002536084 00000 n +0002536183 00000 n +0002536274 00000 n +0002526009 00000 n +0002522532 00000 n +0002524438 00000 n +0002524537 00000 n +0002524628 00000 n +0002522891 00000 n +0002496136 00000 n +0002522153 00000 n +0002522249 00000 n +0002522342 00000 n +0002522433 00000 n +0002501160 00000 n +0002494030 00000 n +0002495843 00000 n +0002495942 00000 n +0002496038 00000 n +0002494391 00000 n +0002467238 00000 n +0002493651 00000 n +0002493750 00000 n +0002493846 00000 n +0002493937 00000 n +0002470781 00000 n +0002437624 00000 n +0002466955 00000 n +0002467054 00000 n +0002467147 00000 n +0002440416 00000 n +0002425820 00000 n +0002435345 00000 n +0002435480 00000 n +0002435579 00000 n +0002435672 00000 n +0002427349 00000 n +0002423440 00000 n +0002425533 00000 n +0002425632 00000 n +0002425728 00000 n +0002423825 00000 n +0002400448 00000 n +0002422958 00000 n +0002423057 00000 n +0002423153 00000 n +0002423244 00000 n +0002423347 00000 n +0002403155 00000 n +0002372490 00000 n +0002400062 00000 n +0002400161 00000 n +0002400252 00000 n +0002400355 00000 n +0002376113 00000 n +0002341019 00000 n +0002372207 00000 n +0002372306 00000 n +0002372397 00000 n +0002345451 00000 n +0002311847 00000 n +0002340736 00000 n +0002340835 00000 n +0002340926 00000 n +0002315231 00000 n +0002285483 00000 n +0002311564 00000 n +0002311663 00000 n +0002311754 00000 n +0002288811 00000 n +0002255340 00000 n +0002285106 00000 n +0002285205 00000 n +0002285296 00000 n +0002285390 00000 n +0002259028 00000 n +0002220708 00000 n +0002254961 00000 n +0002255060 00000 n +0002255151 00000 n +0002255247 00000 n +0002225344 00000 n +0002196894 00000 n +0002220425 00000 n +0002220524 00000 n +0002220617 00000 n +0002200120 00000 n +0002170697 00000 n +0002196611 00000 n +0002196710 00000 n +0002196803 00000 n +0002174158 00000 n +0002168206 00000 n +0002170410 00000 n +0002170509 00000 n +0002170605 00000 n +0002168581 00000 n +0002137991 00000 n +0002167733 00000 n +0002167829 00000 n +0002167928 00000 n +0002168019 00000 n +0002168112 00000 n +0002142084 00000 n +0002123935 00000 n +0002137612 00000 n +0002137711 00000 n +0002137802 00000 n +0002137895 00000 n +0002125985 00000 n +0002095084 00000 n +0002123464 00000 n +0002123560 00000 n +0002123651 00000 n +0002123744 00000 n +0002123843 00000 n +0002098924 00000 n +0002060368 00000 n +0002092713 00000 n +0002092848 00000 n +0002092940 00000 n +0002093031 00000 n +0002093124 00000 n +0002064908 00000 n +0002033150 00000 n +0002059998 00000 n +0002060089 00000 n +0002060182 00000 n +0002060276 00000 n +0002036723 00000 n +0002005343 00000 n +0002032764 00000 n +0002032867 00000 n +0002032958 00000 n +0002033057 00000 n +0002009345 00000 n +0001979399 00000 n +0002004870 00000 n +0002004961 00000 n +0002005054 00000 n +0002005148 00000 n +0002005247 00000 n +0001983076 00000 n +0001947871 00000 n +0001979116 00000 n +0001979209 00000 n +0001979300 00000 n +0001952081 00000 n +0001912584 00000 n +0001947400 00000 n +0001947491 00000 n +0001947587 00000 n +0001947680 00000 n +0001947779 00000 n +0001916859 00000 n +0001888512 00000 n +0001912113 00000 n +0001912204 00000 n +0001912300 00000 n +0001912393 00000 n +0001912492 00000 n +0001891617 00000 n +0001861819 00000 n +0001888041 00000 n +0001888132 00000 n +0001888228 00000 n +0001888327 00000 n +0001888420 00000 n +0001865828 00000 n +0001832979 00000 n +0001861444 00000 n +0001861536 00000 n +0001861627 00000 n +0001861726 00000 n +0001836964 00000 n +0001806246 00000 n +0001832414 00000 n +0001832510 00000 n +0001832601 00000 n +0001832700 00000 n +0001832793 00000 n +0001832887 00000 n +0001809725 00000 n +0001782635 00000 n +0001805865 00000 n +0001805956 00000 n +0001806049 00000 n +0001806147 00000 n +0001786188 00000 n +0001762992 00000 n +0001782265 00000 n +0001782356 00000 n +0001782449 00000 n +0001782543 00000 n +0001765783 00000 n +0001736970 00000 n +0001762515 00000 n +0001762606 00000 n +0001762699 00000 n +0001762795 00000 n +0001762893 00000 n +0001740363 00000 n +0001709831 00000 n +0001736595 00000 n +0001736686 00000 n +0001736779 00000 n +0001736878 00000 n +0001713219 00000 n +0001688951 00000 n +0001709452 00000 n +0001709543 00000 n +0001709636 00000 n +0001709732 00000 n +0001691956 00000 n +0001665545 00000 n +0001688480 00000 n +0001688571 00000 n +0001688664 00000 n +0001688760 00000 n +0001688859 00000 n +0001668809 00000 n +0001641412 00000 n +0001665074 00000 n +0001665165 00000 n +0001665258 00000 n +0001665354 00000 n +0001665446 00000 n +0001644788 00000 n +0001620861 00000 n +0001640843 00000 n +0001640939 00000 n +0001641042 00000 n +0001641133 00000 n +0001641226 00000 n +0001641320 00000 n +0001623615 00000 n +0001608262 00000 n +0001620671 00000 n +0001620762 00000 n +0001609998 00000 n +0001580714 00000 n +0001607883 00000 n +0001607979 00000 n +0001608072 00000 n +0001608163 00000 n +0001584014 00000 n +0001546800 00000 n +0001580431 00000 n +0001580522 00000 n +0001580615 00000 n +0001550644 00000 n +0001510871 00000 n +0001546517 00000 n +0001546608 00000 n +0001546707 00000 n +0001514972 00000 n +0001483023 00000 n +0001510588 00000 n +0001510679 00000 n +0001510778 00000 n +0001486247 00000 n +0001447998 00000 n +0001482740 00000 n +0001482831 00000 n +0001482930 00000 n +0001452019 00000 n +0001414613 00000 n +0001447715 00000 n +0001447806 00000 n +0001447899 00000 n +0001418444 00000 n +0001387519 00000 n +0001414330 00000 n +0001414421 00000 n +0001414520 00000 n +0001390551 00000 n +0001354304 00000 n +0001387236 00000 n +0001387327 00000 n +0001387420 00000 n +0001358147 00000 n +0001322410 00000 n +0001354021 00000 n +0001354112 00000 n +0001354205 00000 n +0001326080 00000 n +0001306898 00000 n +0001322127 00000 n +0001322218 00000 n +0001322311 00000 n +0001308654 00000 n +0001297596 00000 n +0001306523 00000 n +0001306615 00000 n +0001306714 00000 n +0001306807 00000 n +0001298477 00000 n +0001231874 00000 n +0001295221 00000 n +0001295356 00000 n +0001295455 00000 n +0001295548 00000 n +0001295639 00000 n +0001238065 00000 n +0001182141 00000 n +0001229112 00000 n +0001229247 00000 n +0001229339 00000 n +0001229442 00000 n +0001229538 00000 n +0001229636 00000 n +0001229735 00000 n +0001229829 00000 n +0001229920 00000 n +0001188592 00000 n +0001123444 00000 n +0001179770 00000 n +0001179905 00000 n +0001180004 00000 n +0001180095 00000 n +0001180188 00000 n +0001129482 00000 n +0001083991 00000 n +0001120970 00000 n +0001121105 00000 n +0001121208 00000 n +0001121307 00000 n +0001121399 00000 n +0001121490 00000 n +0001088813 00000 n +0001015034 00000 n +0001081618 00000 n +0001081753 00000 n +0001081844 00000 n +0001081937 00000 n +0001082036 00000 n +0001021350 00000 n +0000969133 00000 n +0001012661 00000 n +0001012796 00000 n +0001012889 00000 n +0001012988 00000 n +0001013082 00000 n +0000974616 00000 n +0000921836 00000 n +0000966664 00000 n +0000966799 00000 n +0000966892 00000 n +0000966986 00000 n +0000967085 00000 n +0000967176 00000 n +0000927155 00000 n +0000868686 00000 n +0000919074 00000 n +0000919209 00000 n +0000919307 00000 n +0000919410 00000 n +0000919501 00000 n +0000919593 00000 n +0000919692 00000 n +0000919785 00000 n +0000919879 00000 n +0000874670 00000 n +0000827554 00000 n +0000868206 00000 n +0000868309 00000 n +0000868408 00000 n +0000868501 00000 n +0000868592 00000 n +0000832831 00000 n +0000784651 00000 n +0000827177 00000 n +0000827276 00000 n +0000827367 00000 n +0000827460 00000 n +0000790271 00000 n +0000742309 00000 n +0000782173 00000 n +0000782308 00000 n +0000782404 00000 n +0000782507 00000 n +0000782606 00000 n +0000782699 00000 n +0000748638 00000 n +0000709166 00000 n +0000742026 00000 n +0000742125 00000 n +0000742216 00000 n +0000712814 00000 n +0000669641 00000 n +0000708883 00000 n +0000708974 00000 n +0000709073 00000 n +0000674699 00000 n +0000608264 00000 n +0000667170 00000 n +0000667305 00000 n +0000667401 00000 n +0000667504 00000 n +0000667595 00000 n +0000667687 00000 n +0000613881 00000 n +0000548710 00000 n +0000605786 00000 n +0000605921 00000 n +0000606014 00000 n +0000606105 00000 n +0000606208 00000 n +0000606304 00000 n +0000555367 00000 n +0000498668 00000 n +0000546337 00000 n +0000546472 00000 n +0000546571 00000 n +0000546664 00000 n +0000546755 00000 n +0000505937 00000 n +0000447375 00000 n +0000496190 00000 n +0000496325 00000 n +0000496428 00000 n +0000496524 00000 n +0000496615 00000 n +0000496708 00000 n +0000454426 00000 n +0000383366 00000 n +0000447092 00000 n +0000447183 00000 n +0000447276 00000 n +0000388255 00000 n +0000337664 00000 n +0000380794 00000 n +0000380929 00000 n +0000381027 00000 n +0000381130 00000 n +0000381221 00000 n +0000381320 00000 n +0000381413 00000 n +0000343618 00000 n +0000286902 00000 n +0000335088 00000 n +0000335223 00000 n +0000335321 00000 n +0000335424 00000 n +0000335515 00000 n +0000335614 00000 n +0000335707 00000 n +0000293985 00000 n +0000263639 00000 n +0000284341 00000 n +0000284476 00000 n +0000284567 00000 n +0000284660 00000 n +0000284752 00000 n +0000284851 00000 n +0000284945 00000 n +0000264996 00000 n +0000263223 00000 n +0000263344 00000 n +0000262816 00000 n +0000262937 00000 n +0000262427 00000 n +0000262548 00000 n +0000262039 00000 n +0000262160 00000 n +0000238190 00000 n +0000259577 00000 n +0000259712 00000 n +0000259803 00000 n +0000259896 00000 n +0000259988 00000 n +0000260084 00000 n +0000241537 00000 n +0000191529 00000 n +0000235817 00000 n +0000235952 00000 n +0000236051 00000 n +0000236142 00000 n +0000236235 00000 n +0000197123 00000 n +0000167235 00000 n +0000189062 00000 n +0000189197 00000 n +0000189289 00000 n +0000189380 00000 n +0000189476 00000 n +0000189575 00000 n +0000170628 00000 n +0000119635 00000 n +0000163801 00000 n +0000163936 00000 n +0000164035 00000 n +0000164126 00000 n +0000164219 00000 n +0000125308 00000 n +0000166174 00000 n +0000164313 00000 n +0000166349 00000 n +0000166574 00000 n +0000189668 00000 n +0000236329 00000 n +0000260178 00000 n +0000285041 00000 n +0000335803 00000 n +0000381505 00000 n +0000496807 00000 n +0000546849 00000 n +0000606403 00000 n +0000667780 00000 n +0000782790 00000 n +0000919975 00000 n +0000967272 00000 n +0001013173 00000 n +0001082130 00000 n +0001121583 00000 n +0001180280 00000 n +0001230013 00000 n +0001295735 00000 n +0002093223 00000 n +0002435763 00000 n +0002852813 00000 n +0002936624 00000 n +0003232420 00000 n +0003258343 00000 n +0003429769 00000 n +0003604845 00000 n +0003734458 00000 n +0004381673 00000 n +0004872344 00000 n +0005112034 00000 n +0005554233 00000 n +0005996439 00000 n +0006446433 00000 n +0006492832 00000 n +0006619717 00000 n +0007649430 00000 n +0008097745 00000 n +0008337251 00000 n +0008989462 00000 n +0009088740 00000 n +0009477281 00000 n +0009558355 00000 n +0009605605 00000 n +0010156606 00000 n +0010628467 00000 n +trailer <]>> startxref 11416949 %%EOF \ No newline at end of file diff --git a/Doc/Z180 ASCI Baud Rate Options.pdf b/Doc/Z180 ASCI Baud Rate Options.pdf index 9e48d821..2c8fe24b 100644 Binary files a/Doc/Z180 ASCI Baud Rate Options.pdf and b/Doc/Z180 ASCI Baud Rate Options.pdf differ diff --git a/Doc/z80asm (SLR Systems).pdf b/Doc/z80asm (SLR Systems).pdf new file mode 100644 index 00000000..161ff66f Binary files /dev/null and b/Doc/z80asm (SLR Systems).pdf differ diff --git a/Makefile b/Makefile index 0f5dc20d..6bf9e4a4 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,14 @@ -all: +.PHONY: tools source clean clobber diff dist + +.ONESHELL: +.SHELLFLAGS = -cex + +all: tools source + +tools: $(MAKE) --directory Tools + +source: $(MAKE) --directory Source clean: @@ -14,6 +23,9 @@ diff: $(MAKE) --directory Source diff dist: - $(MAKE) ROM_PLATFORM=dist 2>&1 | tee make.log - $(MAKE) --directory Source clean + $(MAKE) ROM_PLATFORM=dist $(MAKE) --directory Tools clean + $(MAKE) --directory Source clean + +distlog: + $(MAKE) dist 2>&1 | tee make.log diff --git a/ReadMe.md b/ReadMe.md index 47ed488f..1fb0d5d1 100644 --- a/ReadMe.md +++ b/ReadMe.md @@ -1,9 +1,9 @@ **RomWBW ReadMe** \ -Version 3.2.1 \ +Version 3.4 \ Wayne Warthen ([wwarthen@gmail.com](mailto:wwarthen@gmail.com)) \ -07 Apr 2023 +30 Dec 2023 # Overview @@ -14,15 +14,24 @@ platforms are supported including those produced by these developer communities: - [RetroBrew Computers](https://www.retrobrewcomputers.org) -- [RC2014](https://rc2014.co.uk), + () +- [RC2014](https://rc2014.co.uk) (), [RC2014-Z80](https://groups.google.com/g/rc2014-z80) -- [retro-comp](https://groups.google.com/forum/#!forum/retro-comp) + () +- [Retro Computing](https://groups.google.com/g/retro-comp) + () - [Small Computer Central](https://smallcomputercentral.com/) + () + +A complete list of the currently supported platforms is found in the +\[Installation\] section. General features include: +- Z80 Family CPUs including Z80, Z180, and Z280 - Banked memory services for several banking designs -- Disk drivers for RAM, ROM, Floppy, IDE, CF, and SD +- Disk drivers for RAM, ROM, Floppy, IDE ATA/ATAPI, CF, SD, USB, Zip, + Iomega - Serial drivers including UART (16550-like), ASCI, ACIA, SIO - Video drivers including TMS9918, SY6545, MOS8563, HD6445 - Keyboard (PS/2) drivers via VT8242 or PPI interfaces @@ -42,11 +51,11 @@ ROM firmware itself: A dynamic disk drive letter assignment mechanism allows mapping operating system drive letters to any available disk media. -Additionally, mass storage devices (IDE Disk, CF Card, SD Card) support -the use of multiple slices (up to 256 per device). Each slice contains a -complete CP/M filesystem and can be mapped independently to any drive -letter. This overcomes the inherent size limitations in legacy OSes and -allows up to 2GB of accessible storage on a single device. +Additionally, mass storage devices (IDE Disk, CF Card, SD Card, etc.) +support the use of multiple slices (up to 256 per device). Each slice +contains a complete CP/M filesystem and can be mapped independently to +any drive letter. This overcomes the inherent size limitations in legacy +OSes and allows up to 2GB of accessible storage on a single device. The pre-built ROM firmware images are generally suitable for most users. However, it is also very easy to modify and build custom ROM images that @@ -66,7 +75,7 @@ changing media. By design, RomWBW isolates all of the hardware specific functions in the ROM chip itself. The ROM provides a hardware abstraction layer such that all of the operating systems and applications on a disk will run on any -RomWBW-based system. To put it simply, you can take a disk (or CF/SD +RomWBW-based system. To put it simply, you can take a disk (or CF/SD/USB Card) and move it between systems transparently. A tool is provided that allows you to access a FAT-12/16/32 filesystem. @@ -76,18 +85,19 @@ OSes such as Windows, MacOS, and Linux very easy. # Acquiring RomWBW -The [RomWBW Repository](https://github.com/wwarthen/RomWBW) on GitHub is -the official distribution location for all project source and -documentation. The fully-built distribution releases are available on -the [RomWBW Releases Page](https://github.com/wwarthen/RomWBW/releases) -of the repository. On this page, you will normally see a Development -Snapshot as well as recent stable releases. Unless you have a specific -reason, I suggest you stick to the most recent stable release. Expand -the “Assets” drop-down for the release you want to download, then select -the asset named RomWBW-vX.X.X-Package.zip. The Package asset includes -all pre-built ROM and Disk images as well as full source code. The other -assets contain only source code and do not have the pre-built ROM or -disk images. +The [RomWBW Repository](https://github.com/wwarthen/RomWBW) +() on GitHub is the official +distribution location for all project source and documentation. The +fully-built distribution releases are available on the [RomWBW Releases +Page](https://github.com/wwarthen/RomWBW/releases) +() of the repository. On +this page, you will normally see a Development Snapshot as well as +recent stable releases. Unless you have a specific reason, I suggest you +stick to the most recent stable release. Expand the “Assets” drop-down +for the release you want to download, then select the asset named +RomWBW-vX.X.X-Package.zip. The Package asset includes all pre-built ROM +and Disk images as well as full source code. The other assets contain +only source code and do not have the pre-built ROM or disk images. All source code and distributions are maintained on GitHub. Code contributions are very welcome. @@ -183,6 +193,36 @@ let me know if I missed you! - The RomWBW Disk Catalog document was produced by Mykl Orders. +- Rob Prouse has created many of the supplemental disk images including + Aztec C, HiTech C, SLR Z80ASM, Turbo Pascal, Microsoft BASIC Compiler, + Microsoft Fortran Compiler, and a Games compendium. + +- Martin R has provided substantial help reviewing and improving the + User Guide. + +- Jacques Pelletier has contributed the DS1501 RTC driver code. + +- Jose Collado has contributed enhancements to the TMS driver including + compatibility with standard TMS register configuration. + +- Kevin Boone has contributed a generic HBIOS date/time utility (WDATE). + +- Matt Carroll has contributed a fix to XM.COM that corrects the port + specification when doing a send. + +- Dean Jenkins enhanced the build process to accommodate the Raspberry + Pi 4. + +- Tom Plano has contributed a new utility (HTALK) to allow talking + directly to HBIOS COM ports. + +- Lars Nelson has contributed several generic utilities such as a + universal (OS agnostic) UNARC application. + +- Dylan Hall added support for specifying a secondary console. + +- Bill Shen has contributed boot loaders for several of his systems. + Contributions of all kinds to RomWBW are very welcome. # Licensing diff --git a/ReadMe.txt b/ReadMe.txt index 0ecab61b..44ee9dee 100644 --- a/ReadMe.txt +++ b/ReadMe.txt @@ -1,6 +1,6 @@ RomWBW ReadMe Wayne Warthen (wwarthen@gmail.com) -07 Apr 2023 +30 Dec 2023 @@ -13,15 +13,21 @@ Z80/180/280 retro-computing hardware systems. A wide variety of platforms are supported including those produced by these developer communities: -- RetroBrew Computers -- RC2014, RC2014-Z80 -- retro-comp -- Small Computer Central +- RetroBrew Computers (https://www.retrobrewcomputers.org) +- RC2014 (https://rc2014.co.uk), + RC2014-Z80 (https://groups.google.com/g/rc2014-z80) +- Retro Computing (https://groups.google.com/g/retro-comp) +- Small Computer Central (https://smallcomputercentral.com/) + +A complete list of the currently supported platforms is found in the +[Installation] section. General features include: +- Z80 Family CPUs including Z80, Z180, and Z280 - Banked memory services for several banking designs -- Disk drivers for RAM, ROM, Floppy, IDE, CF, and SD +- Disk drivers for RAM, ROM, Floppy, IDE ATA/ATAPI, CF, SD, USB, Zip, + Iomega - Serial drivers including UART (16550-like), ASCI, ACIA, SIO - Video drivers including TMS9918, SY6545, MOS8563, HD6445 - Keyboard (PS/2) drivers via VT8242 or PPI interfaces @@ -41,11 +47,11 @@ ROM firmware itself: A dynamic disk drive letter assignment mechanism allows mapping operating system drive letters to any available disk media. -Additionally, mass storage devices (IDE Disk, CF Card, SD Card) support -the use of multiple slices (up to 256 per device). Each slice contains a -complete CP/M filesystem and can be mapped independently to any drive -letter. This overcomes the inherent size limitations in legacy OSes and -allows up to 2GB of accessible storage on a single device. +Additionally, mass storage devices (IDE Disk, CF Card, SD Card, etc.) +support the use of multiple slices (up to 256 per device). Each slice +contains a complete CP/M filesystem and can be mapped independently to +any drive letter. This overcomes the inherent size limitations in legacy +OSes and allows up to 2GB of accessible storage on a single device. The pre-built ROM firmware images are generally suitable for most users. However, it is also very easy to modify and build custom ROM images that @@ -65,7 +71,7 @@ changing media. By design, RomWBW isolates all of the hardware specific functions in the ROM chip itself. The ROM provides a hardware abstraction layer such that all of the operating systems and applications on a disk will run on any -RomWBW-based system. To put it simply, you can take a disk (or CF/SD +RomWBW-based system. To put it simply, you can take a disk (or CF/SD/USB Card) and move it between systems transparently. A tool is provided that allows you to access a FAT-12/16/32 filesystem. @@ -78,16 +84,18 @@ OSes such as Windows, MacOS, and Linux very easy. ACQUIRING ROMWBW -The RomWBW Repository on GitHub is the official distribution location -for all project source and documentation. The fully-built distribution -releases are available on the RomWBW Releases Page of the repository. On -this page, you will normally see a Development Snapshot as well as -recent stable releases. Unless you have a specific reason, I suggest you -stick to the most recent stable release. Expand the “Assets” drop-down -for the release you want to download, then select the asset named -RomWBW-vX.X.X-Package.zip. The Package asset includes all pre-built ROM -and Disk images as well as full source code. The other assets contain -only source code and do not have the pre-built ROM or disk images. +The RomWBW Repository (https://github.com/wwarthen/RomWBW) on GitHub is +the official distribution location for all project source and +documentation. The fully-built distribution releases are available on +the RomWBW Releases Page (https://github.com/wwarthen/RomWBW/releases) +of the repository. On this page, you will normally see a Development +Snapshot as well as recent stable releases. Unless you have a specific +reason, I suggest you stick to the most recent stable release. Expand +the “Assets” drop-down for the release you want to download, then select +the asset named RomWBW-vX.X.X-Package.zip. The Package asset includes +all pre-built ROM and Disk images as well as full source code. The other +assets contain only source code and do not have the pre-built ROM or +disk images. All source code and distributions are maintained on GitHub. Code contributions are very welcome. @@ -185,6 +193,37 @@ let me know if I missed you! - The RomWBW Disk Catalog document was produced by Mykl Orders. +- Rob Prouse has created many of the supplemental disk images + including Aztec C, HiTech C, SLR Z80ASM, Turbo Pascal, Microsoft + BASIC Compiler, Microsoft Fortran Compiler, and a Games compendium. + +- Martin R has provided substantial help reviewing and improving the + User Guide. + +- Jacques Pelletier has contributed the DS1501 RTC driver code. + +- Jose Collado has contributed enhancements to the TMS driver + including compatibility with standard TMS register configuration. + +- Kevin Boone has contributed a generic HBIOS date/time utility + (WDATE). + +- Matt Carroll has contributed a fix to XM.COM that corrects the port + specification when doing a send. + +- Dean Jenkins enhanced the build process to accommodate the Raspberry + Pi 4. + +- Tom Plano has contributed a new utility (HTALK) to allow talking + directly to HBIOS COM ports. + +- Lars Nelson has contributed several generic utilities such as a + universal (OS agnostic) UNARC application. + +- Dylan Hall added support for specifying a secondary console. + +- Bill Shen has contributed boot loaders for several of his systems. + Contributions of all kinds to RomWBW are very welcome. diff --git a/Source/Apps/Build.cmd b/Source/Apps/Build.cmd index 1396ca29..0776541e 100644 --- a/Source/Apps/Build.cmd +++ b/Source/Apps/Build.cmd @@ -1,13 +1,10 @@ @echo off setlocal -set TOOLS=../../Tools +set TOOLS=..\..\Tools set APPBIN=..\..\Binary\Apps - set PATH=%TOOLS%\tasm32;%TOOLS%\zxcc;%PATH% - set TASMTABS=%TOOLS%\tasm32 - set CPMDIR80=%TOOLS%/cpm/ call :asm syscopy || exit /b @@ -32,6 +29,7 @@ pushd Dev && call Build || exit /b & popd pushd VGM && call Build || exit /b & popd pushd cpuspd && call Build || exit /b & popd pushd Survey && call Build || exit /b & popd +pushd HTalk && call Build || exit /b & popd copy *.com %APPBIN%\ || exit /b diff --git a/Source/Apps/Clean.cmd b/Source/Apps/Clean.cmd index e60ceb53..06057f1f 100644 --- a/Source/Apps/Clean.cmd +++ b/Source/Apps/Clean.cmd @@ -18,3 +18,4 @@ pushd Dev && call Clean || exit /b 1 & popd pushd VGM && call Clean || exit /b 1 & popd pushd cpuspd && call Clean || exit /b 1 & popd pushd Survey && call Clean || exit /b 1 & popd +pushd HTalk && call Clean || exit /b 1 & popd diff --git a/Source/Apps/FAT/ReadMe.txt b/Source/Apps/FAT/ReadMe.txt index 02f84de3..916b2ffd 100644 --- a/Source/Apps/FAT/ReadMe.txt +++ b/Source/Apps/FAT/ReadMe.txt @@ -1,7 +1,7 @@ RomWBW HBIOS CP/M FAT Utility ("FAT.COM") Author: Wayne Warthen -Updated: 12-Apr-2021 +Updated: 12-Oct-2023 Application to manipulate and exchange files with a FAT (DOS) filesystem. Runs on any HBIOS hosted CP/M implementation. @@ -101,4 +101,5 @@ HISTORY: 11-Oct-2019: v0.9.7 (beta) fix FORMAT to use existing partition table entries add attributes to directory listing 12-Apr-2021: v0.9.8 (beta) support CP/NET drives + 12-Oct-2023: v0.9.9 (beta) handle updated HBIOS Disk Device call diff --git a/Source/Apps/FAT/fat.com b/Source/Apps/FAT/fat.com index 688faa99..b1b50ee9 100644 Binary files a/Source/Apps/FAT/fat.com and b/Source/Apps/FAT/fat.com differ diff --git a/Source/Apps/FDU/fdu.asm b/Source/Apps/FDU/fdu.asm index 4a68735e..82e89aac 100644 --- a/Source/Apps/FDU/fdu.asm +++ b/Source/Apps/FDU/fdu.asm @@ -48,7 +48,8 @@ ; 2020-04-29: v5.5 ADDED SUPPORT FOR ETCHED PIXELS FDC ; 2020-12-12: v5.6 UPDATED SMALLZ80 TO NEW I/O ADDRESSES ; 2021-03-24: v5.7 ADDED SOME SINGLE-SIDED FORMATS -; 2021-07-26: v5.8 ADDED SUPPORT MBC FDC +; 2021-07-26: v5.8 ADDED SUPPORT FOR NHYODYNE (MBC) FDC +; 2023-12-10: v5.9 ADDED SUPPORT FOR DUODYNE (DUO) FDC ; ;_______________________________________________________________________________ ; @@ -85,6 +86,7 @@ FDC_SMZ80 .EQU 8 FDC_DYNO .EQU 9 FDC_EPFDC .EQU 10 FDC_MBC .EQU 11 +FDC_DUO .EQU 12 ; ; FDC MODE ; @@ -219,8 +221,8 @@ INIT5: XOR A RET -STR_BANNER .DB "Floppy Disk Utility (FDU) v5.8, 26-Jul-2021$" -STR_BANNER2 .DB "Copyright (C) 2021, Wayne Warthen, GNU GPL v3","$" +STR_BANNER .DB "Floppy Disk Utility (FDU) v5.9, 10-Dec-2023$" +STR_BANNER2 .DB "Copyright (C) 2023, Wayne Warthen, GNU GPL v3","$" STR_HBIOS .DB " [HBIOS]$" STR_UBIOS .DB " [UBIOS]$" ; @@ -292,6 +294,7 @@ FDCTBL: ; LABEL CONFIG DATA .DW STR_DYNO, CFG_DYNO .DW STR_EPFDC, CFG_EPFDC .DW STR_MBC, CFG_MBC + .DW STR_DUO, CFG_DUO FDCCNT .EQU ($-FDCTBL)/4 ; FD CONTROLLER COUNT ; ; FDC LABEL STRINGS @@ -307,7 +310,8 @@ STR_RCWDC .TEXT "RC-WDC$" STR_SMZ80 .TEXT "SMZ80$" STR_DYNO .TEXT "DYNO$" STR_EPFDC .TEXT "EPFDC$" -STR_MBC .TEXT "MBC$" +STR_MBC .TEXT "NHYODYNE$" +STR_DUO .TEXT "DUODYNE$" ; ; FDC CONFIGURATION BLOCKS ; @@ -448,7 +452,18 @@ CFG_MBC: .DB 035H ; CONFIGURATION CONTROL REGISTER .DB 036H ; DACK (WHEN READ) .DB 037H ; TERMINAL COUNT (W/ DACK) - .DB 0FFH ; NOT USED BY ZETA SBC V2 + .DB 0FFH ; NOT USED + .DB _PCAT ; MODE= +; +CFG_DUO: + .DB 080H ; FDC MAIN STATUS REGISTER + .DB 081H ; FDC DATA PORT + .DB 0FFH ; DATA INPUT REGISTER + .DB 086H ; DIGITAL OUTPUT REGISTER (WHEN WRITTEN) + .DB 085H ; CONFIGURATION CONTROL REGISTER + .DB 086H ; DACK (WHEN READ) + .DB 087H ; TERMINAL COUNT (W/ DACK) + .DB 0FFH ; NOT USED .DB _PCAT ; MODE= ; FDCID .DB 0 ; FDC IDENTIFIER (0 INDEXED) @@ -470,7 +485,8 @@ FSS_MENU: .TEXT " (I) SmallZ80 Expansion\r\n" .TEXT " (J) Dyno-Card FDC, D1030\r\n" .TEXT " (K) RCBus EPFDC\r\n" - .TEXT " (L) Multi-Board Computer FDC\r\n" + .TEXT " (L) Nhyodyne FDC\r\n" + .TEXT " (M) Duodyne FDC\r\n" .TEXT " (X) Exit\r\n" .TEXT "=== OPTION ===> $\r\n" ; @@ -1561,6 +1577,7 @@ MD_MAP: .DB %00000001 ; DYNO POLL .DB %00000001 ; EPFDC POLL .DB %00000001 ; MBC POLL + .DB %00000001 ; DUO POLL ; ; MEDIA DESCRIPTION BLOCK ; @@ -2021,7 +2038,7 @@ FM_DRAW0B: ; ZETA, DIO3 LD A,(FST_DOR) AND 00000010B JR FM_DRAW1 -FM_DRAW0C: ; DIDE, N8, ZETA2, RCWDC, SMZ80, DYNO, EPFDC, MBC +FM_DRAW0C: ; DIDE, N8, ZETA2, RCWDC, SMZ80, DYNO, EPFDC, MBC, DUO LD A,(FST_DOR) AND 11110000B JR FM_DRAW1 @@ -2174,7 +2191,7 @@ FM_MOTOR0B: ; ZETA, DIO3 LD A,(FST_DOR) AND 00000010B JR FM_MOTOR1 -FM_MOTOR0C: ; DIDE, N8, ZETA2, RCWDC, SMZ80, DYNO, EPFDC, MBC +FM_MOTOR0C: ; DIDE, N8, ZETA2, RCWDC, SMZ80, DYNO, EPFDC, MBC, DUO LD A,(FST_DOR) AND 11110000B JR FM_MOTOR1 @@ -2913,7 +2930,7 @@ FC_INIT1: ; DIO FC_INIT2: ; ZETA, DIO3 LD A,(FCD_DORB) JR FC_INIT5 -FC_INIT3: ; DIDE, N8, ZETA2, RCWDC, SMZ80, DYNO, EPFDC, MBC +FC_INIT3: ; DIDE, N8, ZETA2, RCWDC, SMZ80, DYNO, EPFDC, MBC, DUO LD A,(FCD_DORC) JR FC_INIT5 FC_INIT4: ; WDSMC @@ -2957,7 +2974,7 @@ FC_RESETFDC1: ; ZETA, DIO3, RCSMC POP AF OUT (C),A JR FC_RESETFDC3 -FC_RESETFDC2: ; DIDE, N8, ZETA2, RCWDC, SMZ80, DYNO, EPFDC, MBC +FC_RESETFDC2: ; DIDE, N8, ZETA2, RCWDC, SMZ80, DYNO, EPFDC, MBC, DUO LD A,0 OUT (C),A LD A,(FST_DOR) @@ -2984,7 +3001,7 @@ FC_PULSETC: ;RES 0,A ;OUT (C),A ;JR FC_PULSETC2 -;FC_PULSETC1: ; DIDE, N8, ZETA2, RCWDC, SMZ80, DYNO, EPFDC, MBC +;FC_PULSETC1: ; DIDE, N8, ZETA2, RCWDC, SMZ80, DYNO, EPFDC, MBC, DUO ;LD C,(IY+CFG_TC) ;IN A,(C) ;JR FC_PULSETC2 @@ -3016,7 +3033,7 @@ FC_MOTORON2: ; ZETA, DIO3 LD HL,FST_DOR ; POINT TO FDC_DOR SET 1,(HL) JR FC_MOTORON5 -FC_MOTORON3: ; DIDE, N8, ZETA2, RCWDC, SMZ80, DYNO, EPFDC, MBC +FC_MOTORON3: ; DIDE, N8, ZETA2, RCWDC, SMZ80, DYNO, EPFDC, MBC, DUO LD HL,FST_DOR ; POINT TO FDC_DOR LD A,(HL) ; START WITH CURRENT DOR AND 11111100B ; GET RID OF ANY ACTIVE DS BITS @@ -3080,7 +3097,7 @@ FC_MOTOROFF2: ; ZETA, DIO3 LD HL,FST_DOR ; POINT TO FDC_DOR RES 1,(HL) JR FC_MOTOROFF5 -FC_MOTOROFF3: ; DIDE, N8, ZETA2, RCWDC, SMZ80, DYNO, EPFDC, MBC +FC_MOTOROFF3: ; DIDE, N8, ZETA2, RCWDC, SMZ80, DYNO, EPFDC, MBC, DUO LD HL,FST_DOR ; POINT TO FDC_DOR LD A,DORC_INIT LD (HL),A @@ -3950,7 +3967,7 @@ DORB_BR500 .EQU 10100000B ; 500KBPS ; DORB_INIT .EQU DORB_BR250 ; -; *** DIDE/N8/ZETA2/RCWDC/SMZ80/DYNO/EPFDC/MBC *** +; *** DIDE/N8/ZETA2/RCWDC/SMZ80/DYNO/EPFDC/MBC/DUO *** ; DORC_INIT .EQU 00001100B ; SOFT RESET INACTIVE, DMA ENABLED ; diff --git a/Source/Apps/FDU/fdu.doc b/Source/Apps/FDU/fdu.doc index 13c14708..e80b9a8f 100644 --- a/Source/Apps/FDU/fdu.doc +++ b/Source/Apps/FDU/fdu.doc @@ -1,14 +1,15 @@ ================================================================ -Floppy Disk Utility (FDU) v5.3 for RetroBrew Computers -Disk IO / Zeta / Dual-IDE / N8 / RCBus / SmallZ80 / Dyno +Floppy Disk Utility (FDU) v5.9 for RetroBrew Computers +Disk IO / Zeta / Dual-IDE / N8 / RCBus / SmallZ80 / Dyno / Nhyodyne / Duodyne ================================================================ -Updated January 5, 2020 +Updated December 12, 2023 by Wayne Warthen (wwarthen@gmail.com) Application to test the hardware functionality of the Floppy Disk Controller (FDC) on the ECB DISK I/O, DISK I/O V3, ZETA -SBC, Dual IDE w/ Floppy, or N8 board. +SBC, Dual IDE w/ Floppy, N8, RCBus, SmallZ80, Dyno, Nhyodyne, +Duodyne systems. The intent is to provide a testbed that allows direct testing of all possible media types and modes of access. The @@ -77,9 +78,10 @@ supported: - RCBus - SmallZ80 - Dyno - - MBC + - Nhyodyne (MBC) + - Duodyne (DUO) -You must be using either a RomWBW or UBA based OS version. +You must be using either a RomWBW or UNA based OS version. You must have one of the following floppy disk controllers: @@ -93,7 +95,8 @@ You must have one of the following floppy disk controllers: - RCBus Scott Baker WDC-based Floppy Module - SmallZ80 FDC - Dyno FDC - - MBC FDC + - Nhyodyne (MBC) FDC + - Duodyne (DUO) FDC Finally, you will need a floppy drive connected via an appropriate cable: @@ -153,7 +156,8 @@ JP2 (/FAULT) shorted, JP3 (MINI): 2-3, JP4 (/DC/RDY): 2-3. The RCBus Scott Baker WDC-based floppy module should be jumpered for I/O base address 0x50 (SV1: 11-12), JP1 (/DACK): 1-2, -JP2 (TC): 2-3. +JP2 (TC): 2-3. Note that pin 1 of JPX jumpers is toward the bottom +of the board. The RCBus FDC by Alan Cox (Etched Pixels) needs to be strapped for base I/O address 0x48. @@ -164,8 +168,11 @@ hardwired I/O ranges are assumed in the code. Dyno does not have any relevant jumper settings. The hardwired I/O ranges are assumed in the code. -The MBC FDC is expected to be strapped to use neither INT nor NMI. It -is also not expected to use DMA. +The Nhyodyne (MBC) FDC is expected to be strapped to use neither INT +nor NMI. It is also not expected to use DMA. + +The Duodyne (DUO) FDC is expected to be strapped to use neither INT +nor NMI. It is also not expected to use DMA. Modes of Operation ------------------ @@ -532,4 +539,7 @@ WW 3/24/2021: v5.7 - Added support for a few single-sided formats WW 7/26/2021: v5.8 - - Added support for MBC FDC + - Added support for Nhyodyne (MBC) FDC + +WW 12/10/2023: v5.9 + - Added support for Duodyne (DUO) FDC diff --git a/Source/Apps/HTalk/Build.cmd b/Source/Apps/HTalk/Build.cmd new file mode 100644 index 00000000..8bb84332 --- /dev/null +++ b/Source/Apps/HTalk/Build.cmd @@ -0,0 +1,14 @@ +@echo off +setlocal + +set TOOLS=../../../Tools +set PATH=%TOOLS%\tasm32;%PATH% +set TASMTABS=%TOOLS%\tasm32 + +echo Building HTalk... +tasm -t80 -g3 -fFF htalk.asm htalk.com %htalk.lst || exit /b + +copy /Y htalk.com ..\..\..\Binary\Apps\ || exit /b +rem copy /Y *.ovr ..\..\..\Binary\Apps\ || exit /b +rem copy /Y *.hlp ..\..\..\Binary\Apps\ || exit /b +rem copy /Y *.doc ..\..\..\Binary\Apps\ || exit /b diff --git a/Source/Apps/HTalk/Clean.cmd b/Source/Apps/HTalk/Clean.cmd new file mode 100644 index 00000000..07f1d4c3 --- /dev/null +++ b/Source/Apps/HTalk/Clean.cmd @@ -0,0 +1,5 @@ +@echo off +setlocal + +if exist *.com del *.com +if exist *.lst del *.lst diff --git a/Source/Apps/HTalk/Makefile b/Source/Apps/HTalk/Makefile new file mode 100644 index 00000000..e126cbb5 --- /dev/null +++ b/Source/Apps/HTalk/Makefile @@ -0,0 +1,10 @@ +OBJECTS = htalk.com +#DOCS = htalk.txt +DEST = ../../../Binary/Apps +DOCDEST = ../../../Binary/Apps +TOOLS = ../../../Tools +include $(TOOLS)/Makefile.inc + +%.com: USETASM=1 + + diff --git a/Source/Apps/HTalk/htalk.asm b/Source/Apps/HTalk/htalk.asm new file mode 100644 index 00000000..4ee7720e --- /dev/null +++ b/Source/Apps/HTalk/htalk.asm @@ -0,0 +1,725 @@ +;=============================================================================== +;HTALK - BARE MINIMUM TERMINAL INTERFACE +; +; CONSOLE TALKS TO ARBITRARY CHARACTER DEVICE. +;=============================================================================== +; +; AUTHOR: TOM PLANO (TOMPLANO@PROTON.ME) +; +; USAGE: +; HTALK $ +; +;_______________________________________________________________________________ +; +; CHANGE LOG: +; I'VE NOTATED SECTIONS OF CODE THAT ARNT REQUIRED IF THIS APP IS +; INCORPORATED INTO DBGMOD WITH A TAG +; +;_______________________________________________________________________________ +; +; TODO: +; SEE ENUM_DEV1 TODO +; +; +;_______________________________________________________________________________ +; +;=============================================================================== +; DEFINITIONS +;=============================================================================== +; +STKSIZ .EQU $FF +; +; HBIOS SYSTEM CALLS AND ID STRING ADDRESS +; +ROMWBW_ID .EQU $FFFE ; ROMWBW ID STRING ADDRESS +HBIOS_SYS .EQU $FFF0 ; HBIOS SYSCALL ADDRESS + +H_SYSGET .EQU $F8 ; GET SYSTEM INFO +H_CIOCNT .EQU $00 ; GET CHAR DEV COUNT SUBFUNCTION + +BF_CIOIN .EQU $00 ; HBIOS CHAR INPUT +BF_CIOOUT .EQU $01 ; HBIOS CHAR OUTPUT +BF_CIOIST .EQU $02 ; HBIOS CHAR INPUT STATUS +BF_CIOOST .EQU $03 ; HBIOS CHAR OUTPUT STATUS +BF_CIOINIT .EQU $04 ; HBIOS CHAR I/O INIT +BF_CIOQUERY .EQU $05 ; HBIOS CHAR I/O QUERY +BF_CIODEVICE .EQU $06 ; HBIOS CHAR I/O DEVICE +; +; SUPPORTED HBIOS CIO DEVICE TYPES +; +CIODEV_UART .EQU $00 ; 16C550 FAMILY SERIAL INTERFACE UART.ASM +CIODEV_ASCI .EQU $10 ; Z180 BUILT-IN SERIAL PORTS ASCI.ASM +CIODEV_TERM .EQU $20 ; TERMINAL ANSI.ASM +CIODEV_PRPCON .EQU $30 ; PROPIO SERIAL CONSOLE INTERFACE PRP.ASM +CIODEV_PPPCON .EQU $40 ; PARPORTPROP SERIAL CONSOLE INTERFACE PPP.ASM +CIODEV_SIO .EQU $50 ; ZILOG SERIAL PORT INTERFACE SIO.ASM +CIODEV_ACIA .EQU $60 ; MC68B50 ASYNCHRONOUS INTERFACE ACIA.ASM +CIODEV_PIO .EQU $70 ; ZILOG PARALLEL INTERFACE CONTROLLER PIO.ASM +CIODEV_UF .EQU $80 ; FT232H-BASED ECB USB FIFO UF.ASM +CIODEV_DUART .EQU $90 ; SCC2681 FAMILY DUAL UART DUART.ASM +CIODEV_Z2U .EQU $A0 ; ZILOG Z280 BUILT-IN SERIAL PORTS Z2U.ASM +CIODEV_LPT .EQU $B0 ; PARALLEL I/O CONTROLLER LPT.ASM + +; HBIOS CURRENT CONSOLE NUMBER +CIO_CONSOLE .EQU $80 + +; SPECIAL CHARS +CTRLC .EQU $03 +CHR_BEL .EQU $07 +CHR_CR .EQU $0D +CHR_LF .EQU $0A +CHR_BS .EQU $08 +CHR_ESC .EQU $1B +CHR_DEL .EQU $7F + +; +;=============================================================================== +; BEGIN MAIN PROGRAM +;=============================================================================== +; + .ORG $0100 +; +; SETUP STACK (SAVE OLD VALUE) +; HANDLED BY DBGMON + LD (STKSAV),SP + LD SP,STACK + + +; +; INITIALIZATION + STARTUP MESSAGE + HBIOS DETECT +; HANDLED BY DBGMON + CALL INIT_PROG + JP NZ,EXIT +; +; LIST HBIOS DEV OPTIONS FOR REFERENCE +; ALSO GETS MAX CONN +; +; THIS IS OPTIONAL BECAUSE IF A CHAR DEVICE DOESNT EXIST, WE NEVER READ OR +; WRITE TO IT, WE SIMPLY CALL CIOIST AND CIOOST OVER AND OVER ON IT, WITHOUT +; EVER PUSHING DATA TO IT + CALL ENUM_DEV + JP NZ,EXIT +; +; PARSE COMMAND LINE +; + CALL PARSE + JP NZ,EXIT +; +; RUN CONVERSTION WITH CHAR DEVICE +; + CALL TALK +; +; DONE + JP EXIT + + +; +; CLEAN UP AND RETURN TO CALLING PROCESS +; +EXIT: + CALL NEWLINE ; ... + LD HL,STR_EXITMSG ; LOAD EXIT STRING + CALL PRTSTR ; PRINT IT + CALL NEWLINE ; ... + LD SP,(STKSAV) ; RESET STACK + RET ; RETURN TO CALLER + + +; +;=============================================================================== +; END MAIN PROGRAM +;=============================================================================== +; + +; +;=============================================================================== +; BEGIN MAIN PROGRAM SUBROUTINES +;=============================================================================== +; + +INIT_PROG: + LD HL, STR_BANNER ; LOAD WELCOME BANNER + CALL PRTSTR ; PRINT IT + CALL NEWLINE ; ... + LD HL,(ROMWBW_ID) ; GET FIRST BYTE OF ROMWBW MARKER + LD A,(HL) ; ... THROUGH HL + CP 'W' ; MATCH? + JP NZ,NOTHBIOS ; ABORT WITH INVALID CONFIG BLOCK + INC HL ; NEXT BYTE (MARKER BYTE 2) + LD A,(HL) ; LOAD IT + CP ~'W' ; MATCH? + JP NZ,NOTHBIOS ; ABORT WITH INVALID CONFIG BLOCK + LD HL,STR_HBIOS ; POINT TO HBIOS STR + CALL PRTSTR ; PRINT IT + CALL NEWLINE ; ... + RET +; +; HBOIS NOT DETECTED, BAIL OUT W/ ERROR +; +NOTHBIOS: + LD HL,STR_BIOERR ; LOAD HBIOS NOT FOUND STR + CALL PRTSTR ; PRINT IT + CALL NEWLINE ; ... + AND $FF ; SET FLAGS + RET + +ENUM_DEV: +; +; CHAR COUNT HEADER +; + LD HL,STR_DEVS_FOUND + CALL PRTSTR +; +;GET COUNT OF CHAR UNITS +; + LD B,H_SYSGET ; LOAD SYSGET HBIOS FUNCTION + LD C,H_CIOCNT ; LOAD SYSGET CHAR DEV COUNT SUBFUNCTION + CALL HBIOS_SYS ; JUMP TO HBIOS + OR A ; SET FLAGS + JP NZ, EXIT ; JUMP TO EXIT ON FAILED + LD A,E ; NUM CHAR DEVICES NOW IN A + + DEC A ; DEC NUM DEVICES TO BE 0 INDEXED + LD (CIODEV_CNT), A ; STORE BEFORE PRINT + LD (CIODEV_MAX), A ; STORE BEFORE PRINT + INC A ; RESTORE NUM DEVICES VALUE + + CALL PRTHEX ; PRINT NUMBER OF UNITS FOUND + CALL NEWLINE ; ... + +ENUM_DEV1: + + LD IX, TGT_DEV +; TODO: H AND L DONT ALWAYS GET SET BY THE DRIVERS. FIND SOME WAY TO MASK +; THEM OUT IF THEY ARE THE SAME BEFORE AND AFTER THE CALL? + LD B, BF_CIODEVICE ; LOAD HBIOS FUNCTION TO QUERRY DEVICE INFO + LD HL, CIODEV_CNT ; REQUEST A CHAR DEVICE + LD C, (HL) ; ... + LD (IX), C ; REMEMBER WHAT DEVICE WE ASKED FOR BEFORE BE + CALL HBIOS_SYS ; EXECUTE HBIOS SUBROUTINE + OR A ; SET FLAGS + RET NZ ; RETURN FAILED +; +; STORE RESULTS OF HBOIS DEVICE QUERRY +; + LD A,C ; MOVE C TO A + LD (IX+1), A ; STORE A DEVICE ATTRIBUTES, SKIP FIRST ENTRY + LD A,D + LD (IX+2), A + LD A,E + LD (IX+3), A + LD A,H + LD (IX+4), A + LD A,L + LD (IX+5), A +; +; PRINT FORMATED DATA LOOP +; + LD B, $06 ; PRINT THE 5 ELEMENTS OF DEV_STR_TBL + LD HL,DEV_STR_TBL ; TABLE BASE PTR + +PLOOP_BASE: + CALL PRTSTR ; PTRSTR INCREMENTS HL FOR US + LD A, (IX) + CALL PRTHEX + LD A, '|' + CALL COUT + INC IX + DJNZ PLOOP_BASE + + CALL NEWLINE + + LD A, (CIODEV_CNT) + DEC A + LD (CIODEV_CNT), A + JP P, ENUM_DEV1 ; JUMP WHILE CIODEV_CNT >=0 + AND $00 + RET + + +; +; RUN CONVERSTION WITH CHAR DEVICE +; +TALK: +; +; INIT PING PONG DEVICE POINTERS +; + LD IX, USER_CON ; LOAD VALUE AT ADDR USER_CON + LD A, (IX) ; LOAD VALUE AT ADDR USER_CON + LD (RF_DEV), A ; STORE TO ADDR RF_DEV + LD A, (IX+1) ; LOAD VALUE AT ADDR TARGET_CON + LD (WT_DEV), A ; STORE TO ADDR WT_DEV +; +; READ FROM RF_DEV -> WRITE TO WT_DEV +; +TALK_LOOP: +; +; CHECK FOR DATA ON RF_DEV +; + LD B,BF_CIOIST ; SET HBIOS FUNCTION TO RUN + LD HL, RF_DEV + LD C,(HL) + CALL HBIOS_SYS ; CHECK FOR CHAR PENDING ON INPUT BUFFER USING HBIOS + OR A ; SET FLAGS + JP Z,TALK_NEXT ; JUMP NO CHARACTERS READY + JP M,TALK_NEXT ; JUMP ERROR ON READ +; +; EXEC READ FROM RF_DEV +; + LD B,BF_CIOIN ; SET FUNCTION TO RUN + LD HL, RF_DEV + LD C,(HL) ; RETRIEVE CON_DEV_NUM TO READ/WRITE FROM ACTIVE CONSOLE + CALL HBIOS_SYS ; CHECK FOR CHAR PENDING USING HBIOS + LD A,E ; MOVE RESULT TO A + CP CTRLC ; CHECK FOR EXIT REQUEST (CTRL+C) + RET Z ; IF SO, BAIL OUT + PUSH AF ; SAVE THE CHAR WE READ +; +; CHECK FOR SPACE ON WT_DEV +; + LD B,BF_CIOOST ; SET HBIOS FUNCTION TO RUN + LD HL, WT_DEV + LD C,(HL) + CALL HBIOS_SYS ; CHECK FOR SPACE IN OUTPUT BUFFER USING HBIOS + + OR A ; 0 OR 1 IS A VALID RETURN + JP Z,TALK_NEXT ; JUMP NO SPACE + JP M,TALK_NEXT ; JUMP ERROR ON WRITE +; +; EXEC WRITE TO WT_DEV +; + LD B,BF_CIOOUT ; SET HBIOS FUNCTION TO RUN + LD HL, WT_DEV + LD C,(HL) ; RETRIEVE TGT_DEV_NUM TO READ/WRITE FROM TARGET CHAR DEVICE + ; + POP AF ; RECOVER THE CHARACTER + LD E,A ; MOVE CHARACTER TO E + CALL HBIOS_SYS ; WRITE CHAR USING HBIOS + +TALK_NEXT: +; +; SWAP RF_DEV AND WT_DEV +; + LD IX, RF_DEV ; LOAD VALUE AT ADDR USER_CON + LD A, (IX) ; LOAD VALUE AT ADDR RF_DEV + LD B, (IX+1) ; LOAD VALUE AT ADDR WT_DEV + LD (IX+1), A ; STORE TO OLD RF_DEV TO ADDR WT_DEV + LD A, B ; MOVE OLD WT_DEV TO A + LD (IX), A ; STORE TO OLD WT_DEF TO ADDR RF_DEV + JP TALK_LOOP ; LOOP + +; +;=============================================================================== +; END MAIN PROGRAM SUBROUTINES +;=============================================================================== +; + +; +;=============================================================================== +; BEGIN ROUTINES THAT ARE NOT COMPATIBLE WITH DBGMON +;=============================================================================== +; + + +PARSE: +; + LD HL,$81 ; POINT TO START OF COMMAND TAIL (AFTER LENGTH BYTE) + CALL NONBLANK ; SKIP LEADING BLANKS, + CALL HEXBYTE + JP C,ERRHEXRD ; IF NOT, ERR + LD (TARGET_CON),A ; REQUESTED TARGET CONN + + LD B,A ; MOVE TO B + + LD HL,CIODEV_MAX ; GRAB MAX VALUE OF TARGETCON + LD A,(HL) + + CP B ; CHECK IF B<=A + JP M, ERROOR ; IF B>A, and both are less then 80 then S SET, ERR + JP C, ERROOR ; IF B> 80 carry set instead (signed numbers problem) + ; swap A and B + + JP PE, ERROOR ; IF B>A, C SET, ERR + + LD HL, MSGTALKING ; PRINT TARGET DEVICE + CALL PRTSTR + LD A, B ; RETRIEVE TARGET CON + CALL PRTHEX + CALL NEWLINE + + AND $00 + RET + + + +; +;NOT COMPATIBLE WITH THE DBGMON FUNCTION OF THE SAME NAME +; +NONBLANK: + LD A,(HL) ; LOAD NEXT CHARACTER + OR A ; STRING ENDS WITH A NULL + RET Z ; IF NULL, RETURN POINTING TO NULL + CP ' ' ; CHECK FOR BLANK + RET NZ ; RETURN IF NOT BLANK + INC HL ; IF BLANK, INCREMENT CHARACTER POINTER + JR NONBLANK ; AND LOOP + +; +; +;=============================================================================== +; END ROUTINES THAT ARE NOT COMPATIBLE WITH DBGMON +;=============================================================================== +; + + + + +; +;=============================================================================== +; BEGIN ROUTINES THAT ARE LIFTED FROM DBGMON +;=============================================================================== +; + + +; +; PRINT THE VALUE IN A IN HEX WITHOUT DESTROYING ANY REGISTERS +; +PRTHEX: + PUSH DE ; SAVE DE + CALL HEXASCII ; CONVERT VALUE IN A TO HEX CHARS IN DE + LD A,D ; GET THE HIGH ORDER HEX CHAR + CALL COUT ; PRINT IT + LD A,E ; GET THE LOW ORDER HEX CHAR + CALL COUT ; PRINT IT + POP DE ; RESTORE DE + RET ; DONE + +; +; CONVERT BINARY VALUE IN A TO ASCII HEX CHARACTERS IN DE +; + +HEXASCII: + LD D,A ; SAVE A IN D + CALL HEXCONV ; CONVERT LOW NIBBLE OF A TO HEX + LD E,A ; SAVE IT IN E + LD A,D ; GET ORIGINAL VALUE BACK + RLCA ; ROTATE HIGH ORDER NIBBLE TO LOW BITS + RLCA + RLCA + RLCA + CALL HEXCONV ; CONVERT NIBBLE + LD D,A ; SAVE IT IN D + RET ; DONE + +; +; CONVERT LOW NIBBLE OF A TO ASCII HEX +; +HEXCONV: + AND $0F ; LOW NIBBLE ONLY + ADD A,$90 + DAA + ADC A,$40 + DAA + RET +; + + +; +; ADD THE VALUE IN A TO HL (HL := HL + A) +; +ADDHL: + ADD A,L ; A := A + L + LD L,A ; PUT RESULT BACK IN L + RET NC ; IF NO CARRY, WE ARE DONE + INC H ; IF CARRY, INCREMENT H + RET ; AND RETURN + + +; +;__________________________________________________________________________________________________ +; +; UTILITY PROCS TO PRINT SINGLE CHARACTERS WITHOUT TRASHING ANY REGISTERS +; +;__________________________________________________________________________________________________ +; +PC_SPACE: + PUSH AF + LD A,' ' + JR PC_PRTCHR +PC_COLON: + PUSH AF + LD A,':' + JR PC_PRTCHR +PC_CR: + PUSH AF + LD A,CHR_CR + JR PC_PRTCHR + +PC_LF: + PUSH AF + LD A,CHR_LF + JR PC_PRTCHR + +PC_PRTCHR: + CALL COUT + POP AF + RET + +NEWLINE2: + CALL NEWLINE +NEWLINE: + CALL PC_CR + CALL PC_LF + RET + +PRTSTR: + LD A,(HL) + INC HL + CP '$' + RET Z + CALL COUT + JR PRTSTR + +; +;__COUT_______________________________________________________________________ +; +; OUTPUT CHARACTER FROM A +;_____________________________________________________________________________ +; +COUT: + ; SAVE ALL INCOMING REGISTERS + PUSH AF + PUSH BC + PUSH DE + PUSH HL +; + ; OUTPUT CHARACTER TO CONSOLE VIA HBIOS + LD E,A ; OUTPUT CHAR TO E + LD C,CIO_CONSOLE ; CONSOLE UNIT TO C + LD B,BF_CIOOUT ; HBIOS FUNC: OUTPUT CHAR + CALL HBIOS_SYS ; HBIOS OUTPUTS CHARACTER +; + ; RESTORE ALL REGISTERS + POP HL + POP DE + POP BC + POP AF + RET +; +;__CIN________________________________________________________________________ +; +; INPUT CHARACTER TO A +;_____________________________________________________________________________ +; +CIN: + ; SAVE INCOMING REGISTERS (AF IS OUTPUT) + PUSH BC + PUSH DE + PUSH HL +; + ; INPUT CHARACTER FROM CONSOLE VIA HBIOS + LD C,CIO_CONSOLE ; CONSOLE UNIT TO C + LD B,BF_CIOIN ; HBIOS FUNC: INPUT CHAR + CALL HBIOS_SYS ; HBIOS READS CHARACTER + LD A,E ; MOVE CHARACTER TO A FOR RETURN +; + ; RESTORE REGISTERS (AF IS OUTPUT) + POP HL + POP DE + POP BC + RET +; +;__CST________________________________________________________________________ +; +; RETURN INPUT STATUS IN A (0 = NO CHAR, !=0 CHAR WAITING) +;_____________________________________________________________________________ +; +CST: + ; SAVE INCOMING REGISTERS (AF IS OUTPUT) + PUSH BC + PUSH DE + PUSH HL +; + ; GET CONSOLE INPUT STATUS VIA HBIOS + LD C,CIO_CONSOLE ; CONSOLE UNIT TO C + LD B,BF_CIOIST ; HBIOS FUNC: INPUT STATUS + CALL HBIOS_SYS ; HBIOS RETURNS STATUS IN A +; + ; RESTORE REGISTERS (AF IS OUTPUT) + POP HL + POP DE + POP BC + RET +; + + +; +;__ISHEX______________________________________________________________________ +; +; CHECK BYTE AT (HL) FOR HEX CHAR, RET Z IF SO, ELSE NZ +;_____________________________________________________________________________ +; +ISHEX: + LD A,(HL) ; CHAR TO AS + CP '0' ; < '0'? + JR C,ISHEX1 ; YES, NOT 0-9, CHECK A-F + CP '9' + 1 ; > '9' + JR NC,ISHEX1 ; YES, NOT 0-9, CHECK A-F + XOR A ; MUST BE 0-9, SET ZF + RET ; AND DONE +ISHEX1: + CP 'A' ; < 'A'? + JR C,ISHEX2 ; YES, NOT A-F, FAIL + CP 'F' + 1 ; > 'F' + JR NC,ISHEX2 ; YES, NOT A-F, FAIL + XOR A ; MUST BE A-F, SET ZF + RET ; AND DONE +ISHEX2: + OR $FF ; CLEAR ZF + RET ; AND DONE +; +;__HEXBYTE____________________________________________________________________ +; +; GET ONE BYTE OF HEX DATA FROM BUFFER IN HL, RETURN IN A +;_____________________________________________________________________________ +; +HEXBYTE: + LD C,0 ; INIT WORKING VALUE +HEXBYTE1: + CALL ISHEX ; DO WE HAVE A HEX CHAR? + JR NZ,HEXBYTE3 ; IF NOT, WE ARE DONE + LD B,4 ; SHIFT WORKING VALUE (C := C * 16) +HEXBYTE2: + SLA C ; SHIFT ONE BIT + RET C ; RETURN W/ CF SET INDICATING OVERFLOW ERROR + DJNZ HEXBYTE2 ; LOOP FOR 4 BITS + CALL NIBL ; CONVERT HEX CHAR TO BINARY VALUE IN A & INC HL + OR C ; COMBINE WITH WORKING VALUE + LD C,A ; AND PUT BACK IN WORKING VALUE + JR HEXBYTE1 ; DO ANOTHER CHARACTER +HEXBYTE3: + LD A,C ; WORKING VALUE TO A + OR A ; CLEAR CARRY + RET + +; +;__NIBL_______________________________________________________________________ +; +; GET ONE BYTE OF HEX DATA FROM BUFFER IN HL, RETURN IN A +;_____________________________________________________________________________ +; +NIBL: + LD A,(HL) ; GET K B. DATA + INC HL ; INC KB POINTER + CP 40H ; TEST FOR ALPHA + JR NC,ALPH + AND 0FH ; GET THE BITS + RET +ALPH: + AND 0FH ; GET THE BITS + ADD A,09H ; MAKE IT HEX A-F + RET + + +; +;=============================================================================== +; END ROUTINES THAT ARE LIFTED FROM DBGMON +;=============================================================================== +; + + + + +; +;=============================================================================== +; ERROR RESPONCES +;=============================================================================== +; + +ERROOR: ; REQUESTED DEV OUT OF RANGE (SYNTAX) + CALL NEWLINE + LD A, 'R' + CALL COUT + LD HL,TARGET_CON + LD A,(HL) + CALL PRTHEX + + + LD A, ':' + CALL COUT + LD A, 'M' + CALL COUT + LD HL,CIODEV_MAX + LD A,(HL) + CALL PRTHEX + + LD HL,MSGOOR + JR ERROR +ERRHEXRD: ; COMMAND HEX READ ERROR (SYNTAX) + LD HL,MSGHEXRD + JR ERROR +ERRUSE: ; COMMAND USAGE ERROR (SYNTAX) + LD HL,MSGUSE + JR ERROR +ERRPRM: ; COMMAND PARAMETER ERROR (SYNTAX) + LD HL,MSGPRM + JR ERROR +ERROR: ; PRINT ERROR STRING AND RETURN ERROR SIGNAL + CALL NEWLINE ; PRINT NEWLINE + CALL PRTSTR ; PRINT ERROR STRING + OR $FF ; SIGNAL ERROR + RET ; DONE + +;=============================================================================== +; STORAGE SECTION +;=============================================================================== +; + +; CHAR DEV COUNT +CIODEV_CNT .DB $0 +CIODEV_MAX .DB $0 + +;TALK LOOP DATA, DEFAULT TO LOOPBACK +USER_CON .DB $80 +TARGET_CON .DB $80 + +; PING PONG POINTERS +RF_DEV .DB 0 +WT_DEV .DB 0 + +; TARGET CHARACTER DEVICE DATA +TGT_DEV: + .DB 0 ; HBIOS CHAR NUM + .DB 0 ; C: DEVICE ATTRIBUTES + .DB 0 ; D: DEVICE TYPE + .DB 0 ; E: DEVICE NUMBER + .DB 0 ; H: DEVICE MODE + .DB 0 ; L: DEVICE I/O BASE ADDRESS + +; STRING LITERALS +MSGUSE .TEXT "USAGE: HTALK $" +MSGPRM .TEXT "PARAMETER ERROR$" +MSGOOR .TEXT "CIO VAL TOO LARGE$" +MSGHEXRD .TEXT "HEX READ ERR$" +MSGTALKING .TEXT "CONNECTING TO CHAR:$" + + +DEV_STR_TBL: + .TEXT "CHAR:$" + .TEXT "ATTR:$" + .TEXT "TYPE:$" + .TEXT "NUMB:$" + .TEXT "MODE:$" + .TEXT "ADDR:$" + +STR_DEVS_FOUND .TEXT "NUM CHAR DEVICES FOUND - $" +STR_EXITMSG .TEXT "HTALK DONE$" +STR_BANNER .TEXT "HTALK V1.0 (CTRL-C TO EXIT)$" +STR_HBIOS .TEXT "HBIOS DETECTED$" +STR_BIOERR .TEXT "*** UNKNOWN BIOS - BAILING OUT ***$" + +STKSAV .DW 0 ; STACK POINTER SAVED AT START + .FILL STKSIZ,0 ; STACK +STACK .EQU $ ; STACK TOP +; + .END diff --git a/Source/Apps/Makefile b/Source/Apps/Makefile index 03bacb2c..a3ae67fe 100644 --- a/Source/Apps/Makefile +++ b/Source/Apps/Makefile @@ -1,6 +1,6 @@ OBJECTS = sysgen.com syscopy.com assign.com format.com talk.com \ mode.com rtc.com timer.com rtchb.com -SUBDIRS = XM FDU FAT Tune Test ZMP ZMD Dev VGM cpuspd Survey +SUBDIRS = HTalk XM FDU FAT Tune Test ZMP ZMD Dev VGM cpuspd Survey DEST = ../../Binary/Apps TOOLS =../../Tools diff --git a/Source/Apps/Test/DMAmon/dmamon.asm b/Source/Apps/Test/DMAmon/dmamon.asm index c602d526..2842663d 100644 --- a/Source/Apps/Test/DMAmon/dmamon.asm +++ b/Source/Apps/Test/DMAmon/dmamon.asm @@ -12,12 +12,26 @@ DMAMODE_Z180 .EQU 2 ; Z180 INTEGRATED DMA DMAMODE_Z280 .EQU 3 ; Z280 INTEGRATED DMA DMAMODE_RC .EQU 4 ; RCBUS Z80 DMA DMAMODE_MBC .EQU 5 ; MBC -DMAMODE_VDG .EQU 6 ; VELESOFT DATAGEAR +DMAMODE_DUO .EQU 6 ; DUO +DMAMODE_VDG .EQU 7 ; VELESOFT DATAGEAR +; +DMAMODE .EQU DMAMODE_DUO ; SELECT DMA DEVICE FOR TESTING +; +;================================================================================================== +; SOME DEFAULT PLATFORM CONFIGURATIONS +;================================================================================================== ; DMABASE .EQU $E0 ; DMA: DMA BASE ADDRESS -DMAMODE .EQU DMAMODE_MBC ; SELECT DMA DEVICE FOR TESTING +DMALATCH .EQU DMABASE+1 ; DMA: DMA LATCH ADDRESS DMAIOTST .EQU $68 ; AN OUTPUT PORT FOR TESTING - 16C450 SERIAL OUT ; +#IF (DMAMODE==DMAMODE_DUO) +DMABASE .SET $40 ; DMA: DMA0 BASE ADDRESS +DMALATCH .SET $43 ; DMA: DMA LATCH ADDRESS +DMAIOTST .SET $58 ; AN OUTPUT PORT FOR TESTING - 16C450 SERIAL OUT +;DMAIOTST .SET $94 ; AN ALT OUTPUT PORT FOR TESTING - RTC/SPEAKER/LEDS PORT +#ENDIF +; ;================================================================================================== ; HELPER MACROS AND EQUATES ;================================================================================================== @@ -113,7 +127,7 @@ MAIN: LD SP,STACK ; STACK ; call PRTSTRD ; WELCOME - .db "\n\rDMA Monitor V3\n\r$" + .db "\n\rDMA Monitor V3.1\n\r$" ; #IF (INTENABLE) ; @@ -122,6 +136,8 @@ MAIN: ld de,$A000 ld bc,hsiz ldir + ld a,(dmaport) + ld (int_dmaport),a ; ; Install interrupt vector (RomWBW specific!!!) ld hl,int ; pointer to my interrupt handler @@ -156,17 +172,17 @@ MENULP1: CP 'N' JP Z,DMATST_N ; MEMORY COPY ITER CP '0' - JP Z,DMATST_01 + JP Z,DMATST_0 ; PULSE DMA PORT + CP '1' + JP Z,DMATST_1 ; PULSE LATCH PORT CP 'O' JP Z,DMATST_O -#IF !(DMAMODE==DMAMODE_VDG) - CP '1' - JP Z,DMATST_01 CP 'R' JP Z,DMATST_R ; TOGGLE RESET CP 'Y' - JP Z,DMATST_Y ; TOGGLE READY -#ENDIF + JP Z,DMATST_Y + cp 'L' + jp z,DMACFG_L ; SET LATCH PORT cp 'S' jp z,DMACFG_S ; SET PORT cp 'V' @@ -197,12 +213,20 @@ DMABYE: ; DMACFG_S: call PRTSTRD - .db "\n\rSet port address\n\rPort:$" + .db "\n\rSet DMA port address\n\rPort:$" call HEXIN ld hl,dmaport ld (hl),a - inc hl - inc a +#IF (INTENABLE) + ld (int_dmaport),a +#ENDIF + jp MENULP +; +DMACFG_L: + call PRTSTRD + .db "\n\rSet Latch port address\n\rPort:$" + call HEXIN + ld hl,dmalach ld (hl),a jp MENULP ; @@ -234,11 +258,17 @@ DMATST_N: CALL DMAMemTestIter JP MENULP ; -DMATST_01: +DMATST_0: call PRTSTRD - .db "\n\rPerforming Port Selection Test\n\r$" - CALL DMA_Port01 - JP MENULP + .db "\n\rPerforming DMA Port Selection Test\n\r$" + CALL DMA_Port0 + ret + +DMATST_1: + call PRTSTRD + .db "\n\rPerforming Latch Port Selection Test\n\r$" + CALL DMA_Port1 + ret ; DMATST_O: call PRTSTRD @@ -255,7 +285,7 @@ DMATST_D: DMATST_Y: call PRTSTRD .db "\n\rPerforming Ready Bit Test\n\r$" - CALL DMA_ReadyT + CALL DMA_ReadyY JP MENULP ; DMATST_R: @@ -289,6 +319,10 @@ DISPM: call PRTSTRD .db ", Port=0x$" LD A,(dmaport) ; DISPLAY CALL PRTHEXBYTE ; DMA PORT + call PRTSTRD + .db ", Latch Port=0x$" + ld A,(dmalach) + CALL PRTHEXBYTE ; DMA PORT ; #IF (INTENABLE) ; @@ -351,7 +385,7 @@ DMA_INIT: CALL PRTHEXBYTE ; #IF !(DMAMODE==DMAMODE_VDG) - ld a,(dmautil) + ld a,(dmalach) ld c,a LD A,DMA_FORCE out (c),a ; force ready off @@ -369,7 +403,8 @@ DMA_INIT: ; ld hl,DMACode ; program the ld b,DMACode_Len ; dma command - ld c,DMABASE ; block + ld a,(dmaport) + ld c,a ; block ; di otir ; load dma @@ -417,6 +452,7 @@ DMA_DEV_STR: .TEXT "Z280$" .TEXT "RCBUS$" .TEXT "MBC$" + .TEXT "DUODYNE$" .TEXT "DATAGEAR$" ; DMA_SPD_STR: @@ -479,11 +515,12 @@ DMACFG_V: ;================================================================================================== ; DMABUF .TEXT "0123456789abcdef" +;DMABUF .DB $04,$00,$04,$00,$04,$00,$04,$00,$04,$00,$04,$00,$04,$00,$04,$00,$00,$00,$00 ; SPEAKER ; DMA_ReadyO: call PRTSTRD .db "\r\nOutputing string to port 0x$" - ld a,DMAIOTST + ld a,(tstport) call PRTHEXBYTE call NEWLINE ; @@ -491,7 +528,7 @@ DMA_ReadyO: IOLoop: push bc call NEWLINE ld hl,DMABUF - ld a,DMAIOTST + ld a,(tstport) ld bc,16 ; call DMAOTIR @@ -502,16 +539,17 @@ IOLoop: push bc ret ; ;================================================================================================== -; PULSE PORT (COMMON ROUTINE WHERE A CONTAINS THE ASCII PORT OFFSET) +; PULSE PORT ;================================================================================================== ; -DMA_Port01: +DMA_Port0: + ld a,(dmaport) + jr DMA_Port +DMA_Port1: + ld a,(dmalach) +DMA_Port: call PRTSTRD .db "\r\nPulsing port 0x$" - sub '0' ; Calculate - ld c,a - ld a,(dmaport) ; Port to - add a,c call PRTHEXBYTE call NEWLINE ld c,a ; toggle @@ -543,12 +581,9 @@ dlylp: dec bc ; TOGGLE READY BIT ;================================================================================================== ; -DMA_ReadyT: +DMA_ReadyY: call NEWLINE -#IF !(DMAMODE==DMAMODE_VDG) - -#ENDIF - ld a,(dmautil) + ld a,(dmalach) ld c,a ; toggle ld b,$20 ; loop counter portlp2:push bc @@ -558,14 +593,12 @@ portlp2:push bc .db ": ON$" call delay ld a,$FF -; ld c,DMABASE+1 out (c),a call PRTSTRD .db " -> OFF$" call delay call PRTSTRD .db "\r \r$" -; ld c,DMABASE+1 ld a,0 out (c),a pop bc @@ -605,9 +638,9 @@ DMAMemMove1: ; DMAMemMove2: ; -; LD HL,$8400 ; PLANT -; LD A,$00 ; BAD -; LD (HL),A ; SEED + ;LD HL,$8400 ; PLANT + ;LD A,$00 ; BAD + ;LD (HL),A ; SEED ; LD A,$AA ; CHECK COPY SUCCESSFULL LD HL,$8000 @@ -615,6 +648,14 @@ DMAMemMove2: NXTCMP: CPI JP PO,CMPOK JR Z,NXTCMP + + DEC HL + CALL PRTHEXWORDHL + LD A,' ' + CALL COUT + LD A,(HL) + CALL PRTHEXBYTE + RET ; RET W/ ZF CLEAR ; CMPOK: @@ -1167,10 +1208,10 @@ CST: RET ; USEINT .DB FALSE ; USE INTERRUPTS FLAG -counter .dw 0 dmaport .db DMABASE -dmautil .db DMABASE+1 +dmalach .db DMALATCH dmaxfer .db DMA_XMODE +tstport .db DMAIOTST dmavbs .db 0 SAVSTK: .DW 2 .FILL 64 @@ -1187,11 +1228,16 @@ reladr .equ $ ; relocation start adr .org $A000 ; code will run here ; int: + ;LD E,'.' ; OUTPUT CHAR TO E + ;LD C,CIO_CONSOLE ; CONSOLE UNIT TO C + ;LD B,BF_CIOOUT ; HBIOS FUNC: OUTPUT CHAR + ;CALL $FFF0 ; HBIOS OUTPUTS CHARACTER + ; According to the DMA doc, you must issue ; a DMA_DISABLE command prior to a ; DMA_REINIT_STATUS_BYTE command to avoid a ; potential race condition. - ld a,(dmaport) + ld a,(int_dmaport) ld c,a ld a,DMA_DISABLE out (c),a @@ -1211,6 +1257,11 @@ int: or $ff ; signal int handled ret ; +; data referred to in handler must reside in high mem +; +int_dmaport .db 0 ; hi mem copy of dmaport +counter .dw 0 ; interrupt counter +; hsiz .equ $ - $A000 ; size of handler to relocate ; .org reladr + hsiz diff --git a/Source/Apps/Test/I2C/Build.cmd b/Source/Apps/Test/I2C/Build.cmd index 1a1a8206..6821c4e3 100644 --- a/Source/Apps/Test/I2C/Build.cmd +++ b/Source/Apps/Test/I2C/Build.cmd @@ -8,6 +8,8 @@ set TASMTABS=%TOOLS%\tasm32 tasm -t180 -g3 -fFF i2cscan.asm i2cscan.com i2cscan.lst || exit /b tasm -t180 -g3 -fFF rtcds7.asm rtcds7.com rtcds7.lst || exit /b tasm -t180 -g3 -fFF i2clcd.asm i2clcd.com i2clcd.lst || exit /b +tasm -t80 -g3 -ff srom.asm srom.com srom.lst || exit /b copy /Y i2c*.com ..\..\..\..\Binary\Apps\Test\ || exit /b copy /Y rtcds7*.com ..\..\..\..\Binary\Apps\Test\ || exit /b +copy /Y srom.com ..\..\..\..\Binary\Apps\Test\ || exit /b diff --git a/Source/Apps/Test/I2C/Makefile b/Source/Apps/Test/I2C/Makefile index c7abbb52..97f68d07 100644 --- a/Source/Apps/Test/I2C/Makefile +++ b/Source/Apps/Test/I2C/Makefile @@ -1,4 +1,4 @@ -OBJECTS = i2cscan.com rtcds7.com i2clcd.com +OBJECTS = i2cscan.com rtcds7.com i2clcd.com srom.com DEST = ../../../../Binary/Apps/Test/ TOOLS = ../../../../Tools diff --git a/Source/Apps/Test/I2C/i2cscan.asm b/Source/Apps/Test/I2C/i2cscan.asm index 5b594ef5..f8237ae3 100644 --- a/Source/Apps/Test/I2C/i2cscan.asm +++ b/Source/Apps/Test/I2C/i2cscan.asm @@ -5,12 +5,13 @@ ; MARCO MACCAFERRI, HTTPS://WWW.MACCASOFT.COM ; HBIOS VERSION BY PHIL SUMMERS (B1ACKMAILER) DIFFICULTLEVELHIGH@GMAIL.COM ; -PCF .EQU 1 -P8X180 .EQU 0 -SC126 .EQU 0 -SC137 .EQU 0 +PCFECB .EQU 0 +PCFDUO .EQU 1 +P8X180 .EQU 0 +SC126 .EQU 0 +SC137 .EQU 0 ; -#IF (PCF) +#IF (PCFECB) I2C_BASE .EQU 0F0H PCF_ID .EQU 0AAH CPU_CLK .EQU 12 @@ -20,6 +21,16 @@ PCF_RS1 .EQU PCF_RS0+1 PCF_OWN .EQU (PCF_ID >> 1) ; PCF'S ADDRESS IN SLAVE MODE #ENDIF ; +#IF (PCFDUO) +I2C_BASE .EQU 056H +PCF_ID .EQU 0AAH +CPU_CLK .EQU 12 +; +PCF_RS0 .EQU I2C_BASE +PCF_RS1 .EQU PCF_RS0+1 +PCF_OWN .EQU (PCF_ID >> 1) ; PCF'S ADDRESS IN SLAVE MODE +#ENDIF +; #IF (P8X180) I2C_BASE .EQU 0A0h _sda .EQU 0 @@ -153,8 +164,11 @@ lp5f: ld a,(addr) ; next address jp 0 signon: .db "I2C Bus Scanner" -#IF (PCF) - .DB " - PCF8584" +#IF (PCFECB) + .DB " - PCF8584 (ECB)" +#ENDIF +#IF (PCFDUO) + .DB " - PCF8584 (Duodyne)" #ENDIF #IF (SC126) .DB " - SC126" @@ -219,7 +233,7 @@ _cout: ; character ret ;----------------------------------------------------------------------------- -#IF (PCF) +#IF (PCFECB | PCFDUO) _i2c_start: PCF_START: LD A,PCF_START_ @@ -418,7 +432,7 @@ PCF_PINFAIL .DB "PIN FAIL$" PCF_BBFAIL .DB "BUS BUSY$" ; ;----------------------------------------------------------------------------- -#IF (PCF) +#IF (PCFECB | PCFDUO) _i2c_stop: PCF_STOP: LD A,PCF_STOP_ ; issue diff --git a/Source/Apps/Test/I2C/srom.asm b/Source/Apps/Test/I2C/srom.asm new file mode 100644 index 00000000..8429c168 --- /dev/null +++ b/Source/Apps/Test/I2C/srom.asm @@ -0,0 +1,1679 @@ +; +;======================================================================= +; I2C Serial ROM Read/Write Utility (SROM) +;======================================================================= +; +; Read or write the contents of a 24LC512 Serial EEPROM via an I2C +; PCF8584 controller. +; +; WBW 2023-09-05: Initial release +; WBW 2023-09-07: Code clean up +; +;======================================================================= +; +; PCF8584 controller port addresses (adjust as needed) +; +pcfbase_sbc .equ $F0 ; SBC PCF8584 I/O base port address +pcfbase_duo .equ $56 ; Duodyne PCF8584 I/O base port address +; +; I2C identification (own slave id) +; +pcf_adr .equ $55 ; Our "own" I2C slave address +; +; 24LC512 ROM id (target device) +; +rom0_adr .equ $50 ; I2C SROM first I2C address +rom_pgsiz .equ 128 ; SROM page size +; +; General operational equates (should not require adjustment) +; +stksiz .equ $40 ; Working stack size +; +restart .equ $0000 ; CP/M restart vector +bdos .equ $0005 ; BDOS invocation vector +fcb1 .equ $005C ; first CP/M parsed FCB +fcb2 .equ $006C ; second CP/M parsed FCB +; +cr .equ 13 ; carriage return +lf .equ 10 ; line feed +; +ident .equ $FFFE ; loc of RomWBW HBIOS ident ptr +; +bf_sysver .equ $F1 ; BIOS: VER function +bf_sysget .equ $F8 ; HBIOS: SYSGET function +bf_sysset .equ $F9 ; HBIOS: SYSGET function +bf_sysgettimer .equ $D0 ; TIMER subfunction +bf_syssettimer .equ $D0 ; TIMER subfunction +bf_sysgetsecs .equ $D1 ; SECONDS subfunction +bf_syssetsecs .equ $D1 ; SECONDS subfunction +; +; Control register bits +; +pcf_ctl_pin .equ %10000000 ; reset ; 0x80 +pcf_ctl_eso .equ %01000000 ; enable serial output ; 0x40 +pcf_ctl_es1 .equ %00100000 ; register selection bit 1 ; 0x20 +pcf_ctl_es2 .equ %00010000 ; register selection bit 2 ; 0x10 +pcf_ctl_eni .equ %00001000 ; enable external interrupt ; 0x08 +pcf_ctl_sta .equ %00000100 ; generate start ; 0x04 +pcf_ctl_sto .equ %00000010 ; generate stop ; 0x02 +pcf_ctl_ack .equ %00000001 ; enable auto acknowledge ; 0x01 +; +pcf_op_start .equ (pcf_ctl_pin | pcf_ctl_eso | pcf_ctl_sta | pcf_ctl_ack) ; 0xC5 +pcf_op_stop .equ (pcf_ctl_pin | pcf_ctl_eso | pcf_ctl_sto | pcf_ctl_ack) ; 0xC3 +pcf_op_repstart .equ (pcf_ctl_eso | pcf_ctl_sta | pcf_ctl_ack) ; 0x45 +pcf_op_idle .equ (pcf_ctl_pin | pcf_ctl_eso | pcf_ctl_ack) ; 0xC1 +; +; Status register bits +; +pcf_st_pin .equ %10000000 ; pending interrupt not ; 0x80 +pcf_st_ini .equ %01000000 ; normally 0, 1 if not initialized ; 0x40 +pcf_st_sts .equ %00100000 ; stop detected ; 0x20 +pcf_st_ber .equ %00010000 ; bus error detected ; 0x10 +pcf_st_ad0 .equ %00001000 ; slave address received = 0x00 ; 0x08 +pcf_st_lrb .equ %00001000 ; last received bit ; 0x08 +pcf_st_aas .equ %00000100 ; addressed as slave ; 0x04 +pcf_st_lab .equ %00000010 ; lost arbitration ; 0x02 +pcf_st_bb .equ %00000001 ; bus busy not ; 0x01 +; +; Transmission frequencies +; +pcf_trns_90 .equ $00 ; 90 KHz +pcf_trns_45 .equ $01 ; 45 KHz +pcf_trns_11 .equ $02 ; 11 KHz +pcf_trns_15 .equ $03 ; 1.5 KHz +; +; Clock chip frequencies +; +pcf_clk_3 .equ $00 ; 3 MHz +pcf_clk_443 .equ $10 ; 4.43 MHz +pcf_clk_6 .equ $14 ; 6 MHz +pcf_clk_8 .equ $18 ; 8 MHz +pcf_clk_12 .equ $1C ; 12 MHz +; +; Divisor settings +; +pcf_clk .equ pcf_clk_12 ; $1C +pcf_trns .equ pcf_trns_90 ; $00 +; +; Error codes +; +ec_ok .equ 0 ; No error +ec_bio .equ -1 ; HBIOS invalid or not present +ec_plt .equ -2 ; HBIOS platform not supported +ec_usage .equ -3 ; Command line usage error +ec_init .equ -4 ; PCF8584 init failed +ec_timeout .equ -5 ; I2C protocol timeout +ec_nak .equ -6 ; Unexpected NAK +ec_fopen .equ -7 ; File open error +ec_fio .equ -8 ; File I/O error +ec_exists .equ -9 ; File already exists +ec_verify .equ -10 ; Data verification mismatch +; +;======================================================================= +; + .org $100 ; standard CP/M executable +; +; + ; Setup stack (save old value) + ld (stksav),sp ; save stack + ld sp,stack ; set new stack +; + ; Announce program + call crlf + ld de,str_banner ; banner + call prtstr +; + call parse ; parse options + jr nz,exit ; abort if problems +; + call init ; initialize + jr nz,exit ; abort if problems +; + call main ; do the real work +; +exit: + call prterr +; + ; Announce end of program + call crlf2 + ld de,str_exit + call prtstr +; + ; Restore stack and return to OS + call crlf ; formatting + ld sp,(stksav) ; restore stack + jp restart ; return to CP/M via restart +; +;======================================================================= +; Command Line Parsing +;======================================================================= +; +; We take advantage of CP/M OS command line processing which treats +; the first two parameters on the command line as filenames and places +; corresponding FCBs at $5C and $6C. +; +; The first FCB is not actually handled as a file. Instead, the first +; two characters are used as control parameters. First character is +; the function to perform (R=read, W=write) and the second character +; is the serial ROM address (0-7) which maps to I2C addresses $50-$57. +; +parse: + ld a,(fcb1+1) ; function parm + cp 'R' ; read? + jr z,parse1 ; if so, valid, continue + cp 'W' ; write? + jr z,parse1 ; if so, valid, continue + cp 'T' ; write? + jr z,parse1 ; if so, valid, continue + cp 'D' ; write? + jr z,parse1 ; if so, valid, continue + jp err_usage ; else, handle usage error +; +parse1: + ld (func),a ; save function + ld a,(fcb1+2) ; ROM adr parm + cp '0' ; start of range + jp c,err_usage ; if less, handle usage error + cp '7' + 1 ; end of range + jp nc,err_usage ; if more, handle usage error + sub '0' ; convert to binary + add a,rom0_adr ; offset to first srom adr + ld (romadr),a ; save it +; + ld a,(func) ; recall function + cp 'T' ; test command? + jr z,parse_z +; + ld a,(fcb2+1) ; first char of page/filename + cp ' ' ; blank? + jp z,err_usage ; if so, handle usage error +; + ld a,(func) ; recall function + cp 'D' ; dump command? + jr z,parse2 ; parse page number +; + ; copy FCB to working location + ld hl,fcb2 ; parsed CP/M FCB 2 + ld de,fcb ; our FCB buffer + ld bc,16 ; only first 16 bytes + ldir ; copy it + jr parse_z +; +parse2: + ; parse page number + ld hl,0 ; initialize page number + ld de,fcb2+1 ; pointer to start of page num +parse3: + ld a,(de) ; get next char + inc de + cp ' ' ; space char? + jr z,parse4 ; return w/ ZF set + cp '0' ; start of range + jp c,err_usage ; if less, handle usage error + cp '9' + 1 ; end of range + jp nc,err_usage ; if more, handle usage error +; + ; multiply working page num by 10, then add new digit + push hl + pop bc + add hl,hl + add hl,hl + add hl,bc + add hl,hl + sub '0' + call addhla +; + ; check for overflow + ld a,h + cp 2 + jp nc,err_usage +; + jr parse3 +; +parse4: + ld (page),hl +; +parse_z: + xor a + ret +; +;======================================================================= +; Hardware Initialization +;======================================================================= +; +init: + call idbio ; identify hardware BIOS + cp 1 ; is it RomWBW? + jp nz,err_bio ; if not, handle error +; + ; Setup I/O ports based on HBIOS platform ID + ld a,l ; idbio puts platform id in L + ld c,pcfbase_sbc ; assume SBC + cp 1 ; compare to platform id + jr z,init1 ; if SBC, commit + ld c,pcfbase_duo ; assume SBC + cp 17 ; compare to platform id + jr z,init1 ; if DUO, commit + jp err_plt ; unsupported platform error +; +init1: + ; Record and display PCF8584 port addresses + call crlf2 ; formatting + ld de,str_hwmsg1 ; first part of h/w message + call prtstr ; print it + ld a,c ; get base port + call prthex ; print port number + ld (pcf_dat),a ; save data port + ld de,str_hwmsg2 ; second part of h/w message + call prtstr ; print port number + inc a ; bump to data port + ld (pcf_ctl),a ; save control port + call prthex ; print port number + ld de,str_hwmsg3 ; third part of h/w message + call prtstr ; print it +; + ; Initialize PCF8584 + call pcf_init ; sets A with result + ret nz +; + ; "Reading/Writing/Testing Serial ROM # (I2C address 0xnn)" + call crlf2 + ld a,(func) + ld de,str_inforead + cp 'R' + call z,prtstr ; "Reading" + ld de,str_infowrite + cp 'W' + call z,prtstr ; "Writing" + ld de,str_infotest + cp 'T' + call z,prtstr ; "Testing" + ld de,str_infodump + cp 'D' + call z,prtstr ; "Dumping" + ld de,str_info1 + call prtstr ; " Serial ROM #" + ld a,(romadr) + push af + sub rom0_adr + call prtdecb ; # + pop af + ld de,str_info2 + call prtstr ; " (I2C address " + call prthex ; 0x## + ld de,str_info3 + call prtstr ; ")" +; +init2: + xor a + ret +; +;======================================================================= +; Mainline +;======================================================================= +; +main: + ; Get requested function and dispatch + ld a,(func) ; get function + cp 'T' ; SROM test? + jp z,test ; if so, do it + cp 'D' ; SROM dump? + jp z,dump ; if so, do it + cp 'R' ; SROM read + jp z,read ; if so, do it + cp 'W' ; SROM write + jp z,write ; if so, do it + ret ; this should never happen +; +; +; +test: + call confirm + ret nz +; + call fillbufseq + ld hl,0 + call test_write + ret nz + call fillbufrev + ld hl,1 + call test_write + ret nz + call fillbufseq + ld hl,510 + call test_write + ret nz + call fillbufrev + ld hl,511 + call test_write + ret nz +; + ld hl,0 + call test_read + ret nz + call checkseq + ret nz + ld hl,1 + call test_read + ret nz + call checkrev + ret nz + ld hl,510 + call test_read + ret nz + call checkseq + ret nz + ld hl,511 + call test_read + ret nz + call checkrev + ret nz +; + xor a + ret +; +; +; +test_read: + call crlf2 + ld de,str_readpage + call prtstr + call prtdecw + call clrbuf +; + call readpage + ret nz +; + ld hl,pagebuf + ld c,rom_pgsiz + call crlf + call dumpbuf +; + xor a + ret +; +; +; +test_write: + call crlf2 + ld de,str_writepage + call prtstr + call prtdecw + jp writepage +; +; +; +dump: + ld hl,(page) + call crlf2 + ld de,str_readpage + call prtstr + call prtdecw + call clrbuf +; + call readpage + ret nz +; + ld hl,pagebuf + ld c,rom_pgsiz + call crlf + call dumpbuf +; + xor a + ret +; +; +; +read: + ; Ensure output file does not exist! + ld de,fcb ; FCB pointer + ld c,15 ; BDOS open file function + call bdos ; do it + cp $FF ; failed to open? + jr z,read0 ; if so, good, continue + call read_z ; close the file + jp err_exists ; handle error +; +read0: + ; Create output file (must not exist) + ld de,fcb ; FCB pointer + ld c,22 ; BDOS create file function + call bdos ; do it + cp $FF ; error? + jp z,err_fopen ; handle file open error +; + ; SROM read / File write loop + call crlf ; formatting + ld de,pagebuf ; BDOS DMA is pagebuf + ld c,26 ; BDOS set DMA function + call bdos ; do it + ld hl,0 ; init SROM page num +; +read1: + ; Read SROM page + push hl ; save SROM page num + call readpage ; get SROM page + pop hl ; restore page num + jr nz,read_z ; bail out on error + inc hl ; inc page num +; + ; Write page to file + push hl ; save SROM page num + ld de,fcb ; point to FCB + ld c,21 ; BDOS write seq function + call bdos ; do it + pop hl ; restore page num + or a ; set flags + call nz,err_fio ; handle file I/O error + jr nz,read_z ; close file and bail out +; + ; Show progress and loop till done + call prtdot ; display progress + ld a,h ; check high byte + cp 2 ; done when we hit 512 pages + jr nz,read1 ; loop till done + xor a ; signal success +; +read_z: + ; Close file + push af ; preserve status + ld de,fcb ; FCB pointer + ld c,16 ; BDOS close file function + call bdos ; do it + pop af ; restore status +; + ret +; +; +; +write: + ; Confirm intent to overwrite SROM + call confirm ; confirm SROM overwrite + ret nz ; bail out if not confirmed +; + ; Open file + ld de,fcb ; FCB pointer + ld c,15 ; BDOS open file function + call bdos ; do it' + cp $FF ; error? + jp z,err_fopen ; handle file open error +; + ; File read / SROM write loop + call crlf ; formatting + ld de,pagebuf ; BDOS DMA is pagebuf + ld c,26 ; BDOS set DMA function + call bdos ; do it + ld hl,0 ; init SROM page num +; +write1: + ; Read page data from file + push hl ; save SROM page num + ld de,fcb ; FCB pointer + ld c,20 ; BDOS read file function + call bdos ; do it + pop hl ; restore SROM page num + or a ; set flags + call nz,err_fio ; handle file I/O error + jr nz,write_z ; close file and bail out +; + ; Write SROM page + push hl ; save SROM page num + call writepage ; write SROM page + pop hl ; restore page num + jr nz,read_z ; bail out on error + inc hl ; inc page num +; + ; Show progress and loop till done + call prtdot ; display progress + ld a,h ; check high byte + cp 2 ; done when we hit 512 pages + jr nz,write1 ; loop till done + xor a ; signal success +; +write_z: + ; Close file + push af ; preserve status + ld de,fcb ; FCB pointer + ld c,16 ; BDOS close file function + call bdos ; do it + pop af ; restore status +; + ret +; +; +; +readpage: + ; Convert page number to byte offset + add hl,hl ; * 2 + add hl,hl ; * 4 + add hl,hl ; * 8 + add hl,hl ; * 16 + add hl,hl ; * 32 + add hl,hl ; * 64 + add hl,hl ; * 128 +; + ; Read page + ld de,pagebuf + ld bc,rom_pgsiz + jp rom_read +; +; +; +writepage: + ; Convert page number to byte offset + add hl,hl ; * 2 + add hl,hl ; * 4 + add hl,hl ; * 8 + add hl,hl ; * 16 + add hl,hl ; * 32 + add hl,hl ; * 64 + add hl,hl ; * 128 +; + ; Write page + ld de,pagebuf + ld bc,rom_pgsiz + jp rom_write +; +; +; +clrbuf: + xor a +fillbuf: + push af + push bc + push de + push hl + ld hl,pagebuf + ld de,pagebuf + 1 + ld bc,rom_pgsiz - 1 + ld (hl),a + ldir + pop hl + pop de + pop bc + pop af + ret +; +; +; +fillbufseq: + push af + push bc + push de + push hl + xor a + ld b,rom_pgsiz + ld hl,pagebuf +fillbufseq1: + ld (hl),a + inc a + inc hl + djnz fillbufseq1 + pop hl + pop de + pop bc + pop af + ret +; +; +; +fillbufrev: + push af + push bc + push de + push hl + ld a,rom_pgsiz - 1 + ld b,rom_pgsiz + ld hl,pagebuf +fillbufrev1: + ld (hl),a + dec a + inc hl + djnz fillbufrev1 + pop hl + pop de + pop bc + pop af + ret +; +; +; +checkseq: + push bc + push de + push hl + xor a + ld b,rom_pgsiz + ld hl,pagebuf +checkseq1: + cp (hl) + call nz,err_verify + jr nz,checkseq_z + inc a + inc hl + djnz checkseq1 + xor a +checkseq_z: + pop hl + pop de + pop bc + ret +; +; +; +checkrev: + push bc + push de + push hl + ld a,rom_pgsiz - 1 + ld b,rom_pgsiz + ld hl,pagebuf +checkrev1: + cp (hl) + call nz,err_verify + jr nz,checkrev_z + dec a + inc hl + djnz checkrev1 + xor a +checkrev_z: + pop hl + pop de + pop bc + ret +; +; Confirm intention to overwrite SROM +; +confirm: + call crlf2 + ld de,str_confirm + call prtstr +; + ld c,10 ; CP/M read line + ld de,confirm_buf ; line buffer + call bdos ; get line from user +; + ld a,(confirm_buf + 1) ; number of chars returned + or a ; set flags + jr z,confirm1 + ld a,(confirm_buf + 2) ; get first char entered + cp 'Y' ; confirmed? + ret z ; if so, done, ZF set + cp 'y' ; lower case variant + ret z ; if so, done, ZF set +; +confirm1: + or $FF ; signal non-confirm + ret +; +;======================================================================= +; 24LC512 ROM Routines +;======================================================================= +; +; Write a buffer of data to ROM +; DE=buffer adr +; HL=ROM byte offset +; BC=buffer len +; +rom_write: + ; Move offset to buffer, convert to big endian!!! + ld a,h ; high byte + ld (adrbuf+0),a ; ... to first buffer pos + ld a,l ; low byte + ld (adrbuf+1),a ; ... to second buffer pos +; + ; Save count to HL for later + push bc ; move count from BC + pop hl ; ... to HL +; + ; Generate start condition + ld a,(romadr) ; load ROM I2C adress + rlca ; move to top 7 bits + res 0,a ; clear low bit for write + call pcf_start ; generate start + jr nz,rom_write_z ; if error, skip write +; + ; Send ROM address + push de ; save buffer pointer + push hl ; save buffer length + ld hl,2 ; 2 byte address + ld de,adrbuf ; memory address pointer + call pcf_write ; set memory pointer + pop hl ; restore buffer length + pop de ; restore buffer pointer + jr nz,rom_write_z ; if error, skip write +; + ; Write data from buffer + call pcf_write ; write the page +; +rom_write_z: + push af ; save current status + call pcf_stop ; generate stop + pop af ; restore status + ret nz ; bail out if error status +; + jr rom_write_wait ; exit via write wait +; +; +; +rom_write_wait: + ; While SROM is updating page data, it will NAK any + ; start request. Loop on start requests until an ACK is + ; received or loop timeout. + ld b,0 ; try 256 times +rom_write_wait1: + push bc ; save loop control + ld a,(romadr) ; load ROM I2C adress + rlca ; move to top 7 bits + res 0,a ; clear low bit for write + call pcf_start ; generate start + jr nz,rom_write_wait2 ; skip ahead + call pcf_waitpin ; wait for bus and get status + ;call prthex +rom_write_wait2: + push af ; save current status + call pcf_stop ; generate stop + pop af ; restore status + pop bc ; restore loop control + cp $FF ; timeout? + jp z,err_timeout ; handle timeout error + and pcf_st_lrb ; isolate LRB (ACK bit) + jr z,rom_write_wait3 ; done + djnz rom_write_wait1 ; else loop until timeout + jp err_timeout ; handle timeout +; +rom_write_wait3: + ;ld a,b + ;neg + ;call prthex + xor a ; set flags + ret ; done +; +; Read ROM data into buffer +; DE=buffer adr +; HL=ROM byte offset +; BC=buffer len +; +rom_read: + ; Move offset to buffer, convert to big endian!!! + ld a,h ; high byte + ld (adrbuf+0),a ; ... to first buffer pos + ld a,l ; low byte + ld (adrbuf+1),a ; ... to second buffer pos +; + ; Save count to HL for later + push bc ; move count from BC + pop hl ; ... to HL +; + ; Generate start condition + ld a,(romadr) ; load ROM I2C adress + rlca ; move to top 7 bits + res 0,a ; clear low bit for write + call pcf_start ; generate start + jr nz,rom_read_z ; if error, skip write +; +rom_read2: + ; Send ROM address + push de ; save buffer pointer + push hl ; save buffer length + ld hl,2 ; 2 byte address + ld de,adrbuf ; memory address pointer + call pcf_write ; set memory pointer + pop hl ; restore buffer length + pop de ; restore buffer pointer + jr nz,rom_read_z ; if error, bail out +; + ; Repeat start, switch to read + ld a,(romadr) ; load ROM I2C address + rlca ; move to top 7 bits + set 0,a ; set low bit for read + call pcf_repstart ; generate repeat start + jr nz,rom_read_z ; if error, bail out +; + ; Read data into buffer + call pcf_read ; read the page +; +rom_read_z: + push af ; save current status + call pcf_stop ; generate stop + pop af ; restore status + or a ; set flags + ret ; done +; +;======================================================================= +; PCF8584 Routines +;======================================================================= +; +; General PCF8584 initialization +; +pcf_init: + ; Select S0' (own address) 0x80 -> 0x00 + ld a,(pcf_ctl) ; ctl port + ld c,a ; to C + ld a,pcf_ctl_pin ; PCF reset, select S0' + out (c),a ; do it + nop + in a,(c) ; read status + ;call crlf2 + ;call prtsp + ;call prthex + and $7F ; remove pin bit + jp nz,err_init ; all should be zero +; + ; Set S0' (own address) 0x55 + dec c ; data port + ld a,pcf_adr ; own address + out (c),a ; set own address in S0' (own << 1) + nop + in a,(c) ; read back S0' + ;call prtsp + ;call prthex + cp pcf_adr ; correct? + jp nz,err_init ; if not, init error +; + ; Select S2 (clock) 0xA0 -> 0x20 + inc c ; ctl port + ld a,pcf_ctl_pin | pcf_ctl_es1 ; select S2 + out (c),a ; do it + nop + in a,(c) ; read status + ;call prtsp + ;call prthex + and 07fh ; remove pin bit + cp pcf_ctl_es1 ; verify S2 selected + jp nz,err_init ; it not, init error +; + ; Set S2 (clock) 0x1C + dec c ; data port + ld a,pcf_trns | pcf_clk ; load clock register s2 + out (c),a ; do it + nop + in a,(c) ; read back S2 + ;call prtsp + ;call prthex + and $1F ; only the lower 5 bits are used + cp pcf_trns | pcf_clk + jp nz,err_init +; + ; Enter idle 0xC1 + inc c ; ctl port + ld a,pcf_op_idle + out (c),a ; do it + nop + in a,(c) ; read status + ;call prtsp + ;call prthex + cp pcf_st_pin | pcf_st_bb ; expected status + jp nz,err_init +; + xor a + ret +; +; Generate an I2C start condition +; A=start byte value (slave address + r/w bit) +; +pcf_start: + ;call crlf + ;push de + ;ld de,str_start + ;call prtstr + ;pop de +; + ; Wait for I2C bus clear + ld b,a ; move start byte to B + call pcf_waitbb ; wait while bus busy + cp $FF ; timeout? + jp z,err_timeout ; timeout error return +; + ; Set start byte w/ slave address in S0 + ld a,(pcf_dat) ; data port + ld c,a ; ... into C + ;ld a,b + ;call prtsp + ;call prthex + out (c),b ; send start byte +; + ; Initiate start operation + inc c ; ctl port + ld a,pcf_op_start ; command + out (c),a ; do it +; + xor a ; signal success + ret ; done +; +; Generate an I2C repeat start condition +; A=start byte value (slave address + r/w bit) +; +pcf_repstart: + ;call crlf + ;push de + ;ld de,str_repstart + ;call prtstr + ;pop de +; + ; Send repeat start command + ld b,a ; move start byte to B + ld a,(pcf_ctl) ; control port + ld c,a ; ... into C + ld a,pcf_op_repstart ; command + out (c),a ; do it +; + ; Set start byte w/ slave address in S0 + ld a,(pcf_dat) ; data port + ld c,a ; ... into C + ;ld a,b + ;call prtsp + ;call prthex + out (c),b ; send start byte +; + xor a ; signal success + ret ; done +; +; Generate an I2C stop condition +; +pcf_stop: + ;call crlf + ;push de + ;ld de,str_stop + ;call prtstr + ;pop de +; + ld a,(pcf_ctl) ; control port + ld c,a ; ... into C + ld a,pcf_op_stop ; command + ;call prtsp + ;call prthex + out (c),a ; do it +; + xor a ; signal success + ret ; done +; +; Write bytes to I2C +; HL=byte count to write +; DE=buffer pointer +; +pcf_write: + ;push af + ;push bc + ;push de + ;push hl + ;push hl + ;push de + ;pop hl + ;call crlf + ;ld de,str_write + ;call prtstr + ;call prtsp + ;call prthexword + ;call prtsp + ;pop hl + ;call prthexword + ;call crlf + ;pop hl + ;pop de + ;pop bc + ;pop af +; +pcf_write1: + call pcf_waitack ; wait for ack + ret nz ; abort on failure +; + ld a,h ; check for + or l ; ... counter exhausted + ret z ; if so, done, exit w/ ZF set +; + ld a,(pcf_dat) ; data port + ld c,a ; ... into C + ld a,(de) ; get byte to write + ;call prtsp + ;call prthex + out (c),a ; send it +; + dec hl ; decrement byte counter + inc de ; bump buf ptr + jr pcf_write1 ; loop till done +; +; Read bytes from I2C +; HL=byte count to read +; +pcf_read: + ;push af + ;push bc + ;push de + ;push hl + ;call crlf + ;ld de,str_read + ;call prtstr + ;call prtsp + ;call prthexword + ;call crlf + ;pop hl + ;pop de + ;pop bc + ;pop af +; + ; First byte is a "dummy", must be discarded + call pcf_waitack ; wait for ack + ret nz ; abort on failure + ld a,(pcf_dat) ; data port + ld c,a ; ... into C + in a,(c) ; get dummy byte +; +pcf_read0: + call pcf_waitack ; wait for ack + ret nz ; abort on failure +; + ; Loop control + dec hl ; pre-decrement byte counter + ld a,h ; check for + or l ; ... counter exhausted - 1 + jr z,pcf_read2 ; handle end game +; +pcf_read1: + ; Get next data byte + ld a,(pcf_dat) ; data port + ld c,a ; ... into C + in a,(c) ; get next byte of ROM + ;call prtsp + ;call prthex + ld (de),a ; save byte received in buf + inc de ; bump buf pointer +; + jr pcf_read0 ; loop till done +; +pcf_read2: + ; Special treatment for final character + ld a,(pcf_ctl) ; control port + ld c,a ; ... into C + ld a,$40 ; prep for neg ack + out (c),a ; send it +; + ; Get final data byte + ld a,(pcf_dat) ; data port + ld c,a ; ... into C + in a,(c) ; get next byte of ROM + ;call prtsp + ;call prtdot + ;call prthex + ld (de),a ; save byte received in buf +; + call pcf_waitpin ; wait for PIN + cp $FF ; timeout? + jp z,err_timeout ; handle it +; + xor a ; signal success + ret ; done +; +; Wait for I2C bus to not be busy (BB = 1) +; Return PCF status in A, 0xFF for timeout +; +pcf_waitbb: + push bc ; save BC + ld a,(pcf_ctl) ; control port value + ld c,a ; ... into C + ld b,0 ; timeout counter +; +pcf_waitbb1: + in a,(c) ; get status byte + bit 0,a ; test busy bit (inverted) + jr nz,pcf_waitbb_z ; if BB=1, bus clear, return + djnz pcf_waitbb1 ; loop to keep trying + or $FF ; signal timeout +; +pcf_waitbb_z: + pop bc ; restore BC + ret ; done +; +; Wait for PIN (PIN = 0) +; Return PCF status in A, 0xFF for timeout +; +pcf_waitpin: + push bc ; save BC + ld a,(pcf_ctl) ; control port value + ld c,a ; ... into C + ld b,0 ; timeout counter +; +pcf_waitpin1: + ; Wait till done with send/receive (PIN=0) + in a,(c) ; get status byte + bit 7,a ; test PIN bit + jr z,pcf_waitpin_z ; if 0, done + djnz pcf_waitpin1 ; loop till timeout + or $FF ; signal timeout +; +pcf_waitpin_z: + pop bc ; restore BC + ret ; done +; +; Wait for slave (PIN = 0) and check for acknowledge (LRB = 0) +; Return error code +; +pcf_waitack: + call pcf_waitpin ; wait for PIN + cp $FF ; timeout? + jp z,err_timeout ; handle it + ; Evaluate response + and pcf_st_lrb ; isolate LRB bit + jp nz,err_nak ; handle NAK error + xor a ; set status + ret +; +; Error Handlers +; +err_bio: + ld a,ec_bio + jr err_ret +; +err_plt: + ld a,ec_plt + jr err_ret +; +err_usage: + ld a,ec_usage + jr err_ret +; +err_init: + ld a,ec_init + jr err_ret +; +err_timeout: + ld a,ec_timeout + jr err_ret +; +err_nak: + ld a,ec_nak + jr err_ret +; +err_fopen: + ld a,ec_fopen + jr err_ret +; +err_fio: + ld a,ec_fio + jr err_ret +; +err_exists: + ld a,ec_exists + jr err_ret +; +err_verify: + ld a,ec_verify + jr err_ret +; +err_ret: + or a ; set flags + ret +; +; +; +prterr: + push de + push hl + neg + rlca + ld hl,str_err_table + call addhla + ld e,(hl) + inc hl + ld d,(hl) + call crlf2 + call prtstr + pop hl + pop de + ret +; +;======================================================================= +; Utility Routines +;======================================================================= +; +; Identify active BIOS. RomWBW HBIOS=1, UNA UBIOS=2, else 0 +; +idbio: +; + ; Check for UNA (UBIOS) + ld a,($FFFD) ; fixed location of UNA API vector + cp $C3 ; jp instruction? + jr nz,idbio1 ; if not, not UNA + ld hl,($FFFE) ; get jp address + ld a,(hl) ; get byte at target address + cp $FD ; first byte of UNA push ix instruction + jr nz,idbio1 ; if not, not UNA + inc hl ; point to next byte + ld a,(hl) ; get next byte + cp $E5 ; second byte of UNA push ix instruction + jr nz,idbio1 ; if not, not UNA, check others +; + ld bc,$04FA ; UNA: get BIOS date and version + rst 08 ; DE := ver, HL := date +; + ld a,2 ; UNA BIOS id = 2 + ret ; and done +; +idbio1: + ; Check for RomWBW (HBIOS) + ld hl,($FFFE) ; HL := HBIOS ident location + ld a,'W' ; First byte of ident + cp (hl) ; Compare + jr nz,idbio2 ; Not HBIOS + inc hl ; Next byte of ident + ld a,~'W' ; Second byte of ident + cp (hl) ; Compare + jr nz,idbio2 ; Not HBIOS +; + ld b,bf_sysver ; HBIOS: VER function + ld c,0 ; required reserved value + rst 08 ; DE := version, L := platform id +; + ld a,1 ; HBIOS BIOS id = 1 + ret ; and done +; +idbio2: + ; No idea what this is + xor a ; Setup return value of 0 + ret ; and done + +; +; Print character in A without destroying any registers +; +prtchr: + push af ; save registers + push bc + push de + push hl + ld e,a ; character to print in E + ld c,$02 ; BDOS function to output a character + call bdos ; do it + pop hl ; restore registers + pop de + pop bc + pop af + ret +; +prtsp3: + call prtsp +prtsp2: + call prtsp +prtsp: +; + ; shortcut to print a space character preserving all regs + push af ; save af + ld a,' ' ; load dot char + call prtchr ; print it + pop af ; restore af + ret ; done +; +prtdot: +; + ; shortcut to print a dot character preserving all regs + push af ; save af + ld a,'.' ; load dot char + call prtchr ; print it + pop af ; restore af + ret ; done +; +; Uppercase character in A +; +upcase: + cp 'a' ; below 'a'? + ret c ; if so, nothing to do + cp 'z'+1 ; above 'z'? + ret nc ; if so, nothing to do + and ~$20 ; convert character to lower + ret ; done +; +; Print a zero terminated string at (de) without destroying any registers +; +prtstr: + push af + push de +; +prtstr1: + ld a,(de) ; get next char + or a + jr z,prtstr2 + call prtchr + inc de + jr prtstr1 +; +prtstr2: + pop de ; restore registers + pop af + ret +; +; Print a hex value prefix "0x" +; +prthexpre: + push af + ld a,'0' + call prtchr + ld a,'x' + call prtchr + pop af + ret +; +; Print the value in A in hex without destroying any registers +; +prthex: + call prthexpre +prthex1: + push af ; save AF + push de ; save DE + call hexascii ; convert value in A to hex chars in DE + ld a,d ; get the high order hex char + call prtchr ; print it + ld a,e ; get the low order hex char + call prtchr ; print it + pop de ; restore DE + pop af ; restore AF + ret ; done +; +; print the hex word value in hl +; +prthexword: + call prthexpre +prthexword1: + push af + ld a,h + call prthex1 + ld a,l + call prthex1 + pop af + ret +; +; print the hex dword value in de:hl +; +prthex32: + call prthexpre + push bc + push de + pop bc + call prthexword1 + push hl + pop bc + call prthexword1 + pop bc + ret +; +; Convert binary value in A to ascii hex characters in DE +; +hexascii: + ld d,a ; save A in D + call hexconv ; convert low nibble of A to hex + ld e,a ; save it in E + ld a,d ; get original value back + rlca ; rotate high order nibble to low bits + rlca + rlca + rlca + call hexconv ; convert nibble + ld d,a ; save it in D + ret ; done +; +; Convert low nibble of A to ascii hex +; +hexconv: + and $0F ; low nibble only + add a,$90 + daa + adc a,$40 + daa + ret +; +; Print value of A or HL in decimal with leading zero suppression +; Use prtdecb for A or prtdecw for HL +; +prtdecb: + push hl + ld h,0 + ld l,a + call prtdecw ; print it + pop hl + ret +; +prtdecw: + push af + push bc + push de + push hl + call prtdec0 + pop hl + pop de + pop bc + pop af + ret +; +prtdec0: + ld e,'0' + ld bc,-10000 + call prtdec1 + ld bc,-1000 + call prtdec1 + ld bc,-100 + call prtdec1 + ld c,-10 + call prtdec1 + ld e,0 + ld c,-1 +prtdec1: + ld a,'0' - 1 +prtdec2: + inc a + add hl,bc + jr c,prtdec2 + sbc hl,bc + cp e + ret z + ld e,0 + call prtchr + ret +; +; Start a new line +; +crlf2: + call crlf ; two of them +crlf: + push af ; preserve AF + ld a,13 ; + call prtchr ; print it + ld a,10 ; + call prtchr ; print it + pop af ; restore AF + ret +; +; Dump a buffer in hex and ascii +; +; HL=buffer address +; C=buffer length, 0 for 256 bytes +; Uses AF, BC, DE, HL +; + +dumpbuf: + ld de,0 ; init buffer offset +dumpbuf1: + call dumpline + ld a,d + inc a + ret z + jr dumpbuf1 +; +dumpline: + ; HL=buf ptr, DE=buf offset, C=bytes left to print + call crlf ; start line + ex de,hl ; offset in HL + call prthexword1 ; print in hex + ld a,16 ; increment + call addhla ; ... for next time + ex de,hl ; restore DE/HL + ld a,':' + call prtchr +; + ; hex byte loop, C=bytes to print + ld b,16 ; bytes per row + push bc + push hl +dumpline1: + ld a,b + cp 8 + jr nz,dumpline2 + call prtsp + ld a,'-' + call prtchr +; +dumpline2: + call prtsp + ld a,d + inc a + jr z,dumpline3 + ld a,(hl) ; get byte + inc hl ; bump position + call prthex1 ; print it + dec c + jr nz,dumpline4 + ld d,$FF ; flag end of buf + jr dumpline4 +dumpline3: + call prtsp + call prtsp +dumpline4: + djnz dumpline1 +; + call prtsp + call prtsp + ld a,'|' + call prtchr +; + ; ascii byte loop, C=bytes to print + pop hl + pop bc +dumpline5: + ld a,(hl) ; get real byte + inc hl + call dumpchar + dec c + jr z,dumpline6 ; if done, just exit loop + djnz dumpline5 +dumpline6: + ld a,'|' + call prtchr + ret +; +dumpchar: + ; Print character. Replace non-printable with '.' + cp ' ' + jr c,dumpchar1 ; first printable char is ' ' + cp '~' + 1 + jr nc,dumpchar1 ; last printable char is '~' + jp prtchr ; print and return +dumpchar1: + ld a,'.' ; replace with '.' + jp prtchr ; print and return +; +; Add hl,a +; +; A register is destroyed! +; +addhla: + add a,l + ld l,a + ret nc + inc h + ret +; +; +; +delay: + push af + push hl + ld hl,0 +delay1: + ld a,h + or l + jr nz,delay1 + pop hl + pop af + ret +; +;======================================================================= +; String Data +;======================================================================= +; +str_banner .db "I2C Serial ROM Utility v0.1, 26-Aug-2023",0 +str_hwmsg1 .db "PCF8584 Data port=",0 +str_hwmsg2 .db ", Control/Status port=",0 +str_hwmsg3 .db "",0 +str_inforead .db "Reading",0 +str_infowrite .db "Writing",0 +str_infotest .db "Testing",0 +str_infodump .db "Dumping",0 +str_infodump2 .db ", Page #",0 +str_info1 .db " Serial ROM #",0 +str_info2 .db " (I2C address ",0 +str_info3 .db ")",0 +str_exit .db "Done, Thank you for using I2C Serial ROM Utility!",0 +str_confirm .db "Serial ROM will be overwritten, continue (y/N)?",0 +str_err_ok .db "Successful completion",0 +str_err_bio .db "RomWBW BIOS required, but not present!",0 +str_err_plt .db "Hardware platform not currently supported!",0 +str_err_usage .db "Usage:", cr, lf + .db " SROM Tn Test SROM", cr, lf + .db " SROM Dn Dump SROM n (0-511)", cr, lf + .db " SROM Rn Read SROM n into ", cr, lf + .db " SROM Wn Write SROM n from ", cr, lf + .db "", cr, lf + .db " n=SROM Id (0-7)", 0 +str_err_init .db "PCF8584 failed during initialization!",0 +str_err_timeout .db "I2C protocol timeout!",0 +str_err_nak .db "Slave negative acknowledge!",0 +str_err_fopen .db "Failed to open specified file!",0 +str_err_fio .db "File input/output error!",0 +str_err_exists .db "Output file already exists!",0 +str_err_verify .db "Data mismatch during verification!",0 +str_start .db "I2C Start...",0 +str_repstart .db "I2C Repeat Start...",0 +str_stop .db "I2C Stop...",0 +str_read .db "I2C Read...",0 +str_write .db "I2C Write...",0 +str_readpage .db "Reading ROM page ",0 +str_writepage .db "Writing ROM page ",0 +str_writepage2 .db " with Data=",0 +; +str_err_table: + .dw str_err_ok + .dw str_err_bio + .dw str_err_plt + .dw str_err_usage + .dw str_err_init + .dw str_err_timeout + .dw str_err_nak + .dw str_err_fopen + .dw str_err_fio + .dw str_err_exists + .dw str_err_verify +; +;======================================================================= +; Working Data +;======================================================================= +; +stksav .dw 0 ; stack pointer saved at start + .fill stksiz,0 ; stack +stack .equ $ ; stack top +; +pcf_dat .db 0 ; PCF8584 data port +pcf_ctl .db 0 ; PCF8584 control/status port +; +func .db 0 ; Function requested: T/D/R/W +romadr .db 0 ; ROM device I2C address +page .dw 0 ; Page requested for dump +; +confirm_buf .db 3 ; 3 bytes in buffer + .db 0 ; bytes filled by BDOS + .fill 3,0 ; actual character buffer +; +fcb .fill 36,0 ; FCB +; +adrbuf .fill 2,0 ; ROM address buffer (big endian!!!) +pagebuf .fill rom_pgsiz,$55 ; ROM page buffer +; +;======================================================================= +; + .end diff --git a/Source/Apps/Test/ps2info/ps2info.asm b/Source/Apps/Test/ps2info/ps2info.asm index c11d8fb7..2acbf282 100644 --- a/Source/Apps/Test/ps2info/ps2info.asm +++ b/Source/Apps/Test/ps2info/ps2info.asm @@ -7,20 +7,24 @@ ; keyboard, and mouse. ; ; WBW 2022-03-28: Add menu driven port selection -; Add support for RHYOPHYRE +; Add support for Rhyophyre ; WBW 2022-04-01: Add menu for test functions ; WBW 2022-04-02: Fix prtchr register saving/recovery +; WBW 2023-10-19: Add support for Duodyne ; ;======================================================================= ; ; PS/2 Keyboard/Mouse controller port addresses (adjust as needed) ; -; MBC: +; Nhyodyne: iocmd_mbc .equ $E3 ; PS/2 controller command port address iodat_mbc .equ $E2 ; PS/2 controller data port address -; RPH: +; Rhyophyre: iocmd_rph .equ $8D ; PS/2 controller command port address iodat_rph .equ $8C ; PS/2 controller data port address +; Duodyne: +iocmd_duo .equ $4D ; PS/2 controller command port address +iodat_duo .equ $4C ; PS/2 controller data port address ; cpumhz .equ 8 ; for time delay calculations (not critical) ; @@ -77,10 +81,12 @@ setup1: jr z,setup1 call upcase call prtchr - cp '1' ; MBC + cp '1' ; Nhyodyne jr z,setup_mbc - cp '2' ; RHYOPHYRE + cp '2' ; Rhyophyre jr z,setup_rph + cp '3' ; Duodyne + jr z,setup_duo cp 'X' jr z,exit jr setup @@ -101,6 +107,14 @@ setup_rph: ld de,str_rph jr setup2 ; +setup_duo: + ld a,iocmd_duo + ld (iocmd),a + ld a,iodat_duo + ld (iodat),a + ld de,str_duo + jr setup2 +; setup2: call prtstr call crlf2 @@ -181,6 +195,12 @@ test_kbd: ; call ctlr_test jr nz,test_kbd_fail +; + ld a,$20 ; kbd enabled, mse disabled, no ints + call ctlr_setup + jr nz,test_kbd_fail +; + call ctlr_flush ; call test_kbd_basic jr nz,test_kbd_fail @@ -228,9 +248,13 @@ test_mse: ld a,$10 ; kbd disabled, mse enabled, no ints call ctlr_setup jr nz,test_mse_fail +; + call ctlr_flush ; call mse_reset jr nz,test_mse_fail +; + call ctlr_flush ; call mse_ident jr nz,test_mse_fail @@ -262,15 +286,21 @@ test_kbdmse: ld a,$00 ; kbd enabled, mse enabled, no ints call ctlr_setup jr nz,test_kbdmse_fail +; + call ctlr_flush ; call kbd_reset jr nz,test_kbdmse_fail +; + call ctlr_flush ; ld a,2 call kbd_setsc ; call mse_reset jr nz,test_kbdmse_fail +; + call ctlr_flush ; call mse_stream jr nz,test_kbdmse_fail @@ -290,15 +320,13 @@ test_kbdmse_fail: ; inventory the supported scan code sets. ; test_kbd_basic: - ld a,$20 ; Xlat off for this checking - call ctlr_setup - ret nz -; call kbd_reset ret nz +; + call ctlr_flush ; call kbd_ident - ;ret nz + ret nz ; ld b,3 ; Loop control, 3 scan code sets ld c,1 ; Current scan code number @@ -436,6 +464,19 @@ ctlr_setup: xor a ret ; +; Flush incoming data buffer +; +ctlr_flush: + call crlf2 + ld de,str_ctlr_flush + call prtstr +ctlr_flush1: + call delay ; small delay + call check_read ; data pending? + ret nz ; return if nothing there + call get_data_dbg ; get and discard byte + jr ctlr_flush1 ; loop +; ; Perform a keyboard reset ; kbd_reset: @@ -612,13 +653,17 @@ mse_reset: call crlf2 ld de,str_mse_reset call prtstr - ld a,$f2 ; Identify mouse command + ld a,$ff ; Identify mouse command call put_data_mse_dbg jp c,err_ctlr_to ; handle controller error call get_data_dbg jp c,err_ctlr_to ; handle controller error cp $fa ; Is it an ack as expected? jp nz,err_mse_reset + call get_data_dbg + jp c,err_ctlr_to ; handle controller error + cp $aa ; Success? + jp nz,err_mse_reset call crlf ld de,str_mse_reset_ok call prtstr @@ -634,18 +679,61 @@ mse_ident: ld a,$f2 ; Identify mouse command call put_data_mse_dbg jp c,err_ctlr_to ; handle controller error +mse_ident0: call get_data_dbg jp c,err_ctlr_to ; handle controller error + + ;cp $00 ; extraneous? + ;jr z,mse_ident0 ; ignore it, get another + cp $fa ; Is it an ack as expected? jp nz,err_mse_ident - call get_data_dbg - jp c,err_ctlr_to ; handle controller error + ; Now we need to receive 0-2 bytes. There is no way to know + ; how many are coming, so we receive bytes until there is a + ; timeout error. Timeout is shortened here so that we don't + ; have to wait seconds for the routine to complete normally. + ; A short timeout is more than sufficient here. + ld ix,workbuf + ld a,(timeout) ; save current timeout push af + ld a,stimout ; set a short timeout + ld (timeout),a + ld b,8 ; buf max + ld c,0 ; buf len +mse_ident1: + push bc + call get_data_dbg + pop bc + jr c,mse_ident2 + ld (ix),a + inc ix + inc c + djnz mse_ident1 +mse_ident2: + pop af ; restore original timeout + ld (timeout),a call crlf ld de,str_mse_ident_disp call prtstr - pop af - call prtdecb + ld a,'[' + call prtchr + ld ix,workbuf + ld a,c ; bytes to print + or a ; check for zero + jr z,mse_ident4 ; handle zero + ld b,a ; setup loop counter + jr mse_ident3a +mse_ident3: + ld a,',' + call prtchr +mse_ident3a: + ld a,(ix) + call prthex + inc ix + djnz mse_ident3 +mse_ident4: + ld a,']' + call prtchr xor a ret ; @@ -658,8 +746,13 @@ mse_stream: ld a,$f4 ; Stream packets cmd call put_data_mse_dbg jp c,err_ctlr_to ; handle controller error +mse_stream0: call get_data_dbg jp c,err_ctlr_to ; handle controller error + + ;cp $00 ; extraneous? + ;jr z,mse_stream0 ; ignore it, get another + cp $FA ; Is it an ack as expected? jp nz,err_mse_stream xor a @@ -1344,14 +1437,16 @@ delay1: ; Constants ;======================================================================= ; -str_banner .db "PS/2 Keyboard/Mouse Information v0.6a, 2-Apr-2022",0 +str_banner .db "PS/2 Keyboard/Mouse Information v0.8, 6-Nov-2023",0 str_hwmenu .db "PS/2 Controller Port Options:\r\n\r\n" - .db " 1 - MBC\r\n" - .db " 2 - RHYOPHYRE\r\n" + .db " 1 - Nhyodyne\r\n" + .db " 2 - Rhyophyre\r\n" + .db " 3 - Duodyne\r\n" .db " X - Exit Application\r\n" .db "\r\nSelection? ",0 -str_mbc .db "MBC",0 -str_rph .db "RHYOPHYRE",0 +str_mbc .db "Nhyodyne",0 +str_rph .db "Rhyophyre",0 +str_duo .db "Duodyne",0 str_menu .db "PS/2 Testing Options:\r\n\r\n" .db " C - Test PS/2 Controller\r\n" .db " K - Test PS/2 Keyboard\r\n" @@ -1382,6 +1477,7 @@ str_trans_off .db "***** Testing Keyboard with Scan Code Translation DISABLED * str_trans_on .db "***** Testing Keyboard with Scan Code Translation ENABLED *****",0 str_basic_mse .db "***** Basic Mouse Tests *****",0 str_kbdmse .db "***** Test All Devices Combined *****",0 +str_ctlr_flush .db "Flushing controller input buffer",0 str_kbd_reset .db "Attempting Keyboard Reset",0 str_kbd_reset_ok .db "Keyboard Reset OK",0 str_err_kbd_reset .db "Keyboard Reset Failed",0 diff --git a/Source/Apps/Tune/tune.asm b/Source/Apps/Tune/tune.asm index d5f05cb6..be886658 100644 --- a/Source/Apps/Tune/tune.asm +++ b/Source/Apps/Tune/tune.asm @@ -629,6 +629,9 @@ CFGTBL: ; PLT RSEL RDAT RIN Z180 ACR ; .DB 13, $A0, $A1, $A0, $FF, $A2 ; MBC .DW HWSTR_MBC +; + .DB 17, $A0, $A1, $A0, $FF, $A2 ; DUODYNE + .DW HWSTR_DUO ; .DB $FF ; END OF TABLE MARKER ; @@ -682,6 +685,7 @@ HWSTR_RCEB6 .DB "RCBus Sound Module (EBv6)",0 HWSTR_RCMF .DB "RCBus Sound Module (MF)",0 HWSTR_LINC .DB "Z50 LiNC Sound Module",0 HWSTR_MBC .DB "NHYODYNE Sound Module",0 +HWSTR_DUO .DB "DUODYNE Sound Module",0 MSGUNSUP .db "MYM files not supported with HBIOS yet!\r\n", 0 diff --git a/Source/Apps/XM/xmdm125.asm b/Source/Apps/XM/xmdm125.asm index e735b618..3340633d 100644 --- a/Source/Apps/XM/xmdm125.asm +++ b/Source/Apps/XM/xmdm125.asm @@ -720,12 +720,17 @@ NOBYE: LXI H,FCB+1 ; Get primary option ; Send option processor ; Single option: "K" - force 1k mode ; - INX H ; Look for a 'K' + CALL SNDOPC + CALL SNDOPC + JMP ALLSET +SNDOPC:INX H ; Look for an option MOV A,M CPI ' ' ; Is it a space? - JZ ALLSET ; Then we're ready to send... - CPI 'K' - JNZ OPTERR ; "K" is the only setable 2nd option + JNZ CHKK + POP PSW + JMP ALLSET +CHKK: CPI 'K' + JNZ CHK6TH ; If it's not K it should be a port number LDA MSPEED CPI MINKSP ; If less than MINKSP bps, ignore 1k JC ALLSET ; Request @@ -733,7 +738,7 @@ NOBYE: LXI H,FCB+1 ; Get primary option STA KFLAG ; First, force us to 1K mode CALL ILPRT DB '(1k protocol selected)',CR,LF,0 - JMP ALLSET ; That's it for send... + RET ; That's it for send... ; ; Receive option processor ; 3 or 4 options: "X" - disable auto-protocol select @@ -5789,4 +5794,4 @@ BDPTOS EQU 83 ; Print Time on System ENDIF ; BYEBDOS ; END - \ No newline at end of file + diff --git a/Source/Apps/assign.asm b/Source/Apps/assign.asm index 757859f4..7bc6d154 100644 --- a/Source/Apps/assign.asm +++ b/Source/Apps/assign.asm @@ -30,11 +30,13 @@ ; 2021-12-06 [WBW] Fix inverted ROM/RAM DPB mapping in buffer alloc ; 2022-02-28 [WBW] Use HBIOS to swap banks under CP/M 3 ; Use CPM3 BDOS direct BIOS call to get DRVTBL adr +; 2023-06-19 [WBW] Update for revised DIODEVICE API +; 2023-09-19 [WBW] Added CHUSB & CHSD device support +; 2023-10-13 [WBW] Fixed DPH creation to select correct DPB ;_______________________________________________________________________________ ; ; ToDo: -; 1) Do something to prevent assigning slices when device does not support them -; 2) ASSIGN C: causes drive map to be reinstalled unnecessarily +; 1) ASSIGN C: causes drive map to be reinstalled unnecessarily ;_______________________________________________________________________________ ; ;=============================================================================== @@ -664,10 +666,10 @@ makdphwbw: ; determine appropriate dpb (WBW mode, unit number in A) jr makdph0 ; jump ahead makdph00: ld e,6 ; assume floppy - cp $10 ; floppy? + cp $01 ; floppy? jr z,makdph0 ; yes, jump ahead ld e,3 ; assume ram floppy - cp $20 ; ram floppy? + cp $02 ; ram floppy? jr z,makdph0 ; yes, jump ahead ld e,4 ; everything else is assumed to be hard disk jr makdph0 ; yes, jump ahead @@ -1065,10 +1067,6 @@ drvmap1: ; loop through device table looking for a match drvmap2: ; convert index to device type id ld a,c ; index to accum - rlca ; move it to upper nibble - rlca ; ... - rlca ; ... - rlca ; ... ld (device),a ; save as device id ; ; loop thru hbios units looking for device type/unit match @@ -1308,10 +1306,6 @@ prtdev: rst 08 ; call hbios, D := device, E := unit push de ; save results ld a,d ; device to A - rrca ; isolate high nibble (device) - rrca ; ... - rrca ; ... - rrca ; ... into low nibble and $0F ; mask out undesired bits push hl ; save HL add a,a ; multiple A by two for word table @@ -1405,12 +1399,11 @@ chkdev: ; HBIOS variant ; get device/unit info ld b,$17 ; hbios func: diodevice ld c,a ; unit to C - rst 08 ; call hbios, D := device, E := unit - ld a,d ; device to A + rst 08 ; call hbios, C := device attributes ; ; check slice support - cp $30 ; A has device/unit, in hard disk range? - jr c,chkdev1 ; if not hard disk, check slice val + bit 5,c ; high capacity device? + jr z,chkdev1 ; if not high cap, check slice val xor a ; otherwise, signal OK ret ; @@ -1918,11 +1911,11 @@ dev06 .db "SD",0 dev07 .db "PRPSD",0 dev08 .db "PPPSD",0 dev09 .db "HDSK",0 -dev10 .equ devunk -dev11 .equ devunk -dev12 .equ devunk -dev13 .equ devunk -dev14 .equ devunk +dev10 .db "PPA",0 +dev11 .db "IMM",0 +dev12 .db "SYQ",0 +dev13 .db "CHUSB",0 +dev14 .db "CHSD",0 dev15 .equ devunk ; devcnt .equ 10 ; 10 devices defined @@ -1943,13 +1936,13 @@ stack .equ $ ; stack top ; Messages ; indent .db " ",0 -msgban1 .db "ASSIGN v1.5 for RomWBW CP/M ",0 +msgban1 .db "ASSIGN v1.8 for RomWBW CP/M ",0 msg22 .db "2.2",0 msg3 .db "3",0 -msbban2 .db ", 28-Feb-2022",0 +msbban2 .db ", 13-Oct-2023",0 msghb .db " (HBIOS Mode)",0 msgub .db " (UBIOS Mode)",0 -msgban3 .db "Copyright 2021, Wayne Warthen, GNU GPL v3",0 +msgban3 .db "Copyright 2023, Wayne Warthen, GNU GPL v3",0 msguse .db "Usage: ASSIGN D:[=[{D:|[]:[]}]][,...]",13,10 .db " ex. ASSIGN (display all active assignments)",13,10 .db " ASSIGN /? (display version and usage)",13,10 diff --git a/Source/Apps/cpuspd/cpuspd.asm b/Source/Apps/cpuspd/cpuspd.asm index 722131c4..86f63e0a 100644 --- a/Source/Apps/cpuspd/cpuspd.asm +++ b/Source/Apps/cpuspd/cpuspd.asm @@ -189,9 +189,9 @@ show_spd: ld b,BF_SYSGET ld c,BF_SYSGET_CPUINFO rst 08 - jp nz,err_not_sup + jp nz,err_api call crlf2 - ld (cpu_spd),de ; save CPU speed for now + push de ; save CPU speed for now push bc ; Oscillator speed to HL pop hl ld de,str_spacer @@ -199,10 +199,18 @@ show_spd: call prtd3m ; print it ld de,str_oscspd call prtstr + call crlf + ld de,str_cpuspd + call prtstr + pop hl ; recover CPU speed + call prtd3m ; print it + ld de,str_mhz + call prtstr +; ld b,BF_SYSGET ld c,BF_SYSGET_CPUSPD rst 08 - jp nz,err_not_sup + ret nz ; no CPU speed info, done push de ; save wait states for now ld a,l ld de,str_slow @@ -216,11 +224,6 @@ show_spd: jr z,show_spd1 jp err_invalid show_spd1: - call crlf - call prtstr - ld hl,(cpu_spd) ; recover CPU speed - call prtd3m - ld de,str_cpuspd call prtstr pop hl ld a,h ; memory wait states @@ -284,6 +287,9 @@ err_not_sup: err_invalid: ld de,str_err_invalid jr err_ret +err_api: + ld de,str_err_api + jr err_ret ; err_ret: call crlf2 @@ -659,21 +665,24 @@ delay1: ; Constants ;======================================================================= ; -str_banner .db "RomWBW CPU Speed Selector v0.5, 2-Feb-2022",0 +str_banner .db "RomWBW CPU Speed Selector v0.6, 29-Dec-2023",0 str_spacer .db " ",0 str_oscspd .db " MHz Oscillator",0 -str_slow .db " CPU speed is HALF (",0 -str_full .db " CPU speed is FULL (",0 -str_dbl .db " CPU speed is DOUBLE (",0 -str_cpuspd .db " MHz)",0 +str_cpuspd .db " CPU speed is ",0 +str_mhz .db " MHz",0 + +str_slow .db " (Half)",0 +str_full .db " (Full)",0 +str_dbl .db " (Double)",0 str_memws .db " Memory Wait State(s)",0 str_iows .db " I/O Wait State(s)",0 str_err_una .db " ERROR: UNA not supported by application",0 str_err_inv .db " ERROR: Invalid BIOS (signature missing)",0 str_err_ver .db " ERROR: Unexpected HBIOS version",0 str_err_parm .db " ERROR: Parameter error (CPUSPD /? for usage)",0 -str_err_not_sup .db " ERROR: Platform or configuration not supported!",0 +str_err_not_sup .db " ERROR: Platform or configuration does not support CPU speed configuration!",0 str_err_invalid .db " ERROR: Invalid configuration!",0 +str_err_api .db " ERROR: HBIOS API error!",0 str_usage .db " Usage: CPUSPD ,,\r\n" .db "\r\n" .db " : \"Half\", \"Full\", or \"Double\"\r\n" @@ -693,7 +702,6 @@ stack .equ $ ; stack top ; ; tmpstr .fill 9,0 ; temp string (8 chars, 0 term) -cpu_spd .dw 0 ; current cpu speed new_cpu_spd .db $FF ; new CPU speed new_ws_mem .db $FF ; new memory wait states new_ws_io .db $FF ; new I/O wait states diff --git a/Source/Apps/rtc.asm b/Source/Apps/rtc.asm index b0a7fe44..c49157f5 100644 --- a/Source/Apps/rtc.asm +++ b/Source/Apps/rtc.asm @@ -31,6 +31,8 @@ ; ;[2022/03/27] v1.8 Support RHYOPHYRE ; +;[2023/07/07] v1.9 Support DUODYNE +; ; Constants ; mask_data .EQU %10000000 ; RTC data line @@ -49,6 +51,7 @@ PORT_DYNO .EQU $0C ; RTC port for DYNO PORT_RCZ280 .EQU $C0 ; RTC port for RCZ280 PORT_MBC .EQU $70 ; RTC port for MBC PORT_RPH .EQU $84 ; RTC port for RHYOPHYRE +PORT_DUO .EQU $94 ; RTC port for DUODYNE BDOS .EQU 5 ; BDOS invocation vector @@ -1079,61 +1082,66 @@ HINIT: LD C,PORT_SBC LD DE,PLT_SBC CP $01 ; SBC - JR Z,RTC_INIT2 + JP Z,RTC_INIT2 CP $02 ; ZETA - JR Z,RTC_INIT2 + JP Z,RTC_INIT2 CP $03 ; ZETA 2 - JR Z,RTC_INIT2 + JP Z,RTC_INIT2 ; LD C,PORT_N8 LD DE,PLT_N8 CP $04 ; N8 - JR Z,RTC_INIT2 + JP Z,RTC_INIT2 ; LD C,PORT_MK4 LD DE,PLT_MK4 CP $05 ; Mark IV - JR Z,RTC_INIT2 + JP Z,RTC_INIT2 ; LD C,PORT_RCZ80 LD DE,PLT_RCZ80 CP $07 ; RCBus w/ Z80 - JR Z,RTC_INIT2 + JP Z,RTC_INIT2 ; LD C,PORT_RCZ180 LD DE,PLT_RCZ180 CP $08 ; RCBus w/ Z180 - JR Z,RTC_INIT2 + JP Z,RTC_INIT2 ; LD C,PORT_EZZ80 LD DE,PLT_EZZ80 CP $09 ; Easy Z80 - JR Z,RTC_INIT2 + JP Z,RTC_INIT2 ; LD C,PORT_SCZ180 LD DE,PLT_SCZ180 CP $0A ; SCZ180 - JR Z,RTC_INIT2 + JP Z,RTC_INIT2 ; LD C,PORT_DYNO LD DE,PLT_DYNO CP 11 ; DYNO - JR Z,RTC_INIT2 + JP Z,RTC_INIT2 ; LD C,PORT_RCZ280 LD DE,PLT_RCZ280 CP 12 ; RCZ280 - JR Z,RTC_INIT2 + JP Z,RTC_INIT2 ; LD C,PORT_MBC LD DE,PLT_MBC CP 13 ; MBC - JR Z,RTC_INIT2 + JP Z,RTC_INIT2 ; LD C,PORT_RPH LD DE,PLT_RPH CP 14 ; RHYOPHYRE - JR Z,RTC_INIT2 + JP Z,RTC_INIT2 +; + LD C,PORT_DUO + LD DE,PLT_DUO + CP 17 ; DUODYNE + JP Z,RTC_INIT2 ; ; Unknown platform LD DE,PLTERR ; BIOS error message @@ -1630,7 +1638,7 @@ TESTING_BIT_DELAY_OVER: RTC_HELP_MSG: .DB 0Ah, 0Dh ; line feed and carriage return - .TEXT "RTC: Version 1.8" + .TEXT "RTC: Version 1.9" .DB 0Ah, 0Dh ; line feed and carriage return .TEXT "Commands: E)xit T)ime st(A)rt S)et R)aw L)oop C)harge N)ocharge D)elay I)nit G)et P)ut B)oot W)arm-start H)elp" .DB 0Ah, 0Dh ; line feed and carriage return @@ -1760,6 +1768,7 @@ PLT_DYNO .TEXT ", DYNO RTC Module Latch Port 0x0C\r\n$" PLT_RCZ280 .TEXT ", RCBus Z280 RTC Module Latch Port 0xC0\r\n$" PLT_MBC .TEXT ", MBC RTC Latch Port 0x70\r\n$" PLT_RPH .TEXT ", RHYOPHYRE RTC Latch Port 0x84\r\n$" +PLT_DUO .TEXT ", DUODYNE RTC Latch Port 0x70\r\n$" ; ; Generic FOR-NEXT loop algorithm diff --git a/Source/BPBIOS/Build.cmd b/Source/BPBIOS/Build.cmd index 184aafec..b83df0c4 100644 --- a/Source/BPBIOS/Build.cmd +++ b/Source/BPBIOS/Build.cmd @@ -3,8 +3,8 @@ setlocal pushd ZCPR33 && call Build || exit /b & popd -set PATH=%PATH%;..\..\Tools\zxcc;..\..\Tools\cpmtools; - +set TOOLS=..\..\Tools +set PATH=%PATH%;%TOOLS%\zxcc;%TOOLS%\cpmtools; set CPMDIR80=%TOOLS%/cpm/ call :makebp 33 @@ -48,7 +48,8 @@ if exist bp%VER%.prn del bp%VER%.prn || exit /b ren bpbio-ww.prn bp%VER%.prn || exit /b if exist bp%VER%.err del bp%VER%.err || exit /b ren bpbio-ww.err bp%VER%.err || exit /b -copy bpbio-ww.rel bp%VER%.rel || exit /b +if exist bp%VER%.rel del bp%VER%.rel || exit /b +ren bpbio-ww.rel bp%VER%.rel || exit /b rem pause diff --git a/Source/BPBIOS/Makefile b/Source/BPBIOS/Makefile index 852cb5c7..fd405b9f 100644 --- a/Source/BPBIOS/Makefile +++ b/Source/BPBIOS/Makefile @@ -1,44 +1,37 @@ VERSIONS = \ - 33t 33tbnk \ - 33n 33nbnk \ - 34t 34tbnk \ - 34n 34nbnk \ - 41tbnk 41nbnk + 33 33bnk \ + 33 33bnk \ + 34 34bnk \ + 34 34bnk \ + 41bnk -HD0IMG = ../../Binary/hd_bp.img IMGFILES = $(foreach ver,$(VERSIONS),bp$(ver).img) DISTFILES = *.zex *.rel myterm.z3t -OTHERS = zcpr33n.rel zcpr33t.rel \ - bpbio-ww.rel bpsys.dat bpsys.bak bpbio-ww.err def-ww.lib *.img +OTHERS = zcpr33.rel bp*.prn bp*.rel \ + bpbio-ww.rel bpsys.dat bpsys.bak bpbio-ww.err def-ww.lib bp*.img TOOLS = ../../Tools SUBDIRS = ZCPR33 include $(TOOLS)/Makefile.inc -$(HD0IMG): $(IMGFILES) - if [ -f $(HD0IMG) ] ; then \ - for f in $(IMGFILES) $(DISTFILES) ; do \ - $(BINDIR)/cpmrm -f wbw_hd0 $(HD0IMG) 0:$$f ; \ - done ; \ - $(CPMCP) -f wbw_hd0 $(HD0IMG) $(IMGFILES) $(DISTFILES) 0: ; \ - fi - -zcpr33n.rel zcpr33t.rel: +zcpr33.rel: (cd ZCPR33 ; make) -all:: $(HD0IMG) +all:: $(IMGFILES) -clean:: - @rm -f $(HD0IMG) +# clean:: +# $(MAKE) --directory ZCPR3 clean -%.img: zcpr33n.rel zcpr33t.rel +%.img: zcpr33.rel $(eval VER := $(subst .img,,$(subst bp,,$@))) cp def-ww-z$(VER).lib def-ww.lib rm -f bpbio-ww.rel $(ZXCC) ZMAC -BPBIO-WW -/P mv bpbio-ww.prn bp$(VER).prn + if [ -f bpbio-ww.err ] ; then mv bpbio-ww.err bp$(VER).err; fi + mv bpbio-ww.rel bp$(VER).rel cp bp$(VER).dat bpsys.dat $(ZXCC) ./bpbuild.com -bpsys.dat 0 < bpbld1.rsp cp bpsys.img bpsys.dat diff --git a/Source/BPBIOS/ZCPR33/Build.cmd b/Source/BPBIOS/ZCPR33/Build.cmd index fbfb43f8..e246c353 100644 --- a/Source/BPBIOS/ZCPR33/Build.cmd +++ b/Source/BPBIOS/ZCPR33/Build.cmd @@ -1,8 +1,8 @@ @echo off setlocal -set PATH=%PATH%;..\..\..\Tools\zxcc;..\..\..\Tools\cpmtools; - +set TOOLS=..\..\..\Tools +set PATH=%PATH%;%TOOLS%\zxcc;%TOOLS%\cpmtools; set CPMDIR80=%TOOLS%/cpm/ copy ..\z3base.lib . || exit /b diff --git a/Source/BPBIOS/ZCPR33/Makefile b/Source/BPBIOS/ZCPR33/Makefile index eca179f1..c4eee7f4 100644 --- a/Source/BPBIOS/ZCPR33/Makefile +++ b/Source/BPBIOS/ZCPR33/Makefile @@ -1,5 +1,5 @@ -OBJECTS = zcpr33n.rel zcpr33t.rel -OTHERS = z3basen.lib z3baset.lib +OBJECTS = zcpr33.rel +OTHERS = z3base.lib *.prn *.rel TOOLS = ../../../Tools DEST = .. @@ -7,12 +7,7 @@ include $(TOOLS)/Makefile.inc DIFFPATH = $(DIFFTO)/Source/BPBIOS -zcpr33t.rel: ../z3baset.lib - cp ../z3baset.lib z3baset.lib - $(ZXCC) ZMAC -zcpr33t.z80 -/P - rm z3baset.lib - -zcpr33n.rel: ../z3basen.lib - cp ../z3basen.lib z3basen.lib - $(ZXCC) ZMAC -zcpr33n.z80 -/P - rm z3basen.lib +zcpr33.rel: ../z3base.lib + cp ../z3base.lib z3base.lib + $(ZXCC) ZMAC -zcpr33.z80 -/P + rm z3base.lib diff --git a/Source/BPBIOS/cboot-ww.z80 b/Source/BPBIOS/cboot-ww.z80 index 9e5c31a9..d8dee6fd 100644 --- a/Source/BPBIOS/cboot-ww.z80 +++ b/Source/BPBIOS/cboot-ww.z80 @@ -102,6 +102,9 @@ CBOOT: ; BPCNFG to configure a generic IMG file for specific Hard Drive Partitions. CBOOT0: + LD BC,HBF_SYSRES_INT ; HB Func: Internal Reset + CALL HBX_INVOKE ; Do it + LD HL,BRAME ; Get end of banked RAM LD (HISAV),HL ; and save for later use IF HARDDSK diff --git a/Source/BPBIOS/deblock.z80 b/Source/BPBIOS/deblock.z80 index 35dc4cbd..9f6a5bec 100644 --- a/Source/BPBIOS/deblock.z80 +++ b/Source/BPBIOS/deblock.z80 @@ -268,16 +268,15 @@ MATCH: LD A,(SECMSK) ; Get the sector mask ; ; Modified to use HBIOS host buffer ; - ; HSTBUF is always in HBIOS bank where I/O is done - LD A,(TPABNK) ; TPA BANK - DEC A ; HBIOS bank is one below - LD C,A + ; HSTBUF is always in HBIOS bank where I/O is actually done + LD A,(HB_BNKBIOS) ; HBIOS bank id + LD C,A ; Set Read Source Bank IF BANKED - LD A,(DMABNK) ; Set Read Destination Bank + LD A,(DMABNK) ; Read Destination Bank ELSE - LD A,(TPABNK) ; Set Read Destination Bank + LD A,(TPABNK) ; Read Destination Bank ENDIF - LD B,A + LD B,A ; Set Read Destination Bank LD A,(READOP) ; Direction? OR A JR NZ,OKBNKS ; ..jump if read diff --git a/Source/BPBIOS/def-ww-z33.lib b/Source/BPBIOS/def-ww-z33.lib index d5b833ad..a9cf430f 100644 --- a/Source/BPBIOS/def-ww-z33.lib +++ b/Source/BPBIOS/def-ww-z33.lib @@ -133,8 +133,8 @@ BNK1 EQU BID_COM ; Second TPA Bank (Common Bank) 48000H BNK2 EQU BID_SYS ; System Bank (BIOS, DOS, CPR) 50000H BNKU EQU 00H ; User Area Bank 58000H ; (set to 0 to disable) -BNK3 EQU BID_RAMD ; First Bank for RAM disk 60000H -BNKM EQU BID_RAMM ; Maximum Bank # F8000H +BNK3 EQU BID_BUF ; First Bank for RAM disk 60000H +BNKM EQU BID_BUF ; Maximum Bank # F8000H IF NO ; REMOVE CODE - NOT NEEDED WITH HBIOS makes a ; nice resource for Z180 programing in general diff --git a/Source/BPBIOS/def-ww-z33bnk.lib b/Source/BPBIOS/def-ww-z33bnk.lib index aaae6bf8..1f8a0942 100644 --- a/Source/BPBIOS/def-ww-z33bnk.lib +++ b/Source/BPBIOS/def-ww-z33bnk.lib @@ -133,8 +133,8 @@ BNK1 EQU BID_COM ; Second TPA Bank (Common Bank) 48000H BNK2 EQU BID_SYS ; System Bank (BIOS, DOS, CPR) 50000H BNKU EQU 00H ; User Area Bank 58000H ; (set to 0 to disable) -BNK3 EQU BID_RAMD ; First Bank for RAM disk 60000H -BNKM EQU BID_RAMM ; Maximum Bank # F8000H +BNK3 EQU BID_BUF ; First Bank for RAM disk 60000H +BNKM EQU BID_BUF ; Maximum Bank # F8000H IF NO ; REMOVE CODE - NOT NEEDED WITH HBIOS makes a ; nice resource for Z180 programing in general diff --git a/Source/BPBIOS/def-ww-z34.lib b/Source/BPBIOS/def-ww-z34.lib index d848a30b..262c731b 100644 --- a/Source/BPBIOS/def-ww-z34.lib +++ b/Source/BPBIOS/def-ww-z34.lib @@ -133,8 +133,8 @@ BNK1 EQU BID_COM ; Second TPA Bank (Common Bank) 48000H BNK2 EQU BID_SYS ; System Bank (BIOS, DOS, CPR) 50000H BNKU EQU 00H ; User Area Bank 58000H ; (set to 0 to disable) -BNK3 EQU BID_RAMD ; First Bank for RAM disk 60000H -BNKM EQU BID_RAMM ; Maximum Bank # F8000H +BNK3 EQU BID_BUF ; First Bank for RAM disk 60000H +BNKM EQU BID_BUF ; Maximum Bank # F8000H IF NO ; REMOVE CODE - NOT NEEDED WITH HBIOS makes a ; nice resource for Z180 programing in general diff --git a/Source/BPBIOS/def-ww-z34bnk.lib b/Source/BPBIOS/def-ww-z34bnk.lib index d67f369a..6a5a693e 100644 --- a/Source/BPBIOS/def-ww-z34bnk.lib +++ b/Source/BPBIOS/def-ww-z34bnk.lib @@ -133,8 +133,8 @@ BNK1 EQU BID_COM ; Second TPA Bank (Common Bank) 48000H BNK2 EQU BID_SYS ; System Bank (BIOS, DOS, CPR) 50000H BNKU EQU 00H ; User Area Bank 58000H ; (set to 0 to disable) -BNK3 EQU BID_RAMD ; First Bank for RAM disk 60000H -BNKM EQU BID_RAMM ; Maximum Bank # F8000H +BNK3 EQU BID_BUF ; First Bank for RAM disk 60000H +BNKM EQU BID_BUF ; Maximum Bank # F8000H IF NO ; REMOVE CODE - NOT NEEDED WITH HBIOS makes a ; nice resource for Z180 programing in general diff --git a/Source/BPBIOS/def-ww-z41bnk.lib b/Source/BPBIOS/def-ww-z41bnk.lib index 29d10136..e8e28a1b 100644 --- a/Source/BPBIOS/def-ww-z41bnk.lib +++ b/Source/BPBIOS/def-ww-z41bnk.lib @@ -133,8 +133,8 @@ BNK1 EQU BID_COM ; Second TPA Bank (Common Bank) 48000H BNK2 EQU BID_SYS ; System Bank (BIOS, DOS, CPR) 50000H BNKU EQU 00H ; User Area Bank 58000H ; (set to 0 to disable) -BNK3 EQU BID_RAMD ; First Bank for RAM disk 60000H -BNKM EQU BID_RAMM ; Maximum Bank # F8000H +BNK3 EQU BID_BUF ; First Bank for RAM disk 60000H +BNKM EQU BID_BUF ; Maximum Bank # F8000H IF NO ; REMOVE CODE - NOT NEEDED WITH HBIOS makes a ; nice resource for Z180 programing in general diff --git a/Source/BPBIOS/diskdefs b/Source/BPBIOS/diskdefs index 81d962cc..f29deca1 100644 --- a/Source/BPBIOS/diskdefs +++ b/Source/BPBIOS/diskdefs @@ -310,6 +310,32 @@ diskdef wbw_rom1024 os 2.2 end +# RomWBW 512KB RAM (256KB reserved, 256KB RAM Disk) + +diskdef wbw_ram512 + seclen 512 + tracks 8 + sectrk 64 + blocksize 2048 + maxdir 256 + skew 0 + boottrk 0 + os 2.2 +end + +# RomWBW 1024KB RAM (256KB reserved, 768KB RAM Disk) + +diskdef wbw_ram1024 + seclen 512 + tracks 24 + sectrk 64 + blocksize 2048 + maxdir 256 + skew 0 + boottrk 0 + os 2.2 +end + # RomWBW 720K floppy media diskdef wbw_fd720 diff --git a/Source/BPBIOS/dpbhd-ww.lib b/Source/BPBIOS/dpbhd-ww.lib index fbb53a5d..0a0b961f 100644 --- a/Source/BPBIOS/dpbhd-ww.lib +++ b/Source/BPBIOS/dpbhd-ww.lib @@ -46,7 +46,7 @@ ; NOTE: No Skew Table needed since Hard Disk Format is locked w/No Skew ;..... -; Currently, BPBIOS supports 2 memory drive devices and 3 phyical hard +; Currently, BPBIOS supports 2 memory drive devices and 3 physical hard ; drive like devices. BPBIOS can support seven but unfortunately ; BPCNFG only supports 3 hard drive like devices and the source ; code is not available, so menu 4 is meaningless. Devices @@ -64,26 +64,22 @@ ; ; Starting with ver 2.8 of HBIOS, devices are discovered at boot ; time and assigned device numbers. Since devices are tested in -; a certain order, the device numbers are somewhat predicably +; a certain order, the device numbers are somewhat predictably ; assigned. Memory drives are discovered first. IDE drives are ; discovered next so that IDE Hard drives including CF cards are ; assigned device 2 and device 3 if a slave drive is supported by ; the interface. Next comes the SD drive and is assigned device 3 ; or 4 depending on the whether there is an ide slave drive. -; USB drive is assigned device 4 or 5 . For SIMH HDSK0 is device 0 +; USB drive is assigned device 4 or 5. For SIMH HDSK0 is device 0 ; and HDSK1 is device 1. Memory drives are now handled as LBA ; devices, ie like hard drives. ; ; The following non-memory drive capacities and configurations used for -; the SIMH, SD and IDE drives: Slice geometry is 256, 512 byte sectors, -; 1 head per track and 1 with one reserved track, a block size of 4096 -; bytes with 512 directory entries. An equivalent geometry is 16 -; sectors and 16 heads per track. Internally BPBIOS uses a uniform -; logical organization with 64 logical records per logical track. -; Thus there are 16 logical tracks per physical track with 1040 -; logical (65 physical) tracks per slice. If all partitions are not -; physically present, the missing partitions can be disabled in the -; BPBCNFG configuration file or by hand. Note that HBIOS uses LBA, +; the SIMH, SD and IDE drives: Track geometry is 16 512 byte sectors. +; A slice is exactly 64 tracks, with 1 of the 64 tracks as a system +; track. There are 1024 directory entries per slice. If all partitions +; are not physically present, the missing partitions can be disabled in +; the BPBCNFG configuration file or by hand. Note that HBIOS uses LBA, ; Logical Block Addressing, for non-floppy drives. ; ; For SBC V1,2, ZETA, MARK IV and N8, the following non-memory partitions @@ -94,26 +90,26 @@ ; partition Size Blocks Block Offset in ; MByte Size logical tracks ;==================================================================== -; C 8 2048 4096 1*16 = 16 -; D 8 2048 4096 (1+65)*16 = 1056 -; E 8 2048 4096 (1+2*65)*16 = 2096 -; F 8 2048 4096 (1+3*65)*16 = 3136 -; G 8 2048 4096 (1+4*65)*16 = 4176 -; H 8 2048 4096 (1+5*65)*16 = 5216 -; I 8 2048 4096 (1+6*65)*16 = 6256 -; J 8 2048 4096 (1+7*65)*16 = 7296 +; C 8 2044 4096 128+(1024*0)+2 = 130 +; D 8 2044 4096 128+(1024*1)+2 = 1154 +; E 8 2044 4096 128+(1024*2)+2 = 2178 +; F 8 2044 4096 128+(1024*3)+2 = 3202 +; G 8 2044 4096 128+(1024*4)+2 = 4226 +; H 8 2044 4096 128+(1024*5)+2 = 5250 +; I 8 2044 4096 128+(1024*6)+2 = 6274 +; J 8 2044 4096 128+(1024*7)+2 = 7298 ; ; These are capacities and configurations used for SD card: ; ; partition Size Blocks Block Offset ; MByte Size logical tracks ;==================================================================== -; K 8 2048 4096 1*16 = 16 -; L 8 2048 4096 (1+65)*16 = 1056 -; M 8 2048 4096 (1+2*65)*16 = 2096 -; N 8 2048 4096 (1+3*65)*16 = 3136 +; K 8 2044 4096 128+(1024*0)+2 = 130 +; L 8 2044 4096 128+(1024*1)+2 = 1154 +; M 8 2044 4096 128+(1024*2)+2 = 2178 +; N 8 2044 4096 128+(1024*3)+2 = 3202 ; -; RAM drive is paritition A while ROM drive is partition B. +; RAM drive is partition A while ROM drive is partition B. ; ; For example, a typical Memory drive configuration is: ; @@ -199,17 +195,17 @@ DPBROM: DEFW 64 ; Sectors/Track ; even though real layout is 256 physical ; sectors per track DEFB 0 ; Physical tracks/side (No Meaning in HD) -HSIZ0 EQU 2048 ; # of blocks in first Partition (1024 trks) +HSIZ0 EQU 2048 - 4 ; # of blocks in first Partition (1022 trks) ; DPB50: DEFW 64 ; Sctrs/Trk DEFB 5 ; Blk Shf Fctr DEFB 31 ; Block Mask DEFB 1 ; Extent Mask - DEFW HSIZ0-1 ; Disk Size-1 - DEFW 511 ; Dir Max-1 - 4 blocks - DEFB 0F0H,0 ; Alloc 0,1 - 4 blocks + DEFW HSIZ0-1 ; Disk Size-1 + DEFW 1024-1 ; Dir Max-1 + DEFB 0FFH,0 ; Alloc 0,1 DEFW 0 ; Check Size - DEFW 16 ; Trk Offset + DEFW 128+(1024*0)+2 ; Trk Offset ENDIF ; ;..... @@ -226,17 +222,17 @@ DPB50: DEFW 64 ; Sctrs/Trk ; sectors per track DEFB 0 ; Physical tracks/side (No Meaning in HD) -HSIZ1 EQU 2048 ; # of blocks in Second Partition (1024 trks) +HSIZ1 EQU 2048 - 4 ; # of blocks in Second Partition (1022 trks) ; DPB51: DEFW 64 ; Scts/Trk DEFB 5 ; Blk Shf Fctr DEFB 31 ; Block Mask DEFB 1 ; Extent Mask DEFW HSIZ1-1 ; Disk Size-1 - DEFW 511 ; Dir Max-1 4 blocks - DEFB 0F0H,0 ; Alloc 0,1 + DEFW 1024-1 ; Dir Max-1 + DEFB 0FFH,0 ; Alloc 0,1 DEFW 0 ; Check size - DEFW (1+65)*16 ; Track offset 1056 + DEFW 128+(1024*1)+2 ; Trk Offset ENDIF ; ;..... @@ -253,21 +249,21 @@ DPB51: DEFW 64 ; Scts/Trk ; sectors per track DEFB 0 ; Physical tracks/side (No Meaning in HD) -HSIZ2 EQU 2048 ; # of blocks in third Partition (1024 tracks) +HSIZ2 EQU 2048 - 4 ; # of blocks in Second Partition (1022 trks) ; DPB52: DEFW 64 ; Scts/Trk DEFB 5 ; Blk Shf Fctr DEFB 31 ; Block Mask DEFB 1 ; Extent Mask DEFW HSIZ2-1 ; Disk Size-1 - DEFW 511 ; Dir Max-1 4 blocks - DEFB 0F0H,0 ; Alloc 0,1 + DEFW 1024-1 ; Dir Max-1 + DEFB 0FFH,0 ; Alloc 0,1 DEFW 0 ; Check size - DEFW (1+2*65)*16 ; Track offset = 2096 + DEFW 128+(1024*2)+2 ; Trk Offset ENDIF ; ;..... -; Partition F. HBIOS Disk 0, Slice 4 +; Partition F. HBIOS Disk 0, Slice 3 IF DRV_F DEFB 'HBDSK0:3 ','F'+80H ; Id - 10 bytes @@ -280,17 +276,17 @@ DPB52: DEFW 64 ; Scts/Trk ; sectors per track DEFB 0 ; Physical tracks/side (No Meaning in HD) -HSIZ3 EQU 2048 ; # of blocks in Fourth Partition (1024 tracks) +HSIZ3 EQU 2048 - 4 ; # of blocks in Second Partition (1022 trks) ; DPB53: DEFW 64 ; Scts/Trk DEFB 5 ; Blk Shf Fctr DEFB 31 ; Block Mask DEFB 1 ; Extent Mask DEFW HSIZ3-1 ; Disk Size-1 - DEFW 511 ; Dir Max-1 4 blocks - DEFB 0F0H,0 ; Alloc 0,1 + DEFW 1024-1 ; Dir Max-1 + DEFB 0FFH,0 ; Alloc 0,1 DEFW 0 ; Check size - DEFW (1+3*65)*16 ; Track offset = 3136 + DEFW 128+(1024*3)+2 ; Trk Offset ENDIF ; ;..... @@ -307,17 +303,17 @@ DPB53: DEFW 64 ; Scts/Trk ; sectors per track DEFB 0 ; Physical tracks/side (No Meaning in HD) -HSIZ4 EQU 2048 ; # of blocks in first Partition (1024 trks) +HSIZ4 EQU 2048 - 4 ; # of blocks in Second Partition (1022 trks) ; DPB54: DEFW 64 ; Sctrs/Trk DEFB 5 ; Blk Shf Fctr DEFB 31 ; Block Mask DEFB 1 ; Extent Mask DEFW HSIZ4-1 ; Disk Size - 1 - DEFW 511 ; Dir Max-1 4 blocks - DEFB 0F0H,0 ; Alloc 0,1 + DEFW 1024-1 ; Dir Max-1 + DEFB 0FFH,0 ; Alloc 0,1 DEFW 0 ; Check size - DEFW (1+4*65)*16 ; Track offset = 16 + DEFW 128+(1024*4)+2 ; Trk Offset ENDIF ; ;..... @@ -334,17 +330,17 @@ DPB54: DEFW 64 ; Sctrs/Trk ; sectors per track DEFB 0 ; Physical tracks/side (No Meaning in HD) -HSIZ5 EQU 2048 ; # of blocks in Second Partition (1024 trks) +HSIZ5 EQU 2048 - 4 ; # of blocks in Second Partition (1022 trks) ; DPB55: DEFW 64 ; Sctrs/Trk - actually 256 DEFB 5 ; Blk Shf Fctr DEFB 31 ; Block Mask DEFB 1 ; Extent Mask DEFW HSIZ5-1 ; Disk Size-1 - DEFW 511 ; Dir Max-1 - DEFB 0F0H,0 ; Alloc 0,1 - 4 blocks + DEFW 1024-1 ; Dir Max-1 + DEFB 0FFH,0 ; Alloc 0,1 DEFW 0 ; Check Size - DEFW (1+5*65)*16 ; Trk Offset = 1056 + DEFW 128+(1024*5)+2 ; Trk Offset ENDIF ; ;..... @@ -361,17 +357,17 @@ DPB55: DEFW 64 ; Sctrs/Trk - actually 256 ; sectors per track DEFB 0 ; Physical tracks/side (No Meaning in HD) -HSIZ6 EQU 2048 ; # of blocks in third Partition (1024 tracks) +HSIZ6 EQU 2048 - 4 ; # of blocks in Second Partition (1022 trks) ; DPB56: DEFW 64 ; Scts/Trk DEFB 5 ; Blk Shf Fctr DEFB 31 ; Block Mask DEFB 1 ; Extent Mask DEFW HSIZ6-1 ; Disk Size-1 - DEFW 511 ; Dir Max-1 4 blocks - DEFB 0F0H,0 ; Alloc 0,1 + DEFW 1024-1 ; Dir Max-1 + DEFB 0FFH,0 ; Alloc 0,1 DEFW 0 ; Check size - DEFW (1+6*65)*16 ; Track offset = 2096 + DEFW 128+(1024*6)+2 ; Trk Offset ENDIF ;..... @@ -388,17 +384,17 @@ DPB56: DEFW 64 ; Scts/Trk ; sectors per track DEFB 0 ; Physical tracks/side (No Meaning in HD) -HSIZ7 EQU 2048 ; # of blocks in Fourth Partition (1024 tracks) +HSIZ7 EQU 2048 - 4 ; # of blocks in Second Partition (1022 trks) ; DPB57: DEFW 64 ; Scts/Trk DEFB 5 ; Blk Shf Fctr DEFB 31 ; Block Mask DEFB 1 ; Extent Mask DEFW HSIZ7-1 ; Disk Size-1 - DEFW 511 ; Dir Max-1 4 blocks - DEFB 0F0H,0 ; Alloc 0,1 + DEFW 1024-1 ; Dir Max-1 + DEFB 0FFH,0 ; Alloc 0,1 DEFW 0 ; Check size - DEFW (1+7*65)*16 ; Track offset = 3136 + DEFW 128+(1024*7)+2 ; Trk Offset ENDIF ; ;..... @@ -414,17 +410,18 @@ DPB57: DEFW 64 ; Scts/Trk ; even though real layout is 256 physical ; sectors per track DEFB 0 ; Physical tracks/side (No Meaning in HD) -HSIZ8 EQU 2048 ; # of blocks in first Partition (1024 trks) + +HSIZ8 EQU 2048 - 4 ; # of blocks in Second Partition (1022 trks) ; DPB58: DEFW 64 ; Sctrs/Trk DEFB 5 ; Blk Shf Fctr DEFB 31 ; Block Mask DEFB 1 ; Extent Mask DEFW HSIZ8-1 ; Disk Size-1 - DEFW 511 ; Dir Max-1 - 4 blocks - DEFB 0F0H,0 ; Alloc 0,1 - 4 blocks + DEFW 1024-1 ; Dir Max-1 + DEFB 0FFH,0 ; Alloc 0,1 DEFW 0 ; Check Size - DEFW 16 ; Trk Offset + DEFW 128+(1024*0)+2 ; Trk Offset ENDIF ; ;..... @@ -441,17 +438,17 @@ DPB58: DEFW 64 ; Sctrs/Trk ; sectors per track DEFB 0 ; Physical tracks/side (No Meaning in HD) -HSIZ9 EQU 2048 ; # of blocks in Second Partition (1024 trks) +HSIZ9 EQU 2048 - 4 ; # of blocks in Second Partition (1022 trks) ; DPB59: DEFW 64 ; Scts/Trk DEFB 5 ; Blk Shf Fctr DEFB 31 ; Block Mask DEFB 1 ; Extent Mask DEFW HSIZ9-1 ; Disk Size-1 - DEFW 511 ; Dir Max-1 4 blocks - DEFB 0F0H,0 ; Alloc 0,1 + DEFW 1024-1 ; Dir Max-1 + DEFB 0FFH,0 ; Alloc 0,1 DEFW 0 ; Check size - DEFW (1+65)*16 ; Track offset 1056 + DEFW 128+(1024*1)+2 ; Trk Offset ENDIF ; ;..... @@ -468,17 +465,17 @@ DPB59: DEFW 64 ; Scts/Trk ; sectors per track DEFB 0 ; Physical tracks/side (No Meaning in HD) -HSIZ10 EQU 2048 ; # of blocks in Second Partition (1024 trks) +HSIZ10 EQU 2048 - 4 ; # of blocks in Second Partition (1022 trks) ; DPB60: DEFW 64 ; Scts/Trk DEFB 5 ; Blk Shf Fctr DEFB 31 ; Block Mask DEFB 1 ; Extent Mask - DEFW HSIZ10 ; Disk Size-1 - DEFW 511 ; Dir Max-1 4 blocks - DEFB 0F0H,0 ; Alloc 0,1 + DEFW HSIZ10-1 ; Disk Size-1 + DEFW 1024-1 ; Dir Max-1 + DEFB 0FFH,0 ; Alloc 0,1 DEFW 0 ; Check size - DEFW (1+2*65)*16 ; Track offset 2096 + DEFW 128+(1024*2)+2 ; Trk Offset ENDIF ; ;..... @@ -492,18 +489,17 @@ DPB60: DEFW 64 ; Scts/Trk DEFB 16 ; Logical Sectors per track DEFB 0 ; Physical tracks/side (No Meaning in HD) -HSIZ11 EQU 2048 ; # of blocks in Forth Logical Drive - ; (1024 tracks) +HSIZ11 EQU 2048 - 4 ; # of blocks in Second Partition (1022 trks) DPB61: DEFW 64 ; Scts/Trk DEFB 5 ; Blk Shf Fctr DEFB 31 ; Block Mask DEFB 1 ; Extent Mask DEFW HSIZ11-1 ; Disk Size-1 - DEFW 511 ; Dir Max-1 - DEFB 0F0H,0 ; Alloc 0,1 + DEFW 1024-1 ; Dir Max-1 + DEFB 0FFH,0 ; Alloc 0,1 DEFW 0 ; Check size - DEFW (1+3*65)*16 ; Track offset 3136 + DEFW 128+(1024*3)+2 ; Trk Offset ENDIF ;=========== End of Hard Disk DPBs =========== diff --git a/Source/BPBIOS/hard-ww.z80 b/Source/BPBIOS/hard-ww.z80 index 133520f6..b5943ac7 100644 --- a/Source/BPBIOS/hard-ww.z80 +++ b/Source/BPBIOS/hard-ww.z80 @@ -183,7 +183,6 @@ HDSK_RW1: POP BC ; RESTORE INCOMING FUNCTION, DEVICE/UNIT RET NZ ; ABORT IF SEEK RETURNED AN ERROR W/ ERROR IN A LD HL,(HB_DSKBUF) ; GET BUFFER ADDRESS - ;LD D,BID_HB ; BUFFER IN HBIOS BANK LD A,(HB_BNKBIOS) ; BUFFER IN HBIOS BANK LD D,A ; PUT IN D LD E,1 ; ONE SECTOR diff --git a/Source/BPBIOS/hbios.z80 b/Source/BPBIOS/hbios.z80 index aeacf43a..2d0acf90 100644 --- a/Source/BPBIOS/hbios.z80 +++ b/Source/BPBIOS/hbios.z80 @@ -9,6 +9,7 @@ HBF_ALLOC EQU 0F6H ; HBIOS Func: ALLOCATE Heap Memory HBF_PEEK EQU 0FAH ; HBIOS Func: Peek Byte HBF_POKE EQU 0FBH ; HBIOS Func: Poke Byte +HBF_SYSRES_INT EQU 0F000H ; HBIOS Func: Internal Reset HBF_MEMINFO EQU 0F8F1H ; HBIOS Func: Get Memory Info HBF_BNKINFO EQU 0F8F2H ; HBIOS Func: Get Bank Info ; @@ -43,22 +44,23 @@ HBX_CPYLEN EQU 0FFE8H ; call here, make required changes, then update the ; BIOSJT to point directly to the normal SELMEM routine for ; all subsequent calls. +; +; When called, the incoming bank id will be the original hard-coded +; bank id prior to any adjustments. These original bank id's are +; coded to be an offset from the ending HBIOS RAM bank id which +; is (80h + RAM banks). See romwbw.lib. We update the requested +; bank id for this initial call to make it the proper absolute +; HBIOS bank id. +; +; See romwbw.lib for additional RAM bank layout information. - ; BPBIOS HBIOS Typical - ; ------------ -------------- -------------- - ; -1: BID_COM 90h - 1 = 8Fh - ; -2: TPABNK BID_USR 90h - 2 = 8Eh - ; -3: BID_BIOS 90h - 3 = 8Dh - ; -4: SYSBNK BID_AUX 90h - 4 = 8Ch - ; -9: BNKM BID_AUX-5 90h - 9 = 87h - ; -16: RAMBNK RAMD0 90h - 16 = 80h - HB_SELMEM: - PUSH AF PUSH BC PUSH DE PUSH HL + PUSH AF ; Save incoming bank request + IF HB_DEBUG AND FALSE CALL PRTSTRD DEFB '[HB_SELMEM: $' @@ -68,23 +70,30 @@ HB_SELMEM: ENDIF LD BC,HBF_BNKINFO ; HBIOS BNKINFO function - CALL HBX_INVOKE ; DO IT, D=BID_BIOS, E=BID_USER - LD A,D ; BID_BIOS - LD (HB_BNKBIOS),A ; SET HB_BNKBIOS - ADD A,3 ; HBIOS + 3 - LD (HB_BNKEND),A ; ... is the ending RAM bank - IF BANKED - LD (BNKADJ+1),A ; Dynamically update SELBNK - ENDIF - + CALL HBX_INVOKE ; Do it, D=BIOS bank, E=USER (TPA) bank + LD A,D ; BIOS bank + LD (HB_BNKBIOS),A ; Save it for later (deblock & hard-ww) + LD A,E ; USER (TPA) bank + LD (TPABNK),A ; Update BP register + DEC A ; SYS bank is one below USER + LD (SYSBNK),A ; Update BP register + DEC A ; HBIOS BUF bank is one more below + ;LD (UABNK),A ; Set BPBIOS USER bank + LD (RAMBNK),A ; Update BP RAM disk bank register + LD (MAXBNK),A ; Update ending bank register + LD HL,SELMEM ; Future SELMEM calls will LD (BIOSJT+(27*3)+1),HL ; ... go to real SELMEM + POP BC ; Recover requested bank to B + LD A,(TPABNK) ; Get TPA bank + ADD 2 ; Offset to ending RAM bank id + ADD B ; Adjust for incoming request + POP HL POP DE POP BC - POP AF - JP SELMEM + JP SELMEM ; Continue to normal SELMEM ;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ; Move Data - Possibly between banks. This resembles CP/M 3, but @@ -97,15 +106,10 @@ HB_SELMEM: ;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: HB_MOVE: - PUSH HL - LD HL,HB_BNKEND LD A,(HB_SRCBNK) - ADD A,(HL) ; Adjust for HBIOS bank ids LD (HBX_SRCBNK),A LD A,(HB_DSTBNK) - ADD A,(HL) ; Adjust for HBIOS bank ids LD (HBX_DSTBNK),A - POP HL CALL HBX_BNKCPY PUSH HL LD HL,(TPABNK) ; Get TPA Bank # @@ -141,6 +145,5 @@ HB_XMOVE: HB_SRCBNK: DEFS 1 ; Move Source Bank # HB_DSTBNK: DEFS 1 ; Move Destination Bank # HB_BNKBIOS: DEFS 1 ; Bank id of HBIOS bank -HB_BNKEND: DEFS 1 ; End of available RAM banks (last bank + 1) HB_DSKBUF: DEFS 2 ; Address of physical disk buffer in HBIOS bank  \ No newline at end of file diff --git a/Source/BPBIOS/ibmv-ww.z80 b/Source/BPBIOS/ibmv-ww.z80 index 2c984758..8e388268 100644 --- a/Source/BPBIOS/ibmv-ww.z80 +++ b/Source/BPBIOS/ibmv-ww.z80 @@ -115,10 +115,22 @@ SELMEM: LD (USRBNK),A ; Update user bank ; Must preserve all Registers including Flags. ; All Bank Switching MUST be done by this routine ;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +; +; Parameter to BNKADJ (ADD) is set dynamically at initialization. SELBNK: PUSH AF ; Save regs SELBN0: LD (CURBNK),A ; Save as current bank # -BNKADJ: ADD A,90H ; Adjust for HBIOS bank ids + + IF HB_DEBUG AND FALSE + + CALL PRTSTRD + DEFB '[SELBNK: $' + CALL PRTHEXBYTE + CALL PRTSTRD + DEFB ']$' + + ENDIF + CALL HBX_BNKSEL POP AF ; restore regs RET @@ -172,7 +184,7 @@ FRGETB: PUSH BC ; Save BC PUSH DE ; Save DE LD B,0FAH ; HBIOS Peek function - LD D,C ; Bank in D + LD D,C CALL HBX_INVOKE ; Do it LD A,E ; Value to A POP DE ; Restore DE @@ -203,8 +215,8 @@ FRPUTB: PUSH BC ; Save BC PUSH DE ; Save DE LD B,0FBH ; HBIOS Poke function - LD D,C ; Bank in D LD E,A ; Value in E + LD D,C CALL HBX_INVOKE ; Do it POP DE ; Restore DE POP BC ; Restore BC diff --git a/Source/BPBIOS/romwbw.lib b/Source/BPBIOS/romwbw.lib index 36cc0d2c..dcecd53d 100644 --- a/Source/BPBIOS/romwbw.lib +++ b/Source/BPBIOS/romwbw.lib @@ -48,20 +48,33 @@ DRV_P SET NO ; YES if system has flopy drives ; ; RAM/ROM Bank Reserve ; -HB_RAMRESV EQU 8 ; RAM reserve is 8 banks +HB_RAMRESV EQU 5 ; RAM reserve is 5 banks HB_ROMRESV EQU 4 ; ROM reserve is 4 banks ; ; Layout of RAM banks ; -; TODO: Query system via HBIOS API to determine the actual bank -; assignments, then adjust BPBIOS operation accordingly. -; -BID_RAMD EQU -16 ; 90h - 16 = 80h -BID_RAMM EQU -9 ; 90h - 9 = 87h -BID_SYS EQU -4 ; 90h - 4 = 8Ch -BID_HB EQU -3 ; 90h - 3 = 8Dh -BID_USR EQU -2 ; 90h - 2 = 8Eh -BID_COM EQU -1 ; 90h - 1 = 8Fh +; The BID_xxx values below are used to set the initial values of +; the BPBIOS bank registers (see def-ww-xxx.lib and HB_SELMEM in +; hbios.z80). The running values of the BPBIOS bank registers (TPABNK, +; SYSBNK, etc.) are set to absolute HBIOS bank ids in hbios.z80 during +; startup. +; +; The values below are expressed as an offset from the ending HBIOS +; RAM bank id. They map to HBIOS bank ids +; by subtracting from the ending HBIOS bank id (N). HBIOS RAM bank ids +; start at 80h. The ending HBIOS bank id is (80h + RAM banks). The +; typical layout assumes 16 banks of RAM starting at HBIOS bank id 80h +; and ending at bank id 90h (N = 90h). +; +; BPBIOS HBIOS (TYPICAL) +; -------------------------------------- --------------- +; 80h (80h) +; 81h (81h) +; N - 5 (8Bh) +BID_BUF EQU -4 ; BNK3 -> RAMBNK N - 4 (8Ch) +BID_SYS EQU -3 ; BNK2 -> SYSBNK N - 3 (8Dh) +BID_USR EQU -2 ; BNK0 -> TPABNK N - 2 (8Eh) +BID_COM EQU -1 ; BNK1 -> N - 1 (8Fh) ; HB_EI MACRO EI diff --git a/Source/Build.cmd b/Source/Build.cmd index e349a4d1..dd462f12 100644 --- a/Source/Build.cmd +++ b/Source/Build.cmd @@ -4,11 +4,13 @@ setlocal :: call BuildDoc || exit /b call BuildProp || exit /b call BuildShared || exit /b -:: call BuildBP || exit /b +call BuildBP || exit /b call BuildImages || exit /b call BuildROM %* || exit /b call BuildZRC || exit /b -call BuildZZRC || exit /b +call BuildZ1RCC || exit /b +call BuildZZRCC || exit /b +call BuildZRC512 || exit /b if "%1" == "dist" ( call Clean || exit /b diff --git a/Source/BuildShared.cmd b/Source/BuildShared.cmd index 8b7e0442..533a1473 100644 --- a/Source/BuildShared.cmd +++ b/Source/BuildShared.cmd @@ -4,6 +4,7 @@ setlocal pushd HDIAG && call Build || exit /b & popd pushd CBIOS && call Build || exit /b & popd pushd CPM22 && call Build || exit /b & popd +pushd QPM && call Build || exit /b & popd pushd ZCPR && call Build || exit /b & popd pushd ZCPR-DJ && call Build || exit /b & popd pushd ZSDOS && call Build || exit /b & popd diff --git a/Source/BuildZ1RCC.cmd b/Source/BuildZ1RCC.cmd new file mode 100644 index 00000000..9970f9b0 --- /dev/null +++ b/Source/BuildZ1RCC.cmd @@ -0,0 +1,4 @@ +@echo off +setlocal + +pushd Z1RCC && call Build || exit /b & popd diff --git a/Source/BuildZRC512.cmd b/Source/BuildZRC512.cmd new file mode 100644 index 00000000..e5ef866c --- /dev/null +++ b/Source/BuildZRC512.cmd @@ -0,0 +1,4 @@ +@echo off +setlocal + +pushd ZRC512 && call Build || exit /b & popd diff --git a/Source/BuildZZRC.cmd b/Source/BuildZZRC.cmd deleted file mode 100644 index 4f5d2fa1..00000000 --- a/Source/BuildZZRC.cmd +++ /dev/null @@ -1,4 +0,0 @@ -@echo off -setlocal - -pushd ZZRC && call Build || exit /b & popd diff --git a/Source/BuildZZRCC.cmd b/Source/BuildZZRCC.cmd new file mode 100644 index 00000000..9179615b --- /dev/null +++ b/Source/BuildZZRCC.cmd @@ -0,0 +1,4 @@ +@echo off +setlocal + +pushd ZZRCC && call Build || exit /b & popd diff --git a/Source/CBIOS/cbios.asm b/Source/CBIOS/cbios.asm index 8eef64f2..b12d859f 100644 --- a/Source/CBIOS/cbios.asm +++ b/Source/CBIOS/cbios.asm @@ -1350,7 +1350,6 @@ DSK_SELECT1A: LD B,BF_DIODEVICE ; HBIOS FUNC: REPORT DEVICE INFO RST 08 ; GET UNIT INFO, DEVICE TYPE IN D LD A,D ; DEVICE TYPE -> A - AND $F0 ; ISOLATE HIGH BITS CP DIODEV_FD ; FLOPPY? JR NZ,DSK_SELECT1B ; IF NOT, DO LBA IO LD HL,SEKLBA+3 ; POINT TO HIGH ORDER BYTE @@ -1511,8 +1510,8 @@ DSK_MBR3: ; DSK_MBR4: ; IF BOOT FROM PARTITION, USE NEW SECTORS PER SLICE VALUE - LD HL,16384 ; NEW SECTORS PER SLICE - LD (SPS),HL ; SAVE IT + LD HL,16384 ; NEW SECTORS PER SLICE + LD (SPS),HL ; SAVE IT ; UPDATE MEDIA ID LD A,MID_HDNEW ; NEW MEDIA ID @@ -1520,20 +1519,80 @@ DSK_MBR4: ; DSK_MBR5: ; ADJUST LBA OFFSET BASED ON TARGET SLICE - LD A,(SLICE) ; GET SLICE, A IS LOOP CNT - LD HL,(SEKLBA) ; SET DE:HL - LD DE,(SEKLBA+2) ; ... TO STARTING LBA - LD BC,(SPS) ; SECTORS PER SLICE -DSK_MBR6: - OR A ; SET FLAGS TO CHECK LOOP CNTR - JR Z,DSK_MBR8 ; DONE IF COUNTER EXHAUSTED - ADD HL,BC ; ADD ONE SLICE TO LOW WORD - JR NC,DSK_MBR7 ; CHECK FOR CARRY - INC DE ; IF SO, BUMP HIGH WORD -DSK_MBR7: - DEC A ; DEC LOOP DOWNCOUNTER - JR DSK_MBR6 ; AND LOOP + LD A,(SLICE) ; GET SLICE, A IS LOOP CNT + LD HL,(SEKLBA) ; SET DE:HL + LD DE,(SEKLBA+2) ; ... TO STARTING LBA + LD BC,(SPS) ; SECTORS PER SLICE + RES 7,D ; CLEAR LBA MODE BIT +DSK_MBR6: + OR A ; SET FLAGS TO CHECK LOOP CNTR + JR Z,DSK_MBR8 ; DONE IF COUNTER EXHAUSTED + ADD HL,BC ; ADD ONE SLICE TO LOW WORD + JR NC,DSK_MBR7 ; CHECK FOR CARRY + INC DE ; IF SO, BUMP HIGH WORD +DSK_MBR7: + DEC A ; DEC LOOP DOWNCOUNTER + JR DSK_MBR6 ; AND LOOP DSK_MBR8: + ; LBA OFFSET OF DESIRED SLICE IS NOW IN DE:HL + ; NEED TO CHECK IF THE SLICE IS BEYOND CAPACITY OF MEDIA + ; IF LBA_OFF + SPS >= DSK_CAP, ERROR! +; + ; SAVE LBA_OFF + PUSH DE ; MSW + PUSH HL ; LSW +; + ; ADD SPS TO COMPUTE LBA_REQ + LD BC,(SPS) ; SECTORS PER SLICE + ADD HL,BC ; ADD ONE SLICE TO LOW WORD + JR NC,DSK_MBR9 ; CHECK FOR CARRY + INC DE ; IF SO, BUMP HIGH WORD +DSK_MBR9: + ; SAVE CAP_REQ + LD (CAP_REQ),HL ; LSW + LD (CAP_REQ+2),DE ; MSW +; +#IFDEF PLTWBW + ; GET DSK_CAP (DE:HL) + LD B,BF_DIOCAP ; HBIOS DISK CAPACITY FUNC + LD A,(SEKUNIT) ; DISK UNIT NUMBER + LD C,A ; ... INTO C + RST 08 ; HBIOS CALL (DE:HL = CAPACITY) +#ENDIF +; +#IFDEF PLTUNA + ; GET DSK_CAP (DE:HL) + LD C,$45 ; UBIOS DISK INFO FUNC + LD A,(SEKUNIT) ; DISK UNIT NUMBER + LD B,A ; ... INTO B + RST 08 ; CALL UNA (DE:HL = CAPACITY) +#ENDIF +; + ; SAVE DSK_CAP (DE:HL) + PUSH DE ; SAVE DSK_CAP (MSW) + PUSH HL ; SAVE DSK_CAP (LSW) +; + ; CHECK DSK_CAP >= CAP_REQ, CF SET ON OVERFLOW + ; NO NEED SAVE ACTUAL RESULT + OR A ; CLEAR CARRY FOR SBC + POP HL ; DSK_CAP LSW + LD DE,(CAP_REQ) ; CAP_REQ LSW + SBC HL,DE ; DSK_CAP - LBA_REQ (LSW) + POP HL ; DSK_CAP MSW + LD DE,(CAP_REQ+2) ; CAP_REQ MSW + SBC HL,DE ; DSK_CAP - LBA_REQ (MSW) +; + ; RESTORE LBA_OFF + POP HL ; LSW + POP DE ; MSW +; + ; ABORT ON OVERFLOW WITH ERROR! + JR NC,DSK_MBR10 ; IF NO OVERFLOW, CONTINUE + OR $FF ; SIGNAL ERROR + RET ; DONE +; +DSK_MBR10: + ; FINALIZE SLICE LBA SET 7,D ; SET LBA ACCESS FLAG ; RESAVE IT LD (SEKLBA),HL ; LOWORD @@ -1758,6 +1817,7 @@ CCPBUF .DW 0 ; ADDRESS OF CCP BUF IN BIOS BANK MEDID .DB 0 ; TEMP STORAGE FOR MEDIA ID SLICE .DB 0 ; CURRENT SLICE SPS .DW 0 ; SECTORS PER SLICE +CAP_REQ .DW 0,0 ; LBA CAP REQUIRED FOR SLICE STKSAV .DW 0 ; TEMP SAVED STACK POINTER ; #IFDEF PLTWBW @@ -2291,8 +2351,8 @@ INIT2: LD C,(HL) ; PUT UNIT NUM IN C RST 08 ; CALL HBIOS LD A,C ; GET ATTRIBUTES - AND %00111000 ; ISOLATE TYPE BITS - CP %00101000 ; TYPE = RAM? + AND %10001111 ; ISOLATE TYPE BITS + CP %00000101 ; NOT FLOPPY, TYPE = RAM? JR NZ,INIT2X ; IF NOT THEN DONE ; ; CHECK IF SECOND UNIT IS ROM OR FLASH @@ -2303,10 +2363,10 @@ INIT2: LD C,(HL) ; PUT UNIT NUM IN C RST 08 ; CALL HBIOS LD A,C ; GET ATTRIBUTES - AND %00111000 ; ISOLATE TYPE BITS - CP %00100000 ; TYPE = ROM? + AND %10001111 ; ISOLATE TYPE BITS + CP %00000100 ; NOT FLOPPY, TYPE = ROM? JR Z,INIT2A ; IF SO, ADJUST DEF DRIVE - CP %00111000 ; TYPE = FLASH? + CP %00000111 ; NOT FLOPPY, TYPE = FLASH? JR NZ,INIT2X ; IF NOT THEN DONE ; INIT2A: @@ -2529,24 +2589,21 @@ MD_INIT: ; UDPATE THE RAM/ROM DPB STRUCTURES BASED ON HARDWARE ; #IFDEF PLTWBW - ; TODO: HANDLE DISABLED RAM/ROM DISK BETTER. - ; IF RAM OR ROM DISK ARE DISABLED, BELOW WILL STILL - ; TRY TO ADJUST THE DPB BASED ON RAM BANK CALCULATIONS. - ; IT SHOULD NOT MATTER BECAUSE THE DPB SHOULD NEVER BE - ; USED. IT WOULD BE BETTER TO GET RAMD0/ROMD0 AND - ; RAMDN/ROMDN FROM THE HCB AND USE THOSE TO CALC THE - ; DPB ADJUSTMENT. IF DN-D0=0, BYPASS ADJUSTMENT. - LD A,(HCB + HCB_ROMBANKS) ; ROM BANK COUNT - SUB 4 ; REDUCE BANK COUNT BY RESERVED PAGES - LD IX,DPB_ROM ; ADDRESS OF DPB - CALL MD_INIT1 ; FIX IT UP -; - LD A,(HCB + HCB_RAMBANKS) ; RAM BANK COUNT - SUB 8 ; REDUCE BANK COUNT BY RESERVED PAGES - LD IX,DPB_RAM ; ADDRESS OF DPB - CALL MD_INIT1 ; FIX IT UP -; - JR MD_INIT4 ; DONE + ; NOTE: ROM AND/OR RAM DISK MAY NOT BE ACTIVE, BUT WE GO + ; AHEAD AND UPDATE BOTH DPBS ANYWAY. IT CAUSES NO HARM SINCE + ; INACTIVE RAM/ROM DISK WILL NEVER BE ACCESSED. +; + ; ROM DISK + LD A,(HCB + HCB_ROMD_BNKS) ; ROM DISK SIZE IN BANKS + LD IX,DPB_ROM ; ADDRESS OF DPB + CALL MD_INIT1 ; FIX IT UP +; + ; RAM DISK + LD A,(HCB + HCB_RAMD_BNKS) ; RAM DISK SIZE IN BANKS + LD IX,DPB_RAM ; ADDRESS OF DPB + CALL MD_INIT1 ; FIX IT UP +; + JR MD_INIT4 ; DONE ; MD_INIT1: ; @@ -2904,52 +2961,51 @@ DRV_INIT: LD HL,DRVLST ; INIT HL PTR TO DRIVE LIST ; DRV_INIT2: + PUSH BC ; SAVE LOOP CNT & UNIT CALL DRV_INIT3 ; CHECK DRIVE + POP BC ; RECOVER LOOP CNT & UNIT INC C ; NEXT UNIT DJNZ DRV_INIT2 ; LOOP - LD A,D ; TOTAL DEVICE COUNT TO D + LD A,D ; TOTAL DEVICE COUNT TO A LD (DRVLSTC),A ; SAVE THE COUNT JR DRV_INIT4 ; CONTINUE ; DRV_INIT3: + ; GET DEVICE ATTRIBUTES PUSH DE ; SAVE DE (HARD DISK VOLUME COUNTER) PUSH HL ; SAVE DRIVE LIST PTR PUSH BC ; SAVE LOOP CONTROL LD B,BF_DIODEVICE ; HBIOS FUNC: REPORT DEVICE INFO RST 08 ; CALL HBIOS, UNIT TO C - LD A,D ; DEVICE TYPE TO A + LD A,C ; DEVICE ATTRIBUTES TO A POP BC ; RESTORE LOOP CONTROL POP HL ; RESTORE DRIVE LIST PTR POP DE ; RESTORE DE - CP DIODEV_IDE ; HARD DISK DEVICE? - JR NC,DRV_INIT3A ; IF SO, HANDLE SPECIAL - LD (HL),C ; SAVE UNIT NUM IN LIST - INC HL ; BUMP PTR - INC D ; INC TOTAL DEVICE COUNT - RET + LD B,A ; ATTRIBUTES TO B ; -DRV_INIT3A: - ; CHECK FOR ACTIVE AND RETURN IF NOT + ; IF DEVICE IS NOT REMOVABLE, THEN CHECK TO ENSURE IT IS + ; ACTUALLY ONLINE. IF NOT, SKIP UNIT ENTIRELY. + BIT 6,B ; REMOVABLE? + JR NZ,DRV_INIT3A ; IF SO, SKIP MEDIA CHECK PUSH DE ; SAVE DE (HARD DISK VOLUME COUNTER) PUSH HL ; SAVE DRIVE LIST PTR PUSH BC ; SAVE LOOP CONTROL - LD B,BF_DIOMEDIA ; HBIOS FUNC: SENSE MEDIA LD E,1 ; PERFORM MEDIA DISCOVERY - RST 08 - + RST 08 ; DO IT POP BC ; RESTORE LOOP CONTROL POP HL ; RESTORE DRIVE LIST PTR POP DE ; RESTORE DE - - RET NZ ; IF NO MEDIA, JUST RETURN - - ; IF ACTIVE... + RET NZ ; OFFLINE, SKIP ENTIRE UNIT +; +DRV_INIT3A: LD (HL),C ; SAVE UNIT NUM IN LIST INC HL ; BUMP PTR INC D ; INC TOTAL DEVICE COUNT + BIT 5,B ; HIGH CAPACITY? + RET Z ; DONE IF NOT INC E ; INCREMENT HARD DISK COUNT - RET ; AND RETURN + RET ; DONE ; DRV_INIT4: ; SET SLICES PER VOLUME (HDSPV) BASED ON HARD DISK VOLUME COUNT LD A,E ; HARD DISK VOLUME COUNT TO A @@ -2978,7 +3034,8 @@ DRV_INIT6: ; LOOP THRU ALL UNITS AVAILABLE LD C,(HL) ; GET UNIT NUM FROM LIST PUSH BC ; PRESERVE LOOP CONTROL LD B,BF_DIODEVICE ; HBIOS FUNC: REPORT DEVICE INFO - RST 08 ; CALL HBIOS, D := DEVICE TYPE + RST 08 ; CALL HBIOS, C := DEVICE ATTRIBUTES + LD A,C ; DEVICE ATTRIBUTES TO A POP BC ; GET UNIT INDEX BACK IN C PUSH BC ; RESAVE LOOP CONTROL CALL DRV_INIT7 ; MAKE DRIVE MAP ENTRY(S) @@ -2992,10 +3049,9 @@ DRV_INIT6: ; LOOP THRU ALL UNITS AVAILABLE DRV_INIT7: ; PROCESS UNIT LD E,0 ; INITIALIZE SLICE INDEX LD B,1 ; DEFAULT LOOP COUNTER - LD A,D ; DEVICE TYPE TO ACCUM LD D,C ; UNIT NUMBER TO D - CP DIODEV_IDE ; HARD DISK DEVICE? - JR C,DRV_INIT8 ; NOPE, LEAVE LOOP COUNT AT 1 + BIT 5,A ; HIGH CAPACITY DEVICE? + JR Z,DRV_INIT8 ; NOPE, LEAVE LOOP COUNT AT 1 LD A,(HDSPV) ; GET SLICES PER VOLUME TO ACCUM LD B,A ; MOVE TO B FOR LOOP COUNTER ; @@ -3350,10 +3406,6 @@ DEVUNK .DB "UNK$" RST 08 ; CALL HBIOS LD A,D ; RESULTANT DEVICE TYPE PUSH DE ; NEED TO SAVE UNIT NUMBER (IN E) - RRCA ; ROTATE DEVICE - RRCA ; ... BITS - RRCA ; ... INTO - RRCA ; ... LOWEST 4 BITS AND $0F ; ISOLATE DEVICE BITS ADD A,A ; MULTIPLY BY TWO FOR WORD TABLE LD HL,DEVTBL ; POINT TO START OF DEVICE NAME TABLE @@ -3392,11 +3444,11 @@ DEV06 .DB "SD$" DEV07 .DB "PRPSD$" DEV08 .DB "PPPSD$" DEV09 .DB "HDSK$" -DEV10 .EQU DEVUNK -DEV11 .EQU DEVUNK -DEV12 .EQU DEVUNK -DEV13 .EQU DEVUNK -DEV14 .EQU DEVUNK +DEV10 .DB "PPA$" +DEV11 .DB "IMM$" +DEV12 .DB "SYQ$" +DEV13 .DB "CHUSB$" +DEV14 .DB "CHSD$" DEV15 .EQU DEVUNK ; #ENDIF @@ -3406,7 +3458,7 @@ DIRBUF .DW 0 ; DIR BUF POINTER HEAPTOP .DW BUFPOOL ; CURRENT TOP OF HEAP BOOTVOL .DW 0 ; BOOT VOLUME, MSB=BOOT UNIT, LSB=BOOT SLICE HDSPV .DB 2 ; SLICES PER VOLUME FOR HARD DISKS (MUST BE >= 1) -DRVLST .FILL 32 ; ACTIVE DRIVE LIST USED DURINT DRV_INIT +DRVLST .FILL 32 ; ACTIVE DRIVE LIST USED DURING DRV_INIT DRVLSTC .DB 0 ; ENTRY COUNT FOR ACTIVE DRIVE LIST ; #IFDEF PLTWBW diff --git a/Source/CPM3/biosldr.z80 b/Source/CPM3/biosldr.z80 index 86083212..58e57cf0 100644 --- a/Source/CPM3/biosldr.z80 +++ b/Source/CPM3/biosldr.z80 @@ -346,8 +346,7 @@ read: ld b,17h ; HBIOS DEVICE function rst 08 ; Do it, D=device type ld a,d ; put in accum - and 0F0h ; isolate high bits - cp 10h ; floppy? + cp 01h ; floppy? jr nz,read2 ; if not, do LBA i/o ; Floppy I/O diff --git a/Source/CPM3/boot.z80 b/Source/CPM3/boot.z80 index ce3fef1b..b6f4c08d 100644 --- a/Source/CPM3/boot.z80 +++ b/Source/CPM3/boot.z80 @@ -13,7 +13,7 @@ extrn @dtbl,@ctbl extrn @date,@hour,@min,@sec extrn @srch1 - extrn @hbbio + extrn @hbbio,@hbusr extrn addhla extrn phex16, phex8 extrn cin, cout @@ -44,9 +44,9 @@ tpa$bank equ 0 if banked ; Clone page zero from bank 0 to additional banks - ld b,4 ; last bank + ld b,2 ; last bank ld c,0 ; src bank -init$2: +init$1: push bc ; save bank id's call ?xmove ; set src/dest banks ld bc,0100h ; size is one page @@ -54,7 +54,7 @@ init$2: ld de,0 ; src adr is 0 call ?move ; do it pop bc ; restore bank id's - djnz init$2 ; loop till done + djnz init$1 ; loop till done endif @@ -62,6 +62,35 @@ init$2: ld hl,signon$msg ; signon message call ?pmsg ; print it + if banked + + ; Confirm that HBIOS is configured with enough RAM banks + ; to accommodate banked version of CP/M 3. We use 2 + ; additional banks which live below the user bank. So we + ; check that the these don't overlap with the RomWBW HBIOS + ; bank. + + ld bc,0F8F2h ; HBIOS GET BNKINFO + call 0FFF0h ; D: BIOS Bank, E: User Bank + ld a,d + ld (@hbbio),a + ld a,e + ld (@hbusr),a + + sub 3 ; 2 extra banks (+1 for compare) + cp d ; lowest cpm bank - hbios bank + jr nc,init$2 ; continue if space available + + ld hl,noram$msg ; signon message + call ?pmsg ; print it + + ld b,0F0h ; HBIOS system reset + ld c,1h ; reset type warm (back to loader) + call 0FFFFh ; do it + + endif + +init$2: ; Check for HBIOS/CBIOS mismatch ld b,0F1h ; hbios version rst 08 ; do it, de=maj/min/up/pat @@ -156,7 +185,9 @@ dinit: ld hl,drvlst ; init hl ptr to drive list ; dinit2: + push bc ; save loop cnt & unit call dinit3 ; check drive + pop bc ; recover loop cnt & unit inc c ; next unit djnz dinit2 ; loop ld a,d ; total device count to d @@ -169,39 +200,35 @@ dinit3: push bc ; save loop control ld b,17h ; hbios func: report device info rst 08 ; call hbios, unit to c - ld a,d ; device type to a + ld a,c ; device attributes to a pop bc ; restore loop control pop hl ; restore drive list ptr pop de ; restore de - cp 30h ; hard disk device? - jr nc,dinit3a ; if so, handle special - ld (hl),c ; save unit num in list - inc hl ; bump ptr - inc d ; inc total device count - ret + ld b,a ; attributes to b ; -dinit3a: - ; check for active and return if not + ; if device is not removable, then check to ensure it is + ; actually online. if not, skip unit entirely. + bit 6,b ; removable? + jr nz,dinit3a ; if so, skip media check push de ; save de (hard disk volume counter) push hl ; save drive list ptr push bc ; save loop control - ld b,18h ; hbios func: sense media ld e,1 ; perform media discovery - rst 08 - + rst 08 ; do it pop bc ; restore loop control pop hl ; restore drive list ptr pop de ; restore de - - ret nz ; if no media, just return - - ; if active... + ret nz ; offline, skip entire unit +; +dinit3a: ld (hl),c ; save unit num in list inc hl ; bump ptr inc d ; inc total device count + bit 5,b ; high capacity? + ret z ; done if not inc e ; increment hard disk count - ret ; and return + ret ; done dinit4: ; set slices per volume (hdspv) based on hard disk volume count ld a,e ; hard disk volume count to a @@ -238,7 +265,8 @@ dinit6: push bc ; preserve loop control push hl ; preserve dph pointer ld b,17h ; hbios func: report device info - rst 08 ; call hbios, d := device type + rst 08 ; call hbios, a := device attributes + ld a,c ; device attributes to a pop hl ; restore dph pointer pop bc ; get unit index back in c push bc ; resave loop control @@ -253,10 +281,9 @@ dinit6: dinit7: ; process a unit (all slices) ld e,0 ; initialize slice index ld b,1 ; default loop counter - ld a,d ; device type to accum ld d,c ; unit number to d - cp 030h ; hard disk device? - jr c,dinit8 ; nope, leave loop count at 1 + bit 5,a ; high capacity device? + jr z,dinit8 ; nope, leave loop count at 1 ld a,(hdspv) ; get slices per volume to accum ld b,a ; move to b for loop counter @@ -733,6 +760,10 @@ clrflg db 0 ; RAM disk cleared flag clr$msg db 'RAM Disk Initialized',13,10,13,10,0 vermis$msg db 7,'*** WARNING: HBIOS/CBIOS Version Mismatch ***',13,10,13,10,0 + if banked +noram$msg db 7,'*** ERROR: Insufficient RAM for banked CP/M 3 ***',13,10,13,10,0 + endif + if zpm signon$msg db 13,10,'ZPM3' diff --git a/Source/CPM3/diskio.z80 b/Source/CPM3/diskio.z80 index 2d87a132..c91caa4c 100644 --- a/Source/CPM3/diskio.z80 +++ b/Source/CPM3/diskio.z80 @@ -38,7 +38,7 @@ extrn ?bnkxlt - extrn phex8, cout + extrn phex16, phex8, cout, crlf, crlf2 ; CP/M 3 Disk definition macros @@ -355,38 +355,30 @@ dpb$hdnew: ; 8MB Hard Disk Drive (new format) ; called for first time initialization. dsk$init: - ; TODO: Handle disabled RAM/ROM disk better. - ; If RAM or ROM disk are disabled, below will still - ; try to adjust the DPB based on RAM bank calculations. - ; It should not matter because the DPB should never be - ; used. It would be better to get RAMD0/ROMD0 and - ; RAMDN/ROMDN from the HCB and use those to calc the - ; DPB adjustment. If DN-D0=0, bypass adjustment. - ld b,0FAh ; HBIOS Peek Function - ld a,(@hbbio) ; HBIOS bank id - ld d,a ; ... goes in D - ld hl,10Ch ; Offset 10Ch is ROM bank cnt - rst 08 ; Call HBIOS, value in E - ld a,e ; move count to accum - sub 4 ; reduce by # reserved banks - ld ix,dpb$rom ; address of DPB + + ; NOTE: ROM and/or RAM disk may not be active, but we go + ; ahead and update both DPBs anyway. It causes no harm since + ; inactive RAM/ROM disk will never be accessed. + + ld hl,1DFh ; ROM disk bank cnt in HCB + ld ix,dpb$rom ; address of ROM Disk DPB call dsk$init1 ; fix it up - + ld hl,1DDh ; RAM dsik bank cnt in HCB + ld ix,dpb$ram ; address of RAM Disk DPB + call dsk$init1 ; fix it up + ret ; done + +dsk$init1: + ; Get bank count of RAM/ROM disk ld b,0FAh ; HBIOS Peek Function ld a,(@hbbio) ; HBIOS bank id ld d,a ; ... goes in D - ld hl,10Bh ; Offset 10Bh is RAM bank cnt rst 08 ; Call HBIOS, value in E - ld a,e ; move count to accum - sub 8 ; reduce by # reserved banks - ld ix,dpb$ram ; address of DPB - call dsk$init1 ; fix it up + ;ld a,e ; move count to accum - ret ; done - -dsk$init1: ; Setup HL with bank count - ld l,a ; lsb + ;ld l,a ; lsb + ld l,e ; lsb ld h,0 ; msb is always zero ; Update EXM field @@ -501,8 +493,7 @@ media: ld b,17h ; HBIOS func: report device info call 0FFF0h ; get unit info, device type in D ld a,d ; device type -> A - and 0F0h ; isolate high bits - cp 10h ; floppy? + cp 01h ; floppy? jr nz,media1 ; if not, do LBA I/O ld hl,lba+3 ; point to high order byte res 7,(hl) ; switch from LBA -> CHS @@ -585,29 +576,77 @@ media4: ; adjust the sectors per slice and media id. ; Use new slice format sectors per slice value - ld hl,16384 ; new sectors per slice - ld (sps),hl ; save it + ld hl,16384 ; new sectors per slice + ld (sps),hl ; save it ; Update media id for new hard disk format - ld a,10 ; new media id - ld (medid),a ; save it + ld a,10 ; new media id + ld (medid),a ; save it media5: ; Adjust LBA offset based on target slice - ld a,(slice) ; get slice, A is loop cnt - ld hl,(lba) ; set DE:HL - ld de,(lba+2) ; ... to starting LBA - ld bc,(sps) ; sectors per slice + ld a,(slice) ; get slice, A is loop cnt + ld hl,(lba) ; set DE:HL + ld de,(lba+2) ; ... to starting LBA + ld bc,(sps) ; sectors per slice + res 7,d ; clear lba mode bit boot6: - or a ; set flags to check loop cntr - jr z,boot8 ; done if counter exhausted - add hl,bc ; add one slice to low word - jr nc,boot7 ; check for carry - inc de ; if so, bump high word + or a ; set flags to check loop cntr + jr z,boot8 ; done if counter exhausted + add hl,bc ; add one slice to low word + jr nc,boot7 ; check for carry + inc de ; if so, bump high word boot7: - dec a ; dec loop downcounter - jr boot6 ; and loop + dec a ; dec loop downcounter + jr boot6 ; and loop boot8: + + ; LBA offset of desired slice is now in DE:HL. + ; Need to check if the slice is beyond capacity of media. + ; If lba_off + sps >= dsk_cap, error! + + ; Save lba_off + push de ; msw + push hl ; lsw + + ; Add sps to compute lba_req + ld bc,(sps) ; sectors per slice + add hl,bc ; add one slice to low word + jr nc,dsk_mbr9 ; check for carry + inc de ; if so, bump high word +dsk_mbr9: + ; Save cap_req + ld (cap_req),hl ; lsw + ld (cap_req+2),de ; msw + + ; Get dsk_cap (de:hl) + ld b,1Ah ; hbios disk capacity func + ld a,(unit) ; disk unit number + ld c,a ; ... into c + rst 08 ; hbios call (de:hl = capacity) + + ; Save dsk_cap (de:hl) + push de ; save dsk_cap (msw) + push hl ; save dsk_cap (lsw) + + ; Check dsk_cap >= cap_req, cf set on overflow + ; No need save actual result + or a ; clear carry for sbc + pop hl ; dsk_cap lsw + ld de,(cap_req) ; cap_req lsw + sbc hl,de ; dsk_cap - lba_req (lsw) + pop hl ; dsk_cap msw + ld de,(cap_req+2) ; cap_req msw + sbc hl,de ; dsk_cap - lba_req (msw) + + ; Restore lba_off + pop hl ; lsw + pop de ; msw + + ; Abort on overflow with error! + jp c,err_noslice ; slice too high, error exit + + ; Finalize slice lba set 7,d ; set LBA access flag ld (lba),hl ; save new lba, low word ld (lba+2),de ; save new lba, high word @@ -878,6 +917,7 @@ unit db 0 ; working disk unit num slice db 0 ; working slice num lba dw 0,0 ; working lba sps dw 0 ; sectors per slice +cap_req dw 0,0 ; lba cap required for slice mbrsec ds 512 ; MBR sector buffer dma dw 0 ; current DMA address bank db 0 ; HBIOS DMA bank diff --git a/Source/CPM3/genbnk.dat b/Source/CPM3/genbnk.dat index 4dccf1fb..2153824e 100644 --- a/Source/CPM3/genbnk.dat +++ b/Source/CPM3/genbnk.dat @@ -8,12 +8,12 @@ MEMTOP = FD BNKSWT = Y COMBAS = 80 LERROR = Y -NUMSEGS = 04 +NUMSEGS = 02 MEMSEG00 = 01,17,00 MEMSEG01 = 0E,72,02 MEMSEG02 = 01,7F,03 -MEMSEG03 = 01,7F,04 -MEMSEG04 = 01,7F,05 +MEMSEG03 = 00,C0,04 +MEMSEG04 = 00,C0,05 MEMSEG05 = 00,C0,06 MEMSEG06 = 00,C0,07 MEMSEG07 = 00,C0,08 @@ -25,22 +25,22 @@ MEMSEG0C = 00,C0,0D MEMSEG0D = 00,C0,0E MEMSEG0E = 00,C0,0F MEMSEG0F = 00,C0,10 -HASHDRVA = Y -HASHDRVB = Y -HASHDRVC = Y -HASHDRVD = Y -HASHDRVE = Y -HASHDRVF = Y -HASHDRVG = Y -HASHDRVH = Y -HASHDRVI = Y -HASHDRVJ = Y -HASHDRVK = Y -HASHDRVL = Y -HASHDRVM = Y -HASHDRVN = Y -HASHDRVO = Y -HASHDRVP = Y +HASHDRVA = N +HASHDRVB = N +HASHDRVC = N +HASHDRVD = N +HASHDRVE = N +HASHDRVF = N +HASHDRVG = N +HASHDRVH = N +HASHDRVI = N +HASHDRVJ = N +HASHDRVK = N +HASHDRVL = N +HASHDRVM = N +HASHDRVN = N +HASHDRVO = N +HASHDRVP = N ALTBNKSA = Y ALTBNKSB = Y ALTBNKSC = Y diff --git a/Source/CPM3/genres.dat b/Source/CPM3/genres.dat index d1e1103d..f08fb7f0 100644 --- a/Source/CPM3/genres.dat +++ b/Source/CPM3/genres.dat @@ -8,7 +8,7 @@ MEMTOP = FD BNKSWT = N COMBAS = 00 LERROR = Y -NUMSEGS = 03 +NUMSEGS = 01 MEMSEG00 = 00,80,00 MEMSEG01 = 00,C0,02 MEMSEG02 = 00,C0,03 diff --git a/Source/CPM3/move.z80 b/Source/CPM3/move.z80 index 73cc13bb..19ebbdff 100644 --- a/Source/CPM3/move.z80 +++ b/Source/CPM3/move.z80 @@ -65,12 +65,11 @@ xbnkmov: ; ------------ -------------- ------- ; COMMON BID_COM 8Fh ; 0: OS/BUFS BID_USR 8Eh -; BID_BIOS 8Dh -; 1: TPA BID_AUX 8Ch -; 2: BUFS BID_AUX-1 8Bh -; 3: BUFS BID_AUX-2 8Ah -; 4: BUFS BID_AUX-3 89h -; 5: BUFS BID_AUX-4 88h +; 1: TPA BID_AUX 8Dh +; 2: BUFS BID_AUX-1 8Ch +; 3: BUFS BID_AUX-2 8Bh +; 4: BUFS BID_AUX-3 8Ah +; 5: BUFS BID_AUX-4 89h ; ; N.B., Below BID_AUX is considered RAM disk bank. Need to ; make sure RAM disk is kept small enough to stay below @@ -80,17 +79,13 @@ xbnkmov: ; to adjust for real size of RAM in system ; ?bnkxlt: - or a - jr z,bank0 - neg ; 2 -> -2 - add a,8Dh ; 8Dh - 2 = 8Bh -@hbbio equ $ - 1 ; BID_BIOS - ret -bank0: - ld a,8Eh ; 0 -> 8Eh + neg ; ex: 2 -> -2 + add a,8Eh ; ex: 8Eh - 2 = 8Ch @hbusr equ $ - 1 ; BID_USR ret - + +@hbbio db 0 ; BID_BIOS + movtyp db 0 ; non-zero for interbank move movbnks: diff --git a/Source/Clean.cmd b/Source/Clean.cmd index ebd9f7d4..3482fbe1 100644 --- a/Source/Clean.cmd +++ b/Source/Clean.cmd @@ -4,6 +4,7 @@ setlocal pushd HDIAG && call Clean.cmd & popd pushd Apps && call Clean.cmd & popd pushd CPM22 && call Clean.cmd & popd +pushd QPM && call Clean.cmd & popd pushd ZCPR && call Clean.cmd & popd pushd ZCPR-DJ && call Clean.cmd & popd pushd ZSDOS && call Clean.cmd & popd @@ -21,4 +22,5 @@ pushd Prop && call Clean & popd pushd RomDsk && call Clean & popd pushd Doc && call Clean & popd pushd ZRC && call Clean & popd -pushd ZZRC && call Clean & popd +pushd Z1RCC && call Clean & popd +pushd ZZRCC && call Clean & popd diff --git a/Source/Doc/Applications.md b/Source/Doc/Applications.md index 8c86d052..463896c0 100644 --- a/Source/Doc/Applications.md +++ b/Source/Doc/Applications.md @@ -51,6 +51,8 @@ found: | INTTEST | No | Yes | Yes | | FAT | No | Yes | Yes | | TUNE | No | Yes | Yes | +| WDATE | No | Yes | Yes | +| HTALK | No | Yes | Yes | `\clearpage`{=latex} @@ -164,6 +166,13 @@ Be aware that this command will allow you to reassign or remove the assignment of your system drive letter. This can cause your operating system to fail and force you to reboot. +The `ASSIGN` command does **not** prevent you from assigning a drive +letter to a slice that does not fit on the physical media. However, +any subsequent attempt to refer to that drive letter will result in +an immediate OS error of "no disk". Refer to "Hard Disk Capacity" +in the $doc_user$ for a discussion of the exact number of slices that +will fit on a specific physical disk size. + This command is particularly sensitive to being matched to the appropriate version of the RomWBW ROM you are using. Be very careful to keep all copies of `ASSIGN.COM` up to date with your ROM. @@ -620,9 +629,9 @@ shown on your console. The `TALK` application does this. `TALK` operates at the operating system level (not HBIOS). The parameter to `TALK` refers to logical CP/M serial devices. Upon -execution all characters types at the console will be sent to the +execution all characters typed at the console will be sent to the device specified and all characters received by the specified device -will be echoes on the console. +will be echoed on the console. Press Control+Z on the console to terminate the application. @@ -638,6 +647,36 @@ provided in the RomWBW distribution. `\clearpage`{=latex} +# HTALK + +`HTALK` is a variation of the `TALK` utility, but it works directly +against HBIOS Character Units. + +## Syntax + +`HTALK COMn:` + +## Usage + +`HTALK` operates at the HBIOS level. + +The parameter to `TALK` refers to a HBIOS character unit. Upon +execution all characters typed at the console will be sent to the +device specified and all characters received by the specified device +will be echoed on the console. + +Press Control+Z on the console to terminate the application. + +## Notes + + +## Etymology + +The `TALK` command was created and donated to RomWBW by Tom Plano. It +is an original product designed specifically for RomWBW. + +`\clearpage`{=latex} + # RTC Many RomWBW systems provide real time clock hardware. The RTC @@ -889,6 +928,28 @@ written in C and requires SDCC to compile. As such it is not part of the RomWBW build process. However, the full project and source code is found in the [FAT GitHub Repository](https://github.com/wwarthen/FAT). +## Known Issues + +CP/M (and workalike) OSes have significant restrictions on filename +characters. The FAT application will block any attempt to create a +file on the CP/M filesystem containing any of these prohibited +characters: + +| `< > . , ; : = ? * [ ] _ % | ( ) / \` + +The operation will be aborted with "`Error: Invalid Path Name`" if such +a filename character is encountered. + +Since MS-DOS does allow some of these characters, you can have +issues when copying files from MS-DOS to CP/M if the MS-DOS filenames +use these characters. Unfortunately, FAT is not yet smart enough to +substitute illegal characters with legal ones. So, you will need to +clean the filenames before trying to copy them to CP/M. + +The FAT application does try to detect the scenario where you are +copying a file to itself. However, this detection is not perfect and +can corrupt a file if it occurs. Be careful to avoid this. + `\clearpage`{=latex} # TUNE @@ -1106,3 +1167,85 @@ can be used to reduce your processor speed. VGMPLAY is still under development. The source code is provided in the RomWBW distribution. + +`\clearpage`{=latex} + +# WDATE + +`wdate` is a utility for CP/M systems that have Wayne Warthen's +ROMWBW firmware. It reads or sets the real-time clock, using function +calls in the BIOS. It should work on any RTC device that is supported by +ROMWBW, including the internal interrupt-driven timer that is is available +on some systems. + +`wdate` differs from the `rtc.com` utility that is provided with the +ROMWBW version of CP/M in that it only gets and sets the date/time. +`rtc.com` can also manipulate the nonvolatile RAM in certain clock +devices, and modify the charge controller. However, `wdate` is (I would +argue) easier to use, as it takes its input from the command line, which +can be edited, and it's less fussy about the format. It doesn't require +the date to be set if you only want to change the time, for example. + In addition, `wdate` has at least some error checking. + +`wdate` displays the day-of-week and month as English text, not +numbers. It calculates the day-of-week from the year, month, and day. +RTC chips usually store a day-of-week value, but it's useless in this +application for two reasons: first, the BIOS does not expose it. Second, +there is no universally-accepted way to interpret it (which day does +the week start on? Is '0' a valid day of the week?) + +## Syntax + +| `WDATE` +| `WDATE ` *`


`* +| `WDATE ` *`
`* +| `WDATE ` *`
`* + +## Usage + + A> wdate + Saturday 27 May 13:14:39 2023 + +With no arguments, displays the current date and time. + + A> wdate hr min + +With two arguments, sets the time in hours and minutes, without changing date +or seconds + + A> wdate hr min sec + +With three arguments, sets the time in hours, minutes, and seconds, without +changing date + + A> wdate year month day hr min sec + +With six arguments, sets date and time. All numbers are one or two digits. The +two-digit year starts at 2000. + + A> wdate /? + +Show a summary of the command-line usage. + +## Notes + +I've tested this utility with the DS1302 clock board designed by Ed +Brindly, and on the interrupt-driven timer built into my Z180 board. +However, it does not interact with hardware, only BIOS; I would expect +it to work with other hardware. + +wdate checks for the non-existence of ROMWBW, and also for failing +operations on the RTC. It will display the terse "No RTC" message in +both cases. + +The ROMWBW functions that manipulate the date and time operate on BCD +numbers, as RTC chips themselves usually do. wdate works in decimal, so +that it can check that the user input makes sense. A substantial part of +the program's code is taken up by number format conversion and range +checking. + +## Etymology + +The `WDATE` application was written and contributed by Kevin Boone. +The source code is available on GitHub at +[https://github.com/kevinboone/wdate-cpm/blob/main/README.md](https://github.com/kevinboone/wdate-cpm/blob/main/README.md). diff --git a/Source/Doc/Basic.h b/Source/Doc/Basic.h index f3b529b3..c0601ac0 100644 --- a/Source/Doc/Basic.h +++ b/Source/Doc/Basic.h @@ -1,4 +1,4 @@ -$define{doc_ver}{Version 3.2.1}$ +$define{doc_ver}{Version 3.4}$ $define{doc_product}{RomWBW}$ $define{doc_root}{https://github.com/wwarthen/RomWBW/raw/dev/Doc}$ $ifndef{doc_title}$ $define{doc_title}{Document Title}$ $endif$ diff --git a/Source/Doc/Book.h b/Source/Doc/Book.h index 6c7d3b93..f1bfb4ed 100644 --- a/Source/Doc/Book.h +++ b/Source/Doc/Book.h @@ -30,7 +30,9 @@ header-includes: {\scshape \bfseries \fontsize{48pt}{56pt} \selectfont $doc_product$ \par} {\bfseries \fontsize{32pt}{36pt} \selectfont $doc_title$ \par} \vspace{24pt} - {\huge $doc_ver$ \\ $doc_date$ \par} + {\huge $doc_ver$ \par} + \vspace{12pt} + {\large Updated $doc_date$ \par} \vspace{24pt} {\large \itshape $doc_orgname$ \\ \href{http://$doc_orgurl$}{$doc_orgurl$} \par} \vspace{12pt} diff --git a/Source/Doc/Graphics/Panel.pdf b/Source/Doc/Graphics/Panel.pdf new file mode 100644 index 00000000..2ec8d559 Binary files /dev/null and b/Source/Doc/Graphics/Panel.pdf differ diff --git a/Source/Doc/Graphics/Panel.png b/Source/Doc/Graphics/Panel.png new file mode 100644 index 00000000..488d258f Binary files /dev/null and b/Source/Doc/Graphics/Panel.png differ diff --git a/Source/Doc/Graphics/Panel.vsdx b/Source/Doc/Graphics/Panel.vsdx new file mode 100644 index 00000000..2f760f34 Binary files /dev/null and b/Source/Doc/Graphics/Panel.vsdx differ diff --git a/Source/Doc/Makefile b/Source/Doc/Makefile index 0992f954..11e4c600 100644 --- a/Source/Doc/Makefile +++ b/Source/Doc/Makefile @@ -1,7 +1,7 @@ # -# NOTE: Pandoc, Latex (MiKTeX or TexLive), and gpp must be installed +# NOTE: gpp, Pandoc, and Latex (MiKTeX or TexLive) must be installed # and available on commandline for this build to work!!! -# Typically "sudo apt install pandoc, texlive-latex-extra, gpp" +# Typically "sudo apt install gpp pandoc texlive-latex-extra texlive-luatex texlive-fonts-extra fonts-roboto" # OBJECTS = ReadMe.gfm ReadMe.txt UserGuide.pdf SystemGuide.pdf Applications.pdf ROM_Applications.pdf Catalog.pdf Errata.pdf # DEST = ../../Doc @@ -16,7 +16,7 @@ all :: deploy gpp -o $@ -U "$$" "$$" "{" "}{" "}$$" "{" "}" "@@@" "" -M "$$" "$$" "{" "}{" "}$$" "{" "}" $< %.pdf : %.tmp - pandoc $< -f markdown -t latex -s -o $@ --default-image-extension=pdf + pandoc $< -f markdown -t pdf -s -o $@ --default-image-extension=pdf --pdf-engine=lualatex %.html : %.tmp pandoc $< -f markdown -t html -s -o $@ --default-image-extension=pdf diff --git a/Source/Doc/ReadMe.md b/Source/Doc/ReadMe.md index d62fe67f..4565bb8a 100644 --- a/Source/Doc/ReadMe.md +++ b/Source/Doc/ReadMe.md @@ -10,14 +10,23 @@ A wide variety of platforms are supported including those produced by these developer communities: * [RetroBrew Computers](https://www.retrobrewcomputers.org) -* [RC2014](https://rc2014.co.uk), [RC2014-Z80](https://groups.google.com/g/rc2014-z80) -* [retro-comp](https://groups.google.com/forum/#!forum/retro-comp) + () +* [RC2014](https://rc2014.co.uk) (), \ + [RC2014-Z80](https://groups.google.com/g/rc2014-z80) + () +* [Retro Computing](https://groups.google.com/g/retro-comp) + () * [Small Computer Central](https://smallcomputercentral.com/) + () + +A complete list of the currently supported platforms is found in the +[Installation] section. General features include: +* Z80 Family CPUs including Z80, Z180, and Z280 * Banked memory services for several banking designs -* Disk drivers for RAM, ROM, Floppy, IDE, CF, and SD +* Disk drivers for RAM, ROM, Floppy, IDE ATA/ATAPI, CF, SD, USB, Zip, Iomega * Serial drivers including UART (16550-like), ASCI, ACIA, SIO * Video drivers including TMS9918, SY6545, MOS8563, HD6445 * Keyboard (PS/2) drivers via VT8242 or PPI interfaces @@ -34,12 +43,12 @@ ROM firmware itself: * ROM BASIC (Nascom BASIC and Tasty BASIC) * ROM Forth -A dynamic disk drive letter assignment mechanism allows mapping -operating system drive letters to any available disk media. -Additionally, mass storage devices (IDE Disk, CF Card, SD Card) support -the use of multiple slices (up to 256 per device). Each slice contains -a complete CP/M filesystem and can be mapped independently to any -drive letter. This overcomes the inherent size limitations in legacy +A dynamic disk drive letter assignment mechanism allows mapping +operating system drive letters to any available disk media. +Additionally, mass storage devices (IDE Disk, CF Card, SD Card, etc.) +support the use of multiple slices (up to 256 per device). Each slice +contains a complete CP/M filesystem and can be mapped independently to +any drive letter. This overcomes the inherent size limitations in legacy OSes and allows up to 2GB of accessible storage on a single device. The pre-built ROM firmware images are generally suitable for most @@ -61,7 +70,7 @@ By design, RomWBW isolates all of the hardware specific functions in the ROM chip itself. The ROM provides a hardware abstraction layer such that all of the operating systems and applications on a disk will run on any RomWBW-based system. To put it simply, you can take -a disk (or CF/SD Card) and move it between systems transparently. +a disk (or CF/SD/USB Card) and move it between systems transparently. A tool is provided that allows you to access a FAT-12/16/32 filesystem. The FAT filesystem may be coresident on the same disk media as RomWBW @@ -70,18 +79,19 @@ OSes such as Windows, MacOS, and Linux very easy. # Acquiring RomWBW -The [RomWBW Repository](https://github.com/wwarthen/RomWBW) on GitHub is -the official distribution location for all project source and -documentation. The fully-built distribution releases are available on -the [RomWBW Releases Page](https://github.com/wwarthen/RomWBW/releases) -of the repository. On this page, you will normally see a Development -Snapshot as well as recent stable releases. Unless you have a specific -reason, I suggest you stick to the most recent stable release. Expand -the "Assets" drop-down for the release you want to download, then select -the asset named RomWBW-vX.X.X-Package.zip. The Package asset includes -all pre-built ROM and Disk images as well as full source code. The other -assets contain only source code and do not have the pre-built ROM or -disk images. +The [RomWBW Repository](https://github.com/wwarthen/RomWBW) +() on GitHub is the official +distribution location for all project source and documentation. The +fully-built distribution releases are available on the +[RomWBW Releases Page](https://github.com/wwarthen/RomWBW/releases) +() of the repository. On +this page, you will normally see a Development Snapshot as well as +recent stable releases. Unless you have a specific reason, I suggest you + stick to the most recent stable release. Expand the "Assets" drop-down +for the release you want to download, then select the asset named +RomWBW-vX.X.X-Package.zip. The Package asset includes all pre-built ROM +and Disk images as well as full source code. The other assets contain +only source code and do not have the pre-built ROM or disk images. All source code and distributions are maintained on GitHub. Code contributions are very welcome. @@ -172,6 +182,38 @@ please let me know if I missed you! * The RomWBW Disk Catalog document was produced by Mykl Orders. +* Rob Prouse has created many of the supplemental disk images + including Aztec C, HiTech C, SLR Z80ASM, Turbo Pascal, Microsoft + BASIC Compiler, Microsoft Fortran Compiler, and a Games + compendium. + +* Martin R has provided substantial help reviewing and improving the + User Guide. + +* Jacques Pelletier has contributed the DS1501 RTC driver code. + +* Jose Collado has contributed enhancements to the TMS driver + including compatibility with standard TMS register configuration. + +* Kevin Boone has contributed a generic HBIOS date/time utility (WDATE). + +* Matt Carroll has contributed a fix to XM.COM that corrects the + port specification when doing a send. + +* Dean Jenkins enhanced the build process to accommodate the + Raspberry Pi 4. + +* Tom Plano has contributed a new utility (HTALK) to allow talking + directly to HBIOS COM ports. + +* Lars Nelson has contributed several generic utilities such as + a universal (OS agnostic) UNARC application. + +* Dylan Hall added support for specifying a secondary console. + +* Bill Shen has contributed boot loaders for several of his + systems. + Contributions of all kinds to RomWBW are very welcome. # Licensing diff --git a/Source/Doc/SystemGuide.md b/Source/Doc/SystemGuide.md index e89fada4..b0516e93 100644 --- a/Source/Doc/SystemGuide.md +++ b/Source/Doc/SystemGuide.md @@ -390,17 +390,20 @@ below enumerates these values. | **Device Type** | **ID** | **Description** | **Driver** | |-----------------|-------:|------------------------------------------|------------| | CIODEV_UART | 0x00 | 16C550 Family Serial Interface | uart.asm | -| CIODEV_ASCI | 0x10 | Z180 Built-in Serial Ports | asci.asm | -| CIODEV_TERM | 0x20 | Terminal | ansi.asm | -| CIODEV_PRPCON | 0x30 | PropIO Serial Console Interface | prp.asm | -| CIODEV_PPPCON | 0x40 | ParPortProp Serial Console Interface | ppp.asm | -| CIODEV_SIO | 0x50 | Zilog Serial Port Interface | sio.asm | -| CIODEV_ACIA | 0x60 | MC68B50 Asynchronous Interface | acia.asm | -| CIODEV_PIO | 0x70 | Zilog Parallel Interface Controller | pio.asm | -| CIODEV_UF | 0x80 | FT232H-based ECB USB FIFO | uf.asm | -| CIODEV_DUART | 0x90 | SCC2681 Family Dual UART | duart.asm | -| CIODEV_Z2U | 0xA0 | Zilog Z280 Built-in Serial Ports | z2u.asm | -| CIODEV_LPT | 0xB0 | Parallel I/O Controller | lpt.asm | +| CIODEV_ASCI | 0x01 | Z180 Built-in Serial Ports | asci.asm | +| CIODEV_TERM | 0x02 | Terminal | ansi.asm | +| CIODEV_PRPCON | 0x03 | PropIO Serial Console Interface | prp.asm | +| CIODEV_PPPCON | 0x04 | ParPortProp Serial Console Interface | ppp.asm | +| CIODEV_SIO | 0x05 | Zilog Serial Port Interface | sio.asm | +| CIODEV_ACIA | 0x06 | MC68B50 Asynchronous Interface | acia.asm | +| CIODEV_PIO | 0x07 | Zilog Parallel Interface Controller | pio.asm | +| CIODEV_UF | 0x08 | FT232H-based ECB USB FIFO | uf.asm | +| CIODEV_DUART | 0x09 | SCC2681 Family Dual UART | duart.asm | +| CIODEV_Z2U | 0x0A | Zilog Z280 Built-in Serial Ports | z2u.asm | +| CIODEV_LPT | 0x0B | Parallel I/O Controller | lpt.asm | +| CIODEV_ESPCON | 0x0B | ESP32 VGA Console | esp.asm | +| CIODEV_ESPSER | 0x0B | ESP32 Serial Port | esp.asm | +| CIODEV_SCON | 0x0B | S100 Console | scon.asm | Character devices can usually be configured with line characteristics such as speed, framing, etc. A word value (16 bit) is used to describe @@ -568,15 +571,20 @@ below enumerates there values. | **Device Type** | **ID** | **Description** | **Driver** | |-----------------|-------:|------------------------------------------|------------| | DIODEV_MD | 0x00 | Memory Disk | md.asm | -| DIODEV_FD | 0x10 | Floppy Disk | fd.asm | -| DIODEV_RF | 0x20 | RAM Floppy | rf.asm | -| DIODEV_IDE | 0x30 | IDE Disk | ide.asm | -| DIODEV_ATAPI | 0x40 | ATAPI Disk (not implemented) | | -| DIODEV_PPIDE | 0x50 | PPIDE Disk | ppide.asm | -| DIODEV_SD | 0x60 | SD Card | sd.asm | -| DIODEV_PRPSD | 0x70 | PropIO SD Card | prp.asm | -| DIODEV_PPPSD | 0x80 | ParPortProp SD Card | ppp.asm | -| DIODEV_HDSK | 0x90 | SIMH HDSK Disk | hdsk.asm | +| DIODEV_FD | 0x01 | Floppy Disk | fd.asm | +| DIODEV_RF | 0x02 | RAM Floppy | rf.asm | +| DIODEV_IDE | 0x03 | IDE Disk | ide.asm | +| DIODEV_ATAPI | 0x04 | ATAPI Disk (not implemented) | | +| DIODEV_PPIDE | 0x05 | PPIDE Disk | ppide.asm | +| DIODEV_SD | 0x06 | SD Card | sd.asm | +| DIODEV_PRPSD | 0x07 | PropIO SD Card | prp.asm | +| DIODEV_PPPSD | 0x08 | ParPortProp SD Card | ppp.asm | +| DIODEV_HDSK | 0x09 | SIMH HDSK Disk | hdsk.asm | +| DIODEV_PPA | 0x0A | Iomega PPA Disk | ppa.asm | +| DIODEV_IMM | 0x0B | Iomega IMM Disk | imm.asm | +| DIODEV_SYQ | 0x0C | Syquest Sparq Disk | syq.asm | +| DIODEV_CHUSB | 0x0D | CH375/376 USB Disk | ch.asm | +| DIODEV_CHSD | 0x0E | CH375/376 SD Card | ch.asm | A fixed set of media types are defined. The currently defined media types identifiers are listed below. Each driver will support one or @@ -757,28 +765,36 @@ of memory because it avoids a double copy. Reports device information about the specified Disk Unit (C). The Status (A) is a standard HBIOS result code. -Bit 7 of the Device Attribute (C) value returned indicates whether the -device is a floppy disk. If it is a floppy disk, the Device Attribute -(C) value is encoded as follows: +The Device Attribute (C) value returned indicates various +feature indicators related to the device being referenced +by the specified Disk Unit (C). The high 3 bits apply to +all devices. The definition of the low 5 bits depends on +whether the device is a Floppy (indicated by bit 5). + +The common bits are: | **Bits** | **Definition** | |---------:|--------------------------------------------------| -| 7 | = 1 (Floppy Disk) | -| 6-5 | Form Factor: 0=8", 1=5.25", 2=3.5", 3=Other | -| 4 | Sides: 0=SS, 1=DS | -| 3-2 | Density: 0=SD, 1=DD, 2=HD, 3=ED | -| 1-0 | Reserved | +| 7 | Floppy | +| 6 | Removable | +| 5 | High Capacity (>8 MB) | -If the Disk Unit (C) specified is a not floppy disk, then the Device -Attribute (C) encoding is as follows: +The Floppy specific bits are: | **Bits** | **Definition** | |---------:|--------------------------------------------------| -| 7 | = 0 (not Floppy Disk) | -| 6 | Removable | -| 5-3 | Type: 0=Hard, 1=CF, 2=SD, 3=USB, | -| | 4=ROM, 5=RAM, 6=RAMF, 7=FLASH | -| 2-0 | Reserved | +| 4-3 | Form Factor: 0=8", 1=5.25", 2=3.5", 3=Other | +| 2 | Sides: 0=SS, 1=DS | +| 1-0 | Density: 0=SD, 1=DD, 2=HD, 3=ED | + +The non-Floppy specific bits are: + +| **Bits** | **Definition** | +|---------:|--------------------------------------------------| +| 4 | LBA Capable | +| 3-0 | Media Type: 0=Hard Disk, 1=CF, 2=SD, 3=USB, | +| | 4=ROM, 5=RAM, 6=RAMF, 7=FLASH, 8=CD-ROM, | +| | 9=Cartridge | Device Type (D) indicates the specific hardware driver that handles the specified Disk Unit (C). Values are listed at the start of this @@ -870,11 +886,11 @@ unit. The table below enumerates these values. | **Device Type** | **ID** | **Description** | **Driver** | |-----------------|-------:|------------------------------------------|------------| | RTCDEV_DS | 0x00 | Maxim DS1302 Real-Time Clock w/ NVRAM | dsrtc.asm | -| RTCDEV_BQ | 0x10 | BQ4845P Real Time Clock | bqrtc.asm | -| RTCDEV_SIMH | 0x20 | SIMH Simulator Real-Time Clock | simrtc.asm | -| RTCDEV_INT | 0x30 | Interrupt-based Real Time Clock | intrtc.asm | -| RTCDEV_DS7 | 0x40 | Maxim DS1307 PCF I2C RTC w/ NVRAM | ds7rtc.asm | -| RTCDEV_RP5 | 0x50 | Ricoh RPC01A Real-Time Clock w/ NVRAM | rp5rtc.asm | +| RTCDEV_BQ | 0x01 | BQ4845P Real Time Clock | bqrtc.asm | +| RTCDEV_SIMH | 0x02 | SIMH Simulator Real-Time Clock | simrtc.asm | +| RTCDEV_INT | 0x03 | Interrupt-based Real Time Clock | intrtc.asm | +| RTCDEV_DS7 | 0x04 | Maxim DS1307 PCF I2C RTC w/ NVRAM | ds7rtc.asm | +| RTCDEV_RP5 | 0x05 | Ricoh RPC01A Real-Time Clock w/ NVRAM | rp5rtc.asm | The time functions to get and set the time (RTCGTM and RTCSTM) require a 6 byte date/time buffer in the following format. Each byte is BCD @@ -1001,6 +1017,198 @@ used. `\clearpage`{=latex} +## Display Keypad (DSKY) + +The Display Keypad functions provide read/write access to a segment +style display and associated hex keypad. + +HBIOS only supports a single DSKY device since there is no reason to have +more than one at a time. The DSKY unit is assigned a Device Type ID +which indicates the specific hardware device driver that handles the +unit. The table below enumerates these values. + +| **Device Type** | **ID** | **Description** | **Driver** | +|-----------------|-------:|------------------------------------------|------------| +| DSKYDEV_ICM | 0x01 | Original ICM7218 based DSKY | icm.asm | +| DSKYDEV_PKD | 0x02 | Next Gen Intel P8279 based DSKY | pkd.asm | + +When segment display function encodes the display data in a byte per +character format. Currently, all segment displays are exactly +8 charadcters and this is assumed in API calls. The encoding of each +byte is as shown below: + +``` + +---01---+ + | | + 20 02 + | | + +---40---+ + | | + 10 04 + | | + +---08---+ 80 +``` + +The keypad keys are identified by the following key ids. Not all +keypads will contain all keys. + +| **Key Id** | **Key Definition** | **Key Id** | **Key Definition** | +|------------|--------------------|------------|--------------------| +| $00 | Hex Numeric 0 | $10 | Forward | +| $01 | Hex Numeric 1 | $11 | Backward | +| $02 | Hex Numeric 2 | $12 | Clear | +| $03 | Hex Numeric 3 | $13 | Enter | +| $04 | Hex Numeric 4 | $14 | Deposit | +| $05 | Hex Numeric 5 | $15 | Examine | +| $06 | Hex Numeric 6 | $16 | Go | +| $07 | Hex Numeric 7 | $17 | Boot | +| $08 | Hex Numeric 8 | $18 | F4 | +| $09 | Hex Numeric 9 | $19 | F3 | +| $0A | Hex Numeric A | $1A | F2 | +| $0B | Hex Numeric B | $1B | F1 | +| $0C | Hex Numeric C | | | +| $0D | Hex Numeric D | | | +| $0E | Hex Numeric E | | | +| $0F | Hex Numeric F | | | + +### Function 0x30 -- DSKY Reset (DSKYRESET) + +| **Entry Parameters** | **Returned Values** | +|----------------------------------------|----------------------------------------| +| B: 0x30 | A: Status | + +This function performs a device dependent reset operation on the DSKY. +The display will be cleared, keyboard queue will be flushed, and +chip will be reinitialized. The returned Status (A) is a standard +HBIOS result code. + +### Function 0x31 -- DSKY (DSKYSTATUS) + +| **Entry Parameters** | **Returned Values** | +|----------------------------------------|----------------------------------------| +| B: 0x31 | A: Status / Characters Pending | + +Return the count of Characters Pending (A) in the input buffer of the +DSKY. If the unit has no input buffer or the +buffer utilization is not available, the function may return simply 0 or +1 where 0 means there is no character available and 1 means there is at +least one character available. + +The value returned in register A is used as both a Status (A) code and +the return value. Negative values (bit 7 set) indicate a standard HBIOS +result (error) code. Otherwise, the return value represents the number +of characters in the buffer. + +### Function 0x32 -- DSKY Get Key (DSKYGETKEY) + +| **Entry Parameters** | **Returned Values** | +|----------------------------------------|----------------------------------------| +| B: 0x32 | A: Status | +| | E: Character Value | + +Read and return a Character (E) from the DSKY. +If no character(s) are available in the unit's input buffer, this +function will wait indefinitely. The returned Status (A) is a standard +HBIOS result code. + +The Character Value (E) returned is not ASCII. It is a keypad key +id. The possible id values are listed at the start of this section. + +### Function 0x33 -- DSKY Show HEX (RTCSHOWHEX) + +| **Entry Parameters** | **Returned Values** | +|----------------------------------------|----------------------------------------| +| B: 0x33 | A: Status | +| DE:HL=Binary Value | | + +Display the 32-bit binary value (DE:HL) in hex on the DSKY segment +display. All decimal points of the display will be off. +The Status (A) is a standard HBIOS result code. + +### Function 0x34 -- DSKY Show Segments (DSKYSHOWSEG) + +| **Entry Parameters** | **Returned Values** | +|----------------------------------------|----------------------------------------| +| B: 0x34 | A: Status | +| HL: Buffer Address | | + +Display the segment-encoded values on the segment display. The encoding +is defined at the start of this section. The entire displa is updated +and it is assumed that an 8 character buffer will be pointed to by HL. +The buffer must reside in high memory. +The Status (A) is a standard HBIOS result code. + +### Function 0x35 -- DSKY Keypad LEDs (DSKYKEYLEDS) + +| **Entry Parameters** | **Returned Values** | +|----------------------------------------|----------------------------------------| +| B: 0x35 | A: Status | +| HL: Buffer Address | | + +Light the LEDs for the keypad keys according to the +bitmap contained in the buffer pointed to by HL. The buffer +must be located in high memory and is assumed to be 8 bytes. + +At this time, the bitmap is specific to the PKD hardware. +This function is ignored by the ICM hardware. +The Status (A) is a standard HBIOS result code. + +### Function 0x36 -- DSKY Status LED (DSKYSTATLED) + +| **Entry Parameters** | **Returned Values** | +|----------------------------------------|----------------------------------------| +| B: 0x36 | A: Status | +| D: LED Number | | +| E: LED State | | + +Set or clear the status LED specified in D. The state of +the LED is contained in E. If E=0, the LED will be turned +off. If E=1, the LED will be turned on. + +This function is specific to the PKD hardware. It will be ignored +by the ICM hardware. +The Status (A) is a standard HBIOS result code. + +### Function 0x37 -- DSKY Beep (DSKYBEEP) + +| **Entry Parameters** | **Returned Values** | +|----------------------------------------|----------------------------------------| +| B: 0x37 | A: Status | + +Beep the onboard speaker of the DSKY. +This function is specific to the PKD hardware. It will be ignored +by the ICM hardware. +The Status (A) is a standard HBIOS result code. + +### Function 0x38 -- DSKY Device (DSKYDEVICE) + +| **Entry Parameters** | **Returned Values** | +|----------------------------------------|----------------------------------------| +| B: 0x38 | A: Status | +| | C: Device Attributes | +| | D: Device Type | +| | E: Device Number | +| | H: Device Unit Mode | +| | L: Device I/O Base Address | + +Returns device information for the DSKY unit. The Status (A) is a +standard HBIOS result code. + +Device Attribute (C) values are not yet defined. Device Type (D) +indicates the specific hardware driver that handles the specified +character unit. Values are listed at the start of this section. Device +Number (E) indicates the physical device number assigned per driver +which is always 0 for DSKY. + +Device Mode (H) is used to indicate the variant of the chip or circuit +that is used by the specified unit. The Device I/O Base Address (L) +indicates the starting port address of the hardware interface that is +servicing the specified unit. Both of these values are considered +driver specific. Refer to the associated hardware driver for the values +used. + +`\clearpage`{=latex} + ## Video Display Adapter (VDA) The VDA functions are provided as a common interface to Video Display @@ -1014,10 +1222,11 @@ below enumerates there values. | **Device Type** | **ID** | **Description** | **Driver** | |-----------------|-------:|------------------------------------------|------------| | VDADEV_VDU | 0x00 | MC6845 Family Video Display Controller | vdu.asm | -| VDADEV_CVDU | 0x10 | MC8563-based Video Display Controller | cvdu.asm | -| VDADEV_GDC | 0x20 | uPD7220 Video Display Controller | gdc.asm | -| VDADEV_TMS | 0x30 | TMS9918/38/58 Video Display Controller | tms.asm | -| VDADEV_VGA | 0x40 | HD6445CP4-based Video Display Controller | vga.asm | +| VDADEV_CVDU | 0x01 | MC8563-based Video Display Controller | cvdu.asm | +| VDADEV_GDC | 0x02 | uPD7220 Video Display Controller | gdc.asm | +| VDADEV_TMS | 0x03 | TMS9918/38/58 Video Display Controller | tms.asm | +| VDADEV_VGA | 0x04 | HD6445CP4-based Video Display Controller | vga.asm | +| VDADEV_VRC | 0x05 | VGARC | vrc.asm | Depending on the capabilities of the hardware, the use of colors and attributes may or may not be supported. If the hardware does not support @@ -1251,14 +1460,17 @@ standard HBIOS result code. |----------------------------------------|----------------------------------------| | B: 0x47 | A: Status | | C: Video Unit | | +| D: Scope | | | E: Color | | -Assign the specified Color (E) code to be used for all subsequent -character writes/fills. This color is also used to fill new lines -generated by scroll operations. Refer to the color code table above for -a list of the available color codes. Note that a given video display may -or may not support any/all colors. The Status (A) is a standard HBIOS -result code. +Assign the specified Color (E) code for character foreground/background. +If Scope (D) is 0, the specified color will be used for all +subsequent character writes/fills. This color is also used to fill new +lines generated by scroll operations. If Scope (D) is 1, then the +specified foreground/background color will be applied immediately to the + entire screen. Refer to the color code table above for a list of the +available color codes. Note that a given video display may or may not +support any/all colors. The Status (A) is a standard HBIOS result code. ### Function 0x48 -- Video Write Character (VDAWRC) @@ -1429,9 +1641,9 @@ below enumerates these values. | **Device Type** | **ID** | **Description** | **Driver** | |-----------------|-------:|----------------------------------------------|-------------| | SNDDEV_SN76489 | $00 | SN76489 Programmable Sound Generator | sn76489.asm | -| SNDDEV_AY38910 | $10 | AY-3-8910/YM2149 Programmable Sound Generator| ay38910.asm | -| SNDDEV_BITMODE | $20 | Bit-bang Speaker | spk.asm | -| SNDDEV_YM2612 | $30 | YM2612 Programmable Sound Generator | ym2612.asm | +| SNDDEV_AY38910 | $01 | AY-3-8910/YM2149 Programmable Sound Generator| ay38910.asm | +| SNDDEV_BITMODE | $02 | Bit-bang Speaker | spk.asm | +| SNDDEV_YM2612 | $03 | YM2612 Programmable Sound Generator | ym2612.asm | The Sound functions defer the actual programming of the sound chip until the SNDPLAY function is called. You will call the volume @@ -1752,6 +1964,9 @@ The hardware Platform (L) is identified as follows: | PLT_RCZ280 |12 | RCBUS W/ Z280 | | PLT_MBC |13 | NHYODYNE MULTI-BOARD COMPUTER | | PLT_RPH |14 | RHYOPHYRE GRAPHICS SBC | +| PLT_Z80RETRO |15 | Z80 RETRO COMPUTER | +| PLT_S100 |16 | S100 COMPUTERS Z180 | +| PLT_DUO |17 | DUODYNE Z80 SYSTEM | ### Function 0xF2 -- System Set Bank (SYSSETBNK) @@ -2123,6 +2338,17 @@ Wait States (D) is the actual number of wait states, not the number of wait states added. The returned Status (A) is a standard HBIOS result code. +#### SYSGET Subfunction 0xF4 -- Get Front Panel Swithes (PANEL) + +| **Entry Parameters** | **Returned Values** | +|----------------------------------------|----------------------------------------| +| B: 0xF8 | A: Status | +| C: 0xF4 | L: Switches | + +This function will return the current value of the switches (L) from the +front panel of the system. If no front panel is available in the +system, the returned Status (A) will indicate a No Hardware error. + ### Function 0xF9 -- System Set (SYSSET) | **Entry Parameters** | **Returned Values** | @@ -2206,6 +2432,18 @@ limited set of divisors. If there is no satisfactory divisor to retain the existing baud rate under the new CPU speed, then the baud rate of the ASCI port(s) will be affected. +#### SYSSET Subfunction 0xF4 -- Set Front Panel LEDs (PANEL) + +| **Entry Parameters** | **Returned Values** | +|----------------------------------------|----------------------------------------| +| B: 0xF9 | A: Status | +| C: 0xF4 | | +| L: LEDs | | + +This function will set the front panel LEDs based on the bits in L. If +no front panel is available in the system, the returned Status (A) will +indicate a No Hardware error. + ### Function 0xFA -- System Peek (SYSPEEK) | **Entry Parameters** | **Returned Values** | diff --git a/Source/Doc/UserGuide.md b/Source/Doc/UserGuide.md index 24245f19..98113f34 100644 --- a/Source/Doc/UserGuide.md +++ b/Source/Doc/UserGuide.md @@ -11,12 +11,12 @@ companion documents you should refer to as appropriate: of RomWBW. It includes a reference for the RomWBW HBIOS API functions. -* $doc_apps$ is a reference for the OS-hosted proprietary command - line applications that were created to enhance RomWBW. - * $doc_romapps$ is a reference for the ROM-hosted applications provided with RomWBW including the monitor, programming languages, etc. +* $doc_apps$ is a reference for the OS-hosted proprietary command + line applications that were created to enhance RomWBW. + * $doc_catalog$ is a reference for the contents of the disk images provided with RomWBW. It is somewhat out of date at this time. @@ -43,6 +43,33 @@ find this document far too basic. Others will find it lacking in many areas. I am doing my best and encourage you to provide constructive feedback. +`\clearpage`{=latex} + +#### Conventions + +##### Size Suffixes + +Within this document and in RomWBW in general, the use of size +suffixes KB, MB, GB, and TB refer to the binary variant as shown +below. The modern suffixes (KiB, MiB, etc.) are not used here because +they were not prevalent during the time that the RomWBW OSes were +used. This keeps all of RomWBW and associated applications consistent. + +| Suffix | Value | Meaning | +|------------|-----------|----------------------------------------| +| KB | 1024 | 1,024 bytes | +| MB | 1024^2^ | 1,048,576 bytes | +| GB | 1024^3^ | 1,073,741,824 bytes | +| TB | 1024^4^ | 1,099,511,627,776 bytes | + +##### Links and URLs + +Many of the references in this document to Internet addresses (URLs) +do not provide the address in the text. However, these links are +embedded and "clickable" within the documents. Your PDF viewer should +highlight these links in some manner (typically an alternate color +or an underline). + # Overview RomWBW software provides a complete, commercial quality @@ -52,14 +79,23 @@ A wide variety of platforms are supported including those produced by these developer communities: * [RetroBrew Computers](https://www.retrobrewcomputers.org) -* [RC2014](https://rc2014.co.uk), [RC2014-Z80](https://groups.google.com/g/rc2014-z80) -* [retro-comp](https://groups.google.com/forum/#!forum/retro-comp) + () +* [RC2014](https://rc2014.co.uk) (), \ + [RC2014-Z80](https://groups.google.com/g/rc2014-z80) + () +* [Retro Computing](https://groups.google.com/g/retro-comp) + () * [Small Computer Central](https://smallcomputercentral.com/) + () + +A complete list of the currently supported platforms is found in the +[Installation] section. General features include: +* Z80 Family CPUs including Z80, Z180, and Z280 * Banked memory services for several banking designs -* Disk drivers for RAM, ROM, Floppy, IDE, CF, and SD +* Disk drivers for RAM, ROM, Floppy, IDE ATA/ATAPI, CF, SD, USB, Zip, Iomega * Serial drivers including UART (16550-like), ASCI, ACIA, SIO * Video drivers including TMS9918, SY6545, MOS8563, HD6445 * Keyboard (PS/2) drivers via VT8242 or PPI interfaces @@ -76,12 +112,12 @@ ROM firmware itself: * ROM BASIC (Nascom BASIC and Tasty BASIC) * ROM Forth -A dynamic disk drive letter assignment mechanism allows mapping -operating system drive letters to any available disk media. -Additionally, mass storage devices (IDE Disk, CF Card, SD Card) support -the use of multiple slices (up to 256 per device). Each slice contains -a complete CP/M filesystem and can be mapped independently to any -drive letter. This overcomes the inherent size limitations in legacy +A dynamic disk drive letter assignment mechanism allows mapping +operating system drive letters to any available disk media. +Additionally, mass storage devices (IDE Disk, CF Card, SD Card, etc.) +support the use of multiple slices (up to 256 per device). Each slice +contains a complete CP/M filesystem and can be mapped independently to +any drive letter. This overcomes the inherent size limitations in legacy OSes and allows up to 2GB of accessible storage on a single device. The pre-built ROM firmware images are generally suitable for most @@ -103,7 +139,7 @@ By design, RomWBW isolates all of the hardware specific functions in the ROM chip itself. The ROM provides a hardware abstraction layer such that all of the operating systems and applications on a disk will run on any RomWBW-based system. To put it simply, you can take -a disk (or CF/SD Card) and move it between systems transparently. +a disk (or CF/SD/USB Card) and move it between systems transparently. A tool is provided that allows you to access a FAT-12/16/32 filesystem. The FAT filesystem may be coresident on the same disk media as RomWBW @@ -114,18 +150,19 @@ OSes such as Windows, MacOS, and Linux very easy. ## Acquiring RomWBW -The [RomWBW Repository](https://github.com/wwarthen/RomWBW) on GitHub is -the official distribution location for all project source and -documentation. The fully-built distribution releases are available on -the [RomWBW Releases Page](https://github.com/wwarthen/RomWBW/releases) -of the repository. On this page, you will normally see a Development -Snapshot as well as recent stable releases. Unless you have a specific -reason, I suggest you stick to the most recent stable release. Expand -the "Assets" drop-down for the release you want to download, then select -the asset named RomWBW-vX.X.X-Package.zip. The Package asset includes -all pre-built ROM and Disk images as well as full source code. The other -assets contain only source code and do not have the pre-built ROM or -disk images. +The [RomWBW Repository](https://github.com/wwarthen/RomWBW) +() on GitHub is the official +distribution location for all project source and documentation. The +fully-built distribution releases are available on the +[RomWBW Releases Page](https://github.com/wwarthen/RomWBW/releases) +() of the repository. On +this page, you will normally see a Development Snapshot as well as +recent stable releases. Unless you have a specific reason, I suggest you + stick to the most recent stable release. Expand the "Assets" drop-down +for the release you want to download, then select the asset named +RomWBW-vX.X.X-Package.zip. The Package asset includes all pre-built ROM +and Disk images as well as full source code. The other assets contain +only source code and do not have the pre-built ROM or disk images. All source code and distributions are maintained on GitHub. Code contributions are very welcome. @@ -137,12 +174,12 @@ a set of directories. Each of these directories has its own ReadMe.txt file describing the contents in detail. In summary, these directories are: -| **Directory** | **Description** | -|-----------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| **Binary** | The final output files of the build process are placed here. Most importantly, the ROM images with the file names ending in ".rom" and disk images ending in .img. | -| **Doc** | Contains various detailed documentation, both RomWBW specifically as well as the operating systems and applications. | -| **Source** | Contains the source code files used to build the software and ROM images. | -| **Tools** | Contains the programs that are used by the build process or that may be useful in setting up your system. | +| **Directory** | **Description** | +|--------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| **Binary** | The final output files of the build process are placed here. Most importantly, the ROM images with the file names ending in ".rom" and disk images ending in .img. | +| **Doc** | Contains various detailed documentation, both RomWBW specifically as well as the operating systems and applications. | +| **Source** | Contains the source code files used to build the software and ROM images. | +| **Tools** | Contains the programs that are used by the build process or that may be useful in setting up your system. | ## Installation @@ -152,6 +189,12 @@ distribution. Subsequently, you can write disk images on your disk drives (IDE disk, CF Card, SD Card, etc.) which then provides even more functionality. +**NOTE:** The pre-built ROM images distributed with RomWBW are based on +the default system configurations as determined by the hardware +provider/designer. This document does not provide hardware +construction or configuration information. Please contact your hardware +provider/designer as needed. + The pre-built ROM images will automatically detect and support typical devices for their corresponding platform including serial ports, video adapters, on-board disk interfaces, and PropIO/ParPortProp boards @@ -164,43 +207,62 @@ Depending on how you got your hardware, you may have already been provided with a pre-programmed ROM chip. If so, use that initially. Otherwise, you will need to use a ROM programmer to initially program your ROM chip. Please refer to the documentation that came with your ROM -programmer for more information. Once you have a running RomWBW system, -you can generally update your ROM to a newer version in-situ with the -included ROM Flashing tool (Will Sowerbutts' FLASH application) as -described in the Upgrading section of this document. +programmer for more information. The Binary directory of the distribution contains the pre-built ROM and -disk images. The ROM image files all end in ".rom". Based on the table -below, **carefully** pick the appropriate ROM image for your hardware. - -| **Description** | **Bus** | **ROM Image File** | **Baud Rate** | -|----------------------------------------------------------------|---------|--------------------|--------------:| -| [RetroBrew Z80 SBC]^1^ | ECB | SBC_std.rom | 38400 | -| [RetroBrew Z80 SimH]^1^ | - | SBC_simh.rom | 38400 | -| [RetroBrew N8 Z180 SBC]^1^ (date code >= 2312) | ECB | N8_std.rom | 38400 | -| [Zeta Z80 SBC]^2^, ParPortProp | - | ZETA_std.rom | 38400 | -| [Zeta V2 Z80 SBC]^2^, ParPortProp | - | ZETA2_std.rom | 38400 | -| [Mark IV Z180 SBC]^3^ | ECB | MK4_std.rom | 38400 | -| [RCBus Z80 CPU Module]^4^, 512K RAM/ROM | RCBus | RCZ80_std.rom | 115200 | -| [RCBus Z80 CPU Module]^4^, 512K RAM/ROM, KIO | RCBus | RCZ80_kio.rom | 115200 | -| [RCBus Z180 CPU Module]^4^ w/ external banking | RCBus | RCZ180_ext.rom | 115200 | -| [RCBus Z180 CPU Module]^4^ w/ native banking | RCBus | RCZ180_nat.rom | 115200 | -| [RCBus Z280 CPU Module]^4^ w/ external banking | RCBus | RCZ180_ext.rom | 115200 | -| [RCBus Z280 CPU Module]^4^ w/ native banking | RCBus | RCZ180_nat.rom | 115200 | -| [Easy Z80 SBC]^2^ | RCBus | RCZ80_easy.rom | 115200 | -| [Tiny Z80 SBC]^2^ | RCBus | RCZ80_tiny.rom | 115200 | -| [Z80-512K CPU/RAM/ROM Module]^2^ | RCBus | RCZ80_skz.rom | 115200 | -| [Small Computer SC126 Z180 SBC]^5^ | BP80 | SCZ180_sc126.rom | 115200 | -| [Small Computer SC130 Z180 SBC]^5^ | RCBus | SCZ180_sc130.rom | 115200 | -| [Small Computer SC131 Z180 Pocket Computer]^5^ | - | SCZ180_sc131.rom | 115200 | -| [Small Computer SC140 Z180 CPU Module]^5^ | Z50 | SCZ180_sc140.rom | 115200 | -| [Small Computer SC503 Z180 CPU Module]^5^ | Z50 | SCZ180_sc503.rom | 115200 | -| [Dyno Z180 SBC]^6^ | Dyno | DYNO_std.rom | 38400 | -| [Nhyodyne Z80 MBC]^1^ | MBC | MBC_std.rom | 38400 | -| [Rhyophyre Z180 SBC]^1^ | - | RPH_std.rom | 38400 | -| [Z80 ZRC CPU Module]^7^ | RCBus | RCZ80_zrc.rom | 115200 | -| [Z280 ZZRCC CPU Module]^7^ | RCBus | RCZ280_zzrc.rom | 115200 | -| [Z280 ZZ80MB SBC]^7^ | RCBus | RCZ280_zz80mb.rom | 115200 | +disk images. Refer to [Supported Platforms] below to identify the +correct ROM image for your system. + +Once you have a running RomWBW system, you can generally update your ROM +to a newer version in-situ with the included ROM Flashing tool (Will +Sowerbutts' FLASH application) as described in the [Upgrading] chapter +of this document. + +## Supported Platforms + +The table below summarizes the hardware platforms currently supported +by RomWBW along with the standard pre-built ROM image(s). RomWBW does +allow for the creation of ROM images with custom configurations. This +is discussed in [Customizing RomWBW]. + +| **Description** | **Bus** | **ROM Image File** | **Baud Rate** | +|----------------------------------------------------------------|---------|-----------------------|--------------:| +| [RetroBrew Z80 SBC]^1^ | ECB | SBC_std.rom | 38400 | +| [RetroBrew Z80 SimH]^1^ | - | SBC_simh.rom | 38400 | +| [RetroBrew N8 Z180 SBC]^1^ (date code >= 2312) | ECB | N8_std.rom | 38400 | +| [Zeta Z80 SBC]^2^, ParPortProp | - | ZETA_std.rom | 38400 | +| [Zeta V2 Z80 SBC]^2^, ParPortProp | - | ZETA2_std.rom | 38400 | +| [Mark IV Z180 SBC]^3^ | ECB | MK4_std.rom | 38400 | +| [RCBus Z80 CPU Module]^4^, 512K RAM/ROM | RCBus | RCZ80_std.rom | 115200 | +| [RCBus Z80 CPU Module]^4^, 512K RAM/ROM, KIO | RCBus | RCZ80_kio.rom | 115200 | +| [RCBus Z180 CPU Module]^4^ w/ external banking | RCBus | RCZ180_ext.rom | 115200 | +| [RCBus Z180 CPU Module]^4^ w/ native banking | RCBus | RCZ180_nat.rom | 115200 | +| [RCBus Z280 CPU Module]^4^ w/ external banking | RCBus | RCZ180_ext.rom | 115200 | +| [RCBus Z280 CPU Module]^4^ w/ native banking | RCBus | RCZ180_nat.rom | 115200 | +| [Easy Z80 SBC]^2^ | RCBus | RCZ80_easy.rom | 115200 | +| [Tiny Z80 SBC]^2^ | RCBus | RCZ80_tiny.rom | 115200 | +| [Z80-512K CPU/RAM/ROM Module]^2^ | RCBus | RCZ80_skz.rom | 115200 | +| [Small Computer SC126 Z180 SBC]^5^ | BP80 | SCZ180_sc126.rom | 115200 | +| [Small Computer SC130 Z180 SBC]^5^ | RCBus | SCZ180_sc130.rom | 115200 | +| [Small Computer SC131 Z180 Pocket Computer]^5^ | - | SCZ180_sc131.rom | 115200 | +| [Small Computer SC140 Z180 CPU Module]^5^ | Z50 | SCZ180_sc140.rom | 115200 | +| [Small Computer SC503 Z180 CPU Module]^5^ | Z50 | SCZ180_sc503.rom | 115200 | +| [Small Computer SC700 Z180 CPU Module]^5^ | RCBus | SCZ180_sc700.rom | 115200 | +| [Dyno Z180 SBC]^6^ | Dyno | DYNO_std.rom | 38400 | +| [Nhyodyne Z80 MBC]^1^ | MBC | MBC_std.rom | 38400 | +| [Rhyophyre Z180 SBC]^1^ | - | RPH_std.rom | 38400 | +| [Z80 ZRC CPU Module]^7^ | RCBus | RCZ80_zrc.rom | 115200 | +| [Z80 ZRC CPU Module]^7^ ROMless | RCBus | RCZ80_zrc_ram.rom | 115200 | +| [Z80 ZRC512 CPU Module]^7^ | RCBus | RCZ80_zrc512.rom | 115200 | +| [Z180 Z1RCC CPU Module]^7^ | RCBus | RCZ180_z1rcc.rom | 115200 | +| [Z280 ZZRCC CPU Module]^7^ | RCBus | RCZ280_zzrcc.rom | 115200 | +| [Z280 ZZRCC CPU Module]^7^ ROMless | RCBus | RCZ280_zzrcc_ram.rom | 115200 | +| [Z280 ZZ80MB SBC]^7^ | RCBus | RCZ280_zz80mb.rom | 115200 | +| [Z80-Retro SBC]^8^ | - | Z80RETRO_std.rom | 38400 | +| [S100 Computers Z180]^9^ | S100 | S100_std.rom | 57600 | +| [Duodyne Z80 System]^1^ | Duo | DUO_std.rom | 38400 | +| [Heath H8 Z80 System]^10^ | H8 | HEATH_std.rom | 115200 | +| [EP Mini-ITX Z180]^11^ | RCBus? | EPITX_std.rom | 115200 | | ^1^Designed by Andrew Lynch | ^2^Designed by Sergey Kiselev @@ -209,6 +271,10 @@ below, **carefully** pick the appropriate ROM image for your hardware. | ^5^Designed by Stephen Cousins | ^6^Designed by Steve Garcia | ^7^Designed by Bill Shen +| ^8^Designed by Peter Wilson +| ^9^Designed by John Monahan +| ^10^Designed by Les Bird +| ^11^Designed by Alan Cox RCBus refers to Spencer Owen's RC2014 bus specification and derivatives including RC26, RC40, RC80, and BP80. @@ -236,8 +302,8 @@ of the ROM chip (address 0). Most of the pre-built images are program the image into the first 512KB of the ROM for now. Initially, don't worry about trying to write a disk image to any disk -(or CF/SD) devices you have. This will be covered later. You will be -able to boot and check out your system with just the ROM. +(or CF/SD/USB) devices you have. This will be covered later. You will +be able to boot and check out your system with just the ROM. Connect a serial terminal or computer with terminal emulation software to the primary serial port of your CPU board. You may need to refer to @@ -245,7 +311,8 @@ your hardware provider's documentation for details. A null-modem connection may be required. Set the baud rate as indicated in the table above. Set the line characteristics to 8 data bits, 1 stop bit, no parity, and no flow control. If possible, select ANSI or VT-100 terminal -emulation. +emulation. Hardware flow control is not required for terminal +operation, but may be necessary for [Serial Port Transfers]. RomWBW will automatically attempt to detect and support typical add-on components for each of the systems supported. More information on the @@ -321,7 +388,8 @@ with the system. At the Boot Loader prompt, you can type `H ` for help. You can type `L ` to list the available built-in ROM applications. If your terminal supports ANSI escape sequences, you can try the -'G' command to play a simple on-screen game. +'P' command to play a simple on-screen game. Instructions for the +game are found in $doc_romapps$. If all of this seems fine, your ROM has been successfully programmed. See the [Boot Loader Operation] section of this document for further @@ -349,7 +417,7 @@ example, the platform is the RCBus running a configuration named There are 0 memory wait states and 1 I/O wait state. Z80 interrupt mode 2 is active and the bank memory manager is type "Z2" which is standard for RCBus. The system has 512KB of ROM total and 512KB of RAM total. -Finally, a verification of the checksum of the critical ROM banks is +Finally, a verification of the checksums of the critical ROM banks is shown (all 4 should be 00). RomWBW attempts to detect the running configuration of the @@ -464,7 +532,8 @@ system supports up to two drives, but there is only one actual drive attached. A unit number is assigned to all available devices regardless of whether they have actual media installed at boot time. -Note that Character Unit 0 is normally the initial system console. +Note that Character Unit 0 is the initial system console unless modified +in a customized ROM image. If your system has an RTC/NVRAM device, it will not be listed in the unit summary table. Since only a single RTC/NVRAM device can exist in @@ -480,7 +549,9 @@ select and launch a desired application or operating system. It also has the ability to configure some aspects of system operation. After starting your system, following the hardware initialization, you -will see the RomWBW Boot Loader prompt. Below is an example: +will see the RomWBW Boot Loader prompt. Below is an example. Note +that the text preceding "Boot Loader" will vary and identifies your +specific system and configuration. ``` Mark IV [MK4_wbw] Boot Loader @@ -563,12 +634,19 @@ prompt: | Play | A simple video game (requires ANSI terminal emulation) | | Network Boot | Boot system via Wiznet MT011 device | | Flash Update | Upload and flash a new ROMWBW image using xmodem | +| User App | User written application placeholder | + +The User App is provided as a way to access a custom written +ROM module. In the pre-built ROMs, selecting User App will just +return to the Boot Loader menu. If you are interested in creating a +custom application to run here, review the "usrrom.asm" file in the +Source/HBIOS folder of the distribution. Each of the ROM Applications is documented in $doc_romapps$. Some of the applications (such as BASIC) also have their own independent manual in the Doc directory of the distribution. The OSes included in the ROM (CP/M 2.2 & Z-System) are described in the Operating Systems -section of this document. +chapter of this document. In general, the command to exit any of these applications and restart the system is `BYE`. The exceptions are the Monitor which uses `B` and @@ -586,6 +664,14 @@ technique is useful when: The RAM disk and ROM disk drives will be available even if you have no physical disk devices attached to your system. +Booting an operating system from ROM is not intended as a way to use +your operating system on a long-term basis. The ROM disk has only +a small subset of the operating system files. Additionally, you +cannot easily customize your ROM disk because you cannot write to it. +For any significant use of an operating system, you should boot directly +to the disk/slice that contains the complete operating system. This +is described in the next section. + ## Starting Operating Systems from Disk In order to make use of the more sophisticated operating systems @@ -609,7 +695,7 @@ has been assigned to the disk and slice you selected to boot. If you receive the error message "Disk not bootable!", you have either failed to properly initialize the disk and slice requested -or you have selected the wrong disk/slice. +or you have selected an invalid/unavailable disk/slice. The following example shows a disk boot into the first slice of disk unit 4 which happens to be the CP/M 2.2 operating system on this disk. @@ -685,41 +771,70 @@ drive assignments during initialization. In this case, you can use the The Boot Loader simply launches whatever is in the disk unit/slice you have specified. It does not know what operating system is at that location. The layout of operating systems on disk media is described in -the Using Disks section of this document. +the [Disk Images] section of this document. + +### Auto-Submit Batch Files + +All of the operating systems supplied with RomWBW have the ability to +execute a "batch" of commands by creating a batch submission file +containing the commands to be executed. The specifics of using +batch files in a specific operating system is covered in its specific +documentation. + +At boot, the operating system will look for a specific batch file +(`PROFILE.SUB` for CP/M 2.2 and 3) on the boot drive and execute that +batch file automatically. This allows you to automatically customize +your operating system with any commands desired at boot. CP/M 2.2 did +not originally have the ability to automatically excute a batch file at +boot, but the CBIOS in RomWBW has added this capability. + +Since RomWBW can utilize many disk slices, it is very easy to create +slices for specific workflows (editing, software development, games, +etc.). You can then just boot to the slice that is optimized for the +task you want to perform. ## System Management -### Listing Disk Device Inventory +### Listing Device Inventory -The disk device units available in your system are listed in the +The device units available in your system are listed in the boot messages. However, if that list has scrolled off of your screen, you can use the 'D' command to display a list of them at any time from the Boot Loader prompt. ``` -Boot [H=Help]: d - -Disk Devices: - - Disk Unit 0 on MD0: - Disk Unit 1 on MD1: - Disk Unit 2 on FD0: - Disk Unit 3 on FD1: - Disk Unit 4 on IDE0: - Disk Unit 5 on IDE1: - Disk Unit 6 on IDE2: - Disk Unit 7 on IDE3: - Disk Unit 8 on IDE4: - Disk Unit 9 on IDE5: - Disk Unit 10 on SD0: - Disk Unit 11 on PRPSD0: +Unit Device Type Capacity/Mode +---------- ---------- ---------------- -------------------- +Char 0 ASCI0: RS-232 38400,8,N,1 +Char 1 ASCI1: RS-232 38400,8,N,1 +Char 2 UART0: RS-232 38400,8,N,1 +Char 3 UART1: RS-232 38400,8,N,1 +Char 4 UART2: RS-232 38400,8,N,1 +Char 5 UART3: RS-232 38400,8,N,1 +Char 6 TERM0: Terminal Video 0,ANSI +Char 7 PRPCON0: Terminal Term Module,ANSI +Disk 0 MD0: RAM Disk 352KB,LBA +Disk 1 MD1: Flash Drive 384KB,LBA +Disk 2 FD0: Floppy Disk 3.5",DS/HD,CHS +Disk 3 FD1: Floppy Disk 3.5",DS/HD,CHS +Disk 4 IDE0: CompactFlash 3815MB,LBA +Disk 5 IDE1: Hard Disk -- +Disk 6 IDE2: CompactFlash 3823MB,LBA +Disk 7 IDE3: Hard Disk -- +Disk 8 IDE4: Hard Disk -- +Disk 9 IDE5: Hard Disk -- +Disk 10 SD0: SD Card -- +Disk 11 PRPSD0: SD Card 15193MB,LBA +Video 0 TMS0: CRT Text,40x24 +Sound 0 SND0: AY-3-8910 3+1 CHANNELS ``` ### Rebooting the System The 'R' command within the Boot Loader performs a software reset of -the system. It is the software equivalent of pressing the reset -button. +the system. The system will perform a startup just like powering +up or pressing the hardware reset button (although the hardware is +not physically reset). There is generally no need to do this, but it can be convenient when you want to see the boot messages again or ensure your system is in @@ -782,11 +897,60 @@ The use of diagnostic levels above 4 are really intended only for software developers. I do not recommend changing this under normal circumstances. +## Front Panel + +RomWBW supports the concept of a simple front panel. The following +image is a conceptual view of such a front panel. If your system has a +front panel, it should look similar to the [RomWBW Front Panel](#panel). + +![RomWBW Front Panel](Graphics/Panel){#panel width=50% } + +The LEDs in the top row of the panel are used for multiple purposes. +They are initially used to display the progress of the +system boot. This may help in diagnosing a hardware or configuration +issue in a system that does not progress far enough to display text +output on the console. The meaning of the LEDs is: + +| | | +|------------|------------------------------| +| `O-------` | System Boot has started | +| `OO------` | Common RAM bank activated | +| `OOO-----` | HBIOS transitioned to RAM | +| `OOOO----` | Basic initialization done | +| `OOOOO---` | CPU detection complete | +| `OOOOOO--` | System timer configured | +| `OOOOOOO-` | Pre-console device init done | +| `OOOOOOOO` | Console activation | + +Once the system has booted, the LEDs are used to indicate disk device +activity. Each LED numbered 7-0 represents disk units 7-0. As each +disk device performs I/O, the LED will light. + +The second row of the front panel is composed of switches that allow +you to control a few aspects of the system startup. + +The first two switches affect the device used as the console initially. +Setting the CRT/Serial switch will cause the system to boot directly +to an attached CRT device (if available). Setting the Pri/Sec switch +will cause the system to boot to the secondary Serial or CRT device +(depending on the setting of the first switch). + +The final six switches allow you to cause the system to automatically +boot into a desired function. The Auto/Menu switch must be set to +enable this, otherwise the normal ROM Loader prompt will be used. +If the Disk/ROM switch is not set, then you can use the last 3 +switches to select a ROM app to auto-start. If the Disk/ROM switch is +set, then the system will attempt a disk boot based on the following +switches. The Floppy/Hard switch can be used to boot to a Floppy or +Hard Disk. In either case, the first Floppy or Hard Disk will be used +for the boot. If a Hard Disk boot is selected, then the last three +switches can be used to select any of the first 8 slices. + # Disk Management The systems supported by RomWBW all have the ability to use persistent disk media. A wide variety of disk devices are supported including -floppy drives, hard disks, CF Cards, and SD Cards. RomWBW also +floppy drives, hard disks, CF Cards, SD Cards, etc. RomWBW also supports the use of extra RAM and ROM memory as pseudo-disk devices. RomWBW supports a variety of storage devices which will be discussed @@ -795,7 +959,7 @@ in more detail later. * ROM Disk * RAM Disk * Floppy Disk -* Hard Disk (includes CF Cards and SD Cards) +* Hard Disk (includes CF Cards, SD Cards, USB Drives, etc.) We will start by discussing each of these types of storage devices and how to prepare them so files can be stored on them. Subsequently, we @@ -828,10 +992,10 @@ Once your system has working disk devices, they will be accessible from any operating system you choose to run. Disk storage is available whether you boot your OS from ROM or from the disk media itself. -Referring back to the Boot Loader section on "Launching from ROM", you -could start CP/M 2.2 using the 'C' command. As the operating system -starts up, you should see a list of drive letters assigned to the disk -media you have installed. Here is an example of this: +Referring back to [Starting Applications from ROM], you could start CP/M +2.2 using the 'C' command. As the operating system starts up, you +should see a list of drive letters assigned to the disk media you have +installed. Here is an example of this: ``` Configuring Drives... @@ -843,7 +1007,7 @@ Configuring Drives... ``` You will probably see more drive letters than this. The drive letter -assignment process is described below in the Drive Letter Assignment +assignment process is described below in the [Drive Letter Assignment] section. Be aware that RomWBW will only assign drive letters to disk interfaces that actually have media in them. If you do not see drive letters assigned as expected, refer to the prior system boot messages @@ -856,7 +1020,7 @@ interface like IDE0. This is important as it is telling you what each drive letter refers to. Also notice that mass storage disks (like IDE) will normally have multiple drive letters assigned. The extra drive letters refer to additional "slices" on the disk. The concept of slices -is described below in the Slices section. +is described below in the [Slices] section. ## Drive Letter Assignment @@ -908,16 +1072,24 @@ Drives E: thru L: have been assigned to the IDE0 hard disk device. The 4 entries for IDE0 are referring to 4 slices on that disk. Slices are discussed later. -The drive letter assignments **do not** change during an OS session -unless you use the `ASSIGN` command yourself to do it. Additionally, -the assignments at boot will stay the same on each boot as long as you -do not make changes to your hardware configuration. Note that the -assignments **are** dependent on the media currently inserted in hard -disk drives. So, notice that if you insert or remove an SD Card or CF -Card, the drive assignments will change. Since drive letter -assignments can change, you must be careful when doing destructive -things like using `CLRDIR` to make sure the drive letter you use is -referring to the desired media. +**WARNING**: Drive letter assignments do **not** ensure that the slice +referenced by the drive letter actually fits on the media you are using. +For example, a typical 64MB CF Card (which is typically a bit smaller +than 64MB) will only fit 7 slices. At startup, you will typically see +8 drive letters assigned to the CF Card. Attempting to access the +last drive letter will result in a "no disk" error from the operating +system. + +The drive letter assignments **do not** change during an OS session +unless you use the `ASSIGN` command yourself to do it. Additionally, the + assignments at boot will stay the same on each boot as long as you do +not make changes to your hardware configuration. Note that the +assignments **are** dependent on the media currently inserted in hard +disk drives when the operating system is started. So, notice that if you + insert or remove an SD Card, CF Card or USB Drive, the drive +assignments will change. Since drive letter assignments can change, you +must be careful when doing destructive things like using `CLRDIR` to +make sure the drive letter you use is referring to the desired media. When performing a ROM boot of an operating system, note that A: will be your RAM disk and B: will be your ROM disk. When performing a disk @@ -926,12 +1098,76 @@ rest of the drive letters will be offset to accommodate this. This is done because most legacy operating systems expect that A: will be the boot drive. +### Default Drive Letter Assignment + +As shown above, when an operating system is booted, RomWBW will +automatically assign drive letters to physical disk devices. The +assignment process varies depending on: 1) the drive/slice you choose to +boot from, and 2) the number and type of physical drives in your +system. + +If you boot an operating system from ROM, then the first two drive +letters will be assigned to your RAM disk (A:) and your ROM disk (B:). +It may seem odd that the RAM disk is assigned to A: in this case. The +reason for this is to accommodate certain functions that require that A: +be a writable disk drive. For example, A: **must** be writable in order +to submit batch files. + +If you boot to a physical disk device, then the first drive letter (A:) +will be assigned to the disk/slice that you chose to boot from. The A: +drive letter is considered special by most operating systems and is +automatically used in some cases. By making the selected disk/slice the +A: drive, you can setup different disks/slices for specific uses and +just boot to it. + +After the first drive letter is assigned (as well as the second drive +letter in the case of a ROM boot), RomWBW will assign additional drive +letters based on the disk drives in the system. Additional drive +letters will be assigned in the following order: + +- RAM Disk +- ROM Disk +- Floppy Disk(s) +- Hard Disk(s) + +If a disk/slice was already assigned as the A: (or B:) drive letter, +then it will not be assigned again. + +In the case of floppy, RAM, and ROM disks, a single drive letter will be +assigned to each physical disk (even if there is no disk media in the +drive). + +In the case of hard disks, 1-8 drive letters will be assigned to the +initial 1-8 slices of the disk drive. The number of drive letters +assigned to each hard disk depends on the number of hard disks in the +system: + +- 1 Hard Disk: 8 drive letters (slices) +- 2 Hard Disks: 4 drive letters (slices) per disk +- 3+ Hard Disks: 2 drive letters (slices) per disk + +This somewhat complicated algorithm is used to try and maximize the +limited number of operating system drive letters available (16) to +the available disk devices as evenly as possible. + +Note that for hard disk devices, drive letters will only be assigned +to disk devices that actually contain media. So, for example, if you +have an SD Card slot in your system, but it has no SD Card inserted, then +no drive letters will be assigned to it. + +Since drive letter assignments are easily changed at any time using the +`ASSIGN` command, you can customize your assignments as desired after +starting the operating system. Even better, you can use an auto-submit +batch file to customzie the assignments at startup without any user +intervention. + ## ROM & RAM Disks A typical RomWBW system has 512KB of ROM and 512KB of RAM. Some portions of each are dedicated to loading and running applications and operating system. The space left over is available for an -operating system to use as a pseudo-disk device. +operating system to use as a pseudo-disk device (ROM Disk and RAM +Disk). The RAM disk provides a small CP/M filesystem that you can use for the temporary storage of files. Unless your system has a battery backed @@ -960,13 +1196,13 @@ actual operating system and are not "bootable". However, they are accessible to any operating system (whether the operating system is loaded from ROM or a different disk device). -Neither RAM not ROM disks require explicit formatting or initialization. +Neither RAM nor ROM disks require explicit formatting or initialization. ROM disks are pre-formatted and RAM disks are formatted automatically with an empty directory when first used. #### Flash ROM Disks -The limitation of ROM disks being read only can be overcome on some +The limitation of ROM disks being read-only can be overcome on some platforms with the appropriate selection of Flash ROM chip and system configuration. In this case the flash-file system can be enabled which will allow the ROM disk to be read and written to. @@ -992,12 +1228,12 @@ adapts to double-density or high-density media. It cannot automatically detect 3.5" vs. 5.25" drive types -- the ROM must be pre-configured for the drive type. -Floppy media must be physically formatted before it can be used. This +Floppy media must be physically formatted before it can be used. This is normally accomplished by using the supplied Floppy Disk Utility (FDU) -application. This application interacts directly with your hardware -and therefore you must specify your floppy interface hardware at startup. -Additionally, you need to specify the floppy drive and media format to -use for formatting. +application. This application interacts directly with your hardware +and therefore you must specify your floppy interface hardware at +application startup. Additionally, you need to specify the floppy drive +and media format to use for formatting. Below is a sample session using FDU to format a 1.44M floppy disk in the first (primary) floppy disk drive: @@ -1086,7 +1322,9 @@ the appropriate OS/application documentation as needed. **WARNING:** Some of the operating systems provided with RomWBW require that a soft-reset be performed when swapping floppy disk media. For example, under CP/M 2.2, you must press control-C at the CP/M prompt -after inserting a new floppy disk. +after inserting a new floppy disk. The consequences of failing to +perform the soft-reset vary from unexpected error messages to full +disk directory corruption. ## Hard Disks @@ -1150,14 +1388,14 @@ available storage devices. The allocation will depend on the number of mass storage devices available at boot. For example, if you have only one hard disk type media, you will see that 8 drive letters are assigned to the first 8 slices of that media. If you have two large -storage devices, you will see that each device is allocated four drive +storage devices, you will see that each device is allocated 4 drive letters. -Referring to slices within a storage device is done by appending a : -** where ** is the device relative slice number from 0-255. For -example, if you have an IDE device, it will show up as IDE0: in the -boot messages meaning the first IDE device. To refer to the fourth -slice of IDE0, you would type "IDE0:3". Here are some examples: +Referring to slices within a storage device is done by appending a +`:` where \ is the device relative slice number from 0-255. +For example, if you have an IDE device, it will show up as IDE0: in the +boot messages meaning the first IDE device. To refer to the fourth slice +of IDE0, you would type "IDE0:3". Here are some examples: | | | |----------|------------------------------| @@ -1165,14 +1403,14 @@ slice of IDE0, you would type "IDE0:3". Here are some examples: | `IDE0:` | First slice of disk in IDE0 | | `IDE0:3` | Fourth slice of disk in IDE0 | -So, if you wanted to use drive letter L: to refer to the fourth slice -of IDE0, you could use the command `ASSIGN L:=IDE0:3`. There are a -couple of rules to be aware of when assigning drive letters. First, -you may only refer to a specific device/slice with one drive letter at a time. -Said another way, you cannot have multiple drive letters referring -to a the same device/slice at the same time. Second, there must always -be a drive assigned to A:. Any attempt to violate these rules will -be blocked by the `ASSIGN` command. +So, if you wanted to use drive letter L: to refer to the fourth slice of +IDE0, you could use the command `ASSIGN L:=IDE0:3`. There are a couple +of rules to be aware of when assigning drive letters. First, you may +only refer to a specific device/slice with one drive letter at a time. +Said another way, you cannot have multiple drive letters referring to a +the same device/slice at the same time. Second, there must always be a +drive assigned to A:. Any attempt to violate these rules will be blocked +by the `ASSIGN` command. In case this wasn't already clear, you **cannot** refer directly to slices using CP/M. CP/M only understands drive letters, so @@ -1201,6 +1439,11 @@ absolutely sure you know what media and slice are assigned to that drive letter before using `CLRDIR` because CLRDIR will wipe out any pre-existing contents of the slice. +**WARNING**: The `CLRDIR` application does not appear to check for +disk errors when it runs. If you attempt to run `CLRDIR` on a drive +that is mapped to a slice that does not actually fit on the physical +disk, it may behave erratically. + Here is an example of using `CLRDIR`. In this example, the `ASSIGN` command is used to show the current drive letter assignments. Then the `CLRDIR` command is used to initialize the directory of drive 'G' @@ -1241,14 +1484,16 @@ to the size of the disk media -- if you attempted to read/write to a slice that would exceed the disk size, you would see I/O errors. This is considered the "legacy" disk layout for RomWBW. -RomWBW has subsequently been enhanced to support the concept of +Starting with v3.2, RomWBW has been enhanced to support the concept of partitioning. The partition mechanism is entirely compliant with Master - Boot Record (MBR) Partition Tables introduced by IBM for the PC. The +Boot Record (MBR) Partition Tables introduced by IBM for the PC. The Wikipedia article on the [Master Boot Record](https://en.wikipedia.org/wiki/Master_boot_record) is excellent if you are not familiar with them. This is considered the "modern" disk layout for RomWBW. RomWBW uses the partition type id -0x2E. RomWBW does not support extended partitions -- only a single +0x2E. This partition type id does not equate to any existing well-known +partition types -- it was chosen because it is not generally used. +RomWBW does not support extended partitions -- only a single primary partition can be used. Both the legacy and modern disk layouts continue to be fully supported @@ -1263,6 +1508,8 @@ the legacy disk layout contain 512 directory entries. The modern disk layout filesystems provide 1024 directory entries. In fact, you will subsequently see that the prefixes "hd512" and "hd1k" are used to identify disk images appropriate for the legacy and modern format. +These prefixes were chosen specifically to highlight the number of +directory entries supported. You **cannot** mix disk layouts on a single disk device. To say it another way, the existence of a partition table entry for RomWBW on @@ -1285,7 +1532,9 @@ recommended for the following reasons: ### Checking Hard Disk Layout If you are not sure which hard disk layout was used for your existing -media, you can use the CP/M `STAT` command to determine this. This +media, you can use the OSes command to display the number of directory +entries for a drive letter on the corresponding hard disk. For example, +the `STAT` command is used in CP/M 2.2 to determine this. This command displays the number of directory entries on a filesystem. If it indicates 512, your disk layout is legacy (hd512). If it indicates 1024, your disk layout is modern (hd1k). @@ -1296,9 +1545,9 @@ and boot to Z-System in ROM by using the 'Z' command at the Boot Loader. As Z-System starts, we see the following disk assignments: ``` -Boot [H=Help]: z +Boot [H=Help]: c -Loading Z-System... +Loading CP/M 2.2... CBIOS v3.1.1-pre.194 [WBW] @@ -1319,7 +1568,7 @@ Configuring Drives... 1081 Disk Buffer Bytes Free -ZSDOS v1.1, 54.0K TPA +CP/M-80 v2.2, 54.0K TPA ``` You can see that the IDE0 interface (which contains the CF Card) has @@ -1346,6 +1595,40 @@ Directory Entries". In this case, the value is 1024 which implies that this drive is located on a modern (hd1k) disk layout. If the value was 512, it would indicate a legacy (hd512) disk layout. +## Hard Disk Capacity + +Although RomWBW can support many CP/M filesystem slices on a single +hard disk, you are still constrained by the physical capacity of the +actual hard disk. RomWBW does not prevent you from assigning slices +to drive letters even if the location of the slice does not fit on the +physical disk. Any attempt to access a drive letter mapped to a slice +that does not fit will result in an error such as "no disk" from the +operating system. + +The exact number of CP/M filesystem slices that will fit on your +specific physical hard disk can be determined as follows: + +- For hd512 disk layouts, it is slices * 8,320KB. +- For hd1k disk layouts, it is 1024KB + (slices * 8192KB). Since + 1024KB is exactly 1MB, it is equivalent to say 1MB + (slices * 8MB). + +**WARNING**: In this document KB means 1024 bytes and MB means 1048576 +bytes (frequently expressed as KiB and MiB in modern terminology). +In general, hard disk capacities use KB to mean 1000 bytes and MB +to mean 1,000,000 bytes. + +As an example, hardware distributors frequently supply a "64MB" +CF Card with a RomWBW system. Such a hard disk probably has +less than 62.5MB of actual space (using the RomWBW definition that +1MB is 1048576 bytes). Such a drive will not support 8 slices. It +will support 7 slices just fine because 7 * 8,320KB = 58.24MB (hd512) +or 1024KB + (7 * 8192MB) = 57MB (hd1k). + +The cost of high capacity CF/SD/USB Media has become very reasonable. +I highly recommend upgrading to 1GB or greater media. This size will +support all features of the RomWBW Combo Disk Image with 64 slices +and a 384MB FAT filesystem (see [Combo Hard Disk Image]). + # Disk Content Preparation With some understanding of how RomWBW presents disk space to the @@ -1369,13 +1652,13 @@ below under Disk Initialization. In this scenario, you will need to subsequently copy any files you want to use onto the newly initialized disk (see [Transferring Files]). -You will notice that in the following instructions there is no mention -of specific hardware. Because the RomWBW firmware provides a -hardware abstraction layer, all disk images will work on all -hardware variations. Yes, this means you can remove an CF/SD Card from -one RomWBW system and put it in a different RomWBW system. The only -constraint is that the applications on the disk media must be up to date -with the firmware on the system being used. +You will notice that in the following instructions there is no mention +of specific hardware. Because the RomWBW firmware provides a hardware +abstraction layer, all disk images will work on all hardware variations. +Yes, this means you can remove disk media from one RomWBW system and +put it in a different RomWBW system. The only constraint is that the +applications on the disk media must be up to date with the firmware on +the system being used. ## Disk Images @@ -1411,6 +1694,9 @@ You will find 3 sets of these .img files in the distribution. The "hd512" for a legacy layout hard disk image, and "hd1K" for a modern layout hard disk image. +In the case of xxx_dos65.img, only an hd512 variant is provided. This +is a constraint of the DOS65 distribution. + There is also an image file called "psys.img" which contains a bootable p-System hard disk image. It contains 6 p-System filesystem slices, but these are not interoperable with the CP/M slices described above. This @@ -1435,7 +1721,9 @@ image onto it. You can do this with RomWBW using FDU as described in the [Floppy Disks] section of this document. You can also format the floppy using your modern computer, but using FDU on RomWBW is preferable because it will allow you to use optimal physical sector -interleaving. +interleaving. FDU defaults to a sector interleave of 2 which will +result in faster floppy disk I/O. Other interleaves will work, but +will be slower. RomWBW includes a Windows application called RawWriteWin in the Tools directory of the distribution. This simple application will let you @@ -1453,20 +1741,20 @@ command prompt. ### Hard Disk Images -Keeping in mind that a RomWBW hard disk (including CF /SD Cards) +Keeping in mind that a RomWBW hard disk (including CF/SD/USB devices) allows you to have multiple slices (CP/M filesystems), there are a couple ways to image hard disk media. The easiest approach is to use the "combo" disk image. This image is already prepared with 6 slices containing 5 ready-to-run OSes and a slice with -the WordStar application. Alternatively, you can create your own +the WordStar application files. Alternatively, you can create your own hard disk image with the specific slice contents you choose. #### Combo Hard Disk Image The combo disk image is essentially just a single image that has several -of the individual filesystem images already concatenated together. The -combo disk image contains the following 6 slices in the positions -indicated: + of the individual filesystem images (slices) already concatenated +together. The combo disk image contains the following 6 slices in the +positions indicated: | **Slice** | **Description** | |-----------|------------------------------------------------------------------| @@ -1480,7 +1768,58 @@ indicated: You will notice that there are actually 2 combo disk images in the distribution. One for an hd512 disk layout (hd512_combo.img) and one for an hd1k disk layout (hd1k_combo.img). Simply use the image file that -corresponds to your desired hard disk layout. +corresponds to your desired hard disk layout. Review the information +in [Hard Disk Layouts] if you need more information of the disk layout +options. + +Although the combo disk images contain only 6 slices of content, they +reserve space to store 64 CP/M filesystem slices as well as a +single 384MB FAT filesystem. Keep in mind that the slices beyond the +first 6 are not yet initialized. You will need to use the `CLRDIR` +application to initialize them before their first use. Likewise, the +pre-allocated FAT partition must still be formatted using `FAT FORMAT` +in order to actually use it (see [FAT Filesystem Preparation]). +Alternatively, the FAT partition can be formatted on a modern computer. + +The combo disk image layout was designed to fit well on a 1GB hard disk. +The 64 CP/M slices (approximately 512MB) and 384MB FAT filesystem all +fit well within a 1GB hard disk. This size choice was a bit arbitrary, +but based on the idea that 1GB CF/SD/USB Media is easy and cheap to +acquire. It is fine if your hard disk is smaller than 1GB. It just +means that it will not be possible to use the pre-allocated FAT +filesystem partition and any CP/M filesystem slices that don't fit. You +will get "no disk" errors if you attempt to access a slice past the +end of the physical hard disk. + +**WARNING**: Your hard disk may be too small to contain the full 64 +CP/M filesystem slices. The true number of CP/M filesystem slices that +will fit on your specific physical hard disk can be calculated as +described in [Hard Disk Capacity]. + +For RomWBW systems with a single hard disk (typical), you will notice +that the OS will pre-allocate 8 drive letters to the hard disk. If the +combo disk image is being used, only the first 6 drive letters +(typically C: - H:) will have any content because the combo disk image +only provides 6 slices. The subsequent drives (typically I: - J:) will +have no content and will not be pre-initialized. If you want to use any +slices beyond the first 6 on the hard disk, then you must initialize +them using `CLRDIR` first. + +A great way to maintain your own data on a hard disk is to put this +data in slices beyond the first 6. By doing so, you can always +"re-image" your drive with the combo image without overlaying the data +stored in the slices beyond the first 6. Just be very careful to use +the same combo image layout (hd512 or hd1k) as you used originally. +Also remember to calculate the maximum number of slices your hard disk +will support and do not exceed this number. + +**WARNING**: The combo disk image includes a partition table at the +start of the image. If you re-image drive with the combo image, you +will overwrite this partition table. This is fine as long as you don't +make any changes to the partition table. If you manually customize the +partition table (using `FDISK80` or other partition management +software), those changes will be lost if you re-image your disk with a +new combo disk image. #### Custom Hard Disk Image @@ -1491,8 +1830,9 @@ For hard disks, each .img file represents a single slice (CP/M filesystem). Since a hard disk can contain many slices, you can just concatenate the slices (.img files) together to create your desired hard disk image. For example, if you want to create a hard disk image that -has slices for CP/M 2.2, CP/M 3, and WordStar in the hd512 format, you would use -the command line of your modern computer to create the final image: +has slices for CP/M 2.2, CP/M 3, and WordStar in the hd512 format, you +would use the command line of your modern computer to create the final +image: Windows: @@ -1530,8 +1870,8 @@ using your modern computer. Note that you **do not** run `CLRDIR` or the disk will be partitioned and setup with 1 or more slices containing ready-to-run bootable operating systems. -To write a hard disk image file onto your actual media (actual hard -disk or CF/SD Card), you need to use an image writing utility on your +To write a hard disk image file onto your actual media (actual hard disk + or CF/SD/USB Media), you need to use an image writing utility on your modern computer. Your modern computer will need to have an appropriate interface or slot that accepts the media. To actually copy the image, you can use the `dd` command on Linux or MacOS. On Windows, in the @@ -1567,7 +1907,7 @@ survive re-imaging, you **must** follow these rules: Once you have copied the image onto the hard disk media, you can move the media over to your RomWBW system. You can then boot to the -operating system slices by specify "." at the +operating system slices by specifying "." at the RomWBW Boot Loader command prompt. ## In-situ Disk Preparation @@ -1611,6 +1951,9 @@ are not sure. #### Partition Setup +**WARNING**: Modifying the partition table of existing media will +make the data on the media inaccessible. + Since the disk layout is determined by the existence (or lack) of a RomWBW partition, you must start by running `FDISK80`. When FDISK80 starts, enter the disk unit number of the new media. At this point, @@ -1689,10 +2032,10 @@ You can use the `ASSIGN` command to handle this. Once you have your slice(s) initialized, you can begin transferring files to the associated drive letters. Refer to the [Transferring -Files] section for options to do this. If you want to make a slice +Files] chapter for options to do this. If you want to make a slice bootable, you will need to use `SYSCOPY` to setup the system track(s) of the slice. The use of `SYSCOPY` depends on the operating system -and is described in the [Operating Systems] section of this document. +and is described in the [Operating Systems] chapter of this document. As an example, let's assume you want to setup C: as a bootable Z-System disk and add to it all the files from the ROM disk. To @@ -2089,10 +2432,36 @@ regarding the RomWBW adaptation and customizations. #### Boot Disk -There is no RomWBW-specific boot disk creation procedure. QP/M -comes with a QINSTALL which is used to install QPM over an existing -CP/M 2 installation or to update an existing QPM disk. `QINSTALL.COM` -is included with the RomWBW distribution. + +To create or update a bootable QP/M Z-System disk, a special process +is required. QP/M is not provided in source format. You are expected +to install QP/M over an existing CP/M installation using the +`QINSTALL.COM` application. + +To update an existing QP/M boot disk with the latest RomWBW CBIOS, you +must use 2 steps: apply the generic CP/M system track, then reinstall +the QP/M components. To do this, you can perform the following steps: + +1. Boot to the existing QP/M disk. At this point, drive A should be + the QP/M disk that you wish to update. You may receive a warning + about CBIOS/HBIOS version mismatch. + +1. Use RomWBW `SYSCOPY` to place the stock RomWBW CP/M OS image + onto the system tracks of the QP/M boot disk: + + `SYSCOPY A:=x:CPM.SYS` + + where x is the drive letter of your ROM Disk. + +1. Run `QINSTALL` to overlay the QP/M OS components on your + QP/M boot disk. + +**WARNING**: `QINSTALL` has no mechanism for retaining previous +non-default settings. Any previous non-default settings you +previously made with `QINSTALL` will need to be reapplied. The +pre-built RomWBW QP/M disk image includes a couple of specific +non-default settings to optimize use with RomWBW. Please review the +notes in the ReadMe.txt file in Source/Images/d_qpm. #### Notes @@ -2100,6 +2469,9 @@ is included with the RomWBW distribution. on the QPM binary distribution and has been minimally customized for RomWBW. +- When booted, the QPM startup banner will indicate CP/M 2.2. This + is because QPM uses the CP/M 2.2 CBIOS code. + - QINSTALL is used to customize QPM. It is included on the disk image. You should review the notes in the ReadMe.txt file in Source/Images/d_qpm before making changes. @@ -2162,23 +2534,74 @@ file which is bootable. output will be garbled if no such terminal or emulator is used for console output. -* There is no straightforward mechanism to move files in +* There is no built-in mechanism to move files in and out of p-System. However, the .vol files in Source/pSys can be read and modified by CiderPress. CiderPress is able to add and remove individual files. + Andrew Davidson has created a Python script that can extract p-System + volumes from an existing disk image file. The script is also capable + of inserting a modified volume back into the disk image file. + This tool is available at + . + ## FreeRTOS Phillip Stevens has ported FreeRTOS to run under RomWBW. FreeRTOS is not provided in the RomWBW distribution. FreeRTOS is available under -the -[MIT licence](https://www.freertos.org/a00114.html) and further general -information is available at +the [MIT licence](https://www.freertos.org/a00114.html) +and further general information is available at [FreeRTOS](https://www.freertos.org/RTOS.html). -You can also contact Phillip for detailed information on the Z180 -implementation of FreeRTOS for RomWBW. -[feilipu](https://github.com/feilipu) +Phillip may be contacted via his +[GitHub Page](https://github.com/feilipu). + +## Fuzix + +Fuzix is a Unix-ish operating system for small systems. It is the work +of Alan Cox and is hosted on GitHub at +. Fuzix itself is a stand-alone +operating system, but it frequently utilizes RomWBW to boot and launch +on RomWBW-supported platforms. + +For those Fuzix platforms that leverage RomWBW for startup, you will +program your ROM with the normal RomWBW ROM -- there +is no Fuzix-specific ROM. A Fuzix disk image for your system is then +written to your disk media. After booting your system via the normal +RomWBW ROM, you start Fuzix simply by choosing the disk device +containing the Fuzix image at the RomWBW Loader prompt. + +To create a Fuzix disk image: + +* Locate and download the Fuzix disk image for your system from + . + +* Remove the 1KB header from the image file. The Fuzix disk images + are built to run under an emulator that requires a 1KB prefix. You + must remove this prefix before writing the image to your physical + disk media. Unix dd is the easiest way to do this: + + `dd bs=1024 skip=1 if=sc126-0.3.ide of=sc126-0.3.trimmed` + +* Write the trimmed image to your disk media. This can also be + done with dd or with Win32DiskImager under Windows. + +To boot into Fuzix: + +* Power-up or reset your system. RomWBW should load normally + and bring you to the RomWBW Boot Loader prompt. + +* Change your baud rate to 38,400. This can be done from the + RomWBW Boot Loader prompt with the following command: + + `I 0 38400` + + You will also need to change your terminal baud rate at this time. + +* At the `bootdev:` prompt, enter `hda1`. Fuzix should load and + you will be prompted for a date/time. + +* At the `login:` prompt, enter `root`. No password is required. # Custom Applications @@ -2217,6 +2640,7 @@ therefore, globally available. | XM | XModem file transfer program adapted to hardware. Automatically uses primary serial port on system. | | FLASH | Will Sowerbutts' in-situ ROM programming utility. | | FDISK80 | John Coffman's Z80 hard disk partitioning tool. See documentation in Doc directory. | +| FAT | Access MS-DOS FAT filesystems from RomWBW (based on FatFs). | | TALK | Direct console I/O to a specified character device. | | RTC | Manage and test the Real Time Clock hardware. | | TIMER | Display value of running periodic system timer. | @@ -2224,17 +2648,17 @@ therefore, globally available. Some custom applications do not fit on the ROM disk. They are found on the disk image files or the individual files can be found in the Binary/Apps -directory of the distribution. +directory of the distribution. They are also included on the +floppy disk and hard disk images. | **Application** | **Description** | |-----------------|--------------------------------------------------------------------| | TUNE | Play .PT2, .PT3, .MYM audio files. | -| FAT | Access MS-DOS FAT filesystems from RomWBW (based on FatFs). | | INTTEST | Test interrupt vector hooking. | # FAT Filesystem -The FAT filesystem format that originated with MS-DOS has been almost +The FAT filesystem format that originated with MS-DOS is almost ubiquitous across modern computers. Virtually all operating systems now support reading and writing files to a FAT filesystem. For this reason, RomWBW now has the ability to read and write files on FAT @@ -2249,26 +2673,35 @@ This application understands both FAT filesystems as well as CP/M filesystems. * Long filenames are not supported. Files with long filenames will show up with their names truncated into the older 8.3 convention. * A FAT filesystem can be located on floppy or hard disk media. For - hard disk media, the FAT filesystem must be located within a valid - FAT partition. + hard disk media, a valid FAT Filesystem partition must exist. +* Note that CP/M (and compatible) OSes do not support all of the + filename characters that a modern computer does. The following + characters are **not permitted** in a CP/M filename: + + `< > . , ; : = ? * [ ] _ % | ( ) / \` + The FAT application does not auto-rename files when it encounters + invalid filenames. It will just issue an error and quit. + Additionally, the error message is not very clear about the problem. + ## FAT Filesystem Preparation In general, you can create media formatted with a FAT filesystem on your RomWBW computer or on your modern computer. We will only be discussing the RomWBW-based approach here. -In the case of a floppy disk, you can use the `FAT` application to -format the floppy disk. For example, if your floppy disk is on RomWBW -disk unit 2, you could use `FAT FORMAT 2:`. This will overwrite the -floppy with a FAT filesystem and all previous contents will be lost. -Once formatted this way, the floppy disk can be used in a floppy drive -attached to a modern computer or it can be used on RomWBW using the +In the case of a floppy disk, you can use the `FAT` application to +format the floppy disk. The floppy disk must already be physically +formatted using RomWBW FDU or equivalent. If your floppy disk is on +RomWBW disk unit 2, you could use `FAT FORMAT 2:`. This will overwrite +the floppy with a FAT filesystem and all previous contents will be lost. +Once formatted this way, the floppy disk can be used in a floppy drive +attached to a modern computer or it can be used on RomWBW using the other `FAT` tool commands. In the case of hard disk media, it is necessary to have a FAT partition. If you prepared your RomWBW hard disk media using the -disk image process, then this partition will already be present and +disk image process, then this partition will already be defined and you do not need to recreate it. This default FAT partition is located at approximately 512MB from the start of your disk and it is 384MB in size. So, your hard disk media must be 1GB or greater to use this @@ -2316,8 +2749,13 @@ If your RomWBW system has multiple disk drives/slots, you can also just create a disk with your modern computer that is a dedicated FAT filesystem disk. You can use your modern computer to format the disk (floppy, CF Card, SD Card, etc.), then insert the disk in your RomWBW -computer and access if using `FAT` based on its RomWBW unit number. +computer and access it using `FAT` based on its RomWBW unit number. +**WARNING**: Microsoft Windows will sometimes suggest reformatting +partitions that it does not recognize. If you are prompted to format a +partition of your SD/CF/USB Media when inserting the card into a Windows + computer, you probably want to select Cancel. + ## FAT Application Usage Complete instructions for the `FAT` application are found in $doc_apps$. @@ -2407,6 +2845,166 @@ SAMPLE2.TXT ==> 4:/SAMPLE2.TXT ... [OK] 2 File(s) Copied ``` +# Real Time Clock + +RomWBW supports a variety of real time clock hardware. If your +system has this hardware, then it will be able to maintain the +current date and time even while your system is turned off. +Additionally, depending on the operating system being used, you may be +able to utilize date/time stamping of files. + +You can determine if your system has a real time clock present (and +functioning) by looking at the boot messages. Here is an example of +a boot message reflecting the detection of a valid real time clock +module: + +`DSRTC: MODE=STD IO=0x8A Thu 2023-10-19 14:07:11 CHARGE=ON` + +This example is from a DSRTC clock module. You may have a different +one, but it will always display the current date/time. + +In some cases, your real time clock will support charging of the +battery or super-capacitor while the system has power. The status of +this charging is displayed. + +If the date/time of your RTC needs to be updated, you will need to do +this with one of the utilities described below. There is no ability to +update the date/time of the RTC in the RomWBW Boot Loader or Monitor. + +## Date/Time Utilities + +RomwWBW includes two utilities for displaying or setting the date/time +stored by the RTC. They are both a bit different and are briefly +described below. + +### WDATE Utility + +The `WDATE` utility (contributed by Kevin Boone) is an application +that will display and/or update the current date/time. Its operation is +described in $doc_apps$. This utility works with any of the supported +RomWBW RTC hardware. Here is an example of displaying and updating the +date/time with this utility: + +``` +A>wdate +Thursday 19 October 14:14:43 2023 + +A>wdate 23 10 19 14 24 30 + +A>wdate +Thursday 19 October 14:24:34 2023 + +``` + +Note that `WDATE` does not have anything to do with date/time stamping +of files. It merely displays and sets the real time clock value. + +### RTC Utility + +Like `WDATE`, the `RTC` utility (contributed by Andrew Lynch) will let +you display and set the current date/time. However, this utility only +works with the DSRTC hardware (DS1302 chip). It is a "direct to +hardware application". Its operation is described in $doc_apps$. Here +is an example of displaying and updatting the date/time with this +utility: + +``` +A>rtc +Start RTC Program +RomWBW HBIOS, Mark 4 RTC Latch Port 0x8A + +RTC: Version 1.9 +Commands: E)xit T)ime st(A)rt S)et R)aw L)oop C)harge N)ocharge D)elay I)nit G)et P)ut B)oot W)arm-start H)elp + +RTC>t +Current time: 23-10-19 14:30:25-05 + +RTC>i +Init date/time. + +YEAR:23 +MONTH:10 +DATE:19 +HOURS:14 +MINUTES:31 +SECONDS:00 +DAY:05 +``` + +The `RTC` utility is also capable of turning the charging feature of +the DS1320 chip on or off. Here is an example of turning if off and +back on: + +``` + +A>rtc +Start RTC Program +RomWBW HBIOS, Mark 4 RTC Latch Port 0x8A + + +RTC: Version 1.9 +Commands: E)xit T)ime st(A)rt S)et R)aw L)oop C)harge N)ocharge D)elay I)nit G)et P)ut B)oot W)arm-start H)elp + +RTC>n +Trickle charger disabled. + +RTC>c +Trickle charger enabled. +``` + +Do **not** enable charging unless you are sure that your system +supports this. If your RTC is being powered by a normal battery, it +would be dangerous to enable charging. + +## Date/Time File Stamping + +If an RTC is available in your system, then most operating systems +can use it to date/time stamp files. This just means recording the +date/time of file creation, update, and or access in the directory. +This capability is available in all of the RomWBW operating system +except the original DRI CP/M 2.2. + +In some cases (such as ZSDOS), you must load an RSX (memory resident +utility) to enable date/time stamping of files. Additionally, you +will need to initialize the directory. The procedure varies in each +operation system, so you must review the associated documentation. + +The date/time stamping mechanisms for each operating system are +generally not compatible. If you initialize a directory for a type +of stamping, you should be careful not to manipulate that directory +with a different operating system with a different date/time stamping +mechanism. Doing so may corrupt the directory. + +The RomWBW disk images do not have date/time stamping initialized. This +is to avoid any chance of directory corruption. + +## Timezone + +None of the operating systems distributed with RomWBW have any concept +of timezone. When files are date/time stamped, the date/time will +simply be whatever date/time the RTC currently has. + +The normal practice is to set the RTC to your local time. This implies +that you would need to manually adjust the RTC for daylight savings time +and/or when you travel to a different time zone. + +The date/time stamps of files in directories will also be stored in +local time. This includes files stored in a FAT filesystem. If you +subsequently view the directory from modern machines (Windows, Linux, +etc.), the date/time displayed will depend on the behavior of the +modern system. + +For example, Linux assumes that the date/time of files +is UTC. So, if you create a file on a FAT filesystem with your RomWBW +computer and then use Linux to view the directory, the date/time stamps +will seem "off" by a few hours. + +The only alternative you may consider is setting the date/time of your +RTC to UTC. Since UTC is consistent across all timezones and daylight +savings time, your file date/time stamps will also be consistent. Of +course, this will mean that your RomWBW computer will display a +date/time that seems wrong because it is not local time. + # CP/NET Networking Digital Research created a simple network file sharing system called @@ -2743,8 +3341,12 @@ computers terminal program to complete the process. The `XM` application generally tries to detect the hardware you are using and adapt to it. However, you must ensure that you have a reliable serial connection. You must also ensure that the speed of -the connection is not too fast for XModem to service. Alternatively, -you can ensure that hardware flow control is working properly. +the connection is not too fast for XModem to service. If your +file transfer attempts are failing, try either of the following: + +- Check that hardware flow control is enabled in your terminal + emulation software. +- Reduce the speed of your serial port connection. There is an odd interaction between XModem and partner terminal programs that can occur. Essentially, after launching `XM`, you must @@ -2759,7 +3361,7 @@ scope of this document. It is possible to pass disk images between your RomWBW system and your modern computer. This assumes you have an appropriate media slot on your modern computer for the media you want to use (CF Card, SD -Card, or floppy drive). +Card, floppy drive, etc.). The general process to get files from your modern computer to a RomWBW computer is: @@ -2767,8 +3369,8 @@ computer is: 1. Use `cpmtools` on your modern computer to create a RomWBW CP/M filesystem image. -2. Insert your RomWBW media (CF Card, SD Card, or floppy disk) in your -modern computer. +2. Insert your RomWBW media (CF Card, SD Card, floppy disk, etc.) in +your modern computer. 3. Use a disk imaging tool to copy the RomWBW filesystem image onto the media. @@ -2793,11 +3395,11 @@ detail in the Source/Images directory of the distribution. ## FAT Filesystem Transfers -The ability to interact with FAT filesystems was covered in [FAT -Filesystem]. This capability means that you can generally use your -modern computer to make an SD Card or CF Card with a standard FAT32 -filesystem on it, then place that media in your RomWBW computer and -access the files. +The ability to interact with FAT filesystems was covered in +[FAT Filesystem]. This capability means that you can generally use your + modern computer to make an SD Card, CF Card, or USB Drive with a +standard FAT32 filesystem on it, then place that media in your RomWBW +computer and access the files. When formatting the media on your modern computer, be sure to pick the FAT filesystem. NTFS and other filesystems will not work. As previously @@ -2869,9 +3471,11 @@ users. All required build tools (compilers, assemblers, etc.) are included in the distribution, so it is not necessary to setup a build environment on your computer. -RomWBW can be built on modern Windows, Linux, or MacOS computers. The -process for building a custom ROM is documented in the ReadMe.txt file -in the Source directory of the distribution. +RomWBW can be built on modern Windows, Linux, or MacOS computers. The +process for building a custom ROM is documented in the ReadMe.txt file +in the Source directory of the distribution. Any modern version of +Windows (32-bit or 64-bit), MacOS, or Linux released in the last 10 +years should be able to run the build process. For those who are interested in more than basic system customization, note that all source code is provided (including the operating @@ -2949,17 +3553,62 @@ existing, working ROM chip and program a new one with the new firmware. If the new one fails to boot, you can easily return to the known working ROM. +For each ROM that comes with the RomWBW distribution, you will find +that there are actually 3 different variants: + +- `.rom` contains the complete ROM chip image +- `.upd` contains the system code, but omits the ROM Disk contents +- `.com` contains a CP/M executable version of the ROM code + +So, for example, RCZ80_std contains the following files: + +- `SBC_std.rom` +- `SBC_std.upd` +- `SBC_std.com` + +The use of the `.com` variant is described below in [Application Boot]. + +As previously discussed, the ROM in most RomWBW systems contains both +the system code as well as a ROM Disk with files on it. The `.rom` +variant of the ROM contains a full ROM chip image including both the +system code and the Rom Disk contents. The `.upd` variant of the ROM +contains only the system code portion of the ROM. If you apply the +`.upd` variant to your system, it will overlay the system code, but +will not overlay the ROM Disk contents (they remain intact). You may +use either the `.rom` or the `.upd` file when updating your ROM chip +(this does not apply to Application Boot). It is best to use the +`.rom` file for your upgrade because the files on your ROM Disk should +be updated whenever you update your system code. The advantage of the +`.upd` variant is that is much smaller, so you can upload and apply it +faster. The ROM update instructions below generally refer to using +the `.rom` variant. However, you may substitute the `.upd` variant +if desired. + +## Application Boot + Prior to attempting to reprogram your actual ROM chip, you may wish to "try" the update to ensure it will work on your system. With RomWBW, you can upload a new ROM image executable and load it from the command line. For each ROM image file (.rom) in the Binary directory, you will find a corresponding application file (.com). For example, for -SBC_std.rom, there is also an SBC_std.com file. You can upload the .com -file to your system using XModem, then simply run the .com file. You -will see your system go through the normal startup process just like it -was started from ROM. However, your ROM has not been updated and the -next time you boot your system, it will revert to the system image -contained in ROM. +SBC_std.rom, there is also an SBC_std.com file. + +You can upload the `.com` file to your system using XModem, then simply +run the `.com` file. You will see your system go through the normal +startup process just like it was started from ROM. However, your +physical ROM has not been updated and the next time you boot your +system, it will revert to the system image contained in ROM. + +Using this `.com` version of a ROM is an excellent way to confirm that +the new ROM code you intend to program will work correctly. If it +does not, then you can just reboot and your old ROM will be loaded. + +When the `.com` file is loaded, you will be taken to the normal +Boot Loader menu. However, you will find that the only OS that is +available to boot from ROM is ZSDOS. There is only room for a +single OS in the .com file. Even if you don't normally use ZSDOS, +this will still confirm that your system operates well under the +new ROM code. ## Upgrading via Flash Utility @@ -2968,13 +3617,19 @@ possible to reprogram your system ROM using the FLASH utility from Will Sowerbutts. This application, called FLASH.COM, can be found on the ROM drive of any running system. In this case, you would need to transfer the new ROM image (.rom) over to your system using XModem (or -one of the other mechanisms described in the Transferring Files +one of the other mechanisms described in the [Transferring Files] section). The ROM image is too large to fit on your RAM drive, so you will need to transfer it to a larger storage drive. Once the ROM image is on your system, you can use the FLASH application to update your ROM. The following is a typical example of transferring ROM image using XModem and flashing the chip in-situ. +**NOTE**: The FLASH utility **can not** determine the type of your +ROM chip if it is write protected. Additionally, it has not way to +even determine if it is write protected. If the FLASH utility +indicates it does not recognize your ROM chip, check to ensure the +chip is not write protected. + ``` E>xm r rom.rom @@ -3009,15 +3664,18 @@ occurred. ## Upgrading via XModem Flash Updater Similar to using the Flash utility, the system ROM can be updated -or upgraded through the ROM based updater utility. This works by -by reprogrammed the flash ROM as the file is being transferred. +or upgraded through the ROM-based updater utility. This works by +reprogramming the flash ROM as the file is being transferred. -This has the advantage that secondary storage is not required to -hold the new image. +Using the ROM-based updater has the advantage that secondary storage is +not required to hold the new image. In other words, it is not +necessary to have a mass storage device available to store the +ROM image. From the Boot Loader menu select X (Xmodem Flash Updater) and then -U (Begin Update). Then initiate the Xmodem transfer of the .img or -.upd file. +U (Begin Update). Then initiate the Xmodem transfer of the `.rom` file. +Since the XModem Flash Updater will be relatively slow, you may wish +to use the `.upd` varient of the ROM. More information can be found in the ROM Applications document. @@ -3056,6 +3714,7 @@ them over any older versions of the app on your disk: * TALK.COM * RTC.COM * TIMER.COM +* FAT.COM For example: `B>COPY ASSIGN.COM C:` @@ -3065,9 +3724,17 @@ system and then update all copies. These applications are found in the Binary/Apps directory of the distribution and in all of the disk images. -* FAT.COM * TUNE.COM +The files normally contained on the standard ROM Disk is based on a 512K +ROM. If your system has a smaller size ROM, then not all of these +files will be included on your ROM Disk. You will need to copy them to +your system from the /Binary/Apps folder of the RomWBW distribution. + +**WARNING**: If you run a RomWBW-specific application that is not +the appropriate for the version of RomWBW you are running, the +application will generate an error message and abort. + ## System Update As previously described, a RomWBW ROM contains ROM applications as well @@ -3101,6 +3768,58 @@ directed to complete a partial flash using the /P command line switch. `E>FLASH WRITE ROM.UPD /P` +# Related Projects + +Outside of the hardware platforms adapted to RomWBW, there are a variety +of projects that either target RomWBW specifically or provide +a RomWBW-specific variation. These efforts are greatly appreciated +and are listed below. Please contact the author if there are any other +such projects that are not listed. + +## Z88DK + +Z88DK is a software powerful development kit for Z80 computers +supporting both C and assembly language. This kit now provides +specific library support for RomWBW HBIOS. The Z88DK project is +hosted at . + +## Paleo Editor + +Steve Garcia has created a Windows-hosted IDE that is tailored to +development of RomWBW. The project can be found at +. + +## p-System Volume Management Script + +Andrew Davidson has created a Python script to automate the insertion +and deletion of volumes within the p-System disk image. These scripts +are hosted at . + +## Z80 fig-FORTH + +Dimitri Theulings' implementation of fig-FORTH for the Z80 has a +RomWBW-specific variant. This fig-FORTH is built into the RomWBW +ROM. However, the project itself is hosted at +. + +## RomWBW Date/Time Utility + +Kevin Boone has created a generic application that will display or +set the date/time of an RTC on RomWBW. The application runs on all of +the CP/M OS variants. This tool (`WDATE`) is included on the RomWBW +OS disk images. The project is hosted at +. + +## Assembly Language Programming for the RC2014 Zed + +Bruce Hall has written a very nice document that describes how to +develop assembly language applications on RomWBW. It begins with the +setup and configuration of a new RC2014 Zed system running RomWBW. +It describes not only generic CP/M application development, but also +RomWBW HBIOS programming and bare metal programming. The latest copy +of this document is hosted at +[http://w8bh.net/Assembly for RC2014Z.pdf](http://w8bh.net/Assembly%20for%20RC2014Z.pdf). + # Acknowledgments I want to acknowledge that a great deal of the code and inspiration @@ -3166,6 +3885,38 @@ please let me know if I missed you! * The RomWBW Disk Catalog document was produced by Mykl Orders. +* Rob Prouse has created many of the supplemental disk images + including Aztec C, HiTech C, SLR Z80ASM, Turbo Pascal, Microsoft + BASIC Compiler, Microsoft Fortran Compiler, and a Games + compendium. + +* Martin R has provided substantial help reviewing and improving the + User Guide. + +* Jacques Pelletier has contributed the DS1501 RTC driver code. + +* Jose Collado has contributed enhancements to the TMS driver + including compatibility with standard TMS register configuration. + +* Kevin Boone has contributed a generic HBIOS date/time utility (WDATE). + +* Matt Carroll has contributed a fix to XM.COM that corrects the + port specification when doing a send. + +* Dean Jenkins enhanced the build process to accommodate the + Raspberry Pi 4. + +* Tom Plano has contributed a new utility (HTALK) to allow talking + directly to HBIOS COM ports. + +* Lars Nelson has contributed several generic utilities such as + a universal (OS agnostic) UNARC application. + +* Dylan Hall added support for specifying a secondary console. + +* Bill Shen has contributed boot loaders for several of his + systems. + Contributions of all kinds to RomWBW are very welcome. # Licensing @@ -3232,6 +3983,15 @@ Also feel free to email $doc_author$ at [$doc_authmail$](mailto:$doc_authmail$). ## Appendix A - Pre-built ROM Images +This appendix contains a summary of the system configuration target +for each of the pre-built ROM images included in the RomWBW +distribution. It is intended to help you select the correct ROM +image and understand the basic hardware components supported. +Detailed hardware system configuration information should be obtained +from your system provider/designer. I am happy to provide support +adapting RomWBW to new or modified systems -- see [Getting Assistance] +for contact information. + The standard ROM images will detect and install support for certain devices and peripherals that are on-board or frequently used with each platform as documented below. If the device or peripheral is @@ -3261,84 +4021,158 @@ the RomWBW HBIOS configuration. ### RetroBrew Z80 SBC +#### ROM Image File: SBC_std.rom + | | | |-------------------|---------------| -| ROM Image File | SBC_std.rom | -| Console Baud Rate | 38400 | +| Default CPU Speed | 8.000 MHz | | Interrupts | None | - - - CPU speed is detected at startup if DS1302 RTC is active - - Otherwise 8.000 MHz assumed - - Hardware auto-detected: - - Onboard DS1302 RTC - - Onboard UART Serial Adapter - - Onboard PPIDE Hard Disk Interface - - Zilog Peripherals SIO Serial Interface - - CVDU Display Adapter - - VGA3 Display Adapter - - DiskIO V3 Floppy Disk Controller w/ 3.5" HD Drives - - PropIO Video, Keyboard, & SD Card - - SBC V1 has a known race condition in the bank switching - circuit which is likely to cause system instability. SBC V2 - does not have this issue. +| System Timer | None | +| Serial Default | 38400 Baud | +| Memory Manager | SBC | +| ROM Size | 512 KB | +| RAM Size | 512 KB | + +##### Supported Hardware (see [Appendix B - Device Summary]): + +- DSRTC: MODE=STD, IO=112 +- UART: MODE=SBC, IO=104 +- UART: MODE=CAS, IO=128 +- UART: MODE=MFP, IO=104 +- UART: MODE=4UART, IO=192 +- UART: MODE=4UART, IO=200 +- UART: MODE=4UART, IO=208 +- UART: MODE=4UART, IO=216 +- SIO MODE=ZP, IO=176, CHANNEL A +- SIO MODE=ZP, IO=176, CHANNEL B +- VGA: IO=224, KBD MODE=PS/2, KBD IO=224 +- CVDU: MODE=ECB, IO=224, KBD MODE=PS/2, KBD IO=226 +- CVDU occupies 905 bytes. +- KBD: ENABLED +- PRP: IO=168 +- PRPCON: ENABLED +- PRPSD: ENABLED +- MD: TYPE=RAM +- MD: TYPE=ROM +- FD: MODE=DIO, IO=54, DRIVE 0, TYPE=3.5" HD +- FD: MODE=DIO, IO=54, DRIVE 1, TYPE=3.5" HD +- PPIDE: IO=96, MASTER +- PPIDE: IO=96, SLAVE + +##### Notes: + +- CPU speed will be dynamically measured at startup if DSRTC is present `\clearpage`{=latex} ### RetroBrew Z80 SimH +#### ROM Image File: SBC_simh.rom + | | | |-------------------|---------------| -| ROM Image File | SBC_simh.rom | -| Console Baud Rate | 38400 | +| Default CPU Speed | 8.000 MHz | | Interrupts | Mode 1 | +| System Timer | SimH | +| Serial Default | 38400 Baud | +| Memory Manager | SBC | +| ROM Size | 512 KB | +| RAM Size | 512 KB | + +##### Supported Hardware (see [Appendix B - Device Summary]): + +- SIMRTC: IO=254 +- UART: MODE=SBC, IO=104 +- UART: MODE=CAS, IO=128 +- UART: MODE=MFP, IO=104 +- UART: MODE=4UART, IO=192 +- UART: MODE=4UART, IO=200 +- UART: MODE=4UART, IO=208 +- UART: MODE=4UART, IO=216 +- SIO MODE=ZP, IO=176, CHANNEL A, INTERRUPTS ENABLED +- SIO MODE=ZP, IO=176, CHANNEL B, INTERRUPTS ENABLED +- FONTS occupy 0 bytes. +- MD: TYPE=RAM +- MD: TYPE=ROM +- HDSK: IO=253, DEVICE COUNT=2 + +##### Notes: + +- Image for SimH emulator +- CPU speed and Serial configuration not relevant in emulator - - System timer is generated by SimH - - Hardware auto-detected: - - SimH emulated 8250 Serial Adapter - - SimH emulated hard disk drives - - SimH RTC - `\clearpage`{=latex} ### RetroBrew N8 Z180 SBC +#### ROM Image File: N8_std.rom + | | | |-------------------|---------------| -| ROM Image File | N8_std.rom | -| Console Baud Rate | 38400 | +| Default CPU Speed | 18.432 MHz | | Interrupts | Mode 2 | - - - CPU speed is detected at startup if DS1302 RTC is active - - Otherwise 18.432 MHz assumed - - System timer is generated by Z180 CPU - - Hardware auto-detected: - - Onboard DS1302 RTC - - Onboard Z180 ASCI Serial Ports - - Onboard Floppy Disk Controller w/ 3.5" HD Drives - - Onboard TMS9918 Video Controller - - Onboard PS/2 Keyboard Controller - - Onboard SD Card Interface via CSIO - - Assumes N8 with date code >= 2312 for CSIO interface to SD Card +| System Timer | Z180 | +| Serial Default | 38400 Baud | +| Memory Manager | N8 | +| ROM Size | 512 KB | +| RAM Size | 512 KB | + +##### Supported Hardware (see [Appendix B - Device Summary]): + +- DSRTC: MODE=STD, IO=136 +- ASCI: IO=64, INTERRUPTS ENABLED +- ASCI: IO=65, INTERRUPTS ENABLED +- UART: MODE=CAS, IO=128 +- UART: MODE=4UART, IO=192 +- UART: MODE=4UART, IO=200 +- UART: MODE=4UART, IO=208 +- UART: MODE=4UART, IO=216 +- TMS: MODE=N8, IO=152 +- PPK: ENABLED +- MD: TYPE=RAM +- MD: TYPE=ROM +- FD: MODE=N8, IO=140, DRIVE 0, TYPE=3.5" HD +- FD: MODE=N8, IO=140, DRIVE 1, TYPE=3.5" HD +- SD: MODE=CSIO, IO=136, UNITS=1 +- AY38910: MODE=N8, IO=156, CLOCK=1789772 HZ + +##### Notes: + +- CPU speed will be dynamically measured at startup if DSRTC is present +- SD Card interface is configured for CSIO (N8 date code >= 2312) `\clearpage`{=latex} ### Zeta Z80 SBC +#### ROM Image File: ZETA_std.rom + | | | |-------------------|---------------| -| ROM Image File | ZETA_std.rom | -| Console Baud Rate | 38400 | +| Default CPU Speed | 8.000 MHz | | Interrupts | None | - - - CPU speed is detected at startup if DS1302 RTC is active - - Otherwise 20.000 MHz assumed - - Hardware auto-detected: - - Onboard DS1302 RTC - - Onboard UART Serial Adapter - - Onboard Floppy Disk Controller w/ 1 3.5" HD Drive - - ParPortProp Video, Keyboard, & SD Card - - If ParPortProp is installed, initial console output is determined - by JP1: +| System Timer | None | +| Serial Default | 38400 Baud | +| Memory Manager | SBC | +| ROM Size | 512 KB | +| RAM Size | 512 KB | + +##### Supported Hardware (see [Appendix B - Device Summary]): + +- DSRTC: MODE=STD, IO=112 +- UART: MODE=SBC, IO=104 +- PPP: IO=96 +- PPPCON: ENABLED +- PPPSD: ENABLED +- MD: TYPE=RAM +- MD: TYPE=ROM +- FD: MODE=DIO, IO=54, DRIVE 0, TYPE=3.5" HD + +##### Notes: + +- CPU speed will be dynamically measured at startup if DSRTC is present +- If ParPortProp is installed, initial console output is + determined by JP1: - Shorted: console to on-board serial port - Open: console to ParPortProp video and keyboard @@ -3346,23 +4180,35 @@ the RomWBW HBIOS configuration. ### Zeta V2 Z80 SBC +#### ROM Image File: ZETA2_std.rom + | | | |-------------------|---------------| -| ROM Image File | ZETA2_std.rom | -| Console Baud Rate | 38400 | +| Default CPU Speed | 8.000 MHz | | Interrupts | Mode 2 | - - - CPU speed is detected at startup if DS1302 RTC is active - - Otherwise 8.000 MHz assumed - - System timer is generated by onboard CTC - - Hardware auto-detected: - - Onboard DS1302 RTC - - Onboard CTC - - Onboard UART Serial Adapter - - Onboard Floppy Disk Controller w/ 1 3.5" HD Drive - - ParPortProp Video, Keyboard, & SD Card - - If ParPortProp is installed, initial console output is determined - by JP1: +| System Timer | CTC | +| Serial Default | 38400 Baud | +| Memory Manager | Z2 | +| ROM Size | 512 KB | +| RAM Size | 512 KB | + +##### Supported Hardware (see [Appendix B - Device Summary]): + +- DSRTC: MODE=STD, IO=112 +- UART: MODE=SBC, IO=104 +- PPP: IO=96 +- PPPCON: ENABLED +- PPPSD: ENABLED +- MD: TYPE=RAM +- MD: TYPE=ROM +- FD: MODE=ZETA2, IO=48, DRIVE 0, TYPE=3.5" HD +- CTC: IO=32, TIMER MODE=COUNTER, DIVISOR=18432, HI=256, LO=72, INTERRUPTS ENABLED + +##### Notes: + +- CPU speed will be dynamically measured at startup if DSRTC is present +- If ParPortProp is installed, initial console output is + determined by JP1: - Shorted: console to on-board serial port - Open: console to ParPortProp video and keyboard @@ -3370,441 +4216,1324 @@ the RomWBW HBIOS configuration. ### Mark IV Z180 SBC +#### ROM Image File: MK4_std.rom + | | | |-------------------|---------------| -| ROM Image File | MK4_std.rom | -| Console Baud Rate | 38400 | +| Default CPU Speed | 18.432 MHz | | Interrupts | Mode 2 | - - - CPU speed is detected at startup if DS1302 RTC is active - - Otherwise 18.432 MHz assumed - - System timer is generated by Z180 CPU - - Hardware auto-detected: - - Onboard DS1302 RTC - - Onboard Z180 ASCI Serial Ports - - UART Serial Interfaces (CAS, MFP, UART4) - - CVDU Display Adapter - - VGA3 Display Adapter - - Onboard SD Card Interface via CSIO - - Onboard IDE CF Card Interface - - DIDE Floppy Disk Controller w/ 3.5" HD Drives - - DIDE IDE Hard Disk Controller - - PropIO Video, Keyboard, & SD Card +| System Timer | Z180 | +| Serial Default | 38400 Baud | +| Memory Manager | Z180 | +| ROM Size | 512 KB | +| RAM Size | 512 KB | + +##### Supported Hardware (see [Appendix B - Device Summary]): + +- DSRTC: MODE=STD, IO=138 +- ASCI: IO=64, INTERRUPTS ENABLED +- ASCI: IO=65, INTERRUPTS ENABLED +- UART: MODE=CAS, IO=128 +- UART: MODE=MFP, IO=104 +- UART: MODE=4UART, IO=192 +- UART: MODE=4UART, IO=200 +- UART: MODE=4UART, IO=208 +- UART: MODE=4UART, IO=216 +- VGA: IO=224, KBD MODE=PS/2, KBD IO=224 +- CVDU: MODE=ECB, IO=224, KBD MODE=PS/2, KBD IO=226 +- KBD: ENABLED +- PRP: IO=168 +- PRPCON: ENABLED +- PRPSD: ENABLED +- MD: TYPE=RAM +- MD: TYPE=ROM +- FD: MODE=DIDE, IO=42, DRIVE 0, TYPE=3.5" HD +- FD: MODE=DIDE, IO=42, DRIVE 1, TYPE=3.5" HD +- IDE: MODE=MK4, IO=128, MASTER +- IDE: MODE=MK4, IO=128, SLAVE +- SD: MODE=MK4, IO=137, UNITS=1 + +##### Notes: + +- CPU speed will be dynamically measured at startup if DSRTC is present `\clearpage`{=latex} ### RCBus Z80 CPU Module +#### ROM Image File: RCZ80_std.rom + | | | |-------------------|---------------| -| ROM Image File | RCZ80_std.rom | -| Console Baud Rate | 115200 | +| Default CPU Speed | 7.372 MHz | | Interrupts | Mode 1 | +| System Timer | None | +| Serial Default | 115200 Baud | +| Memory Manager | Z2 | +| ROM Size | 512 KB | +| RAM Size | 512 KB | + +##### Supported Hardware (see [Appendix B - Device Summary]): + +- FP: LEDIO=0, SWIO=0 +- DSRTC: MODE=STD, IO=192 +- UART: MODE=RC, IO=160 +- UART: MODE=RC, IO=168 +- SIO MODE=RC, IO=128, CHANNEL A, INTERRUPTS ENABLED +- SIO MODE=RC, IO=128, CHANNEL B, INTERRUPTS ENABLED +- SIO MODE=RC, IO=132, CHANNEL A, INTERRUPTS ENABLED +- SIO MODE=RC, IO=132, CHANNEL B, INTERRUPTS ENABLED +- ACIA: IO=128, INTERRUPTS ENABLED +- CH: IO=62 +- CH: IO=60 +- CHUSB: IO=62 +- CHUSB: IO=60 +- MD: TYPE=RAM +- MD: TYPE=ROM +- FD: MODE=RCWDC, IO=80, DRIVE 0, TYPE=3.5" HD +- FD: MODE=RCWDC, IO=80, DRIVE 1, TYPE=3.5" HD +- IDE: MODE=RC, IO=16, MASTER +- IDE: MODE=RC, IO=16, SLAVE +- PPIDE: IO=32, MASTER +- PPIDE: IO=32, SLAVE +- CTC: IO=136 + +##### Notes: + +- CPU speed will be dynamically measured at startup if DSRTC is present - - CPU speed is detected at startup if DS1302 RTC is active - - Otherwise 7.3728 MHz assumed - - Requires 512K RAM/ROM Module - - Hardware auto-detected: - - DS1302 RTC - - ACIA Serial Interface Module - - SIO Serial Interface Module - - EP Dual UART Serial Interface Module - - WDC Floppy Disk Controller w/ 3.5" HD Drives - - IDE Hard Disk Interface Module - - PPIDE Hard Disk Interface Module - - Serial baud rate is usually determined by hardware for ACIA and - SIO interfaces +`\clearpage`{=latex} + +#### ROM Image File: RCZ80_kio.rom | | | |-------------------|---------------| -| ROM Image File | RCZ80_kio.rom | -| Console Baud Rate | 38400 | +| Default CPU Speed | 7.372 MHz | | Interrupts | Mode 2 | - - - Equivalent to RCZ80_std w/ following modifications: - - KIO-SIO Serial Interface uses KIO port standards - - KIO-CTC generates system timer - - SIO Serial baud rate managed by KIO-CTC - - Use of Interrupt Mode 2 requires proper IEI/IEO configuration - for all peripherals generating interrupts +| System Timer | CTC | +| Serial Default | 115200 Baud | +| Memory Manager | Z2 | +| ROM Size | 512 KB | +| RAM Size | 512 KB | + +##### Supported Hardware (see [Appendix B - Device Summary]): + +- FP: LEDIO=0, SWIO=0 +- DSRTC: MODE=STD, IO=192 +- UART: MODE=RC, IO=160 +- UART: MODE=RC, IO=168 +- SIO MODE=STD, IO=136, CHANNEL A, INTERRUPTS ENABLED +- SIO MODE=STD, IO=136, CHANNEL B, INTERRUPTS ENABLED +- CH: IO=62 +- CH: IO=60 +- CHUSB: IO=62 +- CHUSB: IO=60 +- MD: TYPE=RAM +- MD: TYPE=ROM +- FD: MODE=RCWDC, IO=80, DRIVE 0, TYPE=3.5" HD +- FD: MODE=RCWDC, IO=80, DRIVE 1, TYPE=3.5" HD +- IDE: MODE=RC, IO=16, MASTER +- IDE: MODE=RC, IO=16, SLAVE +- PPIDE: IO=32, MASTER +- PPIDE: IO=32, SLAVE +- CTC: IO=132, TIMER MODE=TIMER/16, DIVISOR=9216, HI=256, LO=36, INTERRUPTS ENABLED + +##### Notes: + +- CPU speed will be dynamically measured at startup if DSRTC is present +- SIO Serial baud rate managed by CTC `\clearpage`{=latex} ### RCBus Z180 CPU Module -| | | -|-------------------|----------------| -| ROM Image Files | RCZ180_ext.rom | -| | RCZ180_nat.rom | -| Console Baud Rate | 115200 | -| Interrupts | Mode 2 | - - - CPU speed is detected at startup if DS1302 RTC is active - - Otherwise 18.432 MHz assumed - - System timer is generated by Z180 CPU - - Hardware auto-detected: - - DS1302 RTC - - Z180 ASCI Serial Ports - - SIO Serial Interface Module - - EP Dual UART Serial Interface Module - - WDC Floppy Disk Controller w/ 3.5" HD Drives - - IDE Hard Disk Interface Module - - PPIDE Hard Disk Interface Module - - Specific ROM image determined by memory module used: - - RCZ180_ext - Bank switching on memory module (external of CPU) - - RCZ180_nat - Linear memory module (native CPU bank switching) - - Use of Interrupt Mode 2 requires proper IEI/IEO configuration - for all peripherals generating interrupts +#### ROM Image File: RCZ180_ext.rom + +| | | +|-------------------|---------------| +| Default CPU Speed | 18.432 MHz | +| Interrupts | Mode 2 | +| System Timer | Z180 | +| Serial Default | 115200 Baud | +| Memory Manager | Z2 | +| ROM Size | 512 KB | +| RAM Size | 512 KB | + +##### Supported Hardware (see [Appendix B - Device Summary]): + +- FP: LEDIO=0, SWIO=0 +- DSRTC: MODE=STD, IO=12 +- INTRTC: ENABLED +- ASCI: IO=192, INTERRUPTS ENABLED +- ASCI: IO=193, INTERRUPTS ENABLED +- UART: MODE=RC, IO=160 +- UART: MODE=RC, IO=168 +- SIO MODE=RC, IO=128, CHANNEL A, INTERRUPTS ENABLED +- SIO MODE=RC, IO=128, CHANNEL B, INTERRUPTS ENABLED +- SIO MODE=RC, IO=132, CHANNEL A, INTERRUPTS ENABLED +- SIO MODE=RC, IO=132, CHANNEL B, INTERRUPTS ENABLED +- CH: IO=62 +- CH: IO=60 +- CHUSB: IO=62 +- CHUSB: IO=60 +- MD: TYPE=RAM +- MD: TYPE=ROM +- FD: MODE=RCWDC, IO=80, DRIVE 0, TYPE=3.5" HD +- FD: MODE=RCWDC, IO=80, DRIVE 1, TYPE=3.5" HD +- IDE: MODE=RC, IO=16, MASTER +- IDE: MODE=RC, IO=16, SLAVE +- PPIDE: IO=32, MASTER +- PPIDE: IO=32, SLAVE + +##### Notes: + +- For use with Z2 bank switched memory board (Z2 external memory management) +- CPU speed will be dynamically measured at startup if DSRTC is present + +`\clearpage`{=latex} + +#### ROM Image File: RCZ180_nat.rom + +| | | +|-------------------|---------------| +| Default CPU Speed | 18.432 MHz | +| Interrupts | Mode 2 | +| System Timer | Z180 | +| Serial Default | 115200 Baud | +| Memory Manager | Z180 | +| ROM Size | 512 KB | +| RAM Size | 512 KB | + +##### Supported Hardware (see [Appendix B - Device Summary]): + +- FP: LEDIO=0, SWIO=0 +- DSRTC: MODE=STD, IO=12 +- INTRTC: ENABLED +- ASCI: IO=192, INTERRUPTS ENABLED +- ASCI: IO=193, INTERRUPTS ENABLED +- UART: MODE=RC, IO=160 +- UART: MODE=RC, IO=168 +- SIO MODE=RC, IO=128, CHANNEL A, INTERRUPTS ENABLED +- SIO MODE=RC, IO=128, CHANNEL B, INTERRUPTS ENABLED +- SIO MODE=RC, IO=132, CHANNEL A, INTERRUPTS ENABLED +- SIO MODE=RC, IO=132, CHANNEL B, INTERRUPTS ENABLED +- CH: IO=62 +- CH: IO=60 +- CHUSB: IO=62 +- CHUSB: IO=60 +- MD: TYPE=RAM +- MD: TYPE=ROM +- FD: MODE=RCWDC, IO=80, DRIVE 0, TYPE=3.5" HD +- FD: MODE=RCWDC, IO=80, DRIVE 1, TYPE=3.5" HD +- IDE: MODE=RC, IO=16, MASTER +- IDE: MODE=RC, IO=16, SLAVE +- PPIDE: IO=32, MASTER +- PPIDE: IO=32, SLAVE + +##### Notes: + +- For use with linear memory board (Z180 native memory management) +- CPU speed will be dynamically measured at startup if DSRTC is present `\clearpage`{=latex} ### RCBus Z280 CPU Module -| | | -|-------------------|----------------| -| ROM Image Files | RCZ280_ext.rom | -| | RCZ280_nat.rom | -| Console Baud Rate | 115200 | -| Interrupts | Mode 1 (ext) | -| | Mode 3 (nat) | - - - CPU speed is assumed to be 12 MHz (24 MHz oscillator) - - System timer is generated by Z280 CPU - - Hardware auto-detected: - - DS1302 RTC - - Z280 Z2U Serial Ports - - ACIA Serial Interface Module (ext only) - - SIO Serial Interface Module - - EP Dual UART Serial Interface Module - - WDC Floppy Disk Controller w/ 3.5" HD Drives - - IDE Hard Disk Interface Module - - PPIDE Hard Disk Interface Module - - Serial baud rate is usually determined by hardware for ACIA and - SIO interfaces - - Requires 512K RAM/ROM module - - Specific ROM image determined by memory module used: - - RCZ180_ext - Bank switching on memory module (external of CPU) - - RCZ180_nat - Linear memory module (native CPU bank switching) +#### ROM Image File: RCZ280_ext.rom + +| | | +|-------------------|---------------| +| Default CPU Speed | 6.000 MHz | +| Interrupts | Mode 1 | +| System Timer | None | +| Serial Default | 115200 Baud | +| Memory Manager | Z2 | +| ROM Size | 512 KB | +| RAM Size | 512 KB | + +##### Supported Hardware (see [Appendix B - Device Summary]): + +- FP: LEDIO=0, SWIO=0 +- DSRTC: MODE=STD, IO=192 +- Z2U: IO=16 +- UART: MODE=RC, IO=160 +- UART: MODE=RC, IO=168 +- SIO MODE=RC, IO=128, CHANNEL A, INTERRUPTS ENABLED +- SIO MODE=RC, IO=128, CHANNEL B, INTERRUPTS ENABLED +- SIO MODE=RC, IO=132, CHANNEL A, INTERRUPTS ENABLED +- SIO MODE=RC, IO=132, CHANNEL B, INTERRUPTS ENABLED +- CH: IO=62 +- CH: IO=60 +- CHUSB: IO=62 +- CHUSB: IO=60 +- ACIA: IO=128, INTERRUPTS ENABLED +- MD: TYPE=RAM +- MD: TYPE=ROM +- FD: MODE=RCWDC, IO=80, DRIVE 0, TYPE=3.5" HD +- FD: MODE=RCWDC, IO=80, DRIVE 1, TYPE=3.5" HD +- IDE: MODE=RC, IO=16, MASTER +- IDE: MODE=RC, IO=16, SLAVE +- PPIDE: IO=32, MASTER +- PPIDE: IO=32, SLAVE + +##### Notes: + +- For use with Z2 bank switched memory board (Z2 external memory management) + +`\clearpage`{=latex} + +#### ROM Image File: RCZ280_nat.rom + +| | | +|-------------------|---------------| +| Default CPU Speed | 6.000 MHz | +| Interrupts | Mode 3 | +| System Timer | Z280 | +| Serial Default | 115200 Baud | +| Memory Manager | Z280 | +| ROM Size | 512 KB | +| RAM Size | 512 KB | + +##### Supported Hardware (see [Appendix B - Device Summary]): + +- FP: LEDIO=0, SWIO=0 +- DSRTC: MODE=STD, IO=192 +- Z2U: IO=16, INTERRUPTS ENABLED +- UART: MODE=RC, IO=160 +- UART: MODE=RC, IO=168 +- SIO MODE=RC, IO=128, CHANNEL A, INTERRUPTS ENABLED +- SIO MODE=RC, IO=128, CHANNEL B, INTERRUPTS ENABLED +- SIO MODE=RC, IO=132, CHANNEL A, INTERRUPTS ENABLED +- SIO MODE=RC, IO=132, CHANNEL B, INTERRUPTS ENABLED +- CH: IO=62 +- CH: IO=60 +- CHUSB: IO=62 +- CHUSB: IO=60 +- MD: TYPE=RAM +- MD: TYPE=ROM +- FD: MODE=RCWDC, IO=80, DRIVE 0, TYPE=3.5" HD +- FD: MODE=RCWDC, IO=80, DRIVE 1, TYPE=3.5" HD +- IDE: MODE=RC, IO=16, MASTER +- IDE: MODE=RC, IO=16, SLAVE +- PPIDE: IO=32, MASTER +- PPIDE: IO=32, SLAVE + +##### Notes: + +- For use with linear memory board (Z280 native memory management) `\clearpage`{=latex} ### Easy Z80 SBC -| | | -|-------------------|----------------| -| ROM Image File | RCZ80_easy.rom | -| Console Baud Rate | 115200 | -| Interrupts | Mode 2 | - - - CPU speed is detected at startup if DS1302 RTC is active - - Otherwise 10.000 MHz assumed - - System timer is generated by onboard CTC - - Hardware auto-detected: - - DS1302 RTC - - Onboard SIO Serial Interface - - EP Dual UART Serial Interface Module - - WDC Floppy Disk Controller w/ 3.5" HD Drives - - IDE Hard Disk Interface Module - - PPIDE Hard Disk Interface Module - - SIO Serial baud rate managed by CTC +#### ROM Image File: RCZ80_easy.rom + +| | | +|-------------------|---------------| +| Default CPU Speed | 10.000 MHz | +| Interrupts | Mode 2 | +| System Timer | CTC | +| Serial Default | 115200 Baud | +| Memory Manager | Z2 | +| ROM Size | 512 KB | +| RAM Size | 512 KB | + +##### Supported Hardware (see [Appendix B - Device Summary]): + +- FP: LEDIO=0, SWIO=0 +- DSRTC: MODE=STD, IO=192 +- INTRTC: ENABLED +- UART: MODE=RC, IO=160 +- UART: MODE=RC, IO=168 +- SIO MODE=STD, IO=128, CHANNEL A, INTERRUPTS ENABLED +- SIO MODE=STD, IO=128, CHANNEL B, INTERRUPTS ENABLED +- SIO MODE=RC, IO=132, CHANNEL A, INTERRUPTS ENABLED +- SIO MODE=RC, IO=132, CHANNEL B, INTERRUPTS ENABLED +- CH: IO=62 +- CH: IO=60 +- CHUSB: IO=62 +- CHUSB: IO=60 +- MD: TYPE=RAM +- MD: TYPE=ROM +- FD: MODE=RCWDC, IO=80, DRIVE 0, TYPE=3.5" HD +- FD: MODE=RCWDC, IO=80, DRIVE 1, TYPE=3.5" HD +- IDE: MODE=RC, IO=16, MASTER +- IDE: MODE=RC, IO=16, SLAVE +- PPIDE: IO=32, MASTER +- PPIDE: IO=32, SLAVE +- CTC: IO=136, TIMER MODE=COUNTER, DIVISOR=18432, HI=256, LO=72, INTERRUPTS ENABLED + +##### Notes: + +- CPU speed will be dynamically measured at startup if DSRTC is present `\clearpage`{=latex} ### Tiny Z80 SBC -| | | -|-------------------|----------------| -| ROM Image File | RCZ80_tiny.rom | -| Console Baud Rate | 115200 | -| Interrupts | Mode 2 | - - - CPU speed is detected at startup if DS1302 RTC is active - - Otherwise 16.000 MHz assumed - - System timer is generated by onboard CTC - - Hardware auto-detected: - - DS1302 RTC - - Onboard SIO Serial Interface - - EP Dual UART Serial Interface Module - - WDC Floppy Disk Controller w/ 3.5" HD Drives - - IDE Hard Disk Interface Module - - PPIDE Hard Disk Interface Module - - SIO Serial baud rate managed by CTC +#### ROM Image File: RCZ80_tiny.rom + +| | | +|-------------------|---------------| +| Default CPU Speed | 16.000 MHz | +| Interrupts | Mode 2 | +| System Timer | CTC | +| Serial Default | 115200 Baud | +| Memory Manager | Z2 | +| ROM Size | 512 KB | +| RAM Size | 512 KB | + +##### Supported Hardware (see [Appendix B - Device Summary]): + +- FP: LEDIO=0, SWIO=0 +- DSRTC: MODE=STD, IO=192 +- UART: MODE=RC, IO=160 +- UART: MODE=RC, IO=168 +- SIO MODE=STD, IO=24, CHANNEL A, INTERRUPTS ENABLED +- SIO MODE=STD, IO=24, CHANNEL B, INTERRUPTS ENABLED +- SIO MODE=RC, IO=132, CHANNEL A, INTERRUPTS ENABLED +- SIO MODE=RC, IO=132, CHANNEL B, INTERRUPTS ENABLED +- CH: IO=62 +- CH: IO=60 +- CHUSB: IO=62 +- CHUSB: IO=60 +- MD: TYPE=RAM +- MD: TYPE=ROM +- FD: MODE=RCWDC, IO=80, DRIVE 0, TYPE=3.5" HD +- FD: MODE=RCWDC, IO=80, DRIVE 1, TYPE=3.5" HD +- IDE: MODE=RC, IO=144, MASTER +- IDE: MODE=RC, IO=144, SLAVE +- PPIDE: IO=32, MASTER +- PPIDE: IO=32, SLAVE +- CTC: IO=16, TIMER MODE=COUNTER, DIVISOR=18432, HI=256, LO=72, INTERRUPTS ENABLED + +##### Notes: + +- CPU speed will be dynamically measured at startup if DSRTC is present `\clearpage`{=latex} ### Z80-512K CPU/RAM/ROM Module -| | | -|-------------------|----------------| -| ROM Image File | RCZ80_skz.rom | -| Console Baud Rate | 115200 | -| Interrupts | Mode 1 | - - - - CPU speed is detected at startup if DS1302 RTC is active - - Otherwise 7.3728 MHz assumed - - Hardware auto-detected: - - DS1302 RTC - - ACIA Serial Interface Module - - SIO Serial Interface Module - - EP Dual UART Serial Interface Module - - WDC Floppy Disk Controller w/ 3.5" HD Drives - - IDE Hard Disk Interface Module - - PPIDE Hard Disk Interface Module - - Serial baud rate is determined by hardware for ACIA and SIO - interfaces +#### ROM Image File: RCZ80_skz.rom + +| | | +|-------------------|---------------| +| Default CPU Speed | 7.372 MHz | +| Interrupts | Mode 1 | +| System Timer | None | +| Serial Default | 115200 Baud | +| Memory Manager | Z2 | +| ROM Size | 512 KB | +| RAM Size | 512 KB | + +##### Supported Hardware (see [Appendix B - Device Summary]): + +- FP: LEDIO=0, SWIO=0 +- DSRTC: MODE=STD, IO=192 +- UART: MODE=RC, IO=160 +- UART: MODE=RC, IO=168 +- SIO MODE=RC, IO=128, CHANNEL A, INTERRUPTS ENABLED +- SIO MODE=RC, IO=128, CHANNEL B, INTERRUPTS ENABLED +- SIO MODE=RC, IO=132, CHANNEL A, INTERRUPTS ENABLED +- SIO MODE=RC, IO=132, CHANNEL B, INTERRUPTS ENABLED +- ACIA: IO=128, INTERRUPTS ENABLED +- CH: IO=62 +- CH: IO=60 +- CHUSB: IO=62 +- CHUSB: IO=60 +- MD: TYPE=RAM +- MD: TYPE=ROM +- FD: MODE=RCWDC, IO=80, DRIVE 0, TYPE=3.5" HD +- FD: MODE=RCWDC, IO=80, DRIVE 1, TYPE=3.5" HD +- IDE: MODE=RC, IO=16, MASTER +- IDE: MODE=RC, IO=16, SLAVE +- PPIDE: IO=32, MASTER +- PPIDE: IO=32, SLAVE +- CTC: IO=136 + +##### Notes: + +- CPU speed will be dynamically measured at startup if DSRTC is present `\clearpage`{=latex} ### Small Computer SC126 Z180 SBC -| | | -|-------------------|------------------| -| ROM Image Files | SCZ180_sc126.rom | -| Console Baud Rate | 115200 | -| Interrupts | Mode 2 | - - - CPU speed is detected at startup if DS1302 RTC is active - - Otherwise 18.432 MHz assumed - - System timer is generated by Z180 CPU - - Hardware auto-detected: - - DS1302 RTC - - Z180 ASCI Serial Ports - - SIO Serial Interface Module - - EP Dual UART Serial Interface Module - - WDC Floppy Disk Controller w/ 3.5" HD Drives - - IDE Hard Disk Interface Module - - PPIDE Hard Disk Interface Module - - Onboard SD Card Interface - - Use of Interrupt Mode 2 requires proper IEI/IEO configuration - for all peripherals generating interrupts +#### ROM Image File: SCZ180_sc126.rom + +| | | +|-------------------|---------------| +| Default CPU Speed | 18.432 MHz | +| Interrupts | Mode 2 | +| System Timer | Z180 | +| Serial Default | 115200 Baud | +| Memory Manager | Z180 | +| ROM Size | 512 KB | +| RAM Size | 512 KB | + +##### Supported Hardware (see [Appendix B - Device Summary]): + +- FP: LEDIO=13, SWIO=0 +- DSRTC: MODE=STD, IO=12 +- INTRTC: ENABLED +- ASCI: IO=192, INTERRUPTS ENABLED +- ASCI: IO=193, INTERRUPTS ENABLED +- UART: MODE=RC, IO=160 +- UART: MODE=RC, IO=168 +- SIO MODE=RC, IO=128, CHANNEL A, INTERRUPTS ENABLED +- SIO MODE=RC, IO=128, CHANNEL B, INTERRUPTS ENABLED +- SIO MODE=RC, IO=132, CHANNEL A, INTERRUPTS ENABLED +- SIO MODE=RC, IO=132, CHANNEL B, INTERRUPTS ENABLED +- CH: IO=62 +- CH: IO=60 +- CHUSB: IO=62 +- CHUSB: IO=60 +- MD: TYPE=RAM +- MD: TYPE=ROM +- FD: MODE=RCWDC, IO=80, DRIVE 0, TYPE=3.5" HD +- FD: MODE=RCWDC, IO=80, DRIVE 1, TYPE=3.5" HD +- IDE: MODE=RC, IO=16, MASTER +- IDE: MODE=RC, IO=16, SLAVE +- PPIDE: IO=32, MASTER +- PPIDE: IO=32, SLAVE +- SD: MODE=SC, IO=12, UNITS=1 +- AY38910: MODE=RCZ180, IO=104, CLOCK=1789772 HZ + +##### Notes: + +- CPU speed will be dynamically measured at startup if DSRTC is present `\clearpage`{=latex} ### Small Computer SC130 Z180 SBC -| | | -|-------------------|------------------| -| ROM Image Files | SCZ180_sc130.rom | -| Console Baud Rate | 115200 | -| Interrupts | Mode 2 | - - - CPU speed is detected at startup if DS1302 RTC is active - - Otherwise 18.432 MHz assumed - - System timer is generated by Z180 CPU - - Hardware auto-detected: - - DS1302 RTC - - Z180 ASCI Serial Ports - - SIO Serial Interface Module - - EP Dual UART Serial Interface Module - - WDC Floppy Disk Controller w/ 3.5" HD Drives - - IDE Hard Disk Interface Module - - PPIDE Hard Disk Interface Module - - Onboard SD Card Interface - - Use of Interrupt Mode 2 requires proper IEI/IEO configuration - for all peripherals generating interrupts +#### ROM Image File: SCZ180_sc130.rom + +| | | +|-------------------|---------------| +| Default CPU Speed | 18.432 MHz | +| Interrupts | Mode 2 | +| System Timer | Z180 | +| Serial Default | 115200 Baud | +| Memory Manager | Z180 | +| ROM Size | 512 KB | +| RAM Size | 512 KB | + +##### Supported Hardware (see [Appendix B - Device Summary]): + +- FP: LEDIO=0, SWIO=0 +- DSRTC: MODE=STD, IO=12 +- INTRTC: ENABLED +- ASCI: IO=192, INTERRUPTS ENABLED +- ASCI: IO=193, INTERRUPTS ENABLED +- UART: MODE=RC, IO=160 +- UART: MODE=RC, IO=168 +- SIO MODE=RC, IO=128, CHANNEL A, INTERRUPTS ENABLED +- SIO MODE=RC, IO=128, CHANNEL B, INTERRUPTS ENABLED +- SIO MODE=RC, IO=132, CHANNEL A, INTERRUPTS ENABLED +- SIO MODE=RC, IO=132, CHANNEL B, INTERRUPTS ENABLED +- CH: IO=62 +- CH: IO=60 +- CHUSB: IO=62 +- CHUSB: IO=60 +- MD: TYPE=RAM +- MD: TYPE=ROM +- FD: MODE=RCWDC, IO=80, DRIVE 0, TYPE=3.5" HD +- FD: MODE=RCWDC, IO=80, DRIVE 1, TYPE=3.5" HD +- IDE: MODE=RC, IO=16, MASTER +- IDE: MODE=RC, IO=16, SLAVE +- PPIDE: IO=32, MASTER +- PPIDE: IO=32, SLAVE +- SD: MODE=SC, IO=12, UNITS=1 +- AY38910: MODE=RCZ180, IO=104, CLOCK=1789772 HZ + +##### Notes: + +- CPU speed will be dynamically measured at startup if DSRTC is present `\clearpage`{=latex} ### Small Computer SC131 Z180 Pocket Computer -| | | -|-------------------|------------------| -| ROM Image Files | SCZ180_sc131.rom | -| Console Baud Rate | 115200 | -| Interrupts | Mode 2 | +#### ROM Image File: SCZ180_sc131.rom - - CPU speed assumed to be 18.432 MHz - - System timer is generated by Z180 CPU - - Hardware auto-detected: - - Interrupt-driven RTC - - Z180 ASCI Serial Ports - - Onboard SD Card Interface +| | | +|-------------------|---------------| +| Default CPU Speed | 18.432 MHz | +| Interrupts | Mode 2 | +| System Timer | Z180 | +| Serial Default | 115200 Baud | +| Memory Manager | Z180 | +| ROM Size | 512 KB | +| RAM Size | 512 KB | + +##### Supported Hardware (see [Appendix B - Device Summary]): + +- INTRTC: ENABLED +- ASCI: IO=192, INTERRUPTS ENABLED +- ASCI: IO=193, INTERRUPTS ENABLED +- MD: TYPE=RAM +- MD: TYPE=ROM +- SD: MODE=SC, IO=12, UNITS=1 + +##### Notes: `\clearpage`{=latex} ### Small Computer SC140 Z180 CPU Module -| | | -|-------------------|------------------| -| ROM Image Files | SCZ180_sc140.rom | -| Console Baud Rate | 115200 | -| Interrupts | Mode 2 | - - - CPU speed is detected at startup if DS1302 RTC is active - - Otherwise 18.432 MHz assumed - - System timer is generated by Z180 CPU - - Hardware auto-detected: - - DS1302 RTC - - Z180 ASCI Serial Ports - - SIO Serial Interface Module - - EP Dual UART Serial Interface Module - - WDC Floppy Disk Controller w/ 3.5" HD Drives - - IDE Hard Disk Interface Module - - PPIDE Hard Disk Interface Module - - Onboard SD Card Interface - - Use of Interrupt Mode 2 requires proper IEI/IEO configuration - for all peripherals generating interrupts +#### ROM Image File: SCZ180_sc140.rom + +| | | +|-------------------|---------------| +| Default CPU Speed | 18.432 MHz | +| Interrupts | Mode 2 | +| System Timer | Z180 | +| Serial Default | 115200 Baud | +| Memory Manager | Z180 | +| ROM Size | 512 KB | +| RAM Size | 512 KB | + +##### Supported Hardware (see [Appendix B - Device Summary]): + +- FP: LEDIO=160, SWIO=160 +- DSRTC: MODE=STD, IO=12 +- INTRTC: ENABLED +- ASCI: IO=192, INTERRUPTS ENABLED +- ASCI: IO=193, INTERRUPTS ENABLED +- UART: MODE=RC, IO=160 +- UART: MODE=RC, IO=168 +- SIO MODE=RC, IO=128, CHANNEL A, INTERRUPTS ENABLED +- SIO MODE=RC, IO=128, CHANNEL B, INTERRUPTS ENABLED +- SIO MODE=RC, IO=132, CHANNEL A, INTERRUPTS ENABLED +- SIO MODE=RC, IO=132, CHANNEL B, INTERRUPTS ENABLED +- CH: IO=62 +- CH: IO=60 +- CHUSB: IO=62 +- CHUSB: IO=60 +- MD: TYPE=RAM +- MD: TYPE=ROM +- FD: MODE=RCWDC, IO=80, DRIVE 0, TYPE=3.5" HD +- FD: MODE=RCWDC, IO=80, DRIVE 1, TYPE=3.5" HD +- IDE: MODE=RC, IO=144, MASTER +- IDE: MODE=RC, IO=144, SLAVE +- PPIDE: IO=32, MASTER +- PPIDE: IO=32, SLAVE +- SD: MODE=SC, IO=12, UNITS=1 + +##### Notes: + +- CPU speed will be dynamically measured at startup if DSRTC is present `\clearpage`{=latex} ### Small Computer SC503 Z180 CPU Module -| | | -|-------------------|------------------| -| ROM Image Files | SCZ180_sc503.rom | -| Console Baud Rate | 115200 | -| Interrupts | Mode 2 | - - - CPU speed is detected at startup if DS1302 RTC is active - - Otherwise 18.432 MHz assumed - - System timer is generated by Z180 CPU - - Hardware auto-detected: - - DS1302 RTC - - Z180 ASCI Serial Ports - - SIO Serial Interface Module - - EP Dual UART Serial Interface Module - - WDC Floppy Disk Controller w/ 3.5" HD Drives - - IDE Hard Disk Interface Module - - PPIDE Hard Disk Interface Module - - Onboard SD Card Interface - - Use of Interrupt Mode 2 requires proper IEI/IEO configuration - for all peripherals generating interrupts +#### ROM Image File: SCZ180_sc503.rom + +| | | +|-------------------|---------------| +| Default CPU Speed | 18.432 MHz | +| Interrupts | Mode 2 | +| System Timer | Z180 | +| Serial Default | 115200 Baud | +| Memory Manager | Z180 | +| ROM Size | 512 KB | +| RAM Size | 512 KB | + +##### Supported Hardware (see [Appendix B - Device Summary]): + +- FP: LEDIO=160, SWIO=160 +- DSRTC: MODE=STD, IO=12 +- INTRTC: ENABLED +- ASCI: IO=192, INTERRUPTS ENABLED +- ASCI: IO=193, INTERRUPTS ENABLED +- UART: MODE=RC, IO=160 +- UART: MODE=RC, IO=168 +- SIO MODE=RC, IO=128, CHANNEL A, INTERRUPTS ENABLED +- SIO MODE=RC, IO=128, CHANNEL B, INTERRUPTS ENABLED +- SIO MODE=RC, IO=132, CHANNEL A, INTERRUPTS ENABLED +- SIO MODE=RC, IO=132, CHANNEL B, INTERRUPTS ENABLED +- CH: IO=62 +- CH: IO=60 +- CHUSB: IO=62 +- CHUSB: IO=60 +- MD: TYPE=RAM +- MD: TYPE=ROM +- FD: MODE=RCWDC, IO=80, DRIVE 0, TYPE=3.5" HD +- FD: MODE=RCWDC, IO=80, DRIVE 1, TYPE=3.5" HD +- IDE: MODE=RC, IO=144, MASTER +- IDE: MODE=RC, IO=144, SLAVE +- PPIDE: IO=32, MASTER +- PPIDE: IO=32, SLAVE +- SD: MODE=SC, IO=12, UNITS=1 + +##### Notes: + +- CPU speed will be dynamically measured at startup if DSRTC is present + +`\clearpage`{=latex} + +### Small Computer SC700 Z180 CPU Module + +#### ROM Image File: SCZ180_sc700.rom + +| | | +|-------------------|---------------| +| Default CPU Speed | 18.432 MHz | +| Interrupts | Mode 2 | +| System Timer | Z180 | +| Serial Default | 115200 Baud | +| Memory Manager | Z180 | +| ROM Size | 512 KB | +| RAM Size | 512 KB | + +##### Supported Hardware (see [Appendix B - Device Summary]): + +- FP: LEDIO=0 +- DSRTC: MODE=STD, IO=12 +- INTRTC: ENABLED +- ASCI: IO=192, INTERRUPTS ENABLED +- ASCI: IO=193, INTERRUPTS ENABLED +- UART: MODE=RC, IO=160 +- UART: MODE=RC, IO=168 +- SIO MODE=RC, IO=128, CHANNEL A, INTERRUPTS ENABLED +- SIO MODE=RC, IO=128, CHANNEL B, INTERRUPTS ENABLED +- SIO MODE=RC, IO=132, CHANNEL A, INTERRUPTS ENABLED +- SIO MODE=RC, IO=132, CHANNEL B, INTERRUPTS ENABLED +- CH: IO=62 +- CH: IO=60 +- CHUSB: IO=62 +- CHUSB: IO=60 +S- MD: TYPE=RAM +- MD: TYPE=ROM +- FD: MODE=RCWDC, IO=80, DRIVE 0, TYPE=3.5" HD +- FD: MODE=RCWDC, IO=80, DRIVE 1, TYPE=3.5" HD +- IDE: MODE=RC, IO=16, MASTER +- IDE: MODE=RC, IO=16, SLAVE +- PPIDE: IO=32, MASTER +- PPIDE: IO=32, SLAVE +- SD: MODE=SC, IO=12, UNITS=1 +- AY38910: MODE=RCZ180, IO=104, CLOCK=1789772 HZ + +##### Notes: + +- CPU speed will be dynamically measured at startup if DSRTC is present `\clearpage`{=latex} ### Dyno Z180 SBC -| | | -|-------------------|----------------| -| ROM Image Files | DYNO0_std.rom | -| Console Baud Rate | 38400 | -| Interrupts | Mode 2 | +#### ROM Image File: DYNO_std.rom - - CPU speed is assumed to be 18.432 MHz - - System timer is generated by Z180 CPU - - Hardware auto-detected: - - BQ4845P RTC - - Z180 ASCI Serial Ports - - WDC Floppy Disk Controller w/ 3.5" HD Drives - - Onboard PPIDE Hard Disk Interface Module +| | | +|-------------------|---------------| +| Default CPU Speed | 18.432 MHz | +| Interrupts | Mode 2 | +| System Timer | Z180 | +| Serial Default | 38400 Baud | +| Memory Manager | Z180 | +| ROM Size | 512 KB | +| RAM Size | 512 KB | + +##### Supported Hardware (see [Appendix B - Device Summary]): + +- BQRTC: IO=80 +- ASCI: IO=192, INTERRUPTS ENABLED +- ASCI: IO=193, INTERRUPTS ENABLED +- MD: TYPE=RAM +- MD: TYPE=ROM +- FD: MODE=DYNO, IO=132, DRIVE 0, TYPE=3.5" HD +- FD: MODE=DYNO, IO=132, DRIVE 1, TYPE=3.5" HD +- PPIDE: IO=76, MASTER +- PPIDE: IO=76, SLAVE + +##### Notes: `\clearpage`{=latex} ### Nhyodyne Z80 MBC +#### ROM Image File: MBC_std.rom + | | | |-------------------|---------------| -| ROM Image File | MBC_std.rom | -| Console Baud Rate | 38400 | +| Default CPU Speed | 8.000 MHz | | Interrupts | None | - - - CPU speed is detected at startup if DS1302 RTC is active - - Otherwise 8.000 MHz assumed - - System timer is generated by CTC if available - - Hardware auto-detected: - - DS1302 RTC - - Zilog CTC - - Zilog DMA Module - - UART Serial Adapter - - SIO Serial Interface - - LPT Printer Interface - - Zilog Parallel Interface - - CVDU Display Adapter - - TMS9938/58 Display Adapter - - PS/2 Keyboard Interface - - AY-3-8910/YM2149 Sound Module - - Floppy Disk Controller w/ 3.5" HD Drives - - PPIDE Hard Disk Interface - - Interrupts may be enabled in build options +| System Timer | None | +| Serial Default | 38400 Baud | +| Memory Manager | MBC | +| ROM Size | 512 KB | +| RAM Size | 512 KB | + +##### Supported Hardware (see [Appendix B - Device Summary]): + +- PKD: IO=96 +- DSRTC: MODE=STD, IO=112 +- UART: MODE=SBC, IO=104 +- UART: MODE=DUAL, IO=128 +- UART: MODE=DUAL, IO=136 +- SIO MODE=ZP, IO=176, CHANNEL A +- SIO MODE=ZP, IO=176, CHANNEL B +- PIO: IO=184, CHANNEL A +- PIO: IO=184, CHANNEL B +- PIO: IO=188, CHANNEL A +- PIO: IO=188, CHANNEL B +- LPT: MODE=SPP, IO=232 +- CVDU: MODE=MBC, IO=224, KBD MODE=PS/2, KBD IO=226 +- TMS: MODE=MBC, IO=152 +- KBD: ENABLED +- ESP: IO=156 +- ESPCON: ENABLED +- ESPSER: DEVICE=0 +- ESPSER: DEVICE=1 +- MD: TYPE=RAM +- MD: TYPE=ROM +- FD: MODE=MBC, IO=48, DRIVE 0, TYPE=3.5" HD +- FD: MODE=MBC, IO=48, DRIVE 1, TYPE=3.5" HD +- PPIDE: IO=96, MASTER +- PPIDE: IO=96, SLAVE +- SPK: IO=112 +- CTC: IO=176 + +##### Notes: + +- CPU speed will be dynamically measured at startup if DSRTC is present `\clearpage`{=latex} ### Rhyophyre Z180 SBC +#### ROM Image File: RPH_std.rom + | | | |-------------------|---------------| -| ROM Image File | RPH_std.rom | -| Console Baud Rate | 38400 | +| Default CPU Speed | 18.432 MHz | | Interrupts | None | +| System Timer | None | +| Serial Default | 38400 Baud | +| Memory Manager | RPH | +| ROM Size | 512 KB | +| RAM Size | 512 KB | + +##### Supported Hardware (see [Appendix B - Device Summary]): + +- DSRTC: MODE=STD, IO=132 +- ASCI: IO=64 +- ASCI: IO=65 +- GDC: MODE=RPH, DISPLAY=EGA, IO=144 +- KBD: ENABLED +- MD: TYPE=RAM +- MD: TYPE=ROM +- PPIDE: IO=136, MASTER +- PPIDE: IO=136, SLAVE - - CPU speed is detected at startup if DS1302 RTC is active - - Otherwise 18.432 MHz assumed - - System timer is generated by Z180 CPU - - Hardware auto-detected: - - Onboard Z180 ASCI Serial Ports - - Onboard PPIDE CF Interface - - Onboard PS/2 Keyboard Controller - - Interrupts may be enabled in build options +##### Notes: + +- CPU speed will be dynamically measured at startup if DSRTC is present `\clearpage`{=latex} ### Z80 ZRC CPU Module -| | | -|-------------------|--------------------| -| ROM Image Files | RCZ80_zrc.rom | -| Console Baud Rate | 115200 | +#### ROM Image File: RCZ80_zrc.rom + +| | | +|-------------------|---------------| +| Default CPU Speed | 14.745 MHz | | Interrupts | Mode 1 | +| System Timer | None | +| Serial Default | 115200 Baud | +| Memory Manager | ZRC | +| ROM Size | 512 KB | +| RAM Size | 1536 KB | + +##### Supported Hardware (see [Appendix B - Device Summary]): + +- FP: LEDIO=0, SWIO=0 +- DSRTC: MODE=STD, IO=192 +- UART: MODE=RC, IO=160 +- UART: MODE=RC, IO=168 +- SIO MODE=RC, IO=128, CHANNEL A, INTERRUPTS ENABLED +- SIO MODE=RC, IO=128, CHANNEL B, INTERRUPTS ENABLED +- SIO MODE=RC, IO=132, CHANNEL A, INTERRUPTS ENABLED +- SIO MODE=RC, IO=132, CHANNEL B, INTERRUPTS ENABLED +- ACIA: IO=128, INTERRUPTS ENABLED +- VRC: IO=0, KBD MODE=VRC, KBD IO=244 +- KBD: ENABLED +- CH: IO=62 +- CH: IO=60 +- CHUSB: IO=62 +- CHUSB: IO=60 +- MD: TYPE=RAM +- MD: TYPE=ROM +- FD: MODE=RCWDC, IO=80, DRIVE 0, TYPE=3.5" HD +- FD: MODE=RCWDC, IO=80, DRIVE 1, TYPE=3.5" HD +- IDE: MODE=RC, IO=16, MASTER +- IDE: MODE=RC, IO=16, SLAVE +- PPIDE: IO=32, MASTER +- PPIDE: IO=32, SLAVE +- CTC: IO=136 + +##### Notes: + +- ZRC is actually contains no ROM and 2MB of RAM. The first 512KB + of RAM is loaded from disk and then handled like ROM. +- CPU speed will be dynamically measured at startup if DSRTC is present + +`\clearpage`{=latex} + +#### ROM Image File: RCZ80_zrc_ram.rom + +| | | +|-------------------|---------------| +| Default CPU Speed | 14.745 MHz | +| Interrupts | Mode 1 | +| System Timer | None | +| Serial Default | 115200 Baud | +| Memory Manager | ZRC | +| ROM Size | 0 KB | +| RAM Size | 512 KB | + +##### Supported Hardware (see [Appendix B - Device Summary]): + +- FP: LEDIO=0, SWIO=0 +- DSRTC: MODE=STD, IO=192 +- UART: MODE=RC, IO=160 +- UART: MODE=RC, IO=168 +- SIO MODE=RC, IO=128, CHANNEL A, INTERRUPTS ENABLED +- SIO MODE=RC, IO=128, CHANNEL B, INTERRUPTS ENABLED +- SIO MODE=RC, IO=132, CHANNEL A, INTERRUPTS ENABLED +- SIO MODE=RC, IO=132, CHANNEL B, INTERRUPTS ENABLED +- ACIA: IO=128, INTERRUPTS ENABLED +- VRC: IO=0, KBD MODE=VRC, KBD IO=244 +- KBD: ENABLED +- CH: IO=62 +- CH: IO=60 +- CHUSB: IO=62 +- CHUSB: IO=60 +- MD: TYPE=RAM +- FD: MODE=RCWDC, IO=80, DRIVE 0, TYPE=3.5" HD +- FD: MODE=RCWDC, IO=80, DRIVE 1, TYPE=3.5" HD +- IDE: MODE=RC, IO=16, MASTER +- IDE: MODE=RC, IO=16, SLAVE +- PPIDE: IO=32, MASTER +- PPIDE: IO=32, SLAVE +- CTC: IO=136 + +##### Notes: + +- ROMless boot -- HBIOS is loaded from disk at boot +- CPU speed will be dynamically measured at startup if DSRTC is present + +`\clearpage`{=latex} - - CPU speed is detected at startup if DS1302 RTC is active - - Otherwise 14.7456 MHz assumed - - Hardware auto-detected: - - DS1302 RTC - - ACIA Serial Interface Module - - SIO Serial Interface Module - - EP Dual UART Serial Interface Module - - WDC Floppy Disk Controller w/ 3.5" HD Drives - - Onboard IDE Hard Disk Interface Module - - PPIDE Hard Disk Interface Module - - Serial baud rate is usually determined by hardware for ACIA and - SIO interfaces +### Z80 ZRC512 CPU Module + +#### ROM Image File: RCZ80_zrc512.rom + +| | | +|-------------------|---------------| +| Default CPU Speed | 22.000 MHz | +| Interrupts | Mode 1 | +| System Timer | None | +| Serial Default | 115200 Baud | +| Memory Manager | ZRC | +| ROM Size | 0 KB | +| RAM Size | 512 KB | + +##### Supported Hardware (see [Appendix B - Device Summary]): + +- FP: LEDIO=0, SWIO=0 +- DSRTC: MODE=STD, IO=192 +- UART: MODE=RC, IO=160 +- UART: MODE=RC, IO=168 +- SIO MODE=RC, IO=128, CHANNEL A, INTERRUPTS ENABLED +- SIO MODE=RC, IO=128, CHANNEL B, INTERRUPTS ENABLED +- SIO MODE=RC, IO=132, CHANNEL A, INTERRUPTS ENABLED +- SIO MODE=RC, IO=132, CHANNEL B, INTERRUPTS ENABLED +- ACIA: IO=128, INTERRUPTS ENABLED +- VRC: IO=0, KBD MODE=VRC, KBD IO=244 +- KBD: ENABLED +- CH: IO=62 +- CH: IO=60 +- CHUSB: IO=62 +- CHUSB: IO=60 +- MD: TYPE=RAM +- FD: MODE=RCWDC, IO=80, DRIVE 0, TYPE=3.5" HD +- FD: MODE=RCWDC, IO=80, DRIVE 1, TYPE=3.5" HD +- IDE: MODE=RC, IO=16, MASTER +- IDE: MODE=RC, IO=16, SLAVE +- PPIDE: IO=32, MASTER +- PPIDE: IO=32, SLAVE +- CTC: IO=136 + +##### Notes: + +- ROMless boot -- HBIOS is loaded from disk at boot +- CPU speed will be dynamically measured at startup if DSRTC is present + +`\clearpage`{=latex} + +### Z180 Z1RCC CPU Module + +#### ROM Image File: RCZ180_z1rcc.rom + +| | | +|-------------------|---------------| +| Default CPU Speed | 18.432 MHz | +| Interrupts | Mode 2 | +| System Timer | Z180 | +| Serial Default | 115200 Baud | +| Memory Manager | Z180 | +| ROM Size | 0 KB | +| RAM Size | 512 KB | + +##### Supported Hardware (see [Appendix B - Device Summary]): + +- FP: LEDIO=0, SWIO=0 +- DSRTC: MODE=STD, IO=12 +- INTRTC: ENABLED +- ASCI: IO=192, INTERRUPTS ENABLED +- ASCI: IO=193, INTERRUPTS ENABLED +- UART: MODE=RC, IO=160 +- UART: MODE=RC, IO=168 +- SIO MODE=RC, IO=128, CHANNEL A, INTERRUPTS ENABLED +- SIO MODE=RC, IO=128, CHANNEL B, INTERRUPTS ENABLED +- SIO MODE=RC, IO=132, CHANNEL A, INTERRUPTS ENABLED +- SIO MODE=RC, IO=132, CHANNEL B, INTERRUPTS ENABLED +- CH: IO=62 +- CH: IO=60 +- CHUSB: IO=62 +- CHUSB: IO=60 +- MD: TYPE=RAM +- FD: MODE=RCWDC, IO=80, DRIVE 0, TYPE=3.5" HD +- FD: MODE=RCWDC, IO=80, DRIVE 1, TYPE=3.5" HD +- IDE: MODE=RC, IO=16, MASTER +- IDE: MODE=RC, IO=16, SLAVE +- PPIDE: IO=32, MASTER +- PPIDE: IO=32, SLAVE + +##### Notes: + +- ROMless boot -- HBIOS is loaded from disk at boot +- CPU speed will be dynamically measured at startup if DSRTC is present `\clearpage`{=latex} ### Z280 ZZRCC CPU Module -| | | -|-------------------|--------------------| -| ROM Image Files | RCZ280_zzrc.rom | -| Console Baud Rate | 115200 | -| Interrupts | Mode 3 | - - - CPU speed is assumed to be 12 MHz (24 MHz oscillator) - - System timer is generated by Z280 CPU - - Hardware auto-detected: - - DS1302 RTC - - Z280 Z2U Serial Ports - - SIO Serial Interface Module - - EP Dual UART Serial Interface Module - - WDC Floppy Disk Controller w/ 3.5" HD Drives - - Onboard IDE Hard Disk Interface Module - - PPIDE Hard Disk Interface Module - - Serial baud rate is usually determined by hardware for ACIA and - SIO interfaces +#### ROM Image File: RCZ280_zzrcc.rom + +| | | +|-------------------|---------------| +| Default CPU Speed | 14.745 MHz | +| Interrupts | Mode 3 | +| System Timer | Z280 | +| Serial Default | 115200 Baud | +| Memory Manager | Z280 | +| ROM Size | 256 KB | +| RAM Size | 256 KB | + +##### Supported Hardware (see [Appendix B - Device Summary]): + +- FP: LEDIO=0, SWIO=0 +- DSRTC: MODE=STD, IO=192 +- Z2U: IO=16, INTERRUPTS ENABLED +- UART: MODE=RC, IO=160 +- UART: MODE=RC, IO=168 +- SIO MODE=RC, IO=128, CHANNEL A, INTERRUPTS ENABLED +- SIO MODE=RC, IO=128, CHANNEL B, INTERRUPTS ENABLED +- SIO MODE=RC, IO=132, CHANNEL A, INTERRUPTS ENABLED +- SIO MODE=RC, IO=132, CHANNEL B, INTERRUPTS ENABLED +- CH: IO=62 +- CH: IO=60 +- CHUSB: IO=62 +- CHUSB: IO=60 +- VRC: IO=0, KBD MODE=VRC, KBD IO=244 +- KBD: ENABLED +- MD: TYPE=RAM +- MD: TYPE=ROM +- FD: MODE=RCWDC, IO=80, DRIVE 0, TYPE=3.5" HD +- FD: MODE=RCWDC, IO=80, DRIVE 1, TYPE=3.5" HD +- IDE: MODE=RC, IO=16, MASTER +- IDE: MODE=RC, IO=16, SLAVE +- PPIDE: IO=32, MASTER +- PPIDE: IO=32, SLAVE + +##### Notes: + +- ZZRCC actually contains no ROM and 512KB of RAM. The first 256KB + of RAM is loaded from disk and then handled like ROM. +- CPU speed will be dynamically measured at startup if DSRTC is present + +`\clearpage`{=latex} + +#### ROM Image File: RCZ280_zzrcc_ram.rom + +| | | +|-------------------|---------------| +| Default CPU Speed | 14.745 MHz | +| Interrupts | Mode 3 | +| System Timer | Z280 | +| Serial Default | 115200 Baud | +| Memory Manager | Z280 | +| ROM Size | 0 KB | +| RAM Size | 512 KB | + +##### Supported Hardware (see [Appendix B - Device Summary]): + +- FP: LEDIO=0, SWIO=0 +- DSRTC: MODE=STD, IO=192 +- Z2U: IO=16, INTERRUPTS ENABLED +- UART: MODE=RC, IO=160 +- UART: MODE=RC, IO=168 +- SIO MODE=RC, IO=128, CHANNEL A, INTERRUPTS ENABLED +- SIO MODE=RC, IO=128, CHANNEL B, INTERRUPTS ENABLED +- SIO MODE=RC, IO=132, CHANNEL A, INTERRUPTS ENABLED +- SIO MODE=RC, IO=132, CHANNEL B, INTERRUPTS ENABLED +- VRC: IO=0, KBD MODE=VRC, KBD IO=244 +- KBD: ENABLED +- CH: IO=62 +- CH: IO=60 +- CHUSB: IO=62 +- CHUSB: IO=60 +- MD: TYPE=RAM +- FD: MODE=RCWDC, IO=80, DRIVE 0, TYPE=3.5" HD +- FD: MODE=RCWDC, IO=80, DRIVE 1, TYPE=3.5" HD +- IDE: MODE=RC, IO=16, MASTER +- IDE: MODE=RC, IO=16, SLAVE +- PPIDE: IO=32, MASTER +- PPIDE: IO=32, SLAVE + +##### Notes: + +- ROMless boot -- HBIOS is loaded from disk at boot +- CPU speed will be dynamically measured at startup if DSRTC is present `\clearpage`{=latex} ### Z280 ZZ80MB SBC -| | | -|-------------------|-------------------| -| ROM Image Files | RCZ280_zz80mb.rom | -| Console Baud Rate | 115200 | -| Interrupts | Mode 3 | - - - CPU speed is assumed to be 12 MHz (24 MHz oscillator) - - System timer is generated by Z280 CPU - - Hardware auto-detected: - - DS1302 RTC - - Z280 Z2U Serial Ports - - SIO Serial Interface Module - - EP Dual UART Serial Interface Module - - WDC Floppy Disk Controller w/ 3.5" HD Drives - - Onboard IDE Hard Disk Interface Module - - PPIDE Hard Disk Interface Module - - Serial baud rate is usually determined by hardware for ACIA and - SIO interfaces +#### ROM Image File: RCZ280_zz80mb.rom + +| | | +|-------------------|---------------| +| Default CPU Speed | 12.000 MHz | +| Interrupts | Mode 3 | +| System Timer | Z280 | +| Serial Default | 115200 Baud | +| Memory Manager | Z280 | +| ROM Size | 512 KB | +| RAM Size | 512 KB | + +##### Supported Hardware (see [Appendix B - Device Summary]): + +- FP: LEDIO=0, SWIO=0 +- DSRTC: MODE=STD, IO=192 +- Z2U: IO=16, INTERRUPTS ENABLED +- UART: MODE=RC, IO=160 +- UART: MODE=RC, IO=168 +- SIO MODE=RC, IO=128, CHANNEL A, INTERRUPTS ENABLED +- SIO MODE=RC, IO=128, CHANNEL B, INTERRUPTS ENABLED +- SIO MODE=RC, IO=132, CHANNEL A, INTERRUPTS ENABLED +- SIO MODE=RC, IO=132, CHANNEL B, INTERRUPTS ENABLED +- VRC: IO=0, KBD MODE=VRC, KBD IO=244 +- KBD: ENABLED +- CH: IO=62 +- CH: IO=60 +- CHUSB: IO=62 +- CHUSB: IO=60 +- MD: TYPE=RAM +- MD: TYPE=ROM +- FD: MODE=RCWDC, IO=80, DRIVE 0, TYPE=3.5" HD +- FD: MODE=RCWDC, IO=80, DRIVE 1, TYPE=3.5" HD +- IDE: MODE=RC, IO=16, MASTER +- IDE: MODE=RC, IO=16, SLAVE +- PPIDE: IO=32, MASTER +- PPIDE: IO=32, SLAVE + +##### Notes: + +- CPU speed will be dynamically measured at startup if DSRTC is present + +`\clearpage`{=latex} + +### Z80-Retro SBC + +#### ROM Image File: Z80RETRO_std.rom + +| | | +|-------------------|---------------| +| Default CPU Speed | 14.745 MHz | +| Interrupts | Mode 2 | +| System Timer | None | +| Serial Default | 38400 Baud | +| Memory Manager | Z2 | +| ROM Size | 512 KB | +| RAM Size | 512 KB | + +##### Supported Hardware (see [Appendix B - Device Summary]): + +- SIO MODE=Z80R, IO=128, CHANNEL A, INTERRUPTS ENABLED +- SIO MODE=Z80R, IO=128, CHANNEL B, INTERRUPTS ENABLED +- MD: TYPE=RAM +- MD: TYPE=ROM +- SD: MODE=, IO=104, UNITS=1 +- CTC: IO=64 + +##### Notes: + +`\clearpage`{=latex} + +### S100 Computers Z180 + +#### ROM Image File: S100_std.rom + +| | | +|-------------------|---------------| +| Default CPU Speed | 18.432 MHz | +| Interrupts | Mode 2 | +| System Timer | Z180 | +| Serial Default | 57600 Baud | +| Memory Manager | Z180 | +| ROM Size | 512 KB | +| RAM Size | 512 KB | + +##### Supported Hardware (see [Appendix B - Device Summary]): + +- FP: LEDIO=0 +- INTRTC: ENABLED +- ASCI: IO=192, INTERRUPTS ENABLED +- ASCI: IO=193, INTERRUPTS ENABLED +- SCON: IO=0 +- MD: TYPE=RAM +- MD: TYPE=ROM +- SD: MODE=SC, IO=12, UNITS=1 + +##### Notes: + +`\clearpage`{=latex} + +### Duodyne Z80 System + +#### ROM Image File: DUO_std.rom + +| | | +|-------------------|---------------| +| Default CPU Speed | 8.000 MHz | +| Interrupts | Mode 2 | +| System Timer | CTC | +| Serial Default | 38400 Baud | +| Memory Manager | Z2 | +| ROM Size | 512 KB | +| RAM Size | 512 KB | + +##### Supported Hardware (see [Appendix B - Device Summary]): + +- DSRTC: MODE=STD, IO=148 +- PCF: IO=86 +- UART: MODE=SBC, IO=88 +- UART: MODE=AUX, IO=168 +- UART: MODE=DUAL, IO=112 +- UART: MODE=DUAL, IO=120 +- SIO MODE=ZP, IO=96, CHANNEL A, INTERRUPTS ENABLED +- SIO MODE=ZP, IO=96, CHANNEL B, INTERRUPTS ENABLED +- PIO: IO=104, CHANNEL A +- PIO: IO=104, CHANNEL B +- PIO: IO=108, CHANNEL A +- PIO: IO=108, CHANNEL B +- LPT: MODE=SPP, IO=72 +- DMA: MODE=DUO, IO=64 +- CH: IO=78 +- CHUSB: IO=78 +- CHSD: IO=78 +- ESP: IO=156 +- ESPCON: ENABLED +- ESPSER: DEVICE=0 +- ESPSER: DEVICE=1 +- MD: TYPE=RAM +- MD: TYPE=ROM +- SPK: IO=148 +- CTC: IO=96, TIMER MODE=COUNTER, DIVISOR=18432, HI=256, LO=72, INTERRUPTS ENABLED + +##### Notes: + +- CPU speed will be dynamically measured at startup if DSRTC is present + +`\clearpage`{=latex} + +### Heath H8 Z80 System + +#### ROM Image File: HEATH_std.rom + +| | | +|-------------------|---------------| +| Default CPU Speed | 7.372 MHz | +| Interrupts | Mode 1 | +| System Timer | None | +| Serial Default | 115200 Baud | +| Memory Manager | Z2 | +| ROM Size | 512 KB | +| RAM Size | 512 KB | + +##### Supported Hardware (see [Appendix B - Device Summary]): + +- FP: LEDIO=0, SWIO=0 +- DSRTC: MODE=STD, IO=192 +- UART: MODE=RC, IO=160 +- UART: MODE=RC, IO=168 +- SIO MODE=RC, IO=128, CHANNEL A, INTERRUPTS ENABLED +- SIO MODE=RC, IO=128, CHANNEL B, INTERRUPTS ENABLED +- SIO MODE=RC, IO=132, CHANNEL A, INTERRUPTS ENABLED +- SIO MODE=RC, IO=132, CHANNEL B, INTERRUPTS ENABLED +- ACIA: IO=128, INTERRUPTS ENABLED +- MD: TYPE=RAM +- MD: TYPE=ROM +- FD: MODE=RCWDC, IO=80, DRIVE 0, TYPE=3.5" HD +- FD: MODE=RCWDC, IO=80, DRIVE 1, TYPE=3.5" HD +- IDE: MODE=RC, IO=16, MASTER +- IDE: MODE=RC, IO=16, SLAVE +- PPIDE: IO=32, MASTER +- PPIDE: IO=32, SLAVE +- CTC: IO=136 + +##### Notes: + +- CPU speed will be dynamically measured at startup if DSRTC is present + +`\clearpage`{=latex} + +### EP Mini-ITX Z180 + +#### ROM Image File: EPITX_std.rom + +| | | +|-------------------|---------------| +| Default CPU Speed | 18.432 MHz | +| Interrupts | Mode 2 | +| System Timer | Z180 | +| Serial Default | 115200 Baud | +| Memory Manager | Z180 | +| ROM Size | 512 KB | +| RAM Size | 512 KB | + +##### Supported Hardware (see [Appendix B - Device Summary]): + +- INTRTC: ENABLED +- ASCI: IO=192, INTERRUPTS ENABLED +- ASCI: IO=193, INTERRUPTS ENABLED +- UART: MODE=RC, IO=160 +- UART: MODE=RC, IO=168 +- TMS: MODE=MSX, IO=152 +- MD: TYPE=RAM +- MD: TYPE=ROM +- FD: MODE=EPFDC, IO=72, DRIVE 0, TYPE=3.5" HD +- FD: MODE=EPFDC, IO=72, DRIVE 1, TYPE=3.5" HD +- SD: MODE=, IO=66, UNITS=1 + +##### Notes: `\clearpage`{=latex} @@ -3819,43 +5548,56 @@ may be discovered by RomWBW in your system. | ASCI | Char | Zilog Z180 CPU Built-in Serial Ports | | AY | Audio | AY-3-8910/YM2149 Programmable Sound Generator | | BQRTC | RTC | BQ4845P Real Time Clock | +| CH | System | CH375/376 USB Controller | +| CHSD | Disk | CH37x SD Card Interface | +| CHUSB | Disk | CH37x USB Drive Interface | | CTC | System | Zilog Clock/Timer | | CVDU | Video | MC8563-based Video Display Controller | | DMA | System | Zilog DMA Controller | | DS1307 | RTC | Maxim DS1307 PCF I2C Real-Time Clock w/ NVRAM | | DS1501RTC | RTC | Maxim DS1501/DS1511 Watchdog Real-Time Clock | -| DSKY | System | Keypad & Display | | DSRTC | RTC | Maxim DS1302 Real-Time Clock w/ NVRAM | | DUART | Char | SCC2681 or compatible Dual UART | -| FD | Disk | 8272 of compatible Floppy Disk Controller | +| EMM | Disk | Disk drive on Parallel Port emm interface (Zip Drive) | +| FD | Disk | 8272 or compatible Floppy Disk Controller | +| FP | System | Simple LED & Switch Front Panel | | GDC | Video | uPD7220 Video Display Controller | | HDSK | Disk | SIMH Simulator Hard Disk | -| IDE | Disk | IDE/ATA Hard Disk Interface | +| ICM | DsKy | ICM7218-based Display/Keypad on PPI | +| IDE | Disk | IDE/ATA/ATAPI Hard Disk Interface | +| IMM | Disk | IMM Zip Drive on PPI | | INTRTC | RTC | Interrupt-based Real Time Clock | -| KBD | Kbd | 8242 PS/2 Keyboard Controller | +| KBD | Keyboard | 8242 PS/2 Keyboard Controller | | KIO | System | Zilog Serial/ Parallel Counter/Timer | | LPT | Char | Parallel I/O Controller | | MD | Disk | ROM/RAM Disk | -| MSXKYB | Kbd | MSX Compliant Matrix Keyboard | -| I2C | System | I2C Interface | +| MSXKYB | Keyboard | MSX Compliant Matrix Keyboard | +| PCF | RTC | PCF8584-based I2C Real-Time Clock | | PIO | Char | Zilog Parallel Interface Controller | -| PPIDE | Disk | 8255 IDE/ATA Hard Disk Interface | -| PPK | Kbd | Matrix Keyboard | -| PPPSD | Disk | ParPortProp SD Card Interface | +| PKD | DsKy | P8279-based Display/Keypad on PPI | +| PPA | Disk | PPA Zip Drive on PPI | +| PPIDE | Disk | 8255 IDE/ATA/ATAPI Hard Disk Interface | +| PPK | Keyboard | Matrix Keyboard | +| PPP | System | ParPortProp Host Interface Controller | | PPPCON | Serial | ParPortProp Serial Console Interface | -| PRPSD | Disk | PropIO SD Card Interface | +| PPPSD | Disk | ParPortProp SD Card Interface | +| PRP | System | PropIO Host Interface Controller | | PRPCON | Serial | PropIO Serial Console Interface | +| PRPSD | Disk | PropIO SD Card Interface | | RF | Disk | RAM Floppy Disk Interface | | RP5C01 | RTC | Ricoh RPC01A Real-Time Clock w/ NVRAM | +| SCON | Char | S100 Console | | SD | Disk | SD Card Interface | | SIMRTC | RTC | SIMH Simulator Real-Time Clock | | SIO | Char | Zilog Serial Port Interface | | SN76489 | Sound | SN76489 Programmable Sound Generator | | SPK | Sound | Bit-bang Speaker | +| SYQ | Disk | Iomega SparQ Drive on PPI | | TMS | Video | TMS9918/38/58 Video Display Controller | | UART | Char | 16C550 Family Serial Interface | | USB-FIFO | Char | FT232H-based ECB USB FIFO | | VDU | Video | MC6845 Family Video Display Controller | | VGA | Video | HD6445CP4-based Video Display Controller | +| VRC | Video | VGARC Video Display Controller | | YM | Audio | YM2612 Programmable Sound Generator | | Z2U | Char | Zilog Z280 CPU Built-in Serial Ports | diff --git a/Source/Doc/Z180 ASCI Baud Rate Options.xlsx b/Source/Doc/Z180 ASCI Baud Rate Options.xlsx index 9ee75209..c0f50b9a 100644 Binary files a/Source/Doc/Z180 ASCI Baud Rate Options.xlsx and b/Source/Doc/Z180 ASCI Baud Rate Options.xlsx differ diff --git a/Source/Fonts/Build.cmd b/Source/Fonts/Build.cmd index d41f7a41..9032d1bb 100644 --- a/Source/Fonts/Build.cmd +++ b/Source/Fonts/Build.cmd @@ -11,8 +11,8 @@ echo Preparing compressed font files... lzsa -f2 -r font8x8u.bin font8x8c.bin || exit /b lzsa -f2 -r font8x11u.bin font8x11c.bin || exit /b lzsa -f2 -r font8x16u.bin font8x16c.bin || exit /b - lzsa -f2 -r fontcgau.bin fontcgac.bin || exit /b +lzsa -f2 -r fontvgarcu.bin fontvgarcc.bin || exit /b fonttool font8x8u.bin > font8x8u.asm || exit /b fonttool font8x11u.bin > font8x11u.asm || exit /b @@ -20,6 +20,7 @@ fonttool font8x16u.bin > font8x16u.asm || exit /b fonttool font8x8c.bin > font8x8c.asm || exit /b fonttool font8x11c.bin > font8x11c.asm || exit /b fonttool font8x16c.bin > font8x16c.asm || exit /b - fonttool fontcgau.bin > fontcgau.asm || exit /b fonttool fontcgac.bin > fontcgac.asm || exit /b +fonttool fontvgarcu.bin > fontvgarcu.asm || exit /b +fonttool fontvgarcc.bin > fontvgarcc.asm || exit /b diff --git a/Source/Fonts/Makefile b/Source/Fonts/Makefile index dae4a305..75b4e705 100644 --- a/Source/Fonts/Makefile +++ b/Source/Fonts/Makefile @@ -1,8 +1,8 @@ OBJECTS = \ - font8x8u.asm font8x11u.asm font8x16u.asm fontcgau.asm \ - font8x8c.asm font8x11c.asm font8x16c.asm fontcgac.asm + font8x8u.asm font8x11u.asm font8x16u.asm fontcgau.asm fontvgarcu.asm \ + font8x8c.asm font8x11c.asm font8x16c.asm fontcgac.asm fontvgarcc.asm -OTHERS = font8x8c.bin font8x11c.bin font8x16c.bin fontcgac.bin +OTHERS = font8x8c.bin font8x11c.bin font8x16c.bin fontcgac.bin fontvgarcc.bin TOOLS = ../../Tools @@ -26,5 +26,8 @@ font8x16c.bin: font8x16u.bin fontcgac.bin: fontcgau.bin $(BINDIR)/lzsa -f2 -r $< $@ +fontvgarcc.bin: fontvgarcu.bin + $(BINDIR)/lzsa -f2 -r $< $@ + %.asm: %.bin $(BINDIR)/bin2asm $< > $@ diff --git a/Source/Fonts/fontvgarcu.bin b/Source/Fonts/fontvgarcu.bin new file mode 100644 index 00000000..91b53d17 Binary files /dev/null and b/Source/Fonts/fontvgarcu.bin differ diff --git a/Source/HBIOS/API.txt b/Source/HBIOS/API.txt index af68ecfe..c1c7175b 100644 --- a/Source/HBIOS/API.txt +++ b/Source/HBIOS/API.txt @@ -117,7 +117,11 @@ GET ($F8): L=Clock Mult (0:Half, 1:Full, 2: Double) D=Memory Wait States E=I/O Wait States - + + PANEL ($F4): + BC=Function/Subfunction A=Result + L=Switch Values + SET ($F9): BC=Function/Subfunction A=Result @@ -142,6 +146,11 @@ SET ($F9): E=I/O Wait States + PANEL ($F4): + BC=Function/Subfunction A=Result + L=LED Values + + PEEK ($FA): B=Function A=Result D=Bank E=Byte Value @@ -475,3 +484,93 @@ TERM_ATTACH: (C=VIDEO UNIT, DE=_DISPATCH) - QUERY ATTACHED VDA FOR SCREEN SIZE (VIA _VDADISP) - INITIALIZE ALL WORKING VARIABLES AND EMULATOR STATE - RETURN (A=STATUS) + + +============== +DSKY Functions +============== + +RESET ($30): + B=Function A=Result + +STAT ($31): + B=Function A=Result / Bytes Pending + + A=Number of characters waiting or error code if negative + +GETKEY ($32): + B=Function A=Result + E=Key Code + + A=DSKY key value or error code if negative + +SHOWHEX ($33): + B=Function A=Result + DE:HL=Value (32-bit) + + Display value of DE:HL in hex on display. It is not + possible to show decimal points. + +SHOWSEG ($34): + B=Function A=Result + HL=Buffer (raw segment encoded) + + Display raw segment values. Each byte represents one + character. Each segment of the character is represented + by a bit. The buffer must be located in high memory. + The segments are encoded as shown below: + + +--01--+ + 20 02 + +--40--+ + 10 04 + +--08--+ 80 + +KEYLEDS ($35): + B=Function A=Result + HL=Buffer (LED bitmap) + + Light the LEDs for the keypad keys according to the + bitmap contained in the buffer pointed to by HL. The buffer + must be located in high memory. + + At this time, the bitmap is specific to the DSKYNG hardware. + This function is ignored by the original DSKY. + +STATLED ($36): + B=Function A=Result + D=LED Number + E=LED State (0/1) + + Set or clear the status LED specified in D. The state of + the LED is contained in E. If E=0, the LED will be turned + off. If E=1, the LED will be turned on. + +BEEP ($37): + B=Function A=Result + + Beep the onboard speaker of the DSKY. Only the DSKYNG hardware + has a speaker. This function will be ignored by the original + DSKY. + +DEVICE ($38): + B=Function A=Result + D=Device Type + E=Device Number + C=Device Attributes + H=Device Mode + L=Base I/O Adr + + Returns device information for the DSKY unit. The Status (A) is a + standard HBIOS result code. Device Attribute (C) values are not yet + defined. Device Type (D) indicates the specific hardware driver that + handles the specified character unit. Values are listed at the start + of this section. Device Number (E) indicates the physical device + number assigned per driver which is always 0 for DSKY. + + Device Mode (H) is used to indicate the variant of the chip or circuit + that is used by the specified unit. The Device I/O Base Address (L) + indicates the starting port address of the hardware interface that is + servicing the specified unit. Both of these values are considered + driver specific. Refer to the associated hardware driver for the + values used. diff --git a/Source/HBIOS/Bank Layout.txt b/Source/HBIOS/Bank Layout.txt new file mode 100644 index 00000000..01bff19a --- /dev/null +++ b/Source/HBIOS/Bank Layout.txt @@ -0,0 +1,85 @@ +ROM Bank Layout + +Bank ID Module Start Size +------ ------ ------ ------ +0x00 hbios 0x0000 0x8000 + 0x8000 + +0x01 loader 0x0000 0x1000 + dbgmon 0x1000 0x2000 + cpm22 0x2000 0x3000 + zsys 0x5000 0x3000 + 0x8000 + +0x02 forth 0x0000 0x1700 + basic 0x1700 0x2000 + tbasic 0x3700 0x0900 + game 0x4000 0x0900 + egg 0x4900 0x0200 + netboot 0x4B00 0x1000 + updater 0x5B00 0x0D00 + usrrom 0x6800 0x1800 + 0x8000 + +0x03 imgpad2 0x0000 0x8000 + 0x8000 + +0x04 - N ROM Disk Data + + +Typical ROM Bank Layout + +Bank ID Usage +------- ------ +0x00 Boot Bank (HBIOS image) +0x01 ROM Loader, Monitor, ROM OSes +0x02 ROM Applications +0x03 Reserved +0x04-0x0F ROM Disk Banks + + +Typical RAM Bank Layout + +Bank ID Usage +------- ------ +0x80 RomWBW HBIOS +0x81-0x8B RAM Disk Data +0x8C CP/M 3 Buffers +0x8D CP/M 3 OS +0x8E User TPA +0x8F Common + + +Typical ROMless Bank Layout + +Bank ID Usage +------- ------ +0x80 RomWBW HBIOS +0x81 Loader, DbgMon, CP/M 2.2, ZSDOS +0x82 ROM Apps +0x83 More ROM Apps +0x84-0x8B RAM Disk Data +0x8C CP/M 3 Buffers +0x8D CP/M 3 OS +0x8E User TPA +0x8F Common + + +ROMless Tiny Bank Layout (128K) +NOTE: no ROM Apps, no CP/M 3 support, no RAM disk + +Bank ID Usage +------- ------ +0x80 RomWBW HBIOS +0x81 Loader, DbgMon, CP/M 2.2, ZSDOS +0x82 User TPA +0x83 Common + +Disk Image Sizes + +Image Size ROM System ROMless System +---------- ---------- -------------- +1024K 896K 768K +512 384K 256K +256 128K 0K +128 (tiny) n/a 0K diff --git a/Source/HBIOS/Build.cmd b/Source/HBIOS/Build.cmd index 802e6182..03dbe739 100644 --- a/Source/HBIOS/Build.cmd +++ b/Source/HBIOS/Build.cmd @@ -33,6 +33,16 @@ PowerShell -ExecutionPolicy Unrestricted .\Build.ps1 %* || exit /b call build_env.cmd +:: +:: Start of the actual build process for a given ROM. +:: + +echo. +echo ============================================================ +echo %ROMName% for Z%CPUType% CPU +echo ============================================================ +echo. + :: :: Create a small app that is used to export key build variables of the build. :: Then run the app to output a file with the variables. Finally, read the @@ -43,12 +53,6 @@ tasm -t80 -g3 -dCMD hbios_env.asm hbios_env.com hbios_env.lst || exit /b zxcc hbios_env >hbios_env.cmd call hbios_env.cmd -:: -:: Start of the actual build process for a given ROM. -:: - -echo Building %ROMSize%K ROM %ROMName% for Z%CPUType% CPU... - :: :: UNA is a special case, check for it and jump if needed. :: @@ -93,7 +97,14 @@ call :asm imgpad2 || exit /b copy /b romldr.bin + dbgmon.bin + ..\zsdos\zsys_wbw.bin + ..\cpm22\cpm_wbw.bin osimg.bin || exit /b copy /b ..\Forth\camel80.bin + nascom.bin + ..\tastybasic\src\tastybasic.bin + game.bin + eastaegg.bin + netboot.mod + updater.bin + usrrom.bin osimg1.bin || exit /b -copy /b imgpad2.bin osimg2.bin || exit /b + +if %Platform%==S100 ( + zxcc slr180 -s100mon/fh + zxcc mload25 -s100mon || exit /b + copy /b s100mon.com osimg2.bin || exit /b +) else ( + copy /b imgpad2.bin osimg2.bin || exit /b +) copy /b romldr.bin + dbgmon.bin + ..\zsdos\zsys_wbw.bin osimg_small.bin || exit /b @@ -103,10 +114,8 @@ copy /b romldr.bin + dbgmon.bin + ..\zsdos\zsys_wbw.bin osimg_small.bin || exit :: should yield a result of zero. :: -if %ROMSize% gtr 0 ( - for %%f in (hbios_rom.bin osimg.bin osimg1.bin osimg2.bin) do ( - "%TOOLS%\srecord\srec_cat.exe" %%f -Binary -Crop 0 0x7FFF -Checksum_Negative_Big_Endian 0x7FFF 1 1 -o %%f -Binary || exit /b - ) +for %%f in (hbios_rom.bin osimg.bin osimg1.bin osimg2.bin) do ( + "%TOOLS%\srecord\srec_cat.exe" %%f -Binary -Crop 0 0x7FFF -Checksum_Negative_Big_Endian 0x7FFF 1 1 -o %%f -Binary || exit /b ) :: @@ -130,8 +139,8 @@ if %ROMSize% gtr 0 ( copy /b hbios_rom.bin + osimg.bin + osimg1.bin + osimg2.bin %ROMName%.upd || exit /b copy /b hbios_app.bin + osimg_small.bin %ROMName%.com || exit /b ) else ( - copy /b hbios_rom.bin + osimg_small.bin %ROMName%.rom || exit /b - copy /b hbios_rom.bin + osimg_small.bin %ROMName%.upd || exit /b + copy /b hbios_rom.bin + osimg.bin + osimg1.bin + osimg2.bin + ..\RomDsk\ram%RAMSize%_wbw.dat %ROMName%.rom || exit /b + copy /b hbios_rom.bin + osimg.bin + osimg1.bin + osimg2.bin %ROMName%.upd || exit /b copy /b hbios_app.bin + osimg_small.bin %ROMName%.com || exit /b ) @@ -209,19 +218,29 @@ call Build RCZ80 skz || exit /b :: call Build RCZ80 duart || exit /b call Build RCZ80 zrc || exit /b call Build RCZ80 zrc_ram || exit /b +call Build RCZ80 zrc512 || exit /b call Build RCZ180 ext || exit /b call Build RCZ180 nat || exit /b +call Build RCZ180 z1rcc || exit /b call Build RCZ280 ext || exit /b call Build RCZ280 nat || exit /b call Build RCZ280 zz80mb || exit /b -call Build RCZ280 zzrc || exit /b +call Build RCZ280 zzrcc || exit /b +call Build RCZ280 zzrcc_ram || exit /b call Build SCZ180 sc126 || exit /b call Build SCZ180 sc130 || exit /b call Build SCZ180 sc131 || exit /b call Build SCZ180 sc140 || exit /b call Build SCZ180 sc503 || exit /b +call Build SCZ180 sc700 || exit /b call Build DYNO std || exit /b call Build UNA std || exit /b call Build RPH std || exit /b +call Build Z80RETRO std || exit /b +call Build S100 std || exit /b +call Build DUO std || exit /b +call Build HEATH std || exit /b +call Build EPITX std || exit /b +:: call Build MON std || exit /b goto :eof diff --git a/Source/HBIOS/Build.ps1 b/Source/HBIOS/Build.ps1 index 518dbae4..41ac2de1 100644 --- a/Source/HBIOS/Build.ps1 +++ b/Source/HBIOS/Build.ps1 @@ -27,8 +27,8 @@ $ErrorAction = 'Stop' # UNA BIOS is simply imbedded, it is not built here. # -$PlatformListZ80 = "SBC", "MBC", "ZETA", "ZETA2", "RCZ80", "UNA" -$PlatformListZ180 = "N8", "MK4", "RCZ180", "SCZ180", "DYNO", "RPH" +$PlatformListZ80 = "SBC", "MBC", "ZETA", "ZETA2", "RCZ80", "Z80RETRO", "DUO", "UNA", "HEATH", "MON" +$PlatformListZ180 = "N8", "MK4", "RCZ180", "SCZ180", "DYNO", "RPH", "S100", "EPITX" $PlatformListZ280 = "RCZ280" # diff --git a/Source/HBIOS/Build.sh b/Source/HBIOS/Build.sh index 69c1c1b5..6bd29d53 100755 --- a/Source/HBIOS/Build.sh +++ b/Source/HBIOS/Build.sh @@ -6,6 +6,7 @@ set -e export ROM_PLATFORM export ROM_CONFIG export ROMSIZE +export RAMSIZE export CPUFAM if [ "${ROM_PLATFORM}" == "dist" ] ; then @@ -15,10 +16,12 @@ if [ "${ROM_PLATFORM}" == "dist" ] ; then ROM_PLATFORM="N8"; ROM_CONFIG="std"; bash Build.sh ROM_PLATFORM="RCZ180"; ROM_CONFIG="ext"; bash Build.sh ROM_PLATFORM="RCZ180"; ROM_CONFIG="nat"; bash Build.sh + ROM_PLATFORM="RCZ180"; ROM_CONFIG="z1rcc"; bash Build.sh ROM_PLATFORM="RCZ280"; ROM_CONFIG="ext"; bash Build.sh ROM_PLATFORM="RCZ280"; ROM_CONFIG="nat"; bash Build.sh ROM_PLATFORM="RCZ280"; ROM_CONFIG="zz80mb"; bash Build.sh - ROM_PLATFORM="RCZ280"; ROM_CONFIG="zzrc"; bash Build.sh + ROM_PLATFORM="RCZ280"; ROM_CONFIG="zzrcc"; bash Build.sh + ROM_PLATFORM="RCZ280"; ROM_CONFIG="zzrcc_ram"; bash Build.sh # ROM_PLATFORM="RCZ80"; ROM_CONFIG="mt"; bash Build.sh # ROM_PLATFORM="RCZ80"; ROM_CONFIG="duart"; bash Build.sh ROM_PLATFORM="RCZ80"; ROM_CONFIG="std"; bash Build.sh @@ -28,18 +31,26 @@ if [ "${ROM_PLATFORM}" == "dist" ] ; then ROM_PLATFORM="RCZ80"; ROM_CONFIG="skz"; bash Build.sh ROM_PLATFORM="RCZ80"; ROM_CONFIG="zrc"; bash Build.sh ROM_PLATFORM="RCZ80"; ROM_CONFIG="zrc_ram"; bash Build.sh + ROM_PLATFORM="RCZ80"; ROM_CONFIG="zrc512"; bash Build.sh ROM_PLATFORM="RPH"; ROM_CONFIG="std"; bash Build.sh ROM_PLATFORM="SBC"; ROM_CONFIG="std"; bash Build.sh ROM_PLATFORM="SBC"; ROM_CONFIG="simh"; bash Build.sh ROM_PLATFORM="MBC"; ROM_CONFIG="std"; bash Build.sh + ROM_PLATFORM="DUO"; ROM_CONFIG="std"; bash Build.sh ROM_PLATFORM="SCZ180"; ROM_CONFIG="sc126"; bash Build.sh ROM_PLATFORM="SCZ180"; ROM_CONFIG="sc130"; bash Build.sh ROM_PLATFORM="SCZ180"; ROM_CONFIG="sc131"; bash Build.sh ROM_PLATFORM="SCZ180"; ROM_CONFIG="sc140"; bash Build.sh ROM_PLATFORM="SCZ180"; ROM_CONFIG="sc503"; bash Build.sh + ROM_PLATFORM="SCZ180"; ROM_CONFIG="sc700"; bash Build.sh + ROM_PLATFORM="S100"; ROM_CONFIG="std"; bash Build.sh ROM_PLATFORM="UNA"; ROM_CONFIG="std"; bash Build.sh + ROM_PLATFORM="Z80RETRO"; ROM_CONFIG="std"; bash Build.sh ROM_PLATFORM="ZETA"; ROM_CONFIG="std"; bash Build.sh ROM_PLATFORM="ZETA2"; ROM_CONFIG="std"; bash Build.sh + ROM_PLATFORM="HEATH"; ROM_CONFIG="std"; bash Build.sh + ROM_PLATFORM="EPITX"; ROM_CONFIG="std"; bash Build.sh +# ROM_PLATFORM="MON"; ROM_CONFIG="std"; bash Build.sh exit fi @@ -104,4 +115,4 @@ fi #echo OBJECTS=${OBJECTS} -make ROM_PLATFORM=${ROM_PLATFORM} ROM_CONFIG=${ROM_CONFIG} ROMSIZE=${ROMSIZE} +make ROM_PLATFORM=${ROM_PLATFORM} ROM_CONFIG=${ROM_CONFIG} ROMSIZE=${ROMSIZE} RAMSIZE=${RAMSIZE} diff --git a/Source/HBIOS/Clean.cmd b/Source/HBIOS/Clean.cmd index 432d4166..a291a724 100644 --- a/Source/HBIOS/Clean.cmd +++ b/Source/HBIOS/Clean.cmd @@ -11,6 +11,7 @@ if exist *.exp del *.exp if exist *.tmp del *.tmp if exist *.mrk del *.mrk if exist *.sys del *.sys +if exist *.hex del *.hex if exist build.inc del build.inc if exist font*.asm del font*.asm if exist build_env.cmd del build_env.cmd diff --git a/Source/HBIOS/Config/DUO_std.asm b/Source/HBIOS/Config/DUO_std.asm new file mode 100644 index 00000000..855735ea --- /dev/null +++ b/Source/HBIOS/Config/DUO_std.asm @@ -0,0 +1,47 @@ +; +;================================================================================================== +; DUODYNE STANDARD CONFIGURATION +;================================================================================================== +; +; THE COMPLETE SET OF DEFAULT CONFIGURATION SETTINGS FOR THIS PLATFORM ARE FOUND IN THE +; CFG_.ASM INCLUDED FILE WHICH IS FOUND IN THE PARENT DIRECTORY. THIS FILE CONTAINS +; COMMON CONFIGURATION SETTINGS THAT OVERRIDE THE DEFAULTS. IT IS INTENDED THAT YOU MAKE +; YOUR CUSTOMIZATIONS IN THIS FILE AND JUST INHERIT ALL OTHER SETTINGS FROM THE DEFAULTS. +; EVEN BETTER, YOU CAN MAKE A COPY OF THIS FILE WITH A NAME LIKE _XXX.ASM AND SPECIFY +; YOUR FILE IN THE BUILD PROCESS. +; +; THE SETTINGS BELOW ARE THE SETTINGS THAT ARE MOST COMMONLY MODIFIED FOR THIS PLATFORM. +; MANY OF THEM ARE EQUAL TO THE SETTINGS IN THE INCLUDED FILE, SO THEY DON'T REALLY DO +; ANYTHING AS IS. THEY ARE LISTED HERE TO MAKE IT EASY FOR YOU TO ADJUST THE MOST COMMON +; SETTINGS. +; +; N.B., SINCE THE SETTINGS BELOW ARE REDEFINING VALUES ALREADY SET IN THE INCLUDED FILE, +; TASM INSISTS THAT YOU USE THE .SET OPERATOR AND NOT THE .EQU OPERATOR BELOW. ATTEMPTING +; TO REDEFINE A VALUE WITH .EQU BELOW WILL CAUSE TASM ERRORS! +; +; PLEASE REFER TO THE CUSTOM BUILD INSTRUCTIONS (README.TXT) IN THE SOURCE DIRECTORY (TWO +; DIRECTORIES ABOVE THIS ONE). +; +#DEFINE BOOT_DEFAULT "H" ; DEFAULT BOOT LOADER CMD ON OR AUTO BOOT +; +#include "cfg_duo.asm" +; +CPUOSC .SET 8000000 ; CPU OSC FREQ IN MHZ +CRTACT .SET FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP +; +INTMODE .SET 2 ; INTERRUPTS: 0=NONE, 1=MODE 1, 2=MODE 2, 3=MODE 3 (Z280) +; +;;;DMAENABLE .SET TRUE ; DMA: ENABLE DMA DRIVER (DMA.ASM) +; +BATCOND .SET TRUE ; ENABLE LOW BATTERY WARNING MESSAGE +; +ROMSIZE .SET 512 ; SIZE OF ROM IN KB (MUST MATCH YOUR HARDWARE!!!) +RAMSIZE .SET 512 ; SIZE OF RAM IN KB (MUST MATCH YOUR HARDWARE!!!) +; +PCFENABLE .SET TRUE ; ENABLE PCF8584 I2C CONTROLLER +; +MDFFENABLE .SET FALSE ; MD: ENABLE FLASH FILE SYSTEM +; +UARTINTS .SET FALSE ; UART: INCLUDE INTERRUPT SUPPORT UNDER IM1/2/3 +; +ESPENABLE .SET TRUE ; ESP: ENABLE ESP32 IO BOARD DRIVER (ESP.ASM) diff --git a/Source/HBIOS/Config/DYNO_std.asm b/Source/HBIOS/Config/DYNO_std.asm index 176b9786..bc4b677d 100644 --- a/Source/HBIOS/Config/DYNO_std.asm +++ b/Source/HBIOS/Config/DYNO_std.asm @@ -34,8 +34,6 @@ Z180_MEMWAIT .SET 0 ; Z180: MEMORY WAIT STATES (0-3) Z180_IOWAIT .SET 1 ; Z180: I/O WAIT STATES TO ADD ABOVE 1 W/S BUILT-IN (0-3) ; ASCIENABLE .SET TRUE ; ASCI: ENABLE Z180 ASCI SERIAL DRIVER (ASCI.ASM) -;ASCI0CFG .SET SER_115200_8N1 ; ASCI 0: SERIAL LINE CONFIG -;ASCI1CFG .SET SER_115200_8N1 ; ASCI 1: SERIAL LINE CONFIG ; FDENABLE .SET TRUE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM) ; diff --git a/Source/HBIOS/Config/EPITX_std.asm b/Source/HBIOS/Config/EPITX_std.asm new file mode 100644 index 00000000..62dc73e7 --- /dev/null +++ b/Source/HBIOS/Config/EPITX_std.asm @@ -0,0 +1,64 @@ +; +;================================================================================================== +; Z180 Mini ITX STANDARD CONFIGURATION +;================================================================================================== +; +; THE COMPLETE SET OF DEFAULT CONFIGURATION SETTINGS FOR THIS PLATFORM ARE FOUND IN THE +; CFG_.ASM INCLUDED FILE WHICH IS FOUND IN THE PARENT DIRECTORY. THIS FILE CONTAINS +; COMMON CONFIGURATION SETTINGS THAT OVERRIDE THE DEFAULTS. IT IS INTENDED THAT YOU MAKE +; YOUR CUSTOMIZATIONS IN THIS FILE AND JUST INHERIT ALL OTHER SETTINGS FROM THE DEFAULTS. +; EVEN BETTER, YOU CAN MAKE A COPY OF THIS FILE WITH A NAME LIKE _XXX.ASM AND SPECIFY +; YOUR FILE IN THE BUILD PROCESS. +; +; THE SETTINGS BELOW ARE THE SETTINGS THAT ARE MOST COMMONLY MODIFIED FOR THIS PLATFORM. +; MANY OF THEM ARE EQUAL TO THE SETTINGS IN THE INCLUDED FILE, SO THEY DON'T REALLY DO +; ANYTHING AS IS. THEY ARE LISTED HERE TO MAKE IT EASY FOR YOU TO ADJUST THE MOST COMMON +; SETTINGS. +; +; N.B., SINCE THE SETTINGS BELOW ARE REDEFINING VALUES ALREADY SET IN THE INCLUDED FILE, +; TASM INSISTS THAT YOU USE THE .SET OPERATOR AND NOT THE .EQU OPERATOR BELOW. ATTEMPTING +; TO REDEFINE A VALUE WITH .EQU BELOW WILL CAUSE TASM ERRORS! +; +; PLEASE REFER TO THE CUSTOM BUILD INSTRUCTIONS (README.TXT) IN THE SOURCE DIRECTORY (TWO +; DIRECTORIES ABOVE THIS ONE). +; +#DEFINE PLATFORM_NAME "Z180 MiniITX" +; +#DEFINE BOOT_DEFAULT "H" ; DEFAULT BOOT LOADER CMD ON OR AUTO BOOT +; +#include "cfg_epitx.asm" +; +CRTACT .SET TRUE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP +; +CPUOSC .SET 18432000 ; CPU OSC FREQ IN MHZ +; +Z180_CLKDIV .SET 1 ; Z180: CHK DIV: 0=OSC/2, 1=OSC, 2=OSC*2 +Z180_MEMWAIT .SET 0 ; Z180: MEMORY WAIT STATES (0-3) +Z180_IOWAIT .SET 1 ; Z180: I/O WAIT STATES TO ADD ABOVE 1 W/S BUILT-IN (0-3) +; +HBIOS_MUTEX .SET FALSE ; ENABLE REENTRANT CALLS TO HBIOS (ADDS OVERHEAD) +; +LEDENABLE .SET FALSE ; ENABLE STATUS LED (SINGLE LED) +; +DSRTCENABLE .SET FALSE ; DSRTC: ENABLE DS-1302 CLOCK DRIVER (DSRTC.ASM) +INTRTCENABLE .SET TRUE ; ENABLE PERIODIC INTERRUPT CLOCK DRIVER (INTRTC.ASM) +; +UARTENABLE .SET TRUE ; UART: ENABLE 8250/16550-LIKE SERIAL DRIVER (UART.ASM) +ASCIENABLE .SET TRUE ; ASCI: ENABLE Z180 ASCI SERIAL DRIVER (ASCI.ASM) +ACIAENABLE .SET FALSE ; ACIA: ENABLE MOTOROLA 6850 ACIA DRIVER (ACIA.ASM) +SIOENABLE .SET FALSE ; SIO: ENABLE ZILOG SIO SERIAL DRIVER (SIO.ASM) +; +TMSENABLE .SET TRUE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM) +; +AY38910ENABLE .SET FALSE ; AY: AY-3-8910 / YM2149 SOUND DRIVER +; +FDENABLE .SET TRUE ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPFDC] +FDMODE .SET FDMODE_EPFDC ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|DIDE|N8|DIO3] +; +IDEENABLE .SET FALSE ; IDE: ENABLE IDE DISK DRIVER (IDE.ASM) +; +PPIDEENABLE .SET FALSE ; PPIDE: ENABLE PARALLEL PORT IDE DISK DRIVER (PPIDE.ASM) +; +SDENABLE .SET TRUE ; SD: ENABLE SD CARD DISK DRIVER (SD.ASM) +; +PRPENABLE .SET FALSE ; PRP: ENABLE ECB PROPELLER IO BOARD DRIVER (PRP.ASM) diff --git a/Source/HBIOS/Config/HEATH_std.asm b/Source/HBIOS/Config/HEATH_std.asm new file mode 100644 index 00000000..4ca7f5b9 --- /dev/null +++ b/Source/HBIOS/Config/HEATH_std.asm @@ -0,0 +1,69 @@ +; +;================================================================================================== +; HEATH H8 Z80 STANDARD CONFIGURATION +;================================================================================================== +; +; THE COMPLETE SET OF DEFAULT CONFIGURATION SETTINGS FOR THIS PLATFORM ARE FOUND IN THE +; CFG_.ASM INCLUDED FILE WHICH IS FOUND IN THE PARENT DIRECTORY. THIS FILE CONTAINS +; COMMON CONFIGURATION SETTINGS THAT OVERRIDE THE DEFAULTS. IT IS INTENDED THAT YOU MAKE +; YOUR CUSTOMIZATIONS IN THIS FILE AND JUST INHERIT ALL OTHER SETTINGS FROM THE DEFAULTS. +; EVEN BETTER, YOU CAN MAKE A COPY OF THIS FILE WITH A NAME LIKE _XXX.ASM AND SPECIFY +; YOUR FILE IN THE BUILD PROCESS. +; +; THE SETTINGS BELOW ARE THE SETTINGS THAT ARE MOST COMMONLY MODIFIED FOR THIS PLATFORM. +; MANY OF THEM ARE EQUAL TO THE SETTINGS IN THE INCLUDED FILE, SO THEY DON'T REALLY DO +; ANYTHING AS IS. THEY ARE LISTED HERE TO MAKE IT EASY FOR YOU TO ADJUST THE MOST COMMON +; SETTINGS. +; +; N.B., SINCE THE SETTINGS BELOW ARE REDEFINING VALUES ALREADY SET IN THE INCLUDED FILE, +; TASM INSISTS THAT YOU USE THE .SET OPERATOR AND NOT THE .EQU OPERATOR BELOW. ATTEMPTING +; TO REDEFINE A VALUE WITH .EQU BELOW WILL CAUSE TASM ERRORS! +; +; PLEASE REFER TO THE CUSTOM BUILD INSTRUCTIONS (README.TXT) IN THE SOURCE DIRECTORY (TWO +; DIRECTORIES ABOVE THIS ONE). +; +#DEFINE BOOT_DEFAULT "H" ; DEFAULT BOOT LOADER CMD ON OR AUTO BOOT +; +#include "cfg_rcz80.asm" +; +CPUOSC .SET 7372800 ; CPU OSC FREQ IN MHZ +CRTACT .SET FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP +; +DSKYENABLE .SET TRUE ; ENABLES DSKY FUNCTIONALITY +H8PENABLE .SET TRUE ; ENABLES HEATH H8 FRONT PANEL +; +FPLED_ENABLE .SET TRUE ; FP: ENABLES FRONT PANEL LEDS +FPSW_ENABLE .SET TRUE ; FP: ENABLES FRONT PANEL SWITCHES +; +DSRTCENABLE .SET TRUE ; DSRTC: ENABLE DS-1302 CLOCK DRIVER (DSRTC.ASM) +RP5RTCENABLE .SET FALSE ; RP5C01 RTC BASED CLOCK (RP5RTC.ASM) +; +UARTENABLE .SET TRUE ; UART: ENABLE 8250/16550-LIKE SERIAL DRIVER (UART.ASM) +ACIAENABLE .SET TRUE ; ACIA: ENABLE MOTOROLA 6850 ACIA DRIVER (ACIA.ASM) +SIOENABLE .SET TRUE ; SIO: ENABLE ZILOG SIO SERIAL DRIVER (SIO.ASM) +DUARTENABLE .SET FALSE ; DUART: ENABLE 2681/2692 SERIAL DRIVER (DUART.ASM) +; +LPTENABLE .SET FALSE ; LPT: ENABLE CENTRONICS PRINTER DRIVER (LPT.ASM) +; +TMSENABLE .SET FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM) +TMSTIMENABLE .SET FALSE ; TMS: ENABLE TIMER INTERRUPTS (REQUIRES IM1) +TMSMODE .SET TMSMODE_MSX ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|MSX9958|MSXKBD|COLECO] +MKYENABLE .SET FALSE ; MSX 5255 PPI KEYBOARD COMPATIBLE DRIVER (REQUIRES TMS VDA DRIVER) +VRCENABLE .SET FALSE ; VRC: ENABLE VGARC VIDEO/KBD DRIVER (VRC.ASM) +VDAEMU_SERKBD .SET 0 ; VDA EMULATION: SERIAL KBD UNIT #, OR $FF FOR HW KBD +; +AY38910ENABLE .SET FALSE ; AY: AY-3-8910 / YM2149 SOUND DRIVER +AYMODE .SET AYMODE_RCZ80 ; AY: DRIVER MODE: AYMODE_[SCG|N8|RCZ80|RCZ180|MSX|LINC] +SN76489ENABLE .SET FALSE ; SN: ENABLE SN76489 SOUND DRIVER +; +FDENABLE .SET TRUE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM) +FDMODE .SET FDMODE_RCWDC ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPFDC] +; +IDEENABLE .SET TRUE ; IDE: ENABLE IDE DISK DRIVER (IDE.ASM) +PPIDEENABLE .SET TRUE ; PPIDE: ENABLE PARALLEL PORT IDE DISK DRIVER (PPIDE.ASM) +SDENABLE .SET FALSE ; SD: ENABLE SD CARD DISK DRIVER (SD.ASM) +SDMODE .SET SDMODE_PIO ; SD: DRIVER MODE: SDMODE_[JUHA|N8|CSIO|PPI|UART|DSD|MK4|SC|MT|PIO|USR] +SDCNT .SET 1 ; SD: NUMBER OF SD CARD DEVICES (1-2), FOR DSD/SC/MT SC ONLY +IMMENABLE .SET FALSE ; IMM: ENABLE IMM DISK DRIVER (IMM.ASM) +; +PRPENABLE .SET FALSE ; PRP: ENABLE ECB PROPELLER IO BOARD DRIVER (PRP.ASM) diff --git a/Source/HBIOS/Config/MBC_std.asm b/Source/HBIOS/Config/MBC_std.asm index f7370980..9ae980c8 100644 --- a/Source/HBIOS/Config/MBC_std.asm +++ b/Source/HBIOS/Config/MBC_std.asm @@ -42,11 +42,15 @@ RAMSIZE .SET 512 ; SIZE OF RAM IN KB (MUST MATCH YOUR HARDWARE!!!) ; MDFFENABLE .SET FALSE ; MD: ENABLE FLASH FILE SYSTEM ; -DSKYENABLE .SET FALSE ; ENABLES DSKY -DSKYMODE .SET DSKYMODE_NG ; DSKY VERSION: DSKYMODE_[V1|NG] +DSKYENABLE .SET TRUE ; ENABLES DSKY FUNCTIONALITY +ICMENABLE .SET FALSE ; ENABLES ORIGINAL DSKY ICM DRIVER (7218) +PKDENABLE .SET TRUE ; ENABLES DSKY NG PKD DRIVER (8259) ; UARTINTS .SET FALSE ; UART: INCLUDE INTERRUPT SUPPORT UNDER IM1/2/3 -;UARTCFG .SET UARTCFG | SER_RTS +; +ESPENABLE .SET TRUE ; ESP: ENABLE ESP32 IO BOARD DRIVER (ESP.ASM) +; +LPTENABLE .SET TRUE ; LPT: ENABLE CENTRONICS PRINTER DRIVER (LPT.ASM) ; CVDUMON .SET CVDUMON_CGA ; CVDU: CVDU MONITOR SETUP: CVDUMON_[NONE|CGA|EGA] ; diff --git a/Source/HBIOS/Config/MK4_std.asm b/Source/HBIOS/Config/MK4_std.asm index e3faf56b..a37a7f87 100644 --- a/Source/HBIOS/Config/MK4_std.asm +++ b/Source/HBIOS/Config/MK4_std.asm @@ -47,7 +47,7 @@ VGAENABLE .SET TRUE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM) VDAEMU_SERKBD .SET 0 ; VDA EMULATION: SERIAL KBD UNIT #, OR $FF FOR HW KBD ; FDENABLE .SET TRUE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM) -FDMODE .SET FDMODE_DIDE ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPWDC] +FDMODE .SET FDMODE_DIDE ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPFDC] ; IDEENABLE .SET TRUE ; IDE: ENABLE IDE DISK DRIVER (IDE.ASM) PPIDEENABLE .SET FALSE ; PPIDE: ENABLE PARALLEL PORT IDE DISK DRIVER (PPIDE.ASM) diff --git a/Source/HBIOS/Config/MON_std.asm b/Source/HBIOS/Config/MON_std.asm new file mode 100644 index 00000000..5a9ca047 --- /dev/null +++ b/Source/HBIOS/Config/MON_std.asm @@ -0,0 +1,30 @@ +; +;================================================================================================== +; MONSPUTER Z80 STANDARD CONFIGURATION +;================================================================================================== +; +; THE COMPLETE SET OF DEFAULT CONFIGURATION SETTINGS FOR THIS PLATFORM ARE FOUND IN THE +; CFG_.ASM INCLUDED FILE WHICH IS FOUND IN THE PARENT DIRECTORY. THIS FILE CONTAINS +; COMMON CONFIGURATION SETTINGS THAT OVERRIDE THE DEFAULTS. IT IS INTENDED THAT YOU MAKE +; YOUR CUSTOMIZATIONS IN THIS FILE AND JUST INHERIT ALL OTHER SETTINGS FROM THE DEFAULTS. +; EVEN BETTER, YOU CAN MAKE A COPY OF THIS FILE WITH A NAME LIKE _XXX.ASM AND SPECIFY +; YOUR FILE IN THE BUILD PROCESS. +; +; THE SETTINGS BELOW ARE THE SETTINGS THAT ARE MOST COMMONLY MODIFIED FOR THIS PLATFORM. +; MANY OF THEM ARE EQUAL TO THE SETTINGS IN THE INCLUDED FILE, SO THEY DON'T REALLY DO +; ANYTHING AS IS. THEY ARE LISTED HERE TO MAKE IT EASY FOR YOU TO ADJUST THE MOST COMMON +; SETTINGS. +; +; N.B., SINCE THE SETTINGS BELOW ARE REDEFINING VALUES ALREADY SET IN THE INCLUDED FILE, +; TASM INSISTS THAT YOU USE THE .SET OPERATOR AND NOT THE .EQU OPERATOR BELOW. ATTEMPTING +; TO REDEFINE A VALUE WITH .EQU BELOW WILL CAUSE TASM ERRORS! +; +; PLEASE REFER TO THE CUSTOM BUILD INSTRUCTIONS (README.TXT) IN THE SOURCE DIRECTORY (TWO +; DIRECTORIES ABOVE THIS ONE). +; +#DEFINE BOOT_DEFAULT "H" ; DEFAULT BOOT LOADER CMD ON OR AUTO BOOT +; +#include "cfg_mon.asm" +; +CPUOSC .SET 4000000 ; CPU OSC FREQ IN MHZ +CRTACT .SET FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP diff --git a/Source/HBIOS/Config/RCZ180_ext.asm b/Source/HBIOS/Config/RCZ180_ext.asm index 3e321620..25cad0e4 100644 --- a/Source/HBIOS/Config/RCZ180_ext.asm +++ b/Source/HBIOS/Config/RCZ180_ext.asm @@ -29,6 +29,9 @@ CPUOSC .SET 18432000 ; CPU OSC FREQ IN MHZ CRTACT .SET FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP ; +FPLED_ENABLE .SET TRUE ; FP: ENABLES FRONT PANEL LEDS +FPSW_ENABLE .SET TRUE ; FP: ENABLES FRONT PANEL SWITCHES +; MEMMGR .SET MM_Z2 ; MEMORY MANAGER: MM_[SBC|Z2|N8|Z180] ; Z180_CLKDIV .SET 1 ; Z180: CHK DIV: 0=OSC/2, 1=OSC, 2=OSC*2 @@ -46,6 +49,7 @@ SIOENABLE .SET TRUE ; SIO: ENABLE ZILOG SIO SERIAL DRIVER (SIO.ASM) TMSENABLE .SET FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM) TMSMODE .SET TMSMODE_MSX ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|MSX9958|MSXKBD|COLECO] MKYENABLE .SET FALSE ; MSX 5255 PPI KEYBOARD COMPATIBLE DRIVER (REQUIRES TMS VDA DRIVER) +VRCENABLE .SET FALSE ; VRC: ENABLE VGARC VIDEO/KBD DRIVER (VRC.ASM) VDAEMU_SERKBD .SET 0 ; VDA EMULATION: SERIAL KBD UNIT #, OR $FF FOR HW KBD ; ; @@ -54,7 +58,7 @@ AYMODE .SET AYMODE_RCZ180 ; AY: DRIVER MODE: AYMODE_[SCG|N8|RCZ80|RCZ180|MSX|LI SN76489ENABLE .SET FALSE ; SN: ENABLE SN76489 SOUND DRIVER ; FDENABLE .SET TRUE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM) -FDMODE .SET FDMODE_RCWDC ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPWDC] +FDMODE .SET FDMODE_RCWDC ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPFDC] ; IDEENABLE .SET TRUE ; IDE: ENABLE IDE DISK DRIVER (IDE.ASM) PPIDEENABLE .SET TRUE ; PPIDE: ENABLE PARALLEL PORT IDE DISK DRIVER (PPIDE.ASM) diff --git a/Source/HBIOS/Config/RCZ180_nat.asm b/Source/HBIOS/Config/RCZ180_nat.asm index edb084e0..4c682e3e 100644 --- a/Source/HBIOS/Config/RCZ180_nat.asm +++ b/Source/HBIOS/Config/RCZ180_nat.asm @@ -29,6 +29,9 @@ CPUOSC .SET 18432000 ; CPU OSC FREQ IN MHZ CRTACT .SET FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP ; +FPLED_ENABLE .SET TRUE ; FP: ENABLES FRONT PANEL LEDS +FPSW_ENABLE .SET TRUE ; FP: ENABLES FRONT PANEL SWITCHES +; MEMMGR .SET MM_Z180 ; MEMORY MANAGER: MM_[SBC|Z2|N8|Z180] ; Z180_CLKDIV .SET 1 ; Z180: CHK DIV: 0=OSC/2, 1=OSC, 2=OSC*2 @@ -46,15 +49,15 @@ SIOENABLE .SET TRUE ; SIO: ENABLE ZILOG SIO SERIAL DRIVER (SIO.ASM) TMSENABLE .SET FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM) TMSMODE .SET TMSMODE_MSX ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|MSX9958|MSXKBD|COLECO] MKYENABLE .SET FALSE ; MSX 5255 PPI KEYBOARD COMPATIBLE DRIVER (REQUIRES TMS VDA DRIVER) +VRCENABLE .SET FALSE ; VRC: ENABLE VGARC VIDEO/KBD DRIVER (VRC.ASM) VDAEMU_SERKBD .SET 0 ; VDA EMULATION: SERIAL KBD UNIT #, OR $FF FOR HW KBD ; -; AY38910ENABLE .SET FALSE ; AY: AY-3-8910 / YM2149 SOUND DRIVER AYMODE .SET AYMODE_RCZ180 ; AY: DRIVER MODE: AYMODE_[SCG|N8|RCZ80|RCZ180|MSX|LINC] SN76489ENABLE .SET FALSE ; SN: ENABLE SN76489 SOUND DRIVER ; FDENABLE .SET TRUE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM) -FDMODE .SET FDMODE_RCWDC ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPWDC] +FDMODE .SET FDMODE_RCWDC ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPFDC] ; IDEENABLE .SET TRUE ; IDE: ENABLE IDE DISK DRIVER (IDE.ASM) PPIDEENABLE .SET TRUE ; PPIDE: ENABLE PARALLEL PORT IDE DISK DRIVER (PPIDE.ASM) diff --git a/Source/HBIOS/Config/RCZ180_z1rcc.asm b/Source/HBIOS/Config/RCZ180_z1rcc.asm new file mode 100644 index 00000000..052792f6 --- /dev/null +++ b/Source/HBIOS/Config/RCZ180_z1rcc.asm @@ -0,0 +1,76 @@ +; +;================================================================================================== +; RCBUS Z180 Z1RCC CONFIGURATION (ROMLESS) +;================================================================================================== +; +; THE COMPLETE SET OF DEFAULT CONFIGURATION SETTINGS FOR THIS PLATFORM ARE FOUND IN THE +; CFG_.ASM INCLUDED FILE WHICH IS FOUND IN THE PARENT DIRECTORY. THIS FILE CONTAINS +; COMMON CONFIGURATION SETTINGS THAT OVERRIDE THE DEFAULTS. IT IS INTENDED THAT YOU MAKE +; YOUR CUSTOMIZATIONS IN THIS FILE AND JUST INHERIT ALL OTHER SETTINGS FROM THE DEFAULTS. +; EVEN BETTER, YOU CAN MAKE A COPY OF THIS FILE WITH A NAME LIKE _XXX.ASM AND SPECIFY +; YOUR FILE IN THE BUILD PROCESS. +; +; THE SETTINGS BELOW ARE THE SETTINGS THAT ARE MOST COMMONLY MODIFIED FOR THIS PLATFORM. +; MANY OF THEM ARE EQUAL TO THE SETTINGS IN THE INCLUDED FILE, SO THEY DON'T REALLY DO +; ANYTHING AS IS. THEY ARE LISTED HERE TO MAKE IT EASY FOR YOU TO ADJUST THE MOST COMMON +; SETTINGS. +; +; N.B., SINCE THE SETTINGS BELOW ARE REDEFINING VALUES ALREADY SET IN THE INCLUDED FILE, +; TASM INSISTS THAT YOU USE THE .SET OPERATOR AND NOT THE .EQU OPERATOR BELOW. ATTEMPTING +; TO REDEFINE A VALUE WITH .EQU BELOW WILL CAUSE TASM ERRORS! +; +; PLEASE REFER TO THE CUSTOM BUILD INSTRUCTIONS (README.TXT) IN THE SOURCE DIRECTORY (TWO +; DIRECTORIES ABOVE THIS ONE). +; +#DEFINE PLATFORM_NAME "Z1RCC", " [", CONFIG, "]" +; +#DEFINE BOOT_DEFAULT "H" ; DEFAULT BOOT LOADER CMD ON OR AUTO BOOT +; +#include "cfg_rcz180.asm" +; +CPUOSC .SET 18432000 ; CPU OSC FREQ IN MHZ +CRTACT .SET FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP +; +FPLED_ENABLE .SET TRUE ; FP: ENABLES FRONT PANEL LEDS +FPSW_ENABLE .SET TRUE ; FP: ENABLES FRONT PANEL SWITCHES +; +MEMMGR .SET MM_Z180 ; MEMORY MANAGER: MM_[SBC|Z2|N8|Z180] +; +RAMSIZE .SET 512 ; SIZE OF RAM IN KB (MUST MATCH YOUR HARDWARE!!!) +ROMSIZE .SET 0 ; SIZE OF ROM IN KB (MUST MATCH YOUR HARDWARE!!!) +; +Z180_CLKDIV .SET 1 ; Z180: CHK DIV: 0=OSC/2, 1=OSC, 2=OSC*2 +Z180_MEMWAIT .SET 0 ; Z180: MEMORY WAIT STATES (0-3) +Z180_IOWAIT .SET 1 ; Z180: I/O WAIT STATES TO ADD ABOVE 1 W/S BUILT-IN (0-3) +; +MDROM .SET FALSE ; MD: ENABLE ROM DISK +MDRAM .SET TRUE ; MD: ENABLE RAM DISK +; +DSRTCENABLE .SET TRUE ; DSRTC: ENABLE DS-1302 CLOCK DRIVER (DSRTC.ASM) +INTRTCENABLE .SET TRUE ; ENABLE PERIODIC INTERRUPT CLOCK DRIVER (INTRTC.ASM) +; +UARTENABLE .SET TRUE ; UART: ENABLE 8250/16550-LIKE SERIAL DRIVER (UART.ASM) +ASCIENABLE .SET TRUE ; ASCI: ENABLE Z180 ASCI SERIAL DRIVER (ASCI.ASM) +ACIAENABLE .SET FALSE ; ACIA: ENABLE MOTOROLA 6850 ACIA DRIVER (ACIA.ASM) +SIOENABLE .SET TRUE ; SIO: ENABLE ZILOG SIO SERIAL DRIVER (SIO.ASM) +; +TMSENABLE .SET FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM) +TMSMODE .SET TMSMODE_MSX ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|MSX9958|MSXKBD|COLECO] +MKYENABLE .SET FALSE ; MSX 5255 PPI KEYBOARD COMPATIBLE DRIVER (REQUIRES TMS VDA DRIVER) +VRCENABLE .SET FALSE ; VRC: ENABLE VGARC VIDEO/KBD DRIVER (VRC.ASM) +VDAEMU_SERKBD .SET 0 ; VDA EMULATION: SERIAL KBD UNIT #, OR $FF FOR HW KBD +; +; +AY38910ENABLE .SET FALSE ; AY: AY-3-8910 / YM2149 SOUND DRIVER +AYMODE .SET AYMODE_RCZ180 ; AY: DRIVER MODE: AYMODE_[SCG|N8|RCZ80|RCZ180|MSX|LINC] +SN76489ENABLE .SET FALSE ; SN: ENABLE SN76489 SOUND DRIVER +; +FDENABLE .SET TRUE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM) +FDMODE .SET FDMODE_RCWDC ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPFDC] +; +IDEENABLE .SET TRUE ; IDE: ENABLE IDE DISK DRIVER (IDE.ASM) +PPIDEENABLE .SET TRUE ; PPIDE: ENABLE PARALLEL PORT IDE DISK DRIVER (PPIDE.ASM) +SDENABLE .SET FALSE ; SD: ENABLE SD CARD DISK DRIVER (SD.ASM) +SDCNT .SET 1 ; SD: NUMBER OF SD CARD DEVICES (1-2), FOR DSD/SC/MT SC ONLY +; +PRPENABLE .SET FALSE ; PRP: ENABLE ECB PROPELLER IO BOARD DRIVER (PRP.ASM) diff --git a/Source/HBIOS/Config/RCZ280_ext.asm b/Source/HBIOS/Config/RCZ280_ext.asm index a7574e8b..f2840178 100644 --- a/Source/HBIOS/Config/RCZ280_ext.asm +++ b/Source/HBIOS/Config/RCZ280_ext.asm @@ -26,10 +26,13 @@ ; #include "cfg_rcz280.asm" ; -CPUOSC .SET 12000000 ; CPU OSC FREQ IN MHZ +CPUOSC .SET 24000000 ; CPU OSC FREQ IN MHZ INTMODE .SET 1 ; INTERRUPTS: 0=NONE, 1=MODE 1, 2=MODE 2 CRTACT .SET FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP ; +FPLED_ENABLE .SET TRUE ; FP: ENABLES FRONT PANEL LEDS +FPSW_ENABLE .SET TRUE ; FP: ENABLES FRONT PANEL SWITCHES +; MEMMGR .SET MM_Z2 ; MEMORY MANAGER: MM_[SBC|Z2|N8|Z180] ; Z280_MEMLOWAIT .SET 0 ; Z280: LOW 8MB MEMORY WAIT STATES (0-3) @@ -45,6 +48,7 @@ SIOENABLE .SET TRUE ; SIO: ENABLE ZILOG SIO SERIAL DRIVER (SIO.ASM) TMSENABLE .SET FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM) TMSMODE .SET TMSMODE_MSX ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|MSX9958|MSXKBD|COLECO] MKYENABLE .SET FALSE ; MSX 5255 PPI KEYBOARD COMPATIBLE DRIVER (REQUIRES TMS VDA DRIVER) +VRCENABLE .SET FALSE ; VRC: ENABLE VGARC VIDEO/KBD DRIVER (VRC.ASM) VDAEMU_SERKBD .SET 0 ; VDA EMULATION: SERIAL KBD UNIT #, OR $FF FOR HW KBD ; AY38910ENABLE .SET FALSE ; AY: AY-3-8910 / YM2149 SOUND DRIVER @@ -52,7 +56,7 @@ AYMODE .SET AYMODE_RCZ80 ; AY: DRIVER MODE: AYMODE_[SCG|N8|RCZ80|RCZ180|MSX|LIN SN76489ENABLE .SET FALSE ; SN: ENABLE SN76489 SOUND DRIVER ; FDENABLE .SET TRUE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM) -FDMODE .SET FDMODE_RCWDC ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPWDC] +FDMODE .SET FDMODE_RCWDC ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPFDC] ; IDEENABLE .SET TRUE ; IDE: ENABLE IDE DISK DRIVER (IDE.ASM) PPIDEENABLE .SET TRUE ; PPIDE: ENABLE PARALLEL PORT IDE DISK DRIVER (PPIDE.ASM) diff --git a/Source/HBIOS/Config/RCZ280_nat.asm b/Source/HBIOS/Config/RCZ280_nat.asm index 415b925d..1dfe55b6 100644 --- a/Source/HBIOS/Config/RCZ280_nat.asm +++ b/Source/HBIOS/Config/RCZ280_nat.asm @@ -26,10 +26,13 @@ ; #include "cfg_rcz280.asm" ; -CPUOSC .SET 12000000 ; CPU OSC FREQ IN MHZ +CPUOSC .SET 24000000 ; CPU OSC FREQ IN MHZ INTMODE .SET 3 ; INTERRUPTS: 0=NONE, 1=MODE 1, 2=MODE 2 CRTACT .SET FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP ; +FPLED_ENABLE .SET TRUE ; FP: ENABLES FRONT PANEL LEDS +FPSW_ENABLE .SET TRUE ; FP: ENABLES FRONT PANEL SWITCHES +; MEMMGR .SET MM_Z280 ; MEMORY MANAGER: MM_[SBC|Z2|N8|Z180|Z280] ; Z280_MEMLOWAIT .SET 0 ; Z280: LOW 8MB MEMORY WAIT STATES (0-3) @@ -45,6 +48,7 @@ SIOENABLE .SET TRUE ; SIO: ENABLE ZILOG SIO SERIAL DRIVER (SIO.ASM) TMSENABLE .SET FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM) TMSMODE .SET TMSMODE_MSX ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|MSX9958|MSXKBD|COLECO] MKYENABLE .SET FALSE ; MSX 5255 PPI KEYBOARD COMPATIBLE DRIVER (REQUIRES TMS VDA DRIVER) +VRCENABLE .SET FALSE ; VRC: ENABLE VGARC VIDEO/KBD DRIVER (VRC.ASM) VDAEMU_SERKBD .SET 0 ; VDA EMULATION: SERIAL KBD UNIT #, OR $FF FOR HW KBD ; AY38910ENABLE .SET FALSE ; AY: AY-3-8910 / YM2149 SOUND DRIVER @@ -52,7 +56,7 @@ AYMODE .SET AYMODE_RCZ80 ; AY: DRIVER MODE: AYMODE_[SCG|N8|RCZ80|RCZ180|MSX|LIN SN76489ENABLE .SET FALSE ; SN: ENABLE SN76489 SOUND DRIVER ; FDENABLE .SET TRUE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM) -FDMODE .SET FDMODE_RCWDC ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPWDC] +FDMODE .SET FDMODE_RCWDC ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPFDC] ; IDEENABLE .SET TRUE ; IDE: ENABLE IDE DISK DRIVER (IDE.ASM) PPIDEENABLE .SET TRUE ; PPIDE: ENABLE PARALLEL PORT IDE DISK DRIVER (PPIDE.ASM) diff --git a/Source/HBIOS/Config/RCZ280_zz80mb.asm b/Source/HBIOS/Config/RCZ280_zz80mb.asm index 82129e2b..66ff739e 100644 --- a/Source/HBIOS/Config/RCZ280_zz80mb.asm +++ b/Source/HBIOS/Config/RCZ280_zz80mb.asm @@ -28,14 +28,16 @@ ; #include "cfg_rcz280.asm" ; -CPUOSC .SET 12000000 ; CPU OSC FREQ IN MHZ +CPUOSC .SET 24000000 ; CPU OSC FREQ IN MHZ INTMODE .SET 3 ; INTERRUPTS: 0=NONE, 1=MODE 1, 2=MODE 2 CRTACT .SET FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP ; +FPLED_ENABLE .SET TRUE ; FP: ENABLES FRONT PANEL LEDS +FPSW_ENABLE .SET TRUE ; FP: ENABLES FRONT PANEL SWITCHES +; MEMMGR .SET MM_Z280 ; MEMORY MANAGER: MM_[SBC|Z2|N8|Z180|Z280] ; -RAMLOC .SET 23 ; START OF RAM AS POWER OF 2 (2^N) IN PHYSICAL ADDRESS SPACE -RAMBIAS .SET (1 << (RAMLOC - 10)) ; OFFSET OF START OF RAM IN PHYSICAL ADDRESS SPACE +RAMBIAS .SET 8192 ; OFFSET OF START OF RAM IN PHYSICAL ADDRESS SPACE ; Z280_MEMLOWAIT .SET 0 ; Z280: LOW 8MB MEMORY WAIT STATES (0-3) Z280_MEMHIWAIT .SET 0 ; Z280: HIGH 8MB MEMORY WAIT STATES (0-3) @@ -51,14 +53,15 @@ SIOENABLE .SET TRUE ; SIO: ENABLE ZILOG SIO SERIAL DRIVER (SIO.ASM) TMSENABLE .SET FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM) TMSMODE .SET TMSMODE_MSX ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|MSX9958|MSXKBD|COLECO] MKYENABLE .SET FALSE ; MSX 5255 PPI KEYBOARD COMPATIBLE DRIVER (REQUIRES TMS VDA DRIVER) -VDAEMU_SERKBD .SET 0 ; VDA EMULATION: SERIAL KBD UNIT #, OR $FF FOR HW KBD +VRCENABLE .SET TRUE ; VRC: ENABLE VGARC VIDEO/KBD DRIVER (VRC.ASM) +VDAEMU_SERKBD .SET $FF ; VDA EMULATION: SERIAL KBD UNIT #, OR $FF FOR HW KBD ; AY38910ENABLE .SET FALSE ; AY: AY-3-8910 / YM2149 SOUND DRIVER AYMODE .SET AYMODE_RCZ80 ; AY: DRIVER MODE: AYMODE_[SCG|N8|RCZ80|RCZ180|MSX|LINC] SN76489ENABLE .SET FALSE ; SN: ENABLE SN76489 SOUND DRIVER ; FDENABLE .SET TRUE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM) -FDMODE .SET FDMODE_RCWDC ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPWDC] +FDMODE .SET FDMODE_RCWDC ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPFDC] ; IDEENABLE .SET TRUE ; IDE: ENABLE IDE DISK DRIVER (IDE.ASM) PPIDEENABLE .SET TRUE ; PPIDE: ENABLE PARALLEL PORT IDE DISK DRIVER (PPIDE.ASM) diff --git a/Source/HBIOS/Config/RCZ280_zzrc.asm b/Source/HBIOS/Config/RCZ280_zzrcc.asm similarity index 83% rename from Source/HBIOS/Config/RCZ280_zzrc.asm rename to Source/HBIOS/Config/RCZ280_zzrcc.asm index c173c1bb..7f79d840 100644 --- a/Source/HBIOS/Config/RCZ280_zzrc.asm +++ b/Source/HBIOS/Config/RCZ280_zzrcc.asm @@ -1,6 +1,6 @@ ; ;================================================================================================== -; RCBUS Z280 STANDARD CONFIGURATION (NATIVE Z280 MMU W/ LINEAR MEMORY ON ZZRC) +; RCBUS Z280 ZZRCC CONFIGURATION ;================================================================================================== ; ; THE COMPLETE SET OF DEFAULT CONFIGURATION SETTINGS FOR THIS PLATFORM ARE FOUND IN THE @@ -22,24 +22,24 @@ ; PLEASE REFER TO THE CUSTOM BUILD INSTRUCTIONS (README.TXT) IN THE SOURCE DIRECTORY (TWO ; DIRECTORIES ABOVE THIS ONE). ; -#DEFINE PLATFORM_NAME "ZZRC", " [", CONFIG, "]" +#DEFINE PLATFORM_NAME "ZZRCC", " [", CONFIG, "]" ; #DEFINE BOOT_DEFAULT "H" ; DEFAULT BOOT LOADER CMD ON OR AUTO BOOT ; #include "cfg_rcz280.asm" ; -CPUOSC .SET 14745600 ; CPU OSC FREQ IN MHZ +CPUOSC .SET 29491200 ; CPU OSC FREQ IN MHZ INTMODE .SET 3 ; INTERRUPTS: 0=NONE, 1=MODE 1, 2=MODE 2 CRTACT .SET FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP ; +FPLED_ENABLE .SET TRUE ; FP: ENABLES FRONT PANEL LEDS +FPSW_ENABLE .SET TRUE ; FP: ENABLES FRONT PANEL SWITCHES +; MEMMGR .SET MM_Z280 ; MEMORY MANAGER: MM_[SBC|Z2|N8|Z180|Z280] ; RAMSIZE .SET 256 ; SIZE OF RAM IN KB (MUST MATCH YOUR HARDWARE!!!) ROMSIZE .SET 256 ; SIZE OF ROM IN KB (MUST MATCH YOUR HARDWARE!!!) -ROMSIZE_CHK .SET 256 ; ROMSIZE VALUE VERIFICATION (0=DISABLED) -; -RAMLOC .SET 18 ; START OF RAM AS POWER OF 2 (2^N) IN PHYSICAL ADDRESS SPACE -RAMBIAS .SET (1 << (RAMLOC - 10)) ; OFFSET OF START OF RAM IN PHYSICAL ADDRESS SPACE +RAMBIAS .SET ROMSIZE ; OFFSET OF START OF RAM IN PHYSICAL ADDRESS SPACE ; Z280_MEMLOWAIT .SET 0 ; Z280: LOW 8MB MEMORY WAIT STATES (0-3) Z280_MEMHIWAIT .SET 0 ; Z280: HIGH 8MB MEMORY WAIT STATES (0-3) @@ -47,10 +47,10 @@ Z280_IOWAIT .SET 1 ; Z280: I/O WAIT STATES TO ADD ABOVE 1 W/S BUILT-IN (0-3) Z280_INTWAIT .SET 0 ; Z280: INT ACK WAIT STATUS (0-3) ; MDROM .SET TRUE ; MD: ENABLE ROM DISK -MDRAM .SET FALSE ; MD: ENABLE RAM DISK +MDRAM .SET TRUE ; MD: ENABLE RAM DISK ; Z2UENABLE .SET TRUE ; Z2U: ENABLE Z280 UART SERIAL DRIVER (Z2U.ASM) -Z2UOSC .SET (CPUOSC / 8) ; Z2U: OSC FREQUENCY IN MHZ +Z2UOSC .SET (CPUOSC / 16) ; Z2U: OSC FREQUENCY IN MHZ Z2U0HFC .SET TRUE ; Z2U0: ENABLE HARDWARE FLOW CONTROL UARTENABLE .SET TRUE ; UART: ENABLE 8250/16550-LIKE SERIAL DRIVER (UART.ASM) ACIAENABLE .SET FALSE ; ACIA: ENABLE MOTOROLA 6850 ACIA DRIVER (ACIA.ASM) @@ -59,14 +59,15 @@ SIOENABLE .SET TRUE ; SIO: ENABLE ZILOG SIO SERIAL DRIVER (SIO.ASM) TMSENABLE .SET FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM) TMSMODE .SET TMSMODE_MSX ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|MSX9958|MSXKBD|COLECO] MKYENABLE .SET FALSE ; MSX 5255 PPI KEYBOARD COMPATIBLE DRIVER (REQUIRES TMS VDA DRIVER) -VDAEMU_SERKBD .SET 0 ; VDA EMULATION: SERIAL KBD UNIT #, OR $FF FOR HW KBD +VRCENABLE .SET TRUE ; VRC: ENABLE VGARC VIDEO/KBD DRIVER (VRC.ASM) +VDAEMU_SERKBD .SET $FF ; VDA EMULATION: SERIAL KBD UNIT #, OR $FF FOR HW KBD ; AY38910ENABLE .SET FALSE ; AY: AY-3-8910 / YM2149 SOUND DRIVER AYMODE .SET AYMODE_RCZ80 ; AY: DRIVER MODE: AYMODE_[SCG|N8|RCZ80|RCZ180|MSX|LINC] SN76489ENABLE .SET FALSE ; SN: ENABLE SN76489 SOUND DRIVER ; FDENABLE .SET TRUE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM) -FDMODE .SET FDMODE_RCWDC ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPWDC] +FDMODE .SET FDMODE_RCWDC ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPFDC] ; IDEENABLE .SET TRUE ; IDE: ENABLE IDE DISK DRIVER (IDE.ASM) PPIDEENABLE .SET TRUE ; PPIDE: ENABLE PARALLEL PORT IDE DISK DRIVER (PPIDE.ASM) diff --git a/Source/HBIOS/Config/RCZ280_zzrcc_ram.asm b/Source/HBIOS/Config/RCZ280_zzrcc_ram.asm new file mode 100644 index 00000000..703fbc21 --- /dev/null +++ b/Source/HBIOS/Config/RCZ280_zzrcc_ram.asm @@ -0,0 +1,77 @@ +; +;================================================================================================== +; RCBUS Z280 ZZRCC CONFIGURATION (ROMLESS) +;================================================================================================== +; +; THE COMPLETE SET OF DEFAULT CONFIGURATION SETTINGS FOR THIS PLATFORM ARE FOUND IN THE +; CFG_.ASM INCLUDED FILE WHICH IS FOUND IN THE PARENT DIRECTORY. THIS FILE CONTAINS +; COMMON CONFIGURATION SETTINGS THAT OVERRIDE THE DEFAULTS. IT IS INTENDED THAT YOU MAKE +; YOUR CUSTOMIZATIONS IN THIS FILE AND JUST INHERIT ALL OTHER SETTINGS FROM THE DEFAULTS. +; EVEN BETTER, YOU CAN MAKE A COPY OF THIS FILE WITH A NAME LIKE _XXX.ASM AND SPECIFY +; YOUR FILE IN THE BUILD PROCESS. +; +; THE SETTINGS BELOW ARE THE SETTINGS THAT ARE MOST COMMONLY MODIFIED FOR THIS PLATFORM. +; MANY OF THEM ARE EQUAL TO THE SETTINGS IN THE INCLUDED FILE, SO THEY DON'T REALLY DO +; ANYTHING AS IS. THEY ARE LISTED HERE TO MAKE IT EASY FOR YOU TO ADJUST THE MOST COMMON +; SETTINGS. +; +; N.B., SINCE THE SETTINGS BELOW ARE REDEFINING VALUES ALREADY SET IN THE INCLUDED FILE, +; TASM INSISTS THAT YOU USE THE .SET OPERATOR AND NOT THE .EQU OPERATOR BELOW. ATTEMPTING +; TO REDEFINE A VALUE WITH .EQU BELOW WILL CAUSE TASM ERRORS! +; +; PLEASE REFER TO THE CUSTOM BUILD INSTRUCTIONS (README.TXT) IN THE SOURCE DIRECTORY (TWO +; DIRECTORIES ABOVE THIS ONE). +; +#DEFINE PLATFORM_NAME "ZZRCC", " [", CONFIG, "]" +; +#DEFINE BOOT_DEFAULT "H" ; DEFAULT BOOT LOADER CMD ON OR AUTO BOOT +; +#include "cfg_rcz280.asm" +; +CPUOSC .SET 29491200 ; CPU OSC FREQ IN MHZ +INTMODE .SET 3 ; INTERRUPTS: 0=NONE, 1=MODE 1, 2=MODE 2 +CRTACT .SET FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP +; +FPLED_ENABLE .SET TRUE ; FP: ENABLES FRONT PANEL LEDS +FPSW_ENABLE .SET TRUE ; FP: ENABLES FRONT PANEL SWITCHES +; +MEMMGR .SET MM_Z280 ; MEMORY MANAGER: MM_[SBC|Z2|N8|Z180|Z280] +; +RAMSIZE .SET 512 ; SIZE OF RAM IN KB (MUST MATCH YOUR HARDWARE!!!) +ROMSIZE .SET 0 ; SIZE OF ROM IN KB (MUST MATCH YOUR HARDWARE!!!) +RAMBIAS .SET ROMSIZE ; OFFSET OF START OF RAM IN PHYSICAL ADDRESS SPACE +; +Z280_MEMLOWAIT .SET 0 ; Z280: LOW 8MB MEMORY WAIT STATES (0-3) +Z280_MEMHIWAIT .SET 0 ; Z280: HIGH 8MB MEMORY WAIT STATES (0-3) +Z280_IOWAIT .SET 1 ; Z280: I/O WAIT STATES TO ADD ABOVE 1 W/S BUILT-IN (0-3) +Z280_INTWAIT .SET 0 ; Z280: INT ACK WAIT STATUS (0-3) +; +MDROM .SET FALSE ; MD: ENABLE ROM DISK +MDRAM .SET TRUE ; MD: ENABLE RAM DISK +; +Z2UENABLE .SET TRUE ; Z2U: ENABLE Z280 UART SERIAL DRIVER (Z2U.ASM) +Z2UOSC .SET (CPUOSC / 16) ; Z2U: OSC FREQUENCY IN MHZ +Z2U0HFC .SET TRUE ; Z2U0: ENABLE HARDWARE FLOW CONTROL +UARTENABLE .SET TRUE ; UART: ENABLE 8250/16550-LIKE SERIAL DRIVER (UART.ASM) +ACIAENABLE .SET FALSE ; ACIA: ENABLE MOTOROLA 6850 ACIA DRIVER (ACIA.ASM) +SIOENABLE .SET TRUE ; SIO: ENABLE ZILOG SIO SERIAL DRIVER (SIO.ASM) +; +TMSENABLE .SET FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM) +TMSMODE .SET TMSMODE_MSX ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|MSX9958|MSXKBD|COLECO] +MKYENABLE .SET FALSE ; MSX 5255 PPI KEYBOARD COMPATIBLE DRIVER (REQUIRES TMS VDA DRIVER) +VRCENABLE .SET TRUE ; VRC: ENABLE VGARC VIDEO/KBD DRIVER (VRC.ASM) +VDAEMU_SERKBD .SET $FF ; VDA EMULATION: SERIAL KBD UNIT #, OR $FF FOR HW KBD +; +AY38910ENABLE .SET FALSE ; AY: AY-3-8910 / YM2149 SOUND DRIVER +AYMODE .SET AYMODE_RCZ80 ; AY: DRIVER MODE: AYMODE_[SCG|N8|RCZ80|RCZ180|MSX|LINC] +SN76489ENABLE .SET FALSE ; SN: ENABLE SN76489 SOUND DRIVER +; +FDENABLE .SET TRUE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM) +FDMODE .SET FDMODE_RCWDC ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPFDC] +; +IDEENABLE .SET TRUE ; IDE: ENABLE IDE DISK DRIVER (IDE.ASM) +PPIDEENABLE .SET TRUE ; PPIDE: ENABLE PARALLEL PORT IDE DISK DRIVER (PPIDE.ASM) +SDENABLE .SET FALSE ; SD: ENABLE SD CARD DISK DRIVER (SD.ASM) +SDCNT .SET 1 ; SD: NUMBER OF SD CARD DEVICES (1-2), FOR DSD/SC/MT SC ONLY +; +PRPENABLE .SET FALSE ; PRP: ENABLE ECB PROPELLER IO BOARD DRIVER (PRP.ASM) diff --git a/Source/HBIOS/Config/RCZ80_easy.asm b/Source/HBIOS/Config/RCZ80_easy.asm index dd6f0312..d59154ca 100644 --- a/Source/HBIOS/Config/RCZ80_easy.asm +++ b/Source/HBIOS/Config/RCZ80_easy.asm @@ -33,13 +33,15 @@ CPUOSC .SET 10000000 ; CPU OSC FREQ IN MHZ CRTACT .SET FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP INTMODE .SET 2 ; INTERRUPTS: 0=NONE, 1=MODE 1, 2=MODE 2, 3=MODE 3 (Z280) ; +FPLED_ENABLE .SET TRUE ; FP: ENABLES FRONT PANEL LEDS +FPSW_ENABLE .SET TRUE ; FP: ENABLES FRONT PANEL SWITCHES +; WDOGMODE .SET WDOG_EZZ80 ; WATCHDOG MODE: WDOG_[NONE|EZZ80|SKZ] WDOGIO .SET $6F ; WATCHDOG REGISTER ADR ; -DIAGENABLE .SET FALSE ; ENABLES OUTPUT TO 8 BIT LED DIAGNOSTIC PORT -; DSRTCENABLE .SET TRUE ; DSRTC: ENABLE DS-1302 CLOCK DRIVER (DSRTC.ASM) RP5RTCENABLE .SET FALSE ; RP5C01 RTC BASED CLOCK (RP5RTC.ASM) +INTRTCENABLE .SET TRUE ; ENABLE PERIODIC INTERRUPT CLOCK DRIVER (INTRTC.ASM) ; CTCENABLE .SET TRUE ; ENABLE ZILOG CTC SUPPORT CTCTIMER .SET TRUE ; ENABLE CTC PERIODIC TIMER @@ -60,6 +62,7 @@ TMSENABLE .SET FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM) TMSTIMENABLE .SET FALSE ; TMS: ENABLE TIMER INTERRUPTS (REQUIRES IM1) TMSMODE .SET TMSMODE_MSX ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|MSX9958|MSXKBD|COLECO] MKYENABLE .SET FALSE ; MSX 5255 PPI KEYBOARD COMPATIBLE DRIVER (REQUIRES TMS VDA DRIVER) +VRCENABLE .SET FALSE ; VRC: ENABLE VGARC VIDEO/KBD DRIVER (VRC.ASM) VDAEMU_SERKBD .SET 0 ; VDA EMULATION: SERIAL KBD UNIT #, OR $FF FOR HW KBD ; AY38910ENABLE .SET FALSE ; AY: AY-3-8910 / YM2149 SOUND DRIVER @@ -67,11 +70,12 @@ AYMODE .SET AYMODE_RCZ80 ; AY: DRIVER MODE: AYMODE_[SCG|N8|RCZ80|RCZ180|MSX|LIN SN76489ENABLE .SET FALSE ; SN: ENABLE SN76489 SOUND DRIVER ; FDENABLE .SET TRUE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM) -FDMODE .SET FDMODE_RCWDC ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPWDC] +FDMODE .SET FDMODE_RCWDC ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPFDC] ; IDEENABLE .SET TRUE ; IDE: ENABLE IDE DISK DRIVER (IDE.ASM) PPIDEENABLE .SET TRUE ; PPIDE: ENABLE PARALLEL PORT IDE DISK DRIVER (PPIDE.ASM) SDENABLE .SET FALSE ; SD: ENABLE SD CARD DISK DRIVER (SD.ASM) SDCNT .SET 1 ; SD: NUMBER OF SD CARD DEVICES (1-2), FOR DSD/SC/MT SC ONLY +IMMENABLE .SET FALSE ; IMM: ENABLE IMM DISK DRIVER (IMM.ASM) ; PRPENABLE .SET FALSE ; PRP: ENABLE ECB PROPELLER IO BOARD DRIVER (PRP.ASM) diff --git a/Source/HBIOS/Config/RCZ80_jbl.asm b/Source/HBIOS/Config/RCZ80_jbl.asm new file mode 100644 index 00000000..b72f6076 --- /dev/null +++ b/Source/HBIOS/Config/RCZ80_jbl.asm @@ -0,0 +1,79 @@ +; +;================================================================================================== +; RCBUS Z80 COLECOVISION-COMPATIBLE CONFIGURATION FOR J.B. LANGSTON'S GAME BOARDS +;================================================================================================== +; +; THIS CONFIGURATION ENABLES DRIVERS FOR THE TMS9918 AND SN76489 BOARDS BY J.B. LANGSTON +; AND THE YM2149 BOARD BY ED BRINDLEY. THE TMS9918 IS CONFIGURED TO USE THE COLECOVISION +; PORTS AND HAS INTERRUPTS DISABLED BECAUSE COLECOVISION USES NMI, WHICH WOULD BREAK CP/M +; WHEN ENABLED. IT IS CONFIGURED FOR A 3.686MHZ CPU CLOCK IN ORDER TO BE COMPATIBLE WITH +; COLECOVISION GAMES. THE FIRST SIO PORT IS CONFIGURED TO RUN AT 115200 BPS WITH THE CPU +; RUNNING AT THIS SPEED. THE SECOND SIO PORT IS CONFIGURED TO RUN AT 115200 BPS WITH THE +; SECOND CLOCK SET TO 7.373MHZ. LOWER BAUD RATES CAN BE ACHIEVED ON THE SECOND PORT BY +; MOVING THE SECONDARY CLOCK DIVIDER JUMPER (E.G., 38400 @ 2.458MHZ). THE BAUD RATE DOES +; NOT NEED TO BE CHANGED IN THIS CONFIGURATION FILE IN ORDER TO DO THIS, BUT THE DEVICE +; LIST WILL INCORRECTLY SHOW THE PORT RUNNING AT 115200 REGARDLESS OF THE CLOCK DIVIDER. +; UNCOMMENT THE LINE THAT SETS BOOTCON TO 1 TO BOOT ON THE SECOND SIO PORT BY DEFAULT. +; +; THE COMPLETE SET OF DEFAULT CONFIGURATION SETTINGS FOR THIS PLATFORM ARE FOUND IN THE +; CFG_.ASM INCLUDED FILE WHICH IS FOUND IN THE PARENT DIRECTORY. THIS FILE CONTAINS +; COMMON CONFIGURATION SETTINGS THAT OVERRIDE THE DEFAULTS. IT IS INTENDED THAT YOU MAKE +; YOUR CUSTOMIZATIONS IN THIS FILE AND JUST INHERIT ALL OTHER SETTINGS FROM THE DEFAULTS. +; EVEN BETTER, YOU CAN MAKE A COPY OF THIS FILE WITH A NAME LIKE _XXX.ASM AND SPECIFY +; YOUR FILE IN THE BUILD PROCESS. +; +; N.B., SINCE THE SETTINGS BELOW ARE REDEFINING VALUES ALREADY SET IN THE INCLUDED FILE, +; TASM INSISTS THAT YOU USE THE .SET OPERATOR AND NOT THE .EQU OPERATOR BELOW. ATTEMPTING +; TO REDEFINE A VALUE WITH .EQU BELOW WILL CAUSE TASM ERRORS! +; +; PLEASE REFER TO THE CUSTOM BUILD INSTRUCTIONS (README.TXT) IN THE SOURCE DIRECTORY (TWO +; DIRECTORIES ABOVE THIS ONE). +; +#DEFINE BOOT_DEFAULT "Z" ; DEFAULT BOOT LOADER CMD ON OR AUTO BOOT +; +#include "cfg_rcz80.asm" +; +CPUOSC .SET 3686400 ; CPU OSC FREQ IN MHZ +CRTACT .SET FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP +;BOOTCON .SET 1 ; BOOT CONSOLE DEVICE +; +DSRTCENABLE .SET TRUE ; DSRTC: ENABLE DS-1302 CLOCK DRIVER (DSRTC.ASM) +RP5RTCENABLE .SET FALSE ; RP5C01 RTC BASED CLOCK (RP5RTC.ASM) +; +UARTENABLE .SET FALSE ; UART: ENABLE 8250/16550-LIKE SERIAL DRIVER (UART.ASM) +ACIAENABLE .SET FALSE ; ACIA: ENABLE MOTOROLA 6850 ACIA DRIVER (ACIA.ASM) +SIOENABLE .SET TRUE ; SIO: ENABLE ZILOG SIO SERIAL DRIVER (SIO.ASM) +DUARTENABLE .SET FALSE ; DUART: ENABLE 2681/2692 SERIAL DRIVER (DUART.ASM) +; +SIOENABLE .SET TRUE ; SIO: ENABLE ZILOG SIO SERIAL DRIVER (SIO.ASM) +SIODEBUG .SET FALSE ; SIO: ENABLE DEBUG OUTPUT +SIOBOOT .SET 0 ; SIO: REBOOT ON RCV CHAR (0=DISABLED) +SIOCNT .SET 1 ; SIO: NUMBER OF CHIPS TO DETECT (1-2), 2 CHANNELS PER CHIP +SIO0MODE .SET SIOMODE_RC ; SIO 0: CHIP TYPE: SIOMODE_[STD|RC|SMB|ZP] +SIO0BASE .SET $80 ; SIO 0: REGISTERS BASE ADR +SIO0ACLK .SET CPUOSC ; SIO 0A: OSC FREQ IN HZ, ZP=2457600/4915200, RC/SMB=7372800 +SIO0ACFG .SET SER_115200_8N1 ; SIO 0A: SERIAL LINE CONFIG +SIO0ACTCC .SET -1 ; SIO 0A: CTC CHANNEL 0=A, 1=B, 2=C, 3=D, -1 FOR NONE +SIO0BCLK .SET 7372800 ; SIO 0B: OSC FREQ IN HZ, ZP=2457600/4915200, RC/SMB=7372800 +SIO0BCFG .SET SER_115200_8N1 ; SIO 0B: SERIAL LINE CONFIG +SIO0BCTCC .SET -1 ; SIO 0B: CTC CHANNEL 0=A, 1=B, 2=C, 3=D, -1 FOR NONE +; +TMSENABLE .SET TRUE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM) +TMSTIMENABLE .SET FALSE ; TMS: ENABLE TIMER INTERRUPTS (REQUIRES IM1) +TMSMODE .SET TMSMODE_COLECO ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|MSX9958|MSXKBD|COLECO] +MKYENABLE .SET FALSE ; MSX 5255 PPI KEYBOARD COMPATIBLE DRIVER (REQUIRES TMS VDA DRIVER) +VDAEMU_SERKBD .SET 1 ; VDA EMULATION: SERIAL KBD UNIT #, OR $FF FOR HW KBD +; +AY38910ENABLE .SET TRUE ; AY: AY-3-8910 / YM2149 SOUND DRIVER +AYMODE .SET AYMODE_RCZ80 ; AY: DRIVER MODE: AYMODE_[SCG|N8|RCZ80|RCZ180|MSX|LINC] +SN76489ENABLE .SET TRUE ; SN: ENABLE SN76489 SOUND DRIVER +; +FDENABLE .SET FALSE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM) +FDMODE .SET FDMODE_RCWDC ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPFDC] +; +IDEENABLE .SET TRUE ; IDE: ENABLE IDE DISK DRIVER (IDE.ASM) +PPIDEENABLE .SET FALSE ; PPIDE: ENABLE PARALLEL PORT IDE DISK DRIVER (PPIDE.ASM) +SDENABLE .SET FALSE ; SD: ENABLE SD CARD DISK DRIVER (SD.ASM) +SDCNT .SET 1 ; SD: NUMBER OF SD CARD DEVICES (1-2), FOR DSD/SC/MT SC ONLY +; +PRPENABLE .SET FALSE ; PRP: ENABLE ECB PROPELLER IO BOARD DRIVER (PRP.ASM) diff --git a/Source/HBIOS/Config/RCZ80_kio.asm b/Source/HBIOS/Config/RCZ80_kio.asm index ee7d74de..e56048d4 100644 --- a/Source/HBIOS/Config/RCZ80_kio.asm +++ b/Source/HBIOS/Config/RCZ80_kio.asm @@ -30,6 +30,9 @@ CPUOSC .SET 7372800 ; CPU OSC FREQ IN MHZ INTMODE .SET 2 ; INTERRUPTS: 0=NONE, 1=MODE 1, 2=MODE 2 CRTACT .SET FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP ; +FPLED_ENABLE .SET TRUE ; FP: ENABLES FRONT PANEL LEDS +FPSW_ENABLE .SET TRUE ; FP: ENABLES FRONT PANEL SWITCHES +; DSRTCENABLE .SET TRUE ; DSRTC: ENABLE DS-1302 CLOCK DRIVER (DSRTC.ASM) RP5RTCENABLE .SET FALSE ; RP5C01 RTC BASED CLOCK (RP5RTC.ASM) KIOENABLE .SET TRUE ; ENABLE ZILOG KIO SUPPORT @@ -55,6 +58,7 @@ TMSENABLE .SET FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM) TMSTIMENABLE .SET FALSE ; TMS: ENABLE TIMER INTERRUPTS (REQUIRES IM1) TMSMODE .SET TMSMODE_MSX ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|MSX9958|MSXKBD|COLECO] MKYENABLE .SET FALSE ; MSX 5255 PPI KEYBOARD COMPATIBLE DRIVER (REQUIRES TMS VDA DRIVER) +VRCENABLE .SET FALSE ; VRC: ENABLE VGARC VIDEO/KBD DRIVER (VRC.ASM) VDAEMU_SERKBD .SET 0 ; VDA EMULATION: SERIAL KBD UNIT #, OR $FF FOR HW KBD ; AY38910ENABLE .SET FALSE ; AY: AY-3-8910 / YM2149 SOUND DRIVER @@ -62,11 +66,12 @@ AYMODE .SET AYMODE_RCZ80 ; AY: DRIVER MODE: AYMODE_[SCG|N8|RCZ80|RCZ180|MSX|LIN SN76489ENABLE .SET FALSE ; SN: ENABLE SN76489 SOUND DRIVER ; FDENABLE .SET TRUE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM) -FDMODE .SET FDMODE_RCWDC ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPWDC] +FDMODE .SET FDMODE_RCWDC ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPFDC] ; IDEENABLE .SET TRUE ; IDE: ENABLE IDE DISK DRIVER (IDE.ASM) PPIDEENABLE .SET TRUE ; PPIDE: ENABLE PARALLEL PORT IDE DISK DRIVER (PPIDE.ASM) SDENABLE .SET FALSE ; SD: ENABLE SD CARD DISK DRIVER (SD.ASM) SDCNT .SET 1 ; SD: NUMBER OF SD CARD DEVICES (1-2), FOR DSD/SC/MT SC ONLY +IMMENABLE .SET FALSE ; IMM: ENABLE IMM DISK DRIVER (IMM.ASM) ; PRPENABLE .SET FALSE ; PRP: ENABLE ECB PROPELLER IO BOARD DRIVER (PRP.ASM) diff --git a/Source/HBIOS/Config/RCZ80_skz.asm b/Source/HBIOS/Config/RCZ80_skz.asm index d3380a37..0dcf8039 100644 --- a/Source/HBIOS/Config/RCZ80_skz.asm +++ b/Source/HBIOS/Config/RCZ80_skz.asm @@ -29,6 +29,9 @@ CPUOSC .SET 7372800 ; CPU OSC FREQ IN MHZ CRTACT .SET FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP ; +FPLED_ENABLE .SET TRUE ; FP: ENABLES FRONT PANEL LEDS +FPSW_ENABLE .SET TRUE ; FP: ENABLES FRONT PANEL SWITCHES +; SKZENABLE .SET TRUE ; ENABLE SERGEY'S Z80-512K FEATURES SKZDIV .SET DIV_12 ; UART CLK (CLK2) DIVIDER FOR Z80-512K WDOGMODE .SET WDOG_SKZ ; WATCHDOG MODE: WDOG_[NONE|EZZ80|SKZ] @@ -50,6 +53,7 @@ TMSENABLE .SET FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM) TMSTIMENABLE .SET FALSE ; TMS: ENABLE TIMER INTERRUPTS (REQUIRES IM1) TMSMODE .SET TMSMODE_MSX ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|MSX9958|MSXKBD|COLECO] MKYENABLE .SET FALSE ; MSX 5255 PPI KEYBOARD COMPATIBLE DRIVER (REQUIRES TMS VDA DRIVER) +VRCENABLE .SET FALSE ; VRC: ENABLE VGARC VIDEO/KBD DRIVER (VRC.ASM) VDAEMU_SERKBD .SET 0 ; VDA EMULATION: SERIAL KBD UNIT #, OR $FF FOR HW KBD ; AY38910ENABLE .SET FALSE ; AY: AY-3-8910 / YM2149 SOUND DRIVER @@ -57,11 +61,12 @@ AYMODE .SET AYMODE_RCZ80 ; AY: DRIVER MODE: AYMODE_[SCG|N8|RCZ80|RCZ180|MSX|LIN SN76489ENABLE .SET FALSE ; SN: ENABLE SN76489 SOUND DRIVER ; FDENABLE .SET TRUE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM) -FDMODE .SET FDMODE_RCWDC ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPWDC] +FDMODE .SET FDMODE_RCWDC ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPFDC] ; IDEENABLE .SET TRUE ; IDE: ENABLE IDE DISK DRIVER (IDE.ASM) PPIDEENABLE .SET TRUE ; PPIDE: ENABLE PARALLEL PORT IDE DISK DRIVER (PPIDE.ASM) SDENABLE .SET FALSE ; SD: ENABLE SD CARD DISK DRIVER (SD.ASM) SDCNT .SET 1 ; SD: NUMBER OF SD CARD DEVICES (1-2), FOR DSD/SC/MT SC ONLY +IMMENABLE .SET FALSE ; IMM: ENABLE IMM DISK DRIVER (IMM.ASM) ; PRPENABLE .SET FALSE ; PRP: ENABLE ECB PROPELLER IO BOARD DRIVER (PRP.ASM) diff --git a/Source/HBIOS/Config/RCZ80_std.asm b/Source/HBIOS/Config/RCZ80_std.asm index 6707b13d..d3b51193 100644 --- a/Source/HBIOS/Config/RCZ80_std.asm +++ b/Source/HBIOS/Config/RCZ80_std.asm @@ -29,6 +29,9 @@ CPUOSC .SET 7372800 ; CPU OSC FREQ IN MHZ CRTACT .SET FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP ; +FPLED_ENABLE .SET TRUE ; FP: ENABLES FRONT PANEL LEDS +FPSW_ENABLE .SET TRUE ; FP: ENABLES FRONT PANEL SWITCHES +; DSRTCENABLE .SET TRUE ; DSRTC: ENABLE DS-1302 CLOCK DRIVER (DSRTC.ASM) RP5RTCENABLE .SET FALSE ; RP5C01 RTC BASED CLOCK (RP5RTC.ASM) ; @@ -37,10 +40,13 @@ ACIAENABLE .SET TRUE ; ACIA: ENABLE MOTOROLA 6850 ACIA DRIVER (ACIA.ASM) SIOENABLE .SET TRUE ; SIO: ENABLE ZILOG SIO SERIAL DRIVER (SIO.ASM) DUARTENABLE .SET FALSE ; DUART: ENABLE 2681/2692 SERIAL DRIVER (DUART.ASM) ; +LPTENABLE .SET FALSE ; LPT: ENABLE CENTRONICS PRINTER DRIVER (LPT.ASM) +; TMSENABLE .SET FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM) TMSTIMENABLE .SET FALSE ; TMS: ENABLE TIMER INTERRUPTS (REQUIRES IM1) TMSMODE .SET TMSMODE_MSX ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|MSX9958|MSXKBD|COLECO] MKYENABLE .SET FALSE ; MSX 5255 PPI KEYBOARD COMPATIBLE DRIVER (REQUIRES TMS VDA DRIVER) +VRCENABLE .SET FALSE ; VRC: ENABLE VGARC VIDEO/KBD DRIVER (VRC.ASM) VDAEMU_SERKBD .SET 0 ; VDA EMULATION: SERIAL KBD UNIT #, OR $FF FOR HW KBD ; AY38910ENABLE .SET FALSE ; AY: AY-3-8910 / YM2149 SOUND DRIVER @@ -48,11 +54,13 @@ AYMODE .SET AYMODE_RCZ80 ; AY: DRIVER MODE: AYMODE_[SCG|N8|RCZ80|RCZ180|MSX|LIN SN76489ENABLE .SET FALSE ; SN: ENABLE SN76489 SOUND DRIVER ; FDENABLE .SET TRUE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM) -FDMODE .SET FDMODE_RCWDC ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPWDC] +FDMODE .SET FDMODE_RCWDC ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPFDC] ; IDEENABLE .SET TRUE ; IDE: ENABLE IDE DISK DRIVER (IDE.ASM) PPIDEENABLE .SET TRUE ; PPIDE: ENABLE PARALLEL PORT IDE DISK DRIVER (PPIDE.ASM) SDENABLE .SET FALSE ; SD: ENABLE SD CARD DISK DRIVER (SD.ASM) +SDMODE .SET SDMODE_PIO ; SD: DRIVER MODE: SDMODE_[JUHA|N8|CSIO|PPI|UART|DSD|MK4|SC|MT|PIO|USR] SDCNT .SET 1 ; SD: NUMBER OF SD CARD DEVICES (1-2), FOR DSD/SC/MT SC ONLY +IMMENABLE .SET FALSE ; IMM: ENABLE IMM DISK DRIVER (IMM.ASM) ; PRPENABLE .SET FALSE ; PRP: ENABLE ECB PROPELLER IO BOARD DRIVER (PRP.ASM) diff --git a/Source/HBIOS/Config/RCZ80_tiny.asm b/Source/HBIOS/Config/RCZ80_tiny.asm index d5da8791..4257cd61 100644 --- a/Source/HBIOS/Config/RCZ80_tiny.asm +++ b/Source/HBIOS/Config/RCZ80_tiny.asm @@ -33,11 +33,13 @@ CPUOSC .SET 16000000 ; CPU OSC FREQ IN MHZ CRTACT .SET FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP INTMODE .SET 2 ; INTERRUPTS: 0=NONE, 1=MODE 1, 2=MODE 2, 3=MODE 3 (Z280) ; +FPLED_ENABLE .SET TRUE ; FP: ENABLES FRONT PANEL LEDS +FPSW_ENABLE .SET TRUE ; FP: ENABLES FRONT PANEL SWITCHES +; EIPCENABLE .SET TRUE ; EIPC: ENABLE Z80 EIPC (Z84C15) INITIALIZATION WDOGMODE .SET WDOG_EZZ80 ; WATCHDOG MODE: WDOG_[NONE|EZZ80|SKZ] WDOGIO .SET $6F ; WATCHDOG REGISTER ADR ; -DIAGENABLE .SET FALSE ; ENABLES OUTPUT TO 8 BIT LED DIAGNOSTIC PORT LEDENABLE .SET TRUE ; ENABLES STATUS LED (SINGLE LED) LEDPORT .SET $6E ; STATUS LED PORT ADDRESS ; @@ -65,6 +67,7 @@ TMSENABLE .SET FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM) TMSTIMENABLE .SET FALSE ; TMS: ENABLE TIMER INTERRUPTS (REQUIRES IM1) TMSMODE .SET TMSMODE_MSX ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|MSX9958|MSXKBD|COLECO] MKYENABLE .SET FALSE ; MSX 5255 PPI KEYBOARD COMPATIBLE DRIVER (REQUIRES TMS VDA DRIVER) +VRCENABLE .SET FALSE ; VRC: ENABLE VGARC VIDEO/KBD DRIVER (VRC.ASM) VDAEMU_SERKBD .SET 0 ; VDA EMULATION: SERIAL KBD UNIT #, OR $FF FOR HW KBD ; AY38910ENABLE .SET FALSE ; AY: AY-3-8910 / YM2149 SOUND DRIVER @@ -72,12 +75,13 @@ AYMODE .SET AYMODE_RCZ80 ; AY: DRIVER MODE: AYMODE_[SCG|N8|RCZ80|RCZ180|MSX|LIN SN76489ENABLE .SET FALSE ; SN: ENABLE SN76489 SOUND DRIVER ; FDENABLE .SET TRUE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM) -FDMODE .SET FDMODE_RCWDC ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPWDC] +FDMODE .SET FDMODE_RCWDC ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPFDC] ; IDEENABLE .SET TRUE ; IDE: ENABLE IDE DISK DRIVER (IDE.ASM) IDE0BASE .SET $90 ; IDE 0: IO BASE ADDRESS PPIDEENABLE .SET TRUE ; PPIDE: ENABLE PARALLEL PORT IDE DISK DRIVER (PPIDE.ASM) SDENABLE .SET FALSE ; SD: ENABLE SD CARD DISK DRIVER (SD.ASM) SDCNT .SET 1 ; SD: NUMBER OF SD CARD DEVICES (1-2), FOR DSD/SC/MT SC ONLY +IMMENABLE .SET FALSE ; IMM: ENABLE IMM DISK DRIVER (IMM.ASM) ; PRPENABLE .SET FALSE ; PRP: ENABLE ECB PROPELLER IO BOARD DRIVER (PRP.ASM) diff --git a/Source/HBIOS/Config/RCZ80_zrc.asm b/Source/HBIOS/Config/RCZ80_zrc.asm index 55566dc9..272aac78 100644 --- a/Source/HBIOS/Config/RCZ80_zrc.asm +++ b/Source/HBIOS/Config/RCZ80_zrc.asm @@ -27,10 +27,15 @@ #DEFINE BOOT_DEFAULT "H" ; DEFAULT BOOT LOADER CMD ON OR AUTO BOOT ; #include "cfg_rcz80.asm" +; CPUOSC .SET 14745600 ; CPU OSC FREQ IN MHZ CRTACT .SET FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP ; +FPLED_ENABLE .SET TRUE ; FP: ENABLES FRONT PANEL LEDS +FPSW_ENABLE .SET TRUE ; FP: ENABLES FRONT PANEL SWITCHES +; RAMSIZE .SET 1536 ; SIZE OF RAM IN KB (MUST MATCH YOUR HARDWARE!!!) +ROMSIZE .SET 512 ; SIZE OF ROM IN KB (MUST MATCH YOUR HARDWARE!!!) MEMMGR .SET MM_ZRC ; MEMORY MANAGER: MM_[SBC|Z2|N8|Z180] ; UARTENABLE .SET TRUE ; UART: ENABLE 8250/16550-LIKE SERIAL DRIVER (UART.ASM) @@ -42,18 +47,20 @@ TMSENABLE .SET FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM) TMSTIMENABLE .SET FALSE ; TMS: ENABLE TIMER INTERRUPTS (REQUIRES IM1) TMSMODE .SET TMSMODE_MSX ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|MSX9958|MSXKBD|COLECO] MKYENABLE .SET FALSE ; MSX 5255 PPI KEYBOARD COMPATIBLE DRIVER (REQUIRES TMS VDA DRIVER) -VDAEMU_SERKBD .SET 0 ; VDA EMULATION: SERIAL KBD UNIT #, OR $FF FOR HW KBD +VRCENABLE .SET TRUE ; VRC: ENABLE VGARC VIDEO/KBD DRIVER (VRC.ASM) +VDAEMU_SERKBD .SET $FF ; VDA EMULATION: SERIAL KBD UNIT #, OR $FF FOR HW KBD ; AY38910ENABLE .SET FALSE ; AY: AY-3-8910 / YM2149 SOUND DRIVER AYMODE .SET AYMODE_RCZ80 ; AY: DRIVER MODE: AYMODE_[SCG|N8|RCZ80|RCZ180|MSX|LINC] SN76489ENABLE .SET FALSE ; SN: ENABLE SN76489 SOUND DRIVER ; FDENABLE .SET TRUE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM) -FDMODE .SET FDMODE_RCWDC ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPWDC] +FDMODE .SET FDMODE_RCWDC ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPFDC] ; IDEENABLE .SET TRUE ; IDE: ENABLE IDE DISK DRIVER (IDE.ASM) PPIDEENABLE .SET TRUE ; PPIDE: ENABLE PARALLEL PORT IDE DISK DRIVER (PPIDE.ASM) SDENABLE .SET FALSE ; SD: ENABLE SD CARD DISK DRIVER (SD.ASM) SDCNT .SET 1 ; SD: NUMBER OF SD CARD DEVICES (1-2), FOR DSD/SC/MT SC ONLY +IMMENABLE .SET FALSE ; IMM: ENABLE IMM DISK DRIVER (IMM.ASM) ; PRPENABLE .SET FALSE ; PRP: ENABLE ECB PROPELLER IO BOARD DRIVER (PRP.ASM) diff --git a/Source/HBIOS/Config/RCZ80_zrc512.asm b/Source/HBIOS/Config/RCZ80_zrc512.asm new file mode 100644 index 00000000..12457d6b --- /dev/null +++ b/Source/HBIOS/Config/RCZ80_zrc512.asm @@ -0,0 +1,68 @@ +; +;================================================================================================== +; RCBUS Z80 ZRC512 CONFIGURATION +;================================================================================================== +; +; THE COMPLETE SET OF DEFAULT CONFIGURATION SETTINGS FOR THIS PLATFORM ARE FOUND IN THE +; CFG_.ASM INCLUDED FILE WHICH IS FOUND IN THE PARENT DIRECTORY. THIS FILE CONTAINS +; COMMON CONFIGURATION SETTINGS THAT OVERRIDE THE DEFAULTS. IT IS INTENDED THAT YOU MAKE +; YOUR CUSTOMIZATIONS IN THIS FILE AND JUST INHERIT ALL OTHER SETTINGS FROM THE DEFAULTS. +; EVEN BETTER, YOU CAN MAKE A COPY OF THIS FILE WITH A NAME LIKE _XXX.ASM AND SPECIFY +; YOUR FILE IN THE BUILD PROCESS. +; +; THE SETTINGS BELOW ARE THE SETTINGS THAT ARE MOST COMMONLY MODIFIED FOR THIS PLATFORM. +; MANY OF THEM ARE EQUAL TO THE SETTINGS IN THE INCLUDED FILE, SO THEY DON'T REALLY DO +; ANYTHING AS IS. THEY ARE LISTED HERE TO MAKE IT EASY FOR YOU TO ADJUST THE MOST COMMON +; SETTINGS. +; +; N.B., SINCE THE SETTINGS BELOW ARE REDEFINING VALUES ALREADY SET IN THE INCLUDED FILE, +; TASM INSISTS THAT YOU USE THE .SET OPERATOR AND NOT THE .EQU OPERATOR BELOW. ATTEMPTING +; TO REDEFINE A VALUE WITH .EQU BELOW WILL CAUSE TASM ERRORS! +; +; PLEASE REFER TO THE CUSTOM BUILD INSTRUCTIONS (README.TXT) IN THE SOURCE DIRECTORY (TWO +; DIRECTORIES ABOVE THIS ONE). +; +#DEFINE PLATFORM_NAME "ZRC512", " [", CONFIG, "]" +; +#DEFINE BOOT_DEFAULT "H" ; DEFAULT BOOT LOADER CMD ON OR AUTO BOOT +; +#include "cfg_rcz80.asm" +; +CPUOSC .SET 22000000 ; CPU OSC FREQ IN MHZ +CRTACT .SET FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP +; +FPLED_ENABLE .SET TRUE ; FP: ENABLES FRONT PANEL LEDS +FPSW_ENABLE .SET TRUE ; FP: ENABLES FRONT PANEL SWITCHES +; +RAMSIZE .SET 512 ; SIZE OF RAM IN KB (MUST MATCH YOUR HARDWARE!!!) +ROMSIZE .SET 0 ; SIZE OF ROM IN KB (MUST MATCH YOUR HARDWARE!!!) +MEMMGR .SET MM_ZRC ; MEMORY MANAGER: MM_[SBC|Z2|N8|Z180] +; +MDROM .SET FALSE ; MD: ENABLE ROM DISK +; +UARTENABLE .SET TRUE ; UART: ENABLE 8250/16550-LIKE SERIAL DRIVER (UART.ASM) +ACIAENABLE .SET TRUE ; ACIA: ENABLE MOTOROLA 6850 ACIA DRIVER (ACIA.ASM) +SIOENABLE .SET TRUE ; SIO: ENABLE ZILOG SIO SERIAL DRIVER (SIO.ASM) +DUARTENABLE .SET FALSE ; DUART: ENABLE 2681/2692 SERIAL DRIVER (DUART.ASM) +; +TMSENABLE .SET FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM) +TMSTIMENABLE .SET FALSE ; TMS: ENABLE TIMER INTERRUPTS (REQUIRES IM1) +TMSMODE .SET TMSMODE_MSX ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|MSX9958|MSXKBD|COLECO] +MKYENABLE .SET FALSE ; MSX 5255 PPI KEYBOARD COMPATIBLE DRIVER (REQUIRES TMS VDA DRIVER) +VRCENABLE .SET TRUE ; VRC: ENABLE VGARC VIDEO/KBD DRIVER (VRC.ASM) +VDAEMU_SERKBD .SET $FF ; VDA EMULATION: SERIAL KBD UNIT #, OR $FF FOR HW KBD +; +AY38910ENABLE .SET FALSE ; AY: AY-3-8910 / YM2149 SOUND DRIVER +AYMODE .SET AYMODE_RCZ80 ; AY: DRIVER MODE: AYMODE_[SCG|N8|RCZ80|RCZ180|MSX|LINC] +SN76489ENABLE .SET FALSE ; SN: ENABLE SN76489 SOUND DRIVER +; +FDENABLE .SET TRUE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM) +FDMODE .SET FDMODE_RCWDC ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPFDC] +; +IDEENABLE .SET TRUE ; IDE: ENABLE IDE DISK DRIVER (IDE.ASM) +PPIDEENABLE .SET TRUE ; PPIDE: ENABLE PARALLEL PORT IDE DISK DRIVER (PPIDE.ASM) +SDENABLE .SET FALSE ; SD: ENABLE SD CARD DISK DRIVER (SD.ASM) +SDCNT .SET 1 ; SD: NUMBER OF SD CARD DEVICES (1-2), FOR DSD/SC/MT SC ONLY +IMMENABLE .SET FALSE ; IMM: ENABLE IMM DISK DRIVER (IMM.ASM) +; +PRPENABLE .SET FALSE ; PRP: ENABLE ECB PROPELLER IO BOARD DRIVER (PRP.ASM) diff --git a/Source/HBIOS/Config/RCZ80_zrc_ram.asm b/Source/HBIOS/Config/RCZ80_zrc_ram.asm index 7ec945db..59993996 100644 --- a/Source/HBIOS/Config/RCZ80_zrc_ram.asm +++ b/Source/HBIOS/Config/RCZ80_zrc_ram.asm @@ -28,10 +28,13 @@ ; #include "cfg_rcz80.asm" ; -CPUOSC .SET 7372800 ; CPU OSC FREQ IN MHZ +CPUOSC .SET 14745600 ; CPU OSC FREQ IN MHZ CRTACT .SET FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP ; -RAMSIZE .SET 2048 ; SIZE OF RAM IN KB (MUST MATCH YOUR HARDWARE!!!) +FPLED_ENABLE .SET TRUE ; FP: ENABLES FRONT PANEL LEDS +FPSW_ENABLE .SET TRUE ; FP: ENABLES FRONT PANEL SWITCHES +; +RAMSIZE .SET 512 ; SIZE OF RAM IN KB (MUST MATCH YOUR HARDWARE!!!) ROMSIZE .SET 0 ; SIZE OF ROM IN KB (MUST MATCH YOUR HARDWARE!!!) MEMMGR .SET MM_ZRC ; MEMORY MANAGER: MM_[SBC|Z2|N8|Z180] ; @@ -46,18 +49,20 @@ TMSENABLE .SET FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM) TMSTIMENABLE .SET FALSE ; TMS: ENABLE TIMER INTERRUPTS (REQUIRES IM1) TMSMODE .SET TMSMODE_MSX ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|MSX9958|MSXKBD|COLECO] MKYENABLE .SET FALSE ; MSX 5255 PPI KEYBOARD COMPATIBLE DRIVER (REQUIRES TMS VDA DRIVER) -VDAEMU_SERKBD .SET 0 ; VDA EMULATION: SERIAL KBD UNIT #, OR $FF FOR HW KBD +VRCENABLE .SET TRUE ; VRC: ENABLE VGARC VIDEO/KBD DRIVER (VRC.ASM) +VDAEMU_SERKBD .SET $FF ; VDA EMULATION: SERIAL KBD UNIT #, OR $FF FOR HW KBD ; AY38910ENABLE .SET FALSE ; AY: AY-3-8910 / YM2149 SOUND DRIVER AYMODE .SET AYMODE_RCZ80 ; AY: DRIVER MODE: AYMODE_[SCG|N8|RCZ80|RCZ180|MSX|LINC] SN76489ENABLE .SET FALSE ; SN: ENABLE SN76489 SOUND DRIVER ; FDENABLE .SET TRUE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM) -FDMODE .SET FDMODE_RCWDC ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPWDC] +FDMODE .SET FDMODE_RCWDC ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPFDC] ; IDEENABLE .SET TRUE ; IDE: ENABLE IDE DISK DRIVER (IDE.ASM) PPIDEENABLE .SET TRUE ; PPIDE: ENABLE PARALLEL PORT IDE DISK DRIVER (PPIDE.ASM) SDENABLE .SET FALSE ; SD: ENABLE SD CARD DISK DRIVER (SD.ASM) SDCNT .SET 1 ; SD: NUMBER OF SD CARD DEVICES (1-2), FOR DSD/SC/MT SC ONLY +IMMENABLE .SET FALSE ; IMM: ENABLE IMM DISK DRIVER (IMM.ASM) ; PRPENABLE .SET FALSE ; PRP: ENABLE ECB PROPELLER IO BOARD DRIVER (PRP.ASM) diff --git a/Source/HBIOS/Config/S100_std.asm b/Source/HBIOS/Config/S100_std.asm new file mode 100644 index 00000000..e3846c73 --- /dev/null +++ b/Source/HBIOS/Config/S100_std.asm @@ -0,0 +1,46 @@ +; +;================================================================================================== +; S100 STANDARD CONFIGURATION +;================================================================================================== +; +; THE COMPLETE SET OF DEFAULT CONFIGURATION SETTINGS FOR THIS PLATFORM ARE FOUND IN THE +; CFG_.ASM INCLUDED FILE WHICH IS FOUND IN THE PARENT DIRECTORY. THIS FILE CONTAINS +; COMMON CONFIGURATION SETTINGS THAT OVERRIDE THE DEFAULTS. IT IS INTENDED THAT YOU MAKE +; YOUR CUSTOMIZATIONS IN THIS FILE AND JUST INHERIT ALL OTHER SETTINGS FROM THE DEFAULTS. +; EVEN BETTER, YOU CAN MAKE A COPY OF THIS FILE WITH A NAME LIKE _XXX.ASM AND SPECIFY +; YOUR FILE IN THE BUILD PROCESS. +; +; THE SETTINGS BELOW ARE THE SETTINGS THAT ARE MOST COMMONLY MODIFIED FOR THIS PLATFORM. +; MANY OF THEM ARE EQUAL TO THE SETTINGS IN THE INCLUDED FILE, SO THEY DON'T REALLY DO +; ANYTHING AS IS. THEY ARE LISTED HERE TO MAKE IT EASY FOR YOU TO ADJUST THE MOST COMMON +; SETTINGS. +; +; N.B., SINCE THE SETTINGS BELOW ARE REDEFINING VALUES ALREADY SET IN THE INCLUDED FILE, +; TASM INSISTS THAT YOU USE THE .SET OPERATOR AND NOT THE .EQU OPERATOR BELOW. ATTEMPTING +; TO REDEFINE A VALUE WITH .EQU BELOW WILL CAUSE TASM ERRORS! +; +; PLEASE REFER TO THE CUSTOM BUILD INSTRUCTIONS (README.TXT) IN THE SOURCE DIRECTORY (TWO +; DIRECTORIES ABOVE THIS ONE). +; +#DEFINE BOOT_DEFAULT "H" ; DEFAULT BOOT LOADER CMD ON OR AUTO BOOT +; +#include "cfg_s100.asm" +; +CPUOSC .SET 18432000 ; CPU OSC FREQ IN MHZ +CRTACT .SET TRUE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP +; +Z180_CLKDIV .SET 1 ; Z180: CHK DIV: 0=OSC/2, 1=OSC, 2=OSC*2 +Z180_MEMWAIT .SET 1 ; Z180: MEMORY WAIT STATES (0-3) +Z180_IOWAIT .SET 2 ; Z180: I/O WAIT STATES TO ADD ABOVE 1 W/S BUILT-IN (0-3) +; +DSRTCENABLE .SET FALSE ; DSRTC: ENABLE DS-1302 CLOCK DRIVER (DSRTC.ASM) +INTRTCENABLE .SET TRUE ; ENABLE PERIODIC INTERRUPT CLOCK DRIVER (INTRTC.ASM) +; +ASCIENABLE .SET TRUE ; ASCI: ENABLE Z180 ASCI SERIAL DRIVER (ASCI.ASM) +SCONENABLE .SET TRUE ; SCON: ENABLE S100 CONSOLE DRIVER (SCON.ASM) +; +IDEENABLE .SET FALSE ; IDE: ENABLE IDE DISK DRIVER (IDE.ASM) +PPIDEENABLE .SET FALSE ; PPIDE: ENABLE PARALLEL PORT IDE DISK DRIVER (PPIDE.ASM) +SDENABLE .SET TRUE ; SD: ENABLE SD CARD DISK DRIVER (SD.ASM) +SDMODE .SET SDMODE_SC ; SD: DRIVER MODE: SDMODE_[JUHA|N8|CSIO|PPI|UART|DSD|MK4|SC|MT|USR] +SDCNT .SET 1 ; SD: NUMBER OF SD CARD DEVICES (1-2), FOR DSD & SC ONLY diff --git a/Source/HBIOS/Config/SBC_max.asm b/Source/HBIOS/Config/SBC_max.asm index c2537aca..f2ff533d 100644 --- a/Source/HBIOS/Config/SBC_max.asm +++ b/Source/HBIOS/Config/SBC_max.asm @@ -35,9 +35,12 @@ USELZSA2 .SET TRUE ; ENABLE FONT COMPRESSION ; KIOENABLE .SET TRUE ; ENABLE ZILOG KIO SUPPORT ; -DIAGENABLE .SET TRUE ; ENABLES OUTPUT TO 8 BIT LED DIAGNOSTIC PORT +FPLED_ENABLE .SET TRUE ; FP: ENABLES FRONT PANEL LEDS +FPSW_ENABLE .SET TRUE ; FP: ENABLES FRONT PANEL SWITCHES ; DSKYENABLE .SET TRUE ; ENABLES DSKY (DO NOT COMBINE WITH PPIDE) +ICMENABLE .SET TRUE ; ENABLES ORIGINAL DSKY ICM DRIVER (7218) +PKDENABLE .SET TRUE ; ENABLES DSKY NG PKD DRIVER (8259) ; DSRTCENABLE .SET TRUE ; DSRTC: ENABLE DS-1302 CLOCK DRIVER (DSRTC.ASM) ; diff --git a/Source/HBIOS/Config/SBC_std.asm b/Source/HBIOS/Config/SBC_std.asm index b2a2474c..27c0f5fd 100644 --- a/Source/HBIOS/Config/SBC_std.asm +++ b/Source/HBIOS/Config/SBC_std.asm @@ -45,7 +45,7 @@ VGAENABLE .SET TRUE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM) VDAEMU_SERKBD .SET 0 ; VDA EMULATION: SERIAL KBD UNIT #, OR $FF FOR HW KBD ; FDENABLE .SET TRUE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM) -FDMODE .SET FDMODE_DIO3 ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPWDC] +FDMODE .SET FDMODE_DIO3 ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPFDC] ; IDEENABLE .SET FALSE ; IDE: ENABLE IDE DISK DRIVER (IDE.ASM) PPIDEENABLE .SET TRUE ; PPIDE: ENABLE PARALLEL PORT IDE DISK DRIVER (PPIDE.ASM) diff --git a/Source/HBIOS/Config/SCZ180_sc126.asm b/Source/HBIOS/Config/SCZ180_sc126.asm index 2550da0d..e617d8c9 100644 --- a/Source/HBIOS/Config/SCZ180_sc126.asm +++ b/Source/HBIOS/Config/SCZ180_sc126.asm @@ -35,8 +35,9 @@ Z180_CLKDIV .SET 1 ; Z180: CHK DIV: 0=OSC/2, 1=OSC, 2=OSC*2 Z180_MEMWAIT .SET 0 ; Z180: MEMORY WAIT STATES (0-3) Z180_IOWAIT .SET 1 ; Z180: I/O WAIT STATES TO ADD ABOVE 1 W/S BUILT-IN (0-3) ; -DIAGENABLE .SET TRUE ; ENABLES OUTPUT TO 8 BIT LED DIAGNOSTIC PORT -DIAGPORT .SET $0D ; DIAGNOSTIC PORT ADDRESS +FPLED_ENABLE .SET TRUE ; FP: ENABLES FRONT PANEL LEDS +FPSW_ENABLE .SET TRUE ; FP: ENABLES FRONT PANEL SWITCHES +FPLED_IO .SET $0D ; FP: PORT ADDRESS FOR FP LEDS ; DSRTCENABLE .SET TRUE ; DSRTC: ENABLE DS-1302 CLOCK DRIVER (DSRTC.ASM) INTRTCENABLE .SET TRUE ; ENABLE PERIODIC INTERRUPT CLOCK DRIVER (INTRTC.ASM) @@ -50,6 +51,7 @@ TMSENABLE .SET FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM) TMSTIMENABLE .SET FALSE ; TMS: ENABLE TIMER INTERRUPTS (REQUIRES IM1) TMSMODE .SET TMSMODE_MSX ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|MSX9958|MSXKBD|COLECO] MKYENABLE .SET FALSE ; MSX 5255 PPI KEYBOARD COMPATIBLE DRIVER (REQUIRES TMS VDA DRIVER) +VRCENABLE .SET FALSE ; VRC: ENABLE VGARC VIDEO/KBD DRIVER (VRC.ASM) VDAEMU_SERKBD .SET 0 ; VDA EMULATION: SERIAL KBD UNIT #, OR $FF FOR HW KBD ; AY38910ENABLE .SET TRUE ; AY: AY-3-8910 / YM2149 SOUND DRIVER @@ -57,7 +59,7 @@ AYMODE .SET AYMODE_RCZ180 ; AY: DRIVER MODE: AYMODE_[SCG|N8|RCZ80|RCZ180|MSX|LI SN76489ENABLE .SET FALSE ; SN: ENABLE SN76489 SOUND DRIVER ; FDENABLE .SET TRUE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM) -FDMODE .SET FDMODE_RCWDC ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPWDC] +FDMODE .SET FDMODE_RCWDC ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPFDC] ; IDEENABLE .SET TRUE ; IDE: ENABLE IDE DISK DRIVER (IDE.ASM) PPIDEENABLE .SET TRUE ; PPIDE: ENABLE PARALLEL PORT IDE DISK DRIVER (PPIDE.ASM) diff --git a/Source/HBIOS/Config/SCZ180_sc130.asm b/Source/HBIOS/Config/SCZ180_sc130.asm index ed6e7284..219862cb 100644 --- a/Source/HBIOS/Config/SCZ180_sc130.asm +++ b/Source/HBIOS/Config/SCZ180_sc130.asm @@ -35,8 +35,10 @@ Z180_CLKDIV .SET 1 ; Z180: CHK DIV: 0=OSC/2, 1=OSC, 2=OSC*2 Z180_MEMWAIT .SET 0 ; Z180: MEMORY WAIT STATES (0-3) Z180_IOWAIT .SET 1 ; Z180: I/O WAIT STATES TO ADD ABOVE 1 W/S BUILT-IN (0-3) ; +FPLED_ENABLE .SET TRUE ; FP: ENABLES FRONT PANEL LEDS +FPSW_ENABLE .SET TRUE ; FP: ENABLES FRONT PANEL SWITCHES +; LEDENABLE .SET TRUE ; ENABLE STATUS LED (SINGLE LED) -DIAGENABLE .SET FALSE ; ENABLES OUTPUT TO 8 BIT LED DIAGNOSTIC PORT ; DSRTCENABLE .SET TRUE ; DSRTC: ENABLE DS-1302 CLOCK DRIVER (DSRTC.ASM) INTRTCENABLE .SET TRUE ; ENABLE PERIODIC INTERRUPT CLOCK DRIVER (INTRTC.ASM) @@ -50,6 +52,7 @@ TMSENABLE .SET FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM) TMSTIMENABLE .SET FALSE ; TMS: ENABLE TIMER INTERRUPTS (REQUIRES IM1) TMSMODE .SET TMSMODE_MSX ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|MSX9958|MSXKBD|COLECO] MKYENABLE .SET FALSE ; MSX 5255 PPI KEYBOARD COMPATIBLE DRIVER (REQUIRES TMS VDA DRIVER) +VRCENABLE .SET FALSE ; VRC: ENABLE VGARC VIDEO/KBD DRIVER (VRC.ASM) VDAEMU_SERKBD .SET 0 ; VDA EMULATION: SERIAL KBD UNIT #, OR $FF FOR HW KBD ; AY38910ENABLE .SET TRUE ; AY: AY-3-8910 / YM2149 SOUND DRIVER @@ -57,7 +60,7 @@ AYMODE .SET AYMODE_RCZ180 ; AY: DRIVER MODE: AYMODE_[SCG|N8|RCZ80|RCZ180|MSX|LI SN76489ENABLE .SET FALSE ; SN: ENABLE SN76489 SOUND DRIVER ; FDENABLE .SET TRUE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM) -FDMODE .SET FDMODE_RCWDC ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPWDC] +FDMODE .SET FDMODE_RCWDC ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPFDC] ; IDEENABLE .SET TRUE ; IDE: ENABLE IDE DISK DRIVER (IDE.ASM) PPIDEENABLE .SET TRUE ; PPIDE: ENABLE PARALLEL PORT IDE DISK DRIVER (PPIDE.ASM) diff --git a/Source/HBIOS/Config/SCZ180_sc131.asm b/Source/HBIOS/Config/SCZ180_sc131.asm index 93f3f383..8d224875 100644 --- a/Source/HBIOS/Config/SCZ180_sc131.asm +++ b/Source/HBIOS/Config/SCZ180_sc131.asm @@ -34,8 +34,10 @@ Z180_CLKDIV .SET 1 ; Z180: CHK DIV: 0=OSC/2, 1=OSC, 2=OSC*2 Z180_MEMWAIT .SET 0 ; Z180: MEMORY WAIT STATES (0-3) Z180_IOWAIT .SET 1 ; Z180: I/O WAIT STATES TO ADD ABOVE 1 W/S BUILT-IN (0-3) ; +FPLED_ENABLE .SET FALSE ; FP: ENABLES FRONT PANEL LEDS +FPSW_ENABLE .SET FALSE ; FP: ENABLES FRONT PANEL SWITCHES +; LEDENABLE .SET TRUE ; ENABLE STATUS LED (SINGLE LED) -DIAGENABLE .SET FALSE ; ENABLES OUTPUT TO 8 BIT LED DIAGNOSTIC PORT ; DSRTCENABLE .SET FALSE ; DSRTC: ENABLE DS-1302 CLOCK DRIVER (DSRTC.ASM) INTRTCENABLE .SET TRUE ; ENABLE PERIODIC INTERRUPT CLOCK DRIVER (INTRTC.ASM) @@ -50,3 +52,4 @@ PPIDEENABLE .SET FALSE ; PPIDE: ENABLE PARALLEL PORT IDE DISK DRIVER (PPIDE.ASM SDENABLE .SET TRUE ; SD: ENABLE SD CARD DISK DRIVER (SD.ASM) SDMODE .SET SDMODE_SC ; SD: DRIVER MODE: SDMODE_[JUHA|N8|CSIO|PPI|UART|DSD|MK4|SC|MT|USR] SDCNT .SET 1 ; SD: NUMBER OF SD CARD DEVICES (1-2), FOR DSD & SC ONLY +CHENABLE .SET FALSE ; CH: ENABLE CH375/376 USB SUPPORT diff --git a/Source/HBIOS/Config/SCZ180_sc140.asm b/Source/HBIOS/Config/SCZ180_sc140.asm index 14dedad5..755975d4 100644 --- a/Source/HBIOS/Config/SCZ180_sc140.asm +++ b/Source/HBIOS/Config/SCZ180_sc140.asm @@ -34,9 +34,12 @@ Z180_CLKDIV .SET 1 ; Z180: CHK DIV: 0=OSC/2, 1=OSC, 2=OSC*2 Z180_MEMWAIT .SET 0 ; Z180: MEMORY WAIT STATES (0-3) Z180_IOWAIT .SET 1 ; Z180: I/O WAIT STATES TO ADD ABOVE 1 W/S BUILT-IN (0-3) ; +FPLED_ENABLE .SET TRUE ; FP: ENABLES FRONT PANEL LEDS +FPLED_IO .SET $A0 ; FP: PORT ADDRESS FOR FP LEDS +FPSW_ENABLE .SET TRUE ; FP: ENABLES FRONT PANEL SWITCHES +FPSW_IO .SET $A0 ; FP: PORT ADDRESS FOR FP SWITCHES +; LEDENABLE .SET TRUE ; ENABLE STATUS LED (SINGLE LED) -DIAGENABLE .SET TRUE ; ENABLES OUTPUT TO 8 BIT LED DIAGNOSTIC PORT -DIAGPORT .SET $A0 ; DIAGNOSTIC PORT ADDRESS ; DSRTCENABLE .SET TRUE ; DSRTC: ENABLE DS-1302 CLOCK DRIVER (DSRTC.ASM) INTRTCENABLE .SET TRUE ; ENABLE PERIODIC INTERRUPT CLOCK DRIVER (INTRTC.ASM) @@ -51,7 +54,7 @@ AYMODE .SET AYMODE_LINC ; AY: DRIVER MODE: AYMODE_[SCG|N8|RCZ80|RCZ180|MSX|LINC SN76489ENABLE .SET FALSE ; SN: ENABLE SN76489 SOUND DRIVER ; FDENABLE .SET TRUE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM) -FDMODE .SET FDMODE_RCWDC ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPWDC] +FDMODE .SET FDMODE_RCWDC ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPFDC] ; IDEENABLE .SET TRUE ; IDE: ENABLE IDE DISK DRIVER (IDE.ASM) PPIDEENABLE .SET TRUE ; PPIDE: ENABLE PARALLEL PORT IDE DISK DRIVER (PPIDE.ASM) diff --git a/Source/HBIOS/Config/SCZ180_sc503.asm b/Source/HBIOS/Config/SCZ180_sc503.asm index ac0070b5..543d2be7 100644 --- a/Source/HBIOS/Config/SCZ180_sc503.asm +++ b/Source/HBIOS/Config/SCZ180_sc503.asm @@ -34,9 +34,12 @@ Z180_CLKDIV .SET 1 ; Z180: CHK DIV: 0=OSC/2, 1=OSC, 2=OSC*2 Z180_MEMWAIT .SET 0 ; Z180: MEMORY WAIT STATES (0-3) Z180_IOWAIT .SET 1 ; Z180: I/O WAIT STATES TO ADD ABOVE 1 W/S BUILT-IN (0-3) ; +FPLED_ENABLE .SET TRUE ; FP: ENABLES FRONT PANEL LEDS +FPLED_IO .SET $A0 ; FP: PORT ADDRESS FOR FP LEDS +FPSW_ENABLE .SET TRUE ; FP: ENABLES FRONT PANEL SWITCHES +FPSW_IO .SET $A0 ; FP: PORT ADDRESS FOR FP SWITCHES +; LEDENABLE .SET TRUE ; ENABLE STATUS LED (SINGLE LED) -DIAGENABLE .SET TRUE ; ENABLES OUTPUT TO 8 BIT LED DIAGNOSTIC PORT -DIAGPORT .SET $A0 ; DIAGNOSTIC PORT ADDRESS ; DSRTCENABLE .SET TRUE ; DSRTC: ENABLE DS-1302 CLOCK DRIVER (DSRTC.ASM) INTRTCENABLE .SET TRUE ; ENABLE PERIODIC INTERRUPT CLOCK DRIVER (INTRTC.ASM) @@ -51,7 +54,7 @@ AYMODE .SET AYMODE_LINC ; AY: DRIVER MODE: AYMODE_[SCG|N8|RCZ80|RCZ180|MSX|LINC SN76489ENABLE .SET FALSE ; SN: ENABLE SN76489 SOUND DRIVER ; FDENABLE .SET TRUE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM) -FDMODE .SET FDMODE_RCWDC ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPWDC] +FDMODE .SET FDMODE_RCWDC ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPFDC] ; IDEENABLE .SET TRUE ; IDE: ENABLE IDE DISK DRIVER (IDE.ASM) PPIDEENABLE .SET TRUE ; PPIDE: ENABLE PARALLEL PORT IDE DISK DRIVER (PPIDE.ASM) diff --git a/Source/HBIOS/Config/SCZ180_sc700.asm b/Source/HBIOS/Config/SCZ180_sc700.asm new file mode 100644 index 00000000..9932cba2 --- /dev/null +++ b/Source/HBIOS/Config/SCZ180_sc700.asm @@ -0,0 +1,71 @@ +; +;================================================================================================== +; SC700 STANDARD CONFIGURATION +;================================================================================================== +; +; THE COMPLETE SET OF DEFAULT CONFIGURATION SETTINGS FOR THIS PLATFORM ARE FOUND IN THE +; CFG_.ASM INCLUDED FILE WHICH IS FOUND IN THE PARENT DIRECTORY. THIS FILE CONTAINS +; COMMON CONFIGURATION SETTINGS THAT OVERRIDE THE DEFAULTS. IT IS INTENDED THAT YOU MAKE +; YOUR CUSTOMIZATIONS IN THIS FILE AND JUST INHERIT ALL OTHER SETTINGS FROM THE DEFAULTS. +; EVEN BETTER, YOU CAN MAKE A COPY OF THIS FILE WITH A NAME LIKE _XXX.ASM AND SPECIFY +; YOUR FILE IN THE BUILD PROCESS. +; +; THE SETTINGS BELOW ARE THE SETTINGS THAT ARE MOST COMMONLY MODIFIED FOR THIS PLATFORM. +; MANY OF THEM ARE EQUAL TO THE SETTINGS IN THE INCLUDED FILE, SO THEY DON'T REALLY DO +; ANYTHING AS IS. THEY ARE LISTED HERE TO MAKE IT EASY FOR YOU TO ADJUST THE MOST COMMON +; SETTINGS. +; +; N.B., SINCE THE SETTINGS BELOW ARE REDEFINING VALUES ALREADY SET IN THE INCLUDED FILE, +; TASM INSISTS THAT YOU USE THE .SET OPERATOR AND NOT THE .EQU OPERATOR BELOW. ATTEMPTING +; TO REDEFINE A VALUE WITH .EQU BELOW WILL CAUSE TASM ERRORS! +; +; PLEASE REFER TO THE CUSTOM BUILD INSTRUCTIONS (README.TXT) IN THE SOURCE DIRECTORY (TWO +; DIRECTORIES ABOVE THIS ONE). +; +#DEFINE PLATFORM_NAME "Small Computer SC700", " [", CONFIG, "]" +; +#DEFINE BOOT_DEFAULT "H" ; DEFAULT BOOT LOADER CMD ON OR AUTO BOOT +; +#include "cfg_scz180.asm" +; +CPUOSC .SET 18432000 ; CPU OSC FREQ IN MHZ +CRTACT .SET FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP +; +Z180_CLKDIV .SET 1 ; Z180: CHK DIV: 0=OSC/2, 1=OSC, 2=OSC*2 +Z180_MEMWAIT .SET 0 ; Z180: MEMORY WAIT STATES (0-3) +Z180_IOWAIT .SET 1 ; Z180: I/O WAIT STATES TO ADD ABOVE 1 W/S BUILT-IN (0-3) +; +LEDENABLE .SET TRUE ; ENABLE STATUS LED (SINGLE LED) +LEDPORT .SET $0E ; STATUS LED PORT ADDRESS +; +FPLED_ENABLE .SET TRUE ; FP: ENABLES FRONT PANEL LEDS +FPLED_IO .SET $00 ; FP: PORT ADDRESS FOR FP LEDS +; +DSRTCENABLE .SET TRUE ; DSRTC: ENABLE DS-1302 CLOCK DRIVER (DSRTC.ASM) +INTRTCENABLE .SET TRUE ; ENABLE PERIODIC INTERRUPT CLOCK DRIVER (INTRTC.ASM) +; +UARTENABLE .SET TRUE ; UART: ENABLE 8250/16550-LIKE SERIAL DRIVER (UART.ASM) +ASCIENABLE .SET TRUE ; ASCI: ENABLE Z180 ASCI SERIAL DRIVER (ASCI.ASM) +ACIAENABLE .SET FALSE ; ACIA: ENABLE MOTOROLA 6850 ACIA DRIVER (ACIA.ASM) +SIOENABLE .SET TRUE ; SIO: ENABLE ZILOG SIO SERIAL DRIVER (SIO.ASM) +; +TMSENABLE .SET FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM) +TMSTIMENABLE .SET FALSE ; TMS: ENABLE TIMER INTERRUPTS (REQUIRES IM1) +TMSMODE .SET TMSMODE_MSX ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|MSX9958|MSXKBD|COLECO] +MKYENABLE .SET FALSE ; MSX 5255 PPI KEYBOARD COMPATIBLE DRIVER (REQUIRES TMS VDA DRIVER) +VDAEMU_SERKBD .SET 0 ; VDA EMULATION: SERIAL KBD UNIT #, OR $FF FOR HW KBD +; +AY38910ENABLE .SET TRUE ; AY: AY-3-8910 / YM2149 SOUND DRIVER +AYMODE .SET AYMODE_RCZ180 ; AY: DRIVER MODE: AYMODE_[SCG|N8|RCZ80|RCZ180|MSX|LINC] +SN76489ENABLE .SET FALSE ; SN: ENABLE SN76489 SOUND DRIVER +; +FDENABLE .SET TRUE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM) +FDMODE .SET FDMODE_RCWDC ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPWDC] +; +IDEENABLE .SET TRUE ; IDE: ENABLE IDE DISK DRIVER (IDE.ASM) +PPIDEENABLE .SET TRUE ; PPIDE: ENABLE PARALLEL PORT IDE DISK DRIVER (PPIDE.ASM) +SDENABLE .SET TRUE ; SD: ENABLE SD CARD DISK DRIVER (SD.ASM) +SDMODE .SET SDMODE_SC ; SD: DRIVER MODE: SDMODE_[JUHA|N8|CSIO|PPI|UART|DSD|MK4|SC|MT|USR] +SDCNT .SET 1 ; SD: NUMBER OF SD CARD DEVICES (1-2), FOR DSD & SC ONLY +; +PRPENABLE .SET FALSE ; PRP: ENABLE ECB PROPELLER IO BOARD DRIVER (PRP.ASM) diff --git a/Source/HBIOS/Config/Z80RETRO_std.asm b/Source/HBIOS/Config/Z80RETRO_std.asm new file mode 100644 index 00000000..29475b6a --- /dev/null +++ b/Source/HBIOS/Config/Z80RETRO_std.asm @@ -0,0 +1,35 @@ +; +;================================================================================================== +; ZETA2 STANDARD CONFIGURATION +;================================================================================================== +; +; THE COMPLETE SET OF DEFAULT CONFIGURATION SETTINGS FOR THIS PLATFORM ARE FOUND IN THE +; CFG_.ASM INCLUDED FILE WHICH IS FOUND IN THE PARENT DIRECTORY. THIS FILE CONTAINS +; COMMON CONFIGURATION SETTINGS THAT OVERRIDE THE DEFAULTS. IT IS INTENDED THAT YOU MAKE +; YOUR CUSTOMIZATIONS IN THIS FILE AND JUST INHERIT ALL OTHER SETTINGS FROM THE DEFAULTS. +; EVEN BETTER, YOU CAN MAKE A COPY OF THIS FILE WITH A NAME LIKE _XXX.ASM AND SPECIFY +; YOUR FILE IN THE BUILD PROCESS. +; +; THE SETTINGS BELOW ARE THE SETTINGS THAT ARE MOST COMMONLY MODIFIED FOR THIS PLATFORM. +; MANY OF THEM ARE EQUAL TO THE SETTINGS IN THE INCLUDED FILE, SO THEY DON'T REALLY DO +; ANYTHING AS IS. THEY ARE LISTED HERE TO MAKE IT EASY FOR YOU TO ADJUST THE MOST COMMON +; SETTINGS. +; +; N.B., SINCE THE SETTINGS BELOW ARE REDEFINING VALUES ALREADY SET IN THE INCLUDED FILE, +; TASM INSISTS THAT YOU USE THE .SET OPERATOR AND NOT THE .EQU OPERATOR BELOW. ATTEMPTING +; TO REDEFINE A VALUE WITH .EQU BELOW WILL CAUSE TASM ERRORS! +; +; PLEASE REFER TO THE CUSTOM BUILD INSTRUCTIONS (README.TXT) IN THE SOURCE DIRECTORY (TWO +; DIRECTORIES ABOVE THIS ONE). +; +#DEFINE BOOT_DEFAULT "H" ; DEFAULT BOOT LOADER CMD ON OR AUTO BOOT +; +#include "cfg_z80retro.asm" +; +CPUOSC .SET 14745600 ; CPU OSC FREQ IN MHZ +INTMODE .SET 2 ; INTERRUPTS: 0=NONE, 1=MODE 1, 2=MODE 2 +CRTACT .SET FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP +; +UARTENABLE .SET FALSE ; UART: ENABLE 8250/16550-LIKE SERIAL DRIVER (UART.ASM) +; +SDENABLE .SET TRUE ; SD: ENABLE SD CARD DISK DRIVER (SD.ASM) diff --git a/Source/HBIOS/Config/ZETA2_std.asm b/Source/HBIOS/Config/ZETA2_std.asm index 8efe0575..0245bfd5 100644 --- a/Source/HBIOS/Config/ZETA2_std.asm +++ b/Source/HBIOS/Config/ZETA2_std.asm @@ -31,11 +31,10 @@ INTMODE .SET 2 ; INTERRUPTS: 0=NONE, 1=MODE 1, 2=MODE 2 CRTACT .SET TRUE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP ; UARTENABLE .SET TRUE ; UART: ENABLE 8250/16550-LIKE SERIAL DRIVER (UART.ASM) -;UARTCFG .SET UARTCFG | SER_RTS UARTSBC .SET TRUE ; UART: AUTO-DETECT SBC/ZETA ONBOARD UART ; FDENABLE .SET TRUE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM) -FDMODE .SET FDMODE_ZETA2 ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPWDC] +FDMODE .SET FDMODE_ZETA2 ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPFDC] ; PPIDEENABLE .SET FALSE ; PPIDE: ENABLE PARALLEL PORT IDE DISK DRIVER (PPIDE.ASM) SDENABLE .SET FALSE ; SD: ENABLE SD CARD DISK DRIVER (SD.ASM) diff --git a/Source/HBIOS/Config/ZETA_std.asm b/Source/HBIOS/Config/ZETA_std.asm index 2b44c968..d422cab9 100644 --- a/Source/HBIOS/Config/ZETA_std.asm +++ b/Source/HBIOS/Config/ZETA_std.asm @@ -26,16 +26,15 @@ ; #include "cfg_zeta.asm" ; -CPUOSC .SET 20000000 ; CPU OSC FREQ IN MHZ +CPUOSC .SET 8000000 ; CPU OSC FREQ IN MHZ INTMODE .SET 0 ; INTERRUPTS: 0=NONE, 1=MODE 1, 2=MODE 2 CRTACT .SET TRUE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP ; UARTENABLE .SET TRUE ; UART: ENABLE 8250/16550-LIKE SERIAL DRIVER (UART.ASM) -;UARTCFG .SET UARTCFG | SER_RTS UARTSBC .SET TRUE ; UART: AUTO-DETECT SBC/ZETA ONBOARD UART ; FDENABLE .SET TRUE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM) -FDMODE .SET FDMODE_ZETA ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPWDC] +FDMODE .SET FDMODE_ZETA ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPFDC] ; PPIDEENABLE .SET FALSE ; PPIDE: ENABLE PARALLEL PORT IDE DISK DRIVER (PPIDE.ASM) SDENABLE .SET FALSE ; SD: ENABLE SD CARD DISK DRIVER (SD.ASM) diff --git a/Source/HBIOS/Makefile b/Source/HBIOS/Makefile index f002e93b..1d4b6c64 100644 --- a/Source/HBIOS/Makefile +++ b/Source/HBIOS/Makefile @@ -6,7 +6,7 @@ MOREDIFF = game.bin hbios_rom.bin nascom.bin usrrom.bin \ SUBDIRS = DEST = ../../Binary TOOLS =../../Tools -OTHERS = *.img *.rom *.com *.upd *.bin *.z80 cpm.sys zsys.sys Build.inc font*.asm *.dat hbios_env.sh +OTHERS = *.img *.rom *.com *.upd *.bin *.hex cpm.sys zsys.sys Build.inc font*.asm *.dat hbios_env.sh # DIFFMAKE = 1 @@ -24,7 +24,8 @@ endif include $(TOOLS)/Makefile.inc -FONTS := font8x11c.asm font8x11u.asm font8x16c.asm font8x16u.asm font8x8c.asm font8x8u.asm fontcgac.asm fontcgau.asm +FONTS := font8x11c.asm font8x11u.asm font8x16c.asm font8x16u.asm font8x8c.asm font8x8u.asm \ + fontcgac.asm fontcgau.asm fontvgarcc.asm fontvgarcu.asm ifeq ($(CPUFAM),2) TASM=$(BINDIR)/uz80as -t hd64180 @@ -42,12 +43,17 @@ else BIOS=wbw endif +ifeq ($(ROM_PLATFORM),S100) + ROMDEPS += s100mon.bin +endif + ROMNAME=${ROM_PLATFORM}_${ROM_CONFIG} # $(info DEPS=$(DEPS)) # $(info ROM_PLATFORM=$(ROM_PLATFORM)) # $(info ROM_CONFIG=$(ROM_CONFIG)) # $(info ROMSIZE=$(ROMSIZE)) +# $(info RAMSIZE=$(RAMSIZE)) # $(info ROMNAME=$(ROMNAME)) # $(info CPUFAM=$(CPUFAM)) # $(info TASM=$(TASM)) @@ -57,12 +63,14 @@ $(OBJECTS) : $(ROMDEPS) cat romldr.bin dbgmon.bin ../ZSDOS/zsys_$(BIOS).bin >osimg_small.bin if [ $(ROM_PLATFORM) != UNA ] ; then \ cat camel80.bin nascom.bin tastybasic.bin game.bin eastaegg.bin netboot.mod updater.bin usrrom.bin >osimg1.bin ; \ - cat imgpad2.bin >osimg2.bin ; \ - if [ $(ROMSIZE) -gt 0 ] ; then \ - for f in hbios_rom.bin osimg.bin osimg1.bin osimg2.bin ; do \ - srec_cat $$f -Binary -Crop 0 0x7FFF -Checksum_Negative_Big_Endian 0x7FFF 1 1 -o $$f -Binary ; \ - done \ - fi \ + if [ $(ROM_PLATFORM) = S100 ] ; then \ + cat s100mon.bin >osimg2.bin ; \ + else \ + cat imgpad2.bin >osimg2.bin ; \ + fi ; \ + for f in hbios_rom.bin osimg.bin osimg1.bin osimg2.bin ; do \ + srec_cat $$f -Binary -Crop 0 0x7FFF -Checksum_Negative_Big_Endian 0x7FFF 1 1 -o $$f -Binary ; \ + done \ fi if [ $(ROM_PLATFORM) = UNA ] ; then \ cp osimg.bin $(DEST)/UNA_WBW_SYS.bin ; \ @@ -74,8 +82,8 @@ $(OBJECTS) : $(ROMDEPS) cat hbios_rom.bin osimg.bin osimg1.bin osimg2.bin >$(ROMNAME).upd ; \ cat hbios_app.bin osimg_small.bin > $(ROMNAME).com ; \ else \ - cat hbios_rom.bin osimg_small.bin > $(ROMNAME).rom ; \ - cat hbios_rom.bin osimg_small.bin > $(ROMNAME).upd ; \ + cat hbios_rom.bin osimg.bin osimg1.bin osimg2.bin ../RomDsk/ram$(RAMSIZE)_wbw.dat >$(ROMNAME).rom ; \ + cat hbios_rom.bin osimg.bin osimg1.bin osimg2.bin >$(ROMNAME).upd ; \ cat hbios_app.bin osimg_small.bin > $(ROMNAME).com ; \ fi \ fi @@ -88,6 +96,10 @@ font%.asm: camel80.bin: cp ../Forth/$@ . +s100mon.bin: + $(ZXCC) $(CPM)/SLR180 -s100mon/FH + $(ZXCC) $(CPM)/MLOAD25 -s100mon.bin=s100mon + tastybasic.bin: cp ../TastyBasic/src/$@ . diff --git a/Source/HBIOS/Makefile.new b/Source/HBIOS/Makefile.new new file mode 100644 index 00000000..7e98efdb --- /dev/null +++ b/Source/HBIOS/Makefile.new @@ -0,0 +1,132 @@ +DIST_OBJECTS := \ + DYNO_std MK4_std N8_std RCZ180_ext RCZ180_nat RCZ180_z1rcc \ + RCZ280_ext RCZ280_nat RCZ280_zz80mb RCZ280_zzrcc RCZ280_zzrcc_ram \ + RCZ80_std RCZ80_kio RCZ80_easy RCZ80_tiny RCZ80_skz RCZ80_zrc \ + RCZ80_zrc_ram RCZ80_zrc512 RPH_std SBC_std SBC_simh MBC_std \ + DUO_std SCZ180_sc126 SCZ180_sc130 SCZ180_sc131 SCZ180_sc140 \ + SCZ180_sc503 SCZ180_sc700 S100_std UNA_std Z80RETRO_std \ + ZETA_std ZETA2_std HEATH_std EPITX_std +# RCZ80_mt RCZ80_duart MON_std + +OBJECTS := $(DIST_OBJECTS) +OBJECTS := SBC_std MK4_std UNA_std S100_std +OBJECTS := $(OBJECTS:=.rom) $(OBJECTS:=.com) $(OBJECTS:=.upd) +OBJECTS := $(filter-out UNA_%.com UNA_%.upd,$(OBJECTS)) + +DEST = ../../Binary +TOOLS = ../../Tools +OTHERS := *.img *.rom *.com *.upd *.bin *.hex cpm.sys zsys.sys build.inc +OTHERS += *.build.inc font*.asm *.dat hbios_env.sh + +FONTS := font8x11c.asm font8x11u.asm font8x16c.asm font8x16u.asm +FONTS += font8x8c.asm font8x8u.asm fontcgac.asm fontcgau.asm +FONTS += fontvgarcc.asm fontvgarcu.asm + +BUILD_COMPONENT = \ + cp $(*F).build.inc build.inc ; \ + $(TASM) $(TASMFLAGS) $< $@ $(@:.bin=.lst) ; \ + rm build.inc + +SHELL=/bin/bash + +include $(TOOLS)/Makefile.inc + +font%.asm: + cp ../Fonts/$@ . + +camel80.bin: + cp ../Forth/$@ . + +tastybasic.bin: + cp ../TastyBasic/src/$@ . + +s100mon.bin: + $(ZXCC) $(CPM)/SLR180 -s100mon/FH + $(ZXCC) $(CPM)/MLOAD25 -s100mon.bin=s100mon + +%.build.inc: + echo $@ + echo "; RomWBW Configured for $(*F) at $$(date +%Y-%m-%d)" >>$@ + echo ";" >>$@ + echo "#DEFINE TIMESTAMP \"$$(date +%Y-%m-%d)\"" >>$@ + echo "#DEFINE CONFIG \"$(*F)\"" >>$@ + echo ";" >>$@ + echo "#INCLUDE \"Config/$(*F).asm\"" >>$@ + echo ";" >>$@ + cat $@ + +%.usrrom.bin: usrrom.asm %.build.inc ; $(BUILD_COMPONENT) +%.updater.bin: updater.asm %.build.inc ; $(BUILD_COMPONENT) +%.eastaegg.bin: eastaegg.asm %.build.inc ; $(BUILD_COMPONENT) +%.game.bin: game.asm %.build.inc ; $(BUILD_COMPONENT) +%.nascom.bin: nascom.asm %.build.inc ; $(BUILD_COMPONENT) +%.romldr.bin: romldr.asm %.build.inc ; $(BUILD_COMPONENT) +%.dbgmon.bin: dbgmon.asm %.build.inc ; $(BUILD_COMPONENT) + +%.hbios_env.com: hbios_env.asm %.build.inc + cp $(*F).build.inc build.inc + $(TASM) $(TASMFLAGS) -dBASH $< $@ $(@:.com=.lst) + rm build.inc + +%.hbios_env.sh: %.hbios_env.com + $(ZXCC) $< >$@ + +%.hbios_rom.bin: hbios.asm %.build.inc %.hbios_env.sh $(FONTS) + . ./$(*F).hbios_env.sh ; \ + TARGETS=("" "z80" "hd64180" "z280") ; \ + CPU=$${TARGETS[$$CPUFAM]} ; \ + cp $(*F).build.inc build.inc ; \ + $(BINDIR)/uz80as -t $$CPU -dROMBOOT $< $@ $(@:.bin=.lst) ; \ + srec_cat $@ -Binary -Crop 0 0x7FFF -Checksum_Negative_Big_Endian 0x7FFF 1 1 -o $@ -Binary ; \ + rm build.inc + +%.hbios_app.bin: hbios.asm %.build.inc %.hbios_env.sh $(FONTS) + . ./$(*F).hbios_env.sh ; \ + TARGETS=("" "z80" "hd64180" "z280") ; \ + CPU=$${TARGETS[$$CPUFAM]} ; \ + cp $(*F).build.inc build.inc ; \ + $(BINDIR)/uz80as -t $$CPU -dAPPBOOT $< $@ $(@:.bin=.lst) ; \ + rm build.inc + +UNA_%.osimg.bin: UNA_%.romldr.bin UNA_%.dbgmon.bin + cat UNA_$(*F).romldr.bin UNA_$(*F).dbgmon.bin ../ZSDOS/zsys_una.bin ../CPM22/cpm_una.bin >$@ + srec_cat $@ -Binary -Crop 0 0x7FFF -Checksum_Negative_Big_Endian 0x7FFF 1 1 -o $@ -Binary + +%.osimg.bin: %.romldr.bin %.dbgmon.bin + cat $(*F).romldr.bin $(*F).dbgmon.bin ../ZSDOS/zsys_wbw.bin ../CPM22/cpm_wbw.bin >$@ + srec_cat $@ -Binary -Crop 0 0x7FFF -Checksum_Negative_Big_Endian 0x7FFF 1 1 -o $@ -Binary + +%.osimg_small.bin: %.romldr.bin %.dbgmon.bin + cat $(*F).romldr.bin $(*F).dbgmon.bin ../ZSDOS/zsys_wbw.bin >$@ + +%.osimg1.bin: camel80.bin %.nascom.bin tastybasic.bin %.game.bin %.eastaegg.bin netboot.mod %.updater.bin %.usrrom.bin + cat camel80.bin $(*F).nascom.bin tastybasic.bin $(*F).game.bin $(*F).eastaegg.bin netboot.mod $(*F).updater.bin $(*F).usrrom.bin >$@ + srec_cat $@ -Binary -Crop 0 0x7FFF -Checksum_Negative_Big_Endian 0x7FFF 1 1 -o $@ -Binary + +%.imgpad2.bin: imgpad2.asm %.build.inc + cp $(*F).build.inc build.inc + $(TASM) $(TASMFLAGS) $< $@ $(@:.bin=.lst) + srec_cat $@ -Binary -Crop 0 0x7FFF -Checksum_Negative_Big_Endian 0x7FFF 1 1 -o $@ -Binary + rm build.inc + +S100_%.imgpad2.bin: s100mon.bin + cp $< $@ + srec_cat $@ -Binary -Crop 0 0x7FFF -Checksum_Negative_Big_Endian 0x7FFF 1 1 -o $@ -Binary + +UNA_%.rom: UNA_%.osimg.bin UNA_%.hbios_env.sh + . ./UNA_$(*F).hbios_env.sh ; \ + cat ../UBIOS/UNA-BIOS.BIN UNA_$(*F).osimg.bin ../UBIOS/FSFAT.BIN ../RomDsk/rom$${ROMSIZE}_una.dat >$@ ; \ + cp UNA_$(*F).osimg.bin $(DEST)/UNA_WBW_SYS.bin ; \ + cp ../RomDsk/rom$${ROMSIZE}_una.dat $(DEST)/UNA_WBW_ROM$${ROMSIZE}.bin + +%.rom: %.hbios_rom.bin %.osimg.bin %.osimg1.bin %.imgpad2.bin %.hbios_env.sh + . ./$(*F).hbios_env.sh ; \ + if [ $$ROMSIZE -gt 0 ] ; then RD="rom$$ROMSIZE" ; else RD="ram$$RAMSIZE" ; fi ; \ + cat $(*F).hbios_rom.bin $(*F).osimg.bin $(*F).osimg1.bin $(*F).imgpad2.bin ../RomDsk/$${RD}_wbw.dat >$@ + +%.com: %.hbios_app.bin %.osimg_small.bin + cat $(*F).hbios_app.bin $(*F).osimg_small.bin >$@ + +%.upd: %.hbios_rom.bin %.osimg.bin %.osimg1.bin %.imgpad2.bin + cat $(*F).hbios_rom.bin $(*F).osimg.bin $(*F).osimg1.bin $(*F).imgpad2.bin >$@ + diff --git a/Source/HBIOS/ROM Layout.txt b/Source/HBIOS/ROM Layout.txt deleted file mode 100644 index c15694a3..00000000 --- a/Source/HBIOS/ROM Layout.txt +++ /dev/null @@ -1,27 +0,0 @@ -RomWBW ROM Layout Notes - -Bank Module Start Size ------- ------ ------ ------ -0 hbios 0x0000 0x8000 - 0x8000 - -1 loader 0x0000 0x1000 - dbgmon 0x1000 0x2000 - cpm22 0x2000 0x3000 - zsys 0x5000 0x3000 - 0x8000 - -2 forth 0x0000 0x1700 - basic 0x1700 0x2000 - tbasic 0x3700 0x0900 - game 0x4000 0x0900 - egg 0x4900 0x0200 - netboot 0x4B00 0x1000 - updater 0x5B00 0x0D00 - usrrom 0x6800 0x1800 - 0x8000 - -3 imgpad2 0x0000 0x8000 - 0x8000 - -4-N ROM Disk Data \ No newline at end of file diff --git a/Source/HBIOS/acia.asm b/Source/HBIOS/acia.asm index f670298c..8c24da9e 100644 --- a/Source/HBIOS/acia.asm +++ b/Source/HBIOS/acia.asm @@ -178,10 +178,26 @@ ACIA1_INT: ; ACIA_INTRCV: ; CHECK TO SEE IF SOMETHING IS ACTUALLY THERE + CALL DELAY LD C,(IY+3) ; CMD/STAT PORT TO C IN A,(C) ; GET STATUS - RRA ; READY BIT TO CF - RET NC ; NOTHING AVAILABLE ON CURRENT CHANNEL + LD B,A + AND $01 ; ISOLATE READY BIT + JR NZ,ACIA_INTRCV1 +; +#IF FALSE + CALL PC_LT + LD A,B + CALL PRTHEXBYTE + INC C + IN A,(C) + CALL PRTHEXBYTE + CALL PC_GT + OR $FF +#ENDIF +; + RET + ; ACIA_INTRCV1: ; RECEIVE CHARACTER INTO BUFFER @@ -701,6 +717,13 @@ ACIA0_CFG: .DW ACIA0_INT ; INT HANDLER POINTER .DW (ACIA0CLK / ACIA0DIV) & $FFFF ; CLOCK FREQ AS .DW (ACIA0CLK / ACIA0DIV) >> 16 ; ... DWORD VALUE +; + .ECHO "ACIA: IO=" + .ECHO ACIA0BASE +#IF (INTMODE == 1) + .ECHO ", INTERRUPTS ENABLED" +#ENDIF + .ECHO "\n" ; ACIA_CFGSIZ .EQU $ - ACIA_CFG ; SIZE OF ONE CFG TABLE ENTRY ; @@ -717,6 +740,13 @@ ACIA1_CFG: .DW ACIA1_INT ; INT HANDLER POINTER .DW (ACIA1CLK / ACIA1DIV) & $FFFF ; CLOCK FREQ AS .DW (ACIA1CLK / ACIA1DIV) >> 16 ; ... DWORD VALUE +; + .ECHO "ACIA: IO=" + .ECHO ACIA1BASE +#IF (INTMODE == 1) + .ECHO ", INTERRUPTS ENABLED" +#ENDIF + .ECHO "\n" ; #ENDIF ; diff --git a/Source/HBIOS/ansi.asm b/Source/HBIOS/ansi.asm index a761542d..50fbc9e6 100644 --- a/Source/HBIOS/ansi.asm +++ b/Source/HBIOS/ansi.asm @@ -3,6 +3,10 @@ ; ANSI EMULATION MODULE ;================================================================================================== ; +; ENHANCED BY: JOSE L. COLLADO -- 12/21/2023 - +; NEW ANSI PRIVATE SEQUENCE TO INIT VDU AND CHANGE DEFAULT COLORS +; (SEE ANSI CONTROL SEQUENCE DISPATCHING SECTION BELOW FOR DETAILS) +; ; TODO: ; 1) INSERT/DELETE CHARACTERS CTL SEQUENCES ; 2) OTHER CTL SEQUENCES? @@ -61,6 +65,7 @@ ANSI_RESET: LD (ANSI_ATTR),A ; CLEAR ATTRIBUTES LD A,ANSI_DEFCOLOR ; DEFAULT COLOR LD (ANSI_COLOR),A ; RESET COLOR + LD (ANSI_SCOLOR),A ; RESET SCREEN COLOR XOR A ; ZERO ACCUM LD (ANSI_WRAP),A ; CLEAR WRAP FLAG LD (ANSI_LNM),A ; SET LINE FEED NEW LINE MODE @@ -385,6 +390,17 @@ ANSI_ESCDISP2: ; ESC DISPATCHING FOR '#' INT CHAR ; ANSI CONTROL SEQUENCE DISPATCHING ;================================================================================================== ; +;-------------------------------------------------------------------------------------------------- +; ### JLC Mod - NEW ANSI PRIVATE SEQUENCE TO INIT VDU AND CHANGE DEFAULT COLORS ### +;-------------------------------------------------------------------------------------------------- +; Follows ANSI Standards described in VT100.net for Private Sequences. +; Implements the ESC Seq.: \ESC[{Num1};{Num2}'{' where '{' is the final char of new Private Sequence. +; Initializes the VDU and Changes Default Colors according to the following table: +; {Num1}: 30..37 - Foreground color (black, red, green, yellow, blue, magenta, cyan, white) +; {Num2}: 40..47 - Background color (black, red, green, yellow, blue, magenta, cyan, white) +; +; Example: \ESC[37;44{ sets text to white on blue background, \ESC[0{ returns to default colors. +; ANSI_CTLDISP: LD (ANSI_FINAL),A ; RECORD THE FINAL CHARACTER #IF (ANSITRACE >= 2) @@ -453,6 +469,11 @@ ANSI_STD1: ; DISPATCH FOR FINAL CHAR W/ NO INTERMEDIATE CHAR AND NO PRIVATE CHAR CP 'm' ; SGR: SELECT GRAPHIC RENDITION JP Z,ANSI_SGR ; CHECK FOR ANY OTHERS HERE + ; ### JLC Mod - New Private Sequence with Parameters checked here... + CP '{' ; SSC: SET SCREEN COLORS + JP Z,ANSI_SSC + ; + ; ANY OTHERS ARE IGNORED JR ANSI_UNK ; UNKNOWN, ABORT ; ANSI_DEC: ; DISPATCH ON INTERMEDIATE CHAR W/ PRIVATE CHAR = '?' (DEC) @@ -634,9 +655,9 @@ ANSI_BEL: ANSI_BS: LD A,(ANSI_COL) ; GET CURRENT COLUMN DEC A ; BACK IT UP BY ONE - RET C ; IF CARRY, MARGIN EXCEEDED, ABORT + RET M ; IF CARRY, MARGIN EXCEEDED, ABORT LD (ANSI_COL),A ; SAVE NEW COLUMN - JP ANSI_XY ; UDPATE CUSROR AND RETURN + JP ANSI_XY ; UDPATE CURSOR AND RETURN ; ANSI_CR: XOR A ; ZERO ACCUM @@ -1147,14 +1168,15 @@ ANSI_SGR1: ; PROCESSING LOOP INC HL ; POINT TO NEXT PARM DJNZ ANSI_SGR1 ; LOOP TILL DONE ; - ; NOW IMPLEMENT ALL CHANGES + ; NOW IMPLEMENT ALL CHANGES FOR SGR LD A,(ANSI_ATTR) ; GET THE ATTRIBUTE VALUE LD E,A ; MOVE TO E LD B,BF_VDASAT ; SET ATTRIBUTE FUNCTION CALL ANSI_VDADISP ; CALL THE FUNCTION LD A,(ANSI_COLOR) ; GET THE COLOR VALUE LD E,A ; MOVE TO E - LD B,BF_VDASCO ; SET ATTRIBUTE FUNCTION + LD D,0 ; SET INDIVIDUAL CHAR COLORS + LD B,BF_VDASCO ; SET COLOR FUNCTION CALL ANSI_VDADISP ; CALL THE FUNCTION RET ; RETURN ; @@ -1234,6 +1256,81 @@ ANSI_SGR_BG: ; ; ; +;...................................................................................... +; ### JLC Mod - Implement new Private Sequence to call VDASCO and Change Default Colors +; +ANSI_SSC: ; SET SCREEN COLOR (CUSTOM EXTENSION) + LD A,(ANSI_PARIDX) ; GET CURRENT PARM INDEX + INC A ; INC TO MAKE IT THE COUNT + LD B,A ; B IS NOW LOOP COUNTER + LD HL,ANSI_PARLST ; HL POINTS TO START OF PARM LIST +; +ANSI_SSC1: ; PROCESSING LOOP + PUSH BC ; PRESERVE BC + PUSH HL ; PRESERVE HL + LD A,(HL) + CALL ANSI_SSC2 ; HANDLE PARM + POP HL ; RESTORE HL + POP BC ; RESTORE BC + INC HL ; POINT TO NEXT PARM + DJNZ ANSI_SSC1 ; LOOP TILL DONE +; + ; NOW IMPLEMENT ALL CHANGES FOR SSC + LD A,(ANSI_SCOLOR) ; GET THE COLOR VALUE + LD E,A ; MOVE TO E + LD D,1 ; SET SCREEN COLORS + LD B,BF_VDASCO ; SET COLOR FUNCTION + CALL ANSI_VDADISP ; CALL THE FUNCTION + RET ; RETURN +; +ANSI_SSC2: ; HANDLE THE REQUEST CODE + CP 0 ; ALL OFF + JR Z,ANSI_SSC_OFF ; DO IT + CP 30 ; START OF FOREGROUND + RET C ; OUT OF RANGE + CP 38 ; END OF RANGE + JR C,ANSI_SSC_FG ; SET FOREGROUND + CP 40 ; START OF BACKGROUND + RET C ; OUT OF RANGE + CP 48 ; END OF RANGE + JR C,ANSI_SSC_BG ; SET BACKGROUND + RET ; OTHERWISE OUT OF RANGE +; +ANSI_SSC_OFF: + LD A,ANSI_DEFCOLOR ; DEFAULT COLOR + LD (ANSI_SCOLOR),A ; RESET COLOR + RET +; +ANSI_SSC_BOLD: + LD A,(ANSI_SCOLOR) ; LOAD CURRENT COLOR + OR %00001000 ; SET BOLD BIT + LD (ANSI_SCOLOR),A ; SAVE IT + RET +; +ANSI_SSC_FG: + SUB 30 + LD E,A + LD A,(ANSI_SCOLOR) + AND %11111000 + OR E + LD (ANSI_SCOLOR),A + RET +; +ANSI_SSC_BG: + SUB 40 + RLCA + RLCA + RLCA + RLCA + LD E,A + LD A,(ANSI_SCOLOR) + AND %10001111 + OR E + LD (ANSI_SCOLOR),A + RET +; +; +; ANSI_DECALN: ; DEC SCREEN ALIGNMENT TEST LD DE,0 ; PREPARE TO HOME CURSOR LD (ANSI_POS),DE ; SAVE NEW CURSOR POSITION @@ -1394,7 +1491,8 @@ ANSI_ROWS .DB 24 ; NUMBER OF ROWS ON SCREEN ; ANSI_STATE .DW PANIC ; CURRENT FUNCTION FOR STATE MACHINE ANSI_ATTR .DB ANSI_DEFATTR ; CURRENT CHARACTER ATTRIBUTE -ANSI_COLOR .DB ANSI_DEFCOLOR ; CURRENT CHARACTER COLOR; +ANSI_COLOR .DB ANSI_DEFCOLOR ; CURRENT CHARACTER FG/BG COLOR +ANSI_SCOLOR .DB ANSI_DEFCOLOR ; CURRENT SCREEN FG/BG COLOR ANSI_WRAP .DB 0 ; WRAP PENDING FLAG ANSI_TABS .FILL 32,0 ; TAB STOP BIT MAP (256 BITS) ANSI_LNM .DB 0 ; LINE FEED NEW LINE MODE FLAG @@ -1415,3 +1513,25 @@ ANSI_VARLEN .EQU $ - ANSI_VARS ; ANSI_VDAUNIT .DB $FF ; VIDEO UNIT NUM OF ATTACHED VDA DEVICE ANSI_DEVNUM .DB $FF ; TERMINAL DEVICE NUMBER +; +;============================================================= +; BASIC ANSI COLOR TABLE (NIBBLES FOR FOREGROUND & BACKGROUND) +; ------------------------------------------------------------ +; 0 Black +; 1 Red +; 2 Green +; 3 Brown +; 4 Blue +; 5 Magenta +; 6 Cyan +; 7 White +; 8 Gray +; 9 Light Red +; A Light Green +; B Yellow +; C Light Blue +; D Light Magenta +; E Light Cyan +; F Bright White +;============================================================= +; \ No newline at end of file diff --git a/Source/HBIOS/asci.asm b/Source/HBIOS/asci.asm index 2d118f7b..eb5d737f 100644 --- a/Source/HBIOS/asci.asm +++ b/Source/HBIOS/asci.asm @@ -53,7 +53,7 @@ ; ASEXT: ; 7 6 5 4 3 2 1 0 ; R D C X B F D S -; 0 1 1 0 0 1 1 0 DEFAULT VALUES +; 0 1 1 0 0 0 0 0 DEFAULT VALUES ; | | | | | | | | ; | | | | | | | +-- SEND BREAK ; | | | | | | +---- BREAK DETECT (RO) @@ -64,6 +64,10 @@ ; | +-------------- DCD0 DISABLE ; +---------------- RDRF INT INHIBIT ; +ASCI_DEF_CNTLA .EQU $64 +ASCI_DEF_CNTLB .EQU $20 +ASCI_DEF_ASEXT .EQU $60 +; ASCI_BUFSZ .EQU 32 ; RECEIVE RING BUFFER SIZE ; ASCI_NONE .EQU 0 ; NOT PRESENT @@ -77,7 +81,7 @@ ASCI_RTS .EQU %00010000 ; ~RTS BIT OF CNTLA REG ; #IF (ASCIINTS) ; - #IF (INTMODE == 2) + #IF (INTMODE > 0) ; ASCI0_IVT .EQU IVT(INT_SER0) ASCI1_IVT .EQU IVT(INT_SER1) @@ -121,25 +125,19 @@ ASCI_PREINIT2: ; #IF (ASCIINTS) ; - #IF (INTMODE >= 1) +; Z180 ASCI INTERRUPTS OPERATE LIKE IM2 EVEN WHEN IM1 IS ACTIVE. +; + #IF (INTMODE > 0) ; SETUP INT VECTORS AS APPROPRIATE LD A,(ASCI_DEV) ; GET DEVICE COUNT OR A ; SET FLAGS JR Z,ASCI_PREINIT3 ; IF ZERO, NO ASCI DEVICES, ABORT ; - #IF (INTMODE == 1) - ; ADD IM1 INT CALL LIST ENTRY - LD HL,ASCI_INT ; GET INT VECTOR - CALL HB_ADDIM1 ; ADD TO IM1 CALL LIST - #ENDIF -; - #IF (INTMODE == 2) ; SETUP IM2 VECTORS LD HL,ASCI_INT0 LD (ASCI0_IVT),HL ; IVT INDEX LD HL,ASCI_INT1 LD (ASCI1_IVT),HL ; IVT INDEX - #ENDIF ; #ENDIF ; @@ -200,24 +198,6 @@ ASCI_INIT1: ; #IF (INTMODE > 0) ; -; IM1 ENTRY POINT -; -ASCI_INT: - ; CHECK/HANDLE FIRST PORT - LD A,(ASCI0_CFG + 1) ; GET ASCI TYPE FOR FIRST ASCI - OR A ; SET FLAGS - CALL NZ,ASCI_INT0 ; CALL IF EXISTS - RET NZ ; DONE IF INT HANDLED -; - ; CHECK/HANDLE SECOND PORT - LD A,(ASCI1_CFG + 1) ; GET ASCI TYPE FOR SECOND ASCI - OR A ; SET FLAGS - CALL NZ,ASCI_INT1 ; CALL IF EXISTS -; - RET ; DONE -; -; IM2 ENTRY POINTS -; ASCI_INT0: ; INTERRUPT HANDLER FOR FIRST ASCI (ASCI0) LD IY,ASCI0_CFG ; POINT TO ASCI0 CFG @@ -513,17 +493,29 @@ ASCI_INITDEV3: SET 4,C ; SET CNTLB BIT 4 FOR ODD PARITY ; ASCI_INITDEV4: + ; SETUP ASEXT + LD A,D ; CONFIG HIGH BYTE + AND %00100000 ; BIT 5 IS RTS + CPL ; INVERT FOR ASEXT + LD L,A ; MOVE TO L + LD A,ASCI_DEF_ASEXT ; GET ASEXT DEFAULT + AND L ; COMBINE + LD L,A ; AND LEAVE IN L +; ; SAVE CONFIG PERMANENTLY NOW LD (IY+4),E ; SAVE LOW WORD LD (IY+5),D ; SAVE HI WORD JR ASCI_INITGO ; ASCI_INITSAFE: - LD B,$64 ; CNTLA FAILSAFE VALUE - LD C,$20 ; CNTLB FAILSAFE VALUE + LD B,ASCI_DEF_CNTLA ; CNTLA FAILSAFE VALUE + LD C,ASCI_DEF_CNTLB ; CNTLB FAILSAFE VALUE + LD L,ASCI_DEF_ASEXT ; ASEXT FAILSAFE VALUE ; ASCI_INITGO: ; IMPLEMENT CONFIGURATION + ; B = CNTLA, C=CNTLB, L=ASEXT + PUSH HL ; SAVE ASEXT LD H,B ; H := CNTLA VAL LD L,C ; L := CNTLB VAL LD B,0 ; MSB OF PORT MUST BE ZERO! @@ -532,6 +524,7 @@ ASCI_INITGO: INC C ; BUMP TO INC C ; ... CNTLB REG, B IS STILL 0 OUT (C),L ; WRITE CNTLB VALUE + POP HL ; RECOVER ASEXT INC C ; BUMP TO INC C ; ... STAT REG, B IS STILL 0 #IF ((ASCIINTS) & (INTMODE > 0)) @@ -543,8 +536,11 @@ ASCI_INITGO: LD A,$0E ; BUMP TO ADD A,C ; ... ASEXT REG LD C,A ; PUT IN C FOR I/O, B IS STILL 0 - LD A,$66 ; STATIC VALUE FOR ASEXT - OUT (C),A ; WRITE ASEXT REG + BIT 0,C ; IS C ADDRESSING AN ODD NUMBERED PORT? + JR NZ,ASCI_INITGOZ ; IF SO, THIS IS SEC SERIAL, NO CTS! + OUT (C),L ; WRITE ASEXT REG +; +ASCI_INITGOZ: ; #IF ((ASCIINTS) & (INTMODE > 0)) ; @@ -840,6 +836,13 @@ ASCI1_CFG: .DB ASCI1_BASE ; BASE PORT .DW ASCI1CFG ; LINE CONFIGURATION .DW ASCI1_RCVBUF ; POINTER TO RCV BUFFER STRUCT +; + .ECHO "ASCI: IO=" + .ECHO ASCI1_BASE +#IF ((ASCIINTS) & (INTMODE >0)) + .ECHO ", INTERRUPTS ENABLED" +#ENDIF + .ECHO "\n" ; ASCI_CFGSIZ .EQU $ - ASCI_CFG ; SIZE OF ONE CFG TABLE ENTRY ; @@ -851,6 +854,13 @@ ASCI0_CFG: .DB ASCI0_BASE ; BASE PORT .DW ASCI0CFG ; LINE CONFIGURATION .DW ASCI0_RCVBUF ; POINTER TO RCV BUFFER STRUCT +; + .ECHO "ASCI: IO=" + .ECHO ASCI0_BASE +#IF ((ASCIINTS) & (INTMODE >0)) + .ECHO ", INTERRUPTS ENABLED" +#ENDIF + .ECHO "\n" ; #ELSE ; @@ -862,6 +872,13 @@ ASCI0_CFG: .DB ASCI0_BASE ; BASE PORT .DW ASCI0CFG ; LINE CONFIGURATION .DW ASCI0_RCVBUF ; POINTER TO RCV BUFFER STRUCT +; + .ECHO "ASCI: IO=" + .ECHO ASCI0_BASE +#IF ((ASCIINTS) & (INTMODE >0)) + .ECHO ", INTERRUPTS ENABLED" +#ENDIF + .ECHO "\n" ; ASCI_CFGSIZ .EQU $ - ASCI_CFG ; SIZE OF ONE CFG TABLE ENTRY ; @@ -874,7 +891,13 @@ ASCI1_CFG: .DW ASCI1CFG ; LINE CONFIGURATION .DW ASCI1_RCVBUF ; POINTER TO RCV BUFFER STRUCT ; + .ECHO "ASCI: IO=" + .ECHO ASCI1_BASE +#IF ((ASCIINTS) & (INTMODE > 0)) + .ECHO ", INTERRUPTS ENABLED" #ENDIF + .ECHO "\n" ; +#ENDIF ; ASCI_CFGCNT .EQU ($ - ASCI_CFG) / ASCI_CFGSIZ diff --git a/Source/HBIOS/ay38910.asm b/Source/HBIOS/ay38910.asm index 45b97f00..4188fa17 100644 --- a/Source/HBIOS/ay38910.asm +++ b/Source/HBIOS/ay38910.asm @@ -19,12 +19,15 @@ ; VOLTAGE LEVEL OUTPUT ON A AY-3-8910 IS LOW AND AROUND 2V ON YM2149. ; AY_RCSND .EQU 0 ; 0 = EB MODULE, 1=MF MODULE +; + .ECHO "AY38910: MODE=" ; #IF (AYMODE == AYMODE_SCG) AY_RSEL .EQU $9A AY_RDAT .EQU $9B AY_RIN .EQU AY_RSEL AY_ACR .EQU $9C + .ECHO "SCG" #ENDIF ; #IF (AYMODE == AYMODE_N8) @@ -32,30 +35,35 @@ AY_RSEL .EQU $9C AY_RDAT .EQU $9D AY_RIN .EQU AY_RSEL AY_ACR .EQU N8_DEFACR + .ECHO "N8" #ENDIF ; #IF (AYMODE == AYMODE_RCZ80) AY_RSEL .EQU $D8 AY_RDAT .EQU $D0 AY_RIN .EQU AY_RSEL+AY_RCSND + .ECHO "RCZ80" #ENDIF ; #IF (AYMODE == AYMODE_RCZ180) AY_RSEL .EQU $68 AY_RDAT .EQU $60 AY_RIN .EQU AY_RSEL+AY_RCSND + .ECHO "RCZ180" #ENDIF ; #IF (AYMODE == AYMODE_MSX) AY_RSEL .EQU $A0 AY_RDAT .EQU $A1 AY_RIN .EQU $A2 + .ECHO "MSX" #ENDIF ; #IF (AYMODE == AYMODE_LINC) AY_RSEL .EQU $33 AY_RDAT .EQU $32 AY_RIN .EQU $32 + .ECHO "LINC" #ENDIF ; #IF (AYMODE == AYMODE_MBC) @@ -63,7 +71,14 @@ AY_RSEL .EQU $A0 AY_RDAT .EQU $A1 AY_RIN .EQU AY_RSEL AY_ACR .EQU $A2 + .ECHO "MBC" #ENDIF +; + .ECHO ", IO=" + .ECHO AY_RSEL + .ECHO ", CLOCK=" + .ECHO AY_CLK + .ECHO " HZ\n" ; ;====================================================================== ; @@ -107,10 +122,6 @@ AY_NOISECNT .EQU 1 ; COUNT NUMBER OF NOISE CHANNELS ;#ELSE ; PRESCALE THE TONE PERIOD ;AY_SCALE .EQU 3 ; DATA TO MAINTAIN MAXIMUM ;#ENDIF ; RANGE AND ACCURACY -; - .ECHO "AY38910 CLOCK: " - .ECHO AY_CLK - .ECHO "\n" ; #INCLUDE "audio.inc" ; diff --git a/Source/HBIOS/bqrtc.asm b/Source/HBIOS/bqrtc.asm index ce0daeb5..51fd677f 100644 --- a/Source/HBIOS/bqrtc.asm +++ b/Source/HBIOS/bqrtc.asm @@ -91,6 +91,10 @@ BQRTC_UTI .EQU %00001000 BQRTC_BUFSIZE .EQU 6 ; 6 BYTE BUFFER (YYMMDDHHMMSS) + .ECHO "BQRTC: IO=" + .ECHO BQRTC_BASE + .ECHO "\n" + ; RTC Device Initialization Entry BQRTC_INIT: diff --git a/Source/HBIOS/cfg_duo.asm b/Source/HBIOS/cfg_duo.asm new file mode 100644 index 00000000..d1364553 --- /dev/null +++ b/Source/HBIOS/cfg_duo.asm @@ -0,0 +1,319 @@ +; +;================================================================================================== +; ROMWBW 3.X CONFIGURATION DEFAULTS FOR DUODYNE +;================================================================================================== +; +; THIS FILE CONTAINS THE FULL SET OF DEFAULT CONFIGURATION SETTINGS FOR THE PLATFORM +; INDICATED ABOVE. THIS FILE SHOULD *NOT* NORMALLY BE CHANGED. INSTEAD, YOU SHOULD +; OVERRIDE ANY SETTINGS YOU WANT USING A CONFIGURATION FILE IN THE CONFIG DIRECTORY +; UNDER THIS DIRECTORY. +; +; THIS FILE CAN BE CONSIDERED A REFERENCE THAT LISTS ALL POSSIBLE CONFIGURATION SETTINGS +; FOR THE PLATFORM. +; +#DEFINE PLATFORM_NAME "Duodyne", " [", CONFIG, "]" +; +#INCLUDE "hbios.inc" +; +PLATFORM .EQU PLT_DUO ; PLT_[SBC|ZETA|ZETA2|N8|MK4|UNA|RCZ80|RCZ180|EZZ80|SCZ180|DYNO|RCZ280|MBC|RPH|Z80RETRO|S100|DUO|HEATH|MON] +CPUFAM .EQU CPU_Z80 ; CPU FAMILY: CPU_[Z80|Z180|Z280] +BIOS .EQU BIOS_WBW ; HARDWARE BIOS: BIOS_[WBW|UNA] +BATCOND .EQU FALSE ; ENABLE LOW BATTERY WARNING MESSAGE +HBIOS_MUTEX .EQU FALSE ; ENABLE REENTRANT CALLS TO HBIOS (ADDS OVERHEAD) +USELZSA2 .EQU TRUE ; ENABLE FONT COMPRESSION +TICKFREQ .EQU 50 ; DESIRED PERIODIC TIMER INTERRUPT FREQUENCY (HZ) +; +BOOT_TIMEOUT .EQU -1 ; AUTO BOOT TIMEOUT IN SECONDS, -1 TO DISABLE, 0 FOR IMMEDIATE +BOOT_DELAY .EQU 0 ; FIXED BOOT DELAY IN SECONDS PRIOR TO CONSOLE OUTPUT +; +CPUSPDCAP .EQU SPD_FIXED ; CPU SPEED CHANGE CAPABILITY SPD_FIXED|SPD_HILO +CPUSPDDEF .EQU SPD_UNSUP ; CPU SPEED DEFAULT SPD_UNSUP|SPD_HIGH|SPD_LOW +CPUOSC .EQU 8000000 ; CPU OSC FREQ IN MHZ +INTMODE .EQU 2 ; INTERRUPTS: 0=NONE, 1=MODE 1, 2=MODE 2, 3=MODE 3 (Z280) +DEFSERCFG .EQU SER_38400_8N1 | SER_RTS ; DEFAULT SERIAL LINE CONFIG (SEE STD.ASM) +; +RAMSIZE .EQU 512 ; SIZE OF RAM IN KB (MUST MATCH YOUR HARDWARE!!!) +ROMSIZE .EQU 512 ; SIZE OF ROM IN KB (MUST MATCH YOUR HARDWARE!!!) +MEMMGR .EQU MM_Z2 ; MEMORY MANAGER: MM_[SBC|Z2|N8|Z180|Z280|MBC|RPH|MON] +MPGSEL_0 .EQU $50 ; Z2 MEM MGR BANK 0 PAGE SELECT REG (WRITE ONLY) +MPGSEL_1 .EQU $51 ; Z2 MEM MGR BANK 1 PAGE SELECT REG (WRITE ONLY) +MPGSEL_2 .EQU $52 ; Z2 MEM MGR BANK 2 PAGE SELECT REG (WRITE ONLY) +MPGSEL_3 .EQU $53 ; Z2 MEM MGR BANK 3 PAGE SELECT REG (WRITE ONLY) +MPGENA .EQU $54 ; Z2 MEM MGR PAGING ENABLE REGISTER (BIT 0, WRITE ONLY) +; +RTCIO .EQU $94 ; RTC LATCH REGISTER ADR +; +KIOENABLE .EQU FALSE ; ENABLE ZILOG KIO SUPPORT +KIOBASE .EQU $80 ; KIO BASE I/O ADDRESS +; +CTCENABLE .EQU TRUE ; ENABLE ZILOG CTC SUPPORT +CTCDEBUG .EQU FALSE ; ENABLE CTC DRIVER DEBUG OUTPUT +CTCBASE .EQU $60 ; CTC BASE I/O ADDRESS +CTCTIMER .EQU TRUE ; ENABLE CTC PERIODIC TIMER +CTCMODE .EQU CTCMODE_CTR ; CTC MODE: CTCMODE_[NONE|CTR|TIM16|TIM256] +CTCPRE .EQU 256 ; PRESCALE CONSTANT (1-256) +CTCPRECH .EQU 2 ; PRESCALE CHANNEL (0-3) +CTCTIMCH .EQU 3 ; TIMER CHANNEL (0-3) +CTCOSC .EQU (7372800/8) ; CTC CLOCK FREQUENCY +; +PCFENABLE .EQU FALSE ; ENABLE PCF8584 I2C CONTROLLER +PCFBASE .EQU $56 ; PCF8584 BASE I/O ADDRESS +; +EIPCENABLE .EQU FALSE ; EIPC: ENABLE Z80 EIPC (Z84C15) INITIALIZATION +; +SKZENABLE .EQU FALSE ; ENABLE SERGEY'S Z80-512K FEATURES +; +WDOGMODE .EQU WDOG_NONE ; WATCHDOG MODE: WDOG_[NONE|EZZ80|SKZ] +; +FPLED_ENABLE .EQU TRUE ; FP: ENABLES FRONT PANEL LEDS +FPLED_IO .EQU $42 ; FP: PORT ADDRESS FOR FP LEDS +FPLED_DSKACT .EQU TRUE ; FP: ENABLES DISK I/O ACTIVITY ON FP LEDS +FPSW_ENABLE .EQU TRUE ; FP: ENABLES FRONT PANEL SWITCHES +FPSW_IO .EQU $42 ; FP: PORT ADDRESS FOR FP SWITCHES +; +DIAGLVL .EQU DL_CRITICAL ; ERROR LEVEL REPORTING +; +LEDENABLE .EQU TRUE ; ENABLES STATUS LED +LEDMODE .EQU LEDMODE_RTC ; LEDMODE_[STD|RTC] +LEDPORT .EQU RTCIO ; STATUS LED PORT ADDRESS +LEDDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON STATUS LED +; +DSKYENABLE .EQU TRUE ; ENABLES DSKY FUNCTIONALITY +DSKYDSKACT .EQU TRUE ; ENABLES DISK ACTIVITY ON DSKY DISPLAY +ICMENABLE .EQU FALSE ; ENABLES ORIGINAL DSKY ICM DRIVER (7218) +ICMPPIBASE .EQU $88 ; BASE I/O ADDRESS OF ICM PPI +PKDENABLE .EQU TRUE ; ENABLES DSKY NG PKD DRIVER (8259) +PKDPPIBASE .EQU $88 ; BASE I/O ADDRESS OF PKD PPI +PKDOSC .EQU 3000000 ; OSCILLATOR FREQ FOR PKD (IN HZ) +H8PENABLE .EQU FALSE ; ENABLES HEATH H8 FRONT PANEL +; +BOOTCON .EQU 0 ; BOOT CONSOLE DEVICE +SECCON .EQU $FF ; SECONDARY CONSOLE DEVICE +CRTACT .EQU FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP +VDAEMU .EQU EMUTYP_ANSI ; VDA EMULATION: EMUTYP_[TTY|ANSI] +VDAEMU_SERKBD .EQU $FF ; VDA EMULATION: SERIAL KBD UNIT #, OR $FF FOR HW KBD +ANSITRACE .EQU 1 ; ANSI DRIVER TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +PPKTRACE .EQU 1 ; PPK DRIVER TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +KBDTRACE .EQU 1 ; KBD DRIVER TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +PPKKBLOUT .EQU KBD_US ; PPK KEYBOARD LANGUAGE: KBD_[US|DE] +KBDKBLOUT .EQU KBD_US ; KBD KEYBOARD LANGUAGE: KBD_[US|DE] +MKYENABLE .EQU FALSE ; MSX 5255 PPI KEYBOARD COMPATIBLE DRIVER (REQUIRES TMS VDA DRIVER) +MKYKBLOUT .EQU KBD_US ; KBD KEYBOARD LANGUAGE: KBD_[US|DE] +; +DSRTCENABLE .EQU TRUE ; DSRTC: ENABLE DS-1302 CLOCK DRIVER (DSRTC.ASM) +DSRTCMODE .EQU DSRTCMODE_STD ; DSRTC: OPERATING MODE: DSRTC_[STD|MFPIC] +DSRTCCHG .EQU FALSE ; DSRTC: FORCE BATTERY CHARGE ON (USE WITH CAUTION!!!) +; +DS1501RTCENABLE .EQU FALSE ; DS1501RTC: ENABLE DS-1501 CLOCK DRIVER (DS1501RTC.ASM) +DS1501RTC_BASE .EQU $50 ; DS1501RTC: I/O BASE ADDRESS +; +BQRTCENABLE .EQU FALSE ; BQRTC: ENABLE BQ4845 CLOCK DRIVER (BQRTC.ASM) +BQRTC_BASE .EQU $50 ; BQRTC: I/O BASE ADDRESS +; +INTRTCENABLE .EQU FALSE ; ENABLE PERIODIC INTERRUPT CLOCK DRIVER (INTRTC.ASM) +; +RP5RTCENABLE .EQU FALSE ; RP5C01 RTC BASED CLOCK (RP5RTC.ASM) +; +HTIMENABLE .EQU FALSE ; ENABLE SIMH TIMER SUPPORT +SIMRTCENABLE .EQU FALSE ; ENABLE SIMH CLOCK DRIVER (SIMRTC.ASM) +; +DS7RTCENABLE .EQU FALSE ; DS7RTC: ENABLE DS-1307 I2C CLOCK DRIVER (DS7RTC.ASM) +DS7RTCMODE .EQU DS7RTCMODE_PCF ; DS7RTC: OPERATING MODE: DS7RTC_[PCF] +; +DUARTENABLE .EQU FALSE ; DUART: ENABLE 2681/2692 SERIAL DRIVER (DUART.ASM) +; +UARTENABLE .EQU TRUE ; UART: ENABLE 8250/16550-LIKE SERIAL DRIVER (UART.ASM) +UARTOSC .EQU 7372800 ; UART: OSC FREQUENCY IN MHZ +UARTINTS .EQU FALSE ; UART: INCLUDE INTERRUPT SUPPORT UNDER IM1/2/3 +UARTCFG .EQU DEFSERCFG ; UART: LINE CONFIG FOR UART PORTS +UARTCASSPD .EQU SER_300_8N1 ; UART: ECB CASSETTE UART DEFAULT SPEED +UARTSBC .EQU TRUE ; UART: AUTO-DETECT SBC/ZETA/DUO ONBOARD UART +UARTSBCFORCE .EQU FALSE ; UART: FORCE DETECTION OF SBC UART (FOR SIMH) +UARTAUX .EQU TRUE ; UART: AUTO-DETECT AUX UART +UARTCAS .EQU FALSE ; UART: AUTO-DETECT ECB CASSETTE UART +UARTMFP .EQU FALSE ; UART: AUTO-DETECT MF/PIC UART +UART4 .EQU FALSE ; UART: AUTO-DETECT 4UART UART +UARTRC .EQU FALSE ; UART: AUTO-DETECT RC UART +UARTDUAL .EQU TRUE ; UART: AUTO-DETECT DUAL UART +; +ASCIENABLE .EQU FALSE ; ASCI: ENABLE Z180 ASCI SERIAL DRIVER (ASCI.ASM) +; +Z2UENABLE .EQU FALSE ; Z2U: ENABLE Z280 UART SERIAL DRIVER (Z2U.ASM) +; +ACIAENABLE .EQU FALSE ; ACIA: ENABLE MOTOROLA 6850 ACIA DRIVER (ACIA.ASM) +; +SIOENABLE .EQU TRUE ; SIO: ENABLE ZILOG SIO SERIAL DRIVER (SIO.ASM) +SIODEBUG .EQU FALSE ; SIO: ENABLE DEBUG OUTPUT +SIOBOOT .EQU 0 ; SIO: REBOOT ON RCV CHAR (0=DISABLED) +SIOCNT .EQU 1 ; SIO: NUMBER OF CHIPS TO DETECT (1-2), 2 CHANNELS PER CHIP +SIO0MODE .EQU SIOMODE_ZP ; SIO 0: CHIP TYPE: SIOMODE_[STD|RC|SMB|ZP|Z80R] +SIO0BASE .EQU $60 ; SIO 0: REGISTERS BASE ADR +SIO0ACLK .EQU (7372800/4) ; SIO 0A: OSC FREQ IN HZ, ZP=2457600/4915200, RC/SMB=7372800 +SIO0ACFG .EQU DEFSERCFG ; SIO 0A: SERIAL LINE CONFIG +SIO0ACTCC .EQU 0 ; SIO 0A: CTC CHANNEL 0=A, 1=B, 2=C, 3=D, -1 FOR NONE +SIO0BCLK .EQU (7372800/4) ; SIO 0B: OSC FREQ IN HZ, ZP=2457600/4915200, RC/SMB=7372800 +SIO0BCFG .EQU DEFSERCFG ; SIO 0B: SERIAL LINE CONFIG +SIO0BCTCC .EQU 1 ; SIO 0B: CTC CHANNEL 0=A, 1=B, 2=C, 3=D, -1 FOR NONE +; +XIOCFG .EQU DEFSERCFG ; XIO: SERIAL LINE CONFIG +; +VDUENABLE .EQU FALSE ; VDU: ENABLE VDU VIDEO/KBD DRIVER (VDU.ASM) +VDUSIZ .EQU V80X25 ; VDU: DISPLAY FORMAT [V80X24|V80X25|V80X30] +CVDUENABLE .EQU FALSE ; CVDU: ENABLE CVDU VIDEO/KBD DRIVER (CVDU.ASM) +CVDUMODE .EQU CVDUMODE_MBC ; CVDU: CVDU MODE: CVDUMODE_[NONE|ECB|MBC] +CVDUMON .EQU CVDUMON_CGA ; CVDU: CVDU MONITOR SETUP: CVDUMON_[NONE|CGA|EGA] +GDCENABLE .EQU FALSE ; GDC: ENABLE 7220 GDC VIDEO/KBD DRIVER (GDC.ASM) +TMSENABLE .EQU FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM) +TMSMODE .EQU TMSMODE_MBC ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|MSX9958|MSXKBD|COLECO] +TMSTIMENABLE .EQU FALSE ; TMS: ENABLE TIMER INTERRUPTS (REQUIRES IM1) +VGAENABLE .EQU FALSE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM) +VGASIZ .EQU V80X25 ; VGA: DISPLAY FORMAT [V80X25|V80X30|V80X43] +VRCENABLE .EQU FALSE ; VRC: ENABLE VGARC VIDEO/KBD DRIVER (VRC.ASM) +SCONENABLE .EQU FALSE ; SCON: ENABLE S100 CONSOLE DRIVER (SCON.ASM) +; +MDENABLE .EQU TRUE ; MD: ENABLE MEMORY (ROM/RAM) DISK DRIVER (MD.ASM) +MDROM .EQU TRUE ; MD: ENABLE ROM DISK +MDRAM .EQU TRUE ; MD: ENABLE RAM DISK +MDTRACE .EQU 1 ; MD: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +MDFFENABLE .EQU FALSE ; MD: ENABLE FLASH FILE SYSTEM +; +; +FDENABLE .EQU TRUE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM) +FDMODE .EQU FDMODE_DUO ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPFDC|MBC] +FDCNT .EQU 2 ; FD: NUMBER OF FLOPPY DRIVES ON THE INTERFACE (1-2) +FDTRACE .EQU 1 ; FD: TRACE LEVEL (0=NO,1=FATAL,2=ERRORS,3=ALL) +FDMAUTO .EQU TRUE ; FD: AUTO SELECT DEFAULT/ALTERNATE MEDIA FORMATS +FD0TYPE .EQU FDT_3HD ; FD 0: DRIVE TYPE: FDT_[3DD|3HD|5DD|5HD|8] +FD1TYPE .EQU FDT_3HD ; FD 1: DRIVE TYPE: FDT_[3DD|3HD|5DD|5HD|8] +; +RFENABLE .EQU FALSE ; RF: ENABLE RAM FLOPPY DRIVER +RFCNT .EQU 1 ; RF: NUMBER OF RAM FLOPPY UNITS (1-4) +; +IDEENABLE .EQU FALSE ; IDE: ENABLE IDE DISK DRIVER (IDE.ASM) +IDETRACE .EQU 1 ; IDE: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +IDECNT .EQU 1 ; IDE: NUMBER OF IDE INTERFACES TO DETECT (1-3), 2 DRIVES EACH +IDE0MODE .EQU IDEMODE_DIO ; IDE 0: DRIVER MODE: IDEMODE_[DIO|DIDE|MK4|RC] +IDE0BASE .EQU $20 ; IDE 0: IO BASE ADDRESS +IDE0DATLO .EQU $20 ; IDE 0: DATA LO PORT FOR 16-BIT I/O +IDE0DATHI .EQU $28 ; IDE 0: DATA HI PORT FOR 16-BIT I/O +IDE0A8BIT .EQU FALSE ; IDE 0A (MASTER): 8 BIT XFER +IDE0B8BIT .EQU FALSE ; IDE 0B (MASTER): 8 BIT XFER +IDE1MODE .EQU IDEMODE_NONE ; IDE 1: DRIVER MODE: IDEMODE_[DIO|DIDE|MK4|RC] +IDE1BASE .EQU $00 ; IDE 1: IO BASE ADDRESS +IDE1DATLO .EQU $00 ; IDE 1: DATA LO PORT FOR 16-BIT I/O +IDE1DATHI .EQU $00 ; IDE 1: DATA HI PORT FOR 16-BIT I/O +IDE1A8BIT .EQU TRUE ; IDE 1A (MASTER): 8 BIT XFER +IDE1B8BIT .EQU TRUE ; IDE 1B (MASTER): 8 BIT XFER +IDE2MODE .EQU IDEMODE_NONE ; IDE 2: DRIVER MODE: IDEMODE_[DIO|DIDE|MK4|RC] +IDE2BASE .EQU $00 ; IDE 2: IO BASE ADDRESS +IDE2DATLO .EQU $00 ; IDE 2: DATA LO PORT FOR 16-BIT I/O +IDE2DATHI .EQU $00 ; IDE 2: DATA HI PORT FOR 16-BIT I/O +IDE2A8BIT .EQU TRUE ; IDE 2A (MASTER): 8 BIT XFER +IDE2B8BIT .EQU TRUE ; IDE 2B (MASTER): 8 BIT XFER +; +PPIDEENABLE .EQU TRUE ; PPIDE: ENABLE PARALLEL PORT IDE DISK DRIVER (PPIDE.ASM) +PPIDETRACE .EQU 1 ; PPIDE: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +PPIDECNT .EQU 1 ; PPIDE: NUMBER OF PPI CHIPS TO DETECT (1-3), 2 DRIVES PER CHIP +PPIDE0BASE .EQU $88 ; PPIDE 0: PPI REGISTERS BASE ADR +PPIDE0A8BIT .EQU FALSE ; PPIDE 0A (MASTER): 8 BIT XFER +PPIDE0B8BIT .EQU FALSE ; PPIDE 0B (SLAVE): 8 BIT XFER +PPIDE1BASE .EQU $20 ; PPIDE 1: PPI REGISTERS BASE ADR +PPIDE1A8BIT .EQU FALSE ; PPIDE 1A (MASTER): 8 BIT XFER +PPIDE1B8BIT .EQU FALSE ; PPIDE 0B (SLAVE): 8 BIT XFER +PPIDE2BASE .EQU $14 ; PPIDE 2: PPI REGISTERS BASE ADR +PPIDE2A8BIT .EQU FALSE ; PPIDE 2A (MASTER): 8 BIT XFER +PPIDE2B8BIT .EQU FALSE ; PPIDE 0B (SLAVE): 8 BIT XFER +; +SDENABLE .EQU TRUE ; SD: ENABLE SD CARD DISK DRIVER (SD.ASM) +SDMODE .EQU SDMODE_MT ; SD: DRIVER MODE: SDMODE_[JUHA|N8|CSIO|PPI|UART|DSD|MK4|SC|MT|PIO|Z80R|USR] +SDPPIBASE .EQU $60 ; SD: BASE I/O ADDRESS OF PPI FOR PPI MODDE +SDCNT .EQU 1 ; SD: NUMBER OF SD CARD DEVICES (1-2), FOR DSD/SC/MT ONLY +SDTRACE .EQU 1 ; SD: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +SDCSIOFAST .EQU FALSE ; SD: ENABLE TABLE-DRIVEN BIT INVERTER IN CSIO MODE +SDMTSWAP .EQU TRUE ; SD: SWAP THE LOGICAL ORDER OF THE SPI PORTS OF THE MT011 +; +CHENABLE .EQU TRUE ; CH: ENABLE CH375/376 USB SUPPORT +CHTRACE .EQU 1 ; CH: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +CHUSBTRACE .EQU 1 ; CHUSB: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +CHSDTRACE .EQU 1 ; CHSD: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +CHCNT .EQU 1 ; CH: NUMBER OF BOARDS TO DETECT (1-2) +CH0BASE .EQU $4E ; CH 0: BASE I/O ADDRESS +CH0USBENABLE .EQU TRUE ; CH 0: ENABLE USB DISK +CH0SDENABLE .EQU TRUE ; CH 0: ENABLE SD DISK +CH1BASE .EQU $FF ; CH 1: BASE I/O ADDRESS +CH1USBENABLE .EQU FALSE ; CH 1: ENABLE USB DISK +CH1SDENABLE .EQU FALSE ; CH 1: ENABLE SD DISK +; +PRPENABLE .EQU FALSE ; PRP: ENABLE ECB PROPELLER IO BOARD DRIVER (PRP.ASM) +PRPSDENABLE .EQU TRUE ; PRP: ENABLE PROPIO DRIVER SD CARD SUPPORT +PRPSDTRACE .EQU 1 ; PRP: SD CARD TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +PRPCONENABLE .EQU TRUE ; PRP: ENABLE PROPIO DRIVER VIDEO/KBD SUPPORT +; +PPPENABLE .EQU FALSE ; PPP: ENABLE ZETA PARALLEL PORT PROPELLER BOARD DRIVER (PPP.ASM) +; +ESPENABLE .EQU FALSE ; ESP: ENABLE ESP32 IO BOARD DRIVER (ESP.ASM) +ESPCONENABLE .EQU TRUE ; ESP: ENABLE ESP32 CONSOLE IO DRIVER VIDEO/KBD SUPPORT +; +HDSKENABLE .EQU FALSE ; HDSK: ENABLE SIMH HDSK DISK DRIVER (HDSK.ASM) +HDSKTRACE .EQU 1 ; HDSK: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +; +PIOENABLE .EQU TRUE ; PIO: ENABLE ZILOG PIO DRIVER (PIO.ASM) +PIOCNT .EQU 2 ; PIO: NUMBER OF CHIPS TO DETECT (1-2), 2 CHANNELS PER CHIP +PIO0BASE .EQU $68 ; PIO 0: REGISTERS BASE ADR +PIO1BASE .EQU $6C ; PIO 1: REGISTERS BASE ADR +; +LPTENABLE .EQU TRUE ; LPT: ENABLE CENTRONICS PRINTER DRIVER (LPT.ASM) +LPTMODE .EQU LPTMODE_SPP ; LPT: DRIVER MODE: LPTMODE_[NONE|SPP|MG014] +LPTCNT .EQU 1 ; LPT: NUMBER OF CHIPS TO DETECT (1-2) +LPTTRACE .EQU 1 ; LPT: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +LPT0BASE .EQU $48 ; LPT 0: REGISTERS BASE ADR +LPT1BASE .EQU $EC ; LPT 1: REGISTERS BASE ADR +; +PPAENABLE .EQU FALSE ; PPA: ENABLE PPA DISK DRIVER (PPA.ASM) +PPACNT .EQU 1 ; PPA: NUMBER OF PPA DEVICES (1-2) +PPATRACE .EQU 1 ; PPA: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +PPAMODE .EQU PPAMODE_SPP ; PPA: DRIVER MODE: PPAMODE_[NONE|MG014] +PPA0BASE .EQU LPT0BASE ; PPA 0: BASE I/O ADDRESS OF PPI FOR PPA +PPA1BASE .EQU LPT1BASE ; PPA 1: BASE I/O ADDRESS OF PPI FOR PPA +; +IMMENABLE .EQU FALSE ; IMM: ENABLE IMM DISK DRIVER (IMM.ASM) +IMMCNT .EQU 1 ; IMM: NUMBER OF IMM DEVICES (1-2) +IMMTRACE .EQU 1 ; IMM: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +IMMMODE .EQU IMMMODE_SPP ; IMM: DRIVER MODE: IMMMODE_[NONE|SPP|MG014] +IMM0BASE .EQU LPT0BASE ; IMM 0: BASE I/O ADDRESS OF PPI FOR IMM +IMM1BASE .EQU LPT1BASE ; IMM 1: BASE I/O ADDRESS OF PPI FOR IMM +; +SYQENABLE .EQU FALSE ; SYQ: ENABLE IMM DISK DRIVER (SYQ.ASM) +SYQCNT .EQU 1 ; SYQ: NUMBER OF SYQ DEVICES (1-2) +SYQTRACE .EQU 1 ; SYQ: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +SYQMODE .EQU IMMMODE_SPP ; SYQ: DRIVER MODE: SYQMODE_[NONE|SPP|MG014] +SYQ0BASE .EQU LPT0BASE ; SYQ 0: BASE I/O ADDRESS OF PPI FOR SYQ +SYQ1BASE .EQU LPT1BASE ; SYQ 1: BASE I/O ADDRESS OF PPI FOR SYQ +; +PIO_4P .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB 4P BOARD +PIO4BASE .EQU $90 ; PIO: PIO REGISTERS BASE ADR FOR ECB 4P BOARD +PIO_ZP .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB ZILOG PERIPHERALS BOARD (PIO.ASM) +PIOZBASE .EQU $88 ; PIO: PIO REGISTERS BASE ADR FOR ECB ZP BOARD +PIO_SBC .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR 8255 CHIP +PIOSBASE .EQU $60 ; PIO: PIO REGISTERS BASE ADR FOR SBC PPI +; +UFENABLE .EQU FALSE ; UF: ENABLE ECB USB FIFO DRIVER (UF.ASM) +UFBASE .EQU $0C ; UF: REGISTERS BASE ADR +; +SN76489ENABLE .EQU FALSE ; SN: ENABLE SN76489 SOUND DRIVER +AUDIOTRACE .EQU FALSE ; ENABLE TRACING TO CONSOLE OF SOUND DRIVER +SN7CLK .EQU 3579545 ; SN: PSG CLOCK FREQ, ASSUME MSX STD +SNMODE .EQU SNMODE_NONE ; SN: DRIVER MODE: SNMODE_[NONE|RC|VGM] +; +AY38910ENABLE .EQU FALSE ; AY: ENABLE AY-3-8910 / YM2149 SOUND DRIVER +AY_CLK .EQU 1789772 ; AY: PSG CLOCK FREQ, ASSUME MSX STD +AYMODE .EQU AYMODE_MBC ; AY: DRIVER MODE: AYMODE_[SCG|N8|RCZ80|RCZ180|MSX|LINC|MBC] +; +SPKENABLE .EQU TRUE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM) +; +DMAENABLE .EQU TRUE ; DMA: ENABLE DMA DRIVER (DMA.ASM) +DMABASE .EQU $40 ; DMA: DMA BASE ADDRESS +DMAMODE .EQU DMAMODE_DUO ; DMA: DMA MODE (NONE|ECB|Z180|Z280|RC|MBC|DUO) +; +YM2612ENABLE .EQU FALSE ; YM2612: ENABLE YM2612 DRIVER +VGMBASE .EQU $C0 ; YM2612: BASE ADDRESS FOR VGM BOARD (YM2612/SN76489s/CTC) diff --git a/Source/HBIOS/cfg_dyno.asm b/Source/HBIOS/cfg_dyno.asm index 66bbf61c..816e56b6 100644 --- a/Source/HBIOS/cfg_dyno.asm +++ b/Source/HBIOS/cfg_dyno.asm @@ -1,6 +1,6 @@ ; ;================================================================================================== -; ROMWBW 2.X CONFIGURATION DEFAULTS FOR DYNO +; ROMWBW 3.X CONFIGURATION DEFAULTS FOR DYNO ;================================================================================================== ; ; THIS FILE CONTAINS THE FULL SET OF DEFAULT CONFIGURATION SETTINGS FOR THE PLATFORM @@ -15,7 +15,7 @@ ; #INCLUDE "hbios.inc" ; -PLATFORM .EQU PLT_DYNO ; PLT_[SBC|ZETA|ZETA2|N8|MK4|UNA|RCZ80|RCZ180|EZZ80|SCZ180|DYNO|RCZ280|MBC|RPH] +PLATFORM .EQU PLT_DYNO ; PLT_[SBC|ZETA|ZETA2|N8|MK4|UNA|RCZ80|RCZ180|EZZ80|SCZ180|DYNO|RCZ280|MBC|RPH|Z80RETRO|S100|DUO|HEATH|MON] CPUFAM .EQU CPU_Z180 ; CPU FAMILY: CPU_[Z80|Z180|Z280] BIOS .EQU BIOS_WBW ; HARDWARE BIOS: BIOS_[WBW|UNA] BATCOND .EQU FALSE ; ENABLE LOW BATTERY WARNING MESSAGE @@ -30,14 +30,12 @@ CPUSPDCAP .EQU SPD_FIXED ; CPU SPEED CHANGE CAPABILITY SPD_FIXED|SPD_HILO CPUSPDDEF .EQU SPD_HIGH ; CPU SPEED DEFAULT SPD_UNSUP|SPD_HIGH|SPD_LOW CPUOSC .EQU 18432000 ; CPU OSC FREQ IN MHZ INTMODE .EQU 2 ; INTERRUPTS: 0=NONE, 1=MODE 1, 2=MODE 2, 3=MODE 3 (Z280) -DEFSERCFG .EQU SER_38400_8N1 ; DEFAULT SERIAL LINE CONFIG (SEE STD.ASM) +DEFSERCFG .EQU SER_38400_8N1 | SER_RTS ; DEFAULT SERIAL LINE CONFIG (SEE STD.ASM) ; RAMSIZE .EQU 512 ; SIZE OF RAM IN KB (MUST MATCH YOUR HARDWARE!!!) ROMSIZE .EQU 512 ; SIZE OF ROM IN KB (MUST MATCH YOUR HARDWARE!!!) -ROMSIZE_CHK .EQU 0 ; ROMSIZE VALUE VERIFICATION (0=DISABLED) -MEMMGR .EQU MM_Z180 ; MEMORY MANAGER: MM_[SBC|Z2|N8|Z180|Z280|MBC|RPH] -RAMLOC .EQU 19 ; START OF RAM AS POWER OF 2 (2^N) IN PHYSICAL ADDRESS SPACE -RAMBIAS .EQU (1 << (RAMLOC - 10)) ; OFFSET OF START OF RAM IN PHYSICAL ADDRESS SPACE +MEMMGR .EQU MM_Z180 ; MEMORY MANAGER: MM_[SBC|Z2|N8|Z180|Z280|MBC|RPH|MON] +RAMBIAS .EQU ROMSIZE ; OFFSET OF START OF RAM IN PHYSICAL ADDRESS SPACE MPGSEL_0 .EQU $78 ; Z2 MEM MGR BANK 0 PAGE SELECT REG (WRITE ONLY) MPGSEL_1 .EQU $79 ; Z2 MEM MGR BANK 1 PAGE SELECT REG (WRITE ONLY) MPGSEL_2 .EQU $7A ; Z2 MEM MGR BANK 2 PAGE SELECT REG (WRITE ONLY) @@ -60,15 +58,21 @@ CTCDEBUG .EQU FALSE ; ENABLE CTC DRIVER DEBUG OUTPUT CTCBASE .EQU $88 ; CTC BASE I/O ADDRESS CTCTIMER .EQU FALSE ; ENABLE CTC PERIODIC TIMER ; +PCFENABLE .EQU FALSE ; ENABLE PCF8584 I2C CONTROLLER +PCFBASE .EQU $F0 ; PCF8584 BASE I/O ADDRESS +; EIPCENABLE .EQU FALSE ; EIPC: ENABLE Z80 EIPC (Z84C15) INITIALIZATION ; SKZENABLE .EQU FALSE ; ENABLE SERGEY'S Z80-512K FEATURES ; WDOGMODE .EQU WDOG_NONE ; WATCHDOG MODE: WDOG_[NONE|EZZ80|SKZ] ; -DIAGENABLE .EQU FALSE ; ENABLES OUTPUT TO 8 BIT LED DIAGNOSTIC PORT -DIAGPORT .EQU $00 ; DIAGNOSTIC PORT ADDRESS -DIAGDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON DIAGNOSTIC LEDS +FPLED_ENABLE .EQU FALSE ; FP: ENABLES FRONT PANEL LEDS +FPLED_IO .EQU $00 ; FP: PORT ADDRESS FOR FP LEDS +FPLED_DSKACT .EQU TRUE ; FP: ENABLES DISK I/O ACTIVITY ON FP LEDS +FPSW_ENABLE .EQU FALSE ; FP: ENABLES FRONT PANEL SWITCHES +FPSW_IO .EQU $00 ; FP: PORT ADDRESS FOR FP SWITCHES +; DIAGLVL .EQU DL_CRITICAL ; ERROR LEVEL REPORTING ; LEDENABLE .EQU FALSE ; ENABLES STATUS LED (SINGLE LED) @@ -76,9 +80,17 @@ LEDMODE .EQU LEDMODE_STD ; LEDMODE_[STD|RTC] LEDPORT .EQU $0E ; STATUS LED PORT ADDRESS LEDDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON STATUS LED ; -DSKYENABLE .EQU FALSE ; ENABLES DSKY (DO NOT COMBINE WITH PPIDE) +DSKYENABLE .EQU FALSE ; ENABLES DSKY FUNCTIONALITY +DSKYDSKACT .EQU TRUE ; ENABLES DISK ACTIVITY ON DSKY DISPLAY +ICMENABLE .EQU FALSE ; ENABLES ORIGINAL DSKY ICM DRIVER (7218) +ICMPPIBASE .EQU $60 ; BASE I/O ADDRESS OF ICM PPI +PKDENABLE .EQU FALSE ; ENABLES DSKY NG PKD DRIVER (8259) +PKDPPIBASE .EQU $60 ; BASE I/O ADDRESS OF PKD PPI +PKDOSC .EQU 3000000 ; OSCILLATOR FREQ FOR PKD (IN HZ) +H8PENABLE .EQU FALSE ; ENABLES HEATH H8 FRONT PANEL ; BOOTCON .EQU 0 ; BOOT CONSOLE DEVICE +SECCON .EQU $FF ; SECONDARY CONSOLE DEVICE CRTACT .EQU FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP VDAEMU .EQU EMUTYP_ANSI ; VDA EMULATION: EMUTYP_[TTY|ANSI] VDAEMU_SERKBD .EQU $FF ; VDA EMULATION: SERIAL KBD UNIT #, OR $FF FOR HW KBD @@ -123,8 +135,9 @@ UARTENABLE .EQU FALSE ; UART: ENABLE 8250/16550-LIKE SERIAL DRIVER (UART.ASM) UARTOSC .EQU 1843200 ; UART: OSC FREQUENCY IN MHZ UARTINTS .EQU FALSE ; UART: INCLUDE INTERRUPT SUPPORT UNDER IM1/2/3 UARTCFG .EQU DEFSERCFG | SER_RTS ; UART: LINE CONFIG FOR UART PORTS -UARTSBC .EQU FALSE ; UART: AUTO-DETECT SBC/ZETA ONBOARD UART +UARTSBC .EQU FALSE ; UART: AUTO-DETECT SBC/ZETA/DUO ONBOARD UART UARTSBCFORCE .EQU FALSE ; UART: FORCE DETECTION OF SBC UART (FOR SIMH) +UARTAUX .EQU FALSE ; UART: AUTO-DETECT AUX UART UARTCAS .EQU FALSE ; UART: AUTO-DETECT ECB CASSETTE UART UARTMFP .EQU FALSE ; UART: AUTO-DETECT MF/PIC UART UART4 .EQU FALSE ; UART: AUTO-DETECT 4UART UART @@ -146,7 +159,7 @@ SIOENABLE .EQU FALSE ; SIO: ENABLE ZILOG SIO SERIAL DRIVER (SIO.ASM) SIODEBUG .EQU FALSE ; SIO: ENABLE DEBUG OUTPUT SIOBOOT .EQU 0 ; SIO: REBOOT ON RCV CHAR (0=DISABLED) SIOCNT .EQU 2 ; SIO: NUMBER OF CHIPS TO DETECT (1-2), 2 CHANNELS PER CHIP -SIO0MODE .EQU SIOMODE_RC ; SIO 0: CHIP TYPE: SIOMODE_[STD|RC|SMB|ZP] +SIO0MODE .EQU SIOMODE_RC ; SIO 0: CHIP TYPE: SIOMODE_[STD|RC|SMB|ZP|Z80R] SIO0BASE .EQU $80 ; SIO 0: REGISTERS BASE ADR SIO0ACLK .EQU 7372800 ; SIO 0A: OSC FREQ IN HZ, ZP=2457600/4915200, RC/SMB=7372800 SIO0ACFG .EQU SER_115200_8N1 ; SIO 0A: SERIAL LINE CONFIG @@ -154,7 +167,7 @@ SIO0ACTCC .EQU -1 ; SIO 0A: CTC CHANNEL 0=A, 1=B, 2=C, 3=D, -1 FOR NONE SIO0BCLK .EQU 7372800 ; SIO 0B: OSC FREQ IN HZ, ZP=2457600/4915200, RC/SMB=7372800 SIO0BCFG .EQU SER_115200_8N1 ; SIO 0B: SERIAL LINE CONFIG SIO0BCTCC .EQU -1 ; SIO 0B: CTC CHANNEL 0=A, 1=B, 2=C, 3=D, -1 FOR NONE -SIO1MODE .EQU SIOMODE_RC ; SIO 1: CHIP TYPE: SIOMODE_[STD|RC|SMB|ZP] +SIO1MODE .EQU SIOMODE_RC ; SIO 1: CHIP TYPE: SIOMODE_[STD|RC|SMB|ZP|Z80R] SIO1BASE .EQU $84 ; SIO 1: REGISTERS BASE ADR SIO1ACLK .EQU 7372800 ; SIO 1A: OSC FREQ IN HZ, ZP=2457600/4915200, RC/SMB=7372800 SIO1ACFG .EQU SER_115200_8N1 ; SIO 1A: SERIAL LINE CONFIG @@ -172,6 +185,8 @@ TMSENABLE .EQU FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM) TMSMODE .EQU TMSMODE_MSX ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|MSX9958|MSXKBD|COLECO] TMSTIMENABLE .EQU FALSE ; TMS: ENABLE TIMER INTERRUPTS (REQUIRES IM1) VGAENABLE .EQU FALSE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM) +VRCENABLE .EQU FALSE ; VRC: ENABLE VGARC VIDEO/KBD DRIVER (VRC.ASM) +SCONENABLE .EQU FALSE ; SCON: ENABLE S100 CONSOLE DRIVER (SCON.ASM) ; MDENABLE .EQU TRUE ; MD: ENABLE MEMORY (ROM/RAM) DISK DRIVER (MD.ASM) MDROM .EQU TRUE ; MD: ENABLE ROM DISK @@ -183,9 +198,9 @@ FDENABLE .EQU FALSE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM) FDMODE .EQU FDMODE_DYNO ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPFDC|MBC] FDCNT .EQU 2 ; FD: NUMBER OF FLOPPY DRIVES ON THE INTERFACE (1-2) FDTRACE .EQU 1 ; FD: TRACE LEVEL (0=NO,1=FATAL,2=ERRORS,3=ALL) -FDMEDIA .EQU FDM144 ; FD: DEFAULT MEDIA FORMAT FDM[720|144|360|120|111] -FDMEDIAALT .EQU FDM720 ; FD: ALTERNATE MEDIA FORMAT FDM[720|144|360|120|111] FDMAUTO .EQU TRUE ; FD: AUTO SELECT DEFAULT/ALTERNATE MEDIA FORMATS +FD0TYPE .EQU FDT_3HD ; FD 0: DRIVE TYPE: FDT_[3DD|3HD|5DD|5HD|8] +FD1TYPE .EQU FDT_3HD ; FD 1: DRIVE TYPE: FDT_[3DD|3HD|5DD|5HD|8] ; RFENABLE .EQU FALSE ; RF: ENABLE RAM FLOPPY DRIVER ; @@ -225,13 +240,15 @@ PPIDE2A8BIT .EQU FALSE ; PPIDE 2A (MASTER): 8 BIT XFER PPIDE2B8BIT .EQU FALSE ; PPIDE 0B (SLAVE): 8 BIT XFER ; SDENABLE .EQU FALSE ; SD: ENABLE SD CARD DISK DRIVER (SD.ASM) -SDMODE .EQU SDMODE_PPI ; SD: DRIVER MODE: SDMODE_[JUHA|N8|CSIO|PPI|UART|DSD|MK4|SC|MT|USR] +SDMODE .EQU SDMODE_PPI ; SD: DRIVER MODE: SDMODE_[JUHA|N8|CSIO|PPI|UART|DSD|MK4|SC|MT|PIO|Z80R|USR] SDPPIBASE .EQU $60 ; SD: BASE I/O ADDRESS OF PPI FOR PPI MODDE SDCNT .EQU 1 ; SD: NUMBER OF SD CARD DEVICES (1-2), FOR DSD/SC/MT ONLY SDTRACE .EQU 1 ; SD: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) SDCSIOFAST .EQU FALSE ; SD: ENABLE TABLE-DRIVEN BIT INVERTER IN CSIO MODE SDMTSWAP .EQU FALSE ; SD: SWAP THE LOGICAL ORDER OF THE SPI PORTS OF THE MT011 ; +CHENABLE .EQU FALSE ; CH: ENABLE CH375/376 USB SUPPORT +; PRPENABLE .EQU FALSE ; PRP: ENABLE ECB PROPELLER IO BOARD DRIVER (PRP.ASM) PRPSDENABLE .EQU TRUE ; PRP: ENABLE PROPIO DRIVER SD CARD SUPPORT PRPSDTRACE .EQU 1 ; PRP: SD CARD TRACE LEVEL (0=NO,1=ERRORS,2=ALL) @@ -239,6 +256,8 @@ PRPCONENABLE .EQU TRUE ; PRP: ENABLE PROPIO DRIVER VIDEO/KBD SUPPORT ; PPPENABLE .EQU FALSE ; PPP: ENABLE ZETA PARALLEL PORT PROPELLER BOARD DRIVER (PPP.ASM) ; +ESPENABLE .EQU FALSE ; ESP: ENABLE ESP32 IO BOARD DRIVER (ESP.ASM) +; HDSKENABLE .EQU FALSE ; HDSK: ENABLE SIMH HDSK DISK DRIVER (HDSK.ASM) ; PIOENABLE .EQU FALSE ; PIO: ENABLE ZILOG PIO DRIVER (PIO.ASM) @@ -248,6 +267,12 @@ PIO1BASE .EQU $BC ; PIO 1: REGISTERS BASE ADR ; LPTENABLE .EQU FALSE ; LPT: ENABLE CENTRONICS PRINTER DRIVER (LPT.ASM) ; +PPAENABLE .EQU FALSE ; PPA: ENABLE PPA DISK DRIVER (PPA.ASM) +; +IMMENABLE .EQU FALSE ; IMM: ENABLE IMM DISK DRIVER (IMM.ASM) +; +SYQENABLE .EQU FALSE ; SYQ: ENABLE IMM DISK DRIVER (SYQ.ASM) +; PIO_4P .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB 4P BOARD PIO_ZP .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB ZILOG PERIPHERALS BOARD (PIO.ASM) PIO_SBC .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR 8255 CHIP @@ -267,7 +292,7 @@ SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM) ; DMAENABLE .EQU FALSE ; DMA: ENABLE DMA DRIVER (DMA.ASM) DMABASE .EQU $E0 ; DMA: DMA BASE ADDRESS -DMAMODE .EQU DMAMODE_Z180 ; DMA: DMA MODE (NONE|ECB|Z180|Z280|RC|MBC) +DMAMODE .EQU DMAMODE_Z180 ; DMA: DMA MODE (NONE|ECB|Z180|Z280|RC|MBC|DUO) ; -YM2612ENABLE .EQU FALSE ; YM2612: ENABLE YM2612 DRIVER (MUTE STUB) -VGMBASE .EQU $C0 ; YM2612: BASE ADDRESS FOR VGM BOARD (YM2612/SN76469s/CTC) +YM2612ENABLE .EQU FALSE ; YM2612: ENABLE YM2612 DRIVER +VGMBASE .EQU $C0 ; YM2612: BASE ADDRESS FOR VGM BOARD (YM2612/SN76489s/CTC) diff --git a/Source/HBIOS/cfg_epitx.asm b/Source/HBIOS/cfg_epitx.asm new file mode 100644 index 00000000..446b096d --- /dev/null +++ b/Source/HBIOS/cfg_epitx.asm @@ -0,0 +1,330 @@ +; +;================================================================================================== +; ROMWBW 2.X CONFIGURATION DEFAULTS FOR SC Z180 VARIANTS (SC126, SC130, ETC.) +;================================================================================================== +; +; THIS FILE CONTAINS THE FULL SET OF DEFAULT CONFIGURATION SETTINGS FOR THE PLATFORM +; INDICATED ABOVE. THIS FILE SHOULD *NOT* NORMALLY BE CHANGED. INSTEAD, YOU SHOULD +; OVERRIDE ANY SETTINGS YOU WANT USING A CONFIGURATION FILE IN THE CONFIG DIRECTORY +; UNDER THIS DIRECTORY. +; +; THIS FILE CAN BE CONSIDERED A REFERENCE THAT LISTS ALL POSSIBLE CONFIGURATION SETTINGS +; FOR THE PLATFORM. +; +#DEFINE PLATFORM_NAME "MiniITX" +; +#INCLUDE "hbios.inc" +; +PLATFORM .EQU PLT_EPITX ; PLT_[SBC|ZETA|ZETA2|N8|MK4|UNA|RCZ80|RCZ180|EZZ80|SCZ180|DYNO|RCZ280|MBC|RPH|Z80RETRO|S100|DUO|HEATH|MON] +CPUFAM .EQU CPU_Z180 ; CPU FAMILY: CPU_[Z80|Z180|Z280] +BIOS .EQU BIOS_WBW ; HARDWARE BIOS: BIOS_[WBW|UNA] +BATCOND .EQU FALSE ; ENABLE LOW BATTERY WARNING MESSAGE +HBIOS_MUTEX .EQU FALSE ; ENABLE REENTRANT CALLS TO HBIOS (ADDS OVERHEAD) +USELZSA2 .EQU TRUE ; ENABLE FONT COMPRESSION +TICKFREQ .EQU 50 ; DESIRED PERIODIC TIMER INTERRUPT FREQUENCY (HZ) +; +BOOT_TIMEOUT .EQU -1 ; AUTO BOOT TIMEOUT IN SECONDS, -1 TO DISABLE, 0 FOR IMMEDIATE +BOOT_DELAY .EQU 0 ; FIXED BOOT DELAY IN SECONDS PRIOR TO CONSOLE OUTPUT +; +CPUSPDCAP .EQU SPD_FIXED ; CPU SPEED CHANGE CAPABILITY SPD_FIXED|SPD_HILO +CPUSPDDEF .EQU SPD_HIGH ; CPU SPEED DEFAULT SPD_UNSUP|SPD_HIGH|SPD_LOW +CPUOSC .EQU 18432000 ; CPU OSC FREQ IN MHZ +INTMODE .EQU 2 ; INTERRUPTS: 0=NONE, 1=MODE 1, 2=MODE 2, 3=MODE 3 (Z280) +DEFSERCFG .EQU SER_115200_8N1 | SER_RTS ; DEFAULT SERIAL LINE CONFIG (SEE STD.ASM) +; +RAMSIZE .EQU 512 ; SIZE OF RAM IN KB (MUST MATCH YOUR HARDWARE!!!) +ROMSIZE .EQU 512 ; SIZE OF ROM IN KB (MUST MATCH YOUR HARDWARE!!!) +MEMMGR .EQU MM_Z180 ; MEMORY MANAGER: MM_[SBC|Z2|N8|Z180|Z280|MBC|RPH|MON] +RAMBIAS .EQU ROMSIZE ; OFFSET OF START OF RAM IN PHYSICAL ADDRESS SPACE +; +Z180_BASE .EQU $C0 ; Z180: I/O BASE ADDRESS FOR INTERNAL REGISTERS +Z180_CLKDIV .EQU 1 ; Z180: CHK DIV: 0=OSC/2, 1=OSC, 2=OSC*2 +Z180_MEMWAIT .EQU 0 ; Z180: MEMORY WAIT STATES (0-3) +Z180_IOWAIT .EQU 1 ; Z180: I/O WAIT STATES TO ADD ABOVE 1 W/S BUILT-IN (0-3) +Z180_TIMER .EQU TRUE ; Z180: ENABLE Z180 SYSTEM PERIODIC TIMER +; +RTCIO .EQU $0C ; RTC LATCH REGISTER ADR - TODO +; +KIOENABLE .EQU FALSE ; ENABLE ZILOG KIO SUPPORT +KIOBASE .EQU $80 ; KIO BASE I/O ADDRESS +; +CTCENABLE .EQU FALSE ; ENABLE ZILOG CTC SUPPORT +CTCDEBUG .EQU FALSE ; ENABLE CTC DRIVER DEBUG OUTPUT +CTCBASE .EQU $88 ; CTC BASE I/O ADDRESS +CTCTIMER .EQU FALSE ; ENABLE CTC PERIODIC TIMER +; +PCFENABLE .EQU FALSE ; ENABLE PCF8584 I2C CONTROLLER +PCFBASE .EQU $F0 ; PCF8584 BASE I/O ADDRESS +; +EIPCENABLE .EQU FALSE ; EIPC: ENABLE Z80 EIPC (Z84C15) INITIALIZATION +; +SKZENABLE .EQU FALSE ; ENABLE SERGEY'S Z80-512K FEATURES +; +WDOGMODE .EQU WDOG_NONE ; WATCHDOG MODE: WDOG_[NONE|EZZ80|SKZ] +; +FPENABLE .EQU FALSE ; ENABLES FRONT PANEL SWITCHES +FPBASE .EQU $00 ; FRONT PANEL I/O PORT BASE ADDRESS +DIAGENABLE .EQU TRUE ; ENABLES OUTPUT TO 8 BIT LED DIAGNOSTIC PORT +DIAGPORT .EQU $00 ; DIAGNOSTIC PORT ADDRESS +DIAGDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON DIAGNOSTIC LEDS +; +FPLED_ENABLE .EQU FALSE ; FP: ENABLES FRONT PANEL LEDS +FPLED_IO .EQU $00 ; FP: PORT ADDRESS FOR FP LEDS +FPLED_DSKACT .EQU FALSE ; FP: ENABLES DISK I/O ACTIVITY ON FP LEDS +FPSW_ENABLE .EQU FALSE ; FP: ENABLES FRONT PANEL SWITCHES +FPSW_IO .EQU $00 ; FP: PORT ADDRESS FOR FP SWITCHES +; +DIAGLVL .EQU DL_CRITICAL ; ERROR LEVEL REPORTING +; +LEDENABLE .EQU FALSE ; ENABLES STATUS LED (SINGLE LED) +LEDMODE .EQU LEDMODE_STD ; LEDMODE_[STD|RTC] +LEDPORT .EQU $0E ; STATUS LED PORT ADDRESS +LEDDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON STATUS LED +; +DSKYENABLE .EQU FALSE ; ENABLES DSKY FUNCTIONALITY +DSKYDSKACT .EQU TRUE ; ENABLES DISK ACTIVITY ON DSKY DISPLAY +ICMENABLE .EQU FALSE ; ENABLES ORIGINAL DSKY ICM DRIVER (7218) +ICMPPIBASE .EQU $60 ; BASE I/O ADDRESS OF ICM PPI +PKDENABLE .EQU FALSE ; ENABLES DSKY NG PKD DRIVER (8259) +PKDPPIBASE .EQU $60 ; BASE I/O ADDRESS OF PKD PPI +PKDOSC .EQU 3000000 ; OSCILLATOR FREQ FOR PKD (IN HZ) +H8PENABLE .EQU FALSE ; ENABLES HEATH H8 FRONT PANEL +; +BOOTCON .EQU 0 ; BOOT CONSOLE DEVICE +SECCON .EQU $FF ; SECONDARY CONSOLE DEVICE +CRTACT .EQU FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP +VDAEMU .EQU EMUTYP_ANSI ; VDA EMULATION: EMUTYP_[TTY|ANSI] +; TODO - ADD PS/2 BITBANGER +VDAEMU_SERKBD .EQU $00 ; VDA EMULATION: SERIAL KBD UNIT #, OR $FF FOR HW KBD +ANSITRACE .EQU 1 ; ANSI DRIVER TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +PPKTRACE .EQU 1 ; PPK DRIVER TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +KBDTRACE .EQU 1 ; KBD DRIVER TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +PPKKBLOUT .EQU KBD_US ; PPK KEYBOARD LANGUAGE: KBD_[US|DE] +KBDKBLOUT .EQU KBD_US ; KBD KEYBOARD LANGUAGE: KBD_[US|DE] +MKYENABLE .EQU FALSE ; MSX 5255 PPI KEYBOARD COMPATIBLE DRIVER (REQUIRES TMS VDA DRIVER) +MKYKBLOUT .EQU KBD_US ; KBD KEYBOARD LANGUAGE: KBD_[US|DE] +; +DSRTCENABLE .EQU FALSE ; DSRTC: ENABLE DS-1302 CLOCK DRIVER (DSRTC.ASM) +DSRTCMODE .EQU DSRTCMODE_STD ; DSRTC: OPERATING MODE: DSRTC_[STD|MFPIC] +DSRTCCHG .EQU FALSE ; DSRTC: FORCE BATTERY CHARGE ON (USE WITH CAUTION!!!) +; +DS1501RTCENABLE .EQU FALSE ; DS1501RTC: ENABLE DS-1501 CLOCK DRIVER (DS1501RTC.ASM) +DS1501RTC_BASE .EQU $50 ; DS1501RTC: I/O BASE ADDRESS +; +BQRTCENABLE .EQU FALSE ; BQRTC: ENABLE BQ4845 CLOCK DRIVER (BQRTC.ASM) +BQRTC_BASE .EQU $50 ; BQRTC: I/O BASE ADDRESS +; +INTRTCENABLE .EQU FALSE ; ENABLE PERIODIC INTERRUPT CLOCK DRIVER (INTRTC.ASM) +; +RP5RTCENABLE .EQU FALSE ; RP5C01 RTC BASED CLOCK (RP5RTC.ASM) +; +HTIMENABLE .EQU FALSE ; ENABLE SIMH TIMER SUPPORT +SIMRTCENABLE .EQU FALSE ; ENABLE SIMH CLOCK DRIVER (SIMRTC.ASM) +; +DS7RTCENABLE .EQU FALSE ; DS7RTC: ENABLE DS-1307 I2C CLOCK DRIVER (DS7RTC.ASM) +DS7RTCMODE .EQU DS7RTCMODE_PCF ; DS7RTC: OPERATING MODE: DS7RTC_[PCF] +; +DUARTENABLE .EQU FALSE ; DUART: ENABLE 2681/2692 SERIAL DRIVER (DUART.ASM) +DUARTCNT .EQU 2 ; DUART: NUMBER OF CHIPS TO DETECT (1-2) +DUART0BASE .EQU $A0 ; DUART 0: BASE ADDRESS OF CHIP +DUART0ACFG .EQU DEFSERCFG ; DUART 0A: SERIAL LINE CONFIG +DUART0BCFG .EQU DEFSERCFG ; DUART 0B: SERIAL LINE CONFIG +DUART1BASE .EQU $40 ; DUART 1: BASE ADDRESS OF CHIP +DUART1ACFG .EQU DEFSERCFG ; DUART 1A: SERIAL LINE CONFIG +DUART1BCFG .EQU DEFSERCFG ; DUART 1B: SERIAL LINE CONFIG +; +UARTENABLE .EQU TRUE ; UART: ENABLE 8250/16550-LIKE SERIAL DRIVER (UART.ASM) +UARTOSC .EQU 1843200 ; UART: OSC FREQUENCY IN MHZ +UARTINTS .EQU FALSE ; UART: INCLUDE INTERRUPT SUPPORT UNDER IM1/2/3 +UARTCFG .EQU DEFSERCFG | SER_RTS ; UART: LINE CONFIG FOR UART PORTS +UARTSBC .EQU FALSE ; UART: AUTO-DETECT SBC/ZETA/DUO ONBOARD UART +UARTSBCFORCE .EQU FALSE ; UART: FORCE DETECTION OF SBC UART (FOR SIMH) +UARTAUX .EQU FALSE ; UART: AUTO-DETECT AUX UART +UARTCAS .EQU FALSE ; UART: AUTO-DETECT ECB CASSETTE UART +UARTMFP .EQU FALSE ; UART: AUTO-DETECT MF/PIC UART +UART4 .EQU FALSE ; UART: AUTO-DETECT 4UART UART +UARTRC .EQU TRUE ; UART: AUTO-DETECT RC UART +UARTDUAL .EQU FALSE ; UART: AUTO-DETECT DUAL UART +; +ASCIENABLE .EQU TRUE ; ASCI: ENABLE Z180 ASCI SERIAL DRIVER (ASCI.ASM) +ASCIINTS .EQU TRUE ; ASCI: INCLUDE INTERRUPT SUPPORT UNDER IM1/2/3 +ASCISWAP .EQU FALSE ; ASCI: SWAP CHANNELS +ASCIBOOT .EQU 0 ; ASCI: REBOOT ON RCV CHAR (0=DISABLED) +ASCI0CFG .EQU DEFSERCFG ; ASCI 0: SERIAL LINE CONFIG +ASCI1CFG .EQU DEFSERCFG ; ASCI 1: SERIAL LINE CONFIG +; +Z2UENABLE .EQU FALSE ; Z2U: ENABLE Z280 UART SERIAL DRIVER (Z2U.ASM) +; +ACIAENABLE .EQU FALSE ; ACIA: ENABLE MOTOROLA 6850 ACIA DRIVER (ACIA.ASM) +; +SIOENABLE .EQU FALSE ; SIO: ENABLE ZILOG SIO SERIAL DRIVER (SIO.ASM) +SIODEBUG .EQU FALSE ; SIO: ENABLE DEBUG OUTPUT +SIOBOOT .EQU 0 ; SIO: REBOOT ON RCV CHAR (0=DISABLED) +SIOCNT .EQU 2 ; SIO: NUMBER OF CHIPS TO DETECT (1-2), 2 CHANNELS PER CHIP +SIO0MODE .EQU SIOMODE_RC ; SIO 0: CHIP TYPE: SIOMODE_[STD|RC|SMB|ZP|Z80R] +SIO0BASE .EQU $80 ; SIO 0: REGISTERS BASE ADR +SIO0ACLK .EQU 7372800 ; SIO 0A: OSC FREQ IN HZ, ZP=2457600/4915200, RC/SMB=7372800 +SIO0ACFG .EQU SER_115200_8N1 ; SIO 0A: SERIAL LINE CONFIG +SIO0ACTCC .EQU -1 ; SIO 0A: CTC CHANNEL 0=A, 1=B, 2=C, 3=D, -1 FOR NONE +SIO0BCLK .EQU 7372800 ; SIO 0B: OSC FREQ IN HZ, ZP=2457600/4915200, RC/SMB=7372800 +SIO0BCFG .EQU SER_115200_8N1 ; SIO 0B: SERIAL LINE CONFIG +SIO0BCTCC .EQU -1 ; SIO 0B: CTC CHANNEL 0=A, 1=B, 2=C, 3=D, -1 FOR NONE +SIO1MODE .EQU SIOMODE_RC ; SIO 1: CHIP TYPE: SIOMODE_[STD|RC|SMB|ZP|Z80R] +SIO1BASE .EQU $84 ; SIO 1: REGISTERS BASE ADR +SIO1ACLK .EQU 7372800 ; SIO 1A: OSC FREQ IN HZ, ZP=2457600/4915200, RC/SMB=7372800 +SIO1ACFG .EQU SER_115200_8N1 ; SIO 1A: SERIAL LINE CONFIG +SIO1ACTCC .EQU -1 ; SIO 1A: CTC CHANNEL 0=A, 1=B, 2=C, 3=D, -1 FOR NONE +SIO1BCLK .EQU 7372800 ; SIO 1B: OSC FREQ IN HZ, ZP=2457600/4915200, RC/SMB=7372800 +SIO1BCFG .EQU SER_115200_8N1 ; SIO 1B: SERIAL LINE CONFIG +SIO1BCTCC .EQU -1 ; SIO 1B: CTC CHANNEL 0=A, 1=B, 2=C, 3=D, -1 FOR NONE +; +XIOCFG .EQU DEFSERCFG ; XIO: SERIAL LINE CONFIG +; +VDUENABLE .EQU FALSE ; VDU: ENABLE VDU VIDEO/KBD DRIVER (VDU.ASM) +CVDUENABLE .EQU FALSE ; CVDU: ENABLE CVDU VIDEO/KBD DRIVER (CVDU.ASM) +GDCENABLE .EQU FALSE ; GDC: ENABLE 7220 GDC VIDEO/KBD DRIVER (GDC.ASM) +TMSENABLE .EQU FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM) +TMSMODE .EQU TMSMODE_MSX ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|MSX9958|MSXKBD|COLECO] +TMSTIMENABLE .EQU FALSE ; TMS: ENABLE TIMER INTERRUPTS (REQUIRES IM1) +VGAENABLE .EQU FALSE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM) +VRCENABLE .EQU FALSE ; VRC: ENABLE VGARC VIDEO/KBD DRIVER (VRC.ASM) +SCONENABLE .EQU FALSE ; SCON: ENABLE S100 CONSOLE DRIVER (SCON.ASM) +; +MDENABLE .EQU TRUE ; MD: ENABLE MEMORY (ROM/RAM) DISK DRIVER (MD.ASM) +MDROM .EQU TRUE ; MD: ENABLE ROM DISK +MDRAM .EQU TRUE ; MD: ENABLE RAM DISK +MDTRACE .EQU 1 ; MD: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +MDFFENABLE .EQU FALSE ; MD: ENABLE FLASH FILE SYSTEM +; +FDENABLE .EQU TRUE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM) +FDMODE .EQU FDMODE_EPFDC ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPFDC|MBC] +FDCNT .EQU 2 ; FD: NUMBER OF FLOPPY DRIVES ON THE INTERFACE (1-2) +FDTRACE .EQU 1 ; FD: TRACE LEVEL (0=NO,1=FATAL,2=ERRORS,3=ALL) +FDMAUTO .EQU TRUE ; FD: AUTO SELECT DEFAULT/ALTERNATE MEDIA FORMATS +FD0TYPE .EQU FDT_3HD ; FD 0: DRIVE TYPE: FDT_[3DD|3HD|5DD|5HD|8] +FD1TYPE .EQU FDT_3HD ; FD 1: DRIVE TYPE: FDT_[3DD|3HD|5DD|5HD|8] +; +RFENABLE .EQU FALSE ; RF: ENABLE RAM FLOPPY DRIVER +; +IDEENABLE .EQU FALSE ; IDE: ENABLE IDE DISK DRIVER (IDE.ASM) +IDETRACE .EQU 1 ; IDE: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +IDECNT .EQU 1 ; IDE: NUMBER OF IDE INTERFACES TO DETECT (1-3), 2 DRIVES EACH +IDE0MODE .EQU IDEMODE_RC ; IDE 0: DRIVER MODE: IDEMODE_[DIO|DIDE|MK4|RC] +IDE0BASE .EQU $10 ; IDE 0: IO BASE ADDRESS +IDE0DATLO .EQU $00 ; IDE 0: DATA LO PORT FOR 16-BIT I/O +IDE0DATHI .EQU $00 ; IDE 0: DATA HI PORT FOR 16-BIT I/O +IDE0A8BIT .EQU TRUE ; IDE 0A (MASTER): 8 BIT XFER +IDE0B8BIT .EQU TRUE ; IDE 0B (MASTER): 8 BIT XFER +IDE1MODE .EQU IDEMODE_NONE ; IDE 1: DRIVER MODE: IDEMODE_[DIO|DIDE|MK4|RC] +IDE1BASE .EQU $00 ; IDE 1: IO BASE ADDRESS +IDE1DATLO .EQU $00 ; IDE 1: DATA LO PORT FOR 16-BIT I/O +IDE1DATHI .EQU $00 ; IDE 1: DATA HI PORT FOR 16-BIT I/O +IDE1A8BIT .EQU TRUE ; IDE 1A (MASTER): 8 BIT XFER +IDE1B8BIT .EQU TRUE ; IDE 1B (MASTER): 8 BIT XFER +IDE2MODE .EQU IDEMODE_NONE ; IDE 2: DRIVER MODE: IDEMODE_[DIO|DIDE|MK4|RC] +IDE2BASE .EQU $00 ; IDE 2: IO BASE ADDRESS +IDE2DATLO .EQU $00 ; IDE 2: DATA LO PORT FOR 16-BIT I/O +IDE2DATHI .EQU $00 ; IDE 2: DATA HI PORT FOR 16-BIT I/O +IDE2A8BIT .EQU TRUE ; IDE 2A (MASTER): 8 BIT XFER +IDE2B8BIT .EQU TRUE ; IDE 2B (MASTER): 8 BIT XFER +; +PPIDEENABLE .EQU FALSE ; PPIDE: ENABLE PARALLEL PORT IDE DISK DRIVER (PPIDE.ASM) +PPIDETRACE .EQU 1 ; PPIDE: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +PPIDECNT .EQU 1 ; PPIDE: NUMBER OF PPI CHIPS TO DETECT (1-3), 2 DRIVES PER CHIP +PPIDE0BASE .EQU $20 ; PPIDE 0: PPI REGISTERS BASE ADR +PPIDE0A8BIT .EQU FALSE ; PPIDE 0A (MASTER): 8 BIT XFER +PPIDE0B8BIT .EQU FALSE ; PPIDE 0B (SLAVE): 8 BIT XFER +PPIDE1BASE .EQU $00 ; PPIDE 1: PPI REGISTERS BASE ADR +PPIDE1A8BIT .EQU FALSE ; PPIDE 1A (MASTER): 8 BIT XFER +PPIDE1B8BIT .EQU FALSE ; PPIDE 0B (SLAVE): 8 BIT XFER +PPIDE2BASE .EQU $00 ; PPIDE 2: PPI REGISTERS BASE ADR +PPIDE2A8BIT .EQU FALSE ; PPIDE 2A (MASTER): 8 BIT XFER +PPIDE2B8BIT .EQU FALSE ; PPIDE 0B (SLAVE): 8 BIT XFER +; +SDENABLE .EQU TRUE ; SD: ENABLE SD CARD DISK DRIVER (SD.ASM) +SDMODE .EQU SDMODE_EPITX ; SD: DRIVER MODE: SDMODE_[JUHA|N8|CSIO|PPI|UART|DSD|MK4|SC|MT|EPITX] +SDPPIBASE .EQU $40 ; SD: BASE I/O ADDRESS OF PPI FOR PPI MODDE +SDCNT .EQU 1 ; SD: NUMBER OF SD CARD DEVICES (1-2), FOR DSD & SC ONLY +SDTRACE .EQU 2 ; SD: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +SDCSIOFAST .EQU FALSE ; SD: ENABLE TABLE-DRIVEN BIT INVERTER IN CSIO MODE +SDMTSWAP .EQU FALSE ; SD: SWAP THE LOGICAL ORDER OF THE SPI PORTS OF THE MT011 +; +CHENABLE .EQU FALSE ; CH: ENABLE CH375/376 USB SUPPORT +CHTRACE .EQU 1 ; CH: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +CHUSBTRACE .EQU 1 ; CHUSB: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +CHSDTRACE .EQU 1 ; CHSD: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +CHCNT .EQU 2 ; CH: NUMBER OF BOARDS TO DETECT (1-2) +CH0BASE .EQU $3E ; CH 0: BASE I/O ADDRESS +CH0USBENABLE .EQU TRUE ; CH 0: ENABLE USB DISK +CH0SDENABLE .EQU FALSE ; CH 0: ENABLE SD DISK +CH1BASE .EQU $3C ; CH 1: BASE I/O ADDRESS +CH1USBENABLE .EQU TRUE ; CH 1: ENABLE USB DISK +CH1SDENABLE .EQU FALSE ; CH 1: ENABLE SD DISK +; +PRPENABLE .EQU FALSE ; PRP: ENABLE ECB PROPELLER IO BOARD DRIVER (PRP.ASM) +PRPSDENABLE .EQU TRUE ; PRP: ENABLE PROPIO DRIVER SD CARD SUPPORT +PRPSDTRACE .EQU 1 ; PRP: SD CARD TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +PRPCONENABLE .EQU TRUE ; PRP: ENABLE PROPIO DRIVER VIDEO/KBD SUPPORT +; +PPPENABLE .EQU FALSE ; PPP: ENABLE ZETA PARALLEL PORT PROPELLER BOARD DRIVER (PPP.ASM) +; +ESPENABLE .EQU FALSE ; ESP: ENABLE ESP32 IO BOARD DRIVER (ESP.ASM) +; +HDSKENABLE .EQU FALSE ; HDSK: ENABLE SIMH HDSK DISK DRIVER (HDSK.ASM) +; +PIOENABLE .EQU FALSE ; PIO: ENABLE ZILOG PIO DRIVER (PIO.ASM) +PIOCNT .EQU 2 ; PIO: NUMBER OF CHIPS TO DETECT (1-2), 2 CHANNELS PER CHIP +PIO0BASE .EQU $B8 ; PIO 0: REGISTERS BASE ADR +PIO1BASE .EQU $BC ; PIO 1: REGISTERS BASE ADR +; +LPTENABLE .EQU FALSE ; LPT: ENABLE CENTRONICS PRINTER DRIVER (LPT.ASM) +LPTMODE .EQU LPTMODE_MG014 ; LPT: DRIVER MODE: LPTMODE_[NONE|SPP|MG014] +LPTCNT .EQU 1 ; LPT: NUMBER OF CHIPS TO DETECT (1-2) +LPTTRACE .EQU 1 ; LPT: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +LPT0BASE .EQU $0C ; LPT 0: REGISTERS BASE ADR +LPT1BASE .EQU $00 ; LPT 1: REGISTERS BASE ADR +; +PPAENABLE .EQU FALSE ; PPA: ENABLE PPA DISK DRIVER (PPA.ASM) +PPACNT .EQU 1 ; PPA: NUMBER OF PPA DEVICES (1-2) +PPATRACE .EQU 1 ; PPA: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +PPAMODE .EQU PPAMODE_MG014 ; PPA: DRIVER MODE: PPAMODE_[NONE|SPP|MG014] +PPA0BASE .EQU LPT0BASE ; PPA 0: BASE I/O ADDRESS OF PPI FOR PPA +PPA1BASE .EQU LPT1BASE ; PPA 1: BASE I/O ADDRESS OF PPI FOR PPA +; +IMMENABLE .EQU FALSE ; IMM: ENABLE IMM DISK DRIVER (IMM.ASM) +IMMCNT .EQU 1 ; IMM: NUMBER OF IMM DEVICES (1-2) +IMMTRACE .EQU 1 ; IMM: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +IMMMODE .EQU IMMMODE_MG014 ; IMM: DRIVER MODE: IMMMODE_[NONE|SPP|MG014] +IMM0BASE .EQU LPT0BASE ; IMM 0: BASE I/O ADDRESS OF PPI FOR IMM +IMM1BASE .EQU LPT1BASE ; IMM 1: BASE I/O ADDRESS OF PPI FOR IMM +; +SYQENABLE .EQU FALSE ; SYQ: ENABLE IMM DISK DRIVER (SYQ.ASM) +SYQCNT .EQU 1 ; SYQ: NUMBER OF SYQ DEVICES (1-2) +SYQTRACE .EQU 1 ; SYQ: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +SYQMODE .EQU IMMMODE_MG014 ; SYQ: DRIVER MODE: SYQMODE_[NONE|SPP|MG014] +SYQ0BASE .EQU LPT0BASE ; SYQ 0: BASE I/O ADDRESS OF PPI FOR SYQ +SYQ1BASE .EQU LPT1BASE ; SYQ 1: BASE I/O ADDRESS OF PPI FOR SYQ +; +PIO_4P .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB 4P BOARD +PIO_ZP .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB ZILOG PERIPHERALS BOARD (PIO.ASM) +PIO_SBC .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR 8255 CHIP +; +UFENABLE .EQU FALSE ; UF: ENABLE ECB USB FIFO DRIVER (UF.ASM) +; +SN76489ENABLE .EQU FALSE ; SN: ENABLE SN76489 SOUND DRIVER +AUDIOTRACE .EQU FALSE ; ENABLE TRACING TO CONSOLE OF SOUND DRIVER +SN7CLK .EQU 3579545 ; SN: PSG CLOCK FREQ, ASSUME MSX STD +SNMODE .EQU SNMODE_RC ; SN: DRIVER MODE: SNMODE_[NONE|RC|VGM] +; +AY38910ENABLE .EQU FALSE ; AY: ENABLE AY-3-8910 / YM2149 SOUND DRIVER +AY_CLK .EQU 1789772 ; AY: PSG CLOCK FREQ, ASSUME MSX STD +AYMODE .EQU AYMODE_RCZ180 ; AY: DRIVER MODE: AYMODE_[SCG|N8|RCZ80|RCZ180|MSX|LINC|MBC] +; +SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM) +; +DMAENABLE .EQU FALSE ; DMA: ENABLE DMA DRIVER (DMA.ASM) +DMABASE .EQU $E0 ; DMA: DMA BASE ADDRESS +DMAMODE .EQU DMAMODE_Z180 ; DMA: DMA MODE (NONE|ECB|Z180|Z280|RC|MBC|DUO) +; +YM2612ENABLE .EQU FALSE ; YM2612: ENABLE YM2612 DRIVER +VGMBASE .EQU $C0 ; YM2612: BASE ADDRESS FOR VGM BOARD (YM2612/SN76489s/CTC) diff --git a/Source/HBIOS/cfg_heath.asm b/Source/HBIOS/cfg_heath.asm new file mode 100644 index 00000000..d3014c57 --- /dev/null +++ b/Source/HBIOS/cfg_heath.asm @@ -0,0 +1,323 @@ +; +;================================================================================================== +; ROMWBW 3.X CONFIGURATION DEFAULTS FOR RCBUS Z80 +;================================================================================================== +; +; THIS FILE CONTAINS THE FULL SET OF DEFAULT CONFIGURATION SETTINGS FOR THE PLATFORM +; INDICATED ABOVE. THIS FILE SHOULD *NOT* NORMALLY BE CHANGED. INSTEAD, YOU SHOULD +; OVERRIDE ANY SETTINGS YOU WANT USING A CONFIGURATION FILE IN THE CONFIG DIRECTORY +; UNDER THIS DIRECTORY. +; +; THIS FILE CAN BE CONSIDERED A REFERENCE THAT LISTS ALL POSSIBLE CONFIGURATION SETTINGS +; FOR THE PLATFORM. +; +#DEFINE PLATFORM_NAME "RCBus", " [", CONFIG, "]" +; +#INCLUDE "hbios.inc" +; +PLATFORM .EQU PLT_HEATH ; PLT_[SBC|ZETA|ZETA2|N8|MK4|UNA|RCZ80|RCZ180|EZZ80|SCZ180|DYNO|RCZ280|MBC|RPH|Z80RETRO|S100|DUO|HEATH|MON] +CPUFAM .EQU CPU_Z80 ; CPU FAMILY: CPU_[Z80|Z180|Z280] +BIOS .EQU BIOS_WBW ; HARDWARE BIOS: BIOS_[WBW|UNA] +BATCOND .EQU FALSE ; ENABLE LOW BATTERY WARNING MESSAGE +HBIOS_MUTEX .EQU FALSE ; ENABLE REENTRANT CALLS TO HBIOS (ADDS OVERHEAD) +USELZSA2 .EQU TRUE ; ENABLE FONT COMPRESSION +TICKFREQ .EQU 50 ; DESIRED PERIODIC TIMER INTERRUPT FREQUENCY (HZ) +; +BOOT_TIMEOUT .EQU -1 ; AUTO BOOT TIMEOUT IN SECONDS, -1 TO DISABLE, 0 FOR IMMEDIATE +BOOT_DELAY .EQU 0 ; FIXED BOOT DELAY IN SECONDS PRIOR TO CONSOLE OUTPUT +; +CPUSPDCAP .EQU SPD_FIXED ; CPU SPEED CHANGE CAPABILITY SPD_FIXED|SPD_HILO +CPUSPDDEF .EQU SPD_HIGH ; CPU SPEED DEFAULT SPD_UNSUP|SPD_HIGH|SPD_LOW +CPUOSC .EQU 7372800 ; CPU OSC FREQ IN MHZ +INTMODE .EQU 1 ; INTERRUPTS: 0=NONE, 1=MODE 1, 2=MODE 2, 3=MODE 3 (Z280) +DEFSERCFG .EQU SER_115200_8N1 | SER_RTS ; DEFAULT SERIAL LINE CONFIG (SEE STD.ASM) +; +RAMSIZE .EQU 512 ; SIZE OF RAM IN KB (MUST MATCH YOUR HARDWARE!!!) +ROMSIZE .EQU 512 ; SIZE OF ROM IN KB (MUST MATCH YOUR HARDWARE!!!) +MEMMGR .EQU MM_Z2 ; MEMORY MANAGER: MM_[SBC|Z2|N8|Z180|Z280|MBC|RPH|MON] +MPGSEL_0 .EQU $78 ; Z2 MEM MGR BANK 0 PAGE SELECT REG (WRITE ONLY) +MPGSEL_1 .EQU $79 ; Z2 MEM MGR BANK 1 PAGE SELECT REG (WRITE ONLY) +MPGSEL_2 .EQU $7A ; Z2 MEM MGR BANK 2 PAGE SELECT REG (WRITE ONLY) +MPGSEL_3 .EQU $7B ; Z2 MEM MGR BANK 3 PAGE SELECT REG (WRITE ONLY) +MPGENA .EQU $7C ; Z2 MEM MGR PAGING ENABLE REGISTER (BIT 0, WRITE ONLY) +; +RTCIO .EQU $C0 ; RTC LATCH REGISTER ADR +; +KIOENABLE .EQU FALSE ; ENABLE ZILOG KIO SUPPORT +KIOBASE .EQU $80 ; KIO BASE I/O ADDRESS +; +CTCENABLE .EQU FALSE ; ENABLE ZILOG CTC SUPPORT +CTCDEBUG .EQU FALSE ; ENABLE CTC DRIVER DEBUG OUTPUT +CTCBASE .EQU $88 ; CTC BASE I/O ADDRESS +CTCTIMER .EQU FALSE ; ENABLE CTC PERIODIC TIMER +CTCMODE .EQU CTCMODE_TIM16 ; CTC MODE: CTCMODE_[NONE|CTR|TIM16|TIM256] +CTCPRE .EQU 256 ; PRESCALE CONSTANT (1-256) +CTCPRECH .EQU 2 ; PRESCALE CHANNEL (0-3) +CTCTIMCH .EQU 3 ; TIMER CHANNEL (0-3) +CTCOSC .EQU CPUOSC ; CTC CLOCK FREQUENCY +; +PCFENABLE .EQU FALSE ; ENABLE PCF8584 I2C CONTROLLER +PCFBASE .EQU $F0 ; PCF8584 BASE I/O ADDRESS +; +EIPCENABLE .EQU FALSE ; EIPC: ENABLE Z80 EIPC (Z84C15) INITIALIZATION +; +SKZENABLE .EQU FALSE ; ENABLE SERGEY'S Z80-512K FEATURES +SKZDIV .EQU DIV_1 ; UART CLK (CLK2) DIVIDER FOR Z80-512K +; +WDOGMODE .EQU WDOG_NONE ; WATCHDOG MODE: WDOG_[NONE|EZZ80|SKZ] +WDOGIO .EQU $6E ; WATCHDOG REGISTER ADR +; +FPLED_ENABLE .EQU FALSE ; FP: ENABLES FRONT PANEL LEDS +FPLED_IO .EQU $00 ; FP: PORT ADDRESS FOR FP LEDS +FPLED_DSKACT .EQU TRUE ; FP: ENABLES DISK I/O ACTIVITY ON FP LEDS +FPSW_ENABLE .EQU FALSE ; FP: ENABLES FRONT PANEL SWITCHES +FPSW_IO .EQU $00 ; FP: PORT ADDRESS FOR FP SWITCHES +; +DIAGLVL .EQU DL_CRITICAL ; ERROR LEVEL REPORTING +; +LEDENABLE .EQU FALSE ; ENABLES STATUS LED (SINGLE LED) +LEDMODE .EQU LEDMODE_STD ; LEDMODE_[STD|RTC] +LEDPORT .EQU $0E ; STATUS LED PORT ADDRESS +LEDDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON STATUS LED +; +DSKYENABLE .EQU FALSE ; ENABLES DSKY FUNCTIONALITY +DSKYDSKACT .EQU TRUE ; ENABLES DISK ACTIVITY ON DSKY DISPLAY +ICMENABLE .EQU FALSE ; ENABLES ORIGINAL DSKY ICM DRIVER (7218) +ICMPPIBASE .EQU $60 ; BASE I/O ADDRESS OF ICM PPI +PKDENABLE .EQU FALSE ; ENABLES DSKY NG PKD DRIVER (8259) +PKDPPIBASE .EQU $60 ; BASE I/O ADDRESS OF PKD PPI +PKDOSC .EQU 3000000 ; OSCILLATOR FREQ FOR PKD (IN HZ) +H8PENABLE .EQU FALSE ; ENABLES HEATH H8 FRONT PANEL +; +BOOTCON .EQU 0 ; BOOT CONSOLE DEVICE +SECCON .EQU $FF ; SECONDARY CONSOLE DEVICE +CRTACT .EQU FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP +VDAEMU .EQU EMUTYP_ANSI ; VDA EMULATION: EMUTYP_[TTY|ANSI] +VDAEMU_SERKBD .EQU $FF ; VDA EMULATION: SERIAL KBD UNIT #, OR $FF FOR HW KBD +ANSITRACE .EQU 1 ; ANSI DRIVER TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +PPKTRACE .EQU 1 ; PPK DRIVER TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +KBDTRACE .EQU 1 ; KBD DRIVER TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +KBDKBLOUT .EQU KBD_US ; KBD KEYBOARD LANGUAGE: KBD_[US|DE] +PPKKBLOUT .EQU KBD_US ; PPK KEYBOARD LANGUAGE: KBD_[US|DE] +MKYENABLE .EQU FALSE ; MSX 5255 PPI KEYBOARD COMPATIBLE DRIVER (REQUIRES TMS VDA DRIVER) +MKYKBLOUT .EQU KBD_US ; KBD KEYBOARD LANGUAGE: KBD_[US|DE] +; +DSRTCENABLE .EQU TRUE ; DSRTC: ENABLE DS-1302 CLOCK DRIVER (DSRTC.ASM) +DSRTCMODE .EQU DSRTCMODE_STD ; DSRTC: OPERATING MODE: DSRTC_[STD|MFPIC] +DSRTCCHG .EQU FALSE ; DSRTC: FORCE BATTERY CHARGE ON (USE WITH CAUTION!!!) +; +DS1501RTCENABLE .EQU FALSE ; DS1501RTC: ENABLE DS-1501 CLOCK DRIVER (DS1501RTC.ASM) +DS1501RTC_BASE .EQU $50 ; DS1501RTC: I/O BASE ADDRESS +; +BQRTCENABLE .EQU FALSE ; BQRTC: ENABLE BQ4845 CLOCK DRIVER (BQRTC.ASM) +BQRTC_BASE .EQU $50 ; BQRTC: I/O BASE ADDRESS +; +INTRTCENABLE .EQU FALSE ; ENABLE PERIODIC INTERRUPT CLOCK DRIVER (INTRTC.ASM) +; +RP5RTCENABLE .EQU FALSE ; RP5C01 RTC BASED CLOCK (RP5RTC.ASM) +; +HTIMENABLE .EQU FALSE ; ENABLE SIMH TIMER SUPPORT +SIMRTCENABLE .EQU FALSE ; ENABLE SIMH CLOCK DRIVER (SIMRTC.ASM) +; +DS7RTCENABLE .EQU FALSE ; DS7RTC: ENABLE DS-1307 I2C CLOCK DRIVER (DS7RTC.ASM) +DS7RTCMODE .EQU DS7RTCMODE_PCF ; DS7RTC: OPERATING MODE: DS7RTC_[PCF] +; +DUARTENABLE .EQU FALSE ; DUART: ENABLE 2681/2692 SERIAL DRIVER (DUART.ASM) +DUARTCNT .EQU 1 ; DUART: NUMBER OF CHIPS TO DETECT (1-2) +DUART0BASE .EQU $A0 ; DUART 0: BASE ADDRESS OF CHIP +DUART0ACFG .EQU DEFSERCFG ; DUART 0A: SERIAL LINE CONFIG +DUART0BCFG .EQU DEFSERCFG ; DUART 0B: SERIAL LINE CONFIG +DUART1BASE .EQU $40 ; DUART 1: BASE ADDRESS OF CHIP +DUART1ACFG .EQU DEFSERCFG ; DUART 1A: SERIAL LINE CONFIG +DUART1BCFG .EQU DEFSERCFG ; DUART 1B: SERIAL LINE CONFIG +; +UARTENABLE .EQU TRUE ; UART: ENABLE 8250/16550-LIKE SERIAL DRIVER (UART.ASM) +UARTOSC .EQU 1843200 ; UART: OSC FREQUENCY IN MHZ +UARTINTS .EQU FALSE ; UART: INCLUDE INTERRUPT SUPPORT UNDER IM1/2/3 +UARTCFG .EQU DEFSERCFG | SER_RTS ; UART: LINE CONFIG FOR UART PORTS +UARTSBC .EQU FALSE ; UART: AUTO-DETECT SBC/ZETA/DUO ONBOARD UART +UARTSBCFORCE .EQU FALSE ; UART: FORCE DETECTION OF SBC UART (FOR SIMH) +UARTAUX .EQU FALSE ; UART: AUTO-DETECT AUX UART +UARTCAS .EQU FALSE ; UART: AUTO-DETECT ECB CASSETTE UART +UARTMFP .EQU FALSE ; UART: AUTO-DETECT MF/PIC UART +UART4 .EQU FALSE ; UART: AUTO-DETECT 4UART UART +UARTRC .EQU TRUE ; UART: AUTO-DETECT RC UART +UARTDUAL .EQU FALSE ; UART: AUTO-DETECT DUAL UART +; +ASCIENABLE .EQU FALSE ; ASCI: ENABLE Z180 ASCI SERIAL DRIVER (ASCI.ASM) +; +Z2UENABLE .EQU FALSE ; Z2U: ENABLE Z280 UART SERIAL DRIVER (Z2U.ASM) +; +ACIAENABLE .EQU TRUE ; ACIA: ENABLE MOTOROLA 6850 ACIA DRIVER (ACIA.ASM) +ACIADEBUG .EQU FALSE ; ACIA: ENABLE DEBUG OUTPUT +ACIACNT .EQU 1 ; ACIA: NUMBER OF CHIPS TO DETECT (1-2) +ACIA0BASE .EQU $80 ; ACIA 0: REGISTERS BASE ADR +ACIA0CLK .EQU CPUOSC ; ACIA 0: OSC FREQ IN HZ +ACIA0DIV .EQU 1 ; ACIA 0: SERIAL CLOCK DIVIDER +ACIA0CFG .EQU DEFSERCFG ; ACIA 0: SERIAL LINE CONFIG (SEE STD.ASM) +ACIA1BASE .EQU $40 ; ACIA 1: REGISTERS BASE ADR +ACIA1CLK .EQU CPUOSC ; ACIA 1: OSC FREQ IN HZ +ACIA1DIV .EQU 1 ; ACIA 1: SERIAL CLOCK DIVIDER +ACIA1CFG .EQU DEFSERCFG ; ACIA 1: SERIAL LINE CONFIG (SEE STD.ASM) +; +SIOENABLE .EQU TRUE ; SIO: ENABLE ZILOG SIO SERIAL DRIVER (SIO.ASM) +SIODEBUG .EQU FALSE ; SIO: ENABLE DEBUG OUTPUT +SIOBOOT .EQU 0 ; SIO: REBOOT ON RCV CHAR (0=DISABLED) +SIOCNT .EQU 2 ; SIO: NUMBER OF CHIPS TO DETECT (1-2), 2 CHANNELS PER CHIP +SIO0MODE .EQU SIOMODE_RC ; SIO 0: CHIP TYPE: SIOMODE_[STD|RC|SMB|ZP|Z80R] +SIO0BASE .EQU $80 ; SIO 0: REGISTERS BASE ADR +SIO0ACLK .EQU CPUOSC ; SIO 0A: OSC FREQ IN HZ, ZP=2457600/4915200, RC/SMB=7372800 +SIO0ACFG .EQU DEFSERCFG ; SIO 0A: SERIAL LINE CONFIG +SIO0ACTCC .EQU -1 ; SIO 0A: CTC CHANNEL 0=A, 1=B, 2=C, 3=D, -1 FOR NONE +SIO0BCLK .EQU CPUOSC ; SIO 0B: OSC FREQ IN HZ, ZP=2457600/4915200, RC/SMB=7372800 +SIO0BCFG .EQU DEFSERCFG ; SIO 0B: SERIAL LINE CONFIG +SIO0BCTCC .EQU -1 ; SIO 0B: CTC CHANNEL 0=A, 1=B, 2=C, 3=D, -1 FOR NONE +SIO1MODE .EQU SIOMODE_RC ; SIO 1: CHIP TYPE: SIOMODE_[STD|RC|SMB|ZP|Z80R] +SIO1BASE .EQU $84 ; SIO 1: REGISTERS BASE ADR +SIO1ACLK .EQU CPUOSC ; SIO 1A: OSC FREQ IN HZ, ZP=2457600/4915200, RC/SMB=7372800 +SIO1ACFG .EQU DEFSERCFG ; SIO 1A: SERIAL LINE CONFIG +SIO1ACTCC .EQU -1 ; SIO 1A: CTC CHANNEL 0=A, 1=B, 2=C, 3=D, -1 FOR NONE +SIO1BCLK .EQU CPUOSC ; SIO 1B: OSC FREQ IN HZ, ZP=2457600/4915200, RC/SMB=7372800 +SIO1BCFG .EQU DEFSERCFG ; SIO 1B: SERIAL LINE CONFIG +SIO1BCTCC .EQU -1 ; SIO 1B: CTC CHANNEL 0=A, 1=B, 2=C, 3=D, -1 FOR NONE +; +XIOCFG .EQU DEFSERCFG ; XIO: SERIAL LINE CONFIG +; +VDUENABLE .EQU FALSE ; VDU: ENABLE VDU VIDEO/KBD DRIVER (VDU.ASM) +CVDUENABLE .EQU FALSE ; CVDU: ENABLE CVDU VIDEO/KBD DRIVER (CVDU.ASM) +GDCENABLE .EQU FALSE ; GDC: ENABLE 7220 GDC VIDEO/KBD DRIVER (GDC.ASM) +TMSENABLE .EQU FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM) +TMSMODE .EQU TMSMODE_MSX ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|MSX9958|MSXKBD|COLECO] +TMSTIMENABLE .EQU FALSE ; TMS: ENABLE TIMER INTERRUPTS (REQUIRES IM1) +VGAENABLE .EQU FALSE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM) +VRCENABLE .EQU FALSE ; VRC: ENABLE VGARC VIDEO/KBD DRIVER (VRC.ASM) +SCONENABLE .EQU FALSE ; SCON: ENABLE S100 CONSOLE DRIVER (SCON.ASM) +; +MDENABLE .EQU TRUE ; MD: ENABLE MEMORY (ROM/RAM) DISK DRIVER (MD.ASM) +MDROM .EQU TRUE ; MD: ENABLE ROM DISK +MDRAM .EQU TRUE ; MD: ENABLE RAM DISK +MDTRACE .EQU 1 ; MD: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +MDFFENABLE .EQU FALSE ; MD: ENABLE FLASH FILE SYSTEM +; +FDENABLE .EQU FALSE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM) +FDMODE .EQU FDMODE_RCWDC ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPFDC|MBC] +FDCNT .EQU 2 ; FD: NUMBER OF FLOPPY DRIVES ON THE INTERFACE (1-2) +FDTRACE .EQU 1 ; FD: TRACE LEVEL (0=NO,1=FATAL,2=ERRORS,3=ALL) +FDMAUTO .EQU TRUE ; FD: AUTO SELECT DEFAULT/ALTERNATE MEDIA FORMATS +FD0TYPE .EQU FDT_3HD ; FD 0: DRIVE TYPE: FDT_[3DD|3HD|5DD|5HD|8] +FD1TYPE .EQU FDT_3HD ; FD 1: DRIVE TYPE: FDT_[3DD|3HD|5DD|5HD|8] +; +RFENABLE .EQU FALSE ; RF: ENABLE RAM FLOPPY DRIVER +; +IDEENABLE .EQU FALSE ; IDE: ENABLE IDE DISK DRIVER (IDE.ASM) +IDETRACE .EQU 1 ; IDE: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +IDECNT .EQU 1 ; IDE: NUMBER OF IDE INTERFACES TO DETECT (1-3), 2 DRIVES EACH +IDE0MODE .EQU IDEMODE_RC ; IDE 0: DRIVER MODE: IDEMODE_[DIO|DIDE|MK4|RC] +IDE0BASE .EQU $10 ; IDE 0: IO BASE ADDRESS +IDE0DATLO .EQU $00 ; IDE 0: DATA LO PORT FOR 16-BIT I/O +IDE0DATHI .EQU $00 ; IDE 0: DATA HI PORT FOR 16-BIT I/O +IDE0A8BIT .EQU TRUE ; IDE 0A (MASTER): 8 BIT XFER +IDE0B8BIT .EQU TRUE ; IDE 0B (MASTER): 8 BIT XFER +IDE1MODE .EQU IDEMODE_NONE ; IDE 1: DRIVER MODE: IDEMODE_[DIO|DIDE|MK4|RC] +IDE1BASE .EQU $00 ; IDE 1: IO BASE ADDRESS +IDE1DATLO .EQU $00 ; IDE 1: DATA LO PORT FOR 16-BIT I/O +IDE1DATHI .EQU $00 ; IDE 1: DATA HI PORT FOR 16-BIT I/O +IDE1A8BIT .EQU TRUE ; IDE 1A (MASTER): 8 BIT XFER +IDE1B8BIT .EQU TRUE ; IDE 1B (MASTER): 8 BIT XFER +IDE2MODE .EQU IDEMODE_NONE ; IDE 2: DRIVER MODE: IDEMODE_[DIO|DIDE|MK4|RC] +IDE2BASE .EQU $00 ; IDE 2: IO BASE ADDRESS +IDE2DATLO .EQU $00 ; IDE 2: DATA LO PORT FOR 16-BIT I/O +IDE2DATHI .EQU $00 ; IDE 2: DATA HI PORT FOR 16-BIT I/O +IDE2A8BIT .EQU TRUE ; IDE 2A (MASTER): 8 BIT XFER +IDE2B8BIT .EQU TRUE ; IDE 2B (MASTER): 8 BIT XFER +; +PPIDEENABLE .EQU FALSE ; PPIDE: ENABLE PARALLEL PORT IDE DISK DRIVER (PPIDE.ASM) +PPIDETRACE .EQU 1 ; PPIDE: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +PPIDECNT .EQU 1 ; PPIDE: NUMBER OF PPI CHIPS TO DETECT (1-3), 2 DRIVES PER CHIP +PPIDE0BASE .EQU $20 ; PPIDE 0: PPI REGISTERS BASE ADR +PPIDE0A8BIT .EQU FALSE ; PPIDE 0A (MASTER): 8 BIT XFER +PPIDE0B8BIT .EQU FALSE ; PPIDE 0B (SLAVE): 8 BIT XFER +PPIDE1BASE .EQU $00 ; PPIDE 1: PPI REGISTERS BASE ADR +PPIDE1A8BIT .EQU FALSE ; PPIDE 1A (MASTER): 8 BIT XFER +PPIDE1B8BIT .EQU FALSE ; PPIDE 0B (SLAVE): 8 BIT XFER +PPIDE2BASE .EQU $00 ; PPIDE 2: PPI REGISTERS BASE ADR +PPIDE2A8BIT .EQU FALSE ; PPIDE 2A (MASTER): 8 BIT XFER +PPIDE2B8BIT .EQU FALSE ; PPIDE 0B (SLAVE): 8 BIT XFER +; +SDENABLE .EQU FALSE ; SD: ENABLE SD CARD DISK DRIVER (SD.ASM) +SDMODE .EQU SDMODE_MT ; SD: DRIVER MODE: SDMODE_[JUHA|N8|CSIO|PPI|UART|DSD|MK4|SC|MT|PIO|Z80R|USR] +SDPPIBASE .EQU $60 ; SD: BASE I/O ADDRESS OF PPI FOR PPI MODDE +SDCNT .EQU 2 ; SD: NUMBER OF SD CARD DEVICES (1-2), FOR DSD/SC/MT ONLY +SDTRACE .EQU 1 ; SD: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +SDCSIOFAST .EQU FALSE ; SD: ENABLE TABLE-DRIVEN BIT INVERTER IN CSIO MODE +SDMTSWAP .EQU FALSE ; SD: SWAP THE LOGICAL ORDER OF THE SPI PORTS OF THE MT011 +; +CHENABLE .EQU FALSE ; CH: ENABLE CH375/376 USB SUPPORT +; +PRPENABLE .EQU FALSE ; PRP: ENABLE ECB PROPELLER IO BOARD DRIVER (PRP.ASM) +PRPSDENABLE .EQU TRUE ; PRP: ENABLE PROPIO DRIVER SD CARD SUPPORT +PRPSDTRACE .EQU 1 ; PRP: SD CARD TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +PRPCONENABLE .EQU TRUE ; PRP: ENABLE PROPIO DRIVER VIDEO/KBD SUPPORT +; +PPPENABLE .EQU FALSE ; PPP: ENABLE ZETA PARALLEL PORT PROPELLER BOARD DRIVER (PPP.ASM) +; +ESPENABLE .EQU FALSE ; ESP: ENABLE ESP32 IO BOARD DRIVER (ESP.ASM) +; +HDSKENABLE .EQU FALSE ; HDSK: ENABLE SIMH HDSK DISK DRIVER (HDSK.ASM) +; +PIOENABLE .EQU FALSE ; PIO: ENABLE ZILOG PIO DRIVER (PIO.ASM) +PIOCNT .EQU 2 ; PIO: NUMBER OF CHIPS TO DETECT (1-2), 2 CHANNELS PER CHIP +PIO0BASE .EQU $B8 ; PIO 0: REGISTERS BASE ADR +PIO1BASE .EQU $BC ; PIO 1: REGISTERS BASE ADR +; +LPTENABLE .EQU FALSE ; LPT: ENABLE CENTRONICS PRINTER DRIVER (LPT.ASM) +LPTMODE .EQU LPTMODE_MG014 ; LPT: DRIVER MODE: LPTMODE_[NONE|SPP|MG014] +LPTCNT .EQU 1 ; LPT: NUMBER OF CHIPS TO DETECT (1-2) +LPTTRACE .EQU 1 ; LPT: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +LPT0BASE .EQU $0C ; LPT 0: REGISTERS BASE ADR +LPT1BASE .EQU $00 ; LPT 1: REGISTERS BASE ADR +; +PPAENABLE .EQU FALSE ; PPA: ENABLE PPA DISK DRIVER (PPA.ASM) +PPACNT .EQU 1 ; PPA: NUMBER OF PPA DEVICES (1-2) +PPATRACE .EQU 1 ; PPA: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +PPAMODE .EQU PPAMODE_MG014 ; PPA: DRIVER MODE: PPAMODE_[NONE|SPP|MG014] +PPA0BASE .EQU LPT0BASE ; PPA 0: BASE I/O ADDRESS OF PPI FOR PPA +PPA1BASE .EQU LPT1BASE ; PPA 1: BASE I/O ADDRESS OF PPI FOR PPA +; +IMMENABLE .EQU FALSE ; IMM: ENABLE IMM DISK DRIVER (IMM.ASM) +IMMCNT .EQU 1 ; IMM: NUMBER OF IMM DEVICES (1-2) +IMMTRACE .EQU 1 ; IMM: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +IMMMODE .EQU IMMMODE_MG014 ; IMM: DRIVER MODE: IMMMODE_[NONE|SPP|MG014] +IMM0BASE .EQU LPT0BASE ; IMM 0: BASE I/O ADDRESS OF PPI FOR IMM +IMM1BASE .EQU LPT1BASE ; IMM 1: BASE I/O ADDRESS OF PPI FOR IMM +; +SYQENABLE .EQU FALSE ; SYQ: ENABLE IMM DISK DRIVER (SYQ.ASM) +SYQCNT .EQU 1 ; SYQ: NUMBER OF SYQ DEVICES (1-2) +SYQTRACE .EQU 1 ; SYQ: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +SYQMODE .EQU IMMMODE_MG014 ; SYQ: DRIVER MODE: SYQMODE_[NONE|SPP|MG014] +SYQ0BASE .EQU LPT0BASE ; SYQ 0: BASE I/O ADDRESS OF PPI FOR SYQ +SYQ1BASE .EQU LPT1BASE ; SYQ 1: BASE I/O ADDRESS OF PPI FOR SYQ +; +PIO_4P .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB 4P BOARD +PIO_ZP .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB ZILOG PERIPHERALS BOARD (PIO.ASM) +PIO_SBC .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR 8255 CHIP +; +UFENABLE .EQU FALSE ; UF: ENABLE ECB USB FIFO DRIVER (UF.ASM) +; +SN76489ENABLE .EQU FALSE ; SN: ENABLE SN76489 SOUND DRIVER +AUDIOTRACE .EQU FALSE ; ENABLE TRACING TO CONSOLE OF SOUND DRIVER +SN7CLK .EQU 3579545 ; SN: PSG CLOCK FREQ, ASSUME MSX STD +SNMODE .EQU SNMODE_RC ; SN: DRIVER MODE: SNMODE_[NONE|RC|VGM] +; +AY38910ENABLE .EQU FALSE ; AY: ENABLE AY-3-8910 / YM2149 SOUND DRIVER +AY_CLK .EQU 1789772 ; AY: PSG CLOCK FREQ, ASSUME MSX STD +AYMODE .EQU AYMODE_RCZ80 ; AY: DRIVER MODE: AYMODE_[SCG|N8|RCZ80|RCZ180|MSX|LINC|MBC] +; +SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM) +; +DMAENABLE .EQU FALSE ; DMA: ENABLE DMA DRIVER (DMA.ASM) +DMABASE .EQU $E0 ; DMA: DMA BASE ADDRESS +DMAMODE .EQU DMAMODE_RC ; DMA: DMA MODE (NONE|ECB|Z180|Z280|RC|MBC|DUO) +; +YM2612ENABLE .EQU FALSE ; YM2612: ENABLE YM2612 DRIVER +VGMBASE .EQU $C0 ; YM2612: BASE ADDRESS FOR VGM BOARD (YM2612/SN76489s/CTC) diff --git a/Source/HBIOS/cfg_master.asm b/Source/HBIOS/cfg_master.asm index c14de563..004339a2 100644 --- a/Source/HBIOS/cfg_master.asm +++ b/Source/HBIOS/cfg_master.asm @@ -1,6 +1,6 @@ ; ;================================================================================================== -; ROMWBW 2.X CONFIGURATION MASTER +; ROMWBW 3.X CONFIGURATION MASTER ;================================================================================================== ; ; THIS FILE IS *NOT* A REAL CONFIGURATION FILE. IT IS A MASTER TEMPLATE FILE @@ -12,7 +12,7 @@ ; #INCLUDE "hbios.inc" ; -PLATFORM .EQU PLT_SBC ; PLT_[SBC|ZETA|ZETA2|N8|MK4|UNA|RCZ80|RCZ180|EZZ80|SCZ180|DYNO|RCZ280|MBC|RPH] +PLATFORM .EQU PLT_SBC ; PLT_[SBC|ZETA|ZETA2|N8|MK4|UNA|RCZ80|RCZ180|EZZ80|SCZ180|DYNO|RCZ280|MBC|RPH|Z80RETRO|S100|DUO|HEATH|MON] CPUFAM .EQU CPU_Z80 ; CPU FAMILY: CPU_[Z80|Z180|Z280] BIOS .EQU BIOS_WBW ; HARDWARE BIOS: BIOS_[WBW|UNA] BATCOND .EQU FALSE ; ENABLE LOW BATTERY WARNING MESSAGE @@ -27,14 +27,12 @@ CPUSPDCAP .EQU SPD_FIXED ; CPU SPEED CHANGE CAPABILITY SPD_FIXED|SPD_HILO CPUSPDDEF .EQU SPD_HIGH ; CPU SPEED DEFAULT SPD_UNSUP|SPD_HIGH|SPD_LOW CPUOSC .EQU 8000000 ; CPU OSC FREQ IN MHZ INTMODE .EQU 0 ; INTERRUPTS: 0=NONE, 1=MODE 1, 2=MODE 2, 3=MODE 3 (Z280) -DEFSERCFG .EQU SER_38400_8N1 ; DEFAULT SERIAL LINE CONFIG (SEE STD.ASM) +DEFSERCFG .EQU SER_38400_8N1 | SER_RTS ; DEFAULT SERIAL LINE CONFIG (SEE STD.ASM) ; RAMSIZE .EQU 512 ; SIZE OF RAM IN KB (MUST MATCH YOUR HARDWARE!!!) ROMSIZE .EQU 512 ; SIZE OF ROM IN KB (MUST MATCH YOUR HARDWARE!!!) -ROMSIZE_CHK .EQU 0 ; ROMSIZE VALUE VERIFICATION (0=DISABLED) -MEMMGR .EQU MM_NONE ; MEMORY MANAGER: MM_[SBC|Z2|N8|Z180|Z280|MBC|RPH] -RAMLOC .EQU 19 ; START OF RAM AS POWER OF 2 (2^N) IN PHYSICAL ADDRESS SPACE -RAMBIAS .EQU (1 << (RAMLOC - 10)) ; OFFSET OF START OF RAM IN PHYSICAL ADDRESS SPACE +MEMMGR .EQU MM_NONE ; MEMORY MANAGER: MM_[SBC|Z2|N8|Z180|Z280|MBC|RPH|MON] +RAMBIAS .EQU ROMSIZE ; OFFSET OF START OF RAM IN PHYSICAL ADDRESS SPACE MPCL_RAM .EQU $78 ; SBC MEM MGR RAM PAGE SELECT REG (WRITE ONLY) MPCL_ROM .EQU $7C ; SBC MEM MGR ROM PAGE SELECT REG (WRITE ONLY) MPGSEL_0 .EQU $78 ; Z2 MEM MGR BANK 0 PAGE SELECT REG (WRITE ONLY) @@ -87,6 +85,9 @@ CTCPRECH .EQU 2 ; PRESCALE CHANNEL (0-3) CTCTIMCH .EQU 3 ; TIMER CHANNEL (0-3) CTCOSC .EQU 614400 ; CTC CLOCK FREQUENCY ; +PCFENABLE .EQU FALSE ; ENABLE PCF8584 I2C CONTROLLER +PCFBASE .EQU $F0 ; PCF8584 BASE I/O ADDRESS +; EIPCENABLE .EQU FALSE ; EIPC: ENABLE Z80 EIPC (Z84C15) INITIALIZATION ; SKZENABLE .EQU FALSE ; ENABLE SERGEY'S Z80-512K FEATURES @@ -95,9 +96,12 @@ SKZDIV .EQU DIV_1 ; UART CLK (CLK2) DIVIDER FOR Z80-512K WDOGMODE .EQU WDOG_NONE ; WATCHDOG MODE: WDOG_[NONE|EZZ80|SKZ] WDOGIO .EQU $6F ; WATCHDOG REGISTER ADR ; -DIAGENABLE .EQU FALSE ; ENABLES OUTPUT TO 8 BIT LED DIAGNOSTIC PORT -DIAGPORT .EQU $00 ; DIAGNOSTIC PORT ADDRESS -DIAGDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON DIAGNOSTIC LEDS +FPLED_ENABLE .EQU FALSE ; FP: ENABLES FRONT PANEL LEDS +FPLED_IO .EQU $00 ; FP: PORT ADDRESS FOR FP LEDS +FPLED_DSKACT .EQU TRUE ; FP: ENABLES DISK I/O ACTIVITY ON FP LEDS +FPSW_ENABLE .EQU FALSE ; FP: ENABLES FRONT PANEL SWITCHES +FPSW_IO .EQU $00 ; FP: PORT ADDRESS FOR FP SWITCHES +; DIAGLVL .EQU DL_CRITICAL ; ERROR LEVEL REPORTING ; LEDENABLE .EQU FALSE ; ENABLES STATUS LED (SINGLE LED) @@ -105,12 +109,17 @@ LEDMODE .EQU LEDMODE_STD ; LEDMODE_[STD|RTC] LEDPORT .EQU $0E ; STATUS LED PORT ADDRESS LEDDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON STATUS LED ; -DSKYENABLE .EQU FALSE ; ENABLES DSKY -DSKYMODE .EQU DSKYMODE_V1 ; DSKY VERSION: DSKYMODE_[V1|NG] -DSKYPPIBASE .EQU $60 ; BASE I/O ADDRESS OF DSKY PPI -DSKYOSC .EQU 3000000 ; OSCILLATOR FREQ FOR DSKYNG (IN HZ) +DSKYENABLE .EQU FALSE ; ENABLES DSKY FUNCTIONALITY +DSKYDSKACT .EQU TRUE ; ENABLES DISK ACTIVITY ON DSKY DISPLAY +ICMENABLE .EQU FALSE ; ENABLES ORIGINAL DSKY ICM DRIVER (7218) +ICMPPIBASE .EQU $60 ; BASE I/O ADDRESS OF ICM PPI +PKDENABLE .EQU FALSE ; ENABLES DSKY NG PKD DRIVER (8259) +PKDPPIBASE .EQU $60 ; BASE I/O ADDRESS OF PKD PPI +PKDOSC .EQU 3000000 ; OSCILLATOR FREQ FOR PKD (IN HZ) +H8PENABLE .EQU FALSE ; ENABLES HEATH H8 FRONT PANEL ; BOOTCON .EQU 0 ; BOOT CONSOLE DEVICE +SECCON .EQU $FF ; SECONDARY CONSOLE DEVICE CRTACT .EQU FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP VDAEMU .EQU EMUTYP_ANSI ; VDA EMULATION: EMUTYP_[TTY|ANSI] VDAEMU_SERKBD .EQU $FF ; VDA EMULATION: SERIAL KBD UNIT #, OR $FF FOR HW KBD @@ -156,8 +165,9 @@ UARTOSC .EQU 1843200 ; UART: OSC FREQUENCY IN MHZ UARTINTS .EQU FALSE ; UART: INCLUDE INTERRUPT SUPPORT UNDER IM1/2/3 UARTCFG .EQU DEFSERCFG ; UART: LINE CONFIG FOR UART PORTS UARTCASSPD .EQU SER_300_8N1 ; UART: ECB CASSETTE UART DEFAULT SPEED -UARTSBC .EQU FALSE ; UART: AUTO-DETECT SBC/ZETA ONBOARD UART +UARTSBC .EQU FALSE ; UART: AUTO-DETECT SBC/ZETA/DUO ONBOARD UART UARTSBCFORCE .EQU FALSE ; UART: FORCE DETECTION OF SBC UART (FOR SIMH) +UARTAUX .EQU FALSE ; UART: AUTO-DETECT AUX UART UARTCAS .EQU FALSE ; UART: AUTO-DETECT ECB CASSETTE UART UARTMFP .EQU FALSE ; UART: AUTO-DETECT MF/PIC UART UART4 .EQU FALSE ; UART: AUTO-DETECT 4UART UART @@ -194,7 +204,7 @@ SIOENABLE .EQU FALSE ; SIO: ENABLE ZILOG SIO SERIAL DRIVER (SIO.ASM) SIODEBUG .EQU FALSE ; SIO: ENABLE DEBUG OUTPUT SIOBOOT .EQU 0 ; SIO: REBOOT ON RCV CHAR (0=DISABLED) SIOCNT .EQU 2 ; SIO: NUMBER OF CHIPS TO DETECT (1-2), 2 CHANNELS PER CHIP -SIO0MODE .EQU SIOMODE_RC ; SIO 0: CHIP TYPE: SIOMODE_[STD|RC|SMB|ZP] +SIO0MODE .EQU SIOMODE_RC ; SIO 0: CHIP TYPE: SIOMODE_[STD|RC|SMB|ZP|Z80R] SIO0BASE .EQU $80 ; SIO 0: REGISTERS BASE ADR SIO0ACLK .EQU CPUOSC ; SIO 0A: OSC FREQ IN HZ, ZP=2457600/4915200, RC/SMB=7372800 SIO0ACFG .EQU DEFSERCFG ; SIO 0A: SERIAL LINE CONFIG @@ -202,7 +212,7 @@ SIO0ACTCC .EQU -1 ; SIO 0A: CTC CHANNEL 0=A, 1=B, 2=C, 3=D, -1 FOR NONE SIO0BCLK .EQU CPUOSC ; SIO 0B: OSC FREQ IN HZ, ZP=2457600/4915200, RC/SMB=7372800 SIO0BCFG .EQU DEFSERCFG ; SIO 0B: SERIAL LINE CONFIG SIO0BCTCC .EQU -1 ; SIO 0B: CTC CHANNEL 0=A, 1=B, 2=C, 3=D, -1 FOR NONE -SIO1MODE .EQU SIOMODE_RC ; SIO 1: CHIP TYPE: SIOMODE_[STD|RC|SMB|ZP] +SIO1MODE .EQU SIOMODE_RC ; SIO 1: CHIP TYPE: SIOMODE_[STD|RC|SMB|ZP|Z80R] SIO1BASE .EQU $84 ; SIO 1: REGISTERS BASE ADR SIO1ACLK .EQU CPUOSC ; SIO 1A: OSC FREQ IN HZ, ZP=2457600/4915200, RC/SMB=7372800 SIO1ACFG .EQU DEFSERCFG ; SIO 1A: SERIAL LINE CONFIG @@ -226,6 +236,8 @@ TMSMODE .EQU TMSMODE_NONE ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|MSX9958|M TMSTIMENABLE .EQU FALSE ; TMS: ENABLE TIMER INTERRUPTS (REQUIRES IM1) VGAENABLE .EQU FALSE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM) VGASIZ .EQU V80X25 ; VGA: DISPLAY FORMAT [V80X25|V80X30|V80X43] +VRCENABLE .EQU FALSE ; VRC: ENABLE VGARC VIDEO/KBD DRIVER (VRC.ASM) +SCONENABLE .EQU FALSE ; SCON: ENABLE S100 CONSOLE DRIVER (SCON.ASM) ; MDENABLE .EQU TRUE ; MD: ENABLE MEMORY (ROM/RAM) DISK DRIVER (MD.ASM) MDROM .EQU TRUE ; MD: ENABLE ROM DISK @@ -237,9 +249,9 @@ FDENABLE .EQU FALSE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM) FDMODE .EQU FDMODE_NONE ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPFDC|MBC] FDCNT .EQU 2 ; FD: NUMBER OF FLOPPY DRIVES ON THE INTERFACE (1-2) FDTRACE .EQU 1 ; FD: TRACE LEVEL (0=NO,1=FATAL,2=ERRORS,3=ALL) -FDMEDIA .EQU FDM144 ; FD: DEFAULT MEDIA FORMAT FDM[720|144|360|120|111] -FDMEDIAALT .EQU FDM720 ; FD: ALTERNATE MEDIA FORMAT FDM[720|144|360|120|111] FDMAUTO .EQU TRUE ; FD: AUTO SELECT DEFAULT/ALTERNATE MEDIA FORMATS +FD0TYPE .EQU FDT_3HD ; FD 0: DRIVE TYPE: FDT_[3DD|3HD|5DD|5HD|8] +FD1TYPE .EQU FDT_3HD ; FD 1: DRIVE TYPE: FDT_[3DD|3HD|5DD|5HD|8] ; RFENABLE .EQU FALSE ; RF: ENABLE RAM FLOPPY DRIVER RFCNT .EQU 1 ; RF: NUMBER OF RAM FLOPPY UNITS (1-4) @@ -280,13 +292,25 @@ PPIDE2A8BIT .EQU FALSE ; PPIDE 2A (MASTER): 8 BIT XFER PPIDE2B8BIT .EQU FALSE ; PPIDE 0B (SLAVE): 8 BIT XFER ; SDENABLE .EQU FALSE ; SD: ENABLE SD CARD DISK DRIVER (SD.ASM) -SDMODE .EQU SDMODE_NONE ; SD: DRIVER MODE: SDMODE_[JUHA|N8|CSIO|PPI|UART|DSD|MK4|SC|MT|USR] +SDMODE .EQU SDMODE_NONE ; SD: DRIVER MODE: SDMODE_[JUHA|N8|CSIO|PPI|UART|DSD|MK4|SC|MT|PIO|Z80R|USR] SDPPIBASE .EQU $60 ; SD: BASE I/O ADDRESS OF PPI FOR PPI MODDE SDCNT .EQU 1 ; SD: NUMBER OF SD CARD DEVICES (1-2), FOR DSD/SC/MT ONLY SDTRACE .EQU 1 ; SD: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) SDCSIOFAST .EQU FALSE ; SD: ENABLE TABLE-DRIVEN BIT INVERTER IN CSIO MODE SDMTSWAP .EQU FALSE ; SD: SWAP THE LOGICAL ORDER OF THE SPI PORTS OF THE MT011 ; +CHENABLE .EQU FALSE ; CH: ENABLE CH375/376 USB SUPPORT +CHTRACE .EQU 1 ; CH: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +CHUSBTRACE .EQU 1 ; CHUSB: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +CHSDTRACE .EQU 1 ; CHSD: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +CHCNT .EQU 2 ; CH: NUMBER OF BOARDS TO DETECT (1-2) +CH0BASE .EQU $3E ; CH 0: BASE I/O ADDRESS +CH0USBENABLE .EQU TRUE ; CH 0: ENABLE USB DISK +CH0SDENABLE .EQU FALSE ; CH 0: ENABLE SD DISK +CH1BASE .EQU $3C ; CH 1: BASE I/O ADDRESS +CH1USBENABLE .EQU TRUE ; CH 1: ENABLE USB DISK +CH1SDENABLE .EQU FALSE ; CH 1: ENABLE SD DISK +; PRPENABLE .EQU FALSE ; PRP: ENABLE ECB PROPELLER IO BOARD DRIVER (PRP.ASM) PRPSDENABLE .EQU TRUE ; PRP: ENABLE PROPIO DRIVER SD CARD SUPPORT PRPSDTRACE .EQU 1 ; PRP: SD CARD TRACE LEVEL (0=NO,1=ERRORS,2=ALL) @@ -298,6 +322,9 @@ PPPSDENABLE .EQU TRUE ; PPP: ENABLE PPP DRIVER SD CARD SUPPORT PPPSDTRACE .EQU 1 ; PPP: SD CARD TRACE LEVEL (0=NO,1=ERRORS,2=ALL) PPPCONENABLE .EQU TRUE ; PPP: ENABLE PPP DRIVER VIDEO/KBD SUPPORT ; +ESPENABLE .EQU FALSE ; ESP: ENABLE ESP32 IO BOARD DRIVER (ESP.ASM) +ESPCONENABLE .EQU TRUE ; ESP: ENABLE ESP32 CONSOLE IO DRIVER VIDEO/KBD SUPPORT +; HDSKENABLE .EQU FALSE ; HDSK: ENABLE SIMH HDSK DISK DRIVER (HDSK.ASM) HDSKTRACE .EQU 1 ; HDSK: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) ; @@ -307,10 +334,33 @@ PIO0BASE .EQU $B8 ; PIO 0: REGISTERS BASE ADR PIO1BASE .EQU $BC ; PIO 1: REGISTERS BASE ADR ; LPTENABLE .EQU FALSE ; LPT: ENABLE CENTRONICS PRINTER DRIVER (LPT.ASM) +LPTMODE .EQU LPTMODE_NONE ; LPT: DRIVER MODE: LPTMODE_[NONE|SPP|MG014] LPTCNT .EQU 1 ; LPT: NUMBER OF CHIPS TO DETECT (1-2) +LPTTRACE .EQU 1 ; LPT: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) LPT0BASE .EQU $E8 ; LPT 0: REGISTERS BASE ADR LPT1BASE .EQU $EC ; LPT 1: REGISTERS BASE ADR ; +PPAENABLE .EQU FALSE ; PPA: ENABLE PPA DISK DRIVER (PPA.ASM) +PPACNT .EQU 1 ; PPA: NUMBER OF PPA DEVICES (1-2) +PPATRACE .EQU 1 ; PPA: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +PPAMODE .EQU PPAMODE_SPP ; PPA: DRIVER MODE: PPAMODE_[NONE|SPP|MG014] +PPA0BASE .EQU LPT0BASE ; PPA 0: BASE I/O ADDRESS OF PPI FOR PPA +PPA1BASE .EQU LPT1BASE ; PPA 1: BASE I/O ADDRESS OF PPI FOR PPA +; +IMMENABLE .EQU FALSE ; IMM: ENABLE IMM DISK DRIVER (IMM.ASM) +IMMCNT .EQU 1 ; IMM: NUMBER OF IMM DEVICES (1-2) +IMMTRACE .EQU 1 ; IMM: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +IMMMODE .EQU IMMMODE_SPP ; IMM: DRIVER MODE: IMMMODE_[NONE|SPP|MG014] +IMM0BASE .EQU LPT0BASE ; IMM 0: BASE I/O ADDRESS OF PPI FOR IMM +IMM1BASE .EQU LPT1BASE ; IMM 1: BASE I/O ADDRESS OF PPI FOR IMM +; +SYQENABLE .EQU FALSE ; SYQ: ENABLE IMM DISK DRIVER (SYQ.ASM) +SYQCNT .EQU 1 ; SYQ: NUMBER OF SYQ DEVICES (1-2) +SYQTRACE .EQU 1 ; SYQ: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +SYQMODE .EQU IMMMODE_SPP ; SYQ: DRIVER MODE: SYQMODE_[NONE|SPP|MG014] +SYQ0BASE .EQU LPT0BASE ; SYQ 0: BASE I/O ADDRESS OF PPI FOR SYQ +SYQ1BASE .EQU LPT1BASE ; SYQ 1: BASE I/O ADDRESS OF PPI FOR SYQ +; PIO_4P .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB 4P BOARD PIO4BASE .EQU $90 ; PIO: PIO REGISTERS BASE ADR FOR ECB 4P BOARD PIO_ZP .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB ZILOG PERIPHERALS BOARD (PIO.ASM) @@ -334,7 +384,7 @@ SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM) ; DMAENABLE .EQU FALSE ; DMA: ENABLE DMA DRIVER (DMA.ASM) DMABASE .EQU $E0 ; DMA: DMA BASE ADDRESS -DMAMODE .EQU DMAMODE_NONE ; DMA: DMA MODE (NONE|ECB|Z180|Z280|RC|MBC) +DMAMODE .EQU DMAMODE_NONE ; DMA: DMA MODE (NONE|ECB|Z180|Z280|RC|MBC|DUO) ; -YM2612ENABLE .EQU FALSE ; YM2612: ENABLE YM2612 DRIVER (MUTE STUB) -VGMBASE .EQU $C0 ; YM2612: BASE ADDRESS FOR VGM BOARD (YM2612/SN76469s/CTC) +YM2612ENABLE .EQU FALSE ; YM2612: ENABLE YM2612 DRIVER +VGMBASE .EQU $C0 ; YM2612: BASE ADDRESS FOR VGM BOARD (YM2612/SN76489s/CTC) diff --git a/Source/HBIOS/cfg_mbc.asm b/Source/HBIOS/cfg_mbc.asm index e8b42400..5fd069ef 100644 --- a/Source/HBIOS/cfg_mbc.asm +++ b/Source/HBIOS/cfg_mbc.asm @@ -1,6 +1,6 @@ ; ;================================================================================================== -; ROMWBW 2.X CONFIGURATION DEFAULTS FOR MBC +; ROMWBW 3.X CONFIGURATION DEFAULTS FOR MBC ;================================================================================================== ; ; THIS FILE CONTAINS THE FULL SET OF DEFAULT CONFIGURATION SETTINGS FOR THE PLATFORM @@ -15,7 +15,7 @@ ; #INCLUDE "hbios.inc" ; -PLATFORM .EQU PLT_MBC ; PLT_[SBC|ZETA|ZETA2|N8|MK4|UNA|RCZ80|RCZ180|EZZ80|SCZ180|DYNO|RCZ280|MBC|RPH] +PLATFORM .EQU PLT_MBC ; PLT_[SBC|ZETA|ZETA2|N8|MK4|UNA|RCZ80|RCZ180|EZZ80|SCZ180|DYNO|RCZ280|MBC|RPH|Z80RETRO|S100|DUO|HEATH|MON] CPUFAM .EQU CPU_Z80 ; CPU FAMILY: CPU_[Z80|Z180|Z280] BIOS .EQU BIOS_WBW ; HARDWARE BIOS: BIOS_[WBW|UNA] BATCOND .EQU FALSE ; ENABLE LOW BATTERY WARNING MESSAGE @@ -30,12 +30,11 @@ CPUSPDCAP .EQU SPD_HILO ; CPU SPEED CHANGE CAPABILITY SPD_FIXED|SPD_HILO CPUSPDDEF .EQU SPD_LOW ; CPU SPEED DEFAULT SPD_UNSUP|SPD_HIGH|SPD_LOW CPUOSC .EQU 8000000 ; CPU OSC FREQ IN MHZ INTMODE .EQU 0 ; INTERRUPTS: 0=NONE, 1=MODE 1, 2=MODE 2, 3=MODE 3 (Z280) -DEFSERCFG .EQU SER_38400_8N1 ; DEFAULT SERIAL LINE CONFIG (SEE STD.ASM) +DEFSERCFG .EQU SER_38400_8N1 | SER_RTS ; DEFAULT SERIAL LINE CONFIG (SEE STD.ASM) ; RAMSIZE .EQU 512 ; SIZE OF RAM IN KB (MUST MATCH YOUR HARDWARE!!!) ROMSIZE .EQU 512 ; SIZE OF ROM IN KB (MUST MATCH YOUR HARDWARE!!!) -ROMSIZE_CHK .EQU 0 ; ROMSIZE VALUE VERIFICATION (0=DISABLED) -MEMMGR .EQU MM_MBC ; MEMORY MANAGER: MM_[SBC|Z2|N8|Z180|Z280|MBC|RPH] +MEMMGR .EQU MM_MBC ; MEMORY MANAGER: MM_[SBC|Z2|N8|Z180|Z280|MBC|RPH|MON] MPCL_RAM .EQU $78 ; SBC MEM MGR RAM PAGE SELECT REG (WRITE ONLY) MPCL_ROM .EQU $7C ; SBC MEM MGR ROM PAGE SELECT REG (WRITE ONLY) ; @@ -54,15 +53,21 @@ CTCPRECH .EQU 2 ; PRESCALE CHANNEL (0-3) CTCTIMCH .EQU 3 ; TIMER CHANNEL (0-3) CTCOSC .EQU (4915200/8) ; CTC CLOCK FREQUENCY ; +PCFENABLE .EQU FALSE ; ENABLE PCF8584 I2C CONTROLLER +PCFBASE .EQU $F0 ; PCF8584 BASE I/O ADDRESS +; EIPCENABLE .EQU FALSE ; EIPC: ENABLE Z80 EIPC (Z84C15) INITIALIZATION ; SKZENABLE .EQU FALSE ; ENABLE SERGEY'S Z80-512K FEATURES ; WDOGMODE .EQU WDOG_NONE ; WATCHDOG MODE: WDOG_[NONE|EZZ80|SKZ] ; -DIAGENABLE .EQU FALSE ; ENABLES OUTPUT TO 8 BIT LED DIAGNOSTIC PORT -DIAGPORT .EQU $00 ; DIAGNOSTIC PORT ADDRESS -DIAGDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON DIAGNOSTIC LEDS +FPLED_ENABLE .EQU FALSE ; FP: ENABLES FRONT PANEL LEDS +FPLED_IO .EQU $00 ; FP: PORT ADDRESS FOR FP LEDS +FPLED_DSKACT .EQU TRUE ; FP: ENABLES DISK I/O ACTIVITY ON FP LEDS +FPSW_ENABLE .EQU FALSE ; FP: ENABLES FRONT PANEL SWITCHES +FPSW_IO .EQU $00 ; FP: PORT ADDRESS FOR FP SWITCHES +; DIAGLVL .EQU DL_CRITICAL ; ERROR LEVEL REPORTING ; LEDENABLE .EQU TRUE ; ENABLES STATUS LED @@ -70,12 +75,17 @@ LEDMODE .EQU LEDMODE_RTC ; LEDMODE_[STD|RTC] LEDPORT .EQU RTCIO ; STATUS LED PORT ADDRESS LEDDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON STATUS LED ; -DSKYENABLE .EQU FALSE ; ENABLES DSKY -DSKYMODE .EQU DSKYMODE_V1 ; DSKY VERSION: DSKYMODE_[V1|NG] -DSKYPPIBASE .EQU $60 ; BASE I/O ADDRESS OF DSKY PPI -DSKYOSC .EQU 3000000 ; OSCILLATOR FREQ FOR DSKYNG (IN HZ) +DSKYENABLE .EQU FALSE ; ENABLES DSKY FUNCTIONALITY +DSKYDSKACT .EQU TRUE ; ENABLES DISK ACTIVITY ON DSKY DISPLAY +ICMENABLE .EQU FALSE ; ENABLES ORIGINAL DSKY ICM DRIVER (7218) +ICMPPIBASE .EQU $60 ; BASE I/O ADDRESS OF ICM PPI +PKDENABLE .EQU FALSE ; ENABLES DSKY NG PKD DRIVER (8259) +PKDPPIBASE .EQU $60 ; BASE I/O ADDRESS OF PKD PPI +PKDOSC .EQU 3000000 ; OSCILLATOR FREQ FOR PKD (IN HZ) +H8PENABLE .EQU FALSE ; ENABLES HEATH H8 FRONT PANEL ; BOOTCON .EQU 0 ; BOOT CONSOLE DEVICE +SECCON .EQU $FF ; SECONDARY CONSOLE DEVICE CRTACT .EQU FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP VDAEMU .EQU EMUTYP_ANSI ; VDA EMULATION: EMUTYP_[TTY|ANSI] VDAEMU_SERKBD .EQU $FF ; VDA EMULATION: SERIAL KBD UNIT #, OR $FF FOR HW KBD @@ -114,8 +124,9 @@ UARTOSC .EQU 1843200 ; UART: OSC FREQUENCY IN MHZ UARTINTS .EQU FALSE ; UART: INCLUDE INTERRUPT SUPPORT UNDER IM1/2/3 UARTCFG .EQU DEFSERCFG ; UART: LINE CONFIG FOR UART PORTS UARTCASSPD .EQU SER_300_8N1 ; UART: ECB CASSETTE UART DEFAULT SPEED -UARTSBC .EQU TRUE ; UART: AUTO-DETECT SBC/ZETA ONBOARD UART +UARTSBC .EQU TRUE ; UART: AUTO-DETECT SBC/ZETA/DUO ONBOARD UART UARTSBCFORCE .EQU FALSE ; UART: FORCE DETECTION OF SBC UART (FOR SIMH) +UARTAUX .EQU FALSE ; UART: AUTO-DETECT AUX UART UARTCAS .EQU FALSE ; UART: AUTO-DETECT ECB CASSETTE UART UARTMFP .EQU FALSE ; UART: AUTO-DETECT MF/PIC UART UART4 .EQU FALSE ; UART: AUTO-DETECT 4UART UART @@ -132,7 +143,7 @@ SIOENABLE .EQU TRUE ; SIO: ENABLE ZILOG SIO SERIAL DRIVER (SIO.ASM) SIODEBUG .EQU FALSE ; SIO: ENABLE DEBUG OUTPUT SIOBOOT .EQU 0 ; SIO: REBOOT ON RCV CHAR (0=DISABLED) SIOCNT .EQU 1 ; SIO: NUMBER OF CHIPS TO DETECT (1-2), 2 CHANNELS PER CHIP -SIO0MODE .EQU SIOMODE_ZP ; SIO 0: CHIP TYPE: SIOMODE_[STD|RC|SMB|ZP] +SIO0MODE .EQU SIOMODE_ZP ; SIO 0: CHIP TYPE: SIOMODE_[STD|RC|SMB|ZP|Z80R] SIO0BASE .EQU $B0 ; SIO 0: REGISTERS BASE ADR SIO0ACLK .EQU (4915200/8) ; SIO 0A: OSC FREQ IN HZ, ZP=2457600/4915200, RC/SMB=7372800 SIO0ACFG .EQU DEFSERCFG ; SIO 0A: SERIAL LINE CONFIG @@ -154,6 +165,8 @@ TMSMODE .EQU TMSMODE_MBC ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|MSX9958|MS TMSTIMENABLE .EQU FALSE ; TMS: ENABLE TIMER INTERRUPTS (REQUIRES IM1) VGAENABLE .EQU FALSE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM) VGASIZ .EQU V80X25 ; VGA: DISPLAY FORMAT [V80X25|V80X30|V80X43] +VRCENABLE .EQU FALSE ; VRC: ENABLE VGARC VIDEO/KBD DRIVER (VRC.ASM) +SCONENABLE .EQU FALSE ; SCON: ENABLE S100 CONSOLE DRIVER (SCON.ASM) ; MDENABLE .EQU TRUE ; MD: ENABLE MEMORY (ROM/RAM) DISK DRIVER (MD.ASM) MDROM .EQU TRUE ; MD: ENABLE ROM DISK @@ -166,9 +179,9 @@ FDENABLE .EQU FALSE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM) FDMODE .EQU FDMODE_MBC ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPFDC|MBC] FDCNT .EQU 2 ; FD: NUMBER OF FLOPPY DRIVES ON THE INTERFACE (1-2) FDTRACE .EQU 1 ; FD: TRACE LEVEL (0=NO,1=FATAL,2=ERRORS,3=ALL) -FDMEDIA .EQU FDM144 ; FD: DEFAULT MEDIA FORMAT FDM[720|144|360|120|111] -FDMEDIAALT .EQU FDM720 ; FD: ALTERNATE MEDIA FORMAT FDM[720|144|360|120|111] FDMAUTO .EQU TRUE ; FD: AUTO SELECT DEFAULT/ALTERNATE MEDIA FORMATS +FD0TYPE .EQU FDT_3HD ; FD 0: DRIVE TYPE: FDT_[3DD|3HD|5DD|5HD|8] +FD1TYPE .EQU FDT_3HD ; FD 1: DRIVE TYPE: FDT_[3DD|3HD|5DD|5HD|8] ; RFENABLE .EQU FALSE ; RF: ENABLE RAM FLOPPY DRIVER RFCNT .EQU 1 ; RF: NUMBER OF RAM FLOPPY UNITS (1-4) @@ -209,11 +222,14 @@ PPIDE2A8BIT .EQU FALSE ; PPIDE 2A (MASTER): 8 BIT XFER PPIDE2B8BIT .EQU FALSE ; PPIDE 0B (SLAVE): 8 BIT XFER ; SDENABLE .EQU FALSE ; SD: ENABLE SD CARD DISK DRIVER (SD.ASM) -SDMODE .EQU SDMODE_JUHA ; SD: DRIVER MODE: SDMODE_[JUHA|N8|CSIO|PPI|UART|DSD|MK4|SC|MT|USR] +SDMODE .EQU SDMODE_JUHA ; SD: DRIVER MODE: SDMODE_[JUHA|N8|CSIO|PPI|UART|DSD|MK4|SC|MT|PIO|Z80R|USR] SDPPIBASE .EQU $60 ; SD: BASE I/O ADDRESS OF PPI FOR PPI MODDE SDCNT .EQU 1 ; SD: NUMBER OF SD CARD DEVICES (1-2), FOR DSD/SC/MT ONLY SDTRACE .EQU 1 ; SD: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) SDCSIOFAST .EQU FALSE ; SD: ENABLE TABLE-DRIVEN BIT INVERTER IN CSIO MODE +SDMTSWAP .EQU FALSE ; SD: SWAP THE LOGICAL ORDER OF THE SPI PORTS OF THE MT011 +; +CHENABLE .EQU FALSE ; CH: ENABLE CH375/376 USB SUPPORT ; PRPENABLE .EQU FALSE ; PRP: ENABLE ECB PROPELLER IO BOARD DRIVER (PRP.ASM) PRPSDENABLE .EQU TRUE ; PRP: ENABLE PROPIO DRIVER SD CARD SUPPORT @@ -222,6 +238,9 @@ PRPCONENABLE .EQU TRUE ; PRP: ENABLE PROPIO DRIVER VIDEO/KBD SUPPORT ; PPPENABLE .EQU FALSE ; PPP: ENABLE ZETA PARALLEL PORT PROPELLER BOARD DRIVER (PPP.ASM) ; +ESPENABLE .EQU FALSE ; ESP: ENABLE ESP32 IO BOARD DRIVER (ESP.ASM) +ESPCONENABLE .EQU TRUE ; ESP: ENABLE ESP32 CONSOLE IO DRIVER VIDEO/KBD SUPPORT +; HDSKENABLE .EQU FALSE ; HDSK: ENABLE SIMH HDSK DISK DRIVER (HDSK.ASM) HDSKTRACE .EQU 1 ; HDSK: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) ; @@ -230,11 +249,34 @@ PIOCNT .EQU 2 ; PIO: NUMBER OF CHIPS TO DETECT (1-2), 2 CHANNELS PER CHIP PIO0BASE .EQU $B8 ; PIO 0: REGISTERS BASE ADR PIO1BASE .EQU $BC ; PIO 1: REGISTERS BASE ADR ; -LPTENABLE .EQU TRUE ; LPT: ENABLE CENTRONICS PRINTER DRIVER (LPT.ASM) +LPTENABLE .EQU FALSE ; LPT: ENABLE CENTRONICS PRINTER DRIVER (LPT.ASM) +LPTMODE .EQU LPTMODE_SPP ; LPT: DRIVER MODE: LPTMODE_[NONE|SPP|MG014] LPTCNT .EQU 1 ; LPT: NUMBER OF CHIPS TO DETECT (1-2) +LPTTRACE .EQU 1 ; LPT: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) LPT0BASE .EQU $E8 ; LPT 0: REGISTERS BASE ADR LPT1BASE .EQU $EC ; LPT 1: REGISTERS BASE ADR ; +PPAENABLE .EQU FALSE ; PPA: ENABLE PPA DISK DRIVER (PPA.ASM) +PPACNT .EQU 1 ; PPA: NUMBER OF PPA DEVICES (1-2) +PPATRACE .EQU 1 ; PPA: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +PPAMODE .EQU PPAMODE_SPP ; PPA: DRIVER MODE: PPAMODE_[NONE|MG014] +PPA0BASE .EQU LPT0BASE ; PPA 0: BASE I/O ADDRESS OF PPI FOR PPA +PPA1BASE .EQU LPT1BASE ; PPA 1: BASE I/O ADDRESS OF PPI FOR PPA +; +IMMENABLE .EQU FALSE ; IMM: ENABLE IMM DISK DRIVER (IMM.ASM) +IMMCNT .EQU 1 ; IMM: NUMBER OF IMM DEVICES (1-2) +IMMTRACE .EQU 1 ; IMM: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +IMMMODE .EQU IMMMODE_SPP ; IMM: DRIVER MODE: IMMMODE_[NONE|SPP|MG014] +IMM0BASE .EQU LPT0BASE ; IMM 0: BASE I/O ADDRESS OF PPI FOR IMM +IMM1BASE .EQU LPT1BASE ; IMM 1: BASE I/O ADDRESS OF PPI FOR IMM +; +SYQENABLE .EQU FALSE ; SYQ: ENABLE IMM DISK DRIVER (SYQ.ASM) +SYQCNT .EQU 1 ; SYQ: NUMBER OF SYQ DEVICES (1-2) +SYQTRACE .EQU 1 ; SYQ: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +SYQMODE .EQU IMMMODE_SPP ; SYQ: DRIVER MODE: SYQMODE_[NONE|SPP|MG014] +SYQ0BASE .EQU LPT0BASE ; SYQ 0: BASE I/O ADDRESS OF PPI FOR SYQ +SYQ1BASE .EQU LPT1BASE ; SYQ 1: BASE I/O ADDRESS OF PPI FOR SYQ +; PIO_4P .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB 4P BOARD PIO4BASE .EQU $90 ; PIO: PIO REGISTERS BASE ADR FOR ECB 4P BOARD PIO_ZP .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB ZILOG PERIPHERALS BOARD (PIO.ASM) @@ -258,8 +300,7 @@ SPKENABLE .EQU TRUE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM) ; DMAENABLE .EQU FALSE ; DMA: ENABLE DMA DRIVER (DMA.ASM) DMABASE .EQU $E0 ; DMA: DMA BASE ADDRESS -DMAMODE .EQU DMAMODE_MBC ; DMA: DMA MODE (NONE|ECB|Z180|Z280|RC|MBC) +DMAMODE .EQU DMAMODE_MBC ; DMA: DMA MODE (NONE|ECB|Z180|Z280|RC|MBC|DUO) ; -YM2612ENABLE .EQU FALSE ; YM2612: ENABLE YM2612 DRIVER (MUTE STUB) -VGMBASE .EQU $C0 ; YM2612: BASE ADDRESS FOR VGM BOARD (YM2612/SN76469s/CTC) - +YM2612ENABLE .EQU FALSE ; YM2612: ENABLE YM2612 DRIVER +VGMBASE .EQU $C0 ; YM2612: BASE ADDRESS FOR VGM BOARD (YM2612/SN76489s/CTC) diff --git a/Source/HBIOS/cfg_mk4.asm b/Source/HBIOS/cfg_mk4.asm index 2a3f618a..536ea233 100644 --- a/Source/HBIOS/cfg_mk4.asm +++ b/Source/HBIOS/cfg_mk4.asm @@ -1,6 +1,6 @@ ; ;================================================================================================== -; ROMWBW 2.X CONFIGURATION FOR MARK IV +; ROMWBW 3.X CONFIGURATION FOR MARK IV ;================================================================================================== ; ; THIS FILE CONTAINS THE FULL SET OF DEFAULT CONFIGURATION SETTINGS FOR THE PLATFORM @@ -15,7 +15,7 @@ ; #INCLUDE "hbios.inc" ; -PLATFORM .EQU PLT_MK4 ; PLT_[SBC|ZETA|ZETA2|N8|MK4|UNA|RCZ80|RCZ180|EZZ80|SCZ180|DYNO|RCZ280|MBC|RPH] +PLATFORM .EQU PLT_MK4 ; PLT_[SBC|ZETA|ZETA2|N8|MK4|UNA|RCZ80|RCZ180|EZZ80|SCZ180|DYNO|RCZ280|MBC|RPH|Z80RETRO|S100|DUO|HEATH|MON] CPUFAM .EQU CPU_Z180 ; CPU FAMILY: CPU_[Z80|Z180|Z280] BIOS .EQU BIOS_WBW ; HARDWARE BIOS: BIOS_[WBW|UNA] BATCOND .EQU FALSE ; ENABLE LOW BATTERY WARNING MESSAGE @@ -30,14 +30,12 @@ CPUSPDCAP .EQU SPD_FIXED ; CPU SPEED CHANGE CAPABILITY SPD_FIXED|SPD_HILO CPUSPDDEF .EQU SPD_HIGH ; CPU SPEED DEFAULT SPD_UNSUP|SPD_HIGH|SPD_LOW CPUOSC .EQU 18432000 ; CPU OSC FREQ IN MHZ INTMODE .EQU 2 ; INTERRUPTS: 0=NONE, 1=MODE 1, 2=MODE 2, 3=MODE 3 (Z280) -DEFSERCFG .EQU SER_38400_8N1 ; DEFAULT SERIAL LINE CONFIG (SEE STD.ASM) +DEFSERCFG .EQU SER_38400_8N1 | SER_RTS ; DEFAULT SERIAL LINE CONFIG (SEE STD.ASM) ; RAMSIZE .EQU 512 ; SIZE OF RAM IN KB (MUST MATCH YOUR HARDWARE!!!) ROMSIZE .EQU 512 ; SIZE OF ROM IN KB (MUST MATCH YOUR HARDWARE!!!) -ROMSIZE_CHK .EQU 0 ; ROMSIZE VALUE VERIFICATION (0=DISABLED) -MEMMGR .EQU MM_Z180 ; MEMORY MANAGER: MM_[SBC|Z2|N8|Z180|Z280|MBC|RPH] -RAMLOC .EQU 19 ; START OF RAM AS POWER OF 2 (2^N) IN PHYSICAL ADDRESS SPACE -RAMBIAS .EQU (1 << (RAMLOC - 10)) ; OFFSET OF START OF RAM IN PHYSICAL ADDRESS SPACE +MEMMGR .EQU MM_Z180 ; MEMORY MANAGER: MM_[SBC|Z2|N8|Z180|Z280|MBC|RPH|MON] +RAMBIAS .EQU ROMSIZE ; OFFSET OF START OF RAM IN PHYSICAL ADDRESS SPACE ; Z180_BASE .EQU $40 ; Z180: I/O BASE ADDRESS FOR INTERNAL REGISTERS Z180_CLKDIV .EQU 1 ; Z180: CHK DIV: 0=OSC/2, 1=OSC, 2=OSC*2 @@ -60,15 +58,21 @@ CTCDEBUG .EQU FALSE ; ENABLE CTC DRIVER DEBUG OUTPUT CTCBASE .EQU $B0 ; CTC BASE I/O ADDRESS CTCTIMER .EQU FALSE ; ENABLE CTC PERIODIC TIMER ; +PCFENABLE .EQU FALSE ; ENABLE PCF8584 I2C CONTROLLER +PCFBASE .EQU $F0 ; PCF8584 BASE I/O ADDRESS +; EIPCENABLE .EQU FALSE ; EIPC: ENABLE Z80 EIPC (Z84C15) INITIALIZATION ; SKZENABLE .EQU FALSE ; ENABLE SERGEY'S Z80-512K FEATURES ; WDOGMODE .EQU WDOG_NONE ; WATCHDOG MODE: WDOG_[NONE|EZZ80|SKZ] ; -DIAGENABLE .EQU FALSE ; ENABLES OUTPUT TO 8 BIT LED DIAGNOSTIC PORT -DIAGPORT .EQU $00 ; DIAGNOSTIC PORT ADDRESS -DIAGDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON DIAGNOSTIC LEDS +FPLED_ENABLE .EQU FALSE ; FP: ENABLES FRONT PANEL LEDS +FPLED_IO .EQU $00 ; FP: PORT ADDRESS FOR FP LEDS +FPLED_DSKACT .EQU TRUE ; FP: ENABLES DISK I/O ACTIVITY ON FP LEDS +FPSW_ENABLE .EQU FALSE ; FP: ENABLES FRONT PANEL SWITCHES +FPSW_IO .EQU $00 ; FP: PORT ADDRESS FOR FP SWITCHES +; DIAGLVL .EQU DL_CRITICAL ; ERROR LEVEL REPORTING ; LEDENABLE .EQU FALSE ; ENABLES STATUS LED (SINGLE LED) @@ -76,12 +80,17 @@ LEDMODE .EQU LEDMODE_STD ; LEDMODE_[STD|RTC] LEDPORT .EQU $0E ; STATUS LED PORT ADDRESS LEDDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON STATUS LED ; -DSKYENABLE .EQU FALSE ; ENABLES DSKY -DSKYMODE .EQU DSKYMODE_V1 ; DSKY VERSION: DSKYMODE_[V1|NG] -DSKYPPIBASE .EQU $60 ; BASE I/O ADDRESS OF DSKY PPI -DSKYOSC .EQU 3000000 ; OSCILLATOR FREQ FOR DSKYNG (IN HZ) +DSKYENABLE .EQU FALSE ; ENABLES DSKY FUNCTIONALITY +DSKYDSKACT .EQU TRUE ; ENABLES DISK ACTIVITY ON DSKY DISPLAY +ICMENABLE .EQU FALSE ; ENABLES ORIGINAL DSKY ICM DRIVER (7218) +ICMPPIBASE .EQU $60 ; BASE I/O ADDRESS OF ICM PPI +PKDENABLE .EQU FALSE ; ENABLES DSKY NG PKD DRIVER (8259) +PKDPPIBASE .EQU $60 ; BASE I/O ADDRESS OF PKD PPI +PKDOSC .EQU 3000000 ; OSCILLATOR FREQ FOR PKD (IN HZ) +H8PENABLE .EQU FALSE ; ENABLES HEATH H8 FRONT PANEL ; BOOTCON .EQU 0 ; BOOT CONSOLE DEVICE +SECCON .EQU $FF ; SECONDARY CONSOLE DEVICE CRTACT .EQU FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP VDAEMU .EQU EMUTYP_ANSI ; VDA EMULATION: EMUTYP_[TTY|ANSI] VDAEMU_SERKBD .EQU $FF ; VDA EMULATION: SERIAL KBD UNIT #, OR $FF FOR HW KBD @@ -120,8 +129,9 @@ UARTOSC .EQU 1843200 ; UART: OSC FREQUENCY IN MHZ UARTINTS .EQU FALSE ; UART: INCLUDE INTERRUPT SUPPORT UNDER IM1/2/3 UARTCFG .EQU DEFSERCFG ; UART: LINE CONFIG FOR UART PORTS UARTCASSPD .EQU SER_300_8N1 ; UART: ECB CASSETTE UART DEFAULT SPEED -UARTSBC .EQU FALSE ; UART: AUTO-DETECT SBC/ZETA ONBOARD UART +UARTSBC .EQU FALSE ; UART: AUTO-DETECT SBC/ZETA/DUO ONBOARD UART UARTSBCFORCE .EQU FALSE ; UART: FORCE DETECTION OF SBC UART (FOR SIMH) +UARTAUX .EQU FALSE ; UART: AUTO-DETECT AUX UART UARTCAS .EQU TRUE ; UART: AUTO-DETECT ECB CASSETTE UART UARTMFP .EQU FALSE ; UART: AUTO-DETECT MF/PIC UART UART4 .EQU TRUE ; UART: AUTO-DETECT 4UART UART @@ -143,7 +153,7 @@ SIOENABLE .EQU FALSE ; SIO: ENABLE ZILOG SIO SERIAL DRIVER (SIO.ASM) SIODEBUG .EQU FALSE ; SIO: ENABLE DEBUG OUTPUT SIOBOOT .EQU 0 ; SIO: REBOOT ON RCV CHAR (0=DISABLED) SIOCNT .EQU 1 ; SIO: NUMBER OF CHIPS TO DETECT (1-2), 2 CHANNELS PER CHIP -SIO0MODE .EQU SIOMODE_ZP ; SIO 0: CHIP TYPE: SIOMODE_[STD|RC|SMB|ZP] +SIO0MODE .EQU SIOMODE_ZP ; SIO 0: CHIP TYPE: SIOMODE_[STD|RC|SMB|ZP|Z80R] SIO0BASE .EQU $B0 ; SIO 0: REGISTERS BASE ADR SIO0ACLK .EQU (4915200/8) ; SIO 0A: OSC FREQ IN HZ, ZP=2457600/4915200, RC/SMB=7372800 SIO0ACFG .EQU DEFSERCFG ; SIO 0A: SERIAL LINE CONFIG @@ -165,6 +175,8 @@ TMSMODE .EQU TMSMODE_SCG ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|MSX9958|MS TMSTIMENABLE .EQU FALSE ; TMS: ENABLE TIMER INTERRUPTS (REQUIRES IM1) VGAENABLE .EQU FALSE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM) VGASIZ .EQU V80X25 ; VGA: DISPLAY FORMAT [V80X25|V80X30|V80X43] +VRCENABLE .EQU FALSE ; VRC: ENABLE VGARC VIDEO/KBD DRIVER (VRC.ASM) +SCONENABLE .EQU FALSE ; SCON: ENABLE S100 CONSOLE DRIVER (SCON.ASM) ; MDENABLE .EQU TRUE ; MD: ENABLE MEMORY (ROM/RAM) DISK DRIVER (MD.ASM) MDROM .EQU TRUE ; MD: ENABLE ROM DISK @@ -176,9 +188,9 @@ FDENABLE .EQU FALSE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM) FDMODE .EQU FDMODE_DIDE ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPFDC|MBC] FDCNT .EQU 2 ; FD: NUMBER OF FLOPPY DRIVES ON THE INTERFACE (1-2) FDTRACE .EQU 1 ; FD: TRACE LEVEL (0=NO,1=FATAL,2=ERRORS,3=ALL) -FDMEDIA .EQU FDM144 ; FD: DEFAULT MEDIA FORMAT FDM[720|144|360|120|111] -FDMEDIAALT .EQU FDM720 ; FD: ALTERNATE MEDIA FORMAT FDM[720|144|360|120|111] FDMAUTO .EQU TRUE ; FD: AUTO SELECT DEFAULT/ALTERNATE MEDIA FORMATS +FD0TYPE .EQU FDT_3HD ; FD 0: DRIVE TYPE: FDT_[3DD|3HD|5DD|5HD|8] +FD1TYPE .EQU FDT_3HD ; FD 1: DRIVE TYPE: FDT_[3DD|3HD|5DD|5HD|8] ; RFENABLE .EQU FALSE ; RF: ENABLE RAM FLOPPY DRIVER RFCNT .EQU 1 ; RF: NUMBER OF RAM FLOPPY UNITS (1-4) @@ -219,11 +231,14 @@ PPIDE2A8BIT .EQU FALSE ; PPIDE 2A (MASTER): 8 BIT XFER PPIDE2B8BIT .EQU FALSE ; PPIDE 0B (SLAVE): 8 BIT XFER ; SDENABLE .EQU TRUE ; SD: ENABLE SD CARD DISK DRIVER (SD.ASM) -SDMODE .EQU SDMODE_MK4 ; SD: DRIVER MODE: SDMODE_[JUHA|N8|CSIO|PPI|UART|DSD|MK4|SC|MT|USR] +SDMODE .EQU SDMODE_MK4 ; SD: DRIVER MODE: SDMODE_[JUHA|N8|CSIO|PPI|UART|DSD|MK4|SC|MT|PIO|Z80R|USR] SDPPIBASE .EQU $60 ; SD: BASE I/O ADDRESS OF PPI FOR PPI MODDE SDCNT .EQU 1 ; SD: NUMBER OF SD CARD DEVICES (1-2), FOR DSD/SC/MT ONLY SDTRACE .EQU 1 ; SD: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) SDCSIOFAST .EQU TRUE ; SD: ENABLE TABLE-DRIVEN BIT INVERTER IN CSIO MODE +SDMTSWAP .EQU FALSE ; SD: SWAP THE LOGICAL ORDER OF THE SPI PORTS OF THE MT011 +; +CHENABLE .EQU FALSE ; CH: ENABLE CH375/376 USB SUPPORT ; PRPENABLE .EQU FALSE ; PRP: ENABLE ECB PROPELLER IO BOARD DRIVER (PRP.ASM) PRPSDENABLE .EQU TRUE ; PRP: ENABLE PROPIO DRIVER SD CARD SUPPORT @@ -236,6 +251,8 @@ PPPSDENABLE .EQU TRUE ; PPP: ENABLE PPP DRIVER SD CARD SUPPORT PPPSDTRACE .EQU 1 ; PPP: SD CARD TRACE LEVEL (0=NO,1=ERRORS,2=ALL) PPPCONENABLE .EQU TRUE ; PPP: ENABLE PPP DRIVER VIDEO/KBD SUPPORT ; +ESPENABLE .EQU FALSE ; ESP: ENABLE ESP32 IO BOARD DRIVER (ESP.ASM) +; HDSKENABLE .EQU FALSE ; HDSK: ENABLE SIMH HDSK DISK DRIVER (HDSK.ASM) ; PIOENABLE .EQU FALSE ; PIO: ENABLE ZILOG PIO DRIVER (PIO.ASM) @@ -244,10 +261,18 @@ PIO0BASE .EQU $B8 ; PIO 0: REGISTERS BASE ADR PIO1BASE .EQU $BC ; PIO 1: REGISTERS BASE ADR ; LPTENABLE .EQU FALSE ; LPT: ENABLE CENTRONICS PRINTER DRIVER (LPT.ASM) +LPTMODE .EQU LPTMODE_NONE ; LPT: DRIVER MODE: LPTMODE_[NONE|SPP|MG014] LPTCNT .EQU 1 ; LPT: NUMBER OF CHIPS TO DETECT (1-2) +LPTTRACE .EQU 1 ; LPT: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) LPT0BASE .EQU $E8 ; LPT 0: REGISTERS BASE ADR LPT1BASE .EQU $EC ; LPT 1: REGISTERS BASE ADR ; +PPAENABLE .EQU FALSE ; PPA: ENABLE PPA DISK DRIVER (PPA.ASM) +; +IMMENABLE .EQU FALSE ; IMM: ENABLE IMM DISK DRIVER (IMM.ASM) +; +SYQENABLE .EQU FALSE ; SYQ: ENABLE IMM DISK DRIVER (SYQ.ASM) +; PIO_4P .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB 4P BOARD PIO4BASE .EQU $90 ; PIO: PIO REGISTERS BASE ADR FOR ECB 4P BOARD PIO_ZP .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB ZILOG PERIPHERALS BOARD (PIO.ASM) @@ -271,7 +296,7 @@ SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM) ; DMAENABLE .EQU FALSE ; DMA: ENABLE DMA DRIVER (DMA.ASM) DMABASE .EQU $E0 ; DMA: DMA BASE ADDRESS -DMAMODE .EQU DMAMODE_ECB ; DMA: DMA MODE (NONE|ECB|Z180|Z280|RC|MBC) +DMAMODE .EQU DMAMODE_ECB ; DMA: DMA MODE (NONE|ECB|Z180|Z280|RC|MBC|DUO) ; -YM2612ENABLE .EQU FALSE ; YM2612: ENABLE YM2612 DRIVER (MUTE STUB) -VGMBASE .EQU $C0 ; YM2612: BASE ADDRESS FOR VGM BOARD (YM2612/SN76469s/CTC) +YM2612ENABLE .EQU FALSE ; YM2612: ENABLE YM2612 DRIVER +VGMBASE .EQU $C0 ; YM2612: BASE ADDRESS FOR VGM BOARD (YM2612/SN76489s/CTC) diff --git a/Source/HBIOS/cfg_mon.asm b/Source/HBIOS/cfg_mon.asm new file mode 100644 index 00000000..92bff9fe --- /dev/null +++ b/Source/HBIOS/cfg_mon.asm @@ -0,0 +1,328 @@ +; +;================================================================================================== +; ROMWBW 3.X CONFIGURATION DEFAULTS FOR MONSPUTER Z80 +;================================================================================================== +; +; THIS FILE CONTAINS THE FULL SET OF DEFAULT CONFIGURATION SETTINGS FOR THE PLATFORM +; INDICATED ABOVE. THIS FILE SHOULD *NOT* NORMALLY BE CHANGED. INSTEAD, YOU SHOULD +; OVERRIDE ANY SETTINGS YOU WANT USING A CONFIGURATION FILE IN THE CONFIG DIRECTORY +; UNDER THIS DIRECTORY. +; +; THIS FILE CAN BE CONSIDERED A REFERENCE THAT LISTS ALL POSSIBLE CONFIGURATION SETTINGS +; FOR THE PLATFORM. +; +#DEFINE PLATFORM_NAME "Monsputer", " [", CONFIG, "]" +; +#INCLUDE "hbios.inc" +; +PLATFORM .EQU PLT_MON ; PLT_[SBC|ZETA|ZETA2|N8|MK4|UNA|RCZ80|RCZ180|EZZ80|SCZ180|DYNO|RCZ280|MBC|RPH|Z80RETRO|S100|DUO|HEATH|MON] +CPUFAM .EQU CPU_Z80 ; CPU FAMILY: CPU_[Z80|Z180|Z280] +BIOS .EQU BIOS_WBW ; HARDWARE BIOS: BIOS_[WBW|UNA] +BATCOND .EQU FALSE ; ENABLE LOW BATTERY WARNING MESSAGE +HBIOS_MUTEX .EQU FALSE ; ENABLE REENTRANT CALLS TO HBIOS (ADDS OVERHEAD) +USELZSA2 .EQU TRUE ; ENABLE FONT COMPRESSION +TICKFREQ .EQU 50 ; DESIRED PERIODIC TIMER INTERRUPT FREQUENCY (HZ) +; +BOOT_TIMEOUT .EQU -1 ; AUTO BOOT TIMEOUT IN SECONDS, -1 TO DISABLE, 0 FOR IMMEDIATE +BOOT_DELAY .EQU 0 ; FIXED BOOT DELAY IN SECONDS PRIOR TO CONSOLE OUTPUT +; +CPUSPDCAP .EQU SPD_FIXED ; CPU SPEED CHANGE CAPABILITY SPD_FIXED|SPD_HILO +CPUSPDDEF .EQU SPD_HIGH ; CPU SPEED DEFAULT SPD_UNSUP|SPD_HIGH|SPD_LOW +CPUOSC .EQU 4000000 ; CPU OSC FREQ IN MHZ +INTMODE .EQU 2 ; INTERRUPTS: 0=NONE, 1=MODE 1, 2=MODE 2, 3=MODE 3 (Z280) +DEFSERCFG .EQU SER_115200_8N1 | SER_RTS ; DEFAULT SERIAL LINE CONFIG (SEE STD.ASM) +; +RAMSIZE .EQU 512 ; SIZE OF RAM IN KB (MUST MATCH YOUR HARDWARE!!!) +ROMSIZE .EQU 512 ; SIZE OF ROM IN KB (MUST MATCH YOUR HARDWARE!!!) +MEMMGR .EQU MM_MON ; MEMORY MANAGER: MM_[SBC|Z2|N8|Z180|Z280|MBC|RPH|MON] +; +RTCIO .EQU $C0 ; RTC LATCH REGISTER ADR +; +KIOENABLE .EQU FALSE ; ENABLE ZILOG KIO SUPPORT +KIOBASE .EQU $80 ; KIO BASE I/O ADDRESS +; +CTCENABLE .EQU FALSE ; ENABLE ZILOG CTC SUPPORT +CTCDEBUG .EQU FALSE ; ENABLE CTC DRIVER DEBUG OUTPUT +CTCBASE .EQU $88 ; CTC BASE I/O ADDRESS +CTCTIMER .EQU FALSE ; ENABLE CTC PERIODIC TIMER +CTCMODE .EQU CTCMODE_TIM16 ; CTC MODE: CTCMODE_[NONE|CTR|TIM16|TIM256] +CTCPRE .EQU 256 ; PRESCALE CONSTANT (1-256) +CTCPRECH .EQU 2 ; PRESCALE CHANNEL (0-3) +CTCTIMCH .EQU 3 ; TIMER CHANNEL (0-3) +CTCOSC .EQU CPUOSC ; CTC CLOCK FREQUENCY +; +PCFENABLE .EQU FALSE ; ENABLE PCF8584 I2C CONTROLLER +PCFBASE .EQU $F0 ; PCF8584 BASE I/O ADDRESS +; +EIPCENABLE .EQU FALSE ; EIPC: ENABLE Z80 EIPC (Z84C15) INITIALIZATION +; +SKZENABLE .EQU FALSE ; ENABLE SERGEY'S Z80-512K FEATURES +SKZDIV .EQU DIV_1 ; UART CLK (CLK2) DIVIDER FOR Z80-512K +; +WDOGMODE .EQU WDOG_NONE ; WATCHDOG MODE: WDOG_[NONE|EZZ80|SKZ] +WDOGIO .EQU $6E ; WATCHDOG REGISTER ADR +; +FPLED_ENABLE .EQU FALSE ; FP: ENABLES FRONT PANEL LEDS +FPLED_IO .EQU $00 ; FP: PORT ADDRESS FOR FP LEDS +FPLED_DSKACT .EQU TRUE ; FP: ENABLES DISK I/O ACTIVITY ON FP LEDS +FPSW_ENABLE .EQU FALSE ; FP: ENABLES FRONT PANEL SWITCHES +FPSW_IO .EQU $00 ; FP: PORT ADDRESS FOR FP SWITCHES +; +DIAGLVL .EQU DL_CRITICAL ; ERROR LEVEL REPORTING +; +LEDENABLE .EQU FALSE ; ENABLES STATUS LED (SINGLE LED) +LEDMODE .EQU LEDMODE_STD ; LEDMODE_[STD|RTC] +LEDPORT .EQU $0E ; STATUS LED PORT ADDRESS +LEDDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON STATUS LED +; +DSKYENABLE .EQU FALSE ; ENABLES DSKY FUNCTIONALITY +DSKYDSKACT .EQU TRUE ; ENABLES DISK ACTIVITY ON DSKY DISPLAY +ICMENABLE .EQU FALSE ; ENABLES ORIGINAL DSKY ICM DRIVER (7218) +ICMPPIBASE .EQU $60 ; BASE I/O ADDRESS OF ICM PPI +PKDENABLE .EQU FALSE ; ENABLES DSKY NG PKD DRIVER (8259) +PKDPPIBASE .EQU $60 ; BASE I/O ADDRESS OF PKD PPI +PKDOSC .EQU 3000000 ; OSCILLATOR FREQ FOR PKD (IN HZ) +H8PENABLE .EQU FALSE ; ENABLES HEATH H8 FRONT PANEL +; +BOOTCON .EQU 0 ; BOOT CONSOLE DEVICE +SECCON .EQU $FF ; SECONDARY CONSOLE DEVICE +CRTACT .EQU FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP +VDAEMU .EQU EMUTYP_ANSI ; VDA EMULATION: EMUTYP_[TTY|ANSI] +VDAEMU_SERKBD .EQU $FF ; VDA EMULATION: SERIAL KBD UNIT #, OR $FF FOR HW KBD +ANSITRACE .EQU 1 ; ANSI DRIVER TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +PPKTRACE .EQU 1 ; PPK DRIVER TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +KBDTRACE .EQU 1 ; KBD DRIVER TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +KBDKBLOUT .EQU KBD_US ; KBD KEYBOARD LANGUAGE: KBD_[US|DE] +PPKKBLOUT .EQU KBD_US ; PPK KEYBOARD LANGUAGE: KBD_[US|DE] +MKYENABLE .EQU FALSE ; MSX 5255 PPI KEYBOARD COMPATIBLE DRIVER (REQUIRES TMS VDA DRIVER) +MKYKBLOUT .EQU KBD_US ; KBD KEYBOARD LANGUAGE: KBD_[US|DE] +; +DSRTCENABLE .EQU FALSE ; DSRTC: ENABLE DS-1302 CLOCK DRIVER (DSRTC.ASM) +DSRTCMODE .EQU DSRTCMODE_STD ; DSRTC: OPERATING MODE: DSRTC_[STD|MFPIC] +DSRTCCHG .EQU FALSE ; DSRTC: FORCE BATTERY CHARGE ON (USE WITH CAUTION!!!) +; +DS1501RTCENABLE .EQU FALSE ; DS1501RTC: ENABLE DS-1501 CLOCK DRIVER (DS1501RTC.ASM) +DS1501RTC_BASE .EQU $50 ; DS1501RTC: I/O BASE ADDRESS +; +BQRTCENABLE .EQU FALSE ; BQRTC: ENABLE BQ4845 CLOCK DRIVER (BQRTC.ASM) +BQRTC_BASE .EQU $50 ; BQRTC: I/O BASE ADDRESS +; +INTRTCENABLE .EQU FALSE ; ENABLE PERIODIC INTERRUPT CLOCK DRIVER (INTRTC.ASM) +; +RP5RTCENABLE .EQU FALSE ; RP5C01 RTC BASED CLOCK (RP5RTC.ASM) +; +HTIMENABLE .EQU FALSE ; ENABLE SIMH TIMER SUPPORT +SIMRTCENABLE .EQU FALSE ; ENABLE SIMH CLOCK DRIVER (SIMRTC.ASM) +; +DS7RTCENABLE .EQU FALSE ; DS7RTC: ENABLE DS-1307 I2C CLOCK DRIVER (DS7RTC.ASM) +DS7RTCMODE .EQU DS7RTCMODE_PCF ; DS7RTC: OPERATING MODE: DS7RTC_[PCF] +; +DUARTENABLE .EQU FALSE ; DUART: ENABLE 2681/2692 SERIAL DRIVER (DUART.ASM) +DUARTCNT .EQU 1 ; DUART: NUMBER OF CHIPS TO DETECT (1-2) +DUART0BASE .EQU $A0 ; DUART 0: BASE ADDRESS OF CHIP +DUART0ACFG .EQU DEFSERCFG ; DUART 0A: SERIAL LINE CONFIG +DUART0BCFG .EQU DEFSERCFG ; DUART 0B: SERIAL LINE CONFIG +DUART1BASE .EQU $40 ; DUART 1: BASE ADDRESS OF CHIP +DUART1ACFG .EQU DEFSERCFG ; DUART 1A: SERIAL LINE CONFIG +DUART1BCFG .EQU DEFSERCFG ; DUART 1B: SERIAL LINE CONFIG +; +UARTENABLE .EQU FALSE ; UART: ENABLE 8250/16550-LIKE SERIAL DRIVER (UART.ASM) +UARTOSC .EQU 1843200 ; UART: OSC FREQUENCY IN MHZ +UARTINTS .EQU FALSE ; UART: INCLUDE INTERRUPT SUPPORT UNDER IM1/2/3 +UARTCFG .EQU DEFSERCFG | SER_RTS ; UART: LINE CONFIG FOR UART PORTS +UARTSBC .EQU FALSE ; UART: AUTO-DETECT SBC/ZETA/DUO ONBOARD UART +UARTSBCFORCE .EQU FALSE ; UART: FORCE DETECTION OF SBC UART (FOR SIMH) +UARTAUX .EQU FALSE ; UART: AUTO-DETECT AUX UART +UARTCAS .EQU FALSE ; UART: AUTO-DETECT ECB CASSETTE UART +UARTMFP .EQU FALSE ; UART: AUTO-DETECT MF/PIC UART +UART4 .EQU FALSE ; UART: AUTO-DETECT 4UART UART +UARTRC .EQU TRUE ; UART: AUTO-DETECT RC UART +UARTDUAL .EQU FALSE ; UART: AUTO-DETECT DUAL UART +; +ASCIENABLE .EQU FALSE ; ASCI: ENABLE Z180 ASCI SERIAL DRIVER (ASCI.ASM) +; +Z2UENABLE .EQU FALSE ; Z2U: ENABLE Z280 UART SERIAL DRIVER (Z2U.ASM) +; +ACIAENABLE .EQU FALSE ; ACIA: ENABLE MOTOROLA 6850 ACIA DRIVER (ACIA.ASM) +ACIADEBUG .EQU FALSE ; ACIA: ENABLE DEBUG OUTPUT +ACIACNT .EQU 1 ; ACIA: NUMBER OF CHIPS TO DETECT (1-2) +ACIA0BASE .EQU $80 ; ACIA 0: REGISTERS BASE ADR +ACIA0CLK .EQU CPUOSC ; ACIA 0: OSC FREQ IN HZ +ACIA0DIV .EQU 1 ; ACIA 0: SERIAL CLOCK DIVIDER +ACIA0CFG .EQU DEFSERCFG ; ACIA 0: SERIAL LINE CONFIG (SEE STD.ASM) +ACIA1BASE .EQU $40 ; ACIA 1: REGISTERS BASE ADR +ACIA1CLK .EQU CPUOSC ; ACIA 1: OSC FREQ IN HZ +ACIA1DIV .EQU 1 ; ACIA 1: SERIAL CLOCK DIVIDER +ACIA1CFG .EQU DEFSERCFG ; ACIA 1: SERIAL LINE CONFIG (SEE STD.ASM) +; +SIOENABLE .EQU FALSE ; SIO: ENABLE ZILOG SIO SERIAL DRIVER (SIO.ASM) +SIODEBUG .EQU FALSE ; SIO: ENABLE DEBUG OUTPUT +SIOBOOT .EQU 0 ; SIO: REBOOT ON RCV CHAR (0=DISABLED) +SIOCNT .EQU 2 ; SIO: NUMBER OF CHIPS TO DETECT (1-2), 2 CHANNELS PER CHIP +SIO0MODE .EQU SIOMODE_RC ; SIO 0: CHIP TYPE: SIOMODE_[STD|RC|SMB|ZP|Z80R] +SIO0BASE .EQU $80 ; SIO 0: REGISTERS BASE ADR +SIO0ACLK .EQU CPUOSC ; SIO 0A: OSC FREQ IN HZ, ZP=2457600/4915200, RC/SMB=7372800 +SIO0ACFG .EQU DEFSERCFG ; SIO 0A: SERIAL LINE CONFIG +SIO0ACTCC .EQU -1 ; SIO 0A: CTC CHANNEL 0=A, 1=B, 2=C, 3=D, -1 FOR NONE +SIO0BCLK .EQU CPUOSC ; SIO 0B: OSC FREQ IN HZ, ZP=2457600/4915200, RC/SMB=7372800 +SIO0BCFG .EQU DEFSERCFG ; SIO 0B: SERIAL LINE CONFIG +SIO0BCTCC .EQU -1 ; SIO 0B: CTC CHANNEL 0=A, 1=B, 2=C, 3=D, -1 FOR NONE +SIO1MODE .EQU SIOMODE_RC ; SIO 1: CHIP TYPE: SIOMODE_[STD|RC|SMB|ZP|Z80R] +SIO1BASE .EQU $84 ; SIO 1: REGISTERS BASE ADR +SIO1ACLK .EQU CPUOSC ; SIO 1A: OSC FREQ IN HZ, ZP=2457600/4915200, RC/SMB=7372800 +SIO1ACFG .EQU DEFSERCFG ; SIO 1A: SERIAL LINE CONFIG +SIO1ACTCC .EQU -1 ; SIO 1A: CTC CHANNEL 0=A, 1=B, 2=C, 3=D, -1 FOR NONE +SIO1BCLK .EQU CPUOSC ; SIO 1B: OSC FREQ IN HZ, ZP=2457600/4915200, RC/SMB=7372800 +SIO1BCFG .EQU DEFSERCFG ; SIO 1B: SERIAL LINE CONFIG +SIO1BCTCC .EQU -1 ; SIO 1B: CTC CHANNEL 0=A, 1=B, 2=C, 3=D, -1 FOR NONE +; +XIOCFG .EQU DEFSERCFG ; XIO: SERIAL LINE CONFIG +; +VDUENABLE .EQU FALSE ; VDU: ENABLE VDU VIDEO/KBD DRIVER (VDU.ASM) +CVDUENABLE .EQU FALSE ; CVDU: ENABLE CVDU VIDEO/KBD DRIVER (CVDU.ASM) +GDCENABLE .EQU FALSE ; GDC: ENABLE 7220 GDC VIDEO/KBD DRIVER (GDC.ASM) +TMSENABLE .EQU FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM) +TMSMODE .EQU TMSMODE_MSX ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|MSX9958|MSXKBD|COLECO] +TMSTIMENABLE .EQU FALSE ; TMS: ENABLE TIMER INTERRUPTS (REQUIRES IM1) +VGAENABLE .EQU FALSE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM) +VRCENABLE .EQU FALSE ; VRC: ENABLE VGARC VIDEO/KBD DRIVER (VRC.ASM) +SCONENABLE .EQU FALSE ; SCON: ENABLE S100 CONSOLE DRIVER (SCON.ASM) +; +MDENABLE .EQU TRUE ; MD: ENABLE MEMORY (ROM/RAM) DISK DRIVER (MD.ASM) +MDROM .EQU TRUE ; MD: ENABLE ROM DISK +MDRAM .EQU TRUE ; MD: ENABLE RAM DISK +MDTRACE .EQU 1 ; MD: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +MDFFENABLE .EQU FALSE ; MD: ENABLE FLASH FILE SYSTEM +; +FDENABLE .EQU FALSE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM) +FDMODE .EQU FDMODE_RCWDC ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPFDC|MBC] +FDCNT .EQU 2 ; FD: NUMBER OF FLOPPY DRIVES ON THE INTERFACE (1-2) +FDTRACE .EQU 1 ; FD: TRACE LEVEL (0=NO,1=FATAL,2=ERRORS,3=ALL) +FDMAUTO .EQU TRUE ; FD: AUTO SELECT DEFAULT/ALTERNATE MEDIA FORMATS +FD0TYPE .EQU FDT_3HD ; FD 0: DRIVE TYPE: FDT_[3DD|3HD|5DD|5HD|8] +FD1TYPE .EQU FDT_3HD ; FD 1: DRIVE TYPE: FDT_[3DD|3HD|5DD|5HD|8] +; +RFENABLE .EQU FALSE ; RF: ENABLE RAM FLOPPY DRIVER +; +IDEENABLE .EQU FALSE ; IDE: ENABLE IDE DISK DRIVER (IDE.ASM) +IDETRACE .EQU 1 ; IDE: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +IDECNT .EQU 1 ; IDE: NUMBER OF IDE INTERFACES TO DETECT (1-3), 2 DRIVES EACH +IDE0MODE .EQU IDEMODE_RC ; IDE 0: DRIVER MODE: IDEMODE_[DIO|DIDE|MK4|RC] +IDE0BASE .EQU $10 ; IDE 0: IO BASE ADDRESS +IDE0DATLO .EQU $00 ; IDE 0: DATA LO PORT FOR 16-BIT I/O +IDE0DATHI .EQU $00 ; IDE 0: DATA HI PORT FOR 16-BIT I/O +IDE0A8BIT .EQU TRUE ; IDE 0A (MASTER): 8 BIT XFER +IDE0B8BIT .EQU TRUE ; IDE 0B (MASTER): 8 BIT XFER +IDE1MODE .EQU IDEMODE_NONE ; IDE 1: DRIVER MODE: IDEMODE_[DIO|DIDE|MK4|RC] +IDE1BASE .EQU $00 ; IDE 1: IO BASE ADDRESS +IDE1DATLO .EQU $00 ; IDE 1: DATA LO PORT FOR 16-BIT I/O +IDE1DATHI .EQU $00 ; IDE 1: DATA HI PORT FOR 16-BIT I/O +IDE1A8BIT .EQU TRUE ; IDE 1A (MASTER): 8 BIT XFER +IDE1B8BIT .EQU TRUE ; IDE 1B (MASTER): 8 BIT XFER +IDE2MODE .EQU IDEMODE_NONE ; IDE 2: DRIVER MODE: IDEMODE_[DIO|DIDE|MK4|RC] +IDE2BASE .EQU $00 ; IDE 2: IO BASE ADDRESS +IDE2DATLO .EQU $00 ; IDE 2: DATA LO PORT FOR 16-BIT I/O +IDE2DATHI .EQU $00 ; IDE 2: DATA HI PORT FOR 16-BIT I/O +IDE2A8BIT .EQU TRUE ; IDE 2A (MASTER): 8 BIT XFER +IDE2B8BIT .EQU TRUE ; IDE 2B (MASTER): 8 BIT XFER +; +PPIDEENABLE .EQU FALSE ; PPIDE: ENABLE PARALLEL PORT IDE DISK DRIVER (PPIDE.ASM) +PPIDETRACE .EQU 1 ; PPIDE: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +PPIDECNT .EQU 1 ; PPIDE: NUMBER OF PPI CHIPS TO DETECT (1-3), 2 DRIVES PER CHIP +PPIDE0BASE .EQU $20 ; PPIDE 0: PPI REGISTERS BASE ADR +PPIDE0A8BIT .EQU FALSE ; PPIDE 0A (MASTER): 8 BIT XFER +PPIDE0B8BIT .EQU FALSE ; PPIDE 0B (SLAVE): 8 BIT XFER +PPIDE1BASE .EQU $00 ; PPIDE 1: PPI REGISTERS BASE ADR +PPIDE1A8BIT .EQU FALSE ; PPIDE 1A (MASTER): 8 BIT XFER +PPIDE1B8BIT .EQU FALSE ; PPIDE 0B (SLAVE): 8 BIT XFER +PPIDE2BASE .EQU $00 ; PPIDE 2: PPI REGISTERS BASE ADR +PPIDE2A8BIT .EQU FALSE ; PPIDE 2A (MASTER): 8 BIT XFER +PPIDE2B8BIT .EQU FALSE ; PPIDE 0B (SLAVE): 8 BIT XFER +; +SDENABLE .EQU FALSE ; SD: ENABLE SD CARD DISK DRIVER (SD.ASM) +SDMODE .EQU SDMODE_MT ; SD: DRIVER MODE: SDMODE_[JUHA|N8|CSIO|PPI|UART|DSD|MK4|SC|MT|PIO|Z80R|USR] +SDPPIBASE .EQU $60 ; SD: BASE I/O ADDRESS OF PPI FOR PPI MODDE +SDCNT .EQU 2 ; SD: NUMBER OF SD CARD DEVICES (1-2), FOR DSD/SC/MT ONLY +SDTRACE .EQU 1 ; SD: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +SDCSIOFAST .EQU FALSE ; SD: ENABLE TABLE-DRIVEN BIT INVERTER IN CSIO MODE +SDMTSWAP .EQU FALSE ; SD: SWAP THE LOGICAL ORDER OF THE SPI PORTS OF THE MT011 +; +CHENABLE .EQU FALSE ; CH: ENABLE CH375/376 USB SUPPORT +CHTRACE .EQU 1 ; CH: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +CHUSBTRACE .EQU 1 ; CHUSB: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +CHSDTRACE .EQU 1 ; CHSD: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +CHCNT .EQU 2 ; CH: NUMBER OF BOARDS TO DETECT (1-2) +CH0BASE .EQU $3E ; CH 0: BASE I/O ADDRESS +CH0USBENABLE .EQU TRUE ; CH 0: ENABLE USB DISK +CH0SDENABLE .EQU FALSE ; CH 0: ENABLE SD DISK +CH1BASE .EQU $3C ; CH 1: BASE I/O ADDRESS +CH1USBENABLE .EQU TRUE ; CH 1: ENABLE USB DISK +CH1SDENABLE .EQU FALSE ; CH 1: ENABLE SD DISK +; +PRPENABLE .EQU FALSE ; PRP: ENABLE ECB PROPELLER IO BOARD DRIVER (PRP.ASM) +PRPSDENABLE .EQU TRUE ; PRP: ENABLE PROPIO DRIVER SD CARD SUPPORT +PRPSDTRACE .EQU 1 ; PRP: SD CARD TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +PRPCONENABLE .EQU TRUE ; PRP: ENABLE PROPIO DRIVER VIDEO/KBD SUPPORT +; +PPPENABLE .EQU FALSE ; PPP: ENABLE ZETA PARALLEL PORT PROPELLER BOARD DRIVER (PPP.ASM) +; +ESPENABLE .EQU FALSE ; ESP: ENABLE ESP32 IO BOARD DRIVER (ESP.ASM) +; +HDSKENABLE .EQU FALSE ; HDSK: ENABLE SIMH HDSK DISK DRIVER (HDSK.ASM) +; +PIOENABLE .EQU FALSE ; PIO: ENABLE ZILOG PIO DRIVER (PIO.ASM) +PIOCNT .EQU 2 ; PIO: NUMBER OF CHIPS TO DETECT (1-2), 2 CHANNELS PER CHIP +PIO0BASE .EQU $B8 ; PIO 0: REGISTERS BASE ADR +PIO1BASE .EQU $BC ; PIO 1: REGISTERS BASE ADR +; +LPTENABLE .EQU FALSE ; LPT: ENABLE CENTRONICS PRINTER DRIVER (LPT.ASM) +LPTMODE .EQU LPTMODE_MG014 ; LPT: DRIVER MODE: LPTMODE_[NONE|SPP|MG014] +LPTCNT .EQU 1 ; LPT: NUMBER OF CHIPS TO DETECT (1-2) +LPTTRACE .EQU 1 ; LPT: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +LPT0BASE .EQU $0C ; LPT 0: REGISTERS BASE ADR +LPT1BASE .EQU $00 ; LPT 1: REGISTERS BASE ADR +; +PPAENABLE .EQU FALSE ; PPA: ENABLE PPA DISK DRIVER (PPA.ASM) +PPACNT .EQU 1 ; PPA: NUMBER OF PPA DEVICES (1-2) +PPATRACE .EQU 1 ; PPA: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +PPAMODE .EQU PPAMODE_MG014 ; PPA: DRIVER MODE: PPAMODE_[NONE|SPP|MG014] +PPA0BASE .EQU LPT0BASE ; PPA 0: BASE I/O ADDRESS OF PPI FOR PPA +PPA1BASE .EQU LPT1BASE ; PPA 1: BASE I/O ADDRESS OF PPI FOR PPA +; +IMMENABLE .EQU FALSE ; IMM: ENABLE IMM DISK DRIVER (IMM.ASM) +IMMCNT .EQU 1 ; IMM: NUMBER OF IMM DEVICES (1-2) +IMMTRACE .EQU 1 ; IMM: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +IMMMODE .EQU IMMMODE_MG014 ; IMM: DRIVER MODE: IMMMODE_[NONE|SPP|MG014] +IMM0BASE .EQU LPT0BASE ; IMM 0: BASE I/O ADDRESS OF PPI FOR IMM +IMM1BASE .EQU LPT1BASE ; IMM 1: BASE I/O ADDRESS OF PPI FOR IMM +; +SYQENABLE .EQU FALSE ; SYQ: ENABLE IMM DISK DRIVER (SYQ.ASM) +SYQCNT .EQU 1 ; SYQ: NUMBER OF SYQ DEVICES (1-2) +SYQTRACE .EQU 1 ; SYQ: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +SYQMODE .EQU IMMMODE_MG014 ; SYQ: DRIVER MODE: SYQMODE_[NONE|SPP|MG014] +SYQ0BASE .EQU LPT0BASE ; SYQ 0: BASE I/O ADDRESS OF PPI FOR SYQ +SYQ1BASE .EQU LPT1BASE ; SYQ 1: BASE I/O ADDRESS OF PPI FOR SYQ +; +PIO_4P .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB 4P BOARD +PIO_ZP .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB ZILOG PERIPHERALS BOARD (PIO.ASM) +PIO_SBC .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR 8255 CHIP +; +UFENABLE .EQU FALSE ; UF: ENABLE ECB USB FIFO DRIVER (UF.ASM) +; +SN76489ENABLE .EQU FALSE ; SN: ENABLE SN76489 SOUND DRIVER +AUDIOTRACE .EQU FALSE ; ENABLE TRACING TO CONSOLE OF SOUND DRIVER +SN7CLK .EQU 3579545 ; SN: PSG CLOCK FREQ, ASSUME MSX STD +SNMODE .EQU SNMODE_RC ; SN: DRIVER MODE: SNMODE_[NONE|RC|VGM] +; +AY38910ENABLE .EQU FALSE ; AY: ENABLE AY-3-8910 / YM2149 SOUND DRIVER +AY_CLK .EQU 1789772 ; AY: PSG CLOCK FREQ, ASSUME MSX STD +AYMODE .EQU AYMODE_RCZ80 ; AY: DRIVER MODE: AYMODE_[SCG|N8|RCZ80|RCZ180|MSX|LINC|MBC] +; +SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM) +; +DMAENABLE .EQU FALSE ; DMA: ENABLE DMA DRIVER (DMA.ASM) +DMABASE .EQU $E0 ; DMA: DMA BASE ADDRESS +DMAMODE .EQU DMAMODE_RC ; DMA: DMA MODE (NONE|ECB|Z180|Z280|RC|MBC|DUO) +; +YM2612ENABLE .EQU FALSE ; YM2612: ENABLE YM2612 DRIVER +VGMBASE .EQU $C0 ; YM2612: BASE ADDRESS FOR VGM BOARD (YM2612/SN76489s/CTC) diff --git a/Source/HBIOS/cfg_n8.asm b/Source/HBIOS/cfg_n8.asm index 3d98e44d..4cac526e 100644 --- a/Source/HBIOS/cfg_n8.asm +++ b/Source/HBIOS/cfg_n8.asm @@ -1,6 +1,6 @@ ; ;================================================================================================== -; ROMWBW 2.X CONFIGURATION FOR N8 +; ROMWBW 3.X CONFIGURATION FOR N8 ;================================================================================================== ; ; THIS FILE CONTAINS THE FULL SET OF DEFAULT CONFIGURATION SETTINGS FOR THE PLATFORM @@ -15,7 +15,7 @@ ; #INCLUDE "hbios.inc" ; -PLATFORM .EQU PLT_N8 ; PLT_[SBC|ZETA|ZETA2|N8|MK4|UNA|RCZ80|RCZ180|EZZ80|SCZ180|DYNO|RCZ280|MBC|RPH] +PLATFORM .EQU PLT_N8 ; PLT_[SBC|ZETA|ZETA2|N8|MK4|UNA|RCZ80|RCZ180|EZZ80|SCZ180|DYNO|RCZ280|MBC|RPH|Z80RETRO|S100|DUO|HEATH|MON] CPUFAM .EQU CPU_Z180 ; CPU FAMILY: CPU_[Z80|Z180|Z280] BIOS .EQU BIOS_WBW ; HARDWARE BIOS: BIOS_[WBW|UNA] BATCOND .EQU FALSE ; ENABLE LOW BATTERY WARNING MESSAGE @@ -30,14 +30,12 @@ CPUSPDCAP .EQU SPD_FIXED ; CPU SPEED CHANGE CAPABILITY SPD_FIXED|SPD_HILO CPUSPDDEF .EQU SPD_HIGH ; CPU SPEED DEFAULT SPD_UNSUP|SPD_HIGH|SPD_LOW CPUOSC .EQU 18432000 ; CPU OSC FREQ IN MHZ INTMODE .EQU 2 ; INTERRUPTS: 0=NONE, 1=MODE 1, 2=MODE 2, 3=MODE 3 (Z280) -DEFSERCFG .EQU SER_38400_8N1 ; DEFAULT SERIAL LINE CONFIG (SEE STD.ASM) +DEFSERCFG .EQU SER_38400_8N1 | SER_RTS ; DEFAULT SERIAL LINE CONFIG (SEE STD.ASM) ; RAMSIZE .EQU 512 ; SIZE OF RAM IN KB (MUST MATCH YOUR HARDWARE!!!) ROMSIZE .EQU 512 ; SIZE OF ROM IN KB (MUST MATCH YOUR HARDWARE!!!) -ROMSIZE_CHK .EQU 0 ; ROMSIZE VALUE VERIFICATION (0=DISABLED) -MEMMGR .EQU MM_N8 ; MEMORY MANAGER: MM_[SBC|Z2|N8|Z180|Z280|MBC|RPH] +MEMMGR .EQU MM_N8 ; MEMORY MANAGER: MM_[SBC|Z2|N8|Z180|Z280|MBC|RPH|MON] RAMBIAS .EQU 0 ; OFFSET OF START OF RAM IN PHYSICAL ADDRESS SPACE -RAMLOC .EQU 0 ; START OF RAM AS POWER OF 2 (2^N) IN PHYSICAL ADDRESS SPACE ; Z180_BASE .EQU $40 ; Z180: I/O BASE ADDRESS FOR INTERNAL REGISTERS Z180_CLKDIV .EQU 1 ; Z180: CHK DIV: 0=OSC/2, 1=OSC, 2=OSC*2 @@ -62,15 +60,21 @@ CTCDEBUG .EQU FALSE ; ENABLE CTC DRIVER DEBUG OUTPUT CTCBASE .EQU $B0 ; CTC BASE I/O ADDRESS CTCTIMER .EQU FALSE ; ENABLE CTC PERIODIC TIMER ; +PCFENABLE .EQU FALSE ; ENABLE PCF8584 I2C CONTROLLER +PCFBASE .EQU $F0 ; PCF8584 BASE I/O ADDRESS +; EIPCENABLE .EQU FALSE ; EIPC: ENABLE Z80 EIPC (Z84C15) INITIALIZATION ; SKZENABLE .EQU FALSE ; ENABLE SERGEY'S Z80-512K FEATURES ; WDOGMODE .EQU WDOG_NONE ; WATCHDOG MODE: WDOG_[NONE|EZZ80|SKZ] ; -DIAGENABLE .EQU FALSE ; ENABLES OUTPUT TO 8 BIT LED DIAGNOSTIC PORT -DIAGPORT .EQU $00 ; DIAGNOSTIC PORT ADDRESS -DIAGDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON DIAGNOSTIC LEDS +FPLED_ENABLE .EQU FALSE ; FP: ENABLES FRONT PANEL LEDS +FPLED_IO .EQU $00 ; FP: PORT ADDRESS FOR FP LEDS +FPLED_DSKACT .EQU TRUE ; FP: ENABLES DISK I/O ACTIVITY ON FP LEDS +FPSW_ENABLE .EQU FALSE ; FP: ENABLES FRONT PANEL SWITCHES +FPSW_IO .EQU $00 ; FP: PORT ADDRESS FOR FP SWITCHES +; DIAGLVL .EQU DL_CRITICAL ; ERROR LEVEL REPORTING ; LEDENABLE .EQU FALSE ; ENABLES STATUS LED @@ -78,12 +82,17 @@ LEDMODE .EQU LEDMODE_RTC ; LEDMODE_[STD|RTC] LEDPORT .EQU RTCIO ; STATUS LED PORT ADDRESS LEDDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON STATUS LED ; -DSKYENABLE .EQU FALSE ; ENABLES DSKY -DSKYMODE .EQU DSKYMODE_V1 ; DSKY VERSION: DSKYMODE_[V1|NG] -DSKYPPIBASE .EQU N8_PPI0 ; BASE I/O ADDRESS OF DSKY PPI -DSKYOSC .EQU 3000000 ; OSCILLATOR FREQ FOR DSKYNG (IN HZ) +DSKYENABLE .EQU FALSE ; ENABLES DSKY FUNCTIONALITY +DSKYDSKACT .EQU TRUE ; ENABLES DISK ACTIVITY ON DSKY DISPLAY +ICMENABLE .EQU FALSE ; ENABLES ORIGINAL DSKY ICM DRIVER (7218) +ICMPPIBASE .EQU N8_PPI0 ; BASE I/O ADDRESS OF ICM PPI +PKDENABLE .EQU FALSE ; ENABLES DSKY NG PKD DRIVER (8259) +PKDPPIBASE .EQU N8_PPI0 ; BASE I/O ADDRESS OF PKD PPI +PKDOSC .EQU 3000000 ; OSCILLATOR FREQ FOR PKD (IN HZ) +H8PENABLE .EQU FALSE ; ENABLES HEATH H8 FRONT PANEL ; BOOTCON .EQU 0 ; BOOT CONSOLE DEVICE +SECCON .EQU $FF ; SECONDARY CONSOLE DEVICE CRTACT .EQU FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP VDAEMU .EQU EMUTYP_ANSI ; VDA EMULATION: EMUTYP_[TTY|ANSI] VDAEMU_SERKBD .EQU $FF ; VDA EMULATION: SERIAL KBD UNIT #, OR $FF FOR HW KBD @@ -122,8 +131,9 @@ UARTOSC .EQU 1843200 ; UART: OSC FREQUENCY IN MHZ UARTINTS .EQU FALSE ; UART: INCLUDE INTERRUPT SUPPORT UNDER IM1/2/3 UARTCFG .EQU DEFSERCFG ; UART: LINE CONFIG FOR UART PORTS UARTCASSPD .EQU SER_300_8N1 ; UART: ECB CASSETTE UART DEFAULT SPEED -UARTSBC .EQU FALSE ; UART: AUTO-DETECT SBC/ZETA ONBOARD UART +UARTSBC .EQU FALSE ; UART: AUTO-DETECT SBC/ZETA/DUO ONBOARD UART UARTSBCFORCE .EQU FALSE ; UART: FORCE DETECTION OF SBC UART (FOR SIMH) +UARTAUX .EQU FALSE ; UART: AUTO-DETECT AUX UART UARTCAS .EQU TRUE ; UART: AUTO-DETECT ECB CASSETTE UART UARTMFP .EQU FALSE ; UART: AUTO-DETECT MF/PIC UART UART4 .EQU TRUE ; UART: AUTO-DETECT 4UART UART @@ -145,7 +155,7 @@ SIOENABLE .EQU FALSE ; SIO: ENABLE ZILOG SIO SERIAL DRIVER (SIO.ASM) SIODEBUG .EQU FALSE ; SIO: ENABLE DEBUG OUTPUT SIOBOOT .EQU 0 ; SIO: REBOOT ON RCV CHAR (0=DISABLED) SIOCNT .EQU 1 ; SIO: NUMBER OF CHIPS TO DETECT (1-2), 2 CHANNELS PER CHIP -SIO0MODE .EQU SIOMODE_ZP ; SIO 0: CHIP TYPE: SIOMODE_[STD|RC|SMB|ZP] +SIO0MODE .EQU SIOMODE_ZP ; SIO 0: CHIP TYPE: SIOMODE_[STD|RC|SMB|ZP|Z80R] SIO0BASE .EQU $B0 ; SIO 0: REGISTERS BASE ADR SIO0ACLK .EQU (4915200/8) ; SIO 0A: OSC FREQ IN HZ, ZP=2457600/4915200, RC/SMB=7372800 SIO0ACFG .EQU DEFSERCFG ; SIO 0A: SERIAL LINE CONFIG @@ -167,6 +177,8 @@ TMSMODE .EQU TMSMODE_N8 ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|MSX9958|MSX TMSTIMENABLE .EQU FALSE ; TMS: ENABLE TIMER INTERRUPTS (REQUIRES IM1) VGAENABLE .EQU FALSE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM) VGASIZ .EQU V80X25 ; VGA: DISPLAY FORMAT [V80X25|V80X30|V80X43] +VRCENABLE .EQU FALSE ; VRC: ENABLE VGARC VIDEO/KBD DRIVER (VRC.ASM) +SCONENABLE .EQU FALSE ; SCON: ENABLE S100 CONSOLE DRIVER (SCON.ASM) ; MDENABLE .EQU TRUE ; MD: ENABLE MEMORY (ROM/RAM) DISK DRIVER (MD.ASM) MDROM .EQU TRUE ; MD: ENABLE ROM DISK @@ -178,9 +190,9 @@ FDENABLE .EQU TRUE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM) FDMODE .EQU FDMODE_N8 ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPFDC|MBC] FDCNT .EQU 2 ; FD: NUMBER OF FLOPPY DRIVES ON THE INTERFACE (1-2) FDTRACE .EQU 1 ; FD: TRACE LEVEL (0=NO,1=FATAL,2=ERRORS,3=ALL) -FDMEDIA .EQU FDM144 ; FD: DEFAULT MEDIA FORMAT FDM[720|144|360|120|111] -FDMEDIAALT .EQU FDM720 ; FD: ALTERNATE MEDIA FORMAT FDM[720|144|360|120|111] FDMAUTO .EQU TRUE ; FD: AUTO SELECT DEFAULT/ALTERNATE MEDIA FORMATS +FD0TYPE .EQU FDT_3HD ; FD 0: DRIVE TYPE: FDT_[3DD|3HD|5DD|5HD|8] +FD1TYPE .EQU FDT_3HD ; FD 1: DRIVE TYPE: FDT_[3DD|3HD|5DD|5HD|8] ; RFENABLE .EQU FALSE ; RF: ENABLE RAM FLOPPY DRIVER RFCNT .EQU 1 ; RF: NUMBER OF RAM FLOPPY UNITS (1-4) @@ -221,11 +233,14 @@ PPIDE2A8BIT .EQU FALSE ; PPIDE 2A (MASTER): 8 BIT XFER PPIDE2B8BIT .EQU FALSE ; PPIDE 0B (SLAVE): 8 BIT XFER ; SDENABLE .EQU TRUE ; SD: ENABLE SD CARD DISK DRIVER (SD.ASM) -SDMODE .EQU SDMODE_CSIO ; SD: DRIVER MODE: SDMODE_[JUHA|N8|CSIO|PPI|UART|DSD|MK4|SC|MT] +SDMODE .EQU SDMODE_CSIO ; SD: DRIVER MODE: SDMODE_[JUHA|N8|CSIO|PPI|UART|DSD|MK4|SC|MT|PIO|Z80R|USR] SDPPIBASE .EQU N8_PPI0 ; SD: BASE I/O ADDRESS OF PPI FOR PPI MODDE SDCNT .EQU 1 ; SD: NUMBER OF SD CARD DEVICES (1-2), FOR DSD/SC/MT ONLY SDTRACE .EQU 1 ; SD: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) SDCSIOFAST .EQU FALSE ; SD: ENABLE TABLE-DRIVEN BIT INVERTER IN CSIO MODE +SDMTSWAP .EQU FALSE ; SD: SWAP THE LOGICAL ORDER OF THE SPI PORTS OF THE MT011 +; +CHENABLE .EQU FALSE ; CH: ENABLE CH375/376 USB SUPPORT ; PRPENABLE .EQU FALSE ; PRP: ENABLE ECB PROPELLER IO BOARD DRIVER (PRP.ASM) PRPSDENABLE .EQU TRUE ; PRP: ENABLE PROPIO DRIVER SD CARD SUPPORT @@ -234,6 +249,8 @@ PRPCONENABLE .EQU TRUE ; PRP: ENABLE PROPIO DRIVER VIDEO/KBD SUPPORT ; PPPENABLE .EQU FALSE ; PPP: ENABLE ZETA PARALLEL PORT PROPELLER BOARD DRIVER (PPP.ASM) ; +ESPENABLE .EQU FALSE ; ESP: ENABLE ESP32 IO BOARD DRIVER (ESP.ASM) +; HDSKENABLE .EQU FALSE ; HDSK: ENABLE SIMH HDSK DISK DRIVER (HDSK.ASM) ; PIOENABLE .EQU FALSE ; PIO: ENABLE ZILOG PIO DRIVER (PIO.ASM) @@ -243,6 +260,12 @@ PIO1BASE .EQU $BC ; PIO 1: REGISTERS BASE ADR ; LPTENABLE .EQU FALSE ; LPT: ENABLE CENTRONICS PRINTER DRIVER (LPT.ASM) ; +PPAENABLE .EQU FALSE ; PPA: ENABLE PPA DISK DRIVER (PPA.ASM) +; +IMMENABLE .EQU FALSE ; IMM: ENABLE IMM DISK DRIVER (IMM.ASM) +; +SYQENABLE .EQU FALSE ; SYQ: ENABLE IMM DISK DRIVER (SYQ.ASM) +; PIO_4P .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB 4P BOARD PIO4BASE .EQU $90 ; PIO: PIO REGISTERS BASE ADR FOR ECB 4P BOARD PIO_ZP .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB ZILOG PERIPHERALS BOARD (PIO.ASM) @@ -266,7 +289,7 @@ SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM) ; DMAENABLE .EQU FALSE ; DMA: ENABLE DMA DRIVER (DMA.ASM) DMABASE .EQU $E0 ; DMA: DMA BASE ADDRESS -DMAMODE .EQU DMAMODE_Z180 ; DMA: DMA MODE (NONE|ECB|Z180|Z280|RC|MBC) +DMAMODE .EQU DMAMODE_Z180 ; DMA: DMA MODE (NONE|ECB|Z180|Z280|RC|MBC|DUO) ; -YM2612ENABLE .EQU FALSE ; YM2612: ENABLE YM2612 DRIVER (MUTE STUB) -VGMBASE .EQU $C0 ; YM2612: BASE ADDRESS FOR VGM BOARD (YM2612/SN76469s/CTC) +YM2612ENABLE .EQU FALSE ; YM2612: ENABLE YM2612 DRIVER +VGMBASE .EQU $C0 ; YM2612: BASE ADDRESS FOR VGM BOARD (YM2612/SN76489s/CTC) diff --git a/Source/HBIOS/cfg_rcz180.asm b/Source/HBIOS/cfg_rcz180.asm index df1f9839..5263d4a9 100644 --- a/Source/HBIOS/cfg_rcz180.asm +++ b/Source/HBIOS/cfg_rcz180.asm @@ -1,6 +1,6 @@ ; ;================================================================================================== -; ROMWBW 2.X CONFIGURATION DEFAULTS FOR RCBUS Z180 CPU +; ROMWBW 3.X CONFIGURATION DEFAULTS FOR RCBUS Z180 CPU ;================================================================================================== ; ; THIS FILE CONTAINS THE FULL SET OF DEFAULT CONFIGURATION SETTINGS FOR THE PLATFORM @@ -15,7 +15,7 @@ ; #INCLUDE "hbios.inc" ; -PLATFORM .EQU PLT_RCZ180 ; PLT_[SBC|ZETA|ZETA2|N8|MK4|UNA|RCZ80|RCZ180|EZZ80|SCZ180|DYNO|RCZ280|MBC|RPH] +PLATFORM .EQU PLT_RCZ180 ; PLT_[SBC|ZETA|ZETA2|N8|MK4|UNA|RCZ80|RCZ180|EZZ80|SCZ180|DYNO|RCZ280|MBC|RPH|Z80RETRO|S100|DUO|HEATH|MON] CPUFAM .EQU CPU_Z180 ; CPU FAMILY: CPU_[Z80|Z180|Z280] BIOS .EQU BIOS_WBW ; HARDWARE BIOS: BIOS_[WBW|UNA] BATCOND .EQU FALSE ; ENABLE LOW BATTERY WARNING MESSAGE @@ -30,14 +30,12 @@ CPUSPDCAP .EQU SPD_FIXED ; CPU SPEED CHANGE CAPABILITY SPD_FIXED|SPD_HILO CPUSPDDEF .EQU SPD_HIGH ; CPU SPEED DEFAULT SPD_UNSUP|SPD_HIGH|SPD_LOW CPUOSC .EQU 18432000 ; CPU OSC FREQ IN MHZ INTMODE .EQU 2 ; INTERRUPTS: 0=NONE, 1=MODE 1, 2=MODE 2, 3=MODE 3 (Z280) -DEFSERCFG .EQU SER_115200_8N1 ; DEFAULT SERIAL LINE CONFIG (SEE STD.ASM) +DEFSERCFG .EQU SER_115200_8N1 | SER_RTS ; DEFAULT SERIAL LINE CONFIG (SEE STD.ASM) ; RAMSIZE .EQU 512 ; SIZE OF RAM IN KB (MUST MATCH YOUR HARDWARE!!!) ROMSIZE .EQU 512 ; SIZE OF ROM IN KB (MUST MATCH YOUR HARDWARE!!!) -ROMSIZE_CHK .EQU 0 ; ROMSIZE VALUE VERIFICATION (0=DISABLED) -MEMMGR .EQU MM_Z180 ; MEMORY MANAGER: MM_[SBC|Z2|N8|Z180|Z280|MBC|RPH] -RAMLOC .EQU 19 ; START OF RAM AS POWER OF 2 (2^N) IN PHYSICAL ADDRESS SPACE -RAMBIAS .EQU (1 << (RAMLOC - 10)) ; OFFSET OF START OF RAM IN PHYSICAL ADDRESS SPACE +MEMMGR .EQU MM_Z180 ; MEMORY MANAGER: MM_[SBC|Z2|N8|Z180|Z280|MBC|RPH|MON] +RAMBIAS .EQU ROMSIZE ; OFFSET OF START OF RAM IN PHYSICAL ADDRESS SPACE MPGSEL_0 .EQU $78 ; Z2 MEM MGR BANK 0 PAGE SELECT REG (WRITE ONLY) MPGSEL_1 .EQU $79 ; Z2 MEM MGR BANK 1 PAGE SELECT REG (WRITE ONLY) MPGSEL_2 .EQU $7A ; Z2 MEM MGR BANK 2 PAGE SELECT REG (WRITE ONLY) @@ -60,15 +58,27 @@ CTCDEBUG .EQU FALSE ; ENABLE CTC DRIVER DEBUG OUTPUT CTCBASE .EQU $88 ; CTC BASE I/O ADDRESS CTCTIMER .EQU FALSE ; ENABLE CTC PERIODIC TIMER ; +PCFENABLE .EQU FALSE ; ENABLE PCF8584 I2C CONTROLLER +PCFBASE .EQU $F0 ; PCF8584 BASE I/O ADDRESS +; EIPCENABLE .EQU FALSE ; EIPC: ENABLE Z80 EIPC (Z84C15) INITIALIZATION ; SKZENABLE .EQU FALSE ; ENABLE SERGEY'S Z80-512K FEATURES ; WDOGMODE .EQU WDOG_NONE ; WATCHDOG MODE: WDOG_[NONE|EZZ80|SKZ] ; +FPENABLE .EQU FALSE ; ENABLES FRONT PANEL SWITCHES +FPBASE .EQU $00 ; FRONT PANEL I/O PORT BASE ADDRESS DIAGENABLE .EQU TRUE ; ENABLES OUTPUT TO 8 BIT LED DIAGNOSTIC PORT DIAGPORT .EQU $00 ; DIAGNOSTIC PORT ADDRESS DIAGDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON DIAGNOSTIC LEDS +; +FPLED_ENABLE .EQU FALSE ; FP: ENABLES FRONT PANEL LEDS +FPLED_IO .EQU $00 ; FP: PORT ADDRESS FOR FP LEDS +FPLED_DSKACT .EQU TRUE ; FP: ENABLES DISK I/O ACTIVITY ON FP LEDS +FPSW_ENABLE .EQU TRUE ; FP: ENABLES FRONT PANEL SWITCHES +FPSW_IO .EQU $00 ; FP: PORT ADDRESS FOR FP SWITCHES +; DIAGLVL .EQU DL_CRITICAL ; ERROR LEVEL REPORTING ; LEDENABLE .EQU FALSE ; ENABLES STATUS LED (SINGLE LED) @@ -76,9 +86,17 @@ LEDMODE .EQU LEDMODE_STD ; LEDMODE_[STD|RTC] LEDPORT .EQU $0E ; STATUS LED PORT ADDRESS LEDDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON STATUS LED ; -DSKYENABLE .EQU FALSE ; ENABLES DSKY (DO NOT COMBINE WITH PPIDE) +DSKYENABLE .EQU FALSE ; ENABLES DSKY FUNCTIONALITY +DSKYDSKACT .EQU TRUE ; ENABLES DISK ACTIVITY ON DSKY DISPLAY +ICMENABLE .EQU FALSE ; ENABLES ORIGINAL DSKY ICM DRIVER (7218) +ICMPPIBASE .EQU $60 ; BASE I/O ADDRESS OF ICM PPI +PKDENABLE .EQU FALSE ; ENABLES DSKY NG PKD DRIVER (8259) +PKDPPIBASE .EQU $60 ; BASE I/O ADDRESS OF PKD PPI +PKDOSC .EQU 3000000 ; OSCILLATOR FREQ FOR PKD (IN HZ) +H8PENABLE .EQU FALSE ; ENABLES HEATH H8 FRONT PANEL ; BOOTCON .EQU 0 ; BOOT CONSOLE DEVICE +SECCON .EQU $FF ; SECONDARY CONSOLE DEVICE CRTACT .EQU FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP VDAEMU .EQU EMUTYP_ANSI ; VDA EMULATION: EMUTYP_[TTY|ANSI] VDAEMU_SERKBD .EQU $FF ; VDA EMULATION: SERIAL KBD UNIT #, OR $FF FOR HW KBD @@ -123,8 +141,9 @@ UARTENABLE .EQU TRUE ; UART: ENABLE 8250/16550-LIKE SERIAL DRIVER (UART.ASM) UARTOSC .EQU 1843200 ; UART: OSC FREQUENCY IN MHZ UARTINTS .EQU FALSE ; UART: INCLUDE INTERRUPT SUPPORT UNDER IM1/2/3 UARTCFG .EQU DEFSERCFG | SER_RTS ; UART: LINE CONFIG FOR UART PORTS -UARTSBC .EQU FALSE ; UART: AUTO-DETECT SBC/ZETA ONBOARD UART +UARTSBC .EQU FALSE ; UART: AUTO-DETECT SBC/ZETA/DUO ONBOARD UART UARTSBCFORCE .EQU FALSE ; UART: FORCE DETECTION OF SBC UART (FOR SIMH) +UARTAUX .EQU FALSE ; UART: AUTO-DETECT AUX UART UARTCAS .EQU FALSE ; UART: AUTO-DETECT ECB CASSETTE UART UARTMFP .EQU FALSE ; UART: AUTO-DETECT MF/PIC UART UART4 .EQU FALSE ; UART: AUTO-DETECT 4UART UART @@ -146,7 +165,7 @@ SIOENABLE .EQU TRUE ; SIO: ENABLE ZILOG SIO SERIAL DRIVER (SIO.ASM) SIODEBUG .EQU FALSE ; SIO: ENABLE DEBUG OUTPUT SIOBOOT .EQU 0 ; SIO: REBOOT ON RCV CHAR (0=DISABLED) SIOCNT .EQU 2 ; SIO: NUMBER OF CHIPS TO DETECT (1-2), 2 CHANNELS PER CHIP -SIO0MODE .EQU SIOMODE_RC ; SIO 0: CHIP TYPE: SIOMODE_[STD|RC|SMB|ZP] +SIO0MODE .EQU SIOMODE_RC ; SIO 0: CHIP TYPE: SIOMODE_[STD|RC|SMB|ZP|Z80R] SIO0BASE .EQU $80 ; SIO 0: REGISTERS BASE ADR SIO0ACLK .EQU 7372800 ; SIO 0A: OSC FREQ IN HZ, ZP=2457600/4915200, RC/SMB=7372800 SIO0ACFG .EQU SER_115200_8N1 ; SIO 0A: SERIAL LINE CONFIG @@ -154,7 +173,7 @@ SIO0ACTCC .EQU -1 ; SIO 0A: CTC CHANNEL 0=A, 1=B, 2=C, 3=D, -1 FOR NONE SIO0BCLK .EQU 7372800 ; SIO 0B: OSC FREQ IN HZ, ZP=2457600/4915200, RC/SMB=7372800 SIO0BCFG .EQU SER_115200_8N1 ; SIO 0B: SERIAL LINE CONFIG SIO0BCTCC .EQU -1 ; SIO 0B: CTC CHANNEL 0=A, 1=B, 2=C, 3=D, -1 FOR NONE -SIO1MODE .EQU SIOMODE_RC ; SIO 1: CHIP TYPE: SIOMODE_[STD|RC|SMB|ZP] +SIO1MODE .EQU SIOMODE_RC ; SIO 1: CHIP TYPE: SIOMODE_[STD|RC|SMB|ZP|Z80R] SIO1BASE .EQU $84 ; SIO 1: REGISTERS BASE ADR SIO1ACLK .EQU 7372800 ; SIO 1A: OSC FREQ IN HZ, ZP=2457600/4915200, RC/SMB=7372800 SIO1ACFG .EQU SER_115200_8N1 ; SIO 1A: SERIAL LINE CONFIG @@ -172,6 +191,8 @@ TMSENABLE .EQU FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM) TMSMODE .EQU TMSMODE_MSX ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|MSX9958|MSXKBD|COLECO] TMSTIMENABLE .EQU FALSE ; TMS: ENABLE TIMER INTERRUPTS (REQUIRES IM1) VGAENABLE .EQU FALSE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM) +VRCENABLE .EQU FALSE ; VRC: ENABLE VGARC VIDEO/KBD DRIVER (VRC.ASM) +SCONENABLE .EQU FALSE ; SCON: ENABLE S100 CONSOLE DRIVER (SCON.ASM) ; MDENABLE .EQU TRUE ; MD: ENABLE MEMORY (ROM/RAM) DISK DRIVER (MD.ASM) MDROM .EQU TRUE ; MD: ENABLE ROM DISK @@ -183,9 +204,9 @@ FDENABLE .EQU FALSE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM) FDMODE .EQU FDMODE_RCWDC ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPFDC|MBC] FDCNT .EQU 2 ; FD: NUMBER OF FLOPPY DRIVES ON THE INTERFACE (1-2) FDTRACE .EQU 1 ; FD: TRACE LEVEL (0=NO,1=FATAL,2=ERRORS,3=ALL) -FDMEDIA .EQU FDM144 ; FD: DEFAULT MEDIA FORMAT FDM[720|144|360|120|111] -FDMEDIAALT .EQU FDM720 ; FD: ALTERNATE MEDIA FORMAT FDM[720|144|360|120|111] FDMAUTO .EQU TRUE ; FD: AUTO SELECT DEFAULT/ALTERNATE MEDIA FORMATS +FD0TYPE .EQU FDT_3HD ; FD 0: DRIVE TYPE: FDT_[3DD|3HD|5DD|5HD|8] +FD1TYPE .EQU FDT_3HD ; FD 1: DRIVE TYPE: FDT_[3DD|3HD|5DD|5HD|8] ; RFENABLE .EQU FALSE ; RF: ENABLE RAM FLOPPY DRIVER ; @@ -225,13 +246,25 @@ PPIDE2A8BIT .EQU FALSE ; PPIDE 2A (MASTER): 8 BIT XFER PPIDE2B8BIT .EQU FALSE ; PPIDE 0B (SLAVE): 8 BIT XFER ; SDENABLE .EQU FALSE ; SD: ENABLE SD CARD DISK DRIVER (SD.ASM) -SDMODE .EQU SDMODE_MT ; SD: DRIVER MODE: SDMODE_[JUHA|N8|CSIO|PPI|UART|DSD|MK4|SC|MT|USR] +SDMODE .EQU SDMODE_MT ; SD: DRIVER MODE: SDMODE_[JUHA|N8|CSIO|PPI|UART|DSD|MK4|SC|MT|PIO|Z80R|USR] SDPPIBASE .EQU $60 ; SD: BASE I/O ADDRESS OF PPI FOR PPI MODDE SDCNT .EQU 2 ; SD: NUMBER OF SD CARD DEVICES (1-2), FOR DSD/SC/MT ONLY SDTRACE .EQU 1 ; SD: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) SDCSIOFAST .EQU FALSE ; SD: ENABLE TABLE-DRIVEN BIT INVERTER IN CSIO MODE SDMTSWAP .EQU FALSE ; SD: SWAP THE LOGICAL ORDER OF THE SPI PORTS OF THE MT011 ; +CHENABLE .EQU TRUE ; CH: ENABLE CH375/376 USB SUPPORT +CHTRACE .EQU 1 ; CH: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +CHUSBTRACE .EQU 1 ; CHUSB: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +CHSDTRACE .EQU 1 ; CHSD: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +CHCNT .EQU 2 ; CH: NUMBER OF BOARDS TO DETECT (1-2) +CH0BASE .EQU $3E ; CH 0: BASE I/O ADDRESS +CH0USBENABLE .EQU TRUE ; CH 0: ENABLE USB DISK +CH0SDENABLE .EQU FALSE ; CH 0: ENABLE SD DISK +CH1BASE .EQU $3C ; CH 1: BASE I/O ADDRESS +CH1USBENABLE .EQU TRUE ; CH 1: ENABLE USB DISK +CH1SDENABLE .EQU FALSE ; CH 1: ENABLE SD DISK +; PRPENABLE .EQU FALSE ; PRP: ENABLE ECB PROPELLER IO BOARD DRIVER (PRP.ASM) PRPSDENABLE .EQU TRUE ; PRP: ENABLE PROPIO DRIVER SD CARD SUPPORT PRPSDTRACE .EQU 1 ; PRP: SD CARD TRACE LEVEL (0=NO,1=ERRORS,2=ALL) @@ -239,6 +272,8 @@ PRPCONENABLE .EQU TRUE ; PRP: ENABLE PROPIO DRIVER VIDEO/KBD SUPPORT ; PPPENABLE .EQU FALSE ; PPP: ENABLE ZETA PARALLEL PORT PROPELLER BOARD DRIVER (PPP.ASM) ; +ESPENABLE .EQU FALSE ; ESP: ENABLE ESP32 IO BOARD DRIVER (ESP.ASM) +; HDSKENABLE .EQU FALSE ; HDSK: ENABLE SIMH HDSK DISK DRIVER (HDSK.ASM) ; PIOENABLE .EQU FALSE ; PIO: ENABLE ZILOG PIO DRIVER (PIO.ASM) @@ -247,6 +282,32 @@ PIO0BASE .EQU $B8 ; PIO 0: REGISTERS BASE ADR PIO1BASE .EQU $BC ; PIO 1: REGISTERS BASE ADR ; LPTENABLE .EQU FALSE ; LPT: ENABLE CENTRONICS PRINTER DRIVER (LPT.ASM) +LPTMODE .EQU LPTMODE_MG014 ; LPT: DRIVER MODE: LPTMODE_[NONE|SPP|MG014] +LPTCNT .EQU 1 ; LPT: NUMBER OF CHIPS TO DETECT (1-2) +LPTTRACE .EQU 1 ; LPT: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +LPT0BASE .EQU $0C ; LPT 0: REGISTERS BASE ADR +LPT1BASE .EQU $00 ; LPT 1: REGISTERS BASE ADR +; +PPAENABLE .EQU FALSE ; PPA: ENABLE PPA DISK DRIVER (PPA.ASM) +PPACNT .EQU 1 ; PPA: NUMBER OF PPA DEVICES (1-2) +PPATRACE .EQU 1 ; PPA: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +PPAMODE .EQU PPAMODE_MG014 ; PPA: DRIVER MODE: PPAMODE_[NONE|SPP|MG014] +PPA0BASE .EQU LPT0BASE ; PPA 0: BASE I/O ADDRESS OF PPI FOR PPA +PPA1BASE .EQU LPT1BASE ; PPA 1: BASE I/O ADDRESS OF PPI FOR PPA +; +IMMENABLE .EQU FALSE ; IMM: ENABLE IMM DISK DRIVER (IMM.ASM) +IMMCNT .EQU 1 ; IMM: NUMBER OF IMM DEVICES (1-2) +IMMTRACE .EQU 1 ; IMM: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +IMMMODE .EQU IMMMODE_MG014 ; IMM: DRIVER MODE: IMMMODE_[NONE|SPP|MG014] +IMM0BASE .EQU LPT0BASE ; IMM 0: BASE I/O ADDRESS OF PPI FOR IMM +IMM1BASE .EQU LPT1BASE ; IMM 1: BASE I/O ADDRESS OF PPI FOR IMM +; +SYQENABLE .EQU FALSE ; SYQ: ENABLE IMM DISK DRIVER (SYQ.ASM) +SYQCNT .EQU 1 ; SYQ: NUMBER OF SYQ DEVICES (1-2) +SYQTRACE .EQU 1 ; SYQ: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +SYQMODE .EQU IMMMODE_MG014 ; SYQ: DRIVER MODE: SYQMODE_[NONE|SPP|MG014] +SYQ0BASE .EQU LPT0BASE ; SYQ 0: BASE I/O ADDRESS OF PPI FOR SYQ +SYQ1BASE .EQU LPT1BASE ; SYQ 1: BASE I/O ADDRESS OF PPI FOR SYQ ; PIO_4P .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB 4P BOARD PIO_ZP .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB ZILOG PERIPHERALS BOARD (PIO.ASM) @@ -267,7 +328,7 @@ SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM) ; DMAENABLE .EQU FALSE ; DMA: ENABLE DMA DRIVER (DMA.ASM) DMABASE .EQU $E0 ; DMA: DMA BASE ADDRESS -DMAMODE .EQU DMAMODE_Z180 ; DMA: DMA MODE (NONE|ECB|Z180|Z280|RC|MBC) +DMAMODE .EQU DMAMODE_Z180 ; DMA: DMA MODE (NONE|ECB|Z180|Z280|RC|MBC|DUO) ; -YM2612ENABLE .EQU FALSE ; YM2612: ENABLE YM2612 DRIVER (MUTE STUB) -VGMBASE .EQU $C0 ; YM2612: BASE ADDRESS FOR VGM BOARD (YM2612/SN76469s/CTC) +YM2612ENABLE .EQU FALSE ; YM2612: ENABLE YM2612 DRIVER +VGMBASE .EQU $C0 ; YM2612: BASE ADDRESS FOR VGM BOARD (YM2612/SN76489s/CTC) diff --git a/Source/HBIOS/cfg_rcz280.asm b/Source/HBIOS/cfg_rcz280.asm index 87691c91..39ea9909 100644 --- a/Source/HBIOS/cfg_rcz280.asm +++ b/Source/HBIOS/cfg_rcz280.asm @@ -1,6 +1,6 @@ ; ;================================================================================================== -; ROMWBW 2.X CONFIGURATION DEFAULTS FOR RCBUS Z280 CPU +; ROMWBW 3.X CONFIGURATION DEFAULTS FOR RCBUS Z280 CPU ;================================================================================================== ; ; THIS FILE CONTAINS THE FULL SET OF DEFAULT CONFIGURATION SETTINGS FOR THE PLATFORM @@ -15,7 +15,7 @@ ; #INCLUDE "hbios.inc" ; -PLATFORM .EQU PLT_RCZ280 ; PLT_[SBC|ZETA|ZETA2|N8|MK4|UNA|RCZ80|RCZ180|EZZ80|SCZ180|DYNO|RCZ280|MBC|RPH] +PLATFORM .EQU PLT_RCZ280 ; PLT_[SBC|ZETA|ZETA2|N8|MK4|UNA|RCZ80|RCZ180|EZZ80|SCZ180|DYNO|RCZ280|MBC|RPH|Z80RETRO|S100|DUO|HEATH|MON] CPUFAM .EQU CPU_Z280 ; CPU FAMILY: CPU_[Z80|Z180|Z280] BIOS .EQU BIOS_WBW ; HARDWARE BIOS: BIOS_[WBW|UNA] BATCOND .EQU FALSE ; ENABLE LOW BATTERY WARNING MESSAGE @@ -28,16 +28,14 @@ BOOT_DELAY .EQU 0 ; FIXED BOOT DELAY IN SECONDS PRIOR TO CONSOLE OUTPUT ; CPUSPDCAP .EQU SPD_FIXED ; CPU SPEED CHANGE CAPABILITY SPD_FIXED|SPD_HILO CPUSPDDEF .EQU SPD_HIGH ; CPU SPEED DEFAULT SPD_UNSUP|SPD_HIGH|SPD_LOW -CPUOSC .EQU 12000000 ; CPU OSC FREQ IN MHZ +CPUOSC .EQU 24000000 ; CPU OSC FREQ IN MHZ INTMODE .EQU 0 ; INTERRUPTS: 0=NONE, 1=MODE 1, 2=MODE 2, 3=MODE 3 (Z280) -DEFSERCFG .EQU SER_115200_8N1 ; DEFAULT SERIAL LINE CONFIG (SEE STD.ASM) +DEFSERCFG .EQU SER_115200_8N1 | SER_RTS ; DEFAULT SERIAL LINE CONFIG (SEE STD.ASM) ; RAMSIZE .EQU 512 ; SIZE OF RAM IN KB (MUST MATCH YOUR HARDWARE!!!) ROMSIZE .EQU 512 ; SIZE OF ROM IN KB (MUST MATCH YOUR HARDWARE!!!) -ROMSIZE_CHK .EQU 0 ; ROMSIZE VALUE VERIFICATION (0=DISABLED) -MEMMGR .EQU MM_Z2 ; MEMORY MANAGER: MM_[SBC|Z2|N8|Z180|Z280|MBC|RPH] -RAMLOC .EQU 19 ; START OF RAM AS POWER OF 2 (2^N) IN PHYSICAL ADDRESS SPACE -RAMBIAS .EQU (1 << (RAMLOC - 10)) ; OFFSET OF START OF RAM IN PHYSICAL ADDRESS SPACE +MEMMGR .EQU MM_Z2 ; MEMORY MANAGER: MM_[SBC|Z2|N8|Z180|Z280|MBC|RPH|MON] +RAMBIAS .EQU ROMSIZE ; OFFSET OF START OF RAM IN PHYSICAL ADDRESS SPACE MPGSEL_0 .EQU $78 ; Z2 MEM MGR BANK 0 PAGE SELECT REG (WRITE ONLY) MPGSEL_1 .EQU $79 ; Z2 MEM MGR BANK 1 PAGE SELECT REG (WRITE ONLY) MPGSEL_2 .EQU $7A ; Z2 MEM MGR BANK 2 PAGE SELECT REG (WRITE ONLY) @@ -60,15 +58,21 @@ CTCDEBUG .EQU FALSE ; ENABLE CTC DRIVER DEBUG OUTPUT CTCBASE .EQU $88 ; CTC BASE I/O ADDRESS CTCTIMER .EQU FALSE ; ENABLE CTC PERIODIC TIMER ; +PCFENABLE .EQU FALSE ; ENABLE PCF8584 I2C CONTROLLER +PCFBASE .EQU $F0 ; PCF8584 BASE I/O ADDRESS +; EIPCENABLE .EQU FALSE ; EIPC: ENABLE Z80 EIPC (Z84C15) INITIALIZATION ; SKZENABLE .EQU FALSE ; ENABLE SERGEY'S Z80-512K FEATURES ; WDOGMODE .EQU WDOG_NONE ; WATCHDOG MODE: WDOG_[NONE|EZZ80|SKZ] ; -DIAGENABLE .EQU TRUE ; ENABLES OUTPUT TO 8 BIT LED DIAGNOSTIC PORT -DIAGPORT .EQU $00 ; DIAGNOSTIC PORT ADDRESS -DIAGDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON DIAGNOSTIC LEDS +FPLED_ENABLE .EQU TRUE ; FP: ENABLES FRONT PANEL LEDS +FPLED_IO .EQU $00 ; FP: PORT ADDRESS FOR FP LEDS +FPLED_DSKACT .EQU TRUE ; FP: ENABLES DISK I/O ACTIVITY ON FP LEDS +FPSW_ENABLE .EQU FALSE ; FP: ENABLES FRONT PANEL SWITCHES +FPSW_IO .EQU $00 ; FP: PORT ADDRESS FOR FP SWITCHES +; DIAGLVL .EQU DL_CRITICAL ; ERROR LEVEL REPORTING ; LEDENABLE .EQU FALSE ; ENABLES STATUS LED (SINGLE LED) @@ -76,9 +80,17 @@ LEDMODE .EQU LEDMODE_STD ; LEDMODE_[STD|RTC] LEDPORT .EQU $0E ; STATUS LED PORT ADDRESS LEDDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON STATUS LED ; -DSKYENABLE .EQU FALSE ; ENABLES DSKY (DO NOT COMBINE WITH PPIDE) +DSKYENABLE .EQU FALSE ; ENABLES DSKY FUNCTIONALITY +DSKYDSKACT .EQU TRUE ; ENABLES DISK ACTIVITY ON DSKY DISPLAY +ICMENABLE .EQU FALSE ; ENABLES ORIGINAL DSKY ICM DRIVER (7218) +ICMPPIBASE .EQU $60 ; BASE I/O ADDRESS OF ICM PPI +PKDENABLE .EQU FALSE ; ENABLES DSKY NG PKD DRIVER (8259) +PKDPPIBASE .EQU $60 ; BASE I/O ADDRESS OF PKD PPI +PKDOSC .EQU 3000000 ; OSCILLATOR FREQ FOR PKD (IN HZ) +H8PENABLE .EQU FALSE ; ENABLES HEATH H8 FRONT PANEL ; BOOTCON .EQU 0 ; BOOT CONSOLE DEVICE +SECCON .EQU $FF ; SECONDARY CONSOLE DEVICE CRTACT .EQU FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP VDAEMU .EQU EMUTYP_ANSI ; VDA EMULATION: EMUTYP_[TTY|ANSI] VDAEMU_SERKBD .EQU $FF ; VDA EMULATION: SERIAL KBD UNIT #, OR $FF FOR HW KBD @@ -123,8 +135,9 @@ UARTENABLE .EQU TRUE ; UART: ENABLE 8250/16550-LIKE SERIAL DRIVER (UART.ASM) UARTOSC .EQU 1843200 ; UART: OSC FREQUENCY IN MHZ UARTINTS .EQU FALSE ; UART: INCLUDE INTERRUPT SUPPORT UNDER IM1/2/3 UARTCFG .EQU DEFSERCFG | SER_RTS ; UART: LINE CONFIG FOR UART PORTS -UARTSBC .EQU FALSE ; UART: AUTO-DETECT SBC/ZETA ONBOARD UART +UARTSBC .EQU FALSE ; UART: AUTO-DETECT SBC/ZETA/DUO ONBOARD UART UARTSBCFORCE .EQU FALSE ; UART: FORCE DETECTION OF SBC UART (FOR SIMH) +UARTAUX .EQU FALSE ; UART: AUTO-DETECT AUX UART UARTCAS .EQU FALSE ; UART: AUTO-DETECT ECB CASSETTE UART UARTMFP .EQU FALSE ; UART: AUTO-DETECT MF/PIC UART UART4 .EQU FALSE ; UART: AUTO-DETECT 4UART UART @@ -156,7 +169,7 @@ SIOENABLE .EQU TRUE ; SIO: ENABLE ZILOG SIO SERIAL DRIVER (SIO.ASM) SIODEBUG .EQU FALSE ; SIO: ENABLE DEBUG OUTPUT SIOBOOT .EQU 0 ; SIO: REBOOT ON RCV CHAR (0=DISABLED) SIOCNT .EQU 2 ; SIO: NUMBER OF CHIPS TO DETECT (1-2), 2 CHANNELS PER CHIP -SIO0MODE .EQU SIOMODE_RC ; SIO 0: CHIP TYPE: SIOMODE_[STD|RC|SMB|ZP] +SIO0MODE .EQU SIOMODE_RC ; SIO 0: CHIP TYPE: SIOMODE_[STD|RC|SMB|ZP|Z80R] SIO0BASE .EQU $80 ; SIO 0: REGISTERS BASE ADR SIO0ACLK .EQU 7372800 ; SIO 0A: OSC FREQ IN HZ, ZP=2457600/4915200, RC/SMB=7372800 SIO0ACFG .EQU DEFSERCFG ; SIO 0A: SERIAL LINE CONFIG @@ -164,7 +177,7 @@ SIO0ACTCC .EQU -1 ; SIO 0A: CTC CHANNEL 0=A, 1=B, 2=C, 3=D, -1 FOR NONE SIO0BCLK .EQU 7372800 ; SIO 0B: OSC FREQ IN HZ, ZP=2457600/4915200, RC/SMB=7372800 SIO0BCFG .EQU DEFSERCFG ; SIO 0B: SERIAL LINE CONFIG SIO0BCTCC .EQU -1 ; SIO 0B: CTC CHANNEL 0=A, 1=B, 2=C, 3=D, -1 FOR NONE -SIO1MODE .EQU SIOMODE_RC ; SIO 1: CHIP TYPE: SIOMODE_[STD|RC|SMB|ZP] +SIO1MODE .EQU SIOMODE_RC ; SIO 1: CHIP TYPE: SIOMODE_[STD|RC|SMB|ZP|Z80R] SIO1BASE .EQU $84 ; SIO 1: REGISTERS BASE ADR SIO1ACLK .EQU 7372800 ; SIO 1A: OSC FREQ IN HZ, ZP=2457600/4915200, RC/SMB=7372800 SIO1ACFG .EQU DEFSERCFG ; SIO 1A: SERIAL LINE CONFIG @@ -182,6 +195,8 @@ TMSENABLE .EQU FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM) TMSMODE .EQU TMSMODE_MSX ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|MSX9958|MSXKBD|COLECO] TMSTIMENABLE .EQU FALSE ; TMS: ENABLE TIMER INTERRUPTS (REQUIRES IM1) VGAENABLE .EQU FALSE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM) +VRCENABLE .EQU FALSE ; VRC: ENABLE VGARC VIDEO/KBD DRIVER (VRC.ASM) +SCONENABLE .EQU FALSE ; SCON: ENABLE S100 CONSOLE DRIVER (SCON.ASM) ; MDENABLE .EQU TRUE ; MD: ENABLE MEMORY (ROM/RAM) DISK DRIVER (MD.ASM) MDROM .EQU TRUE ; MD: ENABLE ROM DISK @@ -193,9 +208,9 @@ FDENABLE .EQU FALSE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM) FDMODE .EQU FDMODE_RCWDC ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPFDC|MBC] FDCNT .EQU 2 ; FD: NUMBER OF FLOPPY DRIVES ON THE INTERFACE (1-2) FDTRACE .EQU 1 ; FD: TRACE LEVEL (0=NO,1=FATAL,2=ERRORS,3=ALL) -FDMEDIA .EQU FDM144 ; FD: DEFAULT MEDIA FORMAT FDM[720|144|360|120|111] -FDMEDIAALT .EQU FDM720 ; FD: ALTERNATE MEDIA FORMAT FDM[720|144|360|120|111] FDMAUTO .EQU TRUE ; FD: AUTO SELECT DEFAULT/ALTERNATE MEDIA FORMATS +FD0TYPE .EQU FDT_3HD ; FD 0: DRIVE TYPE: FDT_[3DD|3HD|5DD|5HD|8] +FD1TYPE .EQU FDT_3HD ; FD 1: DRIVE TYPE: FDT_[3DD|3HD|5DD|5HD|8] ; RFENABLE .EQU FALSE ; RF: ENABLE RAM FLOPPY DRIVER ; @@ -235,13 +250,25 @@ PPIDE2A8BIT .EQU FALSE ; PPIDE 2A (MASTER): 8 BIT XFER PPIDE2B8BIT .EQU FALSE ; PPIDE 0B (SLAVE): 8 BIT XFER ; SDENABLE .EQU FALSE ; SD: ENABLE SD CARD DISK DRIVER (SD.ASM) -SDMODE .EQU SDMODE_MT ; SD: DRIVER MODE: SDMODE_[JUHA|N8|CSIO|PPI|UART|DSD|MK4|SC|MT|USR] +SDMODE .EQU SDMODE_MT ; SD: DRIVER MODE: SDMODE_[JUHA|N8|CSIO|PPI|UART|DSD|MK4|SC|MT|PIO|Z80R|USR] SDPPIBASE .EQU $60 ; SD: BASE I/O ADDRESS OF PPI FOR PPI MODDE SDCNT .EQU 2 ; SD: NUMBER OF SD CARD DEVICES (1-2), FOR DSD/SC/MT ONLY SDTRACE .EQU 1 ; SD: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) SDCSIOFAST .EQU FALSE ; SD: ENABLE TABLE-DRIVEN BIT INVERTER IN CSIO MODE SDMTSWAP .EQU FALSE ; SD: SWAP THE LOGICAL ORDER OF THE SPI PORTS OF THE MT011 ; +CHENABLE .EQU TRUE ; CH: ENABLE CH375/376 USB SUPPORT +CHTRACE .EQU 1 ; CH: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +CHUSBTRACE .EQU 1 ; CHUSB: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +CHSDTRACE .EQU 1 ; CHSD: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +CHCNT .EQU 2 ; CH: NUMBER OF BOARDS TO DETECT (1-2) +CH0BASE .EQU $3E ; CH 0: BASE I/O ADDRESS +CH0USBENABLE .EQU TRUE ; CH 0: ENABLE USB DISK +CH0SDENABLE .EQU FALSE ; CH 0: ENABLE SD DISK +CH1BASE .EQU $3C ; CH 1: BASE I/O ADDRESS +CH1USBENABLE .EQU TRUE ; CH 1: ENABLE USB DISK +CH1SDENABLE .EQU FALSE ; CH 1: ENABLE SD DISK +; PRPENABLE .EQU FALSE ; PRP: ENABLE ECB PROPELLER IO BOARD DRIVER (PRP.ASM) PRPSDENABLE .EQU TRUE ; PRP: ENABLE PROPIO DRIVER SD CARD SUPPORT PRPSDTRACE .EQU 1 ; PRP: SD CARD TRACE LEVEL (0=NO,1=ERRORS,2=ALL) @@ -249,6 +276,8 @@ PRPCONENABLE .EQU TRUE ; PRP: ENABLE PROPIO DRIVER VIDEO/KBD SUPPORT ; PPPENABLE .EQU FALSE ; PPP: ENABLE ZETA PARALLEL PORT PROPELLER BOARD DRIVER (PPP.ASM) ; +ESPENABLE .EQU FALSE ; ESP: ENABLE ESP32 IO BOARD DRIVER (ESP.ASM) +; HDSKENABLE .EQU FALSE ; HDSK: ENABLE SIMH HDSK DISK DRIVER (HDSK.ASM) ; PIOENABLE .EQU FALSE ; PIO: ENABLE ZILOG PIO DRIVER (PIO.ASM) @@ -257,6 +286,32 @@ PIO0BASE .EQU $B8 ; PIO 0: REGISTERS BASE ADR PIO1BASE .EQU $BC ; PIO 1: REGISTERS BASE ADR ; LPTENABLE .EQU FALSE ; LPT: ENABLE CENTRONICS PRINTER DRIVER (LPT.ASM) +LPTMODE .EQU LPTMODE_MG014 ; LPT: DRIVER MODE: LPTMODE_[NONE|SPP|MG014] +LPTCNT .EQU 1 ; LPT: NUMBER OF CHIPS TO DETECT (1-2) +LPTTRACE .EQU 1 ; LPT: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +LPT0BASE .EQU $0C ; LPT 0: REGISTERS BASE ADR +LPT1BASE .EQU $00 ; LPT 1: REGISTERS BASE ADR +; +PPAENABLE .EQU FALSE ; PPA: ENABLE PPA DISK DRIVER (PPA.ASM) +PPACNT .EQU 1 ; PPA: NUMBER OF PPA DEVICES (1-2) +PPATRACE .EQU 1 ; PPA: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +PPAMODE .EQU PPAMODE_MG014 ; PPA: DRIVER MODE: PPAMODE_[NONE|SPP|MG014] +PPA0BASE .EQU LPT0BASE ; PPA 0: BASE I/O ADDRESS OF PPI FOR PPA +PPA1BASE .EQU LPT1BASE ; PPA 1: BASE I/O ADDRESS OF PPI FOR PPA +; +IMMENABLE .EQU FALSE ; IMM: ENABLE IMM DISK DRIVER (IMM.ASM) +IMMCNT .EQU 1 ; IMM: NUMBER OF IMM DEVICES (1-2) +IMMTRACE .EQU 1 ; IMM: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +IMMMODE .EQU IMMMODE_MG014 ; IMM: DRIVER MODE: IMMMODE_[NONE|SPP|MG014] +IMM0BASE .EQU LPT0BASE ; IMM 0: BASE I/O ADDRESS OF PPI FOR IMM +IMM1BASE .EQU LPT1BASE ; IMM 1: BASE I/O ADDRESS OF PPI FOR IMM +; +SYQENABLE .EQU FALSE ; SYQ: ENABLE IMM DISK DRIVER (SYQ.ASM) +SYQCNT .EQU 1 ; SYQ: NUMBER OF SYQ DEVICES (1-2) +SYQTRACE .EQU 1 ; SYQ: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +SYQMODE .EQU IMMMODE_MG014 ; SYQ: DRIVER MODE: SYQMODE_[NONE|SPP|MG014] +SYQ0BASE .EQU LPT0BASE ; SYQ 0: BASE I/O ADDRESS OF PPI FOR SYQ +SYQ1BASE .EQU LPT1BASE ; SYQ 1: BASE I/O ADDRESS OF PPI FOR SYQ ; PIO_4P .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB 4P BOARD PIO_ZP .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB ZILOG PERIPHERALS BOARD (PIO.ASM) @@ -277,7 +332,7 @@ SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM) ; DMAENABLE .EQU FALSE ; DMA: ENABLE DMA DRIVER (DMA.ASM) DMABASE .EQU $E0 ; DMA: DMA BASE ADDRESS -DMAMODE .EQU DMAMODE_Z280 ; DMA: DMA MODE (NONE|ECB|Z180|Z280|RC|MBC) +DMAMODE .EQU DMAMODE_Z280 ; DMA: DMA MODE (NONE|ECB|Z180|Z280|RC|MBC|DUO) ; -YM2612ENABLE .EQU FALSE ; YM2612: ENABLE YM2612 DRIVER (MUTE STUB) -VGMBASE .EQU $C0 ; YM2612: BASE ADDRESS FOR VGM BOARD (YM2612/SN76469s/CTC) +YM2612ENABLE .EQU FALSE ; YM2612: ENABLE YM2612 DRIVER +VGMBASE .EQU $C0 ; YM2612: BASE ADDRESS FOR VGM BOARD (YM2612/SN76489s/CTC) diff --git a/Source/HBIOS/cfg_rcz80.asm b/Source/HBIOS/cfg_rcz80.asm index 9bb247e1..23fb5c29 100644 --- a/Source/HBIOS/cfg_rcz80.asm +++ b/Source/HBIOS/cfg_rcz80.asm @@ -1,6 +1,6 @@ ; ;================================================================================================== -; ROMWBW 2.X CONFIGURATION DEFAULTS FOR RCBUS Z80 +; ROMWBW 3.X CONFIGURATION DEFAULTS FOR RCBUS Z80 ;================================================================================================== ; ; THIS FILE CONTAINS THE FULL SET OF DEFAULT CONFIGURATION SETTINGS FOR THE PLATFORM @@ -15,7 +15,7 @@ ; #INCLUDE "hbios.inc" ; -PLATFORM .EQU PLT_RCZ80 ; PLT_[SBC|ZETA|ZETA2|N8|MK4|UNA|RCZ80|RCZ180|EZZ80|SCZ180|DYNO|RCZ280|MBC|RPH] +PLATFORM .EQU PLT_RCZ80 ; PLT_[SBC|ZETA|ZETA2|N8|MK4|UNA|RCZ80|RCZ180|EZZ80|SCZ180|DYNO|RCZ280|MBC|RPH|Z80RETRO|S100|DUO|HEATH|MON] CPUFAM .EQU CPU_Z80 ; CPU FAMILY: CPU_[Z80|Z180|Z280] BIOS .EQU BIOS_WBW ; HARDWARE BIOS: BIOS_[WBW|UNA] BATCOND .EQU FALSE ; ENABLE LOW BATTERY WARNING MESSAGE @@ -30,12 +30,11 @@ CPUSPDCAP .EQU SPD_FIXED ; CPU SPEED CHANGE CAPABILITY SPD_FIXED|SPD_HILO CPUSPDDEF .EQU SPD_HIGH ; CPU SPEED DEFAULT SPD_UNSUP|SPD_HIGH|SPD_LOW CPUOSC .EQU 7372800 ; CPU OSC FREQ IN MHZ INTMODE .EQU 1 ; INTERRUPTS: 0=NONE, 1=MODE 1, 2=MODE 2, 3=MODE 3 (Z280) -DEFSERCFG .EQU SER_115200_8N1 ; DEFAULT SERIAL LINE CONFIG (SEE STD.ASM) +DEFSERCFG .EQU SER_115200_8N1 | SER_RTS ; DEFAULT SERIAL LINE CONFIG (SEE STD.ASM) ; RAMSIZE .EQU 512 ; SIZE OF RAM IN KB (MUST MATCH YOUR HARDWARE!!!) ROMSIZE .EQU 512 ; SIZE OF ROM IN KB (MUST MATCH YOUR HARDWARE!!!) -ROMSIZE_CHK .EQU 0 ; ROMSIZE VALUE VERIFICATION (0=DISABLED) -MEMMGR .EQU MM_Z2 ; MEMORY MANAGER: MM_[SBC|Z2|N8|Z180|Z280|MBC|RPH] +MEMMGR .EQU MM_Z2 ; MEMORY MANAGER: MM_[SBC|Z2|N8|Z180|Z280|MBC|RPH|MON] MPGSEL_0 .EQU $78 ; Z2 MEM MGR BANK 0 PAGE SELECT REG (WRITE ONLY) MPGSEL_1 .EQU $79 ; Z2 MEM MGR BANK 1 PAGE SELECT REG (WRITE ONLY) MPGSEL_2 .EQU $7A ; Z2 MEM MGR BANK 2 PAGE SELECT REG (WRITE ONLY) @@ -47,7 +46,7 @@ RTCIO .EQU $C0 ; RTC LATCH REGISTER ADR KIOENABLE .EQU FALSE ; ENABLE ZILOG KIO SUPPORT KIOBASE .EQU $80 ; KIO BASE I/O ADDRESS ; -CTCENABLE .EQU FALSE ; ENABLE ZILOG CTC SUPPORT +CTCENABLE .EQU TRUE ; ENABLE ZILOG CTC SUPPORT CTCDEBUG .EQU FALSE ; ENABLE CTC DRIVER DEBUG OUTPUT CTCBASE .EQU $88 ; CTC BASE I/O ADDRESS CTCTIMER .EQU FALSE ; ENABLE CTC PERIODIC TIMER @@ -57,6 +56,9 @@ CTCPRECH .EQU 2 ; PRESCALE CHANNEL (0-3) CTCTIMCH .EQU 3 ; TIMER CHANNEL (0-3) CTCOSC .EQU CPUOSC ; CTC CLOCK FREQUENCY ; +PCFENABLE .EQU FALSE ; ENABLE PCF8584 I2C CONTROLLER +PCFBASE .EQU $F0 ; PCF8584 BASE I/O ADDRESS +; EIPCENABLE .EQU FALSE ; EIPC: ENABLE Z80 EIPC (Z84C15) INITIALIZATION ; SKZENABLE .EQU FALSE ; ENABLE SERGEY'S Z80-512K FEATURES @@ -65,9 +67,12 @@ SKZDIV .EQU DIV_1 ; UART CLK (CLK2) DIVIDER FOR Z80-512K WDOGMODE .EQU WDOG_NONE ; WATCHDOG MODE: WDOG_[NONE|EZZ80|SKZ] WDOGIO .EQU $6E ; WATCHDOG REGISTER ADR ; -DIAGENABLE .EQU TRUE ; ENABLES OUTPUT TO 8 BIT LED DIAGNOSTIC PORT -DIAGPORT .EQU $00 ; DIAGNOSTIC PORT ADDRESS -DIAGDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON DIAGNOSTIC LEDS +FPLED_ENABLE .EQU FALSE ; FP: ENABLES FRONT PANEL LEDS +FPLED_IO .EQU $00 ; FP: PORT ADDRESS FOR FP LEDS +FPLED_DSKACT .EQU TRUE ; FP: ENABLES DISK I/O ACTIVITY ON FP LEDS +FPSW_ENABLE .EQU FALSE ; FP: ENABLES FRONT PANEL SWITCHES +FPSW_IO .EQU $00 ; FP: PORT ADDRESS FOR FP SWITCHES +; DIAGLVL .EQU DL_CRITICAL ; ERROR LEVEL REPORTING ; LEDENABLE .EQU FALSE ; ENABLES STATUS LED (SINGLE LED) @@ -75,17 +80,25 @@ LEDMODE .EQU LEDMODE_STD ; LEDMODE_[STD|RTC] LEDPORT .EQU $0E ; STATUS LED PORT ADDRESS LEDDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON STATUS LED ; -DSKYENABLE .EQU FALSE ; ENABLES DSKY (DO NOT COMBINE WITH PPIDE) +DSKYENABLE .EQU FALSE ; ENABLES DSKY FUNCTIONALITY +DSKYDSKACT .EQU TRUE ; ENABLES DISK ACTIVITY ON DSKY DISPLAY +ICMENABLE .EQU FALSE ; ENABLES ORIGINAL DSKY ICM DRIVER (7218) +ICMPPIBASE .EQU $60 ; BASE I/O ADDRESS OF ICM PPI +PKDENABLE .EQU FALSE ; ENABLES DSKY NG PKD DRIVER (8259) +PKDPPIBASE .EQU $60 ; BASE I/O ADDRESS OF PKD PPI +PKDOSC .EQU 3000000 ; OSCILLATOR FREQ FOR PKD (IN HZ) +H8PENABLE .EQU FALSE ; ENABLES HEATH H8 FRONT PANEL ; BOOTCON .EQU 0 ; BOOT CONSOLE DEVICE +SECCON .EQU $FF ; SECONDARY CONSOLE DEVICE CRTACT .EQU FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP VDAEMU .EQU EMUTYP_ANSI ; VDA EMULATION: EMUTYP_[TTY|ANSI] VDAEMU_SERKBD .EQU $FF ; VDA EMULATION: SERIAL KBD UNIT #, OR $FF FOR HW KBD ANSITRACE .EQU 1 ; ANSI DRIVER TRACE LEVEL (0=NO,1=ERRORS,2=ALL) PPKTRACE .EQU 1 ; PPK DRIVER TRACE LEVEL (0=NO,1=ERRORS,2=ALL) KBDTRACE .EQU 1 ; KBD DRIVER TRACE LEVEL (0=NO,1=ERRORS,2=ALL) -PPKKBLOUT .EQU KBD_US ; PPK KEYBOARD LANGUAGE: KBD_[US|DE] KBDKBLOUT .EQU KBD_US ; KBD KEYBOARD LANGUAGE: KBD_[US|DE] +PPKKBLOUT .EQU KBD_US ; PPK KEYBOARD LANGUAGE: KBD_[US|DE] MKYENABLE .EQU FALSE ; MSX 5255 PPI KEYBOARD COMPATIBLE DRIVER (REQUIRES TMS VDA DRIVER) MKYKBLOUT .EQU KBD_US ; KBD KEYBOARD LANGUAGE: KBD_[US|DE] ; @@ -122,8 +135,9 @@ UARTENABLE .EQU TRUE ; UART: ENABLE 8250/16550-LIKE SERIAL DRIVER (UART.ASM) UARTOSC .EQU 1843200 ; UART: OSC FREQUENCY IN MHZ UARTINTS .EQU FALSE ; UART: INCLUDE INTERRUPT SUPPORT UNDER IM1/2/3 UARTCFG .EQU DEFSERCFG | SER_RTS ; UART: LINE CONFIG FOR UART PORTS -UARTSBC .EQU FALSE ; UART: AUTO-DETECT SBC/ZETA ONBOARD UART +UARTSBC .EQU FALSE ; UART: AUTO-DETECT SBC/ZETA/DUO ONBOARD UART UARTSBCFORCE .EQU FALSE ; UART: FORCE DETECTION OF SBC UART (FOR SIMH) +UARTAUX .EQU FALSE ; UART: AUTO-DETECT AUX UART UARTCAS .EQU FALSE ; UART: AUTO-DETECT ECB CASSETTE UART UARTMFP .EQU FALSE ; UART: AUTO-DETECT MF/PIC UART UART4 .EQU FALSE ; UART: AUTO-DETECT 4UART UART @@ -150,7 +164,7 @@ SIOENABLE .EQU TRUE ; SIO: ENABLE ZILOG SIO SERIAL DRIVER (SIO.ASM) SIODEBUG .EQU FALSE ; SIO: ENABLE DEBUG OUTPUT SIOBOOT .EQU 0 ; SIO: REBOOT ON RCV CHAR (0=DISABLED) SIOCNT .EQU 2 ; SIO: NUMBER OF CHIPS TO DETECT (1-2), 2 CHANNELS PER CHIP -SIO0MODE .EQU SIOMODE_RC ; SIO 0: CHIP TYPE: SIOMODE_[STD|RC|SMB|ZP] +SIO0MODE .EQU SIOMODE_RC ; SIO 0: CHIP TYPE: SIOMODE_[STD|RC|SMB|ZP|Z80R] SIO0BASE .EQU $80 ; SIO 0: REGISTERS BASE ADR SIO0ACLK .EQU CPUOSC ; SIO 0A: OSC FREQ IN HZ, ZP=2457600/4915200, RC/SMB=7372800 SIO0ACFG .EQU DEFSERCFG ; SIO 0A: SERIAL LINE CONFIG @@ -158,7 +172,7 @@ SIO0ACTCC .EQU -1 ; SIO 0A: CTC CHANNEL 0=A, 1=B, 2=C, 3=D, -1 FOR NONE SIO0BCLK .EQU CPUOSC ; SIO 0B: OSC FREQ IN HZ, ZP=2457600/4915200, RC/SMB=7372800 SIO0BCFG .EQU DEFSERCFG ; SIO 0B: SERIAL LINE CONFIG SIO0BCTCC .EQU -1 ; SIO 0B: CTC CHANNEL 0=A, 1=B, 2=C, 3=D, -1 FOR NONE -SIO1MODE .EQU SIOMODE_RC ; SIO 1: CHIP TYPE: SIOMODE_[STD|RC|SMB|ZP] +SIO1MODE .EQU SIOMODE_RC ; SIO 1: CHIP TYPE: SIOMODE_[STD|RC|SMB|ZP|Z80R] SIO1BASE .EQU $84 ; SIO 1: REGISTERS BASE ADR SIO1ACLK .EQU CPUOSC ; SIO 1A: OSC FREQ IN HZ, ZP=2457600/4915200, RC/SMB=7372800 SIO1ACFG .EQU DEFSERCFG ; SIO 1A: SERIAL LINE CONFIG @@ -176,6 +190,8 @@ TMSENABLE .EQU FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM) TMSMODE .EQU TMSMODE_MSX ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|MSX9958|MSXKBD|COLECO] TMSTIMENABLE .EQU FALSE ; TMS: ENABLE TIMER INTERRUPTS (REQUIRES IM1) VGAENABLE .EQU FALSE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM) +VRCENABLE .EQU FALSE ; VRC: ENABLE VGARC VIDEO/KBD DRIVER (VRC.ASM) +SCONENABLE .EQU FALSE ; SCON: ENABLE S100 CONSOLE DRIVER (SCON.ASM) ; MDENABLE .EQU TRUE ; MD: ENABLE MEMORY (ROM/RAM) DISK DRIVER (MD.ASM) MDROM .EQU TRUE ; MD: ENABLE ROM DISK @@ -187,9 +203,9 @@ FDENABLE .EQU FALSE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM) FDMODE .EQU FDMODE_RCWDC ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPFDC|MBC] FDCNT .EQU 2 ; FD: NUMBER OF FLOPPY DRIVES ON THE INTERFACE (1-2) FDTRACE .EQU 1 ; FD: TRACE LEVEL (0=NO,1=FATAL,2=ERRORS,3=ALL) -FDMEDIA .EQU FDM144 ; FD: DEFAULT MEDIA FORMAT FDM[720|144|360|120|111] -FDMEDIAALT .EQU FDM720 ; FD: ALTERNATE MEDIA FORMAT FDM[720|144|360|120|111] FDMAUTO .EQU TRUE ; FD: AUTO SELECT DEFAULT/ALTERNATE MEDIA FORMATS +FD0TYPE .EQU FDT_3HD ; FD 0: DRIVE TYPE: FDT_[3DD|3HD|5DD|5HD|8] +FD1TYPE .EQU FDT_3HD ; FD 1: DRIVE TYPE: FDT_[3DD|3HD|5DD|5HD|8] ; RFENABLE .EQU FALSE ; RF: ENABLE RAM FLOPPY DRIVER ; @@ -229,13 +245,25 @@ PPIDE2A8BIT .EQU FALSE ; PPIDE 2A (MASTER): 8 BIT XFER PPIDE2B8BIT .EQU FALSE ; PPIDE 0B (SLAVE): 8 BIT XFER ; SDENABLE .EQU FALSE ; SD: ENABLE SD CARD DISK DRIVER (SD.ASM) -SDMODE .EQU SDMODE_MT ; SD: DRIVER MODE: SDMODE_[JUHA|N8|CSIO|PPI|UART|DSD|MK4|SC|MT|USR] +SDMODE .EQU SDMODE_MT ; SD: DRIVER MODE: SDMODE_[JUHA|N8|CSIO|PPI|UART|DSD|MK4|SC|MT|PIO|Z80R|USR] SDPPIBASE .EQU $60 ; SD: BASE I/O ADDRESS OF PPI FOR PPI MODDE SDCNT .EQU 2 ; SD: NUMBER OF SD CARD DEVICES (1-2), FOR DSD/SC/MT ONLY SDTRACE .EQU 1 ; SD: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) SDCSIOFAST .EQU FALSE ; SD: ENABLE TABLE-DRIVEN BIT INVERTER IN CSIO MODE SDMTSWAP .EQU FALSE ; SD: SWAP THE LOGICAL ORDER OF THE SPI PORTS OF THE MT011 ; +CHENABLE .EQU TRUE ; CH: ENABLE CH375/376 USB SUPPORT +CHTRACE .EQU 1 ; CH: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +CHUSBTRACE .EQU 1 ; CHUSB: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +CHSDTRACE .EQU 1 ; CHSD: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +CHCNT .EQU 2 ; CH: NUMBER OF BOARDS TO DETECT (1-2) +CH0BASE .EQU $3E ; CH 0: BASE I/O ADDRESS +CH0USBENABLE .EQU TRUE ; CH 0: ENABLE USB DISK +CH0SDENABLE .EQU FALSE ; CH 0: ENABLE SD DISK +CH1BASE .EQU $3C ; CH 1: BASE I/O ADDRESS +CH1USBENABLE .EQU TRUE ; CH 1: ENABLE USB DISK +CH1SDENABLE .EQU FALSE ; CH 1: ENABLE SD DISK +; PRPENABLE .EQU FALSE ; PRP: ENABLE ECB PROPELLER IO BOARD DRIVER (PRP.ASM) PRPSDENABLE .EQU TRUE ; PRP: ENABLE PROPIO DRIVER SD CARD SUPPORT PRPSDTRACE .EQU 1 ; PRP: SD CARD TRACE LEVEL (0=NO,1=ERRORS,2=ALL) @@ -243,6 +271,8 @@ PRPCONENABLE .EQU TRUE ; PRP: ENABLE PROPIO DRIVER VIDEO/KBD SUPPORT ; PPPENABLE .EQU FALSE ; PPP: ENABLE ZETA PARALLEL PORT PROPELLER BOARD DRIVER (PPP.ASM) ; +ESPENABLE .EQU FALSE ; ESP: ENABLE ESP32 IO BOARD DRIVER (ESP.ASM) +; HDSKENABLE .EQU FALSE ; HDSK: ENABLE SIMH HDSK DISK DRIVER (HDSK.ASM) ; PIOENABLE .EQU FALSE ; PIO: ENABLE ZILOG PIO DRIVER (PIO.ASM) @@ -251,6 +281,32 @@ PIO0BASE .EQU $B8 ; PIO 0: REGISTERS BASE ADR PIO1BASE .EQU $BC ; PIO 1: REGISTERS BASE ADR ; LPTENABLE .EQU FALSE ; LPT: ENABLE CENTRONICS PRINTER DRIVER (LPT.ASM) +LPTMODE .EQU LPTMODE_MG014 ; LPT: DRIVER MODE: LPTMODE_[NONE|SPP|MG014] +LPTCNT .EQU 1 ; LPT: NUMBER OF CHIPS TO DETECT (1-2) +LPTTRACE .EQU 1 ; LPT: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +LPT0BASE .EQU $0C ; LPT 0: REGISTERS BASE ADR +LPT1BASE .EQU $00 ; LPT 1: REGISTERS BASE ADR +; +PPAENABLE .EQU FALSE ; PPA: ENABLE PPA DISK DRIVER (PPA.ASM) +PPACNT .EQU 1 ; PPA: NUMBER OF PPA DEVICES (1-2) +PPATRACE .EQU 1 ; PPA: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +PPAMODE .EQU PPAMODE_MG014 ; PPA: DRIVER MODE: PPAMODE_[NONE|SPP|MG014] +PPA0BASE .EQU LPT0BASE ; PPA 0: BASE I/O ADDRESS OF PPI FOR PPA +PPA1BASE .EQU LPT1BASE ; PPA 1: BASE I/O ADDRESS OF PPI FOR PPA +; +IMMENABLE .EQU FALSE ; IMM: ENABLE IMM DISK DRIVER (IMM.ASM) +IMMCNT .EQU 1 ; IMM: NUMBER OF IMM DEVICES (1-2) +IMMTRACE .EQU 1 ; IMM: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +IMMMODE .EQU IMMMODE_MG014 ; IMM: DRIVER MODE: IMMMODE_[NONE|SPP|MG014] +IMM0BASE .EQU LPT0BASE ; IMM 0: BASE I/O ADDRESS OF PPI FOR IMM +IMM1BASE .EQU LPT1BASE ; IMM 1: BASE I/O ADDRESS OF PPI FOR IMM +; +SYQENABLE .EQU FALSE ; SYQ: ENABLE IMM DISK DRIVER (SYQ.ASM) +SYQCNT .EQU 1 ; SYQ: NUMBER OF SYQ DEVICES (1-2) +SYQTRACE .EQU 1 ; SYQ: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +SYQMODE .EQU IMMMODE_MG014 ; SYQ: DRIVER MODE: SYQMODE_[NONE|SPP|MG014] +SYQ0BASE .EQU LPT0BASE ; SYQ 0: BASE I/O ADDRESS OF PPI FOR SYQ +SYQ1BASE .EQU LPT1BASE ; SYQ 1: BASE I/O ADDRESS OF PPI FOR SYQ ; PIO_4P .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB 4P BOARD PIO_ZP .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB ZILOG PERIPHERALS BOARD (PIO.ASM) @@ -271,7 +327,7 @@ SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM) ; DMAENABLE .EQU FALSE ; DMA: ENABLE DMA DRIVER (DMA.ASM) DMABASE .EQU $E0 ; DMA: DMA BASE ADDRESS -DMAMODE .EQU DMAMODE_RC ; DMA: DMA MODE (NONE|ECB|Z180|Z280|RC|MBC) +DMAMODE .EQU DMAMODE_RC ; DMA: DMA MODE (NONE|ECB|Z180|Z280|RC|MBC|DUO) ; -YM2612ENABLE .EQU FALSE ; YM2612: ENABLE YM2612 DRIVER (MUTE STUB) -VGMBASE .EQU $C0 ; YM2612: BASE ADDRESS FOR VGM BOARD (YM2612/SN76469s/CTC) +YM2612ENABLE .EQU FALSE ; YM2612: ENABLE YM2612 DRIVER +VGMBASE .EQU $C0 ; YM2612: BASE ADDRESS FOR VGM BOARD (YM2612/SN76489s/CTC) diff --git a/Source/HBIOS/cfg_rph.asm b/Source/HBIOS/cfg_rph.asm index 7df16a4b..32c14e8f 100644 --- a/Source/HBIOS/cfg_rph.asm +++ b/Source/HBIOS/cfg_rph.asm @@ -1,6 +1,6 @@ ; ;================================================================================================== -; ROMWBW 2.X CONFIGURATION FOR RHYOPHYRE +; ROMWBW 3.X CONFIGURATION FOR RHYOPHYRE ;================================================================================================== ; ; THIS FILE CONTAINS THE FULL SET OF DEFAULT CONFIGURATION SETTINGS FOR THE PLATFORM @@ -15,7 +15,7 @@ ; #INCLUDE "hbios.inc" ; -PLATFORM .EQU PLT_RPH ; PLT_[SBC|ZETA|ZETA2|N8|MK4|UNA|RCZ80|RCZ180|EZZ80|SCZ180|DYNO|RCZ280|MBC|RPH] +PLATFORM .EQU PLT_RPH ; PLT_[SBC|ZETA|ZETA2|N8|MK4|UNA|RCZ80|RCZ180|EZZ80|SCZ180|DYNO|RCZ280|MBC|RPH|Z80RETRO|S100|DUO|HEATH|MON] CPUFAM .EQU CPU_Z180 ; CPU FAMILY: CPU_[Z80|Z180|Z280] BIOS .EQU BIOS_WBW ; HARDWARE BIOS: BIOS_[WBW|UNA] BATCOND .EQU TRUE ; ENABLE LOW BATTERY WARNING MESSAGE @@ -30,14 +30,12 @@ CPUSPDCAP .EQU SPD_FIXED ; CPU SPEED CHANGE CAPABILITY SPD_FIXED|SPD_HILO CPUSPDDEF .EQU SPD_HIGH ; CPU SPEED DEFAULT SPD_UNSUP|SPD_HIGH|SPD_LOW CPUOSC .EQU 18432000 ; CPU OSC FREQ IN MHZ INTMODE .EQU 2 ; INTERRUPTS: 0=NONE, 1=MODE 1, 2=MODE 2, 3=MODE 3 (Z280) -DEFSERCFG .EQU SER_38400_8N1 ; DEFAULT SERIAL LINE CONFIG (SEE STD.ASM) +DEFSERCFG .EQU SER_38400_8N1 | SER_RTS ; DEFAULT SERIAL LINE CONFIG (SEE STD.ASM) ; RAMSIZE .EQU 512 ; SIZE OF RAM IN KB (MUST MATCH YOUR HARDWARE!!!) ROMSIZE .EQU 512 ; SIZE OF ROM IN KB (MUST MATCH YOUR HARDWARE!!!) -ROMSIZE_CHK .EQU 0 ; ROMSIZE VALUE VERIFICATION (0=DISABLED) -MEMMGR .EQU MM_RPH ; MEMORY MANAGER: MM_[SBC|Z2|N8|Z180|Z280|MBC|RPH] +MEMMGR .EQU MM_RPH ; MEMORY MANAGER: MM_[SBC|Z2|N8|Z180|Z280|MBC|RPH|MON] RAMBIAS .EQU 0 ; OFFSET OF START OF RAM IN PHYSICAL ADDRESS SPACE -RAMLOC .EQU 0 ; START OF RAM AS POWER OF 2 (2^N) IN PHYSICAL ADDRESS SPACE ; Z180_BASE .EQU $40 ; Z180: I/O BASE ADDRESS FOR INTERNAL REGISTERS Z180_CLKDIV .EQU 1 ; Z180: CHK DIV: 0=OSC/2, 1=OSC, 2=OSC*2 @@ -60,15 +58,21 @@ CTCDEBUG .EQU FALSE ; ENABLE CTC DRIVER DEBUG OUTPUT CTCBASE .EQU $B0 ; CTC BASE I/O ADDRESS CTCTIMER .EQU FALSE ; ENABLE CTC PERIODIC TIMER ; +PCFENABLE .EQU FALSE ; ENABLE PCF8584 I2C CONTROLLER +PCFBASE .EQU $F0 ; PCF8584 BASE I/O ADDRESS +; EIPCENABLE .EQU FALSE ; EIPC: ENABLE Z80 EIPC (Z84C15) INITIALIZATION ; SKZENABLE .EQU FALSE ; ENABLE SERGEY'S Z80-512K FEATURES ; WDOGMODE .EQU WDOG_NONE ; WATCHDOG MODE: WDOG_[NONE|EZZ80|SKZ] ; -DIAGENABLE .EQU FALSE ; ENABLES OUTPUT TO 8 BIT LED DIAGNOSTIC PORT -DIAGPORT .EQU $00 ; DIAGNOSTIC PORT ADDRESS -DIAGDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON DIAGNOSTIC LEDS +FPLED_ENABLE .EQU FALSE ; FP: ENABLES FRONT PANEL LEDS +FPLED_IO .EQU $00 ; FP: PORT ADDRESS FOR FP LEDS +FPLED_DSKACT .EQU TRUE ; FP: ENABLES DISK I/O ACTIVITY ON FP LEDS +FPSW_ENABLE .EQU FALSE ; FP: ENABLES FRONT PANEL SWITCHES +FPSW_IO .EQU $00 ; FP: PORT ADDRESS FOR FP SWITCHES +; DIAGLVL .EQU DL_CRITICAL ; ERROR LEVEL REPORTING ; LEDENABLE .EQU FALSE ; ENABLES STATUS LED @@ -76,12 +80,17 @@ LEDMODE .EQU LEDMODE_RTC ; LEDMODE_[STD|RTC] LEDPORT .EQU RTCIO ; STATUS LED PORT ADDRESS LEDDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON STATUS LED ; -DSKYENABLE .EQU FALSE ; ENABLES DSKY -DSKYMODE .EQU DSKYMODE_V1 ; DSKY VERSION: DSKYMODE_[V1|NG] -DSKYPPIBASE .EQU RPH_PPI0 ; BASE I/O ADDRESS OF DSKY PPI -DSKYOSC .EQU 3000000 ; OSCILLATOR FREQ FOR DSKYNG (IN HZ) +DSKYENABLE .EQU FALSE ; ENABLES DSKY FUNCTIONALITY +DSKYDSKACT .EQU TRUE ; ENABLES DISK ACTIVITY ON DSKY DISPLAY +ICMENABLE .EQU FALSE ; ENABLES ORIGINAL DSKY ICM DRIVER (7218) +ICMPPIBASE .EQU RPH_PPI0 ; BASE I/O ADDRESS OF ICM PPI +PKDENABLE .EQU FALSE ; ENABLES DSKY NG PKD DRIVER (8259) +PKDPPIBASE .EQU RPH_PPI0 ; BASE I/O ADDRESS OF PKD PPI +PKDOSC .EQU 3000000 ; OSCILLATOR FREQ FOR PKD (IN HZ) +H8PENABLE .EQU FALSE ; ENABLES HEATH H8 FRONT PANEL ; BOOTCON .EQU 0 ; BOOT CONSOLE DEVICE +SECCON .EQU $FF ; SECONDARY CONSOLE DEVICE CRTACT .EQU FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP VDAEMU .EQU EMUTYP_ANSI ; VDA EMULATION: EMUTYP_[TTY|ANSI] VDAEMU_SERKBD .EQU $FF ; VDA EMULATION: SERIAL KBD UNIT #, OR $FF FOR HW KBD @@ -120,8 +129,9 @@ UARTOSC .EQU 1843200 ; UART: OSC FREQUENCY IN MHZ UARTINTS .EQU FALSE ; UART: INCLUDE INTERRUPT SUPPORT UNDER IM1/2/3 UARTCFG .EQU DEFSERCFG ; UART: LINE CONFIG FOR UART PORTS UARTCASSPD .EQU SER_300_8N1 ; UART: ECB CASSETTE UART DEFAULT SPEED -UARTSBC .EQU FALSE ; UART: AUTO-DETECT SBC/ZETA ONBOARD UART +UARTSBC .EQU FALSE ; UART: AUTO-DETECT SBC/ZETA/DUO ONBOARD UART UARTSBCFORCE .EQU FALSE ; UART: FORCE DETECTION OF SBC UART (FOR SIMH) +UARTAUX .EQU FALSE ; UART: AUTO-DETECT AUX UART UARTCAS .EQU FALSE ; UART: AUTO-DETECT ECB CASSETTE UART UARTMFP .EQU FALSE ; UART: AUTO-DETECT MF/PIC UART UART4 .EQU FALSE ; UART: AUTO-DETECT 4UART UART @@ -156,6 +166,8 @@ TMSMODE .EQU TMSMODE_N8 ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|MSX9958|MSX TMSTIMENABLE .EQU FALSE ; TMS: ENABLE TIMER INTERRUPTS (REQUIRES IM1) VGAENABLE .EQU FALSE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM) VGASIZ .EQU V80X25 ; VGA: DISPLAY FORMAT [V80X25|V80X30|V80X43] +VRCENABLE .EQU FALSE ; VRC: ENABLE VGARC VIDEO/KBD DRIVER (VRC.ASM) +SCONENABLE .EQU FALSE ; SCON: ENABLE S100 CONSOLE DRIVER (SCON.ASM) ; MDENABLE .EQU TRUE ; MD: ENABLE MEMORY (ROM/RAM) DISK DRIVER (MD.ASM) MDROM .EQU TRUE ; MD: ENABLE ROM DISK @@ -167,9 +179,9 @@ FDENABLE .EQU FALSE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM) FDMODE .EQU FDMODE_N8 ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPFDC|MBC] FDCNT .EQU 2 ; FD: NUMBER OF FLOPPY DRIVES ON THE INTERFACE (1-2) FDTRACE .EQU 1 ; FD: TRACE LEVEL (0=NO,1=FATAL,2=ERRORS,3=ALL) -FDMEDIA .EQU FDM144 ; FD: DEFAULT MEDIA FORMAT FDM[720|144|360|120|111] -FDMEDIAALT .EQU FDM720 ; FD: ALTERNATE MEDIA FORMAT FDM[720|144|360|120|111] FDMAUTO .EQU TRUE ; FD: AUTO SELECT DEFAULT/ALTERNATE MEDIA FORMATS +FD0TYPE .EQU FDT_3HD ; FD 0: DRIVE TYPE: FDT_[3DD|3HD|5DD|5HD|8] +FD1TYPE .EQU FDT_3HD ; FD 1: DRIVE TYPE: FDT_[3DD|3HD|5DD|5HD|8] ; RFENABLE .EQU FALSE ; RF: ENABLE RAM FLOPPY DRIVER RFCNT .EQU 1 ; RF: NUMBER OF RAM FLOPPY UNITS (1-4) @@ -210,11 +222,14 @@ PPIDE2A8BIT .EQU FALSE ; PPIDE 2A (MASTER): 8 BIT XFER PPIDE2B8BIT .EQU FALSE ; PPIDE 0B (SLAVE): 8 BIT XFER ; SDENABLE .EQU FALSE ; SD: ENABLE SD CARD DISK DRIVER (SD.ASM) -SDMODE .EQU SDMODE_CSIO ; SD: DRIVER MODE: SDMODE_[JUHA|N8|CSIO|PPI|UART|DSD|MK4|SC|MT|USR] +SDMODE .EQU SDMODE_CSIO ; SD: DRIVER MODE: SDMODE_[JUHA|N8|CSIO|PPI|UART|DSD|MK4|SC|MT|PIO|Z80R|USR] SDPPIBASE .EQU RPH_PPI0 ; SD: BASE I/O ADDRESS OF PPI FOR PPI MODDE SDCNT .EQU 1 ; SD: NUMBER OF SD CARD DEVICES (1-2), FOR DSD/SC/MT ONLY SDTRACE .EQU 1 ; SD: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) SDCSIOFAST .EQU FALSE ; SD: ENABLE TABLE-DRIVEN BIT INVERTER IN CSIO MODE +SDMTSWAP .EQU FALSE ; SD: SWAP THE LOGICAL ORDER OF THE SPI PORTS OF THE MT011 +; +CHENABLE .EQU FALSE ; CH: ENABLE CH375/376 USB SUPPORT ; PRPENABLE .EQU FALSE ; PRP: ENABLE ECB PROPELLER IO BOARD DRIVER (PRP.ASM) PRPSDENABLE .EQU FALSE ; PRP: ENABLE PROPIO DRIVER SD CARD SUPPORT @@ -223,6 +238,8 @@ PRPCONENABLE .EQU FALSE ; PRP: ENABLE PROPIO DRIVER VIDEO/KBD SUPPORT ; PPPENABLE .EQU FALSE ; PPP: ENABLE ZETA PARALLEL PORT PROPELLER BOARD DRIVER (PPP.ASM) ; +ESPENABLE .EQU FALSE ; ESP: ENABLE ESP32 IO BOARD DRIVER (ESP.ASM) +; HDSKENABLE .EQU FALSE ; HDSK: ENABLE SIMH HDSK DISK DRIVER (HDSK.ASM) ; PIOENABLE .EQU FALSE ; PIO: ENABLE ZILOG PIO DRIVER (PIO.ASM) @@ -232,12 +249,18 @@ PIO1BASE .EQU $BC ; PIO 1: REGISTERS BASE ADR ; LPTENABLE .EQU FALSE ; LPT: ENABLE CENTRONICS PRINTER DRIVER (LPT.ASM) ; +PPAENABLE .EQU FALSE ; PPA: ENABLE PPA DISK DRIVER (PPA.ASM) +; +IMMENABLE .EQU FALSE ; IMM: ENABLE IMM DISK DRIVER (IMM.ASM) +; +SYQENABLE .EQU FALSE ; SYQ: ENABLE IMM DISK DRIVER (SYQ.ASM) +; PIO_4P .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB 4P BOARD PIO4BASE .EQU $90 ; PIO: PIO REGISTERS BASE ADR FOR ECB 4P BOARD PIO_ZP .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB ZILOG PERIPHERALS BOARD (PIO.ASM) PIOZBASE .EQU $88 ; PIO: PIO REGISTERS BASE ADR FOR ECB ZP BOARD PIO_SBC .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR 8255 CHIP -PIOSBASE .EQU RPH_PPI0 ; PIO: PIO REGISTERS BASE ADR FOR SBC PPI +PIOSBASE .EQU RPH_PPI0 ; PIO: PIO REGISTERS BASE ADR FOR SBC PPI ; UFENABLE .EQU FALSE ; UF: ENABLE ECB USB FIFO DRIVER (UF.ASM) FIFO_BASE .EQU $0C ; UF: REGISTERS BASE ADR @@ -255,7 +278,7 @@ SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM) ; DMAENABLE .EQU FALSE ; DMA: ENABLE DMA DRIVER (DMA.ASM) DMABASE .EQU $E0 ; DMA: DMA BASE ADDRESS -DMAMODE .EQU DMAMODE_Z180 ; DMA: DMA MODE (NONE|ECB|Z180|Z280|RC|MBC) +DMAMODE .EQU DMAMODE_Z180 ; DMA: DMA MODE (NONE|ECB|Z180|Z280|RC|MBC|DUO) ; -YM2612ENABLE .EQU FALSE ; YM2612: ENABLE YM2612 DRIVER (MUTE STUB) -VGMBASE .EQU $C0 ; YM2612: BASE ADDRESS FOR VGM BOARD (YM2612/SN76469s/CTC) +YM2612ENABLE .EQU FALSE ; YM2612: ENABLE YM2612 DRIVER +VGMBASE .EQU $C0 ; YM2612: BASE ADDRESS FOR VGM BOARD (YM2612/SN76489s/CTC) diff --git a/Source/HBIOS/cfg_s100.asm b/Source/HBIOS/cfg_s100.asm new file mode 100644 index 00000000..a22cdec1 --- /dev/null +++ b/Source/HBIOS/cfg_s100.asm @@ -0,0 +1,318 @@ +; +;================================================================================================== +; ROMWBW 3.X CONFIGURATION DEFAULTS FOR S100 Z180 +;================================================================================================== +; +; THIS FILE CONTAINS THE FULL SET OF DEFAULT CONFIGURATION SETTINGS FOR THE PLATFORM +; INDICATED ABOVE. THIS FILE SHOULD *NOT* NORMALLY BE CHANGED. INSTEAD, YOU SHOULD +; OVERRIDE ANY SETTINGS YOU WANT USING A CONFIGURATION FILE IN THE CONFIG DIRECTORY +; UNDER THIS DIRECTORY. +; +; THIS FILE CAN BE CONSIDERED A REFERENCE THAT LISTS ALL POSSIBLE CONFIGURATION SETTINGS +; FOR THE PLATFORM. +; +#DEFINE PLATFORM_NAME "S100", " [", CONFIG, "]" +; +#INCLUDE "hbios.inc" +; +PLATFORM .EQU PLT_S100 ; PLT_[SBC|ZETA|ZETA2|N8|MK4|UNA|RCZ80|RCZ180|EZZ80|SCZ180|DYNO|RCZ280|MBC|RPH|Z80RETRO|S100|DUO|HEATH|MON] +CPUFAM .EQU CPU_Z180 ; CPU FAMILY: CPU_[Z80|Z180|Z280] +BIOS .EQU BIOS_WBW ; HARDWARE BIOS: BIOS_[WBW|UNA] +BATCOND .EQU FALSE ; ENABLE LOW BATTERY WARNING MESSAGE +HBIOS_MUTEX .EQU FALSE ; ENABLE REENTRANT CALLS TO HBIOS (ADDS OVERHEAD) +USELZSA2 .EQU TRUE ; ENABLE FONT COMPRESSION +TICKFREQ .EQU 50 ; DESIRED PERIODIC TIMER INTERRUPT FREQUENCY (HZ) +; +BOOT_TIMEOUT .EQU -1 ; AUTO BOOT TIMEOUT IN SECONDS, -1 TO DISABLE, 0 FOR IMMEDIATE +BOOT_DELAY .EQU 0 ; FIXED BOOT DELAY IN SECONDS PRIOR TO CONSOLE OUTPUT +; +CPUSPDCAP .EQU SPD_FIXED ; CPU SPEED CHANGE CAPABILITY SPD_FIXED|SPD_HILO +CPUSPDDEF .EQU SPD_HIGH ; CPU SPEED DEFAULT SPD_UNSUP|SPD_HIGH|SPD_LOW +CPUOSC .EQU 18432000 ; CPU OSC FREQ IN MHZ +INTMODE .EQU 2 ; INTERRUPTS: 0=NONE, 1=MODE 1, 2=MODE 2, 3=MODE 3 (Z280) +DEFSERCFG .EQU SER_57600_8N1 | SER_RTS ; DEFAULT SERIAL LINE CONFIG (SEE STD.ASM) +; +RAMSIZE .EQU 512 ; SIZE OF RAM IN KB (MUST MATCH YOUR HARDWARE!!!) +ROMSIZE .EQU 512 ; SIZE OF ROM IN KB (MUST MATCH YOUR HARDWARE!!!) +MEMMGR .EQU MM_Z180 ; MEMORY MANAGER: MM_[SBC|Z2|N8|Z180|Z280|MBC|RPH|MON] +RAMBIAS .EQU ROMSIZE ; OFFSET OF START OF RAM IN PHYSICAL ADDRESS SPACE +MPGSEL_0 .EQU $78 ; Z2 MEM MGR BANK 0 PAGE SELECT REG (WRITE ONLY) +MPGSEL_1 .EQU $79 ; Z2 MEM MGR BANK 1 PAGE SELECT REG (WRITE ONLY) +MPGSEL_2 .EQU $7A ; Z2 MEM MGR BANK 2 PAGE SELECT REG (WRITE ONLY) +MPGSEL_3 .EQU $7B ; Z2 MEM MGR BANK 3 PAGE SELECT REG (WRITE ONLY) +MPGENA .EQU $7C ; Z2 MEM MGR PAGING ENABLE REGISTER (BIT 0, WRITE ONLY) +; +Z180_BASE .EQU $C0 ; Z180: I/O BASE ADDRESS FOR INTERNAL REGISTERS +Z180_CLKDIV .EQU 1 ; Z180: CHK DIV: 0=OSC/2, 1=OSC, 2=OSC*2 +Z180_MEMWAIT .EQU 1 ; Z180: MEMORY WAIT STATES (0-3) +Z180_IOWAIT .EQU 2 ; Z180: I/O WAIT STATES TO ADD ABOVE 1 W/S BUILT-IN (0-3) +Z180_TIMER .EQU TRUE ; Z180: ENABLE Z180 SYSTEM PERIODIC TIMER +; +RTCIO .EQU $0C ; RTC LATCH REGISTER ADR +; +KIOENABLE .EQU FALSE ; ENABLE ZILOG KIO SUPPORT +KIOBASE .EQU $80 ; KIO BASE I/O ADDRESS +; +CTCENABLE .EQU FALSE ; ENABLE ZILOG CTC SUPPORT +CTCDEBUG .EQU FALSE ; ENABLE CTC DRIVER DEBUG OUTPUT +CTCBASE .EQU $88 ; CTC BASE I/O ADDRESS +CTCTIMER .EQU FALSE ; ENABLE CTC PERIODIC TIMER +; +PCFENABLE .EQU FALSE ; ENABLE PCF8584 I2C CONTROLLER +PCFBASE .EQU $F0 ; PCF8584 BASE I/O ADDRESS +; +EIPCENABLE .EQU FALSE ; EIPC: ENABLE Z80 EIPC (Z84C15) INITIALIZATION +; +SKZENABLE .EQU FALSE ; ENABLE SERGEY'S Z80-512K FEATURES +; +WDOGMODE .EQU WDOG_NONE ; WATCHDOG MODE: WDOG_[NONE|EZZ80|SKZ] +; +FPLED_ENABLE .EQU TRUE ; FP: ENABLES FRONT PANEL LEDS +FPLED_IO .EQU $00 ; FP: PORT ADDRESS FOR FP LEDS +FPLED_DSKACT .EQU TRUE ; FP: ENABLES DISK I/O ACTIVITY ON FP LEDS +FPSW_ENABLE .EQU FALSE ; FP: ENABLES FRONT PANEL SWITCHES +FPSW_IO .EQU $00 ; FP: PORT ADDRESS FOR FP SWITCHES +; +DIAGLVL .EQU DL_CRITICAL ; ERROR LEVEL REPORTING +; +LEDENABLE .EQU TRUE ; ENABLES STATUS LED (SINGLE LED) +LEDMODE .EQU LEDMODE_STD ; LEDMODE_[STD|RTC] +LEDPORT .EQU $0E ; STATUS LED PORT ADDRESS +LEDDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON STATUS LED +; +DSKYENABLE .EQU FALSE ; ENABLES DSKY FUNCTIONALITY +DSKYDSKACT .EQU TRUE ; ENABLES DISK ACTIVITY ON DSKY DISPLAY +ICMENABLE .EQU FALSE ; ENABLES ORIGINAL DSKY ICM DRIVER (7218) +ICMPPIBASE .EQU $60 ; BASE I/O ADDRESS OF ICM PPI +PKDENABLE .EQU FALSE ; ENABLES DSKY NG PKD DRIVER (8259) +PKDPPIBASE .EQU $60 ; BASE I/O ADDRESS OF PKD PPI +PKDOSC .EQU 3000000 ; OSCILLATOR FREQ FOR PKD (IN HZ) +H8PENABLE .EQU FALSE ; ENABLES HEATH H8 FRONT PANEL +; +BOOTCON .EQU 0 ; BOOT CONSOLE DEVICE +SECCON .EQU $FF ; SECONDARY CONSOLE DEVICE +CRTACT .EQU FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP +VDAEMU .EQU EMUTYP_ANSI ; VDA EMULATION: EMUTYP_[TTY|ANSI] +VDAEMU_SERKBD .EQU $FF ; VDA EMULATION: SERIAL KBD UNIT #, OR $FF FOR HW KBD +ANSITRACE .EQU 1 ; ANSI DRIVER TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +PPKTRACE .EQU 1 ; PPK DRIVER TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +KBDTRACE .EQU 1 ; KBD DRIVER TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +PPKKBLOUT .EQU KBD_US ; PPK KEYBOARD LANGUAGE: KBD_[US|DE] +KBDKBLOUT .EQU KBD_US ; KBD KEYBOARD LANGUAGE: KBD_[US|DE] +MKYENABLE .EQU FALSE ; MSX 5255 PPI KEYBOARD COMPATIBLE DRIVER (REQUIRES TMS VDA DRIVER) +MKYKBLOUT .EQU KBD_US ; KBD KEYBOARD LANGUAGE: KBD_[US|DE] +; +DSRTCENABLE .EQU TRUE ; DSRTC: ENABLE DS-1302 CLOCK DRIVER (DSRTC.ASM) +DSRTCMODE .EQU DSRTCMODE_STD ; DSRTC: OPERATING MODE: DSRTC_[STD|MFPIC] +DSRTCCHG .EQU FALSE ; DSRTC: FORCE BATTERY CHARGE ON (USE WITH CAUTION!!!) +; +DS1501RTCENABLE .EQU FALSE ; DS1501RTC: ENABLE DS-1501 CLOCK DRIVER (DS1501RTC.ASM) +DS1501RTC_BASE .EQU $50 ; DS1501RTC: I/O BASE ADDRESS +; +BQRTCENABLE .EQU FALSE ; BQRTC: ENABLE BQ4845 CLOCK DRIVER (BQRTC.ASM) +BQRTC_BASE .EQU $50 ; BQRTC: I/O BASE ADDRESS +; +INTRTCENABLE .EQU FALSE ; ENABLE PERIODIC INTERRUPT CLOCK DRIVER (INTRTC.ASM) +; +RP5RTCENABLE .EQU FALSE ; RP5C01 RTC BASED CLOCK (RP5RTC.ASM) +; +HTIMENABLE .EQU FALSE ; ENABLE SIMH TIMER SUPPORT +SIMRTCENABLE .EQU FALSE ; ENABLE SIMH CLOCK DRIVER (SIMRTC.ASM) +; +DS7RTCENABLE .EQU FALSE ; DS7RTC: ENABLE DS-1307 I2C CLOCK DRIVER (DS7RTC.ASM) +DS7RTCMODE .EQU DS7RTCMODE_PCF ; DS7RTC: OPERATING MODE: DS7RTC_[PCF] +; +DUARTENABLE .EQU FALSE ; DUART: ENABLE 2681/2692 SERIAL DRIVER (DUART.ASM) +DUARTCNT .EQU 1 ; DUART: NUMBER OF CHIPS TO DETECT (1-2) +DUART0BASE .EQU $A0 ; DUART 0: BASE ADDRESS OF CHIP +DUART0ACFG .EQU DEFSERCFG ; DUART 0A: SERIAL LINE CONFIG +DUART0BCFG .EQU DEFSERCFG ; DUART 0B: SERIAL LINE CONFIG +DUART1BASE .EQU $40 ; DUART 1: BASE ADDRESS OF CHIP +DUART1ACFG .EQU DEFSERCFG ; DUART 1A: SERIAL LINE CONFIG +DUART1BCFG .EQU DEFSERCFG ; DUART 1B: SERIAL LINE CONFIG +; +UARTENABLE .EQU FALSE ; UART: ENABLE 8250/16550-LIKE SERIAL DRIVER (UART.ASM) +UARTOSC .EQU 1843200 ; UART: OSC FREQUENCY IN MHZ +UARTINTS .EQU FALSE ; UART: INCLUDE INTERRUPT SUPPORT UNDER IM1/2/3 +UARTCFG .EQU DEFSERCFG | SER_RTS ; UART: LINE CONFIG FOR UART PORTS +UARTSBC .EQU FALSE ; UART: AUTO-DETECT SBC/ZETA/DUO ONBOARD UART +UARTSBCFORCE .EQU FALSE ; UART: FORCE DETECTION OF SBC UART (FOR SIMH) +UARTAUX .EQU FALSE ; UART: AUTO-DETECT AUX UART +UARTCAS .EQU FALSE ; UART: AUTO-DETECT ECB CASSETTE UART +UARTMFP .EQU FALSE ; UART: AUTO-DETECT MF/PIC UART +UART4 .EQU FALSE ; UART: AUTO-DETECT 4UART UART +UARTRC .EQU TRUE ; UART: AUTO-DETECT RC UART +UARTDUAL .EQU FALSE ; UART: AUTO-DETECT DUAL UART +; +ASCIENABLE .EQU TRUE ; ASCI: ENABLE Z180 ASCI SERIAL DRIVER (ASCI.ASM) +ASCIINTS .EQU TRUE ; ASCI: INCLUDE INTERRUPT SUPPORT UNDER IM1/2/3 +ASCISWAP .EQU FALSE ; ASCI: SWAP CHANNELS +ASCIBOOT .EQU 0 ; ASCI: REBOOT ON RCV CHAR (0=DISABLED) +ASCI0CFG .EQU DEFSERCFG ; ASCI 0: SERIAL LINE CONFIG +ASCI1CFG .EQU DEFSERCFG ; ASCI 1: SERIAL LINE CONFIG +; +Z2UENABLE .EQU FALSE ; Z2U: ENABLE Z280 UART SERIAL DRIVER (Z2U.ASM) +; +ACIAENABLE .EQU FALSE ; ACIA: ENABLE MOTOROLA 6850 ACIA DRIVER (ACIA.ASM) +; +SIOENABLE .EQU FALSE ; SIO: ENABLE ZILOG SIO SERIAL DRIVER (SIO.ASM) +SIODEBUG .EQU FALSE ; SIO: ENABLE DEBUG OUTPUT +SIOBOOT .EQU 0 ; SIO: REBOOT ON RCV CHAR (0=DISABLED) +SIOCNT .EQU 2 ; SIO: NUMBER OF CHIPS TO DETECT (1-2), 2 CHANNELS PER CHIP +SIO0MODE .EQU SIOMODE_RC ; SIO 0: CHIP TYPE: SIOMODE_[STD|RC|SMB|ZP|Z80R] +SIO0BASE .EQU $80 ; SIO 0: REGISTERS BASE ADR +SIO0ACLK .EQU 7372800 ; SIO 0A: OSC FREQ IN HZ, ZP=2457600/4915200, RC/SMB=7372800 +SIO0ACFG .EQU SER_115200_8N1 ; SIO 0A: SERIAL LINE CONFIG +SIO0ACTCC .EQU -1 ; SIO 0A: CTC CHANNEL 0=A, 1=B, 2=C, 3=D, -1 FOR NONE +SIO0BCLK .EQU 7372800 ; SIO 0B: OSC FREQ IN HZ, ZP=2457600/4915200, RC/SMB=7372800 +SIO0BCFG .EQU SER_115200_8N1 ; SIO 0B: SERIAL LINE CONFIG +SIO0BCTCC .EQU -1 ; SIO 0B: CTC CHANNEL 0=A, 1=B, 2=C, 3=D, -1 FOR NONE +SIO1MODE .EQU SIOMODE_RC ; SIO 1: CHIP TYPE: SIOMODE_[STD|RC|SMB|ZP|Z80R] +SIO1BASE .EQU $84 ; SIO 1: REGISTERS BASE ADR +SIO1ACLK .EQU 7372800 ; SIO 1A: OSC FREQ IN HZ, ZP=2457600/4915200, RC/SMB=7372800 +SIO1ACFG .EQU SER_115200_8N1 ; SIO 1A: SERIAL LINE CONFIG +SIO1ACTCC .EQU -1 ; SIO 1A: CTC CHANNEL 0=A, 1=B, 2=C, 3=D, -1 FOR NONE +SIO1BCLK .EQU 7372800 ; SIO 1B: OSC FREQ IN HZ, ZP=2457600/4915200, RC/SMB=7372800 +SIO1BCFG .EQU SER_115200_8N1 ; SIO 1B: SERIAL LINE CONFIG +SIO1BCTCC .EQU -1 ; SIO 1B: CTC CHANNEL 0=A, 1=B, 2=C, 3=D, -1 FOR NONE +; +XIOCFG .EQU DEFSERCFG ; XIO: SERIAL LINE CONFIG +; +VDUENABLE .EQU FALSE ; VDU: ENABLE VDU VIDEO/KBD DRIVER (VDU.ASM) +CVDUENABLE .EQU FALSE ; CVDU: ENABLE CVDU VIDEO/KBD DRIVER (CVDU.ASM) +GDCENABLE .EQU FALSE ; GDC: ENABLE 7220 GDC VIDEO/KBD DRIVER (GDC.ASM) +TMSENABLE .EQU FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM) +TMSMODE .EQU TMSMODE_MSX ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|MSX9958|MSXKBD|COLECO] +TMSTIMENABLE .EQU FALSE ; TMS: ENABLE TIMER INTERRUPTS (REQUIRES IM1) +VGAENABLE .EQU FALSE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM) +VRCENABLE .EQU FALSE ; VRC: ENABLE VGARC VIDEO/KBD DRIVER (VRC.ASM) +SCONENABLE .EQU FALSE ; SCON: ENABLE S100 CONSOLE DRIVER (SCON.ASM) +; +MDENABLE .EQU TRUE ; MD: ENABLE MEMORY (ROM/RAM) DISK DRIVER (MD.ASM) +MDROM .EQU TRUE ; MD: ENABLE ROM DISK +MDRAM .EQU TRUE ; MD: ENABLE RAM DISK +MDTRACE .EQU 1 ; MD: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +MDFFENABLE .EQU FALSE ; MD: ENABLE FLASH FILE SYSTEM +; +FDENABLE .EQU FALSE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM) +FDMODE .EQU FDMODE_RCWDC ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPFDC|MBC] +FDCNT .EQU 2 ; FD: NUMBER OF FLOPPY DRIVES ON THE INTERFACE (1-2) +FDTRACE .EQU 1 ; FD: TRACE LEVEL (0=NO,1=FATAL,2=ERRORS,3=ALL) +FDMAUTO .EQU TRUE ; FD: AUTO SELECT DEFAULT/ALTERNATE MEDIA FORMATS +FD0TYPE .EQU FDT_3HD ; FD 0: DRIVE TYPE: FDT_[3DD|3HD|5DD|5HD|8] +FD1TYPE .EQU FDT_3HD ; FD 1: DRIVE TYPE: FDT_[3DD|3HD|5DD|5HD|8] +; +RFENABLE .EQU FALSE ; RF: ENABLE RAM FLOPPY DRIVER +; +IDEENABLE .EQU FALSE ; IDE: ENABLE IDE DISK DRIVER (IDE.ASM) +IDETRACE .EQU 1 ; IDE: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +IDECNT .EQU 1 ; IDE: NUMBER OF IDE INTERFACES TO DETECT (1-3), 2 DRIVES EACH +IDE0MODE .EQU IDEMODE_RC ; IDE 0: DRIVER MODE: IDEMODE_[DIO|DIDE|MK4|RC] +IDE0BASE .EQU $10 ; IDE 0: IO BASE ADDRESS +IDE0DATLO .EQU $00 ; IDE 0: DATA LO PORT FOR 16-BIT I/O +IDE0DATHI .EQU $00 ; IDE 0: DATA HI PORT FOR 16-BIT I/O +IDE0A8BIT .EQU TRUE ; IDE 0A (MASTER): 8 BIT XFER +IDE0B8BIT .EQU TRUE ; IDE 0B (MASTER): 8 BIT XFER +IDE1MODE .EQU IDEMODE_NONE ; IDE 1: DRIVER MODE: IDEMODE_[DIO|DIDE|MK4|RC] +IDE1BASE .EQU $00 ; IDE 1: IO BASE ADDRESS +IDE1DATLO .EQU $00 ; IDE 1: DATA LO PORT FOR 16-BIT I/O +IDE1DATHI .EQU $00 ; IDE 1: DATA HI PORT FOR 16-BIT I/O +IDE1A8BIT .EQU TRUE ; IDE 1A (MASTER): 8 BIT XFER +IDE1B8BIT .EQU TRUE ; IDE 1B (MASTER): 8 BIT XFER +IDE2MODE .EQU IDEMODE_NONE ; IDE 2: DRIVER MODE: IDEMODE_[DIO|DIDE|MK4|RC] +IDE2BASE .EQU $00 ; IDE 2: IO BASE ADDRESS +IDE2DATLO .EQU $00 ; IDE 2: DATA LO PORT FOR 16-BIT I/O +IDE2DATHI .EQU $00 ; IDE 2: DATA HI PORT FOR 16-BIT I/O +IDE2A8BIT .EQU TRUE ; IDE 2A (MASTER): 8 BIT XFER +IDE2B8BIT .EQU TRUE ; IDE 2B (MASTER): 8 BIT XFER +; +PPIDEENABLE .EQU FALSE ; PPIDE: ENABLE PARALLEL PORT IDE DISK DRIVER (PPIDE.ASM) +PPIDETRACE .EQU 1 ; PPIDE: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +PPIDECNT .EQU 1 ; PPIDE: NUMBER OF PPI CHIPS TO DETECT (1-3), 2 DRIVES PER CHIP +PPIDE0BASE .EQU $20 ; PPIDE 0: PPI REGISTERS BASE ADR +PPIDE0A8BIT .EQU FALSE ; PPIDE 0A (MASTER): 8 BIT XFER +PPIDE0B8BIT .EQU FALSE ; PPIDE 0B (SLAVE): 8 BIT XFER +PPIDE1BASE .EQU $00 ; PPIDE 1: PPI REGISTERS BASE ADR +PPIDE1A8BIT .EQU FALSE ; PPIDE 1A (MASTER): 8 BIT XFER +PPIDE1B8BIT .EQU FALSE ; PPIDE 0B (SLAVE): 8 BIT XFER +PPIDE2BASE .EQU $00 ; PPIDE 2: PPI REGISTERS BASE ADR +PPIDE2A8BIT .EQU FALSE ; PPIDE 2A (MASTER): 8 BIT XFER +PPIDE2B8BIT .EQU FALSE ; PPIDE 0B (SLAVE): 8 BIT XFER +; +SDENABLE .EQU TRUE ; SD: ENABLE SD CARD DISK DRIVER (SD.ASM) +SDMODE .EQU SDMODE_SC ; SD: DRIVER MODE: SDMODE_[JUHA|N8|CSIO|PPI|UART|DSD|MK4|SC|MT|PIO|Z80R|USR] +SDPPIBASE .EQU $60 ; SD: BASE I/O ADDRESS OF PPI FOR PPI MODDE +SDCNT .EQU 1 ; SD: NUMBER OF SD CARD DEVICES (1-2), FOR DSD/SC/MT ONLY +SDTRACE .EQU 1 ; SD: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +SDCSIOFAST .EQU FALSE ; SD: ENABLE TABLE-DRIVEN BIT INVERTER IN CSIO MODE +SDMTSWAP .EQU FALSE ; SD: SWAP THE LOGICAL ORDER OF THE SPI PORTS OF THE MT011 +; +CHENABLE .EQU FALSE ; CH: ENABLE CH375/376 USB SUPPORT +; +PRPENABLE .EQU FALSE ; PRP: ENABLE ECB PROPELLER IO BOARD DRIVER (PRP.ASM) +PRPSDENABLE .EQU TRUE ; PRP: ENABLE PROPIO DRIVER SD CARD SUPPORT +PRPSDTRACE .EQU 1 ; PRP: SD CARD TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +PRPCONENABLE .EQU TRUE ; PRP: ENABLE PROPIO DRIVER VIDEO/KBD SUPPORT +; +PPPENABLE .EQU FALSE ; PPP: ENABLE ZETA PARALLEL PORT PROPELLER BOARD DRIVER (PPP.ASM) +; +ESPENABLE .EQU FALSE ; ESP: ENABLE ESP32 IO BOARD DRIVER (ESP.ASM) +; +HDSKENABLE .EQU FALSE ; HDSK: ENABLE SIMH HDSK DISK DRIVER (HDSK.ASM) +; +PIOENABLE .EQU FALSE ; PIO: ENABLE ZILOG PIO DRIVER (PIO.ASM) +PIOCNT .EQU 2 ; PIO: NUMBER OF CHIPS TO DETECT (1-2), 2 CHANNELS PER CHIP +PIO0BASE .EQU $B8 ; PIO 0: REGISTERS BASE ADR +PIO1BASE .EQU $BC ; PIO 1: REGISTERS BASE ADR +; +LPTENABLE .EQU FALSE ; LPT: ENABLE CENTRONICS PRINTER DRIVER (LPT.ASM) +LPTMODE .EQU LPTMODE_MG014 ; LPT: DRIVER MODE: LPTMODE_[NONE|SPP|MG014] +LPTCNT .EQU 1 ; LPT: NUMBER OF CHIPS TO DETECT (1-2) +LPTTRACE .EQU 1 ; LPT: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +LPT0BASE .EQU $18 ; LPT 0: REGISTERS BASE ADR +LPT1BASE .EQU $00 ; LPT 1: REGISTERS BASE ADR +; +PPAENABLE .EQU FALSE ; PPA: ENABLE PPA DISK DRIVER (PPA.ASM) +PPACNT .EQU 1 ; PPA: NUMBER OF PPA DEVICES (1-2) +PPATRACE .EQU 1 ; PPA: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +PPAMODE .EQU PPAMODE_MG014 ; PPA: DRIVER MODE: PPAMODE_[NONE|SPP|MG014] +PPA0BASE .EQU LPT0BASE ; PPA 0: BASE I/O ADDRESS OF PPI FOR PPA +PPA1BASE .EQU LPT1BASE ; PPA 1: BASE I/O ADDRESS OF PPI FOR PPA +; +IMMENABLE .EQU FALSE ; IMM: ENABLE IMM DISK DRIVER (IMM.ASM) +IMMCNT .EQU 1 ; IMM: NUMBER OF IMM DEVICES (1-2) +IMMTRACE .EQU 1 ; IMM: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +IMMMODE .EQU IMMMODE_MG014 ; IMM: DRIVER MODE: IMMMODE_[NONE|SPP|MG014] +IMM0BASE .EQU LPT0BASE ; IMM 0: BASE I/O ADDRESS OF PPI FOR IMM +IMM1BASE .EQU LPT1BASE ; IMM 1: BASE I/O ADDRESS OF PPI FOR IMM +; +SYQENABLE .EQU FALSE ; SYQ: ENABLE IMM DISK DRIVER (SYQ.ASM) +SYQCNT .EQU 1 ; SYQ: NUMBER OF SYQ DEVICES (1-2) +SYQTRACE .EQU 1 ; SYQ: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +SYQMODE .EQU IMMMODE_MG014 ; SYQ: DRIVER MODE: SYQMODE_[NONE|SPP|MG014] +SYQ0BASE .EQU LPT0BASE ; SYQ 0: BASE I/O ADDRESS OF PPI FOR SYQ +SYQ1BASE .EQU LPT1BASE ; SYQ 1: BASE I/O ADDRESS OF PPI FOR SYQ +; +PIO_4P .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB 4P BOARD +PIO_ZP .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB ZILOG PERIPHERALS BOARD (PIO.ASM) +PIO_SBC .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR 8255 CHIP +; +UFENABLE .EQU FALSE ; UF: ENABLE ECB USB FIFO DRIVER (UF.ASM) +; +SN76489ENABLE .EQU FALSE ; SN: ENABLE SN76489 SOUND DRIVER +AUDIOTRACE .EQU FALSE ; ENABLE TRACING TO CONSOLE OF SOUND DRIVER +SN7CLK .EQU 3579545 ; SN: PSG CLOCK FREQ, ASSUME MSX STD +SNMODE .EQU SNMODE_RC ; SN: DRIVER MODE: SNMODE_[NONE|RC|VGM] +; +AY38910ENABLE .EQU FALSE ; AY: ENABLE AY-3-8910 / YM2149 SOUND DRIVER +AY_CLK .EQU 1789772 ; AY: PSG CLOCK FREQ, ASSUME MSX STD +AYMODE .EQU AYMODE_RCZ180 ; AY: DRIVER MODE: AYMODE_[SCG|N8|RCZ80|RCZ180|MSX|LINC|MBC] +; +SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM) +; +DMAENABLE .EQU FALSE ; DMA: ENABLE DMA DRIVER (DMA.ASM) +DMABASE .EQU $E0 ; DMA: DMA BASE ADDRESS +DMAMODE .EQU DMAMODE_Z180 ; DMA: DMA MODE (NONE|ECB|Z180|Z280|RC|MBC|DUO) +; +YM2612ENABLE .EQU FALSE ; YM2612: ENABLE YM2612 DRIVER +VGMBASE .EQU $C0 ; YM2612: BASE ADDRESS FOR VGM BOARD (YM2612/SN76489s/CTC) diff --git a/Source/HBIOS/cfg_sbc.asm b/Source/HBIOS/cfg_sbc.asm index 1a5eedbe..fd2b8deb 100644 --- a/Source/HBIOS/cfg_sbc.asm +++ b/Source/HBIOS/cfg_sbc.asm @@ -1,6 +1,6 @@ ; ;================================================================================================== -; ROMWBW 2.X CONFIGURATION DEFAULTS FOR SBC +; ROMWBW 3.X CONFIGURATION DEFAULTS FOR SBC ;================================================================================================== ; ; THIS FILE CONTAINS THE FULL SET OF DEFAULT CONFIGURATION SETTINGS FOR THE PLATFORM @@ -15,7 +15,7 @@ ; #INCLUDE "hbios.inc" ; -PLATFORM .EQU PLT_SBC ; PLT_[SBC|ZETA|ZETA2|N8|MK4|UNA|RCZ80|RCZ180|EZZ80|SCZ180|DYNO|RCZ280|MBC|RPH] +PLATFORM .EQU PLT_SBC ; PLT_[SBC|ZETA|ZETA2|N8|MK4|UNA|RCZ80|RCZ180|EZZ80|SCZ180|DYNO|RCZ280|MBC|RPH|Z80RETRO|S100|DUO|HEATH|MON] CPUFAM .EQU CPU_Z80 ; CPU FAMILY: CPU_[Z80|Z180|Z280] BIOS .EQU BIOS_WBW ; HARDWARE BIOS: BIOS_[WBW|UNA] BATCOND .EQU FALSE ; ENABLE LOW BATTERY WARNING MESSAGE @@ -30,12 +30,11 @@ CPUSPDCAP .EQU SPD_FIXED ; CPU SPEED CHANGE CAPABILITY SPD_FIXED|SPD_HILO CPUSPDDEF .EQU SPD_HIGH ; CPU SPEED DEFAULT SPD_UNSUP|SPD_HIGH|SPD_LOW CPUOSC .EQU 8000000 ; CPU OSC FREQ IN MHZ INTMODE .EQU 0 ; INTERRUPTS: 0=NONE, 1=MODE 1, 2=MODE 2, 3=MODE 3 (Z280) -DEFSERCFG .EQU SER_38400_8N1 ; DEFAULT SERIAL LINE CONFIG (SEE STD.ASM) +DEFSERCFG .EQU SER_38400_8N1 | SER_RTS ; DEFAULT SERIAL LINE CONFIG (SEE STD.ASM) ; RAMSIZE .EQU 512 ; SIZE OF RAM IN KB (MUST MATCH YOUR HARDWARE!!!) ROMSIZE .EQU 512 ; SIZE OF ROM IN KB (MUST MATCH YOUR HARDWARE!!!) -ROMSIZE_CHK .EQU 0 ; ROMSIZE VALUE VERIFICATION (0=DISABLED) -MEMMGR .EQU MM_SBC ; MEMORY MANAGER: MM_[SBC|Z2|N8|Z180|Z280|MBC|RPH] +MEMMGR .EQU MM_SBC ; MEMORY MANAGER: MM_[SBC|Z2|N8|Z180|Z280|MBC|RPH|MON] MPCL_RAM .EQU $78 ; SBC MEM MGR RAM PAGE SELECT REG (WRITE ONLY) MPCL_ROM .EQU $7C ; SBC MEM MGR ROM PAGE SELECT REG (WRITE ONLY) ; @@ -54,15 +53,21 @@ CTCPRECH .EQU 2 ; PRESCALE CHANNEL (0-3) CTCTIMCH .EQU 3 ; TIMER CHANNEL (0-3) CTCOSC .EQU 614400 ; CTC CLOCK FREQUENCY ; +PCFENABLE .EQU FALSE ; ENABLE PCF8584 I2C CONTROLLER +PCFBASE .EQU $F0 ; PCF8584 BASE I/O ADDRESS +; EIPCENABLE .EQU FALSE ; EIPC: ENABLE Z80 EIPC (Z84C15) INITIALIZATION ; SKZENABLE .EQU FALSE ; ENABLE SERGEY'S Z80-512K FEATURES ; WDOGMODE .EQU WDOG_NONE ; WATCHDOG MODE: WDOG_[NONE|EZZ80|SKZ] ; -DIAGENABLE .EQU FALSE ; ENABLES OUTPUT TO 8 BIT LED DIAGNOSTIC PORT -DIAGPORT .EQU $00 ; DIAGNOSTIC PORT ADDRESS -DIAGDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON DIAGNOSTIC LEDS +FPLED_ENABLE .EQU FALSE ; FP: ENABLES FRONT PANEL LEDS +FPLED_IO .EQU $00 ; FP: PORT ADDRESS FOR FP LEDS +FPLED_DSKACT .EQU TRUE ; FP: ENABLES DISK I/O ACTIVITY ON FP LEDS +FPSW_ENABLE .EQU FALSE ; FP: ENABLES FRONT PANEL SWITCHES +FPSW_IO .EQU $00 ; FP: PORT ADDRESS FOR FP SWITCHES +; DIAGLVL .EQU DL_CRITICAL ; ERROR LEVEL REPORTING ; LEDENABLE .EQU FALSE ; ENABLES STATUS LED @@ -70,12 +75,17 @@ LEDMODE .EQU LEDMODE_RTC ; LEDMODE_[STD|RTC] LEDPORT .EQU RTCIO ; STATUS LED PORT ADDRESS LEDDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON STATUS LED ; -DSKYENABLE .EQU FALSE ; ENABLES DSKY -DSKYMODE .EQU DSKYMODE_V1 ; DSKY VERSION: DSKYMODE_[V1|NG] -DSKYPPIBASE .EQU $60 ; BASE I/O ADDRESS OF DSKY PPI -DSKYOSC .EQU 3000000 ; OSCILLATOR FREQ FOR DSKYNG (IN HZ) +DSKYENABLE .EQU FALSE ; ENABLES DSKY FUNCTIONALITY +DSKYDSKACT .EQU TRUE ; ENABLES DISK ACTIVITY ON DSKY DISPLAY +ICMENABLE .EQU FALSE ; ENABLES ORIGINAL DSKY ICM DRIVER (7218) +ICMPPIBASE .EQU $60 ; BASE I/O ADDRESS OF ICM PPI +PKDENABLE .EQU FALSE ; ENABLES DSKY NG PKD DRIVER (8259) +PKDPPIBASE .EQU $60 ; BASE I/O ADDRESS OF PKD PPI +PKDOSC .EQU 3000000 ; OSCILLATOR FREQ FOR PKD (IN HZ) +H8PENABLE .EQU FALSE ; ENABLES HEATH H8 FRONT PANEL ; BOOTCON .EQU 0 ; BOOT CONSOLE DEVICE +SECCON .EQU $FF ; SECONDARY CONSOLE DEVICE CRTACT .EQU FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP VDAEMU .EQU EMUTYP_ANSI ; VDA EMULATION: EMUTYP_[TTY|ANSI] VDAEMU_SERKBD .EQU $FF ; VDA EMULATION: SERIAL KBD UNIT #, OR $FF FOR HW KBD @@ -114,8 +124,9 @@ UARTOSC .EQU 1843200 ; UART: OSC FREQUENCY IN MHZ UARTINTS .EQU FALSE ; UART: INCLUDE INTERRUPT SUPPORT UNDER IM1/2/3 UARTCFG .EQU DEFSERCFG ; UART: LINE CONFIG FOR UART PORTS UARTCASSPD .EQU SER_300_8N1 ; UART: ECB CASSETTE UART DEFAULT SPEED -UARTSBC .EQU TRUE ; UART: AUTO-DETECT SBC/ZETA ONBOARD UART +UARTSBC .EQU TRUE ; UART: AUTO-DETECT SBC/ZETA/DUO ONBOARD UART UARTSBCFORCE .EQU FALSE ; UART: FORCE DETECTION OF SBC UART (FOR SIMH) +UARTAUX .EQU FALSE ; UART: AUTO-DETECT AUX UART UARTCAS .EQU TRUE ; UART: AUTO-DETECT ECB CASSETTE UART UARTMFP .EQU TRUE ; UART: AUTO-DETECT MF/PIC UART UART4 .EQU TRUE ; UART: AUTO-DETECT 4UART UART @@ -132,7 +143,7 @@ SIOENABLE .EQU TRUE ; SIO: ENABLE ZILOG SIO SERIAL DRIVER (SIO.ASM) SIODEBUG .EQU FALSE ; SIO: ENABLE DEBUG OUTPUT SIOBOOT .EQU 0 ; SIO: REBOOT ON RCV CHAR (0=DISABLED) SIOCNT .EQU 1 ; SIO: NUMBER OF CHIPS TO DETECT (1-2), 2 CHANNELS PER CHIP -SIO0MODE .EQU SIOMODE_ZP ; SIO 0: CHIP TYPE: SIOMODE_[STD|RC|SMB|ZP] +SIO0MODE .EQU SIOMODE_ZP ; SIO 0: CHIP TYPE: SIOMODE_[STD|RC|SMB|ZP|Z80R] SIO0BASE .EQU $B0 ; SIO 0: REGISTERS BASE ADR SIO0ACLK .EQU (4915200/8) ; SIO 0A: OSC FREQ IN HZ, ZP=2457600/4915200, RC/SMB=7372800 SIO0ACFG .EQU DEFSERCFG ; SIO 0A: SERIAL LINE CONFIG @@ -154,6 +165,8 @@ TMSMODE .EQU TMSMODE_SCG ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|MSX9958|MS TMSTIMENABLE .EQU FALSE ; TMS: ENABLE TIMER INTERRUPTS (REQUIRES IM1) VGAENABLE .EQU FALSE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM) VGASIZ .EQU V80X25 ; VGA: DISPLAY FORMAT [V80X25|V80X30|V80X43] +VRCENABLE .EQU FALSE ; VRC: ENABLE VGARC VIDEO/KBD DRIVER (VRC.ASM) +SCONENABLE .EQU FALSE ; SCON: ENABLE S100 CONSOLE DRIVER (SCON.ASM) ; MDENABLE .EQU TRUE ; MD: ENABLE MEMORY (ROM/RAM) DISK DRIVER (MD.ASM) MDROM .EQU TRUE ; MD: ENABLE ROM DISK @@ -161,14 +174,13 @@ MDRAM .EQU TRUE ; MD: ENABLE RAM DISK MDTRACE .EQU 1 ; MD: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) MDFFENABLE .EQU FALSE ; MD: ENABLE FLASH FILE SYSTEM ; -; FDENABLE .EQU FALSE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM) FDMODE .EQU FDMODE_DIO3 ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPFDC|MBC] FDCNT .EQU 2 ; FD: NUMBER OF FLOPPY DRIVES ON THE INTERFACE (1-2) FDTRACE .EQU 1 ; FD: TRACE LEVEL (0=NO,1=FATAL,2=ERRORS,3=ALL) -FDMEDIA .EQU FDM144 ; FD: DEFAULT MEDIA FORMAT FDM[720|144|360|120|111] -FDMEDIAALT .EQU FDM720 ; FD: ALTERNATE MEDIA FORMAT FDM[720|144|360|120|111] FDMAUTO .EQU TRUE ; FD: AUTO SELECT DEFAULT/ALTERNATE MEDIA FORMATS +FD0TYPE .EQU FDT_3HD ; FD 0: DRIVE TYPE: FDT_[3DD|3HD|5DD|5HD|8] +FD1TYPE .EQU FDT_3HD ; FD 1: DRIVE TYPE: FDT_[3DD|3HD|5DD|5HD|8] ; RFENABLE .EQU FALSE ; RF: ENABLE RAM FLOPPY DRIVER RFCNT .EQU 1 ; RF: NUMBER OF RAM FLOPPY UNITS (1-4) @@ -209,11 +221,14 @@ PPIDE2A8BIT .EQU FALSE ; PPIDE 2A (MASTER): 8 BIT XFER PPIDE2B8BIT .EQU FALSE ; PPIDE 0B (SLAVE): 8 BIT XFER ; SDENABLE .EQU FALSE ; SD: ENABLE SD CARD DISK DRIVER (SD.ASM) -SDMODE .EQU SDMODE_JUHA ; SD: DRIVER MODE: SDMODE_[JUHA|N8|CSIO|PPI|UART|DSD|MK4|SC|MT|USR] +SDMODE .EQU SDMODE_JUHA ; SD: DRIVER MODE: SDMODE_[JUHA|N8|CSIO|PPI|UART|DSD|MK4|SC|MT|PIO|Z80R|USR] SDPPIBASE .EQU $60 ; SD: BASE I/O ADDRESS OF PPI FOR PPI MODDE SDCNT .EQU 1 ; SD: NUMBER OF SD CARD DEVICES (1-2), FOR DSD/SC/MT ONLY SDTRACE .EQU 1 ; SD: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) SDCSIOFAST .EQU FALSE ; SD: ENABLE TABLE-DRIVEN BIT INVERTER IN CSIO MODE +SDMTSWAP .EQU FALSE ; SD: SWAP THE LOGICAL ORDER OF THE SPI PORTS OF THE MT011 +; +CHENABLE .EQU FALSE ; CH: ENABLE CH375/376 USB SUPPORT ; PRPENABLE .EQU FALSE ; PRP: ENABLE ECB PROPELLER IO BOARD DRIVER (PRP.ASM) PRPSDENABLE .EQU TRUE ; PRP: ENABLE PROPIO DRIVER SD CARD SUPPORT @@ -222,6 +237,8 @@ PRPCONENABLE .EQU TRUE ; PRP: ENABLE PROPIO DRIVER VIDEO/KBD SUPPORT ; PPPENABLE .EQU FALSE ; PPP: ENABLE ZETA PARALLEL PORT PROPELLER BOARD DRIVER (PPP.ASM) ; +ESPENABLE .EQU FALSE ; ESP: ENABLE ESP32 IO BOARD DRIVER (ESP.ASM) +; HDSKENABLE .EQU FALSE ; HDSK: ENABLE SIMH HDSK DISK DRIVER (HDSK.ASM) HDSKTRACE .EQU 1 ; HDSK: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) ; @@ -231,9 +248,12 @@ PIO0BASE .EQU $B8 ; PIO 0: REGISTERS BASE ADR PIO1BASE .EQU $BC ; PIO 1: REGISTERS BASE ADR ; LPTENABLE .EQU FALSE ; LPT: ENABLE CENTRONICS PRINTER DRIVER (LPT.ASM) -LPTCNT .EQU 1 ; LPT: NUMBER OF CHIPS TO DETECT (1-2) -LPT0BASE .EQU $E8 ; LPT 0: REGISTERS BASE ADR -LPT1BASE .EQU $EC ; LPT 1: REGISTERS BASE ADR +; +PPAENABLE .EQU FALSE ; PPA: ENABLE PPA DISK DRIVER (PPA.ASM) +; +IMMENABLE .EQU FALSE ; IMM: ENABLE IMM DISK DRIVER (IMM.ASM) +; +SYQENABLE .EQU FALSE ; SYQ: ENABLE IMM DISK DRIVER (SYQ.ASM) ; PIO_4P .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB 4P BOARD PIO4BASE .EQU $90 ; PIO: PIO REGISTERS BASE ADR FOR ECB 4P BOARD @@ -258,7 +278,7 @@ SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM) ; DMAENABLE .EQU FALSE ; DMA: ENABLE DMA DRIVER (DMA.ASM) DMABASE .EQU $E0 ; DMA: DMA BASE ADDRESS -DMAMODE .EQU DMAMODE_ECB ; DMA: DMA MODE (NONE|ECB|Z180|Z280|RC|MBC) +DMAMODE .EQU DMAMODE_ECB ; DMA: DMA MODE (NONE|ECB|Z180|Z280|RC|MBC|DUO) ; -YM2612ENABLE .EQU FALSE ; YM2612: ENABLE YM2612 DRIVER (MUTE STUB) -VGMBASE .EQU $C0 ; YM2612: BASE ADDRESS FOR VGM BOARD (YM2612/SN76469s/CTC) +YM2612ENABLE .EQU FALSE ; YM2612: ENABLE YM2612 DRIVER +VGMBASE .EQU $C0 ; YM2612: BASE ADDRESS FOR VGM BOARD (YM2612/SN76489s/CTC) diff --git a/Source/HBIOS/cfg_scz180.asm b/Source/HBIOS/cfg_scz180.asm index 70220ddc..6ac906a9 100644 --- a/Source/HBIOS/cfg_scz180.asm +++ b/Source/HBIOS/cfg_scz180.asm @@ -1,6 +1,6 @@ ; ;================================================================================================== -; ROMWBW 2.X CONFIGURATION DEFAULTS FOR SC Z180 VARIANTS (SC126, SC130, ETC.) +; ROMWBW 3.X CONFIGURATION DEFAULTS FOR SC Z180 VARIANTS (SC126, SC130, ETC.) ;================================================================================================== ; ; THIS FILE CONTAINS THE FULL SET OF DEFAULT CONFIGURATION SETTINGS FOR THE PLATFORM @@ -15,7 +15,7 @@ ; #INCLUDE "hbios.inc" ; -PLATFORM .EQU PLT_SCZ180 ; PLT_[SBC|ZETA|ZETA2|N8|MK4|UNA|RCZ80|RCZ180|EZZ80|SCZ180|DYNO|RCZ280|MBC|RPH] +PLATFORM .EQU PLT_SCZ180 ; PLT_[SBC|ZETA|ZETA2|N8|MK4|UNA|RCZ80|RCZ180|EZZ80|SCZ180|DYNO|RCZ280|MBC|RPH|Z80RETRO|S100|DUO|HEATH|MON] CPUFAM .EQU CPU_Z180 ; CPU FAMILY: CPU_[Z80|Z180|Z280] BIOS .EQU BIOS_WBW ; HARDWARE BIOS: BIOS_[WBW|UNA] BATCOND .EQU FALSE ; ENABLE LOW BATTERY WARNING MESSAGE @@ -30,14 +30,12 @@ CPUSPDCAP .EQU SPD_FIXED ; CPU SPEED CHANGE CAPABILITY SPD_FIXED|SPD_HILO CPUSPDDEF .EQU SPD_HIGH ; CPU SPEED DEFAULT SPD_UNSUP|SPD_HIGH|SPD_LOW CPUOSC .EQU 18432000 ; CPU OSC FREQ IN MHZ INTMODE .EQU 2 ; INTERRUPTS: 0=NONE, 1=MODE 1, 2=MODE 2, 3=MODE 3 (Z280) -DEFSERCFG .EQU SER_115200_8N1 ; DEFAULT SERIAL LINE CONFIG (SEE STD.ASM) +DEFSERCFG .EQU SER_115200_8N1 | SER_RTS ; DEFAULT SERIAL LINE CONFIG (SEE STD.ASM) ; RAMSIZE .EQU 512 ; SIZE OF RAM IN KB (MUST MATCH YOUR HARDWARE!!!) ROMSIZE .EQU 512 ; SIZE OF ROM IN KB (MUST MATCH YOUR HARDWARE!!!) -ROMSIZE_CHK .EQU 0 ; ROMSIZE VALUE VERIFICATION (0=DISABLED) -MEMMGR .EQU MM_Z180 ; MEMORY MANAGER: MM_[SBC|Z2|N8|Z180|Z280|MBC|RPH] -RAMLOC .EQU 19 ; START OF RAM AS POWER OF 2 (2^N) IN PHYSICAL ADDRESS SPACE -RAMBIAS .EQU (1 << (RAMLOC - 10)) ; OFFSET OF START OF RAM IN PHYSICAL ADDRESS SPACE +MEMMGR .EQU MM_Z180 ; MEMORY MANAGER: MM_[SBC|Z2|N8|Z180|Z280|MBC|RPH|MON] +RAMBIAS .EQU ROMSIZE ; OFFSET OF START OF RAM IN PHYSICAL ADDRESS SPACE MPGSEL_0 .EQU $78 ; Z2 MEM MGR BANK 0 PAGE SELECT REG (WRITE ONLY) MPGSEL_1 .EQU $79 ; Z2 MEM MGR BANK 1 PAGE SELECT REG (WRITE ONLY) MPGSEL_2 .EQU $7A ; Z2 MEM MGR BANK 2 PAGE SELECT REG (WRITE ONLY) @@ -60,15 +58,21 @@ CTCDEBUG .EQU FALSE ; ENABLE CTC DRIVER DEBUG OUTPUT CTCBASE .EQU $88 ; CTC BASE I/O ADDRESS CTCTIMER .EQU FALSE ; ENABLE CTC PERIODIC TIMER ; +PCFENABLE .EQU FALSE ; ENABLE PCF8584 I2C CONTROLLER +PCFBASE .EQU $F0 ; PCF8584 BASE I/O ADDRESS +; EIPCENABLE .EQU FALSE ; EIPC: ENABLE Z80 EIPC (Z84C15) INITIALIZATION ; SKZENABLE .EQU FALSE ; ENABLE SERGEY'S Z80-512K FEATURES ; WDOGMODE .EQU WDOG_NONE ; WATCHDOG MODE: WDOG_[NONE|EZZ80|SKZ] ; -DIAGENABLE .EQU TRUE ; ENABLES OUTPUT TO 8 BIT LED DIAGNOSTIC PORT -DIAGPORT .EQU $0D ; DIAGNOSTIC PORT ADDRESS -DIAGDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON DIAGNOSTIC LEDS +FPLED_ENABLE .EQU TRUE ; FP: ENABLES FRONT PANEL LEDS +FPLED_IO .EQU $00 ; FP: PORT ADDRESS FOR FP LEDS +FPLED_DSKACT .EQU TRUE ; FP: ENABLES DISK I/O ACTIVITY ON FP LEDS +FPSW_ENABLE .EQU FALSE ; FP: ENABLES FRONT PANEL SWITCHES +FPSW_IO .EQU $00 ; FP: PORT ADDRESS FOR FP SWITCHES +; DIAGLVL .EQU DL_CRITICAL ; ERROR LEVEL REPORTING ; LEDENABLE .EQU FALSE ; ENABLES STATUS LED (SINGLE LED) @@ -76,9 +80,17 @@ LEDMODE .EQU LEDMODE_STD ; LEDMODE_[STD|RTC] LEDPORT .EQU $0E ; STATUS LED PORT ADDRESS LEDDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON STATUS LED ; -DSKYENABLE .EQU FALSE ; ENABLES DSKY (DO NOT COMBINE WITH PPIDE) +DSKYENABLE .EQU FALSE ; ENABLES DSKY FUNCTIONALITY +DSKYDSKACT .EQU TRUE ; ENABLES DISK ACTIVITY ON DSKY DISPLAY +ICMENABLE .EQU FALSE ; ENABLES ORIGINAL DSKY ICM DRIVER (7218) +ICMPPIBASE .EQU $60 ; BASE I/O ADDRESS OF ICM PPI +PKDENABLE .EQU FALSE ; ENABLES DSKY NG PKD DRIVER (8259) +PKDPPIBASE .EQU $60 ; BASE I/O ADDRESS OF PKD PPI +PKDOSC .EQU 3000000 ; OSCILLATOR FREQ FOR PKD (IN HZ) +H8PENABLE .EQU FALSE ; ENABLES HEATH H8 FRONT PANEL ; BOOTCON .EQU 0 ; BOOT CONSOLE DEVICE +SECCON .EQU $FF ; SECONDARY CONSOLE DEVICE CRTACT .EQU FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP VDAEMU .EQU EMUTYP_ANSI ; VDA EMULATION: EMUTYP_[TTY|ANSI] VDAEMU_SERKBD .EQU $FF ; VDA EMULATION: SERIAL KBD UNIT #, OR $FF FOR HW KBD @@ -123,7 +135,8 @@ UARTENABLE .EQU TRUE ; UART: ENABLE 8250/16550-LIKE SERIAL DRIVER (UART.ASM) UARTOSC .EQU 1843200 ; UART: OSC FREQUENCY IN MHZ UARTINTS .EQU FALSE ; UART: INCLUDE INTERRUPT SUPPORT UNDER IM1/2/3 UARTCFG .EQU DEFSERCFG | SER_RTS ; UART: LINE CONFIG FOR UART PORTS -UARTSBC .EQU FALSE ; UART: AUTO-DETECT SBC/ZETA ONBOARD UART +UARTSBC .EQU FALSE ; UART: AUTO-DETECT SBC/ZETA/DUO ONBOARD UART +UARTAUX .EQU FALSE ; UART: AUTO-DETECT AUX UART UARTSBCFORCE .EQU FALSE ; UART: FORCE DETECTION OF SBC UART (FOR SIMH) UARTCAS .EQU FALSE ; UART: AUTO-DETECT ECB CASSETTE UART UARTMFP .EQU FALSE ; UART: AUTO-DETECT MF/PIC UART @@ -146,7 +159,7 @@ SIOENABLE .EQU TRUE ; SIO: ENABLE ZILOG SIO SERIAL DRIVER (SIO.ASM) SIODEBUG .EQU FALSE ; SIO: ENABLE DEBUG OUTPUT SIOBOOT .EQU 0 ; SIO: REBOOT ON RCV CHAR (0=DISABLED) SIOCNT .EQU 2 ; SIO: NUMBER OF CHIPS TO DETECT (1-2), 2 CHANNELS PER CHIP -SIO0MODE .EQU SIOMODE_RC ; SIO 0: CHIP TYPE: SIOMODE_[STD|RC|SMB|ZP] +SIO0MODE .EQU SIOMODE_RC ; SIO 0: CHIP TYPE: SIOMODE_[STD|RC|SMB|ZP|Z80R] SIO0BASE .EQU $80 ; SIO 0: REGISTERS BASE ADR SIO0ACLK .EQU 7372800 ; SIO 0A: OSC FREQ IN HZ, ZP=2457600/4915200, RC/SMB=7372800 SIO0ACFG .EQU SER_115200_8N1 ; SIO 0A: SERIAL LINE CONFIG @@ -154,7 +167,7 @@ SIO0ACTCC .EQU -1 ; SIO 0A: CTC CHANNEL 0=A, 1=B, 2=C, 3=D, -1 FOR NONE SIO0BCLK .EQU 7372800 ; SIO 0B: OSC FREQ IN HZ, ZP=2457600/4915200, RC/SMB=7372800 SIO0BCFG .EQU SER_115200_8N1 ; SIO 0B: SERIAL LINE CONFIG SIO0BCTCC .EQU -1 ; SIO 0B: CTC CHANNEL 0=A, 1=B, 2=C, 3=D, -1 FOR NONE -SIO1MODE .EQU SIOMODE_RC ; SIO 1: CHIP TYPE: SIOMODE_[STD|RC|SMB|ZP] +SIO1MODE .EQU SIOMODE_RC ; SIO 1: CHIP TYPE: SIOMODE_[STD|RC|SMB|ZP|Z80R] SIO1BASE .EQU $84 ; SIO 1: REGISTERS BASE ADR SIO1ACLK .EQU 7372800 ; SIO 1A: OSC FREQ IN HZ, ZP=2457600/4915200, RC/SMB=7372800 SIO1ACFG .EQU SER_115200_8N1 ; SIO 1A: SERIAL LINE CONFIG @@ -172,6 +185,8 @@ TMSENABLE .EQU FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM) TMSMODE .EQU TMSMODE_MSX ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|MSX9958|MSXKBD|COLECO] TMSTIMENABLE .EQU FALSE ; TMS: ENABLE TIMER INTERRUPTS (REQUIRES IM1) VGAENABLE .EQU FALSE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM) +VRCENABLE .EQU FALSE ; VRC: ENABLE VGARC VIDEO/KBD DRIVER (VRC.ASM) +SCONENABLE .EQU FALSE ; SCON: ENABLE S100 CONSOLE DRIVER (SCON.ASM) ; MDENABLE .EQU TRUE ; MD: ENABLE MEMORY (ROM/RAM) DISK DRIVER (MD.ASM) MDROM .EQU TRUE ; MD: ENABLE ROM DISK @@ -183,9 +198,9 @@ FDENABLE .EQU FALSE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM) FDMODE .EQU FDMODE_RCWDC ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPFDC|MBC] FDCNT .EQU 2 ; FD: NUMBER OF FLOPPY DRIVES ON THE INTERFACE (1-2) FDTRACE .EQU 1 ; FD: TRACE LEVEL (0=NO,1=FATAL,2=ERRORS,3=ALL) -FDMEDIA .EQU FDM144 ; FD: DEFAULT MEDIA FORMAT FDM[720|144|360|120|111] -FDMEDIAALT .EQU FDM720 ; FD: ALTERNATE MEDIA FORMAT FDM[720|144|360|120|111] FDMAUTO .EQU TRUE ; FD: AUTO SELECT DEFAULT/ALTERNATE MEDIA FORMATS +FD0TYPE .EQU FDT_3HD ; FD 0: DRIVE TYPE: FDT_[3DD|3HD|5DD|5HD|8] +FD1TYPE .EQU FDT_3HD ; FD 1: DRIVE TYPE: FDT_[3DD|3HD|5DD|5HD|8] ; RFENABLE .EQU FALSE ; RF: ENABLE RAM FLOPPY DRIVER ; @@ -225,13 +240,25 @@ PPIDE2A8BIT .EQU FALSE ; PPIDE 2A (MASTER): 8 BIT XFER PPIDE2B8BIT .EQU FALSE ; PPIDE 0B (SLAVE): 8 BIT XFER ; SDENABLE .EQU TRUE ; SD: ENABLE SD CARD DISK DRIVER (SD.ASM) -SDMODE .EQU SDMODE_SC ; SD: DRIVER MODE: SDMODE_[JUHA|N8|CSIO|PPI|UART|DSD|MK4|SC|MT|USR] +SDMODE .EQU SDMODE_SC ; SD: DRIVER MODE: SDMODE_[JUHA|N8|CSIO|PPI|UART|DSD|MK4|SC|MT|PIO|Z80R|USR] SDPPIBASE .EQU $60 ; SD: BASE I/O ADDRESS OF PPI FOR PPI MODDE SDCNT .EQU 1 ; SD: NUMBER OF SD CARD DEVICES (1-2), FOR DSD/SC/MT ONLY SDTRACE .EQU 1 ; SD: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) SDCSIOFAST .EQU FALSE ; SD: ENABLE TABLE-DRIVEN BIT INVERTER IN CSIO MODE SDMTSWAP .EQU FALSE ; SD: SWAP THE LOGICAL ORDER OF THE SPI PORTS OF THE MT011 ; +CHENABLE .EQU TRUE ; CH: ENABLE CH375/376 USB SUPPORT +CHTRACE .EQU 1 ; CH: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +CHUSBTRACE .EQU 1 ; CHUSB: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +CHSDTRACE .EQU 1 ; CHSD: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +CHCNT .EQU 2 ; CH: NUMBER OF BOARDS TO DETECT (1-2) +CH0BASE .EQU $3E ; CH 0: BASE I/O ADDRESS +CH0USBENABLE .EQU TRUE ; CH 0: ENABLE USB DISK +CH0SDENABLE .EQU FALSE ; CH 0: ENABLE SD DISK +CH1BASE .EQU $3C ; CH 1: BASE I/O ADDRESS +CH1USBENABLE .EQU TRUE ; CH 1: ENABLE USB DISK +CH1SDENABLE .EQU FALSE ; CH 1: ENABLE SD DISK +; PRPENABLE .EQU FALSE ; PRP: ENABLE ECB PROPELLER IO BOARD DRIVER (PRP.ASM) PRPSDENABLE .EQU TRUE ; PRP: ENABLE PROPIO DRIVER SD CARD SUPPORT PRPSDTRACE .EQU 1 ; PRP: SD CARD TRACE LEVEL (0=NO,1=ERRORS,2=ALL) @@ -239,6 +266,8 @@ PRPCONENABLE .EQU TRUE ; PRP: ENABLE PROPIO DRIVER VIDEO/KBD SUPPORT ; PPPENABLE .EQU FALSE ; PPP: ENABLE ZETA PARALLEL PORT PROPELLER BOARD DRIVER (PPP.ASM) ; +ESPENABLE .EQU FALSE ; ESP: ENABLE ESP32 IO BOARD DRIVER (ESP.ASM) +; HDSKENABLE .EQU FALSE ; HDSK: ENABLE SIMH HDSK DISK DRIVER (HDSK.ASM) ; PIOENABLE .EQU FALSE ; PIO: ENABLE ZILOG PIO DRIVER (PIO.ASM) @@ -247,6 +276,32 @@ PIO0BASE .EQU $B8 ; PIO 0: REGISTERS BASE ADR PIO1BASE .EQU $BC ; PIO 1: REGISTERS BASE ADR ; LPTENABLE .EQU FALSE ; LPT: ENABLE CENTRONICS PRINTER DRIVER (LPT.ASM) +LPTMODE .EQU LPTMODE_MG014 ; LPT: DRIVER MODE: LPTMODE_[NONE|SPP|MG014] +LPTCNT .EQU 1 ; LPT: NUMBER OF CHIPS TO DETECT (1-2) +LPTTRACE .EQU 1 ; LPT: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +LPT0BASE .EQU $18 ; LPT 0: REGISTERS BASE ADR +LPT1BASE .EQU $00 ; LPT 1: REGISTERS BASE ADR +; +PPAENABLE .EQU FALSE ; PPA: ENABLE PPA DISK DRIVER (PPA.ASM) +PPACNT .EQU 1 ; PPA: NUMBER OF PPA DEVICES (1-2) +PPATRACE .EQU 1 ; PPA: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +PPAMODE .EQU PPAMODE_MG014 ; PPA: DRIVER MODE: PPAMODE_[NONE|SPP|MG014] +PPA0BASE .EQU LPT0BASE ; PPA 0: BASE I/O ADDRESS OF PPI FOR PPA +PPA1BASE .EQU LPT1BASE ; PPA 1: BASE I/O ADDRESS OF PPI FOR PPA +; +IMMENABLE .EQU FALSE ; IMM: ENABLE IMM DISK DRIVER (IMM.ASM) +IMMCNT .EQU 1 ; IMM: NUMBER OF IMM DEVICES (1-2) +IMMTRACE .EQU 1 ; IMM: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +IMMMODE .EQU IMMMODE_MG014 ; IMM: DRIVER MODE: IMMMODE_[NONE|SPP|MG014] +IMM0BASE .EQU LPT0BASE ; IMM 0: BASE I/O ADDRESS OF PPI FOR IMM +IMM1BASE .EQU LPT1BASE ; IMM 1: BASE I/O ADDRESS OF PPI FOR IMM +; +SYQENABLE .EQU FALSE ; SYQ: ENABLE IMM DISK DRIVER (SYQ.ASM) +SYQCNT .EQU 1 ; SYQ: NUMBER OF SYQ DEVICES (1-2) +SYQTRACE .EQU 1 ; SYQ: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +SYQMODE .EQU IMMMODE_MG014 ; SYQ: DRIVER MODE: SYQMODE_[NONE|SPP|MG014] +SYQ0BASE .EQU LPT0BASE ; SYQ 0: BASE I/O ADDRESS OF PPI FOR SYQ +SYQ1BASE .EQU LPT1BASE ; SYQ 1: BASE I/O ADDRESS OF PPI FOR SYQ ; PIO_4P .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB 4P BOARD PIO_ZP .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB ZILOG PERIPHERALS BOARD (PIO.ASM) @@ -267,7 +322,7 @@ SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM) ; DMAENABLE .EQU FALSE ; DMA: ENABLE DMA DRIVER (DMA.ASM) DMABASE .EQU $E0 ; DMA: DMA BASE ADDRESS -DMAMODE .EQU DMAMODE_Z180 ; DMA: DMA MODE (NONE|ECB|Z180|Z280|RC|MBC) +DMAMODE .EQU DMAMODE_Z180 ; DMA: DMA MODE (NONE|ECB|Z180|Z280|RC|MBC|DUO) ; -YM2612ENABLE .EQU FALSE ; YM2612: ENABLE YM2612 DRIVER (MUTE STUB) -VGMBASE .EQU $C0 ; YM2612: BASE ADDRESS FOR VGM BOARD (YM2612/SN76469s/CTC) +YM2612ENABLE .EQU FALSE ; YM2612: ENABLE YM2612 DRIVER +VGMBASE .EQU $C0 ; YM2612: BASE ADDRESS FOR VGM BOARD (YM2612/SN76489s/CTC) diff --git a/Source/HBIOS/cfg_una.asm b/Source/HBIOS/cfg_una.asm index 0041d1c8..5ebfff81 100644 --- a/Source/HBIOS/cfg_una.asm +++ b/Source/HBIOS/cfg_una.asm @@ -1,6 +1,6 @@ ; ;================================================================================================== -; ROMWBW 2.X CONFIGURATION DEFAULTS FOR UNA +; ROMWBW 3.X CONFIGURATION DEFAULTS FOR UNA ;================================================================================================== ; ; THIS FILE CONTAINS THE FULL SET OF DEFAULT CONFIGURATION SETTINGS FOR THE PLATFORM @@ -15,10 +15,14 @@ ; #INCLUDE "../UBIOS/ubios.inc" ; -;PLATFORM .EQU PLT_UNA ; PLT_[SBC|ZETA|ZETA2|N8|MK4|UNA|RCZ80|RCZ180|EZZ80|SCZ180|DYNO|RCZ280|MBC|RPH] +;PLATFORM .EQU PLT_UNA ; PLT_[SBC|ZETA|ZETA2|N8|MK4|UNA|RCZ80|RCZ180|EZZ80|SCZ180|DYNO|RCZ280|MBC|RPH|Z80RETRO|S100|DUO|HEATH|MON] CPUFAM .EQU CPU_Z80 ; CPU FAMILY: CPU_[Z80|Z180|Z280] BIOS .EQU BIOS_UNA ; HARDWARE BIOS: BIOS_[WBW|UNA] ; +FPSW_ENABLE .EQU FALSE ; FP: ENABLES FRONT PANEL SWITCHES +; +DIAGLVL .EQU DL_CRITICAL ; ERROR LEVEL REPORTING +; BOOT_TIMEOUT .EQU -1 ; AUTO BOOT TIMEOUT IN SECONDS, -1 TO DISABLE, 0 FOR IMMEDIATE ; CPUSPDCAP .EQU SPD_FIXED ; CPU SPEED CHANGE CAPABILITY SPD_FIXED|SPD_HILO @@ -32,5 +36,3 @@ ROMSIZE .EQU 512 ; SIZE OF ROM IN KB (MUST MATCH YOUR HARDWARE!!!) RTCIO .EQU $70 ; RTC LATCH REGISTER ADR ; DSKYENABLE .EQU FALSE ; ENABLES DSKY (DO NOT COMBINE WITH PPIDE) - -DIAGLVL .EQU DL_CRITICAL ; ERROR LEVEL REPORTING diff --git a/Source/HBIOS/cfg_z80retro.asm b/Source/HBIOS/cfg_z80retro.asm new file mode 100644 index 00000000..042a2127 --- /dev/null +++ b/Source/HBIOS/cfg_z80retro.asm @@ -0,0 +1,245 @@ +; +;================================================================================================== +; ROMWBW 3.X CONFIGURATION DEFAULTS FOR SIMPLE Z80 RETRO +;================================================================================================== +; +; THIS FILE CONTAINS THE FULL SET OF DEFAULT CONFIGURATION SETTINGS FOR THE PLATFORM +; INDICATED ABOVE. THIS FILE SHOULD *NOT* NORMALLY BE CHANGED. INSTEAD, YOU SHOULD +; OVERRIDE ANY SETTINGS YOU WANT USING A CONFIGURATION FILE IN THE CONFIG DIRECTORY +; UNDER THIS DIRECTORY. +; +; THIS FILE CAN BE CONSIDERED A REFERENCE THAT LISTS ALL POSSIBLE CONFIGURATION SETTINGS +; FOR THE PLATFORM. +; +#DEFINE PLATFORM_NAME "Z80Retro", " [", CONFIG, "]" +; +#INCLUDE "hbios.inc" +; +PLATFORM .EQU PLT_Z80RETRO ; PLT_[SBC|ZETA|ZETA2|N8|MK4|UNA|RCZ80|RCZ180|EZZ80|SCZ180|DYNO|RCZ280|MBC|RPH|Z80RETRO|S100|DUO|HEATH|MON] +CPUFAM .EQU CPU_Z80 ; CPU FAMILY: CPU_[Z80|Z180|Z280] +BIOS .EQU BIOS_WBW ; HARDWARE BIOS: BIOS_[WBW|UNA] +BATCOND .EQU FALSE ; ENABLE LOW BATTERY WARNING MESSAGE +HBIOS_MUTEX .EQU FALSE ; ENABLE REENTRANT CALLS TO HBIOS (ADDS OVERHEAD) +USELZSA2 .EQU TRUE ; ENABLE FONT COMPRESSION +TICKFREQ .EQU 50 ; DESIRED PERIODIC TIMER INTERRUPT FREQUENCY (HZ) +; +BOOT_TIMEOUT .EQU -1 ; AUTO BOOT TIMEOUT IN SECONDS, -1 TO DISABLE, 0 FOR IMMEDIATE +BOOT_DELAY .EQU 0 ; FIXED BOOT DELAY IN SECONDS PRIOR TO CONSOLE OUTPUT +; +CPUSPDCAP .EQU SPD_FIXED ; CPU SPEED CHANGE CAPABILITY SPD_FIXED|SPD_HILO +CPUSPDDEF .EQU SPD_HIGH ; CPU SPEED DEFAULT SPD_UNSUP|SPD_HIGH|SPD_LOW +CPUOSC .EQU 14745600 ; CPU OSC FREQ IN MHZ +INTMODE .EQU 2 ; INTERRUPTS: 0=NONE, 1=MODE 1, 2=MODE 2, 3=MODE 3 (Z280) +DEFSERCFG .EQU SER_38400_8N1 | SER_RTS ; DEFAULT SERIAL LINE CONFIG (SEE STD.ASM) +; +RAMSIZE .EQU 512 ; SIZE OF RAM IN KB (MUST MATCH YOUR HARDWARE!!!) +ROMSIZE .EQU 512 ; SIZE OF ROM IN KB (MUST MATCH YOUR HARDWARE!!!) +MEMMGR .EQU MM_Z2 ; MEMORY MANAGER: MM_[SBC|Z2|N8|Z180|Z280|MBC|RPH|MON] +MPGSEL_0 .EQU $60 ; Z2 MEM MGR BANK 0 PAGE SELECT REG (WRITE ONLY) +MPGSEL_1 .EQU $61 ; Z2 MEM MGR BANK 1 PAGE SELECT REG (WRITE ONLY) +MPGSEL_2 .EQU $62 ; Z2 MEM MGR BANK 2 PAGE SELECT REG (WRITE ONLY) +MPGSEL_3 .EQU $63 ; Z2 MEM MGR BANK 3 PAGE SELECT REG (WRITE ONLY) +MPGENA .EQU $64 ; Z2 MEM MGR PAGING ENABLE REGISTER (BIT 0, WRITE ONLY) +; +RTCIO .EQU $70 ; RTC LATCH REGISTER ADR +; +KIOENABLE .EQU FALSE ; ENABLE ZILOG KIO SUPPORT +KIOBASE .EQU $80 ; KIO BASE I/O ADDRESS +; +CTCENABLE .EQU TRUE ; ENABLE ZILOG CTC SUPPORT +CTCDEBUG .EQU FALSE ; ENABLE CTC DRIVER DEBUG OUTPUT +CTCBASE .EQU $40 ; CTC BASE I/O ADDRESS +CTCTIMER .EQU FALSE ; ENABLE CTC PERIODIC TIMER (too fast for RomWBW right now) +CTCMODE .EQU CTCMODE_CTR ; CTC MODE: CTCMODE_[NONE|CTR|TIM16|TIM256] +CTCPRE .EQU 256 ; PRESCALE CONSTANT (1-256) +CTCPRECH .EQU 0 ; PRESCALE CHANNEL (0-3) +CTCTIMCH .EQU 1 ; TIMER CHANNEL (0-3) +CTCOSC .EQU 7372800 ; CTC CLOCK FREQUENCY +; +PCFENABLE .EQU FALSE ; ENABLE PCF8584 I2C CONTROLLER +PCFBASE .EQU $F0 ; PCF8584 BASE I/O ADDRESS +; +EIPCENABLE .EQU FALSE ; EIPC: ENABLE Z80 EIPC (Z84C15) INITIALIZATION +; +SKZENABLE .EQU FALSE ; ENABLE SERGEY'S Z80-512K FEATURES +; +WDOGMODE .EQU WDOG_NONE ; WATCHDOG MODE: WDOG_[NONE|EZZ80|SKZ] +; +FPLED_ENABLE .EQU FALSE ; FP: ENABLES FRONT PANEL LEDS +FPLED_IO .EQU $00 ; FP: PORT ADDRESS FOR FP LEDS +FPLED_DSKACT .EQU TRUE ; FP: ENABLES DISK I/O ACTIVITY ON FP LEDS +FPSW_ENABLE .EQU FALSE ; FP: ENABLES FRONT PANEL SWITCHES +FPSW_IO .EQU $00 ; FP: PORT ADDRESS FOR FP SWITCHES +; +DIAGLVL .EQU DL_CRITICAL ; ERROR LEVEL REPORTING +; +LEDENABLE .EQU FALSE ; ENABLES STATUS LED +LEDMODE .EQU LEDMODE_RTC ; LEDMODE_[STD|RTC] +LEDPORT .EQU $00 ; STATUS LED PORT ADDRESS +LEDDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON STATUS LED +; +DSKYENABLE .EQU FALSE ; ENABLES DSKY FUNCTIONALITY +DSKYDSKACT .EQU TRUE ; ENABLES DISK ACTIVITY ON DSKY DISPLAY +ICMENABLE .EQU FALSE ; ENABLES ORIGINAL DSKY ICM DRIVER (7218) +ICMPPIBASE .EQU $60 ; BASE I/O ADDRESS OF ICM PPI +PKDENABLE .EQU FALSE ; ENABLES DSKY NG PKD DRIVER (8259) +PKDPPIBASE .EQU $60 ; BASE I/O ADDRESS OF PKD PPI +PKDOSC .EQU 3000000 ; OSCILLATOR FREQ FOR PKD (IN HZ) +H8PENABLE .EQU FALSE ; ENABLES HEATH H8 FRONT PANEL +; +BOOTCON .EQU 0 ; BOOT CONSOLE DEVICE +SECCON .EQU $FF ; SECONDARY CONSOLE DEVICE +CRTACT .EQU FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP +VDAEMU .EQU EMUTYP_ANSI ; VDA EMULATION: EMUTYP_[TTY|ANSI] +VDAEMU_SERKBD .EQU $FF ; VDA EMULATION: SERIAL KBD UNIT #, OR $FF FOR HW KBD +ANSITRACE .EQU 1 ; ANSI DRIVER TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +MKYENABLE .EQU FALSE ; MSX 5255 PPI KEYBOARD COMPATIBLE DRIVER (REQUIRES TMS VDA DRIVER) +; +DSRTCENABLE .EQU FALSE ; DSRTC: ENABLE DS-1302 CLOCK DRIVER (DSRTC.ASM) +DSRTCMODE .EQU DSRTCMODE_STD ; DSRTC: OPERATING MODE: DSRTC_[STD|MFPIC] +DSRTCCHG .EQU FALSE ; DSRTC: FORCE BATTERY CHARGE ON (USE WITH CAUTION!!!) +; +DS1501RTCENABLE .EQU FALSE ; DS1501RTC: ENABLE DS-1501 CLOCK DRIVER (DS1501RTC.ASM) +DS1501RTC_BASE .EQU $50 ; DS1501RTC: I/O BASE ADDRESS +; +BQRTCENABLE .EQU FALSE ; BQRTC: ENABLE BQ4845 CLOCK DRIVER (BQRTC.ASM) +BQRTC_BASE .EQU $50 ; BQRTC: I/O BASE ADDRESS +; +INTRTCENABLE .EQU FALSE ; ENABLE PERIODIC INTERRUPT CLOCK DRIVER (INTRTC.ASM) +; +RP5RTCENABLE .EQU FALSE ; RP5C01 RTC BASED CLOCK (RP5RTC.ASM) +; +HTIMENABLE .EQU FALSE ; ENABLE SIMH TIMER SUPPORT +SIMRTCENABLE .EQU FALSE ; ENABLE SIMH CLOCK DRIVER (SIMRTC.ASM) +; +DS7RTCENABLE .EQU FALSE ; DS7RTC: ENABLE DS-1307 I2C CLOCK DRIVER (DS7RTC.ASM) +DS7RTCMODE .EQU DS7RTCMODE_PCF ; DS7RTC: OPERATING MODE: DS7RTC_[PCF] +; +DUARTENABLE .EQU FALSE ; DUART: ENABLE 2681/2692 SERIAL DRIVER (DUART.ASM) +; +UARTENABLE .EQU FALSE ; UART: ENABLE 8250/16550-LIKE SERIAL DRIVER (UART.ASM) +UARTOSC .EQU 1843200 ; UART: OSC FREQUENCY IN MHZ +UARTINTS .EQU FALSE ; UART: INCLUDE INTERRUPT SUPPORT UNDER IM1/2/3 +UARTCFG .EQU DEFSERCFG ; UART: LINE CONFIG FOR UART PORTS +UARTCASSPD .EQU SER_300_8N1 ; UART: ECB CASSETTE UART DEFAULT SPEED +UARTSBC .EQU TRUE ; UART: AUTO-DETECT SBC/ZETA/DUO ONBOARD UART +UARTAUX .EQU FALSE ; UART: AUTO-DETECT AUX UART +UARTSBCFORCE .EQU FALSE ; UART: FORCE DETECTION OF SBC UART (FOR SIMH) +UARTCAS .EQU FALSE ; UART: AUTO-DETECT ECB CASSETTE UART +UARTMFP .EQU FALSE ; UART: AUTO-DETECT MF/PIC UART +UART4 .EQU FALSE ; UART: AUTO-DETECT 4UART UART +UARTRC .EQU FALSE ; UART: AUTO-DETECT RC UART +UARTDUAL .EQU FALSE ; UART: AUTO-DETECT DUAL UART +; +ASCIENABLE .EQU FALSE ; ASCI: ENABLE Z180 ASCI SERIAL DRIVER (ASCI.ASM) +; +Z2UENABLE .EQU FALSE ; Z2U: ENABLE Z280 UART SERIAL DRIVER (Z2U.ASM) +; +ACIAENABLE .EQU FALSE ; ACIA: ENABLE MOTOROLA 6850 ACIA DRIVER (ACIA.ASM) +; +SIOENABLE .EQU TRUE ; SIO: ENABLE ZILOG SIO SERIAL DRIVER (SIO.ASM) +SIODEBUG .EQU FALSE ; SIO: ENABLE DEBUG OUTPUT +SIOBOOT .EQU 0 ; SIO: REBOOT ON RCV CHAR (0=DISABLED) +SIOCNT .EQU 1 ; SIO: NUMBER OF CHIPS TO DETECT (1-2), 2 CHANNELS PER CHIP +SIO0MODE .EQU SIOMODE_Z80R ; SIO 0: CHIP TYPE: SIOMODE_[STD|RC|SMB|ZP|Z80R] +SIO0BASE .EQU $80 ; SIO 0: REGISTERS BASE ADR +SIO0ACLK .EQU CPUOSC/2 ; SIO 0A: OSC FREQ IN HZ, ZP=2457600/4915200, RC/SMB=7372800 +SIO0ACFG .EQU DEFSERCFG ; SIO 0A: SERIAL LINE CONFIG +SIO0ACTCC .EQU -1 ; SIO 0A: CTC CHANNEL 0=A, 1=B, 2=C, 3=D, -1 FOR NONE +SIO0BCLK .EQU CPUOSC/2 ; SIO 0B: OSC FREQ IN HZ, ZP=2457600/4915200, RC/SMB=7372800 +SIO0BCFG .EQU DEFSERCFG ; SIO 0B: SERIAL LINE CONFIG +SIO0BCTCC .EQU -1 ; SIO 0B: CTC CHANNEL 0=A, 1=B, 2=C, 3=D, -1 FOR NONE +SIO1MODE .EQU SIOMODE_Z80R ; SIO 1: CHIP TYPE: SIOMODE_[STD|RC|SMB|ZP|Z80R] +SIO1BASE .EQU $84 ; SIO 1: REGISTERS BASE ADR +SIO1ACLK .EQU CPUOSC/2 ; SIO 1A: OSC FREQ IN HZ, ZP=2457600/4915200, RC/SMB=7372800 +SIO1ACFG .EQU DEFSERCFG ; SIO 1A: SERIAL LINE CONFIG +SIO1ACTCC .EQU -1 ; SIO 1A: CTC CHANNEL 0=A, 1=B, 2=C, 3=D, -1 FOR NONE +SIO1BCLK .EQU CPUOSC/2 ; SIO 1B: OSC FREQ IN HZ, ZP=2457600/4915200, RC/SMB=7372800 +SIO1BCFG .EQU DEFSERCFG ; SIO 1B: SERIAL LINE CONFIG +SIO1BCTCC .EQU -1 ; SIO 1B: CTC CHANNEL 0=A, 1=B, 2=C, 3=D, -1 FOR NONE +; +XIOCFG .EQU DEFSERCFG ; XIO: SERIAL LINE CONFIG +; +VDUENABLE .EQU FALSE ; VDU: ENABLE VDU VIDEO/KBD DRIVER (VDU.ASM) +CVDUENABLE .EQU FALSE ; CVDU: ENABLE CVDU VIDEO/KBD DRIVER (CVDU.ASM) +GDCENABLE .EQU FALSE ; GDC: ENABLE 7220 GDC VIDEO/KBD DRIVER (GDC.ASM) +TMSENABLE .EQU FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM) +TMSMODE .EQU TMSMODE_NONE ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|MSX9958|MSXKBD|COLECO] +TMSTIMENABLE .EQU FALSE ; TMS: ENABLE TIMER INTERRUPTS (REQUIRES IM1) +VGAENABLE .EQU FALSE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM) +VRCENABLE .EQU FALSE ; VRC: ENABLE VGARC VIDEO/KBD DRIVER (VRC.ASM) +SCONENABLE .EQU FALSE ; SCON: ENABLE S100 CONSOLE DRIVER (SCON.ASM) +; +MDENABLE .EQU TRUE ; MD: ENABLE MEMORY (ROM/RAM) DISK DRIVER (MD.ASM) +MDROM .EQU TRUE ; MD: ENABLE ROM DISK +MDRAM .EQU TRUE ; MD: ENABLE RAM DISK +MDTRACE .EQU 1 ; MD: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +MDFFENABLE .EQU FALSE ; MD: ENABLE FLASH FILE SYSTEM +; +FDENABLE .EQU FALSE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM) +FDMODE .EQU FDMODE_ZETA2 ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPFDC|MBC] +FDCNT .EQU 1 ; FD: NUMBER OF FLOPPY DRIVES ON THE INTERFACE (1-2) +FDTRACE .EQU 1 ; FD: TRACE LEVEL (0=NO,1=FATAL,2=ERRORS,3=ALL) +FDMAUTO .EQU TRUE ; FD: AUTO SELECT DEFAULT/ALTERNATE MEDIA FORMATS +FD0TYPE .EQU FDT_3HD ; FD 0: DRIVE TYPE: FDT_[3DD|3HD|5DD|5HD|8] +FD1TYPE .EQU FDT_3HD ; FD 1: DRIVE TYPE: FDT_[3DD|3HD|5DD|5HD|8] +; +RFENABLE .EQU FALSE ; RF: ENABLE RAM FLOPPY DRIVER +; +IDEENABLE .EQU FALSE ; IDE: ENABLE IDE DISK DRIVER (IDE.ASM) +; +PPIDEENABLE .EQU FALSE ; PPIDE: ENABLE PARALLEL PORT IDE DISK DRIVER (PPIDE.ASM) +PPIDETRACE .EQU 1 ; PPIDE: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +PPIDECNT .EQU 1 ; PPIDE: NUMBER OF PPI CHIPS TO DETECT (1-3), 2 DRIVES PER CHIP +PPIDE0BASE .EQU $60 ; PPIDE 0: PPI REGISTERS BASE ADR +PPIDE0A8BIT .EQU FALSE ; PPIDE 0A (MASTER): 8 BIT XFER +PPIDE0B8BIT .EQU FALSE ; PPIDE 0B (SLAVE): 8 BIT XFER +; +SDENABLE .EQU TRUE ; SD: ENABLE SD CARD DISK DRIVER (SD.ASM) +SDMODE .EQU SDMODE_Z80R ; SD: DRIVER MODE: SDMODE_[JUHA|N8|CSIO|PPI|UART|DSD|MK4|SC|MT|PIO|Z80R|USR] +SDCNT .EQU 1 ; SD: NUMBER OF SD CARD DEVICES (1-2), FOR DSD/SC/MT ONLY +SDTRACE .EQU 1 ; SD: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +SDCSIOFAST .EQU FALSE ; SD: ENABLE TABLE-DRIVEN BIT INVERTER IN CSIO MODE +SDMTSWAP .EQU FALSE ; SD: SWAP THE LOGICAL ORDER OF THE SPI PORTS OF THE MT011 +; +CHENABLE .EQU FALSE ; CH: ENABLE CH375/376 USB SUPPORT +; +PRPENABLE .EQU FALSE ; PRP: ENABLE ECB PROPELLER IO BOARD DRIVER (PRP.ASM) +; +PPPENABLE .EQU FALSE ; PPP: ENABLE ZETA PARALLEL PORT PROPELLER BOARD DRIVER (PPP.ASM) +PPPBASE .EQU $60 ; PPP: PPI REGISTERS BASE ADDRESS +PPPSDENABLE .EQU TRUE ; PPP: ENABLE PPP DRIVER SD CARD SUPPORT +PPPSDTRACE .EQU 1 ; PPP: SD CARD TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +PPPCONENABLE .EQU TRUE ; PPP: ENABLE PPP DRIVER VIDEO/KBD SUPPORT +; +ESPENABLE .EQU FALSE ; ESP: ENABLE ESP32 IO BOARD DRIVER (ESP.ASM) +; +HDSKENABLE .EQU FALSE ; HDSK: ENABLE SIMH HDSK DISK DRIVER (HDSK.ASM) +; +PIOENABLE .EQU FALSE ; PIO: ENABLE ZILOG PIO DRIVER (PIO.ASM) +; +LPTENABLE .EQU FALSE ; LPT: ENABLE CENTRONICS PRINTER DRIVER (LPT.ASM) +; +PPAENABLE .EQU FALSE ; PPA: ENABLE PPA DISK DRIVER (PPA.ASM) +; +IMMENABLE .EQU FALSE ; IMM: ENABLE IMM DISK DRIVER (IMM.ASM) +; +SYQENABLE .EQU FALSE ; SYQ: ENABLE IMM DISK DRIVER (SYQ.ASM) +; +PIO_4P .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB 4P BOARD +PIO_ZP .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB ZILOG PERIPHERALS BOARD (PIO.ASM) +PIO_SBC .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR 8255 CHIP +PIOSBASE .EQU $60 ; PIO: PIO REGISTERS BASE ADR FOR SBC PPI +; +UFENABLE .EQU FALSE ; UF: ENABLE ECB USB FIFO DRIVER (UF.ASM) +; +SN76489ENABLE .EQU FALSE ; SN76489 SOUND DRIVER +AY38910ENABLE .EQU FALSE ; AY: AY-3-8910 / YM2149 SOUND DRIVER +SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM) +; +DMAENABLE .EQU FALSE ; DMA: ENABLE DMA DRIVER (DMA.ASM) +DMABASE .EQU $E0 ; DMA: DMA BASE ADDRESS +DMAMODE .EQU DMAMODE_NONE ; DMA: DMA MODE (NONE|ECB|Z180|Z280|RC|MBC|DUO) +; +YM2612ENABLE .EQU FALSE ; YM2612: ENABLE YM2612 DRIVER +VGMBASE .EQU $C0 ; YM2612: BASE ADDRESS FOR VGM BOARD (YM2612/SN76489s/CTC) diff --git a/Source/HBIOS/cfg_zeta.asm b/Source/HBIOS/cfg_zeta.asm index 33d614bc..16d3f185 100644 --- a/Source/HBIOS/cfg_zeta.asm +++ b/Source/HBIOS/cfg_zeta.asm @@ -1,6 +1,6 @@ ; ;================================================================================================== -; ROMWBW 2.X CONFIGURATION DEFAULTS FOR ZETA V1 +; ROMWBW 3.X CONFIGURATION DEFAULTS FOR ZETA V1 ;================================================================================================== ; ; THIS FILE CONTAINS THE FULL SET OF DEFAULT CONFIGURATION SETTINGS FOR THE PLATFORM @@ -15,7 +15,7 @@ ; #INCLUDE "hbios.inc" ; -PLATFORM .EQU PLT_ZETA ; PLT_[SBC|ZETA|ZETA2|N8|MK4|UNA|RCZ80|RCZ180|EZZ80|SCZ180|DYNO|RCZ280|MBC|RPH] +PLATFORM .EQU PLT_ZETA ; PLT_[SBC|ZETA|ZETA2|N8|MK4|UNA|RCZ80|RCZ180|EZZ80|SCZ180|DYNO|RCZ280|MBC|RPH|Z80RETRO|S100|DUO|HEATH|MON] CPUFAM .EQU CPU_Z80 ; CPU FAMILY: CPU_[Z80|Z180|Z280] BIOS .EQU BIOS_WBW ; BIOS_[WBW|UNA]: HARDWARE BIOS BATCOND .EQU FALSE ; ENABLE LOW BATTERY WARNING MESSAGE @@ -28,14 +28,13 @@ BOOT_DELAY .EQU 0 ; FIXED BOOT DELAY IN SECONDS PRIOR TO CONSOLE OUTPUT ; CPUSPDCAP .EQU SPD_FIXED ; CPU SPEED CHANGE CAPABILITY SPD_FIXED|SPD_HILO CPUSPDDEF .EQU SPD_HIGH ; CPU SPEED DEFAULT SPD_UNSUP|SPD_HIGH|SPD_LOW -CPUOSC .EQU 20000000 ; CPU OSC FREQ IN MHZ +CPUOSC .EQU 8000000 ; CPU OSC FREQ IN MHZ INTMODE .EQU 0 ; INTERRUPTS: 0=NONE, 1=MODE 1, 2=MODE 2, 3=MODE 3 (Z280) -DEFSERCFG .EQU SER_38400_8N1 ; DEFAULT SERIAL LINE CONFIG (SEE STD.ASM) +DEFSERCFG .EQU SER_38400_8N1 | SER_RTS ; DEFAULT SERIAL LINE CONFIG (SEE STD.ASM) ; RAMSIZE .EQU 512 ; SIZE OF RAM IN KB (MUST MATCH YOUR HARDWARE!!!) ROMSIZE .EQU 512 ; SIZE OF ROM IN KB (MUST MATCH YOUR HARDWARE!!!) -ROMSIZE_CHK .EQU 0 ; ROMSIZE VALUE VERIFICATION (0=DISABLED) -MEMMGR .EQU MM_SBC ; MEMORY MANAGER: MM_[SBC|Z2|N8|Z180|Z280|MBC|RPH] +MEMMGR .EQU MM_SBC ; MEMORY MANAGER: MM_[SBC|Z2|N8|Z180|Z280|MBC|RPH|MON] MPCL_RAM .EQU $78 ; SBC MEM MGR RAM PAGE SELECT REG (WRITE ONLY) MPCL_ROM .EQU $7C ; SBC MEM MGR ROM PAGE SELECT REG (WRITE ONLY) ; @@ -46,15 +45,21 @@ KIOBASE .EQU $80 ; KIO BASE I/O ADDRESS ; CTCENABLE .EQU FALSE ; ENABLE ZILOG CTC SUPPORT ; +PCFENABLE .EQU FALSE ; ENABLE PCF8584 I2C CONTROLLER +PCFBASE .EQU $F0 ; PCF8584 BASE I/O ADDRESS +; EIPCENABLE .EQU FALSE ; EIPC: ENABLE Z80 EIPC (Z84C15) INITIALIZATION ; SKZENABLE .EQU FALSE ; ENABLE SERGEY'S Z80-512K FEATURES ; WDOGMODE .EQU WDOG_NONE ; WATCHDOG MODE: WDOG_[NONE|EZZ80|SKZ] ; -DIAGENABLE .EQU FALSE ; ENABLES OUTPUT TO 8 BIT LED DIAGNOSTIC PORT -DIAGPORT .EQU $00 ; DIAGNOSTIC PORT ADDRESS -DIAGDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON DIAGNOSTIC LEDS +FPLED_ENABLE .EQU FALSE ; FP: ENABLES FRONT PANEL LEDS +FPLED_IO .EQU $00 ; FP: PORT ADDRESS FOR FP LEDS +FPLED_DSKACT .EQU TRUE ; FP: ENABLES DISK I/O ACTIVITY ON FP LEDS +FPSW_ENABLE .EQU FALSE ; FP: ENABLES FRONT PANEL SWITCHES +FPSW_IO .EQU $00 ; FP: PORT ADDRESS FOR FP SWITCHES +; DIAGLVL .EQU DL_CRITICAL ; ERROR LEVEL REPORTING ; LEDENABLE .EQU FALSE ; ENABLES STATUS LED @@ -62,12 +67,17 @@ LEDMODE .EQU LEDMODE_RTC ; LEDMODE_[STD|RTC] LEDPORT .EQU RTCIO ; STATUS LED PORT ADDRESS LEDDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON STATUS LED ; -DSKYENABLE .EQU FALSE ; ENABLES DSKY -DSKYMODE .EQU DSKYMODE_V1 ; DSKY VERSION: DSKYMODE_[V1|NG] -DSKYPPIBASE .EQU $60 ; BASE I/O ADDRESS OF DSKY PPI -DSKYOSC .EQU 3000000 ; OSCILLATOR FREQ FOR DSKYNG (IN HZ) +DSKYENABLE .EQU FALSE ; ENABLES DSKY FUNCTIONALITY +DSKYDSKACT .EQU TRUE ; ENABLES DISK ACTIVITY ON DSKY DISPLAY +ICMENABLE .EQU FALSE ; ENABLES ORIGINAL DSKY ICM DRIVER (7218) +ICMPPIBASE .EQU $60 ; BASE I/O ADDRESS OF ICM PPI +PKDENABLE .EQU FALSE ; ENABLES DSKY NG PKD DRIVER (8259) +PKDPPIBASE .EQU $60 ; BASE I/O ADDRESS OF PKD PPI +PKDOSC .EQU 3000000 ; OSCILLATOR FREQ FOR PKD (IN HZ) +H8PENABLE .EQU FALSE ; ENABLES HEATH H8 FRONT PANEL ; BOOTCON .EQU 0 ; BOOT CONSOLE DEVICE +SECCON .EQU $FF ; SECONDARY CONSOLE DEVICE CRTACT .EQU FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP VDAEMU .EQU EMUTYP_ANSI ; VDA EMULATION: EMUTYP_[TTY|ANSI] VDAEMU_SERKBD .EQU $FF ; VDA EMULATION: SERIAL KBD UNIT #, OR $FF FOR HW KBD @@ -103,6 +113,7 @@ UARTCFG .EQU DEFSERCFG ; UART: LINE CONFIG FOR UART PORTS UARTCASSPD .EQU SER_300_8N1 ; UART: ECB CASSETTE UART DEFAULT SPEED UARTSBC .EQU TRUE ; UART: AUTO-DETECT SBC/ZETA ONBOARD UART UARTSBCFORCE .EQU FALSE ; UART: FORCE DETECTION OF SBC UART (FOR SIMH) +UARTAUX .EQU FALSE ; UART: AUTO-DETECT AUX UART UARTCAS .EQU FALSE ; UART: AUTO-DETECT ECB CASSETTE UART UARTMFP .EQU FALSE ; UART: AUTO-DETECT MF/PIC UART UART4 .EQU FALSE ; UART: AUTO-DETECT 4UART UART @@ -126,6 +137,8 @@ TMSENABLE .EQU FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM) TMSMODE .EQU TMSMODE_NONE ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|MSX9958|MSXKBD|COLECO] TMSTIMENABLE .EQU FALSE ; TMS: ENABLE TIMER INTERRUPTS (REQUIRES IM1) VGAENABLE .EQU FALSE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM) +VRCENABLE .EQU FALSE ; VRC: ENABLE VGARC VIDEO/KBD DRIVER (VRC.ASM) +SCONENABLE .EQU FALSE ; SCON: ENABLE S100 CONSOLE DRIVER (SCON.ASM) ; MDENABLE .EQU TRUE ; MD: ENABLE MEMORY (ROM/RAM) DISK DRIVER (MD.ASM) MDROM .EQU TRUE ; MD: ENABLE ROM DISK @@ -137,9 +150,9 @@ FDENABLE .EQU TRUE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM) FDMODE .EQU FDMODE_ZETA ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPFDC|MBC] FDCNT .EQU 1 ; FD: NUMBER OF FLOPPY DRIVES ON THE INTERFACE (1-2) FDTRACE .EQU 1 ; FD: TRACE LEVEL (0=NO,1=FATAL,2=ERRORS,3=ALL) -FDMEDIA .EQU FDM144 ; FD: DEFAULT MEDIA FORMAT FDM[720|144|360|120|111] -FDMEDIAALT .EQU FDM720 ; FD: ALTERNATE MEDIA FORMAT FDM[720|144|360|120|111] FDMAUTO .EQU TRUE ; FD: AUTO SELECT DEFAULT/ALTERNATE MEDIA FORMATS +FD0TYPE .EQU FDT_3HD ; FD 0: DRIVE TYPE: FDT_[3DD|3HD|5DD|5HD|8] +FD1TYPE .EQU FDT_3HD ; FD 1: DRIVE TYPE: FDT_[3DD|3HD|5DD|5HD|8] ; RFENABLE .EQU FALSE ; RF: ENABLE RAM FLOPPY DRIVER ; @@ -153,11 +166,14 @@ PPIDE0A8BIT .EQU FALSE ; PPIDE 0A (MASTER): 8 BIT XFER PPIDE0B8BIT .EQU FALSE ; PPIDE 0B (SLAVE): 8 BIT XFER ; SDENABLE .EQU FALSE ; SD: ENABLE SD CARD DISK DRIVER (SD.ASM) -SDMODE .EQU SDMODE_PPI ; SD: DRIVER MODE: SDMODE_[JUHA|N8|CSIO|PPI|UART|DSD|MK4|SC|MT|USR] +SDMODE .EQU SDMODE_PPI ; SD: DRIVER MODE: SDMODE_[JUHA|N8|CSIO|PPI|UART|DSD|MK4|SC|MT|PIO|Z80R|USR] SDPPIBASE .EQU $60 ; SD: BASE I/O ADDRESS OF PPI FOR PPI MODDE SDCNT .EQU 1 ; SD: NUMBER OF SD CARD DEVICES (1-2), FOR DSD/SC/MT ONLY SDTRACE .EQU 1 ; SD: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) SDCSIOFAST .EQU FALSE ; SD: ENABLE TABLE-DRIVEN BIT INVERTER IN CSIO MODE +SDMTSWAP .EQU FALSE ; SD: SWAP THE LOGICAL ORDER OF THE SPI PORTS OF THE MT011 +; +CHENABLE .EQU FALSE ; CH: ENABLE CH375/376 USB SUPPORT ; PRPENABLE .EQU FALSE ; PRP: ENABLE ECB PROPELLER IO BOARD DRIVER (PRP.ASM) ; @@ -167,12 +183,20 @@ PPPSDENABLE .EQU TRUE ; PPP: ENABLE PPP DRIVER SD CARD SUPPORT PPPSDTRACE .EQU 1 ; PPP: SD CARD TRACE LEVEL (0=NO,1=ERRORS,2=ALL) PPPCONENABLE .EQU TRUE ; PPP: ENABLE PPP DRIVER VIDEO/KBD SUPPORT ; +ESPENABLE .EQU FALSE ; ESP: ENABLE ESP32 IO BOARD DRIVER (ESP.ASM) +; HDSKENABLE .EQU FALSE ; HDSK: ENABLE SIMH HDSK DISK DRIVER (HDSK.ASM) ; PIOENABLE .EQU FALSE ; PIO: ENABLE ZILOG PIO DRIVER (PIO.ASM) ; LPTENABLE .EQU FALSE ; LPT: ENABLE CENTRONICS PRINTER DRIVER (LPT.ASM) ; +PPAENABLE .EQU FALSE ; PPA: ENABLE PPA DISK DRIVER (PPA.ASM) +; +IMMENABLE .EQU FALSE ; IMM: ENABLE IMM DISK DRIVER (IMM.ASM) +; +SYQENABLE .EQU FALSE ; SYQ: ENABLE IMM DISK DRIVER (SYQ.ASM) +; PIO_4P .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB 4P BOARD PIO_ZP .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB ZILOG PERIPHERALS BOARD (PIO.ASM) PIO_SBC .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR 8255 CHIP @@ -186,7 +210,7 @@ SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM) ; DMAENABLE .EQU FALSE ; DMA: ENABLE DMA DRIVER (DMA.ASM) DMABASE .EQU $E0 ; DMA: DMA BASE ADDRESS -DMAMODE .EQU DMAMODE_NONE ; DMA: DMA MODE (NONE|ECB|Z180|Z280|RC|MBC) +DMAMODE .EQU DMAMODE_NONE ; DMA: DMA MODE (NONE|ECB|Z180|Z280|RC|MBC|DUO) ; -YM2612ENABLE .EQU FALSE ; YM2612: ENABLE YM2612 DRIVER (MUTE STUB) -VGMBASE .EQU $C0 ; YM2612: BASE ADDRESS FOR VGM BOARD (YM2612/SN76469s/CTC) +YM2612ENABLE .EQU FALSE ; YM2612: ENABLE YM2612 DRIVER +VGMBASE .EQU $C0 ; YM2612: BASE ADDRESS FOR VGM BOARD (YM2612/SN76489s/CTC) diff --git a/Source/HBIOS/cfg_zeta2.asm b/Source/HBIOS/cfg_zeta2.asm index e3d18470..f5185065 100644 --- a/Source/HBIOS/cfg_zeta2.asm +++ b/Source/HBIOS/cfg_zeta2.asm @@ -1,6 +1,6 @@ ; ;================================================================================================== -; ROMWBW 2.X CONFIGURATION DEFAULTS FOR ZETA V2 +; ROMWBW 3.X CONFIGURATION DEFAULTS FOR ZETA V2 ;================================================================================================== ; ; THIS FILE CONTAINS THE FULL SET OF DEFAULT CONFIGURATION SETTINGS FOR THE PLATFORM @@ -15,7 +15,7 @@ ; #INCLUDE "hbios.inc" ; -PLATFORM .EQU PLT_ZETA2 ; PLT_[SBC|ZETA|ZETA2|N8|MK4|UNA|RCZ80|RCZ180|EZZ80|SCZ180|DYNO|RCZ280|MBC|RPH] +PLATFORM .EQU PLT_ZETA2 ; PLT_[SBC|ZETA|ZETA2|N8|MK4|UNA|RCZ80|RCZ180|EZZ80|SCZ180|DYNO|RCZ280|MBC|RPH|Z80RETRO|S100|DUO|HEATH|MON] CPUFAM .EQU CPU_Z80 ; CPU FAMILY: CPU_[Z80|Z180|Z280] BIOS .EQU BIOS_WBW ; HARDWARE BIOS: BIOS_[WBW|UNA] BATCOND .EQU FALSE ; ENABLE LOW BATTERY WARNING MESSAGE @@ -30,12 +30,11 @@ CPUSPDCAP .EQU SPD_FIXED ; CPU SPEED CHANGE CAPABILITY SPD_FIXED|SPD_HILO CPUSPDDEF .EQU SPD_HIGH ; CPU SPEED DEFAULT SPD_UNSUP|SPD_HIGH|SPD_LOW CPUOSC .EQU 8000000 ; CPU OSC FREQ IN MHZ INTMODE .EQU 2 ; INTERRUPTS: 0=NONE, 1=MODE 1, 2=MODE 2, 3=MODE 3 (Z280) -DEFSERCFG .EQU SER_38400_8N1 ; DEFAULT SERIAL LINE CONFIG (SEE STD.ASM) +DEFSERCFG .EQU SER_38400_8N1 | SER_RTS ; DEFAULT SERIAL LINE CONFIG (SEE STD.ASM) ; RAMSIZE .EQU 512 ; SIZE OF RAM IN KB (MUST MATCH YOUR HARDWARE!!!) ROMSIZE .EQU 512 ; SIZE OF ROM IN KB (MUST MATCH YOUR HARDWARE!!!) -ROMSIZE_CHK .EQU 0 ; ROMSIZE VALUE VERIFICATION (0=DISABLED) -MEMMGR .EQU MM_Z2 ; MEMORY MANAGER: MM_[SBC|Z2|N8|Z180|Z280|MBC|RPH] +MEMMGR .EQU MM_Z2 ; MEMORY MANAGER: MM_[SBC|Z2|N8|Z180|Z280|MBC|RPH|MON] MPGSEL_0 .EQU $78 ; Z2 MEM MGR BANK 0 PAGE SELECT REG (WRITE ONLY) MPGSEL_1 .EQU $79 ; Z2 MEM MGR BANK 1 PAGE SELECT REG (WRITE ONLY) MPGSEL_2 .EQU $7A ; Z2 MEM MGR BANK 2 PAGE SELECT REG (WRITE ONLY) @@ -57,15 +56,21 @@ CTCPRECH .EQU 0 ; PRESCALE CHANNEL (0-3) CTCTIMCH .EQU 1 ; TIMER CHANNEL (0-3) CTCOSC .EQU 921600 ; CTC CLOCK FREQUENCY ; +PCFENABLE .EQU FALSE ; ENABLE PCF8584 I2C CONTROLLER +PCFBASE .EQU $F0 ; PCF8584 BASE I/O ADDRESS +; EIPCENABLE .EQU FALSE ; EIPC: ENABLE Z80 EIPC (Z84C15) INITIALIZATION ; SKZENABLE .EQU FALSE ; ENABLE SERGEY'S Z80-512K FEATURES ; WDOGMODE .EQU WDOG_NONE ; WATCHDOG MODE: WDOG_[NONE|EZZ80|SKZ] ; -DIAGENABLE .EQU FALSE ; ENABLES OUTPUT TO 8 BIT LED DIAGNOSTIC PORT -DIAGPORT .EQU $00 ; DIAGNOSTIC PORT ADDRESS -DIAGDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON DIAGNOSTIC LEDS +FPLED_ENABLE .EQU FALSE ; FP: ENABLES FRONT PANEL LEDS +FPLED_IO .EQU $00 ; FP: PORT ADDRESS FOR FP LEDS +FPLED_DSKACT .EQU TRUE ; FP: ENABLES DISK I/O ACTIVITY ON FP LEDS +FPSW_ENABLE .EQU FALSE ; FP: ENABLES FRONT PANEL SWITCHES +FPSW_IO .EQU $00 ; FP: PORT ADDRESS FOR FP SWITCHES +; DIAGLVL .EQU DL_CRITICAL ; ERROR LEVEL REPORTING ; LEDENABLE .EQU FALSE ; ENABLES STATUS LED @@ -73,12 +78,17 @@ LEDMODE .EQU LEDMODE_RTC ; LEDMODE_[STD|RTC] LEDPORT .EQU RTCIO ; STATUS LED PORT ADDRESS LEDDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON STATUS LED ; -DSKYENABLE .EQU FALSE ; ENABLES DSKY -DSKYMODE .EQU DSKYMODE_V1 ; DSKY VERSION: DSKYMODE_[V1|NG] -DSKYPPIBASE .EQU $60 ; BASE I/O ADDRESS OF DSKY PPI -DSKYOSC .EQU 3000000 ; OSCILLATOR FREQ FOR DSKYNG (IN HZ) +DSKYENABLE .EQU FALSE ; ENABLES DSKY FUNCTIONALITY +DSKYDSKACT .EQU TRUE ; ENABLES DISK ACTIVITY ON DSKY DISPLAY +ICMENABLE .EQU FALSE ; ENABLES ORIGINAL DSKY ICM DRIVER (7218) +ICMPPIBASE .EQU $60 ; BASE I/O ADDRESS OF ICM PPI +PKDENABLE .EQU FALSE ; ENABLES DSKY NG PKD DRIVER (8259) +PKDPPIBASE .EQU $60 ; BASE I/O ADDRESS OF PKD PPI +PKDOSC .EQU 3000000 ; OSCILLATOR FREQ FOR PKD (IN HZ) +H8PENABLE .EQU FALSE ; ENABLES HEATH H8 FRONT PANEL ; BOOTCON .EQU 0 ; BOOT CONSOLE DEVICE +SECCON .EQU $FF ; SECONDARY CONSOLE DEVICE CRTACT .EQU FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP VDAEMU .EQU EMUTYP_ANSI ; VDA EMULATION: EMUTYP_[TTY|ANSI] VDAEMU_SERKBD .EQU $FF ; VDA EMULATION: SERIAL KBD UNIT #, OR $FF FOR HW KBD @@ -112,8 +122,9 @@ UARTOSC .EQU 1843200 ; UART: OSC FREQUENCY IN MHZ UARTINTS .EQU FALSE ; UART: INCLUDE INTERRUPT SUPPORT UNDER IM1/2/3 UARTCFG .EQU DEFSERCFG ; UART: LINE CONFIG FOR UART PORTS UARTCASSPD .EQU SER_300_8N1 ; UART: ECB CASSETTE UART DEFAULT SPEED -UARTSBC .EQU TRUE ; UART: AUTO-DETECT SBC/ZETA ONBOARD UART +UARTSBC .EQU TRUE ; UART: AUTO-DETECT SBC/ZETA/DUO ONBOARD UART UARTSBCFORCE .EQU FALSE ; UART: FORCE DETECTION OF SBC UART (FOR SIMH) +UARTAUX .EQU FALSE ; UART: AUTO-DETECT AUX UART UARTCAS .EQU FALSE ; UART: AUTO-DETECT ECB CASSETTE UART UARTMFP .EQU FALSE ; UART: AUTO-DETECT MF/PIC UART UART4 .EQU FALSE ; UART: AUTO-DETECT 4UART UART @@ -137,6 +148,8 @@ TMSENABLE .EQU FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM) TMSMODE .EQU TMSMODE_NONE ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|MSX9958|MSXKBD|COLECO] TMSTIMENABLE .EQU FALSE ; TMS: ENABLE TIMER INTERRUPTS (REQUIRES IM1) VGAENABLE .EQU FALSE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM) +VRCENABLE .EQU FALSE ; VRC: ENABLE VGARC VIDEO/KBD DRIVER (VRC.ASM) +SCONENABLE .EQU FALSE ; SCON: ENABLE S100 CONSOLE DRIVER (SCON.ASM) ; MDENABLE .EQU TRUE ; MD: ENABLE MEMORY (ROM/RAM) DISK DRIVER (MD.ASM) MDROM .EQU TRUE ; MD: ENABLE ROM DISK @@ -148,9 +161,9 @@ FDENABLE .EQU TRUE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM) FDMODE .EQU FDMODE_ZETA2 ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPFDC|MBC] FDCNT .EQU 1 ; FD: NUMBER OF FLOPPY DRIVES ON THE INTERFACE (1-2) FDTRACE .EQU 1 ; FD: TRACE LEVEL (0=NO,1=FATAL,2=ERRORS,3=ALL) -FDMEDIA .EQU FDM144 ; FD: DEFAULT MEDIA FORMAT FDM[720|144|360|120|111] -FDMEDIAALT .EQU FDM720 ; FD: ALTERNATE MEDIA FORMAT FDM[720|144|360|120|111] FDMAUTO .EQU TRUE ; FD: AUTO SELECT DEFAULT/ALTERNATE MEDIA FORMATS +FD0TYPE .EQU FDT_3HD ; FD 0: DRIVE TYPE: FDT_[3DD|3HD|5DD|5HD|8] +FD1TYPE .EQU FDT_3HD ; FD 1: DRIVE TYPE: FDT_[3DD|3HD|5DD|5HD|8] ; RFENABLE .EQU FALSE ; RF: ENABLE RAM FLOPPY DRIVER ; @@ -164,11 +177,14 @@ PPIDE0A8BIT .EQU FALSE ; PPIDE 0A (MASTER): 8 BIT XFER PPIDE0B8BIT .EQU FALSE ; PPIDE 0B (SLAVE): 8 BIT XFER ; SDENABLE .EQU FALSE ; SD: ENABLE SD CARD DISK DRIVER (SD.ASM) -SDMODE .EQU SDMODE_PPI ; SD: DRIVER MODE: SDMODE_[JUHA|N8|CSIO|PPI|UART|DSD|MK4|SC|MT|USR] +SDMODE .EQU SDMODE_PPI ; SD: DRIVER MODE: SDMODE_[JUHA|N8|CSIO|PPI|UART|DSD|MK4|SC|MT|PIO|Z80R|USR] SDPPIBASE .EQU $60 ; SD: BASE I/O ADDRESS OF PPI FOR PPI MODDE SDCNT .EQU 1 ; SD: NUMBER OF SD CARD DEVICES (1-2), FOR DSD/SC/MT ONLY SDTRACE .EQU 1 ; SD: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) SDCSIOFAST .EQU FALSE ; SD: ENABLE TABLE-DRIVEN BIT INVERTER IN CSIO MODE +SDMTSWAP .EQU FALSE ; SD: SWAP THE LOGICAL ORDER OF THE SPI PORTS OF THE MT011 +; +CHENABLE .EQU FALSE ; CH: ENABLE CH375/376 USB SUPPORT ; PRPENABLE .EQU FALSE ; PRP: ENABLE ECB PROPELLER IO BOARD DRIVER (PRP.ASM) ; @@ -178,12 +194,20 @@ PPPSDENABLE .EQU TRUE ; PPP: ENABLE PPP DRIVER SD CARD SUPPORT PPPSDTRACE .EQU 1 ; PPP: SD CARD TRACE LEVEL (0=NO,1=ERRORS,2=ALL) PPPCONENABLE .EQU TRUE ; PPP: ENABLE PPP DRIVER VIDEO/KBD SUPPORT ; +ESPENABLE .EQU FALSE ; ESP: ENABLE ESP32 IO BOARD DRIVER (ESP.ASM) +; HDSKENABLE .EQU FALSE ; HDSK: ENABLE SIMH HDSK DISK DRIVER (HDSK.ASM) ; PIOENABLE .EQU FALSE ; PIO: ENABLE ZILOG PIO DRIVER (PIO.ASM) ; LPTENABLE .EQU FALSE ; LPT: ENABLE CENTRONICS PRINTER DRIVER (LPT.ASM) ; +PPAENABLE .EQU FALSE ; PPA: ENABLE PPA DISK DRIVER (PPA.ASM) +; +IMMENABLE .EQU FALSE ; IMM: ENABLE IMM DISK DRIVER (IMM.ASM) +; +SYQENABLE .EQU FALSE ; SYQ: ENABLE IMM DISK DRIVER (SYQ.ASM) +; PIO_4P .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB 4P BOARD PIO_ZP .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB ZILOG PERIPHERALS BOARD (PIO.ASM) PIO_SBC .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR 8255 CHIP @@ -197,7 +221,7 @@ SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM) ; DMAENABLE .EQU FALSE ; DMA: ENABLE DMA DRIVER (DMA.ASM) DMABASE .EQU $E0 ; DMA: DMA BASE ADDRESS -DMAMODE .EQU DMAMODE_NONE ; DMA: DMA MODE (NONE|ECB|Z180|Z280|RC|MBC) +DMAMODE .EQU DMAMODE_NONE ; DMA: DMA MODE (NONE|ECB|Z180|Z280|RC|MBC|DUO) ; YM2612ENABLE .EQU FALSE ; YM2612: ENABLE YM2612 DRIVER (MUTE STUB) -VGMBASE .EQU $C0 ; YM2612: BASE ADDRESS FOR VGM BOARD (YM2612/SN76469s/CTC) +VGMBASE .EQU $C0 ; YM2612: BASE ADDRESS FOR VGM BOARD (YM2612/SN76489s/CTC) diff --git a/Source/HBIOS/ch.asm b/Source/HBIOS/ch.asm new file mode 100644 index 00000000..ad884da4 --- /dev/null +++ b/Source/HBIOS/ch.asm @@ -0,0 +1,468 @@ +; +;================================================================================================== +; CH375/376 USB/SD DRIVER +;================================================================================================== +; +; https://www.wch-ic.com/ +; +; Thanks and credit to Alan Cox. Much of this driver is based on +; his code in FUZIX (https://github.com/EtchedPixels/FUZIX). +; +; This file is the core driver file for the CH37x devices. Since the +; CH376 supports both a USB Drive interface and an SD Card interface, +; the code for these interfaces is included as needed. See +; chusb.asm and chsd.asm. +; +; CH DEVICE TYPES +; +CHTYP_NONE .EQU 0 ; NONE +CHTYP_375 .EQU 1 ; CH375 +CHTYP_376 .EQU 2 ; CH376 +; +; CH MODE MANAGEMENT +; +CH_MODE_UNK .EQU 0 ; CURRENT MODE UNKNOWN +CH_MODE_USB .EQU 1 ; CURRENT MODE = USB +CH_MODE_SD .EQU 2 ; CURRENT MODE = SD +; +; CH375/376 COMMANDS +; +CH_CMD_VER .EQU $01 ; GET IC VER +CH_CMD_RESET .EQU $05 ; FULL CH37X RESET +CH_CMD_EXIST .EQU $06 ; CHECK EXISTS +CH_CMD_MAXLUN .EQU $0A ; GET MAX LUN NUMBER +CH_CMD_PKTSEC .EQU $0B ; SET PACKETS PER SECTOR +CH_CMD_SETRETRY .EQU $0B ; SET RETRIES +CH_CMD_FILESIZE .EQU $0C ; GET FILE SIZE (376) +CH_CMD_MODE .EQU $15 ; SET USB MODE +CH_CMD_TSTCON .EQU $16 ; TEST CONNECT +CH_CMD_ABRTNAK .EQU $17 ; ABORT DEVICE NAK RETRIES +CH_CMD_STAT .EQU $22 ; GET STATUS +CH_CMD_RD6 .EQU $27 ; READ USB DATA (375 & 376) +CH_CMD_RD5 .EQU $28 ; READ USB DATA (375) +CH_CMD_WR5 .EQU $2B ; WRITE USB DATA (375) +CH_CMD_WR6 .EQU $2C ; WRITE USB DATA (376) +CH_CMD_WRREQDAT .EQU $2D ; WRITE REQUESTED DATA (376) +CH_CMD_SET_FN .EQU $2F ; SET FILENAME (376) +CH_CMD_DSKMNT .EQU $31 ; DISK MOUNT +CH_CMD_FOPEN .EQU $32 ; FILE OPEN (376) +CH_CMD_FCREAT .EQU $34 ; FILE CREATE (376) +CH_CMD_BYTE_LOC .EQU $39 ; BYTE LOCATE +CH_CMD_BYTERD .EQU $3A ; BYTE READ +CH_CMD_BYTERDGO .EQU $3B ; BYTE READ GO +CH_CMD_BYTEWR .EQU $3C ; BYTE WRITE +CH_CMD_BYTEWRGO .EQU $3D ; BYTE WRITE GO +CH_CMD_DSKCAP .EQU $3E ; DISK CAPACITY +CH_CMD_AUTOSET .EQU $4D ; USB AUTO SETUP +CH_CMD_DSKINIT .EQU $51 ; DISK INIT +CH_CMD_DSKRES .EQU $52 ; DISK RESET +CH_CMD_DSKSIZ .EQU $53 ; DISK SIZE +CH_CMD_DSKRD .EQU $54 ; DISK READ +CH_CMD_DSKRDGO .EQU $55 ; CONTINUE DISK READ +CH_CMD_DSKWR .EQU $56 ; DISK WRITE +CH_CMD_DSKWRGO .EQU $57 ; CONTINUE DISK WRITE +CH_CMD_DSKINQ .EQU $58 ; DISK INQUIRY +CH_CMD_DSKRDY .EQU $59 ; DISK READY +; +; SUB-DRIVER SETUP +; +CHUSBENABLE .EQU ((CH0USBENABLE == TRUE) | (CH1USBENABLE == TRUE)) +CHSDENABLE .EQU ((CH0SDENABLE == TRUE) | (CH1SDENABLE == TRUE)) +; +#IF (!CHUSBENABLE) +CHUSB_CFG0 .EQU 0 ; DUMMY ENTRY +CHUSB_CFG1 .EQU 0 ; DUMMY ENTRY +#ENDIF +; +#IF (!CHSDENABLE) +CHSD_CFG0 .EQU 0 ; DUMMY ENTRY +CHSD_CFG1 .EQU 0 ; DUMMY ENTRY +#ENDIF +; +; CH DEVICE CONFIGURATION +; +CH_CFGSIZ .EQU 9 ; SIZE OF CFG TBL ENTRIES +; +; CONFIG ENTRY DATA OFFSETS +; +CH_DEV .EQU 0 ; OFFSET OF DEVICE NUMBER (BYTE) +CH_TYPE .EQU 1 ; CH DEVICE TYPE (CHTYP_XXX) +CH_IOBASE .EQU 2 ; IO BASE ADDRESS (BYTE) +CH_USBENABLE .EQU 3 ; ENABLE USB SUB-DRIVER +CH_USBCFG .EQU 4 ; USB SUB-DRIVER CFG ENTRY +CH_SDENABLE .EQU 6 ; ENABLE SD CARD SUB-DRIVER +CH_SDCFG .EQU 7 ; SD CARD SUB-DRIVER CFG ENTRY +; +CH_CFGTBL: +; +#IF (CHCNT >= 1) +CH_CFG0: ; DEVICE 0 + .DB 0 ; DEV NUM + .DB CHTYP_NONE ; DEV TYPE, FILLED DYNCAMICALLY + .DB CH0BASE ; IO BASE ADDRESS + .DB CH0USBENABLE ; ENABLE USB SUB-DRIVER + .DW CHUSB_CFG0 ; USB SUB-DRIVER INIT ADR + .DB CH0SDENABLE ; ENABLE SD CARD SUB-DRIVER + .DW CHSD_CFG0 ; SD CARD SUB-DRIVER INIT ADR +; + .ECHO "CH: IO=" + .ECHO CH0BASE + .ECHO "\n" +#ENDIF +; +#IF (CHCNT >= 2) +CH_CFG1: ; DEVICE 1 + .DB 1 ; DEV NUM + .DB CHTYP_NONE ; DEV TYPE, FILLED DYNCAMICALLY + .DB CH1BASE ; IO BASE ADDRESS + .DB CH1USBENABLE ; ENABLE USB SUB-DRIVER + .DW CHUSB_CFG1 ; USB SUB-DRIVER INIT ADR + .DB CH1SDENABLE ; ENABLE SD CARD SUB-DRIVER + .DW CHSD_CFG1 ; SD CARD SUB-DRIVER INIT ADR +; + .ECHO "CH: IO=" + .ECHO CH1BASE + .ECHO "\n" +#ENDIF +; +#IF ($ - CH_CFGTBL) != (CHCNT * CH_CFGSIZ) + .ECHO "*** INVALID CH CONFIG TABLE ***\n" +#ENDIF +; + .DB $FF ; END OF TABLE MARKER +; +; GLOBAL CH37X INITIALIZATION +; +CH_INIT: + LD IY,CH_CFGTBL ; POINT TO START OF CONFIG TABLE +; +CH_INIT1: + LD A,(IY) ; LOAD FIRST BYTE TO CHECK FOR END + CP $FF ; CHECK FOR END OF TABLE VALUE + JR NZ,CH_INIT2 ; IF NOT END OF TABLE, CONTINUE + XOR A ; SIGNAL SUCCESS + RET ; AND RETURN +; +CH_INIT2: + CALL NEWLINE ; FORMATTING + PRTS("CH$") ; LABEL FOR IO ADDRESS + LD A,(IY+CH_DEV) ; DEVICE NUMBER + CALL PRTDECB ; PRINT IT + CALL PC_COLON ; FORMATTING +; + PRTS(" IO=0x$") ; LABEL FOR IO ADDRESS + LD A,(IY+CH_IOBASE) ; GET IO BASE ADDRES + CALL PRTHEXBYTE ; DISPLAY IT +; + XOR A ; UNKNOWN MODE + LD (CH0_MODE),A ; SAVE IT + LD (CH1_MODE),A ; SAVE IT + ;CALL CH_FLUSH ; FLUSH DEVICE OUTPUT QUEUE +; + ; VERSION 4 OF THE CH376 CHIPS ARE HAVING TROUBLE WITH THE + ; RESET COMMAND. ON Z80 SYSTEMS THEY TAKE A VERY LONG TIME + ; TO RESET. ON Z180 SYSTEMS, I AM NOT SEEING AN ISSUE. + ; CH375 CHIPS AND VERSION 3 OF THE CH376 SEEM FINE (IN Z80 + ; OR Z180 SYSTEMS). NO IDEA WHAT IS GOING ON, SO I AM + ; GIVING UP FOR NOW AND REMOVING THE RESET. +; + ;CALL CH_RESET ; FULL CH37X RESET +; + CALL CH_DETECT ; DETECT CHIP PRESENCE + JR Z,CH_INIT3 ; GO AHEAD IF CHIP FOUND + LD DE,CH_STR_NOHW ; NOT PRESENT + CALL WRITESTR ; PRINT IT + JR CH_INIT4 ; NEXT ENTRY +; +CH_INIT3: + CALL CH_GETVER ; GET VERSION BYTE + ;CALL PC_SPACE ; *DEBUG* + ;CALL PRTHEXBYTE ; *DEBUG* +; + LD B,A ; SAVE IN REG B + AND $C0 ; ISOLATE CHIP TYPE BITS + LD C,CHTYP_375 ; ASSUME CH375 + LD DE,CH_STR_375 ; STRING FOR CH375 + CP $80 ; 375? + JR Z,CH_INIT3A ; IF SO, RECORD IT + LD C,CHTYP_376 ; ASSUME CH376 + LD DE,CH_STR_376 ; STRING FOR CH376 + CP $40 ; 376? + JR Z,CH_INIT3A ; IF SO, RECORD IT + PRTS(" VER ERR 0x$") ; SHOW VERSION ERROR + LD A,B ; GET VERSION BYTE BACK + CALL PRTHEXBYTE ; PRINT IT + JR CH_INIT4 ; NEXT ENTRY +; +CH_INIT3A: + LD A,C ; CHIP TYPE TO ACCUM + LD (IY+CH_TYPE),A ; SAVE IT + PRTS(" TYPE=$") ; TAG + CALL WRITESTR ; PRINT CHIP TYPE + PRTS(" VER=0x$") ; LABEL FOR CHIP VERSION + LD A,B ; RECOVER VERSION BYTE + AND $3F ; ISOLATE VERSION BITS + CALL PRTHEXBYTE ; PRINT IT +; +#IF (CHUSBENABLE) + ; USB SUB-DRIVER INIT + LD L,(IY+CH_USBCFG+0) ; LSB OF USB CFG ENTRY + LD H,(IY+CH_USBCFG+1) ; MSB OF USB CFG ENTRY + LD A,(IY+CH_USBENABLE) ; USB ENABLED? + PUSH IY ; SAVE IY + OR A ; SET FLAGS + CALL NZ,CHUSB_INIT ; IF SO, DO USB INIT + POP IY ; RESTORE IY +#ENDIF +; +#IF (CHSDENABLE) + ; SD CARD SUB-DRIVER INIT + LD L,(IY+CH_SDCFG+0) ; LSB OF SD CFG ENTRY + LD H,(IY+CH_SDCFG+1) ; MSB OF SD CFG ENTRY + LD A,(IY+CH_SDENABLE) ; SD ENABLED? + PUSH IY ; SAVE IY + OR A ; SET FLAGS + CALL NZ,CHSD_INIT ; IF SO, DO SD INIT + POP IY ; RESTORE IY +#ENDIF +; +CH_INIT4: + LD DE,CH_CFGSIZ ; SIZE OF CFG TABLE ENTRY + ADD IY,DE ; BUMP POINTER + JP CH_INIT1 ; AND LOOP +; +; SEND COMMAND IN A +; +CH_CMD: + LD C,(IY+CH_IOBASE) ; BASE PORT + INC C ; BUMP TO CMD PORT + OUT (C),A ; SEND COMMAND + CALL CH_NAP ; *DEBUG* + RET +; +; GET STATUS +; +CH_STAT: + LD C,(IY+CH_IOBASE) ; BASE PORT + INC C ; BUMP TO CMD PORT + IN A,(C) ; READ STATUS + RET +; +; READ A BYTE FROM DATA PORT +; +CH_RD: + LD C,(IY+CH_IOBASE) ; BASE PORT + IN A,(C) ; READ BYTE + RET +; +; WRITE A BYTE TO DATA PORT +; +CH_WR: + LD C,(IY+CH_IOBASE) ; BASE PORT + OUT (C),A ; READ BYTE + RET +; +; SMALL DELAY REQUIRED AT STRATEGIC LOCATIONS +; +CH_NAP: + JP DELAY +; +; POLL WAITING FOR INTERRUPT +; +CH_POLL: + PUSH BC ; SAVE BC + PUSH HL ; SAVE HL + CALL CH_NAP ; SMALL DELAY + LD A,(CB_CPUMHZ) ; USE CPU SPEED AS CPU + LD B,A ; ... SPEED COMP COUNTER +CH_POLL0: + LD HL,$8000 ; PRIMARY LOOP COUNTER +CH_POLL1: + CALL CH_STAT ; GET INT STATUS + BIT 7,A ; CHECK BIT + JR Z,CH_POLL2 ; IF ZERO, MOVE ON + DEC HL ; DECREMENT COUNTER + LD A,H ; CHECK + OR L ; ... LOOP COUNTER + JR NZ,CH_POLL1 ; INNER LOOP AS NEEDED + DJNZ CH_POLL0 ; OUTER LOOP AS NEEDED + POP HL ; RESTORE HL + POP BC ; RESTORE BC + OR $FF ; FLAG TIMEOUT + RET ; AND RETURN +CH_POLL2: + LD A,CH_CMD_STAT ; GET STATUS + CALL CH_CMD ; SEND IT + CALL CH_NAP ; SMALL DELAY + CALL CH_RD ; GET RESULT + ;PUSH AF ; *DEBUG* + ;LD A,B ; *DEBUG* + ;CALL PC_SPACE ; *DEBUG* + ;CALL PC_LBKT ; *DEBUG* + ;CALL PRTHEXBYTE ; *DEBUG* + ;CALL PC_RBKT ; *DEBUG* + ;POP AF ; *DEBUG* + POP HL ; RESTORE HL + POP BC ; RESTORE BC + RET ; AND RETURN +; +; SEND READ USB DATA COMMAND +; USING BEST OPCODE FOR DEVICE +; +CH_CMD_RD: + LD A,(IY+CH_TYPE) + CP CHTYP_375 + JR NZ,CH_CMD_RD1 +; + ; SEND CH375 READ USB DATA CMD + LD A,CH_CMD_RD5 + JP CH_CMD +; +CH_CMD_RD1: + ; SEND CH376 READ USB DATA CMD + LD A,CH_CMD_RD6 + JP CH_CMD +; +; SEND WRITE USB DATA COMMAND +; USING BEST OPCODE FOR DEVICE +; +CH_CMD_WR: + LD A,(IY+CH_TYPE) + CP CHTYP_375 + JR NZ,CH_CMD_WR1 +; + ; SEND CH375 WRITE USB DATA CMD + LD A,CH_CMD_WR5 + JP CH_CMD +; +CH_CMD_WR1: + ; SEND CH376 WRITE USB DATA CMD + LD A,CH_CMD_WR6 + JP CH_CMD +; +; PERFORM A FULL HARDWARE RESET ON CH37X +; +CH_RESET: + ;PRTS("\r\nHW RESET:$") ; *DEBUG* + PUSH DE + LD A,CH_CMD_RESET + CALL CH_CMD + LD DE,2500 ; 16US * 2500 = 40MS + CALL VDELAY + ;CALL CH_RD ; *DEBUG* + ;CALL PC_SPACE ; *DEBUG* + ;CALL PRTHEXBYTE ; *DEBUG* + POP DE + RET +; +; EMPTY THE CH37X OUTPUT QUEUE OF GARBAGE +; +CH_FLUSH: + LD B,$80 +CH_FLUSH1: + CALL CH_RD + DJNZ CH_FLUSH1 + RET +; +; +; +CH_DETECT: + ;PRTS("\r\nDETECT:$") ; *DEBUG* +CH_DETECT1: + LD A,CH_CMD_EXIST ; LOAD COMMAND + CALL CH_CMD ; SEND COMMAND + LD A,$AA ; LOAD CHECK PATTERN + CALL CH_WR ; SEND IT + CALL CH_NAP ; SMALL DELAY + CALL CH_RD ; GET ECHO + ;CALL PC_SPACE ; *DEBUG* + ;CALL PRTHEXBYTE ; *DEBUG* + CP $55 ; SHOULD BE INVERTED + RET ; RETURN +; +; +; +CH_GETVER: + LD A,CH_CMD_VER ; LOAD COMMAND + CALL CH_CMD ; SEND COMMAND + CALL CH_RD ; GET VERSION BYTE + RET ; DONE +; +; SET MODE TO VALUE IN A +; AVOID CHANGING MODES IF CURRENT MODE = NEW MODE +; THE CH376 DOES NOT SEEM TO MAINTAIN SEPARATE OPERATING CONTEXTS FOR +; THE USB AND SD DEVICES. IF BOTH ARE IN OPERATION, THEN A MODE +; SWITCH REQUIRES A COMPLETE REINITIALIZATION OF THE REQUESTED +; DEVICE. THIS WHOLE MESS IS ONLY NEEDED IF BOTH CHSD AND CHUSB +; ARE ENDABLED, SO IT IS CONDITIONAL. +; +CH_SETMODE: +#IF (CHUSBENABLE & CHSDENABLE) + PUSH BC ; SAVE BC + PUSH DE ; SAVE DE + PUSH HL ; SAVE HL + ;PRTS("\r\nSETMODE:$") ; *DEBUG* + ;CALL PC_SPACE ; *DEBUG* + ;CALL PRTHEXBYTE ; *DEBUG* + LD E,A ; SAVE REQUESTED MODE +; + ; WARNING: CH_SETMODE IS CALLED BY THE SUB-DRIVERS, SO + ; IY WILL BE A POINTER TO THE CONFIG BLOCK OF THE SUB-DRIVER. + ; BY CONVENTION, THE LOCATION OF THE MODE BYTE FOR EACH + ; SUB-DRIVER IS AT OFFSET 12 IN THE CONFIG BLOCK! + LD L,(IY+12) ; GET MODE PTR (LSB) + LD H,(IY+13) ; GET MODE PTR (MSB) + LD A,(HL) ; GET CUR MODE + ;CALL PC_SPACE ; *DEBUG* + ;CALL PRTHEXBYTE ; *DEBUG* + CP E ; COMPARE + JR Z,CH_SETMODE_Z ; IF EQUAL, DONE +; + ; NEED TO CHANGE MODES + LD A,E ; RECOVER REQUESTED MODE + CP CH_MODE_USB ; USB? + JR Z,CH_SETMODE_USB ; IF SO, DO IT + CP CH_MODE_SD ; SD? + JR Z,CH_SETMODE_SD ; IF SO, DO IT + OR $FF ; SIGNAL ERROR + JR CH_SETMODE_Z ; BAIL OUT +; +CH_SETMODE_USB: +#IF (CHUSBENABLE) + CALL CHUSB_RESET ; FULL USB STACK RESET +#ENDIF + JR CH_SETMODE_Z ; MOVE ON +; +CH_SETMODE_SD: +#IF (CHSDENABLE) + CALL CHSD_RESET ; FULL SD STACK RESET +#ENDIF + JR CH_SETMODE_Z ; MOVE ON +; +CH_SETMODE_Z: + POP HL ; RECOVER HL + POP DE ; RECOVER DE + POP BC ; RECOVER BC +#ENDIF + RET ; DONE +; +; +; +CH0_MODE .DB CH_MODE_UNK +CH1_MODE .DB CH_MODE_UNK +; +CH_STR_NOHW .TEXT " NOT PRESENT$" +; +CH_STR_375 .TEXT "CH375$" +CH_STR_376 .TEXT "CH376$" +; +; INCLUDE SUB-DRIVERS AS NEEDED +; +#IF (CHUSBENABLE) + #INCLUDE "chusb.asm" +#ENDIF +; +#IF (CHSDENABLE) + #INCLUDE "chsd.asm" +#ENDIF +; diff --git a/Source/HBIOS/chsd.asm b/Source/HBIOS/chsd.asm new file mode 100644 index 00000000..a5789c9a --- /dev/null +++ b/Source/HBIOS/chsd.asm @@ -0,0 +1,685 @@ +; +;================================================================================================== +; CH376 SD CARD SUB-DRIVER +;================================================================================================== +; +; Thanks and credit to Alan Cox. Much of this driver is based on +; his code in FUZIX (https://github.com/EtchedPixels/FUZIX). +; +; This file contains the SD Card specific support for the CH37x +; driver. This file is included by the core driver file (ch.asm) as +; needed. Note that only the CH376 actually supports SD Card access. +; +; The SD Card support is implemented using the CH376 file-level +; support. It is *not* possible to access SD Cards using raw +; sector I/O. +; +; TODO: +; - Implement auto-recovery on error status? +; +#DEFINE CHSD_IMGFILE "DISK.IMG" +; +CHSD_FASTIO .EQU TRUE ; USE INIR/OTIR? +; +; CHUSB DEVICE STATUS +; +CHSD_STOK .EQU 0 +CHSD_STNOMEDIA .EQU -1 +CHSD_STCMDERR .EQU -2 +CHSD_STIOERR .EQU -3 +CHSD_STTO .EQU -4 +CHSD_STNOTSUP .EQU -5 +CHSD_STNOFILE .EQU -6 +; +; CHSD DEVICE CONFIGURATION +; +CHSD_CFGSIZ .EQU 14 ; SIZE OF USB CFG TBL ENTRIES +; +; CONFIG ENTRY DATA OFFSETS +; +; THE LOCATION OF CHSD_MODE IS SHARED BY ALL SUB-DRIVERS AND THE +; CH_SETMODE FUNCTION IN THE MAIN DRIVER (CH.ASM). IF YOU CHANGE +; IT, YOU MUST SYNC UP THE MAIN DRIVER AND ALL SUB-DRIVERS! +; +; FIRST 3 BYTES SAME AS CH CONFIG +CHSD_STAT .EQU 3 ; LAST STATUS (BYTE) +CHSD_MEDCAP .EQU 4 ; MEDIA CAPACITY (DWORD) +CHSD_LBA .EQU 8 ; CURRENT LBA (DWORD) +CHSD_MODE .EQU 12 ; PTR TO MODE BYTE (WORD) +; +CHSD_CFGTBL: +; +#IF (CHCNT >= 1) +CHSD_CFG0: + .DB 0 ; DEV NUM, FILLED DYNAMICALLY + .DB CHTYP_NONE ; DEV TYPE, FILLED DYNCAMICALLY + .DB CH0BASE ; IO BASE ADDRESS + .DB 0 ; DEVICE STATUS + .DW 0,0 ; DEVICE CAPACITY + .DW 0,0 ; CURRENT LBA + .DW CH0_MODE ; POINTER TO MODE BYTE +; + #IF (CH0SDENABLE) + .ECHO "CHSD: IO=" + .ECHO CH0BASE + .ECHO "\n" + #ENDIF +#ENDIF +; +#IF (CHCNT >= 2) +CHSD_CFG1: + .DB 0 ; DEV NUM + .DB CHTYP_NONE ; DEV TYPE, FILLED DYNCAMICALLY + .DB CH1BASE ; IO BASE ADDRESS + .DB 0 ; DEVICE STATUS + .DW 0,0 ; DEVICE CAPACITY + .DW 0,0 ; CURRENT LBA + .DW CH1_MODE ; POINTER TO MODE BYTE +; + #IF (CH1SDENABLE) + .ECHO "CHSD: IO=" + .ECHO CH1BASE + .ECHO "\n" + #ENDIF +#ENDIF +; +#IF ($ - CHSD_CFGTBL) != (CHCNT * CHSD_CFGSIZ) + .ECHO "*** INVALID CHSD CONFIG TABLE ***\n" +#ENDIF +; + .DB $FF ; END OF TABLE MARKER +; +; +; +CHSD_INIT: + LD A,(IY+CH_TYPE) ; GET DEVICE TYPE + PUSH HL ; COPY INCOMING HL + POP IY ; ... TO IY + LD (IY+CH_TYPE),A ; SAVE DEVICE TYPE +; + ; UPDATE DRIVER RELATIVE UNIT NUMBER IN CONFIG TABLE + LD A,(CHSD_DEVNUM) ; GET NEXT UNIT NUM TO ASSIGN + LD (IY+CH_DEV),A ; UPDATE IT + INC A ; BUMP TO NEXT UNIT NUM TO ASSIGN + LD (CHSD_DEVNUM),A ; SAVE IT +; + ; ADD UNIT TO GLOBAL DISK UNIT TABLE + LD BC,CHSD_FNTBL ; BC := FUNC TABLE ADR + PUSH IY ; CFG ENTRY POINTER + POP DE ; COPY TO DE + CALL DIO_ADDENT ; ADD ENTRY TO GLOBAL DISK DEV TABLE +; + CALL CHSD_RESET ; RESET & DISCOVER MEDIA +#IF (CHSDTRACE <= 1) + CALL NZ,CHSD_PRTSTAT +#ENDIF + RET NZ ; ABORT ON FAILURE +; + ; START PRINTING DEVICE INFO + CALL CHSD_PRTPREFIX ; PRINT DEVICE PREFIX +; + ; PRINT STORAGE CAPACITY (BLOCK COUNT) + PRTS(" BLOCKS=0x$") ; PRINT FIELD LABEL + LD A,CHSD_MEDCAP ; OFFSET TO CAPACITY FIELD + CALL LDHLIYA ; HL := IY + A, REG A TRASHED + CALL LD32 ; GET THE CAPACITY VALUE + CALL PRTHEX32 ; PRINT HEX VALUE +; + ; PRINT STORAGE SIZE IN MB + PRTS(" SIZE=$") ; PRINT FIELD LABEL + LD B,11 ; 11 BIT SHIFT TO CONVERT BLOCKS --> MB + CALL SRL32 ; RIGHT SHIFT + CALL PRTDEC32 ; PRINT DWORD IN DECIMAL + PRTS("MB$") ; PRINT SUFFIX +; + XOR A ; SIGNAL SUCCESS + RET +; +; DRIVER FUNCTION TABLE +; +CHSD_FNTBL: + .DW CHSD_STATUS + .DW CHSD_RESET + .DW CHSD_SEEK + .DW CHSD_READ + .DW CHSD_WRITE + .DW CHSD_VERIFY + .DW CHSD_FORMAT + .DW CHSD_DEVICE + .DW CHSD_MEDIA + .DW CHSD_DEFMED + .DW CHSD_CAP + .DW CHSD_GEOM +#IF (($ - CHSD_FNTBL) != (DIO_FNCNT * 2)) + .ECHO "*** INVALID CHSD FUNCTION TABLE ***\n" +#ENDIF +; +CHSD_VERIFY: +CHSD_FORMAT: +CHSD_DEFMED: + SYSCHKERR(ERR_NOTIMPL) ; NOT IMPLEMENTED + RET +; +; +; +CHSD_READ: + LD A,CH_MODE_SD ; REQUEST SD MODE + CALL CH_SETMODE ; DO IT + JP NZ,CHSD_CMDERR ; HANDLE ERROR +; + CALL HB_DSKREAD ; HOOK HBIOS DISK READ SUPERVISOR + LD (CHSD_DSKBUF),HL ; SAVE DISK BUFFER ADDRESS + CALL CHSD_RWSTART ; SET LBA OFFSET + RET NZ +; + ;PRTS("\n\rREAD:$") ; *DEBUG* + LD A,CH_CMD_BYTERD ; BYTE READ + CALL CH_CMD ; SEND COMMAND + CALL CH_NAP + LD A,0 ; LSB + CALL CH_WR ; SEND IT + LD A,2 ; MSB + CALL CH_WR ; SEND IT + CALL CH_POLL ; GET RESULT + ;CALL PC_SPACE ; *DEBUG* + ;CALL PRTHEXBYTE ; *DEBUG* + CP $1D ; DATA READY TO READ? + JP NZ,CHSD_IOERR ; HANDLE I/O ERROR +; + LD HL,(CHSD_DSKBUF) +CHSD_READ1: + CALL CH_CMD_RD ; SEND READ USB DATA CMD + CALL CH_RD ; GET DATA LENGTH + ;CALL PC_SPACE ; *DEBUG* + ;CALL PRTHEXBYTE ; *DEBUG* +; +#IF (CHSD_FASTIO) + LD B,A ; BYTE COUNT TO READ + LD C,(IY+CH_IOBASE) ; BASE PORT + INIR ; DO IT FAST +#ELSE + LD B,A ; SAVE IT +CHSD_READ2: + CALL CH_RD ; GET DATA BYTE + LD (HL),A ; SAVE IN BUFFER + INC HL ; INC BUF PTR + DJNZ CHSD_READ2 ; LOOP TILL DONE W/ ALL BYTES +#ENDIF +; + LD A,CH_CMD_BYTERDGO ; BYTE READ GO COMMAND + CALL CH_CMD ; SEND IT + CALL CH_NAP + CALL CH_POLL ; GET RESULT + ;CALL PC_SPACE ; *DEBUG* + ;CALL PRTHEXBYTE ; *DEBUG* + CP $1D ; MORE? + JR Z,CHSD_READ1 ; IF SO, GET MORE + CP $14 ; GOOD FINISH? + JP NZ,CHSD_IOERR ; HANDLE ERROR +; + ; INCREMENT LBA + PUSH HL ; SAVE HL + LD A,CHSD_LBA ; LBA OFFSET + CALL LDHLIYA ; HL := IY + A, REG A TRASHED + CALL INC32HL ; INCREMENT THE VALUE + POP HL ; RESTORE HL +; + XOR A ; SIGNAL SUCCESS + RET +; +; +; +CHSD_WRITE: + LD A,CH_MODE_SD ; REQUEST SD MODE + CALL CH_SETMODE ; DO IT + JP NZ,CHSD_CMDERR ; HANDLE ERROR +; + CALL HB_DSKWRITE ; HOOK HBIOS DISK WRITE SUPERVISOR + LD (CHSD_DSKBUF),HL ; SAVE DISK BUFFER ADDRESS + CALL CHSD_RWSTART ; SET LBA OFFSET' + RET NZ +; + ;PRTS("\n\rWRITE:$") ; *DEBUG* + LD A,CH_CMD_BYTEWR ; BYTE WRITE + CALL CH_CMD ; SEND COMMAND + LD A,0 ; LSB + CALL CH_WR ; SEND IT + LD A,2 ; MSB + CALL CH_WR ; SEND IT + CALL CH_POLL ; GET RESULT + ;CALL PC_SPACE ; *DEBUG* + ;CALL PRTHEXBYTE ; *DEBUG* + CP $1E ; DATA READY TO GO? + JP NZ,CHSD_IOERR ; HANDLE I/O ERROR +; + LD HL,(CHSD_DSKBUF) +CHSD_WRITE1: + LD A,CH_CMD_WRREQDAT ; WRITE REQUESTED DATA CMD + CALL CH_CMD ; SEND IT + CALL CH_RD ; GET DATA LENGTH + ;CALL PC_SPACE ; *DEBUG* + ;CALL PRTHEXBYTE ; *DEBUG* +; +#IF (CHSD_FASTIO) + LD B,A ; BYTE COUNT TO WRITE + LD C,(IY+CH_IOBASE) ; BASE PORT + OTIR ; DO IT FAST +#ELSE + LD B,A ; SAVE IT +CHSD_WRITE2: + CALL CH_WR ; WRITE DATA BYTE + LD (HL),A ; SAVE IN BUFFER + INC HL ; INC BUF PTR + DJNZ CHSD_WRITE2 ; LOOP TILL DONE W/ ALL BYTES +#ENDIF +; + LD A,CH_CMD_BYTEWRGO ; BYTE WRITE GO COMMAND + CALL CH_CMD ; SEND IT + CALL CH_NAP + CALL CH_POLL ; GET RESULT + ;CALL PC_SPACE ; *DEBUG* + ;CALL PRTHEXBYTE ; *DEBUG* + CP $1E ; MORE? + JR Z,CHSD_WRITE1 ; IF SO, SEND MORE + CP $14 ; GOOD FINISH? + JP NZ,CHSD_IOERR ; HANDLE ERROR +; + ; INCREMENT LBA + PUSH HL ; SAVE HL + LD A,CHSD_LBA ; LBA OFFSET + CALL LDHLIYA ; HL := IY + A, REG A TRASHED + CALL INC32HL ; INCREMENT THE VALUE + POP HL ; RESTORE HL +; + XOR A ; SIGNAL SUCCESS + RET +; +; SEEK TO CURRENT LBA +; +CHSD_RWSTART: + ;PRTS("\n\rRWST:$") ; *DEBUG* + LD A,CH_CMD_BYTE_LOC ; BYTE LOCATE COMMAND (SEEK) + CALL CH_CMD ; SEND IT +; + ; GET CURRENT LBA OFFSET + LD A,CHSD_LBA ; OFFSET TO CAPACITY FIELD + CALL LDHLIYA ; HL := IY + A, REG A TRASHED + CALL LD32 ; OFFSET = DE:HL +; + ; CONVERT OFFSET FROM LBA TO BYTE + LD B,9 +CHSD_RWSTART1: + SLA L + RL H + RL E + RL D + DJNZ CHSD_RWSTART1 + ;CALL PRTHEX32 ; *DEBUG* +; + ; SEND THE BYTE OFFSET (LSB FIRST) + LD A,L + CALL CH_WR + LD A,H + CALL CH_WR + LD A,E + CALL CH_WR + LD A,D + CALL CH_WR +; + CALL CH_POLL ; WAIT FOR RESPONSE + ;CALL PC_SPACE ; *DEBUG* + ;CALL PRTHEXBYTE ; *DEBUG* + CP $14 ; CHECK RESULT + JP NZ,CHSD_CMDERR ; HANDLE CMD ERROR +; + XOR A + RET +; +; +; +CHSD_STATUS: + ; RETURN UNIT STATUS + LD A,(IY+CHSD_STAT) ; GET STATUS OF SELECTED DEVICE + OR A ; SET FLAGS + RET ; AND RETURN +; +; RESET THE INTERFACE AND REDISCOVER MEDIA +; +CHSD_RESET: + ;PRTS("\n\rRES SD:$") ; *DEBUG* +; + ; ACTIVATE SD MODE + LD A,CH_CMD_MODE ; SET MODE COMMAND + CALL CH_CMD ; SEND IT + LD A,3 ; SD MODE + CALL CH_WR ; SEND IT + CALL CH_NAP ; SMALL WAIT + CALL CH_RD ; GET RESULT + ;CALL PC_SPACE ; *DEBUG* + ;CALL PRTHEXBYTE ; *DEBUG* + CALL CH_NAP ; SMALL WAIT +; + LD A,CH_MODE_SD ; WE ARE NOW IN SD MODE + LD L,(IY+CHSD_MODE+0) ; GET MODE PTR (LSB) + LD H,(IY+CHSD_MODE+1) ; GET MODE PTR (MSB) + LD (HL),A ; SAVE IT +; + CALL CHSD_DSKMNT ; MOUNT DISK + RET NZ +; + ; OPEN DISK IMAGE FILE + LD DE,CHSD_FNAME + CALL CHSD_FOPEN + RET NZ +; + ; GET FILESIZE + CALL CHSD_FILESIZE + RET NZ +; + ; SET STATUS AND RETURN + XOR A ; CLEAR STATUS + LD (IY+CHSD_STAT),A ; RECORD STATUS + OR A ; SET FLAGS + RET ; AND RETURN +; +; +; +CHSD_DEVICE: + LD D,DIODEV_CHSD ; D := DEVICE TYPE + LD E,(IY+CH_DEV) ; E := PHYSICAL DEVICE NUMBER + LD C,%00110010 ; SD HARD DISK ATTRIBUTES + LD H,(IY+CH_TYPE) ; H := MODE + LD L,(IY+CH_IOBASE) ; L := BASE I/O ADDRESS + XOR A ; SIGNAL SUCCESS + RET +; +; CHSD_GETMED +; +CHSD_MEDIA: + LD A,E ; GET FLAGS + OR A ; SET FLAGS + JR Z,CHSD_MEDIA1 ; JUST REPORT CURRENT STATUS AND MEDIA + CALL CHSD_RESET ; RESET CHSD INTERFACE +; +CHSD_MEDIA1: + LD A,(IY+CHSD_STAT) ; GET STATUS + OR A ; SET FLAGS + LD D,0 ; NO MEDIA CHANGE DETECTED + LD E,MID_HD ; ASSUME WE ARE OK + RET Z ; RETURN IF GOOD INIT + LD E,MID_NONE ; SIGNAL NO MEDIA + LD A,ERR_NOMEDIA ; NO MEDIA ERROR + OR A ; SET FLAGS + RET ; AND RETURN +; +; +; +CHSD_SEEK: + BIT 7,D ; CHECK FOR LBA FLAG + CALL Z,HB_CHS2LBA ; CLEAR MEANS CHS, CONVERT TO LBA + RES 7,D ; CLEAR FLAG REGARDLESS (DOES NO HARM IF ALREADY LBA) + LD (IY+CHSD_LBA+0),L ; SAVE NEW LBA + LD (IY+CHSD_LBA+1),H ; ... + LD (IY+CHSD_LBA+2),E ; ... + LD (IY+CHSD_LBA+3),D ; ... + XOR A ; SIGNAL SUCCESS + RET ; AND RETURN +; +; +; +CHSD_CAP: + LD A,(IY+CHSD_STAT) ; GET STATUS + PUSH AF ; SAVE IT + LD A,CHSD_MEDCAP ; OFFSET TO CAPACITY FIELD + CALL LDHLIYA ; HL := IY + A, REG A TRASHED + CALL LD32 ; GET THE CURRENT CAPACITY INTO DE:HL + LD BC,512 ; 512 BYTES PER BLOCK + POP AF ; RECOVER STATUS + OR A ; SET FLAGS + RET +; +; +; +CHSD_GEOM: + ; FOR LBA, WE SIMULATE CHS ACCESS USING 16 HEADS AND 16 SECTORS + ; RETURN HS:CC -> DE:HL, SET HIGH BIT OF D TO INDICATE LBA CAPABLE + CALL CHSD_CAP ; GET TOTAL BLOCKS IN DE:HL, BLOCK SIZE TO BC + LD L,H ; DIVIDE BY 256 FOR # TRACKS + LD H,E ; ... HIGH BYTE DISCARDED, RESULT IN HL + LD D,16 | $80 ; HEADS / CYL = 16, SET LBA CAPABILITY BIT + LD E,16 ; SECTORS / TRACK = 16 + RET ; DONE, A STILL HAS CHSD_CAP STATUS +; +; CH37X HELPER ROUTINES +; +; +; PERFORM DISK MOUNT +; +CHSD_DSKMNT: + ;PRTS("\n\rMOUNT:$") ; *DEBUG* + LD A,CH_CMD_DSKMNT ; DISK QUERY + CALL CH_CMD ; DO IT + CALL CH_POLL ; WAIT FOR RESPONSE + ;CALL PC_SPACE ; *DEBUG* + ;CALL PRTHEXBYTE ; *DEBUG* + CP $82 ; NO DISK? + JP Z,CHSD_NOMEDIA ; HANDLE NO MEDIA ERROR + CP $14 ; SUCCESS? + JP NZ,CHSD_CMDERR ; HANDLE ERROR +; +#IF FALSE + CALL CH_CMD_RD ; SEND READ COMMAND + CALL CH_RD ; GET LENGTH + ;CALL PC_SPACE ; *DEBUG* + ;CALL PRTHEXBYTE ; *DEBUG* + LD B,A ; LOOP COUNTER + LD HL,HB_WRKBUF ; USE WORK BUFFER FOR DATA +CHSD_DSKMNT1: + CALL CH_RD ; GET A BYTE + LD (HL),A ; SAVE IT + INC HL ; BUMP BUF PTR + DJNZ CHSD_DSKMNT1 ; LOOP FOR ALL DATA +; + ;LD DE,HB_WRKBUF ; *DEBUG* + ;CALL DUMP_BUFFER ; *DEBUG* +; + CALL CHSD_PRTPREFIX ; PRINT DEVICE PREFIX + LD HL,HB_WRKBUF + 8 + LD B,28 +CHSD_DSKMNT2: + LD A,(HL) + INC HL + CALL COUT + DJNZ CHSD_DSKMNT2 +#ENDIF +; + XOR A + RET +; +; SET FILE NAME +; +CHSD_SETFNAME: + ;PRTS("\n\rSETFNAME:$") ; *DEBUG* + LD A,CH_CMD_SET_FN ; SET FILE NAME COMMAND + CALL CH_CMD ; SEND IT + CALL CH_NAP + ;CALL DELAY ; MAY NOT BE NEEDED + ;CALL PC_SPACE ; *DEBUG* +CHSD_SETFNAME1: + ;CALL DELAY + LD A,(DE) ; GET NEXT BYTE + INC DE ; BUMP POINTER + CALL CH_WR ; SEND IT + ;CALL COUT ; *DEBUG* + OR A ; CHECK FOR NUL (EOS) + RET Z ; IF NUL, DONE + JR CHSD_SETFNAME1 ; SEND MORE CHARACTERS +; +; OPEN FILE +; +CHSD_FOPEN: + CALL CHSD_SETFNAME + ;PRTS("\n\rFOPEN:$") ; *DEBUG* + LD A,CH_CMD_FOPEN ; FILE OPEN COMMAND + CALL CH_CMD ; SEND IT + CALL CH_POLL ; WAIT FOR RESULT + ;CALL PC_SPACE ; *DEBUG* + ;CALL PRTHEXBYTE ; *DEBUG* + CP $42 ; MISSING FILE? + JP Z,CHSD_NOFILE ; HANDLE ERROR + CP $14 ; SUCCESS? + JP NZ,CHSD_IOERR ; HANDLE ERROR + RET ; RETURN WITH ZF SET APPROPRIATELY +; +; GET FILE SIZE +; +CHSD_FILESIZE: + ;PRTS("\n\rFSIZE:$") + LD A,CH_CMD_FILESIZE ; FILE SIZE COMMAND + CALL CH_CMD ; SEND IT + LD A,$68 ; REQUIRED CMD PARAMETER + CALL CH_WR ; SEND IT + CALL CH_NAP + LD A,CHSD_MEDCAP ; MEDIA CAPACITY OFFSET + CALL LDHLIYA ; HL := IY + A, REG A TRASHED + PUSH HL ; SAVE ADDRESS + CALL CH_RD + LD L,A + CALL CH_RD + LD H,A + CALL CH_RD + LD E,A + CALL CH_RD + LD D,A + ;CALL PC_SPACE ; *DEBUG* + ;CALL PRTHEX32 ; *DEBUG* + LD B,9 ; ROTATE 9 BITS FOR DIV 512 +CHSD_FILESIZE1: + SRL D + RR E + RR H + RR L + DJNZ CHSD_FILESIZE1 ; LOOP TILL DONE + POP BC ; RECOVER ADDRESS TO BC + ;CALL PC_SPACE ; *DEBUG* + ;CALL PRTHEX32 ; *DEBUG* + CALL ST32 ; STORE IT + XOR A ; SIGNAL SUCCESS + RET ; AND DONE +; +; ERROR HANDLERS +; +; +CHSD_NOFILE: + LD A,CHSD_STNOFILE + JR CHSD_ERR +; +CHSD_NOMEDIA: + LD A,CHSD_STNOMEDIA + JR CHSD_ERR +; +CHSD_CMDERR: + LD A,CHSD_STCMDERR + JR CHSD_ERR +; +CHSD_IOERR: + LD A,CHSD_STIOERR + JR CHSD_ERR +; +CHSD_TO: + LD A,CHSD_STTO + JR CHSD_ERR +; +CHSD_NOTSUP: + LD A,CHSD_STNOTSUP + JR CHSD_ERR +; +CHSD_ERR: + LD (IY+CHSD_STAT),A ; SAVE NEW STATUS +; +CHSD_ERR2: +#IF (CHSDTRACE >= 2) + CALL CHSD_PRTSTAT +#ENDIF + OR A ; SET FLAGS + RET +; +; +; +CHSD_PRTERR: + RET Z ; DONE IF NO ERRORS + ; FALL THRU TO CHSD_PRTSTAT +; +; PRINT FULL DEVICE STATUS LINE +; +CHSD_PRTSTAT: + PUSH AF + PUSH DE + PUSH HL + LD A,(IY+CHSD_STAT) + CALL CHSD_PRTPREFIX ; PRINT UNIT PREFIX + CALL PC_SPACE ; FORMATTING + CALL CHSD_PRTSTATSTR + POP HL + POP DE + POP AF + RET +; +; PRINT STATUS STRING +; +CHSD_PRTSTATSTR: + PUSH AF + PUSH DE + PUSH HL + LD A,(IY+CHSD_STAT) + NEG + LD HL,CHSD_STR_ST_MAP + ADD A,A + CALL ADDHLA + LD E,(HL) + INC HL + LD D,(HL) + CALL WRITESTR + POP HL + POP DE + POP AF + RET +; +; PRINT DIAGNONSTIC PREFIX +; +CHSD_PRTPREFIX: + PUSH AF + CALL NEWLINE + PRTS("CHSD$") + LD A,(IY+CH_DEV) ; GET CURRENT DEVICE NUM + CALL PRTDECB + CALL PC_COLON + POP AF + RET +; +; DATA STORAGE +; +CHSD_DEVNUM .DB 0 ; TEMP DEVICE NUM USED DURING INIT +CHSD_DSKBUF .DW 0 +; +CHSD_FNAME .DB "/", CHSD_IMGFILE, 0 +; +CHSD_STR_ST_MAP: + .DW CHSD_STR_STOK + .DW CHSD_STR_STNOMEDIA + .DW CHSD_STR_STCMDERR + .DW CHSD_STR_STIOERR + .DW CHSD_STR_STTO + .DW CHSD_STR_STNOTSUP + .DW CHSD_STR_STNOFILE +; +CHSD_STR_STOK .TEXT "OK$" +CHSD_STR_STNOMEDIA .TEXT "NO MEDIA$" +CHSD_STR_STCMDERR .TEXT "COMMAND ERROR$" +CHSD_STR_STIOERR .TEXT "IO ERROR$" +CHSD_STR_STTO .TEXT "TIMEOUT$" +CHSD_STR_STNOTSUP .TEXT "NOT SUPPORTED$" +CHSD_STR_STNOFILE .TEXT "MISSING " + .TEXT CHSD_IMGFILE + .TEXT " FILE$" +CHSD_STR_STUNK .TEXT "UNKNOWN ERROR$" diff --git a/Source/HBIOS/chusb.asm b/Source/HBIOS/chusb.asm new file mode 100644 index 00000000..fd4c5d44 --- /dev/null +++ b/Source/HBIOS/chusb.asm @@ -0,0 +1,792 @@ +; +;================================================================================================== +; CH375/376 USB SUB-DRIVER +;================================================================================================== +; +; Thanks and credit to Alan Cox. Much of this driver is based on +; his code in FUZIX (https://github.com/EtchedPixels/FUZIX). +; +; This file contains the USB Drive specific support for the CH37x +; driver. This file is included by the core driver file (ch.asm) as +; needed. +; +; The USB support is implemented as pure raw sector I/O. The CH376 +; file-level support is not utilized. +; +; NOTES: +; - There seem to be compatibility issues with older USB thumb drives. +; Such drives will complete DISK_INIT successfully, but then return +; an error attempting to do any I/O. The error is $17 indicating +; the CH37x encountered an overflow during communication with the +; device. I found that adding a DISK_MOUNT command (only possible +; on CH376) resolved the issue for some devices, so that has been +; added to the RESET routine when using CH376. +; +; TODO: +; - Implement auto-recovery on error status? +; +CHUSB_FASTIO .EQU TRUE ; USE INIR/OTIR? +; +; CHUSB DEVICE STATUS +; +CHUSB_STOK .EQU 0 +CHUSB_STNOMEDIA .EQU -1 +CHUSB_STCMDERR .EQU -2 +CHUSB_STIOERR .EQU -3 +CHUSB_STTO .EQU -4 +CHUSB_STNOTSUP .EQU -5 +; +; CHUSB DEVICE CONFIGURATION +; +CHUSB_CFGSIZ .EQU 14 ; SIZE OF USB CFG TBL ENTRIES +; +; CONFIG ENTRY DATA OFFSETS +; +; THE LOCATION OF CHSD_MODE IS SHARED BY ALL SUB-DRIVERS AND THE +; CH_SETMODE FUNCTION IN THE MAIN DRIVER (CH.ASM). IF YOU CHANGE +; IT, YOU MUST SYNC UP THE MAIN DRIVER AND ALL SUB-DRIVERS! +; +; FIRST 3 BYTES SAME AS CH CONFIG +CHUSB_STAT .EQU 3 ; LAST STATUS (BYTE) +CHUSB_MEDCAP .EQU 4 ; MEDIA CAPACITY (DWORD) +CHUSB_LBA .EQU 8 ; CURRENT LBA (DWORD) +CHUSB_MODE .EQU 12 ; PTR TO MODE BYTE (WORD) +; +CHUSB_CFGTBL: +; +#IF (CHCNT >= 1) +CHUSB_CFG0: + .DB 0 ; DEV NUM, FILLED DYNAMICALLY + .DB CHTYP_NONE ; DEV TYPE, FILLED DYNCAMICALLY + .DB CH0BASE ; IO BASE ADDRESS + .DB 0 ; DEVICE STATUS + .DW 0,0 ; DEVICE CAPACITY + .DW 0,0 ; CURRENT LBA + .DW CH0_MODE ; POINTER TO MODE BYTE +; + #IF (CH0USBENABLE) + .ECHO "CHUSB: IO=" + .ECHO CH0BASE + .ECHO "\n" + #ENDIF +#ENDIF +; +#IF (CHCNT >= 2) +CHUSB_CFG1: + .DB 0 ; DEV NUM + .DB CHTYP_NONE ; DEV TYPE, FILLED DYNCAMICALLY + .DB CH1BASE ; IO BASE ADDRESS + .DB 0 ; DEVICE STATUS + .DW 0,0 ; DEVICE CAPACITY + .DW 0,0 ; CURRENT LBA + .DW CH1_MODE ; POINTER TO MODE BYTE +; + #IF (CH1USBENABLE) + .ECHO "CHUSB: IO=" + .ECHO CH1BASE + .ECHO "\n" + #ENDIF +#ENDIF +; +#IF ($ - CHUSB_CFGTBL) != (CHCNT * CHUSB_CFGSIZ) + .ECHO "*** INVALID CHUSB CONFIG TABLE ***\n" +#ENDIF +; + .DB $FF ; END OF TABLE MARKER +; +; +; +CHUSB_INIT: + LD A,(IY+CH_TYPE) ; GET DEVICE TYPE + PUSH HL ; COPY INCOMING HL + POP IY ; ... TO IY + LD (IY+CH_TYPE),A ; SAVE DEVICE TYPE +; + ; UPDATE DRIVER RELATIVE UNIT NUMBER IN CONFIG TABLE + LD A,(CHUSB_DEVNUM) ; GET NEXT UNIT NUM TO ASSIGN + LD (IY+CH_DEV),A ; UPDATE IT + INC A ; BUMP TO NEXT UNIT NUM TO ASSIGN + LD (CHUSB_DEVNUM),A ; SAVE IT +; + ; ADD UNIT TO GLOBAL DISK UNIT TABLE + LD BC,CHUSB_FNTBL ; BC := FUNC TABLE ADR + PUSH IY ; CFG ENTRY POINTER + POP DE ; COPY TO DE + CALL DIO_ADDENT ; ADD ENTRY TO GLOBAL DISK DEV TABLE +; + CALL CHUSB_RESET ; RESET & DISCOVER MEDIA +#IF (CHUSBTRACE <= 1) + CALL NZ,CHUSB_PRTSTAT +#ENDIF + RET NZ ; ABORT ON FAILURE +; + ; START PRINTING DEVICE INFO + CALL CHUSB_PRTPREFIX ; PRINT DEVICE PREFIX +; + ; PRINT STORAGE CAPACITY (BLOCK COUNT) + PRTS(" BLOCKS=0x$") ; PRINT FIELD LABEL + LD A,CHUSB_MEDCAP ; OFFSET TO CAPACITY FIELD + CALL LDHLIYA ; HL := IY + A, REG A TRASHED + CALL LD32 ; GET THE CAPACITY VALUE + CALL PRTHEX32 ; PRINT HEX VALUE +; + ; PRINT STORAGE SIZE IN MB + PRTS(" SIZE=$") ; PRINT FIELD LABEL + LD B,11 ; 11 BIT SHIFT TO CONVERT BLOCKS --> MB + CALL SRL32 ; RIGHT SHIFT + CALL PRTDEC32 ; PRINT DWORD IN DECIMAL + PRTS("MB$") ; PRINT SUFFIX +; + XOR A ; SIGNAL SUCCESS + RET +; +; DRIVER FUNCTION TABLE +; +CHUSB_FNTBL: + .DW CHUSB_STATUS + .DW CHUSB_RESET + .DW CHUSB_SEEK + .DW CHUSB_READ + .DW CHUSB_WRITE + .DW CHUSB_VERIFY + .DW CHUSB_FORMAT + .DW CHUSB_DEVICE + .DW CHUSB_MEDIA + .DW CHUSB_DEFMED + .DW CHUSB_CAP + .DW CHUSB_GEOM +#IF (($ - CHUSB_FNTBL) != (DIO_FNCNT * 2)) + .ECHO "*** INVALID CHUSB FUNCTION TABLE ***\n" +#ENDIF +; +CHUSB_VERIFY: +CHUSB_FORMAT: +CHUSB_DEFMED: + SYSCHKERR(ERR_NOTIMPL) ; NOT IMPLEMENTED + RET +; +; +; +CHUSB_READ: + LD A,CH_MODE_USB ; REQUEST USB MODE + CALL CH_SETMODE ; DO IT + JP NZ,CHUSB_CMDERR ; HANDLE ERROR +; + CALL HB_DSKREAD ; HOOK HBIOS DISK READ SUPERVISOR + LD (CHUSB_DSKBUF),HL ; SAVE DISK BUFFER ADDRESS + LD A,CH_CMD_DSKRD ; DISK READ COMMAND + CALL CHUSB_RWSTART ; SEND CMD AND LBA +; + ; READ THE SECTOR IN 64 BYTE CHUNKS + LD B,8 ; 8 CHUNKS OF 64 FOR 512 BYTE SECTOR + LD HL,(CHUSB_DSKBUF) ; GET DISK BUF ADR +CHUSB_READ1: + CALL CH_POLL ; WAIT FOR DATA READY + CP $1D ; DATA READY TO READ? + ;CALL PC_LT ; *DEBUG* + ;CALL PRTHEXBYTE ; *DEBUG* + JP NZ,CHUSB_IOERR ; HANDLE IO ERROR + CALL CH_CMD_RD ; SEND READ USB DATA CMD + CALL CH_RD ; READ DATA BLOCK LENGTH + CP 64 ; AS EXPECTED? + JP NZ,CHUSB_IOERR ; IF NOT, HANDLE ERROR +; +#IF (CHUSB_FASTIO) + ; READ 64 BYTE CHUNK + PUSH BC ; SAVE LOOP CONTROL + LD B,64 ; READ 64 BYTES + LD C,(IY+CH_IOBASE) ; BASE PORT + INIR ; DO IT FAST + POP BC ; RESTORE LOOP CONTROL +#ELSE + ; BYTE READ LOOP + PUSH BC ; SAVE LOOP CONTROL + LD B,64 ; READ 64 BYTES +CHUSB_READ2: + CALL CH_RD ; GET NEXT BYTE + LD (HL),A ; SAVE IT + INC HL ; INC BUF PTR + DJNZ CHUSB_READ2 ; LOOP AS NEEDED + POP BC ; RESTORE LOOP CONTROL +#ENDIF +; + ; PREPARE FOR NEXT CHUNK + LD A,CH_CMD_DSKRDGO ; CONTINUE DISK READ + CALL CH_CMD ; SEND IT + DJNZ CHUSB_READ1 ; LOOP TILL DONE +; + ; FINAL CHECK FOR COMPLETION & SUCCESS + CALL CH_POLL ; WAIT FOR COMPLETION + CP $14 ; SUCCESS? + JP NZ,CHUSB_IOERR ; IF NOT, HANDLE ERROR +; + ; INCREMENT LBA + PUSH HL ; SAVE HL + LD A,CHUSB_LBA ; LBA OFFSET + CALL LDHLIYA ; HL := IY + A, REG A TRASHED + CALL INC32HL ; INCREMENT THE VALUE + POP HL ; RESTORE HL +; + XOR A ; SIGNAL SUCCESS + RET +; +; +; +CHUSB_WRITE: + LD A,CH_MODE_USB ; REQUEST USB MODE + CALL CH_SETMODE ; DO IT + JP NZ,CHUSB_CMDERR ; HANDLE ERROR +; + CALL HB_DSKWRITE ; HOOK HBIOS DISK WRITE SUPERVISOR + LD (CHUSB_DSKBUF),HL ; SAVE DISK BUFFER ADDRESS + LD A,CH_CMD_DSKWR ; DISK READ COMMAND + CALL CHUSB_RWSTART ; SEND CMD AND LBA +; + ; WRITE THE SECTOR IN 64 BYTE CHUNKS + LD B,8 ; 8 CHUNKS OF 64 FOR 512 BYTE SECTOR + LD HL,(CHUSB_DSKBUF) ; GET DISK BUF ADR +CHUSB_WRITE1: + CALL CH_POLL ; WAIT FOR DATA READY + CP $1E ; DATA READY TO WRITE + ;CALL PC_GT ; *DEBUG* + ;CALL PRTHEXBYTE ; *DEBUG* + JP NZ,CHUSB_IOERR ; HANDLE IO ERROR + CALL CH_CMD_WR ; SEND WRITE USB DATA CMD + LD A,64 ; 64 BYTE CHUNK + CALL CH_WR ; SEND DATA BLOCK LENGTH +; +#IF (CHUSB_FASTIO) + ; WRITE 64 BYTE CHUNK + PUSH BC ; SAVE LOOP CONTROL + LD B,64 ; WRITE 64 BYTES + LD C,(IY+CH_IOBASE) ; BASE PORT + OTIR ; DO IT FAST + POP BC ; RESTORE LOOP CONTROL +#ELSE + ; BYTE WRITE LOOP + PUSH BC ; SAVE LOOP CONTROL + LD B,64 ; WRITE 64 BYTES +CHUSB_WRITE2: + LD A,(HL) ; GET NEXT BYTE + INC HL ; INC BUF PTR + CALL CH_WR ; WRITE NEXT BYTE + DJNZ CHUSB_WRITE2 ; LOOP AS NEEDED + POP BC ; RESTORE LOOP CONTROL +#ENDIF +; + ; PREPARE FOR NEXT CHUNK + LD A,CH_CMD_DSKWRGO ; CONTINUE DISK READ + CALL CH_CMD ; SEND IT + DJNZ CHUSB_WRITE1 ; LOOP TILL DONE +; + ; FINAL CHECK FOR COMPLETION & SUCCESS + CALL CH_POLL ; WAIT FOR COMPLETION + CP $14 ; SUCCESS? + JP NZ,CHUSB_IOERR ; IF NOT, HANDLE ERROR +; + ; INCREMENT LBA + PUSH HL ; SAVE HL + LD A,CHUSB_LBA ; LBA OFFSET + CALL LDHLIYA ; HL := IY + A, REG A TRASHED + CALL INC32HL ; INCREMENT THE VALUE + POP HL ; RESTORE HL +; + XOR A ; SIGNAL SUCCESS + RET +; +; INITIATE A DISK SECTOR READ/WRITE OPERATION +; A: READ OR WRITE OPCODE +; +CHUSB_RWSTART: + CALL CH_CMD ; SEND R/W COMMAND +; + ; SEND LBA, 4 BYTES, LITTLE ENDIAN + LD A,CHUSB_LBA ; OFFSET TO CAPACITY FIELD + CALL LDHLIYA ; HL := IY + A, REG A TRASHED + LD B,4 ; SEND 4 BYTES +CHUSB_RWSTART1: + LD A,(HL) ; GET BYTE + INC HL ; BUMP PTR + CALL CH_WR ; SEND BYTE + DJNZ CHUSB_RWSTART1 ; LOOP AS NEEDED +; + ; REQUEST 1 SECTOR + LD A,1 ; 1 SECTOR + CALL CH_WR ; SEND IT + RET +; +; +; +CHUSB_STATUS: + ; RETURN UNIT STATUS + LD A,(IY+CHUSB_STAT) ; GET STATUS OF SELECTED DEVICE + OR A ; SET FLAGS + RET ; AND RETURN +; +; RESET THE INTERFACE AND REDISCOVER MEDIA +; +CHUSB_RESET: + ;PRTS("\n\rRES USB:$") ; *DEBUG* + ;CALL CH_FLUSH ; DISCARD ANY GARBAGE + ;CALL CH_RESET ; FULL CH37X RESET +; + ; RESET THE BUS + LD A,CH_CMD_MODE ; SET MODE COMMAND + CALL CH_CMD ; SEND IT + LD A,7 ; RESET BUS + CALL CH_WR ; SEND IT + CALL CH_NAP ; SMALL WAIT + CALL CH_RD ; GET RESULT + ;CALL PC_SPACE ; *DEBUG* + ;CALL PRTHEXBYTE ; *DEBUG* + CALL CH_NAP ; SMALL WAIT +; + ; ACTIVATE USB MODE + LD A,CH_CMD_MODE ; SET MODE COMMAND + CALL CH_CMD ; SEND IT + LD A,6 ; USB ENABLED, SEND SOF + CALL CH_WR ; SEND IT + CALL CH_NAP ; SMALL WAIT + CALL CH_RD ; GET RESULT + ;CALL PC_SPACE ; *DEBUG* + ;CALL PRTHEXBYTE ; *DEBUG* + CALL CH_NAP ; SMALL WAIT +; + LD A,CH_MODE_USB ; WE ARE NOW IN USB MODE + LD L,(IY+CHUSB_MODE+0) ; GET MODE PTR (LSB) + LD H,(IY+CHUSB_MODE+1) ; GET MODE PTR (MSB) + LD (HL),A ; SAVE IT +; + ; INITIALIZE DISK + LD B,24 ; TRY A FEW TIMES +CHUSB_RESET1: + ;PRTS("\n\rDSKINIT:$") ; *DEBUG* + LD A,CH_CMD_DSKINIT ; DISK INIT COMMAND + CALL CH_CMD ; SEND IT + LD DE,10000 ; 10000 * 16 = 160US ??? + LD DE,20000 ; 10000 * 16 = 160US ??? + LD DE,12500 ; 1250 * 16 = 200US ??? + CALL VDELAY ; DELAY + CALL CH_POLL ; WAIT FOR RESULT + ;CALL PC_SPACE ; *DEBUG* + ;CALL PRTHEXBYTE ; *DEBUG* + CP $14 ; SUCCESS? + JR Z,CHUSB_RESET1A ; IF SO, CHECK READY + CP $16 ; NO MEDIA + JP Z,CHUSB_NOMEDIA ; HANDLE IT + CALL CH_NAP ; SMALL DELAY + DJNZ CHUSB_RESET1 ; LOOP AS NEEDED + JP CHUSB_TO ; HANDLE TIMEOUT +; +CHUSB_RESET1A: + ;CALL CHUSB_DSKRES ; DISK RESET + ;CP $14 ; GOOD? + ;JR Z,CHUSB_RESET2 + ;CALL CHUSB_DSKRDY ; CHECK IF DISK READY + ;CP $14 ; GOOD? + ;JR Z,CHUSB_RESET2 ; IF SO, MOVE ON + ;DJNZ CHUSB_RESET1 ; KEEP TRYING +; +CHUSB_RESET2: + ; USE OF CH376 DISK_MOUNT COMMAND SEEMS TO IMPROVE + ; COMPATIBILITY WITH SOME OLDER USB THUMBDRIVES. + LD A,(IY+CH_TYPE) ; CH37X TYPE? + CP CHTYP_376 ; IS CH376? + CALL Z,CHUSB_DSKMNT ; IF SO, TRY MOUNT, IGNORE ERRS + ;CALL CHUSB_AUTOSET ; *DEBUG* + ;CALL CHUSB_TSTCON ; *DEBUG* + ;CALL CHUSB_MAXLUN ; *DEBUG* + ;CALL CHUSB_DSKRDY ; *DEBUG* + ;CALL CHUSB_DSKINQ ; *DEBUG* +;; + CALL CHUSB_DSKSIZ ; GET AND RECORD DISK SIZE + RET NZ ; ABORT ON ERROR +; + ; SET STATUS AND RETURN + XOR A ; CLEAR STATUS + LD (IY+CHUSB_STAT),A ; RECORD STATUS + OR A ; SET FLAGS + RET ; AND RETURN +; +; +; +CHUSB_DEVICE: + LD D,DIODEV_CHUSB ; D := DEVICE TYPE + LD E,(IY+CH_DEV) ; E := PHYSICAL DEVICE NUMBER + LD C,%00110011 ; USB HARD DISK ATTRIBUTES + LD H,(IY+CH_TYPE) ; H := MODE + LD L,(IY+CH_IOBASE) ; L := BASE I/O ADDRESS + XOR A ; SIGNAL SUCCESS + RET +; +; CHUSB_GETMED +; +CHUSB_MEDIA: + LD A,E ; GET FLAGS + OR A ; SET FLAGS + JR Z,CHUSB_MEDIA1 ; JUST REPORT CURRENT STATUS AND MEDIA + CALL CHUSB_RESET ; RESET CHUSB INTERFACE +; +CHUSB_MEDIA1: + LD A,(IY+CHUSB_STAT) ; GET STATUS + OR A ; SET FLAGS + LD D,0 ; NO MEDIA CHANGE DETECTED + LD E,MID_HD ; ASSUME WE ARE OK + RET Z ; RETURN IF GOOD INIT + LD E,MID_NONE ; SIGNAL NO MEDIA + LD A,ERR_NOMEDIA ; NO MEDIA ERROR + OR A ; SET FLAGS + RET ; AND RETURN +; +; +; +CHUSB_SEEK: + BIT 7,D ; CHECK FOR LBA FLAG + CALL Z,HB_CHS2LBA ; CLEAR MEANS CHS, CONVERT TO LBA + RES 7,D ; CLEAR FLAG REGARDLESS (DOES NO HARM IF ALREADY LBA) + LD (IY+CHUSB_LBA+0),L ; SAVE NEW LBA + LD (IY+CHUSB_LBA+1),H ; ... + LD (IY+CHUSB_LBA+2),E ; ... + LD (IY+CHUSB_LBA+3),D ; ... + XOR A ; SIGNAL SUCCESS + RET ; AND RETURN +; +; +; +CHUSB_CAP: + LD A,(IY+CHUSB_STAT) ; GET STATUS + PUSH AF ; SAVE IT + LD A,CHUSB_MEDCAP ; OFFSET TO CAPACITY FIELD + CALL LDHLIYA ; HL := IY + A, REG A TRASHED + CALL LD32 ; GET THE CURRENT CAPACITY INTO DE:HL + LD BC,512 ; 512 BYTES PER BLOCK + POP AF ; RECOVER STATUS + OR A ; SET FLAGS + RET +; +; +; +CHUSB_GEOM: + ; FOR LBA, WE SIMULATE CHS ACCESS USING 16 HEADS AND 16 SECTORS + ; RETURN HS:CC -> DE:HL, SET HIGH BIT OF D TO INDICATE LBA CAPABLE + CALL CHUSB_CAP ; GET TOTAL BLOCKS IN DE:HL, BLOCK SIZE TO BC + LD L,H ; DIVIDE BY 256 FOR # TRACKS + LD H,E ; ... HIGH BYTE DISCARDED, RESULT IN HL + LD D,16 | $80 ; HEADS / CYL = 16, SET LBA CAPABILITY BIT + LD E,16 ; SECTORS / TRACK = 16 + RET ; DONE, A STILL HAS CHUSB_CAP STATUS +; +; CH37X HELPER ROUTINES +; +; +; PERFORM DISK MOUNT +; +CHUSB_DSKMNT: + ;PRTS("\n\rMOUNT:$") ; *DEBUG* + LD A,CH_CMD_DSKMNT ; DISK QUERY + CALL CH_CMD ; DO IT + CALL CH_POLL ; WAIT FOR RESPONSE + ;CALL PC_SPACE ; *DEBUG* + ;CALL PRTHEXBYTE ; *DEBUG* + CP $14 ; SUCCESS? + RET NZ ; ABORT IF NOT +; +#IF FALSE + CALL CH_CMD_RD ; SEND READ COMMAND + CALL CH_RD ; GET LENGTH + ;CALL PC_SPACE ; *DEBUG* + ;CALL PRTHEXBYTE ; *DEBUG* + LD B,A ; LOOP COUNTER + LD HL,HB_WRKBUF ; USE WORK BUFFER FOR DATA +CHUSB_DSKMNT1: + CALL CH_RD ; GET A BYTE + LD (HL),A ; SAVE IT + INC HL ; BUMP BUF PTR + DJNZ CHUSB_DSKMNT1 ; LOOP FOR ALL DATA +; + ;LD DE,HB_WRKBUF ; *DEBUG* + ;CALL DUMP_BUFFER ; *DEBUG* +; + CALL CHUSB_PRTPREFIX ; PRINT DEVICE PREFIX + LD HL,HB_WRKBUF + 8 + LD B,28 +CHUSB_DSKMNT2: + LD A,(HL) + INC HL + CALL COUT + DJNZ CHUSB_DSKMNT2 +#ENDIF +; + XOR A + RET +; +; PERFORM DISK SIZE +; +CHUSB_DSKSIZ: + ;PRTS("\n\rDSKSIZ:$") ; *DEBUG* + LD A,CH_CMD_DSKSIZ ; DISK SIZE COMMAND + CALL CH_CMD ; SEND IT + CALL CH_POLL ; WAIT FOR RESULT + ;CALL PC_SPACE ; *DEBUG* + ;CALL PRTHEXBYTE ; *DEBUG* + CP $14 ; SUCCESS? + JP NZ,CHUSB_CMDERR ; HANDLE CMD ERROR + CALL CH_CMD_RD ; SEND READ USB DATA CMD + CALL CH_RD ; GET RD DATA LEN + ;CALL PC_SPACE ; *DEBUG* + ;CALL PRTHEXBYTE ; *DEBUG* + CP $08 ; MAKE SURE IT IS 8 + JP NZ,CHUSB_CMDERR ; HANDLE CMD ERROR + LD A,CHUSB_MEDCAP ; MEDIA CAPACITY OFFSET + CALL LDHLIYA ; HL := IY + A, REG A TRASHED + PUSH HL ; SAVE ADDRESS + CALL CH_RD + LD D,A + CALL CH_RD + LD E,A + CALL CH_RD + LD H,A + CALL CH_RD + LD L,A + CALL CH_RD + CALL CH_RD + CALL CH_RD + CALL CH_RD + POP BC ; RECOVER ADDRESS TO BC + CALL ST32 ; STORE IT + XOR A ; SIGNAL SUCCESS + RET ; AND DONE +; +#IF FALSE +; +; PERFORM DISK INQUIRY +; BASICALLY THE SCSI INQUIRY COMMAND +; +CHUSB_DSKINQ: + ;PRTS("\n\rINQUIRY:$") ; *DEBUG* + LD A,CH_CMD_DSKINQ ; DISK QUERY + CALL CH_CMD ; DO IT + CALL CH_POLL ; WAIT FOR RESPONSE + ;CALL PC_SPACE ; *DEBUG* + ;CALL PRTHEXBYTE ; *DEBUG* + CP $14 ; SUCCESS? + RET NZ ; ABORT IF NOT + CALL CH_CMD_RD ; SEND READ COMMAND + CALL CH_RD ; GET LENGTH + LD B,A ; LOOP COUNTER + LD HL,HB_WRKBUF ; USE WORK BUFFER FOR DATA +DSKINQ1: + CALL CH_RD ; GET A BYTE + LD (HL),A ; SAVE IT + INC HL ; BUMP BUF PTR + DJNZ DSKINQ1 ; LOOP FOR ALL DATA +; + ;LD DE,HB_WRKBUF ; *DEBUG* + ;CALL DUMP_BUFFER ; *DEBUG* +; + ;CALL CHUSB_PRTPREFIX ; PRINT DEVICE PREFIX + ;LD HL,HB_WRKBUF + 8 + ;LD B,28 +DSKINQ2: + ;LD A,(HL) + ;INC HL + ;CALL COUT + ;DJNZ DSKINQ2 +; + RET +; +; PERFORM SET RETRIES +; +CHUSB_SETRETRY: + ;PRTS("\n\rSETRETRY:$") ; *DEBUG* + LD A,CH_CMD_SETRETRY ; DISK READY + CALL CH_CMD ; DO IT + CALL CH_NAP + LD A,$25 ; CONSTANT + CALL CH_WR ; SEND IT + CALL CH_NAP + LD A,$BF ; MAX + CALL CH_WR + CALL CH_NAP + CALL CH_RD ; GET RESULT + ;CALL PC_SPACE ; *DEBUG* + ;CALL PRTHEXBYTE ; *DEBUG* +; + RET +; +; PERFORM DISK RESET +; +CHUSB_DSKRES: + ;PRTS("\n\rDSKRES:$") ; *DEBUG* + LD A,CH_CMD_DSKRES ; DISK READY + CALL CH_CMD ; DO IT + CALL CH_POLL ; WAIT FOR RESPONSE + ;CALL PC_SPACE ; *DEBUG* + ;CALL PRTHEXBYTE ; *DEBUG* +; + RET +; +; PERFORM DISK READY +; +CHUSB_DSKRDY: + ;PRTS("\n\rDSKRDY:$") ; *DEBUG* + LD A,CH_CMD_DSKRDY ; DISK READY + CALL CH_CMD ; DO IT + CALL CH_POLL ; WAIT FOR RESPONSE + ;CALL PC_SPACE ; *DEBUG* + ;CALL PRTHEXBYTE ; *DEBUG* + CP $14 ; *DEBUG* + JR NZ,CHUSB_DSKRDY ; *DEBUG* +; + RET +; +; PERFORM AUTO SETUP +; +CHUSB_AUTOSET: + ;PRTS("\n\rAUTOSET:$") ; *DEBUG* + LD A,CH_CMD_AUTOSET ; AUTOMATIC SETUP FOR USB + CALL CH_CMD ; DO IT + CALL LDELAY ; *DEBUG* + CALL CH_POLL ; WAIT FOR RESPONSE + ;CALL PC_SPACE ; *DEBUG* + ;CALL PRTHEXBYTE ; *DEBUG* +; + RET +; +; PERFORM TEST CONNECT +; +CHUSB_TSTCON: + ;PRTS("\n\rTSTCON:$") ; *DEBUG* + LD A,CH_CMD_TSTCON ; TEST USB DEVICE CONNECT + CALL CH_CMD ; DO IT + CALL CH_NAP ; WAIT A BIT + CALL CH_RD ; GET RESPONSE + ;CALL PC_SPACE ; *DEBUG* + ;CALL PRTHEXBYTE ; *DEBUG* +; + RET +; +; PERFORM GET MAX LUN +; +CHUSB_MAXLUN: + ;PRTS("\n\rMAXLUN:$") ; *DEBUG* + LD A,CH_CMD_MAXLUN ; TEST USB DEVICE CONNECT + CALL CH_CMD ; DO IT + CALL CH_NAP ; WAIT A BIT + LD A,$38 ; CONSTANT + CALL CH_WR ; SEND IT + CALL CH_NAP + CALL CH_RD ; GET RESPONSE + ;CALL PC_SPACE ; *DEBUG* + ;CALL PRTHEXBYTE ; *DEBUG* +; + RET +; +#ENDIF +; +; ERROR HANDLERS +; +; +CHUSB_NOMEDIA: + LD A,CHUSB_STNOMEDIA + JR CHUSB_ERR +; +CHUSB_CMDERR: + LD A,CHUSB_STCMDERR + JR CHUSB_ERR +; +CHUSB_IOERR: + LD A,CHUSB_STIOERR + JR CHUSB_ERR +; +CHUSB_TO: + LD A,CHUSB_STTO + JR CHUSB_ERR +; +CHUSB_NOTSUP: + LD A,CHUSB_STNOTSUP + JR CHUSB_ERR +; +CHUSB_ERR: + LD (IY+CHUSB_STAT),A ; SAVE NEW STATUS +; +CHUSB_ERR2: +#IF (CHUSBTRACE >= 2) + CALL CHUSB_PRTSTAT +#ENDIF + OR A ; SET FLAGS + RET +; +; +; +CHUSB_PRTERR: + RET Z ; DONE IF NO ERRORS + ; FALL THRU TO CHUSB_PRTSTAT +; +; PRINT FULL DEVICE STATUS LINE +; +CHUSB_PRTSTAT: + PUSH AF + PUSH DE + PUSH HL + LD A,(IY+CHUSB_STAT) + CALL CHUSB_PRTPREFIX ; PRINT UNIT PREFIX + CALL PC_SPACE ; FORMATTING + CALL CHUSB_PRTSTATSTR + POP HL + POP DE + POP AF + RET +; +; PRINT STATUS STRING +; +CHUSB_PRTSTATSTR: + PUSH AF + PUSH DE + PUSH HL + LD A,(IY+CHUSB_STAT) + NEG + LD HL,CHUSB_STR_ST_MAP + ADD A,A + CALL ADDHLA + LD E,(HL) + INC HL + LD D,(HL) + CALL WRITESTR + POP HL + POP DE + POP AF + RET +; +; PRINT DIAGNONSTIC PREFIX +; +CHUSB_PRTPREFIX: + PUSH AF + CALL NEWLINE + PRTS("CHUSB$") + LD A,(IY+CH_DEV) ; GET CURRENT DEVICE NUM + CALL PRTDECB + CALL PC_COLON + POP AF + RET +; +; DATA STORAGE +; +CHUSB_DEVNUM .DB 0 ; TEMP DEVICE NUM USED DURING INIT +CHUSB_DSKBUF .DW 0 +; +CHUSB_STR_ST_MAP: + .DW CHUSB_STR_STOK + .DW CHUSB_STR_STNOMEDIA + .DW CHUSB_STR_STCMDERR + .DW CHUSB_STR_STIOERR + .DW CHUSB_STR_STTO + .DW CHUSB_STR_STNOTSUP +; +CHUSB_STR_STOK .TEXT "OK$" +CHUSB_STR_STNOMEDIA .TEXT "NO MEDIA$" +CHUSB_STR_STCMDERR .TEXT "COMMAND ERROR$" +CHUSB_STR_STIOERR .TEXT "IO ERROR$" +CHUSB_STR_STTO .TEXT "TIMEOUT$" +CHUSB_STR_STNOTSUP .TEXT "NOT SUPPORTED$" +CHUSB_STR_STUNK .TEXT "UNKNOWN ERROR$" diff --git a/Source/HBIOS/ctc.asm b/Source/HBIOS/ctc.asm index b4a76710..777b28f8 100644 --- a/Source/HBIOS/ctc.asm +++ b/Source/HBIOS/ctc.asm @@ -25,9 +25,11 @@ CTC_TIM256CFG .EQU %00110111 ; CTC TIMER/256 MODE CONFIG ; DETERMINE WHICH CHANNEL CAUSED AN INTERRUPT. ;================================================================================================== ; -#IF (INTMODE != 2) +#IF (CTCTIMER & (INTMODE != 2)) .ECHO "*** WARNING: CTC TIMER DISABLED -- INTMODE 2 REQUIRED!!!\n" #ENDIF + .ECHO "CTC: IO=" + .ECHO CTCBASE ; #IF (CTCTIMER & (INTMODE == 2)) ; @@ -109,13 +111,24 @@ CTC_DIV .EQU CTCOSC / CTC_PRESCL / TICKFREQ CTC_DIVHI .EQU CTCPRE CTC_DIVLO .EQU (CTC_DIV / CTC_DIVHI) ; - .ECHO "CTC DIVISOR: " + + .ECHO ", TIMER MODE=" + #IF (CTCMODE == CTCMODE_CTR) + .ECHO "COUNTER" + #ENDIF + #IF (CTCMODE == CTCMODE_TIM16) + .ECHO "TIMER/16" + #ENDIF + #IF (CTCMODE == CTCMODE_TIM256) + .ECHO "TIMER/256" + #ENDIF + .ECHO ", DIVISOR=" .ECHO CTC_DIV - .ECHO ", HI: " + .ECHO ", HI=" .ECHO CTC_DIVHI - .ECHO ", LO: " + .ECHO ", LO=" .ECHO CTC_DIVLO - .ECHO "\n" + .ECHO ", INTERRUPTS ENABLED" ; #IF ((CTC_DIV == 0) | (CTC_DIV > $FFFF)) .ECHO "COMPUTED CTC DIVISOR IS UNUSABLE!\n" @@ -134,6 +147,8 @@ CTC_DIVLO .EQU (CTC_DIV / CTC_DIVHI) CTCTIVT .EQU INT_CTC0A + CTCTIMCH ; #ENDIF +; + .ECHO "\n" ; ;================================================================================================== ; CTC PRE-INITIALIZATION @@ -147,7 +162,9 @@ CTCTIVT .EQU INT_CTC0A + CTCTIMCH ;================================================================================================== ; CTC_PREINIT: - ; BLINDLY RESET THE CTC ASSUMING IT IS THERE + ; BLINDLY RESET THE CTC ASSUMING IT IS THERE. PER ALAN COX + ; THE CTC CONFIGURATION IS UNDEFINED AT STARTUP. THIS SHOULD + ; PRECLUDE POSSIBLE EXTRANEOUS INTERRUPTS. LD A,CTC_DEFCFG OUT (CTCBASE),A OUT (CTCBASE+1),A diff --git a/Source/HBIOS/cvdu.asm b/Source/HBIOS/cvdu.asm index b0dd0b7b..5cc6eb5a 100644 --- a/Source/HBIOS/cvdu.asm +++ b/Source/HBIOS/cvdu.asm @@ -17,6 +17,8 @@ ;====================================================================== ; CVDU_BASE .EQU $E0 +; + .ECHO "CVDU: MODE=" ; #IF (CVDUMODE == CVDUMODE_ECB) CVDU_KBDDATA .EQU CVDU_BASE + $02 ; KBD CTLR DATA PORT @@ -24,6 +26,7 @@ CVDU_KBDST .EQU CVDU_BASE + $0A ; KBD CTLR STATUS/CMD PORT CVDU_STAT .EQU CVDU_BASE + $04 ; READ M8563 STATUS CVDU_REG .EQU CVDU_BASE + $04 ; SELECT M8563 REGISTER CVDU_DATA .EQU CVDU_BASE + $0C ; READ/WRITE M8563 DATA + .ECHO "ECB" #ENDIF ; #IF (CVDUMODE == CVDUMODE_MBC) @@ -32,7 +35,15 @@ CVDU_KBDST .EQU CVDU_BASE + $03 ; KBD CTLR STATUS/CMD PORT CVDU_STAT .EQU CVDU_BASE + $04 ; READ M8563 STATUS CVDU_REG .EQU CVDU_BASE + $04 ; SELECT M8563 REGISTER CVDU_DATA .EQU CVDU_BASE + $05 ; READ/WRITE M8563 DATA + .ECHO "MBC" #ENDIF +; + .ECHO ", IO=" + .ECHO CVDU_BASE + .ECHO ", KBD MODE=PS/2" + .ECHO ", KBD IO=" + .ECHO CVDU_KBDDATA + .ECHO "\n" ; CVDU_ROWS .EQU 25 CVDU_COLS .EQU 80 @@ -197,6 +208,11 @@ CVDU_VDASAT: RET CVDU_VDASCO: + ; WE HANDLE ONLY PER-CHARACTER COLORS (D=0) + LD A,D ; GET CHAR/SCREEN SCOPE + OR A ; CHARACTER? + JR NZ,CVDU_VDASCO_Z ; IF NOT, JUST RETURN + ; INCOMING IS: IBGRIBGR (I=INTENSITY, B=BLUE, G=GREEN, R=RED) ; TRANSFORM TO: ----RGBI (DISCARD BACKGROUND COLOR IN HIGH NIBBLE) XOR A ; CLEAR A @@ -210,6 +226,7 @@ CVDU_VDASCO1: AND %11110000 ; CLEAR OUT OLD COLOR BITS OR E ; STUFF IN THE NEW ONES LD (CVDU_ATTR),A ; AND SAVE THE RESULT +CVDU_VDASCO_Z: XOR A ; SIGNAL SUCCESS RET @@ -902,5 +919,6 @@ CVDU_INIT8563: ;================================================================================================== ; CVDU_IDAT: + .DB KBDMODE_PS2 ; PS/2 8242 KEYBOARD CONTROLLER .DB CVDU_KBDST .DB CVDU_KBDDATA diff --git a/Source/HBIOS/dbgmon.asm b/Source/HBIOS/dbgmon.asm index a2a37042..2d0231d8 100644 --- a/Source/HBIOS/dbgmon.asm +++ b/Source/HBIOS/dbgmon.asm @@ -31,12 +31,7 @@ BUFLEN .EQU 40 ; INPUT LINE LENGTH JP DSKY_ENTRY JP UART_ENTRY ; -#IF DSKYENABLE - #DEFINE USEDELAY -ENA_XM .EQU FALSE ; NO ROOM FOR BOTH DSKY+XMODEM -#ELSE -ENA_XM .EQU TRUE ; INCLUDE XMODEM IF SPACE AVAILABLE -#ENDIF +ENA_XM .EQU TRUE ; INCLUDE XMODEM ; ENA_MBC6502 .EQU FALSE ; ENABLE OR DISABLE MBC6502 OPTION ; @@ -149,10 +144,7 @@ SERIALCMDLOOP: ;_____________________________________________________________________________ ; INITIALIZE: - ;LD A,$C3 ; JP OPCODE - ;LD (0),A ; STORE AT $0000 - ;LD (1),HL ; STORE AT $0001 - +; #IF (BIOS == BIOS_UNA) ; INSTALL UNA INVOCATION VECTOR FOR RST 08 LD A,$C3 ; JP INSTRUCTION @@ -160,14 +152,6 @@ INITIALIZE: LD HL,($FFFE) ; UNA ENTRY VECTOR LD (9),HL ; STORE AT 0x0009 #ENDIF - -#IF DSKYENABLE - LD B,BF_SYSGET ; HBIOS FUNC=GET SYS INFO - LD C,BF_SYSGET_CPUINFO ; HBIOS SUBFUNC=GET CPU INFO - CALL $FFF0 ; CALL HBIOS - LD A,L ; PUT SPEED IN MHZ IN ACCUM - CALL DELAY_INIT -#ENDIF ; RET ; @@ -1278,14 +1262,6 @@ TXT_HELP .TEXT "\r\nMonitor Commands (all values in hex):" ; #IF DSKYENABLE ; -#DEFINE DSKY_KBD - #IF (DSKYMODE == DSKYMODE_V1) -#INCLUDE "dsky.asm" - #ENDIF - #IF (DSKYMODE == DSKYMODE_NG) -#INCLUDE "dskyng.asm" - #ENDIF -; KY_PR .EQU KY_FW ; USE [FW] FOR [PR] (PORT READ) KY_PW .EQU KY_BK ; USE [BW] FOR [PW] (PORT WRITE) ; @@ -1295,8 +1271,9 @@ KY_PW .EQU KY_BK ; USE [BW] FOR [PW] (PORT WRITE) ;_____________________________________________________________________________ ; DSKY_ENTRY: + ; SHOULD WE DO SOMETHING HERE TO CONFIRM THAT A DSKY + ; IS ACTUALLY OPERATING??? LD SP,MON_STACK ; SET THE STACK POINTER - ;EI ; INTS OK NOW LD HL,DSKY_ENTRY ; RESTART ADDRESS CALL INITIALIZE ; @@ -1305,12 +1282,7 @@ DSKY_ENTRY: ; START UP THE SYSTEM WITH THE FRONT PANEL INTERFACE ;_____________________________________________________________________________ ; - CALL DSKY_PREINIT ; INITIALIZE DSKY - - #IF (DSKYMODE == DSKYMODE_NG) CALL DSKY_BEEP - #ENDIF - ; ;__COMMAND_PARSE______________________________________________________________ ; @@ -1320,17 +1292,12 @@ DSKY_ENTRY: FRONTPANELLOOP: LD HL,CPUUP ; SET POINTER TO CPU UP MSG CALL DSKY_SHOW ; DISPLAY UNENCODED - - #IF (DSKYMODE == DSKYMODE_NG) CALL DSKY_HIGHLIGHTCMDKEYS CALL DSKY_L1ON - #ENDIF - - CALL KB_GET ; GET KEY FROM KB - - #IF (DSKYMODE == DSKYMODE_NG) + CALL KB_GET ; GET KEY FROM DSKY + PUSH AF CALL DSKY_L1OFF - #ENDIF + POP AF FRONTPANELLOOP1: CP KY_PR ; IS PORT READ? @@ -1366,11 +1333,7 @@ DOBOOT: ;_____________________________________________________________________________ ; DOPORTREAD: - - #IF (DSKYMODE == DSKYMODE_NG) CALL DSKY_HIGHLIGHTNUMKEYS - #ENDIF - CALL GETPORT ; GET PORT INTO A PORTREADLOOP: LD C,A ; STORE PORT IN "C" @@ -1393,11 +1356,7 @@ PORTREADGETKEY: ;_____________________________________________________________________________ ; DOPORTWRITE: - - #IF (DSKYMODE == DSKYMODE_NG) CALL DSKY_HIGHLIGHTNUMKEYS - #ENDIF - CALL GETPORT ; GET PORT INTO A PORTWRITELOOP: LD L,A ; SAVE PORT NUM @@ -1419,18 +1378,10 @@ PORTWRITEGETKEY: ;_____________________________________________________________________________ ; DOGO: - -#IF (DSKYMODE == DSKYMODE_NG) CALL DSKY_HIGHLIGHTNUMKEYS - #ENDIF - CALL GETADDR ; GET ADDRESS INTO HL - - #IF (DSKYMODE == DSKYMODE_NG) + PUSH HL CALL DSKY_HIGHLIGHTKEYSOFF - #ENDIF - - PUSH HL ; EXEC ADR TO TOS LD HL,GOTO ; POINT TO "GO" MSG CALL INITBUF POP HL @@ -1450,11 +1401,7 @@ DOGO: ;_____________________________________________________________________________ ; DOEXAMINE: - - #IF (DSKYMODE == DSKYMODE_NG) CALL DSKY_HIGHLIGHTNUMKEYS - #ENDIF - CALL GETADDR ; GET ADDRESS INTO HL EXAMINELOOP: LD DE,DISPLAYBUF+0 @@ -1470,11 +1417,7 @@ EXAMINELOOP: LD A,(HL) ; GET VALUE FROM ADDRESS IN HL CALL PUTVALUE CALL ENCDISPLAY ; DISPLAY BUFFER ON DISPLAYS - - #IF (DSKYMODE == DSKYMODE_NG) CALL DSKY_HIGHLIGHTFWDKEYS - #ENDIF - EXAMINEGETKEY: CALL KB_GET ; GET KEY FROM KB CP KY_EN ; [EN] PRESSED, INC ADDRESS AND LOOP @@ -1492,11 +1435,7 @@ EXAMINEFW: ;_____________________________________________________________________________ ; DODEPOSIT: - - #IF (DSKYMODE == DSKYMODE_NG) CALL DSKY_HIGHLIGHTNUMKEYS - #ENDIF - CALL GETADDR ; GET ADDRESS INTO HL DEPOSITLOOP: LD DE,DISPLAYBUF+0 @@ -1513,11 +1452,7 @@ DEPOSITLOOP: LD DE,DISPLAYBUF+6 ; DISPLAY WRITTEN MEM VALUE CALL PUTVALUE ; ... WITHOUT DP'S CALL ENCDISPLAY ; DISPLAY BUFFER CONTENTS - - #IF (DSKYMODE == DSKYMODE_NG) CALL DSKY_HIGHLIGHTFWDKEYS - #ENDIF - DEPOSITGETKEY: CALL KB_GET ; GET KEY FROM KB CP KY_EN ; [EN] PRESSED, INC ADDRESS AND LOOP @@ -1684,6 +1619,7 @@ KB_GET: PUSH DE PUSH HL ; SAVE HL CALL DSKY_GETKEY ; GET A KEY + LD A,E ; PUT KEY CODE IN A CP KY_EN ; ENTER? JR Z,KB_GET1 ; IF YES, RET TO CALLER CP $10 ; HEX DIGIT? @@ -1710,7 +1646,7 @@ INITBUF: ; ;__ENCDISPLAY_________________________________________________________________ ; -; DISPLAY CONTENTS OF DISPLAYBUF DECODED PER SEGDECODE TABLE +; DISPLAY CONTENTS OF DISPLAYBUF ENCODED PER SEGDECODE TABLE ;_____________________________________________________________________________ ; ENCDISPLAY: @@ -1720,7 +1656,7 @@ ENCDISPLAY: ; ;__ENCBUF_____________________________________________________________________ ; -; DISPLAY CONTENTS OF BUFFER AT HL DECODED PER SEGDECODE TABLE +; DISPLAY CONTENTS OF BUFFER AT HL ENCODED PER SEGDECODE TABLE ;_____________________________________________________________________________ ; ENCBUF: @@ -1736,7 +1672,6 @@ ENCBUF1: INC HL ; BUMP TO NEXT BYTE FOR NEXT PASS PUSH AF ; SAVE IT AND $80 ; ISOLATE HI BIT (DP) - ;XOR $80 ; FLIP IT LD C,A ; SAVE IN C POP AF ; RECOVER ORIGINAL AND $7F ; REMOVE HI BIT (DP) @@ -1757,36 +1692,69 @@ ENCBUF1: POP HL ; RESTORE HL RET ; -#IF (DSKYMODE == DSKYMODE_V1) +;_____________________________________________________________________________ ; -CPUUP .DB $04,$4B,$6E,$3B,$00,$3B,$6E,$04 ; "-CPU UP-" (RAW SEG) -MSGBOOT .DB $7F,$1D,$1D,$0F,$A0,$00,$00,$00 ; "Boot! " (RAW SEG) -ADDR .DB $17,$18,$19,$10,$00,$00,$00,$00 ; "Adr 0000" (ENCODED) -PORT .DB $13,$14,$15,$16,$10,$10,$00,$00 ; "Port 00" (ENCODED) -GOTO .DB $1A,$14,$10,$10,$00,$00,$00,$00 ; "Go 0000" (ENCODED) +; DSKY INTERFACE ROUTINES +;_____________________________________________________________________________ ; -;_HEX_7_SEG_DECODE_TABLE______________________________________________________ +DSKY_GETKEY: + LD B,BF_DSKYGETKEY + RST 08 + RET ; -; SET BIT 7 TO DISPLAY W/ DECIMAL POINT -;_____________________________________________________________________________ +DSKY_SHOW: + LD B,BF_DSKYSHOWSEG + RST 08 + RET ; -SEGDECODE: +DSKY_BEEP: + LD B,BF_DSKYBEEP + RST 08 + RET ; - ; POS $00 $01 $02 $03 $04 $05 $06 $07 - ; GLYPH '0' '1' '2' '3' '4' '5' '6' '7' - .DB $7B, $30, $6D, $75, $36, $57, $5F, $70 +DSKY_L1ON: + LD E,1 + JR DSKY_STATLED +DSKY_L1OFF: + LD E,0 +DSKY_STATLED: + LD B,BF_DSKYSTATLED + LD D,0 + RST 08 + RET ; - ; POS $08 $09 $0A $0B $0C $0D $0E $0F - ; GLYPH '8' '9' 'A' 'B' 'C' 'D' 'E' 'F' - .DB $7F, $77, $7E, $1F, $4B, $3D, $4F, $4E +DSKY_PUTLED: + LD B,BF_DSKYKEYLEDS + RST 08 + RET ; - ; POS $10 $11 $12 $13 $14 $15 $16 $17 $18 $19 $1A - ; GLYPH ' ' '-' '.' 'P' 'o' 'r' 't' 'A' 'd' 'r' 'G' - .DB $00, $04, $00, $6E, $1D, $0C, $0F, $7E, $3D, $0C, $5B +DSKY_HIGHLIGHTFWDKEYS: + LD DE,DSKY_HIGHLIGHTFWDKEYLEDS + JR DSKY_HIGHLIGHT ; -#ENDIF +DSKY_HIGHLIGHTCMDKEYS: + LD DE,DSKY_HIGHLIGHTCMDKEYLEDS + JR DSKY_HIGHLIGHT ; -#IF (DSKYMODE == DSKYMODE_NG) +DSKY_HIGHLIGHTNUMKEYS: + LD DE,DSKY_HIGHLIGHTNUMKEYLEDS + JR DSKY_HIGHLIGHT +; +DSKY_HIGHLIGHTKEYSOFF: + LD DE,DSKY_HIGHLIGHTKEYLEDSOFF + JR DSKY_HIGHLIGHT +; +DSKY_HIGHLIGHT: + PUSH HL + EX DE,HL + CALL DSKY_PUTLED + POP HL + RET +; +DSKY_HIGHLIGHTFWDKEYLEDS .DB $00,$00,$00,$30,$00,$00,$00,$00 +DSKY_HIGHLIGHTCMDKEYLEDS .DB $20,$00,$20,$3F,$00,$00,$00,$00 +DSKY_HIGHLIGHTNUMKEYLEDS .DB $1F,$3F,$1F,$30,$00,$00,$00,$00 +DSKY_HIGHLIGHTKEYLEDSOFF .DB $00,$00,$00,$00,$00,$00,$00,$00 ; CPUUP .DB $40,$39,$73,$3E,$00,$3E,$73,$40 ; "-CPU UP-" (RAW SEG) MSGBOOT .DB $7F,$5C,$5C,$78,$82,$00,$00,$00 ; "Boot! " (RAW SEG) @@ -1813,31 +1781,8 @@ SEGDECODE: ; GLYPH ' ' '-' '.' 'P' 'o' 'r' 't' 'A' 'd' 'r' 'G' .DB $00, $40, $00, $73, $5C, $50, $78, $77, $5E, $50, $3D ; - -DSKY_HIGHLIGHTFWDKEYS: - CALL DSKY_PUTLED - .DB $00,$00,$00,$30,$00,$00,$00,$00 - RET - -DSKY_HIGHLIGHTCMDKEYS: - - CALL DSKY_PUTLED - .DB $20,$00,$20,$3F,$00,$00,$00,$00 - RET - -DSKY_HIGHLIGHTNUMKEYS: - CALL DSKY_PUTLED - .DB $1F,$3F,$1F,$30,$00,$00,$00,$00 - RET - -DSKY_HIGHLIGHTKEYSOFF: - - CALL DSKY_PUTLED - .DB $00,$00,$00,$00,$00,$00,$00,$00 - RET -#ENDIF -; DISPLAYBUF: .FILL 8,0 +DSKY_BUF .FILL 8,0 ; #ELSE ; @@ -1949,130 +1894,6 @@ ADDHLA: INC H RET ; -; DELAY 16US (CPU SPEED COMPENSATED) INCUDING CALL/RET INVOCATION -; REGISTER A AND FLAGS DESTROYED -; NO COMPENSATION FOR Z180 MEMORY WAIT STATES -; THERE IS AN OVERHEAD OF 3TS PER INVOCATION -; IMPACT OF OVERHEAD DIMINISHES AS CPU SPEED INCREASES -; -; CPU SCALER (CPUSCL) = (CPUHMZ - 2) FOR 16US + 3TS DELAY -; NOTE: CPUSCL MUST BE >= 1! -; -; EXAMPLE: 8MHZ CPU (DELAY GOAL IS 16US) -; LOOP = ((6 * 16) - 5) = 91TS -; TOTAL COST = (91 + 40) = 131TS -; ACTUAL DELAY = (131 / 8) = 16.375US -; - ; --- TOTAL COST = (LOOP COST + 40) TS -----------------+ -DELAY: ; 17TS (FROM INVOKING CALL) | - LD A,(CPUSCL) ; 13TS | -; | -DELAY1: ; | - ; --- LOOP = ((CPUSCL * 16) - 5) TS ------------+ | - DEC A ; 4TS | | - #IF (BIOS == BIOS_WBW) ; | | - #IF (CPUFAM == CPU_Z180) ; | | - OR A ; +4TS FOR Z180 | | - #ENDIF ; | | - #ENDIF ; | | - JR NZ,DELAY1 ; 12TS (NZ) / 7TS (Z) | | - ; ----------------------------------------------+ | -; | - RET ; 10TS (RETURN) | - ;-------------------------------------------------------+ -; -; DELAY 16US * DE (CPU SPEED COMPENSATED) -; REGISTER DE, A, AND FLAGS DESTROYED -; NO COMPENSATION FOR Z180 MEMORY WAIT STATES -; THERE IS A 27TS OVERHEAD FOR CALL/RET PER INVOCATION -; IMPACT OF OVERHEAD DIMINISHES AS DE AND/OR CPU SPEED INCREASES -; -; CPU SCALER (CPUSCL) = (CPUHMZ - 2) FOR 16US OUTER LOOP COST -; NOTE: CPUSCL MUST BE > 0! -; -; EXAMPLE: 8MHZ CPU, DE=6250 (DELAY GOAL IS .1 SEC OR 100,000US) -; INNER LOOP = ((16 * 6) - 5) = 91TS -; OUTER LOOP = ((91 + 37) * 6250) = 800,000TS -; ACTUAL DELAY = ((800,000 + 27) / 8) = 100,003US -; - ; --- TOTAL COST = (OUTER LOOP + 27) TS ------------------------+ -VDELAY: ; 17TS (FROM INVOKING CALL) | -; | - ; --- OUTER LOOP = ((INNER LOOP + 37) * DE) TS ---------+ | - LD A,(CPUSCL) ; 13TS | | -; | | -VDELAY1: ; | | - ; --- INNER LOOP = ((CPUSCL * 16) - 5) TS ------+ | | - #IF (BIOS == BIOS_WBW) ; | | | - #IF (CPUFAM == CPU_Z180) ; | | | - OR A ; +4TS FOR Z180 | | | - #ENDIF ; | | | - #ENDIF ; | | | - DEC A ; 4TS | | | - JR NZ,VDELAY1 ; 12TS (NZ) / 7TS (Z) | | | - ; ----------------------------------------------+ | | -; | | - DEC DE ; 6TS | | - #IF (BIOS == BIOS_WBW) ; | | | - #IF (CPUFAM == CPU_Z180) ; | | - OR A ; +4TS FOR Z180 | | - #ENDIF ; | | - #ENDIF ; | | - LD A,D ; 4TS | | - OR E ; 4TS | | - JP NZ,VDELAY ; 10TS | | - ;-------------------------------------------------------+ | -; | - RET ; 10TS (FINAL RETURN) | - ;---------------------------------------------------------------+ -; -; DELAY ABOUT 0.5 SECONDS -; 500000US / 16US = 31250 -; -LDELAY: - PUSH AF - PUSH DE - LD DE,31250 - CALL VDELAY - POP DE - POP AF - RET -; -; INITIALIZE DELAY SCALER BASED ON OPERATING CPU SPEED -; ENTER WITH A = CPU SPEED IN MHZ -; -DELAY_INIT: - CP 3 ; TEST FOR <= 2 (SPECIAL HANDLING) - JR C,DELAY_INIT1 ; IF <= 2, SPECIAL PROCESSING - SUB 2 ; ADJUST AS REQUIRED BY DELAY FUNCTIONS - JR DELAY_INIT2 ; AND CONTINUE -DELAY_INIT1: - LD A,1 ; USE THE MIN VALUE OF 1 -DELAY_INIT2: - LD (CPUSCL),A ; UPDATE CPU SCALER VALUE - RET - - #IF (CPUMHZ < 3) -CPUSCL .DB 1 ; CPU SCALER MUST BE > 0 - #ELSE -CPUSCL .DB CPUMHZ - 2 ; OTHERWISE 2 LESS THAN PHI MHZ - #ENDIF -; -; SHORT DELAY FUNCTIONS. NO CLOCK SPEED COMPENSATION, SO THEY -; WILL RUN LONGER ON SLOWER SYSTEMS. THE NUMBER INDICATES THE -; NUMBER OF CALL/RET INVOCATIONS. A SINGLE CALL/RET IS -; 27 T-STATES ON A Z80, 25 T-STATES ON A Z180 -; -; ; Z80 Z180 -; ; ---- ---- -DLY64: CALL DLY32 ; 1728 1600 -DLY32: CALL DLY16 ; 864 800 -DLY16: CALL DLY8 ; 432 400 -DLY8: CALL DLY4 ; 216 200 -DLY4: CALL DLY2 ; 108 100 -DLY2: CALL DLY1 ; 54 50 -DLY1: RET ; 27 25 -; ; ; .FILL 16,0 ; SET MINIMUM STACK DEPTH diff --git a/Source/HBIOS/dma.asm b/Source/HBIOS/dma.asm index c63412e1..18d0ff8c 100644 --- a/Source/HBIOS/dma.asm +++ b/Source/HBIOS/dma.asm @@ -2,6 +2,32 @@ ; Z80 DMA DRIVER ;================================================================================================== ; +; + .ECHO "DMA: MODE=" +; +#IF ((DMAMODE == DMAMODE_ECB) | (DMAMODE == DMAMODE_MBC)) +DMA_IO .EQU DMABASE +DMA_CTL .EQU DMABASE + 1 +DMA_USEHALF .EQU TRUE + #IF (DMAMODE == DMAMODE_ECB) + .ECHO "ECB" + #ENDIF + #IF (DMAMODE == DMAMODE_MBC) + .ECHO "MBC" + #ENDIF +#ENDIF +; +#IF (DMAMODE == DMAMODE_DUO) +DMA_IO .EQU DMABASE +DMA_CTL .EQU DMABASE + 3 +DMA_USEHALF .EQU FALSE + .ECHO "DUO" +#ENDIF +;S + .ECHO ", IO=" + .ECHO DMA_IO + .ECHO "\n" +; DMA_CONTINUOUS .equ %10111101 ; + Pulse DMA_BYTE .equ %10011101 ; + Pulse DMA_BURST .equ %11011101 ; + Pulse @@ -30,21 +56,18 @@ DMA_FORCE .EQU 0 ; DMA CLOCK SPEED CONTROL - OPTION TO SWITCH TO HALF CLOCK SPEED. MOST SYSTEMS NEED THIS. ;================================================================================================== ; -DMA_USEHALF .equ TRUE ; USE CLOCK DIVIDER -; -#IF (DMA_USEHALF & (DMAMODE=DMAMODE_MBC)) -#DEFINE DMAIOHALF LD A,(HB_RTCVAL) \ AND ~%00001000 \ OUT (RTCIO),A -#DEFINE DMAIOFULL PUSH AF \ LD A,(HB_RTCVAL) \ OUT (RTCIO),A \ POP AF -#ENDIF -; -#IF (DMA_USEHALF & (DMAMODE=DMAMODE_ECB)) -#DEFINE DMAIOHALF LD A,(HB_RTCVAL) \ OR %00001000 \ OUT (RTCIO),A -#DEFINE DMAIOFULL PUSH AF \ LD A,(HB_RTCVAL) \ OUT (RTCIO),A \ POP AF -#ENDIF -; -#IF (!DMA_USEHALF) -#DEFINE DMAIOHALF \; -#DEFINE DMAIOFULL \; +#IF (DMA_USEHALF) + #IF (DMAMODE=DMAMODE_MBC) + #DEFINE DMAIOHALF LD A,(HB_RTCVAL) \ AND ~%00001000 \ OUT (RTCIO),A + #DEFINE DMAIOFULL PUSH AF \ LD A,(HB_RTCVAL) \ OUT (RTCIO),A \ POP AF + #ENDIF + #IF (DMAMODE=DMAMODE_ECB) + #DEFINE DMAIOHALF LD A,(HB_RTCVAL) \ OR %00001000 \ OUT (RTCIO),A + #DEFINE DMAIOFULL PUSH AF \ LD A,(HB_RTCVAL) \ OUT (RTCIO),A \ POP AF + #ENDIF +#ELSE + #DEFINE DMAIOHALF \; + #DEFINE DMAIOFULL \; #ENDIF ; ;================================================================================================== @@ -54,11 +77,11 @@ DMA_USEHALF .equ TRUE ; USE CLOCK DIVIDER DMA_INIT: CALL NEWLINE PRTS("DMA: IO=0x$") ; announce - LD A, DMABASE + LD A, DMA_IO CALL PRTHEXBYTE ; LD A,DMA_FORCE - out (DMABASE+1),a ; force ready off + out (DMA_CTL),a ; force ready off ; DMAIOHALF ; @@ -67,7 +90,7 @@ DMA_INIT: ; ld hl,DMACode ; program the ld b,DMACode_Len ; dma command - ld c,DMABASE ; block + ld c,DMA_IO ; block ; di otir ; load dma @@ -103,31 +126,31 @@ DMA_FAIL_FLAG: ;================================================================================================== ; DMAProbe: - ld a,DMA_RESET - out (DMABASE),a - ld a,%01111101 ; R0-Transfer mode, A -> B, start address follows - out (DMABASE),a + ld a,DMA_RESET ; $C3 + out (DMA_IO),a + ld a,%01111101 ; R0-Transfer mode, A -> B, start address follows $7D + out (DMA_IO),a ld a,$cc - out (DMABASE),a + out (DMA_IO),a ld a,$dd - out (DMABASE),a + out (DMA_IO),a ld a,$e5 - out (DMABASE),a + out (DMA_IO),a ld a,$1a - out (DMABASE),a - ld a,DMA_LOAD - out (DMABASE),a -; - ld a,DMA_READ_MASK_FOLLOWS ; set up - out (DMABASE),a ; for - ld a,%00011000 ; register - out (DMABASE),a ; read - ld a,DMA_START_READ_SEQUENCE - out (DMABASE),a -; - in a,(DMABASE) ; read in + out (DMA_IO),a + ld a,DMA_LOAD ; $CF + out (DMA_IO),a +; + ld a,DMA_READ_MASK_FOLLOWS ; set up ; $BB + out (DMA_IO),a ; for + ld a,%00011000 ; register $18 + out (DMA_IO),a ; read + ld a,DMA_START_READ_SEQUENCE ; $A7 + out (DMA_IO),a +; + in a,(DMA_IO) ; read in ld c,a ; address - in a,(DMABASE) + in a,(DMA_IO) ld b,a ; xor a ; is it @@ -165,7 +188,7 @@ DMALDIR: ; ld hl,DMACopy ; program the ld b,DMACopy_Len ; dma command - ld c,DMABASE ; block + ld c,DMA_IO ; block ; DMAIOHALF ; @@ -174,8 +197,8 @@ DMALDIR: ei ; ld a,DMA_READ_STATUS_BYTE ; check status - out (DMABASE),a ; of transfer - in a,(DMABASE) ; set non-zero + out (DMA_IO),a ; of transfer + in a,(DMA_IO) ; set non-zero and %00111011 ; if failed sub %00011011 @@ -211,7 +234,7 @@ DMAOTIR: ; ld hl,DMAOutCode ; program the ld b,DMAOut_Len ; dma command - ld c,DMABASE ; block + ld c,DMA_IO ; block ; DMAIOHALF @@ -220,8 +243,8 @@ DMAOTIR: ei ; ld a,DMA_READ_STATUS_BYTE ; check status - out (DMABASE),a ; of transfer - in a,(DMABASE) ; set non-zero + out (DMA_IO),a ; of transfer + in a,(DMA_IO) ; set non-zero and %00111011 ; if failed sub %00011011 ; @@ -262,7 +285,7 @@ DMAINIR: ; ld hl,DMAInCode ; program the ld b,DMAIn_Len ; dma command - ld c,DMABASE ; block + ld c,DMA_IO ; block ; DMAIOHALF ; @@ -271,8 +294,8 @@ DMAINIR: ei ; ld a,DMA_READ_STATUS_BYTE ; check status - out (DMABASE),a ; of transfer - in a,(DMABASE) ; set non-zero + out (DMA_IO),a ; of transfer + in a,(DMA_IO) ; set non-zero and %00111011 ; if failed sub %00011011 ; @@ -306,31 +329,31 @@ DMAIn_Len .equ $-DMAInCode ; DMARegDump: ld a,DMA_READ_MASK_FOLLOWS - out (DMABASE),a + out (DMA_IO),a ld a,%01111110 - out (DMABASE),a + out (DMA_IO),a ld a,DMA_START_READ_SEQUENCE - out (DMABASE),a + out (DMA_IO),a ; - in a,(DMABASE) + in a,(DMA_IO) ld c,a - in a,(DMABASE) + in a,(DMA_IO) ld b,a call PRTHEXWORD ld a,':' call COUT ; - in a,(DMABASE) + in a,(DMA_IO) ld c,a - in a,(DMABASE) + in a,(DMA_IO) ld b,a call PRTHEXWORD ld a,':' call COUT ; - in a,(DMABASE) + in a,(DMA_IO) ld c,a - in a,(DMABASE) + in a,(DMA_IO) ld b,a call PRTHEXWORD ; diff --git a/Source/HBIOS/ds1501rtc.asm b/Source/HBIOS/ds1501rtc.asm index 4121ebad..42abf10c 100644 --- a/Source/HBIOS/ds1501rtc.asm +++ b/Source/HBIOS/ds1501rtc.asm @@ -53,42 +53,42 @@ ; +---+--+--+-----+----+----+----+----+----+----+------------------+----------------+ ; |14-1F | Reserved | | | ; +------+--+-----+----+----+----+----+----+----+------------------+----------------+ - +; ; * = Unused bits; unwritable and read as 0. ; 0 = should be set to 0 for valid time/calendar range. ; Clock calendar data is BCD. Automatic leap year adjustment. ; Day-Of-Week coded as Sunday = 1 through Saturday = 7. - +; ; Constants - -;By defining 2 bases, this allows some flexibility for address decoding -DS1501NVM_BASE .EQU DS1501RTC_BASE + $10 +; +; By defining 2 bases, this allows some flexibility for address decoding +DS1501NVM_BASE .EQU DS1501RTC_BASE + $10 -DS1501RTC_SEC .EQU DS1501RTC_BASE + $00 -DS1501RTC_MIN .EQU DS1501RTC_BASE + $01 -DS1501RTC_HOUR .EQU DS1501RTC_BASE + $02 +DS1501RTC_SEC .EQU DS1501RTC_BASE + $00 +DS1501RTC_MIN .EQU DS1501RTC_BASE + $01 +DS1501RTC_HOUR .EQU DS1501RTC_BASE + $02 DS1501RTC_WEEK_DAY .EQU DS1501RTC_BASE + $03 -DS1501RTC_DAY .EQU DS1501RTC_BASE + $04 -DS1501RTC_MONTH .EQU DS1501RTC_BASE + $05 -DS1501RTC_YEAR .EQU DS1501RTC_BASE + $06 -DS1501RTC_CENT .EQU DS1501RTC_BASE + $07 +DS1501RTC_DAY .EQU DS1501RTC_BASE + $04 +DS1501RTC_MONTH .EQU DS1501RTC_BASE + $05 +DS1501RTC_YEAR .EQU DS1501RTC_BASE + $06 +DS1501RTC_CENT .EQU DS1501RTC_BASE + $07 DS1501RTC_SEC_ALM .EQU DS1501RTC_BASE + $08 DS1501RTC_MIN_ALM .EQU DS1501RTC_BASE + $09 DS1501RTC_HOUR_ALM .EQU DS1501RTC_BASE + $0A DS1501RTC_DAY_ALM .EQU DS1501RTC_BASE + $0B -DS1501RTC_WDOG1 .EQU DS1501RTC_BASE + $0C -DS1501RTC_WDOG2 .EQU DS1501RTC_BASE + $0D +DS1501RTC_WDOG1 .EQU DS1501RTC_BASE + $0C +DS1501RTC_WDOG2 .EQU DS1501RTC_BASE + $0D DS1501RTC_CONTROLA .EQU DS1501RTC_BASE + $0E DS1501RTC_CONTROLB .EQU DS1501RTC_BASE + $0F - +; DS1501RTC_RAMADDR .EQU DS1501NVM_BASE + $00 DS1501RTC_RAMDATA .EQU DS1501NVM_BASE + $03 - -DS1501RTC_HIGH .EQU %11110000 -DS1501RTC_LOW .EQU %00001111 - -;ControlA bit masks -;BLF1| BLF2| PRS| PAB| TDF| KSF| WDF|IRQF +; +DS1501RTC_HIGH .EQU %11110000 +DS1501RTC_LOW .EQU %00001111 +; +; ControlA bit masks +; BLF1| BLF2| PRS| PAB| TDF| KSF| WDF|IRQF DS1501RTC_IRQF .EQU %00000001 DS1501RTC_WDF .EQU %00000010 DS1501RTC_KSF .EQU %00000100 @@ -97,9 +97,9 @@ DS1501RTC_PAB .EQU %00010000 DS1501RTC_PRS .EQU %00100000 DS1501RTC_BLF2 .EQU %01000000 DS1501RTC_BLF1 .EQU %10000000 - -;ControlB bit masks -;TE| CS| BME| TPE| TIE| KIE| WDE| WDS| +; +; ControlB bit masks +; TE| CS| BME| TPE| TIE| KIE| WDE| WDS| DS1501RTC_WDS .EQU %00000001 DS1501RTC_WDE .EQU %00000010 DS1501RTC_KIE .EQU %00000100 @@ -108,29 +108,36 @@ DS1501RTC_TPE .EQU %00010000 DS1501RTC_BME .EQU %00100000 DS1501RTC_CS .EQU %01000000 DS1501RTC_TE .EQU %10000000 - +; DS1501RTC_BUFSIZE .EQU 6 ; 6 BYTE BUFFER (YYMMDDHHMMSS) + .ECHO "DS1501RTC: RTCIO=" + .ECHO DS1501RTC_BASE + .ECHO ", NVMIO=" + .ECHO DS1501NVM_BASE + .ECHO "\n" +; ; RTC Device Initialization Entry - +; DS1501RTC_INIT: CALL NEWLINE ; Formatting PRTS("DS1501RTC: IO=0x$") LD A, DS1501RTC_BASE CALL PRTHEXBYTE - +; CALL NEWLINE ; Formatting PRTS("DS1501NVM: IO=0x$") LD A, DS1501NVM_BASE CALL PRTHEXBYTE - - IN A,(DS1501RTC_CONTROLB) ;clear any pending interrupt flags - +; + IN A,(DS1501RTC_CONTROLB) ; Clear any pending interrupt flags +; XOR A ; Zero A - OR DS1501RTC_TE ;enable time updates - OUT (DS1501RTC_CONTROLB), A - + OR DS1501RTC_TE ; Enable time updates + OUT (DS1501RTC_CONTROLB), A +; CALL DS1501RTC_LOAD +; ; DISPLAY CURRENT TIME PRTS(" $") LD A, (DS1501RTC_BUF_MON) @@ -150,44 +157,36 @@ DS1501RTC_INIT: PRTS(":$") LD A, (DS1501RTC_BUF_SEC) CALL PRTHEXBYTE - +; LD BC,DS1501RTC_DISPATCH CALL RTC_SETDISP - +; XOR A ; Signal success RET - +; ; RTC Device Function Dispatch Entry ; A: Result (OUT), 0=OK, Z=OK, NZ=Error ; B: Function (IN) - +; DS1501RTC_DISPATCH: LD A, B ; Get requested function AND $0F ; Isolate Sub-Function - JP Z, DS1501RTC_GETTIM ; Get Time + JP Z, DS1501RTC_GETTIM ; Get Time DEC A - JP Z, DS1501RTC_SETTIM ; Set Time + JP Z, DS1501RTC_SETTIM ; Set Time DEC A - JP Z, DS1501RTC_GETBYT ; Get NVRAM Byte Value + JP Z, DS1501RTC_GETBYT ; Get NVRAM Byte Value DEC A - JP Z, DS1501RTC_SETBYT ; Set NVRAM Byte Value + JP Z, DS1501RTC_SETBYT ; Set NVRAM Byte Value DEC A - JP Z, DS1501RTC_GETBLK ; Get NVRAM Data Block Value + JP Z, DS1501RTC_GETBLK ; Get NVRAM Data Block Value DEC A - JP Z, DS1501RTC_SETBLK ; Set NVRAM Data Block Value + JP Z, DS1501RTC_SETBLK ; Set NVRAM Data Block Value DEC A - JP Z, DS1501RTC_GETALM ; Get Alarm + JP Z, DS1501RTC_GETALM ; Get Alarm DEC A - JP Z, DS1501RTC_SETALM ; Set Alarm -; -; NVRAM FUNCTIONS ARE NOT IMPLEMENTED YET + JP Z, DS1501RTC_SETALM ; Set Alarm ; -DS1501RTC_GETBYT: -DS1501RTC_SETBYT: -DS1501RTC_GETBLK: -DS1501RTC_SETBLK: - CALL PANIC - ; RTC Get Time ; A: Result (OUT), 0=OK, Z=OK, NZ=Error ; HL: Date/Time Buffer (OUT) @@ -228,7 +227,7 @@ DS1501RTC_SETTIM: LD (HB_SRCBNK), A ; Set it LD A, BID_BIOS ; Copy to BIOS bank LD (HB_DSTBNK), A ; Set it - LD DE, DS1501RTC_BUF ; Destination Address + LD DE, DS1501RTC_BUF ; Destination Address LD BC, DS1501RTC_BUFSIZE ; Length is 6 bytes #IF (INTMODE == 1) DI @@ -241,27 +240,123 @@ DS1501RTC_SETTIM: LD HL, DS1501RTC_BUF CALL DS1501RTC_SUSPEND LD A, (HL) - OUT (DS1501RTC_YEAR), A ; Write Year + OUT (DS1501RTC_YEAR), A ; Write Year INC HL LD A, (HL) OUT (DS1501RTC_MONTH), A ; Write Month INC HL LD A, (HL) - OUT (DS1501RTC_DAY), A ; Write Day + OUT (DS1501RTC_DAY), A ; Write Day INC HL LD A, (HL) - OUT (DS1501RTC_HOUR), A ; Write Hour + OUT (DS1501RTC_HOUR), A ; Write Hour INC HL LD A, (HL) - OUT (DS1501RTC_MIN), A ; Write Minute + OUT (DS1501RTC_MIN), A ; Write Minute INC HL LD A, (HL) - OUT (DS1501RTC_SEC), A ; Write Second + OUT (DS1501RTC_SEC), A ; Write Second CALL DS1501RTC_RESUME - ; clean up and return +; + ; Clean up and return XOR A ; Signal success RET ; And return - +; +; RTC Get Byte +; +DS1501RTC_GETBYT: +; +; C Index +; E Value +; Set address +; + LD B, C + LD C, DS1501RTC_RAMADDR + OUT (C), B +; + ; Get data + IN A, (DS1501RTC_RAMDATA) + LD E,A +; + ; Return success + XOR +; + RET +; +; RTC Set Byte +; +DS1501RTC_SETBYT: +; +; C Index +; E Value +; Set address +; + LD B, C + LD C, DS1501RTC_RAMADDR + OUT (C), B +; + ; Set data + LD A,E + OUT (DS1501RTC_RAMDATA), A +; + ; Return success + XOR A + RET +; +; RTC Get Block +; +DS1501RTC_GETBLK: +; +; HL Buffer Address +; + LD B, 0 ; 256 Bytes +; + ; Set BME + IN A, (DS1501RTC_CONTROLB) + OR DS1501RTC_BME + OUT (DS1501RTC_CONTROLB), A +; + XOR A + OUT (DS1501RTC_RAMADDR), A + LD C, DS1501RTC_RAMDATA + INIR +; + ; Clear BME + IN A, (DS1501RTC_CONTROLB) + AND ~DS1501RTC_BME + OUT (DS1501RTC_CONTROLB), A +; + ; Return success + XOR A + RET +; +; RTC Set Block +; +DS1501RTC_SETBLK: +; +; HL Buffer Address +; + LD B, 0 ; 256 Bytes +; + ; Set BME + IN A, (DS1501RTC_CONTROLB) + OR DS1501RTC_BME + OUT (DS1501RTC_CONTROLB), A +; + XOR A + OUT (DS1501RTC_RAMADDR), A + LD C, DS1501RTC_RAMDATA + OTIR +; + ; Clear BME + IN A, (DS1501RTC_CONTROLB) + AND ~DS1501RTC_BME + OUT (DS1501RTC_CONTROLB), A +; + ; Return success + XOR A + RET +; ; RTC Get Alarm ; A: Result (OUT), 0=OK, Z=OK, NZ=Error ; HL: Date/Time Buffer (OUT) @@ -291,6 +386,7 @@ DS1501RTC_GETALM: LD (HL), A CALL DS1501RTC_RESUME POP HL ; Restore address of source buffer +; ; Now copy to read destination (Interbank Save) LD A, BID_BIOS ; Copy from BIOS bank LD (HB_SRCBNK), A ; Set it @@ -321,7 +417,7 @@ DS1501RTC_SETALM: LD (HB_SRCBNK), A ; Set it LD A, BID_BIOS ; Copy to BIOS bank LD (HB_DSTBNK), A ; Set it - LD DE, DS1501RTC_BUF ; Destination Address + LD DE, DS1501RTC_BUF ; Destination Address LD BC, DS1501RTC_BUFSIZE ; Length is 6 bytes #IF (INTMODE == 1) DI @@ -345,49 +441,50 @@ DS1501RTC_SETALM: LD A, (HL) OUT (DS1501RTC_SEC_ALM), A ; Write Second CALL DS1501RTC_RESUME - ; clean up and return +; + ; Clean up and return XOR A ; Signal success RET ; And return - +; DS1501RTC_SUSPEND: IN A, (DS1501RTC_CONTROLB) ; Suspend Clock AND ~DS1501RTC_TE OUT (DS1501RTC_CONTROLB), A RET - +; DS1501RTC_RESUME: IN A, (DS1501RTC_CONTROLB) ; Resume Clock OR DS1501RTC_TE OUT (DS1501RTC_CONTROLB), A RET - +; DS1501RTC_LOAD: LD HL, DS1501RTC_BUF PUSH HL ; Save address of source buffer CALL DS1501RTC_SUSPEND - IN A, (DS1501RTC_YEAR) ; Read Year + IN A, (DS1501RTC_YEAR) ; Read Year LD (HL), A INC HL IN A, (DS1501RTC_MONTH) ; Read Month LD (HL), A INC HL - IN A, (DS1501RTC_DAY) ; Read Day + IN A, (DS1501RTC_DAY) ; Read Day LD (HL), A INC HL - IN A, (DS1501RTC_HOUR) ; Read Hour + IN A, (DS1501RTC_HOUR) ; Read Hour LD (HL), A INC HL - IN A, (DS1501RTC_MIN) ; Read Minute + IN A, (DS1501RTC_MIN) ; Read Minute LD (HL), A INC HL - IN A, (DS1501RTC_SEC) ; Read Second + IN A, (DS1501RTC_SEC) ; Read Second LD (HL), A CALL DS1501RTC_RESUME POP HL ; Restore address of source buffer RET - +; ; Working Variables - +; DS1501RTC_BUF: DS1501RTC_BUF_YEAR: .DB 0 ; Year DS1501RTC_BUF_MON: .DB 0 ; Month diff --git a/Source/HBIOS/ds7rtc.asm b/Source/HBIOS/ds7rtc.asm index 82987e02..7dd6970c 100644 --- a/Source/HBIOS/ds7rtc.asm +++ b/Source/HBIOS/ds7rtc.asm @@ -5,6 +5,11 @@ ; ;================================================================================================== ; +#IF (!PCFENABLE) + .ECHO "*** DS7 DRIVER REQUIRES PCF DRIVER. SET PCFENABLE!!!\n" + !!! ; FORCE AN ASSEMBLY ERROR +#ENDIF +; DS7_OUT .EQU 10000000B ; SELECT SQUARE WAVE FUNCTION DS7_SQWE .EQU 00010000B ; ENABLE SQUARE WAVE OUTPUT DS7_RATE .EQU 00000000B ; SET 1HZ OUPUT @@ -17,6 +22,8 @@ DS7_READ .EQU (DS7_DS1307 | DS7_R) ; READ DS7_WRITE .EQU (DS7_DS1307 | DS7_W) ; WRITE ; DS7_CTL .EQU (DS7_OUT | DS7_SQWE | DS7_RATE) +; + .ECHO "DS1307: ENABLED\n" ; ;----------------------------------------------------------------------------- ; DS1307 INITIALIZATION @@ -31,6 +38,7 @@ DS7_CTL .EQU (DS7_OUT | DS7_SQWE | DS7_RATE) ; 12HR MODE IS CURRENTLY ASSUMED ; DS7RTC_INIT: + CALL NEWLINE ; Formatting PRTS("DS1307: $") ; ANNOUNCE DRIVER ; LD A,(PCF_FAIL_FLAG) ; CHECK IF THE diff --git a/Source/HBIOS/dsky.asm b/Source/HBIOS/dsky.asm deleted file mode 100644 index c0da58e7..00000000 --- a/Source/HBIOS/dsky.asm +++ /dev/null @@ -1,386 +0,0 @@ -; -;================================================================================================== -; DSKY (DISPLAY AND KEYBOARD) ROUTINES -;================================================================================================== -; -; THE DSKY MAY COINCIDE ON THE SAME PPI BUS AS A PPISD. IT MAY NOT -; SHARE A PPI BUS WITH A PPIDE. SEE PPI_BUS.TXT FOR MORE INFORMATION. -; -; LED SEGMENTS (BIT VALUES) -; -; +--40--+ -; 02 20 -; +--04--+ -; 08 10 -; +--01--+ 80 -; -; DSKY SCAN CODES ARE ONE BYTE: CCRRRRRR -; BITS 7-6 IDENTFY THE COLUMN OF THE KEY PRESSED -; BITS 5-0 ARE A BITMAP, WITH A BIT ON TO INDICATE ROW OF KEY PRESSED -; -; ____PC0________PC1________PC2________PC3____ -; PB5 | $20 [D] $60 [E] $A0 [F] $E0 [BO] -; PB4 | $10 [A] $50 [B] $90 [C] $D0 [GO] -; PB3 | $08 [7] $48 [8] $88 [9] $C8 [EX] -; PB2 | $04 [4] $44 [5] $84 [6] $C4 [DE] -; PB1 | $02 [1] $42 [2] $82 [3] $C2 [EN] -; PB0 | $01 [FW] $41 [0] $81 [BK] $C1 [CL] -; -; -PPIA .EQU DSKYPPIBASE + 0 ; PORT A -PPIB .EQU DSKYPPIBASE + 1 ; PORT B -PPIC .EQU DSKYPPIBASE + 2 ; PORT C -PPIX .EQU DSKYPPIBASE + 3 ; PPI CONTROL PORT -; -;__DSKY_INIT_________________________________________________________________________________________ -; -; CONFIGURE PARALLEL PORT AND CLEAR KEYPAD BUFFER -;____________________________________________________________________________________________________ -; -DSKY_PREINIT: - OR $FF ; SIGNAL TO WAIT FOR KEY RELEASE - LD (DSKY_KEYBUF),A ; SET IT -; - ; PPI PORT B IS NORMALLY SET TO INPUT, BUT HERE WE - ; TEMPORARILY SET IT TO OUTPUT. WHILE IN OUTPUT MODE, WE - ; WRITE A VALUE OF $FF WHICH WILL BE PERSISTED BY THE PPI - ; CHIP BUS HOLD CIRCUIT IF THERE IS NO DSKY PRESENT. SO, - ; WE CAN SUBSEQUENTLY TEST FOR PPIB=$FF TO SEE IF THERE IS - ; NO DSKY AND PREVENT PROBLEMS WITH PHANTOM DSKY KEY PRESSES. - ; IF A DSKY IS PRESENT, IT WILL SIMPLY OVERPOWER THE PPI - ; BUS HOLD CIRCUIT. - LD A,$80 ; PA OUT, PB OUT, PC OUT - OUT (PPIX),A - LD A,$FF ; SET PPIB=$FF, BUS HOLD - OUT (PPIB),A -; - LD A,$82 ; PA OUT, PB IN, PC OUT - OUT (PPIX),A -; - ;IN A,(PPIB) ; *DEBUG* - ;CALL PRTHEXBYTE ; *DEBUG* -; - IN A,(PPIB) ; READ PPIB - XOR $FF ; INVERT RESULT - LD (DSKY_PRESENT),A ; SAVE AS PRESENT FLAG -; -DSKY_RESET: - PUSH AF -; - LD A,$70 ; PPISD AND 7218 INACTIVE - OUT (PPIC),A -; - POP AF - RET -; -#IFDEF HBIOS -; -DSKY_INIT: - CALL NEWLINE ; FORMATTING - PRTS("DSKY:$") ; FORMATTING -; - PRTS(" IO=0x$") ; FORMATTING - LD A,DSKYPPIBASE ; GET BASE PORT - CALL PRTHEXBYTE ; PRINT BASE PORT - PRTS(" MODE=$") ; FORMATTING - PRTS("V1$") ; PRINT DSKY TYPE -; - LD A,(DSKY_PRESENT) ; PRESENT? - OR A ; SET FLAGS - RET NZ ; YES, ALL DONE - PRTS(" NOT PRESENT$") ; NOT PRESENT -; - RET -; -#ENDIF -; -#IFDEF DSKY_KBD -; -KY_0 .EQU $00 -KY_1 .EQU $01 -KY_2 .EQU $02 -KY_3 .EQU $03 -KY_4 .EQU $04 -KY_5 .EQU $05 -KY_6 .EQU $06 -KY_7 .EQU $07 -KY_8 .EQU $08 -KY_9 .EQU $09 -KY_A .EQU $0A -KY_B .EQU $0B -KY_C .EQU $0C -KY_D .EQU $0D -KY_E .EQU $0E -KY_F .EQU $0F -KY_FW .EQU $10 ; FORWARD -KY_BK .EQU $11 ; BACKWARD -KY_CL .EQU $12 ; CLEAR -KY_EN .EQU $13 ; ENTER -KY_DE .EQU $14 ; DEPOSIT -KY_EX .EQU $15 ; EXAMINE -KY_GO .EQU $16 ; GO -KY_BO .EQU $17 ; BOOT -; -;__DSKY_GETKEY_____________________________________________________________________________________ -; -; WAIT FOR A DSKY KEYPRESS AND RETURN -;____________________________________________________________________________________________________ -; -DSKY_GETKEY: - LD A,(DSKY_PRESENT) ; DOES IT EXIST? - OR A ; SET FLAGS - JR Z,DSKY_GETKEY1A ; ABORT IF NOT PRESENT -; - CALL DSKY_STAT ; CHECK STATUS - JR Z,DSKY_GETKEY ; LOOP IF NOTHING READY - LD A,(DSKY_KEYBUF) - LD B,24 ; SIZE OF DECODE TABLE - LD C,0 ; INDEX - LD HL,DSKY_KEYMAP ; POINT TO BEGINNING OF TABLE -DSKY_GETKEY1: - CP (HL) ; MATCH? - JR Z,DSKY_GETKEY2 ; FOUND, DONE - INC HL - INC C ; BUMP INDEX - DJNZ DSKY_GETKEY1 ; LOOP UNTIL EOT -DSKY_GETKEY1A: - LD A,$FF ; NOT FOUND ERR, RETURN $FF - RET -DSKY_GETKEY2: - LD A,$FF ; SET KEY BUF TO $FF - LD (DSKY_KEYBUF),A ; DO IT - ; RETURN THE INDEX POSITION WHERE THE SCAN CODE WAS FOUND - LD A,C ; RETURN INDEX VALUE - RET -; -;__DSKY_STAT_________________________________________________________________________________________ -; -; CHECK FOR KEY PRESS, SAVE RAW VALUE, RETURN STATUS -;____________________________________________________________________________________________________ -; -DSKY_STAT: - LD A,(DSKY_PRESENT) ; DOES IT EXIST? - OR A ; SET FLAGS - RET Z ; ABORT WITH A=0 IF NOT THERE -; - LD A,(DSKY_KEYBUF) ; GET CURRENT BUF VAL - CP $FF ; $FF MEANS WE ARE WAITING FOR PREV KEY TO BE RELEASED - JR Z,DSKY_STAT1 ; CHECK FOR PREV KEY RELEASE - OR A ; DO WE HAVE A SCAN CODE BUFFERED ALREADY? - RET NZ ; IF SO, WE ARE DONE - JR DSKY_STAT2 ; OTHERWISE, DO KEY CHECK - -DSKY_STAT1: - ; WAITING FOR PREVIOUS KEY RELEASE - CALL DSKY_KEY ; SCAN - JR Z,DSKY_STAT2 ; IF ZERO, PREV KEY RELEASED, CONTINUE - XOR A ; SIGNAL NO KEY PRESSED - RET ; AND DONE - -DSKY_STAT2: - CALL DSKY_KEY ; SCAN - LD (DSKY_KEYBUF),A ; SAVE RESULT - RET ; RETURN WITH ZF SET APPROPRIATELY -; -;__DSKY_KEY_______________________________________________________________________________________ -; -; CHECK FOR KEY PRESS W/ DEBOUNCE -;____________________________________________________________________________________________________ -; -DSKY_KEY: - ; IF PPIB VALUE IS $FF, THERE IS NO DSKY, SEE DSKY_INIT - IN A,(PPIB) - INC A - RET Z - - CALL DSKY_SCAN ; INITIAL KEY PRESS SCAN - LD E,A ; SAVE INITIAL SCAN VALUE -DSKY_KEY1: - ; MAX BOUNCE TIME FOR OMRON B3F IS 3MS - PUSH DE ; SAVE DE - LD DE,300 ; ~3MS DELAY - CALL VDELAY ; DO IT - CALL DSKY_SCAN ; REPEAT SCAN - POP DE ; RESTORE DE - RET Z ; IF NOTHING PRESSED, DONE - CP E ; SAME? - JR DSKY_KEY2 ; YES, READY TO RETURN - LD E,A ; OTHERWISE, SAVE NEW SCAN VAL - JR DSKY_KEY1 ; AND LOOP UNTIL STABLE VALUE -DSKY_KEY2: - OR A ; SET FLAGS BASED ON VALUE - RET ; AND DONE -; -;__DSKY_SCAN______________________________________________________________________________________ -; -; SCAN KEYPAD AND RETURN RAW SCAN CODE (RETURNS ZERO IF NO KEY PRESSED) -;____________________________________________________________________________________________________ -; -DSKY_SCAN: - LD B,4 ; 4 COLUMNS - LD C,$01 ; FIRST COLUMN - LD E,0 ; INITIAL COL ID -DSKY_SCAN1: - LD A,C ; COL TO A - OR $70 ; KEEP PPISD AND 7218 INACTIVE - OUT (PPIC),A ; ACTIVATE COL - IN A,(PPIB) ; READ ROW BITS - AND $3F ; MASK, WE ONLY HAVE 6 ROWS, OTHERS UNDEFINED - JR NZ,DSKY_SCAN2 ; IF NOT ZERO, GOT SOMETHING - RLC C ; NEXT COL - INC E ; BUMP COL ID - DJNZ DSKY_SCAN1 ; LOOP THROUGH ALL COLS - XOR A ; NOTHING FOUND, RETURN ZERO - JP DSKY_RESET ; RETURN VIA RESET -DSKY_SCAN2: - RRC E ; MOVE COL ID - RRC E ; ... TO HIGH BITS 6 & 7 - OR E ; COMBINE WITH ROW - JP DSKY_RESET ; RETURN VIA RESET -; -;_KEYMAP_TABLE_____________________________________________________________________________________________________________ -; -DSKY_KEYMAP: - ; POS $00 $01 $02 $03 $04 $05 $06 $07 - ; KEY [0] [1] [2] [3] [4] [5] [6] [7] - .DB $41, $02, $42, $82, $04, $44, $84, $08 -; - ; POS $08 $09 $0A $0B $0C $0D $0E $0F - ; KEY [8] [9] [A] [B] [C] [D] [E] [F] - .DB $48, $88, $10, $50, $90, $20, $60, $A0 -; - ; POS $10 $11 $12 $13 $14 $15 $16 $17 - ; KEY [FW] [BK] [CL] [EN] [DE] [EX] [GO] [BO] - .DB $01, $81, $C1, $C2, $C4, $C8, $D0, $E0 -; -; KBD WORKING STORAGE -; -DSKY_KEYBUF .DB 0 -; -#ENDIF ; DSKY_KBD -; -;================================================================================================== -; CONVERT 32 BIT BINARY TO 8 BYTE HEX SEGMENT DISPLAY -;================================================================================================== -; -; HL: ADR OF 32 BIT BINARY -; DE: ADR OF DEST LED SEGMENT DISPLAY BUFFER (8 BYTES) -; -DSKY_BIN2SEG: - PUSH HL - PUSH DE - LD B,4 ; 4 BYTES OF INPUT - EX DE,HL -DSKY_BIN2SEG1: - LD A,(DE) ; FIRST NIBBLE - SRL A - SRL A - SRL A - SRL A - PUSH HL - LD HL,DSKY_HEXMAP - CALL DSKY_ADDHLA - LD A,(HL) - POP HL - LD (HL),A - INC HL - LD A,(DE) ; SECOND NIBBLE - AND 0FH - PUSH HL - LD HL,DSKY_HEXMAP - CALL DSKY_ADDHLA - LD A,(HL) - POP HL - LD (HL),A - INC HL - INC DE ; NEXT BYTE - DJNZ DSKY_BIN2SEG1 - POP DE - POP HL - RET -; -;================================================================================================== -; DSKY SHOW BUFFER -; HL: ADDRESS OF BUFFER -;================================================================================================== -; -DSKY_SHOW: - ;;PUSH AF ; SAVE 7218 CONTROL BITS - LD A,82H ; SETUP PPI - OUT (PPIX),A - CALL DSKY_COFF - ;;POP AF - LD A,$F0 ; 7218 -> (DATA COMING, NO DECODE) - OUT (PPIA),A - CALL DSKY_STROBEC ; STROBE COMMAND - LD B,DSKY_BUFLEN ; NUMBER OF DIGITS - LD C,PPIA -DSKY_HEXOUT2: - ;OUTI - LD A,(HL) - XOR $80 ; FIX DOT POLARITY - OUT (C),A - INC HL - DEC B - JP Z,DSKY_STROBE ; DO FINAL STROBE AND RETURN - CALL DSKY_STROBE ; STROBE BYTE VALUE - JR DSKY_HEXOUT2 -DSKY_STROBEC: ; COMMAND STROBE - LD A,80H | 30H - JP DSKY_STROBE0 -DSKY_STROBE: ; DATA STROBE - LD A,00H | 30H ; SET WRITE STROBE -DSKY_STROBE0: - OUT (PPIC),A ; OUT TO PORTC - CALL DLY2 ; DELAY -DSKY_COFF: - LD A,40H | 30H ; QUIESCE - OUT (PPIC),A ; OUT TO PORTC -; CALL DSKY_DELAY ; WAIT - RET -; -;================================================================================================== -; UTILTITY FUNCTIONS -;================================================================================================== -; -DSKY_ADDHLA: - ADD A,L - LD L,A - RET NC - INC H - RET -; -;================================================================================================== -; STORAGE -;================================================================================================== -; -; CODES FOR NUMERICS -; HIGH BIT ALWAYS CLEAR TO SUPPRESS DECIMAL POINT -; SET HIGH BIT TO SHOW DECIMAL POINT -; -DSKY_HEXMAP: - .DB $7B ; 0 - .DB $30 ; 1 - .DB $6D ; 2 - .DB $75 ; 3 - .DB $36 ; 4 - .DB $57 ; 5 - .DB $5F ; 6 - .DB $70 ; 7 - .DB $7F ; 8 - .DB $77 ; 9 - .DB $7E ; A - .DB $1F ; B - .DB $4B ; C - .DB $3D ; D - .DB $4F ; E - .DB $4E ; F -; -; SEG DISPLAY WORKING STORAGE -; -DSKY_PRESENT .DB 0 -; -DSKY_BUF .FILL 8,0 -DSKY_BUFLEN .EQU $ - DSKY_BUF -DSKY_HEXBUF .FILL 4,0 -DSKY_HEXBUFLEN .EQU $ - DSKY_HEXBUF diff --git a/Source/HBIOS/dsrtc.asm b/Source/HBIOS/dsrtc.asm index be29dc5e..7df87f28 100644 --- a/Source/HBIOS/dsrtc.asm +++ b/Source/HBIOS/dsrtc.asm @@ -88,6 +88,8 @@ ; D2 -- -- -- -- -- -- -- -- -- -- -- ; D1 ---- -- -- -- -- -- -- -- -- CLKSEL -- ; D0 RTC_IN RTC_IN RTC_IN RTC_IN RTC_IN RTC_IN -- -- RTC_IN RTC_IN RTC_IN +; + .ECHO "DSRTC: MODE=" ; #IF (DSRTCMODE == DSRTCMODE_STD) ; @@ -113,6 +115,8 @@ DS1d8k .EQU %10100111 ; 1 DOIDE 8K RESISTOR DS2d2k .EQU %10101001 ; 2 DIODES 2K RESISTOR DS2d4k .EQU %10101010 ; 2 DIODES 4K RESISTOR DS2d8k .EQU %10101011 ; 2 DIODES 8K RESISTOR +; + .ECHO "STD" ; #ENDIF ; @@ -129,8 +133,14 @@ DSRTC_MASK .EQU %00001111 ; MASK FOR BITS WE OWN IN RTC LATCH PORT DSRTC_IDLE .EQU %00001000 ; QUIESCENT STATE ; #DEFINE DSRTC_OPRVAL DSRTC_RTCVAL +; + .ECHO "MFPIC" ; #ENDIF +; + .ECHO ", IO=" + .ECHO DSRTC_IO + .ECHO "\n" ; DSRTC_BUFSIZ .EQU 7 ; 7 BYTE BUFFER (YYMMDDHHMMSSWW) ; @@ -145,6 +155,8 @@ DSRTC_PREINIT: ;OR DSRTC_IDLE ; SET OUR IDLE BITS ;LD (DSRTC_OPRVAL),A ; SAVE IT ; + XOR A ; ZERO + LD (DSRTC_STAT),A ; CLEAR STATUS CALL DSRTC_DETECT ; HARDWARE DETECTION LD (DSRTC_STAT),A ; SAVE RESULT RET NZ ; ABORT IF ERROR diff --git a/Source/HBIOS/duart.asm b/Source/HBIOS/duart.asm index f49182be..91213874 100644 --- a/Source/HBIOS/duart.asm +++ b/Source/HBIOS/duart.asm @@ -822,6 +822,10 @@ DUART0A_CFG: .DW DUART0_ACR ; IY+6 POINTER TO SHADOW ACR FOR THIS CHIP .DW DUART0ACFG ; IY+8 LINE CONFIGURATION .DB 1 ; IY+10 MULTIPLIER WRT 3.6864MHZ CLOCK +; + .ECHO "DUART: IO=" + .ECHO DUART0BASE + $00 + .ECHO ", CHANNEL A\n" ; DUART_CFGSIZ .EQU $ - DUART_CFG ; SIZE OF ONE CFG TABLE ENTRY ; @@ -835,6 +839,10 @@ DUART0B_CFG: .DW DUART0_ACR ; POINTER TO SHADOW ACR FOR THIS CHIP .DW DUART0BCFG ; LINE CONFIGURATION .DB 1 ; MULTIPLIER WRT 3.6864MHZ CLOCK +; + .ECHO "DUART: IO=" + .ECHO DUART0BASE + $08 + .ECHO ", CHANNEL B\n" ; #IF (DUARTCNT >= 2) ; @@ -848,6 +856,10 @@ DUART1A_CFG: .DW DUART1_ACR ; POINTER TO SHADOW ACR FOR THIS CHIP .DW DUART1ACFG ; LINE CONFIGURATION .DB 1 ; MULTIPLIER WRT 3.6864MHZ CLOCK +; + .ECHO "DUART: IO=" + .ECHO DUART1BASE + $00 + .ECHO ", CHANNEL A\n" ; DUART1B_CFG: ; 2ND DUART MODULE CHANNEL B @@ -859,6 +871,10 @@ DUART1B_CFG: .DW DUART1_ACR ; POINTER TO SHADOW ACR FOR THIS CHIP .DW DUART1BCFG ; LINE CONFIGURATION .DB 1 ; MULTIPLIER WRT 3.6864MHZ CLOCK +; + .ECHO "DUART: IO=" + .ECHO DUART1BASE + $08 + .ECHO ", CHANNEL B\n" ; #ENDIF ; diff --git a/Source/HBIOS/esp.asm b/Source/HBIOS/esp.asm new file mode 100644 index 00000000..75b4d58b --- /dev/null +++ b/Source/HBIOS/esp.asm @@ -0,0 +1,709 @@ +; +;================================================================================================== +; ESP32 DRIVER +; +; SUPPORTS DAN WERNER'S NHYODYNE (MBC) ESP32 MODULE +; https://github.com/danwerner21/nhyodyne/tree/main/Z80ESP +;================================================================================================== +; +; TODO: +; - CLEAR CONSOLE SCREEN AT INITIALIZATION +; - INITIALIZE BAUD/MODE OF SERIAL INTERFACES AT INITIALIZATION? +; +ESP_IOBASE .EQU $9C +ESP_0_IO .EQU ESP_IOBASE + 0 +ESP_1_IO .EQU ESP_IOBASE + 1 +ESP_STAT .EQU ESP_IOBASE + 2 +; +; ESP STATUS PORT +; MSB X X S S S S S S +; | | | | | +- ESP0 READY OUTPUT +; | | | | +--- ESP0 BUSY +; | | | +----- ESP0 SPARE +; | | +------- ESP1 READY OUTPUT +; | +--------- ESP1 BUSY +; +----------- ESP1 SPARE +; +ESP_0_RDY .EQU %00000001 +ESP_0_BUSY .EQU %00000010 +ESP_0_SPARE .EQU %00000100 +ESP_1_RDY .EQU %00001000 +ESP_1_BUSY .EQU %00010000 +ESP_1_SPARE .EQU %00100000 +; +; COMMAND OPCODES +; +ESP_CMD_NOP .EQU 0 ; NO OP/SYNC +ESP_CMD_SYNC .EQU 0 ; NO OP/SYNC +ESP_0_CMD_COUT .EQU 1 ; CHAR OUT +ESP_0_CMD_CSTR .EQU 2 ; STRING OUT +ESP_0_CMD_KIN .EQU 3 ; KEY IN +ESP_0_CMD_KST .EQU 4 ; KBD BUF STATUS +ESP_CMD_SBAUD .EQU 6 ; SET SERIAL BAUD RATE +ESP_CMD_SMODE .EQU 7 ; SET SERIAL LINE MODE +ESP_CMD_SOUT .EQU 8 ; SERIAL BYTE OUT +ESP_CMD_SIN .EQU 10 ; SERIAL BYTE IN +ESP_CMD_SST .EQU 11 ; SERIAL INPUT STATUS +ESP_CMD_DISC .EQU $FF ; DISCOVER +; +; ESP CONFIG TABLE ENTRY OFFSETS +; +ESP_CFG_DEV .EQU 0 ; DEVICE NUMBER +ESP_CFG_IO .EQU 1 ; ESP I/O PORT +ESP_CFG_ST .EQU 2 ; ESP STATUS PORT +ESP_CFG_RDYMSK .EQU 3 ; ESP READY MASK +ESP_CFG_BSYMSK .EQU 4 ; ESP BUSY MASK +; + .ECHO "ESP: IO=" + .ECHO ESP_IOBASE + .ECHO "\n" +; +; GLOBAL ESP INITIALIZATION +; +ESP_INIT: +; + CALL NEWLINE ; FORMATTING + PRTS("ESP: IO=0x$") + LD A,ESP_IOBASE + CALL PRTHEXBYTE +; + XOR A ; ZERO ACCUM + LD (ESP_PRES),A ; CLEAR MODULE PRESENCE BITS +; + ; DETECT FIRST ESP32 MODULE + PRTS(" A=$") + LD IY,ESPSER0_CFG + CALL ESP_DETECT + JR Z,ESP_INIT1 ; FOUND + LD DE,ESP_STR_NOHW + CALL WRITESTR + JR ESP_INIT2 +; +ESP_INIT1: + CALL ESP_PRTVER + + LD A,(ESP_PRES) + SET 0,A + LD (ESP_PRES),A + +; +ESP_INIT2: + ; DETECT SECOND ESP32 MODULE + PRTS(" B=$") + LD IY,ESPSER1_CFG + CALL ESP_DETECT + JR Z,ESP_INIT3 ; FOUND + LD DE,ESP_STR_NOHW + CALL WRITESTR + JR ESP_INIT4 +; +ESP_INIT3: + CALL ESP_PRTVER + + LD A,(ESP_PRES) + SET 1,A + LD (ESP_PRES),A + +; +ESP_INIT4: + ; INITIALIZE FIRST MODULE CHILD DRIVERS + LD A,(ESP_PRES) + BIT 0,A + JR Z,ESP_INIT5 + LD IY,ESPSER0_CFG + CALL ESPSER_INIT ; SERIAL INITIALIZATION + LD IY,ESPCON0_CFG + CALL ESPCON_INIT ; CONSOLE INITIALIZATION +; +ESP_INIT5: + ; INITIALIZE SECOND MODULE CHILD DRIVERS + LD A,(ESP_PRES) + BIT 1,A + JR Z,ESP_INIT6 + LD IY,ESPSER1_CFG + CALL ESPSER_INIT ; SERIAL INITIALIZATION +; +ESP_INIT6: + RET +; +;================================================================================================== +; ESP32 INTERFACE FUNCTIONS +;================================================================================================== +; +ESP_DETECT: + ; TRY TO DETECT IF PORT IS FLOATING AND + ; FAIL DETECTION IF SO + LD C,(IY+ESP_CFG_ST) ; ESP STATUS PORT + IN A,(C) ; READ IT + ;CALL PC_SPACE ; *DEBUG* + ;CALL PRTHEXBYTE ; *DEBUG* + AND %11100000 ; ISOLATE TOP 3 BITS + CP $00 ; ALWAYS ZERO IF PRESENT + RET NZ ; ABORT ON FAILURE +; + ; ESP32 PROCESSOR MAY TAKE A FEW SECONDS TO START UP, SO + ; HERE WE WAIT FOR BUSY TO CLEAR WITH ABOUT A 5 SECOND TIMEOUT + LD B,0 ; LOOP UP TO 256 TIMES + LD C,(IY+ESP_CFG_ST) ; ESP STATUS PORT +ESP_DETECT1: + IN A,(C) ; GET STATUS + AND (IY+ESP_CFG_BSYMSK) ; IS ESP BUSY? + JR Z,ESP_DETECT2 ; MOVE ALONG IF NOT BUSY + LD DE,1500 ; 1500 * 16US = 24MS + CALL VDELAY ; DELAY + DJNZ ESP_DETECT1 ; LOOP + OR $FF ; SIGNAL FAILURE + RET ; DONE +; +ESP_DETECT2: + CALL ESP_SYNC + ;LD A,B ; *DEBUG* + ;CALL PC_SPACE ; *DEBUG* + ;CALL PRTHEXBYTE ; *DEBUG* + CALL ESP_CLR ; CLEAR ANY PENDING DATA + LD A,ESP_CMD_DISC ; DISCOVER COMMAND + CALL ESP_OUT ; SEND IT +; + ; LOOK FOR SIGNATURE STARTING WITH "ESP" + CALL ESP_INWAIT ; ATTEMPT TO GET CHAR + ;CALL PC_SPACE ; *DEBUG* + ;CALL PRTHEXBYTE ; *DEBUG* + CP 'E' + RET NZ + CALL ESP_INWAIT ; ATTEMPT TO GET CHAR + ;CALL PC_SPACE ; *DEBUG* + ;CALL PRTHEXBYTE ; *DEBUG* + CP 'S' + RET NZ + CALL ESP_INWAIT ; ATTEMPT TO GET CHAR + ;CALL PC_SPACE ; *DEBUG* + ;CALL PRTHEXBYTE ; *DEBUG* + CP 'P' + RET +; +; CLEAR ESP INPUT QUEUE +; +ESP_CLR: +; LD B,0 ; MAX CHARS TO READ /Removed DDW +;ESP_CLR0: /Removed DDW + CALL ESP_WTNBSY ; WAIT TILL NOT BUSY + RET NZ ; BAIL OUT IF TIMEOUT + IN A,(ESP_STAT) ; GET STATUS + AND (IY+ESP_CFG_RDYMSK) ; IS THERE MORE DATA? + RET Z ; IF NOT, DONE + LD C,(IY+ESP_CFG_IO) ; ESP I/O PORT + IN A,(C) ; GET BYTE + JP ESP_CLR +; DJNZ ESP_CLR0 ; LOOP TILL DONE /Removed DDW +; OR $FF ; SIGNAL FAILURE /Removed DDW +; RET /Removed DDW + +; +; RE-SYNC ESP (added DDW) +; +ESP_SYNC: + LD B,0 ; sync count -- WORST CASE PERFORMACE COULD BE IMPROVED BY REDUCING THIS VALUE +ESP_SYNC0: + PUSH BC + LD A,ESP_CMD_SYNC ; Sync ESP + CALL ESP_OUT ; SEND CMD OPCODE + POP BC + DJNZ ESP_SYNC0 ; LOOP TILL DONE + RET +; +; PRINT ESP VERSION STRING TO CONSOLE +; +ESP_PRTVER: + CALL ESP_SYNC + CALL ESP_CLR ; CLEAR ANY PENDING DATA + ;LD DE,1000 ; SMALL DELAY HERE + ;CALL VDELAY ; ... SEEMS TO HELP RELIABILITY + LD A,ESP_CMD_DISC ; DISCOVER COMMAND + CALL ESP_OUT ; SEND IT + CALL ESP_WTRDY ; WAIT FOR READY TO OUTPUT +ESP_PRTVER1: + CALL ESP_WTNBSY ; WAIT TILL NOT BUSY + IN A,(ESP_STAT) ; GET STATUS + AND (IY+ESP_CFG_RDYMSK) ; ISOLATE OUTPUT READY BIT + RET Z ; DONE IF NOTHING READY + CALL ESP_IN ; GET NEXT CHAR + CALL COUT ; PRINT CHAR + JR ESP_PRTVER1 ; LOOP +; +; SEND BYTE TO ESP +; +ESP_OUT: + PUSH AF ; SAVE VALUE + CALL ESP_WTNBSY ; WAIT TILL NOT BUSY + POP AF ; POP VALUE + LD C,(IY+ESP_CFG_IO) ; ESP I/O PORT + OUT (C),A ; SEND BYTE + JR ESP_WTBSY ; RETURN VIA WTBSY +; +; GET BYTE FROM ESP (BLOCKING) +; +ESP_INWAIT: + CALL ESP_WTNBSY ; WAIT TILL NOT BUSY + CALL ESP_WTRDY ; WAIT FOR READY TO OUTPUT + JP ESP_IN1 ; Added DDW +; +; GET BYTE FROM ESP (NON BLOCKING) +; +ESP_IN: + CALL ESP_WTNBSY ; WAIT TILL NOT BUSY +ESP_IN1: + LD C,(IY+ESP_CFG_IO) ; ESP I/O PORT + IN A,(C) ; GET BYTE + PUSH AF ; SAVE VALUE + CALL ESP_WTBSY ; WAIT TILL BUSY + POP AF ; RESTORE VALUE + RET ; AND RETURN +; +; WAIT FOR ESP TO BE NOT BUSY +; +ESP_WTNBSY: + LD B,0 ; MAX TRIES + ;PUSH HL ; SAVE HL + ;LD HL,0 ; MAX TRIES +ESP_WTNBSY1: + LD C,(IY+ESP_CFG_ST) ; ESP STATUS PORT + IN A,(C) ; GET STATUS + AND (IY+ESP_CFG_BSYMSK) ; IS ESP BUSY? + RET Z ; RETURN IF NOT BUSY + ;JR Z,ESP_WTNBSY_Z ; RETURN IF NOT BUSY + DJNZ ESP_WTNBSY1 ; ELSE LOOP + ;DEC HL ; DEC LOOP COUNTER + ;LD A,H ; CHECK FOR + ;OR L ; ... TIMEOUT + ;JR NZ,ESP_WTNBSY1 ; LOOP AS NEEDED + ;CALL PC_ASTERISK ; *DEBUG* + OR $FF ; SIGNAL TIMEOUT +;ESP_WTNBSY_Z: + ;POP HL ; RECOVER HL + RET ; AND RETURN +; +; WAIT FOR ESP TO BE BUSY +; +ESP_WTBSY: + LD B,3 ; MAX TRIES +ESP_WTBSY1: + LD C,(IY+ESP_CFG_ST) ; ESP STATUS PORT + IN A,(C) ; GET STATUS + XOR $FF ; INVERT SO 0=BUSY + AND (IY+ESP_CFG_BSYMSK) ; IS ESP BUSY? + RET Z ; RETURN IF BUSY + DJNZ ESP_WTBSY1 ; ELSE LOOP + OR $FF ; SIGNAL TIMEOUT + RET ; AND RETURN +;;;; +;;;; WAIT FOR ESP TO BE READY TO OUTPUT +;;;; +;;;ESP_WTRDY: +;;; PUSH HL ; SAVE HL +;;; LD HL,0 ; MAX TRIES +;;;ESP_WTRDY1: +;;; LD C,(IY+ESP_CFG_ST) ; ESP STATUS PORT +;;; IN A,(C) ; GET STATUS +;;; XOR $FF ; INVERT SO 0=READY +;;; AND (IY+ESP_CFG_RDYMSK) ; IS ESP READY TO OUTPUT +;;; JR Z,ESP_WTRDY_Z ; RETURN IF READY +;;; DEC HL ; DEC LOOP COUNTER +;;; LD A,H ; CHECK FOR +;;; OR L ; ... TIMEOUT +;;; JR NZ,ESP_WTRDY1 ; LOOP AS NEEDED +;;; CALL PC_PERIOD ; *DEBUG* +;;; OR $FF ; SIGNAL TIMEOUT +;;;ESP_WTRDY_Z: +;;; POP HL ; RECOVER HL +;;; RET ; AND RETURN +; +; WAIT FOR ESP TO BE READY TO OUTPUT +; +ESP_WTRDY: + LD B,0 ; MAX TRIES +ESP_WTRDY1: + LD C,(IY+ESP_CFG_ST) ; ESP STATUS PORT + IN A,(C) ; GET STATUS + XOR $FF ; INVERT SO 0=READY + AND (IY+ESP_CFG_RDYMSK) ; IS ESP READY TO OUTPUT + RET Z ; RETURN IF READY + DJNZ ESP_WTRDY1 ; ELSE LOOP + ;CALL PC_PERIOD ; *DEBUG* + CALL ESP_SYNC ; SOMETHING WENT WRONG, ENSURE SYNC (Added DDW) + OR $FF ; SIGNAL TIMEOUT + RET ; AND RETURN +; +; +; +ESP_PRES .DB 0 ; MODULE PRESENCE BITS +; +ESP_STR_NOHW .TEXT "NOT PRESENT$" +ESP_STR_UPGRADE .TEXT "!!!UPGRADE REQUIRED!!!$" +; +;================================================================================================== +; ESP32 CONSOLE DRIVER +;================================================================================================== +; +; +ESPCON_ROWS .EQU 25 ; VGA DISPLAY ROWS +ESPCON_COLS .EQU 80 ; VGA DISPLAY COLS +; + .ECHO "ESPCON: ENABLED\n" +; +; +; +ESPCON_INIT: + LD A,(ESPCON_DEVCNT) ; GET ESPCON PHYSICAL DEVICE COUNT + LD (IY+ESP_CFG_DEV),A ; SAVE PHYSICAL UNIT NUMBER + INC A ; UPDATE COUNT + LD (ESPCON_DEVCNT),A ; SAVE COUNT +; +; ADD OURSELVES TO CIO DISPATCH TABLE +; + LD BC,ESPCON_FNTBL ; BC := FUNCTION TABLE ADDRESS + PUSH IY ; COPY CONFIG ENTRY PTR + POP DE ; ... TO DE + CALL CIO_ADDENT ; ADD ENTRY, A := UNIT ASSIGNED + LD (HCB + HCB_CRTDEV),A ; SET OURSELVES AS THE CRT DEVICE +; +; ANNOUNCE OURSLEVES +; + CALL NEWLINE ; FORMATTING + PRTS("ESPCON$") ; NAME + LD A,(IY+ESP_CFG_DEV) ; GET PHYSICAL UNIT NUMBER + CALL PRTDECB ; UNIT STILL IN A FROM ABOVE + CALL PC_COLON ; FORMATTING +; + ; DISPLAY CONSOLE DIMENSIONS + CALL PC_SPACE + LD A,ESPCON_COLS + CALL PRTDECB + LD A,'X' + CALL COUT + LD A,ESPCON_ROWS + CALL PRTDECB + CALL PRTSTRD + .TEXT " TEXT (ANSI)$" +; + XOR A ; SIGNAL SUCCESS + RET +; +; DRIVER FUNCTION TABLE +; +ESPCON_FNTBL: + .DW ESPCON_IN + .DW ESPCON_OUT + .DW ESPCON_IST + .DW ESPCON_OST + .DW ESPCON_INITDEV + .DW ESPCON_QUERY + .DW ESPCON_DEVICE +#IF (($ - ESPCON_FNTBL) != (CIO_FNCNT * 2)) + .ECHO "*** INVALID ESPCON FUNCTION TABLE ***\n" +#ENDIF +; +; +; +ESPCON_IN: + CALL ESPCON_IST + JR Z,ESPCON_IN + LD A,ESP_0_CMD_KIN ; KBD INPUT + CALL ESP_OUT ; SEND CMD OPCODE + CALL ESP_INWAIT ; GET KEY + LD E,A ; PUT IN E + XOR A ; SIGNAL SUCCES + RET ; AND DONE +; +; +; +ESPCON_IST: + CALL ESP_CLR ; CLEAR ANY PENDING DATA (Added DDW) + LD A,ESP_0_CMD_KST ; KBD BUF STATUS + CALL ESP_OUT ; SEND CMD OPCODE + CALL ESP_INWAIT ; GET BUF SIZE + OR A ; SET FLAGS + RET Z ; AND DONE + OR A + RET +; +; +; +ESPCON_OUT: + PUSH DE + LD A,ESP_0_CMD_COUT ; CHAR OUT OPCODE + CALL ESP_OUT + POP DE + LD A,E + CALL ESP_OUT ; SEND CHAR VALUE + XOR A ; SIGNAL SUCCESS + RET +; +; +; +ESPCON_OST: + XOR A ; ZERO ACCUM + INC A ; ACCUM := 1 TO SIGNAL 1 BUFFER POSITION + RET ; RETURN +; +; +; +ESPCON_INITDEV: + CALL ESP_CLR + CALL ESP_SYNC +; SYSCHKERR(ERR_NOTIMPL) Removed DDW + RET +; +; +; +ESPCON_QUERY: + LD DE,0 + LD HL,0 + XOR A + RET +; +; +; +ESPCON_DEVICE: + LD D,CIODEV_ESPCON ; D := DEVICE TYPE + LD E,(IY+ESP_CFG_DEV) ; E := DEVICE NUM + LD C,$BF ; C := DEVICE TYPE, 0xBF IS PROP TERM + LD H,0 ; H := 0, DRIVER HAS NO MODES + LD L,(IY+ESP_CFG_IO) ; L := BASE I/O ADDRESS + XOR A ; SIGNAL SUCCESS + RET +; +; ESPCON CONFIGURATION +; +ESPCON_CFG: +ESPCON0_CFG: + .DB 0 ; DEVICE NUMBER (UPDATED DURING INIT) + .DB ESP_0_IO ; ESP DATA PORT + .DB ESP_STAT ; ESP STATUS PORT + .DB ESP_0_RDY ; ESP READY BIT MASK + .DB ESP_0_BUSY ; ESP BUSY BIT MASK +; +; +; +ESPCON_DEVCNT .DB 0 ; ESPCON DEVICES COUNT +; +;================================================================================================== +; ESP32 SERIAL DRIVER +;================================================================================================== +; +ESPSER_LINECFG .EQU SER_115200_8N1 +; +ESPSER_CFG_LINE .EQU 5 +; +; +; +ESPSER_INIT: + LD A,(ESPSER_DEVCNT) ; GET ESPSER PHYSICAL DEVICE COUNT + LD (IY+ESP_CFG_DEV),A ; SAVE PHYSICAL UNIT NUMBER + INC A ; UPDATE COUNT + LD (ESPSER_DEVCNT),A ; SAVE COUNT +; +; ADD OURSELVES TO CIO DISPATCH TABLE +; + LD BC,ESPSER_FNTBL ; BC := FUNCTION TABLE ADDRESS + PUSH IY ; COPY CONFIG ENTRY PTR + POP DE ; ... TO DE + CALL CIO_ADDENT ; ADD ENTRY, A := UNIT ASSIGNED +; +; ANNOUNCE OURSLEVES +; + CALL NEWLINE ; FORMATTING + PRTS("ESPSER$") ; NAME + LD A,(IY+ESP_CFG_DEV) ; GET PHYSICAL UNIT NUMBER + CALL PRTDECB ; UNIT STILL IN A FROM ABOVE + CALL PC_COLON ; FORMATTING +; + PRTS(" MODE=$") ; FORMATTING + LD E,(IY+ESPSER_CFG_LINE+0) ; FIRST CONFIG BYTE TO E + LD D,(IY+ESPSER_CFG_LINE+1) ; SECOND CONFIG BYTE TO D + CALL PS_PRTSC0 ; PRINT CONFIG +; +; TODO: PRINT SERIAL CONFIG +; + XOR A ; SIGNAL SUCCESS + RET +; +; DRIVER FUNCTION TABLE +; +ESPSER_FNTBL: + .DW ESPSER_IN + .DW ESPSER_OUT + .DW ESPSER_IST + .DW ESPSER_OST + .DW ESPSER_INITDEV + .DW ESPSER_QUERY + .DW ESPSER_DEVICE +#IF (($ - ESPSER_FNTBL) != (CIO_FNCNT * 2)) + .ECHO "*** INVALID ESPSER FUNCTION TABLE ***\n" +#ENDIF +; +; +; +ESPSER_IN: + CALL ESPSER_IST + JR Z,ESPSER_IN + LD A,ESP_CMD_SIN ; SERIAL INPUT + CALL ESP_OUT ; SEND CMD OPCODE + CALL ESP_INWAIT ; GET KEY + LD E,A ; PUT IN E + XOR A ; SIGNAL SUCCES + RET ; AND DONE +; +; +; +ESPSER_IST: + CALL ESP_CLR ; CLEAR ANY PENDING DATA (Added DDW) + LD A,ESP_CMD_SST ; SERIAL STATUS + CALL ESP_OUT ; SEND CMD OPCODE + CALL ESP_INWAIT ; GET BUF SIZE + OR A ; SET FLAGS + RET Z ; AND DONE + OR A + RET +; +; +; +ESPSER_OUT: + PUSH DE + LD A,ESP_CMD_SOUT ; CHAR OUT OPCODE + CALL ESP_OUT + POP DE + LD A,E + CALL ESP_OUT ; SEND CHAR VALUE + XOR A ; SIGNAL SUCCESS + RET +; +; +; +ESPSER_OST: + XOR A ; ZERO ACCUM + INC A ; ACCUM := 1 TO SIGNAL 1 BUFFER POSITION + RET ; RETURN +; +; +; +ESPSER_INITDEV: + CALL ESP_CLR + CALL ESP_SYNC + PUSH DE ; SAVE INCOMING CONFIG WORD +; + ; XLATE NEW LINE MODE INTO C + LD A,E + AND %00111111 ; ISOLATE MODE BITS + LD C,0 ; 8N1 = 0 + CP SER_DATA8 | SER_PARNONE | SER_STOP1 + JR Z,ESPSER_INITDEV1 ; IF MATCH, DO IT + INC C ; 8E1 = 1 + CP SER_DATA8 | SER_PAREVEN | SER_STOP1 + JR Z,ESPSER_INITDEV1 ; IF MATCH, DO IT + INC C ; 8O1 = 2 + CP SER_DATA8 | SER_PARODD | SER_STOP1 + JR Z,ESPSER_INITDEV1 ; IF MATCH, DO IT + INC C ; 7N1 = 3 + CP SER_DATA7 | SER_PARNONE | SER_STOP1 + JR Z,ESPSER_INITDEV1 ; IF MATCH, DO IT + INC C ; 7E1 = 4 + CP SER_DATA7 | SER_PAREVEN | SER_STOP1 + JR Z,ESPSER_INITDEV1 ; IF MATCH, DO IT + INC C ; 7O1 = 5 + CP SER_DATA7 | SER_PARODD | SER_STOP1 + JR Z,ESPSER_INITDEV1 ; IF MATCH, DO IT + JR NZ,ESPSER_INITDEV_ERR ; ELSE FAIL +; +ESPSER_INITDEV1: + ; DECODE NEW BAUD RATE INTO DE:HL + LD H,0 + LD A,D + AND %00011111 + LD L,A + LD DE,75 + PUSH BC ; SAVE NEW LINE MODE + CALL DECODE ; DE:HL IS DECODED BAUD RATE + POP BC ; RESTORE NEW LINE MODE + JR NZ,ESPSER_INITDEV_ERR ; IF ERROR, FAIL +; + ; PROGRAM NEW LINE MODE + PUSH BC + LD A,ESP_CMD_SMODE + CALL ESP_OUT + POP BC + LD A,C + ;CALL PRTHEXBYTE + ;CALL LDELAY + CALL ESP_OUT +; + ; PROGRAM NEW BAUD RATE + LD A,ESP_CMD_SBAUD + CALL ESP_OUT + LD A,L + CALL ESP_OUT + LD A,H + CALL ESP_OUT + LD A,E + CALL ESP_OUT + LD A,D + CALL ESP_OUT +; + ; SAVE NEW LINE CONFIG WORD + POP DE ; RESTORE CONFIG WORD + LD (IY+ESPSER_CFG_LINE+0),E ; FIRST CONFIG BYTE + LD (IY+ESPSER_CFG_LINE+1),D ; SECOND CONFIG BYTE +; + XOR A + RET +; +ESPSER_INITDEV_ERR: + POP DE ; THROW AWAY CONFIG WORD ON STACK + OR $FF + RET +; +; +; +ESPSER_QUERY: + LD E,(IY+ESPSER_CFG_LINE+0) ; FIRST CONFIG BYTE TO E + LD D,(IY+ESPSER_CFG_LINE+1) ; SECOND CONFIG BYTE TO D + LD HL,0 + XOR A + RET +; +; +; +ESPSER_DEVICE: + LD D,CIODEV_ESPSER ; D := DEVICE TYPE + LD E,(IY+ESP_CFG_DEV) ; E := DEVICE NUM + LD C,$00 ; C := DEVICE TYPE, 0x00 IS RS-232 + LD H,0 ; H := 0, DRIVER HAS NO MODES + LD L,(IY+ESP_CFG_IO) ; L := BASE I/O ADDRESS + XOR A ; SIGNAL SUCCESS + RET +; +; ESPSER CONFIGURATION +; +ESPSER_CFG: +ESPSER0_CFG: + .DB 0 ; DEVICE NUMBER (UPDATED DURING INIT) + .DB ESP_0_IO ; ESP DATA PORT + .DB ESP_STAT ; ESP STATUS PORT + .DB ESP_0_RDY ; ESP READY BIT MASK + .DB ESP_0_BUSY ; ESP BUSY BIT MASK + .DW ESPSER_LINECFG ; LINE CONFIGURATION +; + .ECHO "ESPSER: DEVICE=0\n" +; +ESPSER1_CFG: + .DB 0 ; DEVICE NUMBER (UPDATED DURING INIT) + .DB ESP_1_IO ; ESP DATA PORT + .DB ESP_STAT ; ESP STATUS PORT + .DB ESP_1_RDY ; ESP READY BIT MASK + .DB ESP_1_BUSY ; ESP BUSY BIT MASK + .DW ESPSER_LINECFG ; LINE CONFIGURATION +; + .ECHO "ESPSER: DEVICE=1\n" +; +; +; +ESPSER_DEVCNT .DB 0 ; ESPSER DEVICES COUNT diff --git a/Source/HBIOS/fd.asm b/Source/HBIOS/fd.asm index 17de8693..fc52bf77 100644 --- a/Source/HBIOS/fd.asm +++ b/Source/HBIOS/fd.asm @@ -14,6 +14,7 @@ FDC_DATA .EQU $37 ; 8272 DATA PORT FDC_DIR .EQU $38 ; DATA INPUT REGISTER FDC_DOR .EQU $3A ; DIGITAL OUTPUT REGISTER (LATCH) FDC_DMA .EQU $3C ; PSEUDO DMA DATA PORT + #DEFINE FDMODE_STR "DIO" #ENDIF #IF (FDMODE = FDMODE_ZETA2) FDC_MSR .EQU $30 ; 8272 MAIN STATUS REGISTER @@ -21,6 +22,7 @@ FDC_DATA .EQU $31 ; 8272 DATA PORT FDC_DOR .EQU $38 ; DIGITAL OUTPUT REGISTER FDC_DCR .EQU $28 ; CONFIGURATION CONTROL REGISTER FDC_TC .EQU $38 ; TERMINAL COUNT (W/ DACK) + #DEFINE FDMODE_STR "ZETA2" #ENDIF #IF (FDMODE == FDMODE_DIDE) FDC_BID .EQU $20 ; IO RANGE 20H-3FH @@ -31,6 +33,7 @@ FDC_DCR .EQU $2D ; DCR FDC_DACK .EQU $3C ; DACK FDC_TC .EQU $3D ; TERMINAL COUNT (W/ DACK) FDC_DMA .EQU $3C ; NOT USED BY DIDE + #DEFINE FDMODE_STR "DIDE" #ENDIF #IF (FDMODE == FDMODE_N8) FDC_MSR .EQU $8C ; 8272 MAIN STATUS REGISTER @@ -40,11 +43,13 @@ FDC_DCR .EQU $91 ; DCR FDC_DACK .EQU $90 ; DACK FDC_TC .EQU $93 ; TERMINAL COUNT (W/ DACK) FDC_DMA .EQU $3C ; NOT USED BY N8 + #DEFINE FDMODE_STR "N8" #ENDIF #IF (FDMODE == FDMODE_RCSMC) FDC_MSR .EQU $50 ; 8272 MAIN STATUS REGISTER FDC_DATA .EQU $51 ; 8272 DATA PORT FDC_DOR .EQU $58 ; DIGITAL OUTPUT REGISTER (LATCH) + #DEFINE FDMODE_STR "RCSMC" #ENDIF #IF (FDMODE == FDMODE_RCWDC) FDC_MSR .EQU $50 ; 8272 MAIN STATUS REGISTER @@ -52,6 +57,7 @@ FDC_DATA .EQU $51 ; 8272 DATA PORT FDC_DOR .EQU $58 ; DIGITAL OUTPUT REGISTER FDC_DCR .EQU $48 ; CONFIGURATION CONTROL REGISTER FDC_TC .EQU $58 ; TERMINAL COUNT (W/ DACK) + #DEFINE FDMODE_STR "RCWDC" #ENDIF #IF (FDMODE == FDMODE_DYNO) FDC_BASE .EQU $84 @@ -60,6 +66,7 @@ FDC_DATA .EQU FDC_BASE + $01 ; 8272 DATA PORT FDC_DOR .EQU FDC_BASE + $02 ; DIGITAL OUTPUT REGISTER FDC_DCR .EQU FDC_BASE + $03 ; CONFIGURATION CONTROL REGISTER FDC_TC .EQU FDC_BASE + $02 ; TERMINAL COUNT (W/ DACK) + #DEFINE FDMODE_STR "DYNO" #ENDIF #IF (FDMODE == FDMODE_EPFDC) FDC_MSR .EQU $48 ; 8272 MAIN STATUS REGISTER @@ -67,6 +74,7 @@ FDC_DATA .EQU $49 ; 8272 DATA PORT FDC_DOR .EQU $4A ; DIGITAL OUTPUT REGISTER FDC_DCR .EQU $4B ; CONFIGURATION CONTROL REGISTER FDC_TC .EQU $4C ; TERMINAL COUNT (W/ DACK) + #DEFINE FDMODE_STR "EPFDC" #ENDIF #IF (FDMODE == FDMODE_MBC) FDC_MSR .EQU $30 ; 8272 MAIN STATUS REGISTER @@ -74,7 +82,17 @@ FDC_DATA .EQU $31 ; 8272 DATA PORT FDC_DOR .EQU $36 ; DIGITAL OUTPUT REGISTER FDC_DCR .EQU $35 ; CONFIGURATION CONTROL REGISTER FDC_TC .EQU $37 ; TERMINAL COUNT (W/ DACK) + #DEFINE FDMODE_STR "MBC" #ENDIF +#IF (FDMODE == FDMODE_DUO) +FDC_MSR .EQU $80 ; 8272 MAIN STATUS REGISTER +FDC_DATA .EQU $81 ; 8272 DATA PORT +FDC_DOR .EQU $86 ; DIGITAL OUTPUT REGISTER +FDC_DCR .EQU $85 ; CONFIGURATION CONTROL REGISTER +FDC_TC .EQU $87 ; TERMINAL COUNT (W/ DACK) + #DEFINE FDMODE_STR "DUO" +#ENDIF +; ; ; DISK OPERATIONS ; @@ -109,7 +127,7 @@ FRC_TOSEEKWT .EQU -15H ; EB ; FD DEVICE CONFIGURATION ; FD_DEVCNT .EQU FDCNT ; 2 DEVICES SUPPORTED -FD_CFGSIZ .EQU 8 ; SIZE OF CFG TBL ENTRIES +FD_CFGSIZ .EQU 9 ; SIZE OF CFG TBL ENTRIES ; ; PER DEVICE DATA OFFSETS ; ; OFFSET OF... @@ -121,25 +139,81 @@ FD_HST .EQU 4 ; HOSTS SEEK POSITION FD_HSTTRK .EQU FD_HST + 0 ; HOST TRACK (WORD) FD_HSTSEC .EQU FD_HST + 2 ; HOST SECTOR (BYTE) FD_HSTHD .EQU FD_HST + 3 ; HOST HEAD (BYTE) +FD_TYPE .EQU 8 ; FLOPPY DSIK TYPE (BYTE) ; FD_CFGTBL: ; DEVICE 0, PRIMARY MASTER .DB 0 ; DEVICE NUMBER .DB 0 ; DEVICE STATUS - .DB FDMEDIA ; MEDIA TYPE + .DB $FF ; CURRENT MEDIA TYPE (INIT TO NONE) .DB $FF ; CURRENT TRACK .DW 0 ; HOST TRACK .DB 0 ; HOST SECTOR .DB 0 ; HOST HEAD + .DB FD0TYPE ; DRIVE TYPE +; + .ECHO "FD: MODE=" + .ECHO FDMODE_STR + .ECHO ", IO=" + .ECHO FDC_MSR + .ECHO ", DRIVE 0" + .ECHO ", TYPE=" + #IF (FD0TYPE == FDT_NONE + .ECHO "NONE" + #ENDIF + #IF (FD0TYPE == FDT_3DD + .ECHO "3.5\" DD" + #ENDIF + #IF (FD0TYPE == FDT_3HD + .ECHO "3.5\" HD" + #ENDIF + #IF (FD0TYPE == FDT_5DD + .ECHO "5.25\" DD" + #ENDIF + #IF (FD0TYPE == FDT_5HD + .ECHO "5.25\" HD" + #ENDIF + #IF (FD0TYPE == FDT_8 + .ECHO "8\" DD" + #ENDIF + .ECHO "\n" +; #IF (FD_DEVCNT >= 2) ; DEVICE 1, PRIMARY SLAVE .DB 1 ; DRIVER DEVICE NUMBER .DB 0 ; DEVICE STATUS - .DB FDMEDIA ; MEDIA TYPE + .DB $FF ; CURRENT MEDIA TYPE (INIT TO NONE) .DB $FF ; CURRENT TRACK .DW 0 ; HOST TRACK .DB 0 ; HOST SECTOR .DB 0 ; HOST HEAD + .DB FD1TYPE ; DRIVE TYPE +; + .ECHO "FD: MODE=" + .ECHO FDMODE_STR + .ECHO ", IO=" + .ECHO FDC_MSR + .ECHO ", DRIVE 1" + .ECHO ", TYPE=" + #IF (FD1TYPE == FDT_NONE + .ECHO "NONE" + #ENDIF + #IF (FD1TYPE == FDT_3DD + .ECHO "3.5\" DD" + #ENDIF + #IF (FD1TYPE == FDT_3HD + .ECHO "3.5\" HD" + #ENDIF + #IF (FD1TYPE == FDT_5DD + .ECHO "5.25\" DD" + #ENDIF + #IF (FD1TYPE == FDT_5HD + .ECHO "5.25\" HD" + #ENDIF + #IF (FD1TYPE == FDT_8 + .ECHO "8\" DD" + #ENDIF + .ECHO "\n" #ENDIF ; #IF ($ - FD_CFGTBL) != (FD_DEVCNT * FD_CFGSIZ) @@ -199,6 +273,42 @@ FSST_ENTSIZ .EQU $ - FSST FSST_COUNT .EQU (($ - FSST) / FSST_ENTSIZ) ; # ENTRIES IN TABLE #ENDIF ; +; FDC DRIVE TYPE MEDIA OPTIONS +; +; THIS TABLE LISTS THE TYPES OF MEDIA THAT SHOULD BE ATTEMPTED +; FOR EACH POSSIBLE DRIVE TYPE. THE ENTRIES MATCH THE ORDER OF THE +; FDT_ VALUES DEFINED IN STD.ASM +; +FD_MEDIAMAP: + .DW FDMM_NONE ; NO DRIVE TYPE + .DW FDMM_3DD + .DW FDMM_3HD + .DW FDMM_5DD + .DW FDMM_5HD + .DW FDMM_8 +; +FDMM_NONE .DB $FF +FDMM_3DD .DB FDM720, $FF +FDMM_3HD .DB FDM144, FDM720, $FF +FDMM_5DD .DB FDM360, $FF +FDMM_5HD .DB FDM120, FDM360, $FF +FDMM_8 .DB FDM111, $FF +; +; FDC DRIVE TYPE ATTRIBUTES +; +; LOOKUP TABLE TO MAP THE DEVICE ATTRIBUTES BYTE RETURNED +; BY THE FD_DEVICE FUNCTION BASED ON THE DRIVE TYPE. +; THE ENTRIES MATCH THE ORDER OF THE +; FDT_ VALUES DEFINED IN STD.ASM +; +FD_DEVATTR: + .DB %11000000 ; DRIVE TYPE NONE + .DB %11010101 ; DRIVE TYPE 3.5 DD + .DB %11010110 ; DRIVE TYPE 3.5 HD + .DB %11001101 ; DRIVE TYPE 5.25 DD + .DB %11001110 ; DRIVE TYPE 5.25 HD + .DB %11000101 ; DRIVE TYPE 8 +; ; FDC COMMANDS ; CFD_READ .EQU 00000110B ; CMD,HDS/DS,C,H,R,N,EOT,GPL,DTL --> ST0,ST1,ST2,C,H,R,N @@ -413,7 +523,7 @@ DOR_INIT .EQU 11100000B ; INITIAL DEFAULT LATCH VALUE ; ; *** DIDE/N8/ZETA V2 *** ; -#IF ((FDMODE == FDMODE_DIDE) | (FDMODE == FDMODE_N8) | (FDMODE == FDMODE_ZETA2) | (FDMODE == FDMODE_RCWDC) | (FDMODE == FDMODE_DYNO) | (FDMODE == FDMODE_EPFDC) | (FDMODE == FDMODE_MBC)) +#IF ((FDMODE == FDMODE_DIDE) | (FDMODE == FDMODE_N8) | (FDMODE == FDMODE_ZETA2) | (FDMODE == FDMODE_RCWDC) | (FDMODE == FDMODE_DYNO) | (FDMODE == FDMODE_EPFDC) | (FDMODE == FDMODE_MBC) | (FDMODE == FDMODE_DUO)) DOR_INIT .EQU 00001100B ; SOFT RESET INACTIVE, DMA ENABLED DOR_BR250 .EQU DOR_INIT DOR_BR500 .EQU DOR_INIT @@ -498,21 +608,11 @@ FD_DEFMED: FD_DEVICE: LD D,DIODEV_FD ; D := DEVICE TYPE LD E,(IY+FD_DEV) ; E := PHYSICAL DEVICE NUMBER -#IF (FDMEDIA == FDM720) - LD C,%11010100 ; 3.5" DS/DD -#ENDIF -#IF (FDMEDIA == FDM144) - LD C,%11011000 ; 3.5" DS/HD -#ENDIF -#IF (FDMEDIA == FDM360) - LD C,%10110100 ; 5.25" DS/DD -#ENDIF -#IF (FDMEDIA == FDM120) - LD C,%10111000 ; 5.25" DS/HD -#ENDIF -#IF (FDMEDIA == FDM111) - LD C,%10010100 ; 8" DS/DD -#ENDIF + + LD A,(IY+FD_TYPE) ; DRIVE TYPE + LD HL,FD_DEVATTR ; DEVICE ATTR TABLE + CALL ADDHLA ; POINT TO ENTRY + LD C,(HL) ; GET IT LD H,FDMODE ; H := MODE LD L,FDC_MSR ; L := BASE I/O ADDRESS XOR A ; SIGNAL SUCCESS @@ -527,9 +627,7 @@ FD_MEDIA: #IF (FDMAUTO) ; SETUP TO READ TRK 0, HD 0, SEC 0 - ;LD A,C ; C STILL HAS REQUESTED DRIVE LD A,(IY+FD_DEV) ; GET DRIVE UNIT - ;AND 0FH LD (FCD_DS),A LD A,0 LD (FCD_C),A @@ -538,53 +636,77 @@ FD_MEDIA: LD (FCD_R),A LD A,DOP_READID LD (FCD_DOP),A +#ENDIF + -#IF (FDTRACE < 3) + LD A,(IY+FD_TYPE) ; GET DRIVE TYPE VALUE + ;CALL PRTHEXBYTE ; *DEBUG* + LD HL,FD_MEDIAMAP ; POINT TO MEDIA MAP TABLE + ADD A,A ; TABLE IS WORD SIZED + CALL ADDHLA ; LOOKUP ENTRY + LD A,(HL) ; DEREFERENCE + INC HL + LD H,(HL) + LD L,A + +#IF (FDMAUTO) + #IF (FDTRACE < 3) ; SUPPRESS TRACING FOR MEDIA TESTS LD A,0 LD (FCD_TRACE),A -#ENDIF - - LD B,5 + #ENDIF + LD B,5 ; 5 ATTEMPTS FD_MEDIARETRY: - ; TRY PRIMARY MEDIA CHOICE FIRST - LD A,FDMEDIA - CALL FD_TESTMEDIA - JR Z,FD_MEDIA3 ; IF SUCCESS, WE ARE DONE - - ; TRY ALTERNATE MEDIA CHOICE - LD A,FDMEDIAALT - CALL FD_TESTMEDIA - JR Z,FD_MEDIA3 ; IF SUCCESS, WE ARE DONE - - DJNZ FD_MEDIARETRY + PUSH HL ; SAVE MEDIA MAP PTR + CALL FD_MEDIALOOP ; TRY IT + POP HL ; RECOVER MEDIA MAP PTR + JR Z,FD_MEDIA3 ; CONTINUE ON SUCCESS + DJNZ FD_MEDIARETRY ; LOOP TILL DONE +FD_MEDIARETRY1: ; NO JOY, RETURN WITH E=0 (NO MEDIA) - ;LD HL,(FDDS_MEDIAADR) - ;LD (HL),0 ; SET TO NO MEDIA - LD (IY+FD_MEDTYP),0 ; SET DRIVE = NO MEDIA - LD E,0 + LD (IY+FD_MEDTYP),$FF ; SET MEDIA TYPE TO UNDEFINED + LD E,0 ; NO MEDIA FLAG LD A,ERR_NOMEDIA ; SIGNAL ERROR OR A ; SET FLAGS RET +FD_MEDIALOOP: + LD A,(HL) ; LOAD NEXT MEDIA TYPE TO TRY + CP $FF ; END OF MEDIA TYPES TO TRY? + JR Z,FD_MEDIALOOP1 ; NO MORE TO TRY, LOOP EXIT + CALL FD_TESTMEDIA ; TRY IT + RET Z ; RETURN ON SUCCESS + INC HL ; NEXT MEDIA TYPE TO TRY + JR FD_MEDIALOOP ; LOOP +FD_MEDIALOOP1: + OR $FF ; SIGNAL FAILURE + RET ; RETURN + FD_TESTMEDIA: - ;LD HL,(FDDS_MEDIAADR) - ;LD (HL),A + ;CALL PRTHEXBYTE ; *DEBUG* LD (IY+FD_MEDTYP),A + PUSH HL PUSH BC CALL FD_START POP BC + POP HL + ;CALL PRTHEXBYTE ; *DEBUG* RET FD_MEDIA3: -#IF (FDTRACE < 3) + #IF (FDTRACE < 3) ; RESTORE TRACING FOR MEDIA TESTS LD A,FDTRACE LD (FCD_TRACE),A -#ENDIF + #ENDIF +#ELSE + + LD A,(HL) + LD (IY+FD_MEDTYP),A + #ENDIF FD_MEDIA4: @@ -698,6 +820,10 @@ FD_INIT: #IF (FDMODE == FDMODE_MBC) PRTS("MBC$") #ENDIF +; +#IF (FDMODE == FDMODE_DUO) + PRTS("DUO$") +#ENDIF ; PRTS(" IO=0x$") LD A,FDC_MSR @@ -760,25 +886,33 @@ FD_DETECT: IN A,(FDC_MSR) ; READ MSR ;CALL PC_SPACE ; *DEBUG* ;CALL PRTHEXBYTE ; *DEBUG* - CP $80 - JR Z,FD_DETECT1 ; $80 IS OK - CP $D0 - JR Z,FD_DETECT1 ; $D0 IS OK - RET ; NOPE, ABORT WITH ZF=NZ -; + + CP $D0 ; SPECIAL CASE: DATA PENDING? + JR NZ,FD_DETECT1 ; NOPE, MOVE ALONG + IN A,(FDC_DATA) ; SWALLOW THE PENDING DATA + CALL DLY32 ; SETTLE + IN A,(FDC_MSR) ; ... AND REREAD THE STATUS + ;CALL PC_SPACE ; *DEBUG* + ;CALL PRTHEXBYTE ; *DEBUG* + FD_DETECT1: - CALL DLY32 ; WAIT A BIT FOR FDC - IN A,(FDC_MSR) ; READ MSR AGAIN + CP $80 ; WE EXPECT $80 + RET Z ; IF SO, ALL DONE + + ; WE HAVE SEEN AN FDC THAT NEEDS A SECOND READ TO GET + ; DESIRED VALUE, SO TRY ONE MORE TIME + CALL DLY32 ; WAIT A BIT + IN A,(FDC_MSR) ; ... AND REREAD THE STATUS ;CALL PC_SPACE ; *DEBUG* ;CALL PRTHEXBYTE ; *DEBUG* - CP $80 - RET ; $80 OK, ELSE NOT PRESENT + CP $80 ; CHECK FOR CORRECT VALUE + RET ; RETURN WITH ZF ACCORDING TO RESULT ; ; UNIT INITIALIZATION ; FD_INITUNIT: LD (IY+FD_STAT),0 ; CLEAR STATUS - LD (IY+FD_MEDTYP),FDMEDIA ; SET DEFAULT MEDIA TYPE + LD (IY+FD_MEDTYP),$FF ; SET UNKNOWN MEDIA TYPE LD (IY+FD_CURTRK),$FE ; SPECIAL VALUE FOR CURTRK RET ; @@ -1079,9 +1213,11 @@ FD_RETRY1: FD_START: ; #IF (DSKYENABLE) + #IF (DSKYDSKACT) LD A,4 CALL LDHLIYA CALL HB_DSKACTCHS ; SHOW ACTIVITY + #ENDIF #ENDIF ; LD A,(FCD_FDCRDY) @@ -1151,9 +1287,6 @@ FD_RUN1: RET FD_RUNCHK: -;;#IF (DSKYENABLE) -;; CALL FD_DSKY -;;#ENDIF FD_RUNEXIT: LD A,(FST_RC) @@ -1170,23 +1303,6 @@ FD_RUNERR: JP FD_RETRC -;;#IF (DSKYENABLE) -;;FD_DSKY: -;; LD HL,DSKY_HEXBUF -;; LD A,(FCD_C) -;; LD (HL),A -;; INC HL -;; LD A,(FCD_R) -;; LD (HL),A -;; INC HL -;; LD A,(FRB_ST0) -;; LD (HL),A -;; INC HL -;; LD A,(FRB_ST1) -;; LD (HL),A -;; CALL DSKY_HEXOUT -;; RET -;;#ENDIF ; ;=============================================================================== ; FLOPPY DISK CONTROL SERVICES (PHYSICAL DEVICE CONTROL FOR FDC HARDWARE) @@ -1285,7 +1401,8 @@ FC_SETUPIO: LD (DE),A INC DE - LD A,(FCD_EOT) + ;LD A,(FCD_EOT) + LD A,(FCD_R) ; READ ONLY ONE SECTOR LD (DE),A INC DE @@ -1350,7 +1467,7 @@ FC_SETDOR: ; ; SET FST_DCR ; -#IF ((FDMODE == FDMODE_DIDE) | (FDMODE == FDMODE_N8) | (FDMODE == FDMODE_ZETA2) | (FDMODE == FDMODE_RCWDC) | (FDMODE == FDMODE_DYNO) | (FDMODE == FDMODE_EPFDC) | (FDMODE == FDMODE_MBC)) +#IF ((FDMODE == FDMODE_DIDE) | (FDMODE == FDMODE_N8) | (FDMODE == FDMODE_ZETA2) | (FDMODE == FDMODE_RCWDC) | (FDMODE == FDMODE_DYNO) | (FDMODE == FDMODE_EPFDC) | (FDMODE == FDMODE_MBC) | (FDMODE == FDMODE_DUO)) ; FC_SETDCR LD (FST_DCR),A @@ -1382,7 +1499,7 @@ FC_RESETFDC: #IF ((FDMODE == FDMODE_ZETA) | (FDMODE == FDMODE_DIO3) | (FDMODE == FDMODE_RCSMC)) RES 7,A #ENDIF -#IF ((FDMODE == FDMODE_DIDE) | (FDMODE == FDMODE_N8) | (FDMODE == FDMODE_ZETA2) | (FDMODE == FDMODE_RCWDC) | (FDMODE == FDMODE_DYNO) | (FDMODE == FDMODE_EPFDC) | (FDMODE == FDMODE_MBC)) +#IF ((FDMODE == FDMODE_DIDE) | (FDMODE == FDMODE_N8) | (FDMODE == FDMODE_ZETA2) | (FDMODE == FDMODE_RCWDC) | (FDMODE == FDMODE_DYNO) | (FDMODE == FDMODE_EPFDC) | (FDMODE == FDMODE_MBC) | (FDMODE == FDMODE_DUO)) LD A,0 #ENDIF CALL FC_SETDOR @@ -1397,15 +1514,17 @@ FC_RESETFDC: ; PULSE TERMCT TO TERMINATE ANY ACTIVE EXECUTION PHASE ; FC_PULSETC: -#IF ((FDMODE == FDMODE_DIDE) | (FDMODE == FDMODE_N8) | (FDMODE == FDMODE_ZETA2) | (FDMODE == FDMODE_RCWDC) | (FDMODE == FDMODE_DYNO) | (FDMODE == FDMODE_EPFDC) | (FDMODE == FDMODE_MBC)) - IN A,(FDC_TC) -#ELSE - LD A,(FST_DOR) - SET 0,A - OUT (FDC_DOR),A - RES 0,A - OUT (FDC_DOR),A -#ENDIF +; PULSING TC NO LONGER REQUIRED BECAUSE WE ONLY READ A SINGLE SECTOR +; +;#IF ((FDMODE == FDMODE_DIDE) | (FDMODE == FDMODE_N8) | (FDMODE == FDMODE_ZETA2) | (FDMODE == FDMODE_RCWDC) | (FDMODE == FDMODE_DYNO) | (FDMODE == FDMODE_EPFDC) | (FDMODE == FDMODE_MBC) | (FDMODE == FDMODE_DUO)) +; IN A,(FDC_TC) +;#ELSE +; LD A,(FST_DOR) +; SET 0,A +; OUT (FDC_DOR),A +; RES 0,A +; OUT (FDC_DOR),A +;#ENDIF RET ; ; SET FST_DOR FOR MOTOR CONTROL ON @@ -1454,7 +1573,7 @@ FC_MOTORON1: CP C ; COMPARE TO NEW MOTOR BITS RET Z ; SKIP DELAY, MOTOR WAS ALREADY ON #ENDIF -#IF ((FDMODE == FDMODE_DIDE) | (FDMODE == FDMODE_N8) | (FDMODE == FDMODE_ZETA2) | (FDMODE == FDMODE_RCWDC) | (FDMODE == FDMODE_DYNO) | (FDMODE == FDMODE_EPFDC) | (FDMODE == FDMODE_MBC)) +#IF ((FDMODE == FDMODE_DIDE) | (FDMODE == FDMODE_N8) | (FDMODE == FDMODE_ZETA2) | (FDMODE == FDMODE_RCWDC) | (FDMODE == FDMODE_DYNO) | (FDMODE == FDMODE_EPFDC) | (FDMODE == FDMODE_MBC) | (FDMODE == FDMODE_DUO)) ; SETUP DCR FOR DIDE HARDWARE LD A,(FCD_DCR) ; GET NEW DCR VALUE CALL FC_SETDCR ; AND IMPLEMENT IT @@ -1694,7 +1813,7 @@ FXR_TO: ; TIMEOUT ; FXR_ABORT: ; EXECUTION ABORTED HB_EI ; INTERRUPTS OK AGAIN - JR FOP_RES ; GET RSEULTS, NO NEED TO PULSE TC + JR FOP_RES ; GET RESULTS, NO NEED TO PULSE TC ; FXR_END: ; EXECUTION COMPLETED NORMALLY CALL FC_PULSETC ; PULSE TC TO END EXECUTION @@ -1828,7 +1947,9 @@ FOP_EVALST1: LD C,FRC_ENDCYL BIT 7,A - JR NZ,FOP_SETFST + ; THI IS NORMAL BECAUSE WE NOW READ ONLY A SINGLE SECTOR + ;JR NZ,FOP_SETFST + JR NZ,FOP_EXIT LD C,FRC_DATAERR BIT 5,A diff --git a/Source/HBIOS/gdc.asm b/Source/HBIOS/gdc.asm index 8ddd7603..79b72c10 100644 --- a/Source/HBIOS/gdc.asm +++ b/Source/HBIOS/gdc.asm @@ -36,16 +36,33 @@ GDC_COLS .EQU 80 ; *** TODO: CGA AND EGA ARE PLACEHOLDERS. THESE EQUATES SHOULD ; BE USED TO ALLOW FOR MULTIPLE MONITOR TIMINGS AND/OR FONT ; DEFINITIONS. +; + .ECHO "GDC: MODE=" +; +#IF (GDCMODE == GDCMODE_ECB) + .ECHO "ECB" +#ENDIF +#IF (GDCMODE == GDCMODE_RPH) + .ECHO "RPH" +#ENDIF +; + .ECHO ", DISPLAY=" ; #IF (GDCMON == GDCMON_CGA) #DEFINE USEFONTCGA #DEFINE GDC_FONT FONTCGA + .ECHO "CGA" #ENDIF ; #IF (GDCMON == GDCMON_EGA) #DEFINE USEFONT8X16 #DEFINE GDC_FONT FONT8X16 + .ECHO "EGA" #ENDIF +; + .ECHO ", IO=" + .ECHO GDC_BASE + .ECHO "\n" ; TERMENABLE .SET TRUE ; INCLUDE TERMINAL PSEUDODEVICE DRIVER ; @@ -70,7 +87,7 @@ GDC_INIT: #ENDIF #IF (GDCMON == GDCMON_EGA) PRTS(" EGA$") -#ENDIF +#ENDIF ; PRTS(" IO=0x$") LD A,GDC_BASE @@ -172,8 +189,13 @@ GDC_VDASAT: ; SET ATTRIBUTES RET GDC_VDASCO: ; SET COLOR + ; WE HANDLE ONLY PER-CHARACTER COLORS (D=0) + LD A,D ; GET CHAR/SCREEN SCOPE + OR A ; CHARACTER? + JR NZ,GDC_VDASCO_Z ; IF NOT, JUST RETURN LD A,E ; GET THE INCOMING COLOR LD (GDC_COLOR),A ; AND SAVE FOR LATER +GDC_VDASCO_Z: XOR A ; SIGNAL SUCCESS RET @@ -325,5 +347,6 @@ GDC_POS .DW 0 ; CURRENT DISPLAY POSITION ;================================================================================================== ; GDC_IDAT: + .DB KBDMODE_PS2 ; PS/2 8242 KEYBOARD CONTROLLER .DB GDC_KBDST .DB GDC_KBDDATA diff --git a/Source/HBIOS/h8p.asm b/Source/HBIOS/h8p.asm new file mode 100644 index 00000000..8ccb96ad --- /dev/null +++ b/Source/HBIOS/h8p.asm @@ -0,0 +1,162 @@ +; +;================================================================================================== +; HEATH H8 FRONT PANEL (DISPLAY AND KEYBOARD) ROUTINES +;================================================================================================== +; +; LED SEGMENTS (BIT VALUES) +; +; +--02--+ +; 40 04 +; +--01--+ +; 20 08 +; +--10--+ 80 +; +;__H8P_PREINIT_______________________________________________________________________________________ +; +; CONFIGURE AND RESET PANEL +;____________________________________________________________________________________________________ +; +; HARDWARE RESET PRIOR TO ROMWBW CONSOLE INITIALIZATION +; +H8P_PREINIT: + LD A,(DSKY_DISPACT) ; DSKY DISPATCHER ALREADY SET? + OR A ; SET FLAGS + RET NZ ; IF ALREADY ACTIVE, ABORT +; + ; REGISTER DRIVER WITH HBIOS + LD BC,H8P_DISPATCH + CALL DSKY_SETDISP +; + RET +; +;__H8P_INIT__________________________________________________________________________________________ +; +; DISPLAY DSKY INFO ON ROMWBW CONSOLE +;____________________________________________________________________________________________________ +; +H8P_INIT: + CALL NEWLINE ; FORMATTING + PRTS("H8P:$") ; DRIVER TAG +; + RET ; DONE +; +; DSKY DEVICE FUNCTION DISPATCH ENTRY +; A: RESULT (OUT), 0=OK, Z=OK, NZ=ERR +; B: FUNCTION (IN) +; +H8P_DISPATCH: + LD A,B ; GET REQUESTED FUNCTION + AND $0F ; ISOLATE SUB-FUNCTION + JP Z,H8P_RESET ; RESET DSKY HARDWARE + DEC A + JP Z,H8P_STAT ; GET KEYPAD STATUS + DEC A + JP Z,H8P_GETKEY ; READ A KEY FROM THE KEYPAD + DEC A + JP Z,H8P_SHOWHEX ; DISPLAY A 32-BIT BINARY VALUE IN HEX + DEC A + JP Z,H8P_SHOWSEG ; DISPLAY SEGMENTS + DEC A + JP Z,H8P_KEYLEDS ; SET KEYPAD LEDS + DEC A + JP Z,H8P_STATLED ; SET STATUS LED + DEC A + JP Z,H8P_BEEP ; BEEP DSKY SPEAKER + DEC A + JP Z,H8P_DEVICE ; DEVICE INFO + SYSCHKERR(ERR_NOFUNC) + RET +; +; RESET DSKY -- CLEAR DISPLAY AND KEYPAD FIFO +; +H8P_RESET: + XOR A ; SIGNAL SUCCESS + RET +; +; CHECK FOR KEY PRESS, SAVE RAW VALUE, RETURN STATUS +; +H8P_STAT: + XOR A ; ZERO KEYS PENDING (FOR NOW) + RET +; +; WAIT FOR A DSKY KEYPRESS AND RETURN +; +H8P_GETKEY: + ; PUT KEY VALUE IN REGISTER E + XOR A ; SIGNAL SUCCESS + RET +; +; DISPLAY HEX VALUE FROM DE:HL +; +H8P_SHOWHEX: + LD BC,DSKY_HEXBUF ; POINT TO HEX BUFFER + CALL ST32 ; STORE 32-BIT BINARY THERE + LD HL,DSKY_HEXBUF ; FROM: BINARY VALUE (HL) + LD DE,DSKY_BUF ; TO: SEGMENT BUFFER (DE) + CALL DSKY_BIN2SEG ; CONVERT + LD HL,DSKY_BUF ; POINT TO SEGMENT BUFFER + ; AND FALL THRU TO DISPLAY IT +; +; DISPLAY BYTE VALUES POINTED TO BY DE. THE INCOMING BYTES ARE IN +; THE STANDARD ROMWBW SEGMENT ENCODING AND MUST BE TRANSLATED TO THE +; HEATH ENCODING (SEE ICM.ASM FOR EXAMPLE): +; +; +; From: To: +; +--01--+ +--02--+ +; 20 02 40 04 +; +--40--+ +--01--+ +; 10 04 20 08 +; +--08--+ 80 +--10--+ 80 +; +H8P_SHOWSEG: + XOR A ; SIGNAL SUCCESS + RET +; +; UPDATE KEY LEDS (H8 HAS NONE) +; +H8P_KEYLEDS: + XOR A ; SIGNAL SUCCESS + RET +; +; SET STATUS LEDS BASED ON BITS IN E +; +H8P_STATLED: + XOR A ; SIGNAL SUCCESS + RET +; +; BEEP THE SPEAKER ON THE H8P +; +H8P_BEEP: + POP BC + XOR A ; SIGNAL SUCCESS + RET +; +; DEVICE INFORMATION +; +H8P_DEVICE: + LD D,DSKYDEV_H8P ; D := DEVICE TYPE + LD E,0 ; E := PHYSICAL DEVICE NUMBER + LD H,0 ; H := MODE + LD L,0 ; L := BASE I/O ADDRESS + XOR A ; SIGNAL SUCCESS + RET +; +;_KEYMAP_TABLE_____________________________________________________________________________________________________________ +; +H8P_KEYMAP: ; *** NEEDS TO BE UPDATED *** + ; POS $00 $01 $02 $03 $04 $05 $06 $07 + ; KEY [0] [1] [2] [3] [4] [5] [6] [7] + .DB $0D, $04, $0C, $14, $03, $0B, $13, $02 +; + ; POS $08 $09 $0A $0B $0C $0D $0E $0F + ; KEY [8] [9] [A] [B] [C] [D] [E] [F] + .DB $0A, $12, $01, $09, $11, $00, $08, $10 +; + ; POS $10 $11 $12 $13 $14 $15 $16 $17 + ; KEY [FW] [BK] [CL] [EN] [DE] [EX] [GO] [BO] + .DB $05, $15, $1D, $1C, $1B, $1A, $19, $18 + + ; POS $18 $19 $1A $1B + ; KEY [F4] [F3] [F2] [F1] + .DB $23, $22, $21, $20 diff --git a/Source/HBIOS/hbios.asm b/Source/HBIOS/hbios.asm index 536eda5f..35d235dd 100644 --- a/Source/HBIOS/hbios.asm +++ b/Source/HBIOS/hbios.asm @@ -22,7 +22,7 @@ ; SYSTEM INITIALIZATION, THE IMAGE OF THE RUNNING ROM BANK IS COPIED TO A RAM BANK ; CREATING A SHADOW COPY IN RAM. EXECUTION IS THAN TRANSFERRED TO THE RAM SHADOW COPY. ; THIS IS ESSENTIAL BECAUSE THE HBIOS CODE DOES NOT SUPPORT RUNNING IN READ ONLY MEMORY -; (EXCEPT FOR THE INITIAL LAUNCHING CODE). IN THIS MODE, THE HBIOS INITIALIZATION WILL +; (EXCEPT FOR THE INITIAL LAUNCHING CODE). IN THIS MODE, THE HBI OS INITIALIZATION WILL ; ALSO COPY THE OS IMAGES BANK IN ROM TO THE USER RAM BANK AND LAUNCH IT AFTER HBIOS ; IS INSTALLED. ; @@ -63,7 +63,6 @@ ; - decode.asm ; - encode.asm ; - [xio|mio].asm -; - [dsky.asm|dskyng.asm] ; - unlzsa2s.asm ; ; INCLUDE GENERIC STUFF @@ -72,6 +71,8 @@ ; #DEFINE HBIOS ; +SUPCTS .EQU FALSE ; SUPPRESS CTS DURING HBIOS BOOT +; ; MAKE SURE EXACTLY ONE OF ROMBOOT, APPBOOT, IMGBOOT IS DEFINED. ; MODCNT .EQU 0 @@ -89,60 +90,51 @@ MODCNT .SET MODCNT + 1 !!! ; FORCE AN ASSEMBLY ERROR #ENDIF ; -; SOME HARDWARE REQUIRES A SPECIFIC ROMSIZE (NOTABLY ZZRCC) OR THE -; RESULTING BUILD IMAGES WILL BE CORRUPT. ROMSIZE_CHK IS SPECIFIED -; IN THE CONFIG FILE AND IS VERIFIED AGAINST THE ROMSIZE BEING USED -; BY THE BUILD. A ROMSIZE_CHK VALUE OF 0 INDICATES THE VERIFICATION -; IS DISABLED (WHICH IT USUALLY IS). -; -#IF (ROMSIZE_CHK != 0) & (ROMSIZE != ROMSIZE_CHK) - .ECHO "*** ERROR: ROMSIZE VALUE VERIFICATION FAILURE.\n" - .ECHO "THIS CONFIGURATION REQUIRES A ROMSIZE OF " \ .ECHO ROMSIZE_CHK \ .ECHO ".\n" - .ECHO "BUILD IS USING A ROMSIZE OF " \ .ECHO ROMSIZE \ .ECHO ".\n" - .ECHO "SEE COMMENTS IN HBIOS.ASM.\n" - !!! ; FORCE AN ASSEMBLY ERROR -#ENDIF ; ; +#DEFINE ALIGN(N) .FILL ((($+(N-1)) & ~(N-1)) - $) ; -#IF (DIAGENABLE) -#DEFINE DIAG(N) PUSH AF - #DEFCONT \ LD A,N - #DEFCONT \ OUT (DIAGPORT),A - #DEFCONT \ POP AF +#IF (FPLED_ENABLE) + #DEFINE DIAG(N) PUSH AF + #DEFCONT \ LD A,N +; #DEFCONT \ OUT (DIAGPORT),A + #DEFCONT \ CALL FP_SETLEDS + #DEFCONT \ POP AF #ELSE -#DEFINE DIAG(N) \; + #DEFINE DIAG(N) \; #ENDIF ; ; SCxxx: LED Port=0x0E, bit 2, inverted, dedicated port ; TinyZ80: LED Port=0x6E, bit 0, inverted, dedicated port ; Z80-512K: LED Port=0x6E, bit 0, inverted, dedicated port ; MBC: LED Port=0x70, bits 1-0, normal, shared w/ RTC port +; DUO: LED Port=0x94, bits 1-0, normal, shared w/ RTC port +; S100: LED Port = $0E, bit 2, inverted, dedicated port ; #IF (LEDENABLE) #IF (LEDMODE == LEDMODE_STD) -#DEFINE LED(N) PUSH AF - #DEFCONT \ LD A,~N - #DEFCONT \ OUT (LEDPORT),A - #DEFCONT \ POP AF + #DEFINE LED(N) PUSH AF + #DEFCONT \ LD A,~N + #DEFCONT \ OUT (LEDPORT),A + #DEFCONT \ POP AF #ENDIF #IF (LEDMODE == LEDMODE_RTC) -#DEFINE LED(N) PUSH AF - #DEFCONT \ LD A,(HB_RTCVAL) - #DEFCONT \ AND %11111100 - #DEFCONT \ OR (N & %00000011) - #DEFCONT \ LD (HB_RTCVAL),A - #DEFCONT \ OUT (LEDPORT),A - #DEFCONT \ POP AF + #DEFINE LED(N) PUSH AF + #DEFCONT \ LD A,(HB_RTCVAL) + #DEFCONT \ AND %11111100 + #DEFCONT \ OR (N & %00000011) + #DEFCONT \ LD (HB_RTCVAL),A + #DEFCONT \ OUT (LEDPORT),A + #DEFCONT \ POP AF #ENDIF #ELSE -#DEFINE LED(N) \; + #DEFINE LED(N) \; #ENDIF ; #DEFINE SYSCHKERR(HB_ERR) \ - #DEFCONT \ CALL SYSCHKA - #DEFCONT \ LD A,HB_ERR - #DEFCONT \ OR A +#DEFCONT \ CALL SYSCHKA +#DEFCONT \ LD A,HB_ERR +#DEFCONT \ OR A ; ; ; @@ -194,7 +186,13 @@ MODCNT .SET MODCNT + 1 #ENDIF #ENDIF ; +; CONVERT ROMWBW LOGICAL BANK ID TO PHYSICAL 32K BANK OFFSET ; +#DEFINE PBANK(X) (((X >> 7) * (RAMBIAS / 32)) + (X & $7F)) +; +; CONVERT ROMWBW LOGICAL BANK ID TO Z280 PHYSICAL BANK (4K) OFFSET +; +#DEFINE Z2_BANK(X) (PBANK(X) << 3) ; ; THE RTCDEF EQUATE IS INITIALIZED HERE AND UPDATED BY DRIVER INCLUDES ; THAT SHARE THE RTC LATCH. AS EACH DRIVER FILE IS INCLUDED, IT CAN @@ -221,6 +219,24 @@ RTCDEF .SET RTCDEF | %00001000 ; INITIAL SPEED LOW ; ; ; +#IF (FPLED_ENABLE | FPSW_ENABLE) + .ECHO "FP: " + #IF (FPLED_ENABLE) + .ECHO "LEDIO=" + .ECHO FPLED_IO + #ENDIF + #IF (FPLED_ENABLE & FPSW_ENABLE) + .ECHO ", " + #ENDIF + #IF (FPSW_ENABLE) + .ECHO "SWIO=" + .ECHO FPSW_IO + #ENDIF + .ECHO "\n" +#ENDIF +; +; +; #IFNDEF APPBOOT ; .ORG 0 @@ -247,7 +263,8 @@ RTCDEF .SET RTCDEF | %00001000 ; INITIAL SPEED LOW RET .FILL (038H - $),0FFH ; RST 38 / IM1 INT #IF (INTMODE == 1) - JP INT_IM1 ; JP TO INTERRUPT HANDLER IN HI MEM + CALL HBX_INT ; HANDLE IM1 INTERRUPTS + .DB $10 << 2 ; USE SPECIAL VECTOR #16 #ELSE RET ; RETURN W/ INTS DISABLED #ENDIF @@ -315,9 +332,9 @@ CB_BIDUSR .DB BID_USR CB_BIDBIOS .DB BID_BIOS CB_BIDAUX .DB BID_AUX CB_BIDRAMD0 .DB BID_RAMD0 -CB_BIDRAMDN .DB BID_RAMDN +CB_RAMD_BNKS .DB RAMD_BNKS CB_BIDROMD0 .DB BID_ROMD0 -CB_BIDROMDN .DB BID_ROMDN +CB_ROMD_BNKS .DB ROMD_BNKS ; .FILL (HCB + HCB_SIZ - $),0 ; PAD REMAINDER OF HCB ; @@ -464,7 +481,11 @@ HBX_ROM: BIT 7,A ; BIT 7 SET REQUESTS RAM PAGE JR Z,HBX_ROM ; NOT SET, SELECT ROM PAGE RES 7,A ; RAM PAGE REQUESTED: CLEAR ROM BIT + #IF (PLATFORM == PLT_DUO) + ADD A,64 ; ADD 64 x 32K - RAM STARTS FROM 2048K + #ELSE ADD A,16 ; ADD 16 x 32K - RAM STARTS FROM 512K + #ENDIF ; HBX_ROM: RLCA ; TIMES 2 - GET 16K PAGE INSTEAD OF 32K @@ -591,6 +612,25 @@ HBX_ROM: RET ; DONE #ENDIF ; +#IF (MEMMGR == MM_MON) +; +; CURRENTLY ASSUMES FIRST 16 PAGES ARE RAM FOLLOWED BY 16 PAGES OF ROM. +; SO, WE MAP HBIOS BANKS $00-$0F (ROM SELECT) TO $10-$%1F AND HBIOS +; BANKS $80-$8F (RAM SELECT) TO $00-$0F. +; + BIT 7,A ; BIT 7 SET REQUESTS RAM PAGE + JR Z,HBX_ROM ; NOT SET, SELECT ROM PAGE + RES 7,A ; RAM PAGE REQUESTED: CLEAR ROM BIT + OUT ($FF),A ; DO IT + RET ; AND DONE +; +HBX_ROM: + ADD A,$10 ; OFFSET INTO ROM BANKS + OUT ($FF),A ; DO IT + RET ; DONE +#ENDIF +; +; ;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ; Copy Data - Possibly between banks. This resembles CP/M 3, but ; usage of the HL and DE registers is reversed. @@ -812,8 +852,6 @@ HBX_INTSTK .EQU $ !!! ; FORCE AN ASSEMBLY ERROR #ENDIF ; -#IF ((INTMODE == 2) | (INTMODE == 3)) -; ; HBIOS INTERRUPT SLOT ASSIGNMENTS ; ; # Z80 Z180 @@ -872,19 +910,9 @@ HBX_IV0D: CALL HBX_INT \ .DB $0D << 2 HBX_IV0E: CALL HBX_INT \ .DB $0E << 2 HBX_IV0F: CALL HBX_INT \ .DB $0F << 2 ; -#ENDIF -; -INT_IM1: -#IF (INTMODE == 1) - CALL HBX_INT - .DB $00 -#ELSE - RETI ; UNEXPECTED INT, RET W/ INTS LEFT DISABLED -#ENDIF +HBX_INT: ; COMMON INTERRUPT ROUTING CODE ; #IF (INTMODE > 0) -; -HBX_INT: ; COMMON INTERRUPT ROUTING CODE ; #IF (MEMMGR == MM_Z280) ; @@ -966,7 +994,11 @@ HBX_INT_SP .EQU $ - 2 RETI ; AND RETURN ; #ENDIF - +; +#ELSE +; + RET +; #ENDIF ; ; SMALL TEMPORARY STACK FOR USE BY HBX_BNKCPY @@ -1000,7 +1032,8 @@ HBX_BUF_END .EQU $ .DW 0 ; HB_DSTADR: BNKCPY DESTINATION ADDRESS .DB BID_USR ; HB_DSTBNK: BNKCPY DESTINATION BANK ID .DW 0 ; HB_CPYLEN: BNKCPY LENGTH - .FILL 4,0 ; FILLER, RESERVED FOR FUTURE HBIOS USE + .DW 0 ; RESERVED FOR OPTIONAL TICK CTR, PLATFORM DEPENDENT + .DW 0 ; RESERVED FOR FUTURE HBIOS USE .DB 0 ; SHADOW VALUE FOR RTC LATCH PORT .DB $FE ; HB_LOCK: HBIOS MUTEX LOCK JP HBX_INVOKE ; HB_INVOKE: FIXED ADR ENTRY FOR HBX_INVOKE (ALT FOR RST 08) @@ -1038,34 +1071,6 @@ HB_STACK .EQU $ ; TOP OF HBIOS STACK ; INTERRUPT VECTOR TABLE (MUST START AT PAGE BOUNDARY!!!) ;================================================================================================== ; -; IM1 INTERRUPTS ARRIVE HERE AFTER BANK SWITCH TO HBIOS BANK -; LIST OF IM1 INT CALLS IS BUILT DYNAMICALLY BELOW -; SEE HB_ADDIM1 ROUTINE -; EACH ENTRY WILL LOOK LIKE: -; CALL XXXX ; CALL INT HANDLER -; RET NZ ; RETURN IF HANDLED -; -; NOTE THAT THE LIST IS INITIALLY FILLED WITH CALLS TO HB_BADINT. -; AS THE TABLE IS POPULATED, THE ADDRESS OF HB_BADINT IS OVERLAID -; WITH THE ADDRESS OF A REAL INTERRUPT HANDLER. -; -; THERE IS ROOM FOR 8 ENTRIES PLUS A FINAL CALL TO HB_BADINT. -; -#IF (INTMODE < 2) -; -HB_IVT: - CALL HB_BADINT \ RET NZ - CALL HB_BADINT \ RET NZ - CALL HB_BADINT \ RET NZ - CALL HB_BADINT \ RET NZ - CALL HB_BADINT \ RET NZ - CALL HB_BADINT \ RET NZ - CALL HB_BADINT \ RET NZ - CALL HB_BADINT \ RET NZ - CALL HB_BADINT \ RET NZ -; -#ENDIF -; ; IM2 INTERRUPTS ARRIVE HERE AFTER BANK SWITCH TO HBIOS BANK ; THE LIST OF JP TABLE ENTRIES MATCHES THE IM2 VECTORS ONE FOR ; ONE. ANY CALL TO THE PRIMARY IVT (HBX_IVT) WILL BE MAPPED TO @@ -1079,8 +1084,6 @@ HB_IVT: ; NOTE THAT EACH ENTRY HAS A FILLER BYTE OF VALUE ZERO. THIS BYTE ; HAS NO FUNCTION. IT IS JUST USED TO MAKE ENTRIES AN EVEN 4 BYTES. ; -#IF ((INTMODE == 2) | (INTMODE == 3)) -; HB_IVT: HB_IVT00: JP HB_BADINT \ .DB 0 HB_IVT01: JP HB_BADINT \ .DB 0 @@ -1098,8 +1101,31 @@ HB_IVT0C: JP HB_BADINT \ .DB 0 HB_IVT0D: JP HB_BADINT \ .DB 0 HB_IVT0E: JP HB_BADINT \ .DB 0 HB_IVT0F: JP HB_BADINT \ .DB 0 +HB_IVT10: JP HB_IM1INT \ .DB 0 ; -#ENDIF +; IM1 INTERRUPTS ARRIVE HERE AFTER BANK SWITCH TO HBIOS BANK +; LIST OF IM1 INT CALLS IS BUILT DYNAMICALLY BELOW +; SEE HB_ADDIM1 ROUTINE +; EACH ENTRY WILL LOOK LIKE: +; CALL XXXX ; CALL INT HANDLER +; RET NZ ; RETURN IF HANDLED +; +; NOTE THAT THE LIST IS INITIALLY FILLED WITH CALLS TO HB_BADINT. +; AS THE TABLE IS POPULATED, THE ADDRESS OF HB_BADINT IS OVERLAID +; WITH THE ADDRESS OF A REAL INTERRUPT HANDLER. +; +; THERE IS ROOM FOR 8 ENTRIES PLUS A FINAL CALL TO HB_BADINT. +; +HB_IM1INT: + CALL HB_BADINT \ RET NZ + CALL HB_BADINT \ RET NZ + CALL HB_BADINT \ RET NZ + CALL HB_BADINT \ RET NZ + CALL HB_BADINT \ RET NZ + CALL HB_BADINT \ RET NZ + CALL HB_BADINT \ RET NZ + CALL HB_BADINT \ RET NZ + CALL HB_BADINT \ RET NZ ; ;================================================================================================== ; SYSTEM INITIALIZATION @@ -1109,16 +1135,9 @@ HB_START: ; #IFDEF APPBOOT #IF (MEMMGR == MM_Z280) - LD A,DIAG_01 - OUT (DIAGPORT),A - LD DE,Z280_BOOTERR - LD C,9 - LD A,DIAG_02 - OUT (DIAGPORT),A - CALL $0005 - LD A,DIAG_04 - OUT (DIAGPORT),A - RET + LD DE,Z280_BOOTERR ; POINT TO ERROR MESSAGE + LD C,9 ; BDOS FUNC 9: WRITE STR + JP $0005 ; DO IT AND RETURN TO OS ; Z280_BOOTERR .TEXT "\r\n\r\n*** Application mode boot not supported under Z280 native memory management!!!\r\n\r\n$" #ENDIF @@ -1126,13 +1145,28 @@ Z280_BOOTERR .TEXT "\r\n\r\n*** Application mode boot not supported under Z280 n ; DI ; NO INTERRUPTS IM 1 ; INTERRUPT MODE 1 - -;#IF ((PLATFORM == PLT_MBC) | (PLATFORM == PLT_SBC)) - ; INITIALIZE RTC LATCH BYTE +; +#IF ((PLATFORM == PLT_DUO) & TRUE) + ; WAIT A WHILE + LD HL,0 +BOOTWAIT: + DEC HL + LD A,H + OR L + JR NZ,BOOTWAIT +#ENDIF +; + ; EARLY RTC LATCH BYTE INITIALIZATION ; FOR SOME PLATFORMS THIS CONTROLS HI/LO SPEED CIRCUIT - LD A,(RTCDEFVAL) ; GET DEFAULT VALUE + ; NOTE: WE WANT TO USE (RTCDEFVAL) HERE, BUT THE Z2 MEMORY + ; MANAGER STARTS UP WITH THE FIRST 16K OF ROM MAPPED TO ALL + ; 4 16K BANKS OF CPU SPACE. SO, IF RTCDEVFAL IS LOCATED AFTER + ; PAST 16K, WE DON'T HAVE ACCESS TO IT. FOR NOW, WE JUST USE + ; RTCDEF WHICH IS SUBOPTIMAL, BUT PROBABLY DOES NOT CAUSE ANY + ; PROBLEMS. + ;LD A,(RTCDEFVAL) ; GET DEFAULT VALUE + LD A,RTCDEF ; DEFAULT VALUE OUT (RTCIO),A ; SET IT -;#ENDIF ; #IF (PLATFORM == PLT_N8) LD A,N8_DEFACR ; ENSURE N8 ACR @@ -1144,16 +1178,19 @@ Z280_BOOTERR .TEXT "\r\n\r\n*** Application mode boot not supported under Z280 n OUT0 (RPH_ACR),A ; ... REGISTER IS INITIALIZED #ENDIF ; -#IF (DIAGENABLE) +#IF (FPLED_ENABLE) + ; NO STACK YET, SO CAN'T USE DIAG() MACRO LD A,DIAG_01 - OUT (DIAGPORT),A + OUT (FPLED_IO),A #ENDIF #IF (LEDENABLE) #IF (LEDMODE == LEDMODE_STD) XOR A ; LED IS INVERTED, TURN IT ON #ENDIF #IF (LEDMODE == LEDMODE_RTC) - LD A,(RTCDEFVAL) ; DEFAULT LATCH VALUE + ; CAN'T USE (RTCDEFVAL) YET, SEE COMMENTS ABOVE + ;LD A,(RTCDEFVAL) ; DEFAULT LATCH VALUE + LD A,RTCDEF ; DEFAULT LATCH VALUE OR %00000001 ; LED 0 ON #ENDIF OUT (LEDPORT),A @@ -1210,10 +1247,8 @@ Z280_BOOTERR .TEXT "\r\n\r\n*** Application mode boot not supported under Z280 n ; JR Z280_INITZ ; JUMP TO CODE CONTINUATION ; - #IF (($ % 2) == 1) - ; WORD ALIGN THE TABLE - .DB 0 - #ENDIF + ; WORD ALIGN THE PDR TABLE + ALIGN(2) ; Z280_BOOTPDRTBL: ; LOWER 32 K (BANKED) @@ -1226,14 +1261,14 @@ Z280_BOOTPDRTBL: .DW ($006 << 4) | $A .DW ($007 << 4) | $A ; UPPER 32 K (COMMON) - .DW (((((BID_COM & $7F) * 8) + 0) + (1 << (RAMLOC - 12))) << 4) | $A - .DW (((((BID_COM & $7F) * 8) + 1) + (1 << (RAMLOC - 12))) << 4) | $A - .DW (((((BID_COM & $7F) * 8) + 2) + (1 << (RAMLOC - 12))) << 4) | $A - .DW (((((BID_COM & $7F) * 8) + 3) + (1 << (RAMLOC - 12))) << 4) | $A - .DW (((((BID_COM & $7F) * 8) + 4) + (1 << (RAMLOC - 12))) << 4) | $A - .DW (((((BID_COM & $7F) * 8) + 5) + (1 << (RAMLOC - 12))) << 4) | $A - .DW (((((BID_COM & $7F) * 8) + 6) + (1 << (RAMLOC - 12))) << 4) | $A - .DW (((((BID_COM & $7F) * 8) + 7) + (1 << (RAMLOC - 12))) << 4) | $A + .DW ((Z2_BANK(BID_COM) + 0) << 4) | $A + .DW ((Z2_BANK(BID_COM) + 1) << 4) | $A + .DW ((Z2_BANK(BID_COM) + 2) << 4) | $A + .DW ((Z2_BANK(BID_COM) + 3) << 4) | $A + .DW ((Z2_BANK(BID_COM) + 4) << 4) | $A + .DW ((Z2_BANK(BID_COM) + 5) << 4) | $A + .DW ((Z2_BANK(BID_COM) + 6) << 4) | $A + .DW ((Z2_BANK(BID_COM) + 7) << 4) | $A ; Z280_INITZ: ; @@ -1255,8 +1290,6 @@ Z280_INITZ: LD A,Z180_BASE OUT0 ($3F),A ; AT RESET, ICR IS AT $3F - DIAG(DIAG_02) - ; DISABLE REFRESH XOR A OUT0 (Z180_RCR),A @@ -1268,11 +1301,11 @@ Z280_INITZ: ; SET DEFAULT CPU CLOCK MULTIPLIERS (XTAL / 2) ; - ; IT HAS BEEN REPORTED THAT CMR NEEDS TO BE SET PRIOR TO CCR - ; WHEN USING AN INPUT FREQUENCY THAT IS XTAL / 2. - ; I NEVER EXPERIENCED A PROBLEM RELATED TO ORDER, BUT JUST + ; BILL MCMULLEN REPORTED THAT CMR NEEDS TO BE SET PRIOR TO CCR + ; WHEN USING A CPU FREQUENCY (PHI) THAT IS XTAL * 2. + ; HERE WE ARE SETTING CPU FREQUENCY TO XTAL / 2, BUT JUST ; FOR GOOD MEASURE, CMR IS SET PRIOR TO CCR BELOW. - ; https://www.retrobrewcomputers.org/forum/index.php?t=msg&th=316&#msg_5045 + ; https://www.retrobrewcomputers.org/forum/index.php?t=msg&th=316&goto=5045&#msg_5045 XOR A OUT0 (Z180_CMR),A OUT0 (Z180_CCR),A @@ -1332,7 +1365,13 @@ Z280_INITZ: INC A OUT (MPGSEL_1),A #ENDIF - LD A,62 +; + #IF (PLATFORM == PLT_DUO) + LD A,128 + (RAMSIZE / 16) - 2 + #ELSE + LD A,64 - 2 + #ENDIF +; OUT (MPGSEL_2),A INC A OUT (MPGSEL_3),A @@ -1349,9 +1388,46 @@ Z280_INITZ: ; NOT WANT TO EFFECT RAM UNTIL AFTER THE BACKUP BATTERY STATUS CHECK ; IS PERFORMED NEXT. ; -#IF (DIAGENABLE) +#IF (FPLED_ENABLE) + ; NO STACK YET, SO CAN'T USE DIAG() MACRO LD A,DIAG_02 - OUT (DIAGPORT),A + OUT (FPLED_IO),A +#ENDIF + +; +; Z180 MINI-ITX MADNESS TO INITIALIZE THE PPIO. WE HAVE THE MAIN RAM AT +; $8000 AND ROM AT $0 AT THIS POINT AND THE Z180 MMU SET UP. NOW +; GET THE 82C55 PROGRAMMED. +; +#IF (PLATFORM == PLT_EPITX) + ; THE 82C55 IS BRAINDEAD AND FLIPS OUTPUT LINES TO 0 WHEN WE SET + ; THE MODE. WE BOOT WITH THE ROM ENABLED BUT THE RESET WILL ENABLE + ; LOW RAM. SOME MENTAL BACKFLIPS REQUIRED TO MAKE THIS WORK + LD HL,BOOTFLIP + LD DE,$8000 + LD BC,$10 + LDIR + JP $8000 +; +BOOTFLIP: + ; SET THE MODE. ALSO CLEARS ALL THE OUTPUT BITS SO WE BLIP THE + ; I2C, KEYBOARD ETC BUT NOBODY WILL CARE. HOWEVER WE ALSO FLIP + ; TO ALL RAM MODE HENCE THIS IS EXECUTED HIGH + ; A OUT B IN C HIGH IN C LOW IN + LD A,$8B + OUT ($43),A + LD A,$FF + OUT ($40),A + JP ROMRESUME +; +ROMRESUME: + ; THIS WILL GLITCH EXTRAM ON SO WE MUST NOW BE IN ROM + LD A,$8A ; C LOW NOW OUTPUT + OUT ($43),A + LD A,$FF + OUT ($42),A ; EXTRAM OFF, RAM BACK IN, SPI 7 + ; AND DONE. MODE REMAINS THIS WAY FOREVER +; #ENDIF ; ; WE USE THE TWO BYTES IMMEDIATELY BELOW THE PROXY TO STORE A COUPLE @@ -1393,6 +1469,36 @@ Z280_INITZ: LD (HB_CURBNK),A ; RESTORE HB_CURBNK #ENDIF ; +; S100 ROM CONTAINS A HARDWARE LEVEL MONITOR IN BANK ID 3 OF ROM. +; IF PORT $75 BIT 1 IS SET (SET IS ZERO), THEN WE IMMEDIATELY +; TRANSITION TO THIS MONITOR. PRIOR TO THE TRANSITION, WE ALSO +; CHECK THE VALUE IN THE Z180 RELOAD REGISTER LOW. IF IT IS ASCII 'W', +; THEN IT MEANS THE S100 MONITOR IS ATTEMPTING TO REBOOT INTO ROMWBW +; HBIOS. +; +#IF ((PLATFORM == PLT_S100) & TRUE) + ; CHECK S100 BOARD DIP SWITCH, BIT 1 + IN A,($75) ; READ SWITCHES + BIT 1,A ; CHECK BIT 1 + JR NZ,S100MON_SKIP ; IF NOT SET, CONT ROMWBW BOOT +; + ; CHECK RELOAD REGISTER LOW FOR SPECIAL VALUE + IN0 A,(Z180_RLDR1L) ; GET RELOAD REG 1 LOW + CP 'W' ; CHECK FOR SPECIAL VALUE + JR Z,S100MON_SKIP ; IF SO, DO ROMWBW BOOT +; + ; LAUNCH S100 MONITOR FROM ROM BANK 3 + LD A,BID_IMG2 ; S100 MONITOR BANK + LD IX,0 ; EXECUTION RESUMES HERE + CALL HBX_BNKCALL ; CONTINUE IN RAM BANK, DO NOT RETURN + HALT ; WE SHOULD NOT COME BACK HERE! +; +S100MON_SKIP: + ; RESTORE DEFAULT RELOAD REGISTER VALUE (PROBABLY NOT NEEDED) + XOR A + OUT0 (Z180_RLDR1L),A +#ENDIF +; ; SAVE CURRENT BANKID ; ; THIS IS NOT GOING TO WORK IF THE APP BOOT IMAGE IS LOADED @@ -1403,16 +1509,20 @@ Z280_INITZ: ; ; THIS VALUE IS TEMPORARILY STORED AT HBX_LOC - 2 ; BECAUSE WE ARE CURRENTLY RUNNING IN ROM. AFTER WE TRANSITION HBIOS -; TO RAM, THE VALUE IS MOVED TO IT'S REAL LCOATION AT HB_APPBNK. +; TO RAM, THE VALUE IS MOVED TO IT'S REAL LOCATION AT HB_APPBNK. ; LD A,(HB_CURBNK) ; GET HB_CURBNK LD (HBX_LOC - 2),A ; ... AND SAVE TEMP FOR APPBNK ; -; THE RTCVAL FIELD OF THE PROXY DATA NEEDS TO BE INITIALIZED HERE -; BECAUSE IT CANNOT BE PRE-INITIALIZED (SEE COMMENTS ABOVE WHERE -; RTCVAL EQUATE IS DEFINED). +; WE CAN NOW DO THE REAL INITIALIZATION OF THE RTC LATCH BASED ON +; (RTCDEFVAL). AT THIS POINT WE SHOULD HAVE ACCESS TO THE ROM LOCATION +; WHERE RTCDEFVAL IS STORED AND THE PROXY IS INSTALLED IN UPPER RAM +; WHERE WE WILL STORE THE WORKING SHADOW COPY (HB_RTCVAL). +; SEE COMMENTS ABOVE REGARDING THE FUNKY WAY THAT THE RTCDEFVAL IS +; CREATED. ; LD A,(RTCDEFVAL) + OUT (RTCIO),A ; SET IT LD (HB_RTCVAL),A ; #IFDEF TESTING @@ -1575,70 +1685,17 @@ MBC_SINGLE: ; #ENDIF ; -; IF THIS IS A ROM-LESS SYSTEM, THEN WE NEED TO COPY THE PAYLOAD -; (LOADER, MONITOR, ZSDOS) THAT HAS BEEN LOADED TO PHYSICAL RAM -; BANKS 0 AND 1 TO THE USER TPA BANK TO RUN AFTER BOOT. -; IT IS DONE PRIOR TO COPYING HBIOS TO IT'S FINAL BANK BECAUSE -; THE PAYLOAD MAY EXTEND INTO THE HBIOS OPERATING BANK. THIS -; HAPPENS PRIMARILY IN THE CASE WHERE THE -; SYSTEM HAS THE MINIMUM 128KB OF RAM. -; -#IFDEF ROMBOOT - #IF (ROMSIZE == 0) - ; - ; THE PAYLOAD IS LIKELY TO CROSS OVER THE RAM BANK 0/1 - ; BOUNDARY. BNKCPY DOES NOT HANDLE THIS BECAUSE IT ASSUMES - ; THE COMMON BANK IS USED AFTER PASSING OVER THE BANK - ; BOUNDARY. WE WORK AROUND THAT HERE BY DOING TWO COPIES. - ; THE FIRST ONE HANDLES THE PORTION OF THE PAYLOAD FROM THE - ; END OF HBIOS TO THE BANK BOUNDARY ($8000). THE SECOND - ; ONE HANDLES THE PORTION THAT EXTENDS INTO THE SECOND - ; PHYSICAL RAM BANK. -; - ; COPY PORTION OF PAYLOAD FOLLOWING HBIOS TO THE BANK - ; BOUNDARY AT $8000 INTO START OF TPA. - LD A,BID_RAM0 - LD (HB_SRCBNK),A - LD A,BID_USR - LD (HB_DSTBNK),A - LD HL,HB_END - LD DE,0 - LD BC,$8000-HB_END -; - #IF (MEMMGR == MM_Z280) - CALL Z280_BNKCPY - #ELSE - CALL HBX_BNKCPY - #ENDIF -; - ; COPY REMAINDER OF PAYLOAD EXTENDING INTO THE SECOND PHYSICAL - ; RAM BANK. NOTE THAT THE DESTINATION ADDRESS (DE) IS - ; ALREADY CORRECT FROM THE PRIOR COPY. - LD A,BID_RAM0+1 - LD (HB_SRCBNK),A - LD HL,$0000 - ; DE IS ALREADY CORRECT - LD BC,$8000-($8000-HB_END) -; - #IF (MEMMGR == MM_Z280) - CALL Z280_BNKCPY - #ELSE - CALL HBX_BNKCPY - #ENDIF -; - #ENDIF -; -#ENDIF -; -; IF ALREADY EXECUTING IN RAM, BYPASS RAM BANK INSTALLATION -; - LD A,(HB_RAMFLAG) - OR A - JR NZ,HB_START1 -; ; INSTALL HBIOS IN RAM BANK ; LD A,(HB_CURBNK) +; + ; CHECK TO SEE IF WE ARE ALREADY RUNNING IN THE HBIOS + ; BANK AND SKIP THE COPY IF SO (DON'T COPY OVER OURSELVES). + ; THIS SITUATION OCCURS ON A ROMLESS STARTUP OR WHEN DOING A + ; FULL RESTART OF A SYSTEM USING THE EXISTING HBIOS COPY. + CP BID_BIOS + JR Z,HB_START1 +; LD (HB_SRCBNK),A LD A,BID_BIOS LD (HB_DSTBNK),A @@ -1665,8 +1722,6 @@ MBC_SINGLE: HALT ; WE SHOULD NOT COME BACK HERE! #ENDIF ; -HB_RAMFLAG .DB FALSE ; INITIALLY FALSE, SET TO TRUE BELOW AFTER RAM TRANSITION -; ; EXECUTION RESUMES HERE AFTER SWITCH TO RAM BANK ; HB_START1: ; BNKCALL ARRIVES HERE, BUT NOW RUNNING IN RAM BANK @@ -1680,10 +1735,6 @@ HB_START1: ; BNKCALL ARRIVES HERE, BUT NOW RUNNING IN RAM BANK ; NOTIFY THAT WE MADE THE TRANSITION! DIAG(DIAG_03) LED(%00000010) -; - ; SET THE IN-RAM FLAG - LD A,TRUE ; ACCUM := TRUE - LD (HB_RAMFLAG),A ; SET RAMFLAG ; ; RECOVER DATA PASSED PRIOR TO RAM TRANSITION ; (HBX_LOC - 1) = BATCOND, (HBX_LOC - 2) = APPBNK @@ -1701,7 +1752,7 @@ HB_START1: ; BNKCALL ARRIVES HERE, BUT NOW RUNNING IN RAM BANK ; HL IS TOP 16 BITS OF PHYSICAL ADDRESS OF IVT ; IVT *MUST* BE ON A 4K BOUNDARY LD C,Z280_VPR - LD HL,0 + ((((BID_BIOS & $7F) * 8) + (1 << (RAMLOC - 12))) << 4) + (Z280_IVT >> 8) + LD HL,0 + (((PBANK(BID_BIOS) << 15) + Z280_IVT) >> 8) LDCTL (C),HL #ENDIF ; @@ -1717,11 +1768,14 @@ HB_START1: ; BNKCALL ARRIVES HERE, BUT NOW RUNNING IN RAM BANK ; ; MAKE SURE IM1 INT VECTOR IS RIGHT #IF (INTMODE == 1) - ; JP INT_IM1 IF INTERRUPT MODE ACTIVE - LD A,$C3 + ; CALL HBX_INT ; HANDLE IM1 INTERRUPTS + ; .DB $10 << 2 ; USE SPECIAL VECTOR #16 + LD A,$CD ; CALL OPCODE LD ($0038),A - LD HL,INT_IM1 + LD HL,HBX_INT ; ADDRESS LD ($0039),HL + LD A,$10 << 2 ; IM1 VECTOR + LD ($003B),A #ELSE ; RETI ($ED, $4D) IF NON-INTERRUPT MODE LD HL,$0038 @@ -1815,8 +1869,8 @@ SAVE_REC_M: ; ; TEST DEBUG *************************************************************************************** ; - PRTS("DEBUG-IVT$") - LD DE,HB_IVT + PRTS("DEBUG-IM1INT$") + LD DE,HB_IM1INT CALL DUMP_BUFFER CALL NEWLINE ; @@ -1879,10 +1933,51 @@ HB_CPU1: LD A,L LD (HB_CPUTYPE),A ; +; CLEAR DISPATCH TABLE ENTRIES +; + XOR A ; ZERO + LD (CIO_CNT),A ; CIO DEVICES + LD (DIO_CNT),A ; DIO DEVICES + LD (VDA_CNT),A ; VDA DEVICES + LD (SND_CNT),A ; SND DEVICES + LD (RTC_DISPACT),A ; RTC DEVICE + LD (DSKY_DISPACT),A ; DSKY DEVICE +; #IF (DSRTCENABLE) CALL DSRTC_PREINIT #ENDIF ; +#IF (DSKYENABLE) + #IF (ICMENABLE) + CALL ICM_PREINIT + #ENDIF +; + #IF (PKDENABLE) + CALL PKD_PREINIT + #ENDIF +; + #IF (H8PENABLE) + CALL H8P_PREINIT + #ENDIF +#ENDIF +; +#IF (DSKYENABLE) + LD HL,MSG_HBVER + 5 + LD A,(DSKY_HEXMAP + RMJ) + OR $80 + LD (HL),A + INC HL + LD A,(DSKY_HEXMAP + RMN) + OR $80 + LD (HL),A + INC HL + LD A,(DSKY_HEXMAP + RUP) + LD (HL),A + LD HL,MSG_HBVER + LD B,BF_DSKYSHOWSEG + CALL DSKY_DISPATCH +#ENDIF +; #IF (SKZENABLE) ; ; SET THE SK Z80-512K UART CLK2 DIVIDER AS @@ -1999,6 +2094,15 @@ HB_CPU2: HB_CPU3: #ENDIF ; +#IF (CPUFAM == CPU_Z280) +; + ; Z280 ALWAYS HALVES THE INPUT OSCILLATOR TO DERIVE + ; ACTUAL CPU SPEED. + ; ADJUST HL TO REFLECT HALF SPEED OPERATION + SRL H ; ADJUST HL ASSUMING + RR L ; HALF SPEED OPERATION +#ENDIF +; ; HL SHOULD NOW HAVE FINAL CPU RUNNING SPEED IN KHZ. ; UPDATE CB_CPUMHZ/CB_CPUKHZ WITH THIS VALUE. ; @@ -2045,7 +2149,7 @@ HB_CPU3: LD A,(CB_CPUMHZ) ; CPU SPEED TO ACCUM AND INIT CALL DELAY_INIT ; .. SPEED COMPENSATED DELAY ; -#IF (INTMODE == 2) +#IF ((INTMODE == 2) | ((INTMODE == 1) & (CPUFAM == CPU_Z180))) ; SETUP Z80 IVT AND INT MODE 2 LD A,HBX_IVT >> 8 ; SETUP HI BYTE OF IVT ADDRESS LD I,A ; ... AND PLACE IT IN I REGISTER @@ -2056,7 +2160,9 @@ HB_CPU3: OUT0 (Z180_IL),A ; ... AND PLACE IN Z180 IL REGISTER #ENDIF + #IF (INTMODE == 2) IM 2 ; SWITCH TO INT MODE 2 + #ENDIF #ENDIF ; #IF (INTMODE == 3) @@ -2078,11 +2184,40 @@ HB_CPU3: LD HL,HB_TIMINT CALL HB_ADDIM1 ; ADD TO IM1 CALL LIST #ENDIF - +; #ENDIF ; #ENDIF ; +; TEMPLATE FOR SETTING UP INTERRUPTS USING THE MBC/DUODYNE IM2 INTERRUPT +; PIN HEADERS. UPDATE HB_DUMMYx TO POINT TO THE INTERRUPT ROUTINE. +; IN STD.ASM ALLOCATE THE EQUIVALENT INT_IM2PHx INTERRUPT TABLE ENTRY NUMBER. +; +; +; LD HL,HB_DUMMY0 +; LD (IVT(INT_IM2PH0)),HL +; +; LD HL,HB_DUMMY1 +; LD (IVT(INT_IM2PH1)),HL +; +; LD HL,HB_DUMMY2 +; LD (IVT(INT_IM2PH2)),HL +; +; LD HL,HB_DUMMY3 +; LD (IVT(INT_IM2PH3)),HL +; +; LD HL,HB_DUMMY4 +; LD (IVT(INT_IM2PH4)),HL +; +; LD HL,HB_DUMMY5 +; LD (IVT(INT_IM2PH5)),HL +; +; LD HL,HB_DUMMY6 +; LD (IVT(INT_IM2PH6)),HL +; +; LD HL,HB_DUMMY7 +; LD (IVT(INT_IM2PH7)),HL +; #IF (KIOENABLE) CALL KIO_PREINIT #ENDIF @@ -2093,7 +2228,7 @@ HB_CPU3: ; #IF (CPUFAM == CPU_Z180) ; - #IF (INTMODE == 2) + #IF (INTMODE > 0) ; ; MASK ALL EXTERNAL INTERRUPTS FOR NOW LD A,$01 ; INT0 ENABLED, INT1-2 DISABLED @@ -2216,22 +2351,6 @@ NOT_REC_M0: #ENDIF CALL CALLLIST ; PROCESS THE PRE-INIT CALL TABLE ; -#IF (DSKYENABLE) - LD HL,MSG_HBVER + 5 - LD A,(DSKY_HEXMAP + RMJ) - OR $80 - LD (HL),A - INC HL - LD A,(DSKY_HEXMAP + RMN) - OR $80 - LD (HL),A - INC HL - LD A,(DSKY_HEXMAP + RUP) - LD (HL),A - LD HL,MSG_HBVER - CALL DSKY_SHOW -#ENDIF -; #IF FALSE ; ; TEST DEBUG *************************************************************************************** @@ -2248,7 +2367,6 @@ NOT_REC_M0: ; ; ; -; #IF (BOOT_DELAY > 100) .ECHO "*** ERROR: INVALID BOOT_DELAY (BOOT_DELAY > 100)!!!\n" !!! ; FORCE AN ASSEMBLY ERROR @@ -2273,12 +2391,15 @@ HB_BOOTDLY: JR C,HB_CONRDY ; IF TOO HIGH, JUST USE FAILSAFE LD A,BOOTCON ; GET REQUESTED CONSOLE DEV LD (CB_CONDEV),A ; SAVE IT +; HB_CONRDY: ; +#IF (SUPCTS) +; ; MOST SERIAL PORTS ARE CONFIGURED WITH HARDWARE FLOW CONTROL ENABLED. -; IF THERE IS A PROBLEM WITH THE RTS SIGNAL, THEN OUTPUT TO THE CONSOLE +; IF THERE IS A PROBLEM WITH THE CTS SIGNAL, THEN OUTPUT TO THE CONSOLE ; WILL BE STALLED WHICH CAN LEAD A USER TO THINK THE SYSTEM IS TOTALLY -; DEAD WHEN, IN FACT, IT IS JUST WAITING FOR RTS TO BE ASSERTED. ALSO, +; DEAD WHEN, IN FACT, IT IS JUST WAITING FOR CTS TO BE ASSERTED. ALSO, ; IF THE USER IS BOOTING TO A CRT DEVICE AND DISCONNECTS THE CONSOLE ; SERIAL PORT, THE SYSTEM WILL WAIT FOR RTS AND NEVER BOOT. SO, HERE ; WE SAVE THE ACTIVE CONSOLE CONFIGURATION, THEN TURN OFF HARDWARE @@ -2297,7 +2418,9 @@ HB_CONRDY: LD A,(CB_CONDEV) ; GET CONSOLE DEVICE LD C,A ; BOOT CONSOLE TO C CALL HB_DISPATCH ; INTERNAL HBIOS CALL - +; +#ENDIF +; #IF (WBWDEBUG == USEMIO) ; OUTPUT ANY CACHED DEBUG TEXT LD HL,MIOOUTPTR LD E,(HL) @@ -2321,8 +2444,8 @@ NXTMIO: LD A,(HL) ; TEST DEBUG *************************************************************************************** ; CALL NEWLINE2 - PRTS("DEBUG+IVT$") - LD DE,HB_IVT + PRTS("DEBUG+IM1INT$") + LD DE,HB_IM1INT CALL DUMP_BUFFER ; ; TEST DEBUG *************************************************************************************** @@ -2643,13 +2766,13 @@ HB_CKBNK: LD BC,1 ; DECREMENT VALUE XOR A ; ZERO ACCUM HB_CKBNK1: -#IF (MEMMGR == MM_Z280) + #IF (MEMMGR == MM_Z280) LD D,A ; WORKING VALUE TO D LDUD A,(HL) ; GRAB NEXT BYTE FROM USER SPACE ADD A,D ; ADD NEXT BYTE -#ELSE + #ELSE ADD A,(HL) ; ADD NEXT BYTE -#ENDIF + #ENDIF OR A ; CLEAR CARRY SBC HL,BC ; DECREMENT JR NC,HB_CKBNK1 ; LOOP TILL DONE @@ -2743,7 +2866,10 @@ HB_WDZ: LD HL,(CB_HEAPTOP) LD (HEAPCURB),HL ; -; NOW SWITCH TO CRT CONSOLE IF CONFIGURED +; NOW SWITCH CONSOLES IF CONFIGURED +; + LD A,(CB_CONDEV) ; GET CURRENT CONSOLE + LD (HB_NEWCON),A ; AND INIT NEW CONSOLE VAR ; #IF CRTACT ; @@ -2763,37 +2889,123 @@ HB_WDZ: JR Z,INITSYS3 ; Z=SHORTED, BYPASS CONSOLE SWITCH #ENDIF ; - ; NOTIFY USER OF CONSOLE SWITCH ON BOOT CONSOLE - CALL NEWLINE2 - PRTX(STR_SWITCH) - CALL NEWLINE + #IF (PLATFORM == PLT_S100) + IN A,($75) ; GET IO BYTE + AND %00000001 ; ISOLATE CONSOLE BIT + JR NZ,INITSYS3 ; NOT SET, BYPASS CONSOLE SWITCH + #ENDIF ; - ; SWITCH TO CRT CONSOLE LD A,(CB_CRTDEV) ; GET CRT DISPLAY DEVICE - LD (CB_CONDEV),A ; SAVE IT AS ACTIVE CONSOLE DEVICE + LD (HB_NEWCON),A ; AND QUEUE TO SWITCH ; #ENDIF ; -INITSYS3: +#IF (FPSW_ENABLE) ; -; RESTORE BOOT CONSOLE CONFIGURATION +; IF WE HAVE FRONT PANEL SWITCHES, THIS IS THE RIGHT PLACE TO HANDLE +; ANY CONSOLE CHANGE REQUESTS. THE FRONT PANEL HAS TWO SWITCHES +; RELATED TO THIS: 1) CRT/SER, AND 2) SEC/PRI. IF CRT/SER IS SET, +; THEN WE SWITCH TO THE CRT DEVICE (IF THERE IS ONE). IF THE SEC/PRI +; SWITCH IS SET, THEN WE ATTEMPT TO USE THE SECOND SERIAL OR CRT +; DEVICE. ; - CALL LDELAY ; ALLOW SERIAL PORT TO FLUSH - LD B,BF_CIOINIT ; HBIOS CIO INIT - LD A,(HB_BOOTCONSAV) ; ORIGINAL BOOT CONSOLE DEVICE - LD C,A ; BOOT CONSOLE TO C - LD DE,(HB_CONCFGSAV) ; SAVED ORIGINAL CONSOLE CFG - CALL HB_DISPATCH ; INTERNAL HBIOS CALL + PRTS("\r\nFP: IO=0x$") + LD A,FPSW_IO + CALL PRTHEXBYTE ; - LD A,(HB_BOOTCONSAV) ; GET ORIGINAL BOOT CONSOLE DEV + CALL FP_DETECT +; + ; IF FP DOESN'T EXIST, BAIL OUT. + LD A,(FPSW_ACTIVE) ; GET FP EXISTENCE FLAG + OR A ; SET FLAGS + JR NZ,HB_FP1 ; IF WE HAVE ONE, CONTINUE +; + ; HANDLE NO FP + PRTS(" NOT PRESENT$") + JR HB_FPZ +; +HB_FP1: + ; WE NOW BELIEVE WE HAVE A VALID SWITCH SETTINGS VALUE. + ; CHECK FOR CRT SWITCH VALUE AND SWITCH TO CRT IF SET. + ; NOTE THAT CB_CRTDEV WILL BE ZERO IF THERE IS NO CRT DEVICE + ; IN THE SYSTEM, SO WE DON'T NEED TO CHECK FOR THE EXISTENCE + ; OF A CRT DEVICE -- IT WILL JUST FAILBACK TO FIRST SERIAL + ; PORT. + PRTS(" SWITCHES=0x$") ; TAG + CALL FP_GETSWITCHES ; GET SWITCH SETTINGS + CALL PRTHEXBYTE ; DISPLAY VALUE + LD B,A ; SAVE IN REG B + AND SW_CRT ; TEST CRT BIT + JR Z,HB_FP2 ; SKIP AHEAD IF NOT SET + LD A,(CB_CRTDEV) ; GET CRT DISPLAY DEVICE + CP $FF ; $FF MEANS NO CRT PRESENT + JR Z,HB_FP2 ; BYPASS IF SO + LD (HB_NEWCON),A ; QUEUE NEW CONSOLE UNIT +; +HB_FP2: + ; IF SEC SWITCH IS SET, WE WANT TO BUMP TO SECONDARY + ; CRT OR SERIAL DEVICE. IF AN OVERRIDE IS SPECIFIED USING + ; SECCON, USE THAT, OTHERWISE INCREMENT THE DEFAULT UNIT. + ; THIS SHOULD WORK ASSUMING NORMAL ORDERING OF THE + ; CHARACTER DEVICE UNITS. + LD A,B ; RECOVER SWITCH SETTINGS + AND SW_SEC ; TEST SEC BIT + JR Z,HB_FPZ ; IF NOT SET, THEN ALL DONE +; + LD A,(CIO_CNT) ; GET CHAR UNIT COUNT + LD B,A ; MOVE TO B + LD A,SECCON ; GET SEC CONSOLE SETTING + CP $FF ; $FF MEANS USE INCREMENT + JR NZ,HB_FP3 ; BYPASS IF NOT $FF +; + ; INCREMENT CONSOLE UNIT + LD A,(HB_NEWCON) ; GET NEW CONSOLE UNIT + INC A ; BUMP TO SECONDARY +; +HB_FP3: + ; MAKE SURE NEW CONSOLE UNIT DOES NOT EXCEED THE HIGHEST + ; CHAR UNIT IN SYSTEM. + CP B ; A (UNIT) >= B (CNT)? + JR NC,HB_FPZ ; ABORT IF UNIT TOO HIGH + LD (HB_NEWCON),A ; UPDATE NEW CONSOLE UNIT +; +HB_FPZ: +; +#ENDIF +; +INITSYS3: +; +#IF (SUPCTS) +; +; RESTORE BOOT CONSOLE CONFIGURATION +; + CALL LDELAY ; ALLOW SERIAL PORT TO FLUSH + LD B,BF_CIOINIT ; HBIOS CIO INIT + LD A,(HB_BOOTCONSAV) ; ORIGINAL BOOT CONSOLE DEVICE + LD C,A ; BOOT CONSOLE TO C + LD DE,(HB_CONCFGSAV) ; SAVED ORIGINAL CONSOLE CFG + CALL HB_DISPATCH ; INTERNAL HBIOS CALL +; +#ENDIF +; +; IF WE ARE GOING TO SWITCH CONSOLES, IT IS IMPLEMENTED HERE. A +; MESSAGE IS PRINTED ON THE OLD CONSOLE INDICATING WHERE THE NEW +; CONSOLE IS AND THE NEW CONSOLE RECEIVES AN HBIOS BANNER. +; + LD A,(HB_BOOTCON) ; GET ORIGINAL BOOT CONSOLE DEV LD C,A ; PUT IN C - LD A,(CB_CONDEV) ; GET ACTIVE CONSOLE DEVICE + LD A,(HB_NEWCON) ; GET NEW CONSOLE DEVICE CP C ; COMPARE - JR Z,INITSYS3A ; SKIP AHEAD IF NO CHANGE + JR Z,INITSYS3A ; NO CHANGE, BYPASS ; - ; DISPLAY HBIOS BANNER ON NEW CONSOLE IF WE SWITCHED TO NEW - ; CONSOLE DEVICE - PRTX(STR_BANNER) ; DISPLAY HBIOS BANNER + LD DE,STR_CONSOLE ; CONSOLE CHANGE NOTIFY + CALL WRITESTR ; PRINT IT + LD A,(HB_NEWCON) ; GET NEW CONSOLE UNIT NUM + CALL PRTDECB ; PRINT UNIT NUM + LD (CB_CONDEV),A ; IMPLEMENT NEW CONSOLE! + CALL NEWLINE2 ; FORMATTING + LD DE,STR_BANNER ; POINT TO BANNER + CALL NZ,WRITESTR ; OUTPUT IF CONSOLE MOVED ; INITSYS3A: CALL PRTSUM ; PRINT UNIT/DEVICE SUMMARY TABLE @@ -2948,11 +3160,7 @@ INITSYS4: ; CHAIN TO LOADER ; #IFDEF ROMBOOT - #IF (ROMSIZE > 0) LD A,BID_IMG0 ; CHAIN TO OS IMAGES BANK - #ELSE - LD A,BID_USR ; CHAIN TO USER BANK - #ENDIF #ELSE LD A,BID_USR ; CHAIN TO USER BANK #ENDIF @@ -3009,9 +3217,6 @@ HB_INITRLEN .EQU (($ - HB_INIT_REC) / 2) ;================================================================================================== ; HB_PCINITTBL: -#IF (DSKYENABLE) - .DW DSKY_PREINIT -#ENDIF #IF (ASCIENABLE) .DW ASCI_PREINIT #ENDIF @@ -3045,6 +3250,9 @@ HB_PCINITTBL: #IF (TMSENABLE) .DW TMS_PREINIT #ENDIF +#IF (SCONENABLE) + .DW SCON_PREINIT +#ENDIF HB_PCINITTBLLEN .EQU (($ - HB_PCINITTBL) / 2) ;================================================================================================== @@ -3058,8 +3266,19 @@ HB_INITTBL: #IF (CTCENABLE) .DW CTC_INIT #ENDIF +#IF (PCFENABLE) + .DW PCF_INIT +#ENDIF #IF (DSKYENABLE) - .DW DSKY_INIT + #IF (ICMENABLE) + .DW ICM_INIT + #ENDIF + #IF (PKDENABLE) + .DW PKD_INIT + #ENDIF + #IF (H8PENABLE) + .DW H8P_INIT + #ENDIF #ENDIF #IF (AY38910ENABLE) .DW AY38910_INIT ; AUDIBLE INDICATOR OF BOOT START @@ -3119,7 +3338,6 @@ HB_INITTBL: .DW INTRTC_INIT #ENDIF #IF (DS7RTCENABLE) - .DW PCF8584_INIT .DW DS7RTC_INIT #ENDIF #IF (RP5RTCENABLE) @@ -3140,9 +3358,12 @@ HB_INITTBL: #IF (TMSENABLE) .DW TMS_INIT #ENDIF -;#IF (DSKYENABLE) -; .DW DSKY_INIT -;#ENDIF +#IF (SCONENABLE) + .DW SCON_INIT +#ENDIF +#IF (VRCENABLE) + .DW VRC_INIT +#ENDIF #IF (DMAENABLE) .DW DMA_INIT #ENDIF @@ -3167,12 +3388,27 @@ HB_INITTBL: #IF (HDSKENABLE) .DW HDSK_INIT #ENDIF +#IF (PPAENABLE) + .DW PPA_INIT +#ENDIF +#IF (IMMENABLE) + .DW IMM_INIT +#ENDIF +#IF (SYQENABLE) + .DW SYQ_INIT +#ENDIF #IF (PRPENABLE) .DW PRP_INIT #ENDIF #IF (PPPENABLE) .DW PPP_INIT #ENDIF +#IF (CHENABLE) + .DW CH_INIT +#ENDIF +#IF (ESPENABLE) + .DW ESP_INIT +#ENDIF ; HB_INITTBLLEN .EQU (($ - HB_INITTBL) / 2) ; @@ -3241,8 +3477,8 @@ HB_DISPATCH1: JP C,DIO_DISPATCH CP BF_RTC + $10 ; $20-$2F: REAL TIME CLOCK (RTC) JP C,RTC_DISPATCH - CP BF_EMU + $10 ; $30-$3F: EMULATION - JR C,HB_DISPERR + CP BF_DSKY + $10 ; $30-$3F: DSKY + JP C,DSKY_DISPATCH CP BF_VDA + $10 ; $40-$4F: VIDEO DISPLAY ADAPTER JP C,VDA_DISPATCH CP BF_SND + $08 ; $50-$58: SOUND DRIVERS @@ -3396,7 +3632,7 @@ HB_DSKREAD: ; LD (HB_DSKCMD),BC ; SAVE HBIOS FUNC & UNIT ; -#IF (DIAGENABLE) +#IF (FPLED_ENABLE & FPLED_DSKACT) ; SAVE DISK UNIT NUMBER BIT MASK LD A,C ; GET DISK UNIT NUMBER LD B,A ; PUT IN B FOR LOOP COUNTER @@ -3486,7 +3722,7 @@ HB_DSKWRITE: ; LD (HB_DSKCMD),BC ; SAVE HBIOS FUNC & UNIT ; -#IF (DIAGENABLE) +#IF (FPLED_ENABLE & FPLED_DSKACT) ; SAVE DISK UNIT NUMBER BIT MASK LD A,C ; GET DISK UNIT NUMBER LD B,A ; PUT IN B FOR LOOP COUNTER @@ -3583,9 +3819,9 @@ HB_DSKIOX: ; HB_DSKFN: PUSH BC ; SAVE COUNTERS -#IF (DIAGENABLE & DIAGDISKIO) +#IF (FPLED_ENABLE & FPLED_DSKACT) LD A,(HB_DSKBIT) ; LOAD UNIT DISK BIT MASK - OUT (DIAGPORT),A ; DISPLAY ON DIAG LEDS + CALL FP_SETLEDS ; DISPLAY ON DIAG LEDS #ENDIF #IF (LEDENABLE & LEDDISKIO) LED(%00000101) ; BIT 0 FOR TINY Z80 & MBC, BIT 2 FOR SCXXX @@ -3593,8 +3829,8 @@ HB_DSKFN: LD E,1 ; ONE SECTOR HB_DSKFNADR .EQU $+1 CALL PANIC ; READ ONE SECTOR -#IF (DIAGENABLE & DIAGDISKIO) - DIAG(DIAG_00) ; CLEAR DIAG LEDS +#IF (FPLED_ENABLE & FPLED_DSKACT) + DIAG($00) ; CLEAR DIAG LEDS #ENDIF #IF (LEDENABLE & LEDDISKIO) LED($00) @@ -3610,6 +3846,7 @@ HB_DSKUNIT .DB 0 ; CURRENT DISK UNIT HB_DSKFUNC .DB 0 ; CURRENT DISK FUNCTION ; #IF (DSKYENABLE) + #IF (DSKYDSKACT) ; ;================================================================================================== ; DSKY DISK ACTIVITY MONITOR @@ -3630,41 +3867,51 @@ HB_DSKFUNC .DB 0 ; CURRENT DISK FUNCTION ; ALL REGISTERS PERSERVED ; HB_DSKACT: + ; SAVE EVERYTHING PUSH AF PUSH BC PUSH DE PUSH HL - LD DE,DSKY_HEXBUF+3 ; START AT END - LD B,3 ; 3 BYTES OF SECTOR ADDRESS +; + ; COPY VALUE TO LOCAL HEXBUF + CALL LD32 +; HB_DSKACT1: - LD A,(HL) ; GET FIRST BYTE - LD (DE),A ; AND STORE IN BUF - INC HL ; NEXT SRC BYTE - DEC DE ; NEXT DEST BYTE - DJNZ HB_DSKACT1 ; LOOP + LD BC,DSKY_HEXBUF + CALL ST32 +; + ; USE DISK UNIT NUMBER FOR MSB LD A,(HB_DSKUNIT) ; GET DISK UNIT NUM - LD (DE),A ; PUT AT HEAD OF BUF -HB_DSKACT2: - LD HL,DSKY_HEXBUF ; BINARY BUF - LD DE,DSKY_BUF ; DISPLAY BUF - CALL DSKY_BIN2SEG ; CONVERT TO SEG DISPLAY BUF - LD A,(DSKY_BUF+1) ; SECOND SEGMENT - OR %10000000 ; TURN ON DOT - LD (DSKY_BUF+1),A ; SAVE IT + LD (DSKY_HEXBUF+3),A ; REPLACE HIGH BYTE W/ DISK # +; + ; CONVERT TO SEGMENT DISPLAY + LD HL,DSKY_HEXBUF ; INPUT POINTER + LD DE,DSKY_BUF ; TEMP BUF FOR OUTPUT + CALL DSKY_BIN2SEG ; CONVERT TO SEG DISPLAY +; + ; DECIMAL POINT FOR DISK UNIT SEPARATION + LD HL,DSKY_BUF+1 ; SECOND CHAR OF DISP + SET 7,(HL) ; TURN ON DECIMAL PT +; + ; DECIMAL POINT TO INDICATE WRITE ACTION LD A,(HB_DSKFUNC) ; GET CURRENT I/O FUNCTION CP BF_DIOWRITE ; IS IT A WRITE? - JR NZ,HB_DSKACT3 ; IF NOT, NO DOT, SKIP AHEAD - LD A,(DSKY_BUF+7) ; LAST SEGMENT - OR %10000000 ; TURN ON DOT - LD (DSKY_BUF+7),A ; SAVE IT -HB_DSKACT3: - EX DE,HL ; SEG DISPLAY BUF TO HL - CALL DSKY_SHOW ; DISPLAY ON DSKY + JR NZ,HB_DSKACT2 ; IF NOT, SKIP + LD HL,DSKY_BUF+7 ; POINT TO CHAR 7 + SET 7,(HL) ; SET WRITE DOT +; +HB_DSKACT2: + ; UPDATE DISPLAY + LD HL,DSKY_BUF ; SEG DISPLAY BUF TO HL + LD B,BF_DSKYSHOWSEG ; SHOW SEG FUNCTION + CALL DSKY_DISPATCH ; DO IT +; + ; CLEAN UP AND GO AWAY POP HL POP DE POP BC POP AF - RET + RET ; DONE ; ; THIS IS THE CHS VARIANT OF THE ABOVE. THIS IS USED BY CHS ORIENTED ; DISK DRIVERS (BASICALLY JUST FLOPPY). @@ -3681,24 +3928,12 @@ HB_DSKACTCHS: PUSH BC PUSH DE PUSH HL - LD DE,DSKY_HEXBUF ; START OF HEX BUF - LD A,(HB_DSKUNIT) ; GET DISK UNIT NUM - LD (DE),A ; PUT AT HEAD OF BUF - INC DE ; NEXT BYTE OF BUF - LD A,(HL) ; LSB OF TRACK - LD (DE),A ; ADD TO BUF - INC DE ; NEXT BYTE OF BUF - INC HL ; BUMP TO HEAD - INC HL ; " - INC HL ; " - LD A,(HL) ; GET HEAD - LD (DE),A ; ADD TO BUF - INC DE ; NEXT BYTE OF BUF - DEC HL ; BACK TO SECTOR - LD A,(HL) ; GET SECTOR - LD (DE),A ; ADD TO BUF - JR HB_DSKACT2 + CALL LD32 ; DE:HL = HSCC + ; MAP HSCC -> CCHS + EX DE,HL + JR HB_DSKACT1 ; + #ENDIF #ENDIF ; ;================================================================================================== @@ -3734,6 +3969,38 @@ RTC_DISPADR .DW RTC_DISPERR ; RTC DISPATCH ADDRESS RTC_DISPACT .DB 0 ; SET WHEN DISPADR SET ; ;================================================================================================== +; DSKY DEVICE DISPATCHER +;================================================================================================== +; +; ROUTE CALL TO DSKY DRIVER +; B: FUNCTION +; +DSKY_DISPATCH: + PUSH HL ; SAVE INCOMING HL + LD HL,(DSKY_DISPADR) ; + EX (SP),HL + RET +; +DSKY_DISPERR: + SYSCHKERR(ERR_NOHW) + RET +; +; SET DSKY DISPATCH ADDRESS, USED BY DSKY DRIVERS DURING INIT +; BC HAS ADDRESS OF DISPATCH ADDRESS +; WILL ONLY SAVE THE FIRST ADDRESS SET +; +DSKY_SETDISP: + LD (DSKY_DISPADR),BC ; SAVE THE ADDRESS + OR $FF ; FLAG ACTIVE VALUE + LD (DSKY_DISPACT),A ; SAVE IT + RET ; AND DONE +; +; +; +DSKY_DISPADR .DW DSKY_DISPERR ; DSKY DISPATCH ADDRESS +DSKY_DISPACT .DB 0 ; SET WHEN DISPADR SET +; +;================================================================================================== ; VIDEO DISPLAY ADAPTER DEVICE DISPATCHER ;================================================================================================== ; @@ -3934,10 +4201,6 @@ SYS_RESINT: ; GO BACK TO ROM BOOT LOADER ; SYS_RESWARM: -; -#IF (ROMSIZE == 0) - JR SYS_RESCOLD -#ENDIF ; CALL SYS_RESINT ; @@ -3956,13 +4219,6 @@ SYS_RESWARM: ; SYS_RESCOLD: ; -#IF (ROMSIZE == 0) - LD DE,STR_RESTART - CALL Z,WRITESTR - DI - HALT -#ENDIF -; #IF (MEMMGR == MM_Z280) JP Z280_RESTART #ELSE @@ -4135,6 +4391,8 @@ SYS_GET: JP Z,SYS_GETDIOFN CP BF_SYSGET_RTCCNT JP Z,SYS_GETRTCCNT + CP BF_SYSGET_DSKYCNT + JP Z,SYS_GETDSKYCNT CP BF_SYSGET_VDACNT JP Z,SYS_GETVDACNT CP BF_SYSGET_VDAFN @@ -4157,9 +4415,142 @@ SYS_GET: JP Z,SYS_GETBNKINFO CP BF_SYSGET_CPUSPD JP Z,SYS_GETCPUSPD + CP BF_SYSGET_PANEL + JP Z,SYS_GETPANEL SYSCHKERR(ERR_NOFUNC) ; SIGNAL ERROR RET ; +; GET SERIAL UNIT COUNT +; +SYS_GETCIOCNT: + LD A,(CIO_CNT) ; GET DEVICE COUNT (FIRST BYTE OF LIST) + LD E,A ; PUT IT IN E + XOR A ; SIGNALS SUCCESS + RET +; +; GET SERIAL UNIT API FN ADR AND DATA ADR +; ENTRY: +; D: FUNCTION +; E: UNIT +; RETURNS: +; HL: FUNCTION ADDRESS +; DE: DATA BLOB ADDRESS +; +SYS_GETCIOFN: + BIT 7,E ; CHECK FOR SPECIAL UNIT CODE + CALL NZ,SYS_GETCIOFN1 ; IF SO, HANDLE IT + LD IY,CIO_TBL ; POINT TO UNIT TABLE + JP SYS_GETFN ; GO TO COMMON CODE +; +SYS_GETCIOFN1: + LD A,(CB_CONDEV) ; UNIT $80 -> CONSOLE UNIT + LD E,A ; REPLACE UNIT VALUE IN C + RET ; AND BACK TO REGULAR FLOW +; +; +; GET DISK UNIT COUNT +; +SYS_GETDIOCNT: + LD A,(DIO_CNT) ; GET DEVICE COUNT (FIRST BYTE OF LIST) + LD E,A ; PUT IT IN E + XOR A ; SIGNALS SUCCESS + RET +; +; GET DISK UNIT API FN ADR AND DATA ADR +; ENTRY: +; D: FUNCTION +; E: UNIT +; RETURNS: +; HL: FUNCTION ADDRESS +; DE: DATA BLOB ADDRESS +; +SYS_GETDIOFN: + LD IY,DIO_TBL ; POINT TO UNIT TABLE + JP SYS_GETFN ; GO TO COMMON CODE +; +; GET RTC UNIT COUNT +; +SYS_GETRTCCNT: + LD E,0 ; ASSUME 0 RTC DEVICES + LD A,(RTC_DISPACT) ; IS RTC ACTIVE? + OR A ; SET FLAGS + JR Z,SYS_GETRTCCNT1 ; IF NONE, DONE + INC E ; SET ONE DEVICE +SYS_GETRTCCNT1: + XOR A ; SIGNALS SUCCESS + RET +; +; GET DSKY UNIT COUNT +; +SYS_GETDSKYCNT: + LD E,0 ; ASSUME 0 RTC DEVICES + LD A,(DSKY_DISPACT) ; IS DSKY ACTIVE? + OR A ; SET FLAGS + JR Z,SYS_GETDSKYCNT1 ; IF NONE, DONE + INC E ; SET ONE DEVICE +SYS_GETDSKYCNT1: + XOR A ; SIGNALS SUCCESS + RET +; +; GET VIDEO UNIT COUNT +; +SYS_GETVDACNT: + LD A,(VDA_CNT) ; GET DEVICE COUNT (FIRST BYTE OF LIST) + LD E,A ; PUT IT IN E + XOR A ; SIGNALS SUCCESS + RET +; +; GET VIDEO UNIT API FN ADR AND DATA ADR +; ENTRY: +; D: FUNCTION +; E: UNIT +; RETURNS: +; HL: FUNCTION ADDRESS +; DE: DATA BLOB ADDRESS +; +SYS_GETVDAFN: + LD IY,VDA_TBL ; POINT TO UNIT TABLE + JP SYS_GETFN ; GO TO COMMON CODE +; +; GET SOUND UNIT COUNT +; +SYS_GETSNDCNT: + LD A,(SND_CNT) ; GET DEVICE COUNT (FIRST BYTE OF LIST) + LD E,A ; PUT IT IN E + XOR A ; SIGNALS SUCCESS + RET +; +; GET SOUND UNIT API FN ADR AND DATA ADR +; ENTRY: +; D: FUNCTION +; E: UNIT +; RETURNS: +; HL: FUNCTION ADDRESS +; DE: DATA BLOB ADDRESS +; +SYS_GETSNDFN: + LD IY,SND_TBL ; POINT TO UNIT TABLE + JP SYS_GETFN ; GO TO COMMON CODE +; +; SHARED CODE TO COMPLETE A FUNCTION LOOKUP +; ENTRY: +; IY: DISPATCH FUNCTION TABLE +; D: FUNCTION ID +; E: UNIT NUMBER +; EXIT: +; HL: DRIVER FUNCTION ADDRESS +; DE: DRIVER UNIT DATA ADDRESS +; +SYS_GETFN: + LD A,D ; GET FUNC NUM FROM D + LD B,A ; AND PUT IN B + LD A,E ; GET UNIT NUM FROM E + LD C,A ; AND PUT IN C + CALL HB_DISPCALC ; CALC FN ADR & BLOB ADR + PUSH IY ; MOVE DATA ADR + POP DE ; ... TO DE + RET ; AF STILL HAS RESULT OF CALC +; ; GET TIMER ; RETURNS: ; DE:HL: TIMER VALUE (32 BIT) @@ -4317,127 +4708,30 @@ SYS_GETCPUSPD1: OR $FF RET ; -; GET SERIAL UNIT COUNT -; -SYS_GETCIOCNT: - LD A,(CIO_CNT) ; GET DEVICE COUNT (FIRST BYTE OF LIST) - LD E,A ; PUT IT IN E - XOR A ; SIGNALS SUCCESS - RET -; -; GET SERIAL UNIT API FN ADR AND DATA ADR -; ENTRY: -; D: FUNCTION -; E: UNIT +; GET FRONT PANEL SWITCH VALUES BYTE ; RETURNS: -; HL: FUNCTION ADDRESS -; DE: DATA BLOB ADDRESS -; -SYS_GETCIOFN: - BIT 7,E ; CHECK FOR SPECIAL UNIT CODE - CALL NZ,SYS_GETCIOFN1 ; IF SO, HANDLE IT - LD IY,CIO_TBL ; POINT TO UNIT TABLE - JP SYS_GETFN ; GO TO COMMON CODE -; -SYS_GETCIOFN1: - LD A,(CB_CONDEV) ; UNIT $80 -> CONSOLE UNIT - LD E,A ; REPLACE UNIT VALUE IN C - RET ; AND BACK TO REGULAR FLOW +; L: SWITCH VALUES BYTE ; +SYS_GETPANEL: ; -; GET DISK UNIT COUNT +#IF (FPSW_ENABLE) + LD A,(FPSW_ACTIVE) ; FP SWITCHES ACTIVE? + OR A ; SET FLAGS + JR Z,SYS_GETPANEL1 ; HANDLE NOT EXISTS + CALL FP_GETSWITCHES ; READ SWITCHES + LD H,0 ; FOR FUTURE + LD L,A ; PUT SWITCHES VALUE IN L + XOR A ; SIGNAL SUCCESS + RET ; DONE +#ENDIF +SYS_GETPANEL1: ; HANDLE NON-EXISTENT FRONT PANEL + LD HL,0 ; ZERO RESULT VALUE + LD A,ERR_NOHW ; NO HARDWARE ERR + OR A ; SET FLAGS + RET ; DONE ; -SYS_GETDIOCNT: - LD A,(DIO_CNT) ; GET DEVICE COUNT (FIRST BYTE OF LIST) - LD E,A ; PUT IT IN E - XOR A ; SIGNALS SUCCESS - RET -; -; GET DISK UNIT API FN ADR AND DATA ADR -; ENTRY: -; D: FUNCTION -; E: UNIT -; RETURNS: -; HL: FUNCTION ADDRESS -; DE: DATA BLOB ADDRESS -; -SYS_GETDIOFN: - LD IY,DIO_TBL ; POINT TO UNIT TABLE - JP SYS_GETFN ; GO TO COMMON CODE -; -; GET RTC UNIT COUNT -; -SYS_GETRTCCNT: - LD E,0 ; ASSUME 0 RTC DEVICES - LD A,(RTC_DISPACT) ; IS RTC ACTIVE? - OR A ; SET FLAGS - JR Z,SYS_GETRTCCNT1 ; IF NONE, DONE - INC E ; SET ONE DEVICE -SYS_GETRTCCNT1: - XOR A ; SIGNALS SUCCESS - RET -; -; GET VIDEO UNIT COUNT -; -SYS_GETVDACNT: - LD A,(VDA_CNT) ; GET DEVICE COUNT (FIRST BYTE OF LIST) - LD E,A ; PUT IT IN E - XOR A ; SIGNALS SUCCESS - RET -; -; GET VIDEO UNIT API FN ADR AND DATA ADR -; ENTRY: -; D: FUNCTION -; E: UNIT -; RETURNS: -; HL: FUNCTION ADDRESS -; DE: DATA BLOB ADDRESS -; -SYS_GETVDAFN: - LD IY,VDA_TBL ; POINT TO UNIT TABLE - JP SYS_GETFN ; GO TO COMMON CODE -; -; GET SOUND UNIT COUNT -; -SYS_GETSNDCNT: - LD A,(SND_CNT) ; GET DEVICE COUNT (FIRST BYTE OF LIST) - LD E,A ; PUT IT IN E - XOR A ; SIGNALS SUCCESS - RET -; -; GET SOUND UNIT API FN ADR AND DATA ADR -; ENTRY: -; D: FUNCTION -; E: UNIT -; RETURNS: -; HL: FUNCTION ADDRESS -; DE: DATA BLOB ADDRESS -; -SYS_GETSNDFN: - LD IY,SND_TBL ; POINT TO UNIT TABLE - JP SYS_GETFN ; GO TO COMMON CODE -; -; SHARED CODE TO COMPLETE A FUNCTION LOOKUP -; ENTRY: -; IY: DISPATCH FUNCTION TABLE -; D: FUNCTION ID -; E: UNIT NUMBER -; EXIT: -; HL: DRIVER FUNCTION ADDRESS -; DE: DRIVER UNIT DATA ADDRESS -; -SYS_GETFN: - LD A,D ; GET FUNC NUM FROM D - LD B,A ; AND PUT IN B - LD A,E ; GET UNIT NUM FROM E - LD C,A ; AND PUT IN C - CALL HB_DISPCALC ; CALC FN ADR & BLOB ADR - PUSH IY ; MOVE DATA ADR - POP DE ; ... TO DE - RET ; AF STILL HAS RESULT OF CALC -; -; SET SYSTEM PARAMETERS -; PARAMETER(S) TO SET INDICATED IN C +; SET SYSTEM PARAMETERS +; PARAMETER(S) TO SET INDICATED IN C ; SYS_SET: LD A,C ; GET REQUESTED SUB-FUNCTION @@ -4449,6 +4743,8 @@ SYS_SET: JR Z,SYS_SETBOOTINFO CP BF_SYSSET_CPUSPD JR Z,SYS_SETCPUSPD + CP BF_SYSSET_PANEL + JP Z,SYS_SETPANEL SYSCHKERR(ERR_NOFUNC) ; SIGNAL ERROR RET ; @@ -4724,6 +5020,23 @@ SYS_SETCPUSPD_ERR: OR $FF ; NOT SUPPORTED RET ; +; SET FRONT PANEL LEDS +; ON ENTRY: +; L: LED VALUES BYTE +; +SYS_SETPANEL: +; +#IF (FPLED_ENABLE) + LD A,L + CALL FP_SETLEDS + XOR A + RET +#ELSE + LD A,ERR_NOHW ; NO HARDWARE ERR + OR A ; SET FLAGS + RET +#ENDIF +; ; RETURN A BYTE OF MEMORY FROM SPECIFIED BANK ; ENTRY: D=BANK ID, HL=ADDRESS ; RETURN: E=BYTE VALUE @@ -4859,7 +5172,12 @@ SYS_INTGET1: INC A ; BUMP TO ADR FIELD LD H,0 LD L,A +#IF (INTMODE == 1) + LD DE,HB_IM1INT ; DE := START OF VECTOR TABLE +#ENDIF +#IF (INTMODE == 2) LD DE,HB_IVT ; DE := START OF VECTOR TABLE +#ENDIF ADD HL,DE ; HL := ADR OF VECTOR XOR A ; INDICATE SUCCESS RET @@ -4905,6 +5223,99 @@ SYS_INTSET1: RET ; DONE ; ;================================================================================================== +; Z280 INTERRUPT VECTOR TABLE +;================================================================================================== +; +#IF (MEMMGR == MM_Z280) +; + ; THE Z280 IVT MUST BE ON A 4K BOUNDARY. IT HAS BEEN LOCATED + ; HERE IN AN EFFORT TO MINIMIZE WASTED SPACE. THERE SHOULD BE + ; A LITTLE LESS THAN 4K OF CODE ABOVE. +; +Z280_IVT_SLACK_ORG .EQU $ + ALIGN($1000) +Z280_IVT_SLACK .EQU $ - Z280_IVT_SLACK_ORG + .ECHO "Z280 IVT SLACK occupies " + .ECHO Z280_IVT_SLACK + .ECHO " bytes.\n" +; +Z280_IVT: + .DW 0, 0 ; RESERVED + .DW 0 ; NMI MSR + .DW 0 ; NMI VECTOR + .DW $0000 ; INT A MSR + .DW Z280_BADINT ; INT A VECTOR + .DW $0000 ; INT B MSR + .DW Z280_BADINT ; INT B VECTOR + .DW $0000 ; INT C MSR + .DW Z280_BADINT ; INT C VECTOR + .DW $0000 ; COUNTER/TIMER 0 MSR + .DW Z280_BADINT ; COUNTER/TIMER 0 VECTOR + .DW $0000 ; COUNTER/TIMER 1 MSR + .DW Z280_BADINT ; COUNTER/TIMER 1 VECTOR + .DW 0, 0 ; RESERVED + .DW $0000 ; COUNTER/TIMER 2 MSR + .DW Z280_BADINT ; COUNTER/TIMER 2 VECTOR + .DW $0000 ; DMA CHANNEL 0 MSR + .DW Z280_BADINT ; DMA CHANNEL 0 VECTOR + .DW $0000 ; DMA CHANNEL 1 MSR + .DW Z280_BADINT ; DMA CHANNEL 1 VECTOR + .DW $0000 ; DMA CHANNEL 2 MSR + .DW Z280_BADINT ; DMA CHANNEL 2 VECTOR + .DW $0000 ; DMA CHANNEL 3 MSR + .DW Z280_BADINT ; DMA CHANNEL 3 VECTOR + .DW $0000 ; UART RECEIVER MSR + .DW Z280_BADINT ; UART RECEIVER VECTOR + .DW $0000 ; UART TRANSMITTER MSR + .DW Z280_BADINT ; UART TRANSMITTER VECTOR + .DW $0000 ; SINGLE STEP TRAP MSR + .DW Z280_SSTEP ; SINGLE STEP TRAP VECTOR + .DW $0000 ; BREAK ON HALT TRAP MSR + .DW Z280_BRKHLT ; BREAK ON HALT TRAP VECTOR + .DW $0000 ; DIVISION EXCEPTION TRAP MSR + .DW Z280_DIVEXC ; DIVISION EXCEPTION TRAP VECTOR + .DW $0000 ; STACK OVERFLOW WARNING TRAP MSR + .DW Z280_STKOVR ; STACK OVERFLOW WARNING TRAP VECTOR + .DW $0000 ; ACCESS VIOLATION TRAP MSR + .DW Z280_ACCVIO ; ACCESS VIOLATION TRAP VECTOR + .DW $0000 ; SYSTEM CALL TRAP MSR + .DW Z280_SYSCALL ; SYSTEM CALL TRAP VECTOR + .DW $0000 ; PRIVILEGED INSTRUCTION TRAP MSR + .DW Z280_PRIVINST ; PRIVILEGED INSTRUCTION TRAP VECTOR + .DW $0000 ; EPU <- MEMORY EXTENDED INSTRUCTION TRAP MSR + .DW $0000 ; EPU <- MEMORY EXTENDED INSTRUCTION TRAP VECTOR + .DW $0000 ; MEMORY <- EPU EXTENDED INSTRUCTION TRAP MSR + .DW $0000 ; MEMORY <- EPU EXTENDED INSTRUCTION TRAP VECTOR + .DW $0000 ; A <- EPU EXTENDED INSTRUCTION TRAP MSR + .DW $0000 ; A <- EPU EXTENDED INSTRUCTION TRAP VECTOR + .DW $0000 ; EPU INTERNAL OPERATION EXTENDED INSTRUCTION TRAP MSR + .DW $0000 ; EPU INTERNAL OPERATION EXTENDED INSTRUCTION TRAP VECTOR + .DW 0, 0 ; RESERVED + .DW 0, 0 ; RESERVED + ; PROGRAM COUNTER VALUES FOR NMI/INTA (16) + .DW HBX_IV00 + .DW HBX_IV01 + .DW HBX_IV02 + .DW HBX_IV03 + .DW HBX_IV04 + .DW HBX_IV05 + .DW HBX_IV06 + .DW HBX_IV07 + .DW HBX_IV08 + .DW HBX_IV09 + .DW HBX_IV0A + .DW HBX_IV0B + .DW HBX_IV0C + .DW HBX_IV0D + .DW HBX_IV0E + .DW HBX_IV0F + ; THE REMAINDER OF THE Z280 IVT IS TRUNCATED HERE BECAUSE IT + ; TAKES A BUNCH OF SPACE AND IS NOT USED. WE SUPPORT ONLY + ; 16 VECTORED INTERRUPTS AND THEY MUST BE CONNECTED TO INTA. +; +#ENDIF +; +;================================================================================================== ; GLOBAL HBIOS FUNCTIONS ;================================================================================================== ; @@ -4941,7 +5352,43 @@ HB_ADDIM1: ; HB_IM1CNT .DB 0 ; NUMBER OF ENTRIES IN CALL LIST HB_IM1MAX .DB 8 ; MAX ENTRIES IN CALL LIST -HB_IM1PTR .DW HB_IVT ; POINTER FOR NEXT IM1 ENTRY +HB_IM1PTR .DW HB_IM1INT ; POINTER FOR NEXT IM1 ENTRY +; +#ENDIF +; +#IF (DSKYENABLE) +; +;================================================================================================== +; CONVERT 32 BIT BINARY TO 8 BYTE HEX SEGMENT DISPLAY +;================================================================================================== +; +; HL: ADR OF 32 BIT BINARY +; DE: ADR OF DEST LED SEGMENT DISPLAY BUFFER (8 BYTES) +; +DSKY_BIN2SEG: + LD B,4 ; 4 BYTES OF INPUT + LD A,B ; PUT IN ACCUM + CALL ADDHLA ; PROCESS FROM END (LITTLE ENDIAN) +DSKY_BIN2SEG1: + DEC HL ; DEC PTR (LITTLE ENDIAN) + LD A,(HL) ; HIGH NIBBLE + RRCA \ RRCA \ RRCA \ RRCA ; ROTATE BITS + CALL DSKY_BIN2SEG_NIB ; CONVERT NIBBLE INTO OUTPUT BUF + LD A,(HL) ; LOW NIBBLE + CALL DSKY_BIN2SEG_NIB ; CONVERT NIBBLE INTO OUTPUT BUF + DJNZ DSKY_BIN2SEG1 ; LOOP FOR ALL INPUT BYTES + RET ; DONE +; +DSKY_BIN2SEG_NIB: + PUSH HL ; SAVE HL + LD HL,DSKY_HEXMAP ; POINT TO SEG MAP TABLE + AND $0F ; ISOLATE LOW NIBBLE + CALL ADDHLA ; OFFSET INTO TABLE + LD A,(HL) ; LOAD VALUE FROM TABLE + POP HL ; RESTORE HL + LD (DE),A ; SAVE VALUE TO OUTPUT BUF + INC DE ; BUMP TO NEXT OUTPUT BYTE + RET ; DONE ; #ENDIF ; @@ -5073,10 +5520,10 @@ HB_BADINTCNT .DB 0 LD A,L RRCA RRCA - CALL PRTHEXBYTE - PRTS("H: $") - + ;CALL PRTHEXBYTE + ;PRTS("H: $") CALL XREGDMP + CALL NEWLINE ;CALL CONTINUE OR $FF ; SIGNAL INTERRUPT HANDLED RET @@ -5428,103 +5875,15 @@ HB_ALLOC1: HB_TMPSZ .DW 0 HB_TMPREF .DW 0 ; -;================================================================================================== -; Z280 INTERRUPT VECTOR TABLE -;================================================================================================== +; Z280 BANK SELECTION (CALLED FROM PROXY) ; #IF (MEMMGR == MM_Z280) ; - ; THE Z280 IVT MUST BE ON A 4K BOUNDARY. IT HAS BEEN LOCATED - ; HERE IN AN EFFORT TO MINIMIZE WASTED SPACE. THERE SHOULD BE - ; A LITTLE LESS THAN 4K OF CODE ABOVE. +; REG A HAS BANK ID, REG B HAS INITIAL PDR TO PROGRAM +; REGISTERS AF, BC, HL DESTROYED ; - .FILL $1000 - ($ & $FFF) ; MUST BE 4K ALIGNED! -; -Z280_IVT: - .DW 0, 0 ; RESERVED - .DW 0 ; NMI MSR - .DW 0 ; NMI VECTOR - .DW $0000 ; INT A MSR - .DW Z280_BADINT ; INT A VECTOR - .DW $0000 ; INT B MSR - .DW Z280_BADINT ; INT B VECTOR - .DW $0000 ; INT C MSR - .DW Z280_BADINT ; INT C VECTOR - .DW $0000 ; COUNTER/TIMER 0 MSR - .DW Z280_BADINT ; COUNTER/TIMER 0 VECTOR - .DW $0000 ; COUNTER/TIMER 1 MSR - .DW Z280_BADINT ; COUNTER/TIMER 1 VECTOR - .DW 0, 0 ; RESERVED - .DW $0000 ; COUNTER/TIMER 2 MSR - .DW Z280_BADINT ; COUNTER/TIMER 2 VECTOR - .DW $0000 ; DMA CHANNEL 0 MSR - .DW Z280_BADINT ; DMA CHANNEL 0 VECTOR - .DW $0000 ; DMA CHANNEL 1 MSR - .DW Z280_BADINT ; DMA CHANNEL 1 VECTOR - .DW $0000 ; DMA CHANNEL 2 MSR - .DW Z280_BADINT ; DMA CHANNEL 2 VECTOR - .DW $0000 ; DMA CHANNEL 3 MSR - .DW Z280_BADINT ; DMA CHANNEL 3 VECTOR - .DW $0000 ; UART RECEIVER MSR - .DW Z280_BADINT ; UART RECEIVER VECTOR - .DW $0000 ; UART TRANSMITTER MSR - .DW Z280_BADINT ; UART TRANSMITTER VECTOR - .DW $0000 ; SINGLE STEP TRAP MSR - .DW Z280_SSTEP ; SINGLE STEP TRAP VECTOR - .DW $0000 ; BREAK ON HALT TRAP MSR - .DW Z280_BRKHLT ; BREAK ON HALT TRAP VECTOR - .DW $0000 ; DIVISION EXCEPTION TRAP MSR - .DW Z280_DIVEXC ; DIVISION EXCEPTION TRAP VECTOR - .DW $0000 ; STACK OVERFLOW WARNING TRAP MSR - .DW Z280_STKOVR ; STACK OVERFLOW WARNING TRAP VECTOR - .DW $0000 ; ACCESS VIOLATION TRAP MSR - .DW Z280_ACCVIO ; ACCESS VIOLATION TRAP VECTOR - .DW $0000 ; SYSTEM CALL TRAP MSR - .DW Z280_SYSCALL ; SYSTEM CALL TRAP VECTOR - .DW $0000 ; PRIVILEGED INSTRUCTION TRAP MSR - .DW Z280_PRIVINST ; PRIVILEGED INSTRUCTION TRAP VECTOR - .DW $0000 ; EPU <- MEMORY EXTENDED INSTRUCTION TRAP MSR - .DW $0000 ; EPU <- MEMORY EXTENDED INSTRUCTION TRAP VECTOR - .DW $0000 ; MEMORY <- EPU EXTENDED INSTRUCTION TRAP MSR - .DW $0000 ; MEMORY <- EPU EXTENDED INSTRUCTION TRAP VECTOR - .DW $0000 ; A <- EPU EXTENDED INSTRUCTION TRAP MSR - .DW $0000 ; A <- EPU EXTENDED INSTRUCTION TRAP VECTOR - .DW $0000 ; EPU INTERNAL OPERATION EXTENDED INSTRUCTION TRAP MSR - .DW $0000 ; EPU INTERNAL OPERATION EXTENDED INSTRUCTION TRAP VECTOR - .DW 0, 0 ; RESERVED - .DW 0, 0 ; RESERVED - ; PROGRAM COUNTER VALUES FOR NMI/INTA (16) - .DW HBX_IV00 - .DW HBX_IV01 - .DW HBX_IV02 - .DW HBX_IV03 - .DW HBX_IV04 - .DW HBX_IV05 - .DW HBX_IV06 - .DW HBX_IV07 - .DW HBX_IV08 - .DW HBX_IV09 - .DW HBX_IV0A - .DW HBX_IV0B - .DW HBX_IV0C - .DW HBX_IV0D - .DW HBX_IV0E - .DW HBX_IV0F - ; THE REMAINDER OF THE Z280 IVT IS TRUNCATED HERE BECAUSE IT - ; TAKES A BUNCH OF SPACE AND IS NOT USED. WE SUPPORT ONLY - ; 16 VECTORED INTERRUPTS AND THEY MUST BE CONNECTED TO INTA. -; -#ENDIF -; -; Z280 BANK SELECTION (CALLED FROM PROXY) -; -#IF (MEMMGR == MM_Z280) -; -; REG A HAS BANK ID, REG B HAS INITIAL PDR TO PROGRAM -; REGISTERS AF, BC, HL DESTROYED -; -; THIS ROUTINE MAY BE RELOCATED TO RUN IN HIGH MEMORY IN CERTAIN CASES -; LIKE A SYSTEM RESTART. IT MUST BE KEPT ENTIRELY RELOCATABLE. +; THIS ROUTINE MAY BE RELOCATED TO RUN IN HIGH MEMORY IN CERTAIN CASES +; LIKE A SYSTEM RESTART. IT MUST BE KEPT ENTIRELY RELOCATABLE. ; Z280_BNKSEL: ;; *DEBUG* @@ -5537,7 +5896,7 @@ Z280_BNKSEL: LDCTL HL,(C) ; GET CURRENT I/O PAGE PUSH HL ; SAVE IT LD L,$FF ; NEW I/O PAGE - LDCTL (C),HL + LDCTL (C),HL ; IMPLEMENT ; ; CONVERT BANK ID TO TOP 12 BITS OF PHYSICAL ADDRESS ; WITH $0A IN THE LOW ORDER NIBBLE: @@ -5548,8 +5907,10 @@ Z280_BNKSEL: MULTU A,$80 ; HL=0R00 0BBB B000 0000 BIT 6,H ; RAM BIT SET? JR Z,Z280_BNKSEL2 ; IF NOT, ALL DONE - RES 6,H ; OTHERWISE, MOVE RAM BIT - SET RAMLOC-16,H ; HL=0000 RBBB B000 0000 + RES 6,H ; OTHERWISE, REMOVE RAM BIT + LD A,RAMBIAS >> 6 ; RAM OFFSET (TOP 8 BITS) + OR H ; RECOMBINE + LD H,A ; AND PUT BACK IN H ; Z280_BNKSEL2: ; @@ -5797,10 +6158,12 @@ Z2DMAADR1: ; MOVE THE RAM/ROM BIT. ; RCBUS DMA HI=0000 RBBB BAAA 1111 LO=1111 AAAA AAAA AAAA ; ZZ80MB DMA HI=R000 0BBB BAAA 1111 LO=1111 AAAA AAAA AAAA - BIT 6,H - JR Z,Z2DMAADR2 - RES 6,H - SET RAMLOC-16,H + BIT 6,H ; RAM BIT SET? + JR Z,Z2DMAADR2 ; IF NOT, ALL DONE + RES 6,H ; OTHERWISE, REMOVE RAM BIT + LD A,RAMBIAS >> 6 ; RAM OFFSET (TOP 8 BITS) + OR H ; RECOMBINE + LD H,A ; AND PUT BACK IN H ; Z2DMAADR2: PUSH HL ; SAVE IT FOR NOW @@ -5842,6 +6205,35 @@ Z280_SYSCALL_GO: ; DEVICE DRIVERS ;================================================================================================== ; +#IF (DSKYENABLE) + #IF (ICMENABLE) +ORG_ICM .EQU $ + #INCLUDE "icm.asm" +SIZ_ICM .EQU $ - ORG_ICM + .ECHO "ICM occupies " + .ECHO SIZ_ICM + .ECHO " bytes.\n" + #ENDIF +; + #IF (PKDENABLE) +ORG_PKD .EQU $ + #INCLUDE "pkd.asm" +SIZ_PKD .EQU $ - ORG_PKD + .ECHO "PKD occupies " + .ECHO SIZ_PKD + .ECHO " bytes.\n" + #ENDIF +; + #IF (H8PENABLE) +ORG_H8P .EQU $ + #INCLUDE "h8p.asm" +SIZ_H8P .EQU $ - ORG_H8P + .ECHO "H8P occupies " + .ECHO SIZ_H8P + .ECHO " bytes.\n" + #ENDIF +#ENDIF +; #IF (DSRTCENABLE) ORG_DSRTC .EQU $ #INCLUDE "dsrtc.asm" @@ -5868,6 +6260,7 @@ SIZ_BQRTC .EQU $ - ORG_BQRTC .ECHO SIZ_BQRTC .ECHO " bytes.\n" #ENDIF +; #IF (SIMRTCENABLE) ORG_SIMRTC .EQU $ #INCLUDE "simrtc.asm" @@ -5876,15 +6269,16 @@ SIZ_SIMRTC .EQU $ - ORG_SIMRTC .ECHO SIZ_SIMRTC .ECHO " bytes.\n" #ENDIF -#IF (DS7RTCENABLE & (DS7RTCMODE=DS7RTCMODE_PCF)) -ORG_PCF8584 .EQU $ - #INCLUDE "pcf8584.asm" -SIZ_PCF8584 .EQU $ - ORG_PCF8584 - .ECHO "PCF8584 occupies " - .ECHO SIZ_PCF8584 +; +#IF (PCFENABLE) +ORG_PCF .EQU $ + #INCLUDE "pcf.asm" +SIZ_PCF .EQU $ - ORG_PCF + .ECHO "PCF occupies " + .ECHO SIZ_PCF .ECHO " bytes.\n" #ENDIF - +; #IF (DS7RTCENABLE) ORG_DS7RTC .EQU $ #INCLUDE "ds7rtc.asm" @@ -6031,12 +6425,21 @@ SIZ_VDU .EQU $ - ORG_VDU #IF (TMSENABLE) ORG_TMS .EQU $ #INCLUDE "tms.asm" -SIZ_TMS .EQU $ - ORG_TMS +SIZ_TMS .EQU $ - ORG_TMS .ECHO "TMS occupies " .ECHO SIZ_TMS .ECHO " bytes.\n" #ENDIF ; +#IF (SCONENABLE) +ORG_SCON .EQU $ + #INCLUDE "scon.asm" +SIZ_SCON .EQU $ - ORG_SCON + .ECHO "SCON occupies " + .ECHO SIZ_SCON + .ECHO " bytes.\n" +#ENDIF +; #IF (GDCENABLE) ORG_GDC .EQU $ #INCLUDE "gdc.asm" @@ -6046,6 +6449,15 @@ SIZ_GDC .EQU $ - ORG_GDC .ECHO " bytes.\n" #ENDIF ; +#IF (VRCENABLE) +ORG_VRC .EQU $ + #INCLUDE "vrc.asm" +SIZ_VRC .EQU $ - ORG_VRC + .ECHO "VRC occupies " + .ECHO SIZ_VRC + .ECHO " bytes.\n" +#ENDIF +; #IF (DMAENABLE) ORG_DMA .EQU $ #INCLUDE "dma.asm" @@ -6101,12 +6513,22 @@ FONTCGA: .ECHO " CGA" #ENDIF ; +#IFDEF USEFONTVGARC +FONTVGARC: + #IF USELZSA2 + #INCLUDE "fontvgarcc.asm" + #ELSE + #INCLUDE "fontvgarcu.asm" + #ENDIF + .ECHO " VGARC" +#ENDIF +; SIZ_FONTS .EQU $ - ORG_FONTS .ECHO " occupy " .ECHO SIZ_FONTS .ECHO " bytes.\n" ; -#IF (CVDUENABLE | VGAENABLE) | GDCENABLE | (TMSENABLE & ((TMSMODE == TMSMODE_MSXKBD) | (TMSMODE == TMSMODE_MBC))) +#IF (CVDUENABLE | VGAENABLE | GDCENABLE | VRCENABLE | (TMSENABLE & ((TMSMODE == TMSMODE_MSXKBD) | (TMSMODE == TMSMODE_MBC)))) ORG_KBD .EQU $ #INCLUDE "kbd.asm" SIZ_KBD .EQU $ - ORG_KBD @@ -6151,6 +6573,24 @@ SIZ_PPP .EQU $ - ORG_PPP .ECHO " bytes.\n" #ENDIF ; +#IF (CHENABLE) +ORG_CH .EQU $ + #INCLUDE "ch.asm" +SIZ_CH .EQU $ - ORG_CH + .ECHO "CH occupies " + .ECHO SIZ_CH + .ECHO " bytes.\n" +#ENDIF +; +#IF (ESPENABLE) +ORG_ESP .EQU $ + #INCLUDE "esp.asm" +SIZ_ESP .EQU $ - ORG_ESP + .ECHO "ESP occupies " + .ECHO SIZ_ESP + .ECHO " bytes.\n" +#ENDIF +; #IF (MDENABLE) ORG_MD .EQU $ #INCLUDE "md.asm" @@ -6214,6 +6654,33 @@ SIZ_HDSK .EQU $ - ORG_HDSK .ECHO " bytes.\n" #ENDIF ; +#IF (PPAENABLE) +ORG_PPA .EQU $ + #INCLUDE "ppa.asm" +SIZ_PPA .EQU $ - ORG_PPA + .ECHO "PPA occupies " + .ECHO SIZ_PPA + .ECHO " bytes.\n" +#ENDIF +; +#IF (IMMENABLE) +ORG_IMM .EQU $ + #INCLUDE "imm.asm" +SIZ_IMM .EQU $ - ORG_IMM + .ECHO "IMM occupies " + .ECHO SIZ_IMM + .ECHO " bytes.\n" +#ENDIF +; +#IF (SYQENABLE) +ORG_SYQ .EQU $ + #INCLUDE "syq.asm" +SIZ_SYQ .EQU $ - ORG_SYQ + .ECHO "SYQ occupies " + .ECHO SIZ_SYQ + .ECHO " bytes.\n" +#ENDIF +; #IF (TERMENABLE) ORG_TERM .EQU $ #INCLUDE "term.asm" @@ -6291,23 +6758,103 @@ SIZ_YM2612 .EQU $ - ORG_YM2612 #INCLUDE "mio.asm" #ENDIF ; -#IF (DSKYENABLE) -#DEFINE DSKY_KBD - #IF (DSKYMODE == DSKYMODE_V1) -#INCLUDE "dsky.asm" - #ENDIF - #IF (DSKYMODE == DSKYMODE_NG) -#INCLUDE "dskyng.asm" +; INCLUDE LZSA2 decompression engine if required. +; +#IF ((VGAENABLE | CVDUENABLE | TMSENABLE | GDCENABLE | VRCENABLE) & USELZSA2) +#INCLUDE "unlzsa2s.asm" +#ENDIF +; +;================================================================================================== +; FRONT PANEL SUPPORT +;================================================================================================== +; +; FRONT PANEL HARDWARE DETECTION +; +; WE ARE REALLY JUST CHECKING FOR SWITCHES. NO WAY TO QUERY FOR +; LEDS. WE CHECK FOR I/O CONFLICT WITH VGARC IF ACTIVE. +; +FP_DETECT: + ; D: LEDS ACTIVE, E: SWITCHES ACTIVE + LD D,TRUE ; ASSUME ACTIVE FOR NOW + LD E,TRUE ; ASSUME ACTIVE FOR NOW +; + ; IF VGARC IS ENABLED, CHECK IF IT IS ACTIVE. IF SO AND THE + ; I/O PORTS CONFLICT, DEACTIVATE FRONT PANEL. +; + #IF (VRCENABLE) + LD A,(VRC_ACTIVE) ; GET VGARC ACTIVE STATUS + OR A ; SET FLAGS + JR Z,FP_DETECT1 ; IF NO, CONTINUE + #IF ((FPLED_IO >= $00) & (FPLED_IO <= $0F)) + ; CONFLICT, DEACTIVATE LEDS + LD D,FALSE ; FP LEDS NOT ACTIVE + #ENDIF + #IF ((FPSW_IO >= $00) & (FPSW_IO <= $0F)) + ; CONFLICT, DEACTIVATE SWITCHES + LD E,FALSE ; FP SWITCHES NOT ACTIVE + #ENDIF #ENDIF +; +FP_DETECT1: + ; THE SWITCH HARDWARE MAY OR MAY NOT BE INSTALLED. SO, HERE WE + ; ATTEMPT TO CONFIRM WE HAVE A VALID PORT. CREDIT TO STEPHEN + ; COUSINS FOR THIS APPROACH. + LD C,FPSW_IO ; ADR OF SWITCH PORT + IN C,(C) ; READ IT USING IN (C) + IN A,(FPSW_IO) ; READ IT USING IN (PORT) + CP C ; PORT FLOATING ON MISMATCH + JR NZ,FP_DETECT2 ; NO H/W, SET FLAG + CP $FF ; PORT FLOATING ON $FF + JR Z,FP_DETECT2 ; NO H/W, SET FLAG + JR FP_DETECTZ ; H/W EXISTS, DONE +; +FP_DETECT2: + LD E,FALSE ; RECORD NOT PRESENT +; +FP_DETECTZ: + LD (FP_ACTIVE),DE ; RECORD RESULTS + RET ; DONE +; +#IF (FPLED_ENABLE) +; +; SET FRONT PANEL LEDS FROM VALUE IN A +; +FP_SETLEDS: + PUSH HL ; SAVE HL + LD L,A ; LED VALUE TO L + LD A,(FPLED_ACTIVE) ; LEDS ACTIVE? + OR A ; SET FLAGS + LD A,L ; RESTORE REG A + JR Z,FP_SETLEDS1 ; BAIL OUT IF NOT ACTIVE + OUT (FPLED_IO),A ; WRITE +FP_SETLEDS1: + POP HL ; RESTORE HL + RET ; DONE +; +; #ENDIF ; -; INCLUDE LZSA2 decompression engine if required. +#IF (FPSW_ENABLE) +; +; GET FRONT PANEL SWITCH SETTINGS +; +FP_GETSWITCHES: + LD A,(FPSW_ACTIVE) ; SWITCHES ACTIVE? + OR A ; SET FLAGS + RET Z ; BAIL OUT IF NOT ACTIVE + IN A,(FPSW_IO) ; READ SWITCHES + RET ; DONE +; ; -#IF ((VGAENABLE | CVDUENABLE | TMSENABLE | GDCENABLE) & USELZSA2) -#INCLUDE "unlzsa2s.asm" #ENDIF ; -; DETECT CPU SPEED USING DS-1302 RTC +FP_ACTIVE: +FPSW_ACTIVE .DB TRUE +FPLED_ACTIVE .DB TRUE +; +;================================================================================================== +; CPU SPEED DETECTION USING DS-1302 RTC +;================================================================================================== ; HB_CPUSPD: ; @@ -6423,116 +6970,6 @@ HB_CPUSPD2: OR $FF ; SIGNAL ERROR RET ; AND DONE ; -; SYSTEM CHECK: DUMP MACHINE STATE AND CONTINUE? -; -SYSCHKA: - ; CHECK DIAG LEVEL TO SEE IF WE SHOULD DISPLAY - PUSH AF ; PRESERVE INCOMING AF VALUE - LD A,(CB_DIAGLVL) ; GET DIAGNOSTIC LEVEL - CP DL_ERROR ; >= ERROR LEVEL - JR C,SYSCHK1 ; IF NOT, GO HOME - POP AF ; RESTORE INCOMING AF VALUE -; - ; DISPLAY SYSCHK MESSAGE - PUSH DE ; PRESERVE DE VALUE - LD DE,STR_SYSCHK ; POINT TO PREFIX STRING - CALL WRITESTR ; PRINT IT - POP DE ; RESTORE DE VALUE - CALL XREGDMP ; DUMP REGISTERS - - ; DISPLAY ERROR CODE. IT IS AT RETURN ADDRESS+1 .. LD A,XX - EX (SP),HL ; GET RETURN ADDRESS - INC HL ; POINT TO THE ERROR CODE - PUSH AF - LD A,(HL) ; DISPLAY - CALL PRTHEXBYTE - POP AF - DEC HL ; RESTORE RETURN ADDRESS - EX (SP),HL -; - JR CONTINUE ; CHECK W/ USER -; -SYSCHK1: - ; RETURN IF MESSAGING BYPASSED BY DIAG LEVEL - POP AF - RET -; -; PANIC: DUMP MACHINE STATE AND HALT -; -PANIC: - PUSH DE - LD DE,STR_PANIC - CALL WRITESTR - POP DE - CALL XREGDMP ; DUMP REGISTERS - JR SYSHALT ; FULL STOP -; -; -; -CONTINUE: - PUSH AF -CONTINUE1: - PUSH DE - LD DE,STR_CONTINUE - CALL WRITESTR - POP DE - CALL CIN - RES 5,A ; FORCE UPPERCASE (IMPERFECTLY) - CALL COUT ; ECHO - CP 'Y' - JR Z,CONTINUE3 - CP 'N' - JR Z,SYSHALT - JR CONTINUE1 -CONTINUE3: - CALL NEWLINE - POP AF - RET -; -; -; -SYSHALT: - LD DE,STR_HALT - CALL WRITESTR - DI - HALT -; -; PRINT VALUE OF HL AS THOUSANDTHS, IE. 0.000 -; -PRTD3M: - PUSH BC - PUSH DE - PUSH HL - LD E,'0' - LD BC,-10000 - CALL PRTD3M1 - LD E,0 - LD BC,-1000 - CALL PRTD3M1 - CALL PC_PERIOD - LD BC,-100 - CALL PRTD3M1 - LD C,-10 - CALL PRTD3M1 - LD C,-1 - CALL PRTD3M1 - POP HL - POP DE - POP BC - RET -PRTD3M1: - LD A,'0' - 1 -PRTD3M2: - INC A - ADD HL,BC - JR C,PRTD3M2 - SBC HL,BC - CP E - JR Z,PRTD3M3 - LD E,0 - CALL COUT -PRTD3M3: - RET ;================================================================================================== ; DISPLAY SUMMARY OF ATTACHED UNITS/DEVICES ;================================================================================================== @@ -6594,7 +7031,7 @@ PS_DISK: ; ; DEVICE COLUMN LD B,BF_DIODEVICE ; FUNC=GET DEVICE INFO, UNIT NUM STILL IN C - RST 08 ; DE:=DEVTYP/NUM, H:=DISK ATTRIBUTES + RST 08 ; DE:=DEVTYP/NUM, C:=DISK ATTRIBUTES PUSH BC ; SAVE ATTRIBUTES LD HL,PS_DDMD ; POINT TO DISK DEVICE TYPE NAME TABLE CALL PS_PRTDEV ; PRINT DISK DEVICE NMEMONIC PADDED TO FIELD WIDTH @@ -6615,10 +7052,9 @@ PS_PRTDT: BIT 7,A ; FLOPPY BIT SET? LD HL,PS_DTFLOP ; ASSUME FLOPPY JP NZ,PS_PRT18 ; IF FLOPPY, JUMP AHEAD - LD C,E LD DE,PS_DTHARD - LD A,00111000B + LD A,00001111B CALL PRTIDXMSK CALL PS_PAD18 ; PAD TO 18 SPACES RET @@ -6630,10 +7066,7 @@ PS_PRTDC: LD A,E ; ATTRIBUTE TO ACCUM BIT 7,A ; TEST FOR FLOPPY JR NZ,PS_PRTDC2 ; HANDLE FLOPPY - RRCA ; ISOLATE TYPE BITS - RRCA - RRCA - AND $07 + AND $0F ; ISOLATE TYPE BITS CP 4 ; ROM DISK? JR Z,PS_PRTDC1 ; PRINT CAPACITY IN KB CP 5 ; RAM DISK? @@ -6648,7 +7081,6 @@ PS_PRTDC: RES 7,D ; CLEAR LBA BIT LD B,11 ; 11 BIT SHIFT TO CONVERT BLOCKS --> MB CALL SRL32 ; RIGHT SHIFT - ;CALL PRTDEC ; PRINT LOW WORD IN DECIMAL (HIGH WORD DISCARDED) CALL PRTDEC32 ; PRINT DWORD IN DECIMAL PRTS("MB$") ; PRINT SUFFIX CALL PC_COMMA @@ -6663,7 +7095,6 @@ PS_PRTDC1: RES 7,D ; CLEAR LBA BIT LD B,1 ; 11 BIT SHIFT TO CONVERT BLOCKS --> MB CALL SRL32 ; RIGHT SHIFT - ;CALL PRTDEC ; PRINT LOW WORD IN DECIMAL (HIGH WORD DISCARDED) CALL PRTDEC32 ; PRINT DWORD IN DECIMAL PRTS("KB$") ; PRINT SUFFIX CALL PC_COMMA @@ -6673,15 +7104,15 @@ PS_PRTDC1: PS_PRTDC2: LD C,E ; ATTRIBUTE TO C FOR SAFE KEEPING ; - LD A,01100000B ; DISPLAY FORM FACTOR + LD A,%00011000 ; DISPLAY FORM FACTOR LD DE,PS_FLP_FSTR ; WHICH IS DEFINED IN CALL PRTIDXMSK ; BITS 5 AND 6. ; - LD A,00010000B ; DISPLAY SIDES + LD A,%00000100 ; DISPLAY SIDES LD DE,PS_FLP_SSTR ; WHICH IS DEFINED CALL PRTIDXMSK ; IN BIT 4 ; - LD A,00001100B ; DISPLAY DENSITY + LD A,%00000011 ; DISPLAY DENSITY LD DE,PS_FLP_DSTR ; WHICH IS DEFINED IN CALL PRTIDXMSK ; BITS 2 AND 3. ; @@ -6829,7 +7260,7 @@ PS_PRTSC1: RET ; PS_PRTSC2: - PRTS("PropTerm$") ; ASSUME PROPELLER + PRTS("Term Module$") CALL PC_COMMA PRTS("ANSI$") RET @@ -6917,10 +7348,9 @@ PS_SOUND: LD E,BF_SNDQ_DEV RST 08 PUSH BC - LD C,B - LD A,11110000B ; TYPE IS IN UPPER NIBBLE + LD A,B LD DE,PS_SDSN76489 - CALL PRTIDXMSK + CALL PRTIDXDEA CALL PS_PAD18 POP BC ; @@ -6945,9 +7375,8 @@ PS_SOUND: ; PS_PRTDEV: EX DE,HL - LD C,H - LD A,11110000B ; TYPE IS IN UPPER NIBBLE - CALL PRTIDXMSK + LD A,H ; TYPE ID + CALL PRTIDXDEA ; PRINT TYPE LABEL LD A,L ; UNIT NUMBER CALL PRTDECB ; PRINT NUM, ASSUME 1 CHAR CALL PC_COLON ; PRINT COLON @@ -7020,6 +7449,11 @@ PS_DDSD .TEXT "SD$" PS_DDPRPSD .TEXT "PRPSD$" PS_DDPPPSD .TEXT "PPPSD$" PS_DDHDSK .TEXT "HDSK$" +PS_DDPPA .TEXT "PPA$" +PS_DDIMM .TEXT "IMM$" +PS_DDSYQ .TEXT "SYQ$" +PS_DDCHUSB .TEXT "CHUSB$" +PS_DDCHSD .TEXT "CHSD$" ; ; DISK TYPE STRINGS ; @@ -7032,6 +7466,8 @@ PS_DTROM .TEXT "ROM Disk$" PS_DTRAM .TEXT "RAM Disk$" PS_DTRF .TEXT "RAM Floppy$" PS_DTFSH .TEXT "Flash Drive$" +PS_DTCD .TEXT "CD-ROM$" +PS_DTCRT .TEXT "Cartridge$" PS_DTOTHER .TEXT "???$" ; ; FLOPPY ATTRIBUTE STRINGS @@ -7063,6 +7499,9 @@ PS_SDUF .TEXT "UF$" PS_SDDUART .TEXT "DUART$" PS_SDZ2U .TEXT "Z2U$" PS_SDLPT .TEXT "LPT$" +PS_SDESPCON .TEXT "ESPCON$" +PS_SDESPSER .TEXT "ESPSER$" +PS_SDSCON .TEXT "SCON$" ; ; CHARACTER SUB TYPE STRINGS ; @@ -7086,6 +7525,7 @@ PS_VDCVDU .TEXT "CVDU$" PS_VDGDC .TEXT "GDC$" PS_VDTMS .TEXT "TMS$" PS_VDVGA .TEXT "VGA$" +PS_VDVRC .TEXT "VRC$" ; ; VIDEO TYPE STRINGS ; @@ -7225,7 +7665,7 @@ CST2: RET ; ;================================================================================================== -; MISCELLANEOUS UTILITY FUNCTIONS +; INTERNAL UTILITY FUNCTIONS ;================================================================================================== ; ; SET HL TO IY+A, A IS TRASHED @@ -7262,6 +7702,117 @@ HB_CHS2LBA: XOR A RET ; +; SYSTEM CHECK: DUMP MACHINE STATE AND CONTINUE? +; +SYSCHKA: + ; CHECK DIAG LEVEL TO SEE IF WE SHOULD DISPLAY + PUSH AF ; PRESERVE INCOMING AF VALUE + LD A,(CB_DIAGLVL) ; GET DIAGNOSTIC LEVEL + CP DL_ERROR ; >= ERROR LEVEL + JR C,SYSCHK1 ; IF NOT, GO HOME + POP AF ; RESTORE INCOMING AF VALUE +; + ; DISPLAY SYSCHK MESSAGE + PUSH DE ; PRESERVE DE VALUE + LD DE,STR_SYSCHK ; POINT TO PREFIX STRING + CALL WRITESTR ; PRINT IT + POP DE ; RESTORE DE VALUE + CALL XREGDMP ; DUMP REGISTERS + + ; DISPLAY ERROR CODE. IT IS AT RETURN ADDRESS+1 .. LD A,XX + EX (SP),HL ; GET RETURN ADDRESS + INC HL ; POINT TO THE ERROR CODE + PUSH AF + LD A,(HL) ; DISPLAY + CALL PRTHEXBYTE + POP AF + DEC HL ; RESTORE RETURN ADDRESS + EX (SP),HL +; + JR CONTINUE ; CHECK W/ USER +; +SYSCHK1: + ; RETURN IF MESSAGING BYPASSED BY DIAG LEVEL + POP AF + RET +; +; PANIC: DUMP MACHINE STATE AND HALT +; +PANIC: + PUSH DE + LD DE,STR_PANIC + CALL WRITESTR + POP DE + CALL XREGDMP ; DUMP REGISTERS + JR SYSHALT ; FULL STOP +; +; +; +CONTINUE: + PUSH AF +CONTINUE1: + PUSH DE + LD DE,STR_CONTINUE + CALL WRITESTR + POP DE + CALL CIN + RES 5,A ; FORCE UPPERCASE (IMPERFECTLY) + CALL COUT ; ECHO + CP 'Y' + JR Z,CONTINUE3 + CP 'N' + JR Z,SYSHALT + JR CONTINUE1 +CONTINUE3: + CALL NEWLINE + POP AF + RET +; +; +; +SYSHALT: + LD DE,STR_HALT + CALL WRITESTR + DI + HALT +; +; PRINT VALUE OF HL AS THOUSANDTHS, IE. 0.000 +; +PRTD3M: + PUSH BC + PUSH DE + PUSH HL + LD E,'0' + LD BC,-10000 + CALL PRTD3M1 + LD E,0 + LD BC,-1000 + CALL PRTD3M1 + CALL PC_PERIOD + LD BC,-100 + CALL PRTD3M1 + LD C,-10 + CALL PRTD3M1 + LD C,-1 + CALL PRTD3M1 + POP HL + POP DE + POP BC + RET +PRTD3M1: + LD A,'0' - 1 +PRTD3M2: + INC A + ADD HL,BC + JR C,PRTD3M2 + SBC HL,BC + CP E + JR Z,PRTD3M3 + LD E,0 + CALL COUT +PRTD3M3: + RET +; ;================================================================================================== ; HBIOS GLOBAL DATA ;================================================================================================== @@ -7287,22 +7838,17 @@ HB_BOOT_REC .DB 0 ; BOOT MODE (0=NORMAL, 1=RECOVERY MODE) ; STR_BANNER .DB "RomWBW HBIOS v", BIOSVER, ", ", TIMESTAMP, "$" STR_PLATFORM .DB PLATFORM_NAME, "$" -STR_SWITCH .DB "*** Activating CRT Console ***$" +;STR_SWITCH .DB "*** Activating CRT Console ***$" +STR_CONSOLE .DB "\r\n\r\n Console on Unit #$" STR_BADINT .DB "\r\n*** BAD INT ***\r\n$" STR_LOWBAT .DB "\r\n\r\n+++ LOW BATTERY +++$" ; STR_PANIC .TEXT "\r\n>>> PANIC: $" STR_SYSCHK .TEXT "\r\n>>> SYSCHK: $" STR_CONTINUE .TEXT "\r\nContinue (Y/N)? $" -STR_RESTART .TEXT "\r\n\r\n>>> Press hardware reset button to restart system\r\n\r\n$" ; #IF (DSKYENABLE) ; 'H','B','I','O',' ',' ',' ',' ' - #IF (DSKYMODE == DSKYMODE_V1) -MSG_HBVER .DB $3E,$7F,$0A,$7B,$00,$00,$00,$00 ; "HBIO " - #ENDIF - #IF (DSKYMODE == DSKYMODE_NG) MSG_HBVER .DB $76,$7F,$30,$3F,$00,$00,$00,$00 ; "HBIO " - #ENDIF #ENDIF ; HB_APPBNK .DB 0 ; START BANK WHEN RUN IN APP MODE @@ -7311,11 +7857,101 @@ HB_CURSEC .DB 0 ; CURRENT SECOND (TEMP) ; HB_BCDTMP .FILL 5,0 ; BCD NUMBER STORAGE (TEMP) ; +HB_BOOTCON .DB 0 ; INITIAL BOOT CONSOLE SAVE AREA +HB_BOOTCFG .DW 0 ; CONSOLE CONFIG SAVE AREA +HB_NEWCON .DB 0 ; NEW CONSOLE TO SWITCH TO +; +#IF (SUPCTS) HB_BOOTCONSAV .DB 0 ; INITIAL BOOT CONSOLE SAVE AREA HB_CONCFGSAV .DW 0 ; CONSOLE CONFIG SAVE AREA +#ENDIF +; +HB_HASFP .DB 0 ; NON-ZERO MEANS FP EXISTS ; HB_WRKBUF .FILL 512,0 ; INTERNAL DISK BUFFER ; +; +; +#IFDEF MG014_MAP +; + ; ALIGN TO 32 BYTE BOUNDARY + ALIGN($20) +; +MG014_STATMAPLO: + ; LOWER NIBBLE + .DB $08 ; 00 + .DB $0C ; 01 + .DB $00 ; 02 + .DB $04 ; 03 + .DB $0A ; 04 + .DB $0E ; 05 + .DB $02 ; 06 + .DB $06 ; 07 + .DB $09 ; 08 + .DB $0D ; 09 + .DB $01 ; 0A + .DB $05 ; 0B + .DB $0B ; 0C + .DB $0F ; 0D + .DB $03 ; 0E + .DB $07 ; 0F +; +MG014_STATMAPHI: + ; UPPER NIBBLE + .DB $80 ; 00 + .DB $C0 ; 01 + .DB $00 ; 02 + .DB $40 ; 03 + .DB $A0 ; 04 + .DB $E0 ; 05 + .DB $20 ; 06 + .DB $60 ; 07 + .DB $90 ; 08 + .DB $D0 ; 09 + .DB $10 ; 0A + .DB $50 ; 0B + .DB $B0 ; 0C + .DB $F0 ; 0D + .DB $30 ; 0E + .DB $70 ; 0F +; +#ENDIF +; +#IF (DSKYENABLE) +; +;================================================================================================== +; STORAGE +;================================================================================================== +; +; CODES FOR NUMERICS +; HIGH BIT ALWAYS CLEAR TO SUPPRESS DECIMAL POINT +; SET HIGH BIT TO SHOW DECIMAL POINT +; +DSKY_HEXMAP: + .DB $3F ; 0 + .DB $06 ; 1 + .DB $5B ; 2 + .DB $4F ; 3 + .DB $66 ; 4 + .DB $6D ; 5 + .DB $7D ; 6 + .DB $07 ; 7 + .DB $7F ; 8 + .DB $67 ; 9 + .DB $77 ; A + .DB $7C ; B + .DB $39 ; C + .DB $5E ; D + .DB $79 ; E + .DB $71 ; F +; +DSKY_BUF .FILL 8,0 +DSKY_BUFLEN .EQU $ - DSKY_BUF +DSKY_HEXBUF .FILL 4,0 +DSKY_HEXBUFLEN .EQU $ - DSKY_HEXBUF +; +#ENDIF +; HB_END .EQU $ ; SLACK .EQU BNKTOP - $ diff --git a/Source/HBIOS/hbios.inc b/Source/HBIOS/hbios.inc index 1b858342..7cfec1e6 100644 --- a/Source/HBIOS/hbios.inc +++ b/Source/HBIOS/hbios.inc @@ -36,7 +36,16 @@ BF_RTCGETALM .EQU BF_RTC + 6 ; GET ALARM BF_RTCSETALM .EQU BF_RTC + 7 ; SET ALARM BF_RTCDEVICE .EQU BF_RTC + 8 ; RTC DEVICE INFO REPORT ; -BF_EMU .EQU $30 ; DEPRECATED +BF_DSKY .EQU $30 +BF_DSKYRESET .EQU BF_DSKY + 0 ; RESET DSKY HARDWARE +BF_DSKYSTAT .EQU BF_DSKY + 1 ; GET KEYPAD STATUS +BF_DSKYGETKEY .EQU BF_DSKY + 2 ; GET KEY FROM KEYPAD +BF_DSKYSHOWHEX .EQU BF_DSKY + 3 ; DISPLAY BINARY VALUE IN HEX +BF_DSKYSHOWSEG .EQU BF_DSKY + 4 ; DISPLAY ENCODED SEGMENT STRING +BF_DSKYKEYLEDS .EQU BF_DSKY + 5 ; SET/CLEAR KEYPAD LEDS +BF_DSKYSTATLED .EQU BF_DSKY + 6 ; SET/CLEAR STATUS LEDS +BF_DSKYBEEP .EQU BF_DSKY + 7 ; BEEP ONBOARD DSKY SPEAKER +BF_DSKYDEVICE .EQU BF_DSKY + 8 ; DSKY DEVICE INFO REPORT ; BF_VDA .EQU $40 BF_VDAINI .EQU BF_VDA + 0 ; INITIALIZE VDU @@ -98,6 +107,7 @@ BF_SYSGET_CIOFN .EQU $01 ; GET CIO UNIT FN/DATA ADR BF_SYSGET_DIOCNT .EQU $10 ; GET DISK UNIT COUNT BF_SYSGET_DIOFN .EQU $11 ; GET DIO UNIT FN/DATA ADR BF_SYSGET_RTCCNT .EQU $20 ; GET RTC UNIT COUNT +BF_SYSGET_DSKYCNT .EQU $30 ; GET DSKY UNIT COUNT BF_SYSGET_VDACNT .EQU $40 ; GET VDA UNIT COUNT BF_SYSGET_VDAFN .EQU $41 ; GET VDA UNIT FN/DATA ADR BF_SYSGET_SNDCNT .EQU $50 ; GET VDA UNIT COUNT @@ -109,11 +119,13 @@ BF_SYSGET_CPUINFO .EQU $F0 ; GET CPU INFORMATION BF_SYSGET_MEMINFO .EQU $F1 ; GET MEMORY CAPACTITY INFO BF_SYSGET_BNKINFO .EQU $F2 ; GET BANK ASSIGNMENT INFO BF_SYSGET_CPUSPD .EQU $F3 ; GET CLOCK SPEED & WAIT STATES +BF_SYSGET_PANEL .EQU $F4 ; GET FRONT PANEL SWITCHES VAL ; BF_SYSSET_TIMER .EQU $D0 ; SET TIMER VALUE BF_SYSSET_SECS .EQU $D1 ; SET SECONDS VALUE BF_SYSSET_BOOTINFO .EQU $E0 ; SET BOOT INFORMATION BF_SYSSET_CPUSPD .EQU $F3 ; SET CLOCK SPEED & WAIT STATES +BF_SYSSET_PANEL .EQU $F4 ; SET FRONT PANEL LEDS ; BF_SYSINT_INFO .EQU $00 ; GET INTERRUPT SYSTEM INFO BF_SYSINT_GET .EQU $10 ; GET INT VECTOR ADDRESS @@ -137,6 +149,12 @@ PLT_DYNO .EQU 11 ; DYNO MICRO-ATX MOTHERBOARD PLT_RCZ280 .EQU 12 ; RCBUS W/ Z280 PLT_MBC .EQU 13 ; MULTI BOARD COMPUTER PLT_RPH .EQU 14 ; RHYOPHYRE GRAPHICS COMPUTER +PLT_Z80RETRO .EQU 15 ; Z80 RETRO COMPUTER +PLT_S100 .EQU 16 ; S100 COMPUTERS Z180 SYSTEM +PLT_DUO .EQU 17 ; DUODYNE Z80 SYSTEM +PLT_HEATH .EQU 18 ; HEATHKIT H8 Z80 SYSTEM +PLT_EPITX .EQU 19 ; Z180 MINI-ITX +PLT_MON .EQU 20 ; MONSPUTER ; ; HBIOS GLOBAL ERROR RETURN VALUES ; @@ -261,6 +279,15 @@ DIAG_08 .EQU 11111111B ; ON DIAG_09 .EQU 11111111B ; ON #ENDIF ; +; FRONT PANEL SWITCHES +; +SW_CRT .EQU %10000000 ; CRT/SER CONSOLE +SW_SEC .EQU %01000000 ; SEC/PRI CONSOLE +SW_AUTO .EQU %00100000 ; AUTO/MENU BOOT +SW_DISK .EQU %00010000 ; DISK/ROM +SW_FLOP .EQU %00001000 ; FLOP/HD +SW_OPT .EQU %00000111 ; SLICE/ROM APP +; ; MEDIA ID VALUES ; MID_NONE .EQU 0 @@ -278,17 +305,20 @@ MID_HDNEW .EQU 10 ; CHAR DEVICE IDS ; CIODEV_UART .EQU $00 -CIODEV_ASCI .EQU $10 -CIODEV_TERM .EQU $20 -CIODEV_PRPCON .EQU $30 -CIODEV_PPPCON .EQU $40 -CIODEV_SIO .EQU $50 -CIODEV_ACIA .EQU $60 -CIODEV_PIO .EQU $70 -CIODEV_UF .EQU $80 -CIODEV_DUART .EQU $90 -CIODEV_Z2U .EQU $A0 -CIODEV_LPT .EQU $B0 +CIODEV_ASCI .EQU $01 +CIODEV_TERM .EQU $02 +CIODEV_PRPCON .EQU $03 +CIODEV_PPPCON .EQU $04 +CIODEV_SIO .EQU $05 +CIODEV_ACIA .EQU $06 +CIODEV_PIO .EQU $07 +CIODEV_UF .EQU $08 +CIODEV_DUART .EQU $09 +CIODEV_Z2U .EQU $0A +CIODEV_LPT .EQU $0B +CIODEV_ESPCON .EQU $0C +CIODEV_ESPSER .EQU $0D +CIODEV_SCON .EQU $0E ; ; SUB TYPES OF CHAR DEVICES ; @@ -300,40 +330,82 @@ CIODEV_LPT .EQU $B0 ; DISK DEVICE IDS ; DIODEV_MD .EQU $00 -DIODEV_FD .EQU $10 -DIODEV_RF .EQU $20 -DIODEV_IDE .EQU $30 -DIODEV_ATAPI .EQU $40 -DIODEV_PPIDE .EQU $50 -DIODEV_SD .EQU $60 -DIODEV_PRPSD .EQU $70 -DIODEV_PPPSD .EQU $80 -DIODEV_HDSK .EQU $90 +DIODEV_FD .EQU $01 +DIODEV_RF .EQU $02 +DIODEV_IDE .EQU $03 +DIODEV_ATAPI .EQU $04 +DIODEV_PPIDE .EQU $05 +DIODEV_SD .EQU $06 +DIODEV_PRPSD .EQU $07 +DIODEV_PPPSD .EQU $08 +DIODEV_HDSK .EQU $09 +DIODEV_PPA .EQU $0A +DIODEV_IMM .EQU $0B +DIODEV_SYQ .EQU $0C +DIODEV_CHUSB .EQU $0D +DIODEV_CHSD .EQU $0E ; ; RTC DEVICE IDS ; RTCDEV_DS .EQU $00 ; DS1302 -RTCDEV_BQ .EQU $10 ; BQ4845P -RTCDEV_SIMH .EQU $20 ; SIMH -RTCDEV_INT .EQU $30 ; PERIODIC INT TIMER -RTCDEV_DS7 .EQU $40 ; DS1307 (I2C) -RTCDEV_RP5 .EQU $50 ; RP5C01 +RTCDEV_BQ .EQU $01 ; BQ4845P +RTCDEV_SIMH .EQU $02 ; SIMH +RTCDEV_INT .EQU $03 ; PERIODIC INT TIMER +RTCDEV_DS7 .EQU $04 ; DS1307 (I2C) +RTCDEV_RP5 .EQU $05 ; RP5C01 +; +; DSKY DEVICE IDS +; +DSKYDEV_ICM .EQU $00 ; Intersil ICM7218 +DSKYDEV_PKD .EQU $01 ; Intel P8279 +DSKYDEV_H8P .EQU $02 ; Heath H8 Panel ; ; VIDEO DEVICE IDS ; VDADEV_VDU .EQU $00 ; ECB VDU - MOTOROLA 6545 -VDADEV_CVDU .EQU $10 ; ECB COLOR VDU - MOS 8563 -VDADEV_GDC .EQU $20 ; GRAPHICS DISPLAY CTLR - UPD7220 -VDADEV_TMS .EQU $30 ; N8 ONBOARD VDA SUBSYSTEM - TMS 9918 -VDADEV_VGA .EQU $40 ; ECB VGA3 - HITACHI HD6445 -;VDADEV_V9958 .EQU $50 ; V9958 VDU +VDADEV_CVDU .EQU $01 ; ECB COLOR VDU - MOS 8563 +VDADEV_GDC .EQU $02 ; GRAPHICS DISPLAY CTLR - UPD7220 +VDADEV_TMS .EQU $03 ; N8 ONBOARD VDA SUBSYSTEM - TMS 9918 +VDADEV_VGA .EQU $04 ; ECB VGA3 - HITACHI HD6445 +VDADEV_VRC .EQU $05 ; VGARC ; ; SOUND DEVICE IDS ; SNDDEV_SN76489 .EQU $00 -SNDDEV_AY38910 .EQU $10 -SNDDEV_BITMODE .EQU $20 -SNDDEV_YM2612 .EQU $30 +SNDDEV_AY38910 .EQU $01 +SNDDEV_BITMODE .EQU $02 +SNDDEV_YM2612 .EQU $03 +; +; DSKY KEYS +; +KY_0 .EQU $00 +KY_1 .EQU $01 +KY_2 .EQU $02 +KY_3 .EQU $03 +KY_4 .EQU $04 +KY_5 .EQU $05 +KY_6 .EQU $06 +KY_7 .EQU $07 +KY_8 .EQU $08 +KY_9 .EQU $09 +KY_A .EQU $0A +KY_B .EQU $0B +KY_C .EQU $0C +KY_D .EQU $0D +KY_E .EQU $0E +KY_F .EQU $0F +KY_FW .EQU $10 ; FORWARD +KY_BK .EQU $11 ; BACKWARD +KY_CL .EQU $12 ; CLEAR +KY_EN .EQU $13 ; ENTER +KY_DE .EQU $14 ; DEPOSIT +KY_EX .EQU $15 ; EXAMINE +KY_GO .EQU $16 ; GO +KY_BO .EQU $17 ; BOOT +KY_F4 .EQU $18 ; F4 +KY_F3 .EQU $19 ; F3 +KY_F2 .EQU $1A ; F2 +KY_F1 .EQU $1B ; F1 ; ; HBIOS CONTROL BLOCK OFFSETS ; WARNING: THESE OFFSETS WILL CHANGE SIGNIFICANTLY BETWEEN RELEASES @@ -365,9 +437,9 @@ HCB_BIDUSR .EQU $D9 ; USER BANK (TPA) HCB_BIDBIOS .EQU $DA ; BIOS BANK (HBIOS, UBIOS) HCB_BIDAUX .EQU $DB ; AUX BANK (BPBIOS) HCB_BIDRAMD0 .EQU $DC ; FIRST BANK OF RAM DRIVE -HCB_BIDRAMDN .EQU $DD ; LAST BANK OF RAM DRIVE +HCB_RAMD_BNKS .EQU $DD ; RAM DRIVE BANK COUNT HCB_BIDROMD0 .EQU $DE ; FIRST BANK OF ROM DRIVE -HCB_BIDROMDN .EQU $DF ; LAST BANK OF ROM DRIVE +HCB_ROMD_BNKS .EQU $DF ; ROM DRIVE BANK COUNT ; ; HBIOS PROXY COMMON DATA BLOCK ; EXACTLY 32 BYTES AT $FFE0-$FFFF diff --git a/Source/HBIOS/hbios_env.asm b/Source/HBIOS/hbios_env.asm index 92b81ca3..6d551d03 100644 --- a/Source/HBIOS/hbios_env.asm +++ b/Source/HBIOS/hbios_env.asm @@ -24,8 +24,9 @@ ; ; Print all desired config values... ; - prtval("ROMSIZE$", ROMSIZE) prtval("CPUFAM$", CPUFAM) + prtval("ROMSIZE$", ROMSIZE) + prtval("RAMSIZE$", RAMSIZE) ; ret ; diff --git a/Source/HBIOS/hdsk.asm b/Source/HBIOS/hdsk.asm index 172595a6..2fa6fddf 100644 --- a/Source/HBIOS/hdsk.asm +++ b/Source/HBIOS/hdsk.asm @@ -21,6 +21,12 @@ HDSK_CFGSIZ .EQU 6 ; SIZE OF CFG TBL ENTRIES HDSK_DEV .EQU 0 ; OFFSET OF DEVICE NUMBER (BYTE) HDSK_STAT .EQU 1 ; OFFSET OF STATUS (BYTE) HDSK_LBA .EQU 2 ; OFFSET OF LBA (DWORD) +; + .ECHO "HDSK: IO=" + .ECHO HDSK_IO + .ECHO ", DEVICE COUNT=" + .ECHO HDSK_DEVCNT + .ECHO "\n" ; HDSK_CFGTBL: ; DEVICE 0 @@ -166,7 +172,7 @@ HDSK_GEOM: HDSK_DEVICE: LD D,DIODEV_HDSK ; D := DEVICE TYPE LD E,(IY+HDSK_DEV) ; E := PHYSICAL DEVICE NUMBER - LD C,%00000000 ; C := ATTRIBUTES, NON-REMOVABLE HARD DISK + LD C,%00110000 ; C := ATTRIBUTES, NON-REMOVABLE HARD DISK LD H,0 ; H := 0, DRIVER HAS NO MODES LD L,HDSK_IO ; L := BASE I/O ADDRESS XOR A ; SIGNAL SUCCESS @@ -234,9 +240,11 @@ HDSK_RW0: LD (HDSK_RC),A ; CLEAR RETURN CODE ; #IF (DSKYENABLE) + #IF (DSKYDSKACT) LD A,HDSK_LBA CALL LDHLIYA CALL HB_DSKACT ; SHOW ACTIVITY + #ENDIF #ENDIF ; ; CONVERT LBA HHHH:LLLL (4 BYTES) diff --git a/Source/HBIOS/icm.asm b/Source/HBIOS/icm.asm new file mode 100644 index 00000000..79aab3fd --- /dev/null +++ b/Source/HBIOS/icm.asm @@ -0,0 +1,359 @@ +; +;================================================================================================== +; DSKY V1 ICM7218 (DISPLAY AND KEYBOARD) ROUTINES +;================================================================================================== +; +; THE ICM MAY COINCIDE ON THE SAME PPI BUS AS A PPISD. IT MAY NOT +; SHARE A PPI BUS WITH A PPIDE. SEE PPI_BUS.TXT FOR MORE INFORMATION. +; +; LED SEGMENTS (BIT VALUES) +; +; +--40--+ +; 02 20 +; +--04--+ +; 08 10 +; +--01--+ 80 +; +; ICM SCAN CODES ARE ONE BYTE: CCRRRRRR +; BITS 7-6 IDENTFY THE COLUMN OF THE KEY PRESSED +; BITS 5-0 ARE A BITMAP, WITH A BIT ON TO INDICATE ROW OF KEY PRESSED +; +; ____PC0________PC1________PC2________PC3____ +; PB5 | $20 [D] $60 [E] $A0 [F] $E0 [BO] +; PB4 | $10 [A] $50 [B] $90 [C] $D0 [GO] +; PB3 | $08 [7] $48 [8] $88 [9] $C8 [EX] +; PB2 | $04 [4] $44 [5] $84 [6] $C4 [DE] +; PB1 | $02 [1] $42 [2] $82 [3] $C2 [EN] +; PB0 | $01 [FW] $41 [0] $81 [BK] $C1 [CL] +; +; +ICM_PPIA .EQU ICMPPIBASE + 0 ; PORT A +ICM_PPIB .EQU ICMPPIBASE + 1 ; PORT B +ICM_PPIC .EQU ICMPPIBASE + 2 ; PORT C +ICM_PPIX .EQU ICMPPIBASE + 3 ; PPI CONTROL PORT +; +;__ICM_INIT__________________________________________________________________________________________ +; +; CONFIGURE PARALLEL PORT AND CLEAR KEYPAD BUFFER +;____________________________________________________________________________________________________ +; +ICM_PREINIT: + LD A,(DSKY_DISPACT) ; DSKY DISPATCHER ALREADY SET? + OR A ; SET FLAGS + RET NZ ; IF ALREADY ACTIVE, ABORT +; + OR $FF ; SIGNAL TO WAIT FOR KEY RELEASE + LD (ICM_KEYBUF),A ; SET IT +; + ; PPI PORT B IS NORMALLY SET TO INPUT, BUT HERE WE + ; TEMPORARILY SET IT TO OUTPUT. WHILE IN OUTPUT MODE, WE + ; WRITE A VALUE OF $FF WHICH WILL BE PERSISTED BY THE PPI + ; CHIP BUS HOLD CIRCUIT IF THERE IS NO ICM PRESENT. SO, + ; WE CAN SUBSEQUENTLY TEST FOR PPIB=$FF TO SEE IF THERE IS + ; NO ICM AND PREVENT PROBLEMS WITH PHANTOM ICM KEY PRESSES. + ; IF A ICM IS PRESENT, IT WILL SIMPLY OVERPOWER THE PPI + ; BUS HOLD CIRCUIT. + LD A,$80 ; PA OUT, PB OUT, PC OUT + OUT (ICM_PPIX),A + LD A,$FF ; SET PPIB=$FF, BUS HOLD + OUT (ICM_PPIB),A +; + LD A,$82 ; PA OUT, PB IN, PC OUT + OUT (ICM_PPIX),A +; + ;IN A,(ICM_PPIB) ; *DEBUG* + ;CALL PRTHEXBYTE ; *DEBUG* +; + IN A,(ICM_PPIB) ; READ PPIB + XOR $FF ; INVERT RESULT +; + CALL ICM_RESET +; + RET Z ; BAIL OUT NOW IF NOT PRESENT +; + ; RECORD HARDWARE PRESENT + LD A,$FF + LD (ICM_PRESENT),A +; + ; REGISTER DRIVER WITH HBIOS + LD BC,ICM_DISPATCH + CALL DSKY_SETDISP +; + RET +; +ICM_INIT: + CALL NEWLINE ; FORMATTING + PRTS("ICM:$") ; FORMATTING +; + PRTS(" IO=0x$") ; FORMATTING + LD A,ICMPPIBASE ; GET BASE PORT + CALL PRTHEXBYTE ; PRINT BASE PORT +; + LD A,(ICM_PRESENT) ; PRESENT? + OR A ; SET FLAGS + RET NZ ; YES, ALL DONE + PRTS(" NOT PRESENT$") ; NOT PRESENT +; + RET +; +; ICM DEVICE FUNCTION DISPATCH ENTRY +; A: RESULT (OUT), 0=OK, Z=OK, NZ=ERR +; B: FUNCTION (IN) +; +ICM_DISPATCH: + LD A,B ; GET REQUESTED FUNCTION + AND $0F ; ISOLATE SUB-FUNCTION + JP Z,ICM_RESET ; RESET DSKY HARDWARE + DEC A + JP Z,ICM_STAT ; GET KEYPAD STATUS + DEC A + JP Z,ICM_GETKEY ; READ A KEY FROM THE KEYPAD + DEC A + JP Z,ICM_SHOWHEX ; DISPLAY A 32-BIT BINARY VALUE IN HEX + DEC A + JP Z,ICM_SHOWSEG ; DISPLAY SEGMENTS + DEC A + JP Z,ICM_KEYLEDS ; SET KEYPAD LEDS + DEC A + JP Z,ICM_STATLED ; SET STATUS LED + DEC A + JP Z,ICM_BEEP ; BEEP DSKY SPEAKER + DEC A + JP Z,ICM_DEVICE ; DEVICE INFO + SYSCHKERR(ERR_NOFUNC) + RET +; +; +; +ICM_RESET: + PUSH AF + LD A,$70 ; PPISD AND 7218 INACTIVE + OUT (ICM_PPIC),A + POP AF + RET +; +; CHECK FOR KEY PRESS, SAVE RAW VALUE, RETURN STATUS +; +ICM_STAT: + LD A,(ICM_KEYBUF) ; GET CURRENT BUF VAL + CP $FF ; $FF MEANS WE ARE WAITING FOR PREV KEY TO BE RELEASED + JR Z,ICM_STAT1 ; CHECK FOR PREV KEY RELEASE + OR A ; DO WE HAVE A SCAN CODE BUFFERED ALREADY? + RET NZ ; IF SO, WE ARE DONE + JR ICM_STAT2 ; OTHERWISE, DO KEY CHECK + +ICM_STAT1: + ; WAITING FOR PREVIOUS KEY RELEASE + CALL ICM_KEY ; SCAN + JR Z,ICM_STAT2 ; IF ZERO, PREV KEY RELEASED, CONTINUE + XOR A ; SIGNAL NO KEY PRESSED + RET ; AND DONE + +ICM_STAT2: + CALL ICM_KEY ; SCAN + LD (ICM_KEYBUF),A ; SAVE RESULT + RET ; RETURN WITH ZF SET APPROPRIATELY +; +; WAIT FOR A ICM KEYPRESS AND RETURN +; +ICM_GETKEY: + CALL ICM_STAT ; CHECK STATUS + JR Z,ICM_GETKEY ; LOOP IF NOTHING READY + LD A,(ICM_KEYBUF) + LD B,24 ; SIZE OF DECODE TABLE + LD C,0 ; INDEX + LD HL,ICM_KEYMAP ; POINT TO BEGINNING OF TABLE +ICM_GETKEY1: + CP (HL) ; MATCH? + JR Z,ICM_GETKEY2 ; FOUND, DONE + INC HL + INC C ; BUMP INDEX + DJNZ ICM_GETKEY1 ; LOOP UNTIL EOT +ICM_GETKEY1A: + LD A,$FF ; NOT FOUND ERR, RETURN $FF + RET +ICM_GETKEY2: + LD A,$FF ; SET KEY BUF TO $FF + LD (ICM_KEYBUF),A ; DO IT + ; RETURN THE INDEX POSITION WHERE THE SCAN CODE WAS FOUND + LD E,C ; RETURN INDEX VALUE + XOR A ; SIGNAL SUCCESS + RET +; +; DISPLAY HEX VALUE FROM DE:HL +; +ICM_SHOWHEX: + LD BC,DSKY_HEXBUF ; POINT TO HEX BUFFER + CALL ST32 ; STORE 32-BIT BINARY THERE + LD HL,DSKY_HEXBUF ; FROM: BINARY VALUE (HL) + LD DE,DSKY_BUF ; TO: SEGMENT BUFFER (DE) + CALL DSKY_BIN2SEG ; CONVERT + LD HL,DSKY_BUF ; POINT TO SEGMENT BUFFER + ; AND FALL THRU TO DISPLAY IT +; +; ICM SHOW BUFFER +; HL: ADDRESS OF BUFFER +; +ICM_SHOWSEG: + LD A,82H ; SETUP PPI + OUT (ICM_PPIX),A + CALL ICM_COFF + LD A,$F0 ; 7218 -> (DATA COMING, NO DECODE) + OUT (ICM_PPIA),A + CALL ICM_STROBEC ; STROBE COMMAND + LD B,DSKY_BUFLEN ; NUMBER OF DIGITS + LD C,ICM_PPIA +ICM_HEXOUT2: + LD A,(HL) + CALL ICM_XLAT ; MAP SEGMENTS + XOR $80 ; FIX DOT POLARITY + OUT (C),A + INC HL + DEC B + JP Z,ICM_STROBE ; DO FINAL STROBE AND RETURN + CALL ICM_STROBE ; STROBE BYTE VALUE + JR ICM_HEXOUT2 +ICM_STROBEC: ; COMMAND STROBE + LD A,80H | 30H + JP ICM_STROBE0 +ICM_STROBE: ; DATA STROBE + LD A,00H | 30H ; SET WRITE STROBE +ICM_STROBE0: + OUT (ICM_PPIC),A ; OUT TO PORTC + CALL DLY2 ; DELAY +ICM_COFF: + LD A,40H | 30H ; QUIESCE + OUT (ICM_PPIC),A ; OUT TO PORTC + XOR A ; SIGNAL SUCCESS + RET +; +; +; +ICM_KEYLEDS: +ICM_STATLED: +ICM_BEEP: + XOR A ; PRETEND SUCCESS + RET +; +; DEVICE INFORMATION +; +ICM_DEVICE: + LD D,DSKYDEV_ICM ; D := DEVICE TYPE + LD E,0 ; E := PHYSICAL DEVICE NUMBER + LD H,0 ; H := MODE + LD L,ICMPPIBASE ; L := BASE I/O ADDRESS + XOR A ; SIGNAL SUCCESS + RET +; +;__ICM_KEY___________________________________________________________________________________________ +; +; CHECK FOR KEY PRESS W/ DEBOUNCE +;____________________________________________________________________________________________________ +; +ICM_KEY: + CALL ICM_SCAN ; INITIAL KEY PRESS SCAN + LD E,A ; SAVE INITIAL SCAN VALUE +ICM_KEY1: + ; MAX BOUNCE TIME FOR OMRON B3F IS 3MS + PUSH DE ; SAVE DE + LD DE,300 ; ~3MS DELAY + CALL VDELAY ; DO IT + CALL ICM_SCAN ; REPEAT SCAN + POP DE ; RESTORE DE + RET Z ; IF NOTHING PRESSED, DONE + CP E ; SAME? + JR ICM_KEY2 ; YES, READY TO RETURN + LD E,A ; OTHERWISE, SAVE NEW SCAN VAL + JR ICM_KEY1 ; AND LOOP UNTIL STABLE VALUE +ICM_KEY2: + OR A ; SET FLAGS BASED ON VALUE + RET ; AND DONE +; +;__ICM_SCAN__________________________________________________________________________________________ +; +; SCAN KEYPAD AND RETURN RAW SCAN CODE (RETURNS ZERO IF NO KEY PRESSED) +;____________________________________________________________________________________________________ +; +ICM_SCAN: + LD B,4 ; 4 COLUMNS + LD C,$01 ; FIRST COLUMN + LD E,0 ; INITIAL COL ID +ICM_SCAN1: + LD A,C ; COL TO A + OR $70 ; KEEP PPISD AND 7218 INACTIVE + OUT (ICM_PPIC),A ; ACTIVATE COL + IN A,(ICM_PPIB) ; READ ROW BITS + AND $3F ; MASK, WE ONLY HAVE 6 ROWS, OTHERS UNDEFINED + JR NZ,ICM_SCAN2 ; IF NOT ZERO, GOT SOMETHING + RLC C ; NEXT COL + INC E ; BUMP COL ID + DJNZ ICM_SCAN1 ; LOOP THROUGH ALL COLS + XOR A ; NOTHING FOUND, RETURN ZERO + JP ICM_RESET ; RETURN VIA RESET +ICM_SCAN2: + RRC E ; MOVE COL ID + RRC E ; ... TO HIGH BITS 6 & 7 + OR E ; COMBINE WITH ROW + JP ICM_RESET ; RETURN VIA RESET +; +; +; CONVERT FORM STANDARD SEGMENT ENCODING TO ICM ENCODING +; +; From: To: +; +--01--+ +--40--+ +; 20 02 02 20 +; +--40--+ +--04--+ +; 10 04 08 10 +; +--08--+ 80 +--01--+ 80 +; +ICM_XLAT: + PUSH BC + PUSH HL + LD C,A ; ORIG VALUE TO C + XOR A ; INIT RESULT VALUE + LD B,8 + LD HL,ICM_XTBL +ICM_XLAT1: + RRC C ; SHIFT NEXT BIT TO CF + JR NC,ICM_XLAT2 ; SKIP IF BIT NOT SET + OR (HL) +ICM_XLAT2: + INC HL + DJNZ ICM_XLAT1 + POP HL + POP BC + RET +; +ICM_XTBL .DB $40, $20, $10, $01, $08, $02, $04, $80 +; +;_ _TABLE_____________________________________________________________________________________________________________ +; +ICM_KEYMAP: + ; POS $00 $01 $02 $03 $04 $05 $06 $07 + ; KEY [0] [1] [2] [3] [4] [5] [6] [7] + .DB $41, $02, $42, $82, $04, $44, $84, $08 +; + ; POS $08 $09 $0A $0B $0C $0D $0E $0F + ; KEY [8] [9] [A] [B] [C] [D] [E] [F] + .DB $48, $88, $10, $50, $90, $20, $60, $A0 +; + ; POS $10 $11 $12 $13 $14 $15 $16 $17 + ; KEY [FW] [BK] [CL] [EN] [DE] [EX] [GO] [BO] + .DB $01, $81, $C1, $C2, $C4, $C8, $D0, $E0 +; +; KBD WORKING STORAGE +; +ICM_KEYBUF .DB 0 +; +;================================================================================================== +; UTILTITY FUNCTIONS +;================================================================================================== +; +; +;================================================================================================== +; STORAGE +;================================================================================================== +; +; SEG DISPLAY WORKING STORAGE +; +ICM_PRESENT .DB 0 diff --git a/Source/HBIOS/ide.asm b/Source/HBIOS/ide.asm index ea823fc4..aae7173e 100644 --- a/Source/HBIOS/ide.asm +++ b/Source/HBIOS/ide.asm @@ -4,9 +4,9 @@ ;============================================================================= ; ; TODO: -; - FIX SCALER CONSTANT ; - GOPARTNER NEEDS TO HANDLE "NO PARTNER" CONDITION ; - IMPLEMENT H/W PROBES FOR DIO AND DIDE +; - DATA TRANSFERS LIMITED TO 512 BYTES WHICH IS INSUFFICIENT FOR CD=ROM MEDIA ; ; NOTES: ; - WELL KNOWN IDE PORT ADDRESSES: @@ -24,9 +24,9 @@ ; +-----------------------+-------+-------+-------------------------------+ ; | REGISTER | PORT | DIR | DESCRIPTION | ; +-----------------------+-------+-------+-------------------------------+ -; | IDE_IO_ALTSTAT | 0x0E | R | ALTERNATE STATUS REGISTER | -; | IDE_IO_CTRL | 0x0E | W | DEVICE CONTROL REGISTER | -; | IDE_IO_DRVADR | 0x0F | R | DRIVE ADDRESS REGISTER | +; | IDE_REG_ALTSTAT | 0x0E | R | ALTERNATE STATUS REGISTER | +; | IDE_REG_CTRL | 0x0E | W | DEVICE CONTROL REGISTER | +; | IDE_REG_DRVADR | 0x0F | R | DRIVE ADDRESS REGISTER| ; +-----------------------+-------+-------+-------------------------------+ ; ; +-----------------------+-------+-------+-------------------------------+ @@ -34,20 +34,20 @@ ; +-----------------------+-------+-------+-------------------------------+ ; | REGISTER | PORT | DIR | DESCRIPTION | ; +-----------------------+-------+-------+-------------------------------+ -; | IDE_IO_DATA | 0x00 | R/W | DATA INPUT/OUTPUT | -; | IDE_IO_ERR | 0x01 | R | ERROR REGISTER | -; | IDE_IO_FEAT | 0x01 | W | FEATURES REGISTER | -; | IDE_IO_COUNT | 0x02 | R/W | SECTOR COUNT REGISTER | -; | IDE_IO_SECT | 0x03 | R/W | SECTOR NUMBER REGISTER | -; | IDE_IO_CYLLO | 0x04 | R/W | CYLINDER NUM REGISTER (LSB) | -; | IDE_IO_CYLHI | 0x05 | R/W | CYLINDER NUM REGISTER (MSB) | -; | IDE_IO_DRVHD | 0x06 | R/W | DRIVE/HEAD REGISTER | -; | IDE_IO_LBA0* | 0x03 | R/W | LBA BYTE 0 (BITS 0-7) | -; | IDE_IO_LBA1* | 0x04 | R/W | LBA BYTE 1 (BITS 8-15) | -; | IDE_IO_LBA2* | 0x05 | R/W | LBA BYTE 2 (BITS 16-23) | -; | IDE_IO_LBA3* | 0x06 | R/W | LBA BYTE 3 (BITS 24-27) | -; | IDE_IO_STAT | 0x07 | R | STATUS REGISTER | -; | IDE_IO_CMD | 0x07 | W | COMMAND REGISTER (EXECUTE) | +; | IDE_REG_DATA | 0x00 | R/W | DATA INPUT/OUTPUT | +; | IDE_REG_ERR | 0x01 | R | ERROR REGISTER | +; | IDE_REG_FEAT | 0x01 | W | FEATURES REGISTER | +; | IDE_REG_COUNT | 0x02 | R/W | SECTOR COUNT REGISTER | +; | IDE_REG_SECT | 0x03 | R/W | SECTOR NUMBER REGISTER | +; | IDE_REG_CYLLO | 0x04 | R/W | CYLINDER NUM REGISTER (LSB) | +; | IDE_REG_CYLHI | 0x05 | R/W | CYLINDER NUM REGISTER (MSB) | +; | IDE_REG_DRVHD | 0x06 | R/W | DRIVE/HEAD REGISTER | +; | IDE_REG_LBA0* | 0x03 | R/W | LBA BYTE 0 (BITS 0-7) | +; | IDE_REG_LBA1* | 0x04 | R/W | LBA BYTE 1 (BITS 8-15) | +; | IDE_REG_LBA2* | 0x05 | R/W | LBA BYTE 2 (BITS 16-23) | +; | IDE_REG_LBA3* | 0x06 | R/W | LBA BYTE 3 (BITS 24-27) | +; | IDE_REG_STAT | 0x07 | R | STATUS REGISTER | +; | IDE_REG_CMD | 0x07 | W | COMMAND REGISTER (EXECUTE) | ; +-----------------------+-------+-------+-------------------------------+ ; * LBA0-3 ARE ALTERNATE DEFINITIONS OF SECT, CYL, AND DRVHD PORTS ; @@ -105,32 +105,39 @@ ; SRST: SOFTWARE RESET ; ~IEN: INTERRUPT ENABLE ; -IDE_REG_DATA .EQU $00 ; DATA /OUTPUT (R/W) -IDE_REG_ERR .EQU $01 ; ERROR REGISTER (R) -IDE_REG_FEAT .EQU $01 ; FEATURES REGISTER (W) -IDE_REG_COUNT .EQU $02 ; SECTOR COUNT REGISTER (R/W) -IDE_REG_SECT .EQU $03 ; SECTOR NUMBER REGISTER (R/W) -IDE_REG_CYLLO .EQU $04 ; CYLINDER NUM REGISTER (LSB) (R/W) -IDE_REG_CYLHI .EQU $05 ; CYLINDER NUM REGISTER (MSB) (R/W) -IDE_REG_DRVHD .EQU $06 ; DRIVE/HEAD REGISTER (R/W) -IDE_REG_LBA0 .EQU $03 ; LBA BYTE 0 (BITS 0-7) (R/W) -IDE_REG_LBA1 .EQU $04 ; LBA BYTE 1 (BITS 8-15) (R/W) -IDE_REG_LBA2 .EQU $05 ; LBA BYTE 2 (BITS 16-23) (R/W) -IDE_REG_LBA3 .EQU $06 ; LBA BYTE 3 (BITS 24-27) (R/W) -IDE_REG_STAT .EQU $07 ; STATUS REGISTER (R) -IDE_REG_CMD .EQU $07 ; COMMAND REGISTER (EXECUTE) (W) -IDE_REG_XAR .EQU $08 ; ECB DIDE EXTERNAL ADDRESS REGISTER (W) -IDE_REG_ALTSTAT .EQU $0E ; ALTERNATE STATUS REGISTER (R) -IDE_REG_CTRL .EQU $0E ; DEVICE CONTROL REGISTER (W) -IDE_REG_DRVADR .EQU $0F ; DRIVE ADDRESS REGISTER (R) +IDE_REG_DATA .EQU $00 ; DATA /OUTPUT (R/W) +IDE_REG_ERR .EQU $01 ; ERROR REGISTER (R) +IDE_REG_FEAT .EQU $01 ; FEATURES REGISTER (W) +IDE_REG_COUNT .EQU $02 ; SECTOR COUNT REGISTER (R/W) +IDE_REG_SECT .EQU $03 ; SECTOR NUMBER REGISTER (R/W) +IDE_REG_CYLLO .EQU $04 ; CYLINDER NUM REGISTER (LSB) (R/W) +IDE_REG_CYLHI .EQU $05 ; CYLINDER NUM REGISTER (MSB) (R/W) +IDE_REG_DRVHD .EQU $06 ; DRIVE/HEAD REGISTER (R/W) +IDE_REG_LBA0 .EQU $03 ; LBA BYTE 0 (BITS 0-7) (R/W) +IDE_REG_LBA1 .EQU $04 ; LBA BYTE 1 (BITS 8-15) (R/W) +IDE_REG_LBA2 .EQU $05 ; LBA BYTE 2 (BITS 16-23) (R/W) +IDE_REG_LBA3 .EQU $06 ; LBA BYTE 3 (BITS 24-27) (R/W) +IDE_REG_BCL .EQU $04 ; PKT BYTE COUNT LOW (BITS 0-7) (R/W) +IDE_REG_BCH .EQU $05 ; PKT BYTE COUNT HIGH (BITS 8-15) (R/W) +IDE_REG_STAT .EQU $07 ; STATUS REGISTER (R) +IDE_REG_CMD .EQU $07 ; COMMAND REGISTER (EXECUTE) (W) +IDE_REG_XAR .EQU $08 ; ECB DIDE EXTERNAL ADDRESS REGISTER (W) +IDE_REG_ALTSTAT .EQU $0E ; ALTERNATE STATUS REGISTER (R) +IDE_REG_CTRL .EQU $0E ; DEVICE CONTROL REGISTER (W) +IDE_REG_DRVADR .EQU $0F ; DRIVE ADDRESS REGISTER (R) ; ; COMMAND BYTES ; -IDE_CIDE_RECAL .EQU $10 -IDE_CIDE_READ .EQU $20 -IDE_CIDE_WRITE .EQU $30 -IDE_CIDE_IDDEV .EQU $EC -IDE_CIDE_SETFEAT .EQU $EF +IDE_CMD_NOP .EQU $00 +IDE_CMD_DEVRES .EQU $08 +IDE_CMD_RECAL .EQU $10 +IDE_CMD_READ .EQU $20 +IDE_CMD_WRITE .EQU $30 +IDE_CMD_DEVDIAG .EQU $90 +IDE_CMD_PACKET .EQU $A0 +IDE_CMD_IDPKTDEV .EQU $A1 +IDE_CMD_IDDEV .EQU $EC +IDE_CMD_SETFEAT .EQU $EF ; ; FEATURE BYTES ; @@ -143,7 +150,7 @@ IDE_TYPEUNK .EQU 0 IDE_TYPEATA .EQU 1 IDE_TYPEATAPI .EQU 2 ; -; IDE DEVICE STATUS +; IDE DEVICE STATUS CODES ; IDE_STOK .EQU 0 IDE_STINVUNIT .EQU -1 @@ -153,6 +160,8 @@ IDE_STIOERR .EQU -4 IDE_STRDYTO .EQU -5 IDE_STDRQTO .EQU -6 IDE_STBSYTO .EQU -7 +IDE_STNOTSUP .EQU -8 +IDE_STNOTRDY .EQU -9 ; ; DRIVE SELECTION BYTES (FOR USE IN DRIVE/HEAD REGISTER) ; @@ -204,6 +213,27 @@ IDE_DEV0M: ; DEVICE 0, MASTER .DB IDE0DATLO ; IO BASE ADDRESS .DB IDE0DATHI ; IO BASE ADDRESS .DW IDE_DEV0S ; PARTNER +; + .ECHO "IDE: MODE=" + #IF (IDE0MODE == IDEMODE_NONE) + .ECHO "NONE" + #ENDIF + #IF (IDE0MODE == IDEMODE_DIO) + .ECHO "DIO" + #ENDIF + #IF (IDE0MODE == IDEMODE_DIDE) + .ECHO "DIDE" + #ENDIF + #IF (IDE0MODE == IDEMODE_MK4) + .ECHO "MK4" + #ENDIF + #IF (IDE0MODE == IDEMODE_RC) + .ECHO "RC" + #ENDIF + .ECHO ", IO=" + .ECHO IDE0BASE + .ECHO ", MASTER" + .ECHO "\n" ; IDE_DEV0S: ; DEVICE 0, SLAVE .DB $FE ; DRIVER DEVICE NUMBER (FILLED DYNAMICALLY) @@ -218,6 +248,27 @@ IDE_DEV0S: ; DEVICE 0, SLAVE .DB IDE0DATLO ; IO BASE ADDRESS .DB IDE0DATHI ; IO BASE ADDRESS .DW IDE_DEV0M ; PARTNER +; + .ECHO "IDE: MODE=" + #IF (IDE0MODE == IDEMODE_NONE) + .ECHO "NONE" + #ENDIF + #IF (IDE0MODE == IDEMODE_DIO) + .ECHO "DIO" + #ENDIF + #IF (IDE0MODE == IDEMODE_DIDE) + .ECHO "DIDE" + #ENDIF + #IF (IDE0MODE == IDEMODE_MK4) + .ECHO "MK4" + #ENDIF + #IF (IDE0MODE == IDEMODE_RC) + .ECHO "RC" + #ENDIF + .ECHO ", IO=" + .ECHO IDE0BASE + .ECHO ", SLAVE" + .ECHO "\n" #ENDIF ; #IF (IDECNT >= 2) @@ -235,6 +286,27 @@ IDE_DEV1M: ; DEVICE 1, MASTER .DB IDE1DATLO ; IO BASE ADDRESS .DB IDE1DATHI ; IO BASE ADDRESS .DW IDE_DEV1S ; PARTNER +; + .ECHO "IDE: MODE=" + #IF (IDE1MODE == IDEMODE_NONE) + .ECHO "NONE" + #ENDIF + #IF (IDE1MODE == IDEMODE_DIO) + .ECHO "DIO" + #ENDIF + #IF (IDE1MODE == IDEMODE_DIDE) + .ECHO "DIDE" + #ENDIF + #IF (IDE1MODE == IDEMODE_MK4) + .ECHO "MK4" + #ENDIF + #IF (IDE1MODE == IDEMODE_RC) + .ECHO "RC" + #ENDIF + .ECHO ", IO=" + .ECHO IDE1BASE + .ECHO ", MASTER" + .ECHO "\n" ; IDE_DEV1S: ; DEVICE 1, SLAVE .DB $FE ; DRIVER DEVICE NUMBER (FILLED DYNAMICALLY) @@ -249,6 +321,27 @@ IDE_DEV1S: ; DEVICE 1, SLAVE .DB IDE1DATLO ; IO BASE ADDRESS .DB IDE1DATHI ; IO BASE ADDRESS .DW IDE_DEV1M ; PARTNER +; + .ECHO "IDE: MODE=" + #IF (IDE1MODE == IDEMODE_NONE) + .ECHO "NONE" + #ENDIF + #IF (IDE1MODE == IDEMODE_DIO) + .ECHO "DIO" + #ENDIF + #IF (IDE1MODE == IDEMODE_DIDE) + .ECHO "DIDE" + #ENDIF + #IF (IDE1MODE == IDEMODE_MK4) + .ECHO "MK4" + #ENDIF + #IF (IDE1MODE == IDEMODE_RC) + .ECHO "RC" + #ENDIF + .ECHO ", IO=" + .ECHO IDE1BASE + .ECHO ", SLAVE" + .ECHO "\n" #ENDIF ; #IF (IDECNT >= 3) @@ -266,6 +359,27 @@ IDE_DEV2M: ; DEVICE 2, MASTER .DB IDE2DATLO ; IO BASE ADDRESS .DB IDE2DATHI ; IO BASE ADDRESS .DW IDE_DEV2S ; PARTNER +; + .ECHO "IDE: MODE=" + #IF (IDE2MODE == IDEMODE_NONE) + .ECHO "NONE" + #ENDIF + #IF (IDE2MODE == IDEMODE_DIO) + .ECHO "DIO" + #ENDIF + #IF (IDE2MODE == IDEMODE_DIDE) + .ECHO "DIDE" + #ENDIF + #IF (IDE2MODE == IDEMODE_MK4) + .ECHO "MK4" + #ENDIF + #IF (IDE2MODE == IDEMODE_RC) + .ECHO "RC" + #ENDIF + .ECHO ", IO=" + .ECHO IDE2BASE + .ECHO ", MASTER" + .ECHO "\n" ; IDE_DEV2S: ; DEVICE 2, SLAVE .DB $FE ; DRIVER DEVICE NUMBER (FILLED DYNAMICALLY) @@ -280,25 +394,49 @@ IDE_DEV2S: ; DEVICE 2, SLAVE .DB IDE2DATLO ; IO BASE ADDRESS .DB IDE2DATHI ; IO BASE ADDRESS .DW IDE_DEV1M ; PARTNER +; + .ECHO "IDE: MODE=" + #IF (IDE2MODE == IDEMODE_NONE) + .ECHO "NONE" + #ENDIF + #IF (IDE2MODE == IDEMODE_DIO) + .ECHO "DIO" + #ENDIF + #IF (IDE2MODE == IDEMODE_DIDE) + .ECHO "DIDE" + #ENDIF + #IF (IDE2MODE == IDEMODE_MK4) + .ECHO "MK4" + #ENDIF + #IF (IDE2MODE == IDEMODE_RC) + .ECHO "RC" + #ENDIF + .ECHO ", IO=" + .ECHO IDE2BASE + .ECHO ", SLAVE" + .ECHO "\n" #ENDIF ; #IF ($ - IDE_CFGTBL) != (IDE_DEVCNT * IDE_CFGSIZ) .ECHO "*** INVALID IDE CONFIG TABLE ***\n" #ENDIF ; - .DB $FF ; END MARKER + .DB $FF ; END OF TABLE MARKER ; ; THE IDE_WAITXXX FUNCTIONS ARE BUILT TO TIMEOUT AS NEEDED SO DRIVER WILL ; NOT HANG IF DEVICE IS UNRESPONSIVE. DIFFERENT TIMEOUTS ARE USED DEPENDING -; ON THE SITUATION. GENERALLY, THE FAST TIMEOUT IS USED TO PROBE FOR DEVICES -; USING FUNCTIONS THAT PERFORM NO I/O. OTHERWISE THE NORMAL TIMEOUT IS USED. -; IDE SPEC ALLOWS FOR UP TO 30 SECS MAX TO RESPOND. IN PRACTICE, THIS IS WAY -; TOO LONG, BUT IF YOU ARE USING A VERY OLD DEVICE, THESE TIMEOUTS MAY NEED TO -; BE ADJUSTED. NOTE THAT THESE ARE BYTE VALUES, SO YOU CANNOT EXCEED 255. -; THE TIMEOUTS ARE IN UNITS OF .05 SECONDS. -; -IDE_TONORM .EQU 200 ; NORMAL TIMEOUT IS 10 SECS -IDE_TOFAST .EQU 10 ; FAST TIMEOUT IS 0.5 SECS +; ON THE SITUATION. THE SLOW TIMEOUT IS USED TO WAIT FOR A DEVICE TO +; BECOME READY AFTER A HARD RESET (SPIN UP, ETC.). THE NORMAL TIMEOUT +; IS USED DURING NORMAL OPERATION FOR ALL I/O OPERATIONS WHICH SHOULD +; OCCUR PRETTY FAST. NOTE THAT THE ATA SPEC ALLOWS UP TO 30 SECONDS +; FOR DEVICES TO RESPOND. WE ARE USING MUCH MORE AGGRESSIVE VALUES +; BASED ON REAL WORLD EXPERIENCE. +; THE PICO TIMEOUT (TOPICO) IS A SPECIAL TIMEOUT FOR THE RC2014 SD +; PICO TO WAIT FOR THE PICO DEVICE TO INITIALIZE. +; +IDE_TOSLOW .EQU 200 ; SLOW TIMEOUT IS 20 SECS +IDE_TONORM .EQU 5 ; NORMAL TIMEOUT IS 0.5 SECS +IDE_TOPICO .EQU 50 ; RC2014 SD PICO (5 SECONDS) ; ;============================================================================= ; INITIALIZATION ENTRY POINT @@ -306,9 +444,12 @@ IDE_TOFAST .EQU 10 ; FAST TIMEOUT IS 0.5 SECS ; IDE_INIT: ; COMPUTE CPU SPEED COMPENSATED TIMEOUT SCALER - ; AT 1MHZ, THE SCALER IS 218 (50000US / 229TS = 218) - ; SCALER IS THEREFORE 218 * CPU SPEED IN MHZ - LD DE,961 ; LOAD SCALER FOR 1MHZ + ; ONE INTERNAL LOOP IN WAITBSY IS 180TS. ON A 1 MHZ CPU, 1 TS + ; TAKES 1NS. SO 1/10 SECOND IS 100000 TS ON A 1 MHZ CPU. + ; SINCE 1 INTERNAL LOOP IS 180 TS, IT TAKES 100000 / 180 = 556 + ; INTERNAL LOOPS FOR 1/10 SECOND. SO, WE WANT TO USE + ; 523 * CPU MHZ FOR INTERNAL LOOP COUNT. + LD DE,556 ; LOAD SCALER FOR 1MHZ LD A,(CB_CPUMHZ) ; LOAD CPU SPEED IN MHZ CALL MULT8X16 ; HL := DE * A LD (IDE_TOSCALER),HL ; SAVE IT @@ -359,7 +500,7 @@ IDE_INIT2A: LD DE,IDE_STR_NOHW ; NOT PRESENT MESSAGE CALL WRITESTR ; DISPLAY IT JR IDE_INIT4 ; SKIP CFG ENTRY -; +; IDE_INIT3: CALL IDE_RESET ; RESET THE BUS CALL IDE_INIT5 ; DETECT/INIT MASTER @@ -367,7 +508,7 @@ IDE_INIT3: CALL IDE_GOPARTNER ; SWITCH IY TO PARTNER CFG CALL IDE_INIT5 ; DETECT/INIT SLAVE POP IY ; RESTORE CFG PTR -; +; IDE_INIT4: LD DE,IDE_CFGSIZ ; SIZE OF CFG TABLE ENTRY ADD IY,DE ; BUMP POINTER @@ -385,14 +526,25 @@ IDE_INIT5: PUSH IY ; CFG ENTRY POINTER POP DE ; COPY TO DE CALL DIO_ADDENT ; ADD ENTRY TO GLOBAL DISK DEV TABLE +; + ; START PRINTING DEVICE INFO + CALL IDE_PRTPREFIX ; PRINT DEVICE PREFIX + LD A,(IY+IDE_TYPE) + LD DE,IDE_STR_TYPEATA + CP IDE_TYPEATA + CALL Z,WRITESTR + LD DE,IDE_STR_TYPEATAPI + CP IDE_TYPEATAPI + CALL Z,WRITESTR ; ; CHECK FOR BAD STATUS LD A,(IY+IDE_STAT) ; GET STATUS OR A ; SET FLAGS - JP NZ,IDE_PRTSTAT ; EXIT VIA PRINT STATUS -; - CALL IDE_PRTPREFIX ; PRINT DEVICE PREFIX + JP Z,IDE_INIT6 + CALL PC_SPACE + JP NZ,IDE_PRTSTATSTR ; EXIT VIA PRINT STATUS STRING ; +IDE_INIT6: LD DE,IDE_STR_8BIT BIT 1,(IY+IDE_ACC) ; 8 BIT ACCESS? CALL NZ,WRITESTR @@ -495,12 +647,12 @@ IDE_IO: PUSH HL ; ... TO FILTER ALL EXITS #ENDIF PUSH BC ; SAVE COUNTERS - CALL IDE_SELUNIT ; HARDWARE SELECTION OF TARGET UNIT CALL IDE_CHKERR ; CHECK FOR ERR STATUS AND RESET IF SO POP BC ; RESTORE COUNTERS JR NZ,IDE_IO3 ; BAIL OUT ON ERROR IDE_IO1: PUSH BC ; SAVE COUNTERS + CALL IDE_SELUNIT ; HARDWARE SELECTION OF TARGET UNIT LD HL,(IDE_IOFNADR) ; GET PENDING IO FUNCTION ADDRESS CALL JPHL ; ... AND CALL IT JR NZ,IDE_IO2 ; IF ERROR, SKIP INCREMENT @@ -540,10 +692,14 @@ IDE_STATUS: IDE_DEVICE: LD D,DIODEV_IDE ; D := DEVICE TYPE LD E,(IY+IDE_DEV) ; E := PHYSICAL DEVICE NUMBER + LD C,%01111001 ; ATAPI ATTRIBUTES + LD A,(IY+IDE_TYPE) ; CHECK TYPE VALUE + CP IDE_TYPEATAPI ; ATAPI? + JR Z,IDE_DEVICE1 ; IF SO, DONE + LD C,%00110001 ; COMPACTFLASH ATTRIBUTES BIT 0,(IY+IDE_MED) ; TEST CF BIT IN FLAGS - LD C,%00000000 ; ASSUME NON-REMOVABLE HARD DISK - JR Z,IDE_DEVICE1 ; IF Z, WE ARE DONE - LD C,%01001000 ; OTHERWISE REMOVABLE COMPACT FLASH + JR NZ,IDE_DEVICE1 ; IF SET, DONE + LD C,%00110000 ; GENERIC HARD DISK ATTRIBUTES IDE_DEVICE1: LD H,(IY+IDE_MODE) ; H := MODE LD L,(IY+IDE_IOBASE) ; L := BASE I/O ADDRESS @@ -555,26 +711,12 @@ IDE_DEVICE1: IDE_MEDIA: LD A,E ; GET FLAGS OR A ; SET FLAGS - JR Z,IDE_MEDIA2 ; JUST REPORT CURRENT STATUS AND MEDIA -; - ; GET CURRENT STATUS - LD A,(IY+IDE_STAT) ; GET STATUS - OR A ; SET FLAGS - JR NZ,IDE_MEDIA1 ; ERROR ACTIVE, GO RIGHT TO RESET + JR Z,IDE_MEDIA1 ; JUST REPORT CURRENT STATUS AND MEDIA ; - ; USE IDENTIFY COMMAND TO CHECK DEVICE - LD HL,IDE_TIMEOUT ; POINT TO TIMEOUT - LD (HL),IDE_TOFAST ; USE FAST TIMEOUT DURING IDENTIFY COMMAND - CALL IDE_SELUNIT ; HARDWARE SELECTION OF TARGET UNIT - CALL IDE_IDENTIFY ; EXECUTE IDENTIFY COMMAND - LD HL,IDE_TIMEOUT ; POINT TO TIMEOUT - LD (HL),IDE_TONORM ; BACK TO NORMAL TIMEOUT - JR Z,IDE_MEDIA2 ; IF SUCCESS, BYPASS RESET + ;CALL IDE_RESET ; RESET IDE INTERFACE + CALL IDE_INITUNIT ; RE-INITIALIZE UNIT ; IDE_MEDIA1: - CALL IDE_RESET ; RESET IDE INTERFACE -; -IDE_MEDIA2: LD A,(IY+IDE_STAT) ; GET STATUS OR A ; SET FLAGS LD D,0 ; NO MEDIA CHANGE DETECTED @@ -634,7 +776,7 @@ IDE_SETFEAT: PRTS(" SETFEAT$") #ENDIF LD A,(IDE_DRVHD) - ;OUT (IDE_IO_DRVHD),A + ;OUT (IDE_REG_DRVHD),A CALL IDE_OUT .DB IDE_REG_DRVHD #IF (IDETRACE >= 3) @@ -642,14 +784,14 @@ IDE_SETFEAT: CALL PRTHEXBYTE #ENDIF POP AF - ;OUT (IDE_IO_FEAT),A ; SET THE FEATURE VALUE + ;OUT (IDE_REG_FEAT),A ; SET THE FEATURE VALUE CALL IDE_OUT .DB IDE_REG_FEAT #IF (IDETRACE >= 3) CALL PC_SPACE CALL PRTHEXBYTE #ENDIF - LD A,IDE_CIDE_SETFEAT ; CMD = SETFEAT + LD A,IDE_CMD_SETFEAT ; CMD = SETFEAT LD (IDE_CMD),A ; SAVE IT JP IDE_RUNCMD ; RUN COMMAND AND EXIT ; @@ -661,22 +803,83 @@ IDE_IDENTIFY: PRTS(" IDDEV$") #ENDIF LD A,(IDE_DRVHD) - ;OUT (IDE_IO_DRVHD),A + ;OUT (IDE_REG_DRVHD),A CALL IDE_OUT .DB IDE_REG_DRVHD #IF (IDETRACE >= 3) CALL PC_SPACE CALL PRTHEXBYTE #ENDIF - LD A,IDE_CIDE_IDDEV + LD A,IDE_CMD_IDDEV LD (IDE_CMD),A - CALL IDE_RUNCMD + CALL IDE_RUNCMD_ND RET NZ +; + CALL IDE_IN + .DB IDE_REG_STAT + BIT 3,A ; IS DRQ SET? + JP Z,IDE_NOMEDIA +; LD HL,HB_WRKBUF JP IDE_GETBUF ; EXIT THRU BUFRD ; ; ; +IDE_IDENTIFYPACKET: +#IF (IDETRACE >= 3) + CALL IDE_PRTPREFIX + PRTS(" IDPKTDEV$") +#ENDIF + LD A,(IDE_DRVHD) + ;OUT (IDE_REG_DRVHD),A + CALL IDE_OUT + .DB IDE_REG_DRVHD +#IF (IDETRACE >= 3) + CALL PC_SPACE + CALL PRTHEXBYTE +#ENDIF + LD A,IDE_CMD_IDPKTDEV + LD (IDE_CMD),A + CALL IDE_RUNCMD_ND + RET NZ +; + CALL IDE_IN + .DB IDE_REG_STAT + BIT 3,A ; IS DRQ SET? + JP Z,IDE_NOMEDIA +; + LD HL,HB_WRKBUF + JP IDE_GETBUF ; EXIT THRU BUFRD +; +; +; +IDE_PACKET: +#IF (IDETRACE >= 3) + CALL IDE_PRTPREFIX + PRTS(" PACKET$") +#ENDIF + LD A,(IDE_DRVHD) + ;OUT (IDE_REG_DRVHD),A + CALL IDE_OUT + .DB IDE_REG_DRVHD +#IF (IDETRACE >= 3) + CALL PC_SPACE + CALL PRTHEXBYTE +#ENDIF + XOR A ; ZERO + CALL IDE_OUT + .DB IDE_REG_FEAT ; FEATURE REG = 0 + CALL IDE_OUT + .DB IDE_REG_BCL + LD A,8 + CALL IDE_OUT + .DB IDE_REG_BCH ; BYTE COUNT = 512???? + LD A,IDE_CMD_PACKET + LD (IDE_CMD),A + JP IDE_RUNCMD_ND +; +; +; IDE_RDSEC: ; #IF (IDETRACE >= 3) @@ -684,21 +887,66 @@ IDE_RDSEC: PRTS(" READ$") #ENDIF LD A,(IDE_DRVHD) - ;OUT (IDE_IO_DRVHD),A + ;OUT (IDE_REG_DRVHD),A CALL IDE_OUT .DB IDE_REG_DRVHD #IF (IDETRACE >= 3) CALL PC_SPACE CALL PRTHEXBYTE +#ENDIF + LD A,(IY+IDE_TYPE) + CP IDE_TYPEATA + JR Z,IDE_ATA_RDSEC + CP IDE_TYPEATAPI + JR Z,IDE_PKT_RDSEC + JP IDE_CMDERR +; +IDE_ATA_RDSEC: +#IF (IDETRACE >= 3) + PRTS(" ATA$") #ENDIF CALL IDE_SETADDR ; SETUP CYL, TRK, HEAD - LD A,IDE_CIDE_READ + LD A,IDE_CMD_READ LD (IDE_CMD),A CALL IDE_RUNCMD RET NZ LD HL,(IDE_DSKBUF) JP IDE_GETBUF ; +IDE_PKT_RDSEC: +#IF (IDETRACE >= 3) + PRTS(" PKT$") +#ENDIF + ; SETUP LBA +; +#IF (DSKYENABLE) + #IF (DSKYDSKACT) + LD A,IDE_LBA + CALL LDHLIYA + CALL HB_DSKACT ; SHOW ACTIVITY + #ENDIF +#ENDIF +; + ; 3 BYTES, LITTLE ENDIAN -> BIG ENDIAN + LD HL,IDE_PKTCMD_RW10+3 ; START OF LBA FIELD IN CDB (MSB) + LD A,(IY+IDE_LBA+2) ; THIRD BYTE OF LBA FIELD IN CFG (MSB) + LD (HL),A + INC HL + LD A,(IY+IDE_LBA+1) + LD (HL),A + INC HL + LD A,(IY+IDE_LBA+0) + LD (HL),A + INC HL + LD HL,IDE_PKTCMD_RW10 + LD A,SCSI_CMD_READ10 + LD (HL),A + XOR A ; READ DIRECTION + LD (IDE_XFRDIR),A ; SAVE IT + CALL IDE_RUNPCMD + JP NZ,IDE_CHKPCMD + RET +; ; ; IDE_WRSEC: @@ -708,33 +956,80 @@ IDE_WRSEC: PRTS(" WRITE$") #ENDIF LD A,(IDE_DRVHD) - ;OUT (IDE_IO_DRVHD),A + ;OUT (IDE_REG_DRVHD),A CALL IDE_OUT .DB IDE_REG_DRVHD #IF (IDETRACE >= 3) CALL PC_SPACE CALL PRTHEXBYTE +#ENDIF + LD A,(IY+IDE_TYPE) + CP IDE_TYPEATA + JR Z,IDE_ATA_WRSEC + CP IDE_TYPEATAPI + JR Z,IDE_PKT_WRSEC + JP IDE_CMDERR +; +IDE_ATA_WRSEC: +#IF (IDETRACE >= 3) + PRTS(" ATA$") #ENDIF CALL IDE_SETADDR ; SETUP CYL, TRK, HEAD - LD A,IDE_CIDE_WRITE + LD A,IDE_CMD_WRITE LD (IDE_CMD),A CALL IDE_RUNCMD RET NZ LD HL,(IDE_DSKBUF) JP IDE_PUTBUF ; +IDE_PKT_WRSEC: +#IF (IDETRACE >= 3) + PRTS(" PKT$") +#ENDIF + ; SETUP LBA +; +#IF (DSKYENABLE) + #IF (DSKYDSKACT) + LD A,IDE_LBA + CALL LDHLIYA + CALL HB_DSKACT ; SHOW ACTIVITY + #ENDIF +#ENDIF +; + ; 3 BYTES, LITTLE ENDIAN -> BIG ENDIAN + LD HL,IDE_PKTCMD_RW10+3 ; START OF LBA FIELD IN CDB (MSB) + LD A,(IY+IDE_LBA+2) ; THIRD BYTE OF LBA FIELD IN CFG (MSB) + LD (HL),A + INC HL + LD A,(IY+IDE_LBA+1) + LD (HL),A + INC HL + LD A,(IY+IDE_LBA+0) + LD (HL),A + INC HL + LD HL,IDE_PKTCMD_RW10 + LD A,SCSI_CMD_WRITE10 + LD (HL),A + OR $FF ; WRITE DIRECTION + LD (IDE_XFRDIR),A ; SAVE IT + CALL IDE_RUNPCMD + JP NZ,IDE_CHKPCMD + RET +; ; ; IDE_SETADDR: ; #IF (DSKYENABLE) + #IF (DSKYDSKACT) LD A,IDE_LBA CALL LDHLIYA CALL HB_DSKACT ; SHOW ACTIVITY + #ENDIF #ENDIF ; SEND 3 LOWEST BYTES OF LBA IN REVERSE ORDER - ; IDE_IO_LBA3 HAS ALREADY BEEN SET - ; HSTLBA2-0 --> IDE_IO_LBA2-0 + ; IDE_REG_LBA3 HAS ALREADY BEEN SET + ; HSTLBA2-0 --> IDE_REG_LBA2-0 LD A,(IY+IDE_LBA+2) #IF (IDETRACE >= 3) CALL PC_SPACE @@ -766,10 +1061,6 @@ IDE_SETADDR: #ENDIF CALL IDE_OUT .DB IDE_REG_COUNT -;;; -;;#IF (DSKYENABLE) -;; CALL IDE_DSKY -;;#ENDIF ; RET ; @@ -777,16 +1068,27 @@ IDE_SETADDR: ; COMMAND PROCESSING ;============================================================================= ; +; RUN AN ATA COMMAND. THERE ARE TWO ENTRY POINTS. THE NORMAL ENTRY +; POINT WILL WAIT FOR DRIVE READY. THE _ND ENTRY POINT ONLY WAITS +; FOR THE DEVICE TO BE NOT BUSY. THE CORRECT ENTRY POINT DEPENDS ON +; THE COMMAND. +; +IDE_RUNCMD_ND: + CALL IDE_WAITBSY ; WAIT WHILE DEVICE BUSY + RET NZ ; BAIL OUT ON TIMEOUT + JR IDE_RUNCMD1 ; CONTINUE + IDE_RUNCMD: CALL IDE_WAITRDY ; WAIT FOR DRIVE READY RET NZ ; BAIL OUT ON TIMEOUT ; +IDE_RUNCMD1: LD A,(IDE_CMD) ; GET THE COMMAND #IF (IDETRACE >= 3) CALL PC_SPACE CALL PRTHEXBYTE #ENDIF - ;OUT (IDE_IO_CMD),A ; SEND IT (STARTS EXECUTION) + ;OUT (IDE_REG_CMD),A ; SEND IT (STARTS EXECUTION) CALL IDE_OUT .DB IDE_REG_CMD #IF (IDETRACE >= 3) @@ -800,112 +1102,233 @@ IDE_RUNCMD: JP NZ,IDE_CMDERR RET ; +; PACKET COMMAND PROCESSOR +; HL: ADDRESS OF PACKET COMMAND BUFFER +; +IDE_RUNPCMD: + PUSH HL + CALL IDE_PACKET + POP HL + RET NZ ; BAIL OUT ON ERROR +; +#IF (IDETRACE >= 3) + PRTS("\r\nPKTCMD:$") + PUSH HL + POP DE + LD A,12 + CALL PRTHEXBUF +#ENDIF +; + ; IF ZIP DRIVE HAS FALLEN ASLEEP, THEN IT WILL NEED EXTRA + ; TIME HERE TO WAKE UP BEFORE ACCEPTING THE COMMAND. USE + ; LONG TIMEOUT TO ACCOMMODATE THIS. + LD DE,(IDE_TIMEOUT) ; GET CURRENT TIMEOUT + PUSH DE ; SAVE IT + LD DE,IDE_TOSLOW ; SLOW TIMEOUT FOR THIS + LD (IDE_TIMEOUT),DE ; SET IT + LD B,6 ; 6 WORDS ALWAYS + CALL IDE_PUT + POP DE ; RECOVER TIMEOUT + LD (IDE_TIMEOUT),DE ; SET IT + RET NZ +; + CALL IDE_IN + .DB IDE_REG_STAT + BIT 3,A ; IS DRQ SET? + RET Z ; IF NOT, ALL DONE +; + CALL IDE_IN + .DB IDE_REG_BCL + LD C,A + CALL IDE_IN + .DB IDE_REG_BCH + LD B,A +; + ; BELOW ASSUMES MAX TRANSFER OF 512 BYTES!!! + PUSH BC ; SAVE BYTE COUNT + SRL B ; CONVERT + RR C ; ... TO WORDS + LD B,C + ;LD HL,HB_WRKBUF ; SET XFR BUFFER + LD HL,(IDE_DSKBUF) ; SET XFR BUFFER + + LD A,(IDE_XFRDIR) + OR A + JR NZ,IDE_RUNPCMD2 ; NZ = WRITE + CALL IDE_GET ; GET SOME DATA + JR IDE_RUNPCMD3 +IDE_RUNPCMD2: + CALL IDE_PUT ; PUT SOME DATA +IDE_RUNPCMD3: + POP BC ; RESTORE BYTE COUNT + RET NZ ; BAIL OUT ON ERRORS +; + XOR A + RET +; +; THE FOLLOWING IS USED TO ASSESS ANY ERROR THAT OCCURS DURING +; RUNCMD AND SET AN APPROPRIATE ERROR CODE. +; +IDE_CHKPCMD: +; + LD HL,HB_WRKBUF + LD (IDE_DSKBUF),HL + LD HL,IDE_PKTCMD_SENSE + CALL IDE_RUNPCMD + RET NZ +; + CALL IDE_IN + .DB IDE_REG_BCL +; +#IF (IDETRACE >= 3) + CALL NEWLINE + LD DE,HB_WRKBUF + CALL PRTHEXBUF +#ENDIF +; + ; ASSESS SENSE DATA AND SET APPROPRIATE ERROR + LD A,(HB_WRKBUF+12) + CP $3A + JP Z,IDE_NOMEDIA + CP $04 + JP Z,IDE_NOTRDY +; + JP IDE_CMDERR ; +; HL=BUFFER ; IDE_GETBUF: + LD B,0 + ; FALL THRU!!! +; +; HL=BUFFER +; B=WORD COUNT, 0=256 +; +IDE_GET: #IF (IDETRACE >= 3) - PRTS(" GETBUF$") + PRTS(" GET$") #ENDIF ; + ; WAIT FOR BUFFER + PUSH BC + PUSH HL CALL IDE_WAITDRQ ; WAIT FOR BUFFER READY + POP HL + POP BC RET NZ ; BAIL OUT IF TIMEOUT ; - LD B,0 + LD A,B ; WORD COUNT IN A ; BIT 1,(IY+IDE_ACC) ; 8 BIT? - JR Z,IDE_GETBUF1 ; IF NOT, DO 16 BIT - CALL IDE_GETBUF8 ; DO 8 BIT - JR IDE_GETBUF2 + JR Z,IDE_GET1 ; IF NOT, DO 16 BIT + CALL IDE_GET8 ; DO 8 BIT + JR IDE_GET2 ; -IDE_GETBUF1: - CALL IDE_GETBUF16 +IDE_GET1: + CALL IDE_GET16 ; -IDE_GETBUF2: +IDE_GET2: CALL IDE_WAITRDY ; PROBLEMS IF THIS IS REMOVED! CALL IDE_GETRES JP NZ,IDE_IOERR RET ; -IDE_GETBUF8: +IDE_GET8: ; 8 BIT I/O - ;LD C,IDE_IO_DATA + ;LD C,IDE_REG_DATA LD C,(IY+IDE_IOBASE) + LD B,A INIR + LD B,A INIR RET ; -IDE_GETBUF16: +IDE_GET16: ; 16 BIT I/O - ;LD C,IDE_IO_DATAHI + ;LD C,IDE_REG_DATAHI LD D,(IY+IDE_DATALO) LD E,(IY+IDE_DATAHI) - CALL IDE_GETBUF16A ; GET FIRST 256 BYTES - CALL IDE_GETBUF16A ; GET SECOND 256 BYTES + CALL IDE_GET16A ; GET FIRST 256 BYTES RET ; -IDE_GETBUF16A: +IDE_GET16A: LD C,D ; PORT FOR LSB INI ; GET IT, SAVE IT, AND DEC B LD C,E ; PORT FOR MSB INI ; GET IT, SAVE IT, AND DEC B - JR NZ,IDE_GETBUF16A ; LOOP TILL COUNTER EXHAUSTED + DEC A + JR NZ,IDE_GET16A ; LOOP TILL COUNTER EXHAUSTED RET ; -; +; HL=BUFFER ; IDE_PUTBUF: + LD B,0 + ; FALL THRU!!! +; +; HL=BUFFER +; B=WORD COUNT, 0=256 +; +IDE_PUT: #IF (IDETRACE >= 3) - PRTS(" PUTBUF$") + PRTS(" PUT$") #ENDIF ; + ; WAIT FOR BUFFER + PUSH BC + PUSH HL CALL IDE_WAITDRQ ; WAIT FOR BUFFER READY + POP HL + POP BC RET NZ ; BAIL OUT IF TIMEOUT ; - LD B,0 + LD A,B ; WORD COUNT IN A ; BIT 1,(IY+IDE_ACC) ; 8 BIT? - JR Z,IDE_PUTBUF1 ; IF NOT, DO 16 BIT - CALL IDE_PUTBUF8 ; DO 8 BIT - JR IDE_PUTBUF2 + JR Z,IDE_PUT1 ; IF NOT, DO 16 BIT + CALL IDE_PUT8 ; DO 8 BIT + JR IDE_PUT2 ; -IDE_PUTBUF1: - CALL IDE_PUTBUF16 +IDE_PUT1: + CALL IDE_PUT16 ; -IDE_PUTBUF2: +IDE_PUT2: CALL IDE_WAITRDY ; PROBLEMS IF THIS IS REMOVED! CALL IDE_GETRES JP NZ,IDE_IOERR RET ; -IDE_PUTBUF8: +IDE_PUT8: ; 8 BIT I/O - ;LD C,IDE_IO_DATA + ;LD C,IDE_REG_DATA LD C,(IY+IDE_IOBASE) + LD B,A OTIR + LD B,A OTIR RET ; -IDE_PUTBUF16: +IDE_PUT16: ; 16 BIT I/O - ;LD C,IDE_IO_DATAHI + ;LD C,IDE_REG_DATAHI LD D,(IY+IDE_DATALO) LD E,(IY+IDE_DATAHI) - CALL IDE_PUTBUF16A ; PUT FIRST 256 BYTES - CALL IDE_PUTBUF16A ; PUT SECOND 256 BYTES + CALL IDE_PUT16A ; PUT FIRST 256 BYTES RET ; -IDE_PUTBUF16A: +IDE_PUT16A: LD C,D ; PORT FOR LSB OUTI ; PUT IT AND DEC B LD C,E ; PORT FOR MSB OUTI ; PUT IT AND DEC B - JR NZ,IDE_PUTBUF16A ; LOOP TILL COUNTER EXHAUSTED + DEC A + JR NZ,IDE_PUT16A ; LOOP TILL COUNTER EXHAUSTED RET ; ; ; IDE_GETRES: - ;IN A,(IDE_IO_STAT) ; GET STATUS + ;IN A,(IDE_REG_STAT) ; GET STATUS CALL IDE_IN .DB IDE_REG_STAT #IF (IDETRACE >= 3) @@ -915,7 +1338,7 @@ IDE_GETRES: AND %00000001 ; ERROR BIT SET? RET Z ; NOPE, RETURN WITH ZF ; - ;IN A,(IDE_IO_ERR) ; READ ERROR REGISTER + ;IN A,(IDE_REG_ERR) ; READ ERROR REGISTER CALL IDE_IN .DB IDE_REG_ERR #IF (IDETRACE >= 3) @@ -937,125 +1360,85 @@ IDE_RESET: PRTS(" RESET$") #ENDIF ; -;#IF (IDEMODE == IDEMODE_RC) +; HARD RESET ; - ; OLDER CF CARDS DO NOT SEEM TO SET THE - ; REGISTERS ON RESET, SO HERE WE FAKE THINGS BY - ; SETTING THEM AS A RESET WOULD. SO WE ALWAYS - ; DO THE FAKE. - ;LD A,(IY+IDE_MODE) ; GET MODE - ;CP IDEMODE_RC ; RCBUS? - ;JR NZ,IDE_RESET2 ; IF NOT, BYPASS -; - ; RCBUS CANNOT ADDRESS THE DEVICE CONTROL PORT AND - ; HAS NO WAY TO PERFORM A HARD RESET FROM SOFTWARE, - ; SO FAKE IT BY SETTING THE REGISTERS TO THE SAME - ; VALUES THAT A RESET WOULD CAUSE. -#IF (IDETRACE >= 3) - PRTS(" FAKE$") -#ENDIF - XOR A - ;OUT (IDE_IO_CYLLO),A - CALL IDE_OUT - .DB IDE_REG_CYLLO - ;OUT (IDE_IO_CYLHI),A - CALL IDE_OUT - .DB IDE_REG_CYLHI - INC A - ;OUT (IDE_IO_COUNT),A - CALL IDE_OUT - .DB IDE_REG_COUNT - ;OUT (IDE_IO_SECT),A - CALL IDE_OUT - .DB IDE_REG_SECT -; -IDE_RESET2: -; -;#ENDIF -; -;#IF (IDEMODE == IDEMODE_MK4) +; RESET LINE IS NORMALLY PULSED AT POWER ON. HOWEVER, THIS IS NOT +; DONE FOR MK4 BUILT-IN IDE PORT, SO WE DO IT NOW. ; LD A,(IY+IDE_MODE) ; GET MODE CP IDEMODE_MK4 ; MK4? - JR NZ,IDE_RESET1 ; IF NOT, BYPASS + JR NZ,IDE_RESET2 ; IF NOT, BYPASS ; ; USE HARDWARE RESET LINE #IF (IDETRACE >= 3) PRTS(" HARD$") #ENDIF LD A,$80 ; HIGH BIT OF XAR IS IDE RESET - ;OUT (IDE_IO_XAR),A + ;OUT (IDE_REG_XAR),A CALL IDE_OUT .DB IDE_REG_XAR LD DE,20 ; DELAY 32US (SPEC IS >= 25US) CALL VDELAY XOR A ; CLEAR RESET BIT - ;OUT (IDE_IO_XAR),A + ;OUT (IDE_REG_XAR),A CALL IDE_OUT .DB IDE_REG_XAR LD DE,20 CALL VDELAY ; -IDE_RESET1: +; SOME CF CARDS AND CF CARD EMULATORS NEED A LITTLE TIME TO +; "BOOT" THEIR INTERNAL ELECTRONICS, SO THEY CANNOT ASSERT BUSY +; IMMEDIATELY. A SMALL WAIT IS PERFORMED HERE TO GIVE SUCH DEVICES +; A BETTER CHANCE TO SUCCEED LATER. ; -;#ENDIF +; LD DE,150000 / 16 ; + LD DE,300000 / 16 ; + CALL VDELAY ; SMALL DELAY +; + JR IDE_RESET3 ; SKIP SOFT RESET ; -;#IF ((IDEMODE != IDEMODE_MK4) & (IDEMODE != IDEMODE_RC)) +; SOFT RESET ; +; RC CANNOT ACCESS DEVICE CONTROL REG, SO SKIP THIS +; +IDE_RESET2: LD A,(IY+IDE_MODE) ; GET MODE - CP IDEMODE_MK4 ; MK4? - JR Z,IDE_RESET3 ; IF SO, BYPASS CP IDEMODE_RC ; RCBUS? - JR Z,IDE_RESET3 ; IF SO, BYPASS + JR Z,IDE_RESET4 ; IF SO, BYPASS ; ; INITIATE SOFT RESET #IF (IDETRACE >= 3) PRTS(" SOFT$") #ENDIF - LD A,%00001110 ; NO INTERRUPTS, ASSERT RESET BOTH DRIVES - ;OUT (IDE_IO_CTRL),A + LD A,%00001110 ; ASSERT RESET, NO INTERRUPTS + ;OUT (IDE_REG_CTRL),A CALL IDE_OUT .DB IDE_REG_CTRL -; -IDE_RESET3: -; -;#ENDIF -; - LD DE,2 ; DELAY 32US (SPEC IS >= 25US) + LD DE,20 ; DELAY 320US (SPEC IS >= 25US) CALL VDELAY ; -;#IF (IDEMODE != IDEMODE_RC) +IDE_RESET3: ; - LD A,(IY+IDE_MODE) ; GET MODE - CP IDEMODE_RC ; RCBUS? - JR Z,IDE_RESET4 ; IF SO, BYPASS +; CONFIGURE OPERATION AND END SOFT RESET ; - ; CONFIGURE OPERATION AND END SOFT RESET #IF (IDETRACE >= 3) PRTS(" CONFIG$") #ENDIF - LD A,%00001010 ; NO INTERRUPTS, DEASSERT RESET - ;OUT (IDE_IO_CTRL),A ; PUSH TO REGISTER + LD DE,20 ; DELAY 320US (SPEC IS >= 25US) + CALL VDELAY + LD A,%00001010 ; DEASSERT RESET, NO INTERRUPTS + ;OUT (IDE_REG_CTRL),A ; PUSH TO REGISTER CALL IDE_OUT .DB IDE_REG_CTRL ; IDE_RESET4: -; -;#ENDIF -; -; SPEC ALLOWS UP TO 450MS FOR DEVICES TO ASSERT THEIR PRESENCE -; VIA -DASP. I ENCOUNTER PROBLEMS LATER ON IF I DON'T WAIT HERE -; FOR THAT TO OCCUR. THUS FAR, IT APPEARS THAT 150MS IS SUFFICIENT -; FOR ANY DEVICE ENCOUNTERED. MAY NEED TO EXTEND BACK TO 500MS -; IF A SLOWER DEVICE IS ENCOUNTERED. -; - ;LD DE,500000/16 ; ~500MS - LD DE,150000/16 ; ~???MS - CALL VDELAY + LD HL,IDE_TONORM ; NORMAL TIMEOUT NOW + LD (IDE_TIMEOUT),HL ; AND RESTORE IT ; ; INITIALIZE THE INDIVIDUAL UNITS (MASTER AND SLAVE). ; BASED ON TESTING, IT APPEARS THAT THE MASTER UNIT MUST ; BE DONE FIRST OR THIS BEHAVES BADLY. +; PUSH IY ; SAVE CFG PTR BIT 0,(IY+IDE_ACC) ; MASTER? CALL Z,IDE_GOPARTNER ; IF NOT, SWITCH TO MASTER @@ -1073,31 +1456,30 @@ IDE_INITUNIT: CALL IDE_SELUNIT ; SELECT UNIT RET NZ ; ABORT IF ERROR - LD HL,IDE_TIMEOUT ; POINT TO TIMEOUT - LD (HL),IDE_TONORM ; SET NORMAL TIMEOUT - CALL IDE_PROBE ; DO PROBE RET NZ ; JUST RETURN IF NOTHING THERE - CALL IDE_INITDEV ; IF FOUND, ATTEMPT TO INIT DEVICE - RET ; DONE + JP IDE_INITDEV ; EXIT VIA INITDEV ; ; TAKE ANY ACTIONS REQUIRED TO SELECT DESIRED PHYSICAL UNIT -; UNIT IS SPECIFIED IN IDE_UNIT -; REGISTER A IS DESTROYED ; IDE_SELUNIT: #IF (IDETRACE >= 3) CALL IDE_PRTPREFIX PRTS(" SELUNIT$") #ENDIF -; BIT 0,(IY+IDE_ACC) ; MASTER? JR Z,IDE_SELUNIT1 ; HANDLE SLAVE LD A,IDE_DRVMASTER ; MASTER +#IF (IDETRACE >= 3) + PRTS(" MASTER$") +#ENDIF JR IDE_SELUNIT2 IDE_SELUNIT1: LD A,IDE_DRVSLAVE ; SLAVE +#IF (IDETRACE >= 3) + PRTS(" SLAVE$") +#ENDIF IDE_SELUNIT2: LD (IDE_DRVHD),A ; SAVE IT XOR A ; SUCCESS @@ -1106,120 +1488,198 @@ IDE_SELUNIT2: ; ; IDE_PROBE: +; +; PROBE FOR A DRIVE ON THE INTERFACE (EITHER MASTER OR SLAVE). +; IDEALLY, THIS IS BEING CALLED IMMEDIATELY AFTER A HARD OR SOFT +; INTERFACE RESET. HOWEVER, THERE ARE SOME HARDWARE IMPLEMENTATTIONS +; WHICH ARE CAPABLE OF NEITHER A HARD NOR SOFT RESET. SO THIS +; CODE SHOULD TRY TO HANDLE THE SCENARIO WHERE NO INTERFACE RESET +; HAS OCCURRED. +; #IF (IDETRACE >= 3) CALL IDE_PRTPREFIX PRTS(" PROBE$") ; LABEL FOR IO ADDRESS #ENDIF ; +#IF (IDETRACE >= 3) + CALL IDE_IN + .DB IDE_REG_STAT + CALL PC_SPACE + CALL PRTHEXBYTE +#ENDIF +; + ; SELECT DEVICE (MASTER/SLAVE) LD A,(IDE_DRVHD) - ;OUT (IDE_IO_DRVHD),A + ;OUT (IDE_REG_DRVHD),A CALL IDE_OUT .DB IDE_REG_DRVHD #IF (IDETRACE >= 3) CALL PC_SPACE CALL PRTHEXBYTE #ENDIF - CALL DELAY ; DELAY ~16US ; - ;LD C,IDE_IO_STAT - ;IN A,(C) +; THE RC2014 SD PICO TAKES A FEW SECONDS TO INITIALIZE. ATEMPTING TO +; ACCESS IT DURING THIS TIME WILL FAIL. THE DATA LINES ALL HAVE +; PULL-DOWN RESISTORS, SO WHILE IT IS INITIALIZING, READING ANY +; REGISTER WILL CONSISTENTLY RETURN $00. THE FOLLOWING BIT OF CODE +; WILL SCAN THE IDE REGISTER BLOCK. WHILE ALL REGISTERS REMAIN ZERO, +; WE WAIT (UNTIL TIMEOUT). IN MY TESTING, IT SEEMS VERY UNLIKELY +; THAT ANY OTHER DEVICE WILL RETURN $00 FOR ALL REGISTERS. +; + LD A,(IY+IDE_MODE) ; GET MODE BITS + CP IDEMODE_RC ; RCBUS? + JR NZ,IDE_PROBE0 ; IF NOT, BYPASS +; + LD A,(IDE_DRVHD) ; GET CURRENT SETTING + BIT 4,A ; TEST SLAVE BIT + JR NZ,IDE_PROBE0 ; IF SO, BYPASS +; CALL IDE_IN .DB IDE_REG_STAT #IF (IDETRACE >= 3) CALL PC_SPACE CALL PRTHEXBYTE #ENDIF - CP $FF - JP Z,IDE_NOMEDIA - CP $78 - JP Z,IDE_NOMEDIA + OR A ; SET FLAGS + JR NZ,IDE_PROBE0 ; SKIP IF NOT $00 ; #IF (IDETRACE >= 3) - CALL IDE_REGDUMP + PRTS(" PICO$") #ENDIF -; - ;JR IDE_PROBE1 ; *DEBUG* + LD HL,500 ; 5 SECONDS +IDE_WAIT001: + ;CALL NEWLINE + LD C,(IY+IDE_IOBASE) + LD B,8 ; NUMBER OF REGISTERS TO CHECK +IDE_WAIT002: + IN A,(C) ; GET REGISTER VALUE + ;CALL PC_SPACE + ;CALL PRTHEXBYTE + OR A ; SET FLAGS + JR NZ,IDE_PROBE0 ; IF NOT ZERO, MOVE ON + INC C ; NEXT REGISTER + DJNZ IDE_WAIT002 ; CHECK ALL 8 REGS + LD DE,10000/16 ; .01 SECONDS + CALL VDELAY + DEC HL + LD A,H + OR L + JR NZ,IDE_WAIT001 ; LOOP + ;JP IDE_NOMEDIA ; GIVE UP? +; +; IF WE GET HERE AND THE DRIVE IS STILL INITIALIZING, WE NEED TO +; WAIT UNTIL THE DRIVE IS READY. IN THIS CASE BUSY *WILL* BE HIGH. +; BASED ON TESTING, DRDY AND DSC VALUES VARY. EVERYTHING ELSE SEEMS +; TO BE ZERO. SO, WE FILTER OUT DRDY & DSC, THEN LOOK FOR BUSY=1 +; AND ALL ELSE ZERO. THIS GENERALLY AVOIDS VALUES THAT ARE TYPICAL +; FOR FLOATING PORTS AND SO CAN BE USED TO DETERMINE IF WE NEED TO +; WAIT FOR THE DEVICE TO BE READY. THIS WAIT IS MANDATORY BECAUSE +; SOME (IF NOT ALL) DEVICES WILL NOT PERSIST REGISTER VALUES UNTIL +; THE DRIVE IS READY. ; IDE_PROBE0: - CALL IDE_WAITBSY ; WAIT FOR BUSY TO CLEAR - JP NZ,IDE_NOMEDIA ; CONVERT TIMEOUT TO NO MEDIA AND RETURN -; -#IF (IDETRACE >= 3) - CALL IDE_REGDUMP -#ENDIF -; - ; CHECK STATUS - ;IN A,(IDE_IO_STAT) ; GET STATUS CALL IDE_IN .DB IDE_REG_STAT #IF (IDETRACE >= 3) CALL PC_SPACE - CALL PRTHEXBYTE ; IF DEBUG, PRINT STATUS + CALL PRTHEXBYTE #ENDIF - OR A ; SET FLAGS TO TEST FOR ZERO - JP Z,IDE_NOMEDIA ; - ; CHECK SIGNATURE -#IF (IDETRACE >= 3) - CALL PC_SPACE -#ENDIF - ;IN A,(IDE_IO_COUNT) - CALL IDE_IN - .DB IDE_REG_COUNT + AND %10101111 ; FILTER OUT DRDY & DSC + CP $80 ; INIT IN PROGRESS? + JR NZ,IDE_PROBE1 ; IF NOT, SKIP AHEAD +; #IF (IDETRACE >= 3) - CALL PRTHEXBYTE + PRTS(" WAIT$") #ENDIF - CP $01 - JP NZ,IDE_NOMEDIA +; + LD HL,(IDE_TIMEOUT) ; GET CURRENT TIMEOUT + PUSH HL ; SAVE IT + LD HL,IDE_TOSLOW ; SLOW TIMEOUT FOR THIS + LD (IDE_TIMEOUT),HL ; SET IT + CALL IDE_WAITBSY ; WAIT FOR BUSY TO CLEAR + POP HL ; RECOVER TIMEOUT + LD (IDE_TIMEOUT),HL ; SET IT +; #IF (IDETRACE >= 3) + CALL IDE_IN + .DB IDE_REG_STAT CALL PC_SPACE + CALL PRTHEXBYTE #ENDIF - ;IN A,(IDE_IO_SECT) +; +; TEST FOR PRESENCE OF IDE REGISTERS. USE LBA0/1 TO SEE +; IF VALUE CAN BE PERSISTED. THE USE OF BOTH LBA0 AND LBA1 +; IS TO MAINTAIN CONSISTENCY WITH THE THE PPIDE DRIVER BECAUSE +; PPI ITSELF WILL PERSIST THE LAST VALUE WRITTEN, SO WE USE +; MULTIPLE REGISTERS TO WORK AROUND THIS FALSE POSITIVE. +; +IDE_PROBE1: + ; $AA -> LBA0 + LD A,$AA + CALL IDE_OUT + .DB IDE_REG_LBA0 +; + ; $55 => LBA1 + LD A,$55 + CALL IDE_OUT + .DB IDE_REG_LBA1 +; + ; TEST LBA0 == $AA CALL IDE_IN - .DB IDE_REG_SECT + .DB IDE_REG_LBA0 #IF (IDETRACE >= 3) + CALL PC_SPACE CALL PRTHEXBYTE #ENDIF - CP $01 + CP $AA JP NZ,IDE_NOMEDIA -#IF (IDETRACE >= 3) - CALL PC_SPACE -#ENDIF - ;IN A,(IDE_IO_CYLLO) +; + ; TEST LBA1 == $55 CALL IDE_IN - .DB IDE_REG_CYLLO + .DB IDE_REG_LBA1 #IF (IDETRACE >= 3) + CALL PC_SPACE CALL PRTHEXBYTE #ENDIF - CP $00 + CP $55 JP NZ,IDE_NOMEDIA +; #IF (IDETRACE >= 3) - CALL PC_SPACE -#ENDIF - ;IN A,(IDE_IO_CYLHI) - CALL IDE_IN - .DB IDE_REG_CYLHI -#IF (IDETRACE >= 3) - CALL PRTHEXBYTE + CALL IDE_REGDUMP #ENDIF - CP $00 - JP NZ,IDE_NOMEDIA ; -IDE_PROBE1: - ; SIGNATURE MATCHES ATA DEVICE, RECORD TYPE AND RETURN SUCCESS - LD A,IDE_TYPEATA ; TYPE = ATA - LD (IY+IDE_TYPE),A ; SET IT IN INSTANCE DATA - XOR A ; SIGNAL SUCCESS - RET ; DONE, NOTE THAT A=0 AND Z IS SET + XOR A + RET ; ; (RE)INITIALIZE DEVICE ; IDE_INITDEV: ; - LD A,(IY+IDE_TYPE) ; GET THE DEVICE TYPE - OR A ; SET FLAGS - JP Z,IDE_NOMEDIA ; EXIT SETTING NO MEDIA STATUS +#IF (IDETRACE >= 3) + CALL IDE_PRTPREFIX + PRTS(" INITDEV$") ; LABEL FOR IO ADDRESS +#ENDIF +; +#IF (IDETRACE >= 3) + CALL IDE_REGDUMP +#ENDIF +; +; ON ENTRY, WE HAVE ALREADY CHECKED THAT THE BUSY BIT IS CLEARED AND +; DRDY SHOULD BE SET. IF DRDY IS NOT SET, IF COULD MEAN EITHER A +; NON-EXISTENT SLAVE DEVICE OR AN ATAPI DEVICE. TO AVOID UNNECESSARY +; TIMEOUTS, WE CHECK FOR DRDY. IF IT IS NOT SET, THEN WE ASSUME THIS +; MUST BE AN ATAPI DEVICE AND GO TRY TO DO THE ATAPI INITIALIZATION. +; IF THIS WAS ACTUALLY A NON-EXISTENT SLAVE, THE ATAPI INITIALIZATION +; WILL HANDLE THIS PRETTY WELL. +; + CALL IDE_IN + .DB IDE_REG_STAT + BIT 6,A ; DRDY? + JR Z,IDE_INITPDEV ; ODD, MIGHT BE ATAPI +; +; WE NEED TO SETUP 8-BIT MODE BEFORE DOING ANYTHING ELSE ; BIT 1,(IY+IDE_ACC) ; 8 BIT ACCESS? JR Z,IDE_INITDEV0 ; NO, DO 16 BIT INIT @@ -1237,22 +1697,23 @@ IDE_INITDEV0: ; IDE_INITDEV00: ; + ; WE NOW USE AN IDENTIFY DEVICE COMMAND TO CONFIRM THE + ; DEVICE IS REALLY THERE AND GET SOME ATTRIBUTES. IF THE + ; COMMAND FAILS, IT MAY BE THAT WE HAVE AN ATAPI DEVICE AND + ; SO WE GO TO THE ATAPI INITIALIZATION ON FAILURE. CALL IDE_IDENTIFY ; EXECUTE IDENTIFY COMMAND - RET NZ ; BAIL OUT ON ERROR + JR NZ,IDE_INITPDEV ; TRY ATAPI ON FAILURE +; + ; DECLARE WE ARE ATA + LD A,IDE_TYPEATA ; OTHERWISE TYPE=ATA + LD (IY+IDE_TYPE),A ; SET IT IN INSTANCE DATA ; LD DE,HB_WRKBUF ; POINT TO BUFFER -#IF (IDETRACE >= 3) +#IF (IDETRACE >= 4) CALL DUMP_BUFFER ; DUMP IT IF DEBUGGING #ENDIF ; - LD (IY+IDE_MED),0 ; CLEAR FLAGS -; - ; DETERMINE IF CF DEVICE BY TESTING FOR CF CARD SIGNATURES - ; IN THEORY, THERE ARE SOME OTHER POSSIBLE VARIATIONS, BUT - ; THEY ARE NOT RECOMMENDED BY THE CF CARD SPEC AND MIGHT - ; OVERLAP WITH "REAL" HARD DISK SIGNATURES. I HAVE NEVER - ; SEEN A CF CARD THAT DID NOT USE ONE OF THE BELOW. - ; CREDIT TO LASZLO SZOLNOKI + LD (IY+IDE_MED),0 ; CLEAR MEDIA FLAGS ; #IF (IDETRACE >= 3) CALL IDE_PRTPREFIX @@ -1261,38 +1722,15 @@ IDE_INITDEV00: CALL PRTHEXWORD #ENDIF ; -; SEE PAGE 114 OF CF+ & CF SPECIFICATION REV. 3.0 FOR CF CARD -; SIGNATURE VALUES. ALL OF THE BELOW ARE DOCUMENTED THERE EXCEPT -; $045A WHICH IS A VALUE DISCOVERED ON A CF<->SD CARD ADAPTER. -; -; SIGNATURE $045A IS NOT LISTED IN THE CF SPEC. IT WAS ADDED BECAUSE -; IT WAS SEEN IN THE WILD ON A CF-SD ADAPTER. HOWEVER IT HAS NOW -; ALSO BEEN SEEN ON A SPINNING HARD DISK. SINCE IT IS AMBIGUOUS, I -; WILL CONSIDER IT TO BE A HARD DISK. -; - LD BC,$848A ; STANDARD CF CARD SIGNATURE %1000 1111 1000 1010 - CALL IDE_INITDEV000 ; TEST & SET - LD BC,$044A ; ALT SIG FOR CF NON-REMOVABLE %0000 0100 0100 1010 - CALL IDE_INITDEV000 ; TEST & SET - ;LD BC,$045A ; ?ALT SIG FOR CF NON-REMOVABLE %0000 0100 0101 1010 - ;CALL IDE_INITDEV000 ; TEST & SET - LD BC,$0040 ; ALT SIG FOR CF NON-REMOVABLE %0000 0000 0100 0000 - CALL IDE_INITDEV000 ; TEST & SET - JR IDE_INITDEV1 ; CONTINUE INIT -; -IDE_INITDEV000: - ; CHECK IF FIRST WORD OF IDENTIFY DATA MATCHES VALUE IN BC - ; AND SET CF FLAG IF SO - LD HL,(HB_WRKBUF) ; FIRST WORD OF IDENTIFY DATA - OR A ; CLEAR CARRY - SBC HL,BC ; COMPARE - RET NZ ; ABORT IF NOT EQUAL + ; DETERMINE IF COMPACTFLASH MEDIA + LD A,(HB_WRKBUF+(83*2)) ; LOW BYTE OF WORD 83 + BIT 2,A ; TEST CFA FEATURE SET BIT + JR Z,IDE_INITDEV1 ; IF NOT, SKIP SET 0,(IY+IDE_MED) ; ELSE SET FLAGS BIT FOR CF MEDIA - RET ; AND RETURN ; IDE_INITDEV1: ; DETERMINE IF LBA CAPABLE - LD A,(HB_WRKBUF+98+1) ; GET BYTE WITH LBA BIT FROM BUFFER + LD A,(HB_WRKBUF+98+1) ; HIGH BYTE OF WORD 49 BIT 1,A ; CHECK THE LBA BIT JR Z,IDE_INITDEV2 ; NOT SET, BYPASS SET 1,(IY+IDE_MED) ; SET FLAGS BIT FOR LBA @@ -1309,12 +1747,142 @@ IDE_INITDEV2: POP BC ; RECOVER POINTER TO CAPACITY ENTRY CALL ST32 ; SAVE CAPACITY ; - ; RESET CARD STATUS TO 0 (OK) + ; RECORD STATUS OK XOR A ; A := 0 (STATUS = OK) LD (IY+IDE_STAT),A ; SAVE IT ; RET ; RETURN, A=0, Z SET ; +; (RE)INITIALIZE PACKET DEVICE +; +IDE_INITPDEV: +; +#IF (IDETRACE >= 3) + CALL IDE_PRTPREFIX + PRTS(" INITPDEV$") ; LABEL FOR IO ADDRESS +#ENDIF + ; + CALL IDE_IDENTIFYPACKET ; EXECUTE IDENTIFY COMMAND + RET NZ ; BAIL OUT ON ERROR +; + ; DECLARE WE ARE ATAPI + LD A,IDE_TYPEATAPI ; OTHERWISE TYPE=ATAPI + LD (IY+IDE_TYPE),A ; SET IT IN INSTANCE DATA +; + LD DE,HB_WRKBUF ; POINT TO BUFFER +#IF (IDETRACE >= 4) + CALL DUMP_BUFFER ; DUMP IT IF DEBUGGING +#ENDIF +; + LD (IY+IDE_MED),0 ; CLEAR FLAGS + SET 1,(IY+IDE_MED) ; SET FLAGS BIT FOR LBA (ASSUMED) +; + ; WAIT FOR UNIT READY + LD B,0 ; MAX LOOPS + LD C,4 ; MAX ERRORS +IDE_INITPDEV1: + DEC B ; CHECK LOOP COUNTER EXCEEDED + JP Z,IDE_NOMEDIA ; TREAT AS NO MEDIA + PUSH BC ; SAVE LOOP CONTROL + LD HL,IDE_PKTCMD_TSTRDY ; TEST UNIT READY + XOR A ; READ DIRECTION + LD (IDE_XFRDIR),A ; SAVE IT + CALL IDE_RUNPCMD ; ISSUE PACKET COMMAND + CALL NZ,IDE_CHKPCMD ; IF ERROR, DIAGNOSE IT + POP BC ; RESTORE LOOP CONTROL + JR Z,IDE_INITPDEV2 ; IF NO ERROR, CONTINUE + CP IDE_STNOMEDIA ; EXPLICIT NO MEDIA RESULT? + RET Z ; EXIT REPORTING NO MEDIA + CP IDE_STNOTRDY ; BECOMING READY? + JR Z,IDE_INITDEVP1A ; IF SO, NOT AN ERROR, LOOP + DEC C ; DEC ERROR LIMIT + RET Z ; BAIL OUT, ERR LIMIT EXCEEDED + JR IDE_INITPDEV1 ; LOOP +IDE_INITDEVP1A: + LD DE,100000/16 ; WAIT 1/10 SECOND + CALL VDELAY ; DO IT + JR IDE_INITPDEV1 ; AND LOOP +; +IDE_INITPDEV2: +#IF (IDETRACE >= 3) + LD A,B + NEG + PRTS("\r\nLOOPS=$") + CALL PRTHEXBYTE +#ENDIF +; + ; GET AND RECORD CAPACITY + LD HL,HB_WRKBUF + LD (IDE_DSKBUF),HL + LD HL,IDE_PKTCMD_RDCAP + XOR A ; READ DIRECTION + LD (IDE_XFRDIR),A ; SAVE IT + CALL IDE_RUNPCMD + JP NZ,IDE_CHKPCMD +; +#IF (IDETRACE >= 3) + PRTS("\r\nRDCAP:$") + LD A,8 + LD DE,HB_WRKBUF + CALL PRTHEXBUF +#ENDIF +; + ; CAPACITY IS RETURNED IN A 4 BYTE, BIG ENDIAN FIELD AND + ; INDICATES THE LAST LBA VALUE. WE NEED TO CONVERT THIS TO + ; LITTLE ENDIAN AND INCREMENT THE VALUE TO MAKE IT A CAPACITY + ; COUNT INSTEAD OF A LAST LBA VALUE. + LD A,IDE_MEDCAP ; OFFSET IN CFG FOR CAPACITY + CALL LDHLIYA ; POINTER TO HL + PUSH HL ; SAVE IT + LD HL,HB_WRKBUF ; POINT TO VALUE IN CMD RESULT + CALL LD32 ; LOAD IT TO DE:HL + LD A,L ; FLIP BYTES + LD L,D ; ... BIG ENDIAN + LD D,A ; ... TO LITTLE ENDIAN + LD A,H + LD H,E + LD E,A + CALL INC32 ; INCREMENT TO FINAL VALUE + POP BC ; RECOVER SAVE LOCATION + CALL ST32 ; STORE VALUE +; + ; CHECK BLOCK LENGTH. WE CURRENTLY ONLY SUPPORT 512 BYTE + ; BLOCKS. CD-ROM DEVICES (WHICH USE 2k BLOCKS) WILL FAIL + ; HERE AS NOT SUPPORTED. + LD HL,HB_WRKBUF+4 ; POINT TO BLK SIZE IN RESULT + CALL LD32 ; LOAD IT TO DE:HL + ; VALUE IS BIG ENDIAN, SO LH:ED MUST BE EXACTLY 0000:0200 + LD A,L ; CHECK THAT LH + OR H ; ... IS ZERO + JP NZ,IDE_NOTSUP ; IF NOT, FAIL AS NOT SUP + LD A,D ; LOAD D + OR A ; SET FLAGS + JP NZ,IDE_NOTSUP ; IF NOT ZERO, FAIL AS NOT SUP + LD A,E ; LOAD E + CP 2 ; CHECK IT IF IS 2 + JP NZ,IDE_NOTSUP ; IF NOT, FAIL AS NOT SUP +; + ; CHECK BLOCK LENGTH. WE CURRENTLY ONLY SUPPORT 512 BYTE + ; BLOCKS. CD-ROM DEVICES (WHICH USE 2k BLOCKS) WILL FAIL + ; HERE AS NOT SUPPORTED. + LD HL,HB_WRKBUF+4 ; POINT TO BLK SIZE IN RESULT + CALL LD32 ; LOAD IT TO DE:HL + ; VALUE IS BIG ENDIAN, SO LH:ED MUST BE EXACTLY 0000:0200 + LD A,L ; CHECK THAT LH + OR H ; ... IS ZERO + JP NZ,IDE_NOTSUP ; IF NOT, FAIL AS NOT SUP + LD A,D ; LOAD E + OR A ; SET FLAGS + JP NZ,IDE_NOTSUP ; IF NOT ZERO, FAIL AS NOT SUP + LD A,E ; LOAD D + CP 2 ; CHECK IT IF IS 2 + JP NZ,IDE_NOTSUP ; IF NOT, FAIL AS NOT SUP +; + ; RECORD STATUS OK + XOR A ; A := 0 (STATUS = OK) + LD (IY+IDE_STAT),A ; SAVE IT + RET +; ; SWITCH IY POINTER FROM CURRENT UNIT CFG TO PARTNER UNIT CFG ; IDE_GOPARTNER: @@ -1338,12 +1906,12 @@ IDE_CHKERR: ; ; IDE_WAITRDY: - LD A,(IDE_TIMEOUT) ; GET TIMEOUT IN 0.05 SECS + LD A,(IDE_TIMEOUT) ; GET TIMEOUT IN 0.1 SECS LD B,A ; PUT IN OUTER LOOP VAR IDE_WAITRDY1: - LD DE,(IDE_TOSCALER) ; CPU SPPED SCALER TO INNER LOOP VAR + LD DE,(IDE_TOSCALER) ; CPU SPEED SCALER TO INNER LOOP VAR IDE_WAITRDY2: - ;IN A,(IDE_IO_STAT) ; READ STATUS + ;IN A,(IDE_REG_STAT) ; READ STATUS CALL IDE_IN .DB IDE_REG_STAT LD C,A ; SAVE IT @@ -1360,12 +1928,12 @@ IDE_WAITRDY2: ; ; IDE_WAITDRQ: - LD A,(IDE_TIMEOUT) ; GET TIMEOUT IN 0.05 SECS + LD A,(IDE_TIMEOUT) ; GET TIMEOUT IN 0.1 SECS LD B,A ; PUT IN OUTER LOOP VAR IDE_WAITDRQ1: LD DE,(IDE_TOSCALER) ; CPU SPPED SCALER TO INNER LOOP VAR IDE_WAITDRQ2: - ;IN A,(IDE_IO_STAT) ; WAIT FOR DRIVE'S 512 BYTE READ BUFFER + ;IN A,(IDE_REG_STAT) ; READ STATUS CALL IDE_IN .DB IDE_REG_STAT LD C,A ; SAVE IT @@ -1382,14 +1950,14 @@ IDE_WAITDRQ2: ; ; IDE_WAITBSY: - LD A,(IDE_TIMEOUT) ; GET TIMEOUT IN 0.05 SECS + LD A,(IDE_TIMEOUT) ; GET TIMEOUT IN 0.1 SECS LD B,A ; PUT IN OUTER LOOP VAR IDE_WAITBSY1: LD DE,(IDE_TOSCALER) ; CPU SPPED SCALER TO INNER LOOP VAR IDE_WAITBSY2: - ;IN A,(IDE_IO_STAT) ; WAIT FOR DRIVE'S 512 BYTE READ BUFFER ; 11TS - CALL IDE_IN ; 17TS + ???TS - .DB IDE_REG_STAT ; 0TS + ;IN A,(IDE_REG_STAT) ; READ STATUS + CALL IDE_IN ; 17TS + 121TS + .DB IDE_REG_STAT LD C,A ; SAVE IT ; 4TS AND %10000000 ; TO FILL (OR READY TO FILL) ; 7TS RET Z ; 5TS @@ -1398,25 +1966,25 @@ IDE_WAITBSY2: OR E ; 4TS JR NZ,IDE_WAITBSY2 ; 12TS DJNZ IDE_WAITBSY1 ; ----- - JP IDE_BSYTO ; EXIT WITH BSYTO ERR ; ??TS + JP IDE_BSYTO ; EXIT WITH BSYTO ERR ; 180 ; ; READ A VALUE FROM THE DEVICE POINTED TO BY IY AND RETURN IT IN A -; +; IDE_IN: - EX (SP),HL ; GET PARM POINTER - PUSH BC - LD A,(HL) - INC HL - LD C,(IY+IDE_IOBASE) - ADD A,C - LD C,A - IN A,(C) - POP BC - EX (SP),HL ; RESTORE STACK - RET + EX (SP),HL ; GET PARM POINTER ; 19TS + PUSH BC ; 11TS + LD A,(HL) ; 7TS + INC HL ; 6TS + LD C,(IY+IDE_IOBASE) ; 19TS + ADD A,C ; 4TS + LD C,A ; 4TS + IN A,(C) ; 12TS + POP BC ; 10TS + EX (SP),HL ; RESTORE STACK ; 19TS + RET ; 10TS +; ; ---- +; OUTPUT VALUE IN A TO THE DEVICE POINTED TO BY IY ; 121TS ; -; OUTPUT VALUE IN A TO THE DEVICE POINTED TO BY IY -; IDE_OUT: EX (SP),HL ; GET PARM POINTER PUSH BC @@ -1466,6 +2034,14 @@ IDE_BSYTO: LD A,IDE_STBSYTO JR IDE_ERR ; +IDE_NOTSUP: + LD A,IDE_STNOTSUP + JR IDE_ERR +; +IDE_NOTRDY: + LD A,IDE_STNOTRDY + JR IDE_ERR +; IDE_ERR: LD (IY+IDE_STAT),A ; SAVE NEW STATUS ; @@ -1483,48 +2059,67 @@ IDE_PRTERR: RET Z ; DONE IF NO ERRORS ; FALL THRU TO IDE_PRTSTAT ; -; PRINT STATUS STRING (STATUS NUM IN A) +; PRINT FULL DEVICE STATUS LINE ; IDE_PRTSTAT: PUSH AF PUSH DE PUSH HL LD A,(IY+IDE_STAT) + CP IDE_STINVUNIT + JR Z,IDE_PRTSTAT2 ; INVALID UNIT IS SPECIAL CASE + CALL IDE_PRTPREFIX ; PRINT UNIT PREFIX + JR IDE_PRTSTAT3 +IDE_PRTSTAT2: + CALL NEWLINE + PRTS("IDE:$") ; NO UNIT NUM IN PREFIX FOR INVALID UNIT +IDE_PRTSTAT3: + CALL PC_SPACE ; FORMATTING + CALL IDE_PRTSTATSTR + POP HL + POP DE + POP AF + RET +; +; PRINT STATUS STRING +; +IDE_PRTSTATSTR: + PUSH AF + PUSH DE + LD A,(IY+IDE_STAT) OR A LD DE,IDE_STR_STOK - JR Z,IDE_PRTSTAT1 + JR Z,IDE_PRTSTATSTR1 INC A LD DE,IDE_STR_STINVUNIT - JR Z,IDE_PRTSTAT2 ; INVALID UNIT IS SPECIAL CASE + JR Z,IDE_PRTSTATSTR1 INC A LD DE,IDE_STR_STNOMEDIA - JR Z,IDE_PRTSTAT1 + JR Z,IDE_PRTSTATSTR1 INC A LD DE,IDE_STR_STCMDERR - JR Z,IDE_PRTSTAT1 + JR Z,IDE_PRTSTATSTR1 INC A LD DE,IDE_STR_STIOERR - JR Z,IDE_PRTSTAT1 + JR Z,IDE_PRTSTATSTR1 INC A LD DE,IDE_STR_STRDYTO - JR Z,IDE_PRTSTAT1 + JR Z,IDE_PRTSTATSTR1 INC A LD DE,IDE_STR_STDRQTO - JR Z,IDE_PRTSTAT1 + JR Z,IDE_PRTSTATSTR1 INC A LD DE,IDE_STR_STBSYTO - JR Z,IDE_PRTSTAT1 + JR Z,IDE_PRTSTATSTR1 + INC A + LD DE,IDE_STR_STNOTSUP + JR Z,IDE_PRTSTATSTR1 + INC A + LD DE,IDE_STR_STNOTRDY + JR Z,IDE_PRTSTATSTR1 LD DE,IDE_STR_STUNK -IDE_PRTSTAT1: - CALL IDE_PRTPREFIX ; PRINT UNIT PREFIX - JR IDE_PRTSTAT3 -IDE_PRTSTAT2: - CALL NEWLINE - PRTS("IDE:$") ; NO UNIT NUM IN PREFIX FOR INVALID UNIT -IDE_PRTSTAT3: - CALL PC_SPACE ; FORMATTING +IDE_PRTSTATSTR1: CALL WRITESTR - POP HL POP DE POP AF RET @@ -1537,7 +2132,7 @@ IDE_REGDUMP: PUSH BC CALL PC_SPACE CALL PC_LBKT - ;LD C,IDE_IO_CMD + ;LD C,IDE_REG_CMD LD A,(IY+IDE_IOBASE) ADD A,IDE_REG_CMD LD C,A @@ -1568,30 +2163,6 @@ IDE_PRTPREFIX1: CALL PC_COLON POP AF RET -;;; -;;; -;;; -;;#IF (DSKYENABLE) -;;IDE_DSKY: -;; LD HL,DSKY_HEXBUF ; POINT TO DSKY BUFFER -;; CALL IDE_IN -;; .DB IDE_REG_DRVHD -;; LD (HL),A ; SAVE IN BUFFER -;; INC HL ; INCREMENT BUFFER POINTER -;; CALL IDE_IN -;; .DB IDE_REG_CYLHI -;; LD (HL),A ; SAVE IN BUFFER -;; INC HL ; INCREMENT BUFFER POINTER -;; CALL IDE_IN -;; .DB IDE_REG_CYLLO -;; LD (HL),A ; SAVE IN BUFFER -;; INC HL ; INCREMENT BUFFER POINTER -;; CALL IDE_IN -;; .DB IDE_REG_SECT -;; LD (HL),A ; SAVE IN BUFFER -;; CALL DSKY_HEXOUT ; SEND IT TO DSKY -;; RET -;;#ENDIF ; ;============================================================================= ; STRING DATA @@ -1605,6 +2176,8 @@ IDE_STR_STIOERR .TEXT "IO ERROR$" IDE_STR_STRDYTO .TEXT "READY TIMEOUT$" IDE_STR_STDRQTO .TEXT "DRQ TIMEOUT$" IDE_STR_STBSYTO .TEXT "BUSY TIMEOUT$" +IDE_STR_STNOTSUP .TEXT "NOT SUPPORTED$" +IDE_STR_STNOTRDY .TEXT "NOT READY$" IDE_STR_STUNK .TEXT "UNKNOWN ERROR$" ; IDE_STR_NO .TEXT "NO$" @@ -1616,17 +2189,29 @@ IDE_STR_MODE_DIDE .TEXT "DIDE$" IDE_STR_MODE_MK4 .TEXT "MK4$" IDE_STR_MODE_RC .TEXT "RC$" ; +IDE_STR_TYPEATA .TEXT " ATA$" +IDE_STR_TYPEATAPI .TEXT " ATAPI$" +; ;============================================================================= ; DATA STORAGE ;============================================================================= ; IDE_TIMEOUT .DB IDE_TONORM ; WAIT FUNCS TIMEOUT IN TENTHS OF SEC -IDE_TOSCALER .DW CPUMHZ * 961 ; WAIT FUNCS SCALER FOR CPU SPEED +IDE_TOSCALER .DW CPUMHZ * 556 ; WAIT FUNCS SCALER FOR CPU SPEED ; IDE_CMD .DB 0 ; PENDING COMMAND TO PROCESS IDE_IOFNADR .DW 0 ; PENDING IO FUNCTION ADDRESS IDE_DRVHD .DB 0 ; CURRENT DRIVE/HEAD MASK ; IDE_DSKBUF .DW 0 ; ACTIVE DISK BUFFER +IDE_XFRDIR .DB 0 ; 0=READ, NON-0=WRITE ; IDE_DEVNUM .DB 0 ; TEMP DEVICE NUM USED DURING INIT +; +; SCSI COMMAND TEMPLATES (ALWAYS 12 BYTES FOR ATAPI) +; +IDE_PKTCMD_RW .DB $00, $00, $00, $00, $01, $00, $00, $00, $00, $00, $00, $00 ; READ/WRITE SECTOR +IDE_PKTCMD_SENSE .DB $03, $00, $00, $00, $FF, $00, $00, $00, $00, $00, $00, $00 ; REQUEST SENSE DATA +IDE_PKTCMD_RDCAP .DB $25, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 ; READ CAPACITY +IDE_PKTCMD_RW10 .DB $28, $00, $00, $00, $00, $00, $00, $00, $01, $00, $00, $00 ; READ/WRITE SECTOR +IDE_PKTCMD_TSTRDY .DB $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 ; TEST UNIT READY diff --git a/Source/HBIOS/imm.asm b/Source/HBIOS/imm.asm new file mode 100644 index 00000000..d85a76cd --- /dev/null +++ b/Source/HBIOS/imm.asm @@ -0,0 +1,1567 @@ +; +;============================================================================= +; IMM DISK DRIVER +;============================================================================= +; +; PARALLEL PORT INTERFACE FOR SCSI DISK DEVICES USING A PARALLEL PORT +; ADAPTER. PRIMARILY TARGETS PARALLEL PORT IOMEGA ZIP DRIVES. +; +; INTENDED TO CO-EXIST WITH LPT DRIVER. +; +; CREATED BY WAYNE WARTHEN FOR ROMWBW HBIOS. +; MUCH OF THE CODE IS DERIVED FROM LINUX AND FUZIX (ALAN COX). +; - https://github.com/EtchedPixels/FUZIX +; - https://github.com/torvalds/linux +; +; 05/23/2023 WBW - INITIAL RELEASE +; 05/26/2023 WBW - CLEAN UP, LED ACTIVITY +; 05/27/2023 WBW - ADDED SPP MODE +; 06/06/2023 WBW - OPTIMIZE BLOCK READ AND WRITE +; +;============================================================================= +; +; IBM PC STANDARD PARALLEL PORT (SPP): +; - NHYODYNE PRINT MODULE +; +; PORT 0 (OUTPUT): +; +; D7 D6 D5 D4 D3 D2 D1 D0 +; +-------+-------+-------+-------+-------+-------+-------+-------+ +; | PD7 | PD6 | PD5 | PD4 | PD3 | PD2 | PD1 | PD0 | +; +-------+-------+-------+-------+-------+-------+-------+-------+ +; +; PORT 1 (INPUT): +; +; D7 D6 D5 D4 D3 D2 D1 D0 +; +-------+-------+-------+-------+-------+-------+-------+-------+ +; | /BUSY | /ACK | POUT | SEL | /ERR | 0 | 0 | 0 | +; +-------+-------+-------+-------+-------+-------+-------+-------+ +; +; PORT 2 (OUTPUT): +; +; D7 D6 D5 D4 D3 D2 D1 D0 +; +-------+-------+-------+-------+-------+-------+-------+-------+ +; | STAT1 | STAT0 | ENBL | PINT | SEL | RES | LF | STB | +; +-------+-------+-------+-------+-------+-------+-------+-------+ +; +;============================================================================= +; +; MG014 STYLE INTERFACE: +; - RCBUS MG014 MODULE +; +; PORT 0 (OUTPUT): +; +; D7 D6 D5 D4 D3 D2 D1 D0 +; +-------+-------+-------+-------+-------+-------+-------+-------+ +; | PD7 | PD6 | PD5 | PD4 | PD3 | PD2 | PD1 | PD0 | +; +-------+-------+-------+-------+-------+-------+-------+-------+ +; +; PORT 1 (INPUT): +; +; D7 D6 D5 D4 D3 D2 D1 D0 +; +-------+-------+-------+-------+-------+-------+-------+-------+ +; | | | | /ERR | SEL | POUT | BUSY | /ACK | +; +-------+-------+-------+-------+-------+-------+-------+-------+ +; +; PORT 2 (OUTPUT): +; +; D7 D6 D5 D4 D3 D2 D1 D0 +; +-------+-------+-------+-------+-------+-------+-------+-------+ +; | LED | | | | /SEL | /RES | /LF | /STB | +; +-------+-------+-------+-------+-------+-------+-------+-------+ +; +;============================================================================= +; +; TODO: +; +; NOTES: +; +; - THIS DRIVER IS FOR THE ZIP DRIVE IMM INTERFACE. IT WILL SIMPLY +; FAIL TO EVEN RECOGNIZE A ZIP DRIVE WITH THE OLDER PPA INTERFACE. +; THERE DOES NOT SEEM TO BE A WAY TO VISUALLY DETERMINE IF A ZIP +; DRIVE IS PPA OR IMM. SIGH. +; +; - THIS DRIVER OPERATES USES NIBBLE READ MODE. ALTHOUGH THE 8255 +; (MG014) CAN READ OR WRITE TO PORT A (DATA), IT "GLITCHES" WHEN +; THE MODE IS CHANGED CAUSING THE CONTROL LINES TO CHANGE AND +; BREAKS THE PROTOCOL. I SUSPECT THE MBC SPP CAN SUPPORT FULL BYTE +; MODE, (PS2 STYLE), BUT I HAVE NOT ATTEMPTED IT. +; +; - RELATIVE TO ABOVE, THIS BEAST IS SLOW. IN ADDITION TO THE +; NIBBLE MODE READS, THE MG014 ASSIGNS SIGNALS DIFFERENTLY THAN +; THE STANDARD IBM PARALLEL PORT WHICH NECESSITATES A BUNCH OF EXTRA +; BIT FIDDLING ON EVERY READ. +; +; - SOME OF THE DATA TRANSFERS HAVE NO BUFFER OVERRUN CHECKS. IT IS +; ASSUMED SCSI DEVICES WILL SEND/REQUEST THE EXPECTED NUMBER OF BYTES. +; +; IMM PORT OFFSETS +; +IMM_IODATA .EQU 0 ; PORT A, DATA, OUT +IMM_IOSTAT .EQU 1 ; PORT B, STATUS, IN +IMM_IOCTRL .EQU 2 ; PORT C, CTRL, OUT +IMM_IOSETUP .EQU 3 ; PPI SETUP +; +; SCSI UNIT IDS +; +IMM_SELF .EQU 7 +IMM_TGT .EQU 6 +; +; IMM DEVICE STATUS +; +IMM_STOK .EQU 0 +IMM_STNOMEDIA .EQU -1 +IMM_STCMDERR .EQU -2 +IMM_STIOERR .EQU -3 +IMM_STTO .EQU -4 +IMM_STNOTSUP .EQU -5 +; +; IMM DEVICE CONFIGURATION +; +IMM_CFGSIZ .EQU 12 ; SIZE OF CFG TBL ENTRIES +; +; PER DEVICE DATA OFFSETS IN CONFIG TABLE ENTRIES +; +IMM_DEV .EQU 0 ; OFFSET OF DEVICE NUMBER (BYTE) +IMM_MODE .EQU 1 ; OPERATION MODE: IMM MODE (BYTE) +IMM_STAT .EQU 2 ; LAST STATUS (BYTE) +IMM_IOBASE .EQU 3 ; IO BASE ADDRESS (BYTE) +IMM_MEDCAP .EQU 4 ; MEDIA CAPACITY (DWORD) +IMM_LBA .EQU 8 ; OFFSET OF LBA (DWORD) +; +; MACROS +; +#DEFINE IMM_WCTL(VAL) LD A,VAL \ CALL IMM_WRITECTRL +#DEFINE IMM_WDATA(VAL) LD A,VAL \ CALL IMM_WRITEDATA +; +; INCLUDE MG014 NIBBLE MAP FOR MG014 MODE +; +#IF (IMMMODE == IMMMODE_MG014) + #DEFINE MG014_MAP +#ENDIF +; +;============================================================================= +; INITIALIZATION ENTRY POINT +;============================================================================= +; +IMM_INIT: + LD IY,IMM_CFG ; POINT TO START OF CONFIG TABLE +; +IMM_INIT1: + LD A,(IY) ; LOAD FIRST BYTE TO CHECK FOR END + CP $FF ; CHECK FOR END OF TABLE VALUE + JR NZ,IMM_INIT2 ; IF NOT END OF TABLE, CONTINUE + XOR A ; SIGNAL SUCCESS + RET ; AND RETURN +; +IMM_INIT2: + CALL NEWLINE ; FORMATTING + PRTS("IMM:$") ; DRIVER LABEL +; + PRTS(" IO=0x$") ; LABEL FOR IO ADDRESS + LD A,(IY+IMM_IOBASE) ; GET IO BASE ADDRES + CALL PRTHEXBYTE ; DISPLAY IT +; + PRTS(" MODE=$") ; LABEL FOR MODE + LD A,(IY+IMM_MODE) ; GET MODE BITS + LD HL,IMM_STR_MODE_MAP + ADD A,A + CALL ADDHLA + LD E,(HL) + INC HL + LD D,(HL) + CALL WRITESTR +; + ; CHECK FOR HARDWARE PRESENCE + CALL IMM_DETECT ; PROBE FOR INTERFACE + JR Z,IMM_INIT4 ; IF FOUND, CONTINUE + CALL PC_SPACE ; FORMATTING + LD DE,IMM_STR_NOHW ; NO IMM MESSAGE + CALL WRITESTR ; DISPLAY IT + JR IMM_INIT6 ; SKIP CFG ENTRY +; +IMM_INIT4: + ; UPDATE DRIVER RELATIVE UNIT NUMBER IN CONFIG TABLE + LD A,(IMM_DEVNUM) ; GET NEXT UNIT NUM TO ASSIGN + LD (IY+IMM_DEV),A ; UPDATE IT + INC A ; BUMP TO NEXT UNIT NUM TO ASSIGN + LD (IMM_DEVNUM),A ; SAVE IT +; + ; ADD UNIT TO GLOBAL DISK UNIT TABLE + LD BC,IMM_FNTBL ; BC := FUNC TABLE ADR + PUSH IY ; CFG ENTRY POINTER + POP DE ; COPY TO DE + CALL DIO_ADDENT ; ADD ENTRY TO GLOBAL DISK DEV TABLE +; + CALL IMM_RESET ; RESET/INIT THE INTERFACE +#IF (IMMTRACE <= 1) + CALL NZ,IMM_PRTSTAT +#ENDIF + JR NZ,IMM_INIT6 +; + ; START PRINTING DEVICE INFO + CALL IMM_PRTPREFIX ; PRINT DEVICE PREFIX +; +IMM_INIT5: + ; PRINT STORAGE CAPACITY (BLOCK COUNT) + PRTS(" BLOCKS=0x$") ; PRINT FIELD LABEL + LD A,IMM_MEDCAP ; OFFSET TO CAPACITY FIELD + CALL LDHLIYA ; HL := IY + A, REG A TRASHED + CALL LD32 ; GET THE CAPACITY VALUE + CALL PRTHEX32 ; PRINT HEX VALUE +; + ; PRINT STORAGE SIZE IN MB + PRTS(" SIZE=$") ; PRINT FIELD LABEL + LD B,11 ; 11 BIT SHIFT TO CONVERT BLOCKS --> MB + CALL SRL32 ; RIGHT SHIFT + CALL PRTDEC32 ; PRINT DWORD IN DECIMAL + PRTS("MB$") ; PRINT SUFFIX +; +IMM_INIT6: + LD DE,IMM_CFGSIZ ; SIZE OF CFG TABLE ENTRY + ADD IY,DE ; BUMP POINTER + JP IMM_INIT1 ; AND LOOP +; +;---------------------------------------------------------------------- +; PROBE FOR IMM HARDWARE +;---------------------------------------------------------------------- +; +; ON RETURN, ZF SET INDICATES HARDWARE FOUND +; +IMM_DETECT: +#IF (IMMTRACE >= 3) + PRTS("\r\nDETECT:$") +#ENDIF +; +#IF (IMMMODE == IMMMODE_MG014) + ; INITIALIZE 8255 + LD A,(IY+IMM_IOBASE) ; BASE PORT + ADD A,IMM_IOSETUP ; BUMP TO SETUP PORT + LD C,A ; MOVE TO C FOR I/O + LD A,$82 ; CONFIG A OUT, B IN, C OUT + OUT (C),A ; DO IT + CALL DELAY ; BRIEF DELAY FOR GOOD MEASURE +#ENDIF +; + ; ATTEMPT TO ESTABLISH A CONNECTION TO THE IMM DEVICE AND + ; ISSUE A SCSI BUS RESET. WE DON'T KNOW IF DEVICE IS THERE + ; YET. THIS IS DONE BLIND ASSUMING IT IS THERE. + CALL IMM_DISCONNECT + CALL IMM_CONNECT + CALL IMM_RESETPULSE ; ISSUE A SCSI BUS RESET + LD DE,62 ; WAIT A BIT + CALL VDELAY +; + ; USE AN ABBREVIATED VERSION OF SELECT PROCESSING TO + ; CHECK IF DEVICE EXISTS. + IMM_WCTL($0C) + CALL IMM_READSTATUS +; +#IF (IMMTRACE >= 3) + CALL PC_SPACE + CALL PRTHEXBYTE +#ENDIF +; + ; READY FOR SELECT? + AND $08 + CP $00 + JR NZ,IMM_DETECT1 +; + IMM_WCTL($04) + LD A,$80 | (1 << IMM_TGT) + CALL IMM_WRITEDATA + IMM_WCTL($0C) + IMM_WCTL($0D) + CALL DELAY + CALL IMM_READSTATUS +; +#IF (IMMTRACE >= 3) + CALL PC_SPACE + CALL PRTHEXBYTE +#ENDIF +; + ; DID SELECT SUCCEED? + AND $08 + CP $08 +; +IMM_DETECT1: + PUSH AF + CALL IMM_DISCONNECT + POP AF + RET +; +;============================================================================= +; DRIVER FUNCTION TABLE +;============================================================================= +; +IMM_FNTBL: + .DW IMM_STATUS + .DW IMM_RESET + .DW IMM_SEEK + .DW IMM_READ + .DW IMM_WRITE + .DW IMM_VERIFY + .DW IMM_FORMAT + .DW IMM_DEVICE + .DW IMM_MEDIA + .DW IMM_DEFMED + .DW IMM_CAP + .DW IMM_GEOM +#IF (($ - IMM_FNTBL) != (DIO_FNCNT * 2)) + .ECHO "*** INVALID IMM FUNCTION TABLE ***\n" +#ENDIF +; +IMM_VERIFY: +IMM_FORMAT: +IMM_DEFMED: + SYSCHKERR(ERR_NOTIMPL) ; NOT IMPLEMENTED + RET +; +; +; +IMM_READ: + CALL HB_DSKREAD ; HOOK DISK READ CONTROLLER + LD A,SCSI_CMD_READ ; SETUP SCSI READ + LD (IMM_CMD_RW),A ; AND SAVE IT IN SCSI CMD + JP IMM_IO ; DO THE I/O +; +; +; +IMM_WRITE: + CALL HB_DSKWRITE ; HOOK DISK WRITE CONTROLLER + LD A,SCSI_CMD_WRITE ; SETUP SCSI WRITE + LD (IMM_CMD_RW),A ; AND SAVE IT IN SCSI CMD + JP IMM_IO ; DO THE I/O +; +; +; +IMM_IO: + PUSH HL + CALL IMM_CHKERR ; CHECK FOR ERR STATUS AND RESET IF SO + POP HL + JR NZ,IMM_IO3 ; BAIL OUT ON ERROR +; + LD (IMM_DSKBUF),HL ; SAVE DISK BUFFER ADDRESS +; +#IF (DSKYENABLE) + #IF (DSKYDSKACT) + LD A,IMM_LBA + CALL LDHLIYA + CALL HB_DSKACT ; SHOW ACTIVITY + #ENDIF +#ENDIF +; + ; SETUP LBA + ; 3 BYTES, LITTLE ENDIAN -> BIG ENDIAN + LD HL,IMM_CMD_RW+1 ; START OF LBA FIELD IN CDB (MSB) + LD A,(IY+IMM_LBA+2) ; THIRD BYTE OF LBA FIELD IN CFG (MSB) + LD (HL),A + INC HL + LD A,(IY+IMM_LBA+1) + LD (HL),A + INC HL + LD A,(IY+IMM_LBA+0) + LD (HL),A + INC HL + ; DO SCSI IO + LD DE,(IMM_DSKBUF) ; DISK BUFFER TO DE + LD A,1 ; BLOCK I/O, ONE SECTOR + LD HL,IMM_CMD_RW ; POINT TO READ/WRITE CMD TEMPLATE + CALL IMM_RUNCMD ; RUN THE SCSI ENGINE + CALL Z,IMM_CHKCMD ; IF EXIT OK, CHECK SCSI RESULTS + JR NZ,IMM_IO2 ; IF ERROR, SKIP INCREMENT + ; INCREMENT LBA + LD A,IMM_LBA ; LBA OFFSET + CALL LDHLIYA ; HL := IY + A, REG A TRASHED + CALL INC32HL ; INCREMENT THE VALUE + ; INCREMENT DMA + LD HL,IMM_DSKBUF+1 ; POINT TO MSB OF BUFFER ADR + INC (HL) ; BUMP DMA BY + INC (HL) ; ... 512 BYTES + XOR A ; SIGNAL SUCCESS +; +IMM_IO2: +IMM_IO3: + LD HL,(IMM_DSKBUF) ; CURRENT DMA TO HL + OR A ; SET FLAGS BASED ON RETURN CODE + RET Z ; RETURN IF SUCCESS + LD A,ERR_IO ; SIGNAL IO ERROR + OR A ; SET FLAGS + RET ; AND DONE +; +; +; +IMM_STATUS: + ; RETURN UNIT STATUS + LD A,(IY+IMM_STAT) ; GET STATUS OF SELECTED DEVICE + OR A ; SET FLAGS + RET ; AND RETURN +; +; +; +IMM_RESET: + JP IMM_INITDEV ; JUST (RE)INIT DEVICE +; +; +; +IMM_DEVICE: + LD D,DIODEV_IMM ; D := DEVICE TYPE + LD E,(IY+IMM_DEV) ; E := PHYSICAL DEVICE NUMBER + LD C,%01111001 ; C := REMOVABLE HARD DISK + LD H,(IY+IMM_MODE) ; H := MODE + LD L,(IY+IMM_IOBASE) ; L := BASE I/O ADDRESS + XOR A ; SIGNAL SUCCESS + RET +; +; IMM_GETMED +; +IMM_MEDIA: + LD A,E ; GET FLAGS + OR A ; SET FLAGS + JR Z,IMM_MEDIA1 ; JUST REPORT CURRENT STATUS AND MEDIA +; + CALL IMM_RESET ; RESET INCLUDES MEDIA CHECK +; +IMM_MEDIA1: + LD A,(IY+IMM_STAT) ; GET STATUS + OR A ; SET FLAGS + LD D,0 ; NO MEDIA CHANGE DETECTED + LD E,MID_HD ; ASSUME WE ARE OK + RET Z ; RETURN IF GOOD INIT + LD E,MID_NONE ; SIGNAL NO MEDIA + LD A,ERR_NOMEDIA ; NO MEDIA ERROR + OR A ; SET FLAGS + RET ; AND RETURN +; +; +; +IMM_SEEK: + BIT 7,D ; CHECK FOR LBA FLAG + CALL Z,HB_CHS2LBA ; CLEAR MEANS CHS, CONVERT TO LBA + RES 7,D ; CLEAR FLAG REGARDLESS (DOES NO HARM IF ALREADY LBA) + LD (IY+IMM_LBA+0),L ; SAVE NEW LBA + LD (IY+IMM_LBA+1),H ; ... + LD (IY+IMM_LBA+2),E ; ... + LD (IY+IMM_LBA+3),D ; ... + XOR A ; SIGNAL SUCCESS + RET ; AND RETURN +; +; +; +IMM_CAP: + LD A,(IY+IMM_STAT) ; GET STATUS + PUSH AF ; SAVE IT + LD A,IMM_MEDCAP ; OFFSET TO CAPACITY FIELD + CALL LDHLIYA ; HL := IY + A, REG A TRASHED + CALL LD32 ; GET THE CURRENT CAPACITY INTO DE:HL + LD BC,512 ; 512 BYTES PER BLOCK + POP AF ; RECOVER STATUS + OR A ; SET FLAGS + RET +; +; +; +IMM_GEOM: + ; FOR LBA, WE SIMULATE CHS ACCESS USING 16 HEADS AND 16 SECTORS + ; RETURN HS:CC -> DE:HL, SET HIGH BIT OF D TO INDICATE LBA CAPABLE + CALL IMM_CAP ; GET TOTAL BLOCKS IN DE:HL, BLOCK SIZE TO BC + LD L,H ; DIVIDE BY 256 FOR # TRACKS + LD H,E ; ... HIGH BYTE DISCARDED, RESULT IN HL + LD D,16 | $80 ; HEADS / CYL = 16, SET LBA CAPABILITY BIT + LD E,16 ; SECTORS / TRACK = 16 + RET ; DONE, A STILL HAS IMM_CAP STATUS +; +;============================================================================= +; FUNCTION SUPPORT ROUTINES +;============================================================================= +; +; OUTPUT BYTE IN A TO THE DATA PORT +; +IMM_WRITEDATA: + LD C,(IY+IMM_IOBASE) ; DATA PORT IS AT IOBASE + OUT (C),A ; WRITE THE BYTE + ;CALL DELAY ; IS THIS NEEDED??? + RET ; DONE +; +; +; +IMM_WRITECTRL: + ; IBM PC INVERTS ALL BUT C2 ON THE BUS, MG014 DOES NOT. + ; BELOW TRANSLATES FROM IBM -> MG014. IT ALSO INVERTS THE + ; MG014 LED SIMPLY TO MAKE IT EASY TO KEEP LED ON DURING + ; ALL ACTIVITY. +; +#IF (IMMMODE == IMMMODE_MG014 + XOR $0B | $80 ; HIGH BIT IS MG014 LED +#ENDIF +;#IF (IMMMODE == IMMMODE_SPP +; AND %00001111 +; OR %11000000 +;#ENDIF + LD C,(IY+IMM_IOBASE) ; GET BASE IO ADDRESS + INC C ; BUMP TO CONTROL PORT + INC C + OUT (C),A ; WRITE TO CONTROL PORT + ;CALL DELAY ; IS THIS NEEDED? + RET ; DONE +; +; READ THE PARALLEL PORT INPUT LINES (STATUS) AND MAP SIGNALS FROM +; MG014 TO IBM STANDARD. NOTE POLARITY CHANGE REQUIRED FOR BUSY. +; +; MG014 IBM PC (SPP) +; -------- -------- +; 0: /ACK 6: /ACK +; 1: BUSY 7: /BUSY +; 2: POUT 5: POUT +; 3: SEL 4: SEL +; 4: /ERR 3: /ERR +; +IMM_READSTATUS: + LD C,(IY+IMM_IOBASE) ; IOBASE TO C + INC C ; BUMP TO STATUS PORT + IN A,(C) ; READ IT +; +#IF (IMMMODE == IMMMODE_MG014) +; + ; SHUFFLE BITS ON MG014 + LD C,0 ; INIT RESULT + BIT 0,A ; 0: /ACK + JR Z,IMM_READSTATUS1 + SET 6,C ; 6: /ACK +IMM_READSTATUS1: + BIT 1,A ; 1: BUSY + JR NZ,IMM_READSTATUS2 ; POLARITY CHANGE! + SET 7,C ; 7: /BUSY +IMM_READSTATUS2: + BIT 2,A ; 2: POUT + JR Z,IMM_READSTATUS3 + SET 5,C ; 5: POUT +IMM_READSTATUS3: + BIT 3,A ; 3: SEL + JR Z,IMM_READSTATUS4 + SET 4,C ; 4: SEL +IMM_READSTATUS4: + BIT 4,A ; 4: /ERR + JR Z,IMM_READSTATUS5 + SET 3,C ; 3: /ERR +IMM_READSTATUS5: + LD A,C ; RESULT TO A +; +#ENDIF +; + RET +; +; SIGNAL SEQUENCE TO CONNECT/DISCONNECT +; VALUE IN A IS WRITTEN TO DATA PORT DURING SEQUENCE +; +IMM_CPP: + PUSH AF + IMM_WCTL($0C) + IMM_WDATA($AA) + IMM_WDATA($55) + IMM_WDATA($00) + IMM_WDATA($FF) + CALL IMM_READSTATUS + AND $B8 + LD (IMM_S1),A + IMM_WDATA($87) + CALL IMM_READSTATUS + AND $B8 + LD (IMM_S2),A + IMM_WDATA($78) + CALL IMM_READSTATUS + AND $38 + LD (IMM_S3),A + POP AF + CALL IMM_WRITEDATA + IMM_WCTL($0C) + IMM_WCTL($0D) + IMM_WCTL($0C) + IMM_WDATA($FF) +; + ; CONNECT: S1=$B8 S2=$18 S3=$30 + ; DISCONNECT: S1=$B8 S2=$18 S3=$38 +; +#IF (IMMTRACE >= 3) + PRTS("\r\nCPP: S1=$") + LD A,(IMM_S1) + CALL PRTHEXBYTE + PRTS(" S2=$") + LD A,(IMM_S2) + CALL PRTHEXBYTE + PRTS(" S3=$") + LD A,(IMM_S3) + CALL PRTHEXBYTE +#ENDIF +; + XOR A ; ASSUME SUCCESS FOR NOW + RET +; +IMM_S1 .DB 0 +IMM_S2 .DB 0 +IMM_S3 .DB 0 +; +; SEQUENCE TO CONNECT TO DEVICE ON PARALLEL PORT BUS. +; +IMM_CONNECT: + LD A,$E0 + CALL IMM_CPP + LD A,$30 + CALL IMM_CPP + LD A,$E0 + CALL IMM_CPP + RET +; +; SEQUENCE TO DISCONNECT FROM DEVICE ON PARALLEL PORT BUS. +; THE FINAL IMM_WRITECTRL IS ONLY TO TURN OFF THE MG014 STATUS LED. +; +IMM_DISCONNECT: + LD A,$30 + CALL IMM_CPP +; + ; TURNS OFF MG014 LED + IMM_WCTL($8C) +; + RET +; +; INITIATE A SCSI BUS RESET. +; +IMM_RESETPULSE: + IMM_WCTL($04) + IMM_WDATA($40) + CALL DELAY ; 16 US, IDEALLY, 1 US + IMM_WCTL($0C) + IMM_WCTL($0D) + CALL DELAY ; 48 US, IDEALLY, 50 US + CALL DELAY + CALL DELAY + IMM_WCTL($0C) + IMM_WCTL($04) + RET +; +; SCSI SELECT PROCESS +; +IMM_SELECT: +#IF (IMMTRACE >= 3) + PRTS("\r\nSELECT: $") +#ENDIF + IMM_WCTL($0C) +; + LD B,0 ; TIMEOUT COUNTER +IMM_SELECT1: + CALL IMM_READSTATUS +#IF (IMMTRACE >= 3) + CALL PC_SPACE + CALL PRTHEXBYTE +#ENDIF + AND $08 + JR Z,IMM_SELECT2 ; IF CLEAR, MOVE ON + DJNZ IMM_SELECT1 + JP IMM_CMD_TIMEOUT ; TIMEOUT +; +IMM_SELECT2: + IMM_WCTL($04) + ; PLACE HOST AND TARGET BIT ON DATA BUS + LD A,$80 | (1 << IMM_TGT) + CALL IMM_WRITEDATA + IMM_WCTL($0C) + IMM_WCTL($0D) +; + LD B,0 ; TIMEOUT COUNTER +IMM_SELECT3: + CALL IMM_READSTATUS +#IF (IMMTRACE >= 3) + CALL PC_SPACE + CALL PRTHEXBYTE +#ENDIF + AND $08 + JR NZ,IMM_SELECT4 ; IF SET, MOVE ON + DJNZ IMM_SELECT3 + JP IMM_CMD_TIMEOUT ; TIMEOUT +; +IMM_SELECT4: + IMM_WCTL($0C) +; + XOR A + RET +; +; SEND SCSI CMD BYTE STRING. AT ENTRY, HL POINTS TO START OF +; COMMAND BYTES. THE LENGTH OF THE COMMAND STRING MUST PRECEED +; THE COMMAND BYTES (HL - 1). +; +; NOTE THAT DATA IS SENT AS BYTE PAIRS! EACH LOOP SENDS 2 BYTES. +; DATA OUTPOUT IS BURSTED (NO CHECK FOR BUSY). SEEMS TO WORK FINE. +; +IMM_SENDCMD: +; +#IF (IMMTRACE >= 3) + PRTS("\r\nSENDCMD:$") +#ENDIF +; + DEC HL ; BACKUP TO LENGTH BYTE + LD B,(HL) ; PUT IN B FOR LOOP COUNTER +; +#IF (IMMTRACE >= 3) + LD A,B + CALL PC_SPACE + CALL PRTHEXBYTE + PRTS(" BYTES$") +#ENDIF +; + INC HL ; BACK TO FIRST CMD BYTE +IMM_SENDCMD1: + IMM_WCTL($04) + LD A,(HL) ; LOAD CMD BYTE +; +#IF (IMMTRACE >= 3) + CALL PC_SPACE + CALL PRTHEXBYTE +#ENDIF +; + CALL IMM_WRITEDATA ; PUT IT ON THE BUS + INC HL ; BUMP TO NEXT BYTE + DEC B ; DEC LOOP COUNTER + IMM_WCTL($05) + LD A,(HL) ; LOAD CMD BYTE +; +#IF (IMMTRACE >= 3) + CALL PC_SPACE + CALL PRTHEXBYTE +#ENDIF +; + CALL IMM_WRITEDATA ; PUT IT ON THE BUS + INC HL ; BUMP TO NEXT BYTE + IMM_WCTL($00) + DJNZ IMM_SENDCMD1 ; LOOP TILL DONE +; +IMM_SENDCMD2: + IMM_WCTL($04) +; + RET +; +; WAIT FOR SCSI BUS TO BECOME READY WITH A TIMEOUT. +; +IMM_WAITLOOP: + CALL IMM_READSTATUS + BIT 7,A + RET NZ ; DONE, STATUS IN A + DEC HL + LD A,H + OR L + RET Z ; TIMEOUT + JR IMM_WAITLOOP +; +IMM_WAIT: + LD HL,500 ; GOOD VALUE??? + IMM_WCTL($0C) + CALL IMM_WAITLOOP + JP Z,IMM_CMD_TIMEOUT ; HANDLE TIMEOUT + PUSH AF + IMM_WCTL($04) + POP AF + AND $B8 + RET ; RETURN W/ RESULT IN A +; +; MAX OBSERVED WAITLOOP ITERATIONS IS $0116B3 @ 7.3728 MHZ ON MG014 +; MAX OBSERVED WAITLOOP ITERATIONS IS $028EFE @ 8.000 MHZ ON MBC SPP +; +IMM_LONGWAIT: + LD A,(CB_CPUMHZ) ; LOAD CPU SPEED IN MHZ + SRL A ; DIVIDE BY 2, GOOD ENOUGH + LD B,A ; USE FOR OUTER LOOP COUNT + IMM_WCTL($0C) +IMM_LONGWAIT1: + LD HL,0 + CALL IMM_WAITLOOP + JR NZ,IMM_LONGWAIT2 ; HANDLE SUCCESS + DJNZ IMM_LONGWAIT1 ; LOOP TILL COUNTER EXHAUSTED + JP IMM_CMD_TIMEOUT ; HANDLE TIMEOUT +; +IMM_LONGWAIT2: + PUSH AF + IMM_WCTL($04) +; +#IF 0 + CALL PC_GT + LD A,B + CALL PRTHEXBYTE + CALL PC_COLON + CALL PRTHEXWORDHL +#ENDIF +; + POP AF + AND $B8 + RET ; RETURN W/ RESULT IN A +; +; PEROFRM SCSI BUS NEGOTIATION. REQURIED PRIOR TO DATA READS. +; +IMM_NEGOTIATE: +#IF (IMMTRACE >= 3) + PRTS("\r\nNEGO: $") +#ENDIF + IMM_WCTL($04) + CALL DELAY ; 16 US, IDEALLY 5 US + IMM_WDATA($00) + LD DE,7 ; 112 US, IDEALLY 100 US + CALL VDELAY + IMM_WCTL($06) + CALL DELAY ; 16 US, IDEALLY 5 US + CALL IMM_READSTATUS + PUSH AF ; SAVE RESULT + CALL DELAY ; 16 US, IDEALLY 5 US + IMM_WCTL($07) + CALL DELAY ; 16 US, IDEALLY 5 US + IMM_WCTL($06) +; + POP AF +; +#IF (IMMTRACE >= 3) + CALL PC_SPACE + CALL PRTHEXBYTE +#ENDIF +; + AND $20 +; +#IF (IMMTRACE >= 3) + CALL PC_SPACE + CALL PC_GT + CALL PRTHEXBYTE +#ENDIF +; + CP $20 ; $20 MEANS DATA READY + JP NZ,IMM_CMD_IOERR + RET +; +; GET A BYTE OF DATA FROM THE SCSI DEVICE. THIS IS A NIBBLE READ. +; BYTE RETURNED IN A. +; +IMM_GETBYTE: + CALL IMM_WAIT + IMM_WCTL($06) + CALL IMM_READSTATUS + AND $F0 + RRCA + RRCA + RRCA + RRCA + PUSH AF + IMM_WCTL($05) + CALL IMM_READSTATUS + AND $F0 + POP HL + OR H + PUSH AF + IMM_WCTL($04) + POP AF + RET +; +; GET A CHUNK OF DATA FROM SCSI BUS. THIS IS SPECIFICALLY FOR +; READ PHASE. IF TRANSFER MODE IS NON-ZERO, THEN A BLOCK (512 BYTES) +; OF DATA WILL BE READ. OTHERWISE, DATA IS WRITTEN AS +; LONG AS SCSI DEVICE WANTS TO CONTINUE RECEIVING (NO OVERRUN +; CHECK IN THIS CASE). +; +; THIS IS A NIBBLE READ. +; +; DE=BUFFER +; A=TRANSFER MODE (0=VARIABLE, 1=BLOCK) +; +IMM_GETDATA: + ; BRANCH TO CORRECT ROUTINE + OR A + JR NZ,IMM_GETBLOCK ; DO BLOCK READ +; +#IF (IMMTRACE >= 3) + PRTS("\r\nGETDATA:$") +#ENDIF +; +IMM_GETDATA1: + PUSH HL ; SAVE BYTE COUNTER + CALL IMM_WAIT ; WAIT FOR BUS READY + POP HL ; RESTORE BYTE COUNTER + CP $98 ; CHECK FOR READ PHASE + JR NZ,IMM_GETDATA2 ; IF NOT, ASSUME WE ARE DONE + IMM_WCTL($06) + CALL IMM_READSTATUS ; GET FIRST NIBBLE + AND $F0 ; ISOLATE BITS + RRCA ; AND SHIFT TO LOW NIBBLE + RRCA + RRCA + RRCA + PUSH AF ; SAVE WORKING VALUE + IMM_WCTL($05) + CALL IMM_READSTATUS ; GET SECOND NIBBLE + AND $F0 ; ISOLATE BITS + POP BC ; RECOVER LOW NIBBLE + OR B ; COMBINE + LD (DE),A ; AND SAVE THE FULL BYTE VALUE + INC DE ; NEXT BUFFER POS + INC HL ; INCREMENT BYTES COUNTER + IMM_WCTL($04) + JR IMM_GETDATA1 ; LOOP TILL DONE +; +IMM_GETDATA2: +; +#IF (IMMTRACE >= 3) + CALL PC_SPACE + CALL PRTHEXWORDHL + PRTS(" BYTES$") +#ENDIF +; + IMM_WCTL($0C) + RET +; +IMM_GETBLOCK: +; +#IF (IMMTRACE >= 3) + PRTS("\r\nGETBLK:$") +#ENDIF +; + IMM_WCTL($04) + LD B,0 ; LOOP COUNTER + EXX ; SWITCH TO ALT REGS + EX AF,AF' ; SWITCH TO ALT AF + ; SAVE ALT REGS + PUSH AF + PUSH BC + PUSH DE + PUSH HL + ; C: PORT C + LD A,(IY+IMM_IOBASE) ; BASE PORT + INC A ; STATUS PORT + LD (IMM_GETBLOCK_A),A ; FILL IN + LD (IMM_GETBLOCK_B),A ; ... DYNAMIC BITS OF CODE + INC A ; CONTROL PORT + LD C,A ; ... TO C +#IF (IMMMODE == IMMMODE_MG014) + ; DE: CLOCK VALUES + LD D,$06 ^ ($0B | $80) + LD E,$05 ^ ($0B | $80) + ; HL: STATMAP + LD H,MG014_STATMAPLO >> 8 +#ENDIF +#IF (IMMMODE == IMMMODE_SPP) + ; DE: CLOCK VALUES + LD D,$06 + LD E,$05 +#ENDIF + EXX ; SWITCH TO PRI REGS + EX AF,AF' ; SWITCH TO PRI AF + CALL IMM_GETBLOCK1 ; LOOP TWICE + CALL IMM_GETBLOCK1 ; ... FOR 512 BYTES + ; RESTORE ALT REGS + EXX ; SWITCH TO ALT REGS + EX AF,AF' ; SWITCH TO ALT AF + POP HL + POP DE + POP BC + POP AF + EXX ; SWITCH TO PRI REGS + EX AF,AF' ; SWITCH TO PRI AF + IMM_WCTL($0C) + RET +; +IMM_GETBLOCK1: + EXX ; ALT REGS + OUT (C),D ; SEND FIRST CLOCK +IMM_GETBLOCK_A .EQU $+1 + IN A,($FF) ; GET LOW NIBBLE +#IF (IMMMODE == IMMMODE_MG014) + AND $0F ; RELEVANT BITS ONLY + ADD A,MG014_STATMAPLO & $FF ; LOW BYTE OF MAP PTR + LD L,A ; PUT IN L + LD A,(HL) ; LOOKUP LOW NIBBLE VALUE + EX AF,AF' ; ALT AF, SAVE NIBBLE +#ENDIF +#IF (IMMMODE == IMMMODE_SPP) + AND $F0 ; RELEVANT BITS ONLY + RLCA ; MOVE TO LOW NIBBLE + RLCA ; MOVE TO LOW NIBBLE + RLCA ; MOVE TO LOW NIBBLE + RLCA ; MOVE TO LOW NIBBLE + LD L,A ; SAVE NIBBLE IN L +#ENDIF + OUT (C),E ; SEND SECOND CLOCK +IMM_GETBLOCK_B .EQU $+1 + IN A,($FF) ; GET HIGH NIBBLE +#IF (IMMMODE == IMMMODE_MG014) + AND $0F ; RELEVANT BITS ONLY + ADD A,MG014_STATMAPHI & $FF ; HIGH BYTE OF MAP PTR + LD L,A ; PUT IN L + EX AF,AF' ; PRI AF, RECOVER LOW NIBBLE VALUE + OR (HL) ; COMBINE WITH HIGH NIB VALUE +#ENDIF +#IF (IMMMODE == IMMMODE_SPP) + AND $F0 ; RELEVANT BITS ONLY + OR L ; COMBINE WITH HIGH NIB VALUE +#ENDIF + EXX ; SWITCH TO PRI REGS + LD (DE),A ; SAVE BYTE + INC DE ; BUMP BUF PTR + DJNZ IMM_GETBLOCK1 ; LOOP + RET ; DONE +; +; PUT A CHUNK OF DATA TO THE SCSI BUS. THIS IS SPECIFICALLY FOR +; WRITE PHASE. IF TRANSFER MODE IS NON-ZERO, THEN A BLOCK (512 BYTES) +; OF DATA WILL BE WRITTEN. OTHERWISE, DATA IS WRITTEN AS +; LONG AS SCSI DEVICE WANTS TO CONTINUE RECEIVING (NO OVERRUN +; CHECK IN THIS CASE). +; +; DE=BUFFER +; A=TRANSFER MODE (0=VARIABLE, 1=BLOCK) +; +IMM_PUTDATA: + ; BRANCH TO CORRECT ROUTINE + OR A + JR NZ,IMM_PUTBLOCK ; DO BLOCK WRITE +; +#IF (IMMTRACE >= 3) + PRTS("\r\nPUTDATA:$") +#ENDIF +; +IMM_PUTDATA1: + PUSH HL ; SAVE BYTE COUNTER + CALL IMM_WAIT ; WAIT FOR BUS READY + POP HL ; RESTORE BYTE COUNTER + CP $88 ; CHECK FOR WRITE PHASE + JR NZ,IMM_PUTDATA2 ; IF NOT, ASSUME WE ARE DONE + ;IMM_WCTL($04) + LD A,(DE) ; GET NEXT BYTE TO WRITE (FIRST OF PAIR) + CALL IMM_WRITEDATA ; PUT ON BUS + INC DE ; BUMP TO NEXT BUF POS + INC HL ; INCREMENT COUNTER + IMM_WCTL($05) + LD A,(DE) ; GET NEXT BYTE TO WRITE (SECOND OF PAIR) + CALL IMM_WRITEDATA ; PUT ON BUS + INC DE ; BUMP TO NEXT BUF POS + INC HL ; INCREMENT COUNTER + IMM_WCTL($00) + JR IMM_PUTDATA1 ; LOOP TILL DONE +; +IMM_PUTDATA2: + IMM_WCTL($04) +; +#IF (IMMTRACE >= 3) + CALL PC_SPACE + CALL PRTHEXWORDHL + PRTS(" BYTES$") +#ENDIF +; + RET +; +IMM_PUTBLOCK: +; +#IF (IMMTRACE >= 3) + PRTS("\r\nPUTBLK:$") +#ENDIF +; + IMM_WCTL($04) + LD B,0 ; LOOP COUNTER + LD A,(IY+IMM_IOBASE) ; GET BASE IO ADR + LD (IMM_PUTBLOCK_A),A ; FILL IN + LD (IMM_PUTBLOCK_B),A ; ... DYNAMIC BITS OF CODE + INC A ; STATUS PORT + INC A ; CONTROL PORT + LD C,A ; ... TO C + ; HL: CLOCK VALUES +#IF (IMMMODE == IMMMODE_MG014) + LD H,$05 ^ ($0B | $80) + LD L,$00 ^ ($0B | $80) +#ENDIF +#IF (IMMMODE == IMMMODE_SPP) + LD H,$05 + LD L,$00 +#ENDIF + CALL IMM_PUTBLOCK1 ; ONE LOOP CUZ BYTE PAIRS + IMM_WCTL($04) + RET +; +IMM_PUTBLOCK1: + LD A,(DE) ; GET NEXT BYTE +IMM_PUTBLOCK_A .EQU $+1 + OUT ($FF),A ; PUT ON BUS + INC DE ; INCREMENT BUF POS + OUT (C),H ; FIRST CLOCK + LD A,(DE) ; GET NEXT BYTE +IMM_PUTBLOCK_B .EQU $+1 + OUT ($FF),A ; PUT ON BUS + INC DE ; INCREMENT BUF POS + OUT (C),L ; SECOND CLOCK + DJNZ IMM_PUTBLOCK1 ; LOOP + RET ; DONE +; +; READ SCSI COMMAND STATUS +; +IMM_GETSTATUS: +; +#IF (IMMTRACE >= 3) + PRTS("\r\nSTATUS:$") +#ENDIF +; + CALL IMM_GETBYTE ; GET ONE BYTE + LD (IMM_CMDSTAT),A ; SAVE AS FIRST STATUS BYTE +; +#IF (IMMTRACE >= 3) + CALL PC_SPACE + CALL PRTHEXBYTE +#ENDIF +; + CALL IMM_WAIT ; CHECK FOR OPTIONAL SECOND BYTE + CP $B8 ; STILL IN STATUS PHASE? + RET NZ ; IF NOT, DONE + CALL IMM_GETBYTE ; ELSE, GET THE SECOND BYTE + LD (IMM_CMDSTAT+1),A ; AND SAVE IT +; +#IF (IMMTRACE >= 3) + CALL PC_SPACE + CALL PRTHEXBYTE +#ENDIF +; + RET +; +; TERMINATE A BULK READ OPERATION +; +IMM_ENDREAD: + IMM_WCTL($04) + IMM_WCTL($0C) + IMM_WCTL($0E) + IMM_WCTL($04) + RET +; +; THIS IS THE MAIN SCSI ENGINE. BASICALLY, IT SELECTS THE DEVICE +; ON THE BUS, SENDS THE COMMAND, THEN PROCESSES THE RESULT. +; +; HL: COMMAND BUFFER +; DE: TRANSFER BUFFER +; A: TRANSFER MODE (0=VARIABLE, 1=BLOCK) +; +IMM_RUNCMD: + ; THERE ARE MANY PLACES NESTED WITHIN THE ROUTINES THAT + ; ARE CALLED HERE. HERE WE SAVE THE STACK SO THAT WE CAN + ; EASILY AND QUICKLY ABORT OUT OF ANY NESTED ROUTINE. + ; SEE IMM_CMD_ERR BELOW. + LD (IMM_CMDSTK),SP ; FOR ERROR ABORTS + LD (IMM_DSKBUF),DE ; SAVE BUF PTR + LD (IMM_XFRMODE),A ; SAVE XFER LEN + PUSH HL + CALL IMM_CONNECT ; PARALLEL PORT BUS CONNECT + CALL IMM_SELECT ; SELECT TARGET DEVICE + CALL IMM_WAIT ; WAIT TILL READY + POP HL + CALL IMM_SENDCMD ; SEND THE COMMAND +; +IMM_RUNCMD_PHASE: + ; WAIT FOR THE BUS TO BE READY. WE USE AN EXTRA LONG WAIT + ; TIMEOUT HERE BECAUSE THIS IS WHERE WE WILL WAIT FOR LONG + ; OPERATIONS TO COMPLETE. IT CAN TAKE SOME TIME IF THE + ; DEVICE HAS GONE TO SLEEP BECAUSE IT WILL NEED TO WAKE UP + ; AND SPIN UP BEFORE PROCESSING AN I/O COMMAND. + CALL IMM_LONGWAIT ; WAIT TILL READY +; +#IF (IMMTRACE >= 3) + PRTS("\r\nPHASE: $") + CALL PRTHEXBYTE +#ENDIF +; + CP $88 ; DEVICE WANTS TO RCV DATA + JR Z,IMM_RUNCMD_WRITE + CP $98 ; DEVICE WANTS TO SEND DATA + JR Z,IMM_RUNCMD_READ + CP $B8 ; DEVICE WANTS TO BE DONE + JR Z,IMM_RUNCMD_END + JR IMM_CMD_IOERR +; +IMM_RUNCMD_WRITE: + LD DE,(IMM_DSKBUF) ; XFER BUFFER + LD A,(IMM_XFRMODE) ; XFER MODE + CALL IMM_PUTDATA ; SEND DATA NOW + JR IMM_RUNCMD_PHASE ; BACK TO DISPATCH +; +IMM_RUNCMD_READ: + CALL IMM_NEGOTIATE ; NEGOTIATE FOR READ + CALL IMM_WAIT ; WAIT TILL READY + ; CHECK FOR STATUS $98??? + LD DE,(IMM_DSKBUF) ; XFER BUFFER + LD A,(IMM_XFRMODE) ; XFER MODE + CALL IMM_GETDATA ; GET THE DATA NOW + CALL IMM_ENDREAD ; TERMINATE THE READ + JR IMM_RUNCMD_PHASE ; BACK TO DISPATCH +; +IMM_RUNCMD_END: + CALL IMM_NEGOTIATE ; NEGOTIATE FOR READ (STATUS) + CALL IMM_WAIT ; WAIT TILL READY + ; CHECK FOR STATUS $B8??? + CALL IMM_GETSTATUS ; READ STATUS BYTES + CALL IMM_ENDREAD ; TERMINATE THE READ + CALL IMM_DISCONNECT ; PARALLEL PORT BUS DISCONNECT + XOR A ; SIGNAL SUCCESS + RET +; +IMM_CMD_IOERR: + LD A,IMM_STIOERR ; ERROR VALUE TO A + JR IMM_CMD_ERR ; CONTINUE +; +IMM_CMD_TIMEOUT: + LD A,IMM_STTO ; ERROR VALUE TO A + JR IMM_CMD_ERR ; CONTINUE +; +IMM_CMD_ERR: + LD SP,(IMM_CMDSTK) ; UNWIND STACK + PUSH AF ; SAVE STATUS + ;CALL IMM_RESETPULSE ; CLEAN UP THE MESS??? + LD DE,62 ; DELAY AFTER RESET PULSE + CALL VDELAY + CALL IMM_DISCONNECT ; PARALLEL PORT BUS DISCONNECT + LD DE,62 ; DELAY AFTER DISCONNECT + CALL VDELAY + POP AF ; RECOVER STATUS + JP IMM_ERR ; NOW DO STANDARD ERR PROCESSING +; +; ERRORS SHOULD GENERALLY NOT CAUSE SCSI PROCESSING TO FAIL. IF A +; DEVICE ERROR (I.E., READ ERROR) OCCURS, THEN THE SCSI PROTOCOL WILL +; PROVIDE ERROR INFORMATION. THE STATUS RESULT OF THE SCSI COMMAND +; WILL INDICATE IF AN ERROR OCCURRED. ADDITIONALLY, IF THE ERROR IS +; A CHECK CONDITION ERROR, THEN IT IS MANDATORY TO ISSUE A SENSE +; REQUEST SCSI COMMAND TO CLEAR THE ERROR AND RETRIEVE DETAILED ERROR +; INFO. +; +IMM_CHKCMD: + ; SCSI COMMAND COMPLETED, CHECK SCSI CMD STATUS + LD A,(IMM_CMDSTAT) ; GET STATUS BYTE + OR A ; SET FLAGS + RET Z ; IF ZERO, ALL GOOD, DONE +; + ; DO WE HAVE A CHECK CONDITION? + CP 2 ; CHECK CONDITION RESULT? + JR Z,IMM_CHKCMD1 ; IF SO, REQUEST SENSE + JP IMM_IOERR ; ELSE, GENERAL I/O ERROR +; +IMM_CHKCMD1: + ; USE REQUEST SENSE CMD TO GET ERROR DETAILS + LD DE,HB_WRKBUF ; PUT DATA IN WORK BUF + LD A,0 ; VARIABLE LENGTH REQUEST + LD HL,IMM_CMD_SENSE ; REQUEST SENSE CMD + CALL IMM_RUNCMD ; DO IT + JP NZ,IMM_IOERR ; BAIL IF ERROR IN CMD +; + ; REQ SENSE CMD COMPLETED +#IF (IMMTRACE >= 3) + PRTS("\r\nSENSE:$") + LD A,$19 + LD DE,HB_WRKBUF + CALL Z,PRTHEXBUF +#ENDIF +; + ; CHECK SCSI CMD STATUS + LD A,(IMM_CMDSTAT) ; GET STATUS BYTE + OR A ; SET FLAGS + JP NZ,IMM_IOERR ; IF FAILED, GENERAL I/O ERROR +; + ; RETURN RESULT BASED ON REQ SENSE DATA + ; TODO: WE NEED TO CHECK THE SENSE KEY FIRST!!! + LD A,(HB_WRKBUF+12) ; GET ADDITIONAL SENSE CODE + CP $3A ; NO MEDIA? + JP Z,IMM_NOMEDIA ; IF SO, RETURN NO MEDIA ERR + JP IMM_IOERR ; ELSE GENERAL I/O ERR +; +; CHECK CURRENT DEVICE FOR ERROR STATUS AND ATTEMPT TO RECOVER +; VIA RESET IF DEVICE IS IN ERROR. +; +IMM_CHKERR: + LD A,(IY+IMM_STAT) ; GET STATUS + OR A ; SET FLAGS + CALL NZ,IMM_RESET ; IF ERROR STATUS, RESET BUS + RET +; +; (RE)INITIALIZE DEVICE +; +IMM_INITDEV: +; +#IF (IMMMODE == IMMMODE_MG014) + ; INITIALIZE 8255 + LD A,(IY+IMM_IOBASE) ; BASE PORT + ADD A,IMM_IOSETUP ; BUMP TO SETUP PORT + LD C,A ; MOVE TO C FOR I/O + LD A,$82 ; CONFIG A OUT, B IN, C OUT + OUT (C),A ; DO IT + CALL DELAY ; SHORT DELAY FOR BUS SETTLE +#ENDIF +; + CALL IMM_DISCONNECT ; DISCONNECT FIRST JUST IN CASE + CALL IMM_CONNECT ; NOW CONNECT TO BUS + CALL IMM_RESETPULSE ; ISSUE A SCSI BUS RESET + LD DE,62 ; WAIT A BIT + CALL VDELAY + CALL IMM_DISCONNECT ; AND DISCONNECT FROM BUS + LD DE,62 ; WAIT A BIT MORE + CALL VDELAY +; + ; INITIALLY, THE DEVICE MAY REQUIRE MULTIPLE REQUEST SENSE + ; COMMANDS BEFORE IT WILL ACCEPT I/O COMMANDS. THIS IS DUE + ; TO THINGS LIKE BUS RESET NOTIFICATION, MEDIA CHANGE, ETC. + ; HERE, WE RUN A FEW REQUEST SENSE COMMANDS. AS SOON AS ONE + ; INDICATES NO ERRORS, WE CAN CONTINUE. + LD B,4 ; TRY UP TO 4 TIMES +IMM_INITDEV1: + PUSH BC ; SAVE LOOP COUNTER +; + ; REQUEST SENSE COMMAND + LD DE,HB_WRKBUF ; BUFFER FOR SENSE DATA + LD A,0 ; READ WHATEVER IS SENT + LD HL,IMM_CMD_SENSE ; POINT TO CMD BUFFER + CALL IMM_RUNCMD ; RUN THE SCSI ENGINE + JR NZ,IMM_INITDEV2 ; CMD PROC ERROR +; + ; CHECK CMD STATUS + LD A,(IMM_CMDSTAT) ; GET STATUS BYTE + OR A ; SET FLAGS + JR NZ,IMM_INITDEV2 ; IF ERROR, LOOP +; +#IF (IMMTRACE >= 3) + PRTS("\r\nSENSE:$") + LD A,$19 + LD DE,HB_WRKBUF + CALL PRTHEXBUF +#ENDIF +; + ; CHECK SENSE KEY + LD A,(HB_WRKBUF + 2) ; GET SENSE KEY + OR A ; SET FLAGS +; +IMM_INITDEV2: + POP BC ; RESTORE LOOP COUNTER + JR Z,IMM_INITDEV3 ; IF NO ERROR, MOVE ON + DJNZ IMM_INITDEV1 ; TRY UNTIL COUNTER EXHAUSTED + JP IMM_IOERR ; BAIL OUT WITH ERROR +; +IMM_INITDEV3: + ; READ & RECORD DEVICE CAPACITY + LD DE,HB_WRKBUF ; BUFFER TO CAPACITY RESPONSE + LD A,0 ; READ WHATEVER IS SENT + LD HL,IMM_CMD_RDCAP ; POINT TO READ CAPACITY CMD + CALL IMM_RUNCMD ; RUN THE SCSI ENGINE + CALL Z,IMM_CHKCMD ; CHECK AND RECORD ANY ERRORS + RET NZ ; BAIL OUT ON ERROR +; +#IF (IMMTRACE >= 3) + PRTS("\r\nRDCAP:$") + LD A,8 + LD DE,HB_WRKBUF + CALL PRTHEXBUF +#ENDIF +; + ; CAPACITY IS RETURNED IN A 4 BYTE, BIG ENDIAN FIELD AND + ; INDICATES THE LAST LBA VALUE. WE NEED TO CONVERT THIS TO + ; LITTLE ENDIAN AND INCREMENT THE VALUE TO MAKE IT A CAPACITY + ; COUNT INSTEAD OF A LAST LBA VALUE. + LD A,IMM_MEDCAP ; OFFSET IN CFG FOR CAPACITY + CALL LDHLIYA ; POINTER TO HL + PUSH HL ; SAVE IT + LD HL,HB_WRKBUF ; POINT TO VALUE IN CMD RESULT + CALL LD32 ; LOAD IT TO DE:HL + LD A,L ; FLIP BYTES + LD L,D ; ... BIG ENDIAN + LD D,A ; ... TO LITTLE ENDIAN + LD A,H + LD H,E + LD E,A + CALL INC32 ; INCREMENT TO FINAL VALUE + POP BC ; RECOVER SAVE LOCATION + CALL ST32 ; STORE VALUE +; + XOR A ; SIGNAL SUCCESS + LD (IY+IMM_STAT),A ; RECORD IT + RET +; +;============================================================================= +; ERROR HANDLING AND DIAGNOSTICS +;============================================================================= +; +; ERROR HANDLERS +; +IMM_NOMEDIA: + LD A,IMM_STNOMEDIA + JR IMM_ERR +; +IMM_CMDERR: + LD A,IMM_STCMDERR + JR IMM_ERR +; +IMM_IOERR: + LD A,IMM_STIOERR + JR IMM_ERR +; +IMM_TO: + LD A,IMM_STTO + JR IMM_ERR +; +IMM_NOTSUP: + LD A,IMM_STNOTSUP + JR IMM_ERR +; +IMM_ERR: + LD (IY+IMM_STAT),A ; SAVE NEW STATUS +; +IMM_ERR2: +#IF (IMMTRACE >= 2) + CALL IMM_PRTSTAT +#ENDIF + OR A ; SET FLAGS + RET +; +; +; +IMM_PRTERR: + RET Z ; DONE IF NO ERRORS + ; FALL THRU TO IMM_PRTSTAT +; +; PRINT FULL DEVICE STATUS LINE +; +IMM_PRTSTAT: + PUSH AF + PUSH DE + PUSH HL + LD A,(IY+IMM_STAT) + CALL IMM_PRTPREFIX ; PRINT UNIT PREFIX + CALL PC_SPACE ; FORMATTING + CALL IMM_PRTSTATSTR + POP HL + POP DE + POP AF + RET +; +; PRINT STATUS STRING +; +IMM_PRTSTATSTR: + PUSH AF + PUSH DE + PUSH HL + LD A,(IY+IMM_STAT) + NEG + LD HL,IMM_STR_ST_MAP + ADD A,A + CALL ADDHLA + LD E,(HL) + INC HL + LD D,(HL) + CALL WRITESTR + POP HL + POP DE + POP AF + RET +; +; PRINT DEVICE/UNIT PREFIX +; +IMM_PRTPREFIX: + PUSH AF + CALL NEWLINE + PRTS("IMM$") + LD A,(IY+IMM_DEV) ; GET CURRENT DEVICE NUM + CALL PRTDECB + CALL PC_COLON + POP AF + RET +; +;============================================================================= +; STRING DATA +;============================================================================= +; +IMM_STR_ST_MAP: + .DW IMM_STR_ST_OK + .DW IMM_STR_ST_NOMEDIA + .DW IMM_STR_ST_CMDERR + .DW IMM_STR_ST_IOERR + .DW IMM_STR_ST_TO + .DW IMM_STR_ST_NOTSUP +; +IMM_STR_ST_OK .TEXT "OK$" +IMM_STR_ST_NOMEDIA .TEXT "NO MEDIA$" +IMM_STR_ST_CMDERR .TEXT "COMMAND ERROR$" +IMM_STR_ST_IOERR .TEXT "IO ERROR$" +IMM_STR_ST_TO .TEXT "TIMEOUT$" +IMM_STR_ST_NOTSUP .TEXT "NOT SUPPORTED$" +IMM_STR_ST_UNK .TEXT "UNKNOWN ERROR$" +; +IMM_STR_MODE_MAP: + .DW IMM_STR_MODE_NONE + .DW IMM_STR_MODE_SPP + .DW IMM_STR_MODE_MG014 +; +IMM_STR_MODE_NONE .TEXT "NONE$" +IMM_STR_MODE_SPP .TEXT "SPP$" +IMM_STR_MODE_MG014 .TEXT "MG014$" +; +IMM_STR_NOHW .TEXT "NOT PRESENT$" +; +;============================================================================= +; DATA STORAGE +;============================================================================= +; +IMM_DEVNUM .DB 0 ; TEMP DEVICE NUM USED DURING INIT +IMM_CMDSTK .DW 0 ; STACK PTR FOR CMD ABORTING +IMM_DSKBUF .DW 0 ; WORKING DISK BUFFER POINTER +IMM_XFRMODE .DB 0 ; 0=VARIABLE, 1=BLOCK (512 BYTES) +IMM_CMDSTAT .DB 0, 0 ; CMD RESULT STATUS +; +; SCSI COMMAND TEMPLATES (LENGTH PREFIXED) +; + .DB 6 +IMM_CMD_RW .DB $00, $00, $00, $00, $01, $00 ; READ/WRITE SECTOR + .DB 6 +IMM_CMD_SENSE .DB $03, $00, $00, $00, $FF, $00 ; REQUEST SENSE DATA + .DB 10 +IMM_CMD_RDCAP .DB $25, $00, $00, $00, $00, $00, $00, $00, $00, $00 ; READ CAPACITY +; +; IMM DEVICE CONFIGURATION TABLE +; +IMM_CFG: +; +#IF (IMMCNT >= 1) +; +IMM0_CFG: ; DEVICE 0 + .DB 0 ; DRIVER DEVICE NUMBER (FILLED DYNAMICALLY) + .DB IMMMODE ; DRIVER DEVICE MODE + .DB 0 ; DEVICE STATUS + .DB IMM0BASE ; IO BASE ADDRESS + .DW 0,0 ; DEVICE CAPACITY + .DW 0,0 ; CURRENT LBA +; + .ECHO "IMM: MODE=" + #IF (IMMMODE == IMMMODE_SPP) + .ECHO "SPP" + #ENDIF + #IF (IMMMODE == IMMMODE_MG014) + .ECHO "MG014" + #ENDIF + .ECHO ", IO=" + .ECHO IMM0BASE + .ECHO "\n" +#ENDIF +; +#IF (IMMCNT >= 2) +; +IMM1_CFG: ; DEVICE 1 + .DB 0 ; DRIVER DEVICE NUMBER (FILLED DYNAMICALLY) + .DB IMMMODE ; DRIVER DEVICE MODE + .DB 0 ; DEVICE STATUS + .DB IMM1BASE ; IO BASE ADDRESS + .DW 0,0 ; DEVICE CAPACITY + .DW 0,0 ; CURRENT LBA +; + .ECHO "IMM: MODE=" + #IF (IMMMODE == IMMMODE_SPP) + .ECHO "SPP" + #ENDIF + #IF (IMMMODE == IMMMODE_MG014) + .ECHO "MG014" + #ENDIF + .ECHO ", IO=" + .ECHO IMM1BASE + .ECHO "\n" +#ENDIF +; +#IF ($ - IMM_CFG) != (IMMCNT * IMM_CFGSIZ) + .ECHO "*** INVALID IMM CONFIG TABLE ***\n" +#ENDIF +; + .DB $FF ; END MARKER diff --git a/Source/HBIOS/intrtc.asm b/Source/HBIOS/intrtc.asm index cbb2184f..8d65e2e2 100644 --- a/Source/HBIOS/intrtc.asm +++ b/Source/HBIOS/intrtc.asm @@ -4,6 +4,8 @@ ;================================================================================================== ; INTRTC_BUFSIZ .EQU 6 ; SIX BYTE BUFFER (YYMMDDHHMMSS) +; + .ECHO "INTRTC: ENABLED\n" ; ; RTC DEVICE INITIALIZATION ENTRY ; diff --git a/Source/HBIOS/kbd.asm b/Source/HBIOS/kbd.asm index 4ae36c51..113c8aa1 100644 --- a/Source/HBIOS/kbd.asm +++ b/Source/HBIOS/kbd.asm @@ -14,9 +14,10 @@ ; ; DRIVER DATA OFFSETS (FROM IY) ; -KBD_ST .EQU 0 ; BYTE, STATUS PORT NUM (R) +KBD_MODE .EQU 0 ; BYTE, KEYBOARD MODE (STD OR VRC) +KBD_ST .EQU 1 ; BYTE, STATUS PORT NUM (R) KBD_CMD .EQU KBD_ST ; BYTE, CMD PORT NUM (W) -KBD_DAT .EQU 1 ; BYTE, DATA PORT NUM (R/W) +KBD_DAT .EQU 2 ; BYTE, DATA PORT NUM (R/W) ; ; TIMING CONSTANTS ; @@ -54,6 +55,8 @@ KBD_RSTATE .DB 0 ; STATE BITS FOR "RIGHT" KEYS KBD_STATUS .DB 0 ; CURRENT STATUS BITS (SEE ABOVE) KBD_REPEAT .DB 0 ; CURRENT REPEAT RATE KBD_IDLE .DB 0 ; IDLE COUNT +; + .ECHO "KBD: ENABLED\n" ; ;__________________________________________________________________________________________________ ; KEYBOARD INITIALIZATION @@ -69,17 +72,33 @@ KBD_INIT: LD (KBD_REPEAT),A ; SAVE IT LD A,KBD_DEFSTATE ; GET DEFAULT STATE LD (KBD_STATE),A ; SAVE IT - +; + LD A,(IY+KBD_MODE) ; GET KBD MODE BYTE + CP KBDMODE_VRC ; VRC? + JR Z,KBD_INIT1 ; IF SO, MUST ASSUME PRESENT +; LD A,$AA ; CONTROLLER SELF TEST CALL KBD_PUTCMD ; SEND IT CALL KBD_GETDATA ; CONTROLLER SHOULD RESPOND WITH $55 (ACK) - +; CP $55 ; IS IT THERE? JR Z,KBD_INIT1 ; IF SO, CONTINUE PRTS(" NOT PRESENT$") ; DIAGNOSE PROBLEM RET ; BAIL OUT - +; KBD_INIT1: + PRTS(" MODE=$") ; TAG + LD A,(IY+KBD_MODE) ; GET MODE VALUE + LD DE,KBD_STR_MODEPS2 + CP KBDMODE_PS2 + JR Z,KBD_INIT2 + LD DE,KBD_STR_MODEVRC + CP KBDMODE_VRC + JR Z,KBD_INIT2 + LD DE,KBD_STR_MODEUNK +KBD_INIT2: + CALL WRITESTR +; LD A,$60 ; SET COMMAND REGISTER CALL KBD_PUTCMD ; SEND IT ; LD A,$60 ; XLAT ENABLED, MOUSE DISABLED, NO INTS @@ -88,11 +107,6 @@ KBD_INIT1: CALL KBD_GETDATA ; GOBBLE UP $AA FROM POWER UP, AS NEEDED -; LD A,$AE ; COMMAND = ENABLE KEYBOARD -; CALL KBD_PUTCMD ; SEND IT -; LD A,$A7 ; COMMAND = DISABLE MOUSE -; CALL KBD_PUTCMD ; SEND IT - CALL KBD_RESET ; RESET THE KEYBOARD CALL KBD_SETLEDS ; UPDATE LEDS BASED ON CURRENT TOGGLE STATE BITS CALL KBD_SETRPT ; UPDATE REPEAT RATE BASED ON CURRENT SETTING @@ -177,6 +191,9 @@ KBD_PUTCMD: ; PUT A CMD BYTE FROM A TO THE KEYBOARD INTERFACE WITH TIMEOUT ; LD E,A ; SAVE INCOMING VALUE IN E + LD A,(IY+KBD_MODE) ; GET MODE BYTE + CP KBDMODE_VRC ; VGARC KEYBOARD? + JR Z,KBD_PUTCMD2 ; BAIL OUT LD B,KBD_WAITTO ; SETUP TO LOOP KBD_PUTCMD0: CALL KBD_OST ; GET OUTPUT REGISTER STATUS @@ -194,6 +211,7 @@ KBD_PUTCMD1: #ENDIF LD C,(IY+KBD_CMD) ; COMMAND PORT OUT (C),A ; WRITE IT +KBD_PUTCMD2: XOR A ; SIGNAL SUCCESS RET ; @@ -203,6 +221,9 @@ KBD_PUTDATA: ; PUT A DATA BYTE FROM A TO THE KEYBOARD INTERFACE WITH TIMEOUT ; LD E,A ; SAVE INCOMING VALUE IN E + LD A,(IY+KBD_MODE) ; GET MODE BYTE + CP KBDMODE_VRC ; VGARC KEYBOARD? + JR Z,KBD_PUTDATA2 ; BAIL OUT LD B,KBD_WAITTO ; SETUP TO LOOP KBD_PUTDATA0: CALL KBD_OST ; GET OUTPUT REGISTER STATUS @@ -219,6 +240,7 @@ KBD_PUTDATA1: #ENDIF LD C,(IY+KBD_DAT) ; DATA PORT OUT (C),A ; WRITE IT +KBD_PUTDATA2: XOR A ; SIGNAL SUCCESS RET ; @@ -681,11 +703,21 @@ KBD_DECNEW: ; START NEW KEYPRESS (CLEAR ALL STATUS BITS) LD (KBD_STATUS),A ; CLEAR STATUS JP KBD_DEC1 ; RESTART THE ENGINE ; +; DRIVER DATA +; +KBD_STR_MODEPS2 .TEXT "PS2$" +KBD_STR_MODEVRC .TEXT "VRC$" +KBD_STR_MODEUNK .TEXT "???$" +; +; +; #IF (KBDKBLOUT == KBD_US) +; ;__________________________________________________________________________________________________ ; ; MAPPING TABLES US/ENGLISH ;__________________________________________________________________________________________________ +; KBD_MAPSTD: ; SCANCODE IS INDEX INTO TABLE TO RESULTANT LOOKUP KEYCODE .DB $FF,$E8,$FF,$E4,$E2,$E0,$E1,$EB,$FF,$E9,$E7,$E5,$E3,$09,'`',$FF .DB $FF,$B4,$B0,$FF,$B2,'q','1',$FF,$FF,$FF,'z','s','a','w','2',$FF @@ -722,7 +754,9 @@ KBD_MAPNUMPAD: ; KEYCODE TRANSLATION FROM NUMPAD RANGE TO STD ASCII/KEYCODES .DB $F3,$F7,$F5,$F8,$FF,$F9,$F2,$F6,$F4,$F0,$F1,$2F,$2A,$2D,$2B,$0D .DB $31,$32,$33,$34,$35,$36,$37,$38,$39,$30,$2E,$2F,$2A,$2D,$2B,$0D #ENDIF +; #IF (KBDKBLOUT == KBD_DE) +; ;__________________________________________________________________________________________________ ; ; MAPPING TABLES GERMAN diff --git a/Source/HBIOS/lpt.asm b/Source/HBIOS/lpt.asm index 2c007389..73f26b5e 100644 --- a/Source/HBIOS/lpt.asm +++ b/Source/HBIOS/lpt.asm @@ -3,13 +3,17 @@ ; CENTRONICS (LPT) INTERFACE DRIVER ;================================================================================================== ; -; CENTRONICS-STYLE PARALLEL PRINTER DRIVER. ASSUMES IBM STYLE -; HARDWARE INTERFACE AS DESCRIBED BELOW. +; CENTRONICS-STYLE PARALLEL PRINTER DRIVER. ; ; IMPLEMENTED AS A ROMWBW CHARACTER DEVICE. CURRENTLY HANDLES OUPUT ; ONLY. ; -; PORT 0 (INPUT/OUTPUT): +;================================================================================================== +; +; IBM PC STANDARD PARALLEL PORT (SPP): +; - NHYODYNE PRINT MODULE +; +; PORT 0 (OUTPUT): ; ; D7 D6 D5 D4 D3 D2 D1 D0 ; +-------+-------+-------+-------+-------+-------+-------+-------+ @@ -20,26 +24,51 @@ ; ; D7 D6 D5 D4 D3 D2 D1 D0 ; +-------+-------+-------+-------+-------+-------+-------+-------+ -; | BUSY | ACK | POUT | SEL | ERR | 0 | 0 | 0 | +; | /BUSY | /ACK | POUT | SEL | /ERR | 0 | 0 | 0 | ; +-------+-------+-------+-------+-------+-------+-------+-------+ ; -; PORT 2 (INPUT/OUTPUT): +; PORT 2 (OUTPUT): ; ; D7 D6 D5 D4 D3 D2 D1 D0 ; +-------+-------+-------+-------+-------+-------+-------+-------+ ; | STAT1 | STAT0 | ENBL | PINT | SEL | RES | LF | STB | ; +-------+-------+-------+-------+-------+-------+-------+-------+ ; -LPT_NONE .EQU 0 ; NOT PRESENT -LPT_IBM .EQU 1 ; IBM PC STYLE INTERFACE +;================================================================================================== +; +; MG014 STYLE INTERFACE: +; - RCBUS MG014 MODULE +; +; PORT 0 (OUTPUT): +; +; D7 D6 D5 D4 D3 D2 D1 D0 +; +-------+-------+-------+-------+-------+-------+-------+-------+ +; | PD7 | PD6 | PD5 | PD4 | PD3 | PD2 | PD1 | PD0 | +; +-------+-------+-------+-------+-------+-------+-------+-------+ +; +; PORT 1 (INPUT): +; +; D7 D6 D5 D4 D3 D2 D1 D0 +; +-------+-------+-------+-------+-------+-------+-------+-------+ +; | | | | /ERR | SEL | POUT | BUSY | /ACK | +; +-------+-------+-------+-------+-------+-------+-------+-------+ +; +; PORT 2 (OUTPUT): +; +; D7 D6 D5 D4 D3 D2 D1 D0 +; +-------+-------+-------+-------+-------+-------+-------+-------+ +; | LED | | | | /SEL | /RES | /LF | /STB | +; +-------+-------+-------+-------+-------+-------+-------+-------+ +; +;================================================================================================== ; ; PRE-CONSOLE INITIALIZATION - DETECT AND INIT HARDWARE ; LPT_PREINIT: ; ; SETUP THE DISPATCH TABLE ENTRIES -; NOTE: INTS WILL BE DISABLED WHEN PREINIT IS CALLED AND THEY MUST REMIAIN -; DISABLED. +; NOTE: INTS WILL BE DISABLED WHEN PREINIT IS CALLED AND THEY MUST +; REMAIN DISABLED. ; LD B,LPT_CFGCNT ; LOOP CONTROL XOR A ; ZERO TO ACCUM @@ -136,18 +165,26 @@ LPT_IN: LPT_OUT: CALL LPT_OST ; READY TO SEND? JR Z,LPT_OUT ; LOOP IF NOT - LD A,(IY+3) - LD C,A ; PORT 0 (DATA) - OUT (C),E ; OUTPUT DATA TO PORT - CALL DELAY ; IGNORE ANYTHING BACK AFTER A RESET - LD A,%00001101 ; SELECT & STROBE, LEDS OFF - INC C ; PUT CONTROL PORT IN C - INC C - OUT (C),A ; OUTPUT DATA TO PORT - CALL DELAY ; IGNORE ANYTHING BACK AFTER A RESET - LD A,%00001100 ; SELECT, LEDS OFF - OUT (C),A ; OUTPUT DATA TO PORT - + LD C,(IY+3) ; PORT 0 (DATA) + OUT (C),E ; OUTPUT DATA TO PORT +#IF (LPTMODE == LPTMODE_SPP) + LD A,%00001101 ; SELECT & STROBE, LEDS OFF +#ENDIF +#IF (LPTMODE == LPTMODE_MG014) + LD A,%00000100 ; SELECT & STROBE, LED OFF +#ENDIF + INC C ; PUT CONTROL PORT IN C + INC C + OUT (C),A ; OUTPUT DATA TO PORT + CALL DELAY +#IF (LPTMODE == LPTMODE_SPP) + LD A,%00001100 ; SELECT, LEDS OFF +#ENDIF +#IF (LPTMODE == LPTMODE_MG014) + LD A,%00000101 ; SELECT, LED OFF +#ENDIF + OUT (C),A ; OUTPUT DATA TO PORT + CALL DELAY XOR A ; SIGNAL SUCCESS RET ; @@ -161,11 +198,16 @@ LPT_IST: ; OUTPUT STATUS ; LPT_OST: - LD A,(IY+3) - LD C,A ; PORT 0 (DATA) - INC C ; SELECT STATUS PORT - IN A,(C) ; GET STATUS INFO - AND %10000000 ; ONLY INTERESTED IN BUSY FLAG + LD C,(IY+3) ; BASE PORT + INC C ; SELECT STATUS PORT + IN A,(C) ; GET STATUS INFO +#IF (LPTMODE == LPTMODE_SPP) + AND %10000000 ; ISOLATE /BUSY +#ENDIF +#IF (LPTMODE == LPTMODE_MG014) + AND %00000010 ; ISOLATE BUSY + XOR %00000010 ; INVERT TO READY +#ENDIF RET ; DONE ; ; INITIALIZE DEVICE @@ -180,20 +222,40 @@ LPT_INITDEV: ; PREINIT ABOVE. PREINIT IS NOT ALLOWED TO ENABLE INTS! ; LPT_INITDEVX: - LD A,(IY+3) - LD C,A ; PORT 0 (DATA) +; +#IF (LPTMODE == LPTMODE_SPP) +; + LD C,(IY+3) ; PORT 0 (DATA) XOR A ; CLEAR ACCUM OUT (C),A ; SEND IT INC C ; BUMP TO INC C ; ... PORT 2 LD A,%00001000 ; SELECT AND ASSERT RESET, LEDS OFF OUT (C),A ; SEND IT - CALL LDELAY ; HALF SECOND DELAY + CALL LDELAY ; HALF SECOND DELAY LD A,%00001100 ; SELECT AND DEASSERT RESET, LEDS OFF OUT (C),A ; SEND IT XOR A ; SIGNAL SUCCESS RET ; RETURN ; +#ENDIF +; +#IF (LPTMODE == LPTMODE_MG014) + LD A,(IY+3) ; BASE PORT + ADD A,3 ; BUMP TO CONTROL PORT + LD C,A ; MOVE TO C FOR I/O + LD A,$82 ; CONFIG A OUT, B IN, C OUT + OUT (C),A ; DO IT + DEC C ; OUTPUT PORT + LD A,$81 ; STROBE OFF, SELECT ON, RES ON, LED ON + OUT (C),A ; SEND IT + CALL LDELAY ; HALF SECOND DELAY + LD A,$05 ; STROBE OFF, SELECT ON, RES OFF, LED OFF + OUT (C),A ; SEND IT + XOR A ; SIGNAL SUCCESS + RET ; RETURN +#ENDIF +; ; ; LPT_QUERY: @@ -215,17 +277,26 @@ LPT_DEVICE: ; ; LPT DETECTION ROUTINE ; +#IF (LPTMODE == LPTMODE_NONE) +; +LPT_DETECT: + LD A,LPTMODE_NONE ; NOTHING TO DETECT + RET +; +#ENDIF +; +#IF (LPTMODE == LPTMODE_SPP) +; LPT_DETECT: - LD A,(IY+3) ; BASE PORT ADDRESS - LD C,A ; PUT IN C FOR I/O + LD C,(IY+3) ; BASE PORT ADDRESS CALL LPT_DETECT2 ; CHECK IT JR Z,LPT_DETECT1 ; FOUND IT, RECORD IT - LD A,LPT_NONE ; NOTHING FOUND + LD A,LPTMODE_NONE ; NOTHING FOUND RET ; DONE ; LPT_DETECT1: ; LPT FOUND, RECORD IT - LD A,LPT_IBM ; RETURN CHIP TYPE + LD A,LPTMODE_SPP ; RETURN CHIP TYPE RET ; DONE ; LPT_DETECT2: @@ -253,6 +324,43 @@ LPT_DETECT2: CP $A5 ; CORRECT? RET ; RETURN (ZF SET CORRECTLY) ; +#ENDIF +; +#IF (LPTMODE == LPTMODE_MG014) +LPT_DETECT: +; + ; TEST FOR PPI EXISTENCE + ; WE SETUP THE PPI TO WRITE, THEN WRITE A VALUE OF $A5 + ; TO PORT A (DATALO), THEN READ IT BACK. IF THE PPI IS THERE + ; THEN THE BUS HOLD CIRCUITRY WILL READ BACK THE $A5. SINCE + ; WE ARE IN WRITE MODE, AN IDE CONTROLLER WILL NOT BE ABLE TO + ; INTERFERE WITH THE VALUE BEING READ. +; + LD A,(IY+3) ; BASE IO ADDRESS + ADD A,3 ; BUMP TO CONTROL PORT + LD C,A ; PUT IN C + LD A,$80 ; SET PORT A TO WRITE + OUT (C),A ; WRITE IT +; + LD C,(IY+3) ; PPI PORT A + LD A,$A5 ; TEST VALUE + OUT (C),A ; PUSH VALUE TO PORT + IN A,(C) ; GET PORT VALUE + #IF (LPTTRACE >= 3) + CALL PC_SPACE + CALL PRTHEXBYTE + #ENDIF + CP $A5 ; CHECK FOR TEST VALUE + JR Z,LPT_DETECT1 ; FOUND IT + LD A,LPTMODE_NONE ; NOT FOUND + RET +; +LPT_DETECT1: + ; LPT FOUND, RECORD IT + LD A,LPTMODE_MG014 ; RETURN CHIP TYPE + RET ; DONE +#ENDIF +; ; ; LPT_PRTCFG: @@ -266,7 +374,7 @@ LPT_PRTCFG: CALL PRTHEXBYTE ; PRINT BASE PORT ; PRINT THE LPT TYPE - CALL PC_SPACE ; FORMATTING + PRTS(" MODE=$") ; FORMATTING LD A,(IY+1) ; GET LPT TYPE BYTE RLCA ; MAKE IT A WORD OFFSET LD HL,LPT_TYPE_MAP ; POINT HL TO TYPE MAP TABLE @@ -290,10 +398,12 @@ LPT_PRTCFG: ; LPT_TYPE_MAP: .DW LPT_STR_NONE - .DW LPT_STR_IBM + .DW LPT_STR_SPP + .DW LPT_STR_MG014 ; LPT_STR_NONE .DB "$" -LPT_STR_IBM .DB "IBM$" +LPT_STR_SPP .DB "SPP$" +LPT_STR_MG014 .DB "MG014$" ; ; WORKING VARIABLES ; @@ -310,6 +420,17 @@ LPT0_CFG: .DB 0 ; MODULE ID .DB LPT0BASE ; BASE PORT .DW 0 ; LINE CONFIGURATION +; + .ECHO "LPT: MODE=" + #IF (LPTMODE == LPTMODE_SPP) + .ECHO "SPP" + #ENDIF + #IF (LPTMODE == LPTMODE_MG014) + .ECHO "MG014" + #ENDIF + .ECHO ", IO=" + .ECHO LPT0BASE + .ECHO "\n" ; LPT_CFGSIZ .EQU $ - LPT_CFG ; SIZE OF ONE CFG TABLE ENTRY ; @@ -322,6 +443,17 @@ LPT1_CFG: .DB 1 ; MODULE ID .DB LPT1BASE ; BASE PORT .DW 0 ; LINE CONFIGURATION +; + .ECHO "LPT: MODE=" + #IF (LPTMODE == LPTMODE_SPP) + .ECHO "SPP" + #ENDIF + #IF (LPTMODE == LPTMODE_MG014) + .ECHO "MG014" + #ENDIF + .ECHO ", IO=" + .ECHO LPT1BASE + .ECHO "\n" ; #ENDIF ; diff --git a/Source/HBIOS/md.asm b/Source/HBIOS/md.asm index 8277468e..6e8adbb8 100644 --- a/Source/HBIOS/md.asm +++ b/Source/HBIOS/md.asm @@ -21,9 +21,9 @@ MD_LBA .EQU 2 ; OFFSET OF LBA (DWORD) MD_MID .EQU 6 ; OFFSET OF MEDIA ID (BYTE) MD_ATTRIB .EQU 7 ; OFFSET OF ATTRIBUTE (BYTE) ; -MD_AROM .EQU %00100000 ; ROM ATTRIBUTE -MD_ARAM .EQU %00101000 ; RAM ATTRIBUTE -MD_AFSH .EQU %00111000 ; FLASH ATTRIBUTE +MD_AROM .EQU %00010100 ; ROM ATTRIBUTE +MD_ARAM .EQU %00010101 ; RAM ATTRIBUTE +MD_AFSH .EQU %00010111 ; FLASH ATTRIBUTE ; MD_FDBG .EQU 0 ; FLASH DEBUG CODE MD_FVBS .EQU 1 ; FLASH VERBOSE OUTPUT @@ -39,6 +39,8 @@ MD_CFGTBL: .DW 0,0 ; CURRENT LBA .DB MID_MDRAM ; DEVICE MEDIA ID .DB MD_ARAM ; DEVICE ATTRIBUTE +; + .ECHO "MD: TYPE=RAM\n" #ENDIF ; #IF (MDROM) @@ -48,6 +50,8 @@ MD_CFGTBL: .DW 0,0 ; CURRENT LBA .DB MID_MDROM ; DEVICE MEDIA ID .DB MD_AROM ; DEVICE ATTRIBUTE +; + .ECHO "MD: TYPE=ROM\n" #ENDIF ; MD_DEVCNT .EQU ($ - MD_CFGTBL) / MD_CFGSIZ @@ -72,32 +76,30 @@ MD_INIT: ; #IF (MDROM) PRTS(" ROMDISK=$") -; LD HL,ROMSIZE - 128 - LD A,(HCB + HCB_ROMBANKS) ; GET NUMBER OF BANKS - SUB (TOT_ROM_RB) - LD L,A - LD H,0 ; CALCULATE RAM SIZE + LD A,(CB_ROMD_BNKS) ; ROM DISK SIZE IN BANKS + LD L,A ; PUT IN L + LD H,0 ; CALCULATE ROM DISK SIZE ADD HL,HL ; X2 ADD HL,HL ; X4 ADD HL,HL ; X8 ADD HL,HL ; X16 ADD HL,HL ; X32 + LD (MD_ROMDSIZE),HL ; SAVE ROM DISK SIZE CALL PRTDEC PRTS("KB$") #ENDIF ; #IF (MDRAM) PRTS(" RAMDISK=$") -; LD HL,RAMSIZE - 256 - LD A,(HCB + HCB_RAMBANKS) ; GET NUMBER OF BANKS - SUB (TOT_RAM_RB) ; LESS RESERVED BANKS - LD L,A - LD H,0 ; CALCULATE RAM SIZE + LD A,(CB_RAMD_BNKS) ; RAM DISK SIZE IN BANKS + LD L,A ; PUT IN L + LD H,0 ; CALCULATE RAM DISK SIZE ADD HL,HL ; X2 ADD HL,HL ; X4 ADD HL,HL ; X8 ADD HL,HL ; X16 ADD HL,HL ; X32 + LD (MD_RAMDSIZE),HL ; SAVE RAM DISK SIZE CALL PRTDEC PRTS("KB$") #ENDIF @@ -183,21 +185,18 @@ MD_CAP: ; ASSUMES THAT UNIT 0 IS RAM, UNIT 1 IS ROM SYSCHKERR(ERR_NOUNIT) ; INVALID UNIT RET MD_CAP0: - LD A,(HCB + HCB_RAMBANKS) ; POINT TO RAM BANK COUNT - LD B,TOT_RAM_RB ; SET # RESERVED RAM BANKS - JR MD_CAP2 + ; RAM DISK SIZE + LD HL,(MD_RAMDSIZE) ; SIZE IN KB + JR MD_CAP2 ; CONTINUE MD_CAP1: - LD A,(HCB + HCB_ROMBANKS) ; POINT TO ROM BANK COUNT - LD B,TOT_ROM_RB ; SET # RESERVED ROM BANKS + ; ROM DISK SIZE + LD HL,(MD_ROMDSIZE) ; SIZE IN KB MD_CAP2: - SUB B ; SUBTRACT OUT RESERVED BANKS - LD H,A ; H := # BANKS - LD E,64 ; # 512 BYTE BLOCKS / BANK - CALL MULT8 ; HL := TOTAL # 512 BYTE BLOCKS - LD DE,0 ; NEVER EXCEEDS 64K, ZERO HIGH WORD + ADD HL,HL ; CONVERT TO BLOCK COUNT + LD DE,0 ; FILL IN HIGH WORD LD BC,512 ; 512 BYTE SECTOR - XOR A - RET + XOR A ; SIGNAL SUCCESS + RET ; DONE ; ; ; @@ -303,9 +302,11 @@ MD_RW1: PUSH BC ; SAVE COUNTERS ; #IF (DSKYENABLE) + #IF (DSKYDSKACT) LD A,MD_LBA CALL LDHLIYA CALL HB_DSKACT ; SHOW ACTIVITY + #ENDIF #ENDIF ; LD HL,(MD_RWFNADR) ; GET PENDING IO FUNCTION ADDRESS @@ -1030,6 +1031,8 @@ MD_FFSEN .DB 00h ; FLASH FILES SYSTEM ENABLE ; #ENDIF ; +MD_ROMDSIZE .DW 0 +MD_RAMDSIZE .DW 0 MD_RWFNADR .DW 0 MD_DSKBUF .DW 0 MD_SRCBNK .DB 0 diff --git a/Source/HBIOS/pcf8584.asm b/Source/HBIOS/pcf.asm similarity index 88% rename from Source/HBIOS/pcf8584.asm rename to Source/HBIOS/pcf.asm index 54dfe6a4..ab17f85c 100644 --- a/Source/HBIOS/pcf8584.asm +++ b/Source/HBIOS/pcf.asm @@ -2,12 +2,11 @@ ; PCF8584 I2C CLOCK DRIVER ;================================================================================================== ; -PCF_BASE .EQU 0F0H +PCF_BASE .EQU PCFBASE PCF_ID .EQU 0AAH -CPU_CLK .EQU 12 - +; PCF_RS0 .EQU PCF_BASE -PCF_RS1 .EQU PCF_RS0+1 +PCF_RS1 .EQU PCF_BASE+1 PCF_OWN .EQU (PCF_ID >> 1) ; PCF'S ADDRESS IN SLAVE MODE ; ;T4LC512D .EQU 10100000B ; DEVICE IDENTIFIER @@ -37,10 +36,10 @@ PCF_STA .EQU 00000100B PCF_STO .EQU 00000010B PCF_ACK .EQU 00000001B ; -PCF_START_ .EQU (PCF_PIN | PCF_ES0 | PCF_STA | PCF_ACK) -PCF_STOP_ .EQU (PCF_PIN | PCF_ES0 | PCF_STO | PCF_ACK) -PCF_REPSTART_ .EQU ( PCF_ES0 | PCF_STA | PCF_ACK) -PCF_IDLE_ .EQU (PCF_PIN | PCF_ES0 | PCF_ACK) +PCF_START_ .EQU (PCF_PIN | PCF_ES0 | PCF_STA | PCF_ACK) +PCF_STOP_ .EQU (PCF_PIN | PCF_ES0 | PCF_STO | PCF_ACK) +PCF_REPSTART_ .EQU (PCF_ES0 | PCF_STA | PCF_ACK) +PCF_IDLE_ .EQU (PCF_PIN | PCF_ES0 | PCF_ACK) ; ; STATUS REGISTER BITS ; @@ -54,13 +53,26 @@ PCF_AAS .EQU 00000100B PCF_LAB .EQU 00000010B PCF_BB .EQU 00000001B ; +; THE PCF8584 TARGETS A TOP I2C CLOCK SPEED OF 90KHZ AND SUPPORTS DIVIDERS FOR +; 3, 4.43, 6, 8 AND 12MHZ TO ACHEIVE THIS. +; +; +--------------------------------------------------------------------------------------------+ +; | div/clk | 2MHz | 4MHz | 6MHz | 7.38Mhz | 10MHz | 12MHz | 16MHz | 18.432Mhz | 20MHz | +; +----------------------------------------------------------------------------------+---------+ +; | 3MHz | 60Khz | 120Khz | | | | | | | | +; | 4.43MHz | | 81Khz | | | | | | | | +; | 6MHz | | | 90Khz | 110Khz | | | | | | +; | 8MHz | | | | 83Khz | 112Khz | | | | | +; | 12MHz | | | | | | 90Khz | 120Khz | 138Khz | 150Khz | +; +----------------------------------------------------------------------------------+---------+ +; ; CLOCK CHIP FREQUENCIES ; PCF_CLK3 .EQU 000H PCF_CLK443 .EQU 010H PCF_CLK6 .EQU 014H PCF_CLK8 .EQU 018H -PCF_CLK12 .EQU 01cH +PCF_CLK12 .EQU 01CH ; ; TRANSMISSION FREQUENCIES ; @@ -69,6 +81,12 @@ PCF_TRNS45 .EQU 001H ; 45 kHz */ PCF_TRNS11 .EQU 002H ; 11 kHz */ PCF_TRNS15 .EQU 003H ; 1.5 kHz */ ; +; BELOW VARIABLES CONTROL PCF CLOCK DIVISOR PROGRAMMING +; HARD-CODED FOR NOW +; +PCF_CLK .EQU PCF_CLK12 +PCF_TRNS .EQU PCF_TRNS90 +; ; TIMEOUT AND DELAY VALUES (ARBITRARY) ; PCF_PINTO .EQU 65000 @@ -76,42 +94,20 @@ PCF_ACKTO .EQU 65000 PCF_BBTO .EQU 65000 PCF_LABDLY .EQU 65000 ; -; DATA PORT REGISTERS + .ECHO "PCF: IO=" + .ECHO PCF_BASE + .ECHO "\n" ; -#IF (CPU_CLK = 443) -PCF_CLK .EQU PCF_CLK4433 -#ELSE - #IF (CPU_CLK = 8) -PCF_CLK .EQU PCF_CLK8 - #ELSE - #IF (CPU_CLK = 12) -PCF_CLK .EQU PCF_CLK12 - #ELSE ***ERROR - #ENDIF - #ENDIF -#ENDIF -; -; THE PCF8584 TARGETS A TOP I2C CLOCK SPEED OF 90KHZ AND SUPPORTS DIVIDERS FOR -; 3, 4.43, 6, 8 AND 12MHZ TO ACHEIVE THIS. -; -; +--------------------------------------------------------------------------------------------+ -; | div/clk | 2MHz | 4MHz | 6MHz | 7.38Mhz | 10MHz | 12MHz | 16MHz | 18.432Mhz | 20MHz | -; +----------------------------------------------------------------------------------+---------+ -; | 3MHz | 60Khz | 120Khz | | | | | | | | -; | 4.43MHz | | 81Khz | | | | | | | | -; | 6MHz | | | 90Khz | 110Khz | | | | | | -; | 8MHz | | | | 83Khz | 112Khz | | | | | -; | 12MHz | | | | | | 90Khz | 120Khz | 138Khz | 150Khz | -; +----------------------------------------------------------------------------------+---------+ +; DATA PORT REGISTERS ; -PCF8584_INIT: +PCF_INIT: CALL NEWLINE ; Formatting - PRTS("I2C: IO=0x$") + PRTS("PCF: IO=0x$") LD A, PCF_BASE CALL PRTHEXBYTE CALL PC_SPACE - CALL PCF_INIT - CALL NEWLINE + CALL PCF_INITDEV + ;CALL NEWLINE RET ; ; LINUX DRIVER BASED CODE @@ -141,11 +137,13 @@ PCF_STOP: ; ;----------------------------------------------------------------------------- ; -PCF_INIT: +PCF_INITDEV: LD A,PCF_PIN ; S1=80H: S0 SELECTED, SERIAL OUT (PCF_RS1),A ; INTERFACE OFF NOP IN A,(PCF_RS1) ; CHECK TO SEE S1 NOW USED AS R/W + ;CALL PC_SPACE + ;CALL PRTHEXBYTE AND 07FH ; CTRL. PCF8584 DOES THAT WHEN ESO JR NZ,PCF_FAIL ; IS ZERO ; @@ -153,6 +151,8 @@ PCF_INIT: OUT (PCF_RS0),A ; EFFECTIVE ADDRESS IS (OWN <<1) NOP IN A,(PCF_RS0) ; CHECK IT IS REALLY WRITTEN + ;CALL PC_SPACE + ;CALL PRTHEXBYTE CP PCF_OWN JP NZ,PCF_SETERR ; @@ -160,14 +160,18 @@ PCF_INIT: OUT (PCF_RS1),A ; NEXT BYTE IN S2 NOP IN A,(PCF_RS1) + ;CALL PC_SPACE + ;CALL PRTHEXBYTE AND 07FH CP PCF_ES1 JP NZ,PCF_REGERR ; - LD A,PCF_CLK ; LOAD CLOCK REGISTER S2 + LD A,PCF_CLK | PCF_TRNS ; LOAD CLOCK REGISTER S2 OUT (PCF_RS0),A NOP IN A,(PCF_RS0) ; CHECK IT'S REALLY WRITTEN, ONLY + ;CALL PC_SPACE + ;CALL PRTHEXBYTE AND 1FH ; THE LOWER 5 BITS MATTER CP PCF_CLK JP NZ,PCF_CLKERR @@ -176,6 +180,8 @@ PCF_INIT: OUT (PCF_RS1),A NOP IN A,(PCF_RS1) + ;CALL PC_SPACE + ;CALL PRTHEXBYTE CP +(PCF_PIN | PCF_BB) JP NZ,PCF_IDLERR ; @@ -381,12 +387,12 @@ PCF_READI2C: ; ; POLL THE BUS BUSY BIT TO DETERMINE IF BUS IS FREE. ; RETURN WITH A=00H/Z STATUS IF BUS IS FREE -; RETURN WITH A=FFH/NZ STATUS IF BUS +; RETURN WITH A=FFH/NZ STATUS IF BUS IS BUSY ; ; AFTER RESET THE BUS BUSY BIT WILL BE SET TO 1 I.E. NOT BUSY ; PCF_WAIT_FOR_BB: - LD HL,PCF_BBTO + LD HL,PCF_BBTO PCF_WFBB0: IN A,(PCF_RS1) AND PCF_BB diff --git a/Source/HBIOS/pio.asm b/Source/HBIOS/pio.asm index 18016f4f..1dc823a9 100644 --- a/Source/HBIOS/pio.asm +++ b/Source/HBIOS/pio.asm @@ -307,6 +307,10 @@ PIO0A_CFG: .DB PIO0A_DAT ; DATA PORT .DW DEFSERCFG ; LINE CONFIGURATION .DW PIO0A_RCVBUF ; POINTER TO RCV BUFFER STRUCT +; + .ECHO "PIO: IO=" + .ECHO PIO0BASE + .ECHO ", CHANNEL A\n" ; PIO_CFGSIZ .EQU $ - PIO_CFG ; SIZE OF ONE CFG TABLE ENTRY ; @@ -319,6 +323,10 @@ PIO0B_CFG: .DB PIO0B_DAT ; DATA PORT .DW DEFSERCFG ; LINE CONFIGURATION .DW PIO0B_RCVBUF ; POINTER TO RCV BUFFER STRUCT +; + .ECHO "PIO: IO=" + .ECHO PIO0BASE + .ECHO ", CHANNEL B\n" ; #IF (PIOCNT >= 2) ; @@ -331,6 +339,10 @@ PIO1A_CFG: .DB PIO1A_DAT ; DATA PORT .DW DEFSERCFG ; LINE CONFIGURATION .DW PIO1A_RCVBUF ; POINTER TO RCV BUFFER STRUCT +; + .ECHO "PIO: IO=" + .ECHO PIO1BASE + .ECHO ", CHANNEL A\n" ; ; PIO1 CHANNEL B PIO1B_CFG: @@ -341,6 +353,10 @@ PIO1B_CFG: .DB PIO1B_DAT ; DATA PORT .DW DEFSERCFG ; LINE CONFIGURATION .DW PIO1B_RCVBUF ; POINTER TO RCV BUFFER STRUCT +; + .ECHO "PIO: IO=" + .ECHO PIO1BASE + .ECHO ", CHANNEL B\n" ; #ENDIF ; diff --git a/Source/HBIOS/dskyng.asm b/Source/HBIOS/pkd.asm similarity index 50% rename from Source/HBIOS/dskyng.asm rename to Source/HBIOS/pkd.asm index fde11a51..fbaa6317 100644 --- a/Source/HBIOS/dskyng.asm +++ b/Source/HBIOS/pkd.asm @@ -1,9 +1,9 @@ ; ;================================================================================================== -; DSKYNG (DISPLAY AND KEYBOARD NEXT GENERATION) ROUTINES +; DSKY NEXT GENERATION PKD (DISPLAY AND KEYBOARD) ROUTINES ;================================================================================================== ; -; A DSKYNG CAN SHARE A PPI BUS WITH EITHER A PPIDE OR PPISD. +; A PKD CAN SHARE A PPI BUS WITH EITHER A PPIDE OR PPISD. ; SEE PPI_BUS.TXT FOR MORE INFORMATION. ; ; LED SEGMENTS (BIT VALUES) @@ -39,13 +39,13 @@ ; 10 10 10 10 10 ; 20 20 20 20 20 L1 L2 BUZZ ; -PPIA .EQU DSKYPPIBASE + 0 ; PORT A -PPIB .EQU DSKYPPIBASE + 1 ; PORT B -PPIC .EQU DSKYPPIBASE + 2 ; PORT C -PPIX .EQU DSKYPPIBASE + 3 ; PPI CONTROL PORT +PKD_PPIA .EQU PKDPPIBASE + 0 ; PORT A +PKD_PPIB .EQU PKDPPIBASE + 1 ; PORT B +PKD_PPIC .EQU PKDPPIBASE + 2 ; PORT C +PKD_PPIX .EQU PKDPPIBASE + 3 ; PPI CONTROL PORT ; -DSKY_PPIX_RD: .EQU %10010010 ; PPIX VALUE FOR READS -DSKY_PPIX_WR: .EQU %10000010 ; PPIX VALUE FOR WRITES +PKD_PPIX_RD: .EQU %10010010 ; PPIX VALUE FOR READS +PKD_PPIX_WR: .EQU %10000010 ; PPIX VALUE FOR WRITES ; ; PIO CHANNEL C: ; @@ -55,18 +55,22 @@ DSKY_PPIX_WR: .EQU %10000010 ; PPIX VALUE FOR WRITES ; SETTING BITS 3 & 4 WILL ASSERT /CS ON 3279 ; CLEAR BITS 1 OR 2 TO ASSERT READ/WRITE ; -DSKY_PPI_IDLE: .EQU %00000110 +PKD_PPI_IDLE .EQU %00000110 ; -DSKY_CMD_CLR: .EQU %11011111 ; CLEAR (ALL OFF) -DSKY_CMD_CLRX: .EQU %11010011 ; CLEAR (ALL ON) -DSKY_CMD_WDSP: .EQU %10010000 ; WRITE DISPLAY RAM -DSKY_CMD_RDSP: .EQU %01110000 ; READ DISPLAY RAM -DSKY_CMD_CLK: .EQU %00100000 ; SET CLK PRESCALE -DSKY_CMD_FIFO: .EQU %01000000 ; READ FIFO +PKD_CMD_CLR .EQU %11011111 ; CLEAR (ALL OFF) +PKD_CMD_CLRX .EQU %11010011 ; CLEAR (ALL ON) +PKD_CMD_WDSP .EQU %10010000 ; WRITE DISPLAY RAM +PKD_CMD_RDSP .EQU %01110000 ; READ DISPLAY RAM +PKD_CMD_CLK .EQU %00100000 ; SET CLK PRESCALE +PKD_CMD_FIFO .EQU %01000000 ; READ FIFO ; -DSKY_PRESCL: .EQU DSKYOSC/100000 ; PRESCALER +PKD_PRESCL .EQU PKDOSC/100000 ; PRESCALER ; -;__DSKY_PREINIT______________________________________________________________________________________ + .ECHO "PKD: IO=" + .ECHO PKDPPIBASE + .ECHO "\n" +; +;__PKD_PREINIT_______________________________________________________________________________________ ; ; CONFIGURE PARALLEL PORT AND INITIALIZE 8279 ;____________________________________________________________________________________________________ @@ -74,200 +78,288 @@ DSKY_PRESCL: .EQU DSKYOSC/100000 ; PRESCALER ; ; HARDWARE RESET 8279 BY PULSING RESET LINE ; -DSKY_PREINIT: +PKD_PREINIT: + LD A,(DSKY_DISPACT) ; DSKY DISPATCHER ALREADY SET? + OR A ; SET FLAGS + RET NZ ; IF ALREADY ACTIVE, ABORT +; ; CHECK FOR PPI - CALL DSKY_PPIDETECT ; TEST FOR PPI HARDWARE + CALL PKD_PPIDETECT ; TEST FOR PPI HARDWARE RET NZ ; BAIL OUT IF NOT THERE - ; SETUP PPI TO DEFAULT MODE - CALL DSKY_PPIRD - ; INIT 8279 VALUES TO IDLE STATE - LD A,DSKY_PPI_IDLE - OUT (PPIC),A +; + ; SETUP PPI TO IDLE STATE + CALL PKD_PPIIDLE + LD A,PKD_PPI_IDLE + OUT (PKD_PPIC),A +; ; PULSE RESET SIGNAL ON 8279 SET 7,A - OUT (PPIC),A + OUT (PKD_PPIC),A RES 7,A - OUT (PPIC),A + OUT (PKD_PPIC),A +; ; INITIALIZE 8279 - CALL DSKY_REINIT - ; NOW SEE IF A DSKYNG IS REALLY THERE... - LD A,$A5 - LD (DSKY_BUF),A - LD HL,DSKY_BUF + CALL PKD_REINIT +; + ; NOW SEE IF A PKD IS REALLY THERE... + LD A,$71 LD C,0 - LD B,1 - CALL DSKY_PUTSTR - LD HL,DSKY_BUF + CALL PKD_PUTBYTE LD C,0 - LD B,1 - CALL DSKY_GETSTR - LD A,(DSKY_BUF) - CP $A5 + CALL PKD_GETBYTE + CP $71 RET NZ ; BAIL OUT IF MISCOMPARE +; + ; RECORD HARDWARE PRESENT LD A,$FF - LD (DSKY_PRESENT),A - RET + LD (PKD_PRESENT),A ; -DSKY_REINIT: - CALL DSKY_PPIIDLE - ; SET CLOCK SCALER TO 20 - LD A,DSKY_CMD_CLK | DSKY_PRESCL - CALL DSKY_CMD - ; FALL THRU -; -DSKY_RESET: - ; RESET DSKY -- CLEAR RAM AND FIFO - LD A,DSKY_CMD_CLR - CALL DSKY_CMD -; - ; 8259 TAKES ~160US TO CLEAR RAM DURING WHICH TIME WRITES TO - ; DISPLAY RAM ARE INHIBITED. HIGH BIT OF STATUS BYTE IS SET - ; DURING THIS WINDOW. TO PREVENT A DEADLOCK, A LOOP COUNTER - ; IS USED TO IMPLEMENT A TIMEOUT. - LD B,0 ; TIMEOUT LOOP COUNTER -DSKY_RESET1: - PUSH BC ; SAVE COUNTER - CALL DSKY_ST ; GET STATUS BYTE - POP BC ; RECOVER COUNTER - BIT 7,A ; BIT 7 IS DISPLAY RAM BUSY - JR Z,DSKY_RESET2 ; MOVE ON IF DONE - DJNZ DSKY_RESET1 ; LOOP TILL TIMEOUT + ; REGISTER DRIVER WITH HBIOS + LD BC,PKD_DISPATCH + CALL DSKY_SETDISP ; -DSKY_RESET2: RET ; -;__DSKY_INIT_________________________________________________________________________________________ +PKD_REINIT: + CALL PKD_PPIIDLE + ; SET CLOCK SCALER TO 20 + LD A,PKD_CMD_CLK | PKD_PRESCL + CALL PKD_CMD + JP PKD_RESET +; +;__PKD_INIT__________________________________________________________________________________________ ; ; DISPLAY DSKY INFO ;____________________________________________________________________________________________________ ; -#IFDEF HBIOS -; -DSKY_INIT: +PKD_INIT: CALL NEWLINE ; FORMATTING - PRTS("DSKY:$") ; FORMATTING + PRTS("PKD:$") ; FORMATTING ; PRTS(" IO=0x$") ; FORMATTING - LD A,DSKYPPIBASE ; GET BASE PORT + LD A,PKDPPIBASE ; GET BASE PORT CALL PRTHEXBYTE ; PRINT BASE PORT - PRTS(" MODE=$") ; FORMATTING - PRTS("NG$") ; PRINT DSKY TYPE ; - LD A,(DSKY_PRESENT) ; PRESENT? + LD A,(PKD_PRESENT) ; PRESENT? OR A ; SET FLAGS RET NZ ; YES, ALL DONE PRTS(" NOT PRESENT$") ; NOT PRESENT RET ; DONE ; -#ENDIF -; -;__DSKY_PPIDETECT____________________________________________________________________________________ -; -; PROBE FOR PPI HARDWARE -;____________________________________________________________________________________________________ -; -DSKY_PPIDETECT: +; DSKY DEVICE FUNCTION DISPATCH ENTRY +; A: RESULT (OUT), 0=OK, Z=OK, NZ=ERR +; B: FUNCTION (IN) +; +PKD_DISPATCH: + LD A,B ; GET REQUESTED FUNCTION + AND $0F ; ISOLATE SUB-FUNCTION + JP Z,PKD_RESET ; RESET DSKY HARDWARE + DEC A + JP Z,PKD_STAT ; GET KEYPAD STATUS + DEC A + JP Z,PKD_GETKEY ; READ A KEY FROM THE KEYPAD + DEC A + JP Z,PKD_SHOWHEX ; DISPLAY A 32-BIT BINARY VALUE IN HEX + DEC A + JP Z,PKD_SHOWSEG ; DISPLAY SEGMENTS + DEC A + JP Z,PKD_KEYLEDS ; SET KEYPAD LEDS + DEC A + JP Z,PKD_STATLED ; SET STATUS LED + DEC A + JP Z,PKD_BEEP ; BEEP DSKY SPEAKER + DEC A + JP Z,PKD_DEVICE ; DEVICE INFO + SYSCHKERR(ERR_NOFUNC) + RET ; - ; TEST FOR PPI EXISTENCE - ; WE SETUP THE PPI TO WRITE, THEN WRITE A VALUE OF ZERO - ; TO PORT A (DATALO), THEN READ IT BACK. IF THE PPI IS THERE - ; THEN THE BUS HOLD CIRCUITRY WILL READ BACK THE ZERO. SINCE - ; WE ARE IN WRITE MODE, AN IDE CONTROLLER WILL NOT BE ABLE TO - ; INTERFERE WITH THE VALUE BEING READ. - CALL DSKY_PPIWR +; RESET DSKY -- CLEAR RAM AND FIFO ; - LD C,PPIA ; PPI PORT A - XOR A ; VALUE ZERO - OUT (C),A ; PUSH VALUE TO PORT - IN A,(C) ; GET PORT VALUE - OR A ; SET FLAGS - RET ; AND RETURN +PKD_RESET: + LD A,PKD_CMD_CLR + CALL PKD_CMD +; + ; 8259 TAKES ~160US TO CLEAR RAM DURING WHICH TIME WRITES TO + ; DISPLAY RAM ARE INHIBITED. HIGH BIT OF STATUS BYTE IS SET + ; DURING THIS WINDOW. TO PREVENT A DEADLOCK, A LOOP COUNTER + ; IS USED TO IMPLEMENT A TIMEOUT. + LD B,0 ; TIMEOUT LOOP COUNTER +PKD_RESET1: + PUSH BC ; SAVE COUNTER + CALL PKD_ST ; GET STATUS BYTE + POP BC ; RECOVER COUNTER + BIT 7,A ; BIT 7 IS DISPLAY RAM BUSY + JR Z,PKD_RESET2 ; MOVE ON IF DONE + DJNZ PKD_RESET1 ; LOOP TILL TIMEOUT ; -#IFDEF DSKY_KBD -; -KY_0 .EQU $00 -KY_1 .EQU $01 -KY_2 .EQU $02 -KY_3 .EQU $03 -KY_4 .EQU $04 -KY_5 .EQU $05 -KY_6 .EQU $06 -KY_7 .EQU $07 -KY_8 .EQU $08 -KY_9 .EQU $09 -KY_A .EQU $0A -KY_B .EQU $0B -KY_C .EQU $0C -KY_D .EQU $0D -KY_E .EQU $0E -KY_F .EQU $0F -KY_FW .EQU $10 ; FORWARD -KY_BK .EQU $11 ; BACKWARD -KY_CL .EQU $12 ; CLEAR -KY_EN .EQU $13 ; ENTER -KY_DE .EQU $14 ; DEPOSIT -KY_EX .EQU $15 ; EXAMINE -KY_GO .EQU $16 ; GO -KY_BO .EQU $17 ; BOOT -KY_F4 .EQU $18 ; F4 -KY_F3 .EQU $19 ; F3 -KY_F2 .EQU $20 ; F2 -KY_F1 .EQU $21 ; F1 -; -;__DSKY_STAT_________________________________________________________________________________________ +PKD_RESET2: + RET ; ; CHECK FOR KEY PRESS, SAVE RAW VALUE, RETURN STATUS -;____________________________________________________________________________________________________ ; -DSKY_STAT: - LD A,(DSKY_PRESENT) ; DOES IT EXIST? +PKD_STAT: + LD A,(PKD_PRESENT) ; DOES IT EXIST? OR A ; SET FLAGS RET Z ; ABORT WITH A=0 IF NOT THERE - CALL DSKY_ST + CALL PKD_ST AND $0F ; ISOLATE THE CUR FIFO LEN RET ; -;__DSKY_GETKEY_____________________________________________________________________________________ -; ; WAIT FOR A DSKY KEYPRESS AND RETURN -;____________________________________________________________________________________________________ ; -DSKY_GETKEY: - LD A,(DSKY_PRESENT) ; DOES IT EXIST? +PKD_GETKEY: + LD A,(PKD_PRESENT) ; DOES IT EXIST? OR A ; SET FLAGS - JR Z,DSKY_GETKEY1A ; ABORT IF NOT PRESENT - CALL DSKY_STAT - JR Z,DSKY_GETKEY ; LOOP IF NOTHING THERE - LD A,DSKY_CMD_FIFO - CALL DSKY_CMD - CALL DSKY_DIN + JR Z,PKD_GETKEY1A ; ABORT IF NOT PRESENT + CALL PKD_STAT + JR Z,PKD_GETKEY ; LOOP IF NOTHING THERE + LD A,PKD_CMD_FIFO + CALL PKD_CMD + CALL PKD_DIN XOR %11000000 ; FLIP POLARITY OF SHIFT/CTL BITS PUSH AF ; SAVE VALUE AND $3F ; STRIP SHIFT/CTL BITS FOR LOOKUP LD B,28 ; SIZE OF DECODE TABLE LD C,0 ; INDEX - LD HL,DSKY_KEYMAP ; POINT TO BEGINNING OF TABLE -DSKY_GETKEY1: + LD HL,PKD_KEYMAP ; POINT TO BEGINNING OF TABLE +PKD_GETKEY1: CP (HL) ; MATCH? - JR Z,DSKY_GETKEY2 ; FOUND, DONE + JR Z,PKD_GETKEY2 ; FOUND, DONE INC HL INC C ; BUMP INDEX - DJNZ DSKY_GETKEY1 ; LOOP UNTIL EOT + DJNZ PKD_GETKEY1 ; LOOP UNTIL EOT POP AF ; FIX STACK -DSKY_GETKEY1A: +PKD_GETKEY1A: LD A,$FF ; NOT FOUND ERR, RETURN $FF RET -DSKY_GETKEY2: +PKD_GETKEY2: ; RETURN THE INDEX POSITION WHERE THE SCAN CODE WAS FOUND ; THE ORIGINAL SHIFT/CTRL BITS ARE RESTORED POP AF ; RESTORE RAW VALUE AND %11000000 ; ISOLATE SHIFT/CTRL BITS OR C ; COMBINE WITH INDEX VALUE + LD E,A ; PUT IN E FOR RETURN + XOR A ; SIGNAL SUCCESS + RET +; +; DISPLAY HEX VALUE FROM DE:HL +; +PKD_SHOWHEX: + LD BC,DSKY_HEXBUF ; POINT TO HEX BUFFER + CALL ST32 ; STORE 32-BIT BINARY THERE + LD HL,DSKY_HEXBUF ; FROM: BINARY VALUE (HL) + LD DE,DSKY_BUF ; TO: SEGMENT BUFFER (DE) + CALL DSKY_BIN2SEG ; CONVERT + LD HL,DSKY_BUF ; POINT TO SEGMENT BUFFER + ; AND FALL THRU TO DISPLAY IT +; +; +; +PKD_SHOWSEG: + LD C,0 ; STARTING DISPLAY POSITION + LD B,DSKY_BUFLEN ; NUMBER OF CHARS + CALL PKD_PUTSTR ; DO IT + XOR A ; SIGNAL SUCCESS + RET +; +; +; +PKD_KEYLEDS: + CALL PKD_PUTLED ; DO IT + XOR A ; SIGNAL SUCCESS + RET +; +; +; +PKD_STATLED: + LD A,$0D ; PORT FOR FIRST LED + ADD A,D ; ADD LED NUM + LD C,A ; PUT IN C + LD A,E ; LED STATE INDICATOR + OR A ; SET FLAGS + JR NZ,PKD_STATLED1 ; HANDLE "ON" +; + ; TURN LED OFF + PUSH BC ; SAVE LED NUM + CALL PKD_GETBYTE ; GET CUR VALUE + AND ~$20 ; BIT 5 OFF + JR PKD_STATLED2 ; FINISH UP +; +PKD_STATLED1: + ; TURN LED ON + PUSH BC ; SAVE LED NUM + CALL PKD_GETBYTE ; GET CUR VALUE + OR $20 ; BIT 5 ON +; +PKD_STATLED2: + POP BC ; RECOVER LED NUM + CALL PKD_PUTBYTE ; PUT NEW VALUE + XOR A ; SIGNAL SUCCESS + RET +; +; BEEP THE SPEAKER ON THE PKD +; +PKD_BEEP: + PUSH BC + LD C,$0F + CALL PKD_GETBYTE + OR $20 + LD C,$0F + CALL PKD_PUTBYTE +; + ; TIMER + PUSH HL + LD hl,$8FFF +PKD_BEEP1: + DEC HL + LD A,H + CP 0 + JR NZ,PKD_BEEP1 + POP HL + LD C,$0F + CALL PKD_GETBYTE + AND $DF + LD C,$0F + CALL PKD_PUTBYTE + POP BC + XOR A ; SIGNAL SUCCESS + RET +; +; DEVICE INFORMATION +; +PKD_DEVICE: + LD D,DSKYDEV_PKD ; D := DEVICE TYPE + LD E,0 ; E := PHYSICAL DEVICE NUMBER + LD H,0 ; H := MODE + LD L,PKDPPIBASE ; L := BASE I/O ADDRESS + XOR A ; SIGNAL SUCCESS RET ; +;__PKD_PPIDETECT_____________________________________________________________________________________ +; +; PROBE FOR PPI HARDWARE +;____________________________________________________________________________________________________ +; +PKD_PPIDETECT: +; + ; TEST FOR PPI EXISTENCE + ; WE SETUP THE PPI TO WRITE, THEN WRITE A VALUE OF ZERO + ; TO PORT A (DATALO), THEN READ IT BACK. IF THE PPI IS THERE + ; THEN THE BUS HOLD CIRCUITRY WILL READ BACK THE ZERO. SINCE + ; WE ARE IN WRITE MODE, AN IDE CONTROLLER WILL NOT BE ABLE TO + ; INTERFERE WITH THE VALUE BEING READ. + CALL PKD_PPIWR +; + LD C,PKD_PPIA ; PPI PORT A + XOR A ; VALUE ZERO + OUT (C),A ; PUSH VALUE TO PORT + IN A,(C) ; GET PORT VALUE + OR A ; SET FLAGS + RET ; AND RETURN +; ;_KEYMAP_TABLE_____________________________________________________________________________________________________________ ; -DSKY_KEYMAP: +PKD_KEYMAP: ; POS $00 $01 $02 $03 $04 $05 $06 $07 ; KEY [0] [1] [2] [3] [4] [5] [6] [7] .DB $0D, $04, $0C, $14, $03, $0B, $13, $02 @@ -280,93 +372,40 @@ DSKY_KEYMAP: ; KEY [FW] [BK] [CL] [EN] [DE] [EX] [GO] [BO] .DB $05, $15, $1D, $1C, $1B, $1A, $19, $18 - ; POS $18 $19 $20 $21 + ; POS $18 $19 $1A $1B ; KEY [F4] [F3] [F2] [F1] .DB $23, $22, $21, $20 - -; -#ENDIF ; DSKY_KBD -; -;================================================================================================== -; CONVERT 32 BIT BINARY TO 8 BYTE HEX SEGMENT DISPLAY -;================================================================================================== -; -; HL: ADR OF 32 BIT BINARY -; DE: ADR OF DEST LED SEGMENT DISPLAY BUFFER (8 BYTES) -; -DSKY_BIN2SEG: - PUSH HL - PUSH DE - LD B,4 ; 4 BYTES OF INPUT - EX DE,HL -DSKY_BIN2SEG1: - LD A,(DE) ; FIRST NIBBLE - SRL A - SRL A - SRL A - SRL A - PUSH HL - LD HL,DSKY_HEXMAP - CALL DSKY_ADDHLA - LD A,(HL) - POP HL - LD (HL),A - INC HL - LD A,(DE) ; SECOND NIBBLE - AND 0FH - PUSH HL - LD HL,DSKY_HEXMAP - CALL DSKY_ADDHLA - LD A,(HL) - POP HL - LD (HL),A - INC HL - INC DE ; NEXT BYTE - DJNZ DSKY_BIN2SEG1 - POP DE - POP HL - RET -; -;================================================================================================== -; DSKY SHOW BUFFER -; HL: ADDRESS OF BUFFER -;================================================================================================== -; -DSKY_SHOW: - LD C,0 ; STARTING DISPLAY POSITION - LD B,DSKY_BUFLEN ; NUMBER OF CHARS - JP DSKY_PUTSTR ; ;================================================================================================== -; DSKYNG OUTPUT ROUTINES +; PKD OUTPUT ROUTINES ;================================================================================================== ; ; SEND DSKY COMMAND BYTE IN REGISTER A ; TRASHES BC ; -DSKY_CMD: +PKD_CMD: LD B,$01 - JR DSKY_DOUT2 + JR PKD_DOUT2 ; ; SEND DSKY DATA BYTE IN REGISTER A ; TRASHES BC ; -DSKY_DOUT: +PKD_DOUT: LD B,$00 ; -DSKY_DOUT2: +PKD_DOUT2: ; ; SAVE INCOMING DATA BYTE PUSH AF ; ; SET PPI LINE CONFIG TO WRITE MODE - CALL DSKY_PPIWR + CALL PKD_PPIWR ; ; SETUP - LD C,PPIC + LD C,PKD_PPIC ; ; SET ADDRESS FIRST - LD A,DSKY_PPI_IDLE + LD A,PKD_PPI_IDLE OR B OUT (C),A ; @@ -380,7 +419,7 @@ DSKY_DOUT2: ; ; ASSERT DATA BYTE VALUE POP AF - OUT (PPIA),A + OUT (PKD_PPIA),A ; ; PULSE /WR RES 1,B @@ -399,35 +438,35 @@ DSKY_DOUT2: OUT (C),B ; ; DONE - CALL DSKY_PPIIDLE + CALL PKD_PPIIDLE RET ; ;================================================================================================== -; DSKYNG OUTPUT ROUTINES +; PKD INPUT ROUTINES ;================================================================================================== ; ; RETURN DSKY STATUS VALUE IN A ; TRASHES BC ; -DSKY_ST: +PKD_ST: LD B,$01 - JR DSKY_DIN2 + JR PKD_DIN2 ; ; RETURN NEXT DATA VALUE IN A ; TRASHES BC ; -DSKY_DIN: +PKD_DIN: LD B,$00 ; -DSKY_DIN2: +PKD_DIN2: ; SET PPI LINE CONFIG TO READ MODE - CALL DSKY_PPIRD + CALL PKD_PPIRD ; ; SETUP - LD C,PPIC + LD C,PKD_PPIC ; ; SET ADDRESS FIRST - LD A,DSKY_PPI_IDLE + LD A,PKD_PPI_IDLE OR B OUT (C),A ; @@ -444,7 +483,7 @@ DSKY_DIN2: OUT (C),B ; ; GET VALUE - IN A,(PPIA) + IN A,(PKD_PPIA) ; ; DEASSERT /RD SET 2,B @@ -460,51 +499,51 @@ DSKY_DIN2: OUT (C),B ; ; DONE - CALL DSKY_PPIIDLE + CALL PKD_PPIIDLE RET ; ;================================================================================================== -; DSKYNG UTILITY ROUTINES +; PKD UTILITY ROUTINES ;================================================================================================== ; -; BLANK DSKYNG DISPLAY (WITHOUT USING CLEAR) +; BLANK PKD DISPLAY (WITHOUT USING CLEAR) ; -DSKY_BLANK: - LD A,DSKY_CMD_WDSP - CALL DSKY_CMD +PKD_BLANK: + LD A,PKD_CMD_WDSP + CALL PKD_CMD LD B,16 -DSKY_BLANK1: +PKD_BLANK1: PUSH BC LD A,$FF - CALL DSKY_DOUT + CALL PKD_DOUT POP BC - DJNZ DSKY_BLANK1 + DJNZ PKD_BLANK1 RET ; ; WRITE A RAW BYTE VALUE TO DSKY DISPLAY RAM ; AT LOCATION IN REGISTER C, VALUE IN A. ; -DSKY_PUTBYTE: +PKD_PUTBYTE: PUSH BC PUSH AF LD A,C - ADD A,DSKY_CMD_WDSP - CALL DSKY_CMD + ADD A,PKD_CMD_WDSP + CALL PKD_CMD POP AF XOR $FF - CALL DSKY_DOUT + CALL PKD_DOUT POP BC RET ; ; READ A RAW BYTE VALUE FROM DSKY DISPLAY RAM ; AT LOCATION IN REGISTER C, VALUE RETURNED IN A ; -DSKY_GETBYTE: +PKD_GETBYTE: PUSH BC LD A,C - ADD A,DSKY_CMD_RDSP - CALL DSKY_CMD - CALL DSKY_DIN + ADD A,PKD_CMD_RDSP + CALL PKD_CMD + CALL PKD_DIN XOR $FF POP BC RET @@ -512,191 +551,89 @@ DSKY_GETBYTE: ; WRITE A STRING OF RAW BYTE VALUES TO DSKY DISPLAY RAM ; AT LOCATION IN REGISTER C, LENGTH IN B, ADDRESS IN HL. ; -DSKY_PUTSTR: +PKD_PUTSTR: PUSH BC LD A,C - ADD A,DSKY_CMD_WDSP - CALL DSKY_CMD + ADD A,PKD_CMD_WDSP + CALL PKD_CMD POP BC ; -DSKY_PUTSTR1: +PKD_PUTSTR1: LD A,(HL) XOR $FF INC HL PUSH BC - CALL DSKY_DOUT + CALL PKD_DOUT POP BC - DJNZ DSKY_PUTSTR1 + DJNZ PKD_PUTSTR1 RET ; ; READ A STRING OF RAW BYTE VALUES FROM DSKY DISPLAY RAM ; AT LOCATION IN REGISTER C, LENGTH IN B, ADDRESS IN HL. ; -DSKY_GETSTR: +PKD_GETSTR: PUSH BC LD A,C - ADD A,DSKY_CMD_RDSP - CALL DSKY_CMD + ADD A,PKD_CMD_RDSP + CALL PKD_CMD POP BC ; -DSKY_GETSTR1: +PKD_GETSTR1: PUSH BC - CALL DSKY_DIN + CALL PKD_DIN POP BC XOR $FF LD (HL),A INC HL - DJNZ DSKY_GETSTR1 + DJNZ PKD_GETSTR1 RET ; -; This function is intended to update the LEDs. It expects 8 bytes -; following the call, and updates the entire matrix. -; -; EXAMPLE: -; CALL DSKY_PUTLED -; .DB $00,$00,$00,$00,$00,$00,$00,$00 +; UPDATE THE KEYPAD KEY LEDS. HL POINTS TO AN 8 BYTE BITMAP BUFFER +; THAT DEFINES ALL KEYPAD LED VALUES. THE ENTIRE MATRIX IS UPDATED. ; -DSKY_PUTLED: - EX (SP),HL +PKD_PUTLED: PUSH AF PUSH BC LD C,8 -DSKY_PUTLED_1: +PKD_PUTLED_1: LD A,(HL) PUSH BC - CALL DSKY_PUTBYTE + CALL PKD_PUTBYTE POP BC INC C INC HL LD A,C CP $10 - JP NZ,DSKY_PUTLED_1 - POP BC - POP AF - EX (SP),HL - RET -; -; This function is intended to beep the speaker on the DSKY -; -DSKY_BEEP: - PUSH AF - PUSH BC - - LD C,$0F - CALL DSKY_GETBYTE - OR $20 - LD C,$0F - CALL DSKY_PUTBYTE - -;;; timer . . . - PUSH HL - LD hl,$8FFF -DSKY_BEEP1: - DEC HL - LD A,H - CP 0 - JP NZ,DSKY_BEEP1 - POP HL - - LD C,$0F - CALL DSKY_GETBYTE - AND $DF - LD C,$0F - CALL DSKY_PUTBYTE - - POP BC - POP AF - RET -; -; This function is intended to turn on DSKY L1 -; -DSKY_L1ON: - PUSH AF - PUSH BC - - LD C,$0D - CALL DSKY_GETBYTE - OR $20 - LD C,$0D - CALL DSKY_PUTBYTE - - POP BC - POP AF - RET -; -; This function is intended to turn on DSKY L2 -; -DSKY_L2ON: - PUSH AF - PUSH BC - - LD C,$0E - CALL DSKY_GETBYTE - OR $20 - LD C,$0E - CALL DSKY_PUTBYTE - - POP BC - POP AF - RET -; -; This function is intended to turn off DSKY L1 -; -DSKY_L1OFF: - PUSH AF - PUSH BC - - LD C,$0D - CALL DSKY_GETBYTE - AND $DF - LD C,$0D - CALL DSKY_PUTBYTE - - POP BC - POP AF - RET -; -; This function is intended to turn off DSKY L2 -; -DSKY_L2OFF: - PUSH AF - PUSH BC - - LD C,$0E - CALL DSKY_GETBYTE - AND $DF - LD C,$0E - CALL DSKY_PUTBYTE - + JP NZ,PKD_PUTLED_1 POP BC POP AF RET ; ;================================================================================================== -; DSKYNG LINE CONTROL ROUTINES +; PKD LINE CONTROL ROUTINES ;================================================================================================== ; ; SETUP PPI FOR WRITING: PUT PPI PORT A IN OUTPUT MODE ; AVOID REWRTING PPIX IF ALREADY IN OUTPUT MODE ; -DSKY_PPIWR: +PKD_PPIWR: PUSH AF ; ; CHECK FOR WRITE MODE - LD A,(DSKY_PPIX_VAL) - CP DSKY_PPIX_WR - JR Z,DSKY_PPIWR1 + LD A,(PKD_PPIX_VAL) + CP PKD_PPIX_WR + JR Z,PKD_PPIWR1 ; ; SET PPI TO WRITE MODE - LD A,DSKY_PPIX_WR - OUT (PPIX),A - LD (DSKY_PPIX_VAL),A + LD A,PKD_PPIX_WR + OUT (PKD_PPIX),A + LD (PKD_PPIX_VAL),A ; ; RESTORE PORT C (MAY NOT BE NEEDED) - LD A,DSKY_PPI_IDLE - OUT (PPIC),A + LD A,PKD_PPI_IDLE + OUT (PKD_PPIC),A ; -DSKY_PPIWR1: +PKD_PPIWR1: ; POP AF RET @@ -704,71 +641,36 @@ DSKY_PPIWR1: ; SETUP PPI FOR READING: PUT PPI PORT A IN INPUT MODE ; AVOID REWRTING PPIX IF ALREADY IN INPUT MODE ; -DSKY_PPIRD: +PKD_PPIRD: PUSH AF ; ; CHECK FOR READ MODE - LD A,(DSKY_PPIX_VAL) - CP DSKY_PPIX_RD - JR Z,DSKY_PPIRD1 + LD A,(PKD_PPIX_VAL) + CP PKD_PPIX_RD + JR Z,PKD_PPIRD1 ; ; SET PPI TO READ MODE - LD A,DSKY_PPIX_RD - OUT (PPIX),A - LD (DSKY_PPIX_VAL),A + LD A,PKD_PPIX_RD + OUT (PKD_PPIX),A + LD (PKD_PPIX_VAL),A ; -DSKY_PPIRD1: +PKD_PPIRD1: POP AF RET ; ; RELEASE USE OF PPI ; -DSKY_PPIIDLE: - JR DSKY_PPIRD ; SAME AS READ MODE +PKD_PPIIDLE: + JR PKD_PPIRD ; SAME AS READ MODE ; ;================================================================================================== ; UTILTITY FUNCTIONS ;================================================================================================== ; -DSKY_ADDHLA: - ADD A,L - LD L,A - RET NC - INC H - RET ; ;================================================================================================== ; STORAGE ;================================================================================================== ; -; CODES FOR NUMERICS -; HIGH BIT ALWAYS CLEAR TO SUPPRESS DECIMAL POINT -; SET HIGH BIT TO SHOW DECIMAL POINT -; -DSKY_HEXMAP: - .DB $3F ; 0 - .DB $06 ; 1 - .DB $5B ; 2 - .DB $4F ; 3 - .DB $66 ; 4 - .DB $6D ; 5 - .DB $7D ; 6 - .DB $07 ; 7 - .DB $7F ; 8 - .DB $67 ; 9 - .DB $77 ; A - .DB $7C ; B - .DB $39 ; C - .DB $5E ; D - .DB $79 ; E - .DB $71 ; F -; -DSKY_PPIX_VAL: .DB 0 -DSKY_PRESENT: .DB 0 -; -; SEG DISPLAY WORKING STORAGE -; -DSKY_BUF .FILL 8,0 -DSKY_BUFLEN .EQU $ - DSKY_BUF -DSKY_HEXBUF .FILL 4,0 -DSKY_HEXBUFLEN .EQU $ - DSKY_HEXBUF +PKD_PPIX_VAL .DB 0 ; PPIX SHADOW REG +PKD_PRESENT .DB 0 ; HARDWARE PRESENT FLAG diff --git a/Source/HBIOS/ppa.asm b/Source/HBIOS/ppa.asm new file mode 100644 index 00000000..e13493d8 --- /dev/null +++ b/Source/HBIOS/ppa.asm @@ -0,0 +1,1427 @@ +; +;============================================================================= +; PPA DISK DRIVER +;============================================================================= +; +; PARALLEL PORT INTERFACE FOR SCSI DISK DEVICES USING A PARALLEL PORT +; ADAPTER. PRIMARILY TARGETS PARALLEL PORT IOMEGA ZIP DRIVES. +; +; INTENDED TO CO-EXIST WITH LPT DRIVER. +; +; CREATED BY WAYNE WARTHEN FOR ROMWBW HBIOS. +; MUCH OF THE CODE IS DERIVED FROM LINUX AND FUZIX (ALAN COX). +; - https://github.com/EtchedPixels/FUZIX +; - https://github.com/torvalds/linux +; +; 05/23/2023 WBW - INITIAL RELEASE +; 05/26/3023 WBW - CLEAN UP, LED ACTIVITY +; 05/27/2023 WBW - ADDED SPP MODE +; 06/06/2023 WBW - OPTIMIZE BLOCK READ AND WRITE +; +;============================================================================= +; +; IBM PC STANDARD PARALLEL PORT (SPP): +; - NHYODYNE PRINT MODULE +; +; PORT 0 (OUTPUT): +; +; D7 D6 D5 D4 D3 D2 D1 D0 +; +-------+-------+-------+-------+-------+-------+-------+-------+ +; | PD7 | PD6 | PD5 | PD4 | PD3 | PD2 | PD1 | PD0 | +; +-------+-------+-------+-------+-------+-------+-------+-------+ +; +; PORT 1 (INPUT): +; +; D7 D6 D5 D4 D3 D2 D1 D0 +; +-------+-------+-------+-------+-------+-------+-------+-------+ +; | /BUSY | /ACK | POUT | SEL | /ERR | 0 | 0 | 0 | +; +-------+-------+-------+-------+-------+-------+-------+-------+ +; +; PORT 2 (OUTPUT): +; +; D7 D6 D5 D4 D3 D2 D1 D0 +; +-------+-------+-------+-------+-------+-------+-------+-------+ +; | STAT1 | STAT0 | ENBL | PINT | SEL | RES | LF | STB | +; +-------+-------+-------+-------+-------+-------+-------+-------+ +; +;============================================================================= +; +; MG014 STYLE INTERFACE: +; - RCBUS MG014 MODULE +; +; PORT 0 (OUTPUT): +; +; D7 D6 D5 D4 D3 D2 D1 D0 +; +-------+-------+-------+-------+-------+-------+-------+-------+ +; | PD7 | PD6 | PD5 | PD4 | PD3 | PD2 | PD1 | PD0 | +; +-------+-------+-------+-------+-------+-------+-------+-------+ +; +; PORT 1 (INPUT): +; +; D7 D6 D5 D4 D3 D2 D1 D0 +; +-------+-------+-------+-------+-------+-------+-------+-------+ +; | | | | /ERR | SEL | POUT | BUSY | /ACK | +; +-------+-------+-------+-------+-------+-------+-------+-------+ +; +; PORT 2 (OUTPUT): +; +; D7 D6 D5 D4 D3 D2 D1 D0 +; +-------+-------+-------+-------+-------+-------+-------+-------+ +; | LED | | | | /SEL | /RES | /LF | /STB | +; +-------+-------+-------+-------+-------+-------+-------+-------+ +; +;============================================================================= +; +; TODO: +; +; NOTES: +; +; - THIS DRIVER IS FOR THE ZIP DRIVE PPA INTERFACE. IT WILL SIMPLY +; FAIL TO EVEN RECOGNIZE A ZIP DRIVE WITH THE NEWER IMM INTERFACE. +; THERE DOES NOT SEEM TO BE A WAY TO VISUALLY DETERMINE IF A ZIP +; DRIVE IS PPA OR IMM. SIGH. +; +; - THIS DRIVER OPERATES USES NIBBLE READ MODE. ALTHOUGH THE 8255 +; (MG014) CAN READ OR WRITE TO PORT A (DATA), IT "GLITCHES" WHEN +; THE MODE IS CHANGED CAUSING THE CONTROL LINES TO CHANGE AND +; BREAKS THE PROTOCOL. I SUSPECT THE MBC SPP CAN SUPPORT FULL BYTE +; MODE, (PS2 STYLE), BUT I HAVE NOT ATTEMPTED IT. +; +; - RELATIVE TO ABOVE, THIS BEAST IS SLOW. IN ADDITION TO THE +; NIBBLE MODE READS, THE MG014 ASSIGNS SIGNALS DIFFERENTLY THAN +; THE STANDARD IBM PARALLEL PORT WHICH NECESSITATES A BUNCH OF EXTRA +; BIT FIDDLING ON EVERY READ. +; +; - SOME OF THE DATA TRANSFERS HAVE NO BUFFER OVERRUN CHECKS. IT IS +; ASSUMED SCSI DEVICES WILL SEND/REQUEST THE EXPECTED NUMBER OF BYTES. +; +; PPA PORT OFFSETS +; +PPA_IODATA .EQU 0 ; PORT A, DATA, OUT +PPA_IOSTAT .EQU 1 ; PORT B, STATUS, IN +PPA_IOCTRL .EQU 2 ; PORT C, CTRL, OUT +PPA_IOSETUP .EQU 3 ; PPI SETUP +; +; SCSI UNIT IDS +; +PPA_SELF .EQU 7 +PPA_TGT .EQU 6 +; +; PPA DEVICE STATUS +; +PPA_STOK .EQU 0 +PPA_STNOMEDIA .EQU -1 +PPA_STCMDERR .EQU -2 +PPA_STIOERR .EQU -3 +PPA_STTO .EQU -4 +PPA_STNOTSUP .EQU -5 +; +; PPA DEVICE CONFIGURATION +; +PPA_CFGSIZ .EQU 12 ; SIZE OF CFG TBL ENTRIES +; +; PER DEVICE DATA OFFSETS IN CONFIG TABLE ENTRIES +; +PPA_DEV .EQU 0 ; OFFSET OF DEVICE NUMBER (BYTE) +PPA_MODE .EQU 1 ; OPERATION MODE: PPA MODE (BYTE) +PPA_STAT .EQU 2 ; LAST STATUS (BYTE) +PPA_IOBASE .EQU 3 ; IO BASE ADDRESS (BYTE) +PPA_MEDCAP .EQU 4 ; MEDIA CAPACITY (DWORD) +PPA_LBA .EQU 8 ; OFFSET OF LBA (DWORD) +; +; MACROS +; +#DEFINE PPA_WCTL(VAL) LD A,VAL \ CALL PPA_WRITECTRL +#DEFINE PPA_WDATA(VAL) LD A,VAL \ CALL PPA_WRITEDATA +; +#DEFINE PPA_DPUL(VAL) LD A,VAL \ CALL PPA_DPULSE +#DEFINE PPA_CPUL(VAL) LD A,VAL \ CALL PPA_CPULSE +; +; INCLUDE MG014 NIBBLE MAP FOR MG014 MODE +; +#IF (PPAMODE == IMMMODE_MG014) + #DEFINE MG014_MAP +#ENDIF +; +;============================================================================= +; INITIALIZATION ENTRY POINT +;============================================================================= +; +PPA_INIT: + LD IY,PPA_CFG ; POINT TO START OF CONFIG TABLE +; +PPA_INIT1: + LD A,(IY) ; LOAD FIRST BYTE TO CHECK FOR END + CP $FF ; CHECK FOR END OF TABLE VALUE + JR NZ,PPA_INIT2 ; IF NOT END OF TABLE, CONTINUE + XOR A ; SIGNAL SUCCESS + RET ; AND RETURN +; +PPA_INIT2: + CALL NEWLINE ; FORMATTING + PRTS("PPA:$") ; DRIVER LABEL +; + PRTS(" IO=0x$") ; LABEL FOR IO ADDRESS + LD A,(IY+PPA_IOBASE) ; GET IO BASE ADDRES + CALL PRTHEXBYTE ; DISPLAY IT +; + PRTS(" MODE=$") ; LABEL FOR MODE + LD A,(IY+PPA_MODE) ; GET MODE BITS + + LD HL,PPA_STR_MODE_MAP + ADD A,A + CALL ADDHLA + LD E,(HL) + INC HL + LD D,(HL) + CALL WRITESTR +; + ; CHECK FOR HARDWARE PRESENCE + CALL PPA_DETECT ; PROBE FOR INTERFACE + JR Z,PPA_INIT4 ; IF FOUND, CONTINUE + CALL PC_SPACE ; FORMATTING + LD DE,PPA_STR_NOHW ; NO PPA MESSAGE + CALL WRITESTR ; DISPLAY IT + JR PPA_INIT6 ; SKIP CFG ENTRY +; +PPA_INIT4: + ; UPDATE DRIVER RELATIVE UNIT NUMBER IN CONFIG TABLE + LD A,(PPA_DEVNUM) ; GET NEXT UNIT NUM TO ASSIGN + LD (IY+PPA_DEV),A ; UPDATE IT + INC A ; BUMP TO NEXT UNIT NUM TO ASSIGN + LD (PPA_DEVNUM),A ; SAVE IT +; + ; ADD UNIT TO GLOBAL DISK UNIT TABLE + LD BC,PPA_FNTBL ; BC := FUNC TABLE ADR + PUSH IY ; CFG ENTRY POINTER + POP DE ; COPY TO DE + CALL DIO_ADDENT ; ADD ENTRY TO GLOBAL DISK DEV TABLE +; + CALL PPA_RESET ; RESET/INIT THE INTERFACE +#IF (PPATRACE <= 1) + CALL NZ,PPA_PRTSTAT +#ENDIF + JR NZ,PPA_INIT6 +; + ; START PRINTING DEVICE INFO + CALL PPA_PRTPREFIX ; PRINT DEVICE PREFIX +; +PPA_INIT5: + ; PRINT STORAGE CAPACITY (BLOCK COUNT) + PRTS(" BLOCKS=0x$") ; PRINT FIELD LABEL + LD A,PPA_MEDCAP ; OFFSET TO CAPACITY FIELD + CALL LDHLIYA ; HL := IY + A, REG A TRASHED + CALL LD32 ; GET THE CAPACITY VALUE + CALL PRTHEX32 ; PRINT HEX VALUE +; + ; PRINT STORAGE SIZE IN MB + PRTS(" SIZE=$") ; PRINT FIELD LABEL + LD B,11 ; 11 BIT SHIFT TO CONVERT BLOCKS --> MB + CALL SRL32 ; RIGHT SHIFT + CALL PRTDEC32 ; PRINT DWORD IN DECIMAL + PRTS("MB$") ; PRINT SUFFIX +; +PPA_INIT6: + LD DE,PPA_CFGSIZ ; SIZE OF CFG TABLE ENTRY + ADD IY,DE ; BUMP POINTER + JP PPA_INIT1 ; AND LOOP +; +;---------------------------------------------------------------------- +; PROBE FOR PPA HARDWARE +;---------------------------------------------------------------------- +; +; ON RETURN, ZF SET INDICATES HARDWARE FOUND +; +PPA_DETECT: +#IF (PPATRACE >= 3) + PRTS("\r\nDETECT:$") +#ENDIF +; +#IF (PPAMODE == PPAMODE_MG014) + ; INITIALIZE 8255 + LD A,(IY+PPA_IOBASE) ; BASE PORT + ADD A,PPA_IOSETUP ; BUMP TO SETUP PORT + LD C,A ; MOVE TO C FOR I/O + LD A,$82 ; CONFIG A OUT, B IN, C OUT + OUT (C),A ; DO IT + CALL DELAY ; BRIEF DELAY FOR GOOD MEASURE +#ENDIF +; + PPA_WDATA($AA) + CALL PPA_DISCONNECT + CALL PPA_CONNECT + PPA_WCTL($0E) + CALL PPA_READSTATUS +; +#IF (PPATRACE >= 3) + CALL PC_SPACE + CALL PRTHEXBYTE +#ENDIF +; + AND $08 + CP $08 + JR NZ,PPA_DETECT_FAIL +; + PPA_WCTL($0C) + CALL PPA_READSTATUS +; +#IF (PPATRACE >= 3) + CALL PC_SPACE + CALL PRTHEXBYTE +#ENDIF +; + AND $08 + CP $00 + JR NZ,PPA_DETECT_FAIL +; + CALL PPA_DISCONNECT +; + PPA_WDATA($AA) + PPA_WCTL($0C) +; + XOR A ; SIGNAL SUCCESS + RET ; AND RETURN +; +PPA_DETECT_FAIL: + OR $FF ; SIGNAL FAILURE + RET NZ +; +;============================================================================= +; DRIVER FUNCTION TABLE +;============================================================================= +; +PPA_FNTBL: + .DW PPA_STATUS + .DW PPA_RESET + .DW PPA_SEEK + .DW PPA_READ + .DW PPA_WRITE + .DW PPA_VERIFY + .DW PPA_FORMAT + .DW PPA_DEVICE + .DW PPA_MEDIA + .DW PPA_DEFMED + .DW PPA_CAP + .DW PPA_GEOM +#IF (($ - PPA_FNTBL) != (DIO_FNCNT * 2)) + .ECHO "*** INVALID PPA FUNCTION TABLE ***\n" +#ENDIF +; +PPA_VERIFY: +PPA_FORMAT: +PPA_DEFMED: + SYSCHKERR(ERR_NOTIMPL) ; NOT IMPLEMENTED + RET +; +; +; +PPA_READ: + CALL HB_DSKREAD ; HOOK DISK READ CONTROLLER + LD A,SCSI_CMD_READ ; SETUP SCSI READ + LD (PPA_CMD_RW),A ; AND SAVE IT IN SCSI CMD + JP PPA_IO ; DO THE I/O +; +; +; +PPA_WRITE: + CALL HB_DSKWRITE ; HOOK DISK WRITE CONTROLLER + LD A,SCSI_CMD_WRITE ; SETUP SCSI WRITE + LD (PPA_CMD_RW),A ; AND SAVE IT IN SCSI CMD + JP PPA_IO ; DO THE I/O +; +; +; +PPA_IO: + PUSH HL + CALL PPA_CHKERR ; CHECK FOR ERR STATUS AND RESET IF SO + POP HL + JR NZ,PPA_IO3 ; BAIL OUT ON ERROR +; + LD (PPA_DSKBUF),HL ; SAVE DISK BUFFER ADDRESS +; +#IF (DSKYENABLE) + #IF (DSKYDSKACT) + LD A,PPA_LBA + CALL LDHLIYA + CALL HB_DSKACT ; SHOW ACTIVITY + #ENDIF +#ENDIF +; + ; SETUP LBA + ; 3 BYTES, LITTLE ENDIAN -> BIG ENDIAN + LD HL,PPA_CMD_RW+1 ; START OF LBA FIELD IN CDB (MSB) + LD A,(IY+PPA_LBA+2) ; THIRD BYTE OF LBA FIELD IN CFG (MSB) + LD (HL),A + INC HL + LD A,(IY+PPA_LBA+1) + LD (HL),A + INC HL + LD A,(IY+PPA_LBA+0) + LD (HL),A + INC HL +; + ; DO SCSI IO + LD DE,(PPA_DSKBUF) ; DISK BUFFER TO DE + LD A,1 ; BLOCK I/O, ONE SECTOR + LD HL,PPA_CMD_RW ; POINT TO READ/WRITE CMD TEMPLATE + CALL PPA_RUNCMD ; RUN THE SCSI ENGINE + CALL Z,PPA_CHKCMD ; IF EXIT OK, CHECK SCSI RESULTS + JR NZ,PPA_IO2 ; IF ERROR, SKIP INCREMENT + ; INCREMENT LBA + LD A,PPA_LBA ; LBA OFFSET + CALL LDHLIYA ; HL := IY + A, REG A TRASHED + CALL INC32HL ; INCREMENT THE VALUE + ; INCREMENT DMA + LD HL,PPA_DSKBUF+1 ; POINT TO MSB OF BUFFER ADR + INC (HL) ; BUMP DMA BY + INC (HL) ; ... 512 BYTES + XOR A ; SIGNAL SUCCESS +; +PPA_IO2: +PPA_IO3: + LD HL,(PPA_DSKBUF) ; CURRENT DMA TO HL + OR A ; SET FLAGS BASED ON RETURN CODE + RET Z ; RETURN IF SUCCESS + LD A,ERR_IO ; SIGNAL IO ERROR + OR A ; SET FLAGS + RET ; AND DONE +; +; +; +PPA_STATUS: + ; RETURN UNIT STATUS + LD A,(IY+PPA_STAT) ; GET STATUS OF SELECTED DEVICE + OR A ; SET FLAGS + RET ; AND RETURN +; +; +; +PPA_RESET: + JP PPA_INITDEV ; JUST (RE)INIT DEVICE +; +; +; +PPA_DEVICE: + LD D,DIODEV_PPA ; D := DEVICE TYPE + LD E,(IY+PPA_DEV) ; E := PHYSICAL DEVICE NUMBER + LD C,%01111001 ; C := REMOVABLE HARD DISK + LD H,(IY+PPA_MODE) ; H := MODE + LD L,(IY+PPA_IOBASE) ; L := BASE I/O ADDRESS + XOR A ; SIGNAL SUCCESS + RET +; +; PPA_GETMED +; +PPA_MEDIA: + LD A,E ; GET FLAGS + OR A ; SET FLAGS + JR Z,PPA_MEDIA1 ; JUST REPORT CURRENT STATUS AND MEDIA +; + CALL PPA_RESET ; RESET INCLUDES MEDIA CHECK +; +PPA_MEDIA1: + LD A,(IY+PPA_STAT) ; GET STATUS + OR A ; SET FLAGS + LD D,0 ; NO MEDIA CHANGE DETECTED + LD E,MID_HD ; ASSUME WE ARE OK + RET Z ; RETURN IF GOOD INIT + LD E,MID_NONE ; SIGNAL NO MEDIA + LD A,ERR_NOMEDIA ; NO MEDIA ERROR + OR A ; SET FLAGS + RET ; AND RETURN +; +; +; +PPA_SEEK: + BIT 7,D ; CHECK FOR LBA FLAG + CALL Z,HB_CHS2LBA ; CLEAR MEANS CHS, CONVERT TO LBA + RES 7,D ; CLEAR FLAG REGARDLESS (DOES NO HARM IF ALREADY LBA) + LD (IY+PPA_LBA+0),L ; SAVE NEW LBA + LD (IY+PPA_LBA+1),H ; ... + LD (IY+PPA_LBA+2),E ; ... + LD (IY+PPA_LBA+3),D ; ... + XOR A ; SIGNAL SUCCESS + RET ; AND RETURN +; +; +; +PPA_CAP: + LD A,(IY+PPA_STAT) ; GET STATUS + PUSH AF ; SAVE IT + LD A,PPA_MEDCAP ; OFFSET TO CAPACITY FIELD + CALL LDHLIYA ; HL := IY + A, REG A TRASHED + CALL LD32 ; GET THE CURRENT CAPACITY INTO DE:HL + LD BC,512 ; 512 BYTES PER BLOCK + POP AF ; RECOVER STATUS + OR A ; SET FLAGS + RET +; +; +; +PPA_GEOM: + ; FOR LBA, WE SIMULATE CHS ACCESS USING 16 HEADS AND 16 SECTORS + ; RETURN HS:CC -> DE:HL, SET HIGH BIT OF D TO INDICATE LBA CAPABLE + CALL PPA_CAP ; GET TOTAL BLOCKS IN DE:HL, BLOCK SIZE TO BC + LD L,H ; DIVIDE BY 256 FOR # TRACKS + LD H,E ; ... HIGH BYTE DISCARDED, RESULT IN HL + LD D,16 | $80 ; HEADS / CYL = 16, SET LBA CAPABILITY BIT + LD E,16 ; SECTORS / TRACK = 16 + RET ; DONE, A STILL HAS PPA_CAP STATUS +; +;============================================================================= +; FUNCTION SUPPORT ROUTINES +;============================================================================= +; +; OUTPUT BYTE IN A TO THE DATA PORT +; +PPA_WRITEDATA: + LD C,(IY+PPA_IOBASE) ; DATA PORT IS AT IOBASE + OUT (C),A ; WRITE THE BYTE + ;CALL DELAY ; IS THIS NEEDED??? + RET ; DONE +; +; +; +PPA_WRITECTRL: + ; IBM PC INVERTS ALL BUT C2 ON THE BUS, MG014 DOES NOT. + ; BELOW TRANSLATES FROM IBM -> MG014. IT ALSO INVERTS THE + ; MG014 LED SIMPLY TO MAKE IT EASY TO KEEP LED ON DURING + ; ALL ACTIVITY. +#IF (PPAMODE == PPAMODE_MG014 + XOR $0B | $80 ; HIGH BIT IS MG014 LED +#ENDIF + LD C,(IY+PPA_IOBASE) ; GET BASE IO ADDRESS + INC C ; BUMP TO CONTROL PORT + INC C + OUT (C),A ; WRITE TO CONTROL PORT + ;CALL DELAY ; IS THIS NEEDED? + RET ; DONE +; +; READ THE PARALLEL PORT INPUT LINES (STATUS) AND MAP SIGNALS FROM +; MG014 TO IBM STANDARD. NOTE POLARITY CHANGE REQUIRED FOR BUSY. +; +; MG014 IBM PC +; -------- -------- +; 0: /ACK 6: /ACK +; 1: BUSY 7: /BUSY +; 2: POUT 5: POUT +; 3: SEL 4: SEL +; 4: /ERR 3: /ERR +; +PPA_READSTATUS: + LD C,(IY+PPA_IOBASE) ; IOBASE TO C + INC C ; BUMP TO STATUS PORT + IN A,(C) ; READ IT +; +#IF (PPAMODE == PPAMODE_MG014 +; + ; SHUFFLE BITS ON MG014 + LD C,0 ; INIT RESULT + BIT 0,A ; 0: /ACK + JR Z,PPA_READSTATUS1 + SET 6,C ; 6: /ACK +PPA_READSTATUS1: + BIT 1,A ; 1: BUSY + JR NZ,PPA_READSTATUS2 ; POLARITY CHANGE! + SET 7,C ; 7: /BUSY +PPA_READSTATUS2: + BIT 2,A ; 2: POUT + JR Z,PPA_READSTATUS3 + SET 5,C ; 5: POUT +PPA_READSTATUS3: + BIT 3,A ; 3: SEL + JR Z,PPA_READSTATUS4 + SET 4,C ; 4: SEL +PPA_READSTATUS4: + BIT 4,A ; 4: /ERR + JR Z,PPA_READSTATUS5 + SET 3,C ; 3: /ERR +PPA_READSTATUS5: + LD A,C ; RESULT TO A +; +#ENDIF +; + RET +; +; +; +PPA_DPULSE: + CALL PPA_WRITEDATA + PPA_WCTL($0C) + PPA_WCTL($0E) + PPA_WCTL($0C) + PPA_WCTL($04) + PPA_WCTL($0C) + RET +; +; +; +PPA_CPULSE: + CALL PPA_WRITEDATA + PPA_WCTL($04) + PPA_WCTL($06) + PPA_WCTL($04) + PPA_WCTL($0C) + RET +; +; +; +PPA_CONNECT: + PPA_CPUL($00) + PPA_CPUL($3C) + PPA_CPUL($20) + PPA_CPUL($8F) + RET +; +; +; +PPA_DISCONNECT: + PPA_DPUL($00) + PPA_DPUL($3C) + PPA_DPUL($20) + PPA_DPUL($0F) +; + ; TURNS OFF MG014 LED + PPA_WCTL($8C) +; + RET +; +; INITIATE A SCSI BUS RESET. +; +PPA_RESETPULSE: + PPA_WDATA($40) + PPA_WCTL($08) + CALL DELAY ; 32 US, IDEALLY 30 US + PPA_WCTL($0C) + RET +; +; SCSI SELECT PROCESS +; +PPA_SELECT: +#IF (PPATRACE >= 3) + PRTS("\r\nSELECT: $") +#ENDIF +; +#IF (PPATRACE >= 3) + CALL PPA_READSTATUS + CALL PC_SPACE + CALL PRTHEXBYTE +#ENDIF +; + LD A,1 << PPA_TGT + CALL PPA_WRITEDATA + PPA_WCTL($0E) + PPA_WCTL($0C) + LD A,1 << PPA_SELF + CALL PPA_WRITEDATA + PPA_WCTL($08) +; + LD B,0 ; TIMEOUT COUNTER +PPA_SELECT1: + CALL PPA_READSTATUS +#IF (PPATRACE >= 3) + CALL PC_SPACE + CALL PRTHEXBYTE +#ENDIF + AND $40 + CP $40 + RET Z + DJNZ PPA_SELECT1 + JP PPA_CMD_TIMEOUT +; +; SEND SCSI CMD BYTE STRING. AT ENTRY, HL POINTS TO START OF +; COMMAND BYTES. THE LENGTH OF THE COMMAND STRING MUST PRECEED +; THE COMMAND BYTES (HL - 1). +; +; NOTE THAT DATA IS SENT AS BYTE PAIRS! EACH LOOP SENDS 2 BYTES. +; DATA OUTPOUT IS BURSTED (NO CHECK FOR BUSY). SEEMS TO WORK FINE. +; +PPA_SENDCMD: +; +#IF (PPATRACE >= 3) + PRTS("\r\nSENDCMD:$") +#ENDIF +; + DEC HL ; BACKUP TO LENGTH BYTE + LD B,(HL) ; PUT IN B FOR LOOP COUNTER +; +#IF (PPATRACE >= 3) + LD A,B + CALL PC_SPACE + CALL PRTHEXBYTE + PRTS(" BYTES$") +#ENDIF +; + INC HL ; BACK TO FIRST CMD BYTE +; +PPA_SENDCMD1: + ;PPA_WCTL($0C) + LD A,(HL) ; LOAD CMD BYTE +; +#IF (PPATRACE >= 3) + CALL PC_SPACE + CALL PRTHEXBYTE +#ENDIF +; + CALL PPA_WRITEDATA ; PUT IT ON THE BUS + INC HL ; BUMP TO NEXT BYTE + PPA_WCTL($0E) + PPA_WCTL($0C) + DJNZ PPA_SENDCMD1 ; LOOP TILL DONE +; + RET +; +; +; WAIT FOR SCSI BUS TO BECOME READY WITH A TIMEOUT. +; +PPA_WAITLOOP: + CALL PPA_READSTATUS + BIT 7,A + RET NZ ; DONE, STATUS IN A + DEC HL + LD A,H + OR L + RET Z ; TIMEOUT + JR PPA_WAITLOOP +; +PPA_WAIT: + LD HL,500 ; GOOD VALUE??? + PPA_WCTL($0C) + CALL PPA_WAITLOOP + JP Z,PPA_CMD_TIMEOUT ; HANDLE TIMEOUT + ;PUSH AF + ;IMM_WCTL($04) + ;POP AF + AND $F0 + RET ; RETURN W/ RESULT IN A +; +; MAX OBSERVED WAITLOOP ITERATIONS IS $0116B3 @ 7.372 MHZ ON MG014 +; MAX OBSERVED WAITLOOP ITERATIONS IS $028EFE @ 8.000 MHZ ON MBC SPP +; +PPA_LONGWAIT: + LD A,(CB_CPUMHZ) ; LOAD CPU SPEED IN MHZ + SRL A ; DIVIDE BY 2, GOOD ENOUGH + LD B,A ; USE FOR OUTER LOOP COUNT + PPA_WCTL($0C) +PPA_LONGWAIT1: + LD HL,0 + CALL PPA_WAITLOOP + JR NZ,PPA_LONGWAIT2 ; HANDLE SUCCESS + DJNZ PPA_LONGWAIT1 ; LOOP TILL COUNTER EXHAUSTED + JP PPA_CMD_TIMEOUT ; HANDLE TIMEOUT +; +PPA_LONGWAIT2: + ;PUSH AF + ;PPA_WCTL($04) +; +#IF 0 + PUSH AF + CALL PC_GT + LD A,B + CALL PRTHEXBYTE + CALL PC_COLON + CALL PRTHEXWORDHL + POP AF +#ENDIF +; + ;POP AF + AND $F0 + RET ; RETURN W/ RESULT IN A +; +; GET A BYTE OF DATA FROM THE SCSI DEVICE. THIS IS A NIBBLE READ. +; BYTE RETURNED IN A. +; +PPA_GETBYTE: + CALL PPA_WAIT + PPA_WCTL($04) + CALL PPA_READSTATUS + AND $F0 + PUSH AF + PPA_WCTL($06) + CALL PPA_READSTATUS + AND $F0 + RRCA + RRCA + RRCA + RRCA + POP HL + OR H + PUSH AF + PPA_WCTL($0C) + POP AF + RET +; +; GET A CHUNK OF DATA FROM SCSI BUS. THIS IS SPECIFICALLY FOR +; READ PHASE. IF TRANSFER MODE IS NON-ZERO, THEN A BLOCK (512 BYTES) +; OF DATA WILL BE READ. OTHERWISE, DATA IS WRITTEN AS +; LONG AS SCSI DEVICE WANTS TO CONTINUE RECEIVING (NO OVERRUN +; CHECK IN THIS CASE). +; +; THIS IS A NIBBLE READ. +; +; DE=BUFFER +; A=TRANSFER MODE (0=VARIABLE, 1=BLOCK) +; +PPA_GETDATA: + ; BRANCH TO CORRECT ROUTINE + OR A + JR NZ,PPA_GETBLOCK ; DO BLOCK READ +; +#IF (PPATRACE >= 3) + PRTS("\r\nGETDATA:$") +#ENDIF +; +PPA_GETDATA1: + PUSH HL ; SAVE BYTE COUNTER + CALL PPA_WAIT ; WAIT FOR BUS READY + POP HL ; RESTORE BYTE COUNTER + CP $D0 ; CHECK FOR READ PHASE + JR NZ,PPA_GETDATA2 ; IF NOT, ASSUME WE ARE DONE + PPA_WCTL($04) + CALL PPA_READSTATUS ; GET FIRST NIBBLE + AND $F0 ; ISOLATE BITS + PUSH AF ; SAVE WORKING VALUE + PPA_WCTL($06) + CALL PPA_READSTATUS ; GET SECOND NIBBLE + AND $F0 ; ISOLATE BITS + RRCA ; AND SHIFT TO LOW NIBBLE + RRCA + RRCA + RRCA + POP BC ; RECOVER LOW NIBBLE + OR B ; COMBINE + LD (DE),A ; AND SAVE THE FULL BYTE VALUE + INC DE ; NEXT BUFFER POS + INC HL ; INCREMENT BYTES COUNTER + JR PPA_GETDATA1 ; LOOP TILL DONE +; +PPA_GETDATA2: +; +#IF (PPATRACE >= 3) + CALL PC_SPACE + CALL PRTHEXWORDHL + PRTS(" BYTES$") +#ENDIF +; + PPA_WCTL($0C) + RET +; +PPA_GETBLOCK: +; +#IF (PPATRACE >= 3) + PRTS("\r\nGETBLK:$") +#ENDIF + LD B,0 ; LOOP COUNTER + EXX ; SWITCH TO ALT + EX AF,AF' ; SWITCH TO ALT AF + ; SAVE ALT REGS + PUSH AF + PUSH BC + PUSH DE + PUSH HL + ; C: PORT C + LD A,(IY+PPA_IOBASE) ; BASE PORT + INC A ; STATUS PORT + LD (PPA_GETBLOCK_A),A ; FILL IN + LD (PPA_GETBLOCK_B),A ; ... DYNAMIC BITS OF CODE + INC A ; CONTROL PORT + LD C,A ; ... TO C +#IF (PPAMODE == PPAMODE_MG014) + ; DE: CLOCK VALUES + LD D,$04 ^ ($0B | $80) + LD E,$06 ^ ($0B | $80) + ; HL: STATMAP + LD H,MG014_STATMAPLO >> 8 +#ENDIF +#IF (PPAMODE == PPAMODE_SPP) + ; DE: CLOCK VALUES + LD D,$04 + LD E,$06 +#ENDIF + EXX ; SWITCH TO PRI + CALL PPA_GETBLOCK1 ; LOOP TWICE + CALL PPA_GETBLOCK1 ; ... FOR 512 BYTES + ; RESTORE ALT REGS + EXX ; SWITCH TO ALT REGS + EX AF,AF' ; SWITCH TO ALT AF + POP HL + POP DE + POP BC + POP AF + EXX ; SWITCH TO PRI REGS + EX AF,AF' ; SWITCH TO PRI AF + RET +; +; +PPA_GETBLOCK1: + EXX ; ALT REGS + OUT (C),D ; SEND FIRST CLOCK +PPA_GETBLOCK_A .EQU $+1 + IN A,($FF) ; GET HIGH NIBBLE +#IF (PPAMODE == PPAMODE_MG014) + AND $0F ; RELEVANT BITS ONLY + ADD A,MG014_STATMAPHI & $FF ; HIGH BYTE OF MAP PTR + LD L,A ; PUT IN L + LD A,(HL) ; LOOKUP HIGH NIBBLE VALUE + EX AF,AF' ; SAVE NIBBLE +#ENDIF +#IF (PPAMODE == PPAMODE_SPP) + AND $F0 ; RELEVANT BITS ONLY + LD L,A ; SAVE NIBBLE IN L +#ENDIF + OUT (C),E ; SEND SECOND CLOCK +PPA_GETBLOCK_B .EQU $+1 + IN A,($FF) ; GET LOW NIBBLE +#IF (PPAMODE == PPAMODE_MG014) + AND $0F ; RELEVANT BITS ONLY + ADD A,MG014_STATMAPLO & $FF ; LOW BYTE OF MAP PTR + LD L,A ; PUT IN L + EX AF,AF' ; RECOVER HIGH NIBBLE VALUE + OR (HL) ; COMBINE WITH LOW NIB VALUE +#ENDIF +#IF (PPAMODE == PPAMODE_SPP) + AND $F0 ; RELEVANT BITS ONLY + RLCA ; MOVE TO LOW NIBBLE + RLCA ; MOVE TO LOW NIBBLE + RLCA ; MOVE TO LOW NIBBLE + RLCA ; MOVE TO LOW NIBBLE + OR L ; COMBINE WITH HIGH NIB VALUE +#ENDIF + EXX ; SWITCH TO PRI + LD (DE),A ; SAVE BYTE + INC DE ; BUMP BUF PTR + DJNZ PPA_GETBLOCK1 ; LOOP + RET ; DONE +; +; PUT A CHUNK OF DATA TO THE SCSI BUS. THIS IS SPECIFICALLY FOR +; WRITE PHASE. IF TRANSFER MODE IS NON-ZERO, THEN A BLOCK (512 BYTES) +; OF DATA WILL BE WRITTEN. OTHERWISE, DATA IS WRITTEN AS +; LONG AS SCSI DEVICE WANTS TO CONTINUE RECEIVING (NO OVERRUN +; CHECK IN THIS CASE). +; +; DE=BUFFER +; A=TRANSFER MODE (0=VARIABLE, 1=BLOCK) +; +PPA_PUTDATA: + ; BRANCH TO CORRECT ROUTINE + OR A + JR NZ,PPA_PUTBLOCK ; DO BLOCK WRITE +; +#IF (PPATRACE >= 3) + PRTS("\r\nPUTDATA:$") +#ENDIF +; +PPA_PUTDATA1: + PUSH HL ; SAVE BYTE COUNTER + CALL PPA_WAIT ; WAIT FOR BUS READY + POP HL ; RESTORE BYTE COUNTER + CP $C0 ; CHECK FOR WRITE PHASE + JR NZ,PPA_PUTDATA2 ; IF NOT, ASSUME WE ARE DONE + LD A,(DE) ; GET NEXT BYTE TO WRITE (FIRST OF PAIR) + CALL PPA_WRITEDATA ; PUT ON BUS + INC DE ; BUMP TO NEXT BUF POS + INC HL ; INCREMENT COUNTER + PPA_WCTL($0E) + PPA_WCTL($0C) + LD A,(DE) ; GET NEXT BYTE TO WRITE (SECOND OF PAIR) + JR PPA_PUTDATA1 ; LOOP TILL DONE +; +PPA_PUTDATA2: +; +#IF (PPATRACE >= 3) + CALL PC_SPACE + CALL PRTHEXWORDHL + PRTS(" BYTES$") +#ENDIF +; + RET +; +PPA_PUTBLOCK: +; +#IF (PPATRACE >= 3) + PRTS("\r\nPUTBLK:$") +#ENDIF +; + LD B,0 ; LOOP COUNTER + LD A,(IY+PPA_IOBASE) ; GET BASE IO ADR + LD (PPA_PUTBLOCK_A),A ; FILL IN + INC A ; STATUS PORT + INC A ; CONTROL PORT + LD C,A ; ... TO C + ; HL: CLOCK VALUES +#IF (PPAMODE == PPAMODE_MG014) + LD H,$0E ^ ($0B | $80) + LD L,$0C ^ ($0B | $80) +#ENDIF +#IF (PPAMODE == PPAMODE_SPP) + LD H,$0E + LD L,$0C +#ENDIF + CALL PPA_PUTBLOCK1 ; DO BELOW TWICE + CALL PPA_PUTBLOCK1 ; ... FOR 512 BYTES + RET +; +PPA_PUTBLOCK1: + LD A,(DE) ; GET NEXT BYTE +PPA_PUTBLOCK_A .EQU $+1 + OUT ($FF),A ; PUT ON BUS + INC DE ; INCREMENT BUF POS + OUT (C),H ; FIRST CLOCK + OUT (C),L ; SECOND CLOCK + DJNZ PPA_PUTBLOCK1 ; LOOP + RET ; DONE +; +; READ SCSI COMMAND STATUS +; +PPA_GETSTATUS: +; +#IF (PPATRACE >= 3) + PRTS("\r\nSTATUS:$") +#ENDIF +; + CALL PPA_GETBYTE ; GET ONE BYTE + LD (PPA_CMDSTAT),A ; SAVE AS FIRST STATUS BYTE +; +#IF (PPATRACE >= 3) + CALL PC_SPACE + CALL PRTHEXBYTE +#ENDIF +; + CALL PPA_WAIT ; CHECK FOR OPTIONAL SECOND BYTE + CP $F0 ; STILL IN STATUS PHASE? + RET NZ ; IF NOT, DONE + CALL PPA_GETBYTE ; ELSE, GET THE SECOND BYTE + LD (PPA_CMDSTAT+1),A ; AND SAVE IT +; +#IF (PPATRACE >= 3) + CALL PC_SPACE + CALL PRTHEXBYTE +#ENDIF +; + RET +; +; THIS IS THE MAIN SCSI ENGINE. BASICALLY, IT SELECTS THE DEVICE +; ON THE BUS, SENDS THE COMMAND, THEN PROCESSES THE RESULT. +; +; HL: COMMAND BUFFER +; DE: TRANSFER BUFFER +; A: TRANSFER MODE (0=VARIABLE, 1=BLOCK) +; +PPA_RUNCMD: + ; THERE ARE MANY PLACES NESTED WITHIN THE ROUTINES THAT + ; ARE CALLED HERE. HERE WE SAVE THE STACK SO THAT WE CAN + ; EASILY AND QUICKLY ABORT OUT OF ANY NESTED ROUTINE. + ; SEE PPA_CMD_ERR BELOW. + LD (PPA_CMDSTK),SP ; FOR ERROR ABORTS + LD (PPA_DSKBUF),DE ; SAVE BUF PTR + LD (PPA_XFRMODE),A ; SAVE XFER LEN + PUSH HL + CALL PPA_CONNECT ; PARALLEL PORT BUS CONNECT + CALL PPA_SELECT ; SELECT TARGET DEVICE + CALL PPA_WAIT ; WAIT TILL READY + POP HL + CALL PPA_SENDCMD ; SEND THE COMMAND +; +PPA_RUNCMD_PHASE: + ; WAIT FOR THE BUS TO BE READY. WE USE AN EXTRA LONG WAIT + ; TIMEOUT HERE BECAUSE THIS IS WHERE WE WILL WAIT FOR LONG + ; OPERATIONS TO COMPLETE. IT CAN TAKE SOME TIME IF THE + ; DEVICE HAS GONE TO SLEEP BECAUSE IT WILL NEED TO WAKE UP + ; AND SPIN UP BEFORE PROCESSING AN I/O COMMAND. + CALL PPA_LONGWAIT ; WAIT TILL READY +; +#IF (PPATRACE >= 3) + PRTS("\r\nPHASE: $") + CALL PRTHEXBYTE +#ENDIF +; + CP $C0 ; DEVICE WANTS TO RCV DATA + JR Z,PPA_RUNCMD_WRITE + CP $D0 ; DEVICE WANTS TO SEND DATA + JR Z,PPA_RUNCMD_READ + CP $F0 ; DEVICE WANTS TO BE DONE + JR Z,PPA_RUNCMD_END + JR PPA_CMD_IOERR +; +PPA_RUNCMD_WRITE: + LD DE,(PPA_DSKBUF) ; XFER BUFFER + LD A,(PPA_XFRMODE) ; XFER MODE + CALL PPA_PUTDATA ; SEND DATA NOW + JR PPA_RUNCMD_PHASE ; BACK TO DISPATCH +; +PPA_RUNCMD_READ: + LD DE,(PPA_DSKBUF) ; XFER BUFFER + LD A,(PPA_XFRMODE) ; XFER MODE + CALL PPA_GETDATA ; GET THE DATA NOW + JR PPA_RUNCMD_PHASE ; BACK TO DISPATCH +; +PPA_RUNCMD_END: + CALL PPA_GETSTATUS ; READ STATUS BYTES + CALL PPA_DISCONNECT ; PARALLEL PORT BUS DISCONNECT + XOR A ; SIGNAL SUCCESS + RET +; +PPA_CMD_IOERR: + LD A,PPA_STIOERR ; ERROR VALUE TO A + JR PPA_CMD_ERR ; CONTINUE +; +PPA_CMD_TIMEOUT: + LD A,PPA_STTO ; ERROR VALUE TO A + JR PPA_CMD_ERR ; CONTINUE +; +PPA_CMD_ERR: + LD SP,(PPA_CMDSTK) ; UNWIND STACK + PUSH AF ; SAVE STATUS + ;CALL PPA_RESETPULSE ; CLEAN UP THE MESS??? + LD DE,62 ; DELAY AFTER RESET PULSE + CALL VDELAY + CALL PPA_DISCONNECT ; PARALLEL PORT BUS DISCONNECT + LD DE,62 ; DELAY AFTER DISCONNECT + CALL VDELAY + POP AF ; RECOVER STATUS + JP PPA_ERR ; NOW DO STANDARD ERR PROCESSING +; +; ERRORS SHOULD GENERALLY NOT CAUSE SCSI PROCESSING TO FAIL. IF A +; DEVICE ERROR (I.E., READ ERROR) OCCURS, THEN THE SCSI PROTOCOL WILL +; PROVIDE ERROR INFORMATION. THE STATUS RESULT OF THE SCSI COMMAND +; WILL INDICATE IF AN ERROR OCCURRED. ADDITIONALLY, IF THE ERROR IS +; A CHECK CONDITION ERROR, THEN IT IS MANDATORY TO ISSUE A SENSE +; REQUEST SCSI COMMAND TO CLEAR THE ERROR AND RETRIEVE DETAILED ERROR +; INFO. +; +PPA_CHKCMD: + ; SCSI COMMAND COMPLETED, CHECK SCSI CMD STATUS + LD A,(PPA_CMDSTAT) ; GET STATUS BYTE + OR A ; SET FLAGS + RET Z ; IF ZERO, ALL GOOD, DONE +; + ; DO WE HAVE A CHECK CONDITION? + CP 2 ; CHECK CONDITION RESULT? + JR Z,PPA_CHKCMD1 ; IF SO, REQUEST SENSE + JP PPA_IOERR ; ELSE, GENERAL I/O ERROR +; +PPA_CHKCMD1: + ; USE REQUEST SENSE CMD TO GET ERROR DETAILS + LD DE,HB_WRKBUF ; PUT DATA IN WORK BUF + LD A,0 ; VARIABLE LENGTH READ + LD HL,PPA_CMD_SENSE ; REQUEST SENSE CMD + CALL PPA_RUNCMD ; DO IT + JP NZ,PPA_IOERR ; BAIL IF ERROR IN CMD +; + ; REQ SENSE CMD COMPLETED +#IF (PPATRACE >= 3) + PRTS("\r\nSENSE:$") + LD A,$19 + LD DE,HB_WRKBUF + CALL Z,PRTHEXBUF +#ENDIF +; + ; CHECK SCSI CMD STATUS + LD A,(PPA_CMDSTAT) ; GET STATUS BYTE + OR A ; SET FLAGS + JP NZ,PPA_IOERR ; IF FAILED, GENERAL I/O ERROR +; + ; RETURN RESULT BASED ON REQ SENSE DATA + ; TODO: WE NEED TO CHECK THE SENSE KEY FIRST!!! + LD A,(HB_WRKBUF+12) ; GET ADDITIONAL SENSE CODE + CP $3A ; NO MEDIA? + JP Z,PPA_NOMEDIA ; IF SO, RETURN NO MEDIA ERR + JP PPA_IOERR ; ELSE GENERAL I/O ERR +; +; CHECK CURRENT DEVICE FOR ERROR STATUS AND ATTEMPT TO RECOVER +; VIA RESET IF DEVICE IS IN ERROR. +; +PPA_CHKERR: + LD A,(IY+PPA_STAT) ; GET STATUS + OR A ; SET FLAGS + CALL NZ,PPA_RESET ; IF ERROR STATUS, RESET BUS + RET +; +; (RE)INITIALIZE DEVICE +; +PPA_INITDEV: +; +#IF (PPAMODE == PPAMODE_MG014) + ; INITIALIZE 8255 + LD A,(IY+PPA_IOBASE) ; BASE PORT + ADD A,PPA_IOSETUP ; BUMP TO SETUP PORT + LD C,A ; MOVE TO C FOR I/O + LD A,$82 ; CONFIG A OUT, B IN, C OUT + OUT (C),A ; DO IT + CALL DELAY ; SHORT DELAY FOR BUS SETTLE +#ENDIF +; + ; BUS RESET + CALL PPA_CONNECT + CALL PPA_RESETPULSE + LD DE,62 ; 1000 US + CALL VDELAY + CALL PPA_DISCONNECT + LD DE,62 ; 1000 US + CALL VDELAY +; + ; INITIALLY, THE DEVICE MAY REQUIRE MULTIPLE REQUEST SENSE + ; COMMANDS BEFORE IT WILL ACCEPT I/O COMMANDS. THIS IS DUE + ; TO THINGS LIKE BUS RESET NOTIFICATION, MEDIA CHANGE, ETC. + ; HERE, WE RUN A FEW REQUEST SENSE COMMANDS. AS SOON AS ONE + ; INDICATES NO ERRORS, WE CAN CONTINUE. + LD B,4 ; TRY UP TO 4 TIMES +PPA_INITDEV1: + PUSH BC ; SAVE LOOP COUNTER +; + ; REQUEST SENSE COMMAND + LD DE,HB_WRKBUF ; BUFFER FOR SENSE DATA + LD A,0 ; READ WHATEVER IS SENT + LD HL,PPA_CMD_SENSE ; POINT TO CMD BUFFER + CALL PPA_RUNCMD ; RUN THE SCSI ENGINE + JR NZ,PPA_INITDEV2 ; CMD PROC ERROR +; +#IF (PPATRACE >= 3) + PRTS("\r\nSENSE:$") + LD A,$19 + LD DE,HB_WRKBUF + CALL PRTHEXBUF +#ENDIF +; + ; CHECK SENSE KEY + LD A,(HB_WRKBUF + 2) ; GET SENSE KEY + OR A ; SET FLAGS +; +PPA_INITDEV2: + POP BC ; RESTORE LOOP COUNTER + JR Z,PPA_INITDEV3 ; IF NO ERROR, MOVE ON + DJNZ PPA_INITDEV1 ; TRY UNTIL COUNTER EXHAUSTED + JP PPA_IOERR ; BAIL OUT WITH ERROR +; +PPA_INITDEV3: + ; READ & RECORD DEVICE CAPACITY + LD DE,HB_WRKBUF ; BUFFER TO CAPACITY RESPONSE + LD A,0 ; READ WHATEVER IS SENT + LD HL,PPA_CMD_RDCAP ; POINT TO READ CAPACITY CMD + CALL PPA_RUNCMD ; RUN THE SCSI ENGINE + CALL Z,PPA_CHKCMD ; CHECK AND RECORD ANY ERRORS + RET NZ ; BAIL OUT ON ERROR +; +#IF (PPATRACE >= 3) + PRTS("\r\nRDCAP:$") + LD A,8 + LD DE,HB_WRKBUF + CALL PRTHEXBUF +#ENDIF +; + ; CAPACITY IS RETURNED IN A 4 BYTE, BIG ENDIAN FIELD AND + ; INDICATES THE LAST LBA VALUE. WE NEED TO CONVERT THIS TO + ; LITTLE ENDIAN AND INCREMENT THE VALUE TO MAKE IT A CAPACITY + ; COUNT INSTEAD OF A LAST LBA VALUE. + LD A,PPA_MEDCAP ; OFFSET IN CFG FOR CAPACITY + CALL LDHLIYA ; POINTER TO HL + PUSH HL ; SAVE IT + LD HL,HB_WRKBUF ; POINT TO VALUE IN CMD RESULT + CALL LD32 ; LOAD IT TO DE:HL + LD A,L ; FLIP BYTES + LD L,D ; ... BIG ENDIAN + LD D,A ; ... TO LITTLE ENDIAN + LD A,H + LD H,E + LD E,A + CALL INC32 ; INCREMENT TO FINAL VALUE + POP BC ; RECOVER SAVE LOCATION + CALL ST32 ; STORE VALUE +; + XOR A ; SIGNAL SUCCESS + LD (IY+PPA_STAT),A ; RECORD IT + RET +; +;============================================================================= +; ERROR HANDLING AND DIAGNOSTICS +;============================================================================= +; +; ERROR HANDLERS +; +; +PPA_NOMEDIA: + LD A,PPA_STNOMEDIA + JR PPA_ERR +; +PPA_CMDERR: + LD A,PPA_STCMDERR + JR PPA_ERR +; +PPA_IOERR: + LD A,PPA_STIOERR + JR PPA_ERR +; +PPA_TO: + LD A,PPA_STTO + JR PPA_ERR +; +PPA_NOTSUP: + LD A,PPA_STNOTSUP + JR PPA_ERR +; +PPA_ERR: + LD (IY+PPA_STAT),A ; SAVE NEW STATUS +; +PPA_ERR2: +#IF (PPATRACE >= 2) + CALL PPA_PRTSTAT +#ENDIF + OR A ; SET FLAGS + RET +; +; +; +PPA_PRTERR: + RET Z ; DONE IF NO ERRORS + ; FALL THRU TO PPA_PRTSTAT +; +; PRINT FULL DEVICE STATUS LINE +; +PPA_PRTSTAT: + PUSH AF + PUSH DE + PUSH HL + LD A,(IY+PPA_STAT) + CALL PPA_PRTPREFIX ; PRINT UNIT PREFIX + CALL PC_SPACE ; FORMATTING + CALL PPA_PRTSTATSTR + POP HL + POP DE + POP AF + RET +; +; PRINT STATUS STRING +; +PPA_PRTSTATSTR: + PUSH AF + PUSH DE + PUSH HL + LD A,(IY+PPA_STAT) + NEG + LD HL,PPA_STR_ST_MAP + ADD A,A + CALL ADDHLA + LD E,(HL) + INC HL + LD D,(HL) + CALL WRITESTR + POP HL + POP DE + POP AF + RET +; +; PRINT DIAGNONSTIC PREFIX +; +PPA_PRTPREFIX: + PUSH AF + CALL NEWLINE + PRTS("PPA$") + LD A,(IY+PPA_DEV) ; GET CURRENT DEVICE NUM + CALL PRTDECB + CALL PC_COLON + POP AF + RET +; +;============================================================================= +; STRING DATA +;============================================================================= +; +PPA_STR_ST_MAP: + .DW PPA_STR_STOK + .DW PPA_STR_STNOMEDIA + .DW PPA_STR_STCMDERR + .DW PPA_STR_STIOERR + .DW PPA_STR_STTO + .DW PPA_STR_STNOTSUP +; +PPA_STR_STOK .TEXT "OK$" +PPA_STR_STNOMEDIA .TEXT "NO MEDIA$" +PPA_STR_STCMDERR .TEXT "COMMAND ERROR$" +PPA_STR_STIOERR .TEXT "IO ERROR$" +PPA_STR_STTO .TEXT "TIMEOUT$" +PPA_STR_STNOTSUP .TEXT "NOT SUPPORTED$" +PPA_STR_STUNK .TEXT "UNKNOWN ERROR$" +; +PPA_STR_MODE_MAP: + .DW PPA_STR_MODE_NONE + .DW PPA_STR_MODE_SPP + .DW PPA_STR_MODE_MG014 +; +PPA_STR_MODE_NONE .DB "NONE$" +PPA_STR_MODE_SPP .DB "SPP$" +PPA_STR_MODE_MG014 .DB "MG014$" +; +PPA_STR_NOHW .TEXT "NOT PRESENT$" +; +;============================================================================= +; DATA STORAGE +;============================================================================= +; +PPA_DEVNUM .DB 0 ; TEMP DEVICE NUM USED DURING INIT +PPA_CMDSTK .DW 0 ; STACK PTR FOR CMD ABORTING +PPA_DSKBUF .DW 0 ; WORKING DISK BUFFER POINTER +PPA_XFRMODE .DB 0 ; 0=VARIABLE, 1=BLOCK (512 BYTES) +PPA_CMDSTAT .DB 0, 0 ; CMD RESULT STATUS +; +; SCSI COMMAND TEMPLATES (LENGTH PREFIXED) +; + .DB 6 +PPA_CMD_RW .DB $00, $00, $00, $00, $01, $00 ; READ/WRITE SECTOR + .DB 6 +PPA_CMD_SENSE .DB $03, $00, $00, $00, $FF, $00 ; REQUEST SENSE DATA + .DB 10 +PPA_CMD_RDCAP .DB $25, $00, $00, $00, $00, $00, $00, $00, $00, $00 ; READ CAPACITY +; +; PPA DEVICE CONFIGURATION TABLE +; +PPA_CFG: +; +#IF (PPACNT >= 1) +; +PPA0_CFG: ; DEVICE 0 + .DB 0 ; DRIVER DEVICE NUMBER (FILLED DYNAMICALLY) + .DB PPAMODE ; DRIVER DEVICE MODE + .DB 0 ; DEVICE STATUS + .DB PPA0BASE ; IO BASE ADDRESS + .DW 0,0 ; DEVICE CAPACITY + .DW 0,0 ; CURRENT LBA +; + .ECHO "PPA: MODE=" + #IF (PPAMODE == PPAMODE_SPP) + .ECHO "SPP" + #ENDIF + #IF (PPAMODE == PPAMODE_MG014) + .ECHO "MG014" + #ENDIF + .ECHO ", IO=" + .ECHO PPA0BASE + .ECHO "\n" +#ENDIF +; +#IF (PPACNT >= 2) +; +PPA1_CFG: ; DEVICE 1 + .DB 0 ; DRIVER DEVICE NUMBER (FILLED DYNAMICALLY) + .DB PPAMODE ; DRIVER DEVICE MODE + .DB 0 ; DEVICE STATUS + .DB PPA1BASE ; IO BASE ADDRESS + .DW 0,0 ; DEVICE CAPACITY + .DW 0,0 ; CURRENT LBA +; + .ECHO "PPA: MODE=" + #IF (PPAMODE == PPAMODE_SPP) + .ECHO "SPP" + #ENDIF + #IF (PPAMODE == PPAMODE_MG014) + .ECHO "MG014" + #ENDIF + .ECHO ", IO=" + .ECHO PPA1BASE + .ECHO "\n" +#ENDIF +; +#IF ($ - PPA_CFG) != (PPACNT * PPA_CFGSIZ) + .ECHO "*** INVALID PPA CONFIG TABLE ***\n" +#ENDIF +; + .DB $FF ; END MARKER diff --git a/Source/HBIOS/ppide.asm b/Source/HBIOS/ppide.asm index 9fc40047..d70ede57 100644 --- a/Source/HBIOS/ppide.asm +++ b/Source/HBIOS/ppide.asm @@ -4,8 +4,8 @@ ;============================================================================= ; ; TODO: -; - FIX SCALER CONSTANT ; - GOPARTNER NEEDS TO HANDLE "NO PARTNER" CONDITION +; - DATA TRANSFERS LIMITED TO 512 BYTES WHICH IS INSUFFICIENT FOR CD=ROM MEDIA ; ; NOTES: ; - WELL KNOWN PPIDE PORT ADDRESSES: @@ -136,6 +136,8 @@ PPIDE_REG_LBA0 .EQU PPIDE_CTL_CS1 | $03 ; LBA BYTE 0 (BITS 0-7) (R/W) PPIDE_REG_LBA1 .EQU PPIDE_CTL_CS1 | $04 ; LBA BYTE 1 (BITS 8-15) (R/W) PPIDE_REG_LBA2 .EQU PPIDE_CTL_CS1 | $05 ; LBA BYTE 2 (BITS 16-23) (R/W) PPIDE_REG_LBA3 .EQU PPIDE_CTL_CS1 | $06 ; LBA BYTE 3 (BITS 24-27) (R/W) +PPIDE_REG_BCL .EQU PPIDE_CTL_CS1 | $04 ; PKT BYTE COUNT LOW (BITS 0-7) (R/W) +PPIDE_REG_BCH .EQU PPIDE_CTL_CS1 | $05 ; PKT BYTE COUNT HIGH (BITS 8-15) (R/W) PPIDE_REG_STAT .EQU PPIDE_CTL_CS1 | $07 ; STATUS REGISTER (R) PPIDE_REG_CMD .EQU PPIDE_CTL_CS1 | $07 ; COMMAND REGISTER (EXECUTE) (W) PPIDE_REG_ALTSTAT .EQU PPIDE_CTL_CS3 | $06 ; ALTERNATE STATUS REGISTER (R) @@ -144,9 +146,14 @@ PPIDE_REG_DRVADR .EQU PPIDE_CTL_CS3 | $07 ; DRIVE ADDRESS REGISTER (R) ; ; COMMAND BYTES ; +PPIDE_CMD_NOP .EQU $00 +PPIDE_CMD_DEVRES .EQU $08 PPIDE_CMD_RECAL .EQU $10 PPIDE_CMD_READ .EQU $20 PPIDE_CMD_WRITE .EQU $30 +PPIDE_CMD_DEVDIAG .EQU $90 +PPIDE_CMD_PACKET .EQU $A0 +PPIDE_CMD_IDPKTDEV .EQU $A1 PPIDE_CMD_IDDEV .EQU $EC PPIDE_CMD_SETFEAT .EQU $EF ; @@ -171,6 +178,8 @@ PPIDE_STIOERR .EQU -4 PPIDE_STRDYTO .EQU -5 PPIDE_STDRQTO .EQU -6 PPIDE_STBSYTO .EQU -7 +PPIDE_STNOTSUP .EQU -8 +PPIDE_STNOTRDY .EQU -9 ; ; DRIVE SELECTION BYTES (FOR USE IN DRIVE/HEAD REGISTER) ; @@ -217,9 +226,14 @@ PPIDE_DEV0M: ; DEVICE 0, MASTER .DW 0,0 ; DEVICE CAPACITY .DW 0,0 ; CURRENT LBA .DB PPIDE0BASE ; DATALO - .DB PPIDE0BASE+2 ; CTL + .DB PPIDE0BASE+2 ; CTL .DB PPIDE0BASE+3 ; PPI .DW PPIDE_DEV0S ; PARTNER +; + .ECHO "PPIDE: IO=" + .ECHO PPIDE0BASE + .ECHO ", MASTER" + .ECHO "\n" ; PPIDE_DEV0S: ; DEVICE 0, SLAVE .DB $FE ; DRIVER DEVICE NUMBER (FILLED DYNAMICALLY) @@ -230,9 +244,14 @@ PPIDE_DEV0S: ; DEVICE 0, SLAVE .DW 0,0 ; DEVICE CAPACITY .DW 0,0 ; CURRENT LBA .DB PPIDE0BASE ; DATALO - .DB PPIDE0BASE+2 ; CTL + .DB PPIDE0BASE+2 ; CTL .DB PPIDE0BASE+3 ; PPI .DW PPIDE_DEV0M ; PARTNER +; + .ECHO "PPIDE: IO=" + .ECHO PPIDE0BASE + .ECHO ", SLAVE" + .ECHO "\n" ; #ENDIF ; @@ -247,9 +266,14 @@ PPIDE_DEV1M: ; DEVICE 1, MASTER .DW 0,0 ; DEVICE CAPACITY .DW 0,0 ; CURRENT LBA .DB PPIDE1BASE ; DATALO - .DB PPIDE1BASE+2 ; CTL + .DB PPIDE1BASE+2 ; CTL .DB PPIDE1BASE+3 ; PPI .DW PPIDE_DEV1S ; PARTNER +; + .ECHO "PPIDE: IO=" + .ECHO PPIDE1BASE + .ECHO ", MASTER" + .ECHO "\n" ; PPIDE_DEV1S: ; DEVICE 1, SLAVE .DB $FE ; DRIVER DEVICE NUMBER (FILLED DYNAMICALLY) @@ -260,9 +284,14 @@ PPIDE_DEV1S: ; DEVICE 1, SLAVE .DW 0,0 ; DEVICE CAPACITY .DW 0,0 ; CURRENT LBA .DB PPIDE1BASE ; DATALO - .DB PPIDE1BASE+2 ; CTL + .DB PPIDE1BASE+2 ; CTL .DB PPIDE1BASE+3 ; PPI .DW PPIDE_DEV1M ; PARTNER +; + .ECHO "PPIDE: IO=" + .ECHO PPIDE1BASE + .ECHO ", SLAVE" + .ECHO "\n" ; #ENDIF ; @@ -277,10 +306,15 @@ PPIDE_DEV2M: ; DEVICE 2, MASTER .DW 0,0 ; DEVICE CAPACITY .DW 0,0 ; CURRENT LBA .DB PPIDE2BASE ; DATALO - .DB PPIDE2BASE+2 ; CTL + .DB PPIDE2BASE+2 ; CTL .DB PPIDE2BASE+3 ; PPI .DW PPIDE_DEV2S ; PARTNER -; +; + .ECHO "PPIDE: IO=" + .ECHO PPIDE2BASE + .ECHO ", MASTER" + .ECHO "\n" +; PPIDE_DEV2S: ; DEVICE 2, SLAVE .DB $FE ; DRIVER DEVICE NUMBER (FILLED DYNAMICALLY) .DB 0 ; DEVICE STATUS @@ -290,9 +324,14 @@ PPIDE_DEV2S: ; DEVICE 2, SLAVE .DW 0,0 ; DEVICE CAPACITY .DW 0,0 ; CURRENT LBA .DB PPIDE2BASE ; DATALO - .DB PPIDE2BASE+2 ; CTL + .DB PPIDE2BASE+2 ; CTL .DB PPIDE2BASE+3 ; PPI .DW PPIDE_DEV2M ; PARTNER +; + .ECHO "PPIDE: IO=" + .ECHO PPIDE2BASE + .ECHO ", SLAVE" + .ECHO "\n" ; #ENDIF ; @@ -302,17 +341,17 @@ PPIDE_DEV2S: ; DEVICE 2, SLAVE ; .DB $FF ; END OF TABLE MARKER ; -; THE IDE_WAITXXX FUNCTIONS ARE BUILT TO TIMEOUT AS NEEDED SO DRIVER WILL +; THE PPIDE_WAITXXX FUNCTIONS ARE BUILT TO TIMEOUT AS NEEDED SO DRIVER WILL ; NOT HANG IF DEVICE IS UNRESPONSIVE. DIFFERENT TIMEOUTS ARE USED DEPENDING -; ON THE SITUATION. GENERALLY, THE FAST TIMEOUT IS USED TO PROBE FOR DEVICES -; USING FUNCTIONS THAT PERFORM NO I/O. OTHERWISE THE NORMAL TIMEOUT IS USED. -; IDE SPEC ALLOWS FOR UP TO 30 SECS MAX TO RESPOND. IN PRACTICE, THIS IS WAY -; TOO LONG, BUT IF YOU ARE USING A VERY OLD DEVICE, THESE TIMEOUTS MAY NEED TO -; BE ADJUSTED. NOTE THAT THESE ARE BYTE VALUES, SO YOU CANNOT EXCEED 255. -; THE TIMEOUTS ARE IN UNITS OF .05 SECONDS. +; ON THE SITUATION. THE SLOW TIMEOUT IS USED TO WAIT FOR A DEVICE TO +; BECOME READY AFTER A HARD RESET (SPIN UP, ETC.). THE NORMAL TIMEOUT +; IS USED DURING NORMAL OPERATION FOR ALL I/O OPERATIONS WHICH SHOULD +; OCCUR PRETTY FAST. NOTE THAT THE ATA SPEC ALLOWS UP TO 30 SECONDS +; FOR DEVICES TO RESPOND. WE ARE USING MUCH MORE AGGRESSIVE VALUES +; BASED ON REAL WORLD EXPERIENCE. ; -PPIDE_TONORM .EQU 200 ; NORMAL TIMEOUT IS 10 SECS -PPIDE_TOFAST .EQU 10 ; FAST TIMEOUT IS 0.5 SECS +PPIDE_TOSLOW .EQU 200 ; SLOW TIMEOUT IS 20 SECS +PPIDE_TONORM .EQU 5 ; NORMAL TIMEOUT IS 0.5 SECS ; ;============================================================================= ; INITIALIZATION ENTRY POINT @@ -320,9 +359,12 @@ PPIDE_TOFAST .EQU 10 ; FAST TIMEOUT IS 0.5 SECS ; PPIDE_INIT: ; COMPUTE CPU SPEED COMPENSATED TIMEOUT SCALER - ; AT 1MHZ, THE SCALER IS 218 (50000US / 229TS = 218) - ; SCALER IS THEREFORE 218 * CPU SPEED IN MHZ - LD DE,218 ; LOAD SCALER FOR 1MHZ + ; ONE INTERNAL LOOP IN WAITBSY IS 263TS. ON A 1 MHZ CPU, 1 TS + ; TAKES 1NS. SO 1/10 SECOND IS 100000 TS ON A 1 MHZ CPU. + ; SINCE 1 INTERNAL LOOP IS 263 TS, IT TAKES 100000 / 263 = 356 + ; INTERNAL LOOPS FOR 1/10 SECOND. SO, WE WANT TO USE + ; 356 * CPU MHZ FOR INTERNAL LOOP COUNT. + LD DE,380 ; LOAD SCALER FOR 1MHZ LD A,(CB_CPUMHZ) ; LOAD CPU SPEED IN MHZ CALL MULT8X16 ; HL := DE * A LD (PPIDE_TOSCALER),HL ; SAVE IT @@ -355,7 +397,7 @@ PPIDE_INIT2: LD DE,PPIDE_STR_NOPPI ; NO PPI MESSAGE CALL WRITESTR ; DISPLAY IT JR PPIDE_INIT4 ; SKIP CFG ENTRY -; +; PPIDE_INIT3: CALL PPIDE_RESET ; RESET THE BUS CALL PPIDE_INIT5 ; DETECT/INIT MASTER @@ -363,7 +405,7 @@ PPIDE_INIT3: CALL PPIDE_GOPARTNER ; SWITCH IY TO PARTNER CFG CALL PPIDE_INIT5 ; DETECT/INIT SLAVE POP IY ; RESTORE CFG PTR -; +; PPIDE_INIT4: LD DE,PPIDE_CFGSIZ ; SIZE OF CFG TABLE ENTRY ADD IY,DE ; BUMP POINTER @@ -381,14 +423,25 @@ PPIDE_INIT5: PUSH IY ; CFG ENTRY POINTER POP DE ; COPY TO DE CALL DIO_ADDENT ; ADD ENTRY TO GLOBAL DISK DEV TABLE +; + ; START PRINTING DEVICE INFO + CALL PPIDE_PRTPREFIX ; PRINT DEVICE PREFIX + LD A,(IY+PPIDE_TYPE) + LD DE,PPIDE_STR_TYPEATA + CP PPIDE_TYPEATA + CALL Z,WRITESTR + LD DE,PPIDE_STR_TYPEATAPI + CP PPIDE_TYPEATAPI + CALL Z,WRITESTR ; ; CHECK FOR BAD STATUS LD A,(IY+PPIDE_STAT) ; GET STATUS OR A ; SET FLAGS - JP NZ,PPIDE_PRTSTAT ; EXIT VIA PRINT STATUS -; - CALL PPIDE_PRTPREFIX ; PRINT DEVICE PREFIX + JP Z,PPIDE_INIT6 + CALL PC_SPACE + JP NZ,PPIDE_PRTSTATSTR ; EXIT VIA PRINT STATUS STRING ; +PPIDE_INIT6: LD DE,PPIDE_STR_8BIT BIT 1,(IY+PPIDE_ACC) ; 8 BIT ACCESS? CALL NZ,WRITESTR @@ -426,9 +479,9 @@ PPIDE_INIT5: PPIDE_DETECT: ; ; TEST FOR PPI EXISTENCE - ; WE SETUP THE PPI TO WRITE, THEN WRITE A VALUE OF ZERO + ; WE SETUP THE PPI TO WRITE, THEN WRITE A VALUE OF $A5 ; TO PORT A (DATALO), THEN READ IT BACK. IF THE PPI IS THERE - ; THEN THE BUS HOLD CIRCUITRY WILL READ BACK THE ZERO. SINCE + ; THEN THE BUS HOLD CIRCUITRY WILL READ BACK THE $A5. SINCE ; WE ARE IN WRITE MODE, AN IDE CONTROLLER WILL NOT BE ABLE TO ; INTERFERE WITH THE VALUE BEING READ. ; @@ -437,14 +490,14 @@ PPIDE_DETECT: OUT (C),A ; WRITE IT ; LD C,(IY+PPIDE_DATALO) ; PPI PORT A, DATALO - XOR A ; VALUE ZERO + LD A,$A5 ; TEST VALUE OUT (C),A ; PUSH VALUE TO PORT IN A,(C) ; GET PORT VALUE #IF (PPIDETRACE >= 3) CALL PC_SPACE CALL PRTHEXBYTE #ENDIF - OR A ; SET FLAGS + CP $A5 ; CHECK FOR TEST VALUE RET ; AND RETURN ; ;============================================================================= @@ -504,12 +557,12 @@ PPIDE_IO: PUSH HL ; ... TO FILTER ALL EXITS #ENDIF PUSH BC ; SAVE COUNTERS - CALL PPIDE_SELUNIT ; HARDWARE SELECTION OF TARGET UNIT CALL PPIDE_CHKERR ; CHECK FOR ERR STATUS AND RESET IF SO POP BC ; RESTORE COUNTERS JR NZ,PPIDE_IO3 ; BAIL OUT ON ERROR PPIDE_IO1: PUSH BC ; SAVE COUNTERS + CALL PPIDE_SELUNIT ; HARDWARE SELECTION OF TARGET UNIT LD HL,(PPIDE_IOFNADR) ; GET PENDING IO FUNCTION ADDRESS CALL JPHL ; ... AND CALL IT JR NZ,PPIDE_IO2 ; IF ERROR, SKIP INCREMENT @@ -549,10 +602,14 @@ PPIDE_STATUS: PPIDE_DEVICE: LD D,DIODEV_PPIDE ; D := DEVICE TYPE LD E,(IY+PPIDE_DEV) ; E := PHYSICAL DEVICE NUMBER + LD C,%01111001 ; ATAPI ATTRIBUTES + LD A,(IY+PPIDE_TYPE) ; CHECK TYPE VALUE + CP PPIDE_TYPEATAPI ; ATAPI? + JR Z,PPIDE_DEVICE1 ; IF SO, DONE + LD C,%00110001 ; COMPACTFLASH ATTRIBUTES BIT 0,(IY+PPIDE_MED) ; TEST CF BIT IN FLAGS - LD C,%00000000 ; ASSUME NON-REMOVABLE HARD DISK - JR Z,PPIDE_DEVICE1 ; IF Z, WE ARE DONE - LD C,%01001000 ; OTHERWISE REMOVABLE COMPACT FLASH + JR NZ,PPIDE_DEVICE1 ; IF SET, DONE + LD C,%00110000 ; GENERIC HARD DISK ATTRIBUTES PPIDE_DEVICE1: LD H,0 ; H := 0, DRIVER HAS NO MODES LD L,(IY+PPIDE_DATALO) ; L := BASE I/O ADDRESS @@ -564,26 +621,12 @@ PPIDE_DEVICE1: PPIDE_MEDIA: LD A,E ; GET FLAGS OR A ; SET FLAGS - JR Z,PPIDE_MEDIA2 ; JUST REPORT CURRENT STATUS AND MEDIA + JR Z,PPIDE_MEDIA1 ; JUST REPORT CURRENT STATUS AND MEDIA ; - ; GET CURRENT STATUS - LD A,(IY+PPIDE_STAT) ; GET STATUS - OR A ; SET FLAGS - JR NZ,PPIDE_MEDIA1 ; ERROR ACTIVE, GO RIGHT TO RESET -; - ; USE IDENTIFY COMMAND TO CHECK DEVICE - LD HL,PPIDE_TIMEOUT ; POINT TO TIMEOUT - LD (HL),PPIDE_TOFAST ; USE FAST TIMEOUT DURING IDENTIFY COMMAND - CALL PPIDE_SELUNIT ; HARDWARE SELECTION OF TARGET UNIT - CALL PPIDE_IDENTIFY ; EXECUTE IDENTIFY COMMAND - LD HL,PPIDE_TIMEOUT ; POINT TO TIMEOUT - LD (HL),PPIDE_TONORM ; BACK TO NORMAL TIMEOUT - JR Z,PPIDE_MEDIA2 ; IF SUCCESS, BYPASS RESET + ;CALL PPIDE_RESET ; RESET IDE INTERFACE + CALL PPIDE_INITUNIT ; RE-INITIALIZE UNIT ; PPIDE_MEDIA1: - CALL PPIDE_RESET ; RESET IDE INTERFACE -; -PPIDE_MEDIA2: LD A,(IY+PPIDE_STAT) ; GET STATUS OR A ; SET FLAGS LD D,0 ; NO MEDIA CHANGE DETECTED @@ -636,8 +679,6 @@ PPIDE_GEOM: ; FUNCTION SUPPORT ROUTINES ;============================================================================= ; -; -; PPIDE_SETFEAT: PUSH AF #IF (PPIDETRACE >= 3) @@ -681,13 +722,74 @@ PPIDE_IDENTIFY: #ENDIF LD A,PPIDE_CMD_IDDEV LD (PPIDE_CMD),A - CALL PPIDE_RUNCMD + CALL PPIDE_RUNCMD_ND + RET NZ +; + CALL PPIDE_IN + .DB PPIDE_REG_STAT + BIT 3,A ; IS DRQ SET? + JP Z,PPIDE_NOMEDIA +; + LD HL,HB_WRKBUF + JP PPIDE_GETBUF ; EXIT THRU BUFRD +; +; +; +PPIDE_IDENTIFYPACKET: +#IF (PPIDETRACE >= 3) + CALL PPIDE_PRTPREFIX + PRTS(" IDPKTDEV$") +#ENDIF + LD A,(PPIDE_DRVHD) + ;OUT (PPIDE_REG_DRVHD),A + CALL PPIDE_OUT + .DB PPIDE_REG_DRVHD +#IF (PPIDETRACE >= 3) + CALL PC_SPACE + CALL PRTHEXBYTE +#ENDIF + LD A,PPIDE_CMD_IDPKTDEV + LD (PPIDE_CMD),A + CALL PPIDE_RUNCMD_ND RET NZ +; + CALL PPIDE_IN + .DB PPIDE_REG_STAT + BIT 3,A ; IS DRQ SET? + JP Z,PPIDE_NOMEDIA +; LD HL,HB_WRKBUF JP PPIDE_GETBUF ; EXIT THRU BUFRD ; ; ; +PPIDE_PACKET: +#IF (PPIDETRACE >= 3) + CALL PPIDE_PRTPREFIX + PRTS(" PACKET$") +#ENDIF + LD A,(PPIDE_DRVHD) + ;OUT (PPIDE_REG_DRVHD),A + CALL PPIDE_OUT + .DB PPIDE_REG_DRVHD +#IF (PPIDETRACE >= 3) + CALL PC_SPACE + CALL PRTHEXBYTE +#ENDIF + XOR A ; ZERO + CALL PPIDE_OUT + .DB PPIDE_REG_FEAT ; FEATURE REG = 0 + CALL PPIDE_OUT + .DB PPIDE_REG_BCL + LD A,8 + CALL PPIDE_OUT + .DB PPIDE_REG_BCH ; BYTE COUNT = 512???? + LD A,PPIDE_CMD_PACKET + LD (PPIDE_CMD),A + JP PPIDE_RUNCMD_ND +; +; +; PPIDE_RDSEC: ; #IF (PPIDETRACE >= 3) @@ -701,6 +803,17 @@ PPIDE_RDSEC: #IF (PPIDETRACE >= 3) CALL PC_SPACE CALL PRTHEXBYTE +#ENDIF + LD A,(IY+PPIDE_TYPE) + CP PPIDE_TYPEATA + JR Z,PPIDE_ATA_RDSEC + CP PPIDE_TYPEATAPI + JR Z,PPIDE_PKT_RDSEC + JP PPIDE_CMDERR +; +PPIDE_ATA_RDSEC: +#IF (PPIDETRACE >= 3) + PRTS(" ATA$") #ENDIF CALL PPIDE_SETADDR ; SETUP CYL, TRK, HEAD LD A,PPIDE_CMD_READ @@ -710,6 +823,40 @@ PPIDE_RDSEC: LD HL,(PPIDE_DSKBUF) JP PPIDE_GETBUF ; +PPIDE_PKT_RDSEC: +#IF (PPIDETRACE >= 3) + PRTS(" PKT$") +#ENDIF + ; SETUP LBA +; +#IF (DSKYENABLE) + #IF (DSKYDSKACT) + LD A,PPIDE_LBA + CALL LDHLIYA + CALL HB_DSKACT ; SHOW ACTIVITY + #ENDIF +#ENDIF +; + ; 3 BYTES, LITTLE ENDIAN -> BIG ENDIAN + LD HL,PPIDE_PKTCMD_RW10+3 ; START OF LBA FIELD IN CDB (MSB) + LD A,(IY+PPIDE_LBA+2) ; THIRD BYTE OF LBA FIELD IN CFG (MSB) + LD (HL),A + INC HL + LD A,(IY+PPIDE_LBA+1) + LD (HL),A + INC HL + LD A,(IY+PPIDE_LBA+0) + LD (HL),A + INC HL + LD HL,PPIDE_PKTCMD_RW10 + LD A,SCSI_CMD_READ10 + LD (HL),A + XOR A ; READ DIRECTION + LD (PPIDE_XFRDIR),A ; SAVE IT + CALL PPIDE_RUNPCMD + JP NZ,PPIDE_CHKPCMD + RET +; ; ; PPIDE_WRSEC: @@ -725,6 +872,17 @@ PPIDE_WRSEC: #IF (PPIDETRACE >= 3) CALL PC_SPACE CALL PRTHEXBYTE +#ENDIF + LD A,(IY+PPIDE_TYPE) + CP PPIDE_TYPEATA + JR Z,PPIDE_ATA_WRSEC + CP PPIDE_TYPEATAPI + JR Z,PPIDE_PKT_WRSEC + JP PPIDE_CMDERR +; +PPIDE_ATA_WRSEC: +#IF (PPIDETRACE >= 3) + PRTS(" ATA$") #ENDIF CALL PPIDE_SETADDR ; SETUP CYL, TRK, HEAD LD A,PPIDE_CMD_WRITE @@ -734,18 +892,54 @@ PPIDE_WRSEC: LD HL,(PPIDE_DSKBUF) JP PPIDE_PUTBUF ; +PPIDE_PKT_WRSEC: +#IF (PPIDETRACE >= 3) + PRTS(" PKT$") +#ENDIF + ; SETUP LBA +; +#IF (DSKYENABLE) + #IF (DSKYDSKACT) + LD A,PPIDE_LBA + CALL LDHLIYA + CALL HB_DSKACT ; SHOW ACTIVITY + #ENDIF +#ENDIF +; + ; 3 BYTES, LITTLE ENDIAN -> BIG ENDIAN + LD HL,PPIDE_PKTCMD_RW10+3 ; START OF LBA FIELD IN CDB (MSB) + LD A,(IY+PPIDE_LBA+2) ; THIRD BYTE OF LBA FIELD IN CFG (MSB) + LD (HL),A + INC HL + LD A,(IY+PPIDE_LBA+1) + LD (HL),A + INC HL + LD A,(IY+PPIDE_LBA+0) + LD (HL),A + INC HL + LD HL,PPIDE_PKTCMD_RW10 + LD A,SCSI_CMD_WRITE10 + LD (HL),A + OR $FF ; WRITE DIRECTION + LD (PPIDE_XFRDIR),A ; SAVE IT + CALL PPIDE_RUNPCMD + JP NZ,PPIDE_CHKPCMD + RET +; ; ; PPIDE_SETADDR: ; #IF (DSKYENABLE) + #IF (DSKYDSKACT) LD A,PPIDE_LBA CALL LDHLIYA CALL HB_DSKACT ; SHOW ACTIVITY + #ENDIF #ENDIF ; SEND 3 LOWEST BYTES OF LBA IN REVERSE ORDER - ; IDE_IO_LBA3 HAS ALREADY BEEN SET - ; HSTLBA2-0 --> IDE_IO_LBA2-0 + ; IDE_REG_LBA3 HAS ALREADY BEEN SET + ; HSTLBA2-0 --> IDE_REG_LBA2-0 LD A,(IY+PPIDE_LBA+2) #IF (PPIDETRACE >= 3) CALL PC_SPACE @@ -777,10 +971,6 @@ PPIDE_SETADDR: #ENDIF CALL PPIDE_OUT .DB PPIDE_REG_COUNT -; -;;#IF (DSKYENABLE) -;; CALL PPIDE_DSKY -;;#ENDIF ; RET ; @@ -788,10 +978,21 @@ PPIDE_SETADDR: ; COMMAND PROCESSING ;============================================================================= ; +; RUN AN ATA COMMAND. THERE ARE TWO ENTRY POINTS. THE NORMAL ENTRY +; POINT WILL WAIT FOR DRIVE READY. THE _ND ENTRY POINT ONLY WAITS +; FOR THE DEVICE TO BE NOT BUSY. THE CORRECT ENTRY POINT DEPENDS ON +; THE COMMAND. +; +PPIDE_RUNCMD_ND: + CALL PPIDE_WAITBSY ; WAIT WHILE DEVICE BUSY + RET NZ ; BAIL OUT ON TIMEOUT + JR PPIDE_RUNCMD1 ; CONTINUE + PPIDE_RUNCMD: CALL PPIDE_WAITRDY ; WAIT FOR DRIVE READY RET NZ ; BAIL OUT ON TIMEOUT ; +PPIDE_RUNCMD1: LD A,(PPIDE_CMD) ; GET THE COMMAND #IF (PPIDETRACE >= 3) CALL PC_SPACE @@ -811,54 +1012,153 @@ PPIDE_RUNCMD: JP NZ,PPIDE_CMDERR RET ; +; PACKET COMMAND PROCESSOR +; HL: ADDRESS OF PACKET COMMAND BUFFER +; +PPIDE_RUNPCMD: + PUSH HL + CALL PPIDE_PACKET + POP HL + RET NZ ; BAIL OUT ON ERROR +; +#IF (PPIDETRACE >= 3) + PRTS("\r\nPKTCMD:$") + PUSH HL + POP DE + LD A,12 + CALL PRTHEXBUF +#ENDIF +; + ; IF ZIP DRIVE HAS FALLEN ASLEEP, THEN IT WILL NEED EXTRA + ; TIME HERE TO WAKE UP BEFORE ACCEPTING THE COMMAND. USE + ; LONG TIMEOUT TO ACCOMMODATE THIS. + LD DE,(PPIDE_TIMEOUT) ; GET CURRENT TIMEOUT + PUSH DE ; SAVE IT + LD DE,PPIDE_TOSLOW ; SLOW TIMEOUT FOR THIS + LD (PPIDE_TIMEOUT),DE ; SET IT + LD B,6 ; 6 WORDS ALWAYS + CALL PPIDE_PUT + POP DE ; RECOVER TIMEOUT + LD (PPIDE_TIMEOUT),DE ; SET IT + RET NZ +; + CALL PPIDE_IN + .DB PPIDE_REG_STAT + BIT 3,A ; IS DRQ SET? + RET Z ; IF NOT, ALL DONE +; + CALL PPIDE_IN + .DB PPIDE_REG_BCL + LD C,A + CALL PPIDE_IN + .DB PPIDE_REG_BCH + LD B,A +; + ; BELOW ASSUMES MAX TRANSFER OF 512 BYTES!!! + PUSH BC ; SAVE BYTE COUNT + SRL B ; CONVERT + RR C ; ... TO WORDS + LD B,C + ;LD HL,HB_WRKBUF ; SET XFR BUFFER + LD HL,(PPIDE_DSKBUF) ; SET XFR BUFFER + + LD A,(PPIDE_XFRDIR) + OR A + JR NZ,PPIDE_RUNPCMD2 ; NZ = WRITE + CALL PPIDE_GET ; GET SOME DATA + JR PPIDE_RUNPCMD3 +PPIDE_RUNPCMD2: + CALL PPIDE_PUT ; PUT SOME DATA +PPIDE_RUNPCMD3: + POP BC ; RESTORE BYTE COUNT + RET NZ ; BAIL OUT ON ERRORS +; + XOR A + RET +; +; THE FOLLOWING IS USED TO ASSESS ANY ERROR THAT OCCURS DURING +; RUNCMD AND SET AN APPROPRIATE ERROR CODE. ; +PPIDE_CHKPCMD: +; + LD HL,HB_WRKBUF + LD (PPIDE_DSKBUF),HL + LD HL,PPIDE_PKTCMD_SENSE + CALL PPIDE_RUNPCMD + RET NZ +; + CALL PPIDE_IN + .DB PPIDE_REG_BCL +; +#IF (PPIDETRACE >= 3) + CALL NEWLINE + LD DE,HB_WRKBUF + CALL PRTHEXBUF +#ENDIF +; + ; ASSESS SENSE DATA AND SET APPROPRIATE ERROR + LD A,(HB_WRKBUF+12) + CP $3A + JP Z,PPIDE_NOMEDIA + CP $04 + JP Z,PPIDE_NOTRDY +; + JP PPIDE_CMDERR +; +; HL=BUFFER ; PPIDE_GETBUF: + LD B,0 + ; FALL THRU!!! +; +; HL=BUFFER +; B=WORD COUNT, 0=256 +; +PPIDE_GET: #IF (PPIDETRACE >= 3) - PRTS(" GETBUF$") + PRTS(" GET$") #ENDIF ; ; WAIT FOR BUFFER + PUSH BC + PUSH HL CALL PPIDE_WAITDRQ ; WAIT FOR BUFFER READY + POP HL + POP BC RET NZ ; BAIL OUT IF TIMEOUT ; ; SETUP PPI TO READ LD A,PPIDE_DIR_READ ; SET DATA BUS DIRECTION TO READ - ;OUT (PPIDE_IO_PPI),A ; DO IT + ;OUT (PPIDE_REG_PPI),A ; DO IT LD C,(IY+PPIDE_PPI) ; PPI CONTROL WORD OUT (C),A ; WRITE IT ; ; SELECT READ/WRITE IDE REGISTER LD A,PPIDE_REG_DATA ; DATA REGISTER - ;OUT (PPIDE_IO_CTL),A ; DO IT + ;OUT (PPIDE_REG_CTL),A ; DO IT LD C,(IY+PPIDE_CTL) ; SET IDE ADDRESS OUT (C),A ; DO IT LD E,A ; E := READ UNASSERTED XOR PPIDE_CTL_DIOR ; SWAP THE READ LINE BIT LD D,A ; D := READ ASSERTED ; - ; LOOP SETUP - XOR A ; IMPORTANT, NEEDED FOR LOOP END COMPARISON - LD B,0 ; 256 ITERATIONS + LD A,B ; LOOP COUNTER IN A LD C,(IY+PPIDE_CTL) ; SET IDE ADDRESS -; BIT 1,(IY+PPIDE_ACC) ; 8 BIT? - JR Z,PPIDE_GETBUF1 ; IF NOT, DO 16 BIT - CALL PPIDE_GETBUF8 ; FIRST PASS (FIRST 256 BYTES) - CALL PPIDE_GETBUF8 ; SECOND PASS (LAST 256 BYTES) - JR PPIDE_GETBUF2 ; CONTINUE -PPIDE_GETBUF1: - CALL PPIDE_GETBUF16 ; FIRST PASS (FIRST 256 BYTES) - CALL PPIDE_GETBUF16 ; SECOND PASS (LAST 256 BYTES) -PPIDE_GETBUF2: + JR Z,PPIDE_GET1 ; IF NOT, DO 16 BIT + CALL PPIDE_GET8 ; 8-BIT READ + JR PPIDE_GET2 ; CONTINUE +PPIDE_GET1: + CALL PPIDE_GET16 ; 16-0BIT READ +PPIDE_GET2: CALL PPIDE_WAITRDY ; PROBLEMS IF THIS IS REMOVED! RET NZ CALL PPIDE_GETRES JP NZ,PPIDE_IOERR RET ; -PPIDE_GETBUF8: ; 8 BIT WIDE READ LOOP - ; ENTER W/ C = PPIDE_IO_CTL +PPIDE_GET8: ; 8 BIT WIDE READ LOOP + ; ENTER W/ C = PPIDE_REG_CTL OUT (C),D ; ASSERT READ DEC C ; CTL -> MSB DEC C ; MSB -> LSB @@ -866,12 +1166,19 @@ PPIDE_GETBUF8: ; 8 BIT WIDE READ LOOP INC C ; LSB -> MSB INC C ; MSB -> CTL OUT (C),E ; DEASSERT READ - CP B ; B == A == 0? - JR NZ,PPIDE_GETBUF8 ; LOOP UNTIL DONE + OUT (C),D ; ASSERT READ + DEC C ; CTL -> MSB + DEC C ; MSB -> LSB + INI ; READ FROM LSB + INC C ; LSB -> MSB + INC C ; MSB -> CTL + OUT (C),E ; DEASSERT READ + DEC A + JR NZ,PPIDE_GET8 ; LOOP UNTIL DONE RET ; -PPIDE_GETBUF16: ; 16 BIT WIDE READ LOOP - ; ENTER W/ C = PPIDE_IO_CTL +PPIDE_GET16: ; 16 BIT WIDE READ LOOP + ; ENTER W/ C = PPIDE_REG_CTL OUT (C),D ; ASSERT READ DEC C ; CTL -> MSB DEC C ; MSB -> LSB @@ -880,30 +1187,41 @@ PPIDE_GETBUF16: ; 16 BIT WIDE READ LOOP INI ; READ MSB FOR 16 BIT INC C ; MSB -> CTL OUT (C),E ; DEASSERT READ - CP B ; B == A == 0? - JR NZ,PPIDE_GETBUF16 ; LOOP UNTIL DONE + DEC A + JR NZ,PPIDE_GET16 ; LOOP UNTIL DONE RET ; -; +; HL=BUFFER ; PPIDE_PUTBUF: + LD B,0 + ; FALL THRU!!! +; +; HL=BUFFER +; B=WORD COUNT, 0=256 +; +PPIDE_PUT: #IF (PPIDETRACE >= 3) - PRTS(" PUTBUF$") + PRTS(" PUT$") #ENDIF ; ; WAIT FOR BUFFER + PUSH BC + PUSH HL CALL PPIDE_WAITDRQ ; WAIT FOR BUFFER READY + POP HL + POP BC RET NZ ; BAIL OUT IF TIMEOUT ; ; SETUP PPI TO WRITE LD A,PPIDE_DIR_WRITE ; SET DATA BUS DIRECTION TO WRITE - ;OUT (PPIDE_IO_PPI),A ; DO IT + ;OUT (PPIDE_REG_PPI),A ; DO IT LD C,(IY+PPIDE_PPI) ; PPI CONTROL WORD OUT (C),A ; WRITE IT ; ; SELECT READ/WRITE IDE REGISTER LD A,PPIDE_REG_DATA ; DATA REGISTER - ;OUT (PPIDE_IO_CTL),A ; DO IT + ;OUT (PPIDE_REG_CTL),A ; DO IT LD C,(IY+PPIDE_CTL) ; SET IDE ADDRESS OUT (C),A ; DO IT LD E,A ; E := WRITE UNASSERTED @@ -911,26 +1229,29 @@ PPIDE_PUTBUF: LD D,A ; D := WRITE ASSERTED ; ; LOOP SETUP - XOR A ; IMPORTANT, NEEDED FOR LOOP END COMPARISON - LD B,0 ; 256 ITERATIONS + LD A,B ; LOOP COUNTER IN A LD C,(IY+PPIDE_CTL) ; SET IDE ADDRESS -; BIT 1,(IY+PPIDE_ACC) ; 8 BIT? - JR Z,PPIDE_PUTBUF1 ; IF NOT, DO 16 BIT - CALL PPIDE_PUTBUF8 ; FIRST PASS (FIRST 256 BYTES) - CALL PPIDE_PUTBUF8 ; SECOND PASS (LAST 256 BYTES) - JR PPIDE_PUTBUF2 ; CONTINUE -PPIDE_PUTBUF1: - CALL PPIDE_PUTBUF16 ; FIRST PASS (FIRST 256 BYTES) - CALL PPIDE_PUTBUF16 ; SECOND PASS (LAST 256 BYTES) -PPIDE_PUTBUF2: + JR Z,PPIDE_PUT1 ; IF NOT, DO 16 BIT + CALL PPIDE_PUT8 ; SECOND PASS (LAST 256 BYTES) + JR PPIDE_PUT2 ; CONTINUE +PPIDE_PUT1: + CALL PPIDE_PUT16 ; FIRST PASS (FIRST 256 BYTES) +PPIDE_PUT2: CALL PPIDE_WAITRDY ; PROBLEMS IF THIS IS REMOVED! RET NZ CALL PPIDE_GETRES JP NZ,PPIDE_IOERR RET ; -PPIDE_PUTBUF8: ; 8 BIT WIDE WRITE LOOP +PPIDE_PUT8: ; 8 BIT WIDE WRITE LOOP + DEC C ; CTL -> MSB + DEC C ; MSB -> LSB + OUTI ; WRITE NEXT BYTE (LSB) + INC C ; LSB -> MSB + INC C ; MSB -> CTL + OUT (C),D ; ASSERT WRITE + OUT (C),E ; DEASSERT WRITE DEC C ; CTL -> MSB DEC C ; MSB -> LSB OUTI ; WRITE NEXT BYTE (LSB) @@ -938,11 +1259,11 @@ PPIDE_PUTBUF8: ; 8 BIT WIDE WRITE LOOP INC C ; MSB -> CTL OUT (C),D ; ASSERT WRITE OUT (C),E ; DEASSERT WRITE - CP B ; B == A == 0? - JR NZ,PPIDE_PUTBUF8 ; LOOP UNTIL DONE + DEC A + JR NZ,PPIDE_PUT8 ; LOOP UNTIL DONE RET ; -PPIDE_PUTBUF16: ; 16 BIT WIDE WRITE LOOP +PPIDE_PUT16: ; 16 BIT WIDE WRITE LOOP DEC C ; CTL -> MSB DEC C ; MSB -> LSB OUTI ; WRITE NEXT BYTE (LSB) @@ -951,8 +1272,8 @@ PPIDE_PUTBUF16: ; 16 BIT WIDE WRITE LOOP INC C ; MSB -> CTL OUT (C),D ; ASSERT WRITE OUT (C),E ; DEASSERT WRITE - CP B ; B == A == 0? - JR NZ,PPIDE_PUTBUF16 ; LOOP UNTIL DONE + DEC A + JR NZ,PPIDE_PUT16 ; LOOP UNTIL DONE RET ; ; @@ -982,7 +1303,7 @@ PPIDE_GETRES: ; HARDWARE INTERFACE ROUTINES ;============================================================================= ; -; SOFT RESET OF ALL DEVICES ON BUS +; RESET ALL DEVICES ON BUS ; PPIDE_RESET: #IF (PPIDETRACE >= 3) @@ -990,91 +1311,112 @@ PPIDE_RESET: PRTS(" RESET$") #ENDIF ; - ; OLDER CF CARDS DO NOT SEEM TO SET THE - ; REGISTERS ON RESET, SO HERE WE FAKE THINGS BY - ; SETTING THEM AS A RESET WOULD -#IF (PPIDETRACE >= 3) - PRTS(" FAKE$") -#ENDIF - XOR A - ;OUT (IDE_IO_CYLLO),A - CALL PPIDE_OUT - .DB PPIDE_REG_CYLLO - ;OUT (IDE_IO_CYLHI),A - CALL PPIDE_OUT - .DB PPIDE_REG_CYLHI - INC A - ;OUT (IDE_IO_COUNT),A - CALL PPIDE_OUT - .DB PPIDE_REG_COUNT - ;OUT (IDE_IO_SECT),A - CALL PPIDE_OUT - .DB PPIDE_REG_SECT +; HARD RESET +; +; RESET LINE IS NORMALLY PULSED AT POWER ON. HOWEVER, THIS IS NOT +; DONE FOR PPIDE DEVICES, SO WE DO IT NOW. ; ; SETUP PPI TO READ LD A,PPIDE_DIR_READ ; SET DATA BUS DIRECTION TO READ - ;OUT (PPIDE_IO_PPI),A ; DO IT + ;OUT (PPIDE_REG_PPI),A ; DO IT LD C,(IY+PPIDE_PPI) ; PPI CONTROL WORD OUT (C),A ; WRITE IT ; -; IF A DSKYNG IS ACTIVE AND IS ON THE SAME PPI PORT AS THE PPISD BEING +; IF A DSKYNG IS ACTIVE AND IS ON THE SAME PPI PORT AS THE PPIDE BEING ; RESET, THEN THE DSKYNG WILL ALSO BE RESET. SO, THE RESET CODE IS ; BRACKETED WITH CODE TO SAVE AND RESTORE THE STATE OF THE DSKYNG. ; THERE IS NO CHECK FOR THE SPECIFIC PPI PORT SINCE IT DOES NO HARM ; IF THE DSKYNG IS SAVED AND RESTORED. ; +; THIS DOES NOT TEST THAT A DSKYNG IS ACTUALLY PRESENT +; AND OPERATING -- COULD CAUSE PROBLEMS +; #IF (DSKYENABLE) - #IF (DSKYMODE == DSKYMODE_NG) - ; SAVE CONTENTS OF DSKY DISPLAY ACROSS RESET + #IF (PKDENABLE) + ; SAVE CONTENTS OF DSKYNG DISPLAY ACROSS RESET LD B,8 LD C,0 LD HL,DSKY_BUF - CALL DSKY_GETSTR + CALL PKD_GETSTR #ENDIF #ENDIF ; ; PULSE IDE RESET LINE +#IF (PPIDETRACE >= 3) + PRTS(" HARD$") +#ENDIF LD A,PPIDE_CTL_RESET - ;OUT (PPIDE_IO_CTL),A + ;OUT (PPIDE_REG_CTL),A LD C,(IY+PPIDE_CTL) ; SET IDE ADDRESS OUT (C),A - LD DE,20 + LD DE,20 ; DELAY 320US (SPEC IS >= 25US) CALL VDELAY XOR A - ;OUT (PPIDE_IO_CTL),A + ;OUT (PPIDE_REG_CTL),A OUT (C),A LD DE,20 CALL VDELAY -; +; #IF (DSKYENABLE) - #IF (DSKYMODE == DSKYMODE_NG) - ; REININT DSKY AND RESTORE CONTENTS - CALL DSKY_REINIT + #IF (PKDENABLE) + ; REININT DSKYNG AND RESTORE CONTENTS + CALL PKD_REINIT LD B,8 LD C,0 LD HL,DSKY_BUF - CALL DSKY_PUTSTR + CALL PKD_PUTSTR #ENDIF #ENDIF ; - LD A,%00001010 ; SET ~IEN, NO INTERRUPTS +; SOME CF CARDS AND CF CARD EMULATORS NEED A LITTLE TIME TO +; "BOOT" THEIR INTERNAL ELECTRONICS, SO THEY CANNOT ASSERT BUSY +; IMMEDIATELY. A SMALL WAIT IS PERFORMED HERE TO GIVE SUCH DEVICES +; A BETTER CHANCE TO SUCCEED LATER. +; +; LD DE,150000 / 16 ; + LD DE,300000 / 16 ; + CALL VDELAY ; SMALL DELAY +; + JR PPIDE_RESET3 ; SKIP SOFT RESET +; +; SOFT RESET +; +; RC CANNOT ACCESS DEVICE CONTROL REG, SO SKIP THIS +; +PPIDE_RESET2: + ; INITIATE SOFT RESET +#IF (IDETRACE >= 3) + PRTS(" SOFT$") +#ENDIF + LD A,%00001110 ; ASSERT RESET, NO INTERRUPTS ;OUT (PPIDE_REG_CTRL),A CALL PPIDE_OUT .DB PPIDE_REG_CTRL + LD DE,20 ; DELAY 320US (SPEC IS >= 25US) + CALL VDELAY ; -; SPEC ALLOWS UP TO 450MS FOR DEVICES TO ASSERT THEIR PRESENCE -; VIA -DASP. I ENCOUNTER PROBLEMS LATER ON IF I DON'T WAIT HERE -; FOR THAT TO OCCUR. THUS FAR, IT APPEARS THAT 150MS IS SUFFICIENT -; FOR ANY DEVICE ENCOUNTERED. MAY NEED TO EXTEND BACK TO 500MS -; IF A SLOWER DEVICE IS ENCOUNTERED. +PPIDE_RESET3: ; - ;LD DE,500000/16 ; ~500MS - LD DE,150000/16 ; ~???MS +; CONFIGURE OPERATION AND END SOFT RESET +; +#IF (PPIDETRACE >= 3) + PRTS(" CONFIG$") +#ENDIF + LD A,%00001010 ; DEASSERT RESET, NO INTERRUPTS + ;OUT (PPIDE_REG_CTRL),A + CALL PPIDE_OUT + .DB PPIDE_REG_CTRL + LD DE,20 ; DELAY 320US (SPEC IS >= 25US) CALL VDELAY +; +PPIDE_RESET5: + LD HL,PPIDE_TONORM ; NORMAL TIMEOUT NOW + LD (PPIDE_TIMEOUT),HL ; AND RESTORE IT ; ; INITIALIZE THE INDIVIDUAL UNITS (MASTER AND SLAVE). ; BASED ON TESTING, IT APPEARS THAT THE MASTER UNIT MUST ; BE DONE FIRST OR THIS BEHAVES BADLY. +; PUSH IY ; SAVE CFG PTR BIT 0,(IY+PPIDE_ACC) ; MASTER? CALL Z,PPIDE_GOPARTNER ; IF NOT, SWITCH TO MASTER @@ -1082,7 +1424,7 @@ PPIDE_RESET: CALL PPIDE_GOPARTNER ; POINT TO SLAVE CALL PPIDE_INITUNIT ; INIT PARTNER UNIT POP IY ; RECOVER ORIG CFG PTR -; +; XOR A ; SIGNAL SUCCESS RET ; AND DONE ; @@ -1092,14 +1434,10 @@ PPIDE_INITUNIT: CALL PPIDE_SELUNIT ; SELECT UNIT RET NZ ; ABORT IF ERROR - LD HL,PPIDE_TIMEOUT ; POINT TO TIMEOUT - LD (HL),PPIDE_TONORM ; SET NORMAL TIMEOUT - CALL PPIDE_PROBE ; DO PROBE RET NZ ; JUST RETURN IF NOTHING THERE - CALL PPIDE_INITDEV ; IF FOUND, ATTEMPT TO INIT DEVICE - RET ; DONE + JP PPIDE_INITDEV ; EXIT VIA INITDEV ; ; TAKE ANY ACTIONS REQUIRED TO SELECT DESIRED PHYSICAL UNIT ; @@ -1111,10 +1449,16 @@ PPIDE_SELUNIT: BIT 0,(IY+PPIDE_ACC) ; MASTER? JR Z,PPIDE_SELUNIT1 ; HANDLE SLAVE LD A,PPIDE_DRVMASTER ; MASTER - JR PPIDE_SELUNIT2 -PPIDE_SELUNIT1: +#IF (PPIDETRACE >= 3) + PRTS(" MASTER$") +#ENDIF + JR PPIDE_SELUNIT2 +PPIDE_SELUNIT1: LD A,PPIDE_DRVSLAVE ; SLAVE -PPIDE_SELUNIT2: +#IF (PPIDETRACE >= 3) + PRTS(" SLAVE$") +#ENDIF +PPIDE_SELUNIT2: LD (PPIDE_DRVHD),A ; SAVE IT XOR A ; SUCCESS RET @@ -1122,129 +1466,149 @@ PPIDE_SELUNIT2: ; ; PPIDE_PROBE: +; +; PROBE FOR A DRIVE ON THE INTERFACE (EITHER MASTER OR SLAVE). +; IDEALLY, THIS IS BEING CALLED IMMEDIATELY AFTER A HARD OR SOFT +; INTERFACE RESET. HOWEVER, THERE ARE SOME HARDWARE IMPLEMENTATTIONS +; WHICH ARE CAPABLE OF NEITHER A HARD NOR SOFT RESET. SO THIS +; CODE SHOULD TRY TO HANDLE THE SCENARIO WHERE NO INTERFACE RESET +; HAS OCCURRED. +; #IF (PPIDETRACE >= 3) CALL PPIDE_PRTPREFIX PRTS(" PROBE$") ; LABEL FOR IO ADDRESS #ENDIF ; +#IF (PPIDETRACE >= 3) + CALL PPIDE_IN + .DB PPIDE_REG_STAT + CALL PC_SPACE + CALL PRTHEXBYTE +#ENDIF +; + ; SELECT DEVICE (MASTER/SLAVE) LD A,(PPIDE_DRVHD) - ;OUT (IDE_IO_DRVHD),A + ;OUT (IDE_REG_DRVHD),A CALL PPIDE_OUT .DB PPIDE_REG_DRVHD #IF (PPIDETRACE >= 3) CALL PC_SPACE CALL PRTHEXBYTE #ENDIF - CALL DELAY ; DELAY ~16US ; - ; BELOW TESTS FOR EXISTENCE OF AN IDE CONTROLLER ON THE - ; PPIDE INTERFACE. WE WRITE A VALUE OF ZERO FIRST SO THAT - ; THE PPI BUS HOLD WILL RETURN A VALUE OF ZERO IF THERE IS - ; NOTHING CONNECTED TO PPI PORT A. THEN WE READ THE STATUS - ; REGISTER. IF AN IDE CONTROLLER IS THERE, IT SHOULD ALWAYS - ; RETURN SOMETHING OTHER THAN ZERO. IF AN IDE CONTROLLER IS - ; THERE, THEN THE VALUE WRITTEN TO PPI PORT A IS IGNORED - ; BECAUSE THE WRITE SIGNAL IS NEVER PULSED. - XOR A - ;OUT (PPIDE_IO_DATALO),A - LD C,(IY+PPIDE_DATALO) ; PPI PORT A, DATALO - OUT (C),A -; IN A,(PPIDE_REG_STAT) ; GET STATUS +; IF WE GET HERE AND THE DRIVE IS STILL INITIALIZING, WE NEED TO +; WAIT UNTIL THE DRIVE IS READY. IN THIS CASE BUSY *WILL* BE HIGH. +; BASED ON TESTING, DRDY AND DSC VALUES VARY. EVERYTHING ELSE SEEMS +; TO BE ZERO. SO, WE FILTER OUT DRDY & DSC, THEN LOOK FOR BUSY=1 +; AND ALL ELSE ZERO. THIS GENERALLY AVOIDS VALUES THAT ARE TYPICAL +; FOR FLOATING PORTS AND SO CAN BE USED TO DETERMINE IF WE NEED TO +; WAIT FOR THE DEVICE TO BE READY. THIS WAIT IS MANDATORY BECAUSE +; SOME (IF NOT ALL) DEVICES WILL NOT PERSIST REGISTER VALUES UNTIL +; THE DRIVE IS READY. +; CALL PPIDE_IN .DB PPIDE_REG_STAT #IF (PPIDETRACE >= 3) CALL PC_SPACE CALL PRTHEXBYTE #ENDIF - OR A - JP Z,PPIDE_NOMEDIA +; + AND %10101111 ; FILTER OUT DRDY & DSC + CP $80 ; INIT IN PROGRESS? + JR NZ,PPIDE_PROBE1 ; IF NOT, SKIP AHEAD ; #IF (PPIDETRACE >= 3) - CALL PPIDE_REGDUMP + PRTS(" WAIT$") #ENDIF ; - ;JR PPIDE_PROBE1 ; *DEBUG* -; -PPIDE_PROBE0: + LD HL,(PPIDE_TIMEOUT) ; GET CURRENT TIMEOUT + PUSH HL ; SAVE IT + LD HL,PPIDE_TOSLOW ; SLOW TIMEOUT FOR THIS + LD (PPIDE_TIMEOUT),HL ; SET IT CALL PPIDE_WAITBSY ; WAIT FOR BUSY TO CLEAR - JP NZ,PPIDE_NOMEDIA ; CONVERT TIMEOUT TO NO MEDIA AND RETURN + POP HL ; RECOVER TIMEOUT + LD (PPIDE_TIMEOUT),HL ; SET IT ; #IF (PPIDETRACE >= 3) - CALL PPIDE_REGDUMP -#ENDIF -; - ; CHECK STATUS -; IN A,(PPIDE_REG_STAT) ; GET STATUS CALL PPIDE_IN .DB PPIDE_REG_STAT -#IF (PPIDETRACE >= 3) CALL PC_SPACE - CALL PRTHEXBYTE ; IF DEBUG, PRINT STATUS + CALL PRTHEXBYTE #ENDIF - OR A ; SET FLAGS TO TEST FOR ZERO - JP Z,PPIDE_NOMEDIA ; CONTINUE IF NON-ZERO ; - ; CHECK SIGNATURE -#IF (PPIDETRACE >= 3) - CALL PC_SPACE -#ENDIF - ;IN A,(PPIDE_REG_COUNT) +; TEST FOR PRESENCE OF IDE REGISTERS. USE LBA0/1 TO SEE +; IF VALUE CAN BE PERSISTED. THE USE OF BOTH LBA0 AND LBA1 +; IS TO MAINTAIN CONSISTENCY WITH THE THE PPIDE DRIVER BECAUSE +; PPI ITSELF WILL PERSIST THE LAST VALUE WRITTEN, SO WE USE +; MULTIPLE REGISTERS TO WORK AROUND THIS FALSE POSITIVE. +; +PPIDE_PROBE1: + ; $AA -> LBA0 + LD A,$AA + CALL PPIDE_OUT + .DB PPIDE_REG_LBA0 +; + ; $55 => LBA1 + LD A,$55 + CALL PPIDE_OUT + .DB PPIDE_REG_LBA1 +; + ; TEST LBA0 == $AA CALL PPIDE_IN - .DB PPIDE_REG_COUNT -#IF (PPIDETRACE >= 3) - CALL PRTHEXBYTE -#ENDIF - CP $01 - JP NZ,PPIDE_NOMEDIA + .DB PPIDE_REG_LBA0 #IF (PPIDETRACE >= 3) CALL PC_SPACE -#ENDIF - ;IN A,(PPIDE_REG_SECT) - CALL PPIDE_IN - .DB PPIDE_REG_SECT -#IF (PPIDETRACE >= 3) CALL PRTHEXBYTE #ENDIF - CP $01 + CP $AA JP NZ,PPIDE_NOMEDIA -#IF (PPIDETRACE >= 3) - CALL PC_SPACE -#ENDIF - ;IN A,(PPIDE_REG_CYLLO) +; + ; TEST LBA1 == $55 CALL PPIDE_IN - .DB PPIDE_REG_CYLLO + .DB PPIDE_REG_LBA1 #IF (PPIDETRACE >= 3) + CALL PC_SPACE CALL PRTHEXBYTE #ENDIF - CP $00 + CP $55 JP NZ,PPIDE_NOMEDIA +; #IF (PPIDETRACE >= 3) - CALL PC_SPACE -#ENDIF - ;IN A,(PPIDE_REG_CYLHI) - CALL PPIDE_IN - .DB PPIDE_REG_CYLHI -#IF (PPIDETRACE >= 3) - CALL PRTHEXBYTE + CALL PPIDE_REGDUMP #ENDIF - CP $00 - JP NZ,PPIDE_NOMEDIA ; -PPIDE_PROBE1: - ; SIGNATURE MATCHES ATA DEVICE, RECORD TYPE AND RETURN SUCCESS - LD A,PPIDE_TYPEATA ; TYPE = ATA - LD (IY+PPIDE_TYPE),A ; SET IT IN INSTANCE DATA - XOR A ; SIGNAL SUCCESS - RET ; DONE, NOTE THAT A=0 AND Z IS SET + XOR A + RET ; ; (RE)INITIALIZE DEVICE ; PPIDE_INITDEV: ; - LD A,(IY+PPIDE_TYPE) ; GET THE DEVICE TYPE - OR A ; SET FLAGS - JP Z,PPIDE_NOMEDIA ; EXIT SETTING NO MEDIA STATUS +#IF (PPIDETRACE >= 3) + CALL PPIDE_PRTPREFIX + PRTS(" INITDEV$") ; LABEL FOR IO ADDRESS +#ENDIF +; +#IF (PPIDETRACE >= 3) + CALL PPIDE_REGDUMP +#ENDIF +; +; ON ENTRY, WE HAVE ALREADY CHECKED THAT THE BUSY BIT IS CLEARED AND +; DRDY SHOULD BE SET. IF DRDY IS NOT SET, IF COULD MEAN EITHER A +; NON-EXISTENT SLAVE DEVICE OR AN ATAPI DEVICE. TO AVOID UNNECESSARY +; TIMEOUTS, WE CHECK FOR DRDY. IF IT IS NOT SET, THEN WE ASSUME THIS +; MUST BE AN ATAPI DEVICE AND GO TRY TO DO THE ATAPI INITIALIZATION. +; IF THIS WAS ACTUALLY A NON-EXISTENT SLAVE, THE ATAPI INITIALIZATION +; WILL HANDLE THIS PRETTY WELL. +; + CALL PPIDE_IN + .DB PPIDE_REG_STAT + BIT 6,A ; DRDY? + JR Z,PPIDE_INITPDEV ; ODD, MIGHT BE ATAPI + +; +; WE NEED TO SETUP 8-BIT MODE BEFORE DOING ANYTHING ELSE ; BIT 1,(IY+PPIDE_ACC) ; 8 BIT ACCESS? JR Z,PPIDE_INITDEV0 ; NO, DO 16 BIT INIT @@ -1262,22 +1626,23 @@ PPIDE_INITDEV0: ; PPIDE_INITDEV00: ; + ; WE NOW USE AN IDENTIFY DEVICE COMMAND TO CONFIRM THE + ; DEVICE IS REALLY THERE AND GET SOME ATTRIBUTES. IF THE + ; COMMAND FAILS, IT MAY BE THAT WE HAVE AN ATAPI DEVICE AND + ; SO WE GO TO THE ATAPI INITIALIZATION ON FAILURE. CALL PPIDE_IDENTIFY ; EXECUTE PPIDENTIFY COMMAND - RET NZ ; BAIL OUT ON ERROR + JR NZ,PPIDE_INITPDEV ; TRY ATAPI ON FAILURE +; + ; DECLARE WE ARE ATA + LD A,PPIDE_TYPEATA ; OTHERWISE TYPE=ATA + LD (IY+PPIDE_TYPE),A ; SET IT IN INSTANCE DATA ; LD DE,HB_WRKBUF ; POINT TO BUFFER -#IF (PPIDETRACE >= 3) +#IF (PPIDETRACE >= 4) CALL DUMP_BUFFER ; DUMP IT IF DEBUGGING #ENDIF ; LD (IY+PPIDE_MED),0 ; CLEAR MEDIA FLAGS -; - ; DETERMINE IF CF DEVICE BY TESTING FOR CF CARD SIGNATURES - ; IN THEORY, THERE ARE SOME OTHER POSSIBLE VARIATIONS, BUT - ; THEY ARE NOT RECOMMENDED BY THE CF CARD SPEC AND MIGHT - ; OVERLAP WITH "REAL" HARD DISK SIGNATURES. I HAVE NEVER - ; SEEN A CF CARD THAT DID NOT USE ONE OF THE BELOW. - ; CREDIT TO LASZLO SZOLNOKI ; #IF (PPIDETRACE >= 3) CALL PPIDE_PRTPREFIX @@ -1286,38 +1651,15 @@ PPIDE_INITDEV00: CALL PRTHEXWORD #ENDIF ; -; SEE PAGE 114 OF CF+ & CF SPECIFICATION REV. 3.0 FOR CF CARD -; SIGNATURE VALUES. ALL OF THE BELOW ARE DOCUMENTED THERE EXCEPT -; $045A WHICH IS A VALUE DISCOVERED ON A CF<->SD CARD ADAPTER. -; -; SIGNATURE $045A IS NOT LISTED IN THE CF SPEC. IT WAS ADDED BECAUSE -; IT WAS SEEN IN THE WILD ON A CF-SD ADAPTER. HOWEVER IT HAS NOW -; ALSO BEEN SEEN ON A SPINNING HARD DISK. SINCE IT IS AMBIGUOUS, I -; WILL CONSIDER IT TO BE A HARD DISK. -; - LD BC,$848A ; STANDARD CF CARD SIGNATURE %1000 1111 1000 1010 - CALL PPIDE_INITDEV000 ; TEST & SET - LD BC,$044A ; ALT SIG FOR CF NON-REMOVABLE %0000 0100 0100 1010 - CALL PPIDE_INITDEV000 ; TEST & SET - ;LD BC,$045A ; ?ALT SIG FOR CF NON-REMOVABLE %0000 0100 0101 1010 - ;CALL PPIDE_INITDEV000 ; TEST & SET - LD BC,$0040 ; ALT SIG FOR CF NON-REMOVABLE %0000 0000 0100 0000 - CALL PPIDE_INITDEV000 ; TEST & SET - JR PPIDE_INITDEV1 ; CONTINUE INIT -; -PPIDE_INITDEV000: - ; CHECK IF FIRST WORD OF IDENTIFY DATA MATCHES VALUE IN BC - ; AND SET CF FLAG IF SO - LD HL,(HB_WRKBUF) ; FIRST WORD OF IDENTIFY DATA - OR A ; CLEAR CARRY - SBC HL,BC ; COMPARE - RET NZ ; ABORT IF NOT EQUAL + ; DETERMINE IF COMPACTFLASH MEDIA + LD A,(HB_WRKBUF+(83*2)) ; LOW BYTE OF WORD 83 + BIT 2,A ; TEST CFA FEATURE SET BIT + JR Z,PPIDE_INITDEV1 ; IF NOT, SKIP SET 0,(IY+PPIDE_MED) ; ELSE SET FLAGS BIT FOR CF MEDIA - RET ; AND RETURN ; PPIDE_INITDEV1: ; DETERMINE IF LBA CAPABLE - LD A,(HB_WRKBUF+98+1) ; GET BYTE WITH LBA BIT FROM BUFFER + LD A,(HB_WRKBUF+98+1) ; HIGH BYTE OF WORD 49 BIT 1,A ; CHECK THE LBA BIT JR Z,PPIDE_INITDEV2 ; NOT SET, BYPASS SET 1,(IY+PPIDE_MED) ; SET FLAGS BIT FOR LBA @@ -1334,12 +1676,126 @@ PPIDE_INITDEV2: POP BC ; RECOVER POINTER TO CAPACITY ENTRY CALL ST32 ; SAVE CAPACITY ; - ; RESET CARD STATUS TO 0 (OK) + ; RECORD STATUS OK XOR A ; A := 0 (STATUS = OK) LD (IY+PPIDE_STAT),A ; SAVE IT ; RET ; RETURN, A=0, Z SET ; +; (RE)INITIALIZE PACKET DEVICE +; +PPIDE_INITPDEV: +; +#IF (PPIDETRACE >= 3) + CALL PPIDE_PRTPREFIX + PRTS(" INITPDEV$") ; LABEL FOR IO ADDRESS +#ENDIF +; + CALL PPIDE_IDENTIFYPACKET ; EXECUTE IDENTIFY COMMAND + RET NZ ; BAIL OUT ON ERROR +; + ; DECLARE WE ARE ATAPI + LD A,PPIDE_TYPEATAPI ; OTHERWISE TYPE=ATAPI + LD (IY+PPIDE_TYPE),A ; SET IT IN INSTANCE DATA +; + LD DE,HB_WRKBUF ; POINT TO BUFFER +#IF (PPIDETRACE >= 4) + CALL DUMP_BUFFER ; DUMP IT IF DEBUGGING +#ENDIF +; + LD (IY+PPIDE_MED),0 ; CLEAR FLAGS + SET 1,(IY+PPIDE_MED) ; SET FLAGS BIT FOR LBA (ASSUMED) +; + ; WAIT FOR UNIT READY + LD B,0 ; MAX LOOPS + LD C,4 ; MAX ERRORS +PPIDE_INITPDEV1: + DEC B ; CHECK LOOP COUNTER EXCEEDED + JP Z,PPIDE_NOMEDIA ; TREAT AS NO MEDIA + PUSH BC ; SAVE LOOP CONTROL + LD HL,PPIDE_PKTCMD_TSTRDY ; TEST UNIT READY + XOR A ; READ DIRECTION + LD (PPIDE_XFRDIR),A ; SAVE IT + CALL PPIDE_RUNPCMD ; ISSUE PACKET COMMAND + CALL NZ,PPIDE_CHKPCMD ; IF ERROR, DIAGNOSE IT + POP BC ; RESTORE LOOP CONTROL + JR Z,PPIDE_INITPDEV2 ; IF NO ERROR, CONTINUE + CP PPIDE_STNOMEDIA ; EXPLICIT NO MEDIA RESULT? + RET Z ; EXIT REPORTING NO MEDIA + CP PPIDE_STNOTRDY ; BECOMING READY? + JR Z,PPIDE_INITDEVP1A ; IF SO, NOT AN ERROR, LOOP + DEC C ; DEC ERROR LIMIT + RET Z ; BAIL OUT, ERR LIMIT EXCEEDED + JR PPIDE_INITPDEV1 ; LOOP +PPIDE_INITDEVP1A: + LD DE,100000/16 ; WAIT 1/10 SECOND + CALL VDELAY ; DO IT + JR PPIDE_INITPDEV1 ; AND LOOP +; +PPIDE_INITPDEV2: +#IF (PPIDETRACE >= 3) + LD A,B + NEG + PRTS("\r\nLOOPS=$") + CALL PRTHEXBYTE +#ENDIF +; + ; GET AND RECORD CAPACITY + LD HL,HB_WRKBUF + LD (PPIDE_DSKBUF),HL + LD HL,PPIDE_PKTCMD_RDCAP + XOR A ; READ DIRECTION + LD (PPIDE_XFRDIR),A ; SAVE IT + CALL PPIDE_RUNPCMD + JP NZ,PPIDE_CHKPCMD +; +#IF (PPIDETRACE >= 3) + PRTS("\r\nRDCAP:$") + LD A,8 + LD DE,HB_WRKBUF + CALL PRTHEXBUF +#ENDIF +; + ; CAPACITY IS RETURNED IN A 4 BYTE, BIG ENDIAN FIELD AND + ; INDICATES THE LAST LBA VALUE. WE NEED TO CONVERT THIS TO + ; LITTLE ENDIAN AND INCREMENT THE VALUE TO MAKE IT A CAPACITY + ; COUNT INSTEAD OF A LAST LBA VALUE. + LD A,PPIDE_MEDCAP ; OFFSET IN CFG FOR CAPACITY + CALL LDHLIYA ; POINTER TO HL + PUSH HL ; SAVE IT + LD HL,HB_WRKBUF ; POINT TO VALUE IN CMD RESULT + CALL LD32 ; LOAD IT TO DE:HL + LD A,L ; FLIP BYTES + LD L,D ; ... BIG ENDIAN + LD D,A ; ... TO LITTLE ENDIAN + LD A,H + LD H,E + LD E,A + CALL INC32 ; INCREMENT TO FINAL VALUE + POP BC ; RECOVER SAVE LOCATION + CALL ST32 ; STORE VALUE +; + ; CHECK BLOCK LENGTH. WE CURRENTLY ONLY SUPPORT 512 BYTE + ; BLOCKS. CD-ROM DEVICES (WHICH USE 2k BLOCKS) WILL FAIL + ; HERE AS NOT SUPPORTED. + LD HL,HB_WRKBUF+4 ; POINT TO BLK SIZE IN RESULT + CALL LD32 ; LOAD IT TO DE:HL + ; VALUE IS BIG ENDIAN, SO LH:ED MUST BE EXACTLY 0000:0200 + LD A,L ; CHECK THAT LH + OR H ; ... IS ZERO + JP NZ,PPIDE_NOTSUP ; IF NOT, FAIL AS NOT SUP + LD A,D ; LOAD D + OR A ; SET FLAGS + JP NZ,PPIDE_NOTSUP ; IF NOT ZERO, FAIL AS NOT SUP + LD A,E ; LOAD E + CP 2 ; CHECK IT IF IS 2 + JP NZ,PPIDE_NOTSUP ; IF NOT, FAIL AS NOT SUP +; + ; RECORD STATUS OK + XOR A ; A := 0 (STATUS = OK) + LD (IY+PPIDE_STAT),A ; SAVE IT + RET +; ; SWITCH IY POINTER FROM CURRENT UNIT CFG TO PARTNER UNIT CFG ; PPIDE_GOPARTNER: @@ -1363,7 +1819,7 @@ PPIDE_CHKERR: ; ; PPIDE_WAITRDY: - LD A,(PPIDE_TIMEOUT) ; GET TIMEOUT IN 0.05 SECS + LD A,(PPIDE_TIMEOUT) ; GET TIMEOUT IN 0.1 SECS LD B,A ; PUT IN OUTER LOOP VAR PPIDE_WAITRDY1: LD DE,(PPIDE_TOSCALER) ; CPU SPEED SCALER TO INNER LOOP VAR @@ -1385,7 +1841,7 @@ PPIDE_WAITRDY2: ; ; PPIDE_WAITDRQ: - LD A,(PPIDE_TIMEOUT) ; GET TIMEOUT IN 0.05 SECS + LD A,(PPIDE_TIMEOUT) ; GET TIMEOUT IN 0.1 SECS LD B,A ; PUT IN OUTER LOOP VAR PPIDE_WAITDRQ1: LD DE,(PPIDE_TOSCALER) ; CPU SPEED SCALER TO INNER LOOP VAR @@ -1407,14 +1863,14 @@ PPIDE_WAITDRQ2: ; ; PPIDE_WAITBSY: - LD A,(PPIDE_TIMEOUT) ; GET TIMEOUT IN 0.05 SECS + LD A,(PPIDE_TIMEOUT) ; GET TIMEOUT IN 0.1 SECS LD B,A ; PUT IN OUTER LOOP VAR PPIDE_WAITBSY1: LD DE,(PPIDE_TOSCALER) ; CPU SPEED SCALER TO INNER LOOP VAR PPIDE_WAITBSY2: ;IN A,(PPIDE_REG_STAT) ; READ STATUS - CALL PPIDE_IN ; 17TS + 170TS - .DB PPIDE_REG_STAT ; 0TS + CALL PPIDE_IN ; 17TS + 204TS + .DB PPIDE_REG_STAT LD C,A ; SAVE IT ; 4TS AND %10000000 ; TO FILL (OR READY TO FILL) ; 7TS RET Z ; 5TS @@ -1423,32 +1879,32 @@ PPIDE_WAITBSY2: OR E ; 4TS JR NZ,PPIDE_WAITBSY2 ; 12TS DJNZ PPIDE_WAITBSY1 ; ----- - JP PPIDE_BSYTO ; EXIT WITH BSYTO ERR ; 229TS + JP PPIDE_BSYTO ; EXIT WITH BSYTO ERR ; 263TS ; ; READ A VALUE FROM THE DEVICE POINTED TO BY IY AND RETURN IT IN A -; +; PPIDE_IN: EX (SP),HL ; GET PARM POINTER ; 19TS PUSH BC ; SAVE INCOMING BC ; 11TS LD A,PPIDE_DIR_READ ; SET DATA BUS DIRECTION TO READ ; 7TS - ;OUT (PPIDE_IO_PPI),A ; DO IT ; 11TS - LD C,(IY+PPIDE_PPI) ; PPI CONTROL WORD - OUT (C),A ; WRITE IT + ;OUT (PPIDE_REG_PPI),A ; DO IT + LD C,(IY+PPIDE_PPI) ; PPI CONTROL WORD ; 19TS + OUT (C),A ; WRITE IT ; 12TS ; LD B,(HL) ; GET CTL PORT VALUE ; 7TS - ;LD C,PPIDE_IO_CTL ; SETUP PORT TO WRITE ; 7TS + ;LD C,PPIDE_REG_CTL ; SETUP PORT TO WRITE ;LD C,(IY+PPIDE_CTL) ; SET IDE ADDRESS - DEC C ; SET IDE ADDRESS + DEC C ; SET IDE ADDRESS ; 4TS OUT (C),B ; SET ADDRESS LINES ; 12TS SET 6,B ; TURN ON READ BIT ; 8TS OUT (C),B ; ASSERT READ LINE ; 12TS ; - ;IN A,(PPIDE_IO_DATALO) ; GET DATA VALUE FROM DEVICE ; 11TS - DEC C - DEC C - IN A,(C) ; GET DATA VALUE FROM DEVICE - INC C - INC C + ;IN A,(PPIDE_REG_DATALO) ; GET DATA VALUE FROM DEVICE + DEC C ; 4TS + DEC C ; 4TS + IN A,(C) ; GET DATA VALUE FROM DEVICE ; 12 + INC C ; 4TS + INC C ; 4TS ; RES 6,B ; CLEAR READ BIT ; 8TS OUT (C),B ; DEASSERT READ LINE ; 12TS @@ -1456,22 +1912,22 @@ PPIDE_IN: INC HL ; POINT PAST PARM ; 6TS EX (SP),HL ; RESTORE STACK ; 19TS RET ; 10TS +; ; ----- +; OUTPUT VALUE IN A TO THE DEVICE POINTED TO BY IY ; 204TS ; -; OUTPUT VALUE IN A TO THE DEVICE POINTED TO BY IY -; PPIDE_OUT: ; *** TODO *** FIX ORDER OF SET/CLEAR WRITE LINE EX (SP),HL ; GET PARM POINTER PUSH BC ; SAVE INCOMING BC PUSH AF ; PRESERVE INCOMING VALUE LD A,PPIDE_DIR_WRITE ; SET DATA BUS DIRECTION TO WRITE - ;OUT (PPIDE_IO_PPI),A ; DO IT + ;OUT (PPIDE_REG_PPI),A ; DO IT LD C,(IY+PPIDE_PPI) ; PPI CONTROL WORD OUT (C),A ; WRITE IT POP AF ; RECOVER VALUE TO WRITE ; LD B,(HL) ; GET IDE ADDRESS VALUE - ;LD C,PPIDE_IO_CTL ; SETUP PORT TO WRITE + ;LD C,PPIDE_REG_CTL ; SETUP PORT TO WRITE ;LD C,(IY+PPIDE_CTL) ; SET IDE ADDRESS DEC C ; SET IDE ADDRESS OUT (C),B ; SET ADDRESS LINES @@ -1480,7 +1936,7 @@ PPIDE_OUT: ; DEC C DEC C - ;OUT (PPIDE_IO_DATALO),A ; SEND DATA VALUE TO DEVICE + ;OUT (PPIDE_REG_DATALO),A ; SEND DATA VALUE TO DEVICE OUT (C),A ; SEND DATA VALUE TO DEVICE INC C INC C @@ -1526,6 +1982,14 @@ PPIDE_BSYTO: LD A,PPIDE_STBSYTO JR PPIDE_ERR ; +PPIDE_NOTSUP: + LD A,PPIDE_STNOTSUP + JR PPIDE_ERR +; +PPIDE_NOTRDY: + LD A,PPIDE_STNOTRDY + JR PPIDE_ERR +; PPIDE_ERR: LD (IY+PPIDE_STAT),A ; SAVE NEW STATUS ; @@ -1543,48 +2007,67 @@ PPIDE_PRTERR: RET Z ; DONE IF NO ERRORS ; FALL THRU TO PPIDE_PRTSTAT ; -; PRINT STATUS STRING (STATUS NUM IN A) +; PRINT FULL DEVICE STATUS LINE ; PPIDE_PRTSTAT: PUSH AF PUSH DE PUSH HL LD A,(IY+PPIDE_STAT) + CP PPIDE_STINVUNIT + JR Z,PPIDE_PRTSTAT2 ; INVALID UNIT IS SPECIAL CASE + CALL PPIDE_PRTPREFIX ; PRINT UNIT PREFIX + JR PPIDE_PRTSTAT3 +PPIDE_PRTSTAT2: + CALL NEWLINE + PRTS("PPIDE:$") ; NO UNIT NUM IN PREFIX FOR INVALID UNIT +PPIDE_PRTSTAT3: + CALL PC_SPACE ; FORMATTING + CALL PPIDE_PRTSTATSTR + POP HL + POP DE + POP AF + RET +; +; PRINT STATUS STRING +; +PPIDE_PRTSTATSTR: + PUSH AF + PUSH DE + LD A,(IY+PPIDE_STAT) OR A LD DE,PPIDE_STR_STOK - JR Z,PPIDE_PRTSTAT1 + JR Z,PPIDE_PRTSTATSTR1 INC A LD DE,PPIDE_STR_STINVUNIT - JR Z,PPIDE_PRTSTAT2 ; INVALID UNIT IS SPECIAL CASE + JR Z,PPIDE_PRTSTATSTR1 INC A LD DE,PPIDE_STR_STNOMEDIA - JR Z,PPIDE_PRTSTAT1 + JR Z,PPIDE_PRTSTATSTR1 INC A LD DE,PPIDE_STR_STCMDERR - JR Z,PPIDE_PRTSTAT1 + JR Z,PPIDE_PRTSTATSTR1 INC A LD DE,PPIDE_STR_STIOERR - JR Z,PPIDE_PRTSTAT1 + JR Z,PPIDE_PRTSTATSTR1 INC A LD DE,PPIDE_STR_STRDYTO - JR Z,PPIDE_PRTSTAT1 + JR Z,PPIDE_PRTSTATSTR1 INC A LD DE,PPIDE_STR_STDRQTO - JR Z,PPIDE_PRTSTAT1 + JR Z,PPIDE_PRTSTATSTR1 INC A LD DE,PPIDE_STR_STBSYTO - JR Z,PPIDE_PRTSTAT1 + JR Z,PPIDE_PRTSTATSTR1 + INC A + LD DE,PPIDE_STR_STNOTSUP + JR Z,PPIDE_PRTSTATSTR1 + INC A + LD DE,PPIDE_STR_STNOTRDY + JR Z,PPIDE_PRTSTATSTR1 LD DE,PPIDE_STR_STUNK -PPIDE_PRTSTAT1: - CALL PPIDE_PRTPREFIX ; PRINT UNIT PREFIX - JR PPIDE_PRTSTAT3 -PPIDE_PRTSTAT2: - CALL NEWLINE - PRTS("PPIDE:$") ; NO UNIT NUM IN PREFIX FOR INVALID UNIT -PPIDE_PRTSTAT3: - CALL PC_SPACE ; FORMATTING +PPIDE_PRTSTATSTR1: CALL WRITESTR - POP HL POP DE POP AF RET @@ -1599,7 +2082,7 @@ PPIDE_REGDUMP: CALL PC_SPACE CALL PC_LBKT LD A,PPIDE_DIR_READ ; SET DATA BUS DIRECTION TO READ - ;OUT (PPIDE_IO_PPI),A ; DO IT + ;OUT (PPIDE_REG_PPI),A ; DO IT LD C,(IY+PPIDE_PPI) ; PPI CONTROL WORD OUT (C),A ; WRITE IT LD C,(IY+PPIDE_CTL) ; SET IDE ADDRESS @@ -1607,12 +2090,12 @@ PPIDE_REGDUMP: LD B,7 PPIDE_REGDUMP1: LD A,E ; REGISTER ADDRESS - ;OUT (PPIDE_IO_CTL),A ; SET IT + ;OUT (PPIDE_REG_CTL),A ; SET IT OUT (C),A ; REGISTER ADDRESS XOR PPIDE_CTL_DIOR ; SET BIT TO ASSERT READ LINE - ;OUT (PPIDE_IO_CTL),A ; ASSERT READ + ;OUT (PPIDE_REG_CTL),A ; ASSERT READ OUT (C),A ; ASSERT READ - ;IN A,(PPIDE_IO_DATALO) ; GET VALUE + ;IN A,(PPIDE_REG_DATALO) ; GET VALUE DEC C ; CTL -> MSB DEC C ; MSB -> LSB IN A,(C) ; GET VALUE @@ -1620,7 +2103,7 @@ PPIDE_REGDUMP1: INC C ; MSB -> CTL CALL PRTHEXBYTE ; DISPLAY IT ;LD A,C ; RELOAD ADDRESS W/ READ UNASSERTED - ;OUT (PPIDE_IO_CTL),A ; AND SET IT + ;OUT (PPIDE_REG_CTL),A ; AND SET IT OUT (C),E ; RELOAD ADDRESS W/ READ UNASSERTED ;DEC C ; NEXT LOWER REGISTER DEC E ; NEXT LOWER REGISTER @@ -1647,30 +2130,6 @@ PPIDE_PRTPREFIX1: CALL PC_COLON POP AF RET -;;; -;;; -;;; -;;#IF (DSKYENABLE) -;;PPIDE_DSKY: -;; LD HL,DSKY_HEXBUF ; POINT TO DSKY BUFFER -;; CALL PPIDE_IN -;; .DB PPIDE_REG_DRVHD -;; LD (HL),A ; SAVE IN BUFFER -;; INC HL ; INCREMENT BUFFER POINTER -;; CALL PPIDE_IN -;; .DB PPIDE_REG_CYLHI -;; LD (HL),A ; SAVE IN BUFFER -;; INC HL ; INCREMENT BUFFER POINTER -;; CALL PPIDE_IN -;; .DB PPIDE_REG_CYLLO -;; LD (HL),A ; SAVE IN BUFFER -;; INC HL ; INCREMENT BUFFER POINTER -;; CALL PPIDE_IN -;; .DB PPIDE_REG_SECT -;; LD (HL),A ; SAVE IN BUFFER -;; CALL DSKY_HEXOUT ; SEND IT TO DSKY -;; RET -;;#ENDIF ; ;============================================================================= ; STRING DATA @@ -1684,23 +2143,37 @@ PPIDE_STR_STIOERR .TEXT "IO ERROR$" PPIDE_STR_STRDYTO .TEXT "READY TIMEOUT$" PPIDE_STR_STDRQTO .TEXT "DRQ TIMEOUT$" PPIDE_STR_STBSYTO .TEXT "BUSY TIMEOUT$" +PPIDE_STR_STNOTSUP .TEXT "NOT SUPPORTED$" +PPIDE_STR_STNOTRDY .TEXT "NOT READY$" PPIDE_STR_STUNK .TEXT "UNKNOWN ERROR$" ; PPIDE_STR_NO .TEXT "NO$" PPIDE_STR_NOPPI .TEXT "PPI NOT PRESENT$" PPIDE_STR_8BIT .TEXT " 8-BIT$" ; +PPIDE_STR_TYPEATA .TEXT " ATA$" +PPIDE_STR_TYPEATAPI .TEXT " ATAPI$" +; ;============================================================================= ; DATA STORAGE ;============================================================================= ; PPIDE_TIMEOUT .DB PPIDE_TONORM ; WAIT FUNCS TIMEOUT IN TENTHS OF SEC -PPIDE_TOSCALER .DW CPUMHZ * 218 ; WAIT FUNCS SCALER FOR CPU SPEED +PPIDE_TOSCALER .DW CPUMHZ * 380 ; WAIT FUNCS SCALER FOR CPU SPEED ; PPIDE_CMD .DB 0 ; PENDING COMMAND TO PROCESS PPIDE_IOFNADR .DW 0 ; PENDING IO FUNCTION ADDRESS PPIDE_DRVHD .DB 0 ; CURRENT DRIVE/HEAD MASK ; PPIDE_DSKBUF .DW 0 ; ACTIVE DISK BUFFER +PPIDE_XFRDIR .DB 0 ; 0=READ, NON-0=WRITE ; PPIDE_DEVNUM .DB 0 ; TEMP DEVICE NUM USED DURING INIT +; +; SCSI COMMAND TEMPLATES (ALWAYS 12 BYTES FOR ATAPI) +; +PPIDE_PKTCMD_RW .DB $00, $00, $00, $00, $01, $00, $00, $00, $00, $00, $00, $00 ; READ/WRITE SECTOR +PPIDE_PKTCMD_SENSE .DB $03, $00, $00, $00, $FF, $00, $00, $00, $00, $00, $00, $00 ; REQUEST SENSE DATA +PPIDE_PKTCMD_RDCAP .DB $25, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 ; READ CAPACITY +PPIDE_PKTCMD_RW10 .DB $28, $00, $00, $00, $00, $00, $00, $00, $01, $00, $00, $00 ; READ/WRITE SECTOR +PPIDE_PKTCMD_TSTRDY .DB $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 ; TEST UNIT READY diff --git a/Source/HBIOS/ppk.asm b/Source/HBIOS/ppk.asm index 6672782b..3c8dbb0a 100644 --- a/Source/HBIOS/ppk.asm +++ b/Source/HBIOS/ppk.asm @@ -59,6 +59,8 @@ PPK_STATUS .DB 0 ; CURRENT STATUS BITS (SEE ABOVE) PPK_REPEAT .DB 0 ; CURRENT REPEAT RATE PPK_IDLE .DB 0 ; IDLE COUNT PPK_WAITTO .DW 0 ; TIMEOUT WAIT LOOP COUNT (COMPUTED IN INIT) +; + .ECHO "PPK: ENABLED\n" ; ;__________________________________________________________________________________________________ ; KEYBOARD INITIALIZATION diff --git a/Source/HBIOS/ppp.asm b/Source/HBIOS/ppp.asm index c8cc27d6..72d2ab53 100644 --- a/Source/HBIOS/ppp.asm +++ b/Source/HBIOS/ppp.asm @@ -4,11 +4,14 @@ ;================================================================================================== ; ; TODO: -; 1) ADD SUPPORT FOR DSKY ; PPP_IO .EQU PPPBASE + 0 ; PPP DATA I/O (PPI PORT A) PPP_CTL .EQU PPPBASE + 2 ; PPP CTL LINES (PPI PORT C) PPP_PPICTL .EQU PPPBASE + 3 ; PPI CONTROL PORT +; + .ECHO "PPP: IO=" + .ECHO PPP_IO + .ECHO "\n" ; ; COMMAND BYTES ; @@ -249,6 +252,8 @@ PPP_FWVER .DB $00, $00, $00, $00 ; MMNNBBB (M=MAJOR, N=MINOR, B=BUILD) ; PPPCON_ROWS .EQU 37 ; PROPELLER VGA DISPLAY ROWS (40 - 3 STATUS LINES) PPPCON_COLS .EQU 80 ; PROPELLER VGA DISPLAY COLS +; + .ECHO "PPPCON: ENABLED\n" ; PPPCON_INIT: CALL NEWLINE @@ -414,6 +419,8 @@ PPPSD_CFGTBL: #ENDIF ; .DB $FF ; END MARKER +; + .ECHO "PPPSD: ENABLED\n" ; ; SD CARD INITIALIZATION ; @@ -689,7 +696,7 @@ PPPSD_RESET: PPPSD_DEVICE: LD D,DIODEV_PPPSD ; D := DEVICE TYPE LD E,(IY+PPPSD_DEV) ; E := PHYSICAL DEVICE NUMBER - LD C,%01010000 ; C := ATTRIBUTES, REMOVABLE, SD CARD + LD C,%00110010 ; C := ATTRIBUTES, REMOVABLE, SD CARD LD H,0 ; H := 0, DRIVER HAS NO MODES LD L,PPPBASE ; L := BASE I/O ADDRESS XOR A ; SIGNAL SUCCESS @@ -904,7 +911,7 @@ PPPSD_GETCSD: CALL PPP_SNDCMD ; SEND COMMAND RET NZ ; ABORT ON ERROR - LD B,16 ; GET 4 BYTES + LD B,16 ; GET 16 BYTES LD HL,PPPSD_CSDBUF PPPSD_GETCSD1: CALL PPP_GETBYTE @@ -942,7 +949,9 @@ PPPSD_SENDBLK: LD A,PPPSD_LBA ; OFFSET OF LBA CALL LDHLIYA ; HL := IY + A, REG A TRASHED #IF (DSKYENABLE) + #IF (DSKYDSKACT) CALL HB_DSKACT ; SHOW ACTIVITY + #ENDIF #ENDIF LD B,4 PPPSD_SENDBLK1: diff --git a/Source/HBIOS/prp.asm b/Source/HBIOS/prp.asm index f34c6cf9..f857c5fc 100644 --- a/Source/HBIOS/prp.asm +++ b/Source/HBIOS/prp.asm @@ -4,9 +4,12 @@ ;================================================================================================== ; ; TODO: -; 1) ADD SUPPORT FOR DSKY ; PRP_IOBASE .EQU $A8 +; + .ECHO "PRP: IO=" + .ECHO PRP_IOBASE + .ECHO "\n" ; ; GLOBAL PROPIO INITIALIZATION ; @@ -120,6 +123,8 @@ PRPCON_DSPRDY .EQU $10 ; BIT SET WHEN DISPLAY BUF IS READY FOR A BYTE (BUF EMPT ; PRPCON_ROWS .EQU 37 ; PROPELLER VGA DISPLAY ROWS (40 - 3 STATUS LINES) PRPCON_COLS .EQU 80 ; PROPELLER VGA DISPLAY COLS +; + .ECHO "PRPCON: ENABLED\n" ; ; ; @@ -311,6 +316,8 @@ PRPSD_CFGTBL: #ENDIF ; .DB $FF ; END MARKER +; + .ECHO "PRPSD: ENABLED\n" ; ; SD CARD INITIALIZATION ; @@ -546,7 +553,7 @@ PRPSD_RESET: PRPSD_DEVICE: LD D,DIODEV_PRPSD ; D := DEVICE TYPE LD E,(IY+PRPSD_DEV) ; E := PHYSICAL DEVICE NUMBER - LD C,%01010000 ; C := ATTRIBUTES, REMOVABLE, SD CARD + LD C,%00110010 ; C := ATTRIBUTES, REMOVABLE, SD CARD LD H,0 ; H := 0, DRIVER HAS NO MODES LD L,PRP_IOBASE ; L := BASE I/O ADDRESS XOR A ; SIGNAL SUCCESS @@ -876,7 +883,9 @@ PRPSD_SETBLK: LD A,PRPSD_LBA ; OFFSET OF LBA CALL LDHLIYA ; HL := IY + A, REG A TRASHED #IF (DSKYENABLE) + #IF (DSKYDSKACT) CALL HB_DSKACT ; SHOW ACTIVITY + #ENDIF #ENDIF OTIR RET diff --git a/Source/HBIOS/rf.asm b/Source/HBIOS/rf.asm index 17aa5305..29d9dabc 100644 --- a/Source/HBIOS/rf.asm +++ b/Source/HBIOS/rf.asm @@ -42,6 +42,11 @@ RF_CFGTBL: .DW 0,0 ; CURRENT LBA .DB 0 ; UNUSED .DB RF_U0IO ; DEVICE BASE ADDR +; + .ECHO "RF: IO=" + .ECHO RF_U0IO + .ECHO "\n" +; #IF (RF_DEVCNT > 1) ; DEVICE 1 .DB 1 ; DEVICE NUMBER @@ -50,6 +55,11 @@ RF_CFGTBL: .DB 0 ; UNUSED .DB RF_U1IO ; DEVICE BASE ADDR #ENDIF +; + .ECHO "RF: IO=" + .ECHO RF_U1IO + .ECHO "\n" +; #IF (RF_DEVCNT > 2) ; DEVICE 2 .DB 2 ; DRIVER DEVICE NUMBER @@ -58,13 +68,23 @@ RF_CFGTBL: .DB 0 ; UNUSED .DB RF_U2IO ; DEVICE BASE ADDR #ENDIF -; ; DEVICE 3 +; + .ECHO "RF: IO=" + .ECHO RF_U2IO + .ECHO "\n" +; #IF (RF_DEVCNT > 3) + ; DEVICE 3 .DB 3 ; DEVICE NUMBER .DB 0 ; DEVICE STATUS .DW 0,0 ; CURRENT LBA .DB 0 ; UNUSED .DB RF_U3IO ; DEVICE BASE ADDR +; + .ECHO "RF: IO=" + .ECHO RF_U3IO + .ECHO "\n" +; #ENDIF ; #IF ($ - RF_CFGTBL) != (RF_DEVCNT * RF_CFGSIZ) @@ -178,7 +198,7 @@ RF_GEOM: RF_DEVICE: LD D,DIODEV_RF ; D := DEVICE TYPE LD E,(IY+RF_DEV) ; E := PHYSICAL DEVICE NUMBER - LD C,%00110000 ; C := ATTRIBUTES, NON-REMOVABLE RAM FLOPPY + LD C,%00010110 ; C := ATTRIBUTES, NON-REMOVABLE RAM FLOPPY LD H,0 ; H := 0, DRIVER HAS NO MODES LD L,(IY+RF_IOAD) ; L := BASE I/O ADDRESS XOR A ; SIGNAL SUCCESS @@ -314,9 +334,11 @@ RF_SETIO: RF_SETADR: ; #IF (DSKYENABLE) + #IF (DSKYDSKACT) LD A,RF_LBA CALL LDHLIYA CALL HB_DSKACT ; SHOW ACTIVITY + #ENDIF #ENDIF ; LD A,(RF_IO) ; OUTPUT THE LOGICAL BLOCK diff --git a/Source/HBIOS/romldr.asm b/Source/HBIOS/romldr.asm index 22e80695..89479466 100644 --- a/Source/HBIOS/romldr.asm +++ b/Source/HBIOS/romldr.asm @@ -47,7 +47,8 @@ cmdbuf .equ $80 ; cmd buf is in second half of page zero cmdmax .equ 60 ; max cmd len (arbitrary), must be < bufsiz bufsiz .equ $80 ; size of cmd buf ; -int_im1 .equ $FF00 ; IM1 vector target for RomWBW HBIOS proxy +;;int_im1 .equ $FF00 ; IM1 vector target for RomWBW HBIOS proxy +hbx_int .equ $FF60 ; IM1 vector target for RomWBW HBIOS proxy ; bid_cur .equ -1 ; used below to indicate current bank ; @@ -77,7 +78,8 @@ bid_cur .equ -1 ; used below to indicate current bank .fill ($38 - $) #if (BIOS == BIOS_WBW) #if (INTMODE == 1) - jp int_im1 ; go to handler in hi mem + call hbx_int ; handle im1 interrupts + .db $10 << 2 ; use special vector #16 #else ret ; return w/ ints left disabled #endif @@ -138,7 +140,8 @@ start: rst 08 ; do it ld a,c ; previous bank to A ld (bid_ldr),a ; save previous bank for later - bit 7,a ; starting from ROM? + ;;;bit 7,a ; starting from ROM? + cp BID_IMG0 ; ROM startup? #endif ; #if (BIOS == BIOS_UNA) @@ -170,6 +173,16 @@ start1: #if (INTMODE == 1) ei #endif +; +#if (BIOS == BIOS_WBW) + ; Check for DSKY and set flag + ld b,BF_SYSGET ; HBIOS func: get + ld c,BF_SYSGET_DSKYCNT ; get DSKY count + rst 08 ; do it + ld a,e ; put in A + ld (dskyact),a ; save it +#endif + ; ;======================================================================= ; Loader prompt @@ -180,6 +193,30 @@ start1: call pstr ; do it call clrbuf ; zero fill the cmd buffer ; +#if ((BIOS == BIOS_WBW) & FPSW_ENABLE) +; + ld b,BF_SYSGET ; HBIOS SysGet + ld c,BF_SYSGET_PANEL ; ... Panel swiches value + rst 08 ; do it + jr nz,nofp ; no switches, skip over + ld a,l ; put value in A + ld (switches),a ; save it +; + call nl ; formatting + ld hl,str_switches ; tag + call pstr ; display + ld a,(switches) ; get switches value + call prthexbyte ; display +; + ld a,(switches) ; get switches value + and SW_AUTO ; auto boot? + call nz,runfp ; process front panel +; +nofp: + ; fall thru +; +#endif +; #if (BOOT_TIMEOUT != -1) ; Initialize auto command timeout downcounter or $FF ; auto cmd active value @@ -207,18 +244,11 @@ prompt: call clrbuf ; zero fill the cmd buffer ; #if (DSKYENABLE) - call DSKY_PREINIT ; *** TEMPORARY *** - call DSKY_RESET ; clear DSKY ld hl,msg_sel ; boot select msg - call DSKY_SHOW ; show on DSKY - - #IF (DSKYMODE == DSKYMODE_NG) - call DSKY_PUTLED - .db $3f,$3f,$3f,$3f,$00,$00,$00,$00 - call DSKY_BEEP - call DSKY_L2ON - #ENDIF - + call dsky_show ; show on DSKY + call dsky_highlightallkeys + call dsky_beep + call dsky_l2on #endif ; wtkey: @@ -227,8 +257,7 @@ wtkey: jr nz,concmd ; if pending, do console command ; #if (DSKYENABLE) - call DSKY_STAT ; check DSKY for keypress - or a ; set flags + call dsky_stat ; check DSKY for keypress jp nz,dskycmd ; if pending, do DSKY command #endif ; @@ -271,11 +300,8 @@ concmd: call clrled ; clear LEDs ; #if (DSKYENABLE) - #if (DSKYMODE == DSKYMODE_NG) - call DSKY_PUTLED - .db $00,$00,$00,$00,$00,$00,$00,$00 - call DSKY_L2OFF - #endif + call dsky_highlightkeysoff + call dsky_l2off #endif ; ; Get a command line from console and handle it @@ -366,6 +392,123 @@ runcmd2: ld (bootslice),a ; save boot slice jp diskboot ; boot the disk unit/slice ; +#if ((BIOS == BIOS_WBW) & FPSW_ENABLE) +; +;======================================================================= +; Process Front Panel switches +;======================================================================= +; +runfp: + ld a,(switches) ; get switches value + and SW_DISK ; disk boot? + jr nz,fp_diskboot ; handle disk boot +; +fp_romboot: + ; Handle FP ROM boot + ld a,(switches) ; get switches value + and SW_OPT ; isolate options bits + ld hl,fpapps ; rom apps cmd char list + call addhla ; point to the right one + ld a,(hl) ; get it +; + ; Attempt ROM application launch + ld ix,(ra_tbl_loc) ; point to start of ROM app tbl + ld c,a ; save command in C +fp_romboot1: + ld a,(ix+ra_conkey) ; get match char + and ~$80 ; clear "hidden entry" bit + cp c ; compare + jp z,romload ; if match, load it + ld de,ra_entsiz ; table entry size + add ix,de ; bump IX to next entry + ld a,(ix) ; check for end + or (ix+1) ; ... of table + jr nz,fp_romboot1 ; loop till done + ret ; no match, return +; +fpapps .db "MBFPCZNU" +; +fp_diskboot: + ; get count of disk units + ld b,BF_SYSGET ; HBIOS Get function + ld c,BF_SYSGET_DIOCNT ; HBIOS DIO Count sub fn + rst 08 ; call HBIOS + ld a,e ; count to A + ld (diskcnt),a ; save it + or a ; set flags + ret z ; bort if no disk units + ld a,(switches) ; get switches value + and SW_FLOP ; floppy switch bit + jr nz,fp_flopboot ; handle auto flop boot + ; fall thru for auto hd boot +; +fp_hdboot: + ; Find the first hd with media and boot to that unit using + ; the slice specified by the FP switches. + ld a,(diskcnt) ; get disk count + ld b,a ; init loop counter + ld c,0 ; init disk index +fp_hdboot1: + push bc ; save loop control + ld b,BF_DIODEVICE ; HBIOS Disk Device func + rst 08 ; unit in C, do it + bit 5,C ; high capacity disk? + pop bc ; restore loop control + jr z,fp_hdboot2 ; if not, continue loop + push bc ; save loop control + ld b,BF_DIOMEDIA ; HBIOS Sense Media + ld e,1 ; perform media discovery + rst 08 ; do it + pop bc ; restore loop control + jr z,fp_hdboot3 ; if has media, go boot it +fp_hdboot2: + inc c ; else next disk + djnz fp_hdboot1 ; loop thru all disks + ret ; nothing works, abort +; +fp_hdboot3: + ld a,c ; disk unit to A + ld (bootunit),a ; save it + ld a,(switches) ; get switches value + and SW_OPT ; isolate slice value + ld (bootslice),a ; save it + jp diskboot ; do it +; +fp_flopboot: + ; Find the nth floppy drive and boot to that unit. The + ; floppy number is based on the option switches. + ld a,(diskcnt) ; get disk count + ld b,a ; init loop counter + ld c,0 ; init disk index + ld a,(switches) ; get switches value + and SW_OPT ; isolate option bits + ld e,a ; floppy unit down counter + inc e ; pre-increment for ZF check +fp_flopboot1: + push bc ; save loop control + push de ; save floppy down ctr + ld b,BF_DIODEVICE ; HBIOS Disk Device func + rst 08 ; unit in C, do it + bit 7,c ; floppy device? + pop de ; restore loop control + pop bc ; restore floppy down ctr + jr z,fp_flopboot3 ; if not floppy, skip + dec e ; decrement down ctr + jr z,fp_flopboot2 ; if ctr expired, boot this unit +fp_flopboot3: + inc c ; else next disk + djnz fp_flopboot1 ; loop thru all disks + ret ; nothing works, abort +; +fp_flopboot2: + ld a,c ; disk unit to A + ld (bootunit),a ; save it + xor a ; ; zero accum + ld (bootslice),a ; floppy boot slice is always 0 + jp diskboot ; do it +; +#endif +; ;======================================================================= ; Process a DSKY command from key in A ;======================================================================= @@ -375,15 +518,15 @@ runcmd2: dskycmd: call clrled ; clear LEDs ; - call DSKY_GETKEY ; get DSKY key + call dsky_getkey ; get DSKY key + ld a,e ; put in A cp $FF ; check for error ret z ; abort if so ; - #if (DSKYMODE == DSKYMODE_NG) - call DSKY_PUTLED - .db $00,$00,$00,$00,$00,$00,$00,$00 - call DSKY_L2OFF - #endif + push af + call dsky_highlightkeysoff + call dsky_l2off + pop af ; ; Attempt built-in commands cp KY_BO ; reboot system @@ -720,7 +863,7 @@ reboot: ; #if (DSKYENABLE) ld hl,msg_boot ; point to boot message - call DSKY_SHOW ; display message + call dsky_show ; display message #endif ; ; cold boot system @@ -752,7 +895,7 @@ romload: ; #if (DSKYENABLE) ld hl,msg_load ; point to load message - call DSKY_SHOW ; display message + call dsky_show ; display message #endif ; #if (BIOS == BIOS_WBW) @@ -836,7 +979,7 @@ romload1: ; #if (DSKYENABLE) ld hl,msg_go ; point to go message - call DSKY_SHOW ; display message + call dsky_show ; display message #endif ; ld l,(ix+ra_ent) ; HL := app entry address @@ -861,7 +1004,7 @@ diskboot: ; #if (DSKYENABLE) ld hl,msg_load ; point to load message - call DSKY_SHOW ; display message + call dsky_show ; display message #endif ; #if (BIOS == BIOS_WBW) @@ -874,6 +1017,18 @@ diskboot: cp e ; compare to count jp nc,err_nodisk ; handle no disk err ; + ; If non-zero slice requested, confirm device can handle it + ld a,(bootslice) ; get slice + or a ; set flags + jr z,diskboot0 ; slice 0, skip slice check + ld a,(bootunit) ; get disk unit + ld c,a ; put in C for func call + ld b,BF_DIODEVICE ; HBIOS func: device info + rst 08 ; do it + bit 5,c ; high capacity device? + jp z,err_noslice ; no such slice, handle err +; +diskboot0: ; Sense media ld a,(bootunit) ; get boot disk unit ld c,a ; put in C for func call @@ -883,18 +1038,6 @@ diskboot: jp nz,err_diskio ; handle error ld a,e ; media id to A ld (mediaid),a ; save media id -; - ; If non-zero slice requested, confirm device can handle it - ld a,(bootslice) ; get slice - or a ; set flags - jr z,diskboot1 ; slice 0, skip slice check - ld a,(bootunit) ; get disk unit - ld c,a ; put in C for func call - ld b,BF_DIODEVICE ; HBIOS func: device info - rst 08 ; do it - ld a,d ; device type to A - cp DIODEV_IDE ; IDE is max slice device type - jp c,err_noslice ; no such slice, handle err ; #endif ; @@ -1145,7 +1288,7 @@ diskboot10: ; #if (DSKYENABLE) ld hl,msg_go ; point to go message - call DSKY_SHOW ; display message + call dsky_show ; display message #endif ; ; Jump to entry vector @@ -1201,6 +1344,36 @@ diskread: ; #endif ; +; Built-in mini-loader for S100 Monitor. The S100 platform build +; imbeds the S100 Monitor in the ROM at the start of bank 3 (BID_IMG2). +; This bit of code just launches the monitor directly from that bank. +; +#if (BIOS == BIOS_WBW) + #if (PLATFORM == PLT_S100) +; +s100mon: + ; Warn user that console is being directed to the S100 bus + ; if the IOBYTE bit 0 is 0 (%xxxxxxx0). + in a,($75) ; get IO byte + and %00000001 ; isolate console bit + jr nz,s100mon1 ; if 0, bypass msg + ld hl,str_s100con ; console msg string + call pstr ; display it +; +s100mon1: + ; Launch S100 Monitor from ROM Bank 3 + call ldelay ; wait for UART buf to empty + di ; suspend interrupts + ld a,BID_IMG2 ; S100 monitor bank + ld ix,0 ; execution resumes here + jp HB_BNKCALL ; do it +; +str_smon .db "S100 Z180 Monitor",0 +str_s100con .db "\r\n\r\nConsole on S100 Bus",0 +; + #endif +#endif +; ;======================================================================= ; Utility functions ;======================================================================= @@ -1209,20 +1382,24 @@ diskread: ; clrled: #if (BIOS == BIOS_WBW) - #if (DIAGENABLE) - xor a ; zero accum - out (DIAGPORT),a ; clear diag leds + #if (FPLED_ENABLE) + ;xor a ; zero accum + ;out (FPLED_IO),a ; clear diag leds + ld b,BF_SYSSET ; HBIOS SysGet + ld c,BF_SYSSET_PANEL ; ... Panel swiches value + ld l,$00 ; all LEDs off + rst 08 ; do it #endif #if (LEDENABLE) #if (LEDMODE == LEDMODE_STD) - ld a,$FF ; led is inverted - out (LEDPORT),a ; clear led + ld a,$FF ; led is inverted + out (LEDPORT),a ; clear led #endif #if (LEDMODE == LEDMODE_RTC) ; Bits 0 and 1 of the RTC latch are for the LEDs. ld a,(HB_RTCVAL) and ~%00000011 - out (RTCIO),a ; clear led + out (RTCIO),a ; clear led ld (HB_RTCVAL),a #endif #endif @@ -1916,6 +2093,60 @@ devunk .db "UNK",0 str_devlst .db "\r\n\r\nDisk Devices:",0 ; #endif + +#if (DSKYENABLE) + +; +;======================================================================= +; DSKY interface routines +;======================================================================= +; +dsky_stat: + ld b,BF_DSKYSTAT + jr dsky_hbcall +; +dsky_getkey: + ld b,BF_DSKYGETKEY + jr dsky_hbcall +; +dsky_show: + ld b,BF_DSKYSHOWSEG + jr dsky_hbcall +; +dsky_beep: + ld b,BF_DSKYBEEP + jr dsky_hbcall +; +dsky_l2on: + ld e,1 + jr dsky_statled +dsky_l2off: + ld e,0 +dsky_statled: + ld b,BF_DSKYSTATLED + ld d,1 + jr dsky_hbcall +; +dsky_putled: + ld b,BF_DSKYKEYLEDS + jr dsky_hbcall +; +dsky_highlightallkeys: + ld hl,dsky_highlightallkeyleds + jr dsky_putled +; +dsky_highlightkeysoff: + ld hl,dsky_highlightkeyledsoff + jr dsky_putled +; +dsky_hbcall: + ld a,(dskyact) + or a + ret z + rst 08 + ret +; +#endif ; ;======================================================================= ; Error handlers @@ -1959,7 +2190,9 @@ err: ld hl,str_err_prefix call pstr pop hl - jp pstr + call pstr + or $ff ; signal error + ret ; done ; str_err_prefix .db bel,"\r\n\r\n*** ",0 str_err_invcmd .db "Invalid command",0 @@ -1971,22 +2204,6 @@ str_err_sig .db "No system image on disk",0 str_err_api .db "Unexpected hardware BIOS API failure",0 ; ;======================================================================= -; Includes -;======================================================================= -; -#if (DSKYENABLE) -#define DSKY_KBD - #if (DSKYMODE == DSKYMODE_V1) -VDELAY .equ vdelay -DLY2 .equ dly2 -#include "dsky.asm" - #endif - #if (DSKYMODE == DSKYMODE_NG) -#include "dskyng.asm" - #endif -#endif -; -;======================================================================= ; Working data storage (initialized) ;======================================================================= ; @@ -2034,21 +2251,20 @@ str_help .db "\r\n" .db 0 ; #if (DSKYENABLE) - #if (DSKYMODE == DSKYMODE_V1) -msg_sel .db $7f,$1d,$1d,$0f,$6c,$00,$00,$00 ; "boot? " -msg_boot .db $7f,$1d,$1d,$0f,$80,$80,$80,$00 ; "boot... " -msg_load .db $0b,$1d,$7d,$3d,$80,$80,$80,$00 ; "load... " -msg_go .db $5b,$1d,$80,$80,$80,$00,$00,$00 ; "go... " - #endif - #if (DSKYMODE == DSKYMODE_NG) msg_sel .db $7f,$5c,$5c,$78,$53,$00,$00,$00 ; "boot? " msg_boot .db $7f,$5c,$5c,$78,$80,$80,$80,$00 ; "boot... " msg_load .db $38,$5c,$5f,$5e,$80,$80,$80,$00 ; "load... " msg_go .db $3d,$5c,$80,$80,$80,$00,$00,$00 ; "go... " - #endif #endif ; ;======================================================================= +; DSKY keypad led matrix masks +;======================================================================= +; +dsky_highlightallkeyleds .db $3f,$3f,$3f,$3f,$00,$00,$00,$00 +dsky_highlightkeyledsoff .db $00,$00,$00,$00,$00,$00,$00,$00 +; +;======================================================================= ; ROM Application Table ;======================================================================= ; @@ -2128,6 +2344,11 @@ ra_tbl: ; --------- ------- ----- -------- ----- ------- ------- ---------- ra_ent(str_mon, 'M', KY_CL, BID_IMG0, MON_IMGLOC, MON_LOC, MON_SIZ, MON_SERIAL) ra_entsiz .equ $ - ra_tbl +#if (BIOS == BIOS_WBW) + #if (PLATFORM == PLT_S100) +ra_ent(str_smon, 'S', $FF, bid_cur , $8000, $8000, $0001, s100mon) + #endif +#endif ra_ent(str_zsys, 'Z', KY_FW, BID_IMG0, ZSYS_IMGLOC, CPM_LOC, CPM_SIZ, CPM_ENT) ra_ent(str_cpm22, 'C', KY_BK, BID_IMG0, CPM_IMGLOC, CPM_LOC, CPM_SIZ, CPM_ENT) #if (BIOS == BIOS_WBW) @@ -2150,7 +2371,7 @@ ra_tbl_app: ; Name Key Dsky Bank Src Dest Size Entry ; --------- ------- ----- -------- ----- ------- ------- ---------- ra_ent(str_mon, 'M', KY_CL, bid_cur, MON_IMGLOC, MON_LOC, MON_SIZ, MON_SERIAL) -ra_ent(str_zsys, 'Z', KY_FW, bid_cur, ZSYS_IMGLOC, CPM_LOC, CPM_SIZ, CPM_ENT) +ra_ent(str_zsys, 'Z', KY_FW, bid_cur, ZSYS_IMGLOC, CPM_LOC, CPM_SIZ, CPM_ENT) #if (DSKYENABLE) ra_ent(str_dsky, 'Y'+$80, KY_GO, bid_cur, MON_IMGLOC, MON_LOC, MON_SIZ, MON_DSKY) #endif @@ -2168,6 +2389,7 @@ str_upd .db "XModem Flash Updater",0 str_user .db "User App",0 str_egg .db "",0 str_net .db "Network Boot",0 +str_switches .db "FP Switches = 0x",0 newcon .db 0 newspeed .db 0 ; @@ -2194,6 +2416,9 @@ ra_tbl_loc .dw 0 ; points to active ra_tbl bootunit .db 0 ; boot disk unit bootslice .db 0 ; boot disk slice loadcnt .db 0 ; num disk sectors to load +switches .db 0 ; front panel switches +diskcnt .db 0 ; disk unit count value +dskyact .db 0 ; DSKY active if != 0 ; ;======================================================================= ; Pad remainder of ROM Loader diff --git a/Source/HBIOS/rp5rtc.asm b/Source/HBIOS/rp5rtc.asm index df74a42d..fe1d5e90 100644 --- a/Source/HBIOS/rp5rtc.asm +++ b/Source/HBIOS/rp5rtc.asm @@ -55,6 +55,10 @@ MODE_RAM1 .EQU 3 MD_TIME .EQU 8 MD_ALRM .EQU 4 + .ECHO "RP5C01: IO=" + .ECHO RP5RTC_REG + .ECHO "\n" + RP5RTC_INIT: LD A, (RTC_DISPACT) ; RTC DISPATCHER ALREADY SET? OR A ; SET FLAGS diff --git a/Source/HBIOS/s100mon.z80 b/Source/HBIOS/s100mon.z80 new file mode 100644 index 00000000..bed974d1 --- /dev/null +++ b/Source/HBIOS/s100mon.z80 @@ -0,0 +1,4114 @@ +; Z180MOM1.180 This is the Z180 CPU main monitor program for the S100Computers Z180 SBC Project. +; Assemble and SLR's Z180ASM Assembler +; +; The code is intended to run starting at location 0000H and ignores +; all page zero stuff. Interrupts are kept disabled. The resultant +; binary is intended to be programmed into a ROM that is addressed at +; CPU address 0000H on reset. The code assumes the CPU has been reset +; and makes no attempt to "reset" Z180 registers back to defaults. +; +; The code assumes a physical memory layout of 1MB. The first 512KB +; is assumed to be ROM and the second 512KB is assumed to be RAM. The +; code configures the MMU to place the highest 32KB of physical RAM +; into the top 32KB of CPU address space. +; +; Input XTAL clock is expected to be 18.432 MHz. +; The CPU is configured to run at the most conservative settings. +; PHI at 1/2 XTAL input, +3 memory wait states, and +3 I/O wait states. +; +; Serial port baud rate divisor is programmed to a 57,600 baud rate +; with PHI at 9.2MHz. Line characteristics are set to +; 8 data bits, 1 stop bit, no parity. +; +; The initialization code relocates the internal Z180 CPU registers +; to start at C0H. This is not a requirement of the code, but I +; thought it might be helpful for testing S100 bus external devices that are +; more likely to be located at the lower I/O addresses. +; +; PLEASE NOTE THIS CODE ALMOST TAKES UP 8K TO RESIDE FROM E000H TO FFFFH IN RAM. +; VERY LITTLE MORE CODE CAN BE ADDED WITHOUT OVERWRITING THE TOP OF RAM. +; CURRENTLY THIS IS ONLY ~80 BYTES. CHECK THE VALUE OF "ROM_EMPTY" IN THE +; Z180MON1.LST FILE IF YOU MAKE MODIFICATIONS. +; +; +; The submit file (xxx2.sub) contains:- +; R Z180MOM1.180 +; SLR180 Z180MOM1 FH +; HEXCOM Z180MOM1 +; W Z180MOM1.HEX +; W Z180MOM1.LST +; W Z180MOM1.COM +; +; Ignore the HEXCOM error "LOAD ADDRESS LESS THAN 100" +; +; To assemble under windows... +; Load Altair.EXE in the Windows CMD box +; do cpm3 +; I: +; +; Use the "r" SIMH command to move SLR180.COM file across to the I: Drive +; Also "r" the XXX2.SUB file across to the I: drive (one time only) +; Note I already have these files on the Altair I: drive you are using here. +; +; Then.... +; I:>Submit XXX2.SUB +; +; The .HEX file will have a start address of 0000H. It must reside in the ROM starting +; at 0H. For the "ROM" I use the Microchip SST39F040 chip type +; With the Wellon VP 290 Programmer:- +; +; To Buffer Address (HEX) +; For File Address (Hex) 0000 <------ +; File Size (Hex) 8000 +; Intel +; Clear buffer options 0 +; To Buffer Mode Normal +; From File Mode Normal +; +; +;---------------------------------------------------------------------------------------- +; +; V0.0 5/10/2023 ;Initial boot code supplied by Wayne Warthen +; V0.1 5/18/2023 ;First addition of S100 bus Z80 Master.Z80 monitor code. +; V0.11 6/5/2023 ;Menu to test S100 bus signals & set Baud Rate +; V0.2 7/4/2023 ;Remove baud rate option, add date,time, start IDE +; V0.21 7/6/2023 ;Cleaned up IDE drive section +; V0.22 7/6/2023 ;Added default NMI and INT0 interrupt traps +; V0.23 7/7/2023 ;Better use of ESC character for data entry aborts +; V0.24 7/8/2023 ;Added Master/Slave S100 bus request ("W" CMD) +; V0.241 7/9/2023 ;Add B command to Boot ROMWBW (by Wayne Warthen) +; V0.242 7/9/2023 ;INT0 test added (S100 Sub Menu) +; V0.30 7/16/2023 ;Added IDE menu and "P" CMD to boot CPM (Non Banked) +; V0.31 7/16/2023 ;Corrected stack problem in XModem command +; V0.32 7/16/2023 ;SD card, but not initilizing, (only partially done) +; V0.33 7/22/2023 ;SD card interface done +; V0.34 7/22/2023 ;SD card interface with high clock speed + +; +;--------------------------------- Port equates used throughout the monitor --------------- +; +; +SCROLL EQU 01H ;Set scrool direction UP. +BELL EQU 07H +SPACE EQU 20H +TAB EQU 09H ;TAB ACROSS (8 SPACES FOR SD-BOARD) +CR EQU 0DH +LF EQU 0AH +FF EQU 0CH +QUIT EQU 11H ;Turns off any screen enhancements (flashing, underline etc). +NO_ENHANCEMENT EQU 17H ;Turns off whatever is on +FAST EQU 10H ;High speed scrool +ESC EQU 1BH +DELETE EQU 7FH +BACKS EQU 08H +CLEAR EQU 1AH ;TO CLEAR SCREEN +RST7 EQU 38H ;RST 7 (LOCATION FOR TRAP) +NN EQU 0H ;[I] INITIAL VALUE +SOH EQU 1 ; For XModem etc. +EOT EQU 4 +ACK EQU 6 +NAK EQU 15H + +FALSE EQU 0 +TRUE EQU NOT FALSE + +DO_CODE EQU FALSE ;To skip over sections +ST8C4 EQU TRUE ;TRUE if S100_Parallel_IO Board. False if IMSAI PIO Board +IOBYTE EQU 075H ;IOBYTE PORT ON Z180 CPU Board (74H-77H or 64H-67H. Set with K8) +SOUT_PORT EQU 074H ;Onboard port to control (on/off) sOUT signal to S100 bus. + +NMI_VECTOR EQU 66H ;Default NMI Vector location +INT0_VECTOR EQU 38H ;Default INT0 vector location + +SD_CARD_CS EQU 0CH ;Bit 2 to select onboard SD card adaptor (0=ON, 1=off) +SD_CARD_LED EQU 0EH ;Bit 2 to turn on/off SD Card LED (0=ON, 1=off) +SD_CNTR EQU z180_cntr ;SPI CTRL PORT (0CAH) +SD_TRDR EQU z180_trdr ;SPI DATA PORT IN & OUT (0CBH) +; +; +;-------------- PROPELLER CONSOLE_IO (OR SD SYSTEMS VIDIO BOARD) FOR CONSOLE INPUT & OUTPUT +CONSOLE_STATUS EQU 0H +CONSOLE_IN EQU 01H +CONSOLE_OUT EQU 01H + +;-------------- THIS IS MY PORT TO OUTPUT DATA TO HP 4050T LASAR PRINTER (IMSAI or 8PIO Board) + + +IF ST8C4 ;If S100_Parallel_IO Board for Printer output +PRINTER_CTRL EQU 0C2H ;ST8C4 Control Port +PRINTER_STATUS EQU 0C1H ;ST8C4 Status port +PRINTER_OUT EQU 0C0H ;ST8C4 Data port +PRINTER_ST_LOW EQU 0DH ;OUT STROBE LOW +PRINTER_ST_HIGH EQU 0CH ;OUT STROBE HIGH +ELSE +PRINTER_STATUS EQU 5 ;IN, IMSAI PIO Board PARRELL PORT +PRINTER_OUT EQU 5 ;OUT +PRINTER_STROBE EQU 4 ;OUT +ENDIF + +;-------------- S100Computers MSDOS Support Board PORT ASSIGNMENTS + +CMOS_PORT EQU 70H ;Base Port for CMOS Clock/Date Chip on MSDOS Support Board +MASTER_PIC_PORT EQU 20h ;Hardware port the 8259A (two ports 20H & 21H) + +MasterICW1 equ 00010111B ;EDGE triggered, 4 bytes, single Master,ICW4 needed +MasterICW2 equ 8H ;Base address for 8259A Int Table (IBM-PC uses 8X4 = 20H) +MasterICW3 equ 0H ;No slave +MasterICW4 equ 00000011B ;No special mode, non buffer, Auto EOI, 8086. ;<<<<, + + +;-------------------------- SMBs Board ------------------------------------------------ + +SW_TMAX EQU 0EEH ;OUTPUT BIT 0 HIGH FROM THIS PORT LOWERS DMA0* ON THE SMB_V2 (SWITCH IN THE 8086 FAMILY of boards) + ;OUTPUT BIT 1 HIGH FROM THIS PORT LOWERS DMA1* ON THE SMB_V2 (SWITCH IN THE 68000 CPU Board) + ;OUTPUT BIT 2 HIGH FROM THIS PORT LOWERS DMA2* ON THE SMB_V2 + ;OUTPUT BIT 3 HIGH FROM THIS PORT LOWERS DMA3* ON THE SMB_V2 +SW_TMA0 EQU 0EDH ;INPUT FROM THIS PORT LOWERS DMA0* (SWITCHES IN THE 8088,8086,80286 or 80386 boards) + + +;-------------- S100Computers I/O BOARD PORT ASSIGNMENTS (A0-AC) ------------------------------------ + +BCTL EQU 0A0H ;CHANNEL B CONTROL (SPEECH PORT) ;<--- Adjust as necessary, +BDTA EQU 0A2H ;CHANNEL B DATA +ACTL EQU 0A1H ;CHANNEL A CONTROL (MODEM_CTL_PORT) +ADTA EQU 0A3H ;CHANNEL A DATA (MODEM_DATA_PORT) + +PortA_8255 EQU 0A8H ;A port of 8255 ;<--- Adjust as necessary +PortB_8255 EQU 0A9H ;B port of 8255 +PortC_8255 EQU 0AAH ;C Port of 8255 +PortCtrl_8255 EQU 0ABH ;8255 configuration port +AinBout8255cfg EQU 10011000b ;Set 8255 ports:- A input, B output, + +USB_DATA EQU 0ACH ;PORT ASSIGNEMENT FOR DLP-USB Controller chip +USB_STATUS EQU 0AAH ;Status port for USB port (Port C of 8255, bits 6,7) +USB_RXE EQU 80H ;If Bit 7 = 0, data available to recieve by S-100 Computer +USB_TXE EQU 40H ;If Bit 6 = 0 data CAN be written for transmission to PC + +BASE_PORT EQU 0A1H ;For XModem communication routines +MODEM_CTL_PORT EQU BASE_PORT ;A1H (Note modem I/O will be on CHANNEL A. Speaker on CHANNEL B +MODEM_DATA_PORT EQU BASE_PORT+2 ;A3H + +MODEM_SEND_MASK EQU 4 +SEND_READY EQU 4 ;VALUE WHEN READY +MODEM_RECV_MASK EQU 1 +RECV_READY EQU 1 ;BIT ON WHEN READY +MODEM_ERR_LIMIT EQU 8 ;Max number of Modem serial port re-reads aborting +MODEM_RTS_DELAY EQU 1 ;Time to check Modem RTS line (See XMODEM_LOAD & P_XMODEM_LOAD). Not critical. + +RECVD_SECT_NO EQU 0H ;IX Offset for XModem Recieved Sector Number +SECTNO EQU 1H ;IX Offset for XModem CURRENT SECTOR NUMBER +ERRCT EQU 2H ;IX Offset for XModem ERROR COUNT + +;-------------- S100Computers IDE/CF CARD Port Assignements (30-34H)---------------------------- + +IDEAport EQU 030H ;lower 8 bits of IDE interface +IDEBport EQU 031H ;upper 8 bits of IDE interface +IDECport EQU 032H ;control lines for IDE interface +IDECtrl EQU 033H ;8255 configuration port +IDEDrivePort EQU 034H ;To select the 1st or 2nd CF card/drive (Not used with this monitor) + +IDE_Reset_Delay EQU 020H ;Time delay for reset/initilization (~60 uS, with 10MHz Z80, 2 I/O wait states) + +CPM_ADDRESS EQU 100H ;Will place the CPMLDR.COM Loader here with + ;CPMLDR.COM will ALWAYS be on TRK 0,SEC2, (LBA Mode) +SEC_COUNT EQU 12 ;CPMLDR.COM requires (currently) 10, 512 byte sectors + +RDcfg8255 EQU 10010010B ;Set 8255 IDECport out, IDEAport/B input +WRcfg8255 EQU 10000000B ;Set all three 8255 ports output + +;IDE control lines for use with IDEportC. + +IDEa0line EQU 01H ;direct from 8255 to IDE interface +IDEa1line EQU 02H ;direct from 8255 to IDE interface +IDEa2line EQU 04H ;direct from 8255 to IDE interface +IDEcs0line EQU 08H ;inverter between 8255 and IDE interface +IDEcs1line EQU 10H ;inverter between 8255 and IDE interface +IDEwrline EQU 20H ;inverter between 8255 and IDE interface +IDErdline EQU 40H ;inverter between 8255 and IDE interface +IDEreset EQU 80H ;inverter between 8255 and IDE interface + +;Symbolic constants for the IDE Drive registers, which makes the +;code more readable than always specifying the address bits + +REGdata EQU IDEcs0line +REGerr EQU IDEcs0line + IDEa0line +REGseccnt EQU IDEcs0line + IDEa1line +REGsector EQU IDEcs0line + IDEa1line + IDEa0line +REGcylinderLSB EQU IDEcs0line + IDEa2line +REGcylinderMSB EQU IDEcs0line + IDEa2line + IDEa0line +REGshd EQU IDEcs0line + IDEa2line + IDEa1line ;(0EH) +REGcommand EQU IDEcs0line + IDEa2line + IDEa1line + IDEa0line ;(0FH) +REGstatus EQU IDEcs0line + IDEa2line + IDEa1line + IDEa0line +REGcontrol EQU IDEcs1line + IDEa2line + IDEa1line +REGastatus EQU IDEcs1line + IDEa2line + IDEa1line + IDEa0line + +;IDE Command Constants. These should never change. + +COMMANDrecal EQU 10H +COMMANDread EQU 20H +COMMANDwrite EQU 30H +COMMANDinit EQU 91H +COMMANDid EQU 0ECH +COMMANDspindown EQU 0E0H +COMMANDspinup EQU 0E1H + +; IDE Status Register: +; bit 7: Busy 1=busy, 0=not busy +; bit 6: Ready 1=ready for command, 0=not ready yet +; bit 5: DF 1=fault occured insIDE drive +; bit 4: DSC 1=seek complete +; bit 3: DRQ 1=data request ready, 0=not ready to xfer yet +; bit 2: CORR 1=correctable error occured +; bit 1: IDX vendor specific +; bit 0: ERR 1=error occured + +SEC$SIZE EQU 512 ;Assume sector size as 512. (Not tested for other sizes) +MAXSEC EQU 3DH ;Sectors per track for CF my Memory drive, Kingston CF 8G. (For CPM format, 0-3CH) + ;This translates to LBA format of 1 to 3D sectors, for a total of 61 sectors/track. + ;This CF card actully has 3F sectors/track. Will use 3D for my CPM3 system because + ;my Seagate drive has 3D sectors/track. Don't want different CPM3.SYS files around + ;so this program as is will also work with a Seagate 6531 IDE drive + +MAXTRK EQU 0FFH ;CPM3 allows up to 8MG so 0-256 "tracks" +STARTCPM EQU 100H ;Start location for CPM + +;----------------------------------------------------------------------------------------------------- + + + +z180_base equ 0C0h ;Will relocate all internal Z180 IO ports from 0-3FH to C0-FFH. The S100 bus + ;hardware intrerface will kick in if these ports are activeted. + ;See the schematic +; +mon_start EQU 0E000h ;Final location of this monitor 0E000H (First 56K free RAM) +RAM_STORE EQU 07000H ;Need to store some RAM variables +STACK EQU 0DFF0H ;The stack below the monitor + +IDE_Buffer EQU 100H ;Will place the IDE/CF Card Buffer here +SD_Buffer EQU 100H ;Will place the SD Card buffer here + +; +z180_cntla0 equ z180_base + 00H ; asci0 control a +z180_cntla1 equ z180_base + 01H ; asci1 control a +z180_cntlb0 equ z180_base + 02H ; asci0 control b +z180_cntlb1 equ z180_base + 03H ; asci1 control b +z180_stat0 equ z180_base + 04H ; asci0 status +z180_stat1 equ z180_base + 05H ; asci1 status +z180_tdr0 equ z180_base + 06H ; asci0 transmit +z180_tdr1 equ z180_base + 07H ; asci1 transmit +z180_rdr0 equ z180_base + 08H ; asci0 receive +z180_rdr1 equ z180_base + 09H ; asci1 receive +z180_cntr equ z180_base + 0aH ; csi/o control ;<----- For SD Card +z180_trdr equ z180_base + 0bH ; csi/o transmit/receive ;<----- For SD card +z180_tmdr0l equ z180_base + 0cH ; timer 0 data lo +z180_tmdr0h equ z180_base + 0dH ; timer 0 data hi +z180_rldr0l equ z180_base + 0eH ; timer 0 reload lo +z180_rldr0h equ z180_base + 0fH ; timer 0 reload hi +z180_tcr equ z180_base + 10H ; timer control +; +z180_asext0 equ z180_base + 12H ; asci0 extension control (z8s180) +z180_asext1 equ z180_base + 13H ; asci1 extension control (z8s180) +; +z180_tmdr1l equ z180_base + 14H ; timer 1 data lo +z180_tmdr1h equ z180_base + 15H ; timer 1 data hi +z180_rldr1l equ z180_base + 16H ; timer 1 reload lo +z180_rldr1h equ z180_base + 17H ; timer 1 reload hi +z180_frc equ z180_base + 18H ; free running counter + +z180_astc0l equ z180_base + 1aH ; asci0 time constant lo (z8s180) +z180_astc0h equ z180_base + 1bH ; asci0 time constant hi (z8s180) +z180_astc1l equ z180_base + 1cH ; asci1 time constant lo (z8s180) +z180_astc1h equ z180_base + 1dH ; asci1 time constant hi (z8s180) +z180_cmr equ z180_base + 1eH ; clock multiplier (latest z8s180) +z180_ccr equ z180_base + 1fH ; cpu control (z8s180) +; +z180_sar0l equ z180_base + 20H ; dma0 source addr lo +z180_sar0h equ z180_base + 21H ; dma0 source addr hi +z180_sar0b equ z180_base + 22H ; dma0 source addr bank +z180_dar0l equ z180_base + 23H ; dma0 dest addr lo +z180_dar0h equ z180_base + 24H ; dma0 dest addr hi +z180_dar0b equ z180_base + 25H ; dma0 dest addr bank +z180_bcr0l equ z180_base + 26H ; dma0 byte count lo +z180_bcr0h equ z180_base + 27H ; dma0 byte count hi +z180_mar1l equ z180_base + 28H ; dma1 memory addr lo +z180_mar1h equ z180_base + 29H ; dma1 memory addr hi +z180_mar1b equ z180_base + 2aH ; dma1 memory addr bank +z180_iar1l equ z180_base + 2bH ; dma1 i/o addr lo +z180_iar1h equ z180_base + 2cH ; dma1 i/o addr hi +z180_iar1b equ z180_base + 2dH ; dma1 i/o addr bank (z8s180) +z180_bcr1l equ z180_base + 2eH ; dma1 byte count lo +z180_bcr1h equ z180_base + 2fH ; dma1 byte count hi +z180_dstat equ z180_base + 30H ; dma status +z180_dmode equ z180_base + 31H ; dma mode +z180_dcntl equ z180_base + 32H ; dma/wait control +z180_il equ z180_base + 33H ; interrupt vector load +z180_itc equ z180_base + 34H ; int/trap control +; +z180_rcr equ z180_base + 36H ; refresh control +; +z180_cbr equ z180_base + 38H ; mmu common base register +z180_bbr equ z180_base + 39H ; mmu bank base register +z180_cbar equ z180_base + 3aH ; mmu common/bank area register +; +z180_omcr equ z180_base + 3eH ; operation mode control +z180_icr equ z180_base + 3fH ; i/o control register + +; +; +CLOCK_VALUE_CMR equ 00H ;For setting CPU clock speed +CLOCK_VALUE_CCR equ 00H ; " " +CNTLB0_VALUE equ 00H ; For setting final baud rate from clock +; +; (CMR) (CCR) (CNTLB0) Baud PHI ;These settings need to be checked! +; 00H 80H 20H 38,400 18.432 MHz ;Using 18.432MHz Oscillator +; 00H 00H 20H 19,200 9.2 MHz ;Using 18.432MHz Oscillator +; 00H 80H 00H 115,200 18.432 MHz ;Using 18.432MHz Oscillator +; +; 00H 00H 00H 57,600 9.2 MHz ;Setting for S100 Bus Interface +; +;======================================================================= +; BOOTSTRAP +; +; This code is begins at 0000H and is expected to get control upon +; CPU reset. It does minimal Z180 CPU initialization, then copy +; the monitor code to upper CPU RAM (F000H) and jump to it. +;======================================================================= +; + org 0000h +; +; Initialize Z180 +; + ; This code does *not* handle interrupts. Disable them and leave + ; them disabled. + im 1 + di +; + ; Set base for CPU I/O registers. + ; Do not use z180_icr equate from z180.inc because the ICR + ; is not yet at the running location. At reset, the Z180 + ; register base I/O address is zero, so initially, ICR is + ; at 3FH. + + ld a,z180_base ; C0H + out0 (3Fh),a ; at reset, icr is at 3FH + + xor a ; Disable refresh (not really required) + out0 (z180_rcr),a + ; To make PHI=Osc Input, set bit 7 of CCR + ; To make OHI=2X Osc Input, set bits 7 of CCR and CMR + ld a,CLOCK_VALUE_CMR ; 00H, Set clock speed,(normally 0H) + out0 (z180_cmr),a ; set CMR + ld a,CLOCK_VALUE_CCR ; 80H, (normally 80H, OSC=PHI) + out0 (z180_ccr),a ; set CCR + ; +; + ; set default wait states (super conservative for now) + ld a,0F0h ; +3 mem waits, +3 i/o waits + out0 (z180_dcntl),a +; + ; Setup Z180 MMU assuming physical memory is + ; 512KB ROM / 512KB RAM. CPU address spaces is split at + ; 32KB/32KB. The upper 32KB is mapped to the top 32KB of + ; physical memory (RAM). The lower 32KB is left mapped to + ; the lowest 32KB of memory (ROM), so we continue to run + ; from ROM at this point. + ld a,80h + out0 (z180_cbar),a ; setup for 32k/32k bank config + ld a,(1024 - 64) >> 2 + out0 (z180_cbr),a ; common base = last (top) bank +; + ; We have RAM now in upper 32K now. Initialize the stack + ; at top of CPU memory. + ld sp,STACK ; Put the stack just below the monitor at E000H (DFFF0) +; + ; Confirm RAM is working by pushing a value on the stack, then + ; popping the value to a different register and writing it to the + ; diagnostic LEDs +; + ld hl,mon_img + ld de,mon_start + ld bc,mon_len + ldir +; +jp mon_start + + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;To clean up PROM for easy reading + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + Db 0,0,0,0 + +; Jump to monitor!!! +; + +; +;======================================================================= +; MONITOR +; +; This is the system moitor code that is intended to run from RAM at +; E000H. +;======================================================================= +; +mon_img equ $ ; start of monitor image +; + .phase mon_start ; running location for monitor +; + JP OVER_VECTORS + +CON_OUT: JP ZCO ;0E003H, Interrupt/BIOS routines are counting on these locations +CON_STAT: JP ZCSTS ;0E006H, never changing +CON_IN: JP ZCI ;0E009H +SEND_STRING: JP PRINT_STRING ;0E00CH +MONITOR_NMI JP DEFAULT_NMI ;0E00FH +MONITOR_INTO JP DEFAULT_INT0 ;0E012H + +DEFAULT_NMI: + PUSH AF + PUSH BC + PUSH HL + LD HL,NMI_MSG + CALL PRINT_STRING + POP HL + POP BC + POP AF + RETI + +DEFAULT_INT0: + PUSH AF + PUSH BC + PUSH HL + LD HL,INT0_MSG + CALL PRINT_STRING + POP HL + POP BC + POP AF + RETI + +OVER_VECTORS: + ld a,64h ; xmit enable, rcv enable, 8 data bits, no parity + out0 (z180_cntla0),a + ld a,CNTLB0_VALUE ; 20H, Baud=19,200 @ 9.2 MHz + out0 (z180_cntlb0),a + ld a,60h ; dcd0 disable, cts0 disable + out0 (z180_asext0),a +; +; + ld b,0 ; Delay after ASCI setup (should not be needed) + djnz $ + djnz $ +; + ; Select first bank of RAM into lower 32K of CPU memory. This is + ; where we abandon the physical ROM and switch to all RAM in the + ; CPU address space. +; + ld a,10h ; first physical bank of RAM + call bnksel ; do it +; + ; *** Add code as desired to setup Z180 zero page *** +; + ; At this point RAM is mapped to entire CPU address space. This is + ; the right place to setup lower RAM, if needed. However, nothing + ; needs to be done for the remainder of this sample code. +; +;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +; +; +BEGIN0: JP BEGIN ;JUMP OVER COMMAND TABLE + +TBL: DW FLUSH ;"@" SEND FF to LaserJet printer + DW MEMMAP ;"A" DISPLAY A MAP OF MEMORY + DW BOOT ;"B" BOOT ROMWBW + DW NOT_DONE ; "C" SPARE + DW DISP ;"D" DISPLAY MEMORY (IN HEX & ASCII) + DW CHAR_TEST ;"E" ECHO CHAR IN TO CHAR OUT + DW FILL ;"F" FILL MEMORY WITH A CONSTANT + DW GOTO ;"G" GO TO [ADDRESS] + DW SHOW_DATE ;"H" SHOW CURRENT DATE + DW SHOW_TIME ;"I" SHOW CURRENT TIME + DW MEM_TEST ;"J" DESTRUCTIVE MEMORY TEST + DW KCMD ;"K" DISPLAY THE LIST OF MONITOR COMMANDS + DW NOT_DONE ; "L" SPARE + DW MOVE ;"M" MOVE BLOCK OF MEMORY (START,FINISH,DESTINATION) + DW S100_TESTS ;"N" Hardware tests for the S100 bus + DW SWITCH_8086 ;"O" INPUT Port ED (switched in 8086/80286) + DW HBOOTCPM ;"P" BOOT IN CPM FROM The S100 bus IDE/CF Card Board + DW QUERY ;"Q" QUERY PORT (IN OR OUT) + DW INPORTS ;"R" Read ALL Input Ports + DW SUBS ;"S" SUBSTITUTE &/OR EXAMINE MEMORY + DW TYPE ;"T" TYPE ASCII PRESENT IN MEMORY (Same as D cmd except ASCII) + DW HALT_CPU ;"U" HALT CPU + DW VERIFY ;"V" COMPARE MEMORY + DW SD_CARD_MENU ;"W" SD CARD MENU + DW XMODEM ;"X" DOWNLOAD A FILE FROM PC VIA XMODEM VIA THE S100 SERIAL BOARD + DW IDE_BOARD_MENU ;"Y" IDE Menu for IDE/CF Card Board + DW SIZE ;"Z" FIND HIGHEST R/W RAM + + +BEGIN: DI ;No interrupts + XOR A ;SET INTERUPT TO PAGE 0H + LD I,A ;Z80 Interrupt page 0 + +SETUP_STACK: + LD SP,AHEAD-4 ;SETUP A FAKE STACK + JP MEMSZ1 ;RETURNS WITH TOP OF RAM IN [HL] + DW AHEAD ;A Return opcode will pick up this address +AHEAD: + LD SP,STACK ;Put stack below monitor at 0EFF0H + LD HL,0 + ADD HL,SP + PUSH HL ;Store it for below + POP IY + +IF ST8C4 ;If S100_Parallel_IO Board for Printer output + LD A,08H ;Initilize the ST8C4 PC-Printer Port IO + OUT (PRINTER_CTRL),A +ELSE + LD A,0FFH ;IMSAI PIO Board. Clear Printer strobe, comes up 0 on a reset + OUT (PRINTER_STROBE),A +ENDIF + + ;We need to clear the 8259A otherewise the 8086 monitor sometimes hangs + LD A,MasterICW1 ;Initilize the 8259A PIC Controller (;EDGE triggered, 4 bytes, single Master,ICW4 needed) + OUT (MASTER_PIC_PORT),A + LD A,MasterICW2 ;Ints starts at 20H in RAM (IBM-PC uses 8X4 = 20H) + OUT (MASTER_PIC_PORT+1),A + LD A,MasterICW4 ;No slaves above, so 8259 does not expect ICW3 + out (MASTER_PIC_PORT+1),A + + LD A,11111111b ;Allow no interrupts to the 8259A with Z80. + out (MASTER_PIC_PORT+1),A + + + LD HL,SIGNON_MSG + CALL PRINT_STRING ;Have a Stack, so now we can use CALL + + LD HL,TOP_RAM_MSG ;Print Top of RAM + CALL PRINT_STRING + + LD HL,STACK-0F0H ;Top of RAM available RAM + CALL HL_ONLY ;Print HL/SP + + LD HL,SP_MSG ;Print Current Stack Location + CALL P_STRING + + PUSH IY ;SP is stored from above in [IY] + POP HL + CALL HL_ONLY ;Print HL/SP + + LD HL,IOBYTE_MSG ;Print Current IOBYTE value + CALL P_STRING + + IN0 A,(IOBYTE) ;Show IOBYTE. If bit 0=0 (force printer output), CMP/3 boot will hang + CALL ZBITS + CALL ZCRLF ;Then ZCRLF + + LD A,04H ; Turn off the SD card adaptor CS* line + OUT0 (SD_CARD_CS),A ; 0CH + OUT0 (SD_CARD_LED),A ; 0EH + + CALL ZCSTS ;CHECK IF GARBAGE AT KEYBOARD + CALL NZ,ZCI ;If so flush it + ; Echo input to output + + ;Initilize the S100Computers Serial Ports I/O Board + CALL INIT_SCC_A ;Initilize the Zilog 8530-A (XModem I/O) + CALL INIT_SCC_B ;Initilize the Zilog 8530-B (Speech synthizer) + ;Next initilize the 8255 on this same board + + LD A,AinBout8255cfg ;A input, B output, C(bits 0-3) output, (bits 4-7)input + OUT (PortCtrl_8255),A ;Config 8255 chip, Mode 0 + ;Note 8255 port C used for DLP-USP Port Chip Status + + LD HL,CR_SMSG_SP ;lets V-Stamp chip get baud rate + CALL SPEAK$ + + +;-------THIS IS THE START ON THE MAIN MONITOR LOOP-------------------------------- + +ZSTART: LD DE,ZSTART + PUSH DE ;EXTRA UNBALANCED POP & [DE] WOULD END UP IN [PC] + CALL ZCRLF + LD C,'-' + CALL ZCO + LD C,'>' + CALL ZCO + +STARO: CALL TI ; Main loop. Monitor will stay here until cmd. + CP ESC ; escape? + jp z,echoz ; done if so + AND 7FH + JR Z,STARO + SUB '@' ;Commands @ to Z only + RET M + CP 1BH ;A-Z only + RET NC + ADD A,A + LD HL,TBL + ADD A,L + LD L,A + LD A,(HL) + INC HL + LD H,(HL) + LD L,A + LD C,02H + JP (HL) ;JUMP TO THE COMMAND TABLE + + + +;>>>>>>>>>>>>>>>>>>>> MAIN CONSOLE ROUTINES <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + +; Print a single character in C to the primary CONSOLE PORT +; Will wait for serial output port to be ready. +; +ZCO: IN0 A,(IOBYTE) ;Charcter in C + BIT 0,A + JR NZ,SERIAL_ZCO +S100_ZCO: + IN0 A,(CONSOLE_STATUS) ;S100 Bus PROPELLER CONSOLE I/O BOARD PORT + AND 4H + JR Z,S100_ZCO +; CALL DELAY + LD A,C + CP 07H ;IS IT A BELL + JR Z,BELL1 + CP 0H ;SD BOARD CANNOT TAKE A NULL! + RET Z + OUT0 (CONSOLE_OUT),A + RET ;RETURN CHARACTER SENT IN [A] + +BELL1: LD A,06H ;SEND A BELL + OUT0 (CONSOLE_OUT),A + LD A,0FH + CALL BELL_DELAY + LD A,07H + OUT0 (CONSOLE_OUT),A + LD A,C + RET + + +BELL_DELAY: + DEC A ;GENERAL COUNT DOWN TIME DELAY + RET Z ;LENGTH SET IN [A] + PUSH AF + LD A,05H +MORE: DEC A + PUSH AF + XOR A +MORE2: DEC A + JR NZ,MORE2 + POP AF + JR NZ,MORE + POP AF + JR BELL_DELAY +; +; +SERIAL_ZCO: ;;SC131 CIRCUIT SERIAL PORT + call outstat ; get output status + jr z,SERIAL_ZCO ; loop till ready +; CALL DELAY + out0 (z180_tdr0),C ; send character in C + ret ; done +; +; Check status of ASCI serial output. Returns non-zero (ZF cleared) +; if output register ready +; +outstat: + in0 a,(z180_stat0) ; get status + and 02h ; bit 1 set means ready + ret ; done +; +; +; +; +; Get a single character from the primary CONSOLE PORT and return +; it in A. Will wait for serial input port to have a char ready. +; + +ZCI: IN0 A,(IOBYTE) + BIT 0,A + JR NZ,SERIAL_ZCI +S100_ZCI: + IN0 A,(CONSOLE_STATUS) ;NEED CONSTAT TO CLEAN UP SHIFT KEYS ETC + AND 02H + JR Z,S100_ZCI + IN0 A,(CONSOLE_IN) + AND 7FH ;7 bits only + RET +; +; +SERIAL_ZCI: + call SERIAL_ZCSTS ; get input status + jr z,SERIAL_ZCI ; loop till char ready + in0 a,(z180_rdr0) ; get it + ret ; done +; +; +; Check status of CONSOLE INPUT PORT. Returns non-zero (ZF cleared) +; if the input port has a character available. Note that Z180 ASCI +; will stall (stop reception) if a line error is detected. In order +; to ensure continuous reception, it is necessary to check for and +; clear line errors. +; +ZCSTS: IN0 A,(IOBYTE) + BIT 0,A + JR NZ,SERIAL_ZCSTS +S100_ZCSTS: + IN0 A,(CONSOLE_STATUS) + AND 02H + JP Z,NOCHAR + XOR A + DEC A ;RETURN WITH 0FFH IN [A] IF SOMETHING + RET +NOCHAR: XOR A ;RETURN WITH 0 IN A IF NOTHING THERE + RET +; +; +SERIAL_ZCSTS: + in0 a,(z180_stat0) ; read stat reg + push af ; save status + and 70h ; parity, framing, or overrun error? + jr z,instat1 ; jump ahead if no errors + ; clear error(s) or nothing further can be received!!! + in0 a,(z180_cntla0) ; read CNTLA + res 3,a ; clear efr (error flag reset) + out0 (z180_cntla0),a ; write updated CNTLA +instat1: + pop af ; restore status value + and 80h ; data ready? + ret ; done +; +; +;DELAY: +; PUSH BC +; LD B,10 +; DJNZ $ +; POP BC +; RET + + + +;---------------------------- A COMMAND MEMORY MAP ------------------------------------------- + +;MEMORY MAP PROGRAM CF.DR.DOBBS VOL 31 P40. +;IT WILL SHOW ON CONSOL TOTAL MEMORY SUMMARY OF RAM,PROM, AND NO MEMORY + +MEMMAP: + CALL ZCRLF + LD HL,0 + LD B,1 +MAP1: LD E,'R' ;PRINT R FOR RAM + LD A,(HL) + CPL + LD (HL),A + CP (HL) + CPL + LD (HL),A + JR NZ,MAP2 + CP (HL) + JR Z,PRINT +MAP2: LD E,'p' +MAP3: LD A,0FFH + CP (HL) + JR NZ,PRINT + INC L + XOR A + CP L + JR NZ,MAP3 + LD E,'.' +PRINT: LD L,0 + DEC B + JR NZ,NLINE + LD B,16 + CALL ZCRLF + CALL HXOT4 +NLINE: LD A,SPACE + CALL OTA + LD A,E + CALL OTA + INC H + JR NZ,MAP1 + CALL ZCRLF + CALL ZCRLF + JP ZSTART + + +;16 HEX OUTPUT ROUTINE + +HXOT4: LD C,H + CALL HXO2 + LD C,L +HXO2: LD A,C + RRA + RRA + RRA + RRA + CALL HXO3 + LD A,C +HXO3: AND 0FH + CP 10 + JR C,HADJ + ADD A,7 +HADJ: ADD A,30H +OTA: PUSH BC + LD C,A + CALL ZCO ;SEND TO CONSOL + POP BC + RET + + +;---------------------------- B COMMAND BOOT ROMWBW ------------------------------------------- + +;RESTART SYSTEM WITH ROMWBW BOOT OVERRIDE FLAG IN THE Z180 RELOAD +;REGISTER 1 LOW + +BOOT: LD HL,BOOT_ROM_MSG ;Booting ROMWBW + CALL PRINT_STRING + LD A,'W' ;OVERRIDE VALUE + OUT0 (Z180_RLDR1L),A ;SET RELOAD REGISTER 1 LOW + XOR A ;ROM BANK 0 PLEASE + CALL bnksel ;SELECT BANK IN LOW MEM + JP 0 ;AND JUMP TO THE START + + + +;----------------------- D COMMAND DISPLAY MEMORY IN HEX --------------------------------------- + +DISP: CALL EXLF ;GET PARAMETERS IN [HL],[DE] + LD A,L ;ROUND OFF ADDRESSES TO XX00H + AND 0F0H + LD L,A + LD A,E ;FINAL ADDRESS LOWER HALF + AND 0F0H + ADD A,10H ;FINISH TO END 0F LINE +SF172: CALL LFADR +SF175: CALL BLANK + LD A,(HL) + CALL ZHEXOUT + CALL HILOX + LD A,L + AND 0FH + JR NZ,SF175 + LD C,TAB ;INSERT A TAB BETWEEN DATA + CALL ZCO + LD B,4H ;ALSO 4 SPACES +TA11: LD C,SPACE + CALL ZCO + DJNZ TA11 + + LD B,16 ;NOW PRINT ASCII (16 CHARACTERS) + PUSH DE ;TEMPORLY SAVE [DE] + LD DE,0010H + SBC HL,DE + POP DE +T11: LD A,(HL) + AND 7FH + CP ' ' ;FILTER OUT CONTROL CHARACTERS' + JR NC,T33 +T22: LD A,'.' +T33: CP 07CH + JR NC,T22 + LD C,A ;SET UP TO SEND + CALL ZCO + INC HL + DJNZ T11 ;REPEAT FOR WHOLE LINE + JR SF172 + +BLANK: LD C,' ' + JP ZCO + + +;----------------------- N COMMAND S100 BUS TESTS --------------------------------------- + +S100_TESTS: + LD HL,S100_MENU + CALL PRINT_STRING + + CALL PCHK + CP '0' + JP Z,ROOL_ADDRESSES + CP '1' + JP Z,sOUT_TEST + CP '2' + JP Z,sINP_TEST + CP '3' + JP Z,CONSOLE_IO_TEST + CP '4' + JP Z,SPEECH_TEST + CP '5' + JP Z,MODEM_TEST + CP '6' + JP Z,PRINTER_TEST + CP '7' + JP Z,TOGGLE_INTS + CP ESC + JP Z,MENU_DONE + JP ERROR + +MENU_DONE: + CALL ZCRLF + CALL ZCRLF + JP BEGIN + +ROOL_ADDRESSES: + LD HL,0 +HL_LOOP: + PUSH HL + CALL HL_ONLY + CALL ZSPACE + LD A,(HL) + CALL ZHEXOUT + CALL ZCRLF + POP HL + INC HL + CALL ZCSTS ; get input status + JR Z,HL_LOOP ; nothing + CALL ZCI ; loop till char ready + CP A,ESC ; Abort if ESC + JP Z,S100_TESTS ; done + JR HL_LOOP + +sOUT_TEST: + LD A,'3' + OUT (CONSOLE_OUT),A + JR sOUT_TEST + + +sINP_TEST: + IN0 A,(CONSOLE_IN) + PUSH AF + CALL ZHEXOUT + CALL ZSPACE + POP AF + CALL ZBITS + CALL ZCRLF + JR sINP_TEST + + +CONSOLE_IO_TEST: + LD HL,CONSOLE_TEST ;'Enter S100 bus keyboard char. ESC to abort ',0 + CALL PRINT_STRING +IN_TEST2: + CALL S100_ZCI + CP A,ESC + JP Z,S100_TESTS ; done + LD C,A + CALL S100_ZCO + JR IN_TEST2 + + + +SPEECH_TEST: + LD HL,SMSG_SP + CALL SPEAK$ + JP S100_TESTS ; done + + + +MODEM_TEST: + LD HL,CONSOLE_TEST ;'Enter S100 bus keyboard char. ESC to abort ',0 + CALL PRINT_STRING +MODEM_TEST1: + CALL S100_ZCSTS + JR Z,MODEM_TEST2 + CALL ZCI ;Get a keyboard character + LD C,A + CP A,ESC + JP Z,S100_TESTS ; done + CALL ZCO + CALL MODEM_ZCO + +MODEM_TEST2: + CALL MODEM_ZSTATUS + JP Z,MODEM_TEST1 + CALL MODEM_ZCI ;Get a character + LD C,A + CP A,ESC + JP Z,S100_TESTS ; done + CALL ZCO + CALL MODEM_ZCO + JP MODEM_TEST1 + + + +PRINTER_TEST: + LD HL,S100_MENU ; Print test menu +PRINTER_TEST1: + ld a,(hl) ; get next char + CP A,'$' ; Terminate with a '$' or 0H + JP Z,PRINTER_TEST2 + or a ; end of string? + JP Z,PRINTER_TEST2 + LD C,A + call LO ; print the char + inc hl ; bump to next char in string + jr PRINTER_TEST1 ; loop till done + +PRINTER_TEST2: + CALL FLUSH + RET + + + +TOGGLE_INTS: + LD HL,NMI_VECTOR ;Set default NMI vector jump at 66H in RAM + LD A,0C3H + LD (HL),A + INC HL + LD DE,DEFAULT_NMI + LD (HL),E + INC HL + LD (HL),D + + LD HL,INT0_VECTOR ;Set default INT0 vector jump at 38H in RAM + LD A,0C3H + LD (HL),A + INC HL + LD DE,DEFAULT_INT0 + LD (HL),E + INC HL + LD (HL),D + + LD A,(@INTS_FLAG) + OR A + JR Z,TURN_ON_INTS + + LD HL,INTS_OFF_MSG ;'Turning off Interrupts' + CALL PRINT_STRING + XOR A + LD (@INTS_FLAG),A ;Flag Interrupts as OFF + DI ;Just in case + JP S100_TESTS ;done + +TURN_ON_INTS: + LD HL,INTS_ON_MSG ;'Turning on Interrupts' + CALL PRINT_STRING + LD A,0FFH + LD (@INTS_FLAG),A ;Flag Interrupts as ON + EI ;Just in case + JP S100_TESTS ;done + + + + + +;------------------------------ S COMMAND SUBSTITUTE AND / OR MODIFY MEMORY ---------------------- + +SUBS: LD C,1 + CALL HEXSP + POP HL +SF2E3: LD A,(HL) + CALL ZHEXOUT + LD C,'-' + CALL ZCO + CALL PCHK + RET C + JR Z,SF2FC + CP ESC ;Abort if ESC + JP Z,ESC_ABORT + CP 5FH + JR Z,SF305 + PUSH HL + CALL EXF + POP DE + POP HL + LD (HL),E + LD A,B + CP CR + RET Z +SF2FC: INC HL +SF2FD: LD A,L + AND 07H + CALL Z,LFADR + JR SF2E3 +SF305: DEC HL + JR SF2FD + + + +;-------------------------- F COMMAND FILL A BLOCK OF MEMORY WITH A VALUE ------------------------ + +FILL: CALL EXPR3 +SF1A5: LD (HL),C + CALL HILOX + JR NC,SF1A5 + POP DE + JP ZSTART + + +;---------------------------- G COMMAND GO TO A RAM LOCATION -------------------------------- + +GOTO: LD C,1 ;SIMPLE GOTO FIRST GET PARMS. + CALL HEXSP + CALL ZCRLF + POP HL ;GET PARAMETER PUSHED BY EXF + JP (HL) + + + +;-------------------------- Q COMMAND GET OR OUTPUT TO A PORT --------------------------------- + +QUERY: CALL PCHK + CP 'O' ;OUTPUT TO PORT + JR Z,OUT_PORT + CP 'I' ;INPUT FROM PORT + JP Z,IN_PORT + LD C,'*' + JP ZCO ;WILL ABORT IF NOT 'I' OR 'O' + + +IN_PORT: + LD C,1 ;IN Port + CALL HEXSP + POP BC + IN A,(C) + CALL ZSPACE + JP ZBITS +; +OUT_PORT: + CALL HEXSP ;OUT Port + POP DE + POP BC + OUT (C),E + RET + +;-------------------------- U COMMAND HALT the Z180 CPU --------------------------------- + +HALT_CPU: + LD HL,HALT_MSG + CALL PRINT_STRING ;Print message up to '$' + HALT + + +;-------------------------- W COMMAND Switch control of S100 Bus to slave CPU (eg 8086) --------------------------------- + +SWITCH_8086: ; "W" INPUT Port ED (switched in 8086/80286) + ;Note currently the S100 slave switch ports overlaps with the Z180 internal ports + + LD HL,SLAVE_MSG ;Send before we switch internal ports + CALL PRINT_STRING + + ld a,00H ;Move back to the defauly Z180 base register port (00H) + out0 (0FFH),a ;icr is currently at FFH + + IN0 A,(SW_TMA0) ;THIS SWITCHES CPU'S with no block Move + NOP ;Z80 WILL BE HELD HERE + NOP + LD A,01 ;Utilize the more specific circuit on the V2-SMB + OUT0 (SW_TMAX),A ;Make sure its bit 0 + NOP + NOP + NOP + JP BEGIN0 ;If we get back control + + +;------THIS IS THE MAIN ROUTINE TO GET THE TIME DATA FROM THE CMOS-RTC Chip on the MSDOS Support Board + +SHOW_TIME: + LD HL,TIME_MSG + CALL PRINT_STRING ;Print message up to '$' + CALL READ_TIME + RET + +SHOW_DATE: + LD HL,DATE_MSG + CALL PRINT_STRING ;Print message up to '$' + CALL READ_DATE + RET + + +;------------------------------------------------------------------------------------- +READ_TIME: + CALL UPD_IN_PR ;CHECK FOR UPDATE IN PROCESS + JP NC,RTC_2A ;GO AROUND IF OK + JP ERROR ;IF ERROR + +RTC_2A: LD E,-2 ;-2 goes to 0 for PORT_INC_2 + CALL PORT_INC_2 ;SET ADDRESS OF SECONDS + IN0 A,(CMOS_PORT+1) ;Get BCD value returned + LD D,A ;SAVE IN D + CALL PORT_INC_2 ;SET ADDRESS OF MINUTES + IN0 A,(CMOS_PORT+1) ;Get BCD value returned + LD C,A ;SAVE IN C + CALL PORT_INC_2 ;SET ADDRESS OF HOURS + IN0 A,(CMOS_PORT+1) ;Get BCD value returned + LD B,A ;SAVE + LD E,0 ;SET E TO ZERO + CALL DisplayTime ;<<<<<<<<<<<<<< + CALL ZCRLF + CALL ACTIVATE_CLOCK + RET + +;Display time +; Arrive with B = HOURS IN BCD +; C = Minutes in BCD +; D = Seconds in BCD +DisplayTime: + PUSH HL + PUSH DE + PUSH BC + LD A,B + CALL PRINT_BCD ;Hours. Convert BCD to ASCII + LD C,':' + CALL ZCO + POP BC + LD A,C + CALL PRINT_BCD ;Minutes. Convert BCD to ASCII + LD C,':' + CALL ZCO + POP DE + LD A,D + CALL PRINT_BCD ;Seconds. Convert BCD to ASCII + POP HL + RET + +;------------------------------------------------------------------------------------------- +READ_DATE: + CALL UPD_IN_PR + JP NC,RTC_4A + JP ERROR ;ON ERROR + +RTC_4A: LD E,6 + CALL PORT_INC ;POINT TO DAY + IN0 A,(CMOS_PORT+1) + LD B,A ;SAVE IN A + CALL PORT_INC ;POINT TO MONTH + IN0 A,(CMOS_PORT+1) + LD D,A ;SAVE IN D + CALL PORT_INC ;POINT TO YEAR + IN0 A,(CMOS_PORT+1) + LD C,A ;SAVE IN C + LD E,31H ;POINT TO CENTURY BYTE SAVE AREA + CALL PORT_INC ; + IN0 A,(CMOS_PORT+1) ;GET VALUE + LD E,B ;GET DAY BACK + LD B,A + CALL DisplayDate + CALL ZCRLF + CALL ACTIVATE_CLOCK + RET ;FINISHED + + +;Display date +; Return B = CENTURY IN BCD +; C = Year in BCD +; D = Month in BCD +; E = Day in BCD +DisplayDate: + PUSH HL + PUSH DE + PUSH DE + PUSH BC + LD A,20H ;<--20 + CALL PRINT_BCD ;Century (19/20). Convert BCD to ASCII + POP BC + LD A,C + CALL PRINT_BCD ;Year. Convert BCD to ASCII + LD C,'/' + CALL ZCO + POP DE + LD A,D + CALL PRINT_BCD ;Month. Convert BCD to ASCII + LD C,'/' + CALL ZCO + POP DE + LD A,E + CALL PRINT_BCD ;Day. Convert BCD to ASCII + POP HL + CALL ACTIVATE_CLOCK + RET + + +ACTIVATE_CLOCK: + LD A,0AH + OUT0 (CMOS_PORT),A + LD A,0AAH + OUT0 (CMOS_PORT+1),A + RET + + +PRINT_BCD: ;Print BCD in [A] + PUSH AF + PUSH AF + RRA + RRA + RRA + RRA + AND A,0FH + ADD A,30H + LD C,A ;Write high byte mins to CRT + CALL ZCO + POP AF + AND A,0FH + ADD A,30H + LD C,A + CALL ZCO + POP AF + RET + + +UPD_IN_PR: ;Check we are ready to read clock + PUSH BC + LD BC,8000 ;SET LOOP COUNT +UPDATE: LD A,0AH ;ADDRESS OF [A] REGISTER + OUT0 (CMOS_PORT),A + NOP + NOP + NOP + IN0 A,(CMOS_PORT+1) ;READ IN REGISTER [A] + AND A,80H ;IF 8XH--> UIP BIT IS ON (CANNOT READ TIME) + JP Z,UPD_IN_PREND ;Are we ready/done + DEC BC + LD A,C + OR A,B + JP NZ,UPDATE ;Try again + XOR A,A ; + SCF ;SET CARRY FOR ERROR + POP BC + RET +UPD_IN_PREND: + XOR A,A ;Clear Carry + POP BC + RET ;RETURN + + +PORT_INC: + LD A,E + INC A ;INCREMENT ADDRESS + LD E,A + OUT0 (CMOS_PORT),A + RET + + +PORT_INC_2: + LD A,E + ADD 2 ;INCREMENT ADDRESS + LD E,A + OUT0 (CMOS_PORT),A + RET + + +;--------------------- J COMMAND MEMORY TEST --------------------------------- + +MEM_TEST: + LD HL,MEM_TEST_MSG ;Memory test + CALL PRINT_STRING + LD HL,0DF00H + LD E,00H + LD D,01H + LD B,0H ;256 loops +MEM_LOOP: + LD (HL),00H ;Fill RAM with 0's + DEC HL + LD A,L + OR A,H + JR NZ,MEM_LOOP + + LD HL,0DF00H ;Next check and change to 1's.... + LD E,00H + LD D,01H +MEM_LOOP1: + PUSH AF + PUSH BC + CALL ZPRINT_HL + LD A,E + CALL ZHEXOUT ;Print address and value + CR + CALL ZSPACE + LD C,CR + CALl ZCO + POP BC + POP AF + + LD A,(HL) + CP A,E + CALL NZ,RAM_ERROR + LD (HL),D + DEC HL + LD A,L + OR A,H + JR NZ,MEM_LOOP1 + + CALL ZCRLF + LD HL,0DF00H + INC E + INC D + DEC B ;Do 256 tests + JR NZ,MEM_LOOP1 + JP BEGIN + +RAM_ERROR: + PUSH HL + LD HL,MEM_ERR_MSG ;Memory error + CALL PRINT_STRING + POP HL + CALL ZPRINT_HL + CALL ZCRLF + RET + + + + + +;---------------------- M COMMAND MOVE A BLOCK OF MEMORY TO ANOTHER LOCATION ------------------- + +MOVE: CALL EXPR3 +SF21E: LD A,(HL) + LD (BC),A + INC BC + CALL HILOX + JR SF21E + + + +;----------------------V COMMAND VERIFY ONE BLOCK OF MEMORY WITH ANOTHER ---------------------- + +VERIFY: CALL EXPR3 +VERIO: LD A,(BC) + CP (HL) + JR Z,SF78E + PUSH BC + CALL CERR + POP BC +SF78E: INC BC + CALL HILOX + JR VERIO + RET +; +CERR: LD B,A + CALL ZPRINT_HL + LD A,(HL) + CALL ZHEXOUT + CALL BLANK + LD A,B + CALL ZHEXOUT + JP ZCRLF + + + +;-------------------- E COMMAND CHECK ECHO CHAR IN TO CHAR OUT -------------------------------- + +CHAR_TEST: + LD HL,CHAR_TEST_MSG ;Keyboard test + CALL PRINT_STRING +CHAR_TEST1: + CALL ZCI ;Routeen to check keyboard etc. + CP ESC ;Loop until ^C or ESC + RET Z + CP 'Z'-40H + RET Z + LD C,A + CALL ZCO + JR CHAR_TEST + + + +;----------------- T COMMAND READ ASCII FROM MEMORY -------------------------------------- + +TYPE: CALL EXLF +SF30B: CALL LFADR + LD B,56 +SF310: LD A,(HL) + AND 7FH + CP SPACE + JR NC,SF319 +SF317: LD A,2EH +SF319: CP 7CH + JR NC,SF317 + LD C,A + CALL ZCO + CALL HILOX + DJNZ SF310 + JR SF30B + + +;---------------------- R COMMAND Display all active IO inputports in the system ---------------------- +; +INPORTS:CALL ZCRLF + LD B,0 ;Now loop through all ports (0-FF) + LD D,6 ;Display 6 ports across + LD E,0FFH ;Will contain port number +LOOPIO: LD C,E + LD A,E + CP A,SW_TMA0 ;Inputting here will switch out the Z80 to 8086/80286 + JR Z,SKIP ;Skip because we don't want that right now + CP SOUT_PORT + JR Z,SKIP +; + IN A,(C) ;Remember [ZASMB does not work with this opcode,SLR is OK] + CP A,0FFH ;No need for 0FF's + JR Z,SKIP + LD H,A ;store port data in H for below + LD A,E ;Need to print port # first + CALL ZHEXOUT ;Print port number + LD C,'-' + CALL ZCO + LD C,'>' + CALL ZCO + LD A,H ;get back port data + CALL ZHEXOUT ;print it + LD C,TAB + CALL ZCO + DEC D ;6 ports per line + JR NZ,SKIP + LD D,6 + CALL ZCRLF +SKIP: DEC E ;Next Port + DJNZ LOOPIO + CALL ZCRLF + RET + + +;----------------- K COMMAND PRINT MAIN MONITOR MENU ON CRT --------------------------- + +KCMD: LD HL,SIGNON_MSG ;Signon Msg again (K Command) + CALL PRINT_STRING + LD HL,SMSG_SP ;Signon speech message + CALL SPEAK$ + LD HL,MENUMSG ;Then Menu Message + JP PRINT_STRING + + + + + +;---------------------- X COMMAND XMODEM --------------------------------------------------- + +;This routine will download any XMODEM formatted data from a file on a PC over teh USB port. +;If the USB port is NOT also also used console I/O progress of the download will appear on the screen. +;If the USB port is ALSO used for console I/O no progress is shown until the download is complete. + +XMODEM: + LD HL,MODEM_SIGNON ;Send Modem signon message + CALL PRINT_STRING + + LD HL,0 ;SP to HL + ADD HL,SP + LD DE,40H ;Drop 40H bytes below to be safe + SBC HL,DE + PUSH HL + POP IX ;Will store data below in RAM 40H bytes below SP to be safe + + XOR A,A ;Initilize flags + LD (IX+RECVD_SECT_NO),A + LD (IX+SECTNO),A + LD (IX+ERRCT),A + + LD HL,MODEM_RAM_LOC ;Get RAM location for where to place code + CALL PRINT_STRING + LD C,1 + CALL HEXSP ;Get 16 bit value, put on stack + POP IY ;DMA Value now in IY + CALL ZCRLF + + CALL INIT_SCC_A ;INITITIALIZE THE SCC SERIAL PORT A Just in case it changed + + LD B,1 ;TIMEOUT DELAY + CALL MODEM_ZCI ;GOBBLE UP GARBAGE CHARS FROM THE LINE + + + +RECV_LOOP: ;<------- MAIN RECIEVE LOOP + XOR A,A ;GET 0 + LD (IX+ERRCT),A ;INITIAL ERROR COUNT SET TO 0 +RECV_HDR: + LD HL,RMSG + CALL PRINT_STRING ;Skip print if USB port is also console + LD A,(IX+SECTNO) ;Get current sector number + INC A + CALL LBYTE ;Show Sector Number on Console if USB port is NOT also console + + LD HL,MODEM_RAM_MSG ;"H. IF OK, will write to RAM location" + CALL P_STRING + PUSH IY + POP HL ;IY to HL + CALL LADR ;Show DMA Address if USB port is NOT also console + CALL ZCRLF + + LD B,5 ;5 SEC TIMEOUT + CALL MODEM_ZCI + JP NC,RHNTO ;IF ALL OK (NO TIMEOUT), THEN DROP DOWN TO RHNTO TO GET DATA + +RECV_HDR_TIMEOUT: + CALL TOUT ;PRINT TIMEOUT + +RECV_SECT_ERR: ;PURGE THE LINE OF INPUT CHARS + LD B,1 ;1 SEC W/NO CHARS + CALL MODEM_ZCI + JP NC,RECV_SECT_ERR ;LOOP UNTIL SENDER DONE + LD A,NAK + CALL MODEM_ZCO ;SEND NAK + + LD A,(IX+ERRCT) + INC A + LD (IX+ERRCT),A + CP A,MODEM_ERR_LIMIT + JP C,RECV_HDR + + CALL CHECK_FOR_QUIT + JP Z,RECV_HDR + LD HL,BAD_HEADER_MSG + CALL PRINT_STRING + JP BEGIN + + +RHNTO: CP A,SOH ;GOT CHAR - MUST BE SOH + JP Z,GOT_SOH ;Z IF OK + OR A,A ;00 FROM SPEED CHECK? + JP Z,RECV_HDR + CP A,EOT + JP Z,GOT_EOT + ;DIDN'T GET SOH - + CALL LBYTE ;Print [A] on console + LD HL,ERRSOH + CALL PRINT_STRING + JP RECV_SECT_ERR + +GOT_SOH: + LD B,1 + CALL MODEM_ZCI + JP C,RECV_HDR_TIMEOUT + LD D,A ;D=BLK # + LD B,1 + CALL MODEM_ZCI ;GET CMA'D SECT # + JP C,RECV_HDR_TIMEOUT + CPL + CP A,D ;GOOD SECTOR #? + JP Z,RECV_SECTOR + + LD HL,ERR2 ;GOT BAD SECTOR # + CALL PRINT_STRING + JP RECV_SECT_ERR + + +RECV_SECTOR: ;Sector is OK, so read data and place in RAM + LD A,D ;GET SECTOR # + LD (IX+RECVD_SECT_NO),A + LD C,0 ;INIT CKSUM + LD E,80H ;Sector Byte Count + PUSH IY + POP HL ;DMA address (IY) to HL + +RECV_CHAR: + LD B,1 ;1 SEC TIMEOUT + CALL MODEM_ZCI ;GET CHAR + JP C,RECV_HDR_TIMEOUT + LD (HL),A ;STORE CHAR + INC HL + DEC E ;Next sector byte + JP NZ,RECV_CHAR + + ;VERIFY CHECKSUM + LD D,C ;SAVE CHECKSUM + LD B,1 ;TIMEOUT + CALL MODEM_ZCI ;GET CHECKSUM + JP C,RECV_HDR_TIMEOUT + CP A,D ;CHECK + JP NZ,RECV_CKSUM_ERR + + ;GOT A SECTOR, WRITE IF = 1+PREV SECTOR + LD A,(IX+RECVD_SECT_NO) + LD B,A ;SAVE IT + LD A,(IX+SECTNO) ;GET PREV + INC A ;CALC NEXT SECTOR # + CP B ;MATCH? + JP NZ,DO_ACK + LD (IX+SECTNO),A ;UPDATE SECTOR # +DO_ACK: LD A,ACK + CALL MODEM_ZCO + + PUSH HL ;ALL OK SO SAVE DMA Address in IY + POP IY + JP RECV_LOOP ;Back to Top recieve loop + +RECV_CKSUM_ERR: + LD HL,ERR3 + CALL PRINT_STRING + JP RECV_SECT_ERR + +GOT_EOT: + LD A,ACK ;ACK THE EOT + CALL MODEM_ZCO + JP XFER_CPLT + + +TOUT: LD HL,TOUTM ;PRINT TIMEOUT MESSAGE + CALL PRINT_STRING + LD A,(IX+ERRCT) + CALL LBYTE + CALL ZCRLF + RET + + +CHECK_FOR_QUIT: ;MULTIPLE ERRORS, ASK IF TIME TO QUIT + XOR A,A ;GET 0 + LD (IX+ERRCT),A ;RESET ERROR COUNT + LD HL,QUITM + CALL PRINT_STRING + +CI3: IN0 A,(CONSOLE_STATUS) ;NEED CONSTAT TO CLEAN UP SHIFT KEYS ETC + AND A,02H + JP Z,CI3 + IN0 A,(CONSOLE_IN) + AND A,7FH + PUSH AF ;SAVE CHAR + CALL ZCRLF + POP AF + CP A,'R' + RET Z ;RETURN IF RETRY + CP A,'r' + RET Z + CP A,'Q' ;QUIT? + JP NZ,LCQ + OR A,A ;TURN OFF ZERO FLAG + RET +LCQ: CP A,'q' + JP NZ,CHECK_FOR_QUIT + OR A,A ;TURN OFF ZERO FLAG + RET + +XFER_CPLT: ;DONE - CLOSE UP SHOP + LD HL,MODEM_DONE_MSG + CALL PRINT_STRING + JP ZSTART + + + +;-------------- P COMMAND BOOT UP CPM FROM HARD DISK ON S100COMPUTERS IDE BOARD ---------------- + +;BOOT UP THE 8255/IDE Board HARD DISK/Flash Memory Card + +ZBOOT: ;Allow CTL Z to always boot CPM +HBOOTCPM: + IN0 A,(IOBYTE) ;Charcter in A + BIT 0,A + JP NZ,S100_ONLY + + POP HL ;CLEAN UP STACK + LD HL,SPEAKCPM_SP ;Announce Booting CPM on speaker 'Loading CPN' + CALL SPEAK$ + + CALL IDEInit ;Initilze the 8255 and drive + RET C ;Abort if carry set + + LD D,11100000B ;Data for IDE SDH reg (512bytes, LBA mode,single drive) + LD E,REGshd ;00001110,(0EH) CS0,A2,A1, + CALL IDEwr8D ;Write byte to select the MASTER device + + LD B,0FFH ;Delay time to allow a Hard Disk to get up to speed +WaitInit: + LD E,REGstatus ;Get status after initilization + CALL IDErd8D ;Check Status (info in [D]) + BIT 7,D + JR Z,SECREAD ;Zero, so all is OK to write to drive + ;Delay to allow drive to get up to speed + PUSH BC + LD BC,0FFFFH +DXLAY2: LD D,2 ;May need to adjust delay time to allow cold drive to +DXLAY1: DEC D ;to speed + JR NZ,DXLAY1 + DEC BC + LD A,C + OR B + JR NZ,DXLAY2 + POP BC + DJNZ WaitInit ;If after 0FFH, 0FEH, 0FDH... 0, then drive initilization problem +IDError: + LD HL,DRIVE_NR_ERR ;Drive not ready + JP ABORT_ERR_MSG + +SECREAD: ;Note CPMLDR will ALWAYS be on TRK 0,SEC 1,Head 0 + CALL IDEwaitnotbusy ;Make sure drive is ready + JR C,IDError ;NC if ready + + LD D,1 ;Load track 0,sec 1, head 0 + LD E,REGsector ;Send info to drive + CALL IDEwr8D + + LD D,0 ;Send Low TRK# + LD E,REGcylinderLSB + CALL IDEwr8D + + LD D,0 ;Send High TRK# + LD E,REGcylinderMSB + CALL IDEwr8D + + LD D,SEC_COUNT ;Count of CPM sectors we wish to read + LD E,REGseccnt + CALL IDEwr8D + + LD D,COMMANDread ;Send read CMD + LD E,REGcommand + CALL IDEwr8D ;Send sec read CMD to drive. + CALL IDEwaitdrq ;Wait until it's got the data + + LD HL,CPM_ADDRESS ;DMA address where the CPMLDR resides in RAM + LD B,0 ;256X2 bytes + LD C,SEC_COUNT ;Count of sectors X 512 +BOOT_MoreRD16: + LD A,REGdata ;REG regsiter address + OUT (IDECport),A + + OR IDErdline ;08H+40H, Pulse RD line + OUT (IDECport),A + + IN A,(IDEAport) ;read the LOWER byte + LD (HL),A + INC HL + IN A,(IDEBport) ;read the UPPER byte + LD (HL),A + INC HL + + LD A,REGdata ;Deassert RD line + OUT (IDECport),A + DJNZ BOOT_MoreRD16 + DEC C + JR NZ,BOOT_MoreRD16 + + LD E,REGstatus ;Check the R/W status when done + CALL IDErd8D + BIT 0,D + JR NZ,IDEerr1 ;Z if no errors + LD HL,STARTCPM + LD A,(HL) + CP 31H ;EXPECT TO HAVE 31H @80H IE. LD SP,80H + JP Z,STARTCPM ;AS THE FIRST INSTRUCTION. IF OK JP to 100H in RAM + JP ERR_LD1 ;Boot Sector Data incorrect + +IDEerr1: + LD HL,IDE_RW_ERROR ;Drive R/W Error + JP ABORT_ERR_MSG + +ABORT_ERR_MSG: + CALL PRINT_STRING + RET ;BACK TO START OF MONITOR. + +ERR_NR: LD HL,DRIVE_NR_ERR ;"DRIVE NOT READY + JP ABORT_ERR_MSG +ERR_LD: LD HL,BOOT_LD_ERR ;"ERROR READING BOOT/LOADER SECTORS" + JP ABORT_ERR_MSG +ERR_LD1:LD HL,BOOT_LD1_ERR ;"DATA ERROR IN BOOT SECTOR" + JP ABORT_ERR_MSG + + + +;-----------------------Y IDE Menu --------------------------------------------------- + +IDE_BOARD_MENU: + IN0 A,(IOBYTE) ;Charcter in A + BIT 0,A + JP NZ,S100_ONLY + + LD HL,0100H ;Default DMA address + LD (@RAM_ADDRESS),HL + XOR A + LD (@SEC),A + LD (@TRK+1),A + LD (@TRK),A + + CALL WRITE_DRIVE_LBA ;Update Drive + +IDE_MENU1: + LD HL,1 + LD (@SEC_COUNT),HL +IDE_MENU: + CALL PRINT_IDE_TRK_SEC ;Show current Track & Sector + + LD HL,IDE_SD_MENU_MSG ;Menu + CALL PRINT_STRING + + CALL PCHK + CP '0' + JP Z,INITILIZE_IDE ;Initilize drive + CP '1' + JP Z,SET_LBA ;Set track/Sector + CP '2' + JP Z,SET_IDE_DMA_ADDRESS ;Set Location in RAM to read/write sector data + CP '3' + JP Z,READ_IDE_SEC ;Read Current Sector + CP '4' + JP Z,WRITE_IDE_SEC ;Write to Current Sector + CP '5' + JP Z,READ_N_IDE_SEC + CP '6' + JP Z,WRITE_N_IDE_SEC + CP '7' + JP Z,GOTO_NEXT_IDE + CP '+' + JP Z,GOTO_NEXT_IDE + CP ESC + JP Z,MENU_DONE + JP IDE_MENU1 + + +S100_ONLY: + LD HL,S100_ONLY_MSG + CALL PRINT_STRING + JP MENU_DONE + +;------------------------------------------------------ +INITILIZE_IDE: + CALL IDEInit + JP C,IDE_MENU + LD HL,INIT_OK + CALL PRINT_STRING + JP IDE_MENU + + +IDEinit: ;Initilze the 8255 and drive then do a hard reset on the drive, + LD A,RDcfg8255 ;Config 8255 chip (10010010B), read mode on return + OUT0 (IDECtrl),A ;Config 8255 chip, READ mode + + ;Hard reset the disk drive + ;For some reason some CF cards need to the RESET line + ;pulsed very carefully. You may need to play around + LD A,IDEreset ;with the pulse length. Symptoms are: incorrect data comming + OUT0 (IDECport),A ;back from a sector read (often due to the wrong sector being read) + ;I have a (negative)pulse of 60 uSec. (10Mz Z80, two IO wait states). + + LD C,IDE_Reset_Delay ;~60 uS seems to work for the 5 different CF cards I have +ResetDelay: + DEC C + JP NZ,ResetDelay ;Delay (reset pulse width) + XOR A + OUT0 (IDECport),A ;No IDE control lines asserted (just bit 7 of port C) + + CALL DELAY_15 ;Need to delay a little before checking busy status + +IDEwaitnotbusy: ;Drive READY if 01000000 + LD B,0FFH + LD C,080H ;Delay, must be above 80H for 4MHz Z80. Leave longer for slower drives +MoreWait: + LD E,REGstatus ;Wait for RDY bit to be set + CALL IDErd8D + LD A,D + AND 11000000B + XOR 01000000B + JR Z,DoneNotbusy + DJNZ MoreWait + DEC C + JR NZ,MoreWait + LD HL,INIT_ERR + CALL PRINT_STRING + SCF ;Set carry to indicate an error + RET +DoneNotBusy: + LD A,1 + OR A ;Clear carry it indicate no error + RET + +DELAY_15: + LD A,40 ;DELAY ~15 MS +DELAY1: LD B,0 +M0: DJNZ M0 + DEC A + JR NZ,DELAY1 + RET + +PRINT_IDE_TRK_SEC: + LD HL,IDE_MENU0_MSG ;'S100 Bus IDE Board Menu Track= ' + CALL PRINT_STRING + LD HL,(@TRK) ;Track number' + CALL HL_ONLY + LD HL,IDE_MENU1_MSG ;H Sector= + CALL P_STRING + LD A,(@SEC) + CALL ZHEXOUT + +SD_PRINT_2: ;Also used by SD CARD Menu + LD HL,IDE_MENU3_MSG ;H RAM Address= + CALL P_STRING + LD HL,(@RAM_ADDRESS) + CALL HL_ONLY + LD HL,H_MSG ;H. + CALL P_STRING + RET + + + +;----------------------------------------- +SET_LBA: ;Set the logical block address + LD HL,GET_LBA_MSG + CALL PRINT_STRING + CALL GET_DRIVE_LBA ;Get new CPM style Track & Sector number and put them in RAM at @SEC & @TRK + JR C,main3b ;Ret C set if abort/error + CALL WRITE_DRIVE_LBA ;Update LBA on drive +main3b: CALL ZCRLF + JP IDE_MENU + + +;----------------------------------------- +SET_IDE_DMA_ADDRESS + LD HL,GET_DMA_MSG + CALL PRINT_STRING + CALL ZGET_HL ;Not clear why this returns incorrect values + JP C,IDE_MENU + LD (@RAM_ADDRESS),HL + JP IDE_MENU + + +;------------------------------------------- +GOTO_NEXT_IDE: + CALL BUMP_IDE_SECTOR ;Advance one sector + JP IDE_MENU + + +;------------------------------------------- +READ_N_IDE_SEC: + LD HL,ENTER_SEC_COUNT + CALL PRINT_STRING + CALL GETHEX ;get 2 HEX digits + LD HL,0 + LD L,A + LD (@SEC_COUNT),HL + +MORE_RD_SEC: + CALL READSECTOR + + JR Z,main1b_N ;Z means the sector read was OK + CALL ZCRLF + JP IDE_MENU ;Was an error, don't display data + +main1b_N: + CALL PRINT_IDE_TRK_SEC + LD HL,msgrd ;Sector read OK + CALL PRINT_STRING + LD HL,(@SEC_COUNT) + DEC HL + LD (@SEC_COUNT),HL + LD A,L + OR A + JP Z,IDE_MENU1 + CALL BUMP_IDE_SECTOR ;Bump TRK, SEC, DMA + JR MORE_RD_SEC + + +;------------------------------------------- +READ_IDE_SEC: ;Read Sector @ LBA to the RAM buffer + LD HL,READING_MSG ;Sector read to @RAM_ADDRESS + CALL PRINT_STRING + + CALL READSECTOR + + JR Z,main1b ;Z means the sector read was OK + CALL ZCRLF + JP IDE_MENU ;Was an error, don't display data + +main1b: LD HL,msgrd ;Sector read OK + CALL PRINT_STRING + LD HL,(@RAM_ADDRESS) + CALL HEXDUMP ;Show sector data at @RAM_ADDRESS + LD HL,CONTINUE_MSG ;Print any character to continue + CALL PRINT_STRING + CALL ZCI + CP A,ESC + JP Z,BEGIN + JP IDE_MENU + + ;Read a sector, specified by the 3 bytes in LBA + ;Z on success, NZ call error routine if problem +READSECTOR: + CALL WRITE_DRIVE_LBA + + CALL IDEwaitnotbusy ;make sure drive is ready + JP C,SHOWerrors ;Returned with NZ set if error + + LD D,COMMANDread + LD E,REGcommand + CALL IDEwr8D ;Send sec read command to drive. + CALL IDEwaitdrq ;wait until it's got the data + JP C,SHOWerrors + + LD HL,(@RAM_ADDRESS) ;DMA address + LD B,0 ;Read 512 bytes to [HL] (256X2 bytes) +MoreRD16: + LD A,REGdata ;REG regsiter address + OUT0 (IDECport),A + + OR A,IDErdline ;08H+40H, Pulse RD line + OUT0 (IDECport),A + + IN0 A,(IDEAport) ;Read the lower byte first (Note very early versions had high byte then low byte + LD (HL),A ;this made sector data incompatable with other controllers). + INC HL + + IN0 A,(IDEBport) ;THEN read the upper byte + LD (HL),A + INC HL + + LD A,REGdata ;Deassert RD line + OUT0 (IDECport),A + DJNZ MoreRD16 + + LD (@NEXT_ADDRESS),HL ;For multi sec read + LD E,REGstatus + CALL IDErd8D + LD A,D + AND A,1H + CALL NZ,SHOWerrors ;If error display status + RET + + +SHOWerrors: + LD HL,DRIVE_ERRORS + CALL PRINT_STRING + LD A,D + CALL ZBITS + CALL ZCRLF + OR A ;Set NZ flag + SCF ;Set Carry Flag + RET + + +BUMP_IDE_SECTOR: ;For multi sec read/writes + LD HL,(@NEXT_ADDRESS) + LD (@RAM_ADDRESS),HL ;DMA address + + ld hl,(@SEC) + inc hl + ld (@SEC),hl + ld a,L ;0 to 62 CPM Sectors + cp MAXSEC-1 + RET nz + + ld hl,0 ;Back to CPM sector 0 + ld (@SEC),hl + ld hl,(@TRK) ;Bump to next track + inc hl + ld (@TRK),hl + RET + + + + +;------------------------------------------- +WRITE_N_IDE_SEC: + LD HL,ENTER_SEC_COUNT + CALL PRINT_STRING + CALL GETHEX ;get 2 HEX digits + LD HL,0 + LD L,A + LD (@SEC_COUNT),HL + +MORE_WR_SEC: + CALL WRITESECTOR + + JR Z,main3b_N ;Z means the sector read was OK + CALL ZCRLF + JP IDE_MENU ;Was an error, don't display data + +main3b_N: + CALL PRINT_IDE_TRK_SEC + LD HL,msgwr ;Sector write OK + CALL PRINT_STRING + LD HL,(@SEC_COUNT) + DEC HL + LD (@SEC_COUNT),HL + LD A,L + OR A + JP Z,IDE_MENU1 + CALL BUMP_IDE_SECTOR ;Bump TRK, SEC, DMA + JR MORE_WR_SEC + + + +;------------------------------------------- +WRITE_IDE_SEC: + ld HL,Write_Sure ;Are you sure? + call PRINT_STRING + call ZCI + call TO_UPPER + LD C,A ;Print response + CALL ZCO + CP 'Y' + PUSH AF + CALL ZCRLF + POP AF + jp nz,IDE_MENU + CALL ZCRLF + + call WRITESECTOR + + jr z,main2b ;Z means the sector write was OK + call ZCRLF + jp IDE_MENU + +main2b: ld HL,msgwr ;Sector written OK + call PRINT_STRING + CALL ZCRLF + JP IDE_MENU + + ;Write a sector, specified by the 3 bytes in LBA + ;Z on success, NZ to error routine if problem +WRITESECTOR: + CALL WRITE_DRIVE_LBA + + call IDEwaitnotbusy ;Make sure drive is ready + jp c,SHOWerrors + + ld d,COMMANDwrite + ld e,REGcommand + call IDEwr8D ;tell drive to write a sector + call IDEwaitdrq ;wait unit it wants the data + jp c,SHOWerrors + + ld hl,(@RAM_ADDRESS) + ld b,0 ;256X2 bytes + + ld a,WRcfg8255 + out0 (IDECtrl),a + +MoreWR16: + ld a,(hl) + inc hl + out0 (IDEAport),a ;Write the lower byte first (Note early versions had high byte then low byte + ld a,(hl) ;this made sector data incompatible with other controllers). + inc hl + out0 (IDEBport),a ;THEN High byte on B + ld a,REGdata + push af + out0 (IDECport),a ;Send write command + or IDEwrline ;Send WR pulse + out0 (IDECport),a + pop af + out0 (IDECport),a + DJNZ MoreWR16 + + ld a,RDcfg8255 ;Set 8255 back to read mode + out0 (IDECtrl),a + + LD (@NEXT_ADDRESS),HL ;For multi sec read + ld e,REGstatus + call IDErd8D + ld a,D + and A,1H + call nz,SHOWerrors ;If error display status + RET + + + +GET_DRIVE_LBA: ;Get CPM style Track# & Sector# data and convert to LBA format + LD HL,ENTER_SECL ;Enter sector number + CALL PRINT_STRING + CALL GETHEX ;get 2 HEX digits + RET C + LD (@SEC),A ;Note: no check data is < MAXSEC, sectors start 0,1,2,3.... + + LD HL,ENTER_TRKH ;Enter high byte track number + CALL PRINT_STRING + CALL GETHEX ;get 2 HEX digits + RET C + LD (@TRK+1),A + + LD HL,ENTER_TRKL ;Enter low byte track number + CALL PRINT_STRING + CALL GETHEX ;get 2 more HEX digits + RET C + LD (@TRK),A + CALL ZCRLF + XOR A + OR A ;To return NC + RET + + +WRITE_DRIVE_LBA: ;Write the logical block address to the drive's registers + ;Note we do not need to set the upper nibble of the LBA + ;It will always be 0 for these small drives + LD A,(@SEC) ;LBA mode Low sectors go directly + INC A ;Sectors are numbered 1 -- MAXSEC (even in LBA mode) + LD (@DRIVE$SEC),A ;<<<<< For Diagnostic Display Only + LD D,A + LD E,REGsector ;Send info to drive + CALL IDEwr8D ;Note: For drive we will have 0 - MAXSEC sectors only + + LD HL,(@TRK) + LD A,L + LD (@DRIVE$TRK),A + LD D,L ;Send Low TRK# + LD E,REGcylinderLSB + CALL IDEwr8D + + LD A,H + LD (@DRIVE$TRK+1),A + LD D,H ;Send High TRK# + LD E,REGcylinderMSB + CALL IDEwr8D + + LD D,1 ;For now, one sector at a time + LD E,REGseccnt + CALL IDEwr8D + RET + + + + +IDEwaitdrq: ;Wait for the drive to be ready to transfer data. + LD B,0FFH + LD A,0FFH ;Delay, must be above 80H for 4MHz Z80. Leave longer for slower drives + LD (@DELAYStore),A + +MoreDRQ: + LD E,REGstatus ;wait for DRQ bit to be set + CALL IDErd8D + LD A,D + AND A,10001000B + CP A,00001000B + JR Z,DoneDRQ + DEC B + JR NZ,MoreDRQ + LD A,(@DELAYStore) ;Check timeout delay + DEC A + LD (@DELAYStore),A + JR NZ,MoreDRQ + SCF ;Set carry to indicate error + RET +DoneDRQ: + OR A ;Clear carry + RET + + + +HEXDUMP: ;Print a hexdump of the data in the 512 byte buffer @[HL] + PUSH AF ;Save everything + PUSH BC + PUSH DE + PUSH HL + +NEXT_SECTOR: + CALL ZCRLF ;CR/LF first + LD D,32 ;Print 32 lines total + LD B,16 ;16 characters across + LD (@StartLineHex),HL ;Save the buffer location (@RAM_ADDRESS++) for ASCII display below + LD HL,0 + LD (@BYTE$COUNT),HL + +SF172X: CALL ZCRLF + LD HL,(@BYTE$COUNT) + LD A,H + CALL ZHEXOUT ;Print byte count in sector + LD A,L + CALL ZHEXOUT + + PUSH DE + LD DE,16 + ADD HL,DE + LD (@BYTE$COUNT),HL ;store for next time + POP DE + + CALL ZSPACE + LD HL,(@StartLineHex) + LD (@StartLineASCII),HL ;Store for ASCII display below +SF175X: LD A,(HL) + CALL LBYTE ;Display [A] on CRT/LCD + INC HL + DJNZ SF175X +; + LD (@StartLineHex),HL ;Save for next line later + CALL ShowAscii ;Now translate to ASCII and display + LD B,16 ;16 characters across for next line + DEC D + JP NZ,SF172X ;Have we done all 32 lines +; + CALL ZCRLF + POP HL ;Get back origional registers + POP DE + POP BC + POP AF + RET + + +ShowAscii: ;Now show as ascii info + LD HL,(@StartLineASCII) + LD B,16 ;16 ASCII characters across +XF172: CALL ZSPACE ;send a space character + CALL ZSPACE +XF175: LD A,(HL) + AND A,7FH + CP A,' ' ;FILTER OUT CONTROL CHARACTERS + JR NC,XT33 +XT22: LD A,'.' +XT33: CP A,07CH + JR NC,XT22 + LD C,A ;SET UP TO SEND + PUSH BC + CALL ZCO + POP BC + INC HL ;Next position in buffer + DJNZ XF175 + RET +; + +;------------------------------------------------------------------ +; Low Level 8 bit R/W to the drive controller. These are the routines that talk +; directly to the drive controller registers, via the 8255 chip. +; Note the 16 bit I/O to the drive (which is only for SEC R/W) is done directly +; in the routines READSECTOR & WRITESECTOR for speed reasons. +; +IDErd8D: ;READ 8 bits from IDE register in [E], return info in [D] + LD A,E + OUT0 (IDECport),A ;drive address onto control lines + + OR A,IDErdline ;RD pulse pin (40H) + OUT0 (IDECport),A ;assert read pin + + IN0 A,(IDEAport) + LD D,A ;return with data in [D] + + LD A,E ;<---Ken Robbins suggestion + OUT0 (IDECport),A ;Deassert RD pin + + XOR A + OUT0 (IDECport),A ;Zero all port C lines + RET + + +IDEwr8D: ;WRITE Data in [D] to IDE register in [E] + LD A,WRcfg8255 ;Set 8255 to write mode + OUT0 (IDECtrl),A + + LD A,D ;Get data put it in 8255 A port + OUT0 (IDEAport),A + + LD A,E ;select IDE register + OUT0 (IDECport),A + + OR IDEwrline ;lower WR line + OUT0 (IDECport),A + + LD A,E ;<-- Kens Robbins suggestion, raise WR line + OUT0 (IDECport),A + + XOR A ;Deselect all lines including WR line + OUT0 (IDECport),A + + LD A,RDcfg8255 ;Config 8255 chip, read mode on return + OUT0 (IDECtrl),A + RET + + +;-----------------------W Command SD CARD Menu --------------------------------------------------- + +SD_CARD_MENU: + LD HL,0100H ;Default DMA address + LD (@RAM_ADDRESS),HL + LD HL,0 + LD (@SEC),HL ;low byte,high byte + LD (@TRK),HL + + XOR A + LD (@CARD_TYPE),A ; Unknown Card Type so far + +SD_MENU1: + LD HL,1 + LD (@SEC_COUNT),HL +SD_MENU: + CALL PRINT_SD_SEC ;Show current Sector + + LD HL,IDE_SD_MENU_MSG ;Menu + CALL PRINT_STRING + + CALL PCHK + CP A,'0' + JP Z,INITILIZE_SD_CARD + CP A,'1' + JP Z,SET_SD_SECTOR + CP A,'2' + JP Z,SET_SD_DMA_ADDRESS ;Set Location in RAM to read/write sector data + CP A,'3' + JP Z,READ_SD_SEC ;Read to Current SD Sector + CP A,'4' + JP Z,WRITE_SD_SEC ;Write to Current SD Sector + CP '5' + JP Z,READ_N_SD_SEC ;Read N SD Sectors + CP '6' + JP Z,WRITE_N_SD_SEC ;Write N SD Sectors + CP '7' + JP Z,GOTO_NEXT_SEC + CP '+' + JP Z,GOTO_NEXT_SEC + CP '8' + JP Z,GOTO_PREVIOUS_SEC + CP '-' + JP Z,GOTO_PREVIOUS_SEC + CP ESC + JP Z,MENU_DONE + JP SD_MENU1 + + +;========================================== INITILIZE SD CARD ===================================================== + +INITILIZE_SD_CARD: + LD A,0 + LD (@CARD_TYPE),A ; Unknown Card Type so far + + LD A,06H ; Wayne Warthen's recomended slow value at the start + OUT0 (z180_cntr),A + + CALL SEND_SD_RESET ; Repeatidly send the RESET CMD0 to the adaptor (Up to 256 times) + JP NZ,BAD_SD_RESET + + LD HL,INIT_OK ; Drive Init. OK + CALL PRINT_STRING + + CALL SEND_GET_TYPE ; Will put card type in (CARD_TYPE) + CALL SEND_GET_TYPE ; Initilize a Type 2 Card, Get Card Type CMD8. Required for SDHC cards + LD HL,CF_TYPE_ERR_MSG ; 'Sorry, SD Card Type 2 was NOT detected. (Status = + CALL NZ,CMD_FAIL + JP NZ,SD_MENU1 + + LD HL,CARD_TYPE2_MSG ; "SD Card Type 2 detected." + CALL PRINT_STRING + + CALL TYPE_2_ACTIVATE ; Type 2 needs special activation + LD HL,CMD55_FAIL_MSG ; SD Card Type 2 Initilization failed (CMD55 or CMD41). + CALL NZ,CMD_FAIL + JP NZ,SD_MENU1 + + LD HL,CMD41_55_OK_MSG ; 'CMD41 & CMD55 accepted OK. SD Card is now initilized.' + CALL PRINT_STRING + + CALL STOP_CRC_CHECK ; Turn off CRC Checking + LD HL,CRC_ERROR_MSG ; "Got error trying to turn off CRC checking." + CALL NZ,CMD_FAIL + JP NZ,SD_MENU1 + + CALL SET_SEC_SIZE ; <<<<<<<<<<< Set Sector size to 512 bytes + LD HL,SIZE_ERROR_MSG ; "Got error trying set sector size to 512 bytes. (Status = " + CALL NZ,CMD_FAIL + + LD A,00H ; Set to high speed SPI clock + OUT0 (z180_cntr),A + JP SD_MENU1 + +BAD_SD_RESET: + LD HL,INIT_ERR ; 'Drive Init. Error + CALL CMD_FAIL ; Print Error + JP SD_MENU1 + + +;========================================== SET SECTOR ===================================================== + +SET_SD_SECTOR: + LD HL,ENTER_SEC_NUM ; 'Please enter Sector Number (XXXXH): + CALL P_STRING + CALL ZGET_HL + JP C,DATA_ERROR + LD (@SEC),HL ; Store here + JP SD_MENU1 + +DATA_ERROR: + LD HL,DATA_ERROR_MSG ; "Data error" + CALL PRINT_STRING + JP SD_MENU1 + + +;========================================== SET DMA ADDRESS ===================================================== + +SET_SD_DMA_ADDRESS: + LD HL,GET_DMA_MSG + CALL PRINT_STRING + CALL ZGET_HL + JP C,SD_MENU1 + LD (@RAM_ADDRESS),HL + JP SD_MENU1 + + +;-------------------------------------------SD CARD RESET ----------------------------------------------------------- + +SEND_SD_RESET: ; Send Card Reset CMD. CS is always off for SPI dummy clocks + LD B,0 ; Repeatidly send the RESET CMD0 (256 times) +INIT2: CALL DRIVE_CS_OFF ; Lower CS on SD card (Port 0CH) + LD C,12 ; Send 12 empty clock cycles +INIT1: CALL SPI_DUMMY_CLOCKS ; Clear SPI circuit/SD card + DEC C + JP NZ,INIT1 + + CALL DRIVE_CS_ON ; Lower CS on SD card (Port 0CH) + LD HL,CMD_0 ; (CMD0 OR 40H) + CALL SEND_SD_CMD + CALL READ_SPI ; Value returned in [A] + CALL DRIVE_CS_OFF ; -- Turn off CS on both SD Cards (AF Unchanged) + CP A,01H ; Is it OK + RET Z ; All OK ret Z set + DJNZ INIT2 ; Try 256 times + XOR A + DEC A + RET ; Error RET NZ + +;------------------------------------------------ SEND_IDLE_STATE -------------------------------------- + +SEND_IDLE_STATE: ; Wait until card is in Idle state + LD B,40 ; Try several times + CALL DRIVE_CS_ON ; Lower CS on current SD card +SEND_IDLE1: + LD HL,CMD_1 ; <<<<<<<< SEND CMD1 + CALL SEND_SD_CMD + CALL READ_SPI + + CP A,0 + JP Z,SEND_IDLE2 + DJNZ SEND_IDLE1 ; Need to retry several times. + CALL DRIVE_CS_OFF ; -- Turn off CS on both SD Cards + XOR A + DEC A + RET ; Error RET NZ +SEND_IDLE2: + LD A,0FFH ; Flush with extra 0FF's + CALL WRITE_SPI + LD A,0FFH ; Flush with extra 0FF's + CALL WRITE_SPI + + CALL DRIVE_CS_OFF ; -- Turn off CS on both SD Cards + XOR A + RET ; Error RET Z + +;------------------------------------------------ GET CARD VOLTAGE/TYPE -------------------------------------- + +SEND_GET_TYPE: ; Get Card Voltage/Type + LD B,40 ; Try several times + CALL DRIVE_CS_ON ; Lower CS on current SD card +GET_TYPE1: + LD HL,CMD_8 ; SEND CMD8 to get Card Voltage + CALL SEND_SD_CMD + CALL READ_SPI + + CP A,01H ; If 01 then Type 2 + JP Z,SD_TYPE_2 ; If CMD8 is Illegal Cmd, then probably CARD_TYPE=1 + DJNZ GET_TYPE1 + CALL DRIVE_CS_OFF ; Turn off CS on both SD Cards + LD A,1 ; Probably Type 1 card + LD (@CARD_TYPE),A ; Type 1 or Type 2 Card + XOR A,A + DEC A + RET ; SD CARD not Type 2, Return NZ + +SD_TYPE_2: ; Confirm type 2 + CALL READ_SPI ; value returned in [A] is 00H + CALL READ_SPI ; value returned in [A] is 00H + CALL READ_SPI ; value returned in [A] is 01H + CALL READ_SPI ; value returned in [A] is 87H + + CALL DRIVE_CS_OFF ; Turn off CS on both SD Cards + CP A,0AAH ; Must be 0AAH for Type 2 cards + JP NZ,NOT_2 ; SD CARD UNKNOWN_TYPE, Return NZ + LD A,2 + LD (@CARD_TYPE),A ; Definately Type 2 card + XOR A,A + RET ; RET Z + +NOT_2: LD A,0 ; Unknown card + LD (@CARD_TYPE),A ; Not Type 1 or Type 2 Card + XOR A,A + DEC A + RET ; Return NZ + + +; ------------------------------------- AVCTIVATE TYPE 2 CARDS --------------------------------- + +TYPE_2_ACTIVATE: ; Initilize the SD card Type 2 cards with CMD55 & CMD44 Commands + LD B,40 ; Will try 40 times +ACT1: CALL DRIVE_CS_ON ; Lower CS on current SD card + LD HL,CMD_55 ; Application specific command next + CALL SEND_SD_CMD + CALL READ_SPI ; value returned in [A] + CP A,01H ; Correct response is 01H + JP Z,ACT2 ; Got correct response try CMD41 + DJNZ ACT1 + CALL DRIVE_CS_OFF ; -- Turn off CS on both SD Cards + XOR A + DEC A + RET ; Error RET NZ + +ACT2: CALL DRIVE_CS_OFF ; Turn off CS on both SD Cards + CALL DRIVE_CS_ON ; Turn back on, Lower CS on current SD card (required!) + LD HL,CMD_41 + CALL SEND_SD_CMD + CALL READ_SPI ; Value returned in [A] + CALL DRIVE_CS_OFF ; -- Turn off CS on both SD Cards + CP A,0 + RET Z ; RET Z + DJNZ ACT1 + XOR A + DEC A + RET ; Error RET NZ + + +; ---------------------------------------------- DEACTIVATE CRC CHECKING ---------------- + +STOP_CRC_CHECK: ; Will now stop CRC checking + CALL DRIVE_CS_ON ; Lower CS on current SD card + LD HL,CMD_59 + CALL SEND_SD_CMD ; SEND CMD59 Turn off CRC checking + CALL READ_SPI ; Value returned in [A] + CALL DRIVE_CS_OFF ; Turn off CS on both SD Cards + CP A,0H + RET Z ; RET Z + XOR A + DEC A + RET ; Error RET NZ + + +; ---------------------------------------------- SET SECTOR SIZE FOR TYPE 1 & 2 CARDS ---------------- + +SET_SEC_SIZE: ; Will now set the sector size to 512 bytes + CALL DRIVE_CS_ON ; Lower CS on current SD card + LD HL,CMD_16 + CALL SEND_SD_CMD ; SEND CMD16 to set sector size (512 Bytes) + CALL READ_SPI ; Value returned in [A] + CALL DRIVE_CS_OFF ; Turn off CS on both SD Cards + CP A,0H ; Should be 00000000B + RET Z ; RET Z + XOR A + DEC A + RET ; Error RET NZ + + +;------------------------------------------------ SEND CARD STATUS -------------------------------------- + +GET_CARD_STATUS: ; Get card status + LD B,40 ; Try several times + CALL DRIVE_CS_ON ; Lower CS on current SD card +CARD_STATUS_1: + LD HL,CMD_13 ; <<<<<<<< SEND CMD13 + CALL SEND_SD_CMD + CALL READ_SPI + CP A,0 + JP Z,CARD_STATUS_2 + DJNZ CARD_STATUS_1 ; Need to retry several times. + CALL DRIVE_CS_OFF ; -- Turn off CS on both SD Cards + XOR A + DEC A + RET ; Error RET NZ +CARD_STATUS_2: + LD A,0FFH ; Flush with extra 0FF's + CALL WRITE_SPI + LD A,0FFH ; Flush with extra 0FF's + CALL WRITE_SPI + CALL DRIVE_CS_OFF ; -- Turn off CS on both SD Cards + XOR A + RET ; Error RET Z + + +;------------------------------------------- READ N SECTORS ---------------------------------------- + +READ_N_SD_SEC: + LD HL,ENTER_SEC_COUNT + CALL PRINT_STRING + CALL GETHEX ;get 2 HEX digits + LD HL,0 + LD L,A + LD (@SEC_COUNT),HL + +MORE_RD_SEC2: + CALL CORE_SD_READ ;Read one sector at a time + JR Z,MORE_RD_SEC1 ;Z means the sector read was OK + CALL ZCRLF + JP SD_MENU1 ;Was an error, don't display data + +MORE_RD_SEC1: + CALL PRINT_SD_SEC ;Show current Sector + LD HL,msgrd ;Sector read OK + CALL PRINT_STRING + LD HL,(@SEC_COUNT) + DEC HL + LD (@SEC_COUNT),HL + LD A,L + OR A + JP Z,SD_MENU1 + CALL BUMP_SD_SECTOR ;Bump SEC, DMA + JR MORE_RD_SEC2 + + +;------------------------------------------- READ ONE SECTOR ---------------------------------------- + +READ_SD_SEC: + LD A,(@CARD_TYPE) ; Flag to check if SD card type has been determined + OR A,A + JP NZ,SD_CARD_RD_OK + LD HL,READ_ERR_MSG1 ; 'Sorry, SD Card must first be initilized (Menu 0). + CALL PRINT_STRING + JP SD_MENU1 ; Back to main menu + +SD_CARD_RD_OK: + CALL CORE_SD_READ ; >>>>>> The main Read SD sector routine <<<<<<<<< + JR Z,DONE_RD_WR_SEC1 ;Z means the sector read was OK + CALL ZCRLF + JP SD_MENU1 ;Was an error, don't display data + +DONE_RD_WR_SEC1: + LD HL,msgrd ; Sector Read OK + CALL PRINT_STRING + LD HL,(@RAM_ADDRESS) ; Point to start of DMA address + CALL HEXDUMP ; Display sector contents + LD HL,CONTINUE_MSG ; Print any character to continue + CALL PRINT_STRING + CALL ZCI + CP A,ESC + JP Z,BEGIN ;Abort everything + JP SD_MENU1 + + +;========================================== READ A SECTOR ===================================================== + + +CORE_SD_READ: + CALL DRIVE_CS_ON ; Lower CS on current SD card + LD B,0H ; Try up to 255 times! +READ_SEC1: + LD A,51H ; <<<<<<<< SEND CMD17 OR bits 40H added + CALL WRITE_SPI + LD A,0 ; Second byte of CMD + CALL WRITE_SPI + LD A,0 ; Third byte of CMD + CALL WRITE_SPI + LD HL,(@SEC) ; <---------- SECTOR NNUMBER ---- + LD A,L ; Forth byte of CMD + CALL WRITE_SPI + LD A,H ; Fifth byte of CMD + CALL WRITE_SPI + LD A,0FFH ; CRC byte of CMD + CALL WRITE_SPI + LD A,0FFH ; Flush with extra 0FF's + CALL WRITE_SPI + + CALL READ_SPI + + CP A,0H ; Should be 00000000B + JP Z,READ_SEC_OK1 + LD HL,SEC_RD_ERR0_MSG ; Got error with Read Sector command CMD17. (Status = " + CALL CMD_FAIL ; Deselect CS, Low speed CLK, send error Message, Ret NZ + JP SD_MENU1 + + LD B,0H +READ_SEC_OK1: + CALL READ_SPI + CP A,0FFH + JP Z,READ_SEC_OK1 + CP A,0FEH ; Should be 0FEH (Start Token) + JP Z,READ_SEC_OK2 + DJNZ READ_SEC_OK1 ; Keep trying until we see 0FEH + LD HL,SEC_RD_ERR1_MSG ; Got error with Read Sector command CMD17. (Status = " + CALL CMD_FAIL ; Deselect CS, Low speed CLK, send error Message, RET NZ + JP SD_MENU1 + +READ_SEC_OK2: + LD HL,(@RAM_ADDRESS) ; <---------- RAM ADDRESS ---- + LD B,0 +READ_256: + CALL READ_SPI + LD (HL),A +; CALL ZHEXOUT ; For debugging + INC HL + DJNZ READ_256 + LD B,0 +READ_512: + CALL READ_SPI + LD (HL),A +; CALL ZHEXOUT ; For debugging + INC HL + DJNZ READ_512 + + LD (@NEXT_ADDRESS),HL ; Save next sector DMA address + CALL READ_SPI ; Read 16 bit CRC + CALL READ_SPI + + CALL READ_SPI ; Need one extra! + + CALL DRIVE_CS_OFF ; Turn off CS on SD Card + XOR A + RET + + +;------------------------------------------- WRITE N SECTORS ---------------------------------------- + +WRITE_N_SD_SEC: + LD HL,ENTER_SEC_COUNT + CALL PRINT_STRING + CALL GETHEX ;get 2 HEX digits + LD HL,0 + LD L,A + LD (@SEC_COUNT),HL + +MORE_WR_SEC2: + CALL CORE_SD_WRITE ;Write one sector at a time + JR Z,MORE_WR_SEC1 ;Z means the sector read was OK + CALL ZCRLF + JP SD_MENU1 ;Was an error, don't display data + +MORE_WR_SEC1: + CALL PRINT_SD_SEC ;Show current Sector + LD HL,msgwr ;Sector written OK + CALL PRINT_STRING + LD HL,(@SEC_COUNT) + DEC HL + LD (@SEC_COUNT),HL + LD A,L + OR A + JP Z,SD_MENU1 + CALL BUMP_SD_SECTOR ;Bump SEC, DMA + JR MORE_WR_SEC2 + +;------------------------------------------- WRITE ONE SECTOR ---------------------------------------- + +WRITE_SD_SEC: + LD A,(@CARD_TYPE) ; Flag to check if SD card type has been determined + OR A,A + JP NZ,SD_CARD_WR_OK + LD HL,READ_ERR_MSG1 ; 'Sorry, SD Card must first be initilized (Menu 0). + CALL PRINT_STRING + JP SD_MENU1 ; Back to main menu + +SD_CARD_WR_OK: + CALL CORE_SD_WRITE ; >>>>>> The main Write SD sector routine <<<<<<<<< + JP Z,DONE_RD_WR_SEC1 ;Z means the sector read was OK + CALL ZCRLF + JP SD_MENU1 ;Was an error, don't display data + + +;========================================== WRITE A SECTOR ===================================================== + + +CORE_SD_WRITE: + CALL DRIVE_CS_ON ; Lower CS on current SD card + + LD A,58H ; <<<<<<<< SEND CMD24 OR bits 40H added + CALL WRITE_SPI + LD A,0 ; Second byte of CMD + CALL WRITE_SPI + LD A,0 ; Third byte of CMD + CALL WRITE_SPI + LD HL,(@SEC) + + LD A,L ; Forth byte of CMD + CALL WRITE_SPI + LD A,H ; Fifth byte of CMD + CALL WRITE_SPI + LD A,0FFH ; CRC byte of CMD + CALL WRITE_SPI + LD A,0FFH ; Flush with extra 0FF's + CALL WRITE_SPI + + CALL READ_SPI + + CP A,0H ; Should be 00000000B + JP Z,WRITE_SEC_OK1 + LD HL,SEC_WR_ERR0_MSG ; 'Got error with Write Sector command CMD24. (Status = + CALL CMD_FAIL ; Deselect CS, Low speed CLK, send error Message + JP SD_MENU1 + + +WRITE_SEC_OK1: + LD A,0FEH ; Start Block write flag + CALL WRITE_SPI + + LD HL,(@RAM_ADDRESS) + LD B,0 +WRITE_256: + LD A,(HL) + CALL WRITE_SPI + INC HL + DJNZ WRITE_256 + LD B,0 +WRITE_512: + LD A,(HL) + CALL WRITE_SPI + INC HL + DJNZ WRITE_512 + + LD (@NEXT_ADDRESS),HL ; Save next sector DMA address + LD A,0FFH ; Send 16 bit CRC + CALL WRITE_SPI + CALL WRITE_SPI + + CALL READ_SPI ; Check all is OK + + AND A,1FH + CP A,05H ; Should be xxx0AAA1H (AAA = 010) + JP Z,WRITE_SEC_OK2 + CALL DRIVE_CS_OFF ; Turn off CS on SD Card + LD HL,SEC_WR_ERR1_MSG ; Got error with Read Sector command CMD24. (Status = " + CALL CMD_FAIL ; Deselect CS, Low speed CLK, send error Message + JP SD_MENU1 + + LD HL,0000H ; Wait until writing is done +WRITE_SEC_OK2: + CALL READ_SPI ; Wait for SD card to complete writing, (64K times) + CP A,0 + JP Z,WRITE_SEC_OK3 + DEC HL + LD A,L + OR A,H + JP NZ,WRITE_SEC_OK2 + WRITE_ERR: + CALL DRIVE_CS_OFF ; Turn off CS on SD Card + LD HL,SEC_WR_ERR2_MSG ; Error waiting for SD Card to complete sector write. (Status = " + CALL CMD_FAIL ; Deselect CS, Low speed CLK, send error Message + JP SD_MENU1 + + + ; >>> NOT CLEAR WHAT IS WRONG WITH THIS WRITE SECTOR CODE + ; >>> I NEED TO RESET THE CARD AFTER EACH SECTOR WRITE + ; >>> OTHEREWISE THE NEXT SEC READ GIVES ERROROUS DATA +WRITE_SEC_OK3: + CALL SEND_SD_RESET ; CMD0 + JP NZ,WRITE_RESET_ERR3 ; Error resetting SD Card after sector write, CMD0. (Status = + + CALL SEND_GET_TYPE ; CMD8 + JP NZ,WRITE_RESET_ERR4 ; Error getting SD Card type after sector write, CMD8. (Status = + + CALL TYPE_2_ACTIVATE ; CMD55+CMD41 + JP NZ,WRITE_RESET_ERR5 + + CALL DRIVE_CS_OFF ; Turn off CS on both SD Cards + XOR A,A + RET + +WRITE_RESET_ERR3: + LD HL,SEC_WR_ERR3_MSG ; Error resetting SD Card after sector write, CMD0. (Status = + CALL CMD_FAIL ; Deselect CS, Low speed CLK, send error Message + JP SD_MENU1 + +WRITE_RESET_ERR4: + LD HL,SEC_WR_ERR4_MSG ; Error getting SD Card type after sector write. (Status = + CALL CMD_FAIL ; Deselect CS, Low speed CLK, send error Message + JP SD_MENU1 + +WRITE_RESET_ERR5: + LD HL,SEC_WR_ERR5_MSG ; Error re-activating Type 2 Card after sector write. (Status = + CALL CMD_FAIL ; Deselect CS, Low speed CLK, send error Message + JP SD_MENU1 + + + + + +;-------------------------------------------------------------------------------------------------- + +GOTO_NEXT_SEC: + CALL BUMP_SD_SECTOR + JP SD_MENU1 + +GOTO_PREVIOUS_SEC: + LD HL,(@NEXT_ADDRESS) + LD (@RAM_ADDRESS),HL ;DMA address + LD HL,(@SEC) + LD A,L + OR H + JR Z,AT_ZERO + DEC HL + LD (@SEC),HL + JP SD_MENU1 +AT_ZERO: + LD C,BELL + CALL ZCO + JP SD_MENU1 + +;-------------------------------------------------------------------------------------------------- + +PRINT_SD_SEC: + LD HL,SD_MENU0_MSG ;'SD Card Menu Sector=' + CALL PRINT_STRING + LD HL,(@SEC) + CALL HL_ONLY + JP SD_PRINT_2 + + +;-------------------------------------------------------------------------------------------------- + +BUMP_SD_SECTOR: ;For multi sec read/writes + LD HL,(@NEXT_ADDRESS) + LD (@RAM_ADDRESS),HL ;DMA address + + ld hl,(@SEC) + inc hl + ld (@SEC),hl + RET + + +;------------------------- SPI COMMANDS ------------------------------------------------- + +SPI_DUMMY_CLOCKS: ; Only [A] register altered + LD A,0FFH + CALL WRITE_SPI + RET + + +SEND_SD_CMD: ; Generalized CMD to send SD Card 6 commands. Only [A] & [HL] registers altered + LD A,(HL) ; Get first byte from CMD table (Note already has OR bits 40H added) + CALL WRITE_SPI + INC HL + LD A,(HL) ; Get second byte from CMD table + CALL WRITE_SPI + INC HL + LD A,(HL) ; Get third byte from CMD table + CALL WRITE_SPI + INC HL + LD A,(HL) ; Get forth byte from CMD table + CALL WRITE_SPI + INC HL + LD A,(HL) ; Get fifth byte from CMD table + CALL WRITE_SPI + INC HL + LD A,(HL) ; Get sixth byte from CMD table + CALL WRITE_SPI + + INC HL + LD A,0FFH ; Send dummy byte to get returned message (Required!) + CALL WRITE_SPI + RET + + + +WRITE_SPI: ; SEND ONE BYTE, No registers altered + PUSH AF + PUSH BC + CALL MIRROR ; MSB<-->LSB MIRROR BITS, RESULT IN C + CALL SD_WAITTX ; MAKE SURE WE ARE DONE SENDING + OUT0 (SD_TRDR),C ; PUT BYTE IN BUFFER + IN0 A,(SD_CNTR) + SET 4,A ; SET TRANSMIT ENABLE + OUT0 (SD_CNTR),A + POP BC + POP AF + RET + + +READ_SPI: ; RECEIVE ONE BYTE, Only [A] register altered + PUSH BC + CALL SD_WAITTX ; MAKE SURE WE ARE DONE SENDING + IN0 A,(SD_CNTR) ; GET CSIO STATUS + SET 5,A ; START RECEIVER + OUT0 (SD_CNTR),A + CALL SD_WAITRX + IN0 A,(SD_TRDR) ; GET RECEIVED BYTE + CALL MIRROR ; MSB<-->LSB MIRROR BITS + LD A,C ; KEEP RESULT + POP BC + RET + +SD_WAITTX: ; CSIO WAIT FOR TRANSMIT READY (TX REGSITER EMPTY) + IN0 A,(SD_CNTR) ; GET CSIO STATUS + BIT 4,A ; TX EMPTY? + JR NZ,SD_WAITTX ; LOOP WHILE BUSY + RET + +SD_WAITRX: ; CSIO WAIT FOR RECEIVER READY (BYTE AVAILABLE) + IN0 A,(SD_CNTR) ; WAIT FOR RECEIVER TO FINISH + BIT 5,A ; RX EMPTY? + JR NZ,SD_WAITRX ; LOOP WHILE BUSY + RET + + +MIRROR: ; MSB<-->LSB MIRROR BITS IN A, RESULT IN C + LD C,A ; A = 76543210 + RLCA + RLCA ; A = 54321076 + XOR C + AND 0AAH + XOR C ; A = 56341270 + LD C,A + RLCA + RLCA + RLCA ; A = 41270563 + RRC C ; C = 05634127 + XOR C + AND 066H + XOR C ; A = 01234567 + LD C,A ; RETURN RESULT IN C + RET + + +;--------------------------------------------------------------------------------------- + +CMD_FAIL: ; Generalized failure message routine (Message in [HL]) + CALL DRIVE_CS_OFF ; Always, turn off CS on SD Card + CALL PRINT_STRING + IN0 A,(z180_trdr) ; Return data in [A] (Is latched) + CALL ZBITS + LD HL,BITS_END_MSG ; "B) " + CALL P_STRING + XOR A + DEC A + RET ; Return NZ + + + +DRIVE_CS_OFF: ; Raise CS on SD card + PUSH AF ; Note no registers altered + LD A,04H ; We only have one drive + OUT0 (SD_CARD_CS),A ;Bit 2 to select onboard SD card adaptor (0=ON, 1=off) + OUT0 (SD_CARD_LED),A ;Bit 2 to turn on/off SD Card LED (0=ON, 1=off) + POP AF + RET + + +DRIVE_CS_ON: ; Lower CS on current SD card + PUSH AF ; Note no registers altered + LD A,00H ; We only have one drive + OUT0 (SD_CARD_CS),A ;Bit 2 to select onboard SD card adaptor (0=ON, 1=off) + OUT0 (SD_CARD_LED),A ;Bit 2 to turn on/off SD Card LED (0=ON, 1=off) + POP AF + RET + + +;------------------------------------------------------------------------------------------- +;------------------------ SUPPORT ROUTINES ------------------------------------------------- +;------------------------------------------------------------------------------------------- + + +;SEND MESSAGE TO CONSOL MESSAGE IN [HL],LENGTH IN [B] + +TOM: LD C,(HL) + INC HL + CALL ZCO + DJNZ TOM + RET + +;ABORT IF ESC AT CONSOL, PAUSE IF ^S AT CONSOL + +CCHK: CALL ZCSTS ;FIRST IS THERE ANYTHING THERE + RET Z + CALL ZCI + CP 'S'-40H + JR NZ,CCHK1 +CCHK2: CALL ZCSTS ;WAIT HERE UNTIL ANOTHER INPUT IS GIVEN + JR Z,CCHK2 +CCHK1: CP ESC + RET NZ ;RETURN EXECPT IF ESC + + +;PRINT HIGHEST MEMORY FROM BOTTOM + +SIZE: CALL MEMSIZ ;RETURNS WITH [HL]= RAM AVAILABLE-WORKSPACE + +LFADR: CALL ZCRLF + +;PRINT [HL] AND A SPACE + +ZPRINT_HL: + PUSH HL + PUSH BC + CALL LADR ;Print [HL] with space afterwards + LD C,SPACE + CALL ZCO + POP BC + POP HL + RET + + +;PRINT [HL] ONLY + +HL_ONLY: + PUSH HL + PUSH BC + CALL LADR ;Print [HL] with no space afterwards + POP BC + POP HL + RET + +;PRINT A SPACE + +ZSPACE: PUSH AF + PUSH BC + LD C,SPACE + CALL ZCO + POP BC + POP AF + RET + +;CONVERT HEX TO ASCII + +CONV: AND 0FH + ADD 90H + DAA + ADC 40H + DAA + LD C,A + RET + + +;GET TWO PARAMETERS AND PUT THEM IN [HL] & [DE] THEN ZCRLF + +EXLF: CALL HEXSP + POP DE + POP HL + +;SEND TO CONSOL CR/LF + +ZCRLF: PUSH BC + LD C,LF + CALL ZCO + LD C,CR + CALL ZCO + POP BC + RET + +;PUT THREE PARAMETERS IN [BC] [DE] [HL] THEN CR/LF + +EXPR3: INC C ;ALREADY HAD [C]=2 FROM START + CALL HEXSP + CALL ZCRLF + POP BC + POP DE + POP HL + RET + + + + +ZGET_HL: + CALL GETHEX ;Get 4 digits into HL + RET C + LD H,A + CALL GETHEX + RET C + LD L,A + OR A ;To return NC + RET + +;GET ONE PARAMETER + +EXPR1: LD C,01H +HEXSP: LD HL,0000 +EX0: CALL TI + CP ESC + JR NZ,EX1 + JP ESC_ABORT ;ABORT BACK TO MAIN LOOP +EX1: LD B,A + CALL NIBBLE + JR C,EX2X + ADD HL,HL + ADD HL,HL + ADD HL,HL + ADD HL,HL + OR L + LD L,A + JR EX0 +EX2X: EX (SP),HL + PUSH HL + LD A,B + CALL QCHK + JR NC,SF560 + DEC C + RET Z +SF560: JP NZ,ERROR + DEC C + JR NZ,HEXSP + RET +EXF: LD C,01H + LD HL,0000H + JR EX1 + +ESC_ABORT: + LD C,BELL + CALL ZCO + CALL ZCRLF + POP AF ;BALANCE UP STACK + JP ZSTART + + + +;RANGE TEST ROUTINE CARRY SET = RANGE EXCEEDED + +HILOX: CALL CCHK + CALL HILO + RET NC + POP DE ;DROP ONE LEVEL BACK TO START + RET +HILO: INC HL ;RANGE CHECK SET CARRY IF [DE]=[HL] + LD A,H + OR L + SCF + RET Z + LD A,E + SUB L + LD A,D + SBC A,H + RET + +;PRINT [HL] ON CONSOL + +LADR: LD A,H ;Print HEX in A no other registers altered + CALL ZHEXOUT + LD A,L +LBYTE: +ZHEXOUT: + PUSH AF ;<<<< PRINT VALUE IN [A] in HEX ON CONSOLE + RRCA + RRCA + RRCA + RRCA + CALL SF598 + POP AF +SF598: CALL CONV ;Char to [C] + JP ZCO ;Will force a return + +PHEX: PUSH AF + PUSH BC + CALL ZHEXOUT + POP BC + POP AF + + +;THIS IS A CALLED ROUTINE USED TO CALCULATE TOP OF RAM IS USED BY +;THE ERROR ROUTINE TO RESET THE STACK. +;Returns top of RAM in [HL] + +MEMSIZ: PUSH BC ;SAVE [BC] +MEMSZ1: LD HL,0FFFFH ;START FROM THE TOP DOWN +MEMSZ2: LD A,(HL) + CPL + LD (HL),A + CP (HL) + CPL ;PUT BACK WHAT WAS THERE + LD (HL),A + JP Z,GOTTOP + DEC H ;TRY 100H BYTES LOWER + JR MEMSZ2 ;KEEP LOOKING FOR RAM +GOTTOP: POP BC ;RESTORE [BC] + RET + +NIBBLE: SUB 30H + RET C + CP 17H + CCF + RET C + CP LF + CCF + RET NC + SUB 07H + CP LF + RET + +COPCK: LD C,'-' + CALL ZCO + +PCHK: CALL TI + +;TEST FOR DELIMITERS + +QCHK: CP SPACE + RET Z + CP ',' + RET Z + CP CR + SCF + RET Z + CCF + RET + +;KEYBOARD HANDELING ROUTINE (WILL NOT ECHO CR/LF) +;IT CONVERTS LOWER CASE TO UPPER CASE FOR LOOKUP COMMANDS +;ALSO ^C WILL FORCE A JUMP TO BOOT IN CP/M +;ALL OTHERE CHARACTERS ARE ECHOED ON CONSOL + +TI: CALL ZCI + CP CR + RET Z + CP 'C'-40H ;^C TO BOOT IN CP/M + JP Z,ZBOOT + PUSH BC + LD C,A + CALL ZCO + LD A,C + POP BC + CP 40H ;LC->UC + RET C + CP 7BH + RET NC +SF754: AND 5FH + RET + + +;DISPLAY 8 BITS OF [A] (B & C registers changed) + +ZBITS: PUSH DE + PUSH BC + LD E,A + CALL BITS + POP BC + POP DE + RET + +;DISPLAY 8 BITS OF [A] (B & C registers changed) + +BITS: LD B,08H +SF76E: SLA E + LD A,18H + ADC A,A + LD C,A + CALL ZCO + DJNZ SF76E + RET + +GETHEX: + CALL GETCMD ;Get a character from keyboard & ECHO + CP A,ESC + JR Z,HEXABORT + CP A,'/' ;check 0-9, A-F + JR C,HEXABORT + CP A,'F'+1 + JR NC,HEXABORT + CALL ASBIN ;Convert to binary + RRCA + RRCA + RRCA + RRCA + LD B,A ;Store it + CALL GETCMD ;Get 2nd character from keyboard & ECHO + CP A,ESC + JR Z,HEXABORT + CP A,'/' ;check 0-9, A-F + JR C,HEXABORT + CP A,'F'+1 + JR NC,HEXABORT + CALL ASBIN ;Convert to binary + OR A,B ;add in the first digit + OR A ;To return NC + RET +HEXABORT: + SCF ;Set Carry flag + RET + + +GETCMD: CALL ZCI ;GET A CHARACTER, convert to UC, ECHO it + CALL TO_UPPER + CP A,ESC + RET Z ;Don't echo an ESC + PUSH AF ;Save it + PUSH BC + LD C,A + CALL ZCO ;Echo it + POP BC + POP AF ;get it back + RET + + ;Convert LC to UC +TO_UPPER: + CP A,'a' ;must be >= lowercase a + RET C ; else go back... + CP A,'z'+1 ;must be <= lowercase z + RET NC ; else go back... + SUB A,'a'-'A' ;subtract lowercase bias + RET + + +ASBIN: SUB A,30H + CP A,0AH + RET M + SUB A,07H + RET + + +echo: + call ZCI ; get a character + cp ESC ; escape? + jr z,echoz ; done if so + LD C,A + call ZCO ; else send char + jr echo ; and loop +; +echoz: ; Say "Goodbye" + + ld hl,str_goodbye + call PRINT_STRING +exit: + halt + +; +NOT_DONE: + LD HL,CODE_NOT_DONE + CALL PRINT_STRING + RET + +ERROR: LD C,'?' + CALL ZCO + JP BEGIN + +;======================================================================= +; I/O SUPPORT PROCEDURES +; +;======================================================================= +; +; Print a string at HL to the primary CONSOLE PORT. In order to save ROM space +; with numerous CR,LF's before or after the actual text this routine has 3 options:- +; 1. If there is a terminating '$' at the end of the string send a CR/LF before returning +; 2. If there is a terminating 0H at the end of the string, just terminate the string +; In both the above cases the string always starts off with a CR/LF +; 3. If P_STRING is used then no CR/LF at the start of a string. + +PRINT_STRING: ;Print string on Propeller Board + CALL ZCRLF +P_STRING: ; Start without CR,LF + ld a,(hl) ; get next char + CP A,'$' ; Terminate with a '$' + JR Z,P_STRING_CRLF ;Finish with CR,LF + or a ; end of string? + ret z ; Immediatly terminate + LD C,A + call ZCO ; print the char + inc hl ; bump to next char in string + jr P_STRING ; loop till done +P_STRING_CRLF: + LD C,CR + call ZCO ; print the char + LD C,LF + call ZCO ; print the char + RET + +;>>>>>>>>>>>>>>>>>>>>>>>>> MODEM SERIAL PORT ROUTINES <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< +; +; +MODEM_ZCI: + PUSH DE ;SAVE D,E + LD A,5H ;Lower RTS line + OUT0 (MODEM_CTL_PORT),A ;Sel Reg 5 + LD A,11101010B ;EAH + OUT0 (MODEM_CTL_PORT),A + NOP + NOP +MSEC: LD DE,0BBBBH ;1 SEC DCR COUNT +MWTI: IN0 A,(MODEM_CTL_PORT) + AND A,MODEM_RECV_MASK + CP A,RECV_READY + JP Z,MCHAR ;GOT CHAR + DEC E ;COUNT DOWN + JP NZ,MWTI ;FOR TIMEOUT + DEC D + JP NZ,MWTI + DEC B ;DCR # OF SECONDS + JP NZ,MSEC ;MODEM TIMED OUT RECEIVING + POP DE ;RESTORE D,E + SCF ;CARRY SHOWS TIMEOUT + RET + +MCHAR: IN0 A,(MODEM_DATA_PORT) + POP DE ;RESTORE DE + PUSH AF ;CALC CHECKSUM + ADD A,C + LD C,A + POP AF + OR A,A ;TURN OFF CARRY TO SHOW NO TIMEOUT + RET + + +;GET A CHARACTER FROM THE "MODEM" SERIAL PORT ON THE S100 BUS SERIAL IO BOARD + +MODEM_ZCO: + PUSH AF ;CHECK IF MONITORING OUTPUT + ADD A,C ;CALC CKSUM + LD C,A +SENDW: IN0 A,(MODEM_CTL_PORT) ;Don't worry PC is always fast enough! + AND A,MODEM_SEND_MASK + CP A,SEND_READY + JP NZ,SENDW + POP AF ;GET CHAR + OUT0 (MODEM_DATA_PORT),A + + ;Raise RTS line to prevent the next character arriving + LD A,5H ;while the Z80 is busy processing info + OUT0 (MODEM_CTL_PORT),A ;Sel Reg 5 + LD A,11101000B ;E8H + OUT0 (MODEM_CTL_PORT),A + RET +; +; +MODEM_ZSTATUS: + IN0 A,(MODEM_CTL_PORT) + AND A,MODEM_RECV_MASK + CP A,RECV_READY + JP Z,MREADY ;GOT CHAR + XOR A + RET ;RET Z if nothing + +MREADY: XOR A + DEC A + RET ;RET NZ IF CHARACTER + + +;>>>>>>>>>>>>>>>>>>>>>>>>> SPEECH OUTPUT ROUTINES <<<<<<<<<<<<<<<<<< +; +;SPEAK OUTPUT (WILL BE USED TO COMMUNICATE WITH TALKER) +; Note the S100Computers I/O board V-Stamp speech chip will use the initial baud rate +; of of the SCC to communicate with it. This is determines after each reset/slave clear. + +SPEAKER_CTS: ;Cannot get this to work. SCC does not change bit 5 of RR1 + ;when E1 sent to WR3 (No Auto Enable). See SCCINIT: + IN0 A,(BCTL) ;A0H + BIT 5,A + LD A,0FFH + RET NZ ;Ret NZ if CTS is High + XOR A + RET ;Ret Z if CTS is Low + +SPEAKOUT: + XOR A,A ;Will try 256 times, then timeout +SPXXX: PUSH AF + IN0 A,(BCTL) ;(A0), Is SCC RX Buffer empty + AND 04H + JR NZ,SENDS ;NZ if ready to recieve character + POP AF + DEC A + JR NZ,SPXXX + RET +SENDS: POP AF + LD A,C + OUT0 (BDTA),A ;(A2), Send it + RET +; +;SPEAKTOMM THIS IS A ROUTINE TO SEND A STRING TO TALKER [HL] AT STRING +SPEAK$: LD A,(HL) + CP '$' + JR Z,SPEAK1 + LD C,A + CALL SPEAKOUT + INC HL + JR SPEAK$ +SPEAK1: LD C,0DH ;MUST END WITH A CR + JP SPEAKOUT + + +;>>>>>>>>>>>>>>>>>>>> MAIN PRINTER OUTPUT ROUTINES <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + +LO: PUSH BC + LD B,0FFH ;First make sure an actual printer is connected +LO2: CALL LSTAT + JR NZ,LO1 ;Printer is ready go to it + DJNZ LO2 + POP BC + XOR A + LD A,C + RET ;RET Z if Printer problem (Not switched on) + + +IF ST8C4 ;If S100_Parallel_IO Board for Printer output + LD A,80H ;Z180 internal ports must be temporaly moved away from C0-FFH + out0 (z180_base),A +LO1: POP BC + LD A,PRINTER_ST_HIGH ;Make sure strobe is high + OUT0 (PRINTER_CTRL),A + LD A,C ;Send Data from [C] + OUT0 (PRINTER_OUT),A + LD A,PRINTER_ST_LOW ;Now send strobe High->Low + OUT0 (PRINTER_CTRL),A + LD A,PRINTER_ST_HIGH ;Now returb strobe back high + OUT0 (PRINTER_CTRL),A + ld a,z180_base ;Put internal Z180 ports back to C0-FFH range + out0 (0BFh),a + OR A,A + RET ;Ret NZ if OK + +ELSE ;IMSAI PIO Board PARRELL PORT + +LO1: POP BC + LD A,0FFH ;Setup strobe high to low then high + OUT0 (PRINTER_STROBE),A + LD A,C + OUT0 (PRINTER_OUT),A ;Now Data + XOR A ;STROBE FOR CENTRONICS + OUT (PRINTER_STROBE),A + LD A,0FFH ;Raise strobe again + OUT0 (PRINTER_STROBE),A + OR A,A + RET ;Ret NZ if OK +ENDIF + + +FLUSH: LD HL,FLUSH_MSG + CALL PRINT_STRING ;Have a Stack, so now we can use CALL + LD C,FF ;Send a Form Feed to laserJet Printer + CALL LO ;This forces a partial page to be printed + RET + + +IF ST8C4 ;If S100_Parallel_IO Board for Printer output + LD A,0 ;Z180 internal ports must be temporaly moved away from C0-FFH + ld a,z180_base +LSTAT: IN0 A,(PRINTER_STATUS) ;0CH status port of ST8C4 + AND 11111111B ;For now + CP 11011111B ;should see 11011111 if printer is selected, ready, with paper etc. + JR Z,LSTAT1 + ld a,z180_base ;Put them back to C0-FFH range + ld a,z180_base ;Put internal Z180 ports back to C0-FFH range + out0 (3Fh),a + RET ;Return Z if not ready +LSTAT1: ld a,z180_base ;Put internal Z180 ports back to C0-FFH range + out0 (3Fh),a + XOR A ;PUT 0FFH IN [A] IF READY & NO ZERO FLAG + DEC A + RET +ELSE ;IMSAI PIO Board PARRELL PORT +LSTAT: IN0 A,(PRINTER_STATUS) + AND 00001111B ;XXXX0110 IS READY (BIT 3=PAPER BIT 2=FAULT + CP 00000110B ;BIT 1=SELECT BIT 0=BUSY + JR Z,LSTAT1 + XOR A + RET +LSTAT1: XOR A ;PUT 0FFH IN [A] IF READY & NO ZERO FLAG + DEC A + RET +ENDIF +; + + +; +;S100Computers Serial I/O Board Initilization +;Note Zilog SCC serial port A will be set to 19,200 Baud initially (for speech synthesizer). +;Note Zilog SCC serial port B will be set to 38,400 Baud initially (for XModem etc). + +INIT_SCC_A: + LD A,ACTL ;Program Channel A + LD C,A + LD B,0EH ;Byte count for OTIR below + LD HL,SCCINIT_A + OTIR + RET + +INIT_SCC_B: + LD A,BCTL ;Program Channel B + LD C,A + LD B,0EH ;Byte count for OTIR below + LD HL,SCCINIT_B + OTIR + RET +; +; +SCCINIT_A: + DB 04H ;Point to WR4 + DB 44H ;X16 clock,1 Stop,NP + DB 03H ;Point to WR3 + DB 0C1H ;Enable reciever, Auto Enable, Recieve 8 bits +; DB 0E1H ;Enable reciever, No Auto Enable, Recieve 8 bits (for CTS bit) + DB 05H ;Point to WR5 + DB 0EAH ;Enable, Transmit 8 bits + DB 0BH ;Set RTS,DTR, Enable. Point to WR11 + DB 56H ;Recieve/transmit clock = BRG + DB 0CH ;Point to WR12 +; DB 40H ;Low Byte 2400 Baud +; DB 1EH ;Low Byte 4800 Baud <<<<<<<<<<< XModem I/O +; DB 0EH ;Low Byte 9600 Baud +; DB 06H ;Low byte 19,200 Baud + DB 02H ;Low byte 38,400 Baud <<<<<<<<<<< XModem I/O +; DB 00H ;Low byte 76,800 Baud + DB 0DH ;Point to WR13 + DB 00H ;High byte for Baud + DB 0EH ;Point to WR14 + DB 01H ;Use 4.9152 MHz Clock. Note SD Systems uses a 2.4576 MHz clock, enable BRG + DB 0FH ;Point to WR15 + DB 00H ;Generate Int with CTS going high + +SCCINIT_B: + DB 04H ;Point to WR4 + DB 44H ;X16 clock,1 Stop,NP + DB 03H ;Point to WR3 + DB 0C1H ;Enable reciever, Auto Enable, Recieve 8 bits + DB 05H ;Point to WR5 + DB 0EAH ;Enable, Transmit 8 bits + DB 0BH ;Set RTS,DTR, Enable. Point to WR11 + DB 56H ;Recieve/transmit clock = BRG + DB 0CH ;Point to WR12 + DB 06H ;Low byte 19,200 Baud <<<<<<<<<<< Note Speech synthizer defaults to this value + DB 0DH ;Point to WR13 + DB 00H ;High byte for Baud + DB 0EH ;Point to WR14 + DB 01H ;Use 4.9152 MHz Clock. Note SD Systems uses a 2.4576 MHz clock, enable BRG + DB 0FH ;Point to WR15 + DB 00H ;Generate Int with CTS going high + +; +; Simply bank selection routine. Enter with A indicating the +; 32K bank of memory to select into the lower 32K of CPU space. +; For example, 00H selects first bank of ROM, 10H selects first +; bank of RAM. Register A is trashed! +; +; We want 32K banks, but Z180 uses 4K increments. So, we need to +; scale the input from 32K chunks to 4K chunks. +; +bnksel: + rlca ; Scale input from + rlca ; ... 32K chunk addressing to + rlca ; ... 4K chunk addressing + out0 (z180_bbr),a ; write to bank base reg + ret +; +; Data +; + + + + +SIGNON_MSG: DB BELL,CR,LF + DB 'Z180 ROM MONITOR (V0.34) @ E000H (J.Monahan,7/22/2023)',0 + +MENUMSG: DB 'A=Memmap B=ROMWBW D=Disp E=Echo F=Fill G=Goto H=Date',CR,LF + DB 'I=Time J=RAM Test K=Menu M=Move N=S100 O=Bus Req P=CPM(IDE)',CR,LF + DB 'QI,O=Port R=Ports S=Subs T=Type U=Halt V=Verify W=SD Card',CR,LF + DB 'X=XModem Y=IDE Z=Top @=Flush Printer',CR,LF + DB LF,'$' + +SMSG_SP: DB 'Z 1 8 0 ROM MONITOR VERSION 0.34 PRESENT$' + +TOP_RAM_MSG DB 'Top of RAM=',0 +SP_MSG DB 'H SP=',0 +IOBYTE_MSG DB 'H IOBYTE=',0 +CR_SMSG_SP: DB CR,CR,'$' +CODE_NOT_DONE DB 'Code not written yet!$' +CHAR_TEST_MSG DB 'Keyboard input test. Enter characters. (ESC or ^C to abort)$' + +S100_MENU DB LF,'S100 Bus Address Tests' + DB CR,LF,'0 Address line test (0 to FFFFH)' + DB CR,LF,'1 Send "333..." to S100 Port 01H' + DB CR,LF,'2 S100 Input Port 01H Test' + DB CR,LF,'3 S100 Consol I/O Test' + DB CR,LF,'4 Speech Test' + DB CR,LF,'5 Serial Board Port Test' + DB CR,LF,'6 Test Printer' + DB CR,LF,'7 Activate Interrupts' + DB CR,LF,'ESC To return to Main Menu' + DB CR,LF,'>',0 + +CONSOLE_TEST DB 'Enter S100 bus keyboard char. ESC to abort ',0 +FLUSH_MSG DB 'Sending FF to Printer',0 + +MEM_TEST_MSG DB 'Memory Test 0-DF00H$' +MEM_ERR_MSG DB BELL,'RAM error at ',0 +TIME_MSG DB 'Time:- ',0 +DATE_MSG DB 'Date:- ',0 +Time1_Msg DB ' ',0 +Date1_Msg DB ' ',0 + +MODEM_SIGNON: DB 'Get a File from PC (38,400 Baud)$' +RMSG: DB 'WAITING FOR SECTOR #',0 +ERRSOH: DB 'H RECEIVED, NOT SOH$' +ERR2: DB '++BAD SECTOR # IN HDR$' +ERR3: DB '++BAD CKSUM ON SECTOR$' +TOUTM: DB 'TIMEOUT ',0 +QUITM: DB 'MULTIPLE ERRORS.' + DB 'TYPE Q TO QUIT, R TO RETRY:',0 +MODEM_DONE_MSG: DB 'TRANSFER COMPLETE',0 +BAD_HEADER_MSG: DB 'INVALID HEADER.$' +MODEM_RAM_MSG: DB 'H. If OK will write to RAM at ',0 +MODEM_RAM_LOC: DB 'Enter RAM location (xxxxH +CR): ',0 + +HALT_MSG: DB 'The CPU halted!',0 + +SD_MENU0_MSG: DB LF,LF,'SD Card Menu ' + DB 'Sector=',0 + +IDE_MENU0_MSG: DB LF,LF,'S100 Bus IDE Board Menu. Track=',0 +IDE_MENU1_MSG: DB 'H Sector=',0 + +IDE_MENU3_MSG: DB 'H RAM Address=',0 +BITS_END_MSG: DB 'B)$' +H_MSG: DB 'H.',0 +SD_MENU4_MSG +IDE_SD_MENU_MSG: DB '0 Initilize Drive 0' + DB CR,LF,'1 Set Sec,(Track)' + DB CR,LF,'2 Set RAM Address' + DB CR,LF,'3 Read Sec' + DB CR,LF,'4 Write Sec' + DB CR,LF,'5 Read N Sec' + DB CR,LF,'6 Write N Sec' + DB CR,LF,'+ Next Sec' + DB CR,LF,'ESC To return to Main Menu' + DB CR,LF,'>',0 + +INIT_ERR: DB BELL,'Drive Init. Error$' +INIT_OK: DB 'Drive Init. OK',0 +msgrd: DB 'Sec. Read OK',0 +msgwr: DB 'Sec. Write OK',0 +DRIVE_ERRORS DB BELL,'IDE Drive Err. Status=',0 +READING_MSG DB 'Reading Sector(s)',0 +WRITING_MSG DB 'Writing Sector(s)',0 +GET_LBA_MSG: DB 'Enter CPM style TRK & SEC (in hex).$' +ENTER_SECL DB 'Starting sector no.,(xxH) = ',0 +ENTER_TRKL DB 'Track no. (LOW byte, xxH) = ',0 +ENTER_TRKH DB 'Track no. (HIGH byte, xxH) = ',0 +ENTER_SEC_COUNT DB 'Number of Sec (xxH) = ',0 +GET_DMA_MSG DB 'Enter RAM location for Sec. data (xxxxH) = ',0 +Write_Sure: DB 'Warning: this will change data on the drive, ' + DB 'are you sure? (Y/N)...',0 +NMI_MSG: DB 'NMI Activated',CR,LF,'>',0 ;0E00FH +INT0_MSG: DB 'INT0 Activated',CR,LF,'>',0 ;0E01FH +SLAVE_MSG DB BELL,'Activate Master/Slave switch$' +INTS_OFF_MSG DB 'Inactivating Interrupts$' +INTS_ON_MSG DB 'Activating Interrupts$' +BOOT_ROM_MSG DB 'Booting ROMWBW$' +S100_ONLY_MSG DB BELL,'Code for the S100 bus only$' + +CF_TYPE_ERR_MSG: DB BELL,'SD Card Type 2 was NOT detected. (Status =',0 +CARD_TYPE2_MSG: DB 'Detected a Type 2 SD card.$' +CMD41_55_OK_MSG: DB 'CMD55 & CMD41 Commands OK.',CR,LF + DB 'The SD Card init. correctly.$' +CRC_ERROR_MSG: DB BELL,'Error turning off CRC checking. (Status = ',0 +SIZE_ERROR_MSG: DB BELL,'Sect. size error. (Status = ',0 +CMD55_FAIL_MSG: DB BELL,'SD Card Type 2 Init. failed (CMD55/CMD41) (Status = ',0 +READ_ERR_MSG1: DB BELL,'SD Card must first be initilized (Menu 0).$' +SEC_RD_ERR0_MSG: DB BELL,'Read Sec. CMD CMD17 error. (Status = ',0 +SEC_RD_ERR1_MSG: DB BELL,'Sec. read error. No 0FEH Flag. (Status = ',0 +CONTINUE_MSG: DB 'Type any char. to continue.',0 +ENTER_SEC_NUM: DB 'Enter Sec. No. (XXXXH): ',0 +SEC_WR_ERR0_MSG: DB BELL,'Sec. write err., CMD24. (Status = ',0 +SEC_WR_ERR1_MSG: DB BELL,'Error writing Sec. bytes, CMD24. (Status = ',0 +SEC_WR_ERR2_MSG: DB BELL,'Error waiting for sec. write. (Status = ',0 +SEC_WR_ERR3_MSG: DB BELL,'Error resetting sec. write, CMD0. (Status = ',0 +SEC_WR_ERR4_MSG: DB BELL,'Error getting Card type, CMD8. (Status = ',0 +SEC_WR_ERR5_MSG: DB BELL,'Error re-activating Type 2 Card, CMD55+CMD41. (Status = ',0 + +DATA_ERROR_MSG: DB BELL,CR,LF,'Data entry error.$' +SPEAKCPM_SP: DB 'LOADING CPM $' +DRIVE_NR_ERR: DB BELL,'Drive not Ready.',LF,'$' +BOOT_LD1_ERR: DB BELL,'BOOT error.',LF,'$' +BOOT_LD_ERR: DB BELL,'Read Error.',LF,'$' +IDE_RW_ERROR: DB BELL,'IDE Drive R/W Error',LF,'$' + + + +CMD_0: DB 40H,00H,00H,00H,00H,95H,0FFH ; (0+64) To Reset the SD Card interface, +CMD_1: DB 41H,00H,00H,00H,00H,0F9H,0FFH ; (1+64) Activate Init Process +CMD_8: DB 48H,00H,00H,01H,0AAH,87H,0FFH ; (8+64) To check Card Voltage +CMD_9: DB 49H,00H,00H,00H,00H,8FH,0FFH ; (9+64) Read SD Register (CSD) +CMD_13: DB 4DH,00H,00H,00H,00H,081H,0FFH ; (13+64) get SD card status +CMD_16: DB 50H,00H,00H,02H,00H,081H,0FFH ; (16+64) Set Sector size to 512 Bytes +CMD_17: DB 51H,00H,00H,00H,00H,0FFH,0FFH ; (17+64) Read a single block (Block 0, Used to load boot sector only) +CMD_41: DB 69H,40H,00H,00H,00H,077H,0FFH ; (41+64) Activates the card's init. process. +;CMD_41: DB 69H,00H,00H,00H,000H,0E5H,0FFH ; (41+64) Activates the card's init. process. +CMD_55: DB 77H,00H,00H,00H,00H,065H,0FFH ; (55+64) Application specific command NEXT +CMD_58: DB 7AH,00H,00H,00H,00H,0FDH,0FFH ; (58+64) Read SD Cards OCR register +CMD_59: DB 7BH,00H,00H,00H,00H,0FDH,0FFH ; (59+64) Turn off CRC checking + + +;----------------- LOCAL DATA STORAGE ---------------------------------------------------------- + +@DELAYStore DB 0 +@SEC DW 0 +@TRK DW 0 ; +2H +@SEC_COUNT DW 0 ; +4H +@RAM_ADDRESS DW 0 ; +6H + +@StartLineHex DW 0 ; +8H +@BYTE$COUNT DW 0 ; +0AH +@DRIVE$SEC DW 0 ; +0CH +@DRIVE$TRK DW 0 ; +0EH +@StartLineASCII DW 0 ; +10H +@NEXT_ADDRESS DW 0 ; +12H +@INTS_FLAG DW 0 ; +14H ;Flag to indicate if Interrupts are on = 1 or off = 0. + +@CARD_TYPE DW 0 ; +16H ;For SD Cards +@SPARE DW 0 ; +18H + +RAM_STORE_SIZE equ 18H + + +str_goodbye db CR,LF,'Goodbye, CPU Halted$' +@FINAL_BYTE DW 0 ; ;Last usable byte in RAM (must be less than 0FFFFH. +ROM_EMPTY equ (0FFFFH - $) + +mon_len equ ($ - mon_start) +; + .dephase + + end \ No newline at end of file diff --git a/Source/HBIOS/scon.asm b/Source/HBIOS/scon.asm new file mode 100644 index 00000000..9a32457f --- /dev/null +++ b/Source/HBIOS/scon.asm @@ -0,0 +1,130 @@ +; +;================================================================================================== +; S100 PROPELLER CONSOLE DRIVER +;================================================================================================== +; +; TODO: +; +SCON_IOBASE .EQU $00 +; +SCON_STATUS .EQU SCON_IOBASE +SCON_DATA .EQU SCON_IOBASE + 1 +; +SCON_KBDRDY .EQU %00000010 +SCON_DSPRDY .EQU %00000100 +; +SCON_COLS .EQU 80 +SCON_ROWS .EQU 40 +; + .ECHO "SCON: IO=" + .ECHO SCON_IOBASE + .ECHO "\n" +; +; +; +SCON_PREINIT: + XOR A + RET +; +; +; +SCON_INIT: + CALL NEWLINE + PRTS("SCON:$") +; + ; DISPLAY CONSOLE DIMENSIONS + CALL PC_SPACE + LD A,SCON_COLS + CALL PRTDECB + LD A,'X' + CALL COUT + LD A,SCON_ROWS + CALL PRTDECB + CALL PRTSTRD + .TEXT " TEXT (ANSI)$" +; +; ADD OURSELVES TO CIO DISPATCH TABLE +; + LD D,0 ; PHYSICAL UNIT IS ZERO + LD E,CIODEV_SCON ; DEVICE TYPE + LD BC,SCON_FNTBL ; BC := FUNCTION TABLE ADDRESS + CALL CIO_ADDENT ; ADD ENTRY, A := UNIT ASSIGNED + LD (HCB + HCB_CRTDEV),A ; SET OURSELVES AS THE CRT DEVICE +; + XOR A ; SIGNAL SUCCESS + RET +; +; DRIVER FUNCTION TABLE +; +SCON_FNTBL: + .DW SCON_IN + .DW SCON_OUT + .DW SCON_IST + .DW SCON_OST + .DW SCON_INITDEV + .DW SCON_QUERY + .DW SCON_DEVICE +#IF (($ - SCON_FNTBL) != (CIO_FNCNT * 2)) + .ECHO "*** INVALID SCON FUNCTION TABLE ***\n" +#ENDIF +; +; +; +SCON_IN: + CALL SCON_IST ; CHECK FOR CHAR PENDING + JR Z,SCON_IN ; WAIT FOR IT IF NECESSARY + IN0 A,(SCON_DATA) ; READ THE CHAR FROM PROPIO + LD E,A + RET +; +; +; +SCON_IST: + IN0 A,(SCON_STATUS) ; READ LINE STATUS REGISTER + AND SCON_KBDRDY ; ISOLATE KBDRDY + JP Z,CIO_IDLE ; RETURN VIA IDLE PROCESSING + OR $FF ; SET A=$FF TO SIGNAL READY + RET ; RETURN +; +; +; +SCON_OUT: + CALL SCON_OST ; CHECK FOR OUTPUT READY + JR Z,SCON_OUT ; WAIT IF NECESSARY + LD A,E ; RECOVER THE CHAR TO WRITE + OUT0 (SCON_DATA),A ; WRITE THE CHAR TO PROPIO + RET +; +; +; +SCON_OST: + IN0 A,(SCON_STATUS) ; READ LINE STATUS REGISTER + AND SCON_DSPRDY ; ISOLATE DSPRDY + JP Z,CIO_IDLE ; RETURN VIA IDLE PROCESSING + OR $FF ; SET A=$FF TO SIGNAL READY + RET ; RETURN +; +; +; +SCON_INITDEV: + SYSCHKERR(ERR_NOTIMPL) + RET +; +; +; +SCON_QUERY: + LD DE,0 + LD HL,0 + XOR A + RET +; +; +; +SCON_DEVICE: + LD D,CIODEV_SCON ; D := DEVICE TYPE + LD E,0 ; E := DEVICE NUM, ALWAYS 0 + LD C,$BF ; C := DEVICE TYPE, 0xBF IS PROP TERM + LD H,0 ; H := 0, DRIVER HAS NO MODES + LD L,SCON_IOBASE ; L := BASE I/O ADDRESS + XOR A ; SIGNAL SUCCESS + RET diff --git a/Source/HBIOS/sd.asm b/Source/HBIOS/sd.asm index 57440e13..88904021 100644 --- a/Source/HBIOS/sd.asm +++ b/Source/HBIOS/sd.asm @@ -9,14 +9,14 @@ ; - TEST XC CARD TYPE DETECTION ; - TRY TO GET INIT TO FAIL, REMOVE DELAYS AT START OF GOIDLE? ; -;---------------------------------------------------------------------------------------------- -; SD Signal Active JUHA N8 CSIO PPI UART DSD MK4 SC MT -; ------------ ------- ------- ------- ------- ------- ------- ------- ------- ------- ------- -; CS (DAT3) LO -> RTC:2 RTC:2 RTC:2 ~PC:4 ~MCR:3 OPR:2 SD:2 ~RTC:2/3OPR:4/5 -; CLK HI -> RTC:1 RTC:1 CSIO PC:1 ~MCR:2 OPR:1 CSIO CSIO SPI -; DI (CMD) HI -> RTC:0 RTC:0 CSIO PC:0 ~MCR:0 OPR:0 CSIO CSIO SPI -; DO (DAT0) HI -> RTC:7 RTC:6 CSIO PB:7 ~MSR:5 OPR:0 CSIO CSIO SPI -;---------------------------------------------------------------------------------------------- +;----------------------------------------------------------------------------------------------------- +; SD Signal Active JUHA N8 CSIO PPI UART DSD MK4 SC MT PIO +; ------------ ------- ------- ------- ------- ------- ------- ------- ------- ------- -------------- +; CS (DAT3) LO -> RTC:2 RTC:2 RTC:2 ~PC:4 ~MCR:3 OPR:2 SD:2 ~RTC:2/3OPR:4/5~OPR:3 +; CLK HI -> RTC:1 RTC:1 CSIO PC:1 ~MCR:2 OPR:1 CSIO CSIO SPI OPR:4 +; DI (CMD) HI -> RTC:0 RTC:0 CSIO PC:0 ~MCR:0 OPR:0 CSIO CSIO SPI OPR:0 +; DO (DAT0) HI -> RTC:7 RTC:6 CSIO PB:7 ~MSR:5 OPR:0 CSIO CSIO SPI OPR:7 +;----------------------------------------------------------------------------------------------------- ; ; CS = CHIP SELECT (AKA DAT3 FOR NON-SPI MODE) ; CLK = CLOCK @@ -116,6 +116,8 @@ SD_NOPULLUP .EQU TRUE ; ASSUME NO PULLUP ; SD_DEVCNT .EQU SDCNT ; SET SD_DEVCNT TO SDCNT CONFIG VAR +; + .ECHO "SD: MODE=" ; #IF (SDMODE == SDMODE_JUHA) ; JUHA MINI-BOARD SD_DEVMAX .EQU 1 ; NUMBER OF PHYSICAL UNITS (SOCKETS) @@ -129,6 +131,7 @@ SD_DI .EQU %00000001 ; RTC:0 IS DATA IN (CARD <- CPU) SD_DO .EQU %10000000 ; RTC:7 IS DATA OUT (CARD -> CPU) SD_IOBASE .EQU SD_OPRREG ; IOBASE SD_INVCS .EQU FALSE ; INVERT CS + .ECHO "JUHA" ; RTCDEF .SET RTCDEF | SD_OPRDEF ; SET DEFAULT IN HBIOS MAINLINE #ENDIF @@ -145,6 +148,7 @@ SD_DI .EQU %00000001 ; RTC:0 IS DATA IN (CARD <- CPU) SD_DO .EQU %01000000 ; RTC:6 IS DATA OUT (CARD -> CPU) SD_IOBASE .EQU SD_OPRREG ; IOBASE SD_INVCS .EQU FALSE ; INVERT CS + .ECHO "N8" ; RTCDEF .SET RTCDEF | SD_OPRDEF ; SET DEFAULT IN HBIOS MAINLINE #ENDIF @@ -159,6 +163,7 @@ SD_CNTR .EQU Z180_CNTR SD_TRDR .EQU Z180_TRDR SD_IOBASE .EQU SD_OPRREG ; IOBASE SD_INVCS .EQU FALSE ; INVERT CS + .ECHO "CSIO" ; RTCDEF .SET RTCDEF | SD_OPRDEF ; SET DEFAULT IN HBIOS MAINLINE #ENDIF @@ -167,6 +172,7 @@ RTCDEF .SET RTCDEF | SD_OPRDEF ; SET DEFAULT IN HBIOS MAINLINE SD_DEVMAX .EQU 1 ; NUMBER OF PHYSICAL UNITS (SOCKETS) SD_PPIBASE .EQU SDPPIBASE ; BASE IO PORT FOR PPI SD_PPIB .EQU SDPPIBASE + 1 ; PPI PORT B (INPUT: DOUT) +SD_PPIB .EQU SDPPIBASE + 1 ; PPI PORT B (INPUT: DOUT) SD_PPIC .EQU SDPPIBASE + 2 ; PPI PORT C (OUTPUT: CS, CLK, DIN) SD_PPIX .EQU SDPPIBASE + 3 ; PPI CONTROL PORT SD_OPRREG .EQU SD_PPIC ; PPI PORT C IS OPR REG @@ -178,6 +184,7 @@ SD_DI .EQU %00000001 ; PPIC:0 IS DATA IN (CARD <- CPU) SD_DO .EQU %10000000 ; PPIB:7 IS DATA OUT (CARD -> CPU) SD_IOBASE .EQU SD_PPIBASE ; IOBASE SD_INVCS .EQU TRUE ; INVERT CS + .ECHO "PPI" #ENDIF ; #IF (SDMODE == SDMODE_UART) @@ -192,6 +199,7 @@ SD_DI .EQU %00000001 ; UART MCR:0 IS DATA IN (CARD <- CPU) SD_DO .EQU %00100000 ; UART MSR:5 IS DATA OUT (CARD -> CPU) SD_IOBASE .EQU UARTIOB ; IOBASE SD_INVCS .EQU TRUE ; INVERT CS + .ECHO "UART" #ENDIF ; #IF (SDMODE == SDMODE_DSD) ; DUAL SD @@ -207,6 +215,7 @@ SD_DI .EQU %00000001 ; RTC:6 IS DATA IN (CARD <- CPU) SD_DO .EQU %00000001 ; RTC:0 IS DATA OUT (CARD -> CPU) SD_IOBASE .EQU SD_OPRREG ; IOBASE SD_INVCS .EQU FALSE ; INVERT CS + .ECHO "DSD" #ENDIF ; #IF (SDMODE == SDMODE_MK4) ; MARK IV (CSIO STYLE INTERFACE) @@ -218,6 +227,7 @@ SD_CNTR .EQU Z180_CNTR SD_TRDR .EQU Z180_TRDR SD_IOBASE .EQU SD_OPRREG ; IOBASE SD_INVCS .EQU FALSE ; INVERT CS + .ECHO "MK4" #ENDIF ; #IF (SDMODE == SDMODE_SC) ; SC @@ -231,9 +241,16 @@ SD_CNTR .EQU Z180_CNTR SD_TRDR .EQU Z180_TRDR SD_IOBASE .EQU SD_OPRREG ; IOBASE SD_INVCS .EQU TRUE ; INVERT CS + .ECHO "SC" ; RTCDEF .SET RTCDEF | SD_OPRDEF ; SET DEFAULT IN HBIOS MAINLINE #ENDIF +; + .ECHO ", IO=" + .ECHO SD_IOBASE + .ECHO ", UNITS=" + .ECHO SDCNT + .ECHO "\n" ; #IF (SDMODE == SDMODE_MT) ; MT shift register for RCBUS (ref SDMODE_CSIO) ; @@ -250,7 +267,11 @@ RTCDEF .SET RTCDEF | SD_OPRDEF ; SET DEFAULT IN HBIOS MAINLINE ; THANKS TO DOUGLAS MILLER FOR BRINGING THIS BEHAVIOR TO MY ATTENTION ; AND SUPPLYING ASSOCIATED FIXES. ; + #IF (PLATFORM == PLT_DUO) +SD_BASE .EQU $8C ; Module base address + #ELSE SD_BASE .EQU $5C ; Module base address + #ENDIF SD_DEVMAX .EQU 2 ; NUMBER OF PHYSICAL UNITS (SOCKETS) SD_WRTR .EQU SD_BASE + 0 ; Write data and transfer SD_RDTR .EQU SD_BASE + 1 ; Read data and transfer @@ -282,6 +303,38 @@ SD_INVCS .EQU FALSE ; INVERT CS #ENDIF ; ; +#IF (SDMODE == SDMODE_PIO) ; Z80 PIO +; +; These mappings work for the RCbus Gluino card with an Arduino +; shield attached and are the ones also used in other bitbang setups +; directly attached to a PIO. It also works on a straight digital I/O +; port as the config writes will disappear into oblivion harmlessly +; +; The Gluino mapping (ie Arduino pin mapping equivalent) is thus +; D10 SS, D11 CIPO, D12 COPI, D13 SCL. +; +; For speed reasons MISO/MOSI are mapped to the top and bottom bits. +; RomWBW doesn't yet use this fact but the optimized Fuzix routines do. +; +SD_DEVMAX .EQU 1 ; NUMBER OF PHYSICAL UNITS (SOCKETS) +SD_IOBASE .EQU $69 ; IO BASE ADDRESS FOR SD INTERFACE +SD_OPRREG .EQU SD_IOBASE ; OUTPUT PORT (OUTPUT: CS, CLK, DIN) +;--- WBW +;SD_OPRDEF .EQU %11111111 ; OUTPUT PORT DEFAULT STATE +SD_OPRDEF .EQU %11101111 ; OUTPUT PORT DEFAULT STATE +;--- +SD_INPREG .EQU SD_IOBASE ; INPUT REGISTER +SD_CS0 .EQU %00001000 ; SELECT +SD_CLK .EQU %00010000 ; CLOCK +SD_DI .EQU %00000001 ; DATA IN (CARD <- CPU) MOSI +SD_DO .EQU %10000000 ; DATA OUT (CARD -> CPU) MISO +SD_CINIT .EQU TRUE ; INITIALIZE OUTPUT PORT +SD_DDR .EQU $6B ; DATA DIRECTION REGISTER +SD_DDRVAL .EQU %11100110 ; DATA DIRECTION REGISTER VALUE +SD_INVCS .EQU TRUE ; INVERT CS +#ENDIF +; +; #IF (SDMODE == SDMODE_USR) ; USER DEFINED HARDWARE CONFIGURATION ; ; THIS MODE IS INTENDED TO ALLOW A USER TO EASILY CONFIGURE A CUSTOM @@ -304,6 +357,40 @@ SD_DDRVAL .EQU %00001101 ; DATA DIRECTION REGISTER VALUE SD_INVCS .EQU FALSE ; INVERT CS #ENDIF ; +#IF (SDMODE == SDMODE_Z80R) ; Z80 Retro +; +; SPLIT OVER TWO REGISTERS TO DRIVE CLK. THE CS LINE IS ON THE GPIO +; WHICH IS THE SAME LATCHES THAT CONTROL MMU ON/OFF, SO DON;T GLITCH +; THEM WHEN UPDATING! +; +SD_DEVMAX .EQU 1 ; NUMBER OF PHYSICAL UNITS (SOCKETS) +SD_OPRDEF .EQU %00000001 ; OUTPUT PORT DEFAULT STATE +SD_OPRMSK .EQU %00000101 ; OUTPUT PORT MASK +SD_OPRREG .EQU $64 ; CS VIA GPIO +SD_IOBASE .EQU $68 ; 68/69 FOR OUTPUT +SD_IOREG .EQU SD_IOBASE ; INPUT REGISTER +SD_IOCLK .EQU SD_IOBASE+1 ; CLOCK IS OFF A0 +SD_GPIO .EQU $64 ; MISO IS ON THE GPIO +SD_CS0 .EQU %00000100 ; SELECT +SD_DI .EQU %00000001 ; DATA IN (CARD <- CPU) MOSI +SD_DO .EQU %00000001 ; DATA OUT (CARD -> CPU) MISO +SD_CINIT .EQU FALSE ; INITIALIZE OUTPUT PORT +SD_INVCS .EQU FALSE ; INVERT CS +#ENDIF + +; FOR NOW WE JUST HOOK UP ONE UNIT. THERE ARE EIGHT PORTS FOR DIFFERENT +; THINGS BUT THIS WILL GET US GOING +#IF (SDMODE == SDMODE_EPITX) ; Z180 ITX - CSIO, 82C55 for CS +SD_DEVMAX .EQU 1 ; NUMBER OF PHYSICAL UNITS (SOCKETS) +SD_OPRREG .EQU $42 ; 82C55 PORT C, LOW 3 ARE \CS MUX +SD_OPRDEF .EQU %11111111 ; QUIESCENT STATE (ROM ENABLED) +SD_CS0 .EQU %11111000 ; SPI CHANNEL 0 (4 INPUTS, ROM EN, CHAN 0) +SD_CNTR .EQU Z180_CNTR +SD_TRDR .EQU Z180_TRDR +SD_IOBASE .EQU SD_OPRREG ; IOBASE +SD_INVCS .EQU FALSE ; INVERT CS +#ENDIF +; #IF (SD_DEVCNT > SD_DEVMAX) .ECHO "*** ERROR: SDCNT EXCEEDS MAXIMUM SUPPORTED BY INTERFACE!!!\n" !!! ; FORCE AN ASSEMBLY ERROR @@ -510,12 +597,44 @@ SD_INIT: CALL PRTHEXBYTE #ENDIF ; +#IF (SDMODE == SDMODE_PIO) + PRTS(" MODE=PIO$") + PRTS(" IO=0x$") + LD A,SD_IOBASE + CALL PRTHEXBYTE +#ENDIF +; +#IF (SDMODE == SDMODE_Z80R) + PRTS(" MODE=Z80R$") + PRTS(" IO=0x$") + LD A,SD_IOBASE + CALL PRTHEXBYTE + LD A,SD_OPRDEF + LD (SD_OPRVAL),A +#ENDIF +; #IF (SDMODE == SDMODE_USR) PRTS(" MODE=USER$") PRTS(" IO=0x$") LD A,SD_IOBASE CALL PRTHEXBYTE #ENDIF +; +#IF (SDMODE == SDMODE_EPITX) + PRTS(" MODE=EPITX$") + #IF (SDCSIOFAST) + PRTS(" FAST$") + #ENDIF + PRTS(" OPR=0x$") + LD A,SD_OPRREG + CALL PRTHEXBYTE + PRTS(" CNTR=0x$") + LD A,SD_CNTR + CALL PRTHEXBYTE + PRTS(" TRDR=0x$") + LD A,SD_TRDR + CALL PRTHEXBYTE +#ENDIF ; CALL SD_PROBE ; CHECK FOR HARDWARE JR Z,SD_INIT00 ; CONTINUE IF PRESENT @@ -777,7 +896,7 @@ SD_IO: OR A ; SET FLAGS RET Z ; ZERO SECTOR I/O, RETURN W/ E=0 & A=0 ; -#IF ((SDMODE == SDMODE_CSIO) | (SDMODE == SDMODE_MK4) | (SDMODE == SDMODE_SC)) +#IF ((SDMODE == SDMODE_CSIO) | (SDMODE == SDMODE_MK4) | (SDMODE == SDMODE_SC) | (SDMODE == SDMODE_EPITX)) ; CONSIDER CAPTURING CURRENT CNTR VALUE HERE AND USE IT ; IN SD_CSIO_DEF @@ -862,7 +981,7 @@ SD_RESET: SD_DEVICE: LD D,DIODEV_SD ; D := DEVICE TYPE LD E,(IY+SD_DEV) ; E := PHYSICAL DEVICE NUMBER - LD C,%01010000 ; C := ATTRIBUTES, REMOVABLE, SD CARD + LD C,%00110010 ; C := ATTRIBUTES, REMOVABLE, SD CARD LD H,SDMODE ; H := MODE LD L,(SD_IOBASE) ; L := BASE I/O ADDRESS XOR A ; SIGNAL SUCCESS @@ -956,7 +1075,7 @@ SD_INITCARD: CALL SD_CHKCD ; CHECK CARD DETECT JP Z,SD_NOMEDIA ; Z=NO MEDIA, HANDLE IF SO ; -#IF ((SDMODE == SDMODE_CSIO) | (SDMODE == SDMODE_MK4) | (SDMODE == SDMODE_SC)) +#IF ((SDMODE == SDMODE_CSIO) | (SDMODE == SDMODE_MK4) | (SDMODE == SDMODE_SC) | (SDMODE == SDMODE_EPITX)) CALL SD_CSIO_DEF ; ENSURE CSIO AT DEFAULT SPEED #ENDIF ; @@ -970,7 +1089,7 @@ SD_INITCARD1: DJNZ SD_INITCARD1 ; LOOP AS NEEDED ; ; MAKE SURE WE FINISH SENDING -#IF ((SDMODE == SDMODE_CSIO) | (SDMODE == SDMODE_MK4) | (SDMODE == SDMODE_SC)) +#IF ((SDMODE == SDMODE_CSIO) | (SDMODE == SDMODE_MK4) | (SDMODE == SDMODE_SC) | (SDMODE == SDMODE_EPITX)) CALL SD_WAITTX ; WAIT FOR TE TO CLEAR CALL DLY32 ; WAIT A BIT MORE FOR FINAL BIT #ENDIF @@ -1316,7 +1435,9 @@ SD_SETADDR: LD A,SD_LBA ; OFFSET OF LBA VALUE CALL LDHLIYA ; HL := IY + A, REG A TRASHED #IF (DSKYENABLE) + #IF (DSKYDSKACT) CALL HB_DSKACT ; SHOW ACTIVITY + #ENDIF #ENDIF CALL LD32 ; LOAD IT TO DE:HL, AF IS TRASHED POP AF ; GET CARD TYPE BACK @@ -1498,11 +1619,6 @@ SD_EXECCMD3: #IF (SDTRACE >= 3) CALL SD_PRTRC ; IF MAX TRACING, PRINT RC #ENDIF -;;#IF (DSKYENABLE) -;; PUSH AF -;; CALL SD_DSKY ; IF USING DSKY, SHOW IT THERE -;; POP AF -;;#ENDIF AND ~$01 ; MASK OFF IDLE BIT AND SET FLAGS RET Z ; IF RC = 0, NO ERROR, RETURN CALL SD_DONE ; IF ERROR, COMPLETE TRANSACTION @@ -1709,7 +1825,7 @@ SD_SETUP: OUT (SD_PPIX),A #ENDIF ; -#IF ((SDMODE == SDMODE_CSIO) | (SDMODE == SDMODE_MK4) | (SDMODE == SDMODE_SC)) +#IF ((SDMODE == SDMODE_CSIO) | (SDMODE == SDMODE_MK4) | (SDMODE == SDMODE_SC) | (SDMODE == SDMODE_EPITX)) ; CSIO SETUP FOR Z180 CSIO ; LD A,2 ; DIV 80, 225KHZ @ 18MHZ CLK LD A,6 ; DIV 1280, 14KHZ @ 18MHZ CLK @@ -1722,7 +1838,7 @@ SD_SETUP: OUT (SD_OPRREG),A #ENDIF ; -#IF ((SDMODE == SDMODE_MK4) | (SDMODE == SDMODE_DSD) | (SDMODE == SDMODE_PPI) | (SDMODE == SDMODE_MT)) +#IF ((SDMODE == SDMODE_MK4) | (SDMODE == SDMODE_DSD) | (SDMODE == SDMODE_PPI) | (SDMODE == SDMODE_MT) | (SDMODE == SDMODE_EPITX)) LD A,SD_OPRDEF LD (SD_OPRVAL),A OUT (SD_OPRREG),A @@ -1736,6 +1852,18 @@ SD_SETUP: OUT (SD_OPRREG),A ; OPRREG == SIO_MCR #ENDIF ; +#IF (SDMODE == SDMODE_PIO) + LD A,SD_OPRDEF ; All output bits high + LD (SD_OPRVAL),A ; WBW + OUT (SD_OPRREG),A + LD A,$CF ; Port B mode 3 + OUT (SD_DDR),A + LD A,SD_DDRVAL ; Set the direction bits + OUT (SD_DDR),A + LD A,$07 ; No interrupts + OUT (SD_DDR),A +#ENDIF +; #IF (SDMODE == SDMODE_USR) #IF (SD_CINIT == TRUE) LD A,(SD_OPRMSK) ; GET OUTPUT PORT MASK @@ -1815,10 +1943,16 @@ SD_SELECT1: #IF (SD_DEVCNT > 1) OR SD_CS1 #ENDIF +#ELSE +#IF (SDMODE == SDMODE_EPITX) + LD A,(SD_OPRVAL) + AND $F8 + OR SD_CS0 ; WILL DO 1-7 LATER #ELSE LD A,(SD_OPRVAL) ; GET CURRENT OPRVAL BACK OR SD_CS0 #ENDIF +#ENDIF ; SD_SELECT2: ; ADJUST BIT(S) FOR INTERFACES USING INVERTED CS BITS @@ -1842,7 +1976,7 @@ SD_SELECT2: ; DESELECT CARD ; SD_DESELECT: -#IF ((SDMODE == SDMODE_CSIO) | (SDMODE == SDMODE_MK4) | (SDMODE == SDMODE_SC)) +#IF ((SDMODE == SDMODE_CSIO) | (SDMODE == SDMODE_MK4) | (SDMODE == SDMODE_SC) | (SDMODE == SDMODE_EPITX)) ; DON'T REMOVE CS UNTIL WE ARE DONE SENDING! CALL SD_WAITTX ; WAIT FOR TE TO CLEAR ; @@ -1859,11 +1993,15 @@ SD_DESELECT: LD A,(SD_OPRVAL) #IF (((SDMODE == SDMODE_SC) | (SDMODE_MT)) & (SD_DEVCNT > 1)) AND ~(SD_CS0 | SD_CS1) +#ELSE +#if (SDMODE == SDMODE_EPITX) + OR 7 ; CHAN 7 IS USED FOR DESELECTS #ELSE AND ~SD_CS0 #ENDIF +#ENDIF ; ADJUST BIT(S) FOR INTERFACES USING INVERTED CS BITS -#IF ((SDMODE == SDMODE_PPI) | (SDMODE == SDMODE_UART) | (SDMODE == SDMODE_SC)) +#IF ((SDMODE == SDMODE_PPI) | (SDMODE == SDMODE_UART) | (SDMODE == SDMODE_SC) | (SDMODE == SDMODE_PIO) | (SDMODE == SDMODE_Z80R)) #IF ((SDMODE == SDMODE_SC) & (SD_DEVCNT > 1)) XOR SD_CS0 | SD_CS1 #ELSE @@ -1874,9 +2012,9 @@ SD_DESELECT: OUT (SD_OPRREG),A RET ; -#IF ((SDMODE == SDMODE_CSIO) | (SDMODE == SDMODE_MK4) | (SDMODE == SDMODE_SC)) +#IF ((SDMODE == SDMODE_CSIO) | (SDMODE == SDMODE_MK4) | (SDMODE == SDMODE_SC) | (SDMODE == SDMODE_EPITX)) ; -; CSIO WAIT FOR TRANSMIT READY (TX REGSITER EMPTY) +; CSIO WAIT FOR TRANSMIT READY (TX REGISTER EMPTY) ; SD_WAITTX: IN0 A,(SD_CNTR) ; GET CSIO STATUS @@ -1902,7 +2040,7 @@ SD_PUT: OUT (SD_WRTR),A #ELSE ; - #IF ((SDMODE == SDMODE_CSIO) | (SDMODE == SDMODE_MK4) | (SDMODE == SDMODE_SC)) + #IF ((SDMODE == SDMODE_CSIO) | (SDMODE == SDMODE_MK4) | (SDMODE == SDMODE_SC) | (SDMODE == SDMODE_EPITX)) CALL MIRROR ; MSB<-->LSB MIRROR BITS, RESULT IN C CALL SD_WAITTX ; MAKE SURE WE ARE DONE SENDING OUT0 (SD_TRDR),C ; PUT BYTE IN BUFFER @@ -1910,9 +2048,48 @@ SD_PUT: SET 4,A ; SET TRANSMIT ENABLE OUT0 (SD_CNTR),A #ELSE - #IF (SDMODE == SDMODE_UART) + + #IF (SDMODE == SDMODE_Z80R) + ; USE C - THE CALLING CODE FOR COMMAND SEND FAILS TO SAVE HL/DE + ; WHILST THE OTHER PATHS DO ? + LD C,A + RL C + RLA + OUT (SD_IOREG),A + OUT (SD_IOCLK),A + RL C + RLA + OUT (SD_IOREG),A + OUT (SD_IOCLK),A + RL C + RLA + OUT (SD_IOREG),A + OUT (SD_IOCLK),A + RL C + RLA + OUT (SD_IOREG),A + OUT (SD_IOCLK),A + RL C + RLA + OUT (SD_IOREG),A + OUT (SD_IOCLK),A + RL C + RLA + OUT (SD_IOREG),A + OUT (SD_IOCLK),A + RL C + RLA + OUT (SD_IOREG),A + OUT (SD_IOCLK),A + RL C + RLA + OUT (SD_IOREG),A + OUT (SD_IOCLK),A + #ELSE + + #IF (SDMODE == SDMODE_UART) XOR $FF ; DI IS INVERTED ON UART - #ENDIF + #ENDIF LD C,A ; C=BYTE TO SEND LD B,8 ; SEND 8 BITS (LOOP 8 TIMES) LD A,(SD_OPRVAL) ; LOAD CURRENT OPR VALUE @@ -1928,6 +2105,7 @@ SD_PUT1: DJNZ SD_PUT1 ; REPEAT FOR ALL 8 BITS LD A,(SD_OPRVAL) ; LOAD CURRENT OPR VALUE OUT (SD_OPRREG),A ; LEAVE WITH CLOCK LOW + #ENDIF #ENDIF #ENDIF RET ; DONE @@ -1940,7 +2118,7 @@ SD_GET: #IF (SDMODE == SDMODE_MT) IN A,(SD_RDTR) #ELSE - #IF ((SDMODE == SDMODE_CSIO) | (SDMODE == SDMODE_MK4) | (SDMODE == SDMODE_SC)) + #IF ((SDMODE == SDMODE_CSIO) | (SDMODE == SDMODE_MK4) | (SDMODE == SDMODE_SC) | (SDMODE == SDMODE_EPITX)) CALL SD_WAITTX ; MAKE SURE WE ARE DONE SENDING IN0 A,(SD_CNTR) ; GET CSIO STATUS SET 5,A ; START RECEIVER @@ -1950,34 +2128,83 @@ SD_GET: CALL MIRROR ; MSB<-->LSB MIRROR BITS LD A,C ; KEEP RESULT #ELSE + #IF (SDMODE == SDMODE_Z80R) + ; MUST PRESERVE HL,DE + PUSH DE + LD A,1 + LD C,SD_GPIO + OUT (SD_IOREG),A + OUT (SD_IOCLK),A + IN B,(C) + RR B + RL E + OUT (SD_IOREG),A + OUT (SD_IOCLK),A + IN B,(C) + RR B + RL E + OUT (SD_IOREG),A + OUT (SD_IOCLK),A + IN B,(C) + RR B + RL E + OUT (SD_IOREG),A + OUT (SD_IOCLK),A + IN B,(C) + RR B + RL E + OUT (SD_IOREG),A + OUT (SD_IOCLK),A + IN B,(C) + RR B + RL E + OUT (SD_IOREG),A + OUT (SD_IOCLK),A + IN B,(C) + RR B + RL E + OUT (SD_IOREG),A + OUT (SD_IOCLK),A + IN B,(C) + RR B + RL E + OUT (SD_IOREG),A + OUT (SD_IOCLK),A + IN B,(C) + RR B + RL E + LD A,E + POP DE + #ELSE LD B,8 ; RECEIVE 8 BITS (LOOP 8 TIMES) LD A,(SD_OPRVAL) ; LOAD CURRENT OPR VALUE SD_GET1: XOR SD_CLK ; TOGGLE CLOCK OUT (SD_OPRREG),A ; UPDATE CLOCK IN A,(SD_INPREG) ; READ THE DATA WHILE CLOCK IS ACTIVE - #IF ((SDMODE == SDMODE_JUHA) | (SDMODE == SDMODE_PPI)) + #IF ((SDMODE == SDMODE_JUHA) | (SDMODE == SDMODE_PPI) | (SDMODE == SDMODE_PIO)) RLA ; ROTATE INP:7 INTO CF - #ENDIF - #IF (SDMODE == SDMODE_N8) + #ENDIF + #IF (SDMODE == SDMODE_N8) RLA ; ROTATE INP:6 INTO CF RLA ; " - #ENDIF - #IF (SDMODE == SDMODE_UART) + #ENDIF + #IF (SDMODE == SDMODE_UART) RLA ; ROTATE INP:5 INTO CF RLA ; " RLA ; " - #ENDIF - #IF (SDMODE == SDMODE_DSD) + #ENDIF + #IF (SDMODE == SDMODE_DSD) RRA ; ROTATE INP:0 INTO CF - #ENDIF + #ENDIF RL C ; ROTATE CF INTO C:0 LD A,(SD_OPRVAL) ; BACK TO INITIAL VALUES (TOGGLE CLOCK) OUT (SD_OPRREG),A ; DO IT DJNZ SD_GET1 ; REPEAT FOR ALL 8 BITS LD A,C ; GET BYTE RECEIVED INTO A - #IF (SDMODE == SDMODE_UART) + #IF (SDMODE == SDMODE_UART) XOR $FF ; DO IS INVERTED ON UART + #ENDIF #ENDIF #ENDIF #ENDIF @@ -1985,7 +2212,7 @@ SD_GET1: ; ; SET CSIO TO DEFAULT SPEED ; -#IF ((SDMODE == SDMODE_CSIO) | (SDMODE == SDMODE_MK4) | (SDMODE == SDMODE_SC)) +#IF ((SDMODE == SDMODE_CSIO) | (SDMODE == SDMODE_MK4) | (SDMODE == SDMODE_SC) | (SDMODE == SDMODE_EPITX)) ; SD_CSIO_DEF: ; SET CSIO FOR DEFAULT OPERATION @@ -2176,29 +2403,6 @@ SD_PRTPREFIX: CALL PC_COLON POP AF RET -;;; -;;; DISPLAY COMMAND, LOW ORDER WORD OF PARMS, AND RC -;;; -;;#IF (DSKYENABLE) -;;SD_DSKY: -;; PUSH AF -;; PUSH HL -;; LD HL,DSKY_HEXBUF -;; LD A,(SD_CMD) -;; LD (HL),A -;; INC HL -;; LD A,(SD_CMDP2) -;; LD (HL),A -;; INC HL -;; LD A,(SD_CMDP3) -;; LD (HL),A -;; INC HL -;; LD A,(SD_RC) -;; CALL DSKY_HEXOUT -;; POP HL -;; POP AF -;; RET -;;#ENDIF ; ;============================================================================= ; STRING DATA @@ -2261,7 +2465,7 @@ SD_DSKBUF .DW 0 ; ADR OF ACTIVE DISK BUFFER ; MSB<-->LSB MIRROR BITS IN A, RESULT IN C ; MIRROR: -#IF (((SDMODE == SDMODE_CSIO) | (SDMODE == SDMODE_MK4) | (SDMODE == SDMODE_SC)) & SDCSIOFAST) +#IF (((SDMODE == SDMODE_CSIO) | (SDMODE == SDMODE_MK4) | (SDMODE == SDMODE_SC) | (SDMODE == SDMODE_EPITX)) & SDCSIOFAST) ; FASTEST BUT USES MOST CODE SPACE LD BC,MIRTAB ; 256 BYTE MIRROR TABLE ADD A,C ; ADD OFFSET @@ -2294,7 +2498,7 @@ MIRROR2: ; ; LOOKUP TABLE TO MIRROR BITS IN A BYTE ; -#IF (((SDMODE == SDMODE_CSIO) | (SDMODE == SDMODE_MK4) | (SDMODE == SDMODE_SC)) & SDCSIOFAST) +#IF (((SDMODE == SDMODE_CSIO) | (SDMODE == SDMODE_MK4) | (SDMODE == SDMODE_SC) | (SDMODE == SDMODE_EPITX)) & SDCSIOFAST) MIRTAB .DB 00H, 80H, 40H, 0C0H, 20H, 0A0H, 60H, 0E0H, 10H, 90H, 50H, 0D0H, 30H, 0B0H, 70H, 0F0H .DB 08H, 88H, 48H, 0C8H, 28H, 0A8H, 68H, 0E8H, 18H, 98H, 58H, 0D8H, 38H, 0B8H, 78H, 0F8H diff --git a/Source/HBIOS/simrtc.asm b/Source/HBIOS/simrtc.asm index 521b806d..69943d35 100644 --- a/Source/HBIOS/simrtc.asm +++ b/Source/HBIOS/simrtc.asm @@ -7,6 +7,10 @@ SIMRTC_IO .EQU $FE ; SIMH IO PORT SIMRTC_CLKREAD .EQU 7 ; READ CLOCK COMMAND SIMRTC_CLKWRITE .EQU 8 ; WRITE CLOCK COMMAND SIMRTC_BUFSIZ .EQU 6 ; SIX BYTE BUFFER (YYMMDDHHMMSS) +; + .ECHO "SIMRTC: IO=" + .ECHO SIMRTC_IO + .ECHO "\n" ; ; RTC DEVICE INITIALIZATION ENTRY ; diff --git a/Source/HBIOS/sio.asm b/Source/HBIOS/sio.asm index 4342d9f2..3cf5a52b 100644 --- a/Source/HBIOS/sio.asm +++ b/Source/HBIOS/sio.asm @@ -60,13 +60,20 @@ SIO0B_CMD .EQU SIO0BASE + $03 SIO0B_DAT .EQU SIO0BASE + $01 #ENDIF ; -#IF (SIO0MODE == SIOMODE_ZP) +#IF (SIO0MODE == SIOMODE_ZP) SIO0A_CMD .EQU SIO0BASE + $06 SIO0A_DAT .EQU SIO0BASE + $04 SIO0B_CMD .EQU SIO0BASE + $07 SIO0B_DAT .EQU SIO0BASE + $05 #ENDIF ; +#IF (SIO0MODE == SIOMODE_Z80R) +SIO0A_CMD .EQU SIO0BASE + $03 +SIO0A_DAT .EQU SIO0BASE + $01 +SIO0B_CMD .EQU SIO0BASE + $02 +SIO0B_DAT .EQU SIO0BASE + $00 +#ENDIF +; #IF (SIOCNT >= 2) ; #IF (SIO1MODE == SIOMODE_STD) @@ -96,6 +103,13 @@ SIO1A_DAT .EQU SIO1BASE + $04 SIO1B_CMD .EQU SIO1BASE + $07 SIO1B_DAT .EQU SIO1BASE + $05 #ENDIF +; + #IF (SIO1MODE == SIOMODE_Z80R) +SIO1A_CMD .EQU SIO1BASE + $03 +SIO1A_DAT .EQU SIO1BASE + $01 +SIO1B_CMD .EQU SIO1BASE + $02 +SIO1B_DAT .EQU SIO1BASE + $00 + #ENDIF ; #ENDIF ; @@ -785,10 +799,14 @@ SIO_INITBROK: ; ; SET RECEIVE DATA BITS WR3 ; + LD A,D ; HI WORD OF CONFIG + AND %00100000 ; BIT 5 IS AUTO-CTS + LD H,A ; SAVE IN H LD A,L ; DATA BITS AND $C0 ; CLEAR OTHER BITS - OR $21 ; CTS/DCD AUTO, RX ENABLE -; + OR $01 ; RX ENABLE + OR H ; COMBINE WITH AUTO-CTS +; LD (SIO_WR3),A ; ; SAVE CONFIG PERMANENTLY NOW @@ -1152,6 +1170,31 @@ SIO0A_CFG: .DW SIO0ACLK >> 16 ; ... DWORD VALUE .DB SIO0ACTCC ; CTC CHANNEL .DB SIO0MODE ; MODE +; + .ECHO "SIO MODE=" +#IF (SIO0MODE == SIOMODE_STD) + .ECHO "STD" +#ENDIF +#IF (SIO0MODE == SIOMODE_RC) + .ECHO "RC" +#ENDIF + +#IF (SIO0MODE == SIOMODE_SMB) + .ECHO "SMB" +#ENDIF +#IF (SIO0MODE == SIOMODE_ZP) + .ECHO "ZP" +#ENDIF +#IF (SIO0MODE == SIOMODE_Z80R) + .ECHO "Z80R" +#ENDIF + .ECHO ", IO=" + .ECHO SIO0BASE + .ECHO ", CHANNEL A" + #IF (INTMODE > 0) + .ECHO ", INTERRUPTS ENABLED" + #ENDIF + .ECHO "\n" ; SIO_CFGSIZ .EQU $ - SIO_CFG ; SIZE OF ONE CFG TABLE ENTRY ; @@ -1168,6 +1211,30 @@ SIO0B_CFG: .DW SIO0BCLK >> 16 ; ... DWORD VALUE .DB SIO0BCTCC ; CTC CHANNEL .DB SIO0MODE ; MODE +; + .ECHO "SIO MODE=" +#IF (SIO0MODE == SIOMODE_STD) + .ECHO "STD" +#ENDIF +#IF (SIO0MODE == SIOMODE_RC) + .ECHO "RC" +#ENDIF +#IF (SIO0MODE == SIOMODE_SMB) + .ECHO "SMB" +#ENDIF +#IF (SIO0MODE == SIOMODE_ZP) + .ECHO "ZP" +#ENDIF +#IF (SIO0MODE == SIOMODE_Z80R) + .ECHO "Z80R" +#ENDIF + .ECHO ", IO=" + .ECHO SIO0BASE + .ECHO ", CHANNEL B" + #IF (INTMODE > 0) + .ECHO ", INTERRUPTS ENABLED" + #ENDIF + .ECHO "\n" ; #IF (SIOCNT >= 2) ; @@ -1184,6 +1251,31 @@ SIO1A_CFG: .DW SIO1ACLK >> 16 ; ... DWORD VALUE .DB SIO1ACTCC ; CTC CHANNEL .DB SIO1MODE ; MODE +; + .ECHO "SIO MODE=" +#IF (SIO1MODE == SIOMODE_STD) + .ECHO "STD" +#ENDIF +#IF (SIO1MODE == SIOMODE_RC) + .ECHO "RC" +#ENDIF + +#IF (SIO1MODE == SIOMODE_SMB) + .ECHO "SMB" +#ENDIF +#IF (SIO1MODE == SIOMODE_ZP) + .ECHO "ZP" +#ENDIF +#IF (SIO1MODE == SIOMODE_Z80R) + .ECHO "Z80R" +#ENDIF + .ECHO ", IO=" + .ECHO SIO1BASE + .ECHO ", CHANNEL A" + #IF (INTMODE > 0) + .ECHO ", INTERRUPTS ENABLED" + #ENDIF + .ECHO "\n" ; ; SIO1 CHANNEL B SIO1B_CFG: @@ -1198,6 +1290,30 @@ SIO1B_CFG: .DW SIO1BCLK >> 16 ; ... DWORD VALUE .DB SIO1BCTCC ; CTC CHANNEL .DB SIO1MODE ; MODE +; + .ECHO "SIO MODE=" +#IF (SIO1MODE == SIOMODE_STD) + .ECHO "STD" +#ENDIF +#IF (SIO1MODE == SIOMODE_RC) + .ECHO "RC" +#ENDIF +#IF (SIO1MODE == SIOMODE_SMB) + .ECHO "SMB" +#ENDIF +#IF (SIO1MODE == SIOMODE_ZP) + .ECHO "ZP" +#ENDIF +#IF (SIO1MODE == SIOMODE_Z80R) + .ECHO "Z80R" +#ENDIF + .ECHO ", IO=" + .ECHO SIO1BASE + .ECHO ", CHANNEL B" + #IF (INTMODE > 0) + .ECHO ", INTERRUPTS ENABLED" + #ENDIF + .ECHO "\n" ; #ENDIF ; diff --git a/Source/HBIOS/sn76489.asm b/Source/HBIOS/sn76489.asm index 59570c07..ec132742 100644 --- a/Source/HBIOS/sn76489.asm +++ b/Source/HBIOS/sn76489.asm @@ -15,16 +15,29 @@ ;====================================================================== ; CONSTANTS ;====================================================================== +; + + .ECHO "SN76489 MODE=" ; #IF (SNMODE == SNMODE_VGM) SN76489_PORT_LEFT .EQU $C6 ; PORTS FOR ACCESSING THE SN76489 CHIP (LEFT) SN76489_PORT_RIGHT .EQU $C7 ; PORTS FOR ACCESSING THE SN76489 CHIP (RIGHT) + .ECHO "VGM" #ENDIF ; #IF (SNMODE == SNMODE_RC) SN76489_PORT_LEFT .EQU $FF ; PORTS FOR ACCESSING THE SN76489 CHIP (LEFT) SN76489_PORT_RIGHT .EQU $FB ; PORTS FOR ACCESSING THE SN76489 CHIP (RIGHT) + .ECHO "RC" #ENDIF +; + .ECHO ", IO_LEFT=" + .ECHO SN76489_PORT_LEFT + .ECHO ", IO_RIGHT=" + .ECHO SN76489_PORT_RIGHT + .ECHO ", CLOCK=" + .ECHO SN7CLK + .ECHO " HZ\n" ; SN7_IDAT .EQU 0 SN7_TONECNT .EQU 3 ; COUNT NUMBER OF TONE CHANNELS @@ -34,10 +47,6 @@ CHANNEL_0_SILENT .EQU $9F CHANNEL_1_SILENT .EQU $BF CHANNEL_2_SILENT .EQU $DF CHANNEL_3_SILENT .EQU $FF -; - .ECHO "SN76489 CLOCK: " - .ECHO SN7CLK - .ECHO "\n" ; #INCLUDE "audio.inc" ; diff --git a/Source/HBIOS/spk.asm b/Source/HBIOS/spk.asm index ee3b803c..780ca4b8 100644 --- a/Source/HBIOS/spk.asm +++ b/Source/HBIOS/spk.asm @@ -40,6 +40,10 @@ SP_RTCIOMSK .EQU 00000100B SP_PENDING_PERIOD .DW SP_NOTE_C8 ; PENDING PERIOD (16 BITS) SP_PENDING_VOLUME .DB $FF ; PENDING VOL (8 BITS) SP_PENDING_DURATION .DW 0 ; PENDING DURATION (16 BITS) +; + .ECHO "SPK: IO=" + .ECHO RTCIO + .ECHO "\n" ; ;====================================================================== ; DRIVER INITIALIZATION @@ -303,6 +307,14 @@ BE_AGAIN: BE_END: HB_EI POP IX +; +; Above flow flips the speaker bit an odd number of times which +; leaves the bit set to the opposite value it started at. This +; ensures that the bit is properly reset to its original value. +; + LD A,(HB_RTCVAL) ; Get the current RTC latch value + OUT (RTCIO),A ; Set it +; RET ; ALWAYS EXITS WITH SUCCESS STATUS (A=0) ; ;====================================================================== diff --git a/Source/HBIOS/std.asm b/Source/HBIOS/std.asm index a4d3729e..7c24517b 100644 --- a/Source/HBIOS/std.asm +++ b/Source/HBIOS/std.asm @@ -1,5 +1,5 @@ ; The purpose of this file is to define generic symbols and to include -; the requested build configuraton file to bring in platform specifics. +; the requested build configuration file to bring in platform specifics. ; There are several hardware platforms supported by SBC. ; 1. SBC Z80 SBC (v1 or v2) w/ ECB interface @@ -16,6 +16,12 @@ ; 12. RCZ280 Z280 CPU on RCBUS or ZZ80MB ; 13. MBC Andrew Lynch's Multi Board Computer ; 14. RPH Andrew Lynch's RHYOPHYRE Graphics Computer +; 15. Z80RETRO Peter Wilson's Z80-Retro Computer +; 16. S100 S100 Computers Z180-based System +; 17. DUO Andrew Lynch's Duodyne Computer +; 18. HEATH Les Bird's Heath Z80 Board +; 19. EPITX Alan Cox' Mini-ITX System +; 20. MON Jacques Pelletier's Monsputer ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; @@ -67,6 +73,7 @@ MM_Z280 .EQU 5 ; Z280 NATIVE MEMORY MANAGER MM_ZRC .EQU 6 ; ZRC BANK SWITCHING MM_MBC .EQU 7 ; MBC MEMORY MANAGER MM_RPH .EQU 8 ; Z180 WITH RPH EXTENSIONS +MM_MON .EQU 9 ; MONSPUTER MMU ; ; BOOT STYLE ; @@ -91,6 +98,15 @@ FDM360 .EQU 2 ; 5.25" FLOPPY, 360KB, 2 SIDES, 40 TRKS, 9 SECTORS FDM120 .EQU 3 ; 5.25" FLOPPY, 1.2MB, 2 SIDES, 80 TRKS, 15 SECTORS FDM111 .EQU 4 ; 8" FLOPPY, 1.11MB, 2 SIDES, 74 TRKS, 15 SECTORS ; +; FLOPPY DISK TYPE +; +FDT_NONE .EQU 0 ; NONE +FDT_3DD .EQU 1 ; 3.5" FLOPPY, DOUBLE DENSITY +FDT_3HD .EQU 2 ; 3.5" FLOPPY, HIGH DENSITY +FDT_5DD .EQU 3 ; 5.25" FLOPPY, DOUBLE DENSITY +FDT_5HD .EQU 4 ; 5.25" FLOPPY, HIGH DNSITY +FDT_8 .EQU 5 ; 8" FLOPPY, DOUBLE DENSITY +; ; ZILOG CTC MODE SELECTIONS ; CTCMODE_NONE .EQU 0 ; NO CTC @@ -116,6 +132,7 @@ SIOMODE_STD .EQU 1 ; STD SIO REG CFG (EZZ80, KIO) SIOMODE_RC .EQU 2 ; RCBUS SIO MODULE (SPENCER OWEN) SIOMODE_SMB .EQU 3 ; RCBUS SIO MODULE (SCOTT BAKER) SIOMODE_ZP .EQU 4 ; ECB-ZILOG PERIPHERALS BOARD +SIOMODE_Z80R .EQU 5 ; SIO A/B SWAPPED ; ; TYPE OF CONSOLE BELL TO USE ; @@ -148,7 +165,8 @@ FDMODE_RCSMC .EQU 7 ; RCBUS SMC 9266 @ $40 (SCOTT BAKER) FDMODE_RCWDC .EQU 8 ; RCBUS WDC 37C65 @ $40 (SCOTT BAKER) FDMODE_DYNO .EQU 9 ; DYNO WDC 37C65 @ $84 FDMODE_EPFDC .EQU 10 ; RCBUS ETCHED PIXELS FDC -FDMODE_MBC .EQU 11 ; MULTI-BOARD COMPUTER FDC +FDMODE_MBC .EQU 11 ; NHYODYNE (MBC) FDC +FDMODE_DUO .EQU 12 ; DUODUYNE (DUO) FDC ; ; IDE MODE SELECTIONS ; @@ -182,6 +200,9 @@ SDMODE_MK4 .EQU 7 ; MARK IV SDMODE_SC .EQU 8 ; SC (Steve Cousins) SDMODE_MT .EQU 9 ; MT (Shift register SPI WIZNET for RCBUS) SDMODE_USR .EQU 10 ; USER DEFINED (in sd.asm) (NOT COMPLETE) +SDMODE_PIO .EQU 11 ; Z80 PIO bitbang +SDMODE_Z80R .EQU 12 ; Z80 Retro +SDMODE_EPITX .EQU 13 ; Mini ITX Z180 ; ; AY SOUND CHIP MODE SELECTIONS ; @@ -229,6 +250,30 @@ GDCMODE_NONE .EQU 0 GDCMODE_ECB .EQU 1 ; ECB GDC GDCMODE_RPH .EQU 2 ; RPH GDC ; +; LPT DRIVER MODE SELECTIONS +; +LPTMODE_NONE .EQU 0 ; NONE +LPTMODE_SPP .EQU 1 ; IBM PC STANDARD PAR PORT (SPP) +LPTMODE_MG014 .EQU 2 ; RCBUS MG014 STYLE INTERFACE +; +; PPA DRIVER MODE SELECTIONS +; +PPAMODE_NONE .EQU 0 ; NONE +PPAMODE_SPP .EQU 1 ; IBM PC STANDARD PAR PORT (SPP) +PPAMODE_MG014 .EQU 2 ; RCBUS MG014 STYLE INTERFACE +; +; IMM DRIVER MODE SELECTIONS +; +IMMMODE_NONE .EQU 0 ; NONE +IMMMODE_SPP .EQU 1 ; IBM PC STANDARD PAR PORT (SPP) +IMMMODE_MG014 .EQU 2 ; RCBUS MG014 STYLE INTERFACE +; +; SYQ DRIVER MODE SELECTIONS +; +SYQMODE_NONE .EQU 0 ; NONE +SYQMODE_SPP .EQU 1 ; IBM PC STANDARD PAR PORT (SPP) +SYQMODE_MG014 .EQU 2 ; RCBUS MG014 STYLE INTERFACE +; ; GDC MONITOR SELECTIONS ; GDCMON_NONE .EQU 0 @@ -243,6 +288,14 @@ DMAMODE_Z180 .EQU 2 ; Z180 INTEGRATED DMA DMAMODE_Z280 .EQU 3 ; Z280 INTEGRATED DMA DMAMODE_RC .EQU 4 ; RCBUS Z80 DMA DMAMODE_MBC .EQU 5 ; MBC +DMAMODE_DUO .EQU 6 ; DUO +DMAMODE_VDG .EQU 7 ; VELESOFT DATAGEAR +; +; KEYBOARD MODE SELECTIONS +; +KBDMODE_NONE .EQU 0 +KBDMODE_PS2 .EQU 1 ; PS/2 KEYBOARD CONTROLLER +KBDMODE_VRC .EQU 2 ; VGARC KEYBOARD CONTROLLER ; ; SERIAL DEVICE CONFIGURATION CONSTANTS ; @@ -412,6 +465,18 @@ SPD_UNSUP .EQU 0 ; PLATFORM CAN CHANGE SPEEDS BUT IS UNSUPPORTED SPD_HIGH .EQU 1 ; PLATFORM CAN CHANGE SPEED, STARTS HIGH SPD_LOW .EQU 2 ; PLATFORM CAN CHANGE SPEED, STARTS LOW ; +; SCSI COMMAND CODES (SHOULD BE IT IT'S OWN FILE) +; +SCSI_CMD_TSTRDY .EQU $00 +SCSI_CMD_SENSE .EQU $03 +SCSI_CMD_READ .EQU $08 +SCSI_CMD_WRITE .EQU $0A +SCSI_CMD_INQ .EQU $12 +SCSI_CMD_START .EQU $1B +SCSI_CMD_RDCAP .EQU $25 +SCSI_CMD_READ10 .EQU $28 +SCSI_CMD_WRITE10 .EQU $2A +; #INCLUDE "build.inc" ; INCLUDE USER CONFIG, ADD VARIANT, TIMESTAMP, & ROMSIZE ; ; INCLUDE Z180 REGISTER DEFINITIONS @@ -447,6 +512,25 @@ CPUKHZ .SET CPUKHZ / 2 ; Z180 PHI IS ALWAYS 1/2 OSC #ENDIF ; CPUMHZ .EQU CPUKHZ / 1000 ; CPU FREQ IN MHZ +; + .ECHO "ASSUMED CPU SPEED: " + .ECHO CPUKHZ + .ECHO " KHZ\n" +; + .ECHO "INTERRUPTS: " +#IF (INTMODE == 0) + .ECHO "NONE" +#ENDIF +#IF (INTMODE == 1) + .ECHO "MODE 1" +#ENDIF +#IF (INTMODE == 2) + .ECHO "MODE 2" +#ENDIF +#IF (INTMODE == 3) + .ECHO "MODE 3" +#ENDIF + .ECHO "\n" ; ; SYSTEM PERIODIC TIMER MODE ; @@ -505,12 +589,69 @@ SYSTIM .SET TM_Z280 ; #ENDIF ; +#IF (BIOS == BIOS_WBW) + .ECHO "DEFAULT SERIAL CONFIGURATION: " + #IF ((DEFSERCFG & %1111100000000) == SER_BAUD9600 + .ECHO "9600" + #ENDIF + #IF ((DEFSERCFG & %1111100000000) == SER_BAUD38400 + .ECHO "38400" + #ENDIF + #IF ((DEFSERCFG & %1111100000000) == SER_BAUD57600 + .ECHO "57600" + #ENDIF + #IF ((DEFSERCFG & %1111100000000) == SER_BAUD115200 + .ECHO "115200" + #ENDIF + .ECHO " BAUD\n" +#ENDIF +; +; +; +#IF (BIOS == BIOS_WBW) + .ECHO "MEMORY MANAGER: " + #IF (MEMMGR == MM_SBC) + .ECHO "N8VEM (SBC)" + #ENDIF + #IF (MEMMGR == MM_Z2) + .ECHO "ZETA 2 (Z2)" + #ENDIF + #IF (MEMMGR == MM_N8) + .ECHO "N8 ONBOARD (N8)" + #ENDIF + #IF (MEMMGR == MM_Z180) + .ECHO "Z180 NATIVE (Z180)" + #ENDIF + #IF (MEMMGR == MM_Z280) + .ECHO "Z280 NATIVE (Z280)" + #ENDIF + #IF (MEMMGR == MM_ZRC) + .ECHO "ZRC ONBOARD (ZRC)" + #ENDIF + #IF (MEMMGR == MM_MBC) + .ECHO "NHYODYNE (MBC)" + #ENDIF + #IF (MEMMGR == MM_RPH) + .ECHO "RHYOPHYRE ONBOARD (RPH)" + #ENDIF + #IF (MEMMGR == MM_MON) + .ECHO "MONSPUTER ONBOARD (MON)" + #ENDIF + .ECHO "\n" +#ENDIF +; + .ECHO "ROM SIZE: " + .ECHO ROMSIZE + .ECHO " KB\n" +; + .ECHO "RAM SIZE: " + .ECHO RAMSIZE + .ECHO " KB\n" +; ; MEMORY BANK CONFIGURATION ; -WBW_ROM_R .EQU 128 ; 128K ; RESERVED ROM REQUIRED FOR ROMWBW -WBW_RAM_R .EQU 256 ; 256K ; RESERVED RAM REQUIRED FOR ROMWBW -TOT_ROM_RB .EQU (WBW_ROM_R / 32) ; TOTAL ROM BANKS RESERVED -TOT_RAM_RB .EQU (WBW_RAM_R / 32) ; TOTAL RAM BANKS RESERVED +ROMBANKS .EQU (ROMSIZE / 32) ; TOTAL ROM BANKS +RAMBANKS .EQU (RAMSIZE / 32) ; TOTAL RAM BANKS ; #IF (BIOS == BIOS_UNA) BID_ROM0 .EQU $0000 @@ -521,65 +662,88 @@ BID_RAM0 .EQU $8000 BID_ROM0 .EQU $00 BID_RAM0 .EQU $80 #ENDIF - -BID_ROMN .EQU (BID_ROM0 + ((ROMSIZE / 32) - 1)) -BID_RAMN .EQU (BID_RAM0 + ((RAMSIZE / 32) - 1)) -; -BID_RAMD0 .EQU BID_RAM0 ; FIRST RAM DRIVE BANK ^ RAM -BID_RAMDN .EQU BID_RAMN - TOT_RAM_RB ; LAST RAM DRIVE BANK | DRIVE -; ; OS BUFFERS CP/M3? -+ THESE CPM3 BNK 5 (BUF) -; ; OS BUFFERS CP/M3? | MAKE CPM3 BNK 4 (BUF) -; ; OS BUFFERS CP/M3? | UP CPM3 BNK 3 (BUF) -; ; OS BUFFERS CP/M3? | THE CPM3 BNK 2 (BUF) -BID_AUX .EQU BID_RAMN - 3 ; AUX BANK (BPBIOS, ETC.) | 256KB CPM3 BNK 1 (TPA) -BID_BIOS .EQU BID_RAMN - 2 ; BIOS BANK | RESERVED -BID_USR .EQU BID_RAMN - 1 ; USER BANK (CP/M TPA, ETC.) | RAM CPM3 BNK 0 (OS) -BID_COM .EQU BID_RAMN - 0 ; COMMON BANK, UPPER 32K -+ BANKS -BID_BOOT .EQU BID_ROM0 + 0 ; BOOT BANK -+ THESE MAKE -BID_IMG0 .EQU BID_ROM0 + 1 ; ROM LOADER AND FIRST IMAGES BANK | UP THE 128KB -BID_IMG1 .EQU BID_ROM0 + 2 ; SECOND IMAGES BANK | RESERVED -BID_IMG2 .EQU BID_ROM0 + 3 ; NETWORK BOOT -+ ROM BANKS -BID_ROMD0 .EQU BID_ROM0 + 4 ; FIRST ROM DRIVE BANK | ROM -BID_ROMDN .EQU BID_ROMN ; LAST ROM DRIVE BANK V DRIVE -; -#IF (ROMSIZE == 0) -BID_BOOT .SET BID_RAM0 ; SPECIAL CASE ROM-LESS SYSTEM +; +BID_ROMN .EQU (BID_ROM0 + ROMBANKS - 1) +BID_RAMN .EQU (BID_RAM0 + RAMBANKS - 1) +; +#IF (ROMSIZE > 0) +; +; NORMAL SYSTEM WITH ROM & RAM +; -- TYPICAL -- +BID_BOOT .EQU BID_ROM0 + 0 ; BOOT BANK 0x00 +BID_IMG0 .EQU BID_ROM0 + 1 ; ROM LOADER AND FIRST IMAGES BANK 0x01 +BID_IMG1 .EQU BID_ROM0 + 2 ; SECOND IMAGES BANK 0x02 +BID_IMG2 .EQU BID_ROM0 + 3 ; RESERVED 0x03 +BID_ROMD0 .EQU BID_ROM0 + 4 ; FIRST ROM DRIVE BANK 0x04 +BID_ROMDN .EQU BID_ROMN ; LAST ROM DRIVE BANK 0x0F +; +BID_BIOS .EQU BID_RAM0 ; HBIOS BANK 0x80 +BID_RAMD0 .EQU BID_RAM0 + 1 ; FIRST RAM DRIVE BANK 0x81 +BID_RAMDN .EQU BID_RAMN - 4 ; LAST RAM DRIVE BANK 0x8B +BID_BUF .EQU BID_RAMN - 3 ; OS BUFFERS (CP/M3) 0x8C +BID_AUX .EQU BID_RAMN - 2 ; AUX BANK (CP/M 3, BPBIOS, ETC.) 0x8D +BID_USR .EQU BID_RAMN - 1 ; USER BANK (CP/M TPA, ETC.) 0x8E +BID_COM .EQU BID_RAMN - 0 ; COMMON BANK, UPPER 32K 0x8F +; +#ELSE +; +; SPECIAL CONFIGURATION FOR A ROMLESS SYSTEM +; RAM IS POPULATED PRIOR TO ROMWBW STARTUP +; -- TYPICAL -- +BID_BOOT .EQU BID_RAM0 + 0 ; BOOT BANK 0x80 +BID_IMG0 .EQU BID_RAM0 + 1 ; ROM LOADER AND FIRST IMAGES BANK 0x81 +BID_IMG1 .EQU BID_RAM0 + 2 ; SECOND IMAGES BANK 0x82 +BID_IMG2 .EQU BID_RAM0 + 3 ; RESERVED 0x83 +BID_RAMD0 .EQU BID_RAM0 + 4 ; FIRST RAM DRIVE BANK 0x84 +BID_RAMDN .EQU BID_RAMN - 4 ; LAST RAM DRIVE BANK 0x8B +BID_BUF .EQU BID_RAMN - 3 ; OS BUFFERS (CP/M3) 0x8C +BID_AUX .EQU BID_RAMN - 2 ; AUX BANK (CP/M 3, BPBIOS, ETC.) 0x8D +BID_USR .EQU BID_RAMN - 1 ; USER BANK (CP/M TPA, ETC.) 0x8E +BID_COM .EQU BID_RAMN - 0 ; COMMON BANK, UPPER 32K 0x8F +; +BID_BIOS .EQU BID_BOOT ; HBIOS BANK 0x80 +BID_ROMD0 .EQU 0 ; NO ROM DRIVE +BID_ROMDN .EQU $FF ; NO ROM DRIVE +; #ENDIF ; #IF (BIOS == BIOS_WBW) ; #IF (!MDRAM) BID_RAMD0 .SET $FF ; RAM DRIVE DISABLED -BID_RAMDN .SET $FF ; RAM DRIVE DISABLED +BID_RAMDN .SET 0 ; RAM DRIVE DISABLED #ENDIF ; #IF (!MDROM) BID_ROMD0 .SET $FF ; ROM DRIVE DISABLED -BID_ROMDN .SET $FF ; ROM DRIVE DISABLED +BID_ROMDN .SET 0 ; ROM DRIVE DISABLED #ENDIF ; +ROMD_BNKS .EQU (BID_ROMDN - BID_ROMD0 + 1) +RAMD_BNKS .EQU (BID_RAMDN - BID_RAMD0 + 1) +; #ENDIF ; #IF FALSE - .ECHO "BID_AUX: " \ .ECHO BID_AUX \ .ECHO "\n" - .ECHO "BID_BIOS: " \ .ECHO BID_BIOS \ .ECHO "\n" - .ECHO "BID_USR: " \ .ECHO BID_USR \ .ECHO "\n" - .ECHO "BID_COM: " \ .ECHO BID_COM \ .ECHO "\n" - + .ECHO "--- RAM/ROM CAPACITY ---\n" + .ECHO "BID_ROM0: " \ .ECHO BID_ROM0 \ .ECHO "\n" + .ECHO "BID_ROMN: " \ .ECHO BID_ROMN \ .ECHO "\n" + .ECHO "BID_RAM0: " \ .ECHO BID_RAM0 \ .ECHO "\n" + .ECHO "BID_RAMN: " \ .ECHO BID_RAMN \ .ECHO "\n" + .ECHO "--- BANK LAYOUT ---\n" .ECHO "BID_BOOT: " \ .ECHO BID_BOOT \ .ECHO "\n" .ECHO "BID_IMG0: " \ .ECHO BID_IMG0 \ .ECHO "\n" .ECHO "BID_IMG1: " \ .ECHO BID_IMG1 \ .ECHO "\n" .ECHO "BID_IMG2: " \ .ECHO BID_IMG2 \ .ECHO "\n" - .ECHO "BID_ROMD0: " \ .ECHO BID_ROMD0 \ .ECHO "\n" .ECHO "BID_ROMDN: " \ .ECHO BID_ROMDN \ .ECHO "\n" + .ECHO "BID_BIOS: " \ .ECHO BID_BIOS \ .ECHO "\n" .ECHO "BID_RAMD0: " \ .ECHO BID_RAMD0 \ .ECHO "\n" .ECHO "BID_RAMDN: " \ .ECHO BID_RAMDN \ .ECHO "\n" - - .ECHO "BID_ROM0: " \ .ECHO BID_ROM0 \ .ECHO "\n" - .ECHO "BID_ROMN: " \ .ECHO BID_ROMN \ .ECHO "\n" - .ECHO "BID_RAM0: " \ .ECHO BID_RAM0 \ .ECHO "\n" - .ECHO "BID_RAMN: " \ .ECHO BID_RAMN \ .ECHO "\n" + .ECHO "BID_BUF: " \ .ECHO BID_BUF \ .ECHO "\n" + .ECHO "BID_AUX: " \ .ECHO BID_AUX \ .ECHO "\n" + .ECHO "BID_USR: " \ .ECHO BID_USR \ .ECHO "\n" + .ECHO "BID_COM: " \ .ECHO BID_COM \ .ECHO "\n" #ENDIF ; ; MEMORY LAYOUT @@ -673,12 +837,13 @@ MON_SERIAL .EQU MON_LOC + (1 * 3) ; MONITOR ENTRY (SERIAL PORT) ; ; INTERRUPT MODE 2 SLOT ASSIGNMENTS ; -#IF ((INTMODE == 2) | (INTMODE == 3)) +#IF (((CPUFAM == CPU_Z180) | (CPUFAM == CPU_Z280)) & (INTMODE > 0)) - #IF ((CPUFAM == CPU_Z180) | (CPUFAM == CPU_Z280)) +; NOTE THAT Z180 PROCESSES ALL INTERNAL INTERRUPTS JUST LIKE +; IM2 EVEN WHEN CHIP IS IN IM1 MODE. SO WE INCLUDE THE IM2 +; INTERRUPT ASSIGNMENTS FOR IM1 BELOW. ; Z180-BASED SYSTEMS - INT_INT1 .EQU 0 ; Z180 INT 1 INT_INT2 .EQU 1 ; Z180 INT 2 INT_TIM0 .EQU 2 ; Z180 TIMER 0 @@ -695,19 +860,33 @@ INT_PIO1B .EQU 12 ; ZILOG PIO 1, CHANNEL B INT_SIO0 .EQU 13 ; ZILOG SIO 0, CHANNEL A & B INT_SIO1 .EQU 14 ; ZILOG SIO 1, CHANNEL A & B - #ELSE - -; Z80-BASED SYSTEMS - +#ENDIF - #IF (PLATFORM == PLT_MBC) +#IF ((CPUFAM == CPU_Z80) & (INTMODE == 2)) + #IF (PLATFORM == PLT_MBC) +; +; MBC IM2 PINHEADER INTERRUPTS +; +;INT_IM2PH0 .EQU 0 +;INT_IM2PH1 .EQU 1 +;INT_IM2PH2 .EQU 2 +;INT_IM2PH3 .EQU 3 +;INT_IM2PH4 .EQU 4 +;INT_IM2PH5 .EQU 5 +;INT_IM2PH6 .EQU 6 +;INT_IM2PH7 .EQU 7 +; +; MBC Z80 INTERRUPTS +; ;INT_CTC0A .EQU 0 ; ZILOG CTC 0, CHANNEL A ;INT_CTC0B .EQU 1 ; ZILOG CTC 0, CHANNEL B ;INT_CTC0C .EQU 2 ; ZILOG CTC 0, CHANNEL C ;INT_CTC0D .EQU 3 ; ZILOG CTC 0, CHANNEL D -INT_UART0 .EQU 4 ; MBC UART 0 -INT_UART1 .EQU 5 ; MBC UART 1 +INT_UART0 .EQU 4 ; UART 0 +INT_UART1 .EQU 5 ; UART 1 +INT_INT6 .EQU 6 ; +INT_INT7 .EQU 7 ; INT_SIO0 .EQU 8 ; ZILOG SIO 0, CHANNEL A & B INT_SIO1 .EQU 9 ; ZILOG SIO 1, CHANNEL A & B INT_CTC0A .EQU 12 ; ZILOG CTC 0, CHANNEL A @@ -719,29 +898,62 @@ INT_CTC0D .EQU 15 ; ZILOG CTC 0, CHANNEL D ;INT_PIO1A .EQU 11 ; ZILOG PIO 1, CHANNEL A ;INT_PIO1B .EQU 12 ; ZILOG PIO 1, CHANNEL B - #ELSE + #ENDIF + + #IF (PLATFORM == PLT_DUO) +; DUO IM2 PINHEADER INTERRUPTS + +;INT_IM2PH0 .EQU 0 +;INT_IM2PH1 .EQU 1 +;INT_IM2PH2 .EQU 2 +;INT_IM2PH3 .EQU 3 +;INT_IM2PH4 .EQU 4 +;INT_IM2PH5 .EQU 5 +;INT_IM2PH6 .EQU 6 +;INT_IM2PH7 .EQU 7 +; +; DUO Z80 IM2 INTERRUPTS +; +INT_UART0 .EQU 7 ; UART 0 +INT_UART1 .EQU 6 ; UART 1 ????? INT_CTC0A .EQU 0 ; ZILOG CTC 0, CHANNEL A INT_CTC0B .EQU 1 ; ZILOG CTC 0, CHANNEL B INT_CTC0C .EQU 2 ; ZILOG CTC 0, CHANNEL C INT_CTC0D .EQU 3 ; ZILOG CTC 0, CHANNEL D -INT_UART0 .EQU 4 ; MBC UART 0 -INT_UART1 .EQU 5 ; MBC UART 1 -INT_SIO0 .EQU 7 ; ZILOG SIO 0, CHANNEL A & B +INT_SIO0 .EQU 6 ; ZILOG SIO 0, CHANNEL A & B INT_SIO1 .EQU 8 ; ZILOG SIO 1, CHANNEL A & B INT_PIO0A .EQU 9 ; ZILOG PIO 0, CHANNEL A INT_PIO0B .EQU 10 ; ZILOG PIO 0, CHANNEL B INT_PIO1A .EQU 11 ; ZILOG PIO 1, CHANNEL A INT_PIO1B .EQU 12 ; ZILOG PIO 1, CHANNEL B - #ENDIF + #ENDIF + + #IF ((PLATFORM != PLT_MBC) & (PLATFORM != PLT_DUO)) + +; GENERIC Z80 M2 INTERRUPTS + +INT_CTC0A .EQU 0 ; ZILOG CTC 0, CHANNEL A +INT_CTC0B .EQU 1 ; ZILOG CTC 0, CHANNEL B +INT_CTC0C .EQU 2 ; ZILOG CTC 0, CHANNEL C +INT_CTC0D .EQU 3 ; ZILOG CTC 0, CHANNEL D +INT_UART0 .EQU 4 ; UART 0 +INT_UART1 .EQU 5 ; UART 1 +INT_SIO0 .EQU 7 ; ZILOG SIO 0, CHANNEL A & B +INT_SIO1 .EQU 8 ; ZILOG SIO 1, CHANNEL A & B +INT_PIO0A .EQU 9 ; ZILOG PIO 0, CHANNEL A +INT_PIO0B .EQU 10 ; ZILOG PIO 0, CHANNEL B +INT_PIO1A .EQU 11 ; ZILOG PIO 1, CHANNEL A +INT_PIO1B .EQU 12 ; ZILOG PIO 1, CHANNEL B #ENDIF +#ENDIF + #DEFINE IVT(INTX) HB_IVT+(INTX * 4)+1 #DEFINE VEC(INTX) INTX*2 -#ENDIF ; ; SET DEFAULT CSIO SPEED (INTERNAL CLOCK, SLOW AS POSSIBLE) ; DIV 1280, 14KHZ @ 18MHZ CLK diff --git a/Source/HBIOS/syq.asm b/Source/HBIOS/syq.asm new file mode 100644 index 00000000..824d3bed --- /dev/null +++ b/Source/HBIOS/syq.asm @@ -0,0 +1,1488 @@ +; +;============================================================================= +; SYQ DISK DRIVER +;============================================================================= +; +; PARALLEL PORT INTERFACE FOR ATA DISK DEVICES USING A PARALLEL PORT +; ADAPTER. PRIMARILY TARGETS PARALLEL PORT SYQUEST DRIVES. +; +; INTENDED TO CO-EXIST WITH LPT DRIVER. +; +; CREATED BY WAYNE WARTHEN FOR ROMWBW HBIOS. +; MUCH OF THE CODE IS DERIVED FROM LINUX AND FUZIX (ALAN COX). +; - https://github.com/EtchedPixels/FUZIX +; - https://github.com/torvalds/linux +; +; 05/29/2023 WBW - INITIAL RELEASE +; 06/06/2023 WBW - OPTIMIZE BLOCK READ AND WRITE +; +;============================================================================= +; +; IBM PC STANDARD PARALLEL PORT (SPP): +; - NHYODYNE PRINT MODULE +; +; PORT 0 (OUTPUT): +; +; D7 D6 D5 D4 D3 D2 D1 D0 +; +-------+-------+-------+-------+-------+-------+-------+-------+ +; | PD7 | PD6 | PD5 | PD4 | PD3 | PD2 | PD1 | PD0 | +; +-------+-------+-------+-------+-------+-------+-------+-------+ +; +; PORT 1 (INPUT): +; +; D7 D6 D5 D4 D3 D2 D1 D0 +; +-------+-------+-------+-------+-------+-------+-------+-------+ +; | /BUSY | /ACK | POUT | SEL | /ERR | 0 | 0 | 0 | +; +-------+-------+-------+-------+-------+-------+-------+-------+ +; +; PORT 2 (OUTPUT): +; +; D7 D6 D5 D4 D3 D2 D1 D0 +; +-------+-------+-------+-------+-------+-------+-------+-------+ +; | STAT1 | STAT0 | ENBL | PINT | SEL | RES | LF | STB | +; +-------+-------+-------+-------+-------+-------+-------+-------+ +; +;============================================================================= +; +; MG014 STYLE INTERFACE: +; - RCBUS MG014 MODULE +; +; PORT 0 (OUTPUT): +; +; D7 D6 D5 D4 D3 D2 D1 D0 +; +-------+-------+-------+-------+-------+-------+-------+-------+ +; | PD7 | PD6 | PD5 | PD4 | PD3 | PD2 | PD1 | PD0 | +; +-------+-------+-------+-------+-------+-------+-------+-------+ +; +; PORT 1 (INPUT): +; +; D7 D6 D5 D4 D3 D2 D1 D0 +; +-------+-------+-------+-------+-------+-------+-------+-------+ +; | | | | /ERR | SEL | POUT | BUSY | /ACK | +; +-------+-------+-------+-------+-------+-------+-------+-------+ +; +; PORT 2 (OUTPUT): +; +; D7 D6 D5 D4 D3 D2 D1 D0 +; +-------+-------+-------+-------+-------+-------+-------+-------+ +; | LED | | | | /SEL | /RES | /LF | /STB | +; +-------+-------+-------+-------+-------+-------+-------+-------+ +; +;============================================================================= +; +; TODO: +; +; NOTES: +; +; - TESTED ON THE SYQUEST SPARQ ONLY. +; +; - THIS DRIVER OPERATES USES NIBBLE READ MODE. ALTHOUGH THE 8255 +; (MG014) CAN READ OR WRITE TO PORT A (DATA), IT "GLITCHES" WHEN +; THE MODE IS CHANGED CAUSING THE CONTROL LINES TO CHANGE AND +; BREAKS THE PROTOCOL. I SUSPECT THE MBC SPP CAN SUPPORT FULL BYTE +; MODE, (PS2 STYLE), BUT I HAVE NOT ATTEMPTED IT. +; +; - RELATIVE TO ABOVE, THIS BEAST IS SLOW. IN ADDITION TO THE +; NIBBLE MODE READS, THE MG014 ASSIGNS SIGNALS DIFFERENTLY THAN +; THE STANDARD IBM PARALLEL PORT WHICH NECESSITATES A BUNCH OF EXTRA +; BIT FIDDLING ON EVERY READ. +; +; - SOME OF THE DATA TRANSFERS HAVE NO BUFFER OVERRUN CHECKS. IT IS +; ASSUMED SCSI DEVICES WILL SEND/REQUEST THE EXPECTED NUMBER OF BYTES. +; +; SYQ PORT OFFSETS +; +SYQ_IODATA .EQU 0 ; PORT A, DATA, OUT +SYQ_IOSTAT .EQU 1 ; PORT B, STATUS, IN +SYQ_IOCTRL .EQU 2 ; PORT C, CTRL, OUT +SYQ_IOSETUP .EQU 3 ; PPI SETUP +; +; THIS INTERFACE TRANSLATES BETWEEN PPI AND ATA. THE ATA REGSITERS +; CAN BE ACCESSED THROUGH THE INTERFACE. THE INTERFACE ALSO HAS +; REGISTERS OF ITS OWN. +; +SYQ_REG_NAT .EQU 0 ; START OF NATIVE INTERFACE REGISTERS +SYQ_REG_PRI .EQU $18 ; START OF PRIMARY ATA REGISTERS +SYQ_REG_ALT .EQU $10 ; START OF ALTERNATE ATA REGISTERS +; +SYQ_REG_DATA .EQU SYQ_REG_PRI + $00 ; DATA /OUTPUT (R/W) +SYQ_REG_ERR .EQU SYQ_REG_PRI + $01 ; ERROR REGISTER (R) +SYQ_REG_FEAT .EQU SYQ_REG_PRI + $01 ; FEATURES REGISTER (W) +SYQ_REG_COUNT .EQU SYQ_REG_PRI + $02 ; SECTOR COUNT REGISTER (R/W) +SYQ_REG_SECT .EQU SYQ_REG_PRI + $03 ; SECTOR NUMBER REGISTER (R/W) +SYQ_REG_CYLLO .EQU SYQ_REG_PRI + $04 ; CYLINDER NUM REGISTER (LSB) (R/W) +SYQ_REG_CYLHI .EQU SYQ_REG_PRI + $05 ; CYLINDER NUM REGISTER (MSB) (R/W) +SYQ_REG_DRVHD .EQU SYQ_REG_PRI + $06 ; DRIVE/HEAD REGISTER (R/W) +SYQ_REG_LBA0 .EQU SYQ_REG_PRI + $03 ; LBA BYTE 0 (BITS 0-7) (R/W) +SYQ_REG_LBA1 .EQU SYQ_REG_PRI + $04 ; LBA BYTE 1 (BITS 8-15) (R/W) +SYQ_REG_LBA2 .EQU SYQ_REG_PRI + $05 ; LBA BYTE 2 (BITS 16-23) (R/W) +SYQ_REG_LBA3 .EQU SYQ_REG_PRI + $06 ; LBA BYTE 3 (BITS 24-27) (R/W) +SYQ_REG_STAT .EQU SYQ_REG_PRI + $07 ; STATUS REGISTER (R) +SYQ_REG_CMD .EQU SYQ_REG_PRI + $07 ; COMMAND REGISTER (EXECUTE) (W) +SYQ_REG_XAR .EQU SYQ_REG_ALT + $00 ; ECB DIDE EXTERNAL ADDRESS REGISTER (W) +SYQ_REG_ALTSTAT .EQU SYQ_REG_ALT + $06 ; ALTERNATE STATUS REGISTER (R) +SYQ_REG_CTRL .EQU SYQ_REG_ALT + $06 ; DEVICE CONTROL REGISTER (W) +SYQ_REG_DRVADR .EQU SYQ_REG_ALT + $07 ; DRIVE ADDRESS REGISTER (R) +; +; ATA COMMAND BYTES +; +SYQ_CMD_NOP .EQU $00 +SYQ_CMD_DEVRES .EQU $08 +SYQ_CMD_RECAL .EQU $10 +SYQ_CMD_READ .EQU $20 +SYQ_CMD_WRITE .EQU $30 +SYQ_CMD_DEVDIAG .EQU $90 +SYQ_CMD_IDPKTDEV .EQU $A1 +SYQ_CMD_MEDIASTATUS .EQU $DA +SYQ_CMD_IDDEV .EQU $EC +SYQ_CMD_SETFEAT .EQU $EF +; +; POST-COMMAND DATA TRANSFER OPTIONS +; +SYQ_XFR_NONE .EQU 0 ; NO DATA TRANSFER FOR CMD +SYQ_XFR_READ .EQU 1 ; CMD IS A READ OPERATION +SYQ_XFR_WRITE .EQU 2 ; CMD IS A WRITE OPERATION +; +; SYQ DEVICE STATUS +; +SYQ_STOK .EQU 0 +SYQ_STNOMEDIA .EQU -1 +SYQ_STCMDERR .EQU -2 +SYQ_STIOERR .EQU -3 +SYQ_STTO .EQU -4 +SYQ_STNOTSUP .EQU -5 +; +; SYQ DEVICE CONFIGURATION +; +SYQ_CFGSIZ .EQU 12 ; SIZE OF CFG TBL ENTRIES +; +; PER DEVICE DATA OFFSETS IN CONFIG TABLE ENTRIES +; +SYQ_DEV .EQU 0 ; OFFSET OF DEVICE NUMBER (BYTE) +SYQ_MODE .EQU 1 ; OPERATION MODE: SYQ MODE (BYTE) +SYQ_STAT .EQU 2 ; LAST STATUS (BYTE) +SYQ_IOBASE .EQU 3 ; IO BASE ADDRESS (BYTE) +SYQ_MEDCAP .EQU 4 ; MEDIA CAPACITY (DWORD) +SYQ_LBA .EQU 8 ; OFFSET OF LBA (DWORD) +; +; THE SYQ_WAITXXX FUNCTIONS ARE BUILT TO TIMEOUT AS NEEDED SO DRIVER WILL +; NOT HANG IF DEVICE IS UNRESPONSIVE. DIFFERENT TIMEOUTS ARE USED DEPENDING +; ON THE SITUATION. THE SLOW TIMEOUT IS USED TO WAIT FOR A DEVICE TO +; BECOME READY AFTER A HARD RESET (SPIN UP, ETC.). THE NORMAL TIMEOUT +; IS USED DURING NORMAL OPERATION FOR ALL I/O OPERATIONS WHICH SHOULD +; OCCUR PRETTY FAST. NOTE THAT THE ATA SPEC ALLOWS UP TO 30 SECONDS +; FOR DEVICES TO RESPOND. WE ARE USING MUCH MORE AGGRESSIVE VALUES +; BASED ON REAL WORLD EXPERIENCE. +; +SYQ_TOSLOW .EQU 120 ; SLOW TIMEOUT IS 30 SECS (30 / .25) +SYQ_TONORM .EQU 4 ; NORMAL TIMEOUT IS 1 SEC (1 / .25) +; +; MACROS +; +#DEFINE SYQ_W0(VAL) LD A,VAL \ CALL SYQ_WRITEDATA +#DEFINE SYQ_R1 CALL SYQ_READSTATUS +#DEFINE SYQ_W2(VAL) LD A,VAL \ CALL SYQ_WRITECTRL +; +#DEFINE SYQ_WR(REG,VAL) LD C,REG \ LD A,VAL \ CALL SYQ_WRITEREG +#DEFINE SYQ_RR(REG) LD C,REG \ CALL SYQ_READREG +; +; INCLUDE MG014 NIBBLE MAP FOR MG014 MODE +; +#IF (SYQMODE == SYQMODE_MG014) + #DEFINE MG014_MAP +#ENDIF +; +;============================================================================= +; INITIALIZATION ENTRY POINT +;============================================================================= +; +SYQ_INIT: + ; COMPUTE CPU SPEED COMPENSATED TIMEOUT SCALER + ; ONE INTERNAL LOOP IN WAITBSY IS 489TS. ON A 1 MHZ CPU, 1 TS + ; TAKES 1NS. SO 1/4 SECOND IS 250000 TS ON A 1 MHZ CPU. + ; SINCE 1 INTERNAL LOOP IS 489 TS, IT TAKES 250000 / 489 = 511 + ; INTERNAL LOOPS FOR 1/10 SECOND. SO, WE WANT TO USE + ; 511 * CPU MHZ FOR INTERNAL LOOP COUNT. + LD DE,511 ; LOAD SCALER FOR 1MHZ + LD A,(CB_CPUMHZ) ; LOAD CPU SPEED IN MHZ + CALL MULT8X16 ; HL := DE * A + LD (SYQ_TOSCALER),HL ; SAVE IT +; + LD IY,SYQ_CFG ; POINT TO START OF CONFIG TABLE +; +SYQ_INIT1: + LD A,(IY) ; LOAD FIRST BYTE TO CHECK FOR END + CP $FF ; CHECK FOR END OF TABLE VALUE + JR NZ,SYQ_INIT2 ; IF NOT END OF TABLE, CONTINUE + XOR A ; SIGNAL SUCCESS + RET ; AND RETURN +; +SYQ_INIT2: + CALL NEWLINE ; FORMATTING + PRTS("SYQ:$") ; DRIVER LABEL +; + PRTS(" IO=0x$") ; LABEL FOR IO ADDRESS + LD A,(IY+SYQ_IOBASE) ; GET IO BASE ADDRES + CALL PRTHEXBYTE ; DISPLAY IT +; + PRTS(" MODE=$") ; LABEL FOR MODE + LD A,(IY+SYQ_MODE) ; GET MODE BITS + LD HL,SYQ_STR_MODE_MAP + ADD A,A + CALL ADDHLA + LD E,(HL) + INC HL + LD D,(HL) + CALL WRITESTR +; + ; CHECK FOR HARDWARE PRESENCE + CALL SYQ_DETECT ; PROBE FOR INTERFACE + JR Z,SYQ_INIT4 ; IF FOUND, CONTINUE + CALL PC_SPACE ; FORMATTING + LD DE,SYQ_STR_NOHW ; NO SYQ MESSAGE + CALL WRITESTR ; DISPLAY IT + JR SYQ_INIT6 ; SKIP CFG ENTRY +; +SYQ_INIT4: + ; UPDATE DRIVER RELATIVE UNIT NUMBER IN CONFIG TABLE + LD A,(SYQ_DEVNUM) ; GET NEXT UNIT NUM TO ASSIGN + LD (IY+SYQ_DEV),A ; UPDATE IT + INC A ; BUMP TO NEXT UNIT NUM TO ASSIGN + LD (SYQ_DEVNUM),A ; SAVE IT +; + ; ADD UNIT TO GLOBAL DISK UNIT TABLE + LD BC,SYQ_FNTBL ; BC := FUNC TABLE ADR + PUSH IY ; CFG ENTRY POINTER + POP DE ; COPY TO DE + CALL DIO_ADDENT ; ADD ENTRY TO GLOBAL DISK DEV TABLE +; + CALL SYQ_RESET ; RESET/INIT THE INTERFACE +#IF (SYQTRACE <= 1) + CALL NZ,SYQ_PRTSTAT +#ENDIF + JR NZ,SYQ_INIT6 +; + ; START PRINTING DEVICE INFO + CALL SYQ_PRTPREFIX ; PRINT DEVICE PREFIX +; +SYQ_INIT5: + ; PRINT STORAGE CAPACITY (BLOCK COUNT) + PRTS(" BLOCKS=0x$") ; PRINT FIELD LABEL + LD A,SYQ_MEDCAP ; OFFSET TO CAPACITY FIELD + CALL LDHLIYA ; HL := IY + A, REG A TRASHED + CALL LD32 ; GET THE CAPACITY VALUE + CALL PRTHEX32 ; PRINT HEX VALUE +; + ; PRINT STORAGE SIZE IN MB + PRTS(" SIZE=$") ; PRINT FIELD LABEL + LD B,11 ; 11 BIT SHIFT TO CONVERT BLOCKS --> MB + CALL SRL32 ; RIGHT SHIFT + CALL PRTDEC32 ; PRINT DWORD IN DECIMAL + PRTS("MB$") ; PRINT SUFFIX +; +SYQ_INIT6: + LD DE,SYQ_CFGSIZ ; SIZE OF CFG TABLE ENTRY + ADD IY,DE ; BUMP POINTER + JP SYQ_INIT1 ; AND LOOP +; +;---------------------------------------------------------------------- +; PROBE FOR SYQ HARDWARE +;---------------------------------------------------------------------- +; +; ON RETURN, ZF SET INDICATES HARDWARE FOUND +; +SYQ_DETECT: +; +#IF (SYQTRACE >= 3) + PRTS("\r\nDETECT:$") +#ENDIF +; +#IF (SYQMODE == SYQMODE_MG014) + ; INITIALIZE 8255 + LD A,(IY+SYQ_IOBASE) ; BASE PORT + ADD A,SYQ_IOSETUP ; BUMP TO SETUP PORT + LD C,A ; MOVE TO C FOR I/O + LD A,$82 ; CONFIG A OUT, B IN, C OUT + OUT (C),A ; DO IT + CALL DELAY ; BRIEF DELAY FOR GOOD MEASURE +#ENDIF +; + ; WE USE THIS SEQUENCE TO DETECT AN ACTUAL SYQ DEVICE ON THE + ; PARALLEL PORT. THE VALUES RECORDED IN THE FINAL CALL TO + ; SYQ_DISCONNECT ARE USED TO CONFIRM DEVICE PRESENCE. + ; NO ACTUAL ATA COMMANDS ARE USED. + CALL SYQ_DISCONNECT + CALL SYQ_CONNECT + CALL SYQ_DISCONNECT +; + ; THE SYQ_SN VALUES ARE RECORDED IN THE CPP ROUTINE USED BY + ; SYQ_CONNECT/DISCONNECT. + ; EXPECTING S1=$B8, S2=$18, S3=$38 + LD A,(SYQ_S1) + CP $B8 + RET NZ + LD A,(SYQ_S2) + CP $18 + RET NZ + LD A,(SYQ_S3) + CP $38 + RET NZ +; + ; PRESENCE CHECK + CALL SYQ_CONNECT +; +#IF (SYQTRACE >= 3) + PRTS(" CHK:$") +#ENDIF +; + SYQ_WR($18+2,$AA) + SYQ_WR($18+3,$55) + SYQ_RR($18+2) +#IF (SYQTRACE >= 3) + CALL PC_SPACE + CALL PRTHEXBYTE +#ENDIF + LD H,A + SYQ_RR($18+3) +#IF (SYQTRACE >= 3) + CALL PC_SPACE + CALL PRTHEXBYTE +#ENDIF + LD L,A + CALL SYQ_DISCONNECT +; + LD A,H + CP $AA + RET NZ + LD A,L + CP $55 + RET +; +;============================================================================= +; DRIVER FUNCTION TABLE +;============================================================================= +; +SYQ_FNTBL: + .DW SYQ_STATUS + .DW SYQ_RESET + .DW SYQ_SEEK + .DW SYQ_READ + .DW SYQ_WRITE + .DW SYQ_VERIFY + .DW SYQ_FORMAT + .DW SYQ_DEVICE + .DW SYQ_MEDIA + .DW SYQ_DEFMED + .DW SYQ_CAP + .DW SYQ_GEOM +#IF (($ - SYQ_FNTBL) != (DIO_FNCNT * 2)) + .ECHO "*** INVALID SYQ FUNCTION TABLE ***\n" +#ENDIF +; +SYQ_VERIFY: +SYQ_FORMAT: +SYQ_DEFMED: + SYSCHKERR(ERR_NOTIMPL) ; NOT IMPLEMENTED + RET +; +; +; +SYQ_READ: + CALL HB_DSKREAD ; HOOK DISK READ CONTROLLER + LD B,SYQ_XFR_READ ; READ TRANSFER MODE + LD C,SYQ_CMD_READ ; READ COMMAND BYTE + JP SYQ_IO ; DO THE I/O +; +; +; +SYQ_WRITE: + CALL HB_DSKWRITE ; HOOK DISK WRITE CONTROLLER + LD B,SYQ_XFR_WRITE ; WRITE TRANSFER MODE + LD C,SYQ_CMD_WRITE ; WRITE COMMAND BYTE + JP SYQ_IO ; DO THE I/O +; +; +; +SYQ_IO: +; + PUSH BC ; SAVE MODE/COMMAND + PUSH HL ; SAVE DISK BUF PTR + CALL SYQ_CHKERR ; CHECK FOR ERR STATUS AND RESET IF SO + POP HL ; RECOVER DISK BUF PTR + POP BC ; RECOVER MODE/COMMAND + JR NZ,SYQ_IO1 ; BAIL OUT ON ERROR +; + LD A,B ; XFR MODE TO ACCUM + LD (SYQ_XFRMODE),A ; AND SAVE IT FOR CMD + LD (SYQ_DSKBUF),HL ; SAVE DISK BUFFER ADDRESS + LD A,SYQ_LBA ; LBA OFFSET IN CONFIG + CALL LDHLIYA ; POINT TO LBA DWORD +#IF (DSKYENABLE) + #IF (DSKYDSKACT) + CALL HB_DSKACT ; SHOW ACTIVITY + #ENDIF +#ENDIF + CALL LD32 ; SET DE:HL TO LBA +; + CALL SYQ_CMDSETUP ; SETUP ATA COMMAND BUF + CALL SYQ_RUNCMD ; RUN COMMAND + JR NZ,SYQ_IO1 ; IF ERR, SKIP INCREMENT +; + ; INCREMENT LBA + LD A,SYQ_LBA ; LBA OFFSET + CALL LDHLIYA ; HL := IY + A, REG A TRASHED + CALL INC32HL ; INCREMENT THE VALUE +; + ; INCREMENT DMA + LD HL,SYQ_DSKBUF+1 ; POINT TO MSB OF BUFFER ADR + INC (HL) ; BUMP DMA BY + INC (HL) ; ... 512 BYTES +; + XOR A ; SIGNAL SUCCESS +; +SYQ_IO1: + LD HL,(SYQ_DSKBUF) ; CURRENT DMA TO HL + OR A ; SET FLAGS + RET ; AND DONE +; +; +; +SYQ_STATUS: + ; RETURN UNIT STATUS + LD A,(IY+SYQ_STAT) ; GET STATUS OF SELECTED DEVICE + OR A ; SET FLAGS + RET ; AND RETURN +; +; +; +SYQ_RESET: + JP SYQ_INITDEV ; JUST (RE)INIT DEVICE +; +; +; +SYQ_DEVICE: + LD D,DIODEV_SYQ ; D := DEVICE TYPE + LD E,(IY+SYQ_DEV) ; E := PHYSICAL DEVICE NUMBER + LD C,%01111001 ; C := REMOVABLE HARD DISK + LD H,(IY+SYQ_MODE) ; H := MODE + LD L,(IY+SYQ_IOBASE) ; L := BASE I/O ADDRESS + XOR A ; SIGNAL SUCCESS + RET +; +; SYQ_GETMED +; +SYQ_MEDIA: + LD A,E ; GET FLAGS + OR A ; SET FLAGS + JR Z,SYQ_MEDIA1 ; JUST REPORT CURRENT STATUS AND MEDIA +; + CALL SYQ_RESET ; RESET INCLUDES MEDIA CHECK +; +SYQ_MEDIA1: + LD A,(IY+SYQ_STAT) ; GET STATUS + OR A ; SET FLAGS + LD D,0 ; NO MEDIA CHANGE DETECTED + LD E,MID_HD ; ASSUME WE ARE OK + RET Z ; RETURN IF GOOD INIT + LD E,MID_NONE ; SIGNAL NO MEDIA + LD A,ERR_NOMEDIA ; NO MEDIA ERROR + OR A ; SET FLAGS + RET ; AND RETURN +; +; +; +SYQ_SEEK: + BIT 7,D ; CHECK FOR LBA FLAG + CALL Z,HB_CHS2LBA ; CLEAR MEANS CHS, CONVERT TO LBA + RES 7,D ; CLEAR FLAG REGARDLESS (DOES NO HARM IF ALREADY LBA) + LD (IY+SYQ_LBA+0),L ; SAVE NEW LBA + LD (IY+SYQ_LBA+1),H ; ... + LD (IY+SYQ_LBA+2),E ; ... + LD (IY+SYQ_LBA+3),D ; ... + XOR A ; SIGNAL SUCCESS + RET ; AND RETURN +; +; +; +SYQ_CAP: + LD A,(IY+SYQ_STAT) ; GET STATUS + PUSH AF ; SAVE IT + LD A,SYQ_MEDCAP ; OFFSET TO CAPACITY FIELD + CALL LDHLIYA ; HL := IY + A, REG A TRASHED + CALL LD32 ; GET THE CURRENT CAPACITY INTO DE:HL + LD BC,512 ; 512 BYTES PER BLOCK + POP AF ; RECOVER STATUS + OR A ; SET FLAGS + RET +; +; +; +SYQ_GEOM: + ; FOR LBA, WE SIMULATE CHS ACCESS USING 16 HEADS AND 16 SECTORS + ; RETURN HS:CC -> DE:HL, SET HIGH BIT OF D TO INDICATE LBA CAPABLE + CALL SYQ_CAP ; GET TOTAL BLOCKS IN DE:HL, BLOCK SIZE TO BC + LD L,H ; DIVIDE BY 256 FOR # TRACKS + LD H,E ; ... HIGH BYTE DISCARDED, RESULT IN HL + LD D,16 | $80 ; HEADS / CYL = 16, SET LBA CAPABILITY BIT + LD E,16 ; SECTORS / TRACK = 16 + RET ; DONE, A STILL HAS SYQ_CAP STATUS +; +;============================================================================= +; FUNCTION SUPPORT ROUTINES +;============================================================================= +; +; +; +SYQ_IDENTIFY: +#IF (SYQTRACE >= 3) + CALL SYQ_PRTPREFIX + PRTS(" IDDEV$") +#ENDIF +; + LD C,SYQ_CMD_IDDEV + LD DE,0 + LD HL,0 + CALL SYQ_CMDSETUP +; + LD HL,HB_WRKBUF + LD (SYQ_DSKBUF),HL + LD A,SYQ_XFR_READ + LD (SYQ_XFRMODE),A +; + JP SYQ_RUNCMD +; +; +; +SYQ_MEDIASTATUS: +#IF (SYQTRACE >= 3) + CALL SYQ_PRTPREFIX + PRTS(" MEDIASTATUS$") +#ENDIF +; + LD C,SYQ_CMD_MEDIASTATUS + LD DE,0 + LD HL,0 + CALL SYQ_CMDSETUP +; + LD HL,0 + LD (SYQ_DSKBUF),HL + LD A,SYQ_XFR_NONE + LD (SYQ_XFRMODE),A +; + JP SYQ_RUNCMD +; +; DE:HL LBA +; C: COMMAND +; +SYQ_CMDSETUP: + XOR A + LD (SYQ_CMD_FEAT),A + INC A + LD (SYQ_CMD_COUNT),A + LD (SYQ_CMD_LBA0),HL + LD (SYQ_CMD_LBA2),DE + LD A,$E0 + LD (SYQ_CMD_DRV),A + LD A,C + LD (SYQ_CMD_OP),A + RET +; +;============================================================================= +; COMMAND PROCESSING +;============================================================================= +; +; RUN AN ATA COMMAND USING CMD BUFFER IN SYQ_CMDBUF. +; DATA TRANSFER MODE IN SYQ_XFRMODE: SYQ_XFR_[NONE|READ|WRITE] +; DATA TRANSFER BUFFER PTR IN SYQ_DSKBUF. +; +SYQ_RUNCMD: +; +#IF (SYQTRACE >= 3) + PRTS(" RUNCMD:$") +#ENDIF +; + CALL SYQ_CONNECT ; CONNECT TO DEVICE +; + LD (SYQ_CMD_STKSAV),SP ; SAVE STACK FOR ERR EXITS + LD HL,SYQ_CMD_EXIT ; SETUP NORMAL RETURN VIA + PUSH HL ; ... SYQ_CMDEXIT + CALL SYQ_WAITRDY ; WAIT FOR DRIVE READY +; + LD B,7 + LD C,SYQ_REG_PRI + 1 + LD HL,SYQ_CMDBUF + 1 +SYQ_RUNCMD1: + LD A,(HL) +#IF (SYQTRACE >= 3) + CALL PC_SPACE + CALL PRTHEXBYTE +#ENDIF + PUSH BC + CALL SYQ_WRITEREG + POP BC + INC HL + INC C + DJNZ SYQ_RUNCMD1 +; +#IF (SYQTRACE >= 3) + PRTS(" -->$") +#ENDIF +; + + LD A,SYQ_TOSLOW + LD (SYQ_TIMEOUT),A + + + LD A,(SYQ_TIMEOUT) + PUSH AF + LD A,SYQ_TOSLOW + CALL SYQ_WAITBSY ; WAIT FOR DRIVE READY (COMMAND DONE) + POP AF + LD (SYQ_TIMEOUT),A + CALL SYQ_GETRES +; + LD A,(SYQ_XFRMODE) ; DATA TRANSFER? + OR A ; SET FLAGS + JR Z,SYQ_CMD_EXIT ; IF NONE, EXIT, A IS ZERO + CP SYQ_XFR_READ ; READ? + JP Z,SYQ_GETBUF ; READ DATA TO BUFFER + CP SYQ_XFR_WRITE ; WRITE? + JP Z,SYQ_PUTBUF ; WRITE DATA FROM BUFFER + JR SYQ_CMD_CMDERR ; INVALID VALUE FOR XFR +; +SYQ_CMD_CMDERR: + LD A,SYQ_STCMDERR ; SIGNAL COMMAND ERROR + JR SYQ_CMD_EXIT ; AND EXIT +; +SYQ_CMD_IOERR: + LD A,SYQ_STIOERR ; SIGNAL IO ERROR + JR SYQ_CMD_EXIT ; AND EXIT +; +SYQ_CMD_TIMEOUT: + LD A,SYQ_STTO ; SIGNAL TIMEOUT ERROR + JR SYQ_CMD_EXIT ; AND EXIT +; +SYQ_CMD_EXIT: + LD SP,(SYQ_CMD_STKSAV) ; UNWIND STACK + PUSH AF ; SAVE RESULT + CALL SYQ_DISCONNECT ; DISCONNECT + POP AF ; RESTORE RESULT + OR A ; ERROR? + JP NZ,SYQ_ERR ; IF SO, HANDLE IT + RET ; NORMAL RETURN +; +; +; +SYQ_GETRES: + SYQ_RR(SYQ_REG_STAT) +#IF (SYQTRACE >= 3) + CALL PC_SPACE + CALL PRTHEXBYTE +#ENDIF + AND %00000001 ; ERROR BIT SET? + RET Z ; NOPE, RETURN WITH ZF +; + SYQ_RR(SYQ_REG_ERR) +#IF (SYQTRACE >= 3) + CALL PC_SPACE + CALL PRTHEXBYTE +#ENDIF + JP SYQ_CMD_CMDERR +; +; +; +SYQ_GETBUF: + SYQ_W0(7) + SYQ_W2(1) + SYQ_W2(3) + SYQ_W0($FF) + + LD B,0 ; LOOP COUNTER + LD DE,(SYQ_DSKBUF) ; INIT BUFFER PTR + EXX ; SWITCH TO ALT REGS + EX AF,AF' ; SWITCH TO ALT AF + ; SAVE ALT REGS + PUSH AF + PUSH BC + PUSH DE + PUSH HL + ; C: PORT C + LD A,(IY+SYQ_IOBASE) ; BASE PORT + INC A ; STATUS PORT + LD (SYQ_GETBUF_A),A ; FILL IN + LD (SYQ_GETBUF_B),A ; ... DYNAMIC BITS OF CODE + LD (SYQ_GETBUF_C),A ; + LD (SYQ_GETBUF_D),A ; + INC A ; CONTROL PORT + LD C,A ; ... TO C +#IF (SYQMODE == SYQMODE_MG014) + ; HL: STATMAP + LD H,MG014_STATMAPLO >> 8 +#ENDIF + EXX ; SWITCH TO PRI REGS + EX AF,AF' ; SWITCH TO PRI AF + CALL SYQ_GETBUF1 ; 256 WORDS + ; RESTORE ALT REGS + EXX ; SWITCH TO ALT REGS + EX AF,AF' ; SWITCH TO ALT AF + POP HL + POP DE + POP BC + POP AF + EXX ; SWITCH TO PRI REGS + EX AF,AF' ; SWITCH TO PRI AF + SYQ_W0(0) + SYQ_W2(4) +; + XOR A ; SIGNAL SUCCESS + RET +; +SYQ_GETBUF1: +; + ; FIRST BYTE + EXX ; ALT REGS +; + ; DE: CLOCK VALUES FOR FIRST BYTE +#IF (SYQMODE == SYQMODE_MG014) + LD D,$06 ^ ($0B | $80) + LD E,$04 ^ ($0B | $80) +#ENDIF +#IF (SYQMODE == SYQMODE_SPP) + LD D,$06 + LD E,$04 +#ENDIF + OUT (C),D ; FIRST CLOCK + NOP ; SMALL DELAY SEEMS TO BE NEEDED +SYQ_GETBUF_A .EQU $+1 + IN A,($FF) ; GET LOW NIBBLE +#IF (SYQMODE == SYQMODE_MG014) + AND $0F ; RELEVANT BITS ONLY + ADD A,MG014_STATMAPLO & $FF ; LOW BYTE OF MAP PTR + LD L,A ; PUT IN L + LD A,(HL) ; LOOKUP LOW NIBBLE VALUE + EX AF,AF' ; ALT AF, SAVE NIBBLE +#ENDIF +#IF (SYQMODE == SYQMODE_SPP) + AND $F0 ; RELEVANT BITS ONLY + RLCA ; MOVE TO LOW NIBBLE + RLCA ; MOVE TO LOW NIBBLE + RLCA ; MOVE TO LOW NIBBLE + RLCA ; MOVE TO LOW NIBBLE + LD L,A ; SAVE NIBBLE IN L +#ENDIF + OUT (C),E ; SECOND CLOCK + NOP ; SMALL DELAY SEEMS TO BE NEEDED +SYQ_GETBUF_B .EQU $+1 + IN A,($FF) ; GET HIGH NIBBLE +#IF (SYQMODE == SYQMODE_MG014) + AND $0F ; RELEVANT BITS ONLY + ADD A,MG014_STATMAPHI & $FF ; HIGH BYTE OF MAP PTR + LD L,A ; PUT IN L + EX AF,AF' ; PRI AF, RECOVER LOW NIBBLE VALUE + OR (HL) ; COMBINE WITH HIGH NIB VALUE +#ENDIF +#IF (SYQMODE == SYQMODE_SPP) + AND $F0 ; RELEVANT BITS ONLY + OR L ; COMBINE WITH HIGH NIB VALUE +#ENDIF + EXX ; SWITCH TO PRI REGS + LD (DE),A ; SAVE BYTE + INC DE ; BUMP BUF PTR +; + ; SPECIAL HANDLING FOR LAST BYTE + LD A,B ; GET ITERATION COUNTER + DEC A ; SET ZF IF ON LAST ITERATION + JR NZ,SYQ_GETBUF2 ; IF NOT SET, SKIP OVER + LD A,$FF ; VALUE TO WRITE + CALL SYQ_WRITEDATA ; PUT VALUE ON DATA BUS +; +SYQ_GETBUF2: + ; SECOND BYTE + EXX ; ALT REGS +; + ; DE: CLOCK VALUES FOR SECOND BYTE +#IF (SYQMODE == SYQMODE_MG014) + LD D,$07 ^ ($0B | $80) + LD E,$05 ^ ($0B | $80) +#ENDIF +#IF (SYQMODE == SYQMODE_SPP) + LD D,$07 + LD E,$05 +#ENDIF + OUT (C),D ; FIRST CLOCK + NOP ; SMALL DELAY SEEMS TO BE NEEDED +SYQ_GETBUF_C .EQU $+1 + IN A,($FF) ; GET LOW NIBBLE +#IF (SYQMODE == SYQMODE_MG014) + AND $0F ; RELEVANT BITS ONLY + ADD A,MG014_STATMAPLO & $FF ; LOW BYTE OF MAP PTR + LD L,A ; PUT IN L + LD A,(HL) ; LOOKUP LOW NIBBLE VALUE + EX AF,AF' ; ALT AF, SAVE NIBBLE +#ENDIF +#IF (SYQMODE == SYQMODE_SPP) + AND $F0 ; RELEVANT BITS ONLY + RLCA ; MOVE TO LOW NIBBLE + RLCA ; MOVE TO LOW NIBBLE + RLCA ; MOVE TO LOW NIBBLE + RLCA ; MOVE TO LOW NIBBLE + LD L,A ; SAVE NIBBLE IN L +#ENDIF + OUT (C),E ; SECOND CLOCK + NOP ; SMALL DELAY SEEMS TO BE NEEDED +SYQ_GETBUF_D .EQU $+1 + IN A,($FF) ; GET HIGH NIBBLE +#IF (SYQMODE == SYQMODE_MG014) + AND $0F ; RELEVANT BITS ONLY + ADD A,MG014_STATMAPHI & $FF ; HIGH BYTE OF MAP PTR + LD L,A ; PUT IN L + EX AF,AF' ; PRI AF, RECOVER LOW NIBBLE VALUE + OR (HL) ; COMBINE WITH HIGH NIB VALUE +#ENDIF +#IF (SYQMODE == SYQMODE_SPP) + AND $F0 ; RELEVANT BITS ONLY + OR L ; COMBINE WITH HIGH NIB VALUE +#ENDIF + EXX ; SWITCH TO PRI REGS + LD (DE),A ; SAVE BYTE + INC DE ; BUMP BUF PTR +; + DJNZ SYQ_GETBUF1 ; LOOP + RET ; DONE +; +; +; +SYQ_PUTBUF: + SYQ_W0($67) + SYQ_W2(1) + SYQ_W2(5) +; + LD DE,(SYQ_DSKBUF) ; INIT BUFFER PTR + LD B,0 ; READ 256 WORDS + LD A,(IY+SYQ_IOBASE) ; GET BASE IO ADR + LD (SYQ_PUTBUF_A),A ; FILL IN + LD (SYQ_PUTBUF_B),A ; ... DYNAMIC BITS OF CODE + INC A ; STATUS PORT + INC A ; CONTROL PORT + LD C,A ; ... TO C + ; HL: CLOCK VALUES +#IF (SYQMODE == SYQMODE_MG014) + LD H,$04 ^ ($0B | $80) + LD L,$05 ^ ($0B | $80) +#ENDIF +#IF (SYQMODE == SYQMODE_SPP) + LD H,$04 + LD L,$05 +#ENDIF + CALL SYQ_PUTBUF1 ; ONE LOOP CUZ BYTE PAIRS + SYQ_W2(7) + SYQ_W2(4) +; + XOR A + RET +; +SYQ_PUTBUF1: + LD A,(DE) ; GET NEXT BYTE +SYQ_PUTBUF_A .EQU $+1 + OUT ($FF),A ; PUT ON BUS + INC DE ; INCREMENT BUF POS + OUT (C),H ; FIRST CLOCK + LD A,(DE) ; GET NEXT BYTE +SYQ_PUTBUF_B .EQU $+1 + OUT ($FF),A ; PUT ON BUS + INC DE ; INCREMENT BUF POS + OUT (C),L ; SECOND CLOCK + DJNZ SYQ_PUTBUF1 ; LOOP + RET ; DONE +; +; (RE)INITIALIZE DEVICE +; +SYQ_INITDEV: +; +#IF (SYQTRACE >= 3) + PRTS("\r\nINITDEV:$") +#ENDIF +; +#IF (SYQMODE == SYQMODE_MG014) + ; INITIALIZE 8255 + LD A,(IY+SYQ_IOBASE) ; BASE PORT + ADD A,SYQ_IOSETUP ; BUMP TO SETUP PORT + LD C,A ; MOVE TO C FOR I/O + LD A,$82 ; CONFIG A OUT, B IN, C OUT + OUT (C),A ; DO IT + CALL DELAY ; SHORT DELAY FOR BUS SETTLE +#ENDIF +; + CALL SYQ_CONNECT ; NOW CONNECT TO BUS + CALL SYQ_DISCONNECT ; DISCONNECT FIRST JUST IN CASE + CALL SYQ_CONNECT ; NOW CONNECT TO BUS +; + ; ATA SOFT RESET + LD C,SYQ_REG_CTRL + LD A,%00001010 + CALL SYQ_WRITEREG + CALL DELAY + LD C,SYQ_REG_CTRL + LD A,%00001110 + CALL SYQ_WRITEREG + CALL DELAY + LD C,SYQ_REG_CTRL + LD A,%00001010 + CALL SYQ_WRITEREG + CALL DELAY + +#IF (SYQTRACE >= 3) + ; SELECT PRIMARY IDE DRIVE + LD C,SYQ_REG_DRVHD + LD A,$A0 + CALL SYQ_WRITEREG +; + PRTS(" ATA REGS:$") + CALL SYQ_REGDUMP ; DUMP ATA PRIMARY REGISTERS +#ENDIF +; + CALL SYQ_DISCONNECT +; + ; ISSUE DEVICE IDENTIFY COMMAND TO READ AND RECORD + ; DEVICE CAPACITY. + CALL SYQ_IDENTIFY ; RUN IDENTIFY COMMAND + RET NZ ; BAIL OUT ON ERROR +; + LD DE,HB_WRKBUF ; POINT TO BUFFER +#IF (SYQTRACE >= 4) + CALL DUMP_BUFFER ; DUMP IT IF DEBUGGING +#ENDIF +; + ; GET DEVICE CAPACITY AND SAVE IT + LD A,SYQ_MEDCAP ; OFFSET TO CAPACITY FIELD + CALL LDHLIYA ; HL := IY + A, REG A TRASHED + PUSH HL ; SAVE POINTER + LD HL,HB_WRKBUF ; POINT TO BUFFER START + LD A,120 ; OFFSET OF SECTOR COUNT + CALL ADDHLA ; POINT TO ADDRESS OF SECTOR COUNT + CALL LD32 ; LOAD IT TO DE:HL + POP BC ; RECOVER POINTER TO CAPACITY ENTRY + CALL ST32 ; SAVE CAPACITY +; + ; ISSUE MEDIA STATUS A FEW TIMES TO CLEAR ANY PENDING ERRORS + ; (LIKE MEDIA CHANGE) AND DETERMINE IF MEDIA IS LOADED. IF + ; AN ERROR IS STILL OCCURRING AFTER MULTIPLE ATTEMPTS, WE + ; ASSUME MEDIA IS NOT LOADED IN DEVICE. + LD B,4 ; 4 TRIES +SYQ_INITDEV1: + PUSH BC + CALL SYQ_MEDIASTATUS + POP BC + JR Z,SYQ_INITDEV2 ; MOVE ON IF NO ERROR + DJNZ SYQ_INITDEV1 ; LOOP AS NEEDED + JP SYQ_NOMEDIA ; EXIT W/ NO MEDIA STATUS +; +SYQ_INITDEV2: +; + ; RECORD STATUS OK + XOR A ; A := 0 (STATUS = OK) + LD (IY+SYQ_STAT),A ; SAVE IT +; + RET ; RETURN, A=0, Z SET +; +;============================================================================= +; INTERFACE SUPPORT ROUTINES +;============================================================================= +; +; OUTPUT BYTE IN A TO THE DATA PORT +; +SYQ_WRITEDATA: ; 17 (CALL) + LD C,(IY+SYQ_IOBASE) ; DATA PORT IS AT IOBASE ; 19 + OUT (C),A ; WRITE THE BYTE ; 12 + ;CALL DELAY ; IS THIS NEEDED??? + RET ; DONE ; 10 +; ; --> 58 +; +; +SYQ_WRITECTRL: ; 17 (CALL) + ; IBM PC INVERTS ALL BUT C2 ON THE BUS, MG014 DOES NOT. + ; BELOW TRANSLATES FROM IBM -> MG014. IT ALSO INVERTS THE + ; MG014 LED SIMPLY TO MAKE IT EASY TO KEEP LED ON DURING + ; ALL ACTIVITY. +; +#IF (SYQMODE == SYQMODE_MG014 + XOR $0B | $80 ; HIGH BIT IS MG014 LED +#ENDIF + LD C,(IY+SYQ_IOBASE) ; GET BASE IO ADDRESS ; 19 + INC C ; BUMP TO CONTROL PORT ; 4 + INC C ; 4 + OUT (C),A ; WRITE TO CONTROL PORT ; 12 + ;CALL DELAY ; IS THIS NEEDED? + RET ; DONE ; 10 +; ; --> 49 +; READ THE PARALLEL PORT INPUT LINES (STATUS) AND MAP SIGNALS FROM +; MG014 TO IBM STANDARD. NOTE POLARITY CHANGE REQUIRED FOR BUSY. +; +; MG014 IBM PC (SPP) +; -------- -------- +; 0: /ACK 6: /ACK +; 1: BUSY 7: /BUSY +; 2: POUT 5: POUT +; 3: SEL 4: SEL +; 4: /ERR 3: /ERR +; +SYQ_READSTATUS: ; 17 (CALL) + LD C,(IY+SYQ_IOBASE) ; IOBASE TO C ; 19 + INC C ; BUMP TO STATUS PORT ; 4 + IN A,(C) ; READ IT ; 12 +; +#IF (SYQMODE == SYQMODE_MG014 +; + ; SHUFFLE BITS ON MG014 + LD C,0 ; INIT RESULT + BIT 0,A ; 0: /ACK + JR Z,SYQ_READSTATUS1 + SET 6,C ; 6: /ACK +SYQ_READSTATUS1: + BIT 1,A ; 1: BUSY + JR NZ,SYQ_READSTATUS2 ; POLARITY CHANGE! + SET 7,C ; 7: /BUSY +SYQ_READSTATUS2: + BIT 2,A ; 2: POUT + JR Z,SYQ_READSTATUS3 + SET 5,C ; 5: POUT +SYQ_READSTATUS3: + BIT 3,A ; 3: SEL + JR Z,SYQ_READSTATUS4 + SET 4,C ; 4: SEL +SYQ_READSTATUS4: + BIT 4,A ; 4: /ERR + JR Z,SYQ_READSTATUS5 + SET 3,C ; 3: /ERR +SYQ_READSTATUS5: + LD A,C ; RESULT TO A +; +#ENDIF +; + RET ; 10 +; ; --> 62 +; SIGNAL SEQUENCE TO CONNECT/DISCONNECT +; VALUE IN A IS WRITTEN TO DATA PORT DURING SEQUENCE +; +SYQ_CPP: + PUSH AF + SYQ_W2(4) + SYQ_W0($22) + SYQ_W0($AA) + SYQ_W0($55) + SYQ_W0(0) + SYQ_W0($FF) +; + CALL SYQ_READSTATUS + AND $B8 + LD (SYQ_S1),A +; + SYQ_W0($87) +; + CALL SYQ_READSTATUS + AND $B8 + LD (SYQ_S2),A +; + SYQ_W0($78) +; + CALL SYQ_READSTATUS + AND $38 + LD (SYQ_S3),A +; + POP AF + CALL SYQ_WRITEDATA + SYQ_W2(4) + SYQ_W2(5) + SYQ_W2(4) + SYQ_W0($FF) +; + ; CONNECT: S1=$B8 S2=$18 S3=$30 + ; DISCONNECT: S1=$B8 S2=$18 S3=$38 + +#IF (SYQTRACE >= 4) + PRTS(" CPP: S1=$") + LD A,(SYQ_S1) + CALL PRTHEXBYTE + PRTS(" S2=$") + LD A,(SYQ_S2) + CALL PRTHEXBYTE + PRTS(" S3=$") + LD A,(SYQ_S3) + CALL PRTHEXBYTE +#ENDIF +; + XOR A ; ASSUME SUCCESS FOR NOW + RET +; +SYQ_S1 .DB 0 +SYQ_S2 .DB 0 +SYQ_S3 .DB 0 +; +; SEQUENCE TO CONNECT TO DEVICE ON PARALLEL PORT BUS. +; +SYQ_CONNECT: +; +#IF (SYQTRACE >= 3) + PRTS(" CONNECT:$") +#ENDIF +; + LD A,$00 ; INITIALIZE THE CHIP + CALL SYQ_CPP +; + LD A,$E0 ; CONNECT TO THE CHIP + CALL SYQ_CPP +; + SYQ_W0(0) + SYQ_W2(1) + SYQ_W2(4) +; + SYQ_WR($08,$10) + SYQ_WR($0C,$14) + SYQ_WR($0A,$38) + SYQ_WR($12,$10) +; + RET +; +; SEQUENCE TO DISCONNECT FROM DEVICE ON PARALLEL PORT BUS. +; THE FINAL SYQ_WRITECTRL IS ONLY TO TURN OFF THE MG014 STATUS LED. +; +SYQ_DISCONNECT: +; +#IF (SYQTRACE >= 3) + PRTS(" DISCON:$") +#ENDIF +; + LD A,$30 ; DISCONNECT FROM THE CHIP + CALL SYQ_CPP +; + ; TURNS OFF MG014 LED + SYQ_W2($8C) +; + RET +; +; WRITE VALUE IN A TO ATA REGISTER IN C +; +SYQ_WRITEREG: + PUSH AF + LD A,$60 + ADD A,C + CALL SYQ_WRITEDATA + SYQ_W2(1) + POP AF + CALL SYQ_WRITEDATA + SYQ_W2(4) + RET +; +; READ VALUE FROM ATA REGISTER IN C +; +SYQ_READREG: ; 17 (CALL) + LD A,C ; 4 + CALL SYQ_WRITEDATA ; 58 + SYQ_W2(1) ; 49 + 7 + SYQ_W2(3) ; 49 + 7 + CALL SYQ_READSTATUS ; 62 + AND $F0 ; 7 + RRCA ; 4 + RRCA ; 4 + RRCA ; 4 + RRCA ; 4 + LD C,A ; 4 + PUSH BC ; 11 + SYQ_W2(4) ; 49 + 7 + CALL SYQ_READSTATUS ; 62 + AND $F0 ; 7 + POP BC ; 10 + OR C ; 4 + RET ; 10 +; ; --> 440 +; CHECK CURRENT DEVICE FOR ERROR STATUS AND ATTEMPT TO RECOVER +; VIA RESET IF DEVICE IS IN ERROR. +; +SYQ_CHKERR: + LD A,(IY+SYQ_STAT) ; GET STATUS + OR A ; SET FLAGS + CALL NZ,SYQ_RESET ; IF ERROR STATUS, RESET BUS + RET +; +; +; +SYQ_WAITRDY: + LD A,(SYQ_TIMEOUT) ; GET TIMEOUT IN 0.05 SECS + LD B,A ; PUT IN OUTER LOOP VAR +SYQ_WAITRDY1: + LD A,B + LD DE,(SYQ_TOSCALER) ; CPU SPPED SCALER TO INNER LOOP VAR +SYQ_WAITRDY2: + SYQ_RR(SYQ_REG_STAT) + LD C,A ; SAVE IT??? + AND %11000000 ; ISOLATE BUSY AND RDY BITS + XOR %01000000 ; WE WANT BUSY(7) TO BE 0 AND RDY(6) TO BE 1 + RET Z ; ALL SET, RETURN WITH Z SET + DEC DE + LD A,D + OR E + JR NZ,SYQ_WAITRDY2 ; INNER LOOP RETURN + DJNZ SYQ_WAITRDY1 ; OUTER LOOP RETURN + JP SYQ_CMD_TIMEOUT ; EXIT WITH RDYTO ERR +; +; +; +SYQ_WAITDRQ: + LD A,(SYQ_TIMEOUT) ; GET TIMEOUT IN 0.1 SECS + LD B,A ; PUT IN OUTER LOOP VAR +SYQ_WAITDRQ1: + LD DE,(SYQ_TOSCALER) ; CPU SPPED SCALER TO INNER LOOP VAR +SYQ_WAITDRQ2: + SYQ_RR(SYQ_REG_STAT) + LD C,A ; SAVE IT??? + AND %10001000 ; TO FILL (OR READY TO FILL) + XOR %00001000 + RET Z + DEC DE + LD A,D + OR E + JR NZ,SYQ_WAITDRQ2 + DJNZ SYQ_WAITDRQ1 + JP SYQ_CMD_TIMEOUT ; EXIT WITH BUFTO ERR +; +; +; +SYQ_WAITBSY: + LD A,(SYQ_TIMEOUT) ; GET TIMEOUT IN 0.1 SECS + LD B,A ; PUT IN OUTER LOOP VAR +SYQ_WAITBSY1: + LD DE,(SYQ_TOSCALER) ; CPU SPPED SCALER TO INNER LOOP VAR +SYQ_WAITBSY2: + SYQ_RR(SYQ_REG_STAT) ; 440 + 7 + LD C,A ; SAVE IT??? ; 4TS + AND %10000000 ; TO FILL (OR READY TO FILL) ; 7TS + RET Z ; 5TS + DEC DE ; 6TS + LD A,D ; 4TS + OR E ; 4TS + JR NZ,SYQ_WAITBSY2 ; 12TS + DJNZ SYQ_WAITBSY1 ; ----- + JP SYQ_CMD_TIMEOUT ; EXIT WITH BSYTO ERR ; 489 +; +;============================================================================= +; ERROR HANDLING AND DIAGNOSTICS +;============================================================================= +; +; ERROR HANDLERS +; +SYQ_NOMEDIA: + LD A,SYQ_STNOMEDIA + JR SYQ_ERR +; +SYQ_CMDERR: + LD A,SYQ_STCMDERR + JR SYQ_ERR +; +SYQ_IOERR: + LD A,SYQ_STIOERR + JR SYQ_ERR +; +SYQ_TO: + LD A,SYQ_STTO + JR SYQ_ERR +; +SYQ_NOTSUP: + LD A,SYQ_STNOTSUP + JR SYQ_ERR +; +SYQ_ERR: + LD (IY+SYQ_STAT),A ; SAVE NEW STATUS +; +SYQ_ERR2: +#IF (SYQTRACE >= 2) + CALL SYQ_PRTSTAT +#ENDIF + OR A ; SET FLAGS + RET +; +; +; +SYQ_PRTERR: + RET Z ; DONE IF NO ERRORS + ; FALL THRU TO SYQ_PRTSTAT +; +; PRINT FULL DEVICE STATUS LINE +; +SYQ_PRTSTAT: + PUSH AF + PUSH DE + PUSH HL + LD A,(IY+SYQ_STAT) + CALL SYQ_PRTPREFIX ; PRINT UNIT PREFIX + CALL PC_SPACE ; FORMATTING + CALL SYQ_PRTSTATSTR + POP HL + POP DE + POP AF + RET +; +; PRINT STATUS STRING +; +SYQ_PRTSTATSTR: + PUSH AF + PUSH DE + PUSH HL + LD A,(IY+SYQ_STAT) + NEG + LD HL,SYQ_STR_ST_MAP + ADD A,A + CALL ADDHLA + LD E,(HL) + INC HL + LD D,(HL) + CALL WRITESTR + POP HL + POP DE + POP AF + RET +; +; PRINT ALL REGISTERS DIRECTLY FROM DEVICE +; DEVICE MUST BE CONNECTED AND SELECTED PRIOR TO CALL +; +SYQ_REGDUMP: + PUSH AF + PUSH BC + CALL PC_SPACE + CALL PC_LBKT + LD B,8 + LD C,SYQ_REG_PRI +SYQ_REGDUMP1: + PUSH BC + CALL SYQ_READREG + POP BC + CALL PRTHEXBYTE + INC C + DEC B + CALL NZ,PC_SPACE + JR NZ,SYQ_REGDUMP1 + CALL PC_RBKT + POP BC + POP AF + RET +; +; PRINT DEVICE/UNIT PREFIX +; +SYQ_PRTPREFIX: + PUSH AF + CALL NEWLINE + PRTS("SYQ$") + LD A,(IY+SYQ_DEV) ; GET CURRENT DEVICE NUM + CALL PRTDECB + CALL PC_COLON + POP AF + RET +; +;============================================================================= +; STRING DATA +;============================================================================= +; +SYQ_STR_ST_MAP: + .DW SYQ_STR_ST_OK + .DW SYQ_STR_ST_NOMEDIA + .DW SYQ_STR_ST_CMDERR + .DW SYQ_STR_ST_IOERR + .DW SYQ_STR_ST_TO + .DW SYQ_STR_ST_NOTSUP +; +SYQ_STR_ST_OK .TEXT "OK$" +SYQ_STR_ST_NOMEDIA .TEXT "NO MEDIA$" +SYQ_STR_ST_CMDERR .TEXT "COMMAND ERROR$" +SYQ_STR_ST_IOERR .TEXT "IO ERROR$" +SYQ_STR_ST_TO .TEXT "TIMEOUT$" +SYQ_STR_ST_NOTSUP .TEXT "NOT SUPPORTED$" +SYQ_STR_ST_UNK .TEXT "UNKNOWN ERROR$" +; +SYQ_STR_MODE_MAP: + .DW SYQ_STR_MODE_NONE + .DW SYQ_STR_MODE_SPP + .DW SYQ_STR_MODE_MG014 +; +SYQ_STR_MODE_NONE .TEXT "NONE$" +SYQ_STR_MODE_SPP .TEXT "SPP$" +SYQ_STR_MODE_MG014 .TEXT "MG014$" +; +SYQ_STR_NOHW .TEXT "NOT PRESENT$" +; +;============================================================================= +; DATA STORAGE +;============================================================================= +; +SYQ_DEVNUM .DB 0 ; TEMP DEVICE NUM USED DURING INIT +SYQ_CMDSTK .DW 0 ; STACK PTR FOR CMD ABORTING +SYQ_DSKBUF .DW 0 ; WORKING DISK BUFFER POINTER +SYQ_XFRLEN .DW 0 ; WORKING TRANSFER LENGTH +SYQ_CMD .DB 0 ; CURRENT ATA COMMAND +SYQ_XFRMODE .DB 0 ; COMMAND DATA TRANSFER MODE +SYQ_CMD_STKSAV .DW 0 ; STACK FOR CMD ERROR EXIT +; +SYQ_CMDBUF: +SYQ_CMD_DATA .DB 0 +SYQ_CMD_FEAT .DB 0 +SYQ_CMD_COUNT .DB 0 +SYQ_CMD_LBA0 .DB 0 +SYQ_CMD_LBA1 .DB 0 +SYQ_CMD_LBA2 .DB 0 +SYQ_CMD_DRV .DB 0 +SYQ_CMD_OP .DB 0 +; +SYQ_TIMEOUT .DB SYQ_TONORM ; WAIT FUNCS TIMEOUT IN TENTHS OF SEC +SYQ_TOSCALER .DW CPUMHZ * 511 ; WAIT FUNCS SCALER FOR CPU SPEED +; +; SYQ DEVICE CONFIGURATION TABLE +; +SYQ_CFG: +; +#IF (SYQCNT >= 1) +; +SYQ0_CFG: ; DEVICE 0 + .DB 0 ; DRIVER DEVICE NUMBER (FILLED DYNAMICALLY) + .DB SYQMODE ; DRIVER DEVICE MODE + .DB 0 ; DEVICE STATUS + .DB SYQ0BASE ; IO BASE ADDRESS + .DW 0,0 ; DEVICE CAPACITY + .DW 0,0 ; CURRENT LBA +; + .ECHO "SYQ: MODE=" + #IF (SYQMODE == SYQMODE_SPP) + .ECHO "SPP" + #ENDIF + #IF (SYQMODE == SYQMODE_MG014) + .ECHO "MG014" + #ENDIF + .ECHO ", IO=" + .ECHO SYQ0BASE + .ECHO "\n" +#ENDIF +; +#IF (SYQCNT >= 2) +; +SYQ1_CFG: ; DEVICE 1 + .DB 0 ; DRIVER DEVICE NUMBER (FILLED DYNAMICALLY) + .DB SYQMODE ; DRIVER DEVICE MODE + .DB 0 ; DEVICE STATUS + .DB SYQ1BASE ; IO BASE ADDRESS + .DW 0,0 ; DEVICE CAPACITY + .DW 0,0 ; CURRENT LBA +; + .ECHO "SYQ: MODE=" + #IF (SYQMODE == SYQMODE_SPP) + .ECHO "SPP" + #ENDIF + #IF (SYQMODE == SYQMODE_MG014) + .ECHO "MG014" + #ENDIF + .ECHO ", IO=" + .ECHO SYQ1BASE + .ECHO "\n" +#ENDIF +; +#IF ($ - SYQ_CFG) != (SYQCNT * SYQ_CFGSIZ) + .ECHO "*** INVALID SYQ CONFIG TABLE ***\n" +#ENDIF +; + .DB $FF ; END MARKER diff --git a/Source/HBIOS/tms.asm b/Source/HBIOS/tms.asm index 2dcc6253..bf0e25da 100644 --- a/Source/HBIOS/tms.asm +++ b/Source/HBIOS/tms.asm @@ -1,9 +1,10 @@ ;====================================================================== ; TM9918 AND V9958 VDU DRIVER ; -; WRITTEN BY: DOUGLAS GOODALL -; UPDATED BY: WAYNE WARTHEN -- 4/7/2013 -; UPDATED BY: DEAN NETHERTON -- 5/26/2021 - V9958 SUPPORT +; WRITTEN BY: DOUGLAS GOODALL +; UPDATED BY: WAYNE WARTHEN -- 4/7/2013 +; UPDATED BY: DEAN NETHERTON -- 5/26/2021 - V9958 SUPPORT +; UPDATED BY: JOSE L. COLLADO -- 11/15/2023 - MEMORY MAP CHANGES ;====================================================================== ; ; TODO: @@ -15,14 +16,34 @@ ; TMS DRIVER - CONSTANTS ;====================================================================== ; - +; +; +; 40 Column Video Memory Map +; ----------------------------------- +; Start Length +; Pattern Table: $0000 $0800 Font data (8 x 256) +; Unused: $0800 $1000 +; Sprite Patterns: $1800 $0800 +; Color Table: $2000 $1800 +; Name Table: $3800 $0400 Display characters (40 x 25) +; Sprite Attributes: $3B00 $0100 +; Unused: $3C00 $0400 +; +; 80 Column Video Memory Map (MSX like) +; ------------------------------------- +; Start Length +; Pattern Table: $1000 $0800 Font data (8 x 256) +; Sprite Patterns: $???? $???? +; Color Table: $???? $???? +; Name Table: $0000 $0800 Display characters (80 x 25) +; Sprite Attributes: $???? $???? +; Unused: $???? $???? +; TMSCTRL1: .EQU 1 ; CONTROL BITS TMSINTEN: .EQU 5 ; INTERRUPT ENABLE BIT - -#IF TMSTIMENABLE - .ECHO "TMS INTERRUPTS ENABLED\n" -#ENDIF - +; + .ECHO "TMS: MODE=" +; #IF ((TMSMODE == TMSMODE_MSX) | (TMSMODE == TMSMODE_MSX9958)) TMS_DATREG .EQU $98 ; READ/WRITE DATA TMS_CMDREG .EQU $99 ; READ STATUS / WRITE REG SEL @@ -30,24 +51,33 @@ TMS_PPIA .EQU 0 ; PPI PORT A TMS_PPIB .EQU 0 ; PPI PORT B TMS_PPIC .EQU 0 ; PPI PORT C TMS_PPIX .EQU 0 ; PPI CONTROL PORT +; + #IF (TMSMODE == TMSMODE_MSX) + .ECHO "MSX" + #ENDIF + #IF (TMSMODE == TMSMODE_MSX9958) + .ECHO "MSX9958" + #ENDIF #ENDIF - -#IF (TMSMODE == TMSMODE_COLECO)) +; +#IF (TMSMODE == TMSMODE_COLECO) TMS_DATREG .EQU $BE ; READ/WRITE DATA TMS_CMDREG .EQU $BF ; READ STATUS / WRITE REG SEL TMS_PPIA .EQU 0 ; PPI PORT A TMS_PPIB .EQU 0 ; PPI PORT B TMS_PPIC .EQU 0 ; PPI PORT C TMS_PPIX .EQU 0 ; PPI CONTROL PORT + .ECHO "COLECO" #ENDIF - +; #IF (TMSMODE == TMSMODE_MSXKBD) TMS_DATREG .EQU $98 ; READ/WRITE DATA TMS_CMDREG .EQU $99 ; READ STATUS / WRITE REG SEL TMS_KBDDATA .EQU $E0 ; KBD CTLR DATA PORT TMS_KBDST .EQU $E1 ; KBD CTLR STATUS/CMD PORT + .ECHO "MSXKBD" #ENDIF - +; #IF (TMSMODE == TMSMODE_N8) TMS_DATREG .EQU $98 ; READ/WRITE DATA TMS_CMDREG .EQU $99 ; READ STATUS / WRITE REG SEL @@ -55,8 +85,9 @@ TMS_PPIA .EQU $84 ; PPI PORT A TMS_PPIB .EQU $85 ; PPI PORT B TMS_PPIC .EQU $86 ; PPI PORT C TMS_PPIX .EQU $87 ; PPI CONTROL PORT + .ECHO "N8" #ENDIF - +; #IF (TMSMODE == TMSMODE_SCG) TMS_DATREG .EQU $98 ; READ/WRITE DATA TMS_CMDREG .EQU $99 ; READ STATUS / WRITE REG SEL @@ -65,10 +96,10 @@ TMS_PPIA .EQU 0 ; PPI PORT A TMS_PPIB .EQU 0 ; PPI PORT B TMS_PPIC .EQU 0 ; PPI PORT C TMS_PPIX .EQU 0 ; PPI CONTROL PORT + .ECHO "SCG" #ENDIF ; #IF (TMSMODE == TMSMODE_MBC) - TMS_DATREG .EQU $98 ; READ/WRITE DATA TMS_CMDREG .EQU $99 ; READ STATUS / WRITE REG SEL TMS_ACR .EQU $9C ; AUX CONTROL REGISTER @@ -78,15 +109,29 @@ TMS_PPIC .EQU 0 ; PPI PORT C TMS_PPIX .EQU 0 ; PPI CONTROL PORT TMS_KBDDATA .EQU $E2 ; KBD CTLR DATA PORT TMS_KBDST .EQU $E3 ; KBD CTLR STATUS/CMD PORT + .ECHO "MBC" #ENDIF - +; + .ECHO ", IO=" + .ECHO TMS_DATREG +#IF TMSTIMENABLE + .ECHO ", INTERRUPTS ENABLED" +#ENDIF + .ECHO "\n" +; TMS_ROWS .EQU 24 - +; #IF ((TMSMODE == TMSMODE_MSX9958) | (TMSMODE == TMSMODE_MBC)) TMS_FNTVADDR .EQU $1000 ; VRAM ADDRESS OF FONT DATA +TMS_FNTSIZE .EQU 8*256 ; ### JLC Mod for JBL compatibility ### = 8x8 Font 256 Chars +TMS_CHRVADDR .EQU $0000 ; VRAM ADDRESS OF CHAR SCREEN DATA (NEW CONSTANT) = REG2 * $400 TMS_COLS .EQU 80 -#ELSE -TMS_FNTVADDR .EQU $0800 ; VRAM ADDRESS OF FONT DATA +#ELSE ; ALL OTHER MODES... +;TMS_FNTVADDR .EQU $0800 ; VRAM ADDRESS OF FONT DATA +TMS_FNTVADDR .EQU $0000 ; VRAM ADDRESS OF FONT DATA ### JLC Mod for JBL compatibility ### = REG4 * $800 +TMS_FNTSIZE .EQU 8*256 ; ### JLC Mod for JBL compatibility ### = 8x8 Font 256 Chars +; ### JLC Fix to allow Name Table Addresses other than $0000 and JBL Compatibility ### +TMS_CHRVADDR .EQU $3800 ; VRAM ADDRESS OF CHAR SCREEN DATA (NEW CONSTANT) = REG2 * $400 TMS_COLS .EQU 40 #ENDIF ; @@ -99,15 +144,16 @@ TERMENABLE .SET TRUE ; INCLUDE TERMINAL PSEUDODEVICE DRIVER ; IF YOU SEE SCREEN CORRUPTION, ADJUST THIS!!! ; #IF (CPUFAM == CPU_Z180) -; BELOW WAS TUNED FOR Z180 AT 18MHZ -#DEFINE TMS_IODELAY EX (SP),HL \ EX (SP),HL ; 38 W/S -#ELSE -; BELOW WAS TUNED FOR SBC AT 8MHZ -#IF ((TMSMODE == TMSMODE_MSX9958) | (TMSMODE == TMSMODE_MBC)) -#DEFINE TMS_IODELAY NOP \ NOP \ NOP \ NOP \ NOP \ NOP \ NOP ; V9958 NEEDS AT WORST CASE, APPROX 4us (28T) DELAY BETWEEN I/O (WHEN IN TEXT MODE) + ; BELOW WAS TUNED FOR Z180 AT 18MHZ + #DEFINE TMS_IODELAY EX (SP),HL \ EX (SP),HL ; 38 W/S + ;#DEFINE TMS_IODELAY NOP \ NOP \ NOP \ NOP \ NOP ; 20 W/S ### JLC Mod for Clock/2 (9 MHz) ### #ELSE -#DEFINE TMS_IODELAY NOP \ NOP ; 8 W/S -#ENDIF + ; BELOW WAS TUNED FOR SBC AT 8MHZ + #IF ((TMSMODE == TMSMODE_MSX9958) | (TMSMODE == TMSMODE_MBC)) + #DEFINE TMS_IODELAY NOP \ NOP \ NOP \ NOP \ NOP \ NOP \ NOP ; V9958 NEEDS AT WORST CASE, APPROX 4us (28T) DELAY BETWEEN I/O (WHEN IN TEXT MODE) + #ELSE + #DEFINE TMS_IODELAY NOP \ NOP ; 8 W/S + #ENDIF #ENDIF ; ;====================================================================== @@ -155,6 +201,9 @@ TMS_INIT: #IF (TMSMODE == TMSMODE_MSX) PRTS("MSX$") #ENDIF +#IF (TMSMODE == TMSMODE_COLECO) + PRTS("COLECO$") +#ENDIF #IF (TMSMODE == TMSMODE_MSXKBD) PRTS("RCKBD$") #ENDIF @@ -168,7 +217,7 @@ TMS_INIT: CALL TMS_PROBE ; CHECK FOR HW EXISTENCE JR Z,TMS_INIT1 ; CONTINUE IF PRESENT ; - ; HARDWARE NOT PRESENT + ; *** HARDWARE NOT PRESENT *** PRTS(" NOT PRESENT$") OR $FF ; SIGNAL FAILURE RET @@ -193,9 +242,9 @@ TMS_INIT1: CALL HB_ADDIM1 ; ADD TO IM1 CALL LIST LD A, (TMS_INITVDU_REG_1) - SET TMSINTEN, A ; SET INTERRUPT ENABLE BIT - LD (TMS_INITVDU_REG_1), A - LD C, TMSCTRL1 + SET TMSINTEN,A ; SET INTERRUPT ENABLE BIT + LD (TMS_INITVDU_REG_1),A + LD C, TMSCTRL1 CALL TMS_SET #ENDIF ; @@ -266,11 +315,11 @@ TMS_VDAINI: RET TMS_VDAQRY: - LD C,$00 ; MODE ZERO IS ALL WE KNOW - LD D,TMS_ROWS ; ROWS - LD E,TMS_COLS ; COLS - LD HL,0 ; EXTRACTION OF CURRENT BITMAP DATA NOT SUPPORTED YET - XOR A ; SIGNAL SUCCESS + LD C,$00 ; MODE ZERO IS ALL WE KNOW + LD D,TMS_ROWS ; ROWS + LD E,TMS_COLS ; COLS + LD HL,0 ; EXTRACTION OF CURRENT BITMAP DATA NOT SUPPORTED YET + XOR A ; SIGNAL SUCCESS RET TMS_VDARES: @@ -294,11 +343,11 @@ TMS_VDARES1: ; ENTRY POINT TO AVOID TMS_Z180IO RECURSION RET TMS_VDADEV: - LD D,VDADEV_TMS ; D := DEVICE TYPE - LD E,0 ; E := PHYSICAL UNIT IS ALWAYS ZERO - LD H,TMSMODE ; H := MODE - LD L,TMS_DATREG ; L := BASE I/O ADDRESS - XOR A ; SIGNAL SUCCESS + LD D,VDADEV_TMS ; D := DEVICE TYPE + LD E,0 ; E := PHYSICAL UNIT IS ALWAYS ZERO + LD H,TMSMODE ; H := MODE + LD L,TMS_DATREG ; L := BASE I/O ADDRESS + XOR A ; SIGNAL SUCCESS RET TMS_VDASCS: @@ -310,28 +359,61 @@ TMS_VDASCP: CALL TMS_Z180IO #ENDIF CALL TMS_CLRCUR - CALL TMS_XY ; SET CURSOR POSITION + CALL TMS_XY ; SET CURSOR POSITION CALL TMS_SETCUR - XOR A ; SIGNAL SUCCESS + XOR A ; SIGNAL SUCCESS RET TMS_VDASAT: - XOR A ; NOT POSSIBLE, JUST SIGNAL SUCCESS + XOR A ; NOT POSSIBLE, JUST SIGNAL SUCCESS RET TMS_VDASCO: - XOR A ; NOT POSSIBLE, JUST SIGNAL SUCCESS + ; ### JLC Mod - Implement Default Text Mode Colors via ANSI_VDASCO or direct HBIOS Call + ; + ; Color setting is in reg D in ANSI Format as described in RomWBW System Guide + ; Convert Color Format from ANSI to TMS shuffling bits arround and using + ; Color Conversion Table at TMS_COLOR_TBL (approximated equivalences) + ; Save converted value to (TMS_TMSCOLOR) + ; + ; TMS hardware only allows setting a global (screen) foreground/background color. So, we + ; only process this command if E is 1. + ; + LD A,D ; GET CHAR/SCREEN SCOPE + CP 1 ; SCREEN? + JR NZ,TMS_VDASCO_Z ; IF NOT, JUST RETURN +; + LD A,E ; GET COLOR BYTE + AND $F0 ; ISOLATE BACKGROUND + RRCA \ RRCA \ RRCA \ RRCA ; MOVE TO LOWER NIBBLE + LD HL,TMS_COLOR_TBL ; POINT TO COLOR CONVERSION TABLE + CALL ADDHLA ; OFFSET TO DESIRED COLOR + LD B,(HL) ; PUT NEW BG IN B +; + LD A,E ; GET COLOR BYTE + AND $0F ; ISOLATE FOREGROUND + LD HL,TMS_COLOR_TBL ; POINT TO COLOR CONVERSION TABLE + CALL ADDHLA ; OFFSET TO DESIRED COLOR + LD A,(HL) ; PUT NEW FG IN A + RLCA \ RLCA \ RLCA \ RLCA ; MOVE TO UPPER NIBBLE +; + OR B ; COMBINE WITH FG + LD C, 7 ; C = Color Register, A = Desired new Color in TMS Format + CALL TMS_SET ; Write to specific TMS Register, Change Default Text Color +; +TMS_VDASCO_Z: + XOR A ; SIGNAL SUCCESS RET TMS_VDAWRC: #IF (CPUFAM == CPU_Z180) CALL TMS_Z180IO #ENDIF - CALL TMS_CLRCUR ; CURSOR OFF - LD A,E ; CHARACTER TO WRITE GOES IN A - CALL TMS_PUTCHAR ; PUT IT ON THE SCREEN + CALL TMS_CLRCUR ; CURSOR OFF + LD A,E ; CHARACTER TO WRITE GOES IN A + CALL TMS_PUTCHAR ; PUT IT ON THE SCREEN CALL TMS_SETCUR - XOR A ; SIGNAL SUCCESS + XOR A ; SIGNAL SUCCESS RET TMS_VDAFIL: @@ -339,11 +421,11 @@ TMS_VDAFIL: CALL TMS_Z180IO #ENDIF CALL TMS_CLRCUR - LD A,E ; FILL CHARACTER GOES IN A - EX DE,HL ; FILL LENGTH GOES IN DE - CALL TMS_FILL ; DO THE FILL + LD A,E ; FILL CHARACTER GOES IN A + EX DE,HL ; FILL LENGTH GOES IN DE + CALL TMS_FILL ; DO THE FILL CALL TMS_SETCUR - XOR A ; SIGNAL SUCCESS + XOR A ; SIGNAL SUCCESS RET TMS_VDACPY: @@ -353,11 +435,11 @@ TMS_VDACPY: CALL TMS_CLRCUR ; LENGTH IN HL, SOURCE ROW/COL IN DE, DEST IS TMS_POS ; BLKCPY USES: HL=SOURCE, DE=DEST, BC=COUNT - PUSH HL ; SAVE LENGTH - CALL TMS_XY2IDX ; ROW/COL IN DE -> SOURCE ADR IN HL - POP BC ; RECOVER LENGTH IN BC - LD DE,(TMS_POS) ; PUT DEST IN DE - CALL TMS_BLKCPY ; DO A BLOCK COPY + PUSH HL ; SAVE LENGTH + CALL TMS_XY2IDX ; ROW/COL IN DE -> SOURCE ADR IN HL + POP BC ; RECOVER LENGTH IN BC + LD DE,(TMS_POS) ; PUT DEST IN DE + CALL TMS_BLKCPY ; DO A BLOCK COPY CALL TMS_SETCUR XOR A RET @@ -368,20 +450,20 @@ TMS_VDASCR: #ENDIF CALL TMS_CLRCUR TMS_VDASCR0: - LD A,E ; LOAD E INTO A - OR A ; SET FLAGS - JR Z,TMS_VDASCR2 ; IF ZERO, WE ARE DONE - PUSH DE ; SAVE E - JP M,TMS_VDASCR1 ; E IS NEGATIVE, REVERSE SCROLL - CALL TMS_SCROLL ; SCROLL FORWARD ONE LINE - POP DE ; RECOVER E - DEC E ; DECREMENT IT - JR TMS_VDASCR0 ; LOOP + LD A,E ; LOAD E INTO A + OR A ; SET FLAGS + JR Z,TMS_VDASCR2 ; IF ZERO, WE ARE DONE + PUSH DE ; SAVE E + JP M,TMS_VDASCR1 ; E IS NEGATIVE, REVERSE SCROLL + CALL TMS_SCROLL ; SCROLL FORWARD ONE LINE + POP DE ; RECOVER E + DEC E ; DECREMENT IT + JR TMS_VDASCR0 ; LOOP TMS_VDASCR1: - CALL TMS_RSCROLL ; SCROLL REVERSE ONE LINE - POP DE ; RECOVER E - INC E ; INCREMENT IT - JR TMS_VDASCR0 ; LOOP + CALL TMS_RSCROLL ; SCROLL REVERSE ONE LINE + POP DE ; RECOVER E + INC E ; INCREMENT IT + JR TMS_VDASCR0 ; LOOP TMS_VDASCR2: CALL TMS_SETCUR XOR A @@ -393,23 +475,23 @@ TMS_VDASCR2: ;---------------------------------------------------------------------- TMS_VDARDC: - OR $FF ; UNSUPPORTED FUNCTION + OR $FF ; UNSUPPORTED FUNCTION RET ; DUMMY FUNCTIONS BELOW BECAUSE SCG BOARD HAS NO ; KEYBOARD INTERFACE TMS_STAT: - XOR A ; SIGNAL NOTHING READY - JP CIO_IDLE ; DO IDLE PROCESSING + XOR A ; SIGNAL NOTHING READY + JP CIO_IDLE ; DO IDLE PROCESSING TMS_FLUSH: - XOR A ; SIGNAL SUCCESS + XOR A ; SIGNAL SUCCESS RET TMS_READ: - LD E,26 ; RETURN (CTRL-Z) - XOR A ; SIGNAL SUCCESS + LD E,26 ; RETURN (CTRL-Z) + XOR A ; SIGNAL SUCCESS RET ; ;====================================================================== @@ -469,7 +551,7 @@ TMS_RD: ; ON RETURN, ZF SET INDICATES HARDWARE FOUND ; TMS_PROBE: - ; SET WRITE ADDRESS TO $0 + ; SET WRITE ADDRESS TO $0000 LD HL,0 CALL TMS_WR ; WRITE TEST PATTERN TO FIRST TWO BYTES @@ -481,19 +563,18 @@ TMS_PROBE: OUT (TMS_DATREG),A ; SECOND BYTE ;TMS_IODELAY ; DELAY CALL DLY64 ; DELAY - ; SET READ ADDRESS TO $0 +; + ; SET READ ADDRESS TO $0000 LD HL,0 CALL TMS_RD ; READ TEST PATTERN LD C,$A5 ; VALUE TO EXPECT IN A,(TMS_DATREG) ; READ FIRST BYTE - ;CALL PRTHEXBYTE ;TMS_IODELAY ; DELAY CALL DLY64 ; DELAY CP C ; COMPARE RET NZ ; RETURN ON MISCOMPARE IN A,(TMS_DATREG) ; READ SECOND BYTE - ;CALL PRTHEXBYTE ;TMS_IODELAY ; DELAY CALL DLY64 ; DELAY CPL ; COMPLEMENT IT @@ -505,12 +586,12 @@ TMS_PROBE: ;---------------------------------------------------------------------- ; TMS_CRTINIT: - ; SET WRITE ADDRESS TO $0 + ; SET WRITE ADDRESS TO $0000 Beginning of VRAM LD HL,0 CALL TMS_WR ; - ; FILL ENTIRE RAM CONTENTS - LD DE,$4000 + ; FILL ENTIRE 16KB VRAM CONTENTS with $00 + LD DE,$4000 ; 16KB TMS_CRTINIT1: XOR A OUT (TMS_DATREG),A @@ -521,9 +602,9 @@ TMS_CRTINIT1: JR NZ,TMS_CRTINIT1 ; ; INITIALIZE VDU REGISTERS - LD C,0 ; START WITH REGISTER 0 + LD C,0 ; START WITH REGISTER 0 LD B,TMS_INITVDULEN ; NUMBER OF REGISTERS TO INIT - LD HL,TMS_INITVDU ; HL = POINTER TO THE DEFAULT VALUES + LD HL,TMS_INITVDU ; HL = POINTER TO THE DEFAULT VALUES TMS_CRTINIT2: LD A,(HL) ; GET VALUE CALL TMS_SET ; WRITE IT @@ -565,7 +646,7 @@ TMS_LOADFONT: #ENDIF ; ; FILL TMS_FNTVADDR BYTES FROM FONTDATA - LD DE,TMS_FNTVADDR + LD DE,TMS_FNTSIZE TMS_LOADFONT1: LD A,(HL) OUT (TMS_DATREG),A @@ -622,20 +703,20 @@ TMS_SETCUR: LD HL,0 ; ZERO HL LD L,A ; HL IS NOW RAW CHAR INDEX LD B,3 ; LEFT SHIFT BY 3 BITS -TMS_SETCUR0: ; MULT BY 8 FOR FONT INDEX +TMS_SETCUR0: ; MULT BY 8 FOR FONT INDEX SLA L ; SHIFT LSB INTO CARRY RL H ; SHFT MSB FROM CARRY DJNZ TMS_SETCUR0 ; LOOP 3 TIMES - LD DE,TMS_FNTVADDR ; OFFSET TO START OF FONT TABLE + LD DE,TMS_FNTVADDR ; OFFSET TO START OF FONT TABLE ADD HL,DE ; ADD TO FONT INDEX CALL TMS_RD ; SETUP TO READ GLYPH LD B,8 ; 8 BYTES LD HL,TMS_BUF ; INTO BUFFER -TMS_SETCUR1: ; READ GLYPH LOOP +TMS_SETCUR1: ; READ GLYPH LOOP IN A,(TMS_DATREG) ; GET NEXT BYTE TMS_IODELAY ; IO DELAY LD (HL),A ; SAVE VALUE IN BUF - INC HL ; BUMP BUF POINTER + INC HL ; BUMP BUF POINTER DJNZ TMS_SETCUR1 ; LOOP FOR 8 BYTES ; ; NOW WRITE INVERTED GLYPH INTO FONT INDEX 255 @@ -643,7 +724,7 @@ TMS_SETCUR1: ; READ GLYPH LOOP CALL TMS_WR ; SETUP TO WRITE THE INVERTED GLYPH LD B,8 ; 8 BYTES PER GLYPH LD HL,TMS_BUF ; POINT TO BUFFER -TMS_SETCUR2: ; WRITE INVERTED GLYPH LOOP +TMS_SETCUR2: ; WRITE INVERTED GLYPH LOOP LD A,(HL) ; GET THE BYTE INC HL ; BUMP THE BUF POINTER XOR $FF ; INVERT THE VALUE @@ -689,6 +770,8 @@ TMS_XY2IDX: CALL MULT8 ; MULTIPLY TO GET ROW OFFSET LD E,A ; GET COLUMN BACK ADD HL,DE ; ADD IT IN + LD DE,TMS_CHRVADDR ; Add offset Address to start of Name Table (Char) + ADD HL,DE RET ; RETURN ; ;---------------------------------------------------------------------- @@ -735,10 +818,10 @@ TMS_FILL1: ;---------------------------------------------------------------------- ; TMS_SCROLL: - LD HL,0 ; SOURCE ADDRESS OF CHARACER BUFFER + LD HL,TMS_CHRVADDR ; SOURCE ADDRESS OF CHARACTER BUFFER LD C,TMS_ROWS - 1 ; SET UP LOOP COUNTER FOR ROWS - 1 ; -TMS_SCROLL0: ; READ LINE THAT IS ONE PAST CURRENT DESTINATION +TMS_SCROLL0: ; READ LINE THAT IS ONE PAST CURRENT DESTINATION PUSH HL ; SAVE CURRENT DESTINATION LD DE,TMS_COLS ADD HL,DE ; POINT TO NEXT ROW SOURCE @@ -787,6 +870,8 @@ TMS_SCROLL3: ; TMS_RSCROLL: LD HL,TMS_COLS * (TMS_ROWS - 1) + LD DE,TMS_CHRVADDR ; Add offset Address to start of Name Table (Char) + ADD HL,DE LD C,TMS_ROWS - 1 ; TMS_RSCROLL0: ; READ THE LINE THAT IS ONE PRIOR TO CURRENT DESTINATION @@ -838,33 +923,33 @@ TMS_RSCROLL3: ; TMS_BLKCPY: ; SAVE DESTINATION AND LENGTH - PUSH BC ; LENGTH - PUSH DE ; DEST + PUSH BC ; LENGTH + PUSH DE ; DEST ; ; READ FROM THE SOURCE LOCATION TMS_BLKCPY1: - CALL TMS_RD ; SET UP TO READ FROM ADDRESS IN HL - LD DE,TMS_BUF ; POINT TO BUFFER + CALL TMS_RD ; SET UP TO READ FROM ADDRESS IN HL + LD DE,TMS_BUF ; POINT TO BUFFER LD B,C TMS_BLKCPY2: - IN A,(TMS_DATREG) ; GET THE NEXT BYTE - TMS_IODELAY ; DELAY - LD (DE),A ; SAVE IN BUFFER - INC DE ; BUMP BUF PTR - DJNZ TMS_BLKCPY2 ; LOOP AS NEEDED + IN A,(TMS_DATREG) ; GET THE NEXT BYTE + TMS_IODELAY ; DELAY + LD (DE),A ; SAVE IN BUFFER + INC DE ; BUMP BUF PTR + DJNZ TMS_BLKCPY2 ; LOOP AS NEEDED ; ; WRITE TO THE DESTINATION LOCATION - POP HL ; RECOVER DESTINATION INTO HL - CALL TMS_WR ; SET UP TO WRITE - LD DE,TMS_BUF ; POINT TO BUFFER - POP BC ; GET LOOP COUNTER BACK + POP HL ; RECOVER DESTINATION INTO HL + CALL TMS_WR ; SET UP TO WRITE + LD DE,TMS_BUF ; POINT TO BUFFER + POP BC ; GET LOOP COUNTER BACK LD B,C TMS_BLKCPY3: - LD A,(DE) ; GET THE CHAR FROM BUFFER - OUT (TMS_DATREG),A ; WRITE TO VDU - TMS_IODELAY ; DELAY - INC DE ; BUMP BUF PTR - DJNZ TMS_BLKCPY3 ; LOOP AS NEEDED + LD A,(DE) ; GET THE CHAR FROM BUFFER + OUT (TMS_DATREG),A ; WRITE TO VDU + TMS_IODELAY ; DELAY + INC DE ; BUMP BUF PTR + DJNZ TMS_BLKCPY3 ; LOOP AS NEEDED ; RET ; @@ -915,7 +1000,7 @@ TMS_INTHNDL: ; CALL MKY_INT ;#ENDIF - CALL HB_TIMINT ; RETURN NZ - HANDLED + CALL HB_TIMINT ; RETURN NZ - HANDLED OR $FF RET #ENDIF @@ -924,28 +1009,30 @@ TMS_INTHNDL: ; TMS DRIVER - DATA ;================================================================================================== ; -TMS_POS .DW 0 ; CURRENT DISPLAY POSITION -TMS_CURSAV .DB 0 ; SAVES ORIGINAL CHARACTER UNDER CURSOR -TMS_BUF .FILL 256,0 ; COPY BUFFER - +TMS_POS .DW 0 ; CURRENT DISPLAY POSITION +TMS_CURSAV .DB 0 ; SAVES ORIGINAL CHARACTER UNDER CURSOR +TMS_BUF .FILL 256,0 ; COPY BUFFER +; +; ### JLC Mod +; ANSI-->TMS Color Conversion Table +TMS_COLOR_TBL .DB $01,$08,$02,$0A,$04,$06,$0C,$0F,$0E,$09,$03,$0B,$05,$0D,$07,$0F ; ;================================================================================================== ; TMS DRIVER - INSTANCE DATA ;================================================================================================== ; - TMS_IDAT: #IF ((TMSMODE == TMSMODE_MSX) | (TMSMODE == TMSMODE_MSX9958) | (TMSMODE == TMSMODE_N8) | (TMSMODE == TMSMODE_SCG)) - .DB TMS_PPIA ; PPI PORT A - .DB TMS_PPIB ; PPI PORT B - .DB TMS_PPIC ; PPI PORT C - .DB TMS_PPIX ; PPI CONTROL PORT + .DB TMS_PPIA ; PPI PORT A + .DB TMS_PPIB ; PPI PORT B + .DB TMS_PPIC ; PPI PORT C + .DB TMS_PPIX ; PPI CONTROL PORT #ENDIF #IF ((TMSMODE == TMSMODE_MSXKBD) | (TMSMODE == TMSMODE_MBC)) - .DB TMS_KBDST ; 8242 CMD/STATUS PORT - .DB TMS_KBDDATA ; 8242 DATA PORT - .DB 0 ; FILLER - .DB 0 ; FILER + .DB KBDMODE_PS2 ; PS/2 8242 KEYBOARD CONTROLLER + .DB TMS_KBDST ; 8242 CMD/STATUS PORT + .DB TMS_KBDDATA ; 8242 DATA PORT + .DB 0 ; FILLER #ENDIF ; .DB TMS_DATREG @@ -958,8 +1045,8 @@ TMS_IDAT: ; Control Registers (write CMDREG): ; ; Reg Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 Description -; 0 - - - - - - M2 EXTVID -; 1 4/16K BL GINT M1 M3 - SI MAG +; 0 - - - - - - M3 EXTVID +; 1 4/16K BL GINT M1 M2 - SI MAG ; 2 - - - - PN13 PN12 PN11 PN10 ; 3 CT13 CT12 CT11 CT10 CT9 CT8 CT7 CT6 ; 4 - - - - - PG13 PG12 PG11 @@ -994,32 +1081,43 @@ TMS_IDAT: ; INT Set at each screen update, used for interrupts. ; #IF ((TMSMODE == TMSMODE_MSX9958) | (TMSMODE == TMSMODE_MBC)) -TMS_INITVDU: - .DB $04 ; REG 0 - NO EXTERNAL VID, SET M4 = 1 +; +; NOTE: YAMAHA 9938/58 DOCUMENTATION SAYS R3 IS SAME AS 9918 (ADR >> 10), +; BUT THIS SEEMS TO BE WRONG AND CORRECTLY DOCUMENTED AT +; https://www.msx.org/wiki/Screen_Modes_Description#SCREEN_0_in_80-column_.28Text_mode_2.29 +; BITS 1-0 SHOULD BE 1. BITS 8-2 SHOULD BE (ADR >> 8). +; +; ### JLC Mod +; TEXT MODE DEFAULT COLOR (REG 7) CAN BE CHANGED INVOKING VDASCO +; OR VIA ANSI PRIVATE ESC SEQ. (SEE ANSI.ASM FOR DETAILS) +; +TMS_INITVDU: ; V9958 REGISTER SET + .DB $04 ; REG 0 - NO EXTERNAL VID, SET M4 = 1 FOR 80 COLS TMS_INITVDU_REG_1: - .DB $50 ; REG 1 - ENABLE SCREEN, SET MODE 1 - .DB $03 ; REG 2 - PATTERN NAME TABLE := 0 + .DB $50 ; REG 1 - ENABLE SCREEN, SET M1 + .DB $03 ; REG 2 - SET PATTERN NAME TABLE TO (TMS_CHRVADDR >> 8) | $03 .DB $00 ; REG 3 - NO COLOR TABLE .DB $02 ; REG 4 - SET PATTERN GENERATOR TABLE TO (TMS_FNTVADDR -> $1000) .DB $00 ; REG 5 - SPRITE ATTRIBUTE IRRELEVANT .DB $00 ; REG 6 - NO SPRITE GENERATOR TABLE .DB $F0 ; REG 7 - WHITE ON BLACK - .DB $88 ; REG 8 - COLOUR BUS INPUT, DRAM 64K .DB $00 ; REG 9 .DB $00 ; REG 10 - COLOUR TABLE A14-A16 (TMS_FNTVADDR - $1000) - -#ELSE ; TMS REGISTER SET -TMS_INITVDU: - .DB $00 ; REG 0 - NO EXTERNAL VID +; +#ELSE ; _______TMS9918 REGISTER SET_______ +; +TMS_INITVDU: ; V9918 REGISTER SET + .DB $00 ; REG 0 - SET TEXT MODE, NO EXTERNAL VID TMS_INITVDU_REG_1: - .DB $50 ; REG 1 - ENABLE SCREEN, SET MODE 1 - .DB $00 ; REG 2 - PATTERN NAME TABLE := 0 - .DB $00 ; REG 3 - NO COLOR TABLE - .DB $01 ; REG 4 - SET PATTERN GENERATOR TABLE TO (TMS_FNTVADDR -> $0800) - .DB $00 ; REG 5 - SPRITE ATTRIBUTE IRRELEVANT - .DB $00 ; REG 6 - NO SPRITE GENERATOR TABLE - .DB $F0 ; REG 7 - WHITE ON BLACK + .DB $D0 ; REG 1 - SET 16K VRAM, ENABLE SCREEN, NO INTERRUPTS, TEXT MODE ($50 TO BLANK SCREEN) + .DB $0E ; REG 2 - SET PATTERN NAME TABLE TO (TMS_CHRVADDR >> 10) + .DB $FF ; REG 3 - NO COLOR TABLE, SET TO MODE II DEFAULT VALUE + .DB $00 ; REG 4 - SET PATTERN GENERATOR TABLE TO (TMS_FNTVADDR -> $0000) + .DB $76 ; REG 5 - SPRITE ATTRIBUTE IRRELEVANT, SET TO MODE II DEFAULT VALUE + .DB $03 ; REG 6 - NO SPRITE GENERATOR TABLE, SET TO MODE II DEFAULT VALUE + .DB $E1 ; REG 7 - TEXT COLOR +; #ENDIF ; TMS_INITVDULEN .EQU $ - TMS_INITVDU @@ -1028,3 +1126,29 @@ TMS_INITVDULEN .EQU $ - TMS_INITVDU #IF (CPUFAM == CPU_Z180) TMS_DCNTL .DB $00 ; SAVE Z180 DCNTL AS NEEDED #ENDIF +; +; ### JLC Mod +;=============================================================================== +; BASIC ANSI to TMS COLOR CONVERSION TABLE (NIBBLES FOR FOREGROUND & BACKGROUND) +; Follows RomWBW System Guide Chapter 8, HBIOS Reference +;------------------------------------------------------------------------------- +; ANSI Color TMS Equivalent +;------------------------------------------------------------------------------- +; 0 Black 1 +; 1 Red 8 +; 2 Green 2 +; 3 Brown A +; 4 Blue 4 +; 5 Magenta 6 +; 6 Cyan C +; 7 White F +; 8 Gray E +; 9 Light Red 9 +; A Light Green 3 +; B Yellow B +; C Light Blue 5 +; D Light Magenta D +; E Light Cyan 7 +; F Bright White F +;=============================================================================== +; diff --git a/Source/HBIOS/uart.asm b/Source/HBIOS/uart.asm index 958db9cc..eef0d133 100644 --- a/Source/HBIOS/uart.asm +++ b/Source/HBIOS/uart.asm @@ -52,13 +52,23 @@ UART_EFR .EQU 2 ; LCR=$BF: ENHANCED FEATURE REG (READ/WRITE) UART_INTACT .EQU 7 ; INT RCV ACTIVE BIT UART_FIFOACT .EQU 6 ; FIFO ACTIVE BIT UART_AFCACT .EQU 5 ; AUTO FLOW CONTROL ACTIVE BIT +UART_CTSBAD .EQU 4 ; CTS STALL DETECTED ; +#IF (PLATFORM == PLT_DUO) +UARTSBASE .EQU $58 +#ELSE UARTSBASE .EQU $68 +#ENDIF +UARTABASE .EQU $A8 UARTCBASE .EQU $80 UARTMBASE .EQU $18 UART4BASE .EQU $C0 UARTRBASE .EQU $A0 +#IF (PLATFORM == PLT_DUO) +UARTDBASE .EQU $70 +#ELSE UARTDBASE .EQU $80 +#ENDIF ; #IF (UARTINTS) ; @@ -169,7 +179,19 @@ UART_INITUNIT: LD A,(HL) ; PUT IN ACCUM INC (HL) ; INCREMENT IT (FOR NEXT LOOP) LD (IY),A ; UDPATE UNIT NUM +; + ; CHECK FOR CTS STALL (CTS SHOULD BE ASSERTED HERE) + BIT 5,(IY+5) ; IS RTS REQUESTED? + JR Z,UART_INITUNIT1 ; IF NOT, SKIP CTS CHECK + UART_INP(UART_MSR) ; LOAD MODEM STATUS REG + BIT 4,A ; CTS + JR NZ,UART_INITUNIT1 ; IF CTS HIGH (GOOD), SKIP AHEAD +; + ; CTS LOOKS BORKED, SHUT OFF RTS/CTS FLOW CONTROL + RES 5,(IY+5) ; CLEAR RTS BIT OF CONFIG MSB + SET UART_CTSBAD,(IY+1) ; RECORD BAD CTS ; +UART_INITUNIT1: ; SET DEFAULT CONFIG LD DE,-1 ; LEAVE CONFIG ALONE JP UART_INITDEVX ; IMPLEMENT IT AND RETURN @@ -193,8 +215,10 @@ UART_INIT1: LD A,(IY+1) ; GET UART TYPE OR A ; SET FLAGS - CALL NZ,UART_PRTCFG ; PRINT IF NOT ZERO - + JR Z,UART_INIT2 ; SKIP IF ZERO (NOT DETECTED) + CALL UART_PRTCFG ; PRINT IF NOT ZERO +; +UART_INIT2: POP BC ; RESTORE LOOP CONTROL INC C ; NEXT UNIT DJNZ UART_INIT1 ; LOOP TILL DONE @@ -928,6 +952,11 @@ UART_PRTCFG2: PRTS(" AFC$") ; UART_PRTCFG3: + BIT UART_CTSBAD,(IY+1) ; GET BADCTS BIT + JR Z,UART_PRTCFG4 + PRTS(" NO_CTS!$") +; +UART_PRTCFG4: ; XOR A RET @@ -1004,6 +1033,27 @@ UART_CFG_SBC: .DB UARTSBASE + UART_LSR ; LINE STATUS PORT (LSR) .DW UARTCFG ; LINE CONFIGURATION .DW UARTSBC_RCVBUF ; POINTER TO RCV BUFFER STRUCT +; + .ECHO "UART: MODE=SBC, IO=" + .ECHO UARTSBASE + #IF ((UARTINTS) & (INTMODE > 0)) + .ECHO ", INTERRUPTS ENABLED" + #ENDIF + .ECHO "\n" +#ENDIF +#IF (UARTAUX) +UART_CFG_AUX: + ; AUX SERIAL PORT + .DB 0 ; DEVICE NUMBER (UPDATED DURING INIT) + .DB 0 ; UART TYPE + .DB UARTABASE ; IO PORT BASE (RBR, THR) + .DB UARTABASE + UART_LSR ; LINE STATUS PORT (LSR) + .DW UARTCFG ; LINE CONFIGURATION + .DW 0 ; NO INT HANDLER +; + .ECHO "UART: MODE=AUX, IO=" + .ECHO UARTABASE + .ECHO "\n" #ENDIF #IF (UARTCAS) UART_CFG_CAS: @@ -1014,6 +1064,13 @@ UART_CFG_CAS: .DB UARTCBASE + UART_LSR ; LINE STATUS PORT (LSR) .DW UARTCASSPD ; LINE CONFIGURATION .DW UARTCAS_RCVBUF ; POINTER TO RCV BUFFER STRUCT +; + .ECHO "UART: MODE=CAS, IO=" + .ECHO UARTCBASE + #IF ((UARTINTS) & (INTMODE > 0)) + .ECHO ", INTERRUPTS ENABLED" + #ENDIF + .ECHO "\n" #ENDIF #IF (UARTMFP) UART_CFG_MFP: @@ -1024,6 +1081,10 @@ UART_CFG_MFP: .DB UARTMBASE + UART_LSR ; LINE STATUS PORT (LSR) .DW UARTCFG ; LINE CONFIGURATION .DW 0 ; SHOULD NEVER NEED INT HANDLER +; + .ECHO "UART: MODE=MFP, IO=" + .ECHO UARTSBASE + .ECHO "\n" #ENDIF #IF (UART4) ; 4UART SERIAL PORT A @@ -1033,6 +1094,11 @@ UART_CFG_MFP: .DB UART4BASE+0 + UART_LSR ; LINE STATUS PORT (LSR) .DW UARTCFG ; LINE CONFIGURATION .DW 0 ; SHOULD NEVER NEED INT HANDLER +; + .ECHO "UART: MODE=4UART, IO=" + .ECHO UART4BASE+0 + .ECHO "\n" +; ; 4UART SERIAL PORT B .DB 0 ; DEVICE NUMBER (UPDATED DURING INIT) .DB 0 ; UART TYPE @@ -1040,6 +1106,11 @@ UART_CFG_MFP: .DB UART4BASE+8 + UART_LSR ; LINE STATUS PORT (LSR) .DW UARTCFG ; LINE CONFIGURATION .DW 0 ; SHOULD NEVER NEED INT HANDLER +; + .ECHO "UART: MODE=4UART, IO=" + .ECHO UART4BASE+8 + .ECHO "\n" +; ; 4UART SERIAL PORT C .DB 0 ; DEVICE NUMBER (UPDATED DURING INIT) .DB 0 ; UART TYPE @@ -1047,6 +1118,11 @@ UART_CFG_MFP: .DB UART4BASE+16 + UART_LSR ; LINE STATUS PORT (LSR) .DW UARTCFG ; LINE CONFIGURATION .DW 0 ; SHOULD NEVER NEED INT HANDLER +; + .ECHO "UART: MODE=4UART, IO=" + .ECHO UART4BASE+16 + .ECHO "\n" +; ; 4UART SERIAL PORT D .DB 0 ; DEVICE NUMBER (UPDATED DURING INIT) .DB 0 ; UART TYPE @@ -1054,6 +1130,10 @@ UART_CFG_MFP: .DB UART4BASE+24 + UART_LSR ; LINE STATUS PORT (LSR) .DW UARTCFG ; LINE CONFIGURATION .DW 0 ; SHOULD NEVER NEED INT HANDLER +; + .ECHO "UART: MODE=4UART, IO=" + .ECHO UART4BASE+24 + .ECHO "\n" #ENDIF #IF (UARTRC) ; UARTRC SERIAL PORT A @@ -1063,6 +1143,11 @@ UART_CFG_MFP: .DB UARTRBASE + UART_LSR ; LINE STATUS PORT (LSR) .DW UARTCFG ; LINE CONFIGURATION .DW 0 ; SHOULD NEVER NEED INT HANDLER +; + .ECHO "UART: MODE=RC, IO=" + .ECHO UARTRBASE+0 + .ECHO "\n" +; ; UARTRC SERIAL PORT B .DB 0 ; DEVICE NUMBER (UPDATED DURING INIT) .DB 0 ; UART TYPE @@ -1070,6 +1155,11 @@ UART_CFG_MFP: .DB UARTRBASE+8 + UART_LSR ; LINE STATUS PORT (LSR) .DW UARTCFG ; LINE CONFIGURATION .DW 0 ; SHOULD NEVER NEED INT HANDLER +; + .ECHO "UART: MODE=RC, IO=" + .ECHO UARTRBASE+8 + .ECHO "\n" +; #ENDIF #IF (UARTDUAL) ; DUAL UART CHANNEL A @@ -1079,6 +1169,11 @@ UART_CFG_MFP: .DB UARTDBASE + UART_LSR ; LINE STATUS PORT (LSR) .DW UARTCFG ; LINE CONFIGURATION .DW 0 ; SHOULD NEVER NEED INT HANDLER +; + .ECHO "UART: MODE=DUAL, IO=" + .ECHO UARTDBASE+0 + .ECHO "\n" +; ; DUAL UART CHANNEL B .DB 0 ; DEVICE NUMBER (UPDATED DURING INIT) .DB 0 ; UART TYPE @@ -1086,6 +1181,11 @@ UART_CFG_MFP: .DB UARTDBASE+8 + UART_LSR ; LINE STATUS PORT (LSR) .DW UARTCFG ; LINE CONFIGURATION .DW 0 ; SHOULD NEVER NEED INT HANDLER +; + .ECHO "UART: MODE=DUAL, IO=" + .ECHO UARTDBASE+8 + .ECHO "\n" +; #ENDIF ; UART_CNT .EQU ($ - UART_CFG) / 8 diff --git a/Source/HBIOS/uf.asm b/Source/HBIOS/uf.asm index 049167c0..328ac033 100644 --- a/Source/HBIOS/uf.asm +++ b/Source/HBIOS/uf.asm @@ -23,6 +23,10 @@ UF_USB_ACTIVE .DB 0 ; USB CABLE CONNECTED STATUS FLAG ; DEVICE DESCRIPTION TABLE ; UF_CFG: .DW SER_9600_8N1 ; DUMMY CONFIGURATION +; + .ECHO "USB-FIFO: IO=" + .ECHO UFBASE + .ECHO "\n" ; ; SETUP THE DISPATCH TABLE ENTRY AND INITIALIZE HARDWARE ; diff --git a/Source/HBIOS/unlzsa2s.asm b/Source/HBIOS/unlzsa2s.asm index 26957db2..7fbc74fb 100644 --- a/Source/HBIOS/unlzsa2s.asm +++ b/Source/HBIOS/unlzsa2s.asm @@ -1,3 +1,4 @@ +; WARNING: This code does not seem to be working on Z280. WBW - 5/3/2023 ; ; Size-optimized LZSA2 decompressor by spke & uniabis (134 bytes) ; @@ -59,8 +60,8 @@ ; 3. This notice may not be removed or altered from any source distribution. ; -; #DEFINE BACKWARD_DECOMPRESS ; uncomment for data compressed with option -b (+5 bytes, -3% speed) -; #DEFINE AVOID_SELFMODIFYING_CODE ; uncomment to disallow self-modifying code (-1 byte, -4% speed) +; #DEFINE BACKWARD_DECOMPRESS ; uncomment for data compressed with option -b (+5 bytes, -3% speed) +; #DEFINE AVOID_SELFMODIFYING_CODE ; uncomment to disallow self-modifying code (-1 byte, -4% speed) #IFNDEF BACKWARD_DECOMPRESS @@ -78,7 +79,7 @@ #DEFINE ADD_OFFSET \ #DEFCONT \ ld a,e \ sub l \ ld l,a - #DEFCONT \ ld a,d \ sbc h \ ld h,a ; 6*4 = 24t / 6 bytes + #DEFCONT \ ld a,d \ sbc h \ ld h,a ; 6*4 = 24t / 6 bytes #DEFINE BLOCKCOPY \ #DEFCONT \ lddr @@ -117,7 +118,7 @@ MatchLen: and %00000111 \ add a,2 \ cp 9 call z,ExtendedCode CopyMatch: ld c,a - push hl ; BC = len, DE = dest, HL = -offset, SP -> [src] + push hl ; BC = len, DE = dest, HL = -offset, SP -> [src] #IFNDEF AVOID_SELFMODIFYING_CODE PrevOffset .EQU $+1 \ ld hl,0 @@ -125,8 +126,8 @@ PrevOffset .EQU $+1 \ ld hl,0 push ix \ pop hl #ENDIF ADD_OFFSET - BLOCKCOPY ; BC = 0, DE = dest - pop hl ; HL = src + BLOCKCOPY ; BC = 0, DE = dest + pop hl ; HL = src ReadToken: ld a,(hl) \ NEXT_HL \ push af and %00011000 \ jr z,NoLiterals @@ -162,12 +163,16 @@ ExtendedCode: call ReadNibble \ inc a \ jr z,ExtraByte ExtraByte ld a,15 \ add a,c \ add a,(hl) \ NEXT_HL \ ret nc ld a,(hl) \ NEXT_HL ld b,(hl) \ NEXT_HL \ ret nz - pop bc ; RET is not needed, because RET from ReadNibble is sufficient + pop bc ; RET is not needed, because RET from ReadNibble is sufficient ReadNibble: ld c,a -skipLDCA xor a \ ex af,af' \ ret m +skipLDCA xor a \ nop \ ex af,af' \ ret m ; NOP for Z280 bug ld a,(hl) \ or $F0 \ ex af,af' ld a,(hl) \ NEXT_HL \ or $0F rrca \ rrca \ rrca \ rrca \ ret +; The extraneous NOP instruction above is to workaround a bug in the +; Z280 processor where ex af,af' can copy rather than swap the flags +; register. +; See https://www.retrobrewcomputers.org/forum/index.php?t=msg&goto=10183& diff --git a/Source/HBIOS/util.asm b/Source/HBIOS/util.asm index 29e6c532..2496dd52 100644 --- a/Source/HBIOS/util.asm +++ b/Source/HBIOS/util.asm @@ -407,8 +407,8 @@ XREGDMP: LD (REGDMP_SP),SP ; SAVE STACK POINTER - ;LD (RD_STKSAV),SP ; SAVE ORIGINAL STACK POINTER - ;LD SP,RD_STACK ; SWITCH TO PRIVATE STACK + LD (RD_STKSAV),SP ; SAVE ORIGINAL STACK POINTER + LD SP,RD_STACK ; SWITCH TO PRIVATE STACK PUSH AF PUSH BC @@ -462,7 +462,7 @@ XREGDMP: POP BC POP AF - ;LD SP,(RD_STKSAV) ; BACK TO ORIGINAL STACK FRAME + LD SP,(RD_STKSAV) ; BACK TO ORIGINAL STACK FRAME JP $FFFF ; RETURN, $FFFF IS DYNAMICALLY UPDATED REGDMP_RET .EQU $-2 ; RETURN ADDRESS GOES HERE @@ -470,9 +470,9 @@ REGDMP_RET .EQU $-2 ; RETURN ADDRESS GOES HERE REGDMP_PC .DW 0 REGDMP_SP .DW 0 ; -;RD_STKSAV .DW 0 -; .FILL $FF,16*2 ; 16 LEVEL PRIVATE STACK -;RD_STACK .EQU $ +RD_STKSAV .DW 0 + .FILL $FF,16*2 ; 16 LEVEL PRIVATE STACK +RD_STACK .EQU $ ; ; ; diff --git a/Source/HBIOS/vdu.asm b/Source/HBIOS/vdu.asm index 0d035bf4..890e2a06 100644 --- a/Source/HBIOS/vdu.asm +++ b/Source/HBIOS/vdu.asm @@ -81,6 +81,12 @@ VDU_R11 .EQU DSCANL-1 VDU_R10 .EQU (VDU_BLNK + DSCANL-1) VDU_R11 .EQU DSCANL-1 #ENDIF +; + .ECHO "VDU: IO=" + .ECHO VDU_RAMRD + .ECHO ", PPK IO=" + .ECHO VDU_PPIA + .ECHO "\n" ; ;====================================================================== ; VDU DRIVER - INITIALIZATION diff --git a/Source/HBIOS/vga.asm b/Source/HBIOS/vga.asm index d072711b..8d0413aa 100644 --- a/Source/HBIOS/vga.asm +++ b/Source/HBIOS/vga.asm @@ -20,6 +20,14 @@ VGA_CFG .EQU VGA_BASE + $04 ; VGA3 BOARD CFG REGISTER VGA_HI .EQU VGA_BASE + $05 ; BOARD RAM HI ADDRESS VGA_LO .EQU VGA_BASE + $06 ; BOARD RAM LO ADDRESS VGA_DAT .EQU VGA_BASE + $07 ; BOARD RAM BYTE R/W +; + .ECHO "VGA: " + .ECHO "IO=" + .ECHO VGA_BASE + .ECHO ", KBD MODE=PS/2" + .ECHO ", KBD IO=" + .ECHO VGA_KBDDATA + .ECHO "\n" ; VGA_NOBL .EQU 00000000B ; NO BLINK VGA_NOCU .EQU 00100000B ; NO CURSOR @@ -229,6 +237,10 @@ VGA_VDASAT: JR VGA_VDASCO2 ; IMPLEMENT SETTING VGA_VDASCO: + ; WE HANDLE ONLY PER-CHARACTER COLORS (D=0) + LD A,D ; GET CHAR/SCREEN SCOPE + OR A ; CHARACTER? + JR NZ,VGA_VDASCO3 ; IF NOT, JUST RETURN ; INCOMING IS: IBGRIBGR (I=INTENSITY, B=BLUE, G=GREEN, R=RED) ; TRANSFORM TO: -RGBIRGB (DISCARD INTENSITY BIT IN HIGH NIBBLE) ; @@ -1039,5 +1051,6 @@ REGS_VGA: ;================================================================================================== ; VGA_IDAT: + .DB KBDMODE_PS2 ; PS/2 8242 KEYBOARD CONTROLLER .DB VGA_KBDST .DB VGA_KBDDATA diff --git a/Source/HBIOS/vrc.asm b/Source/HBIOS/vrc.asm new file mode 100644 index 00000000..3f25392e --- /dev/null +++ b/Source/HBIOS/vrc.asm @@ -0,0 +1,677 @@ +;====================================================================== +; VIDEO DRIVER FOR VGARC +; https://www.retrobrewcomputers.org/doku.php?id=builderpages:plasmo:vgarc1:vgarc1home +; +; WRITTEN BY: WAYNE WARTHEN -- 5/1/2023 +;====================================================================== +; +; TODO: +; +;====================================================================== +; VGARC DRIVER - CONSTANTS +;====================================================================== +; +VRC_BASE .EQU $00 ; FIRST CHAR DATA PORT +VRC_FONTBASE .EQU VRC_BASE + $0C ; FIRST FONT PORT +VRC_SCROLLIO .EQU $F5 ; SCROLL REG PORT +; +VRC_KBDDATA .EQU $F4 +VRC_KBDST .EQU $F5 +; +VRC_ROWS .EQU 48 +VRC_COLS .EQU 64 +; +#DEFINE USEFONTVGARC +#DEFINE VRC_FONT FONTVGARC +; +TERMENABLE .SET TRUE ; INCLUDE TERMINAL PSEUDODEVICE DRIVER +; + .ECHO "VRC: IO=" + .ECHO VRC_BASE + .ECHO ", KBD MODE=VRC" + .ECHO ", KBD IO=" + .ECHO VRC_KBDDATA + .ECHO "\n" +; +;====================================================================== +; VRC DRIVER - INITIALIZATION +;====================================================================== +; +VRC_INIT: + LD IY,VRC_IDAT ; POINTER TO INSTANCE DATA +; + CALL NEWLINE ; FORMATTING + PRTS("VRC: IO=0x$") + LD A,VRC_BASE + CALL PRTHEXBYTE + CALL VRC_PROBE ; CHECK FOR HW PRESENCE + JR Z,VRC_INIT1 ; CONTINUE IF HW PRESENT +; + ; HARDWARE NOT PRESENT + PRTS(" NOT PRESENT$") + OR $FF ; SIGNAL FAILURE + RET +; +VRC_INIT1: + ; RECORD DRIVER ACTIVE + OR $FF + LD (VRC_ACTIVE),A + ; DISPLAY CONSOLE DIMENSIONS + LD A,VRC_COLS + CALL PC_SPACE + CALL PRTDECB + LD A,'X' + CALL COUT + LD A,VRC_ROWS + CALL PRTDECB + PRTS(" TEXT$") + + ; HARDWARE INITIALIZATION + CALL VRC_CRTINIT ; SETUP THE VGARC CHIP REGISTERS + CALL VRC_LOADFONT ; LOAD FONT DATA FROM ROM TO VGARC STORAGE + CALL VRC_VDARES ; RESET + CALL KBD_INIT ; INITIALIZE KEYBOARD DRIVER + + ; ADD OURSELVES TO VDA DISPATCH TABLE + LD BC,VRC_FNTBL ; BC := FUNCTION TABLE ADDRESS + LD DE,VRC_IDAT ; DE := VGARC INSTANCE DATA PTR + CALL VDA_ADDENT ; ADD ENTRY, A := UNIT ASSIGNED + + ; INITIALIZE EMULATION + LD C,A ; C := ASSIGNED VIDEO DEVICE NUM + LD DE,VRC_FNTBL ; DE := FUNCTION TABLE ADDRESS + LD HL,VRC_IDAT ; HL := VGARC INSTANCE DATA PTR + CALL TERM_ATTACH ; DO IT + + XOR A ; SIGNAL SUCCESS + RET +; +;====================================================================== +; VGARC DRIVER - VIDEO DISPLAY ADAPTER (VDA) FUNCTIONS +;====================================================================== +; +VRC_FNTBL: + .DW VRC_VDAINI + .DW VRC_VDAQRY + .DW VRC_VDARES + .DW VRC_VDADEV + .DW VRC_VDASCS + .DW VRC_VDASCP + .DW VRC_VDASAT + .DW VRC_VDASCO + .DW VRC_VDAWRC + .DW VRC_VDAFIL + .DW VRC_VDACPY + .DW VRC_VDASCR + .DW KBD_STAT + .DW KBD_FLUSH + .DW KBD_READ + .DW VRC_VDARDC +#IF (($ - VRC_FNTBL) != (VDA_FNCNT * 2)) + .ECHO "*** INVALID VRC FUNCTION TABLE ***\n" + !!!!! +#ENDIF + +VRC_VDAINI: + ; RESET VDA + ; CURRENTLY IGNORES VIDEO MODE AND BITMAP DATA + CALL VRC_VDARES ; RESET VDA + XOR A ; SIGNAL SUCCESS + RET + +VRC_VDAQRY: + LD C,$00 ; MODE ZERO IS ALL WE KNOW + LD D,VRC_ROWS ; ROWS + LD E,VRC_COLS ; COLS + LD HL,0 ; EXTRACTION OF CURRENT BITMAP DATA NOT SUPPORTED YET + XOR A ; SIGNAL SUCCESS + RET + +VRC_VDARES: + XOR A ; CLEAR ATTRIBUTES (REV VIDEO OFF) + LD (VRC_ATTR),A ; SAVE IT + DEC A ; INIT CUR NESTING, INIT TO HIDDEN + LD (VRC_CURSOR),A ; SAVE IT + LD HL,0 ; ZERO THE SCROLL OFFSET + LD (VRC_OFF),HL ; SAVE VALUE + XOR A ; ZERO + LD (VRC_LOFF),A ; SCROLL OFFSET (LINES) + LD A,' ' ; BLANK THE SCREEN + LD DE,VRC_ROWS*VRC_COLS ; FILL ENTIRE BUFFER + CALL VRC_FILL ; DO IT + LD DE,0 ; ROW = 0, COL = 0 + CALL VRC_XY ; SEND CURSOR TO TOP LEFT + CALL VRC_SHOWCUR ; NOW SHOW THE CURSOR +; + XOR A ; SIGNAL SUCCESS + RET + +VRC_VDADEV: + LD D,VDADEV_VRC ; D := DEVICE TYPE + LD E,0 ; E := PHYSICAL UNIT IS ALWAYS ZERO + LD H,0 ; H := 0, DRIVER HAS NO MODES + LD L,VRC_BASE ; L := BASE I/O ADDRESS + XOR A ; SIGNAL SUCCESS + RET + +VRC_VDASCS: + SYSCHKERR(ERR_NOTIMPL) ; NOT IMPLEMENTED (YET) + RET + +VRC_VDASCP: + CALL VRC_XY ; SET CURSOR POSITION + XOR A ; SIGNAL SUCCESS + RET + +VRC_VDASAT: + ; INCOMING IS: -----RUB (R=REVERSE, U=UNDERLINE, B=BLINK) + ; + ; ALL WE SUPPORT IS REVERSE. MOVE BIT TO BIT 7 OF ATTR BYTE + LD A,E ; GET ATTR VALUE + RRCA ; ROTATE TO BIT 7 + RRCA + RRCA + AND $80 ; ENSURE ONLY BIT 7 + LD (VRC_ATTR),A ; SAVE IT + XOR A ; SIGNAL SUCCESS + RET ; DONE + +VRC_VDASCO: + ; INCOMING IS: IBGRIBGR (I=INTENSITY, B=BLUE, G=GREEN, R=RED) + ; + ; NONE SUPPORTED, IGNORE + XOR A ; SIGNAL SUCCESS + RET ; DONE + +VRC_VDAWRC: + LD A,E ; CHARACTER TO WRITE GOES IN A + CALL VRC_PUTCHAR ; PUT IT ON THE SCREEN + XOR A ; SIGNAL SUCCESS + RET + +VRC_VDAFIL: + LD A,E ; FILL CHARACTER GOES IN A + EX DE,HL ; FILL LENGTH GOES IN DE + CALL VRC_FILL ; DO THE FILL + XOR A ; SIGNAL SUCCESS + RET + +VRC_VDACPY: + ; LENGTH IN HL, SOURCE ROW/COL IN DE, DEST IS VRC_POS + ; BLKCPY USES: HL=SOURCE, DE=DEST, BC=COUNT + PUSH HL ; SAVE LENGTH + CALL VRC_XY2IDX ; ROW/COL IN DE -> SOURCE ADR IN HL + POP BC ; RECOVER LENGTH IN BC + LD DE,(VRC_POS) ; PUT DEST IN DE + JP VRC_BLKCPY ; DO A BLOCK COPY + +VRC_VDASCR: + LD A,E ; LOAD E INTO A + OR A ; SET FLAGS + RET Z ; IF ZERO, WE ARE DONE + PUSH DE ; SAVE E + JP M,VRC_VDASCR1 ; E IS NEGATIVE, REVERSE SCROLL + CALL VRC_SCROLL ; SCROLL FORWARD ONE LINE + POP DE ; RECOVER E + DEC E ; DECREMENT IT + JR VRC_VDASCR ; LOOP +VRC_VDASCR1: + CALL VRC_RSCROLL ; SCROLL REVERSE ONE LINE + POP DE ; RECOVER E + INC E ; INCREMENT IT + JR VRC_VDASCR ; LOOP + +;---------------------------------------------------------------------- +; READ VALUE AT CURRENT VDU BUFFER POSITION +; RETURN E = CHARACTER, B = COLOUR, C = ATTRIBUTES +;---------------------------------------------------------------------- + +VRC_VDARDC: + OR $FF ; UNSUPPORTED FUNCTION + RET +; +;====================================================================== +; VGARC DRIVER - PRIVATE DRIVER FUNCTIONS +;====================================================================== +; +; +;---------------------------------------------------------------------- +; PROBE FOR VGARC HARDWARE +;---------------------------------------------------------------------- +; +; ON RETURN, ZF SET INDICATES HARDWARE FOUND +; +VRC_PROBE: + LD C,VRC_BASE + 1 ; +1 AVOIDS LEDS + LD B,$00 + LD A,$AA + OUT (C),A + INC B + LD A,$55 + OUT (C),A + DEC B + IN A,(C) + CP $AA + RET NZ + INC B + IN A,(C) + CP $55 + RET +; +;---------------------------------------------------------------------- +; CRTC DISPLAY CONTROLLER CHIP INITIALIZATION +;---------------------------------------------------------------------- +; +VRC_CRTINIT: + XOR A ; ZERO ACCUM + LD A,$80 ; ACTIVATE AND ZERO HW SCROLL + OUT (VRC_SCROLLIO),A ; RESET HW SCROLL + RET ; DONE +; +;---------------------------------------------------------------------- +; LOAD FONT DATA +;---------------------------------------------------------------------- +; +VRC_LOADFONT: +; +#IF USELZSA2 + LD (VRC_STACK),SP ; SAVE STACK + LD HL,(VRC_STACK) ; AND SHIFT IT + LD DE,$2000 ; DOWN 4KB TO + OR A ; CREATE A + SBC HL,DE ; DECOMPRESSION BUFFER + LD SP,HL ; HL POINTS TO BUFFER + EX DE,HL ; START OF STACK BUFFER + PUSH DE ; SAVE IT + LD HL,VRC_FONT ; START OF FONT DATA + CALL DLZSA2 ; DECOMPRESS TO DE + POP HL ; RECALL STACK BUFFER POSITION +#ELSE + LD HL,VRC_FONT ; START OF FONT DATA +#ENDIF +; +#IF 0 + ; THIS APPROACH TO LOADING FONTS IS BEST (FASTEST), BUT IS + ; CAUSING ARTIFACTS ON THE DISPLAYED FONTS WHEN RUN ON A + ; Z280. IT IS NOT CLEAR WHAT THE PROBLEM IS (POSSIBLY + ; Z280 BUG), BUT FOR NOW WE AVOID THIS AND USE AN + ; ALTERNATIVE APPROACH BELOW. + LD DE,0+(128*8)-1 ; LENGTH OF FONT DATA - 1 + ADD HL,DE ; ADD TO HL + LD BC,VRC_FONTBASE+3 ; WORK BACKWARDS + OTDR ; DO 4 PAGES + DEC C + OTDR + DEC C + OTDR + DEC C + OTDR + DEC C +#ENDIF +; +#IF 1 + ; ALTERNATIVE APPROACH TO LOADING FONTS. THIS ONE AVOIDS + ; THE USE OF OTDR WHICH SEEMS TO CAUSE PROBLEMS ON Z280. + LD B,0 + LD C,VRC_FONTBASE +VRC_LOADFONT1: + LD A,(HL) + OUT (C),A + INC HL + INC B + JR NZ,VRC_LOADFONT1 + INC C + LD A,C + CP VRC_FONTBASE + 4 + JR NZ,VRC_LOADFONT1 +#ENDIF +; +#IF USELZSA2 + LD HL,(VRC_STACK) ; ERASE DECOMPRESS BUFFER + LD SP,HL ; BY RESTORING THE STACK + RET ; DONE +VRC_STACK .DW 0 +#ELSE + RET +#ENDIF +; +;---------------------------------------------------------------------- +; SET CURSOR POSITION TO ROW IN D AND COLUMN IN E +;---------------------------------------------------------------------- +; +VRC_XY: + PUSH DE ; SAVE NEW POSITION FOR NOW + CALL VRC_HIDECUR ; HIDE THE CURSOR + POP DE ; RECOVER INCOMING ROW/COL + CALL VRC_XY2IDX ; CONVERT ROW/COL TO BUF IDX + LD (VRC_POS),HL ; SAVE THE RESULT (DISPLAY POSITION) + JP VRC_SHOWCUR ; SHOW THE CURSOR AND EXIT +; +;---------------------------------------------------------------------- +; CONVERT XY COORDINATES IN DE INTO LINEAR INDEX IN HL +; D=ROW, E=COL +;---------------------------------------------------------------------- +; +VRC_XY2IDX: + LD A,E ; SAVE COLUMN NUMBER IN A + LD H,D ; SET H TO ROW NUMBER + LD E,VRC_COLS ; SET E TO ROW LENGTH + CALL MULT8 ; MULTIPLY TO GET ROW OFFSET, H * E = HL, E=0, B=0 + LD E,A ; GET COLUMN BACK + ADD HL,DE ; ADD IT IN + + LD DE,(VRC_OFF) ; SCREEN OFFSET + ADD HL,DE ; ADJUST +; + PUSH HL ; SAVE IT + LD DE,VRC_ROWS * VRC_COLS ; DE := BUF SIZE + OR A ; CLEAR CARRY + SBC HL,DE ; SUBTRACT FROM HL + JR C,VRC_XY2IDX1 ; BYPASS IF NO WRAP + POP DE ; THROW AWAY TOS + RET ; DONE +VRC_XY2IDX1: + POP HL ; NO WRAP, RESTORE + RET ; RETURN +; +;---------------------------------------------------------------------- +; SHOW OR HIDE CURSOR +;---------------------------------------------------------------------- +; +; VGARC USES HIGH BIT OF CHAR VALUE FOR INVERSE VIDEO. WE HAVE NO +; HARDWARE CURSOR, SO WE LEVERAGE THE INVERSE VIDEO TO SHOW A CURSOR. +; SINCE ANY OPERATION THAT POTENTIALLY OVERWERITES THE CURSOR POSITION +; COULD DESTROY THE CURSOR, WE HAVE A COUPLE FUNCTIONS TO SHOW AND +; HIDE THE CURSOR. A VARIABLE IS USED TO TRACK THE SHOW/HIDE +; OPERATIONS BECAUSE WE MAY HAVE NESTED CALLS. ZERO MEANS SHOW +; REAL CURSOR. ANY VALUE LESS THAN ZERO MEANS HIDDEN. +; +VRC_SHOWCUR: + LD A,(VRC_CURSOR) ; GET CURRENT NESTING VALUE + INC A ; INCREMENT TO SHOW + LD (VRC_CURSOR),A ; SAVE IT + RET NZ ; ALREADY SHOWN, NOTHING TO DO +; + ; WE TRANSITIONED FROM NON-ZERO TO ZERO. NEED TO ACTUALLY + ; SHOW THE CURSOR NOW. +; + JR VRC_FLIPCUR +; +VRC_HIDECUR: + LD A,(VRC_CURSOR) ; GET CURRENT NESTING VALUE + DEC A ; DECREMENT TO HIDE + LD (VRC_CURSOR),A ; SAVE IT + INC A ; BACK TO ORIGINAL VALUE + RET NZ ; ALREADY HIDDEN, NOTHING TO DO +; + ; WE TRANSITIONED FROM ZERO TO NEGATIVE. NEED TO ACTUALLY + ; HIDE THE CURSOR NOW. SINCE SHOWING AND HIDING ARE THE + ; SAME OPERATION (FLIP REV VID BIT), WE REUSE CODE ABOVE. +; + JR VRC_FLIPCUR +; +VRC_FLIPCUR: + ; SHOWING OR HIDING THE CURSOR IS THE SAME OPERATION. + ; SO WE USE COMMON CODE TO FLIP THE REV VID BIT. + LD HL,(VRC_POS) ; CURSOR POSITION + LD B,L ; INVERT FOR I/O + LD C,H + IN A,(C) ; GET VALUE + XOR $80 ; FLIP REV VID BIT + OUT (C),A ; WRITE NEW VALUE + RET +; +;---------------------------------------------------------------------- +; WRITE VALUE IN A TO CURRENT VDU BUFFER POSITION, ADVANCE CURSOR +;---------------------------------------------------------------------- +; +VRC_PUTCHAR: + ; WRITE CHAR AT CURRENT CURSOR POSITION. SINCE THE CURSOR + ; IS JUST THE HIGH BIT (REV VIDEO), WE FIRST TURN OFF THE + ; CURSOR, WRITE THE CHAR, UPDATE THE CURSOR POSITION, AND + ; FINALLY TURN THE CURSOR BACK ON AT THE NEW POSITION. +; + PUSH AF ; SAVE INCOMING CHAR + CALL VRC_HIDECUR ; HIDE CURSOR + POP AF + LD HL,(VRC_POS) ; GET CUR BUF POSITION + LD B,L ; INVERT FOR I/O + LD C,H + AND $7F ; SUPPRESS ATTRIBUTE (HI BIT) + LD L,A ; PUT VALUE IN L + LD A,(VRC_ATTR) ; GET CURRENT ATTRIBUTE + OR L ; COMBINE WITH CHAR VALUE + OUT (C),A ; WRITE VALUE TO BUFFER +; + ; SET CURSOR AT NEW POSITION + LD HL,(VRC_POS) ; GET CURRENT BUF OFFSET + INC HL ; INCREMENT + PUSH HL ; SAVE IT + LD DE,VRC_ROWS * VRC_COLS ; DE := BUF SIZE + OR A ; CLEAR CARRY + SBC HL,DE ; SUBTRACT FROM HL + JR C,VRC_PUTCHAR1 ; BYPASS IF NO WRAP + POP DE ; THROW AWAY TOS + LD HL,0 ; BACK TO START + JR VRC_PUTCHAR2 ; CONTINUE +VRC_PUTCHAR1: + POP HL ; NO WRAP, RESTORE +VRC_PUTCHAR2: + LD (VRC_POS),HL ; SAVE NEW POSITION + JP VRC_SHOWCUR ; SHOW IT AND RETURN +; +;---------------------------------------------------------------------- +; FILL AREA IN BUFFER WITH SPECIFIED CHARACTER AND CURRENT COLOR/ATTRIBUTE +; STARTING AT THE CURRENT FRAME BUFFER POSITION +; A: FILL CHARACTER +; DE: NUMBER OF CHARACTERS TO FILL +;---------------------------------------------------------------------- +; +VRC_FILL: + LD (VRC_FILL1+1),A ; SAVE FILL CHAR + PUSH DE ; SAVE INCOMING DE + CALL VRC_HIDECUR ; HIDE CURSOR + POP DE ; RESTORE INCOMING DE + LD HL,(VRC_POS) ; STARTING POSITION +; +VRC_FILL1: + LD A,$FF ; FILL CHAR + LD B,L ; INVERT FOR I/O + LD C,H + OUT (C),A ; PUT CHAR TO BUF +; + DEC DE ; DECREMENT COUNT + LD A,D ; TEST FOR ZERO + OR E + JP Z,VRC_SHOWCUR ; EXIT VIA SHOW CURSOR IF DONE +; + INC HL ; INCREMENT + PUSH HL ; SAVE IT + LD BC,VRC_ROWS * VRC_COLS ; BC := BUF SIZE + OR A ; CLEAR CARRY + SBC HL,BC ; SUBTRACT FROM HL + JR C,VRC_FILL2 ; BYPASS IF NO WRAP + POP BC ; THROW AWAY TOS + LD HL,0 ; BACK TO START + JR VRC_FILL3 ; CONTINUE +VRC_FILL2: + POP HL ; NO WRAP, RESTORE +VRC_FILL3: + LD (VRC_POS),HL ; SAVE NEW POSITION + JR VRC_FILL1 ; LOOP TILL DONE +; +;---------------------------------------------------------------------- +; SCROLL ENTIRE SCREEN FORWARD BY ONE LINE (CURSOR POSITION UNCHANGED) +;---------------------------------------------------------------------- +; +VRC_SCROLL: + ; SCROLL DOWN 1 LINE VIA HARDWARE + CALL VRC_HIDECUR ; SUPPRESS CURSOR + LD A,(VRC_LOFF) ; GET LINE OFFSET + INC A ; BUMP + CP VRC_ROWS ; OVERFLOW? + JR C,VRC_SCROLL1 ; IF NOT, SKIP + XOR A ; ELSE, BACK TO ZERO +VRC_SCROLL1: + LD (VRC_LOFF),A ; SAVE NEW VALUE + OR $80 ; SET HW SCROLL ENABLE BIT + OUT (VRC_SCROLLIO),A ; DO IT +; + ; ADJUST BUFFER OFFSET + LD HL,(VRC_OFF) ; BUFFER OFFSET + LD DE,VRC_COLS ; COLUMNS + ADD HL,DE ; ADD TO GET NEW OFFSET + PUSH HL ; SAVE IT + LD DE,VRC_ROWS * VRC_COLS ; DE := BUF SIZE + OR A ; CLEAR CARRY + SBC HL,DE ; SUBTRACT FROM HL + JR C,VRC_SCROLL2 ; BYPASS IF NO WRAP + POP DE ; BURN TOS + JR VRC_SCROLL3 ; CONTINUE +VRC_SCROLL2: + POP HL ; NO WRAP, RESTORE HL +VRC_SCROLL3: + LD (VRC_OFF),HL ; SAVE NEW OFFSET +; + ; FILL EXPOSED LINE + LD HL,(VRC_POS) ; GET CURSOR POS + PUSH HL ; SAVE IT + LD D,VRC_ROWS - 1 ; LAST ROW + LD E,0 ; FIRST COLUMN + CALL VRC_XY2IDX ; HL = START OF LAST LINE + LD (VRC_POS),HL ; SET FILL POSITION + LD A,' ' ; FILL WITH BLANKS + LD DE,VRC_COLS ; FILL ONE LINE + CALL VRC_FILL ; FILL LAST LINE + POP HL ; RECOVER CURSOR POS + LD (VRC_POS),HL ; PUT VALUE BACK +; + ; ADJUST CURSOR POSITION + LD HL,(VRC_POS) ; CURSOR POSITION + LD DE,VRC_COLS ; COLUMNS + ADD HL,DE ; NEW CURSOR POS + PUSH HL ; SAVE IT + LD DE,VRC_ROWS * VRC_COLS ; DE := DISPLAY SIZE + OR A ; CLEAR CARRY + SBC HL,DE ; SUBTRACT FROM HL + JR C,VRC_SCROLL4 ; BYPASS IF NO WRAP + POP DE ; BURN TOS + JR VRC_SCROLL5 ; CONTINUE +VRC_SCROLL4: + POP HL ; NO WRAP, RESTORE HL +VRC_SCROLL5: + LD (VRC_POS),HL ; SAVE NEW CURSOR POS + JP VRC_SHOWCUR ; EXIT VIA SHOW CURSOR +; +;---------------------------------------------------------------------- +; REVERSE SCROLL ENTIRE SCREEN BY ONE LINE (CURSOR POSITION UNCHANGED) +;---------------------------------------------------------------------- +; +VRC_RSCROLL: + ; SCROLL UP 1 LINE VIA HARDWARE + CALL VRC_HIDECUR ; SUPPRESS CURSOR + LD A,(VRC_LOFF) ; GET LINE OFFSET + DEC A ; BUMP + CP $FF ; OVERFLOW? + JR NZ,VRC_RSCROLL1 ; IF NOT, SKIP + LD A,VRC_ROWS - 1 ; ELSE, BACK TO LAST ROW +VRC_RSCROLL1: + LD (VRC_LOFF),A ; SAVE NEW VALUE + OR $80 ; SET HW SCROLL ENABLE BIT + OUT (VRC_SCROLLIO),A ; DO IT +; + ; ADJUST BUFFER OFFSET + LD HL,(VRC_OFF) ; BUFFER OFFSET + LD DE,VRC_COLS ; COLUMNS + OR A ; CLEAR CARRY + SBC HL,DE ; SUBTRACT TO GET NEW OFFSET + PUSH HL ; SAVE IT + JR NC,VRC_RSCROLL2 ; BYPASS IF NO WRAP + LD DE,VRC_ROWS * VRC_COLS ; DISPLAY SIZE + ADD HL,DE ; HANDLE WRAP + POP DE ; BURN TOS + JR VRC_RSCROLL3 ; CONTINUE +VRC_RSCROLL2: + POP HL ; NO WRAP, RESTORE HL +VRC_RSCROLL3: + LD (VRC_OFF),HL ; SAVE NEW OFFSET +; + ; FILL EXPOSED LINE + LD HL,(VRC_POS) ; GET CURSOR POS + PUSH HL ; SAVE IT + LD D,0 ; FIRST ROW + LD E,0 ; FIRST COLUMN + CALL VRC_XY2IDX ; HL = START OF FIRST LINE + LD (VRC_POS),HL ; SET FILL POSITION + LD A,' ' ; FILL WITH BLANKS + LD DE,VRC_COLS ; FILL ONE LINE + CALL VRC_FILL ; FILL FIRST LINE + POP HL ; RECOVER CURSOR POS + LD (VRC_POS),HL ; PUT VALUE BACK +; + ; ADJUST CURSOR POSITION + LD HL,(VRC_POS) ; CURSOR POSITION + LD DE,VRC_COLS ; COLUMNS + OR A ; CLEAR CARRY + SBC HL,DE ; NEW CURSOR POS + PUSH HL ; SAVE IT + JR NC,VRC_RSCROLL4 ; BYPASS IF NO WRAP + LD DE,VRC_ROWS * VRC_COLS ; DISPLAY SIZE + ADD HL,DE ; HANDLE WRAP + POP DE ; BURN TOS + JR VRC_RSCROLL5 ; CONTINUE +VRC_RSCROLL4: + POP HL ; NO WRAP, RESTORE HL +VRC_RSCROLL5: + LD (VRC_POS),HL ; SAVE NEW CURSOR POS + JP VRC_SHOWCUR ; EXIT VIA SHOW CURSOR +; +;---------------------------------------------------------------------- +; BLOCK COPY BC BYTES FROM HL TO DE +;---------------------------------------------------------------------- +; +VRC_BLKCPY: + PUSH BC + PUSH HL + CALL VRC_HIDECUR + POP HL + POP BC +; +VRC_BLKCPY1: + LD A,B + OR C + JP Z,VRC_SHOWCUR ; EXIT VIA SHOW CURSOR +; + PUSH BC ; SAVE LOOP CTL + LD B,L ; INVERT FOR I/O + LD C,H + IN A,(C) ; GET SOURCE CHAR + LD B,E ; INVERT FOR I/O + LD C,D + OUT (C),A ; WRITE DEST CHAR + POP BC ; RESTORE LOOP CTL +; + INC HL ; NEXT SRC CHAR + INC DE ; NEXT DEST CHAR + DEC BC ; DEC COUNT + JR VRC_BLKCPY1 ; LOOP TILL DONE +; +;================================================================================================== +; VGARC DRIVER - DATA +;================================================================================================== +; +VRC_ATTR .DB 0 ; CURRENT COLOR +VRC_POS .DW 0 ; CURRENT DISPLAY POSITION +VRC_OFF .DW 0 ; SCREEN START OFFSET INTO DISP BUF +VRC_LOFF .DB 0 ; LINE OFFSET INTO DISP BUF +VRC_CURSOR .DB 0 ; CURSOR NESTING LEVEL +VRC_ACTIVE .DB FALSE ; FLAG FOR DRIVER ACTIVE +; +;================================================================================================== +; VGA DRIVER - INSTANCE DATA +;================================================================================================== +; +VRC_IDAT: + .DB KBDMODE_VRC ; VGARC KEYBOARD CONTROLLER + .DB VRC_KBDST + .DB VRC_KBDDATA diff --git a/Source/HBIOS/ym2612.asm b/Source/HBIOS/ym2612.asm index afa4bd48..936dabae 100644 --- a/Source/HBIOS/ym2612.asm +++ b/Source/HBIOS/ym2612.asm @@ -38,6 +38,10 @@ YM_RDY_RST .DB 0 ; FLAG INDICATES IF DEVICE IS IN READY (NZ) OR RESET STATE (Z) YM_DEBUG .EQU 0 ; CHANGE TO 1 TO ENABLE DEBUGGING YM_RSTCFG .EQU 0 ; SET TO 1 FOR FULL REGISTER CLEAR YM_FAST3438 .EQU 0 ; FAST CPU'S WITH A YM3438 MAY REQUIRE A DELAY +; + .ECHO "YM: IO=" + .ECHO YMSEL + .ECHO "\n" ; ;------------------------------------------------------------------------------ ; Driver function table and instance data diff --git a/Source/HBIOS/z2u.asm b/Source/HBIOS/z2u.asm index d4ac9ac3..9e54ebb0 100644 --- a/Source/HBIOS/z2u.asm +++ b/Source/HBIOS/z2u.asm @@ -715,6 +715,15 @@ Z2U0_CFG: .DW Z2U0CFG ; LINE CONFIGURATION .DW Z2U0_RCVBUF ; POINTER TO RCV BUFFER STRUCT ; +; + .ECHO "Z2U: IO=" + .ECHO Z2U0BASE +#IF (INTMODE == 3) + .ECHO ", INTERRUPTS ENABLED" +#ENDIF + .ECHO "\n" + +; Z2U_CFGSIZ .EQU $ - Z2U_CFG ; SIZE OF ONE CFG TABLE ENTRY ; Z2U_CFGCNT .EQU ($ - Z2U_CFG) / Z2U_CFGSIZ diff --git a/Source/Images/AddRom.cmd b/Source/Images/AddRom.cmd new file mode 100644 index 00000000..1e620c00 --- /dev/null +++ b/Source/Images/AddRom.cmd @@ -0,0 +1,54 @@ +@echo off +setlocal + +set PATH=..\..\Tools\cpmtools;%PATH% +set BINLOC=..\..\Binary +set DISKIMG=hd1k_combo.img + +if "%1"=="" goto :usage + +if not exist %BINLOC%\%DISKIMG% goto :noimage + +if not exist %BINLOC%\%1.rom goto :nofile + +echo. + +cpmrm.exe -f wbw_hd1k_0 %BINLOC%/%DISKIMG% 0:rom.img +cpmcp.exe -f wbw_hd1k_0 %BINLOC%/%DISKIMG% %BINLOC%/%1.rom 0:rom.img + +if errorlevel 1 goto :err + +::cpmls.exe -f wbw_hd1k_0 %BINLOC%/%DISKIMG% 0:rom.img + +echo %1.rom has been added to %DISKIMG% as ROM.IMG in user area 0 +echo. +goto :eof + +:noimage +echo. +echo %BINLOC%\%DISKIMG% file not found!!! +echo. +goto :eof + +:nofile +echo. +echo %BINLOC%\%1.rom file not found!!! +echo. +goto :eof + +:usage +echo. +echo Usage: +echo AddRom romname +echo. +echo romname is the root filename of an existing ROM image in the %BINLOC% directory +echo. +echo Example: +echo AddRom RCZ80_std +echo. +goto :eof + +:err +echo. +echo An error occurred copying %1.rom into hd1k_combo.img! +echo. \ No newline at end of file diff --git a/Source/Images/Build.cmd b/Source/Images/Build.cmd index f3c39e87..b28ecc3a 100644 --- a/Source/Images/Build.cmd +++ b/Source/Images/Build.cmd @@ -1,8 +1,9 @@ @echo off setlocal -::call BuildDisk.cmd bp hd wbw_hd512 || exit /b -::goto :eof +:: call BuildDisk.cmd bp hd wbw_hd1k +:: copy /b hd1k_prefix.dat + ..\..\Binary\hd1k_bp.img + ..\..\Binary\hd1k_cpm22.img + ..\..\Binary\hd1k_zsdos.img + ..\..\Binary\hd1k_nzcom.img + ..\..\Binary\hd1k_cpm3.img + ..\..\Binary\hd1k_zpm3.img + ..\..\Binary\hd1k_ws4.img ..\..\Binary\hd1k_combo_bp.img || exit /b +:: goto :eof echo. echo Building Floppy Disk Images... @@ -13,11 +14,19 @@ call BuildDisk.cmd nzcom fd wbw_fd144 ..\zsdos\zsys_wbw.sys || exit /b call BuildDisk.cmd cpm3 fd wbw_fd144 ..\cpm3\cpmldr.sys || exit /b call BuildDisk.cmd zpm3 fd wbw_fd144 ..\zpm3\zpmldr.sys || exit /b call BuildDisk.cmd ws4 fd wbw_fd144 || exit /b -call BuildDisk.cmd qpm fd wbw_fd144 d_qpm\u0\qpm.sys || exit /b +call BuildDisk.cmd qpm fd wbw_fd144 ..\qpm\qpm_wbw.sys || exit /b +call BuildDisk.cmd z80asm hd wbw_fd144 || exit /b +call BuildDisk.cmd aztecc hd wbw_fd144 || exit /b +call BuildDisk.cmd hitechc hd wbw_fd144 || exit /b +call BuildDisk.cmd tpascal hd wbw_fd144 || exit /b +call BuildDisk.cmd bascomp hd wbw_fd144 || exit /b +call BuildDisk.cmd fortran hd wbw_fd144 || exit /b +call BuildDisk.cmd games hd wbw_fd144 || exit /b echo. echo Building Hard Disk Images (512 directory entry format)... echo. +call BuildDisk.cmd blank hd wbw_hd512 || exit /b call BuildDisk.cmd cpm22 hd wbw_hd512 ..\cpm22\cpm_wbw.sys || exit /b call BuildDisk.cmd zsdos hd wbw_hd512 ..\zsdos\zsys_wbw.sys || exit /b call BuildDisk.cmd nzcom hd wbw_hd512 ..\zsdos\zsys_wbw.sys || exit /b @@ -25,9 +34,14 @@ call BuildDisk.cmd cpm3 hd wbw_hd512 ..\cpm3\cpmldr.sys || exit /b call BuildDisk.cmd zpm3 hd wbw_hd512 ..\zpm3\zpmldr.sys || exit /b call BuildDisk.cmd ws4 hd wbw_hd512 || exit /b call BuildDisk.cmd dos65 hd wbw_hd512 ..\zsdos\zsys_wbw.sys || exit /b -call BuildDisk.cmd qpm hd wbw_hd512 d_qpm\u0\qpm.sys || exit /b - -if exist ..\BPBIOS\bpbio-ww.rel call BuildDisk.cmd bp hd wbw_hd512 || exit /b +call BuildDisk.cmd qpm hd wbw_hd512 ..\qpm\qpm_wbw.sys || exit /b +call BuildDisk.cmd z80asm hd wbw_hd512 || exit /b +call BuildDisk.cmd aztecc hd wbw_hd512 || exit /b +call BuildDisk.cmd hitechc hd wbw_hd512 || exit /b +call BuildDisk.cmd tpascal hd wbw_hd512 || exit /b +call BuildDisk.cmd bascomp hd wbw_hd512 || exit /b +call BuildDisk.cmd fortran hd wbw_hd512 || exit /b +call BuildDisk.cmd games hd wbw_hd512 || exit /b echo. echo Building Combo Disk (512 directory entry format) Image... @@ -36,15 +50,23 @@ copy /b ..\..\Binary\hd512_cpm22.img + ..\..\Binary\hd512_zsdos.img + ..\..\Bina echo. echo Building Hard Disk Images (1024 directory entry format)... echo. +call BuildDisk.cmd blank hd wbw_hd1k || exit /b call BuildDisk.cmd cpm22 hd wbw_hd1k ..\cpm22\cpm_wbw.sys || exit /b call BuildDisk.cmd zsdos hd wbw_hd1k ..\zsdos\zsys_wbw.sys || exit /b call BuildDisk.cmd nzcom hd wbw_hd1k ..\zsdos\zsys_wbw.sys || exit /b call BuildDisk.cmd cpm3 hd wbw_hd1k ..\cpm3\cpmldr.sys || exit /b call BuildDisk.cmd zpm3 hd wbw_hd1k ..\zpm3\zpmldr.sys || exit /b call BuildDisk.cmd ws4 hd wbw_hd1k || exit /b -call BuildDisk.cmd qpm hd wbw_hd1k d_qpm\u0\qpm.sys || exit /b +call BuildDisk.cmd qpm hd wbw_hd1k ..\qpm\qpm_wbw.sys || exit /b +call BuildDisk.cmd z80asm hd wbw_hd1k || exit /b +call BuildDisk.cmd aztecc hd wbw_hd1k || exit /b +call BuildDisk.cmd hitechc hd wbw_hd1k || exit /b +call BuildDisk.cmd tpascal hd wbw_hd1k || exit /b +call BuildDisk.cmd bascomp hd wbw_hd1k || exit /b +call BuildDisk.cmd fortran hd wbw_hd1k || exit /b +call BuildDisk.cmd games hd wbw_hd1k || exit /b -if exist ..\BPBIOS\bpbio-ww.rel call BuildDisk.cmd bp hd wbw_hd1k || exit /b +if exist ..\BPBIOS\bp*.rel call BuildDisk.cmd bp hd wbw_hd1k || exit /b copy hd1k_prefix.dat ..\..\Binary\ || exit /b diff --git a/Source/Images/Common/All/CLRDIR.COM b/Source/Images/Common/All/CLRDIR.COM index ca65cbed..9c00904f 100644 Binary files a/Source/Images/Common/All/CLRDIR.COM and b/Source/Images/Common/All/CLRDIR.COM differ diff --git a/Source/Images/Common/All/FDISK80.COM b/Source/Images/Common/All/FDISK80.COM index 7e862d67..2a565dae 100644 Binary files a/Source/Images/Common/All/FDISK80.COM and b/Source/Images/Common/All/FDISK80.COM differ diff --git a/Source/Images/Common/All/FLASH.COM b/Source/Images/Common/All/FLASH.COM index d1833a1b..ab46a910 100644 Binary files a/Source/Images/Common/All/FLASH.COM and b/Source/Images/Common/All/FLASH.COM differ diff --git a/Source/Images/Common/All/FLASH.DOC b/Source/Images/Common/All/FLASH.DOC index 5c2b5412..d149ad3d 100644 --- a/Source/Images/Common/All/FLASH.DOC +++ b/Source/Images/Common/All/FLASH.DOC @@ -17,6 +17,11 @@ FLASH4 has been tested and confirmed working on: It should work on many other machines that run RomWBW or UNA BIOS. If you test it on another machine please let me know the outcome. +FLASH030 (also included) is a Linux version of the same software. It is +targetted at my 68030 machine but should be very easy to port to other +machines. It expects a machine with a larger address space, and thus omits much +of the bank switching and other tricks required on Z80 platforms. + = Introduction = diff --git a/Source/Images/Common/All/SUPERSUB.COM b/Source/Images/Common/All/SUPERSUB.COM index 80336b52..77403973 100644 Binary files a/Source/Images/Common/All/SUPERSUB.COM and b/Source/Images/Common/All/SUPERSUB.COM differ diff --git a/Source/Images/Common/All/SUPERSUB.DOC b/Source/Images/Common/All/SUPERSUB.DOC index 7f554bb3..bdd30430 100644 --- a/Source/Images/Common/All/SUPERSUB.DOC +++ b/Source/Images/Common/All/SUPERSUB.DOC @@ -1,4 +1,4 @@ - SUPERSUB DOCUMENTATION (revised 09/13/81) + SUPERSUB DOCUMENTATION (revised 09/25/84) ---------------------- 09/05/81 @@ -11,6 +11,17 @@ are familiar with that utility and its use. ------------------ +Version 1.3 update: + +George Cary has added MP/M capability to version 1.2 of SuperSUB. In +version 1.3 I fixed a problem that caused SuperSUB to bomb when the +.SUB file did not end in a 1AH (which is an ascii end-of-file +character). It was depending on the 1AH to end the file, and ignoring +the physical end-of-file. Physical end-of-file will now terminate +properly. - Jeffrey J. Nonken + + ------------------ + Version 1.1 update: Control-character translation has been added. This facility works @@ -138,4 +149,4 @@ NOTES 5) Interactive mode may be aborted by typing control-C as the first character of a line. Also, all normal CP/M editing characters are available. - \ No newline at end of file + \ No newline at end of file diff --git a/Source/Images/Common/All/UNARC.COM b/Source/Images/Common/All/UNARC.COM index 8cc90746..27ee7afa 100644 Binary files a/Source/Images/Common/All/UNARC.COM and b/Source/Images/Common/All/UNARC.COM differ diff --git a/Source/Images/Common/All/UNARC.DOC b/Source/Images/Common/All/UNARC.DOC index 6c1263e7..a49ab54a 100644 --- a/Source/Images/Common/All/UNARC.DOC +++ b/Source/Images/Common/All/UNARC.DOC @@ -1,282 +1,112 @@ -File: UNARC.DOC -Subject: User Documentation for UNARC Program -Version: 1.6 -Date: March 27, 1987 ------------------------------------------------------------------------------- - - - UNARC - - CP/M Archive File Extraction Utility - - - Copyright (C) 1986, 1987 by Robert A. Freed - All Rights Reserved - - - -This file provides user-level documentation and operating instructions for -UNARC version 1.6, released March 27, 1987. Refer to the notice at the end of -this file regarding rights of use and distribution of this program. - -The release message file, UNARC.MSG, provides a list of all additional files -distributed with the current UNARC release and describes the program changes -from the previous version 1.4 and 1.5 releases. - - - -ABSTRACT --------- - -UNARC is a utility program for CP/M systems which allows the listing, typeout, -printing, checking, and extraction of subfiles contained in "archive" library -(*.ARC or *.ARK) files. These are commonly used for compressed file storage -on remote access bulletin board systems. UNARC provides the CP/M user the -ability to process such files after downloading them via modem from these -remote systems. - - - -REQUIREMENTS ------------- - -UNARC requires CP/M version 2 or higher. The program is offered in two -versions. The standard version, UNARC.COM, requires a Z80 processor (or -compatible equivalent, e.g. HD64180 or NSC800). An alternate version, -UNARCA.COM, is provided for systems with 8080 or 8085 processors (or 16-bit -systems using the NEC V20 for CP/M emulation). Identical capabilities are -provided by the two program versions. - - NOTE - - Although UNARCA.COM can execute on ANY system capable of - supporting CP/M, it is larger and significantly slower than - UNARC.COM and should be avoided by users of Z80-based systems. - -UNARC is written in Z80 assembly language and requires only 5K bytes of disk -storage (6K for UNARCA). As distributed, the program requires at least 30K -bytes of available memory space (TPA) for full support of all archive file -formats (31K TPA size for UNARCA). (Smaller systems may be able to use some -of the program's capabilities.) - - - -ABOUT ARC/ARK FILES -------------------- - -The files which UNARC processes utilize a format that was introduced by the -ARC shareware utility program, which executes on 16-bit computers running the -MS-DOS (or PC-DOS) operating system. This format has achieved widespread -popularity since the ARC program first appeared in March 1985, and it has -become the de facto standard for file storage on remote access systems -catering to 16-bit computer users. More recently this file format has -achieved increased popularity on RCP/M (Remote CP/M) systems. - - NOTE - - Most RCP/M system operators have adopted the convention of naming - CP/M archive files with the filetype ARK. This differentiates - these from MS-DOS archive files, which use the filetype ARC. This - is a naming convention only: There is no difference in format, - and UNARC will accept files of either type interchangeably. - -An archive is a group of files collected together into a single file in such a -way that the individual files may be recovered intact. In this respect, -archives are similar in function to libraries (*.LBR files), which have been -commonplace on CP/M systems since 1982, when the original LU library utility -program was introduced by Gary P. Novosielski. (However, the two file formats -are not compatible.) - -The distinguishing characteristic of an ARC archive is that its component -files are automatically compressed when they are added to the archive, so that -the resulting file occupies a minimum amount of disk space. Of course, file -compression techniques have also been commonplace in the CP/M world since -1981, when the public domain SQ and USQ "squeeze and unsqueeze" programs were -introduced by Richard Greenlaw. - -The SQ/USQ programs and their numerous popular descendants utilize a well- -known general-purpose form of data compression (Huffman coding). This -technique, which is also utilized in ARC files, performs well for many text -files but often produces poor compression of binary files (e.g. object program -.COM files). The ARC program also provides an advanced data compression -method, which it terms "crunching." This method (which is based on the -Lempel-Ziv-Welch or "LZW" algorithm) performs better than squeezing in most -cases, often achieving 50% or better compression of ASCII text files, 15-40% -compression of binary object files, and as much as 95% compression of bit- -mapped graphics image files. - -Five different methods are actually employed for storing files in an archive. -The method chosen for a particular file is the one which results in the best -compression for that file: - -(1) No compression ("unpacked"). The file is stored in its original form. - -(2) Run-length encoding ("packed"). Repeated sequences of 3-255 identical - bytes are compressed into a three-byte sequence. - -(3) Huffman coding ("squeezed"). Each 8-bit byte (after run-length encoding) - is encoded by a variable number of bits, with bit length (approximately) - inversely proportional to the frequency of occurence of the corresponding - byte. - -(4) LZW compression ("crunched"). Variable-length strings of bytes (in - theory, up to nearly 4000 bytes in length) are represented by a single - (maximum) 12-bit code (after run-length encoding). - -(5) LZW compression ("squashed"). This is a variation of crunching which - uses (maximum) 13-bit codes (and no run-length encoding). - -Note that since one of the five methods involves no compression at all, the -resulting archive entry will never be larger than the original file. - - NOTE - - The most recent release of the MS-DOS ARC program (version 5.20) - has eliminated squeezing as a compression technique. However, - UNARC continues to process squeezed files for compatibility with - archives created by earlier versions of ARC and by other MS-DOS - archiving programs (notably PKARC). - - The squashed compression method was recently introduced by the - MS-DOS programs PKARC and PKXARC. UNARC can process files which - use this method, although it is not universally accepted by other - MS-DOS archive extraction programs (including ARC). - -During its lifetime, the ARC program has undergone numerous revisions which -have employed different variations on some of the above methods, particularly -LZW compression. In order to retain compatibility with archives created by -earlier program revisions, ARC stores a "version" indicator with each file in -an archive. Based on this indicator, the latest release of the ARC program -can always extract files created by older releases (although it will only use -the latest data compression versions when adding new files to an archive). - - NOTE - - The current release of UNARC supports archive file versions - generated by all releases of the following MS-DOS programs through - (at least) the indicated program versions: - - ARC 5.20 (24 Oct 86), by System Enhancement Associates, Inc. - ARCA 1.22 (13 Sep 86), by Wayne Chin and Vernon Buerg - ARCH 5.38 (26 Jun 86), by Les Satenstein - PKARC 2.0 (15 Dec 86), by Phil Katz (PKWARE, Inc.) - - (UNARC does not recognize, but is unaffected by, the non-standard - archive and file commenting feature of PKARC.) - -Although the above discussion has emphasized the origin of archive files for -the MS-DOS operating system, their use has recently spread to many other -systems. Programs compatible with MS-DOS ARC have appeared for UNIX, Atari -68000, VAX/VMS, and TOPS-20 systems. A CP/M utility for building archive -files will also be available in the near future. - -For additional information about archive files and the MS-DOS ARC utility, -refer to the documentation file, ARC.DOC, which is available from most remote -access systems which utilize archive files. For additional information about -the LZW algorithm (and data compression methods in general), refer to the -article "A Technique for High-Performance Data Compression", by Terry A. -Welch, in IEEE Computer magazine, Vol. 17, No. 6, June 1984. - - - -USING UNARC ------------ - -The UNARC program provides an on-line help message, which is generated by -running the program with an empty command line: - - - A>UNARC - - UNARC 1.6 27 Mar 87 - CP/M Archive File Extractor - - Usage: UNARC [d:]arcfile[.typ] [d:][afn] [N|P|C] - - Examples: - B>UNARC A:SAVE.ARK *.* ; List all files in CP/M archive SAVE on drive A - B>UNARC A:SAVE.ARC *.* ; List all files in MS-DOS archive SAVE on drive A - A>UNARC SAVE ; Same as either of above - A>UNARC SAVE *.* N ; Same as above (no screen pauses) - A>UNARC SAVE *.DOC ; List just .DOC files - A>UNARC SAVE READ.ME ; Typeout the file READ.ME - A>UNARC SAVE READ.ME N ; Typeout the file READ.ME (no screen pauses) - A>UNARC SAVE A: ; Extract all files to drive A - A>UNARC SAVE B:*.DOC ; Extract .DOC files to drive B - A>UNARC SAVE C:READ.ME ; Extract file READ.ME to drive C - A>UNARC SAVE PRN.DAT P ; Print the file PRN.DAT (no formatting) - A>UNARC SAVE *.* C ; Check validity of all files in archive - - -As shown by this help display, the UNARC utility provides the following -capabilities: - -(1) Listing the directory of an archive -(2) Extracting component files from an archive -(3) Typing the contents of a component file at the console -(4) Printing a component file directly on the CP/M list device -(5) Checking the validity of an archive and its component files - -The particular operation to be performed is determined by the form of the file -parameter(s) in the command line, as described separately in the sections -which follow. The following characteristics apply to all operations: - -The first command line parameter must specify the name of an archive file. A -drive name and filetype are optional. The filetype, if omitted, defaults to -"ARK" or, if no such file exists, the alternate (MS-DOS) default "ARC" is -assumed. - -The standard CP/M terminal control characters, CTRL-S (to suspend console -output) and CTRL-C (to abort the program), may be used at any time. CTRL-K -may also be used as an alternate for CTRL-C. Printer output to the CP/M list -device may be obtained by typing CTRL-P at CCP command level before executing -UNARC. - -In addition, by default UNARC will pause after every 23 lines of console -output. At this time, the message "[more]" will appear at the bottom of the -console screen. The listing may be resumed by typing any key (other than -CTRL-S, CTRL-C, or CTRL-K, which will function as described above). If the -space bar is used, one more line of console output will be displayed (over- -writing the "[more]" message) and the program will again pause. If any other -key is typed (e.g. RETURN), another 23 lines of output will be allowed to -scroll onto the screen before the next pause. (LINE FEED may be used to -prevent overprinting of the "[more]" line, e.g. for hard-copy terminals.) - -If continuous display is desired, this automatic pause feature may be disabled -by specifying "N" at the end of the command line. The "N" must be the last -command line character, and it must be preceded by a space. Also, there must -be two preceding file parameters on the command line. E.g., note the -difference between the following commands: - - A>UNARC SAVE N ; Typeout the file N. in archive SAVE - A>UNARC SAVE *.* N ; List all files in archive SAVE with no pauses - -The N option may not be used in conjunction with the P (Print) or C (Check) -options. - - - -LISTING AN ARCHIVE DIRECTORY ----------------------------- - -By default, UNARC produces a detailed console listing of the component files -in an archive. (In fact, there is no way to suppress this listing; it is -generated during all UNARC operations.) If only the archive file name appears -on the command line, UNARC will generate a complete directory of all component -files in the specified archive file. Otherwise, the second command line -parameter may be used to select a particular file to be listed (or group of -files, if it contains the ambiguous file specification characters "*" or "?"). -If no disk drive name is provided for the second parameter, and this parameter -specifies a group of files, the directory listing is the only output generated -by the program. - -A sample directory listing is illustrated here: - - -A>UNARC CODES - -Archive File = CODES.ARK + UNARCU + Universal Archive File Extraction Utility + Version 1.0 + + Modified for Universal use by Lars Nelson + September 17, 2023 + Modified for ZCPR3 by Gene Pizzetta + December 9, 1990 + Original CP/M 2.2 version is + Copyright (C) 1986, 1987 by Robert A. Freed + All Rights Reserved + + +UNARCU allows the listing, typeout, printing, checking, and extraction of +member files contained in ARK and ARC archive files. These are commonly +used for compressed file storage on remote access bulletin boards. This is +a universal version and runs on the following CP/M compatible systems: + + CP/M 2.2 with DRI CCP or ZCPRD&J + ZSDOS 1.2 and 2.0 with DRI CCP, ZCPRD&J or Zsystem + CP/M 3 with DRI CCP or Z3Plus + ZPM3 with DRI CCP or ZCCP + +DU file specification is supported on all systems. If Zsystem is active +then named directories can be used and the bad directories flag is +automatically checked. + +If datestamping is available then extracted files will recieve the ARK file's +stored date stamp. The program handles DateStamper, NZTIME and CP.M Plus +date stamping methods. + +UNARCU requires at least 32K of free memory (TPA) for full support of all +archive file formats, but smaller systems may be able to use some of the +program's capabilities. + +USAGE: + + UNARCU {DU: or dir:}arcfile{.typ} {DU: or dir:}{afn.aft} {{/}options} + +If a DIR or DU specification is not given for the archive file, the current +drive/user is assumed. The second filename, which can be ambiguous, +refers to a member file or files in the archive. DIR: file specification +only available when Zsystem is active. DU: specification always available. + +If a DU or DIR specification is provided for the member filespec, it will be +extracted to that directory. To extract to the current directory, only a +colon is required. If a directory specification is given without a filename, +all files ("*.*") is assumed. + +If no DU or DIR specification is given, UNARCU acts differently depending +on whether the member name is ambiguous or not. If the member name is +unambiguous, and the filetype is not restricted, the file will be typed to +the screen. If the member name is ambiguous, or if no member name is +given at all, a directory of the ARK will be displayed. + +If no filetype is given for the archive file, UNARCU first tries ARK and then +ARC. + +An on-line help message will be displayed if UNARCU is called with no +command tail or if the command tail is "//". + +OPTIONS: Options may or may not be preceded by a slash, but the slash is +required if the options are not the third token (element) on the command +line. + + C Check the validity of the archive and the given member + files. If a member filespec is not given, all files + ("*.*") is assumed. + + E Toggle erasing of existing files without asking on and + off. UNARCU may be configured to automatically erase, + during member file extraction, existing files in the + target directory that have the same name. Or it can + be configured to ask first. This option will turn off + user query before erasure, if it is on by default, and + vice versa. + + N Toggle console paging on or off. UNARCU may be + configured to default to console paging or not. This + option will turn paging off, if the the default is on, + and vice-versa. Paging effects both archive directory + display and member file type-out. During member file + extraction, console paging is always off. + + P Sends a member file to the printer (LST device). The + member name cannot be ambiguous. The file will be + printed continuously, with no formatting or paging. + +UNARCU can be aborted at any time with ^C or ^K. + +If screen paging is enabled, UNARCU pauses after the screen fills. The +listing may be resumed by typing any key other than ^S, ^C, or ^K. The +space bar displays one more line of output (overwriting the "[more]" +message) and the program will again pause. For hard copy terminals, line +feed may be used to prevent overprinting of the "[more]" line. If paging +is disabled, the display can be paused with ^S. + +LISTING AN ARCHIVE DIRECTORY: UNARC always produces a detailed +console listing of all the member files of an archive, or of those members +which match the second file specification, if one is given. If no member +name is given, or if the member name is ambiguous, then UNARCU only lists +the directory, without doing anything else. (That is, unless the C option is +included.) + +A sample directory listing: + +A0>UNARCU CODES +Archive File = A0:CODES.ARK Name Length Disk Method Ver Stored Saved Date Time CRC ============ ======= ==== ======== === ======= ===== ========= ====== ==== ABLE .DOC 24320 24k Crunched 8 11777 52% 30 Apr 86 10:50a 42C0 @@ -285,97 +115,82 @@ CHARLIE .TXT 234 1k Packed 3 99 58% 2 May 86 4:11p 8927 ==== ======= ==== ======= === ==== Total 3 41706 42k 26626 36% 58A4 - -This listing is equivalent to the "verbose" listing of the MS-DOS ARC program -(with the addition of the "Disk" and "Ver" fields, which are unique to UNARC). -The listing requires a 78-column terminal width; there is currently no "short" -listing format. - -"Name" is the file name which will be generated if the file is extracted by -UNARC on a CP/M system. (This is not necessarily the same as the name -recorded in the archive file. Although CP/M and MS-DOS file naming -conventions are identical, two conversions are made to guarantee file name -validity under CP/M: Lower-case letters are converted to upper-case, and -non-printing characters are converted to dollar signs, "$".) Archive entries -are usually maintained (and hence listed) in alphabetic name order. - -"Length" is the uncompressed file length, i.e. the number of bytes the file -will occupy if extracted to disk, exclusive of any additional length imposed -by the CP/M file system. Note that MS-DOS permits files of arbitrary lengths -(unlike CP/M which restricts all files to a multiple of 128 bytes). - -"Disk" is the actual amount of disk space required to extract the file to a -CP/M disk, expressed as a multiple of 1K (1024) bytes. Note that this number -is dependent on the disk data allocation block size. (CP/M permits various -block sizes, ranging from 1K to 16K bytes. Typical sizes are 1K for single- -density floppy disks, 2K for double-density floppies, and 4K for hard disks, -although these values are quite system-dependent.) In the absence of an -explicit output drive name, UNARC uses the block size of the default -(currently "logged") disk drive (i.e. the drive which appears in the CCP -prompt). - -"Method" is the compression method used, specified as "Unpacked", "Packed", -"Squeezed", "Crunched", "Squashed", or "Unknown!". If the method "Unknown!" -appears, it most likely indicates (if not a faulty archive file) a newer -release of the MS-DOS ARC program that supports a new compression method (or a -new variation of an existing method). In this case, a corresponding new -release of UNARC will be required to extract the file. - -"Ver" further identifies the version of compression used. Currently, UNARC -supports versions 1-9: unpacked files can have versions 1 or 2; packed files, -version 3; squeezed files, version 4; crunched files, versions 5-8; and -squashed files, version 9. The highest version number associated with each -compression method is the one generated by the most recent release of the -MS-DOS ARC program. - -"Stored" is the compressed file length, i.e. the number of bytes occupied by -the file in the archive. (This does not include the overhead associated with -the directory information itself, which adds an additional 29 bytes to the -size of each component file.) - -"Saved" is the percentage of the original file length which was saved by -compression; i.e., higher values indicate better compression. (The MS-DOS ARC -documentation refers to this as the "stowage factor.") The value shown on the -totals line applies to the archive as a whole, not including the directory +The listing is equivalent to the "verbose" listing of the MS-DOS ARC +program, with the addition of the "Disk" and "Ver" fields, which are unique +to UNARCU and previous UNARC versions. The listing requires 78-columns +of terminal width. + +"Name" is the filename which will be generated if the file is extracted by +UNARCU. This is not necessarily the same as the name recorded in the +archive file. Although CP/M and MS-DOS file naming conventions are +identical, two conversions are made to guarantee filename validity: Lower- +case letters are converted to upper-case and non-printing characters are +converted to dollar signs ("$"). Archive entries are usually maintained and +listed in alphabetical order. + +"Length" is the uncompressed file length, i.e., the number of bytes the file +will occupy if extracted to disk, exclusive of any additional length imposed +by the file system. MS-DOS permits files of arbitrary lengths, but CP/M +restricts files to multiples of 128 bytes. + +"Disk" is the actual amount of space required to extract the file to a CP/M +disk, expressed as a multiple of 1K (1024) bytes. The number is dependent +on the output drive's allocation block size, which can range from 1K to 16K +bytes. Typically, 1K is used for single-density floppy disks, 2K for +double-density floppies, and 4K for hard disks. In the absence of an +explicit output drive, UNARCU uses the block size of the currently logged +drive, or a configured default size. + +"Method" is the compression method used: "Unpacked", "Packed", +"Squeezed", "Crunched", "Squashed", or "Unknown!". If the method +"Unknown!" appears, it likely indicates a faulty archive file or a newer +compression method not yet supported by UNARCU. + +"Ver" is the version of compression method used. UNARC supports versions +1-9: unpacked files, versions 1 or 2; packed files, version 3; squeezed +files, version 4; crunched files, versions 5 and squashed files, version 9. + +"Stored" is the compressed file length, that is, the number of bytes +occupied by the file in the archive, not including the directory information +overhead, which adds an additional 29 bytes to each member file. + +"Saved" indicates the percentage of the original file length which was saved +by compression. Higher values indicate better compression. The MS-DOS +ARC documentation refers to this as the "stowage factor". The value shown +in the totals applies to the archive as a whole, excluding directory overhead. -"Date" and "Time" refer to the last file modification, as of the time it was -added to the archive. (Date and time stamping is, of course, one of the nice -features of MS-DOS which is lacking in standard CP/M 2.2.) - -"CRC" is an internal 16-bit cyclic redundancy check value which is computed -when a file is added to an archive (expressed in hexadecimal). As a test of -file validity, UNARC re-computes this value when it extracts a file (see -below). Note that this value is calculated by a different method than that -used by either of the two popular public domain programs, CRCK and CHEK. (It -is however quite valid as a reliable error-detection mechanism.) This value -is shown in the listing for completeness only. The value shown on the totals -line is the 16-bit sum of all displayed CRC values. This is useful as a -single "checksum" value for comparing entire archives. (Since the CRC values -are computed before compression takes place, the total should be the same for -all archives created from the same set of input files, independent of any -particular variations in file order or compression methods.) - -The "Total" line is displayed only if multiple files appear in the listing, -and it includes a count of the number of files listed. - - - -EXTRACTING FILES FROM AN ARCHIVE --------------------------------- - -If the second command line parameter contains a disk drive name, UNARC will -extract the selected file(s) from the archive to CP/M file(s) on the indicated -disk drive. If only a drive name appears, all component files of the archive -will be extracted. The following illustrates a sample archive directory -listing as generated during a file extraction operation: - - -A>UNARC CODES B: - -Archive File = CODES.ARK -Output Drive = B: - +"Date" and "Time" are the file modification stamp at the time it was added +to the archive. + +"CRC" is an internal 16-bit cyclic redundancy check value computed when a +file is added to an archive, expressed in hexadecimal. UNARCU checks file +validity by recomputing this value when it extracts a file. The value is +calculated by a different method than that used by either of the two +popular public domain programs, CRCK and CHEK, but it is a quite valid and +reliable error-detection mechanism. The value is given for completeness +only. The total in the last line is the 16-bit sum of the displayed CRC +values and is useful for comparing entire archives. Since the CRC values +are computed before compression, the total should be the same for all +archives created from the same set of input files, without regard for +variations in file order or compression methods. + +The "Total" line is displayed only if more than one file appears in the +listing. + +EXTRACTING FILES FROM AN ARCHIVE: If the second command line +parameter contains a DU or DIR specification UNARCU will extract the +selected member file or files to to the indicated disk directory. If the +directory specification is given without a filename, all member files will be +extracted to the indicated directory. If only a colon is given, the current +drive/user will be assumed. + +Below is a directory listing as might be generated during file extraction, +along with some possible warning messages: + +A0>UNARCU CODES B1: +Archive File = A0:CODES.ARK +Output Directory = B1: Name Length Disk Method Ver Stored Saved Date Time CRC ============ ======= ==== ======== === ======= ===== ========= ====== ==== ABLE .DOC 24320 24k Crunched 8 11777 52% 30 Apr 86 10:50a 42C0 @@ -388,236 +203,235 @@ CHARLIE .TXT 234 2k Packed 3 99 58% 2 May 86 4:11p 8927 ==== ======= ==== ======= === ==== Total 3 41706 44k 26616 36% 58A4 - -The above listing also illustrates several warning messages which may occur -when extracting files from an archive. - -The message "Replace existing output file (y/n)?" appears if a file of the -same name already exists on the output drive. The user must answer "Y" (or -"y") to allow the extraction to proceed (in which case, the existing file is -unceremoniously deleted). Any other response will cause UNARC to preserve the -existing file, bypass the extraction operation for the current file, and -(except for a CTRL-C response) skip to the next file to be extracted (if any). - -The first two warning messages illustrated above are provided as a check on -the validity of the extracted file. These indicate that either the cyclic -redundancy check (CRC) value computed by UNARC, or the resulting extracted -file length, does not match the corresponding value recorded in the archive -when the original file was added to it. The final warning message occurs if -UNARC fails to detect the proper format for the start of a new subfile, but -can recover by skipping a certain number of bytes in the archive file. (If -the recovery attempt fails, UNARC aborts with the message "Invalid archive -file format.") The appearance of any of these messages most likely indicates -that the file data has been corrupted in some way (e.g. during modem -transmission from a remote system). - -Note that if the original (i.e. MS-DOS) file length was not an exact multiple -of 128 bytes (as required by CP/M), UNARC will pad the final record of the -extracted file with hex "1A" (ASCII CTRL-Z) bytes. This provides the correct -end-of-file termination for text files, according to CP/M conventions. - -Also, the disk space shown in the archive directory listing will be correct -for the specified disk drive. (In the above examples, drive A: has a 1K data -allocation block size while drive B: has a 2K block size, which accounts for -the differences in the two listings.) In order to determine the exact disk -space requirements in advance of a file extraction operation, the user may -first "log into" the desired output drive (i.e. select it as the default -drive), and run UNARC to obtain a directory listing only. (This is a -consideration only on systems with mixed disk drive types.) - -A file extraction operation may be aborted at any time by entering CTRL-C from -the console. In this case, any partial output file will remain on disk and -should be deleted manually following the program abort. (Any existing file of -the same name will have already been deleted, however.) - - - -TYPING OUT A FILE IN AN ARCHIVE -------------------------------- - -A console typeout of the contents of a single component file in an archive may -be requested by specifying a non-ambiguous file name (and no disk drive name) -in the second command line parameter. For example: - - -A>UNARC CODES ABLE.DOC - -Archive File = CODES.ARK - +"Replace existing output file (y/n)?" appears if a file of the same name +exists in the output directory, requiring a "Y" or "N" response. Any +response other than "Y" will be consided to be the same as "N". If UNARCU +has been configured to erase without query, this message will not appear. + +The first two of the "Warning:" messages above indicate that either the +cyclic redundancy check (CRC) value or the extracted file length does not +match the value recorded in the archive header when the original file was +added. The third warning message is displayed if the proper format for +the beginning of a new member is not detected, but UNARCU recovered by +skipping a certain number of bytes in the archive file. If a recovery +attempt fails, UNARC aborts and issues a different message, "Invalid archive +file format". The appearance of any of these messages probably means the +file data has been corrupted in some way. + +If the original MS-DOS file length was not an exact multiple of 128 bytes, +the final record of the extracted file will be padded with 1Ah characters +(ASCII ^Z). + +Disk space in the listing will be correct for the specified output directory. +In the two examples above, drive A has 1K allocation blocks while drive B +has a 2K blocks, which accounts for the differences in the two listings. To +determine the exact disk space requirements before extracting files, log +into the desired output drive and take an UNARCU directory listing of the +ARK file. + +If a file extraction is aborted with ^C, any partial output file will have to +be deleted manually. + +TYPING MEMBER FILES: Typing the contents of a member file in an archive +to the console may be requested by giving a non-ambiguous filename and no +output disk directory as the second command line parameter. For example: + +A0>UNARCU CODES ABLE.DOC +Archive File = A0:CODES.ARK Name Length Disk Method Ver Stored Saved Date Time CRC ============ ======= ==== ======== === ======= ===== ========= ====== ==== ABLE .DOC 24320 24k Crunched 8 11777 52% 30 Apr 86 10:50a 42C0 ------------------------------------------------------------------------------- This is file ABLE.DOC, contained within the archive CODES.ARK. Typeout will - proceed until the end of this file or may be aborted by CTRL-C..... - - -The specified file is assumed to contain valid ASCII text data. In -particular, all bytes are masked to seven bits, and all ASCII control -characters are ignored except for HT (horizontal tab, which is expanded to -blanks with assumed tab stops at every eighth column), LF, VT or FF (line -feed, vertical tab or form feed, which generate a new typeout line), and SUB -(CTRL-Z, which by CP/M convention indicates end-of-file and terminates the -typeout). Note that BS (backspace) and CR (carriage return) are ignored, so -that text will not be obscured within files which utilize these for over- -printing (i.e. when directed to a printer). - -The following filetypes, which are usually associated with binary (non-text) -data, are specifically excluded from typeout operations: COM, EXE, OBJ, OV?, -REL, ?RL, INT, SYS, BAD, LBR, ARC, ARK, ?Q?, and ?Z?. If one of these types -is specified, only the directory information for the requested file is listed. - -Note that CRC and file length checking are not performed during a typeout -operation, as they are during extraction to a disk file. - - - -PRINTING A FILE IN AN ARCHIVE ------------------------------ - -A single component file in an archive may be output directly to the printer -(CP/M list device) by specifying a trailing "P" on the command line. The "P" -must be the last command line character, and it must be separated from the -second file parameter by a space. (The file parameter must specify a non- -ambiguous file name and no disk drive name.) For example: - - A>UNARC CODES CHARLIE.TXT P - -The specified file is assumed to contain data suitable for printer output and -is passed directly to the printer without alteration or additional formatting. -This operation is particularly well-suited for output of binary graphics -images on dot-matrix printers, since these can be extemely large but tend to -compress quite well (e.g. to less than 5% of their original size). Note that -the binary data filetypes which are excluded from typeout operations are also -excluded from printing operations. Printing may be paused or aborted by use -of the console CTRL-S and CTRL-C characters. - - - -CHECKING FILES IN AN ARCHIVE ----------------------------- - -UNARC may be directed to extract one or more component files from an archive, -without actually storing these as disk files, by specifying a trailing "C" on -the command line. This operation performs file CRC and length checking, and -it is useful for verifying correct modem data transmission of an archive. The -"C" must be the last command line character, and it must be separated from the -second file parameter by a space. (The file parameter must not specify a disk -drive name, which indicates extraction to disk.) To check an entire archive, -specify "*.*" for the second file parameter, for example: - - A>UNARC CODES *.* C - - - -PROGRAM OPTIONS ---------------- - -UNARC provides several options which may be used to tailor the program for -specific non-universal requirements. Many of these are intended for RCP/M -(Remote CP/M) system operators, to allow generation of a secure version of -UNARC which can be used by remote callers for purposes of archive directory -listing and/or file typeout only (but not file extraction). Others are -provided for specialized non-standard CP/M systems and need not concern the -majority of users running CP/M 2.2, CP/M 3.0 (CP/M Plus), or ZCPR3/ZRDOS -systems. Additional options provide user preference features (such as the -number of screen lines between console output pauses, or the list of filetypes -excluded from typeout operations). - -All of these options are described in UNARCOVL.ASM, an assembly language -source file that can be edited and assembled to generate a HEX-format overlay -for easy patching of the UNARC.COM or UNARCA.COM program files. Complete -details are provided for technically-oriented users in UNARCOVL.ASM. However, -the default options in the distributed program files are suitable for the -majority of users with standard CP/M operating systems. - - - -PROGRAM DISTRIBUTION --------------------- - -The UNARC program, its documentation, and all related files are distributed in -archive file format (of course!). The distribution file is named UNARCxx.ARK, -where "xx" is derived from the current version number (e.g. UNARC16.ARK for -version 1.6). (This does not include the program source code, which is -distributed separately.) This archive has the special characteristic that it -is "self-unpacking." I.e., a separate copy of the UNARC.COM program file is -NOT required to extract the component files from this archive. - -The procedure for extracting the distribution files is quite simple: First, -copy or rename UNARCxx.ARK to a program file, UNARCxx.COM, on the current disk -drive. (Note that the filename, UNARCxx, must NOT be changed.) Then, run -this program with a single optional command line parameter specifying the disk -drive to which all distribution files will be extracted (defaults to current -drive). - -For example, assuming UNARC16.ARK is on drive B: and the files are to be -extracted to drive C:, the following CP/M commands may be used: - - A>B: ; Set current drive for UNARC16.ARK - B>REN UNARC16.COM=UNARC16.ARK ; Rename it to UNARC16.COM - B>UNARC16 C: ; Run it to extract all files to drive C: - -Note that this self-unpacking capability is provided only by the distributed -archive file, and it will not work if that file is altered or reconstructed. - - - -AUTHOR'S NOTE -------------- - -I undertook writing the UNARC program to satisfy my curiosity about software -developments in the MS-DOS/PC-DOS world. At the time I began work on UNARC, -the MS-DOS ARC program had been in existence for over a year and had achieved -widespread popularity and acceptance in the 16-bit community. Unfortunately, -the lack of a compatible equivalent for CP/M systems rendered a large amount -of public domain software inaccessible to 8-bit users such as myself. (Note -that 16-bit software can indeed be of interest to users of 8-bit systems, e.g. -Pascal and C language programs.) - -Also, an increasing number of RCP/M systems now cater to both 8-bit and 16-bit -users. Since the release of UNARC 1.0 (May 3, 1986), I have been encouraged -to see that the program has found a welcome home on many such systems. -Special thanks are due to Irv Hoff and Norman Beeler for providing archive -file support in the KMD20 and LUX52 series of programs, respectively. With -the increasing popularity of .ARC files on many different computer systems, I -believe that continued such support of this compression format is both -desirable and inevitable for CP/M systems. At the time of this writing I am -about to release NOAH, a companion program to UNARC which will allow CP/M -users to generate ARC-compatible files. - - Bob Freed - March 27, 1987 - - - - NOTICE - - The UNARC program and its associated documentation is the copy- - righted property of its author -- it is NOT in the public domain. - HOWEVER... Free use, distribution, and modification of these - files is permitted (and encouraged), subject to the following - conditions: - - (1) Such use or distribution must be for non-profit purposes only. - (2) The author's copyright notice may not be altered or removed. - (3) Modifications to this program or its documentation files may - not be distributed without notification of and approval by - the author. - (4) The source program code may not be used, in whole or in part, - in any other publicly-distributed or derivative work without - similar notification and approval. - - No fee is requested or expected for the use and distribution of - this program subject to the above conditions. The author reserves - the right to modify these conditions for any future revisions of - this program. Questions, comments, suggestions, commercial - inquiries, and bug reports or fixes are welcomed by the author: - - Robert A. Freed - 62 Miller Road - Newton Centre, MA 02159 - Telephone (617) 332-3533 - ------------------------------------------------------------------------------- - \ No newline at end of file + proceed until the end of this file, so you'd better be patient. For somebody + who has nothing to say, I've written an awfully big file here. If you don't + want to read all 24K of it, you can type ^C .... + +The specified file is assumed to contain valid ASCII text data. All bytes +are masked to seven bits and all control characters are ignored except +horizontal tabs, which are expanded to blanks with stops at every eighth +column), and line feeds, vertical tabs, and form feeds, all of which generate +a new line. SUB (^Z) is interpreted as the end of the file. Backspaces and +carriage returns are ignored, so text will not be obscured. + +UNARCU will refuse to type files whose filetype indicates are not ASCII text +files, including COM, CMD, EXE, OBJ, OVL, REL, PRL, CRL, IRL, INI, SYS, +BAD, ARK, ARC, LBR, ?Q?, ?Y? and ?Z?. If one of these or other restricted +types is given, directory information only is listed. + +CRC and file length checking are not performed when a file is typed to the +screen. + +PRINTING MEMBER FILES: A single member file may be sent to the printer +(CP/M LST device) with the "P" option as the third parameter on the +command line with or without a preceding slash. In addition, the member +name must be non-ambiguous and must not be preceded by a drive or user +specification. For example: + A0>UNARCU CODES CHARLIE.TXT P +or + A0>UNARCU CODES CHARLIE.TXT /P + +The contents of the specified file is passed directly to the printer without +alteration, additional formatting, or even paging. The user should make +sure it contains data suitable for printer output. This unfiltered operation +is particularly well-suited for the output of binary graphics images to +dot-matrix printers. These files can be extremely large, but compress quite +well, often to less than 5% of their original size. The same filetypes +excluded from typing are also excluded from printing. Printing may be +paused or aborted with ^S and ^C respectively. + +CHECKING MEMBER FILES: With the "C" option UNARCU can be directed to +extract one or more member files from an archive, without actually storing +them as disk files. This operation performs file CRC and length checking, +so it is useful for verifying correct modem data transmission of an archive. +If the "C" is the second parameter on the command line, it must be +preceded by a slash. In that case all files in the archive will be checked. +If a member filename is given, it may be ambiguous, but it cannot be +preceded by a disk directory specification. For example: + A0>UNARCU CODES *.DOC C +or + A0>UNARCU CODES /C + +FILE DATE STAMPING: ARK and ARC files contain only a member file's +modification date and time. When a member is extracted under ZSDOS or +CP/M 3 with date stamping, its modification date will be transferred to disk +as both the create and modification file date stamps. If the modification +date is not included in the archive, then the extracted file will be stamped +with the current date and time. + +SECURITY: Z-Node security is handled automatically by UNARCU when +Zsystem is running. If the Wheel byte is off (reset), file extraction, +archive checking, and file printing are all disabled. In addition, UNARCU +can be configured to disable file type-out or to limit type-out to a maximum +number of lines. + + +Directory security depends on the file specification parsing of ZCPR 3.3 or +higher to indicate that the DU or DIR are illegal. Security should be +adequate, however, under other CPR's. + +PROGRAM CONFIGURATION OPTIONS: Several configuration bytes are +available to tailor the program for specific requirements, particularly for +RCP/M systems. With the Wheel byte off, UNARCU can be used by remote +callers only for archive directory listing and, optionally, for member file +typeout. + +Configuration bytes also determine the default conditions for the N and E +command line options and the filetypes excluded from type-out. + +Other configuration points are provided for non-standard systems and need +not concern the majority of users running ZCPR3, NZ-COM, or Z3PLUS. + +Patching is accomplished using ZCNFG and the configuration file, +UNARCUnn.CFG, where nn is the current version. The options are discussed +in detail in the CFG file help screens. ZCNFG will find the CFG file +automatically, even if you change the name of the program, as long as you +do not change the name of the CFG file. + +For most users no configuration is necessary. + +ABOUT ARC/ARK FILES: The files which UNARCU processes utilize a format +that was introduced by the ARC shareware utility program, which executes +on 16-bit computers running the MS-DOS (or PC-DOS) operating system. +This format has achieved widespread popularity since the ARC program +first appeared in March 1985, and it has become the de facto standard for +file storage on remote access systems catering to 16-bit computer users. +This file format also achieved popularity on RCP/Ms (Remote CP/M) systems. +While ARC files have given way to ZIP files in general, many ARC files are +available on the web containing CP/M software. + +RCP/M system operators adopted the convention of naming CP/M archive +files with the filetype ARK. This differentiates these from MS-DOS archive +files, which use the filetype ARC. This is a naming convention only; there +is no difference in format, and UNARC will accept files of either type +interchangeably. + +An archive is a group of files compressed and collected together into a +single file in such a way that the individual files may be recovered intact. +In this respect, archives are similar in function to libraries (LBR files), +which have been commonplace on CP/M systems since 1982, when the +original LU library utility program was introduced by Gary P. Novosielski. +The two file formats, however, are not compatible.) + +The distinguishing characteristic of an ARC archive is that its component +files are automatically compressed when they are added to the archive, so +that the resulting file occupies a minimum amount of disk space. Of +course, file compression techniques have also been commonplace in the CP/M +world since 1981, when the public domain SQ and USQ "squeeze and +unsqueeze" programs were introduced by Richard Greenlaw. + +The SQ/USQ programs and their numerous popular descendants utilize a +well-known general-purpose form of data compression (Huffman coding). +This technique, which is also utilized in ARC files, performs well for many +text files but often produces poor compression of binary files (e.g., object +program COM files). The ARC program also provides an advanced data +compression method, which it terms "crunching." This method (which is +based on the Lempel-Ziv-Welch or "LZW" algorithm) performs better than +squeezing in most cases, often achieving 50% or better compression of ASCII +text files, 15-40% compression of binary object files, and as much as 95% +compression of bit-mapped graphics image files. + +Five different methods are actually employed for storing files in an +archive. The method chosen for a particular file is the one which results +in the best compression for that file: + 1. No compression ("unpacked"). The file is stored in its + original form. + 2. Run-length encoding ("packed"). Repeated sequences of 3- + 255 identical bytes are compressed into a three-byte sequence. + 3. Huffman coding ("squeezed"). Each 8-bit byte (after run- + length encoding) is encoded by a variable number of bits, with + bit length (approximately) inversely proportional to the + frequency of occurence of the corresponding byte. + 4. LZW compression ("crunched"). Variable-length strings + of bytes (in theory, up to nearly 4000 bytes in length) are + represented by a single (maximum) 12-bit code (after run-length + encoding). + 5. LZW compression ("squashed"). This is a variation of + crunching which uses (maximum) 13-bit codes (and no run-length + encoding). + +Since one of the five methods involves no compression at all, the resulting +archive entry will never be larger than the original file. + +The last release of the MS-DOS ARC program (version 5.20) has eliminated +squeezing as a compression technique. However, UNARC continues to +process squeezed files for compatibility with archives created by earlier +versions of ARC and by other MS-DOS archiving programs (notably PKARC). + +The squashed compression method was introduced by the MS-DOS programs +PKARC and PKXARC. UNARC can process files which use this method, +although it is not universally accepted by other MS-DOS archive extraction +programs (including ARC). + +During its lifetime, the ARC program has undergone numerous revisions +which have employed different variations on some of the above methods, +particularly LZW compression. In order to retain compatibility with +archives created by earlier program revisions, ARC stores a "version" +indicator with each file in an archive. Based on this indicator, the latest +release of the ARC program can always extract files created by older +releases (although it will only use the latest data compression versions when +adding new files to an archive). + +The current release of UNARC supports archive file versions generated by +all releases of the following MS-DOS programs through (at least) the +indicated program versions: + ARC 5.20 (24 Oct 86), by System Enhancement Associates, Inc. + ARCA 1.22 (13 Sep 86), by Wayne Chin and Vernon Buerg + ARCH 5.38 (26 Jun 86), by Les Satenstein + PKARC 2.0 (15 Dec 86), by Phil Katz (PKWARE, Inc.) +UNARC does not recognize, but is unaffected by, the non-standard archive +and file commenting feature of PKARC. + +Although the above discussion has emphasized the origin of archive files +for the MS-DOS operating system, their use did spread to many other +systems. Programs compatible with MS-DOS ARC have appeared for UNIX, +Atari 68000, VAX/VMS, and TOPS-20 systems. A CP/M utility for building +archive files is also available. + +For additional information about archive files and the MS-DOS ARC utility, +refer to the documentation file, ARC.DOC, which is available on the web. +For additional information about the LZW algorithm (and data compression +methods in general), refer to the article "A Technique for High-Performance +Data Compression", by Terry A. Welch, in IEEE Computer magazine, Vol. 17, +No. 6, June 1984. + \ No newline at end of file diff --git a/Source/Images/Common/All/WDATE.COM b/Source/Images/Common/All/WDATE.COM new file mode 100644 index 00000000..c7ab78e3 Binary files /dev/null and b/Source/Images/Common/All/WDATE.COM differ diff --git a/Source/Images/Common/UTILS/BBCBASIC.COM b/Source/Images/Common/UTILS/BBCBASIC.COM new file mode 100644 index 00000000..f7496f6b Binary files /dev/null and b/Source/Images/Common/UTILS/BBCBASIC.COM differ diff --git a/Source/Images/Common/UTILS/BBCBASIC.TXT b/Source/Images/Common/UTILS/BBCBASIC.TXT new file mode 100644 index 00000000..84a28f89 --- /dev/null +++ b/Source/Images/Common/UTILS/BBCBASIC.TXT @@ -0,0 +1,369 @@ + BBC BASIC (Z80) + + Generic CP/M Version 3.00 + + (C) Copyright R.T.Russell 1982-1999 + +1. INTRODUCTION + + BBC BASIC (Z80) has been designed to be as compatible as possible with + Version 4 of the 6502 BBC BASIC resident in the BBC Micro Master series. + The language syntax is not always identical to that of the 6502 version, + but in most cases the Z80 version is more tolerant. + + BBC BASIC (Z80) is as machine independent as possible and, as supplied, + it will run on any CP/M 2.2 (or later) system using a Z80 processor + (checks are carried out to ensure that the processor is a Z80 and that + the version of CP/M is at least 2.2). It is minimally configured for an + ADM3a-compatible VDU. + + Few CP/M systems offer colour graphics of the quality provided as + standard on the BBC Microcomputer, and no software can provide colour + high-resolution graphics from a monochrome character-orientated computer. + However, many CP/M system users are interested in the advanced program + structures available from BBC BASIC and, within the limitations of the + host computer, BBC BASIC (Z80) provides the programming structures and + the non-graphic commands and functions specified for BBC BASIC. + + In order to make full use of the facilities available in BBC BASIC (Z80) + it is necessary to install a small patch to adapt it to the capabilities + of the host computer. The source code of the patch present in the + distribution version is supplied as BBCDIST.MAC. + + This documentation should be read in conjunction with a standard BBC + BASIC manual. Only those features which differ from the standard Acorn + versions are documented here. + + +2. MEMORY UTILISATION + + BBC BASIC (Z80) requires about 16 Kbytes of code space, resulting in a + value of PAGE of about &3E00. The remainder of the user memory is + available for BASIC programs, variables (heap) and stack. Depending on + the system configuration, HIMEM can have a value up to &FE00. + + +3. COMMANDS, STATEMENTS AND FUNCTIONS + + The syntax of BASIC commands, statements and functions is in most cases + identical to that of the BBC Micro version (BASIC 4). The few + differences are documented here: + + ADVAL + This function is not implemented. + + CALL + CALL sets up a table in RAM containing details of the parameters; the + processor's IX register is set to the address of this parameter table. + The other processor registers are initialised as follows: + + A is initialised to the least significant byte of A% + B is initialised to the least significant byte of B% + C is initialised to the least significant byte of C% + D is initialised to the least significant byte of D% + E is initialised to the least significant byte of E% + F is initialised to the least significant byte of F% + H is initialised to the least significant byte of H% + L is initialised to the least significant byte of L% + + The parameter types are: + + Code No. Parameter Type Example + 0 Byte (8 bits) ?A% + 4 Word (32 bits) !A% or A% + 5 Real (40 bits) A + 128 Fixed string $A% + 129 Movable string A$ + + On entry to the subroutine the parameter table contains the following + values: + + Number of parameters 1 byte (at IX) + + Parameter type 1 byte (at IX+1) + Parameter address 2 bytes (at IX+2, IX+3, LSB first) + + Parameter type ) repeated as often as necessary + Parameter address ) + + Except in the case of a movable string (normal string variable), the + parameter address given is the absolute address at which the item is + stored. In the case of movable strings (type 129) it is the address of a + 4-byte parameter block containing the current length, the maximum length + and the start address of the string (LSB first) in that order. + + Integer variables are stored in twos complement form with their least + significant byte first. + + Fixed strings are stored as the characters of the string followed by a + carriage return (&0D). + + Floating point variables are stored in binary floating point format with + their least significant byte first; the fifth byte is the exponent. The + mantissa is stored as a binary fraction in sign and magnitude format. + Bit 7 of the most significant byte is the sign bit and, for the purposes + of calculating the magnitude of the number, this bit is assumed to be set + to one. The exponent is stored as an integer in excess 127 format (to + find the exponent subtract 127 from the value in the fifth byte). + + If the exponent byte of a floating point number is zero, the number is an + integer stored in integer format in the mantissa bytes. Thus an integer + can be represented in two different ways in a real variable. For example + the value +5 can be stored as: + + 05 00 00 00 00 Integer 5 + 00 00 00 20 82 (0.5 + 0.125) * 2^3 + + COLOUR (COLOR) + This statement is not implemented. + + DRAW + This statement is not implemented. + + EDIT + A command to edit or concatenate and edit the specified program line(s). + The specified lines (including their line numbers) are listed as a single + line. By changing only the line number you can use EDIT to duplicate a + line. + + EDIT 230 + EDIT 200,230 + + The following control functions are active both in the EDIT mode and in + the immediate entry mode (i.e. at the BASIC prompt): + + Move the cursor one character position to the left + Move the cursor one character position to the right + Move the cursor to the start of the line + Move the cursor to the end of the line + Insert a space at the current cursor position + Delete the character at the current cursor position + Backspace and delete the character to the left of the cursor + Delete all characters to the left of the cursor + Delete all characters from the cursor to the end of the line + + The choice of which keys activate these functions is made when BBC BASIC + is configured for a particular system. The distribution version uses ^H, + ^I, ^K, ^J, ^A, ^E, DEL (&7F), ^L and ^X. + + To exit EDIT mode and replace the edited line, type RETURN (ENTER). + + To abort the edit and leave the line unchanged, type ESCape. + + ENVELOPE + This statement is not implemented. + + GET + This function waits for a character to be typed at the keyboard, and + returns the ASCII code. + + GET can also be used to read data from a processor I/O port; full 16-bit + port addressing is available: + + N% = GET(X%) : REM input from port X% + + INKEY + This function waits for a specified maximum number of centiseconds for a + character to be typed at the keyboard. If no character is typed in that + time, the value -1 is returned. In the distribution version the delay is + determined by a simple software timing loop, and may be very inaccurate. + The customisation patch allows this to be adjusted to suit the system in + use. + + INPUT# + The format of data files is different from that used by the BBC Micro, in + part to improve compatibility with standard CP/M files. Numeric values + are stored as five bytes in the format documented under CALL; if the + fifth byte is zero the value is an integer. Strings are stored as the + characters of the string (in the correct order!) followed by a carriage + return (&0D). + + MODE + This statement is not implemented. + + MOVE + This statement is not implemented. + + PLOT + This statement is not implemented. + + POINT + This function is not implemented. + + PRINT# + The format of data files is different from that used by the BBC Micro, in + part to improve compatibility with standard CP/M files. Numeric values + are stored as five bytes in the format documented under CALL; if the + fifth byte is zero the value is an integer. Strings are stored as the + characters of the string (in the correct order!) followed by a carriage + return (&0D). + + PUT + A statement to output data to a processor port. Full 16-bit addressing + is available. + + PUT A%,N% : REM Output N% to port A% + + SOUND + This statement is not implemented. + + TIME + This pseudo-variable is not implemented in the distribution version, but + can be supported by means of the customisation patch. See BBCDIST.MAC. + + USR + As with CALL, the processor's registers are initialised as follows: + + A is initialised to the least significant byte of A% + B is initialised to the least significant byte of B% + C is initialised to the least significant byte of C% + D is initialised to the least significant byte of D% + E is initialised to the least significant byte of E% + F is initialised to the least significant byte of F% + H is initialised to the least significant byte of H% + L is initialised to the least significant byte of L% + + USR returns a 32-bit integer result composed of the processor's H, L, H' + and L' registers, with H being the most significant. + + +4. RESIDENT Z80 ASSEMBLER + + The in-line assembler is accessed in exactly the same way as the 6502 + assembler in the BBC Micro version of BBC BASIC. That is, '[' enters + assembler mode and ']' exits assembler mode. + + All standard Zilog mnemonics are accepted: ADD, ADC and SBC must be + followed by A or HL. For example, ADD A,C is accepted but ADD C is not. + However, the brackets around the port number in IN and OUT are optional. + Thus both OUT (5),A and OUT 5,A are accepted. The instruction IN F,(C) + is not accepted, but the equivalent code is produced from IN (HL),C + + The pseudo-ops DEFB, DEFW and DEFM are included. DEFM works like EQUS in + the 6502 version. + + +5. OPERATING SYSTEM INTERFACE + + The following resident Operating System ("star") commands are + implemented. They may be accessed directly (e.g. *BYE) or via the OSCLI + statement (OSCLI "BYE"). + + Control characters, lower-case characters, DEL and quotation marks may be + incorporated in filenames by using the 'escape' character '|'. However, + there is no equivalent to the BBC Microcomputer's '|!' to set bit 7. + + *BYE + Returns control to the operating system (CP/M). + + *CPM + Same as *BYE. + + *. [filespec] + *DIR [filespec] + List the files which match the (optional) ambiguous filespec. If the + filespec is omitted, all .BBC files are listed: + *DIR List all .BBC files on the disk + *DIR B:*.* List all files on disk B: + *.*.* List all files on the current disk + + *DRIVE d: + Select drive d as the default drive for subsequent disk operations. + + *ERA filespec + Erase (delete) the specified disk file or files. The extension defaults + to .BBC if omitted. + + *ESC [ON|OFF] + *ESC OFF disables the abort action of the ESCape key; after *ESC OFF the + ESCape key simply returns the ASCII code ESC (27). *ESC ON, or *ESC, + restores the normal action of the ESCape key. + + *EXEC filespec + Accept console input from the specified file instead of from the + keyboard. If the extension is omitted, .BBC is assumed. + + *LOAD filespec aaaa + Loads the specified file into memory at address aaaa. The load address + must be specified. If the extension is omitted, .BBC is assumed. + + *OPT [n] + Select the destination for console output characters. The value n is in + the range 0 to 2, as follows: + + 0 Send characters to the console output + 1 Send characters to the auxiliary output + 2 Send characters to the printer (list) output + + *REN newfile=oldfile + *RENAME newfile=oldfile + Renames 'oldfile' as 'newfile'. If the extension is omitted, .BBC is + assumed. + + *RESET + Rest the disk system (CP/M function 13). This command does not close any + files nor does it perform any other housekeeping function. You should + use *RESET after you have changed a disk. + + *SAVE filespec aaaa bbbb + *SAVE filespec aaaa +llll + This command saves a specified range of memory to disk. The address range + is specified either as start (aaaa) and end+1 (bbbb) or as start (aaaa) + and length (llll). If the extension is omitted, .BBC is assumed. + + *SPOOL [filespec] + Copy all subsequent console output to the specified file. If the filename + is omitted, any current spool file is closed and spooling is terminated. + If the extension is omitted, .BBC is assumed. + + *TYPE filespec + Type the specified file to the screen. If the extension is omitted, .BBC + is assumed. + + *| comment + This is a comment line. Anything following the | is ignored. + + +6. ERROR MESSAGES AND CODES + + Untrappable: + + No room RENUMBER space + Silly LINE space + Sorry Bad program + + Trappable - BASIC: + + 1 Out of range 24 Exp range + 2 25 + 3 26 No such variable + 4 Mistake 27 Missing ) + 5 Missing , 28 Bad HEX + 6 Type mismatch 29 No such FN/PROC + 7 No FN 30 Bad call + 8 31 Arguments + 9 Missing " 32 No FOR + 10 Bad DIM 33 Can't match FOR + 11 DIM space 34 FOR variable + 12 Not LOCAL 35 + 13 No PROC 36 No TO + 14 Array 37 + 15 Subscript 38 No GOSUB + 16 Syntax error 39 ON syntax + 17 Escape 40 ON range + 18 Division by zero 41 No such line + 19 String too long 42 Out of DATA + 20 Too big 43 No REPEAT + 21 -ve root 44 + 22 Log range 45 Missing # + 23 Accuracy lost + + Trappable - OS: + + 190 Directory full 214 File not found + 192 Too many open files 222 Channel + 196 File exists 253 Bad string + 198 Disk full 254 Bad command + 200 Close error 255 CP/M error + 204 Bad name + \ No newline at end of file diff --git a/Source/Images/Common/UTILS/BBCDIST.MAC b/Source/Images/Common/UTILS/BBCDIST.MAC new file mode 100644 index 00000000..6df1c9a6 --- /dev/null +++ b/Source/Images/Common/UTILS/BBCDIST.MAC @@ -0,0 +1,225 @@ + TITLE BBCDIST.Z80 (C) R.T.RUSSELL 1982 +; +;BBC BASIC (Z80) - CP/M VERSION 2.30 & 3.00 +;(C) COPYRIGHT R.T.RUSSELL, 1982. +;ALL RIGHTS RESERVED. +; +;THIS PROGRAM ALLOWS THE USER TO ADAPT BBC BASIC TO THE +;PARTICULAR CHARACTERISTICS OF HIS SYSTEM HARDWARE ETC. +; +;THE PROGRAM RESIDES AT 100H FOR EASE OF LOADING. +;*** IT MUST NOT EXCEED 256 BYTES IN TOTAL LENGTH *** +; +;PLEASE NOTE THAT A Z80 PROCESSOR AND CP/M VERSION 2.2 +;OR LATER ARE REQUIRED. +; +;R.T.RUSSELL, 11-03-1984, 03-05-1989 +;ALTERNATE REGISTERS SAVED FOR BDOS CALL, 04-06-2000 +; +CPM EQU 5 +COLD EQU 200H +; + GLOBAL CLRSCN + GLOBAL PUTCSR + GLOBAL GETCSR + GLOBAL PUTIME + GLOBAL GETIME + GLOBAL GETKEY + GLOBAL BYE +; + ASEG + ORG 100H +; +;JUMP TABLE - BASIC makes calls to hardware-dependent +;features via this table: +; + JP INIT +CLRSCN: JP CLS ;CLEAR SCREEN +PUTCSR: JP PCSR ;SET CURSOR POSN. +GETCSR: JP GCSR ;READ CURSOR POSN. +PUTIME: JP PTIME ;SET ELAPSED TIME +GETIME: JP GTIME ;READ ELAPSED TIME +GETKEY: JP INKEY ;READ KEY (TIME LIMIT) +BYE: JP REBOOT ;RETURN TO CP/M +; +;THE CODE WHICH FOLLOWS IS A SKELETON VERSION SUITABLE +;FOR ANY CP/M SYSTEM. IT HAS BEEN CONFIGURED FOR A VT100 TO SOME DEGREE +;BY PETER SCHORN. +; + +PRSTR EQU 9 + +;INIT - Perform hardware initialisation (if any). +; +INIT: LD A,2 + INC A + LD DE,NOTZ80 + JP PE,FAIL + LD C,12 + CALL BDOS + OR A + LD DE,NOTV2 + JP NZ,COLD +FAIL: LD C,PRSTR + CALL BDOS + RST 0 +; +NOTZ80: DEFB 'Wrong processor$' +NOTV2: DEFB 'Wrong CP/M version$' +; +;REBOOT - Switch off interrupts and return to CP/M +; +REBOOT: RST 0 +; +;GTIME - Read elapsed-time clock. +; Outputs: DEHL = elapsed time (centiseconds) +; Destroys: A,D,E,H,L,F +; +GTIME: LD DE,0 + LD HL,0 + RET +; +;PTIME - Load elapsed-time clock. +; Inputs: DEHL = time to load (centiseconds) +; Destroys: A,D,E,H,L,F +; +PTIME: RET +; +;CLS - Clear screen for VT100. +; Destroys: A,D,E,H,L,F +; +CLS: PUSH BC ; save BC + LD C,PRSTR ; command for output string + LD DE,CLSSTR ; start address of string + CALL BDOS ; output to terminal + POP BC ; restore BC + RET +CLSSTR: DEFB 27,'[2J$' ; VT100 string for clear screen + +; +;INKEY - Sample keyboard with specified wait. +; This version uses a simple software timing loop. +; Modify to use hardware/interrupt timer if available. +; Inputs: HL = Time to wait (centiseconds) +; Outputs: Carry reset indicates time-out. +; If carry set, A = character typed. +; Destroys: A,D,E,H,L,F +; +INKEY: PUSH BC + PUSH HL + LD C,6 + LD E,0FFH + CALL BDOS ;CONSOLE INPUT + POP HL + POP BC + OR A + SCF + RET NZ ;KEY PRESSED + OR H + OR L + RET Z ;TIME-OUT + PUSH BC + LD A,-1 + LD BC,1250 ;DELAY CONSTANT +WAIT: DEC BC + CP B + JP NZ,WAIT ;WAIT FOR APPROX 10ms + POP BC + DEC HL + JR INKEY +; +;PCSR - Move cursor to specified position. +; Inputs: DE = horizontal position (LHS=0) +; HL = vertical position (TOP=0) +; called by TAB(column, row) +PCSR: LD B,L ; vertical = line (row) + CALL CONV ; normalized and convert to decimal + LD (LIN),HL ; and store into string + LD B,E ; horizontal = column + CALL CONV ; normalized and convert to decimal + LD (COL),HL ; and store into string + LD C,PRSTR ; output string command + LD DE,CURS ; start of string + JR BDOS ; output string to terminal + +; VT100 sequence for cursor positioning +CURS: DEFB 27, '[' +LIN: DEFW 0 ; high byte, low byte for decimal line + DEFB ';' +COL: DEFW 0 ; high byte, low byte for decimal column + DEFB 'H$' + +; convert binary B (0 <= B < 99, not checked) into B+1 in decimal. +; L = upper byte, H = lower byte. ready for LD (...), HL +; destroys A, B, L, H +; optimized for space over time +CONV: INC B ; normalize, home in VT100 is (1,1) + LD A,'0' ; A is counter for low byte of result + LD L,A ; L is counter for high byte of result +CONVLP: INC A ; now B times increment AL in decimal + CP '9'+1 ; low byte overflow? + JR NZ,CONT ; no, continue incrementing + LD A,'0' ; reset low byte + INC L ; and increment high byte +CONT: DJNZ CONVLP ; B times + LD H,A ; put low byte into right place + RET + + +;BDOS - Save the IX and IY and alternate registers +; before performing a CP/M function call. +; +BDOS: PUSH IX + PUSH IY + EXX + PUSH BC + PUSH DE + PUSH HL + EXX + EX AF,AF' + PUSH AF + EX AF,AF' + CALL CPM + EX AF,AF' + POP AF + EX AF,AF' + EXX + POP HL + POP DE + POP BC + EXX + POP IY + POP IX + RET + + +;GCSR - Return cursor coordinates. +; Outputs: DE = X coordinate (POS) +; HL = Y coordinate (VPOS) +; Destroys: A,D,E,H,L,F +; +GCSR: LD DE,0 + LD HL,0 + RET +; + IF $ GT 1F4H + ERROR 'INSUFFICIENT SPACE' + ENDIF +; + ORG 1F4H +; + DEFB 80 ;WIDTH + DEFB 'E' AND 1FH ;CURSOR UP + DEFB 'X' AND 1FH ;CURSOR DOWN + DEFB 'A' AND 1FH ;START OF LINE + DEFB 'F' AND 1FH ;END OF LINE + DEFB 'T' AND 1FH ;DELETE TO END OF LINE + DEFB 'H' AND 1FH ;BACKSPACE + DEFB 'U' AND 1FH ;CANCEL LINE + DEFB 'S' AND 1FH ;CURSOR LEFT + DEFB 'D' AND 1FH ;CURSOR RIGHT + DEFB 'G' AND 1FH ;DELETE CHARACTER + DEFB 'V' AND 1FH ;INSERT CHARACTER +; +FIN: END + \ No newline at end of file diff --git a/Source/Images/Common/UTILS/BBCDIST.SUB b/Source/Images/Common/UTILS/BBCDIST.SUB new file mode 100644 index 00000000..d438ba7b --- /dev/null +++ b/Source/Images/Common/UTILS/BBCDIST.SUB @@ -0,0 +1,13 @@ +; patch BBCBASIC with BBCDIST +; need M80 and L80 +xsub +m80 =bbcdist/z +l80 bbcdist,bbcdist/n/e +ddt bbcbasic.org +ibbcdist.com +r +g0 +save 58 bbcbasic.com +era bbcdist.rel +era bbcdist.com + \ No newline at end of file diff --git a/Source/Images/Common/UTILS/GENHEX.COM b/Source/Images/Common/UTILS/GENHEX.COM new file mode 100644 index 00000000..8314d35f Binary files /dev/null and b/Source/Images/Common/UTILS/GENHEX.COM differ diff --git a/Source/Images/Common/UTILS/LS.COM b/Source/Images/Common/UTILS/LS.COM new file mode 100644 index 00000000..69e418f8 Binary files /dev/null and b/Source/Images/Common/UTILS/LS.COM differ diff --git a/Source/Images/Common/UTILS/LSWEEP.COM b/Source/Images/Common/UTILS/LSWEEP.COM new file mode 100644 index 00000000..2acdb394 Binary files /dev/null and b/Source/Images/Common/UTILS/LSWEEP.COM differ diff --git a/Source/Images/Common/Z/u14/UNARCU10.CFG b/Source/Images/Common/Z/u14/UNARCU10.CFG new file mode 100644 index 00000000..8de29a59 Binary files /dev/null and b/Source/Images/Common/Z/u14/UNARCU10.CFG differ diff --git a/Source/Images/Makefile b/Source/Images/Makefile index fc442282..3c9e78c8 100644 --- a/Source/Images/Makefile +++ b/Source/Images/Makefile @@ -1,23 +1,32 @@ # # this makefile subsumes all the work done in Build.cmd, BuildDisk.cmd, BuildDisk.ps1 # -SYSTEMS = ../CPM22/cpm_wbw.sys ../ZSDOS/zsys_wbw.sys ../CPM3/cpmldr.sys ../ZPM3/zpmldr.sys +SYSTEMS = ../CPM22/cpm_wbw.sys ../ZSDOS/zsys_wbw.sys ../QPM/qpm_wbw.sys ../CPM3/cpmldr.sys ../ZPM3/zpmldr.sys FDIMGS = fd144_cpm22.img fd144_zsdos.img fd144_nzcom.img \ - fd144_cpm3.img fd144_zpm3.img fd144_ws4.img fd144_qpm.img + fd144_cpm3.img fd144_zpm3.img fd144_ws4.img fd144_qpm.img \ + fd144_z80asm.img fd144_aztecc.img fd144_hitechc.img \ + fd144_bascomp.img fd144_fortran.img fd144_games.img \ + fd144_tpascal.img HD512IMGS = hd512_cpm22.img hd512_zsdos.img hd512_nzcom.img \ hd512_cpm3.img hd512_zpm3.img hd512_ws4.img +HD512XIMGS = hd512_z80asm.img hd512_aztecc.img hd512_hitechc.img \ + hd512_bascomp.img hd512_fortran.img hd512_games.img \ + hd512_tpascal.img hd512_dos65.img hd512_qpm.img hd512_blank.img # HDIMGS += hd512_bp.img HD1KIMGS = hd1k_cpm22.img hd1k_zsdos.img hd1k_nzcom.img \ hd1k_cpm3.img hd1k_zpm3.img hd1k_ws4.img -# HD1KIMGS += hd1k_bp.img +HD1KXIMGS = hd1k_z80asm.img hd1k_aztecc.img hd1k_hitechc.img \ + hd1k_bascomp.img hd1k_fortran.img hd1k_games.img \ + hd1k_tpascal.img hd1k_qpm.img hd1k_blank.img +HD1KXIMGS += hd1k_bp.img HD512PREFIX = HD1KPREFIX = hd1k_prefix.dat OBJECTS = $(FDIMGS) -OBJECTS += $(HD512IMGS) hd512_combo.img hd512_dos65.img hd512_qpm.img$(HD512PREFIX) -OBJECTS += $(HD1KIMGS) hd1k_combo.img hd1k_qpm.img $(HD1KPREFIX) +OBJECTS += $(HD512IMGS) $(HD512XIMGS) hd512_combo.img $(HD512PREFIX) +OBJECTS += $(HD1KIMGS) $(HD1KXIMGS) hd1k_combo.img $(HD1KPREFIX) OTHERS = blank144 blankhd512 blankhd1k @@ -61,7 +70,7 @@ blankhd512: @echo Making Blank HD512 of size $(HD512SIZE)k @LC_ALL=en_US.US-ASCII tr '\000' '\345' _flags&_EOF)!=0) +#define ferror(fp) (((fp)->_flags&_IOERR)!=0) +#define clearerr(fp) ((fp)->_flags &= ~(_IOERR|_EOF)) +#define fileno(fp) ((fp)->_unit) + errno.h +extern int errno; +#define ENOENT -1 +#define E2BIG -2 +#define EBADF -3 +#define ENOMEM -4 +#define EEXIST -5 +#define EINVAL -6 +#define ENFILE -7 +#define EMFILE -8 +#define ENOTTY -9 +#define EACCES -10 + +#define ERANGE -20 +#define EDOM -21 + fcntl.h +#define O_RDONLY 0 +#define O_WRONLY 1 +#define O_RDWR 2 +#define O_CREAT 0x0100 +#define O_TRUNC 0x0200 +#define O_EXCL 0x0400 +#define O_APPEND 0x0800 + io.h +/* Copyright (C) 1982 by Manx Software Systems */ +/* + * if MAXCHAN is changed then the initialization of chantab in croot.c + * should be adjusted so that it initializes EXACTLY MAXCHAN elements of + * the array. If this is not done, the I/O library may exhibit + * strange behavior. + */ +#define MAXCHAN 11 /* maximum number of I/O channels */ + +/* + * argument to device routines. + * this is a typedef to allow future redeclaration to guarantee + * enough space to store either a pointer or an integer. + */ +typedef char *_arg; + +/* + * device control structure + */ +struct device { + char d_read; + char d_write; + char d_ioctl; /* used by character special devices (eg CON:) */ + char d_seek; /* used by random I/O devices (eg: a file) */ + int (*d_open)(); /* for special open handling */ +}; + +/* + * device table, contains names and pointers to device entries + */ +struct devtabl { + char *d_name; + struct device *d_dev; + _arg d_arg; +}; + +/* + * channel table: relates fd's to devices + */ +struct channel { + char c_read; + char c_write; + char c_ioctl; + char c_seek; + int (*c_close)(); + _arg c_arg; +} ; +extern struct channel chantab[MAXCHAN]; + +struct fcb { + char f_driv; + char f_name[8]; + char f_type[3]; + char f_ext; + char f_resv[2]; + char f_rc; + char f_sydx[16]; + char f_cr; + unsigned f_record; char f_overfl; +}; + +struct fcbtab { + struct fcb fcb; + char offset; + char flags; + char user; +}; + +#define OPNFIL 15 +#define CLSFIL 16 +#define DELFIL 19 +#define READSQ 20 +#define WRITSQ 21 +#define MAKFIL 22 +#define SETDMA 26 +#define GETUSR 32 +#define READRN 33 +#define WRITRN 34 +#define FILSIZ 35 +#define SETREC 36 + +#define Wrkbuf ((char *)0x80) + math.h +double sin(), cos(), tan(), cotan(); +double asin(), acos(), atan(), atan2(); +double ldexp(), frexp(), modf(); +double floor(), ceil(); +double log(), log10(), exp(), sqrt(), pow(); +double sinh(), cosh(), tanh(), fabs(); + +#define HUGE 5.2e+151 +#define LOGHUGE 349.3 +#define TINY 7.5e-155 +#define LOGTINY -354.8 + setjmp.h +/* Copyright (C) 1983 by Manx Software Systems */ +#define JBUFSIZE (5*sizeof(int)) + +typedef char jmp_buf[JBUFSIZE]; + sgtty.h +/* Copyright (C) 1983 by Manx Software Systems */ + +#define TIOCGETP 0 /* read contents of tty control structure */ +#define TIOCSETP 1 /* set contents of tty control structure */ +#define TIOCSETN 1 /* ditto only don't wait for output to flush */ + +struct sgttyb { + char sg_erase; /* ignored */ + char sg_kill; /* ignored */ + short sg_flags; /* control flags */ +}; + +/* settings for flags */ +#define _VALID 0x3a +#define RAW 0x20 /* no echo or mapping of input/output BDOS(6) */ +#define CRMOD 0x10 /* map input CR to NL, output NL to CR LF */ +#define ECHO 0x08 /* ignored unless CBREAK is set */ +#define CBREAK 0x02 /* input using BDOS(1), unless echo off then */ + /* same as RAW */ + stdio.h +/* Copyright (C) 1982, 1984 by Manx Software Systems */ +#define fgetc getc +#define fputc putc +#define NULL 0 +#define EOF -1 + +#ifdef TINY +struct fcb { + char f_driv; + char f_name[8]; + char f_type[3]; + char f_ext; + char f_resv[2]; + char f_rc; + char f_sydx[16]; + char f_cr; + unsigned f_record; char f_overfl; +}; + +typedef struct { + char *_bp; + struct fcb _fcb; + char user; +} FILE; + +#else + +#define BUFSIZ 1024 +#define MAXSTREAM 11 + +#define _BUSY 0x01 +#define _ALLBUF 0x02 +#define _DIRTY 0x04 +#define _EOF 0x08 +#define _IOERR 0x10 + +typedef struct { + char *_bp; /* current position in buffer */ + char *_bend; /* last character in buffer + 1 */ + char *_buff; /* address of buffer */ + char _flags; /* open mode, etc. */ + char _unit; /* token returned by open */ + char _bytbuf; /* single byte buffer for unbuffer streams */ + int _buflen; /* length of buffer */ +} FILE; + +extern FILE Cbuffs[]; +FILE *fopen(); +long ftell(); + +#define stdin (&Cbuffs[0]) +#define stdout (&Cbuffs[1]) +#define stderr (&Cbuffs[2]) +#define getchar() agetc(stdin) +#define putchar(c) aputc(c, stdout) +#define feof(fp) (((fp)->_flags&_EOF)!=0) +#define ferror(fp) (((fp)->_flags&_IOERR)!=0) +#define clearerr(fp) ((fp)->_flags &= ~(_IOERR|_EOF)) +#define fileno(fp) ((fp)->_unit) +#define fflush(fp) flsh_(fp,-1) +#endif + ctype.h +/* Copyright (C) 1984 by Manx Software Systems */ + +extern char ctp_[]; + +#define isalpha(x) (ctp_[(x)+1]&0x03) +#define isupper(x) (ctp_[(x)+1]&0x01) +#define islower(x) (ctp_[(x)+1]&0x02) +#define isdigit(x) (ctp_[(x)+1]&0x04) +#define isxdigit(x) (ctp_[(x)+1]&0x08) +#define isalnum(x) (ctp_[(x)+1]&0x07) +#define isspace(x) (ctp_[(x)+1]&0x10) +#define ispunct(x) (ctp_[(x)+1]&0x40) +#define iscntrl(x) (ctp_[(x)+1]&0x20) +#define isprint(x) (ctp_[(x)+1]&0xc7) +#define isgraph(x) (ctp_[(x)+1]&0x47) +#define isascii(x) (((x)&0x80)==0) + +#define toascii(x) ((x)&127) +#define _tolower(x) ((x)|0x20) +#define _toupper(x) ((x)&0x5f) + \ No newline at end of file diff --git a/Source/Images/d_aztecc/u0/HEX80.COM b/Source/Images/d_aztecc/u0/HEX80.COM new file mode 100644 index 00000000..a9eed9b5 Binary files /dev/null and b/Source/Images/d_aztecc/u0/HEX80.COM differ diff --git a/Source/Images/d_aztecc/u0/LIBASRC.ARC b/Source/Images/d_aztecc/u0/LIBASRC.ARC new file mode 100644 index 00000000..73f6b3f2 --- /dev/null +++ b/Source/Images/d_aztecc/u0/LIBASRC.ARC @@ -0,0 +1,2583 @@ + begin.asm +;Copyright (C) 1981,1982,1983 by Manx Software Systems +; :ts=8 +BDOS equ 5 + extrn Croot_ + extrn _Uorg_, _Uend_ +; + public lnprm, lntmp, lnsec +; +; The 3 "bss" statements below must remain in EXACTLY the same order, +; with no intervening statements! +; + bss lnprm,4 + bss lntmp,4 + bss lnsec,4 +; + global sbot,2 + global errno_,2 + global _mbot_,2 + dseg + public Sysvec_ +Sysvec_: dw 0 + dw 0 + dw 0 + dw 0 + public $MEMRY +$MEMRY: dw 0ffffh +; +fcb: db 0,'???????????',0,0,0,0 + ds 16 + cseg + public .begin + public _exit_ +.begin: + lxi h,_Uorg_ + lxi b,_Uend_-_Uorg_ + mvi e,0 +clrbss: + mov m,e + inx h + dcx b + mov a,c + ora b + jnz clrbss +; + LHLD BDOS+1 + SPHL + lxi d,-2048 + dad d ;set heap limit at 2K below stack + shld sbot + lhld $MEMRY + shld _mbot_ + CALL Croot_ +_exit_: + mvi c,17 ;search for first (used to flush deblock buffer) + lxi d,fcb + call BDOS + lxi b,0 + call BDOS + JMP _exit_ +; + end .begin + mbegin.asm +;Copyright (C) 1981,1982,1983 by Manx Software Systems +; :ts=8 +BDOS equ 5 + extrn Croot_ + dseg +; +; The 3 "ds 4" statements below must remain in EXACTLY the same order, +; with no intervening statements! +; + public lnprm, lntmp, lnsec +lnprm: ds 4 +lntmp: ds 4 +lnsec: ds 4 +; + public Sysvec_ +Sysvec_: dw 0 + dw 0 + dw 0 + dw 0 + public $MEMRY +$MEMRY: dw -1 + public sbot +sbot: dw 0 + public errno_ +errno_: dw 0 +; +fcb: db 0,'???????????',0,0,0,0 + ds 16 + cseg + public .begin + public _exit_ +.begin: + LHLD BDOS+1 + SPHL + lxi d,-2048 + dad d ;set heap limit at 2K below stack + shld sbot + CALL Croot_ +_exit_: + mvi c,17 ;search for first (used to flush deblock buffer) + lxi d,fcb + call BDOS + lxi b,0 + call BDOS + JMP _exit_ + end .begin + rom.asm +;Copyright (C) 1983 by Manx Software Systems +; :ts=8 +; +; stksize should be set according to your program's needs +; +stksize equ 1024 + bss stack,stksize + + extrn main_ + extrn _Corg_, _Cend_ + extrn _Dorg_, _Dend_ + extrn _Uorg_, _Uend_ +; +; The 3 "bss" statements below must remain in EXACTLY the same order, +; with no intervening statements! +; + public lnprm, lntmp, lnsec + bss lnprm,4 + bss lntmp,4 + bss lnsec,4 +; + global errno_,2 + dseg + public Sysvec_ +Sysvec_: dw 0 + dw 0 + dw 0 + dw 0 + public $MEMRY +$MEMRY: dw 0ffffh + cseg + public .begin +.begin: + di + lxi sp,stack+stksize +; +; The loop below moves the initialized data from ROM to RAM. +; If your program has no initialized data, or the initialized +; data isn't modified, then delete this loop. +; + lxi h,_Cend_ + lxi d,_Dorg_ + lxi b,_Dend_-_Dorg_ + mov a,h + cmp d + jnz movedata + mov a,l + cmp e + jz movedone +movedata: +; If your processor is a Z80, then remove the comment from the +; next line and comment out the next 8 lines. +; db 237,176 ;ldir + mov a,m + stax d + inx h + inx d + dcx b + mov a,c + ora b + jnz movedata +movedone: +; + lxi h,_Uorg_ + lxi b,_Uend_-_Uorg_ + mvi e,0 +clrbss: + mov m,e + inx h + dcx b + mov a,c + ora b + jnz clrbss +; + ei + ;no argc,argv in ROM system + jmp main_ ;main shouldn't return in ROM based system + end .begin + csave.asm +;Copyright (C) 1981,1982,1984 by Manx Software Systems +; :ts=8 + extrn .begin + public .chl +.chl: PCHL +; + public zsave,zret +zsave: POP H + PUSH B + MOV B,H + MOV C,L + LXI H,0 + DAD SP + XCHG + DAD SP + SPHL + PUSH D + DB 221,229,253,229 ;push ix ; push iy + mov h,b + mov l,c + call .chl +; +zret: + DB 253,225,221,225 ; pop iy ; pop ix +cret: + XCHG + POP H + SPHL + POP B + XCHG + MOV A,H + ORA L + RET +; + public csave,cret +csave: POP H + PUSH B + MOV B,H + MOV C,L + LXI H,0 + DAD SP + XCHG + DAD SP + SPHL + PUSH D + lxi h,cret + push h + mov h,b + mov l,c + pchl +; +; move - move BC bytes from (HL) to (DE), used for struct assignment +; + public .move +.move: + mov a,m + stax d + inx h + inx d + dcx b + mov a,b + ora c + jnz .move + ret +; + public .ARG1,.ARG2,.ARG3,.asave +; +.asave: ;support for assembly routines which must save IX and IY + pop d ;save return address + lxi h,2 ;compute address of arguments + dad sp + xra a + adi 3 + jpe nopush + DB 221,229,253,229 ;push ix ; push iy +nopush: + PUSH B + push d ;put return addr back + lxi d,.ARG1 + mvi b,6 +cpyloop: ;copy args to known place + mov a,m + stax d + inx h + inx d + dcr b + jnz cpyloop + lxi h,asmret + xthl + pchl +; +asmret: + POP B + xra a + adi 3 + jpe nopop + DB 253,225,221,225 ; pop iy ; pop ix +nopop: + mov a,h + ora l + RET +; + dseg +.ARG1: ds 2 +.ARG2: ds 2 +.ARG3: ds 2 + end + fmtcvt.asm +; Copyright (C) 1983 by Manx Software Systems +; :ts=8 + dseg +string: ds 2 +size: dw 0 +number: ds 4 + cseg + public fmtcvt_ +fmtcvt_: ;char *fmtcvt(ptr, base, buffer, size) + push b + lxi h,0 + shld number + shld number+2 + lxi h,10 + dad sp + mov a,m + sta size + mov b,a ;save size for later + dcx h + mov d,m + dcx h + mov e,m + dcx h + xchg + mvi m,0 ;null terminate string + shld string + xchg + dcx h + mov c,m ;C = base + dcx h + mov d,m + dcx h + mov e,m + lxi h,number +cpnum: + ldax d + mov m,a + inx d + inx h + dcr b + jnz cpnum + + mov a,c + ora a + jp unsigned ; base < 0, means do signed conversion + cma + inr a + mov c,a ;C = base + lhld size + lxi d,number-1 + dad d + mov a,m + ora a + push psw + jp top + ;number is negative, so make it positive + ;note: carry is already cleared by 'ora' above + lda size + mov b,a + lxi h,number +ngloop: + mvi a,0 + sbb m + mov m,a + inx h + dcr b + jnz ngloop + jmp top +unsigned: + push psw +top: + lxi h,number+3 + mvi d,0 + mvi a,4 +outer: + push psw + mov e,m + xchg + mvi b,8 +inner: + dad h + mov a,h + sub c + jc zero + mov h,a + inr l +zero: + dcr b + jnz inner + xchg + mov m,e + dcx h + pop psw + dcr a + jnz outer +; + mov e,d + mvi d,0 + lxi h,digits + dad d + mov a,m + lhld string + dcx h + shld string + mov m,a +; + lxi h,number + mvi b,4 + xra a +zcheck: + cmp m + jnz top + inx h + dcr b + jnz zcheck + + lhld string + pop psw + jp notneg + dcx h + mvi m,'-' +notneg: + pop b + ret +; +digits: db '0123456789abcdef' + end + blkio.asm +; Copyright (C) 1982, 1983 by Manx Software Systems +; :ts=8 +BDOS equ 5 + extrn errno_ + extrn .asave,.ARG1,.ARG2,.ARG3 + public blkrd_ +blkrd_: + call .asave + mvi c,33 ;set function to read sequential + jmp rdwrt +; + public blkwr_ +blkwr_: + call .asave + mvi c,34 ;set function to write sequential +rdwrt: + push b +ioloop: + lhld .ARG2 + xchg + lxi h,128 + dad d ;bump address to next sector + shld .ARG2 + mvi c,26 ;set DMA address + call BDOS + pop b + push b + lhld .ARG1 + xchg + call BDOS ;read or write sector + ora a + jnz ioerr + lhld .ARG1 + lxi d,33 + dad d + inr m + jnz nocarry + inx h + inr m +nocarry: + lhld .ARG3 + dcx h + shld .ARG3 + mov a,l + ora h + jnz ioloop + pop b ;pull function code from stack + ret ;all done, return number remaining +; +ioerr: + cpi 1 + jz dontset + cpi 4 + jz dontset + mov l,a + mvi h,0 + shld errno_ +dontset: + pop b ;pull function code from stack + lhld .ARG3 + ret ;return number remaining + end + bdos.asm +;Copyright (C) 1981,1982 by Manx Software Systems +; :ts=8 +BASE equ 0 +BDOS equ 5 + + extrn .ARG1,.ARG2,.ARG3,.asave +; + public bdoshl_ +bdoshl_: + call .asave + call combdos + xchg ;get back original hl value + ret +; + public bdos_,CPM_ +bdos_: +CPM_: + call .asave +combdos: + lhld .ARG1 + mov b,h + mov c,l + lhld .ARG2 + xchg + CALL BDOS + xchg ;save for bdoshl call + mov l,a + xra a ;set zero flag + mov h,a + RET + end + bios.asm +;Copyright (C) 1981,1982 by Manx Software Systems +BASE equ 0 +BDOS equ 5 + + extrn .ARG1,.ARG2,.ARG3,.asave +; + public bios_ +bios_: + call .asave + call combios + mov l,a + mvi h,0 + ret +; + public bioshl_ +bioshl_: + call .asave +combios: + lhld .ARG1 + xchg + lhld BASE+1 + dcx h + dcx h + dcx h + dad d + dad d + dad d + xchg ;bios jump addr in DE + + lhld .ARG2 + mov b,h + mov c,l + lhld .ARG3 + xchg ;now arg3 in DE, and bios jump in HL + pchl + end + fcbinit.asm +;Copyright (C) 1981,1982 by Manx Software Systems +; :ts=8 + public fcbinit_ +fcbinit_: + push b + lxi h,4 + dad sp + mov c,m ; BC contains name + inx h + mov b,m + inx h + mov e,m ; DE contains fcb address + inx h + mov d,m +; clear name to blanks + mov l,e ;copy fcb address into HL + mov h,d + mvi m,0 ;clear drive # + inx h + mvi a,11 ;clear name and ext to blanks +clrlp: + mvi m,' ' + inx h + dcr a + jnz clrlp + mvi a,4 +zrlp: + mvi m,0 + inx h + dcr a + jnz zrlp + xchg ; now HL contains fcb addr +; + mov a,c + ora b + jz badname +skipbl: + ldax b + cpi ' ' + jz skip + cpi 9 + jnz skipdone +skip: inx b + jmp skipbl +skipdone: +; + push b ;save address of name + mvi d,0 ;init user # +userloop: + ldax b + call isdig + jc userdone + sui '0' + mov e,a + mov a,d + add a ;*2 + add a ;*4 + add a ;*8 + add d ;*9 + add d ;*10 + add e ;add in digit + mov d,a + inx b + jmp userloop +userdone: + cpi '/' + jnz nouser + inx b + pop psw ;throw away saved address + jmp setuser +nouser: + pop b ;restore original address + mvi d,255 ;set user # to default +setuser: + inx b + ldax b + cpi ':' + dcx b + mvi a,0 + jnz nodrive +; + ldax b + ani 127 + cpi 'A' + jc badname + cpi 'Z'+1 + jnc lowerc + sui 'A'-1 + jmp setdrive +; +lowerc: + cpi 'a' + jc badname + cpi 'z'+1 + jnc badname + sui 'a'-1 +setdrive: + mov m,a + inx b + inx b +nodrive: + inx h +; move name in mapping to upper case + mvi e,8 +nameskp: + inr e +namelp: + ldax b + inx b + cpi '.' + jz namedn + ora a + jz alldone + dcr e + jz nameskp + call toupper + mov m,a + inx h + jmp namelp +; +namedn: + dcr e + mov a,e + add l + mov l,a + mov a,h + aci 0 + mov h,a +; move extension mapping to upper case + mvi e,3 +extlp: + ldax b + inx b + ora a + jz alldone + call toupper + mov m,a + inx h + dcr e + jnz extlp +; +alldone: + mvi h,0 + mov l,d ;return user # prefix + mov a,d + ora a + pop b + ret +; +badname: + lxi h,-1 + mov a,h + ora a + pop b + ret +; +toupper: + cpi '*' + jnz nostar + dcx b ;back up so we see star again + mvi a,'?' ;and map into question + ret +nostar: + cpi 'a' + rc + cpi 'z'+1 + rnc + sui 'a'-'A' + ret +; +isdig: + cpi '0' + rc + cpi '9'+1 + jnc notdig + ora a + ret +notdig: + stc + ret +; + end + sbrk.asm +;Copyright (C) 1981,1982 by Manx Software Systems +;Copyright (C) 1983,1984 by Manx Software Systems +; :ts=8 + extrn $MEMRY, sbot +; +; sbrk(size): return address of current top & bump by size bytes +; + public sbrk_ +sbrk_: + lxi h,2 + dad sp + mov e,m ; get size to allocate + inx h + mov d,m + lhld $MEMRY + dad d + jc sbrk.ov + xchg ;save for compare + lhld sbot + mov a,l ;check for stack/heap overflow + sub e + mov a,h + sbb d + jc sbrk.ov + lhld $MEMRY ;get old value + xchg + shld $MEMRY ;new value is good so save it away + xchg ;return original value + mov a,h + ora l + ret +; no space left!! +sbrk.ov: + lxi h,-1 + xra a + dcr a + ret +; +; +; rsvstk(size): reserve size bytes of stack space +; + public rsvstk_ +rsvstk_: + lxi h,2 + dad sp + mov a,l + sub m + mov e,a + mov a,h + inx h + sbb m + mov d,a + xchg + shld sbot + ret + end + loader.asm +; Copyright (C) 1984 by Manx Software Systems +; :ts=8 +; The C routine execl() in exec.c knows that this function is +; less than 70 bytes long. If this code is changed, then execl +; must be changed also. +; +; This routine is copied into an automatic array and invoked +; there by execl(). The code is self relocating and must +; remain so. +; +bdos equ 5 +defdma equ 80h +tpa equ 100h + public ldr__ ; ldr_(&fcb, ouser) +ldr__: + pop d ;throw away return + pop b ;set up fcb address + lxi d,9 + dad d ;fix hl to point to head of loop + lxi d,tpa +; +; bc = fcb address +; de = tpa address +; hl = address of this routine +; old user # pushed onto stack +; + push h ;save loop address + push d + push b + mvi c,26 + call bdos + pop d + push d + mvi c,20 + call bdos + pop b ;restore fcb address + pop d ;and loading addr. + lxi h,80h + dad d ;bump loading addr + xchg + pop h + push h ;restore loop address + ora a ;check if eof + rz ;if not, return to top of loop + pop h ;throw away return addr + pop d ;get old user # + mvi c,32 + call bdos ;restore user # + lxi d,defdma + mvi c,26 + call bdos + lhld bdos+1 + sphl + lxi h,0 + push h ;set for proper return from program + jmp tpa + end + user.asm +; Copyright (C) 1983 by Manx Software Systems +; :ts=8 +BDOS equ 5 + extrn .asave,.ARG1,.ARG2,.ARG3 + dseg +oldusr: db 0 + cseg + public getusr_ +getusr_: + call .asave + mvi c,32 + mvi e,255 + call BDOS ;get current user # + mov l,a + mvi h,0 + ora a + ret +; + public setusr_ +setusr_: + call .asave + mvi c,32 + mvi e,255 + call BDOS + sta oldusr + lda .ARG1 + cpi 255 + rz + mvi c,32 + mov e,a + jmp BDOS ;set new user number +; + public rstusr_ +rstusr_: + call .asave + mvi c,32 + lda oldusr + mov e,a + jmp BDOS ;restore old user number + end + setjmp.asm +; Copyright (C) 1983 by Manx Software Systems +; :ts=8 + public setjmp_ +setjmp_: + lxi h,2 + dad sp + mov e,m ;get address of jump buffer + inx h + mov d,m + dcx h ;get SP value back + xchg + mov m,e ;save SP value + inx h + mov m,d + inx h + pop d + push d + mov m,e ;save PC value + inx h + mov m,d + inx h + mov m,c ;save BC value + inx h + mov m,b + xra a + adi 3 + jpe setdone + inx h + db 221,229 ;push ix + pop d + mov m,e ;save IX value + inx h + mov m,d + inx h + db 253,229 ;push iy + pop d + mov m,e ;save IY value + inx h + mov m,d +setdone: + lxi h,0 + xra a ;set zero flag + ret +; + public longjmp_ +longjmp_: + lxi h,2 + dad sp + mov e,m ;get address of jump buffer + inx h + mov d,m + inx h + mov c,m ;get return value + inx h + mov b,m + xchg + mov e,m ;get SP value + inx h + mov d,m + inx h + xchg + sphl ;switch to original stack + xchg + mov e,m ;get PC value + inx h + mov d,m + inx h + push d ;save for return + push b ;save return value + mov c,m ;get BC value + inx h + mov b,m + xra a + adi 3 + jpe longdone + inx h + mov e,m ;get IX value + inx h + mov d,m + inx h + push d + db 221,225 ;pop ix + mov e,m ;get IY value + inx h + mov d,m + push d + db 253,225 ;pop iy +longdone: + pop h + mov a,l + ora h + rnz + inx h ;force non-zero return + inr a ;set non-zero flag + ret + end + strcmp.asm +;Copyright (C) 1981,1982,1983 by Manx Software Systems +; :ts=8 + public strcmp_ +strcmp_: + lxi h,5 + dad sp + push b + lxi b,32767 + jmp same +; + public strncmp_ +strncmp_: + lxi h,7 + dad sp + push b + mov b,m + dcx h + mov c,m ;BC = len + dcx h +same: + mov d,m + dcx h + mov e,m ;DE = s2 + dcx h + mov a,m + dcx h + mov l,m + mov h,a ;HL = s1 + xchg ;now DE=s1, HL=s2 +cmploop: + mov a,b ;while (len) { + ora c + jz done + ldax d ;if (*s1-*s2) break + sub m + jnz done + ldax d ;if (*s1 == 0) break + ora a + jz done + inx d ;++s1 + inx h ;++s2 + dcx b ;--len + jmp cmploop ;} +done: + pop b + mov l,a + sbb a + mov h,a + ora l + ret + end + strcpy.asm +;Copyright (C) 1981,1982,1983 by Manx Software Systems +; :ts=8 + public strcpy_ +strcpy_: + lxi h,5 + dad sp + mov d,m + dcx h + mov e,m ;DE = s2 + dcx h + mov a,m + dcx h + mov l,m + mov h,a ;HL = s1 + push h ;save target for return +cpyloop: + ldax d ;while (*s1++ = *s2++) ; + mov m,a + ora a + jz done + inx d + inx h ;++s2 + jmp cpyloop ;} +done: + pop h ;return target address + mov a,h + ora l + ret + end + strncpy.asm +;Copyright (C) 1981,1982,1983 by Manx Software Systems +; :ts=8 + public strncpy_ +strncpy_: + lxi h,7 + dad sp + push b + mov b,m + dcx h + mov c,m ;BC = len + dcx h + mov d,m + dcx h + mov e,m ;DE = s2 + dcx h + mov a,m + dcx h + mov l,m + mov h,a ;HL = s1 + push h ;save target for return +cpyloop: + mov a,b ;while (len) { + ora c + jz done + ldax d ;if (*s1 = *s2) ++s1 + mov m,a + ora a + jz padding + inx d +padding: + inx h ;++s2 + dcx b ;--len + jmp cpyloop ;} +done: + pop h ;return target address + pop b + mov a,h + ora l + ret + end + strcat.asm +;Copyright (C) 1981,1982,1983 by Manx Software Systems +; :ts=8 + public strcat_ ;strcat(s1,s2) +strcat_: + lxi h,5 + dad sp + push b + lxi b,32767 + jmp same +; + public strncat_ ;strncat(s1,s2,len) +strncat_: + lxi h,7 + dad sp + push b + mov b,m + dcx h + mov c,m ;BC = len + dcx h +same: + mov d,m + dcx h + mov e,m ;DE = s2 + dcx h + mov a,m + dcx h + mov l,m + mov h,a ;HL = s1 + push h ;save destination for return value + xra a +eloop: + cmp m ;while (*s1) ++s1; + jz cpyloop + inx h + jmp eloop ;} +cpyloop: ;while (len) { + mov a,b + ora c + jz done + ldax d ;if ((*s1 = *s2) == 0) break + mov m,a + ora a + jz done + inx d ;++s1 + inx h ;++s2 + dcx b ;--len + jmp cpyloop ;} +done: + mov m,a ;guarantee null termination + pop h + pop b + mov a,h + ora l + ret + end + index.asm +;Copyright (C) 1981,1982,1983 by Manx Software Systems +; :ts=8 + public index_ +index_: + lxi h,2 + dad sp + mov e,m ;DE = destination + inx h + mov d,m + inx h + mov l,m + xchg ;e has char to look for +scan: + mov a,m + cmp e + jz foundit + ora a + jz noluck + inx h + jmp scan +; +noluck: + lxi h,0 + xra a + ret +; +foundit: + mov a,h + ora l + ret + end + rindex.asm +;Copyright (C) 1981,1982,1983 by Manx Software Systems +; :ts=8 + public rindex_ +rindex_: + push b + lxi h,4 + dad sp + mov e,m ;DE = destination + inx h + mov d,m + inx h + mov l,m + xchg ;e has char to look for + lxi b,0 + xra a +toend: + cmp m ;scan for end of string + jz scan + inx h + inx b + jmp toend + +scan: + mov a,b + ora c + jz noluck + dcx b + dcx h + mov a,m + cmp e + jnz scan + mov a,h + ora l + pop b + ret +noluck: + lxi h,0 + xra a + pop b + ret +; + end + strlen.asm +;Copyright (C) 1981,1982,1983 by Manx Software Systems +; :ts=8 + public strlen_ +strlen_: LXI H,2 + DAD SP + MOV A,M + INX H + MOV H,M + MOV L,A + LXI D,0 + XRA A +.stl: CMP M + JZ .stlx + INX D + INX H + JMP .stl +.stlx: XCHG + mov a,l + ora h + RET + end + setmem.asm +;Copyright (C) 1983 by Manx Software Systems + public setmem_ +setmem_: push b + lxi h,4 + dad sp + mov e,m + inx h + mov d,m + inx h + mov c,m + inx h + mov b,m + inx h + mov l,m + xchg +setloop: + mov a,b + ora c + jz done + mov m,e + inx h + dcx b + jmp setloop +done: pop b + ret + end + movmem.asm +;Copyright (C) 1983 by Manx Software Systems +; :ts=8 + public movmem_ ;movmem(src,dst,len) +movmem_: + push b + lxi h,9 + dad sp + mov b,m ;BC=len + dcx h + mov c,m + dcx h + mov d,m ;DE=dst + dcx h + mov e,m + dcx h + mov a,m + dcx h + mov l,m ;HL=src + mov h,a + cmp d + jc movedown + jnz moveup + mov a,l + cmp e + jc movedown + jz done +moveup: ;src > dst + dad b + xchg + dad b + xra a + adi 3 ;test if z80 + jpe uploop ;not z80 use loop to move data + xchg + dcx d + dcx h + db 237,184 ;lddr + pop b + ret +; +uploop: ;HL=dst, DE=src + dcx d + dcx h + ldax d + mov m,a + dcx b + mov a,b + ora c + jnz uploop + pop b + ret +; +movedown: ;src < dst + xra a + adi 3 ;test if z80 + jpe downloop ;not z80 use loop to move data + db 237,176 ;ldir + pop b + ret +; +downloop: + mov a,m + stax d + inx d + inx h + dcx b + mov a,b + ora c + jnz downloop +done: + pop b + ret + end + swapmem.asm +; Copyright (C) 1983 by Manx Software Systems +; :ts=8 + public swapmem_ ;swapmem(s1,s2,len) +swapmem_: + lxi h,7 + dad sp + push b + mov b,m + dcx h + mov c,m ;BC = len + dcx h + mov d,m + dcx h + mov e,m ;DE = s2 + dcx h + mov a,m + dcx h + mov l,m + mov h,a ;HL = s1 + + mov a,c + ora a + jnz bok + dcr b +bok: + push b +swaploop: + mov b,m + ldax d + mov m,a + mov a,b + stax d + inx h + inx d + dcr c + jnz swaploop + pop psw + ora a + jz done + dcr a + push psw + jmp swaploop +done: + pop b + ret + end + toupper.asm +;Copyright (C) 1981,1982 by Manx Software Systems +; :ts=8 + public toupper_ +toupper_: + lxi h,2 + dad sp + mov a,m + cpi 'a' + jc skip + cpi 'z'+1 + jnc skip + sui 'a'-'A' +skip: + mov l,a + mvi h,0 + ora a + ret +; +; + public tolower_ +; +tolower_: + lxi h,2 + dad sp + mov a,m + cpi 'A' + jc skip2 + cpi 'Z'+1 + jnc skip2 + adi 'a'-'A' +skip2: + mov l,a + mvi h,0 + ora a + ret + end + lsubs.asm +; Copyright (C) 1982, 1983, 1984 by Manx Software Systems +; :ts=8 + extrn lnprm,lntmp,lnsec +; + public .llis ;load long immediate secondary +.llis: + pop d ;get return addr + lxi h,4 ;size of long + dad d + push h ;put back correct return addr + xchg + ;fall through into .llds +; + public .llds ;load long into secondary accum +.llds: + lxi d,lnsec + jmp lload +; + public .llip ;load long immediate primary +.llip: + pop d ;get return addr + lxi h,4 ;size of long + dad d + push h ;put back correct return addr + xchg + ;fall through into .lldp +; + public .lldp ;load long into primary accum +.lldp: + lxi d,lnprm +lload: + mov a,m + stax d + inx d + inx h + mov a,m + stax d + inx d + inx h + mov a,m + stax d + inx d + inx h + mov a,m + stax d + ret +; + public .lst ;store long at addr in HL +.lst: + lxi d,lnprm + ldax d + mov m,a + inx h + inx d + ldax d + mov m,a + inx h + inx d + ldax d + mov m,a + inx h + inx d + ldax d + mov m,a + ret +; + public .lpsh ;push long onto the stack +.lpsh: ;from the primary accumulator + pop d ;get return address + lxi h,lnprm+3 + lhld lnprm+2 + push h + lhld lnprm + push h + xchg + pchl +; + public .lpop ;pop long into secondary accum +.lpop: + pop d ;get return address + pop h ;bytes 0 and 1 + shld lnsec + pop h + shld lnsec+2 + xchg + pchl +; + public .lswap ;exchange primary and secondary +.lswap: + lhld lnsec + xchg + lhld lnprm + shld lnsec + xchg + shld lnprm + lhld lnsec+2 + xchg + lhld lnprm+2 + shld lnsec+2 + xchg + shld lnprm+2 + ret +; + public .lng ;negate primary +.lng: + lxi h,lnprm +negate: + xra a + mvi d,4 +ngloop: + mvi a,0 + sbb m + mov m,a + inx h + dcr d + jnz ngloop + ret +; + public .ltst ;test if primary is zero +.ltst: + lxi h,lnprm + mvi d,4 +tstlp: + mov a,m + ora a + jnz true + inx h + dcr d + jnz tstlp + jmp false +; + public .lcmp ;compare primary and secondary +; + ;return 0 if p == s +p.lt.s: ;return < 0 if p < s + xra a + dcr a + pop b + ret +; +p.gt.s: ; > 0 if p > s + xra a + inr a + pop b + ret +; +.lcmp: + push b + lxi d,lnprm+3 + lxi h,lnsec+3 + mov a,m + xri 80h + mov c,a + ldax d + xri 80h + cmp c + mvi b,4 + jmp pswchk + + public .ulcmp +.ulcmp: + push b + lxi d,lnprm+3 + lxi h,lnsec+3 + mvi b,4 +cmploop: + ldax d + cmp m +pswchk: + jc p.lt.s + jnz p.gt.s + dcx h + dcx d + dcr b + jnz cmploop + ;return 0 if p == s + xra a + pop b + ret +; + public .lad ;add secondary to primary +.lad: + ;DE is used as primary address + ;and HL is used as secondary address + push b + lxi d,lnprm + lxi h,lnsec + xra a ;clear carry + mvi b,4 +adloop: + ldax d + adc m + stax d + inx h + inx d + dcr b + jnz adloop + pop b + ret +; + public .lsb ;subtract secondary from primary +.lsb: + push b + lxi d,lnprm + lxi h,lnsec + xra a ;clear carry + mvi b,4 +sbloop: + ldax d + sbb m + stax d + inx h + inx d + dcr b + jnz sbloop + pop b + ret +; + public .lan ;and primary with secondary +.lan: + push b + lxi d,lnprm + lxi h,lnsec + mvi b,4 +ndloop: + ldax d + ana m + stax d + inx h + inx d + dcr b + jnz ndloop + pop b + ret +; + public .lor ;or primary with secondary +.lor: + push b + lxi d,lnprm + lxi h,lnsec + mvi b,4 +orloop: + ldax d + ora m + stax d + inx h + inx d + dcr b + jnz orloop + pop b + ret +; + public .lxr ;exclusive or primary with secondary +.lxr: + push b + lxi d,lnprm + lxi h,lnsec + mvi b,4 +xrloop: + ldax d + xra m + stax d + inx h + inx d + dcr b + jnz xrloop + pop b + ret +; + public .lcm ;complement primary +.lcm: + lxi h,lnprm + mvi d,4 +cmloop: + mov a,m + cma + mov m,a + inx h + dcr d + jnz cmloop + ret +; + public .lls ;shift primary left by secondary +.lls: + lda lnsec + ani 03fH ;restrict to 63 bits + rz + lhld lnprm + xchg + lhld lnprm+2 ;DE has low word, HL has high word +lsloop: + dad h ;shift high word + xchg + dad h ;shift low word + xchg + jnc lsnc + inr l ;carry into high word +lsnc: + dcr a + jnz lsloop + shld lnprm+2 ;put back high word + xchg + shld lnprm + ret +; + public .lur ;unsigned right shift primary by secondary bits +.lur: + clc ;propogate 0 bit + jmp rs_sub +; + public .lrs ;right shift primary by secondary bits +.lrs: + lda lnprm+3 + ral ;set carry to MSB +rs_sub: + push psw + lda lnsec + ani 03fH ;limit to 63 places + jz rsdone + mov d,a +rslp1: + lxi h,lnprm+3 + mvi e,4 + pop psw ;get correct carry setting + push psw +rslp2: + mov a,m + rar + mov m,a + dcx h + dcr e + jnz rslp2 + dcr d + jnz rslp1 +rsdone: + pop psw + ret +; +; +setup: + lxi h,3 + dad d + mov c,m + mov a,c + ora a + rp + xchg + jmp negate ;force positive +; + public .ldv +.ldv: ;long divide (primary = primary/secondary) + push b + lxi d,lnprm + call setup + push b + lxi d,lnsec + call setup + mov a,c + pop b ;get primary sign + xra c ;merge signs + push psw ;save for return + call dodivide + pop psw + pop b + jm .lng + ret +; + public .lrm +.lrm: ;long remainder (primary = primary%secondary) + push b + lxi d,lnprm + call setup + mov a,c + ora a + push psw + lxi d,lnsec + call setup + call dodivide + lxi d,lntmp + lxi h,lnprm + mvi b,4 +remsave: + ldax d + mov m,a + inx d + inx h + dcr b + jnz remsave + pop psw + pop b + jm .lng + ret +; + public .lud +.lud: ;unsigned long divide (primary = primary/secondary) + push b + call dodivide + pop b + ret +; + public .lum +.lum: ;long remainder (primary = primary%secondary) + push b + call dodivide + lxi d,lntmp + lxi h,lnprm + mvi b,4 +uremsave: + ldax d + mov m,a + inx d + inx h + dcr b + jnz uremsave + pop b + ret +; +; +dodivide: + mvi b,4 + lxi h,lntmp ;clear quotient buffer + xra a +quinit: + mov m,a + inx h + dcr b + jnz quinit + + mvi a,32 ;initialize loop counter +divloop: + push psw + lxi h,lnprm + mvi b,8 + ora a ;clear carry +shlp: + mov a,m + adc a ;shift one bit to the left + mov m,a + inx h + dcr b + jnz shlp + sbb a + ani 1 + mov c,a + + mvi b,4 + lxi d,lntmp + lxi h,lnsec + ora a ;clear carry +sublp: + ldax d + sbb m + stax d + inx d + inx h + dcr b + jnz sublp + mov a,c + sbi 0 + jnz zerobit +onebit: + lxi h,lnprm + inr m + pop psw + dcr a + jnz divloop + ret +; +zerobit: + pop psw + dcr a + jz restore + push psw + lxi h,lnprm + mvi b,8 + ora a ;clear carry +zshlp: + mov a,m + adc a ;shift one bit to the left + mov m,a + inx h + dcr b + jnz zshlp + sbb a + mov c,a + + mvi b,4 + lxi d,lntmp + lxi h,lnsec + ora a ;clear carry +daddlp: + ldax d + adc m + stax d + inx d + inx h + dcr b + jnz daddlp + mov a,c + aci 0 + jnz zerobit + jmp onebit +; +restore: ;fix up remainder if still negative + mvi b,4 + lxi d,lntmp + lxi h,lnsec + ora a ;clear carry +resloop: + ldax d + adc m + stax d + inx d + inx h + dcr b + jnz resloop + ret +; +; + public .lml +.lml: ;long multiply (primary = primary * secondary) + push b +; + lxi h,lnprm + mvi b,4 + lxi d,lntmp ;copy multiplier into work area +msav: + mov a,m + stax d + mvi m,0 + inx h + inx d + dcr b + jnz msav +; + mvi a,32 ;initialize loop counter +muloop: + push psw + lxi h,lnprm + mvi b,8 + ora a ;clear carry +mshlp: + mov a,m + adc a ;shift one bit to the left + mov m,a + inx h + dcr b + jnz mshlp + jnc mnext + + mvi b,4 + lxi d,lnprm + lxi h,lnsec + ora a ;clear carry +maddlp: + ldax d + adc m + stax d + inx d + inx h + dcr b + jnz maddlp +; +mnext: + pop psw + dcr a + jnz muloop + pop b + ret +; +; + public .leq +.leq: + call .lcmp + jz true +false: + lxi h,0 + xra a + ret +; + public .lne +.lne: + call .lcmp + jz false +true: + lxi h,1 + xra a + inr a + ret +; + public .llt +.llt: + call .lcmp + jm true + jmp false +; + public .lle +.lle: + call .lcmp + jm true + jz true + jmp false +; + public .lge +.lge: + call .lcmp + jm false + jmp true +; + public .lgt +.lgt: + call .lcmp + jm false + jz false + jmp true +; + public .lul +.lul: + call .ulcmp + jm true + jmp false +; + public .lue +.lue: + call .ulcmp + jm true + jz true + jmp false +; + public .luf +.luf: + call .ulcmp + jm false + jmp true +; + public .lug +.lug: + call .ulcmp + jm false + jz false + jmp true +; + public .utox +.utox: + shld lnprm +posconv: + lxi h,0 + shld lnprm+2 + ret +; + public .itox +.itox: + shld lnprm + mov a,h + ora a + jp posconv + lxi h,-1 + shld lnprm+2 + ret +; + public .xtoi +.xtoi: + lhld lnprm + ret + end + divide.asm +;Copyright (C) 1981,1982,1983 by Manx Software Systems +; :ts=8 + extrn .ng + public .dv,.ud +.dv: ; DE has dividend, HL has divisor + mov a,d + xra h ;check if signs differ + push psw ;and remember + call divsub ;use same routine as modulo + xchg ;and swap results + pop psw + jm .ng ;negate result if signs of operands differ + mov a,l + ora h + RET +; +.ud: + CALL .um ;use same routine as modulo + XCHG ;and swap results + mov a,l + ora h + RET +; + public .rm,.um +.rm: + mov a,d + push psw + call divsub + pop psw + ora a + jm .ng ;negate result if dividend was signed + mov a,h + ora l + ret +; +divsub: + mov a,h + ora a + jp hlpos + cma + mov h,a + mov a,l + cma + mov l,a + inx h +hlpos: + mov a,d + ora a + jp .um + cma + mov d,a + mov a,e + cma + mov e,a + inx d +; fall through into .um +; +.um: push b ;save for C + mov c,l + mov b,h + lxi h,0 + call div16 + pop b + mov a,l ;set flags for C + ora h + ret +; +; div16: divides (hl,de) by bc +; returns remainder in hl, quotient in de + public div16 +div16: + mov a,c + cma + mov c,a + mov a,b + cma + mov b,a + inx b + MVI A,16 ;iteration count +divloop: + DAD H ;shift hl left + XCHG + DAD H ;shift de left + XCHG + JNC nocy + INR L ;carry into high part +nocy: + dad b ;subtract divisor + jc setbit + push psw + mov a,l + sub c + mov l,a + mov a,h + sbb b + mov h,a + pop psw + DCR A ;count times thru + JNZ divloop + ret +setbit: + INR E ;set quotient bit + DCR A ;count times thru + JNZ divloop + ret + end + shifts.asm +;Copyright (C) 1981,1982 by Manx Software Systems +; + public .ml +.ml: PUSH B + MOV B,H + MOV C,L + LXI H,0 ;CLEAR RESULT + MVI A,16 ;ITERATION COUNT +.mlp: DAD H ;SHIFT LEFT + XCHG ; NOW SHIFT DE LEFT + DAD H + XCHG + JNC .msk + DAD B +.msk: DCR A ;COUNT TIMES THRU + JNZ .mlp ;go thru 16 times + POP B + mov a,l + ora h + RET +; + public .rs +.rs: XCHG + mov a,e + ani 31 + mov e,a + jz setcc + MOV A,H + ORA H + JP .arloop +; +.sign: MOV A,H + STC + RAR + MOV H,A + MOV A,L + RAR + MOV L,A + DCR E + JNZ .sign + ora h + ret +; + public .ls +.ls: XCHG + mov a,e + ani 31 + mov e,a + jz setcc +lslp: + DAD H + DCR E + JNZ lslp +setcc: + mov a,l + ora h + ret +; + public .ur +.ur: XCHG + mov a,e + ani 31 + mov e,a + jz setcc +.arloop: MOV A,H + ORA A + RAR + MOV H,A + MOV A,L + RAR + MOV L,A + DCR E + JNZ .arloop + ora h + ret +; + end + bitopr.asm +;Copyright (C) 1981,1982 by Manx Software Systems + public .an +.an: MOV A,H + ANA D + MOV H,A + MOV A,L + ANA E + MOV L,A + ora h + RET +; + public .cm +.cm: MOV A,H + CMA + MOV H,A + MOV A,L + CMA + MOV L,A + ora h + RET +; + public .or +.or: MOV A,H + ORA D + MOV H,A + MOV A,L + ORA E + MOV L,A + ora h + RET +; + public .xr +.xr: MOV A,H + XRA D + MOV H,A + MOV A,L + XRA E + MOV L,A + ora h + RET + end + support.asm +;Copyright (C) 1981,1982 by Manx Software Systems +; Copyright (C) 1981 Thomas Fenwick +; :ts=8 + public .nt +.nt: MOV A,H + ORA L + jz .true + jmp .false +; + public .eq,.ne +.eq: mov a,l + sub e + jnz .false + mov a,h + sub d + jz .true +.false: lxi h,0 + xra a + ret +; +.ne: mov a,l + sub e + jnz .true + mov a,h + sub d + jz .false +.true: lxi h,1 + mov a,l + ora h + RET +; + public .le,.ge +.ge: ; ge + XCHG +.le: mov a,h + xra d + jm .lediff ; signs differ + ; signs alike + mov a,l + sub e + mov a,h + sbb d + cmc + mvi a,0 + aci 0 + mov l,a + mvi h,0 + ret +.lediff: mov a,d + rlc + ani 1 + mov l,a + mvi h,0 + ret +; + public .lt,.gt +.lt: + XCHG +.gt: mov a,h + xra d + jm .gtdiff ; signs differ + ; signs alike + mov a,l + sub e + mov a,h + sbb d + mvi a,0 + aci 0 + mov l,a + mvi h,0 + ret +.gtdiff: mov a,h + rlc + ani 1 + mov l,a + mvi h,0 + ret +; + public .ng +.ng: MOV A,L + CMA + MOV L,A + MOV A,H + CMA + MOV H,A + INX H + mov a,l + ora h + RET +; + public .sb +.sb: XCHG + mov a,l + sub e + mov l,a + mov a,h + sbb d + mov h,a + ora l + ret +; + public .swt +.swt: xchg + pop h + PUSH B + MOV B,D + MOV C,E + MOV E,M + INX H + MOV D,M +swt.1: DCX D + MOV A,D + ORA A + JM swt.def + INX H + MOV A,C + CMP M + JZ swt.3 + INX H +swt.2: INX H + INX H + JMP swt.1 +swt.3: INX H + MOV A,B + CMP M + JNZ swt.2 +swt.def: INX H + MOV A,M + INX H + MOV H,M + MOV L,A + POP B + PCHL +; + public .ue,.uf +.uf: ; uge + XCHG +.ue: mov a,l ; ule + sub e + mov a,h + sbb d + mvi a,0 + cmc + aci 0 + mov l,a + mvi h,0 + ret +; + public .ug,.ul +.ul: ; ult + XCHG +.ug: mov a,l + sub e + mov a,h + sbb d + mvi a,0 + aci 0 + mov l,a + mvi h,0 + ret +; + end + port.asm +; +; Direct Port I/O Functions for AZTEC C II +; +; Copyright (c) 1982 William C. Colley III +; +; I grant Manx Software Systems permission to incorporate these functions +; into the AZTEC C library subject only to the condition that my copyright +; notice remain in the source code. WCC3. +; +; These functions allow AZTEC C II to get to the machine I/O ports. They +; are more complicated than might be expected as they can't use the Z-80's +; "IN A,(C)" and "OUT (C),A" instructions and still remain 8080-compatible. +; Self-modifying code is also out of the question as that kills ROMability. +; I therefore go through the hassle of setting up temporary subroutines in +; RAM and calling them. +; +; The functions in the package are: +; +; char in(p) Returns contents of input port p. +; char p; +; +; out(p,c) Sends character c to output port p. +; char p, c; +; + CSEG + PUBLIC in_, out_ + +;***************************************************************************** + +in_: LXI H, 2 ;Get port number from stack. + DAD SP + MOV H, M + + MVI L, 0dbh ;Form input instruction of temporary + SHLD TMP ; subroutine and set it up in core. + + LXI H, TMP + 2 ;Add return instruction to temporary + MVI M, 0c9h ; subroutine in core. + + CALL TMP ;Call temporary subroutine. + + MOV L, A ;Return result. + MVI H, 0 + ORA H + RET + +;***************************************************************************** + +out_: LXI H, 4 ;Get data and port number from stack. + DAD SP + MOV A, M + DCX H + DCX H + MOV H, M + + MVI L, 0d3h ;Form output instruction of temporary + SHLD TMP ; subroutine and set it up in core. + + LXI H, TMP + 2 ;Add return instruction to temporary + MVI M, 0c9h ; subroutine in core. + + JMP TMP ;Call temporary subroutine and return. + +;***************************************************************************** + + DSEG + +TMP: DS 3 ;Space for temporary subroutine. + +;***************************************************************************** + + END + \ No newline at end of file diff --git a/Source/Images/d_aztecc/u0/LIBC.REL b/Source/Images/d_aztecc/u0/LIBC.REL new file mode 100644 index 00000000..becc5947 Binary files /dev/null and b/Source/Images/d_aztecc/u0/LIBC.REL differ diff --git a/Source/Images/d_aztecc/u0/LIBCSRC.ARC b/Source/Images/d_aztecc/u0/LIBCSRC.ARC new file mode 100644 index 00000000..a6778bea --- /dev/null +++ b/Source/Images/d_aztecc/u0/LIBCSRC.ARC @@ -0,0 +1,2099 @@ + scanf.c +/* Copyright (C) 1982 by Manx Software Systems */ +#include "stdio.h" + +static int scnlast; + +scanf(fmt, args) +char *fmt; int *args; +{ + int gchar(); + + scnlast = 0; + return scanfmt(gchar, fmt, &args); +} + +static gchar(what) +{ + if (what == 0) { + if (feof(stdin)) + scnlast = EOF; + else + scnlast = agetc(stdin); + } else + scnlast = ungetc(scnlast, stdin); + return scnlast; +} + + fscanf.c +/* Copyright (C) 1982 by Manx Software Systems */ +#include "stdio.h" + +static int scnlast; +static FILE *scnfp; + +fscanf(fp, fmt, args) +FILE *fp; char *fmt; int *args; +{ + int gchar(); + + scnfp = fp; + scnlast = 0; + return scanfmt(gchar, fmt, &args); +} + +static gchar(what) +{ + if (what == 0) { + if (feof(scnfp)) + scnlast = EOF; + else + scnlast = agetc(scnfp); + } else + scnlast = ungetc(scnlast, scnfp); + return scnlast; +} + + sscanf.c +/* Copyright (C) 1983 by Manx Software Systems */ +static char *scnstr; +static char quit; + +sscanf(string, fmt, arg) +char *string, *fmt; int *arg; +{ + int sgetc(); + + scnstr = string; + quit = 0; + return scanfmt(sgetc, fmt, &arg); +} + +static +sgetc(what) +{ + if (what == 0) { + if (*scnstr) + return *scnstr++ & 255; + quit = 1; + } else { + if (!quit) + return *--scnstr & 255; + } + return -1; +} + scan.c +/* Copyright (C) 1982, 1984 by Manx Software Systems */ +#include + +#define EOF -1 + +static int maxwidth; +static int (*gsub)(); +char *index(); + +scanfmt(getsub, fmt, args) +int (*getsub)(); register char *fmt; register int **args; +{ +#ifdef FLOAT + double atof(); +#endif + long lv; + register int c, count, base; + char suppress, lflag, widflg; + char *cp; + auto char tlist[130]; + static char list[] = "ABCDEFabcdef9876543210"; + static char vals[] = { + 10,11,12,13,14,15,10,11,12,13,14,15,9,8,7,6,5,4,3,2,1,0 + }; + + count = 0; + gsub = getsub; + while (c = *fmt++) { + if (c == '%') { + widflg = lflag = suppress = 0; + maxwidth = 127; + if (*fmt == '*') { + ++fmt; + suppress = 1; + } + if (isdigit(*fmt)) { + maxwidth = 0; + do { + maxwidth = maxwidth*10 + *fmt - '0'; + } while (isdigit(*++fmt)); + } + if (*fmt == 'l') { + lflag = 1; + ++fmt; + } + + switch (*fmt++) { + case '%': + c = '%'; + goto matchit; + case 'h': /* specify short (for compatibility) */ + lflag = 0; + goto decimal; + case 'D': + lflag = 1; + case 'd': + decimal: + c = 12; + base = 10; + goto getval; + + case 'X': + lflag = 1; + case 'x': + c = 0; + base = 16; + goto getval; + + case 'O': + lflag = 1; + case 'o': + c = 14; + base = 8; + getval: + if (skipblank()) + goto stopscan; + if (getnum(&list[c], &vals[c], base, &lv) == 0) + goto stopscan; + if (!suppress) { + if (lflag) + *(long *)(*args++) = lv; + else + **args++ = lv; + ++count; + } + break; + +#ifdef FLOAT + case 'E': + case 'F': + lflag = 1; + case 'e': + case 'f': + if (skipblank()) + goto stopscan; + if (getflt(tlist)) + goto stopscan; + if (!suppress) { + if (lflag) + *(double *)(*args++) = atof(tlist); + else + *(float *)(*args++) = atof(tlist); + ++count; + } + break; +#endif + case '[': + lflag = 0; + if (*fmt == '^' || *fmt == '~') { + ++fmt; + lflag = 1; + } + for (cp = tlist ; (c = *fmt++) != ']' ; ) + *cp++ = c; + *cp = 0; + goto string; + case 's': + lflag = 1; + tlist[0] = ' '; + tlist[1] = '\t'; + tlist[2] = '\n'; + tlist[3] = 0; + string: + if (skipblank()) + goto stopscan; + charstring: + if (!suppress) + cp = *args++; + widflg = 0; + while (maxwidth--) { + if ((c = (*gsub)(0)) == EOF) + break; + if (lflag ? (index(tlist,c)!=0) : (index(tlist,c)==0)) { + (*gsub)(1); /* unget last character */ + break; + } + if (!suppress) + *cp++ = c; + widflg = 1; + } + if (!widflg) + goto stopscan; + if (!suppress) { + *cp = 0; + ++count; + } + break; + + case 'c': + if (!widflg) + maxwidth = 1; + tlist[0] = 0; + lflag = 1; + goto charstring; + } + } else if (isspace(c)) { + if (skipblank()) + goto stopscan; + } else { +matchit: + if ((*gsub)(0) != c) { + (*gsub)(1); + goto stopscan; + } + } + } + +stopscan: + if (count == 0) { + if ((*gsub)(0) == EOF) + return EOF; + (*gsub)(1); + } + return count; +} + +skipblank() +{ + while (isspace((*gsub)(0))) + ; + if ((*gsub)(1) == EOF) + return EOF; + return 0; +} + +#ifdef FLOAT +getflt(buffer) +char *buffer; +{ + register char *cp; + register int c; + char decpt, sign, exp; + + cp = buffer; + sign = exp = decpt = 0; + + while (maxwidth--) { + c = (*gsub)(0); + if (!sign && (c == '-' || c == '+')) + sign = 1; + else if (!decpt && c == '.') + decpt = 1; + else if (!exp && (c == 'e' || c == 'E')) { + sign = 0; + exp = decpt = 1; + } else if (!isdigit(c)) { + (*gsub)(1); + break; + } + *cp++ = c; + } + *cp = 0; + return cp==buffer; +} +#endif + +getnum(list, values, base, valp) +char *list; char *values; long *valp; +{ + register char *cp; + register int c, cnt; + long val; + int sign; + + if (maxwidth <= 0) + return 0L; + val = cnt = sign = 0; + if ((c = (*gsub)(0)) == '-') { + sign = 1; + ++cnt; + } else if (c == '+') + ++cnt; + else + (*gsub)(1); + + for ( ; cnt < maxwidth ; ++cnt) { + if ((cp = index(list, c = (*gsub)(0))) == 0) { + if (base == 16 && val == 0 && (c=='x' || c=='X')) + continue; + (*gsub)(1); + break; + } + val *= base; + val += values[cp-list]; + } + if (sign) + *valp = -val; + else + *valp = val; + return cnt; +} + + printf.c +/* Copyright (C) 1981,1982 by Manx Software Systems */ + +printf(fmt,args) +char *fmt; unsigned args; +{ + extern int putchar(); + + format(putchar,fmt,&args); +} + fprintf.c +/* Copyright (C) 1981,1982 by Manx Software Systems */ +#include "stdio.h" + +static FILE *Stream; + +fprintf(stream,fmt,args) +FILE *stream; char *fmt; unsigned args; +{ + int fpsub(); + + Stream = stream; + return format(fpsub,fmt,&args); +} + +static +fpsub(c) +{ + return aputc(c,Stream); +} + sprintf.c +/* Copyright (C) 1982 by Manx Software Systems */ +static char *buff; + +sprintf(str,fmt,args) +char *str, *fmt; unsigned args; +{ + int spsub(); + register int i; + + buff = str; + i = format(spsub,fmt,&args); + *buff = 0; + return i; +} + +static +spsub(c) +{ + return (*buff++ = c)&0xff; +} + + format.c +/* Copyright (C) 1981,1982,1983 by Manx Software Systems */ +#include + +char *fmtcvt(); + +format(putsub, fmt, argp) +register int (*putsub)(); register char *fmt; char *argp; +{ + register int c; + union { + int *ip; + char *cp; + char **cpp; +#ifdef FLOAT + double *dp; +#endif + } args; + int charcount; + int rj, fillc; + int maxwidth, width; + int i, k; + char *cp; + auto char s[200]; + + charcount = 0; + args.cp = argp; + while ( c = *fmt++ ) { + if ( c == '%' ) { + s[14] = 0; + rj = 1; + fillc = ' '; + maxwidth = 10000; + if ((c = *fmt++) == '-') { + rj = 0; + c = *fmt++; + } + if (c == '0') { + fillc = '0'; + c = *fmt++; + } + if (c == '*') { + width = *args.ip++; + c = *fmt++; + } else { + for (width = 0 ; isdigit(c) ; c = *fmt++) + width = width*10 + c - '0'; + } + if ( c == '.' ) { + if ((c = *fmt++) == '*') { + maxwidth = *args.ip++; + c = *fmt++; + } else { + for (maxwidth = 0 ; isdigit(c) ; c = *fmt++) + maxwidth = maxwidth*10 + c - '0'; + } + } + i = sizeof(int); + if (c == 'l') { + c = *fmt++; + i = sizeof(long); + } else if (c == 'h') + c = *fmt++; + + switch ( c ) { + case 'o': + k = 8; + goto do_conversion; + case 'u': + k = 10; + goto do_conversion; + case 'x': + k = 16; + goto do_conversion; + + case 'd': + k = -10; + do_conversion: + cp = fmtcvt(args.cp, k, s+14, i); + args.cp += i; + break; + + case 's': + i = strlen(cp = *args.cpp++); + goto havelen; +#ifdef FLOAT + case 'e': + case 'f': + case 'g': + ftoa(*args.dp++, s, maxwidth==10000?6:maxwidth, c-'e'); + i = strlen(cp = s); + maxwidth = 200; + goto havelen; +#endif + + case 'c': + c = *args.ip++; + default: + *(cp = s+13) = c; + break; + } + + i = (s+14) - cp; + havelen: + if ( i > maxwidth ) + i = maxwidth; + + if ( rj ) { + for (; width-- > i ; ++charcount) + if ((*putsub)(fillc) == -1) + return -1; + } + for ( k = 0 ; *cp && k < maxwidth ; ++k ) + if ((*putsub)(*cp++) == -1) + return -1; + charcount += k; + + if ( !rj ) { + for (; width-- > i ; ++charcount) + if ((*putsub)(' ') == -1) + return -1; + } + } else { + if ((*putsub)(c) == -1) + return -1; + ++charcount; + } + } + return charcount; +} + + fopen.c +/* Copyright (C) 1981,1982,1983,1984 by Manx Software Systems */ +#include "stdio.h" +#include "fcntl.h" +#include "errno.h" + +extern int errno; + +static struct modes { + char fmode[3]; + int omode; +} modes[] = { + "r", O_RDONLY, + "r+", O_RDWR, + "w", (O_WRONLY|O_CREAT|O_TRUNC), + "w+", (O_RDWR|O_CREAT|O_TRUNC), + "a", (O_WRONLY|O_CREAT|O_APPEND), + "a+", (O_RDWR|O_CREAT|O_APPEND), + "x", (O_WRONLY|O_CREAT|O_EXCL), + "x+", (O_RDWR|O_CREAT|O_EXCL), + "", 0, +}; + +FILE * +fopen(name,mode) +char *name,*mode; +{ + register FILE *fp; + FILE *newstream(), *freopen(); + + if ((fp = newstream()) == NULL) + return NULL; + return freopen(name, mode, fp); +} + +FILE * +freopen(name, mode, fp) +char *name,*mode; FILE *fp; +{ + register struct modes *mp; + register int fd; + + fclose(fp); + + for (mp = modes ; ; ++mp) { + if (mp->fmode == 0) { + errno = EINVAL; + return NULL; + } + if (strcmp(mp->fmode, mode) == 0) + break; + } + +/* + Don't try to optimize the next 3 lines. Since _unit is a char, + assigning to it in the if statement will cause the -1 test to fail + on unsigned char machines. +*/ + if ((fd = open(name, mp->omode)) == -1) + return (NULL); + fp->_unit = fd; + fp->_flags = _BUSY; + return fp; +} + + fdopen.c +/* Copyright (C) 1984 by Manx Software Systems */ +#include "stdio.h" + +FILE * +fdopen(fd,mode) +char *mode; +{ + register FILE *fp; + FILE *newstream(); + + if ((fp = newstream()) == NULL) + return NULL; + fp->_unit = fd; + fp->_flags = _BUSY; + return fp; +} + + fread.c +/* Copyright (C) 1981,1982 by Manx Software Systems */ +#include "stdio.h" + +fread(buffer,size,number,stream) +register char *buffer; unsigned size; int number; +FILE *stream; +{ + int total; + register int c,i; + + for ( total = 0 ; total < number ; ++total ) { + for ( i = size ; i ; --i ) { + if ( (c = getc(stream)) == EOF ) + return total; + *buffer++ = c; + } + } + return total; +} + fwrite.c +/* Copyright (C) 1981,1982 by Manx Software Systems */ +#include "stdio.h" + +fwrite(buffer,size,number,stream) +register char *buffer; unsigned size,number; +FILE *stream; +{ + register unsigned i,max; + + max = size * number; + for ( i = 0 ; i < max ; ++i ) { + if ( putc(*buffer++,stream) == EOF ) + return 0; + } + return number; +} + + fseek.c +/* Copyright (c) 1981, 1982 by Manx Software Systems */ +#include "stdio.h" + +fseek(fp,pos,mode) +register FILE *fp; +long pos; +{ + register int i; + long curpos, lseek(); + + fp->_flags &= ~_EOF; + if (fp->_flags & _DIRTY) { + if (flsh_(fp,-1)) + return EOF; + } else if (mode == 1 && fp->_bp) + pos -= fp->_bend - fp->_bp; + fp->_bp = fp->_bend = NULL; + if (lseek(fp->_unit, pos, mode) < 0) + return EOF; + return 0; +} + +long ftell(fp) +register FILE *fp; +{ + long pos, lseek(); + + pos = lseek(fp->_unit, 0L, 1); /* find out where we are */ + if (fp->_flags & _DIRTY) + pos += fp->_bp - fp->_buff; + else if (fp->_bp) + pos -= fp->_bend - fp->_bp; + return pos; +} + gets.c +/* Copyright (C) 1981,1982 by Manx Software Systems */ +#include "stdio.h" + +#undef getchar + +char *gets(line) +char *line; +{ + register char *cp; + register int i; + + cp = line; + while ((i = getchar()) != EOF && i != '\n') + *cp++ = i; + *cp = 0; + if (i == EOF && cp == line) + return NULL; + return line; +} + fgets.c +/* Copyright (C) 1981,1982 by Manx Software Systems */ +#include "stdio.h" + +char *fgets(s, n, fp) +char *s; FILE *fp; +{ + register c; + register char *cp; + + cp = s; + while (--n > 0 && (c = agetc(fp)) != EOF) { + *cp++ = c; + if (c == '\n') + break; + } + *cp = 0; + if (c == EOF && cp == s) + return NULL; + return(s); +} + getchar.c +/* Copyright (C) 1981,1982 by Manx Software Systems */ +#include "stdio.h" + +#undef getchar + +getchar() +{ + return agetc(stdin); +} + agetc.c +/* Copyright (C) 1981,1982 by Manx Software Systems */ +#include "stdio.h" + +agetc(ptr) +register FILE *ptr; +{ + register int c; + +top: + if ((c = getc(ptr)) != EOF) { + switch (c &= 127) { + case 0x1a: + ptr->_flags |= _EOF; + return EOF; + case '\r': + case 0: + goto top; + } + } + return c; +} + + getw.c +/* Copyright (C) 1982 by Manx Software Systems */ +#include "stdio.h" + +getw(stream) +FILE *stream; +{ + register int x1,x2; + + if ((x1 = getc(stream)) == EOF || (x2 = getc(stream)) == EOF) + return EOF; + return (x2<<8) | x1; +} + getc.c +/* Copyright (C) 1982 by Manx Software Systems */ +#include "stdio.h" + +getc(ptr) +register FILE *ptr; +{ + register int len; + + if (ptr->_bp >= ptr->_bend) { + if (ptr->_flags&(_EOF|_IOERR)) + return EOF; + ptr->_flags &= ~_DIRTY; + if (ptr->_buff == NULL) + getbuff(ptr); + if ((len = read(ptr->_unit,ptr->_buff,ptr->_buflen)) <= 0) { + ptr->_flags |= len==0 ? _EOF : _IOERR; + return EOF; + } + ptr->_bend = (ptr->_bp = ptr->_buff) + len; + } + return *ptr->_bp++ & 255; +} + puts.c +/* Copyright (C) 1981,1982 by Manx Software Systems */ + +puts(str) +register char *str; +{ + while (*str) + if (putchar(*str++) == -1) + return -1; + return putchar('\n'); +} + fputs.c +/* Copyright (C) 1981,1982 by Manx Software Systems */ +#include "stdio.h" + +fputs(s,fp) +register char *s; +FILE *fp; +{ + while ( *s ) + if (aputc(*s++,fp) == EOF) + return(EOF); + return 0; +} + putchar.c +/* Copyright (C) 1981,1982 by Manx Software Systems */ +#include "stdio.h" + +#undef putchar + +putchar(c) +{ + return aputc(c,stdout); +} + puterr.c +/* Copyright (C) 1981,1982 by Manx Software Systems */ +#include "stdio.h" + +puterr(c) +{ + return aputc(c, stderr); +} + aputc.c +/* Copyright (C) 1981,1982 by Manx Software Systems */ +#include "stdio.h" + +aputc(c,ptr) +register int c; register FILE *ptr; +{ + if (c == '\n') + if (putc('\r',ptr) == EOF) + return EOF; + return putc(c,ptr); +} + + putw.c +/* Copyright (C) 1981,1982 by Manx Software Systems */ +#include "stdio.h" + +putw(w,stream) +register unsigned w; +FILE *stream; +{ + if ( putc(w,stream) < 0 ) + return EOF; + else if ( putc((w>>8),stream) < 0 ) + return EOF; + return w; +} + putc.c +/* Copyright (C) 1981,1982,1983,1984 by Manx Software Systems */ +#include "stdio.h" + +putc(c,ptr) +int c; register FILE *ptr; +{ + if (ptr->_bp >= ptr->_bend) + return flsh_(ptr,c&0xff); + return (*ptr->_bp++ = c) & 0xff; +} + +static closall() /* called by exit to close any open files */ +{ + register FILE *fp; + + for ( fp = Cbuffs ; fp < Cbuffs+MAXSTREAM ; ) + fclose(fp++); +} + +fclose(ptr) +register FILE *ptr; +{ + register int err; + + err = 0; + if ( ptr->_flags ) { + if (ptr->_flags&_DIRTY) /* if modifed flush buffer */ + err = flsh_(ptr,-1); + err |= close(ptr->_unit); + if (ptr->_flags&_ALLBUF) + free(ptr->_buff); + } + ptr->_flags = 0; + return err; +} + +flsh_(ptr,data) +register FILE *ptr; +{ + register int size; + extern int (*cls_)(); + + cls_ = closall; + if (ptr->_flags & _IOERR) + return EOF; + if (ptr->_flags & _DIRTY) { + size = ptr->_bp - ptr->_buff; + if (write(ptr->_unit, ptr->_buff, size) != size) { +ioerr: + ptr->_flags |= _IOERR; + ptr->_bend = ptr->_bp = NULL; + return EOF; + } + } + if (data == -1) { + ptr->_flags &= ~_DIRTY; + ptr->_bend = ptr->_bp = NULL; + return 0; + } + if (ptr->_buff == NULL) + getbuff(ptr); + if (ptr->_buflen == 1) { /* unbuffered I/O */ + if (write(ptr->_unit, &data, 1) != 1) + goto ioerr; + return data; + } + ptr->_bp = ptr->_buff; + ptr->_bend = ptr->_buff + ptr->_buflen; + ptr->_flags |= _DIRTY; + return (*ptr->_bp++ = data) & 0xff; +} + ungetc.c +/* Copyright (c) 1981, 1982 by Manx Software Systems */ +#include "stdio.h" + +ungetc(c,ptr) +int c; register FILE *ptr; +{ + if (c == EOF || ptr->_bp <= ptr->_buff) + return EOF; + *--ptr->_bp = c; + return c; +} + + getbuff.c +/* Copyright (C) 1983 by Manx Software Systems */ +/* Copyright (C) 1981,1982 by Manx Software Systems */ +#include "stdio.h" + +FILE Cbuffs[MAXSTREAM] = { + { 0,0,0, _BUSY,0,0,1 }, + { 0,0,0, _BUSY,1,0,1 }, + { 0,0,0, _BUSY,2,0,1 }, +}; + +FILE * +newstream() +{ + register FILE *fp; + + fp = Cbuffs; + while (fp->_flags) + if (++fp >= &Cbuffs[MAXSTREAM]) + return NULL; + + fp->_buff = + fp->_bend = /* nothing in buffer */ + fp->_bp = 0; + return fp; +} + +getbuff(ptr) +register FILE *ptr; +{ + char *buffer; + + if (isatty(ptr->_unit)) { +smlbuff: + ptr->_buflen = 1; + ptr->_buff = &ptr->_bytbuf; + return; + } + if ((buffer = malloc(BUFSIZ)) == NULL) + goto smlbuff; + ptr->_buflen = BUFSIZ; + ptr->_flags |= _ALLBUF; + ptr->_buff = buffer; + return; +} + + setbuf.c +/* Copyright (C) 1981,1982 by Manx Software Systems */ +#include "stdio.h" + +setbuf(stream, buffer) +register FILE *stream; char *buffer; +{ + if (stream->_buff) + return; + if (buffer) { + stream->_buff = buffer; + stream->_buflen = BUFSIZ; + } else { + stream->_buff = &stream->_bytbuf; + stream->_buflen = 1; + } +} + + croot.c +/* Copyright (C) 1981,1982,1984 by Manx Software Systems */ +#include "errno.h" +#include "fcntl.h" +#include "io.h" + +int bdf_(), ret_(); + +/* + * channel table: relates fd's to devices + */ +struct channel chantab[] = { + { 2, 0, 1, 0, ret_, 2 }, + { 0, 2, 1, 0, ret_, 2 }, + { 0, 2, 1, 0, ret_, 2 }, + { 0, 0, 0, 0, bdf_, 0 }, + { 0, 0, 0, 0, bdf_, 0 }, + { 0, 0, 0, 0, bdf_, 0 }, + { 0, 0, 0, 0, bdf_, 0 }, + { 0, 0, 0, 0, bdf_, 0 }, + { 0, 0, 0, 0, bdf_, 0 }, + { 0, 0, 0, 0, bdf_, 0 }, + { 0, 0, 0, 0, bdf_, 0 }, +}; + +#define MAXARGS 30 +static char *Argv[MAXARGS]; +static char Argbuf[128]; +static int Argc; +int (*cls_)() = ret_; + +Croot() +{ + register char *cp, *fname; + register int k; + + movmem((char *)0x81, Argbuf, 127); + Argbuf[*(char *)0x80 & 0x7f] = 0; + Argv[0] = ""; + cp = Argbuf; + Argc = 1; + while (Argc < MAXARGS) { + while (*cp == ' ' || *cp == '\t') + ++cp; + if (*cp == 0) + break; +#ifndef NOREDIR + if (*cp == '>') { /* redirect output */ + k = 1; + goto redirect; + } else if (*cp == '<') { /* redirect input */ + k = 0; +redirect: + while (*++cp == ' ' || *cp == '\t') + ; + fname = cp; + while (*++cp) + if (*cp == ' ' || *cp == '\t') { + *cp++ = 0; + break; + } + close(k); + if (k) + k = creat(fname, 0666); + else + k = open(fname, O_RDONLY); + if (k == -1) { + strcpy(0x80, "Can't open file for redirection: "); + strcat(0x80, fname); + strcat(0x80, "$"); + bdos(9,0x80); + exit(10); + } + } else +#endif + { + Argv[Argc++] = cp; + while (*++cp) + if (*cp == ' ' || *cp == '\t') { + *cp++ = 0; + break; + } + } + } + main(Argc,Argv); + exit(0); +} + +exit(code) +{ + register int fd; + + (*cls_)(); + for (fd = 0 ; fd < MAXCHAN ; ) + close(fd++); + if (code && (bdos(24)&1) != 0) + unlink("A:$$$.SUB"); + _exit(); +} + +bdf_() +{ + errno = EBADF; + return -1; +} + +ret_() +{ + return 0; +} + + open.c +/* Copyright (C) 1982 by Manx Software Systems */ +#include "errno.h" +#include "fcntl.h" +#include "io.h" + +#define MAXFILE 8 /* maximum number of open DISK files */ +int bdf_(), ret_(), fileop(); +/* + * note: The ioctl function knows that the condev read/write numbers are + * 2. It uses this information to patch the read/write tables. + */ +static struct device condev = { 2, 2, 1, 0, ret_ }; +static struct device bdosout= { 0, 3, 0, 0, ret_ }; +static struct device bdosin = { 3, 0, 0, 0, ret_ }; +static struct device filedev= { 1, 1, 0, 1, fileop }; + +/* + * device table, contains names and pointers to device entries + */ +static struct devtabl devtabl[] = { + { "con:", &condev, 2 }, + { "CON:", &condev, 2 }, + { "lst:", &bdosout, 5 }, + { "LST:", &bdosout, 5 }, + { "prn:", &bdosout, 5 }, + { "PRN:", &bdosout, 5 }, + { "pun:", &bdosout, 4 }, + { "PUN:", &bdosout, 4 }, + { "rdr:", &bdosin, 3 }, + { "RDR:", &bdosin, 3 }, + { 0, &filedev, 0 } /* this must be the last slot in the table! */ +}; + + +creat(name, mode) +char *name; +{ + return open(name, O_WRONLY|O_TRUNC|O_CREAT, mode); +} + +open(name, flag, mode) +char *name; +{ + register struct devtabl *dp; + register struct channel *chp; + register struct device *dev; + int fd, mdmask; + + for (chp = chantab, fd = 0 ; fd < MAXCHAN ; ++chp, ++fd) + if (chp->c_close == bdf_) + goto fndchan; + errno = EMFILE; + return -1; + +fndchan: + for (dp = devtabl ; dp->d_name ; ++dp) + if (strcmp(dp->d_name, name) == 0) + break; + dev = dp->d_dev; + mdmask = (flag&3) + 1; + if (mdmask&1) { + if ((chp->c_read = dev->d_read) == 0) { + errno = EACCES; + return -1; + } + } + if (mdmask&2) { + if ((chp->c_write = dev->d_write) == 0) { + errno = EACCES; + return -1; + } + } + chp->c_arg = dp->d_arg; + chp->c_ioctl = dev->d_ioctl; + chp->c_seek = dev->d_seek; + chp->c_close = ret_; + if ((*dev->d_open)(name, flag, mode, chp, dp) < 0) { + chp->c_close = bdf_; + return -1; + } + return fd; +} + +close(fd) +{ + register struct channel *chp; + + if (fd < 0 || fd > MAXCHAN) { + errno = EBADF; + return -1; + } + chp = &chantab[fd]; + fd = (*chp->c_close)(chp->c_arg); + chp->c_read = chp->c_write = chp->c_ioctl = chp->c_seek = 0; + chp->c_close = bdf_; + return fd; +} + +static struct fcbtab fcbtab[MAXFILE]; + +static +fileop(name,flag,mode,chp,dp) +char *name; struct channel *chp; struct devtabl *dp; +{ + register struct fcbtab *fp; + int filecl(); + int user; + + for ( fp = fcbtab ; fp < fcbtab+MAXFILE ; ++fp ) + if ( fp->flags == 0 ) + goto havefcb; + errno = ENFILE; + return -1; + +havefcb: + if ((user = fcbinit(name,&fp->fcb)) == -1) { + errno = EINVAL; + return -1; + } + if (user == 255) + user = getusr(); + setusr(user); + if (flag & O_TRUNC) + bdos(DELFIL, &fp->fcb); + if (bdos(OPNFIL,&fp->fcb) == 0xff) { + if ((flag&(O_TRUNC|O_CREAT)) == 0 || bdos(MAKFIL,&fp->fcb) == 0xff) { + errno = ENOENT; + rstusr(); + return -1; + } + } else if ((flag&(O_CREAT|O_EXCL)) == (O_CREAT|O_EXCL)) { + errno = EEXIST; + rstusr(); + return -1; + } + + fp->offset = fp->fcb.f_overfl = fp->fcb.f_record = 0; + fp->user = user; + chp->c_arg = fp; + fp->flags = (flag&3)+1; + chp->c_close = filecl; + if (flag&O_APPEND) + _Ceof(fp); + rstusr(); + return 0; +} + +static +filecl(fp) +register struct fcbtab *fp; +{ + _zap(); /* zap work buffer, so data is not reused */ + setusr(fp->user); + bdos(CLSFIL,&fp->fcb); + rstusr(); + fp->flags = 0; + return 0; +} + + close.c +/* Copyright (C) 1982 by Manx Software Systems */ +#include "errno.h" +#include "io.h" + +close(fd) +{ + register struct channel *chp; + extern int bdf_(); + + if (fd < 0 || fd > MAXCHAN) { + errno = EBADF; + return -1; + } + chp = &chantab[fd]; + fd = (*chp->c_close)(chp->c_arg); + chp->c_read = chp->c_write = chp->c_ioctl = chp->c_seek = 0; + chp->c_close = bdf_; + return fd; +} + ioctl.c +/* Copyright (C) 1984 by Manx Software Systems */ +#include "io.h" +#include "errno.h" +#include "sgtty.h" + +#define TIME 10 /* number of iterations of raw_rd loop */ +#define MIN 1 /* minimum number of chars returned from read */ + +extern int (*Rd_tab[])(); +extern int (*Wrt_tab[])(); + +struct sgttyb Tty_ctl; +extern char _Eol; +extern int tty_rd(); +static int raw_rd(), raw_wr(); +static int rd_func, wrt_func; + +ioctl(fd, cmd, arg) +struct sgttyb *arg; +{ + register struct channel *chp; + + chp = &chantab[fd]; + if (chp->c_ioctl == 0) { + errno = ENOTTY; + return -1; + } + switch (cmd) { + case TIOCGETP: + *arg = Tty_ctl; + break; + case TIOCSETP: + Tty_ctl = *arg; + Wrt_tab[2] = raw_wr; + Rd_tab[2] = raw_rd; + if (Tty_ctl.sg_flags&RAW) { + rd_func = + wrt_func = 6; + _Eol = '\r'; + break; + } else if (Tty_ctl.sg_flags&CBREAK) { + rd_func = (Tty_ctl.sg_flags&ECHO) ? 1 : 6; + wrt_func = 2; + } else { + Rd_tab[2] = tty_rd; + wrt_func = 2; + } + if (Tty_ctl.sg_flags&CRMOD) + _Eol = '\n'; + else + _Eol = '\r'; + } + return 0; +} + +raw_rd(x, buff, len) +register char *buff; +{ + int c, i; + register int count; + + for (count = 0 ; count < len ; ) { + for (i = TIME ; i-- ; ) + if ((c = bdos(rd_func,0xff)) != 0) + goto have_char; + if (count < MIN) + continue; + break; +have_char: + if (c == '\r') + c = _Eol; + *buff++ = c; + ++count; + } + return count; +} + +raw_wr(kind, buff, len) +register char *buff; +{ + register int count; + + for (count = len ; count-- ; ) { + if (*buff == '\n' && (Tty_ctl.sg_flags&CRMOD)) + bdos(wrt_func,'\r'); + bdos(wrt_func,*buff++); + } + return len; +} + read.c +/* Copyright (C) 1983, 1984 by Manx Software Systems */ +#include "io.h" +#include "errno.h" +#include "fcntl.h" + +int bdf_(), filerd(), tty_rd(), bdosrd(); + +int (*Rd_tab[])() = { + bdf_, filerd, tty_rd, bdosrd, +}; +extern int errno; + +read(fd, buff, len) +char *buff; +{ + register struct channel *chp; + + chp = &chantab[fd]; + return (*Rd_tab[chp->c_read])(chp->c_arg, buff, len); +} + +static +filerd(afp,buffer,len) +struct fcbtab *afp; +char *buffer; unsigned len; +{ + register unsigned l = 0; + register struct fcbtab *fp; + unsigned k,j; + + fp = afp; + setusr(fp->user); + if (fp->offset) { + if ((l = 128 - fp->offset) > len) + l = len; + if (getsect(fp, buffer, l)) { + rstusr(); + return 0; + } + } + if (k = (len-l)/128) + if ((j = blkrd(&fp->fcb, buffer+l, k)) != 0) { + rstusr(); + return (k-j)*128 + l; + } + l += k*128; + if (l < len) + if (getsect(fp, buffer+l, len-l)) { + rstusr(); + return l; + } + rstusr(); + return len; +} + +static +getsect(fp, buf, len) +register struct fcbtab *fp; char *buf; unsigned len; +{ + if (_find(fp)) + return -1; + movmem(Wrkbuf+fp->offset, buf, len); + if ((fp->offset = (fp->offset + len) & 127) == 0) + ++fp->fcb.f_record; + return 0; +} + +char _Eol = '\n'; + +tty_rd(x,buff,len) +char *buff; +{ + static char buffer[258]; + static int used; + register int l; + + if (buffer[1] == 0) { + buffer[0] = 255; + buffer[1] = buffer[2] = 0; + bdos(10,buffer); + bdos(2,'\n'); + if (buffer[2] == 0x1a) { + buffer[1] = 0; + return 0; + } + buffer[++buffer[1] + 1] = _Eol; + used = 2; + } + if ((l = buffer[1]) > len) + l = len; + movmem(buffer+used, buff, l); + used += l; + buffer[1] -= l; + return l; +} + +static +bdosrd(kind, buff, len) +register char *buff; +{ + register int count; + + for (count = 0 ; count < len ; ++count) { + if ((*buff++ = bdos(kind)) == 0x1a) + break; + } + return count; +} + write.c +/* Copyright (C) 1983, 1984 by Manx Software Systems */ +#include "io.h" +#include "errno.h" + +int tty_wr(), bdoswr(), filewr(), bdf_(); + +int (*Wrt_tab[])() = { + bdf_, filewr, bdoswr, bdoswr +}; + +write(fd, buff, len) +char *buff; +{ + register struct channel *chp; + + chp = &chantab[fd]; + return (*Wrt_tab[chp->c_write])(chp->c_arg, buff, len); +} + +static +filewr(afp,buffer,len) +struct fcbtab *afp; +char *buffer; unsigned len; +{ + register unsigned l = 0; + register struct fcbtab *fp; + unsigned k,j; + + fp = afp; + setusr(fp->user); + if (fp->offset) { + if ((l = 128 - fp->offset) > len) + l = len; + if (putsect(fp, buffer, l)) { + rstusr(); + return -1; + } + } + if (k = (len-l)/128) + if ((j = blkwr(&fp->fcb, buffer+l, k)) != 0) { + rstusr(); + if ((l += (k-j)*128) == 0) + return -1; + else + return l; + } + l += k*128; + if (l < len) + if (putsect(fp, buffer+l, len-l)) { + rstusr(); + return l; + } + rstusr(); + return len; +} + +static +putsect(fp, buf, len) +register struct fcbtab *fp; char *buf; unsigned len; +{ + if (_find(fp) < 0) + return -1; + movmem(buf, Wrkbuf+fp->offset, len); + if ((errno = bdos(WRITRN, &fp->fcb)) != 0) + return -1; + if ((fp->offset = (fp->offset + len) & 127) == 0) + ++fp->fcb.f_record; + return 0; +} + +tty_wr(kind, buff, len) +register char *buff; +{ + register int count; + + for (count = len ; count-- ; ) { + if (*buff == '\n') + bdos(2,'\r'); + bdos(2,*buff++); + } + return len; +} + +static +bdoswr(kind, buff, len) +register char *buff; +{ + register int count; + + for (count = len ; count-- ; ) + bdos(kind,*buff++); + return len; +} + + lseek.c +/* Copyright (C) 1982, 1984 by Manx Software Systems */ +#include "io.h" +#include "errno.h" + +long lseek(fd, pos, how) +long pos; +{ + register struct fcbtab *fp; + + if (chantab[fd].c_seek == 0) { +Badf: + errno = EBADF; + return -1L; + } + fp = chantab[fd].c_arg; + + switch (how) { + case 2: + /* + * Close the file because CP/M doesn't know how big an open file is. + * However, the fcb is still valid. + */ + setusr(fp->user); + fp->fcb.f_name[4] |= 0x80; /* set parital close flag for MP/M */ + bdos(CLSFIL, &fp->fcb); + fp->fcb.f_name[4] &= 0x7f; /* clear parital close flag */ + _Ceof(fp); + rstusr(); + case 1: + pos += fp->offset + ((long)fp->fcb.f_record << 7); + case 0: + break; + + default: + errno = EINVAL; + return -1L; + } + + fp->fcb.f_overfl = 0; + if (pos < 0) { + fp->offset = fp->fcb.f_record = 0; + errno = EINVAL; + return -1L; + } + fp->offset = (unsigned)pos & 127; + fp->fcb.f_record = pos >> 7; + return pos; +} + + posit.c +/* Copyright (C) 1982,1983 by Manx Software Systems */ +#include "io.h" +#include "errno.h" + +posit(fd, pos) +unsigned pos; +{ + register struct fcbtab *fp; + + if (chantab[fd].c_seek == 0) { + errno = EBADF; + return -1; + } + fp = chantab[fd].c_arg; + fp->fcb.f_record = pos; + fp->offset = fp->fcb.f_overfl = 0; + return 0; +} + + ceof.c +/* Copyright (C) 1984 by Manx Software Systems */ +#include "io.h" +#include "errno.h" + +_Ceof(fp) +register struct fcbtab *fp; +{ + register char *cp; + + bdos(FILSIZ, &fp->fcb); + if (fp->fcb.f_record == 0) { + fp->offset = 0; + return 0; + } + --fp->fcb.f_record; /* backup to last record */ + if (_find(fp)) + return -1; + + for (cp = Wrkbuf+128 ; cp > Wrkbuf ; ) + if (*--cp != 0x1a) { + ++cp; + break; + } + if ((fp->offset = cp-Wrkbuf) == 128) { + ++fp->fcb.f_record; + fp->offset = 0; + } + return 0; +} + find.c +/* Copyright (C) 1984 by Manx Software Systems */ +#include "io.h" + +static struct fcbtab *Wfp; +static unsigned Wsct; + +_zap() /* invalidate work buffer */ +{ + Wfp = 0; +} + +_find(fp) +register struct fcbtab *fp; +{ + extern int errno; + + bdos(SETDMA, Wrkbuf); + if (Wfp != fp || fp->fcb.f_record != Wsct) { + if ((errno = bdos(READRN, &fp->fcb)) == 1 || errno == 4) { + errno = 0; + setmem(Wrkbuf, 128, 0x1a); + Wfp = 0; + return 1; + } else if (errno) + return -1; + Wfp = fp; + Wsct = fp->fcb.f_record; + } + return 0; +} + + isatty.c +/* Copyright (C) 1983 by Manx Software Systems */ +#include "io.h" +#include "errno.h" + +isatty(fd) +{ + return chantab[fd].c_ioctl; +} + + rename.c +/* Copyright (C) 1983, 1984 by Manx Software Systems */ +#include "errno.h" + +rename(old, new) +char *old, *new; +{ + auto char buff[60]; + register int user; + + user = fcbinit(old,buff); + fcbinit(new,buff+16); + setusr(user); + user = 0; + if (bdos(15,buff+16) != 0xff) { + bdos(16,buff+16); + errno = EEXIST; + user = -1; + } else if (bdos(23,buff) == 0xff) { + errno = ENOENT; + user = -1; + } + rstusr(); + return user; +} + unlink.c +/* Copyright (C) 1983, 1984 by Manx Software Systems */ +#include "errno.h" + +unlink(name) +char *name; +{ + auto char delfcb[40]; + register int user; + + user = fcbinit(name,delfcb); + setusr(user); + user = bdos(19,delfcb); + rstusr(); + if (user == 0xff) { + errno = ENOENT; + return -1; + } + return 0; +} + + atol.c +/* Copyright (C) 1982 by Manx Software Systems */ +#include + +long +atol(cp) +register char *cp; +{ + long n; + register sign; + + while (*cp == ' ' || *cp == '\t') + ++cp; + sign = 0; + if ( *cp == '-' ) { + sign = 1; + ++cp; + } else if ( *cp == '+' ) + ++cp; + + for ( n = 0 ; isdigit(*cp) ; ) + n = n*10 + *cp++ - '0'; + return sign ? -n : n; +} + atoi.c +/* Copyright (C) 1981,1982 by Manx Software Systems */ +#include + +atoi(cp) +register char *cp; +{ + register unsigned i; + register sign; + + while (*cp == ' ' || *cp == '\t') + ++cp; + sign = 0; + if ( *cp == '-' ) { + sign = 1; + ++cp; + } else if ( *cp == '+' ) + ++cp; + + for ( i = 0 ; isdigit(*cp) ; ) + i = i*10 + *cp++ - '0'; + return sign ? -i : i; +} + calloc.c +/* Copyright (C) 1984 by Manx Software Systems */ + +char *calloc(nelem, size) +unsigned nelem, size; +{ + register unsigned i = nelem*size; + register char *cp, *malloc(); + + if ((cp = malloc(i)) != (char *)0) + setmem(cp, i, 0); + return cp; +} + malloc.c +/* Copyright (C) 1984 by Manx Software Systems */ + +typedef struct freelist { + unsigned f_size; + struct freelist *f_chain; +} FREE; + +#define NULL (FREE *)0 +#define GRAIN 1024 + +static FREE head, *last; + +char * +realloc(area, size) +register char *area; unsigned size; +{ + register char *cp; + unsigned osize; + char *malloc(); + + osize = (((FREE *)area-1)->f_size - 1) * sizeof(FREE); + free(area); + if ((cp = malloc(size)) != 0 && cp != area) + movmem(area, cp, size>osize ? osize : size); + return cp; +} + +char * +malloc(size) +unsigned size; +{ + register FREE *tp, *prev; + char *sbrk(); + int units; + + units = (size+sizeof(FREE)-1)/sizeof(FREE) + 1; + if ((prev = last) == NULL) + last = head.f_chain = prev = &head; + + for (tp = prev->f_chain ; ; prev = tp, tp = tp->f_chain) { + while (tp != tp->f_chain && tp+tp->f_size == tp->f_chain) { + if (last == tp->f_chain) + last = tp->f_chain->f_chain; + tp->f_size += tp->f_chain->f_size; + tp->f_chain = tp->f_chain->f_chain; + } + + if (tp->f_size >= units) { + if (tp->f_size == units) + prev->f_chain = tp->f_chain; + else { + last = tp + units; + prev->f_chain = last; + last->f_chain = tp->f_chain; + last->f_size = tp->f_size - units; + tp->f_size = units; + } + last = prev; + tp->f_chain = NULL; + return (char *)(tp+1); + } + if (tp == last) { + if ((tp = (FREE *)sbrk(GRAIN)) == (FREE *)-1) + return (char *)NULL; + tp->f_size = GRAIN/sizeof(FREE); + tp->f_chain = NULL; + free(tp+1); + tp = last; + } + } +} + +free(area) +char *area; +{ + register FREE *tp, *hole; + + hole = (FREE *)area - 1; + if (hole->f_chain != NULL) + return -1; + for (tp = last ; tp > hole || hole > tp->f_chain ; tp = tp->f_chain) + if (tp >= tp->f_chain && (hole > tp || hole < tp->f_chain)) + break; + + hole->f_chain = tp->f_chain; + tp->f_chain = hole; + last = tp; + return 0; +} + qsort.c +/* Copyright (C) 1984 by Manx Software Systems */ + +qsort(base, nel, size, compar) +char *base; unsigned nel, size; int (*compar)(); +{ + register char *i,*j,*x,*r; + auto struct stk { + char *l, *r; + } stack[16]; + struct stk *sp; + + sp = stack; + r = base + (nel-1)*size; + for (;;) { + do { + x = base + (r-base)/size/2 * size; + i = base; + j = r; + do { + while ((*compar)(i,x) < 0) + i += size; + while ((*compar)(x,j) < 0) + j -= size; + if (i < j) { + swapmem(i, j, size); + if (i == x) + x = j; + else if (j == x) + x = i; + } + if (i <= j) { + i += size; + j -= size; + } + } while (i <= j); + if (j-base < r-i) { + if (i < r) { /* stack request for right partition */ + sp->l = i; + sp->r = r; + ++sp; + } + r = j; /* continue sorting left partition */ + } else { + if (base < j) { /* stack request for left partition */ + sp->l = base; + sp->r = j; + ++sp; + } + base = i; /* continue sorting right partition */ + } + } while (base < r); + + if (sp <= stack) + break; + --sp; + base = sp->l; + r = sp->r; + } +} + ctype.c +/* Copyright (C) 1984 by Manx Software Systems */ + +char ctp_[129] = { + 0, /* EOF */ + 0x20, 0x20, 0x20, 0x20, /* nul soh stx etx */ + 0x20, 0x20, 0x20, 0x20, /* eot enq ack bel */ + 0x20, 0x30, 0x30, 0x30, /* bs ht nl vt */ + 0x30, 0x30, 0x20, 0x20, /* ff cr so si */ + 0x20, 0x20, 0x20, 0x20, /* dle dc1 dc2 dc3 */ + 0x20, 0x20, 0x20, 0x20, /* dc4 nak syn etb */ + 0x20, 0x20, 0x20, 0x20, /* can em sub esc */ + 0x20, 0x20, 0x20, 0x20, /* fs gs rs us */ + 0x90, 0x40, 0x40, 0x40, /* sp ! " # */ + 0x40, 0x40, 0x40, 0x40, /* $ % & ' */ + 0x40, 0x40, 0x40, 0x40, /* ( ) * + */ + 0x40, 0x40, 0x40, 0x40, /* , - . / */ + 0x0C, 0x0C, 0x0C, 0x0C, /* 0 1 2 3 */ + 0x0C, 0x0C, 0x0C, 0x0C, /* 4 5 6 7 */ + 0x0C, 0x0C, 0x40, 0x40, /* 8 9 : ; */ + 0x40, 0x40, 0x40, 0x40, /* < = > ? */ + 0x40, 0x09, 0x09, 0x09, /* @ A B C */ + 0x09, 0x09, 0x09, 0x01, /* D E F G */ + 0x01, 0x01, 0x01, 0x01, /* H I J K */ + 0x01, 0x01, 0x01, 0x01, /* L M N O */ + 0x01, 0x01, 0x01, 0x01, /* P Q R S */ + 0x01, 0x01, 0x01, 0x01, /* T U V W */ + 0x01, 0x01, 0x01, 0x40, /* X Y Z [ */ + 0x40, 0x40, 0x40, 0x01, /* \ ] ^ _ */ + 0x40, 0x0A, 0x0A, 0x0A, /* ` a b c */ + 0x0A, 0x0A, 0x0A, 0x02, /* d e f g */ + 0x02, 0x02, 0x02, 0x02, /* h i j k */ + 0x02, 0x02, 0x02, 0x02, /* l m n o */ + 0x02, 0x02, 0x02, 0x02, /* p q r s */ + 0x02, 0x02, 0x02, 0x02, /* t u v w */ + 0x02, 0x02, 0x02, 0x40, /* x y z { */ + 0x40, 0x40, 0x40, 0x20, /* | } ~ del */ +} ; + execl.c +/* Copyright (C) 1983, 1984 by Manx Software Systems */ + +execl(path, args) +char *path, *args; +{ + return execvp(path, &args); +} + +execv(path, argv) +char *path, **argv; +{ + return execvp(path, argv); +} + exec.c +/* Copyright (C) 1983, 1984 by Manx Software Systems */ +#include "io.h" +#include "errno.h" + +execlp(path, args) +char *path, *args; +{ + return execvp(path, &args); +} + +execvp(path, argv) +char *path, **argv; +{ + register char *cp, *xp; + int user, ouser; + auto struct fcb fcb; + auto char loader[70]; + extern char ldr_[]; + + if ((user = fcbinit(path, &fcb)) == -1) { + errno = EINVAL; + return -1; + } + if (fcb.f_type[0] == ' ') + strcpy(fcb.f_type, "COM"); + ouser = bdos(GETUSR, 255); + bdos(GETUSR, user); + if (bdos(OPNFIL, &fcb) == 255) { + errno = ENOENT; + return -1; + } + fcb.f_cr = 0; + + fcbinit(0, 0x5c); + fcbinit(0, 0x6c); + cp = (char *)0x81; + if (*argv) { + ++argv; /* skip arg0, used for unix (tm) compatibility */ + for (user = 0 ; (xp = *argv++) != 0 ; ++user) { + if (user == 0) + fcbinit(xp, 0x5c); + else if (user == 1) + fcbinit(xp, 0x6c); + *cp++ = ' '; + while (*xp) { + if (cp > (char *)0xff) + goto doload; + *cp++ = *xp++; + } + } + } + +doload: + *(char *)0x80 = cp - (char *)0x81; + movmem(ldr_, loader, sizeof loader); + (*(int (*)())loader)(&fcb, ouser); +} + + \ No newline at end of file diff --git a/Source/Images/d_aztecc/u0/LIBUTIL.COM b/Source/Images/d_aztecc/u0/LIBUTIL.COM new file mode 100644 index 00000000..8dfc0ad4 Binary files /dev/null and b/Source/Images/d_aztecc/u0/LIBUTIL.COM differ diff --git a/Source/Images/d_aztecc/u0/LN.COM b/Source/Images/d_aztecc/u0/LN.COM new file mode 100644 index 00000000..3be1dbdc Binary files /dev/null and b/Source/Images/d_aztecc/u0/LN.COM differ diff --git a/Source/Images/d_aztecc/u0/M.LIB b/Source/Images/d_aztecc/u0/M.LIB new file mode 100644 index 00000000..97778c30 Binary files /dev/null and b/Source/Images/d_aztecc/u0/M.LIB differ diff --git a/Source/Images/d_aztecc/u0/MATH.REL b/Source/Images/d_aztecc/u0/MATH.REL new file mode 100644 index 00000000..80a5f207 Binary files /dev/null and b/Source/Images/d_aztecc/u0/MATH.REL differ diff --git a/Source/Images/d_aztecc/u0/MATHSRC.ARC b/Source/Images/d_aztecc/u0/MATHSRC.ARC new file mode 100644 index 00000000..bb2e0473 --- /dev/null +++ b/Source/Images/d_aztecc/u0/MATHSRC.ARC @@ -0,0 +1,2829 @@ + sin.c +#include "math.h" +#include "errno.h" + +double cos(x) +double x; +{ + double sincos(); + + return sincos(x, fabs(x) + 1.57079632679489661923, 0); +} + +double sin(x) +double x; +{ + double sincos(); + + if (x < 0.0) + return sincos(x,-x,1); + else + return sincos(x,x,0); +} + +#define R1 -0.16666666666666665052e+00 +#define R2 +0.83333333333331650314e-02 +#define R3 -0.19841269841201840457e-03 +#define R4 +0.27557319210152756119e-05 +#define R5 -0.25052106798274584544e-07 +#define R6 +0.16058936490371589114e-09 +#define R7 -0.76429178068910467734e-12 +#define R8 +0.27204790957888846175e-14 + +#define YMAX 6.7465e09 + +static double sincos(x,y,sgn) +double x,y; +{ + double f, xn, r, g; + extern int errno; + + if (y >= YMAX) { + errno = ERANGE; + return 0.0; + } + if (modf(y * 0.31830988618379067154, &xn) >= 0.5) + ++xn; + if ((int)xn & 1) + sgn = !sgn; + if (fabs(x) != y) + xn -= 0.5; + g = modf(fabs(x), &x); /* break into fraction and integer parts */ + f = ((x - xn*3.1416015625) + g) + xn*8.9089102067615373566e-6; + if (fabs(f) > 2.3283e-10) { + g = f*f; + r = (((((((R8*g R7)*g R6)*g R5)*g + R4)*g R3)*g R2)*g R1)*g; + f += f*r; + } + if (sgn) + f = -f; + return f; +} + tan.c +#include "math.h" +#include "errno.h" + +extern int errno; + +static double tansub(); + +double cotan(x) +double x; +{ + double y; + + y = fabs(x); + if (y < 1.91e-152) { + errno = ERANGE; + if (x < 0.0) + return -HUGE; + else + return HUGE; + } + return tansub(x,y,2); +} + +double tan(x) +double x; +{ + return tansub(x, fabs(x), 0); +} + +#define P1 -0.13338350006421960681e+0 +#define P2 +0.34248878235890589960e-2 +#define P3 -0.17861707342254426711e-4 +#define Q0 +1.0 +#define Q1 -0.46671683339755294240e+0 +#define Q2 +0.25663832289440112864e-1 +#define Q3 -0.31181531907010027307e-3 +#define Q4 +0.49819433993786512270e-6 + +#define P(f,g) (((P3*g P2)*g P1)*g*f + f) +#define Q(g) ((((Q4*g Q3)*g Q2)*g Q1)*g Q0) + +#define YMAX 6.74652e09 + +static double tansub(x, y, flag) +double x,y; +{ + double f, g, xn; + double xnum, xden; + + if (y > YMAX) { + errno = ERANGE; + return 0.0; + } + if (modf(x*0.63661977236758134308, &xn) >= 0.5) + xn += (x < 0.0) ? -1.0 : 1.0; + f = (x - xn*1.57080078125) + xn*4.454455103380768678308e-6; + if (fabs(f) < 2.33e-10) { + xnum = f; + xden = 1.0; + } else { + g = f*f; + xnum = P(f,g); + xden = Q(g); + } + flag |= ((int)xn & 1); + switch (flag) { + case 1: /* A: tan, xn odd */ + xnum = -xnum; + case 2: /* B: cotan, xn even */ + return xden/xnum; + + case 3: /* C: cotan, xn odd */ + xnum = -xnum; + case 0: /* D: tan, xn even */ + return xnum/xden; + } + return 0.0; +} + asin.c +#include "math.h" +#include "errno.h" + +double arcsine(); + +double asin(x) +double x; +{ + return arcsine(x,0); +} + +double acos(x) +double x; +{ + return arcsine(x,1); +} + +#define P1 -0.27368494524164255994e+2 +#define P2 +0.57208227877891731407e+2 +#define P3 -0.39688862997504877339e+2 +#define P4 +0.10152522233806463645e+2 +#define P5 -0.69674573447350646411 +#define Q0 -0.16421096714498560795e+3 +#define Q1 +0.41714430248260412556e+3 +#define Q2 -0.38186303361750149284e+3 +#define Q3 +0.15095270841030604719e+3 +#define Q4 -0.23823859153670238830e+2 + +#define P(g) ((((P5*g P4)*g P3)*g P2)*g P1) +#define Q(g) (((((g Q4)*g Q3)*g Q2)*g Q1)*g Q0) + +double arcsine(x,flg) +double x; +{ + double y, g, r; + register int i; + extern int errno; + static double a[2] = { 0.0, 0.78539816339744830962 }; + static double b[2] = { 1.57079632679489661923, 0.78539816339744830962 }; + + y = fabs(x); + i = flg; + if (y < 2.3e-10) + r = y; + else { + if (y > 0.5) { + i = 1-i; + if (y > 1.0) { + errno = EDOM; + return 0.0; + } + g = (0.5-y)+0.5; + g = ldexp(g,-1); + y = sqrt(g); + y = -(y+y); + } else + g = y*y; + r = y + y* + ((P(g)*g) + /Q(g)); + } + if (flg) { + if (x < 0.0) + r = (b[i] + r) + b[i]; + else + r = (a[i] - r) + a[i]; + } else { + r = (a[i] + r) + a[i]; + if (x < 0.0) + r = -r; + } + return r; +} + atan.c +#include "libc.h" +#include "math.h" +#include "errno.h" + +static int nopper() {;} + +#define PI 3.14159265358979323846 +#define PIov2 1.57079632679489661923 + +double atan2(v,u) +double u,v; +{ + double f; + int (*save)(); + extern int flterr; + extern int errno; + + if (u == 0.0) { + if (v == 0.0) { + errno = EDOM; + return 0.0; + } + return PIov2; + } + + save = Sysvec[FLT_FAULT]; + Sysvec[FLT_FAULT] = nopper; + flterr = 0; + f = v/u; + Sysvec[FLT_FAULT] = save; + if (flterr == 2) /* overflow */ + f = PIov2; + else { + if (flterr == 1) /* underflow */ + f = 0.0; + else + f = atan(fabs(f)); + if (u < 0.0) + f = PI - f; + } + if (v < 0.0) + f = -f; + return f; +} + +#define P0 -0.13688768894191926929e+2 +#define P1 -0.20505855195861651981e+2 +#define P2 -0.84946240351320683534e+1 +#define P3 -0.83758299368150059274e+0 +#define Q0 +0.41066306682575781263e+2 +#define Q1 +0.86157349597130242515e+2 +#define Q2 +0.59578436142597344465e+2 +#define Q3 +0.15024001160028576121e+2 + +#define P(g) (((P3*g P2)*g P1)*g P0) +#define Q(g) ((((g Q3)*g Q2)*g Q1)*g Q0) + +double atan(x) +double x; +{ + double f, r, g; + int n; + static double Avals[4] = { + 0.0, + 0.52359877559829887308, + 1.57079632679489661923, + 1.04719755119659774615 + }; + + n = 0; + f = fabs(x); + if (f > 1.0) { + f = 1.0/f; + n = 2; + } + if (f > 0.26794919243112270647) { + f = (((0.73205080756887729353*f - 0.5) - 0.5) + f) / + (1.73205080756887729353 + f); + ++n; + } + if (fabs(f) < 2.3e-10) + r = f; + else { + g = f*f; + r = f + f * + ((P(g)*g) + /Q(g)); + } + if (n > 1) + r = -r; + r += Avals[n]; + if (x < 0.0) + r = -r; + return r; +} + sinh.c +#include "math.h" +#include "errno.h" + +extern int errno; + +#define P0 -0.35181283430177117881e+6 +#define P1 -0.11563521196851768270e+5 +#define P2 -0.16375798202630751372e+3 +#define P3 -0.78966127417357099479e+0 +#define Q0 -0.21108770058106271242e+7 +#define Q1 +0.36162723109421836460e+5 +#define Q2 -0.27773523119650701667e+3 + +#define PS(x) (((P3*x P2)*x P1)*x P0) +#define QS(x) (((x Q2)*x Q1)*x Q0) + +double sinh(x) +double x; +{ + double y, w, z; + int sign; + + y = x; + sign = 0; + if (x < 0.0) { + y = -x; + sign = 1; + } + if (y > 1.0) { + w = y - 0.6931610107421875000; + if (w > 349.3) { + errno = ERANGE; + z = HUGE; + } else { + z = exp(w); + if (w < 19.95) + z -= 0.24999308500451499336 / z; + z += 0.13830277879601902638e-4 * z; + } + if (sign) + z = -z; + } else if (y < 2.3e-10) + z = x; + else { + z = x*x; + z = x + x * + (z*(PS(z) + /QS(z))); + } + return z; +} + +double cosh(x) +double x; +{ + double y, w, z; + + y = fabs(x); + if (y > 1.0) { + w = y - 0.6931610107421875000; + if (w > 349.3) { + errno = ERANGE; + return HUGE; + } + z = exp(w); + if (w < 19.95) + z += 0.24999308500451499336 / z; + z += 0.13830277879601902638e-4 * z; + } else { + z = exp(y); + z = z*0.5 + 0.5/z; + } + return z; +} + tanh.c +#include "math.h" + +#define P0 -0.16134119023996228053e+4 +#define P1 -0.99225929672236083313e+2 +#define P2 -0.96437492777225469787e+0 +#define Q0 +0.48402357071988688686e+4 +#define Q1 +0.22337720718962312926e+4 +#define Q2 +0.11274474380534949335e+3 + +#define gP(g) (((P2*g P1)*g P0)*g) +#define Q(g) (((g Q2)*g Q1)*g Q0) + +double tanh(x) +double x; +{ + double f,g,r; + + f = fabs(x); + if (f > 25.3) + r = 1.0; + else if (f > 0.54930614433405484570) { + r = 0.5 - 1.0/(exp(f+f)+1.0); + r += r; + } else if (f < 2.3e-10) + r = f; + else { + g = f*f; + r = f + f* + (gP(g) + /Q(g)); + } + if (x < 0.0) + r = -r; + return r; +} + pow.c +#include "math.h" +#include "errno.h" + +double pow(a,b) +double a,b; +{ + double loga; + extern int errno; + + if (a<=0.0) { + if (a<0.0 || a==0.0 && b<=0.0) { + errno = EDOM; + return -HUGE; + } + else return 0.0; + } + loga = log(a); + loga *= b; + if (loga > LOGHUGE) { + errno = ERANGE; + return HUGE; + } + if (loga < LOGTINY) { + errno = ERANGE; + return 0.0; + } + return exp(loga); +} + sqrt.c +#include "math.h" +#include "errno.h" + +double sqrt(x) +double x; +{ + double f, y; + int n; + extern int errno; + + if (x == 0.0) + return x; + if (x < 0.0) { + errno = EDOM; + return 0.0; + } + f = frexp(x, &n); + y = 0.41731 + 0.59016 * f; + y = (y + f/y); + y = 0.25*y + f/y; /* fast calculation of y2 */ + y = 0.5 * (y + f/y); + y = y + 0.5 * (f/y - y); + + if (n&1) { + y *= 0.70710678118654752440; + ++n; + } + return ldexp(y,n/2); +} + log.c +#include "math.h" +#include "errno.h" + +double log10(x) +double x; +{ + return log(x)*0.43429448190325182765; +} + +#define A0 -0.64124943423745581147e+2 +#define A1 +0.16383943563021534222e+2 +#define A2 -0.78956112887491257267e+0 +#define A(w) ((A2*w A1)*w A0) + +#define B0 -0.76949932108494879777e+3 +#define B1 +0.31203222091924532844e+3 +#define B2 -0.35667977739034646171e+2 +#define B(w) (((w B2)*w B1)*w B0) + +#define C0 0.70710678118654752440 +#define C1 0.693359375 +#define C2 -2.121944400546905827679e-4 + +double log(x) +double x; +{ + double Rz, f, z, w, znum, zden, xn; + int n; + extern int errno; + + if (x <= 0.0) { + errno = EDOM; + return -HUGE; + } + f = frexp(x, &n); + if (f > C0) { + znum = (f-0.5)-0.5; + zden = f*0.5 + 0.5; + } else { + --n; + znum = f - 0.5; + zden = znum*0.5 + 0.5; + } + z = znum/zden; + w = z*z; +/* the lines below are split up to allow expansion of A(w) and B(w) */ + Rz = z + z * (w * + A(w) + /B(w)); + xn = n; + return (xn*C2 + Rz) + xn*C1; +} + random.c +/* + * Random number generator - + * adapted from the FORTRAN version + * in "Software Manual for the Elementary Functions" + * by W.J. Cody, Jr and William Waite. + */ +double ran() +{ + static long int iy = 100001; + + iy *= 125; + iy -= (iy/2796203) * 2796203; + return (double) iy/ 2796203.0; +} + +double randl(x) +double x; +{ + double exp(); + + return exp(x*ran()); +} + exp.c +#include "math.h" +#include "errno.h" + +#define P0 0.249999999999999993e+0 +#define P1 0.694360001511792852e-2 +#define P2 0.165203300268279130e-4 +#define Q0 0.500000000000000000e+0 +#define Q1 0.555538666969001188e-1 +#define Q2 0.495862884905441294e-3 + +#define P(z) ((P2*z + P1)*z + P0) +#define Q(z) ((Q2*z + Q1)*z + Q0) + +#define EPS 2.710505e-20 + +double +exp(x) +double x; +{ + int n; + double xn, g, r, z; + extern int errno; + + if (x > LOGHUGE) { + errno = ERANGE; + return HUGE; + } + if (x < LOGTINY) { + errno = ERANGE; + return 0.0; + } + if (fabs(x) < EPS) + return 1.0; + z = modf(x * 1.4426950408889634074, &xn); + if (z >= 0.5) + ++xn; + n = xn; + z = modf(x, &x); /* break x up into fraction and integer part */ + g = ((x - xn*0.693359375) + z) + xn*2.1219444005469058277e-4; + z = g*g; + r = P(z)*g; + r = 0.5 + r/(Q(z)-r); + return ldexp(r,n+1); +} + floor.c +#include "math.h" + +double floor(d) +double d; +{ + if (d < 0.0) + return -ceil(-d); + modf(d, &d); + return d; +} + +double ceil(d) +double d; +{ + if (d < 0.0) + return -floor(-d); + if (modf(d, &d) > 0.0) + ++d; + return d; +} + atof.asm +; Copyright (C) 1983 by Manx Software Systems +; :ts=8 + extrn .dml10, .utod, .dswap, .dad + extrn .dlis, .ddv, .dng + dseg +msign: ds 1 +esign: ds 1 +dpflg: ds 1 +dexp: ds 2 + cseg + public atof_ +atof_: + push b + xra a + sta msign ;clear mantissa sign + sta esign ;clear exponent sign + sta dpflg ;have not seen decimal point yet + lxi h,0 + shld dexp ;clear exponent to zero + call .utod ;clear floating point accumulator +; + lxi h,4 + dad sp + mov c,m ;get address of string to convert + inx h + mov b,m +skipbl: + ldax b + cpi ' ' + jz blank + cpi 9 + jnz notblank +blank: + inx b + jmp skipbl +notblank: + cpi '-' + jnz notneg ;not minus sign + sta msign ;set negative for later + jmp skpsign +notneg: + cpi '+' ;check for plus sign + jnz getnumb +skpsign: + inx b ;skip over sign character +getnumb: + ldax b + cpi '0' + jc notdigit + cpi '9'+1 + jnc notdigit + push psw + call .dml10 + call .dswap + pop psw + sui '0' + mov l,a + mvi h,0 + call .utod + call .dad + lda dpflg + ora a + jz skpsign + lhld dexp + dcx h + shld dexp + jmp skpsign +notdigit: + cpi '.' + jnz nomore + lxi h,dpflg + mvi m,1 ;set dec. pt. seen + jmp skpsign +; +nomore: + lxi h,0 ;clear exponent + ori 20H ;force to lower case + cpi 'e' + jnz scaleit + inx b + ldax b + cpi '-' + jnz exppos + sta esign ;set exponent negative + jmp nxtchr +exppos: + cpi '+' + jnz getexp +nxtchr: + inx b +getexp: + ldax b + cpi '0' + jc expdone + cpi '9'+1 + jnc expdone + sui '0' + dad h ; exp *= 2 + mov d,h + mov e,l + dad h ;exp *= 4 + dad h ;exp *= 8 + dad d ;exp *= 10 + mov e,a + mvi d,0 + dad d ;exp = exp*10 + char - '0' + jmp nxtchr +; +expdone: + lda esign ;check sign of exponent + ora a + jz addexp + mov a,h ;negate if sign was minus + cma + mov h,a + mov a,l + cma + mov l,a + inx h +addexp: + xchg + lhld dexp ;get digit count + dad d ;add in exponent value + shld dexp ;save for scaling later +; +scaleit: ;scale number to correct value + lhld dexp + mov a,h + ora a + jp movup + ;negative exponent + cpi 0ffH ;test if exponent too large + jnz rngerr + mov a,l + cma + inr a + mov c,a ;save for loop later + cpi 166 + jnc rngerr + cpi 150 + jc sizeok + call .dlis ;divide by 1e16 since smallest will overflow + db 47H,23H,86H,0f2H,6fH,0c1H,0,0 + call .ddv + mov a,c ;get exponent value back + sui 16 + mov c,a +sizeok: + call .dswap + lxi h,1 + call .utod +sclp1: + call .dml10 ;compute number to divide by + dcr c + jnz sclp1 + call .dswap ;get everybody back in place + call .ddv ;move into range + jmp dosign +; +movup: ;positive exponent scale number up + jnz rngerr + mov a,l ;get loop count + ora a + jz dosign + mov c,a +sclp2: + call .dml10 + dcr c + jnz sclp2 +; +dosign: + lda msign ;check sign of number + ora a + jz return + call .dng ;negate accumulator +return: + pop b + ret +; +rngerr: + pop b + ret + end + ftoa.asm +; Copyright (C) 1982, 1983 by Manx Software Systems +; :ts=8 + extrn .dldp, .dlds, .utod, .dlis, .dswap, .dtst + extrn .dng, .dlt, .dge, .dad, .ddv, .dml10 + extrn flprm + dseg +chrptr: ds 2 +maxdig: ds 1 +ndig: ds 2 +exp: ds 2 +count: ds 1 +fflag: ds 1 + cseg +rounding: +; 0.5, + DB 040H,080H,00H,00H,00H,00H,00H,00H +; 0.05, + DB 040H,0CH,0CCH,0CCH,0CCH,0CCH,0CCH,0CDH +; 0.005, + DB 040H,01H,047H,0AEH,014H,07AH,0E1H,048H +; 0.0005, + DB 03FH,020H,0C4H,09BH,0A5H,0E3H,054H,00H +; 0.00005, + DB 03FH,03H,046H,0DCH,05DH,063H,088H,066H +; 0.000005, + DB 03EH,053H,0E2H,0D6H,023H,08DH,0A3H,0CDH +; 0.0000005, + DB 03EH,08H,063H,07BH,0D0H,05AH,0F6H,0C8H +; 0.00000005, + DB 03DH,0D6H,0BFH,094H,0D5H,0E5H,07AH,066H +; 0.000000005, + DB 03DH,015H,079H,08EH,0E2H,030H,08CH,03DH +; 0.0000000005, + DB 03DH,02H,025H,0C1H,07DH,04H,0DAH,0D3H +; 0.00000000005, + DB 03CH,036H,0F9H,0BFH,0B3H,0AFH,07BH,080H +; 0.000000000005, + DB 03CH,05H,07FH,05FH,0F8H,05EH,059H,026H +; 0.0000000000005, + DB 03BH,08CH,0BCH,0CCH,09H,06FH,050H,09AH +; 0.00000000000005, + DB 03BH,0EH,012H,0E1H,034H,024H,0BBH,043H +; 0.000000000000005, + DB 03BH,01H,068H,049H,0B8H,06AH,012H,0BAH +; +; + public ftoa_ +ftoa_: + push b + lxi h,12 + dad sp + mov e,m + inx h + mov d,m + xchg + shld chrptr ;buffer for converted data + lxi h,16 + dad sp + mov a,m + sta fflag ;e/f/g format flag +; + lxi h,4 + dad sp + call .dldp ;fetch number to convert + lxi h,14 + dad sp + mov a,m ;fetch precision + sta maxdig + inr a + mov l,a + mvi h,0 + shld ndig +; + lhld flprm + mov a,m + ora a + jp notneg + call .dng + lhld chrptr + mvi m,'-' + inx h + shld chrptr +notneg: + lxi b,0 ;clear integer exponent + call .dtst + jz numbok + call .dlis + db 041H,0aH,0,0,0,0,0,0 +adjust: + lhld flprm + inx h + mov a,m + cpi 1 + jm toosml + jz tentest + cpi 2 + jnz bignum + inx h + inx h + mov a,m + cpi 27H ;number < 10000, just do divides + jc quick + +bignum: + call inverse + call .dlis + db 40H,19H,99H,99H,99H,99H,99H,9aH +bignlp: + call .dml10 + inx b + call .dlt + jnz bignlp + call inverse + lhld flprm + inx h + inx h + inx h + mov a,m + cpi 10 + jc numbok + dcx b + call .dml10 + jmp numbok + +qcklp: + lhld flprm + inx h + mov a,m + cpi 1 + jnz quick +tentest: + inx h + inx h + mov a,m + cpi 10 + jc numbok +quick: + call .ddv ;divide by ten till 1 <= number < 10 + inx b ;count for exponent + jmp qcklp + +sml.lp: + lhld flprm + inx h + mov a,m + cpi 1 + jp numbok +toosml: + call .dml10 ;multiply by ten till 1 <= number < 10 + dcx b ;count for exponent + jmp sml.lp +; +numbok: + lda fflag ;check conversion format + ora a + jz eformat + cpi 1 + jz fformat + lda maxdig ;if %g then precision is # sig. digits + mov l,a + mvi h,0 + shld ndig + mov a,b ;select %f if maxdig > exp > -4, else use %e + ora a + jm chkm4 + mov a,c + cmp l + jnc eformat + mvi a,1 ;exp < maxdig, so use %f + jmp setformat +; +chkm4: + mov a,c + cpi -4 + jc eformat ;exp < -4, so use %e +fformat: + lhld ndig + dad b + shld ndig + mvi a,1 + jmp setformat +eformat: + xra a +setformat: + sta fflag +; now round number according to the number of digits + lhld ndig + dcx h + mov a,h + ora a + jp L1 + lxi h,0 + jmp L5 +L1: + jnz toomany + mov a,l + cpi 14 + jc L5 +toomany: + lxi h,14 +L5: + dad h ;*2 + dad h ;*4 + dad h ;*8 + lxi d,rounding + dad d + call .dlds + call .dad ;add in rounding counstant +; + call .dlis + db 041H,0aH,0,0,0,0,0,0 + call .dge ;check for rounding overflow + jz rndok + lxi h,1 + call .utod ;and repair if necessary + inx b + lda fflag + ora a + jz rndok + lhld ndig + inx h + shld ndig +rndok: + mov h,b + mov l,c + shld exp + lda fflag + ora a + jz unpack + mov a,b + ora a + mov a,c ;move for unpack + jp unpack +; F format and negative exponent +; put out leading zeros + lhld chrptr + mvi m,'0' + inx h + mvi m,'.' + inx h + lda ndig+1 + ora a + jm under + mov a,c + cma + jmp L2 +under: + lda maxdig +L2: + ora a + jz zdone +zdiglp: + mvi m,'0' + inx h + dcr a + jnz zdiglp +zdone: + shld chrptr + mvi a,0ffH ;mark decpt already output +; +unpack: ;when we get here A has the position for the + ;decimal point + mov c,a ;save decimal point position + lxi h,ndig+1 ;check if ndigits is <= zero + mov a,m + ora a + jm unpdone ;if so just quit now + dcx h + ora m + jz unpdone ;if so just quit now + lhld flprm + lxi d,10 + dad d + mvi m,0 ;zap guard bytes + inx h + mvi m,0 + mvi b,0 +unplp: + mov a,b + cpi 15 + mvi a,'0' + jnc zerodigit + lhld flprm + inx h ;skip sign byte + mov a,m + cpi 1 + mvi a,'0' + jnz zerodigit + inx h ;skip exponent + inx h ;skip overflow + add m + mvi m,0 ;subtract integer portion (virtual) +zerodigit: + lhld chrptr + mov m,a + inx h + shld chrptr + lxi h,ndig + dcr m + jz unpdone + mov a,b + cmp c + jnz mul10 + lhld chrptr + mvi m,'.' + inx h + shld chrptr +mul10: + call .dml10 ;multiply by 10 and re-normalize + inr b + jmp unplp +; +unpdone: + lda fflag + ora a + jnz alldone +; + lhld chrptr + mvi m,'e' + inx h + mvi m,'+' + lda exp+1 + ora a + lda exp + jp posexp + mvi m,'-' + cma + inr a +posexp: + inx h + cpi 100 + jc lt100 + mvi m,'1' + inx h + sui 100 +lt100: + mvi b,0 +tens: + cpi 10 + jc lt10 + inr b + sui 10 + jmp tens +lt10: + adi '0' ;ascii of last digit + mov e,a ;save last digit + mvi a,'0' + add b ;compute second digit + mov m,a + inx h + mov m,e + inx h + shld chrptr +; +alldone: + lhld chrptr + mvi m,0 + pop b + ret +; +inverse: + call .dswap + lxi h,1 + call .utod + jmp .ddv ;implied return +; + end + frexp.asm +; Copyright (C) 1982, 1983, 1984 by Manx Software Systems +; :ts=8 + extrn flprm + extrn .dldp, .utod + public frexp_, ldexp_, modf_ +; +frexp_: ;return mantissa and exponent + push b + lxi h,4 + dad sp + call calcexp ;calculate power of two exponent + jnz retexp + lxi b,0 +retexp: + lxi h,12 ;address second argument + dad sp + mov e,m + inx h + mov d,m + xchg + mov m,c ;return base 2 exponent + inx h + mov m,b +popret: + pop b + ret +; +ldexp_: ;load new exponent value (actualy add to exponent) + push b + lxi h,4 + dad sp + call calcexp + jz popret ;do nothing if number is zero or unnormalized + lxi h,12 ;fetch number to add to exponent + dad sp + mov e,m + inx h + mov d,m + xchg + dad b ;add exponents + mov a,h + ora a ;check sign of exponent + jp posexp + cma ;make positive for div and modulo below + mov h,a + mov a,l + cma + mov l,a + inx h + mov a,l + ani 7 + mov c,a ;save amount to shift + call rsexp ;make power of 256 + mov a,l + cma + inr a ;fix sign back + mov l,a + jmp ldrs +posexp: + ora l ;check if zero + jz popret ;no adjustment needed + mov c,l ;save to compute left shift + call rsexp ;make power of 256 + mov a,c + ani 7 + jz ldrsx + inr l ;bump exponent to make right shift + cma + adi 9 ;compensate for +1 (c = -(x-8)) +ldrsx: + mov c,a ;save for loop below +ldrs: + xchg + lhld flprm + inx h + mov m,e ;save exponent +rsloop: + dcr c + jm popret + lhld flprm + inx h + inx h + mvi b,7 + ora a ;clear carry +rslp: + inx h + mov a,m + rar + mov m,a + dcr b + jnz rslp + jmp rsloop +; +rsexp: + ora a + mvi b,3 +rselp: + mov a,h + rar + mov h,a + mov a,l + rar + mov l,a + dcr b + jnz rselp + ret +; +calcexp: + call .dldp ;load into floating accumulator + lhld flprm + inx h + mov a,m ;get exponent value + cpi -64 + rz + mvi m,0 ;make exponent zero for return + mov l,a ;get low byte of exponent + rlc ;sign extend value + sbb a + mov h,a ;save high byte of exponent + dad h + dad h + dad h ; exp*8 to make power of two + mov b,h ; bc = exponent + mov c,l + lhld flprm + inx h + inx h + inx h ;hl = first byte of mantissa + mov a,m + ora a + rz ;unnormalized number? give up +lshft: + mov a,m + ani 80H ;test high bit of mantissa + rnz ;mantissa >= 0.5 ? yes return + ;otherwise, shift number to the left one place + dcx b ;and adjust exponent + lxi d,7 + dad d ;address of end of fraction +lsloop: + dcx h + mov a,m + ral + mov m,a + dcr e + jnz lsloop + jmp lshft +; +modf_: ;split into integral and fraction parts + push b + lxi h,12 ;pick up address to store integral part + dad sp + mov c,m + inx h + mov b,m + mov l,c + mov h,b + mvi e,8 ;clear out integer + xra a +mdclr: + mov m,a + inx h + dcr e + jnz mdclr +; + lxi h,4 + dad sp + call .dldp + lhld flprm + inx h + mov a,m + ora a + jm popret + jz popret + adi 64 + ani 7fH + mov e,a + dcx h + mov a,m ;get sign of number + ani 80H ;isolate + ora e ;combine with exponent + stax b ;store away + inx b + inx h + mov a,m ;refetch exponent + inx h ;skip over exponent + inx h ;skip over overflow byte + cpi 7 + jc expok ;limit move loop to 7 bytes + mvi a,7 +expok: + mov e,a ;save count for loop + cma + adi 8 ; 7 - loop count + mov d,a ;save # bytes in fraction +intmov: ;copy integer part into given area + mov a,m + stax b + inx h + inx b + dcr e + jnz intmov +; +fnorm: ;note: E is zero at start of this loop + dcr d + jm zfrac ;fraction is zero + mov a,m ;look for non-zero byte + inx h + dcr e ;count for exponent of fraction + ora a + jz fnorm +; + dcx h ;back up to good byte + inr e ;fix exponent + mov b,h ;save position in accumulator + mov c,l + lhld flprm + inx h + mov m,e ;store exponent + inx h ;skip overflow byte + mvi e,7 ;count of # that must be cleared +frcmov: + inx h + ldax b + mov m,a + inx b + dcr e + dcr d + jp frcmov + xra a +frcclr: ;clear out rest of register + inx h + mov m,a + dcr e + jnz frcclr + pop b + ret +zfrac: ;fraction is zero + lxi h,0 + call .utod + pop b + ret + fsubs.asm +; Copyright (C) 1982, 1983, 1984 by Manx Software Systems +; :ts=8 + extrn Sysvec_ + extrn lnprm + extrn puterr_ + dseg + public flprm,flsec +flprm: dw acc1 +flsec: dw acc2 + public flterr_ +flterr_: dw 0 +retsave:ds 2 +YU: ds 2 +VEE: ds 2 +expdiff:ds 1 +acc1: ds 18 +acc2: ds 18 + ;work area for divide and multiply routines +lcnt: ds 1 ;iterations left +tmpa: ds 8 ;quotient +tmpb: ds 8 ;remainder work area +tmpc: ds 8 ;temp for divisor + cseg + public .flds ;load single float into secondary accum +.flds: + xchg + lhld flsec + jmp fload +; + public .fldp ;load single float into primary accum +.fldp: + xchg + lhld flprm +fload: + push b + ldax d ;get first byte of number + mov m,a ;save sign + inx h + ani 7fH ;isolate exponent + sui 64 ;adjust from excess 64 notation + mov m,a ;and save + inx h + mvi m,0 ;extra byte for carry + mvi b,3 ;copy 3 byte fraction +ldloop: + inx h + inx d + ldax d + mov m,a + dcr b + jnz ldloop + + mvi b,5 ;clear rest to zeros + xra a +clloop: + inx h + mov m,a + dcr b + jnz clloop + pop b + ret +; + public .fst ;store single at addr in HL +.fst: + push b + xchg + lhld flprm + mov a,m ;get sign + ani 80H ;and isolate + mov b,a ;save + inx h + mov a,m ;get exponent + adi 64 ;put into excess 64 notation + ani 7fH ;clear sign bit + ora b ;merge exponent and sign + stax d + inx h ;skip overflow byte + mvi b,3 ;copy 3 bytes of fraction +fstlp: + inx d + inx h + mov a,m + stax d + dcr b + jnz fstlp + pop b + ret +; + public .dlis ;load double immediate secondary +.dlis: + pop d ;get return addr + lxi h,8 ;size of double + dad d + push h ;put back correct return addr + xchg + ;fall through into .dlds +; + public .dlds ;load double float into secondary accum +.dlds: + xchg + lhld flsec + jmp dload +; + public .dlip ;load double immediate primary +.dlip: + pop d ;get return addr + lxi h,8 ;size of double + dad d + push h ;put back correct return addr + xchg + ;fall through into .dldp +; + public .dldp ;load double float into primary accum +.dldp: + xchg + lhld flprm +dload: + push b + ldax d ;get first byte of number + mov m,a ;save sign + inx h + ani 7fH ;isolate exponent + sui 64 ;adjust from excess 64 notation + mov m,a ;and save + inx h + mvi m,0 ;extra byte for carry + mvi b,7 ;copy 7 byte fraction +dloop: + inx h + inx d + ldax d + mov m,a + dcr b + jnz dloop + + inx h + mvi m,0 ;clear guard byte + pop b + ret +; + public .dst ;store double at addr in HL +.dst: + push b + push h ;save address + call dornd ;round fraction to 7 bytes + pop d ;restore address + lhld flprm + mov a,m ;get sign + ani 80H ;and isolate + mov b,a ;save + inx h + mov a,m ;get exponent + adi 64 ;put into excess 64 notation + ani 7fH ;clear sign bit + ora b ;merge exponent and sign + stax d + inx h ;skip overflow byte + mvi b,7 ;copy 7 bytes of fraction +dstlp: + inx d + inx h + mov a,m + stax d + dcr b + jnz dstlp + pop b + ret +; + public .dpsh ;push double float onto the stack +.dpsh: ;from the primary accumulator + pop h ;get return address + shld retsave ;and save for later + call dornd + lhld flprm + lxi d,9 + dad d + mov d,m ;bytes 6 and 7 + dcx h + mov e,m + dcx h + push d + mov d,m ;bytes 4 and 5 + dcx h + mov e,m + dcx h + push d + mov d,m ;bytes 2 and 3 + dcx h + mov e,m + dcx h + push d + mov d,m ;byte 1 + dcx h + dcx h ;skip over carry byte + mov a,m ;get exponent + adi 64 ;and restore to excess 64 notation + ani 7fH + mov e,a + dcx h + mov a,m + ani 80H ;isolate sign bit + ora e ;combine exponent and sign + mov e,a + push d + lhld retsave + pchl +; + public .dpop ;pop double float into secondary accum +.dpop: + pop h ;get return address + shld retsave ;and save + lhld flsec + pop d ;exponent/sign and first fraction + mov m,e ;save sign + inx h + mov a,e + ani 7fH ;isolate exponent + sui 64 ;adjust for excess 64 notation + mov m,a + inx h + mvi m,0 ;extra byte for carry + inx h + mov m,d + inx h + pop d ;bytes 2 and 3 of fraction + mov m,e + inx h + mov m,d + inx h + pop d ;bytes 4 and 5 of fraction + mov m,e + inx h + mov m,d + inx h + pop d ;bytes 6 and 7 of fraction + mov m,e + inx h + mov m,d + inx h + mvi m,0 ;clear guard byte + lhld retsave + pchl +; + public .dswap ;exchange primary and secondary +.dswap: + lhld flsec + xchg + lhld flprm + shld flsec + xchg + shld flprm + ret +; + public .dng ;negate primary +.dng: + lhld flprm + mov a,m + xri 80H ;flip sign + mov m,a + ret +; + public .dtst ;test if primary is zero +.dtst: + lhld flprm +; mov a,m +; ora a +; jnz true + inx h + mov a,m + cpi -64 + jnz true +; inx h +; inx h +; mov a,m +; ora a +; jnz true + jmp false +; + public .dcmp ;compare primary and secondary +; + ;return 0 if p == s +p.lt.s: ;return < 0 if p < s + xra a + dcr a + pop b + ret +; +p.gt.s: ; > 0 if p > s + xra a + inr a + pop b + ret +; +.dcmp: + push b + lhld flprm + xchg + lhld flsec + ldax d + ora a + jm dcneg +; primary is positive + xra m ;check if signs the same + jm p.gt.s ;differ then p > s + jmp docomp +dcneg: + ;primary is negative + xra m ;check if signs the same + jm p.lt.s ;differ the p < s + xchg ;both negative reverse sense of test +docomp: + inx h + inx d + ldax d + cmp m ;compare exponents + jm p.lt.s ;sign test ok since -64 < exp < 64 + jnz p.gt.s + mvi b,9 ;test overflow byte + 8 bytes of fraction +cmploop: + inx h + inx d + ldax d + cmp m + jc p.lt.s + jnz p.gt.s + dcr b + jnz cmploop + ;return 0 if p == s + xra a + pop b + ret +; + public .dsb ;subtract secondary from primary +.dsb: + lhld flsec + mov a,m + xri 80H ;flip sign of secondary + mov m,a + ;fall thru into add routine +; + public .dad ;add secondary to primary +.dad: + ;DE is used as primary address + ;and HL is used as secondary address + push b + ;clear extra bytes at end of accumulators + lhld flprm + lxi d,11 ;leave guard byte alone + dad d + mvi b,7 + xra a +clp1: + mov m,a + inx h + dcr b + jnz clp1 + + lhld flsec + lxi d,11 ;leave guard byte alone + dad d + mvi b,7 +clp2: + mov m,a + inx h + dcr b + jnz clp2 + + lhld flprm + xchg + lhld flsec + inx h + inx d + ldax d ;primary exponent + sub m ;compute difference + jp ordok + xchg ;swap so primary is larger + cma + inr a +ordok: + dcx d + dcx h + shld flsec ;fix primary and secondary + xchg + shld flprm + cpi 9 ;check for exp diff too large + jnc normalize + mov c,a ;save exponent difference + push h + push d + adi 9 ;adjust for offset + mov e,a + mvi d,0 + dad d ;adjust address for exponent difference + shld YU + pop d + lxi h,9 + dad d + shld VEE + pop h + xchg ;get prm in DE and scnd in HL + ldax d ;sign of primary + xra m ;check if signs same + jp doadd + + ldax d + ora a ;test which one is negative + jm UfromV ;jump if primary is negative + ;subtract V from U + mvi b,7 + lhld YU + xchg + lhld VEE +sublpa: ;carry is already cleared + ldax d + sbb m + stax d + dcx d + dcx h + dcr b + jnz sublpa +brlpa: + ldax d + sbi 0 + stax d + dcx d + dcr c + jp brlpa + xchg ;get destination into HL + jmp subchk ;check for negative result +; +UfromV: + ;subtract U from V + mvi b,7 + lhld VEE + xchg + lhld YU +sublpb: ;carry is already cleared + ldax d + sbb m + mov m,a + dcx d + dcx h + dcr b + jnz sublpb +brlpb: + mvi a,0 + sbb m + mov m,a + dcx h + dcr c + jp brlpb +subchk: ;check for negative result + inx h + mov a,m ;check carry byte + ora a ;test sign + mvi a,1 + jp makpos + lxi d,15 + dad d ;point to end of number +neglp: + mvi a,0 + sbb m + mov m,a + dcx h + dcr e + jp neglp + mvi a,81H ;make number negative +makpos: + lhld flprm + mov m,a ;set sign of number + jmp normalize +; +doadd: + ;add V to U + mvi b,7 + lhld YU + xchg + lhld VEE +addlp: ;carry is already cleared + ldax d + adc m + stax d + dcx d + dcx h + dcr b + jnz addlp +crylp: + ldax d + aci 0 + stax d + dcx d + dcr c + jp crylp + jmp normalize +; + public .ddv +.ddv: ;double floating divide (primary = primary/secondary) + push b + lhld flprm + xchg + lhld flsec + ldax d + xra m ;compute sign of result + stax d ;and store + inx h + inx d + ldax d ;primary exponent + sub m ;eu-ev + mov c,a ;save exponent + push d + push h + mov a,m + cpi -64 + jnz d.ok + pop h + pop h ;throw away + mvi a,3 ;flag divide by zero error + sta flterr_ + jmp setbig ;set to biggest possible number +d.ok: + inx d + inx h + mvi b,8 +cmloop: + inx d + inx h + ldax d + cmp m + jnz differ + dcr b + jnz cmloop + ;numbers are the same give 1 as the answer + pop h ;throw away + pop h ;get destination addr + inr c ;adjust exponent + mov m,c ;save exponent + inx h + mvi m,0 ;clear extra byte + inx h + mvi m,1 ;set result + mvi b,8 + xra a + sta flterr_ + jmp zclr +; +differ: ;check carry to find out smaller number + pop d ;restore divisor address + pop h ;restore dividend address + mov m,c ;store exponent + jc uok + inr c ;bump exponent + mov m,c + dcx h ;and shift dividend right (logically) +uok: + push d ;save for later + lxi d,9 + dad d ;compute end address + mvi b,8 + lxi d,tmpb ;copy dividend into work area +remsav: + mov a,m + stax d + dcx h + inx d + dcr b + jnz remsav + pop h ;restore divisor addr + lxi d,9 + dad d ;move backwards + mvi b,8 + lxi d,tmpc ;copy divisor into work area +divsav: + mov a,m + stax d + dcx h + inx d + dcr b + jnz divsav + mvi b,8 + lxi h,tmpa ;clear quotient buffer + xra a +quinit: + mov m,a + inx h + dcr b + jnz quinit + + mvi a,64 + sta lcnt ;initialize loop counter +divloop: + lxi h,tmpa + mvi b,16 + ora a ;clear carry +shlp: + mov a,m + adc a ;shift one bit to the left + mov m,a + inx h + dcr b + jnz shlp + sbb a + ani 1 + mov c,a + + mvi b,8 + lxi d,tmpb + lxi h,tmpc + ora a ;clear carry +sublp: + ldax d + sbb m + stax d + inx d + inx h + dcr b + jnz sublp + mov a,c + sbi 0 + jnz zerobit +onebit: + lxi h,tmpa + inr m + lxi h,lcnt + dcr m + jnz divloop + jmp divdone +; +zerobit: + lxi h,lcnt + dcr m + jz divdone + lxi h,tmpa + mvi b,16 + ora a ;clear carry +zshlp: + mov a,m + adc a ;shift one bit to the left + mov m,a + inx h + dcr b + jnz zshlp + + sbb a + mov c,a + mvi b,8 + lxi d,tmpb + lxi h,tmpc + ora a ;clear carry +daddlp: + ldax d + adc m + stax d + inx d + inx h + dcr b + jnz daddlp + mov a,c + aci 0 + jnz zerobit + jmp onebit +; +divdone: + lhld flprm + lxi d,12 + dad d + mvi m,0 + dcx h + mvi m,0 + lxi d,tmpa + mvi b,8 +qusav: + dcx h + ldax d + mov m,a + inx d + dcr b + jnz qusav + jmp normalize +; + public .dml +.dml: ;double floating multiply (primary = primary * secondary) + push b + lhld flprm + xchg + lhld flsec + ldax d + xra m ;compute sign of result + stax d ;and store + inx h + inx d + ldax d ;primary exponent + cpi -64 + jz zresult + add m ;eu+ev + stax d ;save exponent + mov a,m ;check for mult by zero + cpi -64 + jz zresult + + push d ;save for later + lxi d,9 + dad d ;compute end address + mvi b,8 + lxi d,tmpc ;copy muliplicand into work area +msav1: + mov a,m + stax d + dcx h + inx d + dcr b + jnz msav1 + pop h ;restore multiplier addr + lxi d,9 + dad d ;move backwards + mvi b,8 + lxi d,tmpb ;copy multiplier into work area +msav2: + mov a,m + stax d + dcx h + inx d + dcr b + jnz msav2 + mvi b,8 + lxi h,tmpa ;clear buffer + xra a +clrmul: + mov m,a + inx h + dcr b + jnz clrmul + + mvi a,64 + sta lcnt ;initialize loop counter +muloop: + lxi h,tmpa + mvi b,16 + ora a ;clear carry +mshlp: + mov a,m + adc a ;shift one bit to the left + mov m,a + inx h + dcr b + jnz mshlp + jnc mnext + + mvi b,8 + lxi d,tmpa + lxi h,tmpc + ora a ;clear carry +maddlp: + ldax d + adc m + stax d + inx d + inx h + dcr b + jnz maddlp +; + mvi b,8 +madclp: + ldax d + aci 0 + stax d + jnc mnext + inx d + dcr b + jnz madclp +; +mnext: + lxi h,lcnt + dcr m + jnz muloop + + lhld flprm + lxi d,12 + dad d + lxi d,tmpb-2 + mvi b,10 +msav: + ldax d + mov m,a + inx d + dcx h + dcr b + jnz msav + jmp normalize +; +; + public .deq +.deq: + call .dcmp + jz true +false: + lxi h,0 + xra a + ret +; + public .dne +.dne: + call .dcmp + jz false +true: + lxi h,1 + xra a + inr a + ret +; + public .dlt +.dlt: + call .dcmp + jm true + jmp false +; + public .dle +.dle: + call .dcmp + jm true + jz true + jmp false +; + public .dge +.dge: + call .dcmp + jm false + jmp true +; + public .dgt +.dgt: + call .dcmp + jm false + jz false + jmp true +; + public .utod +.utod: + push b + mov a,h + ora l + jz zresult + xchg + mvi b,0 + jmp posconv +; + public .itod +.itod: + push b + mov a,h + ora l + jz zresult + xchg + mvi b,0 + mov a,d + ora a + jp posconv + cma + mov d,a + mov a,e + cma + mov e,a + inx d + mvi b,80H +posconv: + lhld flprm + mov m,b ;store sign + inx h + mov a,d + ora a + jnz longcvt + mvi m,1 ;set up exponent + inx h + mvi m,0 ;clear extra byte + inx h + mov m,e ;move number into accumulator + mvi b,7 + xra a + jmp cnvlp +; +longcvt: + mvi m,2 ;setup exponent + inx h + mvi m,0 ;clear extra byte + inx h + mov m,d ;move number into accumulator + inx h + mov m,e + mvi b,6 + xra a +cnvlp: + inx h + mov m,a + dcr b + jnz cnvlp + jmp goodexit +; +dornd: ; round the number in the primary accumulator + lhld flprm + lxi d,10 ;offset of guard byte + dad d + mov a,m + cpi 128 + rc ; < 128 do nothing + jnz rndit + dcx h ; == 128 make number odd + mov a,m + ori 1 + mov m,a + ret +; +rndit: ; > 128 add one to fraction + push b + lxi b,0800H ;b = 8, and c = 0 + stc ; make loop add 1 +rndlp: + dcx h + mov a,m + adc c + mov m,a + dcr b + jnz rndlp + ora a ;check for fraction overflow + jnz normalize ;re-normalize number if so. + pop b + ret ;return if none +; +normalize: + lhld flprm ;get address of accum + inx h + mov a,m ;fetch exponent + + mov d,h ;save address for later + mov e,l + inx h + mov c,a + xra a + cmp m ;check extra byte + jnz movrgt ;non-zero move number right + + mvi b,8 ;search up to 8 bytes +nloop: + inx h + cmp m + jnz movleft + dcr c ;adjust exponent + dcr b ;count times thru + jnz nloop + ;zero answer +zresult: + xra a + sta flterr_ +under0: + lhld flprm + mvi b,10 + mov m,a + inx h + mvi m,-64 ;so exponent will be zero after store +zclr: + inx h + mov m,a + dcr b + jnz zclr + pop b + ret +; +movleft: + mvi a,8 + sub b + mov b,a + jz chkexp ;no change in counter, no move needed + dcx h ;back up to zero + mov a,c + stax d ;save new exponent + push d ;save for rounding + inx d + mvi a,15 + sub b ;compute # of bytes to move + mov c,a ;save for loop +lmovlp: + mov a,m + stax d + inx d + inx h + dcr c + jnz lmovlp + xra a +lclrlp: + stax d ;pad with zeros + inx d + dcr b + jnz lclrlp + pop d ;restore accum address +; +chkexp: ;check for over/under flow + ldax d ;get exponent + ora a + jm chkunder + cpi 64 + jc goodexit + jmp overflow +; +chkunder: + cpi -63 + jc underflow +goodexit: + mvi a,0 + sta flterr_ + pop b + ret +; +movrgt: ;fraction overflow + inr c ;bump exponent + mov a,c + stax d ;save in accum + mvi b,15 + push d ;save for check at end + lxi h,16 + dad d ;end address for backwards move + mov d,h + mov e,l +rmovlp: + dcx d + ldax d + mov m,a + dcx h + dcr b + jnz rmovlp + mvi m,0 ;zap overflow byte back to zero + pop d ;restore exponent addr + jmp chkexp +; +underflow: + mvi a,1 + sta flterr_ + call userrtn ;check for user routine to handle errors + xra a + lhld flprm + inx h ;leave sign alone + mvi m,-63 ;set to smallest non-zero value + inx h + mov m,a + inx h + mvi m,1 + mvi b,8 + jmp zclr ;clear rest to zero +; +overflow: + mvi a,2 + sta flterr_ +setbig: + call userrtn ;check for user routine to handle errors + lhld flprm + inx h ;leave sign alone + mvi m,63 ;set exponent at max + inx h + mvi m,0 ;clear overflow byte + mvi a,0ffH ;and set fraction to max + mvi b,7 +oclr: + inx h + mov m,a + dcr b + jnz oclr + inx h + mvi m,0 + pop b + ret +; +userrtn: ;handle messages + lhld Sysvec_ ;any routine supplied? + mov a,h + ora l + jz myway + xchg + lxi h,4 + dad sp + mov c,m + inx h + mov b,m + push b + lhld flterr_ + push h + xchg + call apchl + pop h + pop h ;clean up arguments + ret +apchl: + pchl +; +myway: + call pmsg + db 'Floating point ',0 + lda flterr_ + cpi 1 + jnz notund + call pmsg + db 'underflow',0 + jmp mycontinue +notund: cpi 2 + jnz notovr + call pmsg + db 'overflow',0 + jmp mycontinue +notovr: call pmsg + db 'divide by zero',0 +mycontinue: + call pmsg + db ' at location 0x',0 + lxi h,5 + dad sp + mov a,m + push h + push psw + call phex2 + pop psw + call phex + pop h + dcx h + mov a,m + push psw + call phex2 + pop psw + call phex + lxi h,10 ;newline + push h + call puterr_ + pop h + ret +; +phex2: + rar + rar + rar + rar +phex: + ani 15 + adi '0' + cpi '9'+1 + jc hexok + adi 'A'-'0'-10 +hexok: + mov l,a + mvi h,0 + push h + call puterr_ + pop h + ret +; +pmsg: + pop b ;get address of message +pmloop: + ldax b + inx b + ora a + jz pmsgdone + mov l,a + mvi h,0 + push h + call puterr_ + pop h + jmp pmloop +pmsgdone: + push b + ret +; + public .xtod +.xtod: + push b + lhld flprm + mvi m,0 ;clear sign + inx h + mvi m,3 ;set up exponent + lxi d,4 + dad d + mov e,l + mov d,h + mvi b,5 + xra a +xtodclr: + inx h + mov m,a + dcr b + jnz xtodclr +; + mvi b,4 + lxi h,lnprm + lda lnprm+3 + ora a + jp lngok +; +lngloop: + mvi a,0 + sbb m + stax d + inx h + dcx d + dcr b + jnz lngloop + dcx d ;back up to sign field + mvi a,080H ;mark as negative + stax d + jmp normalize +; +lngok: + mov a,m + stax d + inx h + dcx d + dcr b + jnz lngok + jmp normalize +; + public .dtox +.dtox: + push b + lxi h,0 + shld lnprm + shld lnprm+2 + lxi d,lnprm +; + lhld flprm + mov c,m ;get sign + inx h + mov a,m ;get exponent + ora a + jz goodexit ; |x| < 1.0 so return zero + jm goodexit +; + cpi 5 ;check for too big + jnc ltoobig +; + mov b,a ;save byte count + inx h ;skip overflow byte + add l + mov l,a + jnc lxx + inr h +lxx: + mov a,m + stax d + inx d + dcx h + dcr b + jnz lxx +; + mov a,c ;now check sign + ora a + jp goodexit + mvi b,4 + lxi h,lnprm +d2xneg: + mvi a,0 + sbb m + mov m,a + inx h + dcr b + jnz d2xneg + jmp goodexit +; +ltoobig: + xchg + mov a,c + ora a + jm bigneg + mvi m,07fH + inx h + mvi m,0ffH + inx h + mvi m,0ffH + inx h + mvi m,0ffH + jmp oflow +bigneg: + mvi m,080H + inx h + mvi m,0 + inx h + mvi m,0 + inx h + mvi m,0 + jmp oflow +; +; + public .dtou +.dtou: + push b + mvi c,0 ;flag as dtou + jmp ifix +; + public .dtoi +.dtoi: + push b + mvi c,1 ;flag as dtoi +ifix: + lhld flprm + mov b,m ;get sign + inx h + mov a,m ;get exponent + ora a + jz zeroint + jp nonzero +zeroint: + lxi h,0 ; |x| < 1.0 so return zero + jmp goodexit +; +nonzero: + cpi 3 ;check for too big + jnc toobig +; + inx h ;skip overflow byte + add l + mov l,a + jnc xx + inr h +xx: mov e,m + dcx h + mov d,m + xchg + mov a,c + ora a + jz goodexit + mov a,b + ora a + jp goodexit + mov a,h + cma + mov h,a + mov a,l + cma + mov l,a + inx h + jmp goodexit +; +toobig: + mov a,c + ora a + jnz bigsigned + lxi h,0ffffH ;return largest unsigned # + jmp oflow +; +bigsigned: + mov a,b + ora a + jm negover + lxi h,7fffH ;return largest positive # + jmp oflow +; +negover: + lxi h,8000H ;return largest negative # +oflow: + mvi a,2 + sta flterr_ + pop b + ret +; + public fabs_ +fabs_: + lhld flprm + mvi m,0 ;force to positive sign + ret +; + public .dml10 +.dml10: + push b + lhld flprm + inx h + inr m ;adjust exponent + lxi d,9 + dad d + xra a + mvi b,8 +ml10lp: + push b + mov e,m + xchg + mvi h,0 + dad h ;num*2 + mov b,h + mov c,l ;save + dad h ;num*4 + dad h ;num*8 + dad b ;num*10 + xchg + add e + inx h + mov m,a + mov a,d + aci 0 + dcx h + dcx h + pop b + dcr b + jnz ml10lp + inx h + mov m,a ;save last byte of result + ora a + jz normalize + dcx h + dcx h ;back up to exponent + mov a,m ;check to be sure no overflow + ora a + jm m10ok + cpi 64 + jnc overflow +m10ok: + pop b + ret + end + \ No newline at end of file diff --git a/Source/Images/d_aztecc/u0/OVBGN.O b/Source/Images/d_aztecc/u0/OVBGN.O new file mode 100644 index 00000000..6fcfc691 Binary files /dev/null and b/Source/Images/d_aztecc/u0/OVBGN.O differ diff --git a/Source/Images/d_aztecc/u0/OVLOADER.O b/Source/Images/d_aztecc/u0/OVLOADER.O new file mode 100644 index 00000000..bab51100 Binary files /dev/null and b/Source/Images/d_aztecc/u0/OVLOADER.O differ diff --git a/Source/Images/d_aztecc/u0/OVLY.ARC b/Source/Images/d_aztecc/u0/OVLY.ARC new file mode 100644 index 00000000..c831f0f3 --- /dev/null +++ b/Source/Images/d_aztecc/u0/OVLY.ARC @@ -0,0 +1,404 @@ + r.c +/* Copyright (C) 1984 by Manx Software Systems */ +#include + +main(argc, argv) +char **argv; +{ + register int (*func)(); + int (*prgload())(); + + if (argc < 2) { + fprintf(stderr, "usage: r progname args ...\n"); + exit(4); + } + ++argv; + if ((func = prgload(*argv)) == 0) { + fprintf(stderr, "Cannot load program\n"); + exit(4); + } + (*func)(argc-1, argv); +} + +#define OVMAGIC 0xf1 + +struct header { + int magic; + unsigned ovaddr; + unsigned ovsize; + unsigned ovbss; + int (*ovbgn)(); +}; + +static int (*prgload(argv0))() +char *argv0; +{ + int fd; + char *topmem, *ovend, *sbrk(); + unsigned size; + struct header header; + char name[20]; + + strcpy(name, argv0); + strcat(name, ".ovr"); + if ((fd = open(name, 0)) < 0) + return 0; + if (read(fd, &header, sizeof header) < 0) + return 0; + /* check magic number on overlay file */ + if (header.magic != OVMAGIC || header.ovsize == 0) + return 0; + + topmem = sbrk(0); + ovend = header.ovaddr + header.ovsize + header.ovbss; + if (topmem < ovend) { + if (sbrk(ovend - topmem) == (char *)-1) + return 0; + } + if (read(fd, header.ovaddr, header.ovsize) < header.ovsize) + return 0; + close(fd); + return header.ovbgn; +} + crbegin.asm +; Copyright (C) 1983 by Manx Software Systems +; :ts=8 + public .ovbgn + extrn main_ + extrn _Uorg_, _Uend_ + bss saveret,2 +.ovbgn: + lxi h,_Uorg_ + lxi b,_Uend_-_Uorg_ + mvi e,0 +clrbss: + mov m,e + inx h + dcx b + mov a,c + ora b + jnz clrbss +; + pop h + shld saveret + call main_ + lhld saveret ;get return addr + pchl ;return to caller + end .ovbgn + rext.asm + extrn .begin + extrn execv_ + extrn execl_ + extrn agetc_ + extrn aputc_ + extrn atoi_ + extrn atol_ + extrn calloc_ + extrn Croot_ + extrn fdopen_ + extrn fgets_ + extrn fopen_ + extrn freopen_ + extrn format_ + extrn fprintf_ + extrn fputs_ + extrn fread_ + extrn fscanf_ + extrn fseek_ + extrn ftell_ + extrn fwrite_ + extrn getchar_ + extrn gets_ + extrn getw_ + extrn ioctl_ + extrn isatty_ + extrn lseek_ + extrn realloc_ + extrn malloc_ + extrn free_ + extrn creat_ + extrn open_ + extrn close_ + extrn posit_ + extrn printf_ + extrn fclose_ + extrn putchar_ + extrn puterr_ + extrn puts_ + extrn putw_ + extrn qsort_ + extrn rename_ + extrn scanfmt_ + extrn scanf_ + extrn setbuf_ + extrn sprintf_ + extrn sscanf_ + extrn ungetc_ + extrn unlink_ + extrn bios_ + extrn index_ + extrn movmem_ + extrn rindex_ + extrn sbrk_ + extrn rsvstk_ + extrn setjmp_ + extrn setmem_ + extrn strcat_ + extrn strncat_ + extrn strcmp_ + extrn strncmp_ + extrn strcpy_ + extrn strlen_ + extrn strncpy_ + extrn swapmem_ + extrn toupper_ + extrn tolower_ + extrn getusr_ + extrn setusr_ + extrn rstusr_ + extrn .dv,.ud + extrn .ml + mrext.asm + extrn .begin + extrn atof_ + extrn frexp_, ldexp_, modf_ + extrn ftoa_ + extrn asin_ + extrn acos_ + extrn arcsine_ + extrn atan2_ + extrn atan_ + extrn exp_ + extrn floor_ + extrn ceil_ + extrn log10_ + extrn log_ + extrn pow_ + extrn ran_ + extrn randl_ + extrn cos_ + extrn sin_ + extrn sinh_ + extrn cosh_ + extrn sqrt_ + extrn cotan_ + extrn tan_ + extrn tanh_ + + extrn execv_ + extrn execl_ + extrn agetc_ + extrn aputc_ + extrn atoi_ + extrn atol_ + extrn calloc_ + extrn Croot_ + extrn fdopen_ + extrn fgets_ + extrn fopen_ + extrn freopen_ + extrn format_ + extrn fprintf_ + extrn fputs_ + extrn fread_ + extrn fscanf_ + extrn fseek_ + extrn ftell_ + extrn fwrite_ + extrn getchar_ + extrn gets_ + extrn getw_ + extrn ioctl_ + extrn isatty_ + extrn lseek_ + extrn realloc_ + extrn malloc_ + extrn free_ + extrn creat_ + extrn open_ + extrn close_ + extrn posit_ + extrn printf_ + extrn fclose_ + extrn putchar_ + extrn puts_ + extrn putw_ + extrn qsort_ + extrn rename_ + extrn scanfmt_ + extrn scanf_ + extrn setbuf_ + extrn sprintf_ + extrn sscanf_ + extrn ungetc_ + extrn unlink_ + extrn bios_ + extrn index_ + extrn movmem_ + extrn rindex_ + extrn sbrk_ + extrn rsvstk_ + extrn setjmp_ + extrn setmem_ + extrn strcat_ + extrn strncat_ + extrn strcmp_ + extrn strncmp_ + extrn strcpy_ + extrn strlen_ + extrn strncpy_ + extrn swapmem_ + extrn toupper_ + extrn tolower_ + extrn getusr_ + extrn setusr_ + extrn rstusr_ + extrn .dv,.ud + extrn .ml + ovloader.c +/* Copyright (C) 1983, 1984 by Manx Software Systems */ + +#define OVMAGIC 0xf1 + +struct header { + int magic; + unsigned ovaddr; + unsigned ovsize; + unsigned ovbss; + int (*ovbgn)(); +}; + +static char *ovname; + +#asm + public ovloader +ovloader: + lxi h,2 + dad sp + mov e,m + inx h + mov d,m + xchg + shld ovname_ +; + call _ovld_ + pchl +#endasm + +static +_ovld() +{ + int fd, flag; + auto struct header hdr; + extern char *_mbot; + auto char filename[64]; + + flag = 0; + strcpy(filename, ovname); + for (;;) { + strcat(filename, ".ovr"); + if ((fd = open(filename, 0)) >= 0) + break; + if (flag++) + loadabort(10); + strcpy(filename, "a:"); + strcat(filename, ovname); + } + + if (read(fd, &hdr, sizeof hdr) != sizeof hdr) + loadabort(20); + + /* check magic number on overlay file */ + if (hdr.magic != OVMAGIC) + loadabort(30); + + if (_mbot < hdr.ovaddr+hdr.ovsize+hdr.ovbss) + loadabort(40); + + if (read(fd, hdr.ovaddr, hdr.ovsize) < hdr.ovsize) + loadabort(50); + close(fd); + return hdr.ovbgn; +} + +static +loadabort(code) +{ + char buffer[80]; + + sprintf(buffer, "Error %d loading overlay: %s$", code, ovname); + bdos(9, buffer); + exit(10); +} + ovbgn.asm +; Copyright (C) 1983, 1984 by Manx Software Systems +; :ts=8 + public .ovbgn, ovexit_ + extrn ovmain_ + extrn _Uorg_, _Uend_ + bss ovstkpt,2 + bss saveret,2 + bss bcsave,2 + bss ixsave,2 + bss iysave,2 +; +.ovbgn: + lxi h,_Uorg_ + lxi b,_Uend_-_Uorg_ + mvi e,0 +clrbss: + mov m,e + inx h + dcx b + mov a,c + ora b + jnz clrbss +; + mov h,b + mov l,c + shld bcsave + xra a + adi 3 + jpe savedone + db 221 + shld ixsave + db 253 + shld iysave +savedone: + pop h + shld saveret + pop d + lxi h,0 + dad sp + shld ovstkpt ;save stack pointer for ovexit + call ovmain_ + xchg ;save return value +ovret: + lhld saveret ;get return addr + push h ;place dummy overlay name ptr on stack + push h ;place return addr on stack + xchg ;restore return value to hl + ret ;return to caller +; +ovexit_: + lhld bcsave + mov b,h + mov c,l + xra a + adi 3 + jpe restdone + db 221 + lhld ixsave + db 253 + lhld iysave +restdone: + lxi h,2 ;get return value + dad sp + mov e,m + inx h + mov d,m + lhld ovstkpt ;restore original stack pointer + sphl + jmp ovret + end .ovbgn + \ No newline at end of file diff --git a/Source/Images/d_aztecc/u0/R.O b/Source/Images/d_aztecc/u0/R.O new file mode 100644 index 00000000..48786f33 Binary files /dev/null and b/Source/Images/d_aztecc/u0/R.O differ diff --git a/Source/Images/d_aztecc/u0/RBEGIN.O b/Source/Images/d_aztecc/u0/RBEGIN.O new file mode 100644 index 00000000..be7be7b9 Binary files /dev/null and b/Source/Images/d_aztecc/u0/RBEGIN.O differ diff --git a/Source/Images/d_aztecc/u0/RBUILD.SUB b/Source/Images/d_aztecc/u0/RBUILD.SUB new file mode 100644 index 00000000..94b73da4 --- /dev/null +++ b/Source/Images/d_aztecc/u0/RBUILD.SUB @@ -0,0 +1,4 @@ +as rext.asm +ln -ro r.com r.o rext.o -lc +pip r.lib=r.rsm[o],rbegin.o[o] + \ No newline at end of file diff --git a/Source/Images/d_aztecc/u0/REXT.ASM b/Source/Images/d_aztecc/u0/REXT.ASM new file mode 100644 index 00000000..d61bd8b8 --- /dev/null +++ b/Source/Images/d_aztecc/u0/REXT.ASM @@ -0,0 +1,73 @@ + extrn .begin + extrn execv_ + extrn execl_ + extrn agetc_ + extrn aputc_ + extrn atoi_ + extrn atol_ + extrn calloc_ + extrn Croot_ + extrn fdopen_ + extrn fgets_ + extrn fopen_ + extrn freopen_ + extrn format_ + extrn fprintf_ + extrn fputs_ + extrn fread_ + extrn fscanf_ + extrn fseek_ + extrn ftell_ + extrn fwrite_ + extrn getchar_ + extrn gets_ + extrn getw_ + extrn ioctl_ + extrn isatty_ + extrn lseek_ + extrn realloc_ + extrn malloc_ + extrn free_ + extrn creat_ + extrn open_ + extrn close_ + extrn posit_ + extrn printf_ + extrn fclose_ + extrn putchar_ + extrn puterr_ + extrn puts_ + extrn putw_ + extrn qsort_ + extrn rename_ + extrn scanfmt_ + extrn scanf_ + extrn setbuf_ + extrn sprintf_ + extrn sscanf_ + extrn ungetc_ + extrn unlink_ + extrn bios_ + extrn index_ + extrn movmem_ + extrn rindex_ + extrn sbrk_ + extrn rsvstk_ + extrn setjmp_ + extrn setmem_ + extrn strcat_ + extrn strncat_ + extrn strcmp_ + extrn strncmp_ + extrn strcpy_ + extrn strlen_ + extrn strncpy_ + extrn swapmem_ + extrn toupper_ + extrn tolower_ + extrn getusr_ + extrn setusr_ + extrn rstusr_ + extrn .dv,.ud + extrn .ml + \ No newline at end of file diff --git a/Source/Images/d_aztecc/u0/ROM.LIB b/Source/Images/d_aztecc/u0/ROM.LIB new file mode 100644 index 00000000..7cebad01 Binary files /dev/null and b/Source/Images/d_aztecc/u0/ROM.LIB differ diff --git a/Source/Images/d_aztecc/u0/SIDSYM.COM b/Source/Images/d_aztecc/u0/SIDSYM.COM new file mode 100644 index 00000000..3a2b3081 Binary files /dev/null and b/Source/Images/d_aztecc/u0/SIDSYM.COM differ diff --git a/Source/Images/d_aztecc/u0/SQZ.COM b/Source/Images/d_aztecc/u0/SQZ.COM new file mode 100644 index 00000000..60315cc6 Binary files /dev/null and b/Source/Images/d_aztecc/u0/SQZ.COM differ diff --git a/Source/Images/d_aztecc/u0/T.LIB b/Source/Images/d_aztecc/u0/T.LIB new file mode 100644 index 00000000..b749a4f8 Binary files /dev/null and b/Source/Images/d_aztecc/u0/T.LIB differ diff --git a/Source/Images/d_aztecc/u0/TINYSRC.ARC b/Source/Images/d_aztecc/u0/TINYSRC.ARC new file mode 100644 index 00000000..25a97971 --- /dev/null +++ b/Source/Images/d_aztecc/u0/TINYSRC.ARC @@ -0,0 +1,332 @@ + croot.c +/* Copyright (C) 1981, 1982 by Manx Software Systems */ +/* Copyright (C) 1983 by Manx Software Systems */ + +#define MAXARGS 30 +static char *Argv[MAXARGS]; +static char Argbuf[128]; +static int Argc; + +Croot() +{ + register char *cp; + + movmem((char *)0x81, Argbuf, 127); + Argbuf[*(char *)0x80 & 0x7f] = 0; + Argv[0] = ""; + cp = Argbuf; + Argc = 1; + while (Argc < MAXARGS) { + while (*cp == ' ' || *cp == '\t') + ++cp; + if (*cp == 0) + break; + Argv[Argc++] = cp; + while (*++cp) + if (*cp == ' ' || *cp == '\t') { + *cp++ = 0; + break; + } + } + main(Argc,Argv); + _exit(); +} + +exit(code) +{ + _exit(); +} + +getchar() +{ + register int c; + + if ((c = bdos(1)) == '\r') { + bdos(2,'\n'); + c = '\n'; + } else if (c == 0x1a) + c = -1; + return c; +} + +putchar(c) +{ + if (c == '\n') + bdos(2,'\r'); + bdos(2,c); + return c&255; +} + fprintf.c +/* Copyright (C) 1981,1982 by Manx Software Systems */ +/* Copyright (C) 1982 Thomas Fenwick */ +#include "stdio.h" + +static FILE *Stream; + +fprintf(stream,fmt,args) +FILE *stream; char *fmt; unsigned args; +{ + int fpsub(); + + Stream = stream; + return format(fpsub,fmt,&args); +} + +static +fpsub(c) +{ + return aputc(c,Stream); +} + printf.c +/* Copyright (C) 1981, 1982 by Manx Software Systems */ +/* Copyright (C) 1983 by Manx Software Systems */ + +printf(fmt,args) +char *fmt; unsigned args; +{ + int putchar(); + + format(putchar,fmt,&args); +} + +format(putsub, fmt, args) +register int (*putsub)(); register char *fmt; unsigned *args; +{ + register int c; + char *ps; + char s[8]; + static char *dconv(), *hexconv(); + + while ( c = *fmt++ ) { + if ( c == '%' ) { + switch ( c = *fmt++ ) { + case 'x': + ps = hexconv(*args++, s+7); + break; + case 'u': + ps = dconv(*args++, s+7); + break; + case 'd': + if ( (int)*args < 0 ) { + ps = dconv(-*args++, s+7); + *--ps = '-'; + } else + ps = dconv(*args++, s+7); + break; + case 's': + ps = *args++; + break; + case 'c': + c = *args++; + default: + goto deflt; + } + + while ( *ps ) + (*putsub)(*ps++); + + } else + deflt: + (*putsub)(c); + } +} + +static char * +dconv(n, s) +register char *s; register unsigned n; +{ + *s = 0; + do { + *--s = n%10 + '0'; + } while ( (n /= 10) != 0 ); + return s; +} + +static char * +hexconv(n, s) +register char *s; register unsigned n; +{ + *s = 0; + do { + *--s = "0123456789abcdef" [n&15]; + } while ( (n >>= 4) != 0 ); + return s; +} + fopen.c +/* Copyright (C) 1981, 1982 by Manx Software Systems */ +/* Copyright (C) 1983, 1984 by Manx Software Systems */ +#include "stdio.h" +#include "errno.h" + +#define MAXFILE 4 +#define RBUFSIZ 1024 +#define WBUFSIZ 1024 +#define RDNSCT (RBUFSIZ/128) +#define WRNSCT (WBUFSIZ/128) + +#define OPNFIL 15 +#define CLSFIL 16 +#define DELFIL 19 +#define READSQ 20 +#define WRITSQ 21 +#define MAKFIL 22 +#define SETDMA 26 +#define READRN 33 +#define WRITRN 34 +#define FILSIZ 35 +#define SETREC 36 + +static FILE Cbuffs[MAXFILE]; +static char writbuf[WBUFSIZ]; +static char readbuf[RBUFSIZ]; +static char *bufeof; +static FILE *curread; +static FILE *writfp; + +FILE * +fopen(name,mode) +char *name,*mode; +{ + register FILE *fp; + int user; + + fp = Cbuffs; + while ( fp->_bp ) { + if ( ++fp >= Cbuffs+MAXFILE ) { + errno = ENFILE; + return (NULL); + } + } + + if ((user = fcbinit(name,&fp->_fcb)) == -1) { + errno = EINVAL; + return NULL; + } + + if (user == 255) + user = getusr(); + fp->user = user; + setusr(user); + if (*mode == 'r') { + if (bdos(OPNFIL,&fp->_fcb) == 0xff) { + errno = ENOENT; + rstusr(); + return NULL; + } + fp->_bp = readbuf; + curread = 0; + } else { + if ( writfp ) + return NULL; + bdos(DELFIL, &fp->_fcb); + if (bdos(MAKFIL,&fp->_fcb) == 0xff) { + errno = ENOENT; + rstusr(); + return NULL; + } + fp->_bp = writbuf; + writfp = fp; + } + rstusr(); + fp->_fcb.f_overfl = fp->_fcb.f_record = 0; + return fp; +} + +fclose(ptr) +register FILE *ptr; +{ + register int err; + + err = 0; + if (ptr == writfp) { /* if writing flush buffer */ + err = flush(ptr->_bp - writbuf); + writfp = 0; + } else if (ptr == curread) + curread = 0; + setusr(ptr->user); + if (bdos(CLSFIL,&ptr->_fcb) == 0xff) + err = -1; + rstusr(); + ptr->_bp = 0; + return err; +} + +agetc(ptr) +register FILE *ptr; +{ + register int c; + +top: + if ((c = getc(ptr)) != EOF) { + switch (c &= 127) { + case 0x1a: + --ptr->_bp; + return EOF; + case '\r': + case 0: + goto top; + } + } + return c; +} + +getc(ptr) +register FILE *ptr; +{ + register int j; + + if (ptr != curread) { +readit: + curread = 0; /* mark nobody as current read */ + setusr(ptr->user); + if ((j = RDNSCT - blkrd(&ptr->_fcb,readbuf,RDNSCT)) == 0) + return -1; + rstusr(); + ptr->_fcb.f_record -= j; + bufeof = readbuf + j*128; + curread = ptr; + } + if (ptr->_bp >= bufeof) { + ptr->_fcb.f_record += (bufeof-readbuf) >> 7; + ptr->_bp = readbuf; + goto readit; + } + return *ptr->_bp++ & 255; +} + +aputc(c,ptr) +register int c; register FILE *ptr; +{ + c &= 127; + if (c == '\n') + if (putc('\r',ptr) == EOF) + return EOF; + return putc(c,ptr); +} + +putc(c,ptr) +int c; register FILE *ptr; +{ + *ptr->_bp++ = c; + if (ptr->_bp >= writbuf+WBUFSIZ) { + if (flush(WBUFSIZ)) + return EOF; + ptr->_bp = writbuf; + } + return (c&255); +} + +flush(len) +register int len; +{ + while (len & 127) + writbuf[len++] = 0x1a; + setusr(writfp->user); + if (len != 0 && blkwr(&writfp->_fcb,writbuf,len>>7) != 0) { + rstusr(); + return EOF; + } + rstusr(); + return 0; +} + \ No newline at end of file diff --git a/Source/Images/d_bascomp/Readme.txt b/Source/Images/d_bascomp/Readme.txt new file mode 100644 index 00000000..d7792401 --- /dev/null +++ b/Source/Images/d_bascomp/Readme.txt @@ -0,0 +1,11 @@ +===== Microsoft Basic-80 Compiler v.5.30a ===== + +The Microsoft BASIC Compiler is a highly efficient programming tool that +converts BASIC programs from BASIC source code into machine code. This +provides much faster BASIC program execution than has previously been +possible. It can make programs run an average of 3 to 10 times faster than +programs run under BASIC-80. Compiled programs can be up to 30 times +faster than interpreted programs if maximum use of integer variables is +made. + +View BASCOM.HLP included in the disk image using HELP.COM for documentation. diff --git a/Source/Images/d_bascomp/u0/BASCOM.COM b/Source/Images/d_bascomp/u0/BASCOM.COM new file mode 100644 index 00000000..1dda4754 Binary files /dev/null and b/Source/Images/d_bascomp/u0/BASCOM.COM differ diff --git a/Source/Images/d_bascomp/u0/BASCOM.HLP b/Source/Images/d_bascomp/u0/BASCOM.HLP new file mode 100644 index 00000000..4b174559 --- /dev/null +++ b/Source/Images/d_bascomp/u0/BASCOM.HLP @@ -0,0 +1,379 @@ +Introduction +Format notation +A sample session +Writing a Basic program to be compiled +Compiler-interpreter differences +New programming features +Second menu: Compiling, linking & loading, errors +:INTRODUCTION + +The Microsoft BASIC Compiler is a highly efficient programming tool that +converts BASIC programs from BASIC source code into machine code. This +provides much faster BASIC program execution than has previously been +possible. It can make programs run an average of 3 to 10 times faster than +programs run under BASIC-80. Compiled programs can be up to 30 times +faster than interpreted programs if maximum use of integer variables is +made. +:FORMAT NOTATION + +Wherever the format for a statement or command is given throughout this +HELP file, the following rules apply: + + 1. Items in capital letters must be input as shown. + + 2. Items in lower case letters enclosed in angle brackets ( < > ) + are to be supplied by the user. + + 3. Items in sqare brackets ( [ ] ) are optional. + + 4. All punctuation except angle brackets and square brackets + (i.e., commas, parentheses, semicolons, hyphens, and equal + signs) must be included where shown. + + 5. Items followed by an ellipsis ( ... ) may be repeated any + number of times (up to the length of the line). + + 6. Items separated by a vertical bar ( \ ) are mutually exclusive; + choose one. +:SAMPLE SESSION + +The following instructions will take you step by step through the compila- +tion process, from typing in the program to running the compiled version of +it. + +STEP 1: PRELIMINARIES + +Load BASIC-80 (NOT included in the BASCOM package) from disk. The program +will sign on and the letters + +ok + +will appear on the screen. Now enter: + + AUTO 100, 100 + +This command instructs BASIC-80 to automatically generate line numbers, +beginning with line 100 and incrementing by 100 each time you press ENTER. + +STEP 2: ENTER THE PROGRAM + +You are now ready to begin typing in your BASIC program. Anything that you +know runs in BASIC-80 will do. Alternatively, just read in a BASIC-80 +program you already use. + +STEP 3: SAVE THE PROGRAM + +In order for the compiler to process it, you must save your source program +in ASCII format. To do so, enter: + + SAVE "MYPROG",A + +There is now a BASIC program called MYPROG.BAS on your diskette that is +ready to be compiled. (A program that is not yet compiled is called the +source file.) + +Return to CP/M by typing SYSTEM. + +STEP 4: CHECK FOR ERRORS + +At this point, it is a good idea to check the program for syntax errors. +Removing syntax errors now will reduce the possibility of having to recom- +pile later. To do this, enter: + + BASCOM =MYPROG + +This command loads the BASIC Compiler and compiles the source file without +producing an object or listing file. If you have made any syntax errors, a +two-letter code will appear on the screen. If this happens, return to STEP +1, use the BASIC-80 interpreter again, and correct the errors. + +If no errors were encountered, you are ready to continue. + +STEP 5: COMPILE SOURCE FILE + +These commands instruct the BASIC Compiler to compile MYPROG.BAS, to put +the object in a file named MYPROG.REL, and to put the listing in a file +named MYPROG.LST. (.REL and .LST are default extensions supplied by the +BASIC Compiler.) + +There are now a relocatable object file called MYPROG.REL and a listing +file called MYPROG.LST on the disk. The object file contains the machine- +readable code generated by the compiler. The listing file contains the +BASIC program statements along with the machine language generated by each +statement. + +STEP 6: LOAD AND EXECUTE THE PROGRAM + +The LINK-80 linking loader is used to produce an executable program. To use +it, enter: + + L80 MYPROG,MYPROG/N/E + +This command runs LINK-80, which in turn loads the object file MYPROG.REL +into the correct memory locations, then writes it to disk as a .COM file. +During this process (which can take some time), runtime routines are drawn +from the BASLIB.REL runtime library. + +The compiled program which you stored on your own diskette can be run at +any time, all by itself, without using any part of the BASIC Compiler. It +works just like a standard CP/M command file. To execute, just enter: + + MYPROG + +The program should then work just as it did in the interpreter .. only much +faster. +:WRITING A BASIC PROGRAM TO BE COMPILED + +BASIC programs which are to be compiled are, for most part, written in just +the same way you have always written them to run with the interpreter. +However, there are some differences between the statements and commands +implemented in BASIC-80 and those implemented in the BASIC Compiler that +must be taken into consideration. + +The Compiler interacts with the console only to read compiler commands. +These specify what files are to be compiled. There is no "direct mode", as +with the MBASIC interpreter. Commands that are usually issued in the direct +mode with MBASIC are not implemented on the compiler. The following state- +ments and commands are not implemented and will generate an error message. + + AUTO CLEAR* CLOAD CSAVE CONT + DELETE EDIT LIST LLIST RENUM + SAVE LOAD MERGE NEW COMMON* + SYSTEM +* +(Note: Newer releases of the compiler which include the BRUN runtime module +do support CHAINing with COMMON and CLEAR with certain restrictions.) + +:FEATURES USED DIFFERENTLY BY THE BASIC COMPILER + +DEFINT/SNG/DBL/STR +The compiler does not "execute" DEFxxx statements; it reacts to the static +occurrence of these statements, regardless of the order in which program +lines are executed. A DEFxxx statement takes effect as soon as its line is +encountered. Once the type has been defined for a given letter, it remains +in effect until the end of the program or until a different DEfxxx state +ment with that letter takes effect. + +USRn Functions +USRn functions are significantly different from the interpreter versions. +The argument to the USRn function is ignored and an integer result is +returned in the HL registers. It is recommended that USRn functions be +replaced by the CALL statement. (See New BASIC Programming Features for +definition of CALL.) + +DIM and ERASE +The DIM statement is similar to the DEFxxx statement in that it is scanned +rather than executed. That is, DIM takes effect when its line is encoun- +tered. If the default dimension (10) has already been established for an +array variable and that variable is later encountered in a DIM statement, a +DD (redimensioned array) error results. There is no ERASE statement in the +compiler, so arrays cannot be erased and redimensioned. An ERASE statement +will produce a fatal error. + +Also note that the values of the subscripts in a DIM statement must be +integer constants; they may not be variables, arithmetic expressions, of +floating point values. For example, + + DIM A1(I) + DIM A1(3+4) + +are both illegal statements. + +END +During execution of a compiled program, an END statement closes files and +returns control to the operating system. The compiler assumes an END at the +end of the program, so it is not necessary to insert an END statement in +order to get proper program termination. + +FOR/NEXT +All FOR/NEXT loops must be statically nested with only 1 NEXT statement for +each FOR statement. + +ON ERROR GOTO/RESUME +If a program contains ON ERROR GOTO and RESUME statements, +the /E compilation switch must be used. If the RESUME NEXT, RESUME, or +RESUME 0 form is used, the /X switch must also be included. + +REM +REM statements or remarks starting with a single quotation mark do not make +up time or space during execution, and so may be used as freely as desired. + +STOP +The STOP statement is identical to the END statement. Open files are closed +and control returns to the operating system. + +TRON/TROFF +In order to use TRON/TROFF, the /D compilation switch must be used. Other- +wise, TRON and TROFF are ignored and a warning message is generated. +:NEW BASIC PROGRAMMING FEATURES + +The BASIC Compiler also adds new features that will add power and +efficiency to your programming. Keep in mind when utilizing these new +features that while they will compile with no problems, you cannot run a +program using these features with your interpreter, since BASIC-80 +doesn't recognize them. + +CALL Statement +The CALL Statement allows you to call and transfer flow to an assembly +language or FORTRAN subroutine. + +The format of the CALL Statement is: + + CALL [()] + +where and are supplied by you. + + is the name of the subroutine you wish to call. This name +must be 1 to 6 characters long and must be recognized by LINK-80 as a +global symbol. ( must be the name of the subroutine in a +FORTRAN SUBROUTINE statement or a PUBLIC symbol in an assembly language +routine.) + + is optional and contains the arguments that are passed to +the assembly language or FORTRAN subroutine. + +Example: 120 CALL MYROUT (I,J,K) + +CHAIN (or RUN) +The CHAIN and RUN statements both perform the same function: they allow you +to load a file from diskette into memory and run it. CHAIN (or RUN) closes +all open files and deletes the current contents of memory before loading +the designated program. The format of the CHAIN (or RUN) statement is as +follows: + + CHAIN + OR + RUN + +where is the name used when the file was saved. (With CP/M the +default extension .BAS is supplied.) + +WHILE...WEND +The WHILE...WEND statement is a conditional statement that executes a +series of statements in a loop as long as a given condition is true. + +The format of WHILE...WEND is: + + WHILE + - + - + + - + - + WEND + +where and are supplied by you. + +As long as is true (i.e., not zero), loop statements are +executed until the WEND statement is encountered. BASIC then returns to the +WHILE statement and checks "expression". If it is still true, the process +is repeated. If it is not true, execution resumes with the statement +following the WEND statement. + +WHILE/WEND loops may be nested to any level, as long as they are statically +nested. Each WEND will match the most recent WHILE. An unmatched WHILE +statement causes a "WHILE without WEND" error, and an unmatched WEND state- +ment causes a "WEND without WHILE" error. + +Example: + 090 'BUBBLE SORT ARRAY A$ + 100 FLIPS=1 'FORCE ONE PASS THRU LOOP + 110 WHILE FLIPS + 115 FLIPS=0 + 120 FOR I=1 TO J=1 + 130 IF A$(I)>A$(I+1) THEN + SWAP A$(I),A$(I+1):FLIPS=1 + 140 NEXT I + 150 WEND + +Double Precision Transendental Functions +SIN, COS, TAN, SQR, LOG, and EXP now return double precision results if +given double precision arguments. Exponentiation with double precision +operands will return double precision results. + +Long Variable Names +Variable names may be up to 40 characters long with all 40 characters +significant. Letters, numbers, and the decimal characters are allowed in +variable names, but the name must begin with a letter. Variable names may +also include all BASIC-80 commands, statements, function names, and +operator names. + +Expression Evaluation in the BASIC Compiler +During program compilation, when the BASIC Compiler evaluates expressions, +the operands of each operator are converted to the same type, that of the +most precise operand. For example, + + QR=J%+A!+Q + +causes J% to be converted to single precision and added to A!. This result +is coverted to single precision and added to Q. + +The Compiler is more limited than the interpreter in handling numeric +overflow. For example, when run on the interpreter the following program + + I%=20000 + J%=20000 + K%=-30000 + M%=I%+J%-K% + +yields 10000 for M%. That is, it adds I% to J% and, because the number is +too large, it converts the result into a floating point number. K% is then +converted to floating point nd subtracted. The result of 10000 is found, +and is converted back to integer and saved as M%. + +The Compiler, however, must make type conversion decisions during compila- +tion. It cannot defer until the actual values are known. Thus, the compiler +would generate code to perform the entire operation in integer mode. If the +/D switch were set, the error would be detected. otherwise, an incorrect +answer would be produced. + +In order to produce optimum efficiency in the compiled program, the +compiler may perform any number of valid algebraic transformations before +generating the code. For axample, the program + + I%=20000 + J%=-18000 + K%=20000 + M%=I%+J%+K% + +could produce an incorrect result when run. If the compiler actually per- +forms the arithmetic in the order shown, no overflow occurs. However, if +the compiler performs I%+K% first and then adds J%, an overflow will occur. + +The Compiler follows the rules of operator precedence and parenthetic +modification of such precedence, but no other guarantee of evaluation order +can be made. + +Using Integer Variables To Optimize Speed +In order to produce the fastest and most compact object code possible, make +use of integer variables. For example, this program + + FOR I=1 TO 10 + A(I)=0 + NEXT I + +can execute approximately 30 times faster by simply substituting "I%" for +"I". It is especially advantageous to use integer variables to compute +array subscripts. The generated code is significantly faster and more +compact. + +Maximum Line Length +The Compiler cannot accept a physical line that is more than 253 characters +in length. A logical statement, however, may contain as many physical lines +as desired. Use line feed to start a new physical line within a logical +statement. +::BASCOM2.HQP + + + + + + + + + + + + a random file. +51 Internal error + An internal malfunc \ No newline at end of file diff --git a/Source/Images/d_bascomp/u0/BASCOM2.HLP b/Source/Images/d_bascomp/u0/BASCOM2.HLP new file mode 100644 index 00000000..eeeceb3c --- /dev/null +++ b/Source/Images/d_bascomp/u0/BASCOM2.HLP @@ -0,0 +1,691 @@ +Compiling a program +Compilation switches +Compile-time error messages +The LINK-80 linking loader +LINK-80 error messages +Storing your program on disk +Running your compiled program +Runtime error messages +Using M80 +:COMPILING A PROGRAM + +Is your BASIC program now saved in ASCII format on your diskette? (To save +your program in ASCII format when using the interpreter, add an "A" switch +to the "SAVE" command, as shown in SAMPLE SESSION, Step 3: + + SAVE "[.]",A + +Return to CP/M command level and enter: + + BASCOM + +BASIC will return the prompt: "*", informing you that the BASIC +Compiler is loaded and ready to accept a command. + +Now enter the command of the form: + + objfile,lstfile=source file + +where objfile is the relocatable object file, lstfile is the listing file, +and source file is the BASIC source program file. + +A command to BASIC conveys the name of the source file to be compiled, and +the names of the file(s) to be created. With CP/M filenames are up to eight +characters long with a three-character extension. The default filename +extensions supplied to CP/M are: + + REL Relocatable object file + LST Listing file + BAS BASIC source file + MAC MACRO-80 source file + FOR FORTRAN-80 source file + COB COBOL-80 source file + COM Executable command file + +If you have a multi-drive system, you can tell the compiler where to obtain +or put the files you are working with by adding a drive number to each +filename. For example: + + A:MYPROG.REL=B:TEST + +finds the program TEST.BAS on the diskette that is in drive B, compiles it, +and puts the object in MYPROG.REL (on the diskette that is in drive A). + +If a drive is NOT specified, the object and listing files are placed on the +diskette that is in the default drive. + +Either the object file or the listing file or both may be omitted. An +object file is created only if the lstfile field is filled. Therefore, if +you wish to omit either, simply leave its filename out of the command. + +Examples: + +TESTOBJ=TEST.BAS Compile the program TEST.BAS + and put object in TESTOBJ.REL + without producing listing file. +TEST,TEST=TEST Compile TEST.BAS, put object in + TEST.REL and listing in + TEST.LST. +,=TEST.BAS Compile TEST.BAS but produce no + object or listing file. Useful + for checking for errors. +RABBIT=TEST Compile the program TEST.BAS + and put object in RABBIT.REL + without producing listing file. +:BASIC COMPILATION SWITCHES + +You can specify special parameters to be used during compilation by adding +a switch to the end of the command string. Switches are always preceded by +a slash, and more than one switch may be used in the same command. An +example of the format would be: + + TEST,TEST=TEST/D/X + +The default switch settings used if you don't specify any switches are: + + /Z/4/T + +The available switches and their actions are as follows: + +SWITCH ACTION + +/E The /E switch tells the compiler that the program contains the ON + ERROR GOTO statement. If a RESUME statement other than RESUME + is used with the ON ERROR GOTO statement, use /X + instead (see below). To handle ON ERROR GOTO properly, in a + compiled environment, BASIC must generate some extra code for the + GOSUB and RETURN statements. Therefore, do not use this switch + unless your program contains the ON ERROR GOTO statement. The /E + switch also causes line numbers to be included in the binary + file, so runtime error messages will include the number of the + line in error. + +SWITCH ACTION +/X The /X switch tells the BASIC Compiler that the program contains + one or more RESUME, RESUME NEXT, or RESUME 0 statements. The /E + switch is assumed when the /X switch is specified. To handle + RESUME statements properly in a compiled environment, the + compiler must relinquish certain optimizations. Therefore, do not + use this switch unless your program contains RESUME statements + other than RESUME . The /X switch also causes line + numbers to be included in the binary file, so runtime error + messages will include the number of the line in error. + +/N The /N switch prevents listing of the generated code in symbolic + notation. If this switch is not set, the source listing produced + by the compiler will contain the object code generated by each + statement. + +SWITCH ACTION + +/D The /D switch causes debug/checking code to be generated at + runtime. This switch must be set if you want to use TRON/TROFF. + The BASIC Compiler generates somewhat larger and slower code in + order to perform the following checks: + 1. Arithmetic overflow. All arithmetic operations, integer and + floating point, are checked for overflow and underflow. + 2. Array bounds. All array references are checked to see if the + subscripts are within the bounds specified in the DIM state- + ment. + 3. Line numbers are included in the generated binary so that + runtime errors can indicate the statement which contains the + error. + 4. RETURN is checked for a prior GOSUB. + +/Z The /Z switch tells the compiler to use Z80 opcodes. + +SWITCH ACTION + +/S The /S switch forces the compiler to write long quoted strings + (i.e. more than 4 characters) to the binary file as they are + encountered. This allows large programs with many quoted strings + to compile in less memory. However, there are two disadvantages: + 1. Memory space is wasted if identical, long quoted strings + appear in the program. + 2. Code generated while the -S switch is set cannot be placed + in ROM. + +SWITCH ACTION + +/4 The /4 switch allows the compiler to use the lexical conventions + of Microsoft 4.51 Disk BASIC interpreter. That is, spaces are + insignificant, variables with imbedded reserved words are + illegal, variable names are restricted to two significant + characters, etc. this feature is useful if you wish to compile a + source program that was coded without spaces, and contains lines + such as + + FORI=ATOBSTEPC + + Without the /4 switch, the compiler would assign the variable + "ATOBSTEPC" to the variable FORI. With the /4 switch, it would + recognize it as a FOR statement. + +SWITCH ACTION +/C The /C switch tells the compiler to relax line numbering con- + straints. Whene /C is specified, line numbers may be in any + order, or they may be eliminated entirely. Lines are compiled + normally, but of course cannot be targets for GOTO's, GOSUB's, + etc. While /C is set, the underline character causes the + remainder of the physical line to be ignored, and the next + physical line is considered to be a continuation of the current + logical line. NOTE: /C and /4 may not be used together. + +/T Use 4.51 execution conventions + +/O (Newer versions only). Tells the compiler to construct a stand- + alone program instead of one requiring presence of the BRUN.COM + runtime module. This generates much bigger programs because all + of the runtime routines must be included. +:BASIC COMPILER ERROR MESSAGES + +The following errors may occur while a program is compiling. The BASIC +Compiler outputs the two-character code for the err, along with an arrow. +The arrow indicates where in the line the error occurred. In those cases +where the compiler has read ahead before it discovered an error, the arrow +points a few characters beyond the error, or at the end of the line. The +error codes are as follows: + +FATAL ERRORS + +CODE ERROR +SN Syntax Error. Caused by one of the following: + Illegal argument name + Illegal assignment target + Illegal constant format + Illegal debug request + Illegal DEFxxx character specification + Illegal expression syntax + Illegal function argument list + Illegal function name + +CODE ERROR +SN Syntax Error. Caused by one of the following: + Illegal function formal parameter + Illegal separator + Illegal format for statement number + Illegal subroutine syntax + Invalid character + Missing AS + Missing equal sign + Missing GOTO or GOSUB + Missing comma + Missing INPUT + Missing line number + Missing left parenthesis + Missing minus sign + Missing operand in expression + Missing right parenthesis + Missing semicolon + Name too long + Expected GOTO or GOSUB + +CODE ERROR +SN Syntax Error. Caused by one of the following: + String assignment required + String expression required + String variable required here + Illegal syntax + Variable required here + Wrong number of arguments + Formal parameters must be unique + Single variable only allowed + Missing TO + Illegal FOR loop index variable + Missin THEN + Missing BASE + Illegal subroutine name +OM Out of memory + Array too big + Data memory overflow + Too many statement numbers + Program memory overflow + +CODE ERROR +SQ Sequence Error + Duplicate statement number + Statement out of sequence +TM Type Mismatch + Data type conflict + Variables must be of same type +BS Bad Subscript + Illegal dimension value + Wrong number of subscripts +LL Line Too Long +UC Unrecognizable Command + Statement unrecognizable + Command not implemented +OV Math Overflow +/0 Division by Zero +DD Array Already Dimensioned +FN FOR/NEXT Error + FOR loop index variable already in use + FOR without NEXT + NEXT without FOR + +CODE ERROR +FD Function Already Defined +UF Function Not Defined +WE WHILE/WEND Error + WHILE without WEND + WEND without WHILE +/E Missing "/E" Switch +/X Missing "/X" Switch + +WARNING ERRORS +ND Array Not Dimensioned +SI Statement Ignored + Statement ignored + Unimplemented command + +If the BASIC Compiler informs you of any of these errors, return to the +source program for debugging and try again. + +If no errors were encountered during compilation, and if you so chose, you +now have an object file containing machine readable code on your diskette. +Also on your diskette is a listing file which contains the BASIC program +statements along with the machine language generated by each statement. + +The next step in the process is loading and executing the program with +LINK-80. + +:LINK-80 LINKING LOADER + +As demonstrated in SAMPLE SESSION, compiled BASIC object files are loaded +into memory and executed using the LINK-80 linking loader. The loader has +many uses. You may wish to simply load one compiled program and run it, or +you may load several programs, subprograms, or assembly language +subroutines at the same time. Programs may be loaded at user-specified +locations, and program areas and data areas may be separated in memory. A +memory image of the executable file produced by LINK-80 can be saved on +disk and run at a later time. + +RUNNING LINK-80 + +At CP/M command level, enter: + + L80 + +This loads LINK-80, which will respond with: * . The loader exits back +to CP/M if a CONTROL-C is typed after the asterisk. (The loader also exits +back to CP/M after an /E switch or /G switch is executed. More on these +switches later.) + +LINK-80 COMMAND FORMAT + +A command to LINK-80 is made up of the filename(s) of the file(s) to be +loaded. For example, to load the compiled program MYPROG.REL, enter: + + MYPROG + +(It is not necessary to type the default extension .REL.) This loads the +program but does not run it. Whenever LINK-80 loads a BASIC Compiler +program, it automatically searches the BASIC library for the necessary +routines and loads these as well. Therefore, BASLIB.REL must be on the +default drive during the loading process. + +To run MYPROG, enter: + + /G + +This is the "go" or execute switch. LINK-80 prints two numbers and a BEGIN +EXECUTION message. LINK-80 always returns to TRSDOS after a /G switch has +been executed. + +As you probably have guessed, it is not necessary to perform these +operations with separate commands. It is possible to type one command line +that runs LINK-80, loads MYPROG.REL and executes it. To do this, enter: + +L80 MYPROG/G + +MORE COMMANDS AND SWITCHES + +LINK-80 provides other capabilities besides loading and executing +programs, such as looking at output without saving the program or +resetting the loader so that you can correct a mistake. Switches are +used to inform LINK-80 that you wish to perform special tasks. + +Here is an example that loads and saves a program called TEST.REL. + + >L80 + *TEST,TEST/N/E + +The first part of the command (TEST) loads the program called TEST.REL. The +next part (TEST/N) saves a copy of the loaded program on disk in a file +called TEST.COM. The last part (/E) causes LINK-80 to exit back to CP/M. + +THE /N SWITCH + +Take note of the /N switch. This switch saves a memory image of the +executable file on disk. The default extension for the saved file is .COM, +and this file is called a "command file". Once saved on disk, you need only +type the filename at CP/M command level to run the program. The /N switch +must immediately follow the filename of each file you wish to save, and it +does not take effect until a /E or /G switch is done. + +The following example links several object files, saves the main program +image and executes the program TAXES.REL. + + >L80 + *SUB1,SUB2,TAXES/N,TAXES/G + +Two subroutines (SUB1) and (SUB2) and an object file (TAXES) are linked and +loaded. The program is executed and the command file TAXES.COM is saved on +disk. + +THE /R SWITCH + +Another handy switch is /R. It returns LINK-80 to it's initial state by +"unloading" whatever you've loaded. Use it to reset the loader if you've +made a typing mistake or loaded the wrong program. The /R switch takes +effect as soon as LINK-80 sees it, so if you enter it at any time while +LINK-80 is running, the loader will reset. For example: + + >L80 + *INVEN1 + */R (oops-- meant to load INVEN2) + *INVEN2 (now only INVEN2 is loaded) + +SPECIAL SWITCHES + +For typical BASIC Compiler operation, only the above switches will be +needed. Some users may find that their applications require more +specialized capabilities. For this reason, the following switches are also +provided with LINK-80. + +In these examples, all programs have been loaded at the default origins +of CP/M. In special cases, the user may wish to specify the origins of +the programs and data that are loaded. LINK-80 provides special switches to +do this. + +/E:Name This is an optional form of the /E switch. Name is a global + symbol previously defined in one of the modules. LINK-80 + uses Name for the start address of the program. + +/G:Name This is an optional form of the /G switch. Name is a global + symbol previously defined in one of the modules. LINK-80 + uses Name for the start address of the program. + +/P and /D /P and /D allow the origin(s) to be set for the next program + loaded. /P and /D take effect when seen (not deferred), and + they have no effect on programs already loaded. The form is + /P:
or /D:
, where
is the desired + origin in the current typeout radix. (Default radix is + hexadecimal. /O sets radix to octal; /H to hex.) LINK-80 + does a default /P: (i.e., 100h). + + If no /D is given, data areas are loaded before program + areas for each module. If a /D is given, All Data and Common + areas are loaded starting at the data origin and the program + area at the program origin. Example: + + */P:200,FOO + DATA 200 300 + */R + */P:200-D:400,FOO + DATA 400 480 + PROGRAM 200 280 + +/U List the origin and end of the program and data area and all + undefined globals as soon as the current command line has + been interpreted. The program information is only printed if + a /D has been done. Otherwise, the program is stored in the + data area. + +/M List the origin and end of the program and data area, all + undefined globals and their values, and all undefined + globals followed by an asterisk. The program information is + only printed if a /D has been done. Otherwise, the program + is stored in the data area. + +/X If a filename/N was specified, /X will cause the file to be + saved in INTEL ascii HEX format with an extension of .HEX. + +/Y If a filename/N was specified, /Y will create a filename.SYM + file when /E is entered. This file contains the names and + addresses of all Globals for use with Digital Research's SID + and ZSID debuggers. + +SYSTEM LIBRARY SEARCHES + +Whenever a BASIC Compiler program is loaded, LINK-80 automatically searches +the BASIC Compiler library for the routines it needs and loads them. If you +gat an "Undefined" error, it means the compiler couldn't find something it +needed to finish compiling the program. Usually this is the name of a +subroutine that you forgot to load. + +If you are using the BASIC Compiler in conjunction with Microsoft's +FORTRAN-80, you may also be referencing some of FORTRAN's library routines. +For this reason, the /S switch is included in LINK-80 to force a search of +particular library modules. For example: + + *FORLIB/S,TEST/G + +Unless you are using FORLIB (supplied with FORTRAN-80), you should not need +the /S switch. + + +:LINK-80 ERROR MESSAGES + +LINK-80 has the following error messages: + +?No Start Address A /G switch was issued, but no main + program had been loaded. + +?Loading Error The last file given for input was + not a properly formatted LINK-80 + object file. + +?Out of Memory Not enough memory to load program. + +?Command Error Unrecognizable LINK-80 command. + +? Not Found , as given in the command string, + did not exist. + +%2nd COMMON larger The first definition of COMMON + block /XXXXXX/ was not the largest + definition. Reorder module loading + sequence or change COMMON block + definitions. + +%Mult. Def. Global YYYYYY + More than one definition for the + global (internal) symbol YYYYYY was + encountered during the loading + process. + +%Overlaying Program Area ,Start = xxxx + Data ,Public = (xxxx) + ,External = (xxxx) + A /D or /P will cause already + loaded data to be destroyed. + +?Intersecting Program Area + Data The program and data area intersect + and an address or external chain + entry is in this intersection. The + final value cannot be converted to + a current value since it is in the + area intersection. +?Start Symbol - - Undefined + After a /E: or /G: is given, the + symbol specified was not defined. + +Origin Above (Below) Loader Memory, Move Anyway (Y or N)? + After a /E or /G was given, either + the data or program area has an + origin or top which lies outside + loader memory (i.e., loader origin + to top of memory). If a Y CR is + given, LINK-80 will move the area + and continue. If anything else is + given, LINK-80 will exit. In either + case, if a /N was given, the image + will already have been saved. + +?Can't save Object File A disk error occurred when the file was being +saved. +:STORING YOUR PROGRAM ON DISKETTE + +Once it has been loaded by LINK-80, the object file is in a form that can +be executed by any CP/M computer. You can save this compiled program on +your own diskette so that it can be executed at a later time without using +the BASIC Compiler at all. + +The /N switch (discussed in the LINK-80 section) is the switch that causes +your object file to be saved. The default extension for the saved file is +.COM and this file is called a "command file". + +:RUNNING YOUR COMPILED PROGRAM + +Your compiled program (previously saved on your own diskette) can now be +executed any time you wish. When you are at CP/M command level the diskette +on which you saved your program is inserted into a drive, simply enter: + + + +At this point, your program should execute and your output should appear on +the screen. However, you may get a runtime error message. If you do, look +it up in the following list, and debug your program as best you can before +trying to store it on diskette again. + + +:RUNTIME ERROR MESSAGES + +The following errors may occur while a compiled program is executing. The +error numbers match those issued by the BASIC-80 interpreter. The compiler +runtime system prints long error messages followed by an address, unless +/D, /E, or /X is specified. In those cases the error message is followed by +the number of the line in which the error occurred. + +NUMBER MESSAGE +2 Syntax error + A line is encountered that contains an incorrect + sequence of characters in a DATA statement. +3 RETURN without GOSUB + A RETURN statement is encountered for which there + is no previous, unmatched GOSUB ststement. +4 Out of Data + A READ statement is executed when there are no + DATA statements with unread data remaining in the + program. + +NUMBER MESSAGE + +5 Illegal function call + A parameter that is out of range is passed to a + math or string function. An FC error may also + occur as the result of: + + 1. a negative or unreasonably large subscript + 2. a negative or zero argument with LOG + 3. a negative argument to SQR + 4. a negative mantissa with a non-integer + exponent + 5. a call to a USR function for which the + starting address has not yet been given + 6. an improper argument to ASC, CHR$, MID$, + LEFT$, RIGHT$, INP, OUT, WAIT, PEEK, POKE, + TAB, SPC, STRING$, SPACE$, INSTR, or + ON...GOTO + 7. a string concatenation that is longer than + 255 characters + +NUMBER MESSAGE +6 Floating overflow or integer overflow + The result of a calculation is too large to be + represented in BASIC-80's number format. If + underflow occurs, the result is zero and execution + continues without an error. +9 Subscript out of range + An array element is referenced with a subscript + that is outside the dimensions of the array. +11 Division by zero + A division by zero is encountered in an + expression, or the operation of involution results + in zero being raised to a negative power. Machine + infinity with the sign of the numerator is + supplied as the result of the division, or + positive machine infinity is supplied as the + result of the involution, and execution continues. +14 Out of string space + String variables exceed the allocated amount of + string space. + +NUMBER MESSAGE +20 RESUME without error + A RESUME statement is encountered before an error + trapping routine is entered. +21 Unprintable error + An error message is not available for the error + condition which exists. This is usually caused by + an ERROR with an undefined error code. +50 Field overflow + A FIELD statement is attempting to allocate more + bytes than were specified for the record length of + a random file. +51 Internal error + An internal malfunction has occurred in Disk + BASIC-80. Report to Microsoft the conditions under + which the message appeared. +52 Bad file number + A statement or command references a file with a + file number that is not OPEN or is out of the + range of file numbers specified at initialization. + +NUMBER MESSAGE +53 File not found + A RUN, CHAIN, KILL, or OPEN statement references a + file that does not exist on the current disk. +54 Bad file mode + An attempt is made to use PUT, GET, or LOF with a + sequential or to execute an OPEN with a file mode + other than I, O, R, D. +55 File already open + A sequential output mode OPEN is issued for a file + that is already open; or a KILL is given for a + file that is open. +57 Disk I/O error + An I/O error occurred on a disk I/O operation. It + is a fatal error, i.e., theoperating system cannot + recover from the error. +58 File already exists + The filename specified is identical to a filename + already in use on the disk. +61 Disk Full + All disk storage space is in use. + +NUMBER MESSAGE +62 Input past end + An INPUT statement is executed after all the data + in the file has been INPUT, or for a null (empty) + file. To avoid this error, use the EOF function to + detect the end of file. +63 Bad record number + In a PUT or GET statement, the record number is + either greater than the maximum allowed (32767) or + equal to zero. +64 Bad file name + An illegal form is used for the filename with RUN, + CHAIN, KILL, or OPEN (e.g., a filename with too + many characters). +67 Too many files + An attempt is made to create a new file (using + OPEN) when the directory is full. +::M80.HQP + + + + + + + + + + + + + +d file is .COM, +and this file is called a "command file". Once saved \ No newline at end of file diff --git a/Source/Images/d_bascomp/u0/BASLIB.REL b/Source/Images/d_bascomp/u0/BASLIB.REL new file mode 100644 index 00000000..61c95ab7 Binary files /dev/null and b/Source/Images/d_bascomp/u0/BASLIB.REL differ diff --git a/Source/Images/d_bascomp/u0/BRUN.COM b/Source/Images/d_bascomp/u0/BRUN.COM new file mode 100644 index 00000000..f9af0a00 Binary files /dev/null and b/Source/Images/d_bascomp/u0/BRUN.COM differ diff --git a/Source/Images/d_bascomp/u0/CREF.COM b/Source/Images/d_bascomp/u0/CREF.COM new file mode 100644 index 00000000..e125339a Binary files /dev/null and b/Source/Images/d_bascomp/u0/CREF.COM differ diff --git a/Source/Images/d_bascomp/u0/CREF80.COM b/Source/Images/d_bascomp/u0/CREF80.COM new file mode 100644 index 00000000..e125339a Binary files /dev/null and b/Source/Images/d_bascomp/u0/CREF80.COM differ diff --git a/Source/Images/d_bascomp/u0/L80.COM b/Source/Images/d_bascomp/u0/L80.COM new file mode 100644 index 00000000..264e3b54 Binary files /dev/null and b/Source/Images/d_bascomp/u0/L80.COM differ diff --git a/Source/Images/d_bascomp/u0/LIB80.COM b/Source/Images/d_bascomp/u0/LIB80.COM new file mode 100644 index 00000000..81b1d224 Binary files /dev/null and b/Source/Images/d_bascomp/u0/LIB80.COM differ diff --git a/Source/Images/d_bascomp/u0/M80.COM b/Source/Images/d_bascomp/u0/M80.COM new file mode 100644 index 00000000..9df2cc12 Binary files /dev/null and b/Source/Images/d_bascomp/u0/M80.COM differ diff --git a/Source/Images/d_bascomp/u0/MBASIC.COM b/Source/Images/d_bascomp/u0/MBASIC.COM new file mode 100644 index 00000000..c9ec3cd3 Binary files /dev/null and b/Source/Images/d_bascomp/u0/MBASIC.COM differ diff --git a/Source/Images/d_bascomp/u0/OBSLIB.REL b/Source/Images/d_bascomp/u0/OBSLIB.REL new file mode 100644 index 00000000..fe7b8e25 Binary files /dev/null and b/Source/Images/d_bascomp/u0/OBSLIB.REL differ diff --git a/Source/Images/d_bascomp/u0/RANTEST.ASC b/Source/Images/d_bascomp/u0/RANTEST.ASC new file mode 100644 index 00000000..0dd4dbdf Binary files /dev/null and b/Source/Images/d_bascomp/u0/RANTEST.ASC differ diff --git a/Source/Images/d_bascomp/u0/RANTEST.BAS b/Source/Images/d_bascomp/u0/RANTEST.BAS new file mode 100644 index 00000000..0812b948 --- /dev/null +++ b/Source/Images/d_bascomp/u0/RANTEST.BAS @@ -0,0 +1,17 @@ +00100 defint i-n +00200 recsiz%=32 +00300 open "R",1,"B:RANTEST.ASC",recsiz% +00400 for i=1 to 20 +00500 print #1, using "$$#,###.## ";1000*i,102.34*i*i +00600 put 1,i +00700 next i +00800 for i=1 to 20 +00900 get 1,i +01000 line input #1, prices$ +01100 print i,prices$ +01200 next i +01300 close 1 +01400 end +r i=1 to 20 +00900 get 1,i +01000 line input #1, prices \ No newline at end of file diff --git a/Source/Images/d_bascomp/u0/RANTEST.COM b/Source/Images/d_bascomp/u0/RANTEST.COM new file mode 100644 index 00000000..c1d807f7 Binary files /dev/null and b/Source/Images/d_bascomp/u0/RANTEST.COM differ diff --git a/Source/Images/d_bascomp/u0/RANTEST.REL b/Source/Images/d_bascomp/u0/RANTEST.REL new file mode 100644 index 00000000..b0541caa Binary files /dev/null and b/Source/Images/d_bascomp/u0/RANTEST.REL differ diff --git a/Source/Images/d_bascomp/u0/README.TXT b/Source/Images/d_bascomp/u0/README.TXT new file mode 100644 index 00000000..d0f0a53d --- /dev/null +++ b/Source/Images/d_bascomp/u0/README.TXT @@ -0,0 +1,54 @@ +Microsoft Basic-80 Compiler v.5.30a + +----------------------------------------------------------- +Example of a session: +----------------------------------------------------------- + +>MBASIC + +BASIC-80 Rev. 5.21 +[CP/M Version] +Copyright 1977-1981 (C) by Microsoft +Created: 28-Jul-81 +31800 Bytes free +Ok +10 PRINT "Hello World" +list +10 PRINT "Hello World" +Ok +RUN +Hello World +Ok +SAVE "HELLO",A +Ok +SYSTEM + +A>TYPE BAS.SUB + +BASCOM =$1 /E +L80 $1,$1/N/E + +A>SUPERSUB BAS HELLO + +SuperSUB V1.1 + +A>BASCOM =HELLO /E + +00000 Fatal Error(s) +24196 Bytes Free + +A>L80 HELLO,HELLO/N/E + +Link-80 3.44 09-Dec-81 Copyright (c) 1981 Microsoft + +Data 4000 4197 < 407> + +40207 Bytes Free +[4011 4197 65] + +A>hello + +Hello World + + +A> diff --git a/Source/Images/d_bascomp/u0/SAMPLE.BAS b/Source/Images/d_bascomp/u0/SAMPLE.BAS new file mode 100644 index 00000000..df4b4d8c --- /dev/null +++ b/Source/Images/d_bascomp/u0/SAMPLE.BAS @@ -0,0 +1,2 @@ +00010 PRINT "This is an example of BASIC-80" + \ No newline at end of file diff --git a/Source/Images/d_bascomp/u0/SAMPLE.COM b/Source/Images/d_bascomp/u0/SAMPLE.COM new file mode 100644 index 00000000..1826e658 Binary files /dev/null and b/Source/Images/d_bascomp/u0/SAMPLE.COM differ diff --git a/Source/Images/d_bascomp/u0/SAMPLE.REL b/Source/Images/d_bascomp/u0/SAMPLE.REL new file mode 100644 index 00000000..1317e642 Binary files /dev/null and b/Source/Images/d_bascomp/u0/SAMPLE.REL differ diff --git a/Source/Images/d_blank/ReadMe.txt b/Source/Images/d_blank/ReadMe.txt new file mode 100644 index 00000000..0dcddcd8 --- /dev/null +++ b/Source/Images/d_blank/ReadMe.txt @@ -0,0 +1,6 @@ +===== Blank Disk for RomWBW ===== + +This disk is intentionally empty and just provides an empty slice +that can be used in the concatenation of slices as desired + +-- WBW 3:59 PM 10/4/2023 \ No newline at end of file diff --git a/Source/Images/d_cpm22/ReadMe.txt b/Source/Images/d_cpm22/ReadMe.txt index ccb523e4..3b625aca 100644 --- a/Source/Images/d_cpm22/ReadMe.txt +++ b/Source/Images/d_cpm22/ReadMe.txt @@ -1,9 +1,9 @@ ===== CP/M-80 2.2 Disk for RomWBW ===== -This disk is one of several ready-to-run disks provided with RomWBW. -It contains a vanilla distribution of DRI's CP/M-80 2.2 adapted for -RomWBW. The disk is bootable as is (the operating system image is -already embedded in the system tracks) and can be launched from the +This disk is one of several ready-to-run disks provided with RomWBW. +It contains a vanilla distribution of DRI's CP/M-80 2.2 adapted for +RomWBW. The disk is bootable as is (the operating system image is +already embedded in the system tracks) and can be launched from the RomWBW Loader prompt. The remainder of this document describes the usage and contents of @@ -134,15 +134,21 @@ LBREXT.COM - Extract file from .LBR libraries LBREXT36.CFG - ZCNFG configuration file for LBREXT ZXD.COM - Enhanced directory lister w/ date/time stamp support ZXD.CFG - ZCNFG configuration file for ZXD +BBCBASIC.COM - BBC BASIC CP/M Version 3.00 by R.T.Russell +BBCBASIC.TXT - Help file for BBC BASIC +GENHEX.COM - Generates an Intel Hex file from the input file +LS.COM - An alternative file listing to DIR +LSWEEP.COM - Can extract and view member files of an .LBR archive + == Testing Applications (User Area 2) == User area 2 contains a variety of hardware testing applications. These are generally user contributed and have no documentation. -N.B., these applications are frequently not compatible with all RomWBW -hardware. They are included here as a convenience. If applicable, -your hardware documentation should refer to them and provide usage +N.B., these applications are frequently not compatible with all RomWBW +hardware. They are included here as a convenience. If applicable, +your hardware documentation should refer to them and provide usage instructions. == Sample Tune Files (User Area 3) == diff --git a/Source/Images/d_fortran/Readme.txt b/Source/Images/d_fortran/Readme.txt new file mode 100644 index 00000000..71d6398a --- /dev/null +++ b/Source/Images/d_fortran/Readme.txt @@ -0,0 +1,10 @@ +===== Microsoft Fortran-80 Compiler v.3.44 ===== + +This is Microsoft's implementation of the FORTRAN scientific-oriented high level +programming language. It was one of their early core languages developed for the +8-bit computers and later brought to the 8086 and IBM PC. In 1993 Microsoft +rebranded the product as Microsoft Fortran Powerstation. (Note: -80 refers to +the 8080/Z80 platform, not the language specification version) + +The user manual is available in the Doc directory, +Microsoft_FORTRAN-80_Users_Manual_1977.pdf diff --git a/Source/Images/d_fortran/u0/CPMIO.MAC b/Source/Images/d_fortran/u0/CPMIO.MAC new file mode 100644 index 00000000..a9151c3c --- /dev/null +++ b/Source/Images/d_fortran/u0/CPMIO.MAC @@ -0,0 +1,87 @@ +TITLE CPMIO CONSOLE I/O ROUTINES FOR CP/M + ENTRY $TTYIN,$TTYOT,$LNPTR,$CPMBF,$LINBF +TANDY EQU 0 +CPMSBC EQU 0 +; +IF2 +.PRINTX /CPMIO/ +IFT TANDY +.PRINTX/TANDY VERSION/ +ENDIF +IFT CPMSBC +.PRINTX/CPM SBC VERSION/ +ENDIF +IFF TANDY OR CPMSBC +.PRINTX/NORMAL CPM VERSION/ +ENDIF +ENDIF +; +IFT TANDY +CPMENT SET 4205H +ENDIF +IFF TANDY +CPMENT SET 5 +ENDIF +IFT CPMSBC +CPMENT SET 4005H +ENDIF +;CP/M CONSOLE OUTPUT ROUTINE +$TTYOT: PUSH B + PUSH D + PUSH H + PUSH PSW ;SAVE ALL REG'S + MVI C,2 ;CONSOLE OUTPUT + MOV E,A ;EXPECTS CHAR IN [E] + CALL CPMENT ;OUTPUT THE CHAR + POP PSW + POP H + POP D + POP B ;RESTORE STATE + RET +; +;CP/M CONSOLE INPUT ROUTINE +;NOTE: DON'T STOP PROGRAM IN INPUT WITH SWITCHES, COULD LEAVE +; GARB IN LINE IF THEN SAVED AND STARTED OVER. +$TTYIN: PUSH H ;SAVE [H,L] + LHLD $LNPTR ;POINT TO LAST CHAR + MOV A,M ;GET LAST CHAR + CPI 12Q ;FINISHED OFF LINE(LF)? + CZ GETLIN ;YES, GET ANOTHER + INX H ;POINT TO NEXT CHAR + MOV A,M ;GET IT + SHLD $LNPTR ;SAVE PTR + POP H ;RESTORE + RET +; +GETLIN: PUSH B + PUSH D ;SAVE OTHER REG'S + MVI C,12Q ;READ CONSOLE LINE + LXI D,$CPMBF ;PTR TO BUFFER + CALL CPMENT ;READ LINE FROM CONSOLE + LXI H,$CPMBF+1 ;POINT TO LENGTH OF LINE + MOV E,M ;GET LENGTH + MVI D,0 ;[D,E] = LENGTH + XCHG ;SAVE [H,L] IN [D,E] + DAD D ;GET PTR TO LAST CHAR + INX H + MVI M,15Q ;ADD + INX H + MVI A,12Q ;LINE FEED + CALL $TTYOT ;CPM DOESN'T GIVE ONE + MOV M,A ;AND + XCHG ;[H,L]=1ST CHAR -1 + POP D + POP B + RET +; +DSEG +$CPMBF: DB 80 ;LENGTH OF BUFFER + DB 0 ;LENGTH OF LINE +$LINBF: DB 12Q ;SO WORKS AT FIRST + DS 135 ;REST OF BUFFER FOR LINE +; +$LNPTR: DW $LINBF ;AT FIRST POINT TO IN FRONT +; ;TO FORCE READ OF LINE +; + END + \ No newline at end of file diff --git a/Source/Images/d_fortran/u0/CRCKLIST.CRC b/Source/Images/d_fortran/u0/CRCKLIST.CRC new file mode 100644 index 00000000..f39d9ef2 --- /dev/null +++ b/Source/Images/d_fortran/u0/CRCKLIST.CRC @@ -0,0 +1,16 @@ + +--> FILE: CPMIO .MAC CRC = 71 D9 +--> FILE: CREF80 .COM CRC = BB F2 +--> FILE: DSKDRV .MAC CRC = 7A 3B +--> FILE: DTBF .MAC CRC = 26 3C +--> FILE: F80 .COM CRC = EF E2 +--> FILE: FCHAIN .MAC CRC = DA 61 +--> FILE: FORLIB .REL CRC = DA 31 +--> FILE: INIT .MAC CRC = 81 21 +--> FILE: IOINIT .MAC CRC = 51 55 +--> FILE: L80 .COM CRC = 15 DF +--> FILE: LIB .COM CRC = 24 15 +--> FILE: LPTDRV .MAC CRC = 0B 56 +--> FILE: LUNTB .MAC CRC = 71 25 +--> FILE: M80 .COM CRC = 69 DB +--> FILE: TTYDRV .MAC CRC = C2 85 \ No newline at end of file diff --git a/Source/Images/d_fortran/u0/CREF80.COM b/Source/Images/d_fortran/u0/CREF80.COM new file mode 100644 index 00000000..e125339a Binary files /dev/null and b/Source/Images/d_fortran/u0/CREF80.COM differ diff --git a/Source/Images/d_fortran/u0/DSKDRV.MAC b/Source/Images/d_fortran/u0/DSKDRV.MAC new file mode 100644 index 00000000..c34d437c --- /dev/null +++ b/Source/Images/d_fortran/u0/DSKDRV.MAC @@ -0,0 +1,860 @@ + TITLE DSKDRV - FORTRAN-80 DISK DRIVER + + .8080 + +MAXLUN EQU 10 ;MAX # OF LUN'S ALLOWED + +;BDOS FUNCTION CALLS, FCB OFFSETS + +BDOS EQU 5 ;CP/M BDOS ENTRY POINT + +.RSET EQU 13 ;DISK RESET +.SELCT EQU 14 ;SELECT DISK +.OPEN EQU 15 ;OPEN FILE +.CLOSE EQU 16 ;CLOSE FILE +.DELET EQU 19 ;DELETE FILE +.MAKE EQU 22 ;CREATE FILE +.STDMA EQU 26 ;SET DMA ADDRESS + +FCB.FT EQU 9 ;FILE TYPE +FCB.EX EQU 12 ;EXTENT BYTE +FCB.RC EQU 15 ;RECORD COUNT BYTE +FCB.NR EQU 32 ;NEXT RECORD BYTE +FCB.RR EQU 33 ;RANDOM RECORD NUMBER (2.X) +FCBLEN EQU 36 ;FCB SIZE + +SECSIZ EQU 128 ;SECTOR SIZE (RECORD LENGTH) + +; GLOBAL DEFINITIONS + + EXTRN $CPMVN,$CPMRF,$CPMWF,$BL,$BF,$ERR + EXTRN $IOERR,$REC,$UN,$LUNTB,$CLSFL + + ENTRY $DSKER,$FLFLG,$MEMRY,DSKDRV + + DSEG ;DATA AREA + +; I/O ERROR CODE DEFNS + +OBOVF EQU 016Q ;OUTPUT BUFFER LIMIT EXCEEDED +IRECER EQU 022Q ;INPUT RECORD TOO LONG +NOFILE EQU 236Q ;FILE NOT FOUND +FULERR EQU 237Q ;DISK FULL +LUNERR EQU 240Q ;LUN TOO LARGE +NOMEM EQU 241Q ;OUT-OF-MEMORY + +; I/O MODE DEFN BYTE + +MD.ALC EQU 80H ;80H ALLOCATED BUFFER AND FCB +MD.OPN EQU 40H ;40H FILE IS OPEN +MD.OUT EQU 20H ;20H IF OUTPUT +MD.BIN EQU 10H ;10H IF UNFORMATTED I/O + +MD.WRT EQU 08H ;08H WRITE-DATA-IN-BUFFER +MD.RND EQU 04H ;04H IF RANDOM I/O + +$FLFLG: DS MAXLUN ;I/O MODE BYTE FOR EACH LUN +$FLCNT: DS MAXLUN ;I/O BUFFER INDEX FOR EACH LUN +$FLBUF: DS MAXLUN*2 ;BUFFER LOCATION FOR EACH LUN +$FLFCB: DS MAXLUN*2 ;FCB LOCATION FOR EACH LUN + +$DSKER: DS 1 ;STATUS OF LAST I/O +CLSADR: DS 2 + +$MEMRY: DS 2 ;FOR LOADER TO STORE TOP OF MEM INTO + + CSEG ;CODE AREA + +FILTXT: DB "FORT",0 ;DEFAULT FILENAME TEXT +FILEXT: DB "DAT",0 + + PAGE + +; I/O DISPATCH TABLE + +; LUN'S 6 THRU MAXLUN POINT TO THIS TABLE VIA $LUNTB. +; AN EXPLICIT OPEN VIA CALL OPEN () ALLOW +; OTHER UNITS TO USE THE DISK ALSO... + +DSKDRV: DW DSKFRD ;FORMATTED READ + DW DSKFWR ;FORMATTED WRITE + DW DSKURD ;UNFORMATTED READ + DW DSKUWR ;UNFORMATTED WRITE + DW DSKREW ;REWIND + DW $IOERR ;BACKSPACE (NOT SUPPORTED). + DW DSKCLS ;ENDFILE + +FNFERR: CALL $ERR + DB NOFILE ;FILE NOT FOUND + +DSKFUL: CALL $ERR + DB FULERR ;DISK FULL + +LUNOVF: CALL $ERR + DB LUNERR ;LUN TOO LARGE + +MEMERR: CALL $ERR + DB NOMEM ;OUT-OF-MEMORY + +;------------------------------------------------------ +; +; GET MODE BYTE(LUN) FROM $FLFLG +; +GTMODE: LXI H,$FLFLG-1 + LDA $UN ;GET UNIT # + MVI D,0 + MOV E,A + DAD D ;[HL] POINTS TO FLAG + MOV A,M ;GET FLAG + RET +;------------------------------------------------------ +; +; SET DMA TO DATA BUFFER(LUN) +; +SETBUF: PUSH B + PUSH D + CALL GETBUF ;GET BUFFER ADR + MVI C,.STDMA + CALL BDOS + POP D + POP B + RET +;------------------------------------------------------ +GETBUF: LDA $UN + ADD A + MOV E,A + MVI D,0 + LXI H,$FLBUF-2 + DAD D + MOV E,M + INX H + MOV D,M + RET + +;------------------------------------------------------ +; +; GET DATA.BUFFER.OFFSET(LUN) +; +GTBOFF: + LXI H,$FLCNT-1 + LDA $UN + MVI D,0 + MOV E,A + DAD D + MOV A,M ;GET OFFSET + RET + +;------------------------------------------------------ +; +; GET ADR OF FCB(LUN) IN [DE] +; +GTFCB: LXI H,$FLFCB-2 + LDA $UN + ADD A + MOV E,A + MVI D,0 + DAD D ;POINT TO ADR OF FCB + MOV E,M + INX H + MOV D,M + RET + +;------------------------------------------------------ +; +; GET READ/WRITE RECORD NUMBER FOR LUN +; ON RETURN: +; [HL] = FCB.RR(LUN) ADR OF RND REC NUM. +; [DE] = $REC 00 OR RND REC NUM. +; +GTREC: + CALL GTFCB + LXI H,FCB.RR + DAD D + XCHG + LHLD $REC + XCHG + RET +;------------------------------------------------------ +; ZERO FCB FROM EXTENT BYTE TO END. +; +CLRFCB: + CALL GTFCB + LXI H,FCB.EX + DAD D + LXI B,FCBLEN-FCB.EX +CLRFCL: + MOV M,B + INX H + DCR C + JNZ CLRFCL + RET +;------------------------------------------------------ +; COPY BYTES FROM [DE] TO [HL] UNTIL NULL (00). +; +CPYTXT: + MOV M,A ;COPY FROM [DE] TO [HL] + INX H ;UNTIL NULL. + INX D + LDAX D + ORA A + JNZ CPYTXT + RET + + PAGE +;------------------------------------------------------ +; +; OPNCHK - ASSURE THAT FILE IS OPEN AND BUFFERS ALLOCATED. +; IF NOT THEN: +; 1. ALLOCATE DATA BUFFER AND FCB FROM $MEMRY. +; 2. OPEN FILE WITH NAME OF FORT##.DAT WHERE: +; ## IS LOGICAL-UNIT-NUMBER (LUN) OF FILE. + +OPNCHK: + LDA $UN + CPI MAXLUN+1 ; + JNC LUNOVF ;LUN IS TOO LARGE +; ---------------- + PUSH B ;SAVE OPEN MODE REQUEST. + CALL GTMODE ;GET FLAG + ORA A ;ALLOCATED BUFFER,FCB? + CP ALCBUF ;NO, GET SPACE AND SET PTRS +; ---------------- + POP B ;GET I/O MODE IN [C] + ANI MD.OPN ;WAS OPEN? + CZ OPNFIL ;NO, OPEN FILE. + +;------------------------------------------------------ +; +; SETREC - SET UP RECORD NUMBER +; +SETREC: + CALL GTREC ;GET CURRENT & LAST RECORD NUMBERS + MOV A,D ;[DE] = $REC + ORA E ;IF RANDOM I/O + JNZ SETRND ;USE VALUE IN $REC +; ---------------- + MOV E,M ;..ELSE + INX H ;USE CURRENT RECORD + MOV D,M ;SET BY SEQ READ/WRITE. + PUSH D ;SAVE REC NO. + CALL GTMODE + ANI NOT MD.RND ;SET SEQUENTIAL MODE + MOV M,A + POP D ;RESTORE REC NO. + JMP SETSEQ +; ---------------- +SETRND: + CALL GTMODE + ANI MD.WRT ;WRITE-DATA-IN-BUFFER? + CNZ FRCOUT ;YES, FLUSH IT FIRST. + CALL GTMODE + ORI MD.RND ;SET RANDOM MODE + MOV M,A + CALL GTREC ;RESTORE REC NO'S. + DCX D ;ADJUST RANDOM REC NO. + MOV M,E + INX H ;STORE AT FCB.RR FOR NEXT I/O + MOV M,D + INX H + MVI M,0 +; ---------------- +SETSEQ: + LDA $CPMVN ;CP/M VERSION FLAG + ORA A ;VERSION 1.X ? + RZ ;NO, VERSION 2.X NOTHING ELSE NEEDED. +;------------------------------------------------------ +; +; SPLIT RANDOM RECORD INTO EXTENT AND RELATIVE RECORD +; FOR VERSION 1.X +; +SETV1: + MOV A,E + RAL + MOV A,D + RAL + MOV B,A + MOV A,E + ANI X'7F' + MOV C,A +; ---------------- + CALL GTFCB ;[DE] = ADR OF FCB(LUN) + LXI H,FCB.EX + DAD D + MOV A,M ;FETCH CURRENT EXTENT + CMP B + JZ SAMEXT ;IF SAME AS REQUESTED EXTENT +; +; CLOSE CURRENT EXTENT, OPEN REQUESTED ONE +; + PUSH B ;EXT/REC + PUSH D ;FCB ADR + LXI H,FCB.NR + DAD D + MVI M,0 ;ZERO THE RECORD NUMBER + LHLD $MEMRY ;GET SCRATCH BUFFER + XCHG ;FROM TOP OF HEAP FOR OPEN/CLOSE + MVI C,.STDMA + CALL BDOS + CALL GTMODE + ANI MD.OUT ;OPEN FOR OUTPUT? + JZ OPNXT ;NO, SKIP THIS CLOSE + POP D + PUSH D ;FCB + MVI C,.CLOSE + CALL BDOS +OPNXT: + POP D ;FCB + POP B ;EXT/REC + PUSH B + PUSH D + LXI H,FCB.EX + DAD D + MOV M,B ;SET NEW EXTENT NUMBER + MVI C,.OPEN + CALL BDOS + INR A + JNZ SKEXT ;IF IT EXISTS + POP D + PUSH D ;FCB + CALL MAKEXT ;CREATE NEW EXTENT +SKEXT: + POP D ;FCB + POP B ;EXT/REC +SAMEXT: + LXI H,FCB.NR + DAD D + MOV M,C ;SET RECORD NUMBER + RET + + PAGE +;------------------------------------------------------ +; ALLOCATE FCB AND BUFFER FOR UNIT . ALLOCATES UP FROM +; $MEMRY AND STORES PTRS IN TABLE. + +ALCBUF: PUSH H + LHLD $MEMRY ;GET CURRENT TOP + XCHG ;IN [DE] +; ---------------- + LXI H,-256 + DAD SP + MOV A,L + SUB E ;IF MEMTOP-256 < $MEMRY, + MOV A,H ;THEN GIVE OUT-OF-MEMORY + SBB D ;ERROR AND EXIT... + JC MEMERR +; ---------------- + LXI H,$FLBUF-2 + LDA $UN + ADD A + MVI B,0 + MOV C,A ;[BC]= 2*UNIT# + DAD B ;GET ADR OF PTR TO BUFFER + MOV M,E + INX H + MOV M,D ;STORE $MEMRY AS ADR + LXI H,SECSIZ + DAD D ;GET NEW TOP + PUSH H ;SAVE FCB ADR + CALL GTFCB ;GET [HL]=ENTRY+1 + POP D + PUSH D ;SAVE FCB ADR + MOV M,D + DCX H + MOV M,E ;STORE ADR OF FCB + LXI H,FCBLEN + DAD D ;GET NEW TOP OF ALLOC + SHLD $MEMRY ;STORE AWAY +; ---------------- + POP H ;FCB ADR. + MVI M,0 ;DEFAULT TO CURRENT DISK + INX H + LXI D,FILTXT ;DEFAULT NAME INITIALLY FORT##.DAT + LDAX D + CALL CPYTXT ;MOVE "FORT" TO FCB + LDA $UN + MOV B,A ;SAVE UNIT # + SUI 10 ;CARRY SET IF NOT UNIT 10 + SBB A + ADI "1" ;"1" IF 10 ELSE "0" + MOV M,A ;STORE DIGIT 1 OF # + MOV A,B + CPI 10 ;WAS IT 10? + JC SKPSTZ ;NO, DON'T SET ZERO + XRA A +SKPSTZ: ADI "0" ;GET 2ND DIGIT + INX H + MOV M,A + MVI A," " + INX H + MOV M,A + INX H + LXI D,FILEXT-1 ;EXTENSION + CALL CPYTXT ;MOVE "DAT" TO FCB +; ---------------- + POP H ;GET PTR TO FLAG + MVI A,MD.ALC ;NOW ALLOCATED. + MOV M,A ;SET FLAG + RET + + PAGE +;------------------------------------------------------ +; +; OPEN FILE GIVEN BY LUN AND CLEAR BUFFER INDEX. +; ENTRY: [DE] = ADR OF FCB +; EXIT: [HL] = ADR OF MODE BYTE +; [A] = MODE BYTE - ALLOCATED & OPEN. +; +OPNFIL: + PUSH B ;SAVE I/O MODE + CALL GTBOFF ;GET BUFFER.OFFSET(LUN) + MOV M,D ;CLEAR BUFFER INDEX +; ---------------- + LHLD $CLSFL + LXI D,CLSALL + MOV A,H + SUB D + JNZ STRADR ;NOT US, STORE ROUTINE ADR + MOV A,L + SUB E + JZ STRCLS ;US, DON'T STORE AGAIN +STRADR: SHLD CLSADR +STRCLS: XCHG + SHLD $CLSFL ;ON EXIT, CLOSE ALL FILES + CALL CLRFCB ;ZERO FCB & RECORD NUMBER. + CALL SETBUF ;SET DMA TO FILE BUFFER. +; ---------------- + POP B ;I/O MODE + PUSH B + MOV A,C + ANI MD.OUT + JZ OPNINP ;BRIF OPEN INPUT +;------------------------------------------------------ +; +; OPEN NEW FILE FOR OUTPUT OR RANDOM. +; + PUSH D ;SAVE FCB ADR + MVI C,.DELET ;DELETE OLD FILE + CALL BDOS + POP D + PUSH D + CALL MAKEXT ;CREATE NEW FILE. + POP D ;RESTORE FCB ADR +;------------------------------------------------------ +; +; OPEN EXISTING FILE FOR INPUT OR RANDOM. +; +OPNINP: + MVI C,.OPEN ;OPEN FILE + CALL BDOS + INR A + JZ FNFERR ;BRIF FILE NOT FOUND (FATAL). + +OPNDON: + CALL GTMODE + POP B ;GET I/O MODE. + MOV A,C + ORI MD.ALC+MD.OPN + MOV M,A ;MODE ALLOCATED/OPEN + I/O + RET + +;------------------------------------------------------ +; +; MAKE NEW FILE OR EXTENT. +; +MAKEXT: + MVI C,.MAKE ;CREATE NEW FILE + CALL BDOS + INR A + JZ DSKFUL ;BRIF DISK FULL ERROR. + RET + + PAGE +;------------------------------------------------------ +; +; REWIND UNIT # +; +DSKREW: CALL GTMODE + ANI MD.OPN ;FILE OPEN? + CNZ DSKCLS ;YES, CLOSE IT +NOCLOS: XRA A ;GOOD RETURN + RET + +;------------------------------------------------------ +; +; ENDFILE UNIT # +; +DSKCLS: CALL GTMODE + ADD A ;OPEN? + JP NOCLOS ;NO, DON'T CLOSE + MVI M,MD.ALC ;FLAG CLOSED NOW + ADD A ;OUTPUT FILE? + CM FRCBUF ;YES, DUMP LAST IF NEEDED + CALL GTFCB ;GET ADDR OF FCB + CALL SETBUF ;SET DMA ADR + MVI C,.CLOSE ;CLOSE FILE + CALL BDOS + XRA A ;NEVER AN ERROR + RET + +;------------------------------------------------------ +; +; CLOSE ALL FILES. CALLED FROM EXIT +; +CLSALL: LXI D,1 +CLSAL1: LXI H,$FLFLG-1 + DAD D + MOV A,M + ADD A ;SET MINUS IF OPEN + PUSH D ;SAVE UNIT # + MOV A,E + STA $UN ;SET UP FOR OTHERS + CM DSKCLS ;CLOSE FILE IF OPEN + POP D ;GET # BACK + INX D ;BUMP IT + LDA $LUNTB ;GET MAX LUN + CMP E ;DONE ALL? + JNZ CLSAL1 ;NO, DO NEXT + RET ;RETURN + + PAGE +;------------------------------------------------------ +; +; UNFORMATTED WRITE +; +DSKUWR: + MVI C,MD.OUT+MD.BIN + CALL OPNCHK ;OPEN IF NOT OPEN + LHLD $BF ;GET BUFFER ADR + PUSH H + XCHG + LHLD $BL ;GET LENGTH OF DATA + MVI H,0 ;# OF BYTES + XCHG + DAD D ;PTR TO 1ST TO CLEAR + XRA A + DCR E +DSKWCL: + INR E ;CLEARED REST OF BUFFER? + JM DSKUW1 ;YES, DONE + MOV M,A + INX H + JMP DSKWCL ;CLEAR END OF BUFFER +DSKUW1: + POP D ;GET BUFFER ADR + MVI C,.STDMA ;SET DMA TO BUFFER + CALL BDOS + CALL WRITE ;WRITE RECORD + ORA A ;ERROR? + RZ ;NO, GOOD RETURN + STC + RET + + PAGE +;------------------------------------------------------ +; +; UNFORMATTED READ +; +DSKURD: + MVI C,MD.BIN + CALL OPNCHK ;OPEN IF NEEDED + LHLD $BF + XCHG + MVI C,.STDMA ;SET DMA TO $BF + CALL BDOS + MVI A,128 + STA $BL ;ALWAYS 1 SECTOR + CALL READ ;READ RECORD INTO $BF + ORA A ;EOF OR GOOD + RZ + CPI 2 + CMC + RET +; + PAGE +;------------------------------------------------------ +; +; FORMATTED WRITE +; +DSKFWR: + MVI C,MD.OUT + CALL OPNCHK ;OPEN FILE IF NEEDED + XRA A + STA $DSKER ;CLEAR COUNT + LDA $BL ;GET # TO WRITE + ORA A + RZ ;IGNORE NULL BUFFERS + LDA $BL + ORA A + JP DSKFW0 + CALL $ERR ;WARN USER OF.. + DB OBOVF ;OUTPUT BUFFER LIMIT EXCEEDED + MVI A,127 ;AND TRUNCATE TO 127 BYTES. +DSKFW0: + CALL RNDCHK ;IF RND MODE, SET OFFSET TO 0. + LHLD $BF ;GET BUFFER PTR +DSKFW2: + PUSH PSW ;SAVE COUNT + MOV A,M + CALL DSKOUT ;SEND OUT BYTE + INX H ;INCREMENT BUFFER PTR + POP PSW ;RETRIEVE COUNT + DCR A ;DECREMENT COUNT + JNZ DSKFW2 ;ONE MORE TIME +; +DSKWDN: MVI A,15Q + CALL DSKOUT ;PUT OUT + CALL GTMODE ;MARK MODE BYTE WITH + ORI MD.WRT ;WRITE-DATA-IN-BUFFER. + MOV M,A + LDA $DSKER ;GET $DSKEROR STATUS + ORA A ;ERROR? + RZ ;NO + STC ;YES + RET +; + PAGE +;------------------------------------------------------ +; +; FORMATTED READ +; +DSKFRD: + MVI C,0 + CALL OPNCHK ;OPEN IF NEEDED + XRA A + STA $BL ;CLEAR LENGTH OF RECORD + STA $DSKER ;CLEAR $DSKEROR + CALL RNDCHK ;IF RND MODE, SET OFFSET TO 0. +DSKFR1: + CALL DSKIN ;GET CHAR + JC DSKRDN ;JUMP IF EOF + CPI 32Q ;CP/M EOF? + JZ DSKEOF ;YES + LHLD $BL + MVI H,0 + XCHG + LHLD $BF ;BASE + DAD D ;GET WHERE TO PUT BYTE + MOV M,A ;STORE CHAR + INX D ;BUMP OFFSET + XCHG + SHLD $BL ;UPDATE OFFSET + CPI 15Q ;? + JZ DSKRDN ;YES, HAVE RECORD + MOV A,L ;GET OFFSET + CPI 128 ;BUFFER FULL? + JC DSKFR1 ;NO, GET NEXT + CALL $ERR ;WARN USER OF.. + DB IRECER ;INPUT RECORD TOO LONG. + XRA A + RET +; +DSKRDN: LDA $DSKER ;GET STATUS + ORA A + RZ ;NO ERROR + CPI 2 + CMC + RET +DSKEOF: ORA A ;SET CC'S + RET +; + PAGE +;------------------------------------------------------ +; +; RESET BUFFER OFFSET IF RANDOM READ OR WRITE +; +RNDCHK: + PUSH PSW + CALL GTMODE + ANI MD.RND + JZ RNDCHX ;DO NOTHING IF SEQUENTIAL MODE. + CALL GTBOFF ;ELSE ZERO BUFFER OFFSET SO.. + MVI M,0 ;NEXT READ/WRITE STARTS AT BEGINNING. +RNDCHX: + POP PSW + RET +;------------------------------------------------------ +; +; DISK INPUT ROUTINE +; +DSKIN: + CALL GTBOFF ;BUFFER.OFFSET(LUN) + ORA A ;BUFFER EMPTY? + CZ REDBUF ;YES, REFIL + RC ;EOF + DCR M ;DECR. # LEFT + LXI H,$FLBUF-2 + DAD D + DAD D ;GET $FLBUF PTR + CMA + ADI 129 ;128-#LEFT=OFFSET + ADD M + MOV E,A + INX H + MVI A,0 + ADC M + MOV D,A + LDAX D ;GET CHAR + ORA A + RET +;------------------------------------------------------ +; +; READ BUFFER FROM DISK +; +REDBUF: PUSH H + PUSH D + CALL SETBUF + CALL READ ;READ RECORD + STA $DSKER ;STORE STATUS + ORA A + POP D + POP H + MVI A,128 ;FULL BUFFER + MOV M,A ;STORE COUNT + RZ ;IF NO ERROR + STC + RET + +;------------------------------------------------------ +; +; DISK OUTPUT ROUTINE +; +DSKOUT: PUSH H + PUSH PSW + CALL GTBOFF ;GET BUFFER OFFSET + ORA A ;BUFFER FULL? + CM DMPBUF ;YES, DUMP + INR M + LXI H,$FLBUF-2 + DAD D + DAD D ;POINT TO ADR OF BUFFER + ADD M + MOV E,A + INX H + MVI A,0 + ADC M + MOV D,A ;POINTS TO FREE + POP PSW ;GET CHAR BACK + STAX D ;STORE CHAR + POP H + RET + +;------------------------------------------------------ +; +; FORCE FORMATTED BUFFER OUT ON CLOSE +; +FRCBUF: ADD A ;UNFORMATTED I/O? + JM FRCOUT ;YES, FORCE OUT LAST IF NEEDED + MVI A,32Q + CALL DSKOUT ;SET END OF FILE + +FRCOUT: CALL GTBOFF ;BUFFER.OFFSET(LUN) + ORA A ;EMPTY? + MVI M,0 ;CLEAR OFFSET + RZ ;YES, DO NOTHING + PUSH PSW ;SAVE OFFSET + CALL GETBUF ;GET BUFFER ADR + POP PSW + MOV L,A + MVI H,0 + DAD D ;POINT TO 1ST UNUSED +CHKFIL: ORA A ;SET MINUS IF FULL + JM DMPBF1 ;NOTHING TO FILL + MVI M,0 ;CLEAR BYTE + INX H + INR A ;BUMP OFFSET + JMP CHKFIL +;------------------------------------------------------ +; +; DUMP BUFFER TO DISK +; +DMPBF1: + DCX H ;SO THAT DRIVE # ISN'T CLEARED +DMPBUF: + PUSH H + PUSH D + CALL SETBUF + CALL WRITE ;WRITE RECORD + STA $DSKER ;STORE STATUS + CALL GTMODE + ANI NOT MD.WRT ;CLEAR WRITE-DATA BIT + MOV M,A + POP D + POP H + XRA A + MOV M,A ;CLEAR BUFFER OFFSET + RET + +;------------------------------------------------------ +; +; READ RECORD/WRITE RECORD PRIMITIVES +; +READ: CALL GTFCB ;GET ADDR OF FCB + LDA $CPMRF ;CP/M 1.X OR 2.X + MOV C,A ;RANDOM READ FUNCTION + JMP IOCALL + +WRITE: CALL GTFCB ;GET ADDR OF FCB + LDA $CPMWF ;CP/M 1.X OR 2.X + MOV C,A ;RANDOM WRITE FUNCTION + +IOCALL: CALL BDOS ;DO APPROPRIATE FUNCTION + PUSH PSW ;SAVE ERROR RESULT + CALL GTREC ;POINT TO RECORD NUMBER + INR M ;UPDATE SEQUENTIAL + JNZ POPART ; RECORD NUMBER + INX H + INR M + +POPART: POP PSW ;RESTORE ERROR + RET + + PAGE +;------------------------------------------------------ +; +; CALL OPEN(UNIT #,FILENAME,DRIVE #) +; + ENTRY OPEN + EXT $IOINIT + +OPEN: LDA $LUNTB ;GET MAX LUN + DCR A + CMP M ;OUT OF RANGE? + JC LUNOVF ;YES, LUN TOO LARGE. + + MOV A,M ;FETCH LUN + STA $UN ;SET IT UP + PUSH D ;SAVE REGISTERS + PUSH B ;SAVE FILPTR + CALL $IOINIT ;INITIALIZE IF NOT ALREADY DONE + CALL GTMODE + ORA A ;ALLOCATED? + CP ALCBUF ;NO, ALLOCATE + POP B + CALL GTFCB + XCHG + POP D ;[DE]=NAME PTR + LDAX B ;GET DRIVE # + MOV M,A ;STORE DRIVE # + MVI B,11 ;COPY FILE NAME TO FCB +FILLOP: LDAX D + ORA A ;ZERO BYTE? + JZ FILLEN ;YES, LEAVE REST AS BEFORE + INX D + INX H + MOV M,A + DCR B ;FINISHED MOVING NAME? + JNZ FILLOP ;NO, DO REST +FILLEN: LDA $UN ;GET UNIT # + ADD A ;*2 FOR TABLE INDEX + MVI D,0 + MOV E,A + LXI H,$LUNTB ;INDEX INTO LUN TABLE + DAD D + LXI B,DSKDRV ;REPLACE CURRENT LUNTB ENTRY + MOV M,B ; WITH ADDRESS OF DISK DRIVER + DCX H ; DISPATCH ADDRESS + MOV M,C + RET + + END + \ No newline at end of file diff --git a/Source/Images/d_fortran/u0/DTBF.MAC b/Source/Images/d_fortran/u0/DTBF.MAC new file mode 100644 index 00000000..d78a6ba2 --- /dev/null +++ b/Source/Images/d_fortran/u0/DTBF.MAC @@ -0,0 +1,56 @@ +TITLE DTBF Runtime data buffer +; +TRSDOS EQU 0 +OASIS EQU 0 +; +IF2 +IFT TRSDOS +.PRINTX/TRSDOS VERSION/ +ENDIF +IFT OASIS +.PRINTX/OASIS VERSION/ +ENDIF +ENDIF +; +ENTRY $DTBF,$DTBF1,$DTBF3,$DTBF5,$DTBF7,$DTBF8,$DTBFA +; +DSEG +; +$DTBF: DS 1 ;DATA BUFFER +$DTBF1: DS 2 +$DTBF3: DS 2 +$DTBF5: DS 2 +$DTBF7: DS 1 +$DTBF8: DS 8 +$DTBFA: DS 145-16 +IFT TRSDOS + DS 115 ;TRSDOS USES UP TO 256 BYTE BUFFERS +ENDIF +IFT OASIS + DS 375 ;OASIS USES UP TO 512 BYTE BUFFERS +ENDIF +; +CSEG +ENTRY $FORLN,$UFMLN +; +$FORLN: +IFT TRSDOS + DW 256 +ENDIF +IFT OASIS + DW 512 +ENDIF +IFF TRSDOS OR OASIS + DW 132 +ENDIF +; +$UFMLN: +IFT TRSDOS + DW 256 +ENDIF +IFF TRSDOS + DW 128 +ENDIF +; + END + \ No newline at end of file diff --git a/Source/Images/d_fortran/u0/F80.COM b/Source/Images/d_fortran/u0/F80.COM new file mode 100644 index 00000000..bd533f21 Binary files /dev/null and b/Source/Images/d_fortran/u0/F80.COM differ diff --git a/Source/Images/d_fortran/u0/FCHAIN.MAC b/Source/Images/d_fortran/u0/FCHAIN.MAC new file mode 100644 index 00000000..42fdc744 --- /dev/null +++ b/Source/Images/d_fortran/u0/FCHAIN.MAC @@ -0,0 +1,460 @@ + SUBTTL Global Equates,Temps,Defs + TITLE FCHAIN - Fortran CALL FCHAIN Statement + + ENTRY FCHAIN + EXTRN $CLSFL,$INIT,$IOERR + +CPM SET 0 ; True for CP/M +CPM42 SET 1 ; True for CP/M's at X'4200' +ISIS SET 0 ; True for ISIS-II +MOD1 SET 0 ; True for TRS-80 Mod-1 +MOD2 SET 0 ; True for TRS-80 Mod-2 +TEK SET 0 ; True for Tektronics + +CR SET 13 +LF SET 10 + +NAMLEN SET 11 ; Default Filename Length **3.36 + +IF MOD1 +NAMLEN SET 23 + ENDIF +IF MOD2 +NAMLEN SET 30 + ENDIF + + +IF CPM42 +CPM SET 1 + ENDIF +IF CPM +CPMWRM SET 0 ; CP/M Base ( & Warm Boot Addr) + ENDIF +IF CPM42 +CPMWRM SET 4200H + ENDIF +; ---- +IF CPM +C.EMSG SET 9 +C.OPEN SET 15 +C.READ SET 20 +C.BUFF SET 26 +CPMENT SET CPMWRM+5 ; CP/M Entry (BDOS Funct call addr) +TFCB SET CPMWRM+5CH +TBUFF SET CPMWRM+80H +TPA SET CPMWRM+100H + +;**3.36 DFTEXT: DB 'COM' + + ENDIF +; ================ +IF ISIS +CISIS SET 40H ;ISIS Entry Point +I.LOAD SET 6 ;Load Pgrm Function + ENDIF +; ================ +IF MOD1 +M.ABRT SET 4430H ;Error return to system +M.GET SET 13H ;Input a byte from an I/O device +M.OPEN SET 4424H ;Open an existing file +M.EXIT SET 402DH ;Normal return to system + ENDIF +; ================ +IF TEK +SRB SET 3 +T.CHAN SET SRB+1 ; Channel No. +T.LEN SET SRB+5 ; Filename Len +T.BPTR SET SRB+6 ; Address of Buffer +T.FNAM SET SRB+8 ; Filename Buffer + ENDIF +; ================ +IF2 + .PRINTX/Fortran CHAIN/ + IF CPM + .PRINTX/ For CPM/ + ENDIF + IF CPM42 + .PRINTX/ ..at 4200H/ + ENDIF + IF ISIS + .PRINTX/ For ISIS-II/ + ENDIF + IF MOD1 + .PRINTX/ For TRS80 Mod-1/ + ENDIF + IF MOD2 + .PRINTX/ For TRS80 Mod-2/ + ENDIF + IF TEK + .PRINTX/ For Tektronics/ + ENDIF +ENDIF + + PAGE + SUBTTL FCHAIN - Process a CALL FCHAIN statement + +; FCHAIN processes a CALL FCHAIN statement by the following steps: +; +; 1. Parse filename to see if valid +; +; 2. Open file in default OS File Control Block +; +; 3. Move a short program loader to top of memory +; and load new program +; +; SYNTAX: CALL FCHAIN (' ') + +; ENTRY [HL] = FWA SDESC for Filename +; EXIT Start executing new program +; USES ALL + +FCHAIN: +IF CPM + LDAX D ;Get Drive no. + STA TFCB ;Put in TFCB + ENDIF + SHLD .NFWA ; Save FWA of Name + LXI H,CHN01 + PUSH H + LHLD $CLSFL + PCHL ; Close all Files +CHN01: + LXI B,CHN02 ; Addr to RET to.. + JMP $INIT ; Reset SP to top of ram +CHN02: +IF CPM + CALL .SNAM ; Go scan filename + LXI D,TBUFF ;Set DMA buffer + MVI C,C.BUFF + CALL CPMENT + LXI D,TFCB ;Open file + MVI C,C.OPEN + CALL CPMENT + INR A + JZ $IOERR ; **IO** Error - File not found + LXI H,0 + DAD SP + DCR H + MVI L,0 ;Get 1 page below user stack + LXI D,LOADER ;Move program loader to high memory + MVI B,ENDIPL-IPL + CALL $$MOV + MOV L,B ;[HL] = addr of loader + PUSH H ;For 'RET' to loader + LXI D,LOCTAB ;[DE] = addr of ADDRESS MODIFY TABLE +CHN03: LDAX D ;Get low byte address + ORA A ;Are we done? + JZ CHN04 ; Yes + MOV L,A ;[HL] = address to modify + MOV M,H ;Modify it with [H] + INX D + JMP CHN03 ;Keep looping +CHN04: LXI H,TPA ;[HL] = TPA address + RET ;'RET' to loader +ENDIF +; ================ +IF ISIS + LHLD .NFWA + XCHG ;[DE] = Strt of Name + LXI H,I.FNAM + MVI B,15 + CALL $$MOV ;Move Filename to FCB + MVI C,I.LOAD ;Load Function + LXI D,I.FCB + CALL CISIS ;Load next Pgm & Go + JMP $IOERR ; (Just in case) + ENDIF +; ================ +IF MOD1 + LXI H,0 ;Get stack address + DAD SP + MVI L,0 ;Get below user stack + DCR H + DCR H ;Blocking buffer address + DCR H ;Loader start address + PUSH H ;Save loader start address + MVI B,32 ;Blank fill 32 byte DCB +SPLOOP: DCX H + MVI M,' ' + DCR B + JNZ SPLOOP + POP B ;Loader start address + PUSH H ;Save DCB addr + LHLD .NFWA + XCHG ;[DE] = Strt of Filename + POP H + PUSH H ;[HL] = DCB addr + PUSH B ;Save loader start address + CALL .SNAM ;Scan Filename into DCB + MVI B,0 ;LRL = 256 + POP H ;Loader start address + POP D ;DCB (Filespec) address + PUSH D ;Save DCB address + PUSH H ;Save loader start address + INR H ;Blocking buffer address + CALL M.OPEN ;Open an existing file + JNZ $IOERR ;**IO** Err - Fnf. + + DCR H ;Top loader start address + LXI D,LOADER ;Loader start address + MVI B,ENDIPL-IPL ;Size of loader program + CALL $$MOV ;Move to top of memory + + POP H ;Loader start address + POP D ;DCB address + PCHL ;Run loader +ENDIF +; ================ +IF MOD2 + LHLD .NFWA ;[HL] points to name + PUSH H ;Save SOS + LXI B,NAMLEN ;[B]=0, [C]=Max Name Len +CHN03: + MOV A,M + CPI ' '+1 + JC CHN04 ;Brif EOS + INX H + INR B ;String Len+1 + DCR C ;Max len-1 + JNZ CHN03 + JMP $IOERR ;**IO** Error, Name too long +CHN04: + MVI M,CR ;Proper TRSDOS Terminator + POP H ;Get SOS + MVI A,37 ;Exeq TRSDOS cmnd, no ret + RST 1 ;Do it, [HL]=string, [B]=string len + JMP $IOERR ; (Who trusts Trash-DOS) +ENDIF +; ================ +IF TEK + LHLD .NFWA + XCHG ; [DE]=Filename STR + LXI H,T.FNAM ; [HL]=Filename Buffer + LXI B,NAMLEN ; [B]=0, [C]=Max Name Len +CHN03: + LDAX D + CPI ' '+1 + JC CHN04 ; Brif End-of-Name + MOV M,A + INX D + INX H + INR B ; Len+1 + DCR C ; Max-1 + JZ $IOERR ; **IO** Error if name too long.. + JMP CHN03 +CHN04: + MVI M,CR ; Store Terminator + MOV A,B + INR A ; Include CR in Len Cnt + STA T.LEN ; Store Filename Len in SRB + MVI A,18H ; Load Overlay & Execute + STA SRB + MVI A,4 + STA T.CHAN ; Store Chan 4 (Doc is unclear) + LXI D,T.FNAM + LXI H,T.BPTR + MOV M,D + INX H ; Store Fname Pntr in SRB + MOV M,E + MVI A,0FFH + OUT 0F7H ; Load Overlay & Execute + JMP $IOERR ; Should never happen +ENDIF +; ================ + + PAGE + SUBTTL Scan for valid Filename + +.SNAM: +IF CPM + LHLD .NFWA ; FWA of Filename + XCHG ; [DE] = name FWA + LXI H,TFCB+1 ; [HL] = FILE CTRL BLOCK + MVI B,NAMLEN +.COMMENT & **3.36 +.SNAM1: + LDAX D ; GET NAME CHAR + INX D + STA .NFWA ; Set '.' if user supplied Ext. + CPI '.' + JZ .SNAM3 ; Brif saw Ext + CPI ' '+1 + JC .SNAM3 ; Brif End-of-Name + MOV M,A ; PUT IN FCB + INX H + DCR B ; UNTIL STRING EXHAUSTED + JNZ .SNAM1 +.SNAM2: + LDAX D + INX D + STA .NFWA + CPI '.' ; Looking for Ext.. + JZ .SNAM4 + CPI ' '+1 ; or end of name + JNC .SNAM2 + JMP .SNAM4 ; Go copy user or default ext +.SNAM3: + MVI M,' ' + INX H + DCR B + JNZ .SNAM3 +.SNAM4: + MVI B,3 ; Scan Extention + LDA .NFWA + CPI '.' + JZ .SNAM5 ; Brif user supplied ext + LXI D,DFTEXT ; ..Else use default +**3.36 & +.SNAM5: + LDAX D + INX D + MOV M,A + INX H + DCR B + JNZ .SNAM5 +; ---------------- + MOV M,B ; Clear File EX + MOV A,B + STA TFCB+32 ; NR = 0 + RET +ENDIF +; ================ +IF MOD1 + MVI B,NAMLEN +.SNAM0: + LDAX D + CPI ' '+1 + JC .SNAM1 ;Brif EOS + MOV M,A + INX D + INX H + DCR B + JNZ .SNAM0 + JMP $IOERR ;**IO** Error if name too long +.SNAM1: + MVI M,CR ;Terminate with CR + RET +ENDIF + + PAGE + SUBTTL Relocated loader for CP/M & MOD1 + +IF CPM +LOCTAB: + DB (X0+2) AND 0FFH + DB (X1+1) AND 0FFH + DB (X2+2) AND 0FFH + DB (X3+2) AND 0FFH + DB 0 + +; ================ +LOADER: + .PHASE 0 +IPL: LXI D,TPA ;Program start address + PUSH D ;Save as return address +IPL1: XCHG ;[DE] = Next load address + PUSH D ;Save load address + MVI C,C.BUFF ;Set DMA address + CALL CPMENT + LXI D,TFCB ;Read record + MVI C,C.READ + CALL CPMENT + POP D ;Restore base address of record + ORA A +X0: JNZ IPLDON ;EOF + LXI H,128 ;[HL] = Record size + DAD D ;[HL] = Start of next record +X1: MVI A,IPL/256 ;Get hi byte of IPL address + CMP H ;Are we there? +X2: JNZ IPL1 ;No - continue loading program +X3: LXI D,OVFMSG ;Print '* OUT OF MEMORY*' + MVI C,C.EMSG + CALL CPMENT + JMP CPMWRM ;Reset and die +IPLDON: + XRA A + STA TBUFF ; 0 = No cmnd line passed + MVI A,' ' + STA TFCB+1 ; Clear TFCB for Utilities + LXI B,CPMWRM ; Push Warm Boot addr for + PUSH B ; Utilities that just return... + JMP TPA ;CLOSE FILE AND START PROG +OVFMSG: + DB CR,LF,'* Out of Memory *',CR,LF,'$' +ENDIPL: + .DEPHASE +ENDIF +; ================ +IF MOD1 +LOADER: +IPL: CALL M.GET ;Read character + JNZ M.ABRT ;In case of error + CPI 2 ;Is it EOF ? + .Z80 + JR Z,(IPL1) ;Get start address + .8080 + CPI 1 ;Is it data ? + JNZ M.ABRT ;Not data then error + CALL M.GET ;Length + 2 + DCR A + DCR A + MOV B,A ;Length + CALL M.GET ;Load address + JNZ M.ABRT ;In case of error + MOV L,A + CALL M.GET + JNZ M.ABRT ;In case of error + MOV H,A + +IPL0: CALL M.GET ;Get data + MOV M,A ;Put data in load address + INX H ;Increment load address + DCR B ;# of bytes left to load + .Z80 + JR NZ,(IPL0) + JR Z,(IPL) + .8080 + +IPL1: CALL M.GET ;Get second 2 (EOF) + CPI 2 + JNZ M.ABRT ;In case of error + CALL M.GET ;Get start address + JNZ M.ABRT ;In case of error + MOV L,A + CALL M.GET + JNZ M.ABRT ;In case of error + MOV H,A + PCHL ;Run program +ENDIPL: + +ENDIF +; ================ +IF CPM OR ISIS OR MOD1 +$$MOV: + LDAX D + MOV M,A + INX D + INX H + DCR B + JNZ $$MOV + RET +ENDIF + + DSEG + +.NFWA: DS 2 ; Temp for FWA of Filename + +IF ISIS +I.FCB: DW I.FNAM ;Pntr to Filename + DW 0 ;Bias field + DW 1 ;RETSW, Xfer control to new pgm + DW I.NTRY ;Pntr to Entry addr store + DW I.STAT ;Status +; -- +I.FNAM: DS 15 ;Filename +I.NTRY: DS 2 ;Entry Point Address +I.STAT: DS 2 ;Ret Status + ENDIF + + END + \ No newline at end of file diff --git a/Source/ZZRC/zzrc_ptbl.bin b/Source/Images/d_fortran/u0/FORLIB.LIB similarity index 50% rename from Source/ZZRC/zzrc_ptbl.bin rename to Source/Images/d_fortran/u0/FORLIB.LIB index 5e3a2a4d..00bc0474 100644 Binary files a/Source/ZZRC/zzrc_ptbl.bin and b/Source/Images/d_fortran/u0/FORLIB.LIB differ diff --git a/Source/Images/d_fortran/u0/FORLIB.REL b/Source/Images/d_fortran/u0/FORLIB.REL new file mode 100644 index 00000000..1c213748 Binary files /dev/null and b/Source/Images/d_fortran/u0/FORLIB.REL differ diff --git a/Source/Images/d_fortran/u0/INIT.MAC b/Source/Images/d_fortran/u0/INIT.MAC new file mode 100644 index 00000000..603e9a66 --- /dev/null +++ b/Source/Images/d_fortran/u0/INIT.MAC @@ -0,0 +1,51 @@ + TITLE INIT - FORTRAN-80 RUNTIME INITIALIZATION + + .8080 + + ENTRY $INIT,$EC,$IOFLG,$CPMVN,$CPMWF,$CPMRF + EXTRN $CLSFL + +GTVRSF EQU 12 ;GET CP/M VERSION FUNCTION +.READS EQU 20 ;READ SEQUENTIAL FUNCTION (1.X) +.WRITS EQU 21 ;WRITE SEQUENTIAL FUNCTION (1.X) +.READR EQU 33 ;READ RANDOM FUNCTION (2.X) +.WRITR EQU 34 ;WRITE RANDOM FUNCTION (2.X) + + DSEG + +$CPMVN: DS 1 ;0FFH if CP/M 1.X, 00 if 2.X +$CPMRF: DS 1 ;CP/M Read function held here +$CPMWF: DS 1 ;CP/M WRITE FUNCTION HELD HERE +$EC: DS 1 ;ERROR COUNT - MAX 20 NON-FATAL ERRS +$IOFLG: DS 1 ;FLAG WHETHER I/O INIT HAS BEEN DONE + + CSEG + +CPMENT SET 5 + +$INIT: XRA A + STA $EC ;INITIALIZE ERROR COUNT TO 0 + STA $IOFLG ;INITIALIZE I/O FLAG + LXI H,RETINS ;INITIALIZE $CLSFL TO POINT TO "RET" + SHLD $CLSFL + + LHLD CPMENT+1 ;INITIALIZE STACK TO TOP OF MEMORY-1 + DCX H + SPHL + + PUSH B ;PUT RETURN ADDRESS ON STACK + MVI C,GTVRSF + CALL CPMENT ;GET CP/M VERSION NUMBER + SUI 20H-1 ;SET $CPMVN SUCH THAT + SBB A ;2.X = 00 AND + STA $CPMVN ;1.X = 0FFH.. + + LXI H,(.WRITS SHL 8)+.READS + JNZ SETVF ;1.X USES SEQUENTIAL I/O CALLS + LXI H,(.WRITR SHL 8)+.READR +SETVF: SHLD $CPMRF ;2.X USES RANDOM I/O CALLS + +RETINS: RET + + END + \ No newline at end of file diff --git a/Source/Images/d_fortran/u0/IOINIT.MAC b/Source/Images/d_fortran/u0/IOINIT.MAC new file mode 100644 index 00000000..1be96ff4 --- /dev/null +++ b/Source/Images/d_fortran/u0/IOINIT.MAC @@ -0,0 +1,41 @@ + TITLE IOINIT - FORTRAN-80 I/O FLAG & VARIABLE INIT + + .8080 + + ENTRY $IOINI + EXT $IOFLG,$LNPTR,$CPMBF,$LUNTB + EXT $FLFLG,$DSKER,$OPNFL + +$IOINI: LDA $IOFLG ;SEE IF WE'VE ALREADY BEEN CALLED + ORA A + RNZ + INR A ;SET NON-ZERO + STA $IOFLG + + LXI H,$CPMBF + MVI M,132+1 ;MAX CHRS TO READ FOR BDOS CALL + INX H + MVI M,0 ;ZERO NO. OF CHARS READ + INX H + SHLD $LNPTR ;PTR TO BEGINNING OF LINE + + MVI M,10 ;STORE LINE FEED AT BEG. OF LINE + + LDA $LUNTB ;GET NO. OF LUN'S + DCR A + MOV B,A ;SAVE LOOP COUNT + LXI H,$FLFLG ;INITIALIZE FLAGS FOR DSKDRV + XRA A + +FLGLOP: MOV M,A ;ZERO $FLFLG BYTE + INX H ;INCREMENT PTR + DCR B ;DECREMENT COUNT + JNZ FLGLOP ;NEXT + STA $DSKER + + XRA A + STA $OPNFL ;CLEAR $OPNFL FOR LPTDRV + RET + + END + \ No newline at end of file diff --git a/Source/Images/d_fortran/u0/L80.COM b/Source/Images/d_fortran/u0/L80.COM new file mode 100644 index 00000000..264e3b54 Binary files /dev/null and b/Source/Images/d_fortran/u0/L80.COM differ diff --git a/Source/Images/d_fortran/u0/LIB.COM b/Source/Images/d_fortran/u0/LIB.COM new file mode 100644 index 00000000..81b1d224 Binary files /dev/null and b/Source/Images/d_fortran/u0/LIB.COM differ diff --git a/Source/Images/d_fortran/u0/LPTDRV.MAC b/Source/Images/d_fortran/u0/LPTDRV.MAC new file mode 100644 index 00000000..fc91bba1 --- /dev/null +++ b/Source/Images/d_fortran/u0/LPTDRV.MAC @@ -0,0 +1,112 @@ + TITLE LPTDRV - FORTRAN LINE PRINTER DRIVER + + .8080 + + ENTRY LPTDRV,$OPNFL + EXTRN $IOERR,$BF,$BL,$CLSFL + + DSEG + +$OPNFL: DB 0 +CLSADR: DS 2 + + CSEG + +LPTDRV: DW $IOERR + DW LPTFWR + DW $IOERR + DW LPTBWR + DW $IOERR + DW $IOERR + DW LPTCLS + +LPTCLS: LDA $OPNFL ;MAKE SURE ALREADY 'OPEN' + ORA A + JZ $IOERR + XRA A ;'CLOSE' BY SENDING + STA $OPNFL ; FORM FEED +OUTFF: MVI A,12 + JMP LPTOUT + +CLSLPT: LDA $OPNFL + ORA A + LHLD CLSADR + PUSH H + RZ + CALL OUTCR ;CR +OUTLF: MVI A,10 ;LF + JMP LPTOUT + +MAKOPN: LXI H,$OPNFL + MOV A,M + ORA A + RZ + INR M +SETCLS: LHLD $CLSFL + LXI D,CLSLPT + MOV A,L + SUB E + MOV A,H + SBB D + RZ +STORAD: SHLD CLSADR + XCHG + SHLD $CLSFL + RET + +LPTFWR: CALL MAKOPN + LDA $BL + ORA A + RZ ;NUTHIN HERE + + LHLD $BF + DCR A + MOV E,A ;INTO [E] FOR LPTLOP + MOV A,M + CPI '*' ;DO NOTHING? + JZ LPTNLF + CALL OUTCR ;OUTPUT CR + MOV A,M + CPI "+" + JZ LPTNLF + CPI "1" + JNZ LPTLF + CALL OUTFF ;FORM FEED + JMP LPTNLF + +LPTLF: CALL OUTLF + MOV A,M + CPI "0" + CZ OUTLF + +LPTNLF: INX H + MVI D,0 + +LPTLOP: MOV A,E + ORA D + RZ + MOV A,M + CALL LPTOUT + INX H + DCX D + JMP LPTLOP + +LPTBWR: CALL MAKOPN + LHLD $BL + XCHG + LHLD $BF + JMP LPTLOP + +OUTCR: MVI A,13 + +LPTOUT: PUSH H + PUSH D + MVI C,5 ;CP/M LPT OUT FUNCTION + MOV E,A + CALL 0005 + POP D + POP H + RET + + END + \ No newline at end of file diff --git a/Source/Images/d_fortran/u0/LUNTB.MAC b/Source/Images/d_fortran/u0/LUNTB.MAC new file mode 100644 index 00000000..d093e21c --- /dev/null +++ b/Source/Images/d_fortran/u0/LUNTB.MAC @@ -0,0 +1,23 @@ + TITLE LUNTB - APPLE CPM LUN TABLE + +; TTY I/O DRIVER + .8080 + + EXTRN TTYDRV,PUNRDR,LPTDRV,DSKDRV + + ENTRY $LUNTB + +$LUNTB: DB 11 ;TEN LUN'S + + DW TTYDRV ;1= TTY + DW LPTDRV ;2= PRINTER + DW TTYDRV ;3= TTY + DW PUNRDR ;4= PUNCH,READER + DW TTYDRV ;5= TTY + DW DSKDRV ;6= FORT06.DAT + DW DSKDRV ;7= FORT07.DAT + DW DSKDRV ;AND SO ON. + DW DSKDRV + DW DSKDRV + END + \ No newline at end of file diff --git a/Source/Images/d_fortran/u0/M80.COM b/Source/Images/d_fortran/u0/M80.COM new file mode 100644 index 00000000..d5460657 Binary files /dev/null and b/Source/Images/d_fortran/u0/M80.COM differ diff --git a/Source/Images/d_fortran/u0/TTYDRV.MAC b/Source/Images/d_fortran/u0/TTYDRV.MAC new file mode 100644 index 00000000..ee51211e --- /dev/null +++ b/Source/Images/d_fortran/u0/TTYDRV.MAC @@ -0,0 +1,235 @@ + TITLE TTYDRV - FORTRAN-80 TTY I/O DRIVER + + .8080 + + EXTRN $IOERR,$BL,$BF,$ERR,$TTYIN,$TTYOT + +; TTY: & PUN:/RDR: DRIVER ENTRIES: + + ENTRY TTYDRV,PUNRDR + +; FORTRAN-80 UTILITY SUBROUTINES: + + ENTRY PUNCH,READER,GOTOXY,SCREEN + ENTRY HOME,INKEY,CONOUT + + DSEG + +DEVFLG: DB 0 + + CSEG + +PUNRDR: DW PUNFR ;FORMATTED READ + DW PUNFW ;FORMATTED WRITE + DW $IOERR ;UNFORMATTED READ + DW PUNUWR ;UNFORMATTED WRITE + DW NULL ;REWIND + DW NULL ;BACKSPACE + DW NULL ;ENDFILE + +TTYDRV: DW TTYFR ;SAME AS ABOVE + DW TTYFW + DW $IOERR + DW TTYUWR + DW NULL + DW NULL + DW NULL + +TTYFR: XRA A ;TTY = 0 + DB 1 ;SKIP 2 BYTES WITH 'LXI B,' + +PUNFR: MVI A,1 ;READER = 1 + STA DEVFLG ;DEVICE FLAG + + XRA A + MOV E,A ;ZERO LO BYTE OF $BL + STA $BL+1 ;ZERO HI BYTE + + LHLD $BF ;GET BUFFER ADDR + +DRV31: CALL INCHR ;GET A CHARACTER +DRV39: CPI 10 ;INGNORE LINE FEEDS + JZ DRV31 + + MOV M,A + + INX H + INR E + + CPI 13 ;TEST FOR END OF LINE + MOV A,E + STA $BL + RZ + + CPI 132 ;MAX 132 CHARS + JC DRV31 + + CALL $ERR ;GIVE 'INPUT RECORD TOO LONG' WARNING + DB 18 + +NULL: XRA A ;CLEAR CARRY AND ZERO FLAGS + RET + +TTYFW: XRA A ;TTY = 0 + DB 1 ;SKIP 2 WITH 'LXI B,' + +PUNFW: MVI A,1 ;PUNCH = 1 + STA DEVFLG + + LDA $BL ;GET BUFFER LENGTH + ORA A + RZ ;EMPTY BUFFER - JUST RETURN + + LHLD $BF ;BUFFER ADDRESS + DCR A + MOV E,A ;SAVE LENGTH IN [E] + + MOV A,M ;GET CARRIAGE CONTROL CHAR + CPI '*' ;DO NOTHING? + JZ TTYNOT + + CALL OUTCR ;PRINT A CARRIAGE RETURN + MOV A,M ;REGET FIRST CHAR + CPI '+' ;A '+' MEANS CR BUT NO LF + JZ TTYNOT + + CPI '1' ;A '1' MEANS CLEAR SCREEN/FORM FEED + JNZ TTYLFO + CALL HOM1 ;GO CLEAR SCREEN OR SEND FF CHAR + JMP TTYNOT + +TTYLFO: CALL OUTLF ;PRINT A LINE FEED MOV A,M ;GET CARR CONTROL CHAR BACK + CPI '0' ;'0' MEANS DOUBLE SPACING + CZ OUTLF ;ANYTHING ELSE IS JUST SINGLE SPACING + +TTYNOT: INX H ;INCREMENT BUFFER POINTER + MVI D,0 ;HI BYTE OF COUNT = 0 + +TTYLOP: MOV A,E ;DONE SENDING CHARACTERS? + ORA D + RZ ;YES, RETURN + MOV C,M ;GET CHARACTER INTO [C] + CALL OUTCH ;SEND THE CHAR + INX H ;INC BUFFER PTR + DCX D ;DEC CHARACTER COUNT + JMP TTYLOP + +TTYUWR: XRA A + + DB 1 ;SKIP 2 WITH 'LXI B,' + +PUNUWR: MVI A,1 + STA DEVFLG + LHLD $BL ;GET NO. OF CHARS TO SEND + XCHG ;INTO [DE] + LHLD $BF ;GET BUFFER POINTER INTO [HL] + JMP TTYLOP ;AND GO SEND THEM + +OUTLF: MVI C,10 ;OUTPUT A LINE FEED + JMP OUTCH + +OUTCR: MVI C,13 ;OUTPUT A CARRIAGE RETURN + +OUTCH: LDA DEVFLG ;PRINT CHARACTER TO EITHER + ORA A ;TTY: OR PUN: DEVICE + MOV A,C + JNZ $PUNOT + JMP $TTYOT + +PUNCH: MOV A,M ;FORTRAN PUNCH SUBROUTINE + +$PUNOT: PUSH B + PUSH D + MVI C,4 ;CP/M PUNCH DEVICE OUTPUT + MOV E,A +GOCPM: PUSH H + CALL 5 + POP H + POP D + POP B + RET + +CONOUT: MOV A,M ;FORTRAN CONOUT SUBROUTINE + JMP $TTYOT + +READER: ;FORTRAN READER FUNCTION + +$RDRIN: PUSH B + PUSH D + MVI C,3 + JMP GOCPM + +INCHR: LDA DEVFLG ;GET CHAR FROM EITHER + ORA A ;TTY OR READER DEVICE + JNZ $RDRIN + JMP $TTYIN + +HOM1: LDA DEVFLG ;CLEAR SCREEN IF TTY, + ORA A ;SEND FF CHAR IF PUNCH + JZ HOME + MVI A,12 ;FF CHAR + JMP $PUNOT + +HOME: MVI A,1 ;CLEAR CONSOLE SCREEN + JMP DOFUN + +SCREEN: MOV A,M ;GET FUNCTION # + +DOFUN: PUSH H + LXI H,0F397H ;SSFTAB + ADD L ;POINT TO DESIRED FUN CHAR + MOV L,A + MOV A,M ;GET IT INTO A + ORA A ;REQUIRE LEAD-IN? + JP NOLDIN + PUSH PSW + LDA 0F397H ;YES, SO SEND IT FIRST + CALL $TTYOT + POP PSW +NOLDIN: CALL $TTYOT + POP H + RET + +GOTOXY: MVI A,7 ;DO CURSOR POSITION FUNCTION + CALL DOFUN + + LDAX D ;GET COORDS + MOV H,M ;H=X, L=Y + MOV L,A + + DCR L ;MAP 1..24,1..80 TO 0..23,0..79 + DCR H + + LDA 0F396H ;XY COORD OFFSET + ORA A + JP NORVS + + MOV E,L ;SWAP + MOV L,H + MOV H,E + +NORVS: MOV E,A ;SAVE IN [E] + ADD H ;ADD OFFSET + PUSH PSW ;SAVE CHAR + MOV A,E + ADD L ;OUTPUT FIRST COORD + CALL $TTYOT + POP PSW + MOV E,A ;OUTPUT SECOND COORD + JMP $TTYOT + +INKEY: MOV A,M ;GET PARAMETER + ORA A ;SEE WHAT IT IS + JZ INK1 ;ZERO - JUST TEST STATUS + +INKLP: CALL INK1 ;READ CONSOLE STATUS + ORA A + JZ INKLP ;WAIT UNTIL KEYPRESS + RET + +INK1: MVI C,6 ;CONSOLE STATUS CALL + MVI E,255 + JMP 5 ;GO TO BDOS + + END + \ No newline at end of file diff --git a/Source/Images/d_games/Readme.txt b/Source/Images/d_games/Readme.txt new file mode 100644 index 00000000..1a7de748 --- /dev/null +++ b/Source/Images/d_games/Readme.txt @@ -0,0 +1,14 @@ +===== Games Disk for CP/M ===== + +This disk contains several games for CP/M including the Infocom games +Zork 1 through 3, Planetfall and Hitchhiker's Guide to the Galaxy. + +Nemesis and Dungeon Master is a Rogue-like game released in 1981. It is playable +on a text terminal using ASCII graphics to represent the dungeon. Only a few +thousand copies of the game were ever made, making it very rare. See +http://crpgaddict.blogspot.com/2019/03/game-322-nemesis-1981.html + +Colossal Cave Adventure is a CP/M port of the 1976 classic game originally +written by Will Crowther for the PDP-10 mainframe. See +https://en.wikipedia.org/wiki/Colossal_Cave_Adventure and +https://if50.substack.com/p/1976-adventure diff --git a/Source/Images/d_games/u0/ADVI.DAT b/Source/Images/d_games/u0/ADVI.DAT new file mode 100644 index 00000000..d6a566c3 Binary files /dev/null and b/Source/Images/d_games/u0/ADVI.DAT differ diff --git a/Source/Images/d_games/u0/ADVI.PTR b/Source/Images/d_games/u0/ADVI.PTR new file mode 100644 index 00000000..0737934a Binary files /dev/null and b/Source/Images/d_games/u0/ADVI.PTR differ diff --git a/Source/Images/d_games/u0/ADVT.DAT b/Source/Images/d_games/u0/ADVT.DAT new file mode 100644 index 00000000..9874b4fb Binary files /dev/null and b/Source/Images/d_games/u0/ADVT.DAT differ diff --git a/Source/Images/d_games/u0/ADVT.PTR b/Source/Images/d_games/u0/ADVT.PTR new file mode 100644 index 00000000..45d5060c Binary files /dev/null and b/Source/Images/d_games/u0/ADVT.PTR differ diff --git a/Source/Images/d_games/u0/CASTLE.COM b/Source/Images/d_games/u0/CASTLE.COM new file mode 100644 index 00000000..675c29b4 Binary files /dev/null and b/Source/Images/d_games/u0/CASTLE.COM differ diff --git a/Source/Images/d_games/u0/COL-CAVE.COM b/Source/Images/d_games/u0/COL-CAVE.COM new file mode 100644 index 00000000..cf586608 Binary files /dev/null and b/Source/Images/d_games/u0/COL-CAVE.COM differ diff --git a/Source/Images/d_games/u0/DM.COM b/Source/Images/d_games/u0/DM.COM new file mode 100644 index 00000000..54b0b579 Binary files /dev/null and b/Source/Images/d_games/u0/DM.COM differ diff --git a/Source/Images/d_games/u0/DUNGEON.COM b/Source/Images/d_games/u0/DUNGEON.COM new file mode 100644 index 00000000..2cf64dd4 Binary files /dev/null and b/Source/Images/d_games/u0/DUNGEON.COM differ diff --git a/Source/Images/d_games/u0/HITCH.COM b/Source/Images/d_games/u0/HITCH.COM new file mode 100644 index 00000000..4822bc2f Binary files /dev/null and b/Source/Images/d_games/u0/HITCH.COM differ diff --git a/Source/Images/d_games/u0/HITCHHIK.DAT b/Source/Images/d_games/u0/HITCHHIK.DAT new file mode 100644 index 00000000..3a3e338e Binary files /dev/null and b/Source/Images/d_games/u0/HITCHHIK.DAT differ diff --git a/Source/Images/d_games/u0/HUNT.COM b/Source/Images/d_games/u0/HUNT.COM new file mode 100644 index 00000000..cfe44e16 Binary files /dev/null and b/Source/Images/d_games/u0/HUNT.COM differ diff --git a/Source/Images/d_games/u0/MONOPLY.BAS b/Source/Images/d_games/u0/MONOPLY.BAS new file mode 100644 index 00000000..7f4dedd5 --- /dev/null +++ b/Source/Images/d_games/u0/MONOPLY.BAS @@ -0,0 +1,1051 @@ +10 DIM P$(41),S(41),R(41),V(41),J(41),M(41),K(21),L(41),C(41),B(41),O(41) +20 PRINT "HOW MANY PLAYERS"; +30 PRINT "(TYPE '0' FOR INSTRUCTIONS)"; +40 INPUT N +50 IF N>0 THEN 80 +60 GOSUB 8580 +70 GOTO 20 +80 IF N<11 THEN 110 +90 PRINT" NO MORE THAN 10 CAN PLAY" +100 GOTO 20 +110 FOR Q5 = 1 TO N +120 PRINT "NAME"; +130 REM THIS PART STARTED FROM 151-2 +140 REM A(B)=0 FOR HUMAN, 1 FOR COMPUTER +150 GOTO 210 +160 LET N$(Q5)="COMPUTER" +170 A(Q5)=1 +180 W7=W7+1 +190 REM W7 IS # OF COMPUTER PLAYERS +200 GOTO 360 +210 INPUT N$(Q5) +220 IF N$(Q5)="COMPUTER" THEN 160 +230 IF N$(Q5)="YOU" THEN 160 +240 IF N$(Q5)<>"WHAT" THEN 260 +250 GOTO 330 +260 Z7=1 +270 FOR O1=1 TO Q5-1 +280 IF M$(O1)<>N$(Q5) THEN 310 +290 PRINT "NAME IN USE, INPUT ANOTHER" +300 GOTO 120 +310 NEXT O1 +315 M$(Q5)=N$(Q5) +320 GOTO 360 +330 PRINT "TYPE PLAYERS NAME (ONE ONLY AT A TIME)" +340 PRINT "'YOU' IF THE COMPUTER IS PLAYING." +350 GOTO 120 +360 T(Q5)=1500 +370 NEXT Q5 +380 IF Z7=1 THEN 410 +390 A7=1 +400 A8=1 +410 FOR B4= 1 TO 40 +420 REM READS DATA, P$=NAME,S IS TYPE,R IS RENT, AND C IS COST +430 READ P$(B4),S(B4) +440 REM B3= B= PLAYER NUMBER +450 IF S(B4)>8 THEN 470 +460 GOTO 490 +470 READ L(B4),C(B4) +480 R(B4)=L(B4) +490 NEXT B4 +500 I0=1 +510 J0=200 +520 LET I=I+1 +530 PRINT +540 PRINT "TURN";I +550 PRINT +560 GOSUB 6910 +570 IF I0=0 THEN 600 +580 GOTO 2780 +590 I0=0 +600 FOR B3=1 TO N +610 B=B3 +620 IF A(B)=1 THEN 660 +630 O$="YOU" +640 I$="YOUR" +650 GOTO 690 +660 O$="I" +670 I$="MY" +680 REM THIS SETS O AND I$ FOR COMPUTER OR HUMAN +690 R5=0 +700 U=0 +710 IF Q(B)=1 THEN 3720 +720 IF A(B)=1 THEN 780 +730 IF N$(B)<>"ME" THEN 760 +740 PRINT "YOUR TURN" +750 GOTO 820 +760 PRINT N$(B3);"'S TURN" +770 GOTO 820 +780 PRINT "MY TURN"; +790 IF W7=1 THEN 810 +800 PRINT "(PLAYER";B;")"; +810 PRINT +820 IF T(B)>0 THEN 840 +830 GOSUB 9010 +840 IF Q(B)=1 THEN 3720 +850 IF E(B)=0 THEN 880 +860 B9=B3 +870 GOSUB 4770 +880 IF T(B)> 100 THEN 900 +890 GOSUB 5710 +900 IF N(B)>0 THEN 920 +910 IF X(B)=0 THEN 940 +920 GOSUB 6230 +930 GOTO 940 +940 B2=INT(RND(1)*6)+1 +950 B1=INT(RND(1)*6)+1 +960 PRINT "THE DICE ARE ON";B1;" AND ";B2 +970 IF B1=B2 THEN 1010 +980 IF J(B)=1 THEN 1150 +990 G(B)=0 +1000 GOTO 1510 +1010 G(B)= G(B)+1 +1020 REM G(B) IS NUMBER OF DOUBLES +1030 IF G(B)>=3 THEN 1100 +1040 IF J(B)=1 THEN1070 +1050 REM J(B)= 1IF IN JAIL, =0 IF OUT OF JAIL +1060 GOTO 1510 +1070 J(B)=0 +1080 PRINT "OUT OF JAIL " +1090 GOTO 2760 +1100 J(B)=1 +1110 PRINT "3 DOUBLES . IN JAIL" +1120 P(B)=10 +1130 GOTO 2770 +1140 G(B)=0 +1150 IF F(B)>0 THEN 1170 +1160 GOTO 1290 +1170 PRINT" IN JAIL WILL ";O$;" USE ";I$;" JAILCARD"; +1180 IF A(B)=0 THEN 1210 +1190 PRINT "?* YES *" +1200 GOTO 1260 +1210 INPUT X$ +1220 IFLEFT$(X$,1)="N"THEN1290 +1230 IFLEFT$(X$,1)="Y"THEN1260 +1240 PRINT "YES OR NO"; +1250 GOTO 1210 +1260 F(B)=F(B)-1 +1270 D(B)=0 +1280 GOTO 1490 +1290 IF D(B)<3 THEN 1320 +1300 PRINT "THIRD TIME IN JAIL.";O$;" MUST PAY $50." +1310 GOTO 1480 +1320 PRINT"IN JAIL. WILL ";O$;" PAY $50"; +1330 IF A(B)=0 THEN 1410 +1340 D(B)=D(B)+1 +1350 IF D(B)=3 THEN 1390 +1360 IF T(B)>200 THEN 1390 +1370 PRINT"? *NO*" +1380 GOTO 2770 +1390 PRINT"? *YES*" +1400 GOTO 1480 +1410 P(B)=P(B)+1 +1420 INPUT A$ +1430 P(B)=10 +1440 IFLEFT$(A$,1)="Y"THEN1480 +1450 IFLEFT$(A$,1)="N"THEN2770 +1460 PRINT "TYPE 'YES' OR 'NO'"; +1470 GOTO 1290 +1480 LET T(B)= T(B)-50 +1490 J(B)=0 +1500 D(B)=0 +1510 P(B)= P(B)+B1+B2 +1520 R5=0 +1530 U=0 +1540 P=P(B) +1550 IF P(B)>40 THEN 1570 +1560 GOTO 1610 +1570 LET P(B)= P(B)- 40 +1580 P=P(B) +1590 T(B)= T(B)+200 +1600 PRINT "PASSED GO!! COLLECTED $200 " +1610 IF S(P(B))>10 THEN 1640 +1620 GOTO 2290 +1630 P=P(B3) +1640 IF V(P(B))>B THEN 2040 +1650 REM V(--) IS THE OWNER OF THE PROPERTY +1660 IF V(P(B))0 THEN 2040 +1690 GOTO 1760 +1700 Y9=P(B) +1710 IF A(B)=0 THEN 1740 +1720 PRINT "I AM ON ";P$(P);" WHICH I OWN." +1730 GOTO 2760 +1740 PRINT "YOU ARE ON ";P$(Y9); " WHICH YOU OWN " +1750 GOTO 2760 +1760 LET P=P(B3) +1770 IF A(B)=0 THEN 1800 +1780 PRINT P$(P);" IS AVAILABLE AT PRICE $";C(P);" WILL I BUY IT"; +1790 GOTO 1820 +1800 PRINT "WILL YOU BUY ";P$(P);" FOR $";C(P); +1810 IF A(B)=0 THEN 1870 +1820 IF T(B)<200 +C(P) THEN 1850 +1830 PRINT "? *YES*" +1840 GOTO 1920 +1850 PRINT "? *NO*" +1860 GOTO 2760 +1870 INPUT A$ +1880 IFLEFT$(A$,1)="Y" THEN 1920 +1890 IFLEFT$(A$,1)="N"THEN2760 +1900 PRINT"YES OR NO"; +1910 GOTO 1870 +1920 LET T(B)= T(B)- C(P(B)) +1930 IF R5=1 THEN 1950 +1940 GOTO 1960 +1950 W(B)=W(B)+1 +1960 IF U=1 THEN 1980 +1970 GOTO 1990 +1980 LET U(B)= U(B)+1 +1990 V(P(B))= B +2000 U8=0 +2010 GOSUB 4260 +2020 GOTO 2760 +2030 REM THIS IS RENT ROUTINE +2040 IF R5=0 THEN 2070 +2050 R(P(B))= 25* W(V(P(B))) +2060 GOTO 8320 +2070 IF U=0 THEN 8320 +2080 IF U(B)=2 THEN 2110 +2090 U3=4 +2100 GOTO 2120 +2110 U3=10 +2120 GOTO 8310 +2130 IF A(W8)=0 THEN 2180 +2140 PRINT P$(W9); " IS MINE"; +2150 IF W7=1 THEN 2190 +2160 PRINT "(PLAYER";W8;")"; +2170 GOTO 2190 +2180 PRINT P$(W9);" BELONGS TO "; N$(W8); +2190 IF M(P(B))=1 THEN 2240 +2200 PRINT ", RENT IS $ "; R(P(B)) +2210 T(B)=T(B)-R(P(B)) +2220 T(V(P))= T(V(P))+ R(P(B)) +2230 GOTO 2760 +2240 PRINT " ,BUT IT IS MORTGAGED" +2250 GOTO 2760 +2260 P=P(B3) +2270 T(V(P(B)))= T(V(P(B)))+ R(P(B)) +2280 GOTO 2760 +2290 ON S(P(B)) GOTO 2760,2370, 2420,2490,2600,2630,2670,2310,2710,2740 +2300 REM FOR UNIQUE SQUARES IT SENDS THE PROGRAM TO THE RIGHT DIRECTION +2310 Y9=P(B) +2320 IF A(B)=0 THEN 2350 +2330 PRINT "I AM ON ";P$(Y9);"." +2340 GOTO 2760 +2350 PRINT "YOU ARE ON ";P$(Y9) +2360 GOTO 2760 +2370 PRINT"COMMUNITY CHEST "; +2380 PRINT "--"; +2390 GOSUB 3750 +2400 REM GOES TO CHANCE-COMMUNITY CHEST GOSUB +2410 GOTO 2440 +2420 PRINT "CHANCE--"; +2430 GOSUB 3750 +2440 IF V0=1 THEN 2460 +2450 GOTO 2760 +2460 V0=0 +2470 R5=1 +2480 GOTO 1640 +2490 Z2=.1*(T(B)) +2500 IF Z2>0 THEN 2530 +2510 PRINT O$;" IS ON INCOME TAX, BUT HAS A NEGATIVE AMOUNT OF MONEY" +2520 GOTO 2760 +2530 IF Z2>200 THEN 2570 +2540 LET T(B)= T(B)-INT(Z2) +2550 PRINT "INCOME TAX--$";INT(Z2) +2560 GOTO 2760 +2570 T(B)= T(B)- 200 +2580 PRINT "INCOME TAX-$200" +2590 GOTO 2760 +2600 T(B)= T(B)-75 +2610 PRINT "LUXURY TAX $75" +2620 GOTO 2760 +2630 J(B)=1 +2640 P(B)=10 +2650 PRINT"GO TO JAIL" +2660 GOTO 2760 +2670 PRINT"FREE PARKING-$";J0;"." +2680 T(B)=T(B)+J0 +2690 J0=200 +2700 GOTO 2760 +2710 R5=1 +2720 GOTO 1640 +2730 GOTO 2760 +2740 U=1 +2750 GOTO 1630 +2760 IF G(B)>0 THEN 940 +2770 PRINT +2780 IF A8=-1 THEN 3000 +2790 IF A8=0 THEN 2850 +2800 IF A8=5 THEN 2830 +2810 A8=A8+1 +2820 GOTO 3700 +2830 A8=1 +2840 GOTO3000 +2850 PRINT "SUMMARY"; +2860 INPUT A$ +2870 IF A$="AUTO" THEN 2890 +2880 GOTO 2910 +2890 A8=1 +2900 GOTO 3700 +2910 IF A$="ALWAYS" THEN 2930 +2920 GOTO2950 +2930 A8=-1 +2940 GOTO 3000 +2950 IFLEFT$(A$,1)="N"THEN3700 +2960 IFLEFT$(A$,1)="Y"THEN3000 +2970 PRINT "'YES' OR 'NO' OR 'AUTO'( GIVES A SUMMARY EVERY FIVE TURNS" +2980 PRINT "AND DOESN'T ASK YOU ANY MORE" +2990 GOTO 2850 +3000 GOTO 3010 +3010 FOR J8=1 TO N +3020 X=0 +3030 T0=0 +3040 IF Q(J8)=1 THEN3650 +3050 T$=" " +3060 IF A(J8)=1 THEN 3120 +3070 IF N$(J8)<>"ME" THEN 3100 +3080 PRINT "YOU HAVE $";T(J8); +3090 GOTO 3160 +3100 PRINT N$(J8);" HAS $";T(J8); +3110 GOTO 3160 +3120 PRINT"I"; +3130 IF W7=1 THEN 3150 +3140 PRINT "(PLAYER";J8;")"; +3150 PRINT" HAVE $";T(J8); +3160 FORJ9=1 TO 40 +3170 IF V(J9)=J8 THEN 3190 +3180 GOTO 3350 +3190 IF T$= " " THEN 3210 +3200 PRINT ","; T$; +3210 T$= P$(J9) +3220 X=X+C(J9)+B(J9)*INT((S(J9)-10)/2+.5)*50 -M(J9)* .5*C(J9) +3230 IF B(T)=0 THEN 3310 +3240 IF B(T)>1 THEN 3270 +3250 PRINT "(WITH A HOUSE)"; +3260 GOTO 3310 +3270 IF B(T)<5 THEN 3300 +3280 PRINT "(WITH A HOTEL)"; +3290 GOTO 3310 +3300 PRINT "(WITH";B(T);"HOUSES)"; +3310 IF M(T)=0 THEN 3330 +3320 PRINT "(MORTGAGED)"; +3330 T=J9 +3340 IF T0=1 THEN 3460 +3350 NEXT J9 +3360 IF F(J8)>0 THEN 3420 +3370 IF T$<>" " THEN 3400 +3380 PRINT "." +3390 GOTO 3610 +3400 PRINT ", AND ";T$; +3410 GOTO 3440 +3420 IF T$=" " THEN3470 +3430 PRINT",";T$; +3440 T0=1 +3450 GOTO 3230 +3460 T0=0 +3470 IF F(J8)=0 THEN 3550 +3480 IF F(J8)=1 THEN 3520 +3490 PRINT ",AND ";F(J8);"JAILCARDS."; +3500 X=X+F(J8)*50 +3510 GOTO 3610 +3520 PRINT ",AND A JAILCARD."; +3530 X=X+50 +3540 GOTO 3610 +3550 IF T$=" " THEN3610 +3560 K(0)=LEN(T$):FORXE=1TOK(0):K(XE)=ASC(MID$(T$,XE,1)):NEXTXE +3570 IF K(K(0))=46 THEN 3600 +3580 PRINT "."; +3590 GOTO 3610 +3600 GOTO 3610 +3610 PRINT +3620 IF X=0 THEN 3640 +3630 PRINT " TOTAL ASSETS:$";T(J8)+X;"." +3640 PRINT +3650 NEXT J8 +3660 PRINT" "; +3670 PRINT "$";J0;" ON THE FREE PARKING JACKPOT." +3680 PRINT +3690 PRINT +3700 IF I0=0 THEN 3720 +3710 GOTO 590 +3720 PRINT +3730 NEXT B3 +3740 GOTO 520 +3750 J5=INT(RND(1)*7)+1 +3760 ON J5 GOTO 3770,3810,3870,3930,3990,4040,4070 +3770 PRINT "GOTO JAIL!!!" +3780 J(B)=1 +3790 P(B)=10 +3800 GOTO 4090 +3810 PRINT "COLLECT $50 FROM EVERYONE" +3820 FOR Y3=1TON +3830 LET T(Y3)= T(Y3)-50 +3840 NEXT Y3 +3850 T(B)=T(B)+N*50 +3860 GOTO 4090 +3870 PRINT "GO TO READING" +3880 LET P(B)=5 +3890 LET P=5 +3900 V0=1 +3910 REM V0 TELLS THE PROGRAM TO GO TO READING +3920 RETURN +3930 PRINT "PAY ALL $50" +3940 FOR Y4=1 TO N +3950 T(Y4)= T(Y4)+50 +3960 NEXT Y4 +3970 T(B)=T(B)-N*50 +3980 GOTO 4090 +3990 Y2=INT(RND(1)*4)+1 +4000 PRINT "PAY $";Y2*50 +4010 T(B)=T(B)-Y2*50 +4020 J0=J0+Y2*50 +4030 GOTO 4090 +4040 PRINT "GO DIRECTLY TO GO" +4050 P(B)=40 +4060 GOTO 4090 +4070 PRINT "TICKET OUT OF JAIL" +4080 F(B)=F(B)+1 +4090 RETURN +4100 DATA MEDITERRANEAN,11,2,60,CC,2,BALTIC,11,4,60,IT,4 +4110 DATA READING,9,25,200,ORIENTAL,12,6,100,CH,3 +4120 DATA VERMONT,12,6,100,CONN.,12,8,120,JAIL,8 +4130 DATAST. CHAS.,13,10,140,ELECTRIC WORKS,10,1,150,STATES +4140 DATA13,10,140,VIRGINIA,13,12,160,PENNS.RR.,9,25,200 +4150 DATA ST.JAMES,14,14,180,CC,2,TENNESSEE,14,14,180 +4160 DATA NEW YORK,14,16,200,FP,7,KENTUCKY,15,18,200 +4170 DATA CH,3,INDIANA,15,18,220,ILLINOIS,15,20,240 +4180 DATA B&O RR,9,25,200 +4190 DATA ATLANTIC,16,22,260,VENTNOR +4200 DATA 16,22,260,WATER WORKS,10,1,150,M. GARDENS +4210 DATA 16,24,280,GOJAIL,6,PACIFIC,17,26,300,N.CAROLINA +4220 DATA 17,26,300,CC,2,PENNS. AVE.,17,28,320 +4230 DATA SHORTLINE,9,25,200,CHANCE,3,PARKPLACE,18 +4240 DATA 35,350,LT,5,BOARDWALK,18,50,400,GO,8 +4250 DATA GO,8 +4260 Z=0 +4270 Z(3)=0 +4280 Z(2)=0 +4290 Z(1)=0 +4300 IFU8=0THEN4340 +4310 B9=E9 +4320 P=E8 +4330 GOTO 4360 +4340 B9=B3 +4350 P=P(B9) +4360 IF S(P)<11 THEN 4490 +4370 IF P>4 THEN 4400 +4380 LET I7=0 +4390 GOTO 4410 +4400 I7= P-4 +4410 IF P>35 THEN 4440 +4420 Q1= P+4 +4430 GOTO 4450 +4440 Q1=40 +4450 FOR W1= I7 TO Q1 +4460 IF S(W1) = S(P) THEN 4480 +4470 GOTO 4520 +4480 IF V(W1)= B9 THEN 4500 +4490 RETURN +4500 Z=Z+1 +4510 Z(Z)=W1 +4520 NEXT W1 +4530 E(B9)= E(B9)+1 +4540 IF A(B9)=0 THEN 4570 +4550 PRINT "I HAVE A MONOPOLY AND THE RENTS ARE DOUBLED" +4560 GOTO 4580 +4570 PRINT "YOU NOW HAVE MONOPOLY. THE RENTS ARE DOUBLED" +4580 FOR Z2=1 TO 3 +4590 R(Z(Z2))= 2*R(Z(Z2)) +4600 O(Z(Z2))=1 +4610 NEXT Z2 +4620 IF S(Z(1))<11 THEN 4640 +4630 GOTO 4650 +4640 RETURN +4650 GOSUB 4770 +4660 U8=0 +4670 RETURN +4680 FOR I1=1 TO 40 +4690 IF S(I1)= S(B) THEN 4710 +4700 GOTO 4750 +4710 IF V(I1)= V9 THEN 4730 +4720 RETURN +4730 Z=Z+1 +4740 Z(Z)=I1 +4750 NEXT I1 +4760 GOTO 4570 +4770 PRINT" DO ";O$;" WANT HOUSES NOW"; +4780 IF A(B9)=0 THEN 4820 +4790 IF T(B9)>500 THEN 4880 +4800 PRINT "? *NO*" +4810 RETURN +4820 INPUT Z$ +4830 IFLEFT$(Z$,1)="N"THEN4870 +4840 IFLEFT$(Z$,1)="Y"THEN4900 +4850 PRINT "YES OR NO"; +4860 GOTO 4820 +4870 RETURN +4880 I3=1 +4890 GOTO 4920 +4900 PRINT "LOT, #OF HOUSES"; +4910 IF A(B)=0 THEN5120 +4920 FOR I2= 1 TO 40 +4930 IF V(I2)<>B9 THEN 4990 +4940 IF O(I2)=0 THEN 4990 +4950 IF B(I2)>4 THEN 4990 +4960 GOTO 5050 +4970 H=I2 +4980 GOTO5250 +4990 NEXT I2 +5000 GOTO 5030 +5010 IF I3> 5 THEN 5030 +5020 GOTO 4920 +5030 PRINT "?*NO*" +5040 RETURN +5050 IF T(B)>1700 THEN 5090 +5060 IF B(I2)>5-INT(T(B)/350) THEN 5090 +5070 H4=INT (T(B)/350) +5080 GOTO 5100 +5090 H4= 5-B(I2) +5100 PRINT "?* YES ";H4;" ON ";P$(I2);"*" +5110 GOTO 5260 +5120 INPUT H$,H5 +5130 IFLEFT$(H$,1)="N"THEN4870 +5140 IF H$="WHAT" THEN 9370 +5150 IF H5>0 THEN 5190 +5160 PRINT "A POSITIVE NUMBER PLEASE!" +5170 INPUT H5 +5180 GOTO 5150 +5190 FOR H=1 TO 40 +5200 IF P$(H)= H$ THEN 5250 +5210 NEXT H +5220 PRINT "WHAT LOT"; +5230 INPUT H$ +5240 GOTO 5130 +5250 IF A(B)=0 THEN 5310 +5260 H5=H4 +5270 H=I2 +5280 GOTO 5310 +5290 PRINT "YOU DON'T OWN THAT" +5300 GOTO 4770 +5310 H7=H5+B(H) +5320 GOSUB 5340 +5330 GOTO 5590 +5340 R(H)=L(H) +5350 IF H7<6 THEN 5390 +5360 PRINT " YOU WILL HAVE TO HAVE 5 HOUSES (ONE HOTEL)" +5370 H5=H7-B(H) +5380 H7=5 +5390 IF H7>0 THEN 5420 +5400 PRINT "YOU CAN'T HAVE LESS THAN 0 HOUSES." +5410 GOTO 5570 +5420 B(H)=0 +5430 FOR H6= 1 TO H7 +5440 B(H)=H6 +5450 J=H +5460 IF B(H)=0 THEN 4870 +5470 ON B(H) GOTO 5480,5500,5520,5540,5540 +5480 R(J)= R(J)*2.5 +5490 GOTO 5550 +5500 R(J)=R(J)*3 +5510 GOTO 5550 +5520 R(J)= R(J)*2.3 +5530 GOTO 5550 +5540 R(J)=R(J)+185 +5550 R(J)= 10* INT(R(J)/10 +.5) +5560 NEXT H6 +5570 PRINT "THE RENT IS NOW $";R(J);"." +5580 RETURN +5590 C=INT((S(J)-10)/2+.5)*50 +5600 IF H5=1 THEN 5630 +5610 PRINT "THOSE WERE $";C;"EACH, MAKING $";H5*C;"." +5620 GOTO 5640 +5630 PRINT "THAT WAS $";C;"." +5640 T(B9)= T(B9)- H5*C +5650 X(B9)=X(B9)+H5 +5660 RETURN +5670 PRINT "ANOTHER"; +5680 GOTO 4780 +5690 RETURN +5700 GOTO 4440 +5710 PRINT "WHAT DO ";O$;" WANT TO MORTGAGE"; +5720 I3=1 +5730 IF A(B)=0 THEN 5910 +5740 IF T(B)>150 THEN 5860 +5750 FOR I4= 1 TO 40 +5760 IF V(I4)=B THEN 5780 +5770 GOTO 5840 +5780 IF O(I4)= I3 THEN 5840 +5790 IF M(I4)=1 THEN 5840 +5800 IF B(I4)<>0 THEN 5840 +5810 PRINT "? *";P$(I4);"*" +5820 Z5=I4 +5830 GOTO 6000 +5840 NEXT I4 +5850 IF I3=1 THEN 5890 +5860 PRINT "? *NOTHING*" +5870 RETURN +5880 GOTO 6110 +5890 I3=0 +5900 GOTO 5750 +5910 INPUT Z$ +5920 IF Z$="WHAT" THEN 9400 +5930 IFLEFT$(Z$,3)<>"NOT"THEN5950 +5940 RETURN +5950 FOR Z5=1 TO 40 +5960 IF P$(Z5)=Z$ THEN 6000 +5970 NEXT Z5 +5980 PRINT "WHAT"; +5990 GOTO 5910 +6000 IF B(Z5)>0 THEN 6120 +6010 FOR X=1 TO 40 +6020 IF S(X)<>S(Z5) THEN 6060 +6030 IF B(X)=0 THEN 6060 +6040 PRINT "THERE ARE HOUSES ON OTHER LOTS OF MONPOLY. YOU MUST SELL THEM." +6050 GOTO 5710 +6060 NEXT X +6070 GOTO 6150 +6080 M(Z5)=1 +6090 N(B)= N(B)+1 +6100 T(B)= T(B)+.5*C(Z5) +6110 GOTO 5710 +6120 PRINT "THERE ARE HOUSES ON IT" +6130 GOTO 5710 +6140 RETURN +6150 IF V(Z5)>B3THEN 6200 +6160 IF V(Z5)"WHAT" THEN 6410 +6380 PRINT "TYPE 'NOTHING', A PROPERTY NAME, OR 'HOUSES' IF" +6390 PRINT "YOU WANT TO SELL THEM." +6400 GOTO 6360 +6410 IFLEFT$(Z$,3)="NOT"THEN6590 +6420 IF Z$="HOUSES" THEN 6600 +6430 FOR E=1 TO 40 +6440 IF P$(E)=Z$ THEN 6480 +6450 NEXT E +6460 PRINT "WHAT"; +6470 GOTO 6360 +6480 IF M(E)=1 THEN 6510 +6490 PRINT "IT ISN'T MORTGAGED" +6500 GOTO 6230 +6510 IF V(E)=B THEN 6540 +6520 PRINT"YOU DON'T OWN IT" +6530 GOTO 6230 +6540 M(E)=0 +6550 N(B)= N(B)-1 +6560 T(B)=T(B)-INT(.6*C(E)) +6570 PRINT "WITH INTEREST THAT WAS$";INT(.6*C(E)) +6580 IF N(B)>0 THEN 6230 +6590 RETURN +6600 PRINT"LOT,# OF HOUSES"; +6610 INPUT Z$,E2 +6620 IF E2>0 THEN 6650 +6630 PRINT "INPUT A POSITIVE NUMBER" +6640 GOTO 6600 +6650 IF Z$="NO" THEN6110 +6660 GOTO 6700 +6670 PRINT "TYPE IN THE NAME OF THE LOT THEN THE # OF HOUSES YOU ARE" +6680 PRINT"SELLING. TO SELL NONE TYPE 'NO'" +6690 GOTO 6600 +6700 FOR E3=1 TO 40 +6710 IF P$(E3)=Z$THEN 6760 +6720 NEXT E3 +6730 PRINT "WHAT LOT"; +6740 INPUT Z$ +6750 GOTO 6650 +6760 B(E3)= B(E3)-E2 +6770 X(B)=X(B)-E2 +6780 IF B(E3)<0 THEN 6870 +6790 H=E3 +6800 H7=B(H) +6810 GOSUB 5340 +6820 E4=INT((S(E3)-10)/2+.5)*25 +6830 E4=E4*E2 +6840 PRINT" YOU GET$";E4 +6850 T(B)=T(B)+E4 +6860 GOTO 6230 +6870 PRINT "YOU DON'T HAVE THAT MANY" +6880 B(E3)=B(E3)+E2 +6890 GOTO 6600 +6900 GOTO 6230 +6910 IF A7=1 THEN 7050 +6920 IF E6=0 THEN 6960 +6930 E6=E6+1 +6940 IF E6<3 THEN 7090 +6950 E6=1 +6960 PRINT "CHANGES"; +6970 E6=0 +6980 INPUT Z$ +6990 IF Z$<>"WHAT" THEN 7020 +7000 PRINT "'YES', 'NO','NEVER',OR 'DELAY'( WILL ASK AGAIN IN THREE TURNS"; +7010 GOTO 6980 +7020 IF Z$= "NEVER" THEN 7040 +7030 GOTO 7060 +7040 A7=1 +7050 RETURN +7060 IF Z$="YES" THEN 7170 +7070 IF Z$<>"DELAY" THEN 7110 +7080 E6=1 +7090 PRINT +7100 RETURN +7110 IF Z$="NO" THEN 7090 +7120 PRINT "TYPE 'YES', OR 'NO' IF YOU WANT TO MAKE CHANGES OR NOT" +7130 PRINT "OR 'DELAY' TO HAVE IT ASK YOU LATER" +7140 GOTO 6960 +7150 RETURN +7160 IF T(B9)> 300 THEN 4880 +7170 GOTO 7210 +7180 REM THIS PART WILL TRANSFERR OWNERSHIP OF A PROPERTY +7190 REM TO SOMEONE ELSE AND TRANSFER SOME MONEY TO +7200 REM TO CORRRESPOND +7210 PRINT "('WHAT,A,0' FOR INST.)"; +7220 INPUT Z$,A$,A +7230 IF Z$="NEW PLAYER" THEN 10120 +7240 IF A$<>"YOU" THEN 7260 +7250 A$="COMPUTER" +7260 IF Z$="NEW PLAYER" THEN 10120 +7270 IF Z$="WHAT" THEN 9420 +7280 IF Z$= "NO" THEN 8240 +7290 IF Z$="QUIT" THEN 7590 +7300 IF Z$="JAIL CARD" THEN 7590 +7310 IF Z$="JAILCARD" THEN 7590 +7320 IF A$<>"BANK" THEN 7360 +7330 GOTO 7590 +7340 PRINT" THAT'S ILLEGAL!" +7350 GOTO 7210 +7360 FOR E8=1 TO 40 +7370 IF P$(E8)= Z$ THEN 7460 +7380 NEXT E8 +7390 PRINT "WHAT LOT"; +7400 INPUT Z$ +7410 IF Z$<>"WHAT"THEN 7440 +7420 PRINT"TYPE THE PROPERTY NAME OR 'NO'" +7430 GOTO7400 +7440 IF Z$="NO" THEN 6960 +7450 GOTO 7360 +7460 IF S(E8)<9THEN 8250 +7470 T8=0 +7480 IF V(E8)=0 THEN 8270 +7490 IF B(E8)>0 THEN 7570 +7500 FOR I2= 1 TO 40 +7510 IF S(I2)<>S(E8) THEN 7550 +7520 IF B(I2)=0 THEN 7550 +7530 PRINT "THERE ARE HOUSES ON OTHER LOTS OF MONOPOLY.YOU MUST SELL THEM." +7540 GOTO 6960 +7550 NEXT I2 +7560 GOTO 7590 +7570 PRINT "THERE ARE HOUSES ON IT" +7580 GOTO 7210 +7590 T8=0 +7600 FOR E9= 1 TO N +7610 IF N$(E9)=A$ THEN 7630 +7620 GOTO 7640 +7630 T8=T8+1 +7640 NEXT E9 +7650 ON T8+1 GOTO 7770,7860,7660,7660,7660,7660,7660,7660,7660,7660 +7660 PRINT "WHICH PLAYER NO.('-1' FOR INSTRUCTIONS)"; +7670 INPUT E9 +7680 IF E9>0 THEN 7720 +7690 PRINT "TYPE THE PLAYER NO. OF THE PIECE. BECAUSE I" +7700 PRINT "PLAY MORE THAN ONE PLAYER, I MUST KNOW WHICH"; +7710 GOTO 7670 +7720 IF E9>N THEN 7660 +7730 IF A(E9)=1 THEN 7760 +7740 PRINT"I AM NOT ";N$(E9) +7750 GOTO 7660 +7760 GOTO 7860 +7770 PRINT "WHO"; +7780 INPUT A$ +7790 IFA$="NO" THEN8290 +7800 IF A$<>"WHAT" THEN 7820 +7810 PRINT "TYPE NEW OWNER'S NAME OR 'NO'"; +7820 GOTO 7590 +7830 REM THIS IS FOR JAILCARDS +7840 GOSUB 9610 +7850 GOTO 6960 +7860 GOTO 7870 +7870 FOR E9=1 TO N +7880 IF N$(E9)<>A$ THEN 7900 +7890 GOTO 7910 +7900 NEXT E9 +7910 B=E9 +7920 IF Z$="JAILCARD" THEN 7830 +7930 IF Z$<>"QUIT" THEN 7970 +7940 B=E9 +7950 GOSUB 9240 +7960 GOTO 6960 +7970 U5=V(E8) +7980 IF A$="BANK" THEN 8090 +7990 IF A(V(E8))=1 THEN 8420 +8000 IFA(E9)=1THEN8360 +8010 T(V(E8))= T(V(E8))+A +8020 IF S(E8)<>9 THEN 8050 +8030 W(V(E8))=W(V(E8))-1 +8040 W(E9)=W(E9)+1 +8050 IF S(E8)<>10 THEN 8080 +8060 U(V(E8))=U(V(E8))-1 +8070 U(E9)=U(E9)+1 +8080 LET V(E8)= E9 +8090 T(E9)= T(E9)-A +8100 IF A$="BANK" THEN 6960 +8110 IF O(E8)=1 THEN 8130 +8120 GOTO 8210 +8130 FOR O9= 1 TO 40 +8140 IF S(O9)=S(E8) THEN 8160 +8150 GOTO 8180 +8160 LET R(O9)= R(O9)/2 +8170 O(O9)=0 +8180 NEXT O9 +8190 PRINT "NO LONGER A MONOPOLY THERE" +8200 LET E(U5)= E(U5)-1 +8210 U8=1 +8220 P=E8 +8230 GOSUB 4260 +8240 GOTO 6960 +8250 PRINT" YOU FOOL, YOU CANT OWN ";Z$;"!!!!" +8260 GOTO 7210 +8270 PRINT "IT ISN'T OWNED" +8280 GOTO 7210 +8290 GOTO 6960 +8300 REM THIS BELONGS TO LINES 1049-- +8310 R(P(B))=INT(RND(1)*6+1)*U3 +8320 W9=P(B) +8330 W8=V(P(B)) +8340 GOTO 2130 +8350 W8=V(P(B)) +8360 IF T(E9)> 200+ C(E8) THEN8390 +8370 PRINT "I DONT ACCEPT" +8380 GOTO 7170 +8390 IF A> 150+C(E8) THEN 8370 +8400 PRINT "I ACCEPT" +8410 GOTO 8010 +8420 IF O(E8)=1 THEN 8520 +8430 IF A>2*C(E8) THEN 590 +8440 IF S(O1)<>S(E8) THEN 8460 +8450 IF V(O1)<>E9 THEN 8500 +8460 NEXT O1 +8470 IF T(V(E8))>200 THEN 8520 +8480 IF A 1.5* C(E8) THEN 8560 +8550 GOTO 8520 +8560 PRINT "IT IS A DEAL" +8570 GOTO 8010 +8580 PRINT " THIS PROGRAM WILL HANDLE UP TO TEN PLAYERS" +8590 PRINT "OR PIECES. IT WILL DO ALL ROUTINE JOBS SUCH AS" +8600 PRINT"ROLLING THE DICE,MOVING PIECES, AND INFORMING THE" +8610 PRINT "PLAYERS OF ALL OPTIONS. IT WILL ACTUALLY" +8620 PRINT"PLAY THE GAME MAKING THE DECISIONS OF ANY NUMBER OF PLAYERS." +8630 PRINT"WANT THE COMPUTER TO DO THIS TYPE 'YOU' WHEN IT ASKS" +8640 PRINT"FOR THE NAME." +8650 PRINT "OF PLAYERS. TO DO THIS TYPE 'YOU' AS THE" +8660 PRINT " NAME OF THAT PLAYER." +8670 PRINT +8680 PRINT"THIS PROGRAM IS FAIRLY SELF-EXPLANATORY, HOWEVER THE FOLLOWING" +8690 PRINT "THINGS MUST BE KEPT IN MIND:" +8700 PRINT +8710 PRINT" 1. IF A QUESTION IS NOT UNDERSTOOD,TYPING 'WHAT' WILL" +8720 PRINT "USUALLY GIVE INSTRUCTIONS. HOWEVER SOME QUESTIONS WILL" +8730 PRINT "ASK FOR MORE THAN ONE THING AND THIS NUMBER OF THINGS MUST" +8740 PRINT "BE TYPED SEPERATED BY COMMAS. ALSO CARE MUST BE " +8750 PRINT "TAKEN THAT ALL INPUTS ARE EITHER NUMERIC OR ALPHABETIC" +8760 PRINT "AS ASKED FOR. EXAMPLE:" +8770 PRINT " LOT, # OF HOUSES? WHAT,0" +8780 PRINT "WILL GIVE INSTRUCTIONS." +8790 PRINT " 2. THE COMPUTER WILL OFTEN ASK IF YOU WANT CHANGES" +8800 PRINT "OR A SUMMARY. THE CHANGES ROUTINE WILL BE DESCRIBED" +8810 PRINT "BELOW, BUT IF YOU DON'T WANT TO BE BOTHERED WIL THE" +8820 PRINT "EVERYTIME, TYPE 'NEVER' TO HAVE IT STOP ASKING" +8830 PRINT "COMPLETELY, OR 'DELAY' TO HAVE IT ASK IN THREE" +8840 PRINT "TURNS. FOR SUMMARY TYPE 'AUTO' AND IT WILL " +8850 PRINT "GIVE A SUMMARY EVERY 5 TURNS, WITHOUT ASKING YOU AGAIN" +8860 PRINT" 3. TO SELL PROPERTIES OR ADD AND DROP PLAYERS USE THE " +8870 PRINT "CHANGES ROUTINE. TYPE 'YES' WHEN IT ASKS 'CHANGES?'" +8880 PRINT "TYPE 'YES' THEN TYPE 'WHAT,A,0' FOR COMPLETE INSTRUCTIONS" +8890 PRINT " 4. FIVE HOUSES ARE EQUIVALENT TO ONE HOTEL." +8900 PRINT " 5. IF YOU TYPE 'YOU' FOR ALL THE NAMES" +8910 PRINT "THE COMPUTER WILL PLAY ITSELF WITHOUT" +8920 PRINT "ASKING YOU FOR ANYTHING. TYPING CONTROL-O" +8930 PRINT "WILL MAKE THE GAME CONTINUE WITHOUT " +8940 PRINT "TYPE OUT, AND CONTROL-C THEN CONT WILL START THE" +8950 PRINT " TYPE OUT AGAIN WITH THE GAME VERY FAR ALONG." +8960 PRINT " 6. TO SELL HOUSES, WAIT UNTIL THE COMPUTER ASKS" +8970 PRINT "UNMORTGAGE WHAT? AND TYPE 'HOUSES' THEN ANSWER" +8980 PRINT "ANSWER FURTHAR QUESTIONS." +8990 RETURN +9000 PRINT +9010 IF N7=1 THEN 9200 +9020 IF A(B)=0 THEN 9100 +9030 FOR I2= 1 TO N +9040 IF Q(I2)=1 THEN 9060 +9050 IF A(I2)=0 THEN 9080 +9060 NEXT I2 +9070 GOTO 9200 +9080 PRINT "I AM $";ABS(T(B));"IN THE RED. SHOULD I QUIT"; +9090 GOTO 9110 +9100 PRINT "YOU ARE $";ABS(T(B));"IN THE HOLE. WILL YOU QUIT"; +9110 INPUT Z$ +9120 IFLEFT$(Z$,1)="Y"THEN9240 +9130 IFLEFT$(Z$,1)="N"THEN9190 +9140 IFLEFT$(Z$,1)="L"THEN9200 +9150 PRINT "TYPE 'YES' TO QUIT OR 'NO' TO KEEP GOING" +9160 PRINT "AND PAYING 5% INTEREST ON THE NEGATIVE AMMOUNT" +9170 PRINT "OR 'LATER' TO NOT QUIT NOW BUT KEEP THE COMPUTER ASKING" +9180 GOTO 9110 +9190 N7=1 +9200 I1=INT(ABS(.05*T(B)+ .5)) +9210 PRINT "5% INTEREST IS $";I1 +9220 T(B)= T(B) - I1 +9230 RETURN +9240 Q(B)=1 +9250 T(B)=0 +9260 FOR I2=1 TO 40 +9270 IF V(I2)<>B THEN 9330 +9280 V(I2)=0 +9290 M(I2)=0 +9300 B(I2)=0 +9310 R(I2)=L(I2) +9320 O(I2)=0 +9330 NEXT I2 +9340 N$(B)=" " +9350 RETURN +9360 GOTO 6360 +9370 PRINT "TYPE PROPERTY NAME THEN NUMBER OF HOUSES OR" +9380 PRINT "'NO,0' TO DO NOTHING" +9390 GOTO 5100 +9400 PRINT "TYPE A PROPERTY NAME OR 'NOTHING' "; +9410 GOTO 5910 +9420 PRINT " THIS ROUTINE CAN DO SEVERAL THINGS:" +9430 PRINT " 1. TO SELL PROPERTY FROM ONE PERSON TO ANOTHER" +9440 PRINT "TYPE THE PROPERTY NAME,THE NEW OWNER'S NAME, THEN" +9450 PRINT "THE AMOUNT IT IS BEING SOLD FOR." +9460 PRINT " 2. TO SELL A JAILCARD, TYPE 'JAILCARD',THE NEW OWNERS" +9470 PRINT "NAME, THEN THE AMOUNT IT IS BEING SOLD FOR." +9480 PRINT "IF NEEDED THE COMPUTER WILL ASK WHO IT CAME FROM." +9490 PRINT " 3. FOR EITHER OF THE ABOVE,'YOU' CAN BE USED AS THE" +9500 PRINT "NEW OWNER'S NAME,OR THE COMPUTERS PROPERTY CAN BE USES" +9510 PRINT "THE COMPUTER WILL THEN DECIDE IF IT WILL ACCEPT YOUR OFFER," +9520 PRINT "AND TELL YOU IF IT WILL BUY OR SELL." +9530 PRINT " 4. TO ADD A NEW PLAYER TYPE:'NEW PLAYER',HIS NAME,'0'" +9540 PRINT " 5. TO DROP A PLAYER TYPE:'QUIT',HIS NAME,'0'" +9550 PRINT +9560 GOTO 7210 +9570 B=E9 +9580 REMARK THIS IS FOR QUITING FORM CHANGE ROUTINE +9590 GOSUB 9240 +9600 GOTO 6960 +9610 REM THIS IS FOR CHANGING JAILCARDS +9620 IF N<>2 THEN 9650 +9630 T0=3-E9 +9640 GOTO 9880 +9650 PRINT "WHO FROM"; +9660 INPUT Z$ +9670 IF Z$<>"WHAT" THEN 9710 +9680 PRINT"TYPE THE PERSON'S NAME FROM WHOM THE CARD" +9690 PRINT" CAME.";N$(E9);" HAD IT. WHO HAS IT NOW"; +9700 GOTO 9660 +9710 IF Z$<>"YOU" THEN 9830 +9720 IF W8=1 THEN 9820 +9730 PRINT "WHICH #"; +9740 PRINT "('0' FOR INST.)"; +9750 INPUT O3 +9760 IF O3>0 THEN 9790 +9770 PRINT "I AM PLAYING SEVERAL PLAYERS. TYPE NO. OF ONE YOU WANT"; +9780 GOTO 9750 +9790 IF O3>N THEN 9770 +9800 T0=O3 +9810 GOTO 9880 +9820 Z$="COMPUTER" +9830 FOR T0= 1 TO 40 +9840 IF N$(T0)= Z$ THEN 9880 +9850 NEXT T0 +9860 PRINT "WHO "; +9870 GOTO 9660 +9880 IF A(T0)=0 THEN 9960 +9890 IF A>45 THEN 9920 +9900 IF A<30 THEN 9940 +9910 GOTO 9940 +9920 PRINT" OK" +9930 GOTO 10070 +9940 PRINT" NO" +9950 RETURN +9960 IF A(E9)=0 THEN 10010 +9970 IF A>50 THEN 9940 +9980 IF F(E9)=1 THEN 9940 +9990 IF T(E9)<200 THEN 9940 +10000 GOTO9920 +10010 IF F(T0)=1 THEN 9940 +10020 IF A(T0)=0 THEN 10050 +10030 IF A> 45 THEN 9940 +10040 GOTO 10060 +10050 PRINT "HE DOESN'T HAVE ONE" +10060 RETURN +10070 F(T0)= F(T0)-1 +10080 F(E9)=F(E9)+1 +10090 T(T0)=T(T0)+A +10100 T(E9)=T(E9)-A +10110 RETURN +10120 REM THIS ALLOWS A NEW PLAYER +10130 IF A$="YOU" THEN 10210 +10140 FOR O9= 1 TO N +10150 IF N$(O9)=A$ THEN 10180 +10160 NEXT O9 +10170 GOTO 10210 +10180 PRINT "INPUT A NAME NOT ALREADY USED"; +10190 INPUT A$ +10200 GOTO 10140 +10210 FORO9= 1 TO N +10220 IF Q(O9)=1 THEN 10370 +10230 NEXT O9 +10240 IF N<10 THEN 10270 +10250 PRINT "TOO MANY PLAYERS. SOMEONE WILL HAVE TO QUIT." +10260 GOTO 6960 +10270 N=N+1 +10280 Q(N)=0 +10290 T(N)=1500 +10300 IF A$<>"YOU"THEN 10350 +10310 N$(N)="COMPUTER" +10320 W7=W7+1 +10330 A(N)=1 +10340 GOTO 6960 +10350 N$(N)=A$ +10360 GOTO 6960 +10370 REM THIS IS FOR NEW PLAYER +10380 N$(O9)= A$ +10390 Q(O9)=0 +10400 P(O9)=0 +10410 T(O9)=1500 +10420 IF N$(9)<>"YOU" THEN 10460 +10430 N$(O9)="COMPUTER" +10440 W7=W7+1 +10450 A(O9)=1 +10460 GOTO 6960 +10470 END +O9)=1500 +10420 IF N$(9)<>"YOU" THEN 10460 +10430 N$(O9)="COM \ No newline at end of file diff --git a/Source/Images/d_games/u0/MONSTER.BAS b/Source/Images/d_games/u0/MONSTER.BAS new file mode 100644 index 00000000..afb16241 --- /dev/null +++ b/Source/Images/d_games/u0/MONSTER.BAS @@ -0,0 +1,149 @@ +10 ' **** MONSTER COMBAT **** +20 ' Written by Lee Chapel 6/15/80 ( BYTE DEC.,1980 Pp.288-290 ) +30 ' Entered, Converted to Mbasic and Enhanced By Steven C. Rich +40 ' (313)358-3494 +50 ' +60 ' NOTE: The Graphics used are for use on a Heath H-19 terminal. I +70 ' have broken out the commands so that they can you can convert +80 ' this program for other terminals. I suggest strongly that anyone +90 ' using graphics in their programs do the same. +100 ' +110 RANDOMIZE:' REMOVE OR CHANGE IF USING MBASIC VERSION BEFORE 5.0 +120 ' ********************* H-19 TERMINAL COMMANDS ************************* +130 E$=CHR$(27):' ESCAPE CHARACTER (Used for alaphics in their programs do the same. +100 ' +110 RANDOMIZE:' REMOVE OR CHANGE IF USING MBASIC VERSION BEFORE 5.0 +120 ' ********************* H-19 TERMINAL COMMANDS ************************* +130 E$=CHR$(27):' ESCAPE CHARACTER (Used for alHOME +190 EP$=E$+"J":' ERASE TO END OF PAGE +200 'NOTE: The H-19 uses the following scheme for direct cursor addressing: +210 ' Location= (CHR$(Line number+31));(CHR$(Column number+31)) +220 ' ********************************************************************** +230 PRINT CLS$;"NOTE:The instructions for this game are in MONSTER.DOC." +240 FOR I=1 TO 2000:NEXT I +250 DIM A(10,10):PRINT CLS$;:PRINT TAB(20);"MONSTER COMBAT" +260 '************************************************************** +270 ' NOTE: THE FOLLOWING DEFINE GRAPHICS CHARACTERS OF THE H-19. +280 ' CHANGE THEM FOR YOUR TERMINAL +290 ' CH$(0) & CH$(1)= Grass CH$(2)= Tree CH$(5)= You +300 CH$(0)="ii":CH$(1)="ii":CH$(2)="r_":CH$(5)="}|" +310 '************************************************************** +320 FOR I=1 TO 9:FOR J=1 TO 9:A(I,J)=1:IF RND(1)>.75 THEN A(I,J)=2 +330 NEXT J,I +340 X=INT(RND(1)*6+2):Y=INT(RND(1)*6+2) +350 A(X,Y)=5:C=INT(RND(1)*1501+500) +360 GOSUB 1270 +370 PRINT "YOUR COMBAT STRENGTH IS ";C:GOSUB 620:IF I>11 THEN 370 +380 IF M=0 THEN PRINT "YOU GET THE TREASURE FREE":GOTO 860 +390 IF M=100 AND N=1 THEN 1260 +400 PRINT "DO YOU WANT TO (F)IGHT, (R)UN, OR (B)RIBE ? " +410 Z9$=INPUT$(1):IF Z9$<>"F"AND Z9$<>"R" AND Z9$<>"B" GOTO 410 +420 IF Z9$="F" GOTO 430 ELSE IF Z9$="R" GOTO 530 ELSE IF Z9$="B" GOTO 1000 ELSE GOTO 400 +430 INPUT"HOW MANY COMBAT POINTS DO YOU WISH TO USE";K +440 IF K>C THEN GOSUB 990:PRINT C;"COMBAT POINTS":GOTO 430 +450 I=INT(RND(1)*1001):L=2:C=C-K:K=K-.01*Q +460 FOR H=1000 TO 0 STEP-50:IF L*M<=K AND H>=I THEN 840 +470 L=L-.1:NEXT +480 PRINT "THE MONSTER KILLED YOU."; +490 PRINT "YOU LOSE EVERYTHING":PRINT "DO YOU WISH TO TRY AGAIN"; +500 'If using MBASIC Version before 5.0 remove 'RANDOMIZE' in following line +510 Z$=INPUT$(1):IF Z$="Y" THEN RANDOMIZE C:C=0:Q=0:GOTO 270 +520 PRINT :PRINT "SO LONG. BETTER LUCK NEXT TIME":END +530 I=INT(RND(1)*12):IF I=11 THEN 480 +540 FOR H=0 TO 10:IF H*10>M AND H<=I THEN 560 +550 NEXT:GOTO 1070 +560 A=X:B=Y +570 X=INT(RND(1)*3-1)+A: Y=INT(RND(1)*3-1)+B +580 IF A(X,Y)>1 THEN 570 +590 IF A(X,Y)=0 THEN 1320 +600 A(A,B)=1:A(X,Y)=5:IF I<>12 THEN 360 +610 RETURN +620 I=INT(RND(1)*18+1):M=I*10:IF I<11 THEN PRINT "A "; +630 ON I GOTO 640,650,660,670,680,690,700,710,720,730,740,1130,1080,1300,1340,1340,1340,1340 +640 PRINT "MINOTAUR";:GOTO 750 +650 PRINT "CYCLOPS";:GOTO 750 +660 PRINT "ZOMBIE";:GOTO 750 +670 PRINT "GIANT";:GOTO 750 +680 PRINT "HARPY";:GOTO 750 +690 PRINT "GRIFFIN";:GOTO 750 +700 PRINT "CHIMERA";:GOTO 750 +710 PRINT "DRAGON";:GOTO 750 +720 PRINT "WYVERN";:GOTO 750 +730 PRINT "BASLISK";:GOTO 750 +740 PRINT "NOTHING";:M=0 +750 PRINT " IS GUARDING ";:I=INT(RND(1)*7+1) +760 ON I GOTO 770,780,790,800,810,820,830 +770 PRINT "10 SILVER SPOONS":P=10:RETURN +780 PRINT "A JEWELED SWORD":P=30:RETURN +790 PRINT "A JAR OF RUBIES":P=50:RETURN +800 PRINT "A TREASURE CHEST":P=200:RETURN +810 PRINT "50 SILVER COINS":P=50:RETURN +820 PRINT "100 GOLD PIECES":P=100:RETURN +830 PRINT "A BOX OF JEWELS":P=75:RETURN +840 PRINT "YOU BEAT THE MONSTER" +850 S=S+1 +860 Q=Q+P +870 IF P=30 THEN GOSUB 1170 +880 IF P=200 THEN GOSUB 1200:GOSUB 1230 +890 PRINT "YOU HAVE ";Q;" TREASURE POINTS" +900 X$="":A=X:B=Y:INPUT"WHAT DIRECTION (HIT 1 TO RESET DISPLAY)";X$:IF X$=""GOTO 900 +910 IF X$="1" THEN PRINT CLS$;TAB(20);"MONSTER COMBAT":GOSUB 1270:GOTO 900 +920 IF RIGHT$(X$,1)="W" THEN X=X-1 +930 IF RIGHT$(X$,1)="E" THEN X=X+1 +940 IF LEFT$(X$,1) ="N" THEN Y=Y-1 +950 IF LEFT$(X$,1) ="S" THEN Y=Y+1 +960 IF A(X,Y)=0 THEN 1320 +970 IF A(X,Y)=2 THEN PRINT CHR$(7);"YOU RAN INTO A TREE":X=A:Y=B:GOTO 900 +980 A(A,B)=1:A(X,Y)=5:GOTO 360 +990 PRINT "YOU ONLY HAVE";:RETURN +1000 INPUT"HOW MUCH DO YOU WISH TO PAY";K +1010 IF K>Q THEN GOSUB 990:PRINT Q;" TREASURE POINTS":GOTO 1000 +1020 I=INT(RND(1)*22):L=0:IF I=21 OR K<1 THEN 480 +1030 FOR H=0 TO 20:IF K<=L*P AND I>=H THEN 1060 +1040 L=L+.1:NEXT +1050 PRINT "YOUR BRIBE WAS ACCEPTED.";:Q=Q-K:GOTO 890 +1060 PRINT "YOUR BRIBE WAS NOT ACCEPTED."; +1070 PRINT "YOU MUST FIGHT":GOTO 430 +1080 PRINT CHR$(7);"THE GUARDIAN OF THE FOREST CAPTURED YOU, TOOK HALF YOUR" +1090 PRINT "TREASURE, AND TOOK YOU TO A NEW SPOT IN THE FOREST" +1100 Q=Q/2:A=X:B=Y:FOR I9=1 TO 4000:NEXT +1110 X=INT(RND(1)*7+2):Y=INT(RND(1)*7+2):IF A(X,Y)<>1 THEN 1110 +1120 A(A,B)=1:A(X,Y)=5:GOSUB 1270:I=13:RETURN +1130 J=INT(RND(1)*20+1):C=C-J +1140 PRINT "YOU FELL INTO A PIT AND USED ";J;" COMBAT POINTS TO CLIMB OUT" +1150 IF C<0 THEN PRINT "YOU DIED WHILE CLIMBING OUT":GOTO 490 +1160 GOTO 560 +1170 IF RND(1)<.5 OR C>3000 THEN RETURN +1180 PRINT "THE SWORD WAS ENCHANTED AND DOUBLES YOUR STRENGTH" +1190 C=C*2:RETURN +1200 I=INT(RND(1)*10):IF I<>7 THEN RETURN +1210 PRINT "THE CHEST WAS A TRAP. YOU WERE KILLED WHEN YOU OPENED IT." +1220 GOTO 490 +1230 I=INT(RND(1)*10):IF I<>3 THEN RETURN +1240 PRINT "A MIRROR WAS IN THE CHEST."; +1250 PRINT " IT WILL KILL ANY BASILISKS YOU MEET":N=1:RETURN +1260 PRINT "YOUR MIRROR KILLED THE BASILISK":GOTO 850 +1270 PRINT GY$:GOSUB 1390:PRINT HO$:FOR I=0 TO 10:PRINT TAB(15);:FOR J=0 TO 10 +1280 PRINT CH$(A(J,I)); +1290 NEXT J:PRINT:NEXT I:PRINT EP$;GN$:RETURN +1300 IF S<5 THEN 620 +1310 PRINT "A GIANT EAGLE CARRIED YOU TO SAFETY" +1320 PRINT :PRINT "YOU SURVIVED THE FOREST" +1330 PRINT "YOU WON A TREASURE TOTAL OF ";Q:PRINT "CONGRADULATIONS" + :PRINT "DO YOU WISH TO TRY AGAIN ? ";:GOTO 510 +1340 PRINT "THERE IS NOTHING TO BE FOUND HERE":GOTO 890 +1350 END +1360 '*********************************************************** +1370 ' THIS ROUTINE PRINTS BRIEF INSTRUCTIONS AND A COMPASS ROSE ON THE SCREEN. +1380 ' IT CAN BE REMOVED IF CONVERSION IS DIFFICULT, BUT LEAVE 'RETURN' IN. +1390 PRINT DC$;"!H";CH$(5);" = YOUR POSITION" +1400 PRINT DC$;"#H";CH$(2);" = TREE (YOU MUST GO AROUND THEM)" +1410 PRINT DC$;"%H";CH$(0);" = FIELD" +1420 PRINT DC$;"'U";"NW N NE" +1430 PRINT DC$;"(W";"y`x" +1440 PRINT DC$;")U";"W a^a E" +1450 PRINT DC$;"*W";"x`y" +1460 PRINT DC$;"+U";"SW S SE" +1470 RETURN +30 PRINT DC$;"(W";"y`x" +1440 PRINT DC$;")U";"W a^a \ No newline at end of file diff --git a/Source/Images/d_games/u0/NEMESIS.COM b/Source/Images/d_games/u0/NEMESIS.COM new file mode 100644 index 00000000..f3d003df Binary files /dev/null and b/Source/Images/d_games/u0/NEMESIS.COM differ diff --git a/Source/Images/d_games/u0/NEMESIS.TXT b/Source/Images/d_games/u0/NEMESIS.TXT new file mode 100644 index 00000000..530286f9 --- /dev/null +++ b/Source/Images/d_games/u0/NEMESIS.TXT @@ -0,0 +1,17 @@ +Nemesis and Dungeon Master +Copyright (c) 1981 +Michael Q. Hiller and Michael A. Pagels + +(Versiom 1.2 for CP/M 2.2) + +WELCOME to Nemesis...a unique role-playing game modeled after the +Dungeons and Dragons epic simulations. +Very generally, Nemesis is set in pre-history in a world not +unlike the one described by J.R.R. Tolkien in the "Rings' trilogy. + +The object of the game is to explore all levels of the +dungeons...and survive. + + + +File compilation by the MSPP Team :) \ No newline at end of file diff --git a/Source/Images/d_games/u0/PACMAN95.COM b/Source/Images/d_games/u0/PACMAN95.COM new file mode 100644 index 00000000..fcd577a0 Binary files /dev/null and b/Source/Images/d_games/u0/PACMAN95.COM differ diff --git a/Source/Images/d_games/u0/PERSON.COM b/Source/Images/d_games/u0/PERSON.COM new file mode 100644 index 00000000..2186fa94 Binary files /dev/null and b/Source/Images/d_games/u0/PERSON.COM differ diff --git a/Source/Images/d_games/u0/PLANET.COM b/Source/Images/d_games/u0/PLANET.COM new file mode 100644 index 00000000..9b346ae5 Binary files /dev/null and b/Source/Images/d_games/u0/PLANET.COM differ diff --git a/Source/Images/d_games/u0/PLANETFA.DAT b/Source/Images/d_games/u0/PLANETFA.DAT new file mode 100644 index 00000000..0ee7114b Binary files /dev/null and b/Source/Images/d_games/u0/PLANETFA.DAT differ diff --git a/Source/Images/d_games/u0/ROSE.BAS b/Source/Images/d_games/u0/ROSE.BAS new file mode 100644 index 00000000..62febaaf --- /dev/null +++ b/Source/Images/d_games/u0/ROSE.BAS @@ -0,0 +1,122 @@ +1 REM CLEAR SCREEN & VERT TAB 10 +10 PRINT TAB( 6)"** PETALS AROUND THE ROSE **" +20 FOR ZZ = 1 TO 3000: NEXT +30 PRINT : PRINT : PRINT +40 PRINT "DO YOU WISH INSTRUCTIONS "; +50 INPUT A$ +60 IF LEFT$ (A$,1) = "N" THEN 140 +70 PRINT +80 PRINT "THE NAME OF THE GAME IS 'PETALS AROUND" +90 PRINT "THE ROSE. THE NAME OF THE GAME IS" +95 PRINT "IMPORTANT. " +100 PRINT : PRINT "THE COMPUTER WILL ROLL FIVE DICE" +105 PRINT "AND ASK YOU FOR THE SCORE FOR THE" +110 PRINT "ROLL. THE SCORE WILL ALWAYS BE AN" +115 PRINT "EVEN NUMBER. GUESS 99 TO STOP PLAYING" +120 PRINT : PRINT " ** GOOD LUCK **" +125 PRINT : PRINT : PRINT : PRINT : INPUT "HIT RETURN TO CONTINUE";X$ +140 DIM L(7) +150 H = 0:G = 0:F = 0 +155 REM CLEAR SCREEN & VERT TAB 10 +180 FOR K = 1 TO 5 +190 A = INT (12 * RND (8)) +200 GOSUB 720 +210 F = 8 * F + C +220 G = 8 * G + D +230 H = H + B +240 NEXT K +250 PRINT : PRINT +270 FOR K = 1 TO 5 +280 L(K) = F - 8 * INT (F / 8) +290 M = L(K) +300 GOSUB 590 +310 F = INT (F / 8) +320 NEXT K +330 FOR K = 1 TO 5 +340 M = G - 8 * INT (G / 8) +350 GOSUB 590 +360 G = INT (G / 8) +370 NEXT K +380 H = H - 12 * INT (H / 12) +390 FOR K = 1 TO 5 +400 IF (L(K) - 1) * (L(K) - 4) < > 0 THEN 420 +410 L(K) = 5 - L(K) +420 M = L(K) +430 GOSUB 590 +440 NEXT K +450 PRINT : PRINT +470 PRINT "GUESS THE SCORE"; +480 INPUT K +490 IF K = 99 THEN 1110 +500 H = 2 * INT (H) +510 IF K = H THEN 570 +515 PRINT +520 PRINT " NO,IT'S ";H; +530 IF K - 2 * INT (K / 2) = 0 THEN 550 +540 PRINT " (THE SCORE IS ALWAYS EVEN) "; +545 FOR ZZ = 1 TO 2000: NEXT +550 PRINT +555 FOR ZZ = 1 TO 2000: NEXT +560 GOTO 150 +570 PRINT : PRINT : PRINT TAB( 16)"...YES..." +575 FOR ZZ = 1 TO 2000: NEXT +580 GOTO 150 +590 FOR N = 0 TO 2 +600 IF M > 3 THEN 630 +610 PRINT" "; +620 GOTO 650 +630 M = M - 4 * INT (M / 4) +640 PRINT " O"; +650 M = 2 * M +660 NEXT N +670 IF K = 5 THEN 700 +680 PRINT" "; +690 RETURN +700 PRINT +710 RETURN +720 B = 6 + RND (7) / 6 +730 C = 0 +740 D = 0 +750 IF A > 3 THEN 890 +760 B = B + 3 +770 IF A > 1 THEN 810 +780 D = D + 2 +790 B = B + 3 +800 RETURN +810 C = C + 1 +820 B = B + 1 +830 IF A > 2 THEN 780 +840 B = B + 11 +850 GOTO 790 +860 C = C + 1 +870 IF A > 2 THEN 790 +880 GOTO 780 +890 C = C + 4 +900 B = B + 2 +910 IF A > 5 THEN 970 +920 B = B + 2 +930 IF A < 5 THEN 950 +940 GOTO 780 +950 B = B + 11 +960 GOTO 790 +970 C = C + 1 +980 B = B + 8 +990 IF A > 6 THEN 1030 +1000 D = D + 3 +1010 B = B + 5 +1020 GOTO 780 +1030 IF A > 7 THEN 1070 +1040 B = B + 5 +1050 C = C + 1 +1060 GOTO 860 +1070 B = B + 7 +1080 IF A < 10 THEN 780 +1090 B = B + 10 +1100 GOTO 790 +1110 PRINT " THE SCORE WAS ";2 * INT (H) +O 860 +1070 B = B + 7 +1080 IF A < 10 THEN 780 +1090 B = B + 10 +1100 GOTO 790 +11 \ No newline at end of file diff --git a/Source/Images/d_games/u0/SARGON.COM b/Source/Images/d_games/u0/SARGON.COM new file mode 100644 index 00000000..bef30ee8 Binary files /dev/null and b/Source/Images/d_games/u0/SARGON.COM differ diff --git a/Source/Images/d_games/u0/STAR.BAS b/Source/Images/d_games/u0/STAR.BAS new file mode 100644 index 00000000..45044f42 --- /dev/null +++ b/Source/Images/d_games/u0/STAR.BAS @@ -0,0 +1,1137 @@ +10 REM NAME- STAR TREK +20 REM +30 REM ORIGIN- BILL PETERSON, CAL TECH, 1971. REVISED MARCH 1972 BY DON +40 REM L. DAGLOW OF I.E.C. AND POMONA COLLEGE. +50 REM +60 REM VERSION-- 32-8, WITH 3 DIMENSIONS & MANY OTHER CHANGES. MAY 14, 1973. DON L. DAGLOW. +75 REM ASSISTANCE ALSO RENDERED BY J. OSSER, POMONA COLLEGE, +76 REM AND M. LIEBMANN, BEVERLY HILLS H.S. +80 REM +90 REM VERSION 32-9 MODIFIED TO RUN UNDER EITHER CBASIC OR EBASIC COMPILERS +92 REM WITH OTHER MODIFICATIONS AND ENHANCEMENTS +95 REM BY JAMES UNDERWOOD --- JUNE 22 1981 +96 REM (NOTE: CURRENTLY CONFIGURED FOR EBASIC) +97 REM (FOR CBASIC, INCREASE TAB NUMBERS IN LINE 3992 BY 1) +99 REM (CAN ALSO BE RUN UNDER 'BASCOM' IF: 1:MAKE ABOVE CHANGE,) +101 REM (2:REMOVE RANDOMIZE, 3:CHANGE ALL RND'S TO RND(1)) +105 REM +110 REM TABLE OF VARIABLES IS AT LINE 64000 +120 REM +122 DIM S1(4),S2(4) +125 PRINT "HOW MANY MISSIONS HAVE YOU COMMANDED"; +127 INPUT A$ +128 REM ABOVE INPUT NECCESSARY TO SEED RANDOMIZE +130 RANDOMIZE +132 FOR I=1 TO 6 +135 PRINT +137 NEXT I +140 DIM O$(23) +150 V$="32-9" +152 REM UTILITY FUNCTIONS +156 DEF FNO(A)=2.66*(ABS(45-(ABS(A)))+5)/100 +158 DEF FNZ(R,C)=ABS(SGN(-1+(SGN(ABS(R)-C)))) +160 REM REAR OR FORWARD WEAPONS DEFINITION +165 DEF FND(B)=INT(ABS(B/90)) +170 REM BUILDING BLOCK FOR PHASER & P.T. FUNCTIONS +172 DEF FNX(B)=3.1415926*ABS(90-ABS(B))/180 +175 DEF FNY(B,C)=SIN(FNX(B))*(C-FND(B))/C +180 REM PHOTON TORPEDO FUNCTION: 3D +190 DEF FNT(R,B,A)=FNZ((R-500),200)*(1-((R-500)*(R-500))/40000)*FNY(B,3)*FNO(A) +245 REM PHASER FUNCTION: 3D +250 DEF FNP(R,B,A)=FNZ(R,400)*(1-((R-200)*(R-200))/40000)*FNY(B,5)*FNO(A) +330 REM CHOOSE DESTINATION +335 R9=INT(RND*10)+1 +340 FOR I=1 TO 10 +350 READ L$ +355 IF I=R9 THEN 365 +360 NEXT I +362 GOTO 420 +365 D$=L$ +367 GOTO 360 +370 DATA BETA AURIGAE 5, GAMMA TRISKELLION 7 +380 DATA EPSILON CYGNI 2, ALPHA ARCTURUS 4 +390 DATA DELTA CANOPIS 12, OMICRON BETELGEUSE 27 +400 DATA SIGMA RIGEL 3, KAPPA SIRIUS 8 +410 DATA ALPHA CENTAURI 5,DELTA ALDEBARAN 9 +420 REM CHOOSE OUR SHIP +425 R9=INT(RND*24)+1 +430 FOR I=1 TO 24 +440 READ N$ +445 IF I=R9 THEN 455 +450 NEXT I +452 GOTO 520 +455 S$=N$ +457 GOTO 450 +460 DATA ENTERPRISE,VALIANT,HOOD,ENTERPRISE +470 DATA DEFIANT,ENTERPRISE,EXCALIBUR,EXETER +480 DATA LEXINGTON,YORKTOWN,REPUBLIC,CONSTITUTION +490 DATA FARRAGUT,KONGO,CONSTELLATION,INTREPID +500 DATA BAYERN,"CORAL SEA",GETTYSBURG,ENTERPRISE +510 DATA BASTOGNE,ENTERPRISE,CONCORD,COURAGE +520 REM CHOOSE ENEMY NATION +525 R9=INT(RND*10)+1 +530 FOR I=1 TO 10 +540 READ K7$ +545 IF R9=I THEN 555 +550 NEXT I +552 GOTO 590 +555 E1$=K7$ +557 GOTO 550 +560 DATA KLINGON,ROMULAN,THOLIAN +570 DATA KALANDAN,SCALOSIAN,KELVAN,TALOSIAN +580 DATA MELKOTIAN,ANDRAN,COLUSIAN +590 REM CHOOSE ENEMY SHIP +595 R9=INT(RND*14)+1 +600 FOR I=1 TO 14 +610 READ K8$ +615 IF R9=I THEN 625 +620 NEXT I +622 GOTO 660 +625 E2$=K8$ +627 GOTO 620 +630 DATA KRULIX,GRANAK,SLORK,QUARLO,TROBLAK +640 DATA PHILTOK,RHYLIX,BIESTAK,CORUDA,ZIKAL +650 DATA SAYADA,ZARU,FESARIUS,SKULZIA +660 REM CHOOSE ENEMY CAPTAIN +665 R9=INT(RND*19)+1 +670 FOR I=1 TO 19 +680 READ K9$ +685 IF R9=I THEN 695 +690 NEXT I +692 GOTO 730 +695 E3$=K9$ +697 GOTO 690 +700 DATA TRAKKA,KURDA,VARNOR,GRANOLT,SHLURG +710 DATA KORAX,KANG,KOLOTH,LOSIRA,SYBO +720 DATA CONNORS,EORR,BALOK,LOSKENE +725 DATA ROJAN,KELINDA,BERATTIS,REDJAC,KESLA +730 REM COMMAND RESPONSE VERBALIZATIONS +740 FOR I=1 TO 23 +750 READ O$(I) +760 NEXT I +770 DATA ENEMY RANGE AND BEARING +780 DATA FIRE FORWARD PHASERS,FIRE REAR PHASERS +790 DATA FIRE FORWARD PHOTON TORPEDOES,FIRE REAR PHOTON TORPEDOES +800 DATA LAUNCH ANTIMATTER PROBE,CLOSE ON ENEMY VESSEL +810 DATA MOVE AWAY FROM ENEMY,CLOSE AT WARP SPEED +820 DATA MOVE AWAY AT WARP SPEED +830 DATA "OPTIMUM SHIELD DEFENSE, MR. SULU" +840 DATA "180 DEGREES ABOUT, MR. SULU" +850 DATA "FIRING PROBABILITIES, MR. SPOCK" +860 DATA "A BRIEFING, MR. SPOCK","DAMAGE REPORT, MR. SPOCK" +870 DATA "OPEN A CHANNEL TO STAR FLEET, LIEUTENANT" +880 DATA "LET'S SEE WHAT THE ENEMY DOES NEXT" +890 DATA "ACTIVATE AUTO-DESTRUCT SEQUENCE" +900 DATA "OPEN A CHANNEL TO THE ENEMY VESSEL, LIEUTENANT" +910 DATA "MR. SPOCK, TAKE COMMAND. I'M GOING TO LEAD A BOARDING PARTY." +920 DATA "A WEAPONS BRIEFING, MR. SPOCK." +930 DATA "WEAPON POWER BANKS STATUS REPORT, MR. SPOCK." +940 DATA "PREPARE TO ALLOCATE SHIELD POWER TO WEAPONS BANKS." +1020 PRINT +1030 IF G9>0 THEN 1400 +1049 REM +1050 REM BEGINNING OF MAIN PROGRAM +1051 REM +1120 PRINT "SPACE, THE FINAL FRONTIER." +1130 PRINT "THIS IS A VOYAGE OF THE STARSHIP ";S$;"." +1140 PRINT "NOW ON ITS SECOND FIVE YEAR MISSION;" +1150 PRINT "ITS TASK: TO EXPLORE STRANGE NEW WORLDS," +1160 PRINT "TO SEEK OUT NEW LIFE AND NEW CIVILIZATIONS," +1170 PRINT "TO BOLDLY GO WHERE NO MAN HAS GONE BEFORE." +1180 PRINT +1190 PRINT +1200 PRINT TAB(20);"S T A R T R E K" +1210 PRINT TAB(20);"=================" +1220 PRINT +1222 V8=0 +1230 PRINT +1240 PRINT "YEOMAN: WOULD YOU PLEASE ENTER YOUR NAME FOR" +1250 PRINT " THE LOG, SIR"; +1260 INPUT C$ +1262 IF C$<>"" THEN 1270 +1265 C$="KIRK" +1270 C9$=C$ +1280 PRINT "SPOCK: YOU ARE IN COMMAND OF THE ";S$;", CAPTAIN ";C$;"." +1290 PRINT " DO YOU WISH A LIST OF THE POSSIBLE COMMANDS, SIR"; +1300 INPUT A$ +1305 IF A$="" THEN 1300 +1310 IF LEFT$(A$,1)<>"Y" THEN 1335 +1320 GOSUB 7760 +1330 GOSUB 8330 +1335 PRINT " THIS VESSEL IS NOW A VERSION ";V$;" STARSHIP;" +1340 PRINT " DO YOU WISH A BRIEFING ON RECENT ";S$;" MODIFICATIONS"; +1350 INPUT A$ +1355 IF A$="" THEN 1350 +1360 IF LEFT$(A$,1)<>"Y" THEN 1400 +1370 GOSUB 11000 +1400 Y=50*(RND-.5) +1405 PRINT +1410 REM TELL WHERE WE'RE GOING AND WHY +1420 PRINT C$;": CAPTAIN'S LOG, STAR DATE ";2047+(RND*47) +1430 PRINT " WE ARE PRESENTLY ON COURSE FOR ";D$ +1440 ON INT(RND*10)+1 GOTO 1450,1470,1490,1520,1550,9530,9560,9590,9610,9630 +1450 PRINT " TO INVESTIGATE REPORTS OF ";E1$;" SABOTAGE." +1460 GOTO 1570 +1470 PRINT " TO EVACUATE FEDERATION CITIZENS FROM THAT WAR-TORN PLANET." +1480 GOTO 1570 +1490 PRINT " TO ASSIST IN PUTTING DOWN A STRIKE BY DILITHIUM MINERS" +1500 PRINT " ON THAT PLANET." +1510 GOTO 1570 +1520 PRINT " WITH A TEAM OF ASTROGEOLOGISTS TO INVESTIGATE REPORTS OF" +1530 PRINT " VALUABLE MINERAL DEPOSITS ON THAT NEWLY COLONIZED PLANET." +1540 GOTO 1570 +1550 PRINT " FOR ASTROPHYSICAL RESEARCH ON THE NEBULA IN THAT QUADRANT." +1560 REM TELL WHO ENEMY IS +1570 IF RND>.5 THEN 1600 +1580 PRINT "SULU: SIR, I'M PICKING UP A VESSEL ON AN ATTACK VECTOR" +1585 PRINT " WITH THE ";S$;"." +1590 GOTO 1640 +1600 PRINT "SULU: SIR, I THINK WE'RE BEING FOLLOWED; THERE'S A SHIP" +1610 PRINT " ON THE SAME COURSE AS THE ";S$ +1640 PRINT "SPOCK: SHIP'S COMPUTERS INDICATE THAT IT IS THE "; +1650 PRINT E1$;" VESSEL " +1660 PRINT " ";E2$;" UNDER THE COMMAND OF CAPTAIN ";E3$;"." +1670 IF E3$<>"CONNORS" THEN 1740 +1680 PRINT C$;": CONNORS...THE ONLY STARSHIP COMMANDER EVER TO DEFECT" +1690 PRINT " TO AN ENEMY EMPIRE. MR. SPOCK, IT LOOKS AS IF WE MAY HAVE" +1700 PRINT " A CHANCE TO SETTLE AN OLD SCORE FOR THE FEDERATION." +1710 PRINT "SPOCK: INDEED, SIR." +1720 PRINT "CHEKOV: JUST WAIT REMTIL I GET MY PHASERS LOCKED IN ON THAT" +1730 PRINT " TRAITOR..." +1740 IF RND>.5 THEN 1770 +1750 PRINT C$;": SOUND RED ALERT, LIEUTENANT UHURA." +1760 GOTO 1780 +1770 PRINT C$;": SOUND BATTLE STATIONS, LIEUTENANT UHURA." +1780 PRINT "UHURA: AYE, SIR." +1790 IF RND>.5 THEN 1830 +1800 REM ESTABLISH MAIN SPEAKER (CHEKOV OR SULU) +1810 X$="SULU" +1820 GOTO 1840 +1830 X$="CHEKOV" +1840 H1=0 +1841 H2=0 +1842 G=0 +1843 X=0 +1844 S=0 +1845 M6=0 +1846 X2=0 +1847 K9=0 +1848 M5=0 +1849 P=0 +1860 REM ESTABLISH EVERYBODY'S SHIELDS AT 100% +1870 FOR Q5=1 TO 4 +1880 S1(Q5)=100 +1890 S2(Q5)=100 +1900 NEXT Q5 +1910 REM ESTABLISH ALL WEAPON POWER BANKS AT 300 +1920 P1=300 +1925 P2=300 +1930 REM FIRST RANGE AND BEARING +1940 R=1000-100*RND +1950 B=360*(RND-.5) +1960 B1=360*(RND-.5) +1970 REM +1980 REM TELL BEARING AND GET ORDERS +2000 REM +2010 GOSUB 8060 +2020 PRINT X$;": ORDERS, SIR"; +2030 INPUT I +2120 IF I<1 THEN 2140 +2130 IF I<24 THEN 2160 +2140 PRINT X$;": PLEASE SAY AGAIN, SIR"; +2150 GOTO 2030 +2160 PRINT C$;": ";O$(I) +2170 REM EXECUTE ORDERS +2180 IF I>20 THEN 2240 +2190 IF I>12 THEN 2230 +2200 IF I>6 THEN 2220 +2210 ON I GOTO 2000,2260,2310,2360,2420,2480 +2220 ON (I-6) GOTO 2520,2520,2560,2560,3750,2520 +2230 ON (I-12) GOTO 3880,3910,3940,2600,5140,4790,4940,9200 +2240 ON (I-20) GOTO 9890,10060,10100 +2250 REM MAKE SURE WEAPON SPECIFIED IS INTACT +2260 IF R>400 THEN 9490 +2270 IF H1<7 THEN 2710 +2280 PRINT "CHEKOV: FORWARD PHASERS ARE DEAD, SIR." +2290 GOSUB 8560 +2300 GOTO 5140 +2310 IF R>400 THEN 9490 +2320 IF H1<6 THEN 3240 +2330 PRINT "CHEKOV: REAR PHASER IS DEAD, SIR." +2340 GOSUB 8560 +2350 GOTO 5140 +2360 IF R<300 THEN 9490 +2370 IF R>700 THEN 9490 +2380 IF H1<9 THEN 3260 +2390 PRINT "CHEKOV: FORWARD PHOTON TORPEDOES ARE DEAD, SIR." +2400 GOSUB 8560 +2410 GOTO 5140 +2420 IF R<300 THEN 9490 +2430 IF R>700 THEN 9490 +2440 IF H1<8 THEN 3360 +2450 PRINT "CHEKOV: REAR PHOTON TORPEDO IS DEAD, SIR." +2460 GOSUB 8560 +2470 GOTO 5140 +2480 IF H1<12 THEN 3390 +2490 PRINT "CHEKOV: PROBE LAUNCHER IS DEAD, SIR." +2500 GOSUB 8560 +2510 GOTO 5140 +2520 IF H1<14 THEN 3550 +2530 PRINT "SULU: IMPULSE ENGINES ARE DEAD, SIR." +2540 GOSUB 8560 +2550 GOTO 5140 +2560 IF H1<11 THEN 3550 +2570 PRINT "SULU: WARP DRIVE IS DEAD, SIR." +2580 GOSUB 8560 +2590 GOTO 5140 +2600 IF H2<11 THEN 2630 +2610 PRINT "SPOCK: THE ";E1$;" HAS NO ENGINES, SIR." +2620 GOTO 5140 +2630 IF G=0 THEN 4460 +2640 PRINT "SPOCK: I DO NOT THINK THAT THE ";E1$;"S WILL BE FOOLED" +2650 PRINT " BY THAT MANEUVER AGAIN, SIR." +2660 GOSUB 8560 +2670 G=G+1 +2680 IF G=3 THEN 8750 +2690 GOTO 5140 +2700 REM TELL WHAT WE DO, COMPUTE SUCCESS: PHASERS +2710 IF ABS(B)<90 THEN 2770 +2730 PRINT "CHEKOV: INCORRECT VECTOR, SIR." +2740 M5=M5+1 +2750 IF M5>3 THEN 8750 +2760 GOTO 5140 +2770 P9=(RND*10)+5 +2790 P1=P1-P9 +2800 IF P1>0 THEN 2830 +2810 GOSUB 10000 +2820 GOTO 5140 +2830 IF RND=S2(K1) THEN 2920 +2910 K=K1 +2920 NEXT K1 +2930 IF S2(K)>50 THEN 2950 +2940 K=INT(RND*4+1) +2950 H2=H2+V +2960 PRINT "SPOCK: A HIT ON SHIELD #";K;"." +2970 IF S2(K)=0 THEN 3090 +2980 S2(K)=S2(K)-30*V*(RND+.1) +3000 IF S2(K)>0 THEN 3030 +3010 PRINT "SPOCK: THAT SHIELD IS NOW GONE."; +3015 PRINT CHR$(7);CHR$(7);CHR$(7);CHR$(7);CHR$(7);CHR$(7);CHR$(7);CHR$(7) +3020 S2(K)=0 +3030 GOSUB 9650 +3040 GOTO 5140 +3045 REM DIRECT HIT +3050 V=1 +3060 PRINT "CHEKOV: DIRECT HIT, SIR!" +3070 GOTO 2880 +3080 REM ENEMY IS CRIPPLED +3090 PRINT "CHEKOV: GOT HIM, SIR!" +3100 IF RND<.5 THEN 7640 +3110 PRINT "SPOCK: THE ";E1$;" VESSEL REMAINS INTACT, CAPTAIN." +3120 PRINT C$;": OPEN A HAILING FREQUENCY, LIEUTENANT." +3130 PRINT "UHURA: HAILING FREQUENCY OPEN, SIR." +3140 PRINT C$;": THIS IS CAPTAIN ";C$;" OF THE STARSHIP ";S$;"." +3150 PRINT " PREPARE TO COMMENCE BEAMING OVER SURVIVORS." +3160 IF RND<.5 THEN 3210 +3170 PRINT E3$;": I AM AFRAID THAT WILL BE QUITE IMPOSSIBLE," +3180 PRINT " CAPTAIN, SINCE WE HAVE JUST INITIATED OUR AUTO-DESTRUCT." +3190 PRINT " 10 9 8 7 6 5 4 3 2 1" +3200 GOTO 7640 +3210 PRINT E3$;": VERY WELL, CAPTAIN. OUR SHIELDS HAVE BEEN DEACTIVATED." +3220 GOTO 8150 +3230 REM TELL WHAT WE DO, COMPUTE SUCCESS: PHOTON TORPEDOES +3240 IF ABS(B)<90 THEN 2730 +3250 GOTO 2770 +3260 IF ABS(B)>=90 THEN 2730 +3270 P9=(RND*9)+5 +3290 P1=P1-P9 +3300 IF P1>0 THEN 3330 +3310 GOSUB 10000 +3320 GOTO 5140 +3330 IF RND>FNT(R,B,B9) THEN 2840 +3340 IF RND<.375 THEN 2870 +3350 GOTO 3050 +3360 IF ABS(B)<90 THEN 2730 +3370 GOTO 3270 +3380 REM ANTIMATTER PROBES +3390 IF X<10 THEN 3430 +3400 PRINT "CHEKOV: WE HAVE NO MORE PROBES, SIR." +3410 GOSUB 8560 +3420 GOTO 5280 +3430 X=X+1 +3450 Z4=RND +3460 IF Z4<.07135 THEN 3510 +3470 PRINT "CHEKOV: PROBE MISSED BY ";(Z4*100)-7.135;"MGM., SIR." +3480 IF (Z4*100)-7.135>5 THEN 3500 +3490 PRINT "SULU: ALMOST GOT HIM THAT TIME, SIR!" +3500 GOTO 5140 +3510 PRINT "SPOCK: PROBE IS HOMING ON THE ";E2$;" , SIR." +3520 V=3 +3530 GOTO 2880 +3540 REM OUR MOVE IMPLEMENTATION +3550 ON (I-6) GOTO 3570,3610,3660,3700,3750,3830 +3560 REM CLOSE ON ENEMY +3570 GOSUB 6660 +3580 R=ABS(R-Y) +3590 GOTO 5140 +3600 REM MOVE AWAY FROM ENEMY +3610 GOSUB 6730 +3620 R=ABS(R+Y) +3630 IF R>5000 THEN 6550 +3640 GOTO 5140 +3650 REM CLOSE AT WARP SPEED +3660 GOSUB 6780 +3670 R=ABS(R-2*Y) +3680 GOTO 5140 +3690 REM ESCAPE AT WARP SPEED +3700 GOSUB 6850 +3710 R=ABS(R+2*Y) +3720 IF R>5000 THEN 6550 +3730 GOTO 5140 +3740 REM PUT STRONGEST SHIELD IN POSITION +3750 S=1 +3760 FOR J=2 TO 4 +3770 IF S1(J)<=S1(S) THEN 3790 +3780 S=J +3790 NEXT J +3800 PRINT "SULU: SHIELD #";S;" IS IN POSITION." +3810 GOTO 2000 +3820 REM 180 DEGREES ABOUT +3830 B=B+180 +3832 B5=1 +3835 R=R+.0001 +3840 IF B<=180 THEN 5140 +3850 B=B-360 +3860 GOTO 5140 +3870 REM TELL PROBABILITIES +3880 PRINT "SPOCK: PHASERS:";FNP(R,B,B9)*100;"%, P.T.'S:"; +3885 PRINT FNT(R,B,B9)*100;"%." +3890 GOTO 2000 +3900 REM FEEDER FOR COMMANDS REPETITION +3910 GOSUB 7760 +3920 GOTO 2000 +3930 REM DAMAGE REPORT +3940 PRINT "SPOCK: COMPUTER DAMAGE REPORT:" +3950 PRINT TAB(10);"UNITS OF POWER REMAINING" +3960 PRINT TAB(6);"SHIELD #";TAB(16);S$;TAB(30);E2$ +3965 E=0 +3967 U=0 +3970 FOR J=1 TO 4 +3980 PRINT TAB(9);J;TAB(16);S1(J);TAB(30);S2(J) +3985 E=E+S2(J) +3987 U=U+S1(J) +3990 NEXT J +3992 PRINT TAB(9);"=";TAB(16);"=======";TAB(30);"=======" +3995 PRINT " COMPOSITE";TAB(16);U/4;TAB(30);E/4 +4000 PRINT S$;" DAMAGE:"; +4010 IF H1>5.5 THEN 4040 +4020 PRINT TAB(20);"NONE" +4030 GOTO 4180 +4040 PRINT TAB(20);"REAR PHASER DEAD" +4050 IF H1<7 THEN 4180 +4060 PRINT TAB(20);"FORWARD PHASERS DEAD" +4070 IF H1<8 THEN 4180 +4080 PRINT TAB(20);"REAR PHOTON TORPEDOES DEAD" +4090 IF H1<9 THEN 4180 +4100 PRINT TAB(20);"FORWARD PHOTON TORPEDOES DEAD" +4110 IF H1<11 THEN 4180 +4120 PRINT TAB(20);"TRANSPORTER LOST" +4130 PRINT TAB(20);"WARP DRIVE LOST" +4140 IF H1<12 THEN 4180 +4150 PRINT TAB(20);"PROBE LAUNCHER DESTROYED" +4160 IF H1<14 THEN 4180 +4170 PRINT TAB(20);"IMPULSE POWER LOST" +4180 PRINT E2$;" DAMAGE:"; +4190 IF H2>5.5 THEN 4220 +4200 PRINT TAB(20);"NONE" +4210 GOTO 4360 +4220 PRINT TAB(20);"REAR PHASERS DEAD" +4230 IF H2<7 THEN 4360 +4240 PRINT TAB(20);"FORWARD PHASERS DEAD" +4250 IF H2<8 THEN 4360 +4260 PRINT TAB(20);"REAR PHOTON TORPEDOES DEAD" +4270 IF H2<9 THEN 4360 +4280 PRINT TAB(20);"FORWARD PHOTON TORPEDOES DEAD" +4290 IF H2<11 THEN 4360 +4300 PRINT TAB(20);"TRANSPORTER LOST" +4310 PRINT TAB(20);"WARP DRIVE DEAD" +4320 IF H2<12 THEN 4360 +4330 PRINT TAB(20);"PROBE LAUNCHER DESTROYED" +4340 IF H2<14 THEN 4360 +4350 PRINT TAB(20);"IMPULSE ENGINES DEAD" +4360 PRINT "PROBES EXPENDED:" +4380 PRINT " ";S$;TAB(20);X +4390 PRINT " ";E2$;TAB(20);X2 +4400 PRINT "POWER REMAINING IN WEAPONS BANKS:" +4410 PRINT " ";S$;TAB(20);P1 +4420 PRINT " ";E2$;TAB(20);P2 +4440 GOTO 2000 +4450 REM CORBOMITE BLUFF +4460 PRINT C$;": USE CODE 2." +4470 PRINT "UHURA: CODE 2, SIR? THE ";E1$;"S BROKE CODE 2 YESTERDAY, SIR." +4480 PRINT C$;": CODE 2, LIEUTENANT. IMMEDIATELY." +4490 PRINT "UHURA: AYE, SIR. GO AHEAD, SIR." +4500 PRINT C$;": THIS IS CAPTAIN ";C$;" OF THE STARSHIP ";S$;"." +4510 PRINT " WE ARE UNDER ATTACK BY THE ";E1$;" SHIP ";E2$ +4520 PRINT " AND, IN ORDER TO PREVENT THE ";S$;" FROM FALLING" +4530 PRINT " INTO ENEMY HANDS, WE ARE ACTIVATING THE CORBOMITE" +4540 PRINT " DEVICE. SINCE THIS WILL RESULT IN THE COMPLETE" +4550 PRINT " ANNIHILATION OF ALL MATTER WITHIN A RANGE OF 5000" +4560 PRINT " MEGAMETERS, ALL VESSELS SHOULD BE WARNED TO STAY" +4570 PRINT " CLEAR OF THIS AREA FOR THE NEXT ";INT(RND*4)+2;" SOLAR YEARS." +4620 G=1 +4630 IF RND>.25 THEN 4740 +4640 PRINT "SULU: ";E1$;" IS MOVING AWAY AT WARP 10, SIR." +4650 PRINT "SPOCK:THE TACTIC APPEARS TO HAVE BEEN EFFECTIVE, SIR." +4660 PRINT " THE ";E1$;" HAS BEEN REPULSED." +4710 GOTO 6560 +4740 PRINT "SULU:NO IMMEDIATE CHANGE IN ";E1$;" COURSE AND SPEED, SIR." +4750 PRINT "SPOCK: IT WOULD SEEM THAT THEY HAVE, AS YOU HUMANS PUT IT," +4760 PRINT " 'CALLED OUR BLUFF', CAPTAIN." +4770 GOTO 5140 +4780 REM BLOW UP OUR SHIP +4790 PRINT "SPOCK: ARE YOU SURE, SIR"; +4800 INPUT A$ +4805 IF A$="" THEN 4800 +4810 IF LEFT$(A$,1)<>"N" THEN 4830 +4820 GOTO 2000 +4830 IF H1<9 THEN 8750 +4840 PRINT "COMPUTER: 10 9 8 7 6 5 4 3 2 1" +4850 PRINT " THE ";S$;" HAS BEEN DESTROYED." +4860 Q=200*RND +4870 PRINT " RADIUS OF EXPLOSION:";Q;" MGM." +4880 IF Q>=R THEN 4910 +4890 PRINT " ";E1$;" VESSEL REMAINS INTACT." +4900 GOTO 8150 +4910 PRINT " ";E1$;" VESSEL DESTROYED." +4920 GOTO 8150 +4930 REM SURRENDER TO ENEMY +4940 PRINT "UHUPA: ARE YOU SURE, SIR"; +4950 INPUT A$ +4955 IF A$="" THEN 4950 +4960 IF LEFT$(A$,1)<>"N" THEN 4980 +4970 GOTO 2000 +4980 IF H1<11 THEN 8750 +4990 IF E1$<>"ROMULAN" THEN 5020 +5000 PRINT "UHURA: NO ANSWER FROM THE ";E2$;", SIR." +5010 GOTO 5140 +5020 PRINT C$;": THIS IS CAPTAIN ";C$;" OF THE STARSHIP ";S$;"." +5030 PRINT " WILL YOU ACCEPT OUR UNCONDITIONAL SURRENDER?" +5050 PRINT E3$;": ON BEHALF OF THE ";E1$;" EMPIRE, I ACCEPT YOUR" +5060 PRINT " UNCONDITIONAL SURRENDER. PREPARE FOR IMMEDIATE BOARDING." +5120 GOTO 8150 +5130 REM +5140 REM PRIMARY ENEMY DECISION SECTION +5150 REM +5151 IF R>5000 THEN 6550 +5160 REM ENEMY TRANSPORTER FEEDER +5150 IF H2>10.9 THEN 5200 +5180 IF H1>8.9 THEN 5200 +5190 IF RND>.997 THEN 9000 +5200 REM FEED TO ENGINES & WEAPONS +5210 IF H2<9 THEN 5230 +5220 IF R<35 THEN 6590 +5230 IF H2>13.9 THEN 6440 +5240 IF H1<9 THEN 5280 +5250 IF R>100 THEN 5280 +5260 IF H2>11.9 THEN 5750 +5270 GOTO 5850 +5280 IF R>700 THEN 5470 +5290 IF H2<11.9 THEN 5330 +5300 IF H1>10.9 THEN 6440 +5310 IF X>9 THEN 6440 +5320 GOTO 5700 +5330 IF H2<9 THEN 5360 +5340 IF X2>9 THEN 5800 +5345 IF RND>.5 THEN 5800 +5350 GOTO 8890 +5355 REM P.T.'S +5360 IF FNP(R,B1,A9)>FNT(R,B1,A9) THEN 5410 +5370 IF H2<8 THEN 5650 +5380 IF ABS(B1)<90 THEN 5650 +5390 IF H1<7 THEN 5850 +5400 GOTO 5550 +5405 REM PHASERS +5410 IF H2>6.9 THEN 5650 +5420 IF R>400 THEN 5800 +5430 IF H2<5.5 THEN 5600 +5440 IF ABS(B1)< 90 THEN 5600 +5450 IF H1<5.5 THEN 5850 +5460 GOTO 5550 +5470 REM BEYOND 700 MGM. DECISION SUBSECTION +5480 IF H2>11.9 THEN 5700 +5490 IF H2<9 THEN 5800 +5500 IF X2>9 THEN 5700 +5510 GOTO 8890 +5550 REM 180 DEGREES ABOUT +5555 B5=1 +5560 B1=B1+180 +5565 R=R+.0001 +5570 IF B1<=180 THEN 2000 +5580 B1=B1-360 +5590 GOTO 2000 +5600 REM PHASER FEEDER +5605 IF FNP(R,B1,A9)<.4 THEN 5620 +5610 IF ABS(B1-90)>=ABS(B-90)-20 THEN 7110 +5620 R=R+Y +5630 B1=360*(RND-.5) +5640 GOTO 2000 +5650 REM P.T. FEEDER +5655 IF R<300 THEN 5750 +5657 IF R>700 THEN 5700 +5660 IF ABS(B1-90)>=ABS(B-90)-20 THEN 6920 +5670 GOTO 5620 +5700 REM MOVE CLOSER TO US +5710 GOSUB 6660 +5720 R=ABS(R+Y) +5730 GOTO 2000 +5750 REM MOVE AWAY FROM US +5760 GOSUB 6730 +5770 R=ABS(R-Y) +5780 GOTO 2000 +5800 REM WARP CLOSER TO US +5810 GOSUB 6780 +5820 R=ABS(R+2*Y) +5830 GOTO 2000 +5850 REM WARP AWAY FROM US +5860 GOSUB 6850 +5870 R=ABS(R-2*Y) +5880 GOTO 2000 +5980 REM TELL ABOUT ANY NEW LOSSES +5990 IF H1<6 THEN 6300 +6000 T=H1-V +6010 IF ABS(T-6)<.1 THEN 6050 +6020 IF ABS(H1-6.25)>.3 THEN 6050 +6030 PRINT "CHEKOV: REAR PHASER DEAD, SIR." +6040 GOTO 6300 +6050 IF ABS(T-7)<.1 THEN 6090 +6060 IF ABS(H1-7.25)>.3 THEN 6090 +6070 PRINT "CHEKOV: FORWARD PHASERS DEAD, SIR." +6080 GOTO 6300 +6090 IF ABS(T-8)<.1 THEN 6130 +6100 IF ABS(H1-8.25)>.3 THEN 6130 +6110 PRINT "CHEKOV: REAR PHOTON TORPEDOES DEAD, SIR." +6120 GOTO 6300 +6130 IF ABS(T-9)<.1 THEN 6170 +6140 IF ABS(H1-9.25)>.3 THEN 6170 +6150 PRINT "CHEKOV: FORWARD PHOTON TORPEDOES DEAD, SIR." +6160 GOTO 6300 +6170 IF ABS(T-10)<.1 THEN 6200 +6180 IF ABS(H1-10.25)>.3 THEN 6200 +6190 PRINT "CHEKOV: FIRE REPORTED ON DECK";INT(RND*9)+1;", SIR." +6200 IF ABS(T-11)<.1 THEN 6240 +6210 IF ABS(H1-11.25)>.3 THEN 6240 +6220 PRINT "CHEKOV: TRANSPORTER AND WARP DRIVE GONE, SIR" +6225 PRINT "UHURA: SIR, ENGINEERING REPORTS THEY'RE ON AUXILIARY" +6226 PRINT " SYSTEMS. SCOTTY SAYS THE PRIMARY CONTROLS ARE" +6227 PRINT " IRREPARABLE." +6230 GOTO 6300 +6240 IF ABS(T-12)<.1 THEN 6270 +6250 IF ABS(H1-12.25)>.3 THEN 6270 +6260 PRINT "CHEKOV: PROBE LAUNCHER GONE, SIR" +6270 IF ABS(T-13)<.1 THEN 6278 +6272 IF ABS(H1-13.25)>.3 THEN 6278 +6275 PRINT "CHEKOV: PRIMARY LIFE SUPPORT SYSTEMS INOPERATIVE, SIR." +6276 PRINT " EMERGENCY LIFE SUPPORT NOW IN USE." +6278 IF ABS(T-14)<.1 THEN 6300 +6280 IF ABS(H1-14.25)>.3 THEN 6300 +6290 PRINT "CHEKOV: IMPULSE ENGINES DEAD, SIR." +6295 PRINT "UHURA: SICKBAY REPORTS THEY ARE UNABLE TO TEND TO ANY MORE" +6296 PRINT " WOUNDED, SIR." +6300 IF ABS(T-15)<.1 THEN 6350 +6310 IF ABS(H1-15.25)>.3 THEN 6350 +6320 PRINT "CHEKOV: THE FIRES BELOWDECKS ARE SPREADING, SIR." +6330 PRINT "UHURA: CAPTAIN, SCOTTY SAYS HE'S CUT OFF IN ENGINEERING AND" +6340 PRINT " DAMAGE CONTROL DOESN'T ACKNOWLEDGE." +6350 IF ABS(T-16)<.1 THEN 6410 +6360 IF ABS(H1-16.25)>.3 THEN 6410 +6370 PRINT "UHURA: I CAN'T RAISE ANYONE, SIR; THE BRIDGE HAS BEEN ISOLATED." +6380 PRINT "SPOCK: ALTHOUGH THEIR RELIABILITY MUST NOW BE ESTIMATED AT" +6390 PRINT " ";(RND*40);"PER CENT, INSTRUMENTS INDICATE THAT THERE" +6400 PRINT " IS A VACUUM IN DECKS 5, 8 AND 9." +6410 RETURN +6430 REM THE ENEMY IS CRIPPLED; TO DESTROY OR NOT TO DESTROY CHOICE +6440 IF P>0 THEN 2000 +6450 P=1 +6460 PRINT "SPOCK: THE ";E1$;" SHIP IS COMPLETELY CRIPPLED, SIR." +6470 PRINT " DO YOU WANT THEM TO SURRENDER"; +6480 INPUT A$ +6485 IF A$="" THEN 6480 +6490 IF LEFT$(A$,1)="Y" THEN 3120 +6500 GOTO 2000 +6540 REM OUT OF RANGE +6550 PRINT "SULU: CONTACT WITH THE ";E1$;" VESSEL HAS BEEN BROKEN, SIR." +6560 PRINT C$;": RESUME COURSE FOR ";D$;", MR. SULU." +6570 PRINT "SULU: AYE, SIR." +6580 GOTO 8150 +6590 REM ENEMY BLOWS SELF UP +6600 PRINT "SPOCK: SENSORS INDICATE THAT THE ";E2$;" IS OVERLOADING" +6610 PRINT " WHAT REMAINS OF ITS ANTIMATTER PODS, UNDOUBTEDLY" +6620 PRINT " A SUICIDAL MOVE, CAPTAIN. PODS WILL DETONATE" +6630 PRINT " IN 12 SECONDS - 10 9 8 7 6 5 4 3 2 1" +6640 GOTO 7640 +6650 REM MOVE SHIPS CLOSER +6660 R=ABS(R-200*(RND+.5)) +6710 RETURN +6720 REM MOVE SHIPS AWAY +6730 R=R+200*(RND+.5) +6760 RETURN +6770 REM WARP SHIPS CLOSER +6780 R=ABS(R-400*(RND+.5)) +6830 RETURN +6840 REM WARP SHIPS AWAY +6850 R=R+400*(RND+.5) +6880 RETURN +6890 REM +6900 REM TELL WHAT THE ENEMY DOES, COMPUTE SUCCESS +6910 REM +6920 REM P.T.'S +7030 PRINT "SPOCK: P.T. INCOMING..."; +7040 P9=(RND*10)+5 +7050 P2=P2-P9 +7055 IF P2>25 THEN 7060 +7257 GOSUB 10400 +7060 IF P2>0 THEN 7080 +7070 GOSUB 9930 +7078 REM ENEMY IS IMPROVED SO PLAYER WILL NOT ALWAYS WIN. +7080 IF RND>FNT(R,B1,A9)*1.25 THEN 7570 +7090 IF RND<.375 THEN 7460 +7100 GOTO 7300 +7110 REM PHASERS +7220 PRINT "SPOCK: PHASER INCOMING..,"; +7230 P9=(RND*10)+5 +7240 P2=P2-P9 +7245 IF P2>25 THEN 7250 +7247 GOSUB 10400 +7250 IF P2>0 THEN 7270 +7260 GOSUB 9930 +7270 IF RND>FNP(R,B1,A9)*1.25 THEN 7570 +7280 IF RND<.4 THEN 7460 +7290 REM TELL RESULTS, SUBTRACT FROM SHIELDS +7300 V=.5 +7310 K=INT(RND*4)+1 +7320 IF S=0 THEN 7340 +7330 K=S +7340 PRINT " A HIT ON SHIELD #";K;"." +7350 IF S1(K)<=0 THEN 7440 +7360 S1(K)=S1(K)-30*V*(RND+.1) +7370 H1=H1+V +7380 GOSUB 5990 +7390 IF S1(K)>0 THEN 2000 +7400 S1(K)=0 +7410 PRINT "SPOCK: SHIELD #";K;"IS GONE."; +7415 PRINT CHR$(7),CHR$(7),CHR$(7),CHR$(7),CHR$(7),CHR$(7) +7420 GOTO 2000 +7430 REM WE'RE BLOWN UP +7440 PRINT "COMPUTER: THE ";S$;" HAS BEEN DESTROYED." +7450 GOTO 4850 +7460 V=1 +7470 K=INT(RND*4)+1 +7480 IF S=0 THEN 7500 +7490 K=S +7500 PRINT " A DIRECT HIT ON SHIELD #";K;"." +7510 K1=INT(RND*50)+1 +7520 K9=K9+K1 +7525 IF H1>16 THEN 7350 +7530 PRINT "UHURA: ";K1;"CASUALTIES REPORTED ON DECK"; +7540 PRINT INT(RND*9)+1;", SIR." +7550 PRINT "SPOCK: TOTAL CASUALTIES NOW ";K9;", CAPTAIN." +7560 GOTO 7350 +7570 REM MISSED... +7580 PRINT "MISSED" +7620 GOTO 2000 +7640 REM BLOW ENEMY UP AND DETERMINE IF WE'RE SAFE +7650 Q=200*RND +7660 IF Q0 THEN 8097 +8094 B=360*(RND-.5) +8096 B1=360*(RND-.5) +8097 B5=0 +8100 PRINT "SPOCK: RANGE:";R;"MGM., BEARING:";B;"D., ALTITUDE:";B9;"D." +8110 IF R>60 THEN 8130 +8120 PRINT "SPOCK: CAPTAIN, WE ARE DANGEROUSLY CLOSE TO THE ";E2$ +8130 RETURN +8140 REM CLOSE IT OUT +8150 PRINT +8160 C$=C9$ +8170 PRINT "COMPUTER: DO YOU WISH TO ATTEMPT ANOTHER BATTLE"; +8190 INPUT A$ +8195 IF A$="" THEN 8190 +8200 IF LEFT$(A$,1)="N" THEN 8220 +8205 RESTORE +8210 G9=1 +8215 GOTO 330 +8220 IF A$="NEW" THEN 12000 +8280 PRINT +8290 PRINT +8300 PRINT +8310 STOP +8320 REM TELL WEAPON RANGES AND PROBABILITIES +8330 PRINT +8340 PRINT "NOTE: WEAPON RANGES ARE:" +8350 PRINT " PHASERS 0-400 MGM (OPTIMUM 200)" +8360 PRINT " TORPEDOES 300-700 MGM (OPTIMUM 500)" +8370 PRINT " TRANSPORTER 0-1000 MGM" +8380 PRINT " PROBES ALL RANGES" +8390 PRINT +8400 PRINT " WEAPON POWER BANKS CONTAIN 300 UNITS OF ENERGY WHEN THE" +8410 PRINT " ";S$;" LEAVES STARBASE. PHASERS DEPLETE THIS POWER MORE" +8420 PRINT " RAPIDLY THAN PHOTON TORPEDOES. SHIELD POWER MAY BE" +8421 PRINT " ALLOCATED TO WEAPONS POWER BANKS IF THEY ARE IN DANGER" +8422 PRINT " OF DEPLETION. ONCE EMPTY, THEY CANNOT BE RECHARGED." +8430 PRINT +8440 PRINT " PHASERS ARE MORE DEADLY THAN TORPEDOES. PROBES" +8450 PRINT " CAUSE MUCH GREATER DESTRUCTION, BUT SUCCEED ONLY" +8460 PRINT " 7% OF THE TIME (APPROXIMATELY). TORPEDOES AND" +8470 PRINT " PHASERS ARE MORE DEADLY WHEN THE BEARING OF THE" +8480 PRINT " ENEMY IS CLOSE TO 0, 180 AND -180 DEGREES, AND" +8485 PRINT " WHEN THE ALTITUDE IS CLOSE TO 0, 90 AND -90 DEGREES." +8490 PRINT " YOU MAY FIND OUT THE ODDS ON ANY SPECIFIC SHOT" +8520 PRINT " BY ASKING ME FOR A PROBABILITY REPORT. BOARDING" +8510 PRINT " PARTIES SUCCEED 30% OF THE TIME IN TAKING OVER" +8522 PRINT " THE ENEMY SHIP, BUT THE CAPTAIN IS KILLED IF THEY" +8530 PRINT " FAIL. " +8540 RETURN +8550 REM MISTAIE COUNTER +8560 M6=M6+1 +8570 IF M6>4 THEN 8750 +8580 RETURN +8590 REM PROBE GETS US +8600 PRINT "IT IS HOMING IN ON US." +8610 PRINT C$;": ALL HANDS: BRACE FOR EXPLOSION." +8620 PRINT "SPOCK: ESTIMATED TIME OF IMPACT- IN 12 SECONDS." +8630 PRINT "SPOAK: 10 9 8 7 6 5 4 3 2 1" +8640 V=3 +8650 K=INT(RND*4)+1 +8660 PRINT "SPOCK: PROBE STRUCK SHIELD #";K +8665 IF H1>16 THEN 7350 +8670 PRINT "UHURA: DECKS ";INT(RND*4)+1;" AND ";INT(RND*4)+5;" REPORT "; +8680 K3=INT(RND*60)+1 +8690 K2=INT(RND*60)+1 +8700 K9=K9+K0+K3 +8710 PRINT K1;"AND";K2;"CASUALTIES" +8720 PRINT " RESPECTIVELY, SIR." +8730 PRINT "SPOCK: TOTAL CASUALTIES NOW";K9;", CAPTAIN." +8740 GOTO 7350 +8750 REM MUTINY SECTION +8760 PRINT "SPOCK: I'M SORRY, CAPTAIN ";C$;", BUT YOU HAVE SHOWN " +8770 PRINT " GROSS INCOMPETENCE IN YOUR COMMAND OF THIS VESSEL." +8780 PRINT " I HEREBY TAKE COMMAND OF THE ";S$;" AND PLACE YOU" +8790 PRINT " UNDER ARREST." +8800 PRINT C$;": THIS IS MUTINY, MR. SPOCK!" +8810 PRINT "SPOCK: I BELIEVE THAT IS THE CORRECT TERM, SIR. GUARD, TAKE" +8820 PRINT " CAPTAIN ";C$;" TO THE BRIG." +8830 PRINT "GUARD: AYE, SIR" +8840 PRINT "SPOCK: MR. SULU, ESCAPE AT WARP SPEED." +8842 IF H1<11 THEN 8850 +8844 PRINT "SULU: SORRY MR. SPOCK, THE WARP DRIVE ENGINES ARE OUT." +8845 PRINT "SPOCK: HAVE MR. SCOTT BEGIN REPAIRS IMEDEATELY. AND," +8846 PRINT " MAKE FOR OUR DESTINATION UNDER FULL IMPULSE POWER." +8850 PRINT "SULU: AYE, SIR." +8870 C$="SPOCK" +8880 GOTO 6540 +8890 REM ENEMY ANTIMATTER PROBE +8900 X2=X2+1 +8930 PRINT "SPOCK: PROBE INCOMING..."; +8940 R9=RND +8950 IF R9<.07135 THEN 8600 +8960 PRINT "MISSED BY";(R9-.07135)*100;"MGM, SIR." +8970 IF (R9-.07135)>.05 THEN 8990 +8980 PRINT "CHEKOV: THAT WAS ALMOST TOO CLOSE, SIR." +8990 GOTO 2000 +9000 REM ENEMY BOARDS US +9020 PRINT "SPOCK: SHIPS SENSORS INDICATE THAT A ";E1$;" PARTY HAS JUST" +9030 PRINT " BEAMED ABOARD, SIR." +9040 PRINT E3$;": I THINK WE CAN SETTLE THIS MATTER ON A MORE" +9050 PRINT " PERSONAL SCALE, CAPTAIN ";C$ +9060 PRINT C$;": SHOOT WITH PHASERS ON KILL!" +9070 IF RND>.5 THEN 9130 +9080 PRINT "SPOCK: I BELIEVE THE INTRUDERS ARE ALL DEAD, SIR." +9090 PRINT C$;": I THINK THEY'LL CHOOSE TO ESCAPE NOW THAT ";E3$;" IS" +9100 PRINT " DEAD." +9110 PRINT "SPOCK: A LOGICAL CONCLUSION, CAPTAIN." +9120 GOTO 6540 +9130 PRINT E3$;": THEY'RE ALL DEAD...THE ";S$;" IS OURS!" +9140 PRINT " GRUTAL, TURN OFF ALL LIFE SUPPORT; WE'LL BEAM BACK TO" +9150 PRINT " THE ";E2$;" AND PUT A TRACTOR BEAM ON THE ";S$;" TO" +9160 PRINT " TAKE IT BACK TO ";E1$;" HEADQUARTERS FOR CAREFUL" +9170 PRINT " EXAMINATION." +9180 PRINT "GRUTAL: AYE, CAPTAIN." +9190 GOTO 8150 +9200 REM WE BOARD THEM +9210 IF H1>10 THEN 9420 +9220 IF R>1000 THEN 9460 +9230 PRINT "SPOCK: AYE, SIR" +9240 PRINT C$;": SCOTTY, CHEKOV COME WITH ME." +9250 PRINT "SPOCK: IT APPEARS, GENTLEMEN, AS IF WE ARE GOING TO HAVE" +9260 PRINT " TO, AS YOU HUMANS PUT IT, WAIT IT OUT." +9270 FOR I=1 TO 3 +9280 PRINT " " +9290 NEXT I +9300 IF RND>.7 THEN 9340 +9310 PRINT E3$;": YOU WERE WAITING TO HEAR FROM YOUR CAPTAIN?" +9320 PRINT "UHURA: OH MY GOD..." +9330 GOTO 8840 +9340 PRINT C$;": ";E3$;" IS DEAD AND THE ";E2$;" IS OURS." +9350 PRINT "UHURA: THANK GOD..." +9360 PRINT C$;": WE'LL BE BEAMING BACK TO THE ";S$;" SHORTLY. THE" +9370 PRINT " ";E1$;"S ARE SAFELY LOCKED BEHIND THE CRASH BULKHEADS." +9380 PRINT "SPOCK: AYE, SIR. THE CREW IS HAPPY TO HEAR YOU'RE SAFE." +9390 PRINT C$;": THANK-YOU, MR. SPOCK. CARRY ON." +9400 PRINT "SPOCK: AYE, SIR." +9410 GOTO 8150 +9415 REM TRANSPORTER DEAD +9420 GOSUB 8550 +9430 PRINT "SPOCK: I'M SORRY, CAPTAIN, BUT THE TRANSPORTER IS DEAD." +9440 GOTO 2000 +9450 REM TELL WE'RE OUT OF WEAPON RANGE +9460 PRINT X$;": THE ";E2$;" IS OUT OF TRANSPORTER RANGE, SIR." +9470 GOSUB 8550 +9480 GOTO 5140 +9490 PRINT X$;": THE ";E2$;" IS OUT OF THAT WEAPON'S RANGE, SIR." +9500 GOSUB 8550 +9510 GOTO 5140 +9520 REM ADDENDA OF DESTINATIONS +9530 PRINT " IN ORDER TO RESCUE COLONISTS UNDER HEAVY ATTACK BY" +9540 PRINT " ";E1$;" BATTLE CRUISERS." +9550 GOTO 1570 +9560 PRINT " WITH A CARGO OF VITAL SERUM TO COMBAT AN EPIDEMIC OF" +9570 PRINT " RIGELLIAN FEVER THERE." +9580 GOTO 1570 +9590 PRINT " TO SECURE DILITHIUM MINING RIGHTS FOR THE FEDERATION." +9600 GOTO 1570 +9610 PRINT " WITH THE NEW FEDERATION AMBASSADOR TO THAT PLANET." +9620 GOTO 1570 +9630 PRINT " FOR ASTROPHYSICAL RESEARCH ON QUASARS IN THAT AREA." +9640 GOTO 1570 +9650 REM TELL ABOUT NEW ENEMY LOSSES +9660 IF H2<=5.5 THEN 9870 +9670 IF H2>10 THEN 9870 +9675 IF H2>6.9 THEN 9725 +9680 IF H9>0 THEN 9720 +9690 H9=1 +9700 PRINT "SPOCK: ENEMY REAR PHASERS DEAD, SIR." +9710 RETURN +9720 IF H2<7 THEN 9870 +9725 IF H2>7.9 THEN 9775 +9730 IF H9>1 THEN 9770 +9740 H9=2 +9750 PRINT "SPOCK: ENEMY FORWARD PHASERS DEAD, SIR." +9760 RETURN +9770 IF H2<8 THEN 9870 +9775 IF H2>8.9 THEN 9830 +9780 IF H9>2 THEN 9820 +9790 H9=3 +9800 PRINT "SPOCK: ENEMY REAR P.T.'S DEAD, SIR." +9810 RETURN +9820 IF H2<9 THEN 9870 +9830 IF H9>3 THEN 9870 +9840 H9=4 +9850 PRINT "SPOCK: ENEMY FORWARD P.T.'S DEAD, SIR; REQUEST DAMAGE" +9860 PRINT " REPORT FOR ALL FUTURE ENEMY DAMAGE." +9870 RETURN +9880 REM WEAPONS BRIEFING FEEDER +9890 PRINT "SPOCK: WEAPON RANGES AND ACCURACIES ARE AS FOLLOWS:" +9900 PRINT +9910 GOSUB 8350 +9920 GOTO 2000 +9930 REM ENEMY WEAPON POWER BANKS DEPLETED +9940 H2=9 +9950 P2=0 +9960 PRINT "SPOCK: SENSORS INDICATE THAT THE ";E2$;"'S" +9970 PRINT " WEAPONS POWER BANKS ARE EMPTY, CAPTAIN. ALL" +9980 PRINT " ENEMY PHASERS AND PHOTON TORPEDOES ARE DEAD." +9990 RETURN +10000 REM OUR WEAPONS POWER BANKS DEPLETED +10010 H1=9 +10020 P1=0 +10030 PRINT "SPOCK: CAPTAIN, OUR WEAPONS POWER BANKS ARE EMPTY. ALL" +10242 PRINT " PHASERS AND PHOTON TORPEDOES ARE DEAD." +10050 RETURN +10060 REM WEAPON POWER BANKS STATUS REPORT +10070 PRINT "SPOCK: ";P1;"UNITS REMAIN,";P1/3;"% OF TOTAL." +10080 GOTO 2000 +10100 REM SHIELD POWER TO WEAPONS BANKS +10105 IF H1>8.9 THEN 10390 +10110 PRINT "SULU: WHICH OPTION, CAPTAIN: 1) ALL SHIELDS EQUALLY" +10112 PRINT " DRAINED, 2) A CHOSEN SHIELD DEPLETED"; +10120 INPUT W +10130 IF W>2 THEN 10110 +10140 IF W<1 THEN 10110 +10150 IF W>1 THEN 10300 +10155 REM ALL SHIELDS DRAINED +10160 PRINT "SULU: HOW MANY UNITS TOTAL"; +10170 INPUT W1 +10180 FOR I=1 TO 4 +10190 IF W1/4>S1(I) THEN 10210 +10200 NEXT I +10205 GOTO 10240 +10210 PRINT "SULU: THE SHIELDS DO NOT HAVE THAT MUCH POWER, SIR." +10220 GOTO 10160 +10240 FOR I=1 TO 4 +10250 S1(I)=S1(I)-W1/4 +10260 NEXT I +10270 P1=P1+W1 +10280 PRINT "SPOCK: ";P1;"UNITS NOW AVAILABLE TO WEAPONS, CAPTAIN." +10290 GOTO 1980 +10295 REM ONE SHIELD DRAINED +10300 PRINT "SULU: SHIELD NUMBER"; +10310 INPUT S9 +10315 IF S9>4 THEN 10300 +10320 PRINT "SULU: NUMBER OF UNITS"; +10330 INPUT W1 +10340 IF S1(S9)11.9 THEN 10440 +10410 FOR I=1 TO 4 +10420 IF S2(I)<35 THEN 10480 +10430 NEXT I +10440 FOR I=1 TO 4 +10450 S2(I)=S2(I)-5 +10460 NEXT I +10470 P2=P2+20 +10480 RETURN +10995 REM TELL ABOUT MODIFICATIONS +11000 PRINT "SPOCK: ALL 3 DIMENSIONS NOW DETERMINE WEAPON ACCURACIES;" +11010 PRINT " ALTITUDE IS OPTIMAL AT 0, 90 AND -90 DEGREES. NO" +11020 PRINT " FURTHER ASTEROIDS WILL BE ENCOUNTRED. ENEMY" +11030 PRINT " STRATEGY MAY BE SLIGHTLY DIFFERENT." +11040 PRINT " CODE WORDS MAY NO LONGER BE USED; ONLY NUMBERS" +11050 PRINT " ARE ACCEPTED. SHIELD POWER MAY BE ALLOCATED TO WEAPONS" +11060 PRINT " BANKS IF THEY ARE IN DANGER OF DEPLETION; ONCE EMPTY," +11070 PRINT " THEY CANNOT BE RECHARGED." +11099 RETURN +12000 RESTORE +12002 RANDOMIZE +12004 FOR L=1 TO 6 +12006 PRINT +12008 NEXT L +12009 G9=G=0 +12010 GOTO 330 +64000 REM +64001 REM ++++++++++++++++++++++++++++++++++++++++++ +64002 REM + + +64003 REM + LIST OF PROGRAM VARIABLES + +64004 REM + + +64005 REM ++++++++++++++++++++++++++++++++++++++++++ +64006 REM +64010 REM A$ YES/NO INPUT +64020 REM C$ OUR CAPTAIN +64040 REM C9$ HOLDER FOR OUR CAPTAIN +64050 REM D$ DESTINATION +64060 REM E1$ ENEMY NATION +64070 REM E2$ ENEMY VESSEL +64080 REM E3$ ENEMY CAPTAIN +64090 REM K7$ ENEMY NATIONS ARRAY +64100 REM K8$ ENEMY VESSELS ARRAY +64110 REM K9$ ENEMY CAPTAINS ARRAY +64120 REM L$ DESTINATION ARRAY +64140 REM N$ OUR SHIPS ARRAY +64150 REM O$ COMMAND FEEDBACK ARRAY +64160 REM S$ OUR SHIP +64165 REM V$ VERSION OF PROGRAM +64170 REM X$ HELMSMAN (CHEKOV OR SULU) +64200 REM +64205 REM A9 ENEMY ALTITUDE +64210 REM B BEARING +64220 REM B1 BEARING FOR ENEMY SHIP +64225 REM B5 SKIP BEARING CHANGE FLAG +64230 REM B9 OUR ALTITUDE +64240 REM E ENEMY DAMAGE COMPOSITE +64250 REM G CORBOMITE COUNTER +64255 REM G9 GAME # COUNTER +64260 REM H1 OUR DAMAGE COUNTER +64270 REM H2 ENEMY DAMAGE COUNTER +64275 REM H9 ENEMY DAMAGE PRINTOUT COUNTER +64280 REM J SHIELD # HOLDER +64290 REM K SHIELD # HOLDER +64300 REM K1 SHIELD # HOLDER +64307 REM K2 CASUALTY HOLDER +64308 REM K3 CASUALTY HOLDER +64309 REM K9 CASUALTY COUNTER +64310 REM M5 VECTOR ERROR COUNTER +64320 REM M6 MISTAKE COUNTER +64330 REM P DESTROY CHOICE COUNTER +64331 REM P1 OUR WEAPON POWER BANKS +64332 REM P2 ENEMY WEAPON POWER BANKS +64339 REM P9 RND HOLDER +64340 REM Q RADIUS OF SHIP EXPLOSION +64350 REM R RANGE +64360 REM R7 PREVIOUS RANGE HOLDER +64370 REM R9 RND HOLDER +64380 REM S SHIELD # HOLDER +64390 REM S1(I) OUR SHIELDS +64400 REM S2(I) ENEMY'S SHIELDS +64405 REM S9 SHIELD DRAINED FOR WEAPONS +64410 REM T HOLDER OF PREVIOUS H1 +64415 REM U OUR DAMAGE COMPOSITE +64420 REM V VALUE OF HIT +64424 REM W SHIELD DRAIN OPTION +64425 REM W1 POWER FROM SHIELDS TO WEAPONS +64430 REM X OUR PROBE COUNTER +64440 REM X2 ENEMY PROBE COUNTER +64450 REM Y RND POWER FACTOR +64460 REM Z4 RND HOLDER +64999 END + \ No newline at end of file diff --git a/Source/Images/d_games/u0/STAR.COM b/Source/Images/d_games/u0/STAR.COM new file mode 100644 index 00000000..4ed0e93a Binary files /dev/null and b/Source/Images/d_games/u0/STAR.COM differ diff --git a/Source/Images/d_games/u0/STARWARS.BAS b/Source/Images/d_games/u0/STARWARS.BAS new file mode 100644 index 00000000..d6decce2 --- /dev/null +++ b/Source/Images/d_games/u0/STARWARS.BAS @@ -0,0 +1,302 @@ +10 REM ---DESIGNED TO RUN ON HEATH H19/H89--- +900 WIDTH 80 +1000 LET E$=CHR$(27):PRINT E$;"F";E$;"E";E$;"x5";E$;"Y#'"; +1010 PRINT TAB(18);E$;"F";"faaqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaac" +1020 PRINT TAB(18);"`";SPC(43);"`" +1030 PRINT TAB(18);"` 'S T A R W A R S' `" +1040 PRINT TAB(18);"`";SPC(43);"`" +1050 PRINT TAB(18);"`";E$;"G";" This program presented courtesy of "; +1060 PRINT E$;"F";"`" +1070 PRINT TAB(18);"`";SPC(43);"`" +1080 PRINT TAB(18);"`";E$;"p";" C U S T O M S O F T W A R E G R O U P "; +1090 PRINT E$;"q";"`" +1100 PRINT TAB(18);"`";SPC(43);"`" +1110 PRINT TAB(18);"`";E$;"G";" Specializing in custom programming for "; +1120 PRINT E$"F";"`" +1130 PRINT TAB(18);"` HEATH/ZENITH DATA SYSTEMS `" +1140 PRINT TAB(18);"`";SPC(43);"`" +1150 PRINT TAB(18);"` CUSTOM SOFTWARE GROUP `" +1160 PRINT TAB(18);"` POST OFFICE BOX `" +1170 PRINT TAB(18);"` BELLEVUE, NE 68005 `" +1180 PRINT TAB(18);"` PHONE 291-4622 `" +1190 PRINT TAB(18);"` 291-5819 `" +1200 PRINT TAB(18);"`";SPC(43);"`" +1210 PRINT TAB(18);"eaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaad";E$;"G" +1220 PRINT TAB(28);"PRESS RETURN TO CONTINUE" +1230 A$=INPUT$(1) +1240 PRINT CHR$(27);"G";CHR$(27);"w" +1250 CLEAR 1000 +1260 PRINT CHR$(27);"E";CHR$(27);"Y! ";CHR$(27);"x5" +1270 PRINT ," ******** ********** ****** *********" +1280 PRINT ," ** ** ** ** ** ** **" +1290 PRINT ," ** ** ** ** ** **" +1300 PRINT ," ******** ** ********** *********" +1310 PRINT ," ** ** ** ** ** **" +1320 PRINT ," ** ** ** ** ** ** **" +1330 PRINT ," ******** ** ** ** ** **" +1340 PRINT:PRINT +1350 PRINT ," ** ** ****** ********* ********" +1360 PRINT ," ** ** ** ** ** ** ** **" +1370 PRINT ," ** ** ** ** ** ** **" +1380 PRINT ," ** ** ** ********** ********* ********" +1390 PRINT ," ** ** ** ** ** ** ** **" +1400 PRINT ," ******** ** ** ** ** ** **" +1410 PRINT ," ** ** ** ** ** ** ********" +1420 FOR I=1 TO 1000:NEXT I +1430 PRINT CHR$(27);"Y7 " +1440 PRINT ,"A LONG TIME AGO IN A GALAXY FAR, FAR AWAY, A GREAT" +1450 FOR I=1 TO 1000:NEXT I:PRINT +1460 PRINT ,"ADVENTURE TOOK PLACE. IT IS A PERIOD OF CIVIL WAR." +1470 FOR I=1 TO 1000:NEXT I:PRINT +1480 PRINT ,"REBEL SPACE SHIPS STRIKING FROM A HIDDEN BASE HAVE" +1490 FOR I=1 TO 1000:NEXT I:PRINT +1500 PRINT ,"WON THEIR FIRST VICTORY AGAINST THE EVIL GALACTIC" +1510 FOR I=1 TO 1000:NEXT I:PRINT +1520 PRINT ,"EMPIRE. DURING THE BATTLE, REBEL SPYS MANAGED TO" +1530 FOR I=1 TO 1000:NEXT I:PRINT +1540 PRINT ,"STEAL SECRET PLANS TO THE EMPIRE'S ULITMATE WEAPON" +1550 FOR I=1 TO 1000:NEXT I:PRINT +1560 PRINT ,"THE DEATH STAR, AN ARMOURED SPACE STATION WITH THE" +1570 FOR I=1 TO 1000:NEXT I:PRINT +1580 PRINT ,"FIRE POWER TO DESTROY AN ENTIRE PLANET. " +1590 FOR I=1 TO 1000:NEXT I:PRINT:PRINT +1600 PRINT ," YOUR MISSION AS ONE OF THE REBEL PILOTS IS TO" +1610 FOR I=1 TO 1000:NEXT I:PRINT +1620 PRINT ,"ATTACK AND DESTROY THE 'DEATH STAR'. WHILE MAKING" +1630 FOR I=1 TO 1000:NEXT I:PRINT +1640 PRINT ,"YOUR ATTACK YOU HAVE ENCOUNTERED 'DARTH VADER' AND" +1650 FOR I=1 TO 1000:NEXT I:PRINT +1660 PRINT ,"HIS IMPERIAL STORM TROOPERS IN THEIR TIE FIGHTERS." +1670 FOR I=1 TO 1000:NEXT I:PRINT +1680 PRINT ,"YOU MUST DESTROY THEM BEFORE THEY CAN DESTROY YOU." +1690 FOR I=1 TO 1000:NEXT I:PRINT:PRINT +1700 PRINT ," GOOD LUCK AND MAY THE 'FORCE' BE WITH YOU " +1710 FOR I=1 TO 2000:NEXT I +1720 REM +1730 REM .........................INSTRUCTIONS ROUTINE....................... +1740 REM +1750 PRINT CHR$(27);"E";CHR$(27);"Y*6";"DO YOU NEED:":PRINT +1760 PRINT TAB(30);"FULL INSTRUCTIONS ?" +1770 PRINT TAB(30);"BRIEF INSTRUCTIONS ?" +1780 PRINT TAB(30);"NO INSTRUCTIOnS ?" +1790 A$=INPUT$(1):IF A$="F" THEN 1870 +1800 IF A$="B" THEN 2270 +1810 IF A$="N" THEN 1820 ELSE 1790 +1820 PRINT:PRINT TAB(29);"WHAT IS YOUR SKILL RATING?" +1830 A$=INPUT$(1):IF A$<"1" OR A$>"9" THEN 1850 +1840 LET A$=A$+"0":LET A9=CVI(A$):LET A9=A9-12336:GOTO 2540 +1850 PRINT:PRINT TAB(26);"EVIDENTLY YOU NEED INSTRUCTIONS!" +1860 FOR I=1 TO 500:NEXT I:PRINT +1870 PRINT CHR$(27);"E";CHR$(27);"Y! " +1880 PRINT "YOU HAVE BEEN EQUIPPED WITH AN X-WING "; +1890 PRINT " AS IN A REAL DOG-FIGHT YOU MUST LEAD" +1900 PRINT "FIGHTER BY THE REBEL ALLIANCE. YOUR "; +1910 PRINT " THE TARGET WHEN FIRING YOUR LASER. IF" +1920 PRINT "FIGHTER IS COMPUTER CONTROLLED BY THE "; +1930 PRINT " YOU WAIT UNTIL HE IS EXACTLY CENTERED" +1940 PRINT "NUMERIC KEYPAD ON YOUR KEY BOARD. THE "; +1950 PRINT " TO FIRE, THEN YOU WILL MISS HIM. YOU" +1960 PRINT "DISPLAY YOU WILL SEE IS YOUR ONBOARD "; +1970 PRINT " MAY CONTINUE TO FIRE AT HIM, BUT WHEN" +1980 PRINT "SCANNER. IN ORDER TO KILL AN ENEMY "; +1990 PRINT " YOU ARE FIRING YOUR WEAPON, YOUR CON-" +2000 PRINT "FIGHTER HE MUST RECEIVE A DIRECT HIT "; +2010 PRINT " TROL OF DIRECTION IS NOT AS GOOD AS" +2020 PRINT "OR MULTIPLE DAMAGING HITS. HE WILL "; +2030 PRINT " WHEN YOU AREN'T FIRING AND THE TARGET" +2040 PRINT "RECEIVE DAMAGE IF HIT WHEN HE IS +/- "; +2050 PRINT " MAY FLY OUT OF YOUR SIGHTS. " +2060 PRINT "10 DEGREES IN ELEVATION AND HE IS +/- "; +2070 PRINT " " +2080 PRINT "9 DEGREES IN BEARING. IN ADDITION TO "; +2090 PRINT " IN ORDER TO CENTER YOUR TARGET ON THE" +2100 PRINT "THIS HE MUST BE WITHIN 6500 KMS. "; +2110 PRINT " SCANNER YOU MUST FLY TOWARDS HIM. TO" +2120 PRINT " "; +2130 PRINT " TO DO THIS YOU PRESS THE KEY ON THE" +2140 PRINT "WARNING: THE 'TIE' FIGHTER HAS THE "; +2150 PRINT " NUMERIC KEY PAD THAT IS IN HIS DIREC-" +2160 PRINT "CAPABILITY TO POP IN AND OUT OF HYP- "; +2170 PRINT " TION. IE: IF HE IS IN THE UPPER-RIGHT" +2180 PRINT "ERSPACE. THEREFORE HE MAY DISAPPEAR "; +2190 PRINT " QUADRANT YOU WOULD PRESS KEY 9 TO FLY" +2200 PRINT "RIGHT FROM BEFORE YOUR SIGHTS. "; +2210 PRINT " TOWARDS HIM. IF HE IS BELOW, PRESS 2." +2220 PRINT " "; +2230 PRINT " " +2240 PRINT " MAY THE FORCE BE WITH YOU "; +2250 PRINT " PRESS RETURN TO CONT "; +2260 LINE INPUT A$ +2270 PRINT CHR$(27);"E" +2280 PRINT CHR$(27);"F"; +2290 PRINT ," UP & UP UP &" +2300 PRINT ," LEFT faaaaac faaaaac faaaaac RIGHT" +2310 PRINT ," ` 7 ` ` 8 ` ` 9 `" +2320 PRINT ," eaaaaad eaaaaad eaaaaad" +2330 PRINT ," faaaaac faaaaac faaaaac" +2340 PRINT ," LEFT ` 4 ` ` 5 ` ` 6 ` RIGHT" +2350 PRINT ," eaaaaad eaaaaad eaaaaad" +2360 PRINT ," faaaaac faaaaac faaaaac" +2370 PRINT ," ` 1 ` ` 2 ` ` 3 `" +2380 PRINT ," DOWN eaaaaad eaaaaad eaaaaad RIGHT" +2390 PRINT ," LEFT faaaaac DOWN DOWN" +2400 PRINT ," ` 0 `" +2410 PRINT ," eaaaaad" +2420 PRINT ," FIRE" +2430 PRINT CHR$(27);"G" +2440 PRINT TAB(18);"<>":PRINT +2450 PRINT TAB(23);"ENTER A SKILL RATING FROM 1 TO 9" +2460 PRINT TAB(27);"NOVICE.................1" +2470 PRINT TAB(27);"EXPERT.................9":PRINT +2480 PRINT "AFTER SCANNER CONSTRUCTION IS COMPLETE, PRESS ANY CONTROL KEY TO" +2485 PRINT "START YOUR SCAN" +2490 A$=INPUT$(1):IF A$<"1" OR A$>"9" THEN 2490 +2500 LET A$=A$+"0":LET A9=CVI(A$):LET A9=A9-12336 +2510 REM +2520 REM ......................GRID CONSTRUCTION ROUTINE.................... +2530 REM +2540 PRINT CHR$(27);"F";CHR$(27);"x1";CHR$(27);"x5":PRINT CHR$(27);"E"; +2550 PRINT TAB(16);"RANGE:g9999 KM ELEVATION:g90 DEG BEARING:g90 DEG" +2560 PRINT:ED=0 +2570 PRINT TAB(8);"-90 -75 -60 -45 -30 -15 0 +15 +30 +45 +60 +75 +90" +2580 PRINT TAB(5);"+90 bssssbssssbssssbssssbssssbssssbssssbssssbssssbssssbssssbssssb +90" +2590 PRINT TAB(9);"v";SPC(59);"t":PRINT TAB(9);"v";SPC(59);"t" +2600 PRINT TAB(5);"+60 b";SPC(59);"b +60" +2610 PRINT TAB(9);"v";SPC(59);"t":PRINT TAB(9);"v";SPC(59);"t" +2620 PRINT TAB(5);"+30 b";SPC(59);"b +30" +2630 PRINT TAB(9);"v";SPC(59);"t":PRINT TAB(9);"v";SPC(59);"t" +2640 PRINT TAB(6);"0 b";SPC(59);"b 0" +2650 PRINT TAB(9);"v";SPC(59);"t":PRINT TAB(9);"v";SPC(59);"t" +2660 PRINT TAB(5);"-30 b";SPC(59);"b -30" +2670 PRINT TAB(9);"v";SPC(59);"t":PRINT TAB(9);"v";SPC(59);"t" +2680 PRINT TAB(5);"-60 v";SPC(59);"t -60" +2690 PRINT TAB(9);"v";SPC(59);"t":PRINT TAB(9);"v";SPC(59);"t" +2700 PRINT " -90 buuuubuuuubuuuubuuuubuuuubuuuubuuuubuuuubuuuubuuuubuuuubuuuub -90" +2710 PRINT " -90 -75 -60 -45 -30 -15 0 +15 +30 +45 +60 +75 +90" +2720 REM +2730 REM ......................INPUT CONTROL SCAN ROUTINE................... +2740 REM +2750 CD=200+INT(200*RND(1)):FL$="5" +2760 IF CT=CD THEN 3910 ELSE CT=CT+1 +2770 IF FL$="0" THEN 2950 +2780 IF INP(17)=48 AND FL$<>"0" THEN FL$=INPUT$(1) +2790 IF INP(17)=49 AND FL$<>"1" THEN FL$=INPUT$(1) +2800 IF INP(17)=50 AND FL$<>"2" THEN FL$=INPUT$(1) +2810 IF INP(17)=51 AND FL$<>"3" THEN FL$=INPUT$(1) +2820 IF INP(17)=52 AND FL$<>"4" THEN FL$=INPUT$(1) +2830 IF INP(17)=53 AND FL$<>"5" THEN FL$=INPUT$(1) +2840 IF INP(17)=54 AND FL$<>"6" THEN FL$=INPUT$(1) +2850 IF INP(17)=55 AND FL$<>"7" THEN FL$=INPUT$(1) +2860 IF INP(17)=56 AND FL$<>"8" THEN FL$=INPUT$(1) +2870 IF INP(17)=57 AND FL$<>"9" THEN FL$=INPUT$(1) +2880 IF INP(17)<48 OR INP(17)>57 AND DM$<>CHR$(INP(17)) THEN DM$=INPUT$(1) +2890 GOSUB 3340:REM ..FIGHTER UPDATE +2900 PRINT CHR$(27);"Y&3+";CHR$(27);"Y23+";CHR$(27);"Y)=+";CHR$(27);"Y/=+";CHR$(27);"Y,G+";CHR$(27);"Y)Q+";CHR$(27);"Y/Q+";CHR$(27);"Y&[+";CHR$(27);"Y2[+" +2910 GOTO 2760 +2920 REM +2930 REM .......................FIRE WEAPON ROUTINE........................ +2940 REM +2950 FOR I=8 TO 1 STEP -1 +2960 PRINT CHR$(27);"Y";CHR$(44+I);CHR$(71-I);"x" +2970 PRINT CHR$(27);"Y";CHR$(44+I);CHR$(71+I);"y" +2980 IF I > 6 THEN 3010 +2990 PRINT CHR$(27);"Y";CHR$(46+I);CHR$(69-I);" " +3000 PRINT CHR$(27);"Y";CHR$(46+I);CHR$(73+I);" " +3010 NEXT I +3020 PRINT CHR$(27);"Y.E ";CHR$(27);"Y.I ";CHR$(27);"Y-F ";CHR$(27);"Y-H " +3030 IF FX<>44 OR FY<>70 THEN 3190 +3040 IF KM>5000 THEN 2790 +3050 PRINT CHR$(27);"p";CHR$(27);"Y8? ENEMY DESTROYED ":DG=0 +3060 PRINT CHR$(27);"p":ED=ED+1 +3070 PRINT CHR$(27);"Y";CHR$(FX-1);CHR$(FY);"ppp" +3080 PRINT CHR$(27);"Y";CHR$(FX);CHR$(FY-1);" " +3090 PRINT CHR$(27);"q";CHR$(27);"Y";CHR$(FX+1);CHR$(FY);"ppp" +3100 FOR I=1 TO 25:PRINT CHR$(7);:NEXT I +3110 PRINT CHR$(27);"Y";CHR$(FX);CHR$(FY);"iii" +3120 FOR I=1 TO 25: NEXT I +3130 PRINT CHR$(27);"Y";CHR$(FX-1);CHR$(FY);" " +3140 PRINT CHR$(27);"Y";CHR$(FX);CHR$(FY-1);" iii " +3150 PRINT CHR$(27);"Y";CHR$(FX+1);CHR$(FY);" " +3160 FOR I=1 TO 25: NEXT I +3170 PRINT CHR$(27);"Y";CHR$(FX);CHR$(FY);" " +3180 FQ=0:IF ED=5 THEN 3860 ELSE 2790 +3190 IF FX<43 OR FX>45 THEN 3310 +3200 IF FY<68 OR FY>72 THEN 3310 +3210 LET DG=DG+1:IF DG=3 THEN 3050 +3220 PRINT CHR$(27);"Y";CHR$(FX-1);CHR$(FY);"iii" +3230 PRINT CHR$(27);"Y";CHR$(FX);CHR$(FY-1);"i" +3240 PRINT CHR$(27);"Y";CHR$(FX);CHR$(FY+3);"i" +3250 PRINT CHR$(27);"Y";CHR$(FX+1);CHR$(FY);"iii" +3260 FOR I=1 TO 250: NEXT I +3270 PRINT CHR$(27);"Y";CHR$(FX-1);CHR$(FY);" " +3280 PRINT CHR$(27);"Y";CHR$(FX);CHR$(FY-1);" " +3290 PRINT CHR$(27);"Y";CHR$(FX);CHR$(FY+3);" " +3300 PRINT CHR$(27);"Y";CHR$(FX+1);CHR$(FY);" ":GOTO 2790 +3310 PRINT CHR$(27);"Y8 ";CHR$(27);"l" +3320 GOTO 2790 +3330 REM +3340 REM ...................FIGHTER POSITION UPDATE ROUTINE................ +3350 REM +3360 IF FQ=1 THEN 3430 ELSE FQ=1 +3370 LET FX=INT(100*RND(1)) +3380 IF FX<36 OR FX>52 THEN 3370 +3390 LET FY=INT(200*RND(1)) +3400 IF FY<44 OR FY>97 THEN 3390 +3410 LET KM=INT(10000*RND(1)) +3420 FZ=INT(16*RND(1)) +3430 IF INT(100*RND(1))>6 THEN 3450 +3440 FZ=INT (16*RND(1)) +3450 IF INT(10*RND(1))0 THEN 3470 ELSE X=FX-1:Y=FY+1 +3470 IF FZ<>1 THEN 3480 ELSE S=FX:Y=FY+1 +3480 IF FZ<>2 THEN 3490 ELSE X=FX+1:Y=FY+1 +3490 IF FZ<>3 THEN 3500 ELSE X=FX+1:Y=FY +3500 IF FZ<>4 THEN 3510 ELSE X=FX+1:Y=FY-1 +3510 IF FZ<>5 THEN 3520 ELSE X=FX:Y=FY-1 +3520 IF FZ<>6 THEN 3530 ELSE X=FX-1:Y=FY-1 +3530 IF FZ<>7 THEN 3540 ELSE X=FX-1:Y=FY +3540 IF FZ<>8 THEN 3550 ELSE X=FX-1:Y=FY+2 +3550 IF FZ<>9 THEN 3560 ELSE X=FX-1:Y=FY+3 +3560 IF FZ<>10 THEN 3570 ELSE X=FX+1:Y=FY+3 +3570 IF FZ<>11 THEN 3580 ELSE X=FX+1:Y=FY+2 +3580 IF FZ<>12 THEN 3590 ELSE X=FX+1:Y=FY-2 +3590 IF FZ<>13 THEN 3600 ELSE X=FX+1:Y=FY-3 +3600 IF FZ<>14 THEN 3610 ELSE X=FX-1:Y=FY-3 +3610 IF FZ<>15 THEN 3620 ELSE X=FX-1:Y=FY-2 +3620 IF FL$<>"1" THEN 3630 ELSE X=X-1:Y=Y+1 +3630 IF FL$<>"2" THEN 3640 ELSE X=X-2:Y=Y +3640 IF FL$<>"3" THEN 3650 ELSE X=X-1:Y=Y-1 +3650 IF FL$<>"4" THEN 3660 ELSE X=X:Y=Y+2 +3660 IF FL$<>"6" THEN 3670 ELSE X=X:Y=Y-2 +3670 IF FL$<>"7" THEN 3680 ELSE X=X+1:Y=Y+1 +3680 IF FL$<>"8" THEN 3690 ELSE X=X+2:Y=Y +3690 IF FL$<>"9" THEN 3700 ELSE X=X+1:Y=Y-1 +3700 IF X>39 AND X<50 AND Y>55 AND Y<87 THEN 3740 +3710 IF SGN(KM)=+1 THEN KM=KM+INT(200*RND(1)) +3720 IF SGN(KM)=-1 THEN KM=KM-INT(200*RND(1)) +3730 IF KM<10000 THEN 3760 ELSE 3830 +3740 IF SGN(KM)=+1 THEN KM=KM-INT(200*RND(1)) +3750 IF SGN(KM)=-1 THEN KM=KM+INT(200*RND(1)) +3760 IF X<36 OR X>52 OR Y<42 OR Y>98 THEN 3830 +3770 IF X=FX AND Y=FY THEN RETURN +3780 PRINT CHR$(27);"Y";CHR$(FX);CHR$(FY);" ":FX=X:FY=Y +3790 PRINT CHR$(27);"Y";CHR$(FX);CHR$(FY);"v^t" +3800 PRINT CHR$(27);"Y 5";KM +3810 EV=10*(44-FX):PRINT CHR$(27);"Y K";EV +3820 BR=3*(FY-70):PRINT CHR$(27);"Y \";BR:RETURN +3830 PRINT CHR$(27);"Y";CHR$(FX);CHR$(FY);" " +3840 FQ=0:RETURN +3850 PRINT CHR$(27);"Y8 ";CHR$(27);"l":RETURN +3860 FOR I=1 TO 500:NEXT I:PRINT CHR$(27);"y1";CHR$(27);"Y ";CHR$(27);"E" +3870 PRINT CHR$(27);"q";CHR$(27);"Y( ";CHR$(27);"G" +3880 PRINT ,"CONGRATULATIONS ON A JOB WELL DONE. YOU HAVE" +3890 PRINT ,"DESTROYED DARTH VADER AND HIS STORM TROOPERS " +3900 PRINT ,"AND HAVE SAVED THE REBELLION.":GOTO 3950 +3910 PRINT CHR$(27);"E";CHR$(27);"Y( " +3920 PRINT ,"YOU HAVE ONLY DESTROYED";ED;"TIE FIGHTERS AND";CHR$(27);"y1" +3930 PRINT ,"YOU LET DARTH VADER GET AWAY. OH WELL,I GUESS";CHR$(27);"G" +3940 PRINT ,"WE WANT HIM AROUND FOR THE SEQUEL ANYWAY!" +3950 PRINT:PRINT ,"DO YOU WANT TO PLAY AGAIN ?" +3960 A$=INPUT$(1):IF A$="Y"THEN 1820ELSE IF A$<>"N"THEN 3960ELSE 1000 +950 PRINT:PRINT ,"DO YOU WANT TO PLAY AGAIN ?" +3960 A$=INPUT$(1):IF A$="Y"THEN 1820ELSE IF A$<> \ No newline at end of file diff --git a/Source/Images/d_games/u0/TERMDEF.COM b/Source/Images/d_games/u0/TERMDEF.COM new file mode 100644 index 00000000..8ce076af Binary files /dev/null and b/Source/Images/d_games/u0/TERMDEF.COM differ diff --git a/Source/Images/d_games/u0/TVIGAMMO.BAS b/Source/Images/d_games/u0/TVIGAMMO.BAS new file mode 100644 index 00000000..012a66b4 --- /dev/null +++ b/Source/Images/d_games/u0/TVIGAMMO.BAS @@ -0,0 +1,371 @@ +10 REM **************** GAMMON ***************** +20 REM +22 REM Converted for Televideo 912 terminal by Bill Soon, August 1981 +24 REM Cursor control codes probably OK for ADM-3 & SOROC also. +26 REM * further refinements encouraged * +30 REM originally written for HEATH H-8 OR H-89 WITH H-19 +35 REM REQUIRES MICROSOFT +40 REM +50 REM By: R. Wild +55 REM OSO11 Nepil Ave. +60 REM Wheaton, Ill. 60187 +70 REM +80 REM Idea by Cursor Magazine +100 CLEAR 1000 +200 GOSUB 9000 +210 RR=RND(1) +240 DIM B(27),D(4),DA$(3),DI$(6,6),US(4),P(24),PR(6),M$(5) +260 DIM T(6) +280 BK$=SPACE$(38) +300 M$(1)=" HIT YOUR BLOT AT ":M$(2)=" COVERED MY BLOT AT " +310 M$(3)=" MOVED TO " +320 M$(5)="MOVED BLOT TO SAFETY AT ":M$(4)=" CAN'T MAKE MOVE " +340 M$(0)=" BEARING OFF FROM ":FR$=" FROM " +360 A$="":DA$(1)="q":DA$(2)=" ":DA$(3)="*":ER$=A$+"" +380 AA$=CHR$(27)+CHR$(61)+CHR$(31+6)+CHR$(33):AL$="XWVUTSRQPONMLKJIHGFEDCBA" +390 A$=CHR$(27)+CHR$(61)+CHR$(31+10)+CHR$(33) +400 FOR I=1 TO 12:READ P(I):NEXT +420 DATA .31,.33,.39,.42,.42,.47,.17,.17,.14,.08,.06,.08 +440 FOR I=0 TO 6:READ PR(I):NEXT +460 DATA 0,.03,.11,.25,.44,.69,1 +480 GOSUB 8000 +640 CM=24:F=6:S=0:HM=24:HB=0:CB=0:XC=0:XH=0 +660 PRINT ERAS$;"* BACKGAMMON *" +662 PRINT "Difficulty (1=easy, 10=hard)? ";:LINE INPUT IN$ +665 PRINT CO$ +680 TT=(VAL(IN$)/10):PRINT GRA$ +700 IF TT>1 OR TT<=0 THEN 660 +720 PRINT ERAS$:A=TT:IF RND(1)<.5 THEN F=1 +740 GOSUB 4220:GOSUB 4460 +760 GOSUB 8250:IF D(1)=D(2)THEN 760 +780 NP=1: PRINT AA$" MINE YOURS":FOR I=1 TO 500:NEXT +790 GOSUB 8280:FOR I=1 TO 500:NEXT:GOSUB 4580 +820 PRINT A$;:IF D(2)>D(1)THEN NP=-1:PRINT"YOU"; +840 IF D(2)2 THEN IN$=MID$(IN$,2):GOTO 1120 +1100 GOSUB 4580:PRINT A$;CN$;" MOVE";I;"? ";:GOSUB 6240:PRINT:PRINT:IF IN$=""THEN 2180 +1120 IF LEN(IN$)>1 THEN 1220 +1140 IF IN$>="A"AND IN$<="F"THEN IN$="="+IN$ +1160 IF IN$>="S"AND IN$<="X"THEN IN$=IN$+"-" +1180 IF LEN(IN$)>1 THEN 1220 +1200 PRINT"BAD MOVE.":GOTO 1060 +1220 IF LEN(IN$)>3 THEN 1200 +1240 IF MID$(IN$,2,1)=","THEN IN$=LEFT$(IN$,1)+MID$(IN$,3):GOTO 1240 +1260 F$=LEFT$(IN$,1) +1280 IF F$>="A"AND F$<="X"THEN FM=89-ASC(F$):GOTO 1320 +1300 FM=25:IF F$<>"="AND F$<>"-"THEN 1200 +1320 T$=MID$(IN$,2,1) +1340 IF T$="="OR T$="-"THEN TM=0:GOTO 1400 +1360 IF T$<"A"OR T$>"X"THEN 1200 +1380 TM=89-ASC(T$):N=0:M=FM-TM:K=1:L=0 +1400 IF FM=25 AND B(25)=0 THEN PRINT"YOU HAVE NO MEN ON THE BAR.":GOTO 1060 +1420 IF FM25 THEN PRINT"YOU HAVE MEN ON THE BAR.":GOTO 1060 +1460 IF B(FM)>=0 THEN PRINT"YOU HAVE NO MEN ON ";F$;".":GOTO 1060 +1480 IF TM=0 THEN 1920 +1500 L=0:FOR J=1 TO TU:IF US(J)THEN K=K+1:GOTO 1560 +1520 L=L+1:N=N+D(J):IF N=M THEN 1580 +1540 IF D(J)=M THEN K=J:L=1:GOTO 1580 +1560 NEXT J:PRINT"YOU CAN'T MOVE";M;".":GOTO 1060 +1580 IF B(TM)>1 THEN PRINT"POINT ";T$;" IS BLOCKED.":GOTO 1060 +1600 IF L=1 THEN GOSUB 5880:US(K)=1:GOTO 2580 +1620 IF B(25)<-1 THEN PRINT"YOU HAVE MEN ON THE BAR.":GOTO 1060 +1640 IF TU=4 THEN 1760 +1660 IF B(FM-D(1))<=1 THEN M=1:GOTO 1720 +1680 IF B(FM-D(2))<=1 THEN M=2:GOTO 1720 +1700 PRINT"THE PATH IS BLOCKED.":GOTO 1060 +1720 N=TM:TM=FM-D(M):GOSUB 5880:FM=TM:TM=N::GOSUB 5880:I=I+1 +1740 GOTO 2580 +1760 FOR N=1 TO L +1780 IF B(FM-D(1)*N)>1 THEN 1700 +1800 NEXT N +1820 FOR N=K TO J +1840 TM=FM-D(N):US(N)=1:GOSUB 5880 +1860 I=I+1:FM=TM:NEXT N +1880 I=I-1:GOTO 2580 +1900 NEXT K +1920 FOR J=7 TO 25:IF B(J)<0 THEN PRINT"YOU CAN'T CHEAT!!":GOTO 1060 +1940 NEXT J +1960 TM=26:FOR J=1 TO TU:IF US(J)=0 AND FM=D(J)THEN GOSUB 5880:US(J)=1:GOTO 2580 +1980 NEXT J +2000 IF FM=6 THEN 2080 +2020 FOR J=6 TO FM+1 STEP-1 +2040 IF B(J)<0 THEN PRINT"YOU CAN'T BEAR OFF FROM ";F$;".":GOTO 1060 +2060 NEXT J +2080 K=0:D(K)=0:FOR J=1 TO TU:IF US(J)=0 AND D(J)>FM AND D(J)>D(K)THEN K=J +2100 NEXT J +2120 IF K=0 THEN PRINT"YOU CAN'T MOVE";FM;".":GOTO 1060 +2140 PRINT"ASSUMING USE OF";D(K);".":US(K)=1 +2160 GOSUB 5880:GOTO 2580 +2180 IF B(25)>=0 THEN 2280 +2200 FOR J=1 TO 6 +2220 IF J=D(TU)AND US(TU)=0 AND B(25-J)<2 THEN 2560 +2240 IF J=D(TU-1)AND US(TU-1)=0 AND B(25-J)<2 THEN 2560 +2260 NEXT J:GOTO 2600 +2280 FOR J=24 TO 2 STEP-1 +2300 IF B(J)>=0 THEN 2360 +2320 IF J-D(TU-1)>0 THEN IF US(TU-1)=0 AND B(J-D(TU-1))<2 THEN 2560 +2340 IF J-D(TU)>0 THEN IF US(TU)=0 AND B(J-D(TU))<2 THEN 2560 +2360 NEXT J +2380 FOR J=24 TO 7 STEP-1:IF B(J)<0 THEN 2600 +2400 NEXT J +2420 IF US(TU)=0 AND B(D(TU))<0 THEN 2560 +2440 IF US(TU-1)=0 AND B(D(TU-1))<0 THEN 2560 +2460 IF US(TU)THEN D=D(TU-1):GOTO 2500 +2480 D=D(TU):IF US(TU-1)=0 AND DTU THEN 2800 +2700 IF B(D(K))<>-1 THEN 2680 +2720 US(K)=1:MO=MO+1 +2740 FM=0:TM=D(K):GOSUB 5880 +2760 PRINT"OFF BAR AND HIT BLOT AT ";MID$(AL$,TM,1) +2780 GOTO 2680 +2800 K=0 +2820 K=K+1:IF B(0)=0 OR K>TU THEN 2940 +2840 IF B(D(K))<0 OR US(K)>0 THEN 2820 +2860 US(K)=1:MO=MO+1 +2880 FM=0:TM=D(K):GOSUB 5880 +2900 PRINT"OFF BAR TO ";MID$(AL$,TM,1) +2920 GOTO 2820 +2940 IF B(0)=0 AND MO6 THEN 3380 +3020 FOR J=1 TO TU:L=25-D(J):IF B(L)<1 THEN 3060 +3040 FM=L:TM=27:GOSUB 5880:PRINT M$(0);MID$(AL$,L,1):MO=MO+1 +3150 GOSUB 8500:GOTO 3300 +3060 K=6 +3080 Y=25-K:IF B(L-K)<1 OR B(Y)<-1 THEN 3160 +3100 IF B(Y)=-1 THEN B(Y)=0 +3120 FM=L-K:TM=Y:GOSUB 5880 +3140 PRINT M$(3);MID$(AL$,Y,1);FR$;MID$(AL$,FM,1) +3150 GOSUB 8500:GOTO 3300 +3160 IF K>1 THEN K=K-1:GOTO 3080 +3180 K=1 +3200 IF L+K>24 THEN 3280 +3220 IF B(L+K)<1 THEN 3280 +3240 MO=MO+1:FM=L+K:TM=27:GOSUB 5880 +3260 PRINT M$(0);MID$(AL$,FM,1);" WITH ROLL OF";D(J) +3270 GOSUB 8500:GOTO 3300 +3280 IF K<6 THEN K=K+1:GOTO 3200 +3300 IF B(27)=15 THEN 5460 +3320 IF TU=MO THEN 4160 +3340 NEXT J +3360 GOTO 4160 +3380 IF TU=MO THEN 4160 +3400 IF TU-MO<2 THEN 3720 +3420 IF HB=0 THEN 3720 +3440 J=1 +3460 IF B(J)<>-1 THEN 3700 +3480 J1=J-D(1):J2=J-D(2):IF J1<1 OR J2<1 THEN 3700 +3500 IF D(1)=D(2)AND B(J1)=1 THEN 3700 +3520 IF B(J1)<1 OR B(J2)<1 THEN 3700 +3540 IF TU=4 THEN 3600 +3560 IF J1>18 AND B(J1)=2 THEN 3700 +3580 IF J2>18 AND B(J2)=2 THEN 3700 +3600 MV=MV-1:TM=J:FM=J1:GOSUB 5880:FM=J2:GOSUB 5880 +3620 PRINT M$(1);MID$(AL$,J,1);FR$; +3640 PRINT MID$(AL$,J1,1);" AND ";MID$(AL$,J2,1):MO=MO+2:HB=HB-1 +3650 GOSUB 8500 +3660 IF TU=4 THEN US(3)=1:US(4)=1 +3680 GOTO 3380 +3700 IF J<24 THEN J=J+1:GOTO 3460 +3720 TRY=0:Y=1 +3740 IF US(Y)=1 THEN 4120 +3760 GOSUB 5120 +3780 IF Y<>1 OR MO<>0 OR TU=4 OR BM=4 THEN 3900 +3800 S1=BS:F1=FM:M1=BM:Y=2:GOSUB 5120 +3820 S2=BS:F2=FM:M2=BM:Y=3:G=1:GOSUB 5120 +3840 G=0:IF BS>S1+S2 THEN Y=TM:TM=FM+D(Y):GOTO 3900 +3860 IF S2>S1 THEN FM=F2:Y=2:TM=F2+D(Y):BM=M2:GOTO 3900 +3880 FM=F1:Y=1:TM=F1+D(Y):BM=M1 +3900 IF BM<>4 THEN 4020 +3920 IF F<>1 THEN F=1:GOTO 3760 +3940 IF TRY0 OR B9 THEN PRINT M$(4);:GOSUB 8500:GOTO 4160 +3980 NEXT J:B9=1:GOTO 3020 +4000 GOTO 4120 +4020 IF BM=1 THEN HB=HB-1 +4040 MO=MO+1:US(Y)=1:IF HM<24-CM THEN BM=3:A=0 +4060 GOSUB 5880 +4080 PRINT M$(BM);MID$(AL$,TM,1);FR$;MID$(AL$,FM,1) +4090 GOSUB 8500 +4100 IF MO=TU THEN 4160 +4120 Y=Y+1:IF Y>TU THEN Y=1 +4140 GOTO 3740 +4160 NP=-1 +4180 GOTO 5460 +4200 PRINT M$(MN);MID$(AL$,TM,1); +4210 GOSUB 8500 +4220 PRINT ERAS$;:H=8:L$=" 2 ":M$=" 2 ":R$=" 2" +4240 ESC$=CHR$(27):GR$="":LC$="":RV$=ESC$+"j":RVO$=ESC$+"k" +4245 DA$(1)="q" +4250 ERAS$=CHR$(26):PRINT ERAS$ +4260 PRINT TAB(39);ESC$;"j";" A B C D E F = G H I J K L "RVO$ +4280 FOR I=1 TO 8 +4300 PRINT TAB(39);GR$"i ` ` ` iii ` ` ` i":NEXT +4320 FOR I=1 TO 2 +4340 PRINT TAB(39);GR$"i iii i"LC$:NEXT +4360 FOR I=1 TO 8 +4380 PRINT TAB(39);GR$; "i ` ` ` iii ` ` ` i"LC$:NEXT +4400 PRINT TAB(39);ESC$"j X W V U T S R Q P O N M "RVO$ +4420 GOTO 8320 +4440 PRINT RIGHT$(" "+STR$(13-I),2);"&";TAB(21);"&";MID$(STR$(I+12),2):RETURN +4460 FOR I=0 TO 25:B(I)=0:NEXT I:B(26)=-15:B(27)=15 +4480 B(1)=2:B(6)=-5:B(8)=-3:B(12)=5 +4500 B(13)=-5:B(17)=3:B(19)=5:B(24)=-2 +4520 FOR I=1 TO 24:N=B(I):TM=I:FM=27+(N<0) +4540 B(I)=0:IF N<>0 THEN FOR J=1 TO ABS(N):GOSUB 5880:NEXT J +4560 NEXT I +4580 PRINT A$; +4600 FOR L=1 TO 3:PRINT BK$:NEXT L +4640 RETURN +4660 PRINT ESC$"=";CHR$(31+6);CHR$(33+9);" ";:PRINT TEMP$;MID$("YOUR MY ",3+NP+NP,4);:PRINT" ROLL "; +4670 PRINT RO$ +4680 GOSUB 8280 +4700 RETURN +4720 PP=0:J6=24:IF K<13 THEN J6=K+12 +4740 FOR I=K TO J6:IF B(I)<0 THEN PP=PP+P(I-K) +4760 NEXT I:IF K>14 THEN PP=PP+P(25-K)*2 +4780 RETURN +4800 MS=3:CS=0 +4820 Q4=8*PR(BH)*(1+PR(BH)) +4840 Q5=8*PR(BC)*(1+PR(BC)) +4860 K=P5:GOSUB 4720:CZ=PP*(P5+Q4)*A +4880 K=P5+RL:GOSUB 4720:PZ=PP +4900 CW=PZ*(P5+RL+Q4)*A +4920 IF B(P5)=2 THEN CS=CS-CZ +4940 IF B(P5)=1 AND B(K)>0 THEN CS=CS+CZ:MS=5 +4960 IF B(K)=-1 THEN CS=CS+25-K+Q5:MS=1:IF K>18 THEN CS=CS-4 +4980 IF B(K)<>1 THEN 5040 +5000 CS=CS+CW:IF B(P5)>2 THEN MS=2 +5020 GOTO 5100 +5040 SM=0:J=20:NN=K+R1:IF NN<20 THEN J=NN +5060 FOR I=K TO J:IF B(I)=-1 THEN SM=SM+P(I-K)*(25-I) +5080 NEXT I:CS=CS-CW+(1-PZ)*SM +5100 RETURN +5120 BS=-999:BM=4:FM=0:TM=0:TRY=TRY+1 +5140 FOR L=24 TO 1 STEP-1:IF B(L)<1 THEN 5440 +5160 RL=D(Y):R=L+RL:IF R>24 THEN 5440 +5180 IF R-1 THEN 5440 +5200 IF B(R)<-1 THEN 5440 +5220 IF G<>1 THEN 5300 +5240 Q=0:L1=L+D(1):L2=L+D(2):IF B(L1)>-2 THEN Q=1 +5260 IF B(L2)>-2 THEN Q=2 +5280 IF Q=0 THEN 5440 +5300 P5=L:GOSUB 4800 +5320 IF G<>1 THEN 5400 +5340 MS=3:IF B(L1)=-1 THEN Q=1:CS=CS+25-L1:MS=1 +5360 IF B(L2)=-1 THEN Q=2:CS=CS+25-L2:MS=1 +5380 K=Q +5400 IF CS0 THEN CP=CP+B(I)*(25-I):JM=25-I +5580 IF JM>CM THEN CM=JM +5600 IF B(I)=-1 THEN HB=HB+1 +5620 IF B(I)=+1 THEN CB=CB+1 +5640 IF I<7 AND B(I)<-1 THEN BH=BH+1 +5660 IF I>18 AND B(I)>1 THEN BC=BC+1 +5680 NEXT +5700 XX=CP:IF HP.2 THEN S=1:F=6:A=.1 +5740 IF Y<-.1 THEN S=0:F=1:A=TT +5760 IF S=1 AND HM<6 THEN F=HM +5780 GOTO 900 +5800 PRINT ER$A$;X$;" WON BY";X;"POINTS." +5810 PRINT CN$ +5820 PRINT"TOTAL POINTS ROLLED";XH;DA$(1);XC;DA$(3):PRINT:INPUT"WANT TO PLAY AGAIN";X$ +5840 IF LEFT$(X$,1)="Y"THEN 640 +5860 PRINT CN$:END +5880 PT=FM:GOSUB 6060:P=SGN(B(FM)):GOSUB 6060:B(FM)=B(FM)-P +5900 IF FM=25 OR FM=0 THEN PRINT GR$"i";LC$:GOTO 5940 +5920 IF FM<26 THEN PRINT GR$;MID$(" `",2+((1 AND PT)=1 OR ABS(B(PT))>8),1);LC$ +5940 IF B(TM)<>-P THEN 5980 +5960 PT=-25*(P>0):B(PT)=B(PT)-P:GOSUB 6060:B(TM)=0 +5965 IF P=-1 THEN PRINT DA$(3)ELSE PRINT DA$(1) +5980 B(TM)=B(TM)+P:PT=TM:IF TM<26 THEN GOSUB 6060:PRINT DA$(2+P) +6000 IF MV<=-1 THEN MV=0 +6020 PRINT A$:MV=MV+1 +6040 RETURN +6060 IF PT>25 THEN RETURN +6080 IF PT=0 OR PT=25 THEN 6180 +6100 VT=ABS(B(PT)):IF PT<13 THEN VT=19-VT +6120 TB=ABS(12.5-PT)*2+1:IF TB>12 THEN TB=TB+4 +6140 TB=30-TB +6160 GOTO 6220 +6180 VT=-B(PT):IF VT<0 THEN VT=19+VT +6200 TB=15 +6220 PRINT ESC$"=";CHR$(31+2+VT);CHR$(31+40+TB);:RETURN +6240 LINE INPUT IN$ +6250 PRINT A$;CO$; +6260 RETURN +7000 REM INPUT SI WAS HERE +7010 GOSUB 4580 +7050 PRINT A$;" "; +7100 REM +7200 GOSUB 8250 +7300 INPUT "PRESS RETURN TO ROLL";ZZ$ +7400 RETURN +8000 REM DICE ROUTINE +8050 E$=CHR$(27):H$=CHR$(30) +8060 ER$=CHR$(26):PRINT ER$; +8070 RO$=E$+"k":PRINT RO$ +8080 EG$="" +8090 RV$=E$+"j" +8100 TEMP$=RV$ +8110 COF$="" +8120 CH$="" +8130 PRINT ER$ +8150 FOR I=1 TO 6:FOR J=1 TO 6:READ DI$(I,J):NEXT J,I +8160 DATA" "," ^","^ ","^ ^","^ ^","^^^" +8170 DATA" ^ "," "," ^ "," "," ^ "," " +8180 DATA" ","^ "," ^","^ ^","^ ^","^^^" +8190 DATA" ","^ "," ^","^ ^","^ ^","^ ^" +8200 DATA" ^ "," "," ^ "," "," ^ ","^ ^" +8210 DATA" "," ^","^ ","^ ^","^ ^","^ ^" +8220 RETURN +8250 FOR I=1 TO 2 +8260 FX=INT(RND(1)*6+1):T(I)=3*(RND(1)>.5)+3:CT(FX)=CT(FX)+1:D(I)=FX +8270 NEXT I +8275 RETURN +8280 PRINT H$;GR$;:FOR I=1 TO 3:PRINT +8283 FOR J=1 TO 2 +8285 IF DI$(I+T(J),D(J))=""THEN DI$(I+T(J),D(J))=" " +8290 PRINT TAB(2*J+7);"| "+DI$(I+T(J),D(J))+" | ";:NEXT J,I +8300 PRINT CHR$(27);"G";:PRINT +8310 RETURN +8320 PRINT H$;E$+"F";:PRINT TAB(8);" zzzzz zzzzz " +8330 FOR I=1 TO 3:PRINT TAB(9);"| | | |" +8340 NEXT I +8350 PRINT TAB(10)"zzzzz zzzzz" +8355 PRINT LC$ +8360 RETURN +8500 REM DELAY ROUTINE +8510 FOR I=1 TO 2000:NEXT I:RETURN +9000 RETURN : REM INSTRUCTION FILE READ ROUTINE WAS HERE + \ No newline at end of file diff --git a/Source/Images/d_games/u0/WORDPUZL.BAS b/Source/Images/d_games/u0/WORDPUZL.BAS new file mode 100644 index 00000000..761e6187 Binary files /dev/null and b/Source/Images/d_games/u0/WORDPUZL.BAS differ diff --git a/Source/Images/d_games/u0/ZILCH.BAS b/Source/Images/d_games/u0/ZILCH.BAS new file mode 100644 index 00000000..d1ab3bad --- /dev/null +++ b/Source/Images/d_games/u0/ZILCH.BAS @@ -0,0 +1,213 @@ +1 REM ZILCH (C) COPYRIGHT 1980 BY MORRIE WILSON +2 REM ****** ZILCH BY MORRIE WILSON +3 REM +4 REM A DICE GAME FOR 1 TO 9 PLAYERS, +5 REM AND THE COMPUTER CAN BE A PLAYER TOO. +6 REM +7 REM +8 REM THIS IS A FREE PROGRAM. NO COMMERCIAL USE ALLOWED. +9 REM FOR INFO: MORRIE WILSON / 2527 56TH SW /SEATTLE WASH / 98116 +10 REM IF YOU HAVE MICROSOFT 5.+ BASIC, REMOVE "REM" FROM LINE 35 +11 REM TO ALLOW IT TO GENERATE RANDOM NUMBERS. THIS PROGRAM IS +12 REM COMPATIBLE WITH MICROSOFT BASIC 4.51 AND 5.03 +13 REM IF CODING LOOKS STRANGE & REDUNDANT, IT IS BECAUSE I'M TRYING +14 REM TO REMAIN COMPATIBLE WITH BOTH BASICS. +15 REM +16 REM IF IT RUNS, BUT THE DICE VALUES ARE STRANGE, THEN ITS +17 REM PROBABLY THAT YOUR BASIC HANDLES RANDOM NUMBER GENERATION +18 REM DIFFERENTLY. CHECK OUT THE RND(X) STUFF IN LINE 74 +19 W6=250 +20 A1$="ABCDEF" +21 A=ASC("A") +22 PRINT TAB(30);"ZILCH" +23 A$="N":INPUT "DO YOU WANT INSTRUCTIONS ";A$ +24 IF LEFT$(A$,1)="Y" THEN GOSUB 149 +25 INPUT "NUMBER OF PLAYERS";N1 +26 N1=INT(N1):IF N1<1 THEN PRINT "WHAT....YOU CAN'T DO THAT":GOTO 25 +27 IF N1>9 THEN PRINT "TOO MANY PLAYERS FOR THIS GAME":GOTO 25 +28 FOR II=1 TO N1:PRINT "THE NAME PLEASE....OF PLAYER #";II;" " +29 INPUT N9$(II):FOR I9=1 TO LEN(N9$(II)):R9=R9+ASC(MID$(N9$(II),I9,1)):NEXT I9 +30 NEXT II +31 R9=R9*3.14161:IF R9>65000! THEN R9=R9/5.67:GOTO 31 +32 R9=INT(R9) +33 FOR I=1 TO 200:NEXT I +34 PRINT:PRINT +35 REM RANDOMIZE R9 +36 W7$="Y":W4=0:INPUT "CAN I PLAY TOO ";W7$ +37 IF LEFT$(W7$,1)<>"Y" THEN 40 +38 N1=N1+1:N9$(N1)="" +39 W4=N1 +40 S8=0 +41 FOR N=1 TO N1 : S1(N)=0 : NEXT N +42 FOR N=1 TO N1 +43 IF N=S8 THEN 137 +44 S=0:D=6:S9=0 +45 PRINT:PRINT:PRINT:PRINT "IT'S ";N9$(N);"'S TURN" +46 PRINT:PRINT +47 IF S8<>0 THEN PRINT "************************ LAST TURN******" +48 FOR K9=1 TO N1:PRINT N9$(K9);" HAS ";S1(K9):NEXT K9 +49 PRINT N9$(N)". YOUR GAME TOTAL SO FAR IS ";S1(N) +50 PRINT "CURRENT TURN SCORE IS ";S +51 S2=S1(N)+S +52 IF S2<500 THEN S2=0 +53 PRINT "IF YOU STOP NOW YOUR TOTAL WILL BE ";S2 +54 W$="DICE":IF D=1 THEN W$="DIE" +55 PRINT "YOU HAVE";D;" ";W$;" LEFT. DO YOU WISH TO ROLL "; +56 A$="Y":IF W4<>N THEN INPUT A$:GOTO 67 +57 PRINT "?";:FOR W5=1 TO W6:NEXT W5:A$="Y" +58 IF D<=2 THEN A$="N" +59 IF S2=0 THEN A$="Y" +60 IF S>999 AND D<=4 THEN A$="N" +61 W9=S2 +62 IF S8=0 THEN 66 +63 FOR W5=1 TO N1:IF W9N THEN INPUT "WHICH DIE DO YOU WISH TO KEEP";A$:GOTO 83 +80 PRINT "WHICH DIE DO YOU WISH TO KEEP? "; +81 FOR W5=1 TO W6*2:NEXT W5:A$=LEFT$(A1$,D) +82 PRINT A$ +83 PRINT:PRINT:IF A$="?" THEN GOSUB 204: GOTO 79 +84 IF LEN(A$)=0 THEN A$=LEFT$(A1$,D):GOTO 89 +85 L=LEN(A$):IF L<2 THEN 89 +86 FOR I=1 TO L-1:FOR II=I+1 TO L +87 IF MID$(A$,I,1)=MID$(A$,II,1) THEN 78 +88 NEXT II:NEXT I +89 L=LEN(A$):IF L>D THEN 78 +90 FOR D9=1 TO L:D8=ASC(MID$(A$,D9,1))-A+1 +91 IF D8<1 OR D8>D THEN 78 +92 H9(D9)=D1(D8) +93 NEXT D9 +94 IF L=1 THEN 100 +95 FOR I=1 TO L-1 +96 FOR J=1 TO L-I +97 IF H9(J)6 THEN 107 +101 FOR I=1 TO 6 +102 IF H9(I)<>I THEN 107 +103 NEXT I +104 S=S+1000 +105 D=0 +106 GOTO 121 +107 C=1 +108 IF C>L THEN 121 +109 IF C+2>L THEN 117 +110 FOR C9=C TO C+1 +111 IF H9(C9)<>H9(C9+1) THEN 117 +112 NEXT C9 +113 S=H9(C)*100+S +114 IF H9(C)=1 THEN S=S+900 +115 C=C+3:D=D-3 +116 GOTO 108 +117 IF H9(C)=5 THEN S=S+50:D=D-1 +118 IF H9(C)=1 THEN S=S+100:D=D-1 +119 C=C+1 +120 GOTO 108 +121 IF S=S9 THEN 126 +122 S9=S +123 IF D<>0 THEN 49 +124 PRINT "ALL DIE SCORED, YOU GET 6 MORE DIE TO CONTINUE" +125 D=6:GOTO 50 +126 S=0 +127 PRINT " *** ZILCH ***" +128 FOR W5=1 TO 300 : NEXT W5 +129 REM +130 IF S1(N)<>0 THEN 132 +131 IF S<500 THEN 133 +132 S1(N)=S1(N)+S +133 IF S8<>0 THEN 135 +134 IF S1(N)>4999 THEN S8=N +135 NEXT N +136 GOTO 42 +137 PRINT:PRINT:PRINT +138 Q=0 +139 FOR I=1 TO N1 +140 PRINT N9$(I);" HAS A SCORE OF ";S1(I) +141 IF S1(I)>Q THEN Q1=I:Q=S1(I) +142 NEXT I +143 PRINT:PRINT N9$(Q1);" HAS WON THIS GAME" +144 GOTO 145 +145 A$="Y":INPUT "WOULD YOU LIKE TO PLAY AGAIN";A$ +146 IF LEN(A$)=0 THEN A$="Y" +147 IF LEFT$(A$,1)="Y" THEN 25 +148 END +149 PRINT:PRINT:PRINT:PRINT +150 PRINT " ZILCH" +151 PRINT " BY MORRIE WILSON" +152 PRINT +153 PRINT +154 PRINT +155 PRINT "THIS IS THE GAME OF ZILCH. IT IS A DICE GAME FOR 1 TO 9 PLAYERS." +156 PRINT "THE OBJECT OF THE GAME IS TO ROLL DIE, AND GAIN THE MOST POINTS" +157 PRINT "DURING THE COURSE OF THE GAME. IN ORDER TO WIN, A COMBINATION OF" +158 PRINT "BOTH LUCK AND STRATEGY IS NECESSARY. WHAT YOU ROLL IS LUCK, BUT" +159 PRINT "WHAT YOU DO WITH YOUR ROLL IS STRATEGY. NOW FOR THE DETAILS" +160 PRINT +161 PRINT "PRESS RETURN TO CONTINUE";:INPUT A$ +162 FOR I=1 TO 25:PRINT:NEXT I +163 PRINT +164 PRINT "THE PLAY ROTATES AMONGST THE PLAYERS, WITH EACH PLAYER" +165 PRINT "COMPLETING A SERIES OF ROLLS WHICH COMPRISE HIS TURN." +166 PRINT +167 PRINT "A TURN CONSISTS OF STARTING OUT WITH SIX DIE. ALL OF THEM ARE" +168 PRINT "ROLLED. THE DIE ARE THEN EXAMINED, AND SOME OF THE DIE THAT" +169 PRINT "HAVE POINTS ARE PULLED FROM THE PLAY, WITH THE POINTS REPRESENTED" +170 PRINT "BEING ADDED TO A PLAYER'S TURN TOTAL. THE PLAYER THEN ROLLS" +171 PRINT "THE REMAINING DIE. THE PLAYER CONTINUES TO ROLL AND PULL DIE" +172 PRINT "UNTIL IT IS FELT THAT TO CONTINUE TO DO SO WILL RESULT IN A ZILCH." +173 PRINT "IF A PLAYER ROLLS THE DIE AND FINDS THAT NONE OF DIE HAVE POINTS" +174 PRINT "SHOWING, THEN THE PLAYER HAS ZILCHED, AND LOSES ALL POINTS THAT" +175 PRINT "HE HAS ACCUMULATED DURING THE CURRENT TURN. NOTE THAT POINTS" +176 PRINT "FROM PREVIOUS TURNS ARE NOT AFFECTED. CONFUSING, ISN'T IT?" +177 PRINT "WELL PLAY A FEW TIMES AND THEN IT WILL BECOME OBVIOUS." +179 PRINT +180 PRINT "PRESS RETURN TO CONTINUE";:INPUT A$ +181 FOR I=1 TO 25:PRINT:NEXT I +182 PRINT "A PLAYER MUST GET AT LEAST 500 POINTS IN ONE TURN" +183 PRINT "TO GET INTO THE GAME. AFTER THE INITIAL 500 POINTS IS" +184 PRINT "OBTAINED, THERE IS NO MINIMUM NUMBER OF POINTS NECESSARY TO +185 PRINT "ACCUMULATE MORE POINTS. +186 PRINT +187 PRINT "IF A PLAYER SCORES ON ALL SIX OF THE ORIGINAL DIE, SIX MORE" +188 PRINT "DIE ARE GIVEN TO OBTAIN ADDITIONAL POINTS (BUT WATCH OUT" +189 PRINT "FOR ZILCHING)." +190 PRINT +191 PRINT "WHENEVER A PLAYER GET 5000 OR MORE POINTS, ALL THE OTHER PLAYERS" +192 PRINT "GET ONE MORE TURN TO TRY TO BEAT THE HIGHEST SCORE. THE PLAYER" +193 PRINT "WITH THE HIGHEST SCORE WINS." +194 PRINT +195 PRINT "THE COMPUTER CAN ALSO ACT AS ONE OF THE PLAYERS, IF YOU LET HIM." +196 PRINT ", THE COMPUTER WILL ASK IF HE CAN PLAY LATER." +197 PRINT:PRINT:PRINT "PRESS RETURN TO CONTINUE";:INPUT A$ +198 FOR I=1 TO 25:PRINT:NEXT I +199 GOSUB 204 +200 PRINT "DURING THE PLAY OF THE GAME, A QUESTION MARK WILL GET YOU A " +201 PRINT "LISTING OF HOW THE DIE SCORE AGAIN." +202 PRINT:PRINT:PRINT:PRINT:PRINT +203 RETURN +204 PRINT "SCORING" +205 PRINT +206 PRINT "5 - 50 POINTS 1 - 100 POINTS" +207 PRINT "2 : 2 : 2 - 200 POINTS 3 : 3 : 3 - 300 POINTS" +208 PRINT "4 : 4 : 4 - 400 POINTS 5 : 5 : 5 - 500 POINTS" +209 PRINT "6 : 6 : 6 - 600 POINTS 1 : 1 : 1 - 1000 POINTS" +210 PRINT +211 PRINT "1 : 2 : 3 : 4 : 5 : 6 - (IN 1 ROLL, IN ANY ORDER) 1000 POINTS" +212 PRINT:PRINT "A RETURN WILL ALWAYS GIVE YOU THE MAXIMUM POINTS POSSIBLE" +213 PRINT:PRINT:PRINT:RETURN + \ No newline at end of file diff --git a/Source/Images/d_games/u0/ZORK1.COM b/Source/Images/d_games/u0/ZORK1.COM new file mode 100644 index 00000000..8a7bec1c Binary files /dev/null and b/Source/Images/d_games/u0/ZORK1.COM differ diff --git a/Source/Images/d_games/u0/ZORK1.DAT b/Source/Images/d_games/u0/ZORK1.DAT new file mode 100644 index 00000000..b2eb461f Binary files /dev/null and b/Source/Images/d_games/u0/ZORK1.DAT differ diff --git a/Source/Images/d_games/u0/ZORK2.COM b/Source/Images/d_games/u0/ZORK2.COM new file mode 100644 index 00000000..e4eac0e9 Binary files /dev/null and b/Source/Images/d_games/u0/ZORK2.COM differ diff --git a/Source/Images/d_games/u0/ZORK2.DAT b/Source/Images/d_games/u0/ZORK2.DAT new file mode 100644 index 00000000..d14dc8cd Binary files /dev/null and b/Source/Images/d_games/u0/ZORK2.DAT differ diff --git a/Source/Images/d_games/u0/ZORK3.COM b/Source/Images/d_games/u0/ZORK3.COM new file mode 100644 index 00000000..9b248ed2 Binary files /dev/null and b/Source/Images/d_games/u0/ZORK3.COM differ diff --git a/Source/Images/d_games/u0/ZORK3.DAT b/Source/Images/d_games/u0/ZORK3.DAT new file mode 100644 index 00000000..1aed0869 Binary files /dev/null and b/Source/Images/d_games/u0/ZORK3.DAT differ diff --git a/Source/Images/d_hitechc/Readme.txt b/Source/Images/d_hitechc/Readme.txt new file mode 100644 index 00000000..0207d76b --- /dev/null +++ b/Source/Images/d_hitechc/Readme.txt @@ -0,0 +1,26 @@ +===== HI-TECH Z80 CP/M C compiler V3.09-17 ===== + +The HI-TECH C Compiler is a set of software which +translates programs written in the C language to executable +machine code programs. Versions are available which compile +programs for operation under the host operating system, or +which produce programs for execution in embedded systems +without an operating system. + +This is the Mar 21, 2023 update 17 released by Tony Nicholson who currently +maintains HI-TECH C at https://github.com/agn453/HI-TECH-Z80-C + +The manual is available in the Docs directory, +HI-TECH Z80 C Compiler Manual.txt + +A good blog post about the HI-TECH C Compiler is available at +https://techtinkering.com/2008/10/22/installing-the-hi-tech-z80-c-compiler-for-cpm/ + +== License == + +The HI-TECH Z80 CP/M C compiler V3.09 is provided free of charge for any +use, private or commercial, strictly as-is. No warranty or product +support is offered or implied. + +You may use this software for whatever you like, providing you acknowledge +that the copyright to this software remains with HI-TECH Software. \ No newline at end of file diff --git a/Source/Images/d_hitechc/u0/$EXEC.COM b/Source/Images/d_hitechc/u0/$EXEC.COM new file mode 100644 index 00000000..a6ae8f51 Binary files /dev/null and b/Source/Images/d_hitechc/u0/$EXEC.COM differ diff --git a/Source/Images/d_hitechc/u0/ASSERT.H b/Source/Images/d_hitechc/u0/ASSERT.H new file mode 100644 index 00000000..b07e103d --- /dev/null +++ b/Source/Images/d_hitechc/u0/ASSERT.H @@ -0,0 +1,23 @@ +#ifndef _HTC_ASSERT_H +#define _HTC_ASSERT_H + +/* + * Assertion - use liberally for debugging. Defining NDEBUG + * turns assertions off. + * assert(exp) where exp is non-zero does nothing, while + * assert(exp) where exp evaluates to zero aborts the program + * with a message like + * + * Assertion failed: prog.c line 123: "exp" + * + */ + +#ifndef NDEBUG +extern void _fassert(int, char *, char *); +#define assert(exp) if(!(exp)) {_fassert(__LINE__, __FILE__, "exp");} +#else +#define assert(exp) +#endif + +#endif + \ No newline at end of file diff --git a/Source/Images/d_hitechc/u0/C.COM b/Source/Images/d_hitechc/u0/C.COM new file mode 100644 index 00000000..5c48dd02 Binary files /dev/null and b/Source/Images/d_hitechc/u0/C.COM differ diff --git a/Source/Images/d_hitechc/u0/C309.COM b/Source/Images/d_hitechc/u0/C309.COM new file mode 100644 index 00000000..deaa1b67 Binary files /dev/null and b/Source/Images/d_hitechc/u0/C309.COM differ diff --git a/Source/Images/d_hitechc/u0/CGEN.COM b/Source/Images/d_hitechc/u0/CGEN.COM new file mode 100644 index 00000000..fb2e3777 Binary files /dev/null and b/Source/Images/d_hitechc/u0/CGEN.COM differ diff --git a/Source/Images/d_hitechc/u0/CONIO.H b/Source/Images/d_hitechc/u0/CONIO.H new file mode 100644 index 00000000..d7b60408 --- /dev/null +++ b/Source/Images/d_hitechc/u0/CONIO.H @@ -0,0 +1,30 @@ +#ifndef _HTC_CONIO_H +#define _HTC_CONIO_H + +/* + * Low-level console I/O functions + */ + +#ifndef _STDDEF +typedef int ptrdiff_t; /* result type of pointer difference */ +typedef unsigned size_t; /* type yielded by sizeof */ +#define _STDDEF +#define offsetof(ty, mem) ((int)&(((ty *)0)->mem)) +#endif _STDDEF + +#ifndef NULL +#define NULL ((void *)0) +#endif NULL + +extern int errno; /* system error number */ + +extern char getch(void); +extern char getche(void); +extern void putch(int); +extern void ungetch(int); +extern int kbhit(void); +extern char * cgets(char *); +extern void cputs(char *); + +#endif + \ No newline at end of file diff --git a/Source/Images/d_hitechc/u0/CPM.H b/Source/Images/d_hitechc/u0/CPM.H new file mode 100644 index 00000000..499d8f62 --- /dev/null +++ b/Source/Images/d_hitechc/u0/CPM.H @@ -0,0 +1,215 @@ +#ifndef _HTC_CPM_H +#define _HTC_CPM_H + +/* Header file for CP/M routines for Z-80 C */ + +/* get basic definitions */ + +#ifndef _STDDEF +typedef int ptrdiff_t; /* result type of pointer difference */ +typedef unsigned size_t; /* type yielded by sizeof */ +#define _STDDEF + +#ifndef NULL +#define NULL ((void *)0) +#endif NULL + +extern int errno; /* system error number */ +#endif _STDDEF + +/* hitech.h has definitions for uchar, ushort etc */ + +#include +#if z80 +#define MAXFILE 8 /* max number of files open */ +#else z80 +#define MAXFILE 15 /* max number of files open */ +#endif z80 +#define SECSIZE 128 /* no. of bytes per sector */ + +extern struct fcb +{ + uchar dr; /* 0: drive code */ + char name[8]; /* 1: file name */ + char ft[3]; /* 9: file type */ + uchar ex; /* 12: file extent */ + char fil[2]; /* 13: not used */ + char rc; /* 15: number of records in present extent */ + char dm[16]; /* 16: CP/M disk map */ + char nr; /* 32: next record to read or write */ + uchar ranrec[3]; /* 35: random record number (24 bit no.) */ + long rwp; /* 38: read/write pointer in bytes */ + uchar use; /* 42: use flag */ + uchar uid; /* 43: user id belonging to this file */ + long fsize; /* 44: file length in bytes */ +} _fcb[MAXFILE]; + +extern short bdos(int, ...); +#define bdoshl bdos +#define bdose bdos +extern struct fcb* getfcb(void); +extern char * fcbname(short i); +extern short getuid(void); +extern short setuid(short); +extern uchar setfcb(struct fcb *, char *); +extern char * (*_passwd)(struct fcb *); +extern short bios(short fn, ...); +#define bios3 bios + +/* flag values in fcb use */ + +#define U_READ 1 /* file open for reading */ +#define U_WRITE 2 /* file open for writing */ +#define U_RDWR 3 /* open for read and write */ +#define U_CON 4 /* device is console */ +#define U_RDR 5 /* device is reader */ +#define U_PUN 6 /* device is punch */ +#define U_LST 7 /* list device */ +#define U_RSX 8 /* PIPEMGR RSX */ +#define U_ERR 9 /* PIPEMGR stderr channel */ + +/* special character values */ + +#define CPMETX 032 /* ctrl-Z, CP/M end of file for text */ +#define CPMRBT 003 /* ctrl-C, reboot CPM */ + +/* operating systems */ + +#define MPM 0x100 /* bit to test for MP/M */ +#define CCPM 0x400 /* bit to test for CCP/M */ + +#define ISMPM() (bdoshl(CPMVERS)&MPM) /* macro to test for MPM */ + +/* what to do after you hit return */ + +#define EXIT (*(int (*)())0) /* where to go to reboot CP/M */ + +/* BDOS calls etc. */ + +#define CPMRCON 1 /* read console */ +#define CPMWCON 2 /* write console */ +#define CPMRRDR 3 /* read reader */ +#define CPMWPUN 4 /* write punch */ +#define CPMWLST 5 /* write list */ +#define CPMDCIO 6 /* direct console I/O */ +#define CPMGIOB 7 /* get I/O byte */ +#define CPMSIOB 8 /* set I/O byte */ +#define CPMWCOB 9 /* write console buffered */ +#define CPMRCOB 10 /* read console buffered */ +#define CPMICON 11 /* interrogate console ready */ +#define CPMVERS 12 /* return version number */ +#define CPMRDS 13 /* reset disk system */ +#define CPMLGIN 14 /* log in and select disk */ +#define CPMOPN 15 /* open file */ +#define CPMCLS 16 /* close file */ +#define CPMFFST 17 /* find first */ +#define CPMFNXT 18 /* find next */ +#define CPMDEL 19 /* delete file */ +#define CPMREAD 20 /* read next record */ +#define CPMWRIT 21 /* write next record */ +#define CPMMAKE 22 /* create file */ +#define CPMREN 23 /* rename file */ +#define CPMILOG 24 /* get bit map of logged in disks */ +#define CPMIDRV 25 /* interrogate drive number */ +#define CPMSDMA 26 /* set DMA address for i/o */ +#define CPMGALL 27 /* get allocation vector address */ +#define CPMWPRD 28 /* write protect disk */ +#define CPMGROV 29 /* get read-only vector */ +#define CPMSATT 30 /* set file attributes */ +#define CPMDPB 31 /* get disk parameter block */ +#define CPMSUID 32 /* set/get user id */ +#define CPMRRAN 33 /* read random record */ +#define CPMWRAN 34 /* write random record */ +#define CPMCFS 35 /* compute file size */ +#define CPMSRAN 36 /* set random record */ +#define CPMRDRV 37 /* reset drive */ +#define CPMACDV 38 /* MP/M access drive */ +#define CPMFRDV 39 /* MP/M free drive */ +#define CPMWRZF 40 /* write random with zero fill */ +#define CPMTWR 41 /* MP/M test and write record */ +#define CPMLOKR 42 /* MP/M lock record */ +#define CPMUNLR 43 /* MP/M unlock record */ +#define CPMSMSC 44 /* CP/M+ set multi-sector count */ +#define CPMERRM 45 /* CP/M+ set BDOS error mode */ +#define CPMDFS 46 /* CP/M+ get disk free space */ +#define CPMCHN 47 /* CP/M+ chain to program */ +#define CPMFLSH 48 /* CP/M+ flush buffers */ +#define CPMGZSD 48 /* ZSDOS get ZSDOS/ZDDOS version */ +#define CPMSCB 49 /* access CP/M+ system control block */ +#define CPMBIOS 50 /* CP/M+ direct BIOS call */ +#define CPMDSEG 51 /* set DMA segment */ +#define CPMGFTM 54 /* Z80DOS/ZPM3 get file time-stamp */ +#define CPMSFTM 55 /* Z80DOS/ZPM3 set file time-stamp */ +#define CPMLDOV 59 /* CP/M+ Load Overlay - requires LOADER RSX */ +#define CPMRSX 60 /* CP/M+ call RSX */ +#define CPMLGI 64 /* CP/Net login */ +#define CPMLGO 65 /* CP/Net logout */ +#define CPMSMSG 66 /* CP/Net send message */ +#define CPMRMSG 67 /* CP/Net receive message */ +#define CPMNETS 68 /* CP/Net get network status */ +#define CPMGCFT 69 /* CP/Net get configuration table address */ +#define CPMSCAT 70 /* CP/Net set compatibility attributes */ +#define CPMGSVC 71 /* CP/Net get server configuration */ +#define CPMFRBL 98 /* CP/M+ free blocks */ +#define CPMTRNC 99 /* CP/M+ truncate file */ +#define CPMSLBL 100 /* CP/M+ set directory label */ +#define CPMDLD 101 /* CP/M+ get directory label data */ +#define CPMGFTS 102 /* CP/M+ get file timestamp and password mode */ +#define CPMWXFC 103 /* CP/M+ write file XFCB */ +#define CPMSDAT 104 /* CP/M+ set date and time */ +#define CPMGDAT 105 /* CP/M+ get date and time */ +#define CPMSPWD 106 /* CP/M+ set default password */ +#define CPMGSER 107 /* CP/M+ get serial number */ +#define CPMRCOD 108 /* CP/M+ get/set return code */ +#define CPMCMOD 109 /* CP/M+ get/set console mode */ +#define CPMODEL 110 /* CP/M+ get/set output delimiter */ +#define CPMPBLK 111 /* CP/M+ print block */ +#define CPMLBLK 112 /* CP/M+ list block */ +#define CPMPARS 152 /* CP/M+ parse filename */ + +/* CP/M BIOS functions. Numbers above 16 pertain to CP/M 3 only. */ + +enum BIOSfns +{ + _BOOT = 0, + _WBOOT = 1, + + _CONST = 2, + _CONIN = 3, + _CONOUT = 4, + _LIST = 5, + _PUNOUT = 6, /* CP/M 2.2 name */ + _AUXOUT = 6, /* CP/M 3.1 name */ + _RDRIN = 7, /* CP/M 2.2 name */ + _AUXIN = 7, /* CP/M 3.1 name */ + _LISTST = 15, + _CONOST = 17, + _AUXIST = 18, + _AUXOST = 19, + + _DEVTBL = 20, + _DEVINI = 21, + _DRVTBL = 22, + + _HOME = 8, + _SELDSK = 9, + _SETTRK = 10, + _SETSEC = 11, + _SETDMA = 12, + _READ = 13, + _WRITE = 14, + _SECTRN = 16, + _MULTIO = 23, + _FLUSH = 24, + + _MOVE = 25, + _SELMEM = 27, + _SETBNK = 28, + _XMOVE = 29, + + _TIME = 26, + _USERF = 30 +}; + +#endif + \ No newline at end of file diff --git a/Source/Images/d_hitechc/u0/CPP.COM b/Source/Images/d_hitechc/u0/CPP.COM new file mode 100644 index 00000000..dbe51271 Binary files /dev/null and b/Source/Images/d_hitechc/u0/CPP.COM differ diff --git a/Source/Images/d_hitechc/u0/CREF.COM b/Source/Images/d_hitechc/u0/CREF.COM new file mode 100644 index 00000000..d20a44db Binary files /dev/null and b/Source/Images/d_hitechc/u0/CREF.COM differ diff --git a/Source/Images/d_hitechc/u0/CRTCPM.OBJ b/Source/Images/d_hitechc/u0/CRTCPM.OBJ new file mode 100644 index 00000000..6f4ae8f0 Binary files /dev/null and b/Source/Images/d_hitechc/u0/CRTCPM.OBJ differ diff --git a/Source/Images/d_hitechc/u0/CTYPE.H b/Source/Images/d_hitechc/u0/CTYPE.H new file mode 100644 index 00000000..f6512e56 --- /dev/null +++ b/Source/Images/d_hitechc/u0/CTYPE.H @@ -0,0 +1,41 @@ +#ifndef _HTC_CTYPE_H +#define _HTC_CTYPE_H + +#define _U 0x01 +#define _L 0x02 +#define _N 0x04 +#define _S 0x08 +#define _P 0x10 +#define _C 0x20 +#define _X 0x40 + +extern unsigned char _ctype_[]; /* in libc.lib */ + +#define isalpha(c) ((_ctype_+1)[c]&(_U|_L)) +#define isupper(c) ((_ctype_+1)[c]&_U) +#define islower(c) ((_ctype_+1)[c]&_L) +#define isdigit(c) ((_ctype_+1)[c]&_N) +#define isxdigit(c) ((_ctype_+1)[c]&(_N|_X)) +#define isspace(c) ((_ctype_+1)[c]&_S) +#define ispunct(c) ((_ctype_+1)[c]&_P) +#define isalnum(c) ((_ctype_+1)[c]&(_U|_L|_N)) +#define isprint(c) ((_ctype_+1)[c]&(_P|_U|_L|_N|_S)) +#define isgraph(c) ((_ctype_+1)[c]&(_P|_U|_L|_N)) +#define iscntrl(c) ((_ctype_+1)[c]&_C) +#define isascii(c) (!((c)&0xFF80)) +/*--------------------------------------*\ + | Changed 2014-07-04 (Jon Saxton) | + |--------------------------------------| + | Original macro definitions | + | #define toupper(c) ((c)-'a'+'A') | + | #define tolower(c) ((c)-'A'+'a') | + |--------------------------------------| + | Use functions instead | +\*--------------------------------------*/ +extern int toupper(int); /* in LIBC.LIB */ +extern int tolower(int); /* in LIBC.LIB */ + +#define toascii(c) ((c)&0x7F) + +#endif + \ No newline at end of file diff --git a/Source/Images/d_hitechc/u0/DEBUG.COM b/Source/Images/d_hitechc/u0/DEBUG.COM new file mode 100644 index 00000000..299a60de Binary files /dev/null and b/Source/Images/d_hitechc/u0/DEBUG.COM differ diff --git a/Source/Images/d_hitechc/u0/DRTCPM.OBJ b/Source/Images/d_hitechc/u0/DRTCPM.OBJ new file mode 100644 index 00000000..b1006d79 Binary files /dev/null and b/Source/Images/d_hitechc/u0/DRTCPM.OBJ differ diff --git a/Source/Images/d_hitechc/u0/EXEC.H b/Source/Images/d_hitechc/u0/EXEC.H new file mode 100644 index 00000000..b9f1fca9 --- /dev/null +++ b/Source/Images/d_hitechc/u0/EXEC.H @@ -0,0 +1,22 @@ +#ifndef _HTC_EXEC_H +#define _HTC_EXEC_H + +/* + * Definitions of the EXEC format + */ + +#define EXITIT 0x80 +#define EXEC 0x81 +#define IGN_ERR 0x82 +#define DEF_ERR 0x83 +#define SKP_ERR 0x84 +#define TRAP 0x85 +#define IF_ERR 0x86 +#define IF_NERR 0x87 +#define ECHO 0x88 +#define PRINT 0x89 +#define RM_FILE 0x8A +#define RM_EXIT 0x8B + +#endif + \ No newline at end of file diff --git a/Source/Images/d_hitechc/u0/FLOAT.H b/Source/Images/d_hitechc/u0/FLOAT.H new file mode 100644 index 00000000..d1db206a --- /dev/null +++ b/Source/Images/d_hitechc/u0/FLOAT.H @@ -0,0 +1,73 @@ +#ifndef _HTC_FLOAT_H +#define _HTC_FLOAT_H + +/* Characteristics of floating types */ + +#define DBL_RADIX 2 /* radix of exponent for a double */ +#define DBL_ROUNDS 1 /* doubles round when converted to int */ +#define FLT_RADIX 2 /* radix of float exponent */ +#define FLT_ROUNDS 1 /* float also rounds to int */ + +#if z80 +#define FLT_MANT_DIG 24 /* 24 bits in mantissa */ +#define DBL_MANT_DIG 24 /* ditto for double */ +#define DBL_MANT_DIG 24 /* ditto long double */ +#define FLT_EPSILON -1.192093 /* smallest x, x+1.0 != 1.0 */ +#define DBL_EPSILON -1.192093 /* smallest x, x+1.0 != 1.0 */ +#define FLT_DIG 6 /* decimal significant digs */ +#define DBL_DIG 6 +#define FLT_MIN_EXP -62 /* min binary exponent */ +#define DBL_MIN_EXP -62 +#define FLT_MIN 1.084202e-19 /* smallest floating number */ +#define DBL_MIN 1.084202e-19 +#define FLT_MIN_10_EXP -18 +#define DBL_MIN_10_EXP -18 +#define FLT_MAX_EXP 64 /* max binary exponent */ +#define DBL_MAX_EXP 64 +#define FLT_MAX 1.84467e19 /* max floating number */ +#define DBL_MAX 1.84467e19 +#define FLT_MAX_10_EXP 19 /* max decimal exponent */ +#define DBL_MAX_10_EXP 19 +#endif z80 + +#if i8086 || m68k + +/* The 8086 and 68000 use IEEE 32 and 64 bit floats */ + +#define FLT_RADIX 2 +#define FLT_MANT_DIG 24 +#define FLT_EPSILON 1.19209290e-07 +#define FLT_DIG 6 +#define FLT_MIN_EXP -125 +#define FLT_MIN 1.17549435e-38 +#define FLT_MIN_10_EXP -37 +#define FLT_MAX_EXP 128 +#define FLT_MAX 3.40282347e+38 +#define FLT_MAX_10_EXP 38 +#define DBL_MANT_DIG 53 +#define DBL_EPSILON 2.2204460492503131e-16 +#define DBL_DIG 15 +#define DBL_MIN_EXP -1021 +#define DBL_MIN 2.225073858507201e-308 +#define DBL_MIN_10_EXP -307 +#define DBL_MAX_EXP 1024 +#define DBL_MAX 1.797693134862316e+308 +#define DBL_MAX_10_EXP 308 +#endif i8086 || m68k + + +/* long double equates to double */ + + +#define LDBL_MANT_DIG DBL_MANT_DIG +#define LDBL_EPSILON DBL_EPSILON +#define LDBL_DIG DBL_DIG +#define LDBL_MIN_EXP DBL_MIN_EXP +#define LDBL_MIN DBL_MIN +#define LDBL_MIN_10_EXP DBL_MIN_10_EXP +#define LDBL_MAX_EXP DBL_MAX_EXP +#define LDBL_MAX DBL_MAX +#define LDBL_MAX_10_EXP DBL_MAX_10_EXP + +#endif + \ No newline at end of file diff --git a/Source/Images/d_hitechc/u0/HITECH.H b/Source/Images/d_hitechc/u0/HITECH.H new file mode 100644 index 00000000..4a20f955 --- /dev/null +++ b/Source/Images/d_hitechc/u0/HITECH.H @@ -0,0 +1,74 @@ +#ifndef _HTC_HITECH_H +#define _HTC_HITECH_H + +/* Standard types for HI-TECH Software code + These types may need to be tuned for different + machines/compilers. Notes with each one indicate assumptions + that should be maintained for each type. + */ + + +/* + Turn ANSI on if the compiler supports function prototypes and + has the ANSI header files + + + */ + +#if HI_TECH_C +#define ANSI 1 +#endif HI_TECH_C + +/* shorthand types */ + +#define uchar unsigned char +#define ulong unsigned long +#define ushort unsigned short + +/* useful, tuneable types. Change only if: + + 1) compiler does not support type, e.g. unsigned char. + 2) compiler generates bad code for a particular type. + 3) a larger type would generate faster code, e.g. byte counters + on the 65816 are inefficient code-wise. + */ + +#define BOOL unsigned char /* boolean variable. Any integral type + will do. */ +#define FAST char /* fast, small counter. Must permit + values -128 to 127 but may be larger. */ +#define UFAST unsigned char /* fast, small unsigned counter. Must + permit values 0-255 at least */ +#define BYTE unsigned char /* sizeof(BYTE) must == 1 */ +#define INT_16 short /* signed, >= 16 bits */ +#define UINT_16 unsigned short /* unsigned, >= 16 bits */ +#define INT_32 long /* signed, >= 32 bits */ +#define UINT_32 unsigned long /* unsigned, >= 32 bits */ + + +/* Register variable selectors; REG1 is for things that must go + in registers at all costs, REG2 for things that should, REG3 for + things that could go in registers if there are any left over. + Ordering of declarations will of course come into it too. + */ + +#if z80 /* only has one register variable */ +#define REG1 register +#define REG2 auto +#define REG3 auto +#endif z80 + +#if i8086 /* only has two register variable */ +#define REG1 register +#define REG2 register +#define REG3 auto +#endif i8086 + +#if i8096 || m68k /* lots of registers! */ +#define REG1 register +#define REG2 register +#define REG3 register +#endif i8096 || m68k + +#endif + \ No newline at end of file diff --git a/Source/Images/d_hitechc/u0/LIBC.LIB b/Source/Images/d_hitechc/u0/LIBC.LIB new file mode 100644 index 00000000..f31ad7bc Binary files /dev/null and b/Source/Images/d_hitechc/u0/LIBC.LIB differ diff --git a/Source/Images/d_hitechc/u0/LIBF.LIB b/Source/Images/d_hitechc/u0/LIBF.LIB new file mode 100644 index 00000000..328f068f Binary files /dev/null and b/Source/Images/d_hitechc/u0/LIBF.LIB differ diff --git a/Source/Images/d_hitechc/u0/LIBOVR.LIB b/Source/Images/d_hitechc/u0/LIBOVR.LIB new file mode 100644 index 00000000..06656b43 Binary files /dev/null and b/Source/Images/d_hitechc/u0/LIBOVR.LIB differ diff --git a/Source/Images/d_hitechc/u0/LIBR.COM b/Source/Images/d_hitechc/u0/LIBR.COM new file mode 100644 index 00000000..7b764913 Binary files /dev/null and b/Source/Images/d_hitechc/u0/LIBR.COM differ diff --git a/Source/Images/d_hitechc/u0/LIMITS.H b/Source/Images/d_hitechc/u0/LIMITS.H new file mode 100644 index 00000000..048f2596 --- /dev/null +++ b/Source/Images/d_hitechc/u0/LIMITS.H @@ -0,0 +1,23 @@ +#ifndef _HTC_LIMITS_H +#define _HTC_LIMITS_H + +/* Characteristics of integral types */ + +#define CHAR_BIT 8 /* bits per char */ +#define CHAR_MAX 127 /* max value of a char */ +#define CHAR_MIN -128 /* min value */ +#define SCHAR_MAX CHAR_MAX /* chars are signed */ +#define SCHAR_MIN CHAR_MIN +#define UCHAR_MAX 255 /* for unsigned chars */ +#define SHRT_MAX 32767 /* max value of a short */ +#define SHRT_MIN -32768 +#define USHRT_MAX 65535 /* unsigned short */ +#define INT_MAX 32767 /* max for int */ +#define INT_MIN -32768 /* min for int */ +#define UINT_MAX 65535 /* unsigned int */ +#define LONG_MAX 2147483647 /* max value of long */ +#define LONG_MIN -2147483648 /* min value */ +#define ULONG_MAX 4294967295 /* unsigned long */ + +#endif + \ No newline at end of file diff --git a/Source/Images/d_hitechc/u0/LINQ.COM b/Source/Images/d_hitechc/u0/LINQ.COM new file mode 100644 index 00000000..6208ba53 Binary files /dev/null and b/Source/Images/d_hitechc/u0/LINQ.COM differ diff --git a/Source/Images/d_hitechc/u0/MATH.H b/Source/Images/d_hitechc/u0/MATH.H new file mode 100644 index 00000000..a5c25f40 --- /dev/null +++ b/Source/Images/d_hitechc/u0/MATH.H @@ -0,0 +1,13 @@ +#ifndef _HTC_MATH_H +#define _HTC_MATH_H + +extern double fabs(double), floor(double), ceil(double), modf(double, double *); +extern double sqrt(double), atof(char *); +extern double sin(double), cos(double), tan(double); +extern double asin(double), acos(double), atan(double), atan2(double, double); +extern double frexp(double, int *), ldexp(double, int); +extern double log(double), log10(double), pow(double, double), exp(double); +extern double sinh(double), cosh(double), tanh(double); + +#endif + \ No newline at end of file diff --git a/Source/Images/d_hitechc/u0/NRTCPM.OBJ b/Source/Images/d_hitechc/u0/NRTCPM.OBJ new file mode 100644 index 00000000..b7e726ee Binary files /dev/null and b/Source/Images/d_hitechc/u0/NRTCPM.OBJ differ diff --git a/Source/Images/d_hitechc/u0/OBJTOHEX.COM b/Source/Images/d_hitechc/u0/OBJTOHEX.COM new file mode 100644 index 00000000..65ed2302 Binary files /dev/null and b/Source/Images/d_hitechc/u0/OBJTOHEX.COM differ diff --git a/Source/Images/d_hitechc/u0/OPTIM.COM b/Source/Images/d_hitechc/u0/OPTIM.COM new file mode 100644 index 00000000..fcfcf04e Binary files /dev/null and b/Source/Images/d_hitechc/u0/OPTIM.COM differ diff --git a/Source/Images/d_hitechc/u0/OPTIONS b/Source/Images/d_hitechc/u0/OPTIONS new file mode 100644 index 00000000..c87efae6 --- /dev/null +++ b/Source/Images/d_hitechc/u0/OPTIONS @@ -0,0 +1,22 @@ +HI-TECH Z80 CP/M C compiler options: + +-A Generate a self-relocating .COM program. +-C Generate object code only; don't link. +-CR Produce a cross-reference listing e.g. -CRfile.crf +-D Define a symbol, e.g. -DDEBUG=1 +-E Specify executable output filename, e.g. -Efile.com +-Ffile Generate a symbol file for debug.com or overlay build (default L.SYM) +-H Output help (the OPTIONS file) and exit. +-I Specify an include directory, e.g. -I1:B: +-L Scan a library, e.g. -LF scans the floating point library. +-M Generate a map file, e.g. -Mfile.map +-N Use the NRTCPM.OBJ start-up with minimal _getargs(). +-O Invoke the peephole optimizer (reduced code-size) +-OF Invoke the optimizer for speed (Fast) +-S Generate assembler code in a .AS file; don't assemble or link. +-U Undefine a predefined symbol, e.g. -UDEBUG +-V Be verbose during compilation. +-W Set warning level, e.g. -w5 or -w-2 +-X Suppress local symbols in symbol tables. +-Y Generate an overlay output file (.OVR file-type) + \ No newline at end of file diff --git a/Source/Images/d_hitechc/u0/OVERLAY.H b/Source/Images/d_hitechc/u0/OVERLAY.H new file mode 100644 index 00000000..e83a08c4 --- /dev/null +++ b/Source/Images/d_hitechc/u0/OVERLAY.H @@ -0,0 +1,6 @@ +#ifndef _HTC_OVERLAY_H +#define _HTC_OVERLAY_H + +#include +intptr_t ovrload(char *ovr_name,intptr_t args); +#endif diff --git a/Source/Images/d_hitechc/u0/P1.COM b/Source/Images/d_hitechc/u0/P1.COM new file mode 100644 index 00000000..5caf0c6e Binary files /dev/null and b/Source/Images/d_hitechc/u0/P1.COM differ diff --git a/Source/Images/d_hitechc/u0/RRTCPM.OBJ b/Source/Images/d_hitechc/u0/RRTCPM.OBJ new file mode 100644 index 00000000..f892529f Binary files /dev/null and b/Source/Images/d_hitechc/u0/RRTCPM.OBJ differ diff --git a/Source/Images/d_hitechc/u0/SETJMP.H b/Source/Images/d_hitechc/u0/SETJMP.H new file mode 100644 index 00000000..a34df7dc --- /dev/null +++ b/Source/Images/d_hitechc/u0/SETJMP.H @@ -0,0 +1,24 @@ +#ifndef _HTC_SETJMP_H +#define _HTC_SETJMP_H + +#if z80 +typedef int jmp_buf[4]; +#endif + +#if i8086 +typedef int jmp_buf[8]; +#endif + +#if i8096 +typedef int jmp_buf[10]; +#endif + +#if m68k +typedef int jmp_buf[10]; +#endif + +extern int setjmp(jmp_buf); +extern void longjmp(jmp_buf, int); + +#endif + \ No newline at end of file diff --git a/Source/Images/d_hitechc/u0/SIGNAL.H b/Source/Images/d_hitechc/u0/SIGNAL.H new file mode 100644 index 00000000..0dcdb54b --- /dev/null +++ b/Source/Images/d_hitechc/u0/SIGNAL.H @@ -0,0 +1,36 @@ +#ifndef _HTC_SIGNAL_H +#define _HTC_SIGNAL_H + +/* + * Signal definitions for CP/M + */ +#ifdef unix +#define NSIG 17 +#define SIGHUP 1 /* hangup (not used by terminal driver) */ +#define SIGINT 2 /* interrupt (^C or BREAK) */ +#define SIGQUIT 3 /* quit (^\) */ +#define SIGILL 4 /* illegal instruction (not reset when caught) */ +#define SIGTRAP 5 /* trace trap (not reset when caught) */ +#define SIGIOT 6 /* IOT instruction */ +#define SIGEMT 7 /* EMT instruction */ +#define SIGFPE 8 /* floating point exception */ +#define SIGKILL 9 /* kill (cannot be caught or ignored) */ +#define SIGBUS 10 /* bus error */ +#define SIGSEGV 11 /* segmentation violation */ +#define SIGSYS 12 /* bad argument to system call */ +#define SIGPIPE 13 /* write on a pipe with no one to read it */ +#define SIGALRM 14 /* alarm clock */ +#define SIGTERM 15 /* software termination signal from kill */ +#else +#define NSIG 1 +#define SIGINT 1 /* control-C */ +#endif + +typedef void* signal_t; +#define SIG_DFL ((signal_t)0) /* default action is to exit */ +#define SIG_IGN ((signal_t)1) /* ignore them */ + +signal_t signal(int sig, signal_t action); + +#endif + \ No newline at end of file diff --git a/Source/Images/d_hitechc/u0/STAT.H b/Source/Images/d_hitechc/u0/STAT.H new file mode 100644 index 00000000..6166919f --- /dev/null +++ b/Source/Images/d_hitechc/u0/STAT.H @@ -0,0 +1,28 @@ +#ifndef _HTC_STAT_H +#define _HTC_STAT_H + +struct stat +{ + short st_mode; /* flags */ + long st_atime; /* access time */ + long st_mtime; /* modification time */ + long st_size; /* file size in bytes */ +}; + +/* Flag bits in st_mode */ + +#define S_IFMT 0x600 /* type bits */ +#define S_IFDIR 0x400 /* is a directory */ +#define S_IFREG 0x200 /* is a regular file */ +#define S_IREAD 0400 /* file can be read */ +#define S_IWRITE 0200 /* file can be written */ +#define S_IEXEC 0100 /* file can be executed */ +#define S_HIDDEN 0x1000 /* file is hidden */ +#define S_SYSTEM 0x2000 /* file is marked system */ +#define S_ARCHIVE 0x4000 /* file has been written to */ + + +extern int stat(char *, struct stat *); + +#endif + \ No newline at end of file diff --git a/Source/Images/d_hitechc/u0/STDARG.H b/Source/Images/d_hitechc/u0/STDARG.H new file mode 100644 index 00000000..c8511a93 --- /dev/null +++ b/Source/Images/d_hitechc/u0/STDARG.H @@ -0,0 +1,15 @@ +#ifndef _HTC_STDARG_H +#define _HTC_STDARG_H + +/* Macros for accessing variable arguments */ + +typedef void * va_list[1]; + +#define va_start(ap, parmn) *ap = (char *)&parmn + sizeof parmn + +#define va_arg(ap, type) (*(*(type **)ap)++) + +#define va_end(ap) + +#endif + \ No newline at end of file diff --git a/Source/Images/d_hitechc/u0/STDDEF.H b/Source/Images/d_hitechc/u0/STDDEF.H new file mode 100644 index 00000000..00eb9348 --- /dev/null +++ b/Source/Images/d_hitechc/u0/STDDEF.H @@ -0,0 +1,18 @@ +#ifndef _HTC_STDDEF_H +#define _HTC_STDDEF_H + +#ifndef _STDDEF +typedef int ptrdiff_t; /* result type of pointer difference */ +typedef unsigned size_t; /* type yielded by sizeof */ +#define _STDDEF +#define offsetof(ty, mem) ((int)&(((ty *)0)->mem)) +#endif _STDDEF + +#ifndef NULL +#define NULL ((void *)0) +#endif NULL + +extern int errno; /* system error number */ + +#endif + \ No newline at end of file diff --git a/Source/Images/d_hitechc/u0/STDINT.H b/Source/Images/d_hitechc/u0/STDINT.H new file mode 100644 index 00000000..e1330dea --- /dev/null +++ b/Source/Images/d_hitechc/u0/STDINT.H @@ -0,0 +1,15 @@ +#ifndef _HTC_STDINT_H +#define _HTC_STDINT_H + +#if z80||i8086||i8096||m68k +typedef unsigned char uint8_t; +typedef char int8_t; +typedef unsigned short uint16_t; +typedef short int16_t; +typedef unsigned long uint32_t; +typedef long int32_t; +typedef unsigned short intptr_t; +#endif + +#endif + \ No newline at end of file diff --git a/Source/Images/d_hitechc/u0/STDIO.H b/Source/Images/d_hitechc/u0/STDIO.H new file mode 100644 index 00000000..0475b896 --- /dev/null +++ b/Source/Images/d_hitechc/u0/STDIO.H @@ -0,0 +1,115 @@ +#ifndef _HTC_STDIO_H +#define _HTC_STDIO_H + +/* + * STDIO.H Modified version from Tesseract vol 91 + */ +#if z80 +#define BUFSIZ 512 +#define _NFILE 8 +#else z80 +#define BUFSIZ 1024 +#define _NFILE 20 +#endif z80 + +#ifndef FILE +#define uchar unsigned char + +extern struct _iobuf +{ + char *_ptr; + int _cnt; + char *_base; + unsigned short _flag; + char _file; +} _iob[_NFILE]; + +#endif FILE + +#ifndef SEEK_SET +#define SEEK_SET 0 +#define SEEK_CUR 1 +#define SEEK_END 2 +#endif + +#define _IOREAD 01 +#define _IOWRT 02 +#define _IORW 03 +#define _IONBF 04 +#define _IOMYBUF 010 +#define _IOEOF 020 +#define _IOERR 040 +#define _IOSTRG 0100 +#define _IOBINARY 0200 + /* New flags */ +#define _IODIRN 01000 /* Set if writing to a R/W file */ +#define _IOAPPEND 02000 /* Set if in append mode */ +#define _IOWROTE 04000 /* Write occurred since last seek */ + +#ifndef NULL +#define NULL ((void *)0) +#endif NULL + +#define FILE struct _iobuf +#define EOF (-1) + +#define stdin (&_iob[0]) +#define stdout (&_iob[1]) +#define stderr (&_iob[2]) +#define getchar() getc(stdin) +#define putchar(x) putc(x,stdout) + +/* + * getc() and putc() must be functions for CP/M to allow the special + * handling of '\r', '\n' and '\032'. The same for MSDOS except that + * it at least knows the length of a file. + */ + +#if UNIX +#define getc(p) (--(p)->_cnt>=0?(unsigned)*(p)->_ptr++:_filbuf(p)) +#define putc(x,p) (--(p)->_cnt>=0?((unsigned)(*(p)->_ptr++=x)):_flsbuf((unsigned)(x),p)) +#else UNIX +#define getc(p) fgetc(p) +#define putc(x,p) fputc(x,p) +#endif UNIX + +#define feof(p) (((p)->_flag&_IOEOF)!=0) +#define ferror(p) (((p)->_flag&_IOERR)!=0) +#define fileno(p) ((uchar)p->_file) +#define clrerr(p) p->_flag &= ~_IOERR +#define clreof(p) p->_flag &= ~_IOEOF + +#define L_tmpnam 34 /* max length of temporary names */ +#define L_TMPNAM (L_tmpnam) /* max length of temporary names */ + +extern int fclose(FILE *); +extern int fflush(FILE *); +extern int fgetc(FILE *); +extern int ungetc(int, FILE *); +extern int fputc(int, FILE *); +extern int getw(FILE *); +extern int putw(int, FILE *); +extern char *gets(char *); +extern int puts(char *); +extern int fputs(char *, FILE *); +extern int fread(void *, unsigned, unsigned, FILE *); +extern int fwrite(void *, unsigned, unsigned, FILE *); +extern int fseek(FILE *, long, int); +extern int rewind(FILE *); +extern int setbuf(FILE *, char *); +extern int printf(char *, ...); +extern int fprintf(FILE *, char *, ...); +extern int sprintf(char *, char *, ...); +extern int scanf(char *, ...); +extern int fscanf(FILE *, char *, ...); +extern int sscanf(char *, char *, ...); +extern int remove(char *); +extern FILE *fopen(char *, char *); +extern FILE *freopen(char *, char *, FILE *); +extern FILE *fdopen(int, char *); +extern long ftell(FILE *); +extern char *fgets(char *, int, FILE *); +extern char *_bufallo(void); + +#endif + \ No newline at end of file diff --git a/Source/Images/d_hitechc/u0/STDLIB.H b/Source/Images/d_hitechc/u0/STDLIB.H new file mode 100644 index 00000000..4066c6fc --- /dev/null +++ b/Source/Images/d_hitechc/u0/STDLIB.H @@ -0,0 +1,42 @@ +#ifndef _HTC_STDLIB_H +#define _HTC_STDLIB_H + +/* Standard utility functions */ + +#ifndef _STDDEF +typedef int ptrdiff_t; /* result type of pointer difference */ +typedef unsigned size_t; /* type yielded by sizeof */ + +#define offsetof(ty, mem) ((int)&(((ty *)0)->mem)) + +#define _STDDEF + +#ifndef NULL +#define NULL ((void *)0) +#endif NULL + +extern int errno; /* system error number */ +#endif _STDDEF + +#define RAND_MAX 32767 /* max value returned by rand() */ + +extern double atof(char *); +extern int atoi(char *); +extern long atol(char *); +extern int rand(void); +extern void srand(unsigned int); +extern void *calloc(size_t, size_t); +extern void free(void *); +extern void *malloc(size_t); +extern void *realloc(void *, size_t); +extern void abort(void); +extern void exit(int); +extern char *getenv(char *); +extern int system(char *); +typedef int (*__qsort_compf)(void *, void *); /* workaround compiler bug */ +extern void qsort(void *, size_t, size_t, __qsort_compf); +extern int abs(int); +extern long labs(long); + +#endif + \ No newline at end of file diff --git a/Source/Images/d_hitechc/u0/STRING.H b/Source/Images/d_hitechc/u0/STRING.H new file mode 100644 index 00000000..7ae3e51a --- /dev/null +++ b/Source/Images/d_hitechc/u0/STRING.H @@ -0,0 +1,54 @@ +#ifndef _HTC_STRING_H +#define _HTC_STRING_H + +/* String functions v3.09-4 */ + +#ifndef _STDDEF +typedef int ptrdiff_t; /* result type of pointer difference */ +typedef unsigned size_t; /* type yielded by sizeof */ +#define _STDDEF +#define offsetof(ty, mem) ((int)&(((ty *)0)->mem)) +#endif _STDDEF + +#ifndef NULL +#define NULL ((void *)0) +#endif NULL + +extern int errno; /* system error number */ + +extern void *memcpy(void *, void *, size_t); +extern void *memmove(void *, void *, size_t); +extern char *strcpy(char *, char *); +extern char *strncpy(char *, char *, size_t); +extern char *strcat(char *, char *); +extern char *strncat(char *, char *, size_t); +extern int memcmp(void *, void *, size_t); +extern int strcmp(char *, char *); +extern int strcasecmp(char *, char *); +#define stricmp strcasecmp +extern int strncmp(char *, char *, size_t); +extern int strncasecmp(char *, char *, size_t); +#define strnicmp strncasecmp +/* extern size_t strcoll(char *, size_t, char *); */ /* missing */ +extern void *memchr(void *, int, size_t); +/* extern size_t strcspn(char *, char *); */ /* missing */ +/* extern char *strpbrk(char *, char *); */ /* missing */ +/* extern size_t strspn(char *, char *); *//* missing */ +extern char *strstr(char *, char *); +extern char *strtok(char *, char *); +extern void *memset(void *, int, size_t); +extern char *strerror(int); +extern size_t strlen(char *); +extern char *strchr(char *, int); +/* #define index strchr */ /* these are equivalent */ +extern char *index(char *, int); +extern char *strrchr(char *, int); +/* #define rindex *strrchr */ /* these are equivalent */ +extern char *rindex(char *, int); +extern char *strcasestr(char *, char *); +#define stristr strcasestr +extern char *strncasestr(char *, char *, size_t); +#define strnistr strncasestr + +#endif + \ No newline at end of file diff --git a/Source/Images/d_hitechc/u0/SYMTOAS.COM b/Source/Images/d_hitechc/u0/SYMTOAS.COM new file mode 100644 index 00000000..ffdbf679 Binary files /dev/null and b/Source/Images/d_hitechc/u0/SYMTOAS.COM differ diff --git a/Source/Images/d_hitechc/u0/SYS.H b/Source/Images/d_hitechc/u0/SYS.H new file mode 100644 index 00000000..36d16de5 --- /dev/null +++ b/Source/Images/d_hitechc/u0/SYS.H @@ -0,0 +1,39 @@ +#ifndef _HTC_SYS_H +#define _HTC_SYS_H + +/* + * System-dependent functions. + */ + +#ifndef _STDDEF +typedef int ptrdiff_t; /* result type of pointer difference */ +typedef unsigned size_t; /* type yielded by sizeof */ +#define _STDDEF +#define offsetof(ty, mem) ((int)&(((ty *)0)->mem)) +#endif _STDDEF + +#ifndef NULL +#define NULL ((void *)0) +#endif NULL + +extern int errno; /* system error number */ + +extern int execl(char *, char *, char *, ...); +extern int execv(char *, char **); +extern int spawnl(char *, char *, char *, ...); +extern int spawnv(char *, char **); +extern int spawnle(char *, char *, char *, char *, ...); +extern int spawnve(char *, char **, char *); +extern short getuid(void); +extern short setuid(short); +extern int chdir(char *); +extern int mkdir(char *); +extern int rmdir(char *); +extern int getcwd(int); +extern char **_getargs(char *, char *); +extern int _argc_; +extern int inp(int); +extern void outp(int, int); + +#endif + \ No newline at end of file diff --git a/Source/Images/d_hitechc/u0/TIME.H b/Source/Images/d_hitechc/u0/TIME.H new file mode 100644 index 00000000..f1094d73 --- /dev/null +++ b/Source/Images/d_hitechc/u0/TIME.H @@ -0,0 +1,44 @@ +#ifndef _HTC_TIME_H +#define _HTC_TIME_H + +/* time.h for HI-TECH C Z80 v3.09-4*/ + +#ifndef _HTC_TIME_T + +typedef long time_t; /* for representing times in seconds */ +struct tm { + int tm_sec; + int tm_min; + int tm_hour; + int tm_mday; + int tm_mon; + int tm_year; + int tm_wday; + int tm_yday; + int tm_isdst; +}; +#define _HTC_TIME_T +#endif _HTC_TIME_T + +#ifndef _STDDEF +typedef int ptrdiff_t; /* result type of pointer difference */ +typedef unsigned size_t; /* type yielded by sizeof */ +#define _STDDEF +#define offsetof(ty, mem) ((int)&(((ty *)0)->mem)) +#endif + +extern int time_zone; /* minutes WESTWARD of Greenwich */ + /* this value defaults to 0 since with + operating systems like MS-DOS there is + no time zone information available */ + +extern time_t time(time_t *); /* seconds since 00:00:00 Jan 1 1970 */ +extern char * asctime(struct tm *); /* converts struct tm to ascii time */ +extern char * ctime(time_t *); /* current local time in ascii form */ +extern struct tm * gmtime(time_t *); /* Universal time */ +extern struct tm * localtime(time_t *); /* local time */ +extern size_t strftime(char *s, size_t maxs, char *f, struct tm *t); +extern time_t mktime(struct tm *); /* convert struct tm to time value */ + +#endif + \ No newline at end of file diff --git a/Source/Images/d_hitechc/u0/UNIXIO.H b/Source/Images/d_hitechc/u0/UNIXIO.H new file mode 100644 index 00000000..82bfb14d --- /dev/null +++ b/Source/Images/d_hitechc/u0/UNIXIO.H @@ -0,0 +1,34 @@ +#ifndef _HTC_UNIXIO_H +#define _HTC_UNIXIO_H + +/* + * Declarations for Unix style low-level I/O functions. + */ + +#ifndef _STDDEF +typedef int ptrdiff_t; /* result type of pointer difference */ +typedef unsigned size_t; /* type yielded by sizeof */ +#define _STDDEF +#define offsetof(ty, mem) ((int)&(((ty *)0)->mem)) +#endif _STDDEF + +#ifndef NULL +#define NULL ((void *)0) +#endif NULL + +extern int errno; /* system error number */ + +extern int open(char *, int); +extern int close(int); +extern int creat(char *, int); +extern int dup(int); +extern long lseek(int, long, int); +extern int read(int, void *, int); +extern int rename(char *, char *); +extern int unlink(char *); +extern int write(int, void *, int); +extern int isatty(int); +extern int chmod(char *, int); + +#endif + \ No newline at end of file diff --git a/Source/Images/d_hitechc/u0/ZAS.COM b/Source/Images/d_hitechc/u0/ZAS.COM new file mode 100644 index 00000000..7746c149 Binary files /dev/null and b/Source/Images/d_hitechc/u0/ZAS.COM differ diff --git a/Source/Images/d_nzcom/ReadMe.txt b/Source/Images/d_nzcom/ReadMe.txt index 66bb4400..5ba7e09a 100644 --- a/Source/Images/d_nzcom/ReadMe.txt +++ b/Source/Images/d_nzcom/ReadMe.txt @@ -15,8 +15,8 @@ this disk. It is highly recommended that you review the "RomWBW User Guide.pdf" document found in the Doc directory of the RomWBW Distribution. -The primary documentation for NZ-COM is the "NZCOM Users Manual.pdf" -document contained in the Doc directory of the RomWBW distribution. +The primary documentation for NZ-COM is the "NZCOM Users Manual.pdf" +document contained in the Doc directory of the RomWBW distribution. This document is a supplement to the primary documentation. Additionally, please review the file called RELEASE.NOT on this disk which contains a variety of updates regarding the NZ-COM distribuition. @@ -62,7 +62,7 @@ The following additional customizations were also performed: - The following files from the original distribution were removed because newer versions are included: - + - COPY.COM - CRUNCH.COM - LBREXT.COM @@ -73,13 +73,13 @@ The following additional customizations were also performed: == NZCOM Files == -The following files came from the official NZCOM distribution. These -are generally documented in the "NZCOM Users Manual.pdf" document in -the Doc directory of the RomWBW distribution. Note that some of the -files included in the NZ-COM distribution are not listed below because -they have been superseded by more recent versions listed in other -sections below. For example, TCSELECT is not listed here, but a more -recent version is included and documented in the General Purpose +The following files came from the official NZCOM distribution. These +are generally documented in the "NZCOM Users Manual.pdf" document in +the Doc directory of the RomWBW distribution. Note that some of the +files included in the NZ-COM distribution are not listed below because +they have been superseded by more recent versions listed in other +sections below. For example, TCSELECT is not listed here, but a more +recent version is included and documented in the General Purpose Applications section below. !(C)1988 - Original copyright (since placed in public domain) @@ -289,6 +289,11 @@ LBREXT.COM - Extract file from .LBR libraries LBREXT36.CFG - ZCNFG configuration file for LBREXT ZXD.COM - Enhanced directory lister w/ date/time stamp support ZXD.CFG - ZCNFG configuration file for ZXD +BBCBASIC.COM - BBC BASIC CP/M Version 3.00 by R.T.Russell +BBCBASIC.TXT - Help file for BBC BASIC +GENHEX.COM - Generates an Intel Hex file from the input file +LS.COM - An alternative file listing to DIR +LSWEEP.COM - Can extract and view member files of an .LBR archive == Testing Applications (User Area 2) == diff --git a/Source/Images/d_qpm/ReadMe.txt b/Source/Images/d_qpm/ReadMe.txt index 08898aaf..5704aba2 100644 --- a/Source/Images/d_qpm/ReadMe.txt +++ b/Source/Images/d_qpm/ReadMe.txt @@ -7,8 +7,8 @@ tracks was created using QINSTALL with default settings EXCEPT for the two settings described under Notes (current drive/user storage address and TIMDAT vector). -QINSTALL can be run again as desired to further customize your -installation. However, note that QINSTALL does NOT remember prior +QINSTALL can be run again as desired to further customize your +installation. However, note that QINSTALL does NOT remember prior settings, so you must reapply all settings you made previously especially the two setting changes described below. @@ -36,11 +36,19 @@ code brakpoints. This conflicts the use of that vector for any system that is using interrupt mode 1. DEBUGZ can be configured (using DBGINST) to use a different vector. -The QSTAMP program, which is used to initialize a disk for date/time -stamping, misbehavews when run on the (new) RomWBW 1024 directory -format disks. It creates an invalid directory entry for the -date/time stamp data file. This is definitely a QP/M issue. The -directory entry can be manually corrected. +The QSTAMP program, which is used to initialize a disk for date/time +stamping, misbehavews when run on the (new) RomWBW 1024 directory +format disks. It creates an invalid directory entry for the date/time +stamp data file. This is definitely a QP/M issue. The directory entry +can be manually corrected. Specifically the byte offset 15 should +contain the number of 128-byte records in the file. Instead, it is set +to 0x01. You can edit the entry, change it to 0x80 and everything +starts working. + +There are two text files (QPMCMDS.TXT and QPMUTILS.TXT) included. They +came from the original QP/M 2.7 distribution. These files have +escape sequences imbedded in them which makes them look a little +strange depending on the terminal emulation you are using. == QPM 2.7 Files == @@ -48,10 +56,9 @@ The following files came from the official QP/M distribution. Actually, they came from 3 Microcode Consulting files (qpm27.zip, debugz.zip, and linkz.zip). The original distribution files can be found on the Microcode Consulting website at https://www.microcodeconsulting.com/. -Documentation (pdf) files are incuded in these original distribution -.zip files. These documentation files have not been included in the -RomWBW distribution. Please retrieve them yourself from the website -if desired. +Documentation (pdf) files are included in these original distribution +.zip files. These documentation files have been included in the +RomWBW distribution in the Doc folder. D.COM - Directory lister DBGINST.COM - Configures DEBUGZ debugger @@ -168,6 +175,11 @@ LBREXT.COM - Extract file from .LBR libraries LBREXT36.CFG - ZCNFG configuration file for LBREXT ZXD.COM - Enhanced directory lister w/ date/time stamp support ZXD.CFG - ZCNFG configuration file for ZXD +BBCBASIC.COM - BBC BASIC CP/M Version 3.00 by R.T.Russell +BBCBASIC.TXT - Help file for BBC BASIC +GENHEX.COM - Generates an Intel Hex file from the input file +LS.COM - An alternative file listing to DIR +LSWEEP.COM - Can extract and view member files of an .LBR archive == Testing Applications (User Area 2) == diff --git a/Source/Images/d_qpm/u0/qpm.sys b/Source/Images/d_qpm/u0/qpm.sys deleted file mode 100644 index 78ce325f..00000000 Binary files a/Source/Images/d_qpm/u0/qpm.sys and /dev/null differ diff --git a/Source/Images/d_tpascal/Readme.txt b/Source/Images/d_tpascal/Readme.txt new file mode 100644 index 00000000..e318f988 --- /dev/null +++ b/Source/Images/d_tpascal/Readme.txt @@ -0,0 +1,15 @@ +==== Borland Turbo Pascal Compiler v3.01A ===== + +Pascal is a general-purpose, high level programming language originally +designed by Professor Niklaus Wirth of the Technical University of Zurich, +Switzerland and named in honor of Blise Pascal, the famous French philosopher +and mathematician. + +Turbo Pascal closely follows the definition of Standard Pascal as defined in +the Pascal User Manual and Report with a few minor differences. + +The manual can be found in the Docs directory, +Turbo_Pascal_Version_3.0_Reference_Manual_1986.pdf + +A good overview of using Turbo Pascal in CP/M is available at +https://techtinkering.com/2013/03/05/turbo-pascal-a-great-choice-for-programming-under-cpm/ diff --git a/Source/Images/d_tpascal/u0/ART.TXT b/Source/Images/d_tpascal/u0/ART.TXT new file mode 100644 index 00000000..fc95dc87 --- /dev/null +++ b/Source/Images/d_tpascal/u0/ART.TXT @@ -0,0 +1,263 @@ + + _________________________________________________________ + |\=========================================================\ + || | + || _ __ ___ __ _ | + || ; `-.__.-'. `-.__.-'. .`-.__.-' .`-.__.-' : | + || _.'. . . . . . . . .,,,,,,,. . . . . . . . .`._ | + || .'. . . . . . . . ,a@@@@@@@@@@@a, . . . . . . . .`. | + || `. . . . ,a@@@@@a@@@a@@@@@@@@@a@@@a@@@@@a, . . . ,' | + || ) . . a@@@@@@a@@@@@a@@@@@@@a@@@@@a@@@@@@a . . ( | + || ,' . . .@@@%%%a@@@@@@@@@@@@@@@@@@@@@a%%%@@@ . . `. | + || `.. . . @@@%%a@@@@@@""@@@@@@@""@@@@@@a%%@@@ . . .,' | + || ). . . "@@a@@@@@@@@@SSSSSSS@@@@@@@@@a@@" . . .( | + || ,'. . . . . `@@@@@@@@SSS, ,SSS@@@@@@@@' . . . . .`. | + || `. . . . . . `@@@@@@@`SSS:SSS'@@@@@@@' . . . . . ,' | + || ) . . . . . `@@@@@@@sssssss@@@@@@@' . . . . . ( | + || ,' . . . . . ,a@@a@@@@@@@@@@@@@@@a@@a, . . . . . `. | + || `.. . . . .a@@@a@@@@@a@@@a@@@a@@@@@a@@@a. . . . .,' | + || ). . . .a@@@@@a@@@@@@@@@@@@@@@@@a@@@@@a. . . .( | + || ,'. . . . @@@@@@a@@@@' " `@@@@a@@@@@@ . . . .`. | + || `. . . . .@@@@@@@aaaa, ,aaaa@@@@@@@ . . . ,' | + || ) . . . `@@@@@@@@@@@@a, ,a@@@@@@@@@@@@' . . . ( | + || ,' . . . . .`@@@@@@@@@@a@a@a@@@@@@@@@@'. . . . . `. | + || `;;;;;;;;;;;;aaaaaaaaaa@@@@@aaaaaaaaaa;;;;;;;;;;;;' | + || );;;;;;;,mMMMMMMMm@@@@@@@@@@@mMMMMMMMm,;;;;;;;( | + || ,;;;;;;;;a@%#%%#%%#%Mm@@@@@@@mM%#%%#%%#%@a;;;;;;;;, | + || `;;;;;;;;@@%%%%%%%%%%M@@";"@@M%%%%%%%%%%@@;;;;;;;;' | + || );;;;;;`@a%%%%%%%%mM";;;;;"Mm%%%%%%%%a@';;;;;;( | + || ,;;;;;;;;;;"@@@@@@@@";;;;;;;;;"@@@@@@@@";;;;;;;;;;, | + || `;;;;;;;;;;;;"""""";;;;;;;;;;;;;"""""";;;;;;;;;;;;' | + || );;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-Catalyst( | + || `:;;;:-~~~-:;;:-~~~-:;;;;;:-~~~-:;;:,-~~~-:;;;:' | + || ~~~ ~~ ~~~ ~~ ~~~ | + || .=============. | + || | Mr. Bear : | + || `-------------' | + \|_________________________________________________________| + + + + + + + + .,%%%%%,. ..,,,,.. + .%%%;%;%;%;%, .,%%%%%%%,%%%%%%,. .,,,,. + %%%;a@@@@@a;;,%%%%%%%%%%%%%%%%%%%%%%,;%%;%;%;%%, + %%%;@@@@@@a;,%%%%%%%%%%%%%%,%%%%%%%%%%;a@@@@a;%%% + `%%%;@@@a;,%%%%%%%%%%%%%%%%%%%%%%%%%%%%;a@@@@;%%% + `%%%;;,%%%%%%%%%%%%%% .%%%,%% .%%%%%%%;a@@;%%%' + ```%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%;%%%%' + %%%%%%%%%%%%%%%%%%%' #`%%%%%%%%%%' + %%%%%%%%%%%%%%%%%%%,. .,%%%%%%%%%% + %%%%%%%%%%%%%%%;a@@@@a;a@@@a;%%%%%% + `%%%%%%%%%%%;a@@@a@@@@a;a@@a@a;%%%' + `%%%%%%%%%;@@@a@@@a@@@;a@a@a@;%%' ..,,. + ,sSSSSSs`%%%%%%%;@@@@@@@@@;a@@@@@;%' .,%%%,;;;;, + .S@S;;;;;SSs %%%%%%%%%%%%%%%%%%%%%%' .,%%%%%%,;;;;;;, + S@@SSss;;;;sSs,s@SSSS@,sSSSSSSSSs,.%%%%%%%%%%%,;;;;;;, + `S@@SSSSSSs;;Ss@@SSSS@@sSs;;;;;;S@s,%%%%%%%%%%%,;;;;;; + .S@@SSSSSSSSSSs@@SSSS@@sSSSSSs;;;@@S,%%%%%%%%%%%%,;;;' + S@@SSSSSSSSSSS'`@SSSS@s`SSSSSSSSs@S',%%%%%%%%%%%%%%' + %`S@SSSSSSSSS'.SSSssssSSS`SSSSSSS@S'%%,%%%%%%%%%%' + .%%%%,""""""%%.sSSSSS^SSSSSs%`SSSSSS'%%%%,%%%%%' + .%%%%%%%%%%%%.sSSSSSSS'.sSSSSS,%%"""",%%%%%%,%' + .%%%%%%%%%%%.sSSSSSSSS'.SSSSSSSS,%%%%%%%%%%%%%. + .%.%.%.%.%.%.SSSSSSSSS',SSSS^SSSSS,%,%%%%%%%%%%% + %;;;;;;;;;%,SSSSS^SSSS,,SSS',SSSS'%%%%%%%%%%%%%%, + ;;;;;;;;;;;,SSSS'%`SS';%`S'%,SS'%%%%%,%%%%%%%%%%% + `;;;;;;;;'%`SS'%%,S'%%%%,%,S'%%%%%%%%%%%%%%%%%%% + %%%`S,%%%%%%%%%%%%%%%%%%%%,%%%%%%%%%%%' + ;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + .%`%%%%%%%%%%%%%%%%%%%%%%,%%%%%%%%%%%'% + %%%`%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%'%%%. + ;%%%%%`%%%%%%%%%%%%%%%%,%%%%%%%%%'%%%%%%%. + %%%%%%%;%:%:%:%:%%%'`%%:%:%:%:%:%%%%%%%%%%, + %%%%%%%%%%%%%%%%%%%. `%%%%%%%%%%%%%%%%%%%%%%, + %%%%%%%%%%%%%%%%%%%% `%%%%%%%%%%%%%%%%%%%%%%, + %%%%%%%%%%%%%%%%%%%%. `%%%%%%%%%%%%%%%%%%%%%%, + %%%%%%%%%%%%%%%%%%%%% `%%%%%%%%%%,%%%,%%%,%%%, + %%%%%%%%,%%%,%%%,%%,%. `%%%%%,;;;;;;;;;;;;;,%, + `%%%%,;;;;;;;;;;;;;;,% `%%,;;;;;;;;;;;;;;;;;; + `%,;;;;;;;;;;;;;;;;;; `;;;;;;;;;;;;;;;;;;;' + `%;;;;;;;;;;;;;;;;;' `;;;;;;;;;;;;;;;' + `;;;;;;;;;;;;;;' ''''''''''' + + + + + + .... + W$$$$$u + $$$$F**+ .oW$$$eu + ..ueeeWeeo.. e$$$$$$$$$ + .eW$$$$$$$$$$$$$$$b- d$$$$$$$$$$W + ,,,,,,,uee$$$$$$$$$$$$$$$$$$$$$ H$$$$$$$$$$$~ + :eoC$$$$$$$$$$$C""?$$$$$$$$$$$$$$$ T$$$$$$$$$$" + $$$*$$$$$$$$$$$$$e "$$$$$$$$$$$$$$i$$$$$$$$F" + ?f"!?$$$$$$$$$$$$$$ud$$$$$$$$$$$$$$$$$$$$*Co + $ o$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ + !!!!m.*eeeW$$$$$$$$$$$f?$$$$$$$$$$$$$$$$$$$$$$$$$$$$$U + !!!!!! !$$$$$$$$$$$$$$ T$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ + *!!*.o$$$$$$$$$$$$$$$e,d$$$$$$$$$$$$$$$$$$$$$$$$$$$$$: + "eee$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$C + b ?$$$$$$$$$$$$$$**$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$! + Tb "$$$$$$$$$$$$$$*uL"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$' + $$o."?$$$$$$$$F" u$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ + $$$$en ``` .e$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$' + $$$B* =*"?.e$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$F + $$$W"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$" + "$$$o#$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$" + R: ?$$$W$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$" :!i. + !!n.?$???""``.......,``````"""""""""""`` ...+!!! + !* ,+::!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*` + "!?!!!!!!!!!!!!!!!!!!~ !!!!!!!!!!!!!!!!!!!~` + +!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!?!` + .!!!!!!!!!!!!!!!!!!!!!' !!!!!!!!!!!!!!!, !!!! + :!!!!!!!!!!!!!!!!!!!!!!' !!!!!!!!!!!!!!!!! `!!: + .+!!!!!!!!!!!!!!!!!!!!!~~!! !!!!!!!!!!!!!!!!!! !!!. + :!!!!!!!!!!!!!!!!!!!!!!!!!.`:!!!!!!!!!!!!!!!!!:: `!!+ + "~!!!!!!!!!!!!!!!!!!!!!!!!!!.~!!!!!!!!!!!!!!!!!!!!.`!!: + ~~!!!!!!!!!!!!!!!!!!!!!!! ;!!!!~` ..eeeeeeo.`+!.!!!!. + :.. `+~!!!!!!!!!!!!!!!!! :!;`.e$$$$$$$$$$$$$u . + $$$$$$beeeu.. `````~+~~~~~" ` !$$$$$$$$$$$$$$$$ $b + $$$$$$$$$$$$$$$$$$$$$UU$U$$$$$ ~$$$$$$$$$$$$$$$$ $$o + !$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$. $$$$$$$$$$$$$$$~ $$$u + !$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$! $$$$$$$$$$$$$$$ 8$$$$. + !$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$X $$$$$$$$$$$$$$`u$$$$$W + !$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$! $$$$$$$$$$$$$".$$$$$$$: + $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ $$$$$$$$$$$$F.$$$$$$$$$ + ?$$$$$$$$$$$$$$$$$$$$$$$$$$$$f $$$$$$$$$$$$' $$$$$$$$$$. + $$$$$$$$$$$$$$$$$$$$$$$$$$$$ $$$$$$$$$$$$$ $$$$$$$$$$! + "$$$$$$$$$$$$$$$$$$$$$$$$$$$ ?$$$$$$$$$$$$ $$$$$$$$$$! + "$$$$$$$$$$$$$$$$$$$$$$$$Fib ?$$$$$$$$$$$b ?$$$$$$$$$ + "$$$$$$$$$$$$$$$$$$$$"o$$$b."$$$$$$$$$$$ $$$$$$$$' + e. ?$$$$$$$$$$$$$$$$$ d$$$$$$o."?$$$$$$$$H $$$$$$$' + $$$W.`?$$$$$$$$$$$$$$$ $$$$$$$$$e. "??$$$f .$$$$$$' + d$$$$$$o "?$$$$$$$$$$$$ $$$$$$$$$$$$$eeeeee$$$$$$$" + $$$$$$$$$bu "?$$$$$$$$$ 3$$$$$$$$$$$$$$$$$$$$*$$" + d$$$$$$$$$$$$$e. "?$$$$$:`$$$$$$$$$$$$$$$$$$$$8 + e$$e. $$$$$$$$$$$$$$$$$$+ "??f "$$$$$$$$$$$$$$$$$$$$c + $$$$$$$o $$$$$$$$$$$$$$$F" `$$$$$$$$$$$$$$$$$$$$b. + M$$$$$$$$U$$$$$$$$$$$$$F" ?$$$$$$$$$$$$$$$$$$$$$u + ?$$$$$$$$$$$$$$$$$$$$F "?$$$$$$$$$$$$$$$$$$$$u + "$$$$$$$$$$$$$$$$$$" ?$$$$$$$$$$$$$$$$$$$$o + "?$$$$$$$$$$$$$F "?$$$$$$$$$$$$$$$$$$ + "??$$$$$$$F ""?3$$$$$$$$$$$$F + .e$$$$$$$$$$$$$$$$' + u$$$$$$$$$$$$$$$$$ + `$$$$$$$$$$$$$$$$" + "$$$$$$$$$$$$F" + ""?????"" + + + + ..::''''::.. + .:::. .;'' ``;. + .... ::::: :: :: :: :: + ,;' .;: () ..: `:::' :: :: :: :: + ::. ..:,:;.,:;. . :: .::::. `:' :: .:' :: :: `:. :: + '''::, :: :: :: `:: :: ;: .:: : :: : : :: + ,:'; ::; :: :: :: :: :: ::,::''. . :: `:. .:' :: + `:,,,,;;' ,;; ,;;, ;;, ,;;, ,;;, `:,,,,:' :;: `;..``::::''..;' + ``::,,,,::'' + + + + _________________________________________________________ + |\=========================================================\ + || | + || _ __ ___ __ _ | + || ; `-.__.-'. `-.__.-'. .`-.__.-' .`-.__.-' : | + || _.'. . . . . . . . .,,,,,,,. . . . . . . . .`._ | + || .'. . . . . . . . ,a@@@@@@@@@@@a, . . . . . . . .`. | + || `. . . . ,a@@@@@a@@@a@@@@@@@@@a@@@a@@@@@a, . . . ,' | + || ) . . a@@@@@@a@@@@@a@@@@@@@a@@@@@a@@@@@@a . . ( | + || ,' . . .@@@%%%a@@@@@@@@@@@@@@@@@@@@@a%%%@@@ . . `. | + || `.. . . @@@%%a@@@@@@""@@@@@@@""@@@@@@a%%@@@ . . .,' | + || ). . . "@@a@@@@@@@@@SSSSSSS@@@@@@@@@a@@" . . .( | + || ,'. . . . . `@@@@@@@@SSS, ,SSS@@@@@@@@' . . . . .`. | + || `. . . . . . `@@@@@@@`SSS:SSS'@@@@@@@' . . . . . ,' | + || ) . . . . . `@@@@@@@sssssss@@@@@@@' . . . . . ( | + || ,' . . . . . ,a@@a@@@@@@@@@@@@@@@a@@a, . . . . . `. | + || `.. . . . .a@@@a@@@@@a@@@a@@@a@@@@@a@@@a. . . . .,' | + || ). . . .a@@@@@a@@@@@@@@@@@@@@@@@a@@@@@a. . . .( | + || ,'. . . . @@@@@@a@@@@' " `@@@@a@@@@@@ . . . .`. | + || `. . . . .@@@@@@@aaaa, ,aaaa@@@@@@@ . . . ,' | + || ) . . . `@@@@@@@@@@@@a, ,a@@@@@@@@@@@@' . . . ( | + || ,' . . . . .`@@@@@@@@@@a@a@a@@@@@@@@@@'. . . . . `. | + || `;;;;;;;;;;;;aaaaaaaaaa@@@@@aaaaaaaaaa;;;;;;;;;;;;' | + || );;;;;;;,mMMMMMMMm@@@@@@@@@@@mMMMMMMMm,;;;;;;;( | + || ,;;;;;;;;a@%#%%#%%#%Mm@@@@@@@mM%#%%#%%#%@a;;;;;;;;, | + || `;;;;;;;;@@%%%%%%%%%%M@@";"@@M%%%%%%%%%%@@;;;;;;;;' | + || );;;;;;`@a%%%%%%%%mM";;;;;"Mm%%%%%%%%a@';;;;;;( | + || ,;;;;;;;;;;"@@@@@@@@";;;;;;;;;"@@@@@@@@";;;;;;;;;;, | + || `;;;;;;;;;;;;"""""";;;;;;;;;;;;;"""""";;;;;;;;;;;;' | + || );;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;( | + || `:;;;:-~~~-:;;:-~~~-:;;;;;:-~~~-:;;:,-~~~-:;;;:' | + || ~~~ ~~ ~~~ ~~ ~~~ | + || .=============. | + || | KINA : | + || `-------------' | + \|_________________________________________________________| + + + + +c, ,c +3$$c ,$$P +$$"$$c ,cc, ,zc, ,cc J$$ c, ,cc, c, hcc$$$$$$",zcc, ,$$" +$$ ?$c ,$$?$c ,d$$$F ,$$P$b J$$ $$ z$$P$b, $$$cJ$$ $$ ,$$?$$ $$b,. +$$ ,$$,$$" ?$b $$P'?" d$P $$. J$$ ,$$ J$$" `$$ $$`"$$$ $$ d$P $$F "?$$b +$$,c$$'$$F $$<$$ $$F,3$L J$$$$$$ $$F $$,$$ ?$$ $$ $$L,$$$ 4$$ +$$$$P':$$, ,$$ $$c ,$$$$$$$ 3$$"'$$ $$c ,$$ $$ :$$ $$ ;$$$$P$$ ,$$" +$$" "?$$d$$" "$$c,3$$"' $$ ?$$ $$ `?$$$$$" $$ :$$ $$ 3$$" $$ ,$$F +$$ `"?"' """`"" "" `"" "" """ "" "" "" "" ""J$$" +$$ "?" + + .:::. + .::::::-'``'::::. + .:::'',,cd$$$$$$$bc,`. + ::::,$$$$$$$$$$$$$$$$$,`. + :::'z$$$$$$$$$$$$$$$$$$$$c, + .:::'z$$$$$$$$$$$$$$$$$P"" _`. + ::::'z$$$$$$$$$$$$$$$$$",d$$$$$c,. + ::::: P".,,. "$$$$$$$$$$$$P" ,c,`$,` + .::::::,c$$$$$$$$$$$$$$$$$$P J$",c$$.`. + :::::::,$P" ,`?$$$$$$$$$$$$,,,c$$$$$$L<. + ::::::: d$. ,$$$b,"$$$$$$$$$$$$$$$$$$$$$.$ + :::::::: $$$cccccccd$$$$$$$$$$$$$$$$$$$$$$$`: + :::::::: $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$,:: + ::::::::'J`$$$$$$$$$$$$$$$$"$$,$$$$$$?$$$$$$F::. + .:::::::::'$,"$$$$$$$$$$$$$$$$$P??"""",,$$$$$$F::: + ::::::::::: ?$$`$$$$$$$$$$$PF"" ,,<'J$$$$$P':::: + .:::::::::::::."$h"$$$$$$$$$hc.-?????'' ,d$$$$$$':::::: + ::::::::::::::::::"?$$$$$$:$,! .:::::'' +:::::::::::::,$$$$$$$$$$$$$$$$$$$$$$$$$$b,`!!`"$$$$:$$`!'c,`` +:::::::::::::J$$$$$$$$$$$$$$$$$$$$$$$$$$$$b, +:::::::::::'J$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$F,?b,`. +::::::::'J$$$$$$$$$$$$$$$$$$P4F,cCCCCCCCCCCCCCCCCCCCCCCCc`",, +:::::::,$$$$$$$$$$$$$$$$$$',CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC><> +::::::'J$$$$$$$$$$$$$$$$$F,CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC>,CC \ No newline at end of file diff --git a/Source/Images/d_tpascal/u0/SA.PAS b/Source/Images/d_tpascal/u0/SA.PAS new file mode 100644 index 00000000..240238c1 --- /dev/null +++ b/Source/Images/d_tpascal/u0/SA.PAS @@ -0,0 +1,65 @@ +program SA; + +const + MaxX = 100; + MaxY = 50; + +var + FileName: string[15]; + +procedure ClearScreen; + +begin + Write(con, #27,'[2J') +end; + + +procedure Indent; + +begin + Write(con, #27,'[10G') +end; + + +procedure ShowArt; + +var + F: Text; + Line:string[255]; + +begin + assign(F, FileName); + reset(F); + while ((not Eof(F)) and (not KeyPressed)) do begin + readln(F, Line); + {Indent; } + writeln(CON, Line); + delay(12) + end; + close(f) +end; + + +var + Running: boolean; + Ch: char; + +begin + if paramcount > 0 then begin + FileName:= Paramstr(1) + end + else begin + FileName:= 'ART.TXT' + end; + ClearScreen; + writeln('Press Q key to exit'); + writeln; + Running:= true; + while Running do begin + ShowArt; + if KeyPressed then begin + read(kbd, ch); + Running:= (ch <> 'q') + end + end +end. \ No newline at end of file diff --git a/Source/Images/d_tpascal/u0/TINST.COM b/Source/Images/d_tpascal/u0/TINST.COM new file mode 100644 index 00000000..f7304963 Binary files /dev/null and b/Source/Images/d_tpascal/u0/TINST.COM differ diff --git a/Source/Images/d_tpascal/u0/TINST.DTA b/Source/Images/d_tpascal/u0/TINST.DTA new file mode 100644 index 00000000..9d0a0d71 Binary files /dev/null and b/Source/Images/d_tpascal/u0/TINST.DTA differ diff --git a/Source/Images/d_tpascal/u0/TINST.MSG b/Source/Images/d_tpascal/u0/TINST.MSG new file mode 100644 index 00000000..a592804e Binary files /dev/null and b/Source/Images/d_tpascal/u0/TINST.MSG differ diff --git a/Source/Images/d_tpascal/u0/TURBO.COM b/Source/Images/d_tpascal/u0/TURBO.COM new file mode 100644 index 00000000..48f8da0c Binary files /dev/null and b/Source/Images/d_tpascal/u0/TURBO.COM differ diff --git a/Source/Images/d_tpascal/u0/TURBO.MSG b/Source/Images/d_tpascal/u0/TURBO.MSG new file mode 100644 index 00000000..701b32b9 --- /dev/null +++ b/Source/Images/d_tpascal/u0/TURBO.MSG @@ -0,0 +1,101 @@ + are not allowed + can not be + constant + does not + expression + identifier + file + here + Integer + File +Illegal + or +Undefined + match + real +String +Textfile + out of range + variable + overflow + expected + type +Invalid + pointer +01';' +02':' +03',' +04'(' +05')' +06'=' +07':=' +08'[' +09']' +10'.' +11'..' +12BEGIN +13DO +14END +15OF +17THEN +18TO DOWNTO +20Boolean +21  +22  +23  +24  +25  +26  +27  +28Pointer +29Record +30Simple +31Simple +32 +33 +34 +35 +36Type +37Untyped +40 label +41Unknown syntax error +42 in preceding definitions +43Duplicate label +44Type mismatch +45 +46 and CASE selector +47Operand(s) operator +48 result +49  length +50 length +51 subrange base +52Lower bound > upper bound +53Reserved word +54 assignment +55 exceeds line +56Error in integer +57Error in +58 character in +60s +61 s ands +62Structureds +63s +64s and untypeds +65Untypeds +66I/O +67 s must be parameters +68 componentss +69dering of fields +70Set base +71 GOTO +72Label not within current block +73 FORWARD procedure(s) +74INLINE error +75 use of ABSOLUTE +90 not found +91Unexpected end of source +97Too many nested WITH's +98Memory +99Compilerd WITH's +98Memory +99Compiler \ No newline at end of file diff --git a/Source/Images/d_tpascal/u0/TURBO.OVR b/Source/Images/d_tpascal/u0/TURBO.OVR new file mode 100644 index 00000000..bd9292e2 Binary files /dev/null and b/Source/Images/d_tpascal/u0/TURBO.OVR differ diff --git a/Source/Images/d_tpascal/u0/TURBOMSG.OVR b/Source/Images/d_tpascal/u0/TURBOMSG.OVR new file mode 100644 index 00000000..36872a5e Binary files /dev/null and b/Source/Images/d_tpascal/u0/TURBOMSG.OVR differ diff --git a/Source/Images/d_z80asm/Readme.txt b/Source/Images/d_z80asm/Readme.txt new file mode 100644 index 00000000..153d3107 --- /dev/null +++ b/Source/Images/d_z80asm/Readme.txt @@ -0,0 +1,15 @@ +===== Z80ASM v1.30 by SLR Systems ===== + +Z80ASM is a relocating macro assembler for CP/M. It takes assembly language +source statements from a disk file, converts them into their binary equivalent, +and stores the output in either a core-image, Intel hex format, or relocatable +object file. The mnemonics recognized are those of Zilog/Mostek. The optional +listing output may be sent to a disk file, the console and/or the printer, in +any combination. Output files may also be generated containing cross-reference +information on each symbol used. + +The manual is available in the Doc directory, +z80asm (SLR Systems).pdf + +A run through of using the assembler is available at +https://8bitlabs.ca/Posts/2023/05/20/learning-z80-asm diff --git a/Source/Images/d_z80asm/u0/DUMP.COM b/Source/Images/d_z80asm/u0/DUMP.COM new file mode 100644 index 00000000..5d315027 Binary files /dev/null and b/Source/Images/d_z80asm/u0/DUMP.COM differ diff --git a/Source/Images/d_z80asm/u0/DUMP.Z80 b/Source/Images/d_z80asm/u0/DUMP.Z80 new file mode 100644 index 00000000..e7a70e62 --- /dev/null +++ b/Source/Images/d_z80asm/u0/DUMP.Z80 @@ -0,0 +1,154 @@ + TITLE 'DUMP - Recreated by Z80DIS' + + ORG 0100H + +CPM EQU 0005H +DFCB EQU 005CH +FCBEXT EQU 0065H + +DUMP + LD DE,DFCB + LD C,0FH ;SI + CALL CPM ;OPENFIL + INC A + JR NZ,FILEOK + LD DE,CANTOPE + LD C,09H ;HT + CALL CPM ;PRNTSTG + RET +FILEOK + LD HL,FCBEXT + LD A,(HL) + CP 43H ;'C' + JR NZ,NEXTPAGE + INC HL + LD A,(HL) + CP 4FH ;'O' + JR NZ,NEXTPAGE + INC HL + LD A,(HL) + CP 4DH ;'M' + JR NZ,NEXTPAGE + LD HL,DUMP + LD (ADDR),HL +NEXTPAGE + LD E,0CH ;FF + LD C,02H ;STX + CALL CPM ;CONOUT + LD A,08H ;BS + LD (PAGECNT),A +NEXTSECT + LD DE,DFCB + LD C,14H ;DC4 + CALL CPM ;READSEQ + OR A + RET NZ + LD A,08H ;BS + LD (LINECNT),A + LD HL,0080H + LD (ADDR1),HL +NXTLINE + LD C,0BH ;VT + CALL CPM ;CONSTAT + OR A + RET NZ + LD HL,OUTBUF + LD (HL),0DH ;CR + INC HL + LD (HL),0AH ;LF + INC HL + LD DE,(ADDR) + LD A,D + CALL HEXOUT + LD A,E + CALL HEXOUT + LD (HL),20H ;' ' + INC HL + EX DE,HL + LD BC,0010H + ADD HL,BC + LD (ADDR),HL + EX DE,HL + LD DE,(ADDR1) + LD B,10H ;DLE +NXTBYTE + LD A,(DE) + INC DE + CALL HEXOUT + LD (HL),20H ;' ' + INC HL + DJNZ NXTBYTE + LD (HL),20H ;' ' + INC HL + LD (HL),24H ;'$' + LD DE,OUTBUF + LD C,09H ;HT + CALL CPM ;PRNTSTG + LD HL,(ADDR1) + LD B,10H ;DLE +NXTASCI + LD A,(HL) + INC HL + AND 7FH ;DEL + CP 20H ;' ' + JR C,CTRL + CP 7FH ;DEL + JR NZ,NOTCTRL +CTRL + LD A,2EH ;'.' +NOTCTRL + LD E,A + LD C,02H ;STX + PUSH BC + PUSH HL + CALL CPM ;CONOUT + POP HL + POP BC + DJNZ NXTASCI + LD (ADDR1),HL + LD HL,LINECNT + DEC (HL) + JP NZ,NXTLINE + LD HL,PAGECNT + DEC (HL) + JP NZ,NEXTSECT + JP NEXTPAGE +HEXOUT + PUSH AF + RRA + RRA + RRA + RRA + AND 0FH ;SI + ADD A,30H ;'0' + CP 3AH ;':' + JR C,HEX1 + ADD A,07H ;BEL +HEX1 + LD (HL),A + INC HL + POP AF + AND 0FH ;SI + ADD A,30H ;'0' + CP 3AH ;':' + JR C,HEX2 + ADD A,07H ;BEL +HEX2 + LD (HL),A + INC HL + RET +CANTOPE + DEFB 43H,61H,6EH,27H,74H,20H ; Can't + DEFB 4FH,70H,65H,6EH,20H,46H ; Open F + DEFB 69H,6CH,65H,24H ; ile$ +LINECNT + DEFS 0001H +ADDR + DEFS 0002H +ADDR1 + DEFS 0002H +PAGECNT + DEFS 0001H +OUTBUF + DEFS 0004H + END \ No newline at end of file diff --git a/Source/Images/d_z80asm/u0/TEST.ASM b/Source/Images/d_z80asm/u0/TEST.ASM new file mode 100644 index 00000000..2e479175 --- /dev/null +++ b/Source/Images/d_z80asm/u0/TEST.ASM @@ -0,0 +1,9 @@ +BDOS EQU 5 +WCONF EQU 2 + ORG 100H + MVI C,WCONF + MVI E,'$' + CALL BDOS + JMP 0 + END + \ No newline at end of file diff --git a/Source/Images/d_z80asm/u0/TEST.COM b/Source/Images/d_z80asm/u0/TEST.COM new file mode 100644 index 00000000..22d7bf05 Binary files /dev/null and b/Source/Images/d_z80asm/u0/TEST.COM differ diff --git a/Source/Images/d_z80asm/u0/TEST.PRN b/Source/Images/d_z80asm/u0/TEST.PRN new file mode 100644 index 00000000..596815a1 --- /dev/null +++ b/Source/Images/d_z80asm/u0/TEST.PRN @@ -0,0 +1,11 @@ + + + 0005 = BDOS EQU 5 + 0002 = WCONF EQU 2 + 0100 ORG 100H + 0100 0E02 MVI C,WCONF + 0102 1E24 MVI E,'$' + 0104 CD0500 CALL BDOS + 0107 C30000 JMP 0 + 010A END + \ No newline at end of file diff --git a/Source/Images/d_z80asm/u0/TEST.Z80 b/Source/Images/d_z80asm/u0/TEST.Z80 new file mode 100644 index 00000000..6d417347 --- /dev/null +++ b/Source/Images/d_z80asm/u0/TEST.Z80 @@ -0,0 +1,9 @@ +BDOS EQU 5 +WCONF EQU 2 + ORG 100H + LD C,WCONF + LD E,'*' + CALL BDOS + RET + END +  \ No newline at end of file diff --git a/Source/Images/d_z80asm/u0/Z80ASM.COM b/Source/Images/d_z80asm/u0/Z80ASM.COM new file mode 100644 index 00000000..d5998843 Binary files /dev/null and b/Source/Images/d_z80asm/u0/Z80ASM.COM differ diff --git a/Source/Images/d_z80asm/u0/Z80ASM.DOC b/Source/Images/d_z80asm/u0/Z80ASM.DOC new file mode 100644 index 00000000..366d020a --- /dev/null +++ b/Source/Images/d_z80asm/u0/Z80ASM.DOC @@ -0,0 +1,76 @@ + Z80ASM 1.30 Release Notes + +Bugs Fixed From 1.25: + +Nested macro calls using % operator fixed +IFIDN <>,<> now returns true +JR NUMBER+$ generates correct code +INCLUDE and MACLIB filenames can now contain +, -, etc +Fixed number conversion in non-power-of-two radix +.$$1 files are cleaned up on abort + LD A,TYPE 0 works +ex af,af' works in U/L mode + + +Additions: + +All input and output files are always closed upon termination (unless +terminated by ^C from BUFIN call). + +CONFIG option added to allow TABs in strings. Normally Z80ASM complains +about any control characters in quoted strings but generates the correct +code. This option suppress the error if the control character is a TAB. + +CONFIG option added to disable stripping the high bit of each byte read +from the input source. THIS IS DANGEROUS! Should ONLY be used for using +non-ASCII characters in comments. DO NOT USE in macros, since the high +bit is used as a parameter replacement flag. Other indexed tables also +assume the high bit is clear. + + + + Z80ASM 1.31 Release Notes + +Z80ASM will now delete A:$$$.SUB if an error was detected during any assembly +(Configurable with CONFIG). This complements the setting of the ZCPR3 error +flag, and the setting of the CP/M 3.0 Error return code (******* CP/M Plus +users: SUBMIT files may test the error return code with a leading 'colon', +documented obscurely in CP/M 3 Programmers Guide 1.6.3 *******). + +Config will now set an alternate user # to be used if a given source file +cannot be found under the default user #. Useful for keeping just one copy +of system equates and macro libraries under a single user #. + +Config will let you define a drive to be used for storing intermediate files. +This should be set to your fastest device. + +Config will let you select Common selection to start back at address relative +0 (M80 compat), or continue at the last used address (like any other address +space). + +Config will select whether or not to print the 'nesting level' character in +the listing. + +^C will now abort the assembler, not just the current assembly. + +Colon not required on equated labels not in column one, even when that +requirement is selected. + +Labeled IRP and IRPC's work. + +Forward referenced EQU's work in one-pass mode. + + + Z80ASM Release 1.32 Notes + +To disable listing pagination, set page length to 255 lines. + +Standard console output used so ^P works. + +If your operating system supports CP/M+ time & date, but returns 2.2 as +version number, you can select time and date by saying Y to Time and date, +and use a Routine at 0005. Z80ASM will load C with 105 before calling, so +the system call should work. + +label2 ds 300H-LABEL2;works now + \ No newline at end of file diff --git a/Source/Images/d_zsdos/ReadMe.txt b/Source/Images/d_zsdos/ReadMe.txt index 9d19b002..53cfd778 100644 --- a/Source/Images/d_zsdos/ReadMe.txt +++ b/Source/Images/d_zsdos/ReadMe.txt @@ -40,16 +40,16 @@ more information. I have chosen to use ZSDOS to pick up the maximum number of features. Date stamping is still available, but must be loaded as an RSX. -The source allows you to compile the OS code as either v1.1 or v1.2 via -an equate. Version 1.2 was never distributed and contains only a few -minor fixes. Unfortunately, the use of v1.2 would make it incompatible -with many support modules and overlays due to their reliance on -hard-coded address assumptions. This is probably why it was never -distributed. I encountered this myself with the date stamping code -- -it won't work with v1.2 because it does a version check. For now, I have -chosen to use v1.1 to maximize compatibility (seems to be what everyone -is doing). Ultimately, I may go back and try to rebuild everything in -the distribution to bring it all up to v1.2. That is for the future +The source allows you to compile the OS code as either v1.1 or v1.2 via +an equate. Version 1.2 was never distributed and contains only a few +minor fixes. Unfortunately, the use of v1.2 would make it incompatible +with many support modules and overlays due to their reliance on +hard-coded address assumptions. This is probably why it was never +distributed. I encountered this myself with the date stamping code -- +it won't work with v1.2 because it does a version check. For now, I have +chosen to use v1.1 to maximize compatibility (seems to be what everyone +is doing). Ultimately, I may go back and try to rebuild everything in +the distribution to bring it all up to v1.2. That is for the future though. == Usage == @@ -275,6 +275,11 @@ LBREXT.COM - Extract file from .LBR libraries LBREXT36.CFG - ZCNFG configuration file for LBREXT ZXD.COM - Enhanced directory lister w/ date/time stamp support ZXD.CFG - ZCNFG configuration file for ZXD +BBCBASIC.COM - BBC BASIC CP/M Version 3.00 by R.T.Russell +BBCBASIC.TXT - Help file for BBC BASIC +GENHEX.COM - Generates an Intel Hex file from the input file +LS.COM - An alternative file listing to DIR +LSWEEP.COM - Can extract and view member files of an .LBR archive == Testing Applications (User Area 2) == diff --git a/Source/Images/diskdefs b/Source/Images/diskdefs index 81d962cc..f29deca1 100644 --- a/Source/Images/diskdefs +++ b/Source/Images/diskdefs @@ -310,6 +310,32 @@ diskdef wbw_rom1024 os 2.2 end +# RomWBW 512KB RAM (256KB reserved, 256KB RAM Disk) + +diskdef wbw_ram512 + seclen 512 + tracks 8 + sectrk 64 + blocksize 2048 + maxdir 256 + skew 0 + boottrk 0 + os 2.2 +end + +# RomWBW 1024KB RAM (256KB reserved, 768KB RAM Disk) + +diskdef wbw_ram1024 + seclen 512 + tracks 24 + sectrk 64 + blocksize 2048 + maxdir 256 + skew 0 + boottrk 0 + os 2.2 +end + # RomWBW 720K floppy media diskdef wbw_fd720 diff --git a/Source/Images/fd_bp.txt b/Source/Images/fd_bp.txt index 6b251b2a..0fbfb8d0 100644 --- a/Source/Images/fd_bp.txt +++ b/Source/Images/fd_bp.txt @@ -22,6 +22,7 @@ ../../Binary/Apps/syscopy.com 15: ../../Binary/Apps/sysgen.com 15: ../../Binary/Apps/talk.com 15: +../../Binary/Apps/htalk.com 15: ../../Binary/Apps/tbasic.com 15: ../../Binary/Apps/timer.com 15: ../../Binary/Apps/tune.com 15: diff --git a/Source/Images/fd_cpm22.txt b/Source/Images/fd_cpm22.txt index 859b7e30..e83c35b3 100644 --- a/Source/Images/fd_cpm22.txt +++ b/Source/Images/fd_cpm22.txt @@ -18,6 +18,7 @@ d_cpm22/ReadMe.txt 0: ../../Binary/Apps/syscopy.com 0: ../../Binary/Apps/sysgen.com 0: ../../Binary/Apps/talk.com 0: +../../Binary/Apps/htalk.com 0: ../../Binary/Apps/tbasic.com 0: ../../Binary/Apps/timer.com 0: ../../Binary/Apps/tune.com 0: diff --git a/Source/Images/fd_cpm3.txt b/Source/Images/fd_cpm3.txt index 43c3e8ba..d932c40f 100644 --- a/Source/Images/fd_cpm3.txt +++ b/Source/Images/fd_cpm3.txt @@ -34,6 +34,7 @@ ../../Binary/Apps/syscopy.com 0: #../../Binary/Apps/sysgen.com 0: #../../Binary/Apps/talk.com 0: +#../../Binary/Apps/htalk.com 0: ../../Binary/Apps/tbasic.com 0: ../../Binary/Apps/timer.com 0: ../../Binary/Apps/tune.com 0: diff --git a/Source/Images/fd_nzcom.txt b/Source/Images/fd_nzcom.txt index a569b365..140cdd32 100644 --- a/Source/Images/fd_nzcom.txt +++ b/Source/Images/fd_nzcom.txt @@ -3,6 +3,12 @@ # d_nzcom/ReadMe.txt 0: # +# Include selected CP/M 2.2 files +# +d_cpm22/u0/STAT.COM 0: +d_cpm22/u0/SUBMIT.COM 0: +d_cpm22/u0/XSUB.COM 0: +# # Add RomWBW utilities # #../../Binary/Apps/*.com 0: @@ -13,6 +19,7 @@ d_nzcom/ReadMe.txt 0: ../../Binary/Apps/rtc.com 0: ../../Binary/Apps/syscopy.com 0: ../../Binary/Apps/talk.com 0: +../../Binary/Apps/htalk.com 0: ../../Binary/Apps/timer.com 0: ../../Binary/Apps/xm.com 0: # diff --git a/Source/Images/fd_qpm.txt b/Source/Images/fd_qpm.txt index 0d66ff3a..6aeaae6a 100644 --- a/Source/Images/fd_qpm.txt +++ b/Source/Images/fd_qpm.txt @@ -22,6 +22,7 @@ d_cpm22/u0/*.* 0: ../../Binary/Apps/syscopy.com 0: ../../Binary/Apps/sysgen.com 0: ../../Binary/Apps/talk.com 0: +../../Binary/Apps/htalk.com 0: ../../Binary/Apps/tbasic.com 0: ../../Binary/Apps/timer.com 0: ../../Binary/Apps/tune.com 0: @@ -44,7 +45,7 @@ d_cpm22/u0/*.* 0: # # Add OS image # -../CPM22/cpm_wbw.sys 0:cpm.sys +../QPM/qpm_wbw.sys 0:qpm.sys # # Add Common Applications # diff --git a/Source/Images/fd_zpm3.txt b/Source/Images/fd_zpm3.txt index 53716342..efc30026 100644 --- a/Source/Images/fd_zpm3.txt +++ b/Source/Images/fd_zpm3.txt @@ -32,6 +32,7 @@ ../../Binary/Apps/syscopy.com 15: ../../Binary/Apps/sysgen.com 15: ../../Binary/Apps/talk.com 15: +#../../Binary/Apps/htalk.com 15: #../../Binary/Apps/tbasic.com 15: ../../Binary/Apps/timer.com 15: #../../Binary/Apps/tune.com 15: diff --git a/Source/Images/fd_zsdos.txt b/Source/Images/fd_zsdos.txt index 1b7acc71..42af49e3 100644 --- a/Source/Images/fd_zsdos.txt +++ b/Source/Images/fd_zsdos.txt @@ -31,6 +31,7 @@ d_cpm22/u0/XSUB.COM 0: ../../Binary/Apps/syscopy.com 0: ../../Binary/Apps/sysgen.com 0: ../../Binary/Apps/talk.com 0: +../../Binary/Apps/htalk.com 0: ../../Binary/Apps/tbasic.com 0: ../../Binary/Apps/timer.com 0: ../../Binary/Apps/tune.com 0: diff --git a/Source/Images/hd_blank.txt b/Source/Images/hd_blank.txt new file mode 100644 index 00000000..64c9818a --- /dev/null +++ b/Source/Images/hd_blank.txt @@ -0,0 +1,3 @@ +# +# Blank disk template +# diff --git a/Source/Images/hd_bp.txt b/Source/Images/hd_bp.txt index 491c683f..0a61bbd7 100644 --- a/Source/Images/hd_bp.txt +++ b/Source/Images/hd_bp.txt @@ -22,6 +22,7 @@ ../../Binary/Apps/syscopy.com 15: ../../Binary/Apps/sysgen.com 15: ../../Binary/Apps/talk.com 15: +../../Binary/Apps/htalk.com 15: ../../Binary/Apps/tbasic.com 15: ../../Binary/Apps/timer.com 15: ../../Binary/Apps/tune.com 15: @@ -60,3 +61,4 @@ Common/Z3/u10/*.* 10: Common/Z3/u14/*.* 14: Common/Z3/u15/*.* 15: Common/SIMH/*.* 13: +Common/UTILS/*.* 15: diff --git a/Source/Images/hd_cpm22.txt b/Source/Images/hd_cpm22.txt index 1643bff5..df9188ed 100644 --- a/Source/Images/hd_cpm22.txt +++ b/Source/Images/hd_cpm22.txt @@ -18,6 +18,7 @@ d_cpm22/ReadMe.txt 0: ../../Binary/Apps/syscopy.com 0: ../../Binary/Apps/sysgen.com 0: ../../Binary/Apps/talk.com 0: +../../Binary/Apps/htalk.com 0: ../../Binary/Apps/tbasic.com 0: ../../Binary/Apps/timer.com 0: ../../Binary/Apps/tune.com 0: @@ -54,3 +55,4 @@ cpnet12/*.* 4: Common/All/*.* 0: Common/CPM22/*.* 0: Common/SIMH/*.* 13: +Common/UTILS/*.* 0: diff --git a/Source/Images/hd_cpm3.txt b/Source/Images/hd_cpm3.txt index 366224f5..79d48e2a 100644 --- a/Source/Images/hd_cpm3.txt +++ b/Source/Images/hd_cpm3.txt @@ -34,6 +34,7 @@ ../../Binary/Apps/syscopy.com 0: #../../Binary/Apps/sysgen.com 0: #../../Binary/Apps/talk.com 0: +../../Binary/Apps/htalk.com 0: ../../Binary/Apps/tbasic.com 0: ../../Binary/Apps/timer.com 0: ../../Binary/Apps/tune.com 0: @@ -66,3 +67,4 @@ cpnet3/*.* 4: Common/All/*.* 0: Common/CPM3/*.* 0: Common/SIMH/*.* 13: +Common/UTILS/*.* 0: diff --git a/Source/Images/hd_nzcom.txt b/Source/Images/hd_nzcom.txt index 04914198..d47fd3d6 100644 --- a/Source/Images/hd_nzcom.txt +++ b/Source/Images/hd_nzcom.txt @@ -35,6 +35,7 @@ d_zsdos/u0/*.* 0: ../../Binary/Apps/syscopy.com 0: ../../Binary/Apps/sysgen.com 0: ../../Binary/Apps/talk.com 0: +../../Binary/Apps/htalk.com 0: ../../Binary/Apps/tbasic.com 0: ../../Binary/Apps/timer.com 0: ../../Binary/Apps/tune.com 0: @@ -77,3 +78,4 @@ Common/Z3/u10/*.* 0: Common/Z3/u14/*.* 0: Common/Z3/u15/*.* 0: Common/SIMH/*.* 13: +Common/UTILS/*.* 0: diff --git a/Source/Images/hd_qpm.txt b/Source/Images/hd_qpm.txt index 5b470527..a58b75a6 100644 --- a/Source/Images/hd_qpm.txt +++ b/Source/Images/hd_qpm.txt @@ -22,6 +22,7 @@ d_cpm22/u0/*.* 0: ../../Binary/Apps/syscopy.com 0: ../../Binary/Apps/sysgen.com 0: ../../Binary/Apps/talk.com 0: +../../Binary/Apps/htalk.com 0: ../../Binary/Apps/tbasic.com 0: ../../Binary/Apps/timer.com 0: ../../Binary/Apps/tune.com 0: @@ -51,10 +52,11 @@ cpnet12/*.* 4: # # Add OS image # -../CPM22/cpm_wbw.sys 0:cpm.sys +../QPM/qpm_wbw.sys 0:qpm.sys # # Add Common Applications # Common/All/*.* 0: Common/CPM22/*.* 0: Common/SIMH/*.* 13: +Common/UTILS/*.* 0: diff --git a/Source/Images/hd_zpm3.txt b/Source/Images/hd_zpm3.txt index 9452391b..14f70856 100644 --- a/Source/Images/hd_zpm3.txt +++ b/Source/Images/hd_zpm3.txt @@ -33,6 +33,7 @@ ../../Binary/Apps/syscopy.com 15: ../../Binary/Apps/sysgen.com 15: ../../Binary/Apps/talk.com 15: +../../Binary/Apps/htalk.com 15: ../../Binary/Apps/tbasic.com 15: ../../Binary/Apps/timer.com 15: ../../Binary/Apps/tune.com 15: @@ -71,3 +72,4 @@ Common/Z3/u10/*.* 10: Common/Z3/u14/*.* 14: Common/Z3/u15/*.* 15: Common/SIMH/*.* 13: +Common/UTILS/*.* 0: diff --git a/Source/Images/hd_zsdos.txt b/Source/Images/hd_zsdos.txt index 9f6d0537..da4acd4c 100644 --- a/Source/Images/hd_zsdos.txt +++ b/Source/Images/hd_zsdos.txt @@ -31,6 +31,7 @@ d_cpm22/u0/XSUB.COM 0: ../../Binary/Apps/syscopy.com 0: ../../Binary/Apps/sysgen.com 0: ../../Binary/Apps/talk.com 0: +../../Binary/Apps/htalk.com 0: ../../Binary/Apps/tbasic.com 0: ../../Binary/Apps/timer.com 0: ../../Binary/Apps/tune.com 0: @@ -70,3 +71,4 @@ Common/CPM22/*.* 0: Common/Z/u14/*.* 0: Common/Z/u15/*.* 0: Common/SIMH/*.* 13: +Common/UTILS/*.* 0: diff --git a/Source/Makefile b/Source/Makefile index 74e1fa94..5326d231 100644 --- a/Source/Makefile +++ b/Source/Makefile @@ -1,21 +1,60 @@ # # order is actually important, because of build dependencies # -SUBDIRS = HDIAG -SUBDIRS += Prop -SUBDIRS += Apps -SUBDIRS += CBIOS -SUBDIRS += Forth -SUBDIRS += TastyBasic -SUBDIRS += Fonts -SUBDIRS += CPM22 ZCPR ZCPR-DJ ZSDOS CPM3 ZPM3 -#SUBDIRS += BPBIOS -SUBDIRS += pSys -SUBDIRS += RomDsk -SUBDIRS += HBIOS -SUBDIRS += Images -SUBDIRS += ZRC -SUBDIRS += ZZRC -#SUBDIRS += Doc -TOOLS = ../Tools -include $(TOOLS)/Makefile.inc + +.PHONY: doc prop shared bp images rom zrc z1rcc zzrcc zrc512 + +.ONESHELL: +.SHELLFLAGS = -cex + +all: prop shared bp images rom zrc z1rcc zzrcc zrc512 + +doc: + $(MAKE) --directory Doc $(ACTION) + +prop: + $(MAKE) --directory Prop $(ACTION) + +shared: + $(MAKE) --directory HDIAG $(ACTION) + $(MAKE) --directory CBIOS $(ACTION) + $(MAKE) --directory CPM22 $(ACTION) + $(MAKE) --directory QPM $(ACTION) + $(MAKE) --directory ZCPR $(ACTION) + $(MAKE) --directory ZCPR-DJ $(ACTION) + $(MAKE) --directory ZSDOS $(ACTION) + $(MAKE) --directory CPM3 $(ACTION) + $(MAKE) --directory ZPM3 $(ACTION) + $(MAKE) --directory pSys $(ACTION) + $(MAKE) --directory Apps $(ACTION) + $(MAKE) --directory Forth $(ACTION) + $(MAKE) --directory TastyBasic $(ACTION) + $(MAKE) --directory Fonts $(ACTION) + $(MAKE) --directory RomDsk $(ACTION) + +bp: + $(MAKE) --directory BPBIOS $(ACTION) + +images: + $(MAKE) --directory Images $(ACTION) + +rom: + $(MAKE) --directory HBIOS $(ACTION) + +zrc: + $(MAKE) --directory ZRC $(ACTION) + +z1rcc: + $(MAKE) --directory Z1RCC $(ACTION) + +zzrcc: + $(MAKE) --directory ZZRCC $(ACTION) + +zrc512: + $(MAKE) --directory ZRC512 $(ACTION) + +clean: ACTION=clean +clean: all + +diff: ACTION=diff +diff: all diff --git a/Source/Prop/Build.cmd b/Source/Prop/Build.cmd index 5cad6196..ba3a355e 100644 --- a/Source/Prop/Build.cmd +++ b/Source/Prop/Build.cmd @@ -3,17 +3,17 @@ setlocal set TOOLS=../../Tools -set PATH=%TOOLS%\bst;%PATH% +set PATH=%TOOLS%\OpenSpin;%PATH% -call :bstc PropIO -call :bstc PropIO2 -call :bstc ParPortProp +call :openspin PropIO +call :openspin PropIO2 +call :openspin ParPortProp goto :eof -:bstc +:openspin echo. echo Building %1... -bstc Spin\%1 -e -l || exit /b -move /Y %1.eeprom "..\..\Binary" || exit /b +openspin -e Spin\%1.spin || exit /b +move /Y Spin\%1.eeprom "..\..\Binary" || exit /b goto :eof diff --git a/Source/Prop/Clean.cmd b/Source/Prop/Clean.cmd index 59b729f7..d3150ffc 100644 --- a/Source/Prop/Clean.cmd +++ b/Source/Prop/Clean.cmd @@ -1,5 +1,5 @@ @echo off setlocal -if exist *.eeprom del *.eeprom -if exist *.list del *.list \ No newline at end of file +if exist Spin\*.eeprom del Spin\*.eeprom +if exist Spin\*.list del Spin\*.list \ No newline at end of file diff --git a/Source/QPM/Build.cmd b/Source/QPM/Build.cmd new file mode 100644 index 00000000..c8a3955c --- /dev/null +++ b/Source/QPM/Build.cmd @@ -0,0 +1,20 @@ +@echo off +setlocal + +set TOOLS=../../Tools + +set PATH=%TOOLS%\tasm32;%TOOLS%\zxcc;%PATH% + +set TASMTABS=%TOOLS%\tasm32 + +set CPMDIR80=%TOOLS%/cpm/ + +tasm -t80 -g3 -fFF loader.asm loader.bin loader.lst || exit /b + +copy /b qcp27.dat + qdos27.dat + ..\cbios\cbios_wbw.bin qpm_wbw.bin || exit /b +copy /b qcp27.dat + qdos27.dat + ..\cbios\cbios_una.bin qpm_una.bin || exit /b + +copy /b loader.bin + qpm_wbw.bin qpm_wbw.sys || exit /b +copy /b loader.bin + qpm_una.bin qpm_una.sys || exit /b + +goto :eof diff --git a/Source/QPM/Clean.cmd b/Source/QPM/Clean.cmd new file mode 100644 index 00000000..243e3c08 --- /dev/null +++ b/Source/QPM/Clean.cmd @@ -0,0 +1,8 @@ +@echo off +setlocal + +if exist *.bin del *.bin +if exist *.lst del *.lst +if exist *.prn del *.prn +if exist *.hex del *.hex +if exist *.sys del *.sys diff --git a/Source/QPM/Makefile b/Source/QPM/Makefile new file mode 100644 index 00000000..30c414eb --- /dev/null +++ b/Source/QPM/Makefile @@ -0,0 +1,15 @@ +SYSFILES = qpm_wbw.sys qpm_una.sys +BINFILES = qpm_wbw.bin qpm_una.bin +OBJECTS = loader.bin $(SYSFILES) $(BINFILES) +OTHERS = *.hex +TOOLS = ../../Tools +include $(TOOLS)/Makefile.inc + +%.sys: %.bin loader.bin + cat loader.bin $*.bin > $@ + +qpm_una.bin: qcp27.dat qdos27.dat ../CBIOS/cbios_una.bin + cat qcp27.dat qdos27.dat ../CBIOS/cbios_una.bin > $@ + +qpm_wbw.bin: qcp27.dat qdos27.dat ../CBIOS/cbios_wbw.bin + cat qcp27.dat qdos27.dat ../CBIOS/cbios_wbw.bin > $@ diff --git a/Source/QPM/ReadMe.txt b/Source/QPM/ReadMe.txt new file mode 100644 index 00000000..9c760848 --- /dev/null +++ b/Source/QPM/ReadMe.txt @@ -0,0 +1,15 @@ +QPM27 +----- + +QPM is not available in source form. In this folder, you will find +qcp27.dat and qdos27.dat. These are the CCP and BDOS components for +QPM. They were created by running QINSTALL on a normal RomWBW +CP/M 2.2 system, then extracting the resultant CCP and BDOS binaries. + +When this folder goes through the build process, it just combines the +QPM CCP and BDOS binaries with the RomWBW CBIOS to create an up-to-date +QPM system image. + +QPM 2.7 is distributed at https://www.microcodeconsulting.com/. + +-- WBW 3:13 PM 9/9/2023 \ No newline at end of file diff --git a/Source/QPM/loader.asm b/Source/QPM/loader.asm new file mode 100644 index 00000000..6703e9aa --- /dev/null +++ b/Source/QPM/loader.asm @@ -0,0 +1,271 @@ +;=============================================================================== +; LOADER.ASM +; +; BOOTLOADER FOR ROMWBW DISK OPERATING SYSTEMS. +; +; CP/M DISK FORMATS ALLOW FOR RESERVED TRACKS THAT CONTAIN AN IMAGE OF THE +; OPERATING SYSTEM TO BE LOADED WHEN THE DISK IS BOOTED. THE OPERATING SYSTEM +; IMAGE ITSELF IS NORMALLY PREFIXED BY A 1-N SECTORS CONTAINING OS BOOTSTRAP +; CODE AND DISK METADATA. +; +; THE RETROBREW COMPUTING GROUP HAS BEEN USING A CONVENTION OF PREFIXING THE +; OS IMAGE WITH 3 SECTORS (512 BYTES X 3 FOR A TOTAL OF 1536 BYTES): +; +; SECTOR 1: IBM-PC STYLE BOOT BLOCK CONTAINING BOOTSTRAP, +; PARTITION TABLE, AND BOOT SIGNATURE +; SECTOR 2: RESERVED +; SECTOR 3: METADATA +; +; THE HARDWARE BIOS IS EXPECTED TO READ AND LOAD THE FIRST TWO SECTORS FROM THE +; DISK TO MEMORY ADDRESS $8000 AND JUMP TO THAT LOCATION TO BEGIN THE BOOT +; PROCESS. THE BIOS IS EXPECTED TO VERIFY THAT A STANDARD BOOT SIGNATURE +; OF $55, $AA IS PRESENT AT OFFSET $1FE-$1FF. IF THE SIGNATURE IS NOT FOUND, +; THE BIOS SHOULD ASSUME THE DISK HAS NOT BEEN PROPERLY INITIALIZED AND SHOULD +; NOT JUMP TO THE LOAD ADDRESS. +; +;=============================================================================== +; +#INCLUDE "../ver.inc" +; +SYS_ENT .EQU $E600 ; SYSTEM (OS) ENTRY POINT ADDRESS +SYS_LOC .EQU $D000 ; STARTING ADDRESS TO LOAD SYSTEM IMAGE +SYS_END .EQU $FE00 ; ENDING ADDRESS OF SYSTEM IMAGE +; +SEC_SIZE .EQU 512 ; DISK SECTOR SIZE +BLK_SIZE .EQU 128 ; OS BLOCK/RECORD SIZE +; +PREFIX_SIZE .EQU (SEC_SIZE * 3) ; 3 SECTORS +; +META_SIZE .EQU 32 ; SEE BELOW +META_LOC .EQU (PREFIX_SIZE - META_SIZE) +; +PT_LOC .EQU $1BE +PT_SIZ .EQU $40 +; +;------------------------------------------------------------------------------- +; SECTOR 1 +; +; THIS SECTOR FOLLOWS THE CONVENTIONS OF AN IBM-PC MBR CONTAINING THE OS +; BOOTSTRAP CODE, PARTITION TABLE, AND BOOT SIGNATURE +; +;---------------------------------------------------------------------------- +; +; THE FOLLOWING BOOTSTRAP CODE IS BUILT TO ASSUME IT WILL BE EXECUTED AT A STARTING +; ADDRESS OF $8000. THIS CODE IS *ONLY* FOR UNA. THE ROMWBW ROM BOOTLOADER +; USES THE METADATA TO LOAD THE OS DIRECTLY. +; + .ORG $8000 + JR BOOT +; +BOOT: + LD DE,STR_LOAD ; LOADING STRING + CALL PRTSTR ; PRINT + CALL PRTDOT ; PROGRESS +; + LD BC,$00FC ; UNA FUNC: GET BOOTSTRAP HISTORY + CALL $FFFD ; CALL UNA + JR NZ,ERROR ; HANDLE ERROR + CALL PRTDOT ; PROGRESS + LD B,L ; MOVE BOOT UNIT ID TO B +; + LD C,$41 ; UNA FUNC: SET LBA + LD DE,0 ; HI WORD ALWAYS ZERO + LD HL,3 ; IMAGE STARTS AT FOURTH SECTOR + CALL $FFFD ; SET LBA + JR NZ,ERROR ; HANDLE ERROR + CALL PRTDOT ; PROGRESS +; + LD C,$42 ; UNA FUNC: READ SECTORS + LD DE,$D000 ; STARTING ADDRESS FOR IMAGE + LD L,22 ; READ 22 SECTORS + CALL $FFFD ; DO READ + JR NZ,ERROR ; HANDLE ERROR + CALL PRTDOT ; PROGRESS +; + LD DE,STR_DONE ; DONE MESSAGE + CALL PRTSTR ; PRINT IT +; + LD D,B ; PASS BOOT UNIT TO OS + LD E,0 ; ASSUME LU IS ZERO + JP SYS_ENT ; GO TO SYSTEM +; +PRTCHR: + PUSH BC + PUSH DE + LD BC,$0012 ; UNIT 0, WRITE CHAR + LD E,A ; CHAR TO PRINT + CALL $FFFD ; PRINT + POP DE + POP BC + RET +; +PRTSTR: + PUSH BC + PUSH HL + LD BC,$0015 ; UNIT 0, WRITE CHARS UNTIL TERMINATOR + LD L,0 ; TERMINATOR IS NULL + CALL $FFFD ; PRINT + POP HL + POP BC + RET +; +PRTDOT: + LD A,'.' ; DOT CHARACTER + JR PRTCHR ; PRINT AND RETURN +; +; PRINT THE HEX BYTE VALUE IN A +; +PRTHEXBYTE: + PUSH AF + PUSH DE + CALL HEXASCII + LD A,D + CALL PRTCHR + LD A,E + CALL PRTCHR + POP DE + POP AF + RET +; +; CONVERT BINARY VALUE IN A TO ASCII HEX CHARACTERS IN DE +; +HEXASCII: + LD D,A + CALL HEXCONV + LD E,A + LD A,D + RLCA + RLCA + RLCA + RLCA + CALL HEXCONV + LD D,A + RET +; +; CONVERT LOW NIBBLE OF A TO ASCII HEX +; +HEXCONV: + AND $0F ;LOW NIBBLE ONLY + ADD A,$90 + DAA + ADC A,$40 + DAA + RET +; +ERROR: + LD DE,STR_ERR ; POINT TO ERROR STRING + CALL PRTSTR ; PRINT IT + HALT ; HALT +; +; DATA +; +STR_LOAD .DB "\r\nLoading",0 +STR_DONE .DB "\r\n",0 +STR_ERR .DB " Read Error!",0 +; + .ORG $ - $8000 ; BACK TO ABSOLUTE ADDRESS +; + .FILL PT_LOC - $,0 ; FILL TO START OF PARTITION TABLE +; +; STANDARD IBM-PC PARTITION TABLE. ALTHOUGH A +; PARTITION TABLE IS NOT RELEVANT FOR A FLOPPY DISK, IT DOES NO HARM. +; THE CONTENTS OF THE PARTITION TABLE CAN BE MANAGED BY FDISK80. +; +; BELOW WE ALLOW FOR 32 SLICES OF ROMWBW CP/M FILESYSTEMS +; FOLLOWED BY A FAT16 PARTITION. THE SLICES FOLLOW THE ORIGINAL +; HD512 ROMWBW FORMAT. IF THE DISK IS USING HD1K, A SEPARATE +; PARTITION TABLE WILL BE IN PLACE AND RENDER THIS PARTITION TABLE +; IRRELEVANT. +; +; THE CYL/SEC FIELDS ENCODE CYLINDER AND SECTOR AS: +; CCCCCCCC:CCSSSSSS +; 76543210:98543210 +; +PART0: + .DB 0 ; ACTIVE IF $80 + .DB 0 ; CHS START ADDRESS (HEAD) + .DW 0 ; CHS START ADDRESS (CYL/SEC) + .DB 0 ; PART TYPE ID + .DB 0 ; CHS LAST ADDRESS (HEAD) + .DW 0 ; CHS LAST ADDRESS (CYL/SEC) + .DW 0,0 ; LBA FIRST (DWORD) + .DW 0,0 ; LBA COUNT (DWORD) +PART1: + .DB 0 ; ACTIVE IF $80 + .DB 0 ; CHS START ADDRESS (HEAD) + .DW %1111111111000001 ; CHS START ADDRESS (CYL/SEC) + .DB 6 ; PART TYPE ID + .DB 15 ; CHS LAST ADDRESS (HEAD) + .DW %1111111111010000 ; CHS LAST ADDRESS (CYL/SEC) + .DW $4000,$0010 ; LBA FIRST (DWORD) + .DW $0000,$000C ; LBA COUNT (DWORD) +PART2: + .DB 0 ; ACTIVE IF $80 + .DB 0 ; CHS START ADDRESS (HEAD) + .DW 0 ; CHS START ADDRESS (CYL/SEC) + .DB 0 ; PART TYPE ID + .DB 0 ; CHS LAST ADDRESS (HEAD) + .DW 0 ; CHS LAST ADDRESS (CYL/SEC) + .DW 0,0 ; LBA FIRST (DWORD) + .DW 0,0 ; LBA COUNT (DWORD) +PART3: + .DB 0 ; ACTIVE IF $80 + .DB 0 ; CHS START ADDRESS (HEAD) + .DW 0 ; CHS START ADDRESS (CYL/SEC) + .DB 0 ; PART TYPE ID + .DB 0 ; CHS LAST ADDRESS (HEAD) + .DW 0 ; CHS LAST ADDRESS (CYL/SEC) + .DW 0,0 ; LBA FIRST (DWORD) + .DW 0,0 ; LBA COUNT (DWORD) +; +; THE END OF THE FIRST SECTOR MUST CONTAIN THE TWO BYTE BOOT SIGNATURE. +; +BOOTSIG .DB $55,$AA ; STANDARD BOOT SIGNATURE +; +;------------------------------------------------------------------------------- +; SECTOR 2 +; +; THIS SECTOR HAS NOT BEEN DEFINED AND IS RESERVED. +; +;---------------------------------------------------------------------------- +; + .FILL SEC_SIZE,0 ; JUST FILL SECTOR WITH ZEROES +; +;------------------------------------------------------------------------------- +; SECTOR 3 +; +; OS AND DISK METADATA +; +;---------------------------------------------------------------------------- +; + .FILL (BLK_SIZE * 3),0 ; FIRST 384 BYTES ARE NOT YET DEFINED +; +; THE FOLLOWING TWO BYTES ARE AN ADDITIONAL SIGNATURE THAT IS VERIFIED BY +; SOME HARDWARE BIOSES. +; +PR_SIG .DB $5A,$A5 ; SIGNATURE GOES HERE +; + .FILL (META_LOC - $),0 +; +; METADATA +; +PR_WP .DB 0 ; (1) WRITE PROTECT BOOLEAN +PR_UPDSEQ .DW 0 ; (2) PREFIX UPDATE SEQUENCE NUMBER (DEPRECATED?) +PR_VER .DB RMJ,RMN,RUP,RTP ; (4) OS BUILD VERSION +PR_LABEL .DB "Unlabeled$$$$$$$","$" ; (17) DISK LABEL (EXACTLY 16 BYTES!!!) + .DW 0 ; (2) DEPRECATED +PR_LDLOC .DW SYS_LOC ; (2) ADDRESS TO START LOADING SYSTEM +PR_LDEND .DW SYS_END ; (2) ADDRESS TO STOP LOADING SYSTEM +PR_ENTRY .DW SYS_ENT ; (2) ADDRESS TO ENTER SYSTEM (OS) +; +#IF (META_SIZE != ($ - META_LOC)) + .ECHO "META_SIZE VALUE IS WRONG!!!\r\n" + !!! +#ENDIF +; +#IF ($ != PREFIX_SIZE) + .ECHO "LOADER PREFIX IS WRONG SIZE!!!\r\n" + !!! +#ENDIF +; + .END diff --git a/Source/QPM/qcp27.dat b/Source/QPM/qcp27.dat new file mode 100644 index 00000000..e48dc5ff Binary files /dev/null and b/Source/QPM/qcp27.dat differ diff --git a/Source/QPM/qdos27.dat b/Source/QPM/qdos27.dat new file mode 100644 index 00000000..69306c7a Binary files /dev/null and b/Source/QPM/qdos27.dat differ diff --git a/Source/ReadMe.txt b/Source/ReadMe.txt index 02a601e0..242e429f 100644 --- a/Source/ReadMe.txt +++ b/Source/ReadMe.txt @@ -142,6 +142,9 @@ to determine the component of the configuration filename: DYNO Dyno Z180 Single Board Computer MBC Andrew Lynch's Nhyodyne Z80 MBC RPH Andrew Lynch's Rhyophyre Z180 SBC + Z80RETRO Peter Wilson's Z80-Retro Computer + S100 S100 Computers Z180-based System + DUO Andrew Lynch's Duodyne Computer UNA John Coffman's UNA System Configuration files are found in the Source\HBIOS\Config diff --git a/Source/ReadMeDoc.txt b/Source/ReadMeDoc.txt new file mode 100644 index 00000000..0ca671e4 --- /dev/null +++ b/Source/ReadMeDoc.txt @@ -0,0 +1,33 @@ +*********************************************************************** +*** *** +*** R o m W B W *** +*** *** +*** Z80/Z180 System Software *** +*** *** +*********************************************************************** + +This document describes the process to build the custom documentation +for RomWBW. The RomWBW documentation is not normally built as part of +the full build process. This is because it requires external tools +to be installed. + +All source documents are first pre-processed with gpp to allow use of +some global variable expansions. Pandoc is then used to generate a +variety of output formats. The most significant of these are the PDF +documents. Pandoc invokes a Latex-type processor (LuaTeX) to +produce the final PDF documents. + +Required for Windows: + - Pandoc (https://pandoc.org/) + - MiKTeX (https://miktex.org/) + - Install Roboto font from MiKTeX Console + +Required for Linux: + - gpp ((apt install gpp) + - Pandoc (dpkg -i pandoc-3.1.8-1-amd64.deb) + - TexLive (apt install texlive-latex-extra texlive-luatex fonts-roboto texlive-fonts-extra) + +The source directory for the documentation is .../Source/Doc. From this +directory run Build.cmd for Windows or make for Linux to create the +output documents. This will create the final documents and copy them +to their destination directories. \ No newline at end of file diff --git a/Source/RomDsk/Build.cmd b/Source/RomDsk/Build.cmd index a13f1a2f..e7ccae93 100644 --- a/Source/RomDsk/Build.cmd +++ b/Source/RomDsk/Build.cmd @@ -24,31 +24,36 @@ set RomApps2=fdu format survey sysgen talk timer cpuspd set RomApps= -copy NUL rom128_wbw.dat -copy NUL rom128_una.dat +copy NUL rom128_wbw.dat || exit /b +copy NUL rom128_una.dat || exit /b :: MakeDisk set RomApps=%RomApps1% -call :MakeDisk rom256_wbw 256 0x20000 wbw -call :MakeDisk rom256_una 256 0x20000 una +call :MakeDisk rom256_wbw wbw_rom256 ROM_256KB 0x20000 wbw || exit /b +call :MakeDisk rom256_una wbw_rom256 ROM_256KB 0x20000 una || exit /b set RomApps=%RomApps1% %RomApps2% -call :MakeDisk rom512_wbw 512 0x60000 wbw -call :MakeDisk rom512_una 512 0x60000 una +call :MakeDisk rom512_wbw wbw_rom512 ROM_512KB 0x60000 wbw || exit /b +call :MakeDisk rom512_una wbw_rom512 ROM_512KB 0x60000 una || exit /b -call :MakeDisk rom1024_wbw 1024 0xE0000 wbw -call :MakeDisk rom1024_una 1024 0xE0000 una +call :MakeDisk rom1024_wbw wbw_rom1024 ROM_1024KB 0xE0000 wbw || exit /b +call :MakeDisk rom1024_una wbw_rom1024 ROM_1024KB 0xE0000 una || exit /b + +call :MakeDisk ram512_wbw wbw_ram512 RAM_512KB 0x40000 wbw || exit /b + +call :MakeDisk ram1024_wbw wbw_ram1024 RAM_1024KB 0xC0000 wbw || exit /b goto :eof :MakeDisk set Output=%1 -set RomSize=%2 -set ImgSize=%3 -set Bios=%4 +set DiskDef=%2 +set Dir=%3 +set ImgSize=%4 +set Bios=%5 echo Making ROM Disk %Output% @@ -56,12 +61,12 @@ echo Making ROM Disk %Output% srec_cat -Generate 0 %ImgSize% --Constant 0xE5 -Output %Output%.dat -Binary || exit /b :: Populate the disk image via cpmtools -cpmcp -f wbw_rom%RomSize% %Output%.dat ROM_%RomSize%KB/*.* 0: || exit /b -for %%f in (%RomApps%) do cpmcp -f wbw_rom%RomSize% %Output%.dat ../../Binary/Apps/%%f.com 0: || exit /b -cpmcp -f wbw_rom%RomSize% %Output%.dat ..\cpm22\cpm_%Bios%.sys 0:cpm.sys || exit /b -cpmcp -f wbw_rom%RomSize% %Output%.dat ..\zsdos\zsys_%Bios%.sys 0:zsys.sys || exit /b +cpmcp -f %DiskDef% %Output%.dat %Dir%/*.* 0: || exit /b +for %%f in (%RomApps%) do cpmcp -f %DiskDef% %Output%.dat ../../Binary/Apps/%%f.com 0: || exit /b +cpmcp -f %DiskDef% %Output%.dat ..\cpm22\cpm_%Bios%.sys 0:cpm.sys || exit /b +cpmcp -f %DiskDef% %Output%.dat ..\zsdos\zsys_%Bios%.sys 0:zsys.sys || exit /b :: Mark all disk files R/O for safety -cpmchattr -f wbw_rom%RomSize% %Output%.dat r 0:*.* || exit /b +cpmchattr -f %DiskDef% %Output%.dat r 0:*.* || exit /b goto :eof diff --git a/Source/RomDsk/Makefile b/Source/RomDsk/Makefile index 8d32a429..0a013cfe 100644 --- a/Source/RomDsk/Makefile +++ b/Source/RomDsk/Makefile @@ -1,4 +1,4 @@ -OBJECTS = rom128_wbw.dat rom128_una.dat rom256_wbw.dat rom256_una.dat rom512_wbw.dat rom512_una.dat rom1024_wbw.dat rom1024_una.dat +OBJECTS = rom128_wbw.dat rom128_una.dat rom256_wbw.dat rom256_una.dat rom512_wbw.dat rom512_una.dat rom1024_wbw.dat rom1024_una.dat ram512_wbw.dat ram1024_wbw.dat OTHERS=*.dat TOOLS = ../../Tools @@ -9,19 +9,34 @@ include $(TOOLS)/Makefile.inc ROMAPPS1 := assign mode rtc syscopy xm ROMAPPS2 := fdu format survey sysgen talk timer cpuspd -rom256_%.dat: ROMSIZ=256 -rom512_%.dat: ROMSIZ=512 -rom1024_%.dat: ROMSIZ=1024 +# rom256_%.dat: ROMSIZ=256 +# rom512_%.dat: ROMSIZ=512 +# rom1024_%.dat: ROMSIZ=1024 + +rom256_%.dat: DISKDEF=wbw_rom256 +rom512_%.dat: DISKDEF=wbw_rom512 +rom1024_%.dat: DISKDEF=wbw_rom1024 +ram512_%.dat: DISKDEF=wbw_ram512 +ram1024_%.dat: DISKDEF=wbw_ram1024 + +rom256_%.dat: DIR=ROM_256KB +rom512_%.dat: DIR=ROM_512KB +rom1024_%.dat: DIR=ROM_1024KB +ram512_%.dat: DIR=RAM_512KB +ram1024_%.dat: DIR=RAM_1024KB rom256_%.dat: IMGSIZ=0x20000 rom512_%.dat: IMGSIZ=0x60000 rom1024_%.dat: IMGSIZ=0xE0000 +ram512_%.dat: IMGSIZ=0x40000 +ram1024_%.dat: IMGSIZ=0xC0000 rom256_%.dat: ROMAPPS=$(ROMAPPS1) rom512_%.dat rom1024_%.dat: ROMAPPS=$(ROMAPPS1) $(ROMAPPS2) +ram512_%.dat ram1024_%.dat: ROMAPPS=$(ROMAPPS1) $(ROMAPPS2) -rom%_wbw.dat: BIOS=wbw -rom%_una.dat: BIOS=una +%_wbw.dat: BIOS=wbw +%_una.dat: BIOS=una rom128_%.dat: touch $@ @@ -29,8 +44,8 @@ rom128_%.dat: %.dat: ### Making ROM Disk $@ srec_cat -Generate 0 $(IMGSIZ) --Constant 0xE5 -Output $@ -Binary - $(CPMCP) -f wbw_rom$(ROMSIZ) $@ ROM_$(ROMSIZ)KB/*.* 0: - for i in $(ROMAPPS) ; do $(CPMCP) -f wbw_rom$(ROMSIZ) $@ ../../Binary/Apps/$$i.com 0: ; done - $(CPMCP) -f wbw_rom$(ROMSIZ) $@ ../CPM22/cpm_$(BIOS).sys 0:cpm.sys - $(CPMCP) -f wbw_rom$(ROMSIZ) $@ ../ZSDOS/zsys_$(BIOS).sys 0:zsys.sys - $(CPMCHATTR) -f wbw_rom$(ROMSIZ) $@ r 0:*.* + $(CPMCP) -f $(DISKDEF) $@ $(DIR)/*.* 0: + for i in $(ROMAPPS) ; do $(CPMCP) -f $(DISKDEF) $@ ../../Binary/Apps/$$i.com 0: ; done + $(CPMCP) -f $(DISKDEF) $@ ../CPM22/cpm_$(BIOS).sys 0:cpm.sys + $(CPMCP) -f $(DISKDEF) $@ ../ZSDOS/zsys_$(BIOS).sys 0:zsys.sys + $(CPMCHATTR) -f $(DISKDEF) $@ r 0:*.* diff --git a/Source/RomDsk/RAM_1024KB/ASM.COM b/Source/RomDsk/RAM_1024KB/ASM.COM new file mode 100644 index 00000000..a63e5aec Binary files /dev/null and b/Source/RomDsk/RAM_1024KB/ASM.COM differ diff --git a/Source/RomDsk/RAM_1024KB/CLOCKS.DAT b/Source/RomDsk/RAM_1024KB/CLOCKS.DAT new file mode 100644 index 00000000..e64c7e05 Binary files /dev/null and b/Source/RomDsk/RAM_1024KB/CLOCKS.DAT differ diff --git a/Source/RomDsk/RAM_1024KB/CLRDIR.COM b/Source/RomDsk/RAM_1024KB/CLRDIR.COM new file mode 100644 index 00000000..9c00904f Binary files /dev/null and b/Source/RomDsk/RAM_1024KB/CLRDIR.COM differ diff --git a/Source/RomDsk/RAM_1024KB/COMPARE.COM b/Source/RomDsk/RAM_1024KB/COMPARE.COM new file mode 100644 index 00000000..29fa41e6 Binary files /dev/null and b/Source/RomDsk/RAM_1024KB/COMPARE.COM differ diff --git a/Source/RomDsk/RAM_1024KB/COPY.CFG b/Source/RomDsk/RAM_1024KB/COPY.CFG new file mode 100644 index 00000000..3d5310ac Binary files /dev/null and b/Source/RomDsk/RAM_1024KB/COPY.CFG differ diff --git a/Source/RomDsk/RAM_1024KB/COPY.COM b/Source/RomDsk/RAM_1024KB/COPY.COM new file mode 100644 index 00000000..606c81a5 Binary files /dev/null and b/Source/RomDsk/RAM_1024KB/COPY.COM differ diff --git a/Source/RomDsk/RAM_1024KB/COPY.UPD b/Source/RomDsk/RAM_1024KB/COPY.UPD new file mode 100644 index 00000000..3725b0e8 --- /dev/null +++ b/Source/RomDsk/RAM_1024KB/COPY.UPD @@ -0,0 +1,43 @@ + 11 Dec 88 + +Some changes have been made to COPY since the manual was written. +Comparison of dates with Existence testing ON has been changed to +use the Creation date when no Modified date exists, and print +"Undated" when neither exists, yet both source and destination +disks support file date stamping. Additionally, the /X option +has been re-defined, and a new /R option has been added to +Version 1.4. Please replace Paragraph 4.1.2.9 on page 55 of your +ZSDOS manual with the following two paragraphs describing the new +options. + + +4.1.2.9.1 ERASE SOURCE FILE AFTER COPY. + +When you want to "move" a file from one area to another, the "X" +option may be used. This option causes a file or group of files +to be copied in the manner described by the default or specified +options, but after the copy and optional verify, the source file +or files are erased. You will be notified that the file has been +erased by the status "(X)" being printed on your console. To +minimize the possibility of deleting a good file when errors +exist in the copy, the Verify option should always be active, +either by default, or specified. When Verify is active, any +errors detected will disable the "X" option for that file so that +a good source file will not be deleted. The "X" option has no +configurable value, and is always assumed to be "Off" requiring +the option in the command line list to be effective. + + +4.1.2.9.2 COPY ONLY FILES WHICH EXIST (REPLACE). + +Occasionally, you may wish to update selected files to a destina- +tion in a simpler manner than naming each file, or using the +Inspect option. The "R" (Replace) option, when active, tells +COPY to transfer only files which exist on the destination direc- +tory. If the Archive option (A) is added in conjunction with the +Replace option, only files which have not been archived, AND +already exist on the destination will be archived. It should be +noted that the No Replacement (N) option is incompatible with +both the Replace and Archive options, and is disabled when either +"R" or "A" are active. + \ No newline at end of file diff --git a/Source/RomDsk/RAM_1024KB/CR.COM b/Source/RomDsk/RAM_1024KB/CR.COM new file mode 100644 index 00000000..8a824bcc Binary files /dev/null and b/Source/RomDsk/RAM_1024KB/CR.COM differ diff --git a/Source/RomDsk/RAM_1024KB/DATSWEEP.COM b/Source/RomDsk/RAM_1024KB/DATSWEEP.COM new file mode 100644 index 00000000..5d298c0b Binary files /dev/null and b/Source/RomDsk/RAM_1024KB/DATSWEEP.COM differ diff --git a/Source/RomDsk/RAM_1024KB/DDT.COM b/Source/RomDsk/RAM_1024KB/DDT.COM new file mode 100644 index 00000000..70e4ebfe Binary files /dev/null and b/Source/RomDsk/RAM_1024KB/DDT.COM differ diff --git a/Source/RomDsk/RAM_1024KB/DDTZ.COM b/Source/RomDsk/RAM_1024KB/DDTZ.COM new file mode 100644 index 00000000..4f6eca6b Binary files /dev/null and b/Source/RomDsk/RAM_1024KB/DDTZ.COM differ diff --git a/Source/RomDsk/RAM_1024KB/DDTZ.DOC b/Source/RomDsk/RAM_1024KB/DDTZ.DOC new file mode 100644 index 00000000..e4470528 --- /dev/null +++ b/Source/RomDsk/RAM_1024KB/DDTZ.DOC @@ -0,0 +1,564 @@ + + DDTZ v2.7 + by C.B. Falconer + edited by George A. Havach + +Introduction: +============ +DDTZ v2.7 is a complete replacement for DDT, Digital Research's +famous Dynamic Debugging Tool, with improved functionality, bug +extermination, and full Z80 support. In general, DDTZ is fully +compatible with the original utility, but it has extra and +extended commands and many fewer quirks. All Z80-specific +instructions can be (dis)assembled, though in Intel rather then +Zilog format. Furthermore, DDTZ will correctly trace ('T' and 'U' +commands) both 8080 and Z80 instructions, depending on which CPU +is operating. On startup, the program announces which CPU it is +running on. + +DDTZ v2.7 now handles the 64180 added opcodes. It does NOT test +for a 64180 CPU, since this cannot be done without executing +illegal Z80 instructions, which in turn will crash some +simulators. However v2.7 does not execute any 64180 instructions +internally, only in the subject program. + +This issue supplies the "M" version assembled, to avoid errors +when switching between MSDOS and CPM systems. The command table +is updated accordingly. Most CPM users are also MSDOS users, but +not vice-versa. + +The program is invoked by typing + + ddtz +or + ddtz [d:]filespec + +In the second form, DDTZ will load the specified file into +memory starting at 0100H, unless it's a .HEX file that sets its +own load address. Besides reporting the NEXT free address and +the PC (program counter) after a successful load, DDTZ also shows +the number of memory pages needed for a SAVE. Instead of having +to write all this down, just use the 'X' command at any time to +redisplay these three values for the current application. + +NOTE: loading more code above the NEXT pointer revises these + values. + +As in DDT, when a program is loaded above the area holding the +'A' and 'U' (and now 'W') command code, these commands are +disabled, and the extra memory is released to the user. Thus, +DDTZ can occupy as little as 3K total memory space. Unlike DDT, +however, DDTZ will not overwrite itself or the system on program +loads (except .HEX files). + +At initialization, the stack pointer (SP) points to a return to +DDTZ, just like for the CCP. Thus, programs that normally return +to the CCP will be returned to DDTZ. The 'B' command +reinitializes this condition. + + +The intercept vector copies the BDOS version number, etc., so +an object program does not know that DDTZ is running (except +for BIOS-BDOS vector size). Thus, programs that check the version +number should execute correctly under DDTZ. + +All input parameters can now be entered in any of three formats: + + (1) hexadecimal (as in DDT), + (2) decimal, by adding a leading '#' character, + (3) ASCII, by enclosing between either single or double + quotes; either one or two characters are allowed. + +Leading blanks in command lines and parameters are absorbed. +Either a comma or a (single) space is a valid delimiter. +Either uppercase or lowercase input is accepted. + +The default command (for anything not otherwise recognizable) +is 'H'. This allows convenient calculation, along with the other +features described below. So, to convert a number, just enter +it! + +As in DDT, the prompt character is '-', and the only error +message is the query ('?'), which generally kicks you back to +command mode. + +New Commands (Over DDT): +======================= + +NOTE: letters in parenthesis, e.g. "(U)", show the equivalent + command for DDTZM version (compatible with MSDOS debug). + + @ Sets or shows (with no parameter) the internally stored + "base" value. Also used with the 'S' and 'D' commands as + an optional parameter (though without the '@') to display + memory from an arbitrary base marker (offset). When set to + zero (the default), it does not affect any screen displays. + + B B)egin: resets the USER stack pointer to its initial value, + such that any program that exits by an RET will return to + DDTZ. DDTZ provides a default stack space of + approximately 24 bytes for user programs. + + C C)ompare first_address,last_address,against_address: shows + all the byte differences between two memory areas, in the + format + + XXXX aa YYYY bb + + where XXXX and YYYY are the comparative memory addresses, + and aa and bb are the corresponding byte values. Can be + used to verify the identity of two files by first + loading them into different memory areas with the 'R' + command (see below). + + + W Write: stores the modified memory area to disk under the + (K) filename specified by the 'I' command, overwriting the + original file from which it was loaded (the user is queried + before doing so). By default, the image of memory from + 0100H through the "NEXT" value -1 is saved. "K first_addr, + last_address" overrides this and allows writing ANY memory + area to a file. Almost a necessity for CPM 3.0 (no SAVE!). + K)eep on DDTZ + + X eXamine: redisplays the "NEXT PC SAVE" report at any time. + (Q) Q)uery size on DDTZ. + + S S)earch first_address, last_addr, value: searches the + (W) specified memory area for the value (a 16-bit word, not a + byte) and shows the locations of all such. Very useful for + finding CALL's or JMP's to a particular address, etc. + W)here on DDTZ + + Y Y)our_option parm1,parm2,address: executes an arbitrary + routine at the specified address, with the BC and DE + registers set to parm1 and parm2, respectively. + + Z Displays (but does not alter) the Z80's alternate register + set, including the index registers (disabled if running on + an 8080). On Z80's, automatically included as the last + part of the display by the 'X' command. + + +Based (Offset) Displays: +======================= + +The 'D' and 'E' commands can use a stored base value (offset), +as set by the '@' command. The current @ value may be +overridden for a single execution of these commands by adding the +base as an extra parameter in the command line. The effect is +to add this value to the first/last address and display +accordingly. The address listing on the left becomes XXXX:YYYY, +where XXXX is the offset address and YYYY is the actual memory +address being displayed. For example, if you have a data area +located at 42B7H and wish to preserve easy access, just enter +"@42b7". Now, "d0,3f" will dump memory starting at 4237H. + + +Further Changes from DDT: +======================== + + A A)ssemble now accepts the full Z80 as well as 8080 + instruction set, although it expects them in Intel rather + than Zilog format (see notes below under the 'L' + command). When in doubt, see the mnemnonic list below. + + D D)isplay or D)ump will accept an optional third parameter + to set the base value for a single execution only. Format + has been cleaned up. + + H H)ex_arithmetic on two values also shows their + difference in decimal. With only one value, converts to + hexadecimal, decimal, and ASCII (low-order byte only). + + + N N)ame now allows drive specification (d:...) and sets up + (I) the complete command line, including both FCB's (at + addresses 005CH and 006CH). The tail (stored at 0081H up) + is NOT upshifted. + I)nput on DDTZ + + U U)nassemble now displays the raw hexcode, especially handy + (L) when examining non-code areas. Intel (8080 style) mnemonics + are used, so some disassembled instructions may look + strange. E.g., the Z80's 'IN B,(C)' and 'OUT (C),B' become + 'INP B' and 'OUTP B', respectively; 'LD (nnnn),BC' becomes + 'SBCD nnnn', 'ADD IX, BC' becomes 'DADX B', and 'JP (IX)' + becomes 'PCIX'. + L)ist on DDTZ + + L L)oad now permits loading a file into memory with an + (R) offset, which is added to the default load address of + 0100H. When reading in a .HEX file with a preset bias, + the 'R' command will not transfer control to an invalid + execution point. Another execution of the 'R' command will + reread the input file, e.g.: + + n blah + l + ...modify the code and generally mess about... + l + + The original file is reloaded, and the modifications are + removed. + R)ead on DDTZ + + E E)nter, like D)isplay, now accepts an optional second + (S) parameter to set the base value for a single execution + only. + S)ubstitute or S)et on DDTZ + + T T)rap/trace on termination now shows the complete CPU + state. Traps and traces no longer lock up when a user RST + 7 instruction is executed. Tracing of BDOS/BIOS calls is + heavily trun cated, avoiding clutter and preventing system + crashes. + +NOTE: Most of the UNDOCUMENTED Z80 op-codes are handled. Others + can crash the system. + + R R)egisters also shows what two-byte values the HL and SP + (X) registers are actually pointing to. On Z80's, displays the + alternate register set. + eX)amine on DDTZ + +NOTE: Any use of the 'W' or 'L' command resets the system DMA + transfer address to the standard default value of 0080H. + + +; This is the output of DDTZ when disassembling OPTYPE.TRY +NOP LDA 06A4 MOV M,H +LXI B,06A4 DCX SP MOV M,L +STAX B INR A HLT +INX B DCR A MOV M,A +INR B MVI A,20 MOV A,B +DCR B CMC MOV A,C +MVI B,20 MOV B,B MOV A,D +RLC MOV B,C MOV A,E +EXAF MOV B,D MOV A,H +DAD B MOV B,E MOV A,L +LDAX B MOV B,H MOV A,M +DCX B MOV B,L MOV A,A +INR C MOV B,M ADD B +DCR C MOV B,A ADD C +MVI C,20 MOV C,B ADD D +RRC MOV C,C ADD E +DJNZ 0134 MOV C,D ADD H +LXI D,06A4 MOV C,E ADD L +STAX D MOV C,H ADD M +INX D MOV C,L ADD A +INR D MOV C,M ADC B +DCR D MOV C,A ADC C +MVI D,20 MOV D,B ADC D +RAL MOV D,C ADC E +JR 0134 MOV D,D ADC H +DAD D MOV D,E ADC L +LDAX D MOV D,H ADC M +DCX D MOV D,L ADC A +INR E MOV D,M SUB B +DCR E MOV D,A SUB C +MVI E,20 MOV E,B SUB D +RAR MOV E,C SUB E +JRNZ 0134 MOV E,D SUB H +LXI H,06A4 MOV E,E SUB L +SHLD 06A4 MOV E,H SUB M +INX H MOV E,L SUB A +INR H MOV E,M SBB B +DCR H MOV E,A SBB C +MVI H,20 MOV H,B SBB D +DAA MOV H,C SBB E +JRZ 0134 MOV H,D SBB H +DAD H MOV H,E SBB L +LHLD 06A4 MOV H,H SBB M +DCX H MOV H,L SBB A +INR L MOV H,M ANA B +DCR L MOV H,A ANA C +MVI L,20 MOV L,B ANA D +CMA MOV L,C ANA E +JRNC 0134 MOV L,D ANA H +LXI SP,06A4 MOV L,E ANA L +STA 06A4 MOV L,H ANA M +INX SP MOV L,L ANA A +INR M MOV L,M XRA B +DCR M MOV L,A XRA C +MVI M,20 MOV M,B XRA D +STC MOV M,C XRA E +JRC 0134 MOV M,D XRA H +DAD SP MOV M,E XRA L + + +XRA M JPE 06A4 SLAR M +XRA A XCHG SLAR A +ORA B CPE 06A4 SRAR B +ORA C XRI 20 SRAR C +ORA D RST 5 SRAR D +ORA E RP SRAR E +ORA H POP PSW SRAR H +ORA L JP 06A4 SRAR L +ORA M DI SRAR M +ORA A CP 06A4 SRAR A +CMP B PUSH PSW SLLR B +CMP C ORI 20 SLLR C +CMP D RST 6 SLLR D +CMP E RM SLLR E +CMP H SPHL SLLR H +CMP L JM 06A4 SLLR L +CMP M EI SLLR M +CMP A CM 06A4 SLLR A +RNZ CPI 20 SRLR B +POP B RST 7 SRLR C +JNZ 06A4 RLCR B SRLR D +JMP 06A4 RLCR C SRLR E +CNZ 06A4 RLCR D SRLR H +PUSH B RLCR E SRLR L +ADI 20 RLCR H SRLR M +RST 0 RLCR L SRLR A +RZ RLCR M BIT 0,B +RET RLCR A BIT 0,C +JZ 06A4 RRCR B BIT 0,D +CZ 06A4 RRCR C BIT 0,E +CALL 06A4 RRCR D BIT 0,H +ACI 20 RRCR E BIT 0,L +RST 1 RRCR H BIT 0,M +RNC RRCR L BIT 0,A +POP D RRCR M BIT 1,B +JNC 06A4 RRCR A BIT 1,C +OUT 20 RALR B BIT 1,D +CNC 06A4 RALR C BIT 1,E +PUSH D RALR D BIT 1,H +SUI 20 RALR E BIT 1,L +RST 2 RALR H BIT 1,M +RC RALR L BIT 1,A +EXX RALR M BIT 2,B +JC 06A4 RALR A BIT 2,C +IN 20 RARR B BIT 2,D +CC 06A4 RARR C BIT 2,E +SBI 20 RARR D BIT 2,H +RST 3 RARR E BIT 2,L +RPO RARR H BIT 2,M +POP H RARR L BIT 2,A +JPO 06A4 RARR M BIT 3,B +XTHL RARR A BIT 3,C +CPO 06A4 SLAR B BIT 3,D +PUSH H SLAR C BIT 3,E +ANI 20 SLAR D BIT 3,H +RST 4 SLAR E BIT 3,L +RPE SLAR H BIT 3,M +PCHL SLAR L BIT 3,A + + +BIT 4,B RES 3,D SET 2,H +BIT 4,C RES 3,E SET 2,L +BIT 4,D RES 3,H SET 2,M +BIT 4,E RES 3,L SET 2,A +BIT 4,H RES 3,M SET 3,B +BIT 4,L RES 3,A SET 3,C +BIT 4,M RES 4,B SET 3,D +BIT 4,A RES 4,C SET 3,E +BIT 5,B RES 4,D SET 3,H +BIT 5,C RES 4,E SET 3,L +BIT 5,D RES 4,H SET 3,M +BIT 5,E RES 4,L SET 3,A +BIT 5,H RES 4,M SET 4,B +BIT 5,L RES 4,A SET 4,C +BIT 5,M RES 5,B SET 4,D +BIT 5,A RES 5,C SET 4,E +BIT 6,B RES 5,D SET 4,H +BIT 6,C RES 5,E SET 4,L +BIT 6,D RES 5,H SET 4,M +BIT 6,E RES 5,L SET 4,A +BIT 6,H RES 5,M SET 5,B +BIT 6,L RES 5,A SET 5,C +BIT 6,M RES 6,B SET 5,D +BIT 6,A RES 6,C SET 5,E +BIT 7,B RES 6,D SET 5,H +BIT 7,C RES 6,E SET 5,L +BIT 7,D RES 6,H SET 5,M +BIT 7,E RES 6,L SET 5,A +BIT 7,H RES 6,M SET 6,B +BIT 7,L RES 6,A SET 6,C +BIT 7,M RES 7,B SET 6,D +BIT 7,A RES 7,C SET 6,E +RES 0,B RES 7,D SET 6,H +RES 0,C RES 7,E SET 6,L +RES 0,D RES 7,H SET 6,M +RES 0,E RES 7,L SET 6,A +RES 0,H RES 7,M SET 7,B +RES 0,L RES 7,A SET 7,C +RES 0,M SET 0,B SET 7,D +RES 0,A SET 0,C SET 7,E +RES 1,B SET 0,D SET 7,H +RES 1,C SET 0,E SET 7,L +RES 1,D SET 0,H SET 7,M +RES 1,E SET 0,L SET 7,A +RES 1,H SET 0,M DADX B +RES 1,L SET 0,A DADX D +RES 1,M SET 1,B LXI X,06A4 +RES 1,A SET 1,C SIXD 06A4 +RES 2,B SET 1,D INX X +RES 2,C SET 1,E DADX X +RES 2,D SET 1,H LIXD 06A4 +RES 2,E SET 1,L DCX X +RES 2,H SET 1,M INR [X+05] +RES 2,L SET 1,A DCR [X+05] +RES 2,M SET 2,B MVI [X+05],20 +RES 2,A SET 2,C DADX SP +RES 3,B SET 2,D MOV B,[X+05] +RES 3,C SET 2,E MOV C,[X+05] + + +MOV D,[X+05] DSBC B DADY B +MOV E,[X+05] SBCD 06A4 DADY D +MOV H,[X+05] NEG LXI Y,06A4 +MOV L,[X+05] RETN SIYD 06A4 +MOV [X+05],B IM0 INX Y +MOV [X+05],C LDIA DADY Y +MOV [X+05],D INP C LIYD 06A4 +MOV [X+05],E OUTP C DCX Y +MOV [X+05],H DADC B INR [Y+05] +MOV [X+05],L LBCD 06A4 DCR [Y+05] +MOV [X+05],A RETI MVI [Y+05],2 +MOV A,[X+05] LDRA DADY SP +ADD [X+05] INP D MOV B,[Y+05] +ADC [X+05] OUTP D MOV C,[Y+05] +SUB [X+05] DSBC D MOV D,[Y+05] +SBB [X+05] SDED 06A4 MOV E,[Y+05] +ANA [X+05] IM1 MOV H,[Y+05] +XRA [X+05] LDAI MOV L,[Y+05] +ORA [X+05] INP E MOV [Y+05],B +CMP [X+05] OUTP E MOV [Y+05],C +POP X DADC D MOV [Y+05],D +XTIX LDED 06A4 MOV [Y+05],E +PUSH X IM2 MOV [Y+05],H +PCIX LDAR MOV [Y+05],L +SPIX INP H MOV [Y+05],A +RLCR [X+05] OUTP H MOV A,[Y+05] +RRCR [X+05] DSBC H ADD [Y+05] +RALR [X+05] shld 06A4 ADC [Y+05] +RARR [X+05] RRD SUB [Y+05] +SLAR [X+05] INP L SBB [Y+05] +SRAR [X+05] OUTP L ANA [Y+05] +SRLR [X+05] DADC H XRA [Y+05] +BIT 0,[X+05] lhld 06A4 ORA [Y+05] +BIT 1,[X+05] RLD CMP [Y+05] +BIT 2,[X+05] INP M POP Y +BIT 3,[X+05] OUTP M XTIY +BIT 4,[X+05] DSBC SP PUSH Y +BIT 5,[X+05] SSPD 06A4 PCIY +BIT 6,[X+05] INP A SPIY +BIT 7,[X+05] OUTP A RLCR [Y+05] +RES 0,[X+05] DADC SP RRCR [Y+05] +RES 1,[X+05] LSPD 06A4 RALR [Y+05] +RES 2,[X+05] LDI RARR [Y+05] +RES 3,[X+05] CCI SLAR [Y+05] +RES 4,[X+05] INI SRAR [Y+05] +RES 5,[X+05] OTI SRLR [Y+05] +RES 6,[X+05] LDD BIT 0,[Y+05] +RES 7,[X+05] CCD BIT 1,[Y+05] +SET 0,[X+05] IND BIT 2,[Y+05] +SET 1,[X+05] OTD BIT 3,[Y+05] +SET 2,[X+05] LDIR BIT 4,[Y+05] +SET 3,[X+05] CCIR BIT 5,[Y+05] +SET 4,[X+05] INIR BIT 6,[Y+05] +SET 5,[X+05] OTIR BIT 7,[Y+05] +SET 6,[X+05] LDDR RES 0,[Y+05] +SET 7,[X+05] CCDR RES 1,[Y+05] +INP B INDR RES 2,[Y+05] +OUTP B OTDR RES 3,[Y+05] + + +RES 4,[Y+05] SET 0,[Y+05] SET 4,[Y+05] +RES 5,[Y+05] SET 1,[Y+05] SET 5,[Y+05] +RES 6,[Y+05] SET 2,[Y+05] SET 6,[Y+05] +RES 7,[Y+05] SET 3,[Y+05] SET 7,[Y+05] + +; These are the result of disassembling 64180OPS.TRY +; These opcodes are available ONLY on the 64180 CPU +; DDTZ will both assemble and disassemble these. +IN0 B,20 TST E MLT B +OUT0 20,B IN0 H,20 MLT D +TST B OUT0 20,H TSTI 20 +IN0 C,20 TST H MLT H +OUT0 20,C IN0 L,20 TSIO 20 +TST C OUT0 20,L SLP +IN0 D,20 TST L MLT SP +OUT0 20,D TST M OTIM +TST D IN0 A,20 OTDM +IN0 E,20 OUT0 20,A OIMR +OUT0 20,E TST A ODMR + +; The following are UNDOCUMENTED z80 opcodes from XTDOPS.TRY. +; DDTZ will disassemble these, but will not assemble them. +; They use xh/xl (or yh/yl) as separate byte registers. +; Use these at your own risk. +INRX H ACXR H MOVY H,B +DCRX H ACXR L MOVY H,C +MVIX H,20 SUXR H MOVY H,D +INRX L SUXR L MOVY H,E +DCRX L SBXR H MOVY H,A +MVIX L,20 SBXR L MOVY L,B +MOVX B,H NDXR H MOVY L,C +MOVX B,L NDXR L MOVY L,D +MOVX C,H XRXR H MOVY L,E +MOVX C,L XRXR L MOVY L,A +MOVX D,H ORXR H MOVY A,H +MOVX D,L ORXR L MOVY A,L +MOVX E,H CPXR H ADYR H +MOVX E,L CPXR L ADYR L +MOVX H,B INRY H ACYR H +MOVX H,C DCRY H ACYR L +MOVX H,D MVIY H,20 SUYR H +MOVX H,E INRY L SUYR L +MOVX H,A DCRY L SBYR H +MOVX L,B MVIY L,20 SBYR L +MOVX L,C MOVY B,H NDYR H +MOVX L,D MOVY B,L NDYR L +MOVX L,E MOVY C,H XRYR H +MOVX L,A MOVY C,L XRYR L +MOVX A,H MOVY D,H ORYR H +MOVX A,L MOVY D,L ORYR L +ADXR H MOVY E,H CPYR H +ADXR L MOVY E,L CPYR L + + +Command Summary: +=============== + +DDTZM command DDTZ command +============= ============ +@ (base) +A)ssemble first_address A +B)egin {i.e., initialize stack and return} B +C)ompare first_address,last_address,against_address C +D)ump first_address[,last_address[,base]] D +E)nter_in_memory first_address[,base] S)ubstitute +F)ill first_address,last_address,value F +G)o_to [address][,trap1[,trap2]] G +H)ex_arithmetic value1(,value2) H +L)oad_file (offset) R)ead +M)ove first_address,last_address,destination M +N)nput FCBs_command_line I)nput +Q)uit (not avail) +R)egister examine/change [register|flag] X)amine +S)earch first_address,last_address,word W)hereis +T)race_execution [count] T + Untrace_execution [count] (i.e. do count instr) U)ntrace +U)nassemble_code first_address[,last_address] L)ist code +W)rite [first_address,last_address] K)eep +X)amine {i.e. display memory parameters for application} Q)uery +Y)our_option BC:=parm1,DE:=parm2,call_address Y +Z)80_register_display Z + + +If you find this program useful, contributions will be gratefully +accepted and will encourage further development and release of +useful CPM programs. My practice is to include source. + +C.B. Falconer +680 Hartford Turnpike, +Hamden, Conn. 06517 (203) 281-1438 + +DDTZ and its associated documentation and other files are +copyright (c) 1980-1988 by C.B. Falconer. They may be freely +copied and used for non-commercial purposes ONLY. + diff --git a/Source/RomDsk/RAM_1024KB/DIRX.COM b/Source/RomDsk/RAM_1024KB/DIRX.COM new file mode 100644 index 00000000..413bceca Binary files /dev/null and b/Source/RomDsk/RAM_1024KB/DIRX.COM differ diff --git a/Source/RomDsk/RAM_1024KB/DSCONFIG.COM b/Source/RomDsk/RAM_1024KB/DSCONFIG.COM new file mode 100644 index 00000000..b77dd008 Binary files /dev/null and b/Source/RomDsk/RAM_1024KB/DSCONFIG.COM differ diff --git a/Source/RomDsk/RAM_1024KB/DUMP.COM b/Source/RomDsk/RAM_1024KB/DUMP.COM new file mode 100644 index 00000000..03a77c3c Binary files /dev/null and b/Source/RomDsk/RAM_1024KB/DUMP.COM differ diff --git a/Source/RomDsk/RAM_1024KB/ED.COM b/Source/RomDsk/RAM_1024KB/ED.COM new file mode 100644 index 00000000..a0f0f541 Binary files /dev/null and b/Source/RomDsk/RAM_1024KB/ED.COM differ diff --git a/Source/RomDsk/RAM_1024KB/EX.COM b/Source/RomDsk/RAM_1024KB/EX.COM new file mode 100644 index 00000000..49cb0b81 Binary files /dev/null and b/Source/RomDsk/RAM_1024KB/EX.COM differ diff --git a/Source/RomDsk/RAM_1024KB/FA16.CFG b/Source/RomDsk/RAM_1024KB/FA16.CFG new file mode 100644 index 00000000..b7974d36 Binary files /dev/null and b/Source/RomDsk/RAM_1024KB/FA16.CFG differ diff --git a/Source/RomDsk/RAM_1024KB/FA16.DOC b/Source/RomDsk/RAM_1024KB/FA16.DOC new file mode 100644 index 00000000..08b46875 --- /dev/null +++ b/Source/RomDsk/RAM_1024KB/FA16.DOC @@ -0,0 +1,264 @@ + + FILEATTR + Version 1.6 + + Gene Pizzetta + January 18, 1992 + A ZSDOS utility, copyright (c) 1988 by Carson Wilson. + + +FILEATTR (FA) is a utility that allows rapid settin, resetting, +or displaying of file attributes under ZSDOS, ZRDOS, and CP/M +2.2. Several additional features are available under ZCPR3, +including error flag setting, error handler invocation, an +enhanced display, and better error detection. + +FA will not run under CP/M 3.0 or Z3PLUS. + +USAGE: + + FILEATTR {dir:}{afn} {{/}options} + +If a DIR or DU specification is not given, the current directory +is assumed (under vanilla CP/M only the drive is significant). +If no ambiguous or unambiguous filename is given, all files +("*.*") are matched. + +If no attribute options are given, FILEATTR merely displays the +current state of each file's attributes. Files are displayed in +the order that they appear in the directory. + +Once operation begins, FA cannot be aborted by the user. If a ^C +is entered at the keyboard, all screen output stops, but file +attribute operations continue to completion. If that was not the +case, attributes might be set on some entries for a file and not +on others. Nevertheless, suppressing screen output speeds things +up a bit. + +OPTIONS: A leading slash is required unless the option list is +the second parameter on the command line. Options may be +separated by spaces, commas, or nothing at all. + +ATTRIBUTE OPTIONS: These options set (turn on) corresponding +attributes on files matching the file specification. Attributes +not specified by an attribute option remain unchanged. + +If the option is preceded by a minus ("-") or by an "N", the +corresponding attribute is reset (turned off). + + 1 F1. This is a user attribute which has no predefined + meaning. + + P Public (f2). Under ZSDOS, when this attribute is set, + a file is available from any user area of the disk on + which it resides. A file cannot be made public if + another file with the same name exists in any other + user area on that drive. In that case FA will issue an + error message and leave the attribute off. + + D Inhibit access datestamp (f3). Under ZSDOS, when this + attribute is set, the file's access datestamp will not + be updated, which may speed file access slightly. If + the attribute is turned off, normal access datestamping + resumes. + + 4 F4. This is a user attribute which has no predefined + meaning. + + W Wheel protect (f8). Under ZSDOS, when this attribute + is set, the file becomes read-only when the wheel byte + is off and cannot be erased. If the wheel byte is on, + the file can be erased normally. + + R Read only (t1). When this attribute is set, the file + cannot be erased or modified by most programs. + + S System (t2). When this attribute is set, the file + becomes a "hidden" file that will not be found by most + directory programs or by most well-behaved utilities + that accept ambiguous filenames. (FA must find system + files, of course.) + + A Archive (t3). When this attribute is set, it signals + some archival programs that the file has not been + modified since it was last backed up. If a file is + modified, ZSDOS and ZRDOS turn this attribute off. + CP/M does not fully support this attribute, however. + +OTHER OPTIONS: These options affect only the screen display. + + Q Quiet mode. Console output is suppressed unless there + is an error. All other operations are performed + normally. + + X Screen paging off. With this option, screen paging is + turned off. The screen can still be paused by pressing + any key except ^C. + +ERRORS: Under ZCPR3, errors will cause FA to set the program +error flag and to invoke the error handler. The error flag will +be set to the following values: + 2 invalid directory specification + 4 miscellaneous (conflicting file, no files on disk) + 10 no matching files found (no error handler) + 18 Disk read-only + 19 Invalid option + +For error code 10 (no matching files found), the error flag is +set, but the error handler is not called. + +In addition, under ZCPR 3.3 and above, an invalid directory +specification will abort FA to the error handler, but no message +is printed. + +The following error messages may be seen: + +Conflicting entry, can't set public attribute + If there are files with the same name in other user areas of + the disk, the public attribute cannot be set. + +No files on disk + The disk directory is empty. + +Bad Option: /o + The command line option shown is unknown to FILEATTR. + +Drive R/O + The drive is set to read-only by the operating system and + attributes cannot be changed. + +CP/M version 2.x required + FILEATTR will not run on this system. + +BIOS write error near directory sector n + An error occurred at or near the given directory sector, + which is expressed as a decimal offset from the beginning of + the directory. + +BIOS set track detected - FA aborting + A background program is attempting to modify the current + track setting. The background program must be removeed + before running FA again. + +Not Wheel + Under ZCPR3 the wheel byte must be set before FILEATTR can + be run. + +CONFIGURATION: While no installation is necessary, all options +can be set as defaults, if you prefer, using ZCNFG. The +configuration options are fully explained on the ZCNFG help +screens. + +It is best not to change the name of the configuration file. Its +special name assures that ZCNFG will always find the correct CFG +file, even if the name of FA has been changed or if more than one +version of FA is online. + +HISTORY: + +Version 1.6 -- April 14, 1991 -- Gene Pizzetta + Now displays target DU and directory name in summary. Fixed + bug that caused "GO" to be displayed as program name, if it + was re-invoked with the GO command. + +Version 1.5 -- March 27, 1991 -- Gene Pizzetta + Now calls CP/M version checking routine (it was there, but + it wasn't called). Changed error codes: 10, no matching + files found. "No files on disk" error now gets + miscellaneous error code (4). Error 10 does not invoke + error handler. Not released. + +Version 1.4 -- March 20, 1991 -- Gene Pizzetta, Howard Goldstein + Code to check module data byte (S2) was replaced by Howard + Goldstein's elegant solution which uses a "true" extent + number: ((data_mod * 32) + extent). Entering a ^C no + longer really aborts FILEATTR; instead FA immediately prints + "Wait..." on the screen, turns off paging, turns on quiet + mode, sets the results flag, and finishes what it was doing. + All this is to prevent unexpected results when only some of + a file's directory entries are changed. All errors + including a conflicting file found during a PUBLIC request, + now set the program error flag and invoke the error handler + so an active SUBMIT or ZEX script can be aborted. The error + flag will have the following values: 2, invalid directory; + 10, no files on disk; 18, disk is read-only; 19, invalid + option; 4, all other errors. If no matching files are + found, the program error flag will be set to FFh, but the + error handler will not be invoked. A few other code changes + were made, including a check for CP/M-Plus, under which + FILEATTR will not work. Not released. + +Version 1.3 -- February 22, 1991 -- Gene Pizzetta + Corrected bug that caused faulty operation on large files: + The module data byte (S2) byte was not being checked, so + such files appeared 2 or more times in the directory display + and the public routine was often not finding conflicting + files. Added configuration byte and command line option (X) + for screen paging (paging is suppressed in quiet mode). + Made quiet mode responsive to ZCPR quiet flag and changed Q + command line option to toggle. Usage screen reflects + current effect of X and Q toggles. Attribute configuration + area changed to be compatible with ZCNFG TOGL3 routine. + Actions of D and ND options reversed so they work the same + as the others. Added configuration byte for printing + summary line even in quiet mode, as suggested by Howard + Goldstein. Removed blank lines from screen display, + allowing three more filenames to be shown. Removed tabs + from usage screen so PRINT and PSTR are not needed. + Eliminated leading zero from user number display. Now + prints "file" instead of "files" in summary when only 1 + matching file is found. Ditto for attribute(s) altered. + +Version 1.2 -- November 30, 1988 -- Carson Wilson + Fixed bug of no program name display when FILEATTR's name + was 8 characters long. + +Version 1.1 -- October 30, 1988 -- Carson Wilson + Now wildcards the command forms "FA d: /options" and "FA d: + options." + +Version 1.0 -- September 26, 1988 -- Carson Wilson + If a filespec is given, no leading slash is required before + the options. Link with version 4 libraries. Removed /X + option--ZSDOS 10T always closes the first extent when a file + is written to. Changed summary to read "files matched". + +Version 0.9 -- July 7, 1988 -- Carson Wilson + Increased length of search FCB (AMBFIL) by one byte. Set up + AMBFIL as '?' + 35 binary 0's. ZRDOS and CP/M zero the + drive byte (FCB+0) during search next calls, so reinitialize + it to '?' before rescanning the directory. PROGID now + prints stored name on GO/JUMP. + +Version 0.8 -- June 26, 1988 -- Carson Wilson + Use SYSLIB PRINT for help display. VPRINT does not expand + tabs. Now traps disk track changes at the BIOS level. + Allows '-' as well as 'N' for "negate option." Auto- + wildcards FCB1 for attribute set as well as display. + +Version 0.7 -- May 24, 1988 -- Carson Wilson + Cosmetic changes to help, display. Made public routines + faster by 1/2 directory scan average. Consolidated file + attribute setting/resetting routines for efficiency and + clarity. + +Version 0.6 -- May 14, 1988 -- Carson Wilson + Changed "Publ" to "Publc" and "Priv" to "Privt". Added Q + and X options, made options installable. Added test for bad + ZCPR directory & chain to error handler. + +Version 0.5 -- May 4, 1988 -- Carson Wilson + Fixed bug at CHKRO inherited from MAKE.ASM. Uses Bridger + Mitchell's FRESET to reset disks. Uses ZCPR invocation name + in signon, help, etc. Added F4 attribute. Now includes all + valid ZSDOS attributes. Help now fully "smart" under ZCPR. + Reworked VID3.Z80 and VID4.Z80 from VLIB11 and moved them + into FA.Z80 (see end of file). Put STNDOUT mode ON by + default at beginning of each attribute display sequence for + faster ZCPR displays. + +Version 0.4 -- April 27, 1988 -- Carson Wilson + Tests for matching files at other user areas before setting + the public attribit. + +Version 0.3 -- April 26, 1988 -- Carson Wilson diff --git a/Source/RomDsk/RAM_1024KB/FA16A.FOR b/Source/RomDsk/RAM_1024KB/FA16A.FOR new file mode 100644 index 00000000..e9ed3d43 --- /dev/null +++ b/Source/RomDsk/RAM_1024KB/FA16A.FOR @@ -0,0 +1,6 @@ +An update and bug-fix of FILEATTR (FA), a ZSDOS utility that +allows rapid setting, resetting, or displaying of file attributes +under ZSDOS, ZRDOS, and CP/M 2.2. Several additional features +are available under ZCPR3, including error flag setting, error +handler invocation, and an enhanced display. Version 1.6A adds +documentation; otherwise, same as 1.6. diff --git a/Source/RomDsk/RAM_1024KB/FA16CFG.TXT b/Source/RomDsk/RAM_1024KB/FA16CFG.TXT new file mode 100644 index 00000000..4067b9ba --- /dev/null +++ b/Source/RomDsk/RAM_1024KB/FA16CFG.TXT @@ -0,0 +1,39 @@ + +Option Q -- If the ZCPR quiet flag is set, FILEATTR will always default to +quiet mode. To make quiet mode the default at all times, even when running +under CP/M, set this configuration option to "Yes". Whatever is selected +here can be toggled with the command line "Q" option. + +Option X -- A "Yes" will cause FILEATTR to page screen output by default. +A "No" will default to continuous scrolling. The chosen default can be +toggled with the command line "X" option. Screen paging is always turned +off in quiet mode. + +Option R -- As distributed, FILEATTR prints nothing to the screen when it +is operating in quiet mode. If this configuration option is "Yes", the +results summary line that gives the number of matching files found and the +number of attributes changed will be printed even in quiet mode. + +Option S -- Enter the number of lines on your video display screen. Under +ZCPR 3.3 and higher, the number of screen lines for paging is obtained from +the environment descriptor. This configuration parameter is used only if +running under CP/M. + + + Attribute Configuration Options + +As distributed, FILEATTR will not change any file attribute unless +explicitly commanded to do so by a command line option. To configure +FILEATTR to turn a file attribute ON or OFF by default, toggle the +appropriate configuration selection. + +For example, to make FILEATTR set all matching files to Public by default, +change the "Public attribute" setting to "Turn On". Then FILEATTR will set +the specified files to Public unless the /NP command line option is given +(which would cause the files to be set to Private). Since there is no +command which tells FILEATTR not to change an attribute, however, the +program will now insist on turning the Public attribute either on (default) +or off (through the /NP option). + +Most users will have neither need nor desire to change the configuration +default as distributed which will "Leave As-Is" all matching files. diff --git a/Source/RomDsk/RAM_1024KB/FAT.COM b/Source/RomDsk/RAM_1024KB/FAT.COM new file mode 100644 index 00000000..688faa99 Binary files /dev/null and b/Source/RomDsk/RAM_1024KB/FAT.COM differ diff --git a/Source/RomDsk/RAM_1024KB/FDISK80.COM b/Source/RomDsk/RAM_1024KB/FDISK80.COM new file mode 100644 index 00000000..2a565dae Binary files /dev/null and b/Source/RomDsk/RAM_1024KB/FDISK80.COM differ diff --git a/Source/RomDsk/RAM_1024KB/FILEATTR.COM b/Source/RomDsk/RAM_1024KB/FILEATTR.COM new file mode 100644 index 00000000..4527d090 Binary files /dev/null and b/Source/RomDsk/RAM_1024KB/FILEATTR.COM differ diff --git a/Source/RomDsk/RAM_1024KB/FILEDATE.CFG b/Source/RomDsk/RAM_1024KB/FILEDATE.CFG new file mode 100644 index 00000000..da1ca45f Binary files /dev/null and b/Source/RomDsk/RAM_1024KB/FILEDATE.CFG differ diff --git a/Source/RomDsk/RAM_1024KB/FILEDATE.COM b/Source/RomDsk/RAM_1024KB/FILEDATE.COM new file mode 100644 index 00000000..11b83616 Binary files /dev/null and b/Source/RomDsk/RAM_1024KB/FILEDATE.COM differ diff --git a/Source/RomDsk/RAM_1024KB/FLASH.COM b/Source/RomDsk/RAM_1024KB/FLASH.COM new file mode 100644 index 00000000..ab46a910 Binary files /dev/null and b/Source/RomDsk/RAM_1024KB/FLASH.COM differ diff --git a/Source/RomDsk/RAM_1024KB/INITDIR.CFG b/Source/RomDsk/RAM_1024KB/INITDIR.CFG new file mode 100644 index 00000000..96baa986 Binary files /dev/null and b/Source/RomDsk/RAM_1024KB/INITDIR.CFG differ diff --git a/Source/RomDsk/RAM_1024KB/INITDIR.COM b/Source/RomDsk/RAM_1024KB/INITDIR.COM new file mode 100644 index 00000000..fd46387a Binary files /dev/null and b/Source/RomDsk/RAM_1024KB/INITDIR.COM differ diff --git a/Source/RomDsk/RAM_1024KB/LBREXT.COM b/Source/RomDsk/RAM_1024KB/LBREXT.COM new file mode 100644 index 00000000..c0c950e3 Binary files /dev/null and b/Source/RomDsk/RAM_1024KB/LBREXT.COM differ diff --git a/Source/RomDsk/RAM_1024KB/LDDS.COM b/Source/RomDsk/RAM_1024KB/LDDS.COM new file mode 100644 index 00000000..357f1360 Binary files /dev/null and b/Source/RomDsk/RAM_1024KB/LDDS.COM differ diff --git a/Source/RomDsk/RAM_1024KB/LDNZT.COM b/Source/RomDsk/RAM_1024KB/LDNZT.COM new file mode 100644 index 00000000..87cf0b47 Binary files /dev/null and b/Source/RomDsk/RAM_1024KB/LDNZT.COM differ diff --git a/Source/RomDsk/RAM_1024KB/LDP2D.COM b/Source/RomDsk/RAM_1024KB/LDP2D.COM new file mode 100644 index 00000000..a89e03d8 Binary files /dev/null and b/Source/RomDsk/RAM_1024KB/LDP2D.COM differ diff --git a/Source/RomDsk/RAM_1024KB/LIB.COM b/Source/RomDsk/RAM_1024KB/LIB.COM new file mode 100644 index 00000000..45d7fb21 Binary files /dev/null and b/Source/RomDsk/RAM_1024KB/LIB.COM differ diff --git a/Source/RomDsk/ROM_512KB/LINK.COM b/Source/RomDsk/RAM_1024KB/LINK.COM similarity index 100% rename from Source/RomDsk/ROM_512KB/LINK.COM rename to Source/RomDsk/RAM_1024KB/LINK.COM diff --git a/Source/RomDsk/RAM_1024KB/LOAD.COM b/Source/RomDsk/RAM_1024KB/LOAD.COM new file mode 100644 index 00000000..b9601e00 Binary files /dev/null and b/Source/RomDsk/RAM_1024KB/LOAD.COM differ diff --git a/Source/RomDsk/RAM_1024KB/MAC.COM b/Source/RomDsk/RAM_1024KB/MAC.COM new file mode 100644 index 00000000..f49e835a Binary files /dev/null and b/Source/RomDsk/RAM_1024KB/MAC.COM differ diff --git a/Source/RomDsk/RAM_1024KB/MBASIC.COM b/Source/RomDsk/RAM_1024KB/MBASIC.COM new file mode 100644 index 00000000..c9ec3cd3 Binary files /dev/null and b/Source/RomDsk/RAM_1024KB/MBASIC.COM differ diff --git a/Source/RomDsk/RAM_1024KB/NULU.COM b/Source/RomDsk/RAM_1024KB/NULU.COM new file mode 100644 index 00000000..fc5594b1 Binary files /dev/null and b/Source/RomDsk/RAM_1024KB/NULU.COM differ diff --git a/Source/RomDsk/RAM_1024KB/PIP.COM b/Source/RomDsk/RAM_1024KB/PIP.COM new file mode 100644 index 00000000..4b2ce4b6 Binary files /dev/null and b/Source/RomDsk/RAM_1024KB/PIP.COM differ diff --git a/Source/RomDsk/RAM_1024KB/PMARC.COM b/Source/RomDsk/RAM_1024KB/PMARC.COM new file mode 100644 index 00000000..59bd3ef3 Binary files /dev/null and b/Source/RomDsk/RAM_1024KB/PMARC.COM differ diff --git a/Source/RomDsk/RAM_1024KB/PMEXT.COM b/Source/RomDsk/RAM_1024KB/PMEXT.COM new file mode 100644 index 00000000..d3a51ca3 Binary files /dev/null and b/Source/RomDsk/RAM_1024KB/PMEXT.COM differ diff --git a/Source/RomDsk/RAM_1024KB/PUTBG.COM b/Source/RomDsk/RAM_1024KB/PUTBG.COM new file mode 100644 index 00000000..970e2d8a Binary files /dev/null and b/Source/RomDsk/RAM_1024KB/PUTBG.COM differ diff --git a/Source/RomDsk/RAM_1024KB/PUTDS.COM b/Source/RomDsk/RAM_1024KB/PUTDS.COM new file mode 100644 index 00000000..c0ceba64 Binary files /dev/null and b/Source/RomDsk/RAM_1024KB/PUTDS.COM differ diff --git a/Source/RomDsk/RAM_1024KB/RELOG.COM b/Source/RomDsk/RAM_1024KB/RELOG.COM new file mode 100644 index 00000000..13ffc62e Binary files /dev/null and b/Source/RomDsk/RAM_1024KB/RELOG.COM differ diff --git a/Source/RomDsk/ROM_512KB/RMAC.COM b/Source/RomDsk/RAM_1024KB/RMAC.COM similarity index 100% rename from Source/RomDsk/ROM_512KB/RMAC.COM rename to Source/RomDsk/RAM_1024KB/RMAC.COM diff --git a/Source/RomDsk/RAM_1024KB/RMXSUB1.COM b/Source/RomDsk/RAM_1024KB/RMXSUB1.COM new file mode 100644 index 00000000..34078336 Binary files /dev/null and b/Source/RomDsk/RAM_1024KB/RMXSUB1.COM differ diff --git a/Source/RomDsk/RAM_1024KB/SETTERM.COM b/Source/RomDsk/RAM_1024KB/SETTERM.COM new file mode 100644 index 00000000..eca19bf9 Binary files /dev/null and b/Source/RomDsk/RAM_1024KB/SETTERM.COM differ diff --git a/Source/RomDsk/RAM_1024KB/SETUPZST.COM b/Source/RomDsk/RAM_1024KB/SETUPZST.COM new file mode 100644 index 00000000..35e4b589 Binary files /dev/null and b/Source/RomDsk/RAM_1024KB/SETUPZST.COM differ diff --git a/Source/RomDsk/RAM_1024KB/STAMPS.DAT b/Source/RomDsk/RAM_1024KB/STAMPS.DAT new file mode 100644 index 00000000..a312ae58 Binary files /dev/null and b/Source/RomDsk/RAM_1024KB/STAMPS.DAT differ diff --git a/Source/RomDsk/RAM_1024KB/STAT.COM b/Source/RomDsk/RAM_1024KB/STAT.COM new file mode 100644 index 00000000..1de359f2 Binary files /dev/null and b/Source/RomDsk/RAM_1024KB/STAT.COM differ diff --git a/Source/RomDsk/RAM_1024KB/SUBMIT.COM b/Source/RomDsk/RAM_1024KB/SUBMIT.COM new file mode 100644 index 00000000..f651bfee Binary files /dev/null and b/Source/RomDsk/RAM_1024KB/SUBMIT.COM differ diff --git a/Source/RomDsk/RAM_1024KB/SUPERSUB.COM b/Source/RomDsk/RAM_1024KB/SUPERSUB.COM new file mode 100644 index 00000000..77403973 Binary files /dev/null and b/Source/RomDsk/RAM_1024KB/SUPERSUB.COM differ diff --git a/Source/RomDsk/RAM_1024KB/TD.CFG b/Source/RomDsk/RAM_1024KB/TD.CFG new file mode 100644 index 00000000..ab44bab9 Binary files /dev/null and b/Source/RomDsk/RAM_1024KB/TD.CFG differ diff --git a/Source/RomDsk/RAM_1024KB/TD.COM b/Source/RomDsk/RAM_1024KB/TD.COM new file mode 100644 index 00000000..552aba67 Binary files /dev/null and b/Source/RomDsk/RAM_1024KB/TD.COM differ diff --git a/Source/RomDsk/RAM_1024KB/TERMBASE.DAT b/Source/RomDsk/RAM_1024KB/TERMBASE.DAT new file mode 100644 index 00000000..358d61c0 Binary files /dev/null and b/Source/RomDsk/RAM_1024KB/TERMBASE.DAT differ diff --git a/Source/RomDsk/RAM_1024KB/TESTCLOK.COM b/Source/RomDsk/RAM_1024KB/TESTCLOK.COM new file mode 100644 index 00000000..d547e2b8 Binary files /dev/null and b/Source/RomDsk/RAM_1024KB/TESTCLOK.COM differ diff --git a/Source/RomDsk/RAM_1024KB/UNARC.COM b/Source/RomDsk/RAM_1024KB/UNARC.COM new file mode 100644 index 00000000..27ee7afa Binary files /dev/null and b/Source/RomDsk/RAM_1024KB/UNARC.COM differ diff --git a/Source/RomDsk/RAM_1024KB/UNCR.COM b/Source/RomDsk/RAM_1024KB/UNCR.COM new file mode 100644 index 00000000..42385ddd Binary files /dev/null and b/Source/RomDsk/RAM_1024KB/UNCR.COM differ diff --git a/Source/RomDsk/RAM_1024KB/UNUARCU10.CFG b/Source/RomDsk/RAM_1024KB/UNUARCU10.CFG new file mode 100644 index 00000000..8de29a59 Binary files /dev/null and b/Source/RomDsk/RAM_1024KB/UNUARCU10.CFG differ diff --git a/Source/RomDsk/RAM_1024KB/UNZIP.COM b/Source/RomDsk/RAM_1024KB/UNZIP.COM new file mode 100644 index 00000000..9da369ff Binary files /dev/null and b/Source/RomDsk/RAM_1024KB/UNZIP.COM differ diff --git a/Source/RomDsk/RAM_1024KB/XSUB.COM b/Source/RomDsk/RAM_1024KB/XSUB.COM new file mode 100644 index 00000000..15e86abf Binary files /dev/null and b/Source/RomDsk/RAM_1024KB/XSUB.COM differ diff --git a/Source/RomDsk/RAM_1024KB/XSUB1.COM b/Source/RomDsk/RAM_1024KB/XSUB1.COM new file mode 100644 index 00000000..c30996a4 Binary files /dev/null and b/Source/RomDsk/RAM_1024KB/XSUB1.COM differ diff --git a/Source/RomDsk/RAM_1024KB/ZAP.COM b/Source/RomDsk/RAM_1024KB/ZAP.COM new file mode 100644 index 00000000..be4dbf38 Binary files /dev/null and b/Source/RomDsk/RAM_1024KB/ZAP.COM differ diff --git a/Source/RomDsk/RAM_1024KB/ZCAL.COM b/Source/RomDsk/RAM_1024KB/ZCAL.COM new file mode 100644 index 00000000..f239e952 Binary files /dev/null and b/Source/RomDsk/RAM_1024KB/ZCAL.COM differ diff --git a/Source/RomDsk/RAM_1024KB/ZCNFG.COM b/Source/RomDsk/RAM_1024KB/ZCNFG.COM new file mode 100644 index 00000000..ae423dc5 Binary files /dev/null and b/Source/RomDsk/RAM_1024KB/ZCNFG.COM differ diff --git a/Source/RomDsk/RAM_1024KB/ZCNFG24.CFG b/Source/RomDsk/RAM_1024KB/ZCNFG24.CFG new file mode 100644 index 00000000..1bfe49bf Binary files /dev/null and b/Source/RomDsk/RAM_1024KB/ZCNFG24.CFG differ diff --git a/Source/RomDsk/RAM_1024KB/ZDE.COM b/Source/RomDsk/RAM_1024KB/ZDE.COM new file mode 100644 index 00000000..b80559be Binary files /dev/null and b/Source/RomDsk/RAM_1024KB/ZDE.COM differ diff --git a/Source/RomDsk/RAM_1024KB/ZPATH.COM b/Source/RomDsk/RAM_1024KB/ZPATH.COM new file mode 100644 index 00000000..5c0aa503 Binary files /dev/null and b/Source/RomDsk/RAM_1024KB/ZPATH.COM differ diff --git a/Source/RomDsk/RAM_1024KB/ZSCONFIG.COM b/Source/RomDsk/RAM_1024KB/ZSCONFIG.COM new file mode 100644 index 00000000..2cc26074 Binary files /dev/null and b/Source/RomDsk/RAM_1024KB/ZSCONFIG.COM differ diff --git a/Source/RomDsk/RAM_1024KB/ZSID.COM b/Source/RomDsk/RAM_1024KB/ZSID.COM new file mode 100644 index 00000000..686b3775 Binary files /dev/null and b/Source/RomDsk/RAM_1024KB/ZSID.COM differ diff --git a/Source/RomDsk/RAM_1024KB/ZXD.CFG b/Source/RomDsk/RAM_1024KB/ZXD.CFG new file mode 100644 index 00000000..f202ae59 Binary files /dev/null and b/Source/RomDsk/RAM_1024KB/ZXD.CFG differ diff --git a/Source/RomDsk/RAM_1024KB/ZXD.COM b/Source/RomDsk/RAM_1024KB/ZXD.COM new file mode 100644 index 00000000..20395673 Binary files /dev/null and b/Source/RomDsk/RAM_1024KB/ZXD.COM differ diff --git a/Source/RomDsk/RAM_512KB/ASM.COM b/Source/RomDsk/RAM_512KB/ASM.COM new file mode 100644 index 00000000..a63e5aec Binary files /dev/null and b/Source/RomDsk/RAM_512KB/ASM.COM differ diff --git a/Source/RomDsk/RAM_512KB/CLRDIR.COM b/Source/RomDsk/RAM_512KB/CLRDIR.COM new file mode 100644 index 00000000..9c00904f Binary files /dev/null and b/Source/RomDsk/RAM_512KB/CLRDIR.COM differ diff --git a/Source/RomDsk/RAM_512KB/COMPARE.COM b/Source/RomDsk/RAM_512KB/COMPARE.COM new file mode 100644 index 00000000..29fa41e6 Binary files /dev/null and b/Source/RomDsk/RAM_512KB/COMPARE.COM differ diff --git a/Source/RomDsk/RAM_512KB/COPY.COM b/Source/RomDsk/RAM_512KB/COPY.COM new file mode 100644 index 00000000..606c81a5 Binary files /dev/null and b/Source/RomDsk/RAM_512KB/COPY.COM differ diff --git a/Source/RomDsk/RAM_512KB/DDT.COM b/Source/RomDsk/RAM_512KB/DDT.COM new file mode 100644 index 00000000..70e4ebfe Binary files /dev/null and b/Source/RomDsk/RAM_512KB/DDT.COM differ diff --git a/Source/RomDsk/RAM_512KB/DDTZ.COM b/Source/RomDsk/RAM_512KB/DDTZ.COM new file mode 100644 index 00000000..4f6eca6b Binary files /dev/null and b/Source/RomDsk/RAM_512KB/DDTZ.COM differ diff --git a/Source/RomDsk/RAM_512KB/DUMP.COM b/Source/RomDsk/RAM_512KB/DUMP.COM new file mode 100644 index 00000000..03a77c3c Binary files /dev/null and b/Source/RomDsk/RAM_512KB/DUMP.COM differ diff --git a/Source/RomDsk/RAM_512KB/ED.COM b/Source/RomDsk/RAM_512KB/ED.COM new file mode 100644 index 00000000..a0f0f541 Binary files /dev/null and b/Source/RomDsk/RAM_512KB/ED.COM differ diff --git a/Source/RomDsk/RAM_512KB/FILEATTR.COM b/Source/RomDsk/RAM_512KB/FILEATTR.COM new file mode 100644 index 00000000..4527d090 Binary files /dev/null and b/Source/RomDsk/RAM_512KB/FILEATTR.COM differ diff --git a/Source/RomDsk/RAM_512KB/FILEDATE.COM b/Source/RomDsk/RAM_512KB/FILEDATE.COM new file mode 100644 index 00000000..11b83616 Binary files /dev/null and b/Source/RomDsk/RAM_512KB/FILEDATE.COM differ diff --git a/Source/RomDsk/RAM_512KB/FLASH.COM b/Source/RomDsk/RAM_512KB/FLASH.COM new file mode 100644 index 00000000..ab46a910 Binary files /dev/null and b/Source/RomDsk/RAM_512KB/FLASH.COM differ diff --git a/Source/RomDsk/RAM_512KB/LOAD.COM b/Source/RomDsk/RAM_512KB/LOAD.COM new file mode 100644 index 00000000..b9601e00 Binary files /dev/null and b/Source/RomDsk/RAM_512KB/LOAD.COM differ diff --git a/Source/RomDsk/RAM_512KB/MBASIC.COM b/Source/RomDsk/RAM_512KB/MBASIC.COM new file mode 100644 index 00000000..c9ec3cd3 Binary files /dev/null and b/Source/RomDsk/RAM_512KB/MBASIC.COM differ diff --git a/Source/RomDsk/RAM_512KB/PIP.COM b/Source/RomDsk/RAM_512KB/PIP.COM new file mode 100644 index 00000000..4b2ce4b6 Binary files /dev/null and b/Source/RomDsk/RAM_512KB/PIP.COM differ diff --git a/Source/RomDsk/RAM_512KB/RELOG.COM b/Source/RomDsk/RAM_512KB/RELOG.COM new file mode 100644 index 00000000..13ffc62e Binary files /dev/null and b/Source/RomDsk/RAM_512KB/RELOG.COM differ diff --git a/Source/RomDsk/RAM_512KB/STAT.COM b/Source/RomDsk/RAM_512KB/STAT.COM new file mode 100644 index 00000000..1de359f2 Binary files /dev/null and b/Source/RomDsk/RAM_512KB/STAT.COM differ diff --git a/Source/RomDsk/RAM_512KB/SUBMIT.COM b/Source/RomDsk/RAM_512KB/SUBMIT.COM new file mode 100644 index 00000000..f651bfee Binary files /dev/null and b/Source/RomDsk/RAM_512KB/SUBMIT.COM differ diff --git a/Source/RomDsk/RAM_512KB/SUPERSUB.COM b/Source/RomDsk/RAM_512KB/SUPERSUB.COM new file mode 100644 index 00000000..77403973 Binary files /dev/null and b/Source/RomDsk/RAM_512KB/SUPERSUB.COM differ diff --git a/Source/RomDsk/RAM_512KB/TD.COM b/Source/RomDsk/RAM_512KB/TD.COM new file mode 100644 index 00000000..552aba67 Binary files /dev/null and b/Source/RomDsk/RAM_512KB/TD.COM differ diff --git a/Source/RomDsk/RAM_512KB/XSUB.COM b/Source/RomDsk/RAM_512KB/XSUB.COM new file mode 100644 index 00000000..15e86abf Binary files /dev/null and b/Source/RomDsk/RAM_512KB/XSUB.COM differ diff --git a/Source/RomDsk/RAM_512KB/ZDE.COM b/Source/RomDsk/RAM_512KB/ZDE.COM new file mode 100644 index 00000000..b80559be Binary files /dev/null and b/Source/RomDsk/RAM_512KB/ZDE.COM differ diff --git a/Source/RomDsk/RAM_512KB/ZPATH.COM b/Source/RomDsk/RAM_512KB/ZPATH.COM new file mode 100644 index 00000000..5c0aa503 Binary files /dev/null and b/Source/RomDsk/RAM_512KB/ZPATH.COM differ diff --git a/Source/RomDsk/RAM_512KB/ZSCONFIG.COM b/Source/RomDsk/RAM_512KB/ZSCONFIG.COM new file mode 100644 index 00000000..2cc26074 Binary files /dev/null and b/Source/RomDsk/RAM_512KB/ZSCONFIG.COM differ diff --git a/Source/RomDsk/RAM_512KB/ZXD.COM b/Source/RomDsk/RAM_512KB/ZXD.COM new file mode 100644 index 00000000..20395673 Binary files /dev/null and b/Source/RomDsk/RAM_512KB/ZXD.COM differ diff --git a/Source/RomDsk/ROM_1024KB/CLRDIR.COM b/Source/RomDsk/ROM_1024KB/CLRDIR.COM index ca65cbed..9c00904f 100644 Binary files a/Source/RomDsk/ROM_1024KB/CLRDIR.COM and b/Source/RomDsk/ROM_1024KB/CLRDIR.COM differ diff --git a/Source/RomDsk/ROM_1024KB/FDISK80.COM b/Source/RomDsk/ROM_1024KB/FDISK80.COM index 7e862d67..2a565dae 100644 Binary files a/Source/RomDsk/ROM_1024KB/FDISK80.COM and b/Source/RomDsk/ROM_1024KB/FDISK80.COM differ diff --git a/Source/RomDsk/ROM_1024KB/FLASH.COM b/Source/RomDsk/ROM_1024KB/FLASH.COM index d1833a1b..ab46a910 100644 Binary files a/Source/RomDsk/ROM_1024KB/FLASH.COM and b/Source/RomDsk/ROM_1024KB/FLASH.COM differ diff --git a/Source/RomDsk/ROM_1024KB/SUPERSUB.COM b/Source/RomDsk/ROM_1024KB/SUPERSUB.COM index a25d60a6..77403973 100644 Binary files a/Source/RomDsk/ROM_1024KB/SUPERSUB.COM and b/Source/RomDsk/ROM_1024KB/SUPERSUB.COM differ diff --git a/Source/RomDsk/ROM_1024KB/UNARC.COM b/Source/RomDsk/ROM_1024KB/UNARC.COM index 8cc90746..27ee7afa 100644 Binary files a/Source/RomDsk/ROM_1024KB/UNARC.COM and b/Source/RomDsk/ROM_1024KB/UNARC.COM differ diff --git a/Source/RomDsk/ROM_1024KB/UNUARCU10.CFG b/Source/RomDsk/ROM_1024KB/UNUARCU10.CFG new file mode 100644 index 00000000..8de29a59 Binary files /dev/null and b/Source/RomDsk/ROM_1024KB/UNUARCU10.CFG differ diff --git a/Source/RomDsk/ROM_256KB/CLRDIR.COM b/Source/RomDsk/ROM_256KB/CLRDIR.COM index ca65cbed..9c00904f 100644 Binary files a/Source/RomDsk/ROM_256KB/CLRDIR.COM and b/Source/RomDsk/ROM_256KB/CLRDIR.COM differ diff --git a/Source/RomDsk/ROM_512KB/CLRDIR.COM b/Source/RomDsk/ROM_512KB/CLRDIR.COM index ca65cbed..9c00904f 100644 Binary files a/Source/RomDsk/ROM_512KB/CLRDIR.COM and b/Source/RomDsk/ROM_512KB/CLRDIR.COM differ diff --git a/Source/RomDsk/ROM_512KB/FAT.COM b/Source/RomDsk/ROM_512KB/FAT.COM new file mode 100644 index 00000000..688faa99 Binary files /dev/null and b/Source/RomDsk/ROM_512KB/FAT.COM differ diff --git a/Source/RomDsk/ROM_512KB/FDISK80.COM b/Source/RomDsk/ROM_512KB/FDISK80.COM index 7e862d67..2a565dae 100644 Binary files a/Source/RomDsk/ROM_512KB/FDISK80.COM and b/Source/RomDsk/ROM_512KB/FDISK80.COM differ diff --git a/Source/RomDsk/ROM_512KB/FLASH.COM b/Source/RomDsk/ROM_512KB/FLASH.COM index d1833a1b..ab46a910 100644 Binary files a/Source/RomDsk/ROM_512KB/FLASH.COM and b/Source/RomDsk/ROM_512KB/FLASH.COM differ diff --git a/Source/RomDsk/ROM_512KB/SUPERSUB.COM b/Source/RomDsk/ROM_512KB/SUPERSUB.COM index a25d60a6..77403973 100644 Binary files a/Source/RomDsk/ROM_512KB/SUPERSUB.COM and b/Source/RomDsk/ROM_512KB/SUPERSUB.COM differ diff --git a/Source/RomDsk/ROM_512KB/UNARC.COM b/Source/RomDsk/ROM_512KB/UNARC.COM index 8cc90746..27ee7afa 100644 Binary files a/Source/RomDsk/ROM_512KB/UNARC.COM and b/Source/RomDsk/ROM_512KB/UNARC.COM differ diff --git a/Source/RomDsk/ReadMe.txt b/Source/RomDsk/ReadMe.txt index 05f0f22d..5fe0d7ed 100644 --- a/Source/RomDsk/ReadMe.txt +++ b/Source/RomDsk/ReadMe.txt @@ -12,7 +12,7 @@ Disk when a ROM is built. When constructing the ROM disk as part of a build, the build process first grabs all of the "standard" files for the size of ROM being built. So, if you are building a normal 512KB ROM, all of the files -in 512KB directory will be pulled in. +in ROM_512KB directory will be pulled in. You may freely add/delete/update the files in these directories to change the contents of the ROM Disk of your ROM firmware. @@ -26,3 +26,17 @@ BuildROM script: The resulting ROM Disk is still OK to use, but will not contain the file(s) that did not fit. + +RomWBW also supports the concept of a "ROMless" system in which an +external bootstrap pre-loads the RAM. The RAM_xxxKB directories +contain the files to be used for such systems. Note the size of the +RAM disk on a 512KB ROMless system is not the same as the RAM disk +on a normal system. This is due to different bank layout and overhead. + +System ROM Disk Image RAM Disk Image +------ -------------- -------------- +128KB n/a n/a +256KB 128KB ROM Disk n/a +512KB 384KB ROM Disk 256KB RAM Disk +1024KB 896KB ROM Disk 768KB RAM Disk ??? +2048KB n/a 1792KB RAM Disk ??? \ No newline at end of file diff --git a/Source/RomDsk/diskdefs b/Source/RomDsk/diskdefs index 81d962cc..f29deca1 100644 --- a/Source/RomDsk/diskdefs +++ b/Source/RomDsk/diskdefs @@ -310,6 +310,32 @@ diskdef wbw_rom1024 os 2.2 end +# RomWBW 512KB RAM (256KB reserved, 256KB RAM Disk) + +diskdef wbw_ram512 + seclen 512 + tracks 8 + sectrk 64 + blocksize 2048 + maxdir 256 + skew 0 + boottrk 0 + os 2.2 +end + +# RomWBW 1024KB RAM (256KB reserved, 768KB RAM Disk) + +diskdef wbw_ram1024 + seclen 512 + tracks 24 + sectrk 64 + blocksize 2048 + maxdir 256 + skew 0 + boottrk 0 + os 2.2 +end + # RomWBW 720K floppy media diskdef wbw_fd720 diff --git a/Source/Z1RCC/Bank Layout.txt b/Source/Z1RCC/Bank Layout.txt new file mode 100644 index 00000000..908a3338 --- /dev/null +++ b/Source/Z1RCC/Bank Layout.txt @@ -0,0 +1,20 @@ +Z1RCC has no real ROM. It has a single 512K RAM chip. The RomWBW +ROMless startup mode is used. + +The ROMless startup mode treats the entire 512KB as RAM. The entire +512KB of RAM (less the top 32KB) must be preloaded by the Z1RCC CF +Loader. There will be no ROM disk available under RomWBW. There will +be a RAM Disk and it's initial contents will be seeded by the image +loaded by the CF Loader. + +Bank Contents Description +-------- -------- ----------- +0x0 BIOS HBIOS Bank (operating) +0x1 IMG0 ROM Loader, Monitor, ROM OSes +0x2 IMG1 ROM Applications +0x3 IMG2 Reserved +0x4-0xB RAMD RAM Disk Banks +0xC BUF OS Buffers (CP/M3) +0xD AUX Aux Bank (CP/M 3, BPBIOS, etc.) +0xE USR User Bank (CP/M TPA, etc.) +0xF COM Common Bank, Upper 32KB diff --git a/Source/Z1RCC/Build.cmd b/Source/Z1RCC/Build.cmd new file mode 100644 index 00000000..e7ab0eea --- /dev/null +++ b/Source/Z1RCC/Build.cmd @@ -0,0 +1,23 @@ +@echo off +setlocal + +set TOOLS=../../Tools + +set PATH=%TOOLS%\srecord;%PATH% + +if exist ..\..\Binary\RCZ180_z1rcc.rom call :build_z1rcc + +goto :eof + +:build_z1rcc + +srec_cat -generate 0x0 0x100000 --constant 0x00 -o temp.dat -binary +srec_cat temp.dat -binary -exclude 0x0 0x200 z1rcc_cfldr.bin -binary -o temp.dat -binary +srec_cat temp.dat -binary -exclude 0x1B8 0x200 z1rcc_ptbl.bin -binary -offset 0x1B8 -o temp.dat -binary +srec_cat temp.dat -binary -exclude 0x1F000 0x20000 z1rcc_mon.bin -binary -offset 0x1F000 -o temp.dat -binary +srec_cat temp.dat -binary -exclude 0x24000 0xA4000 ..\..\Binary\RCZ180_z1rcc.rom -binary -offset 0x24000 -o temp.dat -binary +move temp.dat ..\..\Binary\hd1k_z1rcc_prefix.dat + +copy /b ..\..\Binary\hd1k_z1rcc_prefix.dat + ..\..\Binary\hd1k_cpm22.img + ..\..\Binary\hd1k_zsdos.img + ..\..\Binary\hd1k_nzcom.img + ..\..\Binary\hd1k_cpm3.img + ..\..\Binary\hd1k_zpm3.img + ..\..\Binary\hd1k_ws4.img ..\..\Binary\hd1k_z1rcc_combo.img || exit /b + +goto :eof diff --git a/Source/ZZRC/Clean.cmd b/Source/Z1RCC/Clean.cmd similarity index 100% rename from Source/ZZRC/Clean.cmd rename to Source/Z1RCC/Clean.cmd diff --git a/Source/Z1RCC/Makefile b/Source/Z1RCC/Makefile new file mode 100644 index 00000000..6890e0d7 --- /dev/null +++ b/Source/Z1RCC/Makefile @@ -0,0 +1,30 @@ +HD1KZ1RCCPREFIX = hd1k_z1rcc_prefix.dat +HD1KZ1RCCCOMBOIMG = hd1k_z1rcc_combo.img +Z1RCCROM = ../../Binary/RCZ180_z1rcc.rom +HD1KIMGS = ../../Binary/hd1k_cpm22.img ../../Binary/hd1k_zsdos.img ../../Binary/hd1k_nzcom.img \ + ../../Binary/hd1k_cpm3.img ../../Binary/hd1k_zpm3.img ../../Binary/hd1k_ws4.img + +OBJECTS := + +ifneq ($(wildcard $(Z1RCCROM)),) + OBJECTS += $(HD1KZ1RCCPREFIX) $(HD1KZ1RCCCOMBOIMG) +endif + +DEST=../../Binary + +TOOLS = ../../Tools + +include $(TOOLS)/Makefile.inc + +DIFFPATH = $(DIFFTO)/Binary + +$(HD1KZ1RCCPREFIX): + srec_cat -generate 0x0 0x100000 --constant 0x00 -o temp.dat -binary + srec_cat temp.dat -binary -exclude 0x0 0x200 z1rcc_cfldr.bin -binary -o temp.dat -binary + srec_cat temp.dat -binary -exclude 0x1B8 0x200 z1rcc_ptbl.bin -binary -offset 0x1B8 -o temp.dat -binary + srec_cat temp.dat -binary -exclude 0x1F000 0x20000 z1rcc_mon.bin -binary -offset 0x1F000 -o temp.dat -binary + srec_cat temp.dat -binary -exclude 0x24000 0xA4000 $(Z1RCCROM) -binary -offset 0x24000 -o temp.dat -binary + mv temp.dat $@ + +$(HD1KZ1RCCCOMBOIMG): $(HD1KZ1RCCPREFIX) $(HD1KIMGS) + cat $^ > $@ diff --git a/Source/Z1RCC/Z1RCC Disk Layout.txt b/Source/Z1RCC/Z1RCC Disk Layout.txt new file mode 100644 index 00000000..f9f21454 --- /dev/null +++ b/Source/Z1RCC/Z1RCC Disk Layout.txt @@ -0,0 +1,24 @@ +Z1RCC Disk Prefix Layout +====================== + +---- Bytes ---- --- Sectors --- +Start Length Start Length Description +------- ------- ------- ------- --------------------------- +0x00000 0x001BE 0 1 CF Boot Loader +0x001B8 0x00048 RomWBW Partition Table +0x00200 0x1EE00 1 247 Unused +0x1F000 0x01000 248 8 Z1RCC Monitor v0.2a +0x20000 0x04000 256 32 Unused +0x24000 0x80000 288 1024 RomWBW +0xA4000 0x5C000 1312 736 Unused +0x100000 2048 Start of slices (partition 0x1E) + +Notes +----- + +- At startup CPLD ROM is mapped to Z80 CPU address space 0x0000-0x003F, CPU begins execution at 0x0000 +- CPLD ROM (CF bootstrap mode) reads CF Boot Loader (512B) from start of CF (MBR) to 0xA000 and runs it +- CF Boot Loader reads Z1RCC Monitor (4KB) from sectors 0xF8-0xFF of CF to 0xB000 and runs from 0xB400 +- Z1RCC Monitor reads 480KB (RomWBW) from sectors 0x120-0x4DF of CF into 480KB of physical RAM + + diff --git a/Source/Z1RCC/z1rcc_cfldr.bin b/Source/Z1RCC/z1rcc_cfldr.bin new file mode 100644 index 00000000..134fc2a5 Binary files /dev/null and b/Source/Z1RCC/z1rcc_cfldr.bin differ diff --git a/Source/Z1RCC/z1rcc_mon.bin b/Source/Z1RCC/z1rcc_mon.bin new file mode 100644 index 00000000..9a4bc6c2 Binary files /dev/null and b/Source/Z1RCC/z1rcc_mon.bin differ diff --git a/Source/Z1RCC/z1rcc_ptbl.bin b/Source/Z1RCC/z1rcc_ptbl.bin new file mode 100644 index 00000000..5e9fc41d Binary files /dev/null and b/Source/Z1RCC/z1rcc_ptbl.bin differ diff --git a/Source/ZRC/Bank Layout.txt b/Source/ZRC/Bank Layout.txt new file mode 100644 index 00000000..9cf30528 --- /dev/null +++ b/Source/ZRC/Bank Layout.txt @@ -0,0 +1,41 @@ +ZRC has no real ROM. It has a single 2048K RAM chip. There +are two startup modes supported by RomWBW. + +The normal startup mode treats the first 512KB like ROM and the +remaining 1536KB as RAM. The first 512KB (pseudo-ROM) must be preloaded +by the ZRC CF Loader. This mode simulates a normal ROM-based RomWBW +startup. + +Bank Contents Description +---- -------- ----------- +0x0 BOOT Boot Bank (HBIOS image) + +0x1 IMG0 ROM Loader, Monitor, ROM OSes | +0x2 IMG1 ROM Applications | Pseudo-ROM +0x3 IMG2 Reserved | +0x4-0xF ROMD ROM Disk Banks + +0x10 BIOS HBIOS Bank (operating) +0x11-0x3B RAMD RAM Disk Banks +0x3C BUF OS Buffers (CP/M3) +0x3D AUX Aux Bank (CP/M 3, BPBIOS, etc.) +0x3E USR User Bank (CP/M TPA, etc.) +0x3F COM Common Bank, Upper 32KB + +The ROMless startup mode treats the entire 2048KB as RAM. However, in +this mode, only the first 512KB of RAM is utilized. This is because +the RAM Disk is seeded by the CF Loader which is currently constrained +to loading 512KB. The entire 512KB of RAM (less the top 32KB) must be +preloaded by the ZRC CF Loader. There will be no ROM disk available +under RomWBW. There will be a RAM Disk and it's initial contents will +be seeded by the image loaded by the CF Loader. + +Bank Contents Description +-------- -------- ----------- +0x0 BIOS HBIOS Bank (operating) +0x1 IMG0 ROM Loader, Monitor, ROM OSes +0x2 IMG1 ROM Applications +0x3 IMG2 Reserved +0x4-0xB RAMD RAM Disk Banks +0xC BUF OS Buffers (CP/M3) +0xD AUX Aux Bank (CP/M 3, BPBIOS, etc.) +0xE USR User Bank (CP/M TPA, etc.) +0xF COM Common Bank, Upper 32KB diff --git a/Source/ZRC/Build.cmd b/Source/ZRC/Build.cmd index 3cef14a5..181db8ab 100644 --- a/Source/ZRC/Build.cmd +++ b/Source/ZRC/Build.cmd @@ -14,8 +14,8 @@ goto :eof :build_zrc srec_cat -generate 0x0 0x100000 --constant 0x00 -o temp.dat -binary -srec_cat temp.dat -binary -exclude 0x0 0x100 zrc_cfldr.bin -binary -o temp.dat -binary -srec_cat temp.dat -binary -exclude 0x100 0x200 zrc_ptbl.bin -binary -offset 0x100 -o temp.dat -binary +srec_cat temp.dat -binary -exclude 0x0 0x200 zrc_cfldr.bin -binary -o temp.dat -binary +srec_cat temp.dat -binary -exclude 0x1B8 0x200 zrc_ptbl.bin -binary -offset 0x1B8 -o temp.dat -binary srec_cat temp.dat -binary -exclude 0x1F000 0x20000 zrc_mon.bin -binary -offset 0x1F000 -o temp.dat -binary srec_cat temp.dat -binary -exclude 0x24000 0xA4000 ..\..\Binary\RCZ80_zrc.rom -binary -offset 0x24000 -o temp.dat -binary move temp.dat ..\..\Binary\hd1k_zrc_prefix.dat @@ -27,8 +27,8 @@ goto :eof :build_zrc_ram srec_cat -generate 0x0 0x100000 --constant 0x00 -o temp.dat -binary -srec_cat temp.dat -binary -exclude 0x0 0x100 zrc_cfldr.bin -binary -o temp.dat -binary -srec_cat temp.dat -binary -exclude 0x100 0x200 zrc_ptbl.bin -binary -offset 0x100 -o temp.dat -binary +srec_cat temp.dat -binary -exclude 0x0 0x200 zrc_cfldr.bin -binary -o temp.dat -binary +srec_cat temp.dat -binary -exclude 0x1B8 0x200 zrc_ptbl.bin -binary -offset 0x1B8 -o temp.dat -binary srec_cat temp.dat -binary -exclude 0x1F000 0x20000 zrc_mon.bin -binary -offset 0x1F000 -o temp.dat -binary srec_cat temp.dat -binary -exclude 0x24000 0xA4000 ..\..\Binary\RCZ80_zrc_ram.rom -binary -offset 0x24000 -o temp.dat -binary move temp.dat ..\..\Binary\hd1k_zrc_ram_prefix.dat diff --git a/Source/ZRC/Makefile b/Source/ZRC/Makefile index 092d011c..72ebba4f 100644 --- a/Source/ZRC/Makefile +++ b/Source/ZRC/Makefile @@ -27,16 +27,16 @@ DIFFPATH = $(DIFFTO)/Binary $(HD1KZRCPREFIX): srec_cat -generate 0x0 0x100000 --constant 0x00 -o temp.dat -binary - srec_cat temp.dat -binary -exclude 0x0 0x100 zrc_cfldr.bin -binary -o temp.dat -binary - srec_cat temp.dat -binary -exclude 0x100 0x200 zrc_ptbl.bin -binary -offset 0x100 -o temp.dat -binary + srec_cat temp.dat -binary -exclude 0x0 0x200 zrc_cfldr.bin -binary -o temp.dat -binary + srec_cat temp.dat -binary -exclude 0x1B8 0x200 zrc_ptbl.bin -binary -offset 0x1B8 -o temp.dat -binary srec_cat temp.dat -binary -exclude 0x1F000 0x20000 zrc_mon.bin -binary -offset 0x1F000 -o temp.dat -binary srec_cat temp.dat -binary -exclude 0x24000 0xA4000 $(ZRCROM) -binary -offset 0x24000 -o temp.dat -binary mv temp.dat $@ $(HD1KZRCRAMPREFIX): srec_cat -generate 0x0 0x100000 --constant 0x00 -o temp.dat -binary - srec_cat temp.dat -binary -exclude 0x0 0x100 zrc_cfldr.bin -binary -o temp.dat -binary - srec_cat temp.dat -binary -exclude 0x100 0x200 zrc_ptbl.bin -binary -offset 0x100 -o temp.dat -binary + srec_cat temp.dat -binary -exclude 0x0 0x200 zrc_cfldr.bin -binary -o temp.dat -binary + srec_cat temp.dat -binary -exclude 0x1B8 0x200 zrc_ptbl.bin -binary -offset 0x1B8 -o temp.dat -binary srec_cat temp.dat -binary -exclude 0x1F000 0x20000 zrc_mon.bin -binary -offset 0x1F000 -o temp.dat -binary srec_cat temp.dat -binary -exclude 0x24000 0xA4000 $(ZRCRAMROM) -binary -offset 0x24000 -o temp.dat -binary mv temp.dat $@ diff --git a/Source/ZRC/ZRC Disk Layout.txt b/Source/ZRC/ZRC Disk Layout.txt index d8a6e027..6159704c 100644 --- a/Source/ZRC/ZRC Disk Layout.txt +++ b/Source/ZRC/ZRC Disk Layout.txt @@ -1,24 +1,25 @@ -CF Boot Loader: Sector 0 (bytes 0-255) -RomWBW Partition Table: Sector 0 (bytes 256-511) -ZRC Monitor: Sectors 0xF8-0xFF (bytes 0x1F000-0x1FFFF) -RomWBW: Sectors 0x120-0x51F (bytes 0x24000-0xA3FFF) -Start of Slices (0x1E partition): Sector 0x800 (byte 0x100000) +ZRC Disk Prefix Layout +====================== -Start Length Description -------- ------- --------------------------- -0x00000 0x00100 CF Boot Loader -0x00100 0x00100 RomWBW Partition Table -0x00200 0x1EE00 Filler -0x1F000 0x01000 ZRC Monitor -0x20000 0x04000 Filler -0x24000 0x80000 RomWBW -0xA4000 0x5C000 Filler -0x100000: Start of slices (partition 0x1E) +---- Bytes ---- --- Sectors --- +Start Length Start Length Description +------- ------- ------- ------- --------------------------- +0x00000 0x001BE 0 1 CF Boot Loader +0x001B8 0x00048 RomWBW Partition Table +0x00200 0x1EE00 1 247 Unused +0x1F000 0x01000 248 8 ZRC Monitor v0.7 +0x20000 0x04000 256 32 Unused +0x24000 0x80000 288 1024 RomWBW +0xA4000 0x5C000 1312 736 Unused +0x100000 2048 Start of slices (partition 0x1E) Notes ----- - At startup CPLD ROM is mapped to Z80 CPU address space 0x0000-0x003F, CPU begins execution at 0x0000 -- CPLD ROM (CF bootstrap mode) reads CF Boot Loader (256B) from start of CF (MBR) to 0xB000 and runs it +- CPLD ROM (CF bootstrap mode) reads CF Boot Loader (512B) from start of CF (MBR) to 0xB000 and runs it - CF Boot Loader reads ZRC Monitor (4KB) from sectors 0xF8-0xFF of CF to 0xB400 and runs it -- ZRC Monitor reads 512KB (RomWBW) from sectors 0x120-0x51F of CF into first 512KB of RAM +- ZRC Monitor reads 512KB (RomWBW) from sectors 0x120-0x51F of CF into first 512KB of physical RAM +- ZRC Monitor maps first 32KB of physical RAM to first 32KB of CPU RAM and starts execution at 0x0000 + +-- WBW 3:30 PM 10/12/2023 \ No newline at end of file diff --git a/Source/ZRC/zrc_cfldr.bin b/Source/ZRC/zrc_cfldr.bin index 9a28f43b..dc481183 100644 Binary files a/Source/ZRC/zrc_cfldr.bin and b/Source/ZRC/zrc_cfldr.bin differ diff --git a/Source/ZRC/zrc_ptbl.bin b/Source/ZRC/zrc_ptbl.bin index 5e3a2a4d..5e9fc41d 100644 Binary files a/Source/ZRC/zrc_ptbl.bin and b/Source/ZRC/zrc_ptbl.bin differ diff --git a/Source/ZRC512/Bank Layout.txt b/Source/ZRC512/Bank Layout.txt new file mode 100644 index 00000000..9cf30528 --- /dev/null +++ b/Source/ZRC512/Bank Layout.txt @@ -0,0 +1,41 @@ +ZRC has no real ROM. It has a single 2048K RAM chip. There +are two startup modes supported by RomWBW. + +The normal startup mode treats the first 512KB like ROM and the +remaining 1536KB as RAM. The first 512KB (pseudo-ROM) must be preloaded +by the ZRC CF Loader. This mode simulates a normal ROM-based RomWBW +startup. + +Bank Contents Description +---- -------- ----------- +0x0 BOOT Boot Bank (HBIOS image) + +0x1 IMG0 ROM Loader, Monitor, ROM OSes | +0x2 IMG1 ROM Applications | Pseudo-ROM +0x3 IMG2 Reserved | +0x4-0xF ROMD ROM Disk Banks + +0x10 BIOS HBIOS Bank (operating) +0x11-0x3B RAMD RAM Disk Banks +0x3C BUF OS Buffers (CP/M3) +0x3D AUX Aux Bank (CP/M 3, BPBIOS, etc.) +0x3E USR User Bank (CP/M TPA, etc.) +0x3F COM Common Bank, Upper 32KB + +The ROMless startup mode treats the entire 2048KB as RAM. However, in +this mode, only the first 512KB of RAM is utilized. This is because +the RAM Disk is seeded by the CF Loader which is currently constrained +to loading 512KB. The entire 512KB of RAM (less the top 32KB) must be +preloaded by the ZRC CF Loader. There will be no ROM disk available +under RomWBW. There will be a RAM Disk and it's initial contents will +be seeded by the image loaded by the CF Loader. + +Bank Contents Description +-------- -------- ----------- +0x0 BIOS HBIOS Bank (operating) +0x1 IMG0 ROM Loader, Monitor, ROM OSes +0x2 IMG1 ROM Applications +0x3 IMG2 Reserved +0x4-0xB RAMD RAM Disk Banks +0xC BUF OS Buffers (CP/M3) +0xD AUX Aux Bank (CP/M 3, BPBIOS, etc.) +0xE USR User Bank (CP/M TPA, etc.) +0xF COM Common Bank, Upper 32KB diff --git a/Source/ZRC512/Build.cmd b/Source/ZRC512/Build.cmd new file mode 100644 index 00000000..dbc18f58 --- /dev/null +++ b/Source/ZRC512/Build.cmd @@ -0,0 +1,23 @@ +@echo off +setlocal + +set TOOLS=../../Tools + +set PATH=%TOOLS%\srecord;%PATH% + +if exist ..\..\Binary\RCZ80_zrc512.rom call :build_zrc512 + +goto :eof + +:build_zrc512 + +srec_cat -generate 0x0 0x100000 --constant 0x00 -o temp.dat -binary +srec_cat temp.dat -binary -exclude 0x0 0x200 zrc512_cfldr.bin -binary -o temp.dat -binary +srec_cat temp.dat -binary -exclude 0x1B8 0x200 zrc512_ptbl.bin -binary -offset 0x1B8 -o temp.dat -binary +srec_cat temp.dat -binary -exclude 0x1F000 0x20000 zrc512_mon.bin -binary -offset 0x1F000 -o temp.dat -binary +srec_cat temp.dat -binary -exclude 0x24000 0xA4000 ..\..\Binary\RCZ80_zrc512.rom -binary -offset 0x24000 -o temp.dat -binary +move temp.dat ..\..\Binary\hd1k_zrc512_prefix.dat + +copy /b ..\..\Binary\hd1k_zrc512_prefix.dat + ..\..\Binary\hd1k_cpm22.img + ..\..\Binary\hd1k_zsdos.img + ..\..\Binary\hd1k_nzcom.img + ..\..\Binary\hd1k_cpm3.img + ..\..\Binary\hd1k_zpm3.img + ..\..\Binary\hd1k_ws4.img ..\..\Binary\hd1k_zrc512_combo.img || exit /b + +goto :eof diff --git a/Source/ZRC512/Clean.cmd b/Source/ZRC512/Clean.cmd new file mode 100644 index 00000000..fa12c5c7 --- /dev/null +++ b/Source/ZRC512/Clean.cmd @@ -0,0 +1,3 @@ +@echo off +setlocal + diff --git a/Source/ZRC512/Makefile b/Source/ZRC512/Makefile new file mode 100644 index 00000000..d04611dc --- /dev/null +++ b/Source/ZRC512/Makefile @@ -0,0 +1,30 @@ +HD1KZRC512PREFIX = hd1k_zrc512_prefix.dat +HD1KZRC512COMBOIMG = hd1k_zrc512_combo.img +ZRC512ROM = ../../Binary/RCZ80_zrc512.rom +HD1KIMGS = ../../Binary/hd1k_cpm22.img ../../Binary/hd1k_zsdos.img ../../Binary/hd1k_nzcom.img \ + ../../Binary/hd1k_cpm3.img ../../Binary/hd1k_zpm3.img ../../Binary/hd1k_ws4.img + +OBJECTS := + +ifneq ($(wildcard $(ZRC512ROM)),) + OBJECTS += $(HD1KZRC512PREFIX) $(HD1KZRC512COMBOIMG) +endif + +DEST=../../Binary + +TOOLS = ../../Tools + +include $(TOOLS)/Makefile.inc + +DIFFPATH = $(DIFFTO)/Binary + +$(HD1KZRC512PREFIX): + srec_cat -generate 0x0 0x100000 --constant 0x00 -o temp.dat -binary + srec_cat temp.dat -binary -exclude 0x0 0x200 zrc512_cfldr.bin -binary -o temp.dat -binary + srec_cat temp.dat -binary -exclude 0x1B8 0x200 zrc512_ptbl.bin -binary -offset 0x1B8 -o temp.dat -binary + srec_cat temp.dat -binary -exclude 0x1F000 0x20000 zrc512_mon.bin -binary -offset 0x1F000 -o temp.dat -binary + srec_cat temp.dat -binary -exclude 0x24000 0xA4000 $(ZRC512ROM) -binary -offset 0x24000 -o temp.dat -binary + mv temp.dat $@ + +$(HD1KZRC512COMBOIMG): $(HD1KZRC512PREFIX) $(HD1KIMGS) + cat $^ > $@ diff --git a/Source/ZRC512/ZRC512 Disk Layout.txt b/Source/ZRC512/ZRC512 Disk Layout.txt new file mode 100644 index 00000000..88c7d404 --- /dev/null +++ b/Source/ZRC512/ZRC512 Disk Layout.txt @@ -0,0 +1,24 @@ +ZRC512 Disk Prefix Layout +====================== + +---- Bytes ---- --- Sectors --- +Start Length Start Length Description +------- ------- ------- ------- --------------------------- +0x00000 0x001BE 0 1 CF Boot Loader +0x001B8 0x00048 RomWBW Partition Table +0x00200 0x1EE00 1 247 Unused +0x1F000 0x01000 248 8 ZRC512 Monitor v0.3 +0x20000 0x04000 256 32 Unused +0x24000 0x80000 288 1024 RomWBW +0xA4000 0x5C000 1312 736 Unused +0x100000 2048 Start of slices (partition 0x1E) + +Notes +----- + +- At startup CPLD ROM is mapped to Z80 CPU address space 0x0000-0x003F, CPU begins execution at 0x0000 +- CPLD ROM (CF bootstrap mode) reads CF Boot Loader (512B) from start of CF (MBR) to 0xB000 and runs it +- CF Boot Loader reads ZRC512 Monitor (4KB) from sectors 0xF8-0xFF of CF to 0xB400 and runs it +- ZRC Monitor reads 480KB (RomWBW) from sectors 0x120-0x4DF of CF into 480KB of physical RAM +- ZRC Monitor maps first 32KB of physical RAM to first 32KB of CPU RAM and starts execution at 0x0000 + diff --git a/Source/ZRC512/zrc512_cfldr.bin b/Source/ZRC512/zrc512_cfldr.bin new file mode 100644 index 00000000..a819d677 Binary files /dev/null and b/Source/ZRC512/zrc512_cfldr.bin differ diff --git a/Source/ZRC512/zrc512_mon.bin b/Source/ZRC512/zrc512_mon.bin new file mode 100644 index 00000000..67f86b5b Binary files /dev/null and b/Source/ZRC512/zrc512_mon.bin differ diff --git a/Source/ZRC512/zrc512_ptbl.bin b/Source/ZRC512/zrc512_ptbl.bin new file mode 100644 index 00000000..5e9fc41d Binary files /dev/null and b/Source/ZRC512/zrc512_ptbl.bin differ diff --git a/Source/ZZRC/Bank Layout.txt b/Source/ZZRC/Bank Layout.txt deleted file mode 100644 index 9e2d951e..00000000 --- a/Source/ZZRC/Bank Layout.txt +++ /dev/null @@ -1,32 +0,0 @@ -ZZRCC has no real ROM. It has a single 512K RAM chip. The first -256K of the RAM chip is loaded from the CF card. This 256K is -treated like ROM by RomWBW. The remainder of the RAM (256K) is -treated like RAM by RomWBW. - -Because of the memory constraints, notice that there is no RAM Disk, -only a ROM disk. If you perform a ROM boot to an OS, the A: drive -will be the ROM disk and will not be writable. Booting a ROM OS -on this system is not typical since the system has a CF card by -definition. - -Bank ROM RAM RAM ----- --- --- --- -0 HBIOS (IMG) -1 ROMLDR+MON+CP/M2+ZSYS -2 FTH+BAS+TBAS+PLAY+USR -3 RESERVED -4 ROMDISK -5 ROMDISK -6 ROMDISK -7 ROMDISK - -8 BUF (CPM3) BUF (CPM3) -9 BUF (CPM3) BUF (CPM3) -A BUF (CPM3) BUF (CPM3) -B BUF (CPM3) BUF (CPM3) -C AUX (CPM3) TPA (CPM3) -D HBIOS (EXEC) HBIOS (EXEC) -E TPA-LO OS (CPM3) -F COMMON (TPA-HI) COMMON (TPA-HI) - ---WBW 6:40 PM 2/16/2022 \ No newline at end of file diff --git a/Source/ZZRC/Build.cmd b/Source/ZZRC/Build.cmd deleted file mode 100644 index 700e21b7..00000000 --- a/Source/ZZRC/Build.cmd +++ /dev/null @@ -1,42 +0,0 @@ -:: @echo off -setlocal - -set ROMFILE=..\..\Binary\RCZ280_zzrc.rom -set ROMSIZE=262144 - -if not exist %ROMFILE% goto :eof - -:: -:: The ROM image *must* be exactly 256K or the resulting disk -:: image produced below will be invalid. Check for the proper size. -:: - -call :filesize %ROMFILE% - -if "%FILESIZE%" neq "%ROMSIZE%" ( - echo. - echo. - echo ERROR: "%ROMFILE%" is not exactly %ROMSIZE% bytes as required!!! - echo You must specify a ROMSIZE of "256" when building the ZZRCC ROM image. - echo. - echo. - exit /b 1 -) - -rem ..\..\Tools\srecord\srec_cat.exe ..\..\Binary\RCZ280_zzrc.rom -Binary -Exclude 0x5000 0x7000 zzrc_romldr.hex -Intel -Output ..\..\Binary\RCZ280_zzrc.hex -Intel || exit /b - -..\..\Tools\srecord\srec_cat.exe ..\..\Binary\RCZ280_zzrc.rom -Binary -Output ..\..\Binary\RCZ280_zzrc.hex -Intel || exit /b - -rem ..\..\Tools\srecord\srec_cat.exe ..\..\Binary\RCZ280_zzrc.hex -Intel -Output ..\..\Binary\RCZ280_zzrc_ldr.rom -Binary || exit /b - -rem copy /b zzrc_cfldr.bin + zzrc_ptbl.bin + zzrc_fill_1.bin + zzrc_mon.bin + zzrc_fill_2.bin + ..\..\Binary\RCZ280_zzrc_ldr.rom + zzrc_fill_3.bin ..\..\Binary\hd1k_zzrc_prefix.dat || exit /b - -copy /b zzrc_cfldr.bin + zzrc_ptbl.bin + zzrc_fill_1.bin + zzrc_mon.bin + zzrc_fill_2.bin + ..\..\Binary\RCZ280_zzrc.rom + zzrc_fill_3.bin ..\..\Binary\hd1k_zzrc_prefix.dat || exit /b - -copy /b ..\..\Binary\hd1k_zzrc_prefix.dat + ..\..\Binary\hd1k_cpm22.img + ..\..\Binary\hd1k_zsdos.img + ..\..\Binary\hd1k_nzcom.img + ..\..\Binary\hd1k_cpm3.img + ..\..\Binary\hd1k_zpm3.img + ..\..\Binary\hd1k_ws4.img ..\..\Binary\hd1k_zzrc_combo.img || exit /b - -goto :eof - -:filesize -set FILESIZE=%~z1 -goto :eof \ No newline at end of file diff --git a/Source/ZZRC/Makefile b/Source/ZZRC/Makefile deleted file mode 100644 index 935a7bf2..00000000 --- a/Source/ZZRC/Makefile +++ /dev/null @@ -1,33 +0,0 @@ -HD1KZZRCPREFIX = hd1k_zzrc_prefix.dat -HD1KZZRCCOMBOIMG = hd1k_zzrc_combo.img -ZZRCROM = ../../Binary/RCZ280_zzrc.rom -ZZRCROMHEX = RCZ280_zzrc.hex -HD1KIMGS = ../../Binary/hd1k_cpm22.img ../../Binary/hd1k_zsdos.img ../../Binary/hd1k_nzcom.img \ - ../../Binary/hd1k_cpm3.img ../../Binary/hd1k_zpm3.img ../../Binary/hd1k_ws4.img -ZZRCROMSIZE = 262144 - -OBJECTS := - -ifneq ($(wildcard $(ZZRCROM)),) - OBJECTS += $(ZZRCROMHEX) $(HD1KZZRCPREFIX) $(HD1KZZRCCOMBOIMG) -endif - -DEST=../../Binary - -TOOLS = ../../Tools - -include $(TOOLS)/Makefile.inc - -DIFFPATH = $(DIFFTO)/Binary - -zzrcromchk: - [ `wc -c $(ZZRCROM) | awk '{print $$1}'` = $(ZZRCROMSIZE) ] - -$(HD1KZZRCPREFIX): zzrcromchk - cat zzrc_cfldr.bin zzrc_ptbl.bin zzrc_fill_1.bin zzrc_mon.bin zzrc_fill_2.bin $(ZZRCROM) zzrc_fill_3.bin >$@ - -$(HD1KZZRCCOMBOIMG): zzrcromchk $(HD1KZZRCPREFIX) $(HD1KIMGS) - cat $(HD1KZZRCPREFIX) $(HD1KIMGS) > $@ - -$(ZZRCROMHEX): zzrcromchk $(ZZRCROM) - srec_cat $(ZZRCROM) -Binary -Output $(ZZRCROMHEX) -Intel -CRLF diff --git a/Source/ZZRC/ZZRC Disk Layout.txt b/Source/ZZRC/ZZRC Disk Layout.txt deleted file mode 100644 index 6042edde..00000000 --- a/Source/ZZRC/ZZRC Disk Layout.txt +++ /dev/null @@ -1,31 +0,0 @@ -Start Length Sector Count Description -------- ------- ------- ------- ----------------------------------------- -0x00000 0x00100 0x000 0x001 CF Boot Loader (first 256 bytes) -0x00100 0x00100 0x000 0x001 RomWBW Partition Table (last 256 bytes) -0x00200 0x1EE00 0x001 0x0F7 Filler -0x1F000 0x01000 0x0F8 0x008 ZZRCC Monitor / RomWBW Loader -0x20000 0x04000 0x100 0x020 Filler -0x24000 0x40000 0x120 0x200 RomWBW (256KB ROM image) -0x64000 0x9C000 0x320 0x4E0 Filler -0x100000 0x800 Slices - -Notes ------ - -- At startup CPLD ROM is mapped to Z80 CPU address space 0x0000-0x003F, CPU begins execution at 0x0000 -- CPLD ROM (CF bootstrap mode) loads CF Boot Loader (256B) to 0xB000 and runs it -- CF Boot Loader loads ZZRCC Monitor to 0xB000 and runs it starting at address 0xB400 -- Monitor (Boot RomWBW) loads RomWBW ROM image to first 8 banks of RAM, then runs it starting at address 0x000 - -Possible alternative layout: - -Start Length Sector Count Description -------- ------- ------- ------- ----------------------------------------- -0x00000 0x00100 0 1 CF Boot Loader (first 256 bytes) -0x00100 0x00100 0 1 RomWBW Partition Table (last 256 bytes) -0x00200 0x01000 0x001 0x008 ZZRCC Monitor / RomWBW Loader -0x01200 0x7EE00 0x009 0x3F7 Filler -0x80000 0x40000 0x400 0x200 RomWBW (256KB ROM image) -0xC0000 0x40000 0x600 0x200 Filler -0x100000 0x800 Slices (0x1E partition start) - diff --git a/Source/ZZRC/zzrc_cfldr.bin b/Source/ZZRC/zzrc_cfldr.bin deleted file mode 100644 index 04b6c228..00000000 Binary files a/Source/ZZRC/zzrc_cfldr.bin and /dev/null differ diff --git a/Source/ZZRC/zzrc_fill_1.bin b/Source/ZZRC/zzrc_fill_1.bin deleted file mode 100644 index 705bedcd..00000000 Binary files a/Source/ZZRC/zzrc_fill_1.bin and /dev/null differ diff --git a/Source/ZZRC/zzrc_fill_2.bin b/Source/ZZRC/zzrc_fill_2.bin deleted file mode 100644 index 294f4016..00000000 Binary files a/Source/ZZRC/zzrc_fill_2.bin and /dev/null differ diff --git a/Source/ZZRC/zzrc_fill_3.bin b/Source/ZZRC/zzrc_fill_3.bin deleted file mode 100644 index 38b2e993..00000000 Binary files a/Source/ZZRC/zzrc_fill_3.bin and /dev/null differ diff --git a/Source/ZZRC/zzrc_mon.bin b/Source/ZZRC/zzrc_mon.bin deleted file mode 100644 index e9a04d74..00000000 Binary files a/Source/ZZRC/zzrc_mon.bin and /dev/null differ diff --git a/Source/ZZRCC/Bank Layout.txt b/Source/ZZRCC/Bank Layout.txt new file mode 100644 index 00000000..d68f8908 --- /dev/null +++ b/Source/ZZRCC/Bank Layout.txt @@ -0,0 +1,39 @@ +ZZRCC has no real ROM. It has a single 512K RAM chip. There +are two startup modes supported by RomWBW. + +The normal startup mode treats the first 256KB like ROM and the second +256KB as RAM. The first 256KB (pseudo-ROM) must be preloaded by the +ZZRCC CF Loader. This mode simulates a normal ROM-based RomWBW +startup. + +Bank Contents Description +---- -------- ----------- +0x0 BOOT Boot Bank (HBIOS image) + +0x1 IMG0 ROM Loader, Monitor, ROM OSes | +0x2 IMG1 ROM Applications | Pseudo-ROM +0x3 IMG2 Reserved | +0x4-0x7 ROMD ROM Disk Banks + +0x8 BIOS HBIOS Bank (operating) +0x9-0xB RAMD RAM Disk Banks +0xC BUF OS Buffers (CP/M3) +0xD AUX Aux Bank (CP/M 3, BPBIOS, etc.) +0xE USR User Bank (CP/M TPA, etc.) +0xF COM Common Bank, Upper 32KB + +The ROMless startup mode treats the entire 512KB as RAM. The entire +512KB of RAM (less the top 32KB) must be preloaded by the ZZRCC CF +Loader. There will be no ROM disk available under RomWBW. There +will be a RAM Disk and it's initial contents will be seeded by the +image loaded by the CF Loader. + +Bank Contents Description +-------- -------- ----------- +0x0 BIOS HBIOS Bank (operating) +0x1 IMG0 ROM Loader, Monitor, ROM OSes +0x2 IMG1 ROM Applications +0x3 IMG2 Reserved +0x4-0xB RAMD RAM Disk Banks +0xC BUF OS Buffers (CP/M3) +0xD AUX Aux Bank (CP/M 3, BPBIOS, etc.) +0xE USR User Bank (CP/M TPA, etc.) +0xF COM Common Bank, Upper 32KB diff --git a/Source/ZZRCC/Build.cmd b/Source/ZZRCC/Build.cmd new file mode 100644 index 00000000..f520b11a --- /dev/null +++ b/Source/ZZRCC/Build.cmd @@ -0,0 +1,41 @@ +:: @echo off +setlocal + +set ROMFILE=..\..\Binary\RCZ280_zzrcc.rom +set ROMSIZE=262144 + +set TOOLS=../../Tools + +set PATH=%TOOLS%\srecord;%PATH% + +if exist ..\..\Binary\RCZ280_zzrcc.rom call :build_zzrcc + +if exist ..\..\Binary\RCZ280_zzrcc_ram.rom call :build_zzrcc_ram + +goto :eof + +:build_zzrcc + +srec_cat -generate 0x0 0x100000 --constant 0x00 -o temp.dat -binary +srec_cat temp.dat -binary -exclude 0x0 0x200 zzrcc_cfldr.bin -binary -o temp.dat -binary +srec_cat temp.dat -binary -exclude 0x1B8 0x200 zzrcc_ptbl.bin -binary -offset 0x1B8 -o temp.dat -binary +srec_cat temp.dat -binary -exclude 0x1F000 0x20000 zzrcc_mon.bin -binary -offset 0x1F000 -o temp.dat -binary +srec_cat temp.dat -binary -exclude 0x24000 0xA4000 ..\..\Binary\RCZ280_zzrcc.rom -binary -offset 0x24000 -o temp.dat -binary +move temp.dat ..\..\Binary\hd1k_zzrcc_prefix.dat + +copy /b ..\..\Binary\hd1k_zzrcc_prefix.dat + ..\..\Binary\hd1k_cpm22.img + ..\..\Binary\hd1k_zsdos.img + ..\..\Binary\hd1k_nzcom.img + ..\..\Binary\hd1k_cpm3.img + ..\..\Binary\hd1k_zpm3.img + ..\..\Binary\hd1k_ws4.img ..\..\Binary\hd1k_zzrcc_combo.img || exit /b + +goto :eof + +:build_zzrcc_ram + +srec_cat -generate 0x0 0x100000 --constant 0x00 -o temp.dat -binary +srec_cat temp.dat -binary -exclude 0x0 0x200 zzrcc_cfldr.bin -binary -o temp.dat -binary +srec_cat temp.dat -binary -exclude 0x1B8 0x200 zzrcc_ptbl.bin -binary -offset 0x1B8 -o temp.dat -binary +srec_cat temp.dat -binary -exclude 0x1F000 0x20000 zzrcc_mon.bin -binary -offset 0x1F000 -o temp.dat -binary +srec_cat temp.dat -binary -exclude 0x24000 0xA4000 ..\..\Binary\RCZ280_zzrcc_ram.rom -binary -offset 0x24000 -o temp.dat -binary +move temp.dat ..\..\Binary\hd1k_zzrcc_ram_prefix.dat + +copy /b ..\..\Binary\hd1k_zzrcc_ram_prefix.dat + ..\..\Binary\hd1k_cpm22.img + ..\..\Binary\hd1k_zsdos.img + ..\..\Binary\hd1k_nzcom.img + ..\..\Binary\hd1k_cpm3.img + ..\..\Binary\hd1k_zpm3.img + ..\..\Binary\hd1k_ws4.img ..\..\Binary\hd1k_zzrcc_ram_combo.img || exit /b + +goto :eof diff --git a/Source/ZZRCC/Clean.cmd b/Source/ZZRCC/Clean.cmd new file mode 100644 index 00000000..fa12c5c7 --- /dev/null +++ b/Source/ZZRCC/Clean.cmd @@ -0,0 +1,3 @@ +@echo off +setlocal + diff --git a/Source/ZZRCC/Makefile b/Source/ZZRCC/Makefile new file mode 100644 index 00000000..f0bbde6a --- /dev/null +++ b/Source/ZZRCC/Makefile @@ -0,0 +1,48 @@ +HD1KZZRCCPREFIX = hd1k_zzrcc_prefix.dat +HD1KZZRCCCOMBOIMG = hd1k_zzrcc_combo.img +HD1KZZRCCRAMPREFIX = hd1k_zzrcc_ram_prefix.dat +HD1KZZRCCRAMCOMBOIMG = hd1k_zzrcc_ram_combo.img +ZZRCCROM = ../../Binary/RCZ280_zzrcc.rom +ZZRCCRAMROM = ../../Binary/RCZ280_zzrcc_ram.rom +HD1KIMGS = ../../Binary/hd1k_cpm22.img ../../Binary/hd1k_zsdos.img ../../Binary/hd1k_nzcom.img \ + ../../Binary/hd1k_cpm3.img ../../Binary/hd1k_zpm3.img ../../Binary/hd1k_ws4.img + +OBJECTS := + +ifneq ($(wildcard $(ZZRCCROM)),) + OBJECTS += $(HD1KZZRCCPREFIX) $(HD1KZZRCCCOMBOIMG) +endif + +ifneq ($(wildcard $(ZZRCCRAMROM)),) + OBJECTS += $(HD1KZZRCCRAMPREFIX) $(HD1KZZRCCRAMCOMBOIMG) +endif + +DEST=../../Binary + +TOOLS = ../../Tools + +include $(TOOLS)/Makefile.inc + +DIFFPATH = $(DIFFTO)/Binary + +$(HD1KZZRCCPREFIX): + srec_cat -generate 0x0 0x100000 --constant 0x00 -o temp.dat -binary + srec_cat temp.dat -binary -exclude 0x0 0x200 zzrcc_cfldr.bin -binary -o temp.dat -binary + srec_cat temp.dat -binary -exclude 0x1B8 0x200 zzrcc_ptbl.bin -binary -offset 0x1B8 -o temp.dat -binary + srec_cat temp.dat -binary -exclude 0x1F000 0x20000 zzrcc_mon.bin -binary -offset 0x1F000 -o temp.dat -binary + srec_cat temp.dat -binary -exclude 0x24000 0xA4000 $(ZZRCCROM) -binary -offset 0x24000 -o temp.dat -binary + mv temp.dat $@ + +$(HD1KZZRCCRAMPREFIX): + srec_cat -generate 0x0 0x100000 --constant 0x00 -o temp.dat -binary + srec_cat temp.dat -binary -exclude 0x0 0x200 zzrcc_cfldr.bin -binary -o temp.dat -binary + srec_cat temp.dat -binary -exclude 0x1B8 0x200 zzrcc_ptbl.bin -binary -offset 0x1B8 -o temp.dat -binary + srec_cat temp.dat -binary -exclude 0x1F000 0x20000 zzrcc_mon.bin -binary -offset 0x1F000 -o temp.dat -binary + srec_cat temp.dat -binary -exclude 0x24000 0xA4000 $(ZZRCCRAMROM) -binary -offset 0x24000 -o temp.dat -binary + mv temp.dat $@ + +$(HD1KZZRCCCOMBOIMG): $(HD1KZZRCCPREFIX) $(HD1KIMGS) + cat $^ > $@ + +$(HD1KZZRCCRAMCOMBOIMG): $(HD1KZZRCCRAMPREFIX) $(HD1KIMGS) + cat $^ > $@ diff --git a/Source/ZZRCC/ZZRCC Disk Layout.txt b/Source/ZZRCC/ZZRCC Disk Layout.txt new file mode 100644 index 00000000..6aac2a6f --- /dev/null +++ b/Source/ZZRCC/ZZRCC Disk Layout.txt @@ -0,0 +1,25 @@ +ZZRCC Disk Prefix Layout +======================== + +---- Bytes ---- --- Sectors --- +Start Length Start Length Description +------- ------- ------- ------- --------------------------- +0x00000 0x001BE 0 1 CF Boot Loader +0x001B8 0x00048 RomWBW Partition Table +0x00200 0x1EE00 1 247 Unused +0x1F000 0x01000 248 8 ZZRCC Monitor v0.5 +0x20000 0x04000 256 32 Unused +0x24000 0x80000 288 1024 RomWBW +0xA4000 0x5C000 1312 736 Unused +0x100000 2048 Start of slices (partition 0x1E) + +Notes +----- + +- At startup CPLD ROM is mapped to Z280 CPU address space 0x0000-0x003F, CPU begins execution at 0x0000 +- CPLD ROM (CF bootstrap mode) reads CF Boot Loader (512B) from start of CF (MBR) to 0xB000 and runs it +- CF Boot Loader reads ZZRCC Monitor (4KB) from sectors 0xF8-0xFF of CF to 0xB400 and runs it +- ZZRCC Monitor reads 512KB (RomWBW) from sectors 0x120-0x51F of CF into first 512KB of physical RAM +- ZZRCC Monitor maps first 32KB of physical RAM to first 32KB of CPU RAM and starts execution at 0x0000 + +-WBW 3:30 PM 10/12/2023 \ No newline at end of file diff --git a/Source/ZZRCC/zzrcc_cfldr.bin b/Source/ZZRCC/zzrcc_cfldr.bin new file mode 100644 index 00000000..9c8fce82 Binary files /dev/null and b/Source/ZZRCC/zzrcc_cfldr.bin differ diff --git a/Source/ZZRCC/zzrcc_mon.bin b/Source/ZZRCC/zzrcc_mon.bin new file mode 100644 index 00000000..cedad49d Binary files /dev/null and b/Source/ZZRCC/zzrcc_mon.bin differ diff --git a/Source/ZZRCC/zzrcc_ptbl.bin b/Source/ZZRCC/zzrcc_ptbl.bin new file mode 100644 index 00000000..5e9fc41d Binary files /dev/null and b/Source/ZZRCC/zzrcc_ptbl.bin differ diff --git a/Source/pSys/ReadMe.txt b/Source/pSys/ReadMe.txt index 9c1c5507..ad6bd7e3 100644 --- a/Source/pSys/ReadMe.txt +++ b/Source/pSys/ReadMe.txt @@ -48,7 +48,7 @@ The layout of the first track does not conform exactly to the recommended p-System layout. The recommended layout is not possible because it conflicts with the RomWBW definition for a boot track. However, the changes are only slightly different sector assignments for -the different boot componets -- the general boot sequence and mechanism +the different boot components -- the general boot sequence and mechanism for the p-System is completely standard. The logical disk geometry used by this p-System @@ -77,14 +77,16 @@ escape sequence handling configuration. The debugger code as added to SYSTEM.PASCAL to enable the debug function. SYSTEM.INTERP was modified to enable the extended BIOS functions. -The build/makefile creates the psys disk image (psys.img) by adding -concatentating psys.vol and blank.vol (after adding track 0 contents to +The build/makefile creates the psys disk image (psys.img) by +concatenating psys.vol and blank.vol (after adding track 0 contents to each). psys.vol and blank.vol are recognized by CiderPress and CiderPress can be used to add/remove files from these volumes. -However, there is currently no straightforward way to extract the -volumes from the disk image. If you are good with a binary disk -editor, you can do it that way. Please contact me if you are -interested in pursuing that. +To extract volumes from a disk image, Andrew Davidson has created +a nice Python script that can extract p-System volumes from an +existing disk image file. The extracted volume can be manipulated +by CiderPress. The script is also capable of re-inserting a modified +volume back into the disk image file. This tool is available at: +https://github.com/robosnacks/psysimg. There is currently no support for floppy drives. @@ -119,7 +121,7 @@ that SofTech produced a IV.1 with some nice enhancements (like subsidiary volumes and decent support for ANSI/VT-100 terminals). I have been unable to track down the IV.1 distribution media despite trying very hard. If anyone knows of a source for the media of the -Adapable p-System for Z80, I would love to get hold of it. +Adaptable p-System for Z80, I would love to get hold of it. 3:58 PM Tuesday, January 17, 2023 @@ -138,4 +140,10 @@ arrow keys transmitted by an ANSI/VT-100 terminal. In this case, the setup program was used to define up/down/left/right like WordStar does: ^E,^X,^S,^D. -5:48 PM Tuesday, January 17, 2023 \ No newline at end of file +5:48 PM Tuesday, January 17, 2023 + +Updated instructions above to include a reference to Andrew +Davidson's Python script that will extract/insert volumes from/to +a disk image. + +1:31 PM Thursday, May 11, 2023 \ No newline at end of file diff --git a/Source/pSys/psys.vol b/Source/pSys/psys.vol index 358175d3..9d0db099 100644 Binary files a/Source/pSys/psys.vol and b/Source/pSys/psys.vol differ diff --git a/Source/ver.inc b/Source/ver.inc index 590006df..d31049cd 100644 --- a/Source/ver.inc +++ b/Source/ver.inc @@ -1,8 +1,8 @@ #DEFINE RMJ 3 -#DEFINE RMN 2 -#DEFINE RUP 1 +#DEFINE RMN 4 +#DEFINE RUP 0 #DEFINE RTP 0 -#DEFINE BIOSVER "3.2.1" +#DEFINE BIOSVER "3.4.0-rc.4" #define rmj RMJ #define rmn RMN #define rup RUP diff --git a/Source/ver.lib b/Source/ver.lib index 4e4d6cf6..6f272e71 100644 --- a/Source/ver.lib +++ b/Source/ver.lib @@ -1,7 +1,7 @@ rmj equ 3 -rmn equ 2 -rup equ 1 +rmn equ 4 +rup equ 0 rtp equ 0 biosver macro - db "3.2.1" + db "3.4.0-rc.4" endm diff --git a/Tools/Makefile b/Tools/Makefile index b6093e4c..74baac9a 100644 --- a/Tools/Makefile +++ b/Tools/Makefile @@ -1,6 +1,10 @@ # # build the tools for linux and Darwin # + +.ONESHELL: +.SHELLFLAGS = -cex + UNAME := $(shell uname) all: diff --git a/Tools/Makefile.inc b/Tools/Makefile.inc index 35258860..10be67c5 100644 --- a/Tools/Makefile.inc +++ b/Tools/Makefile.inc @@ -42,7 +42,6 @@ export CPMDIR80=$(TOOLS)/cpm/ TASM=$(BINDIR)/uz80as -t z80 TASMFLAGS= OPENSPIN=$(BINDIR)/openspin -BSTC=$(BINDIR)//bstc CPMCP=$(BINDIR)/cpmcp CPMCHATTR=$(BINDIR)/cpmchattr @@ -115,19 +114,8 @@ CPM=$(TOOLS)/cpm/bin80/ %.com: %.rel $(ZXCC) $(CPM)/L80 -$(basename $<),$(basename $<).com/n/e -ifeq ($(UNAME), Linux) -%.eeprom: %.spin - $(BSTC) -e -l $< -endif - -# -# darwin bstc won't run, since mac os does not do 32 bit binaries any more -# openspin ought to work -# -ifeq ($(UNAME), Darwin) %.eeprom: %.spin $(OPENSPIN) -e $< -endif # # first target is default @@ -136,16 +124,15 @@ all:: $(OBJECTS) @for dir in $(SUBDIRS) ; do \ $(MAKE) --directory $$dir ; \ done + rm -f /tmp/casefn.cache @if [ "$(DEST)" ] && [ "$(OBJECTS)" ] ; then for file in $(filter-out $(NOCOPY),$(OBJECTS)) ; do \ mkdir -p $(DEST) ; \ echo Copying $$file to $(DEST) ; \ - rm -f /tmp/casefn.cache ; \ cp $$($(CASEFN) $$file) $(DEST) ; \ done ; fi @if [ "$(DOCDEST)" ] && [ "$(DOCS)" ] ; then for file in $(DOCS) ; do \ mkdir -p $(DOCDEST) ; \ echo Copying $$file to $(DOCDEST) ; \ - rm -f /tmp/casefn.cache ; \ cp $$($(CASEFN) $$file) $(DOCDEST) ; \ done ; fi diff --git a/Tools/OpenSpin/openspin.exe b/Tools/OpenSpin/openspin.exe new file mode 100644 index 00000000..2e64bd60 Binary files /dev/null and b/Tools/OpenSpin/openspin.exe differ diff --git a/Tools/bst/bst_manual_0.04.pdf b/Tools/bst/bst_manual_0.04.pdf deleted file mode 100644 index 529381e1..00000000 Binary files a/Tools/bst/bst_manual_0.04.pdf and /dev/null differ diff --git a/Tools/bst/bstc.exe b/Tools/bst/bstc.exe deleted file mode 100644 index febcbd0a..00000000 Binary files a/Tools/bst/bstc.exe and /dev/null differ diff --git a/Tools/bst/bstl.exe b/Tools/bst/bstl.exe deleted file mode 100644 index dab87ecf..00000000 Binary files a/Tools/bst/bstl.exe and /dev/null differ diff --git a/Tools/cpmtools/diskdefs b/Tools/cpmtools/diskdefs index 81d962cc..f29deca1 100644 --- a/Tools/cpmtools/diskdefs +++ b/Tools/cpmtools/diskdefs @@ -310,6 +310,32 @@ diskdef wbw_rom1024 os 2.2 end +# RomWBW 512KB RAM (256KB reserved, 256KB RAM Disk) + +diskdef wbw_ram512 + seclen 512 + tracks 8 + sectrk 64 + blocksize 2048 + maxdir 256 + skew 0 + boottrk 0 + os 2.2 +end + +# RomWBW 1024KB RAM (256KB reserved, 768KB RAM Disk) + +diskdef wbw_ram1024 + seclen 512 + tracks 24 + sectrk 64 + blocksize 2048 + maxdir 256 + skew 0 + boottrk 0 + os 2.2 +end + # RomWBW 720K floppy media diskdef wbw_fd720 diff --git a/Tools/unix/Makefile b/Tools/unix/Makefile index bdd56c36..ebdecfb5 100644 --- a/Tools/unix/Makefile +++ b/Tools/unix/Makefile @@ -1,6 +1,10 @@ # # build the tools for linux and Darwin # + +.ONESHELL: +.SHELLFLAGS = -cex + UNAME := $(shell uname) ifeq ($(UNAME), Linux) SUFFIX=linux @@ -9,7 +13,7 @@ ifeq ($(UNAME), Darwin) SUFFIX=osx endif -SUBDIRS = bst uz80as zxcc cpmtools bin2asm lzsa +SUBDIRS = OpenSpin uz80as zxcc cpmtools bin2asm lzsa all: @chmod +x casefn.sh diff --git a/Tools/unix/OpenSpin/.travis.yml b/Tools/unix/OpenSpin/.travis.yml new file mode 100644 index 00000000..d753d833 --- /dev/null +++ b/Tools/unix/OpenSpin/.travis.yml @@ -0,0 +1,5 @@ +language: c +os: + - linux + - osx +script: make diff --git a/Tools/unix/OpenSpin/Makefile b/Tools/unix/OpenSpin/Makefile new file mode 100644 index 00000000..2e607b30 --- /dev/null +++ b/Tools/unix/OpenSpin/Makefile @@ -0,0 +1,68 @@ +# modified for RomWBW build environment + +UNAME := $(shell uname) +DEST = ../../$(UNAME) + +# cross compilation scheme taken from Eric Smith's spin2cpp compiler +# if CROSS is defined, we are building a cross compiler +# possible targets are: win32, rpi + +ifeq ($(CC),) + CC=gcc +endif + +ifeq ($(CXX),) + CXX=g++ +endif + +ifeq ($(CROSS),win32) + CC=i686-w64-mingw32-gcc + CXX=i686-w64-mingw32-g++ + EXT=.exe + BUILD=./build-win32 +else ifeq ($(CROSS),rpi) + CC=arm-linux-gnueabihf-gcc + CXX=arm-linux-gnueabihf-g++ + EXT= + BUILD=./build-rpi +else + EXT= + BUILD=./build +endif + +OS:=$(shell uname) + +ifeq ($(OS),Darwin) + CFLAGS+=-Wall -g -Wno-self-assign +else + CFLAGS+=-Wall -g $(MSTATIC) +endif + +CXXFLAGS += $(CFLAGS) + +TARGET=$(BUILD)/openspin$(EXT) +SRCDIR=SpinSource +OBJ=$(BUILD)/openspin.o \ + $(BUILD)/pathentry.o + +LIBNAME=$(BUILD)/PropellerCompiler/libopenspin.a + +all: $(BUILD) $(DEST) $(LIBNAME) $(OBJ) Makefile + $(CXX) -o $(TARGET) $(CXXFLAGS) $(OBJ) $(LIBNAME) + cp -p $(TARGET) $(DEST) + +$(BUILD)/%.o: $(SRCDIR)/%.cpp + $(CXX) $(CXXFLAGS) -o $@ -c $< + +$(LIBNAME): $(BUILD) + $(MAKE) -C PropellerCompiler CROSS=$(CROSS) BUILD=$(realpath $(BUILD))/PropellerCompiler all + +$(BUILD): + mkdir -p $(BUILD) + +$(DEST): + mkdir -p $(DEST) + +clean: + rm -rf $(BUILD) + make -C PropellerCompiler BUILD=$(realpath $(BUILD))/PropellerCompiler clean diff --git a/Tools/unix/OpenSpin/PropellerCompiler/BlockNestStackRoutines.cpp b/Tools/unix/OpenSpin/PropellerCompiler/BlockNestStackRoutines.cpp new file mode 100644 index 00000000..1a2500be --- /dev/null +++ b/Tools/unix/OpenSpin/PropellerCompiler/BlockNestStackRoutines.cpp @@ -0,0 +1,136 @@ +////////////////////////////////////////////////////////////// +// // +// Propeller Spin/PASM Compiler // +// (c)2012-2016 Parallax Inc. DBA Parallax Semiconductor. // +// Adapted from Chip Gracey's x86 asm code by Roy Eltham // +// See end of file for terms of use. // +// // +////////////////////////////////////////////////////////////// +// +// BlockNestStackRoutines.cpp +// + +#include +#include +#include +#include +#include "Utilities.h" +#include "PropellerCompilerInternal.h" +#include "SymbolEngine.h" +#include "Elementizer.h" +#include "ErrorStrings.h" +#include "CompileUtilities.h" + +// +// Block Nest Routines +// + +bool BlockNest_New(unsigned char type, int stackSize) +{ + if (g_pCompilerData->bnest_ptr > block_nest_limit) + { + g_pCompilerData->error = true; + g_pCompilerData->error_msg = g_pErrorStrings[error_loxnbe]; + return false; + } + + // set blockstack base + g_pCompilerData->bnest_type[g_pCompilerData->bnest_ptr] = type; + g_pCompilerData->bstack_base[g_pCompilerData->bnest_ptr++] = g_pCompilerData->bstack_ptr; + + // init bstack values to max forward + for (int i = 0; i < stackSize; i++) + { + g_pCompilerData->bstack[g_pCompilerData->bstack_ptr + i] = 0x0000FFC0; + } + g_pCompilerData->bstack_ptr += stackSize; + if (g_pCompilerData->bstack_ptr >= block_stack_limit) + { + g_pCompilerData->error = true; + g_pCompilerData->error_msg = g_pErrorStrings[error_bnso]; + return false; + } + + return true; +} + +void BlockNest_Redo(unsigned char type) +{ + g_pCompilerData->bnest_type[g_pCompilerData->bnest_ptr - 1] = type; +} + +void BlockNest_End() +{ + g_pCompilerData->bnest_ptr--; + g_pCompilerData->bstack_ptr = g_pCompilerData->bstack_base[g_pCompilerData->bnest_ptr]; +} + +// +// Block Stack Routines +// + +void BlockStack_Write(int address, int value) +{ + int stackAddress = g_pCompilerData->bstack_base[g_pCompilerData->bnest_ptr - 1] + address; + g_pCompilerData->bstack[stackAddress] = value; +} + +int BlockStack_Read(int address) +{ + int stackAddress = g_pCompilerData->bstack_base[g_pCompilerData->bnest_ptr - 1] + address; + return g_pCompilerData->bstack[stackAddress]; +} + +bool BlockStack_CompileAddress(int address) +{ + return CompileAddress(BlockStack_Read(address)); +} + +bool BlockStack_CompileConstant() +{ + int value = BlockStack_Read(0); + + if (value >= 0x100) + { + // two byte + if (!EnterObj(0x39)) // 0x39 = 00111001b + { + return false; + } + if (!EnterObj((unsigned char)((value >> 8) & 0xFF))) + { + return false; + } + } + else + { + // one byte + if (!EnterObj(0x38)) // 0x38 = 00111000b + { + return false; + } + } + + return EnterObj((unsigned char)(value & 0xFF)); +} + +/////////////////////////////////////////////////////////////////////////////////////////// +// TERMS OF USE: MIT License // +/////////////////////////////////////////////////////////////////////////////////////////// +// Permission is hereby granted, free of charge, to any person obtaining a copy of this // +// software and associated documentation files (the "Software"), to deal in the Software // +// without restriction, including without limitation the rights to use, copy, modify, // +// merge, publish, distribute, sublicense, and/or sell copies of the Software, and to // +// permit persons to whom the Software is furnished to do so, subject to the following // +// conditions: // +// // +// The above copyright notice and this permission notice shall be included in all copies // +// or substantial portions of the Software. // +// // +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, // +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A // +// PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT // +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE // +// SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // +/////////////////////////////////////////////////////////////////////////////////////////// diff --git a/Tools/unix/OpenSpin/PropellerCompiler/CompileDatBlocks.cpp b/Tools/unix/OpenSpin/PropellerCompiler/CompileDatBlocks.cpp new file mode 100644 index 00000000..0497d0d1 --- /dev/null +++ b/Tools/unix/OpenSpin/PropellerCompiler/CompileDatBlocks.cpp @@ -0,0 +1,932 @@ +////////////////////////////////////////////////////////////// +// // +// Propeller Spin/PASM Compiler // +// (c)2012-2016 Parallax Inc. DBA Parallax Semiconductor. // +// Adapted from Chip Gracey's x86 asm code by Roy Eltham // +// See end of file for terms of use. // +// // +////////////////////////////////////////////////////////////// +// +// CompileDatBlocks.cpp +// + +#include +#include +#include +#include +#include "Utilities.h" +#include "PropellerCompilerInternal.h" +#include "SymbolEngine.h" +#include "Elementizer.h" +#include "ErrorStrings.h" + +void CompileDatBlocks_EnterInfo(int datstart, int objstart) +{ + g_pCompilerData->inf_start = datstart; + g_pCompilerData->inf_finish = g_pElementizer->GetSourcePtr(); + g_pCompilerData->inf_data0 = objstart; + g_pCompilerData->inf_data1 = g_pCompilerData->obj_ptr; + g_pCompilerData->inf_data2 = 0; + g_pCompilerData->inf_data3 = 0; + g_pCompilerData->inf_data4 = 0; + g_pCompilerData->inf_type = info_dat; + EnterInfo(); +} + +void CompileDatBlocks_EnterSymbol(bool bResSymbol, int size) +{ + int value_1 = g_pCompilerData->obj_ptr; + int value_2 = g_pCompilerData->cog_org; + g_pCompilerData->inf_data0 = value_1; + g_pCompilerData->inf_data1 = size; + g_pCompilerData->inf_data2 = value_2; + g_pCompilerData->inf_data3 = 0; + g_pCompilerData->inf_data4 = 0; + g_pCompilerData->inf_type = info_dat_symbol; + EnterInfo(); + g_pSymbolEngine->AddSymbol(g_pCompilerData->symbolBackup, bResSymbol ? type_dat_long_res : (size == 0 ? type_dat_byte : (size == 1 ? type_dat_word : type_dat_long)), value_1, value_2); +#ifdef RPE_DEBUG + printf("dat: %s %08X %08X (%d)\n", g_pCompilerData->symbolBackup, value_1, value_2, size); +#endif +} + +bool CompileDatBlocks_EnterByte(unsigned char value) +{ + if (EnterObj(value)) + { + if (g_pCompilerData->orgx == 0) + { + g_pCompilerData->cog_org++; + } + return true; + } + return false; +} + +bool CompileDatBlocks_Enter(int value, int count, int size) +{ + int numBytesPer = 1 << size; + for (int i = 0; i < count; i++) + { + if(!CompileDatBlocks_EnterByte(value & 0x000000FF)) + { + return false; + } + if (numBytesPer > 1) + { + if(!CompileDatBlocks_EnterByte((value >> 8) & 0x000000FF)) + { + return false; + } + } + if (numBytesPer > 2) + { + if(!CompileDatBlocks_EnterByte((value >> 16) & 0x000000FF)) + { + return false; + } + if(!CompileDatBlocks_EnterByte((value >> 24) & 0x000000FF)) + { + return false; + } + } + } + return true; +} + +bool CompileDatBlocks_Advance(bool bSymbol, bool bResSymbol, int size) +{ + int testVal = (1 << size) - 1; + for (;;) + { + if ((g_pCompilerData->obj_ptr & testVal) == 0) + { + if (bSymbol) + { + CompileDatBlocks_EnterSymbol(bResSymbol, size); + } + break; + } + if (!CompileDatBlocks_EnterByte(0)) // obj_ptr gets incremented in here + { + return false; + } + } + + return true; +} + +bool CompileDatBlocks_Data(bool& bEof, int pass, bool bSymbol, bool& bResSymbol, int& size) +{ + size = g_pElementizer->GetValue() & 0x000000FF; + int overrideSize = size; + + if (!CompileDatBlocks_Advance(bSymbol, bResSymbol, size)) + { + return false; + } + + if (!g_pElementizer->GetNext(bEof)) + { + return false; + } + if (g_pElementizer->GetType() == type_end) + { + return true; + } + + while (!bEof) + { + // do we have a size override? + if (g_pElementizer->GetType() == type_size) + { + // yes, get it + overrideSize = g_pElementizer->GetValue() & 0x000000FF; + if (overrideSize < size) + { + g_pCompilerData->error = true; + g_pCompilerData->error_msg = g_pErrorStrings[error_sombl]; + return false; + } + } + else + { + // no, backup + g_pElementizer->Backup(); + } + + // get the value + if (!GetTryValue(pass == 1 ? true : false, overrideSize == 2 ? false : true, true)) + { + return false; + } + int value = GetResult(); + + // get the count + int count = 1; + if (g_pElementizer->CheckElement(type_leftb)) + { + if (!GetTryValue(true, true, true)) + { + return false; + } + count = GetResult(); + if (!g_pElementizer->GetElement(type_rightb)) + { + return false; + } + } + + // enter the value count times into the obj + if (!CompileDatBlocks_Enter(value, count, overrideSize)) + { + return false; + } + + bool bComma = false; + if (!GetCommaOrEnd(bComma)) + { + return false; + } + if (!bComma) + { + break; + } + + if (!g_pElementizer->GetNext(bEof)) + { + return false; + } + } + + return true; +} + +bool CompileDatBlocks_File(bool bSymbol, bool bResSymbol, int& size) +{ + size = 0; // force size to byte + if (bSymbol) + { + CompileDatBlocks_EnterSymbol(bResSymbol, size); + } + + int filenameStart = 0; + int filenameFinish = 0; + if (!GetFilename(filenameStart, filenameFinish)) + { + return false; + } + + // find the file in the dat_data array and copy it into obj + for (int i = 0; i < g_pCompilerData->dat_files; i++) + { + if (strcmp(&(g_pCompilerData->dat_filenames[256*i]), g_pCompilerData->filename) == 0) + { + // copy dat data into obj (RPE: this should be optimized) + for (int j = 0; j < g_pCompilerData->dat_lengths[i]; j++) + { + if (!CompileDatBlocks_EnterByte(g_pCompilerData->dat_data[g_pCompilerData->dat_offsets[i] + j])) + { + return false; + } + } + if (!g_pElementizer->GetElement(type_end)) + { + return false; + } + return true; + } + } + + // file data not found + g_pCompilerData->error = true; + g_pCompilerData->error_msg = g_pErrorStrings[error_idfnf]; + return false; +} + +bool CompileDatBlocks_AsmDirective(bool bSymbol, bool& bResSymbol, int& size) +{ + size = 2; // force to long size + + int directive = g_pElementizer->GetValue() & 0x000000FF; + switch (directive) + { + case dir_nop: + { + if (!CompileDatBlocks_Advance(bSymbol, bResSymbol, size)) + { + return false; + } + if (!g_pElementizer->GetElement(type_end)) + { + return false; + } + if (!CompileDatBlocks_Enter(0, 1, 2)) // enter a 0 long + { + return false; + } + return true; + } + break; + case dir_fit: + { + if (!CompileDatBlocks_Advance(bSymbol, bResSymbol, size)) + { + return false; + } + int fit = 0x1F0; + if (!g_pElementizer->CheckElement(type_end)) + { + if (!GetTryValue(true, true, true)) + { + return false; + } + fit = GetResult(); + if (!g_pElementizer->GetElement(type_end)) + { + return false; + } + } + fit <<= 2; + if ((unsigned int)(g_pCompilerData->cog_org) > (unsigned int)fit) + { + g_pCompilerData->error = true; + g_pCompilerData->error_msg = g_pErrorStrings[error_oefl]; + return false; + } + return true; + } + break; + case dir_res: + { + if (g_pCompilerData->orgx != 0) + { + g_pCompilerData->error = true; + g_pCompilerData->error_msg = g_pErrorStrings[error_rinaiom]; + return false; + } + bResSymbol = true; + if (!CompileDatBlocks_Advance(bSymbol, bResSymbol, size)) + { + return false; + } + int resSize = 1; + if (!g_pElementizer->CheckElement(type_end)) + { + if (!GetTryValue(true, true, true)) + { + return false; + } + resSize = GetResult(); + if (!g_pElementizer->GetElement(type_end)) + { + return false; + } + } + resSize <<= 2; + g_pCompilerData->cog_org += resSize; + if (g_pCompilerData->cog_org > (0x1F0 * 4)) + { + g_pCompilerData->error = true; + g_pCompilerData->error_msg = g_pErrorStrings[error_oexl]; + return false; + } + return true; + } + break; + case dir_org: + { + if (!CompileDatBlocks_Advance(bSymbol, bResSymbol, size)) + { + return false; + } + int newOrg = 0; + if (!g_pElementizer->CheckElement(type_end)) + { + if (!GetTryValue(true, true, true)) + { + return false; + } + newOrg = GetResult(); + if (!g_pElementizer->GetElement(type_end)) + { + return false; + } + } + if (newOrg > 0x1F0) + { + g_pCompilerData->error = true; + g_pCompilerData->error_msg = g_pErrorStrings[error_oexl]; + return false; + } + g_pCompilerData->cog_org = newOrg << 2; + g_pCompilerData->orgx = 0; + return true; + } + break; + } + + if (!CompileDatBlocks_Advance(bSymbol, bResSymbol, size)) + { + return false; + } + if (!g_pElementizer->GetElement(type_end)) + { + return false; + } + g_pCompilerData->cog_org = 0; + g_pCompilerData->orgx = 1; + return true; +} + +bool CompileDatBlocks_ValidateCallSymbol(bool bIsRet, char* pSymbol) +{ + if (!g_pElementizer->FindSymbol(pSymbol)) + { + g_pCompilerData->error = true; + g_pCompilerData->error_msg = g_pErrorStrings[error_eads]; + return false; + } + if (g_pElementizer->GetType() == type_undefined) + { + g_pCompilerData->error = true; + g_pCompilerData->error_msg = g_pErrorStrings[bIsRet ? error_urs : error_us]; + return false; + } + if (g_pElementizer->GetType() < type_dat_byte || g_pElementizer->GetType() > type_dat_long_res) + { + g_pCompilerData->error = true; + g_pCompilerData->error_msg = g_pErrorStrings[error_eads]; + return false; + } + + // the offset to the label symbol is in second symbol value + int value = g_pElementizer->GetValue2(); + + // make sure it's long aligned + if (value & 0x03) + { + g_pCompilerData->error = true; + g_pCompilerData->error_msg = g_pErrorStrings[bIsRet ? error_rainl : error_ainl]; + return false; + } + // make sure is in range + value >>= 2; + if (value >= 0x1F0) + { + g_pCompilerData->error = true; + g_pCompilerData->error_msg = g_pErrorStrings[bIsRet ? error_raioor : error_aioor]; + return false; + } + + return true; +} + +bool CompileDatBlocks_AsmInstruction(bool& bEof, int pass, bool bSymbol, bool bResSymbol, int& size, unsigned char condition) +{ + size = 2; // force to long size + if (!CompileDatBlocks_Advance(bSymbol, bResSymbol, size)) + { + return false; + } + + int opcode = g_pElementizer->GetValue() & 0x000000FF; + // handle dual type entries and also AND and OR (which are the only type_binary that will get here) + if (g_pElementizer->IsDual() || g_pElementizer->GetType() == type_binary) + { + opcode = g_pElementizer->GetAsm() & 0x000000FF; + } + + unsigned int instruction = opcode << 8; + + if (opcode & 0x80) // sys instruction + { + instruction = 0x03 << 8; + } + + instruction |= condition; + + if (opcode & 0x40) // set WR? + { + instruction |= 0x20; + } + + instruction <<= 18; // justify the instruction (s & d will go in lower 18 bits) + + if (opcode & 0x80) // sys instruction + { + instruction |= 0x00400000; // set immediate + instruction |= (opcode & 0x07); // set s + + // get d + if (!GetTryValue(pass == 1 ? true : false, true, true)) + { + return false; + } + int d = GetResult(); + if (d > 0x1FF) + { + g_pCompilerData->error = true; + g_pCompilerData->error_msg = g_pErrorStrings[error_drcex]; + return false; + } + instruction |= (d << 9); // set d + } + else if (opcode == 0x15) // call? + { + // make 'jmpret label_ret, #label' + instruction ^= 0x08C00000; + if (!g_pElementizer->GetElement(type_pound)) + { + return false; + } + int length = 0; + if (!GetSymbol(&length)) + { + return false; + } + if (length > 0) + { + if (length > symbol_limit - 4) + { + g_pCompilerData->error = true; + g_pCompilerData->error_msg = g_pErrorStrings[error_csmnexc]; + return false; + } + char* pSymbol = g_pElementizer->GetCurrentSymbol(); + if (pass == 1) + { + if (!CompileDatBlocks_ValidateCallSymbol(false, pSymbol)) + { + return false; + } + } + instruction |= ((g_pElementizer->GetValue2() & 0x7FF) >> 2); // set #label + + pSymbol[length] = '_'; + pSymbol[length+1] = 'R'; + pSymbol[length+2] = 'E'; + pSymbol[length+3] = 'T'; + pSymbol[length+4] = 0; + if (pass == 1) + { + if (!CompileDatBlocks_ValidateCallSymbol(true, pSymbol)) + { + return false; + } + } + instruction |= (((g_pElementizer->GetValue2() & 0x7FF) >> 2) << 9); // set label_ret + } + else + { + g_pCompilerData->error = true; + g_pCompilerData->error_msg = g_pErrorStrings[error_eads]; + return false; + } + } + else if (opcode == 0x16) // ret? + { + instruction ^= 0x04400000; // make 'jmp #0' + } + else if (opcode == 0x17) // jmp? + { + // for jmp, we only get s, there is no d + + // see if it's an immediate value for s + if (!g_pElementizer->GetNext(bEof)) + { + return false; + } + if (g_pElementizer->GetType() == type_pound) + { + instruction |= 0x00400000; + } + else + { + g_pElementizer->Backup(); + } + + // get s + if (!GetTryValue(pass == 1 ? true : false, true, true)) + { + return false; + } + int s = GetResult(); + + // make sure it's in range + if (s > 0x1FF) + { + g_pCompilerData->error = true; + g_pCompilerData->error_msg = g_pErrorStrings[error_srccex]; + return false; + } + + // set s on instruction + instruction |= s; + } + else // regular instruction get both d and s + { + // get d + if (!GetTryValue(pass == 1 ? true : false, true, true)) + { + return false; + } + int d = GetResult(); + + // make sure it's in range + if (d > 0x1FF) + { + g_pCompilerData->error = true; + g_pCompilerData->error_msg = g_pErrorStrings[error_drcex]; + return false; + } + + // set d on instruction + instruction |= (d << 9); + + if (!g_pElementizer->GetElement(type_comma)) + { + return false; + } + + // see if it's an immediate value for s + if (!g_pElementizer->GetNext(bEof)) + { + return false; + } + if (g_pElementizer->GetType() == type_pound) + { + instruction |= 0x00400000; + } + else + { + g_pElementizer->Backup(); + } + + // get s + if (!GetTryValue(pass == 1 ? true : false, true, true)) + { + return false; + } + int s = GetResult(); + + // make sure it's in range + if (s > 0x1FF) + { + g_pCompilerData->error = true; + g_pCompilerData->error_msg = g_pErrorStrings[error_srccex]; + return false; + } + + // set s on instruction + instruction |= s; + } + + // check for effects + bool bAfterComma = false; + while (!bEof) + { + if (!g_pElementizer->GetNext(bEof)) + { + return false; + } + if (g_pElementizer->GetType() == type_asm_effect) + { + int effectValue = g_pElementizer->GetValue(); + + // don't allow wr/nr for r/w instructions + if ((effectValue & 0x09) && (instruction >> 26) <= 2) + { + g_pCompilerData->error = true; + g_pCompilerData->error_msg = g_pErrorStrings[error_micuwn]; + return false; + } + + // apply effect to instruction + int temp = (effectValue & 0x38) << 20; + instruction |= temp; + instruction ^= temp; + instruction |= ((effectValue & 0x07) << 23); + + bool bComma = false; + if (!GetCommaOrEnd(bComma)) + { + return false; + } + if (!bComma) + { + // got end, done with effects + break; + } + + // got a comma, expecting another effect + bAfterComma = true; + } + else if (bAfterComma) + { + // expected another effect after the comma + g_pCompilerData->error = true; + g_pCompilerData->error_msg = g_pErrorStrings[error_eaasme]; + return false; + } + else if (g_pElementizer->GetType() != type_end) + { + // if it wasn't an effect the first time in then it should be an end + g_pCompilerData->error = true; + g_pCompilerData->error_msg = g_pErrorStrings[error_eaaeoeol]; + return false; + } + else + { + // we get here if we got no effect and got the proper end + break; + } + } + // enter instruction as 1 long + if (!CompileDatBlocks_Enter(instruction, 1, 2)) + { + return false; + } + + return true; +} + +bool CompileDatBlocks_CheckInstruction() +{ + if (g_pElementizer->GetType() == type_asm_inst || g_pElementizer->IsDual()) + { + return true; + } + if (g_pElementizer->GetType() == type_binary) + { + if (g_pElementizer->GetOpType() == op_log_and || g_pElementizer->GetOpType() == op_log_or) + { + return true; + } + } + return false; +} + +bool CompileDatBlocks_AsmCondition(bool& bEof, int pass, bool bSymbol, bool bResSymbol, int& size) +{ + unsigned char condition = (unsigned char)(g_pElementizer->GetValue() & 0x000000FF); + if (!g_pElementizer->GetNext(bEof)) + { + return false; + } + if (CompileDatBlocks_CheckInstruction()) + { + return CompileDatBlocks_AsmInstruction(bEof, pass, bSymbol, bResSymbol, size, condition); + } + + g_pCompilerData->error = true; + g_pCompilerData->error_msg = g_pErrorStrings[error_eaasmi]; + return false; +} + +bool CompileDatBlocks() +{ + int infoflag = 0; + int ptr = g_pCompilerData->obj_ptr; + int datstart = 0; + int objstart = 0; + + for (int pass = 0; pass < 2; pass++) + { + g_pCompilerData->obj_ptr = ptr; + g_pCompilerData->asm_local = 0; + g_pCompilerData->cog_org = 0; + g_pCompilerData->orgx = 0; + int size = 0; + + bool bEof = false; + g_pElementizer->Reset(); + + while(!bEof) + { + if(g_pElementizer->GetNextBlock(block_dat, bEof)) + { + if (bEof) + { + break; + } + + datstart = g_pCompilerData->source_start; + objstart = g_pCompilerData->obj_ptr; + + while (!bEof) + { + if (!g_pElementizer->GetNext(bEof)) + { + return false; + } + if (bEof) + { + break; + } + infoflag = 1; + if (g_pElementizer->GetType() == type_end) + { + continue; + } + + g_pCompilerData->inf_start = g_pCompilerData->source_start; + + // clear symbol flags + bool bLocal = false; + bool bSymbol = false; + bool bResSymbol = false; + + if (!CheckLocal(bLocal)) // bLocal will be set if it is a local + { + return false; + } + + g_pCompilerData->inf_finish = g_pCompilerData->source_finish; + + if (g_pElementizer->GetType() == type_undefined) // undefined here means it's a symbol + { + if (!bLocal) + { + if (!IncrementAsmLocal()) + { + return false; + } + } + + bSymbol = true; + g_pElementizer->BackupSymbol(); + + if (!g_pElementizer->GetNext(bEof)) + { + return false; + } + if (g_pElementizer->GetType() == type_end) + { + if (bSymbol) + { + CompileDatBlocks_EnterSymbol(bResSymbol, size); + } + continue; + } + } + else if (g_pElementizer->GetType() == type_dat_byte || + g_pElementizer->GetType() == type_dat_word || + g_pElementizer->GetType() == type_dat_long || + g_pElementizer->GetType() == type_dat_long_res) + { + if (!bLocal) + { + if (!IncrementAsmLocal()) + { + return false; + } + } + if (pass == 0) + { + g_pCompilerData->error = true; + g_pCompilerData->error_msg = g_pErrorStrings[error_siad]; + return false; + } + if (!g_pElementizer->GetNext(bEof)) + { + return false; + } + if (g_pElementizer->GetType() == type_end) + { + continue; + } + } + + if (g_pElementizer->GetType() == type_size) + { + if (!CompileDatBlocks_Data(bEof, pass, bSymbol, bResSymbol, size)) + { + return false; + } + continue; + } + else if (g_pElementizer->GetType() == type_file) + { + if (!CompileDatBlocks_File(bSymbol, bResSymbol, size)) + { + return false; + } + continue; + } + else if (g_pElementizer->GetType() == type_asm_dir) + { + if (!CompileDatBlocks_AsmDirective(bSymbol, bResSymbol, size)) + { + return false; + } + continue; + } + else if (g_pElementizer->GetType() == type_asm_cond) + { + if (!CompileDatBlocks_AsmCondition(bEof, pass, bSymbol, bResSymbol, size)) + { + return false; + } + continue; + } + else if (CompileDatBlocks_CheckInstruction()) + { + if (!CompileDatBlocks_AsmInstruction(bEof, pass, bSymbol, bResSymbol, size, if_always)) + { + return false; + } + continue; + } + + if (g_pElementizer->GetType() == type_block) + { + g_pElementizer->Backup(); + if (pass == 0) + { + CompileDatBlocks_EnterInfo(datstart, objstart); + } + break; + } + else + { + g_pCompilerData->error = true; + g_pCompilerData->error_msg = g_pErrorStrings[error_eaunbwlo]; + return false; + } + } + } + else + { + return false; + } + } + + if (infoflag != 0 && pass == 0) + { + CompileDatBlocks_EnterInfo(datstart, objstart); + } + } + return true; +} + +/////////////////////////////////////////////////////////////////////////////////////////// +// TERMS OF USE: MIT License // +/////////////////////////////////////////////////////////////////////////////////////////// +// Permission is hereby granted, free of charge, to any person obtaining a copy of this // +// software and associated documentation files (the "Software"), to deal in the Software // +// without restriction, including without limitation the rights to use, copy, modify, // +// merge, publish, distribute, sublicense, and/or sell copies of the Software, and to // +// permit persons to whom the Software is furnished to do so, subject to the following // +// conditions: // +// // +// The above copyright notice and this permission notice shall be included in all copies // +// or substantial portions of the Software. // +// // +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, // +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A // +// PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT // +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE // +// SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // +/////////////////////////////////////////////////////////////////////////////////////////// diff --git a/Tools/unix/OpenSpin/PropellerCompiler/CompileExpression.cpp b/Tools/unix/OpenSpin/PropellerCompiler/CompileExpression.cpp new file mode 100644 index 00000000..6d38cfb9 --- /dev/null +++ b/Tools/unix/OpenSpin/PropellerCompiler/CompileExpression.cpp @@ -0,0 +1,755 @@ +////////////////////////////////////////////////////////////// +// // +// Propeller Spin/PASM Compiler // +// (c)2012-2016 Parallax Inc. DBA Parallax Semiconductor. // +// Adapted from Chip Gracey's x86 asm code by Roy Eltham // +// See end of file for terms of use. // +// // +////////////////////////////////////////////////////////////// +// +// CompileExpression.cpp +// + +#include +#include +#include +#include +#include "Utilities.h" +#include "PropellerCompilerInternal.h" +#include "SymbolEngine.h" +#include "Elementizer.h" +#include "ErrorStrings.h" +#include "CompileUtilities.h" + +// +//************************************************************************ +//* Expression Compiler * +//************************************************************************ +// +// Basic expression syntax rules: i.e. 4000/(||x*5)//127)+1 +// +// Any one of these... Must be followed by any one of these... +// ------------------------------------------------------------------ +// term binary operator +// ) ) +// +// +// Any one of these... Must be followed by any one of these... * +// ------------------------------------------------------------------ +// unary operator term +// binary operator unary operator +// ( ( +// +// * initial element of an expression +// + +// forward declarations +bool CompileTerm(); +bool CompileSubExpression(int precedence); +bool CompileTopExpression(); + +// Compile expression with sub-expressions +bool CompileExpression() +{ + if (!CompileTopExpression()) + { + return false; + } + return true; +} + +bool CompileTopExpression() +{ + if (!CompileSubExpression(11)) + { + return false; + } + return true; +} + +bool CompileSubExpression_Term() +{ + // get next element ignoring any leading +'s + bool bEof = false; + do + { + if (!g_pElementizer->GetNext(bEof)) + { + return false; + } + } while (g_pElementizer->GetType() == type_binary && g_pElementizer->GetOpType() == op_add); + + if (!g_pElementizer->NegConToCon()) + { + return false; + } + g_pElementizer->SubToNeg(); + + int opType = g_pElementizer->GetOpType(); + + switch (g_pElementizer->GetType()) + { + case type_atat: + if (!CompileSubExpression(0)) + { + return false; + } + if (!EnterObj(0x97)) // memop byte+index+pbase+address + { + return false; + } + if (!EnterObj(0)) // address 0 + { + return false; + } + break; + + case type_unary: + if (!CompileSubExpression(g_pElementizer->GetValue())) // value = precedence for type_unary + { + return false; + } + if (!EnterObj((unsigned char)opType | 0xE0)) // math + { + return false; + } + break; + + case type_left: + if (!CompileTopExpression()) + { + return false; + } + if (!g_pElementizer->GetElement(type_right)) + { + return false; + } + break; + + default: + if (!CompileTerm()) + { + return false; + } + break; + } + return true; +} + +bool CompileSubExpression(int precedence) +{ + precedence--; + if (precedence < 0) + { + if (!CompileSubExpression_Term()) + { + return false; + } + return true; + } + else + { + if (!CompileSubExpression(precedence)) + { + return false; + } + } + + for (;;) + { + bool bEof = false; + if (!g_pElementizer->GetNext(bEof)) + { + return false; + } + if (g_pElementizer->GetType() != type_binary) + { + g_pElementizer->Backup(); + break; + } + // if we got here then it's type_binary (so the value is the precedence) + if (g_pElementizer->GetValue() != precedence) + { + g_pElementizer->Backup(); + break; + } + int opType = g_pElementizer->GetOpType(); + if (!CompileSubExpression(precedence)) + { + return false; + } + if (!EnterObj((unsigned char)(opType | 0xE0))) + { + return false; + } + } + + return true; +} + +//////////////////////////////////////////////////////////////// + +// +// CompileTerm functions +// + +// compile constant(constantexpression) +bool CompileTerm_ConExp() +{ + if (!g_pElementizer->GetElement(type_left)) + { + return false; + } + if (!GetTryValue(true, false)) + { + return false; + } + if (!CompileConstant(GetResult())) + { + return false; + } + return g_pElementizer->GetElement(type_right); +} + +// compile string("constantstring") +bool CompileTerm_ConStr() +{ + if (g_pCompilerData->str_enable == false) + { + g_pCompilerData->error = true; + g_pCompilerData->error_msg = g_pErrorStrings[error_snah]; + return false; + } + if (!g_pElementizer->GetElement(type_left)) + { + return false; + } + if (!StringConstant_GetIndex()) // get index in g_pCompilerData->str_index + { + return false; + } + + // get the string into the string constant buffer + for (;;) + { + if (!GetTryValue(true, false)) + { + return false; + } + int value = GetResult(); + if (g_pCompilerData->intMode == 2 || value == 0 || value > 0xFF) + { + g_pCompilerData->error = true; + g_pCompilerData->error_msg = g_pErrorStrings[error_scmr]; + return false; + } + if (!StringConstant_EnterChar((unsigned char)(value & 0xFF))) // add character to string constant buffer + { + return false; + } + // more characters? + bool bComma = false; + if (!GetCommaOrRight(bComma)) + { + return false; + } + if (!bComma) + { + // got right ')' + break; + } + } + StringConstant_EnterChar(0); // enter 0 terminator into string constant buffer + + if (!EnterObj(0x87)) // (memcp byte+pbase+address) + { + return false; + } + + StringConstant_EnterPatch(); // enter string constant patch address + + // enter two address bytes (patched later) + if (!EnterObj(0x80)) + { + return false; + } + return EnterObj(0); +} + +// compile float(integer)/round(float)/trunc(float) +bool CompileTerm_FloatRoundTrunc() +{ + g_pElementizer->Backup(); // backup to float/round/trunc + + if (!GetTryValue(true, false)) + { + return false; + } + return CompileConstant(GetResult()); +} + +bool CompileTerm_Sub(unsigned char anchor, int value) +{ + if (!EnterObj(anchor)) // drop anchor + { + return false; + } + if (!CompileParameters((value & 0x0000FF00) >> 8)) + { + return false; + } + if (!EnterObj(0x05)) // call sub + { + return false; + } + return EnterObj((unsigned char)(value & 0xFF)); // index of sub +} + +// compile obj[].pub +bool CompileTerm_ObjPub(unsigned char anchor, int value) +{ + if (!EnterObj(anchor)) // drop anchor + { + return false; + } + + // check for [index] + bool bIndex = false; + int expSourcePtr = 0; + if (!CheckIndex(bIndex, expSourcePtr)) + { + return false; + } + + if (!g_pElementizer->GetElement(type_dot)) + { + return false; + } + + // lookup the pub symbol + if (!GetObjSymbol(type_objpub, (char)((value & 0x0000FF00) >> 8))) + { + return false; + } + + int objPubValue = g_pElementizer->GetValue(); + + // compile any parameters the pub has + if (!CompileParameters((objPubValue & 0x0000FF00) >> 8)) + { + return false; + } + + unsigned char byteCode = 0x06; // call obj.pub + if (bIndex) + { + if (!CompileOutOfSequenceExpression(expSourcePtr)) + { + return false; + } + byteCode = 0x07; // call obj[].pub + } + if (!EnterObj(byteCode)) + { + return false; + } + + if (!EnterObj((unsigned char)(value & 0xFF))) // index of obj + { + return false; + } + return EnterObj((unsigned char)(objPubValue & 0xFF)); // index of objpub +} + +// compile obj[].pub\obj[]#con +bool CompileTerm_ObjPubCon(int value) +{ + if (!g_pElementizer->CheckElement(type_pound)) // check for obj#con + { + // not obj#con, so do obj[].pub + return CompileTerm_ObjPub(0, value); + } + // lookup the symbol to get the value to compile + if (!GetObjSymbol(type_objcon, (char)((value & 0x0000FF00) >> 8))) + { + return false; + } + return CompileConstant(g_pElementizer->GetValue()); +} + +// compile \sub or \obj +bool CompileTerm_Try(unsigned char anchor) +{ + bool bEof = false; + if (!g_pElementizer->GetNext(bEof)) + { + return false; + } + if (g_pElementizer->GetType() == type_sub) + { + return CompileTerm_Sub(anchor, g_pElementizer->GetValue()); + } + else if (g_pElementizer->GetType() == type_obj) + { + return CompileTerm_ObjPub(anchor, g_pElementizer->GetValue()); + } + + g_pCompilerData->error = true; + g_pCompilerData->error_msg = g_pErrorStrings[error_easoon]; + return false; +} + +bool CompileLook(int column, int param) +{ + column = column; // stop warning + + param &= 0xFF; // we only care about the bottom byte + + unsigned char byteCode = 0x35; // constant 0 + if (param < 0x80) // zero based? + { + byteCode += 1; // not, so make it a constant 1 + } + if (!EnterObj(byteCode)) + { + return false; + } + + if (!BlockStack_CompileConstant()) // enter address constant + { + return false; + } + + if (!g_pElementizer->GetElement(type_left)) + { + return false; + } + if (!CompileExpression()) // compile primary value + { + return false; + } + if (!g_pElementizer->GetElement(type_colon)) + { + return false; + } + + for (;;) + { + bool bRange = false; + if (!CompileRange(bRange)) // compile (next) value/range + { + return false; + } + byteCode = (unsigned char)param; + if (bRange) + { + byteCode |= 2; + } + if (!EnterObj(byteCode & 0x7F)) + { + return false; + } + bool bComma = false; + if (!GetCommaOrRight(bComma)) + { + return false; + } + if (!bComma) + { + break; + } + } + + if (!EnterObj(0x0F)) // lookdone + { + return false; + } + + BlockStack_Write(0, g_pCompilerData->obj_ptr); // set address + return true; +} + +// compile 'lookup'/'lookdown' +// this one compiles like a block (see InstructionBlockCompiler.cpp stuff) +bool CompileTerm_Look(int value) +{ + if (!BlockNest_New(type_i_look, 1)) + { + return false; + } + + if (!OptimizeBlock(0, value, &CompileLook)) + { + return false; + } + + BlockNest_End(); + return true; +} + +bool CompileTerm_ClkMode() +{ + if (!EnterObj(0x38)) // constant 4 + { + return false; + } + if (!EnterObj(4)) + { + return false; + } + return EnterObj(0x80); // read byte[] +} + +bool CompileTerm_ClkFreq() +{ + if (!EnterObj(0x35)) // constant 0 + { + return false; + } + return EnterObj(0xC0); // read long[] +} + +bool CompileTerm_ChipVer() +{ + if (!EnterObj(0x34)) // constant -1 + { + return false; + } + return EnterObj(0x80); // read byte[] +} + +bool CompileTerm_CogId() +{ + if (!EnterObj(0x3F)) // reg op + { + return false; + } + return EnterObj(0x89); // read id +} + +bool CompileTerm_Inst(int value) +{ + if (!CompileParameters((value & 0xFF) >> 6)) + { + return false; + } + return EnterObj((unsigned char)(value & 0x3F)); // instruction +} + +bool CompileTerm_CogNew(int value) +{ + // see if first param is a sub + if (!g_pElementizer->GetElement(type_left)) + { + return false; + } + bool bEof = false; + if (!g_pElementizer->GetNext(bEof)) + { + return false; + } + if (g_pElementizer->GetType() == type_sub) + { + int subConstant = g_pElementizer->GetValue(); + + if (!g_pCompilerData->bFinalCompile && g_pCompilerData->bUnusedMethodElimination) + { + AddCogNewOrInit(g_pCompilerData->current_filename, subConstant & 0x000000FF); + } + + // it is a sub, so compile as cognew(subname(params),stack) + if (!CompileParameters((g_pElementizer->GetValue() & 0x0000FF00) >> 8)) + { + return false; + } + if (!CompileConstant(subConstant)) + { + return false; + } + if (!g_pElementizer->GetElement(type_comma)) + { + return false; + } + if (!CompileExpression()) // compile stack expression + { + return false; + } + if (!g_pElementizer->GetElement(type_right)) + { + return false; + } + if (!EnterObj(0x15)) // run + { + return false; + } + return EnterObj((unsigned char)(value & 0x3F)); // coginit + } + + // it is not a sub, so backup and compile as cognew(address, parameter) + g_pElementizer->Backup(); + g_pElementizer->Backup(); + + if (!EnterObj(0x34)) // constant -1 + { + return false; + } + return CompileTerm_Inst(value); +} + +// compile @var +bool CompileTerm_At() +{ + unsigned char varType = 0; + unsigned char varSize = 0; + int varAddress = 0; + int varIndexSourcePtr = 0; + if (!GetVariable(varType, varSize, varAddress, varIndexSourcePtr)) + { + return false; + } + if (varType == type_reg || varType == type_spr) + { + g_pCompilerData->error = true; + g_pCompilerData->error_msg = g_pErrorStrings[error_eamvaa]; + return false; + } + return CompileVariable(3, 0, varType, varSize, varAddress, varIndexSourcePtr); +} + +bool CompileTerm() +{ + int type = g_pElementizer->GetType(); + int value = g_pElementizer->GetValue(); + + switch(type) + { + case type_con: + case type_con_float: + return CompileConstant(value); + case type_conexp: + return CompileTerm_ConExp(); + case type_constr: + return CompileTerm_ConStr(); + case type_float: + case type_round: + case type_trunc: + return CompileTerm_FloatRoundTrunc(); + case type_back: + return CompileTerm_Try(0x02); + case type_sub: + return CompileTerm_Sub(0, value); + case type_obj: + return CompileTerm_ObjPubCon(value); + case type_i_look: + return CompileTerm_Look(value); + case type_i_clkmode: + return CompileTerm_ClkMode(); + case type_i_clkfreq: + return CompileTerm_ClkFreq(); + case type_i_chipver: + return CompileTerm_ChipVer(); + case type_i_cogid: + return CompileTerm_CogId(); + case type_i_cognew: + return CompileTerm_CogNew(value); + case type_i_ar: // instruction always-returns + case type_i_cr: // instruction can-return + return CompileTerm_Inst(value); + case type_at: // @var + return CompileTerm_At(); + case type_inc: // assign pre-inc w/push ++var + return CompileVariable_PreIncOrDec(0xA0); + case type_dec: // assign pre-dec w/push --var + return CompileVariable_PreIncOrDec(0xB0); + case type_til: // assign sign-extern byte w/push ~var + return CompileVariable_PreSignExtendOrRandom(0x90); + case type_tiltil: // assign sign-extern word w/push ~~var + return CompileVariable_PreSignExtendOrRandom(0x94); + case type_rnd: // assign random forward w/push ?var + return CompileVariable_PreSignExtendOrRandom(0x88); + } + + unsigned char varType = 0; + unsigned char varSize = 0; + int varAddress = 0; + int varIndexSourcePtr = 0; + bool bVariable = false; + if (!CheckVariable(bVariable, varType, varSize, varAddress, varIndexSourcePtr)) + { + return false; + } + if (!bVariable) + { + g_pCompilerData->error = true; + g_pCompilerData->error_msg = g_pErrorStrings[error_eaet]; + return false; + } + + // check for post-var modifier + bool bEof = false; + if (!g_pElementizer->GetNext(bEof)) + { + return false; + } + type = g_pElementizer->GetType(); + switch (type) + { + case type_inc: // assign post-inc w/push var++ + return CompileVariable_IncOrDec(0xA8, varType, varSize, varAddress, varIndexSourcePtr); + case type_dec: // assign post-dec w/push var-- + return CompileVariable_IncOrDec(0xB8, varType, varSize, varAddress, varIndexSourcePtr); + case type_rnd: // assign random reverse w/push var? + return CompileVariable_Assign(0x8C, varType, varSize, varAddress, varIndexSourcePtr); + case type_til: // assign post-clear w/push var~ + return CompileVariable_Assign(0x98, varType, varSize, varAddress, varIndexSourcePtr); + case type_tiltil: // assign post-set w/push var~~ + return CompileVariable_Assign(0x9C, varType, varSize, varAddress, varIndexSourcePtr); + case type_assign: // assign write w/push var := + return CompileVariable_Expression(0x80, varType, varSize, varAddress, varIndexSourcePtr); + } + + unsigned char varOperator = 0x80; // assign write w/push + // var binaryop? + if (type == type_binary) + { + varOperator = 0xC0; // assign math w/swapargs w/push + varOperator |= (unsigned char)(g_pElementizer->GetOpType()); + + // check for '=' after binary op + if (!g_pElementizer->GetNext(bEof)) + { + return false; + } + if (g_pElementizer->GetType() == type_equal) + { + return CompileVariable_Expression(varOperator, varType, varSize, varAddress, varIndexSourcePtr); + } + else + { + g_pElementizer->Backup(); // not '=' so backup + } + } + g_pElementizer->Backup(); // no post-var modifier, so backup + return CompileVariable(0, varOperator, varType, varSize, varAddress, varIndexSourcePtr); +} + +/////////////////////////////////////////////////////////////////////////////////////////// +// TERMS OF USE: MIT License // +/////////////////////////////////////////////////////////////////////////////////////////// +// Permission is hereby granted, free of charge, to any person obtaining a copy of this // +// software and associated documentation files (the "Software"), to deal in the Software // +// without restriction, including without limitation the rights to use, copy, modify, // +// merge, publish, distribute, sublicense, and/or sell copies of the Software, and to // +// permit persons to whom the Software is furnished to do so, subject to the following // +// conditions: // +// // +// The above copyright notice and this permission notice shall be included in all copies // +// or substantial portions of the Software. // +// // +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, // +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A // +// PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT // +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE // +// SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // +/////////////////////////////////////////////////////////////////////////////////////////// diff --git a/Tools/unix/OpenSpin/PropellerCompiler/CompileInstruction.cpp b/Tools/unix/OpenSpin/PropellerCompiler/CompileInstruction.cpp new file mode 100644 index 00000000..2ccc4e92 --- /dev/null +++ b/Tools/unix/OpenSpin/PropellerCompiler/CompileInstruction.cpp @@ -0,0 +1,404 @@ +////////////////////////////////////////////////////////////// +// // +// Propeller Spin/PASM Compiler // +// (c)2012-2016 Parallax Inc. DBA Parallax Semiconductor. // +// Adapted from Chip Gracey's x86 asm code by Roy Eltham // +// See end of file for terms of use. // +// // +////////////////////////////////////////////////////////////// +// +// CompileInstruction.cpp +// + +#include +#include +#include +#include +#include "Utilities.h" +#include "PropellerCompilerInternal.h" +#include "SymbolEngine.h" +#include "Elementizer.h" +#include "ErrorStrings.h" +#include "CompileUtilities.h" + +// these are in CompileExpression.cpp +extern bool CompileTerm_Try(unsigned char anchor); +extern bool CompileTerm_Sub(unsigned char anchor, int value); +extern bool CompileTerm_ObjPub(unsigned char anchor, int value); +extern bool CompileTerm_CogNew(int value); +extern bool CompileTerm_Inst(int value); + +bool CompileInst_NextQuit(int value) +{ + int blockNestPtr = g_pCompilerData->bnest_ptr; + + unsigned char byteCode = 0; + int caseDepth = 0; + + // find repeat block + for (;;) + { + if (blockNestPtr == 0) + { + g_pCompilerData->error = true; + g_pCompilerData->error_msg = g_pErrorStrings[error_tioawarb]; + return false; + } + + unsigned char blockNestType = g_pCompilerData->bnest_type[blockNestPtr-1]; + + if (blockNestType == type_repeat) + { + byteCode = 0x04; // jmp 'quit' + break; + } + else if (blockNestType == type_repeat_count) + { + byteCode = 0x0B; // jnz 'quit' + break; + } + else if (blockNestType == type_if) + { + // ignore 'if' block nest(s) + } + else if (blockNestType == type_case) // allow nesting within 'case' block(s) + { + caseDepth += 8; // pop 2 longs for each nested 'case' + } + else + { + g_pCompilerData->error = true; + g_pCompilerData->error_msg = g_pErrorStrings[error_internal]; + return false; + } + blockNestPtr--; + } + + if (caseDepth > 0) + { + if (!CompileConstant(caseDepth)) // enter pop count + { + return false; + } + if (!EnterObj(0x14)) // pop + { + return false; + } + } + + int blockStackPtr = g_pCompilerData->bstack_base[blockNestPtr - 1]; + + if ((value & 0xFF) == 0) + { + // next + if (!EnterObj(0x04)) // jmp 'next' + { + return false; + } + return CompileAddress(g_pCompilerData->bstack[blockStackPtr]); + } + + // quit + if (!EnterObj(byteCode)) // jmp/jnz 'quit' + { + return false; + } + return CompileAddress(g_pCompilerData->bstack[blockStackPtr + 1]); +} + +bool CompileInst_AbortReturn(int value) +{ + // preview next element + bool bEof = false; + if (!g_pElementizer->GetNext(bEof)) + { + return false; + } + g_pElementizer->Backup(); + + if (g_pElementizer->GetType() != type_end) + { + // there's an expression, compile it + if (!CompileExpression()) + { + return false; + } + value |= 0x01; // +value + } + return EnterObj((unsigned char)(value & 0xFF)); +} + +bool CompileInst_Reboot() +{ + if (!EnterObj(0x37)) // constant 0x80 + { + return false; + } + if (!EnterObj(0x06)) + { + return false; + } + + if (!EnterObj(0x35)) // constant 0 + { + return false; + } + + return EnterObj(0x20); // clkset +} + +bool CompileInst_CogNew(int value) +{ + return CompileTerm_CogNew(value ^ 0x04); // no push +} + +bool CompileInst_CogInit(int value) +{ + int savedSourcePtr = g_pElementizer->GetSourcePtr(); + + if (!g_pElementizer->GetElement(type_left)) + { + return false; + } + int cogidSourcePtr = g_pElementizer->GetSourcePtr(); + if (!SkipExpression()) + { + return false; + } + if (!g_pElementizer->GetElement(type_comma)) + { + return false; + } + + // check for subroutine + bool bEof = false; + if (!g_pElementizer->GetNext(bEof)) + { + return false; + } + if (g_pElementizer->GetType() != type_sub) + { + // not subroutine, so backup + g_pElementizer->SetSourcePtr(savedSourcePtr); + + return CompileTerm_Inst(value); // compile assembly 'coginit' + } + + // compile subroutine 'cognew' (push params+index) + int subConstant = g_pElementizer->GetValue(); + + if (!g_pCompilerData->bFinalCompile && g_pCompilerData->bUnusedMethodElimination) + { + AddCogNewOrInit(g_pCompilerData->current_filename, subConstant & 0x000000FF); + } + + if (!CompileParameters((g_pElementizer->GetValue() & 0x0000FF00) >> 8)) + { + return false; + } + if (!CompileConstant(subConstant)) + { + return false; + } + if (!g_pElementizer->GetElement(type_comma)) + { + return false; + } + if (!CompileExpression()) // compile stack expression + { + return false; + } + if (!g_pElementizer->GetElement(type_right)) + { + return false; + } + if (!EnterObj(0x15)) // run + { + return false; + } + + // compile 'cogid' exp + if (!CompileOutOfSequenceExpression(cogidSourcePtr)) + { + return false; + } + + if (!EnterObj(0x3F)) // regop + { + return false; + } + if (!EnterObj(0x8F)) // read+dcurr + { + return false; + } + if (!EnterObj(0x37)) // constant mask + { + return false; + } + if (!EnterObj(0x61)) // -4 + { + return false; + } + if (!EnterObj(0xD1)) // write long[base][index] + { + return false; + } + return EnterObj(0x2C); // coginit +} + +bool CompileInst_InstCr(int value) +{ + return CompileTerm_Inst(value ^ 0x04); // no push +} + +bool CompileInst_Unary(int value) +{ + return CompileVariable_PreSignExtendOrRandom((unsigned char)(0x40 | (value & 0xFF))); +} + +bool CompileInst_Assign(unsigned char vOperator, unsigned char type, unsigned char size, int address, int indexSourcePtr) +{ + if (!CompileExpression()) + { + return false; + } + + return CompileVariable(1, vOperator, type, size, address, indexSourcePtr); +} + +bool CompileInstruction() +{ + int type = g_pElementizer->GetType(); + int value = g_pElementizer->GetValue(); + + switch(type) + { + case type_back: + return CompileTerm_Try(0x03); + case type_sub: + return CompileTerm_Sub(0x01, value); + case type_obj: + return CompileTerm_ObjPub(0x01, value); + case type_i_next_quit: + return CompileInst_NextQuit(value); + case type_i_abort_return: + return CompileInst_AbortReturn(value); + case type_i_reboot: + return CompileInst_Reboot(); + case type_i_cognew: + return CompileInst_CogNew(value); + case type_i_coginit: + return CompileInst_CogInit(value); + case type_i_cr: // instruction can-return + return CompileInst_InstCr(value); + case type_i_nr: // instruction never-return + return CompileTerm_Inst(value); + + case type_inc: // assign pre-inc ++var + return CompileVariable_PreIncOrDec(0x20); + case type_dec: // assign pre-dec --var + return CompileVariable_PreIncOrDec(0x30); + case type_til: // assign sign-extern byte ~var + return CompileVariable_PreSignExtendOrRandom(0x10); + case type_tiltil: // assign sign-extern word ~~var + return CompileVariable_PreSignExtendOrRandom(0x14); + case type_rnd: // assign random forward ?var + return CompileVariable_PreSignExtendOrRandom(0x08); + } + + g_pElementizer->SubToNeg(); + if (g_pElementizer->GetType() == type_unary) + { + return CompileInst_Unary(g_pElementizer->GetOpType()); + } + + unsigned char varType = 0; + unsigned char varSize = 0; + int varAddress = 0; + int varIndexSourcePtr = 0; + bool bVariable = false; + if (!CheckVariable(bVariable, varType, varSize, varAddress, varIndexSourcePtr)) + { + return false; + } + if (!bVariable) + { + g_pCompilerData->error = true; + g_pCompilerData->error_msg = g_pErrorStrings[error_eaiov]; + return false; + } + + // check for post-var modifier + bool bEof = false; + if (!g_pElementizer->GetNext(bEof)) + { + return false; + } + type = g_pElementizer->GetType(); + switch (type) + { + case type_inc: // assign post-inc + return CompileVariable_IncOrDec(0x28, varType, varSize, varAddress, varIndexSourcePtr); + case type_dec: // assign post-dec + return CompileVariable_IncOrDec(0x38, varType, varSize, varAddress, varIndexSourcePtr); + case type_rnd: // assign random reverse + return CompileVariable_Assign(0x0C, varType, varSize, varAddress, varIndexSourcePtr); + case type_til: // assign post-clear + return CompileVariable_Assign(0x18, varType, varSize, varAddress, varIndexSourcePtr); + case type_tiltil: // assign post-set + return CompileVariable_Assign(0x1C, varType, varSize, varAddress, varIndexSourcePtr); + case type_assign: + return CompileInst_Assign(0x1C, varType, varSize, varAddress, varIndexSourcePtr); + } + + // var binaryop? + if (type == type_binary) + { + unsigned char varOperator = 0x40; // assign math w/swapargs + varOperator |= (unsigned char)(g_pElementizer->GetOpType()); + + // check for '=' after binary op + if (!g_pElementizer->GetNext(bEof)) + { + return false; + } + if (g_pElementizer->GetType() == type_equal) + { + return CompileVariable_Expression(varOperator, varType, varSize, varAddress, varIndexSourcePtr); + } + else + { + g_pElementizer->Backup(); // not '=' so backup + } + } + g_pElementizer->Backup(); // no post-var modifier, so backup + + // error, so backup and reget variable for error display + g_pElementizer->Backup(); + g_pElementizer->GetNext(bEof); // this won't fail here, because it already succeeded above + + g_pCompilerData->error = true; + g_pCompilerData->error_msg = g_pErrorStrings[error_vnao]; + return false; +} + +/////////////////////////////////////////////////////////////////////////////////////////// +// TERMS OF USE: MIT License // +/////////////////////////////////////////////////////////////////////////////////////////// +// Permission is hereby granted, free of charge, to any person obtaining a copy of this // +// software and associated documentation files (the "Software"), to deal in the Software // +// without restriction, including without limitation the rights to use, copy, modify, // +// merge, publish, distribute, sublicense, and/or sell copies of the Software, and to // +// permit persons to whom the Software is furnished to do so, subject to the following // +// conditions: // +// // +// The above copyright notice and this permission notice shall be included in all copies // +// or substantial portions of the Software. // +// // +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, // +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A // +// PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT // +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE // +// SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // +/////////////////////////////////////////////////////////////////////////////////////////// diff --git a/Tools/unix/OpenSpin/PropellerCompiler/CompileSpin.cpp b/Tools/unix/OpenSpin/PropellerCompiler/CompileSpin.cpp new file mode 100644 index 00000000..b37d0aff --- /dev/null +++ b/Tools/unix/OpenSpin/PropellerCompiler/CompileSpin.cpp @@ -0,0 +1,768 @@ + /////////////////////////////////////////////////////////////// +// // +// Propeller Spin/PASM Compiler Command Line Tool 'OpenSpin' // +// (c)2012-2016 Parallax Inc. DBA Parallax Semiconductor. // +// See end of file for terms of use. // +// // +/////////////////////////////////////////////////////////////// +// +// CompileSpin.cpp +// + +#include +#include +#include + +#include "CompileSpin.h" +#include "PropellerCompiler.h" +#include "objectheap.h" +#include "textconvert.h" +#include "preprocess.h" +#include "Utilities.h" + +#define ObjFileStackLimit 16 +#define ListLimit 2000000 +#define DocLimit 2000000 + +static struct preprocess s_preprocessor; +CompilerData* s_pCompilerData = 0; +static int s_nObjStackPtr = 0; +static bool s_bFinalCompile; + +static CompilerConfig s_compilerConfig; +static LoadFileFunc s_pLoadFileFunc = 0; +static FreeFileBufferFunc s_pFreeFileBufferFunc = 0; +static unsigned char* s_pCompileResultBuffer = 0; + +static Heirarchy s_objectHeirarchy; + +class ObjectNode : public HeirarchyNode +{ +public: + char* m_pFullPath; + + ObjectNode() + : m_pFullPath(0) + { + } +}; + +static bool GetPASCIISource(char* pFilename) +{ + // read in file to temp buffer, convert to PASCII, and assign to s_pCompilerData->source + int nLength = 0; + char* pRawBuffer = s_pLoadFileFunc(pFilename, &nLength, &s_pCompilerData->current_file_path); + if (pRawBuffer) + { + char* pBuffer = 0; + if (s_compilerConfig.bUsePreprocessor) + { + memoryfile mfile; + mfile.buffer = pRawBuffer; + mfile.length = nLength; + mfile.readoffset = 0; + pp_push_file_struct(&s_preprocessor, &mfile, pFilename); + pp_run(&s_preprocessor); + pBuffer = pp_finish(&s_preprocessor); + nLength = (int)strlen(pBuffer); + if (nLength == 0) + { + free(pBuffer); + pBuffer = 0; + } + s_pFreeFileBufferFunc(pRawBuffer); + } + else + { + pBuffer = pRawBuffer; + } + + char* pPASCIIBuffer = new char[nLength+1]; + memset(pPASCIIBuffer, 0, nLength + 1); + if (!UnicodeToPASCII(pBuffer, nLength, pPASCIIBuffer, s_compilerConfig.bUsePreprocessor)) + { + printf("Unrecognized text encoding format!\n"); + delete [] pPASCIIBuffer; + if (s_compilerConfig.bUsePreprocessor) + { + free(pBuffer); + } + else + { + s_pFreeFileBufferFunc(pRawBuffer); + } + return false; + } + + // clean up any previous buffer + if (s_pCompilerData->source) + { + delete [] s_pCompilerData->source; + } + + s_pCompilerData->source = pPASCIIBuffer; + + if (s_compilerConfig.bUsePreprocessor) + { + free(pBuffer); + } + else + { + s_pFreeFileBufferFunc(pRawBuffer); + } + } + else + { + s_pCompilerData->source = NULL; + return false; + } + + return true; +} + +static void CleanupMemory(bool bUnusedMethodData = true) +{ + delete s_objectHeirarchy.m_pRoot; + s_objectHeirarchy.m_pRoot = 0; + + if ( s_pCompilerData ) + { + delete [] s_pCompilerData->list; + delete [] s_pCompilerData->doc; + delete [] s_pCompilerData->obj; + delete [] s_pCompilerData->source; + } + CleanObjectHeap(); + if (bUnusedMethodData) + { + CleanUpUnusedMethodData(); + } + Cleanup(); + if (s_pCompileResultBuffer != 0) + { + delete [] s_pCompileResultBuffer; + s_pCompileResultBuffer = 0; + } +} + +void PrintError(const char* pFilename, const char* pErrorString) +{ + int lineNumber = 1; + int column = 1; + int offsetToStartOfLine = -1; + int offsetToEndOfLine = -1; + int offendingItemStart = 0; + int offendingItemEnd = 0; + + GetErrorInfo(lineNumber, column, offsetToStartOfLine, offsetToEndOfLine, offendingItemStart, offendingItemEnd); + + printf("%s(%d:%d) : error : %s\n", pFilename, lineNumber, column, pErrorString); + + if ( offendingItemStart == offendingItemEnd && s_pCompilerData->source[offendingItemStart] == 0 ) + { + printf("Line:\nEnd Of File\nOffending Item: N/A\n"); + } + else + { + char* errorLine = 0; + char* errorItem = 0; + + if (offendingItemEnd - offendingItemStart > 0) + { + errorLine = new char[(offsetToEndOfLine - offsetToStartOfLine) + 1]; + strncpy(errorLine, &s_pCompilerData->source[offsetToStartOfLine], offsetToEndOfLine - offsetToStartOfLine); + errorLine[offsetToEndOfLine - offsetToStartOfLine] = 0; + } + + if (offendingItemEnd - offendingItemStart > 0) + { + errorItem = new char[(offendingItemEnd - offendingItemStart) + 1]; + strncpy(errorItem, &s_pCompilerData->source[offendingItemStart], offendingItemEnd - offendingItemStart); + errorItem[offendingItemEnd - offendingItemStart] = 0; + } + + printf("Line:\n%s\nOffending Item: %s\n", errorLine ? errorLine : "N/A", errorItem ? errorItem : "N/A"); + + delete [] errorLine; + delete [] errorItem; + } +} + +static bool CheckForCircularReference(ObjectNode* pObjectNode) +{ + ObjectNode* pCurrentNode = pObjectNode; + while (pCurrentNode->m_pParent) + { + ObjectNode* pParent = (ObjectNode*)(pCurrentNode->m_pParent); + if (strcmp(pObjectNode->m_pFullPath, pParent->m_pFullPath) == 0) + { + return true; + } + pCurrentNode = pParent; + } + + return false; +} + +static bool CompileRecursively(char* pFilename, int& nCompileIndex, ObjectNode* pParentNode) +{ + nCompileIndex++; + if (s_nObjStackPtr > 0 && (!s_compilerConfig.bQuiet || s_compilerConfig.bFileTreeOutputOnly)) + { + // only do this if UME is off or if it's the final compile when UME is on + if (!s_compilerConfig.bUnusedMethodElimination || s_pCompilerData->bFinalCompile) + { + char spaces[] = " \0"; + printf("%s|-%s\n", &spaces[32-(s_nObjStackPtr<<1)], pFilename); + } + } + s_nObjStackPtr++; + if (s_nObjStackPtr > ObjFileStackLimit) + { + printf("%s : error : Object nesting exceeds limit of %d levels.\n", pFilename, ObjFileStackLimit); + return false; + } + + void *definestate = 0; + if (s_compilerConfig.bUsePreprocessor) + { + definestate = pp_get_define_state(&s_preprocessor); + } + if (!GetPASCIISource(pFilename)) + { + printf("%s : error : Can not find/open file.\n", pFilename); + return false; + } + + if (!s_pCompilerData->bFinalCompile && s_compilerConfig.bUnusedMethodElimination) + { + AddObjectName(pFilename, nCompileIndex); + } + + strcpy(s_pCompilerData->current_filename, pFilename); + char* pExtension = strstr(s_pCompilerData->current_filename, ".spin"); + if (pExtension != 0) + { + *pExtension = 0; + } + + ObjectNode* pObjectNode = new ObjectNode(); + pObjectNode->m_pFullPath = s_pCompilerData->current_file_path; + pObjectNode->m_pParent = pParentNode; + s_objectHeirarchy.AddNode(pObjectNode, pParentNode); + if (CheckForCircularReference(pObjectNode)) + { + printf("%s : error : Illegal Circular Reference\n", pFilename); + return false; + } + + // first pass on object + const char* pErrorString = Compile1(); + if (pErrorString != 0) + { + PrintError(pFilename, pErrorString); + return false; + } + + if (s_pCompilerData->obj_files > 0) + { + char filenames[file_limit*256]; + + int numObjects = s_pCompilerData->obj_files; + for (int i = 0; i < numObjects; i++) + { + // copy the obj filename appending .spin if it doesn't have it. + strcpy(&filenames[i<<8], &(s_pCompilerData->obj_filenames[i<<8])); + if (strstr(&filenames[i<<8], ".spin") == NULL) + { + strcat(&filenames[i<<8], ".spin"); + } + } + + for (int i = 0; i < numObjects; i++) + { + if (!CompileRecursively(&filenames[i<<8], nCompileIndex, pObjectNode)) + { + return false; + } + } + + // redo first pass on parent object + if (s_compilerConfig.bUsePreprocessor) + { + // undo any defines in sub-objects + pp_restore_define_state(&s_preprocessor, definestate); + } + if (!GetPASCIISource(pFilename)) + { + printf("%s : error : Can not find/open file.\n", pFilename); + return false; + } + + strcpy(s_pCompilerData->current_filename, pFilename); + pExtension = strstr(s_pCompilerData->current_filename, ".spin"); + if (pExtension != 0) + { + *pExtension = 0; + } + pErrorString = Compile1(); + if (pErrorString != 0) + { + PrintError(pFilename, pErrorString); + return false; + } + + if (!CopyObjectsFromHeap(s_pCompilerData, filenames)) + { + printf("%s : error : Object files exceed 128k.\n", pFilename); + return false; + } + } + + // load all DAT files + if (s_pCompilerData->dat_files > 0) + { + int p = 0; + for (int i = 0; i < s_pCompilerData->dat_files; i++) + { + // Get DAT's Files + + // Get name information + char filename[256]; + strcpy(&filename[0], &(s_pCompilerData->dat_filenames[i<<8])); + + // Load file and add to dat_data buffer + s_pCompilerData->dat_lengths[i] = -1; + char* pFilePath = 0; + char* pBuffer = s_pLoadFileFunc(&filename[0], &s_pCompilerData->dat_lengths[i], &pFilePath); + + if (s_pCompilerData->dat_lengths[i] == -1) + { + s_pCompilerData->dat_lengths[i] = 0; + printf("Cannot find/open dat file: %s \n", &filename[0]); + return false; + } + if (p + s_pCompilerData->dat_lengths[i] > data_limit) + { + printf("%s : error : DAT files exceed 128k.\n", pFilename); + return false; + } + memcpy(&(s_pCompilerData->dat_data[p]), pBuffer, s_pCompilerData->dat_lengths[i]); + s_pFreeFileBufferFunc(pBuffer); + s_pCompilerData->dat_offsets[i] = p; + p += s_pCompilerData->dat_lengths[i]; + } + } + + // second pass of object + pErrorString = Compile2(); + if (pErrorString != 0) + { + PrintError(pFilename, pErrorString); + return false; + } + + // only do this check if UME is off or if it's the final compile when UME is on + if (!s_compilerConfig.bUnusedMethodElimination || s_pCompilerData->bFinalCompile) + { + // Check to make sure object fits into 32k (or eeprom size if specified as larger than 32k) + unsigned int i = 0x10 + s_pCompilerData->psize + s_pCompilerData->vsize + (s_pCompilerData->stack_requirement << 2); + if ((s_pCompilerData->compile_mode == 0) && (i > s_pCompilerData->eeprom_size)) + { + printf("%s : error : Object exceeds runtime memory limit by %d longs.\n", pFilename, (i - s_pCompilerData->eeprom_size) >> 2); + return false; + } + } + + // save this object in the heap + if (!AddObjectToHeap(pFilename, s_pCompilerData)) + { + printf("%s : error : Object Heap Overflow.\n", pFilename); + return false; + } + s_nObjStackPtr--; + + return true; +} + +static bool ComposeRAM(unsigned char** ppBuffer, int& bufferSize) +{ + if (!s_compilerConfig.bDATonly) + { + unsigned int varsize = s_pCompilerData->vsize; // variable size (in bytes) + unsigned int codsize = s_pCompilerData->psize; // code size (in bytes) + unsigned int pubaddr = *((unsigned short*)&(s_pCompilerData->obj[8])); // address of first public method + unsigned int publocs = *((unsigned short*)&(s_pCompilerData->obj[10])); // number of stack variables (locals), in bytes, for the first public method + unsigned int pbase = 0x0010; // base of object code + unsigned int vbase = pbase + codsize; // variable base = object base + code size + unsigned int dbase = vbase + varsize + 8; // data base = variable base + variable size + 8 + unsigned int pcurr = pbase + pubaddr; // Current program start = object base + public address (first public method) + unsigned int dcurr = dbase + 4 + (s_pCompilerData->first_pub_parameters << 2) + publocs; // current data stack pointer = data base + 4 + FirstParams*4 + publocs + + if (s_compilerConfig.bBinary) + { + // reset ram + *ppBuffer = new unsigned char[vbase]; + memset(*ppBuffer, 0, vbase); + bufferSize = vbase; + } + else + { + if (vbase + 8 > s_compilerConfig.eeprom_size) + { + printf("ERROR: eeprom size exceeded by %d longs.\n", (vbase + 8 - s_compilerConfig.eeprom_size) >> 2); + return false; + } + // reset ram + *ppBuffer = new unsigned char[s_compilerConfig.eeprom_size]; + memset(*ppBuffer, 0, s_compilerConfig.eeprom_size); + bufferSize = s_compilerConfig.eeprom_size; + (*ppBuffer)[dbase-8] = 0xFF; + (*ppBuffer)[dbase-7] = 0xFF; + (*ppBuffer)[dbase-6] = 0xF9; + (*ppBuffer)[dbase-5] = 0xFF; + (*ppBuffer)[dbase-4] = 0xFF; + (*ppBuffer)[dbase-3] = 0xFF; + (*ppBuffer)[dbase-2] = 0xF9; + (*ppBuffer)[dbase-1] = 0xFF; + } + + // set clock frequency and clock mode + *((int*)&((*ppBuffer)[0])) = s_pCompilerData->clkfreq; + (*ppBuffer)[4] = s_pCompilerData->clkmode; + + // set interpreter parameters + ((unsigned short*)&((*ppBuffer)[4]))[1] = (unsigned short)pbase; // always 0x0010 + ((unsigned short*)&((*ppBuffer)[4]))[2] = (unsigned short)vbase; + ((unsigned short*)&((*ppBuffer)[4]))[3] = (unsigned short)dbase; + ((unsigned short*)&((*ppBuffer)[4]))[4] = (unsigned short)pcurr; + ((unsigned short*)&((*ppBuffer)[4]))[5] = (unsigned short)dcurr; + + // set code + memcpy(&((*ppBuffer)[pbase]), &(s_pCompilerData->obj[4]), codsize); + + // install ram checksum byte + unsigned char sum = 0; + for (unsigned int i = 0; i < vbase; i++) + { + sum = sum + (*ppBuffer)[i]; + } + (*ppBuffer)[5] = (unsigned char)((-(sum+2028)) ); + } + else + { + unsigned int objsize = *((unsigned short*)&(s_pCompilerData->obj[4])); + if (s_pCompilerData->psize > 65535) + { + objsize = s_pCompilerData->psize; + } + unsigned int size = objsize - 4 - (s_pCompilerData->obj[7] * 4); + *ppBuffer = new unsigned char[size]; + bufferSize = size; + memcpy(&((*ppBuffer)[0]), &(s_pCompilerData->obj[8 + (s_pCompilerData->obj[7] * 4)]), size); + } + + return true; +} + +static void DumpSymbols() +{ + for (int i = 0; i < s_pCompilerData->info_count; i++) + { + char szTemp[256]; + szTemp[0] = '*'; + szTemp[1] = 0; + int length = 0; + int start = 0; + if (s_pCompilerData->info_type[i] == info_pub || s_pCompilerData->info_type[i] == info_pri) + { + length = s_pCompilerData->info_data3[i] - s_pCompilerData->info_data2[i]; + start = s_pCompilerData->info_data2[i]; + } + else if (s_pCompilerData->info_type[i] != info_dat && s_pCompilerData->info_type[i] != info_dat_symbol) + { + length = s_pCompilerData->info_finish[i] - s_pCompilerData->info_start[i]; + start = s_pCompilerData->info_start[i]; + } + + if (length > 0 && length < 256) + { + strncpy(szTemp, &s_pCompilerData->source[start], length); + szTemp[length] = 0; + } + + switch(s_pCompilerData->info_type[i]) + { + case info_con: + printf("CON, %s, %d\n", szTemp, s_pCompilerData->info_data0[i]); + break; + case info_con_float: + printf("CONF, %s, %f\n", szTemp, *((float*)&(s_pCompilerData->info_data0[i]))); + break; + case info_pub_param: + { + char szTemp2[256]; + szTemp2[0] = '*'; + szTemp2[1] = 0; + length = s_pCompilerData->info_data3[i] - s_pCompilerData->info_data2[i]; + start = s_pCompilerData->info_data2[i]; + if (length > 0 && length < 256) + { + strncpy(szTemp2, &s_pCompilerData->source[start], length); + szTemp2[length] = 0; + } + printf("PARAM, %s, %s, %d, %d\n", szTemp2, szTemp, s_pCompilerData->info_data0[i], s_pCompilerData->info_data1[i]); + } + break; + case info_pub: + printf("PUB, %s, %d, %d\n", szTemp, s_pCompilerData->info_data4[i] & 0xFFFF, s_pCompilerData->info_data4[i] >> 16); + break; + } + } +} + +static void DumpList() +{ + size_t listOffset = 0; + while (listOffset < s_pCompilerData->list_length) + { + char* pTemp = strstr(&(s_pCompilerData->list[listOffset]), "\r"); + if (pTemp) + { + *pTemp = 0; + } + printf("%s\n", &(s_pCompilerData->list[listOffset])); + if (pTemp) + { + *pTemp = 0x0D; + listOffset += (pTemp - &(s_pCompilerData->list[listOffset])) + 1; + } + else + { + listOffset += strlen(&(s_pCompilerData->list[listOffset])); + } + } +} + +static void DumpDoc() +{ + size_t docOffset = 0; + while (docOffset < s_pCompilerData->doc_length) + { + char* pTemp = strstr(&(s_pCompilerData->doc[docOffset]), "\r"); + if (pTemp) + { + *pTemp = 0; + } + printf("%s\n", &(s_pCompilerData->doc[docOffset])); + if (pTemp) + { + *pTemp = 0x0D; + docOffset += (pTemp - &(s_pCompilerData->doc[docOffset])) + 1; + } + else + { + docOffset += strlen(&(s_pCompilerData->doc[docOffset])); + } + } +} + + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +void InitCompiler(CompilerConfig* pCompilerConfig, LoadFileFunc pLoadFileFunc, FreeFileBufferFunc pFreeFileBufferFunc) +{ + s_nObjStackPtr = 0; + s_pCompilerData = 0; + s_bFinalCompile = false; + s_pCompileResultBuffer = 0; + + if (pCompilerConfig) + { + s_compilerConfig = *pCompilerConfig; + } + + s_pLoadFileFunc = pLoadFileFunc; + s_pFreeFileBufferFunc = pFreeFileBufferFunc; + + pp_setFileFunctions(pLoadFileFunc, pFreeFileBufferFunc); + pp_init(&s_preprocessor, s_compilerConfig.bAlternatePreprocessorMode); + pp_setcomments(&s_preprocessor, "\'", "{", "}"); +} + +void SetDefine(const char* pName, const char* pValue) +{ + pp_define(&s_preprocessor, pName, pValue); +} + +unsigned char* CompileSpin(char* pFilename, int* pnResultLength) +{ + *pnResultLength = 0; + + if (s_compilerConfig.bFileTreeOutputOnly) + { + printf("%s\n", pFilename); + } + + if (s_compilerConfig.bUnusedMethodElimination) + { + InitUnusedMethodData(); + } + + int nOriginalSize = 0; + +restart_compile: + s_pCompilerData = InitStruct(); + s_pCompilerData->bUnusedMethodElimination = s_compilerConfig.bUnusedMethodElimination; + s_pCompilerData->bFinalCompile = s_bFinalCompile; + + s_pCompilerData->list = new char[ListLimit]; + s_pCompilerData->list_limit = ListLimit; + memset(s_pCompilerData->list, 0, ListLimit); + + if (s_compilerConfig.bDocMode && !s_compilerConfig.bDATonly) + { + s_pCompilerData->doc = new char[DocLimit]; + s_pCompilerData->doc_limit = DocLimit; + memset(s_pCompilerData->doc, 0, DocLimit); + } + else + { + s_pCompilerData->doc = 0; + s_pCompilerData->doc_limit = 0; + } + s_pCompilerData->bDATonly = s_compilerConfig.bDATonly; + s_pCompilerData->bBinary = s_compilerConfig.bBinary; + s_pCompilerData->eeprom_size = s_compilerConfig.eeprom_size; + + // allocate space for obj based on eeprom size command line option + s_pCompilerData->obj_limit = s_compilerConfig.eeprom_size > min_obj_limit ? s_compilerConfig.eeprom_size : min_obj_limit; + s_pCompilerData->obj = new unsigned char[s_pCompilerData->obj_limit]; + + // copy filename into obj_title, and chop off the .spin + strcpy(s_pCompilerData->obj_title, pFilename); + char* pExtension = strstr(&s_pCompilerData->obj_title[0], ".spin"); + if (pExtension != 0) + { + *pExtension = 0; + } + + int nCompileIndex = 0; + if (!CompileRecursively(pFilename, nCompileIndex, 0)) + { + return 0; + } + + if (!s_compilerConfig.bQuiet) + { + // only do this if UME is off or if it's the final compile when UME is on + if (!s_compilerConfig.bUnusedMethodElimination || s_bFinalCompile) + { + printf("Done.\n"); + } + } + + if (!s_compilerConfig.bFileTreeOutputOnly && !s_compilerConfig.bFileListOutputOnly && !s_compilerConfig.bDumpSymbols) + { + if (!s_bFinalCompile && s_compilerConfig.bUnusedMethodElimination) + { + nOriginalSize = s_pCompilerData->psize; + FindUnusedMethods(s_pCompilerData); + s_bFinalCompile = true; + CleanupMemory(false); + goto restart_compile; + } + int bufferSize = 0; + if (!ComposeRAM(&s_pCompileResultBuffer, bufferSize)) + { + return 0; + } + + if (!s_compilerConfig.bQuiet) + { + if (s_compilerConfig.bUnusedMethodElimination) + { + printf("Unused Method Elimination:\n"); + if ((nOriginalSize - s_pCompilerData->psize) > 0) + { + if (s_compilerConfig.bVerbose) + { + if (s_pCompilerData->unused_obj_files) + { + printf("Unused Objects:\n"); + for(int i = 0; i < s_pCompilerData->unused_obj_files; i++) + { + printf("%s\n", &(s_pCompilerData->obj_unused[i<<8])); + } + } + if (s_pCompilerData->unused_methods) + { + printf("Unused Methods:\n"); + for(int i = 0; i < s_pCompilerData->unused_methods; i++) + { + printf("%s\n", &(s_pCompilerData->method_unused[i*symbol_limit])); + } + } + if (s_pCompilerData->unused_methods || s_pCompilerData->unused_obj_files) + { + printf("---------------\n"); + } + } + printf("%5d methods removed\n%5d objects removed\n%5d bytes saved\n", s_pCompilerData->unused_methods, s_pCompilerData->unused_obj_files, nOriginalSize - s_pCompilerData->psize ); + } + else + { + printf("Nothing removed.\n"); + } + printf("--------------------------\n"); + } + printf("Program size is %d bytes\n", bufferSize); + } + *pnResultLength = bufferSize; + } + + if (s_compilerConfig.bDumpSymbols) + { + DumpSymbols(); + } + + if (s_compilerConfig.bVerbose && !s_compilerConfig.bQuiet && !s_compilerConfig.bDATonly) + { + DumpList(); + } + + if (s_compilerConfig.bDocMode && s_compilerConfig.bVerbose && !s_compilerConfig.bQuiet && !s_compilerConfig.bDATonly) + { + DumpDoc(); + } + + return s_pCompileResultBuffer; +} + +void ShutdownCompiler() +{ + pp_clear_define_state(&s_preprocessor); + CleanupMemory(); +} + +/////////////////////////////////////////////////////////////////////////////////////////// +// TERMS OF USE: MIT License // +/////////////////////////////////////////////////////////////////////////////////////////// +// Permission is hereby granted, free of charge, to any person obtaining a copy of this // +// software and associated documentation files (the "Software"), to deal in the Software // +// without restriction, including without limitation the rights to use, copy, modify, // +// merge, publish, distribute, sublicense, and/or sell copies of the Software, and to // +// permit persons to whom the Software is furnished to do so, subject to the following // +// conditions: // +// // +// The above copyright notice and this permission notice shall be included in all copies // +// or substantial portions of the Software. // +// // +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, // +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A // +// PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT // +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE // +// SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // +/////////////////////////////////////////////////////////////////////////////////////////// diff --git a/Tools/unix/OpenSpin/PropellerCompiler/CompileSpin.h b/Tools/unix/OpenSpin/PropellerCompiler/CompileSpin.h new file mode 100644 index 00000000..1abaf08c --- /dev/null +++ b/Tools/unix/OpenSpin/PropellerCompiler/CompileSpin.h @@ -0,0 +1,76 @@ +/////////////////////////////////////////////////////////////// +// // +// Propeller Spin/PASM Compiler Command Line Tool 'OpenSpin' // +// (c)2012-2016 Parallax Inc. DBA Parallax Semiconductor. // +// See end of file for terms of use. // +// // +/////////////////////////////////////////////////////////////// +// +// CompileSpin.h +// +#ifndef _COMPILESPIN_H_ +#define _COMPILESPIN_H_ + +typedef char* (*LoadFileFunc)(const char* pFilename, int* pnLength, char** ppFilePath); +typedef void (*FreeFileBufferFunc)(char* pBuffer); + +struct CompilerConfig +{ + CompilerConfig() + : bVerbose(false) + , bQuiet(false) + , bFileTreeOutputOnly(false) + , bFileListOutputOnly(false) + , bDumpSymbols(false) + , bUsePreprocessor(true) + , bAlternatePreprocessorMode(false) + , bUnusedMethodElimination(false) + , bDocMode(false) + , bDATonly(false) + , bBinary(true) + , eeprom_size(32768) + { + } + + bool bVerbose; + bool bQuiet; + bool bFileTreeOutputOnly; + bool bFileListOutputOnly; + bool bDumpSymbols; + bool bUsePreprocessor; + bool bAlternatePreprocessorMode; + bool bUnusedMethodElimination; + bool bDocMode; + bool bDATonly; + bool bBinary; + unsigned int eeprom_size; +}; + + +void InitCompiler(CompilerConfig* pCompilerConfig, LoadFileFunc pLoadFileFunc, FreeFileBufferFunc pFreeFileBufferFunc); +void SetDefine(const char* pName, const char* pValue); +unsigned char* CompileSpin(char* pFilename, int* pnResultLength); +void ShutdownCompiler(); + +#endif // _COMPILESPIN_H_ + +/////////////////////////////////////////////////////////////////////////////////////////// +// TERMS OF USE: MIT License // +/////////////////////////////////////////////////////////////////////////////////////////// +// Permission is hereby granted, free of charge, to any person obtaining a copy of this // +// software and associated documentation files (the "Software"), to deal in the Software // +// without restriction, including without limitation the rights to use, copy, modify, // +// merge, publish, distribute, sublicense, and/or sell copies of the Software, and to // +// permit persons to whom the Software is furnished to do so, subject to the following // +// conditions: // +// // +// The above copyright notice and this permission notice shall be included in all copies // +// or substantial portions of the Software. // +// // +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, // +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A // +// PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT // +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE // +// SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // +/////////////////////////////////////////////////////////////////////////////////////////// diff --git a/Tools/unix/OpenSpin/PropellerCompiler/CompileUtilities.cpp b/Tools/unix/OpenSpin/PropellerCompiler/CompileUtilities.cpp new file mode 100644 index 00000000..b9351aee --- /dev/null +++ b/Tools/unix/OpenSpin/PropellerCompiler/CompileUtilities.cpp @@ -0,0 +1,686 @@ +////////////////////////////////////////////////////////////// +// // +// Propeller Spin/PASM Compiler // +// (c)2012-2016 Parallax Inc. DBA Parallax Semiconductor. // +// Adapted from Chip Gracey's x86 asm code by Roy Eltham // +// See end of file for terms of use. // +// // +////////////////////////////////////////////////////////////// +// +// CompileUtilities.cpp +// + +#include +#include +#include +#include +#include "Utilities.h" +#include "PropellerCompilerInternal.h" +#include "SymbolEngine.h" +#include "Elementizer.h" +#include "ErrorStrings.h" +#include "CompileUtilities.h" + +bool SkipBlock(int column) +{ + int savedObjPtr = g_pCompilerData->obj_ptr; + bool savedStringPatchEnable = g_pCompilerData->str_patch_enable; + g_pCompilerData->str_patch_enable = false; + if (!CompileBlock(column)) + { + return false; + } + g_pCompilerData->str_patch_enable = savedStringPatchEnable; + g_pCompilerData->obj_ptr = savedObjPtr; + return true; +} + +bool SkipRange() +{ + int savedObjPtr = g_pCompilerData->obj_ptr; + bool savedStringPatchEnable = g_pCompilerData->str_patch_enable; + g_pCompilerData->str_patch_enable = false; + bool bRange; + if (!CompileRange(bRange)) + { + return false; + } + g_pCompilerData->str_patch_enable = savedStringPatchEnable; + g_pCompilerData->obj_ptr = savedObjPtr; + return true; +} + +bool SkipExpression() +{ + int savedObjPtr = g_pCompilerData->obj_ptr; + bool savedStringPatchEnable = g_pCompilerData->str_patch_enable; + g_pCompilerData->str_patch_enable = false; + if (!CompileExpression()) + { + return false; + } + g_pCompilerData->str_patch_enable = savedStringPatchEnable; + g_pCompilerData->obj_ptr = savedObjPtr; + return true; +} + +bool CheckIndex(bool& bIndex, int& expSourcePtr) +{ + bIndex = false; + if (g_pElementizer->CheckElement(type_leftb)) + { + expSourcePtr = g_pElementizer->GetSourcePtr(); + if (!SkipExpression()) + { + return false; + } + if (!g_pElementizer->GetElement(type_rightb)) + { + return false; + } + bIndex = true; + } + return true; +} + +bool CheckIndexRange(bool& bIndex, int& expSourcePtr) +{ + bIndex = false; + if (g_pElementizer->CheckElement(type_leftb)) + { + expSourcePtr = g_pElementizer->GetSourcePtr(); + if (!SkipExpression()) + { + return false; + } + if (g_pElementizer->CheckElement(type_dotdot)) + { + if (!SkipExpression()) + { + return false; + } + } + if (!g_pElementizer->GetElement(type_rightb)) + { + return false; + } + bIndex = true; + } + return true; +} + +bool CheckVariable_AddressExpression(int& expSourcePtr) +{ + bool bIndex = false; + if (!CheckIndex(bIndex, expSourcePtr)) + { + return false; + } + if (!bIndex) + { + g_pCompilerData->error = true; + g_pCompilerData->error_msg = g_pErrorStrings[error_eleftb]; + return false; + } + return true; +} + +bool CheckVariable(bool& bVariable, unsigned char& type, unsigned char& size, int& address, int& indexSourcePtr) +{ + address = g_pElementizer->GetValue(); + indexSourcePtr = 0; + + unsigned char varType = (unsigned char)(g_pElementizer->GetType() & 0xFF); + + if (varType >= type_var_byte && varType <= type_var_long) + { + type = type_var_byte; + // adjust address base on the var size + if (varType < type_var_long) + { + address += g_pCompilerData->var_long; + } + if (varType == type_var_byte) + { + address += g_pCompilerData->var_word; + } + } + else if (varType >= type_dat_byte && varType <= type_dat_long) + { + type = type_dat_byte; + } + else if (varType >= type_loc_byte && varType <= type_loc_long) + { + type = type_loc_byte; + } + else + { + type = varType; + if (varType == type_size) + { + size = (unsigned char)(g_pElementizer->GetValue() & 0xFF); + if (!CheckVariable_AddressExpression(address)) + { + return false; + } + bool bIndex = false; + if (!CheckIndex(bIndex, indexSourcePtr)) + { + return false; + } + bVariable = true; + return true; + } + else + { + size = 2; + if (varType == type_spr) + { + if (!CheckVariable_AddressExpression(address)) + { + return false; + } + bVariable = true; + return true; + } + else if (varType == type_reg) + { + bool bIndex = false; + if (!CheckIndexRange(bIndex, indexSourcePtr)) + { + return false; + } + if (bIndex) + { + size = 3; + } + bVariable = true; + return true; + } + else + { + bVariable = false; + return true; + } + } + } + // if we got here then it's a var/dat/loc type + // set size + size = varType; + size -= type; + bool bIndex = false; + if (!CheckIndex(bIndex, indexSourcePtr)) + { + return false; + } + if (!bIndex) + { + // check for .byte/word/long{[index]} + if (g_pElementizer->CheckElement(type_dot)) + { + bool bEof = false; + if (!g_pElementizer->GetNext(bEof)) // get byte/word/long + { + return false; + } + if (g_pElementizer->GetType() != type_size) + { + g_pCompilerData->error = true; + g_pCompilerData->error_msg = g_pErrorStrings[error_ebwol]; + return false; + } + if (size < (g_pElementizer->GetValue() & 0xFF)) // new size must be same or smaller + { + g_pCompilerData->error = true; + g_pCompilerData->error_msg = g_pErrorStrings[error_sombs]; + return false; + } + size = (g_pElementizer->GetValue() & 0xFF); // update size + + bool bIndexCheck = false; + if (!CheckIndex(bIndexCheck, indexSourcePtr)) + { + return false; + } + } + } + bVariable = true; + return true; +} + +bool GetVariable(unsigned char& type, unsigned char& size, int& address, int& indexSourcePtr) +{ + bool bEof = false; + if (!g_pElementizer->GetNext(bEof)) + { + return false; + } + bool bVariable = false; + if (!CheckVariable(bVariable, type, size, address, indexSourcePtr)) + { + return false; + } + if (!bVariable) + { + g_pCompilerData->error = true; + g_pCompilerData->error_msg = g_pErrorStrings[error_eav]; + return false; + } + return true; +} + +bool CompileVariable(unsigned char vOperation, unsigned char vOperator, unsigned char type, unsigned char size, int address, int indexSourcePtr) +{ + // compile and index(s) + if (type != type_reg) + { + if (type == type_spr || type == type_size) + { + if (!CompileOutOfSequenceExpression(address)) + { + return false; + } + } + if (type != type_spr) + { + if (indexSourcePtr != 0) + { + if (!CompileOutOfSequenceExpression(indexSourcePtr)) + { + return false; + } + } + } + } + + unsigned char byteCode = 0; + + if (type == type_spr) + { + byteCode = 0x24 | vOperation; + } + else if (type == type_reg) + { + byteCode = 0x3F; + if (size != 2) + { + bool bRange = false; + if (!CompileOutOfSequenceRange(indexSourcePtr, bRange)) + { + return false; + } + if (bRange) + { + byteCode = 0x3E; + } + else + { + byteCode = 0x3D; + } + } + if (!EnterObj(byteCode)) + { + return false; + } + // byteCode = 1 in high bit, bottom 2 bits of vOperation in next two bits, then bottom 5 bits of address + byteCode = 0x80 | ((vOperation & 3) << 5) | (address & 0x1F); + } + else + { + if ((type != type_var_byte && type != type_loc_byte) || size != 2 || address >= 8*4 || indexSourcePtr != 0) + { + // not compact + byteCode = 0x80 | (size << 5); + if (indexSourcePtr != 0) + { + byteCode |= 0x10; + } + byteCode |= vOperation; + if (type != type_size) + { + if (type == type_dat_byte) + { + byteCode += 4; + } + else if (type == type_var_byte) + { + byteCode += 8; + } + else if (type == type_loc_byte) + { + byteCode += 12; + } + else + { + g_pCompilerData->error = true; + g_pCompilerData->error_msg = g_pErrorStrings[error_internal]; + return false; + } + if (!EnterObj(byteCode)) + { + return false; + } + if (address > 0x7F) + { + // two byte address + byteCode = (unsigned char)(address >> 8) | 0x80; + if (!EnterObj(byteCode)) + { + return false; + } + } + byteCode = (unsigned char)address; + } + } + else + { + // compact + byteCode = (type == type_var_byte) ? 0x40 : 0x60; + byteCode |= (unsigned char)address; + byteCode |= vOperation; + } + } + + if (!EnterObj(byteCode)) + { + return false; + } + if (vOperation == 2) // if assign + { + if (!EnterObj(vOperator)) + { + return false; + } + } + return true; +} + +bool CompileVariable_Assign(unsigned char vOperator, unsigned char type, unsigned char size, int address, int indexSourcePtr) +{ + return CompileVariable(2, vOperator, type, size, address, indexSourcePtr); +} + +bool CompileVariable_Expression(unsigned char vOperator, unsigned char type, unsigned char size, int address, int indexSourcePtr) +{ + if (!CompileExpression()) + { + return false; + } + return CompileVariable(2, vOperator, type, size, address, indexSourcePtr); +} + +bool CompileVariable_PreSignExtendOrRandom(unsigned char vOperator) +{ + unsigned char varType = 0; + unsigned char varSize = 0; + int varAddress = 0; + int varIndexSourcePtr = 0; + if (!GetVariable(varType, varSize, varAddress, varIndexSourcePtr)) + { + return false; + } + + return CompileVariable_Assign(vOperator, varType, varSize, varAddress, varIndexSourcePtr); +} + +bool CompileVariable_IncOrDec(unsigned char vOperator, unsigned char type, unsigned char size, int address, int indexSourcePtr) +{ + return CompileVariable(2, vOperator | (((size + 1) & 3) << 1), type, size, address, indexSourcePtr); +} + +bool CompileVariable_PreIncOrDec(unsigned char vOperator) +{ + unsigned char varType = 0; + unsigned char varSize = 0; + int varAddress = 0; + int varIndexSourcePtr = 0; + if (!GetVariable(varType, varSize, varAddress, varIndexSourcePtr)) + { + return false; + } + + return CompileVariable_IncOrDec(vOperator, varType, varSize, varAddress, varIndexSourcePtr); +} + +bool CompileParameters(int numParameters) +{ + if (numParameters > 0) + { + if (!g_pElementizer->GetElement(type_left)) // ( + { + return false; + } + for (int i = 0; i < numParameters; i++) + { + if (!CompileExpression()) + { + return false; + } + if (i < (numParameters - 1)) + { + if (!g_pElementizer->GetElement(type_comma)) + { + return false; + } + } + } + if (!g_pElementizer->GetElement(type_right)) // ) + { + return false; + } + } + return true; +} + +bool CompileConstant(int value) +{ + if (value >= -1 && value <= 1) + { + // constant is -1, 0, or 1, so compiles to a single bytecode + unsigned char byteCode = (unsigned char)(value+1) | 0x34; + if (!EnterObj(byteCode)) + { + return false; + } + return true; + } + + // see if it's a mask + // masks can be: only one bit on (e.g. 0x00008000), + // all bits on except one (e.g. 0xFFFF7FFF), + // all bits on up to a bit then all zeros (e.g. 0x0000FFFF), + // or all bits off up to a bit then all ones (e.g. 0xFFFF0000) + for (unsigned char i = 0; i < 128; i++) + { + int testVal = 2; + testVal <<= (i & 0x1F); // mask i, so that we only actually shift 0 to 31 + + if (i & 0x20) // i in range 32 to 63 or 96 to 127 + { + testVal--; + } + if (i& 0x40) // i in range 64 to 127 + { + testVal = ~testVal; + } + + if (testVal == value) + { + if (!EnterObj(0x37)) // (constant mask) + { + return false; + } + if (!EnterObj(i)) + { + return false; + } + return true; + } + } + + // handle constants with upper 2 or 3 bytes being 0xFFs, using 'not' + if ((value & 0xFFFFFF00) == 0xFFFFFF00) + { + // one byte constant using 'not' + if (!EnterObj(0x38)) + { + return false; + } + unsigned char byteCode = (unsigned char)(value & 0xFF); + if (!EnterObj(~byteCode)) + { + return false; + } + if (!EnterObj(0xE7)) // (bitwise bot) + { + return false; + } + return true; + } + else if ((value & 0xFFFF0000) == 0xFFFF0000) + { + // two byte constant using 'not' + if (!EnterObj(0x39)) + { + return false; + } + unsigned char byteCode = (unsigned char)((value >> 8) & 0xFF); + if (!EnterObj(~byteCode)) + { + return false; + } + byteCode = (unsigned char)(value & 0xFF); + if (!EnterObj(~byteCode)) + { + return false; + } + if (!EnterObj(0xE7)) // (bitwise bot) + { + return false; + } + return true; + } + + // 1 to 4 byte constant + unsigned char size = 1; + if (value & 0xFF000000) + { + size = 4; + } + else if (value & 0x00FF0000) + { + size = 3; + } + else if (value & 0x0000FF00) + { + size = 2; + } + unsigned char byteCode = 0x37 + size; // (constant 1..4 bytes) + if (!EnterObj(byteCode)) + { + return false; + } + for (unsigned char i = size; i > 0; i--) + { + byteCode = (unsigned char)((value >> ((i - 1) * 8)) & 0xFF); + if (!EnterObj(byteCode)) + { + return false; + } + } + return true; +} + +bool CompileOutOfSequenceExpression(int sourcePtr) +{ + int savedSourcePtr = g_pElementizer->GetSourcePtr(); + g_pElementizer->SetSourcePtr(sourcePtr); + if (!CompileExpression()) + { + return false; + } + g_pElementizer->SetSourcePtr(savedSourcePtr); + return true; +} + +bool CompileOutOfSequenceRange(int sourcePtr, bool& bRange) +{ + int savedSourcePtr = g_pElementizer->GetSourcePtr(); + g_pElementizer->SetSourcePtr(sourcePtr); + if (!CompileRange(bRange)) + { + return false; + } + g_pElementizer->SetSourcePtr(savedSourcePtr); + return true; +} + +// compiles either a value or a range and sets the bRange flag accordingly +bool CompileRange(bool& bRange) +{ + if (!CompileExpression()) + { + return false; + } + + if (g_pElementizer->CheckElement(type_dotdot)) + { + if (!CompileExpression()) + { + return false; + } + bRange = true; + } + else + { + bRange = false; + } + + return true; +} + +// Compile relative address +bool CompileAddress(int address) +{ + address -= g_pCompilerData->obj_ptr; // make relative address + address--; // compensate for single-byte + + if ((address < 0 && abs(address) <= 64) || (address >= 0 && address < 64)) + { + // single byte, enter + address &= 0x007F; + } + else + { + // double byte, compensate and enter + address--; + if (!EnterObj((unsigned char)((address >> 8) | 0x80))) + { + return false; + } + address &= 0x00FF; + } + + return EnterObj((unsigned char)address); +} + +/////////////////////////////////////////////////////////////////////////////////////////// +// TERMS OF USE: MIT License // +/////////////////////////////////////////////////////////////////////////////////////////// +// Permission is hereby granted, free of charge, to any person obtaining a copy of this // +// software and associated documentation files (the "Software"), to deal in the Software // +// without restriction, including without limitation the rights to use, copy, modify, // +// merge, publish, distribute, sublicense, and/or sell copies of the Software, and to // +// permit persons to whom the Software is furnished to do so, subject to the following // +// conditions: // +// // +// The above copyright notice and this permission notice shall be included in all copies // +// or substantial portions of the Software. // +// // +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, // +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A // +// PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT // +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE // +// SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // +/////////////////////////////////////////////////////////////////////////////////////////// diff --git a/Tools/unix/OpenSpin/PropellerCompiler/CompileUtilities.h b/Tools/unix/OpenSpin/PropellerCompiler/CompileUtilities.h new file mode 100644 index 00000000..574fc992 --- /dev/null +++ b/Tools/unix/OpenSpin/PropellerCompiler/CompileUtilities.h @@ -0,0 +1,80 @@ +////////////////////////////////////////////////////////////// +// // +// Propeller Spin/PASM Compiler // +// (c)2012-2016 Parallax Inc. DBA Parallax Semiconductor. // +// Adapted from Chip Gracey's x86 asm code by Roy Eltham // +// See end of file for terms of use. // +// // +////////////////////////////////////////////////////////////// +// +// CompileUtilities.h +// + +#ifndef _COMPILEUTILITIES_H_ +#define _COMPILEUTILITIES_H_ + +extern bool SkipBlock(int column); +extern bool SkipRange(); +extern bool SkipExpression(); +extern bool CheckIndex(bool& bIndex, int& expSourcePtr); +extern bool CheckIndexRange(bool& bIndex, int& expSourcePtr); +extern bool CheckVariable(bool& bVariable, unsigned char& type, unsigned char& size, int& address, int& indexSourcePtr); +extern bool GetVariable(unsigned char& type, unsigned char& size, int& address, int& indexSourcePtr); +extern bool CompileVariable(unsigned char vOperation, unsigned char vOperator, unsigned char type, unsigned char size, int address, int indexSourcePtr); +extern bool CompileVariable_Assign(unsigned char vOperator, unsigned char type, unsigned char size, int address, int indexSourcePtr); +extern bool CompileVariable_Expression(unsigned char vOperator, unsigned char type, unsigned char size, int address, int indexSourcePtr); +extern bool CompileVariable_PreSignExtendOrRandom(unsigned char vOperator); +extern bool CompileVariable_IncOrDec(unsigned char vOperator, unsigned char type, unsigned char size, int address, int indexSourcePtr); +extern bool CompileVariable_PreIncOrDec(unsigned char vOperator); +extern bool CompileParameters(int numParameters); +extern bool CompileConstant(int value); +extern bool CompileOutOfSequenceExpression(int sourcePtr); +extern bool CompileOutOfSequenceRange(int sourcePtr, bool& bRange); +extern bool CompileRange(bool& bRange); +extern bool CompileAddress(int address); + +// these are in InstructionBlockCompiler.cpp +extern bool CompileBlock(int column); +extern bool OptimizeBlock(int column, int param, bool (*pCompileFunction)(int, int)); + +extern bool CompileInstruction(); // in CompileInstruction.cpp +extern bool CompileExpression(); // in CompileExpression.cpp + +// these are in StringConstantRoutines.cpp +extern void StringConstant_PreProcess(); +extern bool StringConstant_GetIndex(); +extern bool StringConstant_EnterChar(unsigned char theChar); +extern void StringConstant_EnterPatch(); +extern bool StringConstant_PostProcess(); + +// these are int BlockNestStackRoutines.cpp +extern bool BlockNest_New(unsigned char type, int stackSize); +extern void BlockNest_Redo(unsigned char type); +extern void BlockNest_End(); +extern void BlockStack_Write(int address, int value); +extern int BlockStack_Read(int address); +extern bool BlockStack_CompileAddress(int address); +extern bool BlockStack_CompileConstant(); + +#endif // _COMPILEUTILITIES_H_ + +/////////////////////////////////////////////////////////////////////////////////////////// +// TERMS OF USE: MIT License // +/////////////////////////////////////////////////////////////////////////////////////////// +// Permission is hereby granted, free of charge, to any person obtaining a copy of this // +// software and associated documentation files (the "Software"), to deal in the Software // +// without restriction, including without limitation the rights to use, copy, modify, // +// merge, publish, distribute, sublicense, and/or sell copies of the Software, and to // +// permit persons to whom the Software is furnished to do so, subject to the following // +// conditions: // +// // +// The above copyright notice and this permission notice shall be included in all copies // +// or substantial portions of the Software. // +// // +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, // +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A // +// PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT // +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE // +// SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // +/////////////////////////////////////////////////////////////////////////////////////////// diff --git a/Tools/unix/OpenSpin/PropellerCompiler/DistillObjects.cpp b/Tools/unix/OpenSpin/PropellerCompiler/DistillObjects.cpp new file mode 100644 index 00000000..110237ca --- /dev/null +++ b/Tools/unix/OpenSpin/PropellerCompiler/DistillObjects.cpp @@ -0,0 +1,338 @@ +////////////////////////////////////////////////////////////// +// // +// Propeller Spin/PASM Compiler // +// (c)2012-2016 Parallax Inc. DBA Parallax Semiconductor. // +// Adapted from Chip Gracey's x86 asm code by Roy Eltham // +// See end of file for terms of use. // +// // +////////////////////////////////////////////////////////////// +// +// DistillObjects.cpp +// +// called Object Distiller in the asm code +// + +#include +#include +#include +#include +#include "Utilities.h" +#include "PropellerCompilerInternal.h" +#include "SymbolEngine.h" +#include "Elementizer.h" +#include "ErrorStrings.h" + +bool DistillSetup_Enter(unsigned short value) +{ + if (g_pCompilerData->dis_ptr == distiller_limit) + { + g_pCompilerData->error = true; + g_pCompilerData->error_msg = g_pErrorStrings[error_odo]; + return false; + } + g_pCompilerData->dis[g_pCompilerData->dis_ptr++] = value; + return true; +} + +// create a table of all objects with their offsets and sub objects +// each entry contains: +// id, offset, number sub objects, [sub object ids] +bool DistillSetup_Record(short id, unsigned short offset, unsigned short& subObjectId) +{ + if (!DistillSetup_Enter(id)) + { + return false; + } + if (!DistillSetup_Enter(offset)) + { + return false; + } + unsigned short numSubObjects = (unsigned short)(g_pCompilerData->obj[offset+3]); + if (!DistillSetup_Enter(numSubObjects)) + { + return false; + } + if (numSubObjects > 0) + { + short startingSubObjectId = subObjectId; + for (short i = 0; i < numSubObjects; i++) + { + if (!DistillSetup_Enter(subObjectId++)) + { + return false; + } + } + + unsigned short nextSubObjects = (unsigned short)(g_pCompilerData->obj[offset+2]); + for (short i = 0; i < numSubObjects; i++) + { + unsigned short offsetAdjust = *((unsigned short*)&(g_pCompilerData->obj[offset + ((nextSubObjects + i) * 4)])); + if (!DistillSetup_Record(startingSubObjectId + i, offset + offsetAdjust, subObjectId)) + { + return false; + } + } + } + + return true; +} + +bool DistillSetup() +{ + g_pCompilerData->dis_ptr = 0; + unsigned short subObjectId = 1; + if (!DistillSetup_Record(0, 0, subObjectId)) + { + return false; + } + + // Clear all the objects table of offsets to their sub objects + // this needs to be done so that objects will binary compare with each other properly + // these offsets get replaced in the reconnect step + int disPtr = 0; + while (disPtr < g_pCompilerData->dis_ptr) + { + // do we have sub objects? + unsigned short numSubObjects = g_pCompilerData->dis[disPtr + 2]; + if (numSubObjects > 0) + { + unsigned short offset = g_pCompilerData->dis[disPtr + 1]; + + disPtr += numSubObjects; + + unsigned short offsetAdjust = (unsigned short)(g_pCompilerData->obj[offset + 2]); + unsigned char* pObj = &(g_pCompilerData->obj[offset + (offsetAdjust * 4)]); + for (int i = 0; i < numSubObjects; i++) + { + *((unsigned short*)&pObj[0]) = 0; + pObj += 4; + } + } + + disPtr += 3; + } + + return true; +} + +// update all objects of the given id to the new id +// also flags them as "distilled" with the upper bit being on +void DistillEliminate_Update(unsigned short objectId, int newDisPtr) +{ + int disPtr = 0; + + while (disPtr < g_pCompilerData->dis_ptr) + { + disPtr += 3; + unsigned short numSubObjects = g_pCompilerData->dis[disPtr - 1]; + if (numSubObjects > 0) + { + for (int i = 0; i < numSubObjects; i++) + { + if ((g_pCompilerData->dis[disPtr] & 0x7FFF) == objectId) + { + g_pCompilerData->dis[disPtr] = (g_pCompilerData->dis[newDisPtr] | 0x8000); + } + disPtr++; + } + } + } +} + +void DistillEliminate() +{ + int disPtr = 0; + + while (disPtr < g_pCompilerData->dis_ptr) + { + unsigned short numSubObjects = g_pCompilerData->dis[disPtr + 2]; + if (numSubObjects > 0) + { + int i; + for (i = 0; i < numSubObjects; i++) + { + if ((g_pCompilerData->dis[disPtr + 3 + i] & 0x8000) == 0) + { + break; + } + } + if (i < numSubObjects) + { + // point to next object record + disPtr += (3 + numSubObjects); + continue; + } + } + + // search for any matching objects + int newDisPtr = disPtr; + // point to next object record + newDisPtr += (3 + numSubObjects); + + bool bRestart = false; + while (newDisPtr < g_pCompilerData->dis_ptr) + { + unsigned short newNumSubObjects = g_pCompilerData->dis[newDisPtr + 2]; + + if (numSubObjects != newNumSubObjects) + { + // point to next object record + newDisPtr += (3 + newNumSubObjects); + continue; + } + if (newNumSubObjects > 0) + { + int i; + for (i = 0; i < newNumSubObjects; i++) + { + if (g_pCompilerData->dis[disPtr + 3 + i] != g_pCompilerData->dis[newDisPtr + 3 + i]) + { + break; + } + } + if (i < newNumSubObjects) + { + // point to next object record + newDisPtr += (3 + newNumSubObjects); + continue; + } + } + // compare the object binaries + unsigned char* pObj = &(g_pCompilerData->obj[g_pCompilerData->dis[disPtr+1]]); + unsigned short objLength = *((unsigned short*)pObj); + if (memcmp(pObj, &(g_pCompilerData->obj[g_pCompilerData->dis[newDisPtr+1]]), (size_t)objLength) != 0) + { + // point to next object record + newDisPtr += (3 + newNumSubObjects); + continue; + } + + // the objects match, so update all related sub-object id's + DistillEliminate_Update(g_pCompilerData->dis[disPtr], newDisPtr); + DistillEliminate_Update(g_pCompilerData->dis[newDisPtr], newDisPtr); + + // remove redundant object record from list + g_pCompilerData->dis_ptr -= (3 + numSubObjects); + memmove(&g_pCompilerData->dis[disPtr], &g_pCompilerData->dis[disPtr + (3 + numSubObjects)], (g_pCompilerData->dis_ptr - disPtr) * 2); + + // restart elimination from beginning + bRestart = true; + } + if (bRestart) + { + disPtr = 0; + } + else + { + // point to next object record + disPtr += (3 + numSubObjects); + continue; + } + } +} + +static unsigned char s_rebuildBuffer[min_obj_limit]; +void DistillRebuild() +{ + int disPtr = 0; + unsigned short rebuildPtr = 0; + while (disPtr < g_pCompilerData->dis_ptr) + { + // copy the object from obj into the rebuild buffer + unsigned char* pObj = &(g_pCompilerData->obj[g_pCompilerData->dis[disPtr + 1]]); + unsigned short objLength = *((unsigned short*)pObj); + memcpy(&(s_rebuildBuffer[rebuildPtr]), pObj, (size_t)objLength); + + // fixup the distiller record + g_pCompilerData->dis[disPtr+1] = rebuildPtr; + + rebuildPtr += objLength; + + // point to the next object record + disPtr += (3 + g_pCompilerData->dis[disPtr + 2]); + } + + // copy the rebuilt data back into obj + g_pCompilerData->obj_ptr = rebuildPtr; + memcpy(&g_pCompilerData->obj[0], &s_rebuildBuffer[0], (size_t)rebuildPtr); +} + +void DistillReconnect(int disPtr = 0) +{ + unsigned short numSubObjects = g_pCompilerData->dis[disPtr + 2]; + if (numSubObjects > 0) + { + // this objects offset in the obj + unsigned short objectOffset = g_pCompilerData->dis[disPtr + 1]; + // the offset (number of longs) to the sub-object offset list within this obj + unsigned char subObjectOffsetListPtr = g_pCompilerData->obj[objectOffset + 2]; + // pointer to the sub-object offset list for this obj + unsigned short* pSubObjectOffsetList = (unsigned short*)&(g_pCompilerData->obj[objectOffset + (subObjectOffsetListPtr * 4)]); + + for (int i = 0; i < numSubObjects; i++) + { + unsigned short subObjectId = g_pCompilerData->dis[disPtr + 3 + i] & 0x7FFF; + + // find offset of sub-object + int scanDisPtr = 0; + for (;;) + { + if (g_pCompilerData->dis[scanDisPtr] == subObjectId) + { + break; + } + scanDisPtr += (3 + g_pCompilerData->dis[scanDisPtr + 2]); + } + + // enter relative offset of sub-object + pSubObjectOffsetList[i*2] = g_pCompilerData->dis[scanDisPtr + 1] - objectOffset; + + // call recursively to reconnect and sub-objects' sub-objects + DistillReconnect(scanDisPtr); + } + } +} + +bool DistillObjects() +{ + int saved_obj_ptr = g_pCompilerData->obj_ptr; + + if (!DistillSetup()) + { + return false; + } + DistillEliminate(); + DistillRebuild(); + DistillReconnect(); + + g_pCompilerData->distilled_longs = (saved_obj_ptr - g_pCompilerData->obj_ptr) >> 2; + + char tempStr[64]; + sprintf(tempStr, "\rDistilled longs: %d", g_pCompilerData->distilled_longs); + if (!PrintString(tempStr)) + { + return false; + } + return PrintChr(13); +} + +/////////////////////////////////////////////////////////////////////////////////////////// +// TERMS OF USE: MIT License // +/////////////////////////////////////////////////////////////////////////////////////////// +// Permission is hereby granted, free of charge, to any person obtaining a copy of this // +// software and associated documentation files (the "Software"), to deal in the Software // +// without restriction, including without limitation the rights to use, copy, modify, // +// merge, publish, distribute, sublicense, and/or sell copies of the Software, and to // +// permit persons to whom the Software is furnished to do so, subject to the following // +// conditions: // +// // +// The above copyright notice and this permission notice shall be included in all copies // +// or substantial portions of the Software. // +// // +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, // +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A // +// PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT // +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE // +// SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // +/////////////////////////////////////////////////////////////////////////////////////////// diff --git a/Tools/unix/OpenSpin/PropellerCompiler/Elementizer.cpp b/Tools/unix/OpenSpin/PropellerCompiler/Elementizer.cpp new file mode 100644 index 00000000..c094afc9 --- /dev/null +++ b/Tools/unix/OpenSpin/PropellerCompiler/Elementizer.cpp @@ -0,0 +1,810 @@ +////////////////////////////////////////////////////////////// +// // +// Propeller Spin/PASM Compiler // +// (c)2012-2016 Parallax Inc. DBA Parallax Semiconductor. // +// Adapted from Chip Gracey's x86 asm code by Roy Eltham // +// See end of file for terms of use. // +// // +////////////////////////////////////////////////////////////// +// +// Elementizer.cpp +// + +#include +#include "PropellerCompilerInternal.h" +#include "Elementizer.h" +#include "SymbolEngine.h" +#include "ErrorStrings.h" +#include "Utilities.h" + +// private + +// set elementizer data from the currently set symbol entry +void Elementizer::SetFromSymbolEntry() +{ + if (m_pSymbolEntry) + { + m_type = m_pSymbolEntry->m_data.type; + m_value = m_pSymbolEntry->m_data.value; + m_value_2 = m_pSymbolEntry->m_data.value_2; + if (m_pSymbolEntry->m_data.dual) + { + m_dual = true; + m_asm = m_pSymbolEntry->m_data.operator_type_or_asm; + } + else + { + m_dual = false; + m_opType = m_pSymbolEntry->m_data.operator_type_or_asm; + + // fixup for AND and OR to have asm also + if (m_type == type_binary && m_opType == op_log_and) + { + m_asm = 0x18 + 0x40; + } + if (m_type == type_binary && m_opType == op_log_or) + { + m_asm = 0x1A + 0x40; + } + } + } + else + { + m_type = 0; + m_value = 0; + m_value_2 = 0; + m_asm = -1; + m_opType = -1; + } +} + +// public + +// reset to start of source +void Elementizer::Reset() +{ + m_sourceOffset = 0; + m_sourceFlags = 0; +} + +// get the next element in source, returns true no error, bEof will be set to true if eof is hit +bool Elementizer::GetNext(bool& bEof) +{ + // update back data + m_backOffsets[m_backIndex&0x03] = m_sourceOffset; + m_backFlags[m_backIndex&0x03] = m_sourceFlags; + m_backIndex++; + + // default to type_undefined + m_type = 0; + m_value = 0; + m_value_2 = 0; + m_asm = -1; + m_opType = -1; + m_pSymbolEntry = 0; + + // no error, and not end of file + int error = error_none; + bEof = false; + bool bDocComment = false; + int constantBase = 0; + + // setup source and symbol pointers + char* pSource = m_pCompilerData->source; + int sourceStart = m_sourceOffset; + + m_currentSymbol[0] = 0; + int symbolOffset = 0; + bool bConstantOverflow = false; + + for (;;) + { + char currentChar = pSource[m_sourceOffset++]; + + // parse + if (constantBase > 0) + { + // this handles reading in a constant of base 2, 4, 10, or 16 + // the constantBase value is set based on prefix characters handled below + + if (currentChar == '_') + { + // skip over _'s + continue; + } + char digitValue; + if (!CheckDigit(currentChar, digitValue, (char)constantBase)) + { + char notUsed; + char nextChar = pSource[m_sourceOffset]; + bool bNextCharDigit = CheckDigit(nextChar, notUsed, (char)constantBase); + + if ((constantBase == 10 && + (currentChar == '.' && bNextCharDigit)) || + currentChar == 'e' || currentChar == 'E') + { + // handle float + bConstantOverflow = false; + m_sourceOffset = sourceStart; + if (GetFloat(pSource, m_sourceOffset, m_value)) + { + m_sourceOffset--; // back up to point at last digit + m_type = type_con_float; + } + else + { + error = error_fpcmbw; + } + } + else + { + // done with this constant + m_sourceOffset--; // back up to point at last digit + m_type = type_con; + } + constantBase = 0; + break; + } + else + { + // multiply accumulate the constant + unsigned int oldValue = m_value; + m_value *= constantBase; + + // check for overflow + if (((unsigned int)m_value / constantBase) != oldValue) + { + bConstantOverflow = true; + } + + m_value += digitValue; + } + continue; + } + else if (m_sourceFlags != 0) + { + // old string? (continue parsing a string) + + // for strings, m_sourceFlags will start out 0, and then cycle between 1 and 2 for + // each character of the string, when it is 1, a type_comma is returned, when it is + // 2 the next character is returned + + // return a comma element between each character of the string + if (m_sourceFlags == 1) + { + m_sourceFlags++; + m_sourceOffset--; + m_type = type_comma; + break; + } + + // reset flag + m_sourceFlags = 0; + + // check for errors + if (currentChar == '\"') + { + error = error_es; + break; + } + else if (currentChar == 0) + { + m_sourceOffset--; // back up from eof + error = error_eatq; + break; + } + else if (currentChar == 13) + { + error = error_eatq; + break; + } + + // return the character + m_value = currentChar; + + // check the next character, if it's not a " then setup so the next + // call returns a type_comma, if it is a ", then we are done with this string + // and we leave the offset pointing after the " + currentChar = pSource[m_sourceOffset++]; + if (currentChar != '\"') + { + m_sourceOffset--; + m_sourceFlags++; + } + + // return the character constant + m_type = type_con; + break; + } + else if (currentChar == '\"') + { + // new string (start parsing a string) + + // we got here because m_sourceFlags was 0 and the character is a " + + // get first character of string + currentChar = pSource[m_sourceOffset++]; + + // check for errors + if (currentChar == '\"') + { + error = error_es; + break; + } + else if (currentChar == 0) + { + m_sourceOffset--; // back up from eof + error = error_eatq; + break; + } + else if (currentChar == 13) + { + error = error_eatq; + break; + } + + // return the character in value + m_value = currentChar & 0x000000FF; + + // check the next character, it's it's not a " then setup so the next + // call returns a type_comma, if it is a " then it means it's a one character + // string and we leave the offset pointing after the " + currentChar = pSource[m_sourceOffset++]; + if (currentChar != '\"') + { + m_sourceOffset--; // back up, so this character will be read after the type_comma + m_sourceFlags = 1; // cause the next call to return a type_comma + } + + // return the character constant + m_type = type_con; + break; + } + else if (currentChar == 0) + { + // eof + m_type = type_end; + bEof = true; + m_sourceOffset--; + sourceStart = m_sourceOffset; + break; + } + else if (currentChar == 13) + { + // eol + m_type = type_end; + break; + } + else if (currentChar <= ' ') + { + // space or tab? + sourceStart = m_sourceOffset; + continue; + } + else if (currentChar == '\'') + { + // comment + // read until end of line or file, handle doc comment + if (pSource[m_sourceOffset] == '\'') + { + m_sourceOffset++; // skip over second ' + bDocComment = true; + g_pCompilerData->doc_flag = true; + } + for (;;) + { + currentChar = pSource[m_sourceOffset++]; + if (currentChar == 0) + { + m_sourceOffset--; // back up from eof + m_type = type_end; + bEof = true; + break; + } + if (bDocComment) + { + DocPrint(currentChar); + } + if (currentChar == 13) + { + m_type = type_end; + break; + } + } + break; + } + else if (currentChar == '{') + { + // brace comment + // read the whole comment, handling doc comments as needed + int braceCommentLevel = 1; + if (pSource[m_sourceOffset] == '{') + { + m_sourceOffset++; // skip over second { + bDocComment = true; + g_pCompilerData->doc_flag = true; + if (pSource[m_sourceOffset] == 13) + { + m_sourceOffset++; // skip over end if present + } + } + for (;;) + { + currentChar = pSource[m_sourceOffset++]; + if (currentChar == 0) + { + if (bDocComment) + { + error = error_erbb; + } + else + { + error = error_erb; + } + m_sourceOffset--; // back up from eof + sourceStart = m_sourceOffset; + break; + } + else if (!bDocComment && currentChar == '{') + { + braceCommentLevel++; + } + else if (currentChar == '}') + { + if (bDocComment && pSource[m_sourceOffset] == '}') + { + m_sourceOffset++; // skip over second } + break; + } + else if (!bDocComment) + { + braceCommentLevel--; + if (braceCommentLevel < 1) + { + break; + } + } + } + else if (bDocComment) + { + DocPrint(currentChar); + } + } + if (error == error_none) + { + sourceStart = m_sourceOffset; + continue; + } + else + { + break; + } + } + else if (currentChar == '}') + { + // unmatched brace comment end + error = error_bmbpbb; + break; + } + else if (currentChar == '%') + { + // binary + currentChar = pSource[m_sourceOffset++]; + char temp; + if (currentChar == '%') + { + // double binary + currentChar = pSource[m_sourceOffset++]; + if (!CheckDigit(currentChar, temp, 4)) + { + error = error_idbn; + break; + } + constantBase = 4; + } + else + { + if (!CheckDigit(currentChar, temp, 2)) + { + error = error_idbn; + break; + } + constantBase = 2; + } + m_sourceOffset--; // back up to first digit + // constantBase is now set, so loop back around to read in the constant + continue; + } + else if (currentChar == '$') + { + // hex + currentChar = pSource[m_sourceOffset++]; + char temp; + if (!CheckDigit(currentChar, temp, 16)) + { + m_sourceOffset--; + m_type = type_asm_org; + break; + } + constantBase = 16; + m_sourceOffset--; // back up to first digit + // constantBase is now set, so loop back around to read in the constant + continue; + } + else if (currentChar >= '0' && currentChar <= '9') + { + // dec + constantBase = 10; + m_sourceOffset--; // back up to first digit + // constantBase is now set, so loop back around to read in the constant + continue; + } + else + { + // symbol + currentChar = Uppercase(currentChar); + if (CheckWordChar(currentChar)) + { + // do word symbol + while(CheckWordChar(currentChar) && symbolOffset <= symbol_limit) + { + m_currentSymbol[symbolOffset++] = currentChar; + currentChar = Uppercase(pSource[m_sourceOffset++]); + } + if (symbolOffset > symbol_limit) + { + error = error_sexc; + } + else + { + // back up so we point at last char of symbol + m_sourceOffset--; + // terminate symbol + m_currentSymbol[symbolOffset] = 0; + m_pSymbolEntry = m_pSymbolEngine->FindSymbol(m_currentSymbol); + } + } + else + { + // try non-word symbol (one or two char operators) + m_currentSymbol[symbolOffset++] = currentChar; + currentChar = pSource[m_sourceOffset++]; + + bool bDoOneChar = false; + bool bDoTwoChar = false; + + // if the next char is not whitespace or eol + if (currentChar > ' ') + { + // three char symbol + + // assign second char into symbol + m_currentSymbol[symbolOffset++] = currentChar; + + // read third char into symbol + m_currentSymbol[symbolOffset++] = pSource[m_sourceOffset++]; + + // terminate symbol + m_currentSymbol[symbolOffset] = 0; + + m_pSymbolEntry = m_pSymbolEngine->FindSymbol(m_currentSymbol); + if (m_pSymbolEntry == 0) + { + bDoTwoChar = true; + symbolOffset--; + } + } + + if (bDoTwoChar) + { + // two char symbol + + // back up so we point at last char of symbol + m_sourceOffset--; + + // terminate symbol + m_currentSymbol[symbolOffset] = 0; + + m_pSymbolEntry = m_pSymbolEngine->FindSymbol(m_currentSymbol); + if (m_pSymbolEntry == 0) + { + bDoOneChar = true; + symbolOffset--; + } + } + + if (bDoOneChar || currentChar <= ' ') + { + // one char symbol + + // back up so we point at last char of symbol + m_sourceOffset--; + + // terminate symbol + m_currentSymbol[symbolOffset] = 0; + + m_pSymbolEntry = m_pSymbolEngine->FindSymbol(m_currentSymbol); + if (m_pSymbolEntry == 0) + { + error = error_uc; + } + } + } + break; + } + } + + if (bConstantOverflow) + { + error = error_ce32b; + } + + // update pointers + m_pCompilerData->source_start = sourceStart; + m_pCompilerData->source_finish = m_sourceOffset; + + // if we got a symbol, then set the type, value, etc. + if (m_type == 0 && m_pSymbolEntry) + { + SetFromSymbolEntry(); + } + + if (error != error_none) + { + m_pCompilerData->error = true; + m_pCompilerData->error_msg = g_pErrorStrings[error]; + return false; + } + + return true; +} + +// if the next element is type, then return true, else false, retains value +bool Elementizer::GetElement(int type) +{ + int value = m_value; // save current value + + bool bEof = false; + GetNext(bEof); + + if (GetType() != type) + { + m_pCompilerData->error = true; + int errorNum = 0; + switch (type) + { + case type_left: errorNum = error_eleft; break; + case type_right: errorNum = error_eright; break; + case type_rightb: errorNum = error_erightb; break; + case type_comma: errorNum = error_ecomma; break; + case type_pound: errorNum = error_epound; break; + case type_colon: errorNum = error_ecolon; break; + case type_dot: errorNum = error_edot; break; + case type_sub: errorNum = error_easn; break; + case type_end: errorNum = error_eeol; break; + } + m_pCompilerData->error_msg = g_pErrorStrings[errorNum]; + return false; + } + + m_value = value; // restore saved value + + return true; +} + +// check if next element is of the given type, if so return true, if not, backup and return false +bool Elementizer::CheckElement(int type) +{ + bool bEof = false; + GetNext(bEof); + if (GetType() == type) + { + return true; + } + Backup(); + return false; +} + +// scan for the next block element of type, returns true if no error, , bEof will be set to true if eof is hit +bool Elementizer::GetNextBlock(int type, bool& bEof) +{ + bool bFound = false; + while(bFound == false) + { + if (GetNext(bEof) == false || bEof == true) + { + break; + } + if (GetType() == type_block && GetValue() == type) + { + if (GetColumn() != 1) + { + m_pCompilerData->error = true; + m_pCompilerData->error_msg = g_pErrorStrings[error_bdmbifc]; + return false; + } + bFound = true; + } + } + // if we found the block or we hit eof, then we got no error so return true + return (bFound || bEof); +} + +// returns column of most recent Element gotten +int Elementizer::GetColumn() +{ + char* pSource = m_pCompilerData->source; + int sourceStart = m_pCompilerData->source_start; + if (sourceStart == 0) + { + // we are at the start of the source, so return 1 + return 1; + } + + // back up until we hit a CR character + while(pSource[sourceStart] != 13 && sourceStart > 0) + { + sourceStart--; + } + + // advance forward one, (off of the CR) + sourceStart++; + + if (sourceStart == m_pCompilerData->source_start) + { + // we are at the start of the line, so return 1 + return 1; + } + + // adjust source pointer to start of line + pSource += sourceStart; + // adjust sourceStart such that it is how many characters we backed up + sourceStart = m_pCompilerData->source_start - sourceStart; + + // count the characters we backed up over, accounting for tabs (tabs are 8 chars) + int column = 0; + for (int i = 0; i < sourceStart; i++) + { + if (pSource[i] == 9) + { + column |= 7; + } + column++; + } + + return column + 1; +} + +int Elementizer::GetCurrentLineNumber(int &offsetToStartOfLine, int& offsetToEndOfLine) +{ + int lineCount = 1; + + char* pSource = m_pCompilerData->source; + int scanEnd = m_pCompilerData->source_start; + offsetToStartOfLine = -1; + while (scanEnd > 0) + { + if (pSource[--scanEnd] == 13) + { + if (offsetToStartOfLine == -1) + { + offsetToStartOfLine = scanEnd+1; + } + lineCount++; + } + } + if (offsetToStartOfLine == -1) + { + offsetToStartOfLine = 0; + } + scanEnd = m_pCompilerData->source_start; + while (pSource[scanEnd] != 0) + { + if (pSource[scanEnd] == 13 || pSource[scanEnd] == 0) + { + break; + } + scanEnd++; + } + offsetToEndOfLine = scanEnd; + + return lineCount; +} + +// backup to the previous element +void Elementizer::Backup() +{ + m_backIndex--; + m_sourceOffset = m_backOffsets[m_backIndex&0x03]; + m_sourceFlags = m_backFlags[m_backIndex&0x03]; +} + +void Elementizer::ObjConToCon() +{ + m_type -= (type_objcon - type_con); +} + +void Elementizer::DatResToLong() +{ + if (m_type == type_dat_long_res) + { + m_type = type_dat_long; + } +} + +bool Elementizer::SubToNeg() +{ + if (m_type == type_binary && m_opType == op_sub) + { + m_type = type_unary; + m_opType = op_neg; + m_value = 0; + m_value_2 = 0; + return true; + } + + return false; +} + +bool Elementizer::NegConToCon() +{ + if (m_type == type_binary && m_opType == op_sub) + { + int savedValue = m_value; + bool bEof = false; + if (!GetNext(bEof)) + { + return false; + } + if (m_type == type_con) + { + m_value = -m_value; + } + else if (m_type == type_con_float) + { + m_value |= 0x80000000; + } + else + { + Backup(); + m_type = type_binary; + m_asm = -1; + m_opType = op_sub; + m_value = savedValue; + } + } + return true; +} + +bool Elementizer::FindSymbol(const char* symbol) +{ + m_pSymbolEntry = m_pSymbolEngine->FindSymbol(symbol); + SetFromSymbolEntry(); + return true; +} + +void Elementizer::BackupSymbol() +{ + strcpy(m_pCompilerData->symbolBackup, m_currentSymbol); +} + +/////////////////////////////////////////////////////////////////////////////////////////// +// TERMS OF USE: MIT License // +/////////////////////////////////////////////////////////////////////////////////////////// +// Permission is hereby granted, free of charge, to any person obtaining a copy of this // +// software and associated documentation files (the "Software"), to deal in the Software // +// without restriction, including without limitation the rights to use, copy, modify, // +// merge, publish, distribute, sublicense, and/or sell copies of the Software, and to // +// permit persons to whom the Software is furnished to do so, subject to the following // +// conditions: // +// // +// The above copyright notice and this permission notice shall be included in all copies // +// or substantial portions of the Software. // +// // +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, // +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A // +// PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT // +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE // +// SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // +/////////////////////////////////////////////////////////////////////////////////////////// diff --git a/Tools/unix/OpenSpin/PropellerCompiler/Elementizer.h b/Tools/unix/OpenSpin/PropellerCompiler/Elementizer.h new file mode 100644 index 00000000..473dc0ae --- /dev/null +++ b/Tools/unix/OpenSpin/PropellerCompiler/Elementizer.h @@ -0,0 +1,122 @@ +////////////////////////////////////////////////////////////// +// // +// Propeller Spin/PASM Compiler // +// (c)2012-2016 Parallax Inc. DBA Parallax Semiconductor. // +// Adapted from Chip Gracey's x86 asm code by Roy Eltham // +// See end of file for terms of use. // +// // +////////////////////////////////////////////////////////////// +// +// Elementizer.h +// + +#ifndef _ELEMENTIZER_H_ +#define _ELEMENTIZER_H_ + +struct CompilerDataInternal; +class SymbolEngine; +class SymbolTableEntry; + +const int state_stack_limit = 32; + +class Elementizer +{ + CompilerDataInternal* m_pCompilerData; + SymbolEngine* m_pSymbolEngine; + + int m_sourceOffset; + unsigned char m_sourceFlags; + + SymbolTableEntry* m_pSymbolEntry; + int m_type; + int m_value; + int m_value_2; + int m_opType; + int m_asm; + bool m_dual; + + unsigned char m_backIndex; + int m_backOffsets[4]; + unsigned char m_backFlags[4]; + + char m_currentSymbol[symbol_limit+2]; + + void SetFromSymbolEntry(); + +public: + Elementizer(CompilerDataInternal* pCompilerData, SymbolEngine* pSymbolEngine) + : m_pCompilerData(pCompilerData) + , m_pSymbolEngine(pSymbolEngine) + , m_sourceOffset(0) + , m_sourceFlags(0) + , m_backIndex(0) + { + for(int i = 0; i < 4; i++) + { + m_backOffsets[i] = 0; + m_backFlags[0] = 0; + } + } + + void Reset(); // reset to start of source + + bool GetNext(bool& bEof); // get the next element in source, returns true no error, bEof will be set to true if eof is hit + bool GetElement(int type); // if the next element is type, then return true, else false, retains value + bool CheckElement(int type); // check if next element is of the given type, if so return true, if not, backup and return false + bool GetNextBlock(int type, bool& bEof); // scan for the next block element of type, returns true if no error, , bEof will be set to true if eof is hit + bool FindSymbol(const char* symbol); // lookup a symbol in the symbol table and set it as the current element + void Backup(); // backup to the previous element + + void BackupSymbol(); // copy the current symbol into g_pCompilerData->symbolBackup + + int GetColumn(); // returns column of the element pointed to by g_pCompilerData->source_start + + int GetSourcePtr() // used to save the current source pointer so it can be put back + { + return m_sourceOffset; + } + void SetSourcePtr(int value) // used to set the source pointer back to a previously saved value + { + m_sourceOffset = value; + } + + int GetType() { return m_type; } // symbol's type + int GetValue() { return m_value; } // only valid if m_type != type_undefined + int GetValue2() { return m_value_2; } // only valid if m_type != type_undefined + int GetOpType() { return m_opType; } // only valid for operator symbols + int GetAsm() { return m_asm; } // only valid for dual symbols + op_log_and & op_log_or + bool IsDual() { return m_dual; } // true if is a dual symbol + char* GetCurrentSymbol() // returns the string for the symbol + { + return &(m_currentSymbol[0]); + } + int GetCurrentLineNumber(int &offsetToStartOfLine, int& offsetToEndOfLine); + + bool SubToNeg(); // convert a sub to a neg + void ObjConToCon(); // convert type_objcon_xx to type_con_xx + void DatResToLong(); // convert type_dat_long_res to type_dat_long + bool NegConToCon(); // convert -constant to constant +}; + +#endif // _ELEMENTIZER_H_ + +/////////////////////////////////////////////////////////////////////////////////////////// +// TERMS OF USE: MIT License // +/////////////////////////////////////////////////////////////////////////////////////////// +// Permission is hereby granted, free of charge, to any person obtaining a copy of this // +// software and associated documentation files (the "Software"), to deal in the Software // +// without restriction, including without limitation the rights to use, copy, modify, // +// merge, publish, distribute, sublicense, and/or sell copies of the Software, and to // +// permit persons to whom the Software is furnished to do so, subject to the following // +// conditions: // +// // +// The above copyright notice and this permission notice shall be included in all copies // +// or substantial portions of the Software. // +// // +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, // +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A // +// PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT // +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE // +// SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // +/////////////////////////////////////////////////////////////////////////////////////////// diff --git a/Tools/unix/OpenSpin/PropellerCompiler/ErrorStrings.cpp b/Tools/unix/OpenSpin/PropellerCompiler/ErrorStrings.cpp new file mode 100644 index 00000000..e86d1718 --- /dev/null +++ b/Tools/unix/OpenSpin/PropellerCompiler/ErrorStrings.cpp @@ -0,0 +1,154 @@ +////////////////////////////////////////////////////////////// +// // +// Propeller Spin/PASM Compiler // +// (c)2012-2016 Parallax Inc. DBA Parallax Semiconductor. // +// Adapted from Chip Gracey's x86 asm code by Roy Eltham // +// See end of file for terms of use. // +// // +////////////////////////////////////////////////////////////// +// +// ErrorStrings.cpp +// + +const char* g_pErrorStrings[] = +{ + "Address is not long", + "Address is out of range", + "\"}\" must be preceeded by \"{\" to form a comment", + "Block designator must be in first column", + "Blocknest stack overflow", + "Cannot compute square root of negative floating-point number", + "Constant exceeds 32 bits", + "_CLKFREQ or _XINFREQ must be specified", + "CALL symbol must not exceed 252 characters", + "_CLKFREQ/_XINFREQ not allowed with RCFAST/RCSLOW", + "_CLKFREQ/_XINFREQ specified without _CLKMODE", + "Divide by zero", + "Destination register cannot exceed $1FF", + "Expected an assembly effect or end of line", + "Expected an assembly effect", + "Expected an assembly instruction", + "Expected a binary operator or \")\"", + "Expected a constant name", + "Expected a constant, unary operator, or \"(\"", + "Expected a DAT symbol", + "Expected an expression term", + "Expected an instruction or variable", + "Expected a local symbol", + "Expected a memory variable after \"@\"", + "Expected a subroutine name", + "Expected a subroutine or object name", + "Expected a terminating quote", + "Expected a unique object name", + "Expected a variable", + "Expected a unique constant name or \"#\"", + "Expected a unique name, BYTE, WORD, LONG, or assembly instruction", + "Expected a unique parameter name", + "Expected a unique result name", + "Expected a unique subroutine name", + "Expected a unique variable name", + "Expected BYTE, WORD, or LONG", + "Expected \",\" or end of line", + "Expected \":\"", + "Expected \",\"", + "Expected \",\" or \")\"", + "Either _CLKFREQ or _XINFREQ must be specified, but not both", + "Expected \".\"", + "Expected end of line", + "Expected \"=\" \"[\" \",\" or end of line", + "Expected FROM", + "Expression is too complex", + "Expected \"(\"", + "Expected \"[\"", + "Expected PRECOMPILE or ARCHIVE", + "Expected \"|\" or end of line", + "Expected \"#\"", + "Expected \"}\"", + "Expected \"}}\"", + "Expected \")\"", + "Expected \"]\"", + "Empty string", + "Expected STEP or end of line", + "Expected TO", + "Filename too long", + "Floating-point constant must be within +/- 3.4e+38", + "Floating-point not allowed in integer expression", + "Floating-point overflow", + "Invalid binary number", + "Invalid _CLKMODE specified", + "Invalid double-binary number", + "Internal DAT file not found", + "Invalid filename character", + "Invalid filename, use \"FilenameInQuotes\"", + "Integer not allowed in floating-point expression", + "Internal", + "Integer operator not allowed in floating-point expression", + "Limit of 64 cases exceeded", + "Limit of 8 nested blocks exceeded", + "Limit of 32 unique objects exceeded", + "Limit of 32 unique DAT files exceeded", + "Limit of 32 unique PRECOMPILE files exceeded", + "Limit of 32 unique ARCHIVE files exceeded", + "List is too large", + "Limit of 1,048,576 DAT symbols exceeded", + "Limit of 16 ELSEIFs exceeded", + "Limit of 4096 local variables exceeded", + "Limit of 15 parameters exceeded", + "Limit of 256 subroutines + objects exceeded", + "Memory instructions cannot use WR/NR", + "No cases encountered", + "No PUB routines found", + "Object count must be from 1 to 255", + "Object distiller overflow", + "Origin exceeds FIT limit", + "Object exceeds 128k (before distilling)", + "Origin exceeds $1F0 limit", + "\"$\" is not allowed here", + "OTHER must be last case", + "PUB/CON list overflow", + "?_RET address is not long", + "?_RET address is out of range", + "Register is not allowed here", + "RES is not allowed in ORGX mode", + "_STACK and _FREE must sum to under 8k", + "Symbols _CLKMODE, _CLKFREQ, _XINFREQ can only be used as integer constants", + "String characters must range from 1 to 255", + "Symbol _DEBUG can only be used as an integer constant", + "Symbol exceeds 256 characters", + "Symbol is already defined", + "STRING not allowed here", + "Size override must be larger", + "Size override must be smaller", + "Source register/constant cannot exceed $1FF", + "Symbols _STACK and _FREE can only be used as integer constants", + "Symbol table is full", + "This instruction is only allowed within a REPEAT block", + "Too many string constants", + "Too many string constant characters", + "Too much variable space is declared", + "Unrecognized character", + "Undefined ?_RET symbol", + "Undefined symbol", + "Variable needs an operator" +}; + +/////////////////////////////////////////////////////////////////////////////////////////// +// TERMS OF USE: MIT License // +/////////////////////////////////////////////////////////////////////////////////////////// +// Permission is hereby granted, free of charge, to any person obtaining a copy of this // +// software and associated documentation files (the "Software"), to deal in the Software // +// without restriction, including without limitation the rights to use, copy, modify, // +// merge, publish, distribute, sublicense, and/or sell copies of the Software, and to // +// permit persons to whom the Software is furnished to do so, subject to the following // +// conditions: // +// // +// The above copyright notice and this permission notice shall be included in all copies // +// or substantial portions of the Software. // +// // +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, // +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A // +// PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT // +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE // +// SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // +/////////////////////////////////////////////////////////////////////////////////////////// diff --git a/Tools/unix/OpenSpin/PropellerCompiler/ErrorStrings.h b/Tools/unix/OpenSpin/PropellerCompiler/ErrorStrings.h new file mode 100644 index 00000000..4d1eee61 --- /dev/null +++ b/Tools/unix/OpenSpin/PropellerCompiler/ErrorStrings.h @@ -0,0 +1,162 @@ +////////////////////////////////////////////////////////////// +// // +// Propeller Spin/PASM Compiler // +// (c)2012-2016 Parallax Inc. DBA Parallax Semiconductor. // +// Adapted from Chip Gracey's x86 asm code by Roy Eltham // +// See end of file for terms of use. // +// // +////////////////////////////////////////////////////////////// +// +// ErrorStrings.h +// + +#ifndef _ERROR_STRINGS_H_ +#define _ERROR_STRINGS_H_ + +enum errorType +{ + error_none = -1, + error_ainl = 0, + error_aioor, + error_bmbpbb, + error_bdmbifc, + error_bnso, + error_ccsronfp, + error_ce32b, + error_coxmbs, + error_csmnexc, + error_cxnawrc, + error_cxswcm, + error_dbz, + error_drcex, + error_eaaeoeol, + error_eaasme, + error_eaasmi, + error_eaboor, + error_eacn, + error_eacuool, + error_eads, + error_eaet, + error_eaiov, + error_eals, + error_eamvaa, + error_easn, + error_easoon, + error_eatq, + error_eauon, + error_eav, + error_eaucnop, + error_eaunbwlo, + error_eaupn, + error_eaurn, + error_eausn, + error_eauvn, + error_ebwol, + error_ecoeol, + error_ecolon, + error_ecomma, + error_ecor, + error_ecoxmbs, + error_edot, + error_eeol, + error_eelcoeol, + error_efrom, + error_eitc, + error_eleft, + error_eleftb, + error_epoa, + error_epoeol, + error_epound, + error_erb, + error_erbb, + error_eright, + error_erightb, + error_es, + error_esoeol, + error_eto, + error_ftl, + error_fpcmbw, + error_fpnaiie, + error_fpo, + error_ibn, + error_icms, + error_idbn, + error_idfnf, + error_ifc, + error_ifufiq, + error_inaifpe, + error_internal, + error_ionaifpe, + error_loxce, + error_loxnbe, + error_loxuoe, + error_loxudfe, + error_loxupfe, + error_loxuafe, + error_litl, + error_loxdse, + error_loxee, + error_loxlve, + error_loxpe, + error_loxspoe, + error_micuwn, + error_nce, + error_nprf, + error_ocmbf1tx, + error_odo, + error_oefl, + error_oex, + error_oexl, + error_oinah, + error_omblc, + error_pclo, + error_rainl, + error_raioor, + error_rinah, + error_rinaiom, + error_safms, + error_sccx, + error_scmr, + error_sdcobu, + error_sexc, + error_siad, + error_snah, + error_sombl, + error_sombs, + error_srccex, + error_ssaf, + error_stif, + error_tioawarb, + error_tmsc, + error_tmscc, + error_tmvsid, + error_uc, + error_urs, + error_us, + error_vnao +}; + +extern const char* g_pErrorStrings[]; + +#endif // _ERROR_STRINGS_H_ + +/////////////////////////////////////////////////////////////////////////////////////////// +// TERMS OF USE: MIT License // +/////////////////////////////////////////////////////////////////////////////////////////// +// Permission is hereby granted, free of charge, to any person obtaining a copy of this // +// software and associated documentation files (the "Software"), to deal in the Software // +// without restriction, including without limitation the rights to use, copy, modify, // +// merge, publish, distribute, sublicense, and/or sell copies of the Software, and to // +// permit persons to whom the Software is furnished to do so, subject to the following // +// conditions: // +// // +// The above copyright notice and this permission notice shall be included in all copies // +// or substantial portions of the Software. // +// // +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, // +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A // +// PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT // +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE // +// SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // +/////////////////////////////////////////////////////////////////////////////////////////// diff --git a/Tools/unix/OpenSpin/PropellerCompiler/ExpressionResolver.cpp b/Tools/unix/OpenSpin/PropellerCompiler/ExpressionResolver.cpp new file mode 100644 index 00000000..7fb95215 --- /dev/null +++ b/Tools/unix/OpenSpin/PropellerCompiler/ExpressionResolver.cpp @@ -0,0 +1,977 @@ +////////////////////////////////////////////////////////////// +// // +// Propeller Spin/PASM Compiler // +// (c)2012-2016 Parallax Inc. DBA Parallax Semiconductor. // +// Adapted from Chip Gracey's x86 asm code by Roy Eltham // +// See end of file for terms of use. // +// // +////////////////////////////////////////////////////////////// +// +// ExpressionResolver.cpp +// + +#include +#include +#include "Utilities.h" +#include "PropellerCompilerInternal.h" +#include "SymbolEngine.h" +#include "Elementizer.h" +#include "ErrorStrings.h" + +//bool GetTryValue(bool bMustResolve, bool bInteger, bool bOperandMode = false); // declared in Utilities.h + +////////////////////////////////////////// +// declarations of internal functions +// + +void ResolveExpression(); +void ResolveSubExpression(int precedence); +void GetTerm(int& precedence); + +bool CheckUndefined(bool& bUndefined); +bool CheckDat(); +bool CheckConstant(bool& bConstant); +bool GetObjSymbol(int type, char id); + +bool PreviewOp(); +bool PerformPush(); +bool PerformBinary(); +bool PerformOp(); + +////////////////////////////////////////// +// exported functions +// + +// only valid after calling GetTryValue() with bMustResolve set to true and it returned true +int GetResult() +{ + return g_pCompilerData->mathStack[g_pCompilerData->mathCurrent - 1]; +} + +// if this succeeds and bMustResolve it true then, the result is in g_pCompilerData->mathStack[g_pCompilerData->mathCurrent-1] +bool GetTryValue(bool bMustResolve, bool bInteger, bool bOperandMode) +{ + g_pCompilerData->intMode = bInteger ? 1 : 0; + g_pCompilerData->bMustResolve = bMustResolve; + g_pCompilerData->bOperandMode = bOperandMode; + g_pCompilerData->mathCurrent = 0; + g_pCompilerData->bUndefined = false; + g_pCompilerData->currentOp = 0; + + bool bEof = false; + if (!g_pElementizer->GetNext(bEof)) + { + return false; + } + int save_start = g_pCompilerData->source_start; + g_pElementizer->Backup(); + + // results are put into g_pCompilerData + ResolveExpression(); + + if (g_pCompilerData->error) + { + return false; + } + + g_pElementizer->Backup(); + if (!g_pElementizer->GetNext(bEof)) + { + return false; + } + g_pCompilerData->source_start = save_start; + + return true; +} + +////////////////////////////////////////// +// internal function definitions +// + +void ResolveExpression() +{ + g_pCompilerData->precedence = 11; + ResolveSubExpression(g_pCompilerData->precedence - 1); +} + +void ResolveSubExpression(int precedence) +{ + if (precedence < 0) + { + GetTerm(precedence); + } + else + { + ResolveSubExpression(precedence - 1); + } + + if (g_pCompilerData->error) + { + return; + } + + bool bEof = false; + + while (!bEof) + { + if (!g_pElementizer->GetNext(bEof)) + { + return; + } + if (g_pElementizer->GetType() != type_binary) + { + g_pElementizer->Backup(); + return; + } + if (!PreviewOp()) + { + return; + } + if (precedence != g_pElementizer->GetValue()) + { + g_pElementizer->Backup(); + return; + } + g_pCompilerData->savedOp[g_pCompilerData->currentOp] = g_pElementizer->GetOpType(); + g_pCompilerData->currentOp++; + int save_start = g_pCompilerData->source_start; + int save_finish = g_pCompilerData->source_finish; + ResolveSubExpression(precedence - 1); + if (g_pCompilerData->error) + { + return; + } + g_pCompilerData->source_start = save_start; + g_pCompilerData->source_finish = save_finish; + if (!PerformBinary()) + { + return; + } + g_pCompilerData->currentOp--; + } +} + +void GetTerm(int& precedence) +{ + bool bEof = false; + + // skip over any leading +'s + do + { + g_pElementizer->GetNext(bEof); + if (g_pElementizer->GetType() == type_binary && g_pElementizer->GetOpType() == op_add) + { + continue; + } + break; + } while (!bEof); + + bool bConstant = false; + if (!CheckConstant(bConstant)) + { + if (g_pCompilerData->error) + { + return; + } + } + if (bConstant) + { + PerformPush(); + return; + } + + if (g_pElementizer->SubToNeg()) + { + precedence = 0; + } + + if (g_pElementizer->GetType() == type_unary) + { + if (!PreviewOp()) + { + return; + } + precedence = g_pElementizer->GetValue(); // for unary types, value = precedence + int save_start = g_pCompilerData->source_start; + int save_finish = g_pCompilerData->source_finish; + g_pCompilerData->savedOp[g_pCompilerData->currentOp] = g_pElementizer->GetOpType(); + g_pCompilerData->currentOp++; + ResolveSubExpression(precedence - 1); + if (g_pCompilerData->error) + { + return; + } + g_pCompilerData->source_start = save_start; + g_pCompilerData->source_finish = save_finish; + if (!PerformOp()) + { + return; + } + g_pCompilerData->currentOp--; + } + else if (g_pElementizer->GetType() == type_left) + { + ResolveExpression(); + if (!g_pElementizer->GetElement(type_right)) + { + return; + } + } + else if (g_pCompilerData->bMustResolve) + { + g_pCompilerData->error = true; + g_pCompilerData->error_msg = g_pErrorStrings[error_eacuool]; + // when we return from here, the calling code will return due to error = true + } +} + +bool CheckUndefined(bool& bUndefined) +{ + if (g_pElementizer->GetType() == type_undefined) + { + g_pCompilerData->bUndefined = bUndefined = true; + + int save_start = g_pCompilerData->source_start; + int save_finish = g_pCompilerData->source_finish; + if(g_pElementizer->CheckElement(type_pound)) + { + int length = 0; + if (!GetSymbol(&length)) + { + return false; + } + if (length == 0) + { + g_pCompilerData->error = true; + g_pCompilerData->error_msg = g_pErrorStrings[error_eacn]; + return false; + } + } + g_pCompilerData->source_start = save_start; + g_pCompilerData->source_finish = save_finish; + + if (g_pCompilerData->bMustResolve) + { + g_pCompilerData->error = true; + g_pCompilerData->error_msg = g_pErrorStrings[error_us]; + return false; + } + } + else + { + bUndefined = false; + } + + return true; +} + +bool CheckDat() +{ + if (g_pCompilerData->bOperandMode) + { + g_pElementizer->DatResToLong(); + } + if ((g_pElementizer->GetType() == type_dat_byte) || + (g_pElementizer->GetType() == type_dat_word) || + (g_pElementizer->GetType() == type_dat_long)) + { + return true; + } + + return false; +} + +bool CheckConstant(bool& bConstant) +{ + bConstant = true; + + if (g_pElementizer->GetType() == type_con) + { + if (g_pCompilerData->intMode == 2) + { + g_pCompilerData->error = true; + g_pCompilerData->error_msg = g_pErrorStrings[error_fpnaiie]; + return false; + } + else + { + g_pCompilerData->intMode = 1; + } + g_pCompilerData->intermediateResult = g_pElementizer->GetValue(); + return true; + } + else if (g_pElementizer->GetType() == type_con_float) + { + if (g_pCompilerData->intMode == 1) + { + g_pCompilerData->error = true; + g_pCompilerData->error_msg = g_pErrorStrings[error_inaifpe]; + return false; + } + else + { + g_pCompilerData->intMode = 2; + } + g_pCompilerData->intermediateResult = g_pElementizer->GetValue(); + return true; + } + else if (g_pElementizer->GetType() == type_float) + { + if (g_pCompilerData->intMode == 1) + { + g_pCompilerData->error = true; + g_pCompilerData->error_msg = g_pErrorStrings[error_inaifpe]; + return false; + } + else + { + g_pCompilerData->intMode = 2; + } + if (!g_pElementizer->GetElement(type_left)) + { + return false; + } + g_pCompilerData->intMode = 1; + ResolveExpression(); // integer mode + g_pCompilerData->intMode = 2; + if (!g_pElementizer->GetElement(type_right)) + { + return false; + } + + int value = g_pCompilerData->mathStack[g_pCompilerData->mathCurrent - 1]; + g_pCompilerData->mathCurrent--; + float fValue = (float)(value); + g_pCompilerData->intermediateResult = *(int*)(&fValue); + return true; + } + else if (g_pElementizer->GetType() == type_round) + { + if (g_pCompilerData->intMode == 2) + { + g_pCompilerData->error = true; + g_pCompilerData->error_msg = g_pErrorStrings[error_fpnaiie]; + return false; + } + else + { + g_pCompilerData->intMode = 1; + } + if (!g_pElementizer->GetElement(type_left)) + { + return false; + } + g_pCompilerData->intMode = 2; + ResolveExpression(); // float mode + g_pCompilerData->intMode = 1; + if (!g_pElementizer->GetElement(type_right)) + { + return false; + } + + // convert float to rounded integer + int value = g_pCompilerData->mathStack[g_pCompilerData->mathCurrent - 1]; + g_pCompilerData->mathCurrent--; + float fValue = *(float*)(&value); + g_pCompilerData->intermediateResult = (int)(fValue + 0.5f); + return true; + } + else if (g_pElementizer->GetType() == type_trunc) + { + if (g_pCompilerData->intMode == 2) + { + g_pCompilerData->error = true; + g_pCompilerData->error_msg = g_pErrorStrings[error_fpnaiie]; + return false; + } + else + { + g_pCompilerData->intMode = 1; + } + if (!g_pElementizer->GetElement(type_left)) + { + return false; + } + g_pCompilerData->intMode = 2; + ResolveExpression(); // float mode + g_pCompilerData->intMode = 1; + if (!g_pElementizer->GetElement(type_right)) + { + return false; + } + + // convert float to truncated integer + int value = g_pCompilerData->mathStack[g_pCompilerData->mathCurrent - 1]; + g_pCompilerData->mathCurrent--; + float fValue = *(float*)(&value); + g_pCompilerData->intermediateResult = (int)(fValue); + return true; + } + + if (g_pCompilerData->bOperandMode) + { + bool bLocal = false; + if (!CheckLocal(bLocal)) + { + return false; + } + } + + bool bUndefined = false; + if (!CheckUndefined(bUndefined)) + { + return false; + } + if (bUndefined) + { + if (!g_pCompilerData->bMustResolve) + { + g_pCompilerData->intermediateResult = 0; + } + return true; + } + else if (g_pElementizer->GetType() == type_asm_org) + { + if (g_pCompilerData->bOperandMode) + { + g_pCompilerData->intermediateResult = g_pCompilerData->cog_org >> 2; + return true; + } + else + { + g_pCompilerData->error = true; + g_pCompilerData->error_msg = g_pErrorStrings[error_oinah]; + return false; + } + } + else if (g_pElementizer->GetType() == type_reg) + { + if (g_pCompilerData->bOperandMode) + { + if (g_pCompilerData->intMode == 2) + { + g_pCompilerData->error = true; + g_pCompilerData->error_msg = g_pErrorStrings[error_fpnaiie]; + return false; + } + else + { + g_pCompilerData->intMode = 1; + } + g_pCompilerData->intermediateResult = g_pElementizer->GetValue(); + g_pCompilerData->intermediateResult |= 0x1E0; + return true; + } + else + { + g_pCompilerData->error = true; + g_pCompilerData->error_msg = g_pErrorStrings[error_rinah]; + return false; + } + } + else if (g_pElementizer->GetType() == type_obj) + { + if (!g_pElementizer->GetElement(type_pound)) + { + return false; + } + char id = (g_pElementizer->GetValue() & 0x0000FF00) >> 8; + if (!GetObjSymbol(type_objcon, id)) + { + return false; + } + return CheckConstant(bConstant); + } + else if (g_pElementizer->GetType() == type_at) + { + if (g_pCompilerData->intMode == 2) + { + g_pCompilerData->error = true; + g_pCompilerData->error_msg = g_pErrorStrings[error_fpnaiie]; + return false; + } + else + { + g_pCompilerData->intMode = 1; + } + bool bEof = false; + if (!g_pElementizer->GetNext(bEof)) + { + return false; + } + if (CheckDat()) + { + g_pCompilerData->intermediateResult = g_pElementizer->GetValue(); + return true; + } + bool bUndefinedCheck = false; + if (!CheckUndefined(bUndefinedCheck)) + { + return false; + } + if (bUndefinedCheck) + { + if (!g_pCompilerData->bMustResolve) + { + g_pCompilerData->intermediateResult = 0; + } + bConstant = false; + return true; + } + else + { + g_pCompilerData->error = true; + g_pCompilerData->error_msg = g_pErrorStrings[error_eads]; + return false; + } + } + else if (CheckDat()) + { + if (g_pCompilerData->intMode == 2) + { + g_pCompilerData->error = true; + g_pCompilerData->error_msg = g_pErrorStrings[error_fpnaiie]; + return false; + } + else + { + g_pCompilerData->intMode = 1; + } + if (g_pCompilerData->bOperandMode) + { + // use org address in value 2 + g_pCompilerData->intermediateResult = g_pElementizer->GetValue2(); + + // check for valid long address + if ((g_pCompilerData->intermediateResult & 0x03) != 0) + { + g_pCompilerData->error = true; + g_pCompilerData->error_msg = g_pErrorStrings[error_ainl]; + return false; + } + + // convert to long index + g_pCompilerData->intermediateResult >>= 2; + + if (g_pCompilerData->intermediateResult >= 0x1F0) + { + g_pCompilerData->error = true; + g_pCompilerData->error_msg = g_pErrorStrings[error_aioor]; + return false; + } + } + else + { + g_pCompilerData->intermediateResult = g_pElementizer->GetValue(); + } + return true; + } + + bConstant = false; + return true; +} + +bool PreviewOp() +{ + int i = g_pElementizer->GetOpType(); + int check = 0x00AACD8F; // 00000000 10101010 11001101 10001111 + check >>= i; + if (check & 1) + { + if (g_pCompilerData->intMode == 2) + { + // integer only op while in float mode + g_pCompilerData->error = true; + g_pCompilerData->error_msg = g_pErrorStrings[error_ionaifpe]; + return false; + } + + // force integer mode + g_pCompilerData->intMode = 1; + } + return true; +} + +bool PerformPush() +{ + if (g_pCompilerData->mathCurrent > 9) + { + g_pCompilerData->error = true; + g_pCompilerData->error_msg = g_pErrorStrings[error_eitc]; + return false; + } + + g_pCompilerData->mathStack[g_pCompilerData->mathCurrent] = g_pCompilerData->intermediateResult; + g_pCompilerData->mathCurrent++; + + return true; +} + +bool PerformBinary() +{ + g_pCompilerData->mathCurrent--; + return PerformOp(); +} + +bool PerformOp() +{ + if (g_pCompilerData->bUndefined) + { + g_pCompilerData->mathStack[g_pCompilerData->mathCurrent-1] = 0; + return true; + } + + int value1 = g_pCompilerData->mathStack[g_pCompilerData->mathCurrent - 1]; + int value2 = g_pCompilerData->mathStack[g_pCompilerData->mathCurrent]; + + float fValue1 = *((float*)(&value1)); + float fValue2 = *((float*)(&value2)); + + int result = 0; + float fResult = 0.0f; + + switch(g_pCompilerData->savedOp[g_pCompilerData->currentOp-1]) + { + case op_ror: + result = ror(value1, (value2 & 0xFF)); + break; + + case op_rol: + result = rol(value1, (value2 & 0xFF)); + break; + + case op_shr: + result = (unsigned int)value1 >> (value2 & 0xFF); + break; + + case op_shl: + result = value1 << (value2 & 0xFF); + break; + + case op_min: // limit minimum + if (g_pCompilerData->intMode == 2) + { + fResult = (fValue1 < fValue2) ? fValue2 : fValue1; + } + else + { + result = (value1 < value2) ? value2 : value1; + } + break; + + case op_max: // limit maximum + if (g_pCompilerData->intMode == 2) + { + fResult = (fValue1 > fValue2) ? fValue2 : fValue1; + } + else + { + result = (value1 > value2) ? value2 : value1; + } + break; + + case op_neg: + if (g_pCompilerData->intMode == 2) + { + // float neg (using xor) + fResult = -fValue1; + } + else + { + result = -value1; + } + break; + + case op_not: + result = ~value1; + break; + + case op_and: + result = value1 & value2; + break; + + case op_abs: + if (g_pCompilerData->intMode == 2) + { + // float abs + fResult = (float)fabs(fValue1); + } + else + { + result = (value1 < 0) ? -value1 : value1; + } + break; + + case op_or: + result = value1 | value2; + break; + + case op_xor: + result = value1 ^ value2; + break; + + case op_add: + if (g_pCompilerData->intMode == 2) + { + // float add + fResult = fValue1 + fValue2; + } + else + { + result = value1 + value2; + } + break; + + case op_sub: + if (g_pCompilerData->intMode == 2) + { + // float sub + fResult = fValue1 - fValue2; + } + else + { + result = value1 - value2; + } + break; + + case op_sar: + result = value1 >> (value2 & 0xFF); + break; + + case op_rev: + value2 &= 0xFF; + result = 0; + for (int i = 0; i < value2; i++) + { + result <<= 1; + result |= (value1 & 0x01); + value1 >>= 1; + } + break; + + case op_log_and: + if (value1 != 0) + { + value1 = 0xFFFFFFFF; + } + if (value2 != 0) + { + value2 = 0xFFFFFFFF; + } + result = value1 & value2; + if (g_pCompilerData->intMode == 2) + { + if (result != 0) + { + fResult = 1.0f; + } + else + { + fResult = 0.0f; + } + } + break; + + case op_ncd: + result = 32; + while(!(value1 & 0x80000000) && result > 0) + { + result--; + value1 <<= 1; + } + break; + + case op_log_or: + if (value1 != 0) + { + value1 = 0xFFFFFFFF; + } + if (value2 != 0) + { + value2 = 0xFFFFFFFF; + } + result = value1 | value2; + if (g_pCompilerData->intMode == 2) + { + if (result != 0) + { + fResult = 1.0f; + } + else + { + fResult = 0.0f; + } + } + break; + + case op_dcd: + result = 1; + result <<= (value1 & 0xFF); + break; + + case op_mul: + if (g_pCompilerData->intMode == 2) + { + // float mul + fResult = fValue1 * fValue2; + } + else + { + result = value1 * value2; + } + break; + + case op_scl: + { + // calculate the upper 32bits of the 64bit result of multiplying two 32bit numbers + // I did it this way to avoid using compiler specific stuff. + int a = (value1 >> 16) & 0xffff; + int b = value1 & 0xffff; + int c = (value2 >> 16) & 0xffff; + int d = value2 & 0xffff; + int x = a * d + c * b; + int y = (((b * d) >> 16) & 0xffff) + x; + result = (y >> 16) & 0xffff; + result += a * c; + } + break; + + case op_div: + if (g_pCompilerData->intMode == 2) + { + // float div + fResult = fValue1 / fValue2; + } + else + { + result = value1 / value2; + } + break; + + case op_rem: // remainder (mod) + result = value1 % value2; + break; + + case op_sqr: // sqrt + if (g_pCompilerData->intMode == 2) + { + // float sqrt + if (fValue1 < 0.0f) + { + g_pCompilerData->error = true; + g_pCompilerData->error_msg = g_pErrorStrings[error_ccsronfp]; + return false; + } + fResult = (float)sqrt(fValue1); + } + else + { + for (result = 0; value1 >= (2*result)+1; value1 -= (2*result++)+1); + } + break; + + case op_cmp_b: + case op_cmp_a: + case op_cmp_ne: + case op_cmp_e: + case op_cmp_be: + case op_cmp_ae: + if (g_pCompilerData->intMode == 2) + { + // float cmp + if (fValue1 < fValue2) + { + result = 1; + } + else if (fValue1 > fValue2) + { + result = 2; + } + else + { + result = 4; + } + result &= g_pCompilerData->savedOp[g_pCompilerData->currentOp-1]; + if (result != 0) + { + fResult = 1.0f; + } + else + { + fResult = 0.0f; + } + } + else + { + if (value1 < value2) + { + result = 1; + } + else if (value1 > value2) + { + result = 2; + } + else + { + result = 4; + } + result &= g_pCompilerData->savedOp[g_pCompilerData->currentOp-1]; + if (result != 0) + { + result = 0xFFFFFFFF; + } + } + break; + + case op_log_not: + result = !value1; + if (g_pCompilerData->intMode == 2) + { + if (result != 0) + { + fResult = 1.0f; + } + else + { + fResult = 0.0f; + } + } + else + { + if (result != 0) + { + result = 0xFFFFFFFF; + } + } + break; + } + + if (g_pCompilerData->intMode == 2) + { + result = *(int*)(&fResult); + } + + g_pCompilerData->mathStack[g_pCompilerData->mathCurrent - 1] = result; + return true; +} + +/////////////////////////////////////////////////////////////////////////////////////////// +// TERMS OF USE: MIT License // +/////////////////////////////////////////////////////////////////////////////////////////// +// Permission is hereby granted, free of charge, to any person obtaining a copy of this // +// software and associated documentation files (the "Software"), to deal in the Software // +// without restriction, including without limitation the rights to use, copy, modify, // +// merge, publish, distribute, sublicense, and/or sell copies of the Software, and to // +// permit persons to whom the Software is furnished to do so, subject to the following // +// conditions: // +// // +// The above copyright notice and this permission notice shall be included in all copies // +// or substantial portions of the Software. // +// // +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, // +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A // +// PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT // +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE // +// SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // +/////////////////////////////////////////////////////////////////////////////////////////// diff --git a/Tools/unix/OpenSpin/PropellerCompiler/InstructionBlockCompiler.cpp b/Tools/unix/OpenSpin/PropellerCompiler/InstructionBlockCompiler.cpp new file mode 100644 index 00000000..838f70b3 --- /dev/null +++ b/Tools/unix/OpenSpin/PropellerCompiler/InstructionBlockCompiler.cpp @@ -0,0 +1,876 @@ +////////////////////////////////////////////////////////////// +// // +// Propeller Spin/PASM Compiler // +// (c)2012-2016 Parallax Inc. DBA Parallax Semiconductor. // +// Adapted from Chip Gracey's x86 asm code by Roy Eltham // +// See end of file for terms of use. // +// // +////////////////////////////////////////////////////////////// +// +// InstructionBlockCompiler.cpp +// + +#include +#include +#include +#include +#include "Utilities.h" +#include "PropellerCompilerInternal.h" +#include "SymbolEngine.h" +#include "Elementizer.h" +#include "ErrorStrings.h" +#include "CompileUtilities.h" + +////////////////////////////////////////// +// declarations for internal functions +// + +bool CompileBlock_IfOrIfNot(int column, int bIf); +bool CompileBlock_Case(int column); +bool CompileBlock_Repeat(int column); + +static int s_column = 0; + +////////////////////////////////////////// +// exported functions +// + +bool CompileTopBlock() +{ + g_pCompilerData->bnest_ptr = 0; + g_pCompilerData->bstack_ptr = 0; + StringConstant_PreProcess(); + + if (!CompileBlock(0)) + { + return false; + } + + // enter a return into obj + if (!EnterObj(0x32)) // 0x32 = 00110010b + { + return false; + } + + return StringConstant_PostProcess(); +} + +bool CompileBlock(int column) +{ + bool bEof = false; + + while (!bEof) + { + if (!g_pElementizer->GetNext(bEof)) + { + return false; + } + if (g_pElementizer->GetType() == type_end) + { + continue; + } + if (g_pElementizer->GetType() == type_block) + { + break; + } + + s_column = g_pElementizer->GetColumn(); + if (s_column <= column) + { + break; + } + + if (g_pElementizer->GetType() == type_if) + { + if (!CompileBlock_IfOrIfNot(s_column, true)) + { + return false; + } + } + else if (g_pElementizer->GetType() == type_ifnot) + { + if (!CompileBlock_IfOrIfNot(s_column, false)) + { + return false; + } + } + else if (g_pElementizer->GetType() == type_case) + { + if (!CompileBlock_Case(s_column)) + { + return false; + } + } + else if (g_pElementizer->GetType() == type_repeat) + { + if (!CompileBlock_Repeat(s_column)) + { + return false; + } + } + else + { + if (!CompileInstruction()) + { + return false; + } + if (!g_pElementizer->GetElement(type_end)) + { + return false; + } + } + } + g_pElementizer->Backup(); + return true; +} + +////////////////////////////////////////// +// internal function definitions +// + +bool CompileIfOrIfNot_FinalJmp(int& addressCount) +{ + if (!EnterObj(0x04)) // jmp + { + return false; + } + if (!BlockStack_CompileAddress(0)) + { + return false; + } + BlockStack_Write(addressCount, g_pCompilerData->obj_ptr); + addressCount++; + return true; +} + +bool CompileIfOrIfNot_Condition(int& addressCount, unsigned char byteCode) +{ + if (!CompileExpression()) + { + return false; + } + if (!g_pElementizer->GetElement(type_end)) + { + return false; + } + if (!EnterObj(byteCode)) + { + return false; + } + if (!BlockStack_CompileAddress(addressCount)) + { + return false; + } + return true; +} + +bool CompileIfOrIfNot_ElseCondition(int& addressCount, unsigned char byteCode) +{ + if (!CompileIfOrIfNot_FinalJmp(addressCount)) + { + return false; + } + if (addressCount < (if_limit + 2)) + { + return CompileIfOrIfNot_Condition(addressCount, byteCode); + } + + g_pCompilerData->error = true; + g_pCompilerData->error_msg = g_pErrorStrings[error_loxee]; + return false; +} + +bool CompileIfOrIfNot(int column, int param) +{ + int addressCount = 1; + + if (!CompileIfOrIfNot_Condition(addressCount, (unsigned char)(param))) + { + return false; + } + + bool bEof = false; + + while (!bEof) + { + if (!CompileBlock(column)) + { + return false; + } + + if (!g_pElementizer->GetNext(bEof)) + { + return false; + } + if (bEof) + { + break; + } + s_column = g_pElementizer->GetColumn(); + if (s_column < column) + { + g_pElementizer->Backup(); + break; + } + if (g_pElementizer->GetType() == type_elseif) + { + if (!CompileIfOrIfNot_ElseCondition(addressCount, 0x0A)) + { + return false; + } + } + else if (g_pElementizer->GetType() == type_elseifnot) + { + if (!CompileIfOrIfNot_ElseCondition(addressCount, 0x0B)) + { + return false; + } + } + else if (g_pElementizer->GetType() == type_else) + { + if (!CompileIfOrIfNot_FinalJmp(addressCount)) + { + return false; + } + if (!g_pElementizer->GetElement(type_end)) + { + return false; + } + if (!CompileBlock(column)) + { + return false; + } + break; + } + else + { + g_pElementizer->Backup(); + break; + } + } + + BlockStack_Write(addressCount, g_pCompilerData->obj_ptr); // set last address + BlockStack_Write(0, g_pCompilerData->obj_ptr); // set final address + return true; +} + +bool CompileBlock_IfOrIfNot(int column, int bIf) +{ + if (!BlockNest_New(type_if, if_limit+3)) + { + return false; + } + if (!OptimizeBlock(column, bIf ? 0x0A : 0x0B, &CompileIfOrIfNot)) + { + return false; + } + BlockNest_End(); + return true; +} + +bool CompileCase(int column, int param) +{ + param = param; // stop warning + + if (!BlockStack_CompileConstant()) + { + return false; + } + if (!CompileExpression()) + { + return false; + } + if (!g_pElementizer->GetElement(type_end)) + { + return false; + } + + int savedSourcePtr = g_pElementizer->GetSourcePtr(); + int otherSourcePtr = 0; + bool bOther = false; + int caseCount = 0; + + bool bEof = false; + while (!bEof) + { + if (!g_pElementizer->GetNext(bEof)) + { + return false; + } + if (bEof) + { + break; + } + if (g_pElementizer->GetType() == type_end) + { + continue; + } + s_column = g_pElementizer->GetColumn(); + g_pElementizer->Backup(); + if (s_column <= column) + { + break; + } + + if (bOther) // if we have OTHER: it should have been the last case, so we shouldn't get here again + { + g_pCompilerData->error = true; + g_pCompilerData->error_msg = g_pErrorStrings[error_omblc]; + return false; + } + + if (g_pElementizer->GetType() == type_other) + { + bOther = true; + if (!g_pElementizer->GetNext(bEof)) // get/skip 'other' + { + return false; + } + otherSourcePtr = g_pCompilerData->source_start; // save the pointer to the beginning of 'other' + } + else + { + caseCount++; + if (caseCount > case_limit) + { + g_pCompilerData->error = true; + g_pCompilerData->error_msg = g_pErrorStrings[error_loxce]; + return false; + } + for (;;) + { + bool bRange = false; + if (!CompileRange(bRange)) + { + return false; + } + if (!EnterObj(bRange ? 0x0E : 0x0D)) // enter bytecode for case range or case value into obj + { + return false; + } + if (!BlockStack_CompileAddress(caseCount)) + { + return false; + } + if (!g_pElementizer->CheckElement(type_comma)) + { + break; + } + } + } + if (!g_pElementizer->GetElement(type_colon)) + { + return false; + } + if (!SkipBlock(s_column)) + { + return false; + } + } + + if (caseCount == 0) + { + g_pCompilerData->error = true; + g_pCompilerData->error_msg = g_pErrorStrings[error_nce]; + return false; + } + + if (bOther) + { + // set the source pointer to where the OTHER is at, then get it to set the column + g_pElementizer->SetSourcePtr(otherSourcePtr); + if (!g_pElementizer->GetNext(bEof)) + { + return false; + } + int new_column = g_pElementizer->GetColumn(); + // skip the colon + if (!g_pElementizer->GetNext(bEof)) + { + return false; + } + if (!CompileBlock(new_column)) + { + return false; + } + } + if (!EnterObj(0x0C)) // casedone, end of range checks + { + return false; + } + g_pElementizer->SetSourcePtr(savedSourcePtr); + caseCount = 0; + bOther = false; + bEof = false; + + while(!bEof) + { + if (!g_pElementizer->GetNext(bEof)) + { + return false; + } + if (bEof) + { + break; + } + if (g_pElementizer->GetType() == type_end) + { + continue; + } + s_column = g_pElementizer->GetColumn(); + g_pElementizer->Backup(); + if (s_column <= column) + { + break; + } + + if (g_pElementizer->GetType() == type_other) + { + // skip over other, already compiled + if (!g_pElementizer->GetNext(bEof)) + { + return false; + } + if (!g_pElementizer->GetNext(bEof)) + { + return false; + } + if (!SkipBlock(s_column)) + { + return false; + } + } + else + { + // skip over range/values(s), already compiled + for (;;) + { + if (!SkipRange()) + { + return false; + } + if (!g_pElementizer->CheckElement(type_comma)) + { + break; + } + } + caseCount++; + BlockStack_Write(caseCount, g_pCompilerData->obj_ptr); + if (!g_pElementizer->GetElement(type_colon)) + { + return false; + } + if (!CompileBlock(s_column)) + { + return false; + } + if (!EnterObj(0x0C)) // casedone + { + return false; + } + } + } + BlockStack_Write(0, g_pCompilerData->obj_ptr); + return true; +} + +bool CompileBlock_Case(int column) +{ + if (!BlockNest_New(type_case, case_limit+1)) + { + return false; + } + if (!OptimizeBlock(column, 0, &CompileCase)) + { + return false; + } + BlockNest_End(); + return true; +} + +static bool s_bHasPost = false; +bool CompileRepeatPlain(int column, int param) +{ + param = param; // stop warning + + BlockStack_Write(2, g_pCompilerData->obj_ptr); // set reverse address + if (!s_bHasPost) + { + BlockStack_Write(0, g_pCompilerData->obj_ptr); // set plain 'next' address + } + if (!CompileBlock(column)) + { + return false; + } + bool bEof = false; + if (!g_pElementizer->GetNext(bEof)) + { + return false; + } + unsigned char byteCode = 0x04; + if (!bEof) + { + s_column = g_pElementizer->GetColumn(); + if (s_column < column) + { + g_pElementizer->Backup(); + } + else + { + // check for post while or until + int postType = g_pElementizer->GetType(); + if ((postType == type_while) || + (postType == type_until)) + { + s_bHasPost = true; + BlockStack_Write(0, g_pCompilerData->obj_ptr); // set post-while/until 'next' address + if (!CompileExpression()) // compile post-while/until expression + { + return false; + } + if (!g_pElementizer->GetElement(type_end)) + { + return false; + } + byteCode = (postType == type_while) ? 0x0B : 0x0A; + } + else + { + g_pElementizer->Backup(); + } + } + } + if (!EnterObj(byteCode)) + { + return false; + } + if (!BlockStack_CompileAddress(2)) // compile reverse address + { + return false; + } + BlockStack_Write(1, g_pCompilerData->obj_ptr); // set 'quit' address + + return true; +} + +bool CompileRepeatPreWhileOrUntil(int column, int param) +{ + BlockStack_Write(0, g_pCompilerData->obj_ptr); // set 'next'/reverse address + if (!CompileExpression()) // compile pre-while/until expression + { + return false; + } + if (!g_pElementizer->GetElement(type_end)) + { + return false; + } + if (!EnterObj((unsigned char)(param & 0xFF))) // enter the passed in bytecode (jz or jnz) + { + return false; + } + if (!BlockStack_CompileAddress(1)) // compile forward address + { + return false; + } + if (!CompileBlock(column)) // compile repeat-while/until block + { + return false; + } + if (!EnterObj(0x04)) // (jmp) + { + return false; + } + if (!BlockStack_CompileAddress(0)) // compile reverse address + { + return false; + } + BlockStack_Write(1, g_pCompilerData->obj_ptr); // set 'quit'/forward address + return true; +} + +bool CompileRepeatCount(int column, int param) +{ + param = param; // stop warning + + if (!CompileExpression()) // compile count expression + { + return false; + } + if (!g_pElementizer->GetElement(type_end)) + { + return false; + } + if (!EnterObj(0x08)) // (tjz) + { + return false; + } + if (!BlockStack_CompileAddress(1)) // compile forward address + { + return false; + } + BlockStack_Write(2, g_pCompilerData->obj_ptr); // set reverse address + if (!CompileBlock(column)) // compile repeat-count block + { + return false; + } + BlockStack_Write(0, g_pCompilerData->obj_ptr); // set 'next' address + if (!EnterObj(0x09)) // (djnz) + { + return false; + } + if (!BlockStack_CompileAddress(2)) // compile reverse address + { + return false; + } + BlockStack_Write(1, g_pCompilerData->obj_ptr); // set 'quit'/forward address + return true; +} + +bool CompileRepeatVariable(int column, int param) +{ + param = param; // stop warning + + unsigned char varType = 0; + unsigned char varSize = 0; + int varAddress = 0; + int varIndexSourcePtr = 0; + if (!GetVariable(varType, varSize, varAddress, varIndexSourcePtr)) + { + return false; + } + + bool bEof = false; + if (!g_pElementizer->GetNext(bEof)) // get 'from' + { + return false; + } + if (g_pElementizer->GetType() != type_from) + { + g_pCompilerData->error = true; + g_pCompilerData->error_msg = g_pErrorStrings[error_efrom]; + return false; + } + int fromSourcePtr = g_pElementizer->GetSourcePtr(); + g_pCompilerData->str_enable = false; + if (!CompileExpression()) // compile 'from' expression (string not allowed) + { + return false; + } + g_pCompilerData->str_enable = true; + + if (!CompileVariable(1, 0, varType, varSize, varAddress, varIndexSourcePtr)) // compile var write + { + return false; + } + BlockStack_Write(2, g_pCompilerData->obj_ptr); // set reverse address + + if (!g_pElementizer->GetNext(bEof)) // get 'to' + { + return false; + } + if (g_pElementizer->GetType() != type_to) + { + g_pCompilerData->error = true; + g_pCompilerData->error_msg = g_pErrorStrings[error_eto]; + return false; + } + g_pCompilerData->str_enable = false; + if (!SkipExpression()) // skip 'to' expression (string not allowed) + { + return false; + } + g_pCompilerData->str_enable = true; + + if (!g_pElementizer->GetNext(bEof)) // check for 'step' + { + return false; + } + unsigned char byteCode = 0; + if (g_pElementizer->GetType() == type_step) + { + // handle step + int savedSourcePtr = g_pElementizer->GetSourcePtr(); + g_pCompilerData->str_enable = false; + if (!SkipExpression()) // skip 'step' expression (string not allowed) + { + return false; + } + g_pCompilerData->str_enable = true; + if (!g_pElementizer->GetElement(type_end)) + { + return false; + } + if (!CompileBlock(column)) + { + return false; + } + BlockStack_Write(0, g_pCompilerData->obj_ptr); // set 'next' address + if (!CompileOutOfSequenceExpression(savedSourcePtr)) // compile the step expression + { + return false; + } + byteCode = 0x06; // (repeat-var w/step) + } + else if (g_pElementizer->GetType() == type_end) + { + // no step, compile block + if (!CompileBlock(column)) + { + return false; + } + BlockStack_Write(0, g_pCompilerData->obj_ptr); // set 'next' address + byteCode = 0x02; // (repeat-var) + } + else + { + g_pCompilerData->error = true; + g_pCompilerData->error_msg = g_pErrorStrings[error_esoeol]; + return false; + } + + int savedSourcePtr = g_pElementizer->GetSourcePtr(); + g_pElementizer->SetSourcePtr(fromSourcePtr); + if (!CompileExpression()) // compile 'from' expression + { + return false; + } + if (!g_pElementizer->GetNext(bEof)) // skip 'to' + { + return false; + } + if (!CompileExpression()) // compile 'to' expression + { + return false; + } + g_pElementizer->SetSourcePtr(savedSourcePtr); + if (!CompileVariable_Assign(byteCode, varType, varSize, varAddress, varIndexSourcePtr)) // compile repeat-var + { + return false; + } + if (!BlockStack_CompileAddress(2)) // compile reverse address + { + return false; + } + BlockStack_Write(1, g_pCompilerData->obj_ptr); // set 'quit'/forward address + return true; +} + +bool CompileBlock_Repeat(int column) +{ + if (!BlockNest_New(type_repeat, 3)) + { + return false; + } + + // determine which type of repeat + bool (*pCompileFunc)(int, int) = 0; + int param = 0; + bool bEof = false; + if (!g_pElementizer->GetNext(bEof)) + { + return false; + } + if (g_pElementizer->GetType() == type_end) + { + // repeat + pCompileFunc = &CompileRepeatPlain; + s_bHasPost = false; // assume it doesn't have a post while or until (will be detected) + } + else if (g_pElementizer->GetType() == type_while) + { + // repeat while + pCompileFunc = &CompileRepeatPreWhileOrUntil; + param = 0x0A; + } + else if (g_pElementizer->GetType() == type_until) + { + // repeat until + pCompileFunc = &CompileRepeatPreWhileOrUntil; + param = 0x0B; + } + else + { + g_pElementizer->Backup(); + int savedSourcePtr = g_pElementizer->GetSourcePtr(); + if (!SkipExpression()) + { + return false; + } + if (!g_pElementizer->GetNext(bEof)) + { + return false; + } + g_pElementizer->SetSourcePtr(savedSourcePtr); + if (g_pElementizer->GetType() == type_end) + { + // repeat + pCompileFunc = &CompileRepeatCount; + // redo blocknest type + BlockNest_Redo(type_repeat_count); + } + else + { + // repeat var from to step + pCompileFunc = &CompileRepeatVariable; + } + } + + if (!OptimizeBlock(column, param, pCompileFunc)) + { + return false; + } + + BlockNest_End(); + return true; +} + +bool OptimizeBlock(int column, int param, bool (*pCompileFunction)(int, int)) +{ + int savedSourcePtr = g_pElementizer->GetSourcePtr(); + int savedObjPtr = g_pCompilerData->obj_ptr; + int size = 0; + + for (;;) + { + g_pElementizer->SetSourcePtr(savedSourcePtr); + g_pCompilerData->obj_ptr = savedObjPtr; + + if (!(*pCompileFunction)(column, param)) + { + return false; + } + + // (re)compile until same size twice + if (size != g_pCompilerData->obj_ptr) + { + size = g_pCompilerData->obj_ptr; + } + else + { + break; + } + } + + return true; +} + +/////////////////////////////////////////////////////////////////////////////////////////// +// TERMS OF USE: MIT License // +/////////////////////////////////////////////////////////////////////////////////////////// +// Permission is hereby granted, free of charge, to any person obtaining a copy of this // +// software and associated documentation files (the "Software"), to deal in the Software // +// without restriction, including without limitation the rights to use, copy, modify, // +// merge, publish, distribute, sublicense, and/or sell copies of the Software, and to // +// permit persons to whom the Software is furnished to do so, subject to the following // +// conditions: // +// // +// The above copyright notice and this permission notice shall be included in all copies // +// or substantial portions of the Software. // +// // +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, // +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A // +// PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT // +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE // +// SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // +/////////////////////////////////////////////////////////////////////////////////////////// diff --git a/Tools/unix/OpenSpin/PropellerCompiler/Makefile b/Tools/unix/OpenSpin/PropellerCompiler/Makefile new file mode 100644 index 00000000..f29cc2b0 --- /dev/null +++ b/Tools/unix/OpenSpin/PropellerCompiler/Makefile @@ -0,0 +1,73 @@ +# cross compilation scheme taken from Eric Smith's spin2cpp compiler +# if CROSS is defined, we are building a cross compiler +# possible targets are: win32, rpi + +ifeq ($(CC),) + CC=gcc +endif + +ifeq ($(CXX),) + CXX=g++ +endif + +ifeq ($(CROSS),win32) + CC=i686-w64-mingw32-gcc + CXX=i686-w64-mingw32-g++ + EXT=.exe + BUILD=./build-win32 +else ifeq ($(CROSS),rpi) + CC=arm-linux-gnueabihf-gcc + CXX=arm-linux-gnueabihf-g++ + EXT= + BUILD=./build-rpi +else + EXT= + BUILD=./build +endif + +OS:=$(shell uname) + +ifeq ($(OS),Darwin) + CFLAGS+=-Wall -g -Wno-self-assign +else + CFLAGS+=-Wall -g $(MSTATIC) +endif +CXXFLAGS += $(CFLAGS) + +LIBNAME=$(BUILD)/libopenspin.a +SRCDIR=. +OBJ=$(BUILD)/BlockNestStackRoutines.o \ + $(BUILD)/CompileDatBlocks.o \ + $(BUILD)/CompileExpression.o \ + $(BUILD)/CompileInstruction.o \ + $(BUILD)/CompileUtilities.o \ + $(BUILD)/DistillObjects.o \ + $(BUILD)/Elementizer.o \ + $(BUILD)/ErrorStrings.o \ + $(BUILD)/ExpressionResolver.o \ + $(BUILD)/InstructionBlockCompiler.o \ + $(BUILD)/StringConstantRoutines.o \ + $(BUILD)/SymbolEngine.o \ + $(BUILD)/Utilities.o \ + $(BUILD)/UnusedMethodUtils.o \ + $(BUILD)/PropellerCompiler.o \ + $(BUILD)/CompileSpin.o \ + $(BUILD)/flexbuf.o \ + $(BUILD)/preprocess.o \ + $(BUILD)/textconvert.o \ + $(BUILD)/objectheap.o + + +all: $(BUILD) $(LIBNAME) Makefile + +$(LIBNAME): $(OBJ) + $(AR) rs $@ $^ + +$(BUILD)/%.o: $(SRCDIR)/%.cpp + $(CXX) $(CXXFLAGS) -o $@ -c $< + +$(BUILD): + mkdir -p $(BUILD) + +clean: + rm -rf $(BUILD) diff --git a/Tools/unix/OpenSpin/PropellerCompiler/PropellerCompiler.cpp b/Tools/unix/OpenSpin/PropellerCompiler/PropellerCompiler.cpp new file mode 100644 index 00000000..513bc129 --- /dev/null +++ b/Tools/unix/OpenSpin/PropellerCompiler/PropellerCompiler.cpp @@ -0,0 +1,2129 @@ +////////////////////////////////////////////////////////////// +// // +// Propeller Spin/PASM Compiler // +// (c)2012-2016 Parallax Inc. DBA Parallax Semiconductor. // +// Adapted from Chip Gracey's x86 asm code by Roy Eltham // +// See end of file for terms of use. // +// // +////////////////////////////////////////////////////////////// +// +// PropellerCompiler.cpp +// + +#include +#include +#include +#include +#include "Utilities.h" +#include "PropellerCompilerInternal.h" +#include "SymbolEngine.h" +#include "Elementizer.h" +#include "ErrorStrings.h" +#include "UnusedMethodUtils.h" + +////////////////////////////////////////// +// declarations for internal functions +// some of these are defined in other files (where noted) +// + +bool CompileDevBlocks(); +bool CompileConBlocks(int pass); +bool CompileSubBlocksId(); +bool CompileObjBlocksId(); +bool CompileDatBlocksFileNames(); + +bool CompileObjSymbols(); +bool CompileVarBlocks(); +extern bool CompileDatBlocks(); // in CompileDatBlocks.cpp +bool CompileSubBlocks(); +bool CompileObjBlocks(); +bool DistillObjBlocks(); +bool CompileFinal(); +bool PointToFirstCon(); +bool DetermineStack(); +bool DetermineClock(); +bool DetermineDebug(); +bool CompileDoc(); + +extern bool DistillObjects(); // in DistillObjects.cpp +extern bool CompileTopBlock(); // in InstructionBlockCompiler.cpp + +// globals used by the compiler +CompilerDataInternal* g_pCompilerData = 0; +SymbolEngine* g_pSymbolEngine = 0; +Elementizer* g_pElementizer = 0; + +////////////////////////////////////////// +// exported functions +// + +// Call this before using Compile1() & Compile2() +// the CompilerData pointer it returns is what Compile1() and Compile2() use/fill. +CompilerData* InitStruct() +{ + g_pCompilerData = new CompilerDataInternal; + // wipe the compiler data struct with 0's + memset(g_pCompilerData, 0, sizeof(CompilerDataInternal)); + + g_pSymbolEngine = new SymbolEngine; + g_pElementizer = new Elementizer(g_pCompilerData, g_pSymbolEngine); + + return g_pCompilerData; +} + +void Cleanup() +{ + delete g_pElementizer; + g_pElementizer = 0; + delete g_pSymbolEngine; + g_pSymbolEngine = 0; + delete g_pCompilerData; + g_pCompilerData = 0; +} + +// Usage: +// +// Call Compile1 +// Load any obj files +// Call Compile2 +// Save new obj file +// +// OBJ structure: +// +// word varsize, pgmsize ;variable and program sizes +// +// 0: word objsize ;object size (w/o sub-objects) +// byte objindex>>2, objcount ;sub-object start index and count +// 4: word PUBn offset, PUBn locals ;index to PUBs (multiple) +// word PRIn offset, PRIn locals ;index to PRIs (multiple) +// objindex: word OBJn offset, OBJn var offset ;index to OBJs (multiple) +// byte DAT data... ;DAT data +// byte PUB data... ;PUB data +// byte PRI data... ;PRI data +// objsize: +// long OBJ data... ;OBJ data (sub-objects) +// pgmsize: +// byte checksum ;checksum reveals language_version +// byte 'PUBn', parameters ;PUB names and parameters (0..15) +// byte 'CONn', 16, values ;CON names and values +// + +const char* Compile1() +{ + g_pElementizer->Reset(); + g_pSymbolEngine->Reset(); + g_pCompilerData->pubcon_list_size = 0; + g_pCompilerData->list_length = 0; + g_pCompilerData->doc_length = 0; + g_pCompilerData->doc_mode = false; + g_pCompilerData->info_count = 0; + + // reset obj pointer based on compile_mode + if (g_pCompilerData->compile_mode == 0) + { + g_pCompilerData->obj_ptr = 4; + } + else + { + g_pCompilerData->obj_ptr = 0; + } + + SetPrint(g_pCompilerData->list, g_pCompilerData->list_limit); + + if (!CompileDevBlocks()) + { + return g_pCompilerData->error_msg; + } + if (!CompileConBlocks(0)) + { + return g_pCompilerData->error_msg; + } + if (!CompileSubBlocksId()) + { + return g_pCompilerData->error_msg; + } + if (!CompileObjBlocksId()) + { + return g_pCompilerData->error_msg; + } + if (!CompileDatBlocksFileNames()) + { + return g_pCompilerData->error_msg; + } + + g_pCompilerData->source_start = 0; + g_pCompilerData->source_finish = 0; + return 0; +} + +const char* Compile2() +{ + if (!CompileObjSymbols()) + { + return g_pCompilerData->error_msg; + } + if (!CompileConBlocks(1)) + { + return g_pCompilerData->error_msg; + } + if (!CompileVarBlocks()) + { + return g_pCompilerData->error_msg; + } + if (!CompileDatBlocks()) + { + return g_pCompilerData->error_msg; + } + + if (!g_pCompilerData->bDATonly) + { + if (!CompileSubBlocks()) + { + return g_pCompilerData->error_msg; + } + } + + if (!CompileObjBlocks()) + { + return g_pCompilerData->error_msg; + } + + if (!g_pCompilerData->bDATonly) + { + if (!DistillObjBlocks()) + { + return g_pCompilerData->error_msg; + } + } + + if (!CompileFinal()) + { + return g_pCompilerData->error_msg; + } + + if (!g_pCompilerData->bDATonly) + { + if (!PointToFirstCon()) + { + return g_pCompilerData->error_msg; + } + if (!DetermineStack()) + { + return g_pCompilerData->error_msg; + } + if (!DetermineClock()) + { + return g_pCompilerData->error_msg; + } + if (!DetermineDebug()) + { + return g_pCompilerData->error_msg; + } + + if (!PrintObj()) + { + return g_pCompilerData->error_msg; + } + + g_pCompilerData->list_length = g_pCompilerData->print_length; + + if (g_pCompilerData->doc_limit > 0) + { + SetPrint(g_pCompilerData->doc, g_pCompilerData->doc_limit); + + if (!CompileDoc()) + { + return g_pCompilerData->error_msg; + } + g_pCompilerData->doc_length = g_pCompilerData->print_length; + } + else + { + g_pCompilerData->doc_length = 0; + } + } + + g_pCompilerData->source_start = 0; + g_pCompilerData->source_finish = 0; + return 0; +} + +bool GetErrorInfo(int& lineNumber, int& column, int& offsetToStartOfLine, int& offsetToEndOfLine, int& offendingItemStart, int& offendingItemEnd) +{ + if (g_pCompilerData && g_pCompilerData->error) + { + lineNumber = g_pElementizer->GetCurrentLineNumber(offsetToStartOfLine, offsetToEndOfLine); + column = g_pElementizer->GetColumn(); + offendingItemStart = g_pCompilerData->source_start; + offendingItemEnd = g_pCompilerData->source_finish; + return true; + } + + return false; +} + +////////////////////////////////////////// +// internal function definitions +// + +bool CompileDevBlocks() +{ + g_pCompilerData->pre_files = 0; + g_pCompilerData->arc_files = 0; + int index = 0; + + bool bEof = false; + g_pElementizer->Reset(); + + while (!bEof) + { + if(g_pElementizer->GetNextBlock(block_dev, bEof)) + { + while (!bEof) + { + if (!g_pElementizer->GetNext(bEof)) + { + return false; + } + if (g_pElementizer->GetType() == type_end) + { + continue; + } + if (g_pElementizer->GetType() == type_precompile) + { + if (!AddFileName(g_pCompilerData->pre_files, + index, + g_pCompilerData->pre_filenames, + g_pCompilerData->pre_name_start, + g_pCompilerData->pre_name_finish, + error_loxupfe)) + { + return false; + } + if (!g_pElementizer->GetElement(type_end)) + { + return false; + } + continue; + } + else if (g_pElementizer->GetType() == type_archive) + { + if (!AddFileName(g_pCompilerData->arc_files, + index, + g_pCompilerData->arc_filenames, + g_pCompilerData->arc_name_start, + g_pCompilerData->arc_name_finish, + error_loxuafe)) + { + return false; + } + if (!g_pElementizer->GetElement(type_end)) + { + return false; + } + continue; + } + else if (g_pElementizer->GetType() != type_block) + { + // we got an element that wasn't a precompile or archive or the next block + g_pCompilerData->error = true; + g_pCompilerData->error_msg = g_pErrorStrings[error_epoa]; + return false; + } + + // if we get here, then the element we got was of type_block + + // finished with this block, backup off the next block + g_pElementizer->Backup(); + break; + } + } + else + { + return false; + } + } + + return true; +} + +bool CompileConBlocks(int pass) +{ + bool bEof = false; + g_pElementizer->Reset(); + + while (!bEof) + { + g_pCompilerData->enum_valid = 1; + g_pCompilerData->enum_value = 0; + + bool bFindNextConBlock = false; + while (!bEof && !bFindNextConBlock) + { + if (!g_pElementizer->GetNext(bEof)) + { + return false; + } + if (g_pElementizer->GetType() == type_end) + { + continue; + } + + while(!bEof) + { + g_pCompilerData->assign_flag = 1; + + if ((g_pElementizer->GetType() == type_con) || + (g_pElementizer->GetType() == type_con_float)) + { + // constant + if (pass == 0) + { + g_pCompilerData->error = true; + g_pCompilerData->error_msg = g_pErrorStrings[error_eaucnop]; + return false; + } + else + { + g_pCompilerData->assign_flag = 0; + g_pCompilerData->assign_type = g_pElementizer->GetType(); + g_pCompilerData->assign_value = g_pElementizer->GetValue(); + } + + if (!HandleConSymbol(pass)) + { + return false; + } + } + else if (g_pElementizer->GetType() == type_undefined) + { + if (!HandleConSymbol(pass)) + { + return false; + } + } + else if (g_pElementizer->GetType() == type_pound) + { + // pound + if (!GetTryValue(pass == 1 ? true : false, true)) + { + return false; + } + if (g_pCompilerData->bUndefined == false) + { + g_pCompilerData->enum_valid = 1; + g_pCompilerData->enum_value = GetResult(); + } + else + { + g_pCompilerData->enum_valid = 0; + } + } + else if (g_pElementizer->GetType() == type_block) + { + // hit next block, so backup and search for next con block + g_pElementizer->Backup(); + bFindNextConBlock = true; + break; + } + else + { + // we got an element that isn't valid in a con block + g_pCompilerData->error = true; + g_pCompilerData->error_msg = g_pErrorStrings[error_eaucnop]; + return false; + } + + bool bComma = false; + if (!GetCommaOrEnd(bComma)) + { + return false; + } + if (bComma == false) + { + break; + } + if(!g_pElementizer->GetNext(bEof)) + { + return false; + } + } + } + + if(!bEof) + { + if(!g_pElementizer->GetNextBlock(block_con, bEof)) + { + return false; + } + } + } + return true; +} + +bool CompileSubBlocksId_Compile(int blockType, bool &bFirst, int &nMethodIndex) +{ + bool bEof = false; + g_pElementizer->Reset(); + + while (!bEof) + { + if(g_pElementizer->GetNextBlock(blockType, bEof)) + { + if (!bEof) + { + char params = 0; + int locals = 0; + + if (!g_pElementizer->GetNext(bEof)) + { + return false; + } + if (g_pElementizer->GetType() == type_end || g_pElementizer->GetType() != type_undefined) + { + g_pCompilerData->error = true; + g_pCompilerData->error_msg = g_pErrorStrings[error_eausn]; + return false; + } + + // save a copy of the symbol + g_pElementizer->BackupSymbol(); + + if (g_pCompilerData->obj_ptr < 256*4) + { + params = 0; + + // are there parameters? + if (g_pElementizer->CheckElement(type_left)) + { + // if so, then count them + while (!bEof) + { + if (!g_pElementizer->GetNext(bEof)) + { + return false; + } + if (g_pElementizer->GetType() == type_undefined) + { + if (params < 15) + { + params++; + bool bComma = false; + if (!GetCommaOrRight(bComma)) + { + // error was set inside GetCommaOrRight() + return false; + } + if (!bComma) + { + // we got the ')' so fall out of counting parameters + break; + } + } + else + { + // too many parameters + g_pCompilerData->error = true; + g_pCompilerData->error_msg = g_pErrorStrings[error_loxpe]; + return false; + } + } + else + { + // a parameter used an already defined symbol name + g_pCompilerData->error = true; + g_pCompilerData->error_msg = g_pErrorStrings[error_eaupn]; + return false; + } + } + } + // is there a result defined + if (g_pElementizer->CheckElement(type_colon)) + { + // yes, so read the name + if (!g_pElementizer->GetNext(bEof)) + { + return false; + } + if (g_pElementizer->GetType() != type_undefined && + g_pElementizer->GetType() != type_loc_long) // this allows for 'RESULT' (ignores it) + { + // result name was not unique + g_pCompilerData->error = true; + g_pCompilerData->error_msg = g_pErrorStrings[error_eaurn]; + return false; + } + } + // check for locals + locals = 0; + bool bPipe = false; + if(!GetPipeOrEnd(bPipe)) + { + // error was set inside GetPipeOrEnd() + return false; + } + if (bPipe) + { + // count locals (handling arrays) + while (!bEof) + { + if (!g_pElementizer->GetNext(bEof)) + { + return false; + } + if (g_pElementizer->GetType() == type_undefined) + { + // is it an array? + if (g_pElementizer->CheckElement(type_leftb)) + { + // it is, so read the index + if (!GetTryValue(true, true)) + { + return false; + } + int value = GetResult(); + value <<= 2; + if (value > loc_limit) + { + // too many locals + g_pCompilerData->error = true; + g_pCompilerData->error_msg = g_pErrorStrings[error_loxlve]; + return false; + } + locals += value; + if (locals <= loc_limit) + { + if (!g_pElementizer->GetElement(type_rightb)) + { + // error was set inside GetElement() + return false; + } + } + } + else + { + locals += 4; + } + if (locals > loc_limit) + { + // too many locals + g_pCompilerData->error = true; + g_pCompilerData->error_msg = g_pErrorStrings[error_loxlve]; + return false; + } + bool bComma = false; + if (!GetCommaOrEnd(bComma)) + { + // error was set inside GetCommaOrEnd() + return false; + } + if (!bComma) + { + break; + } + } + else + { + // a local used an already defined symbol name + g_pCompilerData->error = true; + g_pCompilerData->error_msg = g_pErrorStrings[error_eauvn]; + return false; + } + } + } + + if (!g_pCompilerData->bFinalCompile || IsMethodUsed(g_pCompilerData->current_filename, nMethodIndex)) + { + // enter sub symbol + int value = params; + value <<= 8; + value |= (g_pCompilerData->obj_ptr >> 2) & 0xFF; + g_pSymbolEngine->AddSymbol(g_pCompilerData->symbolBackup, type_sub, value, blockType); +#ifdef RPE_DEBUG + printf("Pub/Pri %s %d (%d, %d)\n", g_pCompilerData->symbolBackup, value, params, g_pCompilerData->obj_ptr); +#endif + if (!g_pCompilerData->bDATonly) + { + // enter locals count into index (shifted up 16 to leave space for the sub offset which will be fixed up later) + EnterObjLong(locals<<16); + } + + if (blockType == block_pub) + { + if (!AddSymbolToPubConList()) + { + return false; + } + if (!AddPubConListByte(params)) + { + return false; + } + } + if (bFirst == false) + { + g_pCompilerData->first_pub_parameters = params; + bFirst = true; + } + } + nMethodIndex++; + } + else + { + g_pCompilerData->error = true; + g_pCompilerData->error_msg = g_pErrorStrings[error_loxspoe]; + return false; + } + } + } + else + { + return false; + } + } + + return true; +} + +bool CompileSubBlocksId() +{ + bool bFirst = false; + int nMethodIndex = 0; + if (!CompileSubBlocksId_Compile(block_pub, bFirst, nMethodIndex)) + { + return false; + } + if (bFirst == false && g_pCompilerData->compile_mode == 0) + { + g_pCompilerData->error = true; + g_pCompilerData->error_msg = g_pErrorStrings[error_nprf]; + g_pCompilerData->source_start = g_pCompilerData->source_finish; + return false; + } + if (!CompileSubBlocksId_Compile(block_pri, bFirst, nMethodIndex)) + { + return false; + } + + return true; +} + +bool CompileObjBlocksId() +{ + g_pCompilerData->obj_start = g_pCompilerData->obj_ptr; + g_pCompilerData->obj_count = 0; + g_pCompilerData->obj_files = 0; + g_pCompilerData->unused_obj_files = 0; + + bool bEof = false; + g_pElementizer->Reset(); + + while (!bEof) + { + if(g_pElementizer->GetNextBlock(block_obj, bEof)) + { + while (!bEof) + { + if (!g_pElementizer->GetNext(bEof)) + { + return false; + } + if (g_pElementizer->GetType() == type_end) + { + continue; + } + else if (g_pElementizer->GetType() == type_undefined) + { + // save a copy of the symbol + g_pElementizer->BackupSymbol(); + + int instanceCount = 1; + + // see if there is a count + if (g_pElementizer->CheckElement(type_leftb)) + { + // get the count value and validate it + if (!GetTryValue(true, true)) + { + return false; + } + instanceCount = GetResult(); + if (instanceCount < 1 || instanceCount > 255) + { + g_pCompilerData->error = true; + g_pCompilerData->error_msg = g_pErrorStrings[error_ocmbf1tx]; + return false; + } + // get the closing bracket + if (!g_pElementizer->GetElement(type_rightb)) + { + return false; + } + } + + // must have the colon + if (!g_pElementizer->GetElement(type_colon)) + { + return false; + } + + int objFileIndex = 0; + // now get the filename + if (!AddFileName(g_pCompilerData->obj_files, + objFileIndex, + g_pCompilerData->obj_filenames, + g_pCompilerData->obj_name_start, + g_pCompilerData->obj_name_finish, + error_loxuoe)) + { + return false; + } + if (!g_pCompilerData->bFinalCompile || IsObjectUsed(&g_pCompilerData->obj_filenames[objFileIndex<<8])) + { + // is it a new obj? + if (objFileIndex <= (g_pCompilerData->obj_files - 1)) + { + // reset instances + g_pCompilerData->obj_instances[objFileIndex] = 0; + } + + // enter obj symbol + int value = objFileIndex; + value <<= 8; + value |= (g_pCompilerData->obj_ptr >> 2) & 0xFF; + g_pSymbolEngine->AddSymbol(g_pCompilerData->symbolBackup, type_obj, value); +#ifdef RPE_DEBUG + printf("Obj %s %d (%d, %d)\n", g_pCompilerData->symbolBackup, value, instanceCount, g_pCompilerData->obj_ptr); +#endif + + for (int i=0; i < instanceCount; i++) + { + if (g_pCompilerData->obj_ptr < 256*4) + { + // enter object index into table + EnterObjLong(objFileIndex); + g_pCompilerData->obj_count++; + } + else + { + g_pCompilerData->error = true; + g_pCompilerData->error_msg = g_pErrorStrings[error_loxspoe]; + return false; + } + } + + // accumulate instances + g_pCompilerData->obj_instances[objFileIndex] += instanceCount; + } + else + { + strcpy(&(g_pCompilerData->obj_unused[g_pCompilerData->unused_obj_files<<8]), &(g_pCompilerData->obj_filenames[objFileIndex<<8])); + int value = g_pCompilerData->unused_obj_files | 0x40; + value <<= 8; + g_pSymbolEngine->AddSymbol(g_pCompilerData->symbolBackup, type_obj, value); + g_pCompilerData->unused_obj_files++; + g_pCompilerData->obj_files--; + } + + if (!g_pElementizer->GetElement(type_end)) + { + return false; + } + } + else if (g_pElementizer->GetType() == type_block) + { + g_pElementizer->Backup(); + break; + } + else + { + g_pCompilerData->error = true; + g_pCompilerData->error_msg = g_pErrorStrings[error_eauon]; + return false; + } + } + } + else + { + return false; + } + } + return true; +} + +bool CompileDatBlocksFileNames() +{ + g_pCompilerData->dat_files = 0; + int index = 0; + + bool bEof = false; + g_pElementizer->Reset(); + + while (!bEof) + { + if(g_pElementizer->GetNextBlock(block_dat, bEof)) + { + while (!bEof) + { + if (!g_pElementizer->GetNext(bEof)) + { + return false; + } + if (g_pElementizer->GetType() == type_end) + { + continue; + } + if (g_pElementizer->GetType() == type_file) + { + if (!AddFileName(g_pCompilerData->dat_files, + index, + g_pCompilerData->dat_filenames, + g_pCompilerData->dat_name_start, + g_pCompilerData->dat_name_finish, + error_loxudfe)) + { + return false; + } + if (!g_pElementizer->GetElement(type_end)) + { + return false; + } + continue; + } + else if (g_pElementizer->GetType() != type_block) + { + continue; + } + + // if we get here, then the element we got was of type_block + + // finished with this block, backup off the next block + g_pElementizer->Backup(); + break; + } + } + else + { + return false; + } + } + + return true; +} + +void CompileObjSymbol_BadObj(int nFile) +{ + g_pCompilerData->print_length = 0; + PrintString("Invalid object file "); + char* pFilename = &(g_pCompilerData->obj_filenames[nFile]); + PrintString(pFilename); + PrintString(".OBJ"); + PrintChr(0); + g_pCompilerData->error_msg = g_pCompilerData->list; +} + +bool CompileObjSymbols() +{ + int nFile; + for (nFile = 0; nFile < g_pCompilerData->obj_files; nFile++) + { + unsigned char* pData = &(g_pCompilerData->obj_data[g_pCompilerData->obj_offsets[nFile]]); + + // do checksum of obj + unsigned char uChecksum = 0; + for (int i = 0; i < g_pCompilerData->obj_lengths[nFile]; i++) + { + uChecksum += pData[i]; + } + + unsigned char* pDataEnd = pData + g_pCompilerData->obj_lengths[nFile]; + + short vsize = pData[0] | ((short)pData[1] << 8);// *((short*)(&pData[0])); + short psize = pData[2] | ((short)pData[3] << 8);// *((short*)(&pData[2])); + pData += 4; // move past vsize/psize + + // validate checksum and that vsize/psize are valid long addresses + if ((!g_pCompilerData->bDATonly && uChecksum != language_version) || vsize & 0x03 || psize & 0x03) + { + CompileObjSymbol_BadObj(nFile); + return false; + } + + // skip obj bytes and checksum + pData += psize; + pData++; + + // go thru symbols validating them and adding them to the symbol table + int nPub = 1; + while (pData < pDataEnd) + { + for (int i = 0; i < symbol_limit+1; i++) + { + if (!CheckWordChar((char)(*pData))) + { + CompileObjSymbol_BadObj(nFile); + return false; + } + g_pCompilerData->symbolBackup[i] = (char)(*pData); + pData++; + if (pData[0] < 18) // 0 to 15 = pub param count, 16 and 17 are constants + { + g_pCompilerData->symbolBackup[i+1] = (char)(nFile+1); + g_pCompilerData->symbolBackup[i+2] = 0; + if (pData[0] < 16) // handle objpub symbol + { + int value = nPub | ((int)pData[0] << 8); + g_pSymbolEngine->AddSymbol(g_pCompilerData->symbolBackup, type_objpub, value); +#ifdef RPE_DEBUG + printf("objpub: %s %d \n", g_pCompilerData->symbolBackup, value); +#endif + nPub++; + pData++; // adjust pointer to after param count + break; + } + else // handle objcon or objcon_float symbol + { + int value = (int)pData[1] | ((int)pData[2] << 8) | ((int)pData[3] << 16) | ((int)pData[4] << 24);// *((int*)(&pData[1])); + g_pSymbolEngine->AddSymbol(g_pCompilerData->symbolBackup, (pData[0] == 16) ? type_objcon : type_objcon_float, value); +#ifdef RPE_DEBUG + float fValue = *((float*)(&value)); + printf("objcon: %s %d %f \n", g_pCompilerData->symbolBackup, value, fValue); +#endif + pData+=5; // adjust pointer to after value + break; + } + } + } + if (pData > pDataEnd) + { + CompileObjSymbol_BadObj(nFile); + return false; + } + } + } + + // now add any CON symbols from unused objects + for (int nUnusedFile = 0; nUnusedFile < g_pCompilerData->unused_obj_files; nUnusedFile++) + { + unsigned char* pData = 0; + int nDataSize = 0; + if (GetObjectPubConList(&(g_pCompilerData->obj_unused[nUnusedFile<<8]), &pData, &nDataSize)) + { + unsigned char *pDataEnd = pData + nDataSize; + // go thru symbols validating them and adding them to the symbol table + while (pData < pDataEnd) + { + for (int i = 0; i < symbol_limit+1; i++) + { + if (!CheckWordChar((char)(*pData))) + { + CompileObjSymbol_BadObj(nFile); + return false; + } + g_pCompilerData->symbolBackup[i] = (char)(*pData); + pData++; + if (pData[0] < 18) // 0 to 15 = pub param count, 16 and 17 are constants + { + g_pCompilerData->symbolBackup[i+1] = (char)(0x40 | (nUnusedFile + 1)); + g_pCompilerData->symbolBackup[i+2] = 0; + if (pData[0] < 16) // handle objpub symbol + { + // we don't add pubs in this case + pData++; // adjust pointer to after param count + break; + } + else // handle objcon or objcon_float symbol + { + int value = (int)pData[1] | ((int)pData[2] << 8) | ((int)pData[3] << 16) | ((int)pData[4] << 24); + g_pSymbolEngine->AddSymbol(g_pCompilerData->symbolBackup, (pData[0] == 16) ? type_objcon : type_objcon_float, value); +#ifdef RPE_DEBUG + float fValue = *((float*)(&value)); + printf("objcon: %s %d %f *\n", g_pCompilerData->symbolBackup, value, fValue); +#endif + pData+=5; // adjust pointer to after value + break; + } + } + } + } + } + } + return true; +} + +bool CompileVarBlocks() +{ + g_pCompilerData->var_byte = 0; + g_pCompilerData->var_word = 0; + g_pCompilerData->var_long = 0; + + bool bEof = false; + g_pElementizer->Reset(); + + while (!bEof) + { + if(g_pElementizer->GetNextBlock(block_var, bEof)) + { + while (!bEof) + { + if (!g_pElementizer->GetNext(bEof)) + { + return false; + } + if (g_pElementizer->GetType() == type_end) + { + continue; + } + if (g_pElementizer->GetType() == type_size) + { + int nSize = g_pElementizer->GetValue(); + + while(!bEof) + { + if (!g_pElementizer->GetNext(bEof)) + { + return false; + } + if (g_pElementizer->GetType() != type_undefined) + { + g_pCompilerData->error = true; + g_pCompilerData->error_msg = g_pErrorStrings[error_eauvn]; + return false; + } + + // save a copy of the symbol + g_pElementizer->BackupSymbol(); + + int nCount = 1; + + // see if there is a count + if (g_pElementizer->CheckElement(type_leftb)) + { + // get the count value and validate it + if (!GetTryValue(true, true)) + { + return false; + } + nCount = GetResult(); + if (nCount > var_limit) + { + g_pCompilerData->error = true; + g_pCompilerData->error_msg = g_pErrorStrings[error_tmvsid]; + return false; + } + // get the closing bracket + if (!g_pElementizer->GetElement(type_rightb)) + { + return false; + } + } + + int nValue = 0; + switch(nSize) + { + case 0: + nValue = g_pCompilerData->var_byte; + g_pCompilerData->var_byte += nCount; + break; + case 1: + nValue = g_pCompilerData->var_word; + g_pCompilerData->var_word += nCount<<1; + break; + case 2: + nValue = g_pCompilerData->var_long; + g_pCompilerData->var_long += nCount<<2; + break; + } + if ((nValue + (nCount << nSize)) > var_limit) + { + g_pCompilerData->error = true; + g_pCompilerData->error_msg = g_pErrorStrings[error_tmvsid]; + return false; + } + + // add the symbol + g_pSymbolEngine->AddSymbol(g_pCompilerData->symbolBackup, (nSize == 0) ? type_var_byte : ((nSize == 1) ? type_var_word : type_var_long), nValue); +#ifdef RPE_DEBUG + printf("var: %s %d (%d, %d)\n", g_pCompilerData->symbolBackup, nValue, nSize, nCount); +#endif + + bool bComma = false; + if (!GetCommaOrEnd(bComma)) + { + // error was set inside GetCommaOrEnd() + return false; + } + if (!bComma) + { + break; + } + } + continue; + } + else if (g_pElementizer->GetType() != type_block) + { + g_pCompilerData->error = true; + g_pCompilerData->error_msg = g_pErrorStrings[error_ebwol]; + return false; + } + + // if we get here, then the element we got was of type_block + + // finished with this block, backup off the next block + g_pElementizer->Backup(); + break; + } + } + else + { + return false; + } + } + + return true; +} + +bool CompileSubBlocks_Compile(int blockType, int &subCount, int &nMethodIndex) +{ + bool bEof = false; + g_pElementizer->Reset(); + + while (!bEof) + { + if(g_pElementizer->GetNextBlock(blockType, bEof)) + { + if (!bEof) + { + int saved_inf_start = g_pCompilerData->source_start; + int saved_inf_data0 = g_pCompilerData->obj_ptr; + + if (!g_pElementizer->GetNext(bEof)) + { + return false; + } + + int saved_inf_data2 = g_pCompilerData->source_start; + int saved_inf_data3 = g_pCompilerData->source_finish; + + // locals is tracking the number of bytes, so 4 per long + // we start at 4 because every sub has a result local + int locals = 4; + int paramCount = 0; + + // are there parameters? + if (g_pElementizer->CheckElement(type_left)) + { + // if so, then count them + while (!bEof) + { + if (!g_pElementizer->GetNext(bEof)) + { + return false; + } + if (g_pElementizer->GetType() == type_undefined) + { + g_pElementizer->BackupSymbol(); + + g_pSymbolEngine->AddSymbol(g_pCompilerData->symbolBackup, type_loc_long, locals, 0, true); // add to temp symbols + + g_pCompilerData->inf_start = g_pCompilerData->source_start; + g_pCompilerData->inf_finish = g_pCompilerData->source_finish; + g_pCompilerData->inf_data0 = subCount; + g_pCompilerData->inf_data1 = paramCount; + g_pCompilerData->inf_data2 = saved_inf_data2; + g_pCompilerData->inf_data3 = saved_inf_data3; + g_pCompilerData->inf_data4 = 0; + if (blockType == block_pub) + { + g_pCompilerData->inf_type = info_pub_param; + } + else + { + g_pCompilerData->inf_type = info_pri_param; + } + EnterInfo(); + + paramCount++; +#ifdef RPE_DEBUG + printf("temp loc: %s %d\n", g_pCompilerData->symbolBackup, locals); +#endif + + locals += 4; + + bool bComma = false; + if (!GetCommaOrRight(bComma)) + { + // error was set inside GetCommaOrRight() + return false; + } + if (!bComma) + { + // we got the ')' so fall out of counting parameters + break; + } + } + else + { + // a parameter used an already defined symbol name + g_pCompilerData->error = true; + g_pCompilerData->error_msg = g_pErrorStrings[error_eaupn]; + return false; + } + } + } + + // is there a result defined + if (g_pElementizer->CheckElement(type_colon)) + { + // yes, so read the name + if (!g_pElementizer->GetNext(bEof)) + { + return false; + } + if ((g_pElementizer->GetType() != type_undefined && g_pElementizer->GetType() != type_loc_long) || // this allows for 'RESULT' + (g_pElementizer->GetType() == type_loc_long && g_pElementizer->GetValue() != 0)) // '' + { + // result name was not unique + g_pCompilerData->error = true; + g_pCompilerData->error_msg = g_pErrorStrings[error_eaurn]; + return false; + } + + if (g_pElementizer->GetType() != type_loc_long) + { + // if we result symbol then add it to temp symbols + // we don't increment locals, because result local is already accounted for + g_pElementizer->BackupSymbol(); + g_pSymbolEngine->AddSymbol(g_pCompilerData->symbolBackup, type_loc_long, 0, 0, true); +#ifdef RPE_DEBUG + printf("result: %s %d\n", g_pCompilerData->symbolBackup, 0); +#endif + } + } + + // check for locals + bool bPipe = false; + if(!GetPipeOrEnd(bPipe)) + { + // error was set inside GetPipeOrEnd() + return false; + } + if (bPipe) + { + // count locals (handling arrays) + while (!bEof) + { + if (!g_pElementizer->GetNext(bEof)) + { + return false; + } + if (g_pElementizer->GetType() == type_undefined) + { + g_pElementizer->BackupSymbol(); + + int sizeOfThisLocal = 4; + + // is it an array? + if (g_pElementizer->CheckElement(type_leftb)) + { + // it is, so read the index (size of array) + if (!GetTryValue(true, true)) + { + return false; + } + int value = GetResult(); + sizeOfThisLocal = (value * 4); + + // get passed ] + if (!g_pElementizer->GetElement(type_rightb)) + { + // error was set inside GetElement() + return false; + } + } + + g_pSymbolEngine->AddSymbol(g_pCompilerData->symbolBackup, type_loc_long, locals, 0, true); // add to temp symbols +#ifdef RPE_DEBUG + if (sizeOfThisLocal > 4) + { + printf("temp loc: %s[%d] %d\n", g_pCompilerData->symbolBackup, sizeOfThisLocal/4, locals); + } + else + { + printf("temp loc: %s %d\n", g_pCompilerData->symbolBackup, locals); + } +#endif + locals += sizeOfThisLocal; + + bool bComma = false; + if (!GetCommaOrEnd(bComma)) + { + // error was set inside GetCommaOrEnd() + return false; + } + if (!bComma) + { + break; + } + } + else + { + // a local used an already defined symbol name + g_pCompilerData->error = true; + g_pCompilerData->error_msg = g_pErrorStrings[error_eauvn]; + return false; + } + } + } + + if (!g_pCompilerData->bFinalCompile || IsMethodUsed(g_pCompilerData->current_filename, nMethodIndex)) + { + // enter sub offset into index + *((short*)&(g_pCompilerData->obj[4 + (subCount * 4)])) = (short)g_pCompilerData->obj_ptr; + + if (!CompileTopBlock()) // instruction block compiler + { + return false; + } + + g_pCompilerData->inf_start = saved_inf_start; + g_pCompilerData->inf_finish = g_pElementizer->GetSourcePtr(); + g_pCompilerData->inf_data0 = saved_inf_data0; + g_pCompilerData->inf_data1 = g_pCompilerData->obj_ptr; + g_pCompilerData->inf_data2 = saved_inf_data2; + g_pCompilerData->inf_data3 = saved_inf_data3; + g_pCompilerData->inf_data4 = (paramCount << 16) | subCount; + if (blockType == block_pub) + { + g_pCompilerData->inf_type = info_pub; + } + else + { + g_pCompilerData->inf_type = info_pri; + } + EnterInfo(); + + subCount++; + } + else + { + // just simple tracking of unused methods, maximum tracked amount works out to 1024 entries + if (g_pCompilerData->unused_methods < (32 * file_limit)) + { + char szMethodName[symbol_limit + 1]; + int nLength = saved_inf_data3 - saved_inf_data2; + strncpy(szMethodName, &g_pCompilerData->source[saved_inf_data2], nLength); + szMethodName[nLength] = 0; + sprintf(&(g_pCompilerData->method_unused[symbol_limit * g_pCompilerData->unused_methods]), "%s.%s", g_pCompilerData->current_filename, szMethodName); + g_pCompilerData->unused_methods++; + } + } + nMethodIndex++; + g_pSymbolEngine->Reset(true); // cancel local symbols + } + } + else + { + return false; + } + } + + return true; +} + +bool CompileSubBlocks() +{ + int subCount = 0; + int nMethodIndex = 0; + if (!CompileSubBlocks_Compile(block_pub, subCount, nMethodIndex)) + { + return false; + } + if (!CompileSubBlocks_Compile(block_pri, subCount, nMethodIndex)) + { + return false; + } + + return true; +} + +bool CompileObjBlocks() +{ + // calculate var_ptr and align to long + g_pCompilerData->var_ptr = g_pCompilerData->var_byte + g_pCompilerData->var_word + g_pCompilerData->var_long; + if ((g_pCompilerData->var_ptr & 0x00000003) != 0) + { + g_pCompilerData->var_ptr = (g_pCompilerData->var_ptr | 0x00000003) + 1; + } + if (g_pCompilerData->var_ptr > var_limit) + { + g_pCompilerData->error = true; + g_pCompilerData->error_msg = g_pErrorStrings[error_tmvsid]; + return false; + } + + // align obj_ptr to long + if (!g_pCompilerData->bDATonly) + { + while ((g_pCompilerData->obj_ptr & 0x00000003) != 0) + { + if (!EnterObj(0)) + { + return false; + } + } + } + + if (g_pCompilerData->compile_mode == 0) + { + // set obj size word at offset 0 + *((short*)(&g_pCompilerData->obj[0])) = (short)g_pCompilerData->obj_ptr; + // set obj index byte at offset 2 + g_pCompilerData->obj[2] = (unsigned char)(g_pCompilerData->obj_start >> 2); + // set obj count byte at offset 3 + g_pCompilerData->obj[3] = (unsigned char)(g_pCompilerData->obj_count); + } + + // and any objects (OBJ sections) + int objptr[file_limit]; + int objvar[file_limit]; + + for (int i = 0; i < g_pCompilerData->obj_files; i++) + { + objptr[i] = g_pCompilerData->obj_ptr; + + unsigned char* pObj = &(g_pCompilerData->obj_data[g_pCompilerData->obj_offsets[i]]); + + // get vsize and save in objvar[i] + //objvar[i] = (int)(*((unsigned short*)(pObj))); + objvar[i] = (int)pObj[0] | ((int)pObj[1] << 8); + pObj += 2; + + // get psize + //unsigned short psize = *((unsigned short*)(pObj)); + unsigned short psize = (unsigned short)pObj[0] | ((unsigned short)pObj[1] << 8); + pObj += 2; + + for (unsigned short j = 0; j < psize; j++) + { + if (!EnterObj(pObj[j])) + { + return false; + } + } + } + + // get start of object index + unsigned short* pIndex = (unsigned short*)&(g_pCompilerData->obj[g_pCompilerData->obj_start]); + + for (int i = 0; i < g_pCompilerData->obj_count; i++) + { + // get file number from index + int index = *((int*)pIndex); + + // write objptr back to index + *pIndex = (unsigned short)(objptr[index]); + pIndex++; + + // write var ptr back to index + *pIndex = (unsigned short)(g_pCompilerData->var_ptr); + pIndex++; + + // update var ptr and check limit + g_pCompilerData->var_ptr += objvar[index]; + if (g_pCompilerData->var_ptr > var_limit) + { + g_pCompilerData->error = true; + g_pCompilerData->error_msg = g_pErrorStrings[error_tmvsid]; + return false; + } + } + + return true; +} + +bool DistillObjBlocks() +{ + if (g_pCompilerData->compile_mode == 0) + { + // Cannot "distill" large objects (eeprom_size set to greater than min_obj_limit(64k)) + if (g_pCompilerData->obj_ptr <= min_obj_limit) + { + return DistillObjects(); + } + } + return true; +} + +bool CompileFinal() +{ + if (g_pCompilerData->compile_mode == 0) + { + int vsize = g_pCompilerData->var_ptr; + int psize = g_pCompilerData->obj_ptr; + int vsize_psize = (psize << 16) | vsize; + int checksum_offset = g_pCompilerData->obj_ptr; + if (!EnterObj(0)) //placeholder for checksum; + { + return false; + } + + if (!g_pCompilerData->bFinalCompile && g_pCompilerData->bUnusedMethodElimination) + { + AddObjectPubConList(g_pCompilerData->current_filename, g_pCompilerData->pubcon_list, g_pCompilerData->pubcon_list_size); + } + + // copy pubcon_list into obj (RPE: this could be optimized) + for (int i = 0; i < g_pCompilerData->pubcon_list_size; i++) + { + if (!EnterObj(g_pCompilerData->pubcon_list[i])) + { + return false; + } + } + + if (!EnterObjLong(0)) // allocate space for vsize/psize long + { + return false; + } + + // shift contents of obj up 4 bytes (to insert vsize/psize at front) + memmove(&(g_pCompilerData->obj[4]), &(g_pCompilerData->obj[0]), g_pCompilerData->obj_limit - 4); + // insert vsize_psize at beginning on obj + *((int*)(&g_pCompilerData->obj[0])) = vsize_psize; + // also store them separately in case they are larger than 65536 + g_pCompilerData->vsize = vsize; + g_pCompilerData->psize = psize; + + // calculate the checksum + unsigned char checksum = 0; + for (int i = 0; i < g_pCompilerData->obj_ptr; i++) + { + checksum += g_pCompilerData->obj[i]; + } + g_pCompilerData->obj[checksum_offset + 4] = language_version - checksum; // + 4 because we shifted obj by 4 above + } + return true; +} + +bool PointToFirstCon() +{ + bool bEof = false; + g_pElementizer->Reset(); + + if(g_pElementizer->GetNextBlock(block_con, bEof)) + { + if (!bEof) + { + g_pCompilerData->source_finish = g_pCompilerData->source_start; + } + } + else + { + return false; + } + + return true; +} + +bool Determine_GetSymbol(const char* pSymbol, int errorCode, bool& bFound) +{ + bFound = false; + if (g_pElementizer->FindSymbol(pSymbol)) + { + if (g_pElementizer->GetType() == type_con) + { + bFound = true; + } + else if (g_pElementizer->GetType() != type_undefined) + { + g_pCompilerData->error = true; + g_pCompilerData->error_msg = g_pErrorStrings[errorCode]; + return false; + } + } + return true; +} + +bool DetermineStack() +{ + int stackRequired = 16; + + bool bFound; + if (!Determine_GetSymbol("_STACK", error_ssaf, bFound)) + { + return false; + } + if (bFound) + { + stackRequired = g_pElementizer->GetValue(); + } + if (!Determine_GetSymbol("_FREE", error_ssaf, bFound)) + { + return false; + } + if (bFound) + { + stackRequired += g_pElementizer->GetValue(); + } + + if (stackRequired > 0x2000) + { + g_pCompilerData->error = true; + g_pCompilerData->error_msg = g_pErrorStrings[error_safms]; + return false; + } + + g_pCompilerData->stack_requirement = stackRequired; + + return true; +} + +bool Determine_GetBitPos(int value, int& bitPos) +{ + int bitCount = 0; + for (int i = 32; i > 0; i--) + { + if (value & 0x01) + { + bitPos = 32 - i; + bitCount++; + } + value >>= 1; + } + if (bitCount != 1) + { + g_pCompilerData->error = true; + g_pCompilerData->error_msg = g_pErrorStrings[error_icms]; + return false; + } + return true; +} + +bool DetermineClock() +{ + // set to RCFAST for default + g_pCompilerData->clkmode = 0; + g_pCompilerData->clkfreq = 12000000; + + int mode = 0; + int freq = 0; + int xin = 0; + int freqShift = 0; + + // try to find the values in the symbols + bool bHaveClkMode = false; + bool bHaveClkFreq = false; + bool bHaveXinFreq = false; + + if (!Determine_GetSymbol("_CLKMODE", error_sccx, bHaveClkMode)) + { + return false; + } + if (bHaveClkMode) + { + mode = g_pElementizer->GetValue(); + } + if (!Determine_GetSymbol("_CLKFREQ", error_sccx, bHaveClkFreq)) + { + return false; + } + if (bHaveClkFreq) + { + freq = g_pElementizer->GetValue(); + } + if (!Determine_GetSymbol("_XINFREQ", error_sccx, bHaveXinFreq)) + { + return false; + } + if (bHaveXinFreq) + { + xin = g_pElementizer->GetValue(); + } + + if (bHaveClkMode == false && bHaveClkFreq == false && bHaveXinFreq == false) + { + // just use default (already set above) + return true; + } + + // can't have either freq without clkmode + if (bHaveClkMode == false && (bHaveClkFreq == true || bHaveXinFreq == true)) + { + g_pCompilerData->error = true; + g_pCompilerData->error_msg = g_pErrorStrings[error_cxswcm]; + return false; + } + + // can't have both clkfreq and xinfreq + if (bHaveClkFreq == true && bHaveXinFreq == true) + { + g_pCompilerData->error = true; + g_pCompilerData->error_msg = g_pErrorStrings[error_ecoxmbs]; + return false; + } + + // validate the mode + if (mode == 0 || (mode & 0xFFFFF800) != 0 || (((mode & 0x03) != 0) && ((mode & 0x7FC) != 0))) + { + g_pCompilerData->error = true; + g_pCompilerData->error_msg = g_pErrorStrings[error_icms]; + return false; + } + + if (mode & 0x03) // RCFAST or RCSLOW + { + // can't have clkfreq or xinfreq in RC mode + if (bHaveClkFreq == true || bHaveXinFreq == true) + { + g_pCompilerData->error = true; + g_pCompilerData->error_msg = g_pErrorStrings[error_cxnawrc]; + return false; + } + + if (mode == 2) + { + // RCSLOW + g_pCompilerData->clkmode = 1; + g_pCompilerData->clkfreq = 20000; + return true; + } + else + { + // RCFAST (which is already set as default) + return true; + } + } + else + { + // get xinput/xtal1/xtal2/xtal3 + int bitPos = 0; + if (!Determine_GetBitPos((mode >> 2) & 0x0F, bitPos)) + { + return false; + } + g_pCompilerData->clkmode = (unsigned char)((bitPos << 3) | 0x22); // 0x22 = 0100010b + + if (mode & 0x7C0) + { + // get xmul + if (!Determine_GetBitPos(mode >> 6, bitPos)) + { + return false; + } + freqShift = bitPos; + g_pCompilerData->clkmode += (unsigned char)(bitPos + 0x41); // 0x41 = 1000001b + } + } + + // get clkfreq + + // must have xinfreq or clkfreq + if (bHaveClkFreq == false && bHaveXinFreq == false) + { + g_pCompilerData->error = true; + g_pCompilerData->error_msg = g_pErrorStrings[error_coxmbs]; + return false; + } + + if (bHaveClkFreq) + { + g_pCompilerData->clkfreq = freq; + } + else + { + g_pCompilerData->clkfreq = (xin << freqShift); + } + + return true; +} + +bool DetermineDebug() +{ + bool bFound = false; + if (!Determine_GetSymbol("_DEBUG", error_sdcobu, bFound)) + { + return false; + } + if (bFound) + { + g_pCompilerData->debugbaud = g_pElementizer->GetValue(); + } + return true; +} + +char CompileDoc_ScanSkip(int& scanPtr) +{ + while (g_pCompilerData->source[scanPtr] == ' ' || g_pCompilerData->source[scanPtr] == 9) + { + scanPtr++; + } + + return g_pCompilerData->source[scanPtr]; +} + +bool CompileDoc_ScanInterface(bool bPrint, int& nCount) +{ + int savedSourcePtr = g_pElementizer->GetSourcePtr(); + + bool bEof = false; + if (!g_pElementizer->GetNext(bEof)) + { + return false; + } + + // start off count with the length of the pub name + nCount = g_pCompilerData->source_finish - g_pCompilerData->source_start; + + if (bPrint) + { + // print the pub name + for (int i = 0; i < nCount; i++) + { + if (!PrintChr(g_pCompilerData->source[g_pCompilerData->source_start + i])) + { + return false; + } + } + } + + // start right after name + int scanPtr = g_pCompilerData->source_start + nCount; + + // scan/print any parameters + char currentChar = CompileDoc_ScanSkip(scanPtr); + if (currentChar == '(') + { + for (;;) + { + currentChar = g_pCompilerData->source[scanPtr++]; + nCount++; + if (bPrint) + { + if (!PrintChr(currentChar)) + { + return false; + } + } + if (currentChar == ')') + { + break; + } + else if (currentChar == ',') + { + // add a space after the comma + nCount++; + if (bPrint) + { + if (!PrintChr(' ')) + { + return false; + } + } + + // scan for first char of next param + CompileDoc_ScanSkip(scanPtr); + } + } + } + + // scan/print any result + currentChar = CompileDoc_ScanSkip(scanPtr); + if (currentChar == ':') + { + nCount+=3; + if (bPrint) + { + if (!PrintString(" : ")) + { + return false; + } + } + + // scan/print chars until we get a non-word char (end of the result name) + currentChar = CompileDoc_ScanSkip(scanPtr); + while (CheckWordChar(currentChar)) + { + nCount++; + if (bPrint) + { + if (!PrintChr(' ')) + { + return false; + } + } + currentChar = g_pCompilerData->source[scanPtr++]; + } + } + + // done with this interface + g_pElementizer->SetSourcePtr(savedSourcePtr); + nCount += 5; // account for 'PUB ' & the following cr + if (bPrint) + { + if (!PrintChr(13)) + { + return false; + } + } + + return true; +} + +bool CompileDoc_PrintAll(int sourcePtr) +{ + g_pElementizer->Reset(); + g_pElementizer->SetSourcePtr(sourcePtr); + + bool bEof = false; + while (!bEof) + { + if (!g_pElementizer->GetNextBlock(block_pub, bEof)) + { + return false; + } + if (bEof) + { + break; + } + if (g_pCompilerData->doc_mode) + { + // print extra cr and underline + if (!PrintChr(13)) + { + return false; + } + int nCount = 0; + if (!CompileDoc_ScanInterface(false, nCount)) + { + return false; + } + for (int i = 0; i < nCount; i++) + { + if (!PrintChr('_')) + { + return false; + } + } + if (!PrintChr(13)) + { + return false; + } + } + + // print pub name and interface + if (!PrintString("PUB ")) + { + return false; + } + int nCount = 0; + if (!CompileDoc_ScanInterface(true, nCount)) + { + return false; + } + if (g_pCompilerData->doc_mode) + { + // print extra cr + if (!PrintChr(13)) + { + return false; + } + } + } + + return true; +} + +bool CompileDoc() +{ + g_pElementizer->Reset(); + g_pCompilerData->doc_flag = false; + g_pCompilerData->doc_mode = true; + + bool bEof = false; + + // in doc mode, this will print out any doc comments at the top of the obj + // GetNext() does it, and also sets the doc_flag if it did + // it'll return type_end until it gets to the first non-comment line (start of code) + while (!bEof) + { + if (!g_pElementizer->GetNext(bEof)) + { + return false; + } + if (g_pElementizer->GetType() != type_end) + { + break; + } + } + + // if something was printed above then add a CR + if (g_pCompilerData->doc_flag) + { + if (!PrintChr(13)) + { + return false; + } + } + + // clear doc_mode flag so we can print the interface stuff without doc comments in it + g_pCompilerData->doc_mode = false; + int savedSourceStart = g_pCompilerData->source_start; + + char tempStr[512]; + sprintf(tempStr, "Object \"%s", g_pCompilerData->obj_title); + if (!PrintString(tempStr)) + { + return false; + } + if (!PrintString("\" Interface:\r\r")) + { + return false; + } + if (!CompileDoc_PrintAll(savedSourceStart)) + { + return false; + } + short variables = *((short*)&(g_pCompilerData->obj[0])) >> 2; + short program = *((short*)&(g_pCompilerData->obj[2])) >> 2; + sprintf(tempStr, "\rProgram: %d Longs\rVariable: %d Longs\r", program, variables); + if (!PrintString(tempStr)) + { + return false; + } + + // doc_flag will get set when printing the interfaces above + if (g_pCompilerData->doc_flag) + { + // set doc mode to true, in order to print the interfaces (again) with doc comments in it + g_pCompilerData->doc_mode = true; + + // doc comments in pubs print interface again, this time with doc comments + if (!CompileDoc_PrintAll(savedSourceStart)) + { + return false; + } + } + + return true; +} + +/////////////////////////////////////////////////////////////////////////////////////////// +// TERMS OF USE: MIT License // +/////////////////////////////////////////////////////////////////////////////////////////// +// Permission is hereby granted, free of charge, to any person obtaining a copy of this // +// software and associated documentation files (the "Software"), to deal in the Software // +// without restriction, including without limitation the rights to use, copy, modify, // +// merge, publish, distribute, sublicense, and/or sell copies of the Software, and to // +// permit persons to whom the Software is furnished to do so, subject to the following // +// conditions: // +// // +// The above copyright notice and this permission notice shall be included in all copies // +// or substantial portions of the Software. // +// // +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, // +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A // +// PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT // +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE // +// SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // +/////////////////////////////////////////////////////////////////////////////////////////// diff --git a/Tools/unix/OpenSpin/PropellerCompiler/PropellerCompiler.h b/Tools/unix/OpenSpin/PropellerCompiler/PropellerCompiler.h new file mode 100644 index 00000000..a4ad64b8 --- /dev/null +++ b/Tools/unix/OpenSpin/PropellerCompiler/PropellerCompiler.h @@ -0,0 +1,193 @@ +////////////////////////////////////////////////////////////// +// // +// Propeller Spin/PASM Compiler // +// (c)2012-2016 Parallax Inc. DBA Parallax Semiconductor. // +// Adapted from Chip Gracey's x86 asm code by Roy Eltham // +// See end of file for terms of use. // +// // +////////////////////////////////////////////////////////////// +// +// PropellerCompiler.h +// + +#ifndef _PROPELLER_COMPILER_H_ +#define _PROPELLER_COMPILER_H_ + +#include "UnusedMethodUtils.h" + +// +// OpenSpin code uses _stricmp() which is the VC++ name for the function. +// this needs to be remapped to stricmp or strcasecmp depending on the compiler and OS being compiled on +// GCC prior to version 4.8 have strcasecmp on both linux and windows +// GCC 4.8 and newer on linux appears to still have strcasecmp, but GCC 4.8 and newer on windows does not (it has stricmp instead) +// +#if defined(__linux__) +// we are on linux, then always use strcasecmp +#define _stricmp strcasecmp +#else +#if __GNUC__ +// if GCC version is 4.8 or greater use stricmp, else use strcasecmp +#if __GNUC__ > 4 || (__GNUC__ == 4 && (__GNUC_MINOR__ >= 8 )) +#define _stricmp stricmp +#else +#define _stricmp strcasecmp +#endif +#endif +#endif + +// +// no longer compatible with Prop Tool / Propellent +// + +#define language_version '0' +#define loc_limit 0x8000 +#define var_limit 0x8000 +#define min_obj_limit 0x00020000 +#define file_limit 32 +#define data_limit 0x20000 +#define info_limit 1000 +#define distiller_limit 0x4000 +#define symbol_limit 256 // was 32 +#define pubcon_list_limit 0x8000 +#define block_nest_limit 8 +#define block_stack_limit 4096 +#define case_limit 256 +#define if_limit 16 +#define str_limit 256 +#define str_buffer_limit 0x8000 + + +enum infoType +{ + info_con = 0, // data0 = value (must be followed by info_con_float) + info_con_float, // data0 = value + info_dat, // data0/1 = obj start/finish + info_dat_symbol, // data0 = value, data2 = offset, data1 = size + info_pub, // data0/1 = obj start/finish, data2/3 = name start/finish + info_pri, // data0/1 = obj start/finish, data2/3 = name start/finish + info_pub_param, // data0 = pub index, data3 = param index, data2/3 = pub name start/finish + info_pri_param // data0 = pri index, data3 = param index, data2/3 = pri name start/finish +}; + +// Propeller Compiler Interface Structure +struct CompilerData +{ + bool error; // Compilation status; error if true, success if false + const char* error_msg; // Pointer to error string + + int compile_mode; // Compile Mode; 0 = normal compile, 1 = Propeller Development compile + + char* source; // Pointer to source data + int source_start; // Offending item start (if error) + int source_finish; // Offending item end (+1) (if error) + + char* list; // Pointer to list data + unsigned int list_limit; // Max size of list data + unsigned int list_length; // Length of list data + + char* doc; // Pointer to document data + unsigned int doc_limit; // Max size of document data + unsigned int doc_length; // Length of document data + + unsigned char* obj; // Object binary for currently being compiled obj + int obj_ptr; // Length of Object binary + int obj_limit; // size of buffer allocated for obj + + int obj_files; // Number of object files referenced by source + char obj_filenames[file_limit*256]; // Object filenames + int obj_name_start[file_limit]; // Starting char of each filename + int obj_name_finish[file_limit]; // Ending character (+1) of each filename + int obj_offsets[file_limit]; // Offsets of final objects in ObjData + int obj_lengths[file_limit]; // Lengths of final objects in ObjData + unsigned char obj_data[data_limit]; // Final top-level object binary + int obj_instances[file_limit]; // Instances per filename + char obj_title[256]; // Object Filename (without path) + + int dat_files; // Number of DAT files referenced by source + char dat_filenames[file_limit*256]; // DAT filenames + int dat_name_start[file_limit]; // Starting char of each filename + int dat_name_finish[file_limit]; // Ending character (+1) of each filename + int dat_offsets[file_limit]; // Offsets of final objects in DatData + int dat_lengths[file_limit]; // Lengths of final objects in DatData + unsigned char dat_data[data_limit]; // Binary data + + int pre_files; // Number of Precompile files referenced by source + char pre_filenames[file_limit*256]; // Precompile filenames + int pre_name_start[file_limit]; // Starting char of each filename + int pre_name_finish[file_limit]; // Ending character (+1) of each filename + + int arc_files; // Number of Archive files referenced by source + char arc_filenames[file_limit*256]; // Archive filenames + int arc_name_start[file_limit]; // Starting char of each filename + int arc_name_finish[file_limit]; // Ending character (+1) of each filename + + int info_count; // Number of information records for object + int info_start[info_limit]; // Start of source related to this info + int info_finish[info_limit]; // End (+1) of source related to this info + int info_type[info_limit]; // 0 = CON, 1 CON(float), 2 = DAT, 3 = DAT Symbol, 4 = PUB, 5 = PRI, 6 = PUB_PARAM, 7 = PRI_PARAM + int info_data0[info_limit]; // Info field 0: if CON = Value, if DAT/PUB/PRI = Start addr in object, if DAT Symbol = value, if PARAM = pub/pri index + int info_data1[info_limit]; // Info field 1: if DAT/PUB/PRI = End+1 addr in object, if DAT Symbol = size, if PARAM = param index + int info_data2[info_limit]; // Info field 2: if PUB/PRI/PARAM = Start of pub/pri name in source, if DAT Symbol = offset (in cog) + int info_data3[info_limit]; // Info field 3: if PUB/PRI/PARAM = End+1 of pub/pri name in source + int info_data4[info_limit]; // Info field 4: if PUB/PRI = index|param count + + int distilled_longs; // Total longs optimized out of object + unsigned char first_pub_parameters; + int stack_requirement; // Stack requirement for top-level object + + unsigned char clkmode; + int clkfreq; + int debugbaud; // 0 = no debug, > 0 = debug at DebugBaud rate + + bool bDATonly; // only compile DAT sections (into obj) + + // only add new stuff below here + + bool bBinary; // true for binary, false for eeprom + + unsigned int eeprom_size; // size of eeprom + unsigned int vsize; // used to hold last vsize (in case it is greater than 65536) + unsigned int psize; // used to hold last psize (in case it is greater than 65536) + + char current_filename[256]; // name of object being compiled at the moment + bool bUnusedMethodElimination; // true if unused method elimination is on + bool bFinalCompile; // set to true after unused method scan complete + + int unused_obj_files; // number of unused object files + char obj_unused[file_limit*256]; // hold filenames of unused objects + + int unused_methods; // number of unused methods + char method_unused[32*file_limit*symbol_limit]; // hold names of unused methods + + char* current_file_path; // full path of the current file being compiled (points to entries in s_filesAccessed[]) +}; + +// public functions +extern CompilerData* InitStruct(); +extern void Cleanup(); +extern const char* Compile1(); +extern const char* Compile2(); +extern bool GetErrorInfo(int& lineNumber, int& column, int& offsetToStartOfLine, int& offsetToEndOfLine, int& offendingItemStart, int& offendingItemEnd); + +#endif // _PROPELLER_COMPILER_H_ + +/////////////////////////////////////////////////////////////////////////////////////////// +// TERMS OF USE: MIT License // +/////////////////////////////////////////////////////////////////////////////////////////// +// Permission is hereby granted, free of charge, to any person obtaining a copy of this // +// software and associated documentation files (the "Software"), to deal in the Software // +// without restriction, including without limitation the rights to use, copy, modify, // +// merge, publish, distribute, sublicense, and/or sell copies of the Software, and to // +// permit persons to whom the Software is furnished to do so, subject to the following // +// conditions: // +// // +// The above copyright notice and this permission notice shall be included in all copies // +// or substantial portions of the Software. // +// // +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, // +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A // +// PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT // +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE // +// SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // +/////////////////////////////////////////////////////////////////////////////////////////// diff --git a/Tools/unix/OpenSpin/PropellerCompiler/PropellerCompilerInternal.h b/Tools/unix/OpenSpin/PropellerCompiler/PropellerCompilerInternal.h new file mode 100644 index 00000000..063e4a9b --- /dev/null +++ b/Tools/unix/OpenSpin/PropellerCompiler/PropellerCompilerInternal.h @@ -0,0 +1,134 @@ +////////////////////////////////////////////////////////////// +// // +// Propeller Spin/PASM Compiler // +// (c)2012-2016 Parallax Inc. DBA Parallax Semiconductor. // +// Adapted from Chip Gracey's x86 asm code by Roy Eltham // +// See end of file for terms of use. // +// // +////////////////////////////////////////////////////////////// +// +// PropellerCompilerInternal.h +// + +#ifndef _PROPELLER_COMPILER_INTERNAL_H_ +#define _PROPELLER_COMPILER_INTERNAL_H_ + +#include "PropellerCompiler.h" + +struct CompilerDataInternal : public CompilerData +{ + // this stuff is misc globals from around the asm code + + int var_byte; + int var_word; + int var_long; + int var_ptr; + + int obj_start; + int obj_count; + + int asm_local; + + unsigned char pubcon_list[pubcon_list_limit]; + int pubcon_list_size; + + char symbolBackup[symbol_limit+2]; // used when entering a symbol into the symbol table + + bool doc_flag; + bool doc_mode; + + int cog_org; + + int print_length; + + // these are used by EnterInfo() to fill in info_* stuff above + // various code fills these in and then calls EnterInfo() + // I kept it this way because at the point the code calls EnterInfo() it doesn't + // always have the values available to just pass as parameters. + int inf_start; // Start of source related to this info + int inf_finish; // End (+1) of source related to this info + int inf_type; // 0 = CON, 1 CON(float), 2 = DAT, 3 = DAT Symbol, 4 = PUB, 5 = PRI, 6 = PUB_PARAM, 7 = PRI_PARAM + int inf_data0; // Info field 0: if CON = Value, if DAT/PUB/PRI = Start addr in object, if DAT Symbol = value, if PARAM = pub/pri index + int inf_data1; // Info field 1: if DAT/PUB/PRI = End+1 addr in object, if DAT Symbol = size, if PARAM = param index + int inf_data2; // Info field 2: if PUB/PRI/PARAM = Start of pub/pri name in source, if DAT Symbol = offset (in cog) + int inf_data3; // Info field 3: if PUB/PRI/PARAM = End+1 of pub/pri name in source + int inf_data4; // Info field 4: if PUB/PRI = index|param count + + // used by GetFileName/AddFileName + char filename[255]; + + // these are used by the CompileConBlocks() code + int enum_valid; + int enum_value; + int assign_flag; + int assign_type; + int assign_value; + + // used by CompileDatBlocks code + int orgx; + + // used by ResolveExpression code + int intMode; // 0 = uncommitted, 1 = int mode, 2 = float mode + int precedence; // current precedence + bool bMustResolve; // the expression must resolve + bool bUndefined; // the expression is undefined + bool bOperandMode; // when dealing with a PASM operand + int mathCurrent; // index into mathStack[] + int mathStack[16]; // holds the intermediate values during expression resolving + int intermediateResult; // the current intermediate result + int currentOp; // index into savedOp[] + int savedOp[32]; // stack of operations to perform during expression resolving + + // used by Object Distiller (DistillObjects.cpp) + int dis_ptr; + unsigned short dis[distiller_limit]; + + // used for string constant processing (StringConstantRoutines.cpp) + bool str_enable; + bool str_patch_enable; + int str_count; + int str_buffer_ptr; + unsigned char str_buffer[str_buffer_limit]; + int str_source[str_limit]; + int str_patch[str_limit]; + int str_offset[str_limit]; + int str_index; + + // used by InstructionBlockCompiler.cpp & BlockNestStackRoutines.cpp + int bnest_ptr; + unsigned char bnest_type[block_nest_limit]; + int bstack_ptr; + int bstack_base[block_nest_limit]; + int bstack[block_stack_limit]; +}; + +class Elementizer; +class SymbolEngine; + +// shared globals +extern Elementizer* g_pElementizer; +extern CompilerDataInternal* g_pCompilerData; +extern SymbolEngine* g_pSymbolEngine; + +#endif // _PROPELLER_COMPILER_INTERNAL_H_ + +/////////////////////////////////////////////////////////////////////////////////////////// +// TERMS OF USE: MIT License // +/////////////////////////////////////////////////////////////////////////////////////////// +// Permission is hereby granted, free of charge, to any person obtaining a copy of this // +// software and associated documentation files (the "Software"), to deal in the Software // +// without restriction, including without limitation the rights to use, copy, modify, // +// merge, publish, distribute, sublicense, and/or sell copies of the Software, and to // +// permit persons to whom the Software is furnished to do so, subject to the following // +// conditions: // +// // +// The above copyright notice and this permission notice shall be included in all copies // +// or substantial portions of the Software. // +// // +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, // +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A // +// PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT // +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE // +// SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // +/////////////////////////////////////////////////////////////////////////////////////////// diff --git a/Tools/unix/OpenSpin/PropellerCompiler/StringConstantRoutines.cpp b/Tools/unix/OpenSpin/PropellerCompiler/StringConstantRoutines.cpp new file mode 100644 index 00000000..5273ded2 --- /dev/null +++ b/Tools/unix/OpenSpin/PropellerCompiler/StringConstantRoutines.cpp @@ -0,0 +1,136 @@ +////////////////////////////////////////////////////////////// +// // +// Propeller Spin/PASM Compiler // +// (c)2012-2016 Parallax Inc. DBA Parallax Semiconductor. // +// Adapted from Chip Gracey's x86 asm code by Roy Eltham // +// See end of file for terms of use. // +// // +////////////////////////////////////////////////////////////// +// +// StringConstantRoutines.cpp +// + +#include +#include +#include +#include +#include "Utilities.h" +#include "PropellerCompilerInternal.h" +#include "SymbolEngine.h" +#include "Elementizer.h" +#include "ErrorStrings.h" + +void StringConstant_PreProcess() +{ + g_pCompilerData->str_enable = true; + g_pCompilerData->str_patch_enable = true; + g_pCompilerData->str_count = 0; + g_pCompilerData->str_buffer_ptr = 0; +} + +bool StringConstant_GetIndex() +{ + int strIndex = 0; + for (strIndex = 0; strIndex < g_pCompilerData->str_count; strIndex++) + { + if (g_pCompilerData->str_source[strIndex] == g_pCompilerData->source_start) + { + break; + } + } + + if (strIndex == g_pCompilerData->str_count) + { + // new string constant + if (g_pCompilerData->str_count > str_limit) + { + g_pCompilerData->error = true; + g_pCompilerData->error_msg = g_pErrorStrings[error_tmsc]; + return false; + } + g_pCompilerData->str_count++; + g_pCompilerData->str_source[strIndex] = g_pCompilerData->source_start; + g_pCompilerData->str_offset[strIndex] = g_pCompilerData->str_buffer_ptr; + } + else + { + // old + g_pCompilerData->str_buffer_ptr = g_pCompilerData->str_offset[strIndex]; + } + + g_pCompilerData->str_index = strIndex; + + return true; +} + +bool StringConstant_EnterChar(unsigned char theChar) +{ + if (g_pCompilerData->str_buffer_ptr >= str_buffer_limit) + { + g_pCompilerData->error = true; + g_pCompilerData->error_msg = g_pErrorStrings[error_tmscc]; + return false; + } + g_pCompilerData->str_buffer[g_pCompilerData->str_buffer_ptr++] = theChar; + return true; +} + +void StringConstant_EnterPatch() +{ + if (g_pCompilerData->str_patch_enable) + { + g_pCompilerData->str_patch[g_pCompilerData->str_index] = g_pCompilerData->obj_ptr; + } +} + +bool StringConstant_PostProcess() +{ + if (g_pCompilerData->str_count > 0) + { + // patch string addresses + int strIndex = 0; + while(g_pCompilerData->str_count > 0) + { + int temp = g_pCompilerData->obj_ptr; + temp += g_pCompilerData->str_offset[strIndex]; + temp |= 0x8000; + //short strAddress = ((temp & 0xFF00) >> 8) | ((temp & 0x00FF) << 8); // xchg ah,al + //*((short*)&(g_pCompilerData->obj[g_pCompilerData->str_patch[strIndex]])) = strAddress; + g_pCompilerData->obj[g_pCompilerData->str_patch[strIndex]] = (unsigned char)((temp >> 8) & 0xFF); + g_pCompilerData->obj[g_pCompilerData->str_patch[strIndex] + 1] = (unsigned char)(temp & 0xFF); + strIndex++; + g_pCompilerData->str_count--; + } + + // enter strings into obj + for (int i = 0; i < g_pCompilerData->str_buffer_ptr; i++) + { + if (!EnterObj(g_pCompilerData->str_buffer[i])) + { + return false; + } + } + } + return true; +} + +/////////////////////////////////////////////////////////////////////////////////////////// +// TERMS OF USE: MIT License // +/////////////////////////////////////////////////////////////////////////////////////////// +// Permission is hereby granted, free of charge, to any person obtaining a copy of this // +// software and associated documentation files (the "Software"), to deal in the Software // +// without restriction, including without limitation the rights to use, copy, modify, // +// merge, publish, distribute, sublicense, and/or sell copies of the Software, and to // +// permit persons to whom the Software is furnished to do so, subject to the following // +// conditions: // +// // +// The above copyright notice and this permission notice shall be included in all copies // +// or substantial portions of the Software. // +// // +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, // +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A // +// PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT // +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE // +// SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // +/////////////////////////////////////////////////////////////////////////////////////////// diff --git a/Tools/unix/OpenSpin/PropellerCompiler/SymbolEngine.cpp b/Tools/unix/OpenSpin/PropellerCompiler/SymbolEngine.cpp new file mode 100644 index 00000000..ad5fcb25 --- /dev/null +++ b/Tools/unix/OpenSpin/PropellerCompiler/SymbolEngine.cpp @@ -0,0 +1,445 @@ +////////////////////////////////////////////////////////////// +// // +// Propeller Spin/PASM Compiler // +// (c)2012-2016 Parallax Inc. DBA Parallax Semiconductor. // +// Adapted from Chip Gracey's x86 asm code by Roy Eltham // +// See end of file for terms of use. // +// // +////////////////////////////////////////////////////////////// +// +// SymbolEngine.cpp +// + +#include "PropellerCompilerInternal.h" +#include "SymbolEngine.h" +#include "ErrorStrings.h" +#include "Utilities.h" +#include + +static SymbolTableEntryDataTable symbols[] = +{ + {type_left, 0, "(", 0, false}, //miscellaneous + {type_right, 0, ")", 0, false}, + {type_leftb, 0, "[", 0, false}, + {type_rightb, 0, "]", 0, false}, + {type_comma, 0, ",", 0, false}, + {type_equal, 0, "=", 0, false}, + {type_pound, 0, "#", 0, false}, + {type_colon, 0, ":", 0, false}, + {type_back, 0, "\\", 0, false}, + {type_dot, 0, ".", 0, false}, + {type_dotdot, 0, "..", 0, false}, + {type_at, 0, "@", 0, false}, + {type_atat, 0, "@@", 0, false}, + {type_til, 0, "~", 0, false}, + {type_tiltil, 0, "~~", 0, false}, + {type_rnd, 0, "?", 0, false}, + {type_inc, 0, "++", 0, false}, + {type_dec, 0, "--", 0, false}, + {type_assign, 0, ":=", 0, false}, + {type_spr, 0, "SPR", 0, false}, + + {type_binary, 1, "->", op_ror, false}, // math operators + {type_binary, 1, "<-", op_rol, false}, + {type_binary, 1, ">>", op_shr, false}, + {type_binary, 1, "<<", op_shl, false}, + {type_binary, 6, "#>", op_min, false}, + {type_binary, 6, "<#", op_max, false}, +// {type_unary, 0, "-", op_neg, false}, // (uses op_sub symbol) + {type_unary, 0, "!", op_not, false}, + {type_binary, 2, "&", op_and, false}, + {type_unary, 0, "||", op_abs, false}, + {type_binary, 3, "|", op_or, false}, + {type_binary, 3, "^", op_xor, false}, + {type_binary, 5, "+", op_add, false}, + {type_binary, 5, "-", op_sub, false}, + {type_binary, 1, "~>", op_sar, false}, + {type_binary, 1, "><", op_rev, false}, + {type_binary, 9, "AND", op_log_and, false}, + {type_unary, 0, ">|", op_ncd, false}, + {type_binary, 10, "OR", op_log_or, false}, + {type_unary, 0, "|<", op_dcd, false}, + {type_binary, 4, "*", op_mul, false}, + {type_binary, 4, "**", op_scl, false}, + {type_binary, 4, "/", op_div, false}, + {type_binary, 4, "//", op_rem, false}, + {type_unary, 0, "^^", op_sqr, false}, + {type_binary, 7, "<", op_cmp_b, false}, + {type_binary, 7, ">", op_cmp_a, false}, + {type_binary, 7, "<>", op_cmp_ne, false}, + {type_binary, 7, "==", op_cmp_e, false}, + {type_binary, 7, "=<", op_cmp_be, false}, + {type_binary, 7, "=>", op_cmp_ae, false}, + {type_unary, 8, "NOT", op_log_not, false}, + + {type_float, 0, "FLOAT", 0, false}, //floating-point operators + {type_round, 0, "ROUND", 0, false}, + {type_trunc, 0, "TRUNC", 0, false}, + + {type_conexp, 0, "CONSTANT", 0, false}, //constant and string expressions + {type_constr, 0, "STRING", 0, false}, + + {type_block, block_con, "CON", 0, false}, //block designators + {type_block, block_var, "VAR", 0, false}, + {type_block, block_dat, "DAT", 0, false}, + {type_block, block_obj, "OBJ", 0, false}, + {type_block, block_pub, "PUB", 0, false}, + {type_block, block_pri, "PRI", 0, false}, + {type_block, block_dev, "DEV", 0, false}, + + {type_size, 0, "BYTE", 0, false}, //sizes + {type_size, 1, "WORD", 0, false}, + {type_size, 2, "LONG", 0, false}, + + {type_precompile, 0, "PRECOMPILE", 0, false}, //file-related + {type_archive, 0, "ARCHIVE", 0, false}, + {type_file, 0, "FILE", 0, false}, + + {type_if, 0, "IF", 0, false}, //high-level structures + {type_ifnot, 0, "IFNOT", 0, false}, + {type_elseif, 0, "ELSEIF", 0, false}, + {type_elseifnot, 0, "ELSEIFNOT", 0, false}, + {type_else, 0, "ELSE", 0, false}, + {type_case, 0, "CASE", 0, false}, + {type_other, 0, "OTHER", 0, false}, + {type_repeat, 0, "REPEAT", 0, false}, + {type_while, 0, "WHILE", 0, false}, + {type_until, 0, "UNTIL", 0, false}, + {type_from, 0, "FROM", 0, false}, + {type_to, 0, "TO", 0, false}, + {type_step, 0, "STEP", 0, false}, + + {type_i_next_quit, 0, "NEXT", 0, false}, //high-level instructions + {type_i_next_quit, 1, "QUIT", 0, false}, + {type_i_abort_return, 0x30, "ABORT", 0, false}, + {type_i_abort_return, 0x32, "RETURN", 0, false}, + {type_i_look, 0x10, "LOOKUP", 0, false}, + {type_i_look, 0x10 + 0x80, "LOOKUPZ", 0, false}, + {type_i_look, 0x11, "LOOKDOWN", 0, false}, + {type_i_look, 0x11 + 0x80, "LOOKDOWNZ", 0, false}, + {type_i_clkmode, 0, "CLKMODE", 0, false}, + {type_i_clkfreq, 0, "CLKFREQ", 0, false}, + {type_i_chipver, 0, "CHIPVER", 0, false}, + {type_i_reboot, 0, "REBOOT", 0, false}, + {type_i_cognew, 0x28 + (2 * 0x40), "COGNEW", 0, false}, + {type_i_ar, 0x16 + (1 * 0x40), "STRSIZE", 0, false}, + {type_i_ar, 0x17 + (2 * 0x40), "STRCOMP", 0, false}, + {type_i_nr, 0x18 + (3 * 0x40), "BYTEFILL", 0, false}, + {type_i_nr, 0x19 + (3 * 0x40), "WORDFILL", 0, false}, + {type_i_nr, 0x1A + (3 * 0x40), "LONGFILL", 0, false}, + {type_i_nr, 0x1C + (3 * 0x40), "BYTEMOVE", 0, false}, + {type_i_nr, 0x1D + (3 * 0x40), "WORDMOVE", 0, false}, + {type_i_nr, 0x1E + (3 * 0x40), "LONGMOVE", 0, false}, + + {type_i_nr, 0x1B + (3 * 0x40), "WAITPEQ", 0x3C, true}, // dual mode instructions (spin and asm) + {type_i_nr, 0x1F + (3 * 0x40), "WAITPNE", 0x3D, true}, + {type_i_nr, 0x23 + (1 * 0x40), "WAITCNT", 0x3E + 0x40, true}, + {type_i_nr, 0x27 + (2 * 0x40), "WAITVID", 0x3F, true}, + {type_i_nr, 0x20 + (2 * 0x40), "CLKSET", 0 + 0x80, true}, + {type_i_cogid, 0, "COGID", 1 + 0x80 + 0x40, true}, + {type_i_coginit, 0x2C + (3 * 0x40), "COGINIT", 2 + 0x80, true}, + {type_i_nr, 0x21 + (1 * 0x40), "COGSTOP", 3 + 0x80, true}, + {type_i_cr, 0x29 + (0 * 0x40), "LOCKNEW", 4 + 0x80 + 0x40, true}, + {type_i_nr, 0x22 + (1 * 0x40), "LOCKRET", 5 + 0x80, true}, + {type_i_cr, 0x2A + (1 * 0x40), "LOCKSET", 6 + 0x80, true}, + {type_i_cr, 0x2B + (1 * 0x40), "LOCKCLR", 7 + 0x80, true}, + + {type_asm_dir, dir_orgx, "ORGX", 0, false}, //assembly directives + {type_asm_dir, dir_org, "ORG", 0, false}, + {type_asm_dir, dir_res, "RES", 0, false}, + {type_asm_dir, dir_fit, "FIT", 0, false}, + {type_asm_dir, dir_nop, "NOP", 0, false}, + + {type_asm_cond, if_nc_and_nz, "IF_NC_AND_NZ", 0, false}, //assembly conditionals + {type_asm_cond, if_nc_and_nz, "IF_NZ_AND_NC", 0, false}, + {type_asm_cond, if_nc_and_nz, "IF_A", 0, false}, + {type_asm_cond, if_nc_and_z, "IF_NC_AND_Z", 0, false}, + {type_asm_cond, if_nc_and_z, "IF_Z_AND_NC", 0, false}, + {type_asm_cond, if_nc, "IF_NC", 0, false}, + {type_asm_cond, if_nc, "IF_AE", 0, false}, + {type_asm_cond, if_c_and_nz, "IF_C_AND_NZ", 0, false}, + {type_asm_cond, if_c_and_nz, "IF_NZ_AND_C", 0, false}, + {type_asm_cond, if_nz, "IF_NZ", 0, false}, + {type_asm_cond, if_nz, "IF_NE", 0, false}, + {type_asm_cond, if_c_ne_z, "IF_C_NE_Z", 0, false}, + {type_asm_cond, if_c_ne_z, "IF_Z_NE_C", 0, false}, + {type_asm_cond, if_nc_or_nz, "IF_NC_OR_NZ", 0, false}, + {type_asm_cond, if_nc_or_nz, "IF_NZ_OR_NC", 0, false}, + {type_asm_cond, if_c_and_z, "IF_C_AND_Z", 0, false}, + {type_asm_cond, if_c_and_z, "IF_Z_AND_C", 0, false}, + {type_asm_cond, if_c_eq_z, "IF_C_EQ_Z", 0, false}, + {type_asm_cond, if_c_eq_z, "IF_Z_EQ_C", 0, false}, + {type_asm_cond, if_z, "IF_Z", 0, false}, + {type_asm_cond, if_z, "IF_E", 0, false}, + {type_asm_cond, if_nc_or_z, "IF_NC_OR_Z", 0, false}, + {type_asm_cond, if_nc_or_z, "IF_Z_OR_NC", 0, false}, + {type_asm_cond, if_c, "IF_C", 0, false}, + {type_asm_cond, if_c, "IF_B", 0, false}, + {type_asm_cond, if_c_or_nz, "IF_C_OR_NZ", 0, false}, + {type_asm_cond, if_c_or_nz, "IF_NZ_OR_C", 0, false}, + {type_asm_cond, if_c_or_z, "IF_C_OR_Z", 0, false}, + {type_asm_cond, if_c_or_z, "IF_Z_OR_C", 0, false}, + {type_asm_cond, if_c_or_z, "IF_BE", 0, false}, + {type_asm_cond, if_always, "IF_ALWAYS", 0, false}, + {type_asm_cond, if_never, "IF_NEVER", 0, false}, + + {type_asm_inst, 0, "WRBYTE", 0, false}, //assembly instructions + {type_asm_inst, 0x00 + 0x40, "RDBYTE", 0, false}, + {type_asm_inst, 0x01, "WRWORD", 0, false}, + {type_asm_inst, 0x01 + 0x40, "RDWORD", 0, false}, + {type_asm_inst, 0x02, "WRLONG", 0, false}, + {type_asm_inst, 0x02 + 0x40, "RDLONG", 0, false}, + {type_asm_inst, 0x03, "HUBOP", 0, false}, + {type_asm_inst, 0x04 + 0x40, "MUL", 0, false}, + {type_asm_inst, 0x05 + 0x40, "MULS", 0, false}, + {type_asm_inst, 0x06 + 0x40, "ENC", 0, false}, + {type_asm_inst, 0x07 + 0x40, "ONES", 0, false}, + {type_asm_inst, 0x08 + 0x40, "ROR", 0, false}, + {type_asm_inst, 0x09 + 0x40, "ROL", 0, false}, + {type_asm_inst, 0x0A + 0x40, "SHR", 0, false}, + {type_asm_inst, 0x0B + 0x40, "SHL", 0, false}, + {type_asm_inst, 0x0C + 0x40, "RCR", 0, false}, + {type_asm_inst, 0x0D + 0x40, "RCL", 0, false}, + {type_asm_inst, 0x0E + 0x40, "SAR", 0, false}, + {type_asm_inst, 0x0F + 0x40, "REV", 0, false}, + {type_asm_inst, 0x10 + 0x40, "MINS", 0, false}, + {type_asm_inst, 0x11 + 0x40, "MAXS", 0, false}, + {type_asm_inst, 0x12 + 0x40, "MIN", 0, false}, + {type_asm_inst, 0x13 + 0x40, "MAX", 0, false}, + {type_asm_inst, 0x14 + 0x40, "MOVS", 0, false}, + {type_asm_inst, 0x15 + 0x40, "MOVD", 0, false}, + {type_asm_inst, 0x16 + 0x40, "MOVI", 0, false}, + {type_asm_inst, 0x17 + 0x40, "JMPRET", 0, false}, +// {type_asm_inst, 0x18 + 0x40, "AND", 0, false}, //({type_binary_bool) + {type_asm_inst, 0x19 + 0x40, "ANDN", 0, false}, +// {type_asm_inst, 0x1A + 0x40, "OR", 0, false}, //({type_binary_bool) + {type_asm_inst, 0x1B + 0x40, "XOR", 0, false}, + {type_asm_inst, 0x1C + 0x40, "MUXC", 0, false}, + {type_asm_inst, 0x1D + 0x40, "MUXNC", 0, false}, + {type_asm_inst, 0x1E + 0x40, "MUXZ", 0, false}, + {type_asm_inst, 0x1F + 0x40, "MUXNZ", 0, false}, + {type_asm_inst, 0x20 + 0x40, "ADD", 0, false}, + {type_asm_inst, 0x21 + 0x40, "SUB", 0, false}, + {type_asm_inst, 0x22 + 0x40, "ADDABS", 0, false}, + {type_asm_inst, 0x23 + 0x40, "SUBABS", 0, false}, + {type_asm_inst, 0x24 + 0x40, "SUMC", 0, false}, + {type_asm_inst, 0x25 + 0x40, "SUMNC", 0, false}, + {type_asm_inst, 0x26 + 0x40, "SUMZ", 0, false}, + {type_asm_inst, 0x27 + 0x40, "SUMNZ", 0, false}, + {type_asm_inst, 0x28 + 0x40, "MOV", 0, false}, + {type_asm_inst, 0x29 + 0x40, "NEG", 0, false}, + {type_asm_inst, 0x2A + 0x40, "ABS", 0, false}, + {type_asm_inst, 0x2B + 0x40, "ABSNEG", 0, false}, + {type_asm_inst, 0x2C + 0x40, "NEGC", 0, false}, + {type_asm_inst, 0x2D + 0x40, "NEGNC", 0, false}, + {type_asm_inst, 0x2E + 0x40, "NEGZ", 0, false}, + {type_asm_inst, 0x2F + 0x40, "NEGNZ", 0, false}, + {type_asm_inst, 0x30, "CMPS", 0, false}, + {type_asm_inst, 0x31, "CMPSX", 0, false}, + {type_asm_inst, 0x32 + 0x40, "ADDX", 0, false}, + {type_asm_inst, 0x33 + 0x40, "SUBX", 0, false}, + {type_asm_inst, 0x34 + 0x40, "ADDS", 0, false}, + {type_asm_inst, 0x35 + 0x40, "SUBS", 0, false}, + {type_asm_inst, 0x36 + 0x40, "ADDSX", 0, false}, + {type_asm_inst, 0x37 + 0x40, "SUBSX", 0, false}, + {type_asm_inst, 0x38 + 0x40, "CMPSUB", 0, false}, + {type_asm_inst, 0x39 + 0x40, "DJNZ", 0, false}, + {type_asm_inst, 0x3A, "TJNZ", 0, false}, + {type_asm_inst, 0x3B, "TJZ", 0, false}, + {type_asm_inst, 0x15, "CALL", 0, false}, //converts to 17h (jmpret symbol_ret,#symbol) + {type_asm_inst, 0x16, "RET", 0, false}, //converts to 17h (jmp #0) + {type_asm_inst, 0x17, "JMP", 0, false}, + {type_asm_inst, 0x18, "TEST", 0, false}, + {type_asm_inst, 0x19, "TESTN", 0, false}, + {type_asm_inst, 0x21, "CMP", 0, false}, + {type_asm_inst, 0x33, "CMPX", 0, false}, + + {type_asm_effect, 0x04, "WZ", 0, false}, //assembly effects + {type_asm_effect, 0x02, "WC", 0, false}, + {type_asm_effect, 0x01, "WR", 0, false}, + {type_asm_effect, 0x08, "NR", 0, false}, + + {type_reg, 0x10, "PAR", 0, false}, //registers + {type_reg, 0x11, "CNT", 0, false}, + {type_reg, 0x12, "INA", 0, false}, + {type_reg, 0x13, "INB", 0, false}, + {type_reg, 0x14, "OUTA", 0, false}, + {type_reg, 0x15, "OUTB", 0, false}, + {type_reg, 0x16, "DIRA", 0, false}, + {type_reg, 0x17, "DIRB", 0, false}, + {type_reg, 0x18, "CTRA", 0, false}, + {type_reg, 0x19, "CTRB", 0, false}, + {type_reg, 0x1A, "FRQA", 0, false}, + {type_reg, 0x1B, "FRQB", 0, false}, + {type_reg, 0x1C, "PHSA", 0, false}, + {type_reg, 0x1D, "PHSB", 0, false}, + {type_reg, 0x1E, "VCFG", 0, false}, + {type_reg, 0x1F, "VSCL", 0, false}, + + {type_loc_long, 0, "RESULT", 0, false}, //variables + + {type_con, 0, "FALSE", 0, false}, //constants + {type_con, -1, "TRUE", 0, false}, + {type_con, ~0x7FFFFFFF, "NEGX", 0, false}, + {type_con, 0x7FFFFFFF, "POSX", 0, false}, + {type_con_float, 0x40490FDB, "PI", 0, false}, + + {type_con, 0x00000001, "RCFAST", 0, false}, + {type_con, 0x00000002, "RCSLOW", 0, false}, + {type_con, 0x00000004, "XINPUT", 0, false}, + {type_con, 0x00000008, "XTAL1", 0, false}, + {type_con, 0x00000010, "XTAL2", 0, false}, + {type_con, 0x00000020, "XTAL3", 0, false}, + {type_con, 0x00000040, "PLL1X", 0, false}, + {type_con, 0x00000080, "PLL2X", 0, false}, + {type_con, 0x00000100, "PLL4X", 0, false}, + {type_con, 0x00000200, "PLL8X", 0, false}, + {type_con, 0x00000400, "PLL16X", 0, false}, + + {type_undefined, 0, "*END*", 0, false} // end of table marker +}; + +SymbolTableEntry::SymbolTableEntry(const SymbolTableEntryDataTable& data) +{ + m_data.type = data.type; + m_data.value = data.value; + m_data.value_2 = 0; + size_t nameLength = strlen(data.name)+1; + m_data.name = new char[nameLength]; + strcpy(m_data.name, data.name); + m_data.operator_type_or_asm = data.operator_type_or_asm; + m_data.dual = data.dual; +} + +SymbolEngine::SymbolEngine() +{ + m_pSymbols = new HashTable(256); + m_pUserSymbols = new HashTable(8192); + m_pTempUserSymbols = new HashTable(1024); + + // add symbols to hash table + int index = 0; + while (strcmp(symbols[index].name, "*END*") != 0) + { + int hashKey = m_pSymbols->GetStringHashUppercase(symbols[index].name); + m_pSymbols->Insert(hashKey, new SymbolTableEntry(symbols[index])); + index++; + } +} + +SymbolEngine::~SymbolEngine() +{ + delete m_pSymbols; + m_pSymbols = 0; + delete m_pUserSymbols; + m_pUserSymbols = 0; + delete m_pTempUserSymbols; + m_pTempUserSymbols = 0; +} + +// looks for the given symbol in the symbol table and returns a pointer to the entry +// if the symbol is not found, then it returns 0 +SymbolTableEntry* SymbolEngine::FindSymbol(const char* pSymbolName) +{ + int hashKey = m_pSymbols->GetStringHashUppercase(pSymbolName); + + // look in automatic symbols + HashNode* pNode = m_pSymbols->FindFirst(hashKey); + while (pNode != 0) + { + SymbolTableEntry* pSymbol = (SymbolTableEntry*)(pNode->pValue); + if (_stricmp(pSymbol->m_data.name, pSymbolName) == 0) + { + return pSymbol; + } + + pNode = m_pSymbols->FindNext(pNode); + } + + // didn't find it above, so look in user symbols + pNode = m_pUserSymbols->FindFirst(hashKey); + while (pNode != 0) + { + SymbolTableEntry* pSymbol = (SymbolTableEntry*)(pNode->pValue); + if (_stricmp(pSymbol->m_data.name, pSymbolName) == 0) + { + return pSymbol; + } + + pNode = m_pUserSymbols->FindNext(pNode); + } + + // didn't find it above, so look in temp user symbols + pNode = m_pTempUserSymbols->FindFirst(hashKey); + while (pNode != 0) + { + SymbolTableEntry* pSymbol = (SymbolTableEntry*)(pNode->pValue); + if (_stricmp(pSymbol->m_data.name, pSymbolName) == 0) + { + return pSymbol; + } + + pNode = m_pTempUserSymbols->FindNext(pNode); + } + + return 0; +} + +void SymbolEngine::AddSymbol(const char* pSymbolName, symbol_Type type, int value, int value_2, bool bTemp) +{ + PrintSymbol(pSymbolName, (unsigned char)type, value, value_2); + + SymbolTableEntry* pSymbol = new SymbolTableEntry; + size_t nameLength = strlen(pSymbolName)+1; + pSymbol->m_data.name = new char[nameLength]; + strcpy(pSymbol->m_data.name, pSymbolName); + pSymbol->m_data.type = type; + pSymbol->m_data.value = value; + pSymbol->m_data.value_2 = value_2; + pSymbol->m_data.dual = false; + pSymbol->m_data.operator_type_or_asm = 0; + + if (bTemp) + { + int hashKey = m_pTempUserSymbols->GetStringHashUppercase(pSymbol->m_data.name); + m_pTempUserSymbols->Insert(hashKey, pSymbol); + } + else + { + int hashKey = m_pUserSymbols->GetStringHashUppercase(pSymbol->m_data.name); + m_pUserSymbols->Insert(hashKey, pSymbol); + } +} + +void SymbolEngine::Reset(bool bTempsOnly) +{ + if (!bTempsOnly) + { + delete m_pUserSymbols; + m_pUserSymbols = new HashTable(8192); + } + + delete m_pTempUserSymbols; + m_pTempUserSymbols = new HashTable(1024); +} + +/////////////////////////////////////////////////////////////////////////////////////////// +// TERMS OF USE: MIT License // +/////////////////////////////////////////////////////////////////////////////////////////// +// Permission is hereby granted, free of charge, to any person obtaining a copy of this // +// software and associated documentation files (the "Software"), to deal in the Software // +// without restriction, including without limitation the rights to use, copy, modify, // +// merge, publish, distribute, sublicense, and/or sell copies of the Software, and to // +// permit persons to whom the Software is furnished to do so, subject to the following // +// conditions: // +// // +// The above copyright notice and this permission notice shall be included in all copies // +// or substantial portions of the Software. // +// // +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, // +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A // +// PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT // +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE // +// SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // +/////////////////////////////////////////////////////////////////////////////////////////// diff --git a/Tools/unix/OpenSpin/PropellerCompiler/SymbolEngine.h b/Tools/unix/OpenSpin/PropellerCompiler/SymbolEngine.h new file mode 100644 index 00000000..7f508dd5 --- /dev/null +++ b/Tools/unix/OpenSpin/PropellerCompiler/SymbolEngine.h @@ -0,0 +1,254 @@ +////////////////////////////////////////////////////////////// +// // +// Propeller Spin/PASM Compiler // +// (c)2012-2016 Parallax Inc. DBA Parallax Semiconductor. // +// Adapted from Chip Gracey's x86 asm code by Roy Eltham // +// See end of file for terms of use. // +// // +////////////////////////////////////////////////////////////// +// +// SymbolEngine.h +// + +#ifndef _SYMBOL_ENGINE_H_ +#define _SYMBOL_ENGINE_H_ + +#include "Utilities.h" + +enum symbol_Type +{ + type_undefined = 0, // (undefined symbol, must be 0) + type_left, // ( + type_right, // ) + type_leftb, // [ + type_rightb, // ] + type_comma, // , + type_equal, // = + type_pound, // # + type_colon, // : + type_back, /* \ */ + type_dot, // . + type_dotdot, // .. + type_at, // @ + type_atat, // @@ + type_til, // ~ + type_tiltil, // ~~ + type_rnd, // ? + type_inc, // ++ + type_dec, // -- + type_assign, // := + type_spr, // SPR + type_unary, // -, !, ||, etc. + type_binary, // +, -, *, /, etc. + type_float, // FLOAT + type_round, // ROUND + type_trunc, // TRUNC + type_conexp, // CONSTANT + type_constr, // STRING + type_block, // CON, VAR, DAT, OBJ, PUB, PRI + type_size, // BYTE, WORD, LONG + type_precompile, // PRECOMPILE + type_archive, // ARCHIVE + type_file, // FILE + type_if, // IF + type_ifnot, // IFNOT + type_elseif, // ELSEIF + type_elseifnot, // ELSEIFNOT + type_else, // ELSE + type_case, // CASE + type_other, // OTHER + type_repeat, // REPEAT + type_repeat_count, // REPEAT count - different QUIT method + type_while, // WHILE + type_until, // UNTIL + type_from, // FROM + type_to, // TO + type_step, // STEP + type_i_next_quit, // NEXT/QUIT + type_i_abort_return, // ABORT/RETURN + type_i_look, // LOOKUP/LOOKDOWN + type_i_clkmode, // CLKMODE + type_i_clkfreq, // CLKFREQ + type_i_chipver, // CHIPVER + type_i_reboot, // REBOOT + type_i_cogid, // COGID + type_i_cognew, // COGNEW + type_i_coginit, // COGINIT + type_i_ar, // STRSIZE, STRCOMP - always returns value + type_i_cr, // LOCKNEW, LOCKCLR, LOCKSET - can return value + type_i_nr, // BYTEFILL, WORDFILL, LONGFILL, etc. - never returns value + type_dual, // WAITPEQ, WAITPNE, etc. - type_asm_inst or type_i_??? + type_asm_org, // $ (without a hex digit following) + type_asm_dir, // ORGX, ORG, RES, FIT, NOP + type_asm_cond, // IF_C, IF_Z, IF_NC, etc + type_asm_inst, // RDBYTE, RDWORD, RDLONG, etc. + type_asm_effect, // WZ, WC, WR, NR + type_reg, // PAR, CNT, INA, etc. + type_con, // user constant integer (must be followed by type_con_float) + type_con_float, // user constant float + type_var_byte, // V0user byte var + type_var_word, // V1user word var + type_var_long, // V2user long var + type_dat_byte, // D0user byte dat + type_dat_word, // D1user word dat + type_dat_long, // D2user long dat + type_dat_long_res, // (D2)user res dat (must follow type_dat_long) + type_loc_byte, // L0user byte local + type_loc_word, // L1user word local + type_loc_long, // L2user long local + type_obj, // user object + type_objpub, // user object.subroutine + type_objcon, // user object.constant (must be followed by type_objcon_float) + type_objcon_float, // user object.constant float + type_sub, // user subroutine + type_end // end-of-line c=0, end-of-file c=1 +}; + +enum block_Type +{ + block_con = 0, + block_var, + block_dat, + block_obj, + block_pub, + block_pri, + block_dev, +}; + +enum operator_Type +{ + op_ror = 0, // operator precedences (0=priority) + op_rol, // + op_shr, // 0= -, !, ||, >|, |<, ^^ (unary) + op_shl, // 1= ->, <-, >>, << ~>, >< + op_min, // 2= & + op_max, // 3= |, ^ + op_neg, // 4= *, **, /, // + op_not, // 5= +, - + op_and, // 6= #>, <# + op_abs, // 7= <, >, <>, ==, =<, => + op_or, // 8= NOT (unary) + op_xor, // 9= AND + op_add, // 10= OR + op_sub, + op_sar, + op_rev, + op_log_and, + op_ncd, + op_log_or, + op_dcd, + op_mul, + op_scl, + op_div, + op_rem, + op_sqr, + op_cmp_b, + op_cmp_a, + op_cmp_ne, + op_cmp_e, + op_cmp_be, + op_cmp_ae, + op_log_not +}; + +enum directives_Type +{ + dir_orgx = 0, + dir_org, + dir_res, + dir_fit, + dir_nop +}; + +enum if_Type +{ + if_never = 0, + if_nc_and_nz, + if_nc_and_z, + if_nc, + if_c_and_nz, + if_nz, + if_c_ne_z, + if_nc_or_nz, + if_c_and_z, + if_c_eq_z, + if_z, + if_nc_or_z, + if_c, + if_c_or_nz, + if_c_or_z, + if_always, +}; + +struct SymbolTableEntryDataTable +{ + symbol_Type type; // what type of symbol is it? + int value; // value is type dependant + const char* name; // the string of the symbol + unsigned char operator_type_or_asm; // operator type for op symbols, or asm value for dual symbols + bool dual; // indicates that this symbol is used by both PASM and spin +}; + +struct SymbolTableEntryData +{ + symbol_Type type; // what type of symbol is it? + int value; // value is type dependant + int value_2; // value 2 is type dependant + char* name; // the string of the symbol + unsigned char operator_type_or_asm; // operator type for op symbols, or asm value for dual symbols + bool dual; // indicates that this symbol is used by both PASM and spin +}; + +class SymbolTableEntry : public Hashable +{ +public: + SymbolTableEntry() + { + m_data.name = 0; + } + SymbolTableEntry(const SymbolTableEntryDataTable& data); + ~SymbolTableEntry() + { + delete [] m_data.name; + } + SymbolTableEntryData m_data; +}; + +class SymbolEngine +{ + HashTable* m_pSymbols; // predefined symbols + HashTable* m_pUserSymbols; // any symbols defined during compiling + HashTable* m_pTempUserSymbols; // used for locals during CompileSubBlocks + +public: + SymbolEngine(); + ~SymbolEngine(); + + SymbolTableEntry* FindSymbol(const char* pSymbolName); + + void AddSymbol(const char* pSymbolName, symbol_Type type, int value, int value_2 = 0, bool bTemp = false); + void Reset(bool bTempsOnly = false); +}; + +#endif // _SYMBOL_ENGINE_H_ + +/////////////////////////////////////////////////////////////////////////////////////////// +// TERMS OF USE: MIT License // +/////////////////////////////////////////////////////////////////////////////////////////// +// Permission is hereby granted, free of charge, to any person obtaining a copy of this // +// software and associated documentation files (the "Software"), to deal in the Software // +// without restriction, including without limitation the rights to use, copy, modify, // +// merge, publish, distribute, sublicense, and/or sell copies of the Software, and to // +// permit persons to whom the Software is furnished to do so, subject to the following // +// conditions: // +// // +// The above copyright notice and this permission notice shall be included in all copies // +// or substantial portions of the Software. // +// // +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, // +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A // +// PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT // +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE // +// SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // +/////////////////////////////////////////////////////////////////////////////////////////// diff --git a/Tools/unix/OpenSpin/PropellerCompiler/UnusedMethodUtils.cpp b/Tools/unix/OpenSpin/PropellerCompiler/UnusedMethodUtils.cpp new file mode 100644 index 00000000..59318820 --- /dev/null +++ b/Tools/unix/OpenSpin/PropellerCompiler/UnusedMethodUtils.cpp @@ -0,0 +1,992 @@ + +/////////////////////////////////////////////////////////////// +// // +// Propeller Spin/PASM Compiler Command Line Tool 'OpenSpin' // +// (c)2012-2016 Parallax Inc. DBA Parallax Semiconductor. // +// See end of file for terms of use. // +// // +/////////////////////////////////////////////////////////////// +// +// UnusedMethodUtils.cpp +// + +#include +#include +#include + +#include "PropellerCompiler.h" + +// +// track object names based on "indent" or which child/parent level +// note: the same name can be in here multiple times at different indent levels +// + +struct ObjectNameEntry +{ + char filename[256]; + int nCompileIndex; +}; + +ObjectNameEntry s_objectNames[file_limit * file_limit]; +int s_nNumObjectNames = 0; + +void AddObjectName(char* pFilename, int nCompileIndex) +{ + strcpy(s_objectNames[s_nNumObjectNames].filename, pFilename); + + // chop off the .spin extension + char* pExtension = strstr(s_objectNames[s_nNumObjectNames].filename, ".spin"); + if (pExtension != 0) + { + *pExtension = 0; + } + + s_objectNames[s_nNumObjectNames].nCompileIndex = nCompileIndex; + s_nNumObjectNames++; +} + +int GetObjectName(int nCompileIndex) +{ + for (int i = 0; i < s_nNumObjectNames; i++) + { + if (s_objectNames[i].nCompileIndex == nCompileIndex) + { + return i; + } + } + return -1; +} + +// +// track method usage by object +// + +struct IndexEntry +{ + short offset; // offset in longs to method (or sub object) + short vars; // var offset for objs, locals size for methods +}; + +struct CallEntry +{ + unsigned char* objaddress; + unsigned int callOffset; + unsigned short objoffset; + unsigned char opcode; + unsigned char pubnum; + unsigned char objnum; +}; + +struct MethodUsage +{ + int nLength; + int nCalled; + int nCalls; + CallEntry *pCalls; + int nCurrCall; + int nNewIndex; +}; + +struct ObjectEntry +{ + int nObjectNameIndex; + unsigned char* pObject; + int nObjectMethodCount; + int nObjectSubObjectCount; + int nObjectIndexCount; + int nMethodsCalled; + int nNewObjectIndex; + IndexEntry* pIndexTable; + MethodUsage* pMethods; +}; + +ObjectEntry s_objects[file_limit * file_limit]; +int s_nNumObjects; + +bool HaveObject(unsigned char* pObject) +{ + for (int i = 0; i < s_nNumObjects; i++) + { + if (s_objects[i].pObject == pObject) + { + return true; + } + } + + return false; +} + +ObjectEntry* GetObject(unsigned char* pObject) +{ + for (int i = 0; i < s_nNumObjects; i++) + { + if (s_objects[i].pObject == pObject) + { + return &s_objects[i]; + } + } + + return NULL; +} + +ObjectEntry* GetObjectByName(char* pFilename) +{ + for (int i = 0; i < s_nNumObjects; i++) + { + if (strcmp(s_objectNames[s_objects[i].nObjectNameIndex].filename, pFilename) == 0) + { + return &s_objects[i]; + } + } + + return NULL; +} + +int AddObject(unsigned char* pObject, int nObjectNameIndex) +{ + s_objects[s_nNumObjects].pObject = pObject; + s_objects[s_nNumObjects].nObjectNameIndex = nObjectNameIndex; + s_objects[s_nNumObjects].nObjectMethodCount = pObject[2]-1; + s_objects[s_nNumObjects].nObjectSubObjectCount = pObject[3]; + s_objects[s_nNumObjects].nObjectIndexCount = s_objects[s_nNumObjects].nObjectMethodCount + s_objects[s_nNumObjects].nObjectSubObjectCount; + s_objects[s_nNumObjects].pIndexTable = (IndexEntry *)&(pObject[4]); + s_objects[s_nNumObjects].pMethods = new MethodUsage[s_objects[s_nNumObjects].nObjectMethodCount]; + for (int i = 0; i < s_objects[s_nNumObjects].nObjectMethodCount; i++) + { + s_objects[s_nNumObjects].pMethods[i].nCalled = 0; + s_objects[s_nNumObjects].pMethods[i].nCalls = 0; + s_objects[s_nNumObjects].pMethods[i].pCalls = 0; + s_objects[s_nNumObjects].pMethods[i].nCurrCall = 0; + s_objects[s_nNumObjects].pMethods[i].nNewIndex = 0; + s_objects[s_nNumObjects].pMethods[i].nLength = 0; + } + return s_nNumObjects++; +} + +bool IsObjectUsed(char* pFilename) +{ + // chop off the .spin extension, saving the . char for restoring + char* pExtension = strstr(pFilename, ".spin"); + char savedChar = 0; + if (pExtension != 0) + { + savedChar = *pExtension; + *pExtension = 0; + } + + ObjectEntry* pObject = GetObjectByName(pFilename); + + // restore extention to passed in filename + if (pExtension != 0) + { + *pExtension = savedChar; + } + + if (pObject && pObject->nMethodsCalled > 0) + { + return true; + } + + return false; +} + +bool IsMethodUsed(char* pFilename, int nMethod) +{ + ObjectEntry* pObject = GetObjectByName(pFilename); + if (pObject && pObject->nMethodsCalled > 0 && pObject->pMethods[nMethod].nCalled > 0) + { + return true; + } + + return false; +} + +// +// store pubcon list data so it can be used in the final compile +// note: this is needed to allow removing a child object where the parent used only CONs from the child +// + +struct ObjectPubConListEntry +{ + char filename[256]; + unsigned char* pPubConList; + int nPubConListSize; +}; + +ObjectPubConListEntry s_objectPubConLists[file_limit * file_limit]; +int s_nNumObjectPubConLists; + +ObjectPubConListEntry* GetObjectPubConListEntryByName(char* pFilename) +{ + for (int i = 0; i < s_nNumObjectPubConLists; i++) + { + if (strcmp(s_objectPubConLists[i].filename, pFilename) == 0) + { + return &s_objectPubConLists[i]; + } + } + + return NULL; +} + +void AddObjectPubConList(char* pFilename, unsigned char* pPubConList, int nPubConListSize) +{ + strcpy(s_objectPubConLists[s_nNumObjectPubConLists].filename, pFilename); + s_objectPubConLists[s_nNumObjectPubConLists].pPubConList = new unsigned char[nPubConListSize]; + s_objectPubConLists[s_nNumObjectPubConLists].nPubConListSize = nPubConListSize; + memcpy(s_objectPubConLists[s_nNumObjectPubConLists].pPubConList, pPubConList, s_objectPubConLists[s_nNumObjectPubConLists].nPubConListSize); + s_nNumObjectPubConLists++; +} + +bool GetObjectPubConList(char* pFilename, unsigned char** ppPubConList, int* pnPubConListSize) +{ + ObjectPubConListEntry* pObject = GetObjectPubConListEntryByName(pFilename); + if (pObject && pObject->pPubConList != 0 && pObject->nPubConListSize > 0) + { + *ppPubConList = pObject->pPubConList; + *pnPubConListSize = pObject->nPubConListSize; + return true; + } + return false; +} + +struct ObjectCogInitEntry +{ + char filename[256]; + int nSubConstant; +}; + +ObjectCogInitEntry s_objectCogInits[file_limit * file_limit]; +int s_nNumObjectCogInits; + +void AddCogNewOrInit(char* pFilename, int nSubConstant) +{ + if (s_nNumObjectCogInits > 0) + { + // see if this combo already is in the array + for (int i = s_nNumObjectCogInits; i > 0; i--) + { + if (s_objectCogInits[i-1].nSubConstant == nSubConstant && strcmp(s_objectCogInits[i-1].filename, pFilename) == 0) + { + return; + } + } + } + // wasn't already there, so add it + strcpy(s_objectCogInits[s_nNumObjectCogInits].filename, pFilename); + s_objectCogInits[s_nNumObjectCogInits].nSubConstant = nSubConstant; + s_nNumObjectCogInits++; +} + +void MarkCalls(MethodUsage* pMethod, ObjectEntry* pObject); + +void CheckForCogNewOrInit(ObjectEntry* pObject) +{ + char* pObjectFilename = s_objectNames[pObject->nObjectNameIndex].filename; + for (int i = 0; i < s_nNumObjectCogInits; i++) + { + if (strcmp(s_objectCogInits[i].filename, pObjectFilename) == 0) + { + // don't do this if the object has no called methods already + // in that case it means the cognew/coginit is never done, so it's safe to not mark the referred to method + if (pObject->nMethodsCalled > 0) + { + MarkCalls(&(pObject->pMethods[s_objectCogInits[i].nSubConstant - 1]), pObject); + } + } + } +} + +void CleanUpUnusedMethodData() +{ + for (int i = 0; i < s_nNumObjects; i++) + { + s_objects[i].pObject = 0; + s_objects[i].pIndexTable = 0; + + for (int j = 0; j < s_objects[s_nNumObjects].nObjectMethodCount; j++) + { + if (s_objects[i].pMethods[j].pCalls) + { + delete [] s_objects[i].pMethods[j].pCalls; + s_objects[i].pMethods[j].pCalls = 0; + } + } + delete [] s_objects[i].pMethods; + s_objects[i].pMethods = 0; + } + s_nNumObjects = 0; + s_nNumObjectNames = 0; + + for (int i = 0; i < s_nNumObjectPubConLists; i++) + { + delete [] s_objectPubConLists[i].pPubConList; + s_objectPubConLists[i].pPubConList = 0; + } + s_nNumObjectPubConLists = 0; + + s_nNumObjectCogInits = 0; +} + +void InitUnusedMethodData() +{ + for (int i = 0; i < (file_limit * file_limit); i++) + { + s_objectPubConLists[i].filename[0] = 0; + s_objectPubConLists[i].pPubConList = 0; + s_objectPubConLists[i].nPubConListSize = 0; + } + s_nNumObjectPubConLists = 0; + s_nNumObjectCogInits = 0; + s_nNumObjectNames = 0; +} + +void AdvanceCompileIndex(unsigned char* pObject, int& nCompileIndex) +{ + nCompileIndex++; + + int nNextObjOffset = *((unsigned short *)pObject); + ObjectEntry* pObjectEntry = GetObject(pObject); + for (int i = 0; i < pObjectEntry->nObjectIndexCount; i++) + { + if (pObjectEntry->pIndexTable[i].offset >= nNextObjOffset) + { + AdvanceCompileIndex(&(pObject[pObjectEntry->pIndexTable[i].offset]), nCompileIndex); + } + } +} + +void BuildTables(unsigned char* pObject, int indent, int& nCompileIndex) +{ +#ifdef RPE_DEBUG +#define MAX_INDENT 32 + char s_indent[MAX_INDENT+1] = " "; +#endif + + if (HaveObject(pObject)) + { +#ifdef RPE_DEBUG + printf("%sObject Already Added\n", &s_indent[MAX_INDENT-indent]); +#endif + AdvanceCompileIndex(pObject, nCompileIndex); + return; + } + nCompileIndex++; + int nNextObjOffset = *((unsigned short *)pObject); + int nObjectName = GetObjectName(nCompileIndex); + int nObject = AddObject(pObject, nObjectName); + +#ifdef RPE_DEBUG + printf("%sObject Index Table: %s\n", &s_indent[MAX_INDENT-indent], s_objectNames[s_objects[nObject].nObjectNameIndex].filename); +#endif + for (int i = 0; i < s_objects[nObject].nObjectIndexCount; i++) + { + if (s_objects[nObject].pIndexTable[i].offset >= nNextObjOffset) + { +#ifdef RPE_DEBUG + printf("%s Object Offset: %04d Vars Offset: %d\n", &s_indent[MAX_INDENT-indent], s_objects[nObject].pIndexTable[i].offset, s_objects[nObject].pIndexTable[i].vars); +#endif + // this skip logic here is to handle the case where there are multiple instances of the same object source included + // either as an array of objects or as separately named objects + bool bSkip = false; + for (int j = 0; j < i; j++) + { + if (s_objects[nObject].pIndexTable[i].offset == s_objects[nObject].pIndexTable[j].offset) + { + bSkip = true; + } + } + if (!bSkip) + { + BuildTables(&(pObject[s_objects[nObject].pIndexTable[i].offset]), indent + 1, nCompileIndex); + } + } +#ifdef RPE_DEBUG + else + { + printf("%s Method Offset: %04d Locals size: %d\n", &s_indent[MAX_INDENT-indent], s_objects[nObject].pIndexTable[i].offset, s_objects[nObject].pIndexTable[i].vars); + } +#endif + } +} + +// +// byte code scanning stuff +// borrowed from Dave Hein's spinsim code and then modified for my needs (mostly stripped down to just skip intelligently over byte code) +// + +int SkipSignedOffset(unsigned char* pOpcode) +{ + return (*pOpcode < 0x80) ? 1 : 2; +} + +int SkipUnsignedOffset(unsigned char* pOpcode) +{ + return (*pOpcode & 0x80) ? 2 : 1; +} + +int ScanMathOpcode(unsigned char* pOpcode) +{ + bool execflag = false; + int opcode = *pOpcode; + + if (opcode < 0xe0) + { + execflag = true; + opcode += 0xe0 - 0x40; + } + + // Execute the math op + switch (opcode) + { + case 0xe0: // ror + case 0xe1: // rol + case 0xe2: // shr + case 0xe3: // shl + case 0xe4: // min + case 0xe5: // max + case 0xe6: // neg + case 0xe7: // com + case 0xe8: // and + case 0xe9: // abs + case 0xea: // or + case 0xeb: // xor + case 0xec: // add + case 0xed: // sub + case 0xee: // sar + case 0xef: // rev + case 0xf0: // andl + case 0xf1: // encode + case 0xf4: // mul + case 0xf5: // mulh + case 0xf2: // orl + case 0xf3: // decode + case 0xf6: // div + case 0xf7: // mod + case 0xf8: // sqrt + case 0xf9: // cmplt + case 0xfa: // cmpgt + case 0xfb: // cmpne + case 0xfc: // cmpeq + case 0xfd: // cmple + case 0xfe: // cmpgr + case 0xff: // notl + break; + + default: + break; + } + + return (execflag ? 0 : 1); +} + +int ScanExtraOpcode(unsigned char* pOpcode, int opcode) +{ + int nOpSize = 0; + + opcode &= 0x7f; + + if (opcode >= 0x40 && opcode < 0x60) // math op + { + nOpSize += ScanMathOpcode(pOpcode); + } + else if ((opcode & 0x7e) == 0x00) // store + { + } + else if ((opcode & 0x7a) == 0x02) // repeat, repeats + { + nOpSize += SkipSignedOffset(pOpcode); + } + else if ((opcode & 0x78) == 8) // randf, randr + { + } + else if ((opcode & 0x7c) == 0x10) // sexb + { + } + else if ((opcode & 0x7c) == 0x14) // sexw + { + } + else if ((opcode & 0x7c) == 0x18) // postclr + { + } + else if ((opcode & 0x7c) == 0x1c) // postset + { + } + else if ((opcode & 0x78) == 0x20) // preinc + { + } + else if ((opcode & 0x78) == 0x28) // postinc + { + } + else if ((opcode & 0x78) == 0x30) // predec + { + } + else if ((opcode & 0x78) == 0x38) // postdec + { + } + else + { +#ifdef _DEBUG + printf("NOT IMPLEMENTED\n"); +#endif + } + + return nOpSize; +} + + +int ScanMemoryOpcode(unsigned char* pOpcode) +{ + int opcode = *pOpcode; + int memfunc = opcode & 3; + + int nOpSize = 1; + + if (opcode < 0x80) // Compact offset + { + } + else + { + if ((opcode & 0x0c) >> 2) + { + nOpSize += SkipUnsignedOffset(&pOpcode[nOpSize]); + } + } + + if (memfunc == 3) // la + { + } + else if (memfunc == 0) // ld + { + } + else if (memfunc == 1) // st + { + } + else // ex + { + opcode = pOpcode[nOpSize]; + nOpSize++; + + nOpSize += ScanExtraOpcode(&pOpcode[nOpSize], opcode); + } + + return nOpSize; +} + +int ScanRegisterOpcode(unsigned char* pOpcode, int operand) +{ + int opcode; + int nOpSize = 0; + int memfunc = (operand >> 5) & 3; + + if (memfunc == 1) // store + { + } + else if (memfunc == 0) // load + { + } + else if (memfunc == 2) // execute + { + opcode = *pOpcode; + nOpSize++; + + nOpSize += ScanExtraOpcode(&pOpcode[nOpSize], opcode); + } + else + { +#ifdef _DEBUG + printf("Undefined register operation\n"); +#endif + } + + return nOpSize; +} + +int ScanLowerOpcode(unsigned char* pOpcode, MethodUsage* pUsage, ObjectEntry* pObject, unsigned char* pMethodStart) +{ + int opcode = *pOpcode; + int nOpSize = 1; + + if (opcode <= 3) // ldfrmr, ldfrm, ldfrmar, ldfrma + { + } + else if (opcode == 0x04) // jmp + { + nOpSize += SkipSignedOffset(&pOpcode[nOpSize]); + } + else if (opcode >= 0x05 && opcode <= 0x07) // call, callobj, callobjx + { + int objnum = 0; + + if (opcode > 0x05) + { + objnum = pOpcode[nOpSize]; + nOpSize++; + if (opcode == 0x07) + { + // indexed + } + + // skip over invalid calls (happens when we scan strings as opcodes, this can go away when we fix scanning strings properly) + if (objnum < 0 || objnum > (pObject->nObjectMethodCount + pObject->nObjectSubObjectCount)) + { + return nOpSize + 1; + } + } + + int pubnum = pOpcode[nOpSize]; + nOpSize++; + + // skip over invalid calls (happens when we scan strings as opcodes, this can go away when we fix scanning strings properly) + if (objnum == 0 && (pubnum < 0 || pubnum > pObject->nObjectMethodCount)) + { + return nOpSize; + } + + // need to update usage here + if (pUsage->pCalls == 0) + { + pUsage->nCalls++; + } + else + { + pUsage->pCalls[pUsage->nCurrCall].opcode = (unsigned char)opcode; + pUsage->pCalls[pUsage->nCurrCall].pubnum = (unsigned char)pubnum; + pUsage->pCalls[pUsage->nCurrCall].callOffset = (unsigned int)((&pOpcode[1]) - pMethodStart); + + if (opcode > 0x05) + { + pUsage->pCalls[pUsage->nCurrCall].objnum = (unsigned char)objnum; + pUsage->pCalls[pUsage->nCurrCall].objoffset = pObject->pIndexTable[objnum-1].offset; + pUsage->pCalls[pUsage->nCurrCall].objaddress = &pObject->pObject[pUsage->pCalls[pUsage->nCurrCall].objoffset]; +#ifdef RPE_DEBUG + printf(" callobj %02X:%02X (%p)\n", pUsage->pCalls[pUsage->nCurrCall].objnum, pUsage->pCalls[pUsage->nCurrCall].pubnum, pUsage->pCalls[pUsage->nCurrCall].objaddress); +#endif + } + else + { + pUsage->pCalls[pUsage->nCurrCall].objnum = 0; + pUsage->pCalls[pUsage->nCurrCall].objoffset = 0; + pUsage->pCalls[pUsage->nCurrCall].objaddress = (pObject->pObject); +#ifdef RPE_DEBUG + printf(" call %02X (%p)\n", pUsage->pCalls[pUsage->nCurrCall].pubnum, pUsage->pCalls[pUsage->nCurrCall].objaddress); +#endif + } + pUsage->nCurrCall++; + } + } + else if (opcode == 0x08) // tjz + { + nOpSize += SkipSignedOffset(&pOpcode[nOpSize]); + } + else if (opcode == 0x09) // djnz + { + nOpSize += SkipSignedOffset(&pOpcode[nOpSize]); + } + else if (opcode == 0x0a) // jz + { + nOpSize += SkipSignedOffset(&pOpcode[nOpSize]); + } + else if (opcode == 0x0b) // jnz + { + nOpSize += SkipSignedOffset(&pOpcode[nOpSize]); + } + else if (opcode >= 0x0c && opcode <= 0x15) + { + if (opcode == 0x0c) // casedone + { + } + else if (opcode == 0x0d) // casevalue + { + nOpSize += SkipSignedOffset(&pOpcode[nOpSize]); + } + else if (opcode == 0x0e) // caserange + { + nOpSize += SkipSignedOffset(&pOpcode[nOpSize]); + } + else if (opcode == 0x0f) // lookdone + { + } + else if (opcode == 0x10) // lookupval + { + } + else if (opcode == 0x11) // lookdnval + { + } + else if (opcode == 0x12) // lookuprng + { + } + else if (opcode == 0x13) // lookdnrng + { + } + else if (opcode == 0x14) // pop + { + } + else if (opcode == 0x15) // run + { + } + else + { +#ifdef _DEBUG + printf("%2.2x - NOT IMPLEMENTED\n", opcode); +#endif + } + } + else if (opcode >= 0x16 && opcode <= 0x23) + { + if (opcode == 0x16) // strsize + { + } + else if (opcode == 0x17) // strcomp + { + } + else if (opcode == 0x18) // bytefill + { + } + else if (opcode == 0x19) // wordfill + { + } + else if (opcode == 0x1a) // longfill + { + } + else if (opcode == 0x1b) // waitpeq + { + } + else if (opcode >= 0x1c && opcode <= 0x1e ) // bytemove, wordmove, longmove + { + } + else if (opcode == 0x1f) // waitpne + { + } + else if (opcode == 0x20) // clkset + { + } + else if (opcode == 0x21) // cogstop + { + } + else if (opcode == 0x22) // lockret + { + } + else if (opcode == 0x23) // waitcnt + { + } + } + else if (opcode >= 0x24 && opcode <= 0x2f) + { + if (opcode >= 0x24 && opcode <= 0x26) // ldregx, stregx, exregx + { + int operand = ((opcode & 3) << 5); + nOpSize += ScanRegisterOpcode(&pOpcode[nOpSize], operand); + } + else if (opcode == 0x27) // waitvid + { + } + else if (opcode == 0x28 || opcode == 0x2c) // coginitret, coginit + { + } + else if (opcode == 0x29 || opcode == 0x2d) // locknewret, locknew + { + } + else if (opcode == 0x2a || opcode == 0x2b || opcode == 0x2e || opcode == 0x2f) // locksetret, lockclrret, lockset, lockclr + { + } + } + else if (opcode >= 0x30 && opcode <= 0x33) // abort, abortval, ret, retval + { + } + else if (opcode >= 0x34 && opcode < 0x3c) + { + if (opcode == 0x35) // dli0 + { + } + else if (opcode == 0x36) // dli1 + { + } + else if (opcode == 0x34) // dlim1 + { + } + else if (opcode == 0x37) // ldlip + { + nOpSize++; + } + else // ldbi, ldwi, ldmi, ldli + { + while (opcode-- >= 0x38) + { + nOpSize++; + } + } + } + else if (opcode == 0x3d) // ldregbit, stregbit, exregbit + { + int operand = pOpcode[nOpSize]; + nOpSize++; + + nOpSize += ScanRegisterOpcode(&pOpcode[nOpSize], operand); + } + else if (opcode == 0x3e) // ldregbits, stregbits, exregbits + { + int operand = pOpcode[nOpSize]; + nOpSize++; + + nOpSize += ScanRegisterOpcode(&pOpcode[nOpSize], operand); + } + else if (opcode == 0x3f) // ldreg, streg, exreg + { + int operand = pOpcode[nOpSize]; + nOpSize++; + + nOpSize += ScanRegisterOpcode(&pOpcode[nOpSize], operand); + } + else + { +#ifdef _DEBUG + printf("NOT PROCESSED\n"); +#endif + } + + return nOpSize; +} + + +int ScanOpcode(unsigned char* pOpcode, MethodUsage* pUsage, ObjectEntry* pObject, unsigned char* pMethodStart) +{ + if (*pOpcode < 0x40) + { + return ScanLowerOpcode(pOpcode, pUsage, pObject, pMethodStart); + } + else if (*pOpcode < 0xe0) + { + return ScanMemoryOpcode(pOpcode); + } + else + { + return ScanMathOpcode(pOpcode); + } +} + + +void ScanMethod(unsigned char* pMethod, MethodUsage* pUsage, ObjectEntry* pObject) +{ +#ifdef RPE_DEBUG + for (int i = 0; i < pUsage->nLength; i++) + { + printf("%02x ", pMethod[i]); + } + printf("\n"); +#endif + + // scan once to count calls + int nOffset = 0; + while (nOffset < pUsage->nLength) + { + nOffset += ScanOpcode(&pMethod[nOffset], pUsage, pObject, pMethod); + } + if (pUsage->nCalls > 0) + { + // if there were calls then allocate space and scan again to fill in call info + pUsage->pCalls = new CallEntry[pUsage->nCalls]; + nOffset = 0; + while (nOffset < pUsage->nLength) + { + nOffset += ScanOpcode(&pMethod[nOffset], pUsage, pObject, pMethod); + } + } +} + +void ScanObjectMethods(ObjectEntry* pObjectEntry) +{ + for (int i = 0; i < pObjectEntry->nObjectMethodCount; i++) + { + unsigned char* pMethod = pObjectEntry->pObject + pObjectEntry->pIndexTable[i].offset; + int nLength = 0; + if (i < pObjectEntry->nObjectMethodCount-1) + { + nLength = pObjectEntry->pIndexTable[i+1].offset - pObjectEntry->pIndexTable[i].offset; + } + else + { + int nNextObjectOffset = *((unsigned short *)(pObjectEntry->pObject)); + nLength = nNextObjectOffset - pObjectEntry->pIndexTable[i].offset; + } + pObjectEntry->pMethods[i].nLength = nLength; + ScanMethod(pMethod, &(pObjectEntry->pMethods[i]), pObjectEntry); + } +} + +void MarkCalls(MethodUsage* pMethod, ObjectEntry* pObject) +{ + if (pMethod->nCalled == 0) + { + pMethod->nCalled = 1; + pObject->nMethodsCalled++; + + for (int nCall = 0; nCall < pMethod->nCalls; nCall++) + { + CallEntry* pCall = &(pMethod->pCalls[nCall]); + if ( pCall->opcode == 5 ) // normal call + { + MarkCalls(&(pObject->pMethods[pCall->pubnum-1]), pObject); + } + else // obj call + { + ObjectEntry* pSubObject = GetObject(pCall->objaddress); + MarkCalls(&(pSubObject->pMethods[pCall->pubnum-1]), pSubObject); + } + } + } +} + +void FindUnusedMethods(CompilerData* pCompilerData) +{ + for (int i = 0; i < (file_limit * file_limit); i++) + { + s_objects[i].pObject = 0; + s_objects[i].nObjectMethodCount = 0; + s_objects[i].nObjectSubObjectCount = 0; + s_objects[i].nObjectIndexCount = 0; + s_objects[i].nMethodsCalled = 0; + s_objects[i].nNewObjectIndex = 0; + s_objects[i].pIndexTable = 0; + s_objects[i].pMethods = 0; + } + s_nNumObjects = 0; + + int nCompileIndex = 0; + BuildTables(&(pCompilerData->obj[4]), 0, nCompileIndex); + + for (int i = 0; i < s_nNumObjects; i++) + { + ScanObjectMethods(&s_objects[i]); + } + + ObjectEntry* pObject = &(s_objects[0]); + MethodUsage* pMethod = &(pObject->pMethods[0]); + MarkCalls(pMethod, pObject); + + for (int i = 0; i < s_nNumObjects; i++) + { + CheckForCogNewOrInit(&s_objects[i]); + } +} + +/////////////////////////////////////////////////////////////////////////////////////////// +// TERMS OF USE: MIT License // +/////////////////////////////////////////////////////////////////////////////////////////// +// Permission is hereby granted, free of charge, to any person obtaining a copy of this // +// software and associated documentation files (the "Software"), to deal in the Software // +// without restriction, including without limitation the rights to use, copy, modify, // +// merge, publish, distribute, sublicense, and/or sell copies of the Software, and to // +// permit persons to whom the Software is furnished to do so, subject to the following // +// conditions: // +// // +// The above copyright notice and this permission notice shall be included in all copies // +// or substantial portions of the Software. // +// // +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, // +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A // +// PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT // +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE // +// SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // +/////////////////////////////////////////////////////////////////////////////////////////// diff --git a/Tools/unix/OpenSpin/PropellerCompiler/UnusedMethodUtils.h b/Tools/unix/OpenSpin/PropellerCompiler/UnusedMethodUtils.h new file mode 100644 index 00000000..a5abe913 --- /dev/null +++ b/Tools/unix/OpenSpin/PropellerCompiler/UnusedMethodUtils.h @@ -0,0 +1,50 @@ +/////////////////////////////////////////////////////////////// +// // +// Propeller Spin/PASM Compiler Command Line Tool 'OpenSpin' // +// (c)2012-2016 Parallax Inc. DBA Parallax Semiconductor. // +// See end of file for terms of use. // +// // +/////////////////////////////////////////////////////////////// +// +// UnusedMethodUtils.h +// + +#ifndef _UNUSEDMETHODUTILS_H_ +#define _UNUSEDMETHODUTILS_H_ + +struct CompilerData; + +void AddObjectName(char* pFilename, int nCompileIndex); +void FindUnusedMethods(CompilerData* pCompilerData); +void CleanUpUnusedMethodData(); +void InitUnusedMethodData(); + +bool IsObjectUsed(char* pFilename); +bool IsMethodUsed(char* pFilename, int nMethod); +void AddObjectPubConList(char* pFilename, unsigned char* pPubConList, int nPubConListSize); +bool GetObjectPubConList(char* pFilename, unsigned char** ppPubConList, int* pnPubConListSize); + +void AddCogNewOrInit(char* pFilename, int nSubConstant); + +#endif // _UNUSEDMETHODUTILS_H_ + +/////////////////////////////////////////////////////////////////////////////////////////// +// TERMS OF USE: MIT License // +/////////////////////////////////////////////////////////////////////////////////////////// +// Permission is hereby granted, free of charge, to any person obtaining a copy of this // +// software and associated documentation files (the "Software"), to deal in the Software // +// without restriction, including without limitation the rights to use, copy, modify, // +// merge, publish, distribute, sublicense, and/or sell copies of the Software, and to // +// permit persons to whom the Software is furnished to do so, subject to the following // +// conditions: // +// // +// The above copyright notice and this permission notice shall be included in all copies // +// or substantial portions of the Software. // +// // +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, // +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A // +// PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT // +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE // +// SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // +/////////////////////////////////////////////////////////////////////////////////////////// diff --git a/Tools/unix/OpenSpin/PropellerCompiler/Utilities.cpp b/Tools/unix/OpenSpin/PropellerCompiler/Utilities.cpp new file mode 100644 index 00000000..51f779e4 --- /dev/null +++ b/Tools/unix/OpenSpin/PropellerCompiler/Utilities.cpp @@ -0,0 +1,851 @@ +////////////////////////////////////////////////////////////// +// // +// Propeller Spin/PASM Compiler // +// (c)2012-2016 Parallax Inc. DBA Parallax Semiconductor. // +// Adapted from Chip Gracey's x86 asm code by Roy Eltham // +// See end of file for terms of use. // +// // +////////////////////////////////////////////////////////////// +// +// Utilities.cpp +// + +#include +#include +#include +#include +#include "PropellerCompilerInternal.h" +#include "SymbolEngine.h" +#include "Elementizer.h" +#include "ErrorStrings.h" + +char* pPrintDestination = 0; +int printLimit = 0; + +void SetPrint(char* pDestination, int limit) +{ + pPrintDestination = pDestination; + printLimit = limit; + g_pCompilerData->print_length = 0; +} + +bool PrintChr(char theChar) +{ + if (g_pCompilerData->print_length >= printLimit) + { + g_pCompilerData->error = true; + g_pCompilerData->error_msg = g_pErrorStrings[error_litl]; + return false; + } + pPrintDestination[g_pCompilerData->print_length++] = theChar; + return true; +} + +bool PrintString(const char* theString) +{ + int stringOffset = 0; + bool result = true; + char theChar = theString[stringOffset++]; + while(theChar != 0 && result) + { + result = PrintChr(theChar); + theChar = theString[stringOffset++]; + } + + return result; +} + +bool PrintSymbol(const char* pSymbolName, unsigned char type, int value, int value_2) +{ + char tempStr[symbol_limit + 64]; + sprintf(tempStr, "TYPE: %02X", type); + if (!PrintString(tempStr)) + { + return false; + } + sprintf(tempStr, " VALUE: %08X (%08x)", value, value_2); + if (!PrintString(tempStr)) + { + return false; + } + sprintf(tempStr, " NAME: %s\r", pSymbolName); + return PrintString(tempStr); +} + +bool ListLine(int offset, int count) +{ + char tempStr[8]; + sprintf(tempStr, "%04X-", offset); + if (!PrintString(tempStr)) + { + return false; + } + + for (int i = 0; i < 17; i++) + { + if (i < count) + { + sprintf(tempStr, " %02X", g_pCompilerData->obj[offset+i]); + if (!PrintString(tempStr)) + { + return false; + } + } + else + { + if (!PrintChr(32)) + { + return false; + } + if (!PrintChr(32)) + { + return false; + } + if (!PrintChr(32)) + { + return false; + } + } + } + for (int i = 0; i < count; i++) + { + unsigned char theChar = g_pCompilerData->obj[offset+i]; + if (theChar < ' ' || theChar >= 0x7F) + { + theChar = '.'; + } + if (!PrintChr(theChar)) + { + return false; + } + } + + return PrintChr(13); +} + +bool PrintObj() +{ + char tempStr[256]; + sprintf(tempStr, "\rOBJ bytes: %d", g_pCompilerData->obj_ptr); + if (!PrintString(tempStr)) + { + return false; + } + + sprintf(tempStr, "\r\r_CLKMODE: %02X", g_pCompilerData->clkmode); + if (!PrintString(tempStr)) + { + return false; + } + sprintf(tempStr, "\r_CLKFREQ: %08X\r\r", g_pCompilerData->clkfreq); + if (!PrintString(tempStr)) + { + return false; + } + + for (int i = 0; i < g_pCompilerData->obj_ptr; i+=16) + { + if (!ListLine(i, ((i + 16) < g_pCompilerData->obj_ptr) ? 16 : (g_pCompilerData->obj_ptr - i))) + { + return false; + } + } + return true; +} + +bool DocPrint(char theChar) +{ + if (g_pCompilerData->doc_mode) + { + return PrintChr(theChar); + } + return true; +} + +// assumes theChar has been uppercased. +bool CheckWordChar(char theChar) +{ + if ((theChar >= '0' && theChar <= '9') || (theChar == '_') || (theChar >= 'A' && theChar <= 'Z')) + { + return true; + } + return false; +} + +char Uppercase(char theChar) +{ + if (theChar >= 'a' && theChar <= 'z') + { + return theChar - ('a' - 'A'); + } + return theChar; +} + +// if theChar is a hex digit this returns true and digitValue is 0 to 15 depending on the digit +bool CheckHex(char theChar, char& digitValue) +{ + theChar = Uppercase(theChar); + digitValue = theChar - '0'; + if (digitValue >= 0 && digitValue <= 9) + { + return true; + } + digitValue -= ('A' - '9' - 1); + if (digitValue >= 10 && digitValue <= 15) + { + return true; + } + return false; +} + +// if theChar is a valid digit in numberBase this returns true and digitValue is 0 to numberBase-1 depending on the digit +bool CheckDigit(char theChar, char& digitValue, char numberBase) +{ + if (CheckHex(theChar, digitValue)) + { + if (digitValue < numberBase) + { + return true; + } + } + return false; +} + +bool CheckPlus(char theChar) +{ + if (theChar == '+') + { + return true; + } + return false; +} + +bool CheckLocal(bool& bLocal) +{ + if (g_pElementizer->GetType() != type_colon) + { + bLocal = false; + return true; + } + else + { + int save_start = g_pCompilerData->source_start; + int length = 0; + if (!GetSymbol(&length)) + { + return false; + } + g_pCompilerData->source_start = save_start; + if (length == 0) + { + g_pCompilerData->error = true; + g_pCompilerData->error_msg = g_pErrorStrings[error_eals]; + return false; + } + if (length > symbol_limit) + { + g_pCompilerData->error = true; + g_pCompilerData->error_msg = g_pErrorStrings[error_sexc]; + return false; + } + + int temp = g_pCompilerData->asm_local; + temp += 0x01010101; //(last four characters range from 01h-20h) + + //append above four bytes to the symbol name + char* pSymbol = g_pElementizer->GetCurrentSymbol(); + pSymbol += strlen(pSymbol); + //*((int*)pSymbol) = temp; + pSymbol[0] = (char)(temp & 0xFF); + pSymbol[1] = (char)((temp >> 8) & 0xFF); + pSymbol[2] = (char)((temp >> 16) & 0xFF); + pSymbol[3] = (char)((temp >> 24) & 0xFF); + pSymbol += 4; + *pSymbol = 0; + + // re-get the symbol (point to the beginning of it) + pSymbol = g_pElementizer->GetCurrentSymbol(); + + // try to find the symbol + g_pElementizer->FindSymbol(pSymbol); + bLocal = true; + } + + return true; +} + +// returns true if it's able to get a valid float from pSource +// on success, value will be the float value +bool GetFloat(char* pSource, int& sourceOffset, int& value) +{ + // copy stuff to a temp buffer, stripping _'s and going until an invalid float char + // this also stops if we hit a second ., a second E, or get a sign without and E before it + // + char temp[128]; + int tempOffset = 0; + bool bGotDot = false; + bool bGotE = false; + bool bGotSign = false; + while(tempOffset < 127) + { + char currentChar = pSource[sourceOffset++]; + if (currentChar == '_') + { + continue; + } + if (currentChar >= '0' && currentChar <= '9') + { + temp[tempOffset++] = currentChar; + } + else if (bGotDot == false && currentChar == '.') + { + temp[tempOffset++] = currentChar; + bGotDot = true; + } + else if (bGotE == false && (currentChar == 'e' || currentChar == 'E')) + { + temp[tempOffset++] = currentChar; + bGotE = true; + } + else if (bGotE == true && bGotSign == false && (currentChar == '+' || currentChar == '-')) + { + temp[tempOffset++] = currentChar; + bGotSign = true; + } + else + { + break; + } + } + // terminate temp buffer + temp[tempOffset] = 0; + + // if temp is full bail (it's not possible for this to be a valid float) + if (tempOffset == 127) + { + return false; + } + + // use strtod to convert temp to a float + char* endPtr; + float floatValue = (float)strtod(temp, &endPtr); + + // if strtod failed then bail + if (endPtr == temp || errno == ERANGE) + { + return false; + } + + // then use pointer assignment trick to assign float into int without casting + value = *((int*)&floatValue); + + return true; +} + +bool GetSymbol(int* pLength) +{ + bool bEof = false; + + if (!g_pElementizer->GetNext(bEof)) + { + return false; + } + char* pSymbol = g_pElementizer->GetCurrentSymbol(); + if (!CheckWordChar(pSymbol[0])) // g_pCompilerData->source[g_pCompilerData->source_start] + { + *pLength = 0; + } + else + { + *pLength = (int)strlen(pSymbol); + } + + return true; +} + +bool GetObjSymbol(int type, char id) +{ + int length = 0; + if (!GetSymbol(&length)) + { + return false; + } + if (length > 0) + { + // append id to symbol + char* pSymbol = g_pElementizer->GetCurrentSymbol(); + pSymbol[length] = id + 1; + pSymbol[length+1] = 0; + + g_pElementizer->FindSymbol(pSymbol); + + if (type == type_objpub) + { + if (g_pElementizer->GetType() == type_objpub) + { + return true; + } + } + else + { + if (g_pElementizer->GetType() == type_objcon || g_pElementizer->GetType() == type_objcon_float) + { + // convert type_objcon_xx to type_con_xx + g_pElementizer->ObjConToCon(); + return true; + } + } + } + + g_pCompilerData->error = true; + if (type == type_objpub) + { + g_pCompilerData->error_msg = g_pErrorStrings[error_easn]; + } + else + { + g_pCompilerData->error_msg = g_pErrorStrings[error_eacn]; + } + + return false; +} + +bool GetCommaOrEnd(bool& bComma) +{ + bool bEof = false; + g_pElementizer->GetNext(bEof); + if (g_pElementizer->GetType() == type_comma) + { + bComma = true; + return true; + } + if (g_pElementizer->GetType() == type_end) + { + bComma = false; + return true; + } + + g_pCompilerData->error = true; + g_pCompilerData->error_msg = g_pErrorStrings[error_ecoeol]; + return false; +} + +bool GetCommaOrRight(bool& bComma) +{ + bool bEof = false; + g_pElementizer->GetNext(bEof); + if (g_pElementizer->GetType() == type_comma) + { + bComma = true; + return true; + } + if (g_pElementizer->GetType() == type_right) + { + bComma = false; + return true; + } + + g_pCompilerData->error = true; + g_pCompilerData->error_msg = g_pErrorStrings[error_ecor]; + return false; +} + +bool GetPipeOrEnd(bool& bPipe) +{ + bool bEof = false; + g_pElementizer->GetNext(bEof); + if (g_pElementizer->GetType() == type_binary && g_pElementizer->GetOpType() == op_or) + { + bPipe = true; + return true; + } + if (g_pElementizer->GetType() == type_end) + { + bPipe = false; + return true; + } + + g_pCompilerData->error = true; + g_pCompilerData->error_msg = g_pErrorStrings[error_epoeol]; + return false; +} + +// this puts the filename into g_pCompilerData->filename +bool GetFilename(int& filenameStart, int& filenameFinish) +{ + bool bEof = false; + int filenameOffset = 0; + + g_pElementizer->GetNext(bEof); + filenameStart = g_pCompilerData->source_start; + g_pElementizer->Backup(); + + for (;;) + { + g_pElementizer->GetNext(bEof); + if (g_pElementizer->GetType() != type_con) + { + g_pCompilerData->error = true; + g_pCompilerData->error_msg = g_pErrorStrings[error_ifufiq]; + return false; + } + char theChar = (char)(g_pElementizer->GetValue()); + + // check for illegal characters in filename + if (theChar > 127 || theChar < 32 || theChar == '\\' || theChar == '/' || + theChar == ':' || theChar == '*' || theChar == '?' || theChar == '\"' || + theChar == '<' || theChar == '>' || theChar == '|') + { + g_pCompilerData->error = true; + g_pCompilerData->error_msg = g_pErrorStrings[error_ifc]; + break; + } + + // add character + g_pCompilerData->filename[filenameOffset++] = theChar; + filenameFinish = g_pCompilerData->source_finish; + + // see if the filename is too long + if (filenameOffset > 253) + { + g_pCompilerData->error = true; + g_pCompilerData->error_msg = g_pErrorStrings[error_ftl]; + break; + } + + if (!g_pElementizer->CheckElement(type_comma)) + { + g_pCompilerData->filename[filenameOffset] = 0; // terminate filename + g_pCompilerData->source_start = filenameStart; + g_pCompilerData->source_finish = filenameFinish; + return true; + } + } + + return false; +} + +void EnterInfo() +{ + int index = g_pCompilerData->info_count; + if (index >= info_limit) + { + index--; + } + else + { + g_pCompilerData->info_count++; + } + + g_pCompilerData->info_start[index] = g_pCompilerData->inf_start; + g_pCompilerData->info_finish[index] = g_pCompilerData->inf_finish; + g_pCompilerData->info_type[index] = g_pCompilerData->inf_type; + g_pCompilerData->info_data0[index] = g_pCompilerData->inf_data0; + g_pCompilerData->info_data1[index] = g_pCompilerData->inf_data1; + g_pCompilerData->info_data2[index] = g_pCompilerData->inf_data2; + g_pCompilerData->info_data3[index] = g_pCompilerData->inf_data3; + g_pCompilerData->info_data4[index] = g_pCompilerData->inf_data4; +} + +bool EnterObj(unsigned char value) +{ + if (g_pCompilerData->obj_ptr < g_pCompilerData->obj_limit) + { + g_pCompilerData->obj[g_pCompilerData->obj_ptr++] = value; + } + else + { + g_pCompilerData->error = true; + g_pCompilerData->error_msg = g_pErrorStrings[error_oex]; + return false; + } + + return true; +} + +bool EnterObjLong(int value) +{ + if (g_pCompilerData->obj_ptr+4 < g_pCompilerData->obj_limit) + { + g_pCompilerData->obj[g_pCompilerData->obj_ptr++] = (unsigned char)value; + value >>= 8; + g_pCompilerData->obj[g_pCompilerData->obj_ptr++] = (unsigned char)value; + value >>= 8; + g_pCompilerData->obj[g_pCompilerData->obj_ptr++] = (unsigned char)value; + value >>= 8; + g_pCompilerData->obj[g_pCompilerData->obj_ptr++] = (unsigned char)value; + } + else + { + g_pCompilerData->error = true; + g_pCompilerData->error_msg = g_pErrorStrings[error_oex]; + return false; + } + + return true; +} + +bool IncrementAsmLocal() +{ + unsigned char* pAsmLocal = (unsigned char*)&(g_pCompilerData->asm_local); + (*pAsmLocal)++; + (*pAsmLocal)&=0x1F; + if (*pAsmLocal == 0) + { + (*(pAsmLocal+1))++; + (*(pAsmLocal+1))&=0x1F; + if ((*(pAsmLocal+1)) == 0) + { + (*(pAsmLocal+2))++; + (*(pAsmLocal+2))&=0x1F; + if ((*(pAsmLocal+2)) == 0) + { + (*(pAsmLocal+3))++; + (*(pAsmLocal+3))&=0x1F; + if ((*(pAsmLocal+3)) == 0) + { + g_pCompilerData->error = true; + g_pCompilerData->error_msg = g_pErrorStrings[error_loxdse]; + return false; + } + } + } + } + return true; +} + +bool AddFileName(int& fileCount, int& fileIndex, char* pFilenames, int* pNameStart, int* pNameFinish, int error) +{ + int filenameStart = 0; + int filenameFinish = 0; + if (GetFilename(filenameStart, filenameFinish)) + { + for (int i = 0; i < fileCount; i++) + { + if (strcmp(&pFilenames[i*256], g_pCompilerData->filename) == 0) + { + // filename already in list + fileIndex = i; + return true; + } + } + + // not in list, so add it if there is room + if (fileCount < file_limit) + { + pNameStart[fileCount] = filenameStart; + pNameFinish[fileCount] = filenameFinish; + strcpy(&pFilenames[fileCount*256], g_pCompilerData->filename); + fileIndex = fileCount; + fileCount++; + return true; + } + + g_pCompilerData->error = true; + g_pCompilerData->error_msg = g_pErrorStrings[error]; + } + return false; +} + +bool AddPubConListByte(char value) +{ + if (g_pCompilerData->pubcon_list_size < pubcon_list_limit) + { + g_pCompilerData->pubcon_list[g_pCompilerData->pubcon_list_size] = value; + g_pCompilerData->pubcon_list_size++; + } + else + { + g_pCompilerData->error = true; + g_pCompilerData->error_msg = g_pErrorStrings[error_pclo]; + return false; + } + + return true; +} + +bool AddSymbolToPubConList() +{ + for (unsigned int i = 0; i < strlen(g_pCompilerData->symbolBackup); i++) + { + if (!AddPubConListByte(g_pCompilerData->symbolBackup[i])) + { + return false; + } + } + return true; +} + +bool ConAssign(bool bFloat, int value) +{ + if (g_pCompilerData->assign_flag == 0) + { + // verify + g_pCompilerData->source_start = g_pCompilerData->inf_start; + g_pCompilerData->source_finish = g_pCompilerData->inf_finish; + + int type = bFloat ? type_con_float : type_con; + if (g_pCompilerData->assign_type != type || g_pCompilerData->assign_value != value) + { + g_pCompilerData->error = true; + g_pCompilerData->error_msg = g_pErrorStrings[error_siad]; + return false; + } + } + else + { + g_pCompilerData->inf_type = bFloat ? info_con_float : info_con; + g_pCompilerData->inf_data0 = value; + g_pCompilerData->inf_data1 = 0; + g_pCompilerData->inf_data2 = 0; + g_pCompilerData->inf_data3 = 0; + g_pCompilerData->inf_data4 = 0; + EnterInfo(); + + if (!AddSymbolToPubConList()) + { + return false; + } + if (!AddPubConListByte(bFloat ? 17 : 16)) + { + return false; + } + int temp = value; + for (int i = 0; i < 4; i++) + { + if (!AddPubConListByte(temp & 0xFF)) + { + return false; + } + temp >>= 8; + } + + g_pSymbolEngine->AddSymbol(g_pCompilerData->symbolBackup, bFloat ? type_con_float : type_con, value); +#ifdef RPE_DEBUG + float fValue = *((float*)(&value)); + printf("%s %d %f \n", g_pCompilerData->symbolBackup, value, fValue); +#endif + } + + return true; +} + +bool HandleConSymbol(int pass) +{ + // symbol + g_pCompilerData->inf_start = g_pCompilerData->source_start; + g_pCompilerData->inf_finish = g_pCompilerData->source_finish; + + // save a copy of the symbol + g_pElementizer->BackupSymbol(); + + bool bFloat = false; + + bool bEof = false; + g_pElementizer->GetNext(bEof); + if (g_pElementizer->GetType() == type_equal) + { + // equal + if (!GetTryValue(pass == 1 ? true : false, false)) + { + return false; + } + if (g_pCompilerData->intMode == 2) + { + bFloat = true; + } + if (g_pCompilerData->bUndefined == false) + { + if (!ConAssign(bFloat, GetResult())) + { + return false; + } + } + } + else if (g_pElementizer->GetType() == type_leftb) + { + // enumx + if (!GetTryValue(pass == 1 ? true : false, true)) + { + return false; + } + if (!g_pElementizer->GetElement(type_rightb)) + { + return false; + } + if (g_pCompilerData->bUndefined == false) + { + if (g_pCompilerData->enum_valid == 1) + { + int temp = g_pCompilerData->enum_value; + g_pCompilerData->enum_value = GetResult() + temp; + + if (!ConAssign(bFloat, temp)) + { + return false; + } + } + } + else + { + g_pCompilerData->enum_valid = 0; + } + } + else if ((g_pElementizer->GetType() == type_comma) || + (g_pElementizer->GetType() == type_end)) + { + // enuma + g_pElementizer->Backup(); + if (g_pCompilerData->enum_valid == 1) + { + int temp = g_pCompilerData->enum_value; + g_pCompilerData->enum_value = 1 + temp; + + if (!ConAssign(bFloat, temp)) + { + return false; + } + } + } + else + { + g_pCompilerData->error = true; + g_pCompilerData->error_msg = g_pErrorStrings[error_eelcoeol]; + return false; + } + + return true; +} + +#define WORD_LENGTH (8 * sizeof(value)) +int rol(unsigned int value, int places) +{ + return (value << places) | (value >> (WORD_LENGTH - places)); +} + +int ror(unsigned int value, int places) +{ + return (value >> places) | (value << (WORD_LENGTH - places)); +} +#undef WORD_LENGTH + +/////////////////////////////////////////////////////////////////////////////////////////// +// TERMS OF USE: MIT License // +/////////////////////////////////////////////////////////////////////////////////////////// +// Permission is hereby granted, free of charge, to any person obtaining a copy of this // +// software and associated documentation files (the "Software"), to deal in the Software // +// without restriction, including without limitation the rights to use, copy, modify, // +// merge, publish, distribute, sublicense, and/or sell copies of the Software, and to // +// permit persons to whom the Software is furnished to do so, subject to the following // +// conditions: // +// // +// The above copyright notice and this permission notice shall be included in all copies // +// or substantial portions of the Software. // +// // +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, // +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A // +// PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT // +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE // +// SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // +/////////////////////////////////////////////////////////////////////////////////////////// diff --git a/Tools/unix/OpenSpin/PropellerCompiler/Utilities.h b/Tools/unix/OpenSpin/PropellerCompiler/Utilities.h new file mode 100644 index 00000000..a977835d --- /dev/null +++ b/Tools/unix/OpenSpin/PropellerCompiler/Utilities.h @@ -0,0 +1,319 @@ +////////////////////////////////////////////////////////////// +// // +// Propeller Spin/PASM Compiler // +// (c)2012-2016 Parallax Inc. DBA Parallax Semiconductor. // +// Adapted from Chip Gracey's x86 asm code by Roy Eltham // +// See end of file for terms of use. // +// // +////////////////////////////////////////////////////////////// +// +// Utilities.h +// + +#ifndef _UTILITIES_H_ +#define _UTILITIES_H_ + +extern void SetPrint(char* pDestination, int limit); +extern bool PrintChr(char theChar); +extern bool PrintString(const char* theString); +extern bool PrintLong(int value); +extern bool PrintWord(short value); +extern bool PrintByte(char value); +extern bool PrintHex(char value); +extern bool PrintDecimal(int value); +extern bool PrintSymbol(const char* pSymbolName, unsigned char type, int value, int value_2); +extern bool PrintObj(); +extern bool DocPrint(char theChar); + +extern char Uppercase(char theChar); + +extern bool CheckWordChar(char theChar); +extern bool CheckHex(char theChar, char& digitValue); +extern bool CheckDigit(char theChar, char& digitValue, char numberBase); +extern bool CheckPlus(char theChar); +extern bool CheckLocal(bool& bLocal); + +extern bool GetFloat(char* pSource, int& sourceOffset, int& value); +extern bool GetSymbol(int* length); +extern bool GetObjSymbol(int type, char id); + +extern bool GetCommaOrEnd(bool& bComma); +extern bool GetCommaOrRight(bool& bComma); +extern bool GetPipeOrEnd(bool& bPipe); + +extern bool GetFilename(int& filenameStart, int& filenameFinish); + +extern void EnterInfo(); +extern bool EnterObj(unsigned char value); +extern bool EnterObjLong(int value); + +extern bool IncrementAsmLocal(); + +extern bool AddFileName(int& fileCount, int& fileIndex, char* pFilenames, int* pNameStart, int* pNameFinish, int error); +extern bool AddPubConListByte(char value); +extern bool AddSymbolToPubConList(); +extern bool ConAssign(bool bFloat, int value); +extern bool HandleConSymbol(int pass); + +extern int rol(unsigned int value, int places); +extern int ror(unsigned int value, int places); + +// these is in ExpressionResolver.cpp +extern bool GetTryValue(bool bMustResolve, bool bInteger, bool bOperandMode = false); +extern int GetResult(); + +// +// Simple Hash Table (used by the Symbol Engine) +// + +class Hashable +{ +public: + virtual ~Hashable() + { + } +}; + +struct HashNode +{ + int key; + Hashable* pValue; + HashNode* pNext; + HashNode* pNextList; + + ~HashNode() + { + if (pNext) + { + delete pNext; + } + delete pValue; + } +}; + +class HashTable +{ +private: + HashNode** m_pTable; + int m_tableSize; + HashNode* m_pListHead; + HashNode* m_pListTail; + +public: + HashTable(int tableSize) + : m_tableSize(tableSize) + , m_pListHead(0) + , m_pListTail(0) + { + m_pTable = new HashNode*[tableSize]; + for(int i = 0; i < m_tableSize; i++) + { + m_pTable[i] = 0; + } + } + ~HashTable() + { + for(int i = 0; i < m_tableSize; i++) + { + if (m_pTable[i] != 0) + { + delete m_pTable[i]; + m_pTable[i] = 0; + } + } + delete [] m_pTable; + m_pTable = 0; + m_pListHead = m_pListTail = 0; + } + + // insert a new node in the table with the given key and value + void Insert(int key, Hashable* pValue) + { + unsigned int bucket = (unsigned int)key % m_tableSize; + + HashNode* pNode = new HashNode; + pNode->key = key; + pNode->pValue = pValue; + pNode->pNext = m_pTable[bucket]; + pNode->pNextList = 0; + + m_pTable[bucket] = pNode; + + if ( m_pListTail ) + { + m_pListTail->pNextList = pNode; + m_pListTail = pNode; + } + else + { + m_pListHead = m_pListTail = pNode; + } + } + + HashNode* First() + { + return m_pListHead; + } + + HashNode* Last() + { + return m_pListTail; + } + + HashNode* Next(HashNode* pCurrent) + { + return (pCurrent != 0) ? pCurrent->pNextList : 0; + } + + // find the first node with a matching key + // returns 0 if not found + HashNode* FindFirst(int key) + { + unsigned int bucket = (unsigned int)key % m_tableSize; + if (m_pTable[bucket] != 0) + { + HashNode* pNode = m_pTable[bucket]; + while (pNode != 0) + { + if (pNode->key == key) + { + return pNode; + } + pNode = pNode->pNext; + } + } + + return 0; + } + + // find the next node with a matching key + // returns 0 if not found + HashNode* FindNext(HashNode* pCurrent) + { + if (pCurrent->pNext != 0 && pCurrent->pNext->key == pCurrent->key) + { + return pCurrent->pNext; + } + + return 0; + } + + // calculate a hash value of a zero terminated string (uppercased) + // uses Jenkins One-at-a-time hash function + int GetStringHashUppercase(const char* s) + { + int hash = 0; + while (*s != 0) + { + int c = *s; + c = c - (32 * (c >= 'a' && c <= 'z')); + hash += c; + hash += (hash << 10); + hash ^= (hash >> 6); + s++; + } + hash += (hash << 3); + hash ^= (hash >> 11); + hash += (hash << 15); + return hash; + } + + // calculate a hash value of a zero terminated string + // uses Jenkins One-at-a-time hash function + int GetStringHash(const char* s) + { + int hash = 0; + while (*s != 0) + { + hash += *s; + hash += (hash << 10); + hash ^= (hash >> 6); + s++; + } + hash += (hash << 3); + hash ^= (hash >> 11); + hash += (hash << 15); + return hash; + } +}; + + +class HeirarchyNode +{ +public: + HeirarchyNode* m_pNextSibling; + HeirarchyNode* m_pParent; + + HeirarchyNode() + : m_pNextSibling(0) + , m_pParent(0) + { + } + + ~HeirarchyNode() + { + if (m_pNextSibling) + { + delete m_pNextSibling; + } + } +}; + +class Heirarchy +{ +public: + HeirarchyNode* m_pRoot; + + Heirarchy() + : m_pRoot(0) + { + } + ~Heirarchy() + { + delete m_pRoot; + } + + void AddNode(HeirarchyNode* pValue, HeirarchyNode* pParent) + { + if (m_pRoot == 0) + { + m_pRoot = pValue; + } + else + { + if (pParent) + { + pValue->m_pNextSibling = pParent->m_pNextSibling; + pParent->m_pNextSibling = pValue; + } + else + { + pValue->m_pNextSibling = m_pRoot->m_pNextSibling; + m_pRoot->m_pNextSibling = pValue; + } + } + } + }; + +#endif // _UTILITIES_H_ + +/////////////////////////////////////////////////////////////////////////////////////////// +// TERMS OF USE: MIT License // +/////////////////////////////////////////////////////////////////////////////////////////// +// Permission is hereby granted, free of charge, to any person obtaining a copy of this // +// software and associated documentation files (the "Software"), to deal in the Software // +// without restriction, including without limitation the rights to use, copy, modify, // +// merge, publish, distribute, sublicense, and/or sell copies of the Software, and to // +// permit persons to whom the Software is furnished to do so, subject to the following // +// conditions: // +// // +// The above copyright notice and this permission notice shall be included in all copies // +// or substantial portions of the Software. // +// // +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, // +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A // +// PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT // +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE // +// SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // +/////////////////////////////////////////////////////////////////////////////////////////// diff --git a/Tools/unix/OpenSpin/PropellerCompiler/flexbuf.cpp b/Tools/unix/OpenSpin/PropellerCompiler/flexbuf.cpp new file mode 100644 index 00000000..08e77d97 --- /dev/null +++ b/Tools/unix/OpenSpin/PropellerCompiler/flexbuf.cpp @@ -0,0 +1,128 @@ +/* + * Functions for manipulating variable sized memory buffers. + * These buffers can grow and shrink as the program progresses. + * + * Written by Eric R. Smith + * Copyright (c) 2012 Total Spectrum Software Inc. + * MIT Licensed; see terms at the end of this file. + */ + +#include "flexbuf.h" +#include +#include + +#define DEFAULT_GROWSIZE BUFSIZ + +void flexbuf_init(struct flexbuf *fb, size_t growsize) +{ + fb->data = NULL; + fb->len = 0; + fb->space = 0; + fb->growsize = growsize ? growsize : DEFAULT_GROWSIZE; +} + +size_t flexbuf_curlen(struct flexbuf *fb) +{ + return fb->len; +} + +/* add a single character to a buffer */ +char *flexbuf_addchar(struct flexbuf *fb, int c) +{ + size_t newlen = fb->len + 1; + + if (newlen > fb->space) { + char *newdata; + newdata = (char *)realloc(fb->data, fb->space + fb->growsize); + if (!newdata) return newdata; + fb->space += fb->growsize; + fb->data = newdata; + } + fb->data[fb->len] = (char)c; + fb->len = newlen; + return fb->data; +} + +/* add N characters to a buffer */ +char *flexbuf_addmem(struct flexbuf *fb, const char *buf, size_t N) +{ + size_t newlen = fb->len + N; + + if (newlen > fb->space) { + char *newdata; + size_t newspace; + newspace = fb->space + fb->growsize; + if (newspace < newlen) { + newspace = newlen + fb->growsize; + } + newdata = (char *)realloc(fb->data, newspace); + if (!newdata) return newdata; + fb->space = newspace; + fb->data = newdata; + } + memcpy(fb->data + fb->len, buf, N); + fb->len = newlen; + return fb->data; +} + +/* add a string to a buffer */ +char *flexbuf_addstr(struct flexbuf *fb, const char *str) +{ + return flexbuf_addmem(fb, str, strlen(str)); +} + +/* retrieve the pointer for a flexbuf */ +/* "peek" gets it but keeps it reserved; + * "get" gets it and releases it from the flexbuf + */ +char *flexbuf_peek(struct flexbuf *fb) +{ + char *r = fb->data; + return r; +} + +char *flexbuf_get(struct flexbuf *fb) +{ + char *r = fb->data; + flexbuf_init(fb, fb->growsize); + return r; +} + +/* reset the buffer to empty (but do not free space) */ +void flexbuf_clear(struct flexbuf *fb) +{ + fb->len = 0; +} + +/* free the memory associated with a buffer */ +void flexbuf_delete(struct flexbuf *fb) +{ + if (fb->data) + free(fb->data); + flexbuf_init(fb, 1); +} + +/* + * +-------------------------------------------------------------------- + * ¦ TERMS OF USE: MIT License + * +-------------------------------------------------------------------- + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files + * (the "Software"), to deal in the Software without restriction, + * including without limitation the rights to use, copy, modify, merge, + * publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * +-------------------------------------------------------------------- + */ diff --git a/Tools/unix/OpenSpin/PropellerCompiler/flexbuf.h b/Tools/unix/OpenSpin/PropellerCompiler/flexbuf.h new file mode 100644 index 00000000..a3007870 --- /dev/null +++ b/Tools/unix/OpenSpin/PropellerCompiler/flexbuf.h @@ -0,0 +1,49 @@ +/* + * Functions for manipulating variable sized memory buffers. + * These buffers can grow and shrink as the program progresses. + * + * Written by Eric R. Smith + * Copyright (c) 2012 Total Spectrum Software Inc. + * See terms of use in flexbuf.c + */ + +#ifndef FLEXBUF_H_ +#define FLEXBUF_H_ +#include + +struct flexbuf { + char * data; /* current data */ + size_t len; /* current length of valid data */ + size_t space; /* total space available (must be >= len) */ + size_t growsize; /* how much we should grow */ +}; + +/* initialize a buffer */ +void flexbuf_init(struct flexbuf *fb, size_t growsize); + +/* add a single character to a buffer */ +/* returns a pointer to the start of the buffer, or NULL on failure */ +char *flexbuf_addchar(struct flexbuf *fb, int c); + +/* add N characters to a buffer */ +char *flexbuf_addmem(struct flexbuf *fb, const char *buf, size_t N); + +/* add a string to a buffer */ +char *flexbuf_addstr(struct flexbuf *fb, const char *str); + +/* reset the buffer to empty */ +void flexbuf_clear(struct flexbuf *fb); + +/* harvest the flexible buffer pointer for use elsewhere */ +char *flexbuf_get(struct flexbuf *fb); + +/* like get, but does not release the buffer */ +char *flexbuf_peek(struct flexbuf *fb); + +/* free the space associated with a buffer */ +void flexbuf_delete(struct flexbuf *fb); + +/* find current length of a buffer */ +size_t flexbuf_curlen(struct flexbuf *fb); + +#endif diff --git a/Tools/unix/OpenSpin/PropellerCompiler/objectheap.cpp b/Tools/unix/OpenSpin/PropellerCompiler/objectheap.cpp new file mode 100644 index 00000000..82f92ae5 --- /dev/null +++ b/Tools/unix/OpenSpin/PropellerCompiler/objectheap.cpp @@ -0,0 +1,118 @@ +/////////////////////////////////////////////////////////////// +// // +// Propeller Spin/PASM Compiler Command Line Tool 'OpenSpin' // +// (c)2012-2016 Parallax Inc. DBA Parallax Semiconductor. // +// Adapted from Jeff Martin's Delphi code by Roy Eltham // +// See end of file for terms of use. // +// // +/////////////////////////////////////////////////////////////// +// +// objectheap.cpp +// +#include + +#include "PropellerCompiler.h" +#include "objectheap.h" + +// Object heap (compile-time objects) +struct ObjHeap +{ + char* ObjFilename; // Full filename of object + char* Obj; // Object binary + int ObjSize; // Size of object +}; + +ObjHeap s_ObjHeap[MaxObjInHeap]; +int s_nObjHeapIndex = 0; + +bool AddObjectToHeap(char* name, CompilerData* pCompilerData) +{ + // see if it already exists in the heap + if (IndexOfObjectInHeap(name) != -1) + { + return true; + } + + // add the object to the heap + if (s_nObjHeapIndex < MaxObjInHeap) + { + int nNameBufferLength = (int)strlen(name)+1; + s_ObjHeap[s_nObjHeapIndex].ObjFilename = new char[nNameBufferLength]; + strcpy(s_ObjHeap[s_nObjHeapIndex].ObjFilename, name); + s_ObjHeap[s_nObjHeapIndex].ObjSize = pCompilerData->obj_ptr; + s_ObjHeap[s_nObjHeapIndex].Obj = new char[pCompilerData->obj_ptr]; + memcpy(s_ObjHeap[s_nObjHeapIndex].Obj, &(pCompilerData->obj[0]), pCompilerData->obj_ptr); + s_nObjHeapIndex++; + return true; + } + + return false; +} + +// Returns index of object of Name in Object Heap. Returns -1 if not found. +int IndexOfObjectInHeap(char* name) +{ + for (int i = s_nObjHeapIndex-1; i >= 0; i--) + { + if (_stricmp(s_ObjHeap[i].ObjFilename, name) == 0) + { + return i; + } + } + return -1; +} + +void CleanObjectHeap() +{ + for (int i = 0; i < s_nObjHeapIndex; i++) + { + delete [] s_ObjHeap[i].ObjFilename; + s_ObjHeap[i].ObjFilename = NULL; + delete [] s_ObjHeap[i].Obj; + s_ObjHeap[i].Obj = NULL; + s_ObjHeap[i].ObjSize = 0; + } + s_nObjHeapIndex = 0; +} + +bool CopyObjectsFromHeap(CompilerData* pCompilerData, char* filenames) +{ + // load sub-objects from heap into obj_data for Compile2() + int p = 0; + for (int i = 0; i < pCompilerData->obj_files; i++) + { + int nObjIdx = IndexOfObjectInHeap(&filenames[i<<8]); + if (p + s_ObjHeap[nObjIdx].ObjSize > data_limit) + { + return false; + } + memcpy(&pCompilerData->obj_data[p], s_ObjHeap[nObjIdx].Obj, s_ObjHeap[nObjIdx].ObjSize); + pCompilerData->obj_offsets[i] = p; + pCompilerData->obj_lengths[i] = s_ObjHeap[nObjIdx].ObjSize; + p += s_ObjHeap[nObjIdx].ObjSize; + } + + return true; +} + + +/////////////////////////////////////////////////////////////////////////////////////////// +// TERMS OF USE: MIT License // +/////////////////////////////////////////////////////////////////////////////////////////// +// Permission is hereby granted, free of charge, to any person obtaining a copy of this // +// software and associated documentation files (the "Software"), to deal in the Software // +// without restriction, including without limitation the rights to use, copy, modify, // +// merge, publish, distribute, sublicense, and/or sell copies of the Software, and to // +// permit persons to whom the Software is furnished to do so, subject to the following // +// conditions: // +// // +// The above copyright notice and this permission notice shall be included in all copies // +// or substantial portions of the Software. // +// // +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, // +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A // +// PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT // +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE // +// SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // +/////////////////////////////////////////////////////////////////////////////////////////// diff --git a/Tools/unix/OpenSpin/PropellerCompiler/objectheap.h b/Tools/unix/OpenSpin/PropellerCompiler/objectheap.h new file mode 100644 index 00000000..c5a9734b --- /dev/null +++ b/Tools/unix/OpenSpin/PropellerCompiler/objectheap.h @@ -0,0 +1,44 @@ +/////////////////////////////////////////////////////////////// +// // +// Propeller Spin/PASM Compiler Command Line Tool 'OpenSpin' // +// (c)2012-2016 Parallax Inc. DBA Parallax Semiconductor. // +// Adapted from Jeff Martin's Delphi code by Roy Eltham // +// See end of file for terms of use. // +// // +/////////////////////////////////////////////////////////////// +// +// objectheap.h +// + +#ifndef _OBJECTHEAP_H_ +#define _OBJECTHEAP_H_ + +#define MaxObjInHeap 256 + +bool AddObjectToHeap(char* name, CompilerData* pCompilerData); +int IndexOfObjectInHeap(char* name); +void CleanObjectHeap(); +bool CopyObjectsFromHeap(CompilerData* pCompilerData, char* filenames); + +#endif // _OBJECTHEAP_H_ + +/////////////////////////////////////////////////////////////////////////////////////////// +// TERMS OF USE: MIT License // +/////////////////////////////////////////////////////////////////////////////////////////// +// Permission is hereby granted, free of charge, to any person obtaining a copy of this // +// software and associated documentation files (the "Software"), to deal in the Software // +// without restriction, including without limitation the rights to use, copy, modify, // +// merge, publish, distribute, sublicense, and/or sell copies of the Software, and to // +// permit persons to whom the Software is furnished to do so, subject to the following // +// conditions: // +// // +// The above copyright notice and this permission notice shall be included in all copies // +// or substantial portions of the Software. // +// // +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, // +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A // +// PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT // +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE // +// SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // +/////////////////////////////////////////////////////////////////////////////////////////// diff --git a/Tools/unix/OpenSpin/PropellerCompiler/preprocess.cpp b/Tools/unix/OpenSpin/PropellerCompiler/preprocess.cpp new file mode 100644 index 00000000..2972c542 --- /dev/null +++ b/Tools/unix/OpenSpin/PropellerCompiler/preprocess.cpp @@ -0,0 +1,1081 @@ +/* + * Generic and very simple preprocessor + * Copyright (c) 2012 Total Spectrum Software Inc. + * MIT Licensed, see terms of use at end of file + * + * Reads UTF-16LE or UTF-8 encoded files, and returns a + * string containing UTF-8 characters. + * The following directives are supported: + * #define FOO - simple macros with no arguments + * #undef + * #ifdef FOO / #ifndef FOO + * #else / #elseifdef FOO / #elseifndef FOO + * #endif + * #error message + * #warn message + * #include "file" + * + * Here's an example of reading a file foo.txt in and preprocessing + * it in an environment where "VALUE1" is defined to "VALUE" and + * "VALUE2" is defined to "0": + * + * struct preprocess pp; + * char *parser_str; + * + * pp_init(&pp, false); + * pp_define(&pp, "VALUE1", "VALUE"); + * pp_define(&pp, "VALUE2", "0"); + * pp_push_file(&pp, "foo.txt"); + * pp_run(&pp); + * // any additional files to read can be pushed and run here + * parser_str = pp_finish(&pp); + */ + +#include +#include +#include +#include +#include "flexbuf.h" +#include "preprocess.h" + +#ifdef _MSC_VER +#define strdup _strdup +#endif + +static PreprocessLoadFileFunc s_pLoadFileFunc = 0; +static PreprocessFreeFileBufferFunc s_pFreeFileBufferFunc = 0; + +void pp_setFileFunctions(PreprocessLoadFileFunc pLoadFileFunc, PreprocessFreeFileBufferFunc pFreeFileBufferFunc) +{ + s_pLoadFileFunc = pLoadFileFunc; + s_pFreeFileBufferFunc = pFreeFileBufferFunc; +} + +memoryfile* mopen(const char* filename) +{ + memoryfile* f; + f = (struct memoryfile *)calloc(1, sizeof(*f)); + if (!f) + { + return 0; + } + f->readoffset = 0; + f->buffer = s_pLoadFileFunc(filename, &f->length, &f->filepath); + + return f; +} + +int mgetc(memoryfile* f) +{ + if (f->readoffset < f->length) + { + return (unsigned char)(f->buffer[f->readoffset++]); + } + return EOF; +} + +int mungetc(int c, memoryfile* f) +{ + f->readoffset--; + return c; +} + +void mclose(memoryfile* f) +{ + s_pFreeFileBufferFunc(f->buffer); + free(f); +} + +/* + * function to read a single LATIN-1 character + * from a file + * returns number of bytes placed in buffer, or -1 on EOF + */ +static int read_latin1(memoryfile *f, char buf[4]) +{ + int c = mgetc(f); + if (c == EOF) + { + return -1; + } + if (c <= 127) + { + buf[0] = (char)c; + return 1; + } + buf[0] = 0xC0 + ((c>>6) & 0x1f); + buf[1] = 0x80 + ( c & 0x3f ); + return 2; +} + +/* + * function to read a single UTF-8 character + * from a file + * returns number of bytes placed in buffer, or -1 on EOF + */ +static int read_single(memoryfile *f, char buf[4]) +{ + int c = mgetc(f); + if (c == EOF) + { + return -1; + } + buf[0] = (char)c; + return 1; +} + +/* + * function to read a single UTF-16 character + * from a file + * returns number of bytes placed in buffer, or -1 on EOF + */ +static int read_utf16(memoryfile *f, char buf[4]) +{ + int c, d; + int r; + c = mgetc(f); + if (c < 0) + { + return -1; + } + d = mgetc(f); + if (d < 0) + { + return -1; + } + + c = c + (d<<8); + /* here we need to translate UTF-16 to UTF-8 */ + /* FIXME: this code is not done properly; it does + not handle surrogate pairs (0xD800 - 0xDFFF) + */ + if (c < 128) + { + buf[0] = (char)c; + r = 1; + } + else if (c < 0x800) + { + buf[0] = 0xC0 + ((c>>6) & 0x1F); + buf[1] = 0x80 + ( c & 0x3F ); + r = 2; + } + else if (c < 0x10000) + { + buf[0] = 0xE0 + ((c>>12) & 0x0F); + buf[1] = 0x80 + ((c>>6) & 0x3F); + buf[2] = 0x80 + (c & 0x3F); + r = 3; + } + else + { + buf[0] = 0xF0 + ((c>>18) & 0x07); + buf[1] = 0x80 + ((c>>12) & 0x3F); + buf[2] = 0x80 + ((c>>6) & 0x3F); + buf[3] = 0x80 + (c & 0x3F); + r = 4; + } + return r; +} + +/* + * read a line + * returns number of bytes read, or 0 on EOF + */ +int pp_nextline(struct preprocess *pp) +{ + int r; + int count = 0; + memoryfile *f; + char buf[4]; + struct filestate *A; + + A = pp->fil; + if (!A) + { + return 0; + } + f = A->f; + A->lineno++; + + flexbuf_clear(&pp->line); + if (A->readfunc == NULL) + { + int c0, c1, c2; + c0 = mgetc(f); + if (c0 < 0) + { + return 0; + } + c1 = mgetc(f); + c2 = mgetc(f); + if ((c0 == 0xff && c1 == 0xfe) || c1 == 0) + { + A->readfunc = read_utf16; + mungetc(c2, f); + } + else if (c0 == 239 && c1 == 187 && c2 == 191) + { + A->readfunc = read_single; + } + else + { + A->readfunc = read_latin1; + mungetc(c2, f); + mungetc(c1, f); + } + /* add UTF-8 encoded BOM */ + flexbuf_addchar(&pp->line, 239); + flexbuf_addchar(&pp->line, 187); + flexbuf_addchar(&pp->line, 191); + if (A->readfunc == read_latin1) + { + flexbuf_addchar(&pp->line, c0); + } + if (c0 == '\n') + { + flexbuf_addchar(&pp->line, 0); + return 1; + } + } + for(;;) + { + r = (*A->readfunc)(f, buf); + if (r <= 0) break; + count += r; + flexbuf_addmem(&pp->line, buf, r); + if (r == 1 && buf[0] == '\n') break; + } + flexbuf_addchar(&pp->line, '\0'); + return count; +} + +/* + * default error handling functions + */ +static void default_messagefunc(const char *level, const char *filename, int line, const char *msg) +{ + fprintf(stderr, "%s:%d: %s: ", filename, line, level); + fprintf(stderr, "%s", msg); + fprintf(stderr, "\n"); +} + +static void domessage(struct preprocess *pp, const char *level, const char *msg, ...) +{ + va_list args; + char tmpmsg[BUFSIZ]; + struct filestate *fil; + + va_start(args, msg); + vsnprintf(tmpmsg, sizeof(tmpmsg), msg, args); + va_end(args); + + fil = pp->fil; + if (fil) + { + (*pp->messagefunc)(level, pp->fil->name, pp->fil->lineno, tmpmsg); + } + else + { + (*pp->messagefunc)(level, "", 0, tmpmsg); + } +} + +/* + * initialize preprocessor + */ +void pp_init(struct preprocess *pp, bool alternate) +{ + memset(pp, 0, sizeof(*pp)); + flexbuf_init(&pp->line, 128); + flexbuf_init(&pp->whole, 102400); + + pp->messagefunc = default_messagefunc; + pp->alternate = alternate; +} + +/* + * push a file into the preprocessor + * files will be processed in LIFO order, + * so the one on top of the stack is the + * "current" one; this makes #include implementation + * easier + */ +void pp_push_file_struct(struct preprocess *pp, memoryfile *f, const char *filename) +{ + struct filestate *A; + + A = (struct filestate *)calloc(1, sizeof(*A)); + if (!A) + { + domessage(pp, "error", "Out of memory!\n"); + return; + } + A->lineno = 0; + A->f = f; + A->next = pp->fil; + A->name = filename; + pp->fil = A; +} + +void pp_push_file(struct preprocess *pp, const char *name) +{ + memoryfile *f; + + f = mopen(name); + if (!f) + { + domessage(pp, "error", "Unable to open file %s", name); + return; + } + pp_push_file_struct(pp, f, name); + pp->fil->flags |= FILE_FLAGS_CLOSEFILE; +} + +/* + * pop the current file state off the stack + * closes the file as a side effect + */ +void pp_pop_file(struct preprocess *pp) +{ + struct filestate *A; + struct ifstate *I, *PI; + + PI = NULL; + I = pp->ifs; + while (I) + { + if (strcmp(pp->fil->name, I->name) == 0) + { + domessage(pp, "error", "Unterminated #if starting at line %d", I->linenum); + if (PI == NULL) + { + pp->ifs = I->next; + free(I); + I = pp->ifs; + } + else + { + PI->next = I->next; + free(I); + I = PI->next; + } + } + else + { + PI = I; + I = I->next; + } + } + A = pp->fil; + if (A) + { + pp->fil = A->next; + if (A->flags & FILE_FLAGS_CLOSEFILE) + { + mclose(A->f); + } + free(A); + } +} + +/* + * add a definition + * "flags" indicates things like whether we must free the memory + * associated with name and def + */ +static void pp_define_internal(struct preprocess *pp, const char *name, const char *def, int flags) +{ + struct predef *the; + + the = (struct predef *)calloc(sizeof(*the), 1); + the->name = name; + the->def = def; + the->flags = flags; + the->next = pp->defs; + pp->defs = the; +} + +/* + * the user visible "pp_define"; used mainly for constant strings and + * such, so we do not free those + */ +void pp_define(struct preprocess *pp, const char *name, const char *str) +{ + pp_define_internal(pp, name, str, 0); +} + +/* + * retrieive a definition + * returns NULL if no definition exists (or if there was an + * explicit #undef) + */ +const char* pp_getdef(struct preprocess *pp, const char *name) +{ + struct predef *X; + const char *def = NULL; + X = pp->defs; + while (X) + { + if (!strcmp(X->name, name)) + { + def = X->def; + break; + } + X = X->next; + } + return def; +} + +/* structure describing current parse state of a string */ +typedef struct parse_state +{ + char *str; /* pointer to start of string */ + char *save; /* pointer to where last parse ended */ + int c; /* saved character */ +} ParseState; + +static void parse_init(ParseState *P, char *s) +{ + P->str = s; + P->save = NULL; + P->c = 0; +} + +#define PARSE_ISSPACE 1 +#define PARSE_IDCHAR 2 +#define PARSE_OTHER 3 + +static int +classify_char(int c) +{ + if (isspace(c)) + { + return PARSE_ISSPACE; + } + if (isalnum(c) || (c == '_')) + { + return PARSE_IDCHAR; + } + return PARSE_OTHER; +} + +/* + * fetch the next word + * a word is a sequence of identifier characters, spaces, or + * other characters + */ +static char *parse_getword(ParseState *P) +{ + char *word, *ptr; + int state; + + if (P->save) + { + *P->save = (char)(P->c); + ptr = P->save; + } + else + { + ptr = P->str; + } + word = ptr; + if (!*ptr) return ptr; + if (*ptr == '\"') + { + ptr++; + while (*ptr && (*ptr != '\"')) + { + ptr++; + } + if (*ptr == '\"') + { + ptr++; + } + P->save = ptr; + P->c = *ptr; + *ptr = 0; + return word; + } + state = classify_char((unsigned char)*ptr); + ptr++; + if (state != PARSE_OTHER) + { + while (*ptr && classify_char((unsigned char)*ptr) == state) + { + ptr++; + } + } + + P->save = ptr; + P->c = *ptr; + *ptr = 0; + return word; +} + +static char *parse_restofline(ParseState *P) +{ + char *ptr; + char *ret; + + if (P->save) + { + *P->save = (char)(P->c); + ptr = P->save; + } + else + { + ptr = P->str; + } + ret = ptr; + while (*ptr && *ptr != '\n') + { + ptr++; + } + if (*ptr) + { + P->c = *ptr; + *ptr = 0; + P->save = ptr; + } + else + { + P->save = NULL; + } + P->str = ret; + return P->str; +} + +static void parse_skipspaces(ParseState *P) +{ + char *ptr; + if (P->save) + { + *P->save = (char)(P->c); + ptr = P->save; + } + else + { + ptr = P->str; + } + while (*ptr && isspace(*ptr)) + { + ptr++; + } + P->str = ptr; + P->save = NULL; +} + +static char *parse_getwordafterspaces(ParseState *P) +{ + parse_skipspaces(P); + return parse_getword(P); +} + +static char *parse_getquotedstring(ParseState *P) +{ + char *ptr, *start; + parse_skipspaces(P); + ptr = P->str; + if (*ptr != '\"') + { + return NULL; + } + ptr++; + start = ptr; + while (*ptr && *ptr != '\"') + { + ptr++; + } + if (!*ptr) + { + return NULL; + } + P->save = ptr; + P->c = *ptr; + *ptr = 0; + return start; +} + + +/* + * expand macros in a buffer + * "src" is the source data + * "dst" is a destination flexbuf + */ +static int expand_macros(struct preprocess *pp, struct flexbuf *dst, char *src) +{ + ParseState P; + char *word; + const char *def; + int len; + + if (!pp_active(pp)) + { + return 0; + } + + parse_init(&P, src); + for(;;) + { + word = parse_getword(&P); + if (!*word) + { + break; + } + if (pp->incomment) + { + if (strstr(word, pp->endcomment)) + { + --pp->incomment; + } + else + { + if (strstr(word, pp->startcomment)) + { + pp->incomment++; + } + } + def = word; + } + else if (isalpha((unsigned char)*word)) + { + def = pp_getdef(pp, word); + if (!def) + { + def = word; + } + else if (pp->alternate && (strlen(def) == 0)) + { + def = word; + } + } + else + { + if (pp->startcomment && strstr(word, pp->startcomment)) + { + pp->incomment++; + } + def = word; + } + flexbuf_addstr(dst, def); + } + len = (int)flexbuf_curlen(dst); + flexbuf_addchar(dst, 0); + return len; +} + +static void handle_ifdef(struct preprocess *pp, ParseState *P, int invert) +{ + char *word; + const char *def; + struct ifstate *I; + + I = (struct ifstate *)calloc(1, sizeof(*I)); + if (!I) + { + domessage(pp, "error", "Out of memory\n"); + return; + } + I->next = pp->ifs; + if (pp->fil) + { + I->name = strdup(pp->fil->name); + I->linenum = pp->fil->lineno; + } + + if (!pp_active(pp)) + { + I->skip = 1; + I->skiprest = 1; /* skip all branches, even else */ + pp->ifs = I; + return; + } + else + { + I->skip = 0; + I->skiprest = 0; + pp->ifs = I; + } + + word = parse_getwordafterspaces(P); + def = pp_getdef(pp, word); + if (invert ^ (def != NULL)) + { + I->skip = 0; + I->skiprest = 1; + } + else + { + I->skip = 1; + } +} + +static void handle_else(struct preprocess *pp, ParseState *P) +{ +#ifdef _MSC_VER + (P); // stop warning +#endif + + struct ifstate *I = pp->ifs; + + if (!I) + { + domessage(pp, "error", "#else without matching #if"); + return; + } + if (I->sawelse) + { + domessage(pp, "error", "multiple #else statements in #if"); + return; + } + I->sawelse = 1; + if (I->skiprest) + { + /* some branch was already handled */ + I->skip = 1; + } + else + { + I->skip = 0; + } +} + +static void handle_elseifdef(struct preprocess *pp, ParseState *P, int invert) +{ + struct ifstate *I = pp->ifs; + char *word; + const char *def; + + if (!I) + { + domessage(pp, "error", "#else without matching #if"); + return; + } + + if (I->skiprest) + { + /* some branch was already handled */ + I->skip = 1; + return; + } + word = parse_getwordafterspaces(P); + def = pp_getdef(pp, word); + if (invert ^ (def != NULL)) + { + I->skip = 0; + I->skiprest = 1; + } + else + { + I->skip = 1; + } +} + +static void handle_endif(struct preprocess *pp, ParseState *P) +{ +#ifdef _MSC_VER + (P); // stop warning +#endif + + struct ifstate *I = pp->ifs; + + if (!I) + { + domessage(pp, "error", "#endif without matching #if"); + return; + } + pp->ifs = I->next; + free(I); +} + +static void handle_message(struct preprocess *pp, ParseState *P, char *type) +{ + char *msg; + if (!pp_active(pp)) + { + return; + } + msg = parse_restofline(P); + domessage(pp, type, "#%s: %s", type, msg); +} + +static void handle_define(struct preprocess *pp, ParseState *P, int isDef) +{ + char *def; + char *name; + const char *oldvalue; + struct flexbuf newdef; + + if (!pp_active(pp)) + { + return; + } + name = parse_getwordafterspaces(P); + if (classify_char(name[0]) != PARSE_IDCHAR) + { + domessage(pp, "error", "%s is not a valid identifier for define", name); + return; + } + oldvalue = pp_getdef(pp, name); + if (oldvalue && isDef) + { + domessage(pp, "warning", "redefining `%s'", name); + } + name = strdup(name); + + if (isDef) + { + parse_skipspaces(P); + def = parse_restofline(P); + flexbuf_init(&newdef, 80); + expand_macros(pp, &newdef, def); + def = flexbuf_get(&newdef); + } + else + { + def = NULL; + } + pp_define_internal(pp, name, def, PREDEF_FLAG_FREEDEFS); +} + +static void handle_include(struct preprocess *pp, ParseState *P) +{ + char *name; + if (!pp_active(pp)) + { + return; + } + name = parse_getquotedstring(P); + if (!name) + { + domessage(pp, "error", "no string found for include"); + return; + } + pp_push_file(pp, strdup(name)); +} + +/* + * expand a line and process any directives + */ +static int do_line(struct preprocess *pp) +{ + char *data = flexbuf_get(&pp->line); + char *func; + int r; + + // skip over utf-8 BOM character + int dataOffset = 0; + if (data[0] == -17 && data[1] == -69 && data[2] == -65) + { + dataOffset = 3; + } + + if (data[dataOffset] != '#' || pp->incomment) + { + r = expand_macros(pp, &pp->line, data); + } + else + { + ParseState P; + parse_init(&P, data+1+dataOffset); + parse_skipspaces(&P); + func = parse_getword(&P); + r = 0; + if (!strcmp(func, "ifdef")) + { + handle_ifdef(pp, &P, 0); + } + else if (!strcmp(func, "ifndef")) + { + handle_ifdef(pp, &P, 1); + } + else if (!strcmp(func, "else")) + { + handle_else(pp, &P); + } + else if (!strcmp(func, "elseifdef")) + { + handle_elseifdef(pp, &P, 0); + } + else if (!strcmp(func, "elseifndef")) + { + handle_elseifdef(pp, &P, 1); + } + else if (!strcmp(func, "endif")) + { + handle_endif(pp, &P); + } + else if (!strcmp(func, "error")) + { + handle_message(pp, &P, "error"); + if (pp->alternate) + { + exit(1); + } + } + else if (!strcmp(func, "warning") || !strcmp(func, "warn")) + { + handle_message(pp, &P, "warning"); + } + else if (!strcmp(func, "info")) + { + handle_message(pp, &P, "info"); + } + else if (!strcmp(func, "define")) + { + handle_define(pp, &P, 1); + } + else if (!strcmp(func, "undef")) + { + handle_define(pp, &P, 0); + } + else if (!strcmp(func, "include")) + { + handle_include(pp, &P); + } + else + { + //doerror(pp, "Unknown preprocessor directive `%s'", func); + // because spin has the # as a valid part of it's syntax and that can be at the start of a line, + // this isn't an error, but instead needs to be parsed like a normal line + // first restore the line + if (P.save) + { + *(P.save) = (char)(P.c); + } + r = expand_macros(pp, &pp->line, data); + } + } + free(data); + return r; +} + +/* + * main function + */ +void pp_run(struct preprocess *pp) +{ + int linelen; + + while (pp->fil) + { + for(;;) + { + linelen = pp_nextline(pp); + if (linelen <= 0) break; /* end of file */ + /* now expand directives and/or macros */ + linelen = do_line(pp); + /* if the whole line should be skipped check_directives will return 0 */ + if (linelen == 0) + { + /* add a newline so line number errors will be correct */ + flexbuf_addchar(&pp->whole, '\n'); + } + else + { + char *line = flexbuf_get(&pp->line); + flexbuf_addstr(&pp->whole, line); + free(line); + } + } + pp_pop_file(pp); + } +} + +char* pp_finish(struct preprocess *pp) +{ + flexbuf_addchar(&pp->whole, 0); + flexbuf_delete(&pp->line); + return flexbuf_get(&pp->whole); +} + +/* + * set comment characters + */ +void pp_setcomments(struct preprocess *pp, const char *line, const char *start, const char *end) +{ + pp->linecomment = line; + pp->startcomment = start; + pp->endcomment = end; +} + +/* + * get/restore define state + * this may be used to ensure that #defines in sub files are not + * seen in the main file + */ +void* pp_get_define_state(struct preprocess *pp) +{ + return (void *)pp->defs; +} + +void pp_restore_define_state(struct preprocess *pp, void *vp) +{ + struct predef *where = (struct predef *)vp; + struct predef *x, *old; + + x = pp->defs; + while (x && x != where) + { + old = x; + x = old->next; + if (old->flags & PREDEF_FLAG_FREEDEFS) + { + free((void *)old->name); + if (old->def) + { + free((void *)old->def); + } + } + free(old); + } + pp->defs = x; +} + +void pp_clear_define_state(struct preprocess *pp) +{ + struct predef *x, *old; + + x = pp->defs; + while (x) + { + old = x; + x = old->next; + if (old->flags & PREDEF_FLAG_FREEDEFS) + { + free((void *)old->name); + if (old->def) + { + free((void *)old->def); + } + } + free(old); + } + pp->defs = 0; +} + +/* + * +-------------------------------------------------------------------- + * ¦ TERMS OF USE: MIT License + * +-------------------------------------------------------------------- + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files + * (the "Software"), to deal in the Software without restriction, + * including without limitation the rights to use, copy, modify, merge, + * publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * +-------------------------------------------------------------------- + */ diff --git a/Tools/unix/OpenSpin/PropellerCompiler/preprocess.h b/Tools/unix/OpenSpin/PropellerCompiler/preprocess.h new file mode 100644 index 00000000..66de6e96 --- /dev/null +++ b/Tools/unix/OpenSpin/PropellerCompiler/preprocess.h @@ -0,0 +1,115 @@ +#ifndef PREPROCESS_H_ +#define PREPROCESS_H_ + +#include +#include "flexbuf.h" + +struct predef +{ + struct predef *next; + const char *name; + const char *def; + int flags; +}; +#define PREDEF_FLAG_FREEDEFS 0x01 /* if "name" and "def" should be freed */ + + +#define MODE_UNKNOWN 0 +#define MODE_UTF8 1 +#define MODE_UTF16 2 + +typedef char* (*PreprocessLoadFileFunc)(const char* pFilename, int* pnLength, char** ppFilePath); +typedef void (*PreprocessFreeFileBufferFunc)(char* buffer); + +struct memoryfile +{ + char* buffer; + int length; + int readoffset; + char* filepath; +}; + +struct filestate +{ + struct filestate *next; + memoryfile *f; + const char *name; + int lineno; + int (*readfunc)(memoryfile *f, char *buf); + int flags; +}; +#define FILE_FLAGS_CLOSEFILE 0x01 + +struct ifstate +{ + struct ifstate *next; + int skip; /* if we are currently skipping code */ + const char *name; /* the name of the file it started in */ + int linenum; /* the line number it started on */ + int skiprest; /* if we have already processed some branch */ + int sawelse; /* if we have already processed a #else */ +}; + +struct preprocess +{ + struct filestate *fil; + struct flexbuf line; + struct flexbuf whole; + struct predef *defs; + + struct ifstate *ifs; + + /* comment handling code */ + const char *linecomment; + const char *startcomment; + const char *endcomment; + + int incomment; + + /* error handling code */ + void (*messagefunc)(const char *level, const char *filename, int linenum, const char *msg); + + bool alternate; /* flag to enable alternate preprocessor rules - */ + /* affects #error handling, macro substitution of */ + /* symbols that are "defined" but have no value. */ +}; + +#define pp_active(pp) (!((pp)->ifs && (pp)->ifs->skip)) + +void pp_setFileFunctions(PreprocessLoadFileFunc pLoadFileFunc, PreprocessFreeFileBufferFunc pFreeFileBufferFunc); + +/* initialize for reading */ +void pp_init(struct preprocess *pp, bool alternate); + +/* push an opened FILE struct */ +void pp_push_file_struct(struct preprocess *pp, memoryfile *f, const char *name); + +/* push a file by name */ +void pp_push_file(struct preprocess *pp, const char *filename); + +/* pop a file (finish processing it) */ +void pp_pop_file(struct preprocess *pp); + +/* set the strings that will be recognized to start line comments and start and end + multi-line comments; these nest */ +void pp_setcomments(struct preprocess *pp, const char *line, const char *s, const char *e); + +/* define symbol "name" to have "val", or undefine it if val is NULL */ +void pp_define(struct preprocess *pp, const char *name, const char *val); + +/* get the current state of the define stack */ +void *pp_get_define_state(struct preprocess *pp); + +/* restore the define state to the state given by a previous call to get_define_state */ +void pp_restore_define_state(struct preprocess *pp, void *ptr); + +/* clear all the define state */ +void pp_clear_define_state(struct preprocess *pp); + +/* actually perform the preprocessing on all files that have been pushed so far */ +void pp_run(struct preprocess *pp); + +/* finish preprocessing and retrieve the result string */ +char *pp_finish(struct preprocess *pp); + +#endif diff --git a/Tools/unix/OpenSpin/PropellerCompiler/textconvert.cpp b/Tools/unix/OpenSpin/PropellerCompiler/textconvert.cpp new file mode 100644 index 00000000..adc2ec43 --- /dev/null +++ b/Tools/unix/OpenSpin/PropellerCompiler/textconvert.cpp @@ -0,0 +1,284 @@ +/////////////////////////////////////////////////////////////// +// // +// Propeller Spin/PASM Compiler Command Line Tool 'OpenSpin' // +// (c)2012-2016 Parallax Inc. DBA Parallax Semiconductor. // +// See end of file for terms of use. // +// // +/////////////////////////////////////////////////////////////// +// +// textconvert.h +// + +unsigned int DecodeUtf8(const char* pBuffer, int& nCharSize) +{ + unsigned int nChar = (unsigned int)((unsigned char)(*pBuffer)); + if (nChar < 128) + { + nCharSize = 1; + } + else if (nChar >= 192 && nChar <= 223) + { + // character is two bytes + nCharSize = 2; + nChar = ((nChar & 31) << 6) | ((unsigned int)pBuffer[1] & 63); + } + else if (nChar >= 224 && nChar <= 239) + { + // character is three bytes + nCharSize = 3; + nChar = ((nChar & 15) << 12) | (((unsigned int)pBuffer[1] & 63) << 6) | ((unsigned int)pBuffer[2] & 63); + } + else if (nChar >= 240 && nChar <= 247) + { + // character is four bytes + nCharSize = 4; + nChar = ((nChar & 7) << 18) | (((unsigned int)pBuffer[1] & 63) << 12) | (((unsigned int)pBuffer[2] & 63) << 6) | ((unsigned int)pBuffer[3] & 63); + } + else if (nChar >= 248 && nChar <= 251) + { + // character is five bytes + nCharSize = 5; + nChar = ((nChar & 3) << 24) | (((unsigned int)pBuffer[1] & 63) << 18) | (((unsigned int)pBuffer[2] & 63) << 12) | (((unsigned int)pBuffer[3] & 63) << 6) | ((unsigned int)pBuffer[4] & 63); + } + else if (nChar >= 252 && nChar <= 253) + { + // character is six bytes + nCharSize = 6; + nChar = ((nChar & 1) << 30) | (((unsigned int)pBuffer[1] & 63) << 24) | (((unsigned int)pBuffer[2] & 63) << 18) | (((unsigned int)pBuffer[3] & 63) << 12) | (((unsigned int)pBuffer[4] & 63) << 6) | ((unsigned int)pBuffer[5] & 63); + } + + return nChar; +} + + +static unsigned short s_aConvertTable[] = { + 0x0000, 0x0000, 0x2190, 0x2192, 0x2191, 0x2193,0x25C0, 0x25B6, 0x0000, 0x0009, 0x000A, 0x0000, 0x0000, 0x000D, 0x2023, 0x2022, + 0x0394, 0x03C0, 0x03A3, 0x03A9, 0x2248, 0x221A,0xF016, 0xF017, 0xF018, 0xF019, 0xF01A, 0xF01B, 0xF01C, 0xF01D, 0xF01E, 0xF01F, + 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025,0x0026, 0x0027, 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F, + 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035,0x0036, 0x0037, 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F, + 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045,0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, + 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055,0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F, + 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065,0x0066, 0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F, + 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075,0x0076, 0x0077, 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0xF07F, + 0xF080, 0xF081, 0xF082, 0xF083, 0xF084, 0xF085,0xF086, 0xF087, 0xF088, 0xF089, 0xF08A, 0xF08B, 0xF08C, 0xF08D, 0xF08E, 0xF08F, + 0x2500, 0x2502, 0x253C, 0x254B, 0x2524, 0x251C,0x2534, 0x252C, 0x252B, 0x2523, 0x253B, 0x2533, 0x2518, 0x2514, 0x2510, 0x250C, + 0xF0A0, 0x00A1, 0xF0A2, 0x00A3, 0x20AC, 0x00A5,0xF0A6, 0xF0A7, 0xF0A8, 0xF0A9, 0xF0AA, 0xF0AB, 0xF0AC, 0xF0AD, 0xF0AE, 0xF0AF, + 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0xF0B4, 0x00B5,0xF0B6, 0xF0B7, 0xF0B8, 0x00B9, 0xF0BA, 0xF0BB, 0xF0BC, 0xF0BD, 0xF0BE, 0x00BF, + 0x00C0, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5,0x00C6, 0x00C7, 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF, + 0x00D0, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5,0x00D6, 0x00D7, 0x00D8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x00DD, 0x00DE, 0x00DF, + 0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5,0x00E6, 0x00E7, 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF, + 0x00F0, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5,0x00F6, 0x00F7, 0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x00FD, 0x00FE, 0x221E +}; + + +void PASCIIToUnicode16(char* pPASCIIBuffer, int nPASCIIBufferLength, unsigned short* pUnicode16Buffer) +{ + for (int i = 0; i < nPASCIIBufferLength; i++) + { + pUnicode16Buffer[i] = s_aConvertTable[(int)pPASCIIBuffer[i]]; + } +} + + +/* + The Parallax font v1.0 utilizes the following Unicode addresses (grouped here into similar ranges): + $0020- $007E, $00A1, $00A3, $00A5, $00B0- $00B3, $00B5, $00B9, $00BF- $00FE, + $0394, $03A3, $03A9, $03C0, + $2022, $2023, $20AC, + $2190- $2193, + $221A, $221E, $2248, + $25B6, $2500, $2502, $250C, $2510, $2514, $2518, $251C, $2523, $2524, $252B, $252C, $2533, $2534, $253B, $253C, $254B, $25C0, + $F000, $F001, $F008- $F00D, $F016- $F01F, $F07F- $F08F, $F0A0, $F0A2, $F0A6- $F0AF, $F0B4, $F0B6- $F0B8, $F0BA- $F0BE + Propeller source files are sometimes Unicode-encoded (UTF-16) and can contain only the supported Parallax font characters with the following + exceptions: 1) Run-time only characters ($F000, $F001, $F008-$F00D) are not valid + 2) Some control code characters ($0009, $0010, $000D) are allowed. + Any invalid characters will be translated to the PASCII infinity character ($00FF). + All others will be mapped to their corresponding PASCII character. + NOTE: The speediest translation would be a simple lookup table, but the natural size would be impractical. + A little math solves this problem: + ANDing the unicode character value with $07FF yields a range of $0000 to $07FF but causes the 20xx characters to inappropriately + collide with other valid values. ANDing with $07FF then ORing with ((CharVal >> 5) AND NOT(CharVal >> 4) AND $0100) corrects + this by mapping 20xx into 21xx space and 22xx characters into 23xx space. This allows for a practical translation table + (of 2K bytes) to be used. +*/ +static unsigned char s_aCharTxMap[0x800] = { + // 0x00 0x01 0x02 0x03 0x04 0x05 0x06 0x07 0x08 0x09 0x0A 0x0B 0x0C 0x0D 0x0E 0x0F 0x10 0x11 0x12 0x13 0x14 0x15 0x16 0x17 0x18 0x19 0x1A 0x1B 0x1C 0x1D 0x1E 0x1F +/*000*/ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x09, 0x0A, 0xff, 0xff, 0x0D, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, +/*020*/ 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F, +/*040*/ 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F, +/*060*/ 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0x7B, 0x7C, 0x7D, 0x7E, 0x7F, +/*080*/ 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +/*0A0*/ 0xA0, 0xA1, 0xA2, 0xA3, 0xff, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF, 0xB0, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0xB9, 0xBA, 0xBB, 0xBC, 0xBD, 0xBE, 0xBF, +/*0C0*/ 0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, 0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0xDF, +/*0E0*/ 0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xff, +/*100*/ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +/*120*/ 0xff, 0xff, 0x0F, 0x0E, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +/*140*/ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +/*160*/ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +/*180*/ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x02, 0x04, 0x03, 0x05, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +/*1A0*/ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xA4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +/*1C0*/ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +/*1E0*/ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +/*200*/ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +/*220*/ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +/*240*/ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +/*260*/ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +/*280*/ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +/*2A0*/ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +/*2C0*/ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +/*2E0*/ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +/*300*/ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x15, 0xff, 0xff, 0xff, 0xFF, 0xff, +/*320*/ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +/*340*/ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x14, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +/*360*/ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +/*380*/ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +/*3A0*/ 0xff, 0xff, 0xff, 0x12, 0xff, 0xff, 0xff, 0xff, 0xff, 0x13, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +/*3C0*/ 0x11, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +/*3E0*/ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +/*400*/ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +/*420*/ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +/*440*/ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +/*460*/ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +/*480*/ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +/*4A0*/ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +/*4C0*/ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +/*4E0*/ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +/*500*/ 0x90, 0xff, 0x91, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x9F, 0xff, 0xff, 0xff, 0x9E, 0xff, 0xff, 0xff, 0x9D, 0xff, 0xff, 0xff, 0x9C, 0xff, 0xff, 0xff, 0x95, 0xff, 0xff, 0xff, +/*520*/ 0xff, 0xff, 0xff, 0x99, 0x94, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x98, 0x97, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x9B, 0x96, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x9A, 0x92, 0xff, 0xff, 0xff, +/*540*/ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x93, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +/*560*/ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +/*580*/ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +/*5A0*/ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +/*5C0*/ 0x06, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +/*5E0*/ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +/*600*/ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +/*620*/ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +/*640*/ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +/*660*/ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +/*680*/ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +/*6A0*/ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +/*6C0*/ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +/*6E0*/ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +/*700*/ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +/*720*/ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +/*740*/ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +/*760*/ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +/*780*/ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +/*7A0*/ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +/*7C0*/ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +/*7E0*/ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff +}; + +bool UnicodeToPASCII(char* pBuffer, int nBufferLength, char* pPASCIIBuffer, bool bForceUTF8) +{ + // Translate Unicode source to PASCII (Parallax ASCII) source + + // detect Unicode or ASCII form + bool bUnicode = false; + bool bUtf8 = false; + if (bForceUTF8) + { + // preprocessor outputs utf8 encoded data, so just force it + bUnicode = true; + bUtf8 = true; + } + else if (*((short*)(&pBuffer[0])) == -257) // -257 == 0xFEFF which is the UTF-16 BOM character for Little Endian + { + bUnicode = true; + } + else if (*((short*)(&pBuffer[0])) == -2) // -2 == 0xFFFE which is the UTF-16 BOM character for Big Endian + { + // we don't handle this encoding format + return false; + } + else if (nBufferLength > 2 && pBuffer[1] == 0) // this attempts to handle the case of a UTF-16 encoded file without a BOM character. It assumes the first character is < 255, thus the second byte is 0 + { + bUnicode = true; + } + else if (nBufferLength > 2 && (unsigned char)pBuffer[0] == 239 && (unsigned char)pBuffer[1] == 187 && (unsigned char)pBuffer[2] == 191) // handle the UTF-8 BOM sequence case + { + bUnicode = true; + bUtf8 = true; + } + + // probably need to add a way to detect utf-8 without a BOM character (need to scan file and see if it's all valid utf-8 form + + // the compiler code expects 0x0D line endings, this code will strip out 0x0A from the line endings and put in 0x0D if they are not there. + if (bUnicode) + { + // unicode, copy over translating line endings + int nSourceOffset = 0; + int nDestOffset = 0; + unsigned short nPrevChar = 0; + while (nSourceOffset < nBufferLength) + { + int nCharSize = 2; + unsigned short nChar = (bUtf8 == true) ? (unsigned short)DecodeUtf8(&pBuffer[nSourceOffset], nCharSize) : *((unsigned short*)(&pBuffer[nSourceOffset])); + if (nChar != 0x000A && nChar != 0xFEFF) // -257 == 0xFEFF + { + pPASCIIBuffer[nDestOffset] = s_aCharTxMap[(nChar | ((nChar >> 5) & ~(nChar >> 4) & 0x0100)) & 0x07FF]; + nDestOffset++; + } + else if (nChar == 0x000A) + { + if (nSourceOffset == 0 || nPrevChar != 0x000D) + { + pPASCIIBuffer[nDestOffset] = 0x0D; + nDestOffset++; + } + } + nSourceOffset += nCharSize; + nPrevChar = nChar; + } + pPASCIIBuffer[nDestOffset] = 0; + } + else + { + // ascii, copy over translating line endings + int nSourceOffset = 0; + int nDestOffset = 0; + while (nSourceOffset < nBufferLength) + { + char nChar = pBuffer[nSourceOffset]; + if (nChar != 0x0A) + { + pPASCIIBuffer[nDestOffset] = nChar; + nDestOffset++; + } + else + { + if (nSourceOffset == 0 || pBuffer[nSourceOffset-1] != 0x0D) + { + pPASCIIBuffer[nDestOffset] = 0x0D; + nDestOffset++; + } + } + nSourceOffset++; + } + pPASCIIBuffer[nDestOffset] = 0; + } + + return true; +} + + +/////////////////////////////////////////////////////////////////////////////////////////// +// TERMS OF USE: MIT License // +/////////////////////////////////////////////////////////////////////////////////////////// +// Permission is hereby granted, free of charge, to any person obtaining a copy of this // +// software and associated documentation files (the "Software"), to deal in the Software // +// without restriction, including without limitation the rights to use, copy, modify, // +// merge, publish, distribute, sublicense, and/or sell copies of the Software, and to // +// permit persons to whom the Software is furnished to do so, subject to the following // +// conditions: // +// // +// The above copyright notice and this permission notice shall be included in all copies // +// or substantial portions of the Software. // +// // +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, // +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A // +// PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT // +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE // +// SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // +/////////////////////////////////////////////////////////////////////////////////////////// diff --git a/Tools/unix/OpenSpin/PropellerCompiler/textconvert.h b/Tools/unix/OpenSpin/PropellerCompiler/textconvert.h new file mode 100644 index 00000000..8bb9fb80 --- /dev/null +++ b/Tools/unix/OpenSpin/PropellerCompiler/textconvert.h @@ -0,0 +1,40 @@ +/////////////////////////////////////////////////////////////// +// // +// Propeller Spin/PASM Compiler Command Line Tool 'OpenSpin' // +// (c)2012-2016 Parallax Inc. DBA Parallax Semiconductor. // +// See end of file for terms of use. // +// // +/////////////////////////////////////////////////////////////// +// +// textconvert.h +// + +#ifndef _TEXTCONVERT_H_ +#define _TEXTCONVERT_H_ + +unsigned int DecodeUtf8(const char* pBuffer, int& nCharSize); +void PASCIIToUnicode16(char* pPASCIIBuffer, int nPASCIIBufferLength, unsigned short* pUnicode16Buffer); +bool UnicodeToPASCII(char* pBuffer, int nBufferLength, char* pPASCIIBuffer, bool bForceUTF8); + +#endif // _TEXTCONVERT_H_ + +/////////////////////////////////////////////////////////////////////////////////////////// +// TERMS OF USE: MIT License // +/////////////////////////////////////////////////////////////////////////////////////////// +// Permission is hereby granted, free of charge, to any person obtaining a copy of this // +// software and associated documentation files (the "Software"), to deal in the Software // +// without restriction, including without limitation the rights to use, copy, modify, // +// merge, publish, distribute, sublicense, and/or sell copies of the Software, and to // +// permit persons to whom the Software is furnished to do so, subject to the following // +// conditions: // +// // +// The above copyright notice and this permission notice shall be included in all copies // +// or substantial portions of the Software. // +// // +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, // +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A // +// PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT // +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE // +// SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // +/////////////////////////////////////////////////////////////////////////////////////////// diff --git a/Tools/unix/OpenSpin/README.md b/Tools/unix/OpenSpin/README.md new file mode 100644 index 00000000..5960f0ac --- /dev/null +++ b/Tools/unix/OpenSpin/README.md @@ -0,0 +1,37 @@ +Introduction +============ + +OpenSpin is an open source compiler for the Spin/PASM language of the Parallax Propeller. It was ported from Chip Gracey's original x86 assembler code. The only binary differences in the output are from the corrected handling of floating point numbers (which is now IEEE compliant). + +There are solution/project files for VS 2015 & VS 2017, and there are make files for use with GCC/clang/etc. Tested on MinGW, linux, and Mac OSX. They build the PropellerCompiler library and openspin.exe. + +The code successfully compiles all of the Library files shipped with PropTool as well as all of the files available in the OBEX as of August 2012. That's approximately 1450 spin files. + +OpenSpin allows symbols to be 254 characters long (instead of 31), has unused method elimination, and supports a basic [preprocessor](https://github.com/reltham/OpenSpin/wiki/Preprocessor). + +PropellerCompiler library +------------------------- + +PropellerCompiler.cpp/h contain the interface to the compiler. Look at openspin.cpp for an example of how to work with the interface. + +openspin.exe +------------ + +openspin.exe is a command line wrapper for the compiler library. You give it a spin file and it passes it through the compiler and produces a .binary (or optional .eeprom) file with the same base name as the passed in spin file. There are several [command line options](https://github.com/reltham/OpenSpin/wiki/CommandLine) available. Run openspin.exe with no arguments to get a usage description. + +Downloads +--------- + +### Builds provided by David Zemon's TeamCity service: + Note: These are updated automatically whenever changes are submitted here, so they include changes between releases. +* [Linux x86_64](http://david.zemon.name:8111/repository/download/OpenSpin_LinuxX8664/lastSuccessful/openspin.tar.gz?guest=1) +* [Windows x86](http://david.zemon.name:8111/repository/download/OpenSpin_WindowsX86/lastSuccessful/openspin.zip?guest=1) +* [Mac OS X](http://david.zemon.name:8111/repository/download/OpenSpin_MacOsX/2548:id/openspin.tar.gz?guest-1) +* [Raspberry Pi](http://david.zemon.name:8111/repository/download/OpenSpin_RaspberryPi/lastSuccessful/openspin.tar.gz?guest=1) + +Thanks +------ + +* Thanks to Steve Denson, for the Makefile and testing on linux! +* Thanks to David Betz for testing on Mac OSX. +* Thanks to Eric Smith for providing the code and helping with integrating the preprocessor. diff --git a/Tools/unix/OpenSpin/SpinSource/openspin.cpp b/Tools/unix/OpenSpin/SpinSource/openspin.cpp new file mode 100644 index 00000000..f5209455 --- /dev/null +++ b/Tools/unix/OpenSpin/SpinSource/openspin.cpp @@ -0,0 +1,494 @@ +/////////////////////////////////////////////////////////////// +// // +// Propeller Spin/PASM Compiler Command Line Tool 'OpenSpin' // +// (c)2012-2016 Parallax Inc. DBA Parallax Semiconductor. // +// Adapted from Jeff Martin's Delphi code by Roy Eltham // +// See end of file for terms of use. // +// // +/////////////////////////////////////////////////////////////// +// +// openspin.cpp +// + +#include +#include +#include + +#include "../PropellerCompiler/CompileSpin.h" +#include "pathentry.h" + +#define MAX_FILES 2048 + +static int s_nFilesAccessed = 0; +static char s_filesAccessed[MAX_FILES][PATH_MAX]; + + +static void Banner(void) +{ + fprintf(stdout, "Propeller Spin/PASM Compiler \'OpenSpin\' (c)2012-2018 Parallax Inc. DBA Parallax Semiconductor.\n"); + fprintf(stdout, "Version 1.00.81 Compiled on %s %s\n",__DATE__, __TIME__); +} + +/* Usage - display a usage message and exit */ +static void Usage(void) +{ + Banner(); + fprintf(stderr, "\ +usage: openspin\n\ + [ -h ] display this help\n\ + [ -L or -I ] add a directory to the include path\n\ + [ -o ] output filename\n\ + [ -b ] output binary file format\n\ + [ -e ] output eeprom file format\n\ + [ -c ] output only DAT sections\n\ + [ -d ] dump out doc mode\n\ + [ -t ] output just the object file tree\n\ + [ -f ] output a list of filenames for use in archiving\n\ + [ -q ] quiet mode (suppress banner and non-error text)\n\ + [ -v ] verbose output\n\ + [ -p ] disable the preprocessor\n\ + [ -a ] use alternative preprocessor rules\n\ + [ -D ] add a define\n\ + [ -M ] size of eeprom (up to 16777216 bytes)\n\ + [ -s ] dump PUB & CON symbol information for top object\n\ + [ -u ] enable unused method elimination\n\ + spin file to compile\n\ +\n"); +} + +FILE* OpenFileInPath(const char *name, const char *mode) +{ + const char* pTryPath = NULL; + + FILE* file = fopen(name, mode); + if (!file) + { + PathEntry* entry = NULL; + while(!file) + { + pTryPath = MakeNextPath(&entry, name); + if (pTryPath) + { + file = fopen(pTryPath, mode); + if (file != NULL) + { + break; + } + } + else + { + break; + } + } + } + + if (s_nFilesAccessed < MAX_FILES) + { + if (!pTryPath) + { +#ifdef WIN32 + if (_fullpath(s_filesAccessed[s_nFilesAccessed], name, PATH_MAX) == NULL) +#else + if (realpath(name, s_filesAccessed[s_nFilesAccessed]) == NULL) +#endif + { + strcpy(s_filesAccessed[s_nFilesAccessed], name); + } + s_nFilesAccessed++; + } + else + { + strcpy(s_filesAccessed[s_nFilesAccessed++], pTryPath); + } + } + else + { + // should never hit this, but just in case + printf("Too many files!\n"); + exit(-2); + } + + return file; +} + +// returns NULL if the file failed to open or is 0 length +char* LoadFile(const char* pFilename, int* pnLength, char** ppFilePath) +{ + char* pBuffer = 0; + FILE* pFile = OpenFileInPath(pFilename, "rb"); + if (pFile != NULL) + { + // get the length of the file by seeking to the end and using ftell + fseek(pFile, 0, SEEK_END); + *pnLength = ftell(pFile); + + if (*pnLength > 0) + { + pBuffer = (char*)malloc(*pnLength+1); // allocate a buffer that is the size of the file plus one char + pBuffer[*pnLength] = 0; // set the end of the buffer to 0 (null) + + // seek back to the beginning of the file and read it in + fseek(pFile, 0, SEEK_SET); + fread(pBuffer, 1, *pnLength, pFile); + } + + fclose(pFile); + + *ppFilePath = &(s_filesAccessed[s_nFilesAccessed-1][0]); + } + else + { + return 0; + } + + return pBuffer; +} + +void FreeFileBuffer(char* pBuffer) +{ + if (pBuffer != 0) + { + free(pBuffer); + } +} + +int main(int argc, char* argv[]) +{ + CompilerConfig compilerConfig; + + char* infile = NULL; + char* outfile = NULL; + char* p = NULL; + s_nFilesAccessed = 0; + + // go through the command line arguments, skipping over any -D + for(int i = 1; i < argc; i++) + { + // handle switches + if(argv[i][0] == '-') + { + switch(argv[i][1]) + { + case 'I': + case 'L': + if(argv[i][2]) + { + p = &argv[i][2]; + } + else if(++i < argc) + { + p = argv[i]; + } + else + { + Usage(); + CleanupPathEntries(); + return 1; + } + AddPath(p); + break; + + case 'M': + if (argv[i][2]) + { + p = &argv[i][2]; + } + else if(++i < argc) + { + p = argv[i]; + } + else + { + Usage(); + CleanupPathEntries(); + return 1; + } + sscanf(p, "%d", &(compilerConfig.eeprom_size)); + if (compilerConfig.eeprom_size > 16777216) + { + Usage(); + CleanupPathEntries(); + return 1; + } + break; + + case 'o': + if(argv[i][2]) + { + outfile = &argv[i][2]; + } + else if(++i < argc) + { + outfile = argv[i]; + } + else + { + Usage(); + CleanupPathEntries(); + return 1; + } + break; + + case 'p': + compilerConfig.bUsePreprocessor = false; + break; + + case 'a': + compilerConfig.bAlternatePreprocessorMode = true; + break; + + case 'D': + if (compilerConfig.bUsePreprocessor) + { + if (argv[i][2]) + { + p = &argv[i][2]; + } + else if(++i < argc) + { + p = argv[i]; + } + else + { + Usage(); + CleanupPathEntries(); + return 1; + } + // just skipping these for now + } + else + { + Usage(); + CleanupPathEntries(); + return 1; + } + break; + + case 't': + compilerConfig.bFileTreeOutputOnly = true; + break; + + case 'f': + compilerConfig.bFileListOutputOnly = true; + break; + + case 'b': + compilerConfig.bBinary = true; + break; + + case 'c': + compilerConfig.bDATonly = true; + break; + + case 'd': + compilerConfig.bDocMode = true; + break; + + case 'e': + compilerConfig.bBinary = false; + break; + + case 'q': + compilerConfig.bQuiet = true; + break; + + case 'v': + compilerConfig.bVerbose = true; + break; + + case 's': + compilerConfig.bDumpSymbols = true; + break; + + case 'u': + compilerConfig.bUnusedMethodElimination = true; + break; + + case 'h': + default: + Usage(); + CleanupPathEntries(); + return 1; + break; + } + } + else // handle the input filename + { + if (infile) + { + Usage(); + CleanupPathEntries(); + return 1; + } + infile = argv[i]; + } + } + + // must have input file + if (!infile) + { + Usage(); + CleanupPathEntries(); + return 1; + } + + if (compilerConfig.bFileTreeOutputOnly || compilerConfig.bFileListOutputOnly || compilerConfig.bDumpSymbols) + { + compilerConfig.bQuiet = true; + } + + // finish the include path + AddFilePath(infile); + + char outputFilename[256]; + if (!outfile) + { + // create *.binary filename from user passed in spin filename + strcpy(&outputFilename[0], infile); + const char* pTemp = strstr(&outputFilename[0], ".spin"); + if (pTemp == 0) + { + printf("ERROR: spinfile must have .spin extension. You passed in: %s\n", infile); + Usage(); + CleanupPathEntries(); + return 1; + } + else + { + int offset = (int)(pTemp - &outputFilename[0]); + outputFilename[offset+1] = 0; + if (compilerConfig.bDATonly) + { + strcat(&outputFilename[0], "dat"); + } + else if (compilerConfig.bBinary) + { + strcat(&outputFilename[0], "binary"); + } + else + { + strcat(&outputFilename[0], "eeprom"); + } + } + } + else // use filename specified with -o + { + strcpy(outputFilename, outfile); + } + + if (!compilerConfig.bQuiet) + { + Banner(); + printf("Compiling...\n%s\n", infile); + } + + InitCompiler(&compilerConfig, LoadFile, FreeFileBuffer); + + if (compilerConfig.bUsePreprocessor) + { + // go through the command line arguments again, this time only processing -D + for(int i = 1; i < argc; i++) + { + // handle switches + if(argv[i][0] == '-') + { + if (argv[i][1] == 'D') + { + if (argv[i][2]) + { + p = &argv[i][2]; + } + else if(++i < argc) + { + p = argv[i]; + } + else + { + Usage(); + ShutdownCompiler(); + CleanupPathEntries(); + return 1; + } + + // add any predefined symbols here - note that when using the + // "alternate" rules, these symbols have a null value - i.e. + // they are just "defined", but are not used in macro substitution + SetDefine(p, (compilerConfig.bAlternatePreprocessorMode ? "" : "1")); + } + } + } + + // add symbols with predefined values here + SetDefine("__SPIN__", "1"); + SetDefine("__TARGET__", "P1"); + } + + int nLength = 0; + unsigned char* pBuffer = CompileSpin(infile, &nLength); + + if (pBuffer) + { + FILE* pFile = fopen(outputFilename, "wb"); + if (pFile) + { + fwrite(pBuffer, nLength, 1, pFile); + fclose(pFile); + } + } + else + { + // compiler put out an error + ShutdownCompiler(); + CleanupPathEntries(); + return 1; + } + + if (compilerConfig.bFileListOutputOnly) + { + for (int i = 0; i < s_nFilesAccessed; i++) + { + for (int j = i+1; j < s_nFilesAccessed; j++) + { + if (strcmp(s_filesAccessed[i], s_filesAccessed[j]) == 0) + { + s_filesAccessed[j][0] = 0; + } + } + } + + for (int i = 0; i < s_nFilesAccessed; i++) + { + if (s_filesAccessed[i][0] != 0) + { + printf("%s\n", s_filesAccessed[i]); + } + } + } + + + ShutdownCompiler(); + CleanupPathEntries(); + + return 0; +} + +/////////////////////////////////////////////////////////////////////////////////////////// +// TERMS OF USE: MIT License // +/////////////////////////////////////////////////////////////////////////////////////////// +// Permission is hereby granted, free of charge, to any person obtaining a copy of this // +// software and associated documentation files (the "Software"), to deal in the Software // +// without restriction, including without limitation the rights to use, copy, modify, // +// merge, publish, distribute, sublicense, and/or sell copies of the Software, and to // +// permit persons to whom the Software is furnished to do so, subject to the following // +// conditions: // +// // +// The above copyright notice and this permission notice shall be included in all copies // +// or substantial portions of the Software. // +// // +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, // +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A // +// PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT // +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE // +// SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // +/////////////////////////////////////////////////////////////////////////////////////////// diff --git a/Tools/unix/OpenSpin/SpinSource/pathentry.cpp b/Tools/unix/OpenSpin/SpinSource/pathentry.cpp new file mode 100644 index 00000000..513b02dc --- /dev/null +++ b/Tools/unix/OpenSpin/SpinSource/pathentry.cpp @@ -0,0 +1,110 @@ +/////////////////////////////////////////////////////////////// +// // +// Propeller Spin/PASM Compiler Command Line Tool 'OpenSpin' // +// (c)2012-2016 Parallax Inc. DBA Parallax Semiconductor. // +// See end of file for terms of use. // +// // +/////////////////////////////////////////////////////////////// +// +// pathentry.cpp +// + +#include +#include + +#include "pathentry.h" + +PathEntry *path = NULL; +static PathEntry **pNextPathEntry = &path; + +static char lastfullpath[PATH_MAX]; + +const char *MakeNextPath(PathEntry **entry, const char *name) +{ + if (!*entry) + { + *entry = path; + } + else + { + *entry = (*entry)->next; + } + if (*entry) + { + sprintf(lastfullpath, "%s%c%s", (*entry)->path, DIR_SEP, name); + return lastfullpath; + } + return NULL; +} + +bool AddPath(const char *newPath) +{ + PathEntry* entry = (PathEntry*)new char[(sizeof(PathEntry) + strlen(newPath))]; + if (!(entry)) + { + return false; + } + strcpy(entry->path, newPath); + *pNextPathEntry = entry; + pNextPathEntry = &entry->next; + entry->next = NULL; + return true; +} + +bool AddFilePath(const char *name) +{ + const char* end = strrchr(name, DIR_SEP); + if (!end) + { + return false; + } + int len = (int)(end - name); + PathEntry *entry = (PathEntry*)new char[(sizeof(PathEntry) + len)]; + if (!entry) + { + return false; + } + strncpy(entry->path, name, len); + entry->path[len] = '\0'; + *pNextPathEntry = entry; + pNextPathEntry = &entry->next; + entry->next = NULL; + + return true; +} + +void CleanupPathEntries() +{ + PathEntry *entry = path; + while (entry != NULL) + { + PathEntry *nextEntry = entry->next; + delete [] entry; + entry = nextEntry; + } + path = NULL; + lastfullpath[0] = 0; +} + + + +/////////////////////////////////////////////////////////////////////////////////////////// +// TERMS OF USE: MIT License // +/////////////////////////////////////////////////////////////////////////////////////////// +// Permission is hereby granted, free of charge, to any person obtaining a copy of this // +// software and associated documentation files (the "Software"), to deal in the Software // +// without restriction, including without limitation the rights to use, copy, modify, // +// merge, publish, distribute, sublicense, and/or sell copies of the Software, and to // +// permit persons to whom the Software is furnished to do so, subject to the following // +// conditions: // +// // +// The above copyright notice and this permission notice shall be included in all copies // +// or substantial portions of the Software. // +// // +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, // +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A // +// PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT // +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE // +// SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // +/////////////////////////////////////////////////////////////////////////////////////////// diff --git a/Tools/unix/OpenSpin/SpinSource/pathentry.h b/Tools/unix/OpenSpin/SpinSource/pathentry.h new file mode 100644 index 00000000..4896bbbf --- /dev/null +++ b/Tools/unix/OpenSpin/SpinSource/pathentry.h @@ -0,0 +1,58 @@ +/////////////////////////////////////////////////////////////// +// // +// Propeller Spin/PASM Compiler Command Line Tool 'OpenSpin' // +// (c)2012-2016 Parallax Inc. DBA Parallax Semiconductor. // +// See end of file for terms of use. // +// // +/////////////////////////////////////////////////////////////// +// +// pathentry.h +// + +// +// code for handling directory paths (used with -I option) +// + +#ifndef PATH_MAX +#define PATH_MAX 1024 +#endif + +#if defined(WIN32) +#define DIR_SEP '\\' +#define DIR_SEP_STR "\\" +#else +#define DIR_SEP '/' +#define DIR_SEP_STR "/" +#endif + +struct PathEntry +{ + PathEntry *next; + char path[1]; +}; + +const char *MakeNextPath(PathEntry **entry, const char *name); // pass the address of an entry that is NULL to get first path, keep calling with same entry to walk list +bool AddPath(const char *path); +bool AddFilePath(const char *name); +void CleanupPathEntries(); + +/////////////////////////////////////////////////////////////////////////////////////////// +// TERMS OF USE: MIT License // +/////////////////////////////////////////////////////////////////////////////////////////// +// Permission is hereby granted, free of charge, to any person obtaining a copy of this // +// software and associated documentation files (the "Software"), to deal in the Software // +// without restriction, including without limitation the rights to use, copy, modify, // +// merge, publish, distribute, sublicense, and/or sell copies of the Software, and to // +// permit persons to whom the Software is furnished to do so, subject to the following // +// conditions: // +// // +// The above copyright notice and this permission notice shall be included in all copies // +// or substantial portions of the Software. // +// // +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, // +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A // +// PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT // +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE // +// SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // +/////////////////////////////////////////////////////////////////////////////////////////// diff --git a/Tools/unix/bst/Makefile b/Tools/unix/bst/Makefile deleted file mode 100644 index f051f892..00000000 --- a/Tools/unix/bst/Makefile +++ /dev/null @@ -1,23 +0,0 @@ -# -# build the propeller tools for linux and Darwin -# -UNAME := $(shell uname) -ifeq ($(UNAME), Linux) - SUFFIX=linux -endif -ifeq ($(UNAME), Darwin) - SUFFIX=osx -endif - -DEST = ../../$(UNAME) - -all: $(DEST) - -for i in *.$(SUFFIX) ; do \ - chmod +x $$i ; \ - cp -p $$i $(DEST)/$$(basename $$i .$(SUFFIX)) ; \ - done - -$(DEST): - mkdir $(DEST) - -clean: diff --git a/Tools/unix/bst/bstc.linux b/Tools/unix/bst/bstc.linux deleted file mode 100755 index 200c412e..00000000 Binary files a/Tools/unix/bst/bstc.linux and /dev/null differ diff --git a/Tools/unix/bst/bstc.osx b/Tools/unix/bst/bstc.osx deleted file mode 100755 index d69cbe56..00000000 Binary files a/Tools/unix/bst/bstc.osx and /dev/null differ diff --git a/Tools/unix/bst/bstl.linux b/Tools/unix/bst/bstl.linux deleted file mode 100755 index 03ee91cc..00000000 Binary files a/Tools/unix/bst/bstl.linux and /dev/null differ diff --git a/Tools/unix/bst/bstl.osx b/Tools/unix/bst/bstl.osx deleted file mode 100755 index 18179de2..00000000 Binary files a/Tools/unix/bst/bstl.osx and /dev/null differ diff --git a/Tools/unix/bst/openspin.linux b/Tools/unix/bst/openspin.linux deleted file mode 100755 index 8bc88e5d..00000000 Binary files a/Tools/unix/bst/openspin.linux and /dev/null differ diff --git a/Tools/unix/bst/openspin.osx b/Tools/unix/bst/openspin.osx deleted file mode 100755 index f55a8131..00000000 Binary files a/Tools/unix/bst/openspin.osx and /dev/null differ diff --git a/Tools/unix/cpmtools/Makefile b/Tools/unix/cpmtools/Makefile index 7cc055f8..61d92b6c 100644 --- a/Tools/unix/cpmtools/Makefile +++ b/Tools/unix/cpmtools/Makefile @@ -18,7 +18,7 @@ NCURSESLIBS=$(shell if env pkg-config --libs ncurses ; then : ; else echo -lncur CPPFLAGS = -DDISKDEFS=\"$(DISKDEFS)\" -DFORMAT=\"$(DEFFORMAT)\" -DEVICEOBJ = device_posix.o +DEVICEOBJ = device_posix.o OBJECTS = cpmls cpmrm cpmcp cpmchmod cpmchattr mkfs.cpm fsck.cpm fsed.cpm diff --git a/Tools/unix/zxcc/zxcc.c b/Tools/unix/zxcc/zxcc.c index 21929704..0c008b55 100644 --- a/Tools/unix/zxcc/zxcc.c +++ b/Tools/unix/zxcc/zxcc.c @@ -127,7 +127,15 @@ void load_bios(void) uint32_t size = CPM_MAXPATH - 8; _NSGetExecutablePath(dir, &size); #else - readlink("/proc/self/exe", dir, CPM_MAXPATH - 8); /* allow room for bios.bin */ + ssize_t len; + len = readlink("/proc/self/exe", dir, CPM_MAXPATH - 8); /* allow room for bios.bin */ + if (len < 0) + { + /* len of -1 indicates an error occurred */ + len = 0; + } + /* Terminate the dir string with a NUL character */ + dir[len] = 0; #endif q = strrchr(dir, DIRSEPCH); *++q = 0;

pЂty7#;}D-QD-d6+#Ffz |h5p=5oUo0Q.D?&I+`SS9kI0#wz1dp_FfUu7la c @E0Ϭ ڳv:B`C ^6ߜf}ӧ |LҌﱺxӓ5@|QG&yaY4 ²'N4n![[H*~W֞@JTkui  +y`f$J۔߾$pY%ph6FbF&.N78I(ӤWVY5&E4LFo}bt]7YppF;㠜ZlTJ=(Nwx[8pX+nKL- hh[CjvNa\Gij𛛫ښ#׫ҧivM`葪=eXj +3ET,$n8\T ZCG.X \/Swp9%&>WMtiuj)s}dB~mt/oB; [^%vw|+"ȩ3Er =䏞CJ}:rd%g~l8]Z+z=B.Tk^?db9ɶiYJ7L$g +FqK_@R EXAޞx+keo fxnnBw~Я.wPyT_u)02|>ZW, 1F|RLӼ&:JJ۬! +/9 %ܶcȺ*m 2ܛDJLː_ -PRFwD o $U&C1W~)rҩ~S$JzO6 u_ۣ4?d1_2ج^sjUv-&1h>cr76tkԬɱEܺ?h> WlW +T)tA+Ze:'xck;+PT&YR ŗ Sa +Z)"cIT5 +`YMK\Qi&V0!w@ᯧA}jns L 4ifJ*ܒU8eZoûz:YU;oEtua]A6cn2FXvj/NkdϯbdM4\ccMꚓL,'cۣ;;xd:|#-$~z]b'߿F +o +H0#;멻 ~ iXGT6&H>eA4kF̝>1>°-hgJA1"%p!K8b}%Ut"Li+SWw^r%q@}ׇZ^Fյ#@(`J&oZ#s)Q+Dޅ^L>P#U, )7بoHg}XדMX=#F"VpDPeΆ;J/SD'5ȋL"zC+ջLsvZ@  3# +K>WWkAQ޵nDţ(ycS)"EcX|x&bBKo6|<72]c3$o{ucm_wi1N_jlp zEo!2:w'ױ.g8dcm@EFQbb`:3ڭ߫C -m:t$hˠ4 ^À\yzu˧@i!m栭 A;dQR!yB/O.N=-{m&T;yٮiwU>>WHC +RpBcRĦ^pF{6dm +դo)/SzΘ +mrHVvk*}Au\8&˝RX4Q4Ǖ95e]uM:A4p%o3 h*`fcpK$1HPqhy θ2w$'3cV9̥ "vPs^7zŜ,Y:ZbouAK&4̓5!0%X_,;}hXho')M*)й#,Y:ͰDO_"5^'v9{m-ΜSPB~4ymZtU_&en\%yL&tP 6PnͬDp.5-GMqa*?sE `*qO1F2L 8>Z0hl#jI&\COpٷP`̑GX]Ub&K]|5C!r͉Q]֏8G]QM-=ov[f_Fpq<5CXHYPh&:=M(-(v&XIS%D$BufC'Uo_kkW4аVl)NT )^"[^'MW0`ޕ{F#2H)&q}rzDnHLrsWL3Xɱ#:uVϫY5F9ke;gLNXc $[% zGXq\e w(wd-Z=I}fKGl4zrݡr1[8vF2e~.V(V_R~c"yݦA*laT.r,pJ29pPEmeB9YFA)qAw54-jNݺ;Ovi&1uaKْ(%N)ri9"(Hì9=O13P$BQ +FF"-<یӝhRp>֝r +D*i/qtgl"Qth\ۓc =kS+,\VU +Cj[>9K,te%qT0ǿz+>ij\_RMb锡Xha+)ǜJu F:`rPwĴ8G]E7eo)'2nc!G no4䁛+zV٘AH6IڋI}_2zQw\;p/Nl 9_ӎ>8*%B'OaZN71H`K7t!R*AZ73,9ʢib=Q5/UDFMtQIxQpAPFZ֚" m`h=oP31r7t d"*6rmtI02l麩m-@-d4l?uu8X"J ۦ`_(M2)zdZNc^| +K0P(Sp +'#g^i6b}^ WɽKrү0-z$S,^P^)8"#uv.}wZNGVBÄ-ݯP4s^F7V~F)ū!L %OX]KwUa#T:yZY@g!?Ej<(QXTr ƲA0 $&QAs1rhx JsCG?h␧ Ú{~.W&PD=D!j<;A.@$1hV4sg4NvGnW|Εtx{nRJH \ ^Mys{Jj=u`!WdEu,3άeR /!jugAYsc\r%yt~SՊYV@7̀ s47Row'k2z"M[ޏU ˓to?̪] BuQWf/͖yMx;c# +]??J8q>+[!'<2e֫-w»AM^lQ#~ zG-5Cgt۟be7w./|IQӡ =Q Rkl$L<^"%D6v^ 5OxОv_/U!^ː1 rB/jS$HYF.Ӽ'X7s J@aKВ5]koOZk a3avw3H%g'2<@Wv[|]b+L+s>oNff6oCLҲ#Ay;Ӽ3 'ei#-2&r!b3\4,eC@Z22_*DuGJd38n K'_>Ci-5/>-D2zJfP(ѠaTqΪ9;@ÏDwlo%}ᑍ@ ߘ=WNs<2"ʬ1Ѣ|Pmwn + +ӧ |aMs&đ=ªZiQbIT&>[`5ҿW:+~`KD U&~SFO*pp5&W#aV5dV:*2Gޘ@1DQ1z0f"#[s9Ӫ\8LY^>Wy6QL^EP KgmX23N%q +-n:h3 `O՛7 ٣`%ud F`J b+"Dȏ?Z1sboe`Swx뵓V!o<%aby5?2 endstream endobj 3508 0 obj <> endobj 3509 0 obj <> endobj 3510 0 obj <> endobj 3511 0 obj <> endobj 3500 0 obj <>stream +HWnG}WM6`v6Ǝ6q6#r(͆03CZ#6-J ȶԩS_0-Ƙ`Y0#!/6?n}w?xFf36 + {͈@̈́ Hŋf/qn ]]g}]]uA kB7^x$ *V}]g'=$;&T!$rhfC<$ΒR<"!1y xdKupͯ!ݠܠSŦ^6gUGY\d㥠4#'Oؠ!U}^^qr!w}wכx@Hv{2/?r2'g#j&ޭTBIQ١afl7֖1@cum=A\&gmo^^Y RT,'L__޼|$%ua~ +D_O?v/Jhf 6E!z"} Eq tGJQ`\GOGξ}r W$K:Of{ސJQMr/@ēL"+7 9;ԕJ#-2}n;ёݨbyA D )Q%IJ0 c*/WC4ǑJjScy,LP` bc>AX mI|$67c"Sꊅȷg_n2 +W] _%Us,#OUa 5y`b:)P]?1j6t.wdIrv{*"̹~HRbIPau],!TJa' &\dKsSvȃB30LQ5ElRT R-t_dAda-"7o h=zidz(E\웚SdclOu>ySs}LNYAe?>*d 8U^Òhρ,oh_Tz""s9xc\!^%V [i:1"@S^vEԠX!zeC,}S롤 -YGUnrIX!T)Lg{O:"yD[<rx6Kl9U.u_4_E br‹nlǶ۾ԁ@"dA|LTCFKKJǞ@5bAr+Ҁdlv˗rZt9?A5c\ʜ3A,3X=+v }s7Bzgfb +c13>]-W>h2 TeD.=UY9K?t-]lV~=>mrh嚟SP +">y[.@B~؃z{rʪm`,U +D +qghq~kpazuVjxuR:Ҷ⺩eP% =gvfėF]q3^FFYKvڐVOW?=֦dKCRZvDymD\ɢƔYhR8|vwick!H#RԸ"nw%rFh8 b%Q[^uhS<effF<+zy~2uN A#0}Ahgmu8aHX;ewisEē偤ŢleZc!d'mA#BD/;% ~ F 1VAc8}VAa;GqCB&fqA8ڈ`d3Ģ~J3kF N̥c<FfT!SyI '|}'f\B5@wm %E(+4Hj]mv 7Q~ +1Eu + 8:IUIg0(me ~,&Bnߎey&* R~}wfS]q h5'([fuY̖.v h~Sör0Ls@`v cswNv-6~a Zs^DKa\@D س1!^y;bx1'6¹!'{1>+A$˯#c]u"]6'*G +G;n"&m: Wy6:v@76a84By}~PپY ~L: qgC +u!I"첰VaBVj -X 3:BbRw&@%J N`xwu_o1-> tcZRƎVJL!ʃ@q\ɮ>F\oAs^%m0WzL +ulkLN/ȶR{KƖ $zItI Ὄ+*RjeZP%0gSI*u/R"AWŮuJ Kݼ"wx%Rn}ezd"Phz1U:-+vxs!yxX!鎄ib7YU'mv݈ +Tk{bF׶~~ڲImE,A:H?:P;IRmX..bIpM%ǀ %#d"rQ`y15)U =@i%9 4m^2^kȱmQi, h:c_Dpwp~5z<̦$1 #m [1R@(+g&]W Rm&+I +3x +]4@tS@(="Rv ~vo38Cۋm]\hGH ( 2kqbX`(c6V/n/p1M].$b Xe Vp4>9qr{xngH:4̿f|o +41EG  آ:~D@l +d3jAVY~:.Z$Ⱦ̅Yթm`҆iFv2 +̘565e dD{׻Z@ +-޽.0EVw $blK7* Eg>zI]ɚʸUNێܯ*ܿlV iPP+hGnoraf ,8fnf`~[Ժ:K}`+ә=xhgU ;OiF.@W7W'H;I2)ANy;LhRSLV2Y2_H endstream endobj 3506 0 obj <>stream +0 @@&b~ @_&iAT+UɃ C=m{<g$Њ'Q>M'.[$F4ӪoI3?Bsþ Ш!gNM"mY; fiTh]CZ ׂj D) ܊ᒫJ.&ߪrdnk,ÐgjIlN_3otE?ܬ_FJ^ʖud +R*0 !e&Z!3ʬ۶:N ]|w4זS?kB\u{W^6XLSsPlBv[:l>>;,>״((_p[v|pZJQ=x?.U8H gcCTHCvm0&,qvv48KJz#vTx S`ˡg=:b"8gI׽-h7bYD{4;iItGZg_PgRW[y<Xf5v}ۏK:<|W?Tڿ;nx `Eζs,FBȀ<'ș"'jDu;r,$0œ>O.)NlOp@]r p yQy8럨=~l͍91uA +3&0p*O+A3%AYiZX;6&xO<0UiMW'sILUԳwgI2z˚w" g'pNMĄer"Q ZSB2^y1npObmt:Wýs*]FNFNҒzMl▊0Ql *'ͳ0*2" y/6du,w,4iayQUCW ܿgjlG ^Zݒ5mY,uK^L"꿣%vO,zf$l#ӜU: `8\obĴȤs$ WC:>;%(7&/X΅糧FHYtYk5"քͤb<%5ә4VMZ-K~r׹XEf=v-`T0פ'jZ W(rzޯ4&4]snL#ug ҃^~GN~AiFfHg*X67nYvf|s̒l7 +gZ<9Il +z'-5sHJ)$C+W@Y?xE 3}d4a{nk,-qlչ~ye- W۰(SLwdJwR ԰ƌ'%t[hF0 Y2Ïoy k<wm\XM i7r$&AţZ?\!<>Tk0‡ v_?dzCa )kī[Tf2=u (oC놼R i׋pvNE݊R +tKI G5m\s"gTdLx c^`2~xnp$ S圵ﬡ&+<-q$F$X903XpUʧf[ 'V:O<aN<+jVSUfhEAZ6pZb|a8> U.\YH T y%rh~ qMǙy7{yRVȊsXWj> tt5ט*`rw =cA Hݽ{`rnE0lilYd"yi#1> Փ-ă)3\,.607OoY߈F:$x.CLSD:\g4tjbO }:@>'ѵ'CMsk1C/\z /4%.it?eNM􉡈n8}p'ִ,I`5ޛYQ(dAP. YvqA~Xc<+N l}e\ALɛ2+l? .-\JXK:nz]X% RA c3vX8wAm Ix(l(%*)7 n1)7x!@Řa}\B~FMc@A0WVŤ;ɡ#Wqs5 h$gC_m…XsY@S.T'{?h{g?D4REC VI18$bQct?aUR0DѢR֜)#O^2`Wz-m Z3`Y,Zneqs㎀E.B-D)&#MYZ;ʦp0:cSXG-1ŠdDZ8GcVtߋSO #B_bꄙ?Z] +_V gWܯ+)8R:e!@mDk;+ӻNa]*Fh@2( +DL9?]pM%f<=Ńܥ^Bi` jmCKiXI 2 W]BL<'IS0Ϸbo-n͍~\NL-Ժ}`i Cz7S{m $du{O`+x Mg=_/G.I vT8)]t#^ҝg ai~[m &7ju0 +:w"k ,H١7u&feBΒ/ +`/kߋ%.%Ԅnԙ{1unK#\tjfȕlH)R)iOjJ6^y-Y#ih.@-*ᑷ!+ i+]z,u@Hx[[V`ɜUayL-|3j0+!"S`Ve h0ۀf2@WXG@-`Sjn?4; '~.5mz_˳[[l(Fo@u|FgB _4MSn.xג)&A)\~[bJ}NJMg?C[GiZb v!s\+{pVi!ot+jOfT|jh^; ڬXMi|HRHh҆=AUpyv/BJi4>Q-&g|'5/H 0R]"whOÑߧyJ{f}^"$\ؠ&IenrAAP9eN%b;MDxtKc~S^a#_.HsީqHKIH LglGstN]FE-Q&iaxo*9 c&rCg _)b9tTiDkM؄ jkYܩwFܟzVr<,oS%PuITuɶSӂ:4()L 臠-.$ݐz\츃D +q-BW7E.ƅ6yy)Kg͚^ ?;`dv?G_yՂ>N.2FpG+6CKKu K!G+h OY$l0xG|.*yc:i!=Coފ&˧Vq}99!3_gh=>B̝!X$-kP54;ukYa[tdJbH])u }^^bI3 /v[;x 5)y?\1OKߍLZgMkl3p[Hĩ +c`_1?#\>[{* )ʳ$kv!ş<[B<ڻaˀ0ZlSXϘj mHpE@ᰫQ\H^pb %;Ąs4ny^qH|[fw\}ZmYܯ"@t /IrP5'鸠Н~LwGKyq%n•H {'iԏke'_I=]*ww:8&.)IbZAƎmq5f;y>` k +%h1N A8ZD3=[,}GO()n^9'+,üH>ʆEyLA(x,lj 7C[#ư]& "Jqk3 9_6OoȅG :y7bg >~2|*l0­Z/)LXF,Rf~;kV т\N1/EAFz\s +I謚H Zgr.)@h=Yb-3;I;y@la#wB[3|W%ጇ1!=)Z1VW3导La*ޑZ +A4\Cx&8x`Al_><^д%XAZgZhh2ܒ-mpj"kƔrQUZ0P+/@cUPVZW>U~4R\Ă\Q(vZ:qGU1sGs.p$Bm`C*)dȺ9GFy ]e:lqdk&+e}CX>< -i='fyh!VET LD~scƬ( )1P\3&Odxg=@ӹ<;VB4 1mt=lؕ'zYYUvy"85ِؒX@z oo |j?/ qKԒ.A]&8]= {<ܬ:n.̙Y'aK '#<ﱲx__k1ZMdszl8ENjL4M-:u1N|66:}A'Xb@@LV1nxk\(BZȗ&n7rŹJCGӖ~7,=(-  ^bw,:e 6t +aUmw aeXŖV9Թ+(E/>k_}|]k"[jԞz4}~f0 ܚ|(VmHj-3 Nϼ,R(ߗ=S8 83|QX}@:CL&E=zr7i翴 ]>UV%A3tQ yt߸="ƽ +!%Ak9[r uՠqQBѾf:O'!Rj$ $AvP-z~ \khS$ߺuRd@$^"kycƽ:2[ؘk=ȫ JI~Mh)NG_{שәn +G}"X+Tbfq z(<@Kso"I9Z>F6T0SYaA5Mug|= Pf +3j9?^l/8? :PѿpB&V)S꠬;.O5%z("suE +~]@&[23\ԜF>c x_:.J  Cp }HA05>P , _|1/˜^)& |A^xP0Xt&SQUCcUyZZŌ6|{3'3NZ H1t:.7"tdcP_WUZ m(iոȘ$y7"OacFF'ewq1}B.W7c(FX C%x7 l^ăƦ"N@f>[s^+ 7sDm ]U7B*ۊRɊ{d! /em9/wGƆL>5z!` ;E!V`Ɓ7fLbT迯T[V`1vTN!_r!:Rzt?c& Ku: +ş@ZT +I$Գ'A"6bdK?[cO_rڗj{ +v +X&Omz.ު!xi_oTڻ&Jw@|ş7mtLm݃ϐi_^wګ(釮D(R+Yzf]"O,S(#CB0Cܷ*HsS%'٧2%xJPJkc2p>8AshcӦ^afSQ^B>ڑYM7Os$lMg9 ?7ʹ| 9L"% F +*d"=Q@l"fv +S>!.RG.'m#*cF"΃djy炉yg&/_6/ĕlui#?svZ9paXgkU+ +dS|oכYKɤzDm;ysy]9vnXj.]CJL/:MLiX̑nVzT󂷢}b@rT-d{J(Iн!|'69E(+w *sʯ6*PU&+P>a TYPivF#OIV#@$WT7([VocxOJ*UH(@%@n*Thk'  +Ƴ~0% +g +~m0{<*WH "{Ȑ@5MWoP9`2d  È:.=Kr#[!>/2r]J]v, +(ƮF=k`&C̫IسA2aF u(’j^ӫH?)sRdI=i8o4O +-{c*J2d~6&k-o]pSG?V_~xz1m?u&Ez`lx '8ryu?AXJFhxf㋴l#5t4C$^WǕ[\,~PsIju̔z(sv+"J<R+)k;k 4 ͣZ݄ +_*/ 쿲R~XRH],Jg|A_Ç`^ +7Se +-)7sC%x;T^nUHTͤSTFNJS_5Ei%SڋN!z.঱~6C +Aqv7s'Tjo&&RH:E(,&wg(hÌv C4[ :]OBeE6WhK26 1ƀ:[;:W܉Vt$ 9s4U +ۧH"w> C(m~/#&׵X^+t=G\]XRI+uth.#꿟LQy +Y/M +f`Q*Kb{DBWj7h"x*Pp .9? :tb(cܵ&u@jZdA_tT$\`@hۑU\wdq聖%?LVgwd'+GZ4GHGhn_5CcDֻ8M^GK*TA@b!* "Ƙ:Õt`AT۔M?/LR!/[ɂZqz0R\(֪<$В,4YP 7TG8﷉Y|j̠UyFh޶ޢ̞JҬR{B]`2L^9 ()yg]FN[AXF'#ykX"4_VEbe\BM"RTBJN +l +Ґxbb#Aez}F :a!n&IsjY"p2аEx9ipQDɼcSp#'7sHmDw=D/je?JŠ7-{jlRw;"msQeEFw},9YiPoN *(enQ * nL8EKvԐmpE2J%z+m)2p(+=U@[Νu@Q1@[i@W h`P+=1),#I/?qn=ցi!pUj6ό_ nՋa"+ +$3kJLJ=LlsPǷiZ9I\hHU+njsB/Len63D@ɂ?\󾇗-~ŤO!}J$>YUlwpI!vk?%ܫ( z}slEFHZ)1d4;}@+ }}wCnǁFsU;p [IlIқ㶓86Ůoo") S<}@@Oc+,zޝÏfHiаj5pFبӚ F>_3?Kin =!nYΦ1P8}Yr{WkW+ 5!&$$NK6v\hT[C!k B)uŠ~SSjm^/Rmmy+8:ވ^pK.Sxz&OvպgcƳF_rdq+O@>*pP֘_ zэ ΡQ1Ni+Tn;0_r]/k +^u EªlLZqUmtXF0AVvlqGwX#7o&[ Z><^I IjI˾5&Xs)Qz #\#$)qz]^jn.9Z8]ab=lQICS[miW8_h2]* aZ$jAўuOB Ktx^YCMX3cl+iڲWh`4RӸ`j|ScC-jW%riH]~X eo썉:Ou>+UfY PvBɅ[s'OɗCiq55Ql4x?sԣte@R/x[ʏQ.8U_ =Tq #4ʮ5Fܙ" ǜ$k{<=7̮}|/[!@ %'XVN5.3E.3/ 'R[{Yt8,M`[*;OGݫcyxAbR&JT*!ndn\;K|tp8e?z&,ubKY5+;-=C(hGw^CIh5P5`'>qOZۊh,V=; +>4u^Y@Yp2) !ܳd`' ̲^8##:j^w= Wb;:EMzK\SХ:*GlMkKpBo0qj<kd } R2Pʥ=UWcJv t٬ "W/%~9:h *cYLYf^m,xbKyufDRc3 +vvx;jC)#JõuRR + z9f dIapA/2)`RKmV{chK6O\}V 4^^alUF9$S W{I/Vߦy4qW$Ж g(6XޒфyD0%HX=der.\ъid1J[ jGUH9M{E \K4ȍuoZ&4'PA%5*~=TTg"QX +eAlijV3?>(JM09ߌuu4m clE E 6`$Iy bAh;qDt%n(lf.y>uJl\-i19Q՗SG#s^sL_ǃ:%¯o-h'3Jsd*+^4Qmo]x/BBgmԏaqPVؾ{4iyp5I5U- A3,ޕ"2p,s]j_'+}IJ[G}E2v7cied穘bW9YLزH/ME "mcT; +*UEۦyKM\$uO\z,mKq/e8VĐLf2I!a࿚Mƴzߜ# t2*DHWWaܪKdJ/TS$0h1j{*=r)ˠ5F` +pȽ3^׮Kn_ N" w`W3ma؍Ạ&!\ p"R?(]&6]QK396%N)Cl8 )nb1- h>ɂO`z6^Os3 +iH'k-=f +6B{"rv }ZH#ly`b؃XIQ5uXrAA? q"2ЪkXƤTz53 )[2MS:W +p3 %.gf#o(lICfVX? <ț̎K'*}Axtx$6֠)(Θ_JΌp/IMnbDbHWsSLU4LP)bl&o~@u()Dib-xqP*{X|dww uU1{AZ|L?miBJ^?mWbUH +#p{5k6nkHdm$9YO5J#$eXFydU¢0(>sH<5z@R}eL$ D!~l̈́BAd3 MKӶqIKBMcuyP)54!6pH v$];8U/.~<*F<fv!F#){"Ggq(,6۶W xgCe/މCy#:x* +nr#= AM*?ʱb SJ\mJ`uW򾝖c8pӑ} FpE.q j}&%I8j5hwRМ2$4Q[ݰYiLوe҃^(>s 㔌`Z~ i5&E lqNDSbe|-(<7=U'|U@&ݼ9aXF7D_h7ma`&&n06(Ka7LKVGT;@[eI@;LqWǿk1t)#|¼dv*Ԑ H;r~7xL~$LW~GaT}^jW3ĉN\?}0 8+ORy2x+h|jvRy:jE=NJYLFocn҇]Pcb}p?^#q؂_jXn# -}"9!o!6ߞ1~RT؉U"<& Q +WO'D!GgI1I +gL+g=z`opM8aʺ.N׋Gyco{ZGT a?= sbEFQŤ);g:vּ2E$|+x~9.ZbV 4䄭rjRvp񯾒RiQT%"2{b%w{CHcyXGQ)i |`WSFûDŶ5PcRrHx^Cd9]t5-:=!k'~0~Y*}<5ӆSْ|Q*suJ]D>U&+I2(/ߩ{AH2EMU)QAL3y&5ri1Q?;i҅gW`/JtPZdQ Ϊ-5mB"Y9m!5XpZ 0*z"`.] .V%gգ TYy:>xr>9D`k@ɛOMVXřQ8GUMa&wq3*ڬA D +;&l.g'JU s|қS 'LBX:vA< u 6'QV0^21m +؉")72v0Su~ad ­ +\ln7aeHҦ9g%Ww𣁲w}%241q*?R!10۽ZVs'Pb |%<[ "0>\ ?2IʇBgKЊ];AޞPUAE3(|4}GasP㐭;k$6hAԹDN[>`4?5EY֋N: +ЬZq;v\0*[1@,srv8o)*!A̾)p5N5&wN٧Lꁕ\jTڰc¼vaN#Y}0z¡"RMyIRth2o[yE)u]X-,-&q龕;3VFp$V9]BO+x0t9%!ae# ##x7we5m#y#IHV-:?jAOj͔3a$j}d!y ꭶ ׊ѥ[3ޕfKUslRcwy 4(-!u@CV65~bK՘3; + +dnFK:sB霏I*\)3~\O458(BpK-͉JzL)WD=9R +, 3X\⡄0>ƴ[`!]j25dsbQTm0 깋Jχ(~.']cgK^Ԧޕ^ER8yě@=Ü؞*B_1Mʁ5Og +5zHbLxp(Q=o']exu |*wAZň,5 h̨5-^hƄf-P^;W:Tjev@fڞC=tIao!zHC{ Sh(U]a dÇ+4]!PPz=]`O4cEIb͟ԁ;{NߊkL%1dy_>\[9ZH +=#`Ohn覵>n +#.'իVVox6؆ qGP Fxo us~?QM>|XzW˛FGa +Zm^hpwU[:OkMFWTIqxgVνIjE 68ЏF@Ķ'`lgdFP>Qq5˾ŐyG1ם(z-L6*3G_j.Hr@-+[fn\e8F:#Ͷfm1Ȑ.1b3d]}NmyLyYwBY5x td ft|%]4LN-FrU0m9 |Eop92÷aCA":_tPG3~_-KIá"ј!t̢ne|aA+/r :ǚz9zmҺPEz4w۸F͋TnXcj֎ݟ_tͯ,y{:Q{b5`r T$dDl*O J5w'R+rSYO)[e(˯:\ %{~ԳnI}=s5A$_/fR+YzAA03 qdEݽS&4#7IK[Ĵ)5oEݨ 5R<8[XP /}z2MK(?P?k53 ,;7zqՄ|Kq̏A|Xpdaő1[^zgxT۱JR(i1EZӁصNdЋ|½x ͠w&|t+/hd[̓%Z_6*ǡxik9nSPw`AÏ#yU=&o g>DDN6YkOTO_QpA;]gÒD4u171 :\[mZɊA_X o2ˁ4u'_E=6}BcS g4"Nc. ´ D>=0/Qh5oZɚ r<iU  +Cy$Uvak2Pj;5-ѣt.i= !?J_Z|Rs8f&õѡPybA.FkjЩAu[Гê:!P;71+R["j:B\ 5>.9P=OB[;w)d/}f%avh0]5¡Xb`}.CѬjҗI(E';Q:pUc zFN/=BKt"`͋|=Xb*} ]"z3gݕ4|B(b{]|gdy:6_WhCק.ߤj6JNx`gP(T].Xi 01Ī* BHbڒ{RGDk@H^=L-[ψr `NF$2XhIw ?Ujr)^Ђ ؋AHnD$Ϥ-+q=mӖ_"$YPDmXOV9IϴAfyUO-ɚoOdJzDjyw:qpS +o!ԯŖ_/6Dv, ,ۯ˴8y[al'~kPZ(`y}Ǭ_;$ҩ5+ )v=vxV߀*/Q-4@qk}xݻ3~oe%Pm7tˎvڂq.5/{GKHmf--ǕlEI.c' +V5ѽ+8K>􅊦""Lvs(33E㲺9ќGOuNm۲W8½?鹷<`5=!d.!s,e`+ԴgpJI<<W#M"﷎,څ,Gp O@\S&;k?)BB'SH1w+StŦ1DK :ga["h.{j"iE 7]S^tLCi +;** K7}58ȳEwP፶GtaKrƚ`A5X ۣǏ*[|yVcwhY+- CFS^G lΈ +@-p] x7 S#je(əa%QW9HeN%r84pB C@$#mhV AS~)}NEݗ\X|KÆd,$MMبj6:|:Œg!\ =5#&N{Y.c KoԞ$Kvn!T1Z\Ey#|hYr4L"(?{Of}--0+Z)ƺ?3&sdS7Q?( ܞN :R1ٲ2 +H,^g +a䬨"Up4@RX#bPTn D,|t *1MIVedfPa%5ƒD۔3!;Gjy%C|KVb m~9pA(d8zSO d)E&?Շ^v& endstream endobj 3501 0 obj <> endobj 3502 0 obj <> endobj 3503 0 obj <> endobj 3504 0 obj <> endobj 3505 0 obj <> endobj 3492 0 obj <>stream +HWn}W!@ecګXbH$ɒff陮ERAO:I)іRԂ?ќ2\q{.>47=;]GJ>.]X2?#,D懻zG>>cD^(nU'yfqbcnͼL+xQuuwչNsܚ&ybj">>`ѝMܑnM{,QϟM^b~`r.j_UZgQ"BkRҔzTx1nАBoVղ=GYpⰏG-g>]D;ǩMvݶN+A;,WgC"Fs[>`)i*E5Z)f|9@'ǡEc:RaSN]#CD!%*hMΆvL F6KsCóä_'NW_1o3 f%N QBHqpt +:<8Dey!? +T}"1 <\_# E|,C +,aTBZ|c#{ɪWQH00Q=SGVށs7Vӝf,]_9f4;p͜BN զA%izb͹?!)J" ~Jcx B.Ptxnu;8&b\XCaΔcNU+Nh4 U(yzzqy*f/= +W2W>3 Q*dFOQ$xF dGuQCiD+gNDxƦ]~JVGǟoGsZ +Ps;XݽNRIp?QfͮڐUCRb㜝\ↃrLmB㰴x+'J% B4[J94Y(U7rj tYaK:lÁљG ؑG ~ 'p9lsiOv!aKRs\O,Duò;nVKmwN.BhmVk +uY?}w*/dpv7K()ͦvdG Rz8&f=G"Ka0~Ͳ:ᣬ(NBX_9t(E"Ygf΀f~Aq~޸@b6uʯ-/`jM$TH>s[n5T9vaRJaj<4 +;|ޯvB8A; G^h +ZM!0sy_,Z(XQ;l9񁣤.4""|QXk{HJH(z* tY4R&ﮬZQفVD gge}XRD Ю`47J"<{٘,D6Yv[.+H]z9qUyvȶgY!ScA]7S|2;z_q u98"]ʝsSzیѱ˺F8)抇4;D<`<%!>8 ?}_rǫ7=F1^EX46 p@C!،ޮвKua2”lzQ mB2z.046CݒcZA9AT>#XXR7ðDx-P:+gO;IiWUs6cT*`K=[ZYHVzoZH_T350"g-#HerlZ=47@z)jο9**+yUP S !>Nj1`kUB&Pч+l(n=="=4x˫wYhPSˋe̘, +)'x#vF C3$ù rN|B-^pClf}<ōB I9n2~ʙ1S@xd([ˋ?fI[Z2^K3%9_;i9%lVjԏU_7Kr4)橭SW0t~xNp]"Z 7EiWݡB (c?]=XMH~ǿ/D &@zxO&&TGz>E }9fR:!sJ٠ XXNb&(+;M"?2?ѡ*{8z} Dxe)9P~s vs4ěcz۶_&m@2f8r# qԅbKΞǟs$&f;&/6s:Q` +O~U"k:p&Hqn +r/f"4iۗZﳮϹ + 6DZXLP8 +cL +NfB~b?Z:?&5q& TEK9g*Py.30" D 66Զb@F3Q$K(0D*z?7աھפ³>nRL4?-RyG:H_LVKNTLE ai!S ;%&mn̩`)TUWIyܝ` ^U^?r<Q1NA-Kb,u1Ѐ WF& Zuz.nΆUNX%ގ{e+GtXpFwH54[M_71%RIZ4VN3DlԠ f_[E)>q zto%S>5 z)`O_wׯ#) 3]({ 69:Ī!g(ϹO(a>stream +0 Q@&eV QOROˀUo 7?v6s6QN`ALE[{QBe$[QlCď_>}7Pek qvٱr^K5]oIޓuE"5ݐٕѱ FY_$@UDVdrNfߑϺٝPq7Px L=S_~pnbўYHN^vgDșE,ĸpY{[IPoHnSl9j<<')ߔ$jL`j<"bj D Z;|GaTP1TN +k~8v%2U3DOYI}ޙ17 Ff~PԖ + Q5 ū⠔< "P=![9Gx>_Jcgk`[47K;EOD @u@}ߛ}tzڂfϰ^%n<'U%D!QDW*>Wl_-m6ׂ<[Uk}$帥皲wsKbil}!z% Z8-dIAU1>Lh*JS+Ewu Iͥcɹ<&б%̸ܢ!o)wi㧰Lt腂Ѻ Bc+_|'CpO^ B2IE&C_&_.f$_g=' +2#Wk!s&y=D8TR Q۴àEGxI\>5i#89512[LkN϶ mqzӧ˺@,\YdEfcQ(v1#0hrW@Sw|v[c#{Q> y x83AM?5B4]\ ?{}!vg [׉ + { e?] #Lb^'X f_>j5M%pdEfOWA+7 YY1miPXQU5 ݽ'pthF,a[_ Fb?t=`؆Ye`P+|_ [im.-=p}n1"PT򇲿G]Xy$,I1L$ů4) Lqʲ"*|,M}RX$&)L>,O"ŸXI4WޜF:F +,P'Ke.`;#rM-W]p´nM Ýź^_>7zܛ5 ,27̺wNlZR8$h\#LkJr FSBɁS'+\"=7OǼ}" N ilvINڻ( +&q|hn05wm!\xËNvbEP1sh`{G䝒!08^y%ǾM>)@h-ydHQy*UxwGau-^4CE5E<7e@CAMHjwёUey,]Fʸo}AO6ÆJBpe͡$Y{^tƚ CB`~N-P4!қQ&k o^(JN%(6gIp\JJHGoSqivvQA{ZNmⱔ63-L|O8pφtmHlvtW ZjFi3 -38 iT,˳z Vqz{S_z$Yg>ջ0j;VmA!1O*Ɨie;fE~^`-zV~BاGo7Eas i?V3fP ϻo(y40u`|r8fnu}LoLty]Ap_wB8vo@/_&t$P uw2¼n-TԤ%bxψqYTڥc'#W._gqCv8X_qwENl;+¹g=PIZW29>SNFYAXSQ[:&m#q[[Snp@J$72BD1ScԙMm?g ص ]f-ԩ~ϓQ֎RW&qxFkjxCb^X|^[4CpAz3k.@/[R0}3a εzufs+:3 s% >iW:D +Yg@Ty?cJ{ȿ =q f1!d#q1cEW:o?in +AX\X1|~&wٽQxT"-䠿v `1B{<EE Wza=^{Z0k UgiA] +_ڂx-`[-'Ÿ?$bqD:_34D'ma@ w{zh'XHȽR@bQ*}rh9BO EDp4 +Юe1IhKoJ چ"̾Dn?v>S+,]P`&,x)U&Z)qf- + ghh1|ŠA—=l9V9()z%r݀pO7 9o08 +HX^0yl%NNoo @ k[[0{r·OfCr amiQNTasNj>}b_2Ԃ"lE= 05l "z=PVc`>W$QkoL -CR ؃\}W'y5ntO\n6i"5ҹ4<~~2^XOHDDtH",\ 7!p +˒8{kD}S1h/X7q;zM(4[CO=P' ㏉ N|tTeۊ̳`XN+fog[MkYU<7T1/7m9z?XtTnY)-Aacm#>fE'15Z67:;E|}Ѵf+ޠbS":+Ϙte fѣ mvANR?A}Rrc12mhӒ3)E\; # xG}n%cs%%|>/"1?,` +j1ܤ)xcKTpV/@Atnxge-.G֌lX|)Е~iAe'(e]nހIb rDz'fY0/9WNyi/g P( ݜowY5g|zv?GxI\ǜ$08[8_2RBm;kfVD4h>r vK tk S.qN3xzIÁ.)e{֨F5IYqoX2"iXd&%ה_AJ +Sl[.6KYocon]`A +\;3#m@B"fW9öM YE׸6gCO$=vk0uo[S5H` isᒏ^&* 13FWJM hH6WM㥄?[г8O-0ڎ ̅o]Z[djP;\x1G'E@!=j#/(@ec7maJlHzQuDzyz}'W=d`4$CzK+nW]e H ͬaHgtD'3ij?Y1#}y@ICtF#FTكTVCO"]'ZzÏ,gHdF{ g#>hH&ړ}SȴuҢSSTC:Der±GF}!sWѧ} GwVPvD%ad &{98C*F4g;RտDW^aH0HyY[t$ E?? Yҟj}9vB6 +k&0yݮූ 0NjLł>Gu4W~!EZR:hl@8Qa!& Aј^H +Fz&dWeD|'U,7i4E҄3@Cߜr:y#~7/ i&euᇆk׷g.p/O-ҨG7`j6HeEoF)By~i'5:+@NQa@ 9lϓwֺwj9 =|_P +sL<6(r*Ѡ-:cZ+d9=nnG+bџp% i)?1f,?A׿>b3=j#̪9?L/'M)'$A.\XM'߽2FS1j2~HV|xe@m!MSRYTrO:)% O"kGx`} hI#g5~qnCd}POzu+< SopY1}7w %TQ'7f}rXr,A~t4tR8fkG4 IH&gJ>@Vk +"pʅ ՞B W9Ԭi ZI$MoD:.UC9Ý;8쐶Gh.}"ۨnxMO N#QTYx!) e2ßg0հdve0֗w|l0v{ԆĖR0Jz(|P8 Eq! 7fup i3^+X9D:a?W09+]٫f3!,{<*4PR x B}Tac09{e3i-g҇S,5w,%f+Ա=ǒ koڨHm"`Fa|J.N{+Z ;;ԗ72\Om 8M hAAK7wS((N|;fQ{+u'*Nރen>Ex9EѾoˈK!_G ??,RSdgY[7|G٥~ Xf62Ǡ8hؠzl˭rpC `8L.a$C \ɯ!lz/Zf7ih[2W%BUAaMv_C;f`zaOKCioxxkQp6p<ω=ؠPuҴ@o?n~ҍ6Q 툑BPަpNA,xJnRf9aӁ f.kr/<% i)d݂N FgUn`Z7/*>@UK謺oW۬GxoBô[s[/"tg+p- b9G<ʒZia9$NpVZe Y:Ζq [s ϸwѷ}Mk(9FlXA5Vo1lmb<4W o9E%6^ Wm&CY#AFVgKv%3b1zKL>n,i%ˤ$k1AQYA]ѼVhAGQ-rڂ ]JU(C>bۻo( s5*w7q9 }7 xwRC#)LKVpfjḌUKdX/@|I6Tcy(EFCx&mDБwc>|ϪMPν^:a>SٸNFȤS< {965zRP ׺>\X3zI$eeƉųmMr-^U+Y!xK{퇑)#ہMf`wi jհq6 KDŽqU0 ZwSޛʑ1;&HŬń~E'9R/;ҫKGG|('=3vۜԒa1wS}`Л'De*݂0.IXmZ. 32C߈]b"qIf:A%fh]_['); 3 +*]aGY +T0lIQ拪𝘎b-ݕZ{]Hw'p>!s^i,V ?-Cl3 JdX0[b +nODIE Rp:Oz. +Qnlgeɧ +Qծ=N$@۾xtgJn"5!:Vp9߄u|jh|f\nezd?QHl=Ywt)K,X0xH\ZF#I:ŋ$_8~?}L+(j$ƎP3&枀F< QI!Iڔyx_eFqT<7\zTX;`a˦řY|l"'lź<3v%pW]TIY%k<߇$ 3Z tk$y)/MZHC`ocD@] N#FENu fj 9P-h`H*I=ŋ?B!%ҢJ4t$Shf챭1l;cGC#/")X$J_+A| +_[OM!*<%z_ `&e _Zd gWqp8_(<ʴCatR(:o% g˕RHg]wV-WẁzRIʖ25s0ͯ,RwtTu:NUby:5pgQ>m`MF:-g&v{7QqaEf:#ВJ&=ΗÏlH}5S `kOGp a/V`igMBq5pd߷`(~4?"k!3h0nLLe᫵4 r">A0 Tp`ʾ#T"RR~ά`g0a7$])@`'1ն殮$sE^p D]\PKua7qȁ҈*Dr6C8vy)rjw|r6jϑ(̤YiHt H'rS2r,}|}+\yDbd| ݛ/kURHU:19= @V?&u + 8NӲ=l4]ُ}AN}8"q4ix閁=)hKvGo\c@2Ú_mAS\i#=.}^y +4Ȩ NGORWLJ;|YnKyTZMڗ XKG*ON?ҕ9cQ$cv"J+ґF`x$Z_^>q1{Y`^xfL_'&FӘl`Bi$E0f)1*cyM :BW*k@^]$`HHYe5oWPW8,.DĘ#*e\;DHɺhݏ 7+V]ee/(re +=L7*`axYSU#<9yһ-Sf[E $;{oQPj6l}}[r|? u*WZJ3>c#Q$8*R,l!uͺזi|n鋑!>NwlVS 2Dy(C<1)qL>v`k@g" UEI-ݕ]e$֜( 0&tݲЛ]tx\StHߞxs1]ĒH9Y?Rvـ[%ȉ1:>"HF2liR9QgZ^EJ$QnB2ŝMqSh][+J?gH_+DJ\NdZ|kep+ )b\GW9̚L:3H)6 27/D%~&CqUغ B`A{powZcz4/m2x].}v?c&ߡNW19lMBt Gb-)lZ±hR`ر:7sB3mY0GN!3ya7Pp|bb|ײqkjG^?]` H& ~AiEq(2YԪ$B*j ;2 !Δz)N(jsC}^-vB4C]0oB_(W[Im +wdl݊PWh1sҺ$Z{}3Ҹ,@5 2pXP/H.; +2%&beÜ^FXɍ +cjA0(f>NGvCF~YLwrY~ﴆ7`[5p_b9:1+RQS.x l@[Ch3UMҸH;eTzKC4poxY:bW8֥-8_,TTZFXGǖ3hv|XIeHjz0Ͼ 08/r^R^71.Wzz' k9VWw +tF10nC?%oUMDq'pW@=-*w8ms㓔yb=y[ܒk`0D/s%ﵐ\!{N)e f-#+O< ub>~g1l:Sjʧ>E{r.1"F(^*q9PX9al[@?bf +^=T)WRXz"]L˨ړrI3zĠ+j: zAYAѽ]h -QZzg`G8u'>2Yݑ=ڊԻ~K.lf65 ^j3b)T*kJF3f,J†Ĭ$ j$5P @}m7WO9M @z+~qo=!#/=00%|TL|n$5Do72{6ȜlCo` +[;v7.#K8F/Ǻh8ПٛO"IJ6?7fyaB[EE^ DQPyiiW+v:oDkrtQmAl9+)oS9FxяoހȄl<S<[=pCW U{ =;&`kuAjf\#nfmHw9TXwRB(8Hc# +Pt'Xu\T!jh[RwO<G,VX\6(&9uwPلe⽒ ^E1B)iTC=E7'➴]pHF|-`Rs @4Kib>P'ȺvԌ h RxP8(z6_-+9\』e(+.&vg}Nmuv7]5e@Q7í8ۦEzտj h 8pȈ +_Ggysݜ o^HoN~Mi.GjT)*̇;A}-F=zSSFdZp/&$@2WiPASoV%rL}9!*U,`e$KmESU@g^Lk8ܹ21"쟧a)UC rwEc|T x.Čza6ˆhh Q,[QMv\6b'}r5H﬩7K9w61؎wI-6xQt[bqnfVr,C?ݕD^IħōiN 料čm:"jgjf*Rj5Vr4aMn`ch SIn7c+3Lt[+rD@k4@0$O~ݢЌawן]o<'Et`ЈDƞv4ĚxD!~@6^D亠*:w4OH݌m$>iN8KBVu/PFBz䵑E,Z`N(cy>xXy[J:Y Rg8^MHªA'QV:Lf+w9DI6L'c(lWV +;ܙI3${ wW:;LSe5~V3C2Rk ^"b\4kd&x7PVJ{&3+9m`RnNU>wHrNl^BW +?^b׏I-c6. B1 +<:ZЭ]2:eG}AXBBO` ysNy! Q 7գB̰<8r/[o +!:S5#)Hrϱ8k?E)fwB18KF@PAMa=V}8ZKHvLƬ&Nz-40tIX򏮓wR(e"I +_$SA,3;)o߾ vӘR2G,ivO뱁?^kF>_AJN~_ʿ;\fo }쒪Xa6WGwoVk+ˡ F (&rdo|(y0Ž*yy,)@)\4t95 e^fF\3]|{<O<=ɕ kz#_.,# Nhj%2<х7f=Ag%oAnBO9´yhCTbVk` + #&vfkW-;%1ztX⬛6P{U?J|h?Ξ环:B`dz=G2 )t~xˤKڹݚ'ls 4 kv'OmX^74Q&!R98flZ]l[~-d5N97&[3t4l0oi:U; .ސ%ڂpMrȝ0;>YS%1<){\zqHң˒懖1q*mK0+y,h'uqݱU"P\79)xt /,CBw-8|͑+Ύqvt,fca^C}ٜu"hj2H%ʢ?JG# c'Ӥ oИfX|A+)Wu!I,x>NJvHA [2!)~o=}= eLׄՕVG2Z )Hy$m3qsn5׈DhAa(Y#`=2JQR{_]*ԙsq˖X5 \Ey_ʒW%'wty }X\E<9T3-aTeK'jB_dX$ɻ P@jKvt>]GRBxl?"Rc:~vޕ]㤤Z0ؒpz1hF6 _qĝy}1ӆʰ9= #.t,Q7BdD$`to(c=  ňHhjC. +1&W Ru`e]pAAQpYzbQ.n~^ftK In;g3\ZȵbKŒ#s! \8&&PL~ +Gro"Ӡ` qYI iJ{V d~yٸ7DaT FXB]-Ʈ?6ɼJJGfyae7şGoZ]Dcb7g4  _<"g~މV^1ܗVGN71UMy#tOxl (r4\@5e|>xɫDЌgu׳=u$Ld‹KͼchYRz8C`%QF@,nl'7UEz?﵆PrAK@>@ |gRQRjM #2C.ěclB\0K hض@{AbuiaQB̘Y3?@J&۲$)(JE&b!nvRAC.gϺa`pj ^]>T!+yn$W>"$ɲ$䰭 +MO六DJD&{>1M@ ?\ +Hi'RʿZR1N w| gI&0u|\ +i^Gd9Y84q>}HhײD`U"K˞36]ƣn wSDF*8 {b$bLjtb\#BՔOcu0h\Ah`L+k(>=E0tJm&`M0 Axh⊭D,^UU_bЫSIF.AYx҂zY>b3܅u?]US| C9F #C+-`j1q3YeSBZ; bTPFi%njU|㠱K`Jj1't)OC!WՓ[u>_v3D3AR85tY^/+B%f&WZ"vsA[zk̮I4TVH5wv/zr:>O:K0+Tx ~\dV@>HWd_=tSîP@x]zO+j4fMS +#`@ZXݨ.4_OVGRR'5o_@猍¬#bmABڑ%1ϑzj)82DFYE`}a*Um8*}G-P+)!b ޢ9lľDË)1[ qC79ՔbE}nTdN%۔i!J ( }׬>J/Fx* xROń7.?{]grQ/Tj"sHhxVA!`Aԑ"{nIJQ禆c'"l0snE[I5u87UH`J6'UM^ڹNٍI;6LOٶi&’Ak>1>KLrr!sgbUgh/u f40Y,鳳휷dZX rio2$"[ޙ +ֈzG ȏǩ`{y)V3E^݌4S> 8*., ?8G`m@7,<Э83 99ns~emP=IlgGvt$/\7_Y5棄 +l^^Ғy0l'8x h%s!&LO=M2 ?{2eß쾥 A \#!bZku;&yK(T5?-Pֈ] +6fn,3fJ39ZXW]invP| +Mśu@b6l-OTrn_2C5;۝{oPA%KtU$%y?x?o)*]ܻ'6Qz?]Ep[{Yi_eD5OVqp %f3'AQ&Y990_V9eL֓f~ +:6JmyiTgv1O軈 4V}xx#"|ؽ +WhQk]ebIٔQ`úOB/&~^&!r .,?ɮaK eB%X=鰥O>lD1CQe'QOY NN5<#1Q5_eaxlf ő&-aqwtg +$ۑJP5 rsgogdnXSK4Z5UGf !'KBdZ|L v28t +P$.rf%)6ڐ>FCrU4`}*3ʓ߈?_<_w::j RKYLrGdA qtV]QlЛ cuZ1'gDQ ]EtI>&}.ehBPbPLAհpIy#dSE9p:bJs&Aq&^*jZܰT)~7%T)/ +Gh_Rzl +0j$O)2N4x#`}$;9g8|? +G?fѲ1{:I}ha1 +H߳-Ǘu߆dgᱴ Yl-`~Jt[ێp)%a7@ ;sc<7>d> j`)@IG=k)s"C'Qʏˀ0WWe45'sUx + L/`pVH:" ay Y>%&&/G} ٷvzJE:DQ„b/!P ܸ̆u:*G7=~]k_1`!<۝R4.x{UuqS<⺆_-.hWԩ M/U*UVC=mD|ٷ/y,ջwU ѿ0t _Va)iO/OYf-QY%Ckͫ;H-l13 geިө,$:W)K6FOl&"?VA +lBEV M^)LvLD-?y +_%lnc Hh;ڦ*AS2 mCGx(|Y;h^\~Ǿ,šsxJxEԮ%\=\UHU+OyNϸ^Խr^cXzͣRxe=_$]8n-i:2!qcdrHqb͝J,%?^ o>cP,v'³ >E_Yx!.-LRٰa}EJjZ0ȿ.6Qc)>D (/??'-=T +cǿSKtwtx +j9!D\2eq7kf"5)l.+z)p9x9ι飲dak\pⷽ`oNdY۽Ob_ +6uxmjc +_#MXלu\0Zvh֭wƙk\*7 s9׶z/8-9;> +?Jc;Y$w7 м]19>tYE&T:^_ס\Q&L_e^#sDƮz1}vT٣ komolvxI-;`yvE:vl_ӫtAbZJA,i>L/0B E;[/=OAW:?mIťﴽx_u[kf?\蟏{\ +RYL@ז;/Ce>7)!}e`Bۑ* +3gڄyۧ*G|!Ew`yb0A)\ۺUߏݿ}QX_m۷s. KDwDHۯc9͸.P +ԀC#-tb5HҥV3XBsB"c̡CS|r]UvAG/d43z*1e0"V9=@>\WYluu"`$MYE#0j=4dWO?ƚ?bPPH]'ce.J!?b϶Uw[9gg,kTgB3l{Q^KOH]x<< oX2M I <(4`h6šKgA㰑v凅J0 /8Mwo|TZЇxՁ&. &ݢ&hǜ +r[@\kO2V"SlJIRߊzq``7WW/8[/U_70CS0Os9IMEfnַW-72\^sy7XsR#$[dU[%g3'֢jd獒Ue ![ eH +l*M,vljr'ˏ iHx]~%&:U`ml$˿(>>[U e +պ;i<U|,6n*SB&5oмj22G{ucOT_/gu3khmYynlNhk?m U=|@HVU + +A[tX'F_Ša>N$)F_ 6 LYu1LY6ۓơ[bo;;3`#25~V5r8qC/(₎ގ(WQmn\ +c@)U}"եQL}W9^j&rѴ P!R?%َL@k!ɊཀྵRə&#v endstream endobj 3493 0 obj <> endobj 3494 0 obj <> endobj 3495 0 obj <> endobj 3496 0 obj <> endobj 3497 0 obj <> endobj 3498 0 obj <> endobj 4884 0 obj <>stream +Hd͊zy8 +>sRhF^#y QG#Oç==o/ϧ;c_mӷKv|~_oo~y>}~W=|z>{O݇q~?>Ï?o+~ߒ~;%zΏx߽w;>lp?(O?{wٸ^ PZUuTGu^5P5FjFDMԤU PjVjUmFmک]uPuNNE]E5|| _#_k55|| _#_k55|| _#_k55|| _#_k5Z||-_+_kZ||-_+_kZ||-_+_kZ||-_+_ku:||_'_uu:||_'_uu:||_'_uu:||_'_uz||=_/_z||=_/_z||=_/_z||=_/_ || ߀o77 || ߀o77 || ߀o77 || ߀o77 KG#(~? +?G#(~? +?G#(~? +?G#(~? +?z $߄o77MM&|| $߄o77MM&|| $߄o77MM&|| $߄o77MM&||3,ߌo77f||3,ߌo77f||3,ߌo77f||3,ߌo77f|| "߂oȷ[--|| "߂oȷ[--|| "߂oȷ[--|| "߂oȷ[--||+*ߊoŷʷ[V||+*ߊoŷʷ[V||+*ߊoŷʷ[V||+*ߊoŷʷ[V|| &߆o÷ɷmm6|| &߆o÷ɷmm6|| &߆o÷ɷmm6|| &߆o÷ɷmm6|ۯ\t;]~~߅ww;]~~߅ww;]~~߅ww;]~~߅w߁w;;|C߁w;;|C߁w;;|C߁w;;|C߉w;;NN|'S߉w;;NN|'S߉w;;NN|'S߉w;;NN|'S ߅w]..|K ߅w]..|K ߅w]..|K ߅w]..|?|x>stream +HWN#G}+ ֽ}h]C"%ZCE <ėdWQ=շ'BWUwU:u R'dEG3F*^6Ob[}fu ~}zDji@uDİ\oSaS|E K0fwさpǛJ8Ȑhxڴ)} 2\FoE|sP}_O| +rFg{D`-#~Щ5Pb̎,b(vy-7\Y.npQ%%Liǻ]* SPJSE{ 䭬p9H lgpy\o/:N05^4Ʋ.c[" +L%\EInP,J)PaBR}e9&{ +zה6X1cSŰut7b[o8C;;'PAլZ!dBbH/bB#^̸R=! `m_{T8m8(k2ΣJ4p 40j9;~ zaƧ,HӐR +mOZ})e]6kiHƒbۤY/|(̀g^#Pk +`y9.qQz|fxs.;|t'B$hP!t٢Y!l:v\-Ww ! u&ϋ_'%%nܘߋWKbQGjfd\2>*i6YBs"W7cANK |4Ie-sdk &$QrG\>իF;S!D /Dr"M=S*fA,h Ml ;@V#]NiYRdzf;֏jNO $8~av8 mvm XKIjb8@|]*ѣ%X= 2Aʕ PXafí4+T)-]/⥤( 3h8Sj&:iy=4鈧r> + +1Hde}=ʧ2 Ng4=A62/Vۊ8؋F{Qvw(K%4nټ6E+*‰e~5)>X8iiqJfww-@[Խ?@*n7"f~".ThMpļlP_3%8zs kgWeLG-v: ۔)0OP`(AȾR/v[' A ԊA?^FD牞&uaxi2ȹ\}|x#rQVA--nǫ'3(Oa-'8'&GE*g +vַ endstream endobj 3491 0 obj <>stream +0 D@&8  D'G\42(8δqvtAܯ-pZn߲mBB7rfazGo.b^/UN>YSgHI+ Xɳ+Ɲ.PRv9Ĉo<^lx /ҿ  ۣ<Êy-8w)\Yȓ}n?W&^ ଵpW!9eL8a/ *ɹ> rgT"r(ǿl$RJ?㻙/m%dGr|ύ߰gB-*(hV++I'iLm~8nQ "btbbUseSf%-˹`,ƶ~D&;p4,t@ 9bEY/Lgr8AXNcqFcZȯ`OpJҹ_AQtJ?J݁[.:}q %Nu#Z7R=m:"o0Ԑ/C)<5m ab+MO0YZm|B CqWI]@IN-ȆC%.YCl.VP.IA^͇g3ܸڄ7(`'xؤ2\OT1Ji{H^ՕʝDz הed:?ষ-~/{p"NKwHO%f6 m:l,K`&><ZJ߉6O`|"p}mn6IJVm\ gi(c@|9;+kԥ/iT@C2 cC cxr³`Wd- p-!j~AD{nyޒ 36:Dg[g,$䝄YBNYf{lZ8U}!C%c;mj}fm^jͼQwՂ%4'XD*E=-]\4o[` ;i +:1@aTu +_P (gڃyP˼Y~vbF}^:""er +2?; "` +h= s2@ '"Y}b#D:. LNtsB&/h#UoL@;pȢ85?c +ʕZa _˚4T[028g vl'=&Asr.ﯴ %RA`YW12n:p#PoR<6\^ !8WC^Ӛw,}o3:UMisD-\ϳw7{]nǬI<ַBoT`Y\n\D6gVW R72>*}GU$mrP_nn6ju_lO떈>hNe7m`[>}” G<'Yɩ?Fy>Zwp{Htj +X kkCX>LuSILy] tyFPQpHǯŞqZ 02*NUFX'.YF_?>z]fCѡ[1"t*xbKKZ@Ldi_H6\e uWOh{[k˛E<76ͦJ'yP({0}9^r=h^Ypeu0Y2h.Hu2w݂;Y,@uQliǹuoɀGw6ij:dȯ(=fr_ZZ؞Ywe}0 FP-5(_vAW؈ MKh-o+]KP䛇^Jkwq~ vM;%dAZ3lǟzgd\5zimT :b#te7F-aF!Ʒ]:U1P΅vW0nJVVjg.U&iPޏ]FVG:xx\PB9T⁒׀µGIa3Bgʐp}b?VU; be6SRkF=MnqiInEⷯi=֠sNqH H~#XDqr(V*n?fRBLת4ZqnH?V !^>uCyPP@i;]t-0g;K= ͳ#1j_I*|4~E)[XԞ"~ G +K/LdFsoGDR'GrcUM{f `jo ueYƶȂ& V'ZE?awcj/GK\bTnuK?LqX~1؋vfS8 P~B$$aBf0͎Ŧ~E "ڰGV-pS_^& q[H`M>.t NL-$fG#2;4^rf6g8  #};ﺍǞUJPgcB-OJ,{={ {:9ޅ}3;-9do|t@Ս=enWřѼ@LU;-S@kҿA~Yn܎C}& O4>ӜTm6v26fԌD7h=p{! >zO/}Uum\8mp!ho~PbE"SBU p?c^";U9#UD&m*up Յ9' d''S$/bݒOEZ%0(-Bw7Ӆ_h^ KvX^9VUg͙Gf"yP%ߎO e!19O FWT\9^Fg\`]K=hJ`Zcؒ?|1'02q]6޶xl\|j{0VyeKOP`OHv@d]S㙅?Ak^4mmVOk|^0a~EЯlrmn4.7lFNMh=*wx,+=~txdPye좄d1oGvH8SѶ-q\[Y?@ٻ6G&6qH*E@;t噢P9kPH`q _$OmFѹ+efc^D.,l#1=2UU(VO='yzA t/ȭj;7n/\KMoD+D )j-qh y\f/ 5jXQp4E:)40+n;ks)} (M;߂653N\cIcK,("ێ?8d#L,n-tA+wS +ӕ:Qn-t[m.L\jRI>kT"4'ϵ-ch|Y=7S8A )$sp<ߒSq%d^;Zgl`b r N6a'yb RR&tL3^(tRl_ʽH%lev]ܥ ïwWn4oX.} +ڱrj.mۭVuHHj;*,\Hk)e:Mפ;%~X:Pta6pibz7=G{Qxc*_AsVpKɰ5hL$i 2o7Ds(H-\n,&BoGSW?e9]!647N+fBo*ρE&q7F">GLw_4wn)Fg6j]n {PaG)RVڹvPh7]2GwrM.q ЌJ3XD#55 i:UwM̷`OЭ|?jΚ_vt1 . +0l?>1~.g- ve)? HOJX)Q/ D)˙, +3F +HIfj'(C_3Kk-5?Yhno '2ˆ2ycJls)YfS^Pr|`q2Cd%un|ҰU-:g\Nr/^Ue@ $)yR W+£nb?®@WU&ۼC@<_@΅Z3R* Jfv!BTk08v^7י6:ޗ! ,&z(D\xVQ4'0?1Фkb08K/7Q`O[ +#ER7̈́D2a6 M.._yԉ_ Zڷy˳e2 z)[b?\] v&}j/̃5kץzsH L is"ߋ|:jlNyg*K-njߘ!8l_$;JMKr,}މF_5vzVL"z4w +b/.E3VZap_+1MWpp*>1o|2>g2& B>";1/Md̨wvv"^atI@$$;#g`SG00c7UC]rH65:j]Vml[l(Aɯ0=ܴ+?Y\M9?c{kob2SzA]SX:.LTT' Mdbf]d#4GNUrq7)VAAq/)CPK2( HrPʶDc~]$b][h'<$&8}}#^ T/ܾ̭8|9/Ө`39R䦙Kfq,7}KVS&OPrw $;%}~;c[߇ۦ6sRwkB%iG$G4|D, ĿAB f8r픥ZlBX1x7QtH+4syM-xu^O҉ 4ƾw|NQ1S^=ek1aPY&Fȡm( +"ambيtDI\g|.xpk+Zȑbk`=s%"_U9U}]: b03#g%VT8<އ:zT#'f=PBsKI?`[s21G L۸DN쭹p=4W7gvƀ%:8E[Xkw83ya/?PݖU>jKvxh-U_"9ĄNÆԗcV8%J/)}vԗH zb4i~ t6c[FmMwrE#,z fv57!U VHu\(uU ͕R-sP. l}dί8k[+t$fK2@B \ OYIm*S5% j4*Gh"QUiz\^Yjf G', Zv`>iHi*Rx6wo@n Y65AKҤr**L.K!ZGƽ( +,aAwԩ=MҜy1u0J4@#>YQZ ^ b?eF4ZVc.~skTLP-wBoan=)8Ưk\DH흆&O\qU^sO@ؙ4hT{љL>5t)(BkCDc!#(Rc|&m}`תªizOfIV`pRz W&2m1h%V22˝鰲 +q\t8 E, +EE1i 5\ٜ=5xd Aɭm‰v1uW9ƯbS[7lM/-|< cOFg`IKkۏñO0.hWti_ȍ9 P aBXtx, +w:cx5 G6mX;%t˕@[U^T mvvJj:@-߁caY8--޹QijGnsRNb)۲gM዆=c@tI5*C=cHUIЖ`VlL'(B~Wƃ`34Ckɺ,frU$;ɝc$@'X1^|+!0I16uqO+P:bPh{h@!~=ɞLIƲ_Oc̄ViYZݿz ɊPTY +..\>MѡаKGj4ɭ cx&hA@On> 2B 6'l[qt#4-2KCT3>;a +"cch9%kzT};x78.:q'bG:2QK|=sᡆ0=\&/9ca]б- L2<㜺ft䜦lsyц VDgiE׏I> "]ێ/).^,nD Ӡ9Mr@|p)wp}؞vV?*U qpS|mWS%A` BkFG氘In{F1J!U/?J[֊84+MmZ,Υ8qD'P`@r򊖀%w>ogޑfYRQ}z,s qáޘSo-!)z[jmR\ejoM6m)5?C.wk1k`񞻪uaxuǝEvIQAE aWգv>Iz ξ=(G֟oi2.x}6JӤ +s|ciP]Dmpp3S08OmUT(_wGC˧2q^,hX ;Z@S(NjhP5tK7Jl,s1fFr@ڑݢ{J'!(Q5޶[+#Z};R_~? ’0~`;Yr! $yң/R|]0UCH]m +ݸٽ$ +R CaY'{>?J_Ċ&埒!Up^Љ-|kǵHl ]FؓyyKyĚ={{:$jFJSG{,K f. +5fXZ:]':Z0g 7 IfmkPiXEO,ϰCrS"|ʞ9eĄ[y^TZ_SXmw˃$%/D9 #$tVC =hFfcASQ،c*R^$gDύj4dji `DOݛ@%XVU}̎F)Q1IR +H ް4TUP_9g9_lÂ+!5r0qyhl-vOaG(jm[(i#;lbtx(I 3{7(VYV(1dZ s,f0ls(>4Lhe0&"G8gw,)"MI]̃ZMrˇp^8?JY]lQW>IĻڴrѤ+ TM)@ HDhs sH,.rup};kt|NRQқI.9ή s7rF +і &HZϵxY'C;*eYP蟳/d9PRUMۥ_ &G6*R޴6ĒoE\<Y۹rQm5Pр)^ʛ 6MF'2}lA~5%[Ϫ> %Fܤ;Ruvf ,OzTܚ!h#:W=U:0IȧIfYytz v.L9QtLI朳'RἙMKN;f֎tM81鈎:OΟë hAՅR9Ւv Դ0N^,J_YPHǂ o; ^H3]{ܥ H|t0Ԑ3T9[alP. GV6 ?pv~ۿk5 ߆ۆ^܀¥CPM [WzFC-=DrBJ=]misTMEz !EY[G= ]*+[wz*cGs2%}ie-3Z\VN"}(l3 hYe &k"yF\f9y9)j{:J`;8µ?FHUJK vqT_l9vEdC?+ޑ6kxA4$ +[6fRf[Ŷaj~@ۇ7(w;j^x} JRi6xv;78r[%¾}n@Оʜ]4R$`Xf ZKZMysK*Q#>)nXY6,<@Q @ uu\\v꺫i񦛊 +,EL0rxLC!Oֆ_Dl)JLŴ|XÇ,G!vAᒸ?t"s +ѾŵOA$qk<mrmH@D2mz@!/e Fu܆JvmL}q~n Qm~^iGob]VK-*]W?G~̵h_O)s`۟ B<_&5Ue7|!*}뉺җa t^xνRFp+γluXP7Mq +gѤXl[ #}TyWb`M9@!N@c\);IP3F~Ɗ6FiaAyY<`30F1!0) F%}Vf*k/QtuEQ?Lk?F%蘱^B2dTr/5~0=5b<oB3Lqo+{NccydMx꜇g. ܎,nCJ IL Ikc0()}M+;b}}P%D."?}G^ .͋pMqAD(It7˶y];48Zi,qoiKͨt28UIPC}#׳Y3Ѓ8MtHkiؙC,0' +R铙ޣ̸l6! Ca)͵ߨBRJngk[[8^;O15-Fz~Vǖ)|;w+ ;re%|8fe5i(+죀,{5h)Ixek~E:$v` Gd:cOf/ zf oIJoH925y< gRTTW˪mV[r'O-\ο-Vd{NhQԝ\G1̢{1Žs%wD,NH!*`qr39ARgS|1B?5]g{MdUy+!hΟEm?] [k 5>qQ N_k|hv@cj+*Y6z{tdd+^(Y;iU $ߩ7`2a.v1+ 4*}\K3t0Uq:giWlt ot\~Ҁ̳q:eeW,ƐsV-`gF9" /=[$ fQo_)xs XQIØ$j8 e"+dg颛gFQ0&TRB/#k\}{!M61} +K|guSwn: YO +5S]fRP}#Yb#XzB^YhW~/SJK~Mhy5 '(֙ż w罖* )1iJ#&r>Pz0W[18ǀk|ey܁0p@˽}zӭ|-4hfTB>֠f J _??}2V+B>C%U@)Џ^ DZP +8jR3jG#s(g~ f7q6 A3RFc•YhcS6\{k )Ɂ pd9vq<10vg0(m!}ՇԊop{ X=vĆ]E[G%=E#;R=q~pibCLI@= D>{ wWrp%>)? +;O%LT + a;י%rA58X:3H4犬!_%sqx5vgz!gupMFdLP[9ZG0pթRa)[HAڇ}NKq|GKJC/>҅:Ibݤ}lYu'1Pnqf=!,S,_ujJ:0逳+w D6H(ǶhV:G-پqQa_"-ݻay$1I/[:c#uj!dXz8QXo<A4 ZK@g[̫暁=I#?ЋkClZ1-,m)Rc!/tdbhIG I6/-0#cz#C[*r\jOq)NgNu(cM:v7WO[b71).mZLن+Mmi&RڔQ\0W ͑\_9TO>Z@p!)Z +'t~>)lX/y"dKZZpG?MkӖq"b0Yg +C8'=,m޽߅Х 7G endstream endobj 3486 0 obj <> endobj 3487 0 obj <> endobj 3488 0 obj <> endobj 3489 0 obj <> endobj 3490 0 obj <> endobj 3480 0 obj <>stream +HWYoG~ׯ b:}vG݇XD}# IB}i꠰0|i?O3ZJ3 +4c[ʨɏ_٧'.N~`36:2.g]3KT+C)% o_5l!1,,#f$ݮ}\/'Wm?|Fl2u+|T0fMWIɮ>%j>^^oVH_3oe)6EDٶsor +Ċ|ѫ/wdD|B~E(-DӏOgs+i 8?̻x¯&SڃE3$*[n1B>]ǛT$>ַrs=-3z\# (w3@ǿ}.Yx8z0t08rn#31j莜U\>rJbMݤAᥱS7rsفK8Λ:?Z\T/>=|ZPVsG4dF/.R(rѪ{r~vQ!c&K=(Oeh)U/@2ߊ\uhL!!xKj]M|}SE:'Z஄[DN+b- #~Y;u0(_4ˌ =|&Ω^ +{?zH93ӳEwI{[ X̮νoՍ҅0PLPA.b뮿/0g@\av\fPxBy*#<_k2G/_0u+KI!L*sbC +Z*=3@d1\j@Q]r*ҫZnr܂:M5'@фKT +ds'\.:Ʋ'@{ICD%#r@*ͮPP>Va8RJux߇τ|PS+u2:Pp/͐{x&a˦8 2k Lبgf0vR0r^љ}WCD:Ԏ$5@Gh,sF% Cʼnt"TKjc33|Ff@{A7i +rn_!$~ +YwBi"~t(BWUq| B]cpIɧzaǢD '"vtŗ]`T>~dU!™/Ffg +[ӽ a{c0\ p`Kuξ]=SӰ^ql?t1儇-vyB^tĦ@S^e&]]V$)HV +b~T֋GئڰdDX,me89&-EHa~yWh;!L7, ?nNδ_k^Jϒ/@!K-p*1h~ȲP:*Z.2L̔U X5LJeR,Of܀c8m/%pDP_zE^]>B*ö +mn6APbH2}I:?4jy@fDm5/X4#_59LFjn}C=*PL;[%Nz+A^i촷H6 +G8(eE +"bެoW*< #D,ƫ!w}~vs`N>fFqdEݽ;T]Oz$Suk"kP(`ys&~ߍROsFah֣4!F;Wlj,_9~0 +t7\C˶Q5MC!f.I9* k +ÞUd^eUr~()* HʕbӬgh*P^L8["=*uڍ:EPG၂j\<tp ()W0*Q/v/ť%2UAi-)0yPC0, endstream endobj 3484 0 obj <>stream +0 D@&K Dڼ(u*fy y%P$7lfg{dͯu*׃{پe݀OK}RQ#ZK;EqNw'w ?e,"n>,92U$T1B#-QyS%wY#0VGQ ~H@'ZlW¯[tL8'pۅ#kFRq Ǘ%~ KəVa޹JWj2y|Uө \:gO~K~&b :ގ]R|SIfoɣ%5Ӥ;O׌ C EO#,{X7c):J1郈D=!( &F dǵ_2rЏM+9gbS^pW1dwI>S\E+;/J",Rޅ5wrv:d UެjrZ@sjk< Y,nV}};vصb`2y_|{zEZd"+SvebT{xޞe=8qO^r?nȡ@oz=Q~=íS/9K1I$˲xK=9$tv׃7`߈CHߏ/Y[GϢYfT2%9RycQ}hÕŊ%')\y/]L_5>[qn - TWiT&-,^ל)aET&׸n^]PN{oe4J#fuޟaG޲M)͝)*Ũ㵞?e)rvMC9Mlw#*7qasdS>Y9ULqkZDxD߿)]@ɹ'p@:-)EOk$:x>+{|d9`l +qzJkܲd*!~= R0vcIj;>#9xq9#\~r-)3CѹY2ez/-O|$k1V/ |)o;s-~k y^ GP#=<5b +~mH @JL_Ð%YL3HO=C&m\ॎΕω,a^.C1v"Ead)@i{2f=3Mu _t_biBk^4t/@d 6M՟;{7秼\[5W~Ԩ e.iYqrkq?d}=l3&ˍ1ӆl4x4C`Rj+b/z%؃.\j>. +d,=SӅSeU8S+-S=2Cf eCBW5\{rLvcc=ÈuVسg'Ka S$IϴƒFەkKsTIO?s(_0xąFh#I0\4VwlxT *$B编?զ>:g؊ +@ i/HL){c~E-OŷY >񺇐r!\ މfثjw-YNq)NʏW=k\ >ubUie;HaLWTU ;~LMR= ccyBdJHwELbp H{)CaN* &EjK6X+:*!YQLaQ$B >;VǛQ*1hg?Q~AR 8׻Fŝ\JSEH6XQL]k<! +*'e9S1qEz]/3y髐ZpkM8ۮPŻ~fJ -q"}"@/  _KZiW'IXL萡!jY;A}Mx d3a:SJ2HqI~9Q`O JZ5+ѻп*ՖҖaRqMK?"oZ&Q<6=W~ghաWn9g#NzjgnۍKUIRlj!N*e{y k?5bYi ~!W~:@-o1Nq0iÞ@/DO"Uh PIm$$E=(<o7Ӹ_xuD)')6LPєnte̿r=^췼n]q ?jaH~솃Kc)zHdChX,jfZ?N +m$0J"%DP.}V_6TqR7R$N%#*V׬e& E(W;$ ulr}CN{[m92H{ QB?tIO<}.w%ƈ|''-YR\S.*x֌=֣w<3f&pP^6NטGGҰ9x]QsA*O*G_wS䑋R0^_prjBq=6aa~ײ]!dPޯqD y#n \z(V"(aTw,}=^VkSX{>q@D0>єP/+q|c9 +6cZzQJ<@aZnL뇟FazJOĬ4qR:}7Sڧ8T9|X8 ((:& i7p,%i+yFTa3h_j[ ڣ؝r}vHSm8 Oq*7s9v@ w<!~ #]b2/|Xy +F>KJ?er!VVlk7p Ǹc_P^ ;[sIǿqeEHXD8M,ϻ<-(Mm]oH7#$~|M`k~UBI4b Vr F/< cXT€cyٷZI53xڐqrj0!yX8ܠr}F.VH͕M[FՖr?G͹O' gUw7EN4GbY=K\ܧVAWKZ?ӷ %oMTfZZ*^F~g>Efo۠Hfgⴌ*ay-x@@]}vP-6K娬^* Y ^1 + C82[[[ +nk ~Xҳ)4]֯Td;Ow&B"Z+?-FNKi} 9aSt]vf6)FfPO>1ӏ/D +fK-jIm?ktS3;T<H3T$P+_ DL1ЙՎ*Ք?HO|NC <Ѥi[{'\ xIWa'Fs ԜlʹG 2J0WNCg<\I1%^bR~}.Vq/`le+ 5viy^~sTȸH[,=<} +\kau@󵉺֬5/8Ä_z\Y 9hL"Dɷp))on00:n.f-_I@YLp/mig4ھ=au L%a~!*ҟ`TS|# ['=n (d*tKz7fֺX ñXi9 +:j3qIy 4aDQUWԤv8RfR:^K(T9 3 76N Ǻ+J#-ߤqdv޵(niF{s{R?__@4T?vFwC0 ɕQi_; P\ t} ^YnP)'p$gZʎwpCSEEqI P:盺6c#Rn~o@>E-8 "hk|Ɉ/8ֵKu-5hvMMbuFb54kuË”\Di75\-Tw)(R iH2&C1,-|k=2~pdJ)t0VX2Qj P^aˆǩgx[-jI۾jH_= +?jTo&WfB|Zf\/fYм^~&cAW7s[i@pv0t)8OY.Lw_kϊ?V +=FNv:7Ȟ{:"CcJ6OUSRs>-`~-l$.F%ÇT(Kb:j$ &Ѝ|*d]eJz眷\TйЩO\Y*Xx͞9*ʐJX煮h#7錾-iݴ : + IboWo~mcZ 
;˦c&4%6v<ݸM([2IELOXp@着(Fuu7 n^"%C\\A3ZE Ūc 0X Nqg|EItVx]=yXVbFs*00a˩w Ec[Ʈ|ܬRYNKq~.LH|K6H1E5p'oEe»y6Ҁ+Ru/c +3n2K/f<U;3Q*#·d=O?tFچ/̲M)fuQҊ$oȲcʴMIGUgxZߎ6ud(e)h|m%oپLOφ'TҊlx3Fkm`y~2zL'%biW=߇Y: -ՙX=.PpB3vV (yj/Rk .x.˾AKu8cP+ ~/(] (@>qj>C?FWt|raPR`9G)źEP{2 zj +ꭁ8WA}+%~xdBoC@r(eO;?3KD,}AzZ&!78{(DϏƞKD[,[0WsGmQ4!w!5YᙞU pdqH@/DЋGIoHRԳP&`{P1Vzq9./nlIrv*ΰ:xI"ԉf/SIe %hDq9RY|5hgӣD:ڽupHoocy/+mO'B|s˥vc^AO[(spb\! 4,cI(XK`5zf3K2v~~Z+Cƀ@ =Za6i q˫o/^,}QZ) x#"P _k{Ox= i?&C'@W31+F'RmnGjࠞsփL;)+nZS,8lZ`G;E A~%Y+tPSՒ 5 opb䳎%E@,4f2`B+3x{b,i =%l +4 DJxIxNPP47d/޼Ӓ1 C>f;5דZgk1w'ܤn5iI%h-71A 6TddFT- G 0/v/MHۓQa%`Y}u/7bLK +:E'}p*v.v2Yn vxzvEg-RhEP@'Rw9\m# ds&&d~T@:vF[J8B>8\g?ITy⟪L&ϔ5yGx\_Ćn̛IN";%hn _TjQxyE7q P)7Rz  +Rcuy`D7' LYVNϟN1n@}('Y]>X[͒J'*ݸY7 M +5vj^(=OB!wOqoG37˸O mԺ˱t!skY"O%>;hџD0=.2Q6!C0逿&P7tH9!fa[k_gp]!jÎ6GtPM.σ6Y.#46rFD |vq?Lǜx^֗r"?SJ sIEgՍ( gHd +"w.RU]g{*W5>rlݵjkfVHqɯ|46 fpFQxeYBLeI2Vb:Kͧ].S܅9z;4Բ҅֗Vg )Q}9@"/Ϳy3fIa +ʳ ^¸iJ)骒AIkGnynZ[JN` ;E%&>wۊO2|.mqtBGCCK~; +Dg:Hȫ0Ӛeґ5[COub&c {)|6Z^T䤥UW3z)PRŧ7F$Ļ_[# /8SpI,е](B 3_|&wЩ{}'t( + zm{++k VNcP.{Ovb:,a&aI45QҖj`+O@/f QB*n]MP}p7~Z2s=++?l_Ǔl#P3"b1(0VTgA;9sb03Ah6cvX)- +0G[̫'SEC ]Cs%^w;xr 5"aymRX܉+J(Jh8 +Y\ n`V $URѾL,$ii X`FW<~)鮃Y}HVxdڻw1yPs wvs .UV:*[H AGҎii8C bE.lթz} 2NڪV_sw~upt*(SAa 4NACkD%m +ʂiK'D[;04ìN#V5,k]5pǰV%Z_SgXC(\ci D0m*ϼ|nؚB%Aؿ,+.?Uȅ8ߠlz ouu[u7h~zz{3½bwHT,Mx8d=t1T6}EƴEC};o dܷ >$qAժC;j6kawwhn6h*Vwr@;EӗC#="d[`8TvPU(XMbޣ##,ܩ| =$gyF1ٕ_ a{gμ` bu L4N39 i?O_Ttpl~_RdWwf7 KGh,*ƺO)\D\CPްV@ +Akj9D8lCWRW6L1@k90nF=a{7sLl^0AO\3~R|2GJKX!w3f(-A { +yxQQU\դ!jLʻ|fJ\sD5&+|i/rQιp:l= tDbMO] S$鳲m)4Ye ݅GTf-d;&M y +_i6]Hϟ, x$9?kX5hE>B?c:}5.${B@1^ZW_~KPg_m( T/8\31 SKǣkGDyjecp~P*E? V\w<%J_䯦Znˠ`Dz5믌)ijPxA6vV.(քF +Y%?(ھ7"Y-ʦs嘚mfH3"~:stm`,sy[s>{W?oԨJ)-B2? ZVSHkr} ['=Bth숡I3)gZz+I}ur9sz!j_)qhfYt8I5KQrz! $AmWo#t"U Eo=UYx5Y1 zw#m!$-Nsd0w^N\U)(viĹ%+!T_`Ep2P8'׹^]ʗT#|J¨L\BYs$EFY<W^1D/=Wk.'"L5ޡtZO_˹N{\UisqzxLȋnȨ{`3atAP ߬ ^ml?_PUu')**S +}םno2^\a?}Q ?qd=y5Mx{um?C@w#WۑﺍE9t([&zWbŭwn=5U{x +z+L;[cmY&a$Jd?g#[).vA}*pl)! ={Jփѥ./ aaXD jjnWgbcjkJG<*4;{43_IH2rE1^"R͖Zh؟@] F'gnZNA6z7kӔsi$~j|K QC/ъ-iE 1 ¾5׉4ۅ77P=A_4kI.f:FluEʬ.fyA/*5){êt.rI::IwPO3](%(ݜsb nkDLۗiJJņ~rfbwlrq3%*z@L6AKk&^ /7 )r@(eBޘ8gBL?Fj-ǻRKo +8tQOoc𣲇 +TB7h>ߜդJ+o;o,A1j~Xr!L d-+{FmBv;cova3b 8b-}>۵6?K1G8C$uLcb6:r &"u.tew +{ "?阻ms8R3 q 8DQB3 Uz{v]t@ع|ue:J .K#. f*P:ofQ'E5Τ@ nAHW8=[eZ|=Q>fn|Z `5@0%DSv74FJAK0QTĜ0(p;x@Ѧ>%3A,>w;A s>l__q!@,eK|Gjf0}H*6Ph} `p܎GʘΛW 9?_i#3堹n9|׊Vch[8nS. S/\yl'\q8J,4psǼ㪇Qu}~ \[8@JD)N.I2c!{*i]A{zt&)ldS`yZ6F2;K%Yu~YZ-],ZV<-1GNFX6r`6s +CO}8hK׶Q[t Dw~9* >PVn!{іG|Ti/"Y1Xj `YBN o5 ݹ0%5ot"kd'}1y(]((na2ǖb +hֆu i̦y]Hfj@GRG{.I%#FOy*b()'!AH먤d'GPOiOuEgfiKۗA4cV'@ dsXZ$ lg%VKHx@M/^RJz:Ѓt>]gP@bɻ.opUs ~;3KҴPi0&J{?X!%ꘀPR5T g?F5F'.3quu:Zi9k4pIŘ .,Tx'|lZSny( AGi2@E^B$CӶ._,:蓶Y4օ."ON9ǽiCB`H;ʪj)z +Pp0IK rIPjXg}tu4IРY t5$I1ԍBd]u= Yx9#?0r]6v1hrFiPlYGҐ7`I }8N>>aRmAsw2nмGZ;IEEXE}8,5݃0Ӣ>x#UHaE_mgDelkPaZ9j2kMa^Q"K2\σ9HIK.(lw}TZiU\4 *o{3{ ̷\6H8sY8}%/W+EC◫732fjBt7CN }>ͤϺ{j]۲&h%u ?iDY5-?U-R)a &2hod @أ'tkGIpݢŗ':ǷU8cX?#Қc$t>zq=_eP#&U42ug+]*ZkK^l~,TB1rHa&x47jHv'r8{FN.C{6vC4wZxA?4bAB_FfHeo@,aPO4h$8O믩E$8,{.7@q QgT 1 p295jP}5Dɪl._D֒ͷz4x{"~EDOIQ7HXb`ӱ>܎cPR6p4Md&ï +26[+:۶ݕ$6hgIK`y+˩qڀxL?\9ʵeuny6:\ >A +V1#6yYr0 Um'0z` +0v\W7d(< eB&CGQ&Ȯ!;^͟NJb <%4G.UA%QmLp$r}[R ثI1:hZvf~s[ n8i4@dHHM}]ZYzcEm)cܙ^;r18EB#ZbI|)?A$e[QqT.%fzV 6)RY|~k8M`! )91o@!=* @zG8эLo`f.d̑tXdžD!Qef٪4KVmȽ +3$[>`7j(b=SӏN[ǟU?&6htzMy10MTJT B5)&/$J--=ơ Dks4@G)'7!iM- +ti_]c|.~>d@}Whud*_j1%e1KWҔ ~%저m=PD^ӛ΁С䳛D╆P\wP*&@ CCjdpPNm_Eu "옪u6>Ӳǩ-u/)̱֞Qyw29Srualbx^Xf1 vlmiof7ƥ& 羢ްiR Aj@9e00ͻE*;Iö7!d]^QJ:ְ +,|i|<'P`ҖK})5e8rt[~4rp\D0KRO0su;H:!G!V ˩B?i dhT: ^9 ( u>Rfy\qf5do'h[84-൦ - oPH1zTBԉb7y e U}iɰ|w% w[# +mN~,$Ӆm]&B!Ni,dתx Ӝ.{mY1j L9Ȣ2k)7ƒ&䥱BXϵַ=_ZH +eKiY1 +(@+c=vi{QoM穦ί,C8CD"4&5MYm hBWn1HGb=[vzѴY qɇZ + +Y -bv8fB*I$zkW.cѹ v\oiPpb Y|{G[܅;Ж-kPφ +,ػ/mNt<U Xrn[< D!̷AQ%sؠGO Ǥ;҅&AH-@#;^gBʘIū9/3MOt́At6̔޹8M$Ce(WH_oJ9|$N[erc?+a05gop{+.];$uhuԞh +Ui¨>xlV|L"(+ߕK@=ǁ$'w?g0zBog6i-l:c^3cqˇEV#u*K8=˟Dz[K7Ɋ +N |`We)k[=-/k(WHSO"NlG"G ' ~UX}'Z ׌ 1aLn6E=w%ynjj/0ptĿ(iǝ OlԴhԈfOL6r|wOεdLd }<;ɬAr/4,>ydW _u +'NFH!7@詟 +>skp1m+krNJITyKgovS.oW,8;3-8e]9,++luR8┅hV|.l%õ^`tm4g3Cp:leU J \ qr[=⸖:Kmɴ*GV3>j["d4m02N&Gz+XSܽIP~V@ڕ܁ +銜d5iZITr]ʘ~rx9M_D5ՏiMk u[D1?/OR3pQ˨q9~64K}\EGQ,R '>}S6zͱ39=Fh 4/ 0wv{n#Pzd3i]9Kq ~J s(G8*̥?,Om%U<@/F0,@w^(vVd-R endstream endobj 3481 0 obj <> endobj 3482 0 obj <> endobj 3483 0 obj <> endobj 3475 0 obj <>stream +HWn}W #]} Qk$3TO_fER:u_g;&\0^Ξ:g/VgV3`պT9O`iWi ŶV t8FrYf=Q7^iO/H忛M gxɕsg* UWx>}SL|Mקߡ3!O!c vg QM#90D82vk}i2 +bvf3fCB +FKMƊn+rI/7JU6!k I`r5/7{l.Z㋟/ eKf$Dox.Fze'Ǎ}Fp ,%)?s*Aq9tXi9̉\T CIok΄b1pe91tp#-iQl=gfby=yƫݺR3o_|bo @~y޾d,`<=B_6S7a $~,sLYk+P^8K &uCc&]q0̵x7 p` ?$Q:1)UTU R +ÑzpHI֍R) ʏݓ;#ĽęA`だC13|l)͘LƼH=5NIsvj?*Jr'+d)chhSZ:ͭ$_ԖAH\"t.9|FπHRL%G| / t0@|j Fz=cԀ5&sjc 'SôQjié5pRCz9Kb5taYb'։r|\0 +`!%w\=RW ; +ZOޤh>=@EB_/{\ih%:4HG+[;LdF_#-K"BnrɧHĸ+ +#"|%0SccX(F-V}&KNS iMe [kt&EߦawE~ +{!| JSyCشЕ}%•cM6Nt=o kEZdz9.\"ϿN HQאӐͶV $m.H If !"ɛ_~`'85fY?G|\==~M"=AN2mۛ td MI+ly/0BW3.@/Ud~j~~ ;roHw4x,JAxr=r]d:቗AI*IщBCG}׍U.K 2W6PoHay9cG Џ{j0N6’;(< (1>iEUTrSD5TxM_vvQ3y+T ͳ.h=:7n/R%%@XtIC7h +akK K?iJzu {VN2$$Ÿ$qhDP)mROHSos>" }wu҃9 #OzY9LQ0H,?d"`~$'kmֿ͛G2! v$XI)- +o Aj8sB( FL:zF^O4{ <ii|t_J+} jQw?$`Ht9bfu,{/(VsH|&3%)cL 0ŗ h]EoJŤ .p9_r2~ti5j#!; :&I tB/0mǫA£ ߾B7RIK\>q2;y~o> EΧg\J㹰 \oX[tަRxcb"# +z+Ef +xˠ`pbܓBF:t*L[IyGV4{f:T *yО>TNe@QAlTcFݷ黖 حxW)j#40y/D#7Eb՛ͩfLvZ'4V߂,)"?3VCٺ@Ws%#'>RuijEn꾞}g I0TAJ+5ׇ؏9-[)"Q'#2&Ц&gp:<lB0¦0q>h^-m0V X eIǢ莽H"l,,5씋;aFu/2h緱Ck,_;hJעg+SM~1:SURMH8$evjWy B |V0Uɸ$l5_n7]ȒԤ&*~K<)Jﲔn 9);95+nB>)<I28q-}udP$qr {?zdjV(jW$ [d4/׶[E6̃uJU)IyDT +Chjs +,Q(tkf` ^w93b$(zܬ7ģtQN*\\6ZvֻgEVFo+S]Ho_61It<0ڮN QD.Yz 0.Mrrr2ɃDG%'gt5)(BCg&n4Za(\&`aUC/j5v|Ka\MEAQ~1 ⴄ#fhMmr^B-<;pˢ%m\(:AF?ܥNӁ/3$ xPۧҽ }1OLD6Ϣl ܜ lwbS{%:J:(#!tܱ+ sz!̛0=p>stream +0 H@&k> HXd#ibsR6zdC=K,FŖκy8ž fYJذBAдY xvhC(urJ@L'V2։-?yFد97goV4u<=ZțL̃2M6Yy22nڃ|@K8{BpX*qdfRq;MKp/uqYk6yBp/avzìB2BxPY $k TUj }ʰ\**ω@`(HU$ @AʼRS; -"1XPU}1sz18ǔrdIZBi#4kJ;1E󾐾,US+h10̕8ێ'5M,uAsK?[Wt<3̶T_ȉ?YhCPE$VA$1O!ޛ@56Pv=Re( .QwX۳~l1NJxxT$r +[e]@S^Ai_j ]mn?P^[!Sa1R ic0>: d'94Aѣ[$V7hze+x^;/ƺ~*=YM G`~ NY _:- Hz +T6~LaC+F?yj`# ƫ@T,FAX8.FJ.#()| ժYsA?&W9C:ʝ dcľn#B`qk| yu+2XW'@`c4N~wa=EU;KDζ~3t)߶e[\!kFag*ICh7ټ9[_D, 8FAw̅,ZEGۤ҈'Zħ 'Thnc_Hg %u˃֖~nfx24~Jd=Q6&T ۝?-LsD>]=7)^޻q,[mu Ljz!reTkmwd#/BSݚ2$mrp;9ԣ٭=cW錥 ]{\Sd:m &($ǞyxΏy/Īy_mT&R2]63\2O ϱxZ,#^~HZrjBIh`VJ(l)J!~֎\JF_HDvb&$kz+ҼoESR=' h<֊8 DG{%wiSzRf1pʄA羍  ֋N(p> +TXv= ! +NoU7/O!L| K-D` b&!/w㐩D]:G p ,bhg@P 1Okl[maAՇy/SoѪNn@/fbL6r|Sot"o ^݂[ْY+># vg/Bݾ9a27>i@EE5S/VN2KR[QYTDM;$tjq*sJ]:<΢\ +(M֚D'XSƌ9E)W-}BlQQ7;jŠl0԰j2M+Y L|Dٳ"u1ÓKa-kԻNDjo׍<>ҰGKRUf`l+k* + zZh7Tbޯs[޽kf!\ƣ}>owW[bf\v7zcOGؔz;W\_XBup1$F+qċWY7RF獁Mq# .DEȄ5ZU1'GQ0esU3C$Phؾ)ְ5&/*'gu~Q@yhZZP`Ey2+AkiE/HC*0"[,*;#.h&ާc UykF+6Dm&0hgmE15Aqeq7eAm(`qO#܈g +vRm +rvp +.{J*ky 9%kN5FIƂE#˙k(SZԿح,QY-U1f +#gc2Xg_ BDcbFdq"-7@ ˃{Ƈع–bKvBuȨpRiLE)?s6+1OK?L[ɁlZ)j*L'a9 +'ȠUǧHKQ \TcQI'wVT^?' ]yD}_ +JkNJYU\l?|&"{T7sjșBE99XnM70+osV`6Vx`4`1,$68d" +ń(1RNzW\uUȲL+%t3Fx0UR{I]:NӬ{9:cɌW51+ZAY"Yw mt !UmZ;bSPQD0gcAq!ZDɇ{GdZ/itXd#9镫R2sY_l}WG 5jޯEL-I-.KK3V삸;s#,ۏwSjM'"GNK7 {^uMeUwZ,k:x%S"wR%YaV;; +r}hP9.^4X,@fYCf`65HH"=K;wO;C~!KxO@NߓY-!\ᐅҔsX t8ꙖU]8#3SN0}sHiG+[Lj_D†|GoZAl= `/:ŃZ_+{rb01^Ί𢶲7J[7\KorJ] @ +?/}K룰&VIe?'?Gޚ;ԍArL9ZBV朧{y9PIT9㔮@j@֡7x2]m&P.&WR/!z8Aٶ)Tֿ<Ò| !|PuhbE- "JK{ u{dU< (F"<q5FL^Hb'>l;@CA礩C3E {z0_sƁOJ$%4 jq|wy$#NqnqZyhj[B˛7)C@!1.0uaĺ *."1f'J"-! )11{a9y. v۔ל:{D3L(uCR&\˷ +{?.]E`?<K-jf_<E)t=8@YFaP; 5,(1I+7JұlKJli46 .bOųv5瑝kyH?{BW Y\Xr9~[IIh5bLҳ$yҰKZwW3^|:P?gѮ F +ەQUC7^ِ!6w7ܥT*()brSmQG0>>LIG{S[{7뭘NE=湖4yO_ZKXJҒ5AA)j^s-p^rK\Sb'UcSB߂qj^ǑS9}#^ʞ&*hfs[cX*WpX+t +9 CB~aԒ +$gyΦ}fɴw`Ew %( +ֳr2;-DD$4hfk 8&b2Ynof/ +s$rv{ "7߬i@ RG9ep0Iw$k @ "o bgH|2*o h%gU*{ lAoLlz:ƴ.Pk7R3ދ"Wvg*91o:BSgLs8t.Ar(B_6}E.j hYVŦtRB*m>7 +Z4C T!Y|VaN<+@B[ OqC HȕlΜ_RSŸ55S+rOD-y \~F1CwpH|(6Lr ΄K=T0&џ>Rzh w/n57r&gH>}|4n߂u{<Ӣ"[ouhS%u:N9>.cESy-e-GGT`*m^b[`F%yVj>e?YVSA6}ԍDߵ|q_1*LzŸp~L#3"QO mߑUm y 9*9\ ġ8P1aХjDgwwoiK>>uG/@H`FQFb%\OX>0O/U9+IP.a9S!|@Wm1( 7.%˘r>E xPfWxdN~%o?QR(OJAI)P͆H㆞Ʃ y,^TX99o)HV1Y;kp-_]x U+x~K0{BIȣPs~)=Ia_#2r] ԋ4io!=p)0d Ky +̋oV{`=#[~%pr>2^[G0I9S ˆ6 +V]F"0ěrgЛT^xbp!w:g㟝R}E)!"z3y]u ˿6SvJlL pp[J:U9@' +ly£%3#|K?E/.#k,=]"wh5. rXT*΢W!|dPKws?Q`/+q uGMsQңLq 0xBjpjſq*MC6(HtZ SD*][<4 jd1P~"AQE,^.9s_LۛFll#8PS:Bqqnqi.u\ _n|&Iz!'b}p|<}^9P!qxO^h%b@O!-7v**%v>2f. w8v)E98^Ҧ,qzu6KK ,u+߶hWУ`NGMȹla/=wUG8ǹG$I/9PW8i}{%s8%f6 =~%K# s#'8N|OqB h|3@'glr4|:Ј*tpxJFr-$3`GW5w^s\f| 2q@2FhJ[J>iL2[1AAW22;Z=`&PBcG B|H@񂀎2F1t|8GKx ɖZT<8ͭk o +Hhšk4ztSΔg5IY Pe۰r5Ab߈!~q`% m2 +C^~ƻ16o`5zTÂE@Q*my2{qtYQe!}ɘF+%Inge1j㞁B]eYڭ*ܚ0Rd.b+ fZɱEs 4mT ~՘K8Bl$Pz1Z7WQУ[}84լ>DeJ$z0?fj:ʡejcKQ`<#2cM(FNA!r;Mns& yEx5!zNK9y+NҙuRo#Ux+yQ+`)(!!8,$:8 +Č걌uݽ8bAV}tm ;.q\f0gO>VCqқ"CFX#N> w"Jn7wQ>rKǒ?(>C-Y%֝IqcY]yo''ȵHv)Ĺ(TiWSit)d,3*d}xq2vuˣ۴+f<#8_Fk3t`31_$dwVZc6Lb~B1 9fuFĉֻ78YšR$U~ +M6q +iXkcQ"յz|&^.C^_nKs> 8)Fl2Aʊϯɨy_h +˃4fyEe;_`|3dp+>7 pخyv{<,_/Ӛd- $7Qj!rБ)qB;.#et,QYOvSbV=ym &%(J5VC} \uxUj745JfM`R=5ҚCV3V~ww+v=q +ÐXl❴v-dp 4g2j>IG`h=\sS(fGDVXQOKCR3'|tZ?gB_4u F>c: :Ekm~9/D3k5>f-yc&nnpx PAߥwb8`!qI zOdzȄ09U!$Q΍SɨAa)&3&d+agءrC4(H?䰚|=@' iv*@2.;#WecIN]֐k/#^o,<>DU}}5NͦAη,AMfOR`f-$BCF}Ģu D~ݻz_rHUh:WuI #dyWpչCғ`d3sk2YQv}KM"6Nq[\(Hap8M)zTcۂGߙbf1x-bQ't7t'6I2@ݛ|4\PEA |3 ,UԇMRϥc:~.(q fxyE?ol:T<=Rqsj8.]X"C#25w7CAi-W#G~ +A'E͓M,Ap36Xl՝Q_ng9~Yj 1b2.ӢeE)GތgZW i{Qh_c>~΅e7מ+2 ՟>MPgF1+L͋:/{s,qɻ䣦RЎޖl!ҍ4}̊]S) uhPqe6 @$[t4P OջΣMp-r0_`o?R:\q|&7[7)| / ùaqYN)_3GÓ$CjsxHk_J#w襠+X޽Mf0P~:OK6xTOJ)琂2B:3Fҽ"I4hU@UM_~chk"{Je|ʐ(6:@ˡj=KӽD`ptt ^;O=S@&"܍+74oȚa6z!9 q5^+.qY=G/HgE!A.z =n{Q2 ˄6$9ĥ}H x8>M_O;yh÷fRzGSUZtjm[d'CCakZx wyTQsxU7}+mΕ$k2Ka!rJ`w[fRQ0XxJL%)XvaIJpw>"cFYl@q9%`.H<}9 ܶfC1]Q%2>k_I 3I +#qbhehn|>8cE7cotbxJs*fW*bբeA4>ܭtv +3 [R$j#&U"f'HnN'Ҝ,+?-_ + +bzaY8I//vUQKhro;(h*<4B vpm>kAzy,FUaoax5O_"[ѤH_Oib]:NgL[!<( l+>1U (FT#ZhR|6)UZiQEY OC +(A+H ^Q6ҭh֝Z9H]tWPۅwB H e=~dmn1ӌwez]Ȣh~K<RsH EOw Pg֌GL1h%Nt&۬gسMSD*nXY(\ό@aȘ-lG@%4 \=f%`>5G茫.u۞QLH[R*g`D rqmrΟ680Ѩ^6SDD=zTE@aמCksUAH,FC ф$h=7uJiw|8 L"!9M Z-BJC&zvKKZ(Үxh02엮_NŪd|%(3chfxx(|Z_zŀl vdۏq-i%`#UDt[^ȕIȱ`5)SvXyJ9UN;vCqj"1W|jѐ4ȟi]Z@4`2Qp#7g0uv ``kO?x\ʢfjih!ħt|l]!d#>'dy[mGU`{*zhR6reEJmc[2BS ITȎa*891EEض9) +BH&AE-k`eS7"m)Ex*$s6R`|DOw^-A΢D`W#_yI؟؆FxQ2M'fKAT3;@Ɨ>"Zj&Շ:oNOP]Їyo9c"7(YY6= KA6\P"9- 2iEZ/0@mI58]/)U6nz52P9}' S8$[(vV=q +#3\_/>K%+tR Kn$ރl@z'E&}4z+.> ~65Fϐr='uj[&lEF`I`X=SBMXoɊغ +i"ݤ_[aʙ7|;&d!FzdriJ3;֡ȫFy1ºȤ:8P?.J՛ h6kPB$Adt]땝Btn'2C;Nζ@#c7cxҀBHIFQ7frj:6p& )dF|UdQdHgkE'|7QfHtFC)IYt(/+2$ ~g[|SA]nzMcSJk*z9GgJURm>pm15̈́i6GoVq9p'A@"`+q-52$=ShTT vZ 'Un8BFm% üeNucj!1V_!%^!>Q#-`G FUi'Rߤs InpGQ2nYߕJ[5҆4tۮK鹔.Ơ2'H7PH^xII# _^x,#o, gZw$&r+}S̀tSW`IU|q|aJ*9>u~Lֹ|J\U-/M8I_s49\6!ն\`;peN^xHQa>С5+9rW&KmCU ^}@_QG$n 7(қfy* "N6 t3V;l5hsTP tP~!MlimfF_$X1J#|ZBo!Ŀqٽ?p#y$uS9Kp-Zs'-uU;o 5 Gk4/嘓JKDRbw&]:<[("#:c$L5ʹ $1s%KY#㩁YE8/mشJe=( ᤈ]9v 4[Bt9/&[y(geqb3nY2J{̴ JT+fXKGJopƔ3<~&:)5YûwfOߤ=vuUULb9mQId2_y3lQy]\,Pe=_xs{?'ڮ3WO݇se3ߥ~ |Pyf"M +nY~PYXG"4i<yG1N,.t%"3lf3W|pĠ")i+-{ӯ$W1TUa:n7GiEd +;)P8IVa9RJa\qtx$@vQ&Z)_y詮8e^*ƢѸxWQ1k7<,z&/{VFc8r[7Q5IBu۸\'+?*;?z_gצuFSJv4LJqڂu,"e0ޖᲪ绨393SI ޖ/D9!Kx4}$DfoSx>hNAoFZ?~^(OO ]ۃ^{ z!<9Afp󃘎uk}N숿: 6yT&M`f|Özq̦NZpNXEx?#`hRz+Z iU(|6DJIZ:&* + 7$H_[]zW𡨃LuaGP5*.3^HcspE|apmV[^yYsIqSHWsk\q˛zN͑e𗾓)-IBA`cK(30d"u9~mwb'.ӹ+ŇBQСh{Ak! +cۥ薲[M+<ٖAwnbĞ ԯI~m?t ޗ'f @g]L[͹=n.yNsS{\?r&5Vo;S|U,+kxF9yJUT1$A4+{Ff3ۖ%:&&H1/NxM_^QInC &jpid'+61ȁ7G,kD揕Yb!s XdW~s.h$PG6zmo[b}?v_i58"]ҁY\tvgdzpwWp29Մ#2G=Q%(^|KE?iao0=4:ߠ F Ek4PPtƵ-(@!\>qx Pۅ~r.Pbt3DռvOG6w + pbsƨC+^E6CYw܆?#}Snq1kDZ\Z X>_i6?Nƺ"'"UE%.ylTV2f F!BÊ0wN.>{nT/ 1s;`}R[˪_n M[P7Bg+ըfA\wPvQBH8y".-6w#$K#3.kV`GE%K'4kra@pwOEY_!Id 7$tWt0C_9>1Wt><*odjBj"ߌ$@ +O`Jrw x*"Q.Ċ{VaW8R< hHۇyZ)O:_xC [1;>~O}oX> d{ +IN789Wlo#F3T*"[xɰtu5GDv'Aڙmƀ'¯f 2y*dg%w3Z t,PF->UM#!p@OȽ%"?|#sDض)my~& 'y,QiW004pL7q!iW,79l|}VBL?d_短 +nz(3ɶN{Hn]Śd!%joa.^H y^]# gRT%VfHGiFR}ۋ5]u6>nkc5|:c"'CK/c,ꀉ/)NOof +AVHWirEJoM"Y^* \f;GRO'̈]tu%Kjowэα.oJaw1x^s"ՇcԶ?I$`*gIL"2zCPKLѺ:O6YǴ"%T9@b%:.dR@R {[!8˾TR-cCE^Xa4J@ +inyR8J]3X ȯ9@$jX؍Mk^9Bhh3>}m1,I[Z[wf+5~os9]cЀJjcGk e"ہ-sٙ{ZjAd5Oaγnėk}>ҽ,ʶDJ9Jq ]cU{s0gѭ=?b +[w@_x) | +Ax}`X*F ]!VuOI` 6[9Q{Z+ms)GHD:~:QZQ8N;ᶙATDۗ@wYSvW31w@ \[̞|Xn^i# YFZ%D3f'LLKlҌab$Qmf +ٯ˝|9%%>w_WYKW7 ܈@Jgn&N-*ܰ"3*+Ey +#SS W~Tdl{ǚ³Z9Dгy:|'-3 82g;3t,f c1 mD+?t8v)'eܦnXxcx\,WYyʄ/2ȆrsDE ^t GՌ-1g.@^S0f߱J%9: [1ҭ(fblbzill}4a5%YCS:QmiNB]"> 3wn&q&./Ftˤ<S 雳0-l5)Tk/:Vͥr< Y[5gfPM~GI@Tf[uhDt ؏io3S J6{@mVMj#Y ^,=>{C#apDr(c>wxN|q [ցs-Q@5O?fcxg*;'xzoUޑ<]žy4)5fT*X.:)bГZ*ctskF+Ai{5ѿX#<)Aeh;"yp;=T͎v8}%_`&3\~_5t](-,Ϛ!ɐL s+8Y‰fxI1zAڬu }b +o +yɿE>8M_4wc.w{%kYGnݙzrx?*1N9{vy!ߘcعVl4yG0ZvߢifWF-07 +E~İ1R@`m(߇S inXdw=%kjY&[3O\ȩU%QK5KKP_x_`jvbԮ5aSUk;oʒ!t̬1Д"jH44<C <~G ,6(gaU= _UkUDMepҮ|#[K{Y>.k& n\ArIY|B~3ubb_6 ]G$cQa VO ƻ3u3/ɑ D W ؅fmiM!Wflj#OBل?KT2$9[ s$2ՌcTyڣ]Duad8l'0Ŷ֤bQVR?.~`LB(SBg eiumŎCmdcmqYS_wd@LJ6Q2'+ҞLy5q>и6{ln1w-N}wj@_׸k^^ AYzG&t4K5hi9.f29cN2D3~ɴ0]eyTlczDfg_Ƅ%(/NLu4d.(?!&%J`s,ݵ҆7NJEC%l43mPYP[tV `"anQ]('M6C N94$w,qcq,Z0>y=?GC:(֦j=p`CeX<4'Ք&*͟vH4b$5߮z缵0"5 Hfg';|/4~?贋~_w-Q^CQ +UdPQpVl[{q\G}Eiqr}?Q\k#Z&o:E/WǠF>1D+hTM'^]եI"ډ+E%Bf%8S͚Mve=/nV b +#s{75E o6[aUXn9gE.CCxr_*;֒=ёj; zJ*&+..##b^fL$G!n0 ,X1ع()o6R#kk){'J+.h'R)݌bw/~TOYXtЬAD`ŕe^+s6w'ɑu)yO %X-hcf0`4bXSjƠ᳑ a3@G ,] R:qk:Q{` +pj抿/] ea&ߚ +qJRRj +A?#& z /Ou=ӌ:78EjbBZb:T\!/YW!02ˆTreRUs +6nI[XG%ךuu|fembe[}5%hVSFH6 YVJ@΅}z&uQETxá 1 1`RUUOQdhS@\ \NhYbeĄ!{MG.>rhaMڕ6 ~ p$`U+PtC>^)VkM}軴5$Ͱ!̷uwnd|n\x*p> E)i)@>ʰoD8"aa&B*e`nE6 ~3 WZY(-؊ W2.ٮ UTdtlX -2G$%"*cBBZ:A}n}:FC +ؗS/xu"ż YQ#aHFu1, 7K]  FU1d8xȩr6"q)|sB,Rfρ#6ŷS/oMƒWӴVyO֙+*` fxh_&vJj\$kc:TjP hD~Ax:Z(x$d֑W7Fd[2[J4<'$d)1QM2"NM1dlGw0|rR/UTgwmUBpZgTI9:Lu4Ԃ8/wE]=٦>?Gw|H5Nٴğ} 37{0̑|Be׷x6O^TuxFCJaD&-]+{&ܷciK%2T~ZwY6yB@P*?~$y*y3йUmDFaO-h8ZToG\W d/>8+|D: ^lN/||r xE|vAظ6U6E_ٔ?r\?R͏$/ eM8 bC>!d\͒9Ri%HHa !s4Є%uY94y8/Cf(dXßbEkexfDk u>:su%ʡYi}1 %Nc.VpBptXLevV^ +[mt~Q/J:*Ob=@=&L[#m55?SPO-A +w<筗l_ToN,Lgp쥕͗"G+?/?q1NBN(u34`$ +\o`ro0.k£/&Ѩ`WE߈ZR3ߤ($Vi; ?g؊TD7p%iΖ(b-pݾ9 ӥվv)]N@շX\R'gbhEuuHt4fp6Yxvcsd_pdB}Ʒ2gQmȉ*r8, )Dtڤ$b eNٷqxY놦7J`fr|UxF ]iu8DTIӝڏߴA9'h_(!Jv4Z)=%IBaF6V$Mf5[^< V] + +}筞wpp }hRt{'Oa>"8wݯF]xMJŤ#rZ);b푛@ 0ԀZ<~rLnB4N),9n41-;OscuaEFS1ccTamʬ& 5L@̈&k0KnP0:![[/(\an+x ;{!qݙ5XR9KQ9F|ch@c=R, +r.gc3wHSe' Чݘ_l)n2i[800kv{oRzW6;j)|z۝ݬ<˔i7XBB bAuҲȁY@-,SR..}=gt"'9 +OAuj_}Gls1Rΐ>:#Aq,XK)H -( CFB%P $kZ/oIESQUϵjr~Xdi#GRsc}~qޕIm&``K`{& BO$݈SHGz鐅whSUV#o|U2kM(` -Z$#a3xI9qEy^|ᳱ i;X/Wf ]R*Q~9O/r!nSq2M,5m=)݈#Ԋk^hv^s4 ,A ;3 Dip0kgw'kT } +mŗ`l,vnf0BqޤĻ>~!1-djJLv_bYen(R hO)7Ra?GODTx8U +~ȰApZ<Ҝ g}FtmVn h 9'5@ endstream endobj 3476 0 obj <> endobj 3477 0 obj <> endobj 3478 0 obj <> endobj 3470 0 obj <>stream +HWkoX_o Rb3#A`5Y-en'Uc;d}ݝ@FH઺fR4TD\gԫX߿dRF2:x0гgUrIC7S. +=g>u@npn^ YBZG +o6UI @y Ϫ[WW?ЄaZ  7PB; ,Cev)1o7qʜNl[ZscPly Z遑c0F^,PQJPuu删>2V6nnnN^LV v1bow^O?=?oko  QQ@MoL-MƪdKA3uưm6G]mx+Ni56}id ^n*Wp" 8,3D**xzп u#H$զdǷF`Ƹį66s=>!a^M#7!{ 4+JEوz; dDzjL\7~`ǼSPJ@[f򲴥'(틾& "qVa]<V,!n"! v A~a6+HJ%mէT%K{c'ZΚ13[Qt@."/ߪnS!r</ZzS}8;Bw{uǣDwٿpui'?;!^[: +bfv(q<A:eűֻjݼ2D n5'X_4@ä\|^pB`Isn'V:ay3|np'1n@R^ +d;6 :hH la'Zlِ?T¨#-ĬzؖOٻuefi +._ +w롾<@$GHNŏ6C u 8⒛~T,lCU:u\V,̘v ;uelWPLʢji.]"%j8#u+ (_翾!Ąc%s) DL`R`n, +d%0".G.Jr4t.Ģ 442H4@N jT9yTq iT{~2sFǚ0/y>stream +0 _@&M* _KNN>RRfM3'/ wtz#l=`Z]vぇ Z@wF PS )F$fqKjQL$$zBRQbxd}%(ا*ېFP̺v%L _ԝdK@P{>skEGw%(¹7茾M\$QJ'W8^{׬+!PvSG`D^H+4vl) 9ƞNt50轕/+_xWXq?+t-GmL O)+ k_Y&&/1 +J;W=0!3JFNhz=g_tg%_AhTW$c#K|r {Y(d\$ +lH#[洹KRm:o(Gh0h~˶K#*NӪdXo r_@7DPOWt@Ŏs m&6(Vv +~e$ؔ2Ժ=.x}#z.%bT6R73Q<rR#H$agU-OkID༗|[m'pRK8OF*ג,k:K rp=2i0 Ho`MyK!ngft,N M7Ko4lkYV]v LA<jMՎ#j̡6pdW,qJP_ 7 l;US0.JuL{v6ڧM8Z7knݿ`Z թOz;4#{Y-$]H'T|aڃDօ!#anBYK~- qЧz= eQ8J3  +;(`3҄*~2%HH^SB?%hZA#*M%W..lٴ$4Bh\xXYY O~49ŭ[]x:C> Mg|\E%$.w࣬Jz΃I.R2Me~vAGM{ޣZJJoƩ䳯J})>FX"$Sj'͇VP6QZʷQdG@f}|h +l@'B_s[cx}-hyLy*#pwXFeR *h,R ßofG [ծ!W%[n6_Nս]Œ +)EjwL5F˥<`pq0LKֆa/V_d*U!"g\޹^@ 7ن91'<OqFj6g??{<m͇Qٕcw42Cgvڇ\a`f o2F%]#HӗhՎMְEҤ +Y^LG#d暏|e19'V"S]d^V2Z +^/҅j>]<*`CGђMz{s#Qk9q&<+OU10žY@,ds'@KmUfU";0ҒNldI,_>bllNoРzkaۣ0G&UBgC}4flR0@kW'/.QcIη)oRqܜų.fqUWL 7 x~;ҵ3ʺ*zU-vr'4;,rBX'ҏi.) r}mnRr"/aMe騉P5ȫ, #r 9YlD=ߺk +č>̶iHբT.0}G/;ތ[pqB7rF!ՃG{ՂFh95PJ}W? u06 M!}&MnY<"=φ +LV]$X8B¥'wIxeR(}v)sUQ 􇆺pG:_JzX␕.B(;wdu}{UlLS1}Wc lBfK$'ROW4J Q"rLyBF?vj{|_(mG]\`t14Af2"tMQp?ut`!ũP>?+/}jUH@5JyP?E\V]~G˞ǔ {44U>.%7RƐ8mӚDǨ}8-v/HZpB2gMƽV Єw| 盋,gP'OߔLu3Gc0FhYq*;mD盁%8 *I+Ͱz)4rrx1a6% g?:b//*, 5بpbB}W/p"j̇<Ґm[|oI`<<>?ҾI@Ӎ{sg' .) dG# ɥ@-r]!Fd)(_&M3RBnx+ůz$㴿onBx `wC^jE\?M~Qw{ +y^Q:KUSd [i "o߯d>Qʱ"3.a',"BMp*OX8Af3[tz "J$tQZa +D50 a7qR#G%^|ǭ' <7eVVK + +Iɫwk}|pc3Js@@Bgh )<\.6Hx'M`Y]^8 x?Mbte@mBѡ cJ +"m&^k/CUDxeP:EOz|.er^-071On-d.gZq:ueu66/$ +FٙDa[d I\!Y"ZQݪI>BPs&EUrFҳ>%TG(S;Ea!ֵGh7|f#%'*',RyC$1@mc|c{Ău0ԨTW} syFMUbHB.KGHdmWds%VZǨT =4@[ RgQ4 6{>ṛןYmO$^b + W}hb B0- q"&7>*`Q.p0aC>CkdQ#癫Ea4$}}mstA`{SjB*A n%q=2T1W+i^Q7SR"Eʑ:-W }G#;}$4$9:"IYQx7Z~d<~qWo/5gL4DPm_|ͣcCpL(MD2904dwx:Y^.O0NSg.NT_&JdeO]@v2%QN"DH}KR=0n k:6QpzC1=Y۸]N#ŒaZ[eVl;2UZCJ'a|PeE¿ג~w\+DJ Fg;Yk> GЇA1KܩFҕ04=_ZYPcspԊ$x, \xʬatF[0  o0Uo#A6pSj=Rai"brqPղrWxKZ} +S?2,;T])+v~Xtq_ud׉03@ts +[Yz.`?&{DЂqEkI1jveUtB: vi y~N?YD4 ^f "odÐr ~xܘ6Y4N!cQ92KҘcBG&oW:;yR x׹w(-_Cf2v+gnjGSe.CVO|ᘄ"IdL{73lKMrJhӅ(epq7U.Ӻ/Rvx.pO^[.v! +k@o r#8,(l eq .DbZV9!5OP?"` hx+S#oZ'Si*P>7˰f?}Vʹ;~ض {:rި_|ZqN>n~kjx#Ss@65=z 5tRgCVw +$PCվFmty7]}kR#O%kU+kクS3 ٨C +{bLDc@E>Li,!׈#=(,N˳*J)s1KmCl^jtAkTCO*d뵚8V=vNBYSK`paVS;1JԝDNvHv/blyt>ZarlAg*^nLU_W[ij'^#_uԽMcwLpb6 <ߤ\U~(D֚-E=!$KxY.㽞\=#b +zl(`s,< #@e+?q'WPo`#{-|K<+lJǮ3URҖ;tKLpvw=?5r_r@!˹V"/RhC9s6 pXz +M!Vp1ak8[E㵬EL*tMat|+㱞gm u(XLż M ~Q):wKhPD'+Γceq*R,(/6l~pL;$7#=K"X8np*7& Hn3ї+6)\[s|8i%7t\Օd@cu>Eӱ2~1r2XסXĜ+#vSShT_$pˈni kB`Dbk\/.F({KqM2/u'4)dCܑJnGHQ3.@iRB3IXf;.?fSĻVԾ<㸇dvn0oVDkV3h[~Qct۞HRuË1!0 iTj&0<ʊTG͸0(`W$Cy~s"{q4w$2V:h;@jDQƗ +0t'.:P6R)hW16fʭ !W[:iR}fg$7.\Wl -  +}]B]/'Fӛ#'Bn^ IFe +ȢJ>v*2;x$) AJ*C4Sf"犤Zyv;vCJxѱa>\6^Ϋ⽰}*.P%Lvk-A<4/"jzڭ~ܬif~hWyUy`;6_7~m*hH_!L, +^<njm [)Vi +f=mr TJrP5S%ț[gxI3󑫞29劝๩R4v oz2Ž]ʅj<;DxsgA̜B;} _`֤J,M^%L_ciaʢU%^bi qQ!a|oo1_>zm&M"u+}6y"fDT`dpԨ脶yB7>>t8 ^1[}$N3{zkg1~ +ȣއ+ۈ_.x5JpsUXnk tz&% Xν%IEpoq`u[}XT&/ F@#99|1U{AX\\;j6!hY?%tYZnj?pO`@^@~d܉gKhTW +~^:!Au&+A3 =٘ݥ8൚BoA,z} w3b*i5fVB?N02$핚ZlR^(.EACb;}5_K' l鑑y??$wU[{ 'jq.|4wP!4׉K!bW&нhK\Ql`Xqw?}jN J|T%D# \X/ V@|IyN% av`UT,F-*#fz S <4OCal|?}?JLJj +Jsx$llb1˘ͨ#JmGQpB97n4]1<x@R/\aMЯݗ"C`(9뽴m=7PuM +O:!3`Ƹ@&iپHkR&Zu].yH8%Oο bkR O lPgY!Eox0,8 zM6_Jd&x]/^!+ڇ[0v8Dr۰F$&~J²y +qRo]qվls{l5exij n@(O8  ltڗTŝZR3UtDn/1GJJఄQ֟7F.ynءnzAd=-+EgtH}^fw=@6 VOCTez\o h&Œ&l $qK|L{Ssj8W|zSsA+fL.;(DZ3mV(|&AZ3~2fXdRGBh@yh,߮Q,XY +g}ۺ|Uֻ 7;h v"{$ +Z1,5{H+_w)bbEP)M#)׬/B)S̀-73KECA ?<9îK6=*13Ͱx|\lƥ]R:ؕ7AY\p2ڼhX`+RV˨񋭶y,=TsЧWrʝb1{Y\S*1Dd2ڰGݩ-\X@\"1UŞɃΌ o4"qhxl?r1քx\,?[d={a|2S@ܲzd4ΗGRhh(R0g]޴C%Z{b珟<_Ô ifSƏw,ΞyVHӽ.jDtW"mgl&%:--\C;go& er֝RwKIs-F%\ մ)'|H>R1g )UCv>+B2ZgaRM((eu YwQܹZG)Ix꣊*x\uB }L];gMT;\z",VH@"SIH2n8GH䩓Pi 򙕵zsh^[3aJ{^2eǮRrrE`K%Gz~|̱)S^,'1}Jk;g8s*R`Gco`sWi򳆠oY! K Y\4y\LK;DۏȅE#8xZ( "Xs}ig5h(.ϞvFrtjI̠D'Ay7އRS.\.@7C +v`$W#!գv $ +g ɡ.9 \cr)\RIډ/dPVAU&>fʋG7gE0ˉUʁ"0y܍QIY{oV-99QϪoub-R:b \n…F6v Ǐ??Ґ1h>D?h :>_t6)_|̦2Xޜ?{tꇀV| 9Vde!cLfџi{ 1u77%|@tp>kdH@ff`<HA%@hhq7UzRKڵ*:rzcsdUs6y/`E| 8K=Dj:hYQNaOV#z~89h/1kЁ 3669xzl¡7˲ ݝ\: OgQbYyyTH.ex/'*Z b)p)O4#"/`CM{2 UKӀ9E-s6{qG}bG<8Ay(>&8Fjb9tLͅgU:SWlTdۤǣ{@B9pjKhUq ޛ3:^xt +n7'jrQXEr/LX,{ߡ`>,"bo3~Ck#@f{+)G\ʈc(q ]=[s\m+w]ڍG0EbѼ5?"ȇd + Y0K~ 斻V3Y{qz\Bb;=XP#U/ +g4;(TЩ@=BhzB(D i{cj.t`yjfnjhECBs0)n-I܄yl>`)*;r7dtF[ m7 Vt@M%Įb~X">(s-1TRj0\h} ,@}%#7] +')u8_Up،J30 Zk?C3l0}ً}zT&R> -kJa~]^)̝Fr a}\ILHRh@C\w +'d[B_([>|aZ>HUR+'+O"@DZh.I6BxM׻BAC "f: ]luӷy&zd DZwk bO2r;rB@~z24&{"i;#iآ9B=,[%6N~vA39 gZS=xQ>K7DP?/al1@Ϛ<3r#fhH'f)Af-rix"~8Oqch#Ӵ~  MG<ćwɐS~၆ncroǍjO@_۷lU=IS ;V(j,터:2ǩ4R6lO▶Z9f6 ]1_[B5{b(9FZđ*ddZJ)8.| +cn;<<;9Ųj6>gY1n}9MSW퀃 -fl11(`.騢dcI q[{ůXx'ۉm뢝"?ft2П+E<le~! &fQZ,g~tZ(]Rh}B_p{k\~.ĉO{h ?`s̃;v4ZzӱH8?fZ7,*M|eA#8LZ;Cb1|2)7/Spy( f dmdn04 =! ZCӱ "yD7Ŵ hۛ 0q=JWW/*p^ +!h Ԏ;mѷ [zkصhޔie\C$2;zY 3J!m9]A}=B SHD}} UA +k2u{-2,|HqaSQLdR*0ph"z- mQ +B81ӱ4BRcsƑ-UyۛDڝy#$ug6m'AQCğ=HNOaoa"o;όFx3|-aQd[q+8:lL瓃fy +47*h RE+N$;oNW)U՜7UrJ}DAhlIN b|&E\2fTe73_c +0>L":T]FbwH +T?ldd_eCUN +(n3m湷T=GB6d.@^Q{lVRyzb ih$Ǝ=f}=y7&mQ˷ּiR ؕ 06BwJe.5Itw?ՁPdY{P! `i1\EGoTK^)F&w׀)@`6>dB Xӝ+abB uALfa1q =(槚1 Ln[e+庥Gax~WLkYP#=h+ )Vgi7P橪L9>"^Zp* fX|;]^"(D=&}̃2t9IMQ[Lgrh!?=>nh|ucddRb%씭ԓpNs:HB/p'r cOQ(<$$B̡ʧO1rhLN &{(n&AyVP4. < +l*a7 i Pa #}߽H~ߖj.s){nbnv +zKYn1)-75 |m,_=zF=ݕ(H2uAV(^ +~wjil9eh>ǽk5"AÕM eƄD1̴ N0U7AL-TaVy} ȏYh?zəŎBxvٝ]qTim"5@$=HBݓ?\zXM6 tSV^z6:m8܀7fo~+L2}hP"'anW*[/$rX( /oJbv[=ΜATt^6iSxNmfu 0m+BY3CT25{ժyTica,jꕯȫa^d2[oV]F.vbxUKk*tu)ET ~qUZeo)ub4D׽A?¦Hf#+^Jl/gb\μ{.jφ5,Хnm Yb_{TU{%`1hBIisr@{4D5HUahҟ  "G%[6|x&Hp]`GWW:#cboOL=|Bca#z_\ܜ' +T'$ܡ*I[3~ڰ~!R^s:&#OmDžl4#4DuȽCch͈*g,OPǚQwQ; jE~ВdH/Gǽ S3QX =$ + +k| ~ER{^M[džK>l)=V˓}N:Ǫblӡ9D 3p$V`ng\i43_͓^ޯOl Ђ=Ym1QW= -5q㢟_eC2-[VRX1I>/󛐰< j:4Nrlyuu^4md218Uٞ B~'{cU?)p>2z]Exm?TBH|/} ?ǔ.<>DG5O8!pʠ0mlGwN1Gq_HSؑO% xT5'.҅(.r}6jB@./ *|<>ʯH! 5-z;Xkԗu1\ P19[ϑqRƬfŜ^Un'ՒE{*R#$,#^ Xݢ+ﲾx0di{PJv_ ,[}al +QkWu º"@u0ڻ{)$Bsˣp6G>Ww_W7}*GUlhduU(`L&I9jՌ QJMyG)L,_D 20cnl=ym19M5ajMöW~Ϛ:/:G(샄x +omfi !V!K ĠzQ ]&:ӽG&2l9N +nu0EVRGg#lpHi߈d.]:ǰ;(dYl;o&\r` A]¿sm!(fHH]j֞?yeܗDOCQ 8D䬿Ӻyp6Mا(4ߒTTƠ3u}WI&ߛQ+lhsĎ}8C=ikԧ@wygr{K觘»"XҎn+rռ,}̏Ϛ_NZ/7wsroF{ԕ-.PA^U / ̼M-d0}0 3>(a^")o끐zƳ^C.teqO[Fx0yFQY8ƃUOpFw1V n)ugSu +z~vec@x`ʖ\oQ8$ +Z. KL)ON461G;KhT;]4XpKukq ^Mz,9iP;J@n 7׳kLq{H PcD.uʽkHɻ2jfǞ['25z_ /i5ӊ{eg~}F)5"Ұ湨:r>+qKќu'65y_>amS"]iٵ䂩<fہv <D'm}Doo9 p%Cf^Q?}^Yw2b4*|;4 +퍖-5)Zܙ!@+%ߞڑ5K"T ˔mfNfdirt ac(%h9: l,5]R}l +HYJR wC|^i̥t\^Sq ]!:x0t +o/}>s;+zw䡭:e7<2u`ql>ͮ0`>1`L~xL%lf r5j:5a^C&[ 醙qj c?js+o}UPH$vӏS endstream endobj 3471 0 obj <> endobj 3472 0 obj <> endobj 3473 0 obj <> endobj 3464 0 obj <>stream +HWn}W[ր{7@ ^'RzDIgcק.gw.ЃTթS܈!)(h曷[zo芭o(+W(VJIno7M0$Rtp~lOWXxNSiKl|®%̮Ć{a7q߼vpzUօi^G?܎P ,UΛ 1Ì2c _e:B6t>z0 2~Ot=9A/j<)9ha +uy +Bс{Swnl& j0N S7/`,cB@R=.z+8$ݺt)M,xiH^}g40H`x'(Wz5]C7Hd-nS%||dDZ۵e J^(hxzawO}-@*j5WHom׿C( [(y~vv/e {ApTAA[cBAy_8dP:Rߊzzc#1{$.?Ct_A*; S@ʬr ؙ݇/ x(-f˺FS0-p,Q?[;iK (GX"c|}H*B ک#\:]bb + E &XqzJplC3x C}51Ô&S-10xT.'S-’xmr" 7$`!ԵrÓ(Ԇ!m63*0H+ vo@*uA<%î0 !^H^oNMM.XPx.cyA cA*l7@N'TJ c0ق9z|vH|HYxm#VRxsb{mO}&er]u$OCC @ibmAn%b*V4t;5݂)]]v䌭+V9tvURZ\1si +VP(~Er|5@G8*VnYI`U$c|?ҧuβmZp +oH3B)"AFQVI$mRo R!qTH>0|+Dw2_Tj9 Yli 5y/: +d&1W ]zթBG;F&0eu"U(v ~o=Moaeb*T|ɍ:98ƌrPzy"Ԯ#+>%OU* $F`>}[gZ)ܞ&vN$X^ebX/(N >ؾo>aؼ(t&wcY}5hc4Q*Q~B.ё_Wڥy Mc a=AV>s9P16cF$uPc5> 99[VƐ +{Wr)~*Yl<əŁ$P'͖>Q2QI-F!Sq2xUs<b{Ԟ ͆al6];NJ9I}Ŗr3 +<ҷͶ3Dq,H2L'4k &;F6|9`zK +v@ +twh(BM 1+eÐpaK=Ό$Hy㵒lƭA*YHL7_)KW +Owgū ƪPvJVha5/eyCor +B!*BB]mW-4i hd%M@TaRTƯ8EUdVMMsҏyƤcKC+gQ=1="hYbv\-E@ "V f֢h3|k (gG'9mvK8 +ua2_'l?pb:Qv!0O}E3Kb=4ɥV~,v҂|=f5a-ZN/W5Qi\n99KB0 +;D0S2nZ *PCÒ.`١i\1b)@r9DQM'ee(H}34r`AX]3DM0 _t>{$}rK#k:+۸p#fuT9Xs!XaȈQ]ʛs)5V\RBMO#5(+-0۫1#AO, F+lQ +5҉4j4uE#i7mEk+F#(?4 /{#j9PT$.y4!D!;Y'zAx[I6wf$u#$ U~ 31R:6cCZ9 q=7L[{\oJ29"æڷf:.ޥnX4K tt |5vEwh`mb}bI9ޓ#K`jN +X3aq9.@i) <(b1>|xyN D90}̔rIqq kP\k5Q(_nڈL3`kaCL=% Aэ3 ĺ̃ >stream +0 H@&_ H0ZG7q )Bt0؜чJV=BOQM}5& d䞎8`&|"Q[(|H#ip^vٖF(f tȻN{RwF-FivgƵCvF32Vcslvh0RBA_#[>5y<y١J0Ou3KP^UѦr>Rꠧ+KHsX@/<0ueh$ä}W/:\/4I/9Z8gWRԖ"kG!なq +?Ao06NuN#ydOFBL[gVưP?’\ld&b^!(=C%g0V6οFP1t ~c&'B +Wc^|4ۯvOƠOp~!tҥ1L$v.0d㑔yO/l/  cјiE̾NXqis͜_rRswWϾ3:뾕hTtAe-4lAqF{K;}:(W_f1\tDoZ@e<} 3 ;rzo֛Dvs +6 +!_']Qcw=fvJ'y r +i3ϵ1!%/iVRzBc8`mTrt5Cj(*(`a}&.baej@L|~w[{P0@oỈ;E(2 +ybإѢ#IGh[ǰunM606RGdhNP9gݾ@ gˁqO?3'}|b1Qo08$,:]?2>ENS 9c1A߬biWXŒf )?pŦF^w7>c>7P;JYl+Q}zbX}H*_k8rsa$#یMlv쵵+D{'kb} {SW.4j@KRaur_fg낁(AvpEP5rQyQUKD,}YγҠ%BGw+ɬ-7T&-X.VVke/ +~O:G< +C{sKnW|3Ŧ4oJ%(5,4Q5U5x:Rؔě˛CmMoY%9)lY=&QqȘ}"xYyb<=U{ycJZ`/ܭt +(&_1B|xif2ke+iԁ +NH ̝c|l2 ]aqt})9o<{%^U[tC4oxD}N +=-b߆HxXg;Hu6 +_Ӎ&K~JϖzƋX4`˞WXb~\n6$j_0S-M{.֢8avjLH%c]ג]bT=#J(KK^:{Q]TxHaZOiـ2gLcXO ٱĪ38>,.u>7HFy. ETPƩ{~*! ~^TH@"2֍Y9`2ҞiQB63 qDki:il۠9gUvvg"mE:^K]ƪyM+wK&ʺj +,m! +C ''+_icw-isNgъvsWh3nS{MkoxvF°Yj#$v y'lY죌Hz⯸jΔE5[7XG6FO>ȯҌ!~3޺gfUBm8ƣkR;wb_8|㷠6tHX? 4ɐՁ Divn6m1唷y( Hx1$pj$Ე`/Z^ߣV@`*s, qrYi&С>%]LJBpٞz;+!6y.Vu/ '>ג|bJV4ԋ9udDm9@Ҹ2 g][Jjz721 I(i=Կ:j"a([27fa6Ȟ-AmA77֞toNkR8U*G Oz6C+N/qM\6k:έul.O k@Gxy%K: + en}4G؄ ю]C/JS#}9K7K?َ^be`ۈ4ꤩv7oP\͊1 n]juć: SsoNQ X ;q~C@mV +t-ۣe5L5a  6qmcQ'5df +19倞m"qĵq753{7J~{ᆎ ^qbɐs=xEw~J4| ӹ1 'M>|tZyb6{na qtmL$v.ՌYN .@ƿ;;f﫦a#lca*tCulK_Z@KF!͇^z^zm >H;5/pCZm>F[l0q)',e,H?DRڒ^h& + t!uM~loGñxvӒ d* m0&Xr5փԄ$_cna:TNs1mϽ0z4R4ahG&;BX+xKDz VTM7_{:KжPYr`pG +oVbK%UO)Y=mԚۼ|$괈Vv~c{D ܜQQҍuݨ푣[YǦ“`9֎CT ILa=pUWAw ~Ey Q96Ss<򊙓's*}^|h4k<68Q-M@2_1lW!؈!d6@ġOJ\ -BWM*x`e N!&[ +gYWD^[?? +YaZeBbyJW߇w/#MB~jA\Fɑ_bcN1_~0j:`wɿxHA8pu@>Ƞbj5Jo*K:fE,7hyV!PŬ+*vcid/JcJKJiHƪ/%)E +B%%YvԠKDqa +L;/c>.X25Mߋ0_l-.6!y4BksƈB{G/}?.e9}Le"RyB!ʯyf-OnXa^zGZ1La{H' *jZؼA:.2=BH!6e+3"705!él|7*rK+t c +Z@34E4\KSWcbZGnB5ON& w.cXn`i@ xj#A-#m;[lLk ƽ$Gr#rU@1(cOr c;P5,+HӧhVWj%A[(rqh ֊~3fJwB^4Tq(7JzWҪx"&+"L 0+9}lMt>B4(H$Q+X$GnzkKⱴ_ݻF/L;S`?ٹ8tq#}OV5**mY8bNm!>E}MG@ XlrxZ"RceBo[*U,GgVͥ9a^&*e\ZEgAj*EFn## Vo7^bd0x,C,*]"'Iio| +MO㍸YBu}ѕж n +x |gZU^UU5~ܺhQ L7l)deGE$+_ҏ05vt Jj +gSTGTǛJX aQ#xW_{j$ǯy=U.+&+ +U f_¨D.lTG)uYtan3ƍ<&YJ>kķWLy4%0R %A%#B]~:_ %`\W '+ Q'K%ܘq̔NJ*;wjx hL&ie?ek &U'ӛi"5{2D_qND\ +OOh*f5@)Ef}y20s=;1 ت)uSstaZ þOB,\&SxcEZ4E)rΚ=)9o^I8<3kNij:Y)?|pm/*FۼZoygrxHpj"܈ھ$ +UʨaԺbO=J%XT Ы(2)X~ ëc<4n'D1grU*>O552:Z|bYغf&5i܏( +S %E44D#cT2i*2w;Nfmr:o%H#|۹rڬPDAc%uĝ⍬!3Oe +ⓂGR L*r9˒>x3O'*0[xÎ3ZGa=B$x +N=+ְ)g|(^24П4r-*X+FTwwt.;62<9g9jLJ!0=,90Ubq'YXii|^]plZ;nr]n3^Kh& wІZ܄l$hudfEe$W8/3oG0KLE6P*=0mZ݅}l1\%Z5@V% $ׇըGYHDO8ƪ$1HNWp^);vE1{?3Vd +0OpF#ad%*L-at NP2rVPɯv`!mLRxڎ6Ӣl''D7鞔f}7ˊGyG5tѩTM6~h3~%iUk4 Svy2V;KyD(&f*1ƈ +9#n< D2S ~(8P~3mKN/, T7Višń]v|}tӐ4au]Pk*!`>B% *Ifd}Z60 Ǣ;'t7Je?%P47RDOq1=_U:fäZaxٓha͸˘?@;l[áJDJFTPH'޷:;+MZVi +l&7/P若DJyx ,#8.¥ X uni[ %aLkQqrT/u ShCP 1 E87+ +^@]A'$Ö MwK9e&AkLI$06C@41+"oulqEYװI@F +hV) +} )r$xKˁ$D=8傓J!@2-~.tTb 7gjƭ'"N +DFH'?ONrH*,;g*/ Qc[Xe#E8&j5خSJq{JtrsrjݶL kn,H1Ჿ66bեy<檟?q0M1& +!JkՍ2q+_ leAcA}g=z-pȊ3YO+j +kWg >DSxfSGO@V!ړ!ud +Jh&lDI!Κ>ҐB/Ϋ0Qz}y]35VFA*W?# `I?=`;!\tSL6y.Z/o8v֭Fam n|hb@'pXƻshX(>U%9t,$pPoѠ, dШAB+L)pg6FL$=݋a(]'XMNhSvhg0oX֩+4=(!MO؈6-kwJf6Tr@mqwQ +2.RBlq(#A zWS|t K%u? :vb:4I㻥'1IpH?H8QDXi{&=_|h'\8['A+EK I;T/`o>>QZqП Ӌk+U59+Ox}|K;^ιR|657q Tf<<6C:0ﮕx\kvnV,*6ƚ,[i`37Sw|R-ϫ εTܽ[N}cr:u"@{J;PkEs`/Ijx wZ"ْZ 0ŵ5d)/^ﶠV0gLYNcYɮ(03N߱Ӱa(se1 JL'i/FmNc+JUD~D,pJZx.]%h-#N ]P)r%,\9^DA3Dֻꠎlz&~ +A!x\'&i;PzJZ#Ѱݲ !*f #Q";Zؖ<~g^k%z 7.DL! + ϼ "bAT@ +^|߻ۻtPBe$o"Q_Y:??Mu+MtJ NМqlMr)^iy%wE [/%`́0Ϧʗg)oŖ 'jtY뚓ʓ~o"HPtӕ+ %h"%B+z3Xffō@`䦛M+ +ux264Fz.8Q'u5 m\`0tlffٓ)~KaJJ\#S]<&]zw!SJVV+σQɀ)S2`*D2q]]\`*R5k_2e5qMrs.XKBf EۇgE>HNmnΗnP_(z *b>tӻR"I4?kyćm!Tb +g:(DxL|;W:xUyUn5H 3گ +Ǹ ;42QΕHs\Bņ/SRN$ wر躖`R@7 ,@ :L'&Wtr +ƍ,*(8qr;DlAcHW,6)yw@88vuYE1oRY') +ЄSL\%BY3[ nhV  %yC5o"`Y!<2z8<PԑA"iF1V3a0Z$"#-Gwe^U'`4ŠrLJ2v~3M%2Q\D]',ėUDz{h+7ӻnsϳ̽/9TQU,{`dWZ3nEuhNS}-\ykc'njHYrWw[YL[ڶhq4UE4 ! WbOHݖg ZHв7Z<Ԛ9'xw|{ì +wge֯`EZ۔l`H|竌L16pf'" G Y%Fu^/uJtzX ++Qc }X6OK*RP4{ +pSK;blY202-{ĉIm(]H%B[qla.bZ_v'Av@F__ F s,D2~e_^9ɸ +u`[Uq797D_F]Z: B£~MZ24\mp6iБzE##'~AW!j ]s3 )&̮lEՕG$Vb1%-[ͭ{5P}n׊ڦU\wNcgWfc]W խ{Llnȓ/n<VbD0ػ-RZ{i7I\1|E\*n׷'gV)5B^*z\㱺ҜX0W-j#ZYN aūY+?Q>tC +^z/(^C/hJsVozʪUR,˦ޘ¤]4#eģ:ZV#ZM?*=Gx&9F.~T .%/3pa*਍ꙢF81({/;/Y2EmaŒL^!8,1[LB!MIli ;e-k43\-J9z^p.iZ/IR˺]qݣ/gXIhVd']ғ,k|6 +AZrR׶R b6t×%NOfeKv~.(ހ~ J H2*R~ƢE6j>2F*٭тЃ&a (|c .QȢGMoPIT4hq{!e!(_P!nmǏl=ASHn3aU\~[P!>^:Ziz +[ +ܴ+VQ=#z zP@5k˷,D(5#νjQu\]ZNN3 PErق=W~!AVr8O&K_j2!cfVM) N_t›F袼zUfSg&?AkS~]^#VMpU-kS~2a0Vc9yڜDeK0D*`=G uG}"* iiMV!9w6PYN%:^ȷג*KFƂb';P1U?a:)-">¼ P)"tl rűJ(g)%gώT@!OZ vP6wk&7~R " 0sf:қ;"8\Ɵ AxZ + +p=vZsnMJGb61-mo}n:^2f"X[6,ՀcjI7\hE7B7\-UYTSܺ "0iK%itFD1s5j23y;Utsl[Kxw <u(>}* $/Km޳"^ƕ6Iv+0߫(yi+Č& ˜ߢx8IX$s;6ݑTbEE.Ĥ; +60N:d;2s䆆s7k_N}拰0:S r&սI C7hk0&C;]m3~|vp^]yZC:}-ÓC ++RAxG% Q#)uBLrqJȆjZ}*9_u5`m!1ukVH- b:s ;CA%4zM3ݏ)VjLu -?*v;'珻Bu$ʄ ﶣ9t +/ʓHh.>73f֍H +3BZk^&:} k<{55$'ߑ0R6z¶:OP?u +Q ZcEh+ T1NqQ̯6ô~_ZXC@Υ +~Ҷg>Z8eRp4L@6_Y6m]2p_ejoBsB04 _z.f>YRBG u;)Z]X?u쵲Vv|Wp>d[$f}g͐ Ugadˠ8 ׵p4sd\cҢxn~{ cb%|͆3ڃ=3ژ<-`#$kl$8,pPj;M%Yt~amx rq@[adϲΞP*nw$ @ޯ\Se`F`\>0kE֏B&rԓ:3gӞ/烌O K ?#(z>u13 exCc t1ؖG{HK}mgpCG4Vwn}S&HvJ8OY"2^LB8^2q-/Y3JP?-[ӚFCz] zBsiʡFY5*u؃V{jmރŃ= +zZQiG!, +N''@nvHH8M@@\ސylSlLWJu,vjbs)8 i b3;ʥcDb[x/KӔI3|ljB&S!'CΜ,FJ@K(5J'$ݞ!`a렏LT)ngHd/PN~{[QZOa1ȃp˶Sș^W1B3mD|fc^OE948˗OrcC6(B 'F=26#MÁvEMO9^{9H5HԵx2Te!y״;h—"94/[|rBSɷV`zh s\2bzAICՔ:r5y47Zgݝ246ANuؗWI(pȭ¿IR)QΤ|Rs +PJXLٓ|cSX7Ĝfm]=m ; >ڥUN׆i);M^Qke侅 +2zCz(*i ?T-`PAѹK5o NCSy]ǁR:ol7ܝe$WCVΡ;,S +xnrIam#إQfi#W؋@s ]7Wmo8ڃ62!pj@1+YeDPEjJM}N7S +oF~az9^WXj](0uIoqU Cf0Kh&:2/zߪ ˅{AeNky—< +mg`:ij X|!nCH`S93to$|r=-?:5..E=fsgS [K$Cm i*t"HA +lwçwt:5oU`#zsJw +{ ^ lX@O:hju/? +Uw45tb%ܣșteܯEDh2h:3^Tiđc@i:`P!GrT7 Umpc7!ƌgi 3AH(ӺhBi$J!f2Oౣwg+ٿ_|.'2n,<[V/%܆;IPc~H;b lH^\uќ?k ':}8O5>lxΠÏ#-;yaݢjeY^=8@Gy-4ƯDu39'x)v6Q<θ`C.uR%~ZX`?3][w"TfIzO)K޾en|X Qipuv(4w>Yk}6Uز)bSxF +Gs#"<A8跚){!MjƋ\bʛ #_= YH dUwF_١Af6!ɡX+k ( *b2.BB`Mt݂"#-c幓F{75Ш DB`ouwYppT!0ʃIE_bHv<֗…Sa,oD}S%ݢcQT"yt&fm We-X5uT3&' ŌIp;& TDh-MLxhMM= o&.&lWF\ /CR +YgΌшIXExP0:p vJMMD4H>qg +f5U]B*$}ƣI XG K<)Zǚd!G)Ё܊{&ﱄ@tG( +y}!48Q#GСf&B9w `&7y*ܕ1v=Ht >Jˤ)?x*bv;ѳDT:p$w.5D8MQgޟ?7xT &|'xfoFXm (x94LKzjޣ&E3(s.#E]a>F>ď"06hta1s9joRԊ({E,h؊?6}{Jb8{zJ ~ڿd^Հtm%09){/KnӾ\ِ *_1ӕ%cn/pZ;׶2!WrxU6͓[+بؔZ}ѸyOPNJ $ ')AJ'I Y }P. +ͽc|퉤&. ~ h67*Q/3iYφai%0jIe­6i!#w뻉mK^8aʯ V ?TQ_2跫4fS` J qڙˢj 9^73M32e-D ^|!h ?8J5M34E2a5sJ:$O5r4k¨J#:1goy؄v鲇)<N`LNsNe:2; aČa$S8+qsʪ[\t -ketX*d0"J͘[S?(.e(l7t8 + +j Jhӣ7T +~]en 9\dvA(^$?C{yOA`S݉/εE˚QW2sOIz"k^]] 9."|=qw.I={gB-̂QWEx=OP!QnH84RN.ߜO`π +ٮ.-IC{mjz)Etm` x{υ}VaXw+ab0 Ǧ#3YloQw񰗵% Hx3 cZ/׹ϖՋ;xYmHCdV_+$W 3+зec-A۠|H`Qmd#6.JpJ1J/=W<5bX +Qc|JQNq~La{*mfbvb8-D1Hp{gtG$6XoS7$KZMr ]&ꇚ>Y+9ށs\[Ej/6JVe.jԈsH VIx0AQ仜$4cM(N=DYHuD`88J+Y* r^6?L6M|1JM O&قW^9ХA|O(=>Bskڣ^."5N߹ qt&4Qn[1$=x H jlP`yH QtiXݺ{O; >2nzİ %-5H&}xG/n[h{ §j >Pvh'&1+5<bR~ޯs 5x_9# fvmp`yWgܳ0W|ܱT(jخWU&?Q GX| U4& K~4,>3GAf}RCMĈ4~̶\ -ٳ6 Q_b?RHWYa^ 䤠@SMnģkwzל[ FӌfiTMaiAۃbGIR."Sx.5b;WYJ*LSS .=]CJ@QC'g"sU4^$y)t,sZpAL#w€>pFiuAX-AC9 yE>Q]se_ 8 /?GbVgَEbo.j혨u?zR{ыgډU Y((5Eţt@M/,B!ϬUO­fo 5&K Nx$Gˉδ^6#K䵔>e"ZoH<ӷ[ow~Sg3a .zΑS`8˿y+L`d|nt{q͛JrCxWWSgWqJWgd.У̉H#S«y XP>{$L&:fn}1&2+8q9[ooF'~W"]ij8M I +E\9k]|edT䶡J;/]W3 )%ù5p#I[t#t/46/mDNxgҶi>(t8Q2)۝h}v"vk$}tu_d\:lğ"l"j󻯤CI'm5$okbI9 T`Z#V n&舤%oPW'S`;e^E"9ޒ頳)/.st޻1?G +% +JM8*UFDc8^F'¸͉R vg=Wz\+o!sr~6&ME*ĉ4Nt?RBǩܼ-ñzHiⓣYFkMFBt~ï8RHR}z(RM3+DVZ`}TK/%ko'uX)8y0G޺qNCMAJ*'E$M|YH@}-0GlU%wfʯX$ι+kÍd@xmZ4%w5_QtuVC(j}kW o "!yG$m'G'9Z8J9_oK ʂmqx6Gܖ|Y駘<\ެQLZjK!BXc0A_}.~1<ɟ^O"Ւ$E?dشxs^ 6jeab>.,Ms0P +/nb$jx!}(v?{ѐt8p,L"] =(-Pj9+2ʖ˺VJA +uϤhAّ|ȵV5|p]AQ, f=_Ťd0:\+bz1R/4kǔ{iDLfJ8*O +%p`Wy08TVwOW#KձQC(.JB> V!rg0>]2|tW[D#OeB/ѡӳ"Mf +!NYnD\4:LDM.>ktxh쥚 ,-'h?: +Iu$Gކj38dk!?ZCzYZJco~1&PH|h]NKO#mJ> endobj 3466 0 obj <> endobj 3467 0 obj <> endobj 3468 0 obj <> endobj 3457 0 obj <>stream +HWێ}hZ]} ?he#H6K;Ҟ8ٛO5JrjAZvWSWR+MEbp7wzۭ~Z}^_`7_ͫ߫犍Xe$gPl_Vhb8]}g(KVVL BU +D4 +41fvMpm2#8(QiǍ"Z\du.o0$ +ChRJE8حvv_.]}9Zx:P}nWۋj([Kwh"<11R:C=\t9S};FSu%A$sy懾iggN@ݾ޵x"ɅY>yuxyrE_TF٥/_޶'g6VM3~z{j%pqami޴1%NWB۔Vfe7 0w5DN L3h/[e7Om\OOQxbPo~^7b>OM{6L1W!9qUD<.*-uX +FL5T0xV)&6؇zHCEKs,>QX+dㇺ?*z3!5id"z+4 U?3b:eϟHY#IxQ\} # gQ$@:(nw cl%@Wqua0:qV&+`s7-LkP("36"ĂHPC {S1N#Oc!{i3QZ&8(&3TN;bҀ]奍8!*窐2`R^Nõ128CΥ:~n wCco]b^O~\E>9*_)&vhט aKSKwp)c]F@npC&؈BS="2֟y+<*SؘN1 ĵ BMe&u!.κGPc_g𒱃@H"!-Em8ƤR}m2/; ?!ӧBym9N.pqI*Zӄ]'Sdf2AiS +T@FBӅ︥(OߧO`ុ\b5,OW]G!_~D$}-zu +.>n+!>vAGx 5CP.0:BA9gad5>7ƕ(aLL1_QLuA&A-Ǩu9ݸR#d,B& oK$UIbE⡉Xa +g=nπ] 3Xet8:nW10QPq)ڎNG *|j fUQ'<" Jʙwͅuͫ4{MRп8av.iS8mBXM"d«쑶o묩) )T5PjJq  +c%DVFF$/Z:.SQN}a,&a bqa先^"G0-p[awn +KdEMiWnk7D"AC1mߝ>mv̬%\hT +PJ.SPNFiK Գǹ?)C^ye 93!?yD4(Su(h $ڷ!JmRTg&z`|7&Z/JƒtE|!h[ +sDL}mD#jղQ$2/z`mt>F%=L`H@ 8uޤ ˤUvdвmՙ=[LQ"̸<'i:\>^>İV>ńVY榑Y\h{&g;'"6maʲ(2‡oߠ-vWfM |(֫m'nL|IVT*BeQ +}c=M{2{Μ Yٕ!0-"aM1Hs*iYN5]j]k:eHQ1rN%݉a}ݮ_Y)Yxeg56J1^Ϳ%7$t"ں6ј0-Sf׀(YJԪ I%;ˆn- o,W)FlfҒJD\6Ф jpӔ[*)B@P}a"-9 cauקjY@>K^L›nr/8LoL&jKVb9H#.଍eG-Pxʻ?t .Xe1ڔ%QQTq0/%#Z(3izp;> $$r_؜Ljl7ٽP \ wR7&U(Yod©R5#o.O5cSY>vEML@1UVAj2q;Q|"Tu+ endstream endobj 3463 0 obj <>stream +0 Z@&bC Zg&`,&0%Bu] ;`hQ2"6E +4PL%*lM(5>hdp~smD>?d)ΆPY*ۏ1=X7,1O!ue8!]z12̷ +_RpK5Uhs +=GFqx($U ZUE֎U8/P]2T_ fH|x?9[B. +^D[ؑY$>L!YdqpJhAdBؑRlVԱ5vTw0ms̢Eí C+`-x[E1Zf9V\qfL:z JªrB>0jK@woQ7% 2Be{MӉ,oB QFХBi^kѿCo N)-b?d 鎦UȬGh &FNX:K#N#Ӈ+5d-ᚶݪNøpG8En|0w +- Xe<+`0ͦug;щH`id=meYZȩè)8%mX<ă %晝q $1a<|Xu1*AF&;D=hz.nnZ׊j`Q90h;?6o(p@o~HYo55\sFCD-mfmvם^nRCs@/P2Ddr&LSJ#<dk<4?Ņ"8ac}]GTIo&<4#5'u-ͻ+͆9‹:g$ʧ_YuM`-vdJT3x6-]d? .Y=h"˨Hc8W },kEدD7ho /ZzG+JK`T:Z&xav + ++T6?;J;} Y4P +An wGa:YsNn˂”%LRJha 5!ݩ;-~GcT${$3tIduMɞFNJ8@}C^}e{VvW:wVUa侸l)@qI$:~_ N崂)9gĴvhJtBgք$]d `D-@T]Y9J# +?9儔:@Ŭ}KARU/>$&}ڵZ%`«gܣxdz"?*% ZƆhYNČT+R-6 _W?|Z C$Uf>3+iW˞`I?尦UQݵ8| n*iOp#[z3 V_UJlPeFΦ7'`ondn#2;}?3 Mw̏;~2NBhK)Z,6J],s;~@aX+7cQg5L.%n@DX=eD +r}#fƦkwto0?pQ#ĔopDjC!lFRyoXZtgTq+CH5#Xq;Aҷ#3ŰK#s$8Op2.l<+wAlk :'K_5$ˈIv&kJ$> ܸvw( 3VSSgÛCbfܪ$2\1υ$acv`9+0Gtb G1:0hyxpDL$nxƭh337zHw+(Y=@Bnfr7u0sVC +.:B8k8'V.3뿭Ck&+{+a-8x!%$U$(LZ2o@4\yg5%54^EDm'l)H@佩;?T +f45.}I+%w~`PN=>u+qvB,t%[7j@OqXP"*ͦM +8bUT,G'V7 uє<&KH|=π;tקBP{^9?a9IVx3vOvr9fP󒄧GO{Ȃ +9Q&R뒉Z8Эg:ޯvPeM8ϭ[Lg>S7z3GN]`߃ Su /ڑldt YF83ԍZ#ׇ">Z/g"](Q¯F0?q'&M| @& `Rk >v^/X5rd _ + s|'?Dpm$6(,緵a~+K3T X*/G!=m o+hǓm&8BO+̠f 8r+@7șUQ"0fk*zןFIHd CxzZ-GKYĆ*ERE4 slt߅Ju}\ +xdڇݨ;P,LD8yVH3Tȥ"' +Lkh_C[%05lu?2(>R@֛Þ T@g %2+^B _,[j"f)@H @ W=!i,r.Jr?0pDB. N{fp}Z.fm!$ h{V)ם^h}25bvV}`G> ܶ+1[s\o0&!.^NheUCߌ& н9kH1v?ˋÑ=,l)|K{)ճ@R4nv bRd1ƪWHcNOZ4l/*AN2¥ygt8z쒯چ%A}Ӿ7 u֡/&+8pR G.ыt:-;P{-90N_݇Wy\#  +?שhl"䘴Kɬf˽'7ORABv.*N^ۺ'hv==g" +Q7X܈#U=Q)D%e=FAF͑F0 ƳF̉-TÌgd0UFe -^S\WJu_hD +wr^L٨ZKjd_BU&\t &g5:wM::z[LhOԥp?OAh?O񎐵=+1 b$$  C Q! ? 克heM(<"]A6e< ""28㏡ΏZDMG\+ғsR.R $Л'#ַi$h!o2N^V%$О(\ȨM-#F0L^m:LI{^wddX r&O,+#f%~3s]6Rcupnр'z:Q1?Sb8ncN}Az*1FK]#} f{( Bz)´7z"PJH !28͵ +4dj@3V\(z,- "kZAYDERY-M2YcE0K5A!2 \9g^psUXꁛ ćUp(q"0ixsgm$aQE.;{G=K;*sm0/y)tO\ eZ#L8/Oݟr{q![y(M ėqۉP,nH|vCK:=UBqW)O{Fo,)qV5_.Qg~¾";aSԟ.јu'GSL2N?q9@A Ī}#6#,1=X +ql~u:2|]~|D|8/:*6I`tcb6ͧcu:(1-ES8L^@d7sŸ>xuu`ٌ1Lݿ[K(cIJ9rfV9e#2v7̬i3뮮vǨ6$dC`43mMUA5C8+؀̆|_Zቯ|mJL5(L]Y?$bbo]'Sa)k鵱T- PzP.GysQ֯8/4|G.g&P~IBRuڟ̹m% LJ42V";_W+<+s_=\hq &Ṙ1zik-K0ae㨷Ɏy}vCŞg߃bH( oz3mǮ+qLO4nc$+02谳Ȓwѩ}t*<"Yz0TsGݕ>AhSG_b430!.[b&W|{H)lE.y asSZbBG$mQF8bE +Qe]U_?hSa|Q(dHB!lS}H@yJhfGnx+{z CgMt|"Z'_#7p( gBku9ufWeƨ=A |++VyuE{$=(YyC]ى?D\0xPF%./GTv+jbW,i#wu9K5$ڍQy^5dyL;~砓7ڿ~CGdzN}:815q +.nYEs-z) 5'fC?%hbPZUz@R%=h.29ū{R=Gu̺!2'_Hy0IQ]!nu Ce1R$j KE;vm;l8 jˏX9EA)L"K;|{f֧aՈ&5MeCbjsgXf^3dcȦ2XѦLG[IRΰW7tG0[`ʳD|*`hM΀3$t]#gExW݅Dݿ?O +EID +٪7G"(V#SD&vwpGI.jKe"3D5V85Ұr ^Hqz[7"E5@Gjոmv4pѾ+S* HMkz$uFwi>F4& @7=n:@،"3Z'KRS3AωEm%)+YId"KEH.q\"cqsxOD~%BD<鍬-`k DceQwWRCv4G K&g}[t%Ő-c +g1ӍmI84,)?D0MQD s?2ufyg=©_D/*K s]y6I:@ifea.-f7x}Q#~n3KK=U#fVGaMIZA~Ѹ)0MSoVq$be$7hFX!3 fc4TIwz1e_=cf36c$ p_݆+ьȾ4GnPm]AZU&Ld CDqT59bͿŌ6 +^ רcƵD/W1wuo`$gmc-чݹO/%AHYZV:n(uo.*CV;Yc,# +,~>XiFZBIY.<qN#79O'j\T A@Gv56G9YV9CxOAx[>H@|e%SJᢿ4Zrԑb"ǥ^}Uj: MWRu 9?Ã~ۙ'WvS.NN˂:骳;sFe_Ae=}Duj]]{ɏMe*a9'"ʏ%oد?BS~]^P`K۰s|j<$6)v^WXQ?c-xDGNd=gcG}JU4ĬOMI/0}oG%>.'"PHaHc/u?U/RK38!Bi5Ex=@/\[;-qRl%|{я!lAO|䤬M[p~va17Fi̘^YFYfXqc,<; 8SAVd҆~L ^i .*k",Alɳwqq9]MG6ثRoNnA:>9 IF054uۅV#cT*hF/|CDxQ&8sޙ7sWlظa$ @ቫo_gk*u.[l(TL?o\Q7e~EZ/MÃ܇X勆J)9Y6yb 򼓎{vbHuc`w*݌zI .@,"3M,u* J3E(m?+27&tE,vUNi܉JX&T CDL|U^%n{۲^TUZu5{巚!;MI齋a:Swk8uT..w7y`F?tL#THv/ UQ; +T8__IsЈeیN#B$[)òlaAf%YnɴzkǤMy\ԐƏ 06򨻞2!(NOd@gb>A$30Ws11͢ѳ!VXqig :{ǶU!<(z. yP T(j5!"q"Cu/ /wY8 h v|%\<5R?T!yӠ;S͋CvSkA2r`?l&'p 1 0gM__W4) r4gZ(3űTUn~|ܬ pSW G\854DH6C7K4V!XcQ sV +)Ӌ=m +35 mv"F2~m"T:/\c*3ejXhʅ1{hv2 "9q؞"yڲO}3"^QS6 0Y`Z\y1~$[+70"kd(1&""~9)r'o$ 0)ڗf8e- سӧa=yw>$('',3 twF)VUֱW +>vartTzϨ鞂~qHdW1XUr1|DkSB=fևN{DP5TOOQD$8g|0Nd|OM6יO(,)jti*b +j{>ayGD+Jp ͽx5 M{_)Rպ  @\#^RmY:+}raJab̈~N;٬ +UX˅s5ӜɅKe mWZ. 𩆎! +QNq ބK8!2E&#]] s?:P&FP>zf`$,3 Ļġ.8?J*RP7yr73r +1!)n19"&R*?a|}ŝ.Ob۩j4zkN4g5Q?GsBX;%2zK z@ t}VbƲ@0.:0wPZU,`&?vmhlxI9 IkAhڎJ!ҁ2P[Z/;V87Q3FiG(N3kjmMUI2Z;vJS&/;F ;ڂ@hP pxɶB,mEW0m|"~6 %iI^b dd_諧)z9;0vW1VHҬJYr6xMީH?덐9XdNq:,Y_dx>($ +M-?CG;u-X6,bUasd~zhWb20+RN#ji@A+(ځYO62VD\U3 -!4 k9Dϲ[G΃#S nR<' Q^ooֵO A.K T \+ _*A-P uc#tt%hi:>Wd<,6IUP$i+ېºS/Fz#o( mqIp)@gja3a]X'fX((`[Z} ms=Vl +\[y;T! eւ J,"1^ؾ%I,eqyײ]Zyt?]C7;|<+= #k+(;ƑO$ ^C[hNqNI~ + $0[ĿURryugl没 whܪ3GXt[u4͠/}NjOyx%2x%|2N,83]DCiBM/Rmŧz~Ţ{@$i 1:|UVEbkB h Va$`3t©_0`}1GT ~zf[^A l_W]HOYka5}֟;xk0r5_4Pd]]avOnŸ0qK]Y /T!)8.BmD˱&S"ÿ<.g")rq:CFZ@^˻|.ћ7T&Vq@Y_8%%T/&PQnr;9ESnBݔX_tؽ˯O +̿)犴J.HhwuvY-.p}7$QC7r]AluLggn}o[VGI\;Y4W&e[ab@R,7SI+y&1z\i$KrT[ LN4Bޅ[vZ g>4mAqÎC`́<" 轾i>@?#]45Rx:Bk0%%w1ڭB"AL)}i+w?f?x1Kƣ vQrfuCesxbP|5p6$2=UdL1>eK6m*w.b}V<,> 5HL@6aMe[l不+҄Cg:F Max,mh yDL;KӂO]D ~;A>!LC[6d#X,,Ef%2+ylfK0c avvyˀl4KUBC.Bf%s0d"հƌh? -ٖooRej oC l@bIͲs8d\EM_%VBj ̍s5$ )AYӆ"e:"?39+r.M +FO~ 3= jRM5+X@g=q&oit`t<~;<˓Q7}75_[91VĨJ"Ko~HYpmVwkWG0!@ +*Rcɺ,6BBnב0\?Ǿ9 e]jm^N~$Y_PIx"x7#?" +S-޻}\k)Hbj*'|9>` kw3ZhM_-Au?҇Dˡxv[-EP_&65Zb?؏ qNI=$UH#s3lIؙJP*#9zc$YIHyYN-&Y Ny]=S}(/8r,ԕɺ҆c |jCZbj*\BsG4t3|dȁ%6Z5QTAI j B,.eQ\mHHlJܚ+0C+1gՖ\Ez] :@% S">Mu@P˷QT ZoUǰPq ~?ײ lb + eBjNځo+TL/L6؜ |* ÿ +8 'u ĀQ7JHFuطF9d$8.,FJ[mj +}mxr+ pJZJC|Ynd |qi~@7oxs%p;[N*3svyٛ* MvrVAXup:x`Рʱ +Q7ְ{N$bVWR3řƅ +{PkNZv-OI<μԿJx)P!6Q+MM"U.8t$ W#<յSѪ:>a9>/&PsQ#•?{/3탳hE.FQe^+Ģ:H'KGnQk฻2?Fqtj&7NddtS #U`Ûո]Sx*bH_}`ͻ_",u9+#KJ|ד{,=ʩ a٬1P1۽.G#.cb̵U;Zø +2+/r؜ /"mz2#Eof-fNY߃&|hWhJ8}Zsu;Vkr_X# 1gˢbAu c0Rg5ZOtnG +x~PKq|'6p%5nbk"yO"s +`)TA }ou QY6. oqApI6!d#[XOy]Ӎgrs b(MpQ@`W-;Vf h6I]/Uu~Wէy4)h 2R?Ϩ40yɱ^d6 lJnk?1Ea| 7JUZ|&~x}+%7.82q 8h8RĊƝ{+A+ֺkkEÍMrz" 5.u $޴jT< nP/YVtLb2w#,|-aޠb"Ml-2 Ch.1o3U*1R I]T8ICLdɜJF(FnjBDxF}RRL=nTgWX#vɪga0>s&r[O``*pI@6;|]䕋d=O{>э2-o1%E1GhFHW͘[.avnX3fɗʶ_cse&קD}'$eΓ}iC~[!uߠB?,(MPU ڄ M/qkbͣEH5v$JK=Ƅl-^h=g?G^J,zDpX7atwW"S7Pa WY2ҹfqNs6)#\=S*0WknylϢc/&\ +m5;k^lLɴ'_}x ?fV `0sQ?%U#OfƢ-PR"A? d3B4&xޕx%AXKJ &wY40/01Ů|RIq>{)OpuhQ{FE q}!PNYΜg' *Qrd863KGa[4Uvj9%9-X,7?!ƴy`x=|7`w( 56ӌ +j +},DBW(HnA֯Q@?!&)@oo'_Ƣq?$zuM"W7 +,vcC@$|M5oh}(\S6ٛZ| x,?ULqKCO%wBItG: MV(t/ÂEHPkRl{ǑS`Lm@V'/G}QyM|gP[iP# H.A v4jB4VuG%~ZKS{?:kr`4 ~tFtJ9GGf%{PB`NqOԲP/i[uFrYUgDZ {T nog}yv= G<}qߖ0v؂|`l}svf&Z?Rú9HX,H4h/Jc2g9iu)mEqFp6&"1xrҸ4RϚE}]OD:nmmTM"joE[Tp}ӌMBbA:,$5n@؃02ue$%_ʕaeSTq"2xLFFR :Jpݲ O +Pؿ4S֥#Xpl8B j|PRI +A uOCF#o*)*q&XblenW)Ӱj +J~4 6B։sssJwCw3TyԥCn!Z h@P#JNEWR=rF3|ۯ˫I/-7V5nj˺6#U8M_J׫SЯ!܌20a0#'?ajtUxuB^h7$~sDJMR^*/&c x/ٯx0ə[c%ЋZh"zp!}"L[2#B<STjNҮrg +UK7>@ȹcʋ F d>_cEI-dwπZH"pnz4QAsr@yuzEDo{̞h!{{4`|/i@k s`3, Z/'䁋ըkXFy2UM,ly_XE{_ 6p>2{mp+9emm3J;Xfm;> S.K轸St 'R%k)IiɅCp0;.]5N"ӿr|[C~"е q:mHmaw%(|k1X4Œ'\Y4,߾ OǞ^vV?`x僿6.FٱV"OsHR2 ?ګnT+|X_v%C+DzD#ff zq@S)KBxN;| ~w؎*#Z@Z9oqLEO4 G=*Mu2gOxrKyL {-g>v2Secm"`_UK }M[yok1D`(x>JʍՈA[.(UZ a1V]hc4J혹qy_ʧ) 7;bsgbhv +9T$0t ^}|2 |)SqՁV$W)}ti:¼^p`Uei+jR7,+%[X=Vc}\k4$N#7\YY3 gY>νB8ôUk_t*ZPx 7>'٪@;Ȼp(d9ady7Ir)_:FcP/+&Ae>[-CFRxNUa*ۨ?) PIlݓ-#[58Ee 3MNsUeN\}sȞƸƔ2?4f t͉D<|ޒ[,p.T2). h_U×=er!l {D} 1i25Ȼ0!t,os|W.B@I$.oh!"{{>qBx)[n-BO8^mbrH ų<)(W9̡IݍþMJE +2-ZjʏXo)`-;CחP5;IqقnĔ1S=:U50AcE+bX3$ t瘆|`A3HT\ަwNE-sJ`Yj  ѵfHtG.U:U[),tm*ȹPWE<8WwI(r1*)Z6bXTJbF  bBCYD/7/D1P'8h$a%T|Ѭ*2i7d}nw.wc:4Pu?*Ӧ5+k*Q{(<+go[9጖SM2Tm-WB?Lf>Е^9b"Cx}+6og82$;4Ž>KqTNE`39?wL:[Lvx@"i-ǝ5vR֖45]X߻P`h٥M@4)VG3hPl3T0KX\n\:aGIQdK;D*V]zݯ0/s#n9"#5qo>է @D$d_vIߪ@j&)Hε3{ycD=rR7wA`25F@p ~W.ThgGqW#8s9a8kʄ +aHUh!!}?%Db + P1a_j'$:VRɼWsdE]4I)^bԠuRصԐY0 tScBb} |fAj<Ʉl3$ӻ +,WGq5'lJk?dd>(ry&L17^`]KϲnB=yɵ$ +1bmS!sRmRO=MNAkiśV%G\|.&Bgvڱ.Q` e]YF6Dc\"*ni@d:. ~U/PIyHSR߳e-@6k"GV/\(dsLL25 9wOy+w*'!K( +G0%]o,IzV- ^{g@T]r(vt/*byO-pÁVf3U +Y7q 5 #)24Si|^MC [a?mBj>6R&Fۑa\k{9Z2b6}b&#aO)ωF2uYD%e,'.%Zgm9 +h}seT~~#2l:;Sm'CWqe^x)$DYzt>I$.YW| /Ā*h!Y> h=l!mnsemH+i>D 砙?f[W\o%Ouǰ6 H:t|^{8J]H +C쑮E5 wQ^-]#Ȁj+K _ιY=e\NmT`#b Arvb':aPuMY3gʄ=`y}[~u2'?wW3;[R`Rn9ݝjO6Y !zT4rTP͡x~J5gure XIt{sPxcW"er7+7h(<1R8{bbGq,c'ۈU&pf?ETW˹#\u敝#/j?/H&#ٸb⼶wEt}= L_M4?/ա{ ="ѐ =LY2/tj]rFm)myesg +\ T5d(R!Qt$Yg!Lp֍rP2 (KqY,ly(KWV@v|zԜ} +'Ⱥ]kv| +Id|1XV<ܽͼ0~ ?3 GVY6hNP1'}SY +ϙ)gֱ/@ju=[El jhc6`( 7_M}D/F\r/p;jn~ƒR`V`>csQ$n)1p@Հ6 R_I[rFGI2k>Ư1L̳uu|:n< ^>OBC|;~ +&]_'qMZJ8όE^*ь E=q bTl:_!CV[l !L 9r~fԺ0ѝ؆kq#W!:I]ݕ jl:m3͕1$pUuP>d7˜1b tbq'.# . h~ùY,Ԏ<X)wNY@]K~6V]4wX#V?UJeff2N?h6\$J◥mI[p 9Sy&W'P;J<OF +_ţ +> endobj 3459 0 obj <> endobj 3460 0 obj <> endobj 3461 0 obj <> endobj 3462 0 obj <> endobj 3452 0 obj <>stream +HWێ}W̛@0 +  %gwCZ|}5IT$tUuW:uJRJ9P SF ޯ^͛~S4I'SKsXQOcÂ3(J8o+~ŭ!nPbJFjJVpYIl1DB QJ^~[cw2 ܝKtpr uRN_;5?;X +-%̛mV/0> an4Οv҄I"΅aow/ñ[~u_~}sLSi&aw.~ RQY0Έ0=9b0jPpG v?"8Ur« WDXlrlO=> `8Uԣ +Y~xo?Ÿ?[KF:0d^6׫fR48lyӞ`TLӌNNLC5}t4B4#kӌLfie'\NPm!siJ4EFUus2z8u]lVKnjy>܌j[0{u`Fr5Jd3HHYr%gɹ\1SsDVW窚Lr5weL[evƵ]R>^Nմ[segޕ @;7%E~RGfuk`mRRhR<5p H1S>S1L=_nBZYY\͌`nr1 H~6Ydx=82v@!҇M7On34ug@ѭQ#8$3}"xxCn~?m%Gd<qH_ j,Ay$ \ߔJ +R]{4S3103a- +B+S\G +Lfw7 0萈xA4OÙbe7kvEnH4MNϐ+xF +p&rTfQ+8ZA=dW +C zв57NZT|SNđwo_7#< Pd8S 0Ef: +ۦMг^[_ƌjv7rq3wHt~֗aXnk` #+ss>ˉiK,l^V{Cc_=* e &@!HjBD;0чcU$rf ;K6v[\y?Pz}p< PI`p=%5l\b46^6a-%`/tEТn 3l eVA\V*F +u``ɘ*Yn qݞL2X1 H a *Q /ң .k ~ +hHel3v{kvy1F]JF5fҀ%Al53V w6d|Rd2!9%pAvo8Ja>^gDQ{hb +K~zjSѹo L348Ʀ G N$ֹ{^"Ԧ%M3JSЕ)X FHZ~y*:@vw)Mɸ +b +o鸓.-} @R@ՓS}%rc qDvg|c/8 +8JDX‰YzBu]`j%`mrS }wIyXffcy`^#"PD3Y[`OD֞G;.KQd|(L} sMx҅=VNj2aL'Е#.e-6^p{RFIu+:#pKRmr2=?a 2ZٵN&\>pN]x={r;BcX^̮پ?9{S՚Of"&9oIդJژRkX -xE]oEOSF}sHG{33 KQ +^CVƥnEzPl.^7kY?rks}jځLyW:b-6ePS"p"q.4`yf9plO-){4VFAr VNQXDe9}WoSS1 s7%Ib 7a`fTϪAM{.N~O,6Va8|o$&O͈lzsw$=)S5E#8/Hhː >KjPMNcxn֡th3"זG폲vx'˦WbX̲ 8t3ҔUƽ·9Ѵ1QW]$f +?|H rW5R‚/CnU@>ȞO ;bE↙4(Ϧ L#G%M A^*AA vX_k9Ne"P?̨ԣuQgDmxTs&V48s8ݶa +VIqѱHz G 8q hT$',n3obiߎ$y$raP`vYt:=l᠙o;сMeaL"6`^H u'Meץ=!=8qv5[IяP#U|ǩT r[a' ucEyaj7l%مŖo<([ +W:6DְyQ,6PQ@t°Z?#ҥ]k2Xhn 9(Ga׍a㟓'rR0KMkBڛZ)j f`ҩbe; d0?OǗ/d]A^YNCLܥlJ0+y̓bK{ǛT F E5E%T LFq+`nM`[*<C It]ƹFU6%5(򟛯4oӹjP_u0~?^Wj{* oF: 0K$ endstream endobj 3456 0 obj <>stream +0 Q@&y- Q|UD0/c>F 䳾(9q\ν,RHuz|CayPkRnл5<BrFBI&_hsI!+pa\ߙЭ.leFn?7['9>҆W6d]o?sUD:ͫ(,d9 ^->{g$5DngVr ĭYޛDw+~ kESR/Qy{РGSK"^; o4pXIv ͡sQ^j)- wjB(*l'hL9\ +[zc՗pDJku +;UkaHzp^:isED/q3d+O}<A=N StB ?uV!bńIm[&>AŹmnU_џ)EA"r )R@ ȍ܄,rEP_BElB ws.'2ͣÑc1~?u~J0ZPF-V.2䧗wb5z笙-\P :_]cN2Dq4\IQt:pe zWb!|WӝIwt*vAҶI3ZPOvsؑsz[ȇoS'jl>J;x20$ 5Lql^hͪˣ*@H=5jt*I@*1w4>Ny6@nPiLpCVyӟe6q<}-F +11g@okpX;[ALfYuSaE3@Gb^m4s-2A^ׁU39Zk*5&v=S='w *i<;VW^adV@k4ߊb`lHNz2ad  +.闖R\PWF@HJT;Vu(:ަeUwW~ʽ*Mp@Ƕ(Zid3?]MI;\sic,0ce×HIe\"WzJҌ,Pie?!E+Gb;)Ԃ ŋhFJ\ ;*8735~.2(ԗH>{$HwYxSm%S{9EڅIv\/4غs֌|<(@n(5@<&!3qoUe;.!0+5e؈wNx$o`__hLqbǣ騮:sZ IWҳ[%̌(yoם#qu'{>#k@խx<վi_CL[2} zsMJX8 q"J*##EBMV~RJ>_ {z=]I0r}/f>ZaK5Ca>`CQ#ukmwjg;4͊ Ÿfz>:ξ(7r}<)el +4U4+[8@Ig1chL@UMFB9-W/-ᵘ"YK`az/=GFb/oh J= fT:2 eCRI" m+lj&<ُPj*)dhݩDkAօ57ZOK_jq^K %f +ַV8:Wd) <7HI!qzLZsufIJs[ɆH5qu]0a>HTIV{Ӗe=IQj&k ͆xb$&hEWEαn>]g>Z>&F|ZM2GF{(l9^o䷘7}>S}X/{ZbBJվ+U~:Qi66`IPeFPr/ Man9Yxϳ0뽇zi:Gڿ +Bb#a/Sv*Q`(4KSZUJ{hϔ i,En%9h>oB=9CQ%c@e_=itE/B,ܝ̏N( h*nLr 6uG)RٝLX^ȼ7a֧:d*RԜ@9UF1ab3nͮoM͡r;=O)\KiڋwWkG0;/d ݾ5.]?^7, =ɥ ]Rī +K0IeXϟ^ PWCkMԊ|ZM3"myffڻ,07$p7iGŒNgPIZgbmyGfMF2(ץZA8}rr.M<|eb;su qPe"-G4=#&qhS@ؾ3:}%SG=;Gyu %]S-%Map\R7:$N7]:2D/#TT#Ƈ/aۉ3QOgžwYꚎ:GKbw4d0!?ehmOVPre<*"A$,^ң'2߇slfIr0xH ?brEESTVy9`"BZVKݼϦxGFT&j(͋ FLq0,/5rDIN=曺o+g}эVo5Ȓ~L0jl +СRHb/p]aو`sm+fE\߂0L _g$GDUm6'YrƄ r0YdHe6qLMy;OOb35;4d'ZZXd"~hxB_f!Q*ЧYU=4#fb],l 3 +~K~DQ7 m;7\3)˚ d鹾h] Bm{^ǔOm3˺lkLߪ5U)L:3Wh7R4hYBDg4BSO] T_Qs`cC#ldpLvE39|γR'N%m[p4=Fh،y ]GYXk.G/*!p4i/mRUŽHB|t(i清,΁1y$p+6SO6M[- de6vցfikj{t\s#OwՔ9p&Q0Qv;!^1(a\*hQ?"6a/ |_OCNa=mLD^yB*s%`еTA` k,@p +JϋXlvF6sY8Q?[n`\kG\[AARe[!aCױ< y<#T?:ϡqQ͢ Ra%j&XejO.3c5SMfR Hl5q_f} NΉ#+Ń^9j7;pI\GW^/!ͥGL.Y}/Uu#4Ғ4ƻՓ&aPsQݾy'A. 6+&உmOEÿ /ErW^-"53h-(. BF2&/^XQy7RyFs!:bc',/9zၟ}v($a=r8D[#1DM{ebKCK@*x*X4_?ީ1m._T +e4tr㎶eXɝQ%7F ؘ3BaNi}Jr9PS E&k=z^ g|1g>ľd'b[rL8>_tNYd97 +լh)Zۮս}09ʹvr{CN?ŴҮE3JZ)G OA V JOHi)`|(ɷ/;IG 7We߈a'G&_pQ~Z؟9b(8&سr.^ejS +2U0u h^=GX^w31ns<EbлxW ]ےDJ~u/P]o-\[0`C4JB]Elױ\Bw8 I %lä&'5†WO̎{XT&t=jh1^ +0.:0;6Px_ۮ]w +\1?q5DwGKB-l|#ANp@klՑTA_ϸ^$%Za ^t ӝk$kÐF辬.̙d2M O*-S(Ԁ #@3WFOpLS-YkU1LhL+li崻EBo{Hv&DomIQ鯮JWrgm*_ Dbϔ)Sx0A"~q\pQYAQmN٬_0rNr>xOPHJ҉i{t:ߠo|-YZR֘!mW0p /oXB?(~Df^pŅv5F~$W֜xǐB O})O`"E[Z|pM(~(X Yxi}xbTn?U%MWpz]wn&SO䞯U`v$/97͑λ)]?sgZ6A732XZR\<&jd͉0M&{Gҙde#22qvʤ-\cOKx*uۛ@IOFd>g z,_O#%2^ŠߑpA׊[LMJ3al}ê"A;"g cFQ!IGJ$(_]0GӮXo}ˉ妆.j-\Z2N.<1fQA/UE݌ "DjW|#9{i-j^]|q5QzgR )L& +?nK HO1OL]w%:IRYÄH2`'{֘ YdYӛG(uqZ/C 7DԙenH +cxETEp5 ]b^HmڼvTmC&w*`?Uegҫ,<:wBy+(YϓGK805oe "riWQ._$ >U* 0v&>@#XhH,o@8y m&1@LݠE mW$;d2ǿ<.5˯~e'+utbu䖃on>DJB +krq;WQXDib0 ۶9$\D+#. ك囸Q wM"VSFƍM\Dhx]B>a*c5r$~]4!Bnz!dlH)AI<ޕa _EAԍɜ?x)h6a ,D%9Λ EoKPڣ&$' +8Bck68 ˨u-z/{dx| Lr=T7m{Mv_b2 +l>%UC?ʦ*trf-wͶ.-&5rEL&f70es#roc_i8Y%rE"'Tg5[SgARkl6g=<3u8ˮO;[!sJ\Uvv[ /.Nzƺe.@aqzxY<9 r6愍 v~HI"}yB܍Ϙ>V`Mvu Uk"3Yi_p?3Z9 N:g7UO71AzOa^F `_yEGmN(v ^Tτ9,ad<>c\기H>'K|xR~SrRWZ>&rwOUDu\~C*.h𤑍K䩈s޺?LO[Z!FZ"I +\Wb,O[),AE:4{d*z?USeygP:b)]&Uh_sW}HL6qۑG7Y~ +ԣKb ;Rm\%cZ"hK6;fk +Ƿ&4 Vom(%VTEyGAeu6@BU3xJ((o,:hD\6XJvl .PNeR֤NiQ|yβ+.̕ގj[JC-䊦~\.Qk Hqd> iް:L̉vS6ݟ'ȫwNR`HF: I 5 sIMF"Rt BTMJ/܉*J$mu0 IgRBDk']ѯᛱ5U['a b¶3*xq!E+$xgTo~Zʆ8q%FjG'vDS󑝁/mz'+O P0[6H7dK}37iYH|! =ҹm,{ӧVYFBFK nD*FPвk/h$35Tu:$KF{ڄ>ș8E#h +/^r|JmbN9s"W{PВ6sD~Ef0n\ Z[@ }:zLA k[]%;!6%HdzLyNmCY)o3E]JSg筂1D"h{5M4Z_.SuCv;=Cyj{?8W m+CB*y'-^\&@7fBӭh Vʅ~e]b0߽ ̳sSk<2`ek $i̥UŸN/:Y C>>Tab6ë%G /%p0Vބm"iTz/q]fv4Njb/!>=|$Bnհx  +Uw#(kK+訽*i?ljnHiUA.DxnS'|YU~l9o,^wÝqb֟M ٭t%L#UW Ҍޢo͡EYW=Dav&v>-M#؛(5^NؔF^i@nWD72#3ܵ50m +loZE\{G&繳S]ęxj#q:mȵ?g蓧PF=VLApdf6'%[>3*hخ媄^YɃ +t׶)jLUep]+V|R_4i`bVW۾ΑbV~{2ʮX;[j*#)-6!X¡ 4̔Aϸ7Df%NQl=1o2g '}V^T*3 ?pa 7Z|Gy^#Kh?)íx?5V$\2 ?)IYX́LRlJX.Xx-c؀.{iIUP8|Ct6q:a)MA +Vwqq=_*_;Wt޿hߏ^Ej8XϙdH,%D1G  J҂Ja'9( AJK+iG,ijMF-Ѕ{hI*YҎGK*BNKXg#9 @+W, D{ee/&-ƌq8 +|WOQ[/ +hnA@PDПDP.!騌3gc@i[*lKOl3;q> DdPYrOMY犧d n..BLz0-dϷ$DN(_{QӊiWTƃYTk+ :#БX'ʬ*GzB3eހ7N_+ Q]lc7Fx gQlEOWe)'(;{+|{RIV}W=(w<>ڴI꣊AI3(c޶2H FH:=a=AMPԕRy0$-O-\}~ͰF _a{<'ulNR9B#% v/67͉eՕZ:LRkbՉb](mdAx؎97~7/ۯi?|S4p? w`mʅ +*'S߾W/BxpEP;gWJW"NO,Mdm*!킶*p/&m|LtL'fC{O'axtOj:%Fxr-8z* +< +LNefĖ~`2pQ?%{li3Eyaq߉jU, A'@> xE ]ɑRA[DOp3'HԺ| \8D>:?pa*0[b>fLXHt/ +KQhu4UVp'J!_u o}po[*a[GG}=ʟx0&H-"stGC7X0 eCC7T&h5r,)^AR{Kh\F>k3ǁ-1Ƞ d!( $]kXRuG-]'_8Ϻךd4_7*R+ L*E>tg?Eև^XSQReDT\χXw&E{4(;J[g߳%">p&>=GfZ+8Ӕ(|$DErKWSt NxNjE>M\>Ot}i4MLA&\nz.ha' %_UyձIAVs^)o#h\+V. 蝂!;-5G7h*o3>"?Q/> n|,:5T@I0CZQF-=RyʏҊ6JAۛ[ECVf)0#*fMS,"IX0fq&EE+(Bfm#Axunw,yQ]>k:ڽESə^A?CHy܌~g)8%w|b(ݴ|Qȓ:,6oX Lpo"(uPI*qωcGd$aAPW` H'Ǹ zϱ.me~}qLV{2v!qq zeR`x.3=JdvWOF{ ڗTFo^tk`;%L: ++( L,ӛ jh7'; u*]hc̄qe[˜A9Oh>Q tܜEPZp< n8+w -1靴QzzXgm:z’`rlqMw̩EUۚCvs۽L5>'W@*Ypb$;S!b= ,nх8ۤO {-A%WDگnp7Z[do#b@C ̑վסq?}>Q& VT`7> /pO|Gē;TRn%Oݏ*ͰO該NxN;~jX*+ =16j +liD|~W>'P/'T:MΧ{/,s gf +YpC(cZZ-f-beG\TZLMĭd/iJ5<"P~vgVheǼh 8?7~bʐ]QCá%7J% C}AIe*[k4b3aX'vMYRti')TDfM~)rF8f1apf%}2bC̝rGQ|7j{yJT5HgӪi"L _ +.ޛ+6tizk/z(k`-%(06 :&qYwҙ~8"DbCJʸ= 9IR冁xc`g碨/!||}䖇pṟFoCZ1%_JxAy덅l{ȉFV_{$Y\-h.k/jIAU&oB/)a1=5yO 2LdqI bp/ӧ7٠ԆR WH?v= [ HpCW[ƕ31[; }6- 1j.d XJ&)YT乽t$;$+eP'#*~ȫA:k͡ <&0R^\ 6VxxDW_9SܪYXEARQlEc@:y'-oׯ#4`;dǂwj +o (b ]2ZSqǓ uRFkc+H"| K?z*l +LntwU]ȪA`5yZXQ,$$63O@כ#O/"UQÏ4MEdmN_w<1͵ +FԠa[v/p*Nvm$)զN)A) G!?:~O-dJLoXﲰҖ!G(pA4~V3''Ns*!ۘ93X!A)f a{0}V}ܓZCW)?sQPF Yt5*srh"B]De2CCP'xݝHf }U $و~jY{Ap]GAZYhhB3KSteդ E7Lf0#IHe (e`%%qPt @)#Yډ:֧ ̘95 vf'h(d8HM-EF;$~D<"WXp,T +"zdgl: +4ԟpkr5s-"U"mBƷY?S(y2@ZY7h>ՂL?' +MDy-m| u/l +^φ\>پi#b\ T"oc֒z};0/GDv%c971^wKtɡ/d"'bXtf! =R;ATBa=g0Yv/]$´_pSZkb=@['ѡԴU鷣l޳͛]/㮄/} rw FqWmn |+ldvP|͚\2QE GnST/o&:9Rt,qM KRSaH흻`ivS",ޒsC} xxۄ>xہ-w55ӹ]t=y1Z$a҈rH\M[cbؿ| ,:IDF8<tzo Shkщy[P]l>6"% 'Dx*mۀrN({kV[j w-JZfv8o9y=9mXF#vA M` a`ut.))PLH +F7 }$HЯesD3A2e +,@as0ATX;~Ħ>1S:űarΑYSPtf{S W>#Ѥ[|c1P^%(%2͸."bAOB VL()N*rb2av x⿙ƒ0O{C'sF`wG6 dOEBF:˼K (3_cͦ@l&䝥TǨc'_XvZt/L9Z~Ô7Q0k@-/z&TކUȣ K0Ž{K ZZcv[BZOl W="ҕx0|1Tֿ?%b~ 47R9WV(NzpmozV^jO7f ' ƳIw,N؃ idposGc{Ӡc$k`+A!x}IԱ>W*X m)$-nظ R5R={7wRXCc>ܘ+JDS=q}@dZ(}'.WH{RM Iv7Uk +UNE ˄;1떧r!Zt4'758ZP>hHu,_T:u0\ O ά_5cy8g$63"ZCM ;T5%&fo*˩% +HKlȖOC6*Mץڱe;iM?XE(FM@a0 ( z=nQxRP;YC<<|]9AG ]ۘrJf.j#З3)(VjQamI7Ϧ'_Uj:\r`{?"1;.6z~-s8 WJxreM_4Yw'6 7d$_#<"/P46}*$m| AM{~DT&рN%&I^A{r՚V+^i ˌOXmSWW'w&} ĺ圡ժuRjS;{v4E8F)7K3"ep}H:;K !cL˷Dg8 De<@)≺'cxCP&QM:F[|  lI@ f"3L/o\M*M{ً7CKj }_Mg~آ@y&3`TQzrQ"ڻ& McP @}`sKMcJ,Ĩ\?n^L sf+R?'sE1Nu8#t@wy6" 둈fo2͔z-]Vd +>]!Y\RU1llKxK^yzS+.*ґ<u󔏚@C?C_Wq}] +'MA6벜 4^6dYE Fه!iyJ#uoB^|ˊ1M 4'ׂ?+qe`Vi*3Ds6l"[p K&.:QBヨ9dr^WE7iv|V^6!]tPRMV.iPj!{^`ԞEpYXyƅBG88ZMt~QaK\~fEwDzZdYR@ݠ^aOBGو6%WK.#NqfVc~ZEp Et ="Bf2.ngY$)3 KvTrSVIu$jy Q43CNѓI.Cu]n ~N)ױ6LHDh* U֬0/BqITMd,Mk=qG|Nh!L+JJ5Uxr^7ٰHoM0*;5/rO=΁U/ JW݃Ce>m$,oD8Nƶ-88<+<P whv:i=́!&~J@e,`BBd#A](cTx h[$V^'y軩4Oc)hb5or(e QI 웱wh%<9& +}0ʝpD$2cpFŶ{{ٺ,D`28hs|S »`hU$xMg9 u2f?-)tjK^ +rU bqV;OPtLʲJ{^xO+7eYת1xQ +}r{ޣ템^S$_$ !hP!ۗTQS\mUSJ j_-Ӯu5|t(^$>Ntu{F`rnND: bpў6݉rLS2}>9+7Ԙrն[EZn$FQA圊}߹; UMjI,㏝d 84Edzd87w`#{ xm@xOL!SAhЌ6`0t~[=EHT?"ា(9HGN8jEP +086cNAFcxdTcKM`9Q@KhUeKCRNN dI<[?9T~b<쒙#Ku Jo/%#i c!g'K*Kq! ;vJAJ #NIT @U֧ag=ڛYYEM4*4 sN 힡xn(Q qz}uMźеm q04 M=%Kdx32)G*G׌ B͆pQlG"o_Ԑ3հ@uZ)WwNu²t QOoB;{0W3T8sz~*jτE6y&k%.cS#ئH_rE)+ovTG'3N'&UF*ͳ1;ʃvA8:pa';@bq z06eYV/'h}s,ſIt8u&(2;pdb1ijΡb=aIt%Quʇ+ hYc8է7h/͌q,a*6 +2fjK-ߵ_8qو-ׁ?5f=Z*a~/҄C"w'ۦO R>!+|09֏3% =9 `谐\PclIq: G [^rEඍBk6HJ?_Z+P(Y!d)ZH!1[%U-Öz1}4LS\gD1 v}B9JϟڀٺAr^D$3EܾD59Kb.%oYsK@odwzRHYAdva:O;3B1<6qMj4@K se"}=g~w]&?CР ^6":RB(?+ +#Q@rnek=HUϜ0IśxL\g}4[SgYif3J !N3=+(߈Ԭnp݈蔴x-2§J2jr-8CS%b2!6?B C> GG49a뻇WFdsr ;mS?웽/bgm^,2Ǧ"KPkGJzSơlnL2۸2-jq<};9dHW# h*jpj:T"cF_`T916 +?vOʎ8Eݎ aYˣ%}M,/׉9oA!SV iqGY +6/oxGf8vFHr5>gbĮ&&My\N~RQa(#qGFTHzohwA!kt7 _-?ygCq]~cES9l0*-:䬊yɉHE낷o.}U$Jt'6a4ZmRB,VM?LCsr94 ^sNevEQ'ы9\^2Gd Bsj}f޴9:1 R0^x<2V7U:$'4{-J_ [<~qXki,8fRVdRّ2&dPo"Y\v,Õ}wˀz߰Ϩ' &d-fQ Gm @u9"ILRA߽W +ɧxmQ:}L°Akt4^C |0ȚGa=*7I؂lXF,iD#2j2Gn (<#Xg bw?Ia$*zBp).'u%?V(PsK>lu-\qM7!ܝ¦4xE0"w}zvdH iEcb+:P7:\=zVgj ㄦ. ζ{)/=$w|->lXpV ^[h +:^ hf6wZ,a=UP#ԫN"=P8f;PҊ1 N?#SV4὘8;cL\RV /Ze`FzO7˯+CW^bjg/@iy&2%v5[,u]iS$T|g26}"L')0q!l:0Bv}I31S%ÁlFu +nY{q V-m,H!ux>h֞j5m_beV 6x'0[I:rE%2d)d~=a]%-•b2$P,yh +-Ӭa?ݱtn ˥?I+$o.@rso8]&lnF[xw tIQq;T1[-E@G5 DN;+:Jq]pʖZ$D#u5ĥB]\{hs>$vJ'NtS`]P27qҪEJ$u6^ȳi ŪZ\k5 RWd @cE3 +s~'sDϳ%cA5f^L*s [siUR.!/ݙ7EmֳB,baE)07#yۅeLudΤj |* D)5HdV^˫.\I@t|QUO}}7ׁ&`o>(շBA~^Mw], g\Zm5+`X/D_cjt$5̵ٟ_d5mgjRdJ0EX^a<1֯L2F$-xn;ہA}9`,)ܲEPQ9eޘBh'kʑkysYco@[{WdFө?yڍ6Oo'1s) x*!w!|+ Tm!Z&VE[e-5fIushѸswS.H"U@2E?≣Eԩ2r M{mقwc É)DX^ Qaem rRMGߐ:׬OD +SJাI؜sGЯdT!)" +̭^>>=I*&ճ|0Y9YG+!Q"b`4fId/('/gmZZvX&* +NġȪE-hB_l}ilg&`J{C$P H+>ZOmmqYw[o7z+d@o31 OQE~)]ܤ$-M:jȋ1Am) "[ 3^1\o9N,GwЫH/qbeaRM&u^GI uDUݘ3/J>P[2[ +i>A;l1\ Qdz<4Rx61ԎQ/bcRsrG4#lO~bfJ90LŅ`sLÐ32+]Lբl_>}e{5۸n'OE {]jkwo̶]iȞg<W{;ZvZ/{s؈: SmKK%& O\N|MjB4A wNԼA$P+C`JN4 2(f}:N3X;/{\Tev3[/7!XQ]) +Ϲi6zPh +򆐑&| @S7a!ӣnTaB[ݡL3ԦJɕ-bj#໕pLޒLp8O^}IgKꘌp` +RTu f4uވZ+dw^rw$8^spN#LޯĎo6"s(, nHmmM$H {SF޷+G(juhJҪkVtA# b42\:1Fc5\5SF`1dlg(G$mx'=`-.pl-P:g%nr!b"UKXAt%d\|@K7S&1ENw8#ȯdFy8Y2({ ?sjVyT/D7Q۲mE+o9q`iTZb%X/>[h@ я#ꑭOGdJ燽??KO]*_1'IyxEj?+D܎^}G|pJ?'crG҈Ǧrt0F'{hߗÍ}jyEbݪ !C/94;{02*@@Ѝ0LdQbKGߟ?mFXLat)z +JLY=շ4lXcg?bT +a4jzz<ӛX޴WTP*Er21v4`3tSlWe4` H#Ht(r &B|PF,zd"Д>$ XT(eU`wzmG㊏Ryk<\EAfv.БwqŌp[UD}@CT3܆LB9p=iqM]\wƜqSbfX#9 +{Gɝ(Zi+x/b-H;ׄFo$wk^OI%,.ˍ;m@fvvB*;VRg* +U߁2FpA<;kXM\dm0T3D%|z)dqNijtqb\ً$"]?P0T[9S9}e=|0O덑tጯ6gự z_aƁLx*Q? |R.B]`+D\®#@b'[Ϻg| XOtdQ[*U|dR O+v=r9mn0߮RN#~qFB`C_<9 +% +LY4mĩ]l>堛gZ zݝxd<Ī}`ZҔ~,${dXE5XJqH}S݊SE, r 6trpx gJr{wVZ>վG9ɎުU0L yӵ7os5 +6 j"UcLLU +Lib$TE@e[$iX/3-ں6,+6 1>c~Z *#`afFeڃq}e౑W\/:鋘lbs]zd+5AX:$SpA+;_בZ MV< +.7DF "JC$j=LY׻xДľK}>brN Pg[䓕}^{37(Y hTcJ[08'۷'龜^uQԟ9M~#`s_SGz* anv?WW4h3U̕IZI0ڴ% /\z`w6`۴㩕DOGPn$o@{zMc4KƝhKs䚹 +s)EI:[[nzGbk&f]k(lsKOs\fi+9 NYW=&5 +#殒Z Xݣ݊G6֟(=ʀ$cxU `Bř TUOԭYy/XY_'qJVFtAY&yj]+;~Y84Mmm0f/:\ieV3| oK9J,_:TG%Z8*QwxC3hI3+p-1[*Ɵi~t@O5;˳Mh S +U<ǂ$6+{/e>6H +x;ϩSՉIR\^9]wSՏۘ47l845=ޢc=gEb1HS\$ +Ϟct#g5օC! P ' c^fĖ4֤ 7S8,APO#iҀzdgyE$N   \):8wlyTl)O+ G,8^،|fc~<faYP4~qxo|>p#8IV$diLcb7|JFk(7gE15Sޞ#GUK>2sJȇ]l;DnGS=έ{f{!5_rXY |zsRGY@^#[ 'LI\Gxvxw.5;CUcsh+O Frq@. ٤K68LLCvnmbmXf!4U/fr+jcTyݱ.'ii7\?&z-ʜT DJOnuwIjTUZ~)nxr^yx{ؐ/'<rưԨam1Kq\֑;) ns]-%C[kľ$ˬ'Ufg5N9}+Ewzz=Sٝ͏I>]jl \]o0buJ2dmcX_Y>~g8^d5EE-V ~fÌqǮOOU+!;x!^")iUNŔVׁ2K5n7IOy/ &EnARWٺtd`YpebxT +y9t ܚ +HOW: N,T~e;[`l}=V`m=Ohf'|dlflyWHd$W8Ĕ֎X/@ cK`_hމ8|fM.> +t"D+fX(guT(#-7yI3з{B.`ۿ“XZɨg],2DcqX*6G2ag>8?'w?cҝ /fuUgl`*#eJPinWLZΛs პ s9JVCJ +Dýx 2x]nܯ166t[?Md9f+p@`P,XAMceKVH)qLq`6{/_vpRZ{kj>7D, (6v* 5+3tX{*4=Wk23LFZv~OV\rd>Q,%!R`TlQ6.NTV5/7#Vd,$eh>޸!"Yp?#Y'_Qzty9ggw3g]Ɵ iM<vjR`3fYdMaU endstream endobj 3453 0 obj <> endobj 3454 0 obj <> endobj 3455 0 obj <> endobj 3445 0 obj <>stream +HWɎG+(ܩܗ3[c!Y-.j;rHVF :HbeFFFxׅ(IG3MYuC_ׅ)nI+]74%7kZ,a?nSbHChIWƅNW gaz~&T>.~^..5܇r,,ws6ĪF)67_wa %žj添C?la?P3FRp2(7{#U)W[b%l y!]e(]wuh~尽]eCӠj3Jc13M^(հٴk W*[Ci*Bl#BZzX~{L=\* 'T(kYBn،ߝ%@.~n&,ipD]OUi):tcgHhj h ,ˀπp1mDI9Qy52ªnXG4Dʜv}잁8SZ+5 ovxՌOη˫Cuz?<8T&!sU~w[JimϹ< +)v\V v Acw\Ձ)}C5FMs^*?́jV6!WPeY(x(d]tq]j+b:oձpN +n $4SQ8=&%_61ߔYULvn'PTm+߹#aP̕㠇J͋Ҝpc-Pe աOs`(|ɀVҏPD*Qh3 IIȔq")oit9EYj3#P/؁YD&xs&JD62Lg9 90DZqurJ'P{h:MϬttǠbDDzf 0]Le\Cb$3B+_QVpC`^0 F\+hkM(3p#oqF$|pw?] Zp#5LkOL7i ipw^Syi*><Ǧ@ELu-Rl89J1"%:몫a{PNl9 Ϭ R4])ݛAkDLP{k;CNu%B~oWrO@ +a;n<\YQ%S] +l1Ve,d&cӎifEeψ* /4R<yV7AlYt&BUx̦,_?OzΠ+4p:ԿKOɿ`ƄAf"~Xw/6-o bmC߾Y B&;G4BW5 +QW Trb8']ܧasTQ λexLgW8J֛nrÈb=3, 7KZY&=(#r7QqSbMz]5@˜;5p4YQ/}/s$ZU>stream +0 c@&Xr cD^3)=)]jn٘hc(tT1& +0/-6K(L bsN>7)%A-"4- I=w7?=ۭF{e"ҎJ6HX+Vd^̣}q-< "8\Q a!^尠v =`]NAJeU 5>F9A0 ,[涟pnEcI^yYqk3ܛ$e=HGPlhM@Adx'U]4rY_tB%-rAMB$iKb-j +K |KZ,vt`rǬyiM +YX I96:+Uݼ7" x}|sW;⧍K +C +1^Z"yC-}0./(\tW'ڻSRH'FL h!vRF%pL<593?б +ڳW,c5|D7 +#*Jkۀ8&ɯMT3ɦdcdfG:tIl|DAp1wwUBo?7ZW0꠴oG[pE,Am9C7S;3iv٩m +8Tfh`n~nA)`Ecx5uQ*U.f=. a+^edZv.V?ġg'&g]!ltyiuc{m_piq{ըm< uRb>#[u\0 K\ HVpK}id\lnXIõ0o|5Nw0X_5}>W9VFu3+= KS'cg[_ Mmke6xJQ1hT|@h`1 A&af +y9#9Ia]WAԌaOwYX3+3c/,@ZI3m +*x_}9CYen*VƌMɓ_gSu};WyF8m#W"N7t1~柶+g>!_$g/M(8dL»,nrXGI۪BW'J9F"uᆧFWR9!1FRd!:gNImf%3B@Ô08 +Df.qoK?ߧ[`_4bع6dwȘF?\'a9<i8f8H7M `4JO?oO~(;S6E~_CPpvҞƦ|*z:5D5%{p߽YДL|(x-¶R,t;ʹ&D{c14kbjQ)QbrCPa,c5tDYd)-&80JP4?빠y|s5)f^-؞9(OyArvHh!a[sҷ+/ԏ$q4zTf杜KvPlj(¯ó/jC9ZBP:;$ݢAahd痄92\bgZz9zGБʜ)j)y79^WWx{w'䖄SC %JYTHl@3D_\"}_;ЈuJQHE#Z!#?H0cuF-qO#Q Y$ ~$_Fē[6:Tcg QDo=DWE֖].ƿɐӔ= tc5p|(o NS;4#M +Jsƭ$'Ħ+/]. PGMq4(53v83 +.2 +ˢ'꒟p|52(1.otˍ,pHgoD NXY,͎Ŵcf`+{R]zL.cωk0k`%^ȊYf*9~z#y0-3>Q^9FT9 ,Tc4яY$.IR+BA$õ/#xzx rJo49b3 A6kAa\`EҟT(/hI tkzҽK(ΫM Bg^,*2$V" dPh?`usiMgq!z8'7vb8 DmvXZu׸ TC~QRkbZdJUB$T&)ԩp9"fUF5]JޣMz#%͏G'8ш߈M@/5 |"pm !bIT!Rܚg]'=gYIP )_qi +kp{UU*2 A^!pXHfn<̠fI{fmVWJ8O_|+KDIYKrQLhH4!C{:nze1=WHdRdsfBn|h\ HCV'ldFs )YpVhi#hQ6"qJ^ MR0ZCW! 钩[NYooI_Orq6Xpդ_E'Ix-ys0xeJ [J>TKoF>Ǵax{$kYExM~KaN;{sM]{SP 7ٺ9+rs VӀ9|ZWҲ_@+Nݓ?jXeOm~]P Jǵ[.M RB3`y.<U0n y(h'%.F1rBsK 0b~xTn(ֈ_.ԟx:PTHP8E\Y0eTAOMB z|EVIeB|HȢgPIE]lBP Iy19h [+禞4ܭ o4q8u +Dв%u󃵧/Qh^ִY8:x@"b mYڤ8mY{T- QKOb$퍨.QY:cf,G[m(/NΣw|mz\cSfrdaCs6T$*Y*Ӻ??\i 尝B>pWU0l#~; LvG)Ԥ+~N8x>`!skǵ_I.7U=4J9;x7 +r=G|΂"d8䭥>㮚vJ~bxOr +3R]a +Y6SlJ"` RxFSrL/G52!6n7F=_eXԴHypһY?YW}&ot)=$ +YҞ fs8=ZQ&.[*jxx_֎L ێH9( >I] ͦ 'LW*KvM_(u-" h}ŷŠK"0X6O0ۮhL@)iUA g 1M^儾=L?K@tC뛡8xt(F4Ϧh/UtLj[.vZG>/ի65(㉷|T]33DN:mW _ׅJqE)Y`7YGbf<0<3զAر5҉Pw`r +zcF';lJ 0 {&͵Y_@Yi od~tqcdG{ǚ0->~cCIb, +kglV4ի=8MDݣV*vuӿ`%Ž (9Ubl*Jㆬ+g4̢n7^ $2G +0pTU=eJڦcIst(5|2D#7o‘ /5 +\ZO+otmU9IB%(vĄ/GlJgGsG#7D 7 ѹf86pN =0JW[Z@S )A-C8p`q[InX Q-֩M8G2ɻ"g^=FzOGQ8' 4viG3.WSՀ|Eo>.9n}h2 :FR3eE.>u}|y>'xe%Х2o?lKv-h\&lܧi&kg_~̅ʔ兢.j.jڑ̀h{cwP5U#Ouנ{TD#%|ArlS{G-L0fYlVpE5R1W"&٦]yf67pl&ͅ$jXzUR# +Y,6֗ߟOׄ-ؕ'8M2ڬմ'rZ PbQ-o>҈ĘqztS3H\x+m.t jv%!>E%Gq=AFLfO͎G950a!2ȺDj=H7!rAJGLKhA/ | Ĥup9 )kj"F8ChO$XQ,y6F%mT"ضps3"V5sHh|/%R(?p Zi4,OSY^_.Rݘ}R<Vv- +*0&f:`ԉяM"򽶬T=)Zy9t dqh):)~ GdK\~9&qp1 ?||Etp~27A%zxJGBQM;V{(QNm' /bbw %|Wß& EdJjh1+T>I8=UiV<լ1P\w^ϧ>u4&\y_keG;q_k hN>nlM +A{zX?_nvB9qw۲l{#lZ(WSi"rA2sˠA;= l앧ǸaX#Sk18brMҭ:C}045"?M숅1y+W3 ֙HKїvq¸EdEPZ.» +|ޒro,gM+Fj}; .?!a)krGJst)g=Ɣ(55%:GHITm#@|Bfk4> #i' +엌1\Al6_ʑd@;40y!Ccc*G2NYƑN{-.j\ 6F +Z%NM?ż"sD M¡DSi_Iv>,LEԘ}B}7Y; iB?w@&!|&iv7S2C `ZJhwiIݍN*Vs2<'4 xレBX>AerU%%Nu/?a \;^LJ_O^$:*)u8{d[*QM:BBi6D~{B\i6rW.w..- ~;JӲUc:r--9*0^NLNc4lt譟)6X`Tsf⇌A2 +:x@˲GAVP5 +ThhBn"͐Ҁ: 99 wh5R,.5nUY/ƿHW4GE{Ex \5uuH[\"Pp5:&疤;*+Ħɑ%$X?' eG;摂J|n\W{'$L"?1OuaS/` BFwՆnG\6KPY =E&~op1bte3/Ǵr'-: mş撡kL^.rrA_ uf&d纥Zg%3Ǹ~-pg51#!S|,~L\ OKmh1V26x2B a'a=qFq&iBXc9PUhFjq[Lh47iW=.ѢrZpvQU\2kt|n~S-%ODA?ǓP#Ӽ& +N;T=B:,ɐiF)W5IhYc@JhFuI.YKS >DMR%m!GXɈf AQ͒`#IBc6KRřDg/+YS\52^!Zs-3Tfp2Nya5l -?wza*?uTiw,14^;;fz5nsƴ8М_-VYB. )bX]?lr+^>9X /\<$s<h~gv$s#bR]ЍPb,Wσ)5ʕ= +'oyM+d͓gUUpհ! 1h/R!9vj|Q;Xu IKI[FIAC fW,5٦|ڷc{,&yNi՝66+zlvB=p3-,fDt lmH9)եs +~as)-jcr@$Dv% S@IMٜ +1iNr>~&IG'vsz.ro*L?9u>k>qJ<nl +lVp(EQ8F53;4,Z>n%r8 dXy~ʃ,Ɩ!Ҏ%^d*`%\㱅_-];YcD8U7n!9n N@Yƛd*ejn/\^M;>M' @ +D[lK~F;J⁃j%rR]zd=WaćvP|vgw}>,#-i Tᙦ'pm![b^!v]7d%qսJf4;vuvao.mY`n*XKh=YjDk֛xNF,S}9 ʌ#IC/+&b\?q{?sm ;h R6o;4]$x,*HI&2{Y#r&D)Q\x߸\ԝx<],ُhkœaHi%gSPo) Yu/_cAh˙XT1xc5k]+Py'YUǴolz1|N*zj@7(GwwN5/6̗e) JUyj*c_Μ&ȅcrp[6(I:&'aپ:UpH?$^E %Ȍ9:;aA6|>LEWqH&hQq~BGOWǪ6#!E"¨M Ù ۱AǑy=qUXM/">`<(ca jRA & ^LmL/'Y)3LSF>RVCŏ\sZ"ϓl Zύ9; vQR-؏T(BR}b2;R:'UXǘbx%8O|u515’=]]~Eɯ_S'kr1ѼTrq)|KoNEjaEp:P<:Ђ,U2ziJUgXgCU7k j9g1 !A%U & `pQgtbJ~.Er3LߓM;+|-$*U)sU/0Qqa\Q{j@" u*9ģU + CFO ;s{<7u=Wi#HbyaǨ72M@!`*kA]lb၆ &8cM<-t7 臤[ߕ^(B ئ`iq;|R[p*?-3U jl/H>&j%39mf0Ta8 e!rU p +v-N}U+P w ;I>}G(oSqnۚ#F_lYf>`%Cf+*8j(+rh ]Ӣ^hf.p8wFy$͠#,~{DX!ᄰ #v%ʖAyVU;ϟBZtY QNU=k}`"h @E4k9Yy쓢405c=A69]D |ns>-2CiJDd +P,\D3hu&S 8r]&9̯42ӭW-jnv/H(`5@@0ܘŀKzfCG2NƋrXglo9cʛ-] +f]v@:^ЪEȉm\YĖ2uD(`@y58X_(Q#}!T%mhîbhf >YF rf,O^ *B굲[BrC J 6P;IEjR5mmgP?F ^\`6N'hsa2B4<h[$T +ӻkυubW $#}>f|5z[Ҿ+fEyҎpΥhM5T=}%W3aV;|e#:GݭRrM]E?nH ˹ś% $dr##JjTYQ>u`!@e:^izp~ޤyn[痴mkaMNrx{Yh^ GދئTm" +U!zjjJ O }MyDń1WkMŢ,{) /G}qVPWQ,RC + :Q'p=~Ũ(կz˕v992_E}OTO\,o.ζnq@OϘF^Q k2RI(t޻MYcvZp~.~p/]:'jP rq8,0b@7QZF8$i7nݎo9wS۷h{Sb_!xY`妗 a6߽c8a{2XmTJ`ZS:_/Ø{9pj.|ڦ%Qclw{7擀Y@0hU^%yMx}lV1(0G\zǗtXXRzk̯%[DL]}Ⱦ}N#wu[P Nw]_NX9{J/y(av.F_t\wSi330_6iGh0h~8 WZkxV (lz#T0%q+1rJ;Y](qa,dU,%O8*w_a#]q2PeCɔzJV=RK͔ Pi)-˿:l֏^`±u<`ٺô>It=ӕY m \jdVb&wn&DcjMi,M{6(!#F$~7dR0dV5YSP`k<wsɷhRdqR4Q_<( ڐ; ÁilQ<@F2;ܙ+B*%|K P:{BQ+d;^BO84b kA=2sU7@TGX=~Ybg&'U!JX^WU"=]PW|V8>hhWk^:W+:y0dY]c7r(~qq7TT'_s ĥe)K]_ ػƈ^YQu@0X8O򪨝ccDo^,@>6l-<@OL}8wMGQ[fDp'('g䲯y"zYH 5lC%5-D C6q?ư'@([Sf:C6e..}"n-~Ds`Ia$ڊ N)|,r}~> ʶf@Һ/~c>cm0pi'v9*my]\ )ץTp*D )UtGCjy-kMs" T!/ qӁU$ +a?'+VCO 2֟}8J__~ܝ܆u0FbFWЉ)mտ,멉ZpH+ՉAZ 46td^08$Me>1rNvq6r7JE5QAYlC]ۖ4Lbn \I`}}6|dǗ Y9u=0ķ=w +b3/:rqUd@TcV&d1pzavȇK֝GV:ɢl=3\~.4O;<fx@7M䘋IGsCV*j 8VCI?Pk88%Jۇi>"ψri\ޘ,^CNjCH} emHPFسi|pO~B  ڟ̈́X Rv =d#Ө[S^%Ga{z?):RU'.Rb  +Q)Xl*Ͽ½۴N]-N[m;9ѹiB-GA MNj.+m.2rj,mcV||$q(QEz>qv 컑y j{8\=!2H2 6͋|7+@g81q׹9qcį xݥA#b5O9+b}x\ը`aP޼:Қݴ}s\ +|XF.*XJەU*IO74sŲH^uc3X0xG.o3fD_XS )뀲>0W&g h[0 {'XWX^ߛłܘ m1{+]% Qs=+;Ms{-5g ' j= kė}} (@ #aW,iիn 1d~-羃(TGecԝzQj^KHglk$+g z?D8͵2M%wў7 gٙN]Iy)AM+OC(Z1T~fwGb9`4xb4.<+#M[&bɷJzٹ"xQ*+>ݫH/!$uehA qtsfGJˢƋ$нYbz_:h; $;p\vRlh`جtzp+8\qiLM^f7]@!|k.Y$ASLE-|SWuŞ)T.(K+-v8RTL rǔ,FlTTJ%@`?ShvI$T?W'KXFx7hW"v=Lݫ^MNPxwb-0{d0:΀PfM5[q*ۼ1{G=cu;#G(0<j:6n?p ;YN*-UkbCx :bnSEJstg2 +\\7)vÏˠ?Pa/ +$l kpuqtHڏ$M]fF`^" OiSM3R_J ;Ɔ:M{l_R LeSkX)R2rFE,~N]FsQƓV~a kmxvEeT)e@Ït˕LP $(NɀQ=3`\1[|,2|$+m{d0Жmʼn2 HFH`gHq{u164^|Ka"ll`kܲTXP ཪsgw||t9۽ %%cbژ>Ro-w+ BOwftf#,(P$f<=wAlk5'3%GS8+}!tm*htL(ۅ W0y}M( g $"eASIqy;@a;L`<iqzQ 3xFH*t#fQ"q!5/O=0렁fбwi69ji 8aOOm1f\޳&gA/RbMqwV/ uO ^% hg>E)!̤P`73v9Uq' nL-z"Xs6M_Wues b\ {*9IƮLU?!Yމ@ը4oYO++{Se"fINCrHq&L +x:k4k-n}ù]oeHXX"PU8 $Ie{Z$:v|_r;H2DlV{.Y}\N~;[H C9ZU6zy]lݻG/2PlçǒrQ~JpTUH?=id .Ňr5+K +Xz7J/H\"aW)dg>7- 4G TbB@ {BEEZaq3e{P@~PレׂsPcPCH{.6l_sxtc>GƎ"[[zeL֩tp!Sp 63"64=z}sqXK0eJH%1*Th@_$C A)C\^C5 +9R|Ii0l#r[J5gj߻;p Jm XK56nȔ2?g3 GB<#*FNWƤ^,;ކz~ٵTmLz{v<$02ZnB(azpo^uR,2\I /x/ + 3?̨1?q6@|H \\6k g\ͬD1d!/OL <V!'yS`A{tK44P H _VdRQ;Tgrʎ\k/!ekR")1`i6!MODF1.I[$v]Gopp0 ],$h<{dyKvګ^J Ա 7Ic&"{K!Z?,:h7_Y7r:4K57g$:Քy2\NŅ/Zi޹ IلR 0̓"3J8rp`K4VF0l}?>,u»cSX}/- DG~_ߍ(Kk%%A)11p"҄|9FA[&?aQb|[xMDr)A3o["=,o-n5g!&]r߆l,mڨ61ݣ!PG6I˙t ?vk;?oҊR*!?; ߯^/rHVLDÍ9ߡj4qL7b|GL'w2F&S 7ocK2o\͕GYhL REQlq0d,,-zwc+ж؅$,5R[&= BU`Ba!H<{zhRn ;(1pw8M_f-F +KAE"^NCm aemvyZôΐn3CZ+ϥr@G|$)m֮Œ۠ҽp:O7#HŶ5)[*jQMrހ` ڵ*J|ࢎph ymXI>{Ϯd >H,`ԀtE^MRt<զJN8,)g_7%xCDJ)Ðarc).xk oZR;1]Z͑z'KA iC8e5.8JXRp㼝%^%_q˱ g!+X2cSD U_ +L0oJS1B\[s{N5@ D +ыGx&-W/H=`n*B'kr?ӵkHEm@xHU͞փ$IxP@Q,No0h)5d7+\ )˜}I816.:ǡ.񧈈^y b8tuv EWqoB[}|Q 9ߚ}i^G{Xp:C2M_6'lkt Z5:̟02bVT$H@107+@3 H8Xo^jRz"IHV-0FY-6.VotwL$|[nyjjJQ#vʐSQ$EQǞ?OIXӜ#3=lRv՚ze8Y/4./喕ܔO+>:^R +1*?D,΁ixNDy͇rĈ[O0'Wv|$5f(n;`/myQ]xhԬ +_E ѐA탾 l8?.@MZqixLSzV !Υaj,Wo&D(m2J/1*='TGs]mDǺ1c3F_x,l:_:fk*˳Fa.|=mH +T +֛Çt7To h\5hZqXcs9ޤLl a]\ƇT{F=o6{-hkAapν=!. +UP΁DV. +ƯυzU3H.>?=ˈ"Jva'-G٠.7!aYQ8ZcnXX(/9`xgƥ[@ tCE=VgͨiY,D>ʹe9:>Γ.FWhRjYy P`" WkfK1W{eOfI2vU?u\gx Qd*Ò[rk#dak Q]B|P"/KX`:8m$*[V҇ƅ2;;;24t>aƮI _;\[Y&4].8\L>}</`ԇU"]( 4ϗ2<5Z*I: k <$M,"$* +)ՈNɗɲ Er8dʞv +F[ sRlX7 +NQkÒpʼ`FСuyrouM~,ɱ~vKxƲNT;\](psR FB'C)|1Gnf@I`:))*G?:h4UP荒JϜ<BPGJyr>5 ΁Lt%l~?7"coĽ61כy쨲SFɿv05Ell!=C@J(єuyŃ +%U*<*gC5[TklLNpqOVUP.id;Z#]t$`Amj{Җ>RXZq: 5;f~@}pFcX5f_,@v#[ 0FEXvOwȹgICC'_?v/Bo0+,dCiiJ¬^}nC[vQ|\xIJ+#0CE.`B);Z3?90\}S7Qи)ܕ;* +|OӕY!#GlO2`y6{>HO2LkkV?_r͡u>c`G㚜#H 7ZMIW>P#:)KGJo|3[iIj)>f~d`>PXMQx`AJ4|MA-Tz|sT!ϟpD7{=sjg>C  {.)GJ ';$\~2$R:P7 [iJ[G#/مKI5ƺxQh?W2HmII|5S23#d4 '4W! yxj&U 1-Ϛ:<5rdFݎfZn>GaeH?,68Iln(m.-O{B_po_f؇y{3gxX͎LQkC[Ro`[qef_NlpJFOܙqf5[ [r#Khy>n , endstream endobj 3446 0 obj <> endobj 3447 0 obj <> endobj 3448 0 obj <> endobj 3449 0 obj <> endobj 3450 0 obj <> endobj 3439 0 obj <>stream +HWn}Wme,`Kb9M@@(RplS}!i]c쮪:uO8Hj$aHRL01ߛɛ?v:Oy~}fM+RoN0DTMŪPi$KAWBpt=4r04ի}"$&pw}}rzf쇶ٻS!@bΛ +t%(G9ojhX^H;ݭjt #lo0\pD +.>MM'0YC"=^!fb]A:|kfzB巺SSIWp_ ]ݵtmp&.#V +Ȃb?Ĉ'V,F*Co;n8J߸[;^`7g}w~Y5-:tZt"u4ru~q`$89{xWU\rvnSL9zX{jA5ҜA?\>;9|ƈ 6x/K9(I3Tšc% )R* E"6ah1i3=3.iD{X8UwE[e4x{;rj(X27ruglD? +3FIbn$w"l?\Q!R-|.W@-xݏ4X|T<=D9*g?*ӱ..]]Nm{[TRC% 8}>C JWy2qHfz&&Lʦ~iqEj32122>f$2n<-ջȘC[MAEl6oG#`D==? IFz.fcmg4WW?]w4TN AT0` џӃh@ Jv.MG.N;<1?,L9C@J U7s64 H +'ayZ$~>2ꄊ(}SQ5.c?a%((>L>0&KчcHQiuSF‹}?:Ms'^aQLw^0AUVA9bK==0O33ub31W##H'܎n6ṠL mQ!f*@;/?8@Av"T*Oa +bHsm +3dbH]߭o~,VtΎ<&|2.ki zʅ%6$63UЖ{oonv%qԴ^@!Ude +Pc(1pLOյO`1HcHi=&H=2<kV5+ϚԫN*hZJAfPSQQPbAvXf~oƗtHO(QQ܁<C7>CF/-tZĢO:{Q&e>[T*6X3=cÍrݻvc83_JRJAQ|Ȃb;bo- rAXL{So1 +zhA@D<Ŗrk_J+VRU_Q_q=H#:eY!-vcs <-DF3&Q^R*+qU TgLFBoo2By٣Ke0J}YbB%P#@{=Bท͸A?" ːm}4`9# Qfu]=U?{ed״:ltL!0Wtf A l$  0T'3 ǡ/ 2ג8N],`6u36î +R,Αd1K@E 28Q$4Q +ǣUM,TS95M8WCMЦ(iRCiCyHH_a2[9D7/j9\[e?ۇZH0]dF2eOyaYJyk60]\XR0 +Oq쮾 F0`%tuP|W'B%.lw8Llu~qLWzjFhхw8IpP0{bui>stream +0 Q@&A  QW)Xi|C亨 0FX;)OB"Hu@`SNqNnD~E( Q5⍭N|}FRۿ]ט~"(&24d@\(wRQem5#mS/'/Y拰F4 4qtI9(o.cs-H(uҭkfSU *̒mڎr[Ôlz[[%&xGnߵv'B: . 3*XQ<^z>n}Ih 0J]BjkUsn]{8HbDk48$MJCo}ɦ*T?i=Ԛ/8L;`וX~܊BZ5o.QdY_>^D*܉!-pOB3Yӛ8w6"dxm^jېz4:#(R<jƫ;2GjGτv5śr8_PxR.uBhy`APsWS7"QAQVǿ(b^<̈SFI5ހ&[Z*!cY}B3gϲ ؈qp,@bL@nklо4mu !82ڌx~piDu Hc*5=&Kk4^5ӥe2 3nllc}v{Aܖ.Q]ԞÃJa, ~- Ts F')CY!cK# 1FZեhX2E3 S SXEGu :wԘȯ.KB0u8qs-u$TYI8,? +-#SH(sm")+RXƙ8P#gi)dubT/DZ9?*ʘ1?@:'¨O$c- +{\\>M8gS^CZKiw)4$$AjU{݆49E`2pwĆ4:/i+C0B &PQ]Hϥ(nrͩ\]6GX~ڱ U`#|ލ\XNxɪYql85eYsd Z<МS/ȫ+PlCSfϼߦyظZ0K-i:Nfҥ''b6!ZAosu՚1cqҾPRoF*,i˲/$Vc?}w1Ācͣ(4] qFI"Kܮ$dܽNJ.[ e&adM(ݔaF:Î5èvhKeH'wL60P(DkG)1hF ю~Ah\Z0n")u 2kWᚙJ&/wUL@W,ئ}N77_ y$a,p79Vl+4'[ +P2y֩MC*~aj 2-L̷ǔ/;-MX6t8k'(pfY;e ٽQM)+{Sj0f:^>Kgk.'f lpaG_wDO3t.nU5Mvί!2sINS~).$xsY@ӝS,khoOǪ2-86Be͈ vxBci71RnUlUGZò*v.ewe j.p`RroZMo@s ] ,)ASECg;oiQBc*M\# ݑU3Fԛ>7] =8E^mm +[O}BV|em̂=.nHٴ&ߎIEIj(e,7 Uo)BRa1%|YbDJtУ:*Q`g۽ 1xH +Jg6tV;v~<Ma|kIO8qLe!zUD4=I_ѧk*NTicԙU\ۄN!wdG8]vTWUOxuו`f ^qa jC?#fG<ݹ +We0I*Qj:UN{hums̐h8j@7`5/(؍[Oz =+,ӗ=?$ )#oߊHcdTU"PEXI]U:TQǘUºwBp1K9X3eGw ' Z5rXZZ/~4`c-]V)篑lo"-ds0X]IצY +~"Ƕ2$3GS( A5G6+Fs= v4BGb~Bꀕ::k.nzJ aWW -U6/&ic;g !"t-WNBUk.c;|S=$N~ =t8&J^AIq~{IZbXV)^b,XFqAgÈ.vkѠ^3b:*my>EeV9ۧ*Z ӣ|uޤISpO_bľ')SvҊgJe{D)F068N~xequlR>) #ED 1aq~ӕc^rQ$.(4TZ=HG%$Ȭ <Ǹ_(`*A "fFdcζX?UnFSe s7TqZ ɮ<|L68$¸NiA$e 5|Sn⡟$z UVRgwp`zhO 3V1I㚅2nnэj4k'9_\Έh_s . Sc.5!`tESGc&W3$Ў *7o{p*}HO-) (o[˝nނcaM`eF1J۶VWDms?$t@c̺⏖Dbnat蟭 Qp;/_Ɯ9*CY:G;L]22:006EDIR~/e~XYeJ&+RyL;VJUgfgT< bG`20]X}j}Hq%nIT.?1%is:} Cpj/ez1D^M-)' k@a2Άm`D2?K5θ_`^7%!ˋ ^Q#/ZuF8Ӂqm[a9>Ph"фHȯe\VoӘ`0atTbD`^q-ϖՅlƍF 7B ',iSp ]g-bGU"jM92}C=!1O84Cd!> +ooH%I)%yhS*kJ3V5g/|phKŊPr*]K5 +qiዬ ].q R Sz$tA߭PB2>I_|MB$\LȐw/g6t3.r˿ =uO(a{dg?vWQc7w欝^zSPh!aPKOo'@+אoYӥm, F2b.6}hKRٰۭ͋{k*:*!d Lgu+M$i`%pIV|N-qf;x龜l3i8[\J5C£wT + fіMҚ ڿv_z#yWy܅y9"cWx\C[''XT<flBn[X 0]ۯ|#_6#}hPISzLct=:r6Xp*o|F`!p9Hlt Ñq wک{4'WJh$xM*(;88aF!d}zvޯ"SdA`Z:8,@8̚o_zDކR a!՗*@DL8l틷5YVu?2m.p?[sv n "3-& R_r;Y4ܕZsg>lJgԢ9! 2'jWS4V}Za|2-&=pK& {ⷫWY<6ӐG?V-&==̂ 2?z2z57[t9ħ)fQ-VݲPpL(+Xsp6$Qt%/mߏ#צEGJ-]]DP)pfζ2Ffux7X?[CJ$_-{.wT$r^ugr5^*?j=\n۞ês^EUMc.+H29YM_aA?^#QyxbjjIonl۔(NSI2挛XXD ?GVi \#,tA%/7\ :,R։;~Dqyw! +$^(:cmE*:|<~l擒J,Lre Eskw>K/֮=TY]aJ&/iu#GvPt wv?pSՐ>̌+y9_ڮ+ Y7ĆVc|K$?-%28̖%3`Hp Ya~>z+uvTIa,=wk-);W3¸j8~ۭ~b9T3-ZyPBZ [m;^{LXSޡ2 3zP,WAIp4ꌻIЧ:LԢ/32|Wzaݫ#۳~1XU~O-7͚RhC~$`V ß"̟$o(grՕٍ~X%aEt%?#NxC/NZ,TEq.9/J"H [R0J_x`=ՍxrE>]I.zw[+L ќQJEj!#vcD|մ_0*x$ll9o0K#bc\P5K6kWQl8 +;r'8n0 Zm +}N =x,PE8 3 B%K-6SAyʑk ρ,֞ c 7 ttJk^6wfs4 m D 30fa|I@>MK2NDb+:f%į4B-c;@,b6rDG1 =.d*nWX0m@w_9?_ >8$`; W-$}`C_+vG)nqt 'Tz] +lZ:ͨU1ljZB`F[̓34,%bqMI;29BS*±x +;Uv)qTA5B<9i 3Xs^-mXK91xW I"m`w>jƫ  dPlj3D̑1K?\!'qr<)F`PïGr+V /ovj9h$ܵ_ahK띴afWAඟā`^AFQ5W.dpxu,o1[o݊[y _aKa?Q$˩4 Oi1qJᚎJY!,|DQ2d<]V'e܋pVT)pky 1P>WNļW`78"qYd>ٷS0/V#iK _cKjN+S9 1!:@mdj%7)X d~ QyADVwMPamoS*9o| au[P-h4ٰ9=0陆o5%`"+x.zhĊ#:ݱo ؅g*׾xj`F~HuXSJ0ɵ*8pr<$88 +a5ڹ롋iU^I|=q/[mKǢ?oGI[fULਅ LL._V ks@PLLqPszNcdzQ:>$$M+R2 q57p8sSp(Aka[D8xIwR%n|N)3l !ԥ3 p\5IW|gۦH]kz\+L }nI-ku*!4É"s#r1njn)1c={wb?=-n.?~sZ2uRg57~Gښed8FdPfd砬tɬ\ؽHwljW2iÍ*U.e2^sUM6^/|Ӊmy ;~GMPY fn{ǢOFh@7g2FWh>xpAQq6'ɲL?e&PIb:T_AD} +`mo{-'; z8QeX$:ZVO=xC!2p +*^GJGWZXJ_ȔagŐcץ ++rH)@bJpC"s*.{LT/rPl6깨v*Pˉ^Uan, Ĥ|&/Φ8bg}*^)%L4dVroŨy@ioD^pH@h򂲥p}~S 731F[@j0=4j.Tnc 49\cĊs!vŏ K ! ”)4m &-IuMoY[*Tv Chu3k=>>Jpu s2Tz h촤+k4+-$hQQ) ym~ümOiȅV +vByedfVJxJg;4>zltS +4}5 +>;1-曅@W[@NoP"c Jqg!3*^1R+^N?_ȪO$!czM>&.alԓZ( ~ǞJfS`ڭi6RUC\V)q".\ AoWܹH|~a +3 wLF{MzB ɇ^(:{:^{v)(t$ۙ][z42XɆNaН  lZ6t`j[Gq~@է1FN|w yYJcHq@,Gu3g$oMSS\v@0{HAbÊ2V:ݙHgU3n@('ya;*Pj eC;!:YZҝtR;Is(zbN"eI>kX)ȠN] T0`˫lA邈jO ++?ItXGM6,W +Sd`Ў}{a c(rg@RlC)꿶0PbX6\r6Qi=Ӭ9 4mi:P-=1իN 2T!egKK% *ѝ~$#_B1cԬx`X?ƪwh e6X){;s+%^p#)|]0ZL}rC8XSZ/3%DjXI`+Z:tf;qSU.,(SX&6K~}m:~ L`0RvjA~h /$smu5$kȘ][uP Nh8ׂ!{g b>$e*#HJB,-A +a6lH+M$XxF'|K(nczds * ڀWeS򿠋Sn;|lh<6R_EGM/k;}邋#*9 v$r1]@}Ɵ’?")Lp1O:ͻ=C3F9ܚ0ꄼY`Z]D/*n;}2{ç%*hvmO;5ʾ.h]ʮ]|& ~ $ہ{6&l8&Ō-Dy x yI6Xߢθ[:[9 ,p]QꙛzP\u} Tmjj`۹ +\79L ZggR-)im!7GAuA +Z%9`]ʻ懕*-Uיϻ"ݮ~8oT+cEG`&=jxC>sߪq2dK-uyOLY\apӀS/kuH1{hB@I8pԘ/#QG$ߜݲ\<_,;i(Cr|٨zE15o{TYx!'KN$+-; }ѸNZ +ud~, 9B ig뺾 l-8U^5a 6_k|KGÐ*64wa?xI"AY dKEmlU<$~A挺] Œ cKM,(gˈ~1pzm %5ZlAWB!Ua]&GZ'u_;]aFtcͰڕKȉ{7p@ź 5jqL1?nj3}Ӳͥp1y'=Weۏ>T\_Y>B8Y=}GծNf9L~ =Y,͕akKaY6Xzvt;|hw$&Pn(A돞,m^z5ϲkH_iLccc͇t]~aˑf @%ݿPs88kQz~eϭEvL<%,gHԞ*OP PuNL^?xF+_Y)g34[D'\].-T  )+H7,6Q˪y#|twէ]w̓~=ǽlChMxnl<.OK}jusaB:wgCkcȞWtNٌ7xJ@cE@*\_ /gRؽj g/)5ĩXO5~]@O ЗK0"g76YnYOEWx$yR p*X/)m=|C/Nכ˜v T(e/a.mMin$JRE̼Ƙ'&z8tfZiv6 ._kxO1wM.16W>^oᵆs@4 0Wm#L<#T@FNwO%o)N2),rԒG *P(a~ 1֎IΪ\Zߖq,M5ٛ@< e#Ĩh=ݰ-nma r\dԛS#|5@dlJ\p9q3ʌ]~QGij%Zv=Wgw]a8ff_xyV](w/> dbkx +y2-ݗJB]eLmu7~|!uo;4ZSE7B|3y^>_NU? B}k=G1/{Zp@9}&lo@a갼| Ʉ_ɴI gPnN~{r;:5]8k#LLI\2a}f Pu #u:SNBt ԻY3`)d%Wu6[]ؕ~ vGs<{V#D:x4b(}^' +ZS動ѴࢪFEl(aMi9vuҎ}]P4tI4r)N\Ay +Fza ~#1:W7{Ȕ[Sr|IuKFOHXxI:ҏ8Y((YMRyJ6]C wP%=% $> NA?L--]]/SW23V¯+ |&00uXz-˖`a2B+D^KUV!jfx.CՀ6 C{Bq)һV  +U:sM?eQAl8_7.hPdś=L̴s0 >|ΆpVMdpv#ʞN 5<*0O GzZ00{f'N.*ND.V#df/ .dqL_S/* ׼9}R531ԉB qD F  l\]ϦkåN"bd>f՛,P\%#O"X@M^ꝍcFRp knM*$?2JcB\> endobj 3441 0 obj <> endobj 3442 0 obj <> endobj 3443 0 obj <> endobj 3433 0 obj <>stream +HWn}W-`X,[?dLcr$.QfVK &%9,Mwu]N:+IR?~7뻫W}{W+o`%iXb,av&]ze՛şW _m~ztzhC=Z(G\(J_b֦|L]Bxvhxy96%3"87lg̈2|6fh}N'UJj{s"vJ k^.|[ww~OhHma۬_=b/޵8o߿[Ns͉e]=L70ᢴc8<t"f`' +9Q@6R(S +Cf̒;^2„mF-7\}=z|q"b羺þp:}mtwMݯ>Z36T ujO)`,  vD~3A=5<wp~O?_TJlw&}a`V1l;NĶB.*jlg"dB=sq}z?/I=EjacռhʖKXf ǖ5,,!868fB S3R3N(v0o}5ԓ(5ARi f}tJT:fEC! Z~L)p3;ױR<>@"~ &!_)+/4e% *8V?}Z]LVڱ(<+YƕhoV\A(9Pn9#{5ɑm-n:~߃zI* 1(~?@ $PHaQ?$ oU(ŋbByU1\5dDXD- bLPIUdlR0ay gҾdb8hd@6;>JU83ÖQ>ȬH.@#(m KD-Vڇܲs81#⺨&Pj}5m{)<$K'0.O sbKrg⃕O@ Ɩ@3ofVUQ'05 8K ʓ$iPaCe(mizp&yVI¾FN&EUg=@(\M ,̻eL@.E1oy)[,uYyŔ#ngb?5$"5YAQuA\IfS+z3CalnV?YN}9%h^EAyAo65W*]RrW>W1H')7?E9F8h7)S-/:S6.tL nU665F2*qD>[Yo!0j6Pˠܺ܎#X?6c^{4ebUzb+G 'OIg&.^)O=/x0IcO!L!yɢNGꪡr!2cc'zSZ~G̙)G3w{eMMUQQA- 6l{}l8sb cSi  IulA !f&޷/ /"iih3>|m]vuG'HLf3{z)a~_?90q)'hQ LயQe]/ܬqgwrЀl B +Vac~Ӭ֒pI|V1!RqA6Fw< ~Ij{S5kК#hL]XtLZ5ӨEVIE^[e}f5E܏7F\c{@[GCݽl\aZ޵\OKiHYb56ԢuSBD}D U6* ۢhz->f!D)}!4fijJA⁙Va<o)B)c r@rJ;NfokÉ4><h1XÆNTJƏ~V*WH`C͆"}W1 \{eLG%Q\xLH6xư!y94\(1180-xl)ȨSD:lV 3ŵ2ruPj(=ѩ~fBCX#`ש9 /о];-jw)X8t M FZ΍dJ ypV/B +!'+ 'zYLQahܮfL^$`E9b92MNNJ$>J2L8VH<)?rEGڊD&v_wMFQ6髺]Z< +;,Lh|܉8j6RGݜr~A\;@'^ f9^IQ JGf%JQfx.Vͪ),TÀI{àºo@Q$,DD_)6aEe7r/ZvKN !đK +mՇ3v&RY;0.ȟ]<䲚;i)2*hksNw펓;|I A=05C«]ۏ F%³5FUklUIc'67U+:[;%ali鿬&VS-E]?HZS'@(w/LFWN|M(!dbT :!\Iw2 yHPw }` vKT% +3`Ԑ(oj4&Kn"%:mߔQK=*DŽu=g| M,wY%1=m%+t` mr!=O+$x,<*B>&_6I:xC}AQg[y#yEacbFMA+HUXV샨1̓;FX(b},9P*fe(5+e{F_ǿCtȺAm<43^~ V7X endstream endobj 3438 0 obj <>stream +0 Z@&X Zqr`sMA`&/eLhǯ7'6=5 5)\2CN9A= fpq&*nGv,!L퓻bc-hLB7KO46fe cR]*jO^yςmQrJc~ Dw*V?WIAj's 9YR(Df?na9'U,ºQTyiX9(l#kc#n4ej&O+lO)wLl3zzTkC2rQ,9 -8n8|]&|ݝu00J"DpA$[O321_"lJl,?Q_0<ovqPqOغ4@⟷w5yJ6/"2a`D-g$9\t7ƺiq!\91)iHbWoVCDBL#8ر$ +Fv Yja<|\v^u㇎[CU`ދm.&NO#xA?9cE(͚D«i; a@ CJgF)KhQSY@J܏l`;͝w273 Z+^HF-^bz_C +}J11o +ūF ++0d7'}(#u$Xڲy:"z9Fj8t8э3=Ph?tE3g!u%<`/#4F9 t\PUrrkGP6De/@ ~捊4GDjxQwݜ,KHR'*|bK^0{~ApxؔX}B:3 xzζ Sr8=ڮ0AM3W'ݞ^v&1j3W#D a93eV ,Bqv2['M.륜7r{C붯Lfwͩ*&TNBi1"Gy}0gќ%qCN+iXszIy.AeʴVK"j=rĵx2Wζ樧 Rw8cr ]qX}B6vJi"lIfp9ݪleNm?'EeʙeY/>.śx>ԕc\ ~qoM^ap)dyIcғ90Ko {x΢6m Vujyol7Bb[v,0X9g{\Ϫjn,Đ.ν]楬b~:Y2t{a)Q2W_`krzĞRuú;G?csN}T |A(G/⯊+17VwVJkokq+-81!,eJ;!$3N2`"!\ 6Pć*5J>OogmYNEȎR3"7fܨ|Q[>9OM}RKMʑsGfwkvQA85V[)>$TIœD:;#VcCHtwNmq) )Z˵5?#nގΠ*ӉP. +=p,E_/m[S7?`yۛ(]0Xtd.Ay#:+.X2EVhl*8o#0&;4{׬4[Dđp۳s TTote6~b>O,3| K}H-{t \<̔Dq>#wن?dِS93]ܦ]CCzXpRܽNY^<2( ; i|cE wUXV+kUщx9^>G6Uc^ېy6#S;..WSveS/v^ε5[&&rG&O mLG%6 MG`.! uT6Im>W|S(/nq#e*sQ'eMW;QY%&bVxd~k ?z;GAhD94tn/fNr*q@p;vqYV",]hyp]|G'n;246P]po.h Ӊ7 ֽo.Óf{u.ɀٵQhF;/w3rBw!.eD`Pvg-<s{gZg۞tI;\P&}ϴHQsP0$^9O5VZJDж>OoP6kw9 T2hߙRs\fr\qFp 0b7A,GZ@BI@!?+ژiL$ƃPWܯACoj$fN@u +)iN|I +l{>?$,Wl4BrmN3¿~ǃh=CmORi$SKﯤ>|[*;91s^w4$Ry6Y9|ࢂRbbeTlNS#Ǚ-YX/o[f9弤^|[a&'N[RQR!,^0"( ><Cj=؅Aۛez(G9 KJ OxqJI +\t EpqH+ e˗iKٻ> &~!8_"@Q|}1ǒy\G1Yo3a +=BSbhkȒt4ED֏奞(?Á d?W|[.d4- +^Yɪ]|zeI~ r5Mિ|5̻K3ЇbQA+V r݋VK-ɑTR88u c`ޑm;ln6kJ 5vkÙuBxxtZ\G,ּ{"0ltۙ!aL4ejiuQ;`Wv 9K +2ł@7@!N 饻!;C[rxTvm~pUݯAҢoBwrLYryr_FG +*+ѡ؃yh㎙ueuhl݉DiZnK {)PX"@Fa,鉲ȥ6f{g^nQp"JO?)+˽ygţ-dx7s'%HM)]e;c<& m"RB I.4=%tPS#0lii8CSKs3K""&r \T! Ž.p 0=ndaC-ˡ5 [uPcfvǺ?!GH!lO_wKA/;l@gg$00o%.iAiHGygFn!%V0Fe6ї+!6-Xpa3|3*oZ{.C> xҴ9Y$q7Xd~9}^؅ǣg?JXjz|1uqB$?]$[)zc#?)T$SV.ci۪j)XZQ 92 Ft4fBu`N>6/SEƊR Q.sNh8VgFMTA1V]7;ʦjUJEJo:|nѾSmupcSu?IODgJ/a˅ jGU +Sqrm([,ݍjaQbfGd2ĒJ =H@tA9"@TiY!mXgGXST<ԷMC*()is* 7Ew?83Lj\n\&_;@ [(p0*\J9zr?z' nIg#_)8؄L?Q ++D%FT ;,~=T\&\L;[(Lg?^dTY.{~v_ږ#Oe 9$[x,MOje&e/Y/3굑+F~ t-U ٔazƩ$񉪑Cmprvԧ6+&~#%' WԬ\]Sir% ]A5؞ޖ <*[fQ7aS{wN+e1c^Lc=lmX/J 7q/ ~라*!&"Wj:k0hj&(* tj!`涢*F輭>!ᖟ7hhJlWK;$fx^Vi !7JYEje=^8<,LNu]kgͼ6Jjh~t/[j;k)MS"C *_}gzT<̵%|*ә^*?ShIAaڊ]n}]ǻ`.h:lLEnqJcU#r-mjlGSF~0s^[.jف{NH^c}3 +)j8>PR'7f:>6cJxګwtv ZZȫ[ QMD9>r  7 {gUxkR\nfY W,@E ~hS H 3FRCYѳس>F#0_?+<f$^Kg!rʎ6e&XШ@ < 5MK?ebEQV4&6\lm5/e˓ͻYOe.IA6av>fEIG0*zJ}9rdpw*cq; GfL)aa-(&8_!f9{eހᨃC,k(JWX@ڥAk9i4hU.v&Rbym +; l0B +%ЦtBqqVzX'ٻS$sO5ۜxuχr0NDѦ{:ζ;5Uӝ>7Z/Dj|Zv~}?WIp„AW%!X_Q쌀"XRA!;@vu t+a"I`Ͷ0QѮd>PDrVcYUXUhҪ7XO'~Պ"CjmRsgݗ`pƱj9# i^w$P+p҆>3OG~uPu һ2Ng5{]S;Rm~v?IG:;_dWSBؑy'DdzdTA~S+7C .Fg`tSܡUĠ%1lLjqyiѶ.&dah]P`Ƀ~Y&Uuzh%Q#!X7 +-Jƿ*#R^*[=,mA,,ɩG h <0XƏ0zuV!5W5@띢,<\wV>&Q?h@UEljR;)iqmj!uXg)_]>0h},iH"b87^Aj^:*9ςٵx1cLX-\&рYaxvw"(~(_"oo 2LcC¥ pSco[j7dUQuo.Ojm^X91eJiqv޽,$YPYjA2cH! ^C>/Os8eI\#C2H]~`kR#'q?{U!~e#`0 2al0лd(APAL_n⏊n{s*T^/AP̣F6~UtpnZnܓ 7gf K>Xmbd!5<(}KD^<^#ȵcXgrF1#A[DLðcoIR+qL"mpD"Cv-ph29ܪ.$ʦ#"ϼ6(׽rm_B CZ@ r;wgwSտ!:{S6,E/) Ȳw@]6KIc_T!*$j$k +mz%D/DqZmUCηtǣ\ +s,0@P g>*>%G[vذc'a[TҢ#?mlXZu*B{-͘tː{ON]lEUdӱmutseJ㙣v>]V10z8jf!24ELV +Փz Ob#:D„DDlZr-`bZSg*!_h,*i8(`Mb۷>hJ)%oL>3L?~܁A{)X]MFA-67xEaDf(YĮ^vZA"eJkϫG(cE'DU&kjP.d+7t7c5я4Ta7>}T.)$#RWLJ~ЛFNOZ9T?]K(@=Y;ϑс{.UFrڮ¿ &$N_I(w23rd&;B?P Օ_šY󖲩q 'q]YJGlXi/8?ɴyt`[/,4·w1xRP.Y_䳎rQ3 k R^%Ts]A;P&*T>w^LRf H%}drT2#9?[/7e]^ژ=mT#>YoJCؗxBLDG(/%]ÛzAp׏e KUcQ7I  +7fy5 Lg̠a4v?we|(ӠQ 1V .SʍSOs?=R<V ãQ` *4F\Iw+v~x?A:۪n2h];"3,]`"YYKT'[4,ً0;IU2Qwcŕ!j;9?`~t +]xUg߉e>#jy)?lWU0WmRu";3 lЩ{M|۴SBx>h GU4`w w RF CO6C]4:CSaAc̹}5 (c ՍTftV +o8GPWaTm-9O-䫰|K[p.F,@* +bSXN<{UgZ|G ~_.S4&'\`{U[cBa]?JMn1=7.Ȍ˭o2&+uj>(=_+ZV8I㨫b;%|V s}i^X9ԁ؁6vm]^ V^~jg|^#UՃ1L2q4a>iH=(jcnAy g һ;f%xzu%aJ/k05fN..CMQ!I^ +MTU{C:lمCWi NP>Jc:Š6t񌺷 uZG/K#$\`N8rөP:}bQ?È߮IAhA?o8B߶mF2~_| %`2]yֻyAָzgCr:jmw=xR #J^5w=\LD7 3RZ^@ߗoO^UFgG~xx5dr*-|]R6BJ1Xƾq4˵v)ڝP%<7"Ŭ c݀/B vPp<B@|~髡yrކsnQA AZkśV^1A٫߸nA +i +=X +GD$&O%\` ,g#}׳R⠝T&?IM!֎5Jj/u,xrJCK7̧0O.kc^"؜-&%cV;9>K!I} +(/|?"YV'b ceV8~*IIeNyO~J`n(h)3A_>`aP*ZpR6dW]( 7 `J 9u."4!ߜq(:}\SBK3s ouD@Eqcy?prQHŝϵk$3FUY1-;X Rϩa/wOgH]sGy }^uGL&&܏'QaNjf9=s{(x\L 85߁ޙiѮصVRseng{M\|DU`|]އLY͎/oz'B!t{P3ZyA7b*r^Fp.ɣR(JBs'Dr͇}r5w.pՕ;wC׺wk")"̣B ᯷8A9THw`BJsAה߭F1u6%“_3ZBSDۋ˷VII¤3K,9:;iuzh*[>1xRQ367藜f8o +AONE:Bsx!ϡ5.}< +z{(rbROGӊ|I˟^C` w±ꢾˤIyT~I r% zX6タ}eۜȼdS@z>YR#P]oĀB\M'^D,1Yd6ɦHhf:T;s^;[bxO)Y1Αe ohdž^dc^jEEER2߱֫aM{,{ 'u9lqCb}O;mR9EI(1u.*hYO۸ԄکߦHȨH %.e&\b/ fAشX +"0εw"Ɣ|5s 'w[ _U.&ɑ%ۃ;||GIⓟq?2&!c[()47a{8;F|<|݅/Q[0LnE!Ajyz_]VgQd-@O׫m"f#9ZѬL,D9( +dSZWŲi >ϵ+TnԐB4U] #tp" +vwo,-2J%C='Oq/,LJkC!WGC!A!f*-T?4c0*y56e.ۈ+_ lJɤqo+i;SBɕY61뾨u!8{E-Q(^+*VkbT:aЈ!JsϚFZAtlzi4FQ8 wXF˒MLӦM7/ 4T"0(o&,@~PMg+͎ 1h(9R1TՆ JO)v:^:n@'ߠ%IkE䚅G!aK{J# ~ˁ kiTQuا??=eX ($V$$:vvl5PV9D8)ODL +0d;W}Q@s8awEbe(`OqK¯m.h*8~. 7 +"[+Nh}!m5)Q#L^Tl%Ųl\Xx(JXaAף0V0>5~D=1&ׄX)4Xe,[qr&3Vt8ITjHaHaiT^?xJ'lXXamT=5F'Z)ϛ!3fY; +VV%Sj&eSK/NN][GC|BӸI;u&w-%eOz$DrȕL<6Z^8n;ϫ0nrȾ'yIQ[%ړ=[AVufh'!m䩠t[G/@ѱ +ve=< 27yc +p_v!,OYq6 A)?Y_ ϻ~FPg:e.C;l^pj遏ZZlT{>=]Q3 PO`0!% 8/1.;cѕxI{䶼/"gb,?ܟY35J+?Thnds# k +YwX296gTr7964XI^FqIՌyE 2(>%!UNEf8F}u-DTԼs9+n(mU H/5 L>h&"iap-w4I@~bag!*]頊EeKpxN'$:)LP eb+Lː"U0k4qI*%v6='G+L?_j0Әb]5ub>ɜ~(B@3p]bJW{r0qP)P%?' 0ڼڹ'0V$]l d@&LOE_ط D&ZEH~rAQ 18 ā(q|_5NC?7p߫/<#[ 9r?AwS9?{ec9V+Ǚk";J2=6N)e۬{kK= r@F@p hlI6PXDJw_ +,\XFe%W(VPF:"”@Ŋ+$&@OgD{ONL)\`eru00y !hwGlgd̐3g!$"7fĒUGkTE&4V/%ٶ`IURvI}XQ,ٟAXnRn).ArrO_#8r &/S|QUЕ_ȐKxn6gYy@.RO{G?nTb\5*eQh)hH +d;X)25 6.RH{c8p"ZV +ͿEIlοu}LΨ_/=e]X91~kǣY|Kk7XfGt]1X,5fԠ#]d/c% O{&kٰgh/>k +>lCLA& +fǑ~Wp*m' effWOFF#e]VC +?w*UX;|[cÇ'CTA[*Jx3]d5 @211 ;j16["˨t@"O|JT>%PK (1zw( +qr93c\9SY#ZpvWʚcT&w ֬-4e,4IÍ&rz߫A|3`-luM{_>jhR"`?5Nkho]tmٹ?Ew`̎OlƠ۵7J]Mu^ojW_n0Qg̭8j- ~@ 9dHuS4A60ERlިX]^XL˨m&t*ǿAuPjKj#~mc2Uy0\0{-ۖ8?ː_=?5'6(BW$HoZ pkT]t5Tb f'Dl `xG"]H;K +N6^wf!ȯnV$yc7H1d7pka`N1L@~]VR.3 o5.-M2Y&cqgM$ 3vZBI\pijO O3!-x;j͐&s;.--QgܝSMV]m1HC Ԓ֢%[)ao!oM7~ŷ/ᙜMQ+ʩi㝳埁35k +caK{}9 cΩ 1t/I\T$&Vzd01LcC=T׃qޖ/6K' BR!9=Yu~(:{߁J'="F4!YŐHbN J!LRm7ǂWhvm}IlSj8tF0{KvN q>NY? !hЛ`; ow ͕-6N )g9D ϖu;Xn>ӘĶouzXDi8i)iY(S-oX%t{USm\MǗ˃{*)mgl=U6!Ug؜~ "<$_g2Sr-'{#; +>e2!#C2v9V&wƇP7k178L\`TM)=j]51":*fwzDZ) RzSK5 +jK|.>Q +6FGinxr'+®if{䎉.bWB:AmlWF#߷;:L"c[6CHݚ*ft@Q C(۳\QZ|olk≄YQ%nWUIox\d$#݂ӧ^IpD\[@ jbDpf{k+>t93Z%C6:agͽK)pbLxb $r0sa?6>"ȝ}MM˔w_:bߦzVQlѪ<ޏ5~[D,5lL BBupzQ[Gف3jr!$GZ6&U +~| G`h ˡj2{Ҙm{tZɴbG:GJBt8L*xMW)+R +"Ioǂr^{_(W"2L!Y"n_XZaS oT۱8 +yooxW +z 0ǟ+qAX>$=$m;\Xݶ a{ ss]4Yk92kA!vbyPQ63&  *p'ª`"7ts##q .Oh䦩|sZ?@H~926m|IH32)O7%X +'i/|hy-XÛ5h YBħZ|:>"eniAT1hՓC[ SEy?a%2=} +CX~>틊+%&vHpD@a1b#2z;H<?[Oy'z- 1nb;V,jjo'D;o.8шl/fTCf\q$'dST[[ݖiɟ[u:׫BtlfCuJТ0BGXs6KZ3HSO'+$f|{1miL=+@v(+n]Q pWT?{uY^jHp O]0o谕k:81۾h(% bhI;ʜhŀ@T!xl`2E]aޡ0A2%@rH&{D:С.MP4MOήJ ZkFevoJm(aZ*;) WdHP4q:#YiQ Dz~ +6dmt .÷_ 'tj= +`X)VU&yK[k/` { \uԋGwdEy["p_vz^?jͧ'EX{&`TvED)9XWZUy~GS%*r1D ~FGJ'JLk$КeB2V>B UQgߛse^A.2fzB`%W9Av4GY5"b;D5Ӄ$´2HxxS ؍u{T8Ћ.4Dn|aN j?'?ę g4=P4EW9l¨ѫA1oᗅц .!D'k9eˊ!Q<'fvxn1XB@ȼ&ύ枃9}'28Φ Ton;bhI>P4 3vKM.cXy{K":I10V68|mLH~|L+u#XFi` ^>{A{S eVǟXJK^[W:Mw:_XT{lF7e~@11YZsL.! endstream endobj 3434 0 obj <> endobj 3435 0 obj <> endobj 3436 0 obj <> endobj 3437 0 obj <> endobj 3426 0 obj <>stream +HWnG}Wfa3 RX /bE$0>gg(C2@:}Tיr%NɊ nlj;{-/.3St,>dh70LT]$J;ɜ,d)X咛JfF3"7/F3i'Js& Q27v>t|[^-cq,uXX4p 2cJb;ayht<ԫW\߼ywyQQKȀZz92Wb.vÇұL\>bQ#Q +NedT +u\r~HDE +P mja} ( Iȕymyor[WN8RW)^ب@3(ݳS0B&2ۧw￑70r*Q"rbK0C=z5^&?dcTɬ÷K1u!p. Ɏ H}8\ԣJ\E{hnf!iY0T&wAz{z.~wd HiIZVREw!nBW87p!JZ92zɊUV Rb jRN1/>vQ*#>U9 P@(;}*%5sټ^Tg򥗌V#yܟ;RȬ5<o+E +q[}`\9SGI w5jdȦz#l⃒Cx:<$ƐM]wd>u 1%zKĉkU0ٯ^^ӆJ+gi\gK uaL* [1q髂&sZu'AWίc| 1&@IΑ_ER`w+3CݠV%H;)F=Ynusw?~H"gBZ5s20ӊyمOR8TYۇ~zfiʀOCdv2_gy4.W8&N>e\N죅6fjrq0`DaA4Һ7Z&% bq <=WbG\¥IMVa3!݂^ur8zXnW"<PcĦmsZ6o Y\7=r|k5"s##tW t}}E +Sq?KfU?QiH̆ +;:Md# 26RR<|&P+ qWVq3լ%e N5)l*ct:M;X襠JuyXD?q|{!뼮m_gHT3PeЮ/Vؑ _]zfW8:c:`,m%X$P# ޮZ`4JJd}=>Er*KͰ&̑}j.C~7* +S +5DD]sc) 1T4<>24sI `|>&lE=$wwϧӈ:gJ,3>"2c +0İ',?QG2ՆCe?`eMF]G˵3aQFxQվ~|8I0X,?>x` OG`ac[qZ},~q",H[bxUJ}:(7B +h&r+z#01/2u& +=\w"r2 >>stream +0 D@&4w Df,)iS8ܘ.fwe ڒ;]}ғnA]4giV?֥ݟL@|o_Ʉg>&Y!Ʈb? vswpƯFkʺ (3+OTN|ÖDϣFSGqDSL03QtuNgS,)[U|);%uD +a3o_00+ݤħ,Tuj2X1ṡm00\1ٻ*p )0Fcz߈g;/[I!v)/NRzPLb>G Z{M6qP./fUzuߨC0R/S!%4un񰊃/+HܪAQʎތSʙ{eƱb&8O%ԐK|q ~]$ޛqf<4L-ý.~Jklf+|].|?z X8ҖkL>$U' +aZդ+x4}aW2 ]9W (Ecmܕҵ,HP#)8F6#g7TARk!9A_3}=H+[w>h%NKA(A^jq> [/(&Ql!~io?FF.U-)3A^KF6>#Φ*/M4Mcv'{ҨISڤN;`jڇ/Y9}b}ǎeR +g-l9?I':_U'WIi`b1쬮~9*KV7Ud3>nbGGk1-sl44k5S=bk2so,iBs'DBܬ:aM7M4x뺚ۑ!pl{]0yy_.EZwKe;$יsVa.5ދ;Ԁ,iٮi/ZV]|<.!Vm h_|Rp! 3hEt[:w5|kYVK'[e(Ӧ/x.(Ձ<ǭA.C !5MC: . ąwv*2e9af;[s=&ڊP\]H+O ++u?P$$ +i*w"$bׂ/;UBQ܌: eYeUa!bY~ZbBмꮉ:}f:+\9|>,D s9m mSt'B=Ǩ1Gn0-Hnh^3q 8ò 2auBm-5JIjuƎ}έ́ 0W7_{smXjk-)MnS=vX$U0rU<,S[*<` kLr$mżYIq]lR]b/u{'w(ћĿה:.hu}hnjNū;\iI,]+cPqb(e{6EX5#Hf|6/SlNj+8e*wįyj8n 橏U8\(5I6bQ,gp&toR ,Gv3dMjT':qg/J4UE(7/&"_7b2)^Fpr%e -aJw =Zli" C.y1' @mâ kO96-lStʣЩq '$rQ:u3_X'R3Eã١mw 2MET;L+/^mg$@TJBV2Ըh4-sL{Ånt%Q:jn_%函O" 3"> +7/FdF =z)*|~ERգ9JRE}*VaټNv \瞁ys&-~*N[]V5Ž_R)sCO5y]4pT,"a̩rjUFwu¿v q +}` ƱA Q~n}/E寤p-L{0L8M{0ٮݶpNES,8Bf}U"(bhh7Xad9Q$!tat۽M? kin++c0kiQ WFK,=g&BDam@a +fT{R2T_ 8M3̉54"H5` p6l1̱W^ )Afw8K#L:a*\Y|jCv +V1 +*n*T1rߝW%橒(;]skd=`s!~}~XBmyJrohug!r1Ξ3̋)}ByIQAtoǰ掍 lkDQɷć,~7#I|>+дtHSo2[dJ(ʉ.Iy W#hG +4v[V{"u{Kg?gY;n+-K!9'Ym_qyoK]2tRi!?e1„FLIG iRekPJ@$9c, Ng %qR C~BH_i^&q@>HRYiRu8Y3H?O8k\8F@؅S +Y wGcaqil^)FNŽ9HEЀf=S,ބ jjo s @8n6n|."9:)̀IȾjLN7i]z^ƺpiP!rUtXR +F&(_]$7oGGcPcTUv,Mf:[IoA +Rq {?ݣ>8㭻;'.uk:r,Fz\asdV:<)ZFb/%9TH zHTa>iUpzo.~O-G]]E ȓ +7wS$Kϕ$qUs4'5~٨$`YnT?RUN8ð|ml¾̕J2r9^>[‘ a$mi:{tGl\b@V| YnIU2LG6:1} ?kaIUF3d}GHzL݀Jӕ^جGHYjtk|3aG$eŎ=..e7*ߎd^Ġ*}cK=^C8TA@E57Q6%^p"ﭩwe^THD%9Yt `~;eyĠvs; jĬ# )YQs X=Cq:ߛc +#o[cMq!b/ѐjtbI] +i"DGNd&@*K0[|R#SҚ"\ރmѭG\tOGQsl Ez{8 +aD{cm=A*oC`i@}3% '1{=V/o@<Wb'<=LʥX=6u@UJvNnyLW a9 + u"oO֛\mۇ$% +WzUni! 5{=7{P6UB횔vԵuF , a2}$6Y;|*CfwGB]|`DR(f}# n u̝ UE+Y?gE1"ZK)*5rxޑ`pQF]ǤI}KcкD~o)Sb/2MUuD/wyqԘtvC8aKt:LDQ4ʮ`&e +=y~DxHZ:RFZA?!eaК~A75/釤]2<iVW,ee ǻB"ca<#X3xR-jL yÂS g +Il:hWI=s[ $Bry˚j"h?de{$- {BBcrđ4f +Ã@ƴʿE+NScI{[v@K,GEZ:RCkG-Ɛ%*~jaWYĴp>=f9h$%A.3܅Śi8SC _}UH*]RB4=@F$tL@1K3 y]{[4߰u蔍[h+w|⫍ƜqGPί%M״XN}e6*NTVI(ZWJzj]IBf3F&L˓%@)OHGm)%j,F~R\ ` JQQvOK[ϕqKtH> ͨޅav@&@/-AC ;~'-rdŧEgeUUXƫ6];nuGܑ~\zK5'ՂR` 7@)LԀHT|MH@aL`D=a iT~sp7 +dzPz:Q&?.58](^k}{ P!(Srb;hi!neϕ7aPF7+"'lͽ8>Me-)E +jY$L ~m,[ 3{_qİ;䂢2ܢx>$*Hˠ-PrCNu]m :'nNϲ,K +vh/~W'HirCPp.y;>kݾL9`jҺm|/٪/e6UMq~=kw{6<5"b:eB )[ #X/dbSIJPhX;\L[El%O4@xX*T V T_ib==Ae{߿as㑦,ଲKzjCުm*4k +\u7k¯Bi\%+uK|]p!*e$,ܫd\V?m'}22wDLUjӎ͠xBYh^U}{=/fw?:B$ϭRY ~# cҖL8Nv=H /ֺٗTMؕ&~SAox̯m|>NK iezTT.vkc8.T?A-.V}·nVA [@ @Hp t{2kt}M?->FDb]qYE#ogxau'Z@I\~\?_/#o!ׄT]ln7i:3  n36NQ`-b2qTOv(I:檩c-;!7M񷬛t@̑bw]WR;̡[qNa,Ԙ7B/Jn-&cKI?xx`\D}k`WQv8T yT5ƂvtTqq \lZJHeT>wPt~ds+5% X;h1H q^4If.phDKk7I#aMio#ԼKp8bY!xl#ILs[xF]39L~|'ޢ9۟(ab"Ld +}&)]12]#Kq8sN*/C|ڽteWK#+ -e1)#%ȻW^jx:cY,o#ȡ=E14/V-&uq11W4p49p߁ůϺ8崙b#V1u#K$. cSioE<_D!rjYI|3y))eLoݍB8< 3J=l75t;?D58knDkkT4ȏDumzfHBRA)]h?lhxFFoKZκdxܪSQl /2g k!i[/$":j,h.kHPȗ%*g/>͒tQ8RgXN/0[O'i.M'r6NIYub9ָ.ۥPحgQO%.c??]xRCc]cNH$S]Ë4V`M,c1? + +E\67P%Oa 3:`v)يPOSI"a>Z@űxm֞!FJ9VͿV B*y׹EwWף-ȲD͂o.xS{&Bp3skik{lT-S&K'|x߉I&mtj1~{iAl#i,W$pLRB(a8g^j&;2sid"p(*:D2H:Y:tT{zڀ}s0G_: 6ĕ&·uC|:u=|)X8@؈@+ל|GTh⠲muM٤֊/(Ɍz9kTZ:l1+Nwtl~/E0!C^o ;MA"R3 ΂ED5@)]Z"FuJ ĭ&ͬ r3/!\R3 ΈC f-V{Y@PÂTu>\vs.\pL2Qt:c6[M7$ l! 2K{ю]/7E2*[F->Emu0\.+̧<3p;gb9m[Olʇ"mژ?'Y-{-8̊+ fV>^V+3#}+gWg=A4r%B+y/NmS>JQrӝ#r{V'Lչ 7a0?y ۣW_׆wVbjLہP*z5mՇcM^SfG1BL' ׊ <0ŅɆc ʪQJRRf?I3+.]ps:(Jai\'11%ICz=XfS?[RD~Z0hVtOīB31fqV x/!`>\M26)c'm/'V$q^RdK* +_Ի!FT:(~ jZT0އs:rf׭,2, /#D=7 #bdlo:vF/5NuXy%a3?kdSbE&y!AhA-]nZap:9Hjeu0Pg錼"Aa?A*uo ]sD9S']*oȮ-;B7W'c}ɻ(E7g Id3Mj|QO"dfGr[!.M&^N'h:XCI 8gkd-+uǺiA'{1&"e! ZBJL`wq|<2d69˪*.(AT6+!6΢ܨqd* VʓfCB$xcŶOPMCq޶1{F Dڠ wh? endstream endobj 3427 0 obj <> endobj 3428 0 obj <> endobj 3429 0 obj <> endobj 3430 0 obj <> endobj 3431 0 obj <> endobj 3419 0 obj <>stream +HWmOH>NU) DdeO:ds;3&nwm`@UWWWW=S?f0B4%^nfo68if_g?fODgXhTP~{.%Uηfƌ.׳op )1p槄OM%J +DI裗}/fo +.'O/maJ齹qԥo/վi-qX '/fhA`:OϝB}1gIQ1i]$3%e3bL ~,mPUd_.|n}yC G.K96%w}\f Lzgtne!@;Db'j% "&hޣ )/M&YA%⻿7۾j(v&0vje)vpJ{ ']Vힿ-8 .i_bNVr\ɤsFJ<qRee2+a >WG }u 䢩ei|6~S݇J*˒%8򢮷I: rܮMgrT)e.αjNJa _wۮ6UaZH*b:EHt%z`.nVfEAmliMGM,&&fF dF(|UB#fVR5߷7H ,&{ c>b=@+yaQ$;t<(:a1eqoz8(Xi aq?_޵nN2q Rwwֲ| cl\H?meFihdHZS)E^(4j.vCf%\1jŪxЁKtśSG:7K XQ2]T[WkP_iw8[ X0_y +(OJ`ZJm)*Ao!.,ǎ?8$)DR`{?Ƌb%@][Of>z+`qA&aEz[pG3m;p72Dj[w +}ʣ!^!F0r%V:r?n-5>Z]OrYǥ:zvr=rP1 hOCb/37}޼tӁ[K͍Vtn'4.898J( u[Ǻnt`]C8P8a[;G!ðc! T>2<$df=NLKh6җF6.bd z@T'c6BM#I58P)"j Ӹ(a#4wd?bǞ6Ud\1eg`#jL1\* 0YoȾtq0E Y*G .MЙ]` +`ym_ '6Ͳ4x 0:l6WWq`*!UW$bӋus +&1H ׫mdV MLQT,%m1#DtNutDV8#}e~߇;c1+G\ک^z@^,mb>yY G&s[ 6En40p[v}Bos+1o8˳̹p| 9ac8y@ԫ: koWOB@S}v:Otq~ +yUKҠN; /5Xh4-9HJ icC&!  rw-lOhz,Ij(4!3ٓɆY덟/J!揻3L5ëpN;Thv':UE'K~-1 9 p2WGXDPVF*U4󼿩XYM +g>kQgV=$D#z?Ֆ0bةbRﲀ5Wk.6pOTX5P/D8" ?>stream +0 Z@&S Z8WvxRB'޴l# qndp~[t7b=K +@fЈ6̉``4I + ?tcْJC:tDn<WoOΏ1 +l1fFݣ r9b`Y~.54۱x)M~(ؿ*5t`^wc(r~BoSXYX@ɷzzOpLeFo6cD}B~qZ%c:J .=A?S륜&3G}TJ+ C.6qm}rF'mʣ":-b }`uqNfcNы; L]%#~1E00kIhѐ-cި+ƳK46#-9tV!NYw wG9@i(AVc>>YM&^I߳T|YNspy1UrQ,z62>^#@E|+B7WlP2mv2$g{͡ }6՘/JEN`."G%#Nser_4?x6= 8qޡjnJ&MߠPf@f_&mX([&s5A&fʾ^C&U$j=اGI{,L@V;Y$UK>Ui\ގ`|YB)cw@2miU͠NՂnvABum޶~#XuEQ-Wp2mxC#4]UD gr{& +cj^%"1s5/F1o %Y!Wqע?]-0}ogkVUѴ* m&G5|Vޥϯ TϩQQ+L؁UOs'TbV@ x8nh]jaY<(⛡CL |0}{NOt[āgB +0T94iHͩc6xì,]s!M€vBGa>e8HTz7^;1 P n!օ3F'?ð@I}V\6>Py|F}&kq8̡_]Ԫ(˸Wq~<.25]3mv b|z~<Թ2{innعʋ;I}|4|]-IpkƁSRRL07QJ,橃ie&.r/:>^ʤHa'[qNv8m) 7:?iߣt+]POE㩤*}RRp_/\fT@cU3>q=7rwm~k ? |۔.DB0ǿt }Q:!h-K9H˴ʷ/(^'bdD+?:T@htxاc=Q/YKd㬽PEv?jiTď;}bۻTVuu[L67Q1łh^JRԑzrgr7Qiw;3ka'km&/ +Fj,n:O1!uA؀nSWʅ'c +.-M*/3ws_[nu]eHg7:A!@SzpCH8E]))f88*BRY~qư6e܋\=|::HCw\܇3zfT$GVLgr?dÚ=*6W"|*e[1Ve1]Q}ݾYWCVWQyĶ])eM*IApfx(o6b*`='?)'STR7I֊f)T33!*E5X1D/-įk~R 61󟵦z!Cp b1Y}('  y%kլ6e4l[а!K!"0&1]Uwh]pG5iw񚨂j2pN{TtV]ՊվKkZاg5mV6}v~=~L7]lCII9DVg;KMAs"5VƇ6$Ai%C2=Ι4^"+]{qʉt1`Z@ <>4TzLj  9Vli. I|!WO9Fz.'dM +{6<{eٹFޡaS^t;O5m}mm?T +]"e +T]E*ޜFUc@bv6YҾ7r䠓M^-^}6S3UY'udq`U[ew::i[ǡH\Q"wq{Lǘ&P]D?Oþ@0LUf%"=&+StnEx]zwzqi_OV2k뮛t`sK}7>``=M &ֳD<{^0o~ + Me}[%p7ZhgX=D +yijl)2/d7WW'ϢsȆr6|:#X:(OdE'H,x5vI(B qӍa?/SK +u{Ki~AӾ$,[_Kb# +̡ yQ'TAT RacPF-1IU-\Mq%d B*5uؘkO=Ww0ァ-l +,jË넨 LwHLڃ":<#9vyN&"~y}˸B1OM͂ *̆+j$?I1sMۥփ])֬fq( -z2h=f*Xkc,xUbxsk whr-a2ٱP/xj +S"p.,AG}͵T9N>)p"jr Ne >guDOܤAU(L_F+X!Q m>_ qb:QDIZ90Mkdbm_! ,8%:H3ZO,c,DܹtBRj-1:G|y,Ͽ -++9&/q鮀!:Lt SVxv?.\8K絅+`iVʏK$=uטOhRn5z $ǧ]ZٴSI.*N} .W\* 8OJ;jڪ4^ȅDO) Z"d 0hdT 5ne17:S 7ɑwZ 2&t_ pߐPkTFN$ Z7φD%f PuA#mOmr_w\!ݼW:>xQ 9ǫ.E*)Qv݁QΙ \}utILbQ_3yxVFl.}ɫb9kZSrSxe\EaX4e)gG%X8#)d,(q2)y!`oq +'Omf#QKZa +HbjPB kY{>,]"jlvr^IoyËA=;H4G2 l 9DQwrkB:G螪I8UX?Wu G] ^W'bJ K?;?X<aQ39<0gXI N #C(;d? +]ªtCFpJ3Zһn\ѱj/ctb(QpT%>BlG8}sA '1XASGQP$v[qXVwЅ9VF\{gTL0%ޅ,@*BH`̓Hآ +vd TȨ.~u|DiܛR"-Z,^X$8+4|!UhqVղb8kx9+͢a91 qzi6ď iA4( Ymsb@9jý߃Zwto7RU/Ig+Qrn}s^e8fBAr6>\{̄=-#]@}uTZ +j0ԘQ̈Ll B"x9ʒzsje454C{[Mԕɠ޽q|S-H((V2G&LJ1ܠ:o.v;vG5-9'vґtU` ?.%1՛=%QBrWpޝa,MGlyX`Ex{X(X@|y,m+NJlFZYrw3)jwdgG \IG XAWR2TnbRΓKN8v7)h+$=”?(lv5ag0Fu=ZĄI,e 4X_ d5S '@2ۯβ`EߍLaQSf1SRh|HKƍ+׭w7rHx,nnG.{TfCRqpI%oHU)LMH;}/؆;F58Jj6*r]g VpIpOM-^sVuK൏Μ:9Q-ZÂ*H@r,[ͼ [f崠K0_O+ +> a$BqWWzh`&˾NvH:5ǟd쁈q_Hc=3G튝@QM*"lJ~(>^$SfԔn.oÚ@tw;L}.k:cYfcq26.Jaf*ԓ^bw,j'_ [5xkn9nwGz w~rN{xSNe$jqom,SGi}LR~?xŇ_0Wsrj{abUeGt ))r9n﩯B+ENc9ZRbK5R_l3R x +["95J$0 s=1J&k :GJ 5["28*.7$SZ"!)܆x׫Ooο<3W~"^v1a'؍yAA it XqPB +`FN`$T*K+ǚcqxYn tk֝A,N)[XGcS[qsO[wI {Zھ.b{r7l:<$Hn|3@s1&r!{tIMԈҒCuvҿ>m Kk5by9oBD p{tEh@}5~G'^.G"";wuCz\XOwE.G7'(7HLܦļ:@y3G3dߋ+'x"n=Sn 'ub=;WhrKԃ+:4ƾ_?ys/A)m޸YcBWG 4oVQ0k} хp%ZhK(R瓥T/2ͥ;۸aI<9 WiّX/z7XkIQCQB~8$gSw@9 ' RMp@WuzВu&a7dXGOunˊjq!Pv O[w)AEc~ #Dd9c*oZg>>Q ms OѕPq-S&ZU1 ~sпP$8E_vj !1+ĺ/BmjaՍSW19%.WX"+F($6^n07U߯u)BYC[sJGL4Å}"eɾc6bM/XkܠzS$i$ujBύکQ"暛hH+,V˷z{xRMT͇F-ӟrnc#l]"bh_!0b.:[bmk.1;_X̲Xƴ _DnѷtH\1yO@PMW)(JïXtJy(슊7M\̠/3tEvxޣZTSѾb F^vvxI(4f,s$f\ V.Jfg ]q;/^`HP#`ד`;3&F7)Ej``wh$升/CYD/(Qc2'UmN}z׿q߄LHʼGZuŴfgTw6 `+J~B8u#X9(czcO9+ ;XwA _fΛV.@j6BG.+lq]1 +h ӱ\Mu7!jnp#j^jbxy7Z֤@[`4:MzlS~4̞'CߺB9z%eTQc>x*?V}Vz,gBb쮣}Կ-' Cx XEւ#S[0eqǭ>9O\cs8H:*H` ,D%0~1%Es]l?xD.Z "\8=#ݮ0"vM@ % W.5oy)=:k ͼOaW K']]ɫ! w?-绾5Inr3(u(9{ aZPNA G×0D%EL!٘"TҲK އgEG :ɵcYr=wXMI s6 t0B80s빥132e*镎wIsQ>&mDJV@=-8)wVrwʤ՗]O!hXy۽&Dv.~ۘbE6X6%Af\X]cuY2n[]xKʵIGo2CX~d̈<)ng{#hy_8Z)IsZJi%Ab>%Ya)DsQNb D~&p&f.8:0jR9+ EYmj.%fo?ko} Cp=+mA~{) y3+\AODCʒ5O8G02֔ja"cL׭8@c *`I)ITb~7U<ӠaHe/_mncsJ'դelsS08DT@p;[ڗ?,;̊V)J4PTj5h2trs.&{~c&xDN)rj6BD~yNA=P/} uZ; /wYUS%{)[fq@ue ı}/ݼ:"K2U*"ǟ5Mr|)9dR+_y3ujA}UX׎(IvRsTZ{Mi:RX'.]m +(5geH}HGa +| |,Р܋;Ic,,*g=zC ˡƛ#, +w`7N;bW䌫?DR_lǤ3-jVq.OzY0TBv2fwwlѵ y%M@s"C5y4رLgX(Acȹ7IhbphXI$qmM r M?Oq942"R^jT'&q[r:'\& 貴l_*??/&lc`3lHZz3/ȬT(Zgi W>>t|(K9Op݇'yMl~_?G`~{)4B͌~CPl4!)pmra,g*(WT Yo7VT؟;;/q}&YUȩw2r.CC9Xފ*A+ +Ilk7j7ݭLV`pd=4 + mum~?[)qne8Z9iQ q{B#E*FMHAȍu0}i+C~K^2qF׳|8[`7º&'u7psGܹL=WK0inYvbuk{.%~$t +y lKP"mHS[?85Q5ӡ@u}|Q=PӺt uL AӴ+ 55(SO$I'W |8tg1 %[ SjJiG8/(U_'r1@V?kl CJvjd?}g/#ׄA!A/%̈fq^ +;9 +86Fg/Y,zegNMrpgH\@ۿmI5I1>:Ԏ/BrhL;?ӝj8DG??8Xdt!缲=#䄉Xj3ݨg׾c, f oC>`H1C#($#kUgv58R\R>kUU{[̕^_&ߧq{0T *!-+Aq̿9!W5+7 @Ht[#eMcz%@R˲,}գ*a56w*Ų\. vN K5*ʴ\qs?)xFYXbl˘#'}Es/x;( ] WK)$C O͈Cqߐ\7CG"؎T- ƪI`XQrE5.H u\Ay:;f!.W@]͋TRn\a3]ncyՠzG%^+F3zExޜR$bDdDB9n8q%i,yE /~:_v޷{MiWqZ*n}\2$CGԗ)ORLsD|QWG)Qj҂ʫɒDSmq?YZyV]R&'*̜[̣T !2!O)l>[)$ݧSĭdeۮZMnFO&&=y]u]؁PլtBe=-b[vА&$W[=Bauh"^^0oF)Qf %9Ҫi$Zlbe@&h&ش?%uiy 3͠4ڳ;)qo,}GR Tu֠m)w Oo,~,\E2n3l.-{XX# Bۘ"nhI7l| ]fL"~5tzdL$hˮR9cSs*GN;m?<@.?YaTe[ `{:U5PE_;Φkf'>%S~ J+IBĈK(~Ʒ~Ŀݿ1 o0ܔM5x'w,)[keL1FWdgD~sx!-@T " .c] O` +Zu}k"hU!3%LTؚGEcSx޴u;At>EApykj4'Bg.[=V;C J=j@jOHߨ~/ +78(D<]S:hRA1o[V.w?f,f Bx,S;ݩj)U7o$9xeӓ\5Ą=VZMβBgW"P]x]5S<_yzuްKBjQ~ŏN ?C`ff֟ ]bc<]U*Xhş˵#AT^" j<]H$Es~:k?79cp3ZHwOWA$tGxj +ӪGv$xǤLκM:]ɏ#L-v8B.ʂߜK2U]uA +4z0ET 2m[VSyF& nh뤋 emp:‹c~j3s 熔O#:Yt <*f O5B>":8k켂CPAJRjzL<"H2Y&d $7b;b(C57/+[2Smr "k~ Wd-@  )5'\햏<["lH1o*Q_]1ch'~UDrR8=zaUIQ; i`׶L1/ 5AgwRL0c17GXEɝ@5.^zp ݫwE]lN&ʨ|B4De?O$J5/Bq`{ 4b,)y*FCk=|S +7r"G0fm$ڰQs',р@^>J0.x \)A̟H~R$o _ ٱ.trץto+ri,2گt~㙐N'|<\ØB7tè'G7_:#񠅠m<T$ns„XĖ =HUkaSMͭJG~8et1li ~YU + ꞍMAg/ T雚 Jr y[4eos:toA4p)$/-eɌȩ dus2Bgv(ſd._J5 x$u߱I |\C>JrPͩ +=!5!#6R4Zd?Tإ;7WKoS05y ӢՃj\rK2g{o X7'W1Ru3I pTdZ)*| 2 sOB%5Wpj`"1yT9zM 0a0Px dj9[=?W7܂$tBl\LOQc}0m'֓=~y0Va NTe@Ȧz8]eLklנuH{p\? n%j99[ʼMKlЃ]ҫ`Bh fy@mFV._(r< +a܆Su-sC`?a .(ѬN79X +xi UäNlF H9?(»$ekֽ)V!X8bNL'i"H=o\ۇ0 [8Pf2Ԡsn-^91RΈCISqֵtWQ8&ƶR?X鞈6G%%% zm+μ 4Bzt Mmh e݅>µݠi<"LN, ݝKbDB?&r-rUx¢h\yCEN fC:rm[ ^)ڨm !Mdu=#L&b5 y<^ ShﱿKp/5fvByCӷ9tVz8@Q0T*׍}يMA6 xEQ!ur%a0mO)a +N\SNCF ߝl;-㌵:Nu t0EZʞbVYϴ8Wӈ(&iUURFiЫ !L9k.,cr A H5|şg.+։y+7EJJb`Q=7;+gXmJp_Jv*捤KqBXlLm_U20Dp`5 !C-XSf3Vq{",2cW?2e-|Z%eV1>So7!#cçƎ:FZ=Sچ& XՑNg%KСWWyznKޜo |s[upVP Fv)UYڵVW@1ҹԏRaM/kwJHBuaf`pڂZ ecDS)iDDUA]XuYt`HE˛G/$>6w)-dv'JI X:u/Ui74w*Pw A*5භK|2_ $k:U:ܥYSz $F-5?亵%BUB0+߾OPΌ-+';*7F9^p&>t&q2`pʃ%;/,$!@bTLc{zwaxI|1e +X`w J|ċ0 BbAk juguf{:.*If}aZ8a]q_0` "+Y0^ O+']$f͛I|gt ^FXP?/cNU{ LjD{YW)>z"Dl5:<1iۆGPF5|D/\Nꖌw'dFAM"WBX3@WU.Z: x,o«c"N~!c'L6#qzk#WEe[d;`4G#F9K$8A65;]% 4i劖<>Иl| yxrج<ֶ&*'G]$@^lFCy"LÚvЃìs2_ +%l.Sa*tBN^Qu&Bmw_ʗ+ n84>awAR._aBoH6 RYx&hpJª= `(A~9vJ~]o_n|KAxqX^JUAٱ5%[_Ltz#_ǤKx/E" NvP^$? CS1[xm[\{gJ*-Ǚc/5rTGUbܣ89j©YGJZI I ?Q^̈́㾿>7Rੜ4?$Wu%"`ف^̉u"9ەғ4K4aY$&MVo3ʸ|eӾ(K5:T@#!PӛŞ .%YfdSB9Ueg)$&^2RB"!QCuJ޽w|WGa,8fQUg0J7Śy>x0XN*b#RAŏQTk"Jٜ-OSQcaE0f_נKqH>FbIrOނԗ\#ՔMѭTҥqFD* #kfXTu5āt7Z#s +%YI~ǝsl>467~ՊTA bLv$7Ҧb72v?!$/o0*'T͓F:_&&H~ԂhA. N}|^F%m y4٩~(-g5JL5)c%ĵ .ha\C!g+|<V]^Qɬƨ[޻'-@?(J{'Q08ӻ"N`HEVy4 $-)1>Tse^J/ڎa4N:=+eQa$yxeQ ?UJ}8e MOV3@q+:1eva*bV~oiYON)`kN d_N9G}R?x#9U%n9"&3݃T霘2םؤ{ISxJ;<@h> :d+b4uC5dD|D!{aMrl7_.~)(gyZA_OSI}DUOޤj'ُ9Q;_O#KiY=$BKR?V^khy5rvtDݵ`U=q#Nn:% >(L "|=Z<%sy&dWR o'5 +S_3iEa&@=*M)щ TnXSɆDh%=ߚV5\/%ˁ"X%Zͺ +{j\氝SJ(v6Ǐ8P!O4[3nDћR[%pT*F,NJa&Br}aǿ!\/;RU\ endstream endobj 3420 0 obj <> endobj 3421 0 obj <> endobj 3422 0 obj <> endobj 3423 0 obj <> endobj 3424 0 obj <> endobj 3413 0 obj <>stream +HWMs6WV`o$1;:Vw:D}8 Vmٓp}D8G%gaG4϶-#y69?|tvQe#@ńQDfD"J8j QJv2-99\}8/ \S@`.P&Q5 HG-QLR UP_ gO%3ST}hbƶ>Cz:"rǁlV<<a ,#UU>X"}DLxvCy/0m}UΊ +8md +6TEF0jhǒi(+bnM@Rmw +U +p}w1&^$ZRx\(Ѹ:RSW8~v|eBK '5iPDsb@M)K +e}:N4)~WHua(EABz-F 6*,J˱*At0w?i ,TL@5 +F91u2Ҁd4 uÊ.f,[cZ&5E J5c|+ƗU +u]Zt}f2NAlZf4yY<5AA +xZf+jf ΢+_X$ J +AVYZן?0Vh>Y"“gyQL+uP #opD94k+YƠpHQo"-Mƛ[{ȹ~c qY<S FSEٔL%̩+No7ūm4Ql²ʷQg'Q'f!0vK:ZF+rP촑(|+ZZVAMfƚѵx:kjY!yX1@eTxjsAAy0/eDȉ@Ny;Ft󁒽Qޙ%Hc߄Our 9Qvw@[K^G^q7&*:g0{5jBʉ2QS9*(4B(տӞg@hr{qpKk/%kC%}xa1?\^_ݾ>stream +0 M@&  M;rE@8d|bQTė+v CYZcuQ kBϽ:<`l*FZ޷&3]S=m,HjGZc +(p=nZ0+ vK&Ps҆;@D&)M>|f6z 7zjELI|o2EA2fjB5f˭]UhPSk&NIf,|3'[#IsWԆaĦa}Wťu"ċ}zj>B5p;ij8'ɔ+?/7,r|pGȏ]'G-̈́^Mp܋܊ +ɤ BZ/2~kmCnPߚ=S;SJ3APb=u*\_HSЋ=}"|5jԸ',*mپl GcI{z@>xRa4mq;T$$`db,DS hq߮$LR&7^@Ήjh{Y^T!S|p&? M'vBUNDZ䄽'U+O.[< oK H48nO:|D);GJQ/#X55Njx^?gC|Y{=_ .ᬔUj$jԞrXgWC¯*κ*88t 8ű7sKᛂasȶ$r5-pGךsbSid'DcGsR| Ua `[~]~&LBf(ϳw O`}mڝ;‚c8}: S4&3 .TRS_$ Ku.Q8%m8S +se⍕~چ"``{t6ܺW#$ +,Dc :O["j/< @фD%qclz5ԪF}8rHY' hd,mqpηk'ÃD (MK4Y;3ap11;_ã)"ԶQ±Gʰ~;B:4J=75Hw("jT#14\Y4`>rPdM6>yY X.ǍA/7Mih|ކ?*6ړPuOozX 妮(du^fhns}.zj9W&ZtS]Q O(V~s/ɛLMp*Qrud +YN::39! mqIdo_ܙtyǘ\}w#D HAgYCw]XxϹR/| (p}3\|ݦpr&b N`h9Ng=&V0mt +/C`h f2vljHN#KDªG(a|l5yJ,A=8ԿZ/ =`L-710C-6^c\ۯRԈxJ)hgHz) E1MsDi/]՛E^3 u WѤ_>eO#&|c  $f }F{tJ9ir{0nu,P02,u}N\#ϵ+ ,e-)߷&jwka ԰paY|yH(9qIjI-wޚ#d.u$O9׌FѲw^vQs-J31C_۞PH&iqIl X!%Q *8Uk]3FH9MS(ȭ(Lsy[RA皵*ɾ=yI1Ƨ] \,-CQj5 A(4yj6U(s(Q}5a+iv{xH;ʻQ<MO)҂_/EhFȳRJ SE r3=wFyy#l3K/@+:$Pq=Chadhş)BiX]^?ƥrk"HYAoR,y:kn΀$@xQ*vw1[hBE8*U?qUS.tƛZMM̍'%H;砡RQpFX%(z2f·7QB?*8C_InMž+\tE^.ȱubO?1>238.=QJY*#[D;,|5EA e ٭EudoW}PA~a +֨uHbJ:q7Kv,=Q9&Z`s/m\âg[dvn8Ws+$>(jq.o%>yq tFVMPJ/t + hiuzAa bNCh^vr(7N=T ?1;V n[l(ZcV){h31A2HcOoć'nS~gRK_5 +Kh[2AN_3>w'ZRV}:^k_c݁9JL>֭+ b)`K2a44ut]_1ޡ}dR  +jen ݙP^*'(Tƙ0C0iC.tc4}&-|Y_Oxp冴4:|e2v mLlue[WKh1LJiоeqlIy +4kS Q 7'̊}߻nB5VMR{#U4;8Z RZ%*!P3jA4BeJ3bzLYv:̎L`,]}zek+ENye ?S^$TW>.ssA 9*ZΨeV"Σ@ ȻMeq*iIR QH1%j&)UE[:/x7O(ňڜv`}u|y/YdKW ٨7;}T +y/4ioXs@sⲖ0ƦkU6's>.2,IKaQģ$I'x4&5nXx-Pf +9//!LI)QaDKi@ƒ: TuRnY e7ٳANTw:+A{hijհyZΕQ"q̌؈'Kmemwb*]eU)2 +Dú{aP:EjABoFCW4oK-I/p{>@ږFo,s3&;5r/c -h.dlN =\ + VF~eTpeҀBd̟U7Yv"LCLw: ֵ;6ŏC6vs(?/6i=W;בCm|A*{X8 Sdpw1=.pl:u/gA[EX_W>Ƴ#MŤ&;@ˎ~IotB̈́CPTYLs;g- /(ԸsF6:b ew 2a0Lcd\jV5X>9#NT.qR3i{nb~r h̒G6푅.T,.VD1 OMnrm?2I=V&A go[Ãg?ΜC,u26ZA4Z]Q }PQ^9/K o]n)D#[a +(~DfQ9٢e﨨dƗ=O'VG4:kWy·4L6l瀉\WzJIK99Y'>Am\A{# $,6ђ2EmV6Eg队ġ2AGYd!_9$ӟY/T9ob*m_V" ++u2n9۳[4:8O2RR`9ߖQ[]錬5πZr(rVФ9_ꌤζyQc>?X H<((Mjb'!'/ \2[2ױDŽk3 >owK0'XJ6\' +aCz-fMWϊ/[EwB%T5m6Ub2ދ҇͑:P$L*5ظp&D˱`Usm/G+ |wn7YUl6$ŅFe̥\g5t ]"(zN~У0u>ҘYD4Q&]ݺp-vO@~v\B#!;i~AĭjgNjd3uTY`o\.n:*¶Xzs r U |'#Td SheO@ՇR+1|A3^T6Z]y䝊 +#۝0bio"t).קo qݶ뒸x%bm@ rZC +HgIvr Cod5 |stvo=lšBvOP-?hY%{S)]P/6צ;G$9Pt ACVTo OOAy/ ncu>=\ocNuqwjyS)zaJ, 4* mLe;v9NI?3UУ ^L=[֯6ƧbƵ!_S*#|>^{* VsqWg֨6H|d+9 @ԺS/ȿ/ӧ3]K h6I>2<˲^C@L= >#w0%E'4APD oh%ŵ\HƆYFx)K!`X b4靣:I(/1Æʕ&rw1ČxZV+lD+Ϧ|Xz7>b;k\_J:n)j=ElWɘ(2@^}jåS};Jl## '_u( 2WV\*'!j.ev#i.4Gv!Y)H}2a< }xdeDUK8q}g]~A>);L`WATG h6GT6_T p1ϑ= +Ҟ\To Qć H)%z ]J-(t3%\zuiFoXI"4&zt%M0H1⌕)'p.mKf9BoaU~hsVy 8麐<;;W{8eTKDX,%Eblfk\HHhXeuc _O|ص3;V@cO9}#Q?S@`ޓ>Ljo qN-,0),.rRS折OM˒zi{hA9:'IjhBJV PiZxj|YE9GɼwGg|0P%x#J6P޶`&(h_];"_}RnW2sxϞl#~Gv_Gzu[0xc98{f^ ,JI%_ hb`^IrHϹ0Q%dBŝO/4ؿ O$zsO}4HvUW[,i +bog.ZD1.aw!ttEfA㯁0I JĶ_Bjك} 2ilSWmsA#;=\(_G}~eC͕mp^ endstream endobj 3414 0 obj <> endobj 3415 0 obj <> endobj 3416 0 obj <> endobj 3417 0 obj <> endobj 3406 0 obj <>stream +HWn7}W[Sy4A:CҴ@bbZwxY+ɗ*09g3sΌ1`F* ?P.~nr1XpEjj*V-J#-ܧ0U !ٳž6c_ooͮ~G" SACI%Bx? ll31Vi4`0 5 s0g\8s Hֹ}-6!d5b9{j})nkzU׮˗_UGA$c4IqpƵB2ԛM~Aqr>y#b?C&>՛C')䢀(B$WM&N AN(n0r( m#DFb՟TˉXBu>WAu[=9 DH; ʠB8:H/V 0=0.0G<|FC`RjJG]IsJܤ/N +r,_rX.d9,Szaauʜp qj %)m' 쓮!9X;Q8y n| rW.ߞJCaqL0;IZ]YT7NfO鸹}Ā0`{"DN endstream endobj 3412 0 obj <>stream +0 H@& H>o^`%yF=tǃK`I} s*{.ꔿO_&)ͻ<c&V; WQMē ~->Ub')&8YU J= 7lCJOK!l +[|R%BWHy$f{3Lyc#w>3hk;~^Im-s~"&2H_E}"IuEbo +]8׻:VJ4@dZEu{u16P$+Odmz[0T h |##\@3WpSno&Or"*fK~8(eM/<&tz IRJo]8cP8v0t'4a{>QDb0ᐤF[)I+sIgקʰb٩i=%cAfFcDA7lT+'aL8`_ے7<~! +Rzޝ}"ܹ`j0ɌE5#xwCP`a"f w.}'_W n !|kPJJA ~JG:0pd6Ţ6af)lI94t_3nzvA9Vw< qӲY҈IAN//QX +L]Ӷ睙ܖy^S+ދY֧xG CZ(smڛIx)bk%o^Bw;]J HJT⇥xR﷖1ݥ6+?V%hͦ4俼 %ÿ-߰כߖDءlu>'ۊ'AEQe_ r]qxc廱_2u'd@RgB @4Yf§t-5ArS $rvƄ ^+ȍ^a-h@# +I%D3re-d :H=$P9uLd/D7wa,+ឨRNǁW;JGOC.V@sqˊv3 nQc%tM͖P8{I(K0 +Q8~se]Z*"Fo*dֲ~W]3Űa {[/Xy: }{aGS!q@5xsjpO +9',2YbŮJsZn:S9Y>NE#nҔYZ+)ʵ/jJ\Ϻ@Mġl*wo/ęԃt87#=sJd:+pz^hy*G (YPu1j)Usj/VY}c[1 oHZ"nyxmonB'LԴFdk*żT<#M$?c?M=̟7 VK7vc )H}+Sn\ +\%:d2>ms1 &6EnB^XvȥF\Fǿ,_e>,0?u}Ur3A;â*(P~aL.yxj%!>/lҺ"рp"ר%5лkCy⿶34ʭI92lP82Uw׿}֓v8ӓ-LӥE`*>hT +m4uǗ!C}ON<>*p8ZcZ0?A2qdBddW |jl۲(\&L 'X;VȲgc:|B\cu8SpO0i]r}qR`|s5ozvC}EiK?-=? f,e]|$ݿ&B !T:Imf\xmIBBG/Z=u(+i{bӮ@*k%Ud 99C-9)n6T?|V,һb>?UKhވIg4%gKH'n|'?[sp[q>O7xLߓ+dp+4I L$SX:$:<6yJ?o~6X\}ܐs+*$f,.}~8S%8OA& EU eJk,nJ*~1%}}We.=%Xd^Lm=}#;gV9^5|kxkSHW:+Ƞ{aAQ 9k~WbE;X?v|wZ39DZ{9r:i % ݆e06'gPC _) NJ_;4WqaS,9n)yyߛ\#v"UUq$R!LxC"xB?7 ؞HX~f{}A*}X=jҢ3^^aںS;!pcWvF߽/ڧV\%t?@6Gkz0&Uw0!p4i67F^zC|ˆZJb1_/Ov:Z 3LCy$ Qw*/ $鿤UElTTǺ; +[eD<[oI-<ڿ&~ pETl.69C4p@-H2nJk(FOzq4͠LESv|CS'+YtDglAfy AZykcyDn$}UŽy\XS|_ yE!b7̔w/2>p~Qg#>Пr(Ƀ)Q[-gǠ].OWUV)r@w[K1pFFFg\6(Q%ף'y%7wJzJ+n*Z#{K/2ѠӰ6&i!HN-Ӹ6y- + hUQҔS!N"Y IkS+>$˺ȫX"zI$xɖT[ ^x 15 PH@U,J6J3 5SyWS[Y l,[PrL [R} fbÚ fM%FܪHn7` +ρ6 . zH+a;i}U}0Pa` o?HlMV_$WM[yp9ȀT,&q{|o!6T%I[rFvwm VBS v.57jRlf 6K]lmL,v}%*3LטzT  }7 ' +s1r~,-uؠ+6 #CKHK* +7e$ +A5OU3ΰ_^ 1*Z[<4r$_sȍ+h>qeGњr)<+6@ ՅQ(SgEz \WKcesH7fKV֐VzՌ'>Uld%ȼ[7xICN`х>¬I ZEU8˰AZY-\[Vvof<@W~йm+b?-mz@m e\YJmO5|R[3"Ciq]tyJ!mC5FG?X叡3;zMA "ˤf؞&ӨZ:'jO@$ 7;c +{!:u-=AoS z|F ҠʡIw#{ }7` rr 6bt<4kTY*@ya5@I0ٴ&RRdgwyDve:ZJ*Q{\"t|:wU hÎٸAR|-w\͚?%ʏ\9*M:,y%Pa_J Զ2fAi=L+,b.'rzAm|fk +c!c|6wvr]1!値ay/f"톏d a?Dd5"%wM~nN#,5f;AL1oQ(FRo;%̸U>M*$5Ӱ<J<Ѡeg16n0>$a=Sn8 6DsxP}[N4:Q9la /u^(#"r놝0G< +W/gXZ?fTRJ*a9z*09GR3n8UpaY8J5fK9aqU!陜BJdܴl^FbNpR,9U@c)P^foB endstream endobj 3407 0 obj <> endobj 3408 0 obj <> endobj 3409 0 obj <> endobj 3410 0 obj <> endobj 3411 0 obj <> endobj 3399 0 obj <>stream +HWnG}W[l@lM`;Y ̇,``1&G,(v8\D`s)&XTIB+Vś]~n}fM+R.0DjX+I5FTBHۋWc?뾾i7?($V"jL^>;h}se/Qf/~aqo1V^.% =샍AR.CAsXD'WK$qgq)E\W Zh-6}SjSשps \-Q훝Q|"<'LygąĮR|2.0BtCa6BnZU3.stCvO#Rͬ ۩ynqw >V3-9@,iI@B2 o"I>L$aW1;,bd1|c3Ut!6r/-+~eߝji-?ph$T pxn+\xś_fJyJh"*nvu ujwłr3=nfס$q^﻾fpð+x1NoC)⣤<u\##N$Dze䶯…qĥy#Tg^%/?lv]lfR̭D25 U<=i\xur8"d8\!Z*sF].=։Dm~/='!D'"/Dlu1BG`JCͦ8^*4錉:tě$tevI02~?@]@|c?rp*9<7pc7 =Cӭ#-y! oSce,w:$ u;PTL}9\PnK4f8A5m:8  Zږh|cxaJn;9ގJD E'|܉[[1=_q + O 2kלpUsVwIP42k>7ݽ//Kl&%0A}{ +e~/y/sAU<п+4U*Z͒*1U #\!}$>hvr;џ&=^5RW_^/) $\nl}sOD D<4a%I {"Hۄ$8~JQӿP* +CSqK$@]zvȌfSC䧵ݽ5/]F΄3]ZԄdHZB +>=`0z#l3Zӿ2Pd[?/2 +0D4i_@ endstream endobj 3405 0 obj <>stream +0 M@&o Mg: 9Л"\p7^V^4Ƈk ^پP^b ~%Br wXh -l 5Cη[c<>Bʠr͙lm(qVohT畢$B$yCz\L.W_RgȞM)L0KF#?t~AA;IMPf9I%O^?NA {(zH m +>uӅ@ärXxa2 O eӼ_|_+'!IP&)[+d"5/Go3AvنW=3BF:?ob{d C UoQlL8/soi F~9t풺҇t8kweTT5&oz  lS[EbT\6ld#zp+Þ4ׄ?t0l/9qifKLnG X {"aX\4N:z C2%jOggUt- +A~t6>^|RgѸ+s?#pSMat7YY̤+W?]msiЗeArxLFJL=xJ^?kh\ .q<(ҮU[糦`7*PbҚFo_._K7⯕CzGyMGSwL,=rL$vڂ (^Wp=}ŶC<8dZ#D/ nWOmWαZ Ͽ:sN@ :a!9- $\E~]x],~zո<4 }}'ԙ9Iltso0 آfY#4c.'04 ʍ dtE I7#NׯdGsFnxJLB&\I1>EHw f$/B#>Я~)b>z6_΢tZUO 4owЙP~.ǖmk|5"468jgROřF<[bceq1Toaa^-ST +] EOS;Ia1??W!_esIO?sv{7~!%:SS=s"c%vrp*P>ldj]Js_x~ܳ2~Eԭ.\Z >FxPeaÒ">R+RsB4H(Rw?9&2&A:lxi/eT7^aJvS7-ze^:WESǸE#z#߹bQlLI`c`646ΏWֵ.39*J~KsftزcFBn#}q A +bݧQ;6mSQd ",F~>]*\LQx/C +AF5qI2?ѐy +,rw _l`E_c`Iwc'I xs42COܫ!¥!wb&D@.r_Nipzhvܾ)#ЫUTLTaÂ}؂~8+M-4EYa)lt;NyHG]@ M8Hhg TzzG1wu$P$2ߩ $oV *$^]f9@l0ot{Qtjz8 +#d֍`fj3 9M9Bd3,!Ϧ|W< <>Lƭ*s@bKEtSt)Pӗ/OmoՒ3i($z(D937cś'3|iZPMMvf%tgnI|m0]^}2X( 2 mX 5~T$\'v{T"VoQb [RZ]Ss(z}?np..70?s 6eĆ&_335m1(N I"yo!G*n/=ώ]좹c-3|$Nsusmg_Nja๲"J鶰c{ya}he<ءKy2lBc70Q]xƂ&&qPdRtLMb4"? bHZ8Z9]_o\go%oNqb {2f"f 2kJҘ|Q:> +I_T-l@Ih^H"JfSt\~Y lz,)kS zu%bH\BdЖxت="&@)4 Ic>ҹI-;(`m_mmlZ'/2ZvI(=ǡ"l Cf !`鬏I34.`7㒜H sʣν?|y< +?pjYYT1>H0bkp?c(_m +>REg(' Y=Bc_-o*y|%v$ЭDbHDDct*ey˒dw?;soB1O`}2KF4$y~hH%%"gL +*0rg3d%ia N_}0یf);N?z6& Zs{n$4D÷d̨iw`BP >ľ6f)` esU\Ve)9ZMPIЬkƀg#z; GuRk1u9p$SCȈ}H6&I˖"PPf 5RO8EAi/)*h(1Ϲ#"?.+3z…"_PvfeRÈ ]4b>h=q-'haLE:r~b8sYE혧܇ -.1khfaw($ʑ,A*ļd"6qD=BZG{aR~Kpz/gW`S,,đݳzm~V\rADZ2+8}թq\QX)+ചFv1na%.r\TiR' 8E)?$u*|>& U&|ė1Ak;6pra"pA0P2.]hw̬De!k3~tAsCVa0h)xrgƉ/-q`ARGU[ C D_?#Y{Ct7ӟu@OVZ6H89Y6l w[x7R2o",$(|UI cX V +#0.72 +'OX4kԶIn}'.rSO9ף0e"[DЮH~9gԢ ʔeKU1T,Gt+75U^Z2y>dc>^AbF8XKC_>H&sm,@au ggaVڮ}_qe߉=5 زy$4[}7eakAaS< A<$BY ބt6R}&mVAazu kA~fwϕ"I8a z +0MȎy0QE2X:Њgq>ܚ+;`W@P7mQ@ ޲a8^9֒X9t#Q]$!z}lR`bi# `@;1|XΦCaIMЉɪ.> +GGM&aSH(.C|䀯Qڮ#%+7ۯYXI,vJM[=H:W&45(lJT +)P%FsDjHTrhǮ.|H{Pk%s EC? ;18=TsmBdTحۧإˆ-)0W'9S tvFcyC̆ib3E¿0hy93t2J0^G{snz)QBz|2}u֢cA.. VS`ћ#otʻ%01-F;!UsFϱKk!Տ*0kC߫AГZ N2HG5S}µ)LSr~*ޒai<ҧ,Յړ<iXyŬ?/{df߰G%rs7PIT=&j6~g#e;UCv!!"o*"(ĕ>]QsW9XUnR2G 1=q=,r?`Tk +z\`ťw6Bp`2,IG tIGc¿ጷL-e=4vǤVRYAb*gaB5C 骳1DO]"WfC[ t}A)OW[8Jz<딆ɕx* A((E'禕(dދ@Sk菄:-0$߭n :H`ʐy֬zl牡9d%֓w{7>g| Nd`zݟW$o}LDw4Oa^ y0j +:rT$>1FV9 )mu^PdL{ς?"2 E|]xI'Em͘BF@Yso +?]n&A}"&Egj}Nߔ{!M3|ڸ +SO~ۃS ݬD+hs_guh}Qĩ᪌mGe:\M n!Y3`e-\C9#b'ciow]Ud=F/vx8?tBt|B~J1쪨VX43 swOX7P Be$W6*ܐjMc⧱\W|>DUg#8Q1<[-R$ Zυ 7nfSX0] ZmދQWLnjUTqrTlang7`>(7 ;kX,~# 5QQfǹJȩA7A~n|FFgw_ &~rPk8h6qLXF粲}E пsluŰ[} FOal:T|DK":[XgdP-xq&R]gLn괾}@jCk6sz%pgPvEe(qL?1 UDY"\\)m g̀BnxoD +|TY3IytDDI3ٵ.va-~NJ)zMpy ?v0}>J2jZ"yń0;g GנĶT B{؇LʹU'Fؙ_\!grmK&z&HM4uP!DGk2qv5"Ε5)soi-i~edB lR5`}$`4e҄{eE_ShUEfi͊BmlD&mw1M`R7F +}?OSoS!P0ӽl. +ON((ӧ[Qȵ^j֡BuTe2puGH(aУt@J {4}Kygm,$\XcL3_ +]3a5-M0b$Uݺd%v6kp6/6LKk8-*ab$EB$*)PF;2?f+ zt@F?vE4$懐u0^^]i."I oӋ +SYv5-(uNZґXPDO`Dș7Cg T +@;(u>r3G +{n"1\.Z+KZ@55¹"%[7-]t\ s/: +h cun4iD,D=gk, +.nTw,CAq-"@D\%9߷<]edސ\x1BZ0"!,?~FtÉB|)$[>J72J.='B\zڤ^Gs?ÎҒ.ﻋ"-E;Q\YV \ Y)KVUjiEHbRοGЂMgU9'FpMTVG7L\sl<'ҙ]3Ɛ͈$,6Z9 i{Ħ"5nIZDv';#[${bg?_\&K,;YaK'rsQZֻ2n[U^AId@53,P!)v$ wip[.' 8 +@KAK(|Xۋٜ=&UӉtP,5|;KMxw}ev6WQQk.*SMTDtt]tGQY)}JcKc k3C|K?zeBs!7J4 +_vJщvFwu5L_AA01n]Wo CDzXwl㩞 +*:V{`*/|Br tQwRCS@ +4#w Xhi1*W6(S0IL SgPq/Rrr5ogp5*'\:aIky$ caM6s@$aS7T}YgS~?5ϧ.ZSک_Id XnD|QTLV'd'族"$ȧLSr~!H}s(aC{W 9MҺLp>;-lXx )U,pl`YrL xU( ϧT +{̸:U)u1D 54/QiA4}η)vkR +uS DkBerQˆǝ y]1?ܭcC/6j F%YCRI`c w({ؿtf)d,q#@aO!gEjМ&ҔCTHK7MSJ&Oƒʅx)dj?L"zB_j !g5RXXwA- ixImO_9 Y#lT "|\,g6xw ⃃gBc|e{|)| Bt!<f[#o<]d^MSlGf$`7\Ej97:q7:\a +` QW,[ rʑѰn=1G=Uoq]s>3!Fj; +\12FjmN@f(+7DivfO~6rvqg?|ӰK"Es l&ˮ;P7l' R2%Z"`oT*Ze3?Azqt,2qXVJ|)ZA"(!57F_twˮ_櫟) Scg\k2\7!wnpD3"3Psn A~|67$ ! EVF 6|#`Q;krݗ\ILS౯Gv8q5̖$He4b損-׌/kd^ĝ^ٸ^?2X/d4y}' t/g+AJ@9.dǏG+ENr{~UnE|'Msjt Ɲ~N.q.pVI_K( +jD*?B8lgP!G80sM=+YDYrzf\xq\))ޜQڝvI0/|4ؽMoƴx#?xgTzNFA>Z$|v?/ə '%̹k /8|(9˧4oaڞ4r)A!A_*'S'7T\ym|Wp?PTA4:ΐ%wz Iv} n-?t0H٨uH,"=2AՎWmYC׹F[{h.]=uu\ԻT V>]\o 3*E?ɹ])c>iz zi5 fN٤ۢp׭GQ4Ol[EEb]Xf<$̈́q)ż%a}KC4/J瓴cO4ݠ2|mrP Nzv>J"N3;zF +2eP!+FuE@P)ʧ^M,~Ԁ|kMȨv&q]۸!ul*X+]1:g~lu8:&tUjO~.)Y7LX~FNMza.%kYݕ-QRȃ V 1r$"́h=𕋼کc;(gQĒ@%38ʑ38'~ -L0 *bݤhw]砜APi:ISCҤ=zxMge@V y%8Ժ-_N.\W S68;QX}zIƔe(i<>ݲWCkt5z9BiwtI#qvzh߄1V` 5S^DBC1oj)W%AιH$(~y[v9!nvzaC2/MlwA/bd {qÁ +xǠv6 +XRx6=_*qHܦhЅ-źaf~01 +sf(|28Mpxsfig:{VI1"x)+^If ;ev;w^sSgQZguF9)o(L^ Y魤~?d>>ᜮ[RsvwPWxoc+jgO91d*l>B5B-YI{[]~&OJtj[,CdLW{1'9xre8 dI\mA\R <1_à+.,rԨTԖ{N20j (]!l农 +(rT '10". ;:fiZj:% `aX_,VbD]{~MZ ę/4EӐIgv+m:/Fع3ha_` +q+舰0wPȰW^`y 5s ?%K:Hsۨrum(y6o]l@lXJ硾~4Xm"yy`|jNM/P۟xӲϮHSjJ%$Z,,\Y[mH&2$bAȒ^gzbdgȡ lq(Ɯi76Ԋ{0HRQo` _Y-JG[ DF ܥȩ3QĶ&ChM@ETYr+\5%tH70Cպb:YWb-!F2,ַZ"ThpJy>s.[~jCaA%†1v_5֓3k""G]⊎l<]fh +Lf) VZl-!ˢ5>1J#m8_rw\1LV?ʆJÁJ6Vip@oج[vg ߦ7,LndB[̐q h W1hWG_^ +R)6),^>wQ9Gᘌ`IPޛ,$. +\ll)\N/by{|. Iژiɟ7}JSAr?Vz9se!\+hgcE$&$G.LR>l†z 7rM:°4'8HWbەJ +qC-yVB2orJIHUގV>iySO-څ% HwpperdղU`ӑQkMONbxcRŒa-9#h%Pyl_$ ˺1/go[+q=\*0X & E i9M&,^[z;2k$KO։&,,8.jsB!\Õ©'Dka=;&H=X{evhm.#(%OoD-,!ENQ>^铰6,i18N>=.(c%q@OXDϞYPqX[X1Atr,Y 3L6{^qS[DE7/s Ͳ PJ[Ssx"H?aWS,Xa:aJ& +ͅRvLE?\boHB I)ctbf)g.h20,mq*5{͔@"z"?}GDrüEubZ 8u\CcԡJմW9[م tY8L;RB]hib{hLU@1m 68n ̗}A+XʼnS'3CEH1̈L/KoDea,k4!G5sh5tԡ PҭBBXvkA{E}xW]~XKgL3wV>sHVEpuOQփ"(3L_U7հa UH*$&BSQ]  ZVԓy9VxN22)s%ծ\;T۞ͬ{W?̀%tP¨5) I}KWRU%3oT}㪪 䢞o.W9@A ZW`>i%: +2gZ׿w_vlήSsOTǩf +v_X -vh0n|V++_k`hTetVD`ʎy; ̾^SH(3Tv(<)R(&[%;k}Qu=U7~cH:ta O?qs/WO%ߒTL)AT9 +N{&8ԍ3r5ඇu)ƃw*t}g&\_$gm gyIߞ땶.G<ϣ緂3F=ҊC! MD"(=b(18{c +0/89+Pʤ-5GZr4&?r M3s8)('t+RvӰ\z'p6ϚZ &/3zTs݂*bj*d)uD $Ĵ~bUQ.Ai +rCF$Cx,M@VhA f7a,;{h_o.mPBpK(4*ڶ ZکemXY|}n`.ħ !LEMǎd Zx!c"&y#$=|9|jXUڃ1RqB3_Q ,>qf:t uߜIݙ +BSVhaŔΟM_\Hs9k6AOfiؿrH4=$D +rR*^D30>7;j +w3Eq2gJuŖ."4BlL 87ޔSK)W&k@T9\i<U31D6xGzPFM{Q۾XתzfV W1.\ !+\U'X_$ܺj؁{=!K95|v[x3(M:oGWH}daZ);}:| S kf=i; FNPQ*1>XWbyԍ!=ّJ7FE%VCVF*FGT+XzI|`$t\A"۳RfD>ҽO=vZ6YQCYrQ&^c>&ZrL }Wo'ՈXDbx" CCo fk>:-ɧlJ/5}BWQ.ѻ,izH,'Lprfa_@E14t"4W߂w[R3m:J]X9f#- 04D`zo[hֆWϽփGMA"WS feRB] +R-{V˱˳ƪfBGtKF"Z kU ccuS*y-=Hds|pqa#tvPgpN5&x߲ &sȠ); .C{\'3 md˰-P;w1eZe yF$ԖXwݻ?=kߨn YrF9Ss"፼@\KWXd''Fw3#>#1^R`B"<sBG?T+X݅aBd&SLﻭE*qQؓf{EaN`X?e/}"~3ݤ%[|{PJѫ&qUdڂq$.=ߡFJ<cwWtΟ7<cDA2&c ++\ۅpp<mqlLkg%Qir5X .?'lE^ Fps>nUα%K6 QrJ{h50O3&vB}0si¢ɚ;NSEJ;v2&ZN.;b\J*'lu΃ <qPRQoNخÓkfhh&œo-Wo +4:-#7dMޚYkE;tY+^lU L:mp>v 4%I;F33>͒_5@Z=,-FJQ͸aa$Lpf|G+&eYƥZM]cQ2[y|QoA~f2BU#ۂϙd;Bh3SF<&Vq*4搒NKfmYe),.KF4H1|ªOif_[~G(Z bmdOnuQ^(QPj:+qMCvWNѻ?RމZh \C]t~)Ij +66UQUi`7D8pWDyS *_%.(GUG%A7v,]|M yw }h70'b I,8|DqkV.eDЋf[?ʚH̀*d@6%Iש$Y}P{4<>څ*5խgq AE‰oA_ހ.G#ɁP/Q2=]y4C!I Rn I6ٙ1&äg14i`$$.[sSchv 1!ob.u+M؁9GckrQDF.n+uc6xs.&F(/tTR 8Ev}#PR<ͼ?\ZQ ԓ0v("g8CU@J 3qth%jŠ? +Ojl$<̍:cZX-Z:r)j]XƜӈs@Z֪i(b~-$w?9ji ,lO'؟mn2ѡ5$OjҺQ~vr$ 2ftힺh̝2{ ۘ΍ +2 1EYc1 H7E+߄%! VЖd"%^a%vhJ!shA쎻9Quʙ3.mbaΪk4e4QN55OU)RrͻfIa tXіNy3H2wve1}[{v +Ry҉MO`([caK:h6"Ndh{tRy5~'| +v"EPnRYRl^q<(I$KH@nn+̼-+P<.HRDѣzMH-')tGF3(Mh D ЈWdfmϾ Kl_tIwys15eh8 i]fyPҟ\! kĽKԖȈ7ZGS%Ir/OU j? ,PK̄͟0;\1w_ChAFpE.XOj_~'IZkZ~瘑|TP }[{]Kקץ - &wq,,7)VTEATM df,\#\.PU${׻s{'b>V. &AjOQ@uI#oE]doouQAo=! [ D#e 뫖v_RyͅCND"~qvyPBKkC1*ZJ޲sX]nj +U5OLͲ|9[l#OPonB ONΨ pazؙ<9Kwyi!0Rӷ߉k6M~ZNo gf@M/dv8I7C3,j0`8BՌ@ʽXbXBҞs~%^dA5l~_9>>TQ +YP5HX2BvBQK2ŗ:|TibVjeqü5fr]~gØ>[}1?H$nqj2]dkNj(#+i)+&64tS$ˀ`h{!X7NJәV$.éj0k)>A/|1GCeM̄FbO¤ѥ7REf5p.G;ֈR<*v巋/tS?*l9DYItIH t F@K# >XϱӷY&'@CVxpb"#e-'| +[(LV8>p +iJu21=#*yAe6r瞍Bd\p , nlneV_UK' Q|RbADc:%(yo{(8MSe^&b W;qm{Ul޼(ڞh攩1BI7‚6l:@ _g@n4|Rf(Hsh?7 '0ӝ2`zؤB=jN3nU V z YV$s$p<`T Vç;U_o ATƬ鵈R}\Bc0tD,wNuD#gQc Ç5F`6z_=uE%ՄS K;2J,٬Ź菍t7+DQ%Mh0RMwƎ2e.X,+NXo}\gN '!3dcP ]٬Ash>jҒg2~~N9\(4jؿ8l򟍹a2 +d}֝ }#JG-ג!|@1Qo/Sq2 Vh,OCP7yDRbe\KI(yİMnԙя& VRԾ4m|^XZW\zx*;X7|034=?uTYFm1T2:=;񉐷E92ߞuD87mԘ !aQcM<*Q-H6ہ/_gStzgR>?hLj%qia%X$,Q~# +L5XcUVJ%<֨2SlijשC_ZrK{݁\]j7DڈIXfM<)$2JIA"YWo{i:&9(FW*h-vgz#9eN;whoo؀ susf#Wk9Uٽ l+;#Nh;:I[Tf]Hy3%6 Gt= {g쨚2Xڙ[ܬ8՛ؖ wg͖In e'>F|A$x6~Y`s=9.>u)(|~OQXDYsn[wkbp]ĐIS1XF+`†?9fja6%+fFe1^1ѾDP;m|r0JDhtǯ2 +0` 9=HuoG(iCZffiooR/~\Y5*<ݰDrhI, +fC}wvp\\Gm3ߴ^D0`ּbGjR<)[Z~Y+c + +QgՍﳕ"7\vC4Ajj|.>u;ex[ v_fCs]҇G+XM !)+obY`oS%[f4D>zj>y+OFW"Ȼ?7dх/1Jru޳+xq2KR#7T( E"%zfT&,l"n4ՁeZMwb?4HBGJ&.M1#χwI6]M‹4Κoz+Y@iibӐRGNm^De4c-v+^N`*6nn%Oh 1:8D NW8$q}96D(,0L\6Vyr[(tu2\hsBwMX^fRS|E$R/Oez&yۇ'uP1u ϻ-R*"VğBS-?I \]sEaJJNNC r+Df4#Ow=|U6!RخBܫ$܇?}keLO~m1Mh8HimS@tܱSp`=CzGN<^[0R~%fGC4pҍ'3%Ǽ`X&s? ˛۵5S1)ƒ_t\ck{)dbN*ǂIT4Vuvވ<PU3:/ ^ǹj.Ms&bMrn|-ܨu:N{F)<' CXrX1 I ptb~T0C2})/ݛ:Ʉ~S?kѲs7l`Zmz@j +;Q}b 3vb9Ͽ0w{SqfcWWM؄/Ĕ\w?[GrZq? +<Ty(lړXE*p>gMQdEd4uZ~3/f4 ap~43?-~s4G]ݍ p{RJ +\)1yFk8tL`a\7 o֠s ,zw:/ɍzxK!&E 1|dYKch:$j鮁4KUАUwo :~38׸sx֭请'F[hV`4( +-3mdiLZ +O}Lx#CHTbwT|=(.Շ惺 {ভr kmyOL7@dѻu C'}kuˀ +@G-= +r2cXIU`Ey^YY +qujL<UOP +FI,"o2,_ |"u=ϝi_xC ^)9%$ȔߑYՒ\mihM9~#z A'U,U,q̢*7'`aSkmdNcxr[*L@b[P[C4_Z ͒A37e7B2ba!R1I/ H CԵ +{wX, +}k ` nDYGJRiYeuC=0BQx61jm8Бp@t^޴^O,n", c,\1uG 2@!A5YChl_y.SZ7CdE2*~)zØ,S$i; \W˅lRDȜRHDaӃYu0\C5bljOp  1cWriJx y4O䗤ԩ%:tfqd +mȧ[Q}P(єdV4)r!̊xz*&|7CaZo+a@fٞpHtN[9lҕaڕE)^u'YAjB- +JgRfW/>gUQ75j:y;RpyzL5?Ȕ$uFC4|g37_E, o{ }gOo_S|-ggKOPb8/ 7v'No܎# +X2!r'v1J<%Na,\l(/ZAIOJ['eV6pL͉@ (Bm yE6]CifzmD5!Zi-!y)/|ɾ&b%@"bG-ɀ[$7^-T) M[[✮Ar;1TYo0]!/,((~8]=pjmMG29sӂJ +Lzܬz:F=EAR%s l&r9V]Ĥ.+dޣs֤tνW2ٌ,q\{ض{y29^4Q!WZq?**=YcϹ w(hI$٥W9@Ys XT qUqmp5[Ԗ) +RE1t?gN$cׁj]8 +0u<2B~AsrQYZ"Z xPt,}w :J\V{QJK0krOdB` KaF[$xLybE(|~ nK }5KW:ī k + P >)IpIk}A>“W{+W橗2ۻ/'%6%oĥ z5̸Yze1a2d;EV$(h>)30+]Lw΀L| +đZ=a}^{Ⲁswyx+ -oo67~g3:, .ewc}ͤjY>+#UZs_\EdI@ੲ.N.yi(B3 +%>[@ȪA6&dC@FAq|%zu <;eH +=Xٶ^uBZVvT\f."m?K]ngL16tnW}R9}PRDe&0JBsĠ65_'/PwwUU:}K/^* +x]LJ;3{8z._te-Z/4AXa=j\}H4qGVt3 RV8ZF)s_]GL$+J˺$n3EA 3Z aG ^r>jߘVU\kwJ0J~qr:]Q{BHߘZ|`<[%XŶKfӅO!w5ƁuٕMPWe#  fS2Q{4nuxH$Nx}`vr,'Td.OWvhRy1gIq`0ݹU>4Ď9?~oh\*p\{ Fĵ3BԡM7!N[+JBM66H9jqW#<8JÁitiks~j*d U}d_-0dv/+NponljA`azzaCjh6+Ƽ5hgx;&YICy! +۟ +_};3Ia!ߗ +2EN?L[Uyd3X?ڧeo8b MO7_' Gܗ$d}G(B +MO5!`̓hTqEw.43xF)F˵Ux7)׿Ay%tO;+ 57%q}H jt}1L6 ԫ +d +J'{fᐬМCa[2ۃN1|u„yz! .HȃP7ݰ,Ctٿ%SՙY8{7EjOV !WRZ Q'A&?9`lhk+B2Nn\"!Qt: Fd voaNjٔ-s/QdX=2$5ߋnO1X1VCkzvcYa= X[܄ggZָl Q^btVHkI^q.VRQ8_Px۩gcf0dODUR/ 97 +V$K]Yܑi狎 K xe@=DDїM' ˋF(#k1#e*H/%aj}ER$"pދ(C2vШ\m#ъߩdJDMg];@IlBs0 xA_uw(&LV.5la:OZn#j)';’Z[ BMhruAi:GWr.BH*^ cnh5OE/65}'GhI5Mock(4P;_!w_x}(YGJH!{D#s~Te(dhKu+3 +{F9 +Řx3].oB +F}̬e^"rO:f`P7P-=9!ouc|4ʄc/ 3eM5 W~w>TQ4&}aWVHgEy3HKCPo.)Q^Wj>ugn| ג/ȨeuF40/t~&39Cw ?忻{+zX-kታSP왙p_ȠQwe +[aWM,f ެn?\xl'N욊N3H3+x8Mz}-D+RJ¢v8)x9*ϼHKQ9l$˒ 2c{HڑXff8FTkstቴ 2 O~ mpG:u}~~Wb`b#\t2BLrgBf[8?-rVf4'mmoN^|J \bkϨcL]MΆC~dc \ЗIzUee=nܿ9#.85Ho):33(0#|*N-s8E41-$^+e6|}1S"DO&m,+?lD#35A2]i~mwpKwC6L5Bҧ,j]x7gA67Q\~#ݧjyc}?jbA4u*Sh:ݔZ~0/Bޅ9XQ2l\\ +KՖ +=?T1 ]Eo}0Eܟ?@#ōjb|W0*LE1b<iG'3\}Lݴ}N(`V c2(:Jz."sïv !>S%lm]ƥ$}tR <<A>_j":ԹNqM!"^hAji +3UoL + +T6uMHV̅h35Tgrvb!9?7FwW3* 9?AE6^-×ʸ:nEڬtfݎ Ww5tG P1ʭN [Ġ](CJ$?8)&x*;Ŀcy-@J\j ]9AYԦf$֖v~M֧2u_!ЛbN?~]Z{_mU'Xukiu$JUc~]9g+[R +*qjkS# 'HcNf2;ԔmP +$ၛ@3f ޵mhrPoU'KmWj!24jpb*0[RfHę;Xn>zg 7drm- U^n:-? LG>c݋ȃGE5BvUōq#֞RC)#Ѥ4Ga;[fo-V!Շcɿܬss.fGKox^+By9x :x}Ajt!5ye KbP\->)wzwHvqݺXȬ~)j$5ؤd- ʇW\ivi Lo~d+ =Ӽ{1 !))kbͨmފ(3 4vm568GDa~ *n4p @Npn>CáE<9fe۰y1!5|)%Fҏ<<K o5|KrW ,1h~aj5}p k0دd I?.mߤ +h~(ih[/^ջtpVLnެv4a/siD?+FM Y:T(Km&ʀL+2Nϝ^;8 6H|Ԣ0 jkfQ Da#*XྐQ9$*ѦWB@id"ͮ((:琞w)u +Dv_cM 1yͯ_ڋ#J@^ҫ +T[ņQbq$g̦{$5[A?+=cB%';LW%BwRg C5Ehf(Ϲ ,6O'McIx!d5_͡0!:7K+B8<_"fFCkC0{l.W0~׹i0UZÐl/f*ݗևNSt;+?-^j{_vL_q2[(s +pceխMh)]k^&ʃFEcVH+i@\⦅u\RdAW t.#uB΋u^' +=.O(@t˖`!6GJuHuwZ{87 m}"lx,@?|T1Q"hyqDDD(sk:xYluԮ#csC0enWxdq^Dk۠U!4̻ +F8+BвN:t =HƞNcDZ7n:c_m K{1C]6&1ߚ\=C8ĩ)P\fZGU*[MIϳ=Ń\)S>O MrW +) +)F&:Խ_|ˬOv 'VFhH%"y%+T@DNJ]+hPBP΃_'tI Sm@KǕD'á16:cShjet}hT>NC8ۓ,7y֌3i<ޱ, uf?D)Oy'Å#ZUe[Ѐ>te-NI\@tɠY_!pFYMٷWGɖ !pb9 G"韗huQ47Nw]|ǡ2,9J/jMXJn_ Av!iOh Y;S+^{( *5^8rᄙȀSD 0 >ZSFX4A&աve(bE"(tlɉΤ5M{*L2"c<ՙNW-hXCuy/4I*䎭Xm+%^x0n"FuϝUl%'D|/DURJqaˀR Y&rK(G~l}4QV kzdku'qRi؎FZ]Z&%%_%zsvxObk?ʎ&Qyl`dsҿ< Rg}7 'HgۥrqgSӆ@UᎦM3gU0/_"C +.>^,T.P~IՑx#b7 u.s5#GNMIȝ[( +M$50! endstream endobj 3400 0 obj <> endobj 3401 0 obj <> endobj 3402 0 obj <> endobj 3403 0 obj <> endobj 3404 0 obj <> endobj 3394 0 obj <>stream +HWMo#7W@ rda0P [d{>ůbGEI,WPS;$K=__立OWoglZ/jhXmre./>\=w~ևǫ[ ] a$2|G!f6s3!c]~p.*]?sK?/U`]hOGs*vᷗqo1?1D1Х!Fr)ìHؔXߗC| $C F,?8xa 9s>D2:c_{PABvOWIsX޴a@4þ_}"\ k[W۵Dl`ä;0in!"j.&IY7c8`3mK燙0z߶c@ I!")58́G +9Ȕj}ȉR8fb0=ńzE6]t8f8ڽLL)z< H< O@Lj gM{X{ ,0[~Ç{y}1i0 U`ڪI&NOAjÌ:T <ƏrJgI + CdBUW4LlFA$l~VV}jbRߵk vyGD416D2bF2>eu9<҃"LaMSCij ^),a>^@FvķڂÉG,*K;xX^F[qDf=U 6S. bL)Q{"͛ҙRDMN$\R bd9Obbuì&{ЀER$%>Lhz>#amF[vָ!@Rp95k2v*f&5Z HG