From 1e66862d360725c0243782e2187afbe463f82723 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 12 Apr 2026 15:25:28 +0000 Subject: [PATCH 1/3] Initial plan From 4e1d25a9f8f6b63237e0914597852e85b983586a Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 12 Apr 2026 15:30:15 +0000 Subject: [PATCH 2/3] Add ReplayIO: save and load replay data to/from replays/ directory Agent-Logs-Url: https://github.com/Meteony/COMP2113-G45-Group-Project/sessions/abddc09b-0186-4ec3-9e86-9bef6a62f012 Co-authored-by: ScottWang05 <206392236+ScottWang05@users.noreply.github.com> --- Makefile | 2 + game_rules.o | Bin 0 -> 4128 bytes game_state.o | Bin 0 -> 20552 bytes include/core/replay_io.hpp | 31 +++++ replay_io.o | Bin 0 -> 105040 bytes src/core/replay_io.cpp | 248 +++++++++++++++++++++++++++++++++++++ 6 files changed, 281 insertions(+) create mode 100644 game_rules.o create mode 100644 game_state.o create mode 100644 include/core/replay_io.hpp create mode 100644 replay_io.o create mode 100644 src/core/replay_io.cpp diff --git a/Makefile b/Makefile index b780292..7f14ed9 100644 --- a/Makefile +++ b/Makefile @@ -4,6 +4,7 @@ CXXFLAGS = -std=c++17 -Wall -Wextra -Wpedantic manual_curses_match: \ src/core/game_state.cpp \ src/core/game_rules.cpp \ + src/core/replay_io.cpp \ src/players/human_player.cpp \ src/sessions/match_session.cpp \ tests/manual_curses_match.cpp @@ -13,6 +14,7 @@ manual_curses_match: \ test_main_menu: \ src/core/game_state.cpp \ src/core/game_rules.cpp \ + src/core/replay_io.cpp \ src/players/human_player.cpp \ src/players/ai_player.cpp \ src/sessions/match_session.cpp \ diff --git a/game_rules.o b/game_rules.o new file mode 100644 index 0000000000000000000000000000000000000000..0dc07c746627ac22873dd0c5c09152759e4a1da2 GIT binary patch literal 4128 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 DR~#z? literal 0 HcmV?d00001 diff --git a/include/core/replay_io.hpp b/include/core/replay_io.hpp new file mode 100644 index 0000000..70bc167 --- /dev/null +++ b/include/core/replay_io.hpp @@ -0,0 +1,31 @@ +#pragma once +#include +#include +#include "game_state.hpp" +#include "turn_record.hpp" + +class ReplayIO +{ +public: + struct ReplayData + { + int rows; + int cols; + GameState initialState; + std::vector history; + }; + + static bool saveReplay(int rows, + int cols, + const GameState& initialState, + const std::vector& history, + std::string& outFilename); + + static bool loadReplay(const std::string& filepath, + ReplayData& outData); + +private: + static const std::string REPLAY_DIR; + static bool ensureDirectoryExists(); + static std::string generateFilename(); +}; diff --git a/replay_io.o b/replay_io.o new file mode 100644 index 0000000000000000000000000000000000000000..a55f83b1cb30d73114f82c32568c4bfbca25549b GIT binary patch literal 105040 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 literal 0 HcmV?d00001 diff --git a/src/core/replay_io.cpp b/src/core/replay_io.cpp new file mode 100644 index 0000000..ed14e3b --- /dev/null +++ b/src/core/replay_io.cpp @@ -0,0 +1,248 @@ +#include "core/replay_io.hpp" +#include +#include +#include +#include + +const std::string ReplayIO::REPLAY_DIR = "replays"; + +bool ReplayIO::ensureDirectoryExists() +{ + try + { + if (!std::filesystem::exists(REPLAY_DIR)) + { + std::filesystem::create_directory(REPLAY_DIR); + } + return true; + } + catch (const std::exception&) + { + return false; + } +} + +std::string ReplayIO::generateFilename() +{ + time_t now = time(nullptr); + struct tm timeinfo; + localtime_r(&now, &timeinfo); + + char buffer[64]; + strftime(buffer, sizeof(buffer), "replay_%Y%m%d_%H%M%S.txt", &timeinfo); + + return std::string(REPLAY_DIR) + "/" + std::string(buffer); +} + +bool ReplayIO::saveReplay(int rows, + int cols, + const GameState& initialState, + const std::vector& history, + std::string& outFilename) +{ + if (!ensureDirectoryExists()) + { + return false; + } + + outFilename = generateFilename(); + + std::ofstream file(outFilename); + if (!file.is_open()) + { + return false; + } + + file << "HEADER\n"; + file << "rows=" << rows << "\n"; + file << "cols=" << cols << "\n"; + + Coord p1Pos = initialState.playerPos(Side::Player1); + file << "p1_row=" << p1Pos.row << "\n"; + file << "p1_col=" << p1Pos.col << "\n"; + + Coord p2Pos = initialState.playerPos(Side::Player2); + file << "p2_row=" << p2Pos.row << "\n"; + file << "p2_col=" << p2Pos.col << "\n"; + + file << "END_HEADER\n"; + + file << "TURNS\n"; + for (const auto& turn : history) + { + int actor; + if (turn.actor == Side::Player1) + { + actor = 0; + } + else + { + actor = 1; + } + + file << actor << " " + << turn.moveCoord.row << " " << turn.moveCoord.col << " " + << turn.breakCoord.row << " " << turn.breakCoord.col << " " + << turn.thinkTicksBeforeMove << " " << turn.thinkTicksBeforeBreak << "\n"; + } + + file.close(); + return true; +} + +bool ReplayIO::loadReplay(const std::string& filepath, + ReplayData& outData) +{ + std::ifstream file(filepath); + if (!file.is_open()) + { + return false; + } + + outData.history.clear(); + + std::string line; + int p1Row = 0; + int p1Col = 0; + int p2Row = 0; + int p2Col = 0; + + bool headerFound = false; + bool endHeaderFound = false; + + while (std::getline(file, line)) + { + if (line == "HEADER") + { + headerFound = true; + continue; + } + + if (line == "END_HEADER") + { + endHeaderFound = true; + break; + } + + if (!headerFound) + { + continue; + } + + try + { + if (line.find("rows=") == 0) + { + outData.rows = std::stoi(line.substr(5)); + } + else if (line.find("cols=") == 0) + { + outData.cols = std::stoi(line.substr(5)); + } + else if (line.find("p1_row=") == 0) + { + p1Row = std::stoi(line.substr(7)); + } + else if (line.find("p1_col=") == 0) + { + p1Col = std::stoi(line.substr(7)); + } + else if (line.find("p2_row=") == 0) + { + p2Row = std::stoi(line.substr(7)); + } + else if (line.find("p2_col=") == 0) + { + p2Col = std::stoi(line.substr(7)); + } + } + catch (const std::exception&) + { + file.close(); + return false; + } + } + + if (!headerFound || !endHeaderFound) + { + file.close(); + return false; + } + + if (outData.rows <= 0 || outData.cols <= 0) + { + file.close(); + return false; + } + + if (p1Row < 0 || p1Row >= outData.rows || p1Col < 0 || p1Col >= outData.cols || + p2Row < 0 || p2Row >= outData.rows || p2Col < 0 || p2Col >= outData.cols) + { + file.close(); + return false; + } + + outData.initialState = GameState(outData.rows, outData.cols); + outData.initialState.setPlayerPos(Side::Player1, Coord{p1Row, p1Col}); + outData.initialState.setPlayerPos(Side::Player2, Coord{p2Row, p2Col}); + outData.initialState.setSideToMove(Side::Player1); + outData.initialState.setPhase(TurnPhase::NewTurn); + outData.initialState.setStatus(SessionStatus::Running); + + while (std::getline(file, line)) + { + if (line.empty()) + { + continue; + } + + if (line == "TURNS") + { + continue; + } + + std::istringstream iss(line); + int actor; + int moveRow; + int moveCol; + int breakRow; + int breakCol; + long thinkMove; + long thinkBreak; + + if (!(iss >> actor >> moveRow >> moveCol >> breakRow >> breakCol >> thinkMove >> thinkBreak)) + { + file.close(); + return false; + } + + if (actor != 0 && actor != 1) + { + file.close(); + return false; + } + + TurnRecord turn; + + if (actor == 0) + { + turn.actor = Side::Player1; + } + else + { + turn.actor = Side::Player2; + } + + turn.moveCoord.row = moveRow; + turn.moveCoord.col = moveCol; + turn.breakCoord.row = breakRow; + turn.breakCoord.col = breakCol; + turn.thinkTicksBeforeMove = thinkMove; + turn.thinkTicksBeforeBreak = thinkBreak; + + outData.history.push_back(turn); + } + + file.close(); + return true; +} From 527d804c85db67ae3408330d54ebd069bc6a034d Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 12 Apr 2026 15:30:32 +0000 Subject: [PATCH 3/3] Add .gitignore to exclude build artifacts Agent-Logs-Url: https://github.com/Meteony/COMP2113-G45-Group-Project/sessions/abddc09b-0186-4ec3-9e86-9bef6a62f012 Co-authored-by: ScottWang05 <206392236+ScottWang05@users.noreply.github.com> --- .gitignore | 3 +++ game_rules.o | Bin 4128 -> 0 bytes game_state.o | Bin 20552 -> 0 bytes replay_io.o | Bin 105040 -> 0 bytes 4 files changed, 3 insertions(+) create mode 100644 .gitignore delete mode 100644 game_rules.o delete mode 100644 game_state.o delete mode 100644 replay_io.o diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..5e71f71 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +*.o +manual_curses_match +test_main_menu diff --git a/game_rules.o b/game_rules.o deleted file mode 100644 index 0dc07c746627ac22873dd0c5c09152759e4a1da2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4128 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 DR~#z? diff --git a/replay_io.o b/replay_io.o deleted file mode 100644 index a55f83b1cb30d73114f82c32568c4bfbca25549b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 105040 zcmd6Q34B$>_5V#C5k!sYTHE5%mevieOQ`$=TWzu0U(s4kt+pUoigOLzW9qFG-Ui|A6u$$) z|DpJu6t0EvdlbJ5!tYc3ZU}!s@gGw7BM8?~{2mDJrTBdi-cRwLLb#sdKZEe+6n}ui z2O)fj;txak2*o!*_$b96gYXv=f1JW6AbgVIPeIs4@r@AvlHyNOxCz4lrT8-xZia9R z#h-=nR}}v>gwIj@c?f?)@!vwYmEtcz_&bWfNa0Hq{vN{rqxc^n+(z-2A$*16e}wQ= zivJ11*C_rvh20eXnZh?9{0qh3gzznj{}sZ&QG7duJ1G7(g*zeKMe%na{5!?pg|LU> z?@{0UxecQ zAk3rqeh~Jj_y7p^r}#h!51{xU2oI$AK@bk6cs_&&Q~VGJhfsVdgkPZep%5NM@nH}i zPVplsJQBjAD1J1A$58xO3JV}Sj^c$79#8S%6rMogi4dMd@evT7Oz~4F90}p66h95Z zQ4~L&!XgTbAuORdHt{hO9}D3)ijRkI0>vjncm~DKr0^^V&!+e}5S~l%QV1ted@_Yo zAe>6^D23-ycs_(NikCq+jpEZGET{Mk2xn4!7K9ZPzW~BYidRuMo5DE|ev#r|qHr#R z7gGEp2)|76iz&Q>!mmIWr}#Vwt0_Jo!WxR#QkZ~n0mTkxi};;SM2Cj34ae9R|vVyU+#&8~_q-&I;0>+E;J z2xy#sNb_^kEUC`sr1W}F23Yx_E}Zzx?R||W2q;$eY$5)z;`$zX%Vqh zM-QaOR^8%&tk^1jm-;_;pPLX}8%w6oVyR{7Gs^6c!uOvF~rSr%KhN|Abn4GJ|kyJ(fx;@+YSTrbE} zeG9gBMzJ(?wHmzQtB|doSE>@hI^z?&v%iNcD@mrnJw*caYm5bIP@tG~SyFC0FX?^O zSDx)q+fz^6@$Wr*QV*?x|6{3JR;ysuN(jnR9m^mHl(dovZD2)La-ga>JFe}A4Wy%6 zak5`-QMa8+g1=yVbe*eE1#v%?uWEr;N`9d}rT>a}N_8DFXbC5ze%aZf^7~9I^#|>o z)GuSJ@<1`vKMy3$W&!9bL2DGy*@2$K37c21Qyp8q%u>ylR-#=Vq*05T3c zAh#x`I<}=X4koo#)icLSaS}}N>v5c&0P-To%yllZx4%g9umvh%5@t1vL#SEWV>lQ2=1^+ z>CWJA&>_1BJ-IpuyB*y(;8=9cL3~r%ucPZ)GtWTaS^k9TE!wM@-kGQ>&(#&npHRI= z`}v$w+Ha!jP_7=k{0Y^aw4cgJz=X)vM=pOtbuaCQa0)UZbd}kJ8?ZAWvn%>>Yyf1j z2bjFMHl@T?RdAXdJv24@kZG594d}cDa~H$?G6(yQ^5b^I_WxB`>i3IK=C`ST@#{e|W7r zJXJ)3mleS(s)QBT^@PTpTOLF=QI8v#qI7J)w7@)|<8c$%Wdb*uz-=b5I{=y+Nb*=y z1DJ&SpUw{4eeCSO+;ns$PtmdEy*YjI+=->-uR<&Wr*v2mQ8rHLFph=WshpDP_z>

