ࡱ> ;nTH|F"DePPNG  IHDRdUnoPLTE33333f3f33fff33f3fff3fffffffffffffff̙f̙̙̙̙̙y}#tRNSf) {IDATxYr JK5?u|v>a=~mȯ؍~eq+kEyFC",M5BwDr7w@:ٙdf`z;l+8~*;A"r{9|ʺZȹ\'|1!/kn'+ElTt+ ʍPA#PVQe"Hg\8ET2 )3ķR.jFdN+7q&mCT>cRmJsYU?fVEw;KSݽ{H[|Z\ f?rSO]6 T4?F.:r!9XZu7>FT.ijh=,. !YjrK$`0™e6 /A2Tܿ3 -e%#f_cgaIL47RL>x?)0TKkBt]߉Yy2PHY6 V;vF!ƾor4Q '%JyG"Ձ.RgBjJrNoN>pGe!o.,Bbҡ ;n#Z+ 7GF%xG-G(гfa p,Ph=OjtG4[_N"5 0Պh 2Υ.fYɲQ[κ 2MD`Qq*WMlrHRcqn_yU{L)/x 7118 2/7]bx%v\vVY!9m!KkaaYdtpq(p¨ >gα᱾}d" SA(1~\&5iAʾژhr.i+1az=+0L@dxόd-U=qdOe4έLws0e;Oi )P=R@P#K hMj'ucc{`)eڪM} GEI"usl/6\N!]M41Z7փ!@7gDN=-fQ*Ut*/t)+HKmsOGMSOFFICE9.0GIF89adU! NETSCAPE2.0!",dU33333f3f33fff33f3fff3fffffffffffffff̙f̙̙̙̙̙555`;ɱH;ɱ`2ɱ==0ɱP=Z @` @ `  @`X3`;ɱH;ɱ`2ɱ==0ɱP=$Hh%h%(%xH%%p%0H%%%H@&@&CH*\8C J@ŋ3HǏ BHr"Ɗ(\Ш1͛ Gv B#Vb )Tɔ&h0Y~A1E5P@AiǦh?^!BO(>v+h{! ip I)F8@ Îqxj;岝`c. {3!6U~6Q fhZlܶba7j@!Gw]}>߽l%`'c>cԛ-yOH{ruEE^1]a6Ve՟kMPEwh`Ge)UCu~7iXAE冗jʹ5^A b1fUyXQ<5j4I0ZhQaEyDVshZtTFiN]Y@%VO ~!ffI/EyAÍ EfeA|:'Pw}uWNޥL!*5kV%%XXd;T IERmY(Mʐ'BhBDWW]ۘvY^ju$XNP.DXs(h]A j{Q3^-@.Ֆ^muC[AUw.8rmwֽF0G*/T[AJ<7P^^{o_ʡjLRZS1 g=I:iAqs˚m TIJI%m&aam\صdbڕeSIjRKvExjE7טmz񨚈1Ο{tޛUy3/qc^Iwtm=kXGyH5Ho`Rd6sEFEw;!:WYS"?A}0kjkP}TPvK[&* ^(Ō+s\EG[P@u(j Ui8 ,\N|aS+C}zYB5; YD(M A"V&[([0X0P2LJ<oP^®ŐGNWF6'g"{A R >wt;Ww๒񋏅jK3,J[ْ%$ʗh"b=s{_FDRh%$OKhdćZDo}S ЫB< DZnI/n2;pI7g4[>ئ;!y@L[Sʚ@PZB;{;dw 7,r)69Hd+40{N1AuYm+J - 8D)hK:p\^aKWjVA/bE-Pv (Dഉo&Luƶ)JUw\wv%t M GIբ$ 8Z*-TTU@pD y@.72O܂X@]`$_iDJhHum8eH|k2YXƲz*&WPBRN&Yxع'ŭ^_m-B"J%tb $ UpL3Tk< YFr*w/6=b^PG#㣎~k^̔ .V p!;,A+0j_BHᮀi]E/\ yZ(&% aM5VLbS1UXevV}F()&0ZNù Qb<^504ms##ѱF=c&X}_aOS'NRʱWfB4zG^,XxWc{-$Um!*_OU3%3$U &PTHM5(A1Q֩L-C]`2P0 ܖ- L 3JD MX+Yۤv^/^H(Ԅ[['ڭuR:𵈋oѴ(*F4bIEl@ +aAmlY)Y,buD&+YEYށ8y!"lݗz3l#ɱ: zV/,k XFS˖n D@,S o{w%ۮ7w&@ {Rm<\HnDw#y9FX(NqÔo]q5r#E{#rk z, H)*>oo27J#=Z9|QoKtֱFF~x \!q""{??WwT_/78koL/U7zwN5nB:NU1bQQ|77w'8}wxBV { {GHH#44ND^G75"UupW*j1oCuYL@UxS82UUA^^px8:h%TcEdIC' Uc"c&R8(RAp Q\8Z&JFGkm֗ftc1׊c2M!c|9y'rtWmb#=gGXW dT}G"9R_t'z1{z((/r}hH.h"E$O._!̦5xW7{AcF)&ma}/ >[3uR{Hf; \ wDž!!xޑ `D.9(By@f"dȒV""مw&7@l#􏐇AևwH~TyWR>b'3Xɱ}Btey78L!wwAXea%}A|$8U[}Rq/]ULq#0fwm!h xbr"Hig)Q*7{(Q(LEzE~g}R_zigI)oD1P\Xzp#v}!sXzvS,ɕ|GzmaE!֕ hu)20RYҠỦѕ%ؗyde&Vay'`r|ҕ!I^iy.%]^U vfgx)܉zX` b Yh}iiLj)Ǣd0"QfTҩ٢c^nv$QAC(t҇4$v-pOYA"H D!%l! X}gD]2]hJj5~IݸV~e٪QѴ=y)dhm{5Hl]~W%QAv6NH*hHAk}vd^ZwJA dG7ؘB#y2 fA4QwrCWajO^dh{9fGIʙ=@Z{Ҹ_yZe=Pl ,%;(_dG'{g坚Z쭴 0H[ZZ6b*Z0vSUHQ@^z_hΩw{f`5G mBvԍ:軡tê(ٷRϏ70P zA5AWX#.!:覣loblYfu,` Ww* T Tig(7H:7Q(^,=mkVg)^% 1}@`BlXdJ"Y2Trh0KL2p9X` ]+Pv)&Zi$;T!iZTM[PD rH_YB""nO 8ǚXI*@H*BGI(_7)Q* rf25jm+@^) }MTDtEnZüM:Y;R)dpoM(шD$MiQ-19;K~,&R-hEFM{&h<(KjU8O͍&$>932|J+GfYl&ܲP؈*"D`t]NGfNvKdY5'r2ίҩP/d$vH'rUqjZ{OM+KEC!msް}tM3ǬNH45ʶ䦚Ic[TD餐edmVE&[c-V"Dc&:=L`tRMT233I| 3r`GXQy ǼƳT ,$1%C^*1Jf⸪y}N$+<=o Q&w%D9xpD}HsͥbGtc  #N^: Och8+E*wF]U®J]YH:ivٖ9G3?/~<)57BB$f%}VuLd=1X0)k$wc2QatH I@F)q.BS2$ݻ,T1P̋ Ѩ7%Y hxnawT5TzK)4Q4U洎D/d1Ё))MS%,E !@C;,d w|8:xf #n`B>{t*E̿FW;RE2f!p-n TWև )Ӝۧǭc$}2J|᱾^R^6V%3k?v,7 | !P}z s|lv qYZFfx bA+W7a|0fS1w#&r^M`/4UT `83l0qda.%4RYLgx(zsA}5B3|-k"ēfskd\88 "x#CYuׅvC4!W40B}>Xxd3È(GyW^r>CC+ " `\B85v*I+(̶&?I/2|od^r>Z􌹅\y,%0(,Hv$~h]JĄzQ8BQ ..[ bGg[h= *P\ϴHwoQ:dCHQЏ 8%khx@XLJ1BY\Y{aT1_G$i:#% &y9\y3 hqa@'>te!!,bS33333f3fff33f3fff3fffffffffffff̙f̙̙̙̙̙̙"/& &  & &   $General Motivation" " d]  &Specific Motivation" " d]  tomic execution of the operations. Wp " d]xp " dd&w CH*$ 3dxaŋ3j4CÈ.PHɅAlBbOʜcǕ.'p i CJ$! $vpU !~#9aWlق Ã50A_ 5$+pa tlaB1*XזL'!2  h~ ٢ۏX["{Wq\J(q}K#!J+[&PprC4l萡%s&$ {R6jofX޼CU0@:/^Ad ^hhaTaW]v'al*gEQŔ=הlIv HGu=`qmR>brATARttUw,d.@\qtaf=7c!TpAtQhЌ$D5R[nuVWYqܓ5c3%DLQKw!z ٳ@A6\oB)~~E.yAC쁣VxU6F o.DK@`noͨkhgu4=kyѩK@tF4\&"QG S^cEI PHjIW=)"@Z AoeP6*]FU[Q^@ f)8QGCl€(2E42bx؍O'LळPd|D2_ %Dh2l7+QN p$9,~r7xHo@fonHvii"`z&,G0AxzU5sΞ"!R ?f++#Q%!jcԘ$/=!9 jj !ʜ6*ȶ*ׁV~Oi+hE1tBbN) 1}cH@bj,z,#%Eq5 @i\֤'u.!>hSrw8:F0rYLeRJ]Vb PK|@J!nYnE/s!1D|5i GD9BN~٨<rZ\=i"HִThn^cN"aE>yh RD: ư5[Sp㻜p.FH:)(n: ݵ%E@LQ-IzrFd)<ĵbHԱ7)dh4'݊V4D (m s>dYD袬/^I1giOtA(w,|Ũ/K 9gJ}5Tr4  ,`:<-eD10v *'PvT9ykKJiJ; } Ó"fca('yaK ˞ը䄌6]RJcv<,+W0"|ҡ?ɪ`ZݍVK zWF)>imcpIooMqM2 xC㢚SQ&794Xy'â]j.sDnᓈdr"L-+2v gԺ9΍s4yэ*0Pl*OOJ! H6Ctb͟Ⱦ ]Vrx'PE2?jtn{g`2Tw ;E_[ƬBR+f յf_4Uha섞j"ŷ?QHVEә$ݬ|*Yd`9 Ԡ0][sZ_ ;B5Aqed9O6āy|y WIZu7  o4a'$Nk@Itd( 7Z5&fW"P I"q\3pAl@@w |V7v'{1[O\31&us K7~';}v<0 s*/%j@t\|y7&2wvWCg5]*U(C 3](3pvoH]=Xq~J!zjdž_ECRNXx"M ]qww9#tX uuѧp&?bθu9t_Kh#ZEBIy(Rnf t d&Oot$C#tzG}&Lޕ?X 1Վh.(9x1ِ⸋#w:'9!",cS3333f33fff33f3fff3fffffffffffffff̙f̙̙̙̙̙̙]HPHHHH  8on /(ri@ H p HhW H@@euh HHod H^(EH*,ć!"A‹3jh0Æ#jǓ(S$`@\$Κ& M xX r7ƍ9UE"͔IDLR旡e6P5$og zFHtTD8܇[E6څA{"|c}H:[kThc4U$v&cZ 6fMX-Xlv‰@[`y9A-SIy%r@ ԞpHgyc1Ѩ6WAxXyvQ\=TZb-šG6P]5ĩ櫓bPnE.Ui*G1bcb^ʔr[[R }PvF k0+f_AhN )Ed\r^e=Nd1 l-j! tA}}KE [e֭%V )bAdO(a~@S:W pVS;dau/"!(ڔ&AʅZ}H0&A_95HU7bY@ݮ6 -tji;d+}C`gwU9~9FVw.P7Kp"fEGB1OjyNV| w>."˛%OPK%bܓv6yBzFG$=^<)h`SEgLytnDq@"G^\e)& g`ҚAN"#c?ur5gdaKW)@ZӂN 7om`#:D &a&X,$tn^$UVA * HRY&4Z$g4IiRe:8U -y=Me8\} RRu!SRFSN)Bj~ZM2CZSvƤs-JX"Nrk@)Wdb=Q2@BplnҼajpi(k2E #`Sx4ۺpxNgZ'OW"_2%$'PFۤZ 3NcL@ 'K;S5״3eD&K'YHX)M]B-Ӟ&yNl&Oث" $@. .+`΄paI*# *@fVb1mLB&( z ( .qҳM=&I]'+x:cBk\j2Lږ?mBWz\#4d$fPx);8Y:)6y+3RmĪPS5)p2pұ,d7!`KF5|\XX)lsaz\}=լnTdvZ;6y]A2\)r݇܂._;LIX\¡]wOHE00);+,n+b& pe.n )yڈ~Z Kej)3R/X^O_iLVXi{xɋ1Vo8p2)ݤo`X!o23A Y7b }S3N{jg!R;{PX!l"2='=x)مVNB3Gp{L67M!W}FiE" }}4|7#Uwgua&g]EqQBAht%t/1/tA`GZJKaOfxYf|m%W&i`:'ɨƁNdt#_8øtcexDTKLX7'wO.~K`OT$fN"(`jb}t~$72J7GaX~Y~xH'7psU8cgޖoj2j򇍘@s+)؊i% Ęh PA)(QVQ"!!,bS3333fff33f3fff3fffffffffffffff̙f̙̙̙̙̙̙H(()`( HH(()(llnHx)x)*8)hH))*)& H**, HP*P*J]p$keH**x+X*HH**+*ecX\CH*\ć #JH fQ 2dHI >BCÇ,3ͫ}(G`㮖A LiH68 U6lS.7 N٬{q6ӗfP@""ו`TUXٹXې>uZtjɒ|tW)RBi[īڤdoZb>mQX&cU3d]ֻY|ޗ+xW&{zM) <kgnKQ8 6Aw, .Hm9q dϯnIp5)T F:PB:4ɬ~E.1DPr9CyF)D^ `n1/yHBBMh,(_SdmIb w&c]= 2]@"65Ve`@ݐ Ē)B+ Icrɏ< iă@a4Zj[Է4M LjÒ eh=5jY=!X[ <i9JG7T U&bF[؃"71hOE&kI J"Hk* Dgs+U1N Lb0^ 2"aISP)Ñx c`R*W_!ƹHnFsUq lf1ږdo z$ r\A-efOU <; ʑ)xgsWY%J:S 0rۂB"BeEϢ>CB5[5$S+xOn aȖݔ /#P;-)t#63ES4w-ä ""p l~_d ξTS=4{W&& AEqL+`?:rtDŽYVON_#eBr*Y #͗Ci%LzxYӯgJO"A&`/eI.y˿Nn"pǝM\][J"qi Yŵ >k;_eK&3  aЏsD(Gu* 5}>HK-_z$eNYX7c3} @i seRyc} Dr3A]1^2P[;`36 )xԙsL558BځJzx>ԃkD$-Pc$`dY^(camD7=FBDcUC &dǞЂx)"XYvf懲4[G4 *zm نũl)=@µwnSs9$A>EoU7lqǓ}\٢eyfm :\y&j&Y9w9oW{e}k63$ pmsOGMSOFFICE9.0GIF89a<2! NETSCAPE2.0! ,<2333fffpȇCȇC\ l0|@P`$󗯬p4򗯼򗯀D񗯐T𗯠d(t8H 헯@CC0C2 HCChCCxCHC H*\ȰÇ#JHŇ2Qa'T@cHx4yKj0̖6SN8(̛SQH% ӌ@8`E iʮZeVU)ܶW{E4̽e 8` =-Z Í oR$mi<1V^ [o_ŷFpyP}o<`= ٚ''fZTQu&PIeTdͧ @] WI^V݆O%UgE[vQ_b3>dSbbW̹#f5$$Br))RbMF4dWKƔؕXf X@! ,6+333fffhQHHB QHH`BPH((HH88BPHppBHPHhH8BPH HBOHHHHXXȖBpOHH2CB*$(OH0 Ci B_CQ@;IENDB`n%*h%1PNG  IHDR0n[sRGB pHYs 30%IDATx^{ǥ4o1*`&UF꥚D(MC!AK4 )AkD UX^cS-Z(^boγ=>~Z0H7^/~/VTw_j jttA1dJQƐnPH-O: R+)0d!) @Y]Oڎ0d'2J!PFUזC" `>2es9$bԓ_oV PO>u]7uWnfrix~! ?S:W_}mayO+=Coҋ/x饗J?̷ӯ (.nCBǓɿcdž~|{(@wuuY-L"ٝƀcOTL}Q2P`CSK/t9na}\r YΈZn{キ\S)wq%9GOa/㔁[nAnAۓՠAD3%eb~1b,XOOf2D7|Μ9#&%Pمk*oBs #Gt$3'KP >{b^6Pwǎ=na3kiӦ+*yL X r$zD[Hdrg+SO=裏>J!K̃ yQ_~)S2 )H 7`:}cW^ JlM3f 1<=I0ɒ%˗/2dpwb;kc"H;c=6S"Z5AZiEԖ%XTQJ$ao!\! cFF XEk2$2OQ @= -[&f}պ#f֭d ѐB HdR0iFUƓUW]$ >|O_/H,66M5C류.A˚4mtx7$;-"`-`>$UGF| !vDpe;-ZXh$cڑz ~DC_sԧ~:XtPڂo["DcE_~$A*'{GC;vO?|I nj8r!8y'l26?ɓ'? &L`TgZv-OÃI~8`[gv9iҤ)S055k֌7 {su)gg;6tЋ/_~dc(S?#pxxp_i'a!$Bd}g|۷iPoN wT_Ӈ) &|hy?10ҩNaXwA@ܸq㩧굑蹹d@t4/yl#zhj>ᦥ\[>ebʦYaÕ߬^FXr'H2>5F4+I[dY*Wg V-A6P Js:n JPr0չwK;e| Z',ǹPmgn͝;à!oYG#|,^8tܧЦ<*8kgUlg 6>?Z!Yfa ;T1wF rZ7qgK8lOyf\-Z6r8I.8"9:ypA :Ѩtr)"?;yDNQj :?yPn[T6}D!+ۍH׼ĐPkzvS{}{!wt 7|DvOE(gX9q4aœᥕ2XG02a+Eth.k?:U]{?r8̹c b φe)F >08oyl$-=rF3M 8I}a#m|p^HX\o$/MTVV w:b~=ͪnӈnW+-C@} jL`8:rC[/ o8s2{X?Xc25ˆ'LSgrI~ kW̿ 63$i~߮ҒF EtA̽\ )Uy}3O]tExUS5 eg^O1Q52Ƒ7cP V624c[06 wv(KeCS[ݓ1P@RڈVe;{mjrgDw_A.G}41Yɜ0U: meO;4o]?O0;o pnba@N+(Ɉ ]X#ShBiF @L0eR 4`ʤ>#6i@bxuC5r7Y)`Hډ湱)G^bdCymK cjh%(/M64P>v|^bdCQZ #E;{R{-)W~hBaAG\Zuh"tp?SݨOиfq'ūH*L\֧r})qd)oe<58YA+%M3|QlUL/a:Q`:iI$0ï|PQ X_!$|\"n;\ABd_|gL ǩz“`@aTib.d^Qy6,ꫯƞ9{8ƣD>$G7 DS!42.7`4h#G'd0?[aL))S(45sTT.P4fbL -w9lj*a Б- ;+1Ԏ,_GN4abZDBb*H15-g%4QE&JeH,lL]7l! dsюQ8NL^['Hp A3C8L%QRo006@)h -=iW^ /dDqRSD\" q6SH x*+\'Z~%dwC{-%Xq $&# fb28,ԹO>!ƍ uV5j͚5-n 6mɓ)}ÇxD\LAO2=\6"83&v=`w@D믏9;OB-%jl`7J܉ND|mDˢPE0 dӀ@xjP!Mlk<ȦP65xdS(Om*-݆Z$q*W_ݺz8Kj_j @i5 o x b6ϡܤ'':Bu{AGڱ* )SQ)1q֑#x339{N K._1bcVïQ@  33Tb|09`axƪ'}ĉػLκ%ēoڴɔ.=A-ʦD'y4:C}9;B #ӆV䊥gTLlٲ#2 W 'EO2!\.Y!w0)28H|6d$/_Kc^$abr5 ɳZ(I>Q) X?m&6Ffyc8ෙ TD'x҂|F K?h l# 1/4f۶m{WnOq(I^qwOpWTzvC_deSME 6m䰱ľbbp3g[Drg(/2[ADm+9g%yfb44iҔ)S4ē0 [n! _P4~Ν_}Ő+MWko7f7llU;"G HJ+;]H+VFS< m%*Y guA|ZzŖ-OyZRVj>k;;d1tTQ)t){n;8+a*F{=>*'A9_vW 9+BP $ܹsM{'ݜ{챂7a„8ג͛iѢE6ղTkYZPt]Ϛ*(ōU]X=)|תFP|a @V5NtYmۉ.7bmSX;a @Q @wiv xҦFv{~Be#9Fbn*XC6գ+TQX؄}ezlSXti @^՟Kc;љT^xؑL1b 4`ʤ>#6sdkCH# خGpP>zl,m$6vgdFb mu6նkTk[][`݄e蒞WcSXX @ @b4s}^9M4r7]s5,r_új@x0iSXfXj*@MbijRo 6I]$&v PjXj*@Mb@o?|e*}/RUmhx)>3gqƭZ7lpw̜9O?oƓO>yuM:ă \;y%>sg_zժO1cFb'GQă{r:_02oh׮]/uI]m/02R뗩f=;n /: x^r%4tF%t7c:Ly+Ty_)O% BRTWzbVgyCP>FD|5XxM7?xN6е^˯=g0ep :,>kgT7g~-zO\lUg,gj)+$'fs1czYH]& L뮻\םz}}' n\)# ٮ)h&Igȑ#3Shcٳ{Əm!B&Q (,ؓOG6/dgrQG"ן[G5?יiI(In|TyWnu gI &NJwΟ?U,3͡9Y0{\xᅌ˖-O>7;9[nUΨQ֬YÂyܸq6mڹs'ed&p{W_}Gfy}UE{;mڴɓ'S~Ç(.",$ S}7SHj<7m|&dрIL3ba  @g @& 2ψ @L0eR 4EsP=#S1GP8+jNnv<sDF:=9`U8]bTU#CB~ p8yi&[a:s8q+xϽeܹp5`@ RTw"'8|< iyw&zĉ>![8x 7he|ŎO*$gxG9c-~-]A ߿?ME'͛7(aѢEHwtK29(Uޝ–~=tj;(y('\'CGƒ9nK{zbWHď :̉lF)Gq֯f gٙE9a r4hPhēKUDC9"y2Lä-*mxGD/z~/~H dݲegXeJttyKC-8pK$KLȻ+<-PX`f42P *,ƙѨ4rMZ|sɃuT8bd]{|2DW?#y"./PE2eoe}ɇ 7_;v.]UDGx/zV^ZبΥC&:ꋕ# 1/o۶](ڻr(=ދ>+k{ Tl aPv|9 R<9Rv}YÎ}xD7|-|qWy yS<4.W]u>x#*9>lD1M4 z.oQ`ݺuӧO*Pd ټRm}C*ت 3Lݲ .EkVXdɒ-O0Q؅OH*3J 6{z7?&NMʑyrұ:餓xmce>Xi=c8WNUq,N'!†LjV x)"q%٤IUT"#?c m@q6Fp65TnԈn.PȪN$VE.gQm kTw/(6m$fo63ƈl 30dҀ(dȦH̲XZHi0B& 2ψ @LL'>DF)Qݝu(FuwNtcwn;._ ̙S 5@tu #ґs"Arm\lٲt 'wUz{G?k żcb,a2"8,>uTL 2IX7x27l؀.\OPQ ) )L`*hhBPiCs~ ť 2u}o:[o]E8h PN (2qݥ·*rڹnGFǖ#t'Zrxݖ26i{8#?}ј[>·u/j'϶];ӲWvcS Uoza̙\ t=b>/X 2'TL`KFvPu{lC!] {@!9/oO +I̋ay3f0^ {q*W!Cbڠk7{:<{a1Dͧovh*Q</o$>Y!+_&߇I7y%^ގߨMB|;LW6?Sg oW^j/n*\/]bEdg;Jl -VZ[ EܼyT$fJ~Q;B)|lNdׇA ˽Bߝ?>-\~1c#<2nܸ~ΝvX~/oG:C^|"]EԾiӦtA7+WT%6zG_l%o6܉Naqy#8g |dejdȤP&0IL3ba  }^&F\_ --x^}uebxNY>IENDB`nO#A!uPNG  IHDR2tGDOIDATxp[}$ݡor;w; ]Xzo_ph%Yil9 λ(tIRl'Ꝥֿ4q{I#m6w%KdINXp,.XRؙzgRI1Fs||HlX:9G>[*e[>(p "}-LLPS2)%DKc>1 cxKoPKc^UKU 0EQ@=LELXI5섆un7_-2"R|1oP~wgsZ΍{hCٜȂh )Cpi%1S%O=_O:yg< .ѝ84LxogXo{{!Ky (8<`JbyKXrypO.QSYc&H^A}^aT8oi24)^+9J듭,Ecz^ }N-+bL˜p/r{-'ԡ)! ɵ(kQ3[_~rLLl@Wgo'IqbVNL\y͓6f*tV% W>c1edM-U f?[MMs͝m6ٹ'j$>OfCD]":v޻^ΰ(J (˔ˁ1S!޶-ڶe۸;qrjs'GFܓ+eG^ՙSQ'}o:gwfiސS"%+w~:y[j e?x,>s$h@tV 'h&&@Yt:Mb5{%0LmeOEeE\I:sI/ϼ6H2o,J1DZub/>Ҍyl`:s0l_^nLBf&M[2խPgj q&>;GgN2)з;7;ATE~1M'?ܞ s4,[.W(fJܐ|{KѷǹWP ֤6P0 C% 꽋 N֥MRcNSg_۶qne:usba%?1~MAYW6)+i07x<RPN>ba'],]}4+? P.Wo)-|zE|Z^5wP4sqH9~%f)l::"y|16n޼X8HmVNOs$Rկ Ӈ3iMr:%1K98(#5];EP' (˔A!? 7mEsȩS\KB:|w >Zݭq!E`\V4iFVX躤[շ̧ZcLDŽ{&Q(#IϹtpUBIIGבf3fR0(˖sm'JCW!%mOK$V`qxjH_D <%{ ^,=ZSFIÝJ6X**+Z]q<k-8zR_wv  [ KD31ʲ岧8-X$O t '|Ymjhn̴4\I`gg:!fs7*>]m_a* P$C[b1\&ܠSYWzZ,PbvIKv*Q4vwsGZTO\zVCj*mezp\94%Bf= (˔A޽x,.}3㚢ϳ*UoSԬSWW2Fu_VW1W^sP=Ų466IB~ .s}-):MN`/hM3d@`93>y"w.y{= [~-LX4+_])H:[l!ƏWp/-K@Lk`HI% IѼ%ON_ dCl$38ND?Y_nZޫYɜ֮ (L/9<3Y!Ca5fZwh*ă+Y&W։d䏿#Ӓ@‹a*PK--fYsI453朜J?4m1z>cgH@9 o#u#)yvR[f]NFc B}-a?ӱCm}U KPc.4i{Xdt`{ ;Kz)}oS.~M=!Rhp4'^Epo%)UL'X?aF2ѷY~\VkN6h2ә}fnVxZzJO /֝gX[b17RG|ڍ1kI|1mr^?okN1j}[ ^5d<9~)6O&δn~&3#'-i55<D;1Mi3RI,mX`^Hc/#(/ -qЏCZwoXڙsà {J(f1l{p8&6:X$[oFN'`KRϗԑ8!Mef4}T>r)dD`WSIv:ŋ ($كeP"g%j1#sSQh?L©ePM wj{j]r6^m̒ 9KN3 ǟ==9"z9s= ^D`2]:xPAc)8%lZs(s)%fin!=L]=*A_W JD1C{[ZwYJ4f﮽w]}W//^0ǟ(AbٺԐBO?1x<'ћ2z]^&c۔M r{Β&601Mfr{v/ʧWFN=Rrı,).+ˍrGA84)uT S4 JB{K|]R2vۅ qtf]Ow9ђtFn茮rGOC]+ND- [_* kׄm✄'F0^ȴdQɱ.K]s=Wl_.E(ޒjy SCR(ERl[٦dZTTVxxmV`IȞV)φ.*qgOI)6'3@Hfem[3)>sʑ+dfbxK@xKbHl6_λ!㷌{-b3+ω+/_xJJ("Zell7fx\.!;{;k2JDeї?0}+3na~\]b+R.dX"D)ğ_rL K8sxQjJ9ޒ﬏ˁhIAZ2*dv33:V^Y4kʠD(]|o)yкkUJDKE;KˠT(-Ħ/N].2 Qi/ YÍ3?m6 dhr.4ZYy(Ͼ?˹qL&>T"NF߹w^tRTk7%e|&f&MSFnRإeP*[Opy$Uz˸VoKp߰ 'Nj7mJ7βk8Ʋ'R cNGau8rָ׃UAR|1~ۻٗ/qOJi]-rBNإeP"[X+EqfowXW6Mwn\ӎ&>MmX5 x\[ i 9 W!a]l35'%0x<`%]I?lzk8p+܂=[>Oʆ\(B3 % G޽%x_8(mT$T٠ŀڬ.K-ak3q%PgoS&X`,ʷtIMS@њ, ۭ˙O4}B[⟟Y?|ns 9ٖyh-g*q $c_Q'٢%'6TQ{,Ya1֯zCCd@wZ.X㯍lL-%6uVSY#8BSꋯ)G,OԨ6-zқ#J}U0[\(O+6rf%%s|Lo QVg[=!S>ty Ҹ\S˘nᣇ2ZE"K˃[};*BRpe:2 Xp . %-w$tČ ߌuҧBSYYC)?ڴݤEwWJz5bxK@\C[ 򈣊>w*Yr89_- _eHύ"δΜ˜7@^8}J[ />+^l(Dg L!q&ΟnԮ|tQmNѷS W@PRHq:|^Qބ{68iO*Z rQֿa MX3 T@P;モEjjGBs*7濼:]v/ƃ= M#Y}CixK`0ˋߙ*rKhxUzV3!‹{<f)'Udq}CixK!˨*o)OL& L㍖Fy W@PR."GGz0 +|~;R4o)O}$:Ӹj-WP:$XBՌm:솮]*(P`ryNlO69R(J[]fM9ޒ+Wd1D"z:<7zn{vEΏTJLH|o*s%xL7n{sy}3e[*\}CixK<._jcG xdsIzKݮ˹nMu /[*\}CixKUGT:ڳ˂#2o.wl! Nr->ҡ4%hz\f&ZJꛫ-uv[gbrLIC~㿬ڮ&Xdr->ҡ4%:gV.F<*Z%ɟ=3di(%E`#gVsϦ }t( oӱG K/܆4Py2yw.8BsGmW4}q:gS[o-Tg{p{܎8$ ~VW2yS'gi *eOs/gr,l}%DixKwu=ΞuU.fiK$W&m4m]@^-9Y'7w5Y DJS[ b(rA!5 AN+傕m]X4%j^xdew'x"D,w{|y65H79{]toe ȳlS#|V oKA vģt//1/Ul __fY4W,ʅ+o wUy n{L^7x﬏jC|هL-M1Q]|IɀafO?1}"HKn-43m$$N[k=ӁMn| (s&)dr\fتpH'CFlfas`ׁ<'[3}QD >@Q.d(8iC[TXYLuc]wHtcc iw=o۲gm]rMS%u)x ;>~?Vq[֕C-oZ.~Dp& N&bߨ7"H-h`WnIxǼ'`XoK.GgvY4GbTwo|AjmqۛS#>763X%=={}UU@ZqmA =%#p9WFD4X$FЋ78HHwdIV3,]fw}4鿣\rwoɵD>LI\RPmcͬl,Mx nrOp6 5w}7n_[ u J|u#7AV_Nabj_41VWbK(q6o} -hrA˥-eѤ(lZŶ~چzk}=Se_y[6/d%2=[HEwq#>@V([GC#w X.oN5X(鿣\rxB;-%-;䁷@@˰ӡ-hxK4% o @C[!-hxK4% o @C[/e2Ă@9RQNQ.{-PFh'&@Y -PFh(&@Y -PNh&&@Y\[LLl쁷@exK2[PLL[LLl쁷@9ero 2BC1d@e2@|k@[!-hxK4% o @C[!-hyKX<VWV4KѼ%aOj+d &f&nm-bM֦d R"xX.@a Sl1ڡޒo7 DK< @(4vvcWk(,9ro ) -v>% K$ @(4㟱n j/ZSxwg48zvQm637ߋaIt2~x1ߖi3&D#3\șV{7Vo۲"&Dס.#P^~Zn7{gMD ˞rAgZS:NZ.;-řq{?-[MZİ@Nj9N%>5jO~t> qc$Kܟ&}B#&|jF,iw%g57$>qEmwngG)'R>wIL&oR"=OI w51oWSWq$߹XIs8Mٶ2E_*ۓGܖkxK@[:9Aز ??n>Hm1 6s :صeS KtNl\;vvYx#{4$&2QLM̒ 9=q ?~x>TďYA6Nge 6+1T=z=u*͜{$ՈI6_d/UHw2sKGJ1baf!r#%a{fu#9o h2:z*_/\iq֞zz=oCSg?SX^o~Lo 󛾾IQD)+5 ioY X6NB|>&qTl۶fVWy b7=G1;;+b1.=7#\~[9p#={ˊ&9r<ѧE#Pט̪Y *>%-@w|H1.D}a<=4?Ÿ sG::&#fߟo+Y NI!^5Lg.DIKYt!Fy2N@ÔIJg@^/ʹ&3jʩTN. ?IHgG5wCWi0(82`\|S*q3Gt8zf|˒,ԊYejş?ON.dyŹٹK8O}u{q%s2ҴU"!Vn߀l)o -4}a-g{=rO+0@-*$w)[8%-Ԭ|G⿌^GRQ L)yK,?j$9yde b ڛE" \*y]^xku 3?"-B)TSJ$;})Щ ˖iG'; jCbO*D<{:(ϷIF\ꪊӦ#@,@)1oY{=!,DMV"bZRsu$<`YzXb8.F~25܆6f-9,'fu-(1o$\I:Rk-\/)K8sD|H)[6T>K<-@ISzb;es٤?{kyKb'&zhdPˆ/ _Avzl%~n;+i>y~Z @ISzS":uRpFX5 G<{,z/R6;WMvJU}./^1*%U\h֬4)̬zLƇEޖʇ鑒Bd@)0Z ?q7XZϔzw2{q+S&M<Իrm5zpo4QN!M8f|*FwCW2J*Gue8> (?i~qm9j5I0~K(kl= "m6kjI;y3 vW!q&οsXkhA-<13dM&8=9 }'uU"LVd2M[wty|ݒ6s:@gK˥FA%xԬ`+d?❼s\Xgw+5ZŽ{f)_ugogWo`gYL -M|*ʏ%E?Z!9]H"$ K7y$r{Qfn&Z`2=mp0+%$-q4 {KH['#%Mm+H傖KB[b{M vԈ:;ôÔqonPnwW20ÎXhB:--ܖؚR\0d4l,Z`f)u]c?5wa.gQz{ :CI=1zgp ţfTk7f6F~ ]wǎ;qҝZ鿣 oI"["eYm/Wp+75-5Z 1C9<-z @JS ?g޷c_nRWϺHSMQs!WR0__ݕo Q.d(jN\ .tXv~6(<F(\j5'^. Yb<4V([-eMzUL3] d'M;,7=syAa@lMMJ[OKUT 3-{l(r:[j?O9!cD#O||(QDF鈭V;JioiOݞK/GX(NMTr  Al覛o8=Pꮺt:͆ŷH>ҷO}o9(5G-wwKa>r@ioڬ6m?k4fշ WpBQH#"дD*tlG1S$=ZhxK4%ʈn7v/-^S%Z2(-PFщ+Rfb"Ao rB3KʠD@ebxK@xK]-9-PNh&v䀷@ebxK@xK]-9-PF />hxK4%R^zxO=adV@o)[b 1F<C 3-e?? Kǂ#PQjkxKٲѼ:b3.P[ʖ|jn!~*^u-JקFNMf^TRP[&Oc%oXWew`oI]kW$Kr% f3n{x+e%!Q&jjM0 *ⱸ1'[^XW@oia V Wvkboic;;V^CCC{Ţ\roi|h! m5f\.RhRl16G7Lɹ9moo͝:lе~ot>Ekj=b]LL4Y3):WgۡDDzSƪm[UT*1`0o??~ <eŸިdȉ'#]3{Vӵ.\`͜-ܠ;,7B{KX"?4:Nb>>rsL2H6$/\|}IR; ͱ=ԛ5xxnOV7٬q-ZY6}o_s9ejXoPxbxk͍|ڼ:6.k :pBQ .ws5f6+< 鿣\rQ o)GՖ'?[njkH,?n$t}%J5lۚLuU\'yE#w Z.5-Q 6KjBq&DߎWdi00ؾuz{v)6:9iSOm3ɾ?\ӭzCBs!. jӝ9zR `1<mVZt{#9bn =mlt 7moA/جG}{Օdw-y@JexK[Wƫ6V=;IPv;2I&ՍIQnhƾBdhR|)d7H8N .b3ؗbMXWmyE/6vǔ$V4;}O+?t8^A,v?.@ϖ bMb9s%;,7{K55\f9cF*}fٌ-ƪUM['DžTS)?忬MbCSG,G~~aooɺ՚Bc+s@O ַԇu*ՙԊs끔^  ?Gg-H{ϐd*haP U=(@yRxIIl.lo)zDe=8NĄө(jLo?hjT![y9x}B@Q.O;ᆪbjM#sif@gO*|M&{1[R;-ȑ6[w;X;huUPvG]܋uKTͭ7pzM(d,%-S_ 2b3L -eG"d;0ȡ6~=91R7Bڅr%6owP(d2Ϗ7ZRц=Qh2 *z)ޑ!t([J[|o:#9XܖvEF%Og3R3rRU*t#^&޳s9F)=o)K^u<_ߢӈ$&E4m$LVo\Kn%5hieA@*J[+;$f|pmxK ` |iXoHM>O]W 1 %-5d2ۛk[2~K@?,!8RJROf͍fOI I4<gTԈ$^u4)f)h#UӐ]^,mO|ā#{A%O۪#C#ޒxؑc$*W}_5fiMBLL\ʾ}roXWqsR]?>"ʦ5LxKQ&:J&fp-WQ^fr퉹|2%Eʯ`BgB)d%9ad=ϸz5OxKQZHd@Rl+f.4ikbUKzqŴYb;;GFF%$z*kQ4=8 Hrd"x,8{a,:i,P:ޒ荧Nj<}aZpD *e]_q􄶮jO^ٺ.HB(gσ|DuKY;:~x"a%9sN޵<4)x"q lbfB^]MnWGWu>`kB_[=RoQv _Ii>v~Lӵno% #`sTCB:‰t;6UNNĖ)~2vź*ʁ]m7,RĂԎSkƇv>!e楞ޞk;iC[-L3h[M_;'8ݻVԉ$<2̵=jm%5c("Mjښ­]u#KN]LGOh?7f>4bGI{+{K9#ާ=rlK}pSUA-Kg^,C!vOVg}"ELd/ERwl6-I](/o-~pK wP(Op;% t}`-- I̢pKГfAn zT>޿pmwswK򨻵nQ%IpS($Yо[7wKГBn zth-AOm%IpA= n^斠'M vUGӁ7;b4w-AO WÕ%Z %I({= -AO=p%'`^͝R %IdHqK'$i)q= '@ɢ%I2Sh zU Z@-Ŏ'ȂFKГdG%IF- ?-$DK+k[zOpy%Irn z([ _ ʯ'Ct9-vzT_U1xű~ 8EƧ6,58y0-n{x2턯R;G:$j{kmGD #C#QޓwfuU[nqggC.@I1.[Ty΄r)n SYlEPHjog㤌zRUMgsgǞ3M:LnRI$/ڽ[:;bGb7ߠL=I$DT/޶HK)\+ʾISAצ5euuu̸0 l,P)Qaqdqu\2veMNRI$3ermj$]pB,#$E('ILx&]Pw,I(J'1L-c=\rU('-!:]EYYuSwGKӓ._b^)6br*Z%Ra;'=⏶?0ʙnSTQ_B *b߬k[V~w@htzlڅCPuvr!-eoN=ix$ʪʾ;iGAء'%5vKҷҸH*yI~WIuZwa͍޿PwkגOÍsݭY!F͇}]qRgo+fz[׵*yX< ~:p߿Ԭ64d#\d[o%^"侯PsuMK?s>8MdB f\qr|}=KȞX4 xÿYH,[ @j&=k$١rsفo=[MٞE)=o5|PU]FG+x4[+R`o[pK%Փ6nO$Zr].~A|Tn;v!(od3&A_tyED{et;mۘtΩTIťOȒb˖nb:2dd͡.Tf%%RtĜ rSI`:ItÁB X1zw4f\.g(0aHqCOoo4Lmxd2)9:1{xQ %S~$me{w *mcRI',&1-zC;/&!Ys!yYy}:K?߿_C'j}95serZ#1qrD%/-kTẌ>r|Dx 8Mf[8RCI'hv ՜?+=I2G5(4&Q`#Q/@ޮ{V/+$vvqwTDhRuOpGG韚џEpɮgztɼ!$+%2֓vY%%7h66670u0m*̐1-$:`^[>wbFmI$&=Ls2j|*tPe+%?Oq_t# U)9$uX1tGtXzzzk\(7=H5ruHM]ԓnRÝ6&(ZOQ>$koW|'k@4l'NNƄ&odsژ$^ԦzΡҹ%ju<̋'_XVTSmreeqw)I*S7EPlA Ydzm>!vA5 F_쐨 $4[X;62y(\.k=z9~`6=I(ș_ZJ]/r~Bz[ =#t$Lh5,%X%xt-ӓBS>.]]!w֏2FJl*J; v!+Ϻ_"rךh?>cGa: :qeMw,QIғf֞ksڲkKΣɈA^{ee +0}zlJĭH1[ڶ+յʦ%G;`7Q!M+VXS,Y$G%3ԺU|CnX[LdIOCx)S77C!NNKٯe5d,=mo'|Iqlzlw+K>ΈEyDnWؓ7B.JVq1m5)H''.e z銀ƂC4z$s>%3NfnkV2OxÙ>5&s+ElF٢21ْpc]iMea}Cz'9= HybT6T.xeӹ~r0?<ؗ#&<q%L/*CW )5odOXOz'!NI6?n`tD2^n7d3k(V'㈲ ,߱()ʢ2%KF{*,,c._tIVH`DFef5#C*[Wmr)Qrzq~Rf.$OQ~v6+ޏIř'=5^֯gtnFnOлJA2,=(:֓Đ9aQd>WwM=Y PFx0DK /R553z5IM >I0n;rmL%ݒT8ƶ&|n9WZ+֋St9Oʶ |lnwgiD[0T!7EMZoFD2 ^83W $d tܼeYkzF~~X'ţq~bobSN?' t9: r^dHF7<X~tL,ꥩ5ܮ.%TLe>K^J'fkyҲ[T Æ͸EU/m!~mc=bkZ 8 $)`Xj=:j[+!u?d5ocEڮR>X(6f<bneu\Б!&r=<|1dY elѹhGy`k~Yl3ih*$|8=+NPsqX=$P|}%yG>#y3<[vmaWUw~>sK ڃVUZg̖]J:aL:ūz9/gN5]~fKmu-3B SЄ姜zz8|hߡty3% ºzgSKr;J*Aē۵duoio~$DhדμpFliˬLu*9Qݕtk&9rF'A$Y ڜn8CCN] 2>i A:IIȣYUS%5i-_ʦ)T,> ' uFyҽ[:M8tdCvNZ'$ГdYq݅O.tO6pC-Ai=ku'[rKYR9$OdnX<| 1ߤ,oWd)P/7]4K'(ғf9տ(ohꎻՓgvLVTG-+YO""3~|1PS>yvc|OCcdN5%柢p[]- *5mCbW^}EMR]t;Ld}~YOBHOrbOϺTa#NgJ!u';n=Kl@M7ྃg&Fϙ||S f†yN0{m6zr_fX&vHW/+O~&`"׮VUBj~ghh\g,gd}J+_׹Fm4VzƎ*gov-'ג[L36&'̫%ID=)xƢt5dlb|YY'ӯ(l@oYRDuMkWoWFeeJQt<$rjJEm~^o88Kb2K%ZPHO >zJy)ks+ MfmNjIR*NOxXXh4nOҢjmW`Mfǐe:p#U(s7I\rLs1CV/܌;׎ʩ5%dֽ8ٜqw;tdH&jUfNݕq%t-8~~GJgDN_FccVZBE<.qli'FDROCOKE^%Ƈ8ֱPzg aAv(U.FOg vu> D>v^tln|\rX6pݽK;q~pM2O_uGF{]?H듘T݁cf <8fYmfiZ-D%3GjIR-1.q{l^rf}-\RfИQyr|>53KȄp=\aU,scݢbtHuDyu5R,,ERV^Sg3IpI4tRGznW—Ydzj@qY*uwT e@Mi^QmOyyxEAaH'{m JDρ\m$ 3)G? _!Y璕>23CncB="qđ \kl'g=XL7[?օZOЇ[|byb~¼qD]sG(LXC[| 7 k[)+}o߯|/ySB=Y !DFJUܹ_nSc5ƣ!ەCx,8rykxd&osQ]zwߕlޓޝٯxx t(zECz E'WΓan蕤'tKFhV3].zՔTӓ~AO幗Ƨ1p's⪌ՒNy4 ²>+dTy & D|SI*<ޮMsVe!nЇѾQ.I{Ry}W1üArW`p.M6N͠9s%:zP0dR-X\((__]s>[+TY?tJGmYOX3FDoy#>7cy=gT5kr;PNO'^/rcT #4sz/Mac_Rmu ,%q]r;cIa ǂK6ݲlq˚7m:6>{Xq ݻ^Nr4'9{KZDPtw~|_'>m5 6|ui)cvH6sjl,_~O˺  *'ƊOfyk>vz =TśZV!;:776Tӓ296zYfdZҢTŁZ#,JZs-gμg r8;\) ׅ&fps<Tӓ? ZhF()~?0@))FQ@({. 9s3I} »r.j%ӓ&=p̹ԓƏ?v+lg[XhTO|1$nrsIL|.  FzaGr<5@9\up:}q{v2Q8 7Zדkte앪*aKݭuݻ( PAMOru\1O=I['Na"IJ[bmP=i;t:'<9ƛ>++Kw1@)6&>|YI#T4֓.|յ@Ol"9@ESj=ik 9irnBOz͝7|Y&M8 P J'7= zRe8 P J'Mz&[״[ ' >8:m6MUUd :ԥ_n6ւ崴Y]]*{Ecq>0{wᛆ{yVS÷~+].m`s)ga ,[O+cgDOK| (Eדb\ewf\}JPZb=)|=F6/񢚙\2Zs?zvѹ W;X!;4O~b {Y紥mK&IMٸ|%?DNhSgۜ*.{O<ݻ39rqI;m79OpKI;l;u gi;)%}'jGPEla2֍k)zP$;^__pqJ>CGMNO;!kilػɩPH_[:ǟ!Y-iIf|T/,N(4g.ŢP?G<͈oڸ4Mq_1S>OWڳw˸I6CZ8Ù!' 9dsEΡܒN=G< j=ީTfϧ/>gY24)#h(I֥sI"N$KYOCOv=oF='=fYl|=vET`J:m&cb`O<sN.>OOܼS˝;$~q)6@G얨&.p<+֭ݍ@?{M Ԑ!Owt5~U&]qy/@gHYOʵu[ڶ88>br![rZۺ>=FC.OMu>x~$0_eGێړ™vw)ޘТӺ@rQ鄴>g©0hF$vxT挋r:8/uޥ@ZztcK$LYO䐺wwtL-)xyeٴ<;p<,v{tO?t fsx!?..NDLhg:|>C4~ =[f)I |1I&|>ZJ@)I^5إVS+ti&È>1 ]v8WIߌWd_Ulif U8Q+|:2HK$d2 ͋ƦF* ΢ԓ7WvH~֗DތI )r,[2T˔ 34Κ;}@& LC{_^%@(Г?BQʵB\h>Ubz xr8 P *VOR$=)~=e8g(?ߘOB(Г_D.Ļ:\iƏaKt.:ztTdHs}iq,!숓zRd{mEMni"fNϨ<<-i!IٮrR'Px_SO:YI|_4w4uWOT^/6/I!ƫZ0r픯R b &?kU.i(˩'=fǚ!5Od{g;ջKO|)["3 "̵?c"2ӡ9!I\2?\r"'"0oNQH; U2L'CA%\266ړn7eA:f۞u==݌u@W2b>]w,qxAܦ8P#)k'P: 1t)QI$Jv ms n1;kGگd/d=[D N J73e Py.i}S.FfFdK`ctL+є/B<D~zNO-̜\~ugC{:2g F߸Ж#Wgj1 4hTO"tq"s%8sl>~^5˶b 3EHZ Y62G%("&?loNZGn[2A{pAI<]]g>#[6IzSwkY%0\`I:n-aje%.^xxN)J tZ!!G/\Vb]]db/<=@Qa4ROWWmbN;Ѻ7j*R!l? &=B(~5،$g528%IN˥E!'Gpb#@M qdD@r^K|`:nd"~c#CzS}ST1P COKTa6r*&`z~~Gu;+]6|uiIlPFVGeJFDڞ͜98(\}ghfd/65l%iyʲOVҍKWW ܾ~(67V[{m.W|w>{-ew|F˺~zz= V@+@O' ГhI$Zz= V@+@O' ГhI$Zz= V@+@O' ГhI$Zz= V@+@O' ГhI$Zz= X46nih)wA6_.wA@^@O(v|q]i65گN8H&=k8mÐa܏?0qrQӾ(= ۸n!kWdb"9'c7ޯ_Oיּ3nMMf"g"c}M6?Zv2rit-!.-XD@OŝٵϘZ=CEj 5CC"ivk-Uc5u2JHWto= >kcݭ;|>_gp++s(9τsRx4<9,ԥG=zǕ@k@O@qm#=dtH<P,u>p^6ZRGb{_~zCn?9XO:f;"n&!eZ(Zunh7E$Xw*rqٙrrC?P?_xB.;)MÁƖ.a@@O,ᣜ]]U;@ u { Vf;m1~hTZ5Z[p :g%I y$jYIyn3=v[sIׯ = Jn㺜KB.t:{d2|*P2'Yls*]g_O?@.ցl[-p{!DvH`DaցN<|lsoOfd-OU5i{~?4gr!IJ6O@ ILD 0X xwC"(TL>#5hPPb@o|4 1Ed{eru;,-☦sCgt i$[:t-Ӯޮu(Ed|pjP9qDV9Aocm)tڪZǫ᫂KVo TlW;7L-edns#QS ٖ_fKK2 o-Qxؙ2L7`jQ)bfKɃO9֙ x'nguyx77 [g6?*iot"ɔ ᭫ χȊwۧ'rG~~dr,*2j,\Omr.lQ^ZDTxj.6Kpye+2#gN{`zGmu#OY/GoO"Г0"tF#ݒqBW+ÿwjg?eA뷿k{W0j}+kWǭ#30f,m,u/TuP6 ^ #\ࢂ))'MDW?S \wx,hս:1x};\26e_o}^QzRGSb I.Gi^6.E/|צJh|+^"acü6i4{3 ҍZ09;}y=D hexN-vt(`VjADyq d訛sg/{&=B~7ģ7k] !r$7-ГJ>C*ș"fwJW] O;QW̓GO,Ti*G=D(LM-1j$i] hEکԅGh).}Bv.˃G5ƅWcϩ߄@O*f,0Y(r|EeZH!ͳjx!.TLm|dyآ:6]<챹 tG bqg5e9pF XC-(33E}I;R "FxK +|LJ_v:.='lWCV;=XHX8t \G Tqi rYݗ4VjADO*ϱ.xW'-mv LzE~6q Ay{m0w; R*/T1E'fx 9ٹoѓ\"{D6Y )bjֻOQbM8Kklaĵ--y ՟v ǭ@hIEd=ƬF+TIUU-|wDt֬].ڐ#ekM\ʸaOYFQ/9 _HfnK!+Wa,Mn_0!1=6:y|yc "ey=,_vX|ǢZnzC!Rk03>Z}ͱ|gwk2ROGHj!+4<: YBf77Z,x'0cq&q z㳎g:v;E]`y'7/m?Zм/Lq'2e"wzSƑ2n/}r(ˆښZ&ᒅM q!~tL S^yNaoRCN޹73IѼ9S=?XCDdI^:2T<*O2,5HMykX46Y,|ɭJgP"so6Z8Gs-x=5Tj!ےGҒ+/s+rFI^I^N;$Bo͖[r ]kk 4Jݸ{қ̺MZx=4-mjRȤv3 9j?#aUW]S-P gfft_L#iju"Dch@zXB@O*h%`c`￱&E}>Cz5N0.H} cJ筟l[oŗ0|՟kg ѣV χ8-0;Lw ka:8}6xV\ 6_Z(}ɹdmgzgN͜ B 9tLk2ћ*)>S˩xzR!3ؠkϺ'?y2٩!:u2سbz`NCWýá<hIF#˹ҸR8*2(NXE$ (zc{ߗZMZ`,I#Y@QHyaͬ2{ 缠 i= D}qEKC2N#Г@ቼIAL_{wwϾ jX@OE/TE@f\.2CG:6vTUkw8oh=qD˷[0{=  nf ENFL_|r8#b= i*RԤqQwk]]G:(Г@ģso5]h`ؕtӵ͵h= Kd.f@Xs@遞+nZ' ГhI$Zz= V@+@O' ГhVO-(ГhI$ZՓR"= V@+@OV@+@O' ГhI$Zz= V@+@O' ГhI$Zz= V@+@O' ГhI$Zz= V@+@O' ГhI$Zz|}Źىp7~x;HQ5;?y䭷rޮ{GLo6uUddIѹ[HzG6oi]n; amjx&=ՓbX/fڣ%%e)M 5 "cc (/4D6XCu5uE) ThTO4wN9\) +tP0R#4sw|>TJF$R}<0u؎;5 4X8GѧOK_C2vd0pK,j'UTuY9zP]Sb}RA_x4ѸvGqѰ 5\Ms /6,ThTOSűzRKZm" MWoWSr'9>ҹ9}KB P*ʦ'cp4\[SqO=/IڢpqRzw3]emG?Y[[M)t:WW6dI2hpϤKvUrH m arBvPbJEyIϤ89Г4E^x4޳>xQos݌cO`Q=)EZ״&>Z'i5$f岈u:[1҃ l_0RIvTB2+ "#v|!"ޤ/|Q\3slyO.b.\e1wn}EcӁiE'ߟ@:b5jRS6.$|\C&<ggď>[]g{tҚ=:Ktvܲ}띫xHGYEO{W1rRt=I&e"&|ˤgRֱ K\l|Vax1B:7$..G5WnɄ6{R ^Sx!]gjӞʬW8)ńg;B%,iXzRnF06M$JqM&Aghx"uS|O;!g];*.̤ir~c'Mz'1,uf6,R'H\e"s)1G) ?|??<1\T(MIs[#Oz%۵͸ԗՓIOGSnc{E_GP~=ژ(d!U lrF٬d"̖|ף*SqXt@O*Ir9Lf;WM\ _g799I/z~Ch>rA5ģ񝶝B솙{]-es,v}cԪa;,"'j=i=A燍*S'HJX2P.yM_kR|ثcv Wɟ޿C\6Ƣb P '`5ǎYcQo)zpӃ-* -A:~H =tJtIѶ FIfS3ssg@=_Xb)ƨU(j;;e}x0׎tp^ $K<>i}`l('bTeRNRoPݭuL7y[xӏ?UDOG}x'JG0/-'_ypH_bPWÈoD)Di.\~YzYm#3.9ok?c_>Xtms-㙢sSo~~X6d0v0G/y~g#Hj5GzM;|$!X $Y–b%kڻq4`9^ ;; L6ű]aSZֆJdIN~[b| u?KMHG>F9>7IGGvWy.kZrF΄vf#l>YkHmDL ޽yQ^T"g QFAU g8e]KRoSe B$R9}> 6AꞪjreeIadl?Cn3< iI*y玝o+S럨teL)7ߞ*1^ ]cz[$}as<|s3Ϳ;.IRҭխP 4wz{X@)$ WP>!!^QYAU9u걺=n%^LwajFfI}lCȘk Pzwֻ8'OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO;1&T9f$HNj*W p8lKb KO)k@_m9{O U֪[m6Dp(nd-1A 1sOx6 +МΣ_ I[nw]D.{~|OOeLRd٨W1v!v1rQtN^n('_6ētD32wCr79xҀ$zvolihO3)gʋT}M 9=<жMξ`*3ʔܸјz0N*Onu5tJ֤`G'l>}?޿xnI,X8Xc5:vNR-m\S V+y0oyޑNKH~ܛOZ3  M"pTlylV# 67yz4=^eym@թx3q:2"e\.u"i2kL8{T T/ؼGR[D<1׹0v4]hƻ{u5/g\\. \uOkb)~v݅ H&$c]:z:vvʕ Yu8w߿[nlQkeH18o5Oܿt uSҼ~X}rt$11Owu|'ۍ|In7{G" jZl<8B$mxl2ĞyIkV̓$ZmdVdZ _f7Mȳrf9.2b{VJ9X!${znTN>15SЏr)y) VڦVGM7HK vܼ$M3j;#m *1{}ZO-3g-W#tkK} f,5Q>|Dq SB#$JuabLn`xHhWEax2 ZoU_y+ 5x6^ "=]p-6ӛOmK_\[YXNas4nUG'{O #_{re,;[7]GjiHEdpCJ}J#u];аrn9u =p8LmWt'4;k;[ZJ'"Ḣoߥ 1 :ht$? .wH+:4;dעADTЪCӑicd=@*tÊI101еOR!at%k+p US%5y͒RH_G&nC"I2?jW"ٹXYxh?j\wC!QnT4VdOs޾P o)11dt:_?3R9x3+`S5Cw>UhGeC؃nWD\ʺw#NEzZ;Բ%Cӗi>N*/qb*-ṚVPwO}zW8rk|La/~?&ߌqXPL/^W$n9>P !G2a+;RVկ+O*8~02 TV_KfcEf|J[S[k\$Cw_adS1LTAÛL{ߛl‘sHW]yB#c#%WTf,dݽW$ʔF\Z\O*,ts7w݆7{6FdA>hPGҐvZжTD[R ._۩rE=R r6#a ش~uTI]7 T@bVMpWlĀeOL8>% 6~@QxoTD8Ǐʙe<)dp2%=W^;8?f"56F\Oΰ|@W'%aIl|L%2Rݙh}ߩiԽvSI'"O`P?aBM"W#HezQ)R3N,%M#*, BSJ,uOU9h?*Lg+2]c)}WXxɦ_eLN̻YFЪrRo9uXxyEݺ*_t%B,΂xIX$Zù:R*gP߰aƃ\}$H Y.R$24)2W4> hXE UxR?QԲjJUK7oV*A_2bip5ڕsSI'cz9ع,RִUH ]D/ͳp_'PၱKy\r5gɘ T{[wIZܘL-+*cS /-]b7MwDJV*@ݺXe*9LHUCanWwJG4Bz' ) C>)mva Rfrv2U7%73G:tdGh(O&SYl|Nl-G 2~L .bi?,Z~/r څvRKN'"Ӓvx>\\>5[[ zE78g18n)%"R7F<ڹYFF-m#XZDoj[*r厞ΞNH"tl\j09%ELum*9mٕҲR^xĮNIrn_;$z]YכU E%ey.T4~spwmɑFk*@_H}L%E@bQqEBB̞z.qre}xR!~m_($mm[[ ? Lrv.$X7Wì;?f#NӅge65ە ^in "2! J )$Q%t~'ۖBo9Fjj^[&dm~©36T!J^C߹s !d]ßϨg :$f)DQA\QrCj9]uR-g}VRKd_eUݙO׶w1+:xMǵO.@N ؅XDW̲}ؙ}$,F$(XN2epjP0u%\NuvIΞ7}scslYmVu55ivkV6fS*+k>xO:g\\ Gi˚hb:l_?9h='ør¨rH: 穟Jt2 Z[,<źZ.|=#y8] nLR%RmNO?τMyL;eɰѠ0^cֆx֐Ld53~w"yS /|phȭZVPRӖ+D0[g ʚT{K)PjHQ5\o9.O8y=&P?V|lTF HQ ߰_:RZs:2ͺnG;j˽A< ~_GO``Gr'l\b9kē+?|H)o{}ѷ>z@< y63Îc6q68&N'tJ 'nP *T*,S,Wb$ T7'VabLC[lD 1* $&+[)ZblÔē.kR0/J==}T$P0R<)ߨ=n*U6 @< ǯOAB/KrR|xVu<œĺ I@e|"?ﯶ% k*dxQrBr$/D2e- ѝ l ?y'j,k'|!>*V]MH'|!xxxxxxxxxx'.cH2I<x#5x$nWBP( BPhaPU ?WBP( BPhaVA*P\  BP( BUCmTA*P\  BP( BUX@@s5P( BP( ViP@@s5P( BP( V`e@P( BP(ZX=@e@P( BP(ZXU >WBP( BPhaPU ?WBP( BPhaVA*P\  BP( BUCmTA*P\  BP( BUX@@s5P( BP( ViP@@s5P( BP( V`e@P( BP(ZX=@e@P( BP(ZXU >WBP( BPhaPU ?WBP( BPhaVA*P\  BP( BUCmTA*P\  BP( BUX@@s5P( BP( ViP@@s5P( BP( V`e@P( BP(ZX=@e@P( BP(ZXU >WBP( BPhaPU ?WBP( BPhaVA*P\  BP( BUCmTA*P\  BP( BUX@@s5P( BP( ViP@@s5P( BP( V`e@P( BP(ZX=@e@P( BP(ZXU >WBP( BPhaPU ?WBP( BPhaVA*P\  BP( BUCmTA*P\  BP( BUX@@s5P( BP( ViP@@s5P( BP( V`e@P( BP(ZX=@e@P( BP(ZXU >WBP( BPhaPU ?WBP( BPhaVA*P\  BP( BUCmTA*P\  BP( BUX@@s5P( BP( ViP@@s5P( BP( V`e@P( BP(ZX=@eըZ'\ 1q%yz.^S`I3`\zeh(a!B"fP7h,ZI'kb0 -Q߀@*P\5.C'b1'̏{ [:VQU^EM3P猌4ې!M6\$l6[/P0K:NN9{f 8 |i`RGahev=$"c} ߻bak,3SIni-!Fvx;KޕW.}?< -Xq @`8 ?Wc% 7'Ѡx4+оϾg++2i(w.vNz(JmHzd##={&ݰ?XΛ=>M/jf 00.%ܙsHK'>0P,&˕e!B5fԞ{J'LTDE6^Lz{Aæ&jmmmG:(޶lQz~! Ҕ139G?<`0~9;k[$y{f^xvة@]nHsi8J9y?IlIZ"bfj6u߶[vmޥ M\',LNMl C:k,G8NW;؝<[fdf62醀m s8W 0HP1Å0=;-ٝRϜ?Yg$@ee膍1 d1ԙE鶶6ř E=ͩcoo҇!E\=ν9)d-G[ b~Xh&q<PcpÁT :\Jg|}-ZUkv,e'K gV{P+]8X&br疜^NP_/ܙs5[cҔ:ڮʖ+U6׊ 41,hfp`1@*P\Y.P $@5+k Z~d2Dl$6="btH\ "祿{IWѥ,%{'TCM Ƕb16Тy @@s5&uDp8,?\Pz/Ҥq&g]`c!B)f8銟罜7Ww6<>D,9s@`kew$,%{*UF]uu9=Тy F@@s5t` (-[TW8TzNC5qg`c!B)f~xCɖ3i~yAn 6(vߴ&oI]t.:S"Sx14 `E5 @= R2jp9;%5_|=4}O&Hl6Y L1S n\#UcHOy-m /x) [ΡP#w!EQYZ9\38\h (C}ƔgW]j7v9`Dj6="bbʯ@Oc@(_/}$6'uM󺩵I B~{y>WQw 5.bXhp< PcpÁT 9\gyUY^Y7*+/k{Z-8Xj_6k u+?(,٧=zS Q]EmM s8fe՘2yvRqۓۊ^ 5 NV !9=9λVU}~n ndO>#.JvK7;龝*hx~Kv={j_rdrjE.LF?:V{V;l۝AIpW~mavQkKƹB4M;׺UMp9ek pb&#r 6Q8|kykQ+0% $Or}?kVCC~zB6!ݰ|bxHu?NvgAٱi~Ӏ?E.w0Գt2==:$/|tq{?$g]/CmN 41}|6pWZGm&Z+-GHȩة,%%PBk89M~G*r "ף:>D~ R+x<*D|~y\yť \ծ9>yP,& 9A_і%B?" @@s5&s/yv^n/SɆ*h0TBZUY}d|'^o W'OP(D9%m&I}~>QsL>`kL[0&3w}6wEL4ڷ~k+&7;3v(t-Mq!3SX]un9<4Rԉ nn"sS~ / Z5]3=y{I46/پ]O\+dp?+φ|"9Ή_LLӚzꌊ CAa-SE|䙈$zmH T s9\o%l[p,[+0z<=&fwhOyElںI?>Iž# ?Tr6asɉf"튾]w> Ƿu4rfO1<>,I"[ud b^Ysi)&p<0dSHrsg/>=\+UX~[p<-.@  oFEmMLxdD^v@LR1CztNB*0swq81?[ .N=rKeG#=&{㽬}KSp;7vn!y9om ؓؗF68fe՘r JQQHXV`sUV{O-.>21"ϩbfWqFG< N9k@ >§=F5 G?=S~6L珃?֙ \`P9F/dQ>4JyU lC EG"9bJRr^I 2{sBXo>*FFơy}V` aE[5S0tGޑ^FvO2A?ЈoK$\OyC]l5--qgׁ.ܙO=/*FqaK wsx˺';5._D4爫Dc=adbD##ޗ58X戙S.tr|r2K#~9+ $ƒZ%mQL*sʶhD :+ m:߷vz<{^Ҿv4<:#Ur&]ծ` q sW[rAlH1q HP1E91S]b^Ws<>6^S[#Ro_-=)")խO? /( ' Ug]upYR鿽{i"6uW|~b&!$tWZd1vl#ƹB4G̔iʉhxF>٭g~͟r[U9CO?-^V`)aE[5S󼒓h,[}M?\;3F !Eǵ%*;;F\ ՎmdوT 8fe՘³ʽ!5kf5JcA7 &L8kvϞw+<3%ܮ}Ĉp[נm{vҡC8v߱>*Vnbc!B8fnںi*=۵[{ўM'O<{N>ϛt*\.4rƝ<'~tmc[V:VF7%,hkfJs2|zXwf}yNW_QK'b Z4qC5W-T :njT ;\7o}cZ ʖent mI8a%TyJ/' jĈohFFI?a:nq~bWjEm 1sLyGbxVFFM&1 ?XBXhu͔<|گH$ɻmtmK& ]oYY.$vI@e՘N*VSqZee\y߯0;3&ƅUw'jsy":1]_poCnhWT..DH'J52KKpq!M3!>k=$$hl  .}7r{T ?XBXhu͔<nźsܡB?ue$WޣN xϻ[IߵS| 8fe՘v_;cL6T(L+D}$k{K1mN6x3ۑk)n: e|eyv5{E\Ӳ"?S- {m-J6=" bHc86|9ƒvLN9Ƕζ!#g!C//TkK -ښ9_xB97pFV} $:96;voޭ)1}A}#x~Vz3D|@ R2j,p1(%82>y4WWc5(q{?ii 泮c4w95ym#O)XT_6mo`oF_?*W)IN^porE㢻zגvFiIM[7={CZ_9?o`r6;|].t˝<[6P+Т-)y^}j\gJgHRGHQ\_B=# @@s5rkQ>)c,$){!(+/S%rDLN 2 kO~q é+uCLJOf9f;%+Y\Լoآ~R$l{,DHs\!-@mvI {bALmΌMW QX͓F^)JQ ,!,hfJrp+xDѵG/KPCR"Hdѿ$@I T 9\nt9nnhJ %+g0?o@-I/_HΊSS5<>ѵQ<-ZwU vO_t` Y)\(Y3 13?ީ?Lwb@ksu [--\ySߩ/xGRBkZr_+~9^YE2uI1C7 (C\ʕ }8a  , K.?Ϲ$JFFub.kpNc5C5O{ TX&־@Nb -ac!B#fMeyxMmb60ו|%Uzo׉̸)aE[5S| x=ӭ\~3B|@ R2jLpqSN$Ld6&%H}j++$[jeܢZx6gweTle5 5{5>ID7̰o 1s)-+S<͡Vf4u$qOy>#.$XBXhuͰ]+pT[scp1 wH|@8fe՘\W#LlKAitk[Z6zuéO6}[{'=Ͳ/z=yZɅ]X8X戙܍r--kEKEʖ={ʦ;|WW*0ťBL/{ hI zy(x9X`38jZE]3 kav q HP1å)JS={tѺXgi%:djzs-:;{ln Ê7Wc> p8,>7`T`Qk/[-],Vs:l 襨:~`+[=Y!o4p9pKzp4uxlY ްޛI>5{` 9w "ibkVrs2' /:kFyCԑ D .x :01" ?Wc: io<8t|i)E-٥@CRZqU;rW9 _T:9z==%I 2T l.&chvvD+·k.=9~ 41wqs?s;,T(2|~_)گZTS i-jZE]3 7/US/br%io_[yTkw^\< 8fe՘Mk*~(t]W؊ .q-{Ar/_}}di_h塼ϩX۫=͟cSE^Fp76p*?_:1WNG$oF]/(8CH}!M37̟c/zqI7/MYFv1NC~[gāŦ?= V`)aE[5Z@P%K?I19:T?TA*P\.<͛\CB]_AˌD"EZHt 77wMyc 4ObD<7CS@za慬ය'q/YyW. m$^B=/̏`!B&f:;uyR DQ~` OBǭcb#3nJXht͔<׽O<T^N\O믞<21ҺRݹUv}yO$ԥ^`q1#7 (C}|{z]$phڕ K{ȃȧrEJ4od <5|Jx}[qo&5K&gMj1oM9C|m>T`eyoO}QCzrvSSOfP@Ϟp(Fi)^PiY_yU풴=u@nF\p; Т)yC@51J~Wc-+#J|c7=hCMCv55^}D"z~LN~ПPcoA*P\.dGz]|~DLǦ&ڕw.ť0}ԙ{J'O>/=-.=y $ˉ]mum:?7a};3&ݤv8s۟{>k*PqB鴶} &mPd<0<>]HJOqQdb=YF;ӣӒ-m_RXbOkl2ֽHHNlٹwgWng΂XٛM14/9}h$aE5S\{Tk "$[ֲE8q|fG yо_2$IHtzdbf~0 nj߀A*P\.bnb6nӑU=ȧ/2bѷNz.]ITFF >&L]?{"]ծ9%Y*s;ix;%^c!3žQ>>-D2~Yynr>bnJ+( B;ܹDc`jV9 Z]3%;p \Wpnn{v쑼dzho`ӻ%M^*O:O܏Oh]>oG+ etIt4؏oH@*P\.nw<H ]JDkKF#}~H/ٟeD7%"Nrss:P\d[ ~_IOXzPeBax|Uǻ$WUguG'6gبcA`mc泖;w*~2{T 7'dҤLTq\GG5NбEEI̎MdXl'#>@f4G]B4St^^'9{=ɚd}_{Wejlz9!=j3Ƥv"XdmALsrMlzy*y?9ߚ_{plc[ߖȟWĿ'\ s"6<9Q};>69 HP1Esҋ-N|Ƿ{H9%gg'L<'NtnkKK$Z-!I?/=q## zj-Swo/K/zOߒ=++k+ACzϝ~NXMOߵ]$[~W*-b15vaWqutC;حvVLO+Uvhv}7`0(3/_o:$1;DΙ̡"A2CS,DH3̻zd 9+<|pæń`j6?>-^vlL%S{{Yh$oɂ#xKy%sG躼Ē@._#s WXhVs<Cٟ4{brk{[ b!.5_yI5q,wD>ȯ ݛ]$KA=1T 3:\웶nJOGŐޡ̭k 6\R\:wZ(\5^/Wk9~9NFOS/Kg9Ȝ+ |+ k569v Lr _;rWhcTlvWBn?IȘd.xvڒ6 Z~._;g.44h~8xXχ@ؓw/=r{WB7$`^<ȺXWcJ ܰ!3(,hfFzC|ˇ|f+_a{?'Ϛ@ aاxضζ;tTVä?W h!3(,hfF~C|vmiݲ+Wk h!ҜB!ޮ^ζjg)@\<0,DHL -QbN!w ?T_X;WT3U-"HZFoW/5dnAs5p 1Bk`17?ϲbFطݷuZgnA-+P E`1j R`8XZ4\3@=!Q+ƻkײj @*Bdu!v ;*j+˝9*s5p 1Bk`17|)X-T1O&-xb{ӖZ\ .BDxТq .sEܸi#UKR"oWҴ`^nAs5p 1Bk`17d+b`{g;6`T(+P [7;l/>W p!3(,hfFzC|L.s_DoVUKR@5nAWlY0,DHL -Qo\Vc/\ÈiA-DQ]ji5{jiAs5p  1Bk`17V`dV%-T(+PϼM~Ǯj\ .BDxТq *+b`3P꛿ZE T\&c[Wݱzk} .a!B"fPJ~v ПFТq . ؙٰ̉=_W*kY[$ R¸@5g3(*,hfFzC|!jg&?"Q `8n\y7ɹ[pYnL -Qp^Km C]_X[@`B6H~Ǿ}붬sqrp܈Z4\3S݂;#e9 &g!?-lBŃ @1aE0-{ȷnǺ{j+vήH !w GwY-Hh@ .L -@ l}}^Wv ",[o>]ⒷO -D3gYAТ q 2>[ZOss_?5 6Na܅r0]<Z4\@?!sP8Q_{Os^HZ}mY# XPFТq .ymv<.G| 7xs:Rˆ\y7ܹʵ-? Mo>er#f2C:OENw.w>"PXhp8F<۱?5 Fq;莛=7 [p|@8\ԱJlM#3DKCC/[D4>mih[0cm .|Xq @VPH@*B 3ÅtCo%Ĺg ,|. 3b!ڇCLr؅]Pl2&5ç9YnSLÑ&mLfb䙈00\taV kv}oWW*jY[rO RMW?;Utq8;̌tqx[}qcYzٌm&sR8ǩK}W~sGdy (iD!TBu+<`!B fp,s7h (.,hsf2 ߺu:?kV~y4E.|?!]b7@=Hj6|o꯬^Ueڇ R'-u߮3ÅtyWcbffybeEm5gyK?؂P/²NǂI? s"bp.wkJ@@Q`E5CV 9[6le6r fkDB=, ZpT(+Pp9˝rq՘RqRN'솃sCAǓyRB!,԰"9 |1pTܘsZ)]3u CYe~w sw0<{oFqT(+wծm=ls5s,!v]ծdp/ZStU9*DŽB!|!3Yl5X",h fpͪZQ5C{4&d*JT|s7}HZ_+bҟeiٍ wo:Ӓ5d1<6(o?Cn󛖴F`c!BZ%f jDXhq,jŪ@ pRz/ədCMCQ}ՠXoVaqwlDO-DK3T\.ZFGmH:F_{]ؘNG#&υ!_oڲ3dƅ8|}.Ǎw^gP^NMGvk#T<OBv={jVTON3*{+=*jC=߬:TLAƼByΝ9idzӽ?=j)9|A;t|Żtt:4(f^+.;ܩO9MOF&BXڃ?JfG{k֢{&ݯί1'9Ϧ]>3|JoTԉЉ~ j$@p@!7w5P+13ť0ٸoAb`9[֟*R4ˠAwGsc^-!2*< SQ/ x_ϙiB /}o{aE[5{V\LWHxq}=E= /OIrif"1Or\C]UvN7OTnX;<>~t8K8QH,`O!9A_| 8x|ѣ68ljdCOHP1åP/1$?9:6g$f͵q 鲴oHDPåd5 ؐ~3tl@F TtWՅY e>|B!}h`~y Qmsy"b߂",F[g[_9I>: 3h$m6iIbKMm Tjs,_XN /z:i$uyȮ )I`0ߚ&~1Ihlwj>rWpe̘8'/ǃܜ_ZiS6.E⭿K;׼Yq2mvpaZu\3yxϯ)mk$/=۱NM6%ix[RRw [Hooow5䓩wS9W󣱣NqeBCA>V%{#D$wl8,ǘoT :\1F~E4\D<NxrK:+eH߱>]nTv_#]GLedY ;[~n,|J^>A6H^ͶLJIWUhQ((Hp 9} mV[w~|5|zX*{[=K,eK"bfK cbUr 9[ݶm~@ь]ݺ[+y/G#G6nH[y LH\k$I‚Ǔ(t.\J>[٢?M ?:6u3봊:7m$yN$n|?|$dv]5YALAx䜹۹$?䷋lK^i"ܳcOb_BlTԆ~c5R2jpQ%F*_婊?SGt8҄Tzρ48yNn]ٔ*1 88Ql'bҙϔ&u^Y.S~WJP$ %]yߨfVBpB0d? L1`ҾO5/FbaM/4uMycC~6]cТ-ema=,RH'I\REz_9'%~|G~ ~;H}o=&N哋cO>gH_vmiqU$G'zn_& u*H#mXl46,l3: vҫQL>"IH$@7O_vX0*jC=P@@s5ft,5=;SU^U坯ꬲ-dO?pYqBq!7qҏ:4CM]+m+},3/t\,ovg+O$ݍ? |$?ԥ*:\oNgHr69vfl!ٓ. *dM8xORiI٢=z$o63YgKfw{ 7^|bUAxZKy@ŕ@4|A 0XRfR/9wVoC=ξ7>6ב\h+j,,h fru#˩Av-㍏W\M"Gv/ A ź{+$ :ɕ:s^W0PFΡCjZsفROH$<`&IjWcJ koɷ,!y\hh,-BͩeeXQ`a>6W[7%}?k5>a'^W)DMRcoU5䲸!gȹL5tsF>Pov1>\BK=RYyٶ'Ix3ݱ!M3'/O.#[Fµh$M\b4x^eE<yo滈՚*O`|W]d \/fQ8v+lB>Sڨq,Bkfak_8 S8ku:iy5"|pFP+2vvLϖY]|"W0pAv`Ӄ^o[yDN=*ƿˣbt2:c1nTԆzc6R2jLpFWXb̝)#_sJ19>Ukxo9u]{yYSEKfho9 ɥE7퓒~ 19A9fc!B&f~O i{IHkצqnfSf᮰ʦ垭&=ѝ2fDgyF&F"("ow;Z[h2ay >bBkF/'JSK m?/t]&tkIA@ :˱L_ed|D{%ձ^_-ْ kI]º4|}d;1" 5 >Wc> ;gٟYy;HSrJ1ޞFv;={z`ޜr%Ne~ ..K,w,DHL7 :ة%ii'g"ggo>*5D_V6f9ɳ$kߛ?|"ڮ 0{;kyp1 OI /5d%en.?UmV~mzv_ U t}>e B9\ǬQQq: e՘"^%'L8xN;W9L H>z(tH\rsps+&fѓх5s'r2":/G^XX扙SOPu:{kz(%.qy:Yʖ,ΘhmN7kyҩ4?sr\u5={]-l3nWgKBRBkF:$H\8yA%ɩEp8,)"`/>%?s^ L\N,w 仓!#6 5 >WcBU^x:.^.׷-xI%zvzsA9{pJum>lRLѧD^X^:d^h! Q{DŽ?~|VU;E3 -:=pr5q.w:W"^XNb(s;ẗ́nGNy@.W_qjNN [ctVt2 5 ?Wc>6tIso޼RU_EH.DU4Տ:2礹ncҧ5y;w-ڗ6Q]gd۳[5USWԬ H H'Yۈ!IrF]qeHLb"3( jnAbk!d7AjpMR[ߖq͆cuW4}ot?O}g՟dwu*DȢUUqUO}y!BFyrxc7T aj%Y"֯q?KiY&nk|g .$Z[}rF<R@*) l*_TxGٌWIxZk:=7Z#ץob ,Y[WmO=ouYH5b.#!cƌnO]m`:Ƌj&˃RŢ4FOZ!J{D>)R@*) TNwYZ>9}&]+ >*8_K6KcH 4.;x7b=͓_7c{#O qƘy~#!G0Kj&p<1#pS"]θ k"To ˆkKJrʸfs"KIxSxes[fܨ8/-8oWݨIV+8fK-fWO[{oFH69͌|{ۛ}#8P[ Lwuue?:.y5QaDPLSZFƁ8(0N瞞6e<X+0o` 8n|H@F~H+\ [kry<_>4gn-5(ɵR7z/V 13Jm]ogOXc]`[MgpB26GcS]yܕo5hl=/0*ql#s nwk'jRu~k1k/u:qLR \MWX[؍,MBrC?Jި\+0+ C 62k3juݽlLiHbm`b4{7m9{׺žC8]9bQ.cXf/tbZ+0<ѵcaVfprZP2c}?z8l|H@F~+\))?2w#ם)[+PGFϽsqI^יkȱCNY 1ھx#k̰g>v\ĸkheS C$n7З{_ t9=Ci(zT%T5cAq b) _lZO}*Ch}wNV+NqLR \MVV5sO"tFn]׺S.5Z^$ ,t<yc W+( ,٘o>T`^{bx\yKW֌f{;fsc,ah5#mwWwo_#uTz=-vt0x!Fl60_F0i44c-'.3͹6Tp;mC=wgkc g׮Y <9055eOFtT[^8p=űVBUiSZ$}m};!ߔzḦxS6T #?WSt.Po@֭q'Wy;uT?\=ZJwn4|%ܷk$%ycI Z=ОC]< w*D≙~kf|-C `,,Ob[OL ~ۦxq{zAZwVc pķi[#g6}lˆ.k G<f'g|$G&|s!zdc7T aj%=hPeo_owZG8~Pϲؾt|ૉی*uJV}!~kXBQXC]R ,yϛW ǚӧfʾx?Z$EՉ{_7)+ױ箜1ugE #f>(4}6 UoPU]ʻ?pjT-,/9g6}fjjl̕}c]]9c7 aj$ &~[:^=y;u]`mi_z!P_2O򸊈Eb[U 8Zh{iϚGj27ȅ F."d̫}~!+Y}<;HE3k$eGY"Ei}5.hRщxwW/bM%FtT,~扟Ɓ$/i?~xC|3"Čx&555/O>'uWC+{f㘪 A"p=oF⃯y-˲edw^e^%;[ߺH{m]kq:\xw~y +߉+T2s~|nS6z%)lųf]!u>'.i~}I#5عw_P5.P!BO̼ }ROƵgޚYy7&wJc7lBm|ؕP]-UU0&5m:9j=IFtU͘ǬYǻrXU6 IϾ,މ<(ϟk]g)fͻE L/gUk%]5N9JXбge>y`򅊼}~M-[Q3!1pe&,OFkHc [H0s5ETbυCO1˵ӗW2ho͓ď4osgm޶bw%Zd\J.^նW b5b*=?zԈYɼBf.M4[f]f' F0v٠ c'<'o~fO'sxpϧXbzUAbpCK"k#WsOd˫{/O[v3C.ɓyAUSSO*n`hLX^g[FOu! f^p4"*=z#Ꮨ5n#K83t}铅h6{8ڙD];jG5Ұp3,Rﮏl5g_&v]G9hOB6 K,JG4PaDGLZ`̩Q]#bϾٌ ˅1e^~G7RYQi^E>ҺP2*D"Q\wEU}_bb{ߵtǷBM'fO6hEhÌ k>b43،]Ms72*U̿ޮS'N>XO{YdÒKWKFtqT(fcrx+p}O{쫏-Gvk^z҅0ΝSw= ԽO>.}=ݍI4g{^O9}  ,Mwww$UGlTL|*tT #>WS.Ey%iD'3t7ymy)Ԇ`|GMC~ͼZH#R!&fe\7\uW飯1LFѮc浱y<_c9*hflG8+nYaqjЌ65,>sYyY4:{b_VM/1h@F~*\Q!B3CM |#n aj"$19TT.1h@F~  "$19TT.1@F| "$19TT.1h@F~  "$19TT.1@F| "$19TT.1h@F~  "$19TT.1@F| "$19TT.1h@F~  "$19TT.1@F| "$19TT.1h@F~  "$19TT.1@F| "$19TT.1h@F~  "$19TT.1@F| "$19TT.1h@F~  "$19TT.1@F| "$19TT.1h@F~  "$19TT.1@F| "$19TT.1h@F~  "$19TT.1@F| "$19TT.1h@F~  "$19TT.1@F| "$19TT.1h@F~  "$19TT.1@F| "$19TT.1h@F~  "$19TT.1@F| "$19TT.1h@F~  "$19TT.1@F| "$19TT.1h@F~  "$19TT.1@F| "$19TT.1h@F~  "$19TT.1@F| "$19TT.1h@F~  "$19TT.1@F| "$19TT.1h@F~  "$19TT.1@F| "$19TT.1h@F~  "$19TT.1@F| "$19TT.1h@F~  "$19TT.1@F| "$19TT.1h@F~  "$19TT.1@F| "$19TT.1h@F~  "$19TT.1@F| "$19TT.1h@F~  "$19TT.1@F| "$19TT.1h@F~  "$19TT.1@F| "$19TT.1h@F~  "$19TT.1@F| "$19TT.1h@F~  "$19TT.1@F| "$19TT.1h@F~  "$19TT.1@F|bKYYG  *hBx*T #?WC  *hf@ tT #>Wc@TLPaDS5 LjoA*\@7TLPaDS5 LjoA4}wvgu 7f.ꞇ{\:[qX]0J|渰n}[Co .KDZTjH0s5mz>*;8<|hx兕t섉싯\<}t6*7F?yu=ۃ0qcez}pjBم]#qкThatݐ;Xsچ~Q P`H0s5mz>j7}|=TT)6l鱣cq#`번|0B*v1Vx0q0O>Y&6l_çO5ۆr0T #?Wݦcϝ%}!C*h0 :R왳q@UH0s5nz> z?t0Go\.bMXAOd:`ײe [r0T #?Wݦc1j<۶ix &c#sb8zq=Uh'v@UH0s5nz>ƪy쥱'O~pۦm*e0ƪ9`xUh'6@R \ vj~f<=sďNo'aU /f<t/X.N4 aj0|rHo_ʻҢ%ZBk-&caϟ~Hz*cl` @F~cMX)8${wvu[m1qc<𝁌C?zϣ*c *Am7=cw2*ǎ5x1qcu|/OWc}e.E2L81VǣQqqb(<A6=cu?`$0LÆ6MX_݅] rYB1B*v1VijYwEyOXB*?ٟQ)p4ܻ\|LX>aqXzhC*&c,n~q8PH0s5mz>{hld,ә7άqQ]MXǿ왳{GUxeU!ˆ`l{Xy@_`cQ).p&c,s~.09!`lXlsl M*WW^p}8#sCyTT #>Wc,sGϝ>y:chptu*zT>AN 9;QA6=cYtƂο%g;].ws0qc)_( ;lýz[z[k[ aj0||{R&ǧvp&c,dȮ l;B*v1r6F}GUx_8[1С!lc^H0s5mz>"~/x;_OQLXl<~XW @F|cMXijYRgי%WؿR?18<,$c-mp R \ v{^ {ַyqYLXC߰(/ aj0| zw9uWZCv[6qB:8Mh~X? @F|cMǸ?CJo [Tvb\=s:;A*n1.9ŻE *7>N-;[z5h+_ Xw]}N5r@ aj0| ٓ+-Z+.[L *c}qá:#0cm *Am7=N0_qu*wVMډ~j)o*w3:A6=.(+u_/( 4 Xk;?62p܍ܱNPR \ ƶq<3>*)^4LXJi[*Uh'sܸ)_ネF i,2@@*n1vAN~mz]Up*[Avb:pM铧CՕ*|3 aj0|><3G!>VGډw:ئܱ#!`l;/?{Gt>b Nj+N5~-mvlROPR \ ƶ>SN2ߴ^O'/Qvb_xlFfg֗i`ң %A6=cuД߳ml4p*[Avb6nܱPR \ ƶs;5 OOULp|*cNX+ |UR38G @JH0s5mz>@%tp) NTh'Չǧv&4 aj0|ܻs~*}={ oPvbgOv:ZdG~T38@JH0s5mz>ycY'lډv>#kCR8TT #>Wc}|N['lS;dӡ5+Ǝ;V %A6=cl,2̟ 7f>y9jOǙ8^~}?8yCN0.6 @F|cMX53*K|+e+CQ{>@!`lfFeocl vb, @F|cMX53*K|+e+CQ{>@!`lfFeocl vb, @F|cMX53*K|+e+CQ{>@!`u9n&O,g'v q;:M!ZZ!8yo<( cl vb, @F|~THvuv-{o (S8/H M'fL|C*8#Q2OMmx8W[AvnXZ |;1T #>WqzWPշOp\r]q2Th'Nj׍1cm:Zl)\N?87[hXR \ ƙ|Nc0aJTh'N4}E6sU0֐o'= aj0U{*|k+MvT^ҸHj>5Ł&NEz>@!`lmb{ٳ|lډSyM˻;{w:q]yC%qm vb, @F|c+6{w|ay)i+cMv4^U۔wC0ǚx;1T #?W5|eU Th'Nee"k5/ڰ1֐o'= aj0hST`˃-eeB;qz{ۼO6?eֶ8ۉH(<AWB[Avn|s \| cm vb, @F|c6._~Ž+^Oc 7ډӻr;{hhjX5*w'NEz>@!`le-cJTh'x770֐o'= aj05Zs=s0=+1VF XWq8ۉH(<Aq?Cc~{/a+NWL@uR]c!N%z>@!ˆ`"`~J/a+Nvb+^^tw "A'NEz>@!`]7Zl>4hXߠŸ8lډq\aciR/`kȷcPxH0s5g{O645ntS̭_nu:s[ q'NEz>@!`?`JTh'Fa3gkȷcPxH0s5ow~E=m4ǣ"rcy;C>ⰫeG[wXR \ xz R-,i{ĸ3[KH%cl vb, @F|%&Ġ羨{ĸND(v#EcCO|C*8'{Jg%ƶQ2Rշ r5\c,2#ckȷcPxH0s5O781"+[vs<*J8 -'NEz>@!`,_[wD龓qxT^ɫ> =@!`l77mBon=+1vJR&Fx1.f[CK|C*WTTh=YxT vպr[a#Uh?ElQ|C*&?c9o[qћQ)2R֜C*нҭB1.f[CK|C*.WWgٳ˜QaCCq*[qqxo'"= aj0oޯ/۟hg`\s<*eQ3[1v֐o'= aj0ѽfQۖ]*p}K1vǣx;1T #?W}nYqtܰ*{;+#|;nkȷcPxH0s5G.Z1ǣqYEYwgw.Kk5*ڌqx$ŞPxH0s5jowG+Z9W}bo|E mƸm vb, @F|c{X062oƞJngΦƽm^w c pib(<AW1nc\0s<*5o궭-[㛛6c\ [CK|C*vG W=+1.9noJf<ŞPxH0s5HeWgW߮Tݞ=+1.9]7M^?mNK\4 aj0v555iRx 1.)s<*A&b\:-|C*/䲕W>y:ϛĸxTGR}-o8qu.M @F|c[ٳ›Q k5xq i pib(<Ag'io|qYb\:xTMVnq j pi@UH0s5;- &8=Qiz]Kj.(Ǹ-|C*1oTG6 4ǣu[R>JU.iU!ˆ`Wܻ"ûW[q Qɺ~}}|U}hƥc pib(<A{ƞ=;ZvD{;{Vb,eGl3?w@{W,{oqB\PR \ Ǝz Q),1YVa\R0( A::o?7{{ÆXJCW7n2cx{0.Es]KB*i{Sݝݯ_V=9/nF]f4V=.<T #?WntQ__B`\rTT #>W7T0@6mn_]@)ÐΊ_9RzAajRTF+GA/H0s5i,@:Tr*T #?WCU pHU @F|bU`$`Ur*T #?WCU pHU @F|4E+GA/H0s5T WT^ aj   P'*\9RzA**@STr*T #?WCU pHU @F|@MQʑ@ R \ Uz•#UA4E+GA/H0s5T WT^ aj   P'*\9RzA**@STr*T #?WCU pHU @F|@MQʑ@ R \ Uz•#UA4E+GA/H0s5T WT^ aj   P'*\9RzA**@STr*T #?WCU pHU @F|@MQʑ@ R \ Uz•#UA4E+GA/H0s5T WT^ aj   P'*\9RzA**@STr*T #?WCU pHU @F|@MQʑ@ R \ Uz•#UA4E+GA/H0s5T WT^ aj   P2c̾0-7ʥ2BC>J7@?Tr*T #>WCU ^ܽxn]uFN2ڧsWN\:1s|7 NGf~;Sust@_9Rff||E_6 @STr*T #?WCU }ntv&jȈIYyp:M~xPP9+3^<ӣZPYԳG{!]>sO}ӗ/]ipHU @F|@)+/vD[ZG=1auN#2YY|r[ qd?ZbU6NC5i~!21BOLykۓھc\7} ?~'|IL-sAߓ}&)_2<*\9RzA**1nٽ3X$ݓʯq^!#}}9`KSKrgkf;MzVO[MYbo7>lIo\oz﮽cScwu '.]ack*+=;? =JC+GA/H0s5T8ʺ5Nsp\5jF~fgbEŔ XTZtT5U .WLlݐ \zl9:oU]UZXzE<i,,j֨pHU @F~@'XT߸~jj溛g6OTYEqQmK\*PҳdY\x.sohT\*\9RzA**@e<ˣw7> Nlij\p|JHӵ-GtPz$i~•#UA[m9P}ܖSߓ1WkOk6X$tE8 WT^ aj PGZ N=DsE7+$m/*sE(iTr*T #?WCU LIH ߒXVk&',ޚtwuWeM)i6  ˆP>U7W%>8ڦ7q,"WeoI/YǞ    P)Z*Wˉ"F+GA/H0s5ThJ$Rib]3ΉbF+GA/H0s5TG#Mp ,X+.Tr*T #>WCU ^M|p\D‘to35mzڵ]Q$dHԙ]#MURuw>ZhgI|xf9%9ʺz{{;3 _ '6]&  ];vf>f\ w~OCiY+.Tr*T #?WCU ̌$>n:0we['^gww5F'FOO-$kw}|Qy-EN Nc~vufx.k1FKmSNj za}gaʳV ӔfOv&-p  ˆP8S{{bqg͚74.wοRϗaEyvG]ݛvfWŢ]xi`;̟_;4oq8o7bLMM}]2k[m_VqKEViZ++'OL3[ߚw-|I1lwa~ iX[^1Y_ O$6*\9RzA**@m@\Iۣ?o\ *}{aj®651UV9M Gw݃qwV,9}h|{ُ~v 2ۘZeeK,lCOOrUȾ*0_/ ijt[N/ْ(ݍ޺LW90ukrѸ*_Tn>ikإY+ 7Tr*T #>W e~_?R'<>®=Xv' y@ꤿVVQŭ_MXp,㝼pd{蚀4ٽGZR[.yH0Vm4mȲ*plw=Ͻ?ƺۨtpprE7MVR_i/O&5}$ՈJ *\ERzA* z54u"`Ɠ` ݻvGbIZٗ ,{;CeLy@ׯ{8[ΎE‘#6Nf^P< B^/Z P3qݱhζyEUqpÿuJwέ%ݖ/Sӳg?Y|f@*T #;Wz7tԉoOb[ΛjO ?oFZwkOkl WW4ILE\V=ߡ+ҼVlˣW+_T|_slaId0iq 5qHZ8W$9Qk9 48>Qa$rn_ј22Bt}W&aW7uN  ?A;H0"3''9$]/gk8nVnjK|z%TUgy.\P(/G" 5 -a#pV ':ĞrCc \CX?8Lp׺c3?5R'03[~1PrC@ R Ld8sK_?xTF*]]]w\f勖=+ҹp4[(x~iw&̟W3j[7ݶm{{TIV@ƽ=Ol*}OK kFP()V @NWQA*qz6&2{k&P[pM3̙'#z5* z&Q? N~VOn*-pŠ䷅$,e+L} nPMٛ4mnyVf!i2qݤpJ(p,k{z_+0cT?kݩ~33?A7H0S>5|h8s#[HU @XTZ4_WU;F/;9DmL蕐.WZ-nݺZk ]˵s{~'P}4Rl-UnW/Ptb鵝CZ̒+s 775[MkxUA{^.rؿ?>%Y0 qTZhxcŲ2ߙSbiqm8Z+?fPnrZ8첮Y鼵X+.B UE9FrC@ R L-.W铧shCb= UPg{I{m{2Y5Vjާ75Rfy$[+ԁOݸ!!F_7KwŶnmY+.ƎIj$Y+ 'ī  rB@ R L+wCǏW}|= P-l5SӣOw4vXbCsuNֻ+$q6{i6NC^eɁOUg I5Y+0ͮYĹS%\kxUA3*''3G#-4TFŢ׏XLE‘ݻvA=hCMC}E(dKvu͕Vo_<?٭yS*/;V`Hy/`Tn a͢q^k/3g}T([&> g/fܧ"N瞞肀oؖ:,dv|#aVVIxݲKeۻb49<2\=c%r9S[ⷝyǑKS6Z6!^GU h@&q$2{營d*@A\w&O{^ ٧< `paM^Zf'dŮ/؇>Hp:}Cez,2gZ9pax7{=F启*tT 0g.^ X*@'RPs];nvw.n3uWܲ"i߈Ozz{l|uk_PrC@R W.c'OgXHU NNn[?ŵ䬧cisx݅zM#TrfsìRؗOgKwء+/Vh~Ӳ`Tn sᅟkjj  Ј򦤏 n_^dYE ylcWL<&$]{lhk<޹E6@ lJәߵ9??s(bQEg@*T #SGv ճ*@AB$߮w-K>>6 +{Y;b3xp<ۺ\vpt0Ɇ'ic.5hݍ>|'*'INkFNs 7Fp5z8k|Uqf/`i]0 R w&|_s:}HRj7Ki(+"3G#I7>θfλXx$8Ď}=jCqn@?]ׯO򺎭>huSX+ 7ī   GfgGLJߡ' `r*@5.U`Ei}5NnkXHp:8xdᦇ->ҿ/-nb=MOw:69knU;M7wenM勒pZ&U37hx<B@ R`'a#v#/psuw% ˩ \СG K_^o䗦 υ`0h|LKWmT775F\fmƵ#Y+.ī  60wyks= UJq`@ufLsI?&MvRgZvĥM߾Miҝk?{yt{gl?@tfz& %n )+); =z_.X"C Flu&1n2Mw$ؑtR?=<3)5=o!YvL^qeJi ,}")_+0.]XJp[ccsVŏ/'?Iqp W*dH ECCCW!z@T@Xڎ&tnx&pa<`ߛ}TZբ{AO_<}`E?}.%Ht>Ǘ@NK%ž&)(g ߝD|c.mtW]%p5b۲4)>bѻ-aw>mI9CW=UARdUC/ٽ_MW*dH{bo3VC;IU*W9_q&>8gqm+L\2Y+W:L1p&&n8nxqaj)vf4l,Y ?5t0,pWGAlsa qv ᅟ 9s^=SZQJ܍L~6ww2mloōfuehhhObJۮOO=Nnܹ;u:ܼybP{|k&vړ$ ?TL@@DnxCB  7#C].7gF''Cë6 `n2RU7L.K-dьZނ q_ kEv--Z<8l~peͽ臁J2Y9sd9qb ,ܽ>=ؙaEd07op2t+؉'?\sbK9O9zEϋ~;:[; ą rN`0,ٽqdk},zAƁT X+p`¯.,;3MRR@Hh$"} zkǿx9fs%":II6J@pP吿׿߱eL!\jcc,D^38P2 %J.;xM;5#N= }W*dHJ!d\*Pz@TЯCU 4 .o ͘!b*؇zAƁT1P2 Wrw{ܴaU>,9*dH?"8@FQ›#AfT &/{N= }XxsDU , \4{ra0U@`Q2 g5ƚёQaV@`Q2 Kh&}qz@TJh$G圜v pܛ .,9*dHJh$ziB;YجDU/=ͮfAO;`vđC 'hL›#AfT&QV@PXxsDU , f"w#zO0H2v},!̛jV/gkl\hgLʨ%/Bo׷Xa8%nqǽA-h3g:fWVe!#AT`2;GV6;T7e39p7/}r/1}FcY W$#{sw8bZ[ ņ M0NtT`udfW=Ut<oÓڪΞ[T8Xz /اZbwQM_kۦmn0Mݸv#n6p샱nt=}WVsQ0̨`H8{GX|m:VTQ4\&O.X ,5ss ?$ky;pRȵ'z8ޮa8ZvW{\J+]US5`1X^Y`fЄoRC hv6_K|F0 ~ !'/[8Xb>D߈SRD3"#b47Y a8ߨǽ1Nr 9s+ز4}T wZ+ ! ìVA*0EC'h{-OzJrܕH8R=j`Iyڈ}zt~t˨y<*vQ a8O$@O P0L,,Y5//ֿݡe!B1KT@*0Fmm2J \068*Gq"׊*s%i$筹\g!f K\v, 0 ҷS04[y71Q! ìVA*0 ޛDf/aTkZS7>VKǁ=D'0=%RaN;3Im`ó }&L2,gCV"K&ZxiR- ôL $7~`${yzEŸ 8@z90y`A=ZI9>R[[KRۢ7y776k-{ W/_m=۪VYa U "\Żյ"O>@A}zN nЮ٠a!fxx5?ðn;@r=F=z0 o§\@։FKZ.{k5ZezcxPU[ٳZS=jl~9< 0UWf9=->Z-Բ9 ðyDӄM͵fga*Ol9҂g `fpenX_ڏsd9)J& gA}n3D2=DYU:,vB0 Xj4U{53bRVxaVA*E/#k(YDC[=q8>Vg]ཀྵR#wgczG^aEh.0 K˚ qǰYjXVTo8^0,'p@ d&dfjM3^h1dPܧ0P8z9Y3gzJ-- gcZ=xCRP ð]TQD8MSld!fXQ3M]ONM򍼱H}+`N`Y!E|=sCŸx_TY¨Vǰ0rc5pV:Epj0۷>vwt BQUSk 47Nwz}z̒`J #[yϵñ-0 \ 53+m8#x)2,< :,8=&\TQ~?[[l߻ %j2MLo2l7qv4 g`)3٤eo-O0՚Z϶&8&0w?wN8Ly458F0 K݄]WXY"~W n#d2E0 I^"HHR#HyWa€aARppj X.MÍ?l$yq%u.0 K݄{z MX<,"6.SeX@: df>Gq"QQX e%9w曝ft N"ƒ`1O0]0 ô٠ g]q&,j{?ykkh2]0 _HHMx&p!'ΞrREY_fW3ܷ·7lBF}`Q ,WZ}Dx7Zx*HG4=}ŐTLGcc5p-D+ŞiY9|LG[GBP0nv7 q/>bkcUwU=GOOʩo I:RR"1x&C>\YIaT,@$3)zVg/\>S݌Rܶ7>KXiTSQFaFlv eoVbn)Qn(YY,l) 8WRRi$/'!}V3#xjw4%,@)l:p%dSW yfW846OQH=欷`JG*0Ƶ#kYRlXt1M4!H%{Yd%Y`^©*y~wCRz!\%`Zw$M-]9)K76qtc7bpV=0 ;]=%lV6լ7S3]DT'|m%":0 />`?4ᶟpn8wC׳`J0iU L%3 MjFk5YxF"mVTBQ/a5Iwg0 _77Ñw޵uW^Yؚ bwc@oh pq 1 LhHٓ'T=UtfE3={_|Kҷ߽hJӊHK1,l5 0&&nqpm5;ӻbO]+U L޶sCŸ?WNJ*RU@}\~6[P )d8lʛW%Q 0̦^B7aF\XQ(N*WycFYC¶0Ź,H&Aw{pŸoUǞ4w拶<=]=TT`^lX5 4;G;x-HvF")TDrvYVc3Γ&gcDn\~af2p 6Q9+m2Or 2YA*p  Y+QT+r)*ӡ?VgN?Ӳng7a?Qa2M\&?fǜ}dyw\5zkd _VA*h8zWʟ?  78YekZ=rmDa a֟Xo &|?Y9ˬVz?Ao}A=^X3$#w.zE cnlEye5t&tҾNE٨  2y7amM8f{F oN>aVA*p53a7aweiuη *۠>Vg/9N:pv;e'_wRrC}0 gMjX7?mb]HnVFWzZ_ieLA~:I1ءـrb_?4bajp-a8lN D74y,cl}ts>aVA*p&'#ي$P3SFK#UUSUWPB̙ͻ7wv{tFJ '0 ÙeB1a)Ľ̺ܮgs6YuW%-2.s@_WF%nV".ޕԌB]d00X  QBވ ZG7@sYyGua@9T;ǽ6Zz-1Sܒ\`1zF{( bX{oj5-PwE`|F*ˌ9rڎ_ŠBA8 Iz/oB+@|Zci_Bbao0<@0H2Mv<= 42M j`ƽ^}'9̵溂:'oFu RhAA_ir9[U~aDk6h s@N 2 FW+,fXE N{oFpf'qxpj0ִV9# p2+ IZX4ZO~݄S s)aez9`-H:8xqI|\s)Jj6S*MꍨkaNB@ LY9 nX{X3DSM:k=6yx1#8y̚k҈鳘E}{a94a{tNgG%E+pFX  T`4MjFpo*R?Va©g[q.բ@. 0^S7a^tN͵f}0X3RC&)QܧHaTX ̦#!WP\s:$Ca8;LMx ąKbe@,R@H%8٤eϓ춪*ᬐ0* ^u$珩dz¤2$q]gncO gj k0 ʚ /݄S凿p1gz;[ $ g`OF#Ѷ@<ց7 Od,UQy Iшw%'q50&0 ֦'LJco܋qd!挶z:_yaBj@JT`3;xNj`|+|^D^j ,,)t4m0bߙ]QG^]gQPҏ9ި6U;^n۠7hx1Lܑs[fŸ{ /QPYyhz4}ц#]Z5a8V(ӄ wwch?R $4u_Vq*0q %da*0^Rty2Z29fc50KwpjpV%V#q)ߙـ5`b&S)??~y3{{Q>zXRF d[*pcM=ާYIaT`8"LoLl+60 g_H w=3Ԛ4G4eF`aKa^$ٓ ܍Q]WŸT?V3ct fӲiLߥ`[o# p[[%&l/ﺳkY-3Չe˖F^n-axu*ِ F7{vɂC}f]mm,t^_p;[ގ3=]=kh0 mn&kmM6#K70xqpi? [ *^E1T7@gK6KrR X ̀>INKXYRmšíZmRd!.atM8an%k|'Q$w{>i5vam* =${7}kX ̂}G}g\5Xdssb6<+Aj0, E`)Sn‰Mrߌή83= I*-'^?n0̲ O/[׆ci;fSX L]wGrx[,=kp|!ltک'W}Waq\LY9Z<-,Ĝq~xqwwKd:T`7`5?^0`K!{=UOU9;j`~m86!6؄sFd N X-u&wsbP!Ya|u8*۾[UԱsfY*M_X:;zeD9Y94a{taf[ -2)9{@Ÿ?WNJ*RHc50U7 +Ϊ],e$_d![]e*ukKJ aX4:,֡+ש6ǜq$?- \2J,P:_hi|덷paF dL*pws$5#VesFX LgzN >:IfŰ:q?mc/E3Ll/ ðtϵ¥ qGbw؝Y9Gt.ZpOx"I*08}4 0&y  EC'm?*W >h 9IXYR$ #U7{ng)7=X^ai !EwWhr7 ݸʀ+Y[^ou`='0,`SpWD+Wb€z2 ɻW5Xdss ?$ky;]nyp a7$8a4YQ9٠߁ MOaxI@0lNG0$ ikpϚ5X|Iw)^H__=p~VajWu;c6 6]pEZ϶>H{˯+wr3b*0<np6X La|~k-gg=rmdFwo#uD++Xa.giqi > '=%Yp%+ iNV0V෇&F`*zg'9@--3L 0 ݄,,);]ҸkQ֭[*X%kk R*0E|=3тˢ+|QEQ ,@NeNIr2k,##" y54Xa8MMqXNdK wuu*1ðt 8xo_yd%ZJ>E @}N3YOԣ]D\L&c, p݄w$h, 436THo*0%3gp8L،#ءQq& "Dt*|ga`J `re>+ 1Kw8o`0=@Xhr7*7a`thG@d>dJrik!Ѳ~}"0 ÒS{y 6|?}GCK=fIpÑ7KD7ablTPpIhJfFp;x}F؄X 6~Ӏ?+L,)w ]]az]Mwߤۄn"݄a8 88٤eo-O0՚Z϶r) 8M6B85;UG1Kk 0,9xT`' L&b˯=@& ôL R F{O[&k 2Ni$'\g!fI9N x]a%`_!~ɾ>L,w tuQ bVIM*pcM23y>zjt8'@rk0{_f]a%y3Im`ó }&,mlCH w ՇYcml*0<Yd(jTkp_]w~e] 0,qNTw_\s\qP}M_W@7aJN[ Iv//cFt>Vx싸kҔEřȾ-w^:B0 K݄{[[MXdo޽p~Q â*$ &:/~38>3tkpKG *wOvM <0  3o!ۍk7H NaXU֜ =؟|m~Yo' >VС/B(/k6hXYRdŌ`08u{HTTQ3 G  -b Gao/'&<]^dUݼydA0,`T7@'QKe:9$ +>VC ; ppEe/`t aXj4U_\WXYRF7af$oFP!~*0r75, fU?V‘©>fg"]a$;t{z tucMY3'8;GZ*' >VĮZ6UFTlV]aᕬ٠i~`ρ7KEFuEݛ5fUME07TX1:'ᏮzČ`:j}fLOѵ]x`Kvax"ImB̒2'I}0E~w= 1pVY& G{|쯎Ͷ j$;]nM)dV0 ëyfpӯ c՜;5xܢ݁0.<@ũ@0l` n3!jL58g'(+ͼ̈5a&&l)ߨARx&&ttVc*p2:=m{h]ezJrT8_'na"fIͻ [ba&4 3ni@2`2X$oIPa6DeGVa€aAR j$it#p -*DЈCtF^QB0 pF݄wGb}?|)ʺIƌ` ji?ڗL8^Š3ӌ"{J6$4|B0 pYA{ sY gz:+vGo:[Avnx݄a8&y JKe]R{ރy) H c5k7F=>bh=fW3oӏ0 pZϽ/,Arii[&)OU0di*t4VY0!}>U:n>V#A=l0`vUn}~pj0൏3&|0 É] Pd{|+#|~pn/;9X 2 0]<@DRw{0XHy4@ޝZx\lpWV%VsC@ͭxZL5aᄭ,P @2nqw פ&G‡noXvm*$:0 R:S>=)B}F/: |.mv7s38b$Qqҁ0 'i Ľeo?mne@g˷&986x  b $Pa @eh1#c5ז=n;p`A#T}, 10 mUTj6ǟ&i3>j4VWMWB}{3ϱ><4aKe<:02*D@Ki j$h H]=]YlH򽫪+c!fa8 }LKMٕeOgcTi" tպ^b!f<@8@]d2ĉHc5se߾6a`G`)?)`aNy7OM8v^2qѳQᅎ=N115ך 갆# 0r+ 6F[`nc{ ,C%\ -PUN{:;Y3TNm|Qeh>V#5tVdm{hjcsԷTR>}4`t agO7nLZI\ ygaK3 G8Mz1pF{8DkvsӊHc5Rr4]NߡߙoTdw 6V5aNeFJg,Ėf30 pNeM\068?V#%C7j(5N n=ۊo 0,/GMDȯF6fW8~td Η҅X>ܽ'Lwas9ufxlX[G}Kf90 &}za8 IT xô4qfWVzq©g[w}aa)MiV#V79[Xl>>G}yPNr85aS)iĞ7noʩouŝ+݄a"\H eHvLcOfO3VL5afs+p!/ֱY}}& i1T x,:&ai2y`~0 +.gcmjp_/}.߮ a.$R2jI.VL>IV#߾|qI9eH~M;6qf0 i0e -O2amMBSn<J@b (CF˴W}^CE}dݍco3U0 p|f #y.^oO}d/G$ӄN㐃a]*HP^J8RUS%9=C850 s]Aj@uP8H}vp yƉSkBF8MvM Z+!T l7~vimǙk=jr3ְ[>h ÂCu, 0 gc5Ցl!kO݄&݄axE*HPzON=;.gc%3Fƙkp]aaql?hߪj) #Q(3y7s9t,Ε@*PXM;"P˛u:FYQmq[FF0 fX@@c5Y~Z{k2 5w?G5vȖ3÷ auGy;+ {zCMZ T lh;=Zԩ%l!l;d- 0,Qx'۝?sR%9!-t $@oTka-*HPnG˫j'u2߄=<4HjQ8< 0L%Uc˟槌Ō5PYicdEH{uak@b (C&=|iX{d[ {Z6}P8Hmluu, 0 Kܚ W;f/ac!6WJ+ CCFK[on05*HPn}iL}3G ٨G 0 6=n v5.R_wrjII*08}~~baF,5@*PXMVsm.ؕQ&:}ۄS[֩P} 0 3ee?c샱/TU,l{VZAC8MOuoh ìVA*PXM{J6%Β=D}^yG96w?go We;dۼ{3o 0̞oy<^$d߇d&bwn4x EH^G>ڥQhP70 z];m42񻉒Joov݄a8*HPb};s8x I<0 a5>}"_OEb\|27n0w I ?Vow3VgLeNI5ft a3ŪqرMt4J@o@kn=g2xv~-&baU >V>8dJSB6f - 0 9;s s="dÃút,livEˋ$@oOԳ3 St:.wed>"YunPF:-PGԨĄa3]gNx[?8 ۘj$G^dugZ3 4T luC=R[,,Ss3GKO$4wojRD0 0Z5|zPz~Z϶>H܃?Sr~0L R2j7.H1 5 W=rmpwЫ#cam?hZQdqWB_еV+ i;r10@A*PXMOwdw :ӲI\g!faNexކ@o 2jNWvI'L݄Ϲ;t3 S0T ȵ[:ρ0 Yj+疛9]@cn.g0,M'yY } (C&JM>w k0 099 ,<xZ"i݄a8`ed?8#;[-M)8#]My0 mIw/ιɬp" b)8XCn°4 tT lOpk * 5hi3][:ZG 0 "XQj綽DUK'E*y[!wT#nt%fX@@c5Q~}i47VY,GD 0 ðlzV*Ij1<6ۭca+M;6 剿cÑ7Kߔq21ðh^E @*PXMy3$g~YײS!9(JSQE7D0 0,9Í5=<%jWu cX`ed}mC6!zzR;CNUZ:Z|G`aIzfoٺui:9FN}93}u8Ŏi]E 1ð&| 2H:O?I;u;28N y548.0 ð]WYW†gW> }dw ȥf^;xɳCWSmTQ0T 3l-;ܫؠQͮ+pKaXVs'vj07C'>ȹBR>׾ .]qhIYmT@*PXMv9v!]9Dݙh>3|t*|;`a8=5u:qzi+hn¾G+M`edGފ3;/A`0 0svtw;띫zSO8 1K& ËL ?V]ϷWۦ*S74㔚 _]aaxs\י{W~2j~4 (C}&|_n`vUw0N.ɻ7gat~KpKi|ħZNK=NbMr .B0&<@ede7tu\\lG @aaxuk k~s-*kMYSy&I;yO)ctVA*PXM6;6VOO#rm*%ߙov5a m?hߵuWnNg{' JֶCC$݄, 0;1bT ,7hw Z3*i#"45ader<:ް!XxW }4q[}qy\"r YjX@@c5䛿9cw[:=G˷>nq| x} 0 -{_vucڑ_( c7l;d#&loyG=fNx;@ ?VE2ך^Pd6©5aαϱmΟ97yNWDlƵ$݄nB0b*HPVk3##Ȳk/<;aN%_nwg,D%e֩ <*:5a8N-T l'?ߙt:KvS0 M՟5aSeFu竝n##nn¦*Sɖر- R2jVq_*}> _ Xya'FGk0 ұ~McsA EV{0V[zp29lr59-eլljE4 -!ȣk0 1l[yv GύC2U >VSwy0,\{2cC)cS>@@T Qq.HoTj~m'g{k}Ocw_3~0 dda}{`r쯏m~b3 Qzk+diQ)w} \k (C}f|.oF?`x~X6wRR>mJ S5zcwl?rqĽbk A7gG_u_ `eլlLE{l#DZl(~ֳj0, MQeQWD; z?GH{ Ľ0R2jV1 @!WAӾh_.B0VӾHyQ.:Bm }e ?V  2k#tuv@6GP{`eլH92n-./g40 l] @@c5+ktc+q}\yyyV>+sa8]6>) (C}fc@ 2[ɧ%g|ᔛ=~@ (Cfec@ gӁ`Hc0 gH˞雱9*HPYX+Fy>\s?{uy73ȓ#e**@*;N&KMQ%Hqc_9MTøjFihQb$JD-"ش7%@#Ǫh3M7Fx@Aw>PNPh*,Y\u~A(PeE@W_K/S(Z 7mg FE+,3Uka[~ii1P P(4+J `77"V^c}g=.}nZBХ*ؽ+PVXn:ve5eԯ( ]ҾC1{i= (CY"W ¹/w{{9W f (CY"W m+!㛎 ̆|.P(4}C@ҮuA(PeE@@e?oɞd?]@Ph& )Fo B2ԟը(r|ti|lk_F1( MKiJЧؼE FY+ U_ʶ1tnԯ( ժH_}[yZB2ԟը(r|C;_wpǿx>\)P(Ri>bo`wZNBe?QV  9FQ0BS`1bo;O3.- B2ԟը(rZ}+VAfWBҮ]A(PeE@ϔ) Bk߹-ؙנPha(B (CY"W sL:SXoCEsS?~@PhR}8kXVE FY+?U@oپ By2-%r%})$o B2ԟը(rDv0-{0U_;P(*QwJyN>fD40+E FYs+Pef=lVw%ᬸ]M'O4i· B h+PV˖+^r^'AZ.rʦ79G ̆|Ph+[#CxiW$ (CY4W--nPbX2luٝyÞd?5AbW@3  _A(Pi@ -I~,[@aizdF_2pMAТU7E+ҮBA(Pei@ :&Ʉ5 2ǰpZؖ^Ѱ5BW4Y@e?QeHrHi*˰e(;|UuU>\YP(dE{iW (CY.g$ z>3;v8?xjg+ +PV˙+09p,q~r;;?rP(]PWg^|z嗸\Fr}4k _r.hw:UW[WT_m^ނ`$yk->^@hno~yٴڔ$|#5Y6T Ү6A(Pe+@E, notso733yqAbf803剘|TqqV۪U)ya"MһKš̢rtpdy"&x4r.[-T3х*:3@Ƈ t{׭Y7ϋ6ne}A(PE@P`.o4x#gUBDiFd:%Yrt_BWsqk< +AɒoG!9R^|r?_)+)cmՍ Yff+[-l^ӁP زeù vB2(+r£lMظ~uZByI4|FnSWʔ KXLZ%f~g\m\ADnS'Zo?7̏66xGҒҥMT$v7Ü- i` ԡFE+$Uޱc{̛gz -x}KB,|8p46xR`r_?}c4ro/yC`0ǐ#iqXrs>PAPlooݛ Mԯ8(ZJ'%6ﳋ4lвa 00f  tX,o>ʹZ熞[x6:vL5.ŀ~"ż%7`Y@ڕ"Vœ+0B(?G L_wq~\>\wP(05uqj7&#v.&hHOXkO))/|4?T1@>}n?QuB RiLMNV~2i(׹1 X)/// K?׾5>o@"VŐ+0ɃtF6XfZ>ڭ:vGc1jXe:oknsۦ.M}gtl~婲2~nl426x-5-Ƌj{ntymiW\B M I =fV{{ίMޏ3&} h`~yW FE >W`<?n >|F޽YI%B MJMh*4^?V?ӟ$ ȉ̿u.y  _A(P-\٨8sG Ol}i/vTZ*$3&<G>4tx:,UK([U<5k.D`P |Ph)[ Og1ez}B^UUt @NCo *@es|R֗%=nF宽.?'~k0k< CL$nܶQļYӁڏ=@8|Phi>4;:i)A?U O #\IpBVnbaX@P uv>OvC۴omtO<8֤rt2oGPn6j"}10ǐd ̇ Rixwål&@vD@9`P Ү A(POAY 8W`h6$CZM훗Hߒ~1.B))-ޢ3Ѵʙ" t=C~|Phisi_daKM `4նjx,>212v>rƅ>|k.Ko_|[<4m7Um<0纽u/ůvJ fcFƇ4y338B6+"P3~X~};wf3仓qxM^o޶bkcC41&6:>J[1_ے屩KS_ql17J{Ionrc{~eYIirT83ɱVv< (Cݧ+0ӥNw(Ӆam!>Cp9ݶ݊1KK—\P(4Jhe7ol0 1$O/DI1sT8ucW[B">r<񢮶tsb=wtv JMr4ױhl .c4$Gji~\JNt8tH㪗?cߝTEMi39',#y׹="vCI`l6{W: % zbbB9P`x:џtv~5,kӅfC?Dc72#pNiA>tƔ7py+4@(POAY 8Wo=ĝ7^!d&/Mf7Hz#NDŽtĸ: caW  ͭekjN%t$tub>lht*[DgB$u_kH$3'XȽw>SmP)h KÆK' N,h 6zSBsoJ]IC\@74>Ti2xg;UqGὊZoX ~ƭ/YTkC:mi_;Xz4w5n5s?ظѸrB |;cUUHpD+Tھh 6ى8~q\aafǕ"c°p[~۽\:C]>8`  | s`nw't-]JIREHt&zٕiuVǫIsY<ߥx ggn}eە݇ ᣁwBm<)(k \0Xɯ B7F/~^ɒoi—u볾ϕ\P(4Otm}?R-R7+ǍW٬#^|DU}vB@· zq }rG'P}|?!)U11{]zKdC]TyS ݉ q:.$ GqӬ/6zz ,6$+} (Cݧ+p}21']9CtӗtY_P B9U7jv.Q |ξtәa"xg$m?MrWjK_/[SF(8;RLd=hN~v::'vXJ /N(U J=x8X2ÐaiY9nHP*q@BŶ S?%IoTl]۾ Tjm6f>LVQ^n(0'e /R{!Iv]kQlI> :`n /dաs'8zR)OAB2} Z*GTeGR \"}Ĵ5{)rAЁ+ Vùap78??X~0G]|pE%!|ڐtw|ݦڒg9"؄igp`LRϟ//7*&YvgKJ:_Kf{.3Ia]UbXB"f_RI\8PA>{:C.BhjNi yk\/*W".RNUJK>ť_]*"X@@>-\r"3r޵6!>!2AVV-_8+ T)RRʟ4moROmhk+`>_ykSH\.$)Ayox|X:lm[I4jjJZYjXcPsl{X4&UYRn"#@[^1Tw3h\st6*\O0l+-iUPHŷ}m<)(k ?1ٗ"G>Q;leqO3ҁ+ V󛲒@^YS|ӚuqFf ]G@ ܅= .iSTK(5$F'ĈC!ZKhZőҮ@2yA%w]s\U*,#+%b/Ig'/-K(,I7b1b,EF®]´*AB2} *ZHV^u7Ґ\V,fKyi6AzF%K\;A PhNM#YDrMϓ2Ͱ97J2H3ǐ³7>MAF^'Jn[WZ)C<>6s~㠞Q f3\K\_,G[Ut@ [-iUTIvZMk-wE=$ No:u 9H} (Cߧ+Hhi!KadL;J:}t ͆$a崮 {oD1@@>-\ ozTҎf 홧%RfIU>x9Dh"WYᭉo%spBМ*[X,x`_U&9{wW703H'?d/Gr`0(~;1[=X#m cFWSEc.M\%A~Um&] {>\.hA(POAY #W`d:$#) \\ t5$+<#'ݥEا?qôv<̵#o+ VWzfw͝<}xWuI!@^G&Ia1]R}5-~4%&}Sn% x~BxM6i(+Ęg}&qW̍?ͷ\c2l >x SPv͒9^WXqSSI NI/PelHvwg+PhNm)V||_Tr\.oXaV%i]1fa-q'A7k\ΌΰԾbrM@ m<P)ŻG[oytz]/ )w>21"&=fssHsv熞s:-:c句$]F[=!VpBМ*[V(-) 6F=zr Lf'}Ȧ_*"r 6AzL#V7ȃ\KG83']9]+AB2} ʺ#G 3~Ƀ䳳m=zv-L5hk|Gsţ[m=z-:^>+wxDސ%Lw^yQxBs+rr 7pq2iG҉ܼs3Eb\F.sJEU37ks7p35>Ҙ (&r!}%!{y$ccdvBm<P)r y٪GN%{N(mHûGzT?_AW>Ow{w{B% ttFQ}/%!Jp, B9U7 ͇kd=?M6~ԞPqb]r02\y+P~Qhlܝy+P9[3dڻf0yT(ڶ )( &>q.|fLgz? r9׮W:ޠv21(y3iFމ~hqXX'}/u=49DVDfV+F;v:4<$5ֳ@([J.u,fyYI?41,~&DžP.xFKBy+PNVYrxU艑ƪyw ['&.Zd_R(viQ]c[r#[cgå #ƒrtYq c?+s~îB0y+P>rVz)nHMd:\@LѶ}H@(POAYs+eLvz?fX&t;χɸIN2lnkoVeNY'=!m6ř4`lѝ pNI˽mGpBj<ŰӚa2i+t9GvCCvsf[Hg}f+D}˯L_y4Lg&lY-g@yU ~9^J zWo]iySiG·\s0ˑNk$K[fAݵ V"E @@>i<|DI:m}7m2s æ~ƲCiT7aA.E?VO7C q8(r3ff͔,?+PhNMW [K,>Zuڕ&5mXq[ kӾOo"8/7ɍL;:[V_>W Gj[zUl6* ^Ҫ4A@9}{B{Fxɢtز6z܀&E @@>e]\y鷑-y=-4|(* c9T{(G) BռAfr31E0q#N/Wv1 7bN8:u+’]ftU 묄\UE:5{iUDzA@rNzQ_+2ђQ"Wٕ1Qm SPќ  + T)$yB꭫}:qkZqC460h411ΊXUS%YHei@ Phn5oЭ^ux:*HQW7)BvLˣ뺽uIsh=Y;옘Вs#Ą6ݳpˍ|.eM}!n}Hzty+:vLګ꭫yę%' RϽ܃ jK9g\pcqi {5evBh>$ (Cݧ9@^W  ͩRI&c>֗HDPdMBt6bk޺Jk=Y\tfnS9p`aw=zӡ% mS *[\8{aǞE-J̳ro$|\{U*O'F]_OJnX=M hsIfj Lfss S Qm SPPhn5{躏v뢺ΣWo]DO;Ԉɚz/(Ig.Zu{Yx_󘳔n ,?ܸQ[z4j,o4`hkoغSC y|IƇR׌g־7Qz,OTE@M2#[b~~ɫb㶍%d@|zt6JwET>If_xBki)tdhk|G]dG;/p/-K@ > (CݧPhNM/tzj~[W#NnKh<0Y>pSYYױ?fN@}1sQ!fnct<>6kxxn" &,.9b), U3i }ญ{INpmX\c~~&CSaw U+yeh64і="If| f,F[>}̢ _}Q0 n&//ɒp,\jP-yW-z|Ę$e O#Ez% O~tCɆNd|\*Cb!)ZGĐoӇ{8 9$Q]r^\.IK8ٳ8R#Eh_ꞩlTCgНr\~VJ2z\qYu^4Lplw.,U=Dge|D5(*@ B2} ʊ\+(!pBj>ў ,v۽4ȅWgYKr҈yGw lvn޸ZMlMY xޤ@ں/c(1824LJ /?ORe]EY0YggCew2kcW%R&LX<-1/}p?{u6TY?ȀbnP u"W`a"dagZ2S'pBМ*eD#o^&Mr&Tu7nۨo\1Phn >x SPQ [JNH%H% B9U7m<)(+r--BsmP u"W ( B9U7m<)(+r@([heTAW  ͩRE@P<BsoID^l} (CߧPhn!Y'@B2} *\x+ T)a"}ld ;Xm62F*Em<)(+r@([-277k/7ətS=׭߸mnVg\edd} (CݧPhN w\G% V#{ } (CߧPhnȈW@@>E@P<Bso>x SPV Y'Dp[_m] BU6hA(POAEs+0<֒EH sb63ѸHTG|㡑+g%AEW  ͩRܜ %w"rs\7sTxq/A,<\P(4J@@>e]\զ6wgO dl#!&ӿv{1aϞb1A^fclgMPhn >x SP SBr52FcѺ:Ў=;?rP*ZI \P(4J@@>e]@9Cf5VU, :CϊìE@(Z\ m<P)hrf2tqȱ!^q܋/6Xh + Re]\Y%$!?Ɩ$@NfD@(Z\ m<P) cZm/|wVk[1B\)} (Cߧ++W"y̓g \P(4 m<P)xx SP+0){i W  -zheTt O j}f{D—SS߄֙ׯ]_Y^/g^ {=Êfc?h.Od&ʹRWW/\}7=^nwTYf+|#|i #Næ+Lihd:R,\Phu(`@@>e]qC#!Š'<~!,voJmx|رݡX!:Z j[ZndD!]n >x}iӨӧ/D>y]  \-ճILul豣֍Y;CZjZuȧ rA" wf\P(4 m<P)ƞ|Vΰʠ}'X7kʿ]U۫Ldx|XCy8?xޱӑ4FމFb]G t;ͼW >8zOi24jפlII>ȶ﴿U\AN`<`>Xlno)r!aF'G;=m{4~iMrrsŞ_v&D٢JBsKMKm<)(^n,l|Q3xl%=*ᬎW7XxaǞG}G}IzPc}}NDdMJLD־>_fڒL tvCމ;tqHDOTY< cGը F䅋/JV0:Jd3] BU6hA(POAEWJX4{Wn;qbѺ٘.Dq@#c 6w3&k 1טEDy/p`aINJd>nr ܑmv[t˲Ͼ$f+|ԲYO?e1W  ͩffd >x SPcbG;5k4' qbһTG֩e6KƢČE 8 37xl6k#pZʔJ:T{={L޺> xV `Oߑg!iml(fZd漁֢~tBsmP uRmxx|%%Ɠu?zB\֋oZzuH/;h>rjO<^OyyR\, yCzx SPVYhr>_%b{vo{hE 4=Z:CzjG%N6q"-'/M[ѝGZ PhnuaoUt_:hgR{67¶i/arɒ/[rٷ0!~k.Mlr.^ʶvTUl ;e:Ł+ RWX
  • Ҭ2#V06rMOP$}[K7^JPAB2} *J=WCXHg%~*8Nvb!hkld|pE}W%=´zm"LȤP ZrOPlT#;BvixpfWI,A&Xɐjo70hA(POAY ԂqVyOxy%_6ݳ7X6%vK3-"[H(q(}RC$wan74>Te]FPhnu%+vT۪{4jJ*h.7wz;$%?'tg.eF k "в卽o X׾N='uၶeT4s`&F $mz.Xۆ^>+pK5\@5k(hsez W  ͩf~ Z~%fYK$1#W `<^ͥv@ ^83@M!,'hA(POAYWD@ Cϩ<Q3 %ұgD( 0t~iȣ7;B4^XKfh+ V g/tf*EfShe80zƇh&>wKMX,.AB2} *rYn|!q0iSn4 |7OzӲ M{tcj{|I]oY'h(a>\}P(t鷩qu=;na$hƒ"2{87X7freu 1nIސG^Cq떲TsJ~Vj[uvw}; I5@(KKx}n[x,F8 P,|H]nMr})hA(POAEWb@5|[7pfQ ߿{}I~K\%{Lmk~K:j]Ǻvvy^>F[]7@(S] *w 됐3:IrAB 'Bѓ-ou$+CBn@B2} ʺs`9x5F-&@1W@zNոy6䋍F:;RFvBsif$&a|̅eƹQd|DQe*لP u\J|w.V.YrsZ^&Y4B9 h(Dd} WA`m|dMr6{V"hA(POAYWhkno}fɒݝ3W/i9̵D5WS2OXiMÁ7=qA=[J@Phn5ψF[jZʥ3D7mx:sy*<)s#hI~3rNK"ŷƎ4|_EHw^cbɴfG?.d([Sn!yHIOqG5'Q`A)s\1|Gm+V^3<>.@,pFGIO#pљ屩KS_q?^g>`{=x rrrWgrkuyzW[57i~pK"~5\hv+"OUE{kX^5> SP+ I_-Aɯ eE0ۧ?C7W`+EORg!˹ӜJ(‡߱Ij@(S] *]5FLꘌ"pGCZXuPz{ 2iӨq_l6{/-3B<ߴk>i?X-³ N OO[wk(rզo45 lMH^a'{3_^(er&6t+ZQt6nm%ߘx~BqҔQK> $<oA #@^ H|l`R:z:vo6_ *%ž;]ϸZVFj5{If ~ Pt 9|_{\8șs'%fV;ܮI=nfU"8tli]O{W% %,Xء"o@(POAEWbc+SiVTe"+Q΍3j1?'~$ӲOj9 $A_b]s]BpBМjVT"<0‘pl?b'iI~V#KCEp;8OxOl;ǯ޺MZGhGc1>A^pqQԃG;v qyZ%{n=~-`m;['v{5kz>75qab"q8A5k'q={r;)!5Pm݊ @Th<쮑DOCvKCױ.ǿ-~9~q\lvWIOor^%R-'ls{so'iO+\/JY{ZFdwьZQc`_5v]ϸ2"2>Rbo|ƳbnP }\I%+"6wg_YXZ+ V =Y|/Nl6'={VthJX:-Ɖ >|d3.y8IWӐ:?E3s~@qHL<&|hZQ-q33 ݵ{զEj7czŮĩe|GGc`~QÆLD/wa O`T[A>daw|P^c<`ٔ^k{K BsKAeswi!-`+ۺT 1s)昴nkZG֠uxͮ| f"MigcuFzޤJ̝b[T|FtUr"3>a.7n5I%#v!OmVʔ+q'!oW%"논ihǮ.]tbYTVc>ƴu'M{TjgVk1++ ca!~zh};1Y.Ņj9@DʟI:T{8?&ٖ֧֗S\IӶSeMWgPdi_=!3΅seu9sJ pr&2!RݍyWw{dN^O{.˕ 8^D#=UVA>Hz`鈷KVk>]"Df[MXB ~dIx:zvCC>6 &ي͐&1/C?FLx~>sv0BsY-)7! $vz67d-i;TZvr?K8PMe{t룍L~>nSoֳmQ9'&L;!9/w;'Bv?̋?xY g b^W9osL Or%!=g_NT<PbpZNzuH|^wK^jRDK2UN$0ӈH{lc)"oi-%$'}n_#\mb SPelg˕\~~I< Vq;iOxO0Z_ Τމ^!x+ZPJy}MM4eF.&gHx j85yՑ=?i"EYB7CiYZMyzN,,/ZvJx@Þb>F B9%ޣi)$Kś&&z{=ȣiT)Iۧ[I t&_h *^^WwJ uVY?-ucm%_:13eoh|H>'__"};l7֩k]kO5 ٨xjCcގJKZr@M%$ֹ&bݫ\OqS)%z+B1"x>Df"iM(ڶ )(krcGkndRघ==՛U|sJZsv pvýnV{u{$+ǔŞpE,|̴+mP u.W`䣈8RVr߆؆_XF&M>Hv211=-:$TO+,P? \xalX[;[adF9.ƹSW  ͩ.65GN;g[ʶ"vO_q*qEd" sppmX B2} ʚ\զ󍍣<\KS(_N^ \k@&JJlH ])Es6U5!]gڒr]i`—KAD*`{cOٝٙg~?E?7<>)DݽDo"Hlݻop-˲+ө>r8v.]:Ҫr}䎈okyK8 )^/>y䩓g=:[6xÍ-[_R]mۿ,纛dVq)y5s6t;=Î귰%OӏCV S]9ݽl\Tuk /^kwUၟ ̜х5eiBz}"y^N,a~USw|n qpU/JXu;?bF5ю0&R37ohNrfխeY pʯ7zK`}:0y dz#0 }#ىY,VUiVLWSlߧT<__&$Jv1ƞڻӗS?VRN1z%Um%jD3 պ,$-}h4(7բ4,eFUտ@tW=o hbeYpY]#qV`7d$aq1y0GTvS\ @@F>O dbkVG1iluۆ»bR7mhj-~4^؝ZZnN텡L(->p*v*ٱO>^nG_mͻ^߼h#Z7GTֆ׺'k@FgA}hG͛|:GY%ZJHwާUEµ@P #`nj 1گd/(l1)5vnUBA2TCعs$2k29M}?]Rԭu~\neB^o?N:V#یeG>,./E@꾋_y-}A< V  1ƞZfᣇ]kMhl*/CGJRRXj]{KmbUtGTSY_u|b\ߙBcv ){܉Y 7Z*8s#Ŕ}x@*g#5U.Ap= nЯp )Z {˗\6h=jݻKZ*]}WD.?w5ں =zH7:1jgQw?}NVB5mw;`ɩ*Mv_{CF粩,,6+ =g;TGeCun~<~;eVǕ6WGZ,G侤W{yWVȻKk@F>O @V [ g=v̼i(Vů0O8:ж5k-M-{,q5L(c2gS\m$)\ɷpqeiGBCন홡>˔T*STY6eB#x#*>k.{A(S0!81Ԃ7=3ug 0{KۭW'[7|_KcKsCz6ӏ>-Z͞+) U|wKa(s[}_vx`zC=F#;w8!V`~sΚwv^'_I)# gz#\o9[eW"C(S07!81־&-nô)7Eߌ;Zxsxͥc% <:]_{CPwkwK%'i/*i~x孓Q2mg}N}P9e;[w(EN4,|0rt19f[=7[xwUN V1gi~k-3w'^ĺGr;z⧻="->up=\lo{A(S0!81Ԃ7՟(8cWXXU"+XLelb{gz[ nh(|~81ֽ0>JM7ip=_yTTSVX7[[~8C_ZM mvZ~C/VO[UgV''&3e#%R=blݚ:5g,|OUk+ڢ @@F>O @V [P8ZRm6>UT~j je9Sj!%u$eXM*cѴ_xP)Jl4hmɣ;o}9e ц~ǾL}|wNFZc|P+3Um[۴<3cXoeƺb/Vǡ}}?GTv ^(:)E"/{A(S0!81Ԃ7#wEK8ԴPnn TRkv~džj(}*:v.lFXO=7۴mk+9e& F#rғJwUwnׅG~0kzgw䎈ի? ?,%>B0y V 1Ol.K?:]vB#ͺg{zcR~pn!O3Y\IS*-%s|'Սep[WEvUqm۶655e'H:]x Sj!ƨuqy GqS3M`hs>R]ٙ#ww+)#zDbGTᅧj"En p|(P #`ajBp +coFj`BTSO>m<'R'˯0Zln81\,mLWvv.IwtЅUAɱ֦VUN빔S1Efi Q&Ӎ/ [q phW|W(+OCdjj*XmxE~jjunc~#F_hJA?oGTtի/ Y )Z {k++|#5*Y;9}y tn?ӳ%b=0ݟɗ,rsF_:RCmi#ύ$>L]C̻g7f ѨJӆ]k}PczzVWG:t(Nȼqz3oapr[<ƺ[9:}r18ygIjk)+[D=?ɹNe'[YDnag{{?3V)~6pʓ'&W+PqG4GK ݻu=[zm!j9+_ a,L@db=$fѱw{wCg{}ѽd>B755U6X ']m[nd~o%yd=o C$J.qC?e)~,]qBJ0L^Q!Q{v+Id}ьHA::11Q;ss/lZ?v(l?É;Wt<5^}Sua4چk PD<XØΦk_5pP2Ϛz2beS?u;,Y>L ŸB^jVS]:9dq+i:2Jps%>D}y0y V 1gW%erԻd",(ZKYWݟ/zhCc®:3ZgMQ}'Z#GG֬=w,SllrL<=kV׼Zտ;hq@3<-?/,wgc-#]j6ӳu9Pl( 05*GGk|[Ι3tޣ^G'FvōsgKM0]ժmj{P.jC -L2Uw>IVmvVH6SYlj;4~OD] ^hG#xӶ$H}y0y V 1ƞZfƽ߸C9N )c1hk,|wvmߨ _}}ZCNGZ󛝅 mwm¬Q4x,gj">{\ ZG(ق]K*3<0l,؟G]smU_ 8^0;wLm*yۿ_;WhY^tsB|}Fu%&r\܉|,s[{gάB}Q߼nV]oQjZmoޙ3WKmig6pc\UYjʋJsCs幁y.L#4 FG;p6I%µ@P #`njBp +cGժїG:.}n~n0phMs^mS*D#⻚#5ڌ,NLg<7Rr֡|ߒSr;MZl-@5fBcǴYX*oLMJi@u]>bAщQGAF @*{wힵjD"]{wftMd-9x<ާc[h' ٨Wx̖P?ڼkbn*ռ>]szJ"zJjW$ 붤͹ 6d5@gCg{5 vz=[i~F`B~zeî8h a,L@db=͂ºeLZP&HgOϜNǮ]_~:T{l~Eן}:F&}ֽ+^Y_X(3Of}gtu{|1K˚N&>䩓S)QXƯXs{kKc%[dV=ǏW&/{#OKΑhH}ή;k+gFޛ?[vmy,3=|\Xvf]fzuu|5|֯j7 TqoW9z(3:vwqG05Z^(~{/i޳t }A<sS+YcoK wnlϵ;ZGXGxUX٩+]˂kM7+t kD-TjilYvޥG;SwTn-}1ߦJ#\E#*llk'LA(S0!81Ԃ7kԻǎkО}~P`E355%'vn ;}A<sS+Ycoc6mޤ۳g';+ "g64)Ku{TA(S0!81Ԃ7;멙T.MU2As HTʂk@F>O @V [pUx(5׻>~p䘶ˣAX5}A< S+YcO-x~IR=u}kSS k}Mg9AŤQA(S07!81+UuSSSQofݚ:=psMY `P!+A< S+YcO-x~sDCC ˉsѫH7yyh aM@dbACN =(u2`lr{wwϾ@k@F B x@<hp )Z {kih a,L@db= @k@F>O @V [Hõ@P #`ajBp +co\40y V 1@}A< S+YcO-x~A(S07!81p ˆ)XZ {j> B |@k@FA(S0!a/3K 8@F>O `އ1 > B xo7Wq@|͍a/3s=c,K)} ` @F>O\@YY(ҽc|Y cq}}P #1c1k[mS0y c1c+A1c1]KjB(c1c5_!ˆ`1c1ZVB X c1c @F|c1c1vҷ aj0c1cw W0c5c1c0P #?V1c1kB(c1cݵ6)A1c1]B X c1c쮥oL!ȏ`1c1 aj0c1cw-} ` @F~c1c1v~P #>V1c1k[mS0c5c1c+A1c1]KjB(c1c5_!ˆ`1c1ZVB X c1c @F|c1c1vҷ aj0c1cw W0c5c1c0P #?V1c1kB(c1cݵ6)A1c1]B X c1c쮥oL!ȏ`1c1 aj0c1cw-} ` @F~c1c1v~P #>V1c1k[mS0c5c1c+A1c1]KjB(c1c5_!ˆ`1c1ZVB X c1c @F|c1c1vҷ aj0c1cw W0c5c1c0P #?V1c1kB(c1cݵ6)A1c1]B X c1c쮥oL!ȏ`1c1 aj0c1cw-} ` @F~c1c1v~P #>V1c1k[mS0c5c1c+A1c1]KjB(l.BP @  \Nz@@@(  @@@(  @@@(  LTU\kIENDB`ny wD %tQPNG  IHDRhv pHYs'byIIDATx;e׵.< .F?((l88hNp邓'1GoEpIW[6Jsk9x{A{o~c>ׯ!H$D"H$D"HH$D"qՅ당oD3H$D.#ߥ`/$D"H$)Do@D"H$5`I"IHH$D"q Hq=8^yi&L$D"kR$V*HH$D"17,2)gJ$=$L$D" <"!f"H$\;B"#HH$D"1n#f"H$Db$L$D"ejva[`HH$D"qW IN"± ̂$D"H$V"rޝo$D"H$k@DIPRl̈$D"H$KcI)EPjǗ f"H$\܆훛DFs ~oY HH$D"1'4D%tBiZI4D"H$7"SH$*Қ5at홐D3H$DbnD$INORQD"H$9!MI#B"1+\2f"H$Ĝ,~ԶHD.7D3H$Db.pKcy&mOH$D"1 A[|.c!f"H$Db$L$D"HsyN@D"H$oNzLHH$D"q.MM?h&D"H-kvFϟI4D"WhZ~yEI$4`H&e,=53f"H$C${(P_ܿ+8Kh$QQ"1tΈ$D"q0HjPS{Wi=ǿHU3qϡs 蹾]Ypz>NH$w KI5V3=dG6Ӆψ􇌪 Қü-y)ODD"8'HUx3J$fgNzXR"eMu-ϸyD"XN$=*ʫl =qtx$sYk%I!-<Юf"H!ΝHp]ujbHG"njC<1V XIOW3-$BQ%-t |RHH$-D}dmɠ~hh̀_RJ5f.@.+VT~$L$ΝH(j&& BDNk-J" M+FD"hG&-w]4O_TH2sD3>$U#XUnB8= $Lh&D+"d+ o 튐M^Ӆäb>F3]ApR m9+6g mo}#G0$L$5յ=c)^[Syޏ>>';"Eo ^b}֧oDD"8\}@9^"tI#ST_P?ݯ`-3O"oHJGՖ$D"4!$^P5@&yBh=a8(UMJ0>K5 Hx  $D"~H$W%ɤ(5L [yȀ;P un,:Io=y=#h&h$ҪXHJYG 2|&5r2`F#@M"ѮsלfFo Z>͏E#bvd$L$VH}%1ڞ+4U ozIϯ4Ұt>x,)L EIG$hM\ɟBӭDX}d2'q\TѴ[s{HH$-+rZN^Tlo1G$3*ykB RDtH7;jQ#`'/\y~O`HuIAD"OH?~W\`DuAz~ +_Vۧ#m%O-̪$2r9[R7Evd#r{$D"q)AOFz榛KH8UJ[4G?!Fz)ײ7rSp3=mt]gC>!d#f"H,6Bl,ͻW!EtkrhHKMmql 鐾1(a֚ y>|sQ!%?[?Of>ܑl&L$5!Hjdqemg?B$^Hs\)hi<"٪*kfrH+9iO<"yj5r,>zX$1B .9zt{&$]d\C#f"H, |xmnGΗT7DG}6HTިfh$%wi$ݽ\>W؂(I@t2'}{^ݜAՂȽ55^k@D"Ii67Lzd|6R%q@1W2m^*kqsR"ϵ\w0yno5>|57$>7kn틬!Qi-3D3H$Z ިҨ?o6 {xo_R&\TZ1zW[R%+dDT~k|n!>oY "W16Z\3B # qD+ugO@H$4BHV9hJ^@v׎Zُ"ι6An7[sD3 =*"m9oɀ ՏLI4"$S.6 g"AU,-[(A]}HS=#OPDCSlJIO}'J oO 7&}~/@򭷾TX}b-R5ZG"a.iUNʠ_^-H76B V 9QURS8+R_j6Qj֐הs$h@'$ Փ?u@y0A )8Z^ ֝C"g[$k‘Id۲IŐd3 RR!.P.ذ>0lm_UCz@&#*.5.V^nHʹRh7d˿Mm@Q.(ʅcZl#Ds\$>#V~#l&3n&M}20im`Vnnj%wW9W)VeR/k+')Ay6{`܈-=6'.kGDm% D$@$0-΢\?LRB͹ᨒeM j- aKd ,RLK-D/_ՔB^7l@pOjaL|{ֈ`ȿupOW瑘Ͻ\ls.L48@o.7s2"mƯwDQ>3SONKW@K$:#=3lq`UDVXO1lc_xmh|z;ÏvdurkKuʈg,SA5'NՉlOBP?i{k̖ʈ3PhrL!@#W`}XI1,frEQ{% FY@@iG{W;#b*,{!Ͽ>x]&ħd{;wZy*7*y\DR:*P~_wfA{MK5\b&qD2inlG63Qf=~(%3*4Y ɤAP]Xuު@zǏxqxoU}7ۢ<iV:X7ԢZXq/~,Eٝ[?xrxGlE է7whHzэwvY2y2ÈՁݽ*e6O/}+澂\P A呕ix'SR,dO,CThf5*t?rR&>8\c;ܺTnmđ?%&ӔJ]¥ocѺ:F;y4p@з u?O/^yDÂ}KJ61쏤B0ވHlr,¾`'o{݊as-5hPoG2(<R:@NgP/hy!GH#I$c`^)P="gk@.4?olQd6t%[^ t&EK ߫|O\蜸8"]jvpxE:S#)%|?] Q D^7#X[cO#3/M BXhiZjtE"RA3d 3h!kZbL>DE) 9WPEҸgٽӻ+!$@KOKOAt;$yuN_S>+B"8ɞ hd9Xg*F!OQ^%zz~_Fgcv+5R#qMc1hzdIdL,DZ)V?6 w84&ċ2&q{f@zD2BZ#Fzl>/XU>QT ~/ JymojzGҸ׶DiS[5!BޏVQJ#R ih;"#9}uK٠oF}Z;G|g'w% O/X Үd;XDR"tS/+R9,[c]CJT5þdRh,ԶKvA+,/<:6;p>ϛҀqDs]Vr*"ײAZTѬ&?G8oPHnryO,A{-YN)J >[M -#^Ym/w!1K&ͺfD #k!D+[H""nfRd? dR5!XDI6'k&J^ȱ^ɛP+lQ~ -˜`= ̟C"@FhzQ7}JIIE 5̿8Bڦ]Ol[P@s5%B"j,7ٖr~1Y܅=/N*//^ }^Ese\N+_lѕiAF*$},nl#?ڑ?;D߫d")W,gu\e[Əy= MgG6nD QA2S%Q"!{"j#:SBTu\ y={E=o51Y BSJF-^c@# +Z "*i+X䫥hƷ\4*}kG ġV(o< d`+}L#fu{2f;pnP7SA#o'X[e*H.^iR5ʼEKщ(䙱kT3>t47BRZpVkEZiDM\b)<<2>պ B7pVԃH M 2NnɎl>gZV&w)$ifo^ɱ"bDݩH6W=K}Հ)Z?.tO[Z.]GSaΣ\K9K[䚑2Y="$?Jsőug݀vEsNW6p/2GXm$)|;7~/TfN$%u_ojD=`xU.oIJoyǭRl}._ݾ7+p*;E6ϡ!z]>a|7M2Tږ@ LOhR̝\ˊk v+Ҏ2F{Y +t !l9 vډF6Ƹ Z=Tֱ=Iٲ)>~`qG=ںOpZb d?p(@u]?klޡE]`MWa+B6; o^`E%<_xF14!=7(Ǐ{׊~y Rgm´ ʐ1VA"V+@M= wG"^sγВ2J"L PH&@"W4oYޕƌw \c)8j\oүEXȷJ\?SW#o|Ml2cӻK 9%yHŞdF!,{Eh"V4؃˧xLU zΏM%nD$ߙ~WՇIoBіg8J#vno(@ p+}/٤LF $45Ar ]PoBmWgjz*ibt+]WfK+ }iN$pIq3Ge6Z oTHKc8RZ.$?6RǓ/O>5Ϻi ¢kb>n9BxEfRro<j1Z#A8O܇+vwr[o֎9n7~ߗ-wh Z*{ B$K+?KR@*Ydzi)T*K xsX!`T5U@!rkעhCNVyRIOДo8.jr?bS$)dr[$ k-%G.;Wv&ڑ͏ػ z`<=Vsi؊٧1L{YPA?2HlE6a媦GyiUdGIIAth 07VyՌƞ ibzx~=T"3 :bpLLi&9Qճ {@IFLgt CEW`>fB8((undT^U|'Y4֩5!׮ïIH{W¶'yWcȱ`=2rRejŋ{akcކ@ s>vo*SqUH0l:ھ`)HgyK8و&bD^4ZOfw2A%*>Wuۅuo_ޒMY8*yt]Ah~Ld=ֶH:bK !ZEQ{$ֈU6e@\\k*4Υc#Z{rKm cǽ,Jlxf'y%8?^CKDat)\zbgޓG8ҁCYG* N ZoK!FN>Dҭ&?| $~I"hC:HfHDEZI\kͰR%\|rrU,%Ek<j)ޠwu껂sh8hzk~FA+yoMz~g[hh{7-ۂ]*i)ܥ~.xX݃ICY0X{`)iȗs wTRHx{.5J"A J8I_  5]rv3Փi;*4&k >S/ 4@F>8r߇.5"d0ƪ\y~%L%RC,J4\9ǒ p!>̥RJ%4(C/j 7sc_7@G8/k3$h n0w=gK ӡLit~nЈ}5 {>mW~@)hvgDpnbȯj4z Ϭ K!;FkFW1k-l, zrwnATH|@;|BkuWDq,;6B49zzǖ5WF2~`vPЁ)SRhlupUn~ \qi#yÁ J\۲\1x!qT @5}JyEU Mu"s+q+8 6x'D#7VR,ׅ-JFLsQ3Z q5#ujhUpRxfwv6gR.VoFKRگݷyd1x64P%UPjyt97tDUr6>MilL%mYs)0옃<x*?&`IhD)sGE[qlA4[P#w~=(־]tʂQ$B&qu㵰uɈfC1tks*Q!݃OVhiF,J;e-~-m)L\R;|9{q'~%JKaL P+v@r=VpG X8) PJF81MP0fϪWK%hg <ݫUX|~BX ҇!L4T4U?ZJ2Qe@+ 0Hc}m^z[( xvmkkհԦE&re# hh$Dq`bY T$&=Kq'988+7x^},VDlǔC[ODRy]Nh$|9m}Fdju7,bk N`0N~HݶF^@)`t5@r6\kj-}DE!QYٖImZBuKy⥅o-r3SnyY(ZeM(,`l~b 4wH`asGg':>M--XuD(R:H?BOA]nQ=i:m4jZ#`zX[OmVltk' 09P5L8-bu"FO; %Pj{&QI:@S-R4`fxLB0>Zհ[P~kac }(ulX\DJRȼ`J=/2Ǧ&ꪛ!w2V0IUkelD.FL!G Fs%tK 4sV ߉2CDv""@`IJ.%cUM|FUՄ ,U-%ҚeTrwX/Vy~m$5ZʤorΘ >6:O0Zg+Ǎ@F%ϓ` A jfe (6A!,RyJ a&]kw4U]0Fǜm#P7iVHbɏoq@2LR"¹Ǩ|"ݔh-GxM|~Xxxr4Ĺ1އv?tU45I R PTFbPpd>f(WMֈ_;G9]$W~*1ov$X{17hZptd\ ۖMW`kx5_T2}٠j&Fyi>Uk-?Ose)?$08B'MD1-68Q>ZЪ'7iÈɯ+HiNtr?'wfaHnh֊40:HKL.rQ9hqFb}oɿ?iH\U~$zʧS~M6*xMJl[* M8mVhS(CL:bȦtLʁLr+Kg:-!Qp#qu*}ZAh$PhFIy6#\~ (إВ>ܲ}ukD:WHY$))(B,IcTMHHH%w'D`s@K~D~.S#FH 7n NG4RZX0 `S.1K4aXlk'M^њ5+AO`g椓l' j`9F4X rK&= 4Ty ҉ϻ6hq @z)*9Es/"~~M r!8N%-~KTc4EʖpN uz>Rc^ڲ w ;6.Emf3C:jI8~m8 w?Jg9Cdi3+TT~I͢46=a "R)U~E:>XKԠN`I4rhra-$|s~24[i]0';62ө;G!n-oUF=ǯyo)ܕ $6QN%u7wvn![^]h?.*`KnA=cF0+d(&U0jlƽ9yx܇̒gnc!b.OWJ&-%'OB[vC'o!а-" Zk@y$eֳI8G[WG=X\.GsEjefij/#jբ?6ݐwdxz>#)@͌F8)^[8jDrxZDM;># !s&c@(EyQ#5G!J :4rWNy!Ks;XdN H+aDT4>O_ %#Djz cؐBZf5H|kfFf[k}1$"X<OSoT%SWs37ъI>W7 Iq!QKz^XBmHkVXqQ PͭbH/ESI{R鵀r-a$&J8A!\ĹLaHwCYE$[RCKR7"`{F՚KV6ayE|*xEE30AM|l5-hGR[0}aQ+}:}f8whF [~\{0*z9O 1BnA5R+"B6tj:;jTD+/]ivTnuiX S}l4ҭF6s^B5u>t,ՙV^фCyv)| ٶN R4-r PQR% $9oh~kABoܞ؊u(y+}:w*A+CbFN*M*jP_c+退~ Q>X`X0O}tH#n$J)Vxi!I\JbZ#^_<Fm!mI`sYW͡m4yEc%V#jE# p)%BZ[gS'c#̩͊44&b逾 xGҸn 'PGo+˟S+HKVD\fhKI)ps FcL OҬHi=RQj 9ہrzB?FrB߿n5꼳C#GFJdXGaoέ:Rx 2 îrSW 13މPgJ6a61y^5&x`QiqcS`BhȟA" Enkq,zF%bK$vl,=?-WYpl96 uW#޷m!,*;݃G [HVr n/ww\PViGD3B25  [q[d51dfpyzQx5yt M1v741zU, j!zH,U:%%s\N5;Ri,׋(1M-pU~ͅj־#3QbOP"d; Z/DB#Q#K'*Bp hz F"[ .RN UɹTY XR7>u^Mz!ֳs%C쾰ƟZ8Uz랏=<G4eev^K8~Fgf*V KKe&~mpy`ilVo 0loٕw'[rNXͶa_)}kIۉ ~tDӵWnAMlmt6O|%*-X*c`q.M~zHhʗpPq*N~})s|Vskdjmh)<+W~jJ$O}5!, { Cf5©1&7dt+"uZ`WZX#!Zgk<മsm4.#w *>6CJݲ m&\Zbl-ȅ/m]f1Q+ uㆻ6'vR@Mj#@kPm7otټz=]1MCy"Dxة w }{5U9y5V`T?͟%4yDs 8 Z')0.z±Y(n9n@( 5icBRx$rT7̝jaJ:±KH272$W1 fą ? 1]D yu, V:ClR[8ql*"@D48$"DV,I]Ϥ䓆C@dքGPr[gE,rpn{#Ԧ,xE;Dx-~1pA‰JDK_!^yfb`ޕFdbPy9h|Of-Ou԰0(@o Ua` CQ"),^=t]'k?*a8P[;lHe]$98 +1B%ts9o'h@W$@x@¬<i40[\q"B k>`ij{P6EZ6S5+nqBFp&%QHC^/=߻.KX#B{H%=6Fljg} ưisubvjs+ODMSUr5#+" c Fc8/)ۚfF60[7q!hSXg>Za';IU Ot6$FA9a[P~Z uAy>X~lTk!VT`uf᷀C4D]]ȕےG`\D R8i׹ɤ90K: XA\G DXdQzYŇG=űR0ɀ%=GkyN7\ri( t!ޣ{!bS wYH!}&Yut/͎cb i5V4yH d0=P2 wޗn׀y}4ľ&qau-hUOY8pSj1nTşSgNz4Z4iwr]"Fce9K˪V>%vBZ\ڀFXThmFh R"k, AiG`kuaJJjtYJ ٮx.)hty%jrxId/¼};hbCdhm4░WӄBKi\!l=^#fK.Ɵ:1-ܥODSJ41V$@"BYipND[L >z aH`m:BF/af:%H)&i8>I ]%8TZ:\J <ϩd fxD@3<\&?+ !2>^{e/A9eAsEF&oU N 'qI|LeP%/ܫ <r揨sdx[I Hx (x",mVTZB됯ٚc3T/%([wQ4PhTa=F,d5%FkU~M Sq] 20%p+ S%(%%g:1; +v-\ZQFVixBKڲ\*͹Ud|dp5$dsT)o\,l5$*!rF͓|ɦZ/hQ}dhZ/*[K$Ruq`H&DTa$tR~l#[K )1PT6me 0v|HL6Yʪ<ΥbdilJZѽc?Q;cN#dQjKk)O,A! xwD3fm#ֈj +㡕Dp/?CM qWh(ՕS* ֈؓ75x \](aCn[~-WkStޚV#BRVh>Z*|a"[T"~0 "ِmK TH8ȿ54aW d б^!>%ɯcy ,ش!SrKq:OUɴTp+GҰ-8JS{JtXmQA8.r} ᷤX /t_+}D1MBpF[ʅ R-)9'%]%#@ɤ[a2bXknɿ{hLn.\[MSڤ3{bJ:sz:|mqy5DEH]u@8jX^A< 7sRE&\v$Hu,^<M 궃>V'MyB =Ç?wB2" MU8E ٌV׷)@sr TJ 00fFiQ1G<}VaFeNkMۢ2[\bE<ӡSQЖ}]uAܡ{6*EB3UTTrH@ ᵞݺT |Tei^|b#<;Lm8 &od}{O$OF1+p?S Mis7G]r] JMB_sO"S#)Ru[+\+E~", sRbk%#1‰M]LiVzsk]Cޮ|EއQ$.v"dsh *z J2?jE./ME0%bhByh"V j la8D -5xWK:"X_,Ǻcfޝj$ZEpuSE~9yR ZT#RV<ץH:N4S!x;f?@hn{tQZ? F_K-z]XCG$x}D5q&~H '%KZ8rFWF|DJ$1!ZN/oz}k6u!{[# P pTdh> AY" T1>{$NSaFࠠ.?^F-#Vqs.`a8pHZ7T-u)%DRzi NUmBFՕ9pCXq!XKd^"ij%"!~@X!|[PY_wnW]>,tҹNt6hWJ2RI%R۲$!/gF#hـi;K[Շd\rolc˳l], &o4Sj#@5_C"vwM,ӯX>9ix0̧]oCpChCkh:"RC}D JZhz ZyF{rY);,+gG2 q !k. D4tVѸs}X$͔ 9A򍔷tQ'D UJyR;%[ ݳ? {8>ьD` R +H-;\[1 WQCrL0Sp 3a&XUβRLN.+E؍FHeܲI?BS<9F t /nحI*<1F7-1>̓CgV+mz|d+V{?HIfG0_one'БR=qESw ە@RrYN̦t'hS7DBkBD;e +BǐL~.tb2@"sNpNj6f|='k B80Z{VE  UoAS}8QS`)q=r 0߾hi.}m–cX뜧]Cxi:N*<٧F^)Llѽ5Mf5%aU#wvPl8 RyZcl&!,T*! Ǻivh׼@0\$1>XjDxD(yc$tk# Ma$ uRsNʖJx ^ڈ`.>p:->՗XQe <ba ʝ_t1mMQhoQ%U{ X挹qx#3V>[]CAx]BںozTiw춚2IQ$]s>x-y$.3.H yyDה5ɦ8Z`Pj!X<r!8)&Җm^]$"VtW[[לbB[Yjߩgl!  `L ,h,WQLmF9<"ioA.qQކ9e:5,{R}7<4h ,@ HyN3^.i=ɄVVԕ!n ["l_zgy ߚj^ kh.TM:2YP8IEX<)Cع&Ŏl~x; 'hn.=dRwx}.Kyh_st;}0IsS2wMmNqd#Zr,&*wFZB2;%ΤWW:j Ml kmwie}kF6"ᇇV SaMp|9[M!s7YPHx EsD,&(Z٣5RHIBpO;54`_[Y)EB7PM=$QH{ WߐW2g!ߖ+w8yα{".n5pA4]adO8@z p9(1ςH6i{uDlw 5$a{#'_w5QABqW)D&AR,ω51BV<1va@{N/h$ %/}YDP"zZaSkO9 B$h`_^G:2a7`AkSӄ|b÷Tĩ{wu>e]C#*ĀLTUX%jKB'̒GIB-",+m5AX8T QBѡ~nvqEF5p8fzD[mM}*˞c T(#-I z}Pxm=[$#Bhl3vds?Qw3T9`iJdߗw&eO. UM:UQ`mH#2o;n;оkw%VJ>=_pC !m{{7$<^aH(~ΛC{24ZDk+7G4$҈$4#yHVLLkY?nXd}]mY_Ih׳ƾj$}t0(9 ##7(I$ !i.૖B6wxUMs}fB9ݪbQhj-*$Bi#""R`^|n`b YC-L{T.sߩ*5F-Z&m0/u9mbDxϑlmYpkKjF޴\iaO)(9"H"}u{jzM{m.;%:6X(UҁL^߾{W&}J!iUO˼oe pΥBKhFqZjLr"cGI9FRh[2w5vnx^[jN%o{cofd~9BBoR%/q2ךv+>QXeZY약5 i"Bc|Dp֖ߓH ԫVy)@%ٵۛD 7vЩ= ,yHOzoBך$&C4ޭsR‰Tkܰf3f8,;F# ]V ~ψB2i^F¹ߖ%^fOA>(@T ߏP"9lR8-y$ ,̶‰͕LdLORA<\EN(͹95 Bz~= PگqIHf}s;f^ľiwYQ!ʵƸCD$4Uzr l?L2ZхbRF%"ڦ 6<3UM$HpJDPhs&l?*}2'ȠmQ<P[0B5[< -,),E waسwg;zT ѽcd+e-Q3~0$?Tf#`4F-6@#nhq G !]Su9/ ;f "߄޷"cM8WY[$QLhJĐI^JSiLJ\X4$0&"v>d|#mPtw>%r,23z)^Ѽ gp$]zpiCkG%Tl@y=@&JI~tbB4:[ ]0,&I#{{$Ѽky'd\T@p=ʨ}&5 l_H$JD~*hQ \#z.|fQԼ R~>YP"LMIH%%,CRiD $[Z3J`48748!U󓮿fD(ߏ>}~ĕ6JFmV38&8ьvH(JSq7:)@WX UHT.bd)>eJx k,|'pDqA54i/%Q8r6׃C<<@u#Z͎1I {%jN=I/>ѿtBsoS/^ӉNZ!T%.P *bDqđo-;idyH=% L_\Sn$2aH7KAQ1׫gZ r%|~[ 'F ނş鼀pAqy ֯B_Vݼ$Q *sP&%RS8 Lt" h+KfH49579 G,ppy#^:Jg^MBB}(0EI ou`F#^#JVovGĞ<캝M+_}~d~>d"ABHF&id.H$ր剦ak' N G2/fzQ (T3 6@=l1qM>$gB8w6[{ M}oI~wPU@vvЯ'KA 6NT7,}70$d"hMm $Α҉D\qEI R0pB #'VcMbCͶn+P aD,wnEο'S~yK6>u7|#+Vbw f{Wua_z(|D>b d0 [ ::S|!!nexjDCi nlO"U~&RALp~ ܓMd7 ,x#;d&pԝ`Uo{If"HW4(rk@5J[Ao?'{ d{3\pu>,S\unVhDdaF$‘qETAO S0B@"aP^Uỉ؂@#PE=+ ϊ4E gCeʝ^йܛH ,q򭷔(Tcgc~D"1qV%lmGN4r#jFmIտbTS۔9$LTuWszs^牬\n RD)Tlnz^+P4#DuSK&DXhzo`4H'(Tf[2GK- PNIQr6V}8e'5im~}WJv$tW8w(%{S0wYbGHϐH$òD(Ŧa eDl0A~Bxt9:2O/ x#Wm8J$i@ߝ oonzA&dUETw'?c:O$D>`Y9a ѝ ,XFǀQԽiϬ 8DUNAZ%7nu4y?B)M"H$QX^ѴH%{H"'b Yd}j?hZ7ɭ.Ė! A5dDzzQD:'D"ͦ4>`K7Sj`H:Yl?lNhE޺ooJ/H$ƢDs6-pGfT.OB>tqDչV{&pP89%%4 K H$h+UjppH#`W+} %I=tR7<$KVvÅ) iD"H:)DAW,TZ r KDXXw݊tn`?H/VnuB+t9b"H$#DB,deLܿ4nϡ}i:>yiqc"H$Do;-E/GGsGJBMT%wtZK$D"HX Dօ+4LJH$D"q4 D D"H$D"H$y f"H$Db$L$D"H,$D"H$E5܂nIENDB`C<(/z/ 0DTimes New Romandb|7 0 0DStarSymbolomandb|7 0 0 DArialmbolomandb|7 0 0"0DCourier Newmandb|7 0 01@DMath C Newmandb|7 0 0PDTimes-Romanmandb|7 0 0`DTimes-Italicandb|7 0 0pDMath Btalicandb|7 0 0DWingdingsicandb|7 0 0d .  @n?" dd@  @@`` xp<9   "#$/!1?$&U)[+,-./01   "#%'*3456789:;24b$H|F"DePT0b$ovT#`0 T0b$*h%1%Z`0b$#A!uON0b$(3&j}@0b$q a3D!@S0b$ wD %tQy0c $@ g4LdLd7 0ppp@ <4 0DPcg4;d;d7 0(p@ ppuʚ;2Nʚ;<4dddd@ 0<4BdBd@ 0 ___PPT9/ 0h(.TCheckFence: Checking Consistency of Concurrent Data Types on Relaxed Memory Models,U] $!J$ USebastian Burckhardt Rajeev Alur Milo M. K. Martin Department of Computer and Information Science University of Pennsylvania June 6, 2007 D38]Y(3X  General Motivation]  Specific Motivation]  6 concurrency libaries with lock-free synchronization,7P]uk4k 7L... are simple, fast, and safe to use concurrent versions of queues, sets, maps, etc. more concurrency, less waiting fewer deadlocks ... are notoriously hard to design and verify tricky interleavings routinely escape reasoning and testing exposed to relaxed memory models code needs to contain memory fences for correct operation!|&%0 ]a.%0Z& a.]; M... are simple, fast, and safe to use concurrent versions of queues, sets, vectors, etc. more concurrency, less waiting fewer deadlocks ... are notoriously hard to design and verify tricky interleavings exposed to relaxed memory models code needs memory fences for correct operations|&%0 ]d.%0Zf& d.60 Specific Motivation]  Bridging the Gap]   Example: Nonblocking Queue] MThe implementation optimized: no locks. not race-free exposed to memory modelV0] &$ k& N <The client program on multiple processors calls operations 60]) k) = Michael & Scott s Nonblocking Queue [Principles of Distributed Computing (PODC) 1996] ,W]$$1 Wboolean_t dequeue(queue_t *queue, value_t *pvalue) { node_t *head; node_t *tail; node_t *next; while (true) { head = queue->head; tail = queue->tail; next = head->next; if (head == queue->head) { if (head == tail) { if (next == 0) return false; cas(&queue->tail, (uint32) tail, (uint32) next); } else { *pvalue = next->value; if (cas(&queue->head, (uint32) head, (uint32) next)) break; } } } delete_node(head); return true; } b0" K./</N  Correctness Condition ](  Data type implementations must appear sequentially consistent to the client program: the observed argument and return values must be consistent with some interleaved, atomic execution of the operations. LW0]x @w   Part II: Solution]   Bounded Model Checker"]k   Demo: CheckFence Tool]   Example: Memory Model Bug] %Processor 1 links new node into list( 0] & & Tool Architecture]    Which Memory Model?] Memory models are platform dependent & ridden with details We use a conservative abstract approximation  Relaxed to capture common effects Once code is correct for Relaxed, it is correct for stronger models Finding simple, general abstraction is hard (work in progress)p;0] h3c Part VI: Results]  <Studied Algorithms( Results] Results] Typical Tool Performance]  Very efficient on small testcases (< 100 memory accesses) Example (nonblocking queue): T0 = i (e | d) T1 = i (e | e | d | d ) - find counterexamples within a few seconds - verify within a few minutes - enough to cover all 9 fences in nonblocking queue Slows down with increasing number of memory accesses in test Example (snark deque): Dq = ( pop_l | pop_l | pop_r | pop_r | push_l | push_l | push_r | push_r ) - has 134 memory accesses (77 loads, 57 stores) - Dq finds second snark bug within ~1 hour Does not scale past ~300 memory accesses v]$92k<J\* ! Related Work ]  Bounded Software Model Checking Clarke, Kroening, Lerda (TACAS'04) Rabinovitz, Grumberg (CAV'05) Correctness Conditions for Concurrent Data Types Herlihy, Wing (TOPLAS'90) Alur, McMillan, Peled (LICS'96) Operational Memory Models & Explicit Model Checking Park, Dill (SPAA'95) Huynh, Roychoudhury (FM'06) Axiomatic Memory Models & SAT solvers Yang, Gopalakrishnan, Lindstrom, Slind (IPDPS'04) c%0]o% 4%0]%   1#45&1  Contribution ]  First model checker for C code on relaxed memory models. Handles ``reasonable  subset of C (conditionals, loops, pointers, arrays, structures, function calls, dynamic memory allocation) No formal specifications or annotations required Requires manually written test suite Soundly verifies & falsifies individual tests, produces counterexamples PA0 /">'\ dBounded Model Checker"]k   Future Work ]  YMake CheckFence publicly available Experiment with more memory models hardware (PPC, Itanium), language (Java, C++ volatiles) Improve solver component enhance SAT solver support for total/partial orders Develop reasoning techniques for relaxed memory models Develop scalable methods for finding specific, common bugs Build concurrent library #0]$ 9  4   #$94   ZAxioms for Relaxed"]   A set of addresses V set of values X set of memory accesses S ` X subset of stores L ` X subset of loads a(x) memory address of x v(x) value loaded or stored by x <p is a partial order over X (program order) <m is a total order over X (memory order) For a load l c L, define the following set of stores that are  visible to l : S(l) = { s c S | a(s) = a(l) and (s <m l or s <p l ) } Executions for the model Relaxed are defined by the following axioms: 1. If x <p y and a(x) = a(y) and y c S, then x <m y 2. For l c L and s c S(l), always either v(l) = v(s) or there exists another store s c S(l) such that s <m s @'%0!]%0!Z0ZY%0!ZO0Z?%0!Z0Z0" Z0Z!!!!!!!!!!!!!,!!7@!    /     B  / !"#$%&'() * + , - ./023456789:;PC ` ̙33` ` ff3333f` 333MMM` f` f` 3x?" dd , %-   ?" dd  %  %" @% ` v?" dd    " @ `@p?" dd    @@``PJ ! !@!`!`f d  " d@@ d``dpB!!   B!!    c[(  *  6_ж_ж  *&. ] Z @` @ `  @`  H N  W#Click to edit the title text format$ $  B0   Click to edit the outline text format Second Outline Level Third Outline Level Fourth Outline Level Fifth Outline Level Sixth Outline Level Seventh Outline Level Eighth Outline Level Ninth Outline Level&g B  s *޽h ? ̙33 Default Design 0 | (  R"  s *G$ 0L"  c $G 0^  S  ?NH     0<  K!  0 $  6Ejhjh  0 * . ]  Z @` @ `  @`<  c $çjB ? ̙33    H(      N_ж_ж ``   nZ @` @ `  @`   NL_ж_ж `   nZ @` @ `  @`<  c $޽h ? ̙336  E   j (     N$_ж_ж Uu   nZ @` @ `  @`@  C A   8    N"  S G&  ;"  <_ж_жG&   Multi-threaded Software . ]" Z @` @ `  @`8  u  uN"  S G'  v@"  <_ж_жG'  v Shared-memory Multiprocessor . ]" Z @` @ `  @`8       N"   S G    9"   <|_ж_жG     Concurrent Executions . ]" Z @` @ `  @`    BC DE F($h6   h@7N    BIC DE F($:^  H@ E   BCrDE F($rrqXXr@ - 8     N"  S GF  ("  <_ж_жGF   Bugs . ]" Z @` @ `  @`:  3 A } s:  3 A :  3 A{ C<  c $޽h ? ̙33  QI (     Nh_ж_ж Uu   nZ @` @ `  @`@  C A   98    N"  S G&  "  <_ж_жG&   'EMulti-threaded Software lock-free synchronization (intentional races)R. ].. "&& FZ @` @ `  @`8  u  uN"  S G'  vj"  <_ж_жG'  v 6Shared-memory Multiprocessor with relaxed memory model07. ]"& 7Z @` @ `  @` 8       N"   S G    l"   < _ж_жG     8Concurrent Executions not always sequentially consistent09. ]"#& 9Z @` @ `  @`    BC DE F($h6   h@7N    BIC DE F($:^  H@ E   BCrDE F($rrqXXr@ - 8     N"  S GF  ("  <L_ж_жGF   Bugs . ]" Z @` @ `  @`:  3 A } s:  3 A{ C:  3 AB 2 :  3 Af& :  3 A:  3 A <  c $޽h ? ̙33 E #(  X"  0G:kk;   NL=_ж_жkk v$;   nZ @` @ `  @`   NA_ж_ж c  jV>^~ > ^ ~ >^~F"  S G )  6L_ж_ж Uu Specific Motivation . ], Z @` @ `  @`<  c $޽h ? ̙33q   (     N4q_ж_ж c  jV>^~ > ^ ~ >^~F"  S G    Ny_ж_ж Uu   nZ @` @ `  @`8 O4  4 O@ O4  O4   B_CDEF$__ @O4   B_CDEF$_]P @O4    BRCDEFH$QQpQ @4    B_CDEF$$_P]_ @Oz   BRCDEF$QQp @O4 /@ {   { N"   S G  {   6_ж_ж {  ADATA TYPE IMPLEMENTATIONS ARE TINY tens to hundreds lines of codeJ#. ]. #  BZ @` @ `  @`8 O"  O" @ O"  O"   BC`C#DEF$B`B`"" @O#   BC`C%DEFs$B`]$s$ @O#;  BtC#DEF\$ss"$s @"   BC`C%DEFn$B`$$s]B`$ @O% #   BtC#DEFg$"s$s" @O ,@ ;%  ;% N"  S G ;&   6Č_ж_ж <&  >CLIENT PROGRAMS MAY BE LARGE thousands, millions lines of codeJ. ]". "  ?Z @` @ `  @`X"  0G:kk;|  B<_ж_жkk v$; 6 concurrency libaries with lock-free synchronizationD7.X ]ukkk 7Z @` @ `  @`<  c $޽h ? ̙33} E   (      N~_ж_ж 00 P   nZ @` @ `  @`  B/C3DE(F {o {nb$,*: /=,(6%N./31"/ @    yc  0_ж_ж   7Architecture: + Multiprocessors + Relaxed memory models<. ]*. * 8Z @` @ `  @`  B8C/DE(F {o 853#*)@"/ ',I3%?y @   S1a  0_ж_ж  7Concurrent Algorithms: + Lock-free queues, sets, deques:. ]!. ! 8Z @` @ `  @`  BGCUDE(F {o 1UdGKxAfB4 'p ")5GW @   } *u  0_ж_ж   ms IComputer-Aided Verification: + Model check C code + Sound counterexamples<. ]-. - JZ @` @ `  @` 8 a;c   ;ac @ H 1   H 1 Z2   s *oH 2 @ I     I   N"   S G! I   1   6l_ж_ж I    CheckFence Tool$. ] Z @` @ `  @`@   c     c f"   6?Gb$l H f"   6?G$>j1 f"   6?G$B I n @ az   az f"   67Ga$xW o f"   67G$fJx f"   67G$I v @  ;] ;   ;] ;f"   6G[$"  f"   6G$ <" 2f"   6G$ F> =_   0_ж_ж S@  ?methodology described in our papers in [CAV 2006], [PLDI 2007](@0  ]@& @Z @` @ `  @`<  c $޽h ? ̙33 E NF0!!$(  $^" $ 6G$0 L^" $ 6G $0<l  $  N<_ж_ж x   nZ @` @ `  @` $  N,1_ж_ж    jV>^~ > ^ ~ >^~ $  N_ж_ж  < P  jV>^~ > ^ ~ >^~]8   $ @   $  $ BCDEF $   @   $ BCDEF$$$$ZS: @   9@   $N"  $ S G   $ 6@D_ж_ж  %5.... ... enqueue(1) ... enqueue(2) .... .... ....`. ]1.     6Z @` @ `  @`8 xTq  $xTqN" $ S GV xUr-" $ <xP_ж_жGV xUr  Processor 1 . ]  Z @` @ `  @`P8   $ @   $  $ BCDEF $   @  $ BCDEF$$$$[S: @ ?  ,@   $ N" $ S G   $ 6t]_ж_ж   (.... ... ... a = dequeue() b = dequeue()`. ]$.    )Z @` @ `  @`8 xt q $xt qN" $ S GV xu r-" $ <m_ж_жGV xu r  Processor 2 . ]  Z @` @ `  @`g8  wj  $w j @  i  $ i  $ BCDEF $c @ j  $ B$CiDEF$$$$hX&#h @ 3 j C@  wjZ  $ wjZ N" $ S G  k=   $ 6^~ > ^ ~ >^~(R" ( s *Gp$P` X" ( 0Gv81 FB ( S D816 7@B ( C D81R S y8 N (N`" ( 0G81O@ N  (NN"  ( S G O#  ( 6س_ж_ж O 1$. ]# Z @` @ `  @`FB  ( S D8167@B  ( C D81y8  (`" ( 0G81@  (N" ( S G # ( 6_ж_ж  2$. ]# Z @` @ `  @`FB ( S D816.B7@B ( C D81y8 P (P`" ( 0G81P@ P (PN" ( S G P# ( 6_ж_ж P 3$. ]# Z @` @ `  @`@B ( C D81@B ( C D$@B ( C D$FB ( S D$R S K ( 0_ж_ж N0 @5 head&. ]# Z @` @ `  @`R" ( s *Gp$PFB  ( S D$zK !( 0_ж_ж N5 tail&. ]# Z @` @ `  @`< "( c $޽h ? ̙33 E p"#,H(  , ,  N_ж_ж y   nZ @` @ `  @` ,  N5_ж_ж   R><|< | <|^" , 6G$% i@ S8  W  , W @  W  , W  , BC DEF $  @ X  , BCDEF$$$$C @ ? X @    ,  N"  , S G%   G  , 6_ж_ж    enqueue(1) dequeue() -> 20 . ].  Z @` @ `  @`8   ! W   , ! W @   W   ,  W   , BC DEF $  @  ! X  , BCDEF$$$$sCk @ { ! X @   !  ,  ! N" , S G%   " G , 6%_ж_ж   "  enqueue(2) dequeue() -> 10 . ].  Z @` @ `  @`8 `U N  ,U `N N" , S GV `U O -" , <1_ж_жGV `U O   Observation . ]  Z @` @ `  @`^" , 6G$% S8  K D  ,K D N" , S GV  K E 6" , <6_ж_жGV  K E  Witness Interleaving. ] Z @` @ `  @`18   , @  r   , r   , BC7DEF $w 66 @ r   , BOCDEF$$$$@N @    @   , N" , S G  r  g , 6F_ж_ж   9 enqueue(1) enqueue(2) dequeue() -> 1 dequeue() -> 2 0 . ]-. : :Z @` @ `  @`.8 q  ,qf" !, 6GIy$qx ", 0R" 4 s *Gkk =  4  N_ж_ж Vv   nZ @` @ `  @`RB 4 s *D {{RB 4 s *D {{] RB 4 s *D {x : 4 3 Akh 4 0_ж_ж ;  >\Pass: all executions of the test are observationally equivalent to a serial execution Fail:RV. ]. &R"& ]Z @` @ `  @`RB  4 s *D) RB  4 s *DJ K|8 '   4' Z"  4 s *G8$' j@ '   4' N" 4 S G8 ' j, 4 6_ж_ж '   CheckFence$ . ]  Z @` @ `  @`8   4  T" 4 c $G)$ @   4 N" 4 S G)  8 4 <8_ж_ж  Memory Model Axioms . ] Z @` @ `  @`: 4 3 A" : 4 3 Aj"~N RB 4 s *Dy 2 J 4 0Բ_ж_ж + Z &  *Inconclusive: runs out of time or memory0+. ] &" +Z @` @ `  @`< 4 c $޽h ? ̙33   8<(  8 8  N_ж_ж p   nZ @` @ `  @`< 8 c $޽h ? ̙33  E f^.<(  < <  N_ж_ж    nZ @` @ `  @` <  N_ж_ж `   jV>^~ > ^ ~ >^~8  `.9 <` .9N" < S G"  `/Q < 082_ж_ж  `/: )Processor 2 reads value at head of list . . ]. * *\ 6Vv  6 Vv6VL" < c $G$ 8 (  < (N" < S GK (  M"  < < _ж_жGK (   )--> Processor 2 loads uninitialized value *. ]* *Z @` @ `  @`;8 P   <P N"  < S G PN   < 0 _ж_ж P  53 ... 3 node->value = 2; ... 1 head = node; ...p. ^..  4\ 6Vv  6 Vv6V 8 X F|   <X F| N" < S G X G} o < 0@_ж_ж X G}  # ... 2 value = head->value; ...R. ^.  $\ 6Vv  6 Vv6Vq < 0*_ж_ж  $  IProcessor 1 reorders the stores! memory accesses happen in order 1 2 38J. ]"" JZ @` @ `  @`` < 0P7_ж_ж } >adding a fence between lines on left side prevents reordering.2?. ] 1 ?Z @` @ `  @`R" < s *Gp$kX" < 0Gv818FB < S D81@B < C D81\]9y8 cY J <cY J`" < 0G81Z *@ cY J <cY JN" < S G Z *# < 6L_ж_ж cZ K 1$. ]# Z @` @ `  @`FB < S D81 @B < C D81 )y8  i E <i E`" < 0G81  *@  i E < i EN"  < S G   *# !< 6$X_ж_ж  i F 2$. ]# Z @` @ `  @`FB "< S D819 M @B #< C D81 'y8 [ iE $<i[ E`" %< 0G81[ *@ [ iE &<[ iEN" '< S G [ *# (< 6__ж_ж [ iF 3$. ]# Z @` @ `  @`@B )< C D81)@B *< C D$+@B +< C D$+FB ,< S D$9\] -< 0o_ж_ж ;K head&. ]# Z @` @ `  @`< .< c $޽h ? ̙33  E 0@&(  @: @ 3 A+  @  N_ж_ж H    nZ @` @ `  @` @ 0_ж_ж  C code". ]" Z @` @ `  @`z8 a  @a f" @ 6G {Jb TB @ c $D {JCTB @ c $D {JCLTB @ c $D {JsTB  @ c $D {JC  TB  @ c $D {JC    @ 0d_ж_ж @ :   Symbolic Test". ]" Z @` @ `  @`^"  @ 6G8 {JcLB  @ c $D {JWXLB @ c $D {JopLB @ c $D {JCLB @ c $D {JLB @ c $D {JLB @ c $D {JLB @ c $D {J+,LB @ c $D {JDCELB @ c $D {JtuLB @ c $D {JtuLB @ c $D {J<=LB @ c $D {JLB @ c $D {J$%j" @ BG>c {JB&j" @ BG>c {J !8 1 @1T" @ c $GW 2 @ 0_ж_ж 2 Trace". ]" Z @` @ `  @`^" @ 6G8$ LB  @ c $D$W:XLB !@ c $D$o:DpLB "@ c $D$jLB #@ c $D$:LB $@ c $D$:LB %@ c $D$9LB &@ c $D$-9C.LB '@ c $D$FiGLB (@ c $D$^9_LB )@ c $D$w9xLB *@ c $D$<:=LB +@ c $D$:LB ,@ c $D$$:%j" -@ BG>c$~iMj" .@ BG>c$0# /@ 0_ж_ж  R{ Symbolic test is nondeterministic, has exponentially many executions (due to symbolic inputs, dyn. memory allocation, interleaving/reordering of instructions). CheckFence solves for  bad executions.pE.8 P\.8 P(.8 PE[( Z @` @ `  @`< 0@ c $޽h ? ̙33f E 0>D(  D: D 3 AYL  D 0,,_ж_ж  C code". ]" Z @` @ `  @`z8  J+  D J+ f" D 6G {J K) TB D c $D {J-  TB D c $D {J- 6 TB D c $D {J]  TB D c $D {J-  TB  D c $D {J-* +   D 01_ж_ж Q K   Symbolic Test". ]" Z @` @ `  @`^"  D 6G8 {JLLB  D c $D {JhuiLB  D c $D {JLB D c $D {J,LB D c $D {JLB D c $D {JLB D c $D {J$u%LB D c $D {J<=LB D c $D {JT,ULB D c $D {JLB D c $D {JLB D c $D {JMuNLB D c $D {J v LB D c $D {J4u5j" D BG>c {J+j" D BG>c {Jw18  DT" D c $GW  D 0DI_ж_ж  Trace". ]" Z @` @ `  @`^" D 6G8$47LB D c $D$hLB  D c $D$hrLB !D c $D$)LB "D c $D$h)LB #D c $D$hLB $D c $D$SgTLB %D c $D$kgqlLB &D c $D$(LB 'D c $D$g(LB (D c $D$gLB )D c $D$zh{LB *D c $D$:h;LB +D c $D$bhcj" ,D BG>c${j" -D BG>c$F^aR2 .D s * *U  z8  J+  /D J+ f" 0D 6G {J K) TB 1D c $D {J-  TB 2D c $D {J- 6 TB 3D c $D {J]  TB 4D c $D {J-  TB 5D c $D {J-* +  6D 0lT_ж_ж Q K   Symbolic Test". ]" Z @` @ `  @`R2 7D s * * + . 8D 0__ж_ж D  J automatic, lazy loop unrolling . ] Z @` @ `  @`R2 9D s * *H 4i 8 k D I :DD k IN" ;D S G) k D Ju" D c $޽h ? ̙33 E @H(  Hd2 H < ^^."O$   j2 H B ^^."O$ j2 H By ^^."O$ y d2 H < ^^."O$@0 d2 H < ^^."O$0@ d2 H < ^^."O$  H  N_ж_ж  p   nZ @` @ `  @` H  N$[_ж_ж  P  jV>^~ > ^ ~ >^~R2  H s *3$   H 0T_ж_ж @ TSO*. ]'" Z @` @ `  @`  H 0_ж_ж @ PSO*. ]'" Z @` @ `  @`  H 04_ж_ж    V  IA-32*. ]'" Z @` @ `  @`  H 0_ж_ж  @  Alpha*. ]'" Z @` @ `  @`! H 0$!_ж_ж  @ Relaxed*. ]' Z @` @ `  @` H 0`&_ж_ж 0p RMO*. ]'" Z @` @ `  @`R2 H s *3$9`Y  H 0L6_ж_ж  z6*. ]'" Z @` @ `  @` H 0A_ж_ж B0 )  SC*. ]' Z @` @ `  @`< H c $޽h ? ̙33  `L<(  L L  NĎ_ж_ж p   nZ @` @ `  @`< L c $޽h ? ̙330$ E ## /#(  Z"z `e   #"2&3      %  l <0?@ e  l Bounded Tags    @ @` j <X&? @  i CAS-based    @ @` h <(?  " snark algorithm @ @` f <?  Nonblocking list&f @ @` d <?  Lazy list-based set$! @ @` b <ȟ?  rNon-blocking queue @ @` ` <?  nTwo-lock queue @ @` ^ <t?`  m Description    @ @` [ <5? @ e  g100 @ @` Y < )? @  g100 @ @` W <$?  g100 @ @` U <X?   g100 @ @` S < ?   g100 @ @` Q <T?   g100 @ @` O <d?   g100 @ @` M <0? `  eloc @ @`!  <? e  M. Moir (PODC 1997)P  @ @`  <A? @  hLL/VL/SC    @ @`  <?@ e  hLL/VL/SC    @ @`%  <@8?   D. Detlefs et al. (DISC 2000)J @ @`   < ?   eDeque @ @`#   <h'?   T. Harris (DISC 2001)P  @ @`   <h5?  cSet @ @`  <;?  Heller et al. (OPODIS 2005)@   @ @`  <K? cSet @ @`  <`? eQueue @ @`0  <4b?  $M. Michael and L. Scott (PODC 1996)N%% @ @`  <L.? eQueue @ @`  <t? ` hSource @ @`  <v?` fType @ @``B  0o ?``ZB  s *1 ?ZB  s *1 ? ZB  s *1 ?ZB  s *1 ?ZB  s *1 ?  ZB  s *1 ?  `B   0o ?e e `B ! 0o ?`e ZB " s *1 ?`e `B $ 0o ?`e ZB % s *1 ?@ @ ZB N s *1 ? ` e ZB _ s *1 ? ` e x & c $0     v:޽h ?\home\sburck\vfat\web\bg.gif ̙332 E ^2V2GZT1(  T8-8 hH ThHN" T S G] c IN" T S G] } cN" T S G]   }@    T  N" T S G^   # T 0ȏ_ж_ж    2 known$.0 ] Z @` @ `  @`N" T S G]   @     T  N"  T S G^   %  T 0X_ж_ж     1 unknown$ .0 ]  Z @` @ `  @`N"  T S G]   N"  T S G]   @ h   Th  N" T S G h  > T 0ܟ_ж_ж h    regular bugs:.0 ].   Z @` @ `  @`@ cG TcGN" T S G^ cH( T 0_ж_ж cH  Bounded Tags$ .0 ]  Z @` @ `  @`@ }a T}aN" T S G^ }b% T 0_ж_ж }b  CAS-based$ .0 ]  Z @` @ `  @`@  { T {N" T S G^  |6 T 0t_ж_ж  | fixed  snark $.0 ] Z @` @ `  @`@    T  N" T S G^   < T 0_ж_ж     original  snark $.0 ] Z @` @ `  @`@    T  N" T S G^   , T 0_ж_ж    Nonblocking list$.0 ] Z @` @ `  @`@     T  N" !T S G^   0 "T 0$_ж_ж    Lazy list-based set $.0 ] Z @` @ `  @`@  D {  #T D { N" $T S G^  E . %T 0_ж_ж  E |  Non-blocking queue$.0 ] Z @` @ `  @`@    &T  N" 'T S G^   * (T 0_ж_ж    Two-lock queue$.0 ] Z @` @ `  @`@ h  )Th N" *T S G h ) +T 0t _ж_ж h   Description& .0 ]  Z @` @ `  @`@    ,T  N" -T S G^   ! .T 0_ж_ж    Deque$.0 ] Z @` @ `  @`@ }a /T}aN" 0T S G^ }b$ 1T 0_ж_ж }b LL/VL/SC$ .0 ]  Z @` @ `  @`@ cG 2TcGN" 3T S G^ cH$ 4T 02_ж_ж cH LL/VL/SC$ .0 ]  Z @` @ `  @`@  { 5T {N" 6T S G^  |! 7T 0,>_ж_ж  | Deque$.0 ] Z @` @ `  @`@    8T  N" 9T S G^    :T 0`I_ж_ж    Set$.0 ] Z @` @ `  @`@    ;T  N" T  N" ?T S G^   ! @T 0X__ж_ж    Queue$.0 ] Z @` @ `  @`@    AT  N" BT S G^   ! CT 0Pj_ж_ж    Queue$.0 ] Z @` @ `  @`@ h  DTh N" ET S G h " FT 0Tn_ж_ж h  Type&.0 ] Z @` @ `  @`HB GT C DohiHB HT C D81  HB IT C D81  HB JT C D81  HB KT C D81  HB LT C D81  HB MT C D81}~HB NT C DoHIHB OT C DohHHB PT C D81hHHB QT C Do h HHB RT C D81cdHB ST C D81  HB TT C D81hH UT  NĀ_ж_ж `p   nZ @` @ `  @`8 `~> VT`~>N" WT S G  `?x XT 0D_ж_ж `? snark algorithm has 2 known bugs, we found them lazy list-based set had a unknown bug (missing initialization; missed by formal correctness proof [CAV 2006] because of hand-translation of pseudocode) 00  U0  33U. $ $$$ $t&& ^42Rr  2Rr2RX" YT 0GM& $b< ZT c $޽h ? ̙33a E aaX`(  X[8 hH XhH@  h_ X h_N" X S GW  h`1 X 0'8_ж_ж  h` # Fences inserted(.8 ]33 Z @` @ `  @`N" X S G] c IN" X S G] } cN" X S G]   }@    X  N"  X S G^   #  X 0;8_ж_ж    2 known$.0 ] Z @` @ `  @`N"  X S G]   @     X  N"  X S G^   % X 0?8_ж_ж     1 unknown$ .0 ]  Z @` @ `  @`N" X S G]   N" X S G]   @ h   Xh  N" X S G h  > X 0K8_ж_ж h    regular bugs:.0 ].   Z @` @ `  @`N" X S G]  c IN" X S G]  } c@  { X {N" X S G^  | X 0`8_ж_ж  | 4&.8 ]33 Z @` @ `  @`N" X S G]  @   X N" X S G^   X 0Tk8_ж_ж   1&.8 ]33 Z @` @ `  @`@   X N" X S G^   X 0Lv8_ж_ж   1&.8 ]33 Z @` @ `  @`@    X N" !X S G^   "X 0D8_ж_ж   2&.8 ]33 Z @` @ `  @`@    #X  N" $X S G^    %X 0<8_ж_ж    1&.8 ]33 Z @` @ `  @`@  aZ  &X aZ N" 'X S G1  a[ + (X 0@8_ж_ж  a[   Store Store( .8 ] 33 Z @` @ `  @`N" )X S G]  cIN" *X S G]  }c@  { +X {N" ,X S G^  | -X 008_ж_ж  | 2&.8 ]33 Z @` @ `  @`N" .X S G]   N" /X S G]   N" 0X S G]   @    1X  N" 2X S G^    3X 0$8_ж_ж    4&.8 ]33 Z @` @ `  @`N" 4X S G]    @  a  5X a N" 6X S G1  a ) 7X 0h8_ж_ж  a   Load Load( .8 ] 33 Z @` @ `  @`N" 8X S G] c`IN" 9X S G] }`c@  ^{ :X ^{N" ;X S G^  _| X ^ N" ?X S G^  _  @X 08_ж_ж  _  2&.8 ]33 Z @` @ `  @`@  ^  AX ^ N" BX S G^  _  CX 08_ж_ж  _  3&.8 ]33 Z @` @ `  @`@  ^  DX ^ N" EX S G^  _  FX 08_ж_ж  _  1&.8 ]33 Z @` @ `  @`@  ^  GX ^ N" HX S G^  _  IX 08_ж_ж  _  1&.8 ]33 Z @` @ `  @`@ a^  JXa^ N" KX S G1 a_ / LX 05_ж_ж a_  Dependent Loads(.8 ]33 Z @` @ `  @`@ `cG MX`cGN" NX S G^ `cH OX 0l$_ж_ж `cH 4&.8 ]33 Z @` @ `  @`@ `}a PX`}aN" QX S G^ `}b RX 0$_ж_ж `}b 3&.8 ]33 Z @` @ `  @`@ ` { SX` {N" TX S G^ ` | UX 0>_ж_ж ` | 6&.8 ]33 Z @` @ `  @`N" VX S G] `  @ `   WX`  N" XX S G^ `   YX 0>_ж_ж `   3&.8 ]33 Z @` @ `  @`N" ZX S G] `  @ `   [X`  N" \X S G^ `   ]X 0_ж_ж `   2&.8 ]33 Z @` @ `  @`N" ^X S G] `  @ `a  _X`a N" `X S G1 `a - aX 0\_ж_ж `a   Aliased Loads(.8 ]33 Z @` @ `  @`@ cG bXcGN" cX S G^ cH( dX 0_ж_ж cH  Bounded Tags$ .0 ]  Z @` @ `  @`@ }a eX}aN" fX S G^ }b% gX 0q_ж_ж }b  CAS-based$ .0 ]  Z @` @ `  @`@  { hX {N" iX S G^  |6 jX 0P_ж_ж  | fixed  snark $.0 ] Z @` @ `  @`@    kX  N" lX S G^   < mX 0Է_ж_ж     original  snark $.0 ] Z @` @ `  @`@    nX  N" oX S G^   , pX 0_ж_ж    Nonblocking list$.0 ] Z @` @ `  @`@    qX  N" rX S G^   0 sX 01_ж_ж    Lazy list-based set $.0 ] Z @` @ `  @`@  D {  tX D { N" uX S G^  E . vX 0H_ж_ж  E |  Non-blocking queue$.0 ] Z @` @ `  @`@    wX  N" xX S G^   * yX 0_ж_ж    Two-lock queue$.0 ] Z @` @ `  @`@ h  zXh N" {X S G h ) |X 0_ж_ж h   Description& .0 ]  Z @` @ `  @`@    }X  N" ~X S G^   ! X 0DQ_ж_ж    Deque$.0 ] Z @` @ `  @`@ }a X}aN" X S G^ }b$ X 0W_ж_ж }b LL/VL/SC$ .0 ]  Z @` @ `  @`@ cG XcGN" X S G^ cH$ X 0b_ж_ж cH LL/VL/SC$ .0 ]  Z @` @ `  @`@  { X {N" X S G^  |! X 0pr_ж_ж  | Deque$.0 ] Z @` @ `  @`@    X  N" X S G^    X 0h}_ж_ж    Set$.0 ] Z @` @ `  @`@    X  N" X S G^    X 0`_ж_ж    Set$.0 ] Z @` @ `  @`@    X  N" X S G^   ! X 0X_ж_ж    Queue$.0 ] Z @` @ `  @`@    X  N" X S G^   ! X 0P_ж_ж    Queue$.0 ] Z @` @ `  @`@ h  Xh N" X S G h " X 0H_ж_ж h  Type&.0 ] Z @` @ `  @`HB X C DohiHB X C D81  HB X C D81  HB X C D81  HB X C D81  HB X C D81  HB X C D81}~HB X C DoHIHB X C DohHHB X C D81hHHB X C DohHHB X C D81cdHB X C D81  HB X C D81hHHB X C D81 h HHB X C D81 abHB X C D81 a HHB X C D81aHHB X C D81`aaH X  N_ж_ж `p   nZ @` @ `  @`8 `~> X`~>N" X S G  `? X 04_ж_ж `? @snark algorithm has 2 known bugs, we found them lazy list-based set had a unknown bug (missing initialization; missed by formal correctness proof [CAV 2006] because of hand-translation of pseudocode) Many failures on relaxed memory model inserted fences by hand to fix them small testcases sufficient for this purpose 00  U0  U&0  33UP/0 U. $ $*$ $t&&$33Q& A^42Rr  2Rr2R< X c $޽h ? ̙33 E \D(  \ \  N`ٲ P   nZ @` @ `  @` \  N ;  jV>^~ > ^ ~ >^~< \ c $޽h ? ̙33  `F(  ` `  N_ж_ж 0p   nZ @` @ `  @` `  N(_ж_ж U  lX Hh(H h (Hh< ` c $޽h ? ̙336    dj (  d d  N!_ж_ж E*J   nZ @` @ `  @` d  N_ж_ж !  jV>^~ > ^ ~ >^~p8 ) q d) qZ2 d s *o wl @  _) g d _) gf" d 6!G$  f" d 6!GF$ @ f" d 6!GF$  @ UA q  dUA qf"  d 6@G$  f"  d 6@G$ f"  d 6@GF$' b @ z 3   dz 3 f" d 6G$  f" d 6G$  f" d 6G$  8 )   d)  N" d S G5 * =" d <~_ж_жG5 * !  Relaxed Memory Models$. ] Z @` @ `  @`8   d N" d S G]  A" d <D0_ж_жG]   Lock-free implementations$. ] Z @` @ `  @`8  \  d\  N" d S G5  \ >" d <,5_ж_жG5  \  Software Verification$. ] Z @` @ `  @`< d c $޽h ? ̙33eE Ph(  h: h 3 A/  h 6_ж_ж P END . ], Z @` @ `  @`B h s *޽h ? ̙33   T L l (  lj" l BG  _>R" l s *Gkk =j  l  N_ж_ж Vv   nZ @` @ `  @`RB l s *D {{RB l s *D {{] RB l s *D {x : l 3 Akh l 0O_ж_ж ;  >\Pass: all executions of the test are observationally equivalent to a serial execution Fail:RV. ]. &R"& ]Z @` @ `  @`RB  l s *D) RB  l s *DJ K|8 '   l' Z"  l s *G8$' j@ '   l' N" l S G8 ' j, l 6__ж_ж '   CheckFence$ . ]  Z @` @ `  @`8   l  T" l c $G)$ @   l N" l S G)  8 l <k_ж_ж  Memory Model Axioms . ] Z @` @ `  @`: l 3 A" : l 3 Aj"~N RB l s *Dy 2 J l 0tw_ж_ж + Z &  *Inconclusive: runs out of time or memory0+. ] &" +Z @` @ `  @`< l c $޽h ? ̙33 E pD(  p p  Nt_ж_ж    nZ @` @ `  @` p  Nt_ж_ж P0  jV>^~ > ^ ~ >^~< p c $޽h ? ̙33Z  t(  t t  NT_ж_ж    nZ @` @ `  @` t  N_ж_ж P`^  T@ N<|< | <|NX" t 0G!Z$ P < t c $޽h ? ̙33 PH` x(  x x 0_ж_ж }S  @j ! 2 ! 0 F. U%. T ) 6Z @` @ `  @`2 x 6 _ж_ж ? Relaxed Memory Model Example . ], Z @` @ `  @`8 R xRN" x S G S x 0_ж_ж S  Example: output not sequentially consistent (that is, not consistent with any interleaved execution) ! processor 1 may perform stores out of order processor 2 may perform loads out of order relaxed ordering guarantees improve processor performance Q: Why doesn t everything break? A: Relaxations are designed in a way to guarantee that uniprocessor programs are safe race-free programs are safe /0 ]. ` lF3f/ . X/ ;/  `" "      5 ;  Z,>^~ > ^ ~ >^~8 }R $ x}R $`" x 0G*A'$}S % x 0_ж_ж }S %  x = 1 y = 2 . U Z @` @ `  @`8 S }$  x}S $`"  x 0G*A'$S })  x 0x_ж_ж S }%  print y print x . U Z @` @ `  @`("  x <X_ж_жGe i thread 1$ . ] A' Z @` @ `  @`("  x <|_ж_жGe S  thread 2$ . ] A' Z @` @ `  @`< x c $޽h ? ̙33 0 PHp|(  |^ | S  ?NH   H | 0Ujhjh  K!   &I am S.B. , a PhD student u po, my adv'0 ]'  'Z @` @ `  @`B | s *çjB ? ̙33 0 '(  ^  S  ?NH     0@jhjh  K!   YArchitecture is pushing multicore hardware, software ready for concurrency? not quite...(-0 ]- Z  ZZ @` @ `  @`B  s *çjB ? ̙33 0 '(  ^  S  ?NH     0jhjh  K!   YArchitecture is pushing multicore hardware, software ready for concurrency? not quite...(-0 ]- Z  ZZ @` @ `  @`B  s *çjB ? ̙33 0 ia(  ^  S  ?NH   a  0_jhjh  K!   1promise sounds quite nice. take on the challenge!(0 ] 2  2Z @` @ `  @`B  s *çjB ? ̙33 0 ia(  ^  S  ?NH   a  0njhjh  K!   1promise sounds quite nice. take on the challenge!(0 ] 2  2Z @` @ `  @`B  s *çjB ? ̙33 0  )(  ^  S  ?NH     0sjhjh  K!   [Three different research areas & communities Our contribution: show a way to bridge the gap(-0 ]/ \  \Z @` @ `  @`B  s *çjB ? ̙33 0 @&(  ^  S  ?NH     S "  K!   " B  s *çjB ? ̙33 0 `6(  ^  S  ?NH     0jhjh  K!   h- linked list. concurrent access. ex (multiple prod, multiple cons) - compare-and-swap instead of locks.(D0 ]% i  iZ @` @ `  @`B  s *çjB ? ̙33 0 0(  ^  S  ?NH     0jhjh  K!   b- operation-level sequential consistency - an implementation is CORRECT if illusion is successful.()0 ]: c  cZ @` @ `  @`B  s *çjB ? ̙33  0 &(  ^  S  ?NH     S Hs  K!   " B  s *çjB ? ̙33  0 L(  ^  S  ?NH     0sjhjh  K!   6~black-box view 3 inputs (green) red output code: e.g. nonbl queue code; symb. test (shown simplest, two threads, one op each)(+0 ]T   Z @` @ `  @`B  s *çjB ? ̙33  0 &(  ^  S  ?NH     S X  K!   " B  s *çjB ? ̙33  0 &(  ^  S  ?NH     S ؈  K!   " B  s *çjB ? ̙33  0  &(  ^  S  ?NH     S 4  K!   " B  s *çjB ? ̙33 0 0&(  ^  S  ?NH     S   K!   " B  s *çjB ? ̙334 0 P(  ^  S  ?NH     0Hkjhjh  x!   tSo far unspecific. for a good reason: it s not the same on all platforms. program for Relaxed(J0 ] _  _Z @` @ `  @`B  s *çjB ? ̙33 0 p&(  ^  S  ?NH     S \]  K!   " B  s *çjB ? ̙33 0 &(  ^  S  ?NH     S |  K!   " B  s *çjB ? ̙33 0 0&(  ^  S  ?NH   8  S !8  K!  8 " B  s *çjB ? ̙33 0 @&(  ^  S  ?NH     S W  K!   " B  s *çjB ? ̙33 0 P&(  ^  S  ?NH   5  S lX5  K!  5 " B  s *çjB ? ̙33 0 `&(  ^  S  ?NH   5  S   K!  5 " B  s *çjB ? ̙33 0 p&(  ^  S  ?NH     S v  K!   " B  s *çjB ? ̙33 0 L(  ^  S  ?NH     08jhjh  K!   6~black-box view 3 inputs (green) red output code: e.g. nonbl queue code; symb. test (shown simplest, two threads, one op each)(+0 ]T   Z @` @ `  @`B  s *çjB ? ̙33 0 &(  ^  S  ?NH     S   K!   " B  s *çjB ? ̙33 0 &(  ^  S  ?NH     S   K!   " B  s *çjB ? ̙33 0 &(  ^  S  ?NH     S T  K!   " B  s *çjB ? ̙33r@K<EbI~LY}htmr0]yM]3-.)>qd?; l #3>69;>RA-DFHKMP}RUT-VXA[2]^`bydQf)h'kln9@"p<;(/On-screen Show" &Times New Roman StarSymbolArial Courier NewMath C Times-Roman Times-ItalicMath B WingdingsDefault DesignUCheckFence: Checking Consistency of Concurrent Data Types on Relaxed Memory ModelsGeneral MotivationSpecific Motivation7 concurrency libaries with lock-free synchronization... are simple, fast, and safe to use concurrent versions of queues, sets, vectors, etc. more concurrency, less waiting fewer deadlocks ... are notoriously hard to design and verify tricky interleavings exposed to relaxed memory models code needs memory fences for correct operationsBridging the GapExample: Nonblocking QueueWMichael & Scotts Nonblocking Queue [Principles of Distributed Computing (PODC) 1996] Correctness Condition Part II: SolutionBounded Model CheckerDemo: CheckFence ToolExample: Memory Model BugTool ArchitecturePowerPoint PresentationWhich Memory Model?Part VI: ResultsStudied AlgorithmsResultsResultsTypical Tool Performance Related Work ContributionPowerPoint PresentationBounded Model Checker Future WorkAxioms for RelaxedPowerPoint Presentation  Fonts Used Design Template Slide Titles _IBM_USERIBM_USER0"0DCourier Newman@b7 0 01@DMath C Newman@b7 0 0PDTimes-Romanman@b7 0 0`DTimes-Italican@b7 0 0pDMath Btalican@b7 0 0DWingdingsican@b7 0 0d .  @n?" dd@  @@`` xp<9  "#$/ 1"?$&U([*,.0123   !#%')+-/4567894b$H|F"DePT0b$ovT#`0 T0b$*h%1%Z`0b$#A!uON0b$(3&j}@0b$q a3D!@S0b$ wD %tQy0c $@\ g4LdLd7 0ppp@ <4 0\,cg4;d;d7 0(p@ ppuʚ;2Nʚ;<4dddd@ 0<4BdBd@ 0 jb___PPT9D/ 0(.TCheckFence: Checking Consistency of Concurrent Data Types on Relaxed Memory Models,U] $!J$ USebastian Burckhardt Rajeev Alur Milo M. K. Martin Department of Computer and Information Science University of Pennsylvania June 6, 2007 D38]Y(3X  General Motivation]  Specific Motivation]  6 concurrency libaries with lock-free synchronization,7P]uk4k 7L... are simple, fast, and safe to use concurrent versions of queues, sets, maps, etc. more concurrency, less waiting fewer deadlocks ... are notoriously hard to design and verify tricky interleavings routinely escape reasoning and testing exposed to relaxed memory models code needs to contain memory fences for correct operation!|&%0 ]a.%0Z& a.]; M... are simple, fast, and safe to use concurrent versions of queues, sets, vectors, etc. more concurrency, less waiting fewer deadlocks ... are notoriously hard to design and verify tricky interleavings exposed to relaxed memory models code needs memory fences for correct operations|&%0 ]d.%0Zf& d.60 Specific Motivation]  Bridging the Gap]   Example: Nonblocking Queue] MThe implementation optimized: no locks. not race-free exposed to memory modelV0] &$ k& N <The client program on multiple processors calls operations 60]) k) = Michael & Scott s Nonblocking Queue [Principles of Distributed Computing (PODC) 1996] ,W]$$1 Wboolean_t dequeue(queue_t *queue, value_t *pvalue) { node_t *head; node_t *tail; node_t *next; while (true) { head = queue->head; tail = queue->tail; next = head->next; if (head == queue->head) { if (head == tail) { if (next == 0) return false; cas(&queue->tail, (uint32) tail, (uint32) next); } else { *pvalue = next->value; if (cas(&queue->head, (uint32) head, (uint32) next)) break; } } } delete_node(head); return true; } b0" K./</N  Correctness Condition ](  Data type implementations must appear sequentially consistent to the client program: the observed argument and return values must be consistent with some interleaved, atomic execution of the operations. LW0]x @w   Part II: Solution]   Bounded Model Checker"]k   Demo: CheckFence Tool]   Example: Memory Model Bug] %Processor 1 links new node into list( 0] & & Tool Architecture]    Which Memory Model?] Memory models are platform dependent & ridden with details We use a conservative abstract approximation  Relaxed to capture common effects Once code is correct for Relaxed, it is correct for stronger models Finding simple, general abstraction is hard (work in progress)p;0] h3c Part VI: Results]  <Studied Algorithms( Results] Results] Typical Tool Performance]  Very efficient on small testcases (< 100 memory accesses) Example (nonblocking queue): T0 = i (e | d) T1 = i (e | e | d | d ) - find counterexamples within a few seconds - verify within a few minutes - enough to cover all 9 fences in nonblocking queue Slows down with increasing number of memory accesses in test Example (snark deque): Dq = ( pop_l | pop_l | pop_r | pop_r | push_l | push_l | push_r | push_r ) - has 134 memory accesses (77 loads, 57 stores) - Dq finds second snark bug within ~1 hour Does not scale past ~300 memory accesses v]$92k<J\* ! Related Work ]  Bounded Software Model Checking Clarke, Kroening, Lerda (TACAS'04) Rabinovitz, Grumberg (CAV'05) Correctness Conditions for Concurrent Data Types Herlihy, Wing (TOPLAS'90) Alur, McMillan, Peled (LICS'96) Operational Memory Models & Explicit Model Checking Park, Dill (SPAA'95) Huynh, Roychoudhury (FM'06) Axiomatic Memory Models & SAT solvers Yang, Gopalakrishnan, Lindstrom, Slind (IPDPS'04) c%0]o% 4%0]%  FB BB1F>B4F5B&F1BB  Contribution ]  First model checker for C code on relaxed memory models. Handles ``reasonable  subset of C (conditionals, loops, pointers, arrays, structures, function calls, dynamic memory allocation) No formal specifications or annotations required Requires manually written test suite Soundly  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ =     !"#$%&'()*+,-./0123456789:>?@ABCDERoot EntrydO)Z <PicturesG\Current User8SummaryInformation(PowerPoint Document(DocumentSummaryInformation8dz/ 0DTimes New Roman@bt\7 0t 0DStarSymboloman@bt\7 0t 0 DArialmboloman@bt\7 0t 0"0DCourier Newman@bt\7 0t 01@DMath C Newman@bt\7 0t 0PDTimes-Romanman@bt\7 0t 0`DTimes-Italican@bt\7 0t 0pDMath Btalican@bt\7 0t 0DWingdingsican@bt\7 0t 0d .  @n?" dd@  @@`` xp<9  "#$/ 1"?$&U([*,.0123   !#%')+-/4567894b$H|F"DePT0b$ovT#`0 T0b$*h%1%Z`0b$#A!uON0b$(3&j}@0b$q a3D!@S0b$ wD %tQy0c $@\ g4LdLd7 0hppp@ <4 0$,cg4;d;d7 0h(p@ ppuʚ;2Nʚ;<4dddd@ 0<4BdBd@ 0 jb___PPT9D/ 0(.TCheckFence: Checking Consistency of Concurrent Data Types on Relaxed Memory Models,U] $!J$ USebastian Burckhardt Rajeev Alur Milo M. K. Martin Department of Computer and Information Science University of Pennsylvania June 6, 2007 D38]Y(3X  General Motivation]  Specific Motivation]  6 concurrency libaries with lock-free synchronization,7P]uk4k 7L... are simple, fast, and safe to use concurrent versions of queues, sets, maps, etc. more concurrency, less waiting fewer deadlocks ... are notoriously hard to design and verify tricky interleavings routinely escape reasoning and testing exposed to relaxed memory models code needs to contain memory fences for correct operation!|&%0 ]a.%0Z& a.]; M... are simple, fast, and safe to use concurrent versions of queues, sets, vectors, etc. more concurrency, less waiting fewer deadlocks ... are notoriously hard to design and verify tricky interleavings exposed to relaxed memory models code needs memory fences for correct operations|&%0 ]d.%0Zf& d.60 Specific Motivation]  Bridging the Gap]   Example: Nonblocking Queue] MThe implementation optimized: no locks. not race-free exposed to memory modelV0] &$ k& N <The client program on multiple processors calls operations 60]) k) = Michael & Scott s Nonblocking Queue [Principles of Distributed Computing (PODC) 1996] ,W]$$1 Wboolean_t dequeue(queue_t *queue, value_t *pvalue) { node_t *head; node_t *tail; node_t *next; while (true) { head = queue->head; tail = queue->tail; next = head->next; if (head == queue->head) { if (head == tail) { if (next == 0) return false; cas(&queue->tail, (uint32) tail, (uint32) next); } else { *pvalue = next->value; if (cas(&queue->head, (uint32) head, (uint32) next)) break; } } } delete_node(head); return true; } b0" K./</N  Correctness Condition ](  Data type implementations must appear sequentially consistent to the client program: the observed argument and return values must be consistent with some interleaved, atomic execution of the operations. LW0]x @w   Part II: Solution]   Bounded Model Checker"]k   Demo: CheckFence Tool]   Example: Memory Model Bug] %Processor 1 links new node into list( 0] & & Tool Architecture]    Which Memory Model?] Memory models are platform dependent & ridden with details We use a conservative abstract approximation  Relaxed to capture common effects Once code is correct for Relaxed, it is correct for stronger models Finding simple, general abstraction is hard (work in progress)p;0] h3c Part VI: Results]  <Studied Algorithms( Results] Results] Typical Tool Performance]  Very efficient on small testcases (< 100 memory accesses) Example (nonblocking queue): T0 = i (e | d) T1 = i (e | e | d | d ) - find counterexamples within a few seconds - verify within a few minutes - enough to cover all 9 fences in nonblocking queue Slows down with increasing number of memory accesses in test Example (snark deque): Dq = ( pop_l | pop_l | pop_r | pop_r | push_l | push_l | push_r | push_r ) - has 134 memory accesses (77 loads, 57 stores) - Dq finds second snark bug within ~1 hour Does not scale past ~300 memory accesses v]$92k<J\* ! Related Work ]  Bounded Software Model Checking Clarke, Kroening, Lerda (TACAS'04) Rabinovitz, Grumberg (CAV'05) Correctness Conditions for Concurrent Data Types Herlihy, Wing (TOPLAS'90) Alur, McMillan, Peled (LICS'96) Operational Memory Models & Explicit Model Checking Park, Dill (SPAA'95) Huynh, Roychoudhury (FM'06) Axiomatic Memory Models & SAT solvers Yang, Gopalakrishnan, Lindstrom, Slind (IPDPS'04) c%0]o% 4%0]%  FB BB1F>B4F5B&F1BB  Contribution ]  First model checker for C code on relaxed memory models. Handles ``reasonable  subset of C (conditionals, loops, pointers, arrays, structures, function calls, dynamic memory allocation) No formal specifications or annotations required Requires manually written test suite Soundly verifies & falsifies individual tests, produces counterexamples PA0 /">'\ dBounded Model Checker"]k   Future Work ]  YMake CheckFence publicly available Experiment with more memory models hardware (PPC, Itanium), language (Java, C++ volatiles) Improve solver component enhance SAT solver support for total/partial orders Develop reasoning techniques for relaxed memory models Develop scalable methods for finding specific, common bugs Build concurrent library #0]$ 9  4   #$94   ZAxioms for Relaxed"]   A set of addresses V set of values X set of memory accesses S ` X subset of stores L ` X subset of loads a(x) memory address of x v(x) value loaded or stored by x <p is a partial order over X (program order) <m is a total order over X (memory order) For a load l c L, define the following set of stores that are  visible to l : S(l) = { s c S | a(s) = a(l) and (s <m l or s <p l ) } Executions for the model Relaxed are defined by the following axioms: 1. If x <p y and a(x) = a(y) and y c S, then x <m y 2. For l c L and s c S(l), always either v(l) = v(s) or there exists another store s c S(l) such that s <m s ('%0!]%0!Z0ZY%0!ZO0Z?%0!Z0Z0" Z0Z!!!!!!!!!!!!!,!!7@!    /     B  / !"#$%&'() * + , - ./023456789:;P#  3#+# /}"(  !z `e   #"2&3      %  l <?@ e  l Bounded Tags    @ @` j <@? @  i CAS-based    @ @` h <?  " snark algorithm @ @` f <?  Nonblocking list&f @ @` d <?  Lazy list-based set$! @ @` b <x?  rNon-blocking queue @ @` ` <t%?  nTwo-lock queue @ @` ^ <'?`  m Description    @ @` [ </? @ e  g198 @ @` Y <7? @  f74 @ @` W <X??  g159 @ @` U <M?   g174 @ @` S <O?   g141 @ @` Q <]?   f98 @ @` O <H?   f80 @ @` M <m? `  eloc @ @`  <v? e  M. Moir (PODC 1997).  @ @`  <~? @  hLL/VL/SC    @ @`  <8?@ e  hLL/VL/SC    @ @`   <?   D. Detlefs et al. (DISC 2000). @ @`   <8?   eDeque @ @`   <?   T. Harris (DISC 2001).  @ @`   <(?  cSet @ @`  <l?  Heller et al. (OPODIS 2005).  @ @`  <d? cSet @ @`  <P? eQueue @ @`  <?  $M. Michael and L. Scott (PODC 1996).%% @ @`  <`? eQueue @ @`  <? ` hSource @ @`  <?` fType @ @``B  0o ?``ZB  s *1 ?ZB  s *1 ? ZB  s *1 ?ZB  s *1 ?ZB  s *1 ?  ZB  s *1 ?  `B   0o ?e e `B ! 0o ?`e ZB " s *1 ?`e `B $ 0o ?`e ZB % s *1 ?@ @ ZB N s *1 ? ` e ZB _ s *1 ? ` e x & c $0     v:޽h ?\home\sburck\vfat\web\bg.gif ̙33  `F(  ` `  N _ж_ж 0p   nZ @` @ `  @` `  N0_ж_ж U   lX Hh(H h (Hh< ` c $޽h ? ̙33rqg<ĭ"q<;(/z/ 0DTimes New Roman@b7 0 0DStarSymboloman@b7 0 0 DArialmboloman@b7 0  Oh+'0@H XCheckFence: Checking Consistency of Concurrent Data Types on Relaxed Memory Models IBM_USER3@pD@`8P ՜.+,04    verifies & falsifies individual tests, produces counterexamples PA0 /">'\ dBounded Model Checker"]k   Future Work ]  YMake CheckFence publicly available Experiment with more memory models hardware (PPC, Itanium), language (Java, C++ volatiles) Improve solver component enhance SAT solver support for total/partial orders Develop reasoning techniques for relaxed memory models Develop scalable methods for finding specific, common bugs Build concurrent library #0]$ 9  4   #$94   ZAxioms for Relaxed"]   A set of addresses V set of values X set of memory accesses S ` X subset of stores L ` X subset of loads a(x) memory address of x v(x) value loaded or stored by x <p is a partial order over X (program order) <m is a total order over X (memory order) For a load l c L, define the following set of stores that are  visible to l : S(l) = { s c S | a(s) = a(l) and (s <m l or s <p l ) } Executions for the model Relaxed are defined by the following axioms: 1. If x <p y and a(x) = a(y) and y c S, then x <m y 2. For l c L and s c S(l), always either v(l) = v(s) or there exists another store s c S(l) such that s <m s ('%0!]%0!Z0ZY%0!ZO0Z?%0!Z0Z0" Z0Z!!!!!!!!!!!!!,!!7@!    /     B  / !"#$%&'() * + , - ./023456789:;Pr"<