boj-rs / basm-rs

Rust 코드를 컴파일한 후 실행 파일을 온라인 채점 환경에 제출할 수 있도록 변환합니다.
Other
99 stars 12 forks source link

DOMjudge에서 컴파일 에러 발생 #85

Closed jh05013 closed 5 months ago

jh05013 commented 5 months ago

./release-64bit-windows.cmd 로 생성한 C 코드를 https://onlinejudge.icpc.global/team 에 제출하였을 때 컴파일 에러를 받습니다.

Compiling failed with exitcode 1, compiler output:
/usr/bin/ld: /usr/lib/gcc/x86_64-linux-gnu/11/../../../x86_64-linux-gnu/libc.a(libc-start.o): in function `__libc_start_main_impl':
(.text+0x12a0): multiple definition of `__libc_start_main'; ./ccIS1rIj.o:/compile/output.c:179: first defined here
collect2: error: ld returned 1 exit status

L179 근처는 다음과 같습니다.

#if defined(__linux__)
int main() {}
#ifdef __cplusplus
extern "C"
#endif
int __libc_start_main(
    void *func_ptr,
    int argc,
    char* argv[],
    void (*init_func)(void),
    void (*fini_func)(void),
    void (*rtld_fini_func)(void),
    void *stack_end) { // L179
#else
int main(int argc, char *argv[]) {
#endif
    PLATFORM_DATA pd;

전체 코드:

// Generated with https://github.com/kiwiyou/basm-rs
// Learn rust (https://doc.rust-lang.org/book/) and get high performance out of the box!

// SOLUTION BEGIN
/*
use basm::platform::io::{Reader, ReaderTrait, Writer, Print};

pub fn main() {
    let mut reader: Reader = Default::default();
    let mut writer: Writer = Default::default();

    let n = reader.usize();
    let m = reader.usize();
    let mut sum = 0.;
    for _ in 0..n*m { sum += reader.f64(); }
    writer.println(sum / ((n*m) as f64));
}
*/
// SOLUTION END

// LOADER BEGIN
#ifdef _WIN32
#define WIN32_LEAN_AND_MEAN
#include <Windows.h>
#include <io.h>
#elif defined(__linux__)
#include <unistd.h>
#ifndef MAP_ANONYMOUS
#define MAP_ANONYMOUS 0x20
#endif
#else
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#endif
#ifdef DEBUG
#include <stdio.h>
#endif

#ifndef UINT32_MAX
typedef unsigned char uint8_t;
typedef unsigned int uint32_t;
typedef unsigned long long uint64_t;
#endif

// Use cdecl on x86 (32bit), Microsoft x64 calling convention on amd64 (64bit)
#if defined(__LP64__) // LP64 machine, OS X or Linux
#define BASMCALL __attribute__((ms_abi))
#elif defined(_WIN64) // LLP64 machine, Windows
#if defined(_MSC_VER)
#define BASMCALL
#else
#define BASMCALL __attribute__((ms_abi))
#endif
#else // 32-bit machine, Windows or Linux or OS X -> forbid compilation
#error "The current file can only be compiled for amd64."
#define BASMCALL
#endif

// Base85 decoder. Code adapted from:
//     https://github.com/rafagafe/base85/blob/master/base85.c
const char *b85 = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz!#$%&()*+-;<=>\?@^_`{|}~";
void b85tobin(void *dest, char const *src) {
    uint32_t *p = (uint32_t *)dest;
    uint8_t digittobin[256];
    for (uint8_t i=0; i<85; i++) digittobin[(uint8_t)b85[i]] = i;
    while (1) {
        while (*src == '\0') src++;
        if (*src == ']') break;
        uint32_t value = 0;
        for (uint32_t i=0; i<5; i++) {
            value *= 85;
            value += digittobin[(uint8_t)*src++];
        }
        *p++ = (value >> 24) | ((value >> 8) & 0xff00) | ((value << 8) & 0xff0000) | (value << 24);
    }
}

#pragma pack(push, 1)
typedef struct {
    uint64_t    env_id;
    uint64_t    env_flags;
    uint64_t    win_kernel32;       // handle of kernel32.dll
    uint64_t    win_GetProcAddress; // pointer to kernel32!GetProcAddress
    void       *ptr_alloc_rwx;      // pointer to function
    void       *ptr_alloc;          // pointer to function
    void       *ptr_alloc_zeroed;   // pointer to function
    void       *ptr_dealloc;        // pointer to function
    void       *ptr_realloc;        // pointer to function
    void       *ptr_read_stdio;     // pointer to function
    void       *ptr_write_stdio;    // pointer to function
} PLATFORM_DATA;
#pragma pack(pop)

#define ENV_ID_UNKNOWN              0
#define ENV_ID_WINDOWS              1
#define ENV_ID_LINUX                2
#define ENV_ID_WASM                 3
#define ENV_ID_MACOS                4
#define ENV_FLAGS_LINUX_STYLE_CHKSTK    0x0001  // disables __chkstk in binaries compiled with Windows target
#define ENV_FLAGS_NATIVE                0x0002  // indicates the binary is running without the loader
#define ENV_FLAGS_NO_EXIT               0x0004  // do not call SYS_exitgroup on Linux (support fn-impl scenarios)

#if !defined(_WIN32) && !defined(__linux__)
BASMCALL void *svc_alloc(size_t size, size_t align) {
    return malloc(size);
}
BASMCALL void *svc_alloc_zeroed(size_t size, size_t align) {
    return calloc(1, size);
}
BASMCALL void svc_free(void *ptr, size_t size, size_t align) {
    free(ptr);
}
BASMCALL void *svc_realloc(void* memblock, size_t old_size, size_t old_align, size_t new_size) {
    // This won't be called in loader stub.
    // Also, the main executable will directly call OS APIs/syscalls
    return realloc(memblock, new_size);
}
BASMCALL size_t svc_read_stdio(size_t fd, void *buf, size_t count) {
    if (fd != 0) return 0;
    return fread(buf, 1, count, stdin);
}
BASMCALL size_t svc_write_stdio(size_t fd, void *buf, size_t count) {
    if (fd != 1 && fd != 2) return 0;
    return fwrite(buf, 1, count, (fd == 1) ? stdout : stderr);
}
#endif

BASMCALL void *svc_alloc_rwx(size_t size) {
#ifdef _WIN32
    size_t ret = (size_t) VirtualAlloc(NULL, size, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);
#else
    size_t ret = (size_t) syscall(9, NULL, size, 0x7, 0x22, -1, 0);
    if (ret == (size_t)-1) ret = 0;
#endif
    return (void *) ret;
}

typedef int (BASMCALL *stub_ptr)(void *, void *);

#define STUB_RAW "\x57\x56\x53\x41\x54\x41\x55\x41\x56\x41\x57\xc8\x28\x00\x00\x52\x5e\x51\x5b\x31\xc0\xac\x49\x89\xc5\xac\x49\x89\xc6\xac\x49\x89\xc7\xac\x89\xc1\xb0\x03\xd3\xe0\x05\x00\x08\x00\x00\x49\x94\xad\x91\xff\x53\x20\x50\x49\x91\xad\x49\x89\xf0\x96\x53\x55\x48\x8d\x7c\x24\xfe\x4c\x29\xe4\x4c\x29\xe4\x44\x89\xe1\x66\xb8\x00\x04\xfd\xf3\x66\xab\xfc\x54\x5d\x83\xc8\xff\x48\x83\xc0\x02\x50\x50\x56\x6a\xff\x51\x93\xe8\x49\x00\x00\x00\x52\xe8\x2e\x00\x00\x00\x0f\xb7\x44\x75\x00\x8b\x55\xe4\xc1\xea\x0b\x0f\xaf\xd0\x29\x55\xe4\x29\x55\xe8\x73\x0c\x89\x55\xe4\x01\x55\xe8\x99\x2d\xe1\x07\x00\x00\xc1\xe8\x05\x66\x29\x44\x75\x00\xf7\xda\x5a\xc3\x80\x7d\xe7\x00\x75\x0e\x48\xc1\x65\xe4\x08\x41\x8a\x00\x49\xff\xc0\x88\x45\xe8\xc3\x5f\x4c\x89\xc9\x44\x88\xf0\x88\xc7\x5e\x56\x20\xcf\x44\x21\xe9\xc1\xe6\x05\x8d\x74\x4e\x40\xff\xd7\x99\x58\x72\x46\x44\x89\xf9\xd3\xe3\xb3\x00\x8d\x8c\x5b\x00\x08\x00\x00\x8d\x5a\x01\x04\xfd\x18\xd2\x20\xd0\x3c\x07\x73\xf6\x50\x3c\x04\x72\x10\xb7\x01\x8b\x45\xfc\x48\xf7\xd8\x41\x32\x14\x01\x30\xde\x20\xf7\xd1\xe2\x89\xde\x21\xd6\x01\xde\x01\xce\xff\xd7\x10\xdb\x73\xec\x99\xe9\x03\x01\x00\x00\x89\xf3\x8d\x74\x82\x10\x04\xf9\x18\xc0\x24\x03\x50\xff\xd7\x72\x0c\x0f\x10\x45\xf0\x0f\x11\x45\xec\xb2\x5b\xeb\x32\xff\xc6\xff\xd7\x72\x10\x8d\x73\x01\xff\xd7\x72\x1f\x83\x4d\xd8\x09\xe9\xc5\x00\x00\x00\xb2\x03\x8b\x5d\xfc\xff\xc6\xff\xca\x87\x5c\x95\xf0\x74\x04\xff\xd7\x72\xf2\x89\x5d\xfc\x83\x4d\xd8\x08\xb2\x94\x8d\x34\xd2\x99\xff\xd7\xff\xc6\x8d\x1c\xce\xb1\x03\x73\x11\xb2\x01\xff\xd7\x73\x08\x8d\x5e\x7f\xb1\x08\x83\xc2\xe2\x83\xeb\x80\x6a\x01\x5e\x56\x56\x01\xde\xff\xd7\x5e\x11\xf6\xe2\xf6\x8d\x5c\xd6\xf9\x83\x7d\xd8\x04\x5a\x53\x73\x6e\x83\x45\xd8\x07\x83\xeb\x04\x19\xc0\x21\xc3\x8d\x5c\xda\x4f\x52\x8d\x34\xda\xff\xd7\x11\xd2\x89\xd1\x83\xe9\x40\x72\xf2\x5b\x83\xf9\x04\x72\x43\x89\xde\xd1\xe9\xd3\xd3\xff\xc9\xf6\xd2\xb6\x02\x01\xda\x83\xf9\x06\x72\x1e\xff\xc9\xe8\xc1\xfe\xff\xff\xd1\x6d\xe4\x8b\x55\xe4\x39\x55\xe8\x72\x06\x29\x55\xe8\x0f\xab\xcb\x83\xf9\x04\x75\xe3\x99\x56\x01\xd6\xff\xd7\x5e\x11\xf6\xe2\xf6\x11\xc9\xd1\xee\x75\xfa\x01\xd9\xff\xc1\x89\x4d\xfc\x74\x1b\x5a\x8b\x4d\xfc\x48\xf7\xd9\x41\x0f\xb6\x1c\x09\x41\x88\x19\x49\xff\xc1\xff\xca\x79\xeb\xe9\x8c\xfe\xff\xff\x4a\x8d\x64\x64\x30\x5d\x59\x58\x49\x03\x41\xf8\xff\xd0\xc9\x41\x5f\x41\x5e\x41\x5d\x41\x5c\x5b\x5e\x5f\xc3\x00"
#if defined(__GNUC__)
__attribute__ ((section (".text#"))) const char stub_raw[] = STUB_RAW;
stub_ptr get_stub() {
    return (stub_ptr) stub_raw;
}
#else
const char stub_raw[] = STUB_RAW;
stub_ptr get_stub() {
    char *stub = (char *) svc_alloc_rwx(4096);
    for (size_t i = 0; i < sizeof(stub_raw); i++) stub[i] = stub_raw[i];
    return (stub_ptr) stub;
}
#endif
char payload[][4096] = {
"00008=z{<NgBF({O#XceZ9GZ1GRjW<1I#88V`9DS+8z}=86FTQMs4Tx{utC4OR%IqFjr;v>2v6D%~V!AVaW9s`}^o%8vd|VT1%y#-u~-ecGt99#>$%DAO|>}c\?7h`DUKINQOlGSc\?DwEL(_3pc@Gp3rYw6CQ0<fHXdm+-g}=XRKz<|A$Yk(H3h}NhCfP*W(M7EOVc}Z^pJ{E@_i*3lCHTk+oPrbYK%B(>(ckx{\?otFTQP(#Iyb%+7Kg#{QRquU(hS5^eKfx1~)u`O1##e)(q)X=0UZyg-_|M+s7w+~Ej*;tp#E^t;Y}Ax`soTW>jVPRjn<~%O)tIH06vDqy_l&3-)}u@xg!NRD4ZbU&xyp;uZ@mndmu<xsBLPu0%&F6W#%E`H_ixte{5Gp@d$zG{^TM!MTJaEKczUVu8#GG*IlIFg4h\?9gDo;fe*8jCFK58scjR!+t#3B%Fr+a<Hp=o5JVpv5PtQ_a6#Ej$9&~f)(aOrRc068crq3yq#J#-MFd;%7|I5FkHRF%y2{EBu<xTXL7$M>0vg1^k*2*Jk!p<KYE_|Amy^uou>7>@Qr;(s1(aVyYVAtOwP^6v`%sJZ%}<w*P<91uPS>3sS\?!H~~pV4~R4Unv68iv~#MLKlm-V8=U%gJSa+\?RW$RRn<djkVH5>z-S*ThG!@dTgY!fvbjdio1opK;PmF_|LJon\?yqICuhBSWIOWW|*DO{cae;f#+jy(sI^hdGtudAo%|}8+GJ#S<j|_NYX{igYhP9@Co8A{HD+ur07iS}yAJB7ka@a3!9{T$*E3F$B_2o5e#jA#xq1G-KmGZu@N2s6sPv_Vi<1heOu04EqG4}VE;<kV`w`42crdQ^jT2w\?j!cpHIqfIXiPH@@<\?5}@rSuiu36W^6y`Em0lE~a\?3I43H;$WGrhU+vlOrVCH$b8-RU;Gb;5TGLUs_lp}&`^Io4m~dlNV>skm+!I(!c`&SQNTr$TF>*`X^5E51HzH^9+z\?j~9-X<8@f-eOgD)pIQ>h!<d2qrgF9qaPvd(tqVbIC`%xhi!5N|Avckyf;OX8)CLD<qvWhNqC(oto%<Z^9!yqS4@l7MtlI30l5E2s|\?K2<FzdXDV8LhNLySoRpVUm&*GS<H9**oc(|6Pe>gI3-0*lZR~l<%7GNuU<nWqS${IoT=}0wcHqOk#-rB2emP9Hh}!;*ibX~MkpWW6n5qs-IXo*4m~)R<D64ytBo@172A3bQMl^!a@U^{VuDHGK@P>s_m`UxnMir2Ge6s{^HB|4m#%P$rz6eMZ##gao8+-q*B=|;r7=Q<%6zwiZa@D;+usnmql73728+I+0m}*pKD-n+@aChRco<9FGr92f|5qTIP<>vt)1-u;J4m$7#jX0\?C_X%n9yaxYhJIVVijB\?#K*Uitsl6W3BM%W%B0WXeKSku*tt`cA_t5)~Ri@y#iOQWM<iNQJbaLU@;`S6))CUUuysB;@73eJ!HXQ$E5VYud9r^(>NLY34qD;Hb@-N8Bmbm1$X>W}rh#n;Ve)+h5=a~D7YF}19uU%qWkd0ZsjqqGctQ%O}W!DSC)j@%<wx0ws*6nXoC\?o;mugB0s+6GwvDU=%*tm^bY$w|j4s;<x)40P^=Lx-BJ)o^Be;C~93M<m5=I`Rn~CZCn4mya`VVkow|n_rL4Km)XF^MFOi;pUx0#0#3RqWv7pWvoeaP(+vZwNE>xJZ0scl<oD<Rtb5\?!nDP(N7o@v^TNK06)LQ*Owrnk0cAuEnj}g;h)lJaI3-pY;DQQ96MU|xu4vlk;(\?*DW(KXpQ&wURP7C4G8M>Cqzh`rn*3^oXz5yv0%h$`<m\?qywkn)sB#;#M|^mFal{mWi6W_E2>GWeV>15\?Zyxc+i\?|75u%I+McYSMo-T77d{*GW2M$<o-M\?Bn>3CnaUzotNI#ymo$Ywuf)~rW;i!TVRXwLfhoti6J!x1s_NZHbf&FuzoW!aSXQ9GT4!=c5xUdPzVq3L*5QDb7K(jdmaU-b#U%*|(~m5CnCPUd=m;Zs0RLlS8RH6bbNhSZFh$6hr7gZ{Sc;NGKopmi5mUAZ>>S%gV(hjJY0N`m)qSaTT$R7{PjIs!P3Oy(5Ua>VP)M|bML_uGO;fL=6yLE)l)@@A^bHJ;%|C()Tt$e%l%6vEFQV8gQdQ&gm7m7EU5!{msGIMSrNtjL%6~Em4ioWdW-1j#>CTvkSUyhJn>uX!s$dyvK63dM&uVWbI3U4!cg;P9+F5;<@i5}KHK8*=-W&p_iZT0Jb<)pvIU_iy0Cj\?M#O8c$4srF12&p97=AM(!8YhLYoCNDWBu8KNhZ_;THhqI2qFYx}93v9lR{$rRy9B9P-4Y(VgQwOPO2Wo;8UP!\?zd6`Kmtg7t2{}Kl^TL7d^uC>_oCR)~iB|*tDBx^UCH@LP$qqg143vo*1oGt4L0BTsT<>x;<bL=3aW%*GbQSJpsG9nMLFBW\?HDzewOCrh>@FE8>wQ9Ox%6iGY1\?NaL*ScDTg@^PBy&enTrcvG=hmg7YG1jKv05rSme=R;`Jpa!yzVAOCys_Tl-ZZ)=`puA!G0J(s8zVv|zfa`4r7!-CI=YOFueChKz07^~<@E8hR7}Duq27u<^~b<OB>reW-D&CN<EUN{q3QMpwNnr+jA\?f%+HiR5<R`1w!vy&IfqTejB#ViO6)lKli&ArW\?b})EX#}oIZwydC$RFj}K-`@*<w5eU($bl0Zz7%`&H>nOQ8gDCRy8JOPhB9Q;LDlj0hv5&>JH;cqG)}|4;=8<PR6;iw%pg$EwsRc-K&8Gd%2FgHJ3f`O#K7k*gbN@oQwG*08b}#lEU>lvrt1tFsZR98HXXJQB-eGqeCT|QcMYr6QjbzkMgi0T|a<N6>xUn`J|sBDp5ba_+A@np\?FD}&lnFyB-}Ca!(bpjvd<~p#_$%alD!=yFA4\?*YT)yEmp{yin`;!NmwkNJJz`WJjBTybPvU3H@goo}aegz|WH1iBQb>wew\?Wp>RR2oN(OITxIdg6(Cki3_tZuJ9ZCs@ISPof&cttWml=_tTg-Px6@_G}8eq>m#w5~WM5(Us5wcG\?}dhGv7Ei<8-BlA$|&42=>5;FOu7l|ksyqn|UwtDzq)mDkL=8vOjSFxb@nmjS0jfN=}CJ(_+CSfh=))jxvQz5B*B$gk5DkYqpz}94^YY@!GkD%\?7*$$MmS`G*Ea>\?`g%K$;own-7;Qs!!);!<)iAPdflHxi{4VMkzPu%)>p0P>TA\?{9iOv3zD<-jD1spEkh{Kud46nw~H^!rsf\?uoxMn-~`D$GIkCG*q(8Cm&);|juP+w!!<Y@Pq@N`4Cv}xhg(eAWUS__d&xyX$_Zhwz2Uoky^kqq9!k;Rqr^R3ocx=4mTd7;bXqEn^{VP*Sg3B)RO*;vLIil=x_cS1mfE#CGANBF(z(0zGXd{%%6t*fch8&9+G19fRB|Ci4dq#T_&|`>xnb`p|H0ZGk!T;R3+XM@QW@-EVffv\?)\?GnKnr2aSJz%YrHc<o!J#_|a0Ynf@8*&MKDiHYk4j_09gJROSJmB4XMDd-Vlo&q9U{(2<%u=oSBK%UekkK0TYgG;e)}pMnkvhti4m|qjH06fqcl|FBu^Y(5h$N=ftKK\?{$06J>S;\?saF}`_UOMTqjg;1;oPYcn*x5x~x8>Kf>=3VcJ+eG_$e!TGdNIxm@nfX98{!thDj{#54TC{V5G8tjHP`1<=X0Z9XGmgtUt|uNd\?*qXTjcFkgQ70axzwfvAu3AfYkzaSO3|_7BZHeC`<$+c1eiXy~69B}p#aMudo^^QN)f15YLdgMm^V_r9@|@|URP1Ak7xqG6lZd|d<X92IChBi=qopunlAMeI6+uU0U|M@Rogy$X4)~%j|Mh&s-pB&LK&*u>!Qm)ry|Q=Ze(cGNw4(tq(lt<3>$czgT`a15Rz76RrLpL(@039TBGAn_=e\?1oe(VwM<Rn3A;>q5Ta@N8AE{C21b4Y!|IN-bL#Yh1()G>D}xwp$ribU8j&+ry}G%))INn8_>-9`u<m<H9rQhsYR#Y(dr$;u%EPun<Z1fV}HY%3yxcl#h0Ryx@w{@SUmB>rcC^!;bceSxuG8r5NOYEK`QDxPqBG$x9P8\?989-1NcuS2CLoahfxHly4LlgE8&9-!~hlp~\?V9!l<~Gtr8jO|3<2Dk>ofb",
"mA$#I0Z<%bQH#e5qfy>*&Nk+\?EuqGd^6F56wns#}&ciJZ9aK4aGj{Stp@1TQHGth#E$OwOh3a!oF\?|8!m9L=zS\?JRQ!@x2J57#FTdi{\?B\?<v#|u2;H{>=3eU0vGD})5f$S2mKWp(IP;)I5C=1>eF!2d-t}#sm\?&-cVb8iTA<n$Rmo1Hr\?yS=W4\?V01(M!PJ`-s$Q4b<8^\?twyE3tg#J6E=9pmDA1<ZMxY_Zobmh<>CmZq_#=jP^4*Jv@jwSJ&_6EHG(Cmut|y<F<<bEOWxIBAnsxX|*\?W>>DHL21Oi1esS\?0GQ+eo6D4MyLdESoIibns2\?ls2nf_erld$O<d#X)c3E7p=C\?-umG^\?pcnk+rO-<-=!mrhf=!=%EC@jxb)yF&3qT$R)EYrxEuMeLf*g7-Bb\?`Yz7#c0`Z5FDz%X_ZCj=W&|eh2xbFr-aW0S#M$q%j|8=20~#^vr8z+Q#~!&H00c87PT@DvRQ1J(X_Z05QlJsFhGe9DBK_kFln&ed=M)ONGsp^IBFM0vOJ8ZiVL~lP)MK+vB9#xJd*eRGoE7{%Zf0ioR<\?1K@{flR^f8v=>PhTiemnTsw\?C@a#Y6g_JRC@zGCO)331JiE\?9^UCXVPyPgjwJ{{drKktp%&)R6!csGJL8e%$ybXDWsnU~2c~3kpD<5fB@r@NED(k)|M$F\?G-)dPZ|*Dq1bwgs3(9#Amw7E0=8L9GZ%Oq$dDx<nw6OL&P-ewdrKiX>yQJt@kr1prBTN!rFTpiO`c-l(;@e-)}>vA~(Mo25A9GC1ttM=;jW!QY@%2)oalP_#h%7(E8$-4m)4ztueVG=O!&HaL3X!VJ*qs$MGXg2f7Mgz}X~k!vkR`sYBpyi1d$=|Hb>~mG%WW1$c6;OqBgGoey(yK5\?h)yj$I6>NYrOAMmQi_Q(}P^lGHN5)cwXY(fSYC#l9sUwq&Ng0qWN7N4)uj18N&j0Mwu={T%#(=@nu%2<SRdH-jD0e2wpZ8jVkLdbW04$W<I&8`LehqL=zWUa(*^wK5X>iVFrWaLUd*1J$xE_4\?Bc`*AXCLGz@Hozn(qA@iJF$}Zv4mU=$\?4LH<A4WOc0m-O6yN)s-p8ZfsT-Q$GsCeakbK&oBtB_l5D5gwVJiL^`GGi%;\?k8>L2Mk^zi2S469d|~6_>ajHRg<=f1h0}M=~h_6s~;{CM%}vori<~Mhl&kfRIq|\?0+Ff<rjF\?<KZLXgM+ik|;2WISWy~*0s3BU9@D=u2TabjPEIUzdI5WWn;c#(*FatO#pge_#iD7_!H#kg1fy*@%99E\?&MW;u9zXLX8LbJE%x1PVA3=wGQjbWWa@JIIsLF&AL*3@+mJhqGVvX-7W+G)Ph\?ykHM1snWGU5=1bE6(x<+R@##vO+rckndPm%k~+21n1hD6U>Nj!(&t2iA3q5mS#WopES3DO=Tz%__}XYLLJ|<rMiYA<g!m0RoYrKbqI=VJnRAGIrefvoeMr>!SVV2t;cBr`1K$Syqnw4nM~QKyM)ag*1\?*\?k!P5Iw(GRg%t|0>)=PPs<STu2YFiB(A$TG-(c}opAvh_K6=;D3p&I#rYxceIDVoNzf_k_DcE;VL)@}o_I!%>eF3j+2+2~I6Bv|S`^->Q3gbU5D_*_<mGh+2ABsX2Ci07Kz4nY=d=qbLQdO&Vm1+7s$i=9uy3~U|hca#;\?l!V!SC#fxZck4^ItAZ61K{JupLheHpDZ)Ex8(<8fNXzR^JtdJ8_N8j}#Ek1NPpT9lt_Rgw+V<2bys1Gf(*+NV2QJcs_UgPT0`tMnMjp$*F+Ld@gzF~rE-*8L*-GvlL\?Jc<=i*0odx2a`bs8-gGu\?EkIxPX3_^^_\?0NVmj6f0b%+!M!UfBu@8S`BBCc_A|30QVF8+4r9bf#>CpRqQL#imCy6xEKEjm!Q{2R~Z`pr&=iVuY=($\?}MvzLxjPZevj{i#a2dV*ge>Bi+}}`9_lEltZi^Xx2b`f*~8jXRJ>gAYk1lHHQ5Y*`T_IHdJI(UA`LB3kr(L8V5!;LZ#N**!&M<u{bEbz5KlO4$g#>j{wtpe{Zer~p9^ELxQ}4bGW(Cg_H|dAJ8E\?;ttFs>)}UPCxSUAUx_*qSU41t`nok=R_4YNfi1m7@m`EUNddMGPV3yg}Gkyr$Lt~1vB>^b$iOyr~E)iOsoFcc7fJ-xbgVM-i$u4nv+q5)*Loj*HDEzZ=)v<N50>#OThD\?>td>2Ei-MlMOv>|`xrJTjd*`j@^iOfR=EP1qhk82(cij4Pd4yj#)qY98>nIKtP(rG12jO7wC{$yDz*Tl|p1d+&rG&hW!)@4(Y$-WojBmryzWqxr85sUPBK>czXw-xT>m@Xr\?JI-wL*N{8R$HxaDl8jZsjp%~u+ss^1gJV%$X8G1_rzy5wTFw+EN)3Tg2-igWnZ3KRNnv%8SAQrFznx`Lw16-(Cf\?!LVoS`TZzkWyjdPD3\?&708I8Rd*=G87+gM3zhRWa1AHN@Wz+&Cm=lv70M@Dg)r4peoT&4V1zcUxCqFcf-I0wn{hX_UL44jr(%dpZUj\?HPn&ekg={&={)eW9-Wc`0M5PA_QMYYYW7SWP3er67j-XA(`;!027@gGSe2nNg}>DQ#7MScb!94E@\?wcCt#`*61e>`MnopKV4i+hk6}CAE$ttmkBE4!lEYsr>qE>7^&UWWs8gU7a;--dl\?*8\?rK72-LOCME^0qo(ku3a7k}I!\?&%7w<(Y(H\?`2CY9Q9o=@YM{a8^c=*;d^bOzZC#!JMwyo<H=9*u&!Q%87}JLx%$;d*f0T^k|Iq4^L-q3r<=;zOV`#jd\?{3}oo41ipHaSeT\?F|#Z29e`hfcn@^sRnUIsHEd{;z~|^<sO8eYgx_X)%a8^yVEqMtP\?EYZextgm;o>56KldRyz8{l0E~0Y<KvkF35obpQE\?lGQRZe-oJlT3tpv>+pB$NOAlj8=jXiB11yLwlHVlcp+Kb7sQP%GQw4=u*QPaJ1DPhIIT`N0bFhxRw>>)B*pE0yl4Je9PhW*vIxZ~wwaVuv17{jlEn0hG<*;h^g{K&r!B3r<^Ok%qVWOlNjNPMJ8AMCB^_HFmffsc6{7#=W>`wYe|*9>2_v@Dt1nN=L\?$psv#eBv@G04hrUEj#pJfkgJr+sRZKIsXVvvNob{U_dfyy#@tE=ZPHHO3Y)@P_sCq($q#8N~KXcQKx#DlF4lw(Plq9_7&DBW9|F1ygjZ7YnWAkFsLVWD^4BYoKVpszFPT%euYme_VFFS-rtP\?Yo+x7vD39K6Xp0\?{Z4gn>qeiN9V+q%2@m1r_IXf@!wdmC`N4+d3Cx2(ZhE\?h8o+TU+_2rE>CHLEZ<W7r+dr(L5v;C&ubwXD)s3jJ3{VQD#sZsFr0M|a\?\?ET+1bbRw1Ub;!t}E;4&&j4D=Ql|J0Ek17Ac|kd%-!j7f4e-p<)W8ko60gN@M`(u_o`jW`4#_k>Kp^Y=%|KxXocf(2Xr)z<mkxQCMdbJ0pw`ZkChA~hfdOKxZX3uQ_!USkQ&M*mbPL\?H3!@v<|;3pWI+m9L^)#5%nQ4@0tewD1x~}NrCU0pb79`|T<nm3IozOnkO)Uvao0jTmVg\?)xufW+UzefQ(HuKJY67|)2DCIMq^z<!$drH-AUUK=HONS<{xAL-^RKQubj4|i4mDR&=dDWLqusDHDb_vMh6T@0`X>a!^WF}UoGYvUjOxL$J&IH(Z-Nvyg23P!eOh*0++_\?b3miyfJ@<v+`;F+#%-h`2RMyei-tT7r^29;\?>BBYnSB;\?xS9!YYo^&IK=G`3%^_Xo|`;0$_\?C&VLRoF~f#1mKDI|A\?;L+0y2_|Wcybv9)>H4ia<`MS@<RB=f!1qO*7CSq`Z)Cu)m)Cn1e=wXhNfqAK7IgW*pO8WAvIn=^>#H=1jwUca8%RVySS9~%%Xl*iUl%FKapJCisW6P8^ECbrHX0VJ1#td)^Ijt1Rvy_>icT9^k-1dqt-w>E=ZtJ<*juCS{##ZJki<9mcN&dL6UgtDMz_qab`+N1LZe-_*p06g5Z^cd=9!e--8vHW#gXDouzZKs^dQ&PH{5^;nnoMjBuc|R|Y}WJR*-E<8J<3<p{Y4^mgyk;YZS>vQ5u)tA3zP&t+JZhJ#n9MwJ!=&d_MAQ;s;gk1C8XS`3De`ONlM~y$9Q=l*W9KV3OgK)Fg`{+",
"gehbCc(q6sSt-~$x0p8AHVv`$By<imF|!-JsS*0-sS1aJA+`fY{LQtbABR_oGt<syo_kF$U#;RK=&v_c_@NF4s^%Lh$p5eK>L9W*xLzuVjYnfQ3m)PhT3v|NU(_)hous#^rtFvT<>2QXcvXyY%!9+7N&)ONKLi6MMtjB{9zo9&pqi|opXF*W1;!ZkI#qw&-6m-<cjQEl00)U\?77+tC%oqSj&_kT@&0FZd(ZuV~WgEmqMu~yHZ{O$;&xAU0Biu`WinCKD6#U-qnk9!\?JDu3B&m})B;AIC1gr3hT_9r)NF#&94jQ0IgKG(V3m~;5Pd2p+4iAr#aAau=_eEYps0>dT89EJ=7_Uq\?hE(Txv9|9oQm}^;6QIgE^CbZAVf}+-Ghw)PkUwDtpweuySIs2h0koguH`FEbo_`q<R%7BZ*3B3!!7bE-uo=Q+fBV2JJN4$ZU)fD|5jeEQ$0vgkHWd\?H&Jga=!9Y@IVu*2+GrrpuwS\?t{&8l\?wplP%Ubumxy(T{\?R%nkkYeD``A2bT<+W#uT>Vlo*_T36+boG*Rn-0ly\?Oe!3~fOsM-MyP=s}T9Pc|c0k<wkTL#1hUNKgVMquQcEiT84+>ZWmQ=;N!4u4l<M|W;+y_3gT9BC1tQq0|3TLPcrF13cQ9tJT@b=kX6Zslob@QO1{-OirJd!d|URw=v;nDw9%J5aN<sCPdR5{wb#j}7@kxiZJ3@4FO5N-\?ofzApzzYA$<suT%hQO$O`c9JE<>`*yb$URJg\?RKMd)RITf)K57f5V5&T>k0z2@7lPXOy%k;7_|O}EX0R=nSuTdzpXFnQIK3F#A~1NA&QMz9GTt\?-qV52Lj$MRw#AZL6>ifo<x&\?HHw5)QBTHY+S7Vu-;Sv{)\?oY(A8Wg^Ki)(s<RJPJ07iJ>rF9%+3taqrs*`MA3o^\?LrG)UBC%rN<8uZDn@#ofY@kto+}Qp;n*aLdVt8}T48x`LV2PDuUVQE#11C{PQYu}MgV_Rhsk3MHeHeF5@XF;L^7DPF12`6yk;WgKb5$2WK;$l(nFH!nxeEag~C%|4cPv6ll~SrKX~OGtK*ARbr(HuYU_%M+VIQ%v%!4{9=nibyC;\?U_AfmG7btw06}><)8CCbul@>\?!JH3LI=dP<Rc%^!YIn&C!x#8n&4oR1TGvetuVj7uZBFt(`qsrH0R&hIZLtBuuKpd=`DzhZ8<sGHwi>JrQr{jgZuIky`^!3VSIZDU@0*bkggIbZ-)Hrl@SdLnnkF&VyZ{~I*+bc$Ul1}Y8LfR=)m@5wwODm)0uUeVWuX{ei^~avOW}e3KVQdFsyGjMZy={Z8<!3(cH9oM*xpdh((;EAlMz>>HuRYd_v9BWhPfE|DSD;)|9B{o!at7{JpKHHM-&<X6aV!b=2+>=y6NP{>8N1exrkA3s$Yj;}-fz@B_fvLZZA|9DHj;gO5jSX%ZO#ldPs@Wg@mO6=E&VIB!H0R`43s\?+#0o9^U%cmp36)XX-kvo(d7ln@6%3e\?H*tR5X|cDbiO02M\?mghtMRw=OXhl()xpl3Q$YGX_fC_$^;{PfVJJjq|Hl37z89%ZJ{$wLi_3=9bLuCFx6g@O=wUE>SgYzRGEwg9(5J&H<g7sn5~gi#+0wOea-O*aL8asgU^U$73%`+1*H$!1yu@IB%F`BuRS-j!*HWXa\?t$W2Oq3{coX5Vy#jSE9^2!U0@6arl%sDfVV`G)T=k*B%}BX0)haotpV3@Fg+t`|&M4&\?H`zyJW7BJvXGCs^E}d`6qGGd!M>|)kMd1aC1~+V;GVCf4sqw1eoC(O^2r77DMrTkeKgQhsw*dCzu>e>lLWdUt-l62aq&qY^QF#cm$zzY|yQnSpi=Z=5W}Vev;14^~0g*m@I5ZehLGOjG<~1{DviaM`dvU3Cd0bXkCKghK2cnK8NJ-SjS%@*-)o207L93)g!otlp(w|{f#;kaPwm!(qjKo!)$I^0{*UfFy_hCi6@L4)T{Ew}w6|X8\?&pD>2jS#XkFSg4Dg@G*<>1PLI#sKzZ+XM9aEr)DYqwd0c1ZdDJO)|3ovGshTUVKq1Za<#kX<;0eB%@B@^C#Q3J&TOCpLgLeEBF5A7Jt4\?7F_txkDXY_HSMSia~MZr>S}${L$vQ=ge}NVC}lGwKvJ\?6s@C{ahAmM@|5<i{-o{\?{=;;^E^~9Og<LSJaucz\?177!%nt-aBo_{uV$i%G0iB90r~X`F_GlJQ~LM|ZdG05`D6{hcA83_`bM0OycaWL^m~*&oTfwHUaqc}4DMrFgQ4@p_a#o*u~j-M=3gs>|AB3^2!JrmSEJAe\?PrO;Z%-m-yHSH9C\?3h8SK|F07N#NMto<I|E$4w!}TMXS5ZTh(hbDS~8z<M%K9M4Xct0b`-T8quVoFPiDUCBP6ZR0b1N\?>t$dMuv}g&0sH%6o6WS}OLPPv<y9uSv<Kq^bN@Mzc>;C%eL*_JthjvHl6QhN#=J|1_wR$Kz~Z>>y|ijKoqkaLg<EuI_wvJbFC$0kYX9BoCgIt$&8(6x4Q2JP%YC6W{GAx{#gFuw{@IM)MJ*Ye5NB+P2}T==eqYzq0*)x=6!X}vvC{^#iZ);LQ1gg;Qxv@|J^(|}kUzb=Yw@$)$0Hz;FR-rxPL0OkK=@)$0x__53eP(-I_|-|kK0TwKb8FN_`e>-uSLIrYAEfl<|XQiX)3Kn^GG4)k2h)C&v;C>bKX;m)saW06Lql58jPHqk\?Qybk8K>)Qil7RDL3BKB=$hK3oODQ7=bcI0dk_EVA6FsI-&WHaq%6Af*ucl!1Q;mirJ<&hUDEP)E7k{=~1X}tDYjL5^}bSfx|*fwHt`1$CXFbx%%r<K=9)PRf)NuZR+l2f#H9@#P=~%Gw}uydP0)U_|IZ31lN)*;_Yc#(*!ijKbaGc-2II*W3~6=sOv<h&*E1*cJTb=7DcALQNcH<|IY0p$|o&\?3NwQIgQUR4v-;K`4>guB^SA-kY6=3e8j(x8c%B1J3AX!hSG>SGIjmfL0jHTwN~LHuknn&L=1V}E!!d3\?CaNgATf3$ucjY{\?5u`zU883C^IvddE!i%pMvYV-`kq1!#TgPYC<~{0<*aLXB>W>p^QAp3C#Ic+$(JY@QN;L&IsThfV<<EXj716j6q5D<Iad(Z)$v8m{l>yJz+fLp#D#lPFdh~W@4U}Gk>\?s6e_+T|={zX1&j!JJb_pH7JZ\?gad={i}ivk%K3DBx-WNc;0&5\?dF@6jk_ka#h)}<K}<&mDktiHEGlt$RCUv\?c}^a@>ZzcCieVIAmZ7q0A73(b+x#8^E{9y*U#sK)iZ_*v(M\?YltGW<s*~\?9Wo0f9=p8DA4D\?PnLq(mw*nhJ|7B6Djx@bmV6wT>d>m(-Iqz_)gt-_>Pptxs9wD$9>p)Up%aaCCh5)^F7JMdnwx{=`q*;1MvhFXurc(\?Idj8\?auj2xM^(e@^x{bX+fT}{aB8v{vrUQ{l<BWW}pBBycumFbtbr*C8lBY)}XrfS*6h}TI\?)G**eKeyq}JL\?x)SkRpHO8ndWg>u56(NpgFEXHpBufSf#Rn4eUMwS^zxWJ9|o{h*RDF8@ydF)pUoU!Dp^2B$Z2x+!C<X1*#PC{>9nNR~`u%cl-Uq(KzQ&A&wY~BzyOB5XA%4S~9_ENM-YKU_;$QGSgf;0YZ<`bE1>Qh*94KB*_khk`#I=%NW0#KC+>y(h!*adACbpEtHO5mpY`S=}1aKoM~4|T~{bDg+Z-f4}XH8M&{`FRSX{9qF=Z6}~Ax;O+5MEAKHZ{qZ8oFHPYpMD~VjW`0v7Zqze3Pehu4EWhZoS\?@RreN7-jm3K5FT~>+AtyUDYtSQujHhH&\?!pR<HzIBEZeP~kS%*YRk8mbmZfa$8EZ;gKH<t&QfKndL7(#UVz#F8SJIk@(8UqgZI^B$ftvvh1;hFx>8<o{1VG95M#$K\?q+574_1zed{xRL6m@\?&c3U\?+%i#pmSiOvTLRYSm+2F*f1(;m)kX-95Dyd8{eul9f)2Vt@$j!Si1|-mRTv$pdeOchRn*XDTFS;_b4J4I9PLHJua\?4yN~1F\?1^vbcxl0b7Tle0d5_NZc2OXlixzA7sB}dv+Bj2JyO7sE>yetB;Q#sE5JMs>F`jammS|gQXP210MRjrF!=$lN`rP58nkKw)RB^s@SK9|1\?7kUtWC0g&^-ty!\?|kC",
"_QlnK{W|i%TBb_acwnzWOAk4KeTF1!5a\?eGi(iQT(}J*Hz}N<z=&a%ilSMU&Z;uc0Rn>kPx=!*jRuVNGR;IL0rwn6l)->g{h|6K~wpi27P#ib;*Z{%#_&Uax&1>;^(38JtZwL%hS+^}sEPD;ip&W#|HJam*F6~0}MBngkQn0t\?A\?f`Xtd#1(VW\?$+u)UxgkJgWRsLz*YeiD8sI\?Mn`aT~hQa&6Wk6NXM}G|^(u=4t`U-C@SBHjeb7PE2WZPSPB#V-^D~I%q&1%Bm>T-LVOc{g2~QGlHe!\?UuKQ%YZ!ST27I\?XaPpEz)ham<pBt3$-QOGMm%1%TiC7#0UT\?PI0QX>Knwz#=QPTm{OV\?v@Tlv53f^3d6u$96\?8jQeFLexvr|*KYEGXxI8LKwjl=~AY#dle0nm1g~(FL-#>2LDSGH8Kx2YaGQy7VX64+VppJuM+^RJt0aO!epB5NsCcJ+OEu<Tu-{fW$gG244aR!g!-IVM(rIzE+Wr9sp9yZ_FD|S@+;W>SpdD*sILz8DF#e2@<sw8Qe^X7D%}\?MD^@T-mM7VONEL4&CSmB+1yg&T|9NYK`k)*eoszGNw+2fuh@(AQaTggCkEBjjrJ(SWL~GUxmHp&IQl<0;a*BPW=4~i-aY3&8Bzjw6DkT|0)5GACSb#fWnxqIE1dvO=18zSrp_|HStB*Y*mt^2w5}ma_<>mDAgmeR-<~_wPq^#yvYdMyjnTW{Ux}LnH2EoDgQZ}GnQ4)FiqEOhzU2<M(c*K~8S5@AF}nf*nd=V3lRR^Lu9O@RlUKKi@~D-7ttH1un$B=wiqn>9<PBV-uaNvVlKM;}IN~ekzV><BoviSO4*BzBL`QYrsUxhL7c&5OgqfzQ^{uNZddC2suv8HCxWADBH{`tqDVqA3iJK`4En|=8q>m1i28jg%SW#H0uh}(qCkz1erdvZOqGuverjW#vPdbeLwoQF}pu{3`ZF!3&=rPQzo=KGSC+nXifCN+|Rmavne}|6HBj8{Yo2rPVa*YmW1L%VyN\?guiY6}&uD~0!neFb<%T=#Myc}JD8<kNGG2GuS^OEfCoNaWQ+0p@w3o3To!_2fw#-S=tiAIo7!OyV+5KyZdAhj9}f=1L%<<tDF7{\?Puyt4>yGU>;L9N8{UJ%{{(KC>OaS\?S(v=dvf)^2-ZLGQrL*q(hW#*qkH>le#w\?FmePFWqJj-2$@*PEUm3qbW>FWE\?By4N1IIQVN(o&C9NyePlMtGnie7gG1_{rALn}ta%5zxfUPD_om7QpCeT+F;3}iUJxYzYP&@Eqtb1OGTTOdCWU3s!\?A5WSXVKR1LdZ=S}3npyMv3EMSEj-WE!8C~dguYoNKO\?Q-M8P%$=v-oUX`8B<{sin4Oj(|3Lb_4BFtJ*h0X(C4r2yA@iKFBVp*+q}KzNbuw|9O^Mt-HJ*v~Ky5!F}jA0QmX2O%<;VjQ;Hr}@8T*c!qzmRG$LViKwMmdSTMpm<`7y)l+m2`m0Gi$L2J%h#wLe7z!~MGgpFP}bH2>J\?*h<gX6<8K4;U_78\?oM!g{<^z+z4YftZ|)-ik)N#80YefYRWJof|1@)9rq<>u0rZz{O&;_|`K+c+JesqkcXeTAB%E_gyMT}U-8FtXHI$%+MndM{ChbpT_$@1uy;kJij|n=E@Q\?Tu}h-VK21l;u*$Kev\?f(-)+>ln6*itY*|lEBX1+JUj8Q;s9Bjj^rJU`)wlDkrt<{dz2%S2jXREF9d4+d2v9JXZCiwuKrp=qx*(|ZyRR6yxmN9vbUffH@$zZhX>fAOenJv!$V^*A1|&l=3*~@xM-(QgAQOt)PL|~dbh!eBhGP;ukJu;a#oTHcTWckK(peesN3PdGNbP#04Hw}!2%ZlC<3e}StzYB;>@adp9Se5Er5IksRQ=v`0+3jS$o((e#K\?3H+N_iNamYTott*i5EVXWwPu{e@}hWD;p3a_J)((ur-\?~^)ju5Hgpce5fI@&%d*p<6hzp5eK=B4#PfTo<N3a&#oHQyJ^`@G;Qt+7248-4=l!sbrC!ChPBvAn#tVhG5Agl|y1K#g(!a+v95v{Xr0\?V}1e~wbta+Xsjo@PVBC+JJpJeOIgM>CZReRF70$iAKS0}poY11j}{qQRVPw7MtYlx1s;G\?RZ=h0i{|fNF(*l=07^X!jV{F-#*YR%VtkFnfvP>>0wxfE<#bk85urhP#Fitl&L*&a$|C+4f59#FN`s>OcwJG2iZ9RFY8)V_UJ%TSz1vzCW2>\?8GPath1cpcM8xTfyNi*{3>\?%DmA-MR__IgURBcrR>5dYH(ISFB(RFBW\?Lwyc56eLJ&kqjZec\?~k3!(9Asy1zu%|mUvGRsDFBPe\?ehP#MYae{Q=GIVF<7qpBo>j}*8NO|!>y)uo*=%Ke<-GZa0Ec63Gk&81NklYy+aUz3\?%bbk-(2S^X*<L!FQBgEoM%W(10X&YQtg~zrULtslniQQ&<;aCj#V;SK@v~nF=Fx!Pu<t~^m9oDOEJsV!_KN)SI7YRe02S>_02<8pcvJ*0x`7i!b~(G#v);jPxfT;=-_81Ma6d{L6mG8!Q2OPbqmv(8)%}}W`o3Fi%}*#%Cu)2=&yc84F5f+^uT0qEihE}i#R>_k&SqP3@M}9;Za3LaXy8N$Q`R2>d_-wf(vyFD2jbo9l{s+jNWBwlk%xfnrP$J\?7T&K=dAk5cM_HNQZ`cN_)mH5Jvb--WGWwBWRFC_%Jt{*SVt}7Aa2P_Og#FSN72Bae{8^TO7lT2T^*lecVVg>%$yy2QysN4*2PbF!3qx0!YC10!8T#(s23tW$rS9F|0HQ${ra(;SgF(h#3uzyJ6KSI9vMIHs2JMh4<g;W<0e7m\?c|rh)*0hj$jHL)#S~%zqd>Pa2hqKieUIh+fa9ZEZvij_;Q`O5mttt6JX6p-5&D)N6wFask~(%c)ilECo;7h`$~aeUA5(\?+W{j05jfS<t)zi95SwLb600p7<4II^lU5h>VA_p>nwv8n08e!Mkv|Q7n7MIOE7=l+m5=WXfAlFz!FkKqt+5TmfM1{FgAZ=OZg6l@za56DY&-;u)(nT80-dJwc3M%_sf^@-FfBIiz33vQCoI>\?D9K2j#sUsD__\?fLlveR1TWEcUjFci-E7G@l1H`<`|NZ=P-RN=Y+#XK8@;jlM+wR|MXxPjD<lZMTWV|7SSFGeChzM)56XrJ*iJzPk5FL5%~{\?R>*p_Cd{uW3_PgJb%=XkD!L*gHV@g+7VG!N^}ExXqt|4NrXrt2!#c8\?^0CKt3nCjvTyZ{NfP$bZ-ZL(X9Ly);0fOmzr\?@Q`N%+V3Pslqw{JXDP^rcjOb(6LBoJml~K#&L|kU37YF+b6*b6_Qc6i&8t-G@VJ#ej!=E8(|MXv<A2&!GA~Mfq!-U4-2Ic*2-fwnL(g*RT;`0qvkFw9wIRTq^Tq~(%A<6o)w+{VqLOD()n)pCMXAYs*Ik^B@@~v(#)9Ry+f~`r78$+;flM*38IC)F!x0VOc!E&pZ+p6fykNdZA!|oF;o{BqP_0L25oJawD+61Y6wqoy}<bLOh\?\?(!{+k@%tSEr-=^gBshf\?_-=2\?yLhYyzzH+%U%Z9a%=zYSg@8I7#1%U|X^W+wO>05G@=ahtn+^c@aJ3q$<6ALbKDYX@i-@kg`ru*Z(|Ehy2HMIy-G}&fUE=qD3Y6aYONF1_Mz8-)awh&yN2U<-h$X7jc{A%wMBNqTBZEvk#-9KAAKzmy5@`qM%!m^3NK0Lac)cWrxcR5a\?bLM*v+;Q51yasg$+Jc+(rOQzpys+FA0@G<Vx@fR{fTos6dX*BvBHDamGClf<oq`*nd0{y\?kE5wb08aYvP|lt63c|Iq8p6G<F6QJCXNrNIKxIFnZFXbBN3<w!WWIZ;YlWzo&(;EU)d\?uMeJDAfv3cHsuSM+zAQ_vX&JypVW`4Qp-cc2D\?yP+;LJ&@~p$&j<yQVYjxlJ4QFPE\?*FBC_!y=4ehc_8-7=Ef>&CE@JG{}-T-0a-5|tO$b0hvq5O6@%EBQH;mM6A)uf;+jfAW5=kWR<&\?$$XAo;U({JHh%XkKv6FR8Ltn@YmEXI+&KC9JXrG1#6V)oslH\?v=(}9VYXzzmoA)A(nRRXtjJmLo<#D^;Y!D9K\?3>tENL+hk$ck7f6Fyb^b!l;1Cfjbd\?AGRG8Czs&lD\?uAj;n",
"@ChwfiWA%6akxZUYvl2=CQeD~FUUDYAoA9_m1@7^C=@q(ClB>$>S2b`&|I&tuyat4IE|{ZOg2bTD6U+522{)&5w08sm0ForZW$u9Mzf&o(+2e%nPNHp%zkX%o&2YqURiATw;~uq<Y6UQV%ocA6l4Yprq|1lpYjp*cA%4tIv^;i930y~X&im!8j<PU<GP7bPN&T^s&%`(+r|vxc*2Ji<=6gce^lV6`|fcGaK1xYKgYs~9KV9~bAw8Pn2RaMx0*OLVWqSXbyY6p|IPU7t@r+Dx<SSx34GXte0^&FvlL=x21DrPz|lRIX*8#`)huV5Rs=mDCvo-pB7ajM0_w6{_3`g>YTYy%%;7I;#$C8-bM!8)^6J$V<7&frrg=&;p1@a)f^j=qk&xO|3GrtLZ-99u<3mVFkB(F178^9LJ%n(4mu*~d8ut^V+tI@)!j<tRCcAL\?cIz$lQuc@qEJ3VSlfMY&Syz^ce(Y~_s~nR8JUSqNb1_N$NS5KO4nOm3xDWc>\?!}RN-@HX}KZ_Kw|G|Vaz0}&)B4|8C;\?wfpq{DQL>$F$GQY(-7AF=-4@*$w\?wAt+}lGzX)DlraPilQk*&i0y-lTF\?XOu!9Hjj7Qh#-FC}yeXjY%lvsHw1K7ZR}H$!7`<myWYBx2q99bgv7`3YY+PZLeXM)IMy5ev&y7_2B*C}yC_o*$PUntOL)|IQLEB7RgS0|b8>`&Iz)N6o!>M<+H_F+*h{I=3RxlO^y;pQ|WzP9<\?<fxNR1CUx9=k)9Qx*IAGQOPZ5^*G-(CtRjQHikJUg|2}XYZC)Pr6O\?Xl4&*I!FRW_H{60BI^zi7Vu_FnUy<=npfaB;-+t&pHwyucWHnGNDhL_!~0P`@jr#`+JbJlij2_ck`ZY%|Mte_=$kyzfzGQX%*Z2(1jCvyR4-t)qH}myAlWK_mjQS(L)Y(+5h}<<98<t2w#iJNe1UhBJJMOA4bnxEFOQOaV``aUTSkTalso(w=HA7sO>dKNT0|RaD9{kH$AHtr7dO;<sI)C+L2^9bF<#>u*4b&&-clg=^^1snz8H_m)fWW3>4HV^LTJk$^&;7$(H46whkL>yrp&59N*=@J7x5nJ64fw8opI|XHzLiEEBOE5cE+iaHR>#r27T<\?m2QvZ8QjJ-_lSYuW5^Mm(ZEr6ZCm0Z1CcRwbqM6QyvYX6EnZuL##Koh-7sPtH_B$!n$x!12P%kdwP1G;dD3>JQjJr(HDX|_L>U7FYl`Zs>Fb{$=*p8-t{(2Q0{Kgxzcfbl-9En7>=&E0+JCb*EE5D_=Ke`6nd`BbqS>!blrSq`4>zEoFRl10r6iH+cjSzTx7{-C-)2UqrA<cu-wU+XS3r^yZt)5Tjtp+#yIi@t-_c13EI)%n7VZXpDcpJFhB=B\?fHw%o;pG_5h%c%&1<Q2dThl6F(y(e4i\?*QtXw%7F+Mm6Co>GjDZ9eruM*^-ySzWNT\?36hPKNu%Ru82kg=Ne6~{^L>I^S{v$J9j}rPd|Zf\?+MndEVd3gd!BkvwYB7-;}us2b{bf%jPpUnhm34@Ns4y=BOMS2o>yg%Gb7M>dr>R~1J2icq)N&Xq4tJ2KZxT;n07A|GQ!n<vPpsUbx}jE<eD<a<4!L6w0pA@xXl(-jD1HUf`k(=Z!)_s9qiu\?90%k^m4`#5qjQEE-qKtJpZ0xE_F*{VX^iYQ@qFV>n7SY)H*zE}rddjfMlhcDoHo4tmCd\?l{D\?QJd(Rw;v\?F^53zv;ceV~g1CD7ZODpsGCP`4J2o8)NTO{7VUl@yinjEF#k(OhL_PS*fL!iLV8%SfTUmPyeGnfO+}S13sDlx24iw>L\?tLQkE`=C9hB;i4}j|0jIm%)|aFT;`VAh~~1m`~Q#iHfUF4s5cMl(OdIB$QNcah3rP%-%-~kG75I)BNVvS$k6bMar~&}_Rc8==dEbqtl`2NVfXGf6i<Iz)VC2@v6\?GH8Qqus)|zv_hv#5$I!l;O3!(9tK>e7-b<moN\?9jYb-V2RE5Vl-qiy>=jP$}NrWb=+HOY<+4BLr7r\?(\?E-lP3{_6gWvg32bQDuTw-Q^6%=|k5P\?yLBSaD\?u6Wy3scqS$=;CZa_NN2GpLuzRDrIsX+GWa0CCDZ6CUrq^Wo&Ax|*r(k+}xq!OUAml#x2wi)2}ljAHGMs0B(giA@b=HYp+y^eGuGb*RiG-jw#bdsGx36m-UgbDQlm$xxQMvnE;!I8}\?CzomIWmjJpvzTPGXQR-(z7wA7gC$iK+uOBf>gSE#jVe0q1s@i-n#=su9)9SiYoD#0xlddMRaD1A$cCIhdpu&*CrdwjB0>6>}P5GXDhKuGntz$a|r!c4{n0~YSE`~PsshNkAcW@+Vw<1R!iutxB<_32uOZR(v&61\?_{C`62B$>x}9f+>qnT_JlWG$C~fS4^z6^l+x0_3UT=PMa}h+-l=uHGf4Nk\?3+e}>(qVa\?W0T4b7xuf&|a``M6T6T#HYqK#*}9`JwkQ{r(OZO%Rb#9L*viQw8#$=nXa\?4}{ef-n^x4lLJ;iu(mbY66tEk96m2D0ZFPF>~ou>83H0wPd*sC+a1`0*u!^ZrKbG)Yj!0RKNKwTXZPVbkm~q6RI`LE2c\?QC#=8cE*n&~Dx7Yv;JuW!cahJ~=J+bLNNeG)$wzU>gh*Pzfr_ig^z`e5_r)(Yjz-v}My&+(;Md6ZFNjsWX|5&#7bexott^X)40%lHFP2z`{+0m(WmIC3&Z*k`!wuU$u3{Bz(C^=G5#*P#UHqNuo$Hhu!jo^i$IOrKjM4dI@h_r0nwTadHd7!Bn`O#|H>W{$bGH4ynU!ksl0pAs\?A-INQ&stUNF-QZSb~k*EOCTH3I~beZ\?qHv-^u3SHFwhcIg5BdWMPnJij}<sV(VcZth6jtcJcu1uN4Y+W!~P3qu65|5ZAOvIhL=_JU4gUDfw4F8-`q7$+WpCf%ym8N\?2}W*l$`2q`JT9uD6P2fu{{9bjU>Bz7*\?dj+YjDPZ770<a)XVlp@Mt`{LwI(T}OTOgcE9Ti4p-3DbPlhUcf>$j\?MV`BDF*Q$`GV7pgqA0kNbmxvC*KltWn6{!`ln@uP#GJ1zFl`noUt&~#i;M&N*ju=cJPYuXbUWFap<$5}MjbH6MLDL%c`UZFz9h@Nv<Hn)Sq;D}4*Lo(FUtVXq!sF*)#YYPbDja^&|Rgr1y2S^c*99ycy>m0qSp\?Vd&QAkyxjQqdZzTLo;_4{=fp}76S>a4d{|Bhe=&F0aEQ*9cN06nXdEgMi8V}#0~q}1i3y&~e$+wi`M<8*&`vTN~#{JF$g0R6eifMz{Q1<>OmnZHY#<aFWm@MLlxr>!A9t\?3XU-34c*oEx%tQJiZ+y|i&1XKQG@`tN+h6\?L4h\?G!M)2kpZSqRq^scI{n+3q;QnV#zkr)vfus5kT0f;MzY=T\?EnfX6|Y4<GXnTJPXWCQu2sy{&1`Tg0eZA{0ksgdQ{@r6@$zVe4e`xy5AwWn(XHxN8A>mv3NrxK}G(y-SD&zCi@!t=nn~+Q%}V=6uuO=KApJLSh@U@5<>fGqp#B~ljtqNT20#=Qf*#}D`*gj4f~|Q!fT)wI0+2MVEG4RZgtiW_i1Gtr8{*X80Fu9M*DH_Bik!UlnZ-QNj>2(G1!PND2wkheeUR^9BJ)#;bXU&F6m$b8U^c~9L5P4oKPaB$W%\?smmIPB@;GQ4F4C3}XMcic&MT!Fd9^9}p{(f$VN67xwg0|Fq0v9Ht|s_Jtx5lXMNje!=3g>yiCxYHzRs-^\?X!w_MY7tXK*Tr&=W=9|8qj^8Z!u;hi*Y0ktlhT(Dd`Zwf{9A1XP_vpsTN&`NvhPsr=;zi*6SV-Kvi95eQ~)m5icK(cEQMR4SaZ-zZbgI\?jLI`{+GUe1rfO$kDGE\?->rzQey8$ENp}@|^mhU{i%9Y5GuTo)A&u*&51fi^p#TXt${8xcTN_3ibpDOd)lqEpGygrI^Pf=qaNx=Hw\?n#o$#|3dv<|3kc}@e6!DEH{GW5pmjRaw_2=WuenD+elZPD&dQl7$X{rJyiF`U||EHVX)Xo(+vDz^Y;Ul{;O5PL>b(cIgIfWO!Y_U;GQmxJC;EZ<PXD@^UyGejfvZ7HMIOwIwVyh3rN&^l@pxe6kY&0#APdoRF*&4#@k)\?xB-BMHeL2JvH;-C88u#VQut6~b{RgQVxi2bjqC",
"osle)&JGA%F;g@V^V$c*KCRWp+`y-W3({$j2HuwRruaAEkyiWr#vv~LrkBDgTmnF}^^uAyILpY@7_|6;@@rp*BNv6!$T_RhxPq#WcTB^I51*aT=5zKxnfjn!>rOv&3E%!~bDSE}xut2oITwiqTPkKdqTVY+CtS8K1>%PW_Bq|XNclV3mD>\?4QrzcRWT+%yY)1gAEBl`vz8RQr;z$ZKq6!{Rp(rV;GG|T9fiy86NE)BPWv-f@`iw-6&&2^rJ9^EkjKBGa*H;Kb{}al`6oMiL*T&Wlfq;_ZF0rpY)^!mZ(YZL#=7xWS!mtnI0rPo*>Z^e<kJ6hYiJTV5x$9_>1oh}{k6zu3{;BL<H*&sWNhvv|9`o_@YMM(CH2>3eA5;20\?;48I=g(\?Uy~OG5*oHGkXWI*mKc_<|4x(VMt%lK1*lk)qu1PV02k^AM{4o)v)n5dcu<AM7>{Pdx)q4A~plK6o-YhvHuADS{N#JL}SF7)p2zkXuM<-sb(QQk*eq#2BcR4>qvQKl_r^XDshGUIvz;Jf0\?lJ2}1HOV8Z!xZAo0!#gDHOGZZ;xo#ut+y4u2O(q@#kv=&A~Mu1@5J7MLMakHW!gtVy=irTu*Z@AcT+I7U7VwRuA1s!t4%J<FRXbNNshTyLe|@@~X*hkeFZ-`gV;scy(z\?c3EP=w|UAJVWr$wPv2-gAhBOK1Q;Q&3o<*II^|0U7R>B!0mzG7ZJo)|J)eW=faLo)%MJbEC^=39a;YNcN#ECf<bZ<FjOXp0kVt+qk93Hh$oS5PXH@)OjQF3M>2IbaGg1UuGLBEWRMr+)HLi1Mpia%DBo`z\?hZ_sxR\?B_2J@s3s9;i+b3ko0\?8GcgliZoE{(Vv<vlo=-eRnd2HT9*Ghp$Cmw2fbhQTFeneS7l7g#_2Mh%MKxUclHM|Id=yF0(AIk!dej\?vDOOzCd`28CW3ue\?uYwjZ>ZRaJf(Svgq{tMCs=2<^|<SmZIXif5nWh\?J8*mf<66^-%EOr&UlOq&2mRcw#2oZ3j+4SFe9~-q!^;oTrPkITC|lOh^y{iPm94-|+^r\?NE8Y;vB%Yk*W#%0z(r^~{`(~g@MM*YC!ie$`dYa%DKVud&OLBva;$*Q=l~cGkIu4Y5Ed!vUsH-r;_x0<pzLDR8Jz_JzV6p_@ZBYs4(1`XD#NH#R$~j-SH*)8Iu;otY&&Q5{KqT)cDBdO*eJTG6Fp!PcCNQ$k_ic{%WlnaxLA5c69Qj!\?Su#UtQ}_8a6BR||i}WSyYArEJ>n0`L)gy*s`&MuzeR@)7I8zyWfdc>ZH<*E|sQr2uYRM|5iOnHpx=R~9O_\?gn6\?PboK~VJWQpnO\?xTS=}oIQDbSNHAd($*J0eILo)\?j_r&w`ToNlE11JXE<bw%|&Y;rR9}\?uSJVQ0_Zg-2IPG7gv$j8(\?+jm<OV)HCu6+0t@n-6$&P>DqT+a*K`M(nicQ`3=1+ql<B8\?EpN6p*5xOMNsZ<w#S<+~*aRLQ^`*}e%1h+S-EkKhz8(IclYBHN\?+e7z0Ur7!|u-kQF#^|;s6VIcE+pHgEFcFQ0Gv^S@z=D(*@E-pHx54c$@&nc4\?=Fi5yFJJ`9OOFQec21t6^34eYQau42ENcj@GdZu_-2K}Z=Ky|kdfv463ys%dB(=hNPflL@H^U%F}WJfV<<i5*OTTGD_q4VBFU>n+G$pEJhj=K1NaH#<VgWj<M_DRXaSZV<+^<x4(b6q-TICc$azNTEeGj8SPUnE)p-A}w8x<XLdMN7J4g;>H\?$NMWbhgL$87Driw-gP4<aUNZbt<|bqgX$\?yOql96x15vA5p7z<EuAba7aQ^OJpI)>ajf4c8aA9nU#7%QJ&G\?Owx-t{N@XReZTsks7n4-v!0k$#l(&xfh\?4nI6Flo@)yoq1vdh9ZlwtEkqTgoqB@uA<Q%D5Miu>Gw`><yolch{dU=$R6M*FsG$#zX(^zy%k*O11_UUBwe_2jbYa%y`o9)3Y)|Mh0-VG0==oxW$!kKnje*oIm7%A{ctSjjKGc{I4gSy)BJ{@NPiL*)iG\?U*MR^5sv&~Ncqu6o_E81B-*OX8xk{~CI44_y@^5aFD1}F7=*<QKpE>^3dOAga^8KCOVyCjiz6H#AXQbK#T@~tTQ%l5<KlE-L17(v\?^F9y4sO(AI\?R#ySd8YBz=5+!CD-n5#ZGc9(F8uABh>PIOXE~z<Ue>&C#2ywuhE*)Ee8nt>J^6sx7aFYLUnq0#`AmXFp-IhHxVp|BG2\?\?a(mH+%%rK6AN7goJeLHsl=5h)x`vaeGf`4Lv5;LP_4@*9Tr3H-`@7ee+cMA3O8a43oc^Uc1jy*k*s&^=+F9x6VL(@z658U3z*Z;mciJl$PTa)mfC2<\?Z1@b>)3^U(%q)YjS!La^Zr78IJcBYdH(Dn#9JPQ=\?N4SYSJ3sA;3#@2{B%u&aQf5efF9XBwsr6_A*4Rb%$jh_7<{tRz<cu!V#u5&1NHKwV%h{&)0K\?\?^q9)Erz2PH+DfHUa(erY1PTnhiRoLQ7HYQ1l9oMOJ^FzLmbvlt&1wby0|5+H<+=}<m_TlBOUs)S@Omfz2aiO\?b0N<IlN&AI6~i-OQ(rGQmH=XA4TRSqH-k#XCp1{HrfQate+T#KTkj1WQ%Um+^W4%n\?BD-~5bt+~S6U`Mg\?As`%lOZ5Pdsm64FtnMFgSHjSo-26rgD>FRyjPz;mTKmTThS^pJBXZC|otWI<2(o5~-X8fV;*zX!%dANrL)2<^V5=V7Mj0-%0nndUyndXw)<VcSmNz<XCxEjXqkir-uk~<yVtc8FNnhg5Ubjmyj$hO;Hb(X~>{+{CJIxnK&UisLLz7_K#Td7GF-&n-ZT|JM+}~mGN|otn2J<JWzNHC})yw<Y+X~sVjn9*glSmUf9cLcDr`2$HjL4w;EIBP`$mVC-(Eqv6>E>I`>jZTYyk}xLFo};|=#\?u&d{M$NWz*Mnspy#KlGE*XZ7SrK0sN56&&Re4=D+P7a`X_f2nkk=4MzV#55el*sGst#63c`<bf`J<EUAp~{MqrU|B*5~DvDSPIFUvQmrsZ3tSC@Zn)(E>%LHy+7!47Y8Z8fIRVfi@+7#p!6Nkh6rC5E%O%&\?NtTHOe1M@LFcZ7v>D%L|8(nu~taY|$aO5onMqYMb%pphgkluRg;yKgN&kPxW&=6-b+@){k-y4S-YWtm~Q@FG{>$lgGSHi^x*=Nv^%J&~<th_9yaiuNZFjzm;dRjP(O5SXM#iVy\?R<wv1aa_Y{L7k${6IZQ~50n(}LF5G4vaMT-KICRDU{&wp9#jx`Qrzy=U;X9!Ax`L)eV$+`AYT9_7`x%oQtlWUw*{%)APv)hT_`1Mz&&rNNdCOV@qJ-Nema5>nER<lKAsTqYhZk2bmOr|7g}3NJNvng<S<9TCJg7^CZHGCo_p4R(Pd5`V&>\?Xt_6KNGtQr\?AYYUY8SV`_;*>t+8(X3jid#+&V+K`sUPQQ5B)Sgp=g+!@DK{jZt#<4dgin#yC;oNOix`h%u>RXte_3|Jd$2xI;c@}-a*IN5RzvL-8(tT\?*d{0;nLiu{vTj3zFMfwQg`0=w(9nhm}li(8fy@p_}Of+&ste=VI43`iSa\?W)\?{_YCt8u6d_YzEKa%t2jwX0@k%sw>oLsBt\?;t+A5na;r_sH}*wkC<3QnB-|FDKV>b%y70d~&Hhfy#X%Xre;aMNmh6SLj5jCNf&NDnL~)#5>QMmstZe8\?V$y_ss@$PG2s|q=lBGs(Yg(wteU7MUNEYM#%=AE>y;cQ2B<{du;8Mj3H^^K)Yj|lR9gc!bMS#C)a6i-I)`R=d`vFpek~v`wp2>auf5DdUyDZ5%MP;rJ+WfUpGD;g+U4mIk@\?DAeu#el^iMSd@@C=y4xi2;s>+y3Cx^@SM;h>Aq9t8x@9tbcCZxY=a07P)0B+*o$B>ctHER%Cl=yyU>jrzl_%PwF%(oXvGG@_*k<^hqq\?dbO`C!5fq$T#CQExfW4XTM@a{Gi&~$w%vsY}a5~wG-Esu7vU3B!MGyHo~nN;iZiWqWw7H`2W-}DF8uOp(@i1u|;@*gRut}m`Tn0{@cthMZAcVw>x9eI=g;0FVD`o=LVwo2~3Qy@G|xjZ*i$Lc}im#f2buJG)BRvDUGz+^vBbkE4Hws&*)11QOf_eA}SXS9y0pi6h`6>cv;B|",
"W+^J|$U>bK>sKA3Y=ru)Uc&p-jmy2AGVo1FddYj`%@n~BwLoAtj<5lgO7!6X_(yH~1xvrbpsnR2\?~u_Fd#wWrehUqjIZhnN%H~u0m&&e|Y@=LSVEx>wdG8acuEZc{HVq\?-cOj|p=VWw4<+wcM)>tI|JMIpAo|R~dW5@|ou4uxAB&o$-yh<9$Yplw`(E28{rk`Tlu2YMhN-hg7OXkDFo8&9bHPCsJM<t*13GN})E_H3nj7UL5Jg(a8Yad_a\?vFAk=sJKw6vRdiIB+jVj%Brd-h&eC$>6I3%`!J`{pXGPFdnw^4xy=vOiMN(M5Nnhb1ONZSftAO(q)zGB<9#`+NfPJO0oB#+x7g)lO*8<<2&G\?`c2atEx!$Z39S-mM2h^Oi}|>r9n8ryhfvrU%~*|vJCtsgIgek6BZnaDmd0bnnh9JSQ(JE>o*!-<k#BDi{AGx<RU{;|Tas|XBf_\?QgTB*Wgs!gQ&X{O0vd-|^an&m8bJT5W40U)qWjYKTAx7;SCE<+2Cpm!Yi^ynM+3|)DjHh&l6f7&cp2c4VKu^T|EAx%UchPjJJ\?wvgQ~aNFof=l=v@BNH=7YBy@yDXDFK1{i1-etFif_Tv*m{pEZq}\?W<}p-lkhFJ5&T8e~o={&9cu|+Q+V}ec3Nk{p%^T5s(jjL0U|T6vhE3sg1l5FLr{PLkufKR2*SeP>X6IZtfDz*>kx(5vv7<5Fx8!%r`NEy{(@-0nNncG&@l-(B-M!E>\?s5J#2^a=fk2*9DR!MXUhqt{(gUsRa<(3@OzI-jR#i_ILo7(xJ5U+PHvT|`1X$RHI5-q@cfbXAmv#G=z;b6CmP`s@g)WB4*<{$fn<EZm3eXc%O47vPmh#eO^>1&D{zeZ<0e_4#enPhN{>~yWB1hX0^p&@2(>$!fjV1GXzA*DibXNaMDkEgOYgoHmTKXjQ)g;E~xQ!Wtt_(>NP*CHC\?H4lhOB43rftWpx51gqC05Lbr{7hb8\?2${MOQ{bv_+>hc>i8kvz{E%~d5_hF|WivnqHJtl(73lY%z0S+ia}P$bya8#7Z&ufJp!ky#_<c2jldfb7{Y`SoO}fMlH*i-9h)(}^Pqn@*HasCHS2a!a8|k+A<Y2\?n+T6s=#2Qb-h_N)idUtq=lmL*+NeeceQPs|73&dU7ECiEepm~KUFt*CgQ1t<}-T89`vQW(IS*AG-)OlmShQIYQuz4f`z<YPP1OoWy!5v6gzlsr&#&ENW7\?CVL3\?9r}t$ZE_u#ipm<}HF;Q(IldR%5<ao)cI<Dov0V2^%u=zHuiLS=Ldj;}8<T7k$>+RF<I%=5%1Q$C^iKUMkqkr^>wS+va=wS!H+U%&P3b%U;41tcNYgN*7So6Wv|bojvBUd$~!@s_)GLR8m\?nfEl11IT{aT{jwDD0)<h\?KzK$}!kC@Xo+x=Yw*ki`\?&uTQF}z<ZGlkbks|W1wCIWQXdVg^oQz}2o#nEKYn<X)vNcW^P_zyix@MQmqqa$<$LB;Yy39oP)<|j9krKYj6m+1@oABSe)AxSJ+F#P=TF&w>CDrXXHcqYgSfHY;}6Wb7Ki(rh1XTOQu3wbU~h@H@~4bd<1CW5GLT;4_!YD6_t#(G7\?)YFdI*(J7e%xm0bRG;Sjup8Qss0a)>U3UXS*P|fNsM=aQ5SlNB6|z(~M;mK#q)S`TqOt1Px$9YHX0GjeBFzDAst~|9B0a@M0D@UOI5oaHFmP0wo~NhrFdX%^kZG+Oc@oK7_XP3@uvF^9H{`Rs$C*ZUP5(e~;;;v2r$S`c9*GHdhHI@Z+GPVV$7g*;!E\?w#ykey-\?{AABYLh>zlynO-E{RRV8C-%i$9}i7xJO;nrB2<;V{XMAw)%nB#5BI|27x1vH^Cp=d$Mtnme+GszJVUV83Cm}ZZ07OrkpOfWDY!~T>zyC<M=oSf+PIcLg~^o09DwJsqH#p+J_Q=#Btb6pdMdCVFcMr3ZGLa82Ta%sxfVj(2ARgQS_W<hox-4Ew}p_vzopG%>Jq%0qO<>mo;mUzb@;TQ-HPL+QRABodF3>gH%TH34@otYW!`AlwRmzG@gXrQqWNNDxfvhr<Gm\?`KPUKw7Nd&l4%Zon}oqoE-s(idp)DHmACs-YsM_{k^-N45WLcBpt>@5rZSRWnczO0UjZV$LSVRBNTCg<&B|HVugugv^7=SRHF^Ts#<rSKzivSp\?ik%$9)3RM@^4\?6dpgSV*ngC^1dm=#WB<db^qw5Tt_=oE$i%_i;sqXOExzsm(h\?D+Y!}RWc78QS*;K>wFFb=arCFZIzFX#OjNjgBoN$fI8cO@pi#GlA5JrMg%^Uf\?Ie$O8^tvY<ZCh_JoPWCE3|i(jmn_O0yTh0-F#TgzqQm;*pG&!%guxH\?&6Q!W%yqt!mmqp<ZD<M4wHr3n5}47_AW`bLb`zbzg+6a!`G0tmtHgKsR<N{C^2uJG2+wm6P|Wsg=EKYyZZU^tRnq239u\?Ihp_4<Mh*3dK$F|{zsX6hv#~&<E-zROXwin-%\?B%f;%Y$7W\?PmD)*0d@bqYSG5x3#fSK>w=u0S#\?zK!1K+l4eNFCy@tdOmFd4DDepuTO57*Kp=K{MmpYsP$!Kmza1L@NZQGTd20#tl7x4i4b`1P#Hl6$w%3r09GWI&#+B_mXRlu@)wxDS9nJ9OR9vueN1aUlV(@WzB{Dof=n%5u#<s@cJw=KDD+rE_oUB_LUliGr{CuJg)s5m`cTtt|yYzmnZ!>XMS(dLJLuA;-J64{FL4Ug_aTbR06Rm|G4v3pMub_dHb0TtJRc;<Muu9;lxv*|MXDIm6XmAvlPQ-DPIp3Gk>RK+-aM%xZY5HkHE<uRp2YQY\?^%R\?_!3d|NR^^M<(&C(UT^8-{6}&EDNr}3{(FD~jqQjhXQ(NawA^*APVz)beK`o7-@h3J26(;t9IS}=B)S5Q9<6Gr=&9yP&6U!W|Ij-hBa\?=w}!f8G*RWKe8gCmtd;NSc^{+=jk`5N#YFbb_mHPk2{>0Vhp>`qq{POqwxt<QdP\?FCcPjK!2!\?1P#l#gp}+_NUE}s={Q}-ppEaBROtL#7w|yaSPoJpFN9@yT1k6dJnp11G\?k-6f>\?7h)H$mq7YSE>p4O\?vN_vNri6ZbVdI9%S=Rf)TIi~QFSba(4K@GV5G_$)3@N^u6N@%Vh<SW6w!~wp_`R4sCNU{ePCE(LpIGjR2Xc^aLE;k6$m)7My_JoO24W^U-+;pu7#PCoDbuiR`FG%=I#xLFqt(|Fp8Il1*E18ChPriQ(`_luIk#_}R7pooTSsDmEeuw$25YM>d}MbU@V8OJ_u6-12h1N#>9;aep_6tI=*$lZsftgW6lyeoRV%Y#<yM^9feDkx^iPJQj_-HMM*6x>%JSn-eNHM3$oxhJh&V)Y&aY>sL52G2zdFC2kYd@vu}yged=eX9s$C^ij<#GuDNs}-T!s405}T}1M4zLz4BI5EN1JC>)RzTt;Z~{vs!#E;`aH#Z`~lZ$SUtz;kxk_XP=Of4bX(2sP>uYoF;kKlR5fm#%yq$A{+E`*x+`py`HVqQ0Ck|+ZfrU|<<ohSvII5y5PR~O+!w^<TUS11NA*dm3v!J5(\?wBQnR8GmWt;)cmKzT}%ak8b>d31j+)JX05hhwzhG5h7sO+K*+V=rb6v<55Cjn^-)r!tx&WB24oP9+pvNJ3w@c3Wu((5U+qY%un=vOa8Od61F=j+iSAuh8SXwb+74cA%vA8gW#vz6$8RBx|a5&<_3=Bw}CRD|La+-x^H0xOC*(>Aw6o;>D!Coo9vKVZowe<r&3h6\?2{MZ<lPikJy1y7oOTa<}^Z+-*!6ZK79Qs3!hfBgb!^GP|4NZRVd`Mv_-%m3m_Kn{V;@9X%Q4Dm+8fmxcDQwDfO)dqDHzyJmth7o_25JQ1~i01)\?XH^0*n8`TP(*6y\?n9NP)tGr4Lf3wIR34~;*QNS>t+rhg3wEeZb6fNBZ4cT\?S>GDPHHQ>(b!)fg`+bUP|~*SI5^<M9y++Gw2qOYKAx^dbrcJWW6VUoi\?J_WrRDB$XaiL(ETBOkc*VJJFzp#0{nI`|{Q@8ELl~U9CEn80r3B!XdqeSsM9OsQUR*C+rnZ\?asT*_rhSQ!()FRQIBCV(5-dZ`FH2`O@+&#%!1Aq=0a6Q9VWeV>erJ5\?~fno{jq6U=AF2ODQ191qP-^7HbR4>",
"&K*eH#F>_9_dU4#_WEKO2OpFK^3LhJUY6_i8i}G;52_xG=);q%8h5}*)~YnM20!;v8c*HwL5\?ZwZcMBB{w~E83*zW6!eF4VF\?Tpm9q9S55KV(9mYHl-<N!\?TxZOv~dskN~!vrj)Jxd@-EwWekk(8$B!r`&Z22Hb0\?!4$K6Zku8Ez{b+sly6JcCiNIBy-ULb}p*pCM1Ezfw7Qh#R9O}aVxyZ{cWak\?5DIld2bjOH8P`L2H(A<O6BT>SNt30<h$PlD6_1{5SNU*@IZnUZh=@=Q0d_I_dx<shzjSLht9IOZcXO!mHm>3$axg5A8T2(Ul#}BUpHdwnbT)igLb3;S6ivpRQKxt*ZpknJVRvlH6FM|JwWu{@D=qUW6yZfOiz!x4mBDEsn8OBF1Y95u&K<r2z*;g+zTw<vx1}*>1Q`&w}(qR)(SMD&d*5_BDs\?t0RL`S<<bG<oI3-_*;t2h4SyfD!6up\?<cS>Cy(}*C__!wK<OV&6%<^J!YCIrS+yQ^fEP25;{MuAA5k~vES%*hq44o(LxN=DfZycW_BJ>Uh3rntUHqiJHGn\?hR+J-I6A!mr=5%~-Uui@bWl-4\?P)Fo-q$k3bLD@dv-r%)O_f0_g-2{*qc5~<Ax|2h$Y<0mnFS`$LAaKEEh*-{g>w8=b8xqMJL>k;qXLM-&e0K6)G3Ikt1tmsqdP4lW(L<!dgld3oG+@U+njVSvT`5DY`Hgq=7gKDK=aX#;2sCB*htGUM-iOaOTn7pXC%9R3BV<yoqTOkV<paL;45CEh6lvNbiR+MnnNPfk$AnVnaWTZeilH==p(r+lP(|7z+DqjQ(JX(SDUzIEJhC`P|f5eRZ(cnm<LDrNfBtEAB)f0}6iA3-GCEpvoiAlx0Ws0mSM{&WBml>p`T;Ut(C}sFZ-2XLvEG(}=dV>SBIe&+a{eDuESwIvu7f$AyMyUF$!9W_-p^rHL3w>bc=n8C+@}k&lzUbOh{5O&5+d3_|qZgIhXUCQ+I1z<#z|TgX($^!1L~3n7th3lKv1l^dt7&ev{Pyb)\?i-QzFP<WJdkUevE<btt@B8W2jU(VW#V&OIZotT1n2Oy2&*EATk+jl7F;yYlw&QR&YI>B-biJS`=hDV$%g8Er{-79S{(`0}Wl(VN-2si(`^rMMF%>5)x$tNC5x>W`lbPwrHe3sVz@~Yso6QS!9F$v{nF;W1#WK`T6r<JEw1AeSRMtZ_|4Q5QnMs&#S)m<nGLfE-_&i>$^N>yp`e*TinHDcuwWr$B1LeZ!KzF;lxO~WYQ8~KUOW|JoZeNap2I&!rL}WcuMh<8`!^kctC+T>$mH5\?<(5kyPU|nZ1hW\?ywu|UNTRs4\?q_\?dN#nB<fXR1`ZbcuqmDkZe\?NuX)9Dx+ZUQ(AiRSee8vANk-~+rvB^o*p8812~2Sx)s%CODe@tJfS3cROIhZfKqq9IeED=RLW+NzyF`5^u7^;ghb8j@j;;l`Sz;pgftb7`wPB7&5qAIJvUfgL\?*ijt1&-QRyfHoTW*fV08Ko~tdGiH-N\?GdFcUSx3\?Svgb!Bk09GR1`FNwZ)@^WEor!MRCw2=!u6M4\?ZBajKpJ%Fgkm5S_1AUs!+A\?hlelNewkpGEiWb0|bb=8#k|8HX;>aoHw_-^71G1%=qqBs5o^1{H1yVHs5xR=li6~qQgn^b~L!hs=zU-%xYAahRsILPbtqfxG>q~_e(T@iSI!DwlqNF<N;4&Ckw(UZI7iU<)av~Y)1fQQFVHyyFAddX=-zFu9$RR\?3V4kfGU~TBQ$7K<+xOF\?AZ>AcXynO+80QnFEO3*>izx#5!y}{^Mpy87BoEoMgg6h&gN6r>SpS+)>^9NBgFQdAbRF^n~@pC+ZGr83U~9j\?R5hKg@Ftp*IOnwXL8e%cKi0uRdaFIq58S&&X|80LyY&)T=r}6QmAQ4YtTNs-oMa&*2~NSc(()Lw;}CtrnfA6efKITmw$K<vL!F~Sd_>r=Jwo)0(+y2|JAsj$xO~4Yqs(EZ)u-`7%9G&g\?bQxZ*2UgpPr@Y^yZ2Kyiw9M)Hwd*e9P\?SdNI%kLZ(G$s2*xq>PnEL$97J2ZLH&aDxI*;psnq#F^*anG76q-1Eyz=o|KXjiV;w|D-^>>qrr}<tK%clw_FLN`V2Nfygwwg7`o3QyR_3lI)l)(4Y2EJ%Y^XmCyId;U7_(%#3+Hf=Lh;JcBBHYf8!y+3g+w<k!C;s(rC@0|9o7UL+k@Gbs594n7BwId8qez^zasHY-4HCE{QgiSXQTPq;*}=)0wx|bz=pBU1-U@\?^#\?AuAPS{rNiF|c=Mh<sJ3w_o+dcuYvrQRV7TN>D`&FqC0%lJN=qg!Yr0BGgBl8F%o_rb(rR_uF=Wttywy|Wn+ZRZ08R=-(8&YU!|v_+BR#Dx7{Qe<pP>{V&Nc~mMEL_9e&2~cSa_nsmwSX#vlIARmMFz7e53MWGftjaFz+t\?sF_M^Y$B>Eb}FIYnVhyP)0nbfWi^Zps--MpXR#%fJJ*&2mvhRdzn&5sioAO`QJvNM$%FV71S<+pyG4*`-ov&ckwo93Zc--rzM(T<Pd{GvbOC3eY793QF8=D+r|2!VR_J_q=&qFg-(WcoW2;^g#VQKj(T-P~<q>@SJ\?^`3%V{#~4dTPH{P*KXFId0}C}+=3r>f7rI_#KfxPGtPuI`BUM+cd0_s2*qv4ixNLQbvhCDtCzkY~f(J$UurDH;y-f=h=DYfbc8)6TFy5`w|sq!niyJN(p}0>9f+8xq8%-ho^bcAS@R><cfOFT{NMaJ<nn<QMVYaCLAQ%K0#OLOV=AzFy!zghV\?Adv%3pa|JwJUfi21=txGBd4w7W2aJpqEEb**+jnVp&`eI)f8qh{)m-F)!4r#c>nBRm<EzHxe-Pbi%;0*5C\?N{tcs\?Tb`&Kf7RsT7AoPEj=2+<YzP3wL@ao@TJnSC&8C>TvL9MEWNuOPged`4_1;N!oApy|~ZOnaG_y=#@G{rkH\?1{sNP3Yb<a^\?_U\?4sJJzte&B_pIVagQe4Njs!<YxRTdzDj`|yIGhNTf4eZ)5a;bJox1(OEX6ZeBKY8eis|wkdwf>7\?BNtKABNL8hzAU~B<|MvFV;6O>nGdJO7yt2S;g$ouo\?&g4TMuYVroio\?r6s+Sv%#ZBXTD&iSmYi5(66\?Hz\?!j^e$EuDTep^q=n2BB@z)iTOD8Tt)W`MGy~uvAO\?7>mU*}(l!e2oyz0nVA1YbJ9bPEp=ibVF6V_ui4EfKz~YepcQ%eo}fy>uW3lbq}5vH$U$B%e8FL!P#!gcd6KU3QD(u_j|XRdNL1stXA)Zt`Hbd!2hCHUL_8W4kJ>+%<\?w$w1z*qQ@U#oz5i8rhje#leM!9^F=>II-r--n{LCTB>d_*%-Fs6$TfWI2_XZmnI8v)Z~~Ve=_^fwmk-D0K>Sd8lv_$<i+4@XhFvsgF-(1K2|PQ|#vQg5B>dM5afK!hye6sB(lxoJ`K3UQlz)nB>snh>{%S*5!_5TIg+334f!HKVF&1!b81cHWnUGIuRE`YUT3{SXrdUAF<VA{P`cdMOIUhTcezI|eHKy@ZSQ9cbS;US}Lszg9$Ew~H\?pjiIs0m0%zh9K(Me4cm@Pt-pwy2c66l>M;GK7Da@@{vc5y^S9P&7KhmtaBezibX-Qm`yc()R+&CV@E=s>\?s-1$eIur&y*!L8khcQp-5S\?LJ2cC6L9q$x+;U#PMsGVv#Uk#h1rWJ+;7SCZ}cglqo7xLN|7{wLSH*ihxHd|JIwdCoC8P(hBg&(;>QV(Jv!;j\?MxFz-fR!surus6Js5WWNzo*3=_#ew9jq=yR|~A>QmU}E{B@gS(!2tlr<tl(an0>2`~Z_|IXVw1j2\?%#4o9x9JlZ(4jLE2u_^pkkmCSR^LsRlGkxN(ZEEOaV)`EZyrZ9X_92&oMgNO*aKydghHk-{|GVmTt4E!r060B4*_p~PKGewR+hBs(4(jsh#3`pQUIr+Q)bm}5(nD*^LW1op<3OJ$xGb(dKWkKCUf>}`B-(V{ie^74&^}AGqzQMiuM%MH*fEFYkzj*@OfiU!0vvYAoS|$6@FNn7(72rZpxIB~qNTy0-J-3#y4-5;C8}K$hjk<LlG$S2=oUAEO~gdxW1f8C6nEYd-iZ}t`LiF0>M99Kowu2c5Jm1S*}xc*nd;BF#na9Jk(6Ub",
"SG2Noukryhx}{iXSs22l!\?kC<u%q1eqKmZznW^qpf%4|+1-jYay%!6s;MeYA$Ex_4(vIIL0ZR;6rGCgAwQu;`z&0DmjTM9dzHdy*vm-7-U<E_xKg(-;j4Xg#+wI>xi^^AUTL98tSP@xJPkOf&=*_{+3esKMU+^~`T!(*_Lp9JXEUZZTBYBv*x~VdurHOzHTJJn{DUqpBKp<iI&c54jcD*P@6\?3HtdUrPRpZ_3}1uH0=)afWs4+k%8BdZMlL8\?crjd-GDqV`rX>2xIwU^B&-LJJq3%Pb&7f&Ij;kkR!OB_bI28@pbeo<;P>yISrK\?wJ%9ocj3)rUHA%Vg;X@q=<6Iqk{P&;x03U#~HoC0*Xc_Gb4_2$6a@*CigVXmY0KHscL#g6M5}Kzea76ujrhG\?HQItaEt`r-3c)}s4j;`h6evUWVHoZISdh_ExGz3vKdjtYszS25+c{~dGt6+i~{yzHm*1_+iPHIVrz7nXnP6hUP+`3S|oE>Xan8vbK3<8AJ#Gk_88D3Cawu%a8ulth|+R#_HuPKpC@TH9%L\?_orHZ&\?w\?t11I`u66Tdc\?nfPND{{_yK()yl-RsI(3c`P0ssUfzt0M)eEKGw^ZXiw6RVhq*ZVV3tAXvSVXK~x06UZcQf2TJwMZHQ=C$;lGkjY+gso-(a}s7F&(eEjqXcO6cYf2%@kf9H^b#BKs>q2%HTrPy_F7GNJjBQ4e>f;)7ibQ4<z92;*7U6>5`11c<8#oxoLmZfVG9+>jY<X`JNxlCX7+!;`r3J5=B$vfwi6l&~d!xCi~1pn1y<ig%PCXYZR4oF~BgTgXp%z|6VQk^RQ6D|Jebp5^M3WlFO1bpI(TJw>|@O(rO1ea=$4>!2Lkpm|6yP;eGBsHkgIt=>9iX+3}X&X@gS@dN\?d=K=RVJda!3-4PvWJWT+3\?3kvL#&{W4$;e{<&(5CWm9&`33D+*_W)TpzdKf8k5`8>V}zy@9ppTerDjZkNAamiHU8Gh2zPFKM-CjZd&_I\?HjWIK#cqBxl7O>CxA!dLwd~r9=zq#pb<TUMlhB7_woGdmHT;oZhJnXQzezVQH=kt@4)jJv2\?mDM`4I-5\?H3Pvmh6SZLrl22;Np=Ume^+M\?)%$R2Aa>SYb\?H}ye\?AY;k+p$Gd23_h)p{>mH$kETil`=);sxVha}-{1q&wniJU;&g-7FdA&C1w5pWt{RqF#13ob~mrUXZ{`O~LQ^8oTxwB@>Z1K$C<T7UL}eCMuBjyO}0gHJ^LNEp6SY|J%r*WfYyG~cF_TFOk4{b)IVi\?-@8ikG|FV8U#_kXLS=6B=HAoMsUwER7{7u~>bp)$O9=<_{DT@QP;=vW)~xvl7wR8ZhvJBE0~+l&1O~zZ)qQUu59TK$6gdffFNoN9B|f8x6C|i8K$_VVZnL$8dZP_za>ugAs\?ZwxM_m`20gIV>4i&VU6qjWz1CtiJo@F{g\?n!V~4~Tq~#t%yuQGL>SKMzp9x2!Imb3rLvSAwg-$P6;;-epbj}McaL&sO6H|A1n7r&9nQ|_fyXu{1^!sh7^=d#L_bl6WWYdls6\?j)Y-mtW6v@F<z*65l1<Q`xg{6PjQu7PB$GyZN2tGB`8&o}^;fNs6oCpBN{jqGz=;OF&f@h9xgqAw#c*C*C#^#;-_J}V{@#~u)hAm^}pm6Z@3@Yq>THYDqic$1h$YDnU+T+g`>wnYAINKC~o+gYvHUBXoB<ou2L3x7L9gf810Lq=ePFmDNb#\?j8K3Ada4YwAwM>UHE\?yws;ju@nl\?KLf\?_+4X2mB6I%<f()T)e$NP>sMm~9`hDrcT$-8B+IoeDt<2MncbEHfh\?ruzWej*X8C7Z}ft6foA^ReBGdUp\?+o~3r)LFte#r)>*V^oaiVoqVpm$Ik#7QXv(VcFohYZdxuNu\?TfdtJm3SIyqEO3{@sdqHNIS\?{W>8r%HcD+BXmqJCFNA8bgDn#xI_776{>uQCYLhPwt69WGCymH-mZ^mGKHj@J#$COtEo{wa<{KWQ;\?K0f1V%yhhJwz~sEd+~3=7hth7aUS;jhFZLEu|5v%0gC)SF<qjeHh2_7%l}!O!WU>isE@$1Qh)w5LzAgF%!$-m-$}G=fZ=nF@&E_Cpz_Vjrr2(xK5PVJT468jgu!~s+54Uiy!@8~bU1xzT#!xR^I5ajjU|ve()fJ9h`{!r{ZTEw=O3Be7_nFtsd@yG@sFNuI#9s2sGfp%1~5i=Wh3Xm7`4cr4S>G*xjGSb=v!XDXK{)pcDXrkGrR-@!gPhqRyl>ae\?M+kxYZ6be+hd_z7V}BJ}u@Y#r{Y<r`zk*qC`xDERJX2N+;rQ`L0c8Jz$35KcA)!v\?t=%%4f1+tB}X7X30I#zgV7&#74Go5L`UoF_gs>OgEHkxR3cJyxc6FRQ>`Fi|G+7u5o*0RhotQlYj#|11OI9\?slf4E&D!%XTTd>J}8yb2\?Mz>O}=ZeSuXc0a2bu5oquvV0AG9IlK$;@JHEPvpmPj-)1Vg)#$5h~_fK#lJ(P2T{9A!m9ta(nY4h=NlUkXB`d74TVrIk>rAZ-Hf2}RLmIc<(L9x|;DqmaiOq2vNN+4Jpk8ZkZ|Nc\?1_W%F@]",
};

#if defined(__linux__)
int main() {}
#ifdef __cplusplus
extern "C"
#endif
int __libc_start_main(
    void *func_ptr,
    int argc,
    char* argv[],
    void (*init_func)(void),
    void (*fini_func)(void),
    void (*rtld_fini_func)(void),
    void *stack_end) {
#else
int main(int argc, char *argv[]) {
#endif
    PLATFORM_DATA pd;
    if (sizeof(size_t) != 8) {
        // Cannot run amd64 binaries on non-64bit environment
        return 1;
    }
    pd.env_flags            = 0; // necessary since pd is on stack
#if defined(_WIN32)
    pd.env_id               = ENV_ID_WINDOWS;
#elif defined(__linux__)
    pd.env_id               = ENV_ID_LINUX;
    // Linux's stack growth works differently than Windows.
    // Hence, we disable the __chkstk mechanism on Linux.
    pd.env_flags            |= ENV_FLAGS_LINUX_STYLE_CHKSTK;
#else
    pd.env_id               = ENV_ID_UNKNOWN;
#endif
#if defined(_WIN32)
    pd.win_kernel32         = (uint64_t) GetModuleHandleW(L"kernel32");
    pd.win_GetProcAddress   = (uint64_t) GetProcAddress;
#endif
    pd.ptr_alloc_rwx        = (void *) svc_alloc_rwx;
#if !defined(_WIN32) && !defined(__linux__)
    pd.ptr_alloc            = (void *) svc_alloc;
    pd.ptr_alloc_zeroed     = (void *) svc_alloc_zeroed;
    pd.ptr_dealloc          = (void *) svc_free;
    pd.ptr_realloc          = (void *) svc_realloc;
    pd.ptr_read_stdio       = (void *) svc_read_stdio;
    pd.ptr_write_stdio      = (void *) svc_write_stdio;
#endif

    stub_ptr stub = get_stub();
#if defined(__linux__)
    uint8_t stubbuf[68 + 580] = "QMd~L002n8@6D@;XGJ3cz5oya01pLO>naZmS5~+Q0000n|450>x(5IN07=KfA^-pYO)<bp|Hw@-$qxlyU&9Xz]";
    b85tobin(stubbuf, (char const *)stubbuf);
    /* prepend thunk and relocate stub onto stack */
    for (size_t i = 0; i < 580; i++) stubbuf[68 + i] = (uint8_t)stub_raw[i];
    size_t base = ((size_t)stub_raw) & 0xFFFFFFFFFFFFF000ULL; // page-aligned pointer to munmap in thunk
    size_t len = (((size_t)stub_raw) + sizeof(stub_raw)) - base;
    len = ((len + 0xFFF) >> 12) << 12;
    *(uint64_t *)(stubbuf + 0x08) = (uint64_t) base;
    *(uint32_t *)(stubbuf + 0x11) = (uint32_t) len;
    base = ((size_t)stubbuf) & 0xFFFFFFFFFFFFF000ULL;
    len = (((size_t)stubbuf) + 68 + 580) - base;
    len = ((len + 0xFFF) >> 12) << 12;
    syscall(10, base, len, 0x7); // mprotect: make the stub on stack executable
    pd.ptr_alloc_rwx = (void *) (stubbuf + 0x1c); // thunk implements its own svc_alloc_rwx
    stub = (stub_ptr) stubbuf;
#endif
    b85tobin(payload, (char const *)payload);
    return stub(&pd, payload);
}
// LOADER END
kiwiyou commented 5 months ago

임시로 #define DEBUG를 해 주세요.

byeongkeunahn commented 5 months ago

L167의 #if defined(__linux__) 부분을 #if 0으로 수정하면 컴파일 오류가 해결됩니다.

DOMjudge 컴파일 옵션에 -static이 포함되어 있는 것을 확인하였고(출처: https://github.com/DOMjudge/domjudge/blob/9f44e13cf73d1df6e870eac676196403a144464b/sql/files/defaultdata/cpp/run#L16), WSL에서 테스트 결과 -static option을 추가하면 동일한 컴파일 오류가 발생하고, 제거하면 컴파일 오류도 함께 사라지는 것을 확인하였습니다.

해당 부분은 백준 온라인 저지에서 156/0을 지원하기 위해 추가된 로직입니다. Workaround를 찾아볼 필요도 있고 156/0 지원을 조정하는 것에 대해서도 생각해봐야 할 것 같습니다(이를테면 ENABLE_156_0 같은 매크로 정의 시에만 해당 로직을 활성화하는 등).

byeongkeunahn commented 5 months ago

@kiwiyou 해당 부분을 백준 온라인 저지에서만 활성화되도록 게이팅해도 괜찮을 것 같은데 어떻게 생각하시나요?

기존: #if defined(__linux__) 개선: #if defined(__linux__) && defined(BOJ)

kiwiyou commented 5 months ago

@byeongkeunahn 좋습니다.