From 6cdb2c61dba0bfa8dbf34b0ddf6928ce2136592e Mon Sep 17 00:00:00 2001 From: Ruslan Ignatov Date: Mon, 5 Apr 2021 21:19:19 +0300 Subject: [PATCH] Fixed BG sprite glitch. Minor fixes --- Background.py | 38 ++++++++++++++++++++++++++++++++++++++ BackgroundLayer.py | 27 +++++++++++++++++++++++++++ BackgroundLayerFrame.py | 25 +++++++++++++++++++++++++ Cloud.py | 2 -- Drakora.pyw | 25 +++++-------------------- FlyingEnemy.py | 1 + Player.py | 4 ++-- StandingEnemy.py | 1 + data/background.png | Bin 3821 -> 3813 bytes data/background.xcf | Bin 13599 -> 13357 bytes 10 files changed, 99 insertions(+), 24 deletions(-) create mode 100644 Background.py create mode 100644 BackgroundLayer.py create mode 100644 BackgroundLayerFrame.py diff --git a/Background.py b/Background.py new file mode 100644 index 0000000..92bda5e --- /dev/null +++ b/Background.py @@ -0,0 +1,38 @@ +""" +Background entity class +""" + + +import pygame +import os + +from BackgroundLayer import BackgroundLayer + + +class Background(): + imgDir = os.path.join(os.path.dirname(__file__), 'data') + backgroundImage = pygame.image.load(os.path.join(imgDir, 'background.png'))#.convert() + backgroundImages = ( + pygame.transform.scale(backgroundImage.subsurface((0, 0, 800, 150)), (3200, 600)), + pygame.transform.scale(backgroundImage.subsurface((0, 150, 800, 150)), (3200, 600)), + ) + for image in backgroundImages: + image.set_colorkey((255,0,255)) + + def __init__(self, mainGameClass): + pygame.sprite.Sprite.__init__(self) + + self.layers = ( + BackgroundLayer(Background.backgroundImages[0], mainGameClass, 0.5), + BackgroundLayer(Background.backgroundImages[1], mainGameClass, 1), + ) + + + def update(self): + for layer in self.layers: + layer.update() + + + def draw(self, surface): + for layer in self.layers: + layer.draw(surface) diff --git a/BackgroundLayer.py b/BackgroundLayer.py new file mode 100644 index 0000000..79a4fed --- /dev/null +++ b/BackgroundLayer.py @@ -0,0 +1,27 @@ +""" +Background layer entity class +""" + + +import pygame + +from BackgroundLayerFrame import BackgroundLayerFrame + + +class BackgroundLayer(): + def __init__(self, image, mainGameClass, speedMultiplier): + offset = image.get_width() + + self.frames = pygame.sprite.Group() + + self.frames.add(BackgroundLayerFrame(image, mainGameClass, (0, 0), speedMultiplier)) + self.frames.add(BackgroundLayerFrame(image, mainGameClass, (offset, 0), speedMultiplier)) + + + def update(self): + for frame in self.frames: + frame.update() + + + def draw(self, surface): + self.frames.draw(surface) diff --git a/BackgroundLayerFrame.py b/BackgroundLayerFrame.py new file mode 100644 index 0000000..e7fe2dd --- /dev/null +++ b/BackgroundLayerFrame.py @@ -0,0 +1,25 @@ +""" +Background layer frame entity class +""" + + +import pygame + + +class BackgroundLayerFrame(pygame.sprite.Sprite): + def __init__(self, image, mainGameClass, offset, speedMultiplier): + pygame.sprite.Sprite.__init__(self) + + self.image = image + self.mainGameClass = mainGameClass + self.speedMultiplier = speedMultiplier + + self.rect = self.image.get_rect() + self.rect.center = (mainGameClass.getScreenWidth()/2 + offset[0], + mainGameClass.getScreenHeight()/2 + offset[1]) + + + def update(self): + self.rect.x -= self.mainGameClass.getGameSpeed() * self.speedMultiplier + if self.rect.x < -self.rect.width: + self.rect.x += self.rect.width*2 diff --git a/Cloud.py b/Cloud.py index b327d3f..e25285d 100644 --- a/Cloud.py +++ b/Cloud.py @@ -23,8 +23,6 @@ class Cloud(pygame.sprite.Sprite): mainGameClass.getScreenHeight()/2-100)+50*(2-cloudType)) self.speed = cloudType*mainGameClass.getGameSpeed() / 6 - - self.__doubleX = float(self.rect.x) diff --git a/Drakora.pyw b/Drakora.pyw index 550ae6f..f478570 100644 --- a/Drakora.pyw +++ b/Drakora.pyw @@ -9,6 +9,7 @@ import os from collections import deque +from Background import Background from Player import Player from StandingEnemy import StandingEnemy from FlyingEnemy import FlyingEnemy @@ -17,13 +18,6 @@ from Floor import Floor class Drakora(): - imgDir = os.path.join(os.path.dirname(__file__), 'data') - backgroundImage = pygame.image.load(os.path.join(imgDir, 'background.png'))#.convert() - backgroundImages = ( - pygame.transform.scale(backgroundImage.subsurface((0, 0, 800, 150)), (3200, 600)), - pygame.transform.scale(backgroundImage.subsurface((0, 150, 800, 150)), (3200, 600)), - ) - def getGameSpeed(self): return self.__gameSpeed @@ -65,6 +59,8 @@ class Drakora(): def newGame(self): + self.background = Background(self) + for enemy in self.enemies: enemy.kill() @@ -94,14 +90,12 @@ class Drakora(): self.speedUpCheatLabelCD = 0 self.speedDownCheatLabelCD = 0 self.speedResetCheatLabelCD = 0 - self.backgroundgOffset = [0, self.fourScreenWidths] def __init__(self): random.seed() pygame.init() self.screenSize = (800, 600) - self.fourScreenWidths = self.screenSize[0]*4 self.screen = pygame.display.set_mode(self.screenSize) pygame.display.set_caption('Drakora') self.clock = pygame.time.Clock() @@ -163,9 +157,7 @@ class Drakora(): def render(self): # self.screen.fill((102, 153, 255)) - self.screen.blit(self.backgroundImages[0], (0-self.backgroundgOffset[0], 0, self.fourScreenWidths-self.backgroundgOffset[0], 600)) - self.screen.blit(self.backgroundImages[1], (0-self.backgroundgOffset[1], 0, self.fourScreenWidths-self.backgroundgOffset[1], 600)) - + self.background.draw(self.screen) for cloudGroup in self.cloudGroups: cloudGroup.draw(self.screen) self.enemies.draw(self.screen) self.players.draw(self.screen) @@ -299,14 +291,7 @@ class Drakora(): self.doCheats() if not self.isGameOver and not self.isPaused: - self.backgroundgOffset[0] += self.__gameSpeed - self.backgroundgOffset[1] += self.__gameSpeed - - if self.backgroundgOffset[0] > self.fourScreenWidths*2: - self.backgroundgOffset[0] -= self.fourScreenWidths*2 - if self.backgroundgOffset[1] > self.fourScreenWidths*2: - self.backgroundgOffset[1] -= self.fourScreenWidths*2 - + self.background.update() for cloudGroup in self.cloudGroups: cloudGroup.update() self.enemies.update() self.players.update() diff --git a/FlyingEnemy.py b/FlyingEnemy.py index 990ff70..ed16cce 100644 --- a/FlyingEnemy.py +++ b/FlyingEnemy.py @@ -22,6 +22,7 @@ class FlyingEnemy(Enemy): for image in images: image.set_colorkey((255,0,255)) + def __init__(self, mainGameClass): Enemy.__init__(self, mainGameClass) diff --git a/Player.py b/Player.py index ee06e49..52594db 100644 --- a/Player.py +++ b/Player.py @@ -34,12 +34,12 @@ class Player(pygame.sprite.Sprite): pygame.transform.scale(playerImage.subsurface((0, 72, 16, 16)), (64, 64)), pygame.transform.scale(playerImage.subsurface((16, 72, 16, 16)), (64, 64)), ) - - + for array in (walkImages, upImages, downImages, crouchImages): for image in array: image.set_colorkey((255,0,255)) + def __init__(self): pygame.sprite.Sprite.__init__(self) diff --git a/StandingEnemy.py b/StandingEnemy.py index 66fc0e9..d5f923d 100644 --- a/StandingEnemy.py +++ b/StandingEnemy.py @@ -64,6 +64,7 @@ class StandingEnemy(Enemy): ), ) + def __init__(self, mainGameClass): Enemy.__init__(self, mainGameClass) diff --git a/data/background.png b/data/background.png index 0b5fcd7cdde64edf72397e923c4779f87bd2c4fa..e2fe42d714f0c4e5f76ba0ad9afc0a216c2091a5 100644 GIT binary patch delta 2875 zcmaDW`&4#{ zwlkKeA51gc@SLlNDROGq^#evlEMm&>Z}mP2FS~j-CZFd`jQ-`+X}9z5zSg?9^m`pg zTi1cCT4sg2E9d!c-ho5tM%++tvhzDacX_4cj2?% z6Q_4sy**WBUd3+l=WOiM!t(;pZ*|sa?ycd`IBM*0`AqR6#>**(mx@1kaH|UXY_=+^ z_T+-t1lxVW%Bd(}M2T z#{Yhk@Lha<`IaTtSFgVBTw}F}nK}C*d<^AQc z3Gby>IrTG3kEpK=JIkhS?|quBQhZbWg2<0g)=ODVWzIfdKJgCQi)uNocZZe-)_u|b z&9LqhPxaa}QtP+y-AdhR6X^Lq;=TNh*tq(yjF%s1+;TtZ5gTp1;akra|z!ecjvC|96%|X7)~uJU;iKS?|{WU%zKfiJDw6&Dufsetm0K_aTPuJmxaqa}P)< z7u|jz*8C>v_>Jyz{b!7J<`W|w{XSisoOsFC^%8%Ibj{i&zXHF!o%EyJSxoNqy#rE3 zov)(9_qHXkdu^W+ysWOvFY~D7$>Y6Cd$z0gMe9p%d2?~`(qD=)yJS-IZ-pM;q`hI2 zd)}XDrn7Cy%^NLLe`+4(S;B1bqjz=5U)hH$@{{>lcovCX;*D>P5>J zt4liZ?){bx?p~{Z)X%(HZg!(`>5)n~)gL$3nJO>M{@7vYsO?UK)&&F`>$qufI8FDljF&UAfnPO8?MTr&S(dAw11+~(T&|F^{N|Gk{3id{4#~PhXShnYna3#alsm~^wC#KS8P`s=IRVz~ zPt|RrqV~!dFFnxp+4w?ly^Zoerm)nTebXk1ieJg_ew^TL@_|R-XN$hP$4mIvw@39tyRtU*{pWsGx&7$!Q)_-y z_kRkS^0aWH;kOFI^%r(upT8(DFa5-8?sHo;?D=N@=U(%m^|f{6)^~kNe(!yMrM&<6 z4YB!(n?Jpq>b&=p>SLRuAL=R3zcHdQRYClk|e__g-@1BXUUfuW0y7%ec#}eCLZ}KlFp8sjaCh7EPm+$HL ze){*`D0X?y?CE-y`Dt(doSoXZenR55esxXe-4A!E7uP>He`@kMrl zHtCmKgYD~8bN9Bh9opx6Z+i2luN$}5?7LjiCHK-Y{BT>S-pcmVZO5!`i>37NUs({A zzf-`4lVi=V-luH(3~VbkI|B>1yU&R}xo2~$MM2l999D6@i*tKEm=*hNPF+!$Df*3VdiG_r=^+|7@e(r7!PWhmJlXu(v-P8ID-ang{ z^lrD7?j3Wzn&|0wa%=7HU2PQA-E3CRyRcW;@ARtOf`;s0o?ZU*>8;sE(MzkYDXjdY z+s+&Q?v8LW``(wQ=f~^RKQ;SW_N9Y!TXjh8x^=4cZ$;CWzK{zwynko<n-u+qfRbTeei$N0VPun+5*Z-V;V&%Tcv5Mtf z+F#C1FF%r1e&J5gKgpfEbHmH`hyT+qo7W=0|9|4FWsI*@-Spa6eEWmN@3p^5suT6% z?_V~&ckTAES<7Ck@Bfq8s##T^aF%yUm-T58*U}5WZSPskyM4{xchTvy_1_Jq$^5=+ zWFMDS`m^iByrqw78SGaX)u+Y>yw00mKJA6$;b+I+*GuI8>e^#DKf1E~oaph z?p4wG#@YX6LX9_UyEi1t7?>j@7>$`W=81jqsIb8 zYjW1CS{MBEdMUf2l3WvlmbQNM)u;?AUl`M_1We+r4YJnBQ;f z_y1uRw$p4kYgpwu+w`2dPu7JVk9~iu`u$V!51+zr)-l_ZhJUw>+U+qXeSMBl^4rwV zA3x&i<->QHEoQlP=!R6${PMr)%vO&>_da~BzLo2|(#MjC9_HS6>~d$8Of&B1-8@gTe~DWM4ftd!I) delta 2919 zcmaDV`&M>>BL@qoxvENT+^>nA8u96#E{-7;x8B~}yH3Sjvf<&(t85(Y9NsPN9v&=e zw+nW%9}yK$e7jX3`jOZKj~%VN{%K4q>a&|=9?f{LAaTabbuZ_?TJ?T)-MkZr%&hMQ z$9@g-KmX&;$J_eq3=FR-pNmZVyLqx6C(q;$9IBH)a75HM#O^8QVo+Fcetz7&e~%t- zkDtTa$jT7nv6^4rZjRsb>(|58RTgj7JEq4K<9KAvYV-B$*R%B>NV?(uH&;CMfXrr| zb&|}{>lD-{xMr4e>L|M>7=F6?PRTwY>h77Z#||9(Y80Ec^Y692>x5#f^4k+uaICpz z&Twh&tM>5SU%zh1oLX-#$h2;HUHW3VT%LF4%Z)Be(IiY93sR!<6v03ZsR@m4afF%N5n1Nq~qPX%S!gQ z-L(n3x434es$7ZEKRoZioAUL-S066ADD>IkShdRkXE!fjy?VoH!=@a~zWP0al~LjC zv61<1?-|s*|6u9ww3%D8*Rn}^uasw=Rs3)9(v!Qm4GyjO{pIWP zs#68$rtVJqu!UpIr^)l!_p=KWh^)KaRL{S2&AG}u)jjX^POQ<}uJov9>6P;P)9tKp z{5|?yR`;b}>DOwd?!JuU2WC|=R9=79#T`1wGW+XP`zOu4#rN*JudNAp#}D5KMKIfJy`JO6TPkNJcZES-eBF+3LVqoMo3~g+ zrM>-F@3}g3^TCtnFKu$X*ZM|2Bh2P!x0~P71GhfKs%&TcHLtyE_lL_G_P?gqGK5#Q z?F~!o4Ue*ZyD4hkiY4W1w)4NyTfhHTLuP@<+r=qM)~%I{h<5YuI*_$Fru0tK(t91{ z`@e0f&%3l{%drz{{+=tCeeBl1U)82wYdtMa%P#19?{w6)KCvOXO}lTYUqY|o&bQ^O z9m_T*zd5>F{4>M+*(cU0s8_x}Y4CEH(o6PDy!*m}{%ZUx^Zc`0(YQY~JArqn%h$E5 z;|?2M|0=&tGuYmB`Ibj>p8P!)bnLd!@3qr;qsrc24Eifj7R$Fu{OzLTn<5c6mCgU@ zHl`ikcre07^{3|1CCnC_KYCY}{FQyE@_sT8t9-rYf%lJ>-VWfK8D_rt(UaLTtmE~q zd;i4hze?M#v`XITx7htUj>_}jR^At1dYXNc#fD>b7j}D>mCQf1tEPJY^~W2}*0E;I zuzqOtddeTOvI)-vA3e`GI*oV7jq>(73gvQ=k;l>Ljl-?I-~yta0(pT~OT zv!6=8%wVoqvZbqjeq?QWb8ooUoacc}{cod;gLa9%|Djx|nYT07a>CBWt54ZWkNr5< zbV7Z}?}^)fGJG+)rd-lFFXjBaNWnUfoYSe3-d+Cx&imQ1>}~H~$Nze?d;hJgi>(fY zT0Y-$o@-5CbQfbCw_eUfp8t{=6aJo+Fh9&cBXZ%nZ(Z3c*Oh-dp8HlmZKuY?7U8Vt z2LD^!y;mOV}JUQ_yenSZeI-A^r%THH&fC|&4I%kIY^Cuc@cyvZzw?0etBGa@-Cwr3fl=?sWE!BR1<+;s2E0Ouh!mP_)Z|_&n=HX{!Ze)*FM%Cw0XbnN5D+c z`uBlxU7Kw5%#O+FKNGF`{43bx)K{L$%7Z(_p8ih!T;C|Vr=V7S^|iYbOZI=C`|I6D ziQA8qQ^M};Em{$7mp*5?#65q071!?clT%9cE6#2GdH;Y{_>N0irD>{r!^JDF*PV%z zsn^*&iEl|y{}q+0D_aW`-sycVxiLq7dPdjAN7j*{V(+iaZa!_eY~Oo{|2L06P6@lT zXs=A&BKNFIyzkqmuhJDTKK{RQ$!tmQ^s9mO%Qx;Rmw8+k`;9a2Rj^!e+2b=sw`MQ( zy!St5+3P8#pD$UyKikv0f2Yw0QKK{8J}RUpn8$oisptC>S$Qc^Po zUGXLj#>UY78}B?|Wnj71RD0>b{dvp`MV00U4ELm7{+hpkl{SMz!rL1Wueca8-q=J` z+Wg5kSP2pf&EQ?bUCPS9p~KK{=bk0&WL-|>$@@9EC!29ffoP5o_V4RIwePps+|99q zv3_qkSH+9Z%csx&{}fbhh%pF6tm$8Mzvk!TxA$u+FGe#M9KUIFvNS4o*Q@*W|DT_= z|9sUvKK|dY-P7&w|A}ShY$%QX<+@47oayuoJ6qq?PMLSVOnYc@AmM`=Q|_|4zx%!B z?Ye)j{jEV`=@HSAEFXK{)kXOy*OV-NRHsrQ+_|Toe~Yk0{;kL@@9yNke_j%?eqmAE z_w|xDJD)9Ux7@mJ>9h1{f|HW^c1yB-U;CzNd3fN|_qk{G_a?e_Ukkk&KEJ5lRB!F; zi8c3%n$Iohv9!Ire>pGPm#-W8Hk3Yi`C*2XsCo5~l~d1HM|UtUUvVm|;F-YP6CC-* z&rPD+q^5@@<`>ledwRca`%|~pK#APq3)wREvKQLCjtLrVomBdBn)7${WAp6xM_9PB z{hxC;;rGt$e;nWQ@-(0ATYc$F?c+1sOV8cCw*7IeOvFW_?621aZrymiMQ4|^V6nq` zJ6-?#dBX9EYqNMKY27c1D17Q?Yq;(5Y`gzIkA4cz3(j}{J|khb`_=kauV!72D-7#; z7byDqY^_!2+S%Q5axYIEn00Cm8*}PQ_ph>{JNfjV8+(V_%AVDB^M1JSjp4M7d)0Tx z9{2qDarYsvyZYPm8#2z5Ltup2fUd z*X(`j7oDFUCw8}OXXLZvr`PDk3*OxnvWNFUb?CG8Z@9DWzWsDe=x*kXKR^ERKlY8E zX#PA{`~9(V;R(5t?Ckd++MuG`u^Jv8w_?Dvn1_m68`PuqS#>-^5+J!_lqY<;!kb!^r9y?>bI-P5|A*RcHE zt9|a?;+>D*O!ZCD*}I0TUjF{;$6D9ZrW}|h8SVV;vtE6!L;9Xo;WdAkgguN@k<$}; znb!Gwx$fk1Mb9=SmKia}1XQ1S`}&;Qkpr`&SXQbpSb6eA$%E<*!KG8bNAFX<+vTy# zL*;J&+mF0zpCzt-H(;N0XPI5v++wXo>|sZz@$5KkEZ-X#UU~gQvrlVe*%QrrqrC=G zXC80!U#EQhS{M7RD3)ty-O^8|gxej;c>n#1Pe`^@RYg*{E$7qipMLr8|F6D0?nXtt z>8_tg+;doOc1%C4eWF@q)y8G(zV9(#op#Rq`u`c-<>!7?uh<;2?|gZ!*17#ZF6Z}3 zGce}=HhDq&5(QaBhG P7#KWV{an^LB{Ts5yn*wB diff --git a/data/background.xcf b/data/background.xcf index aa18ecc24092b685ae412f0043d85fc5c1af36c3..877897831fe96a1c16c2ccf8ff49bb33f750b34e 100644 GIT binary patch delta 2324 zcmbQAwKikJFD5DDzYJht!U?7rOhloy;${)%{fv<*5U$z_2(3{Ap|z$!Xzerzt+N9{ z>&}4CdS@WCfeMsf1ECEcLTIDsn{`-?}vo@I4b2TtPX&4_y(^$NIpe%;kThG-1 z^C^r*_?YQ{X+5jM|9S|`0Hy!e3ow8%1C*wWT`#~uxj`HZ|LZvz80tYZv%`Nu2HpPx zdQ1%3|M``f^q3el{|ka?_5Z@kOnS@=^8Z;FM3tHKSQx|@|4)ulb&zdf5V)_$z`u#< zz7B)nCZ_vZ48oh3?rSiJZeqT#IQg`ygD%9-bg-d;OzB`l!L<5+;XtNzsG)((=`0Ll z|0i3hIkNsYVc_~dxlT=k(Q)!xH4P~LmYSyTe^v(5|I7@mdMpfj|Ctz=^jMXd^_Un` z|FbhN>2WDD>&gFTV_?@4P?rAB!oa2{t}G5#Evqc@pNWB4Pgz;uKQjZ9p1Lv@1JnP> z0qRc1#SE9y5c zGYI|XV&MPJqs*+w%)s-XiGfp(iGlY&KR84<{xdN!>T!Ve^ZXYAo5%M5KLe88ALWQ-DhX` ze;<@GxEUsY(sYD+Fdghca00OS&lJd%4)$OmV>;M_;ACL%pCgbZ9qz$E=5(kB)4?7D z2Q=7&=^SAFJpYBj=7Bw!&K<~@&cwj=UnGzzot@!-IzO0Z{y%w>mZRkV{|r|DSs2*= z^D-#>XJKI0<6z*{V`7l`Kbc3{kc-uZf%!fM1NVKU$&uPd7>d(57`W5HikD~``~GKR zF#XTOz^cc@UM@Hlu--RkV7$+=iRr#E1Jix>O)U3y7?|(#ZeqW$%)oSCd=u+^ z83v~Na+{d$^G{x=qX&0HI@A&AEP+hvP)DS*2ePC?9g)r($es>$M7nq&D>x*fj!2gS zha$`W$uhe7y#Lu4l>dt`u<9{_LM1}io{fc{f%U%X<^SvqrvDik z*z{N!4F5Cgu`09ZF)`@>=LQ!Sy#FN_SpQFs(DM*E#K3mnjDhh!>n4`_Mhx7WnC=@e zOg^IL2{#}eY(P3|AWJ&f0C3R&HNZgMQ~f_TgWi8u22MRj2F?F046J(W%1nA{|Ct$B z^!Syz{!25k=m{$`{-3-+KR~jCf%Cor1M7WuaDl{fpMR4Y1IvBkP27_u4FcdMr9(|h zXAfjb2b+}69|$%nT{w{O|Kte9I2?{1;Vb*W+Xm|1YD=sVBjpsw}Bj z&m^GCD#@nIEGeg4&*C6i&)mQu1}^*9?<+FMY~s8x!JxWH@_s#&z$VrnwoS}Ea+~T| z9D3@R9U$hWgUtD$ZE$H$ZRJk7g*2YU{}w=04*KZ7!?1D zF#K0$(-Q%OY@1;yw*xfKvfWpj{K+s>6rwU6sxpu*9jr3OD9rZ15QFA_W(EO0UIxkk zObje~e9F9f%nZWdl&JtNM|l4;Gcf9@f!S=}45FpXqQ}Va|NrFoMoOyJ7zFNXF|gd{ z+r)ccih=3A!Y1bXq701p)iyET=VxHPueFKgKKtYVVjp8*Ep)Rv=3{*sk@)${<;>|Evt4JjL^W@_pkV*1MoAFxkN*2rie-!oc%?@_ds9 E0R7-{rT_o{ delta 2413 zcmZ3RF+Xd=FD5CI_Y7cQ@*7Msn6g7@;msn<`xzt4AY63_#h|eP!qEBvp|!6-Xk8Bo zt!D(G^`ZIb&HR5W( z?PI0`ruD22w)GHt8kC-F&)PQGmzBqwgTc0*gJD`d2gCh(W(QkA23=bLJthWiTYhCG zJthWCTR||bZY!+Jq{qx4Z_C0Us?4m%!XRclIY!k%-(i{{gYGne`%Dbl)A%V!F@FAU}X{?iXsygW27i7@AFObf}pnab|kSU#sLG!*K zm{z|p9LSW;%piZCg+VlsIh}<;?EYjmHAhxk69z8Z$vJ8o>J}ZOieP#yMbQT7^`%DZ>>8ydw=}Zi&_t_bk(zybe)8+58 zF|el#1WMm$VPH!a4-^NhmJJlS&&0r-t{fe6Jmix>M zLesby_^0t~V!qGJz%z}Bf%85S1Mf6`aQJdeV`5;u&jHrYGffC=9^1743{3aAH-YTn znkKS|={`Hd|NEfS#?HXZIBoJYO~?BCObj;n8Pk~5y!QeheAWJ$kgV2302LAgzfz0X53_SOl7&z0J7Kq8LXzUFtAVKWl)&L!oYl=gMs@#6NAh&rpd3hj3n>> zXRx}@!oYr?mqFn^3j=dH2LpFH6NAkC$!6NdzP4-(rnXEBta?lghTw=|QD)L(VbB66 zTy|v^J$42~aAM|FX4hk7kg^43194@LdR|*b1{PZu1|~f@aOASsPTr=i8^CmR8XJS@ zG$sbt`%Dam;BaTz#B`s9K?|I6**CG=XJ=3Zr)J(w?Dtt2q`>(=d=p4L?=(gRmT4>u zO!wu$am6x?W3r%*p6`7&2GjdY46Nx)42IxPWC>(SXJOC+r(E_xmUMOoMR0274P;Me zWsm~r1MxtRdfxkt3@rCq7?{%Kz#-3ae{zqGKCdksgR-p%1FIe*C?rql*b6Y9pT@?Z zJWYgw^*$qm%rv&iyt)p&_t_Yf?~5?7rZa*!H##jh(@C8Y2VSeHI48X^i(-H?iDjV$h$)4KBWTr%5od zPMa*H=c#<3ox$`zBLiDH3xnZ(#&p&|mUJct{rlYDGK=@V1Ow~+$!&U`>bBerdbX?# zoO+B5nzk$qta|LqOnPdz%nU4g{K{Om(hMwm!pe-clfUT&Xc|xBX3(3)%D{P_kwJ4B z3j^zY_DxLp)uu5su-xb0#5GNtf#tsNCdO%;ljHRR)bDdM=-p>!;7n&^(7eyWz?#k; z$ds;jpP7Lroj;K4zBB_%x^N)l{mIw#1BGqH8PsjX^w=2`Y(vok2%7Y$@j=VTDSFB8a_F2SH0D4AZ*BoN4I#}>$JCl^@H;$TFl*ccRT zMHv1ov+0R2u-dXS2exX;TVIgN>dSSDu}DcRl^V$i(L%pj1?%OH85iGd}ZFOWB#nL!ww zk`=(^3CKvsbTu#=l&YB1wE|hv85#cHpM2a%8RSMWTUG{8_T{mi{M{&sf6p{#Q0>S7 d%6&Z3SSR}#2Z78GyU)r1$~`>yC$BYb002}EFM$96