/* Unix SMB/CIFS implementation. local test for messaging code Copyright (C) Andrew Tridgell 2004 This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #include "includes.h" #include "lib/events/events.h" #include "lib/messaging/irpc.h" #include "torture/torture.h" #include "cluster/cluster.h" #include "param/param.h" static uint32_t msg_pong; static void ping_message(struct messaging_context *msg, void *private, uint32_t msg_type, struct server_id src, DATA_BLOB *data) { NTSTATUS status; status = messaging_send(msg, src, msg_pong, data); if (!NT_STATUS_IS_OK(status)) { printf("pong failed - %s\n", nt_errstr(status)); } } static void pong_message(struct messaging_context *msg, void *private, uint32_t msg_type, struct server_id src, DATA_BLOB *data) { int *count = private; (*count)++; } static void exit_message(struct messaging_context *msg, void *private, uint32_t msg_type, struct server_id src, DATA_BLOB *data) { talloc_free(private); exit(0); } /* test ping speed */ static bool test_ping_speed(struct torture_context *tctx) { struct event_context *ev; struct messaging_context *msg_client_ctx; struct messaging_context *msg_server_ctx; int ping_count = 0; int pong_count = 0; struct timeval tv; int timelimit = torture_setting_int(tctx, "timelimit", 10); uint32_t msg_ping, msg_exit; lp_set_cmdline(tctx->lp_ctx, "pid directory", "piddir.tmp"); ev = tctx->ev; msg_server_ctx = messaging_init(tctx, lp_messaging_path(tctx, tctx->lp_ctx), cluster_id(1), lp_iconv_convenience(tctx->lp_ctx), ev); torture_assert(tctx, msg_server_ctx != NULL, "Failed to init ping messaging context"); messaging_register_tmp(msg_server_ctx, NULL, ping_message, &msg_ping); messaging_register_tmp(msg_server_ctx, tctx, exit_message, &msg_exit); msg_client_ctx = messaging_init(tctx, lp_messaging_path(tctx, tctx->lp_ctx), cluster_id(2), lp_iconv_convenience(tctx->lp_ctx), ev); torture_assert(tctx, msg_client_ctx != NULL, "msg_client_ctx messaging_init() failed"); messaging_register_tmp(msg_client_ctx, &pong_count, pong_message, &msg_pong); tv = timeval_current(); torture_comment(tctx, "Sending pings for %d seconds\n", timelimit); while (timeval_elapsed(&tv) < timelimit) { DATA_BLOB data; NTSTATUS status1, status2; data.data = discard_const_p(uint8_t, "testing"); data.length = strlen((const char *)data.data); status1 = messaging_send(msg_client_ctx, cluster_id(1), msg_ping, &data); status2 = messaging_send(msg_client_ctx, cluster_id(1), msg_ping, NULL); torture_assert_ntstatus_ok(tctx, status1, "msg1 failed"); ping_count++; torture_assert_ntstatus_ok(tctx, status2, "msg2 failed"); ping_count++; while (ping_count > pong_count + 20) { event_loop_once(ev); } } torture_comment(tctx, "waiting for %d remaining replies (done %d)\n", ping_count - pong_count, pong_count); while (timeval_elapsed(&tv) < 30 && pong_count < ping_count) { event_loop_once(ev); } torture_comment(tctx, "sending exit\n"); messaging_send(msg_client_ctx, cluster_id(1), msg_exit, NULL); torture_assert_int_equal(tctx, ping_count, pong_count, "ping test failed"); torture_comment(tctx, "ping rate of %.0f messages/sec\n", (ping_count+pong_count)/timeval_elapsed(&tv)); talloc_free(msg_client_ctx); talloc_free(msg_server_ctx); talloc_free(ev); return true; } struct torture_suite *torture_local_messaging(TALLOC_CTX *mem_ctx) { struct torture_suite *s = torture_suite_create(mem_ctx, "MESSAGING"); torture_suite_add_simple_test(s, "ping_speed", test_ping_speed); return s; } sw}p%R/еhzN1EsxuJW)tA V@QS(̟F LF+,ܱ'AO?Tԧ&;>aCWv٬+ީ3јyd_)d`ًtg$}^ۨ1JQ괽\aW wtET8ΕXXSuyp >I##sD'II9BEHs4(BkVʅVӏ58:40DODfX F2I7J- I< anok\ûk"h|2ݞV|[!0 :] h~_"@}5yZ#K{PkSpt r[%q*NH&D!W.Mx av`[[^ ȬM*$|ERg9]:k.h{ ,Jrl$]_ 0=&A@<3~?X*qGg0<,x#", &jPAZ!zc`p*LKn/}]V@mK!bsW | "wVaВCۂK5|Myj Q* qǟ;yKI=x!E)D2vE}M8?I l28*J>X]/zef+>QG  $,\ 9K՘*ג(Fڏ=<SoN[lwՄ-˞DF7D?lZ9&ʪ}G"^z^@fXSdb %)L gx ^ _ CnPqXdU}*J0Ա|wڸjF|yXEp*"cϼd]T`5whQW¿x;Z|cajZKdaXQ@CFX\!%?J_zU54$r'e'Z/}aR ])j-z ;e=g:F_R 1I͍9AA^(DspU|}%I.$@w4o'#t+Mx±XQ:n62{d6qJx݀^LmKT's펜EuCxܙ V0eC୊0xP !H+J* 3gW#2C d'V|hq,"̭( bi0[m~0WaVIG[JLhAslOvS) ;,i}s Ļ ʽ*]Ҕ}GY76 v/q&8DjkoSr 11vQS `heKE&?@5au7:xF@H IMF\Orqn YH a tJwߤ.='}u}͉ X/S!#G__ f( zot8m%a(Q a6efLۅ.($Y+@bCFMYadVeAY&+$wq$44ggu't#'[9IuFufY);zvY\ncH3XlHp$fϿ}Ie6Eٞ k$J,4hrs5*:d=N I*oN!3_,j+X?nd`M)V/p $0b6yyShP=/95}"k繙w6Q"/y$HR4_;+N?ZM&5 !4/-h0=&.C񵾍۶@P=*((,˃\ .Ҕ sBgqk^^kK$2qҚH30;/r0镾,/=bz~5a'%_T%g`Ga`(}(xOJϫyTŊ.0 "o oX6b`) Mfj`rV9vƉyI]=m%Ӫd)S׀~&%l_b45dI'X?ŖΞZ!̅hDe]%^в~UG0R̘%kHLeЁcg:+RU8A8..&=@ C&h0r0k(? ש S84 ඉ:LTazyOn+VcZBj0ϹWQ8_ad/}DmS$TQv{P3tMo ;SBVVSU^ϔ"?(Fg.fջ.E6]{vlxm('r-1ˏF#((Wi*P8$]7tW70')uٍEGqŭIͿ o6b#0ŵ`dsEڰeL@'SӻpG9%pQx3P]mj5+fHn4VV?Ӥ4 (@%o Z,v yVnȂ"zo-O9M«.,s)hLkҚػDgS\,2C#Z&`+!(Wt=?&c)Vvkg"Y/\?鼼2JjOH_!+yz֡ :2Y΢A);fZk2 IJ?^Ξ$K7Y՘dqOO|Io:e`lDG&"΢xu80]nGǺF&KT 3̎dοK-IN4]~|b+*YS-;6#ǚ9ˣEth={sHQ5cc׳&Ͷ/NA)2O]B&(8EbT 4}VԽsCh)-;;ݷib~eq;DPF/z A-'.;)?EN>?ᢧu_mbm2n쨁bT@YRn 1dz"~C2 8g[O)gBױj\<;[-(68s觝#w@B\n\ GS̖`ڷVd0ݔݚmGV}FjKV8F2$ w*zdk{_j(4p=ڕ1&m' a!uJi._5fosDH84m-[D!o9W>YLF|TAOtP1}Bt(XpO0c$2ޏN4mXܘsJOsI'69S_fOz_9s ߷힐B.kx5"K*K ӱ@4yDYH0hJۘdUm#,Rf\2EOs|v@pS11tUqD,Y ((|<KkžRtX b- 8dֈ{?ټw[Úun߯t@6%3$/ݴi%,*W}G7kM8*fGZ,|KJv¯X++ 5`U%6fsdv ݜٹ8 &a'm%UQQomy:/_D El윾Q>\m@^ j™bf8|]}; >R*i!nZ9xs}Rzsͦ|``znO 쫈$@7Pl%B5A.(&T(ܒtRJb/LoNJTbvK2%Mb9?"#-^GXXH:]X[w‚wpuuZaQwѥpw8F2|tY+N^v<-:٬Ix4F:wz&֞aѩھ\9}(=f}H8luZiѬSX дGjўpm]Qt!kab#7®41 pWR#е$^*"1?hXEfLr7N NLU;8,f .1ˇnՇK; a_ML:Pd<: :+JhAϪoLnL8s폫6Fn%~mѐXHD\m@:HfsiHƿ؁Ad >s;F57rhoj3G=j nd8.*G{ߡ69u94 l9In|Q+bFV42,d-iEy q%a *  BGzuU⡜70*M$LRkdu<wA2O#N;%d{lQ4U G!U.} 4unK 9}1=Jyą]FÙddQ>^\EGw lζDy6[,k*`[( ʩܼ:QʈƔ/ՙPS.VHe ͖@Tݨ t*@iEhe,3T&p|;RpV|gڹ{q:zkJn]@[R *9{kՠnSH2 [Jz OU%**әFJjSǢ̹O\xM-8x'':ND!8W/ԙK=U+#5RXބ+\?-WFׯ@,HX$ʧ)9=wk*4߂vSY,F/Uav"ݿAObq̯(%&$v9ܠ:I d?T98W-Z'NK>߻y5|ȣQCH!S?'bCleȻHx9yK1l;Ac}D^]%*^EY1|(\m+x^jyT[%9gaH;i eQ Ǻa㩅;Х cFsBpjIn?`Oy2' bo'qPN/ژd;Ns(c T۹yM6d+! !7s =Q|xhjHA$`Ji$)Y.jC2i2=Oup_m[@tQv#䏖ywI0|$ O 󜸡N}|TdyԟGOގ/lT&?+5Y4]a"h[:]K`gD.\Viٺ@섇9'ث0*|s quVC*q1wHiF7L &6˜VtRhu8u}ZGZ j ʖ gF;k`_)OHZ^&lWcoOpM tעlzU٥26g{l/mJ `pkbWC=9-?n9VRO 3T6$VCoɫ cMm)@smGsDdW*iA{^_N NR)l%|٤YgF'8)958?FR%YW:~/!M,oܩ#!FXTZ=R}]E򍺫裍| VWjIeTqB2H;9[qkP<}k5=->aL8n/*0mC#PM2vNya]UuV#M{m$]ƣt ?UW:$Ǩ8O{0. xZeqI8D&9NZH!~/ z6q)u~۷,@J\{ ׾y{QpIKY(~`Ɠ>ҧ;.L? t"X^(} NZD'(W͋ )(_Y遄BNtqEA=/{qٮvKȺCӜheˌ,WX1{1=3qjՎ.Y\UV ' 1F-}ĩlw'ŗĊxCnmFnvQ馻Rq;4d/l4cSlÃX%QtC:q?1:d5ɑ&իH@b;_^5nyVXfC!5jIM -UmJ1lg"{a/Z h(!Gхa{bUdDŸ7\g) ۑJ˜v2(AфsIKCчǤwfT~Z[0SIBurmn%ټE9r* M3w:!~z#ٸr G&esqC)kDZy+ Y YB59X۲TdEMf{tf=יF!-3ll9wγ?.)2vx}k84dzPIWq +P7I1-ۊ͏ky /nN{⦏&DA37 Q$$(DJ1\rF>(./ͳ7X-8V4-߽bz_/'Yyf3/Su{/6,׊=@<W7)CWD7H4 /G ܘǭ Qˠ]>$HGWq?>XP?e;qnEOFXIp[ct;G)kw.Ěw|b9C܅U p! @8za e& `>1(l}:s`FKV$'5dִV-SMᚳ6 `GovBfkSQ(3B˿,"·!w,)R^hYג\ydg;: $ps ;ũ]ω*vډ纖(a4='r^>f 'Yr1eւH2h|+XEڮg.KbSGW2u>rsy9Yݍ%Y,gds-"Cʲ (!"nef"HLҶш.{D44hL< tcA3]~(i>?Xu0n!rٮoߊL!/m#04$Av5zGy/(9fÆVHQE*&N>r;M|^OgWq"@~hVqz6~t4P,פCy"CG֑ t.8op bJk'B` 37uaXmS3N_VdMe=CL$Q C)+NJ"/ZQ+u‘h2VCr>H%LDJ=(tO%*Hb,m}HP4ДTʿ-|jC8L¢"sӚb7wsIc{m/~Yylj8e_gPamUDzpF%U!J+ g\߻{(s-˙S~/჎k:[IRҶpPnTrgTޞ5nɫeGGKaGT^2iHkTO2b ]8UmCʉy5m",HY8o퐂RaA3=Ȥj`fEmMr1~KEM4ō*\>thLj|lo?TB9~@=MlTVGc0?Ѿ}lu)loguU`?{8~;[ş v˛t*p>,XoE Ij<pD<eYnTNd1| .-’@H>СݧWs#Jу-xs'LU_Y`wK yGiCgV&sDd[WDqQq)* gHV-K1(hY^ -ɥ*#7\X%\=6{*e]L!b"$'٠ib2*nV4~(\\S%'wygng#%4ബȪ)*F~x3GkK-II'EkX%'V6BY׌ew"ߞ;brO^R#mw8h:^B=ρ] ȢmyB,Rryܣ+a.i,oH$0dfw%HsR_1UoXq?S9}LEouz>fAy@dl;F< qQs2({lfBHN[qQ~=F0ރY d#< Sw:L_ni %t]5g9H%K)%wWsof6p%+A(  !yk+ tRc=d ;:9+s~GhЃ/~y^g7Rx09ìkv;)$uNn S9[؁/IO"x3Ycx3% Z^)"o!],IR$(%a.@뚮wmWV͞  "[iT.R 88z{A.B*&a?D G |vFx=FmS:qJc#ק0&0wyo L,OTGPI:Ҍ?lJ3wE! ,K ؎ʢS".+B$s.XMsљnI73H;o:})v}DhFc- V~pCVriю|dq/#LM94WJF8oK}jܲP1Mw&Ts,e|mbo@-Ջ$4.|Xō7ęp_>!4!aK#XxyK&Ox# h´jne"q9e%bPWʺc[<ԶؽJǐ5i)4k~d:s4?lB`Eȿ+M]^aG,ntg]RɌ>MRC^\KG *!8#YjZ˒꫔EKUt7 96d[___Jcυ֧,3[Էhb1@ C||E+fAէa$rWQ|U肷i RsꚛΎ,}]ϞQG1:nb ЏHl,K;#E>wm* {"Ț 2E(PgOcRBٴ |*{Q׀; Ƀ1ԑ޴HԒ e+9΍|KĞ1OQ\U~6;}6JJWmg)b a'2Ɵ!YAoՠ4iln,oy֭h!wDe+RK/5'a ɲe݈ Sֹ v#Pf@w,O?U6 dPλ|aF0il~n*悤xf0v1QC6 )"3G)*r#瑃~mN=mySO5-Z!lz4z!/kY>AR $aJ%Q1ou&PEIW&κC-AD5[K&*33\;% n4`]>^4P*rEg45C\vM IyJ*8(ۂQHMu@MInH/Hv< }O=K1![$K{ !JEJ]l1+G0PxJ'l}R1W߇Q`İ)~׃Y2ǤӠ W 0om屳DsF, 6q?Ghaz ؝'ZY3X`kVXyt|p95P-K7ueDiAbޅ{+a=ɪL3$I揲h_B>+Lc1>+J3+OK:Y3(.FȨ}P0' ׋/Y@W ZjI \}qzLNH:9ڞ;=\%`*q>bW`p8ͧlBlhV#r݃A校i}e:zC*(/Rѫ RQזc u<4 >NN5 G%"_~;cY.& ALPK]zˬh7A'%^3AL6!$[{HcwuA)#Bh8F g|&SRɄ"P{4aJr63.B'Sx~Yy^u@7oz$^uZj0A>hC% gqOU(URsђC^[nQz-1ڱ -99On]sdwF(/Mhc4Yz^w1[1^A*5v2&}k;%HpıL1yzx0QHtlai]g@|4'ԙ̜CƷY^̥r~XhPd,-/ۛ;~L6etcJ~,8R(%G |]CG!¯pdHjѹH#L'K p M]f gkLuׁg=pzZ >=Ǥh(uDDZ=vւzB16^mb<%W= YX#Jduq1š "=OKu;wÌF;jY~h5m#BJt: hg +V1\B >{}&ne-"*e+#m^Ǡyd ݵ\CD]Wg:Ńq,R=~o:`S *:`#R4n?D#H%[Bx S$ kX <̂;P5%Jz΍b%{^p'jh""Ղ.+a\j8ScyNњ@1Z_֋iMQ`3`_}yStaٚe9ZjRWH@ .+"+64E!QLu)]Z5"DM ,N.r[Pu/ϙ T) 6㡙-D!{,K7KxdP`R3U7n LIٞIB,W 435hT"8-~9_C,QAϛ䪨գɉG)dBާˬ޹EвEkp0v"B Y"X4ZwFcEwuq+ ߭kA nkY~.V#?B*0 .JvړIu}mY\X%ҢA7iD(Ae i/;薬p8@{/\l3\/AÃVW%k7HxLS~2`{\\,  >*m~ @R8A篈czD9lXƨU)_ahaVJ[fXD |xhS9M8\>vn@B~qI'*Q&3olO&`̂ءٜxvpF6h՜ّpd:ҝK?L2U,dD^+ۂ18kN 믧Xj}<_-K_uHه%"ݥOM:h`YtrEk7hr"XZĩyft, 4U?ՍHr͸^q9 cJ 9rL1Gbr#jy vm'n9XV!i DDUYd Yܧ;t l<{pgMF}D>؎²F B5%r#_ōT1`^᩸*WC"@ NƽPz&D:4V @6AT_N}m@ ;BQ 0_Ei_D+8ݺXX%S7O"];Mg|kj݄xc=WHd^TQQM51O?r, rJ0seHJGD(aR=T(_g'N0Nq9QX5+3b,e6Yea v1 zZnNq$[2v.T2Zzt2O@dP ߄P"4cӿWbd%Mؖv5?A:鮳m>ħmAϼM0ͯ\9p+p8oaoUGx8Y1O ->GmSS_x&ֵW}C6tQn5OxHx~^NZKS$hX[T*_h`K&-A4ij'1:xJV6}ͥcw~)DoR"X%y %g`jV}5!3ܰHG1Y?\(y7m]aLOuQ>1nK3_l뢙 ȆDzN橉F充HځX«,^"fAE5Z| w'LC`.4cwKL#+\FÅGrO,B 'T{FkS 0MEȣo X}=܍I6d{<_]?;$aRj>^vIw̩<1k1ߍ;blI{t DxQ_ hq`4Gn Q~Q6=d z1vթ }p$1zqľOLC JOI!al\08z ݐdznuU8 +X57n>HJl3 u;rsyΨwnDjZt)ׁ(z 47]wn ZP/ы=fOf9n.EN3RH6hN^ _^Nn=P'׷1]i(;yF|zPao~L](*j7wngTgvH5F"~$HUO@҂,hf/Ad^Ū v׭sSK7рUy= m)1? e .(37wBh :|yvC$f mA}(` m h@zql/x%t{KzJX'״hA I(}R 5o{i~7=f>;dC@`#qvtD?CƳΠc #E\qܨ:Th'7؈D&lt ,o9KM"D0azS)}É[4zdj+DwV.f$q)x!ٍf&*-E"! +E;[A>hBMf E-Ł8ȧ:e-8˙-Z Iqxe9JS,:EjLr0H~fp *y6!2*ڸ6w7/K9WL . Wc 5iwI?)lKY0M#] nSZNqw`)/MF}bvYgQ-%"B"X1C>9xҠ醊mvW6es:WMR*p7$GX^Yj$ֵ2Q *53s_gNAik)Q"ZEf=}׽"V& c,&YhwWj)2*\l 'Qϯtr5,Ae] tG^V[,6ʠ!4%kLG ٨:DΩt$ՊXx\[zBO5Ԛ9.p>jBdѶMl#4"˾R;ȾfܨQ@&ax:)BDM@|߮d'5b`E+̃n{X'y !B2@`\PV7vLtwެc,0О!UT6륔 ]Fk j l oq% ɯ!Rx }| 1HL8qN;PC*mztXeSxl <Ŀ =>Ls_ɋ2DbEb]] wb,:e ygfӀ<νäCFq82C [xsqW[v TCq Rt<{'BGh 1@;i +bdZy= C]:/R% A ~^kZ!sq92̜ VcݾYp ciNdL cܬZNyP&q&j `mćO+j\(q\aP0ۿ[0IG62WWbl9ALVhVV0 R<E.BD0`—oxPr`d{k2߲JRa23K05S(^p9.`=kE@]YTjo\OO@q-r' {RY !PP\<2g%G y$1A'bdD(sI&#AD}|XRD;aTbN8U(weE 㵟7c) 'Y-t\,[Et NdVE\#)#enЍ/̃2PL?ĚBxW4Z7 <7x+aO4؁` O5r t?kuU@*bnODjoN ΢H-LB+CF'3'nnS[u=SE Z-.X|sa#$?<$6&n#a]ZGG+y9-TY(K,0ӑYI|cĕQwDpO~qa|{Ư)\*$&{L՘j7hD%D<dDg^{|f$.6K;{0&+1zq AU:8{~{1nF [q*/Z4Kx+Ҍ冃r}tn|̢K9 `ogWY~Aa] vCi]pa`"?l! = ۊ{-̳1Bvm8x)Kfxcg T.pAEN#/H*j$ HmO$aǦ ku? 5)o t ==~;gIkL8M1ku.N$=[:.g?&r**rF=kYAo!ClR),Yu&$ `7Iӑ?VT׃,A4xP ^ ߃XpYˣam..8ȿy27ID@UZ_@fRsݪF-74owV=Ww&9??hBW3KdiEaMQpsAR.?M͏6͚6=eeWeZc_3X2=yfniLڲ3m9b=Na5eCkC D`;)^%-&X95$~R%iׂ]i?l ɹ~vr];vٮ33Tcv 85]ƍ7?4?~u(GGбϟ.zsheZt#aF)Ǖwq_[t@$'\F/1dw0,3շDa:=k MOS>gyeA\*c3b6"w P-nPeՀo쨡MY ](鈠fBp/GSB S 7WS,9άCޣn\0&1o`oK iZ x8ynn>ZPlfT)@2Os! *sëd`Uʢ瀼2P9 9tt%/$7F~.{efUl|,_j%F8rӡɃw5:nNe})xDctu#- b*Zz[臯ڍ.]$CWeʺ˃krRXxkE(\;?#i!x aPrLpzy.tU'?= w:p+t׆.lLi[M*kE x<Fp[11fHx4׉~XdJjuɛ$*Wsz\tP'mф0 "`/ۂ[`kh'߹[h16:~ZCё$+Cj ?epgxww%t)#iH5GZTNm#ikbYWyC H=c?9$VCO̗W*zۂ&` C'F(,Mm&|Ft"\H6҆k%Y5CvovCr}T_*c)iE͉ZWd7Q_PNtiޭˬ)z#B.F.F)1Φˣ3kZd20g Gq1dϛ<2!1TnL ŜMIb[Џ,M1}U2&UJ|ٙF1X%G%铘jw-yM< !D$͏ٕ-[xNـ3 @ L l˯1xfԂzPh7 ]9wH+-Xl1=&~2|]5JݷV"ۼx)>3Zo;RJ+#>[ȗ1?csƢ](SVgg ۖZSTU.*W!cPi,D c.Bo^/W xӽ*wj{Zg.;DF#]&H$( 8A5F }(=77jbS9^D& 8@%@4i!p9딊H>0~pGxM.p$;"t&b">_]:=v2-c)u=݃9ZݝݥŌspt&e2 puTmxBc>̺AF<Pn3,j~Z)wW{it☪RzaRU Sf R,hK,C Ȉf1[Lj䱤<|$P穉W;K O"*dLA.,["ڑO+WClΐAyc c u nN6M+'= r5DdɁ,p@~l8m3: =N71rp][(8HgO^CLvV4:sfs y#DLFY^OjlXT~8VVO/NW%#fh %wXٽŋ,TIzb%%{4Yh4B̜*.摑 ī{n'_Tк2xGTdRVDVް/0bP,3T˂Cu .pn7 y] fpWDZc1 #2u9qfGMҖlΏZ01 =/ݟ&ND1fuAgx;\,,ZFлlnTdH#w$)]G5ϋ[_5.=3dbhauʟ0bMWs[zȦ-]k;ڣJRw)_2c堺:r!aks%5qyYqݑsZRn+F0({: )t^eΆ-C5ᠾz#z`gz'IKtȣve$h{ƶ&) 4ǿH&|Z|2\Nۂ艧&;VQ}“㠚]+r_t.)z)ҫioԘ'A6hhkAEO>ss,QJF?.ZVM1u@Q\M4\q?rz}]P}Nf[bˁ6zʇ N-{9i*S qeYP]b(@yfxEvƙ0ܼWX{7vY:mU- Ԓ8!aST cz`.zÆ>@@ỉRkG,fR\hi3Jtӕk{*ꔳmm1/ʙ( sBB5=ɟ}dGMM۽sIji-hCuzְ* xm.v_ ɲه81Ioڤ+Һg̪a1 wH5OhŘ;\HFVEQ]kUxS`D%4~V[-)`ĩghjRƔI@XN\` 3L2J,T9AYa"%[&+&E!.`πX;EPLaYٟ(d8a*2įzeW2.OiE5S2'z g~0:#i;äeP*:[U f^?ZI.$?9_`z$(P7(䒖vZ+K3ø!7Ψ,LhdlXںNQ!i6-F܏64Xjpd>L,7,)ı2'HIE{IOU&ay4[#Ori؍ڮ1Qӥ1.ZE`2 5ΛeO{2r]^iR~\FW"~`~- 9 R2^L<>-mӃ/b7w RC3}l;,a+{s_MEޑ?Ӓ"LJEw=, [p]Q53z]8n 62t|(8͔hXe#rE?an6?li-//H.)(:ʼd!ׅIdT'рT[& 3 T}3aEHW{ځE SMXd;Z̰}M[QFikzQ{[W\MY\EŅd3OfI>ҫ./^J߫c[wxiIFZ͞m0+ C3H:x*lk oA|3S1^TouyJxV+ 0 GwJUB?Ӎ$OQE:6jLEݲP`syۍqaN= Ձځųdsu_X4׫=^v!b31-i@O ]>b%p?̛;¥GO(xoNHZ@ŐҸ̚z=qeW]VN*$=ɿ]H0}RvNr>#jۗ_3))X!Gm()J݄gSЭ87a=qHYEm^'00mQ a%Ua:# J)?!<φX8;MCF`'ΰ{HZDtvۅδp?@penϮr F_iȪdDN5qGlf<{p9U2(Gơ=eXLa_9M2,5N 5|lg,dmtc]|HM7ം#)_4\Vӗ_-hեw QqӤ<6}@cov?%fCxi:yZB@#I$?ߪ+/^zMsD DW%kXN@y&Wh.j(Ct'&rVV%EQ9:x®5Jt#˒;F>q/7HQ|BD=9GNn@dѵR6MQq27KbxØ"Q;17++(Y~QX)DAP?PE(q`Oƭ'夬yb1j G[x1~Fԡ2'3q Q̕|V :M)pҘ)5P1tNcNĺ;XCBֆ- Id:ς(B9Gv m"dXړq܋KX*wEƦ~kݨ0Ƹ)CЋdpBnN W-ĉ/'Gs5K|=GB8WDQ(첊Gr6?[ A7‹j#إ$+_5vyI܌C),f{WA ϋ,…Gu"BDʋ%Xփ}i]o +ďNU!.Su@FAM(͌``t›pv +ctgK\2-.ONd YC~>:gþFY p33WFzi~`r~FA4q=Om-7%L v,ԫʫ2l$C˧iyw}͟=*DƘIY>)5qIN>l={@-8,(;8An'}4A՚wThH H@&P)9ԝVqMx=ԫL2LP Ј7 =5@j+LKxwEZ.5B 5i{EO(.0: kI'9ZO}4I7>0 )$HJ!X$)IupF#2uŬBNC_U`4>"1QYu|=FI"j.gk3Jgr\g]xaQV$Z4JNh ~f ^_ͮ''հ([rXnĩ徬g)K:s$@1!tV?^?o3Ma~scE} CU󡨰% _-NLWe)LCB ݧj>?̻sSٛfn 觚CAF;VjmKݎ@N*sY~s5O9HQ[f缴+50/jM[ 2X`:+Nj?KG ޏ Խ ᥀UI ?BYA$ \ITU%O2@SԏKNKؔknn߈qI~W'׃I;O mjbb>:RvOO8B20#ETꓟ2v,gwIc| WN:I+hC[yc5Ͼ\fhnE4oƸ⣫ۍ2L- 5| 6=Jr?#ʴ /V iņe\]jO@cA>j4 qS&RG bhfkx>/N/=URX\I _: 4<@8Uah|R<L' C1g%$G|T2(j>DLNO_> V>,a򡢷8FSIqҚ߶ KZu a{r I[60 *BYӢǚ:X=ky7-ܿ pcN.06Ҍ~#m'˹J2G|.GV*R+SGX2yE> o^3ٰ(;$9:cְy]*e;в}/q^)g>1n^l@:{Xey P~Y!;b_%'gHQA`FS<~}?K;a \5%<'_T6C\\1%;~cseѡǶ C< ЊV ='XH <Ѥ.?EsJ^cI;~ZK^ čxfE_..B_τn!Mh][`20uȣ\/䲏,*20GɦO&gǁg-΅.t#e ~]luޓ\xؤxchBD0t~" 7gLlj|ȗj%P2L%pTis?{W*OOMsng3dBsXˈ؛B4g[c/t@g cv֒L{+3%4)O*]NtƢ@ yp+;^ lX ǃDlh;zPn&>phSO~#:KDvyZyJ {kq5waY,^=KU%Y|`ڙM{$*rDϕJEFrl]Gpק[vFޓde[QxDPkB&T{| @;x*&q x#sR3Dxm^Kd~Ġł+vJbC̑FhZϡy=7Q5]T0JCgIIO9.\]V!]D,(A:,]!G@ÕX_`ZMÄ ~1=!ʭAJBDRsWsP¾: ~6 bGtNr!Hpfz'4R;uk=O5 pHqZ%,ӧm1R~rnqԾ\Yew3B a >ﯜ-V'ҏPorľKH箼nm댜ęiȟ(7:)eEu. dax1Ag?-haѕ 1. ~J-"FrKvE ©NYN|;uz+jr JE[A Y/m< *+83m56PhF6B@R.)hCG 5lD³]*PFHx+Q}bsc8VUɩ4 J tmV=d;NJ6-f ,@<`AFx(!e=lՐL2 z/omhLy玲PXTbE "gڗ2"ZrI^:>`\on:~"d50OmPGm#CpvBkX~44+u*yk$P9= Ζ "HwKM m7:S)qફ~,{+,8@z YO~CbS27<~Zhp֦?ALl0akņ{@a\w |zFtmx҆`qtf?3JU^ == %f TR%Ÿ[GpMѴxc\6{ypSDJ=8p}bˡ Rl 6}CaF]tQTg<dNL1B'2kWc,B62^X ݪCGieK?ff?Ok=+K EkjU@݊IxirOߚ8 m?dh}4%=Hs[! #wS؝S6y8 3G ؤ [)[7lS>6   ×y[i;/sR{aމiA}/TH~?w <9$ "7BNTN>E"k9&@a<DȚQ $ 0 ÷f)<"6ͬWG*䊳 |l$yDʜ,)RH2Pj,zD…c /"xQgŌ<4 MEX`+kq*5} %^.bV>pZM="OvG$Pϗ`+ť٨ʉ8 S`d D(UPoֻ#B9)Z\ FF  b30Nc$$ ߙף6 "ˉ/ҵdu1[z[%z׷ބ䴺  RnXr'aT^$AΛ΄&M1mր55=Ola `ZO%xQz4;nq i; '芄OL52b/2;c2_z'B\&{蝏ԁ[ ׃]m\o+UNMn[`/ Ζg7| riXG +^$|{asp-rb4*` ݖ\Wr|h_,yQsU(pRqh~#l^0$"6_I26~sPsHx*˲ko#_$4!J$CRjtλ)AӫKdok5C dPs+(In\J?D(IDit Nvu7g0\{V uA[Od-^mA Dh\KU<;Lr%͟([}:CR+<;}MkڝpNً^cInN 22 Blurw@K2D[wr#"+ ItsD_kM!d3^cFedɪm~y4g\@ϠmM1nm2O $_+G[ۣ1DyhzJB|ӷ!lNAH7Qswo~k ]8~ 6pڈ&:-Zex~һ[Ti2tQ ՖY`%f"T)}1 ~J!_#ޒG, d[##ُ_bKMYR0@c 7Y}ش v4R'g2`g$ QlH)nx[no Art?j )LNBlNy*?[aa Pu|OLۦ;g*M T]40kTn^nCՓ5d|W'JV_ 1k=r|y#RrզK-ӝ 7=>!qn tQ=g!nm^ǧmkR'D0ltLWGf*+Nx>~6q)ft4-ⵍRI>^˕2A ޭcᵚDcBiu )_;krsS!^tM2rFVckl.lKHpϵ&m"$!ĠEmȋO^uG.ߔ>^5(X('kjY36 !ό8Eg3hnεc`H >&0ڨsY j7oȘG,0-7,yB _s+68ԭ"Lgp@p̰叡c/!U9i PDcrUougEE}r@ctBe4а5M)|lQ^ TI|AЕj {_[PJGyOmZ5EX˂n6ܭ»"iRɒ9^ʹ#s;YԀ Bi%bХ>I?1~f⛖Dz$T*u3❘@w!:=v>AG0dX0ij,v CQaeM^])r^m1o4n~ Vd,Fc%-x)!3űӔ~)nfRv̫e $q1JoeG0~q6,] 9{.(嵹h$aɇ>u`΄A쌝Jl4Df4) QPg}_hFϱ;;L&bcEl|Z|vdCvF1yc_>qGؘPΨ=H"|xbY *'V<0d܏Ӆ߇eV(|ֱ/IS%rǖ25ˎM V?.t107gyiaӍ#$oҥ+%?%CЬe IN p6жv+] mOs7A-iEvEۘ VPfɖ5A/fxg,M/ ^M0iTk5{9t؂_`Q{ۖhiɸ!jideHfr7̫,8X+5o4aX@fY^ 2Np|x#|; [2G9~|['%~l LDAEI/6_E\ojL?է*s`# UCUQuM/8s4~^[:%D(uF٥VضÄ"IoO̶hӘc*z8*+Ɗ͹L]^`$@]hqyh߈GQm@Rhp~bt?'mIhZv$ أKu^[NI{ią?tb]N܋{ }µR 4VU߾^Ɩ& E6x_@TkqEMOlz0 sIcƷ՘S=IIeޮ8&3\  JvSchY–s{*@V -m5ڌTγ/-$`=GO@o'q=d01"Y9ف*f0r"@c TJUmmq\icӞUxPDmhz j+2.{k>'e,TW*[Kh?ĐYhd!8&z&m !n8zO| *yƬp¦344/aeǯla5D* 1o@pxf?~Q4 rkؽU7ur12+o|N#浤eB;=e#Zid$FExMѪY$(8N.ՠW˛&qN38=not5!;+ߣc 4Ux331TzdmUԢS7gj@QT~(^cr)zZHK G.]bjr`OIx ¤ T|(rdY4h/! #eܤ)zʖ$'I\OD$|*=qt=v$)ibՒ9.7?rᕖ9rg\z1^ 2εsaߑv4"w|˲,!-kwov #cr26Z/T)РoixGfh s<@G/V:SK<M_.u0ɿw>eUnXc`y%uRJB8v+oXku;Pb 0Wn"t; d%C|y)wuN ƺ~e;H1XN3?3N{yw>24UExqދ]gY1`2źpK i<.B.F_b2ݟoޝѴ%5 sw\7D(.30;\UȒOaT%П'puR^|qDP}̣I ׽&X~1 i)yKɣ^NT*6Iit3]VŲ3C-㺻Xh壄z[W?sr&`'5mq r(/W2rP<|uNh] pT}d#a{FZ[95U%}p_'xu9=c0Eşр"ԏl2 pf\Rd/VI,^6S"fP..2wL$^7 7o2Bx멒+N BK~Q'H&KȈdX/%*2܁_F<9,ڄdE$n@H%=VELAwo>}QL$(&LhxA`(Rժ^yd}޷>:?LDGVgrzZh?-/_.<|RW6>lQ$A +t ͦ!&8|TdRLWs'HqRXu@8_9)K' ߳MOd )DsCWwmJ_v`^p>-LCpcp+FfsM3t ~(7b%+^EF 5чD&q9BN"o4euR{sʑy&)L͹z>OFu\ *ͦŔ?k G\gȔUGߘ ߸{<&sgC)}6dɦiŒG9 "CȂb5!JbBf?kFJ̖ _gdkp9PwsG]G/D`YB%kj2RA/58 &+=tXt /oUlƷW+z<o 5E>F@9D%؇,LQ*Ouk37i,C-57Փ)<4 $tG6#wh=QkQL]9*a.-y KE=`+,{Zdi]M46X+4Z:TuCY%G*V 8́ɵ&53_|h^ P'khIO6K$CŝTOihdgGF'*=B"Im5L t,8J1\wx$Z#gâ".{2$hQ}xzUϨ(p, qի:)[! >r PXRRq(ICROYP NǜZtx|3Y'|⛁N=I@?5ZN9-8FA*m|zRv`;9#s-_5-ҷ\`i3_ D8Q޹q?̭/oUFׁ%^4u=x1kszvv}Oﵘ/f$\ڃfH;641J# =*)V?ӻπMnwABiGt<ߊ[USڊ3Sޓ'ٳϽ6[ Wp@ G_ QaFU[J[|B󸦿BlDHNS=8Yc-c+滲*&Pqyba*M_[6;޺tW RczЍsQ‡^[rH]V}k$N 6qAt(1UQ(خߦ2g!n)8,$ H9$K3g+]l { VD)3{OX{"&8\XRB5!S|IrkVa'ruO]xwFުB$D!SHfT*`I"gշ%[4_e4*ӛ0z0i:"k{Li.uގt&̘ˎv1-2Pۣџ\^ቻ!IhrlZ )~͸wLzY,uu@?>p!ݭ }, P9>,q Ucu+t3-]/ܮt@C4ٺq=1>a EZ͂]}52VofCa2Q > Vjd~.I b#o%\q]~ٝՊ3Y<2JFcOgzrE({'ma(\{HT"mO%A=-F% :­˂6y_5-u EKU(\pSHRzKKi=@lpzTuwLt0LP{xfdil4؄D9Hl+fm-1 x ZL~#3e/~Kr5eHN#7[/7r[[eO. ʊz2M%Tqnr(! Dg<*>}Y/ʻWw{;%7EumU훑7X.Mɵk EOIk1ct >;cFƥ)'%O{ǀ(Dxǝ&aN6+>; +cJ_Ϗ:" &@=@Q ܷLJY{"O$Q`hn%kαY!bY IC_NjoEElgt86;e,Ӌ{]dʜFL|pxW%9sn|taKO:BVPyVf$"bF0t"Raq'm:Ok<3 J↌v!.uы1lP{vJ7VPh3=7n@KC,mޟbpp2r$1ƭ i&b(d,(ysT, F, ˘Ș/NU{S~oF+٘ `9_ݒ"0I{N( V5R"fbcXvqf:4Z %w`(&nHr5ͯiLg,[4:)AOi ]ZAHlF $"&O%wgBMfHI0u\OH8o %r5㠹Z7rx`i>NO+/4ߢe֓7e`!7@ O:BRtbB TL1v1)w8 =~Y$ǻ <{'82^S}wDڃ\MJA"7Ed fNIblLCy=9sn:֏^{ ZHu3NOSU2FM5T%4Q+3KZ#Lf,UT"?f8};šC,n4֯]]ཿ gc:f&}允8t>57˩=[{-xC}<7@2*p5 Ys(7 [VȲJ@6+̅\zz֟ﳁ&aѳ9"$UHqYk1{Nf/?7NHk#7/% É|ff!Fm*0oGAtIO-Px]LV ߳@~!4Fcu-)T(qRX=2!'Auc֝h+Rxw}n&r^-wKL|T+W37T(غmk */4ˬ[+'`W,3irœo0''z'h\VU9SF@=$'=xkL!me# K\-~fwZ$=SjqgSVӓ~LnS]'!r Cc}mE<=)hORPG6!s Գ,3,r"u R:=ԗ05Ui;P]V(`pk=y$fL~CJs+z|$ǻrnxQ쩑 'ID^[ O5m3iY*ȷ͡u[hD囊^aE^f!yaKZ(&$v:xˤI(N~>2ܓt;u6%֏}"«1埒p/A.Zzj>WM8{BUmc`tA{ZFP_%Kd3T[=pW EBv\dZ9mۦAa118zć44UۥDP{+|itT>S :GFP!3LKI %& B#V>Vۖ&(lK.pD fG^.u2֗h%˥^d-mNO|N,'yNȘ)z'l4cOϫt_S)9=I8 ߂TVHYEBNZD~p 7^;0_6=A7t>L[|6nKn3RَgؿqBJ}'ߖEtUY4[p  qÔc|O3f2hr{'mQ?Ss Oth PgmEj8 n?Xv-~8F,NXvt/=qL=0FO+wJ;n Wq]h&.Wo5x1x}U{c;)6%꽇 XCYqoFoE~M;U=*hgާ y;O0<پNư] ym2PНs&0qc'I 2q YD0]apRbhE`aFȦ95|Vܴ G>\PLKWD?ejf2pmx:>;7nё}j) ="u֛Khqa1[Չxg!)3Sn.R9bқgJ+΢!x}"d] qsBq( w EJ+3>6Y7DPv*~)M, joO.F͖Ӭś[8%}dgH3 N2?6D-iJD댚BY**`(♐|gWt*>@9Tk]wiƙFV?BX<#,~$6RfB Sw`ρO(1&Tk׸_Dޣьv]1y#wJ@wɿQ\4/#]6XGٮaENlzU*U^HN(-M3tJGoB-ld$9V ;j_BMnjs@v>6!Ns]P3* ViP#X=bn[̘E Fc! TtkjC$_o}k#բWc/{ZHchKƷkb}`iT|̑h2^\6no1O}#5D6f]ndieʅZ{džoJg|BK $p,KcM\0=e:ؗ~Dvڎwoq&8ľ@]hRA$uR]f\`Y[^R:YoeRXgGe p[ۓAޠt:x*\.BaN]`ϽڵJ {Fa* O O,{">?$*K7Wc mpBwa4"[ уHY OcD#ҊR'Drq{H<3brIVYo~떃PYv52i2e/s_/LN]6[u^Иq;?laBTMPhW,C]wU!4ZNYfϵdUgb_Nnm7?-"̧O#Գm=PNSIR!z0}Yʠ0FU;@KAðmBXd`_"Pݨ:4RbywXBa orq:;scFT* *+etƜgnZb4V<\I/%g~ npD}ߛ-jÙn"zvW.x}9+ 'M3>zIvZ=Y1þ3r^ORF 3I! tBc{6]Ot}rψ!5 `71?SW68 4*@cgܝ sS1@\94 \_ t:5 ][VCnE v; %]DXֹ;{8kf1/j$~'$ʙGӇl2Nh/ ^Dv(,Ȏ7!v6fZRNQ ?ji*vGALq_ӡ,vF e| 9!?\hE>)Lu4hɽShB(Ҳ?JI]1i>{O?䣈'Pi TN*~%Tz4?Ėoq6%?wk,r &U#2_$m1h&㊘_m[M |7 啣3PIu7Z TZLR,%_n̙xGd63+Qѷ}]SkaJ68+SSٹ[mSE>ҷXsh0~ 0.5ݖ Ë 0r$ۢ*gB&,~2WUhbXf M]qj/K&2]ԕvq rz,Qk1l'SOn#Ϋcv&NZ7{#rj1KJHsVsMj8b_, 7'YAp}r2k _r?YUtD;p-o`{Z!sBXUD ›fn>]nGjb( 79&؅j-#U[cM>"ƃt *) սODmoQoUgdk* ?M)L!fXiޟmEM&G 6?>GK,S},\hdH~(0B=rcɔ|p>J^ˀ{t~ز4K9 C{S}Ln 8!+Vo* %AWmga6@[( ] n#7ay_ 8!w6SnPXD,aʷbKpoWHy^ ב!I|>̠!.K8$6~#- foXV{d$>6(.{Q9%8;SȈ7x,!H5iځf#98ƏEE,n3͙X:?TB'6E2`t+H݄9*j{Xr=341x<%wI`wDXwbܻuf_9SdG(lABɾn9R~ DCNOnt0Ko%p,³\bUr7O;p$0qJ{1C"DܴkȘˤ#<0]'57M+.S ˗LoYdۺTh|4ζNyOUP7aJT̫1tU:CxM۶;l+Ru5-&P5Qkv[Ku4LJ$:[lSQ}^E))0T%|Yl`ƃN\Z_PF`%lu7פ:Gzgŀ&aʩri M58Odjd\S\}UvE Gv.:K,4 ]!?0ոҳE0