From 7d51fcdeb24cd31373b8b50a5bfc627d355ca405 Mon Sep 17 00:00:00 2001 From: superturbocat2001 Date: Sun, 24 Jan 2021 19:54:09 +0000 Subject: [PATCH] - Updated libimg loader. - Updated kolibri_libimg.h. - Added adapted libimg example from ktcc. git-svn-id: svn://kolibrios.org@8545 a494cfbc-eb01-0410-851d-a64ba20cac60 --- contrib/C_Layer/ASM/loadlibimg.asm | 17 ++-- contrib/C_Layer/EXAMPLE/img_example/Makefile | 25 +++++ contrib/C_Layer/EXAMPLE/img_example/logo.png | Bin 0 -> 52385 bytes contrib/C_Layer/EXAMPLE/img_example/main.c | 98 +++++++++++++++++++ contrib/C_Layer/INCLUDE/kolibri_libimg.h | 90 ++++++++++++++--- 5 files changed, 208 insertions(+), 22 deletions(-) create mode 100644 contrib/C_Layer/EXAMPLE/img_example/Makefile create mode 100644 contrib/C_Layer/EXAMPLE/img_example/logo.png create mode 100755 contrib/C_Layer/EXAMPLE/img_example/main.c diff --git a/contrib/C_Layer/ASM/loadlibimg.asm b/contrib/C_Layer/ASM/loadlibimg.asm index 8a707cf67b..6b8de3de58 100644 --- a/contrib/C_Layer/ASM/loadlibimg.asm +++ b/contrib/C_Layer/ASM/loadlibimg.asm @@ -45,14 +45,13 @@ import lib_libimg, \ img_flip_layer, 'img_flip_layer', \ img_rotate, 'img_rotate', \ img_rotate_layer, 'img_rotate_layer', \ - img_draw, 'img_draw' + img_draw, 'img_draw', \ + img_blend, 'img_blend', \ + img_convert, 'img_convert', \ + img_resize_data, 'img_resize_data', \ + img_scale, 'img_scale' public libimg_init as '_libimg_init' -; public img_is_img as '_img_is_img' -;public img_info as '_img_info' -;public img_from_file as '_img_from_file' -;public img_to_file as '_img_to_file' -;public img_from_rgb as '_img_from_rgb' public img_to_rgb as '_img_to_rgb' public img_to_rgb2 as '_img_to_rgb2' public img_decode as '_img_decode' @@ -61,10 +60,12 @@ public img_create as '_img_create' public img_destroy as '_img_destroy' public img_destroy_layer as '_img_destroy_layer' public img_count as '_img_count' -;public img_lock_bits as '_img_lock_bits' -;public img_unlock_bits as '_img_unlock_bits' public img_flip as '_img_flip' public img_flip_layer as '_img_flip_layer' public img_rotate as '_img_rotate' public img_rotate_layer as '_img_rotate_layer' public img_draw as '_img_draw' +public img_blend as '_img_blend' +public img_convert as '_img_convert' +public img_resize_data as '_img_resize_data' +public img_scale as '_img_scale' diff --git a/contrib/C_Layer/EXAMPLE/img_example/Makefile b/contrib/C_Layer/EXAMPLE/img_example/Makefile new file mode 100644 index 0000000000..868539caae --- /dev/null +++ b/contrib/C_Layer/EXAMPLE/img_example/Makefile @@ -0,0 +1,25 @@ +NAME=img_example +CC = kos32-gcc +LD = kos32-ld + +SDK_DIR:= $(abspath ../../../sdk) +CLAYER:= $(abspath ../../) + +LDFLAGS = -static -S -nostdlib -T $(SDK_DIR)/sources/newlib/app.lds \ + --image-base 0 + +CFLAGS = -c -fno-ident -O2 -fomit-frame-pointer -fno-ident -U__WIN32__ -U_Win32 -U_WIN32 -U__MINGW32__ -UWIN32 + +INCLUDES= -I. -I$(SDK_DIR)/sources/newlib/libc/include -I$(CLAYER)/INCLUDE +LIBPATH:= -L $(SDK_DIR)/lib -L /home/autobuild/tools/win32/mingw32/lib + +OBJPATH = $(CLAYER)/OBJ + +all: + $(CC) $(CFLAGS) $(INCLUDES) $(SOURCES) main.c + $(LD) $(LIBPATH) $(LDFLAGS) --subsystem native main.o $(OBJPATH)/loadlibimg.obj -o $(NAME) -lgcc -lc.dll + strip -S $(NAME) + objcopy $(NAME) -O binary + +clean: + -rm -f *.o diff --git a/contrib/C_Layer/EXAMPLE/img_example/logo.png b/contrib/C_Layer/EXAMPLE/img_example/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..5a1285f74737fd9cc1417db4f6940eb5903fbb44 GIT binary patch literal 52385 zcma%CQIFnOGQ4mjwG}Xnh7*Gj2kAa?0|mlRju3`VFi!`7fq*f~ zQ&5=Udsb9*Kfg<;yf-AiuO-R!|o$i$-INJPT_ z&xIjF@QYaw&^^Cjr}q~|>4*&AwuyVU=yM=tlCQv9v53z7b@1{iN-y1{=V1fk@$H;W zlkjE94L$8<2^#rVuK*Ch>9(=pgnBjAt$0?`(kK{77)Tfi}u${OfK*Z5X*sL zDApeM0xRnPL-)rR+451;Ra;Juu#b~+K}7{OHXHW&olFke?jh>oM%_wvonOO=OdmEGH&dVMWp+$b2PIRGgi@`ha}XW7O06`|ILs*mi3{O-~u8 z9CXjW+wirKxvN{)d&A)KC-8E}9O`ovCNHlRwVwGkzlVGl3Al-sYwNTA#6+hW&q$MH z-m#@vVjiBmkG-u{F2}DjL|Ev87`agqL#EEp#Z*nVMRrkRB0FB98At~Hao*PjIRj24 z;sqf7-!D%l)1%t6am9F@NA;8IUzfL9zu&0i-|CDga_nKt%LW=qR7?tZKmP6Wt6%_a zP!Oy-?vo(ex##6`bu_kWwZcdt+@#j3=l#>76FmX;mbJerXbjg>LS=hOll2_dL9E_R zFN?xs?V!5!zFA?&WsP~_ALPMt-SY^=vGa>@lFxcFAhnFaQe#qnb*|OeoYmApV;U@= zf(d}(`#E@so7*5q>xA=(qxaCk0tWBL3JD&B@3U?K&z(WDshvI?c~U*fUr}OQI|q7~ z7857Cx!9kJVlomw6*g-5T*OYJ+BE^%o#7Ti`-oQeau-;2G} zdcU(;a(32=y&Nn^nP1-5%*G251`KXu$BawXvM1p9-ZLNPFn)^EUcUHLn6?8>ec!8N zQ!=kQtjK7_vi5yc}#v*?<^M%oJZ6#mFdVAj_6wdQ8d`pvHZfD=03EU287nq)kVK&!<4zGctwz z?s~cF5wPW;Fuavmcl*4!{pNf^g;4ecA{F?=#E@;euC$SSd;x5y(v$`6tM}itt(gl% zn&@scf4=DCq|a>sWvRU4HIiSRf4>jH@q1W6(ZVmQc4{$eB$q`Fh2r!7wpbu5Ape8% zH;TDA75}5wP2fXFcw)lI!2(r*9n0dx+wl31iJD6cH}uD(udNRW z50I~1f(`fmd3kH!ItTTF;?8la*Xsu`dY!K>g&~l5bZO3hg*(fM?QZSYbqoQLI}ZXq zEDN#Va521KQIsd4pD_J^Fo{BX`0O09=W~9Ym8S?_y9az!;;c7dvUobb70v(7^^PTz zo1-iY;14!G9qr6SUqaMU#A#G3rv7DkM&M`xa7cmvo*x^>?~(7w?y!%f_|NQ`ru9)8PDrumbDqB@lvtZ{vx9j7geHbXrZgWm+ep9)MJp&F2UW$;^-!B+*ayU=a`r-S2+iq)X!)^x-{Y~f+}Y8ckPvRpnxVqj_?5~VP^GlMqwz0A<=*UoG}O5x<@(%^cZO~7*-~zS?+@&L<1ViPqM(Pr6P0@&&6WW3i|;!G%XVM4 z@U^yJSYD@#cvnYqn^Q!&m@HQ6B5T)U9yz75T78e~4A$nFirL}a>A(Go7|qYl_rr8< z9^3VSZu7EeZJn>%#m7cG#Af<2VTnYiB(X)m>&=dG zyUV73M^j;z?)L0Kt8htmw^Z^(vftCn0I6s{o+rQK`OSTmdIIo47r=9(!I!tFF9rTibi4 zFVD`X8oq%a8>tgxuSU_5E>~HY6fPymA{mB}U=@C9R->ul#MR7Lq=u`yO z0KUZDJ*O*FAu=B}U#5=^kJ;19!Lcq*@A{p{$? z>M%GTInLqUDbiAfxCN~EiTiNt-P{2xx&3WG>bH8|=M3LF;B_k3c5R=Ja)B$3Ckg6%pC3nNV4>p8ymOa04G`joDuOEHdmT1Bs~+IqtKv{JLPu3lM6?lw27xlVIm zh{fRDMi+K|ZogXMVvE_Xj$N@UX1?XK05SQc?%20{On-jiEHSum=uS&NZ}O|n`qc?^ z$R(dYa9g4z;(Rhl&0u}J$?g>@$cA)oex+X@HfD~nIqm^XgAViBh4#z(dH>iXd*Gy? zPJkJg5fd5;1HrCLQmBsH@bqG~tE1(wSd_$+eUxYLENigl&)s|@G3r++B^X-SwbT`P z9N1v^T9j_ka`+l_>0UhBvao3OF5k(0kjbAbFwTFcYe z)j|E$yX8$34Tk1c@M-n#X*ei(&`XfhGXvKx9upIRjQQvKot%zvuVd}usq^b?S@YUr z8hsQ?&3fcnr@On>FQ3dL84Wo#$Mft9h@Pmh4Ir{s74r5Xc0AG!(vh6^F59x!brjCF%#_+S#YMf6KY%SRkl^-5Iv;t8F$vqY7euT)0uVJ_-(D?Y7L6YzC`jKWikWJE?6=WUCiqlsJ50xQWxa*u)e9VgE7;PW%s{RiW0kU70T(3nPyee_am zI1gv<4fN!k=gvbGRh3b(gK0y8aM8$1;K5*ZZXzcoL#)~0-vbQzt=l4pW`3^A=X-I} zHhc0`9CDV^hvXQrzAjty&4Rqhji)2%DmLWpRzfAW2T<1a$a~%1(;PM5r*>X>n)u!5>s*Lr zXhZ6fz?wk}z4uHJoJ-N5@e;VPE(?k)ut$Ve)JRGsF+=9@1q(o2X0$`Eohezfwa@uVcA@W`(r_B1P93W8^H^3r-WoQsBH;LM4R3r!Xhz6 z$ssQ~8Gamh5EBCh5mF1DIk4=x%gq9y02Jg04Cz`rbzbkT>$47jpnk?5qR@@Q;CxlL zRAs^9KyxRnAB??oxh^2%_j~s>2T59E+Gf*tZ|G`kkZn}m$F4>pj6I=@4)*p6a3#91 z#o5|$S`e;ZS!e8+ef9l;Xy;jdGv-u{2t>>2z9RMQIJPh}ny|2Wt4`Wu>jYV<`!<6w zl~=x%uH!SL7?wZ>q#20x5+GXY?~Yp{7Ycr#SK)ZG83E>aWlelD`kX3z61Uevz zFq)78m;99{_2;^78UpcfXquOC|Jah-ND!|{o(DCyBd5KYFLZy-J_D6i#w}tNT1A&Y zNTMu(UARCcuM=^af2A)_D5+YtaNI2|ZOI^HvKSK5fA2}nOOo&NzK)R>(HV1G0V|Ex z7@QhMA+>?azfy)YOyK8*m|HG~L}V^GSKCgIwjkmp;|o|Dd*)_1 z7nr=S^VvPEe62jyRNcRfuXFCkLlaa$$B*_7K;P_DA~grCZU>3NnaYN~LJGMI>iOlX zqn@21y}VRk#*e2GL*^$4>(|*A=P5qM;pf=dc(XNMcMkPG!bq3yD?a+VJu98AK>9v~ zM?fG6w7d@((Pj;Z}xBQ{&i&$q~*0Sd@ zL~eI*75hh~NVL^l6kUDq75h1eXZO&3^AI}>d_-@}|KXR-+HR_s;7N)cht6(uz2`Je zuysEgg9R)>fS{wH0AWa##s-T{_hP@#P{$PhuKXIWsdeCej@Jf zsm`7rmlF*a)>JM8yfKgXe)*2bAD+{Fi|Z$Z%)RURA(I*#LIG>k}) zREAv{4WHjmr*md4POOcKDpnC&+$${WBceqb9ipxUU-mdW_ zO^HTZwmIKzvg2<%{>%Fa#_3Kp!L9GMuh#J}!%eBfT)aKrqM0s4pCRwOyD|6f9rC~? zJfc(|kBr)EoYiSFn!Xw5U92ZMR3O>`pytPn#FQgPr&<`!24r#c0y{)VLCOR}E-?kW z{a4}0;7*JeT-_cX&?VH!_2kG%d?0;x>6wziG&SF0#WVIW@x0iKw6qAkEcgUEo}0x| z$ifa`JD?@8@`&+IFDH(8$W>GYnCVkqYtTzhRuU0Tr_~+KohIc4Iv$I2azLDpmIyS{ zBbs#n%+}i&hy3HA^YOlXGkfw*l)(`6;WH^5xR+r8K;vtI3j~E-r;g-Rz;OA|*Ly%3 zs;MRe;;#*(g}^S6?uQJw_hQ9z?Ys_TE+d0drttp&V7dgl) zqnS)V!b1)I}oJX4Pw*IF=Z7mB5Lx8K3qMrKv$IvO-($=t3k%Y{h>!Z6~s&H zIw|Roo@T@K$quCjwL42t;m|Yb?oFN59NS!gg1!3N`iVctqwF%$jVkW)kDBZP2J#YiPd1IsBzWptMJHn2&@@RgOAD|B*_7BkW(1`!W6o%mjU z3OSfsI{RxbxuMY^!88$-@P4KFW+EpeAa*x|z}9?^=g708Ll#OSKKQdJ+(D^~ z%1|y}pZP-pRaDlaPYrR~L#T2qds^9Bi~hsW4dmLlg5W=Lldt+0DXD#^HCZkyAtB)> zL^YPL$gPZ3395V>!1zD2nSweitrq@FnPq7Erdp5pIK`~foKZ`QgE|}=tH4e^diJD!shYKyBiHBTD0Q!e)xs_jKn6LQ3JU+!yB797?Xe#zyq%*0d zSN%B+H0*y;h~+;?snziwytr$Jmm{?qe?Q@miiC;UsyZX|9yn4Y2{TBUZS;J<2g~8?Wba1qabAXE2#^tq{_c1L_2(*yI0Lcd z*{6v1<(24Jl+_GqIwLIwuBs>h;RN)l2ew8bKt@X;!uehAUz6BGRiP`vO8ntkYFV24 z=slk|V~e@*(ZNCzBqsE~`GWZ=PQkOGN3wI%QYKGvC3as6t8SYQ0a$X{K3BZ=2R5bj zwi#MZCbN&3bafq#;5O^TRx+zvSWa)^rqsGR-6f9`9Lr67@5Ofb59`Xmvso`8U*8$R zM=z*Qt@$?S@7^=u7oZ4WU*f*FZ7E{|q)-g*REYN_9H&EMFt^h7@-dbiKJhA_yytG! zaC3L5LLse0N01b>={iruu87Z>5SsD`4{G)XuIg?XihT{o~;2p<9sR3=chhINVNdj1T2WhfXY_z7ag4ipbRKzP7NMS93{#e&>yHJuh+G>wfvRcYEldwi{U$0^K=Bu)4 zOr2j{_g_9!sobt;R>4FG-wl>NGOA^>g*WniVr8G?`7z?K zf)?}>*1IpeiELbQtr3c-5XGzq+Qxsf-Wjr{M~esk^uitMS@5 z`87!@{F{)7v7iE&7l4I9R;-X0z|6@+`SF{%*I+*Xq2qBL6>jaZvQhljzU?O4UjOOD zRJGWAEFc^XQPkk&bDGh6o+`=O&~YaRd_Et~IUO^4 zX@hQe-P5_+UXf}&NQY)P)w4K!)mgKXV9$S?1^m(WSsz0bhzjKnUnzc0{`e${jl!0N zwG8a(_Gg4sDe-96VJUH71ap5Fe1sY{>}W-iUwe?r-0#%G!ecP~%+HC}u~?+CQ3`-S zf)DwhmeTfK^^O_%tNxmGMHcqTf@?>%XFO__Ht>2GlC@r@Bn)|k?)&0J)u%2N;&Y-%Na}@b>Y47 zgnbQEYal8lR2z_zXg{umWUgt?*yd{qh0NW2+NID zSD>Q5=os5CU}3o)VH#i67%iW#3E5VW)!7=Y?H=F#4y6i`YLN!9hGG|ZnmTc0M<}?3 zt@iVA_#%UQ2lY3^iq6d7;Hi<}#&;($Pgc^2PJhZV!V6e=FxW`MRquk7$@7ep?rXi$ zlCN98A0yP%l12H8T{&LzN%I!t(SkF|W^j4E4z7g5O;(nv;%{}LmtHjYjgaeirYM#X ze+fEK?@=WRM;6&=Fa<{T-XQ$IZ|%^;8bo({s~&9`!L7NP{Py1fD=VPiT-LY@n@?PC z4fw+T<+1~MEA2LIk0;kSUAf)@8t$(qh3}pT%B6(V)HBTe&9fYwY#kvX*?*9`xZd8VGLs0p9z8bkc6;1w z>B|;{a?+SOy4bj(z(0+KO~y5aT*;Rfx^B>)rq3k*{Zx#IouyX)8PBx-Q&NJn%hN8` z?1st``*mM!v;sk zN9+#9m^!qWErnGbb71DM+xLd0Qk}Up9p`t3e~K3&@Ot16MTsISR3pGN%2PsO>`-Cj z6$NR#PM^$!Z#D`|O(CQx94UYWi zm&0fz_>li8jr&&H+8Et^<@wj=U%l?u^Ppj!9&6xbZF{KAY`ipYg4AcZ1Hcxwv7JCW zfR>AFwjAbR0aX7Cj+}rqmZHa%5O0+>u6z9--E;RS=(J67F`Y~M94iZ(-c+9el@LlC64=F^`XDNcwMxQ0U=rfNaoU7-eihKx9V4&VK}MQ2l#I8asx z#&nXL-H4kxeZXAIrasl9z@;@VgV2o)x99e$7@SAv61MW~dNqUhzqYl+iRi?CN(L>1 zdhdLs!|$v0`V*XghSqqrNqp<&vgc;8kb-G!bC7|jl8ZwiCJX%q8PadSeu96W=@jgt zlNDaZaoVGCrFJx*qt@dge}PXn8;(w*{R)U zKk89Ts|O zfMB*D<63slw+$bB|Fu`x@(E;@teh>}c=DJV1k6Ff{Q~tsq#eEc`@B2B(+Y88hSP;W%b|NgWoPn8T8y$$;Yej)@y zh2lSRLi7m++s^A@0*J(ox(P`(qBb`N! z_h}i!{dD(4d0P0AB?sl0!=X3WvZ+>4xUfr5P?`TAa%SIgEl@lKZ)0TLhW`6i7S=&a zaX|lrNQ@73+;cJ>oWEj0p77e~CR($G$CYy^g84B?@6uP;NFp^_&pbW=v+U6yT|c@n zF$muuaRM`kvYFi>C{k#fu#%b4hg+F~_4W-12Qs!6b2S)(G%(ACiGQi#JJA{;@e3< zD<%|9G!slCOf@`65^2#tTYm*<%Bl3bXHwwf=k_Y$o zawfFaJKEe#aFk$VS9R3*^Q3FKo@A!sA3)(!fXvt+2^23M&pB){kAdQpvO@LVZ zZKfD6X=WbBaW|L@?R(=$FiG+k>W}E56O>I|6FC|a>j-a&3FLKmPh%5_9VyHr+seK~ zKKT`7a`MJ&$mfVf)ce+1-%G&kD3QwtsE4;e*)wAF>dVY^y}2V=>9ple!11!fGRiqb z&&-Gc*)PTpo=k6c8S0~(6^J+#Ku?Cv`dj!Qc&tf$KcQTC?{G@!?JRGn zu18eswjB;5vjMAa$*&#{uwy*_KonCIqT;@?J8a+X_reWeNw8a=b_xBK5e|gvk7=!Sr{yLN_6~`;t}Yu+gmxv+%@0*hJx_8za6DqH(KUXTKqM?LVgvb6W{0 z0o^Y(mC>kr<#ALxnVZC4ZQT(;X>ti<_bPdHY*Wiw8q4-s37I21AF1>a2gNszV)p4?*x>`bWwp@ zNP(1U?^6Hr-$_^3Kryx+xQ}sL{qk0d4Thikur`r5-VAwixg4oU&i1I0Nh~2tSM!NTy6@9!Ftk)v9XdijC+|^b4(C~fTX~MFh zlql+*!U2esA3T6AX0X6IJh-j-*ADpyv$$`Yfg7xq^Pi&RU_PKA%>sf zIYTdP=xN-_=hAvn7@F(!vtrigBPfrAETh3wikbR%h{}?A#N&K=R$escADR`D|HRU_ zNpllH{}hGWJ~E7M(rDznu79>Ynij|20u0IQYs?_Q%*I2`j%SabqQ%BX02cyo@sgHE z56IZVGH|&p9-c9a`!JM0eWv(pjOFx!Pi)IQ3&XE|X9t7u-Bnii;f9zvj|!{0FgBYf z!bIjbijjR{vv_kiPLdM(eOL9KuWUW2wYjYMfrow@y%_SGdCt*59f1|5^0${1ZVp$_ z^FZ!Lr*7^RUJ2tEYH;)v^lHe`(v6*rMa|$dxCCN_|TVj-YP^Tb2f&L7A=^uT+(G;AB9~>k0+*>X?PB9RB z3mnNHQ`yw&#D{|NrY&FG?R)7R*L{D6#Q`Rm!AVMm<(w?iZR>#muxmzRBb2S)HL=^i z+(G1Hc-I}?x4ZNuU)DG@_%_9zl>{8i5_(#YpFHdKou0RllEx=6J$ZtXemk#@gL;aJ zibOAc2_$LmYk0-VGNOGhLYOTrXcp7pRNY_r6-iMksunIiFe9R10-t&Dl2mtVGkVUD z02?)3k%nJhxf&z4f064kH4o#--Fp-;3vU`-Wb2mc`4_$IG!%`8%nLJd{~{^}|A@kA z!%tWaEoqIri+$TpO=u5aA&Y&D92=y5G#EOz8kK`;N51zw-!roDQKh7iffjUY1V1PaL_w`=11RaR(qvxQ#(n2eLuU2pI*Uf^<)T%Z;HgB z1DIi~VRd){H5!MB);Ru7zIM59*K2<;G=@bV^*y=eJJF!N1$}%X717jHR79w##n;Ft z%8JGVOxI4p1ioZJ1^8I|z83i*2KlZ{(w($ua~T?}r2`vl-NBU5noRlPZ#G(ZTXh`-KmF($8YVIc>mJhOE@hEAZfi6aOyz%YA4QhrB-nAJaFRK zq2&I^1!tn8VS3$N(q^U~`SECUWvNw=ncIL58_LxVroW5J92bsf#zU+E$tp-&BMFln z=4D?^a8b%9TLQw$0QW18l{+!&>~`l)kkooWSQ#G`~L0z=!iaR z2o{T?NbIIb5g5NigH>@4`vL54xYms~nb!v+C(b)P+YW96c!64V1!+l=Sr9zb<{c_r zEFw*=EcHY63w3OTjeA3$;~bCPUiIb8`V`TDf(q(?^z!zz`}AA6_Y=6}TxP1#r~goP zpp5N!a(I#nSrA@}s3;{kaCS&LK71iOyg8$Lf7J=4HUKj-ilaGy&|PEG zQa$b~de%`ff`w{xo36b`^K-O^y>lF|mNJjo98ZIf2P{?+nh?dv;KF`<xy=?7-VIC?jgo1S(fK$ap4AzNX$f%&+v~)*2b;SSjE{|^*(8vjAWN){;9W`uk zZ?qeHWSTE5MuIretN+m8APr!Iz4->?_cg1s!yH(&;A!W@R8n3jzi*C}opS@g zJl*44lEl|``h?BN2JscXcCF;5Q!Fq8^aWZO||CBAz;m#Q}t3^YZI2qTwwA|cr-eg zJgvCdz>Fb#s3Aj3?et)MFHB-He6Cdrqv3HqkM{u9=Jvdm;{h{6kx()_)J3!A%Otj3 zD#fA7icC4-$-vc2;v~sJ*dZj=w9|)oUa;COyG&jmU0d+yCtIuiICL48*<$Ri54Ur! z1Z38hD1n0{HsmI7G7_tt%upNST3)FrL1+AA`tdQbOujHKABT(>A9&zE1txot77uheekm zs0M%M5y)a9{FL=?j*Yj4#ijRWX;U5h`{du@433!HT&1r_`hutGRjR$)^9EOSdZ z=8XOqUyI#X)#BAL%p_`k*uLUnsG9dpEm|InyD(o<(+hWIqhS{2ZE%~+{BG3YV_qDL zs4ZKJKXBM~;e@WKeeyrdh1b;nue=d>jz0(yC93aq_jUB1P9?GoPz|(1+!vvVuQX7g)HV#L9^gk?|QF4bwZ+4 zQC;YCZv$9Ut?+v{RJEWcltEogeqKSeOi#;!ibp_O_u<-kqIJDBl@@OzUq0i@c97o~ z>rU};5Bbv97ZkbP&3R>T-L#XBjKwLe4Gyot%v>qq58Y0XW&2x$8G|CV^Ue>0LDoeG zuVy(>4&Js#h$qF0ZgNJ|>iFbF0Pc4jmMho=BmO%GOQJVRevdU)e2Cdt3HhvI4@yQ~ zHm@P|{G(amz$`wH#Zn&`aSV0|;w5i`kVWB&0F!qAkEdipJT@)xlCDD1K_JtILFF`- z(Vb8a5cm*Y!;NI}fJC4t(CO|Q|3Ay1Nzp1y;mE}CTGakBA|8}iLf&Y5#S*AluzG{{ zeYkZ*EIDF4M0=*3uptRpDWOuVOwHz(gCp2flgAN7F=Y(`b~I=<{~jCxpB=LXzfVT4 z*Mdxd9oD<|p|nkOoghrLOnr4+ToU`A2=a<~qX=&3-n{01#4#(m8_MCmAxzqQ535Vp zt+m~m^~_SIbBH6=Cc$l2QECL$0}=Z60qNoh(!ZigQd!2oXnqM9cY=bdiAeh|>Wj?W zT?i<^@EU{XLGL{@_=jUuVayPI^hO~zKpcXLnanCs&b1g=io{2(*i7uWfe0h>ON!{t z9@jr%^FK%2#%~VEe>Vk*h+92b&=N-rv)tfF zul-~8F|YM6g?p@zDGVFlveeAxIr}Wyv!se@skje0- z$(29Mfk$Cg^=)}GX7LH`yyMyDY-%Z22cvltzPxDl&&ath=~ZjL{f`M0*B|%wAhY^b zx@!1Q+|xFMzQp{e$%mH~hbWo}s_=#{H#}Ma1xv`r5R54uVdFe;H?_+#MgithrXWQa zJ7}hWbrefvgBcYjQ0983YaV3OIr_^wq1Z{>VX$Y4I%L$2Kk#BTf{`5x_A>ba0%#wS z@3m<_GN6}G1?d|0PvqgacqJyQsOafq!z98cl6&tm&GZ>Q6pg#m=Og)+aPo+L*_Hx2 zN?4-*4Iy>=&NTb7t~-=UtiKsxdL{SbUmU{LV1hD?ekyN?3y=4e#@~U;?0zvbhA*D) zD2SHN*p%mOt^3b+bUp027o1G&%cofSN*T$>aW&c-k-rEc{yqKhh#REq_&HSKI$u$h z#U|OcIucd}w4`MF%R8_kBy<&q|H>m`dL0bY@~$=+U@e3S;ZdCb&Gvcv+DOas_vR(_ zw!jTfhK8e7treVHxwM~;{ezr3UaW!nYU+;E;|HKD-dZC&G$fw2#Kp`75hC&68I)djxNe-)Z zwa7Kx{Jqy7w^CS{h|{$>8mZTj#Y{2UBp-zCsWx1iHFG#~fK}&oddT@!T$PL83_tZo zNx*s~YAyAjFrG6)UncM^yC1#!8Yp>Qx;UvQZ=pghZgn2j`0p{*&x;sOprE#|fZXvZ zfl0J~H80bZ);4cd2R8gZ5rJ3tgzjDt!Cq|&xD>eN16k2CG33gkzE8~ zny3lu6b4=Isw?yC_-tFEMo#2+SSNa=Vuo_uLBeG{7(c(>yL&zc<8-^40aV>AsmpkR zwy%-kgELJcAUhobpTbWc9wlY(Qw+5ZP1@pps`|9Z&MgW4%-AwoDx5J35@C?G0#H3k z`y4`}mA!;Pfw=iWAQ^8N4@uqJWGgAKt&62`h;OD@dYSBjU7zENfAhGzpMLUP_r_x6Tj}g* zK-tp-2tvS-_#0w0^*~?R2?0=wS;cyqa>`BardRE5F(7I*&Zj;I{Ok`=1Z2sH zwZuqgA&h^X#wkEezUQU^(F=V4F^G(<`r4AOX{n#4IDUbmjX)AkHZ%$8XJSuw1$|tS z+;fEqQfr_v2}JGc6NcQXg`!>uL&x4v-SdNuDJEmb<{255*`{B7wyKNno5LTPS9j%W zW{F*MO3J+cXY7^N1DkLOzWwjPS-7QB6iA#ThDr*A8w&IxK3yl15Wv6zjrFF7e;0;H z{WaS21R+hqPf5)@z*6^sdf_zg%(Z<;_!YUdfDMKSp3O;_gmh2_o4k?%1h78 z$HDf*m(P7wS?qk)eU9ti=3Xr0IC_?$&wDyn&gC!totJ6eP3mk&nf6VVBRps zOsy{Wyw2@Q-6t&xnG?o^@bxTDqSv)`Gc4iae%z?(ZLp~HrSCDCA9f+dbu>+l5JGm~bAOTPsJ|W9hqsbB{qsDOX_6SR*U4$xT zl==J6qM2IPd9E+((&CW_jlVb-tTpaS`*LYD}Eo|>kFq8&zB~ho8sK;67iqbc2%d_Fa0%jTX4;eXo-!q z%D|mf+YdY7^{r%O@*bljJ_xR}tHa^BHjroUqs#_4`L%o305>EI zzULZa7F+l<=Fba2B;%i(bgk#TeVS*ID9}>|9#r=dtprTXk8y$Q{@XByujcFPP&$;Z z9Xp0XCeDEm(nD$>UeB?Ks@j(1H z^YUq|l-|QyHnBb#X)sDLm9IBgQ0vS(sDSXpj_Iy~_vfA)Kc5ga z+|6E434|*{2a-8TVlVhVQYGj2(D?I7dZMO%y|}N$8PuWN3TzVvr<$p(?685_FbleP zKrr;*6G-!|*ncT|JoAPRbCuPAU)i}Y+l(KDzxJdM^OHqnfz*Up9RFpIWqAx5M7QEx z2>2yp;J2lVpv&3MDH>I+dC<1X;!o%DeeZ0)bn|~s+8rL9nl&2hXZ`Nni{FKO83-{0 zzWGr?mw_&b*4?I4_OJS#^DA)NE=yb#uD%3UJ%i9Y7c92uT`WNaFE6j+Q7lH|;;c3| zv)Gr*{;;v_u1ry5e5ZdQ_`zgZBj)DALsxuw#hDCL>2wfhr7rlu$cBaX4s8%zapv}6 znf=wFKOw})lVBNejshlgzHjFWU&m8%A$lXe@55v-*7|w{|5C%GL0neIRTkoMx<#%; z@cK6m>#RJgf2IV^FAa!cB}g*Xf*53Ec{*W4V09xGXu{% z8qU<@h}Q#?si6iD%}fj%hpbVy$NSoCpl~=nGx^yzu{F0Y5(QyB5hZ#&St@L$L3WUw z!$x;ts<_nYY~D`{t?tw@%?s&)0E{DhDi$8meu+VMLXIa^f5hg{9}xDsjM$Ar=)He# z#nAO!^QeZlB!Fpd4Qe{YeLQgXO!Tdl1~kRLZ15fJBl&~*~knvrsgY(%GccCKX< zri3%W6s2yQqL2n~{zO5BAHaRUMj1mqZIUl`w>PDf7XV6)`{R_*?zzO{ID-WHm0RHA;h6nqo)UjW48w;21L;svXo_F%G z9JKhC->Nva1DzU0rbd$C=ETmV>7UqzwkMIPX}VHjslmRiB9xx#q8dk_mkCI~UMei& z?j?Vrvja=E{(79H5Hpr=&ANsB!-}KWKH10LJ!KVde#Tu%)fjE^DRA`Q6G^+EmFJ{? zc^W_a{OON)wlnC8SK&Jyv>c*5@~@e=;>8TaaW3BSVm|fIYoTg$z}(IJ%}HC>`;e11 zzW?8rzi+TPd9Owu07gJtzZVPrmL-7q|NEy*`_iXK-$fT)V0?K-Xxl)D8mT)waX*b2FP33={!ZRwl8c<9S41$Rsi59D=N~ZR? z2;d}X1x&6CO6_pkMT1=T#n;U~na&obZ~8jgnM8ukMkE!DC5I6xDHiUB9a;oKi*o|l zj!x}DX2z22I8;czA*h-`SFc2j2Hlv?s;GtSH8kb@=rmYC(eJ6CZ?_`um&=Ow?`yFd<;nVq)w9fdxu~bn!Pu zkxqw;*Sv_gzWR{ep4Y^t`)H4DrW)S@6Wb_#8wo9pSHydaEkO*n*$-mTpx9~}A*8>d z@<J9cD(NC@Pt20*(3QEYyKzA?wo%W~=bG1-Qlda}Tq1FsY_B4pI z&P3gcqlPh3=A51``RdAjxa{7&D9j97CI=Xs>BBfjl#)Z2v^n>rt2w~j!05telcbfF#dZ#f!)cU$K}8G{q$od zeE&o-AN#-utlBfQQv@YiL?wl@;8iikGS|#wfmuu;4LluUj6?zz9wibrA^l3)T%#ya zlt?oE2suE~_oX1o_jWx2>hGyXZ)29ys%rKR0Afr-c_>+mz>y2qaPd_;Iqs-g0L&V} znuzgJgw_Z#dPFQ(gSrA^A}$8RPgD45oS#m6`0~VWkVrI&6_<4X-Q}M#4d!S}pG&qL ztMALxkh7D1d3uoiaaRT$5-1pZ9#j%{Aymh`1>pxczF2&cl(mNCr-Pk!KimKQ~iF5@Nu31-t%`WCEl~Ikq>|H0;lqp z*e(JZtQazyuLKDggkf380<#Ef`cj~3AW9&T(C^qC?ah~FcB>_$`@ts7yXMm`s-Rg1 zFKSa8K`LW4b8CrFOMioE{$8U!%3Q^m+y>joz3V49?cH~B@^SmKWNyW}8$VAqv5n63 z2%+i#k-`K@>nUxA(gZ>5d+g*- zkG-AKPrQjk26uARx+6Gh-vVotqU`6+wbOk2v`cX&aM4Xq=IQ%QvB$s^m2Y8U2M?S) z|5`@lARm43O}u!|%URf1xA#1I+mc_5oVwbWP|cs$U$thuf9BI)rz@`c-0yS}c-%Px zz3(RPq1f%mJMpu81e}%sh>v;LuMXBvH+0+)eeD(N=(`qP0K3j%H|^y zW7?%DE@4xyN`Ye%K49v;I0_omFc2oS1s2U!M4}CiNt`_h#&Fxp%@G6dde75;XOhC>3IjOjj9UcnjDFz43xwhf zIyNGjjIk?-E)X;VmSI`I0<(xx3Pep-|HV95mrL{d8qF89ViE=*0TtJkyHhh=NgiA_`Jvj&UjH5V-Bj<5a6EapA720uN?=)*T* z{0!}?$>@yb?&$;Rn_SC=&K^9lP1(3(g1L=A+rxm1440nc=I^330SheepW(>)lOR4Z z6_Vx!lC(h*IM_P?V>RsFU=$z}Fsn5toeo zFMjmF7XZ_Q)t_SH`dzE;X}|Haw_LyKx}7`Q8$69kBc@Y28;&`C39Gk_s*VJoWMjYm z$v_@Y!7uI7v@Uwz`K1BU;hfS4lj9DyXQ=BM>2CT1RLU5|MD$#@z>KOrLxQwj0 zqn}UwXfIZM^_9Q!`B$w8Vu-}iHB8<4ZHidojMDLz!CY25LbejrZc83ise-{s$R%Gg z=QI)$&1t|`pQi-kY@kYyu|T&v=rISCkOf1zgzr9S@~PgFIi>e;IjNd3JE15&^5go& zrAMbwgNxpP3L%=@vL#wVjUfg>+tXB&4>L2lfngovCD(k4OFsEVhJJOOyA{~w13wnS zmK(3zc;&@kzvrR8(p9cutEZl@On-61=8ojD=w0tUQGcHR9<84L%8wfP!Aa8j;CUAk z-CMNnq9_In1|^V!+ab&`^O z#URXc^O-Aq;3$X^6UCQ@cM{r9x9s#1vAH7fGTY*sdK@)t|4sMEi-=DyJzZ@~kZuL6 z(PSl_!75mvey^wjpC!XlGSj8qHo3H?WN^IaSGz!}ft8AmVX zuFKy>>G}{&>$@BVYf6kU7!8PTqds6m3J#aSNvjc)9fplfr@UxdMOFu*P=PU+sHn~6 zCUq5{c_64)3{+zUzhn^7t1zSo2j~$T%?=*q9w}djN&*mLPeSo_R+pf&Sgm_|0Q@(xLrabL)fL z{>91UK)q_7>dCQK68%;a4XmNjMWamtUN)+?>PXv$I1n}Os z+$tK4nLg*73#=4p5Q^X>Sjlo$AupFyVUW4Zv%^@^Ou8Kn1XW_pqrKFKzhoXis{p&@ zf0w*V6+qpxVs@(xx}(9Q;MS>seO&9uT8+810U0*h*(?BSw9iLqL;zQN}Zj z4Y(LF2CSrD7m1ikks`GMDwPPF~YX%sK!>) zp4d*=x}Q5n59Je^-iCJC95d%e4r;9AX@j@Z6u7B%>Zm*Je@`BF{MhXJ7tdV=sS!OuzRZ&o`z#Ggj6E zRzxJ`GBifT0CU_t24$F1%Dhn~=CxgE{@CO`v3T42ky}WQ1qH8+m*@i_P$Vyh?0BCbSH4%=4JeR!@jhK zkKy^J{0U3v8_L2_FpUk9XtfKOypOQ)-_fyqfGRtpm5Ah)L4-ya;R~yd<+Bg`aoUhB z0Y}7GPf;{zw_1c4iRuv_{bZ}-PJh`GdGjA1{YacZfXS^}XD=$Sf`B>)C)r z8>&iX#T2|rfSd}(o2(Z|=)d)eK9neF>b4^98&pcbsi#C4avd)G&QsWH;Uuql%H34$ zge^GL+&Yk4iRua7jPOeU8zROkPGUOsHGK|gMxn4tEhwSx|G{J$+?s@ribkvijKu7O z9Fyx<7ud^fK5gbcV!&u+t_M<39I1TyR50?>vk@U45Fz_lYM@XY7EmJ^R?QWlOz zVJV9AOJjQ!-E|%M@TG*Q2asxp7$TT_EvQf1(ql?%2$VX>rtQ<*vwbdGJB!%Z-j_Qj zp2+(40hFdiqqLYfg*A>&RncmaWR{@5Gj67%(EvmCfq>S+#ZkQmUsptIWotm2uR4k+9I%-~mu;h} zENRD3#7U%SE9N!Y3>F>c6ctVDDM+VWtx&X@J~rYJqu3DAb08-DKvoLcn3j|n$sl2- z5{>cQKo=o11-&dled5R6bp*RD7wHxI_#^_70EH(`7o2;;vv`mb`RqBTGCk9wEF8`~ zf*ySElZ5*|Mf77(%%c?t2|=^WJ0-Xf3r4FxMp}c+Z%#13F-eF936sR>4KTT@o150m zEam}!C_mr%Z0>IzjmJ@lr?B8V6>UGwIt;iDdk#;qbZ{am0W}48ZQ^SQ7zugMFXBv0Wq4_mlMmU9nCs>m{<=E`qu}py##CQf*8JT*Y;358`brUc?oje>45RYFlO4 zj^2JYy6$^m1!Mccz)UF9Ef!484D#^A0`A`oDfXE=MoH)bffh}zfGW|^y#*Nz#XSCJFy`#(Ngp&DvWBkD$ z_j2UChnV9gaV8{OC_ogOZVJBBCQfgq8sAB!k&ve-dzT+=trqf?v2()%on^M9g>yn{ zrp@$p#j9R$1aJHEV}FUyxZ}1R7k%Z6cYSmIf^yr~WVNfWbkig=x5sP}cvKU>d)|JN zNULea|Nb54OQ$?jLlIS?F*f(+Wt!JFMrhc6`s@JKBo01gBZ}?_Z=OrnJg}3%y+Bk$ z?1EH}B%Nmuq?j=&)TCZNOMy-P2r&uzi(U7@VQcpizkuDnsy=LIMPXqXI818*U@frzhcKUJIV6Jr`m+-7^4M zsL$iXniYlV)X(WN$&)32PgVog7=V!0fLn=OX>rXONY^er?<1(iM70+|1_Xl$*0mU) zY;wx?&g8v+e;Utx!r<-~#@f%q17AkRZ$pYk!VandZXY>_61*Ba4xl!6`+w=7cVkxul*;eAJ*Zdgk^6sJpId6W?o}pBguABU5iABPS!!$p zI@OP8r1F7Kfr#KLLtlSHE0feHKAB{gn36#nv$t7ctJq*Ll1^unI-+C~u9_=`)T0|s zC2VQZ$!vq6AYhD7Jv~YpBUU{|Qev^h9O#P0V+lx13r-W$>M?|5(BqPN5R(8(V?zQ3 z&Fu7`NUAKLLd0~(e`i~#q%sukKsldheEE%B^6@vas5kc4e3H28JdB@7r+ve7=e8&C z!;OEy4cm_9;fY}iN&5$|hF9#fg3}MVjQP!-R8>jGTPn2>)2MY?qAY2|Ta~I~yNsic zj#$l5O^(u;*+uY?0ECc|xhF}z8xmO?Up;Z7|A(=S)9Z(Kgy}hjEoe_wOtm_k^FL4K zg(vQ{+jU)4-1`0R-2c&AZr*g$zWdA>-Lj=MDu(uB5f^yW62N=^_HG${*i$%Z?clnP9}tXq=mPmOk~f^Oj{(ggq$-#qJ; zueItgzZ_PyD+HpJ2W8mDgrq%3z{K?TSR1geV&tJYtohMVOzjM8y=x)ELrtD>%s!Nb zO-o3uW%aH#$bL7oVE?TQ4Ml8p6v1IanRxgr(RYbXw0ZYHY7Ynr;jhgbp)6@z$K=9a@)|MsZyvM0xHTC~SQfuJ45@JOp;B3T%klB^2As`?&eZ5|s zA{m60T6tL8h~>S6LdCQnzbsmh~#8Y3(so9&qNVPP5X(- zlY%{fpGY1HFnLg>=KsyCG`ZR_Wz51hyxmhqW?eiqA?{$@4{YsOb|>&E-oq_^U$ zX?9F)p@=0;N*o0el`<3wmDiZTJkzx!HyRRikV|)yD+38iX(J6Ak(k+lkdlGRNx_h2 z1e|&b%@~0Tsoc+?pp{ew7?N3PVbk}B#N=3%6G@?=tDnGnY?xg(sxh@`&P1?nPX5+= zc-qi9;E5mKE0TC-Tnq{-f=h$N$$d}Sn`y`ck%MQuIA*$zW`Ax zEvQt`U{MX3-W5Uw9}H?Op-Sa{B;>h}K;;8fyM?c&303lc==elRM4Jm5pDMtB;3N<| zdQUiG?e_jx-)Cu!SYtY?Mn{fW-=03w80*?IEygE3cYNc2JTeK4UH#MbAG!Po5BzA+ zqH^2RlkM)iIjfV_PJ^w3z-ac^kdrY(q-${IblJ8bT zeCo@r;zI}U7#zMxC%3hN5sSlNttEBp25VeO05uJm1GqK}OLpJVHOUAlF3-u;FG~#y z5+w<0#3E60Wnr;R&*;j7`1!{V<+{)P3H^Ql|6Y?w#mzfzvlRzvFJ30=Cd(8Lg=Bmzc! zl3n1_O;TmyGz|#ZECn_;`3y*ih}G_bArm^N)2>y3X^eCJZLi}OQ!nCM?>lk!n$M0 zr`dL~iQyN6m;z@lRtu~cjHC)8NKo$UL%z~oO1psSxp*10if>bF?r)T*H7@vSb zTg-6nrYG{6EB}hM7r%J+3AP@D?;QmF!+iAaKjlknUxte<#6?cq=Sp6>?wW*v z-pYq|jtx9}qlEEwBC-m&7ueFSIx^5`3=?&qTSm6LW~UEF8dESnKEdl>dOUyiioy`Ai@{-y!D<78 zU?tmqi%Ws6lBCA9u|=H>)OM8xmWVAPcb4C@j<_xCZTJ)BW#ntYOn zh;sqk@f0THWZ|(UX6ztPn1BhIz(Eo?Xkx?}pW2O_7{n;Ht^yL|hQ^39>2I=hkhy~# z`{{S^!;hWH;<-KBk-xt;puA)4C;9Om0><*Py|3a;2VKHEw-c2nJ{Wuy(17?rR8Nc^ z=ciE76u?z_?Lzh%^_i6n9zuXBLMKl)$B+_2j42uT%xDH?r@-rBu9duh=Xn1gZjms) zNkr}i?yeI6P{kPM0E_zyx6i6wBY(8MHT|q;U0-Wznmy*v<+CYHh*rSP}Qi(Zy)5Vt3L0ac&rNH5ES|G+`?R%;e0`=@r z;`_x2HukaNFJ8`bU$BUC{^H5q=X3aJU!h?FuCO@CK7#+5H^c^FuxYK9C^0$~?mNkG zCvS#eGObqOvbl($7@rV*QyYQcDSZv6Z=9JH!5q@q9} z1jGcKq(ov(h2#WaP@GNuwUMMa)Le}bps$$ZuYYzr+xwow*Ux_X>=V81t?R+a z((7YMqndKN;^4ZYHkcw*Q_Jo-+FCU}&!s0QNeH>G?*jVS)~eQg*S6b|k$#iMOa+5T ziDIz9f=wrZil8PCX;TsCNQcT-R8)8Zu}Ut&((__Pz%<(Ix@|d&hUW2{Qj(@$L zH4kiK?wo!G`U?8``sf?%ODsmC{Ecp9*`!gHG|DD@&5}mhpno{9?1(X9EFd_P0*p%o zzhXcfK@4KDs3{uMrmw}UVbGchLGp@#?7Jr>u^M>}KY^qMF-nZ-KFLO>npHCC#LVe2 zo2+WibkQU*HL9V%Z1ce6KAdyYsa*Z>=k>hnGw`z)^4?W{!(9_e0Q920R`AY4&&N+I zRi};BNlI;DW0hpf%b zc>Wgr#1=8;eqa@FAFvMC2~6jptrXf#XQw9HozA@e#>n1thVI)rHL*{}xrOakhmU;a zX8!8bW4e{V!o__@?6rKjy#D8#*3O&fw9}z2X&X&E`J~r#)zzQ<-AVwDNCKUia*GbE zJ#Ir`ZEIr5s-x9Jt3gmpcRg2qsD?V&YYIOr1BHl+#frh^LNuM{$$DA}i^+a|#$=hU zI*jDay9T0Bf_S{C2pZ|&@dUhjs03|xs2)0yTdy&k{>o%I_3Y!8bIcKYa_#M#**Vc> ze0&n$sfaO^=^Ddtd_yW?r9|~~rYyTQ58{JGoX#>I#$gbmB&Qhizl zvWs5LU|&xublDO7+p3efc*|?BI?bG7ntwU+EqI@7-P8Pp);g<1xoS?>Ir!DjZbgqh zD-M13ED2cwSk>)SUXvJm%!un9DYYemg5JgjBV&VqxW$Cg-r%oK{vE(n#)iAg5EQD0 zwbN4_-;Sy?d(RnO6?|nUhzFOA1|RwIFZiodpV(EPEnL`l#9qsX8`oa5>A|647kx!- zIrjfN2|T8z0na(>+J->?w2m*H(_XTC^ban3<@Td5eH|)A3?|KvM4P0&d4WeawF=-g z?*aFSaYUOhTAS28#wdm|lYgn+OBw*vMg5c6M?O)r8qfwotl$G!;}ZSV7tonLwqNli zo-p@l{`mzj`n4VYGf)2-eSJk*#g8xTr=RxNMq15Ft^R{!WKoD`fUS< zPpwiBE2`MW0EI>*L<%z4N5Bzq!6!kG3KA;{uk^b>VUi%o`AF$JHh8R7lo2cmD=@Lj z^5UcwFeExqYRthT%s`0@*)cwR_sh6+4_6;t3^6Qyb zZeu$1VelE*&r_G$=|*al+5IJT?_QtgA!PASCzbskr~-JOA6xsRhFQu_HQ@t=g0bjI z&KnsUJY}m1qnk-(|09Ec8mP`X=fv34!qyj%BdviP?u4+kuPFAue|+SR*0!czRaM4K zj8Ag=*I&Ea`+Vn}BbR*nb9a1h(V}wwqlF1PrWS*AD*|; zXhEsCLW!|KwP`UAef9))JkZDeodIjgADuyvx%{!53MX$3ZIpXOUXUdt_aZ=oy< z8o)LKt}kHAh=^c{h_PUtVjLI;wyC&*Krtuc29#n@u??kYD#d`{`W1C1Wr}?IC(|95 zC{bx7VN_0Vngu*61{F(4ZmJ3NbQV>cc6Ep#g+bM%y#`oB(oDT(&pt6GElm^26$Oa; zykfl~#15sI;r`J*dCQ7F;kGZlc=tE?>KE{LH@t}vznD(tckBm@{+vjPTp`?I&l{N-JY|c7 z@hu|1{^ais{(Q}H@=33+bG=vS7-MFp+f}t}U~v5qjdi1O<_J@ieINVk&HC&=*iRM= zHvm|?xbN`2md|Zmd(Fm2trB=lIs(;|Kr6Hs4}=BFcOCbGmv24hJFi!jQhW(c&=?Vu zN>|MmVN&mZ7uNIbP6Y4#=I2!chd$(B^v;6oEwD8^$8r88bKb^qS1 zzWgBKL;G{`Q1XLF4>P!YlGrYCzhcvKP=m8T zOo13Hi&l;p66I(cN^>9}PAKvwU#&$yBy-c`vYk)nm~_Pjo=Q6uQL;wB=L#Sura&tk zY0a3?Na10i^jPt@=qY@_*;EY_(PN{>N;|U)9!&n44P8lb!?u{?CV9?x&*q|kJdGzF zG^a=TbS{_u;D?;M`dySv&}Z6Q{){)^gQXK~YTZJfz0f4mL9+}wSKKiqW0>d@10W%t z>a7~&i?e`W3|Zup`+qWiARz;P>9Km7dH=}7&?#GN7~7&EztPG6YXI#UDk=;Nj?Q$J z%pYhj8=Yz$d+YShGdj`iF)=o!ANu>}$Vta6?Xm-_R_(gvi=Vmua|;)j>!&7XD}n#$ z_x;u;fc#=M5<9SC$(+{Sdu@Np_g=a6sPDesY2oli>VdUBg=(E{T|%ebfYzE?$(#CC zW3ml)I@!`;Z?5eFy4OZNxbTmW&hW|efxODKYn}# z_io+5aeu#(a*n69ei6l>r!(FpdYAh4Xh3W-8C8>nO5P&kQqL`dl{`UM)1Datm3*`L zv=ky%6p3|kC%LW*sZ@_Lg9$>R9*0NNQ$)qZka&Of6fv;_ed3d9F#06B(F&&tg?GNf znGP5%&=bqj>;kTXXOP8XKid)H*r|z0-t?*` z^M)56+D!sKx@_$yuDSZ*OZQmNTt6`xHf46e|92;W$Lwyv)DFBsOZwY0GU4ZLICg^( z+ZtPX&ry|lYokjie$0dU^~5fkz3mbMpe88=6GEO6bQ=3~>D0$0qfW`108Hw?%fRHi zJ*cjJKF#Z1!WaMg&w1lZpTH5lCt3|g61dL)gbTKv!&k1qo)5fzg0ZnSMZ2GEKRtxG z2ez1Z;0&FyL1HK<=V(esrNtBmDGkOruoiKa=#pqjO!6M6j6tsz}v5VH8*TNny>XzegG@}kTb4+C0pA261?H4g=;wD@GmgKKzcr!S}`#;19T?a znkEZam1MXQqY$Gckk4meFVlHmp;PzxweG)G{ps$m;|h9f@&1vCIWO8OVQlk%rtJR@ zuG`+0Ae7FweTbcbh8tf#Fm(TDYifxv%jMVIwoa`pLH2%t9k z<^xvK741ktQD8A56k-vZPkn3#-y#z?K9OtQ^-Qij@6UMQGnW6#zi%z~^X-|>@cGV1 z8ME67<9*CKbbRbRmnMJc0Bp#xzJBs3VHYftu(& zQ3s|Vh(#q=1Y(lOrEv+dlGN`n6(xuzV$;-K6e5Dni$5Zkph8fWa1GTo=o3sg5qNLVpu|q53VY~2 z>Q#jqG_;aR|J%(uBjZCa%00iV{;vrBUxy2bNT*fBPOI|O{=>ufj?7Ff4Mnl{b+@h8 zqA2BMK^>ze2O+o|*R zzW#MiTp_W*icO0@Fxb3tLnX}xlnBA4lPuAE>69^&K2IFEU`-Bw7g+!O6L{$I!@2fL zzZ%)UE?&tMt?$r^<4oOlFx&3klPy19jA=L;^ClTwHi?Kb@9-G_M%MH(@8C8=`?n|t zg{ota;D}lfLOQKcLr|N=K9YgCy!#~k5K8SynE#oWC_xhw2nQtLP8R4GjaaRy&r%x# zMtq(E1hfU}DYe4IkY)v<$Hhny(;!fjNMBv@=e8hyf21iDO=;o1a{kpPu=ubS^Zvhl zgt5n#AEI}>gA>2|UIt~F>Db`ZeXrqfj{G*0?IIfm$Bg_ZNI!a?JsAR(PqMwJ9zvB2 zU#pbBs-T3*6Qfe)&q+gmsSVKCO2B7rl7ilD&l?#VeBl-eV|DP~{a+RQ{})`KDKIqC z@ymw$%Dr#evE^@f1bxQj_>8{kRmaL3UVNAWGSi9=o%OaA?;D<5+^d*cbku_X9zTJ{ z&u+ks3AEza;(^Z6<-3l*^wf>VeE+pYEDIAH)*6Dk42*la-hN`SR#M@g%6D9tMn{Y`Pa38KAh~Lhdi8kTMIhOXH%Lq_ z!}T`q;3-Vz8gZH*-n}o^?|3#BpZCkjvU=$2wC_BdH(&EVd0=uc`mAT7-N&V;ypO(O1|JMk zyK!hIC%gpPtM{mQsw!a~8hpB`Cxk%gC_bj)pXfc_M|@DcDxu1{fH2zzm<$l!X5X`O zV(2BkRNp=M_MZa${y!#x(!iYQj$by^Ecf}vj!kEbsCoL-_#}UI+VQ;ZltUGe@v-Wz z_rCk*7tEbkt`32Rfia-{-;o6D<0S!f+W~2IX52O%+Hm~(LZY8ucK=ZrF&a!B1&G*O z&O50WdbnibVNxPU;97ypVj+XYT1%r8Zv4<6aN2W^=BY>TKGF5n@lSJu`vHr$KZO-% z9nY3qm!mPz80_F0Aq}Rq4bcngVctQL9CYd^NBqey%6Uqx8sJNynfh~S=B>qzG^>Ea zNP$ELln5mz+AQ30DM^V-)e9CeNxm$SdU6L8CMOV6AjYPjX)VTNNwipuvH5!nj45)N zpSSIbL##nvN{R_PNo|LZ4T?f?pKf??=P>8~=t(^Hls9tL>yLSa_+gx}J3mfq^=J9i zJul>j%}->goMLQdkTZ|HoTCVfOz!%@LNEnoe+yeGe#YY4mM~)|1_R4ZnB=I}Y-j(ITlCKb-zuPL zAe5-i_Rva!i7DX4mKa=Gd!%=RCkCrF1CR;m6ETz)L=02yelEZB0JiD#`QkY*(dg+u?lX?q@ONrWkMa@yz}2fy@?ki%Lny}{RZ~gn-=1s4Bq5wKLSnS!?bpFn}c5LYHvz-_dC zuKw(QSrs5W4*zv2LbG$poYvlZ?K=K@uiARV4`1hOVU2I#^1_L9VW)ZkD;OL_UHV%A zV{o+s+(CQI0sQd1Ls<2_KkfdmEA%V;eB(-1{NstZrqJm3XjH11w36BufxS z%-yrX7M7}A5WFS&bb2Wc2}QC3)FL7H3Q;a&q()B&N{orzkI@sWh!TiZg%5)GX+ntj7>Jd}dnK5d%|9wU5ju(wX<-q-E#`eA zqk}KnB4K>hjkaDGCWC))m?M+GNFFfta-L z!{riMtzb2k$yh_95&7n8pU<7&I<5PAF1=|r@4o0J7VR+?q(kUfs+M7J**FJ3ca$ZE zv?&Gy(kba+(5gr#Wzl5H&Ydz2@V(z>dSuQ2Vej4J?5wKu@n`S%ea|^_&fGG&-xC4}mn4AH zD1ron0*ZiC0js5=c<a5`zd%@4*3<#s#}|ibTu=u@-E7P_u;?0UH7k zgUEs`!x{pS1sef@V8}p7V8scSkb$hjKMjwzzNs1fhXee6>plOk$rWfDZKN|N7jm=q zR?BaGez^SMd9&KWA6$EZz^%XZed5m^{7j)OdO>Tw8*UjX#&1bqFgQ{ZKob+l=v-P; zC2H?J^*|7^ZA{y-9AT(6F+v?dNq|5r=q3$Vye@!t8hlE*xxeNJkqWWnp?UbgTMr`H zOJ+~T?GJ88-%tr@OlX@^!E3JU#qpQ#Lt$EqKt<3d2cig?B9~|+M92}KB6pg@m-3Q< zR-rHHLjYMQj$99n&~X!V0If1k4^Tq5!DZk_aRIc15MTZW2!Sy4lxRQ3)ULe=;CT|t zeJw!Xes&W>aHfBLG7|X3B4?JO1C4AZz{rrst#@QGr|V37>Cex`q_zMejDhkFY&@3b`5mmpC5cJHte5-5RAkG=*Tzl#Wy{O$%O<7BB!$$xdiEYez>G4 z%2z{9=}ElV2a)Ih6GL?BK4%5X0`d;f1c8C;u!Ws&A_Q2+*A0)hURcyL(yNr-{{Qmi ze}#5H0N7j<#3S{XXSTNXwq`TK8@hW}wB%dV$;VEHQfNJC+4Sj;KhphTp%A3ZXu$6{ z{We;GBenu~Svx?L83j9iPWg2|ziedbeecOgE`)XT-atZVtr02T532wO6aqK^O$CnV z61Fg+crrF#e>%Q@%|$Q!S>2`=_nA9jsv$Zu9T3(SFoRGk>nup5InIk9;yL&1PI$*^ z4FCy2;^e&{+Rf-$9UT2RTB1Y5;mk(BA(+S+qBj3x1V^H5ueB`+~XzVuHaBoHAev0$5mEdy*p z)3{Ra)mM$lSpV|LzPs7WZ=-TK;uF9j zBSMO&wV1AXwb$Ht`N+~=TonbmP*LOpUMVlo;gE2x{fXKnvjicK5s0$r+d2tP|9CRi z{KF>>`8nmZh6+_MNJEg2Fl>jhp|%wox#pxDUNCNLy=UM}&bmLWP zo1&x=`gXtxUP1th6jbWhfCDdD$!=v=SfIU5h!Q80&TxuGf%cBXUh`imZ$s|;Z#Ua# zXiEqpfD(f}o2uBfp76uZUJB6`#Dtwg+p(kXc~IIw2u3bsWR*ourFim%DY);c4kW4L zEKF)masJ6goWJ-0GGXdqD-uWLg>|h6TWEGOeWeUQspA4D3o)rH|H-uguqntA*fNMy zC`w=`1(WOlt#$hiDGM|=V2SZ;dR=Lx@RnZ{{QuX>{{KP}2$fa^mjv>&OL_j} zp8VF^n*yWhmp;GdpGzajlew(kNsQue0}uF}NC4xLKtq>i6dJSUR9|!d71iaBygQIw zsBC~JbZ>nPH|p{Y0ivvi3K@f&XJY4uF3b-X;$PnXR^&1VAN#LwdH^TBsSjltK>~|{ zZiivC|@!=Qjqf$M0C)FEAX9Wz)nX{!+Pm3$NLXJ2tt8o!OyL# zm-l0P?-mfnKBW;_G@~W5*!*G^kNz@;o&kqf95=g;la8(94NLk_h}>ySmc}H;l`_yw z{={d5+Blh>W-<_Ws!M7h;wlbU12)D5dzu1bAe1-^z$XY{3o-al;xw}me#rFJ$+Lf2e- zCLQ$&U_3AwQ!+hoJLc9_{NnQJ@`tYqR4xo{1}f4B*a?9-zQ4lguIYICwmJCB74O8V zGdjmTn&6iEcj2@D@i>k>Ex|c|JOEp1N5lnaxKSNT0IQsqjOf6Dc`5>|_HG3M2q6L+ zAcZH_bLfKHZyUKJpd4Tb1u+K&FQB|6Ihu+);}kJ4=1l}qPQp|-muKLXhe9QOGf*MO z`uljpi+~M+fWSi7{BRN3S^@v?;nyM?2H06GV%>oqu$&+RMvIgAMHIyt9S}VBm|*iZ zHw9QYC&78Ak7DVZ*ok%Q!#jX@b3jM@IUF~|5ZsKG2E65 z)%3wydfG!h`@Xi}2Uq2r@%p1Xx8L&2Grd1)Z4I}isqFJ4A@iG70m1K50ywxk5Sm&z zD6RXJ?+z-QN<62Z^GT9-vF>c zPrt?O-wP-_-QP9dO6uETeX8{Ts6*#aD4#3k|`Nb#Y!9RsiD}>4co=y6*CT~9uw>GUp z!QS;HtiN{%U;EQH;M^5+5C?=G?%9YPBLmQ3fKY`9LX9x%+NEcn7TkI(&|lIxb^+t9 z7g)UM%orUl8nM+#t#Y7irpf5jO+MzBB$)_2_~)d|MF3*)^Lui}F04UJU~-_IWpc|r z>{x@Gdh-#Z5C#np#aNSkc6ca%K{24p5gGgd#(=?0ps1W!ncAAG)yeWt*X@7pr7K+( z(9xO8KJn;*U74(|i=f<`2>hl5q2H+r;N_Trs|4z=e)#gnDUV$hNInb^AR7u^d~gM1 z`*Pg;*@KHKYwJ(oC;dMH0*$t84%K~A@!;2IxH6jsQ3hzAM$lQt!q;g;Dnt+k$aiYA zbh-r^sK~R~ngF13&VKCld&q-+BHFbA7T`dGO;hAk!;GEnUWh}yWS2M#aq-ey4mNPQ zSt{@br{Z)0l(4t|mND044MrF$BqK3$HH|Z-O~XkiOhQVGCkA`4tulz526F7IlQW?~ zE?}&AWEf9Bp2EhA`3n@zJSW29c?rl^=Uha_ISN^FKq3gCcGTiPtWykP<33aZO~yG0 z+2o*-2Qy&n5NjaBu#^BMh4?X`vMIoIkae_RiY>G>z!J+dmA@Yz%$;8hqhm}+^oBI?*7VCH@@rDzVQ zFsefe)u9LsAZ~=HS3_)nf{@i&6!KZ@p)Ux+b*1SqJ;nVOhVg4_^r`I(Dw z?3{KyJUEDZi`^J8DRN=pwkZRrl{nlR}8=t=PBX3)-0EAPgw?@xC z)3dv^EmyUcN1Ii^Z!#AAolF4Zk^qM)o5tZF=l7koPh~a9tewj@-FdQp|HZGysf#BA z0M^%^!Rr0rMImZKln;>fO~T%1r{INqy0H2FP822quloH2r(an^*Ak#STEU{pbMetX zT!xkz4BKjPAP{g=cO$23vl%5ChxtP)g&Jw~pYLl~vRm zg!{g(aLKGU;P2mcHZFSoLR2z!Y-t=oD&hm*iFQCjSN=CYN5%)f+dW_dDArIxQ;yr6 z=As-P;Fg6PNlCO<3-TccztyP3OPgvhU*^S4od}3_q#vIkn1ENQ3{E*=D)u!}Y%W(Z zVhBN?5Gk*e5jt>?A*hyOmaw$AZ%Sfp42XUl(G8ag!iH;)Vc zfg?5e$0vbvSH2f5xrk%KSUz*w?l0W)%q4$(*{OK|S(EVSp1tLsOh#8c7LfcVRX~W} z@#~sv&rJT|n#Z9e(_hQ?1asD%b(^g}cRAcz9sr;ai^5a7fsn##qZnnIm!C0NMm=s|fCGsRX6@_Qcbhtv6a#K8cJY1(668lM@FaK-(0|2G7<$QyR>i_0r(q zdZeHHFTEHL&0@+8Q_n}ifw^rhw_JbE)<1s#MaSc`6*Ct-_=~-hT5>@bfK~uyIIn^U z5b$u(BP!#qMF$k~%s%Ggz=7gLk~{ zvoH`&pl#{^Kr#Ti z|HY97E{_#29F)LQ^d3N*^B{3Re{at`(KWOXvIpzbnB%9uy3;ipmYs zPAMJpv)+9_e*OnnO$E@n?r)#?4@kXh{GMK70cmf7<1$P3O{5 zQo*j_*zmi=N-0AU3cgrJx~1Oz(pAfe;OD=)$2umt5-dfn+P zV`;!u1>6)v^c9AJKu9C4)M5K8$caE&G7uHIlUX$-{ge|$(Y_4ukKyE!#q$faCmc1^ zR^3#A$89Ax9eE%O9cVB+8!{GGva<+;*^Tp3r|xUX@ejz7WA9o6W`?!aZTT^QsR11t zuwiJ#P^jU#q5nNR6rNKIq*7G+e>TJKw+afLeYF&;6+N%3%?{LSZ9SvuYtKA+W|Slt z*txURTPS2JL_G4FfPorE(RKa5zNuDCY~z%!8Mi(3=+;O6D-}>x8o1-YL%4R+P1s!S zMozL&Dnbg4#wgIg-C)l%bqw!IU|Bn=uLMrBjx@+BaLV4q&L;z}L(so{2s3gSEbnSV z;MbIOv(NXSp3?&KdjWvg<8!wwFQf^tVyv_W0JTQX<^x#Rk;T$k9WFTp4m@-&L4FJ= zo|ddaSG6?f^U7I^k<#F%1sR-{0qMwnFO*Awa0!oe2ulI14_AW#sd6jM#2P6BRw=}( zh82y31Ef&SyhAh$3sTWYS&%Sb5ulM|z+#Y+!E*zDSsDt?b|?R#i#^TYul=qC|5%yM zA`2#U#zVEVe$u2FH-G;p8~Xvs8!wpmdzp-$6vs)2Zv!#_v>zo-B!I(Rxkx9XROO-t z$A031cd!0lZz(=(wtT+471!^+9e=a&daN7WjZBn77-pbyz-WJnosTrI@t!&cc3ZU1 z%3|iLx`5Cv_Yk|2nOHfJ8-g+S8Wy*VG`f2ft%VlMXl=oPx&f1dvf5c~L4j20+JIr5}%3)qUKr-BL8--AiAOKV3o}1?*2zfUOKZPKF zn@$)=7!-`FYS?iZtTz*P)?*q*0$31)pvW}!-wBs1ExJ+lfe-@EpP zXBB|y^X7L>vleX%=QMBQ}l`2qk> zjy|crx8n{3suP(okBrKqGn+>cWKl1N7~G}Mx0TShrGjj`!u-=Rn7yI{VJ7QjXT&l6 z0u{KiRb5B;*jSCe4oGJv0 zkrEIfffa*2Lw{Nt30643PwS&D_{V{DGP|=i8LTAn>C?FSrH6~K@8?|~x7{e9g_AL`$C_a{Dl_Bl6Qdp-cDht?MH z?SHMLx$+XU$uyXuR*dd#!`7d-VErv2p81amFZ@I>xI@r6N3i^gb}T%n3o0MFl9&RR zVuJKQj8+QK5@ej5H3d$?PKQ7gfWiR1TZ@=Gdny*TWwCBJg;g3BP9OyAk_B_%h523Z zvr-;B3=wEoEr8t~0aV6u1yX<$!f4MZ0tmYD5!$jL_H8dB2(w^+S}Q-HFbE;!xCIv4 z6LUPS5a=cJQC}5Zg0$3vmGhj-*;fO$lk!@F)b1E?NHJ#8ZMBOM1>@1_Y$6#8v6X%{j z7nE~l@BY}hlS~1cT|n)AdJhr~apH_gxcZE_*i>N*)T_uxA(FZU5hKdCI4o|=1xPzy zkf#y{Oit&w>6fiSH!Fm5I3hBr4v(TdeD%;*3q>*o1hfmg#x zW~+d}9uVX}5L!<{Vhg1e*eYl?P&w_1e%`T&12?V{f|dXw6Ik40R3NT(NZ3stA}`#@ zOm0bu-5Ajtpe1w)zhPiu*`jCYgQWzg76a6Za`>LVezXMt_$pvlXKPYTZ2hX&Ex!3P zcdUKa$FEpE?M-i4e9VIn?&)hS1Rcg=5I_UtT+}Bj0QbHQ!a&rQf3*HXGpBUTy?oWN zF@UhY7_YzKduw|;r*S! z0-b}Q0E4>*P%YK`mZ0)1KIO}5Ukxb0hE7X>J(?em|5Iv>kv)SL+CPM1se(yu&V=&R zW2R!meQOZ}fwxn0LSaf25Cl%ggj{*fS^=aTxCghU%+S!<0ex)Xsv6NSqMgi{R~Rs& zQ70e~AYq`+f+Tf{KPiBi6cPfA)kus+B0$Xw1ccZq*p!i`DSG<=1FDIrkEBZbEHdq=Qm zJ!9RCe{jg-C!xaAdk$c4wSiD)5h>-2F0vWyequNFKD7r=-1yG1``@ysh6n+I02q9+ z57p5s<{UEm^DF|wcfNE!ssojJ@gP}4J8r2#GdqyzaIM@Py@Um0z z2mkvHuyq@HU~yul+8c@b#}|Z9?6n2iS*|KL-i~TkBkTnU7-Qo|-PGQUDb*31c}8pCJ4`uM41I9pF| zIYXi>D>M>CL5o(Sr?ySm^4ga9FD${7J(=0yG^0=*G1z?fAdXe@4hjA$fG=;{icdbi z9y>;A&=P?xkg5O@M%ek(e(ZQ;?;*ht0KeSRKxa#Yq0POh^pr4d!3?O#i-NM#%oS;t z+pdxe#@q~>`urXc^fck-UVw$dbss&b)xTtJ8&XRkLoWV(2`^renBg?}7;226*Yx1C z%>iB3pB_e zW|o1zKPU;ET!g9@F%kTSy{>Up01s4a2?CUlZ7+P~Z@;}3SHExhswAcst)&A%zF7rK zBmjTyFIV(nPc03U>hU)bfb4naFIw>E{{1Ix9UVC#3pI3V`}Chp&9`i8Fzs*ene?1I zP}s2NxvH%Bj|y)5;1&4%pPfGTm=E>$;ZGiV3>ybVPzXb41!v@$36Lg&`qmNbdvYJv z+~g9*7jN4L0C;jk5kLOdyYRvJ88o^FkjaJ!C$;;1frFwSteOX{o82=6wrL>m?X5#r zU=0w{7^%UecD!VuJ2@EW-P#RtBHu3H#XlAR>$eF>6jBcavIH(4NYjMVfrSa&|JDjj zBHoHiBPGC?0Eu<_0Eq<>5+qj8u!5KfsZnTH$62lUF=0bl)Jm6(1hTX!X!O1$`1ei( z|I02}FsVH$)#ApA*|Q$`(fym(A;6g@o-}z{no4UXquK#v0R;b98*tPlfB{nvW=g)1 z%LJRB+B`5;zn=e=g(sc&#wBxGb=0$>WyZ}m;ep|iM&HKXq2$s2;*{g2&p-AjS6`(z zeCOSmKJB1R*jF}h!S&C+;DE0nf+!7^EXsSz*#E#TY`SqB9=PpUJo#NGF+T15Z{p7` zTLu7l$6w!r9e2GSN`PYT2s)Q6fYOdR$li?8lj~fc?(MQjw5JmLKHUefAV84IAZP(> z>fA7tjt=?#1FbPy9EJ{^!*Ek}+@17p?oXcJBXFRdWq_=!0xT3P2QXG(7)T9}S|GKI z#8@Pjk+MPxLP~^$1+gek?s1raJN=zCT52_{5E{mS`z|Tv=!7DpQPeN*`3EL~|F9DQ zCQ*q%RTgx%f9Ws3@l^QktCw96H>ib~|I1atQG)>lVIW3Gmd&5B`p>`g@TE_F^Rltb z`0;n1f{(xRlzeF*esh@72!enLtw9@rS>vjO0B|SQXP#JtZIv?eQ4WYA)CObJ_BK%3 zSOSjG8UV23-K)|6vkw3O{_6TQSTf(OArA~RAe{vS9jzcD1WH55G3Ek) zgp=R;Qv^UO*FSqltuW9~ksAaQH|)XSmc1zL82}V;+`Ku5X8JHhZD<7Kx&T-mKzZ|# zCRQxu+6>nc00M?$x9!IiKym6vln%jXZ@lLgm)wI0J0)Xcard+AcnVg5jN>x~}Gf+>{6;r1@{<9}`eGwl#{m&L3-+9;GJ(ZDM zR<#nN3Lw4qn#W(!Q}C#%0G3ahLI*}_YH?I}tljWuzkK_~mzGAIT~l+%ws&NXEwlzp zeDF6xlmGyF25a>z?)xdWlt+;bGDvz2ia+nefu9snT0e;V^cG}iv|_kX$Md&c<$AVn zJ%i(qJ?Jxd<6Y}<|5tw>0PwZd&tlrii(tsDz_Rnn@MIbP!OEB6UQSEA>rtSfBVf;y zTk*u#@4>p;9z${G0CXk*liR63#y)3t)gJ<-$hA*v6{a^Kbab=N{gCu}@WIIqFQZ~rd3fBJ#32j4hs(7A99Y_SBe zatOTNASM7DIB`!&2!V2&JQ@l?1e6CVSbxhy*z&;BDDErcsqbHjt|@s46Ig)b=d~aD zht>ho*!YZQeb5K6qW!`SfyOMg1(x(dz>gJDrC{L7e`_7E=XUl5HdU|;#G;TGf+0bg z3SzQI7%*1Q5Q~^XG=vZ{p|$wB(qx%mv`BijQadJk{@?6vtpFP*R1ZQmGD(MD{_N^? zr-DR`;iePquN(;;H7$UD7jY&N#)IX!vV3~i<3C-y=gO1c@nZX1RxVE8uwZ8KxRa)~ zMj0iwI@i{(?LMHjwrkcLC}}8_$%MMl7D=tAZj%F*=}C+{gOHmNA^++*h;v!&_~AM{ zf9HD~5C>rS!M9%bcP`dN>)ciQxY=s(@>+d7QgiGcf^SzO3#KX6VZnbNdcVJ7zYzfAJhB%wokPjj~qIWe5MW0_wvtdY{{YfBWPc@%{UE zV6-|5lcxqKKD!wbhLA9WkG*~AxN=T|$sWGcQ-b2=U1&dUfqOrQ)7w)_5G8=XS#XcF z8m`A@X$HNg9)sMX4hxu^L>Jht_JiH+!U|+8ByyjFJ&DO!9MiqDG)-m|QzS*L^hDYJ zTXoeCpPD-J! zv@T5xv;Wp(_>5dmiw&bm>uF?CHc_z?t5(dyA|hl(b%e?VgjP<>IO9(C-hCDz zVTcu{a?IkyJuNx%QXn8>aa_-m(lnV-OofVC>xog{Z?P4a+0v3g1FxAf{b%J`V{#BG zDd;HnU!TAL#-pe0Eg92aZNw)}p8RB9;bxN(Y??rmg)t^a#Z(r%kdL#J6gS+s|57**HU%G7UXMXJS4&}SB9M)zlFdM+`^Jo&TiWWHZvm?K_bd| z@G&DMz@#1*u!7XGTLemh)Cyt(V%82kv>HYT)zo59&+(<%G`(nriu&+MJ`=(J8(yFG zfFQA$K&$Gcw)}vwl;L&)EPlmKKzOvhSiWT9$@y$jO{jj>v^k%Dab$RBpRK>6#=HQc zqJuA&K%5DmZH4Zenr+#=sI_xOlg|OAf9@vQ;_iw~&mdwQQ z3p)S+cRaKUFYFyWv>&&?@T1Qn+nPhEe-xknfD;>J4QOGo3K0&LFj}hMPcC0J?mHD) z^H~)88~Dg&zc+SkNLdezKBe%>#BxdUC3@-Wpp!0zOB-h<-DeU4-# z?D~7>y6fo3*24Ap-l>;->2FEA$fr2GfSi;!iSq4%f+zwdgk}BnN^_;NXhB8j3AF#e z?`(r@PISdlfdy`I{fdi0;nDa?H37jWRE=tChmY&*ynl(Bv~Rd-mi3$JDN3mv7+L~_ zjvzZ+2*X-yHf%6p6=3#{G+H0-*>~=y)mLTx!|5;IxxKqeG$-z^;#*(16acWLD){W( z&*Q{-U5EU9!wM}dC{=2>^xPB1ZZD-kZPO0q7SBP?fk7lM)hZFE0~jY3AG~x40AT%# zC4Av~&*H{w-v|Ks>-U~^$hVyT(YsN|XS^w@26=a$Cf(3U1c=)YfFl68;I~e;n;Dk0 zyPs$9vGsP{EMxZ}VHk280YwT%yNckn!TF{6(q61F6{BDx`2U+RE{r?z({XQio~Qs` z0T9fDdbFIFVyF?c6{5Huo!x-y0#IZNlti|2I+0QF4KU?dUDWP_gJ z${{~{(>tdF?|k23pVzxCJP9}6`#kEk6#w#fZ$9K}Q8t4ljqz`veB;<{*(gAJYX%p6 z{KpurrFirk=iu3$S$z6mA3&oXqa_zYDFGV+!U#H(bLvH`Tv-oS%EOQOT$vAV+TlF< z$TAE&4S!M$L+p(_2qffJgB<{9l}2nCXOy~1i)?GLCa-w%PXzye)BAdS;Qwb=c$B|h z;e66h|#Nbc^%N8B106z2G=TOK-NRk*J#_3nx3uuk3R>aBxGP@NT)tH^Y;;VVz~;nH&!p|kbSC7q|X z4daC^y?EbSPaL~#*FEn)?DO4Itm3cU``SaRf_9(uZ0pClE9U-M&-bp!_hZfa{m6t03ol)T)@gH5-n|oP zErz5PiUpHSJQj1#UkOAZto6t}y8ve&=$05n7DN`t3YZ9%Evz9A01_-2PwrvVQ#UFk zOHS&`2;Nv$rQ>y2jD?GO0`Qxt0FKn_yg$852T-yvZiJ8T+y8?Py#2I`K62@aW2oxd zHGR+SdU4bypxk3S_AUF|N6+>09ZsJArt6>Ix3MvBOg5t-0-TubdSTW;CI9sF@YuGN z99qK=Ep4qpk^t-1!*+H+k5uqzZ$D1{=T>a^i{$`-pB@0d{q!KV|L{Sq|L*07eXgJR z`lDzsWRUG@gE4@#w_wrRe;?&tdjKWKO`eR*_3gOLFlulAnvC3SG^hEGaB!DCMnk^CfYH9FPU-#{A zK5OwsAGvht*h=um=S%DFT)m~gkdJun(9n|61Z@|eIgbITBqfXvCnFp847Sz+-4+s% zi&SN5A>TW*Ue(e|jb~<0KPf+@LuX4Puu%kEZ$Q=S(3X*HZv%F3$E&a005S%xr=O12 z6PKWK!7TjM*Pg;Ze#9veRRP?w8@TcI^(bTmWCB5E$`nxIWV)g-Kz`9Nj`Apiq)t%U ztr|C}yAXmU$Ngt!u(hx(V+kQOJ~^;6=pZ663u0Ezx|;>D1W2vLn`$U6RY5T(nHcp= zB!DCLTKS>XYGJmZ&R8;6fAy*7ZhzD3Pq^s1_pdPiWDgq+KCt@x8~a=Hk=l}0mKH}V zvp4_XkH~*r)#@q#=$`Gxrw95LXR;xfNtWcNt=FNdRZ|t8n8Z69y@P!l7azZB>Ym*? zf1n6xC-}kBCLuj(8M3=~qpfcUtQ7Q%TOi%L5S1HvWWT{1KQ@R{kDY=oRUq^F(-937 zp|b(RT0n(J$pySg39Ovlw}?Op-getF{ltNPmf4s31TwxYU<+e?@LNJE1Tq#RZml;J z1z|=?f;uxUta53Y4vJNliBaD~0yuK7vp=+2T|8?6tYvlU)?Ig=cgB*7u6zFq>oF2t ztBbW=7d4fD%lJ!s6`KmcfRx z^<1dC%ZB@ZuTk4TJ!)X%{3VyQO`REPSg0rioo|Iw0d#vif?az-Em^1XU9Cff3OSvD zZPc-L(|(Ax$c+qvN)@PV7B(@+%$)@?jsV8&#=nly$50$Nx-QuLPw-{GGwCE|u%Go? zvM?mDOk;qb6-G=7Jl69IVqzo>48$Hn5 zbI0k+XI=cc51($)bm#=qf4T0d4Vf^&nvwpK_LWBFrlk1x&t9kjNNPy+4>jo4JGKmL z8XTIbSRh(tX@2T+nNU{+=!a4}GlAM(wNhMY;~g;}>FI1=hA8L!Kg8K`OIruD5`_Ij z2>gi+YY}vHAk&(IN)3Wc3#bu8Wg~zHL7>sHY#9j3Ei8%K(`RO|us`t$EY6>gtPg&% zV{?D^;e(%?L5Z~%M1;h`IRIILVIZ~!7sXs!u2r$YQq&W{KT!c3$(N}#LY41O>j#Ez z>uSqi{JD?3u6gncfaE*hdj5HnvR+piJZXezX3`*Dck`7R0E}hTh%NT+8XZ~N-8Wmb zhG@ZL74%PT&6QK4no_C{KsN*3`AAobDLT%ojjR?Cy|ttD%9coJ7J*nsC@C5X79p54 z4N;>4tu+v45H6e#43@x;JOY(t7QB5ZrzHi`(|@98K3%hL)6tr<=s`MXOF2TcJ)3AxX)6@jGi( z8Jvx@APkgQT$s9@m<@no0KEW;&7OE_Mpya_o0av^n+3w#y4tU7(Fob=0_Zq}$`_Ef zw;~7?Lm1Y_OpOct@#AOMyLiDksBa8aC=mPP8NW&akqef|l+Zz2I4IoE|BzAZX) z%4|CIlKEHPdqdCL#sxnE2sW%6+_P>?Uwu1O7MCfVDx|qqOZ4Bq@8I%|wTunx2C6-# zF)5dgAOSEd+tS@$h^nczRjqZ=Cx9U|Ju!i#Bhu2HvO2q7zD1zbw)VC^%0^0Oh=3pf zrv{1?6lo~M;DDh?VCO7AxNs3T2%v>s;HD{*77#oAK+Vl006?)@17qjnE8>@Yj5zk* z*a(nd$d&wt1V)^jkG1S{`@y(4Hl>rJ!-eO$DKA2ytd!~ou)~+e{XRe}oZkoK1Cs}XE56D`w9Yb6W>41`Xt zw|Ob$eCeYx_|Kj(kM0}jd0%m)^350TxVnkvGXPD5(c5p{I=HFY zzo?=xMe9InNvdbfXg_2Lryg58^u)fj%9ITQr=>qVTNub?!iHro`;)&HKndgATCchG zOlH?w*E%BIH<)1G%0_whl99?yu?1OCphUqMuR=s#fWtD_`ct0>hFpL;imt#|0ofGB zxX+ETFhuUYEHGq|S~upi&EPl2_4{IB3?ohzNGlK#QVZ0X@s{LZ+5ZZF-$d|FQ~*cD z_2v)V7Ok8*hwkd$`#vIkQ0f8!t< zFG&dp`fB*nH3xS4ex&?Vr5P?_pWiRPHCgkZ(au!GAVe5AJNf^S$mHSp; ztaTLu6O3`3e5F^}%lqgGjq7!v#MsOyl8Y z87VecdVTOup#2jG;0P}JXU?OCEB){L{=J*N`P_}~Xm0K`Ra5vo*Kgc8dr|w;t<|9g zCTR$i)^Q`nytz|x;xXe&|HPu!Nb$(CJz&d_P*4a|GN-LDOvF{CR4;%Y-}hI2kRMi@ z;ic_BcZ%+nNqP10mFi86RG72^S%GB%lcVd}CZmrX7Qnd1opDwibyN)QE9OYD=eNbTjxT1Ux5NfFt)>`JvU}n`X}E`}+4^ z-Q7F-&CR#Hhh7r=>bW(2ecO6R+kUWS+w>?CNd!?0jgd+nzxdkQ#~v%SjDg`gKJ}GH zQLY<=k%o}qq}Iv(`6wJni4JJ3w|Vfd7eK`a$}6g~G}{3MP(D=YkP%wS$^Ht7Ek>DT z3R-ImNDu&Q!9uPTP+o{b9EV?=nx|X%fd#X5rN70P#1~tJMGCTlRMgnwPqXKbS>)m* z8D5^l;evl+)HhK999h>{A6gw=JaaDJxqt6v#ew=aH{E*G_}~`+vi_O=fge4!v*pfp zJG(MbBw9#G5TRa=@h5+H&dp@56hc=+Vp7~r>KT+crd{1XY_hzovw;k0?w-)fE- z8IAwH=Wn@^ai~Lz0-y@HOmyG#-5rq@2{kJbAV)k39m#tyTs-!8aZ0Gw4X(ZZDOl@z zZ&reNQO7Vbm)Z6F-Tvesft&gBuR8q?hY2*3K(|5nIgRoy%gdwRj)`mnPtg_SCA=KM z&mw+=XCan6E`b$i2?~&}x0jtOfk=VDF-P9^Y~Q);q7B4>yB9#y5!{C`1>X)p;V5sW%n?0*#N=>4amYw#}F}(depxgKp%k7U-$HXrFNh- zqx-v4bf1${S1+qoZmf_{3WjBal*N&G#LxPTAOEod!ytvgh;o$xdr2=QXZm3XF@Pks zcq=C*AN;)&i#-zw;D|5#FPb@5e!PG0!o9`v&$rz6o`pX6Uj}x5^7~J=*J=sEFo0oJ zQzy5fg%A&FO!;4LJ7~CRETeC@j(@)K86?J$>jesnTH4BO`AmsK`u*vD;Q!?Gf5l25 ztBZq1_N|KRx12Is{%%ZcNdP7bVg@JyI0lIUTMJ?ZlPa(waN_p)g_^QnPS-yXAW0b) z+oW`IR*ygVUziB~i3D&Y_x#e=LC5qAS0C7P>s7B9{BQn~yD?I!Bb&{D!RXYwu`JWN z_36RBS&w}E?T6gA9vcjoQ*7@pLunvTf+$ctx6oE1qG3<@-S1ETGQ4@tZ*uzos!E{G z$o{iUWA(|Sm77LcbE-8`0_vPWVj`GSIh7yFV786`B;@w^DS?O+{7(g_vBBFUDV>_r zzlz>F5&RPg;D{;vUC%$s9CP=h+aCB;C;xf>>rRYTW90J@m@S}Kes9X`-jPwOPJh+H zaQw+_EMvHm;Bz`&V&t%WEs; z8yYDaA`5L(5F3CEMBHib#6ZZc0H*?B4HzJ010$(iLAG>CR!;za6W5WS0M7o<>hR)O z3-}j(2abK_#r_@J?znovD+T|%|Muso)f2Q9vS4OtrDa9y^x{Z0p?mi3TJmpy{`xUv z4*>Z8+dK2Byfh4FbA~VnD zoO@0YDm9_BZo+!exEIb|!s^HL7g-4Vsnmlx#+k)9II}=GvF8C82dFK6#!N86krxyh!jKWb_^vKpUxKy1Hl1FRw*+NefuNS%48*y!3($h#1TZ;-AmEk|S8?7qMzwzr?` zdNAA@0LnNb{aO6ajt->rCR{EJ0s=bO&--`d5So6DL}74(TMLD9yz?AI)Ya1T1EytB zdvlMy&4*hiIBcV35_@X!GQtycTw{t~dVXmDjxR1+QRn*HgetKm7Fya78hCc+x@%8# zLhn)HzvI3gc(c9}e!tJ@rw1l^JlWZ0W#P_DR@2J^!GBs>J0yO_1rmdK#QSqt|6G%^ zM$0xD)4cwqrYR%6e+a`(KS#y;k5?Eh_9)?wJncG%kh)qczcx=TN;w6y1SlZ@=dg&q z{dWmxeUA7?4)#d#OO8JSaN$jL`hv14^zp9trER_a_tro1b>@hF)bH}$ySC!_?ac@T zd_y8ORE5q81S9Rq9DlC4^`s|$`Q<`~Ah-}nWi6yK7QXlIe+8oqM6nBh<(is5!54@! z#^Rcy6q?Xv_diG^&>PM1j&pTo{h8ov@>EzH0)%tq1;8yKzCuKN=IDZ-6u;#7 zGXP({X@kBnIE7U&n6NCD=l3?$4Gs2;`aN#DYb$o_>V)6$I72i7ewEO9B@;vG97}EM z>6-lh#-$ip^s_9EOvb{l=00RH7Cau8y=xB;GyIhiRU>h3=lq=?NACY2B7uzIQ6ilg zv+Ep$^Hp6!3w7L%_cMc9yRq=Fv&wg>c6ScmLygzL9x-{mty;NF0iY{@F_7aG6MX8F=8Spzbf2pvOL;(1ND@E?>=9+Tz*BO3 zMF1Dyv_U_+ateK{vumjUxp(KH6E?K^uhFlfT#(V)P-K6|E7)<+a1oY24B5q|XJ&iy|q5-1b~`*XZ~ znn!;%Ppx+pg}eda9oQ|tZBqP_c6 zo2fLsF~)d|5Ypjz(h%&H-$NewIhsbm=OWRRDcYfEy8-NSLjN|%_Fl>Hlmc9IbDe8p za4LN<(YtIg&sJ|+edV}0{}*q16lOjLk6VYT5W5wY2-FzCc$MLe3}jf}maf)Qcl_7a zOApNZGdYS>*1|2ncmcif3_Q9WJNOhrYfC0|DFoeuh&_amw*l;Q#FPM#|D*}YNe5H_ zF6X7f?u{^=7n9TRp9HB3VNue`B#%)WjASihwOzgqhmN&*H5I6&-f zy~!?brpj+bIp>i`)*N`Lx8wXh>#iRqhQfl+SL;Lg{f2iTxByWF+={|JQx*(cjP(gZ z+5xlxXoX$)8=Cf$0+UDsaHKr{&6`LS)rebjE3fzTY`kG{?IpKdc`6<6**3q@jbE*O z1*OFSfK&TIY%Wmc@?>V02D>O@F>uoPdbsDTKi|37J67JG$x*}xa`^qGcL4#YD!>RZ z(^nqnK!O83#1?-G?4JLA9D|NOiR5T=OpAbvZmJ^{3Q^8Db&C3Gw0GmTzdG-r;(upv zAAa(O7ZC9Khs7@hCb>M>*`>kmJmoP3O51bY`)V&c|FjcoPbp&R*t_iR{p>1P*z z^OBk4iod>P0L$+D3rb1?P_du*Gc~2b?yO1UUYFX|lguSAzo2Hu?Mvp2N+B%D5lLk6 zxrmE)2MMY7{Sj=hlZNYH6Zwj)4E|C$ykrn^qs%qg?-P+o{??1lc z>baNReC6zM#lNE=hU-^8iQ;1ae&Vlk#Gj`;=5?w2dQs#xzizZFwk9D@q zjrFI0Q(t$(0@ZF-8S_~}i5zbF>E>2<5 zl!ktf#;BR#)Gc@*I7ZcW?sYjifcyWlhirIir&b%R%-ATT>fa^66kK#~1$gw)vx0 zf)&pD-`yL-rstdB)(I2{SVZ77V`2mf`Zz-uv2*@bC+|P3n|&mbz|prqIjUEz-B2PU~Z*%9Jzb8BitPcom_ z-qOCJ{^4ucSnrq3QS`>MxOd~*5JZKh30M%AV+7-dPwk_OhYra5kI9A~iRAxW1h8=V zdS!9d6!F$zzyH1N@WbD~?h6-RcmAgs0DZild9@*mTYmb?0pb^^a?bfJ%433vHWlRk zaLNq79P0Q{{raUU#v1aW9EoHO>!00?M4H2+*@k4Q?n_TJyisQ7{jC_iC`0D`5@`Sq zhr%)6E73@xDH4C`7vDX1!3AedrU(1H4KD$;3QG01;FtHmg5qL7G{Qg#U@?IbRW;|7 z1$(j)0`5Q9q<-~fCIp|i`&LndW$ zr`5OF3H`&cTYY8TFOde|Fg?GzxT;!gYHge~kfQh0*WK`W9ORe}0DgG)cD(#%J4%WS zsG15!DJ%xK6~bovgCUFYK0-tXrDCsF)%FaQh%cRl;5pyCWQH|XM3K!?yweoJlP~TA zV;q`h-^%(`(@}akp|#UDeUg6=L3uS2F)iLHZ1kyAjf=w zePhqw))hoY5Wljxs#-kP(;f(?%sa1NTyy((zB+r{^<4$#EO`JW0XMuJ z9S~w@b@$2MK=S0`k`QGqD(tr0#%!K88JerbnCV{<94Nl(jvMBUd6HmS41LKQ);zTn zL?zG^yK!i`Cy)#ndfZ|xJjRHx%=;zM036B>&Hv^)^@0gg`7>P|m7&4(vwvK9am~CL zLH0rKH)qKMC@C@E)&K}Gw7qwZKNz2Ac%ziDNJ0FRu_nLUwQpDLdsE)JU;Sa@V>gc5 zIhahFSpRGzx*}Of%Y$#6{Ph zQrXrw@a&rpU0*YAMvxvX-%ptWbFW#8(t`K_FbuEmo@jW(CZ!=kNE3kFobv{ct~YmQ z(q{cbt~HMM#}sQePx0()9eAa_7mQJG0w{o(Ra_ZX)S(gI7AN$VtGy(WLp1;kov^>I zZSSR5{KI1}H*Q#3qbmnLX@a23Qa>|1wgj9_e%;R!LudKE=!1n`~$ z?52#j_4X%|uk`fZwQ9w}a!34QKI_iCaXhuP8F`CCQSA5rY@j^maVZD3`pVT_63L;a z0E?E_DVJ8AAf8WzzoM${4NaS_Blv)0zD+N-;^%+fhG1C<1kVEiENhmvOP(5a|Pk}X0?LsEcz&QgIz=dOmK^V3xN`a zSToDY!X}j?z7ok1GXM*huUBT3m7^t{oPOfuk|6AJ^Kr%hyY)M<>A41!1`I$9Z|*e+ zq4SC-b?Z8bS&VlPLiRf1ZwAn1xV63xGwFHsPuqS~zwU-HZvq1BDZi(-wc+jeW60(y z7-L{WV1`iTn#=)iCn-Y9`ybla2YA4tLQ zxgGJ_M{;GVV%C&Q?9p`+rMCDR0qk+a-;=dyf00|yM*0Umit5cfo`2N)=S+s(t#NF6 zp$W;93C`)z_1{H4SKMN(SC05fBp;3sRRnzbo+Ui3K&dG&-}~yjU9UNYW0W{Axb<-i zBr_-q_@NRp}5S)Q>V6w}bnd~=4j`$YxemUYRksPi800710q6F^Tji-NlX@A06 z2fL4ch}!Gxkj~`b^Xbl2T>_MIoZvB1rxcgxY+Fd^V3gw>RmhbbEx@hzP9hh^R`ksO>4eLc8y z^|YHaQASNZ-B;>4FEHKx!?zkEdVNzbyt)fs-~Qcw)ovp-qr?`!usw65lk*p@+uCmo z_h0VZuB5Y;$3xWMxfe{oT!?^IXR&mSKL1?Hj#X>^dM1iIpAk%m*g%GO z-8y`3#fdHiX84N+44>9#F(yZRC6c3=0ysiqR6)k@xFTFtI$T~4G+pO}5CK3iZi~M* zP#&9BRMeBVyZiP6XmDQ5V|o4qK8ocnGb;%CG@okaa(S2*MOm@Oo*!`P3Kg23JE5p3 z%Ip!}HpmfQiR9=R04HA%6@E{CAZul21xmMo(KjgPssM<^1>qdLHc;MMW_Uv;rM-%x zyzk`uyB+Tw9^v^%9m%a+HD7Rm`!rX^rK^b|&Al0_3Qbc45kf#vFbHUz@L44lA;!hX zR^K)ZxBAKvUy0;M8-P1j%@>3Vp0k*xY9uu`P_e>G_*S<-i(es;ImN+-GQ-o(80%0J zrD25l_u+u~`|(0^!G$RHxvkFrL33_!!Ztr}KjmCu5QK7oa)#4OCUj{Ui7_F%4ruk2 ztGy(WkLJ`rI;&Q0Q;9;{Do{>9rYi)eae3DqGVMeiioP_9l>|OzGx!>yC7!)5Ff@f-?3`GShaE+<6PtehAaA6 zW8xZ>;C1F08Iy5F2*H~Dm9_%{=TXD9%41@H-=NC3qEypEAcIl>=wK1-hWOC%qWL%tf!5nDm*87Kcv zIG#U+;r{!>$;Sl%ivwvfoL02LKJM$q@O-}%zeMtJMgU_(17jHo9KrWjoLAwqxbqTH z{1VAAGyoq5N889qBoc{4B9TZW5{X12kw_#Gi9{liNF)-8L?V$$Boc{4a$NGip6Uwk TwByTD00000NkvXXu0mjfGWt2R literal 0 HcmV?d00001 diff --git a/contrib/C_Layer/EXAMPLE/img_example/main.c b/contrib/C_Layer/EXAMPLE/img_example/main.c new file mode 100755 index 0000000000..11613bb4cc --- /dev/null +++ b/contrib/C_Layer/EXAMPLE/img_example/main.c @@ -0,0 +1,98 @@ +/* Written by turbocat2001 (Logaev Maxim) */ + +#include +#include +#include +#include +#include + +#define NEW_IMG_H 128 +#define NEW_IMG_W 128 + +#define IMG_H 256 +#define IMG_W 256 + +Image *image_blend; // Create image struct + +struct kolibri_system_colors sys_color_table; // Create system colors table + +char* load_img(char* fname, int32_t* read_sz){ // Image file upload function + FILE *f = fopen(fname, "rb"); + if (!f) { + printf("Can't open file: %s\n", fname); + exit(0); + } + if (fseek(f, 0, SEEK_END)) { + printf("Can't SEEK_END file: %s\n", fname); + exit(0); + } + int filesize = ftell(f); + rewind(f); + char* fdata = malloc(filesize); + if(!fdata) { + printf("No memory for file %s\n", fname); + exit(0); + } + *read_sz = fread(fdata, 1, filesize, f); + if (ferror(f)) { + printf("Error reading file %s\n", fname); + exit(0); + } + fclose(f); + return fdata; +} + +void DrawGUI(){ + begin_draw(); + sys_create_window(10, 40, (IMG_W+NEW_IMG_W)+50, IMG_H+50, "Libimg", sys_color_table.work_area, 0x34); + img_draw(image_blend, 10, 10, IMG_W*2, IMG_H , 0, 0); // Draw blended image to window + end_draw(); +} + +int main(){ + if (kolibri_libimg_init() == -1){ + printf("Error loading lib_img.obj\n"); + exit(0); + } + + get_system_colors(&sys_color_table); // Get system colors theme + + uint32_t img_size; + void *file_data = load_img("logo.png", &img_size); // Get RAW data and size + + Image* image = img_decode(file_data, img_size, 0); // Decode RAW data to Image data + + if (image->Type != IMAGE_BPP32) { + image = img_convert(image, NULL, IMAGE_BPP32, 0, 0); // Convert image to format BPP32 + if (!image) { + printf("Сonvert error!: \n"); + exit(0); + } + } + + image_blend = img_create(IMG_W+NEW_IMG_W, IMG_H, IMAGE_BPP32); // Create an empty layer + img_fill_color(image_blend, IMG_W+NEW_IMG_W, IMG_H, sys_color_table.work_area); // Fill the layer with one color + img_blend(image_blend, image, 0, 0, 0, 0, IMG_W, IMG_H); // Blending images to display the alpha channel. + /* Reduce image size from 256x256 to 128x128 */ + image = img_scale(image, 0, 0, IMG_W, IMG_H, NULL, LIBIMG_SCALE_STRETCH , LIBIMG_INTER_BILINEAR, NEW_IMG_W, NEW_IMG_H); + img_blend(image_blend, image, 256, 0, 0, 0, NEW_IMG_W, NEW_IMG_H); + img_destroy(image); // Destroy image structure + free(file_data); // Free allocated file_data buffer + + set_wanted_events_mask(0xC0000027); + + /* Main event loop */ + while (1) { + switch(get_os_event()){ + case KOLIBRI_EVENT_REDRAW: + DrawGUI(); + break; + case KOLIBRI_EVENT_BUTTON: + if (get_os_button() == 1){ + return 0; + } + break; + } + } + return 0; +} diff --git a/contrib/C_Layer/INCLUDE/kolibri_libimg.h b/contrib/C_Layer/INCLUDE/kolibri_libimg.h index 6133993e6b..589672ada5 100644 --- a/contrib/C_Layer/INCLUDE/kolibri_libimg.h +++ b/contrib/C_Layer/INCLUDE/kolibri_libimg.h @@ -1,8 +1,15 @@ +/* Written by turbocat2001 (Logaev Maxim) */ + #ifndef KOLIBRI_LIBIMG_H #define KOLIBRI_LIBIMG_H +#include +#include + extern int kolibri_libimg_init(void); +#define _stdcall __attribute__((__stdcall__)) + //list of format id's #define LIBIMG_FORMAT_BMP 1 #define LIBIMG_FORMAT_ICO 2 @@ -19,6 +26,52 @@ extern int kolibri_libimg_init(void); #define LIBIMG_FORMAT_XBM 13 #define LIBIMG_FORMAT_Z80 14 +#pragma pack(push, 1) +typedef struct{ + uint32_t Checksum; // ((Width ROL 16) OR Height) XOR Data[0] ; ignored so far + uint32_t Width; + uint32_t Height; + uint32_t Next; + uint32_t Previous; + uint32_t Type; // one of Image.bppN + uint32_t* Data; + uint32_t Palette; // used iff Type eq Image.bpp1, Image.bpp2, Image.bpp4 or Image.bpp8i + uint32_t Extended; + uint32_t Flags; // bitfield + uint32_t Delay; // used iff Image.IsAnimated is set in Flags +} Image; +#pragma pack(pop) + +#define IMAGE_BPP8i 1 // indexed +#define IMAGE_BPP24 2 +#define IMAGE_BPP32 3 +#define IMAGE_BPP15 4 +#define IMAGE_BPP16 5 +#define IMAGE_BPP1 6 +#define IMAGE_BPP8g 7 // grayscale +#define IMAGE_BPP2i 8 +#define IMAGE_BPP4i 9 +#define IMAGE_BPP8a 10 + +// scale type +#define LIBIMG_SCALE_NONE 0 +#define LIBIMG_SCALE_INTEGER 1 +#define LIBIMG_SCALE_TILE 2 +#define LIBIMG_SCALE_STRETCH 3 +#define LIBIMG_SCALE_FIT_BOTH LIBIMG_SCALE_STRETCH +#define LIBIMG_SCALE_FIT_MIN 4 +#define LIBIMG_SCALE_FIT_RECT LIBIMG_SCALE_FIT_MIN +#define LIBIMG_SCALE_FIT_WIDTH 5 +#define LIBIMG_SCALE_FIT_HEIGHT 6 +#define LIBIMG_SCALE_FIT_MAX 7 + +// interpolation algorithm +#define LIBIMG_INTER_NONE 0 // use it with LIBIMG_SCALE_INTEGER, LIBIMG_SCALE_TILE, etc +#define LIBIMG_INTER_BILINEAR 1 +#define LIBIMG_INTER_BICUBIC 2 +#define LIBIMG_INTER_LANCZOS 3 +#define LIBIMG_INTER_DEFAULT LIBIMG_INTER_BILINEAR + //error codes #define LIBIMG_ERROR_OUT_OF_MEMORY 1 #define LIBIMG_ERROR_FORMAT 2 @@ -37,7 +90,6 @@ extern int kolibri_libimg_init(void); #define LIBIMG_ENCODE_DELETE_ALPHA 0x08 #define LIBIMG_ENCODE_FLUSH_ALPHA 0x10 - #define FLIP_VERTICAL 0x01 #define FLIP_HORIZONTAL 0x02 @@ -47,18 +99,28 @@ extern int kolibri_libimg_init(void); #define ROTATE_90_CCW ROTATE_270_CW #define ROTATE_270_CCW ROTATE_90_CW -extern void* (*img_decode)(void *, uint32_t, uint32_t) __attribute__((__stdcall__)); -extern void* (*img_encode)(void *, uint32_t, uint32_t) __attribute__((__stdcall__)); -extern void* (*img_create)(uint32_t, uint32_t, uint32_t) __attribute__((__stdcall__)); -extern void (*img_to_rgb2)(void *, void *) __attribute__((__stdcall__)); -extern void* (*img_to_rgb)(void *) __attribute__((__stdcall__)); -extern uint32_t (*img_flip)(void *, uint32_t) __attribute__((__stdcall__)); -extern uint32_t (*img_flip_layer)(void *, uint32_t) __attribute__((__stdcall__)); -extern uint32_t (*img_rotate)(void *, uint32_t) __attribute__((__stdcall__)); -extern uint32_t (*img_rotate_layer)(void *, uint32_t) __attribute__((__stdcall__)); -extern void (*img_draw)(void *, uint32_t, uint32_t, uint32_t, uint32_t, uint32_t, uint32_t ) __attribute__((__stdcall__)); -extern uint32_t (*img_count)(void *) __attribute__((__stdcall__)); -extern uint32_t (*img_destroy)(void *) __attribute__((__stdcall__)); -extern uint32_t (*img_destroy_layer)(void *) __attribute__((__stdcall__)); +extern Image* (*img_decode)(void* file_data, uint32_t size, uint32_t b_color) _stdcall; +extern Image* (*img_encode)(Image* img, uint32_t length, uint32_t option) _stdcall; +extern Image* (*img_create)(uint32_t width, uint32_t height, uint32_t type) _stdcall; +extern void (*img_to_rgb2)(Image* img, void *rgb_data) _stdcall; +extern Image* (*img_to_rgb)(Image* img) _stdcall; +extern bool (*img_flip)(Image* img, uint32_t flip) _stdcall; +extern bool (*img_flip_layer)(Image *img, uint32_t flip) _stdcall; +extern bool (*img_rotate)(Image *img, uint32_t rotate) _stdcall; +extern bool (*img_rotate_layer)(Image* data, uint32_t rotate) _stdcall; +extern void (*img_draw)(Image *img, uint32_t x, uint32_t y, uint32_t w, uint32_t h, uint32_t xoff, uint32_t yoff) _stdcall; +extern int32_t (*img_count)(Image *img) _stdcall; +extern bool (*img_destroy)(Image *img) _stdcall; +extern bool (*img_destroy_layer)(Image* img) _stdcall; +extern Image* (*img_blend)(Image* dst, Image* src, uint32_t out_x, uint32_t out_y, uint32_t in_x, uint32_t in_y, uint32_t width, uint32_t height) _stdcall; +extern Image* (*img_convert)(Image *src, Image *dst, uint32_t dst_type, uint32_t, uint32_t) _stdcall; +extern Image* (*img_resize_data)(Image *src, uint32_t width, uint32_t height) _stdcall; +extern Image* (*img_scale)(Image* src, uint32_t crop_x, uint32_t crop_y, uint32_t crop_width, uint32_t crop_height, Image* dst, uint32_t scale_type, uint32_t inter, uint32_t new_width, uint32_t new_height) _stdcall; + +void img_fill_color(Image* img, uint32_t width, uint32_t height, uint32_t color){ + for (uint32_t i = 0; i < width*height; i++) { + img->Data[i] = color; + } +} #endif /* KOLIBRI_LIBIMG_H */