From 6a88450666db7999d08d2f347cf7d0c2597c21f3 Mon Sep 17 00:00:00 2001 From: AleksArt000 <69528329+AleksArt000@users.noreply.github.com> Date: Wed, 25 Dec 2024 21:37:15 +0100 Subject: [PATCH] some changes --- cutils.a | Bin 36780 -> 77964 bytes makefile | 9 +++++---- src/mem.c | 19 +++++++------------ src/string.c | 9 +++------ src/system.c | 7 +++---- test.c | 23 ++++++++--------------- 6 files changed, 26 insertions(+), 41 deletions(-) diff --git a/cutils.a b/cutils.a index 68e05b540d8c1af48b83dc9993a41a5a7778b3f2..81f8828c57e1b9859714ea50561813f73321adb3 100644 GIT binary patch literal 77964 zcmeFa30zIz_cwkTC`6eeMOTtar9#G1DQ;9!B14)}8Z{7#NHh>KlPU8&g^-jfWy(C0 zOd*6Qg#TXW?sYr%r#|1$_xt}o&+~eo*KhZ_?Y-W6t+m&l&e>=0bjzs;S=HK73If~l&@c8 zR7BWRNP7ADLKNT?836GFzbJ?TLj(CZA_S<(fsxT(!GY8KIIrN~Fdsi(kMO97$Ug{= zK+ZqH4|8gh1P>0I0Q_8ZD5m@aLw!Abfr;}8@bd}s2=?;|isXE~CwPSLCGbg~+9WX? z3g%&Axo>nhpX4>z*jl>|=J@{}u8wvixRA&RoWBPs^MEn~LxVhgyt#;w2!AdzJUB4Q zi}MMK4vq5Rh^D|$uZRdPCc-b&E5wfrjPwnR;DRH$@Q@%#Mfe4Wdqo9sA(KH1i6X-} zXj`MO+7VRW*fB9SHtW$tBbH<|!xY{N|13d6=4|x>oy&ySCz6IjRBQJcVZ>xItcIcKM2; z!bB0#p(3BKkPxp>U(!Ahuusk8|DJY1Pw$Jvix=G_BDz*E(T$C_)So)e@&DZ4w z+`40aqD*7w4A(Ew4h~bU4mX_BRl}p$#rM$QnyUU&rj;L9{N!TKh@!!pdyISD^@fez zlF8rgpC3#;JpI-9HOsRf8SQiljQ;j6)c@ydd#{s6kDpDJ+1ftttnwC>m3~EIy%a1| z_diz9R9KOBqeMPdwtvIDv%2JU$)A_MjQ}@F)GCy+n^`o;m0#DOS6<|%XFcwlRzIw; zD%HtO>oY3*mW= zo9qm7tooc>(Zj208|yA-2X()*r9oig<#D~WE2rD#S4 zylc5bduYh_#Q8A=NBgX8E>AFg+TSnfKR8{f=H0R;{an`~N53w)Z%YP_nflgi&CE=#UwbD^eVj98 zPLN~Cp47)neown{qS5^g*T(L7uvzT3_uzu8oP+uq#(9(d$LjrB*?j#n{U3p+<&Tc= zTN9XGRpV{`X8IZZHy#UO*Ec=2D*RN_Db5}BW7nOiHu!zkx~4(ngmG4aapXY<6pkx0 zjuswkaoSkPW>njj33(k?cA7i8P-(D2)9x8^S>L)$o1uR1snOy4?&iZ4iaMlxUtBfr zczd~?3$DvdZ1}Q!*Csbz!o6m19~Jen^wp-vpRccY|J?5Rd7b4>uFe-{`6dOV%6dNT z^Xp2_wb_mx0z#fS=;*t)PX>-TK&uWk%k8BR3mF zMr&tPTByYTusyY8U)%52srdsudQZL_cFp9b)5|YIV?wjOwT#%R!o|jLZ3o91o>Tr{ zrt#Z=)KQk7BIHUV2q{=m0R~Bg?@%1+n2Zyb^78VE^70oo+^nXiHuLkx*}8*Nlnq2z z&&SIdn-q2b7-?cT!n%=;O1_eoTZw$vcKP}j^9tp=+oTMfwd_NmuIdGmBX2j*II=r^ zs9T>tnWIN{8og!Rfg!S^ODzp#&wkRd-mNiy_n;;5TGqRFYy5CKw(@iD)owl8u5@eL z=j8#@?x_x*FQ#27ax2nq7}bj_QB}FmTZr~OlT=b_e@up-^F_xq#wrho6)JDe+|tU( zyrbnZmGGxI5$~eCZyo3~V92>U&jznn{o-A4@6o+g_u8*DwUW(T)EXgx+t=xdUop-yJluI9ucgc`%oul^5%)nb-FZb`J;8oqTaL1 zb*md22HSUVpQY;cdfCOTt8(5y_9%Jx?8MaZ7G@WJoSQi5PS(JrxkuWoMWk%&5}EU4 z-8!>({*SWUZxro&)ZO0HT-$ZH!le}dz2_>6X5QW+ztMA+OoxGLk9|EhT6SrD-AZG~ z>kHN%Di?nR-@c2nUN zt9bP};yyjVKX~Q1F{|@C-+lkZF)Usq!t_W*Ps?G$XQ(IbyEmh1=i?n(*V<0MvuRA> z?iK@2-(B17j*FwKscr83=W~O%svjyi`26C%92uX0G5*}(fdl)BbO$@S>WNIc8<`pz z)A0|t7ZLfut(@eNxg?WEZ#e{k`68jQeywa$Li|f;?V#`Ep#7dia~x zgE#vN4w_pC?8NI1Xdo+uzl4_c;O*+cHS583>cP9#gIm;t+t!0S)Ps+x2Om=p?o|&i zSp@s=5f>g7?ib31lcjW&KS9WI16{a>M@L0+lJ&etbflMeu%AaHJVTIWcQBE_H9aAH zyrMXN^5j7l-af%$k$#+qM`V;2c`on?2=eeJ3oT*?1ZW=!a5eXDpZzjN72=L(o9L6f@4;0{V4M2R30EZ_A#Bs(!Tk?+yB!+-93vdPU*-hoa z1_*$IY0u3@%G?m=_Sx z{x1}Vc>w|OffUDag7|C+8|O`9#N}uu!Wn!MrK1@f>HuMuB$AdpnCe-@;C(2L`mo$h z)Xx13|87d>FgT1w2p1%gwA|&CzRBRjX}Ki~ewpIs4BnI4Q_bLbU6rT#XnzmNr^4We zD6YZaBPp%R;K|gU9t`e5aZ3h&N@;rr$9td~gQrn@d>MQqrNbE<*Qc=zev0ZzVsLe8 z=TZjOr~Dfj9PPmQhwb@{@@F&rK@>mB;74e=#SFfI;tv^InbKtp9!&Ww89aj0ILXn@ zNXp-o#)#`vT8+V1Qav3Ryo%P#mccJld>DgcdD9p?it^85a4U)@G58E>&jJQtMd{59 z9z*%hF?a>lU&7#fDgA@NaXz$=lL%tFkqt&Z=rZ_hDnF3HyHR{3gHttJD1*mR{uBo9 zLGfi2hiX!YS9Ou$e@hFv&)^TK&}&A|9LoQl;m@c1jo`*e0=B~&+Rkkm+=BAsJq7qF z3oj4%VhF7LS`wJo5BD`)O2hgM0_Xu8)?pCzC6N@jqqGr&Po=aegQrp&*E6Vp6U8kV ze!T8u`N)5i@(p45b16NH!3!uYybnUXu2Ot7!~clV;~D%prF|G2?-KzG{)N&Z4E~GK zQ)tZgi-_XTt+Z<;h*9L!kSH&2&WJ23C2;_z$X>3OQIuay6ldh?MfQM=ydxtyqlhpG z!RPw=c}GtmTi^a+gojUid3#6rO(tw0OrZ#`&+3f28}6L|yH-T}i@mmv#)aA0)9D zv^;7kbv@Fek618C)K&g|T0X81pnMpTD39gG5e&*V#tf2%P(jPbb(aLKmB)5S zA{lkbC((ucJ`|)e7K8FDQJ&%JMHy)|q`4@E@kS~yWuS>6SP+weatI$F2{4r%|4vjM z`w#h9wS^=Dbh7gCl(9Do(wLP$OYpk-Ps|@v)m|r{|KM2?<+1MzQwSwc^oEdJ%*Id|iSD&?dOwWkKHO&pL{;{YTf6P6CTHP-;)@g=p%35XZe!S^{>|4cqyM+GhW}t zso}1i$(n|Hii=u{?|U{~W|Mr~toJ&H;|G>a{BCvW!}L{6&d+I8Iq1Zu$W3t>zwEt_ z*rmAV{MtD0vYMX!Tn)Psz2gTjao8)rUg1@~Pf3T0-qo$LmEJ3OaO)d*$S<7LZC01O zmL=RcnXB>p;&+wodbA=it8dKCp!95+X2!2ftJ}pih&BJYw6amm@k4{YYs7XvYWZC@ z_JREK&n^0|+128d%#*?#Eq8?{hL>G(8?F1?CV9ZDpp{-tV!IXYo2ni=pr_68CVPF> z$yMY`wg2K#{xiGL%!Q{LJv{AcmfYL%$Lbq;xt-SOxSwBhq3d0PBL~xi$_>nW z``h`g`}lI=LvM|m>&h8%hMk(LJ$@5;P0jqr@F6i@HMJJlgwp6kGus^=6tnu!~>P-e_-VGd>xqbN9UxkmKOxCQP zc=gi5f?|2=bvr9A8BTd~!BS(|yRvpyuc;E@m^_!L-J?_%RVQ#@< zmyY{dEY0)uYBZhGR_M}q#N6>cjJ4h@J^8#y>FfE)4~L#uvhUOLcjB;h!!5E`DEC^{ z)TVTTYgqrw0i9Z>-iq++bwgJCL%-3YRr==*_PJ}g%B|FEk$z8o?6q&b`tA>yG3{a2 zLS@X^Tcr)D-kd3zd!BrI;`;@o)sGjyng1;Kb?d@7+4jjtdX0YZX=%Z`sYzzbGfp|` zY%57mzMo<-UT1l~rG3JuteLWR#sFpOFxTPDcjO$6QQVugZ)(5hM_QFsE$^$+AZ1IR znohGXHp|!E*}JjAc9mcLwg8%rM?d(fbxGH{b2|61OMbt#8*jai>QU})BHuWFnONO({j_F>+sNIpcNzLN zwamHS`bWPko1Ry5Xq}wkq#S?mg?M6P6TO$R&Th*e8>mLCnK!cCh-k-A;!&G+C-;AT z{DhE*L)u_ zb@$5PF*~p6+|~SI^&#FM;?3okD`eZ-esdS)=6rkXddx+1;KSt&T@J5a1&5O3!m5Ub zHn^vC)I{@=SLmwtFDn}M(io***MTJ5c0}X@cewx7S!7FS1nF61GyW_R_GtT)4+MUH z8}nt4{@qa}-@gAZomKK}L)rlL^i`lSm;g)Dx^QT}x^S&}aNTcU6~u=rcHL zMZ5XFBbZG+{C4%=PW9ma_23-8_?Egu`b$nL{URd5A~^p@KffT(KgusS7!NJ|B?pki zv(U>|>O0AwYWnl5EzV=G{V;1Qdyip*2D#Xd@EBobZEx#A&NO|AN@4;B?Fa!btMJT# zXKIE3k^u7r9y<_+`a=L5o?Q`#`al32wh0i&XBEKVJPz^sBn^S(-zb53TzE!#Mu5W@ zLOuKvlmBK>Uq_ zU;eXCpCG8L(iTL)1_WVNW2pY5PFQPbfAMHXO zv1D)@pX6-yf6iEG+Xy2OA)sw>{9~RaO|Uykz$*;(ow4qRMKTH1Q~=IMAPId70nbQa zz5q_AH)QcaS=gxvl9(+YcEUjCe=2W6b+W}_`D!Fz7})abJ7d+Q3UQr;IQRGT(47cY56F>66KMB#!G2I|LGa)HZ+vc zi{&DGfF!_FcKmOr^4NdK&#Hyz3((2R-=&N&K7@glKT9&}>OW8VK#Ao;|G~2-%47f4 zRW_7o41$*BhU=xbu|My1?P{LE1($^c*SqsXw~0Z6WIzV_Kz-wQff;eVr}YRvs8TB zJi)e1hK!g#wq>zL{xn$x=i|xI&r@xm%jD6%g%&EXt%Rz*wM@0Gqz%NkY#BeAoD>Bx zv>Sm*TS1eN*1Lj(B*C_l6kFNP_IWHB8SIFaI4Zc3=7eD-XsAjafrhFS)K}tcfODrY zzjgN-E~o{z6=3S??c^VC07zB{B*`dCCB@VhL0W2>gcJI+nhbYZ#e^~yv5aJ<5+x2q zNufCZDVaf}jGYWD@eaw;az5cX4klK8OfD`wGb}nv6y`4q@e2uy zn97;gAGprGeMMa7ND;{5Jc(d{9fSqCeV6%l?ZW9F zT%MG!{d}ToUF5G8uDtm{VQuHR zXAUdKoLBp_d0NU-#eAiK9>EPSX$+h>QSnm$GY8(tu52)O)`m6*ANjZ4Y0+T+h48)> z$}c;fSykC!<aA= z8_(-KZmiy(8Toe3)Z{ah`WuZ{R+gEn^&sz6Puph;?oE7}Gu}<^4mY79wpZ!ul1Zg$ zhLyJ0Mj5cULY_J?E`SxxVMI#~HCrFPc4^Kh)eKZR0*q z3se8SX;V@+3=vNuJ5zl)v~%R z9N+rTj?m0>^Ug0PUcG*N()4i;ot|~F{%UD=Z(C~9Lpon-OwY~O<$Y$&F*l3ipj_Rc zVM&Y6w)HbyS$K3>gyVdj3PsD5RhM2D4)xYLx7hYZ^zU{Z#~K)JetvM#ukW|qt0uVK z89uJ3%G2OZPLmgf%0-0~%}{EfIcoOMon;$$&Tgr?w&$aLme<-E22{UycHR0;W5)G{ zR`Zq^=o<8BrTWG-aZt&b(~;*5D!oQqdq?bi{PfkR!!_qe40t-}Vtcj2RW~CBcR!l3 zX?fN5<*CIHqoRH~u2)=Eeq+Ms6#qNrk(bIpr|7SC@EJaOs>jxy_x8BCj$D2*OYUC# zsi(J??g$vEpEf&1b<6C9n+;Re8@%uF^XTrr!&c-3e&7A^nC~N<=&V7%3!P?;d40;j zre)%{peyBz3kQ9#X?W6bQLnAT#7V#3%{v0uCc%8fJzK$iTx2!sw6V&Z3CXicuRAGP z%gJ{8Fza#U^#s**G4E!6djDkdz{Xoo&N$JpU-zX0SFIjaQ@G%#r>B#Z-{EcIhMhNT z^<3XmHKup`x71}aS%X9aA3f<{*wRYmv-(=B{QM_nrM@kuc)0t>{WhAZQFz}c@rS{i z{qL6~w~m->>3H*QxL?l7m^L?VjLZnT|7zDnFFUoDNpdSkdwblRp_{i*Zq<`+(bM!^ zrky`{KkRG1{{dN5=Y*VT6Z>6=e{u0}!mXL!8+NBxw`o&;ynocv5jo3^??xFG9KGt^ z>(tFpAyfKfXI9L)8Uz4^1PwQw+H_FBs{=Eki^(Nedt0R>6nbTC6_~Q zShh+mn0)GN+RSt%yBj?=cOJ3x_-WsK*+RYD?H9S77fsgnF7R)c++NGu;i-(GvQtd_ z%Lbq1lg#I|xscwp`()8Z>zGOY?{7Vfyn1X@?lZ+%;pdukoZ~loz@}o2<;kDUdX27m zb!gAP6K_&WzqAXMOPjTJK>V!ht@B!}`?+Svf*;B2_D|Vua=B4-udNfcdYv0^#x-VD zTx`>Ci#_M|EN^+)YWRYCu32s58!echR_bZBGCVWr-KZ!f+aVVc?oLz1fwtS5w5+)^ z$bPEb=DRAjz%%wAgJU~$aQD#CK?)0rF6uVx=zy!1u-5uM}9 zZ>mLX)?C-pz1XSTFe!I+YQ}JvtPW0h-mbh}eQEKva{HSeJHNEZsOZ0b=z%=%z{MTx z7L}eHtMy24UFkIYZk@-42ODIE_0e_fn>gh|;rzXyuP-~dRe5jd{g0_S?^8n8UElh3 z$il@s*_$V&WH_&KN=-KUSa4H8eg6B*i)RKeEtr$gwCIP;>dB!GzF)0wV74$2PFicn zf%ad<0eP=M=mU7K!8PUH0T0i<>%2{5sMIR3n|Zg}&xdH)50};4d1K#)h|YbCA`aLG zcIbB~BeTh|24@e1m?UgWo_{eczF>XZRR)fIWLK{n7r%6qnvVE=wRogLFJLt*KYtatROIJT%eQWff z1<8ko1UtO#5xe-lI8eW2_KS-V>dMM*?;fw(GJB7TyNRQ(=39;7>C2s3JUF>KFQS#n zrxvltTKHb^8`I#(p4W-3pEii@{_L>LxjU*YYvdw})#1{I^Hzr@kS6nZn0sULUXjO% zx3@2O+Mt#E2je4Id(Z7{?~wBO>+Q+PE%Ud1=+?+XS5&sHM^%EWY}eu$&J~qUWo|3= z7^cb14>tIzthf1{xa0IrS_a#W1TFkB|8P$uqc3Gz(! zj5qa*smt?7vhN`x^@7XRf6Mo13DG6>J(5l1eT(1>y+7b2%z%GV-=nG0{BeMj&;%M4 z^W_>!eV1bST#h>gG3LwemC9$({K6(0t85^tY4he@OFR{UKi}m9L@s+y2PU zaK-l;p=G z!QeRz^w`qtKR*@;mO^n~viAjnAA=-bK|Xcq&!`9AR1Xek`*rEzYB&FU;C*%UMR)W) z6o2cnMZLOs4=*B#FUI5FEJtYJ+wt&)6$FO2* z{DM@3giex(-?xS9GWsgPSq21XMj<|uM8xp4i?An;R6nP&8P=`$pIJED@&lKrGUR59e1prwE`Uc zNl^bw0S?>Nhi5_~a#3S7VxB^Lcr!?#9=0WYT zVfedJ+=0O@Y2hOn9DR|-GB{q(y&2qv>IrA?6O_hz3he{-!w14FNyN7gV9ThUr3{`z z@pTN2-%o|>CIr-fRzga49R+w>il3t~@^7Q`bp~Hg%f;&k@+;H%Q_k?C&(}8wFQV<= zkjAKIDCI-n1H>;FErP zYcTX-#d@J{5bM*1zFe7%p1!o)eGI;n(m4#SNa;cbhxyeymqdietT^X?;g9{CK?>&+y}O zRyxCv^Km1CW4R|7d=4$Qh{5r`a*g6>C$1m9FgV^{TG538)>no0izdZU4{bKil;OvD zO4al00Xk%O5nO+PdmhLqM}@FA4eXK+VKvp$;m+-u74FQT*=gKwua-uKX+ zeH6!Whjh-Yw|j~f^quMc?) zj@P9U2FL3pf1xFLXeVB8|Ht=~HW(9$2n~IW^BS`)X@Wh^p~D2(>V3aYOe+aXHXSTL zf-H<>2>84J*8#xk?E|v-V9FXqakhN8zk|;IRNjQhf==O>CM1XDcLzcc*zzq%9*<$g zC~p9@AK!b1Di}5n_G{oeYKaUqHf|$H4kDva_7ClQ{y3d3? z^@x96bVV|8)k@{p%c-3CZ%uMg)yJN?e4*!8zSJY@bS`0#c&KKB&NBGNKb60RHK$aO zIF+ACVjtpESS*&w15dyF5;^gLR=m5KIGK3B(K72}B~E|~c;{5&lJ*a|Rfy}RfS3Q_ z55AOS72aCvEk<8#l9{Ap`|92s}$H)gQ3_t#U%arno0TOH(BOv`j?Cec`B*K zf3J(Tk{D_ZCe+!G;5IsPxLtDo-%XRjMEVp=``T$DPB^QQU|TK2)?ayk2jb31ybz_% zjK<(d3(kyWh=RN6@8~kp=T3IX*Z!_ZCnyrGs(%&<4vFah2#$}E*HfuUr}TNoOz^BG zF3m(t=za_2U+p74lXsIHZt_Ja@8i9h?>eR0-uzdl!ajJNrvAl)_n%ozEN~!Bt^cOQ z=%SqJdiQs9i4)(-|I&2-I!zbxUcrAlAOCx%lRlFAI;Xn+^9u1pM9{#PtsGyg9eHmuFyQJqk(DCvQJInH4d;ID&6R6A~kO_`V%njTJiV=l}kzYaZiy%J-MSfsR z=>}^AAI_fq&{Ou~peooS>az-Xlvq$MU}Omuoi4>8Yi9&(oKf zE57j%CH49(H>`2#y@Ux?We%I)U;1?+x5xCAkJk3;{^aVF_iv|hM*F$yl~$3>2Av-` zGuv^~ff>(lSNked<{t@I9sTfRLHi5An^LEiH8#^LYT(nt`bZ~d+l-KFN5?I?*Q01_ z`;1Qkv9I)wzL)#Zb$ttY>*b3NU%2nvUibNE{Yj@+OxSd#s+qNB_S$9I{xgPm-d$92qj~3=`J<*R*L~V;$pNjW zHJc_kc^D^qY4pP%s+;XcZe6AuaxcX$TVd&e#PQ=4U2be0*5Kui1Mb7t{y3U(Z_S7P z*UnsgeMP0lGxh1b_txttPdWGA)V2M?jiV|qnvU(gMYU<4AJ>+c<%pAO+-EF)VA>_Q zjhbbAddES7W@yfRw#0wpr_%9jy4!xs&2QyyyeiYLaOvqsPqm{Xibbc>LRvUmb{S!L zHlg|1?lLk(&4=Cipw|CMkE;g^r{6SKX+F_tq|&;VJv;92IQdS4M}0r`zM{8oDdeJlHaQP&xkGr*!l$l%Y5qI&B5bR7D7 z`1M;WqoS|ntbWt_^RfBOPi#APU!H&srg=pGs9F#Y{1hnD-A#Z|tERot&# zqmVZ!eYs>n)PSO7Kww3@2j({^ z9rq8a8Im90bk6A_8C~7#=2kbW<&Rk=*|cw_;;3?^d75<->r4l`GxL3Ri}O@JPyQPB zW6-Xj+CHAUkM%sSa&1(1=Z^1+63i}XrtY|WF?W@Vs~7P*ZYOG4akW9%n*CmpcTHw@ z9Fx&c`|5@B;+U&Xoq8JH`j|T~VETs4)R+B?^Bg-Wgo(S9&0nlPGjsLw<2z!tVlOE) zYk#Kc*A5NcRy1|*RJpwTegBD@hmW1A*1BraX6*@kR>vA1@SOAV=jr0IM!WiN)cVs?_@u1Zfy~{zq@?IRf`nY_-PZroIBoPsM#s=%OAHT#aVdR1P>qRcyQpkt$E^g zRackh3~3yjt76@6`n<#HbGq9Mv`9<*#+}^X<;l0E)~(FQMj5sjo&_UKeiLo+qfp{| zn)p+9>a5HI4#B;~iR2Xnm+rXV<6V({@>nhBHd_jRt(#%jxNE?uWV|-D;8Oz@aBH7aO~p7FDXv>ouZ7U$<80 zjwJ1fpL;V()a6V3!kaJ3{k}$x899H{w_Ph2YM!kQjp}#2`RHf;Z)EA{?DA6_+O_J& zz5+Y5V{Jwo9(*&^eBOXD?Rwkp{NlAK{8-ZGF7B)Q##!oWPtBV#+aqG*kq8))*j{+H zfi&^mO|xru##qrdvg5!mwkI8Kc^6ono9ye|xuDygWg)$43Mypw%+b@{AoD6+Hgrqw z@aio?zc+RsJGyeF%dTTUV{0uwLZ16G@t*SAZh+jss0R_zX4)t{u*h14$bHHnWXu9r1=kN{;nD`g9c$5UL1TF{>2 zizrUFfcf{jfSwHu-ktKJuMFyu?8!Ia@)&+Q%3n-z*!#oqf8safMv%gr^Sht5RzS*2 zic5AD;Yl6>EMI|NB;B!;MHkoJ@{>cgZ}=sqWs(;*!_C= zpHlw!l%JnV1bbHx|BHHXQY2sQDSoev92MF>)+^x-`N&CT?rqo>iE?^$fnO(B!V9R1f=#!OO>=81by;>ZGZGx)d7$M7=|$9 z5H|#n1jI!=#c{o8jCd634+wbH55ot_LOmXkNdjALfCT1o=uhNN5#T~Qmk4knKfm)p z@>u=(_3%Fz;6nWs_2BBXexP4iF8b^M-jaOKen$a6T*DC$7vMtvsRCTczfOP)`L_vh zAwT+fvi6|QA&Wl|=n>Yd8ND6>zp#DqJ#T;u%f;^-sE z;`m!!EROG$!|@6E5Ju4JDdHj?CExL2@L1X|(G+LLa}vctudsdc7(M7igTC%;xz`x} z`Lx`!ddjU9;OeAo99NC$^&0iN(Ryi693l+?zo`I+^Ip^w#ORqo^+YhZh~nr&hvjBa z`sv_6 z{l(xSiYwClEAr>ie$=Emw5PDX-2}Kc$wND>7(K73eis41u)cu;Tv)F(0WK2g-_Gc- zq5AhRILJUa#^9G|y^00;h4p$Pz=iGqU4XYGda=IkVBt;zwi`Y}7*HJAO<3Rl48IMv z2j5k}@{bYd(IL99Tzo!gOfX!_ljI-oK?b*qc~n1Kt04ft(A@#*4gqn9A+(c3u#BU7 zHxfXf;=sqB{8GA`0Ecp^OU@tfK?Zy;<+EY=8meZihUO3!3)ykE{`@Hna;uOHA3pa;LBwT9ux`|$<_hie~%gOW&U53I8x;Ccr2 zi)p#Jl58nIj)Sud{*ux~3_gYGdBx!ODE*niJ5qjrAdoz?2fx#dzL1E&q5OI@h6wKO z7)&XS{H~O?5b(qO6vJSK-5YqL)JKkAD_bl1pKg$!hqkEL3?~DUjm~C`*jtA zXHrG@T#b4jQ~V;sKbhiB864ZFEnG-QKs{BI&xpY#TpTx=!INo*C&fV=lKA|T$nayo zFJW-(_l*pmPWA7iIOvBZ3GNeQ32;b$qSwtgjGj+aPbI^T&x>kworCRwc6MQKw6iCJ z@1XjHzsU;o6z#|LA=;lu+gbQqt-z1#_-TxOZK{6`#j&07xp@b}kM{-$z1neHa|;HJHJ%Uaky| z^%8!kL)b6E?{q*_Hcp`{hWf23zZQdIxds#mHYhiq^7jo;qU7G#nD_QSfX3lJpe zNFph2Luq{m7gO4Z!Eqg9%HWBV?$6-!DQ(5zSl>YmzLL^I8GIw9ofv#4rCk~P5T$Yd zhixAb&4)2ahb)g+GB}PaPX@qe*c%KqMg-Adg z@3a5&9STXiu>VB_fF{Fvg!z^)^l%47Qtsi*vK`VflOZHYCt@<_X*JOVV1r4N(1zQ=5) zIXE|x0k=|1WT3HFSCT+^upg?z+7Hi#b+zAqT0TC9NVL_;BOOcUN;G09##K(Y)3NWgOj3H8_ZgJmV%(GsHM zL}Q*>2HfJ*M2S`4;mU8goPt`E!9Vhv;^ag{2@@YB!f8Tzp1Bm|qFP8$8Ra?4h~2NXNET@eFw=eke|@w|&J&}@ui)z~ zQmoEb9KZes4f0>m1J{oKf}Xd*{{6T;w&KTW zR0AsQPQM`lGovkOamma`K3pxC7?P2=po~ytVwCXFe`8{hHUOQuuyKpyhKx%xig{ct z`JxeggNHbS>kG(K$%qra%R7p`3w$CmUoxO!CjMI!4k{*bDgXa9;Z6xAT-D!9xPNM2 zT@#Ks6+69v_9FlIn#%P_gv;7Y4{<7gVM|@c_oAe!!C7A{nMcEaABI_llyr7gFi!Q- ziB-T4BS~2aXGQ;LP;u&GjYG)4?mghYNr)uXInvH?&@gZ#m;5ybj_y(plIk2e%F5Z% z&T%lq)KkhtQk^4hot=j{3t2ix4ze0yWiNzW9fvv&8|4TPl*8L#2Et=`zx>$Fk-B>B zBvW9DX^3>qU`TItWK{8iyuW++0Y_OYm9@tnnJ-UpacU)h^|ae|ljW+D&(0}2Eq{3b z{-td#NRi$4J|QXg`Lp^x8+TgXTU*V1<(_%E za=PE%XBl>!nD}M;uGm7Csaej~o{BPq)PgSAMaNDK{NDXW*rd}+UO)3oZzc`8B#t;# zV`g{o=Ef7VdbAj0wrtNk(cK~9CH;m>S>WfkrcC|q4TnAHTJ2VNn9cIlYW94pd`NCg z(3K3CIStcem)h>F?A`zEr&gn%9DO#xr&VcG-0X2X+iaQcRdfIROkKw>8ICs#Hnt7; zez4CBciZS^zZ1<1rUf5W@_w|;pmWm8QID>tZ&}~bUEMfNIq=@~JBvcAR(*ZbL3vt1 zn8~Ry<3|otR{pxZ>izVaBh13u8Eq~rSf{jhgU5=?U0ZftH~uDf4g*EF449n`IXq3 z2@ZoT!ds>^E_-((e{HUf@hBKQLYrJYz=kHpTg0s~a1--y1*tLqyvZl`rMi+=_6$o;6^VT+1z8_t>$)%6Q~XtfL-)P@Hf+MLN5{VRD_Y=v+o#vw!+UQ{ zF>O;A^?S`w_jrTSX0Btj*2ANqWErYR2dE?pbLiG`tViyfOJrbBF5| z;-NtsXN*+XlF-auzE|^y8q;TgPdHjES0-~-E-7JCjGS^wgPi%Pd-fbpnpI^zzC$-{ zZ}P+Dvy)bS8~!=<{JF{&-o*=Bq;(G89_2d1$ila^@61L6Bc6vGx^M7VrMTyt>%A(( z!OKIF0+g$oUAXZ4ptfOkx|y%@`jKs)_kPoKymF4!)={exE20`46&IUaYA`K+{j$Z= z=Gx7=ajL7LcA)i?@FNwzfuB5IKi@Y%MrLjsx(SH&z%w(XiLddZeBx`YVpHW(BWJZ` zPe3;fUHMjxtXt38xo)J+?)F2|76f;({rP?MW*brH*NGFpUcUL7&QAdLSDc?icswY54jHC)7_EiNl+u^ltw?;>emk zPfx9~DD~?yW}4fJ>1LXz4t%^=Hns9>dfy&%x27xgaXsH{ieFFjQ^V2=yAIVJdUk@@ zyr=e6z3;zN`H^j?xG&DLq=k)7(T3f}oNW6k%*@}B3A+)s^XHCam`JaG;A=dz8S&M& znZEIC&4>e*;~LCr>706VN4ZU9wRY3sdok<$d$ijny422~nemo;XZjU3(K3%(wT4@6 zKm7MR{lo4f%({tAPwNo&tk57pYtm?k64@V{%S3}cOW^OwEXqNLWWj8B3v%39`!BlvT5|Iy#cj5bhvHxW_nLOZu zXC4UfObkJ0nlmR8qaveDJZoX!TtqN9BZtrquKDQOD^8G;YbwY4---xqNj?xk>mxR35}+;|MrU1k z*LrZ+bB1!UJiea@W>XKpeLc8$JvjgH>ciRCTDuOG{P%Emv>O31H#sttz5Wx4Cc`Dk~l?1_yk1M`}^Yj%VtUW5c2r{l5q~(Tj+a%zoiQOAjETN zlf&?YVT}A27#w@%I)fwsLk7pK$(IZcdjSwWQylDpF@bvUyGN`&_#0!0cLF6Ov;%+y z#8D6Ku_I2mN;o`|M!dU3oD;rJR%nl7J^I}kTuk+NGdS84%;1ice=>u+Q9Oa-Z2RDu zH)IR@3*UQ-IBi}I-!q6f+H-*FM;!a>1cL`rdoEC%wdcA3hqE!%|BTTygX*ae@C(~n z1u8=V=!Y{W)U#HA!`MN5AH`t{sj&dhtp~?5Y0wY*g{a2_01_Y)&Wqdi;EyN{<-$Dz z^)#dlD5xHofHN!g7pTOX-9|K{MB$D!5PTLqj)~Uzl+xQ0)snK{5FFxr+6uYTT=WpgX>fLJA*%OP2a2Pe*e`|*{t1Lh=+EHj<2aPTmrK~WF$_*&ZX$!D@7q)c$NM1q;!EwM^+aEM ztQYFX_X;9^70tl+JR^?$@0oJZo}Ubk_9)T&3+lnM8@#3gPHz!>5jekDJGH0*zz<`& z3#DQG3ITB&3CVv)M2KVmV*ew54CObaG2-Ye3hP}6h|iahoE41`$Lrc4246|(p$wi$ zX}r#%o?R4oW%#owJ%+(gQW||PP|taa`!f7jDIH2y?`egN@d zpKuX_Ac@)X4G0E0S^51`9_J~l!19qcAqmha97B+Y^4UNL0$V<;FL;bmjPH@$%Lp)R z_4+`lz+#pJH(C#9KjqU-J`io;0!0G) ztV*a_d2ELyk^yPfhr$gCBVnB+lK#i?QGO-K;pL?qlEhakPltgt7v(VCNadvrG|>ni zdg=%$hgq<0hUWry{HsuT>_6m3`;jgr3DC*PTT*#XWTY`Gf0p2N^&dWPVENF0EyxGu zvH$8S8;aUM%P*l72A77q#vfqpwFBhio5BCu?_@|QI#!V&adYyiOWv41Fx?RFLXvI& z2=a5Xll^MlApX^RBzyKUGZyjTpZ|tAZzQ$Dl8-IPb6#uCRh;~S90dOHuDWE0V&TiM zl5J}e;%c}kB_T-OsV9Ar9C2PCFQFvwZ94`nc^uS>Q+q-oc#vCo2J4LPnn#+Pp`{<| zCO@fF!OZTTf7}~=>3#1iOSgO0rEZh7TUocV)|zxkKXcI|l}UaBwZ|mu?)K5Manje_ zURk!R@yvLeUDsj?-e3CE^>J0)uN81Ykuu)T+zN@0PpZmDbdTrXwj92TQ-|{^jTC=-o!TNbGHGb=tf3NDf_qW@- z?^m1OnYp0E;!VNH{oj^U8Rv$YtRC1Ycueu;;hDF`*!U%l`EmC`@$*wM2h>)_sVx!> zyfj8(hkwA~$yRUL-p`q|NOzz@$fLaCkVmt!Oe>e>#7CJ_-VYPSDf#4fS!6Z$V_ugF zx@YA5N|lx@T{U54ru}TM)uy|Y4$X3oDO+ybHGYq>;w`x!F{LvWp1msiak!)6^$RiK zeMc7#Z1pwo`Fvx)>*Fq7wl})g_0WEMQR4Mkt(z^kNP777!>mos@|Jp@Gwj`>YLQ-# zn{!MyR>YiHe)q+e+Y0u%{l4^bG;cpPWze3sw@2-r{orQjt_zVR_-K?B|PcFh+=gf6%;Ou4)J6X(7A zBFsBy?Ozdj(Yi*q%M82O(A^|pzmB8{q{(}7oGvz-ZK?7$TWeRRuKP1p92ArHEg9cG zsa<8!fNvk)$18i6?s=Vcsj0S<8!Q@v| zkIcCsmwCUjapKtN;mJ!ZTrU}wcWu0O=oI(i*6F&&zbY$+JoXQ1^gyp5bE$q+k zzvo((?!EOvx$wZDXUem>=zZ6CDXkY?i)!n2!^_jt)0>lN*3frRetdhf1(nUMm+~h{ znng;-WCZyVe!mjW3fb%P=g&X&Eyk)>}RXVv3HyEKA24{fH}{(gsDBX%ykIk>c)k9pJk zg=2hdw>X}A|Gc+L;y0=W)+`F9;b)@xIZJFYn&8mhq zqvi~gu_^9<%3yiZR$EMK%EW~lTYZ9dYD~SJ**>DhgCbGVx!aYS3M%H_bGuNJH+f6v zi}U5Z?pCB%yUepb@V#_Y!GkaXTJ84 zW2lbHm@JEcaW}VL8`5FnrBD7Je;RjtIVEd*V8_X8{A}L2_3XStujcZelL4CQjXdYX zf9w|i%A=x*h3JVLw)2L+^mp8X;f>>sl?G1Hny!6q%z^A<*P>F6PWj%k`q`-THrAf@ zI(i?jPukGA%f?O*h72FPG^)v@=mpi?yh7Z)Hmeu(ZM5J`^`eU0oby+;%9e9Siyog* z2n+oB%xlTZt!*sL`qVp zyW-n`WJ7zY)Urua@GMjpu0?RrgYtY^5e)VQ>f#5!x^Rvz7JRtq(BQyOa-!r-Auil6 zA|fn;iwKGEuje=^)IVwp(F+02*dV|-fx9;DY4-q-1i)eWi#R^Z>k|ytUx<5?Gz8!m z?os0!4Rk;r2H=4JI6TXIrvnhybr1lDwI~MRUNqn+PnTBwIHH%j|F69-56fwL`+tfK zQ52Oalrd3?3^^zzMVY6J%_W*N$WSyZ6`A80BJ*&Jks*?jNJ2=aj0YLg5gp^Z?!E83 zw)K5F=e+Oly{_LMzu&s9=h=IG);+CZueJ7CYp*4+fPLUV4!$-Cet5?NM|xYJ-o7GS zjn6~B8HdwY=MWCJL;r9NAB{$h<8b<3h|-Ph>5cRr9DP3e12~-GNn<}GXC=lfo};I- zw3fqZeSa#4cSSh|IGoPPqA^|4tBZ8G96gP7QXiP;e?$2XIeIrthcXU#K>v3RFG4vD z=*q&OT!o;Y&MqOndy!v@qo=b~+H?48^h?K_L4E?tf#s^;NWP`$l?~(YCx}nva2g|~ z?|exP&7n%a2L`>}F?|+tawz}eIUL@t!6kF}N)eWA=kOxL4|6!ZYYFR284cNKgLL^E zJ&KW0`6BwkX#aDL-U0m-Z=$DiKrfes_do^GGvOe8E~A`2sE6oj3}66<(;R>$hx?

%;Eb{{&5aJf%JDd9O`Ir(lKp_?+*cGZD1YohT=_-y8PxThrFM#Z? z9o_&vvj&#g&dg-`c=@s zGeSZ14s6YKAG$sy8)RzzYX%+6CqxC{?iPXmw)u~M*1Ng)Y*^tDgWf@ z230Aje-uVo19^FV=oj$MKJb@AqA&-~m(-!SY6xtS$4}pHUaqDTZ+L!IhqG<|{~Kf1 zz5D*R$FBX9JPXk}vP9UKnTQS``9Iu2oSOyPSda z6F$m$!EV_2bQT-8PPd6uYkbTqJJ#y?1*<>U=Xm3vGxVZO%_l|dERN!rhZ#e>RU!K( z3BEeh$N>TDloT7&EdQx+jn16g(7o}y%nF;v`k7@dK=!p)k);YY%2@tF+_IVGJz)s6}QTr!fa9~Ybd92mbpU>_oYZ*WO zE7SFYo&VJMn5?hW)1bO^1kO((QJFzE*)%})89>#u3UI;rnaMR4sY}}x8nB^S)c5$oS5l1Z~N+Y z$(>rHBsEw6edtzqyM(ASmx3zZ?I{SE?sT(#AKTuO4O=BAJ#pW9PJQwxZ?xREV)td!v`GnVKkN&> zaanJ=^PX-aPCxLonZ3Bx;l6G^Mc@N?#qkAwNs+WqIuT05!`2 zs$0Ut1LNu@_8qs}-p6lulzrW)Uu*M#0B=O|+dpA~f!^Ws&i*k)K06lu}Z9gpNB9JN!4@ z3rgNcokkycrIx=o(<}Vyxx&8h%tnQMJktE)vG?P?Z|t;ar{?*b`(Yj?wp+tm{?V$@ znFhX@TbfrucS)@3sUn4kg$-v>97ONW{}cw_pMoPli*J(gh&qE*tOh(dJ;TCXIX^Zr zYLtaSYrWX{ku%iB3?7u{uh=N*euV#l%wA(g1w{C%jTm%3-zOzA=eXC|?o&3kP|v=! zF}AtOnNNSNvfFd=LWs@}iz`z*+l+iY_(zA-Rm;C09{VNg$DX`d7q-@M8M)4+*Q4-5 zp}ONV4E`|q{pqgjcgHrHw;m~-`E)YaZhK3I@;Y_4 zv@E3f4f>Dxx-Bz???0?US4~aPR2pZW+)qaBH zce~g&{Hp>D^UMOHk+I_q{Liw&B$9eV!(_9l|1WN{bz2OJhU{TkF(Dm zr(VaxtBzNuU3OK9TDiZ&rGoNP`Pq+5NB_8XzJBPfUB7SMs+tttch-e*V`HYaxjOOM zxL-$mUkW|8iT_N;n8dcNuiw}0cHp~gK|9}D z)%lhtW@EJ8+U(;idaMe}YZy!3R6On4DB~$ChD+qgD@nQ{)f~{5lZUsh1@Bx7 z4r3AW>)d7ta%9H>#=|c`NXi1waAfSXU#ZonNt<^XTVeuUH5F;v9R z_ayuty9WpKD(pwNGR6;ZXoCo+y&ie_mJ)i%U81M4NT7$jB%GQ8upM7}*j>$B1K`k| zrm;xrTm|t0y>zYuaB46A&0K}Fl+!ya>7^1%V>pD<7#3X#*TMLY0i&2Byg>BICgGKE zlIzIf)6nn1;fd(?;cyx&gm+SKB>$1<70xb@;*{U3Fr4VOpnp4u(;l9CIGn~hx)M(MXx%vkLz$-MaVAF}4MLdX*Ne{)VcBY= zCpq-I@8jg?BmD&qr#hd;Y{*Vcq%Y&-BP>${qnRUmlCRF;@T`N=;qbm9Ts=2Ia>yR( zm^-9pJEZ5=mm~bs9-=^>jsf(HfP8p{$x)q2=|(u|0eW~IDPEnBfN*Q{Q#j%DTp4oo z_UNa06MZb=^gI#19B~Uy4wX03PxPrsCmkaO`}ZL}0k3>~br6T_fgicSctbdqD_0Ju za{E6RBldN5V(p1^;P?N*v10xu0v|WZhFbTEyNDgSOr(T<9q>Y)gKI8cYF#Hy-)|sU z^@Z0DFFzoYAMg3M{7|3rWe${?V__qE0RzYTp`Rew#0A(Ozb9ufM^@`P=~#Ghn4`U} zApM}OAbv`}VGNU}KOGZ<`X!7^aKul3Xb(9Pg`fbejEsm7uRJZ(8$fD~;dC*=2A=rA zekc;8pX{H_FnRXxLjC0=5U<2fuot_Lr{59v6F=y0$bQ66`k~zf{rp&SvJwNCt8J{F z(jk`7$m93JiakM)Qu9api9eb6YeO{s80a4&e8L0OqJ&5`9=!$-}Pd>?e;u8STFzp@myM{R8F&1hV6FeY@+3?w{64 z8=D&8VDrCUCw*~njS=R;ZOvFS+YqaiK{jz2!d7i@X|Us&bhx>S?ednm+L57bH!G3m zR`vL7yj4sgZFAIc-|D(EZpzbLot0D3$|c77O9uWbJ2QR!SF&4m(MkpBt!N^flV1)MP!2bG8N&wPNoc=YfpEQ-0&*-Rc3h1}?icvof+FWlQe%@-{gBTR+$?;fNghQtY6 zkph*1Tw*msS=I<9+bCRw*|e;{)JTDuv4Q5Fbg=5W7_fNpLQe>*dss^t}Hm*65WoDMGrQfM(k!?)INH zdvl|UNKY4=#AqO)l!iizh(ckm%+RpAEK;Cmih$`?L3v0X(+0UKVZ%g9w&{{Z=~a`U zEW1%nO~EGwE0@2Y01baV>Te4iwD4E}*zSoxgaSDSU1YWz+c32pVkSyE z`GfVrq>pQynBI{YknBH#+E-U_@*8J3hJ@t;N(3G@sme0F1{0s4>c)i%R$?^p{6iF& zAURJC6qkQs%$3V{5X_@u%BItQ?mnKC!oVuHL_tXWf8@4^{DWCnQBMr3tgQaD1EQN9$zZ$awWJsD=)+p#yE0X5ubjcvqlQ! z6kqI)0vTU?MOG*?!d-l{*gut)84(ffg|@gWw8bVYWxBDpIEb~c$RkoPyqTD#*O=u( zOZyTYx}-9NB#x9-1&+)lhKjMPt_qlp7PV%S__ESb#>NH)$WquFNh_A&XgnvUY;>(b zOhxxvRa6IHCPBaWZ@Z){elmZV6@2ZY!fu3{Rbo`tGXRzI91N>dO;|s2f zY`E_nPy!$LF!LZ1%t*4p$(6!nc8oyW%=Ra7A~ed$pBW&?7l9FO!GcK9CyMiM3l!4H z$vME+D=1JjN06j-fZ5#?C8s7D-Q1Ol02j1^0rAP!`gMK8g?*eo9Ff7 z8P1bkie@AjU#qfBH6HlZ^pAr45vPyD=$1z)Oop`#t% zeWk(U>y>ILhg16XFz%RiDQRdk)1o@Nw$^+3xTW#<+pAZMOiTapvM9xNbC(ncgF@3O zZ{K@#?f-qM{*&tm#?So_Vp`Z`z}M8v^LJivdSKgt&lcf#cJ?yg8?@n&-}+O#bHl@1 zo;x&nRH2pm-I;T33Kdeu|LWg*K~&1N>|b1Vj(^p#)Yne?*^IfvPkq@OR&?`NOvyCM zHv{XWHYtwD>{J+)l3?C5Vy2=&{a4EOmZgMe)~Ua~zL$03kQCKHG3LKU_$aonKfiw9 znl<_fs%piPrs`%Ig{!!SCYd*j=%RQkYjbQ_{c!6gpR+65g%3FNM|Ne8aO=vMkKSl1 zE^tv*+|Z$L)-?6oD&e7dTDt4nmyg>sHf)|^XmUZj@P&1rpSCOY42VykpseEPGpp{V zo2R0#^h@laF|4)L_6aGjV@+aKE@^n8fmfX&jV4(+-l=;-&E)01vN8LYjC&oV(bVp~ z%K2Yn8dx@ZSFgeR^}np_@%!3W%`{AX2e@TCYUI%UcuIgtNX8zOe%9x2?`=9Vc5keC zqVh-O247D!tumW%=T2qw_%^nSo@`rus<+Fkv#nOCC+L^$YE`f+r&yyPz30bGtqO{@ zr#Tn=-XeHXZqDjXg^thG9ho~MRbl`Bj(&|#?l3S}f2c``h0B7k&7OO0xi<4h-Ub7c zIjj4>@Y!;xm4d;h_eP2(y;A!qYic|F5;Cq?-0gPJDvM1xi|9Up_z3bPcfR^w_U*K;v}o2I)erdIMHi|MS6GhMs-{J zI3De?CaCq!lM4gJPN~SscT7&66VUuQYgau9 zP1!Xf>&*GdV=gwn_C)>cc&}L+XKwe*RN9(SRNP4;WB*W}aJ~78U8e-Qs0WuQmal&9 zJ5Mw1QR78jW;kuO9NppR5upLJm-k_m8vau@>}L?Pj57AZDbGQ z6H3PlQcK@`N;)$8+w?#CI4?eb^1zAbn)%yCd^Rx%{=(wm?uGc90_w#;CoPFB2SN8K%3-vqQ z-IZ^tZMeEd@t$sxN{+GhsqF4yT8d z&r+UvEY8&(U#gS_9mR9x^P7gJv+;45#QKLy@`<1W#_B6{q zGhgLKznKw(^MYp;o$sTx$M>9hi^Tf_JN4e~&~{?~wGVsbZr55f?e((DkF|Sm(}l?`*reYv)*~lmli2ck~fshi#Qf_x$cuDhHBkb_$_zb zeq>wSz2%!58IO#(*<^aV;?mb+mLB?{U~)reg|t4V^BZAI2OL`yH|E>~wgzy+sCL&@ zTg0syQaC0$qRofvpERCrx&3`*vmf_{TiE_)=`hEm_qx1o7F%y+Iwt6S-`2fk?0&QQ zvHA@)vf4+gG~cmN-F$?3^x>O1d#idcU9q5K{p7X@j&qB$ilT3}9BjSBxpYkIF8evsWseE`D7e``e#(50({oKJlvF>vLJ*`gY%pLsETAMryXa^e|xB zJX?cwROuCbw1Z?yW2DtCgQ|N0QRyeaS60y zM1tWhr7xX#NdCDSqQ?!lYdTu(LFirIjn>ESzj<3?5fwHrJ9~3P%#7hVbK5Coca7RK z=*jRYmrlIOD9tbnw&>sN@ty2b^{!4U-_s_eukXW%ob2?xg4ZE`{`ve$$erj_PMJC` zSB+F|m@IPZIc(jfCE-JReE+k4z?gJXOOFl~dQM%Ik5OzE9dvEh=6Ks?!&@C!=~7T| z=z6DK;Z3VP{NmrjANIxLxZ<*BbR- zdS}DpuL-4{JFGSjN?%<5Jn3%kmHMgP`Q;t`hfm!Sl(73=r?1v}_NOlEy&7|USldj~ zm=hI`n^qj%I_lK2<@OVebl)nauQZWuU%Nb2)vj})s;b)qPmi{`1D=JM&Mi6J>dTv; zs5xTe_9>lPZ~L{})-V08=d@x|i?^Dcn(LL%I^Yyi@1>Sv zgGXiI8;Ad~WrW_W59`J_=(KHrSE1x$*`6c)Ui9wzzNM1e%@2-~OIkW^Thh&YulA%R zi_OQTUuwJN+qZ5`U-zCdSnzo2o*AdEcxX6nDqN6rpnkahrO0f%<}0J}o`0O19WUFs z#6PUd=rj8osu*3_yTEAb-XV+a)t;%%Yb~=KWAHNf`54dDc5RI=xo#akFwD67k`|rU zM7Zi-nR{}{vs354I?EFEmXvO|(BVn??iUX?>YUFoUl3q&VB)XMr+aIzdmHMgRdKg4 z?}JvL>_EZZH>&4nry8HN+Vn%^tb&t9L}GRS%M0iBYRa42xVs}-8LMp^nb$ZhY)nbB zHfo9*$}99|j<3w~e|;xW^FT(0o9?&I1qqf~MQi(hobO(+A>cye->%HBqyNrX|8B`3 z!!GNlDW*;B+V;wH&4CroGoM7YY0_x6#b0)}HGgTCI->cKmO*zEHU=eUzK)sk?D{N! zrDu~>?^G(h$%+fS87nBXO)b5hqvE1Dj*H%7nylQB4LXnR8;Lt8sPb=E)z2xLI*>BB+h|J1@imc;d z^J1K??s~B+sB___31_uFt$nDq)}i1)L3b?=%iRjT3pzL!6i!&F>hti-!wvVRb}#sx zGwGAdypboH_@}tK3>|eZY+i?{?mP30#=K43m$|}d$Bq(}WiAzm>gkSXxVnQ@-H?sS zv(_wkcUMUMq&{|u=Y+$f*)s90VFO*~L|oF&?6rRL(jhJZUG<&2msG4?^WfBeUB4DL zqO^`0C+E41y*6dpyUE7AXK#G){FjRthCMWWu)J>JPJ8Q4(L2JnuN@LIbk~{-m+Ccf zbu?04njEVe`QA8n*ZHPZJ_o|nqsKmMZQXmOwz6-~weq>2{(Rfw!Va&_ld^}MPE*-f z+S+5!@_^41l}t3RP2Dzj&fTs#zuSHYGSs3mp-Ki@xPt1=PVewb*G|OvI z+mu@QESbQU}>p5L14Cvi(q~4qorGoW+y=RSou)FK$ z2~D?r2&%7o;YzO~Q!P7AIxynhHv7u9Z@u5ZYRQ`S3)Z4fk z`t@8-JTi*Yjys^um77PEuHjAbjGfIHl`>{L$ABu zv8`k z#;~@F)_45{Z5gc}uJb|I{2s#kvmZENy&;7wj;mf@JXH*qJ%lTTvo*?!H^n8!It&hD zKXAfF9uk^5y~K6QIxK7(5HRO2wFCC*cN6#F2U{)*6f)U&m;fL-b^a1I^VeaJFde|I z!dkoP@SUO(hS%mGo&Go0I>QncMON$5p4IeG3)rr}a*Gz_Q-`55;>DOz^_ZXB|BW*N zdNAeEHPb?wV3;AZPmK(dT>G(mdHA4OaO+xdSfeLT&gfcj`&w{^T5#7|@R_yXezoAR z?}|J-V;K(VM(IUsbC=dazq%HDV=ed&luzI33(p$EcGp6GuogV67CfUCJi8V=pWzT+ zzMR9_4|(ZRQVagL79585<;i))aM0_A{TZRIU|2;h^q*_N64mk#^6(b5;JUTodJG4>rLZuIIa(78Ym(*3msO7?`gzZC_4GGn3;mtEoV+}p0@%ua z_aGk^2M0srnp-2;TpWt?7QX^;hmlp`C<}Ks=;tbPck%KKaFe;iz$&}=ySd3+X0S0- z_V4ZM%Es|v55xcbXuvaoDVI69xVQxb$Ur1`1yOM06+qu0_yq+92*Zx}K>~b%0D6H+ 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 diff --git a/makefile b/makefile index 730a956..7fdbc5f 100644 --- a/makefile +++ b/makefile @@ -14,7 +14,7 @@ BIN_DIR = bin CC = gcc # The C flags to use -CFLAGS = -Iinclude -fPIC +CFLAGS = -Iinclude -fPIC -g # The source files SOURCES = $(wildcard $(SRC_DIR)/*.c) @@ -32,14 +32,15 @@ all: directories $(LIBRARY) directories: mkdir -p $(OBJ_DIR) mkdir -p $(BIN_DIR) + +# Build the object files +$(OBJ_DIR)/%.o: $(SRC_DIR)/%.c + $(CC) $(CFLAGS) -c -o $@ $< -D MEMCHECK=$(MEMCHECK) # Build the library $(LIBRARY): $(OBJECTS) ar rcs $(LIBRARY).a $(OBJECTS) -# Build the object files -$(OBJ_DIR)/%.o: $(SRC_DIR)/%.c - $(CC) $(CFLAGS) -c -o $@ $< -D MEMCHECK=$(MEMCHECK) check: $(CC) $(CFLAGS) -o $(BIN_DIR)/test test.c $(LIBRARY).a -D MEMCHECK=1 diff --git a/src/mem.c b/src/mem.c index 8feda23..d62ba60 100644 --- a/src/mem.c +++ b/src/mem.c @@ -1,3 +1,4 @@ + #include #include #include @@ -7,6 +8,8 @@ #include "../cutils.h" + + #define MAX_PTRS 8192 typedef struct { @@ -94,24 +97,15 @@ void* dbg_calloc(size_t nmemb, size_t size, char* file, int line) return ptr; } -void* dbg_realloc(void* ptr, size_t size, char* file, int line) { +void* dbg_realloc(void* ptr, size_t size, char* file, int line) +{ dbg(4, "dbg_realloc: %s:%d %p %zu->%zu bytes", file, line, ptr, malloc_usable_size(ptr), size); - - // Unlog the pointer before reallocating - unlog_ptr(ptr, file, line); - - // Reallocate memory void* newptr = realloc(ptr, size); - - // Check for allocation failure if (newptr == NULL) { msg(ERROR, "\trealloc failed"); - return NULL; // Return NULL on failure } - - // Log the new pointer + unlog_ptr(ptr, file, line); log_ptr(newptr, file, line); - return newptr; } @@ -142,3 +136,4 @@ void dbg_free(void* ptr, char* file, int line) } free(ptr); } + diff --git a/src/string.c b/src/string.c index 22e9ffc..b6c3293 100644 --- a/src/string.c +++ b/src/string.c @@ -7,7 +7,6 @@ unsigned int splita (char* string,char delim,char*** dest) { unsigned int count = 0; unsigned int alloced = 16 * sizeof(char*); *dest = calloc(16,sizeof(char*)); - char sdelim[2]; sdelim[0] = delim; sdelim[1] = 0; @@ -15,14 +14,12 @@ unsigned int splita (char* string,char delim,char*** dest) { char* token = strtok(string, sdelim); while (token != NULL) { - - (*dest)[count++] = token; - token = strtok(NULL, sdelim); - - if (count*sizeof(char*) >= alloced) { + if ((count+1)*sizeof(char*) >= alloced) { alloced *= 1.5; *dest = realloc(*dest,alloced); } + (*dest)[count++] = strdup(token); + token = strtok(NULL, sdelim); } return count; diff --git a/src/system.c b/src/system.c index 575a984..0f3d3f2 100644 --- a/src/system.c +++ b/src/system.c @@ -107,7 +107,7 @@ char** ls(char* path) printf("Error : too many elements in list , reallocating\n"); list = realloc(list,(count+512) * sizeof(char*)); } - list[count] = dir->d_name; + list[count] = strdup(dir->d_name); count++; } @@ -209,9 +209,7 @@ int mvlink(char* old_path,char* new_path) //strncpy(new_link,parent_path,strlen(parent_path)); // add the separator - if (new_link[strlen(new_link) - 1] != '/') { - strncat(new_link, "/", 2); // Reserve space for the null terminator - } + //if (new_link[strlen(new_link)-1] != '/') strncat(new_link,"/",2); //strncat(new_link,rel_path,strlen(rel_path)); @@ -291,3 +289,4 @@ int mvsp(char* old_path,char* new_path) return 0; } + diff --git a/test.c b/test.c index 8c1e8f4..6447807 100644 --- a/test.c +++ b/test.c @@ -24,7 +24,6 @@ void test_isdir() assert(isdir("src/doesnotexist") == 1); } - void test_rmrf() { // Create a temporary directory char temp_dir_template[] = "/tmp/test_dir_XXXXXX"; @@ -79,7 +78,7 @@ void test_rdfile() { assert(strncmp(content, test_string, size) == 0); // Assert that content is correct // Clean up - free(content); + //free(content); remove(temp_file_path); } @@ -201,8 +200,8 @@ void test_ls() { assert(*result_non_existing == NULL); // ls should return NULL for a non-existing directory // Free the result - free(result); - free(result_non_existing); + // free(result); + //free(result_non_existing); } @@ -213,14 +212,12 @@ void test_splita() { assert(count == 2); // splita should return 2 for "Hello,World" with ',' as delimiter - //printf("result[0]: %s\n", result[0]); - // Check if the split strings are correct assert(strcmp(result[0], "Hello") == 0); // First string should be "Hello" assert(strcmp(result[1], "World") == 0); // Second string should be "World" - free(result); + //free(result); } void test_countc() { @@ -253,9 +250,11 @@ void test_relpath() { // create a temp directory char temp_dir_template[512] = "/tmp/test_dir_XXXXXX\0"; char* temp_dir = mkdtemp(temp_dir_template); + assert(temp_dir != NULL); // Assert that directory was created successfully assert(isdir(temp_dir) == 0); // Assert that directory exists char* start = calloc(512, sizeof(char)); + assert(start != NULL+1); char* end = calloc(512, sizeof(char)); sprintf(start, "%s/a/b/c/d/1", temp_dir); @@ -273,19 +272,14 @@ void test_relpath() { res = pmkdir(end_parent); assert(res == 0); // pmkdir should return 0 for successful directory creation - - FILE *file = fopen(start, "w"); assert(file != NULL); fputs("Hello, World! - START", file); fclose(file); - //dbg(1, "start: %s", start); file = fopen(end, "w"); assert(file != NULL); fputs("Hello, World! - END", file); fclose(file); - //dbg(1, "end: %s", end); - char* result = relpath(start, end); printf("results: %s\n", result); @@ -302,7 +296,8 @@ void test_relpath() { fclose(rel_file); assert(strcmp(content, "Hello, World! - END") == 0); // Assert that content is correct - free(result); + // idk + //free(result); free(start); free(end); @@ -382,8 +377,6 @@ void test_mvlink() { return; } - - void test_dbg_malloc() { char* str = dbg_malloc(10, __FILE__, __LINE__);