From 93d72e16aa459a0bb0fb2bd759d4f9b63922d167 Mon Sep 17 00:00:00 2001 From: marcelb Date: Tue, 27 Jun 2023 21:29:05 +0200 Subject: [PATCH] Add timeout callculate and return string in obey methods --- src/tcp_socket.cpp | 12 ++++++------ test/client.cpp | 2 +- test/client.o | Bin 40560 -> 40560 bytes test/server.cpp | 3 ++- test/server.o | Bin 40464 -> 40504 bytes 5 files changed, 9 insertions(+), 8 deletions(-) diff --git a/src/tcp_socket.cpp b/src/tcp_socket.cpp index 2f2dad4..aa27589 100644 --- a/src/tcp_socket.cpp +++ b/src/tcp_socket.cpp @@ -126,8 +126,8 @@ client::client(const string address, const ushort port, const uint timeout, SSL_ } struct timeval tv; - tv.tv_sec = 0; - tv.tv_usec = timeout*1000; + tv.tv_sec = timeout/1000; + tv.tv_usec = (timeout%1000)*1000; if (setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(struct timeval))) { throw string("[ERROR] Unable to set timeout "); @@ -206,7 +206,7 @@ string client::obey (size_t byte_limit) { read(sock , res, byte_limit); } - return (string) res; + return string(res); } /** @@ -226,8 +226,8 @@ comming::comming(const server *_srv, const uint timeout, SSL_CTX* securefds) { } struct timeval tv; - tv.tv_sec = 0; // za sad 2 sekunde timeout, harkodirano - tv.tv_usec = timeout*1000; + tv.tv_sec = timeout/1000; + tv.tv_usec = (timeout%1000)*1000; if (setsockopt(conn, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(struct timeval))) { throw string("[ERROR] Unable to set timeout "); @@ -313,5 +313,5 @@ string comming::obey (size_t byte_limit) { read(conn , res, byte_limit); } - return (string) res; + return string(res); } diff --git a/test/client.cpp b/test/client.cpp index a026c56..0a46f6b 100644 --- a/test/client.cpp +++ b/test/client.cpp @@ -11,7 +11,7 @@ int main() { secure crypto; cout << "init cert " << endl; - client myserver("127.0.0.1", 5000, 500, crypto.fds); + client myserver("127.0.0.1", 5000, 5000, crypto.fds); // client myserver("localhost", 5000); cout << "init client " << endl; diff --git a/test/client.o b/test/client.o index 788827dced1cc56c65bf03f74d07d7cdfe8e6d29..c6d1ffecaac36e626f3a487f2bbe4c636dbdcb8e 100755 GIT binary patch delta 3101 zcmZuzZBSHI7(Qor?=Gvbd?T2mA!-aB~(yRxwc7U=!iAm-uK+QcLCc!=i`0e_j%6ObGPe& zrR#uYZy0rcd@td@kA2Z}u_ewPIlgdI$tAz~RbkRcZ^$K|ZY}!US7{B8rLyn+gfC(( z>tb2K-SxDB3F+JEdbTrtGF`&j(_3hb@8CUm#$+iTNz*j1Un=(hod0Z;)SwP;Q0*}G zdP*Un)bems-*E8})k=uBDeVaBnwBB=sG8>SN7nkw{bkR6I~??>nU^$8@*a|^JTF2O z$=j&z1CTlVPO1{pV+oPG-%H*$b^f2dVvXwL4j3vziW>n4t)6N^^Rdj@Z`@FoM3z5D zAuv$!;1EgtY)@8d(WZ+y>P?>1pL|b@S+SuL&>@{$P`M(!ofRa%HpPV2voY?WagSkn z#WN2%6?Y=?Mzg2gcgXP&(3c;$0I@y_ig8Ur7F^Ttkb>yG3Oadx;pDWS0x_h(!pn$n zBI)z(npQ0-qPj>*w~f4uup91S@&>;4Hgyju$n%~>++kSJ-;v2TXL=8ppDGKNszg6d zM?iX>w>{v%7#AyU#rbRJQF}9X-w9=ccDxTbJISEP;}q?IQlmI7Pc|^o1}4qGq3>K&T$Qz~ZM%at)>_Vsr3x?u2w4E5zfMi}Vw^ z!c*anh#k15WvG|;@oW+!%_C3xBN%8@dw3n;`~$&*nRCC1i@*Y$!z(wc)i4Ua2!n7{ zU&33c(IjkgnT2)+f`LZWs}sI#5}v)!#BGKGy-%NzGC^I332bR@+R#MF<1d>6ikfhF zLjVld(HN~}+p-7E{R9=%NnTM6WCSDUF+T*%K8M2weO;2bMe-hpVi9~+RD(&oF=?`> zZXcFMnNu7#`iVA83nW6=uMkOje7~gR!$ri@JlupT@g!>6%N`LETnjFTW*$7p-pL;s zlfdiq3y24-W}agW`El%^m>stOLyG4$yh3aJZY(p4#m|^c6}D(bs(h&x=JDBy)fifg zXx_&|of&TKT@1Ga9ds4M!h1i(kCNjinK(NXP&`Y3?f(o?tX67yEa;BWhI{t1$KPj+ zTXf>=ZI>a|6sn-m^?(4O&_@BTfu?{g{ke0{FkNVvDRlWn6E~5q&KY9)q?LV;Gh*(V zGr?Wpd6quKHw`e8cB9jA)<(4o1u4REe!oz}g$X8Z8;g>X<>^?}*m}ji5M}=eir|)S zLEm56FJ=X}{?dLs-A7IlF2h`FTu6@4OU^}3CLGU15h&+@@Q|LKR`#WoLTlM+DT$`D z>(U7M$zI~B=D4B$UjAu0sa}D|<^AwUGTlW#_6*E`PftFmLl;~eit}BIH{xTAcuv3g zHNL7gH3H)@6d2tP@T&p1a;l%r_PxHdTSD8q);}D#bt+Ej2HeEgWjZ{6 zwX)9Kgy>^P4gMJfE%C+YrBNEgvhoMJ9Jp@7>PlMJ95LRNsQVFjzZ=cm>we-TxYyYs zLH(;4yl&hW3xC>;>IRfpC44$Q_zo@`&p;8%`5b)RPx_K)SJ3)7rMBrO;E%*YfsmLk zOzej2v;{XbEfuyttOv?NyZff5l|pO%$5;QD%SL^yVP1l3 zs}Sx8ONDFpCj8l3#xBkqP2XY>g(ECc0XCsxS zwjQcCGIzk{#z3ZFYXZ`Z{8N zN5dmb@)Gvqe8MGuk7tsdiNo-FoOg^<}ty=6?8;MaGn&Ljq+Fb+W0*3 ztY&J8+&CKqK^UrlO2>HbLA2iuW)$`nlbCeASiG zK*7bkVL6o)r$r{jP!Pdc2MY&$aa1YXC#+7_0GE(o(z=#gHS0qLf1@Q^1J+aX$WdCz zAT1=}&5&o*1@{}Og_t3P-I$u$XV-O6K~$8?;#VB6K_qKbTKN&!E%J5V!+#%Aptgt{ z?(#|M1$1L+(GuXBA&GB56PrWXWCZKynfb5R;gS0=TrOm!_vV)k)#FkDfN?lydgQ~@ z@)ov6xSL7V3H!Apd=;bv)wcKu_cP(#_7PsfARpnMq&Phs?<0=%)Zi>CjFz*=pNCxb zkaOvgSrZAD>@|bK zBlm0qNX|0Mdxm9$^teF);NdH2GEs0H~*TKSp?8l0Cn+n4$L3F zr6X=tpC1ca3Tj2Jh}{{)U3gcITT3oyMi~r^I}lf75B`)#OQ<9gDa+gZb|l~v?2(od&2p0S)XLSY*`(DT8IY`5_Nyc`tNX}ZmwidEboYd$H^GwH!1^)idOt*{ zl#~4dV8wB$0n#ueo~+O6RDSL%ps)tQ&TZ-y)uzqd*Fh3s5k4Yn2iXlcdIyC2XVUFMWjGBzILd1PyL*W?+HsMb+DZ2m?^DOKM-YdYiW z$qv4ESbqk|TFP{~NzSe(-E)%q7qW-pkspHF#hF;O!b$MjixIh|WVi*|E9#^rITe@` zM^D*1uGlo{C;Hu;#vyc*{>}K3jvHGQWe**PKTwp5blm({QC`sT@e@Uf^+RaSQ%XU{ z+~-;$>0R83UyDMDK%qyXrT+6@dEN};eamF(pA@9ZD%z-+%UQ`jHE59#s diff --git a/test/server.cpp b/test/server.cpp index 1a0e44f..93efd37 100644 --- a/test/server.cpp +++ b/test/server.cpp @@ -18,7 +18,8 @@ int main() { string fromclient = myclient.obey(); cout << "tell client " << fromclient << endl; - // sleep(5); + // usleep(600*1000); + sleep(5); myclient.tell(fromclient); // myclient.~comming(); diff --git a/test/server.o b/test/server.o index b4ab8be04bf252f7f9aa00849e93a1b8571804e7..a5392e9b91367ffb04d1b6159b1388d4f9d7d503 100755 GIT binary patch delta 10168 zcmZ`<3tUvy)<0)v4lu~m2Q$ONK~NqF3>b)}D4GKUieiPJNz&EKeB8vhsSTx=b4PCA zx+bO;b-R_{XNBSI(;kNDb-dlYVVPOJP_K539{A{9(sI7F_StjhfZwnHKe{CoYG$zrSxz3CL`ExQ$}_h^cE)#NSV)xtGl;d z24$QHPm89=D$Z5KxvE-riDSh7ck(Gd`4kxSPxRfN6}0_O;GGwqn7(TIKbA($GVdAo zI&9LX#7#sMBK`-Es>p5Fj~56l!T(8cTwf^O4_SdG$TXNCKFADJ2D3PTkd}Hwy9g^0 zUKG$O&PM1XaV%U5w2Ai;SxjO~r9q9NIE}jR1gD7NA6im-jSG^NEO_+MMJ@CCWQw95 zw)I`&Yzz{F2-Fyl|D{Q*dI>@=p&2nMBK|$8p~nwdgvJI6`&7C?aB+Gm@>d^!8|McL zM>tm9wN*#{eZj|HyggqM1WCBa$4gT;JF#mJe!!ZFDCmXPI58i`eII{3R1l29FC5$3 z@H`q2B|6!u3YLWn5@zOK0$6A=!I`L#P;-rf(#{zLJ58oguA0Gbz(GWs*D5@L*y!LG&ivIB656Uk4e%SH zY37j7HVqm8>1GqmK(t+h20aTXIyL^M-__JI;a*C3j&LHog4M0X=vszJ^0CZcB$toE?6jVY`BCN1a&SUJuZ*D{a3Ho;qLc+8N8R8Fkm^JQzV9|Y&OnTuCToU zzolk`93Mn;|4Gw_L+;?j(EWbED8XZc`&a%FPJ(JnQ8%&e`vu#&+5kQ@lC-+oMSS>z zLJj1@4qOB@VkQ$xwicHuwk{@uyWb(WIM~*wB!-z9t8(3X5C#rO5~st2At}Ax0~pma zkY*CMuSsd*t5{!&#=EnQ|Sw@>%$I zdQN&5SK=gUoz%pXppnvfMmU0deGS7r^6vjYMotnum0=T?!CM(1HK4_RhaX3o45;IN zc*Hg`Y8YyAxDGnp_I>0l?Y{H!ad^k}P`@w9Ket_;?HFPhl!7a|RFd~VLM9luSQSSv z!-34<55=;Oe2lDUD+|(hH)&>By9O#(gfVa2KXaXBN0FnAHj?Wzxt7rGlg7c6thkKz zH<%r4Y9lhqeb8neG&z^q&u9}VXt}T>%dP9U4yi*^#a4J=Xm;fL*Sy~Kr}6aG*=s1c z{|${phYWNgTH^X%OIU!=L{~fUh@|Ix_;zTH`3j;Gp*lNKC_*3MJ(VDPq2V60xB*J; zNi)0dVhJXeR~Snw{MS8M>B)@6BU{NCm%YicZf%ng{-@UUtxNmj;k)+ZDJKX-Hcnm=S1;yv8t(d=k=g=EVKl^4S03o1`UBXhQ&J1{owT; zl&yX>YrCrn>!zmBujVn0nr##Vx3t;e^C!r!=1nxgUDie$-YvLJqEYW7H&YqD{yJSQ z754(V>)lG0tL}~U>+PiD!U!HYLD3td>TS4Bb#E97@a03kHaD1x^YU%WEn+c@Glhjf?tkz7JQ9=CG|?=J@OMMt;e34(OqBp z55%u34EHN6&?sD~D6Cc$emhoGxCsTQ&iQ;>0W(JAragzc4&ZXr>4_KQ8g&>#ySt$S z59w~K$nU-I(TI5G5;mff#e!kzW?O+-)mcgDku#AJ48}%wo+xN{@>RY+quu^RWHPIm z|L5hosEY51I^<#=gle<qg8uXpnx9hmrd+W%&wzQ7hk|f?q&;P z%Wz(f@^g*6n@eW)o|ik(9WJXMa^1C^JBe@I;mn7|&Zso8@BGhFmS_fJ z(^~o+sn=QxeoOONPF5{_g4}dVbJ+ z5k<_Wd_K+c4N2k@zw(1DXQ`~6WI3KPwx@}8reC=MUe1qmK2PG^wH2h(oo^<+vy^3H zCwzGiS~;>SE178P^GcOWwsUwiisgn5ErYuC9KO3AuUFs=T_tFL~@sCX6rH(~@ z7GIoaahCZIJucdq&qof(!%-X`4T7q1rpTQaRBc01n;Zul#}zp*p=bxoTRg606T3Fn zwmSJemW|n|UUFJVteUdk3sYlaQFE$Cp1|Zv<45^o_g=2bH~cqrk2jkz|I}J29pA6_WG28a`VJz)>@m6T37%X95;r({s%Tqcvlc870hB`a;$Q$z(Cz4c$$8)abm6uhV&SB#oiD zilLdRp|54Bd=r?VkX6)Q_w5;&Qe+m_!n~qH-L5n6T#?y12B%)7r%N^CC_Cd>X2yB> zxzkEYd(2N~v3ZQspWyVu9`r&^pUmmWJ?O~_T_@WhrMQ1~)7SoZt!s^^C9fk$dEt`4 z{OkV0;m&DzvbfOsH5O)L7l36V7i5 z)0kjsP_}RJx7$>{d=fx;E#GNIo$uhV#~y!)8LuX`%x)U*_iJ=%G``PFm-ezFNZW0& zU*l&!H~Go8ol-2YVk%(KvLbL-=6m5AI5**5X9iC8=dBu=s;0auHRZiQDwLEr%$Ln> z^1$(IY4=ZMS7*wW=zkc4{W$xOOh2hN4^iTCuOD0W+&7mUnMHO*I?&>VmW~y zU3}r2N$cp5qo84u72nuE^Q5Eil(y-eueN!;f5Pl>7~9?0-aO&;K8WqvFTGv^GA={6 zs_^FQAK2Dl`!8${BRv5Fmx*)-wx!s_&K76Gwc9!CQ z1mc-!gRkIgEMXJ=o4*XuMKnc826FJ`Yy?JxcWQn^(Z`W4(MkB0nmgYLespnpX) zRFwybe}Tu#hlp<2Qf?KG!e5b3Is+%mlXSh#B71-QI2%`yC=P?M70EhtJIt#{(g_z} zb48N)9qg}2#?Q7FDiTwNV|-gMPKGvIJ$qQh2Hkz30mYm2>kRrP39ZM-2^(>p4nz91 zWbqV~O-mH#z^ZAKZ(k6_8;m>!?Tt$A<%z;QRxCWn0OVX{m4%eq8=)!J5)bu1Y zJ8!yGJP4K36UKiTD6TgBPoVw-QECp*cZkw&lHRS8E=u}#-KZUb`eyy4rvvqy4U?|~ z=zlgy|3IEVwD|2H)A=Cb%OLF57+VfaA0STHVieAZ_+IXgD1BoTcIt8t7=<>yw7!?n zV34|u!UqQG|13${gN3Gm1nk!bN(X|4_XF?8eru3)Az0`LBA)$Vn=vqFZ;~IAl(cUHb@U(e?x%ury$|2fTu+qeA}{dMpM{;dj1X8_f6OL z4cGV0wiKq!w~nRH##Hd6u|nUysrbh9om)Gm@8;U^Yp`d&HFEf51;uwdtfat&`Bu>Z z;sTpE7qS*u#b}taz!q80zog=NvEqP+1=il}_^yHqec7X8j)IRDOcGNda-mgx2C^1D zrmI>FdvsAP%?l%Ry3&DgEpC!AsD?2Mr4YI3^{n<3W#p^lv7^H;{1H3~J{;3O!%N}n zBAdnc-P%W8!>RR@6^~S(tj{@L*aU_CFqd)>@kqRIH>*O)N%P(6*+i>bC8#1|A~N6+XUBWlq#q>>#y_mS9J(NdPF zNax#37>_vd_l*4mFm|m;{5{oKf8;!!#a zfYp^$TblbQy456r*B>e(G(2UBi^h8dic3?5g5v8SRz@PO$So#5sY)F`Nn_}I$}GN0 zJ@GKB%`m`e3Le!@(UnlrGR}F7|BebStQ!YEZID`uHvTQNCF1!iQLKULt+vRycgYg=u`6qHOQ1yUPxgU$HHmI|i+d5yy&eOClu>wrCtPP`||+GY!_ z8mO?c7G5^?ftqdcku@CkwVAMIn@#;?oG*cFfNR@q!M>z6d~(a+7lw(UzMn_2U&SdB zx5pcO*9Hgd+McWV4bxQ|slSMW)E&9%Rjq!ZV%Z|7-r*I^P`xwPIM=CQQ(@1}T=4*0 H-I@Hqo+6H} delta 9694 zcmZ`<3qVxW);?#L12f25VP-&HqP*oL_yhqH859*Q1Wmo#Z)J*whOg8{ui|wYDRAX0 zAHQZ+mj0UbcgZKEfjun!Gesrwk$Spn;v++^HFvFj_M920e=Ga(t+m%{@4e2RIa7B) zQ;q+P{?)MpD>+IdoT!O=&$BgD8MTJioJ;aNn52vjCP9EWA~I#VGE7;}zHQYi<5*ZC z8vLhnuBn`BYV8g&Tl{|~pWu^EfZpw;E@w-hN&6$?=%7yD>-~yKQqL|Me<}@Dy2XYL zLlq+axsxjY_1KRP2rIbS-&3gP*vz)I8gl74AAi4lx+Dma z(9FjbajPuY)e6_KrXmV%!WK@O3XAJ?ow19Zagd^|h&1-*cCbXZd% zgQs#DjTM76s=t9q_dy6uhVdo)V|vlb|Lj zTVKklrEoSVN*o5i2PMPfATQ`^=q_f#1cSl!gu>41R*N#AEs+ORNFC}zH7-^Lv}p#w zL4!dY0k;eWxM}e6u3MzgJh0I~sL=pjjb7fzTu?0xN3;;pCKuEl79qM2QP~C6!7fC1 zBHHGHdcu!Jg9(>gExK2gE@|}wZ<7JMOkUnb7t{x`5Y0q1)&=#08Hko4+Sdi`44V+$ zh^W~G4TR%}euHSK3u=Vl5q*s4R2MV^dIlRHG1$v{o(mcZ6A&Gb=n5A!9I6mqiRd~P zG!hOXdH~V)UC=1Fh3HL0>s-(t5E_DU4#7CPpfNBU(LzL!-PRix*+Dqd@G^--I>0X&22zTv07SzT^#B1}g_w3Vx z;2SREZ$me=f;4d>OOOT$MEz5p$I^ znwoxX6@g}(L<)z!H}e@@zD5G@wpEy4l(&Z+L9Cn{9z!W8hp| zx5zR)j7UsU*+z1<5{2y;gvKX%-RVJdzoqF(P!b>Iebx!sweXMlunD()Nl;}G>L#{h z53#MPbmv1oNvouL z*#g7Zkooa-drLPyz#ZZ72=4SW1udlhbqau@<}r5V>kyHYk=X4?MV^&~NBU|M4L?Uk zdPZo#jruOb8s$%5Nzxec4QNUNaRZbkhlyoiOCAuEgVN2`&&;;GI+{w`rA0mu&B;#( zwvhR@Jb8*aLE9r1H*JL^?}x$^&>yC#qaSvVQ~Ev~%{=}bSuqUEoBQ`^X7NQAXtE-V z1#0!LTxany0Zt(4@`xm>q2D+sGt`qRo6scKfpPc-*S;7L(Oqz~^ZR-Pa>J+qX+}M0y^8 zf3FM^W*Qcusyw7ngbw3PN09Zu!ryusq-r$oO9<-~YutvjDUwb;PvYAN6MGrOUT~^c zsy>&oG|F+{lOE*rs4I(N9dZfsY)DH_>m0xsa0T=B@KCnG-1G!-8Ei}MCi+7|dX)by z#=|`BhRS7cc$A)+I2^B!WOyxETP5Ac3xu*2(iwra!U={o$`_#|<2jA~HXP0f?%VS= z1-H1#s-eZQ36=Ghafc(wqHRR69zk1vBEj96VCvHbdlCG52Zio#rODE<0*A68dDO$@ zY>|(^;NJ0R$I#fydf(Oc%jzq*+(1?C6_UG#+^NdLKFQUEz?R;DmPkc#e^qcD=5{VP zgC@{kt1@d9oA=SJ78eGkwcWDYKa<0q+SdN!@PcVGw$t``uqyR=b^ytYMtPfs1w}ew zCNi1T->LqeXqv6~greDc8ri=uFAIy4RuDB$(+XAYmxtss`yf^MXqYxY%;9q?Y{dr zqINkuh2*Q&sdfnp=&*bPSv*_hF{p|!-*g989y_)y&PL9b;$+KnusONzGJ9KOPbXLS z4R+EVfp=D{xD|S5O%tDkty$rg)7N=O)w|kLq{DIbAj>y&Rs*($ucDOWJddIa&=~;FJgRKTrh8JWTR!tBJunNay>{%0lWj;-%-}z@8R8QXOgGzm#M< zhfTzzsXBF^oN^4wse?}cDU+%+OfyWIw2EzGV)e^Z{jVZ1jZ7+L1;JKnwrkMe1KAmt zmyy)LjCyj6o|u&{@eAlc#SCRgvU@nqc#U$Mll2JsV3V5J4kOla15`84kcmqV=Acx; zcUhK*1Srq(6oL_%|+-rR?(5#mR@3 zmh%-m#9V2SPs7MT!IlktRExR`tygXgS5LeezxxcFFCqL0C`ZZC4^?Pgr)@lLvo?RU2QINOMN!A(G)e42hfK+n_2IgM)@ekdAd`Yo2@~!$B$|kxtIz7iq}S zKR)QJ=af6)T88Gyj!Av4)P6U(hZx&>0W+2n(RyUI71x<3JnYj7Jb@2z$90co4k9$l3tLF0w3@9C@pVpD`Kn1kV_vnAp2|=y z{FI+E;0GZtoRYUfXq595;S*Ki&1ov%*cRwi5ZdKYGwD~N zY0H^JcF%>(f{^k1k)Y(B8e*Z`qgWi!PIIPH^JFEJFt;|5wKnOK-lUH#Om}Mj=mOj+ z=nM@7z9GXIo1(p{C<0Y%VQ!p}uRv=-RETdodJfX}aQb#g8fx&o#Y}6FrDhm8G)RA( z53j}eDnppj-x6*+7ACSG%P*noYU>4^%3N@8$n9qTEWz||6D$$dDXCdO9Dwz zQU#0EekKR6(>X@x=ep%glA0?#NSc}}BJrz6zEoq>GufW@V#eD89l zwj7HQ4K<>?4m&Tfy~Z^(LDksgu1dN}rMJ?snW zQ*nrx0vW|oX>H%46O>kY>4I$q^}jUw(P~U*AgnYPCY9*K1@J;if;bsgmxPO(;eV0u{CPNC60Nz^jO<~e z0YXcoL@&rKjnVwl0@F&PHK#Aas?un&9zHFN5&hs&X;hpK#TcO`42qy>P-!I_)XcXr-_8!T~My8zt$MUbriD!~SJ=soGPh@)(W%RXVBG zQ#hz29vdW&@1C(-Cp;9TZ%Lh&s^E2p6Y7+>GbNskJpTVl)sFX4dN#GbW)F{L9}b_7hDHAkEZmu4A)9gcE-Ap|D`;Djrw5b*LL@k==QvLSK|UZ|+} z@?hV*w=zejT>X&emKT z2A5|inNB^SFz!_vp$2mdiCzwIbF%f%-~~BSFk%R2&Pmp^X2RQZlEigza?am0D~3Ya z+#x2%g7WD?5iWZ-oc}S@%r%JHVaMETF%ZOg1~HD+^I5%$)e=meXE1fgs}IdE<8zZr zxYFQJMrx`BsbtSQ{H#S~F5eNC@UsHpj-OOSD`ep)&B7gV2kS7ZA!5ERu8_YY_rw%I zB^_^(GDB2=lFB|6u_U`f0^c{ zX5gyPEOmQedZY3*t)?bK@LSA=_@f1-Y=G1S22(wswPL7(PUJFAz~lvn)N3>srPdcI zR31vRXe29LVaY;+*qhb)te(W`-Eax<{nRgL@mDl< z+#9zMCz%N;iY$kxX#om<$C&5B%tZ!qJk_ZSInTO5%G^vILmT3M6{VAGt_&wpf)>PA z4PpqZ(^)-?YSZS;#2S1-fNx_F=MS?o9ti2 ze_-KgyTDmQr=T5F9PMT>txMMHP$m@}j9S;nvyG21ZLeC_+uxDR9W6c!)>$y8j$NOu zFQUgXmLjNG-^ah4j~s0ToL!%+{+h~>0wTclRip$Sl{5ST|tG}CqQ5*ZH&z^Ps?4sKn?V