From 3d4a1861f59da19531bc2dee3bd2468408d6a9df Mon Sep 17 00:00:00 2001 From: alpine9000 Date: Fri, 4 Mar 2016 15:53:19 +1100 Subject: [PATCH] First working version of animated blit --- 009.anim_blit/Makefile | 2 +- 009.anim_blit/README.md | 24 +--- 009.anim_blit/anim_blit.s | 187 ++++--------------------------- 009.anim_blit/bin/anim_blit.adf | Bin 901120 -> 901120 bytes 009.anim_blit/bin/shift_blit.adf | Bin 901120 -> 0 bytes 009.anim_blit/blit.s | 85 ++++++++++++++ 009.anim_blit/constants.i | 10 ++ 009.anim_blit/init.s | 40 +++++++ 009.anim_blit/utils.s | 9 ++ 9 files changed, 168 insertions(+), 189 deletions(-) delete mode 100644 009.anim_blit/bin/shift_blit.adf create mode 100644 009.anim_blit/blit.s create mode 100644 009.anim_blit/constants.i create mode 100644 009.anim_blit/init.s create mode 100644 009.anim_blit/utils.s diff --git a/009.anim_blit/Makefile b/009.anim_blit/Makefile index 08f11b8..cd673f3 100644 --- a/009.anim_blit/Makefile +++ b/009.anim_blit/Makefile @@ -5,7 +5,7 @@ IMAGEFILE=../assets/mission-beach.png BOB_BASE=out/emoji BOB_IMAGEDATA=$(BOB_BASE).bin $(BOB_BASE)-mask.bin BOB_IMAGEFILE=../assets/emoji.png -EXTRA=$(IMAGEDATA) $(BOB_IMAGEDATA) +EXTRA=$(IMAGEDATA) $(BOB_IMAGEDATA) blit.s init.s utils.s SHARED_PALETTE_BASE=out/shared-palette SHARED_PALETTE=$(SHARED_PALETTE_BASE).pal diff --git a/009.anim_blit/README.md b/009.anim_blit/README.md index 20e43cc..c00590f 100644 --- a/009.anim_blit/README.md +++ b/009.anim_blit/README.md @@ -1,26 +1,8 @@ -perform a shifted blit -====================== +animate a blitter object +======================== -Extending [007.masked_blit](../007.masked_blit), we now add the capability to blit to non word aligned columns. - -The blitter can only address word aligned screen positions. This makes drawing something on a non word aligned boundary slightly more complex. - -So the algorithm for drawing to non word aligned boundaries is as follows: - 1. The destination address is the word aligned address to the left of the desired position. - 2. Command the blitter to blit an extra word to the right of our blitter object. - 3. We mask the trailing word of each line to prevent the extra word from being blit. - 4. We right shift the data by the difference in bits between the desired column and the word aligned column from (1). - 5. We make the line modulos #-2 so blitter object data is correctly fetched. - - - -[Download disk image](bin/shift_blit.adf?raw=true) +[Download disk image](bin/anim_blit.adf?raw=true) Screenshot: ![Screenshot](screenshot.png?raw=true) - -Masked blit screenshot for reference: - -![Screenshot](../007.masked_blit/screenshot.png?raw=true) - diff --git a/009.anim_blit/anim_blit.s b/009.anim_blit/anim_blit.s index 061845e..8482711 100644 --- a/009.anim_blit/anim_blit.s +++ b/009.anim_blit/anim_blit.s @@ -2,182 +2,35 @@ include "hardware/dmabits.i" include "hardware/intbits.i" -LVL3_INT_VECTOR equ $6c -SCREEN_WIDTH equ 320 -SCREEN_HEIGHT equ 256 -SCREEN_WIDTH_BYTES equ (SCREEN_WIDTH/8) -SCREEN_BIT_DEPTH equ 5 -SCREEN_RES equ 8 ; 8=lo resolution, 4=hi resolution -RASTER_X_START equ $81 ; hard coded coordinates from hardware manual -RASTER_Y_START equ $2c -RASTER_X_STOP equ RASTER_X_START+SCREEN_WIDTH -RASTER_Y_STOP equ RASTER_Y_START+SCREEN_HEIGHT - + include "constants.i" entry: - ;; custom chip base globally in a6 - lea CUSTOM,a6 - - move #$7ff,DMACON(a6) ; disable all dma - move #$7fff,INTENA(a6) ; disable all interrupts - - include "out/image-palette.s" - if 0 - ;; reset color registers to white to prevent startup flicker - move.l #32,d0 - lea COLOR00(a6),a0 -.loop: - move.w #$FFF,(a0) - addq #2,a0 - dbra d0,.loop - endif - - ;; set up playfield - move.w #(RASTER_Y_START<<8)|RASTER_X_START,DIWSTRT(a6) - move.w #((RASTER_Y_STOP-256)<<8)|(RASTER_X_STOP-256),DIWSTOP(a6) - - move.w #(RASTER_X_START/2-SCREEN_RES),DDFSTRT(a6) - move.w #(RASTER_X_START/2-SCREEN_RES)+(8*((SCREEN_WIDTH/16)-1)),DDFSTOP(a6) - - move.w #(SCREEN_BIT_DEPTH<<12)|$200,BPLCON0(a6) - move.w #SCREEN_WIDTH_BYTES*SCREEN_BIT_DEPTH-SCREEN_WIDTH_BYTES,BPL1MOD(a6) - move.w #SCREEN_WIDTH_BYTES*SCREEN_BIT_DEPTH-SCREEN_WIDTH_BYTES,BPL2MOD(a6) - - ;; poke bitplane pointers - lea bitplanes(pc),a1 - lea copper(pc),a2 - moveq #SCREEN_BIT_DEPTH-1,d0 -.bitplaneloop: - move.l a1,d1 - move.w d1,2(a2) - swap d1 - move.w d1,6(a2) - lea SCREEN_WIDTH_BYTES(a1),a1 ; bit plane data is interleaved - addq #8,a2 - dbra d0,.bitplaneloop - - ;; install copper list, then enable dma and selected interrupts - lea copper(pc),a0 - move.l a0,COP1LC(a6) - move.w COPJMP1(a6),d0 - move.w #(DMAF_BLITTER|DMAF_SETCLR!DMAF_COPPER!DMAF_RASTER!DMAF_MASTER),DMACON(a6) - move.w #(INTF_SETCLR|INTF_INTEN|INTF_EXTER),INTENA(a6) - - - moveq #32,d0 - moveq #32,d1 + include "init.s" + moveq #32,d0 ; starting x position for the blitter object + moveq #32,d1 ; starting y position for the blitter object + lea bitplanes(pc),a0 + lea emoji,a1 + lea emojiMask,a2 .mainLoop: bsr.s waitvbl - bsr.s doblit - addq #1,d0 - cmp.l #SCREEN_WIDTH-BOB_WIDTH,d0 + bsr.s blitObject64 ; blit 64 pixel object (x=d0,y=d1,background=a0,object=a1,mask=a2) + addq #1,d0 ; move the blitter object one pixel to the left + addq #1,d1 ; move the blitter object one pixel down + cmp.l #SCREEN_WIDTH-BOB_WIDTH,d0 ; check if we need to wrap the x bne.s .skip - moveq #0,d0 -.skip: + moveq #0,d0 ; wrap x back to zero +.skip: + + cmp.l #SCREEN_HEIGHT-BOB_HEIGHT,d1 ; check if we need to wrap the y + bne.s .skip2 + moveq #0,d1 ; wrap y back to the top +.skip2: bra.s .mainLoop -waitvbl: - movem.l d0-a6,-(sp) -.loop move.l $dff004,d0 - and.l #$1ff00,d0 - cmp.l #303<<8,d0 - bne.b .loop - movem.l (sp)+,d0-a6 - rts + include "utils.s" + include "blit.s" -blitWait: - tst DMACONR(a6) ;for compatibility -.waitblit: - btst #6,DMACONR(a6) - bne.s .waitblit - rts - -;; BLTCON? configuration -;; http://amigadev.elowar.com/read/ADCD_2.1/Hardware_Manual_guide/node011C.html -;; blitter logic function minterm truth table -;; fill in D column for desired function -;; A(mask) B(bob) C(bg) D(dest) -;; - - - - -;; 0 0 0 0 -;; 0 0 1 1 -;; 0 1 0 0 -;; 0 1 1 1 -;; 1 0 0 0 -;; 1 0 1 0 -;; 1 1 0 1 -;; 1 1 1 1 -;; read D column from bottom up = 11001010 = $ca -;; this is used in the LF? bits -BLIT_LF_MINTERM equ $ca -BLIT_DEST equ $100 -BLIT_SRCC equ $200 -BLIT_SRCB equ $400 -BLIT_SRCA equ $800 -BLIT_ASHIFTSHIFT equ 12 ;Bit index of ASH? bits - - -BOB_WIDTH equ 64+16 ; Must blit extra word to allow shifting -BOB_HEIGHT equ 64 -BOB_WIDTH_BYTES equ BOB_WIDTH/8 -BOB_WIDTH_WORDS equ BOB_WIDTH/16 -;; BOB_XPOS equ 16 -;; BOB_YPOS equ 16 -;; BOB_XPOS_BYTES equ (BOB_XPOS)/8 - - -doblit: ; d0 xpos, d1 xpoy - movem.l d0-a6,-(sp) - bsr blitWait - - ;; d0 = BOB_XPOS - ;; d1 = BOB_YPOS - ;; d4 = BOB_XPOS_BYTES - - move.l d0,d2 ; d2 = BOB_XPOS - move.l d0,d3 ; d3 = BOB_XPOS - lsr.l #3,d3 ; d3 = BOB_XPOS_BYTES - move.l d3,d4 ; d4 = BOB_XPOS_BYTES - move.l d0,d5 - lsr.l #4,d5 ; d5 = BOB_XPOS_WORDS - lsl.l #4,d5 ; d5 = BOB_XPOS_WORDS_PIXELS - sub.l d5,d2 ; d2 = num pixels to shift - ;;move.w #BLIT_A_SOURCE_SHIFT,d2 - lsl.w #8,d2 - lsl.w #4,d2 ; BLIT_A_SOURCE_SHIFT<dk)?n|iPO}Pfyu)WNU}M!d zAI?7+*iSXM0?8{4i86_9K@LHV8}=|TFnma3Dqz?IVjW0hDq=`@GwFCofh7qzr9SuZIjuuEFnmCE{PS+b@{b_2r%6_`OxG)*u| zDKAi2_DKuVN>pG5G10uNWre1)i>Rw|*@Xpmmz|ySduA`dF1w%qf3Mf~Db6`_&ilNd z=b1TkZZosaOrC?D7*W3qAz}Jc79>JwR5n6dghr2g294#@eh7_w_D3#`PlJq}l#PN= zB%kx_-_I`lzyJR44E*02`2Y6|JYzu`14_siVYDqFo5bjg**eTQa+6vKN?zf&9O5h`$5= zYY=}guL$}c;{Cv*hxkXx{|@2<@`}J>hz~-24DrwMih+kA{#9NfdIREeu;T-Wj{@%x z5LWYXY!rt+f$#$QG$H#1M8J7Nr9_}T95ACBbv@RN zPNw^f40<>T31%lj7%<}w8vERn&!580N!{rChh`&6J|3-4$j)c@^9}v%7YpU`c=W(R zfyz8O9uXKdtY_9F@mIxfq~!RT19?l#&wlXadq@yC9t9u)f5cy*h0O`sg})yQ(TRQ7PmL)l35*Q4k;KK}ht^fVubo91b-wpV?3xBuauND59;jbP33{fC7d|&^Y!3>OLUFp z@kGdC0P;d1VhCs2o4fTTz2Ymt`4%>q!%kS5gh$S*;fy<+^du%Eyt_kk z^js<~MuS{xv8P^V{js8~Hvs2bGMY@-^dK_y@R>~Jc!FIL;Hvp?$D7g* zcNF=ZeY?Kse*Pr*kk(=4(h{s^N^D2)9k@I$2@Dj~aKg_mE(QKt6%brJZp(<%Yy zI_wuOy{bC#T31Hx=Jr|1d0To;m;L;3IFDbCrj!f{|Dtp;dY>4$vgV^kU4&tUyN69z5SIPL|hf^ z#59Ys8p{=OguaSg#O*u+`9qEn`LuR*kd@HSmS;@ z)=nu>Lc5}%UFBZyv>Z@i4gTymV>q-|Uy{3XujSBJqvwXM{yanjJ&c>IKAlEGyCR`o z#l5aYXguJuUo&d3Z@ti`Av8g=9-G6F22*ZyeGiK9{%7yp2zWp;>oNSoY>~Sk9FEk% z-N_3%;m}WE3F~4t%Id}!l=dvI0eN0(*?u-)z|L7`BWaVzeMz9ka17%MNY;ddu(Anw zV7Ky#MrDp|}GVxbtCdCoHY(!piSv$^(*q z6pq@g8%8-Zy+ob*X~4m)W?3rSLS=a%h(%_nhAcS@&H=<)p)gbzg%A7G3tfJXL{L4+ zeu;-^>wxzz>beEP>JP*ypksFvZs!Q^pi_h2Zfx*F zuLdHb<4y$jtrtmD{J;Z3NE-7!>3WYt|Cwt1^f3}HcgmI0+FDOPim~(lXnPosd;3_R zX#VxB*UEdV_ew9KP}69I~6FU-iP{$|B1(3XGTiP%w}} zQW53KcE;LNt<-U!3#8o)LYrS8+etd*f9UP?Lx98{Y<&;QNxHQ?;uvl*wX}VXJpG9J zyu{f@%-T7>?U@@-PLDm)(pKD;z#~mInt-J9#2@hpMfd9`uP;%F9j7WFa=tbRg-%bX zX=y8o^sN^mfs)^~84P*?A|dc08P?{e&g~r_ zRT6AS3BegD1inP4e<+0>Gml(Ls#{~8lDa%_#AkKqtC9UA$Rdhxsq*FTRumK#-cl%i zu_45gCt&?y*dQ`LHz2k{>kgb0J|Ph|^4yw;q81tYUy1qv(>+AJ;X^y4%eYNgOO7CKF#OE4Y85ClN56MiG%suk4rKGCHSVr|_ za8Gl%5|`8I$`Q=fnI%}_UN|vwkOCX++(Xb3G}kiF^2Nc6jr4KfdSOz6L`n*YHc2E> z#+|P3(HXib(`?e*kDkLO$%0sSKh(NhSJj7=Ip2*Xb^ir`X;^(<2KO`veb1#|s=k!I zatY;;7u*Zw;du(DhKEu1*w{?n{nA&kX-lqey$BZZqBmjfS|&jS|6_htxbYs6>`sA( zEHgYtIhD8~oi3MhT9UrJ^*~uSNkWnQF|E6KeUGrosxifjj5sBv_J@+bC6Epe&*KSr zNk^LxlyNB;IAz>aeX%32C+wpaZVOp}pG*u*QS@V$2VbAVzaysAX*x-Y*#2w!jg=)m zRE~r`+u213-@0+@&iD^j1D(}yb7da_k0hV=4`qE0zj}s^;Eb42zG5Ia3+e7hH%^atV1?HX zj_Ry3Vx5_!8?Z&yhrvBb9>T3}Ze7VJXV2IybamP;h(9W zh3lAtX2Rmzk2yuDC)9NC!9`Pk9)g1xxnGYi?FpA3v1!HAA3mV&ZZz$+(sNXOt#eDK z@m)`0FtzZFFo`mabt^+b(&;WgL@0ce{{hgu;@cr~YKBj}Jb{QhF`GIryp2|?-1+(( z%~PhdF2d(51?&D4;+W}f6Hh(6kPWwEp|7A1OyCG?>8Q<|j$`C~7~GQmy*AwD$Kr{4RZSqad@z;va596IDWtL{4a zqtlX?Uc0)3nv+?!?WwMKO9_8Ed4X9FZD`fTIs8Bi>W1=j@GV}De>n1M9!QG z>T2$cL?|) zL()w!j0`1gzV)VBUeOn}8|G`G4KdB5U-wfu`5>a%bxgdoze3-f+&e_SDMj-oSESe< z@4KD;iz{v4abJFvOR0z%y6YmQ*JGt{rJ}~!U*SqdD5R<9ujEA+#gysZJwyA@8xB_^ zof5A_Dikfmq(?*TCC~Zk82OvAA`z=ESJVbFf|5Rb7@dffIiVX{pUrDNmwdIL`3PMb z=zBmiDPH2!^dbaQ=IR43`Vd6q5lpE5Z>>zL!C?WktH49A z5D`=~LofnZNC|Bo8+*On=<|g_&4#L}*YMxBZmbMnd^frepV90W;IiZ0-E3*$TJm5r zci+v`kt$^$3b&+zvyp{IC#w$+V-OL4!`jeWDhLr-Eea?9QkeS{o|yV)@?ZDeSea;! ztoNbU4`zw$nAtKk77>C(%;iYJQZa4#&k?_X z-e0Hxqj2VX>QzB~A#+3J7m5hKcx>pQ^GGm7Pd?tBSW~;DoXg%$5hwfdjZvU*7hI9{ z%aI`+u%$vKW|tgkU|jj0F;25t7JbAlN;fltwO1QX_X1UdOHA)VJQPs}hWuP}V@q6O z?)IzLa)Y!CPd%d_tTfyA_-E-rH=CgPbJvlB{eFZh8JPk zTeFweSQ^oksn&_Inn9W9~;@4|MTX(4T?$FRQ|}TTdX~N z+;B~`st4HII4JwE?k}q}7q8TnAG@mUDey@A-Z+Rf{47egwT+HJ6R%c5`{o7wAa2PL zOC0PF@*Sw((J#M~ZUw$oSNHkSJDIPX?ray;l+O-7?Aky3^##_p>4y$?8O9|>xfG>h zyyddL3RoP{GV=a8!|5pQ-}#5PwZ(F-VZ~M46I(}4o6}WvEBKB9sVFox*HuuA(0liF z_xf=b3WBx|H;)){c$;CrBFC3r`+10i#T?8Gi2Ryt7oTT*Kc>IP%sAYAtnrt2xo~`3 zu9FbP*FS2`s(Rr6AmtnXCF^tMNe>@1ZcU8qDey?tqx3iGqn8#owyt?JN%R2DbCyeB zH#dG#uOGa9G32)FaPcn(mx;!6zVzCwhd`TxGgq@+V)jtibJ&Rs^T{LguajE5Vo=_H z8R%_zp+6^e24T9a2R8tvXK$uQN=u}+siqHqV0sEX648Kb8*jk|?V87z5&y-|@AINu zLWPUjLXDlA5BSVbdQG$x*`_SZJ5uXQFONe3lpm5p!}R}*u^)R0#?X33!9Hc4${b!L ztRovR?NC*$s5Xp&=LIggq?9OX$yH*jV%<@NhSa+9J>z=7vAZW2|7!T@QrJBthm;OP zDw8O_1kVdx!sm)|pB#`8v+n4yI(U@mL$AHI5CsInCR}_F*4mG~1PRq@JPrn2) z{z+!f4hIWnY5MrV?_LnwW@*yG#!oDuP0OG4q1QfP4x$8sK`10Hhb?66bp3;iqc)Gf z^4BQt?jNvwKa^PSZ{huDy{?ktxaEEP7<_fvAEP_4?si*ORze;2d177w9IcFuc=Evg z>qo|8%Psp8-$79&T2#BSj~|H?*z#Abt{M35jptTcedvwnO_nhP?{_$KYAk>3MIKC~ zA5E%lYyHE<{Ztz`C_uHJCACXXMRr_P7MwB4Rb^wfva%{uZ@iFWn_!aKQgyBZkNEp) zC8oDtjrwi9ut+KHe0=dmAtn7B&&aPWD1g-f$)6=&QW&T>x25sl9Ckvj*i=uB^RCz4 zLCFOKJcUE{!Ht517wL*C41Cf!2Cvj{mFrXw3wL~qu_09_g~y7}R}(!oCe)^z4zE@; zUe-;h+)Z{aq^O=Ew?t-bI{u|y8Wk^73(z>*hdcHmBrXouiVF0F_En9;4Ll8M2{RRq zFYDy=x_9u78@s{te=+=7AxCBwzl^K&^$l^q9g~ol)tSYnqi*WN5eLwG-sOlr+B`_Nk?i~J(*W~*r6q>`2s z%pXgLOA1WtOsR%OsL;ocWtzq}$P$h9<5AijSMP3_>4Og0aU^#xNJ6eacQv}IF$|)@ z1B=Cx?tbvk0El%9&PYd5pP#^VN~YPnUfy3M%rjUa3Rkq{D*0nC(nW>G)v}k!SQg*L zbF;z+zzRgf>6Q!^X#uT*Kc|qo+PIq3(`9V+_EbGIIUf>+b+w9w=&pSzk=#LIO{a!I zW+MFaTV^RZQUZSt3F7Nl2OQC})kUdkHr-txdhO2&Y8pQ!|uwq#Yb}8%lZPXxw>`nxw$|7DF`ij zF2%-mU;GfWi`c?jTCvLodn~5Fu6#ku-O4sqxrWQ}rB}q`^4c!&ItXlV+qdBJT(T%n z(sp*vrDc5U*dm+vu!D4|&nnxvh+?hbfU zpZwESIoXJkemBi8m7c%)|A^a2I_ z&7sGM3Ql@@j4onnEAL0ZErrH@9b7^1ak%{?8P{jw8HDC^qEEfTH83qf(YbtslGgg( z7cic9_K2dMdv-O(vv#~Wmf2mbIwA2BK`n`dL{yKJ1E&ATlCZC3T>@*Qcnd-6RK z!5E)xD&w*a$(PZ7iZaE*)RO6XD?EP0dOd|nmm7EhRE)kSDsHuUGb$m=ed^`;qa{P^ zk6ZnQ`Mw@wLKti07dD~7q$w;huNI&BTy_FH_cRY(H7aK6S4U;z&N1(oaI5;2yD~Hw zH(Q%pR@Mp3HWa$bFm;J$I*k53_PY|$6)Hm_qHVZS#P8Ag)XVdRga{oMLgf2;6iLTg z$t%~sj88mbQ#3{lb=l(?r)ldJua`g6%1(Ryu>`%uv$*Ft4QqB*9_!q17GbkM*bWb% zy^9b!!@!}T(QI76V+oBp_fS0yUJ{YPj{P2Sn3qCFmKnc!)4$xYHRy?jLB`kv#&=4qMnP36Q}+WUO2Gw z)&pYSEe4+Cga_mGz#TIl34PgTU73|@`*D6wx)iTSJ`o-p?88LAbp>sMm+ng}4}WL- zxf9TZ_>d2=M*qO9woH}iqG4o&PQ&&!zE2v~6zP(<*inY?cecG-A2-RqAo0N|k%uk- zKZw#1NF3+`v!bIp_}bj$o!79fBlQ`y*Wd%UA$W-T`uByJ1l;}N!Xza2iNl(WhitW5 z_fxk@VRJ35kLhknB$NbeM=B0gV)Kg&jY_@mmXBcW5TB;v?K*@MzVyD>L+EpDh)?R_HR(KkdR{HkIMMmMNCeXduh+nJ+bp=S~vao zw{Z25P8GBxaX(|(^TY9^UQkW*S$E`OGoAO z1V)dUZNo$txD-yXWA6!BZ4X1ggn-CbRHnmx7mdmDx&CN7>Aw>jo}cuKtyMu{A&NZJ zmq*rf5IT*EJStI6`WSYUAH9$8$ybQ2)ML#-6U!$&TvMsxFza@wYkIE-yq$0~%E0EF zt5+Pq?*hiRdsIQ9SFe4tIuNTF*zTf4LZ7cF#*EHWYs~Ar7&Vt$XZ%)JMD*qBP1j$^ zed0_I$~CKT)$gJY@rB+Zw-i{qF06BHR|6XOTa@uIrnw%|-4ZZLKXGPY&<7LL9DQ79 z#RrnyXxtC{aj*sMb0lis|I6xQI)+SfGr#8mW=&Z!17(>T{JSHHrelUI?aShk z_QyK#V>lIT#lHIIOOYa4Z?4c6(YWFJqClT-ERSh4S4xHp=3Xl0V%8L8vcCEa9mWFN z&Ew{mr9sCZh)8beG29~omR6#u_*r*KxlwC&kPRIkrn?>b;{xzQfFd$&zVwc!9>Q(x zJjLeH6D z?>z*w$P1Ch7jBwY&%Fz{@*V~+2?A?b28jgNw_Yi%3o3U$EuKwcCcap(!3&E$ODi>y zU%h*L0GCS^r{P;4`@(^xR7%^N-~J`m&x$Omac-~m+V4t1eNsE{oe}@!k_F>RY6^X| z7haDN79NQ(>6?Ldg}(G&QigR|@O}7Kjb58fi4f%j7)##?J1PEd)UkTZl8)^_uSn>g z8We3~*~FN@kLFg1TxR!+;f20ojCjhZ3Qm7Fxk{9w^~z??BoIMsgJqKFSkO!Pz-?uQ zthSOvr(726!h(@~cfu?39YyoT8-;@VH3Rk05v*?<7;KQXO;Wrx00mqzOZ(aH$^a!B zwc>FL>j&z>uvsyW@v7CCNyKW!C@@gR_MeBls-;rF`#43G$&~!T9yxm6mEA9%M|RAA zqt^Up+UYmG$*}pxDZq~%mKB=M*QNVS()#v8iBRxjQI_hx({JpF)ut$Y&6^yCm>5{! z5-B#{euOah-{BHJ!&OyPdjioQemmc*1S|d-)KKlG`VYtLS&9eo+k0N67GtxN`wZV@ zN>Nbg7}x3V7sGH%Xwf^WVYyX%hJ{XLVG`w47(N&7bAnOATZdzO+Gj$8TDS#6f*(n# zjG>U|KVHcovjex@^H`~HXbrZ-)Zzl4I2duw$GEv~D5fCz#n+fj^c$421UHj^9jr*&{ zT0aBUsL@JqAjpHoA3KdptmFAo5(rNUTN%NX-6<<}PH$)>GJG&X zHo;MZQWKiYi` z)N2BXZ7j#7aps5q8ZHQm6l8kX?>ZEs0YW6mLIIuh69POk|A9aF3W$1rR7-hJseIlP9TfD7P{)??bhc_XGYv0C!0n4PRn- z_d`3B81?1Ohu29-9FGKzO-5#FuTgzc(kAZef`$iH>R-mO*cOE~%$PoykoK44zq8poVqRN|#wMlD!DbgcR`w>mohCM}&3KS{(BClNw|hyK zSBVVMWLUGi$6LGz}1I{Dl zw+R}H5{U}07z(?L-yX+fy1goPZI;iZ#Jgp$!s=)A=1qDfpt2y2rL4JE+ zst6Qm=f_?dz!fZ;Ue@G|ueU#;L{srzGkrN;i4V(D5Nr{L~|CHUhF@4m|Y zCpfK+ropziz2bPIZ5=IF;eu^{7bbShp|c7;&r^^;v@3XcAOODXSK;~4A&s#|nfHXS z&PHP{nU#4fHV|JC2E|}%O$u&v+~J?7yy3*$HBNlIh0LiJYwVj++##oA%^d#5HREM&<*oy}xi%W(HM3?O-|#h3=!V*}JOhNZj_dK|?8mR=0WS3=qwfI( z*h^*8Rpd3$JDG9m>Ki|i75b#?^y{MY)#U9tBcUS{&XDyjccp(VX!}JoWtVwkg8>^! zess(5igRr9lwh_xxk>p5p^RR=*3$+1G5?JyFM{gyra6xcR7$P2?Qq-s7A-Zb^fivg z?9WIIQ-^;w~g4Qfh(Nj9f#rj4l6Ff zh8fZ=r%x!UlJZi8H%EFNqRwjk{B-Sks>H1Gu~jH>nDZWSYjSuZ=%r-d?2}C_S$yw( zH)7jRJADTKgV6GN#v4v^E}Q=Ma>Rug7JnNG`)iuQtCUw9wqD`=_+#FHUBAh~W^KH- zhV<$O@#<*4e$2e?Z=*H;%-VSQ>e0ae(Xa^CpBjqBV@(;7dDHvcSB*C&%HMg=;J?a> zZFNXKc7Zn-Dtj$r$2s-Zy3Eei<|uy+#&wsx|t*ZX-|q7hy=s1+Uls+Tkc2&Q2yMAK@ZGTJtD&J+Aw75w2l(@ z&_dd(Z?^vZJ$=*VW5U!49}Mh zxWw*U$K~*3g~0$sNeEev_7HW0qk2t3-qbXEOajka4GJH@;~- z`*~SRHF0q2A6ReWyyE!51^mE|6H~co))mzTykaE1Il|9Lc=S?TFs+hUCB* zD~7$>m0nSEDT5Q(lh?lT<_1OqGJEwf*!er~`*ikX$`y>;y)ioS>>C?I zH5MOZu{Znto_rBWPN4TPKD$S+VFTdX25tlAh0glRKCGXPw`~3N?wp@*!eo%;Hbi^D z*;Jey>k~NBF!Q3?JCv zT|&aPtr=fvtwzS4;}+~0dp9yrGE!g12BhJiHerh3io7j>=hyw+XwqMkJh;QMMf=)W zc$JES!Oo4!esBdRH1Z#FK-=P^ZR@dduf-Sw*T+*3!PxOac(GSI=wrZFHnSi z9J$Y4-s1=FbVxOP@RbKUea@mj(X1!@3qL9ygKO`-0!`>Trb@PUugh`eM2o8^NTzU=(zvKZwt+Kr%P~5RJ4|l;!4xWNWG4{#<;RDdT z?nFh$(pualZa`uVTZBTeR5;2(Zube2_HK({q+Re)ke7zl{)9k$ciu2I&GM+!V#@XR zdzib9L=K9+;lRT-!##U%3%6HQYRQY_EKw(CGk96bgB^w_8eDu9)?MQ$e}W+}Bl7eD zro$r2PA@7?(5}3~`TN58S}FZEj@E3Wjx~+!j}u!ld=>!L zLjxP{A4a}BBe0m(s=fFz&`~#FoD507n07=HM&YK|!<#Yq!Qu7h7+qu*iUU9V`sh#+ z0YVB{Df>%Veexl>R!dkzJ{m$ruTT|olPe5yq4AP=UX~WCrJSGfgJ$yP20DE=xuICm zdQ*StUw1D4h=iZK!7#D6+B8_TdU85KkFdzgHgBN4oq(BvlhN+v^+j=^_p$Rd7cqum z3_M|%X{9(X7yRfE8A91aph#Pzr@XY6k6s{F3*Q$aadf*HA3ytMR!Fpj8btNfb|pUe zfm_Rd%wj`Blw9;$$Jm_sjN8;8S7~nyzj6aOFvX(B=1=0DLV+Qd&{p0ycX70LsK1G>$;HnwIPnQNv`1%cl@cf2Cn~uXhTiYdlaYz8Sy-+A4VUH&J7O=CkF$;$h@ zOiVOS=4ci9*kr_eVKA(z?TTTpT&wMGpi4m@0rm-iZ)Du%g#Ur_L;PR`0|z7ed5osi zRlO(94H%awAhKTBpq~D6YU>EHL%~f_4egK1vs{GFGYh_1C1<}a4(l`wEsteOBvcQN zEAhES(}20dhucXF3?kv`8=`-(WteY2LQuI31q?I{jT_HOr8ZAs&xq&feoYjN_KY~B zzkTE;&DraL<*!+zAF5nr`%%~(ymGG9EOVLF6H^(oNl~U*-wPVR~gk#TxUtsn=(`{AzoNr+Gd1M__<*tWxIxWygr8md*$v$$mf=y~7Ww znb4wAak0#m-4n0cMDO$uoU>)V{@wk9G}=$EZ&+@{wWU4fuEd8K%0=C#{qKJ(`F?)= zB&^T1WZo#zQLf^ixDqx~x=qcE-MH4IZcg0s)olrW!`nFMs38%cvGXL8aPI4OmTPy5 z`?=B6A2|JJj!YLKp}w?7pDWR{vE;;rq|}Jx1t}UKtvi<_Xy#@v?vER~Ts8fCRq^fV zS;g^ZXB_zjzpihry+I*QN$4Q0>Z(gtI2lGYn|!u9$#3VtwEp(NXuwOL0ENdR;g74U zXEa}bMojkuI$*9a{7~XTA+gbm9|1$ex8A(IcDwGR;@kF;hUIs6WnUvs%Ul(EVoS4O z`1YvPOGX^&&PiA_eq&Q5S&yISDeg(&W^CCWWqpGrZ`Nqo(_Pw-wMn?9pLwqH93Y?` zSu7XEa(8#J*SLK?aejz`ADlp;8wpvy052--(dSC2MIpJ8=*?eCPn!0%>8%C$CEG{x zcA2ZVCzhLydHRNB^BXJW?B7#hUtc< zz+gZDxk$KHzDh3Ca2YTC_7Se3Jz*|?`DO*PQok&vOyI9pl)|CA+#W<@lpkt4e->vn z>@B|){wlk%%D#wn#|>+R&y};=?s?x7aVYT>diY_%@dlS$$AX`ItmT5;?~yV@qi zXNRKMRgwM7bJ;iS(GwAeWP)SZ@G5(zYOqf~27@&M2@(xAj6}*Lj&e5+j=Erbqk)K? zu1G7nK34b6RDF@cEIJ*~4;S=c&BSP~L38FW@@rFM+9}f(=vEc|U`VWH&qw2i)(&gu zBDGb7KQBVz(*AB>Boo2_jUs|iD87>UrQuA_D>W(lA)Oi|(5_&4C_J@r5F;{A?Qfq= zufTimyE<$-ne@l(GIJ27q<6kbg*Byz2re*Z=U*PxU_JlK1^Pv67cSjR+IDz=;83W* z6R%tuWjfVn7^JiAz-{Y?Z>SIaCB9Dw6l3 z3w_6gz4m!xKgH}VMPkU{#nSe)hFc@c*pLOIj~Pq-8yHWZFsfQ%Y}sMks<)Z0yr?m9 zx4zAQFD*P_NNDBYM_6`nDuy7MtatDMnUtd8b0AMaegtn!)F=9eTcLi}FgN5Ni-4~nd1nhbYsR-G0u?|L~i;iQ%`mVXDB$o+%;pY7nI6UPaN9Rh#NDW z-K0*xXF%}@wYB@J?`CLdO!dQ=*pkM~WNVqYfjDYCfH$oXA4}0MpnD8+CQzub1nP$H ze35?VarbfA42^z)Ck*z7P!{0q!v}nOZ#AeWB&KPtr(V2kN6B)(4Ii~&ylcX_DnTMr zv=nC}nI{gtw^+B)y5fTz6uq;4;%OT!Umv1NybS#BlL;GfCjJgL5VsVWn3_@2u#=t8 z-@Xt;gATuUfo~`}jjLuHcxb2A3l1R_Zwo)(gdoahhD$Lf-=gL7`bxclJlWCu%rQ{( z&xp@BA~G_zvp62Acu0&mpW8U-;0a8H4b#7M23DW9qiD=HS9QJM7%}^1aKa%{Mc%3F zBtIa}M%8viUl)^}j=-J7_d08VFDw+DA+JW=zGrv6Hyl51I0Oa}&e+HVj?t+5ZN>eV zr7%@|C#(lOYlc^o=n>Pe#xv$g{IztG=L`N+)XZhS+Q#@{UE&pNHMI?a=|(@?vVxXN zGe}$ZQiWB~jqlAos5M;=oHsGJzaN8RDTLMlUzHHe&pc`}3Xftv>Xp2?~&EU4D@ zARGx*L&(c##TFK=sWR)wleq2o>{n-FuA1tH!<$1$O995+!_6s~KeRE@(tW7$|6XMUy&@4fe}3!=kn z^A?2{KW;M;l)gq_{!cKX$Gio6k~ruAJ*3AB0!4C_~II~?* z8ZIDhs%dSf(oyuDQKs!EEZJ=9+SutTcg000>%i+JC&y1M#79!DnJ_#u(+Se7AGpe0 zu>q0lHMmw|Gc|8#bN@VYA>ax4WyaucPXhrjSHa68{C;k- zX?$%REWO3&xj=nmKU_RY(bU1tlit+zSUcCT{dN#V;uWbfFMh~mGI&kK)HUnux~|=~ zgEngeTT^vjaCTFq_=uUHf*RNWCHPUGrR=%A!BE_p%dTJF2qWge6(7EsEy=55v6%^# z^+N2aCN$tfVP<9&n}TtTE#+uEHXKXGHJd$PNRL9TMiYt6erF$=%)XTS^q1pj6`qRP z;Ke>a7~u#W_vkY(P0#-FKzX|P8g%9E;^JrLQl5_4M)aGt-7$7HaU-H1aMyaEw#sG<8rOe1N0tZ;)07 zy=2?;0kLk?XMc%y2duAlx6a-VDP>9|p*pW8=Tq#-s-6k3ahNyO(T78GtAsK1hX@vRlVF?~Rg9IQ3I9&jC=!VepQ z^~rdn)u^AZs&8FExx;u|33naeAcT^Ezvq4$urFcp@6p?zT*)?uu^s@vu&BY&Uf{glQb@Lf_6heT54h@@$HK_WP?h4`dTkV0NA|a#j zFc9i#!H>74=TWukG5X`fdhwlQbz2$FEfXjIBLqBPlKH2jwBhjZPk0JtdDyq~K`NE~ zi`Yo7EJyF^k~N#oq_NqNe(4tF)>ZMWNs6m&+Sp9QgZH+(qwvefiL3`u;dxK?mI2 z@a|cq?_J@G3)v)G#>RmqSkr(FX-g_iV1=&8{g3Ox+u!2~6^ zy=yMl)m~}P*_Pr|?!@RLw0A#vG|dc@NieP=zz>Qv^9&Rp*ku5`FORo|8uhT)9$GS{ z5e>EA3_qctWC0Y5_$8Y|;Biq0@lIPv8TT5tk{0+y4_gb}h(qF@b0KC6bBP+|KMV}~#)|(eS@UR3;gr6HH@hyjS2)&z@!wPr) zbN_2wVVjUN+em0VB~8C`*)kWx5x1m)Av-a?p6-X!j^nE3{|wq;`-&{y;l(~7OqHUx zvN$WpT-I??qu>5L;JjQn2eVL9lz?(*Ypb6i>GxLtS$kjmij?EV;Mt^bJ!?%0| zL{S!LV%_bdl;gK>##R0#mJR7B@jIWtb9mMwMKL8Ddw@vZi<{b<_L1}-?+pn#(w&$5 zrQS+nE0{a41Waynmb)St?n%Ak3g!;UR-d_LJ)f5qBx8*`I%*WyO?dneSRxV0velMp z_*6bSXnqOa(Q%P>gE`w(IH2>I{U;|sckLX=8cZ@b$UNDYjs&+iDp?6*XhG~hq1 zfZ*Pr*7DWM8C4|DSd}HQn`k22>tnMsErPYJ{H{SAyeY_GE4&ax*^7GuOmeu5%*VE@ zJu6S&vaF-I=LI>{t&hBHXX67d|16JSh-R4*R|d3z(6T z%0#Cq)&*&~@*F&VNY!G+(3=c@zv4OY$HvRx8^l-cSSrek>4q}?N6i&%Wn3Mm^_rs@uSQy#)<{5cHh$gD zEtG=SQHGUqce~*k{Y@R1nlFP_Io@ryYFhbQ5D9?aA#4=3&EgegbmP@`u96yaz$lwx z`WZ2whXs^9f`H%1iF+ODKsr5>=L^tfoVA|O1G!VL9qQsm=w2NaHj07@GWc3fDq`)$ zd|nZst z{2{mKy5^*PT<)5D| ztvRN@JyQe#ORpc6p@UDZJS6Ro5aAm}Oq;W(sCRQSi(+dHpedmDEfCAl=v%2!^|~eY zibf45*S!AT$1r*7Vd&w&55lRIZ}-Y+U{!?wf3eEA-=MtjRN_e`HTHum?s@^|5Fx(7 zO!kAcs5BmeLoOm`JZygPo&ECPq!?4dS0hDdMEYe`n?>CyNY?Ov^vLZ!sbLxFN3=p6 z-7yN|$=0o;wX4=JN^~lc_oGM5d&m`}8roq5aR%-n=$I!I%}-P?i;{r~t_SI4qGM%i(F^!5-VMTbn{57W<3$!N$-Ez~%f9MO48^ho{4p%HN6 zirL8I-{z`MYJRoUlAnoo+5MoM=m`N0*Ct+Tx+T_Q9Rr#iWqtir2d_v$sRnQUr?b^7w@ zH2ecNlX<>NZr4M?zaZ+rHypp3sVGr}c1%(6k7E{KH@!|;h(x-gp+n$hrZ~A0{D_MN zTp!Wk&tJ-ekDc|ne%RQGIe)a`jVGUO6K`i8l){Pa^+Sf1e4lH|3ry*Vy$$!d!V)_D zv@z7M-SDZQmu+@D9-HWhwT-04VJO;J|DZ!SmIh z%~Sy2+ZVJ5ZNE+f0{*A%D0>y>Nh0oCn9Tn=GVDJ=<@b3|A33JmK10;C8h(g1@s(-Q z+6#2o@=d2Y#dmfRv2J`b!{4khZ}@No{eh{no>P!Gw)?JWK-(QQLDqK}fM$kgSJ(X?K!YsJHy$=fG;c>4Xv>u^W z)7Mitn!_)e6$fd3SPgtYR%GXO1uw^CbKOVq&&m=*$;HBJxbg0nekpo(_$SkW4nU-n zm4F|8%Rp##)%BFJce_@+Xo&i1k4hr6d}1weA{-IVOE~^=_ot79UC|;b1&ypb%H2M? z=ENHl>#>@U1U8v}&Kc%-V4$e;E(~PT}O^ZG&#^;n3^DyUMsFz_(9+ z0FC%Ozpc4s~~j&Gf*{yEO0V8qQqeh9WU;-ny^0L@=Jl8@Y`Dy3IY@1 z$3N|Sq!V3zJ36>*p%$w z5?Qvmm>h8{oquPa-b&xPc~2J(%#>P}!UrR-bv-gG$HC8-Y-z_J=*1PS`j1WU-s{~jYwB9HM;G&afOGM|Irf8* z2SqbNvYl&21NJSfxiBH@=-v?0O)q~fVA;sapj`07Z?Kd!$k2!8=bTK=s4=?N# zDYx>z31X&3e~L7`ye?;lHca@0{i!3cf*>yXKz#D&gA%o&ORf~sBr8!=;`$E`vN)HV z-RC}+peVpuzz>5|Q&mC7OWWF)oiS?O)((4pCFUPMIry?TXj6X0U|gt5AZ{biqG^?F zS32Zo?e;}EZhD< zRMUA0NfKRr9Q>@8nUJvKyF^Q?iQRt_G-)WGT8aN@nGl6B|290>$4exmbS*YE6a4Izg8vsN? z6XAJ6rrS1h@&wo{-4^XVNPk`KrWYWT32NJx~7z!-$8f zt3!A`eyy*8w-#BUV|=>}$4D8Fq_{>Q`V=SrOi>Mbhr8+JArA3FQt%^u5?X#Ggq6{hD*U{i#!dNqFqo@6p0f6t`074WAldnU++>KjGnD)nTP@gFdk)VPMBpQx&Sa zI2UVLm>uvPMV*0E)9|QG0*d0`Plj^vQwI~owBw&$=)}1>nA|2AxGjY6(yb}|LmgWuSL3(AE`B2x1{s>x?)I2$m40bec>^I!hJ zUOO*-V$?(_rJC^(I=kKyH@yIG_>26|RJfpo7R3)I@<3U3j}Lqzxo~6oja_32&G>Eg z_xyI?i~Bc{uh+F}Hg)Hn<46(!v#=IP4d_7n@>x4xuj5Mpcz66ToSa%`%UC(4{f~{^ zbT*fiEw`O)o$IW0yc`8WIrep*smwf*%RI`8~3|vG734e5IgfPyLE_ z_bDYr1U-^dlcZjyGjj@n8SS?@dNVRT`I9}gE&j^=AEoJOINOJ&i;^?a(@2BRe!>C~ z|3Mc@i_A)%vjp9)77%TOTxZoWTw&R?S*uXNoA0bqrAgzpgTErf@&(8Nw zlbc@N1Bwqo{9(O9go7WvNTr~pS0?{haQp1G3q2eWpZKiqL3P{ZyAO!`IY?dWOIwK;d!uE>)e-rT&puU=j`#Rnkp z&$hzTQ40K^pabXc-d>r#r=a1LLCm1tXUp-`GSNGyM2EJD+1Hw`N}gWL^0Og(^H-t6 z^RuMiv?^K`PD&A%{l|Q9s`YFN8#1G_imZnll>r4vfbnib&(DhP)WhAOFc~r|W?I3L z7qDSLbnCFEvmH1_jByF?hnV7Pp>W_sN>L+|0eo%r_Ggau)e8W=JG4tk08*k+R6Kt` z=u3K?fYftpQA1Kmq7>lHEqf$^S7nRA)L%O;WxfxqR ziNmn!y2tc}>0gEJz$TbA3E?^*LU{_queH;1cpVIGbG%*8Wmur!<`kz5^gQuxV|%y* zw-5^R_^FnVXNFTul;on>L?e^Q^A#G~=l0bLkRAa)5K3a?e1=HOl0eiWQL!VK`h^s_ z8hxO(_C)T?*5rRxpK-Y5fL57d1`9D}7``XEe&MDfW;cmPHKYuiLgrZqwS7a{un{&m zxOYS%{-P-q@HISYG}shh(ojvOx3nG0qoq}(^iF+iY@6;HE3#i)JI>y&czZ^o=S0!G zAJr7LaYpUm`fH7S_3{{}1cc6n>ybohC2)m8rM!|};X=czyPrQPd|}G!w&L-Tk2im# zTu65Yrqod~VH}(@xFA}H5Ycu=;rHV-w(Rt$C&_D#mLXT*JM(kcjA?H1Nu&Tr2r1?& zP*R&EQAE?&rq@r^85?Qo0y?^BnppEj!FQW#?X47W@Ua`%CMIP39&gdv=vUDxVGTU5 zJ14$mD)??|U%h~{e=Y^rEigO;{K!KM5@e8tE9!flfK=l8p%cuh{|NW%({z_x1+|?q zbBrhOV)3^dDEsvTNET30)tOD_{fh5r=WIRlU1F4NRj}pUM)!FNB~srgqia?Ve} zIp#u(_H+wFJO{N!fHZ?2TB6{on!&HeblmfHin{XZwdQ2}Lo56WKD_?TF_UluU;u04 zB-I60JPgw?4r+#_>TL7^_Q!Rk?q74H?94P6PRq2xj?Kk7Ax8_q9!(TnVykQ7&bB$Sc zXnQsq1t&xSNZv;DVc{A4|Ju7B_^8S|(f`lMgiMscgwmBL$c)8`+ggd*TTnwz6nE{e zf9SS*t9NT9s11w;i)$T>08&=!eZ+e$?Vz1>~+{#o=W&Op>)MPl3C75~6Y z1PN9o6QX3o%$(=+*OOAf~p0^(Q(qHyJw*RwVzH(XLv_I|n;yVw1W!Qnaa=|N$Kc!#(wm#5gN|LCpp}Cp-=`x;qN8)$(^uM@u+XK@V zKXc}lPkZA&b3?~yJV)YJnd9Q^vqyd)pCRv-k2Z!{lh<|M`p2JXUQt%A#H;WRAd^4e zHb=HcsKR>iGIe#ORdGz4VX+u4er@_S@6J2AkW4@t*%=-@klp+oaA{5)1!%&z$Vr+mEg~)#=io&MwG3TX}DLO3Jh3s@!^h z?x43pdX+c0?yK|rvs<_2Tb|~T|KcAO4rNcA`Pe-- zoi=Gh^Brf+J-Fnnlm5g_*;@DHRCCx{_sLz;ANbm&|DD{p@Xhy6+|=7OFmO=s%XPo{ zrTm@GUmQ)y8E?qjc-UI^naqjD7U_X|yEdLK?fCij5zpE9WS_Tf#+Pcp>;&<2SH_Z& zXS%6ikNU=;!4+yxv?`SH_PrTOd}+a%@0OJ-@hVNc`_(t@udh{26;+nIaP4$y$4^$R zEVV-ZLTlsfSKgYlJX8JSD>MJOef**OKX=jD6)U$qb#%#j<9?oy8)NbvxM_n)x~8O71;&dNUVM1@BX?H!{CR7*_szGWc{S~CXC@>Ixj>LoGi_B@*PZzB>mRQfcy|5auf3FQ z*wQt!qVbyBKPb?0y}DVhkJh*8Or7lTuT5y}jCA$qhc3zYdCMPlMp~j1j_nQN zr6pcUsjE#pD%F8RI;D0s)`Yu8u5Z1s|69>B-zzJ(IcSH(Yf~wCQ&U+n-C83vDte76 zv>1B4^iNWg&zSmeckLS)x#gBG_SNip;56r|wNCE)XaChu@aG*Ox?Qbki`)=B@>c(~ z-#u{rPkUpT()VLMw^Zj&ojma(u>?MO*G zn$D}KdaQPDlUZcPC9h)WY*s6GRsV468!P@O{lc&B|6+AR)ykQ}2R7O|GcOb~zo}dk z4$HTCmv-s3vxisp&+K?7a{S$U-<3z+x-xs;_(ndSxjA&5-fAvXGD>Ie?9y`i`}HGR zJC17mGdiz-GjcFFU=RKBvKM;gv)ocV=_oa-;%OM8Cs7&kJbVp0V_i>Y4AZ8hCiZyzdUaFg)-dow{Si&l9iDHSxZ;T<03) z;2|Z=Si0f8nFFuCy{ zt{ZA19V;$QOr5)Ze`L9AgkrftyjYdAqe9w|sFQ}&KIlsGCXQcT){x$55C7t|k3Zb` z?5m&r@te6*AAI(<=XIYz zQaowK=am(U)KrfT^`+IW71Jhk`uUxit4n&Lsx z(K_q(m2JJ*1Hb+48PR=1Cm!s4Xv>tFo9vEsq^&n2yRW;jR}Uxkilvvn{**H-bfER| z;p4Trqx$Za)zALbf_zUYp6tG|Jz~>qtd(uu8MP}@7kzhV$mI9suPn%qmRo4Y#7ebP zCH!`r(jYhEDpciVa~71f<6owovF-HrfA{}9w(GG+U(S7e|IDs@?v%V-vAuik7d~;p z7gS6-qE0{WTyr3Q)uBaS`O2-cC*M5K{?6m?v~18LL-iALCf@8`oixY&$i?n82l`*p zdgan@4zJU;^NzFookbU=C-x35yS3@6{QC<^@#IOLYWb$n^h))mP`9h@&o*r6_46CJ z_A5HyTq<|89Si+-)YsOXr!G)c>YS$WQq5Aha9Y)ClmBLW#gx4dd^@sgb?>a?-Mf4H zW%c3cZ&mdYNucUwfN@?r(D#`mKe+tBk(o2XgEy^wsz1L{H(pv>l^l_Hk>&P?e9hV% z7G64_-`DYF2Tsgf_rJYp_TF8en)S-yzJZbEm^wx8mAfc~c=CuuwcImltg)6|_p4@g z|8Ra~vhgCx?{M@Ty*FJdSFU@_em<>I{l!w*Dct(n+H>XNt4i8(icWTw+Hp(6m!3Q0 zlRLuaRPXpz<)cl#4O8B~%lyE_pM58OsIpQ{b%#>sEH$*D`(H14>$S#%`-Y=G%WjDO zYwqIg^0`M<)eBpY>#27tC+T4HV*;>%v;o zUmEQ8o>?7rs%>!DvE$AmCHXxzU*`^&%9S{NsC3m&TvjhH8Z~9$tw=7-Th+setRhU^DVhOt6KBds>;=a(gaD;tW?q)nKiPv>6WXvPSsC- zw&BN*+n%?m=TAB}=D%56x%xyTsfWz%oMr*CM=~o~oOp7Xle3-md%kt$%a{K2SgP&n zUU`N~j{1H)X@?v?YE`U8e&nNF9un)n$mDlRWMlr%dx!P=rE(=+F|2i^9nBZqIVbjP zY=ZQ#f`yIbBq~h!3sJHoMeZ%5Cx10Q)&+3oGi{%y@ zA=7E{&uxm`bbV~K^fODH_K;jb7lWX@y!oQTpO}7j{rQ`YO*nSoCT}Ra^6oSAGEdHi z+|MM!q98#&K%6yy_mq8oulME`OgQ$y8?sHmKJBQsmVIYhm399o?2IE>nt^V>p1*sx zOnZN$zcK9CU8kJ)y+s?|((0~xBYV~#3*!0hF#W1d%~Nxus-i8?H=O+Xqmti{e8XhV z`ge=v`h^EC=gGuPG#^SgucdmFC)1az$Bn}MhTXdv9 zu6lQWKHs=+uvl(TdcB#*ONE=btpDYOSI2&#)~YYJOgCi~!odUI2``vo{neL_cf9v( z=8P?Oj~pHP^!C}0WtW^Q-#M&mni%AyrcS#%v+0Pp{m3cK_)EiY?Ru$qaA3}C@8(}7 zW;N}cTxkzVeutth@+ya?UKw)bUP@MOSLZ$#&0X}{UT^LbpX#!&_Tna<1V7ij<^{TE(h0UxRdLcFMYPk}rw8Bw)fuEOoseCdz zaLW6s$g*eNI^~8duHAm(?ylb9x$B?H+TM3|To$WMt@SgK?+B-AhfkfAUi(aLUS?uyLy;@$OR%TenqI*JOLOJ}&LhvD4E!oAp+`m2SLvX4i&k*Cb9& zc3nMisCW==NvTlv?DSfR9dbWAuj2>3gS~a(*8V#izY|T~u3b68m{2KO!7`g7c}RXm zrc$1<>`XkrSKV@Rle!=(`S~CENIRA^pD}-~cV1)jg8!IT_5Sh;{`}qE-hb$ud-m%a zTgLBiUacCJI1#x*SDjsN#kgth#{2*Ft~swQ{C;o~N5$GC z%e1H8+0muuRAlXk_T=AwqGg4AQFYtxE57pIHoj=+272Tr$nRmTll^(U^GJ5fgk<~v z>v!t@WA9y`^~6E`hLI^(Lc~%ZZ){HX=t|XcL4{hUI@YLL<~46xa#oi-U%SLHadqsp z1xr?K|9R$6<8yf@yTwcY!%Y3ltM0MhT|9J6cVcZ#^`Wy;avMh{-`*q-8eEt08u#TL zy~Wd2tt!6lg~nIDw<@>KkLQ6Pf60PpB)=VA&-YffKKJika<=v}S)BFz->PjF$Os~a(ofT?o>%fLd*V6E zeX8!`lZUit>Ssb~Z^%1ujrT&YZr9H9gGZg`o=NSO^EfN+NAsU1IhY^`62oA&0q@>+%Druz>;)mMzCDn~XZPKjBkq^7&|YN|T-xRbY47O(c(OOG_;|2o=G9Gi{^+bdOAGl`S}L_8_DX!CoNCEcqNBUK*4yRD z4LQHAJvBS?KfTSC`rM4iJgJ{|vifyq$Lsu?m)&n_V8YWcyfkmm>cdj9TOBHtKh8`g z!;r0;%&gNZW2n|LF+m=Y_owpATVZN0J)*9OX@b?z z&AgbfSP~3-!!j9`lL2{tJ!RX)JY?Fghs?tYCWI@Uc9Y*pgClWsD`tL9EmrCalk%Aj zQuV@C9?)?+6~0XVnxkCql)_?b-FH$gL(-0u)^D^5Zphx_98Q>olVj%9oGqvwepby_ zoB1G&rYN6ljQH=o`JP*hXw{GVesfdt-PoxmvGbo-?fTbER`c4>JAd0Qn=)6a92v&? zl4iR|$h2-OOXY^*d%nKjHA_BRzp^`6?dl6w*OlEd88fQo#SaPT>k=x0cfqSE!O5B( zM8>~Du!}Q#R{Gr0$X2S&9er0m7nTI3i%4jm^NDdzs`mM&XPn9VS6w6{v&l^MlL5UZ z=UWEx+SL*jT{JIs()yYF3PJX2D>MHrxvnV>6|z~Z>Qmj)GWjf4>!|kZLbAfd-|>fs zyJQC~L^b*K?=GbqJL5>Qq`#=5cG81h^uaHyE4RopGkC`3pM)WuF8>=_6(+yB>t>#` zeiMTv{_EcTxxULXpDC1A;T8*?BKIuU72n9zM0WfX=0y&Lg&^Hod*hu_pRP?@Z#Dj7 zVazQ{Z)Q!mD)oM=LS-lIT%3?4vK2-{zB4$A7t-!skn7u#`E=pk*!p#jrqb)jnP<7q z@kd)JDTv>!zOAN3e!QZPS|&jiOghKB1czXmxku{dWFiB4Z)`Mjr5S-w5`u29Ddt~2 z#IBrE8+k!zqLNE7$P*Es(retZwEtE8ipk70Nb-rYlnZ6PA`xy&&q$OlEl(57ZBDNkWi~GA~Z9n0`W_Pk27}rhi8qhC{=nj8jTwXm}Ugf#QrVpn-Y5i{YQx;xA zuGtE5A~YH-HFb4cOXI|LSyc)qdTA>ZGdQ@?(K`lZ-;mEyN-HYe%w+OAF4GnVh9}Oe@dfch@h{CFx4RT5bB0f3PSfufIZmd9Fh4g%%f> zX(_?zOz&2iH@~&3=G>M~6(XD5)DgmZ=$JRA*DZ&_>ymVxlgXQ)c8d1iqwK)US?XJCYZl^k=Z_>c$f6eEA|~s zmB&8me68&#H0v7Fm#0oVOU~IGS>&G{3{N#H4@PCchz2*6p5}26@@-Odqh8~@h2b*f_qxq7G3m!K z75RMsOs)S~7MS5m_HKW!NxIhu+HunQrA__(B*hnV0I!oz5hX|g-%Q9f-2CXG6Pd3~ z8Z-U{gS?+ASxB4d(wTALN95jM!}R$kgVC^hbhb2S<;;$mnj@p2t5kQ|>e|tJagbH+ zTTy?eS?cEcC#|JaW9yeq$ck`tZqbR6w}K==2BtSkrs`Sww^qq7Xqqr*+|w$w*frmn zECxBLD}`mnxgP0P(kJADg-R9onu~EiJe6aaY=dyl7t9=6t-|-KrScm%$qqS=%XOc7 zw&QQ#1M|%B^n=G9N&JEORmp=ii`{Io9{x0F$9WR>iZ_i>#uanf>_KS$D~KeF*O(S zeRP#ql9Mj&45S~H8MoS&(mxbx%rDs#f|W7# z`)$VWrII8F!OGD7n9MZ!Z~AlcQwYZ^tDREH0k`bDq?l04Hy(2l`AbN0KIBI8Dc4V2 zd?_32{5~d^gHFyre#nvEiUbXp2=MRUF7n6le{t6ja zLTN8N+*zuLnekUuMqGa?FR5|6T2(0i>p7BXahaKpNhEKgTK`lg-$(|}kYyWc%VSrT zznSL0k^H(Of%YU~vz&!rcR)ww*;je4)Qb=F%NO-NDL+ypA4Ka!dD>vUynf+#-<0|t zvsI(XtrYx-g~Pd&&{XNlFGS2fS0$p7Ybn&FN(q9Qc=5fRvHf^umkg!DQ6agjPLsK) z9$9S?IjQP7)+`ta4@Bkk)4w&b$hRgtTc!TF)>I?>Xk@ zXCI%Vmgu94<*BAfT>teIwqz>Tf%5A5Nk(7F>lgC(1IunV zmM-*YTwmKdD>I|ZOVvhY)d9blvD>3+PI>*bU%%)ZVZU6HT`2@&mby%GFPsvbc~Pih zZeFKki3ttzZ)z!i+02REx%|$Ga7xyfLd!`ym~;g{Kf&nAsoNUl&iPb%;#G3;_Bxev z*R(C^=bG|2``C8qbN#G?`V~g^Ke{Mn$}Ovje|Qb*P%HP)3Y{bR+X}OR(|7o5!iQwX zwaXHfj*0mny@!WM#U5|4Q=+{n62SIuB3DKN;)|QO(`q&e9L3A4m(F@3=AaG zVfoNUdq0(vD0u`#k3E2VxPCgHnq()6dHOYx7gIsfX`MmDF|YpTM=}sfkUhiELy21?by{6mCHal)8@4kSXnQ~( zRMWDuJm*S0`Q&;y*DNz936tJ+&C*b>)K9+1ZU&gLAZse*KM6_cw-V%OlBkZD7-`qM zj|rxwTg#FZW*?2FWI&x**TglzW4L<*2pBYNv^sizw6^eho?>Z*zl3O zs(wuOW%UUYTkFBB^up25CbMJfCj)piICpW%>!jrHC?D^*>XLsfq@FLo^I{U$urR7hQ#RG0%+F$DR^2P^tFkG|yRSL1!YA*@4= z9(RR&_AX)NX8*)DwIWqaBvZM|P^{nF!X6*eb+(i%VN7l0`a>R&Fq^@wk~dMbE-mzfmuv+i?xGqIce z{HoQ2#KOzuZ-i9KW{}@MaAnN%j|iF4NUN$`Nn5C2^mUVwQrE^--eUXZhQ`!M7$jK# zc$>JJu;StV=ISbESYqW=lUZWROe!`ek$JOtuO1$8t8)`O#Q*IEuRITxT zyjkC!=5H0H)=k^LvZh9U*ht#pd!$?Zy{eR;Ff*w8Ru2uOb@&`<=7)kgS1Suae(zPS zk?k><^Z&e3WwavEB~qz=JrW<#-UTVM*<>7ewJe>?28ZzTugVqb7tifq8If{7uzSd7 z*CyS>%XP|3Wz<@~XYz_V$J91&Dp+OCk)qxvvp|A>Rc>Ymou#>sepele>RiesEChd; zmHBWYSkPo9h5YidY^G}BWc8-xS6wqTv*1Kqo0?>DldJURV0)aNG6_aQP`^lbv3~K) zp2?1sYj&pc;HMa8^~)nqCM?tcqsmEj<@8gg&P~eiT9(c<7t&;=39ByR<@sjdYX4x7hOh`Xl z+^H_jIobs8F*g_0srpka-KFdOSY?h4rmw#je$ zxIp;0zhTO<^6MAQ7wcy))>4&Jy^OD2CS55=lGS=(;B~3J2`%=yR>B-9bI~r@FI<12 zlesyFKcEju?ftO(70=cWPE@jQ#?yYRI{($Y*qsO5!kZRI?}ME|O@deH1o3QI{szz{ zKiMm3`9heoJ$*RlIPz_BNfA1#)Bf?;B*<&WPj@1spK)}eO}gm@Ej20+6HiZ=(Z>%7 z|J80a`AK)kKeRG)k)K~ITzlEUan15Qx+}HbdN?NWBxgrHKR@Wod|9X*={NOD`HP07 zesTt8NxAKDzb1tj*__Md1Z`$wiHTR$yCWlgb^e=~$ZW~gq#f7ZQhmxuDT&?X&(=4F zWk}n6W_UQW%*2aH%tELx>t=>oLNUL7N9W%U@>_VISxw5xxl6@qPW=Me!wLgXrgyEG zH^KE^rG5>i`i(R7E0kO8>Os|%y7*<;3woBN{PPI;oo_ijKWpzuIdV@#I?RpL*1ptA z`$!O5=hsI4x$5hrhw4icjnVsNc+pf)V(?nMsr;QkU(E0LVDF8m2KmKCez?@yC+(aV zl1G^iNHodMg!~)DQflKM$7<+>kihm)S6s>4Uq@|>)7$E6wRO`#4GS;88j zt?yb`;e0m{EEvxI$aFDp@Y%2{-)j7(6ggeWFP7|2Crj)7P&&a1eJe=a_1z0rrVIJW zm3#HHEv}kW@%IOGeXS%2n_erQKZ|22n6m+AiK(CV>(?svlYMuEiBM>FkhPWv*w?Cr zvR3`fU)86&6RKv)Jb!J*&6&eN*lUT%PaI_ZW%v0vX%mgQ!PY~Ew<)zPt}`avVlbD^ z#ZWky6!UZ2bNQ#&sF@}|b7We2k*cit!reoT-*P*s(Y&T&YGt*{FAYY9{rWjRmYjxl z%P?)qm0_VggzgDG(VlBog}m;|<-wg!VKsnbw$@i)yLg#6!73`9v}pATKb{ zOCcE#Mzjf?d3hkOB#?qoGIk zEWK;EuuLb1@;&cIJC%Mq7LrtsBmGZmA^-f~7N#lo>`^*YL(mFmY$uf zmm67a)e=qek&tv+)}%+Nb7;2f#m+kk+6Ma#%8m1yR=R<quO=2`rkQK7s`P{hR~Jh|2M!5M;oO)^vsS-piLrE$7IFmi@z( z*$)Qkbta7Fm(-D?CcmvFKN);#+nnkMTTO=@!))nsO@omJ97 zWcV+XE2Gbtkdi)b;wgE?e@9D)oQa!Xsq^=Se9!KQt#Uu+tG)dLiBcjpKB?PRM0?X} zwf~VrROfpFc|V)-7farZ<`Brb!$AG$*J*?Mps2k`KMIH9FvJWY$M+b zwo|40NsL^FE-SZ`#LUPUPRt}z_YN+&F5fTvn-i=bkZ<=#r5~l{&%e5~lgq06r|Wli z*2z%onpD%w;p^#$PWkW5l2WkbLQ+C0zkwjXcZ2+@U28$VB?ZXOX1Jr>>VUa^Z8GU( z=yPTNm-;pP@9y=Iub788f^uaHmOH3rp{bba_%mDI|52twoqDN6mYZ;KoqeY_H_r`q z#E0(9`Q67)7T5bHE(#Co_n)mZ`A1St^l&8O7d7T($@EXi`||v>g5 zbkMV<`H7wO__+3p<;bU-19H2uMbEHysK3BNGSI8=uy!@!SWm2ABzC1sPWJylW z-i5K5qnkrZ(TT#R7jqMp5@)o2{W_N}l`F~Z;K*61ShHWMT-RN9?Js_1&c*6Ioss&R zFk+89-Dqu0s6;u~NKfMgS=lR3C?u?es+JG_?2%1=Hf1kWJDY-cWAoek%-oH;O@6Yn z+DWF{27mm7<$nw%SxPUqWnY%Ptx6I%n^VDzyh@m;#@(&AzG|ZQ<(g$p>6FaI8sa9p334VS=WmHnpHebV6hrzs6_xp9cawh+-q0oSa*}Xts4AXyjm^)| z-9dgPw(X=VqDnfp$^>pDG_Zt!%jb!(U&<5 z{~Ek0&(DeLktNQhetu@{iEGwa-Jh4ObE%(q@Dfq7K=vyM%`#jS>gV*z?>=55F-qkI z?I_)cS}i?T!rbQJzka7n#s}-^_Nd$qvn7edN$)i$g!)7#n(dJ#5|WPoY_p7C-jyvW z*|v$0&myy9LtS$sSWuRqq)zW`Um!%1pIMuJVDq2G*Zk0YX{i)sANAXyT!}C)oGR3B zW|#bqVVA@zmaD9IX`eNTkD9I6B)2eTYww@MVd@iu=6uQoX-7uI5*MY^p=$Gqh#&gB zdaG5|9lUm8gQ-hR)GU_6*4Qw+DR^I=pNSYcCp+Zlr`(5B> zaz1^ySie6rtAAEjuJlFe6{8_#%5&8duU?|xo1ReCY`v?u*R1Z6)2oo~@A41JAvt^o z$qw}il$G$by+ghU|{Y}ix;-0S8)2D4oCUZ-aoscz3%kRgG-5h2pGF@E4*!+@O zcRaTCK3Q(gZ&lC2MAaOtc898!GmcVlGL?Rp@-M%ozhzXlEA?|^pvpR9$~8ye(U6vN zG3khV+G5E;>0hC!4swl}DBj9}a55q5-LUjPN0tmb$<+Beu5&3hBFkkUTPQBx${qe2 z|3!Ax;;?^`{AL&OQ;ltj-L(~S?tH!M=wZs-Xa=52F|g&0BcF=aHOY8-d?=fgA0;j; zSB~h8#3+UnYJzl+Y&O4dWNNCqsdm*ZQM0PB=S6j5Z$iGZpUy~SJLUG}@Qt6CsH4O2 zf%`V3q&&g$n;l(I{G33R#iZY?H|yjpALaSQhjmo%E#xQLDz)zVakp2*RHa{{DOG|K z@W}b4ZJs9zOZ}wF<`(Jv$P_)MT*r@Jd^t8HgXG&Z=pS_P-bEl6CSpu!KxS zzuhb~QiBOOBZ%v4yg61`8QDM7m8u(`GixG=u~l$ym4f z)WlCr3OVsC3mIWGXYO5QnX;vROZ-D#R=)gJUap#7mPm%cR#%$a`u!j1S zP|d>Y$PU*!|FNh(8rOHp{&lmO_H9`sM~kG4L-M6s*`eijb-GS|*j3)9)I-hcMd^f( z>I3&kd9o3H95M0wC0;4aFuSTB#^e_-&rizQ`>QuybL<*Frb4an`6*?^fu0jY+v>K@yp>C=*ith*@|qQKGVQn~)02i)?DYC&}31pTZU2YdvC)H4+5R zG4X7(zetdN?vJm*dl@%PdnKg(Q=?#%GVv0o14=OK%&RTk+RU5fvcxi5(Ur|7zfojH zWJ|m9zmjgB2u3XP;FQD*%eIcEgr`DmVp6@FR3)WkOG>?xlBZ;ru;p@RK!njpCgO!<4|e1)DM?v!v%#}u zV#`03lX$MFt3)^TmFHnrNj>amRAo%c@G4{BgozhQWm9GvPUh@{v?pi#&nsG5mYR4b zCs{4=42yxu1o5K&FCQtLt~PCxzXD;7?vg=z*frYLK*li(yl6zGp^2V+L?!X^mNG}X ziudGf*OeP>8F`pPW~@_nBr4Nt`2a9@o>f{c@#M+a^nhp#drIyUnEZ4&Dt+iOt zRtlXiODBfa3ZwhRkn5Nq&#O)Aj=3`Zbl%za35k~rC9Y_YcyjNnVZX$S>%__f!TKIs z@?D_gqVGu0P5BRvHLIouSrC${UM#9R z(^__NX^)nD&5`z+%`5ebNoP>Cas9Hn3VATDlcsLzPB~wY-W?GQKc0zef;gLaX1#xs z*d+~@cqSh|p3yU*5Kl%V+mC0yo@e68(Ba3MVETj8DX=>i#PekQGVww+LA+@p z*F;liW?etto9{V(e)8)me!S|SJIe<$el&?Am6rVcZY|TCT)>v+XYPWTV1Ccp#1mgX zKQmicHKx5Lt{+cU`$MbQZf2qMxnLqgTrg8xig(=Pws;^j!K~OEb^Y^!C06x#^Zw=9 zPXB_ZbI{4GaJ=bJZ;9;4vKLOQj;xobq|&u(!u_t*pPJN>UL?Om5b1OLibcE?egWy} zN`@`dW8L7r)!|nt+P5+%gM7l?-x92Elt#)>pHQoV_h)qk>-+4S%Gt`!%?aglww;*P z5RBsu&&oqe37wkJoiXd9-E*~BueUXZa-L%+S{h9C<(bZ%Armh#uUnhtx?AqXNW6Hi zA&A#d5yWdL#@i9ZYo8uWS45Rbr!vzm6VYAKXKBmTZbzSImOC9$8TA}_ig~(>+>Sg> zWBEVDsWN@iqg|~!Qt}(`vOX;1n&((vT81EbZ^;K^en_WX$8tSOKA7Q&xX&xy*hF;S^?Om2>(Ou6AiE*7@jRHdDZ8uyGX4@#OttywR_vy9@kCZ2px zsn%?#YC9J(>(lb6n;*}$(sH%h6mjJcC?V>~6ZjIZ*73s9*`1U$Ip=t`bnuLcC*4o_ zuxX2~47pZ9cJ+{nmyk!cJoBG9{>f{j`3YSKtxEn1tZTWKnV-Ow^=)!oZMAc)l8N2s zcx`5C;>mF}(Uu6cnL$hjTXS5ECZieun7JvQA19TICS(Va<8-Py6|R!bm9pdcTv(3# z!ySDC(pe*i=O3G5I;}KVj*;?t>x$`hvK7)1`MbZehlcWrP~7C<#VQ>$^&2A1tFUuT zwmDdcy)@J^=O3c5c)Qg1)_Q&}k6zp(1RoEjq& z;iIOuUj@H1eg%Hlds7FK-$zXS$|n5g`VIeG@5_veRwtcG_5Fr?)YLZd#+sh=y<_6Z z2L7n2iDnx75mPygn;>KEA7)yM_*Yu*80g>QxN4htzsGUf2Que>CjNgh^?_1j&bdx{9`U=*Lq53tqt0(i z>+Rq3yh$4Hd!2_##^&_uBhK%xUCMv|{}l)}Fs}$8fB*srAb