From 37e998eb7eda6216c1ea482d8f4c51059330f427 Mon Sep 17 00:00:00 2001 From: Tyrel Souza Date: Thu, 8 Dec 2022 22:34:44 -0500 Subject: [PATCH] almost spawnining missiles --- atlantico/Makefile | 2 +- atlantico/actor.inc | 2 - atlantico/atlantico.asm | 362 ++++++++++++++++++++++++++++++++-------- atlantico/atlantico.nes | Bin 40976 -> 40976 bytes atlantico/atlantico.o | Bin 48142 -> 51673 bytes 5 files changed, 295 insertions(+), 71 deletions(-) diff --git a/atlantico/Makefile b/atlantico/Makefile index 317fe0d..d8efe12 100755 --- a/atlantico/Makefile +++ b/atlantico/Makefile @@ -15,4 +15,4 @@ clean: # Rule to run the final cartridge .nes file in the FCEUX emulator ############################################################################### run: - on-workspace 6 "fceux atlantico.nes" + on-workspace 4 "fceux atlantico.nes" diff --git a/atlantico/actor.inc b/atlantico/actor.inc index b707c9f..c9139b0 100644 --- a/atlantico/actor.inc +++ b/atlantico/actor.inc @@ -12,6 +12,4 @@ Type .byte XPos .byte YPos .byte - XVel .byte - YVel .byte .endstruct diff --git a/atlantico/atlantico.asm b/atlantico/atlantico.asm index 0d65b1e..22a1246 100755 --- a/atlantico/atlantico.asm +++ b/atlantico/atlantico.asm @@ -5,30 +5,38 @@ .include "utils.inc" .segment "ZEROPAGE" -Buttons: .res 1 ; Pressed buttons (A|B|Select|Start|Up|Dwn|Lft|Rgt) +Buttons: .res 1 ; Pressed buttons (A|B|Select|Start|Up|Dwn|Lft|Rgt) +PrevButtons: .res 1 ; Pressed buttons (A|B|Select|Start|Up|Dwn|Lft|Rgt) PREVIOUSLY -XPos: .res 2 ; Player X 16-bit position (8.8 fixed-point): hi+lo/256px -YPos: .res 2 ; Player Y 16-bit position (8.8 fixed-point): hi+lo/256px +XPos: .res 1 ; Player X 16-bit position (8.8 fixed-point): hi+lo/256px +YPos: .res 1 ; Player Y 16-bit position (8.8 fixed-point): hi+lo/256px -XVel: .res 1 ; Player X (signed) velocity (in pixels per 256 frames) -YVel: .res 1 ; Player Y (signed) velocity (in pixels per 256 frames) +XVel: .res 1 ; Player X (signed) velocity (in pixels per 256 frames) +YVel: .res 1 ; Player Y (signed) velocity (in pixels per 256 frames) -Frame: .res 1 ; Counts frames (0 to 255 and repeats) -IsDrawComplete: .res 1 ; Flag to indicate when vblank is done drawing -Clock60: .res 1 ; Counter that increments per second (60 frames) -BgPtr: .res 2 ; Pointer to background address - 16bits (lo,hi) +PrevSubmarine: .res 1 ; how long ago we added previous submarine in seconds -XScroll: .res 1 ; Store the horizontal scroll position -CurrNametable: .res 1 ; Store the current starting nametable (0 or 1) -Column: .res 1 ; Stores the column (of tiles) we are in the level -NewColAddr: .res 2 ; The destination address of the new column in PPU -SourceAddr: .res 2 ; The source address in ROM of the new column tiles +Frame: .res 1 ; Counts frames (0 to 255 and repeats) +IsDrawComplete: .res 1 ; Flag to indicate when vblank is done drawing +Clock60: .res 1 ; Counter that increments per second (60 frames) -ParamType: .res 1 ; Used as param to subrouting -ParamXPos: .res 1 ; Used as param to subrouting -ParamYPos: .res 1 ; Used as param to subrouting -ParamXVel: .res 1 ; Used as param to subrouting -ParamYVel: .res 1 ; Used as param to subrouting +BgPtr: .res 2 ; Pointer to background address - 16bits (lo,hi) +SprPtr: .res 2 ; pointer to the sprite address - 16bits (lo,hi) + +XScroll: .res 1 ; Store the horizontal scroll position +CurrNametable: .res 1 ; Store the current starting nametable (0 or 1) +Column: .res 1 ; Stores the column (of tiles) we are in the level +NewColAddr: .res 2 ; The destination address of the new column in PPU +SourceAddr: .res 2 ; The source address in ROM of the new column tiles + +ParamType: .res 1 ; Used as param to subrouting +ParamXPos: .res 1 ; Used as param to subrouting +ParamYPos: .res 1 ; Used as param to subrouting +ParamTileNum: .res 1 ; Used as param to subrouting +ParamNumTiles: .res 1 ; Used as param to subrouting +ParamAttribs: .res 1 ; Used as param to subrouting + +PrevOAMCount: .res 1 ; Store previous number of bytes sent to the OAM ; Store enough space for an array of actors ActorsArray: .res MAX_ACTORS * .sizeof(Actor) @@ -215,7 +223,7 @@ LoopButtons: ;AddNewActor ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Subroutine to add new actor to the array in the first empty slot found -;; Params: ParamType, ParamXPos, ParamYPos, ParamXVel, ParamYVel +;; Params: ParamType, ParamXPos, ParamYPos, ParamYVel ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; .proc AddNewActor ldx #0 @@ -231,6 +239,7 @@ LoopButtons: adc #.sizeof(Actor) tax jmp ArrayLoop + AddNewActorToArray: lda ParamType sta ActorsArray+Actor::Type,x @@ -238,14 +247,239 @@ LoopButtons: sta ActorsArray+Actor::XPos,x lda ParamYPos sta ActorsArray+Actor::YPos,x - lda ParamXVel - sta ActorsArray+Actor::XVel,x - lda ParamYVel - sta ActorsArray+Actor::YVel,x EndRoutine: rts .endproc +.proc SpawnActors + SpawnSubmarine: + lda Clock60 ; Submarines added in 3 second intervals + sec ; + sbc PrevSubmarine ; + cmp #3 ; Only add if 3 seconds have pased + bne :+ ; + lda #ActorType::SUBMARINE ; + sta ParamType ; Load Param for the actor type + lda #223 ; + sta ParamXPos ; Load X Pos + lda #185 ; + sta ParamYPos ; + ; + jsr AddNewActor ; Call subroutine + ; + lda Clock60 ; + sta PrevSubmarine ; Save the current clocktime as the submarine clock spawn time + : + rts +.endproc + + +.proc UpdateActors + ldx #0 ; counter of how many actors + ActorsLoop: + lda ActorsArray+Actor::Type,x + + cmp #ActorType::MISSILE + bne :+ + ;;Update y Pos + ;; y-- + lda ActorsArray+Actor::YPos,x + sec + sbc #1 ; Decrement Y Position + sta ActorsArray+Actor::YPos,x ; + bcs SkipMissile + ;; Delete Missile + lda #ActorType::NULL + sta ActorsArray+Actor::Type,x ; + SkipMissile: + jmp NextActor + : + + cmp #ActorType::SUBMARINE + bne :+ + ;;Update x Pos + ;; x-- + lda ActorsArray+Actor::XPos,x + sec + sbc #1 ; Decrement X Position + sta ActorsArray+Actor::XPos,x ; + bcs SkipSubmarine + ;; Delete SUB + lda #ActorType::NULL + sta ActorsArray+Actor::Type,x ; + SkipSubmarine: + jmp NextActor + : + + NextActor: + txa + clc + adc #.sizeof(Actor) + tax + cmp #MAX_ACTORS * .sizeof(Actor) + bne ActorsLoop + rts +.endproc + + + +.proc RenderActors + lda #$02 ; + sta SprPtr+1 ; + lda #$00 ; + sta SprPtr ; set SprPtr to $0200 + + ldy #0 ; counter of how many tiles + ldx #0 ; counter of how many actors + ActorsLoop: + lda ActorsArray+Actor::Type,x + + cmp #ActorType::SPRITE0 + bne :+ + ;; Load Params with Y, TileNumber, Attribs, X,NumTiles=4 + lda ActorsArray+Actor::XPos,x + sta ParamXPos + lda ActorsArray+Actor::YPos,x + sta ParamYPos + lda #$70 + sta ParamTileNum + lda #%00100000 + sta ParamAttribs + lda #1 + sta ParamNumTiles + jsr DrawSprite + jmp NextActor + : + + cmp #ActorType::PLAYER + bne :+ + ;; Load Params with Y, TileNumber, Attribs, X,NumTiles=4 + lda ActorsArray+Actor::XPos,x + sta ParamXPos + lda ActorsArray+Actor::YPos,x + sta ParamYPos + lda #$60 + sta ParamTileNum + lda #%00000000 + sta ParamAttribs + lda #4 + sta ParamNumTiles + jsr DrawSprite + jmp NextActor + : + + cmp #ActorType::MISSILE + bne :+ + ;; Load Params with Y, TileNumber, Attribs, X,NumTiles=1 + lda ActorsArray+Actor::XPos,x + sta ParamXPos + lda ActorsArray+Actor::YPos,x + sta ParamYPos + lda #$50 + sta ParamTileNum + lda #%00000001 + sta ParamAttribs + lda #1 + sta ParamNumTiles + jsr DrawSprite + jmp NextActor + : + + cmp #ActorType::SUBMARINE + bne :+ + ;; Load Params with Y, TileNumber, Attribs, X,NumTiles=1 + lda ActorsArray+Actor::XPos,x + sta ParamXPos + lda ActorsArray+Actor::YPos,x + sta ParamYPos + lda #$04 + sta ParamTileNum + lda #%00000000 + sta ParamAttribs + lda #4 + sta ParamNumTiles + jsr DrawSprite + jmp NextActor + : + + NextActor: + txa + clc + adc #.sizeof(Actor) + tax + cmp #MAX_ACTORS * .sizeof(Actor) + + beq :+ + jmp ActorsLoop + : + + tya + pha ; Save Y to the Stack + + LoopTrailingTiles: + ;; Loop all bytes until we reach PrevOAMCount + cpy PrevOAMCount + bcs :+ + lda #$FF + sta (SprPtr),y ; set Y position to $ff to hide + iny ; + sta (SprPtr),y ; Set tile number as $FF + iny ; + sta (SprPtr),y ; Set attribs as $FF + iny ; + sta (SprPtr),y ; Setr X Position to $FF to hide tile + iny ; + jmp LoopTrailingTiles + : + + pla + sta PrevOAMCount + rts +.endproc + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Routine to loop "NumTiles" times, sending bytes to the OAM-RAM +;; Params = ParamXPos, ParamYPos, ParamTileNum, ParamAttribs, ParamNumTiles +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +.proc DrawSprite + txa ;push x to stack + pha ; save value of X register before anything + + ldx #0 + TileLoop: + lda ParamYPos + sta (SprPtr),y ; Send Y Position to Ram + iny + + lda ParamTileNum ; Send Tile# to the OAM + sta (SprPtr),y ; + inc ParamTileNum ; ParamTileNum++ + iny + + lda ParamAttribs ; Send Attribs to the OAM + sta (SprPtr),y + iny + + lda ParamXPos ; Send X Position to the OAM + sta (SprPtr),y + clc + adc #8 + sta ParamXPos ; increment X Pos 8 pixels + + iny + + inx ; X++ + cpx ParamNumTiles ; loop NumTiles times + bne TileLoop + + ; pop x from stack + pla + tax ; pull value of X from stack and transfer to x + + rts +.endproc + + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Reset handler (called when the NES resets or powers on) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -274,9 +508,6 @@ AddSprite0: sta ParamXPos lda #27 sta ParamYPos - lda #0 - sta ParamXVel - sta ParamYVel jsr AddNewActor AddPlayer: @@ -286,9 +517,6 @@ AddPlayer: sta ParamXPos lda YPos sta ParamYPos - lda #0 - sta ParamXVel - sta ParamYVel jsr AddNewActor InitBackgroundTiles: @@ -361,6 +589,9 @@ EnableRendering: ;;;;;;; START GAME LOOP GameLoop: + lda Buttons + sta PrevButtons + ;Perform Game Logic Here jsr ReadControllers @@ -368,26 +599,21 @@ CheckAButton: lda Buttons and #BUTTON_A beq :+ - lda YPos - lda #ActorType::MISSILE - sta ParamType - lda XPos - sta ParamXPos - lda YPos - sta ParamYPos - lda #0 - sta ParamXVel - lda #255 - sta ParamYVel - jsr AddNewActor + lda Buttons + and #BUTTON_A ; DEBOUNCE A PRESS + cmp PrevButtons ; Compare current buttons and check if A was previously pressed + beq:+ + lda #ActorType::MISSILE + sta ParamType + lda XPos + sta ParamXPos + lda YPos + jsr AddNewActor : - ;; TODO - ;;------------------ - ;jsr SpawnActors - ;jsr UpdateActors - ;jsr RenderActors - ;;------------------ + jsr SpawnActors + jsr UpdateActors + jsr RenderActors WaitForVBlank: ; we lock execution lda IsDrawComplete ; check and only perform game loop call once NMI is done drawing @@ -433,26 +659,26 @@ NewAttribsCheck: jsr DrawNewAttribs : -;SetPPUNoScroll: -; lda #0 -; sta PPU_SCROLL -; sta PPU_SCROLL -; -;EnablePPUSprite0: -; lda #%10010000 -; sta PPU_CTRL -; lda #%00011110 -; sta PPU_MASK -; -;WaitForNoSprite0: -; lda PPU_STATUS -; and #%01000000 -; bne WaitForNoSprite0 -; -;WaitForSprite0: -; lda PPU_STATUS -; and #%01000000 ; PPU address $2002 bit 6 is the sprite hit flag -; beq WaitForSprite0 ; loop until we do NOT have a sprite 0 hit +SetPPUNoScroll: + lda #0 + sta PPU_SCROLL + sta PPU_SCROLL + +EnablePPUSprite0: + lda #%10010000 + sta PPU_CTRL + lda #%00011110 + sta PPU_MASK + +WaitForNoSprite0: + lda PPU_STATUS + and #%01000000 + bne WaitForNoSprite0 + +WaitForSprite0: + lda PPU_STATUS + and #%01000000 ; PPU address $2002 bit 6 is the sprite hit flag + beq WaitForSprite0 ; loop until we do NOT have a sprite 0 hit ScrollBackground: inc XScroll ; XScroll++ diff --git a/atlantico/atlantico.nes b/atlantico/atlantico.nes index 42ea5d88874083bc87ac98e790933314fe5db845..c003e5019f50cef27f23eccda9710ed6393e4243 100644 GIT binary patch delta 849 zcmZ9KL1@!p6vw}$UDlN@P1iQfx;1{VQ$g@DaL3`r8glUHG2WJgpm$jk%exE;9iy=0 zn7qR`5GK;Y^wNVuD+s}p=)oPdI0VT>q%hF;WovbYk1zS&|NH;mWC$|9m~%gxgSHU_EypCHL%vRJzUuMs*N&nS*TDIpTQI-P~#s$TmX&SRtDSPIbMdcOf?--eoa2$tYb z7YZ!%N#wqdM#?{`M=B#VJ5#eWHK>WZBr8|U>P)VY=|A&jK}p8F7wxxRuN;@e@7=<1 zw%pTb3s$_H)*-_hMbX+VjIANo<+r(8kWDm)-@Yuzr&~wfUP-wf=uiYhJOWi9WOyYM z8a0hk(^k@^QFT>R!Nkn;SR_>kgWm{ImppxJpfTd{4~iG*x=za25R3+dPSe}l>1_@= z8kV00Y4|P;LF(9+j;?gD&K##D?2f{bfx=mctQjU%xxZ18MQX}rLG(-cB;;nq-3W8Z zIpK1y(r)dv_FK8}yihxpP1Kw7aY5EfX_aOG21TyL8NMA}q*|w3X=0g>2D-T!PtsR1 k8SALWnw(@PqArV)#fk1*@x=r6{$uTCn?HHkerkmL4@0drZvX%Q delta 535 zcmY+Bze^)Q6vtW6*v&&N(;-lSk*{w(LPH(L<%bp`{5O@Dp9Zwif8?9(MR#!7kh++QK$j z=##Tt^teN!f~|z4v6pj2>I(7)u6rz!d^1;C@KbQM=pMgy14>ds9F@>0?mrY`qnH|n zNXx*X*Ha5XBqaJtu}Y3EEf1q#-ex4XcxH$@d^j8&4So*Xc~#q~ze}=T&CMX}7Fqom t6<0QL2iQnbSLPM-73h&PUdB^T%ig(m4!)l^Iy+XSH?a=KlV6PlUI9{{wAlav diff --git a/atlantico/atlantico.o b/atlantico/atlantico.o index 3134f7c18654eacfb987fff72cb9fda97d2957ef..1b1677470be550dfc461269d97f98fc1bc6627de 100644 GIT binary patch literal 51673 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 XfU@$6!hwSZR8$s6aMZ&Q%W?i6^Bii} literal 48142 zcmeI53w#vS+5hJxfdGoIGrNkdEi-6Us9FP738jSG6!;@z5{6BxEfMop6oU=H*S5S6 z3V17czaU;vG^ndp>%Cr4TJa85tJNx?s93E+MJs4z-rw^(o6X72F03N|_x<$ED&KwP z_dMr0&zw0kyE{8OneeN|`iNy&lkl%6{!PKZA^3L{{{7`9%lgI5mZe}fC7-9`ISigMf6YBtbuUy$Oj|g)Es>YMv~Hl9xPT}4|EMgrzdDzV z&xQK}bu*ML1fK5V5#weH#syLWp5sXep0Bmk z-36BVgIcP3skzpi*%&O?QrUwAR$ieiPwGkayt49^yDC6stJP#neJYrwerBmw^H+jSMa}9tO2%=C zOgc47GJK>fWaLN4-l{fYG};^MoEzEpjr^XYI~u!BsUkR{bU>6j?H4Z z@`Tw_E;9i{58KdZ=h51RkcH|+jC6Nbo)A>aHQ+X>73cTq1DAeR4dm4L94q#FHK1cn z2T0ugdSc)S6XRe@J*_TAsjJm(5I!R(sk1mp^YyB8BhN>v*vQWz6k7+Oz0?h;sh_$Y zjw$=9i_l`e+K^n`j?KJ*nVMJwr&yD0o5zr5jCunJ#;8BjK1R$xAa6hQ87BOc)gNStddX2}0m7GB>bG#NQ!k>?U~-d! zFhFpR`b%%T0ILt}~KR^N9)FsH3P#3~GR(+JuUSE^8 zA39E|9t>V@Ry;~M6R{sOB!l_~cU;Z%uxH#sF3hgU)iiVWhF$Z|$r zq98!4zvB6MjL*^l#tI0F@%&GOy@%)Ll$C#;<%*RDONsS`SbayrdI8OD76V7X{Dpgo z^=^Tce^8!;-HWE$x*JLRLRpMnzeqlxi|41YDKE8P9AV{OZ7CS{N*^WF=eG-{|PhZODz<-BPY<;8f&%YCu?b^$NqzHzwry*lSVw zwQmaxo zG4Oo765K1!$NILa+jLv5)@_V=+$iXAl-`QhjgD3Pj4|hEg|(fdSLP`ey+k`$+Y*M} zrw5(I-G>-gt<*a!t6Pa<9jbeUp^xZLZjDF8VX5VMqZk|R4)$}aR=AmNW!80ioqr(f zypF3jSFZ>+_gt(1FR4y6`xo$fMc!7GEy*+KLz|&X(4Ag_jvs!ht)CYi!(>9LNQezdC>Y15fk1y*K z+!`-Kan%AnO<3~+bn~uSqpRZPSR(^-fjTESPD}N4`49)4h231$Dl(pLlrFxj{sT+M zxQyd}c|otamb#p4wOYx$|J5jYV2ipB6>d`R!Lc{ls?O4*#C`iL>7hV91NVG2jHAKb zXqXJ=MY?+KMHg{>-q8wo>vy2Eszvgi>w(30@%*lOR&P}ve4mve&r@&W0KYIg zQuUCsE-|LlCD?ES3)OQ-yIQ@8PIf0}m70U_`D%ZLb6V^#&0CDE+JcA!^Va9xiB&ua&!1xXCOk*=;uyRY z!_wtY#k&gQH&U%d>_~MB?0wW{@bn=EkXq3^g36DLn6Q4R(Msph@$LFT^wJ0KX)Sdy z*_Ygh)VfRi07KW2L#gyLbRGXKDuYQ!U4*F>rc2%11;j@#^f-i!8ToD67FiVH1S-A} zqaz))2IH?e!?0c2-cGPAOWXaZA4bLu+O#dQ$Y3>X-=L1sbX2jF4>YDMS1j)3#`s4lEo^4-`U})moe8hXB)Ol+sm0{p~#AmqO(P*N5~Q~M%ttmViA=( z(hqqZwV3l;*l5@;Z7*k5gd!_Liq1BG`d~6<(58*gG^oU65tTUUhrEt@nBy;;Vc0Hh zFK1SUB99CyI@|u#4<};=ZQ53d$5J_t^g~`pZRY+doM+fBZEqLw0OmY`j2X0P<7^!& z2{TUJ4|yGR73&w)8@5Z^+XXz3Ifs%lgEnm|3y-7jhrEt@g!3nzIClcw+Xaj=XM~Iy zv}s#eIFY&^@;d7G9RGB>)V-W}RF=q5A$SE4s;Y`DJX?r=dBIn2`BO_$YpiSG#!im)Vkk?TYWPSisQ?r%CvR1@6r21QhPORD)=CVdL|jRR%)pDA>C20Vw-8sGi;Z(w-bzIX}dr5!$}>Z zX;ZPXFizbMc^!2gk1xVWhV9b!zEQ@Q?Evx!QY)G^6)Owl)cugxQJ--B2qzh~OWWHC zjtaGnQ8|D-g4BwpO~uN>{^$RB%Hr_u%!TZOr&Cyxf9!PyCIl_p+`$zPJ zca9l}_m9x={xQw#s5wx=bg6qg!O>aT4xs)+vc!n7X8z#hhrEtDR;E8NGiAAAc{@h=jzgjn5)q6`1>0g- zopG!z)(ZU24oCftuTR36hV9b!a%M%&kx@oQ$PzL}+9WOrK_y`xN8Jy39d&|?FEArz zxng-cM#YXp21-bA=QvvytqhnTn%~*s;2I?P#^T;fbV+{RZ+Jnepu62wxl#j-MBqG*0+hoi3G_@>jP?(G6bnKMGhjQloji!2Ip0u`SO z$i<|iPL%NlW~3}vEbl8LmTJ*qMMaAUs1dd-T7se!s>SkC2*j!r;LLMgI~xrf=bxeD zjPchd&MKp=Nu3SnpP}RYGdRMC!TDz>IRBhRoPUN=MdJK3?101>Y1oc>FvZ!1jjxfR zdpWZ#6d9vpQfG@&kB}usj7{4Lv4~0?>63wBJL(qJFKjeym$sKPD?*VmDkgQdDD_Cl zYg4g8ETR%8eKH_xNk{z^+e~wYVY{@woLL!)j8V}v^F*mf46lx{so)|f)MN5kD#wvN z8IX0Pqn2^}h4Ty>U-?7vcA7C}(A3$YR3e71y*3pq3**#%G9c?nNBx=g3+oLV*MG47 zZ=O+Rj*u~fHf<{lkE8CB0a-^n>g)oUKk0O-c)Ng6=8TXrgEnm|3nx2#@kIrFG2k)uL-luCpgLB>d%w6ZWx-6s=9jHAxw_@~pQ?&Zv~ERkbEdX!3p97o1T zo5YnPs3*)?>OPq;VlZ=f{7EO~4|L3*99f=o=?Z@yUeYb<_wcA2=grxng-=1u+RG(wZG8j-e?pLu^^Zd!G>E zqWOYE%8U00{CqF`wPEA^0TjHVe+}Y20a}?f^9-c7I242T2WW-&2N_vS9q$j|O&Bqb zdJ1hc8x7l~?R_oAj8>-IpZXwj7&)BOF*a?BtT$|})KKxsgyD76cqt#4m$F>3yswN{ zh872k_9Fqkge{9!2E;}41&Nf`Q7ss8%}Ivs()PYl#+WTiMo6t_+ElD8j8pf?gc0MY zvp7G5_<2dnc4>P%!BL^MF)C3qLTW|RrebB`@zi}XVZ=D`M%pB< zbm#b|^Em20d9o4XsCThPYtArim$sKPD{_w9kCBIk;%zFp`kKd|bWWh|lZ%ZQM}5ih z7tS+mm$sKPE3-t7q8>9Cr5!O8-HT1d3bBTYZ!lrRIO9Q7217^mWs0lAoT)PKqN0y9#UE0*__QI?@aRJ4d7mVzyo zB`8XPi^t2NF9-y60!LlR{ZH6v*e-2vCs>}PZIpV196`oNo3uhKq7o;4G9c?nN3nch zcFJS1fPGsOTJ0 z*?Ex(28cFT5KF-p3;&rYlEt{d7X&HGQU7F>!Wo9`()My@WhnB zg?KELIO&rCxtMg+7d$=)=NYz3+uH>^fH{vKV+L*7_}MWk2{TUJCj+vUbkuJ+{=$00 zc4>RNfCnuFrfp^61nNE+kaZ-kpXdAUbmIDX=(v9V8)uX`BP6b$M}AFQKMxz% z&!=%B68$N5i$etC1Tldvuri=pG+&TNc^!3t)Yl2FEP6Xe`Hn;OlaRv%C4!j1 z7FZb&7tI$WQeH>>5%WTGreV9Zy_{K*b7Yi}5i(}brfp?moVrgYj2K64;qgy6)v#UK zUe2t{IWo$~2pKbI)5e{Ic>GIeoVrgYj2K7#ScV@sBW1Z_dEW@4k|iRDrC^I?Wk6gs zUyw+79rY-W55iv?woBXF1&lIhgp3)qY2!Xes3go<>OPq;VsK?AUtffchK=hxq2T(? zZ=6x)jF2&dxV{s8;mS_%1jE)!oC>b*gg0S$9d#Y&w{V_eyR^Msz=6zJOvVh_v~kl8 z&hK>AQuoP(5#y*8JiZ7g8MaH?`-T`}p8n(@av1qzQhROMRu;yo`((n1anwuLW}1@> z+okR81V5~Z~2H(%~_>oS0KMx(>&wp*=Msyk5;`$Eg zxV|Ih#rN~D@%=oA@8{EaEERk|4;|mngZO?v72~L@IsU@a4cn#d<;=1iB4dmhNEVY? z(X^>pSs178lL;fnQS-4bnoWl7()My@#dafO^d3YGB8QP9NZpG~8+VJ~*rqd1-6s=9 z46g5E{lb}sjqCfM;EKE)S)N1WA&ePB4kO1It#ExG`oi^nX*`xnoW%8g@Ft8HN3F#x zs^(0?c4>P#vm%Gc{)`z!4kJs*7-^GM79LOCClf}Dqc(E>3uhR%OWVtt6*)x47;_-` zBeKM3Wz)8@a3Xb|Oc*h^J{wy^bDm-2`fTX9K08NNW{DhS=(r9W*`j2G)Qau}*Js0v z>$5X5P94{0!<#T-aAhUmzX%%)8`oDt!F7>2^2jWaV+iGQx zya^))=ZDZHOq?Hrj`Ks`IHSxNA#r{vl^^GaVB`D{{uPB7r-JiC@Z$UsxR`X*ccgq^ zM#^%<^1d=+8Cpa|iwNi?Y+1AfMJaGGE{nb(5Y!1A^;?X%W}{)dw7s2REKA!c^$4kB zG;J!l-6ZEn2aBl0NuLbJIuhT1V~^FGZP@t!8#=!K&XM>gJ1sJ-=xq4@8&K6~4gd9QYNc?^h zec|_$X)K~rL*n<7@CJtMs9#C>z>JjTisfw=W#Wx>4oO>Nf~bT<1mjXIY_Y7)I93+p z0$&ga>IC@wj}h0LXW01s4;`QXcgXS_V$3}F{EwXY{11*JaTWkJKL3OGw4agq{0|+U z|G|K)B^}i)3_yQfr7ZB$cQ!#kuM;pzlhK<*M=y?6#4o4YYyoPTl@;mf? zmmEY6BZrf^EnfeT0k8iViPwMVc>Mo!exI#=M2;Y1 zq)l2`7^m)&2_wc)lVtdTU#BcrEH4|zWOHO{5tZPGV4NT(umw0D7(!e$Uyw+79d#MU zSJ-ISE^RLhW7J1w@n&nK^(b3K$Z@33X4AIF$%d_!I2E5v7+$=y!n$hCGi%v$O`nJ{8-e$*^(%E$F!aR*uA-w9+E8DY*X@ zB60sM(2T+Tx1iwuTNxRrj{9%Hn=oP=^#+dhVY<}499WhmCYD7XNWGXeV{9r`7RIUj zWWtDX)S1{KVY<}499W(uCKl2UqB4jaMh-V(Y}!_c8_zrZ3 zkvb;I$Ovh+!uO}hfbUP!cq|ose+nJnpMv=QG!=t8qjCNSXBsx{j|K(zN6V48$Jq`e zbxf3z5mGCfxIY>);QnYCiTk5L$Nka3gc0MY%h5)2hGDz3y_^}#AyUUg85tqXRyGyf z{+?r-&f}^3WWtDX)ZN&ZHRl<&OWVttu`H3MuI(rzBc$oIso?Ko@z|2iICY;)7%`6e z3&&sBVAw8gFK5QGL~7k+l#vnA)NLyG12-K1bjGRsWWtDX)IA*kbh^~NUBCg%Ihc$Y zv}xmy_Hg{u8K>@(2_q&@KbIY%6Bf&&)fs_06B1te(pX0YubLdS4hHIK?rG_)qmEZ8 z?xh_J)ND!Lj+4b&CcuTyCIa;=KjC(8F_l`<3K7?;V>}We)=|OL?i{TS2I@|(VLBI6 zw?YimQ_P>vI_miCEAw|SP@gk@2kWRTCan+yRUzfKW3gCu0;@9uwVZj=Sx4OpF;M?t zd-N+ZQOSZI_^rA#z56ccqi1!BFZ-rs0&#~I_s!gAqMI=$=eBa zvS@Wiptf+kq;oNKT*b%j(!oH@cNmsv z9l&=>tRtQH=7|-gGf=m4KTGFg>iBb5+|N1~s3}rMC)CO!{uG*tK=qTjPNMrI@XDxLr#6bNWGawP7 zPsIu`P@gb9opsc4S5SCO2I^jpOFC<*<1W!0mktK%_l!?x9d+EboADhyK&?QJr;&J< z2)jGEObwC`;s7q*k^o?t`Wwckp0vm_$YuEBa&oPrQ2x*yep^m1Q%6~9vcM9Yt&ZxB zzgly$CBF#~>y(r=mDY*SPPN7;6?K)`nCIrHHo*_E^l=_=j{+VQ>vgeO@u$y}4P%2W zT_O4<`H*fY0D59+eLgT2|DF`z9{6`pfjd}Dm%hKv9vfgaT76YsUpevhcZ^LXSxtV6 z%u}~QSL%a&;UbQoBdhd0&6~(O;lz;OUuO0=%(A9gEhAN4OAiZwe`VzI6(ws|s>=#w zVR`;{mZKcKU|FBO|7Fm=5d18LO+ru4y{(an2}w`kUO_M+(b49o*UV~bZ`1b4q?QiP zuYNhJq}@~UgYKx0*)CXQNY5F{paw7Graqa77|e$&WykIG-s_Qm>Sw*2My z;}0FRr^Z13TP^JI-$q$kXDzBhtS@T-G+A6=WPY@h7n`5vJ>pybSrWU=hyrrdO zxuqB6&+z2+>7(c=%*P~>nIv1GWu$vS*&$!(Y%R;zZ3=>ew$Xzor#&>s+C6PGZ5`RVwy7S0)KKL*Abl;XZ(qGH z^z93CXma5|CP*$=eTU-FzK|!bk-AMmL7#nwo;Im#XZp$m&+*;ixb2%CVE!k=@@*{i zPY!$_5AE5bAV|m(Jw2>#+fp8@Z*WV>BR#flN$qnjEy1?7EoKG!4F(IdtWFC$b<$%l z6qpG*E$pHJ(KVP=w~x;MfJcT_9xO+j$%W)l{SVgGRe^lu(U1Qn)1|ANu1(VZ;alcH z*R<>!gRXg?kBVLULf5{~wJ&t-3wi{)_Jyu}p=)30+86%KKQBzMc-}^zKj^f8Gn;(u z;LHNf07+zq6A+!wMli-|KQ#fDveMD#K!&jY<(_{1f?31c$8F=rAXv+V;rgM6 zYOQ|gg+%kvn!ZEZ^cP~C#()b6YeIWAF7II6IM(@{#=1|5P9R$f51jzU8SM)hw$D0! zVr{$G3Oi++oys;`bfcftLSVHl50)FA<-sQXb#9PfSQwNfJqiu_2eWmd(pVnhF$mUe z+7z@UJ;)kt3AQCyuHWzxvu9^&BXb8sogo{}JogoT{&ncu=f z{dI0y8#6)YY)H0lc}uvTS+bgVXpe5Mhj*5CWblY%tK6oNRhwy_u;34&RfYD?zMVc@f;PI;DZ!tRSl zmTbe5`)RVz! z+Oy61Y{k}&Y+ru(MzCP34qLzC;vs5tdz;6Cvr=vHOY)62kDs#m2Q#b@8I;1e^S-v)SY;Dj& zk18q2FDbzn(LC7Evv!H$DM@FoZ>*#rGNl8)h70HbitdXLVRihUa-Cp$;z3JFy z4mO-@I^EAUJTRnOcysI4tuj2?^ZKisgSBfHaiMs~0euShElPSe$|G1#&k{a5vc3Fr zs)C3b*inIWlk)7{Q+Y-0waI*IuK-&IkM;`SX?rX=1{mmK3{SEGY4iFQkFx@4;|-bL z;n~t&HQE$)RK4oeVCA;tnw~YJWbW2fKOCJeHZz+Zo#aHqh<4N_m37pHv2MeR)1y;d z9GSavW3mExwte)xo;$_G1C@%juPIst8{0i-F*oJ;=%co+UnDEI;)*L)U;`zyorzvH zw9k;O>sOwSU5lOKFtu?N{!cC}SrXuXE_|K6zN^i@`NzJl4cxVXL+?dh^N!6?kX?8mzrzM`8KZGRX1u|$%(x6 ziux?kD|zVnN5K;XVqBglPk*AlPRV6-&no#b(<{`^Ay-nlDqn*3#y{%?2Id#w$2zae zDN*YraeY@T{0V0~o@Kjz3ktehjx6`I(6d+2t-H04Xs1dLZa0U=HQj_?J~N{S{5NKb!1lVbss# zio8eXezF-NGO#PSJY9G;dw-PaKB2sxe1^m?=kd6V-ZL3_H+B3P507hE)_;h-iNaGH zj?Y3sXKpUPktkGAhNnpA7pZ9l)*eDR+f)IHmr==5v_pb;jIC zE~9=S`Ey}!Is8PVuWPw(ZFJqi;CZ?d>c64#IF;u)OrLQTKcO9y1mBin`JC!g9E97s zZWpr6+ic$~+1Id(+sGcWI=|=IpCH01f>n&&UtCLQUP`Xu`klvg%c;D|h95Fh3&&sx znp=OTyn%d*&cD(Afc7n1pJn8EOj#qk{IJw|fD!MIMZzAkQ{KYXSFy`dQJr$5qn7Wp|@C>`{XRoz_*Xb|x=Hv1?2D{0?P`$qCz zDvQVjl{PfAtXA5M!Z&FSl&l+B*(UNF%8#<;A!4_1EPq3OOQQct-?yappGv?-Y2bZlTau z=GD2}&Q~!yL3wXUwYwb4uBRH6L0rhK`CGQWo?&;g?E9!R316pqH|5*Nn;7Ve{x-MJ z63Tl>zlD-@HM4%e^_80{SU0f68$j7MPPd?94T0ngXBRA51kbQl~etXC$Tt_)3_5F)IJx!sT4AwO?3uWc*rMZd` ze`P-TBb#_P$bJImdyiaA?k2e-7Lt6)HR>lT*ImRbnP~wt;a=-_%x8-mSy_MC86Kuk zCV~AWU>RN2vV0EPUC+J;NYNFdZsB;%XXdlXm=x_vz>BQ*8m4@SzURsNsr-&D2T93Uw*Iwn1yfu^&f)RpGRAe6&gU}jd^*?BevtOHOn5f! zMO=?9^sc4yAroB0m@8=?D2Lih=&Y5%xS+2T_&c`yn67S8+FmkvXL9)$R`2@esr8M` zQzlP4q<;FT-mlczOKZ=Qb0l*Y+D#*d%y zv+|m%u{4e@t^R+#M5(SRt(j2W zZo=5H-N%nDt*xx;Sv{fb=+dgu<0^ZUj;?|>uCnmx(bd(X$5s}U9dmS9VfFZ`(KVHa zc4O-TY2NLS=~I5yP!JzKZF)hiAnrFzEvN;0HZ@FdXlA!Fnx{Xl}+pcRRAF z{?vv&Mo+J3s{haOX{VkxwV}D8uzc#Y$)_BCXt%PTk8f@&j8{)?nl^Q6@A4Tvv-H}~G<~)mt=K9`Jzpe#U z?NL@g`IMhGO`FkpqBwi$m6Lk+=rAQK7tyS=xw&b|3DbM)=NZinshlZ=p?XPL?uPZ0 zhO+f~vTRX%RW_bjH4UTO*kBt0HPaZ;b6mq2&1})FN;XOFiS<*Oi>5dGW!N=N=}|tl zp}wiA^k~Y18&A}7@6nA@n*I8wDKhHQ3y!Xz(%1{Bt50j1(%f)pPnhGU*8j4h$&t8@ z^{$zMXuGq7=Tm5z}-^g{>`)-OEpEn0!j9-Ucl1$Z1Ww zy!>%TkM4v0s=B$psTuoL`Lxr1xkqY4u-$GL6wDFYyO&R`KlQYt!9yWT@6$2zboSK~ ztz#wnRyF(wChtk9igvGVXqKWlLHl6AoVNL+tB&oZ$Az1(H;x()Kyj;Grshw%I>2oODig?x|NSAt*S2cvCm_FwXFXJTQDTt