CmEz3ENM0=U^v)J;XHah2RS|_d-tAzyv!e^9pC}x- z6tHtV-MJ;IOK#_}9*!-M706|KABCV7@m?ty7xC9^!YL^1$xOOL?#e9RH9}5A^*+|? zu%p$DJ10?y$@ML-bhX(!UB`i#R>6|KlQ5={+Z)LpAxJ)1VK(so_!%mnJfK{3mtaR4~tG!(r*p|%4?6Rpa+=FrC*_{W< zJIUoas0ZBWv?iPCoR&m$ef84#2^XHwa6)bTgxCo)PN*7{Y)?9;JF)1bsnN=TPD|6} zt!Fy}otmb42%C%J0H_cE2utX`B(CnGGpELxbM~CdnNf%>>ejlN zcx$qyu5sZR1vO2L5N)eT)-^R2ENE$JC}?b}uP>-;Eof{?7A&c*ud8*IBx;gPEoYn& zpAm0KRM*!x)x_%>TN5ow%1$dhQ^5=C9q#0UzY4f|q~`3B{(*|$IRlZNNhv6$jc)yZ zCg!izVed;Z;AXd8a_Ok_yflq(z74NQ~mQgheY1)kMZRL^6noJd2qnbb3xpv1M|K!)OqQEcXQz84+q{5`RP#S zTL%}Tq9J*yq0aSRP-f()T!4uKFSvSjuJZ)u4ew@+hUW?YlcVnrU6S`$j`OXYyz6tF z@8;yaljCg9sZexC>;3?_{pg$_BY~+h?~$}L z+>g+LinJgMKv@)d+4@u<%ty=-m zX*hUXivvh(Vzl>~1F$(S!{}AM2JU$gpG+-+E^Px;iS;myt&62*teu*Q-XUF~NBOPn z(elpdhR!*6#8%BfR{#eNEtB>@dK8DLZJ=*m8&(bP*#u89I-{UO_hOWz<-LVTtbZ_u zYFrJ0qBDZ~w6c&t6@3YY;I&Q?7L8!TNHh$G?zOR0e&;1GL20=e2+kNL?kw?U7A{q0 z&pL4PPPRd47BDA(yn{D-A#^+0)uO1->mz^={kM%X4h)*H(}}^d<79u@(^@8v0FJ78 zuTxzBMyfh7-%}SgR)G!v@}8hHr`jN=bG86Oz>1BaX$$%e%at@Nzj~|FHrO50*b2|3 zP#?Fd4G7EwPF!Ye)%Ls7j-AJ_k9~RevLCP<9QR%<^(*j757>#W?7>Pe=56T3xsaC) zSa(xfS4Qs-R@%->HbA*=1{qt_!?N}4>#|f=89WYD%h7VoDroxy+-iTOFkjHlSIyb1 zs|_rq$Pr4K&i-mJX#?~$P~xsXz!WdhtNw#mbYM4f4ST>RC0HB%d&JBV(B)0_F@X)} zTNG6mx!nvN#0m?!hxu*_%S}x>A?|hgu5fHkKzU}^9QfrdyZUd= z;1xH31AreKOU{BPl&YT5ZO%5T{~pDe(e15=`-lK(@pWX-ITWj^2crD@AFdj-8f3dx z?>r3{pxUD;F6dbmBv;(3YKB_5tZg`2pzl^;ZS}-br40`TSgc}3301{E@?Zy|cB!(I zhovwKN&&hbSeB@6h%4tXxb1c`3Z2Zvr(uewI}9&xH1ftEeU%!|d!hdXPSJ;`3WHUl z6IM+gC(kWZieeF-2y}jC6IGS)Oq}?1+nK&BsC38~*C6bvfczEJj(@AFH#|S{Rgge` zNaH;4L6u;~;D}y10JBGCfs*h_6dS$EDl#?ci~7mU@=eR&vCSeJ zfKw06gFqIndTir+Dj%EJfwWK#FkfErP1wd%6L7r2x5U(>T<_OTjCJ}s(HV-_%}6S` zCYHKnElKcC>7k)q6{IKj&RdkZoztMqD0)cj~q~#?#f_4?X@R6=d4z(O`8Nw zuyfAJ*v2<<)qVllS&_d3Ul0r0jXwF7^2s-Z_t|5i%7R;M{+yS=VCeT-S?YfSNO|i0 z^3>lw_jR;GnU<##Q0Fh%3dSx2dW3{?cHAM%>4ZK=6-{|(0mOWc-`Jg7wrWs6)(Dx$ zhV4!t0_55@6j0td4~j|`c;{S>mUk8fIAWlnJg28TwFCCnW2x8NT#y|WZ=*n64d#S* z%$Dz3rgq3CeZ@b+ia{3%H3VkVSW`OTX@d$&^J5c#Ie5iw$|IOi3JG&W)xy~^j7xHu z#Oj7~5gfBpuzQrk2^RKx&pb5({Z^ z1QV!$?l#}Hwu6F!>F{8X+l!+TnI`&P81m-14u>U->~ht(?79_tnCLbzAIE<1q3X(& zKexkrp?fueTL9b=Ti!c($+@t;!MhFm5v!Mdy{rIlxgCHi9Dkp%bAMz7fjyuOidd~a z1OujtVGPz?YH0)$O+Ajm(sL^mFEn#CSMg~RD;eOzm8O0H%)Zh@GS=tK*uZa4BlMn; zA(c|Rnw^HePiZ(W!Bzp4xUCB+@&;K*xW4R!R~~UK3{67L#5d}f5}~|APXN7fC#+ud zQXC{|M`F2pQ*L*~>6`9)wXR2LL$_eX^Vdu8mM_;uVE8sL98|*Kk0y?U8nm%Df>mL| z^UvukHu$Hokbr8n{OWEeIaSee87ouO90PKa!2|$pms%>UtQLq`2Bl z7J+r(bk#h;8MykxWhokttHBv~4~}rH_xXVAqplaoMg9$?4Rm2YNjmbqthE0>&G;wy z+?Sex&1oC>3H;{uIog%rQrYi7b%ORN7h>Smo#*ORCr^n;7Cy1?{H;bFTAk7;P1ja$wg;#Y5YCa72)Ujr`mV>&rx9hKcU|(Q)*bBMsfnF1G zjZcCg)b$^5xBmP3^#XKJsJ8BPp03-q2FIe*6MAy@P_vrjshP4=qWWyuS^EfeDm*;mQeL7A@uaqD^F=Bw{( zRVUaDGivAyyHy8{P zVbz)xZTIT0%96eftlCmIi2+u(&|=Fs75M&y#GMGGFXT`K*~gZyN^2=rGS?~3L_dXx zO?z^n`D}wygdX2F)9JHj+e*cqM`kb+-{LO<@Al-UaZ!#_by&yZ4vh8D%m!D4oLi{z z*%JqgG3emCVgdKS;GlMcG2b5X#AtU5KHBk+Go#(D_{M^Z?Cb}3z$N~~$+rw}eE?NM z)j~OV?d^Onn;lo}zm1k|oJ6&e&!=tkECOZ~zAn@AP^d|O&r02%aNo?*xfk}C z;C3HY)ivtcKzv9vEMJ z8}_2923{A+yp6LT#LE@1p7BZ6dFz7!YrC*F{RC2Y%NtUmW%c;ikxHf81q+)DUPH(? z98fFF!YBr3VqZ`(-@PQu@%_1 zu{C{)04{%rH6( zez*%Z?$o1=d$XkLYZ5XXDSlp<+WEdWCP{fH9n8uStmkRcQ z^*9V;F;*tGHS2sCUSx55Xp?V?w~c@m)^=E70q2>~t!YHG zUT>IFZ?A$I-G$)JBNRj15S)K0N6D%rS;2=nTSeCYf3YJ}1nBT~D2FxB@}ZT$TDB85 zEqHmN*0wNv?VJPY_;g0Kwyh!^>e1)+XC@o{vcnGf=%6U`<$-V~QH3^(**{}1bOgW=q#GLtUjmfrx;?bi< zk19HCT${Qrxu#^ysG>2Wich8lkb-X(;zMe9nbJ9b<{St9LZ%Bbcp9&+p%ms^QR(Eg z=jR+bsQ&=`#=}v7;}5UF_+Rv({Ofb49Jt?kKmfOxb{67rorM2!`d7U4ixG!w6aL5P zxxY{Z$bS{$aE-(NIK9E+zXNf&4#odCeTJ9*IO1^4#Q!)wH|olN6>+$Z#s4_{iyr@O z#Nj#}|Ks!pUiwk^rXF1ClL(w%?xmka>E|F3r?+|O7gPF)GW`-S{VGa7UZ!8Fy2J7m-BCa@1}YI=HoIq2`j3!^{gQj9%b%olWk08XStYA_bu*<;_wi3w z1S0_Ba=8=!tkq{{`Kri`{g&rNQUhIG-6X5QC#%*?=Y}v+rqB0mDWHa8OE0DLv68=D z^JD(DP#NR*ZG5&y!KdeH-=k0A<#2Uj{#>8MwVVQg)=~N*nGP~?MSXdWXbzDyWu7fu zF6$sYXiM&GUY>`lM05FKp6(!@;x~VSaw22BJY7t3OyyVra;~Cu{PvWaXUx+dJzLfi zjjF?3S8}H)0`yxKrB_H9x#zp--IRW=Oa~p80R{4_juC?4GF{Zg0_-^9vh@L_lzuW2 zv3>Kj{RIHcqx36fI_8o3Ii%S|<#rLomANb@_W~sdZCgij@DEa5J=4D)S=H~xyyg2v zK8^ro0VHiDI{Y@5ONaXYqHV%Fe@HYZNScei^r8DC?S}SE|OvEH)15?f{=`uE2G~4 z6z(`CJ5a~)H0e{*q}Niqsg0og6_j3yMzAk)b;pJ2cT@UFGF{9wHl;~_lhSQ{NWcA2 zFnn_i|8w>0K4dsRHQqtxHcGd(ymnBX`zA5NfjoBX+yZpvQ)$Ze*a@^q{qnsOj zaXF2=xq2~$`s*p(=HnYF-Bw2Tr%8Vz0G{?S>KuEcPCp!GK9^Wr|zabEc*mBlj<56vq#cx8Gw$x+Rh_0T>XX3uot zaNEy$Pkojpm>zL%4npca;^3Qb;VYuP0B*u>3xj|}oI5P|ofiDN7JRJ*$C-Heia2+N zK|mtT4=wnQEciVZ{5}i*V+;OM3;r_;{(uF4(1Jf~!PTEhh0-F9dR@wZKOVvmh&WGJ z@TV;JMhpJ51>a=Bu|%Mp9SB~f)B9Z11&gy znLm6*oP#WQz6C$Tf)BOe_*MV#6>)}H@FOhvkro_J0tjCb=U59~V8IJ5_;3q;f(1X( zg5%f7!&k&P#e(B01mP>2fl=5 zxFQaovJt)_4t(Fra7CPy1^=1_#}hjI7p@U=VSV>2THEqW8utToobRf$gOGz6FC(01 zj*R0<3h7@%Vz?N`nJVHuqh!24L=f*rVz?L|MfjgJ?Bdw6(9YFzZ3{Gb)(D*BL)2dI zh{EYXjt4uhD4aGo1-?t+=nen%iNa|kNF*JE&pPxIFoD8%_Y_V>ij;>Hu66?j>NuY& z{4gJeH&yBx@8Kc*R)rrK!u$0@NIjwTrHxSd$vzBk&QrMB9rmR?rSOqH3~$D&XTT*P z{1%0e4&i@MxY|AUr5&{&-j4TScyqqOXNK@^Dg1&E{+hxs4B;bHRY-*JO27-neg&8G zWeUI5r9X*c-&DA_U$KesM*t7k2KZXKqWAVOIOne`+*@}ykemTfHBE8`177HO`yO0l z4paDA;-+_);O=6JoZBt<&n);xCEr`W^N5}U&;AOXyIj4;QtT9kZ*=iR6uZ_!zfR$I zyY#11?AL&s{E#;g^@iz3DEx=6oG(ypmcoDJ;@E%Tb%nyceVF4l?A)*Ld+5$_PNdk& zfSc^W5%6H=J1%_z#r8V@djW5M4BxH7>r}vx%f&b2^abu!R}An%u`j_hxd#9@>D_6; zcU$lS;JKAa&e0Zpv_;NoK!04W?p@Jvwm%9u=9lw{?}*`bwMBk|1z&2xzY2Jvegja+ zU8nws=M@(E{h%u^6#F^TiGH@ie@%D#ygIyDtMG0Y=YHTxz%gI_RR8LzciNEXOn44t z@@KmRf6amq0YxS`(=GTM3!VhL(0Sgqzno&_*m2$?|KDSwf7^l|4pYEFcb4qU^q(l)+s|h?Gl!wxFn*W9y?y?%r1wymlA82Ru;5<=ywG`yxS?OA z*qs*quL|Gj(l4UenMa_Uzq`%bE?!BoH41l^&-!mJAgxQ`IXTR55=C|?+}pRW zAbbc6l!fXPT@CPj<1B@H`}ubf{W^tv`|~X4HwyRm`B~1#3Log&GmGS0asul0_Lo{CLf1&V?-26iEsp~_9d;9Z)2|x05)ElOst?+Qaajn9==R`|L z&O-|K_Vc;^zpZfZ`O$GiKduP%7P$3%2I2Jz_nsfIoWB8Xst+G2dhfXs%P%cP`QCFS z_S+o__ns>?lHNl~kp2|c9;P3!aPRpM(=S%|X)gUllJi}K7r8jwvrFOLbD{`Q6plu{ z-g6@Em&z6HJtyLRdxOHg=S1wc9))|)gAO5k&K`sEz2`^c2)|O{-gBZ#!XH(*_ne5^ z#W*O4LZ{Tt7vn!txc7W#2+4U};o)*02?i88-gAV-M1Qfuz2`pc&n*fMm+z4AD2I26 zyz%!kg?rD5*#BDnxNQh2!je5i2mIS~v8>MA?~<$KSGpqi{%#3+>c!hxGBH2ir#xZ#eUwQaPRpPm*d#8QU0Z_UdERx+LF?m7%BqrMRkW3&pwsOIjKsrZ;DIgAz)=SQ1ZoC_u|Qx>bhiWSxvO6 z8vctyeVC+<`&v|2n`rUm6c@EM)?L*0?ES%Rpchomn{@V!EAJO#yPSG+QOns$x)4Iem6~Cd9@qXliMwPExHK zr_V(zn>ZUPpQr*;K`;G>6?@LeHn&*9 z$>Q;{uEv+tB`${w3yo-rE*H1#y;fKZiW;$`>RnfWt7OxyN^;>rsbZ;NDM!IYt~Avd zeo-BK7Y73phEj&YAc8um-d;96+``DD=`0o%E3Lh0WMw9*L^Yx`qB8ZP76yI{H382U zZVOO*N2{Sn)$QuWWIO>!54Ke&6SdrP2Rf*d`Xm$NA)h8MkCKn+s5(o$MK?uV-umOGJ zkXzynx%+OcDE5T*J>aJ&oa!3LWtM3{P0c_!kw95WKNT0F)oQNT);cD+v^inQ&$vW8 z%voAtxQzQ440E005}bFowZ<1WHeKGB2?q;TRg-hBrb-6!fYv=TLt$!ziLcobJZdaSL2Q;ws0;Pbpc5f4dD zv{W>;M#oga(gVx1j{?Cd_gK{mb$^d%7dRvQh^b8jo)Q&`Ti>|8KI|Di?oHSP@6PKAf zG3_x`pKX5j1`-}b_Ga=tW&sT7IP-6yUMAcAc^vFiLDv>-Kmp)~g^6T+9W+?$I3W5& znCPiqT({1u@$o*!6&M4c+f)N5Svpa7taVMWV`J!hYnIIC!pW$H$=2>QL@1{^)jxX> zOgj_F3V#=^8y6ZT=tct__TRIcW;88HczwA?G65wmg7tNDB5tgys9(rLl%Zz1(c;ln ziPlz_KIwb%Lbl~KHqp?WT*{ttx!IXeB6W=md8`V%RaZ;jkATSnFC^ zqm{~;RVu2+3mC0fx1}H(lWc8Y&2eILTk9g&tEgFw{bUh!lzW*!?#3Y>G*I-}Z7{hv zVg+XcC5g+xtQx&fCzsgSFF=D^rmFMS+oy4yFVh5j-zw3))jpL;1LMAxxsU8DidR-Q zE==IcXI#7rgJ?a}h4JcPMGI`K@kUMA{POv*aSv?~_Hf3;I~t)9&bA6u=3LfV^Z)5ilMQ+0M9 z{o>*t?-#sdLwxoH1p+ct3T$Y_A^ zK};Xzr=JJX)W6Sy9s_l~wHfvb`aXdDb(*nbSYJ zIGmumn-qP`kYVJV0X-T}$E)E96IKhFC+|h!jFEjXYYlHlc)K5I9}7a?J0p%G?(Amo zd9f;bd}CxPzDLruw5-C@p&tFZ55U}~k?0P?<4UpwS|_}(Qe9iy0&A(J1!a(Rv-Rqc zXvOS!rQV>$we@Gn0@OUS8nt=n+et{T1qZ^~1U*xSM|@C*g#uY!7#!8{nr$VhyZqO1ZT9J%l%8L)UtylOHUE$e!^jHlH^FGnb`+IrD^aOBpy zN2B``Q3<>O1(S1rjVqx`AYLt-9q@s}C2J+*4L4?#i1G9qMp>orm4oOkXi7Nbg{Q)} zW1#24AV4$})25rL*i3XVy_f;BZPi9#IflbP*)+8;03KhG&aqsfrZ$7s+Nkhje0ZY5 ztIh03Mrh<&P7S>`SxWv(Z?fQASwD%vQp$EN@ELOK4I)`9#U7=$uC@&D77yKCue zEyux7KctOTs;$+%a5=UCHB48i_d52X%!<(po`vxklWkU9Gxl;43kyG7^)xTlFNnf| z4OV2(cj|_jtu<;H37e{Mdg(=PTaSi`M_GA8QFL17OMBxBed^I@@#th*GrZ~mZ~5W& zPuX02=9e6+z_MxZ5+n|u)aO;|ejmHWeY`UQt3{kA=r;}Z_623L_`jFUy_jm&ECJsb zmVavXwYO^n+>@|N4Zd8r7fok8R9bkaS?{N-_x3ESSe1>vtjjQ5w=Ria-h#`#7U-Y* z$kN_v0GTtP&xg)iD8dbP{le*IU%gBz@uY$E{#m?nWY27wAX&3pD0nug_Zod0m;QHI zz4@2>az!W$9t}yf}}L@q@#C@I-9^i^y1&VpF~`WU^&3^Sxf z33y8m<`dBdcdwY6sEJ9eDn-dO)Rk5EsNEd{TycRuwIiY4a)dcgaN|ioLN6X$TL+t} z>JdX+yZz2|y?*0RPj87fsDAWeiZc_Qg7_H8Hj|#F1>o)ZqQ}1j*?*acRA@`YQ z!LmW3dLXsMv?x&z1E!krWj^1VW|{CoOTc#;pysMcpL(W+GrnmsM}@f_78{suP>y43 zy2nV+oXg-LnLCf027BFhg=2+6lwA_1eY1FVTRU_G@Td~{G4(fDfxR>}M(Wq>()4uZ z-bhr@z>wb8s58Oq>?@}0DXOu-i)LbetIXK_2K##1(Pz+67-fd?$$cAi>9B3WUApYn zycPjnCbcr?71QJiUv|Oif?IW@baNSGC4QU~4^OVem{F_-jS8Uz_tm0Mld;nu8`qlv zxEyCLpjPX8G2}Nf*x)3D*}cQPc>Z}+I5=V7!`8RbyU5%e9}25eXp$> zaz^9egof(&xbJCCUjv}G7cJk3&pZ>Yc#n&&6whIjTlwHA0an-&4%|11Ut3OwoWgi12%uhUNB(pdn1!-{Y0+0+a6 za35%Rd?qUj4~zC^fKaFV>QSH-RK?vs2)b0&cEMD)=hc0>R2t~jz1|^SoMrz|6pulp z)QdT6=b6tbadjr!-Z<`Z{37>erl^LDaI-FfS1|M|F7v_U>Xw%3rRq;~b?-}aFj!y+ z8vGk*On|@iQ{}&}9)#igJ2)qUB7^6%?qo#OY|IJt2jk!^k=mw)cy&z;JiB%OwpIO^ zFJwydl*y*9{yrMI^a|+H;ctXp=YBQ~qM}O$u;E8NC+5I=!tASZUQM=}4U6f$>jvc%Oc#lszo-on{KHY)NuZI?;JKo7 zWrJ<78eUvp*cfku7sEaG;m#1uz$j;*hlZd6c!;ZC;FDg?;LSI++XqwUlI5%grnaEz>jX7y9E6o1^sgZ ze^ubG2syHR-xBnH67-)4denOa{P4=7Z@8fSufdP)FBJIe0xuExGXkGv!Dm?Tiv`{- z+k*R@|Eni<$mV`K`-@=4$#AA1=V$qh5iD8OTAwX$YH$;1ijRIg~0zN?EgkUP6^p_ zo1m9+ek^cl&m#djY|k$Ry_B;xKo6f8Q`a9Y^nVw))Y}`7!+IlmS{^1#y@v^0`r%Z< zxf~~Jc4xexmvW{FT-q}`AcyUV3wkN1AwWNk^tM~*I|VNF>hm%1>=Ir7S?^jw{}!Zi zz5NN{OkYWQAGOeL4$yyv=znLSe^=n!h2FgVG$WSF4uKa4{B40(3tZ-RG2v`~LW^~l z2>Q2#oK*ssa=v4cbC;l(avl}9l=HMj&Tj<0l=GIrrJQ#yay}9CQqIBsb;i-3QqGZt z2mN!RpqFya6*zuHmFr2FMb2zNFXc1{T*|pTAcyPcR|UP4gXf~)h56bAKep#yfxjd0 zjROC>z<)3BcLn~b1^)sL9&n*vIo=&Da5+8}3S81(F7Qu47TbTl!2c!idj-B*;ExLY z-vZCwA8z2{@?EHJodXF+`#*&r>m3=O=kMo@v(PUN&<`j1O9Va6Ia&T)0>?=ma7+yewCc-=MsVE3j7{{ z<2QVn{!bQs-hrN8N&j_$_Y-pN6Zi+f%JLr*`1=CSImnZrC*;H|_&kB{C+P7!8NAS+ zxHe?Hs|Ai4)N@l z`xu1+m-#(a;BtTCYzsa|;O~Pf_CtffWw~?+T>9r`flGhhC-C11`FL&*URW-2zOg~z zlKvCIxjk-G+`vCXM-YD=er*3B!co55R~aVoZb4rl8W~#kKSs!rxQ$-g zDd{H&Ie5AV=eI@R(w=Jsj;CZW{c?dz`QH}!VS*m(Dqg|-V%@+CaXfQ~<^NNm8pqQ- z80V7&kY3{BfCjIid_KVdaoG<{vCtQw5V(-O8-A?!aERlDIPQTnE}s`1Bk-w;TGOM= zOkXMR0)d|(@Z$x}^L^AiT;N=UJ)X9~xU5&*K*RXWf_|i+Un}ra1&)0MUg)=O__3TnLmV%} zWj)`aP>suc;aUbSq~8QTmh%OH%YF}Sz$++!jKHOQK9M6xf07oXkR;FB%*9D(EM6RcPER}#NT(Br8lOn;lerJeT+T-v!&;3YziEJrB^p8?^8 zev@)WDOBU5g`D#QF3Y_{;F5ltz$N|B0>?7t{L21c;)Q~Kte}^2WVuK=vYnnSjIx7@U;TRQ%cyLM+J^!3ghy* zq_js(Ovrxe=gHWS6E5@1=YCCg(+85%?@+jkYH) za5;X>6ZlnvUfR#|E6mq?K`+azM&JcPPD0@42wb*nIle3q^o4?ck-#NAo>s(ukmKE@ z0+;={%vXt!FX^RxNiWBv#X|mBLXK>wa=fS)^a(*P_hF>}rGKsy^mwWg=XaIBe-ClS zWxIG$;L<;hLXOQp#|imOg1*Rt%XK1-DQu7Qv(#(zv($^HKd~ICSK?A{i=dbD!&ZSy zdy)dT*~9e~yZZs~cd-<0(~~ub&FMUEseGxa^;C&lxXlj}phZ zFwt5)Vo~ZvL50oUYy@a zLa)SSf8HVJs|Ee_0+)Jku;42NF71){Bq3ko(w>x%Q!VJfCh*Y$?-aOf*I4)157N&# z7iCP@#q_Z{#v0|%K5ql|AD|)3pu#=h!?gODF^p*@j_hM|GGlMxZKZ?_RIcR z_Di<@S+1L8`;z07#HByKDe@)#f0MvvfA}qd%l37%1;0h$vL1d%;Ih5kDsWj(ZWFlF zd%Fd{L*OHY|NlqeM+scEM>&q)Dd?q~?^^Jfz@?qIR^obFAoPAu;Br2Em%zsfdWp;N zPU05{dhDxNue9fG3;qLv%Xa-kfzKB5ePj&uNQbG^gk2y#|b$<7x*NBKOpc00+;g^xql+*?-BIUpR%8k<5Y>Dm*c6lN8++R z*v45ou90{LvZS^&Ru5rBhloFn{{=3D{!d^96vydKMBt?Y$2!E*sG^veW(oWSoEc%i^I3H*40 zzbWwH0`EtS9PK|r;KK!eqQIvLoaY#rTq|&{m_{j*+^-Y1J9}3A2_Y3?KCWi1O zf%6!R$-M&SIV$4AsFT8corVBi69mq4V@#SW@Y9(XLVo`l<)ED>lATux`XWJphro*k z{JMSPjSd2WFCT7geQfUbK4 zj(#|W{IE&jyl03kZwmZOl7YcH0!KNcNX`K2Z!ljxXGZ!F0_SHmh{puZb0NeR37pp^ zh_4iQDFSq@6Zj+sA>1PH$pYUl@F@ZxK!Y6GKULr(1RfQ5vB1#}JYG}?{5(P5Eb#LM zezU-10)J58Wdh$Oa9)dHa<9Or3;JO+NMpXr1%8&mX9)aafzK59RRZU^5GLOt@Crfy zxWF$E_^Sf16!>m|^V|}XkD|#0+RtkZ#Lp7=90cgPSm0k|5W=ej{w0C075H3%cM1GL zfy?)Ad2NNs{b+K7c79pV4;T2w0-q}IO9Wmk@UIAbrNH9?UnlT+0)I~6)dJro@c9BC zM3XSIzeeDv3cOa}^BYa&dp z7x)rEf1|)J7x?`GZx{G;0$(cd9)VvW@O26Yx+(;IHG>c~3;Y^^ zuNL^V0$(riWdh$S@aqKLBk->ZJf9}zX#aA77YTfYz$*maA@F8_UoY_00>44v>jl12 z;4cY0CGZag{xyLQrNsl<-zo4h0>4q^6{2K!2_i0h@YJtBh=)Wm& zhZZwPf0MxF`?22=c&VVjS>W>oev81D2^@9&itI=U9IL==nzyVIxXJ_FJEK~cHYBU( zLkQuYv8mWbv`kCPh>uPqrorJ zJF?HEtq>sm}$34{0q42$WxtFeHm_@CB-^uWHFkBtKEQZ%&o-xnQ4)_f@FR zEII4b+I$%kA5F>LZGlqVi|<62#3$kRb>fTQpvV?O<-*1WAAP&5ErG|Jea6Gme13O7 zh5|hvcR!h)qLtxsVSYzvuO@VInA@=YeGr?kj&lEOr(^|9mR+4s%|1Oa%cphU90smW zh5Z}^*HMR_inS|qN6_iJYK)JPtSyQtCc6;{GCzRZF`xf4+!FyUZd*t zYFA#mufF-tNHGhn#lxNaUhoKg_Ry!I+=GdIO#ASpVV_*_VK(o}PW;s>V}Hg~B~0!f zUTxE0%5Lc3SJ(NXFav|AIF8k&h8`vKfkHUrMGf6F_4yB<9s=_Mb>NE68~I@iAy4+m&hE&ElXCE?zOC+}lw^e|i@_JLk&W2O|l8jWp;I?vPEr zE3`Y)p@BgW(89k6-!E*U6Ai*$yGP)js*$w}Utf$ZHLX(1St0CH5aIh&qnO9|bD&0c z_3cLZ#3OSXzG>>`Qm1{`Opr^rKF3h=aGp{2jo-nS=5xu1?dDH3XGSd#4fGeQ)urg1 z^b^CdVa92pHz5i$?9)>P{h8}atvPT1ky8XSH`3%xHc@_E96#u*zKpF8=I|+iFSEi2 zKEvNE&-m0ppES`FOx=;m;501z@+d%`sql63|L&<_W^4XihkLm_MW|yo6{PJ;&w)Jk zdGM=`R@8!UA7C5BcuP~P6kvW3JX=Mcgy1!Kx#;tT>p-`jeuxSjx8loFA5AOm978z4 zU7X`V1F%Tsvr^Tu1M&mR?&(KvS*CG}QHl8ex%La3Aix4u-S}M2J_bg} zm~;;G^)Fs!H`YU6`xKKCpA6bafyNs;+{xz|(dU@>%~Jr8o6q^kr=YEY&d6jk%!hp^ zumwf%gweulKfB2-%XI4)pJZcU+LkeyWY0V!mX$&`E-6wn%CF)ch-dU8BNbh5g$?& zROCOPB$ETBf)ZS(d=6(zab-_m>(V${j-g&r$#Z4g6Q)?FZrAcKFRv6VgSXL{9#?qu z_RSN-30=ZmP~{#x<#Rpw1Xj$3^_)IF4rdaXo=ei}D$v zoe$l8Qw^NHki|JrJ}FpjKJT-g(ka|0$2_@yR(|R0q&0s}zgPWl;83n$2D7Pj=~|_^ z2bIk-eB6`ki*yqdvv4ulbmu3$x=bfgG-a<7F$oOJQ~doxCZ|C8o&H(vQU^l$L_$3> z8YObr=TZY&R@xb6;FKq?+*Bo&yU@O=B+uzH+>Z@UU8J<&33F_OGQoEaq>l@ZA;Jk# zxEQ@2DT}kGd~&c)3O&B`DL2i3xP}6=|G=rwc!m}G1FiB4-kUkB;Up_x-g(Dz@4AJ| zr)s+2|NIW8@@49?D-(?_d`=aY5EPK_5s0tK@M%>(!+-;Jh1?pO)xlLkLI0sMtT?k4 zpYF30tUfnA{&TEYjr$ncS7@^^m*ZLz>iqAP1f2$51_u)BmosO9FtL^7?$G#!WOAmJ zF3mcaVCr+^sAt3XTQO-A&a&!9P5lzwEPxkBXO~qaC+c@B>zW$-CXO#`Z;!(f&8=;Io07$Q2T_G(jEP|lY`$_cnGk5gmY-)=f6dg{10crUqO24 z&rOv6N3!7Ozm<{vk7mKYi1bVQAJ2lHOGoN|A`5>0TL;O1XBPY`$$rWI-7NU|U3r=R zEm`p2VbK3<7X0fB{J+kE|3L%)ud?9pGVrg>g8w-K{|8y{ZzF!`|L;!2enn{LKdb z*R$ZqZ-?O}>+g2B=X`T$%Rhc=1TV?I1MZoRLmNMSLkTa*{|?+UABQ&nwZt#WZ&w!l z>kRyFXTiVTVE^tc_#Zd$f0_mV76bo1S@6GP;QufS{%!;RL4a|&acC>QUBoZT@8B%> zKQ!>)n}z+m4gB|I!QT)6m<}#kfA5ET&Nqj){PXu!BtL$;f%!PJ@gHT-e{>f7BMkh< zWWhg%_+|MWn+5+_2L1RwSk56w`oP_mqXw!ec zA^&G*!O!0_lI`7z6+G zEciCK_@(_ngZj+% zjze4haZiK!IJEK4HSpti)0vM$8-Fbk$o%7XcbShv8-G0!$of;0 z1%JCiKkg~BUJh;gml^o+`|!-ip^bkf5lH*%vf#hjz>nXLXT2QS^shDWugHS`egi*# z7n}8RXw$#Jz>nX}Wj+pV{QMnE>A&l<;NMCLWc|bM-LqZ}ZThzv_*Z7Z-%b3|{!|wH zyA1mA`@(EDhc^2^H0bZlf}cMgEbYhd*t1>^ZTbi0L1TkU`v2=$@DDZcug-%1DB_p) z<9F=YZVqksk1+7#o-FfmXyYGa;K%RZGarXG{!&B!@fj}jacJX@8T2p9f`7JwAHTcL zdO5V|pJ%Wizt7Kn9NPF78TjwWg1^~dKYs6@^>S#_f0cnBzyHsC9NPH#yScLd;W+`! z$Dxh?W`lk_AAtEdwDGSs_z#~6Fdv6D{&fcZ-^_ylL4$rgmw@$hXw(0=K|h{fznuCuwD*r`rkCze@_>sdSxc|rR@-rWYHvW9#m+c47Lts7*ZTv?W`0>00=Ht-DKf+)?KGR}84sHBJ2L7LA z!O!2hmg6U$o4|TGwCOK3=*ROCn2$pnf6U;&KR}T(ABQ&n*#`dK8u$wU1G9W*62Pr9 zkNCgK-(y4&F4~sVH}F4x6CQ0Tg`d0@ZP9o6Lv@H_=gkmhe-0z!6Cp(XwA>}sarPYU zMtu>amDj0ogEE8s&JmibKnL#s!TVxJQTY#MjQHtut1f>~KYrub#6Ot$PjWeRB*=fA zg?}9JZ%V_D?>Q;|2kdWuRWr^be)Rus5D)qv_oPhre?t1l5kCh(`}vtvX+Zxr(jOy6 z)PD!WgZf_v%%r~vD;8Xb>cIU!sQ+(}f>=Pk6C?gNTuvQf{S4zXWt09>j?xq}nUKPu z{&xX4`M=;#nqeOCVgA=bob_}4$31nE{&v!TEb(&?%qKrn3HpB->1REt|1N`m+>XO%Q05Fx` z7K8ox{!Xy`_6LWU>_75otp)oxc?I?3b9$5hUW0yoeBl-FuYelo#}@r74f^r(?a?eX)*5q&|G}iK;Sp!e@(Y0n@7}` z|BVn2>c7;Y{}s|tpI;{_;qrUM!oQ37*SVZJ614yK7W;dl%W5sEc&;T{&un->p$+lfV{DWOi z9SPcx=Wn6RVEa!JKP>}XDM9{%1I+w45&tNc)2#nU;5Yei8~KmxDVEEA~7qke2sLH$EvgW2T2S19A@{5Kf*P5IxlLo1f~|Eod&H5UE7 z8R}nZ(cf**k1h%3|4objLuunB-TZCZfoA`WApUgzivqvNf4v6#cN*+})S~}9i~c}$ zavrqk&wo2ye(xCcUviK+|Fxw5dM(ENKUja~0>3H$BS`-|;>7ynY9Fa!< zPb~U37|Q=6gZ_V5^#6wRUyw%s`xgCM4f+3vLH~$+bNLk%YsKlxuinC6V&MT|Fp#JYz_&>>z|2G!?!V;~r+|{fjLH*AHzbXGkl>Z{)$Nno9 zenJ1|LIuS-6`a2`lKzS``u}awKhL1QpFuyKk7v^VBt&1nWu!kw#F+nq2K^QA zd>3T~%YQfNPgnlaf#2l+Er$FLGU&g~qQ88MHauPaud?XxHRK=v{xewre`e8tJLw-Q zoegpHmAvk^=r6^|3S6@P%QxuXW6{5r^r!RxCl>v4Nx!UrhZyvi3^kX30cCtepu-8= zI;R1@sr*-x{x#$dP5GZ-&_B$ef1^czH|dAw?Yn~h9|RA`(I>(7`#$lX;^Pk2-~PaFvcJM$|B(j! zCs_0!H9;$063`#Cf3!vaBGNDGFaG^-u>B@2`fnor$EDH#YYYE_#6Keq|1%c**BJa) zV6cDCVdnD7nWz<0Gjy#05x%QG@SDnSy+MDWLH{a?{&A!~o&R35@PCQ;gY`FPe-s)h zV!`@bNBoVx+=lCKDe#-}zlHMOPW;&aoCv>Q{dvZs{|}@;UHjQ+(O=r56+^PRQ2z*n z{^Jif=RfBR&6m!9RTlms#GlT8GlAdazqw?;^xsH>{Wn?kUq|{UQvNvr5x#4cMgLZV z|4uXLf6k)+u?+n;pCkU`eAb4aUo5up|DE_FfeZ)xzXiZ=^8a?qKh7EP!unGT zzhM2n-=hEhGc{ki4&48P`hR56-}9bkDI!kPKiZ)G&ldgXoTV8ra5d`)i11ynTJ#sZ zugRo-{C+?%|8wCzFO(VVKUS0ebp3Y~@SFT!LHcF;9dFQoyG8$>NdGurZo~c8w=Mb? z8T8}d-v;ylx<&ucv$f)2{}C+z@kg2ccOvmu2J8>=mjJ)Xf6EN^r^ zr(pdZ1N^4^cN_ALfBziJ|5A(o1nEyV{v|E?dky;W`v*b&Jr@0UlK$g--V66XJ1zS2 zKhTV_|C?^mf6=jK|38(X{yD&J^8W~fetefGnE$6O`nySgahm);Y0+P5&_BzdKd-=? z|AWufiYKSh?*P9k|8q&d9RDsb=&!fvuOj_J(&+ED@Gl_#L(=f)A7{>gJMpLU{{g^n z%Ku7(|K}L;Ki#7L9?}oXGv5UweAhAy|5F*-e|blJe=aBw*57Rw{XL|gUL$dB z4)$L!TJ&!))F1qQRZ#z+LUZ{YTB=o+xSDk&sQ)Yre~kFkjbE2o_%A2^g#rDL1>ZFn z_)Y%bPWhil)Hr|riXs2sx9ESZR5L>N=(~dY@3iQTeW=-F|2fZ~e<-}ChBAZW*X~ly zpHBZ^;5X%eow;SlDDPnY6BhkFq+gDI4F>&BSoB{{`qSlq zgGGPAN7``Ne)0P|!TkT*qW=-ne_bH|Ai{U`TJ%pK{WAZT8T3zp0Rm+P`;Q4zw3>AF zZ-s?_8u7RJtPQu{Yk}WXe-@Gbvi&9v_CI0K|CGi4p#R>r@V{WOKgj>K#s2jM`!6@x zKOPxh4rn{yor>K_ICru^rBtm$R_!SCM$^MAWV|366o$~5}F4g4nkb4kB!f7crH z4}cdWFi*kqzc#8Br_&z+ev|%{2L1T`nE{j^t`|)f{r%6=gz3uvdlvq~iT`(`j|0rB zyza2rzk%#;Ct@7G@%uMH``@irtyt>E@7DzNUkn>0n5SU*U3k9c zKbGw00BPm5$->{BA^*scX8qqG{&eNnXyLynL;elG53jI={(icP_}O2aXTIm~0pM5l zmkB6bNB-w}isgT!!T-;a{gFV&xFwB#R=0`u2l%@T`tkcWY&YBWu|@yZ4E4Wf(Z9{0 zAHSay)L(e2E`RQ4IA7aH|0o711QF`ua3t{)><0VA+^8?Yd<>om{Qco3;67&n@fR>5 zg={~=Rir=2KZ5wX0t<*BKfWh!sy{v4erW>{>kodvhxxhuFh4=vXxsKLYYRs}|9}_1 shwu=DLH_*#iy%SZ%J0y?1vHP~WYj0GgW<-+zo@^atcCo^E6D%<0P0oS)c^nh