From 45f85c0b3e4d45dffd7c49ba998a643ded81004b Mon Sep 17 00:00:00 2001
From: Carlos de la Guardia The objective of the game is to maximize your final payoff.
- The game is played on a {g.columns} x {g.rows} grid, where each
- player occupies one block.
"""
- if self.window_columns < self.columns or self.window_rows < self.rows:
- text += """ The grid is viewed through a
- {g.window_columns} x {g.window_rows} window
- that moves along with your player."""
- if self.walls_density > 0:
- text += """ There are walls throughout the grid, which the players
- cannot pass through."""
- if not self.walls_visible:
- text += " However, the walls are not visible."
- if self.build_walls:
- text += """ Players can build walls at their current position using
- the 'w' key. The wall will not appear until the player has moved
- away from that position."""
- if self.wall_building_cost > 0:
- text += """ Building a wall has a cost of {g.wall_building_cost}
- points."""
- if self.num_rounds > 1:
- text += """ The game has {g.num_rounds} rounds, each lasting
- {g.time_per_round} seconds.
There are {g.num_players} players participating - in the game.""" - if not self.others_visible: - text += """ However, players cannot see each other on the - grid.""" - if self.num_colors > 1: - text += """ Each player will be one of {g.num_colors} available - colors ({color_list}).""" - if self.mutable_colors: - text += " Players can change color using the 'c' key." - if self.costly_colors: - costs = [ - "{c}, {p} points".format(c=c, p=p) - for p, c in zip( - self.color_costs, self.limited_player_color_names - ) - ] - color_costs = "; ".join(costs) - text += """ Changing color has a different cost in - points for each color: {color_costs}.""" - if self.contagion > 0: - text += """ If a player enters a region of the grid where a - plurality of the surrounding players within {g.contagion} - blocks are of a different color, that player will take - on the color of the plurality.""" - if self.contagion_hierarchy: - order = ", ".join( - [ - self.limited_player_color_names[h] - for h in self.contagion_hierarchy - ] - ) - text += """ However, there is a hierarchy of colors, so - that only players of some colors are susceptible to - changing color in this way. The hierarchy, from - lowest to highest, is: {order}. Colors lower in the - hierarchy can be affected only by higher colors.""" - if self.frequency_dependence > 0: - text += """ Players will get more points if their - color is in the majority.""" - if self.frequency_dependence < 0: - text += """ Players will get more points if their - color is in the minority.""" - text += """
Players move around the grid using the arrow keys.
-
"""
- if self.player_overlap:
- text += " More than one player can occupy a block at the same time."
- else:
- text += """ A player cannot occupy a block where a player is
- already present."""
- if self.visibility < max(self.rows, self.columns):
- text += """ Players cannot see the whole grid, but only an area
- approximately {g.visibility} blocks around their current
- position."""
- text += """
Press the 'h' key to toggle highlighting of your player.
-
""" - if self.motion_auto: - text += """ Once a player presses a key to move, the player will - continue to move in the same direction automatically until - another key is pressed.""" - if self.motion_cost > 0: - text += """ Each movement costs the player {g.motion_cost} - {g.motion_cost:plural, point, points}.""" - if self.motion_tremble_rate > 0 and self.motion_tremble_rate < 0.4: - text += """ Some of the time, movement will not be in the chosen - direction, but random.""" - if self.motion_tremble_rate >= 0.4 and self.motion_tremble_rate < 0.7: - text += """ Movement will not be in the chosen direction most of the - time, but random.""" - if self.motion_tremble_rate >= 0.7: - text += """ Movement commands will be ignored almost all of the time, - and the player will move in a random direction instead.""" - text += """
Players gain points by getting to squares that have
- food on them. Each piece of food is worth x
- points. When the game starts there
- are n pieces
- of food on the grid. Food is represented by a green"""
-
- text += " or brown"
- text += " square: "
- text += " "
- text += "
Food can be respawned after it is consumed."
-
- text += """It will appear immediately, but may not be consumable for
- some time if it has a maturation period. It will show
- up as brown initially, and then as green when it matures."""
- text += """
The location where the food will appear after respawning is
- is determined by the configured
- probability distribution for each item type."""
- text += " Players may be able to plant more food by pressing the spacebar."
- text += "
Rounds will alternate between consumption and - donation rounds. Consumption rounds will allow for free movement - on the grid. Donation rounds will disable movement and allow you to donate points.
- """ - if self.donation_amount > 0: - text += """It can be helpful to donate points to others. - """ - if self.donation_individual: - text += """ You can donate {g.donation_amount} - {g.donation_amount:plural, point, points} to any player by clicking on - , then clicking on their block on the grid. - """ - if self.donation_group: - text += """ To donate to a group, click on the - - button, then click on any player with the color of the team - you want to donate to. - """ - if self.donation_public: - text += """ The button splits your donation amongst - every player in the game (including yourself). - """ - text += "
" - if self.show_chatroom: - text += """A chatroom is available to send messages to the other
- players."""
- if self.pseudonyms:
- text += """ Player names shown on the chat window are pseudonyms.
-
"""
- text += "
You will receive ${g.dollars_per_point} for each point - that you score at the end of the game.
""" - return formatter.format( - text, - g=self, - order=order, - color_costs=color_costs, - color_list=", ".join(self.limited_player_color_names), - ) + with open("templates/instructions/instruct-ready.html") as instructions_file: + instructions_html = instructions_file.read() + return instructions_html def consume(self): """Players consume the non-interactive items""" diff --git a/dlgr/griduniverse/game_config.yml b/dlgr/griduniverse/game_config.yml index 83877149..1973a31f 100644 --- a/dlgr/griduniverse/game_config.yml +++ b/dlgr/griduniverse/game_config.yml @@ -176,39 +176,6 @@ transition_defaults: modify_uses: [0, 0] items: - # Legacy GU Food item - - item_id: food - calories: 5 - crossable: true - interactive: false - maturation_speed: 0.1 - maturation_threshold: 0.5 - n_uses: 1 - name: Food - plantable: false - planting_cost: 1 - portable: true - respawn: true - item_count: 8 - limit_quantity: true - sprite: "color:#8a9b0f,#7a6b54" - - - item_id: food2 - calories: 3 - crossable: true - interactive: false - item_count: 50 - maturation_speed: 0.2 - maturation_threshold: 0.5 - n_uses: 1 - name: Food2 - plantable: false - planting_cost: 1 - portable: true - respawn: true - limit_quantity: true - sprite: "image:sprites/food.png" - # One Hour, One Life items - crossable: true interactive: true diff --git a/dlgr/griduniverse/static/images/gameplay.gif b/dlgr/griduniverse/static/images/gameplay.gif deleted file mode 100644 index 22443f3d64d0e117fb24a513158e0688d39a6e82..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1206492 zcmV)IK)k<4Nk%w1VI%@10{5N(5D^Lx5fTs+6A=&(5fKp)69W0>iKpMuJY+z-qgFZ z<+l!Xx7nOEw>;;^NS4we zfL`cw%CGU^p)_rb$zyl&1jXw-wtr&l{F6H|(^7QldCOHzZLag`ugDK?N22cX?8n82 zXO|aM;Pc1Rc?w~Vh9P$S=h^WI1@B#aW;D-*EpGu&nH7h)m-~~Xv)A-)<_Y?1>1YzD z;QCx?O+BROPB`H9t!6YFcE|#*$i#j*@Y=@k0X4k+z4N*IeN^^72~QWqOeqjgZ(-H2 zPgwf~%}ugz^_^(CSQq|e(990WHVzUxDCAOsZEg$R!BSYFo>`K2jtoUUv>%0T(uLkO z7c9o}8>8dO>x$l38#pWq53B6QNo0KS*W#Oa_4i2G#x1mJt(rXisVL0vJLn0+TpVn* zevcG?FrrumF?W6 5h{(XOfKGsj^3S%4;d{xr@vd|s+@>x@vU(FtknQ)AsrKb^@(h(?2 zSC@}@5Rs>CduGGejzaik@H@&&nk-1fj)m>K#%d>6)IO-wDrcO`tHf0Plz~#7a^km< z)H0>iT&Pv*hj@`SwwzWw#^5K-{6x@4O05fJJTol4nd-8?E&2tA>yL`HJR+9buw#{s z#%hx}D%;YS`odrtg}Fiy-_lg_23}vr&ztt*60B*CviowYGd+>o($dXn@1m=_ev#VR z6LRigLb$f_T-i1#ScBXSp4<4~-uBn`?XYlF?^q$Nx{?zZ=k{rECrJ9?i+Y8NJU-;uF*zB=-f{5DI4;HvD zk#cajOTF)6V$8AE3I=midSOYfLfE6VJ1zzh0%9=2Q7W~NKI2Ik+nGSmKI@H{`!yw7 z78}ar(;H!SBFm#!JLv9v?>uXJ^eL%dFKDezMqeyZl$(lI{vxACXUfoM>2UA`XUQa? z@($~}%`wpG8PznX3^Io{a5+3L25ZdK`hF_Wt6bS+?&m-u|7ygw!*Iwuw49H6^oy2^ zx{qEnBaCT~S>@r(jKk!r*D566fNaFPOLF2Tw04>I;!D%mnn@NP`(H7t(g su_;gDSkcH&{|l5BBvRe#i0NO>aCmeT72my#2-tsRg(BQE%RAYwpJ&R?hCO*t;v{ zoQ$OLYzR9%nswxYGMiq0dEZ**XFXm?^mgwk_X6ihNgt2~9 viA?wfmkDsOur z5x|X}BSq*LiaroBEA$l6Dj*)S*`BibP@Z)YL2}ERdwWjuPH6Kr007&N4X3dQ>#PeI z(O*U;?b8l=M?wT+kDpIV+KjIKJ`(_cXOJ?!{!II2C1neSZR=xdCe#T471T)}&bW^u z?Z_~MdEI>C1Z)^?eo8giM<=`Q%N$?MLwnu&Nd`3tX4QW>$HubHel}ZxL}V{C!x-C< z;a2p8>u<;VXnV(OoAYja`YyU8Y~$DDdzX_Da1CMZz+1ES5v49z*%A^0(?~AJNbmAV zU$;HJq BOxcJGA5%Vr`X7+;4&uZ$p6|xMxwCerN844lMe%gp#~OE`xW5b z^a Eg{X)n`nNI_r3w?J z$}24Xz2qBsogOcUN2yrdU|(HU3?GRSexgubMV5hX8(wnzwtJ(jTT8a!YqX`RK#P(b z`PlCeBTd=$hCVY4@}% xnNa8GWFlw^ EY%veh8mRxNFsJzyJd}gq*4sb`dgYx2G*8CCwbU(K!qwsy? zUTe9M0>}(-Kt=gZObK RIJU*hsO6tb`RXL z@-wzpN!sf(VDX~V_bRrXFn7&dA=@gke| #9KQmboWmP)coH3hXhvQ#-uzJajiUrwsiRxIjX%e&DG 4?O}` z4Ia(tzaQDF#2LaKdLdXCGaZ-<P*>%P_V|Ei;cI3M~CU7;H6Lo_3YVPS6xOmYbhg z2C^N!WxA#dX$h4i2Y;}#*C=x^IP$Wl3G<>!qAE=iE7u2+2Wyn4q*DISDNX%dmS%sb z4J=K+v&s)W)QqI`%q)!unTNfUWZ{@65{RfV9cL?)c<&s=Bhy)cO5cjoMLHcPgXZ#J zt$*g81pVI2CpanDF#EZ`|58L7UsEoJZdN2)VT}4#D37kh+03SdB7JbP7S_hXk50zm zxZ<%qb&!U^i4KfTXC7NF2c#@WHH~|uDO9nn7CT8Gpvu0Wt6iXtXgO&{roW`6la8gZ zY_Oh9p=$&tm+&3hBwA%;Lai3}jUyLm%0^DA?kE!~4y#G_iw0?(C(7GOZ2UrX3ovZz z$ ^&(dY_V$fvZ=v13u8O(<2xJJ zuvy5VPa!z1C%1`3DC;~iNh>(1JHZ-6P@8;Y=uET;g0<_~Fb$49^Gvl(K(JNutIP&j z` !=IN=qqRnRwXYM*HG&2A z=Eg*U%wJI*-C%HGNb8^kVUCXbu)^wa!dFjp@82u3z-rdPGw;BgI3iHj!8p_*0#e_F zIUqrqk<(c2HRv&GQjy}WKIA#N7O)`wX1OzFM4Py>h_q)UuRbBEM!%^;>zo5R_TkO- zea3V`C%s0Gg1&Pn8YJPU#}sD8O6o(l4Es36gw2)D8(WLN;wU|M@x!cop`yg!ul!>q zYn&g`^vSt@Ed60dlp;DD(dyK8!7se`fh247#Jlw*hu3(~(uN$Y6z?0pps|si!l1BN zl)hA31XffWSRGkcUvXZX+%cZt5>MtjQI=j%6f)WNs1fIe3I1h6j~m@Te> z7Q#|50A&|Eb*k=Y;M8U3sxAE5X{{Gp&mC7072L=J1>G^0;bS(|Yn>4^vUYd4(Dbv@ z_FvO3HcH5`e_FB^I(0c*s9XM!&p^PzQfu=u&`C6k!=k00@A6z4jgIQDL6)BVTTsKd zERcXM2Pyxxpe9(d7bJ9fCA)jYSa`!nLC=GE120{9@%L1m`i7Ue>HAKlxVtm|q$~R* zE1ftymPwNFYWsB<0T`Y{IIH+syPtqC$VGGFvD%YpGP|LgjKONAXitms5hjQA6rl zVKGqC-%V `-mBIJaB3WKDAYRBt2Sx| zLEW@$z+7QX#>{tjXU;maq^gRQI;57uy|=6`+R6zo?=^tBl7V)cT=ttli9=Qg@y69H z7XSbZptmvnc!!PwG$Q2W r}T6enHD7FfAa8WCA0Zmk;X1NRwn+2IoG!a`Z z;99icZihyT?*dzzNw{3NTPdU%b_-hEq?*;>E^J*OX5J8YW-Ld@tp}#N=hGoBg}Za! zt#Td^pC97F4)kf|6!&jrvS ^nYmhXx{=t7(RA_whdi=RzP7{rZ^CD3uPp#$iIIt1lGX@o?K zaqH3_^|Q7I3Afn}-3Bj?#@N7yb~eUZ@F34Q#XWhX`SXOMwTAmw|0rxbo$;_Dy{GDQ zAJ6pUW#>uk_jF3S@zV56(PWO*y-lS*3xz%qD_+OJJ;YnE=WNzl_Ci!Yx<;C8pE9|B z@&_i;w<*n%2e`jafU=}DQef;dzmNy~4CB4HsHF>ok<4>vCUkFtX9>;sEG*=%Xyp5t zbyYR%RXx_RyAp#!LxFtLQ4947d&sPT>#W0lirIXmZ>g&eTR`OQY!rU-k?3p^=Wo{R zYzBD4m~^%X^EbFZHQ3a(hIRVYB{W2Jo*8rqzm>~le#o$4ts-r&AceX|z`2s2CXgbA zBF{aApYiunKUFSHvT#NGLKEmK48X@y?Vx_<4XjoTy9<1p6_JTfHuw5`U}G)(Okmm- z{`}*^>C>RUz!1b!GhZ~(Q+%X#lsCI8Nm*b~3|PVKnlaSm>2JN&@sLezn Tm^hKx>GEu)x6< SG+#SRF2M%zP8k!{Zd}r?e~OoUH$65b5A~hlYj$pjme09 z-9LR-=mlpH`MX+gHlQy#S@y2}FVU5}Hd0;Ze_I!O1qRuB`YoV6z*+9Yk4n?He%qw4 z7}T#Ut(~j9LdpHUvSZKdWA*#cr={7KRR_O-Qm5p!?tg&P>Fm8H1vEomPS^$Xx$oAa zo=pm0_u0KR#(0)bUoQy#E}vc(aN7^Kd)7L6u5o+Ud;Qd^c?tl+=g^*Wf1y2L|LzdK z8&bhz_pa5&*Lw?L6vEzTm)_G}p^YKG3Av6rxNjJ5;B_3VGEvdrctXxBuJ?6D-*Awy zXX-qhj3i_5=?QM6;|mZX 7Y-6Ekz@aX0LBaJd5) zmcbTEg@thjgMV?|jQfJ*g|YZGY;0;Oj5<^8lv{L1ojgx_>>k`5xBIa>*YpWlj&~?y zsqOqAr{Kmv#nz}J%Z(OOA|Z6t@`9Xz;SKnY00kTY=hX~)Il!qdS?UIuw9z3?NI>$r zl5(cx^tEo`$Lb{CJH^VXuh0)1B1mTqyE5TZ9Tc@3u;9ke?Td4A7u~29{Znmgc-B!u z?IM5VsNnng>jiMMG2?l0Rg wXW42REj{uXb}Eu0J@ zcM4J-z{$x@9Hp!Li2m*?(Hwf|dBM$e547qn#q!h8x2qABB&?aBLD{|P5q2<~v-B%Z zQ=>5NAyJ(?$3xTgS2&xl$u7qB8)q@L-W$v5?zbY?ikwMUuHAg~U(rXt@2@7ybMyML zPYAsbp>=fK{9zA~6nts?i wq z7onfJY*zk(OB;aB4y?Dxk7-%96;0oow+fR_(zUKc(bUuEMJbPAchyc?2d>+}!IPxO zCvPZ?2rjN%)~Ry bMZj8>QGzKwnK3xd5j#$fcM)Gj6Ha};hYoc zyRk#yww;)M6m8Q)QK1KuNOj5Oz1Rp3{DX9}nm!m$ITGIe6t^B;i(Frg^u0**kC{iw zQ9?RL`3WQ<$Hh4YZC1m%xtS*w)jf|UWrc%p{|>uf`CtNY@j8Drj0 !+Wz2g% z9HW;Ka2Zb+Oa~YZtUGMXxKJ`>&ZTJQ+%D)Z!UQgjRH-ef_YG+7IIG9Zsn9;btE#N7 zujNd7N4(dl4?tAlyjkb1#eMY68WMy;rv3A}xu#9lZ@owrS74v72GE4R&g%mZUT$;& z+i({g`e5 eJ$@qi^MLhq_2m>R1k}=3h=`JCD^ae_Z2l zz8}J+GaVNFj6b)9z#AS-)uagfTQ}(^$H1>uCuTaDlX&E~kgBb5G#Q2)z%voe@5gnk zfORm*2hSyOLbj6-m )^j&Z5IW@_bZM_g*xv5Okzz3 z9?V$7ZD4jS{ldj@anL=i+Oe!j@CHTKsl$+Na7E*JL_Zo|MJV2UITLG>An2$MM)H}& zQywUx&`F4=Q!7f`yC)Z!QP2^G`t08MAPw M#qA8`W3no2iLRfh?s=^KqFk_M # zXIaTg=9Xt>IG1oJM#yYruqQ6>nejMT$!TtcXN7+Kz?V0Y?OM|q*l$|EpN}N#IRlP- zGNlnNjhOV&amgkyD;DnLl?y<<$u?HmqEzkpf@B~U_}Q%VTa=8lhZwj3? 4rLSqQWFSibggwsym J@rk2wiL_o>zP_ME>t4CovN EpnwRFu7H7^u%2ML|~Z;9jIDdA@LHf zTZ_@!X0&hXpiQ8A=G@X0>bBsVp}V0+;_9)<$>gO>pgl5^T!2kn;!Zr _o?X#;rDun9|=W3fJ3i@%Kw{U8wuVrK8~1 zs(x%HFS(E1`&b@XupH}=0rZQA;&^>D3Ql68wp%!nJk8detg+qYo#W>oT@)o6G5oFU zlY(d?k{V7+u0KPFdGJT&Q=O9^hI2lX;E!o9IK!kow=?>;4;$iu)8RD_%H{FLt!f%F zmeLv{q9&M; zxdX*v>mN%4bY{{ooJ-(wl@#H$b(uMFPO_(?Rq_bt%grT~4!l?GyLE;OLpfv2ModUQ zrVq4++QuQ;c0jdHSK1k)a?4y|cntCqe!^4!jFHJXvEX@HE;hd{fC<5v9rbALpV zeOkOQfBM-AJfqL?v^@>E*Bh<@dYe4cfXgrOuOv4c3-Nxumn#|E1 oESB*J zu(ZL&p8A(Qt-c3vHHLxhJ;zq@Z+lveZ^xJLTRST;a~XSYxvw`Pb+=78d4?39>GU#K z_hL=&^@&Lw(t6kS)fHNr!GhqR-H865)$J|r_V(I^gxk6Lo>d_RPA$1;J6EYZ06lA0 zV5tBX$)@{NQ4>ZCoYwM3#Jee0A?JWYzM~VMSMB0hcPh2-##z#ON1g$&%tAk0ueWW9 z(_k{!1^RT+vcb3h@OtMT>nma*^~63$5=dC*yY;TLZBuU4qhYmtb$Gmf*P+I6#*6sq zb<}4`9rb<`AbZ7<$Gu%1wQX}q40@G(nG}qBFhpFPFLh`;vJ&>{??med>vb>CLhlO} z1q(YBbI-UPz9q(e1XsJepHKUFPw$bOI;Q#Ut~1@)!3y91mg<=sIe+YS5xN`bbB_=Q zcppk76;8LdfpAxzcHK#y2p3=PmL0$?r!Q;N{(=x_%`-^+`T3{f%f%#U2enUu{&sE; zvcnvD5chggoA}*&5rp>qShEs-3H?@kHKo{#5dRLB;TiR6&=1XBgYs2?<=V>(`h^7+ zdL0K#&jRyM3ngN{N@qTXReDDp|M;PfdBXt#UkOANhv*)Et2Ol!UcDEIh9DgG9$PV+ zP3c(Hp)*|ZB6bSV|LVQlXPC;kKV6qksqqlY&- AvT}5lb0XxcXFN z{Qf>(fyU{Nb@igi#36#yh{!k^s}rj5_zXwPjKV=s*>~)`Dp(S`S*md?Ib|FRWzRhZ z9J>S@r)!+{=-E#(Q$E*LbKmhqk0#!(0>+`^N3r7jC*bd! j^#Uab1*&x~~bx5{Sm%u9zqj&n9sFx s5>);i_7UxZ6(6Kb z3P~U(te(f1CRPk{ }aK(FH<*UEO&Cn1tqDn;dm3&?>z@Qp4rlqW+9B`zv0TDZ>fbpD84AC&gP-*%T zshR&m<7a3l8@|5O$5nuqvYp}cF@&6BX{%M34rgHdqA-u^$(kGJi7_bpWEh}uNessg zzL6M=Xf9vpo$1;uX|F+y+iXacQ6JDR>C9N*ZxfkYL1=wfbu_dr{mv}NvtQ9?8Is5- zrDQQV*&(i%tlJH2V^^HZASPdH%BMtnJ9c*ZYcB68`d;TgAxs)^FcL}<$E@?YX;SlA z17|)P7m70yK0CULBe$muyVDGxQxdyd5}OP>kG~2}I}3tTBhNHj?^y#Qu?wGSJnv~D z9rA3;S4{d4Hr|tKzIt|keoThWM(SQLFLor496N0sCa;}5?`)F#7j`yvXSSRq;T?8P z^+vwNB)*$j>W4;Q7;%9ic9CLd5#%Nj2&!n-tRN>F4Sh5x$_?2$J2!NeMofK9+&fZC z4vR|}QADOuU|bcJUyTf%Llk?C4HE>~n3XC=eJ#S2$oMR#dBb+;@(HXe%!u_qfl-`u zjsqS`h!*3>5_3;4Nig5#8-5e=bfbhm2S$pkOa>O2m4ccvmMpHKtj!#QA|_}3O;3S} zbQsome@w*?B{?t#`#1+Z6iYs9?x)|(XQ4)UQu_C$YT^zz4Fn)@(VOlLwPd^*6-^t( zLUxs*WIhOnlACiO4To}Rt;$V;EVnBo#dpbLb{Xzlc=2Qv;qP~eavI2Ey3xt1BTYiu zbC1s;iCZ j+K0)~QEJ-oDLPR16iwV|O(*B;B{eM@ z)&1|cYL&_23D{z#DU?QTdhBi@%s1L5@fwPA+;5O{RW;3N4vp?+gBN(cZ4S~n&Suz# zFOArS{%VDHN?1{c(%n}8WRNJ~wc#N=IpTr{Ma%bPbfRh2Ni8Ql&IN2%E~3S06LAew zMjS%n1ydOyA;f$ iQAoDC0Ie %y)>&P?v)){=%UO`kan!(3Q(sjt7rHgj4;`2Q>O#LwDZb?p-6!jJVt;*Lwa4Uk zq7|_|)<__lmm`Ky$TzLgEm-d!=|3ziJ}=aYSd)$6a7D04^G>NHDmtxed_{+l@c(q8 zY*ksr*6NROW(`I^os*+Xb;+4`!Q^t3i*+>7MCrY8RmXLENx9}qG_+V0h2YpZxs$J6 zsWWqXsXIz813hXNJ@j!s*%yHTT+LpHTruwMaI=F;D|{=CtFoFawwqo4B4#bFU!$h? zHa2kG)$f|i;jmeCD9vYV(UTa<`-od{8CQ23*Zc6!?_5KldtMK$=^y6i`sD8NwCBH$ z>pS4CJrDdLbBlrE;jxb^@N#N@-P*r%?UV*lfaW&`j&u9Wy7OW#xe97IiQbFBdjuHq zcq*rRN7#hW-}^9YIU+*bk?&zmv_f%l1H`q09oigIG>ur>wmjOxav))o*pZmBLAv*- zad?zTZJ{zefo7`T %BLcw6lR(?hdReWZBwn?0hz zZE?)E(Yrj+w{4#A4HhX}VZv!Li)le&iQ${Au_#&!LEI`CS`qtgaBe)$Dm+zc-(&E( z64viy!rBtZ+LEUOqi(NbhvJgb?i0@;aro(pFud^@t?`HG$tao$K^`a456Lm<9_sEX za;+)uQQzbr(!?`T8M$o`J*AzN{XG|>p)L*XBXb!K9 =tMUg=XN1QY z@K9d?gH2>qbG%Y>xl%*D9B`cB3f*VjU9eKS9!u>e2%}vhx4VtNyeF%vtd)qWzV=vG zDX5{&YM|Av?c=N5Ow$uat!Jmu>g7#};%$;>Z=7}cIhXFA#v6pa+TS&v*q@P7xp+mF z)k6K$z?xOdoz)np-C#180PkJr!kHoHSv92HteMqZ32Kg6jsrKg(0iw&DCIi2yumkQ z@?7KA38J6yYtT%M-FPcVr@%N_^(mbl7Vo?A_}v&g%~d#~Zh;!UPpzALIh1%G2YBsz zxtik$bBA }rknH5yN~!e3W_`T-TS87<;Fw!Z`(M3p0P{6U1z@_QBR5|H8pl==F^|a z%mjDcOn_e1;lrO0fj_IN92VJwHbkv1oqmKwlKdD=FFHwRdc6?ufoAN~kAH^avU^zZ zSyFszN>O63Z*@vrtC!Jg4mzW`@v6}pnu4-_!FvA|eopHY7-!deqk0nzuZ>1@^>$~E zFDecZ61F)B=$<}J((6q(K5O>*Xj} &@p0W5gW0ciSum6{sc=k{g9iCWvxphj@r86OQ&P0FVP@tYMd%?x`W#LIFs(WdX z|9yJb2)fTukYIxSOD{C!W!#K=LNI0#o_8u>eHne7Jwm@5<#{EeZl1S$Hm7YxK4)dT zgGxMSOfzTRsi`yUWj;ke=C8nPwa4nnLq}&)n nm-Zq9*^=VHI$ zul<#6Qj#6G&ls}=31e$R5Y5g$-F42531kCy(z~Azwih%)tJN*#in-;gJ;lno`??1E z?sugo1|=>!2R0iA7Ow|ZnME#s`<@$z{;y^F8)bmEr1y=ZID_(!1X%mva?$54IhYRx z1}CK?Ysh>B4nA8sLcuxNRe~h*ZoZ2Wtb0QSnfcm3dku6N<9Damu~s(DHw`{i-3$=Q4Qu?(&iCxz9 zK$okaz4$Zk+|?+;(}23<1(FHxFV_@)*Q*8>WBBK#`dco~jr^qB%%rO+@`p8k+=yj6 z(2dacn_4oVonzwBkGU7b>ld8Jm&Cot`|Fp&dE4R!5O;q;?@b7?(5=a40+}#~l$3q6 zdo)6L{=71$+wT^4V@ohE1F~^N+clx+|5!+JFVS_Xy}1QhzsFvBD%NdIg+5beKacre z<>gTo_r6p@H}e3Gr$_e*Zy5%Fhe|8syF6%f-s5ZD!|dk#G8EDYeYFV&T?*f~u0i{O zYri({p#2@UVFHl6&5i>9$yNWy|EQvz_+h2>htIGJ^r4#m5z_Ti+WQE7c_{9UjU~-6 z13ablX09aE`hFb#e^f$c4t)STm0v nNbjI8udV9P|I~*6Vt4N> z(CJ3U>gGA2{~g%zUX!Q+3V0hsUzPXe0j}jjDh({-_q-VQP@a2|Pja%piM_k2=cq~U zBK(@ro*F9L_`rACER-|g2d?%5NAw&ekQ^rn9g7njM+jL4Y?K6$966Dc1!Nvr`5nG} z29UhfC_Vg_FOLFx9O8S9qDYRzgpQN^juLtfy>pNH{f(<~!E%DHWRG=r!cTBGTYUx< z4*uX>!0A&=-3#gPZ~y#8gXd r%WZk2KOuX{E0C+%wDlKZq{uJ- zY|uy% OL{jj;L%m6-@0&I5i=g?r|80l=-{rp`1^#<`ULr#P*{h2^1Ed8Zolv-m zsrj4#=);>c|JPlh|8)EReVEu| PK;v9 *{odn|28zPh2S?)PGyV+ycaM7xFA41yDNsQDfyz3+kX Z`2a%Rj~bRoD<^OVAc( z@pT~M$%yo&(I>SU`fEWeYJ3yA?Z~=cJ2&h9FFOBC_ Llfiw_~9`!5O4uK``Y53l#oV9-lWx=iOB`>R@6I{dhB7?Z-JKHGmZ_y1&pOAY`} zZG&{=l5}`A?J^FkNVB;ak E?em9sk7>Pn6D) zZKjJxLK5LyA8oE&td;AJ%wcJ%T5hzQt d0&$!AWW1g!W0C&s|1EML;OzFt<7u z8g^7pHd8^Dq K(dUtNV`L)$ne_OURp)_ifdwo*ab zx^Z5`o3X0?jsDx#m`I-&G!sbszOb`}upI7yz^kO8&+GWCes|EuxZ`ByiL%!eq`TI- zP#~M%A#_4>^=tcp-zovj*G1RyxWR+jc`oK |ig~(E8rp zo2?94x68So8BLqL_?L=aSr;ZLFa99D+{48<&umszquRE2P3{c=Kl{u_s>jP&jz(L@ zA+^qEw+!B=?;L*s-e- ;n=_n z8UX# A-O(BF|~RfJH!4^j|)U`Qo%bZ`b+MM0yHLi$U6N>>zy5p0n5uq zkV6j?T1Z^;U6YdHUe=#Bi{SLzU=IS{RRHqeEVzC|(dn2tS%M@ic$-p@n*j%3?Ds~8 zh6kb#*B8P4g!#8hTD`AtY#uIpqYsM`zXt58L OwWX_FWFzc|K|qTqRPD{8+U9nm8;; zd0-y3X)Q(KDmuisavghK)(49r62RFq9jy*V#Td~V9Q-U3zsPTbZsXF+niwXu6;M>U zWS%V=E0vfg5KECof!pN)O3K-bwMkckQ^{;dF8dltCpscqXE~5UgI>&l%{Hd7GDBTg zRqTHMdrVgWDUG!+ktIy#yRkWZdj7W(wxss~k2{DN}P-KYV#>oyN?izf`2nBjYx} z*|cs~bDq}a075kwq@!n1QjP%y$~Jb+AuMVhtBf(vlZM U#V`#A7BPQxQd4jIt z ?H6K=1L+;7*kjUb81%Nq}tPmU*G4ME(Ixt$<7s=1biZXS1yz`suskR z62X# =RysF^K^Q573Q_hrmlMx>&Tz<$`4 zi|gsbgclBub(;~^0L}8T1ZuV5w{xAGlEuJ`+vXzWS$I}yN_r?0C@v$oObupCbw547 z?iUKv7Zp)0c7~Q_`txc93SAvh<(38qc{p?S>*Waz?k0j~Ll B0Ue})VBNaOGmKHS|=Z{=l0ynWEBTcD?i_Kxjtc5 zEvJtF;QrwKCm-0FWpEt}X{zA7^qd}RzHM0SzT*7)!{t -~7D=_HjRY{9=t}eebZgMZ}#xM3nqf%j#^MQuP-4TXKQLxi53?dpqx_{NPqn z{wH$`)%H R*5oX3GBOI#$i!e|aUrmh7$OWU$&%jzTsiyFQ0Bt?jeN zBQACl-l|8DTBBKN+x9Tys-l;Wc{(PJ3Sv*oZ-kFwF+Df#Ptj{i!X1C(TSAL`eIy{h zI*V4ZE;^#;D}1ZkEfyx1*V1+;Bfy8rsyoJ1M8;E_#l?k49B^C$V-MgIZwW2-s%Spi zbUp;V9}$P9ox94^(nNd(pUASjvRl)^gnyOEk+T(G2M2w8S~ZTSkG6<53}s(lJ5p$^ z$ZK 0 _M+Nmtvnq&08Fqf) zS}NTb-c8=gft!Q8B<>^E8upcO^P56V<-O+%$QZZ+rxdMg)kW%l1bgC0Pcw7!&u+(` z-V0tH `jc8^=PQDcV8r4gFkq;8XXZQ0-$UxZ~C^XyH`! z>-Hug6VM}z`1%{Lvb1|lV@TL<@<*wc>}`$R8yn`cclcwKOXbrxSpP7KuyfDX?y=@0 z`)vi9_bHm d_u+P^XXpI#F*tJNsLjG|jM}@>+^-wrt%c)*kY??T=#Oe?m_rR1l=3{4!nck` zz)KGxXbT`sVe(fuM&-0WOLJj#Q^t1-@JJ3!kh0-5`|%6L5qnr^8XZB>4axj7B6oTa z4;})2ylXd1kOFovCa2qjtE^ q^d%=oFYVcv20`VdI z@v@Ipikf(##`p5L%HPc`Lrv2|`&>h9%R=q%LmkVMobke3wZdF1!#pfQyxPJHm%>c$ z!+egy0>Z_Ehs}N ^+ho!3p@`Uq4oAr`SJ%-&mBeepBetVL)dHHhxph)-63$tNu zb8w|Lx8n9gL-IPG^=BRONDcG9MGQ8U@KN~Vh0h(8-)e7r5Ye)vGg0hczo?OT
=Y2V7;m(_70b>Aw2Rr zJvt^VUYsND7gB5pVhsCX95mc#eKAhzAR6V!3UVKhhpc#77Qbj2J1UuILYde|fln3@ z_rw!T6k&sHm4Is%cZ3vGdgQ |hlhkv-n2mN813>D-SRXE zUf