From 3782fa345bc9278a8a6e99b28e1e1d5ba5adcfb1 Mon Sep 17 00:00:00 2001 From: logsol Date: Mon, 3 Feb 2014 14:08:45 +0100 Subject: [PATCH] added tiled level support --- app/Game/Client/GameObjects/Tile.js | 4 + app/Game/Client/Loader/TiledLevel.js | 9 ++ app/Game/Config/Settings.js | 4 +- app/Game/Core/GameController.js | 6 +- app/Game/Core/GameObjects/Tile.js | 6 +- app/Game/Core/Loader/Level.js | 5 +- app/Game/Core/Loader/TiledLevel.js | 85 ++++++++++++------ app/Game/Server/Channel.js | 2 +- app/Game/Server/GameController.js | 2 +- app/Game/Server/Loader/TiledLevel.js | 9 ++ .../sublime/js-define-child.sublime-snippet | 18 ++++ static/img/tile_shape_rotation_map.jpg | Bin 0 -> 40399 bytes static/maps/tiled/circles.json | 2 +- 13 files changed, 113 insertions(+), 39 deletions(-) create mode 100644 app/Game/Client/Loader/TiledLevel.js create mode 100644 app/Game/Server/Loader/TiledLevel.js create mode 100644 snippets/sublime/js-define-child.sublime-snippet create mode 100644 static/img/tile_shape_rotation_map.jpg diff --git a/app/Game/Client/GameObjects/Tile.js b/app/Game/Client/GameObjects/Tile.js index c02dbc3..b952757 100755 --- a/app/Game/Client/GameObjects/Tile.js +++ b/app/Game/Client/GameObjects/Tile.js @@ -15,11 +15,15 @@ function (Parent, Settings, NotificationCenter) { Tile.prototype.createMesh = function() { var self = this; + /* var texturePath = Settings.GRAPHICS_PATH + Settings.GRAPHICS_SUBPATH_TILES + this.options.m + '/' + this.options.s + '' + (this.options.r || 0) + '.gif'; + */ + + var texturePath = Settings.MAPS_PATH + this.options.t; var callback = function(mesh) { self.mesh = mesh; diff --git a/app/Game/Client/Loader/TiledLevel.js b/app/Game/Client/Loader/TiledLevel.js new file mode 100644 index 0000000..e23fbd3 --- /dev/null +++ b/app/Game/Client/Loader/TiledLevel.js @@ -0,0 +1,9 @@ +define([ + "Game/Core/Loader/TiledLevel" +], + +function (Parent) { + + return Parent; + +}); \ No newline at end of file diff --git a/app/Game/Config/Settings.js b/app/Game/Config/Settings.js index 438c29d..75d34bc 100755 --- a/app/Game/Config/Settings.js +++ b/app/Game/Config/Settings.js @@ -15,10 +15,10 @@ define({ GRAPHICS_SUBPATH_ITEMS: 'Items/', GRAPHICS_SUBPATH_CHARACTERS: 'Characters/', GRAPHICS_SUBPATH_TILES: 'Tiles/', - MAPS_PATH: 'static/maps/chuck/', + MAPS_PATH: 'static/maps/tiled/', RATIO: 21, //35 - TILE_SIZE: 15, //15, 25 is original picture + TILE_SIZE: 25, //15, 25 is original picture CAMERA_IS_ORTHOGRAPHIC: true, VIEW_CONTROLLER: 0 ? 'Three' : 'Pixi', diff --git a/app/Game/Core/GameController.js b/app/Game/Core/GameController.js index 6bc7d9d..1a4541b 100755 --- a/app/Game/Core/GameController.js +++ b/app/Game/Core/GameController.js @@ -1,10 +1,10 @@ define([ "Game/" + GLOBALS.context + "/Physics/Engine", - "Game/" + GLOBALS.context + "/Loader/Level", + "Game/" + GLOBALS.context + "/Loader/TiledLevel", "Game/" + GLOBALS.context + "/Player" ], -function (PhysicsEngine, Level, Player) { +function (PhysicsEngine, TiledLevel, Player) { function GameController () { this.players = {}; @@ -37,7 +37,7 @@ function (PhysicsEngine, Level, Player) { }; } - this.level = new Level(levelUid, this.physicsEngine, this.gameObjects); + this.level = new TiledLevel(levelUid, this.physicsEngine, this.gameObjects); } GameController.prototype.onResetLevel = function() { diff --git a/app/Game/Core/GameObjects/Tile.js b/app/Game/Core/GameObjects/Tile.js index 52cb61b..7618b65 100755 --- a/app/Game/Core/GameObjects/Tile.js +++ b/app/Game/Core/GameObjects/Tile.js @@ -1,10 +1,11 @@ define([ "Game/" + GLOBALS.context + "/GameObjects/GameObject", "Lib/Vendor/Box2D", - "Game/Config/Settings" + "Game/Config/Settings", + "Lib/Utilities/Exception" ], -function (Parent, Box2D, Settings) { +function (Parent, Box2D, Settings, Exception) { function Tile(physicsEngine, uid, options) { this.options = options; @@ -97,6 +98,7 @@ function (Parent, Box2D, Settings) { break; default: + throw new Exception("Tile Creation - no shape given"); break; } diff --git a/app/Game/Core/Loader/Level.js b/app/Game/Core/Loader/Level.js index 002eb97..48c5fce 100755 --- a/app/Game/Core/Loader/Level.js +++ b/app/Game/Core/Loader/Level.js @@ -9,7 +9,6 @@ define([ ], function (Settings, Box2D, NotificationCenter, CollisionDetector, Tile, Item, Skateboard) { - // Public function Level (uid, engine, gameObjects) { this.uid = uid; this.engine = engine; @@ -23,7 +22,7 @@ define([ var path = Settings.MAPS_PATH + uid + ".json" this.loadLevelDataFromPath(path, function(levelData) { self.createTiles(levelData); - self.createItems(levelData); + //self.createItems(levelData); NotificationCenter.trigger("game/level/loaded"); }); } @@ -37,8 +36,6 @@ define([ } } - // Private - Level.prototype.createTiles = function (levelData) { if (!levelData || !levelData.tiles || levelData.tiles.length < 1) { diff --git a/app/Game/Core/Loader/TiledLevel.js b/app/Game/Core/Loader/TiledLevel.js index ccde020..4d4f277 100755 --- a/app/Game/Core/Loader/TiledLevel.js +++ b/app/Game/Core/Loader/TiledLevel.js @@ -1,4 +1,5 @@ define([ + "Game/" + GLOBALS.context + "/Loader/Level", "Game/Config/Settings", "Lib/Vendor/Box2D", "Game/" + GLOBALS.context + "/Collision/Detector", @@ -6,41 +7,75 @@ define([ "Game/" + GLOBALS.context + "/GameObjects/Item", "Game/" + GLOBALS.context + "/GameObjects/Items/Skateboard", -], function (Settings, Box2D, CollisionDetector, Tile, Item, Skateboard) { +], function (Parent, Settings, Box2D, CollisionDetector, Tile, Item, Skateboard) { // Public - function Level (path, engine, gameObjects) { - this.path = path; - this.engine = engine; - this.levelObject = null; - this.gameObjects = gameObjects; + function TiledLevel (path, engine, gameObjects) { + this.levelData = null; + Parent.call(this, path, engine, gameObjects); } - Level.prototype.loadLevelInToEngine = function () { - this.loadLevelObjectFromPath(this.path); - this.createTiles(); - //this.createItems(); - } + TiledLevel.prototype = Object.create(Parent.prototype); - // Private + TiledLevel.prototype.createTiles = function (levelData) { + this.levelData = levelData; - Level.prototype.createTiles = function () { - if (!this.levelObject || !this.levelObject.tiles || this.levelObject.tiles.length < 1) { - throw "Level: Can't create physic tiles, no tiles found"; + if (!levelData) { + throw "Level: Can't create level, nothing found"; } - var tiles = this.levelObject.tiles; + var collisionLayer = null; - for (var i = 0; i < tiles.length; i++) { - var options = tiles[i]; - options.m = this.tileAtPositionExists(options.x, options.y - 1) ? "Soil" : "GrassSoil"; - this.gameObjects.fixed.push(new Tile(this.engine, "tile-" + i, options)); + for (var i = 0; i < levelData.layers.length; i++) { + if(levelData.layers[i].name === "collision") { + collisionLayer = levelData.layers[i]; + break; + } + } + + if(collisionLayer) { + + for (var i = 0; i < collisionLayer.data.length; i++) { + + var gid = collisionLayer.data[i]; + if(gid === 0) continue; + + var imagePath = this.getTileImagePath(gid); + + + var parts = imagePath.split("/"); + var tileType = parts[parts.length - 1].split(".")[0].split(""); + + // FIXME rename s to shape, r to rotation etc. + + var options = { + s: parseInt(tileType[0], 10), + r: parseInt(tileType[1], 10), + t: imagePath, + x: i % collisionLayer.width, + y: parseInt(i / collisionLayer.height , 10) + } + + this.gameObjects.fixed.push(new Tile(this.engine, "tile-" + i, options)); + } + + } else { + console.warn("Level: No collision Layer given"); + } + + this.levelData = null; // free up memory + } + + TiledLevel.prototype.getTileImagePath = function(gid) { + //console.log(this.levelData.tilesets) + for (var i = 0; i < this.levelData.tilesets.length; i++) { + var tileset = this.levelData.tilesets[i]; + var offset = tileset.firstgid; + if(gid >= offset && gid < offset + Object.keys(tileset.tiles).length) { + return tileset.tiles["" + (gid - offset)].image; + } } } - Level.prototype.loadLevelObjectFromPath = function (path) { - - } - - return Level; + return TiledLevel; }) \ No newline at end of file diff --git a/app/Game/Server/Channel.js b/app/Game/Server/Channel.js index 8383ae9..16f3aa1 100755 --- a/app/Game/Server/Channel.js +++ b/app/Game/Server/Channel.js @@ -13,7 +13,7 @@ var self = this; this.options = options = Options.merge(options, { - levelUids: ["dungeon"] + levelUids: ["circles", "dungeon"] }); this.name = name; diff --git a/app/Game/Server/GameController.js b/app/Game/Server/GameController.js index 7de5c7b..2183d26 100755 --- a/app/Game/Server/GameController.js +++ b/app/Game/Server/GameController.js @@ -55,7 +55,7 @@ function (Parent, PhysicsEngine, Settings, PlayerController, requestAnimFrame, N GameController.prototype.spawnPlayer = function(player) { var x = 150 + Math.random() * 300, - y = 50; + y = 0; player.spawn(x, y); this.gameObjects.animated.push(player.getDoll()); diff --git a/app/Game/Server/Loader/TiledLevel.js b/app/Game/Server/Loader/TiledLevel.js new file mode 100644 index 0000000..e23fbd3 --- /dev/null +++ b/app/Game/Server/Loader/TiledLevel.js @@ -0,0 +1,9 @@ +define([ + "Game/Core/Loader/TiledLevel" +], + +function (Parent) { + + return Parent; + +}); \ No newline at end of file diff --git a/snippets/sublime/js-define-child.sublime-snippet b/snippets/sublime/js-define-child.sublime-snippet new file mode 100644 index 0000000..9d74c6e --- /dev/null +++ b/snippets/sublime/js-define-child.sublime-snippet @@ -0,0 +1,18 @@ + + + + defc + + source.js + define(Child) - create a new empty child require.js module + \ No newline at end of file diff --git a/static/img/tile_shape_rotation_map.jpg b/static/img/tile_shape_rotation_map.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1b26c3e94060d95b9e7503cf44d2cd38f9e4d993 GIT binary patch literal 40399 zcmb@ucU)83wgwuv1r-sIUL;%TT`5u}TM-Ztklu-a)KH`vFpzDbH>D~qN-?z1LoY%o z3IfullOP==Q3wH&@RsMkd)_%m|G2+*Z*=|$E6K{5V~sh-H@@)=j=mf%fG+52>1ctD z9XkfP1N;LWO@lOk{`S9m{5;A3>I6SOeDof~a{5>_Xy^E`E1*AEjvZ$?cGL+1gFwel z{@1xd|L^12AIDFeJjHPO%vna@4cH5yKaL$g{>O>qCr_R@0lYgDcpY?t<>bZ7*KVF- zHF99M;>#xcD&D32E+{hZoAX7)du*wg=CGyCVn{=a!mfzBO22Hd>kEFcJo?!1~C z0}}l|8oM&#$Wv5*QnJy6B!buHO}jhZiwz#z6(&eR#v)`EWKL0RZigBg4teb|U!b&g zhqOlGXT@X!vn}+8Yberz>`kMAj9*+i`i7ohmmt!Kky)5)S%CR)!JBaW$A_B@!MO4$Rwz6ZcL9#>&S-st zkJUHYnGIpSXl>~c(uE?&*>g48+*J5_p>xJ{E3(v$2i2{5Lk>50`ExUr;YsTS>K_#6 z5=u2rB~E4F89|1PdYvM&AajyZb*MA$6+5+Yor8X5C{Rj#!m>JJ8E5*;AmIpP(9|^Y zO{z?g`bcy!N1zAZ-f7DcotI|v!LRweO6|os+06hsltaYFW~EP8)ow<8T6d9sKPcY+ z!$6Wy2JXPWO&Lx_xSl2~J?|MWN_RCCg{SzRGrPOZ`ge-E|vJode=uf zdrOMf4td6WUwxAQvk)!*N~|$ZaLrKwoK~0{LyIDJ)FI^XNLKiW-3UTzVf*|>t0d`q zwK8^ys*KMTxHo~FHD7W}3aT3kh?kz*xYwGc!B)+M@mhMJ$(O|bB~FVyAdH1buOy&Y z*6hKbrE6lPpk_IGFbT}#E_*(rRwCm*tIp+7H8a92^e^IE?D1Pkmm9{gvAnJ>HojtM zZi``R-ECuj)F2^8BAmHofn-K+c~!DRk#V{es9u)|M3mn3AkBw@6x>u;4JCdLHzB#(j^|JYKZ6=}EyIwEwxd&wW*HUo{C5Tjdl{J4`{( zmI+Cut5G{zjfv341fSa08*f&|z&Q!bPnwZVfex@Y?mTMCWavqFB$VFSq_1Jv6df=d z;NF;0(VhO%`bG+Q?;=$XDueI2=vd!_`*wy<8q$uFCGfL-@JEa%KzUxY}A#6R*$W=f}E@=-*;5 zHhx}W5|e@!Ee^C@z>DcV^z}{ly9+GnLyhKX;$Wl#iVL2MqhBO$y%|-zNyzrmB`$~G zpSYf;_qcT95&6L7wVRIuW2_D1P5;M%Cxn*|)~AL+bg%x-t9c(-C#^kHP|vaPPWbs~gq~9_JZ;dh72B#} zUZRk{7nCS8fFjp>dCxIR5Yr>`NsnThsylQjg&*w^Mt=EI!nPe<|iGepfph#X9 zm|j*oe>pAqS^IDg(#=rfy>kN-U%Jw#YL)spvp|CgtLLBm)$)3}7mGiC@|zJ7{}NDX zoQcuGiitH|jcX_#>7+Sch&OawGbxBPl^82sQWoO5S7IKy;>BhJE#ZG}q{(({2O5KP z_K8!!K;$ncv6@s9Z;+$$B{vw1NC}zv#F!%xW3v>7;c7pkR{<53r;DJHff%{LaATy2x_X^DB)E6ZRn;F;~M3{68= z+EyMalYKr+Sw1ur^*Qo&}V3Hr~$eo#qbCcDv+5e$n* zAU+B&oyBKL!0ZV0T&|m6n1~{ysWOHUwU8+&F=4}^5i(8hIs%;=3MNBpLld{a&WCmr zlhi?xExFAfHs5pF+#qhyeVKVacclMK_>ijd)qD6lw_Wmdu`Ex{5_P8Bu( zn5SjN&tITyIN9Ce%q~1kP8!}MA}PkmDj(YEBT$Vt9lRaUMq}JTb|ll1k*nIYTnO<9 zgitsFtwJ#|5*_3(sDtyLki@0LBhd1*W%bIqBhcG4uOm>TXWtPhqq$9ev*!pDE^;V* z1p1tKcpHhQQ((Z;Hf^dHWKxm-962R$1Y+L9LFwTKUvd+@qK`mtetzV<QJ&l$cOZlAZ>b&W75|JObT$d5A9u zp3}g;yB^1wwSPBp`3BeE0k_LMCFoPzeo5btZ=Zg1yLP`IG-w%+2lK}$N1z_{Q-JH) zkfX+s_;aMl=w=aG5wM6y@R&q$I#r-?>{}xF2vmv0$=d_&hjKd9o(!7^BqQZM9^O4v z8}BKVaP!D&s2yg}_^U-qi&bC%IHd{?>VH*encdI{`Neasuopi97k~pdOJ`6${eA0&Jpyet+DH>`H1fMfU zAP;264h7~!D>wq3{)T;=M{C=J68kv;gSvj950RnR*-+G{?_neAg9`OWpkLS6?l!na zhMK;e03lnd3nSOvF%yXs*BRO4N}hF?6(xRhHZJ1{*XcXd=4n8y7^P(AMHyKndw&$H z)e%UR>0V|ha*2=mt4*1~9IlRe=p9;IvmFyRLM!*BDW$RpU*BR&YSIyU3oO&KhGczU zk%GxlfURi63E+8H;%_deQZwMt(~!pC0-^W;3-ZU!iQPC?+PP{Us;Uc=I<~aG=K}f7 zBBoR?);*~~MSywfvIvFG(h9u&jQEuEeq|>y%LbsM zyUfv&=da|2BlHosgVzXGeV^xTt($)JQ1B4>*!QVm+kU9-^TSpNPRTh_ai?pktAkQq zW&tFnW&?5Y0zPx-S^vaw@v(=#;USfX1hw9^65PqM)+pSNXAMiQ<%kbF zVJ#ASnZ)ocP}Il!@EpFiLN zJ$-NIt=2<=DjhJZ=IW}%y=eI@*3Jy?yn@LY_b}mMjFbXRja^N~X#l!SjoZ!aixZ)9`WMjYQ&Jq$=? z(5I&tBe()F=AsVK97?${s%yhai}9d4z%bQ3X7-mE2qZz~C5In@l4ztJdLKjQAWdJP zks3{^i^C$L_(jK>9m;LsK@*na`L$^W;4>8Mj@A>OZ`Y2Sk4s3Uha*_?-1xai1nU#V zq-Ev}hP`ZzMxC3+eEJ6p9tQ_PHtMz*k3d3)i;1)}=4jMG1}t#dWvHv`;i&Jmm zaJM$EHd9nl9L~6_;AN@4n!0ouFM|d9E%uZ}Jr)aw@FM$+cq@FNu0cu|XKcziBr;W# zYt+gmpjhjof1K-9)p=*`-V6RQsiP0@3_>n=j?Lz<7}2uhD^FuY-!T7X8*C11dG^a} zNe7F4ZC{~JjzAS^GW1tZ+EbAq$^o2HaSlw+8#ybQ+jO4zyFK-{CtE~Olgs$}patQj=wksg6_Ve0s%|CNzGV>HCU2m@kd?*QKh3v|YZ}e<@`CTMaYocpX zz=y{>jzDWseB2h)nD6t4p!Ors`i-l(F%lKqXZOM6mLpJd6|E4mNl*vk{CY1*A=DQt zK%Z#)9t6cQ(6Y3<+h|ty!sXD&BhXjRwoN-A=8tAI@73GTwM*z-N=G2t-QL9PRUijQ z-g%Q7BMSQ0Q9kv{#ghJZ5_l-&rwF>0B=_N*2I$VJZUsXYf9hf6;RDJd-U25Ri@MmX z=}Yt>q$kKTnGn+BceZT0rbK#t&cgi$4M-nI=c}*R;b|tgN6_k?=(1)7a%M@W_C4aO z2GV(~PdOz>;KnYa{O1pm7$7*Aneu3PL^N6W@+v!_w)QMeI5 z4{Al+%#yobS7B|N@}i-S+Dha@il>yVnFmGkKz?ncjxH}(Dzs56-e1#rR^_;<%9_XlZbd{GpW6y%Rj zkSh2ydh{le&hY?3rKrF8HGVgTwboEJN~kQci;udMc6}n-*kuAO>Eei6`UXD?C_VT~ zGKNi~tX)%$bGBdB(jk9fA7`r!Jbo!yJFdu6TXZA;eA@SQ#VV}{*?lN^{=LkBFp3L8 zq)=plV6xtPu8q~|{#6}kN`ugIoZu*tBPfr_j8ruFtt|Ol^5=a-IcJoWw{4n5LXsul z6=O5mKKY8BUE9f+)SUG-Rqy1_qyvdBkXkxmL;0UJjO=Mg(wI$=UerI1K)LRuX8>SK ze0l^r;4dlP_=!Y+I^g^70ABP~ZEXOe+FNtT5$KdNlKNfkcMDV>)`_Zyh9fQ)!{@u~ zPg2_RR@3HTBQ7A>B7V+}bd1yaV3ea=(D+FLKskIzb%_2A^cF#2`W$4gD`jg3MlC#-ZWM`$QOI@qjBP4k>}-?e!Q^f~j3 zWl-rMTZU)TF*8sq$5q#HWccCs?UF?OL0XUU5$>_q8N-nHT+C zVvtxv|NM2?_pOmafBrC<)M~QQ`#&{k-hUWW`EG6Np5yl}8AKo7SBJexZe01_X5w=?CDU(gC#Pp?91 zw0khj=9J4M6Z5eEpLj4^4aU%Hq|FU{dbKeOUFbfiG~v0ez<7y&h3q>a9gwNo_v%4I z?TEKRi{oQ1K|QNL{abf3zWHzh@wk+7@(6UBVUd9@i2CU-oG?VwvCQT+&|)%SiSubk z{YOW?lmgCMOgdsNMoIcs1)@dLMK{iuq9q0kQk|0`ZYE?2r7tXTm)dKkAi*3NAUzAkvVfBEXpvzDU-ybM9R04=TVUhfl=#9Q!M+mI3 ziG?u2eRP32!-faS5v`%w^HJX2Z`~d6p%)3NTep_5H?(mfB2nsWv~uLv%{C9_L#4!c zPD}lBcB&=-A$`3+Sg^gtg)qy3z&8y>d^pWWbLN{}BRkI}881 z{pZFUSdj0J(j_4YLc~Yy&=UwXl3@b%LE4My4fPuo-vvmN5nS%hFwgR#?Sw-z!9JD% zW}rZBM;ZouBcOy9JzePL?D>!LhlYl=htMfCb)o*^ugd4$vxXxqMAGoiu|<;GN>--~ zHJG%F(quSaugIKybp&!Jf{l%ot5!?pn5UOCo;pdx1VSTJ z2DcbUXAc*s>U@dsa}CdZnKoRQy$E5VD4LRllNaWh-R*BoG=tyVy2vEZ5q5>Nn;wmw zXZkX&;SM_=Tlgi`hDl|n%fahFLmp?oeC`} ziMSlz{ew2soh>cZJG+dGH1$4PBE8|kltr|fVsUAeJO7`9dB{Cxl{HO~g!%Zk6JII8g8UN1{Jq8%9FyP9lzT|Qml%C$$3gQ; zy+9x#bB&|-v0W#@jBIee>hY!RKCl9KpDq?0*^-N?OYLjf-7^neIY7B!h>#x(^fUaQla)YfF>ydIYb&@GjktPHYy$^_mo?xETFO zYo#c(afXSRSkKD3Xl`rDAuIWJ@bGtN?fbtWGw^d~=y!=e z+rlF|IXNa&ES}4kypq{o7*){Mz~%6fI9FCWx1;9-C?y2Q*6gFr@u0LI++E^)#7?`s zHS_Zwu6JoLFV@?&8CFYoE?TWLwX`(lteA~sZ8EofY+6SZ;%|}3NSJhA@v@n_OuwY^7m zb^bH!jpHT$p_q+FQxTPg_HzS>Ym{sPB-~zrKKr?~KiECkGhh%{&nB#TZz$C_)7;)Q z3@J3ZIX|^{vhPMn2A=Qt3w^#p~!b=)HED;UQ#wr?p_SC2?#Y`DpXdCJc5sv$wKBTTz5GhviS& zQ~bN;_-aY>Po%wl)Wm}QFU9Z1@4Vo-Qxq=zrGL)($sA z3v3LL4yRDX?sNg-N+itUecQP(5qKir0sugD0W#J0*7i1+~gC)g?bWXNZ*r z=zC9b-%ni#zW?-FFM0T}mxbn-S7~6&#Y4k!`9lCB{Iyw*P$q1jw}EfJPghjTVQX$k z=sxH^xZ^z0%v!E@u8yH&PK<+elXZY})87|=1iD}|ZR2h)GmJsERXj5slRpBnQ2cRi zOs|&4{HBT&#b4-5=^yEDPH5dZJ}Fil{-RAy54f8c9fYO4;LCW_(0sh?Ii9@n=o`azeblQf}i~eLs^Zx)-?_{^A_0MEMBjGdT`DG3n`lUDH7OkA_eIZB-_14FplZ`jS zHrs>#V(Ct{21o9w3Jn9rffh06#5+X#OTMa4Y1hT%t8MiJ>sSp#i##kwW<46`N&^maYt2<`{AsK*TI94|=OE?DP@wE) zWA4EqE~ZOs*iwGjJN3qBWm0Toqc5(jIF&UMZJ?D`*z<@V<=}vxbPEH2-b~m1xuy%! zZV2EGZu|AgT7JnN?)Q~Un$f>OE+~Q;1{QCGV8*^xm(I<5)J;6{N4WnEz0{Y#JOaVy z_f=)4p3w&c7NPXga#o8}+>lYfu?^DIi62ut-Q~PhJMC?p?A5E^psU|-ecCm;M|9Z7N0RrZ zZ`W~hkdthKF|MADBwdNVfhx81XxXWK#S2T^E{{_j(Gf+_y+7j4^UC&-SlbDOP8G@J z&$^8aySq+@ZxMs2 zzOGb9zLQcdN^+4~LjLt6>z^AI;JjD1`hn`8C#nm$5;AIT4c#tx=`#Q~j`S4S$3DIvwdAj|1=mk`^_{UZ>UNw{RspJ-hc zv;lWeFxM>>qvuyDxz8HKIVQ#E-A>ZshggRMw);kPQ_oQ>~OC&gX6^{AR>A0?=n1$ z+|k^c1){xDy0W@P?)ih6DW>U?Y3YVqBL={sxMbtFJi!8P%_1!wT`BpD{o{*1?aJ!> zIt(#Xu^ZnSh&bDp>lyY%L06J3h^^&<#p9tlJ?{K(9gyfrSPpnXGEx7%?a1Ap!Rm8N$Aj+6pM=b~mqHZ#3ml2~UgyirsCcAAdxe;ZDY* zw&{H8SIqS;CJkq6=UV0`dkN;*iw&I7F;b$7loS(M~E*YLNWQ;H)G3w~*#;bmQb1?eYw5T{2WgRa> z$`VT%?&*9XT=Nrq24=F~bT|qknPA-8J=39oL+1Wb(Ji*%sDg-agnC@56iJ3XIc} z)a4k7onm=+hqYVrTw2-UzQCHnaCL=wwb(rJ^ZHmj?Yc24YSb}=j>L_`i_71CYmmjB z$5j?v;$tCpeMwAFOi_3m;PpO#kr-;_q8gCE9px-XAn#SEOLI+gt%@rEkc*-VJ|nE& z^vRppu4c^E$hJ$o|K5IbHgzkXJXIE3JZ-rVB1A@&x|1y`g8SLCJ>)Cd&{{PD#;JGe z2QFH~;NZr}ANufd?rCsy&Hzbd!j*$r0fis5uR_;b;3}!>tugVB=x3`msbJ2 zO}93O-oXSh9iajM`}}zMld%8&Y{H)WU*M%MhHHJrOITxXv#Y5>o;QMFq93)6hkTOrd{=8^CA?yD+}yU_^DZ_;kc@M*))8+JGaFWlDoZuZlSyp*&*)|f zK0!b8k#t^%YC&k&4uC}PTw1LeQ_#D~7Sa}@04K!!%!^Ki7K>q)#tZ5)=0aVqa^^O4 ziQcJ!r%H<3LkppBe_W2>fdC;A*w!x7$J?-w7^=mMZ;?ct2CX1W;a`vjk_B<|e~2|g z%>S1GK1dBe+*`HDaTeJ|A86NRiHgs_iG=6xUk+H5yqmjY-TmA;Yb5!(&vYLH$5 z+y@t8+{gbCPrIV*{94k}*xjW*O~+d}=g@ex9Njn;*kZoEXEpBQgSFXcYN!^?ZNAf` zY2{TiRy*wl{0Fc>-G8kf07MLEiHm94_imei{rSSbTW79Wm4*llWd`qoW=8(<-o zAA!s*qDwYnehW4q^8s|C08mtP+;pYqFRgrjSVv8?pvCwCl+x=|u0Te+QQ9iPqOY@N%qDa zY97L<1{5nIl$=V*!DQ0%y4UnO-5RY~Q&1(>DEfzqTWo>1n($zX&BsFxYn!eW%Ekgi zH*+jqjW|A(nQepDs$A?hq;o(clX(&Il-mj>XsXsou8XgGen067$wGFblO%YxTou1v z)}3DwDC$!0K_6s~?PxSEkNWsFveVxIHspP^46j?9`8A$rq+IbZ3YAR?RAZ}83`f>D zS;NoPdv2eJB3sS`F?~)GVSQoJK?o*VW~mi$Iohcxq-w2cMO=AzB@b#I{e6Y1;0iFw ze?qt*Bta^`-+gY<{`C+PwPS&ymwcW7vBC{d!-)AKQ0AZy?Jkgu954W7O8lNWz^1=E zICcbLvLZ6lqnNvysX7pV2;7k#k5AkRCY~C;WYDn<=!)_%ZXsLGGYq2;s-?>~tJE-wb(PF=b)p%gG^|w8f#{ItE7Puex`~nGA_`$^G zHbRT}#4TcXY%%2e<9ScF8x6*Ho*!}Ke3W#oU7z?O2>{xkNIhzhaq$7 zeN#ZjcY_Dcr@EBj5SOQ$6&fcboZ`#!{7Tt$m5#^YC%>4nhYihaK}*2TFe zfk{N~m5*UREbYlRk;j$~>af8DFgM|BZ@6;86zQePv!uSU2sOC^Ej_YdC`&%33ZQY4Q>?z_^qaTNLK;hJ`0DDabaO zu_Fer^-GNV21+zgs${1 z8%Wgn{6z%_7aW2MQda;toCQNZIJDgemcuzBBUnp1?Dr>tBTyISHq3}i+24{0qLN!z zs#)PdeO;Wx74#2Aiapp>HMkevb>vdRv;)x#lR!wGt>Aw`Lo={UQ z7B!c3=NBB3#$GyZ@mx&KJtKZbU+Qg!%Ntg4n^`F{ZF?H;Z)4D zM;J?e#@>5%`JtM@O9-`5>C>>-@>7%yj^^R5a!Wa6=lsoA_HbyYQ5G+fWi_Ow^4|R` z^&Zr<(HuplJ`?s=1MwkYH1T?BNYLYseEuuMqB9b@(!*$DDR(z|x9 zmZRv#(J}-lou_(%lXd|d2c{&20a}1nyK;tKDjHDLiQy%+Ysq@zeGgV0lXH%rQTAJI zs1fK_VOtT-I~U-@`?1a~zidZ);;St$?)yi-=;rGR%1f_!lD-a9*K6mz<49Q^z5J@1 zWjQ4a!B=@iF|pZUu@56W6)cU}X-edzL>iG!90ay} zDq^d&3547AuSzc_OV z7VE3aDSv)l$X)8=txZz>{tet)Rs5rKp>QJHeK?gtg+j&gjENbr3!RqqmSExWFhT2o z95G61xRO7m1CT8CZ@2zQwfv-A9v^`=Hwxj#5T5JN1m?(j1_Z1Ko*-CBB%?_i-E>)^ z1&*0v#=2nOZJ|fV?%=a#tA*EPOQVuo390V@RtWa-o%P&I=W_S@x{Yfc@$Bw=IO-zx z+5#KtWMV9x5fHC`%!5ZBip}-)n7}u5MtAhG`PQX;eDUS1K*cEi=`Kyk#~^nNV|8P9 zIkTh-<|yq+-H@=t@7pVOIFe>0vKEL+YSZAjPKURK%n=`|HItVI@;Z&Mw)`qq6X#7< zaDpU-tARg0RWrRF$}^Gda(o-vZDyDVJ~P@r5w2ujqdbKwTw3{R@p zW6@P`;?(sw%4~Z>|3U{56LB(Ayxlo0ME-E*NQ4;d9fi|)L{fgs!gzwJAb+s;x7xKb zmWz4AAlFpb44nZE39G>6z6%{~5I^CFpQl48M3YQG3gf1nuH5 zCr=C(AYhbNd)ChD(egByZX+qI%?abClBH>>UjRF}(NB&q{>wCa=Wydy)c(eI&P9f< z#0v;FQrCQfng-g9hc7-K4#Qc?L^O*z`M;ysbmXuTeIje-&r&RK{CpM7t)tsgHSw%B zhb1Mw!oTGqLzNTsN;alTKCa{#j)DJEO@jCPRIS_x*Ta=&#*~cqxKhra&P($>CBhPq zd2Qb9^2(Nh*}-3&lGWX!izSVblrjQ~9j^t#%!;B)l*dv%%EE@BS-$E#K+w8gg-EwS=VVW4Ft<&&1B_IBl?@#`pc(G@HbHHN1&L4?(jD^`X~OT zYPdTsq9RnXhh)_Ah~RsD{kLRGxs)bNS>Ic!O87zOQHhkfcb)QeH3iiywj7=XmsG@FF;yrK@&u zR{Zds`%74D-et}nezC@eM$)5%uYq5F*id3E8$RdOn_N$Q>wf39*!Ly&A68Jt1=#~Q z(noCBjQF|WY@n~l`BV|zYjHvvXV?mjvuu6N4#(S?dN1xqUSfXn5iTd$TjUT{E&jSz z;*3F@m_?7)`FQSo&z;WTE3WD>X+88^M%(+A$3IO@9AD!76ObIO8I}W*sK0*>h!!BP z1al%gdMK&{pXZN;_gf_?ss{tZYfLAYSc4Ed6$B`cp1YbQ;Rx5$JqvhIyS=5k-ptn+H)wv_{kdi9hbuUoMkw<|VjU z|In*#x!->TVhugz5R6B%Xg&0zYQJ44cisFuhPtQJ5vn0q)QgGu)bdU`zLf`FSWgQ{ zbl!4Sa&ib-GB5CS($R|EhhDf3srHXaU|H&LnVYzDt9J+;AD2hV)2IopK^tBTpU(EE zk3%Hgdy8(L|4o*<5^^B$8;urF5^+jC0)0SB0Ak)CAT}BmfkR&)Kg0?FzZ=*Ab;N*M zF>8p+3xk}9za}=-Bo=(mZL~_0q|qYj4sYT9dM)D$dbwBaa;qvMfk4p*@d(YG8^bW z)~&Eke!bG*V&djV;_Mty+o@23H&UjCnqpEO?rbX=``ae6+DtmQe=LXDXN*!JJNVC$ z9(6K>;W}DR5eJ$G+ZWgUf`fQCBjuZBolF}APEJWkaJgo6UCjP5a8JYMg1bwS(pZ-3 z#uP_2KGffeI1yFTH_O?{e`zf65~JM^Rw7s`@REqtu#E7??hRS`_`RxW`!Dv>gRnrK zE2S?6*n+*R4JVmftsKb*eQ3`c zib{mk)uFU2@=H3{n9^d=k^Q+C(eixt`ky+%e;pFPsZCQ|ut}%OFa?cuib0iw=hCm2 z$k|{&ow-soPQbHI9hY~=V-;7uZ38zKKSqyfRfa!WNQ_b!L0I~nq#(QJBq?v1yO^Wg z36SHI^u@%dVHbKZ>wSb-D{mBjpu7}uk%WrCN<7ZQY`NxA^18x!C;m>7;607q2>-E6 zk-pkVvjHb7YGE|hq`f$mRIZ^7_a-$~%FSCm>cCq3Hc#X+tX&V;DtnXw^q@ry4u!I z@$Jy@*CDz35bNQx+_WC+&w)xY6`8sdJC8HBcuoHgU@bb(~IoyE<-W@36&=F)enK7Pvs^yaq2 zdO0T*PJsf+JG6~ho`7_2OKfE!Nxv3JN4|w80#Gn~C)9W}E5+Tjyv-Rd!lIjpV10gd z=C--zgQV*g>a2%1>7QHAP;d+Lkw7C(T?bHUrN~p&MiExNuyS}c!QeINxMlqi)pW{i zn&LRN;}d~m!gvPgF}d{Io4^p7>&B&7O(wAJQX*9e-@mD5d=z!5k&{#xavpp8wCi)~ zIlD(Oed0y|PG=_C2~NA7p&_YuDg&nO#SfDLNZ4YB{ab*uH9_v4mDqJ6fH#K@ zg(=KEbY-F<^~!vWR>?nv7;5@>$d)0+9>wH|tZBnv8ZQq(*3n|=+_^tCk)DU(DfK>b zQ+f4%j^UK+PO_jyyRJ&Ju{eFSZu!+0%Kr6T^0UiyiKw@O8tQ>7pr83mcHAlHoC4Q_q@URwU|V=&XkTqvHK0?{t$_s-?s()t|?>v z2sDmRq=8%@LB|31sqYA6TY=n>0y+iw>W)A;$T1Y4a#L6>AM-g$A3#=dv=zb-CwRrp_EcomO@t`T$K1^Vy=smiKK|@U;%eJr_D0+yc7}a++tRs{6R*De3p5 zJ@ljI=eFrW@H+I5Z94+=Aut8m3W(QsWQKl!+iH(MR>b+8W3OmmnCU)>zc<~+jt|*^ z^oS~neAX&V(GHc#Bn&=ln`*mA=l4-Y-J=8+&)ft$ShPD{xVj-JT7g!Q>H_XT?>`K= z@1ZXG^oCnE{r=0F=ELbcw5%`|z!V+xEL4#NRAQtZ@!h*R@^~Yv2N|gtqE!Twl(X`f z;;3_F-t31-eG4aCy0U(#F(H}TSex`iXH>>3ui?qkMRanu3kA`0%s5r@)D6eNUZpI) z{0i}FokPY;aRs}}ctaKgfD_11PI0p+CS;Yuvouf+a-LO~v&!Bsl|Xse1*%+Hdo4ls zX}X{gWJ?&Y$7&Gx&@#HP0no3PE;KY40+n;O?Njh30>f6`;T?*_`#J6jgdM@okQ_&u zxD*kN@0Z@Q9FvZsq!Ns`*i+-=1{|Xe_E$tN*G0)!>+pFD+_33@R53qS<6QE9)_~(% zhf1`gA^3X;p)vVvSf_;e53(UQLg)J~&^M~FV#3~!io8!EHy!t>ZLJ)V)_x5h0cwY? zTNq*<0HnBpi(!sv)P66+2X`E2j)Sn)Bwm_BCdFc+}%+bR1fu>)`?^%PZkyRk4z7B6r&TG^@X# zyGC?>HS?tu!x(kM`dBRFEi!<^l<^Q^__eu-gsj>H(3T?x)w zcSLWA=|Zfsbz3Kel*WqAXc_kWzMbaa8m$hX$)nK#O|GsEz{b^(@`2y=-R#&Zmco;kPl4_ML$G5&Ax|6f1Li`!ge{zek9GHOPP+iXC~ea2o# zV)!-pbh^|Kg2e$@2+*z}-!MYG6bpQMc;1NQE@Kn#HoKuyuy7LrU7c<~Gz^!gxk8)d z*4^K%HqH-{3|W`>F1=W!#HyC9E>TVo#oqf0k29Cyj>>!5SGCC}Zd!1*o;rB7)1iWk zN3KLy!55w(zha#AV1?h)MLL0j*@QhRT}lN}qNi-&pXEMWaAL~1$h;J9kY%H5l49bn zTAm8~9g-r_%3HZC5&X0Qx&r0+O=4>Sp82#JSL6Adu3XS~P5% zSZWx>#$Usf#&I;(Ow@JnOn>MPRx1&(SVjKA+LN}UuJT!>J%qA3hmAQmYvKa^o6o@x z!9M4t-SsYae?~`HhJ49j=`==L%abnTMFG;2Jf&NhI|YjS+iV2)#cQ?-v3W@6=wAPr zozaHi6!9_qewSXFaZHkNO^UN%eui;S!$9JtY}j8|qD5!hc{eBr;*2ZrO$YoSZQ+5tSdNnNH_O8Zyh8FsQ8@OG~?(k2FMt6>P!J#^Qdh?*> zbuyiup$lW8GlaM`TnBkT^yx&&=n^er=|LQt6(a!rW z>&}#D2iyD=6`jX-h1?Z`Rlevb7-slY7g;}h8>5LZL z)HHkVC?e7?67~LLce;X()mW!PL3sD5j>d*>Lgb1_ER~zE9eF?l;1|LlpZ%yqU1&t` z`}U3u%i5zx^&$@gUHMvz&+SSvX1ohomm>&Qs&IlYs~VO|b}8`94eOKTPg{j3{fbe~F%oqY zB=DyPmYes~MVr#~iIDIbj7fJ6Wb7@d{~bjF$AKx@D2LS-w-yy@@P$Y}^EU87+$?rC zXL%+yEVfo+EMGK`U$%Ia%*L%l!pgv4=sEjL{;086e&Bcsk9@HiN-kchL4m8m zz}#Bvg7tuZP~2r+K$v_@za~+XR?rM2wPz<5YM&5WyP+aoM(*2x@YXm~(-5+n;s?`+mhd1Q@8euB~GHiD;eovxL^?S0;MSDJTthm}KZ>q@MLlZxIP=?vV;M ztq+P1(@gBTUrqH^A2x24#)k2)pt&U;>%vux@}3qL2@Ps9>l)h*dr=D5jI6kR(zoDW z`?yNmCVTK|U@p4Esy+AEN__>Nnlm@X919>`H>nf>78{-YS%NdnCX@1fl~4t8p?pzkI8H*Iw@UlMaUmn0|x6t1nV* zZy9XR(wWa<2?gH!}TGnbQbOeT|yqKy^b|pS-)H&*KB9Cjfb~Z`Rd_D-_ zCH^qaAe+bc9$NPT+CY3u>q1Q2l}xXi+@!I(cbJObN+BoMzeBbFB3;D!@E&rq69GE{ zjinMi$n{9NRv*3V%OFjsZ}2VNXP>|PkPYyuT{&^}M*wN|&2acB(31Gae~%^^MuaBi z$pZY_pG2PoH7H*1@kc^^Yb|j;8ryPq>cEXH-`HNG0BTjxm&*}ve{Z0&TD{ zmaAcxo>`7!VY8}#jePU@W}!b~O~-pVz5M&pqenhKdF2oHknTTxhdvO9m)4Jci_3QTMIgJV;dmiqd zy$VRJ{ARvoi$64vyL@*4gcDa;v|!Rd+9>7zPg^{JzCCvzfXBpAq~0K8D*qq$-aMM^ zec%7@-rb$3YKs~xZBax?DQXCIb(@Qtf*>iXgsQoMkXFs(uCX;%iBuy}Lnt+r5WCbo z)lejgqAIDODUp6Z-S?i~_nx!ewa&fgto8f-@ms5FnZioa%0**oZBO zz66E&Aq+3gTh5w^Pu=wR^%AO?i_t;w3|*P{3?@DIJl-ju_+&CYcjmZfj!o2!?!W}B za>PZ1WdldB;&X$8yT| zbD!4W`4;{*yuA3xCc8H$&4(vD4C>}HUm*8*S3hy>jheZzf^Cl(8Us=CC6NYhs`0Ku z>1lZ(FCN=gbF zw%(~}a-lAoH$MoL>GKW}v;5`{>EkcD7NGyzL(SrY+PpgQwz}nDXQra#AjRd(63oI> zT8#>~DJl786RK3E>)#MoS0-fgo~Q>LDtSi(je3+dHcxGJ!IrXFo%BS>dxbpR-P?blM&QClvf@(C} zV;eO~D+F)l(pHc4nGe)_I3rM9c~8~uWOx95F$znwV0CY$c|B@OJsr_sSYyyJBd{Wx z?LGRCf&Gbdcsd4{9UXU%VEmhmd>|p;wD*V5fJt!=&5<9`qPytHRHn(?<$M|aM zWd^o40f`^7QhDwQf|+^YGD2}48}@V@`D-k1A7*y+da+P-O7>;=##$G)`y zww?l??Z?0~w85JSEcri&f8W=)r$T__#^PaW&bm`cad!(&A|ne0FA<4oznFtQj6@W& z#eq=+SZAEmQQ`6h8nmMu9@`O0ou3RU!GQW9^FK~8eN5y4wk?3};MFIFd~Lj2Y|!5f znkoHQVTN(sk?!&plDi(Gr1sWHFS-qYgs7(D)v1<*xcLH&>uGKM(Qszc5Z@hyM$Wb#mW;1hU}FC|E^6EhQGi)<3bEyJ%p0<5PXrMJI)7!5AaQ#U_i zZ0ULNtt)Ul4=PyJBh5(S6Da{pmX3j%Gx{7^C`Ko(F1{HAXLZB+KR5ajS$O)bY~~^B z(G8trrmDp_mgQ>{=%}{n;7Q)sdk&MYrvS%oW*X2x|f$@1Sfcc0e+PSO6BFUV#! zpnJW+di;G~S!o?oy`8)=M0Lw3b5T^59j4q00vqtg5n~tg!Sy#$^$nNsvi|yH8~#a? z0<$q~lO#p8=XUIznA;jY8m?%RwsvcflYC%Qn>Ni zJsChNojRVWQQ!9+(B@wPak;XBy_wP`%+%ySCtIqx1Td{mY4oFEMJUBA?S(BZ&DUT3 z9D#$rkWznp)BL1XN((_NdCE2t!kfzLX`yK94JDN~|G!jQg(#^cwJ$uxI(C}yM3$_$ z*j&2>CTozrsDUrup>)aiZN}4+d=|JqGi%>BJDHm_8u^jyrAIBKg-dO2!){1nk@1*I zCydFC*TC1?oTbc~JTpF&6Xw8bB$TloMt=9L=}fNeaN$v`mrs1e&x0G^_Z?#8XvxtR zDJJ{Qk{O_O=diM?MH6ZJ@sUs~R1gZdV*adAv6V1G$r-7Lm8TpboAO#;clOEpNUH3Z zeeq};(J8E(kCyHc4_X__&#{piPPCC3N#32P!E-$fr5Y86|I^jh*IS^JnX1lJC%Tpc zbqL!=9cWfYS6>fXMbi3GfKLTq=Xke&dN}#cV}^%~D#HkmLN8U=EsZ{$Kxx2o>G?>Y zSZgpmL#`YOO1w8@(#MJfM$geI4n%GM19h-j1C6z>x={y5R5DZBLc=#i>-EFDNaGW- zn0mp*gzKg1#pew32OfahJ-1V7*{fd6ORqz1Vjnab=O8;;Vrs!>$PDRro5o>!KhbPI z=|0=aE5M7s_OoGP6RnQ%xzfAH#JA1cR(IsO5Rz62J;m@f0TbhiF?gZ2f}d-hlZq^p zWu$~G+g#2fl-;;|6QaRFIe|0qM<3D*7T)#oO5Ka(w70u3g*2`w$-1GFhCs1|*kUvA z#p3%NR_$$3OM`f!!J-(dC0?3o^ES;06!CrEUtt%|IFo)Ij(?HsFED)p_n9+{&rT8vpq$KBH%MKa4=*xLk9TB;(%; zDKa=^`YKLbEfYeRYqrWS-X-02HLglPsZ*6Y;6y3uF2X>jF<<5|xI18>xi~f&?D!81_cpIo5f-uyagaIlpjpf-0?Y)n z^;tf&!yD;z(rGlZqk$(sPXm&;*>ua}!{BI0p;4Ute4`v7RZo)};hb7Q9#no4^vXPG z`X^>zQecn1DDS6m6WUC>JmfV(lJWk1-q0KWKY&8;7xd1rqvd3el7xxRqhAf`8fq@; z1vo!zo5l$02-8mqYET&w0Wq}YZ?&My1Tn!8&kq?NZQc$$KfbZ-Qly(7agHVh4)XPF zx9r$O#(l|ay|EaVWuL$qu!9HC-qH}IT#Xk8iCk;rUyP$%!L>H1`e$V>zQLA}8SdQ) z#THlI3>K2Fn~imn4ve!kSjBXmUnbb$)^1)-!)HDW?O)SxD5 zdARq|-4A&%ug8*=3^Vias%QY>QWy8q%KA9L75*^oD^8Z?0v7_h|Xr_kED( zz;sX#U}c&G6)f$jv85l(fjYvuDH@GmPlK2Z^WQfb%}^gYAyt$`vSo^8 z`JyV3eMd!L$u|{UpL~P|)rcTtG3upH_Lb(+c7HS)fgiU%J7@|CRE!T0dzm}>sYMu_7SjR8 zJYqz^W8mDcxda~h(PxBR`_X2AAr)iD%^f~7Wt%l&%ho}n>6g)9cD5Ser|?{0CH>~s z6a9L}v2MRN?v16+gj(jTHKP%BI9+sC+PXGnS*9Rd)9OV5_j`@4Gh1V|>3RX)7he345^;<4 zerAHV6FCVIjJSlBrrX9UgA&E}SF!4usysTB2-SoI`a0!zon)0Ki?2BfFJ4wNgCiv^ zvJIhHM{<`;3PBC%Hr#g7Ki+K#7Ap6JjwtL3st z=JK;7Sm>%;OnK8=Ofq#YBS46~W}SEn)Hw#9F>i;Nj;i8Zd$r$8=$#Q=X^E=lX^})2 zy&mm&G|y$(CJUUM*I4(OL?pp#2!A;H^%aT~AR zgRIHYQX&p=A8+L8fs+|#$0>d%?48pL#~s&gwqE3cbyZ}0fq&rZd6KvzRAVOKEt!+4 z88TJP8M(A!93(r6=K?O$HP7`g;VtuuHG<9pp4m3PJAi-IOeqnt*?J$?v${*%+#xYV ze;rimn+TZ0{cZH*6OR>Sqvm$u$B$0dh|D5kf1b3>q8i3M&O!%R% zw9_pT0ThJ(RgX4q``$YPQRnjTs>S@1hTkN%vH%@`95Qm^P}`0$rcjW5htmf*PF2Mm zQ7zno^14WtEk~?Sc>MdmBiZrgYf!&ulRDWFsOHlQp6xqzEt)NtR|fxuVHjqj`GMqX z6Ub{Typ2=>NjiaAGn_r@r4Jn*&Pt0B$&+?-@+V*=iB_}PXD(_-Ok--7|yJmsD!}C%-vZ@w(0xJa{e{{~a!`P!OUdZ@@{e$Ju z({$@WjyzkX(&7N=zV{+Qb2vMJLqX_*kb zu-pcYk~je4BL=J6wA=V6q$X$jjzIB>Wl6=!?Y2)DWZz-mcaPd|#$4pvTK2%KqynB< z*5O=6%^`6;N^D3YCREG|0Mm0);P#ED|G=mF@ii$BP>JxhGE?cz(X@O-SR(I%rRy_j z3SGbYwoX_vMvGCSGZAsV{(g!;klc>PTt7xTxnnF|C0V@v=dZ@R(PN`J)ibL{W+4wE zcv#6aBp>?%^KueN``k3^CW4jPHp5p_xNjNOEXEifgD0RZ=71W2tsk=pw8-BASHmnl zbgCC#HZwSpVl^;UpDCp-nL|+^zV`@|LAw zI2o(z#k<=po#Nm^>NI#1Y9xL5-X1IS^qVPuH65cS?3SC7lqd2749)gQRY;=ZHeAxlrW7C7> z4$z%F@Q&Ls#x9#PTk(VPQC1vY7~T{jo>TnPzqEp=pb zjeHJVQUCl~+N9l-=S0cY?-~x>&!*pqI(E-vC;t(fHrLHm$=d%*7BVr-?wXRR`A_bi z7e|mH`2ZMCdr6B|N3Mf@${|}SbFL)o(BX{CYgIiLw6tthU2yIV4Q7)i8|njd)kKd| z&0MT(S`Rn9@BW23j|))sIdla8meJ&%Rc9C^mMdIfJI%)b+Fh;<8uboLjE@VqG90G! z>}N?Qw%i0AMi2E2x48F-h8M!pm9TA3Smfs@4M-duw)m-lhm}6Rgy3Rgd)wr^bWU8E zJ$?7?xVNh-ajH@*GULO#vp}MoUpXD*j2VOP?7wpk8v;|p)I?%HGPDZ zVQ@VA(#Y$W^)^*OSo691A+vn7CdMi$PUS?fN8lBpxp||r2j(#J@y+Txp_@v#PiZ7Q z8?|V+u<>ts-dj%N`bvC2d~B7}RPK4Dk1u9RWmyGm!jCg6kyyPs*k{dDL5D%!dKgCs zi6Ktgz9~3}^UR>dHA_I+Zw(jec#HfVr19%*9exA=l7sb%G-+*sOL?nb0@h z?eJ=FBaG*gNpzKpF|;ysz< zq~gC57;0DV`UCp4{yKmQ{n~$q69PC;B5c`XdutYl=2-GO=OrJ$Li27#KeiZ{5Z2aV ztDoq4{`%2}i=4N9#wT8b7i3+3mz9##r|jQ#r(pXJx_-T(^Q}>5>;h<)`;rg)&;`JK zT)63D!tt~~zQBsjhICGP`DQ!TuevshN86$-Q&i(NQT!? zG~CLf)gXs2A;Tf5vdiLb#D<$tmjW}xI^Exo>#hn)*_OuVD{sy2TbI8Tc zsssKvC_ru2k>hv`AaQ$XX;cp09m5 zQc+WQ1pUgcUwI|jGEB}?yEj}vOiNqX=T^;&s@k-999mxf>CI?OU*S>EMbZVRjLS1? zYn(lpS=6nj8%Wc(y?O%Ct3)tc#?)Ch`k)*Jx>&JCa_DYR_!z45ihdOHh>L5CMZQLm z%+RyB3)*rg)1y`fP0iDmZBvz!i1XGKdSQo}`Tq{{k93ZBgROR}>qN5P5prXnHdh_m zK!+Puial+cMH!t5P>ES5uMUnZ^KO;0`C*njhi?tk;Wyj&lSfr}p~G0C9{v5@KC4r3 z^Vr3qKqAO;bTeF4@>>OjK9zp|WiY5iOfMmY7u=1D#KFq(`i0tZm)>5iH?xmUb~L@M zeKPvmT~tczENYBO_kAQHpm>6q(n0h6ofwDfPNvenuvM-hz@Gdl4L|=o;B_L5A9Xdy zKk3{utjsJY)2J=aG2^+}amzH;R>Bq}6>%V)Hq(JU$ueX^naH-6#9H4O7)j0KL> z2OnJB|vD{%V10^8QR30+j- zMaAFnnDva~lkFn*B`GTIARn~B))hubdHt9|aLyEEI5|rd_@dk+6fX)o0@> zyh%_!uA66>Es3Ph5UA5!h#{p$`^@N_n#7R%;Sj^2b8HP2`v>3;c8WiOkgw0toPBDQ^wm45kcNYRz=`&?;KczIdfT6Y)(=V*$H zZC%%UIgEdh9NM2|BXi3l^z^@`j+G&u&zG@U@J($}4;aqN!^6ryrI*3Wr=G)}4FV+k z-hj-erAri?e!h6{;hhnwRq${I&XVkzEV(>JwCEy+Rv87@5Y>l&+-fg$_1?tn`Y&tW z1ZT0Ic)7ptD?Q^s|6i$zz4%td4@+f24U*s9VG^mG8Qi>bt;yniArWP3Ve;R*DQTd8 z$$hvbuS4$ycELUoecNPQBLbV!ybp_Fty3KI?*#coi*x`cwko!kxazkSMw} zPX~(Rs%nh(c}rlcA70>)%CUQ%iQI}fkKE!(B!HE?sr(EU+a@$+*wv@IYj+O{bc^81 z9@5nfRxw9k*nIc?0)W)ON^7M6d(VfZ2H*GH5MJYy+>}lQcqg<%Wqu0>jYF}(Oj5uz zYXTGlEMwY5I%wwrMnky*S?=3b(klZm6o0jnetpQz@hZs!AKZSmyM`0ex5_I%49o;9 zJr$E+#4gj4G=?sq)`>?L1dB+#NZ431o=yuh7eF=hGxZ7|V2~v%5r>&Sqhs3;(v0b*G5~AYU_6bg>LH-ULhll2 zD=S(CrlTZ@b$JDeNSgNDr;UiSG&UhY>G`;7fIj&)&ux9DBqWULs>FtYPG{V*yEX^z zyup0O#kzfmS2+9D%cG~9AGFg5Lj(i97@VcjS2)@QVE+fY={CB7{WE2Es`J&UIFT15 z{SvTM23Qvd9$p%bnvQYtA@%y&DP!5F#!w_{}{^C zvAx%OtXW4e%`HzQmWFvCMS-5T$(R>TIkZ1Es8ZIJ z=lXcOh3iL}`Mm^>W81nJ8|X>kpldt(JYR>dkk5As!1DOS3ntWOHBHW4j#UB9H_jkd zcms0OqX8eMk~@=xaRG74x>DdK(M%}bMMjT9hcP_Ift~lC_iVYgK`=(y$*NtXXGMSvv~8mKy4&H6 zd)+0Sj%h&c#_;Mfk1zP4c3Y&vCSw7$TNJz^`}x$wR4H}<>IJCXMxdfJ?<$F_!EUra zpdoZoBO4-_N7^v=YuT5}?K2Z&boW$c0~Xw4U>15?&ajIxK3TVOSKcg3xMOmfGE_xM z8YpYCo-^mRak_9*c<5etz_rONyQ7z@DaJDlT#6L{#liY;8+Y@i4wMaL%2>AACJzT3 zHr!tP|G;DF&afT1fettjlOgAlS1o2OlIQ8-3Uby*mEvOBoU=@?K&4;m$Vcl$OUu?-SB%yXUE4syuw7E%xhZiaKdxQT-A9-| zFMYFX@y#b@Ocns+!P*w7y(Koc*L_&~v}Yag3LapT2v2}GC-Pw?ym1pwFO-zw;fw9L zUy5KY>T>-YKDOZ~=QzfIfo%uSl$S-aqsWg``0(%DKZ%Uyo-=Zzo2&|dWd?t}Y}Xxj2Ge@p_5cEPSxozUb!yYC@EyHio#V=; ze8!`zWSzrPreU)n5swM?lxA^H!CzE5#vWiyxe=(lW97mvbe|`0Ay5cirkAHBZbJ+4 z?%Bl?jw%=)@I!)`z`2qPI<8x#Tdl59TCm*x5W1Jw&Qz_*N(WL5Qz_Few@%Bmu6Gv{ z`5o&iaAq^w*uN31i`bAB)-^Ix-dlCOO>Z{%t37)Ls3-my$G&?d4Cr6fLpB`$e=Xeq zMhmw$El1`bVL7zFuyQv3O)(|JKXXomws%qBQ>`v~h?pKdb ziH3Q3p|S3o+Cun{&YJxy|HjfI!ebI85zOFJfBGqm)pXy z@Bu-%J_)TD{Ej|a6<9KtE37V5js%*z3}9~w!PoW2lwT2gBg5@W3yyNHTB7o;xG5Lb)VK2QG~@o0%Er>f-BA+Pm&$!p!=a0%@hl367gbp zBu;PzB<+42j&fCNDoM$^e8_j2PxxqC0i56}+orrUN~JT$6LCV;TQ35O9=Z5gFPRC5 z=6Mc9dFs`n2+`q!JL(^G_BGnl7C%H9|OOy$`*xd1)c4x@n9E*{+ZF!U!mDoxJ0IIi7U3MOlCBATF~vSg-|G$&(r zGKtv3j~9@9ZslJ(VR?I3shP#IBah0?1`yDU^{t0509N9y>ZYnj7L&0&@wxZ&gnkTt zVqw~6JV+`MEoG2mSE84uF7R;p;yFM`u}3%`3CfaZmiAFcLy?r!xNRIcHojb*SW_4a z01#BX9<35pfN;3MNmGV&%BEbl;giV2X>y>0=-zFcRNZ86wjw?3KJ7$_=k%d1hZWHt zr7vq{!`=$FRk*nym#^I>olW~M_sPxZM!^w_xh&ZeH&gU(1|2<2>RTzN9D&>2HiKM@ zwo|w{_t%OXito z0hFPP5A6B#lk4tFAu8}kNyT6i{0`1@{LVolJdK671n6dq>fYrzY3YT&N)C{ji4bOF zQ{?4nsqHf{ob#+`XPQ>9!w8h89F3$SvKc#onm?27Q}rGI@ilTrS*}d+8Cd^}V{L9b z+|jQC*H`M<&>82pey4ck@tM!qzXn~gfzYOxo{VV=I1xTn6qmGOo$p!DsrdHA#(Q{G zK$(huj6%MUM!J8QwxK~m2~Hj1pB~{IapDg@ffYK~xzd6VN3?A6an4y_d0G;IhXQ|C z6w_&0WM<=OYy%F{@Um3-g#>mD&%tgrOCR0VBWwgoGlsj+SrYxs(lJhvu< z{<30JTVO&6SD5SIoE^qo(a!e?0PD%Ot6DD0d-H$M6HAvgk$8GZK#WIVAo5KWyP=#w zL&1{mtpf8_ToqrImUUgvD;7v-hb5`w4y&ul)caFcOH#^T#eOM&-pEt~tI*(qxGTNQ zIv1&AW2oVK)WCGSxHy8EgA2?C-#_h+;OB@2q zII7AVKh0&nAEPk9IdAgZRBkGfwJ8*YjR*Lqe1<6lCkKcnk>O4xINc3h-cd#F%eJkL z=q*rVVHutDf`?2A`l-Zctb&=>FpZW3wkR#kgxh2l(hlOQ2@}2(AvTVF`F=Uanapq^ zB~Wt-tQ-@&O$S2H!lna2eC{Dd`o3%p{wSLpuBP|c&I_M?}C zV~v|Zkk`QE6=Fj}YP$sqKqcs||9j9bh9^i`vfQ)_1R zdd$=A`lC=y!g2wKc`&og1HKji41v-ZjW2)q9u?aB@cGi%Nw}xTt+LYTjspvY&+Ojo z$&=?Zr!G!SI_gPYqNYj6WVefOs_9K(4ori%O*x`#ySC)WraTrgvR1P069j+>n{q8i zROH_HLMI6;D~~@{NWPxAQ1MQfG&(aWO{+*}66Or3ald4VKsvMp>8b5nnr)o3ud;Y_ zt}zQ9<5_ifwL^^pbKK)Oa$Z`xy%RF!P=PtQHxjYtF`7WOT`3Kt(4bm9Tc|19vA|Z( z^ewRHu*Yvx^1knLZYw;_l=OY)c+{_+dN9So@kQXSQ&o%7w={ zLxnZBTAq03+^sM2Dm=|mSP@Ym7f(-mhMHBDEMt#DuZH10a}YQ;!0{ZD|IEIR=Lc4P z$iZpSl%HWDX(>^7_-Vo<_Z4T~m$xt6Toh9kPd?mJl9wssS6VVSpf2+s_w@G1R%h49 zR_BY?)AN9rr1q&xX~tG5;u*5CM)G`Vk>2urp$GVFcI5!UOOH7qZ*BH0ZxWE+UTQ`oaKEul@KTY?pO*4|K zog9!Pdw+a5B&)BOfs+#I0H(_*eMRHXmOwggx_8}8vNH|^FQ_kD+Ez%!PcKhUiD6!) zOQDEdFO|7|Ewj3Eca1TcCRtn)IBH)U+wEHla|ZZSFSoX?hDm;J+j z%T&M8y%;LHeh&8*UsZ5F7A(@>`^}TNd+se_R2grrLZ~{FWVE7`yrj$rTeQf~V7Sr!h4W-#-@E*5ksEO!|KJO6MaCiTQ zQ}Fi_QwEZPr`D-y6fo5PT-EP7H?jX1U1_s`6>H>XQ07Jpaiqu^$Z-~kUXXYL$eTKW zUhHf*6o0$<%)1FapM%M>0K+a6d#@QZ>Cq5V=*|5OZAH~68 zL{GXq`Gw8d=niK^>o4ExJV&IX(q6wptXg)AJY!Uas!{WrNz%Qz9V>Q6 zIpR(8ekP!*$M68XSl#N0AI*XA94{Z*e8-9-h^IJ!Rv|2dAi{glDquqd@VOq1JD^D* z*FCjrw_@cJ$31=P@m2^C*kJ6{Q#`_VpfzfiM(~ku-OS1*EKkn2DtMTIE$(Ki8zJO1 zm2<{R`jT*-EcNLA5zm_$>szh!L9OuL(A>X~DHbsdqg3ydxP z$wd2>%|hT2{VJUL{vMEn34jm&)QJQDIuT%u1n5NE=du4id+hGNEpNPtiQutLmX3TI zUP7}haqW&A1;kO8g15hd=QH7+J*D3&(v4xU)Ni2#E(oM26P~eb6BVMgiWKprIlXr@5<9iU(Eri{jDdz1v@R565!+$WPLpv(b-lyrix+_T%09!B;eG^R zv(NoCl6e)o@9%8z{I9Q(ydPUAsj(vNtvpJBMxV$&3ESk1Eo~{Ld=g`NiF0IV&DjIO z7M|^9iI{{DjhCm5Ze!f%G=&jz9}5=Sng!~8j;dCdvnDH8qO-^t&`*K878tK0bZjSx zf0OW&YZ)u?^|V$$RK<<4P5mqvr&4$b?PWC#J;3~V5C$`(O zFEt%QdVNbh&Qy?4BtXTv_a_lDuMozHp+_Yi8^LXjYgLo&W{cz{jtr%amekKc&aSX*g?=8Lkjj{QHU4IumJz*CTFvEAR1@eLfpQ^Q8oM&Z2RBMMG ztXLBYx+k3dgbK5PJe~`X`TMI{rlf6)Bo`? zTysaAy>F=b66*UtL5vNZC!ixsTaa~W_C16u!ii;!wF20@;~Z&L%#0mVKa++|jloET z(IH%RwTVyijZFin5t2=#gMf`sGJfuwq6V1y;hzrN>~q2lrQE43($aRnjd#$Wwl~7 zXMF^g8e;H8h1}@K(~!<-u70RrDJnvaLGXlkquo2;rm=DI8@t%68nsU^kVQkXG~YbE z>A9==S6orEt#H0uqd_!H`^+0AuVBVv$SFD1Zbi$YxVG*S_ufi8q%$&cF&%?N36w4( zSIxplx`zeHsE(_q$WkeRy_2vq*x{-cz^CiD;U|m;fM+PY`Jz{JWO7i-kk1sAT_4ZBpj*=$0pb8$iTRHfdLff zZp!qSCAlu;KgLnk2~^2i1}UM!mcm`^rG13`@qgb+MLZgnZcmNXKvLf;2&Bq0q6 zMXuXP=f|kMrTJydU>CLP2#|K8@LAH1xJvYXVs!rH%K}@&q8P~#sfU>->>ur4o~aR) zV~4S(Kej&PKrluRPaC=gVuiiTQp%NtfzNLkx}Cj$=7D2?*Ur_Wr01=34o;RqUv@69 zxZl|df4n&CwPSU-qN0l3K^~Eg>-seDF+cy+_~fk+Kmg$s`-I=Z_@Lo_Vaa2L`wJ}% z_l2hYdfKRCABM1F{iCJWap4S#{H>|jF=jgt1vWuU$vI!I1DPx{3F7B!t1Bz3YmF2X zDuB^I3U?SdZOaY-0pfP^Ez_n+* zQn(-TuTUxy5}5dYxZU#UN4EQLUgOu74jcmlrvvb!?_TRl{WDoQedEc0HE)neShty^ zh(jz?5yqL(8OJuATZ`5{&x*yd#B~l}&@B7nD;4NP+It|2z`9v-Bv9yfXCjoFK%w=C z8=OuG?E#kRjW({&$CnXejP<50LaA!8M}+RvW}iefQeh4nD?k}1UNgNQE_WhxPOIVs zt*J>2VVW~rUEWZIOQyK`3Ox_3KKhE=3OIva*nO(LNTF67QuDE0)EqpJBf6icn)M>!}}_1aHH=eYtFW&VKhk2#0d$L zxfNeQ)|?!xe~BI7{l_=$-gKq(Y~J}P>1^NNqw^;SM@eV?P_#GuS!Fp4KG1dpW)%D6 zxvBo~g%71oUDiw2ONnODBFe6289LhZJe3RLkQhddb>;hC?;8&{1B+{9tK_q`~Ld2?_AkS@>lV9naEkPWx=l( z$H(pMDN;S}=ik3g!zyqz~r#Pn^jYEC%rt&evZn(uW^W_6=gE7V**HHq!+DrZnZ9TOK~bhI+!M>c)L zLiuH29iu6tJOUckjy+wR-ek@3(elxL2g#=8w6AAK!5~}i=yuo2<897o@Nlmj%go(O zF54QySlWnH;-Dg8*M1^jCG2IPNQCk@>wKRz%a1Wov8>@-;I*qt`6!0}~FPi9c7#a8Fvp*=@*-&QQdqUy7d)(I?Jg-I^;Khad_- z5c%K&<@$^IoZhXjFT(N_pFXdac-)b%@LsUaIx-71xh@Y+8Ge8nTz{SLjcY^BSmK;}{amPGsn89g6I^IsoTvXM(uS75mo}{ZQ?YhGAxjFBcFEd@S-{=|%&Z{pXtAy9MleXaX+Vca zeslhg0ZU(Ao9Ak~2yT=Z!jojHQ!W4gEzHmH{U2EaQ%+O8zk@H-@fnKfvnQW6PDNPU zd%LJxs+12*8AbYw!FG+e1gL7U`Zg|{vbdsE{sQsD-9;UUbbWV^f{(5b6@Mf%2o?Lusmnu`-CJ2vXh9xAIL-^6r+yZf|#`g#9~k4gROw_0>Q zR)98<=fCeORO@4F0(vm^bV$pxJMaYcYXf3Q-ukbAlOgq=|7*qnKn#lgD=;XXimb)A zg2d1*9SD_?7WbBftZh;v+o%FvY*jbZ;sFdoI`FN}&=0H|Mo4EX6Bf7JUezb`%H`Id zoX|{s^?2}rUKSm--*9SX&yYN8O0<%(Z?xL=4l4hgkgnY2UU{Jo8LHfF%gr>y1k4Fa zMp;`XR6&D(NmqHP)xCZbQ03|?A{qD^mo$Xo4u}p~HF>g(5NYaUB-GDJY@SV8IM+5yoPfxEiYEK=1U z0bv7owVkkfklP!GY(3BD1MVtqt4T0+^@g2%AcU{49HYd_mj4y}k!1 zCJ@MNQaZLT&z*C69n0~7`fOeTDxr@c5Kx^=?ErXrgMSxgtG;E=H$qt~*UbzXmv2#G zk}UON6wD_Nu9#qvWV;jbM)Dy)OCna*DjJM-43r&=LJdXs1+4r4UAnZ;%so0J8~4s# z9M~g^acpr{0J+?3`hB0aUm+_PD89Zmw*2L>emu0ti(8xxW6pPW=p^WzjF3j4`j-T; zCmO@&c*UJiszYyrd~j3fmUfNQIO!qcXE#IK%a|@FJ>t^>!{W4?@iznYU5f8NeRa`Z z6`5_5iIE2n5WsiR^Kaj}%s--T%$MO(X_qh%t6X$Q`hcK<-TRt{Gugfzn@rmR=>z(W za%LIN)W