From 8a0413ab85834a0867f8f3075f7277d9636dd402 Mon Sep 17 00:00:00 2001 From: BullyWiiPlaza Date: Thu, 20 Apr 2017 17:17:49 +0200 Subject: [PATCH] Fix Miiverse and add debugging prints --- src/dynamic_libs/gx2_functions.h | 2 +- src/entry.c | 23 ++++++++--- src/entry.h | 6 +++ src/main.c | 2 - src/main.h | 2 + src/pygecko.c | 66 ++++++++++++++++++++++--------- tcpgecko.elf | Bin 142916 -> 143924 bytes 7 files changed, 75 insertions(+), 26 deletions(-) create mode 100644 src/entry.h diff --git a/src/dynamic_libs/gx2_functions.h b/src/dynamic_libs/gx2_functions.h index 1737833..0affa11 100644 --- a/src/dynamic_libs/gx2_functions.h +++ b/src/dynamic_libs/gx2_functions.h @@ -49,7 +49,7 @@ extern void (* GX2SwapScanBuffers)(void); extern void (* GX2SetTVEnable)(s32 enable); extern void (* GX2SetSwapInterval)(u32 swap_interval); extern u32 (* GX2GetSwapInterval)(void); -extern void (* GX2WaitForVsync)(void); +extern void (* GX2WaitForVsync)(void); // Wait until the next vertical sync happens. extern void (* GX2CalcTVSize)(s32 tv_render_mode, s32 format, s32 buffering_mode, u32 * size, s32 * scale_needed); extern void (* GX2Invalidate)(s32 invalidate_type, void * ptr, u32 buffer_size); extern void (* GX2SetTVBuffer)(void *buffer, u32 buffer_size, s32 tv_render_mode, s32 format, s32 buffering_mode); diff --git a/src/entry.c b/src/entry.c index ca51c83..15c1594 100644 --- a/src/entry.c +++ b/src/entry.c @@ -5,18 +5,31 @@ #include "common/common.h" #include "pygecko.h" #include "main.h" +#include "utils/logger.h" + +#define TITLE_ID_MII_VERSE 0x000500301001600A +#define TITLE_ID_MII_MAKER 0x000500101004A000 +#define TITLE_ID_BAYONETTA_2 0x0005000010172500 + +bool isRunningTitleID(unsigned long long int japaneseTitleID) { + return OSGetTitleID() == japaneseTitleID // JAP + || OSGetTitleID() == japaneseTitleID + 0x100 // USA + || OSGetTitleID() == japaneseTitleID + 0x200; // EUR +} int __entry_menu(int argc, char **argv) { - if (OSGetTitleID != 0 && - OSGetTitleID() != 0x000500101004A200 && // mii maker eur - OSGetTitleID() != 0x000500101004A100 && // mii maker usa - OSGetTitleID() != 0x000500101004A000) // mii maker jpn) - { + if (OSGetTitleID != 0 + && !isRunningTitleID(TITLE_ID_MII_VERSE) + && !isRunningTitleID(TITLE_ID_MII_MAKER) + && !isRunningTitleID(TITLE_ID_BAYONETTA_2)) { InitOSFunctionPointers(); InitSocketFunctionPointers(); InitGX2FunctionPointers(); + log_init(COMPUTER_IP_ADDRESS); + log_print("OSGetTitleID checks passed...\n"); startTCPGecko(); + return EXIT_RELAUNCH_ON_LOAD; } diff --git a/src/entry.h b/src/entry.h new file mode 100644 index 0000000..fbeec53 --- /dev/null +++ b/src/entry.h @@ -0,0 +1,6 @@ +#ifndef TCPGECKO_ENTRY_H +#define TCPGECKO_ENTRY_H + +bool isRunningTitleID(unsigned long long int japaneseTitleID); + +#endif \ No newline at end of file diff --git a/src/main.c b/src/main.c index 5ce578c..d6ccdf4 100644 --- a/src/main.c +++ b/src/main.c @@ -211,8 +211,6 @@ int Menu_Main(void) { if (launchMethod == 0) { RestoreInstructions(); return EXIT_SUCCESS; - } else if (launchMethod == 1) { - startMiiMaker(); } else { SYSLaunchMenu(); } diff --git a/src/main.h b/src/main.h index f74b6bd..ea02a54 100644 --- a/src/main.h +++ b/src/main.h @@ -9,6 +9,8 @@ extern "C" { #endif +#define COMPUTER_IP_ADDRESS "192.168.2.103" + //! C wrapper for our C++ functions int Menu_Main(void); diff --git a/src/pygecko.c b/src/pygecko.c index fab5c3b..9737b40 100644 --- a/src/pygecko.c +++ b/src/pygecko.c @@ -15,6 +15,7 @@ #include "system/exception_handler.h" #include "utils/logger.h" #include "system/memory.h" +#include "entry.h" void *client; void *commandBlock; @@ -68,7 +69,7 @@ struct pygecko_bss_t { #define EWOULDBLOCK 6 #define DATA_BUFFER_SIZE 0x5000 #define WRITE_SCREEN_MESSAGE_BUFFER_SIZE 100 -#define SERVER_VERSION "04/16/2017" +#define SERVER_VERSION "04/20/2017" #define ONLY_ZEROS_READ 0xB0 #define NON_ZEROS_READ 0xBD @@ -454,7 +455,7 @@ int kernelMemoryCompare(const void *sourceBuffer, return kern_read(sourceBuffer) - kern_read(destinationBuffer); } -static int listenForCommands(struct pygecko_bss_t *bss, int clientfd) { +static int processCommands(struct pygecko_bss_t *bss, int clientfd) { int ret; // Hold the command and the data @@ -1036,7 +1037,11 @@ static int listenForCommands(struct pygecko_bss_t *bss, int clientfd) { break; } case COMMAND_IOSUHAX_READ_FILE: { + log_print("COMMAND_IOSUHAX_READ_FILE"); + + // TODO Crashes console on this call int returnValue = IOSUHAX_Open(NULL); + log_print("IOSUHAX_Open Done"); log_printf("IOSUHAX_Open: %i", returnValue); if (returnValue < 0) { @@ -1059,15 +1064,15 @@ static int listenForCommands(struct pygecko_bss_t *bss, int clientfd) { goto IOSUHAX_OPEN_FILE_FAILED; } - fileStat_s stats; - returnValue = IOSUHAX_FSA_StatFile(fileSystemFileDescriptor, fileDescriptor, &stats); + fileStat_s fileStat; + returnValue = IOSUHAX_FSA_StatFile(fileSystemFileDescriptor, fileDescriptor, &fileStat); log_printf("IOSUHAX_FSA_StatFile: %i", returnValue); if (returnValue < 0) { goto IOSUHAX_READ_FILE_FAILED_CLOSE; } - void *fileBuffer = MEMBucket_alloc(stats.size, 4); + void *fileBuffer = MEMBucket_alloc(fileStat.size, 4); log_printf("File Buffer: %p", fileBuffer); if (!fileBuffer) { @@ -1075,8 +1080,8 @@ static int listenForCommands(struct pygecko_bss_t *bss, int clientfd) { } size_t totalBytesRead = 0; - while (totalBytesRead < stats.size) { - size_t remainingBytes = stats.size - totalBytesRead; + while (totalBytesRead < fileStat.size) { + size_t remainingBytes = fileStat.size - totalBytesRead; int bytesRead = IOSUHAX_FSA_ReadFile(fileSystemFileDescriptor, fileBuffer + totalBytesRead, 0x01, @@ -1442,42 +1447,52 @@ static int listenForCommands(struct pygecko_bss_t *bss, int clientfd) { return 0; } +int sockfd = -1, clientfd = -1, ret = 0, len; +struct sockaddr_in socketAddress; +struct pygecko_bss_t *bss; + static int runTCPGeckoServer(int argc, void *argv) { - int sockfd = -1, clientfd = -1, ret = 0, len; - struct sockaddr_in addr; - struct pygecko_bss_t *bss = argv; + bss = argv; setup_os_exceptions(); socket_lib_init(); - log_init("192.168.2.103"); - log_print("TCP Gecko Installer\n"); + log_init(COMPUTER_IP_ADDRESS); while (true) { - addr.sin_family = AF_INET; - addr.sin_port = 7331; - addr.sin_addr.s_addr = 0; + socketAddress.sin_family = AF_INET; + socketAddress.sin_port = 7331; + socketAddress.sin_addr.s_addr = 0; + log_printf("socket()...\n"); sockfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); CHECK_ERROR(sockfd == -1) - ret = bind(sockfd, (void *) &addr, 16); + log_printf("bind()...\n"); + ret = bind(sockfd, (void *) &socketAddress, 16); CHECK_ERROR(ret < 0) + log_printf("listen()...\n"); ret = listen(sockfd, 20); CHECK_ERROR(ret < 0) while (true) { + log_printf("accept()...\n"); len = 16; - clientfd = accept(sockfd, (void *) &addr, &len); + clientfd = accept(sockfd, (void *) &socketAddress, &len); CHECK_ERROR(clientfd == -1) - ret = listenForCommands(bss, clientfd); + log_printf("commands()...\n"); + ret = processCommands(bss, clientfd); CHECK_ERROR(ret < 0) socketclose(clientfd); clientfd = -1; + + log_printf("GX2WaitForVsync() inner...\n"); + GX2WaitForVsync(); } error: + log_printf("error, closing connection...\n"); if (clientfd != -1) socketclose(clientfd); if (sockfd != -1) @@ -1485,6 +1500,7 @@ static int runTCPGeckoServer(int argc, void *argv) { bss->error = ret; // Fix the console freezing when e.g. going to the friend list + log_printf("GX2WaitForVsync() outer...\n"); GX2WaitForVsync(); } @@ -1492,6 +1508,9 @@ static int runTCPGeckoServer(int argc, void *argv) { } static int startTCPGeckoThread(int argc, void *argv) { + log_init(COMPUTER_IP_ADDRESS); + log_print("Starting TCP Gecko thread...\n"); + // Run the TCP Gecko Installer server struct pygecko_bss_t *bss; @@ -1508,20 +1527,29 @@ static int startTCPGeckoThread(int argc, void *argv) { free(bss); } + log_print("TCP Gecko thread started...\n"); + // Execute the code handler if it is installed if (codeHandlerInstalled) { + log_print("Code handler installed...\n"); void (*codeHandlerFunction)() = (void (*)()) CODE_HANDLER_INSTALL_ADDRESS; while (true) { usleep(9000); + // log_print("Running code handler...\n"); codeHandlerFunction(); } + } else { + log_print("Code handler not installed...\n"); } return 0; } void startTCPGecko() { + log_init(COMPUTER_IP_ADDRESS); + log_print("Starting TCP Gecko...\n"); + // Force the debugger to be initialized by default // writeInt((unsigned int) (OSIsDebuggerInitialized + 0x1C), 0x38000001); // li r3, 1 @@ -1538,4 +1566,6 @@ void startTCPGecko() { ASSERT_INTEGER(status, 1, "Creating TCP Gecko thread") // OSSetThreadName(thread, "TCP Gecko"); OSResumeThread(thread); + + log_print("TCP Gecko started...\n"); } \ No newline at end of file diff --git a/tcpgecko.elf b/tcpgecko.elf index ed2a38032d5b4b3b462625cffa807d449d9e01b7..dd4dd6bd5f827e5f03204167fe9280f90eb5bca5 100644 GIT binary patch delta 24899 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 Wr$KyLkuxZPhY$8?oQVm1=>G>*z1OV( delta 24300 zcmb_^4_s7L+W)zi0S6orjSxo~CqhC(MM4|?2qTU&ql`vI#ri@!uGC_YQCT}BI(LwE zv6r@iLk+c5xM^8SEt|HG(T3$3?aQ`QRIE~tibh6>NlJyz?|JT>JIp=WpZDFLeujJI zJm2%2=XuU^p7Y#u&z;=^>V5rccRW9*ur47!ETxaA*6HhPC-}czN)6l*r#Z#Vk?46_ z30eFUv2U6k^6W}Mb$R(Z5(;%uSm(+$r?BIaF5kQKS-1DB5JamVZ+#GHtE9b}tpHZzfe) zuUl$qSE!jc@1s#+3)9S%KqZP+*97XsR><8-e)mt|gOVgyq1j3uVafb~QMx@WG3>x7 zs8mgRpaw2uVaZ{uJ`rnDCTQc$)xdg!p_%Za+H5t+NP%z{E6 z_)fR0)299p3|Uv*yr&7cR|v6^y)V*1^=**{YqLH*=yo0jUm$|-8`f~K{<>|hMFD$@lA+DfHhz2HK;u}D3&sL;SByoFExIP^Zng-r zRV9JPMl03)vkjN~hM|?wAl#{;5F#)n(Y-`%CHogtI%nL!xQaAMJ>IDS8~%L}+HRfM zopp$)vjrlcZ4K4y%V@FY%30--nf8Z@sM#fIe{eHMJNMgDgt;AoLI|nLEs0)S#YH2;fJUBes-ccaI_jD}!VmE9?doQB*DI}TNV1U1O@$0QJ(CDHl5^M2ElG`|$f zeu8ha$T#apR0GC(U@U-{d(h-`F^SDJk_RbAqOw;1u92E1Cu+^cdT@oTSaUXY5xw)K z4;KEuVKpy(gyD~9u&3O&P6 zJ*S3RqZUS3UzGKr_9-!8hrEXUUP8Us$7s!paX=I{gvr`Kd!yz?SZ4<}j1g_w%G!|{ zrsyIpA6|&;z5rP}C7v&dqpee7BE502xNL((t`JNVM|-ElPxYo|ed;wrwSTQK$5Qpw z#7uJ>R9g+;AI`s@mez?wC2`{P%q@xYyL`2@@Og`&`J@2XvZ;w_<|k#z&^drj8af3! zhjTy7rHeQQ?VK8)W>$MSY_CM zxX<7vD(B8GE^J|poja-Jy~@fN4k?zm(2cP(B3quv)X87-Bpr-RqTR8PlUi;Gs-~aC zT2S-U>02i0QRl*cL}g~oKG;t?r)za)n>c)!OkF_;_+!}OrxH!Vp~5mytCx;WuW;hx zW#y8-MV^xX3^<(oB(1FEwNvw+f=s#N{D_rHo>I9ffT_hLUUJ;m{yFbSz%+5$5PGUa z->M$iZrE{5WjM5|R$R-uB=ogaen{3BbUyOo5EY{ zv^hyni{q}C5|;x}r^;DamIEfreC0?bb;l+0nYYmPxFy^yIu@sOX3ue@o2}ViF*=nB z&mGd^*g1cF(6Ra1KRFD}RkgCCL1L`O@ABAgab7>{%-9p{e7w)NxXEY8_l+5xV<1H* zsmjn7kgR5+dNiA;vp%)h;U*-?`OM&T&L(ZNaobpwD+iMGqZ=Jg`tMnnJ41>p@15ar z-wG>#B2fV!@m|2t%sUOv0uA!Ba#`yH&|}lUMu*{z0*#@QcV_8u**yD+u(>39-WI&E znr}r{%!LnR3?n%GgvU$tB7Xnb27|A#FoXDfD1TN)i5_P*W*bJjKzAuxtw*0o@7Bff zOEuK3yOlQ=&{5sosiv_UBN%V~k)a$rT%(S7sbS_uuwKD(?bM8W7ZK{j1*ef>23>4)W zL8w;-j3C%>X2XCU1nr?MS7a>>aaR!H?jb6JoRopjS-AyEUDwDGOFoEF1EzGdnL3=$ zjfXc^CYV1Z;n#BloG^eWxuriE;07F!6YWgU#wZuKjqn|<2V%@yu8SJGLy}+=4pp-Vx(oJPu|8zI)nRV6tUn(7bM6*aQ zJFYn}!CV<;BZ>~Wn31L=CWal`m$mWO2rWv?1HM@^iAMCuhGY9OKRO;qTN2~>)D^TR z@%GSgmjQBM170*6v^|;zaz8;{srdMC`S>g++dF`VW9x09@#2EaonYpGx>4#zQnU z>E>XYZp3ghJO%;pDj1jUB<=Fl5;SG-xS#>VF@do$?Efs<`Maay$}Yz>#Dg&yLk*YH z)Y-VKx0lTl3x(#32;RzV9(c{+41LRy?>jLcxSA6!jTm2@4<2>o+DTQu@3Vj6DrRUd5aCvC zb~x+-WYgHWy08~kKpvG&v*)I*PySGeN_rAe+4jj|q_wYY74K$obwy5A^87Juigbfe zK#(rG9th$^S2T1IuJKTTCJVxxfA!EfUx%UoHfprS6!B7$IWF^UllSgmJfwPdbd_^CPUYX?1FRjKz*CrgF6$ z^isR|D(AyWg+CY5uC2>TV&^@C8!v+m1}|9c^OD$n->0xeF<6ZJ5T!SwsxPwcMPY^}MBVjhb+E;ZAUlWsn$v-{53L z>l$Ezx02`l8vy2XaeDw_{`hbXl3*bu0k$6o0YWb>z;+C(TTlq>7zIE<;GUv7iyoW5 zd{TKXAzN@c%Zjx$((JUGrmRp}<+BZRd)l>AKEZKAz4CpBKg{ zr;lNWwC{!&5~w3%CGzdcSQuk2&fIUt957+?(bpVVucO;EzDlDr z)A+`v)S8*eCwxe&Gvj08?scw?sc^358W8AQeE@c98>i5YOwWp0?)xDv_%~5iJ`lW^ zL&w}@A7TQA9)Q}O}Y=0k8PE8Sp>&tsE_ z;~Gg8)%^_XB7>8J<4vSLh5DHMbmt$zensBA%aWC1e;kVv2oBtMhFdtzlEj$cTey#kW%G)e*QMghE>3#L z4b#Nju<2r%7y9|QCw|jBxQq~VDWy|3X&Uj+s zE6*}wf-w?{aZ|i8pSq5{F{eXj@y=Xr(M_Ft87@y4`f$4egDEvwZsbi~>bA^q4r8Uk zALOjul&$gr$&K(TMO+aFcSA=nx|N80#y$1DMwus?4fxIv@NJeNxn$0GDQv(F+&<^C zkR5(@%*%!iYP0GhqW&$n$5m2%AaEp`x~=daPfvFuK(UNUfOHw4T6Pszj`z@X#^T8l zJuQCA;&#l8>jHbFa`=!n0S)AM_5;%@SmO_416;k!bgL#Wl?9gB%8@3BZNtS}U&djQ zl<(^`2H3*h(W=OR9b~o_N(*an(9VWm3~}(s$7f8OAsFr{NShhC?*A$+jn2PPVzO$| z=ReKlXv@W9Q>y%NcR*#7ZBig+$STY5aZ4Uex)@ukvL*g%(sWs>3q4x8PlNk%)lX0O z{wU~9dPE_5v?j0+qDP8Pnm$uq;JfWMU4%w{IwWRzBJz081xU>bKn7$D@H{SV=Atk7 z)zDKrASaGTE$H2e&$*75vpkg%>i`6eH#XsR9C%gG^t^u9%1ylGhm91N_CH`Gm;{%= z;wri8`*0`u#&qn2rml?1j0o&7u*SzR1cPEYX}ajx2`hD(5j%cbtRoloDB8C&-Wjp% zhnffVeo?Jt50jKSJ(%x%{hVaEcXwyoVV?#!Ce|JkEe^*q=H&ajOEdIv8xO%A1AM;k zlMR{l{%fZ!41YBs0|q__rZR8PUVN|z`F<}uauNMhYylA6&O`W8I#tE_X8l)A$tJ;NKix1J-0OcMHP{pBP(M^CEi7ZYQqbH1gh zeho3@*rCEjtT_T)w-H-rgT-3EmlR}n5+0rc7iN0no`HwMMOg$MAzn_3b3jsluu zhWLEA<{RrtX?+P%&3oGCgJ+%5E|40ZTFE$|_qrBYrQ9;*W+lQLyx~+n*cYb%_=EjqH?6+@nsJv7Jl7xW`#I0` zL&p=%(f z205gs`d=t{4i$>XJAa|S^>43mmFnt>pM+G~%vZtz>xAO)FSnF#_LU zfM3>7FAMBM;Jp7*a{O|T7W|j8>#t%F_%s9j%1ApI;1MqZCl@O@!UkVzF~hMHs-{sV zgZ!$WHZ#a0Eh6$HgFMWgFM*??iNGeElCv*CY;c;D=5~4{V4^?awAL?d?o^V}S0II&d?9 zq5wdm?_=l{3_Wmr;}@VtNk73V&@9uPl7=UYOb6{Uz)vq{=sgU*k)aPVbVh+u;-@?P zCO*MvFdD05@I{=mgV9umZe!?HhAuF4yF_=&WBf%s18^`57#|sRE9pb2O#7V-ow49( zr$~1OoNTC>VbI4g=w|4{41H8d|5mM}f2n8adZatYz5GkY2fj5h49XY=1q{83p_egq zMuBeypgV)6*_W&ajY8v=M>=mDb zV;yo4)<~IyVaLfHTE12nvsCX-DDVj(9t4KG;p7NyUaRAm!f}GNF=1FU3=bRD&Y)-4 z2I4L9*)a?cNlIZ^DP^h!s15{d3E3hdpJtJ;b;%%4X+-4YTa-LcWz*DKlsr#ufGSv6 zSY#7zW|6%j@+5=&I+{k^s^s}KoCX7)zr0o1``1lWV3FM-@?Q+{w2BTh$kQk~q;J1g z@;qHZ?Y~y`e!7|V{2DSI7TE*UO5_L;ku%GbJVy$sv5Y~wMdTwavWK=Z$Zujrq>n*< zW2gFcN}k`eh{!wFDSQ8Bh`Jf%nS}b=Amd?xXNv1@Q*u1hfVgXKQ!+f$O)FU77y{p5 zfM-qA%K*<-BXHjBN{(kcXu<8uuFr}bpJsrg*|d`Zj&4AXlgpJHMlx%AwXatqzXw-X501znzqdg(gRB*iGw)RL{JxtS?^GhkqDAB* z406myTUn$aB7H2fmFg=Po?a1oXN9u&b9(A#kmpJvti;eyE0V-K@SKD8JT`+~dDk>C z7d+V)6k_3#_1CG&5Iam5x{aX+hj47qtb)VEOnY1fr8P*(1&3=H0J91X2QNa{0kaAY z4>9eTRq#|CLx)vR62PAeo(f(@u>)omJS8X@oMu+RQ>_f0Sp`oq0-iSd1(0*WuY=QR z5a2Yk3V!WiI$&18uUi;;jjW-R%zo`<=*<#6kPDuUWdQ9;2B&Qdy@#Q*78+#ejD<#s zNO#)hWb`y6;Yh5K!H8Zdz(^`X4^Gvv z>0l>A556Bj0Xu;noC}^I41+!;gEIz(KFrW7l=N@Z44tvSH+m))Jk!rGFen+EWqjnD z0)}49v@c`mjSO8_Oyh657EAL#bS8^Gq`XXix&q zv@>+ZLT7py`Y6+WP)YwjNkMn|&JqStssQ-T#xnHn3_X>hGZs2)Rno^40yyE&hMfU0 zUVPTU(A|sxZie2;(04NQU<+LeV|2Dt2{>n<`y4s(=bGTQMW5SAs_Jshu~|O2!`VjS zkhg0&90hp__C*u!kB@*oO}KS2>^KMa828T&!!6Ep1GM`7G_iO-j&{gJBOQ^86*T1m zKcJPC%0(}2@)v#Z2wg4~QO!mP>vL0+T=ddPf00Dd-Ez@LhvcGzCR9qz$WB@;7YAsA zzsM!fZn;=QRhtrHxF$TEXgEX);F*mLcWZGsnKs`aBdP+Y-ikL#9N`6&27i&)&~CX{ zKvkP10AEY9r zq-Lr{S}vsVFd*(qE!`u;iSnw(Xuls2no6Tx5;nAg+T>yjt(J@Zw8LKvi=`uS(MnUQ zq-J3bS}GTtX_H*+roD1;lxns}*a=D0Bo~WlrCb!~Zn?OV4sA)ial(M#-aTONZrR?h zT%yWuhDST_*an@=utQB?OnQHW9t-q7nI0G~btxQr@eACaK&<^0@OI0GjhWD=J{(R*OEg^^oPZPFk zdEYQi*{aPXdIsqjN0LH@)(}Lip#pFr9kdC#1TRM*_1A;rNG@H;<+Lh@RzZh>3%8qU z9@1uV!4VUkzqv)ZC?jU z1T{lT526|BAJ)0P?cbFT8l&(c>IE+04Rj2+gm)|ZI~z1c5h{ijG)58Gy9$1v$>D}y?IT)eM76j| zdi@)Ii_Ed&)OSfMrD1J^TNK8>5r|7AvNr69Xfo_2v9KZNe-T*PC=8;v06qFg=p8_h z60Z7T2E72#1T&xo?ifB|h?co^F&3kL<57=YN*j+8;V`UQr?VI_{MO|Vc!5-W*cl8d z0>}({+8uPq4-5W82aT=^+8e;C?bOCrb9LvOw$>!r4|^=l zjE^rT1=|I3?DNdPObT8hkUpkVYf=lfdID-is(+qZk1p`!8;L(0NDc76iH0->TA1L`wcK$%qE*`xc~c)v*|rBe9o)7WFQz}PL|Vfilkr{L z&OhFbmFdqc$BXdHM@Z{@b|(GJ_A7Z4y!*HPStM9@yo{Hz9dAl>c;z&jYMv8myPvxc zX(>C`DgYyOlR7TIMb zZA)qAi}CcppA6U{?jW%wnaUfTcit#~o*5?l1_5+xhkB}!JjyNWk;Qt$2u5K{b#Xn~H` z7SnHExeoc;{+cLSq2)o5{}X?;>CQGhUQ8yzCo)6t^9fF(f%7%uBnLad;I={EBeb#& z-r>;D_BI$!LI>JJ$5Xej=OcTlqg}Ma_V(p`WH%jdkB`i&g+S4tOYkMHG028qy$w6B zeN|HK`Nd-ApS~(87rO^UhFh9FFQCZQ*F;C@cmuPq@bmVXg z&4FYhTYycywFlw1OCn3*z*ni2JaIXl0Vl}*K#CR_;jQ*$%YZAKXk5!J1G~mvKf|G9 zBX2B3H%jT;9A+8Fm~9!Lt(_0>rdpb^cQgD{)~=Slt3$OGH@>B};%`LnKf~wEFcR|k zGK-t)-`4R*9Mt&sN_@x5{q~K#x0?>W{XiPLP#1KXO?b+ZAZ90UEYSeJoMk0Z@)_N1 z#BKT1l0X}}7HVyMhH6_MzI2P-p{k&YN>~Tvfv%h!cu}euw8R72cw}=&WG`CkV!uQZ ze7H)oSV=myzXSKGskGsp&3xo2js8b`aYbLnuVF>B-G!Ck}M+7LJi zzDv`S$SpUg8mhl4hvRC|@_0hJlM3VHg5zueB zSQy_=j=3m{Mk>6&khj1rcz^D4O9L|ZGbLMYwgfr^xk8+2hsjedO^cg|9oIII%W}&G+Wlc#grxvaSAv>NRQ*v}n579C*r@R%ZH%P} zhA|F)!47_?LGoiDHPMQXw7jjK)_#;2X6pxE+DF?znya(*!*9{ufX5b%E>e^$z}vaa z5I~yXHTl<}QFEV(T0hod!?KU>e(6p5gzy zSAT^6a^SsdsBg8Jzr;(ehi~IA?b@~b@M<2fQ3Ln!SY2~`HGUm9zFw>@{Cs^FR_{BR z3DqwT-x$JQlCZ1j^m-1jT_f*uyiQLW&)mlAQg*4%o>z(2u|1(c_H=UG@8P?rfal%? zSerhCdp0uphQ7Khh<=`cF9e?}gmG{g!fzOJ&m;*DQ%yK77%GHtT~gcd6fTcX3vO^e zTiM`z3jB81c}Sea#5T~dG@3gw1>|lsCUWsA-qPGwn#^T}^Ov=@HDAr8f$-k8-gNGL zRN1rh8tx_SU^R{)%%4Z`s$WZZlq6%eE~>4)JiVMs77;+l^cmT-&l2a}V%h z#S$n0A>9P>TKYW>6E}CEB^?g@)`-&|bj8VnKLCQi4d!-Q`WJWjIxDZ7DCUQcUP;v0 z8~9GPr{BaS107TnunxSgAL;|y9 z1Y#5g-nUdzT5aaw4b5y%ikX8~fWZi6?vD|cY``rOHo^A<3->A3tE^mon5a~?r^(74 z!8&0Xce7kKu#9^X>vk^ZGW~UJgUh*3VHmxhu4}O~uSZkB9l+~g0hb(U@m8+Wia*4b zF*~QrqrZ+@IMw2%Ye;miT|5&Wo3$}FrLF8bP7AA{*HgWUo9na<_$QJ^4hv|e@o8)u z{0aKdPtb>dlz#PW+Xw5z*8%Nu^@8)vUym4QfW+V5v5FTqbbKh~uv`gUj^Tu|M+r_Qo zjh$@+F76>947XKm;hsfATkL~e3?F7}%`m~2^xtu-xT&^%R+5y2UMEI$FoUPDhMSAZ zchzv2cvWrX>hapRmCNC6-EDnaxyMx4Va4ykC5_*D8h#HGHm}eV`v~{@yu8>&#wDp> z7yTkas@^HfGn^CbNm$M`lBzCsUaDBn5&hmhdC});i!!0kn86YEIcr(cJL`e(;3M2Z zeu>bgcXP>H%o3qeUHH=Cs)#O}OgGG)kn_$9rZSJc4s5-Qf~TpDo66_Kd0OkZ z_=vpdci;txz0c<*c>3$OOzje3)Aqubu<_p8@>0$TM3=Fc)b3rK7wt){2U9`2>Uu7I zYMvflHCtGc3a9pC_pXKd_ImCKKF{hYq@a3Ul&67$X^f+ueH22~62YTy;F5XZV{71Y zz^;2s^Yk8f0~a5br+?@7VB_`%&K%0;CH?gYuAY+ws}Kci`U99QFUiyS2kvVS5H%bN zCuxhT_-+(5gAhJrxuhMKHriA0B&Wj;E1rZ23Z3kJ5(Q83sGs8YB}#`NTd4pW^mwZO!r=1efo{a<(1c!?2aLbv?~J5yqP;+Df10 z{s!})yDj0*9IQZ=0nbP)xBy&h{(=EzpsoC6E>R>j>;eO=P`HMuLncm9{%zVr4}-}zs4_|BI$_|BJU;IqMZeqBFU z49Y)fB`28h_QoFp{0tM{2bkZ)N<8iW0e-Nvi|`W19~)Fyedq5HeCIcSAKV4k{|%F$ zgS|V+cmD2?3-~(!zjyR=gc-;9$A7%y0ttUmzaGfG_EGWb*y z*I+7qvf%^Y4&QZR!8y9+@QG_n8sW?#&IzeR1^?CXafL*|-%t_--=uOF(ZheKtb+O|BAjanYLr+n zmjwd<#d<<{~w8*b6h2cs>}FS)br%d^}q5s5kjsnUVr z2V3D<2p@>2x(fJI!p9AtW~8;j5Y+4W+!W7yvv|9w{0ctOxuVbKTRG_eln0gNI{$T9 zG|(U+MeH)0&u1%>%C-)lZ^iIWe*%3d`8vlt_Y+JbkoERR%;jrvV_UIA!#Y#*csUqj zDjKiPC*$Q{j8raVh_FtXMkN8Tb5Vd^sZMUZqEc$Jq5-VMm^V^=4ORd<))(({HAT%9G-?G9;^|42mR+qKAxUbJ{2Z_HA(!qD)tfA zbG@W$vBncOpT9ME&rYc~@h>>9_-_jQ1%(MuTnBa%?lmZ`>-DtE=XGf&xG_)YgGpKh mmGVEezc3T7SPp@o&gvuloK(VRTRmg*dH8MnRF6K5kN$u9?~={{