Deprecated: The each() function is deprecated. This message will be suppressed on further calls in /home/zhenxiangba/zhenxiangba.com/public_html/phproxy-improved-master/index.php on line 456
ࡱ>  zaB]"I<9k_( `!@|=%eópki$h`E0|x |Tٸޙ d=0!,3/aG^1&CL6.jZ[[??\ںVU(X;s33w&Zk%s.=LMTL&X1MLs[4iϾxyziMOG8FdMo(.ȧ6O1YyUMF*w_@ hyP*U1Mwպ% 5L{~nSU1ՐdzR4xrIؚLqkElSn'^,_G(A=l*ZtES`J"mITӿJ"oܮ\e *Wy]ڌqVzk]6B*(Oqe]U~xƳUZiʲxyBDB[=k51t2Y:mvgh*ebJqlڞ1iapJeAM›WY p(I5%E*G|m*$KԊɕ"'nӓ{33)Dž;nXYVqTFw x]I! ;SܠQ4ZOq*mDFVP.,5:d^*򮴥;Ff5#˰2#gHm!#am2r#ulj2 hs4yf PSg=ȿ2975nTGF~kι\OW፬eQ+Ht,9=.~vw1ʪIĞ)61^C YyqYqɷP _S )qriK?uzmr\=6ͮ-RNDh2FDM8'tgCq-$dȌ|`FqQ8{#8!!2}?KsG<|!!r!r!<\+|9֨<qqu88GXsϒчMTY??..(-Ui32>o: 'gFT||QuqD|cȃчz#&{]; [K[LӘ;]NC,%o:Rs+3-&i;.5NEF+TFJO^sa4 m"^BkcsU21 .UeT$.1 ωub*m'ߖ%*x{;1#MF iACe#.Dl^!Tg춑o+l.)sUGgmOdG͘bsUa^ik|RN1-Tk ˡq+ <~qH#˧*B# 1~ghZ!)"!^4;nrlN.2sEc~܈PGN3d\푱؇q2a?kYvG9-.9!7>åp92wo:DKuC|gr/9gn!;j|Y;k3;ۜgg=zD:Gܬ z٣gd;s53As5ŸYY$9*{+377Kްv!\+l ;3w&Ǟ U=9qC*<<Ӧk4-v =GoNzˇ,j[P Y8bRY~Am!?CۜQ,{8ﴆȋ=[FNvs.=z򜅣-8m쌰kznL#=a]ٙ6';\[znPg`CәK6QN<arHIHL)9RΙ Z:ӃQ`Gg/n 6` Ng.83==|9vqr#^+vdI)xَ\)8ә!Hi)XLGFi抝QW촟銧V4_bg芃M8a7J.qzv3s%ȍvmؙCE i5;r𓢼hG= ^R0T3u^vsN]vеeG .;##˸p9ώxMlgnP :=KJB;Rtdf8#rfoj3Wrkr,iR9g劍UN8+K\3')%YJg,4sřQW*(,(m3C}"'Tȋ6.:'qfQd|B9q?:!و`a{Cs)ȊJAVYy  e +e\|Z+lq)v5!?0";xLdG -_ʝqICv( lqlup7ug#rg8VjXΠA1eb|'CCX^R0T3םuYgnWEE~ ]w{Ώ顽=alrƅgɟ;T#XMKx iȑX!{ybjxg%W_Q:O.!S~q;O϶eT=77~ tܐz7j. ߙ~c[{=(S ~6e#c=_Rr ƧDqIY_`f4B</1f9ߐ ~f2g2S;K3~l3~>aOx>=w>G2wbBU6bfVʢfVʾw#Yd^1u2uWjd*tU$X,YwQ\\@׻KjY~ًT]#E)SU?rՏ<r4Ra0rRA7\%Ô( jtlWRc6 [ HiO.1ʸ mЋxmgk8\ ''#H49]:d@r69ACsa.5/RE2]:a$técлÃ1JybW}!~.WAזw!cr3yg*MaI? ~\ ԰,r2!Os.Sxɹ`qe4|*R̩eBNs)$N 8O@)T@5켜hjRC,/1]1%Pl=ύT0V)Ű \ +?Xխ-6+ph?KB'ފhNIg?IU9@9|/ w$'B'gm/{M^#<|2Ɲy/q1@^ 跡ߩ'FNVj9my99%UsZTI 5a-#v8mo3'Dľ/%Y o`nd 1ZhzZA΃k^k?|rkdUܜ9-UsjtVu"GMoo39Ym"z^c%:Il#_kꡖ^<{[o-qe4|rkdU)ӖSR5jNM՜ܜ<μPIz7bf6sLM\Ob؈F`㬅FG^<{e4|rkdUܜ9-UsjtVu"GMoo39Ym"z^c%:Il#_kꡖ^<؋@-qe4|rkdU)ӖSR5jNM՜ܜ<μPIz7bf6sLM\ObrZX~clv#clo`-c5ZPދ{/~5Blѹ03K,Ҧ}J"X$ _OI !A,$ݗ$_c33|6oy09M|C U SCfL˙(3LD/]9$3b`ަtD'x|9b &|E u~z= |&2sf1q~}#(jvY0]9̥0\rKrC5ˤv`# bQ>3N1'ώChb搧l `brr.K[JΗR%a5[H0y6YP1WqƉ63b &d\4] #џ> 4|3^*b@oC/⵿OZf$yE.2 9!0KsSuȢf.0yP1Jr=܈f؆67Ís=\[fۈ&6x?OZƐ1f,yO&PI0"i覓p5 r>:Myl `Xtccz7srچ6|1uп&6bB2^^>i]ENf9i.5GX.A.KRi uXDRp1An5c̕\71a1p#\V-&6b o2^^>i][FNRjC"*tE䰈SbyuZE\ԬJX2j(X!7͜a mq37pl-oF ؋m-*u䤔ܔrjVI ^rXQ:jX_9NK<Ԯ* jj((\71a1w37u[a lF oo3[`l̹LffQ3KffmgMh1u3V:q̙'8K%p猔y)3P"gNݐ}$|pf)z@OM__t)K!^ ~)pY$Cr"㰋'#[zB/lz3vmb7\L7bb^ 㴿_o8_%q 8'rf*T #џ> 4|3^*b@oC/⵿_o8_%qę+sQgXLb9Cq猖:Cݡ}-Y)K^ct{3Fl0 =;t$N>xKĿ$x?o8_%A'[ 8'rf*Txo'$x{i֍UgN8qV)3Txh y3tnzRK᜕BE>1\Iw艾7ccГqC7HB>D;A׾o8_%A'[ 8rf*Txqd4|~*V'\ 8+rf*3UxKĿ$x:%iAdf?ӆC[~rII-٦Rnz(?. c]pMEr֕nR;=-Z;Adtܮ#7ȋMY@nA* FN#C Unk0)w"/{_ G.EMlۨj4A OC]Ic>/q1@^ 跡 ';dIFQ3K B&9ra.5̥\CY&K;Dn85c w1w]s'#m߂߭x?UOFwhcr3ݡ&'䦌90Y2 G| [d6`Bs|slp1̆fk`:vӱ d9c{xG1q́YĜl!\[nv <|M*ix@v1]Q3vO 7l`1+#VGc>du~*1S !N?s|>Ɗ߬bq>?r?#11?fS#c}C;j/O'~,9!www.)쁽C}s/O'~ wTL+Zβ[DfVgVgi?Db5؀GrRwCE+->BrRӽz$6I@5\]I֒:r6f-_q}+^c'{jobD^7:X|%5s@qD \e gl[߂~ v[泙61_: -wo}8Ѻ[OFfhhmÑ]#;BUӭVnz\Gxwk=79Jk@E15&j $[́V5X>d=_=x@rBOFUr1; } ~CߏXbՉ)+cZ9\ ֡e['h0 fƘb́1 ̈N` L1b؍~,?&QfL=gq́ ĜDN"dy0c7=FA6<|M*-w/I* N|)ݦBHi 2U?2?4?0 =>7w"(Rc 2lKMWB_Ȼ߅~vc?ߖwg]LGL+`99ZN=^F}."oO}!YKp ,^-g9>YF%XE{c,fKp 2Ksu{3<dndi6̄0i觑Utߋ~/v{td7q>a|D߇̡a@Ӱ6Nu: `6̡?'QFd&Oi'yMeS>kcM07ymo2vii,| M -khI)[ߔN;Y͚amhhhhh. 7 ґƎQ:yu"CdBd/&`7 cg^(<Fq?ة!E'}t-RLq?yi !N"j8zumG1Z Cp! O5 ƃ0Ґ?Tڴ}ݚjgFF^*ҕ$Cw܇%)d,*}NoIL_Wۅ&A7쒑@wI_/b&VoxZO '3K6U&'#'sz8<v0 HRi `kTiEc1^[޷|ӓdIs3#ϛ/ @_yHE0HY2 b}Z9xV2XCa\b6)P/0L&^&JUN x @Jo}E} >}}ro!Mpd~>b}p!h ԪuU˨Ub@# ^b$AGlG3<`\0KTP^@ FM*Ľ  H6x|xCbJ0ðEĺ8aDsĜ;1D!$~:vاܜߖwl:>WjFmZ^Fv@-DۯB9P}j=}kYXVqn=j>I 8=GKd0; tWpL-þ +ST_} (_xGڀ|Y֨L5b/TC%}Z5`YP̫5B`cbCnhޚvBYjLfJjndM67hݡЇb{{`ƷīҺP$*d.Ri@} )Tvf_C7}@2r76݈ތهSG?ӟgw?!|Fpt.'q}h;a~he4 $3p*P? mQgI_}YT#8NNa$}#яr#H*ƪdJƮ`9U ئwdV$Vr2}rWGs' Gǐ!Dr;YRW &XcSm~ekS`* 5P p6NɴŵLf~`qu!k 0QQ 52V[#7$3كgKDQk&VdfGVKDm-NKťJw2(w r2RbX͞RʽW}XI2(,,*[s(|*UW[ILAqC"Fx%ؗHNۮ!kJ5Wzr5jjQM<䵆S+x]xK=kckY p4'P5Јo#hfP 5^9[k<.yܵZw [`3l ':򾎜'FP-9{GWBXy5lգ/$f%vWmy/Ku#;֏%]ӦwLmJ2u5Zuw7 =Wp{}ӿf:+/W~55ǯY>KqeF/C{ lC!j+sb I=~:ƭ"{ ػs1rn?OeOJ #9y}{0V6:DT_IJl*ħ WMJ ^9rlʘC~eړOig3}OAz-ݡ^ޒjUbW}%~U諥M[ޡ""eP429R]DG1;ٳS[Ja6 FXJjCѧIV.ƿ"4'O'V:1T!{XA̭ﳇQy"o!91~q0y"9nL'M$9:ca4 g"b\j3F !|롖qP eP~5v%دƯ2xԅGf4*6̈́0y.s%ss;fW3xGIgtAg`7fIJ2X %HT.c7Jy]@u2b\?Kѿ2V%`B %#Y"[ Z`oW/xHo'0+lqJBnU+A+b-*X*aR%@Ky] %_E܇x9TB5==rͽUM*k9㕱K{5s(skhR޹jS-yc# UztFoo#u@^דuy-^W@=rZ/ƨԡ5B^G:[|1o-aF^@n}} s}w-df Ymru#dGבkɷz5d*Y ePWJ{FV1QmTƼ1 ?"A`U,c4b~} P _ vP ^w{/hҶ??Dd{V{Vx-_cs>V~;V#} f5>|<}_G_bKE7ܵ>CfG5P˸uCj 3NԀM5®{7G18yg&s9sycy|?r,5~> ǐE(c<.񢫅zhƨZbx*ˠjJ__)Bk;&3&K/P_o2+22w_^?/J/_ }A"+v%XeKBڛQʯS7O| ށwߥ= eռ[Ox ؾOx7{?YAoavwwпmMcʳcڃiJ$g-dSkl}zADP<%mY){oYhE]dڧQ+Oj=d>Pv'wQxAG{~o>S CbSl?]!}*}O?)i_ M̳-T }&kq2u,@ӯg"x@;%//"=d)^_H~%K%B׶w蝵["ڂg)dRnP:0E0\65B}@> Ǵ4qmDxmG]E#0<~~Ӗo}:?j鐡 2',Vl a Xɓ8la;?cmg;q%cGm"s'0\XY=3iD>+C9 =o*7B}zsN!w=ʭ5zU.|NԊV^ThlWr;<|Nv29yd/|NrbrbZ>'Nbm}ωR?7ϰ2e%$/iIngRf?{LT*h*j}xOyOAQVބ/b">S=߈ W} ۏ؉AevsUޢ;{ww&ٖ's~|E־"CGQt $d8DoE佧S먾).8е"zgMV_ӒWȂRni's}E_ HCտK0oE*{];y}@bUxoLAO6}_E/Si$IF/;qR jEqG?OP6;пNwxoom6;}6q{,u8ߣf rN/ q.ci+q啴Rڞ(UQFE7q|{7FZN߭4^A?x RS Z7.C6 CNP/ѻ uGIl4f:EN0d:VUs yORg}z!@_rG_v7r5Y#g5QRhjU1kՀ&?,ߢT=bw_UqC }C~A}!CUC~O}!Q_T3է YS jO4?dI=̿3>iȩ{w|?SCmVCjm/6ȿ|!_b7o2dy̼֐+kzC\_o&s:s!`.f.2䟘W|!k[rC~|QbCyY feȯgij;̓'n8~C<9ǐO%Ðc,Nn],#, eBCbeА--6Cgϳ5䙖[z"KwrK!_f/$rcIGqb?ZL|[,>o!?`+C~r!`!ò߷òϐ߷6}O|-ˇ>ͲӐ|1w 9MC/!7!͗a}ѐ!O>i}֐Z->i?>˷>n.c2 !7Zmΐw>C+Oϭ~aːm߃֟wnXVCuuM.uϬվ u/`]o昫|1WrF_CSScȩ1߈jCTrb}ۘ #^ >eYlZ÷1Sx~+I/flZ÷1Po`O0mL/-w^fY/vωYg6ۘZ>'^fٴ?->{^9=ў^^'B뒣N;vڇgȂRn^/r%{YMG%{%$h j$¶mߋ 2q5tsͤ~)Y\%V/8zp_ X4?ȾO9 bGdQօlvSiկK8Œ8O5J']%cP$$l;A"ūQ?1|WOS᧺h=ooh Qdq)?~_ݭ !0.uFs? X%"q^wAm/"/"0J!%۟=ɝŊNυ0y+m6Xa/=D<9J8+T!gPL* 'x~UX>t{ك|3~܏v9HC&2 {ϵe&!9~'z&B[ay(vi\M&Jn}U5Q E?(Me.ꛪ+ڣ)|HR kB?͕I-j!wT rC/&zBCG 9S窳 y:SN7iT}:ŐQz@PjJ625ST Fu(C^G}+v:TNM3TujC[RcȿU{=oɺqaUNb/Y{]MRȷXj!v? 5F?Z#6ݧ Y5+z9\9O2Ʒ~oϐ5 s䛻#ߪG y+Ds䛽<Æ<PԷZ#??3r>yo[SC^oĿ!_kQFDi4m~ϐ39-CwoGe4MC _ͯn~͐1i~Ő?6ƷGhMKD)JNiG{`<(I;+JC{BG{f<(ڗFɅ ((y-Qi%FQ]C~K[?~$@BI1V۾#OstV;H:|d4bgU |1d> t;+Vb|I`IKG_G#}uPx ]+v]_O̧7ÿ їL~{HD[ ]RnMo'& HCUT0H@ A~#Xb#v ,f`b '&p7|#(e'7NjA-Հ61~v>3k{ {h D? HD|;8h;72eIC?c5elȐso%N5&po奴/W^%_N0J.]%Ѯi{ZQr#+u7Dɛi_%_KQ oo}[wDwҾ+J~So)wj]ʐw*Qs|w)%[)?UVE&sR`|rYYRKe!QGD=?D?,6dMYPPչ%uQaq4=A3N=Il]ՉzAبQ5[f@5Sf`թQ5Kv%,jYIwM8RߘjFo?P_ jBmMmʍ?َ!f0O}nQ_пYGп+7O9xPX8=hif՗fɿoCr~Ϝ 1T,ʯ6iߢ7p7MsHS3&}t54_m.֫ twoz$sr9zI/M[}[@ߩY: yc"3PuPZׯfb5'ᴟ_6[ ѓI?U7ᴟ_0sN?o^%Y zzzy[f5ߣg x=l=| ?z"޲ qo@. { 9ƎI_ч6GhE@bSNs/O5}+S默A>bT tK3L;_Q, 1E_w ߝף{ }sL_ߝCwnw臄؟g~TQsI?=N'O ?L5,43wl\^F"B뾻& zk[7=e |{w]E9{_?f~=O CyB tiˢ _)xT=*\S'pTt}Mݳ3on{|&Yw q1R|C]k}܈%[uB-}}G?,`aV~\-}'D~y_ ֘*zZ$po&p ^}7 S֛-{&نZ3p0{}0p:!|FSܛH6W@WJg*@JgT 4KgV·M|h2zG-I/#tg6c¯ѦD:3add}(_u\<΄Qyg >FSf;Ob"Ǚ0".7AǨem2dD:3a4ؙr*tgHaDao}K~i"z^dLW7 -QuBO .JZq(.IZIU2Hh!-,F^DQ& 맆|M9M"1!-KzG;RiO*JfyGV*Dj<×Ui @:uTl%8*#_zU(_zb}fyηJx Sԅ:P#QZD}͘:舚uHfl7| EJ nEZĺytVBchHZ}sҐOcC |+[(!4b{h6AstۊאVFL&S96hAD{"܆gB{Ӂ}DGtDݠQ> :D;?r/gnt@? @ᇠ 8IAO~6z[#k}Ys|;=J^vW^"W?y5[_z ^5ne{mw^7 '}e%ΖT׋i+~KkI_]=bk}mD#5*Yc{XQ=nꉤP=i&XwLP0ުrDOdOMo.jI?XʹCԬfj^?IzT/%\}N-H+u0闪Evzݺ^;¿P_\z)sw 7G[ε^4./*WG1:] t{ĽYE W5G*~߭ڇ-C~B eM/@/ *ע~c?Co5%>/A.q\᫢ _Xf [; }𗠯ZD.]軅_j]G?=Ag9OC?/K/D!o@o~33ᷠw|ڃ'AᏡ %Х/*|MtmS̈́on-|&%7^G~z ?=MY藄PA}3pu oDo B{AB$:H"זH8_]V w?N!mљPǮ֋K7c"GaMꢓMtyN.OAj]<^YQtE<7iD:WVܕ۬Hqʊ_ȘHQqʯ1{Kýe>~P&{"/Թ0]~ݠ+t]^gtl'ۉzpe~;ߣ#t#-}iPEp1\Jep9ۿr)ߝi0.3Ub~ %<18?9.'8'I~9N$ߣp _ b.̥:Ɵ6d(;+.˛]f2ÿb":# ըBVDLVXTuKKB)(/Cz]+ɏ8Q+t)AP ]'{Hy"Q^eb"ݽP_W_VQU8kR8{r&UL u>-3*M]º61 ա*iU%aP5(_Kz]UagMQHW݂hVD% ͠ 4" hՀ5$dc!f-kEA3) MHkL^cLcׄC32-WԞ|?qoihh˽$3[ؙHwܡfψ7C;?#,p8F?#dlx 6ύ[m{nDmfM6={ >o9Yf=f2yn&Oss39%DZI{J-"f*UjU'h֢XB%LҪ1[!;=^]i뒾e}j5T_[Ki;w꟮Fm3սm.ְ^LkCZfި>ʽN5S n6`;X }hCHpo~NP]a(6Yj:1vKcvg߄d?opznSvzUϢzƞd5$Gvgm9uMѮlhTO!/َz3C^gګ,O6OuS>ô~L1|_LYc>~E~\JүDׯZs~ު}ε?jz=*O=Ÿ/E?M t-ME?P+t;R\k]Aз~?H'O )sH^"Jj+7SᷢWx #}Jx/XmΟ.wt- om ot'G_uF]зGL@E~l> x' ?BKЫ_loCTmmib(TwGr] Mͅoh3F ׏[Rv{|slx//~3◐e[J%5Q3aVBZ7{ݦM_WV[)·}5u= 3HS >kxXj:VɯK8\u1߇HOu!b/!R]Bwa?f/;~Npw̍G8_H v H zCW"~S\gxC;D1W=ySnI{zҮ^p Q{y}B-,- -zv#y=“,Q=ߓ"z34 i;8>OxȿrS6 0/]sT1}âb8RRR(n%VB[@& 'HzD lRP2)C2+%%H/Š(>+ޤQ Pv= }6;G~G/wX/, +Dp߽ޮ[*m)U9+sׄ:PʙٔYU.gXmbXCUҪp%E۪ (/kWu⃛7=ɿr=) zϮ 'l ^K"AAhDTDQkH{9r Z[׊2- (gS֘ Kf9d[~"{md;Бu7=nޮ$ !ᇠ ?=NgOE~|tkbz?=ocfYsk[=U3ȪČ^]{Ks#QvkmC/Sw4zFJ+Ӳ-/fU=U)jeCmMsFۆ(!|&]]Whנft_?zC#~JᣞyG/~1zkgP|џ cwu 𿫱8$g[c챱c c7Dqb8Z._Kջ}ף{ W?n=_A 1{ ;FOiC~zSvcO X?-f=mK}J]PxGglYH_ ]]TD1{l /Awޟ$fM7 } ?֎7{Y;^᧡g ?϶ l1{,.~z}k13ᷠ~z'H^/‡"Х/LK\][TtC3ЭbTQ З}lOpǦپߍ_A1t1{l}J4g a3vk߈0B~?oE?/eeٶѩ7D Sgq7lie']f4_3f7;CHCzL^}0lͨoMY'U uգ>5[ Bz )|WWSHOOqky ;/Ĵ&r+ XK=cHOxʍ|S8Urw^@y˳nvwҷls(Mg7F^Q$蜘i;%i|LmߊJ?O ϧ zlV|IWH~3P=#|TQׇ0~n!/Q/P0_nn;]oTރpp҇?Rp7G`0 =7`;ᇔQAG d3#1}ЎiGmhG|䏦ʏ56 _NnDD >Oa3O8>h|3 eԍ#n_Sfw{+QJ wy>Ҿ胤>f<aPQ7bz7"vQۘG`0 bo`;|*f0mC!j➳C!o|x*&ҏ;JT+b8G Ω`"S 4ZyxP$/61PIGR_ }S4f`XL= PJB)JG ) Ѷ U>%uE*Qa%5:HL*@y( eH+M^i50 ωJa9(O\+`D@92);:lk d[62h +C#R(BP7ЦV6VcFg9JP˧l|FȘr/"y a ==OW'"bFT"VR! FzIF0>JGÚ)58Kjps$sDkpd#jrkAmz ^2 (߀ziGz]3mD uw*ю'!kH[|AiTjCM| _]mE;u;bֆ"N-քķ !cӌZC[|;qQ&ipʍ C Z[hM9vmb6AHh)wu}ف#сhwv*΂.֕u% d \` mk1gwHxQ C›C ?=D?~FlTg mFTG]fxCꨏأ`1*a=`RliVk-=WTmm(F!4Q檯XVN"T/1THnW^a{Q7m_uf^nQK0Q"к9$ZdebAG;OunLjzvXujeT-[y3þwfvj헪kV ('*Wl(Vo-X_jRuPVܜh])֭tY6n5溒m+du^-gb.n{.-a[^j=t KOtQ{vsс}@nvVbgh/vNЭڥOIA7/?ʐLøG}DxؼKfERVFՇ̷ڭ[4>`y ? ^SףT)nS\][iZ[E[sww ocD_㻕c{_}rl_o~i(on1c|rxS[96L;fn[9vYcW5[9v/V|껕cw |w7?nհ_Q=JFswSTzV2xۜ#VMl0*kXXX%}tu 4U. V+*vL*^obwU Ū~UGNgŪS\3CR8'xk'fԄ[abIOUE['fČ [&nIP{nHG sGۈO-Ǧ~ﱵ}Έwو TryY8ztę07(d&MKY3a3oXG{7=c7l{QK;g/3\DC"A>Ƙ1s`oLBGLIԏAĜق9l7)\&}n>-m%IߢwwlgGToȋNݯ᫸~N%_RK;f L } yPO;;76懿DB}G}!wW}pCNr?(i;0gQζ?8Itg){LqqNOhsp8sOqu,~2gWJ 1aB=C1φH/a*̣LT!',([,VNOA}p/G$1a%"]U:yd ȏ S(?rbP2ɯH+WKrF#5'l IB]CZmjY0f6=.qF@#6sHCA]k_]z4 4&ILvNtS7ӦtږN1s4"Td&ɟC9wufYԏ 3m{f ꩰULjlù29ojϹ:B'|g󘉟I gPv:mrn9ކs-|D;L=tNЙ,t|u!?"}dS'9LgJy:NЙvdў.Еu]i>GVgQA;|[&`jxMA!? ?=DC?)3lg Ż~幞o;Nn>7۟^{̻^_Zkk W[_] %mJ':VW]ŊY6,S_uymlknwB^"zڿ+[}i{IKU*nκ:S7^U>ʸbUV%;.Vfr9ꤙcuU'yI'X2cL4+R5jY\;jy_r=Z[r=[vr=;6KmMj9\3sDcsRO6O@`k׃YVc*jCYY7մ둬ךz8׫Mc*[v=饦v=]t@/r=z\uMoznϙ۴둻S1h_0zJҏ9fN'$3AOt=i3]?9=>_=s=,֣ĈfzP"F 6 ws=_?hv.} HKΝ)8}wρ;?7 + j" 7JOԲuĻsn T[9Q_ἡh侧MlD[:ԶL4+6 {vQewoC# |Z*Ӧn6 "QGȬ .'5鈳WSݺγt٫)L&w薉6 "qj"3DM HtDaܼ <oQQB^*ZkC/f,b6SX !B=Lz3=ι߹'97l5,w1ڙ3pɔcʚ3g3gM<>~zp8LgO{8DdQ_i؟dU1hh'-JU1J*]۽ZjLX7lQy^.UZbY^^QWW ؔ/|3 KE$4}|N{#h 50L';OL'9CC+q- ue_WR )[_R\֠m{5*˗_ 3sU q^wY^c`VًſlI-6Uz?9}͘\3 b[b'vsp[E )!yp&,ss";잒Rఇ&B!!.dR*2u/uq]xd)I}m4,uW !$'bT41/cHR_q]VQ3NniUA:r =䕖y]F_W;y\^QQX\ qJ̆t9/p/v O3;/-F =yeEgMH1UVNDJۃKuNJ\#lS.8GgWڳe.Y,1ٗD8Dq&4j8MU=㡞eRq/uٳPg٥e(p+("+X2w\ 6[(ׇF!p*jEQb99CF2guvt]-yB谣/+gɎ *H ~鼌e%q(A /ТM'<ΰ*ʢ޾F?M"Gsf ຖieT?i/!#+@SSq3.>._44QN{#ї;bbᣅQ&=ŌO "p<(1d$06J 9\:K64K;;v<%z|IyR(#Mi_Ƙ5n~#H:5)דz'%a"rJywyTAL+*KܰG'oqO*k<#wUEJ|xkXz+[ )d! l ]oE0'>S BxOS,):9Ւ~f9{l‹wӖW{Qw)D'"4#NXV;ӝu(S't:혺| nȽMH yݝ" }U&:VN(k+OBE P&Y u-?6ѳi:b1Hc&6w„w7۞鳕n44:O3NRƙ9TC:ഩp:ߎ^-:[΃3"IKOSt[v{ ;{#_2$DYpy8KΦ#8O!tGHn:B?u~BzO!M̮3ΦfL& &Yo^X ]Xec/qpy%%^>{J9v//v^a|)"Wqa7dNcť ]7>7&i;NyeIiZ DЉNJ½%ccKJT*8.: Ήu\&9%Ϟ*Jy{1ΒAivղًKLiwW<氏p|[h_%4q"?%B :)']ˍ0W٫X!qj-#y8Bpxǩ#rp -"3>TąGbgh\!)")3#nƥ"hr"UKMob)AᡆԐEpG:jOƅHpчd$%ɖ':?gG#HLo8~3/۞Smp:θo=g> pfa'8񃇤4":C ÓN􉧋'>zbJbw|I>zS=i)!$'M5511黄ol_C&*{+%)wq!tMCm҉7vcL = GUYqCe#]'80fbZo"+$NOjq gy ņ`K@mO8g8*9'T:Hc%53FM̺tTV Sò&$I@jTR_Ɩ嗟SCz"d~jzJy }jFZSg/BhG\ #Pg QIAZT R_ʽ-䕻Ohۃn^oޏX؟ꢏ'|B-!^zSx诖~^W#^^gSLv0FgULJYIJY>#9a{:\9ͦar}B?Wr٣f~Th^6CEP.} 4cSG.CӞMyPl/}aĺ]_ ![^)1~JEfH+40/GG'M$ɐ i8(j1<&ǣMG NSw2$y$_ᐔ ɐ i鴧O.34KdOcsx%9OQ\j6͆FBE EْRteg3\\sbxr\C99gnԵtX@N+"jG\ȅ]9,԰br^D jvp%\j(X$)2(Ƕ>_` .c_ %P$㵭.%%䤄,#OԬy ȕp:9QC5G}iuf^j7,C.AWB ERteࡏrl)Bp/.\8E2^Zu-eWTi ;v3cǓg1|(`bUŰJi[] * ˉE5R(CaUm9> Ja)] Ǿ?KH-go~0[{ 2 5 5m6ؼG*9 |ñ@ ZzTk{k#̇smy4c2BrynFpt*6~545́<ך!9Jcp\K'R! 9tإ3tƓFLIrls{rrKQ nLtta&5̤ei:uJͦPI0"_n 5}cӇJ*~?G0sߏ>wᐌy:':e,r3uGrj7r 9 ]5}dK;ǵY̆909\2\3lkr賛-u-]@. 򴈚Q|(r!9,DWDa15,ƯQB간]>\ W /D>I1CVp@}!m- k%䤄,#OԬy ȕp:9QC5G}iuf^j7,C.AWB EqPUQ8#Q8 ?cωsHk[K{Z59YInVjڭZC^Oףn6kzPOjZX WQ8P uףǮ3:ߵ5נAjzhG㻵{d+ʨdd+[мbjfԆW@!/6\y074׫iB·_vm0jX=TzbcWOzk~ڹ؝#=-~9bx516;=@Chn(vC̫`%8Y**fJ[^G_3-gﴜ=T9{4/{ X y-Zl갯ǯzWu[K՚!!X~Z|jckWbW[T'㵽_o|*syy+-gϴrQTѼPmTA5жjcU_=zbs-WkqX~}b[K W5>rU_ >xV߼<ߖgZi9{({rh^j[Ts\kbS}=~SG̵Z}dKjЭujŧ>j|PI{z/v{Jd4fcUɞ˾^i9{읖?+/{ l+ joa[_=zbs-WkEX~}b[K @5 ^ʱW%d4fJ\^EJ3-gﴜ=T9{4/{ XUߪyjþzXĪ#ZX>J%5:ŶZXkQC ^ʱWxmkixV^=}}rL;-gaV^jV@TC mkղߪþzUG̵^>j$5:cSK_5P >rU_ >%9 @n}8$1C;xlgG{ @o1Oc@;Ћxml᝞]KQ nLtta&5̤ei:uJͦPI0"_n 5}@{qⱍg'_!W)7~'^#}qPÖ tLM.vaE%'e2iuȥfslȁl,tYP-AعcO<;8C X:}kXT,^sshF 5lO/Z؉ؕ+"jG\ȅ]9,԰br^D jvp%\j(X$عcN.8C X:}kXT_EQ;= 1e䩔Q;x@#>j裆Uȹ:Kj$1};xlgG{ @o1_jk 5lO5{ 2kBk~XGSVْn|,gziCݼC߶Ws璫~N@CkAf1lMp[]VsJy>K67lЇ &C=:jïAk[ûٍdI,%C*! t(j8o49E2C:5KvɐFPCчCfv[݂، 6XO{=:jc }f7ǐX4Mv`2LEFN3a&5/ONөTj6M0"tccd\~3}lv }lo3&XO{=:jïAk[Kûٍ,rEnfljv s`.r.9n>9O /7ϧNC.5CfCd#gˢl&tfv[݂، 6XO{=:jïg׶w BrsyZD]> +"԰WL΋S!uXB\.+[@ E$zc [c ~6FiG_]-u6xmkix7_BNJ2TJʨP\IWC5Q*|GVPJjvp2t%PQ*لzL[݂ cl }vW뉳Ak[Kûٍjrܬ"O5l5[ PGw 9@ 7P m PԡRV!DWM E5Mp=N`-al zub__=a[6מYucdZOn/;UAGvvbۙ# w@n6o^~Lo}o @o؋dx{%O޲3t3;Ǧ'@'bt"FbM,QvNЙ.p"؉zzKwnY cv`OǞ3}b,Xqٗv`ثv'/~}˞z!NЋ=hol{ӛ>zCW iO@x#q:xm{֮);>{8c/ƲwcϾ$O]+t'Ʈ{̾eoٗX}ٓE$ݡ^^ՕБǾ~ w2^g+{Б=kqYc'Ʋ_e1}i Љjqw艮76}__}Ӈ=#[]7Mݡ+t']<K,㵭=kW_vdف`Xc7Ʊ'Oاv.]o}__}Շ=}_HzEM]3t=}_׶]Wv3;c>1b,8K;?MNЅ=kW^COt}_K> Ez@/mo|zG/A:#wǾ~ Б8e4gʞ3ˎ3;co>1b,8ЁiNBwz}_b!fOb}HC؃ƶ7>=;tБǾ~ w2^Kds =КwgKnRAWԳ7%7qoVoP{HV[ܭ2ߩlSm0ɝ `ܤԶ7MAnF2ߜ̷D nޢfŜ<mnmwۉ]ߍ߭:Ga*pH;PITHCN=}:v'_*&V87xmd;1"r3uGrj7r 9 ]5}dK;Y̆909\2\3lkr賛-d!<-fy. \H bjXL +&Eԩ:,f.jW -Em؉N؉6 nhߊF`#~[ n6e䩔Q;x@#>j裆Uȹ:KXiLStE|3=1ckhg[o5l=ȞoRzyYxyD ,^;hOW>Q̱X"#c]ciݟ(ߕB ,2|^s%scCc6 ;?>~m, X,1+, -2ȅK--6fa?ğC;B#;Jc_K`17ĘrX@Bt [h1#h0>]'kqHƦ>ad{FO n^ffgOb>ev~,Ǭ= /i?0v_ f,+W !J?e~D{~b !?u?e?`/qpEK?8h}8A8WG i+*ۦ>WY##[e]]emݟz"wGWZcUVXU׽C1zTzD_) }&`5#W䪎<Փkя'p-O_m"ב@ \g6Yl$?P\n}K@Պ>&p >?FkiO\x^#^^k6zbۭwEFvvo3rd $H ަ6^r\}C1=vTh;wFȞgk8ltv8f YlJ-iɮ#Bzo^{AO{ v@5m:fz۬)1v-`/|W`S{ٻQ#mk{ڰY}举1`.7ϙw2Sw0CwJ~%B=B.jWp|DL~+;9? _h룩/ǼGqKi ܴ@丞1siֽ/M#gST4&|Ou}<6縘:z>r<SK 3 11alLE1`??&Pf*L83e8bo4ji6-7b 0`)m˴=DRm K} B_?!y_`|tش:r/>\Sh%Y|.2si~\Ƒ 2i_ [{5w=d.K42a:Lm*dU0 kOؔ-M?!|@ۿɢ3b< b3)LwӐC&\ 3 E]LS51Nf̓da2g h*LLȢm&:q9ov ii &C5!u-IR! 6'z'NIdHcN373`suswsyz?@i\IȉƁ&򚈜ɐF 4肤8qd#>sNHdH-8Qz4\@>;O΃A0y Bj7x=?vZ C9pmj|>`䡴6y]Md 9t7CdUMuzA*՝nEvnȂ;'1zTtїKV Uy3%)ó!$FS co s, p6ּned~$&xA08e\IPx/I} ؼ`V-P6I&$ ]twB-mPԪ}Eup}ʺ1>=˅ED@>3=Eߒ9!G>OhZ|*Jt>@7¦577jlf:JɗG'-i|\? | 1>`|Pb %`D |p>>"-81\7zTr}͗?psbI"G.cUr^h0u1٬Ij]#o~3|O4jSXA %"u!Al'>/'#Byn0C@.8:2ɜYgAWF[7jW8 Xc7  `(  $@t+r78OW|zr dHO78tg\9;c9mMDD$OblߚWᡙͤX֪fKPU]Y^X\,WPRRlrr}%6kU55Y c-j;I+q.RvwgIjW/ jƿJ^5R +hB_v>UMgL[U͚?˲ jpe:B.* 2ع/oov:RWjUD\D^ 򵈼]IS++*䥴'ΧP$񩢿-uPg)Ra=걞Zԓ:rܭZֵ:QO=6֑} Zb\-}VZ 2|wYWxK;k+Z䟠 un"7P-nE?CZ)ĵt1oͰnMw- 7{#Ln`Oe_[r;Nן6nVrz Bn%Q۩69;8ANrkWBzs;)/xhwӍ2<ҿ5ve店!8h+jS޽LMgc=Ƽ{  cm~uys[[]1Ǟg=O6gxysY>O= OxVR%K*WaW}1~qb?O3ć`VBx <{1ڞdğȟ%⸺U#Y3oux /ta2M 36l{SOd#2!!K%[Rw{T}*o~Ǵ}B5?%eOާ*!>BM_bRtY*$j6#By(!}(y\HmFRD^ShOEf;:#NHM7'IV΍["}X3Ԩ%PVAqdsL$sd29tLtd=h:Fd hwwQ}QW2IP >jW%UA%x%y|͍ 2b [gJWƜ)P̡ R% jtW3f>U1}\ P^rG-]) U+UW@T U[E+eīƾYֶҝҭaYCFײ#uA@5dx=#x]v_JU $WA 2ejMR(%uj:A_-RRMy}[F䭴oEHu`Q ^ NJAWZ,r˥J'V;W5rmg씬Pbl{i}gz?3+}̴{i~wڶ3۷si]\L{BbSo_W ~YKj v 8X'}\K{s7w!}'\wnwEv ̇C!09|iz:=#{"xDEW >7<'IOb$y(폠Zv{.=O/ @_ s/pWBE?x9ڞC<?OA*X/SW+*}7NY&oؿ.cTE~v:*U_>ߐߠ o`7_]|ͻIP_A0F<^8Vy1W;5Q"b7ov#%i(Mʯ ]M'I0q2̩iʳj&\ YȂ貱6E%fTf:LR$*1JL*&Rd~Bt~ >]LC~̓>σ?Xc7z'Ix,c ].Ϙel0ΧT0j F()vyebc~gntF:n'g/4NF(P[[@N3_sR]rϋ9ciǕ|\k|zr?'1sDױ-bF?'m\af?_RUDkO͵;6du_^3x)_S?4~$ǂd{Rn^䛹濫1Q?d Uo2/E_E /_!! }Tf/1{{;Aq+ڎпgk^"lUx[Qށvw&HB{d? [zyAVz(/gI^TH^R{Ku+@5u:D";Ȃܚo憋\0! 2?_2G+/_5 MuDxi{85^3aV}_EOS7Ev,9GƓ`2f򚅜M{KK#E;==%;{WE񒿣{wz}[I{6lbϤnYs15ˤi0YeuxlD10K ,q싒Wr\%o(Fos(w7I͏G7ur![{xnCV~n=;tr!ܬSn#0mS 9C>N!OR/V yN|e~RGB_x TJ!W)%ؐB}o)+ e]ow)lCr2ӐPf) T/DC~UCȐHP0䏕4}lȇDke!p]\`6=2А;[{Xr>ːYz-gMOt6Y:-<ϴ%>b6V`kar\+|m!, yev3CbD!o|m!mC~ C~7폖-/kYloZ^޵my^{CkyF!<-![e}[ZiІXwZu!YZo5 ֛LVCβިͱ`iWZ5|Ok m]UZk jZmƐ뭫kWV3k!f-vX V+k!?lJА.Ϻؐ_iZ0Yh7Yi[g!k!Tņfj1guM0m>1lHl0a4-іlȩ$mam#ia<6Tmdȹ"C^lkW2[Ӑ}s5n\k;Khd:j7 V[v-F/m6!?d3ii~;_v̐d+C~mAC~vm!j?hĐ}hȚ-_>]瘷 k?c0~1yՐ/yyɐSbOyQߒݱ'd#Dk{:-!~yzX"[ >1fS"D=nWmsGv@ضk1ߏ#q5AOUp|tngd]9zA_2~#$OPu_㑿vrX(9|'3/V= \E{>T\yvlTs}aK!wD d1)=~:`M a1|^|U>sG y(1zc?v`/|d13 %ڞ=: &+_au WTf4L3ecm6>3!J̀tJ&ITb"H%&pUL $*Z"19zd+u(&os|W|Fɻ럙3(0?a~Ɛԏ0d[ݢƐcGaC>K]UrOϐ*C_D݁ک'*; 9Mٮ5^]fș-LfClsh-T6W*7:*姆V6OHmW)H~JZ:e!oUV(+ yrC/J~V( Iŭ?uGJԐ_QוBC~Kq*X߭^e~ aer!kU' mkȇl+rC>nskԐ-1%Zs%ؐω)z,Ռ)Ώ"w1WrR"--+[įBK4#yEEFte}qt --vw-2>'/k[DN[/;"BKWnf$[DN:2sUf"X@.#o9g$-◪Gԍg-◪i99H>k|us7fD)n_;E&Ev>t>C-׻6!8t.ȂnRn^#dY|a*P_"X@ضk1tG;N$J#ǝ3tA> !zA¹/1_?cA7,&_K.X{! 2hVš.'k1`EH҈ 0RooqlOn&RbP3yBΦ=%]%39\,֢L0 &DC?;$]gl`{b?lĞIݲbjI`?kk<6"VKo bFɥEWD>Wq:J^q]| ?xS|[89J;(>QnS''{͟5Mχlf{>2IX6ݴb{>fث4Ӗ/IeSM:BL6l;+oa='{"Oq6`͓?dD`3 2z~ &Sf8{#eDzgx4x~; Ͽ,&Wf>{뻗Y2ӼzdD*y=vY#oͬg]V`t2;!4ko gsfd+Y9BFeI#I xs1gY1YKsz kadzXMiGa0ưpS75z81%I<ؔI S7#4U?T뚺M^6A<Q ӔW|3^D򪤿ѽAߒW6q?N^$ OM /GFԗ5N^t$#{L7^x879gbƎ[?mߝgϑm_m_x~]O$#_nL5~Y.q_ЋȌK/z}} 2C;'~Zj~Jo$3Ow?wshN/Ч[8p_Þ҇dƁ/wח=Lھ%|@f,?ѿ=k ngb/QqM[ 2b (lߢ*bؾ`tMb+l_"G,%}V02B3o{>F- Ϸo82BNoؾJbn'y>],Mu']B],b~P#b lf] f ;c{EDft*,a2S(1c+za'oF 1Qq%l1u狗 1} /PFؾP^ؾP x[ŋ2%lߨszqbxF&l_S}!2#7 c>!lߩq}J[$Ϣ>/3 _߀a}C<ăxJܯ>]s~U] uidG]+3dTu A:dƌz2U7H_X%3d$22QGŚ dk8 [LdK"c=&[tdHf"t7d~xw2\ ӽeS2#GGfxR6O`?+eK@=L63z$c;G=Iֶw*<_5Gau8|<]Gaq98|vwqta{P1:7 < COb1"dMpqtB̞Ą*Y.Σ0*>maJfJ4PY}U/*W*ՐVԄ@Zk!!4RYCR u{2+\e4TWʂ2B^)/x<ʼm٫S,fMU W AP s,4 B@(hzMQ?L5A1C0Q/Q/g3Uǖ$1V  @$p W\@(Ta.j|)! ۶8+O}kXī-bX'" "ZmG,'qs2{dKLҚ\4lU*Szl6 ï8Z M|,aNϷNcv6l~}1iؼ3l/`l>}k_OK`[;0 ?C'2 oA!o2刯]z Hkӂ8vg@w 3? }#EAG$W=Ћ_~ЬvfCBgЇ? }v62) }x 7\4e+_ !%t wL|wGݗ'_$~0GBO"~*4C/ ~ 2߂!~#fBL>ψ?}?#E%:&'./]**5U!!ćC$>: ݝI⟁BpďJkӉ 7"oJ}}Oo? +נ^B'tC$t0MÉEjw+c)\rqtEWNl>~WmҐ2(u2P7O) > O@DOBdQbyʲV,U] 2]w6P뒠j j^%$ mQ6$DuHP5@u.v pY.#/5@$m"}wɿ+Y0`\=!J  >W[s\Q1x69e$a8M秳40G^FG!= ۊ"3P0=/dDHA$D:XD4ъEZ"8`Zp;kzsv_sMS#+_&m tӈ}o (}!EA'l+S=%ˈ_ #lf-ϡ8@ڌ3ğ%M5$mD_ & !nI|t;?_}e?z$㠧?]~mfCyy\3&o)㷾6:C k#H*~=c.24O4)B) /"} ^0N09s?oh]{M7Fz~j5HA~[ma;;Hs?>ŧ^Av.H߁x3؅ol+V3N02bSGu?1Wpoy3YEY @;_~-0g.g<o?d_8x47> ȏ??rQ5 -𿍸(,GKl&~`mm:VSHɬ|ӑr(zS0hW*ݥxD]77-[ȻHc(z^`SGAOu w\za[/^Q'~G(7pw@lWU@E_U`Or8e={Bg^'z8kpʀr|EUB."*e@){Vy%Yo?# {^?OQaۡ+#U]jNuDk!=HsxlE^WF+,Tpg*W5A(S^-P5@5؆ãBZA ;q8ű稍+VTWA~  P }l)ꣂqJ UWp812 *W]$0&H Ɲl+ĥ/0G^FG!= ۊ"3P;ﮓRW)^2"H'֠"ZZKD"gO<\S2 QNODiqȋÙZc "<-ET%.TgD舧uwu <3ܲoi)zL 5ςEXĿ =l/^A*ğlΓ˾qo"i9bٹ%^3~μl.Ks)G澼-3ܙ-S̵وk^KRS΄&ԴDZI|?? =!믮1 =Wg =+_ךܞ#C$ğ>M9c.p{A+⅀֗.O|5aЁćB7#>:Dӡ3O7 {Mg=Qc=Eؖχ^L Uį@6¶~Ї8 M/a[vt1i} ėL|t]K2 :Xħ@ ݅{JےB$~0tc'?U3_ږˉ_ #Be>I9 _[ۖ副 ]Ё7%>ڿĂ&(=i]{\4|/a ?S?7xS7PnʏC1Ʃ_{HF&:@H~;Zc!1[嶠<Hwy6gxko{ٛf(w.HQ 9_r9(u߮N$sޑ|1< g߈MߌrP~#7Nw|co1&ο MsBz$w"}?D]()w,zw#ubRSHɬ|_C~}Qrwku7(?&'Ix~īHTAt CUuZH @j"F>`$m|n~ ktłxՈMP @PuVyX0F.uz>h6Ala8a0Y0aP A!(; 4A&u`MpLMplMp!8.Y4ϧa,8(2vUy})"e@"( b#=1c>Qep*i3g)hάC8βC3 A h((1<. Da19'ısj > /b:i*bs">)S2HHC^s R@*|:qQơA2@öKPs[m%BpLQ~LLD0wQg.+#"]rY G`p5P%C`H`,BO$~ π&~1rW@"~- >;.oq|}>;.vF+=̎[,7ȸlE]eL iwsJZjӂ~DZwL_-[aR[R0[bdM2)6>:Oh0vPIlPƢT ad/^"b߷D}[K"EH_} Pg7_s f#aBٙLԛ3,5|PKlgcQv6FlϐAk!`X"}rl{9.DZ-q.Q/#l D"s߁.Է.Kb̄vx_3Q!a1XBXr<gEyܗmQ;2[{488~y /#Wp:ir_]恹 +sE~:(wϹsYE3K6'5s5u[VkH?QhFiHcUYTaT)\~ Ɛ0~6g"&D٨; \ئ-QAIlP 4Oy;zF~6Fyg٨?-swC_g"]ef5@M_ ڈ^mD6t9ReV*ȯXW~nG$#.U#D: Ho \2e9 uf \l{>pH?hVxfbĀ(5ó%l!XȟiǂVells6fD!?БH¹9-@K !l<)clc 97DϐbiKQn)u`ߋ]Z\+qU= Nb.^~W1J:uk=Lt</BB/D@Jk;x*T\i ׿C:H2]P+urF~6?eglgN>s]瓉}wq]p<]]n8֮8]pouq3AHOE yj@Cg? z,S_%~t6zk7η\m#\zcYo6[G1%SWb+LUk7Lmfd|h6ǴpZg65ӞM#l ?8#Huiܔ1d(SPLmiC ܶ(Sܶ e`^Zʌ%%n['si9Pk@%ܶ/ ~K9n5Omgk?EwU㗵_g}vܶ؞?/ܶOܶj "+78b[$a]^jK lkn lkLO=&Ha[X[uICN Cw=E|Eآ{={~Rl3b~AӶ@*lhZ/&+&\1o1-^F_%ea uu9H9^u@7mq(sqIϷOd㺣튮e/?,{ꞲA'v΃ >0#e=ZvxIO]3e4@z~l˶_!*mf2N<[{d */dH}TFh;w T! +2؞_Hߔ m@-!z{uY-{~5tuuWznPE__Y r~[).s 8ڡ( c3M[drr=x[ہw&'2.rֹw&'2:OhwilYEn6K$[JWeX**l*#26Hw 6_ʁn ؎F },ң.ۡ &@#m`+xi[\j 5A_Fls׫ڠ 6`[뱭uHAAQe D@ D@?c 16ıw١Ru@-or>Qn;u>V𾻭:K8+!.U(L8t3"#lN;lP~#a)t(A~w_;*ha+M*n ѶKqZ+\ܲEF t} sWߝ|t i퐗{T\k tnm7qHsيr :Bw¶tvو ۀrU )7< x?xcV`+%?WPh+OKů8j3v(8בCg;w#z?pCǹ >>y[m_- >>ǡXE;hl.iYi^_e,3~wΙż{G6w?m)n)?c|>:bPNG  IHDR,sRGBPLTE@ @@```@0``@@@@`````@```` ``` @@ @` ```@ ```@@@``` @ @``@@`pA! pHYs+&xIDATx^흋z( gt!AawZ% LJ|DQ@DQ@DQ@DQ@DQ@DQ@DQ@DQ@DQ |~^.d2?!>R|(FY^[u8Os|mVߺ!0^.ȣfOdޒ9S:Hn -5]ϳ? 翤u: < ra49Ů4qE/>N~Zua?rrr( ( ( ( ( ( ( 5%^H,eWWFJ| w Ǫ^ %_|tÅ[b-u1Po_\p(O|1ZKO w?2#$g'%1/a9xOur?o/ Ht`e;*T2W7०&{bsam-F8yjlI7tbcQ V(k}"`2vqΖ:xzYmEW@f"[MUz>B`ByͰ(13DZ sA VūaW܋a&9QsPǹY-6C m,3[Lf"uw{n3Dc&9JG^n.w=V#I?~ @N>]?M'+ ?KDPR03+أrLPps'ry؍؇V|T}dXԉ`4.(ߴq \S݃_#""Qzg}EZ<?p_hH߱ċ}nTx'huܥLmNI +;o! r ±V:}@Oq RZ$T.?NKALf"mG`pdȃy}p{1-X'9Un;"~ qK ƏoO y=n~Lcn7B-] ' `G׏7N#=7O'`~ {؉̱ }Fv<=f=(7y?b>~?kS'oY5 i7~:))~z@p So}?/F5y{LO'ѽ7Ai,}@f: GB>aΉ:{CWo}!|Zsf"íF>] IE|l uO#ė?nr G<<_ -އ{ӗC/ܫ}nWK}p`A: j} >.~HeȒ/5}MLOF#>A0$dM">a1ʄ2oOcg~QW>x3&B^P׏󧌏[l9.`GN ycG1l{O[gd&99/4*ӟё͢RWOQ؟}_oY_>PGΦx}OTÞ~9'2Wv #nD0xb&l}M')x3{xi}PqFϴ_7 *d AE_g_ (V:=`} V9?gtf}#z|,?$iE߇o$0[s8N*! 5΀D0c?DY>A{9z܀'v7(PPf}1 0ۺsr*1:l}#.*X%{m)8Z, ~X>$C6홒t陆wDUNuHGxsb3%K.z~: ,'\&tvï|}Ŋ܌.4zd?vjzMj o1t3j+ 0$~cZ`]}dD̸4኿:~3VͣZ'+Mkڞ>Z a~Ýޮ_+lJaToiD%pl K3} qtwp,=?~~~~>՟z3d IWY݂}epSDt [Q0N٭%3.~ p 3:+<4{zSu n:Pzll1Ƀ_GK7NG6~`)hՠ\Ff]nsgŃx,jAO~A}YBw㳿5b{}5¯a~F\(6FPU٦ÑMHg}>Bs4vjIj~v0ӴQJpiÑK{#8DҘ;_O3`Ũ:_~HX &1N9#hy])0Ct@<~/So]AḮ};zWYX 6gy~2_~՞>m4/lk`cowT;qLWp_~e3ރ8%7a_ iH&]fh`ߎ_6z}q[4xj|}U~Tۗ>=Ҽ~Jkև5|+/0~ ]fنlH뎷V`y{+5E[qOg^8۟>rnˈrߟo@Pݪ=?P z0I8J|3>`7!ëD{15Lӧ.Tv@|mQ)TvmX㏈bZk Ưt0ۄ>߿VjI 8`U6)nj/Hη?(~ev@aCOZi~w6MӒͣmMV4 įPYPoiu>@_,~u髠pJۍ=}sb~D÷m0?,D I@ǭD_}5]У0{}1Z_ ~FG~[Vx-L_jmnܹ/[ Wϼd~ u0zw8cևKWO`ċD@C<{3D`E񬣚mks/V45#AINLs:í=H wޔxBkae#ΉAwϔr`kGi 6Ƴh V>J$>J/)NLμH۟4܋>yT.RkW|Y9}+g猩.$Fs}TDf`&9\pXwʙ賏["`wrm1_Uyk=@\pŒ߱K7~ }> nܯ8oM 1"=_.|/e9q[W~d=7m^O4{4N9״M}K@,i״$:{:? F3pB M ߳g)~{FhfWh#>:sc}{`qݿ.I\쯍{|5As{*(2~} #, Ж|؝].%g{$˾ҁ/5}τ؟ɼ~Wop7([,5QW7*]G{6|s@T/}ۛ#B?;8o/R5bY;k; O"JIUs]?{|esGmyїL/,YtCLސ1"GE :ԏ.=@L;*sg7E3SuW̾5\ӄp_5]ܖR'9&Qkp[Ⱦ4ʝ=!c ~R*Os>TzKJCn c~(y35LpÏU3m ~\Y6hh&pk+?:~K t#%8FSf_o|E諀AID?ʷB l? `O_!zɎ;xMO r6p,~Gn?S'4FɄ >} &1? w6c~C#>(}*Ψ_&w`Ňj﫼?$i$fy.0@v8裴}`&Cn_y3 O`k|\Bٷ?=4)`!wзN >Ǿ3zR ݿs/H~#o>xc d|''{@ro0,.8(=:ft򛭹ΐeV">} @HkQ"#o㑢˗S. Qs8fhn$_ b~bM2- x>q橻j$:x `Hυ?q^"mG/9xg_6r~ 4P%q?onwIG‰ p?efwIH! (AEm{)-zH: ~MH=DT+߃?غHE]MGvgg˔E=T6fH (CA;™߳'}?+ʃݿ$^X 045tuЗ+JQŁ,jP#bDPUN0QJJˁAVsP8诵? "pˀ?}UNJA<;e_!2B.Zl>>Wd?Z<WG'Z~|#|<,< $p)?Un  V:z}֛r@{+~ {g'JV76^+E* 6D6KE{hBX{> `@`fn(v w!Z0|Pwq=`#.e&{!6`焎Pݒ0ڹl{>.:+\32Me0t(.ѩ?yoiI2Z,CWhXF?+8pIhU[ ' Hlv@S)a=bVh{;E oU#ڞ`2BJB9em=sjTf" "*Ls8^-%ڀD0DNUpZJ×@$_Jx-רN.LJj~Dw"OuǗ\F]~* { Y>ȏo93XQ@HP! ( %+M/%( ( ( *K `/U Ⱌ:ėJ`K7QX}-8 w{#uXΠ /M@2zpp ̓ K=gh9('CJAvjNV=%\c^i"N"N?4KO5N7޲E<3i9윬@T&a?~icT90S P2rM+X?aI\*ʵ׵D%Iq2Ǔ-V=/Ǔ%Fw%1~{dzG J%,G0[*;A[ji?C[Z?G)+ytk҆_F@22eHUb9!oJ1ኬP;x.YE ^ڸ㮐 [؝ֲ0t`Ըe);bۢq<&T;\ 1.K{J(ŅD?>$ԼJaX$Pej c6]V=ۿxW=>lО&y{+sYH+MXUk1)#'2T#OAAí5zgri)団'=rqb\p[e+5|k[ dKQ)TʼnSz:!j+qriI?{r鍜=:] -g{pR:"F<]SZs̓ou?z/!8WJSnܒ#!iljPސh4)TZ:BR+jFnu޳ bExݟ]Exzz)>(#C;91:c'u\t(tZ J#ԥA5v#c\ YHf!|6Y0GVu*>ATI'ڣu؏|Ld(Uʑ^mbTV/(BVtnYQPzTOnGt=~o&XT^gJl;.=H3=%e}Hs^CNjqv!s\DڗÓ˳g;O8@@KMb$6r%'6qϺ>?y3}(Q#uϞfhOeVTWYlK9ae4ђ LS13(dˊyMRҲE z,+4GGV ;I/Sn;u.EWdw[DAwjLTh{pȋuK)ugk)T?30Rœw-/6Jl}p)g{Z_ H˥9Ld.w^bT /^DDJ[KF)4t{Tܴ:'6ꈊ2`{a9)$0 wY?L;bL1Hoұ{zX2+#&%6/UD f[=od]wc[wChb -ki!5tKeT&+}ȆЪN ULr?y{S9=# %󌕻nKĄ$BANװD$E,푶/izKpؘo,s3wƓc~7t 5gnŸnq7O78rLkF_/`3&2#rGǴ9ǰ1!.9n=.VO[O8q[ONL/7?Ĥz1š߄5qMMo{&Ho{隒$< gj pK,2Sf_=~!Tq%Dh mX5OVjJM3I}XȰn_n.4O->l:=G?-761 N%bNJ'-h+:u9l)cECU[iO!H%-kði@o\,b0q։R"BQ\P#.#?tqɥ"=݄x*=Rnb\B5!E jtE_TyN7.H.Gэ nN7΍n6o9]G|BR8M''ĈPUy΢C!tLQOLJO:TH'ݼ4 qndInK!PQ8qRHMn|rOԼrN5!tjh/ϵIbL6!҉T<ĘZZ$Йj8SٕXΩ&zN5*;3-#=У_9g>G;dl 9&%x'}C'-eHveRi}y_|_>¹'=)=.NLhqة_w蹗FfvJ3\k yIʏ~/f9JN*a$m5KpU=Y.q(!ٻx3;EH fxP"!$F usY'S32Rҳ9᳎?rPBYOYJO;!,;EX.NG S G9+i듒/7&jv[㽅{cS%%z7]褛7IsMN1%V',KOJ ^qոND?+%-=5_DN L_-|tw`2o\9қaBߓ|/FG=HoyË7_G-f ]7T_i rw|Qޛt.(Edlq(JsR䜭sQ:<#7P;PvP%.9_G}N=8 .euhlvIn؃C ik MP (/Bo=E@b$ݣ)*;*QY:=K,=⳿wGYd&ǽkPfdd r њŨ 02ui>R{2"{:*=Ɉ~*FolFwS~ #3'>Ӡ/~D{Y}vw5n b_ݑYW);O3%+_ %=}P #?X}a0 Cv]zuЯC?XKfa#}; ݳy6a6΅pS=2_@g;Dک w 5}33vU)k;ROQE #AeV=w\8 _@_iS1uFvThN&#&&mhfG50Hihllf=p6yҶ~XyPñĶD{Rj`3;'1NI: [ت Y'_GGCWN([ة w=5n}3j .| |O49d8IyԊVK!=):Ey:MUe xҪ⫳|TD< ì $< #ѬQ9V5#%8[4|m<,FQ|2w8's2dk©8'c#ԯ~ փX_NS4ҧ g';:gC=lcUϲ5Ye5Dzy9TkwmxǬ)y<NRƘ fu#4Siw̪< LɫUBBO* 1I@OU;(h[:Zgu:Zվ>jᜧS_; h98%ݩN͂ iy~liZT|zyQvzi se}WN߁Th<H!=+jUsi)̘))ҩiڙ0"#ЛG0si*hL `*'S>;bs6ч؜ m˙C0f,I_s&]/n!3Y3v3fLɛCٴ? f҇A!0*Ѹ=]mV6=ҳ}VF3ܬN'r:J ;.-VIoBܩ;]n ?z!sP_4݆ 4ѫ{Ճw#E]mtnNyT0:='BE~o{כ?h' w#^_+nn:| =;kjE3ȨQ_"ߝq00 ~FmT F5.6saI:Q S09Q9ho' }[rb@@6j`66}vji}FUe+n V#ҳY66ad< y#yH ;Ưs1mL+[w;Ɨ%jpyOK{'P5yT+g, ~A;"{b盡މ皂KïnWk}|ۻ|ٻ}J~'()~wPwNmyl<įv1.Fl&~t?a+e!~~}O}}𽽗}Co~{7'~&.}'Az;1[Io7b|_ϋw1ވ?7 [al;(i,MA P %QB?V؆~UY}_4wcx [A^GzUĜYO5;ˑ%)K<%kl`%,'o-JV[`3y%Y^o5J–m.>GL>#6KX}1~[LLK?#.^l~_0<!ω y_KY}|$b2 a o&>gl6E\f0XTSȟ'k%`C031[ӱ9 a dE$lO¶? atgUykc9H«{>g&} 㛀W'0 & DE0;8x)[}[UzE+{ ~eeԏ%"xs,##H:ףhx "KXPg,uRE_1hYl?Ks0^@~~U^ᚅg͙̚GICD~3#R!!?rB4B½} y= {i@o>x^;q9zܕ9+k_p'tCN;#>HN|R=~t]p'E޿lVʷr+7So,J+G̚!HT|x&j0Jzn"=#w&%}`)̍p#eԅ %vp=7#7A0 72#n-rhM]K[a=k5UКt;6=ڑߖ mʵ Ϡd,h- WὫUDKp5\eun$S&+kq$W鵫^xY[KdED?q\Wz2kex%0/c]Hccuc/ %=qSzS;]ߜ y~^݀uُc>u?r/yج@=8lVʷr+7So,?J5X'T5j '8j` FZS&n5"QzQ`ѫ)<;jNmF)v~tbemnmfmjmvr {G>`A<vAk 8V،\B~ %mF+D{ }xwl'";N؅@um:֔%xǥ-,.(ĻzXFߢ-c[ꕲIU^S {"Ƣ`[b~IyyyDD9Ym>l>|_+tP6'YT&lL[9N a*)0)05L!Lót<;NǫYUz){>s]֍x#J$i$Fc|!?r/~Z16? 'O>S}38}Gȟ9MO7=cKx^7{Oo[;H mü?_6f(f %-f a u`6ak#F)Fz"/chc }Cз1q }Hz%e;k6w`{ %nC^Wx( ]a#d*e2?i{gsh4M%`1}"='\aC$uGacFbs< O!'_?'=O0y$dwom)OJ A㒆 CC 4^gˆNܽQxxv~9IvQp,Le+俢]|U/I.5BQYQy%j e ڈ{woo7ےFw8 w={ ޅqROp 4ޥp[wo)Bº1 L`xkCcoHE5Db6]&ZSbcs"| `2y b Ld)qGʶ. { ݽwψ\`&y3(OgZS~Yp6́/il6"Qp 3Yϐ4 oнzQa /B\ M b!.}B2}\%M%81ȱǢK~~3h Mwox>Zq)|a!y k51X-$v7~ H/'1];\DX%\ r䯠|9c[/%y1* Viݍa #x$&Xb1lILp3%xU E/cF\\L]Dn\EF(A,8-)&7B1l"XO~ƒ"ɥ_ޥԹ [arhJ} 簅^¨P[K8? |/9 < 5|ކw]Ib r8xR;;i |YMC~oF1ǫ}ۂ~E' 4Q/A:G ?@_#:lȁ\|良 8Ч{[5?Nb bX}OO$ғ($= f?3L8No!L0 >)(?1rϣ<|s*"O#Ӱ]HS,I,Yt~zc}$\`.f9̓3 _Dy)$噟c _'ڛG HIYeR>@MR(F:XUf%,%P ~-!&ˈ bu䯣-1ZFi! K,^JI0-JiKUѫW%A[N:KFjhEy+ZQOp m\Ca]CWCK\Zҿ+i!YK;Aa˗+J<(mxn"muy=G DF?&7 RO  lT5*7<qm 6;jC>I'm-])[٭[8v=#=#=m;0k:NЙVnx$}mU}zDnO?ۑБq3:Cܕ[)J]i 7CG0*g^) ^V=_ww!INvFTFy)wKr3Sz@OH%Ow7%@^&e= nNU^ |)b h}!- A:diޏwC~ֵǃc6>"CB`IY$mp̤<: `Sa!/OuN|__#hx?4> OȏR(x=_ħOG!&4<O'Kñ4<#`$yljHȤ<eRԩk׉U/K"@|<~?ˋg,L^WIFu[aWʁ\OV>yBd!g<^Le'>UOXƱb}(r/@; c43F̆9sX0N0N0f3flւ9xs.\l֧Y03`_`N^!L )@t~З襡F4Ywt3%y \H:)F/ ,eQ?KڨWdN'".ҫ{匒oK-lmmkXȈ[h[ѶL2 L&`3Nu2a`+O^tC:u+$JVR/D <78e[t7A>e+| ȣ ȅVU^;;gPC_  [f< zX[k"ȭ'EPLD7qLH2`=y백[ho=bKhK*m#Sӷlg]%2?^?Qv]]Rj}uÞSSLS6Oi.eUȷ5DMy$`Qpnւڤτڔ sdRgdA6[']  =lkoC=\:z @ y.>?c ɿR΂\sY΃Oh,b ?6IR1B1gq|34%6Cch|1e 1iLl.'FM9"ǑGy)Hr3/B3D{2) @?@LHB^.ěUU%w:nϜG;}̎xf w%+]-x3/wO7su%})K3)u ](^g7K ;inBZ&Z&w杴y7tw;QM!п[(@^w{#NIB/墮 ߼{(n kn{O<ۗC/=XdϘ @&+Pc)B. 11r ِ3%Yf|I_@/́\ȣN>zb^˓m`ߋ<n!RC%}!2 @~&墮 `>DC?ރ iix ZO'is8m> #`$(GQ>$#Z(@^O#l$r!ɿ{g$ȃ\AΖ<}b tX2EmCd" ?,@LYĿ7r'LJ#|1qH|&d\Q6N'VY gPo:NB38MO#)"XCY.F>Oy}KC/A:v2~-gfDl.|//|fxo3b.ȳaPgys(K'Lα/&#hwl@_݅Dw!m.o`)|/c|˨Y7"/$_oXU","oeAߠ'X"cGʅleG3{(wJ&%$l^^#;x"w$7J>7'U&C̃ȂyRs7ZnYhe9 < e{Ti>L0 ?C&&PC9cM$,zG <O"?A?Nd~\A,g79ԛM}ѯgU^#v%"~ ko㡷xH2@9[ Wdy'kO!(d\~"`Γ|dΐRxWHDZ0f# I*;ŷ_,b<-5k_kX ױŗkX W++XHy7)*tWj*+a,Lҳ< \=6&M%[lyd.4ʧWHBNlN6D1(fVx~.![`WwnP.'}G~D1|)I9MLF!L7׽{/ùʽQ @ F)m[fKBBRr\Sͣn^S>r)o:ﯡg8TOV)J"x5+O2?}ReمZ]>z2*'ͣ:ZͣX8Vbm6TkQA7U=lݣ( Iif(+tU7sx"$k<+Ϗun`[s9T"҂"X,(rU{oF*ߙYe9RYg>gVV)+a9,E^LBʿFo_Os#_H2܌tGt|=y-T~Fyy^yŕ_T:+ϻ[hg+x}֥ƽȳWnadYod?VW+nX݌\q׸ݕZ9FgW3:YCqq+?eF׺q+i7]C#ޚl4sB5Ǹԕ?7.6.r )ge:Q~uQDʗE7rR.y2ыV2'$$"]o`TO*̧%"-8\^EgMoHKK'-8`)U{.Fw;${ns#De쇃 Ro/H[{=S~V՞wQ~6?y9ol<3TWs ߛSTI=nWCqdW~XT3yYӘent:41Օ7&[%'Gk|`%] ]jSƷ7\xŕc/Vwc+6FYi3=Yy#7"#_NG%H7Wn鑯!##}Gt{,5"W޷O!{>fZ[\W{>۳'5+K|6־X{ѕ/ؗjϻh(;Nʉ3v+ОԆG3iOح=oxn=ߤ ov围7St;iC]6 v۴{yݡwivk{ ]{- ~|WMoEߙ9E ϲn-z;J?ӕh+OO;]?ծuv]dWGz*r^{]vC]wFf7|sݱtۊ7$݌Cݺ"ZyXm_U⢊;ZID:DbRU[M$"#UT(7Xo) q w }0>DOHO"o L%]H^r1Đ'hCCk2eI&YS1z?Ar14>0qS.*աM8z_(MϕfHC\h@]ECM0Uy%O/Wވ|U-g.gXz ?y#YS6#X as~_ k֓.–ho%(nZkZڿ ΉX(%Db;.[a;j/IZazߣvx{+~۠{vW4jo*j>#"]#7 }GnD:#'NWno$,>I>L<>*uEE+rQZR/*" "Ո, DvHȾH{6BHBK[֞9 q_M+~9{f&Yysf\]'?HsU_h֋5b4BN5֋Z~)56lc[LodF.1o;a|31w!}Y YP77i۠_2wutwsޭ߃rGh ,p8'' ?=GE/E:|G^'Ftw˅?>&IE/m*_U_  эRgAׄ)|oAZ{?=\Q ǣ' ? @DRXNt(VtE—}R3KAxi;5 #u?MЏ ZQN¿-|C%XtSӄN~z+oFo>]$|1D2 Os 7b] ]GDf?n+|{ ]o :JD~4zS%<2+_,|&:[^Z[]W ktScǫ_ޫH03Otu~>!LwvQ~l"3o::7x2 (REt O_:UavuTa/SϬO+TFO[5h0S`(8b<&R,5h>3V>'y,9횫'@|`c"  ZQv/`lG3Yh({gמm϶=6S_"*~93K%%fOK5}1?|BB򿈼/$ 9Fu. `&~s-%>mkGL;bM;5ȩ|>˜ϲ籎ll7ߞhoO4.1%FS9ޣ<K$$ҧZѼ˴ihOЊbWC*z~%GJ]Օ~v#19b9\n&׳L,l\< "]Q6q,zY55A.dS[V6N|u݉/e,7u汎P] תt?Haw2{j1Cb2Lp )eϕA901,[}PWž)a}X_)P>ȺV Ǹiΐp+Iy{~l*4gӢiu7^}G7я ^Wotq~r4ogoOKmiz.ME6cal .cmdg#;gA[ᕑ5OkfxZ5Gv3Wo臄onj}sO[ ,;_1ӟyн~>= 󆢇 ?=Af*f BTtۊ>[R@#S_@_[Pk_h[:b&[EU$C7D7Kgmݺ7vC=zF~zb=G-B>F tg~,Lx?[E~Zou]B/n$|St3[ E_Aw{ ?+p{ $᧢( 3D ],|]*J/^k8k ͜aѭo~QW~G~8zcѓ~:Qdנ7 >],|\c3_DYFgB -k%|]t@ߒjx?X hcf0 ?rCe{on_A ni%?jlmfq>(꽾>|5E\~׾*< rXZҬߕSOS^FʈO}k_ )lU~y]7^S_Dx|u F'5=0=YFgIǛPөF/a߾Ld&PD§Ӊzބ.moj=;pUFw衖DXw<eSZK |ba1z!e [XE:RW۞$JؿD&VtSN*YZ iO|-fMľET NO&d?Hy׈}JWH#fhih5TX_F)L*fiXyBwx,q=I۞l[J#*]aeTO蠶xz_-іőQ;_đ#pGSGU!G]GX>9̃\Ȧ,3[V6N|u݉/e,7u汎P2&{x9.}=dkY+&{d מR\!asr9ePGY u%ַB8胬`5ג>2}Nq@Y8I6Op>qMԛ2 ߭Fп]CtcGit/$5띚(j$Fr륱ROp}e^TzelrOO }Qh}V03mf32[ :?n |tSsk@-/; "OE> Wht#ѣ T  ,|*:]L|ѥ— }NK+t kB =k _ mMfmOZ(|t7{{ -|,zㄟ~X(|2:Utt\E—˅?>!9E/m;%E%G+m턾&zoE \ { Zw@w=ѽB>=TOpxg-ۮg(2t 73G _.焿pāB׈*tMG6uDh<^=;1;1dQ43t^7q^GQEq̢<rϢ6er!-zI64kBJ| )ԧX\#.\ekd >1lx$OL(47#;Q_D\۩[T'N<qߩ_SzfGU寮woRލu#+R^|v2? UpBG_f~僩LǪ7g 1Xv?c9X^՗~]h=@ b*>|Q|ve{A?ڟAF?#ٮl0>3L !3cA0LyPÑވClG4c(  g\Au027gɹ 10ux&A<:΅3g Vam=ƣ?qԏ#nc|B DSGİm y-l1FM1F>S(WdK8Fp, }|BZˍ HB'Q# (F{xY$Tdd"R:WHt=Vq>8Wq,_/z+z{ԨUcW[LN6FȀun-wkX:B6Fr h 66YV ˊ,?e6M? 2)"&,d6gMYl[6ۘͶne+[`ۻ ! a>`3~ u[}`YO璑>CU>I vwQ~!y ~0cǑd;{0=Ξc/|N(B(ݔ&f{h @O4` e v{bm-fEMyVtUw%Qs<2(lu%w}S~<G8'lj3ad0ַ}w'hꢉ@hc|U?/aO|CO Pg8Π98(;OSDCA ޲FVe)$F+ R&@%zG?"cDžo~Z6煿mu#Ra l&}T?g6 o%3Á|Pm hާ53ޭ̻?C2oުJ5k1b u:!qn^Uzﲵr1kZn*7!bӿb]Ewy! <7q1Y{AW7󠘍[fhsfFw7ZElV{ζzý.fv[6o7ͬp6էu3V8{j[kZ-f\l5kٛ!¿m-u[Km-tb6A,w5C9%f?Jp'XnnITkms; '.F~5MF?p7榋M7YmbkC`Z`Eo}/ܯŌ?ČwﬞbwጳvW7b3^k`3lwroIkۯupFn}p/pGfv8i+9;q8`rwtߴFv8h/ ߥ7gn ߭;>\ߍ gTpጡyv8cRgMtW n}>|#fa73׻%u?dtW3?wO?{p.fr>#NU`xIY::Y笘z gl|t;uvN8Co%'S::>R) |gzV}"1#NaN gqNo3lNw6N8|gZd*I jgZ4UjΠP;/tR{p}N*skg^83WwfKL~t3XFE0īk# DPEƇ3RFƩ#጗Eƨ"U8*82"/ WM#TD1W1Wf]hrGUx%榦v]],x*<\ 3i@ndxڣ*<<̭4 TO{T獫uW1UAi.t6t5fL͘ށ.嗙N4%ToSabL8⨟՘HDz@Ox^"=>G8WPdnú{»lG/=i7G/c6Y~5휩:?~K*|f|f W`"=3``˽L zd?S97A,cCèFfGGQ6ƠRg,g SS`1S`2$@Z ĦˊW)L}2{1_Wn@&6>qj DgA6s)L<$CL|d f7TɲkF1ף=dA,|%\K5ǣ<B"{`/ I`ǩݰ >YVij85L$v"&~*|O*%6-elS)V6g[K|f+KAat1fgR?YwmfeUkc^N˹=9W5r𙡾:ɱ 3_f:~:ӨF8:sc(Qc9=Np>| '3%hw'z8G8WPd$|úO,sγ}l9[g4{Q_'eS()C$/w/я[fH9!\6> Zc0>F(<3o)o[nk6 1`6Կ3aާ̻u1=NyG?4o_{oC?¼N#ƚ5x1ayN#fm|SL7=5.7߹bzO&b7<'F@qwny"#apݓ6}n%sO;n?a︕Fuae;%2Zamr%F4cwA+}XhhhrX+}Rhhe-urkZ[ݗݚv_ݭ)bDD[h& q`klYOQnOqֈYCpA,1za5](F/$Z}ebB宲:=wnX=,1Zaͷ EVwfCV8Z=iy+pzɽd(FGwes#v_m?^k v+f)1:[~"zbtB}1onnݖv7|E}]]}ž'owow]iﴸՍMl_ '/15pDqmÝg7kV_nR쿅w*G#lʳ>vۧ>'>No>]l[{x)V;W9ES~;;MΎS;R9E5p6FD6xYwZ=+FsV:ɁIRhWmYz8 ˙wCg |3C:UΌ)Sgr?sx']0ə&;_Ks5whVΧ*|'* Gr5sNl೜wjWENq}·?|9I: y]誾wߝ.Gs8Z&: PQy%%AyYxIՉ.|GVyN3#U"mh4SgQu3S}l!iD/*2NGq r&yKH)Ǖ3LHs i_֕Y|mdx{%'Ig; v (L2BBBd>49 (eG;9~(GqzNY9ϓxI#nNSp}ey;~9By2%-??@J\q|4;ioSI|W]wՅ|M1o#:R{ڣsCfj;iύwnU~n,ͷֿ/=*?75s42mmTkq=s\暤M%71NqB_leo3GmK/[Xn( !75TePNG  IHDR,sRGBPLTE@ @@```@0``@@@@`````@```` ``` @@ @` ```@ ```@@@``` @ @``@@`pA! pHYs+%IDATx^흋z(oI n:;3 O5 >P @(P @(P @(P @(P UϭeW_xew[wUjQa aj:ؒf-m5P`Elr:/!خ@_jޒV+ [=E5EӚ/,<\9'nEp{k"d6_ ?x0vMa:;7;4n+6;l#Ϭ@ /c? K"5 +g[ݖ/ g[J<+[pMveN~9%~l> 0kY.*0źtUKonF4 @(P @(P @(P]xKHfxt[Ɓ.egZĺw$D& ,6;|ZhsTME@UV6SMSK>NW0aJB&!E4';[yƗ; )l|}(ik(LI`sr+CL (\LJ.YP..XhuNP&BjpokjD Q($;W `?A1-Pʿ'rLT.NDxd DȆ8("?29J51NQ)ץ#@}rD(V*+lI%0P&B88D(_ǔи (\chhf b*qfST}\p\6#`|~،0mmWc$tl@zd߆<f ; [G9;߲.\ ل(<`;&mkD(7nPv `8|>g0^zV&B@0 ~9]z&>L|(\޻A1`n͂7ޔP.lB LH}P.nd={mD(F e"9(;Qhӕ2I8Lrqjm9U&B<"^^Q&B8Vb?#L- 7# [5mL |3DX嘨\b)@݌,= p@V?u Hҵ2~u? Q&B)•:<9i2]'zxӰ}t 7/Wۮ=>Iӕ-I>84`8}z2k;1PGYՓMs7,xnJN7]v*5SyP\\~Ie┉P.$/@wp'+G `^"~$U)WR/tv!=OuU&B8 Ulj_92#9آl,Z"5}۽OوZ?ݗo<3*}^Tm@{R (۸k0K\m+> ާLrqb=)} ]W8tpی@YϚ ?eLrq7yf;`t'dam萳[cle"k[_=jv[OV'LRLR,0*\ܭ1jm)+- fU6]vQ&B>uw⛽dN!*~O⨪<&KP\&QN&!Tw}YI)f{@MW}Fte'_-OU|so&D^MYzT;6'~0rgd,XM_4S Gni2P&BhPxOzP.Ng*pB2K.D(7uD(7~GD(75#P.Ng)l:No)\,L(cBN[Lrq?IQ|ɡNe" mo5P&Brb.۬P.Nx2~+\Q$ ?9ٕP.d0~:kd:L՘pjjy'!zxcуkuxWtMó yPSh:ƀ]s$1om4+{tapdZ{6MZ9ɨOwZjЯY,{Yc4awyP@{S'h~V gO>p@Tq9kE&\)W5ԭ镉P.|j9c5ȶ-v(\ %^e"<'ۚ2Ɋh:&!DU8UMH-Iv_9?c~af8h /^fELʖ\\bc/5?Q;٫Lrqc9j,}4~!7Bﲡi(~'wBAԞHܢ0~e%crqOb,~F u'p ~~YrE=Su rykB?1Q8 g !x4y9[n 9"O`~)Dfa/د*D(7=C#@[o~pϨ)m/A#~p@! {(O]b/&!ҷ8`ܫGcl<(S.W `$9;Ev |eȉ@J$ㆀ ~q`v4e`g~?̂vmr wd!X=S-솋^ Y!"ꃾ𓋽p@J-?aQ5 Ny}%B+~âܣ swʸēl_7s y!xi^OY{r9UKFǯ&>%G,#tdoiXػзZTeD-pDA'qۭSuK."Ȧ3c~Ub*j'eD-P=:2L Ãߣʍhto~1;DwOT1ї1M{nxђ*L12n1<x{bܭ7bE+i ~?yG X84M} h+npY$ )8S_Ǟ|g .(z#P\?I5Gҙٵ{e)͔f(~;NC?g}8?7. _Lw; `OrxntIps8w}E Ws Vё W[h '/ 4 )/% 8Ι5Zt LDp4z 8^C&e 2Q-GnB7|=61έ,n 3gm7 [5d1*$wj XM n/4?ڬapm 飄`ge$eD,O>2\_}4%c.8e.:G:Go6:`}Ga"#z)-9;G$Q_]vͽ#HGgZCaHDnS,GH=:i{C$֩/=Z?IE-W1\NŢ$۟}r.=%rwL"}\^QC@Mj_za7֗ϬN@J\?z>n\%W-d mQ3rmӏ ʒK$9.lmZ v`Z/+ELŊeD-N|em[LYaA7t <&tUW?\,|m~,!XZ 旀3ޟb5:H4˭7?%E*c@Ukֺ_no>ی>PCB`̜2ŵ`TjoxD($&J$EhLrq i_R/V``Lrq؟aзPG - jCo < e}znS<-U.0 VՃBG{Gf"g"x}3ȖK"f}OP5 5!i~pLF^zށI[dUltyGb):X|FTCa`WѪ颷ѥ/|\y`q#ޝѐw) + g®a %\84ߚrb}Pa񙀟>oO:+&Hf}OP?v?^i}?CЗm};T4\^s@_ ӛ )#8 >q;_弣󚋵{bґĤ8wBٺ( +4vQg۬Oxς2Ņ6ϯ,"Ӡ_ܕP.7/_8 &`.o9&/;+Weo+wc̜ Fl'KnKN7Wt_o/KE+]7Mh}z[=ρ~QtNEǨ5e/459\Lgk'G61<Ͽ|љ~ոR$&7jN7}y/"[@_<ߘNEgXDi;KEp"F/tx}{Y}>Iy {^θ/&,܌W؍3;ߕvϮ<q_.f}̯<qzÚ/h}w]//%kbxM1}w,,-kF~׵؉}3Ԟ]pi-]1[]_~C`}7j@n]X~E_j}&7;ޣop(EޛY _6Wa~؃#.tdm~RwO9,؅Å+|[}ON6[[/痝'ݭ^Jw}z'Xߝ^;gy9Eb}7P){%&(_>'f~ϲ(_n饄g}wP?otһ>ӶM<ꗜp+'-'yG)aq"[%],:zU@t%}sdV.mIDn[ua1ܟE(H8Ii{*ɔ[K[F^].HA`qNvw}A"(Z'$#Zf#Ÿ2{_Q go7oyoK(B [ w"ڵ ^Brk {/dם[=+j\%p}~Y?gg<@sʩ_zC?XGhGCg'^32OYovKO~,b L{oYwS_ @!}VޣoӢ3kZJg ~K(_|w_yߥBa/x_Q"X_QRmK|||" x;8^bQ"l;tIsއ?"ad߶#-gAI yЉ8~\?9T6~@dd"[ [nv-vWV qEΆJD1CyD1a o0b/& @)A --TLh7_} >J?˧Q*{t1`;UJ="F+GW0W9c!@/]_am̯ I"+x^ms>zuJyW+g*rbNLUe{ #|ztBN l=N(e{}sdꁧz@uT64rhw:k.xA.\VuS] dzi3w|!ӵWpv=w>Al r3?,11we Gï~șlڳߒx&Tsc?'Jl-N+%*0֧߳(⇑ɦи53%@HeOu_e/4 bGG`l, }4]e#pw?_@|? =[Y`~-Jػq_m~s!-=~_W`~Yj*R&n/3zf0;otIcoKb1IU( 3!Þmk9.@g%a~sp\Aoao ki.@3Lˌܫ7 ELrM=ܱv=̏3]:5~³X7B v`ǁ‹?րd\=GF}xYLHeZ]WfnN}>Uh-@|*td*3'VlCe*ޜE7}kN'0*tTGCo>l%sh;џa,;8#k@ @y^;O,ݰwФ |_掇{jFx'.g\ 7,}6+pgv[6gw՟¹:mF>#HTel; Vv|ɧv{ʎ1A ƀf Q.W۸O0\nģgk_^ \B =K{DNĥP @(P @(P @(wPt;h6 QU!UGwPޡۆw'cD߼nCQI-l|e8iSP+*z,8bxy]Nߝ׫7Zϫ@{}%VNFnu t2w]%%V2ўevwoy2qqHۀ54{m+̓5SKwB^\1GX;Bq `[#>b_ :q/9~p?#N@?6W$e}|0 r3+. υ?I{!!Q)*> VF?쇘p ה1LB( 7%?ыSAbzf_+1ᘡ)6`@gF` V]AnJ~>9~}'RəpZς%}kjFĵ.­K)PW vvlaQw+̯lS Qy|K_mNNN:vLIe~w 髙_Ƅ()yJNsdM.:A;dc~4z1= MFɦ)ɤDU9^OTA dpbk~AσawQ: ZtLFE&.eku>_KD>;z%! ɖE;ګ G{q7 1^w(A~*Zem_H ~Yoj[q8js.trO=7l[MMSnX٥Vt^LfӌcX ÆHKH]_ ]g&VֆaĻG.ϽD)[R~/|46xWMd[٫9J1x%%4Z}Ug}qwO'Fq>-b©7,1k'!373 7DlIឍ«#1?݁^x^S]o9 $(z!=̙_NXYk7*Ƃ׎EWL1Dw0l10+ϫ}"e&9k'#Rެ2ok7&^|/W̥^A<==oS *. 7=غgpA(»WS pߪDDAųm<^|G^3 )" W;pk-_՚ZJ~n+[ v;.+V^[J)qB_ ?Hy^U#nT_ .%|ژq5fkrXּ^tY'iӿe ~.s הּ2<Ͷ Fh!(؇ nqTҵ}-UhLE(Fݗ$ V1Eسo->JΞɊ #~O<5 CLp|Μ9d緵vd VQme]`WdIv'Y9~b /)3e+&$pM].#Uqp#r?-pm@U 7SNnQg?3| R=ы_}2cE'MEAnh[5AJ㜉߷ .L@JwXr+X$1_Zh/h [M\Nx髾\jyII'XZ2?!n#:><1D RSKc!7{cJ\E#/VRW\}8OK)eOH#䏺9}+DJIq>Ic>}??J9Ox~U$~ EOe53g_b%{6l^0=ICOïB>'qN$7t;)]a5*ӗ'#&8 Tҗ\b"Án_^̜# 7[ڝ_*xy|˶^Y3S :b82}ۉbI OƗ5;kel@n_Foervw;ެpB+ ߸,jÛB(?Kf`LgzuÇU - h_業,a[N: }CևaVu:R0 +ÑG 0ؒ߬q ArE!wCNdxICNAQE9>Dw^ >|{8YtyC$ΉAW9X`<JR-S9H/rDp3~[axOɏ,ge~Tq Fi1^~7vUcgDpc,?I(Sr UK\A q @2#ݡI$j%zl`Oqq N󵝐;cJo>S0!?P;wB(YЍ?ʈUĘn!Y ]'w^2ANe'/1W@&}<HB.f~J|bK"GW#|A=Vi?MNM?'>%ae۵WpwAUڶŏۀ+?wcuo䫥'Ή* ZG/.ț367?|݇Kp{=~@@oL0ݽ%gqѓ݊A)x-[z pOȽ=N WoݨFnϸ9)Xuxg@ oQ⥬]B ?; ԲFyM$VVz˼z:JbOg^ 7huHc_Z.ˇ㙟FO÷ e7a/]加wY?IO@~bnm {' '3)fɕ;!^o%9~MEX[cr%{}c.EՉ e-oNGJl @drf!}cViG_Ps^gy~{"܆-} Qg#z˙ꢦ6 (܂4:Z`.YY0M!&8(w3ȟ'0W/jсa[8j;> LZ_fT!|l`{+r{;>96`h8+w"[7NwΤ_ 0q+c u{̦-sP8~/ְQޚYF*~H4HI F+_l iJǿ^)i:6[ok1w.}B Z)8<^ixu7 r?aI aW c+t&8PTr'O|uZXvpe{Eu)bz,};1Kd~4}9R .~gp8ǾU9ot%xlL倊D϶_LjDQo%Rx9J&HyP3%)gmWLwS:m/<ȼ_)ov|[fs06P8h⒅;3.Q+a{%7_64/>+pKS ^`U)ﰽw~FKn;=-f  +.]f2%oWjr9@js}S:!qM\N.gW~ =)KR/2T&L/}/_ήGXHFzvp^>G5v[W xk $p%}Ew~2Ci_Zûb"A {>{qcx `z+Ϭl}% dOUp |',-m5~L>{趈>Ð%'^_<% eoio~7ɏ,c#zcغrb"\=|=lYrEs@;.2Rҽt.|IDs?}3"qnͿdb")rK3>?S*Fm<.%DӒhܯ4۴?[`Saϕ:'DLq8ߥ'[5u v?pp=}r9v.Fu>F ?qA/x9xؒpN =:~X.BwBHLm\chy]ag wGq쫚>_۟^R㻳끀6{od֒ڟjwwv.Wط"\odPc `8LV}7g~KٻX?_R-qn}ix3`唯oTm^uժ[w[(Opw;dhGY@u|Oe @iJLv0Lf~ "Eb @5*pQ'oU1¡~/E/$`C ^ tm9fpf6F@y=e}_)w<Q- X4~0s kTs8~_H^ ̛`L١nE8Nؗwvr:-cvZx Ʃae5Yaxo}mVXB%v6@a+`@o{mU{2|:  8Zf@sSڀSj\N_ml/q8_ K9BAay٢ j4-P6GivƟO!/<>mmgC-h6.Z2vuƟ >>"t0k[?HϏ @"f֞ WO4kJh}}N'erVga(H"A (nb!C ?9^L}+;,f1P" 7 įO'>pqOJQp@ .iٟ81=f?`"p+uCjh_eꤗp#ȅiLH(UjkZdB <\7{5}K 7%EZmgB[:J.H3e?˶}KۙL_]BT^ UǬ<@aR`frpKYG->1} An `5z+H,^2m` <6I-ٟįG}>,Z_G7BKgh/eoȟ7̆qJ%ca 4GV>čZrY+o:' `.>"*z/ [{ϕ֟|&GUTw{c.2j#0@,}؋# D < @u٧QMOv{|?nT }eMO>K\dCpM}obqc2G)*ξo4cV79;mRlz㷆zREcցJu L+N)@ [a 8.o& #[|tH-rɿ4SƏA ƅ!0?.2Dn]Yokfү9cp@SϛܬЊ/H+lϿ}J6+/gw)4d37+EG+I`_}ZG_?~.yvB_$̲KMAj cﲃFR9 b@Qiu9vbڜY>orE' \`gW@p]oI78oȂ# 襷@b컀" ӯhe v>XCV/g4l/%DAVKMWYm,nKʪnl&VUU8 &p/smn 5G0PYGa 70z+Ə`0~O{e5&Y|*L-?V 㷘 `ğ_V(pcg7 ?}b[tS~V(44P'l@E GAJ `H|cO'-*?6h v Y} c!+J-W_I*~ d +L^-g/8hnO9Eo`Jܓ?aAXP}N'~ uPX  @_/G8 3XP @)Gω${ ,g_9uy ʂ2n^" %:HnJ_~m b.n O0Rc$%TJ ǝA. I @#ď{n>LLGFx8fO: bAVFh;k6jЬ=do Vz!~;Vr~Afn`-[(k5da}!pduxYE|lw P"J{dTjfA {PmSxD: ƇPqqY͹ğv? gb3,E Nէ wm4z6+!27p~ 44`\q,M8S`mf&sUΖ\+Tt0wHƵ[{&1Bג4X:1bQ AXVFLqbի+<d &8\ OZ7@% R0| UM0R^w!`,c~o` r: %̃ҀR 3Ǽ[Dt0s_Ap*/lMCn3}J"s"q8Rc5WvCD[%|yUF\.1p A_>Xb" &8\|D#+@Lq~= b G,&Wpz AXLׯ13 &8_b"g+@Lq8b19\D׃ Vpbr~ ׯA1p A_>Xb" &8\|D#+@Lq~= b G,&Wpz 1n +C Fbݍ\, { i,?%Ώ Η`n\_+1[~9U|kO:śSLŚv8s2>ψ1_)a‡:t4zPlc)Bbl*`kPNȉ@4ߣ軏S+;r7(޹{oϜsچ獼?;7!xgp37J(k4 \FӺ#<81s1a!+m)#n| n=sS-i@A9.c| + + + + + + h=jIZ*j=i9ؓ`t7ϻ`֊һtf טJEf3rRsh-%ہ߭ Ћ1K7`Bѳ㛩J}A'wMVx|u+ +\p^A^IENDB`n " YCO[+PNG  IHDR,sRGBPLTE@ @@```@0``@@@@`````@```` ``` @@ @` ```@ ```@@@``` @ @``@@`pA! pHYs+IDATx^흍E_y' ([~Lݧ` =~ET P*@T P*@T P*@T P*@  .Oe5i:KM:RZW}-2ȝOtșz9`)@-[ [Ѭ-a d 'd2V;ʹNEe ƌ]`:\ @bs$r E?Q;t[B#%6_a9'}]-.4Ec3a.^ႥE_ƾ`$ W&/Wb9g/+HnWnM]Ũ@$T1S*@T P*@T P*@T`\׎K=^3nkxf1N%~~,Η<&^-vCftrX ^]Ui6պk&>f~84rwDft҄Frx70z5NM ̭Ut;4gDq|+Jߚ+SiwC^X K%L~4{.];D;£@ `ds.5a:" !aydrzeƠT_g?Of䋾nȤ&A'i+8$ݍ9fC LPC5fgDݍ9f^=;4|ըFXٻO̭`@LFslmlOa?WEpHkp4;lR0/;򶚜=4rKs<9Up#Xyas6x-,|T~:WP/v xW0`wj7PI1d N~ ]In'x_쟫Gmpao+]F:o7?MbC㏇^*W;vW/7U B+ibb -vpsP<3 ±l}Ό|0JWa Ėn\&lEHILu}SZa.@S uL#3^RNͬH`"  }ޘuf-R׵ZvGJ0 lעG10m/mC'~p:({&;\ֽ'j!8'!cF_!/#\a\l@`(\@j4'e`wQɕR`"+o6 nE80`wSC fFzBY_! L ZKw)ἫZZ0`wDLB+AF`V%Dw;U7{E_DzpV]q#[!½civW4 3;|wx  Wٮk0s/ٞ;*{<;ĭzW`t}g_,Ҫs+H;dNT 6*GRg>"|6I[hHd >*;mu31 I`wӑTahg kc2Y0 ~x%瀓T  `t;SstcvW539`Sp L].,&xu/rDueZ>P9`Roq0`w 0^_syCGGF?kVj Uv'jR @$|_D0 ?`-$h܂W`w\`*|x/)xx:ME31:qp L3)>2TQLEC47TI> d?.BJڵ/!!<4Y}Sl42˕c?`@iy#c% jH&"dHj!r"AMLV31gj@V/Sp Nc  h&-?8]4`~h?.B;_.B w/#`o=io>6 WcQF/SpG =ij)ɰRG{A;[vRq鄣f~-qozc n]?NJoZp%P.BP!‚|GvůUbMw_')~XBy.BɺnK]kΞ5y-qr~憥e ?NN*:#0Z7C Rl[-}G5$JbyRv~ jm어tp KLǮYp n(202h`ᏫA?@<}~7R!sKǀ=>v=`c_F>??nDwSz|e/Kl/7s%>%}}<@Z @NL `":J#rU؂Sp!SL81rM Lc%v?,Lb>452UqSpSg\ ~|h6vc -c qWOTԚnE?I >~"r/]eTHA3CE?at'm #Li$WՏ&gI,LnCZ$)xs=lj d&Sgk+J/^53_Q 6O#GEs?I &:dj|l6  ү(/@)`wq쵎Ÿ$&zNɟ $iAt臨ӯ(]VQ?dZ:g`ոQH6Xdj`6䕐 f{{+Z\ X0IoV =ࣞSl ^F+㣙>dLN 1Q0gQ;I#'O|`y.!6h{.L]O$P-g 'V@K `׈W TtXeG`D9?E%Jc/@xP-[f~#4z3zD4LW؀o, O)@J&e)I?H|iUb9\VEq;;yޱ{c= 'BmG0'oc;+PvX:dYwҊz#QaY ^MjMBUT:K!/c@{7k'&jdZ"%񗵓R52gX1^\z D_l]$wZeԜje|nwy}ވpm}JE[#c%dVv/7Y"s޼?ugu@6Jvڸ&N[6{"eD݉$xLjtv'+_`"*h1v'Aאv'AђDL0`w%Jh2) &H cW#2-~KEvWS{bD+L]J0ֈ&F2 Uʁ L]&~+D3EDժRZT1o&ZLL].%~ :{,ßTG ?NWV`"i#(+LSurr ev3L4!/; `SQL؝DJȟ`"t4J%-;-0) &NM"',;=~5evVß`"T?]QDjG5v,ßW(_\"cpHI 5b*Ub&D-_NDUIr(>jiyC O9?F;Z\|Sn"hmpx{SDW!!} <{Q4~ķ$W""D%G.0~{5t6T4z]` }(i~LJ+%"||~7JŴI;a瞛q5m)}3{?ޖy0{?x-14 Ce(Nް% +"6e B19_rDa J*7UV]L], 5UvW. W=*&XbvW*+U=2y~RvW$_\J`"JD"%jق+JL؝X*?Tʆ`"b?Rv`"dr1tz L؝H2?L/F$*f&./o^W-DecJx/uD/`"nc{.0`w 0I؀vw!ӯ  dND%5 240V`"2bzvwVOJLIDJLA_10C0`wNF~ bG`"69y` *P@v?NKـ؃)Ahp&G婻܁"`"~&?|5;_sA`"L<#Z&_ iį#g_bI*36$ޟOֳ7 \ tM>O~I#vOv xN 9n"}e߻DkIنgላmMfОg*[Յt+!?u~^%~oWW4cٿ%/"׿?-*R2s@I^Ӭ5AoeOΟε-nї,f w(?-`~ @&suBQ>'G!R2 Ԭ z6/逪ҰC/b `_zDշf`s >–u<ӝp-zz) 6KRΪ bf&s@Il>VkQ d1篈} ™XșEOi`p: Pv7AO]"_Iqe"ruݍ*ymLʓM܀tUu7K`o>ў7nJ)-!WIrgŷ|9- ROp2zZl^ƽ3z { h\ W=COinm,B {|\ z^o͡UW_^j=; m/ܰ'^ᡨj~/~A\Ns{)r"_B>Ѿ1|k6Y`)z2^~[t珚kZ_r=ʢDes[4}2~L8soN^[̠lO8B͕{:9o'3f|y+{&hkNλS).o(˭HL?7黽QqkFR->m(K`hu^Fn|g;Yssw? WyX5{ɻǍ =نπ8)Ϲk@wW9ђoŸD3oO*6XvlNm1wq^A(7؀xf/a/q!qtITC?:vf}۳g~PR;)5l@|8^`un̞o߉^'y̶L_ Q'eE>syh/}&q#Klˇ7!.I3nFoBksAtl^^U/< 0 y_Dh3 {[ܵv|5u(h5:Kv/j5q(<),S#0XV']bvQ03{Y6ų[yYޭsS{8*/Z.IG9iCޚw[yOx4>,܌-ml9܅tŪTzhmմgopeM狕^PA*X\5Oz^ ݝC^ٍfMWv^Y5Giߪ\W0˗|QP"+WI`E ,B(TĢTFX){XT P*@T P~P\tZtj3u45H]v5,:Y\ YwV{]5rA* zڮF%얊ΗVt URͯB/\6,$衙FrlBh4K=wn3&QKmmi`ӏFEhW:*MsV+SSJ{v7Q,ui#4T P*@T P*@T P*@M ؏ܹ$m;m ΂;j<[3ѩYhʹct8To?@A[BHCDFGHK O V [\]  ^_23[Q`a(b:cGdCe-fHg hij k<r$B]"I<9k_i$2$=%eópkiH|i2$+GTɧ6X||b$?c|>:b) $$2$TPǐ;J+it#b$ !75Te(j$b$T m]v;",$b$ YCO[+" 0AA |ff33@3@ g4BdBd@:A 0~^ppp@ <4BdBdl$ 0 B@ ʚ;d8ʚ;<4ddddlT# 0X9___PPT10 pp6___PPT9/ 0{A0f&@)? %#Transactional Locking NNir Shavit Tel Aviv University (Joint work with Dave Dice and Ori Shalev) BOP B`6  kJConcurrent Programming ((lK A FIFO QueuemLA Concurrent FIFO QueuenMFine Grain LocksoNLock-Free (JSR-166) hI$Transactional Memory [HerlihyMoss93]%($  pOTransactional Memory(qP$Transactional Memory [Herlihy-Moss]%%(rQTM: How Does It Work 0sRHardware TM [Herlihy-Moss] tSSoftware Transactional Memory Implement transactions in Software All the flexibility of hardware& today Ability to extend hardware when it is available (Hybrid TM) But there are problems: Performance Interaction with memory system Safety/Containment2Z>Z> 1(The Brief History of STM  .%As Good As Fine Grained02)Premise of Lock-based STMs dPerformance: ballpark fine grained Memory Lifecycle: work with GC or any malloc/free HardwareSoftware: support voluptuous transactions Safety: need to work on coherent state  "  ! #!8JK 3*Transactional Locking Locking STM Design Choices  8,"Encounter Order Locking (Undo Log)##("  9- Commit Time Locking (Write Buff)!!(   ;.Why COM and not ENC?  </COM vs. ENC High Load =0COM vs. ENC Low Load @1COM: Works with Malloc/Free&  A2ENC: Fails with Malloc/Free&  C3Problem: Application Safety  D4>Solution: TL2 s  Version Clock  Have one shared global version clock Incremented by (small subset of) writing transactions Read by all transactions Used to validate that state worked on is always consistent :xE5"Version Clock: Read-Only COM Trans##("  F6 Version Clock: Writing COM Trans   G7Version Clock Implementation @On sys-on-chip like Sun T2000"! Niagara: almost no contention, just CAS and be happy On others: add TID to VClock, if VClock has changed since last write can use new value +TID. Reduces contention by a factor of N. Future: Coherent Hardware VClock that guarantees unique tick per access. R!'- yC>jv*H8Performance Benchmarks \Mechanically Transformed Sequential Red-Black Tree using TL2 Compare to STMs and hand-crafted fine-grained Red-Black implementation On a 16 way Sun Fire"! running Solaris"! 10IbK9 Uncontended Large Red-Black Tree!!(  T@Uncontended Small RB-Tree  \CContended Small RB-Tree cGSpeedup: Normalized Throughput( M:Overhead Overhead Overhead0  STM scalability is as good if not better than hand-crafted, but overheads are much higher Overhead is the dominant performance factor  bodes well for HTM Read set and validation cost (not locking cost) dominates performance Q>b On Sun T2000"! (Niagara): maybe a long way to go& 22(1 vT Conclusions  COM time locking, implemented efficiently, has clear advantages over ENC order locking: No meltdown under contention Seamless operation with malloc/free VCounter can guarantee safety so we don t need to embed repeated validation in user code YA%5BA5,SO; What Next?  Cut TL read-set and validation overhead, maybe with hardware support? Global clock can help simplify validation of other algs (checkpointing, debugging& ) Verification of interaction between runtime and TM.,y BeH Thank You   //>?dgu6  ` ̙33` ` ff3333f` 333MMM` f` f` 3>?" dd@,|?" dd@   " @ ` n?" dd@   @@``PR    @ ` ` p>> h` (    6B P  T Click to edit Master title style! !  0E   RClick to edit Master text styles Second level Third level Fourth level Fifth level!     S  0dK ``  :   0O `   Z*4  0T ` ` H@___PPT9"@ l*$" H  0޽h ? ̙33 $Blank Presentation 0 xpp(    0ԁv     v `*  :  04v Q ` vH@___PPT9"@ r*$b    d  c $ ?  v  0 v  0 v RClick to edit Master text styles Second level Third level Fourth level Fifth level!     S  6v _   v `*  >  6v _Q` vH@___PPT9"@ p*""    H  0޽h ? 3380___PPT10.$X`  @\0(  \x \ c $dOv< v x \ c $>vG(  v H \ 0޽h ? 33___PPT10i.Hp=+D=' = @B +g  ffef(  ?dF    `  f  61?R `8f2  61?  f2  61?q  f2  61? x f2  61?67 x fB  61?  fB  B 61?T  fB   61?6 e> f2   61?  f2   61?Y # l   <1?  l  <1?s  T GM #    c BHC2DEF1?1GF @GM  c BCLDEF1?K! @\_W:N gzsi  gzsi  c B CDEF1? 6 @gzsi  c BOCDEF1?NN @ CZV  c BCDEF1? @ncI  c BC8DEF1? )7 @?7 N     N       c BC$DEF1?#! @ D  c BC$DEF1?#! @Lp  c BC&DEF1?%# @v  c BC%DEF1?$" @  c BC&DEF1?%# @N       c BC$DEF1?#! @ D   c BC$DEF1?#! @Lp ! c BC&DEF1?%# @v " c BC%DEF1?$" @ # c BC&DEF1?%# @T M] $#  :N M] % M] & c BiC2DEF1? g(h1T @M] ' c BC9DEF__1? 8, @\r]2N ^0r ( ^0rf2 ) 61?h rf2 * 61?)^0h2N e_Gq + e_Gqf2 , 61?e_mif2 - 61?AhGqT 5,  .#  / c ZBC~DEF1?99o\O@1" &x9pNkad|_ZTNI5FG=f1# (9GUdr x|}!}%{)w0d5S:BA)Qkmst@5, &N _ 0 _`2 1 01?c`2 2 01?_x 3 s HBCDEF1?66<h@|JXqh{zvrniecQJWVSMFB<97+j#Y-K1D,&  &,39 <mp@qx ,T ]Lme 4# }`2 5 01?^Mme`2 6 01?]LlcT  =^  7#  8 c BHC2DEF1?G317FG @ =^ o 9 c BCLDEF1?K! @N OI :N 2 j> Y : 2 j> Y ; c B CDEF1?  6  @2 j> Y < c BOCDEF1?NNN @K 3 F = c BCDEF1? @B y7 9 > c BC8DEF1? )7 @f " ' N    ?   N    @    A c BC$DEF1?#! @  4 B c BC$DEF1?#! @ < ` C c BC&DEF1?%# @ f  D c BC%DEF1?$" @   E c BC&DEF1?%# @  N    F    G c BC$DEF1?#! @  4 H c BC$DEF1?#! @ < ` I c BC&DEF1?%# @ f  J c BC%DEF1?$" @   K c BC&DEF1?%# @  T H =  L# :N H =  M H =  N c BiC2DEF1?h (1h @H = o O c BC9DEF__1? 8, @H bI 2N t N b P t N bf2 Q 61? X bf2 R 61?t N{ X2N ] O? a S ] O? af2 T 61?7 O? Yf2 U 61?] Xc aT Y `  V#  W c ZBC~DEF1?99o\O@1 " *5@LYf&s9|Na|5Gf(9GUdrx|}}{wdSB)fm= st@Y ` &N r >  X r > `2 Y 01?s B `2 Z 01?r > x [ s HBCDEF1?66R00r ,AU aeZC,)]0f!Q"l%z(+/~2q4^AvGz=Z=n@~DKNRTuVZ_if^[}{iYE5}$ytoic_YUR0mp@#G ,T 7 ,? M \# ncs}`2 ] 01?7 -> M`2 ^ 01?8 ,? J,T u  _#  t\ N Gu  ` Gu  a c BHC2DEF1?1GF @Gu  b c BCLDEF1?K! @\ W :N gs  c gs  d c B CDEF1? 6 @gs  e c BOCDEF1?NN @ k Z~  f c BCDEF1? @n cq  g c BC8DEF1? )7 @' ?_  N H   h H  N H   i H   j c BC$DEF1?#! @H l  k c BC$DEF1?#! @t   l c BC&DEF1?%# @   m c BC%DEF1?$" @   n c BC&DEF1?%# @  N H   o H   p c BC$DEF1?#! @H l  q c BC$DEF1?#! @t   r c BC&DEF1?%# @   s c BC%DEF1?$" @   t c BC&DEF1?%# @   N u]  u u] :N u]  v u]  w c BiC2DEF1? g(h1T @u]  x c BC9DEF__1? 8, @\ ] 2N 0 y 0f2 z 61? f2 { 61?)02N e G  | e G f2 } 61?e m f2 ~ 61?A G N D L   D L   c ZBCDEF1?99p]P@1~#uk ^N=-&:Ob~9Kqj\A, /@N]lz#/=EL~ZlcZlIz0r2j{st@D L &N w '   w ' `2  01?{ % `2  01?w ' r  c BBCDEF1?66,\/5J$l .5%&)-048:I#PEEHMTW\ _aHkvosMj9fqaR@1!|vojd_,\mp@#  &N       `2  01?  `2  01?  f2  61? ` f2  61?I    Z5xaxa1?e 6  :objectZfB  61?*  fB B 61?:# } fB  61? MP   Z9xaxa1?   :objectZ  Z<xaxa1? E Shared MemoryZ  B@ P   H  0A,   How do we make the programmer s life simple without slowing computation down to a halt?!ZZH  0޽h ? ̙33y___PPT10Y+D=' = @B +_  ~''(  x  c $KP   F Pp    J   0Np : `B  0D    s *>P ;b dB  <Do 0 F Pp   # J    0(Vp : `B   0D     s *YP ;c F Pp    6J    0X^p : `B  0D    s *aP ;d XB  0D =   6fm 6Tail*F   `   ^fB B 6DjJ  ` fB  6DjJ  ` R  s *cs  6jm$  6HeadR  s *gw  S BCDEFoH-Z6@  S"   F Pp   7J   0pp : `B  0D    s *sP ;a   S BNCDEFoN|&7@  S" u XB  0Do * XB  0D s ;    S BCDEFoZ-0@  S"   ! S BnCDEFonJ5'jj\V@  S"  *F   `  " fB #B 6DjJ  ` fB $ 6DjJ  ` dB % <Do &  & <ly s  V Enqueue(d)   ' <}    tDequeue() => a0 H  0޽h ? ̙33y___PPT10Y+D=' = @B +;  77 996(  x  c $p   F l p)   }:2N 3 'Q   Ml &Z f2  61?3 'Q f2  61?o . Z  s * p) f2  68c?@  l   <G8c?c     s *ĊC"? @synchronized{}   <p  W Object lock   <F J2    2J  T Pp  # W V & X   0p < `B  0D    s *P =b lB  <Do / T Pp # & V X   0,p < `B  0D    s *P =c T Pp # V X   0\p < `B  0D    s *P =d `B  0Dw O   62  6Tail8T   `  #  _} fB B 6DjJ  ` fB  6DjJ  `   66  >    64g2  6HeadZ ! s *6   " c BCDEFoH-Z6@  S" A  u T Np ## T X  $ 0xp < `B % 0D   & s *N =a  ' c BNCDEFoN|&7@  S"  v `B ( 0Do ` `B ) 0D v N  * c BCDEFoZ-0@  S" qu  + c BnCDEFonJ5'jj\V@  S" } Rv 8T   `  ,# 5 & fB -B 6DjJ  ` fB . 6DjJ  ` lB / <Do}    0 <J  P: Dequeue() => aH  1 <(?   u Q: Enqueue(d)*  Jz p   2 ,$D 0 3  BCDEFf[8c?gguuuqiaYzRmJeF]>Y:Q6H/D'<#40(   sk#c'Z'R+J+B/9/13)3!6:>>BBBB!B)B1B9FBJJNRRZVcYkase{mquy|(08@HQYairz|yuu@"`p  4 c BC$DEFP8c?gg#$ ,4<DHPTX`hltx|~xs|m|ex\tWtNpIlCh>h8d2d-`'`"\\XT PPLL LLLL"L'H-D2@8<>8C4I,N(T Z_ejp v{   @k  5  BC9DEFf8c?gg^8^2^,b&lu {vlc]TNHB<60*d dz $*06<BH~NuTpZg`bf^lYrUxP~LGGCCCCCCCCCCCGGGGGGLLPPPPU Y&^,^2@"`2 k 6 c BC#DEFP8c?gg"%/ 9DNY^hns}}xrmd\VNIC=82-}'}!xxsn hhcc cccc!c'^-Y2T8N=ICDI9N4T*Y%_djpu {  @  7  BCdDEF8c?ggc\UODuAl:c0Y)U"KFB8/*!  {q!j!`&Y*R/K/D4=47808)="=BFKKPPPPP"P)P0U7Y=^DcKgRlYu`zfmt{ &,3:AHOU\@"`~a(  8  BpCDEF8c?ggzrk`"\(U.I4B8;>7A0D(J$PSY] `cffillooliifcc``]zYsYhV`SYPQPJMCM;J4J,G%GDA>>;;;;;%;,;48;4C1J.Q+Y(`"hov~  !(07> F M U \ ckrz@"`6; L 9  BCDEF̙8c?.. ww"o,k0b:b?ZDQNIN@W<W3W+\"ffk ktt tyy"y+~3~<~D~M~Uy^o^kfakWoNsDs:s0s'sw| ?b]`@"` 3 H  0޽h ? ̙335-___PPT10 +)BD' = @B D' = @BA?%,( < +O%,( < +D' =%(D' =%(D3' =4@BB BB%(D' =1:Bvisible*o3>+B#style.visibility<*2%(D' =-o6Bdissolve*<3<*2+*U  QTIT0FFS(  x  c $   F l p)   pS % 2N 3 'Q   Ml &Z f2  61?3 'Q f2  61?o . Z  s * p) f2  68c?@  l   <G8c?c     s *C"?Z < L Pp  #   I    0p < `B   0D    s *P =b dB  <Do  L Pp #  ~    0lp < `B  0D    s *P =c L Pp #     0 p < `B  0D    s *pP =d XB  0D    6xhvO 6Tail  6Hh}:O 6Head  c BCDEFoH-Z6@  S"  L Np #     08p < `B  0D    s *@N =a    c BNCDEFoN|&7@  S"  XB ! 0Do &  XB " 0D  0L   `  ## S  fB $B 6DjJ  ` fB % 6DjJ  ` dB & <Do9 9  ' < N m "  P: Dequeue() => aH  ( <LL .  u Q: Enqueue(d)*  F p   ) S  *  BCDEFf[8c?gguuuqiaYzRmJeF]>Y:Q6H/D'<#40(   sk#c'Z'R+J+B/9/13)3!6:>>BBBB!B)B1B9FBJJNRRZVcYkase{mquy|(08@HQYairz|yuu@"`p  + c BC$DEFP8c?gg#$ ,4<DHPTX`hltx|~xs|m|ex\tWtNpIlCh>h8d2d-`'`"\\XT PPLL LLLL"L'H-D2@8<>8C4I,N(T Z_ejp v{   @k  ,  BC9DEFf8c?gg^8^2^,b&lu {vlc]TNHB<60*d dz $*06<BH~NuTpZg`bf^lYrUxP~LGGCCCCCCCCCCCGGGGGGLLPPPPU Y&^,^2@"`2 k - c BC#DEFP8c?gg"%/ 9DNY^hns}}xrmd\VNIC=82-}'}!xxsn hhcc cccc!c'^-Y2T8N=ICDI9N4T*Y%_djpu {  @  .  BCdDEF8c?ggc\UODuAl:c0Y)U"KFB8/*!  {q!j!`&Y*R/K/D4=47808)="=BFKKPPPPP"P)P0U7Y=^DcKgRlYu`zfmt{ &,3:AHOU\@"`~a(  /  BpCDEF8c?ggzrk`"\(U.I4B8;>7A0D(J$PSY] `cffillooliifcc``]zYsYhV`SYPQPJMCM;J4J,G%GDA>>;;;;;%;,;48;4C1J.Q+Y(`"hov~  !(07> F M U \ ckrz@"`6; L 0  BCDEF̙8c?.. ww"o,k0b:b?ZDQNIN@W<W3W+\"ffk ktt tyy"y+~3~<~D~M~Uy^o^kfakWoNsDs:s0s'sw| ?b]`@"` 3 F l p)  1 % 2N 3 'Q  2 Ml &Z f2 3 61?3 'Q f2 4 61?o . Z 5 s * p) f2 6 68c?@  l 7 <G8c?c  F p   8  9  BCDEFf[8c?gguuuqiaYzRmJeF]>Y:Q6H/D'<#40(   sk#c'Z'R+J+B/9/13)3!6:>>BBBB!B)B1B9FBJJNRRZVcYkase{mquy|(08@HQYairz|yuu@"`p  : c BC$DEFP8c?gg#$ ,4<DHPTX`hltx|~xs|m|ex\tWtNpIlCh>h8d2d-`'`"\\XT PPLL LLLL"L'H-D2@8<>8C4I,N(T Z_ejp v{   @k  ;  BC9DEFf8c?gg^8^2^,b&lu {vlc]TNHB<60*d dz $*06<BH~NuTpZg`bf^lYrUxP~LGGCCCCCCCCCCCGGGGGGLLPPPPU Y&^,^2@"`2 k < c BC#DEFP8c?gg"%/ 9DNY^hns}}xrmd\VNIC=82-}'}!xxsn hhcc cccc!c'^-Y2T8N=ICDI9N4T*Y%_djpu {  @  =  BCdDEF8c?ggc\UODuAl:c0Y)U"KFB8/*!  {q!j!`&Y*R/K/D4=47808)="=BFKKPPPPP"P)P0U7Y=^DcKgRlYu`zfmt{ &,3:AHOU\@"`~a(  >  BpCDEF8c?ggzrk`"\(U.I4B8;>7A0D(J$PSY] `cffillooliifcc``]zYsYhV`SYPQPJMCM;J4J,G%GDA>>;;;;;%;,;48;4C1J.Q+Y(`"hov~  !(07> F M U \ ckrz@"`6; L ?  BCDEF̙8c?.. ww"o,k0b:b?ZDQNIN@W<W3W+\"ffk ktt tyy"y+~3~<~D~M~Uy^o^kfakWoNsDs:s0s'sw| ?b]`@"` 3  @ <d %Better Performance, More Complex Code:&% 0L   `  A# % , fB BB 6DjJ  ` fB C 6DjJ  `  D c BCDEFoZ-0@  S" w  E c BnCDEFonJ5'jj\V@  S" R < F <<% z nVerification nightmare: worry about deadlock, livelock& 88&. H  0޽h ? ̙33y___PPT10Y+D=' = @B +|k  jj@BB3j(  x  c $vY  v R  s *HpS %   s *0vC"?Z < L Pp #   I   0(vp < `B  0D    s * vP =b dB   <Do  L Pp  #  ~     0(p < `B   0D     s *dvP =c L Pp #     0Tvp < `B  0D    s *,vP =d XB  0D    6vp 6Tail  6vw4 6Head  c BCDEFoH-Z6@  S"  L Np #     0lvp < `B  0D    s *,vN =a   c BNCDEFoN|&7@  S"  XB  0Do &  XB  0D  0L   `  # S  fB B 6DjJ  ` fB  6DjJ  ` dB   <Do9 9  ! <\vN m "  P: Dequeue() => aH  " <vL .  u Q: Enqueue(d)*  F p   #  C $  BCDEFf[8c?gguuuqiaYzRmJeF]>Y:Q6H/D'<#40(   sk#c'Z'R+J+B/9/13)3!6:>>BBBB!B)B1B9FBJJNRRZVcYkase{mquy|(08@HQYairz|yuu@"`p  % c BC$DEFP8c?gg#$ ,4<DHPTX`hltx|~xs|m|ex\tWtNpIlCh>h8d2d-`'`"\\XT PPLL LLLL"L'H-D2@8<>8C4I,N(T Z_ejp v{   @k  &  BC9DEFf8c?gg^8^2^,b&lu {vlc]TNHB<60*d dz $*06<BH~NuTpZg`bf^lYrUxP~LGGCCCCCCCCCCCGGGGGGLLPPPPU Y&^,^2@"`2 k ' c BC#DEFP8c?gg"%/ 9DNY^hns}}xrmd\VNIC=82-}'}!xxsn hhcc cccc!c'^-Y2T8N=ICDI9N4T*Y%_djpu {  @  (  BCdDEF8c?ggc\UODuAl:c0Y)U"KFB8/*!  {q!j!`&Y*R/K/D4=47808)="=BFKKPPPPP"P)P0U7Y=^DcKgRlYu`zfmt{ &,3:AHOU\@"`~a(  )  BpCDEF8c?ggzrk`"\(U.I4B8;>7A0D(J$PSY] `cffillooliifcc``]zYsYhV`SYPQPJMCM;J4J,G%GDA>>;;;;;%;,;48;4C1J.Q+Y(`"hov~  !(07> F M U \ ckrz@"`6; L *  BCDEF̙8c?.. ww"o,k0b:b?ZDQNIN@W<W3W+\"ffk ktt tyy"y+~3~<~D~M~Uy^o^kfakWoNsDs:s0s'sw| ?b]`@"` 3   + <2 /Even Better Performance, Even More Complex Code:0/ 0L   `  ,# % , fB -B 6DjJ  ` fB . 6DjJ  `  / c BCDEFoZ-0@  S" w  0 c BnCDEFonJ5'jj\V@  S" R Z 1 << xWorry about deadlock, livelock, subtle bugs, hard to modify& ,= & R 2 s *6F p   3  4  BCDEFf[8c?gguuuqiaYzRmJeF]>Y:Q6H/D'<#40(   sk#c'Z'R+J+B/9/13)3!6:>>BBBB!B)B1B9FBJJNRRZVcYkase{mquy|(08@HQYairz|yuu@"`p  5 c BC$DEFP8c?gg#$ ,4<DHPTX`hltx|~xs|m|ex\tWtNpIlCh>h8d2d-`'`"\\XT PPLL LLLL"L'H-D2@8<>8C4I,N(T Z_ejp v{   @k  6  BC9DEFf8c?gg^8^2^,b&lu {vlc]TNHB<60*d dz $*06<BH~NuTpZg`bf^lYrUxP~LGGCCCCCCCCCCCGGGGGGLLPPPPU Y&^,^2@"`2 k 7 c BC#DEFP8c?gg"%/ 9DNY^hns}}xrmd\VNIC=82-}'}!xxsn hhcc cccc!c'^-Y2T8N=ICDI9N4T*Y%_djpu {  @  8  BCdDEF8c?ggc\UODuAl:c0Y)U"KFB8/*!  {q!j!`&Y*R/K/D4=47808)="=BFKKPPPPP"P)P0U7Y=^DcKgRlYu`zfmt{ &,3:AHOU\@"`~a(  9  BpCDEF8c?ggzrk`"\(U.I4B8;>7A0D(J$PSY] `cffillooliifcc``]zYsYhV`SYPQPJMCM;J4J,G%GDA>>;;;;;%;,;48;4C1J.Q+Y(`"hov~  !(07> F M U \ ckrz@"`6; L :  BCDEF̙8c?.. ww"o,k0b:b?ZDQNIN@W<W3W+\"ffk ktt tyy"y+~3~<~D~M~Uy^o^kfakWoNsDs:s0s'sw| ?b]`@"` 3 F p   ; 6   <  BCDEFf[8c?gguuuqiaYzRmJeF]>Y:Q6H/D'<#40(   sk#c'Z'R+J+B/9/13)3!6:>>BBBB!B)B1B9FBJJNRRZVcYkase{mquy|(08@HQYairz|yuu@"`p  = c BC$DEFP8c?gg#$ ,4<DHPTX`hltx|~xs|m|ex\tWtNpIlCh>h8d2d-`'`"\\XT PPLL LLLL"L'H-D2@8<>8C4I,N(T Z_ejp v{   @k  >  BC9DEFf8c?gg^8^2^,b&lu {vlc]TNHB<60*d dz $*06<BH~NuTpZg`bf^lYrUxP~LGGCCCCCCCCCCCGGGGGGLLPPPPU Y&^,^2@"`2 k ? c BC#DEFP8c?gg"%/ 9DNY^hns}}xrmd\VNIC=82-}'}!xxsn hhcc cccc!c'^-Y2T8N=ICDI9N4T*Y%_djpu {  @  @  BCdDEF8c?ggc\UODuAl:c0Y)U"KFB8/*!  {q!j!`&Y*R/K/D4=47808)="=BFKKPPPPP"P)P0U7Y=^DcKgRlYu`zfmt{ &,3:AHOU\@"`~a(  A  BpCDEF8c?ggzrk`"\(U.I4B8;>7A0D(J$PSY] `cffillooliifcc``]zYsYhV`SYPQPJMCM;J4J,G%GDA>>;;;;;%;,;48;4C1J.Q+Y(`"hov~  !(07> F M U \ ckrz@"`6; L B  BCDEF̙8c?.. ww"o,k0b:b?ZDQNIN@W<W3W+\"ffk ktt tyy"y+~3~<~D~M~Uy^o^kfakWoNsDs:s0s'sw| ?b]`@"` 3 H  0޽h ? ̙33y___PPT10Y+D=' = @B +D  ,C$C:pB(   @ <8)Gy/Hu 7Q < r  S 0W     BCDEFP344-3i5R4S$gvkF\}hH$7FqWYe@s(d5`4_6!&' 66%(@                 S" z C 8  BC DEFnGG 4II-[iU@I!6 @ Scv4&\:?vv@ @ RzX:6RF;psw[kCcR 9[l-% 48@                       `S"  h n4L   BCDEdF.Tj$I9 (Im 7I\nwd0.@        `c"$ `3 N @  BCDEdF.Tj$I9 (Im 7I\nwd0.@        `S" /    BCDEDF&>eI7~.bYG2"v2L>@4!.,>>e@     `S" S -   BCDEDF&>eI7~.bYG2"v2L>@4!.,>>e@     `S" S  " BCDE@F 3K@Z/nhe\7~@@v @     S"  \  # BCDE@F 3K@Z/nhe\7~@@v @     S" [  % BBCDEFB((T9CQVk^Id:gmmv } t[%LtvdZoQIHIH@B8:.6.$$ @             `S" `  & BBCDEFB((T9CQVk^Id:gmmv } t[%LtvdZoQIHIH@B8:.6.$$ @             `S"  [  ' B$CNDEFfii{T n@1 %-)41:;@DCMBYI`Xo)OM$G -@`ymM218N`oRdu ")0NNNB;2* yE[DM@} L-dwn{ul` \$WWW4]`]WWyJyKL@                                  S" s Q  v ( (BC]DEF<f3A##r IZEO]8&Q%0b(I0.Bc m@Ul|t@           S"  C 0 , BCDEXF*f3A \VQ$J+D0<77H*mm%(..Vs6 \@       `S" p   BCDEFP3A44-3i5R4S$gvkF\}hH$7FqWYe@s(d5`4_6!&' 66%(@                 S" K    BC DEFnAAGG 4II-[iU@I!6 @ Scv4&\:?vv@ @ RzX:6RF;psw[kCcR 9[l-% 48@                       `  L   BCDEdF.ATj$I9 (Im 7I\nwd0.@        `c"$ ` B @   BCDEdF.Tj$I9 (Im 7I\nwd0.@        `S"   e    BCDEDF&A>eI7~.bYG2"v2L>@4!.,>>e@     `S" 9 H    BCDEDF&>eI7~.bYG2"v2L>@4!.,>>e@     `S" <  Z     BaCDE(FAA a7%y4[C=Za @    m   BaCDE(F a7%y4[C=Za @    m   BaCDE(F a7%y4[C=Za @    m  BCDE@F 3AK@Z/nhe\7~@@v @     S" o   BCDE@F 3K@Z/nhe\7~@@v @     S" %   BBCDEFBA((T9CQVk^Id:gmmv } t[%LtvdZoQIHIH@B8:.6.$$ @             `S"   v  BBCDEFB((T9CQVk^Id:gmmv } t[%LtvdZoQIHIH@B8:.6.$$ @             `S"   o  B$CNDEFAii{T n@1 %-)41:;@DCMBYI`Xo)OM$G -@`ymM218N`oRdu ")0NNNB;2* yE[DM@} L-dwn{ul` \$WWW4]`]WWyJyKL@                                  S" D   >  BaCDE(F a7%y4[C=Za @    : m E B5CDEF^A== .\" tI(@[w a  -Rw%7Is%(5.'eeDw4~a.(",0@                    `S" `j` & F  BCDELF&Aoqh*2:?E IvoF@      `S"  , G  BCDELF&oqh*2:?E IvoF@      `S"  RB I s *DԔ% %  J  ѐBiCDEFAAoiC .g@  % ]  K  BiCDEFoiC .g@  %  R  O BC/DEFAA$7 /@   n  6  P BC[DEFAA%7U[I@     I  Q BCaDE(FAA MXa F = - @   ` n I  R B CDEFAA    @  `  V B0C0DE(FA   00(( & @   `S"  z  W B0C0DE(F   00(( & @   `S"   " r BC7DEXF(f3A7@MUwnG3 )O.7)?!DJ$70@@@       S" p~  8   xS  &  s 0BCDEF<3A%%R3)\yH~udP, IR[e,d}Iw@            S" e ( t BCNDELF&3A$ - RR$27KCmI@*N$@      `S" g6   w BCDE(F3A )7fAzy @   S"   (8  -  ~   BCIDEF3A&"I@ S" V j   B C6DEF3A   $66@  S"   6  BCsDEXF(3Ac 7= CI.PCnGSsPmenfl7GZw_6@       S"  -   BC DEF3A 3S @ S"  a ,8 r C  H l u F  B-C7DEdF,A1++*[n  %1N m %+774-.-.@        S"  '   BCDEFA27`] @  S"  .   BCIDEF&"I@ S"  C  B BCIDEF&"I@ S" r 9 H  0޽h ?@ ̙33___PPT10i.1+D=' = @B +!  H@P,,(  x  c $HY   R  s *HpS % L Pp #   I   0Lp < `B  0D    s *JP =b dB  <Do  L Pp  #  ~     0Tp < `B   0D     s *WP =c L Pp  #     04\p < `B  0D    s *_P =d XB  0D    6dp 6Tail  6|Yw4 6Head  c BCDEFoH-Z6@  S"  L Np #     0 mp < `B  0D    s *pN =a   c BNCDEFoN|&7@  S"  XB  0Do &  XB  0D  0L   `  # S  fB B 6DjJ  ` fB  6DjJ  ` dB  <Do9 9    <HuN m "  P: Dequeue() => aH  ! <|L .  u Q: Enqueue(d)*  0L   `  "# % , fB #B 6DjJ  ` fB $ 6DjJ  `  % c BCDEFoZ-0@  S" w  & c BnCDEFonJ5'jj\V@  S" R F ' < < nDon t worry about deadlock, livelock, subtle bugs, etc& "8 -& R ( s *62 ) TAo5%"    2 * TAo5%" 2  + s *C"?Z <  , <̌  Great Performance, Simple Code: H  0޽h ? ̙33y___PPT10Y+D=' = @B +*  ))`GGv)(  x  c $Y   R  s *HpS % L Pp #   I   0dp < `B  0D    s *lP =b dB  <Do  L Pp  #  ~     0ܢp < `B   0D     s *P =c L Pp  #     0جp < `B  0D    s *ЯP =d XB  0D    6p 6Tail  6w4 6Head  c BCDEFoH-Z6@  S"  L Np #     0Ƚp < `B  0D    s *N =a   c BNCDEFoN|&7@  S"  XB  0Do &  XB  0D  0L   `  # S  fB B 6DjJ  ` fB  6DjJ  ` dB  <Do9 9    <N m "  P: Dequeue() => aH  ! <dL .  u Q: Enqueue(d)*  0L   `  "# % , fB #B 6DjJ  ` fB $ 6DjJ  `  % c BCDEFoZ-0@  S" w  & c BnCDEFonJ5'jj\V@  S" R F ' < < nDon t worry about deadlock, livelock, subtle bugs, etc& "8 -& R ( s *62 ) TAԔ5%"    2 * TAԔ5%" 2 rF 7  + 7 z , s *C"?7 Z - s *6Z . s *pHS % T Pp /# ~   0 0p < `B 1 0D   2 s *P =b  3 6p 6Tail 4 6dw4 6HeadT Np 5# L {  6 0p < `B 7 0D   8 s *lN =a  9B c BNCDEFoN|&7@  S"  `B : 0Do   8T   `  ;# z  fB <B 6DjJ  ` fB = 6DjJ  ` 8T   `  ># ! fB ?B 6DjJ  ` fB @ 6DjJ  `  A c BCDEFoZ-0@  S"   B c BnCDEFonJ5'jj\V@  S" 0   CB c BCDEFoZ-0@  S"  3  D s *C"?Z <  E <  Great Performance, Simple Code: 2 F TKAo5%" $ 2 G T#Ao5%" o`  H  0޽h ? ̙33y___PPT10Y+D=' = @B +V   yp(  x  c $ P     s *C"?@7  1synchronized{ } 42$$ $z  v  @ ,$D 0z  s *C"? v  s *C"?M r >atomic$  <6 d< ,$ 0 Execute all synchronized instructions as an atomic transaction& *A@%@ H  0޽h ? ̙33}u___PPT10U+{g0D' = @B D' = @BA?%,( < +O%,( < +D' =%(D' =%(DX' =A@BBB B0B%(D' =1:Bvisible*o3>+B#style.visibility<*%(D' =-6B+checkerboard(across)*<3<*D' =%(D' =%(D3' =4@BB BB%(D' =1:Bvisible*o3>+B#style.visibility<*%(D' =-o6Bdissolve*<3<*+8+0+ +  H(  x  c $,     s *C"?O'  \ Limitations: atomic{<~10-20-30?& but not ~1000 instructions>} Machines will differ in their support When we build 1000 instruction transactions, it will not be for free& fHg       pg H  0޽h ? ̙33y___PPT10Y+D=' = @B +>  PH(  x  c $.   x  c $/"  l  m   m ,$D 0  63 S"`? s   63 S"`? m H  0޽h ? ̙33___PPT10n.%Xp]+EgDB' = @B D' = @BA?%,( < +O%,( < +D4' =%(D' =%(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<*%(+A  00Ra&0(  r  S =w'GG   RB  s *DԔ & 8   q9Hv@ % 7(   7TB  c $D% 7   B2d@ (  P1993   Bۿ\EtR  STM (Shavit,Touitou)"& F    IIN % 7(     7TB  c $D% 7    B2lJ (  P2003   BۿtNdN  DSTM (Herlihy et al)"& r  <oI*Y,$@ 0F O  IN % 7(    7TB  c $D% 7   B2T (  P2003   BۿPYOX  oWSTM (Fraser, Harris)"   <^Yay,$ 0 Y Lock-free   F l  yX IN % 7(    7TB  c $D% 7   B2b (  P2003   BۿflU  oOSTM (Fraser, Harris)" F     IN % 7(  !  7TB " c $D% 7  # B2k (  P2004  $ BۿoyQ  ASTM (Marathe et al)"& F  % ,) IN % 7(  &  7TB ' c $D% 7  ( B2t (  P2004 . ) Bۿxh  0T-Monitor (Jagannathan& ):  &  r * <oI ] +,$D 0 + <HY y,$ 0 `Obstruction-free r , <oI@ @,,$@ 0 - <hY Ky,$  0 Z Lock-based   F  .  7N % 7(  /  7TB 0 c $D% 7  1 B2 (  P2005  2 Bۿ<pM  ~Lock-OSTM (Ennals)"  &  F V8 3 ~ IN % 7(  4  7TB 5 c $D% 7  6 B2h (  P2004  7 BۿܖV86  HybridTM (Moir)" 0 F  8 8 QN % 7(  9  7TB : c $D% 7  ; B2 (  P2004  < Bۿj  Meta Trans (Herlihy, Shavit)" 8  r = s *C"? V r > s *C"? tV r ? s *C"? )V F b @ 6N % 7(  A  7TB B c $D% 7  C B2̧ (  P2005  D BۿBbA  McTM (Saha et al)" 0 F  E E@N % 7(  F  7TB G c $D% 7  H B2Ȳ (  P2006  I Bۿ,T  &AtomJava (Hindman& )"  0 F  J ryHN % 7(  K  7TB L c $D% 7  M B2 (  P1997  N Bۿ`  Trans Support TM (Moir)"& F O O }6N % 7(  P  7TB Q c $D% 7  R B20 (  P2005  S Bۿ/O=  ~TL (Dice, Shavit))"&  F j \  VSN % 7(  ]  7TB ^ c $D% 7  _ B2$ (  P2004  ` Bۿjk  Soft Trans (Ananian, Rinard)" 8  H  0޽h ? ̙33___PPT10.XPH+Ӄ7D' = @B De' = @BA?%,( < +O%,( < +D' =%(Du' =%(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<*%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*%(D' =%(Du' =%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*+%(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<**%(D' =%(D' =%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*+%(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<**%(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<*,%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*-%(++0+ ++0++ ++0++ ++0+- +  f(  x  c $D     0/-h`X___PPT9:2@ $Postulate (i.e. take it or leave it): If we could implement fine-grained locking with the same simplicity of course grained, we would never think of building a transactional memory. Implication: Lets try to provide TMs that get as close as possible to hand-crafted fine-grained locking.n%%' ] ' ( j H  0޽h ? ̙33y___PPT10Y+D=' = @B +  (  r  S lwG     S FYf   "p`Pp  08 ) F,$ 0 HUnfortunately: OSTM, HyTM, Ennals, Saha, AtomJava deliver only 1 and 3 (in some cases)& XX\& H  0޽h ? ̙33___PPT10.X@t+PQFDO' = @B D ' = @BA?%,( < +O%,( < +DA' =%(D' =%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*%(+8+0+ +  /'(  x  c $wG     0 /,h`X___PPT9:2 7Focus on TL2 algorithm [Dice,Shalev,Shavit] Delivers all four properties Combines experience of prior art + - Uses Commit time locking instead of Encounter order locking - Introduces a Global Version Clock mechanism for validation m C > "  "  `1 p`PpH  0޽h ? ̙33___PPT10i.XB+D=' = @B +)  (([@4((  x  c $    R  s *Z) LB  c $DZLB  c $D3Z3LB  c $DqZqLB  c $D Z LB  c $D Z RB  s *DZZRB  s *DRB  s *D) 9 RB  s *D) ZZ9 ^  6H+.    + <\7]/ } P Map  , 0: kArray of Versioned- Write-Locks  LB 3 c $D@ LB 4 c $D@ LB 5 c $DT @ T LB 6 c $D @  ; 0Iv`0 f  _Application Memory RB < s *D} & RB = s *Dm PRB > s *D G RB ? s *D  C 0? ^  .PS = Lock per Stripe (separate array of locks)"/-.  D <8E l )PO = Lock per Object (embedded in object)"*() 8    b   A 6J   Y V#     T l p)  E#   2N 3 'Q  F Ml &Z f2 G 61?3 'Q f2 H 61?o . Z I s * p) f2 J 68c?@  l K <G8c?c   L 0C"?  `B M 0D   F 02Z O 9;y l2 P <8c?Pl2 Q <8c?hl2 R <8c?v2f S 68c?0f T 68c?zf U 68c?x&f V 68c?2 Zf W 68c?tf X 68c?jvf2 Y 68c? f2 Z 68c?>f [ 68c?^V~f \ 68c?\$L2 ] ENGZHI`TJQ8c? `T`T`T`T`T`T`T`T`T`T0~2 ^ E$GH I`TQ8c? `TT`TT`T`T`TT`T`T0Hf2 _ 68c?xf2 ` 68c?, a S B]C-DEF1?\, @bL l p)  e# Z @ 3 2N 3 'Q  f Ml &Z f2 g 61?3 'Q f2 h 61?o . Z i s * p) f2 j 68c?@  l k <G8c?c  L l p)  n# ZS @ 3 2N 3 'Q  o Ml &Z f2 p 61?3 'Q f2 q 61?o . Z r s * p) f2 s 68c?@  l t <G8c?c  L l p)  u# Z@ 3 S 2N 3 'Q  v Ml &Z f2 w 61?3 'Q f2 x 61?o . Z y s * p) f2 z 68c?@  l { <G8c?c  L l p)  |# Z@ 3 2N 3 'Q  } Ml &Z f2 ~ 61?3 'Q f2  61?o . Z  s * p) f2  68c?@  l  <G8c?c  L l p)  # Z@ 3 2N 3 'Q   Ml &Z f2  61?3 'Q f2  61?o . Z  s * p) f2  68c?@  l  <G8c?c  H  0޽h ?/ ]^ ̙33___PPT10i.WЕ> +D=' = @B +f  D D@WpyC(  x  c $bwqG   R  s *Tf LB  c $D2T2LB  c $DpTpLB  c $D T LB  c $D T LB  c $D* T* RB  s *D"RB  s *DTT"RB  s *Df TTvRB  s *Df v < <gPH D<4___PPT9 $rTo Read: load lock + location Check unlocked add to Read-Set To Write: lock location, store value Add old value to undo-set Validate read-set v# s unchanged Release each lock with v#+1R=$=&&  @`LB K c $D T LB L c $D" T"  a 0>T3,$D 0L t m# G8 g 6yt \ V# 0     `B h 0Duz C w G8,$D 0N t x G y 0T}t [ V# 0     ZB z s *D` { 0>CL t # ?G  0`t \ V# 0     ZB  s *DL t # G   04t [ V# 0     ZB  s *DL t #  G   0t \ V# 0     ZB  s *DL t #  G:   0܎t [ V# 0     ZB  s *DL t # 4 Ho   0t \ V# 0     ZB  s *D X <>>N|,$D 0 UX z C  ?G,$D 0N t  G  0t w V# 1 4    ZB  s *D`  0>CLB  c $D T LB  c $D T L t #  G   0t \ V# 0     ZB  s *D  <Ĩ> N ,$D 0 UY z C   G ,$D 0N t  G  0t w V# 1 4    ZB  s *D`  0>CLB  c $Df Tf   0>( Tf ,$D  0L t # ( Gl   0t \ V# 0     ZB  s *Dtz C  ( Gl ,$D 0N t  G  0@t Z V# 0     ZB  s *D`  0>C  <8 b Mem Locks   z C  2Gv,$D  0N t  G  0t u V#+1 0 4   ZB  s *D`  0>Cz C   G ,$D  0N t  G  0t u V#+1 0 4   ZB  s *D`  0>Cuz C  G9,$D  0N t  G  0Ht [ V# 0     ZB  s *D`  0>Cuz C  ) Gm ,$D  0N t  G  0t [ V# 0     ZB  s *D`  0>Cl v +v,$D 0@ 0 tv (vz ' s *C"?0 mt6@  |u & 6v  6 ^`  < TB  c $D ` TB  c $D ` TB  c $D  `  TB  c $D ` ZB  s *D` |` ZB  s *D | ZB  s *D  ZB  s *D` ` T t #  ^t  0|t \ V# 0     ZB  s *DT t #  t   00t Z V#+1 0     ZB  s *DT t #  t8   0t \ V# 0     ZB  s *DT t #  - tq   0t \ V# 0     ZB  s *DT t #  i t   0Pt \ V# 0     ZB  s *DT t #  u  0t \ V# 0     ZB  s *DTB  c $D o ` o T t #  # t   0Dt Z V#+1 0     ZB  s *DTB  c $D ` T t  #  t   0t \ V# 0     ZB   s *D ) < Ee OX  * < u  OY  U 6 z,$D 0 t@Quick read of values freshly written by the reading transactionAA V <X ^x ,[Ennals,Saha,Harris,& ]& H  0޽h ? ̙33!!___PPT10!.WЕ> +i>D ' = @B Dp ' = @BA?%,( < +O%,( < +D4' =%(D' =%(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<*w%(Dt' =%(D' =%(D' =4@BBBB%())))?D' =1:Bvisible*o3>+B#style.visibility<*a%(D4' =%(D' =%(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<*%(DA' =%(D' =%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*X%(D4' =%(D' =%(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<*%(DA' =%(D' =%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*%(D4' =%(D' =%(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<*%(D4' =%(D' =%(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<*%(D4' =%(D' =%(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<*%(D4' =%(D' =%(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<*%(D4' =%(D' =%(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<*%(D4' =%(D' =%(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<*%(D4' =%(D' =%(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<*+%(DA' =%(D' =%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*U%(++0+X ++0+ ++0+U +  'QQPP(  x  c $/t   R  s *Tf LB  c $D2T2LB  c $DpTpLB  c $D T LB  c $D* T* RB  s *D"RB  s *DTT"RB  s *Df TTvRB  s *Df v   <1"r D<4___PPT9 RTo Read: load lock + location Location in write-set? (Bloom Filter) Check unlocked add to Read-Set To Write: add value to write set Acquire Locks Validate read/write v# s unchanged Release each lock with v#+1R#&&  @`LB  c $D" T"   0>T3,$D 0L t # G8  0pDt \ V# 0     ZB  s *Duz C  G8,$D 0N t  G  0Gt [ V# 0     ZB  s *D`  0>CL t # ?G  0Lt \ V# 0     ZB  s *DL t # G   0Qt [ V# 0     ZB  s *DL t #  G    0lUt \ V# 0     ZB ! s *DL t "#  G:  # 0Zt [ V# 0     ZB $ s *DL t %# 4 Ho  & 08Ot \ V# 0     ZB ' s *Duz C ) ?G,$D 0N t * G + 0bt [ V# 0     ZB , s *D` - 0>CLB . c $D T L t 0#  G  1 0pht \ V# 0     ZB 2 s *Duz C 4  G ,$D 0N t 5 G 6 0mt [ V# 0     ZB 7 s *D` 8 0>CLB 9 c $Df Tf  : 0>( Tf ,$D  0L t ;# ( Gl  < 0rt \ V# 0     ZB = s *Dtz C > ( Gl ,$D 0N t ? G @ 0|xt Z V# 0     ZB A s *D` B 0>C C <v b Mem Locks   z C I  G ,$D 0N t J G K 08t u V#+1 0 4   ZB L s *D` M 0>Cuz C N G9,$D  0N t O G P 0t [ V# 0     ZB Q s *D` R 0>Cuz C S ) Gm ,$D 0N t T G U 0t [ V# 0     ZB V s *D` W 0>C  6  d,$D 0 V"Hold locks for very short duration##  <>2Tp,$D 0 B   0> ] ,$D 0z C  2G,$D  0N t  G  0t w V# 1 4    ZB  s *D`  0>Cz C   G ,$D  0N t  G  0lt w V# 1 4    ZB  s *D`  0>Cz C  2G,$D  0N t  G  0t w V# 1 4    ZB  s *D`  0>C ( <>2Tp,$D 0 UX  3 <@> T ,$D 0 UY z C D 2G,$D 0N t E G F 0t u V#+1 0 4   ZB G s *D` H 0>Cz C   G ,$D 0N t  G  0t w V# 1 4    ZB  s *D`  0>Cz C   G ,$D 0N t  G  0t v V#+1 0 4   ZB  s *D`  0>CDz v X I,$D 0$N 0 tv Y vz Z s *C"?0 mtDN  |u [  6v \ 6  ^`  < TB ] c $D ` TB ^ c $D ` TB _ c $D  `  TB ` c $D ` ZB a s *D` |` ZB b s *D | ZB c s *D  ZB d s *D` ` T t e#  ^t f 0t \ V# 0     ZB g s *DT t h#  t  i 0t Z V#+1 0     ZB j s *DT t k#  t8  l 0pt \ V# 0     ZB m s *DT t n#  - tq  o 0Dt \ V# 0     ZB p s *DT t q#  i t  r 0t \ V# 0     ZB s s *DT t t#  u u 0t \ V# 0     ZB v s *DTB w c $D o ` o T t x#  # t  y 0xt Z V#+1 0     ZB z s *DTB { c $D ` T t |#  t } 0t \ V# 0     ZB ~ s *D  <Ee OX   <t u  OY   <  T[TL,TL2]  H  0޽h ? ̙3311___PPT10r1.WЕ> +#Df0' = @B D!0' = @BA?%,( < +O%,( < +D4' =%(D' =%(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<*%(Dt' =%(D' =%(D' =4@BBBB%())))?D' =1:Bvisible*o3>+B#style.visibility<*%(D4' =%(D' =%(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<*)%(DA' =%(D' =%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*%(D4' =%(D' =%(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<*4%(D4' =%(D' =%(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<*%(D4' =%(D' =%(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<*>%(D4' =%(D' =%(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<*:%(D4' =%(D' =%(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<*%(D4' =%(D' =%(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<*%(D4' =%(D' =%(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<*N%(D4' =%(D' =%(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<*%(D4' =%(D' =%(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<*%(D4' =%(D' =%(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<*S%(DA' =%(D' =%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*(%(DA' =%(D' =%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*3%(D4' =%(D' =%(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<*D%(D4' =%(D' =%(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<*%(D4' =%(D' =%(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<*I%(D4' =%(D' =%(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<*X%(DA' =%(D' =%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*%(++0+ ++0+ ++0+( ++0+3 +S  jbp(  r  S %P     <'@3` :   0* `XP___PPT92* Under low load they perform pretty much the same. COM withstands high loads (small structures or high write %). ENC does not withstand high loads. COM works seamlessly with Malloc/Free. ENC does not work with Malloc/Free. # ' > #' '# #' # 8  @`H  0޽h ? ̙33___PPT10i.-Y`\J+D=' = @B +   .P(  r  S T>t     fAgraph-RB20S 5l 6 9  6 9 ,$D 0   B CDEFAo! @S"  9   # B CDEFAoM{j M @S" 6     # B CDEFAo{ - @S" F 9    BAR r  SENC l m7 -m7,$D 0@ m  m    B CDEFAon{N @S" 2    BFgm THand +N  7 *  7 + 3 B C!DEFo ! @S"    , <(K 7 SMCS Cz 2  # 2 ,$D 0 $ <Og2R SCOM  % # B CDEFoQA| @S" 2 9  &  B CDEFo{4! @S"    . 6Lz*t }/Red-Black Tree 20% Delete 20% Update 60% Lookup00/ H  0޽h ? ̙33___PPT10./Y+RD' = @B Du' = @BA?%,( < +O%,( < +D4' =%(D' =%(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<*%(D4' =%(D' =%(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<*#%(D4' =%(D' =%(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<*-%(+"  (@(  r  S D]   5z      ,$D 0   B CDEFo3 @S"     B CLDEFoL<& @S"     <`Z!A  SCOM   dAgraph-RB5L}dge 5l 1q  1q ,$D 0   B C(DEFAo($v @S"    # B CDEFAoO @S" 4   # B CDEFAo*& @S"     BLeC"?gq  SENC   # B CDEFoO @S" 1   # B CDEFoO @S" 1 z e " e,$D 0 N 9  # 9  $  B CDEFo @S" 9  % < kZ! THand  & 3 B CDEFo @S" 9   ' <|oZE ye SMCS  ( 6szw9t {-Red-Black Tree 5% Delete 5% Update 90% Lookup..- H  0޽h ? ̙33___PPT10.2Y+~"D' = @B Du' = @BA?%,( < +O%,( < +D4' =%(D' =%(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<*%(D4' =%(D' =%(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<*%(D4' =%(D' =%(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<*"%(+/"   H(  r  S |    - 6H"Z_ <  / <1! g PS Lock Array"   R 0 s *G" 1 c BCDEFAAo b.[f@  "`mF Pg C K"gZB 2 s *DoP ZB 3 s *Do}g 4 <lth MA  5 <H MB  6 < *  : ) 7 0xPH@___PPT9" qTo free B from transactional space: Wait till its lock is free. Free(B) B is never written inconsistently because any write is preceded by a validation while holding lockd%%d#&E&Be  @`F    8 z 2 Z 9 0    Y V#     T l p)  :#   2N 3 'Q  ; Ml &Z f2 < 61?3 'Q f2 = 61?o . Z > s * p) f2 ? 68c?@  l @ <G8c?c  z A s *C"?  ZB B s *D   D 6>"z 3 `,$D 0 E <Ъ.N,$ 0 XVALIDATE   F Bh>"Z`,$D 0 UX  H <`"(,$ 0 w' FAILS IF INCONSISTENT((' H  0޽h ? ̙33___PPT10.Yp+! ,D' = @B DQ' = @BA?%,( < +O%,( < +D4' =%(D' =%(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<*D%(DA' =%(D' =%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*E%(DA' =%(D' =%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*F%(DA' =%(D' =%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*H%(Dq' =%(D' =%(D' =A@BBBB0B%(D ' =+4 8?XCB ppt_xBCB ppt_xB*Y3>B ppt_x<*FD' =+4 8?`CB ppt_yBCB1+ppt_h/2B*Y3>B ppt_y<*FD' =1:Bhidden*o3>+B#style.visibility<*F%(++0+E ++0+F ++0+F ++0+H +U  80 (   x   c $x   R   s *"Z_   <1! g PS Lock Array"   R   s *G"   s BCDEFo b.[f@  "`mL Pg  # K"gZB   s *DoP ZB   s *Do}g   <th MA    < MB    <` *  :    08 QCannot free B from transactional space because undo-log means locations are written after every lock acquisition and before validation. Possible solution: validate after every lock acquisition (yuck):=M?  @`F      z 2 Z   00   Y V#     T l p)   #   2N 3 'Q    Ml &Z f2   61?3 'Q f2   61?o . Z   s * p) f2   68c?@  l   <G8c?c  z   s *C"?  ZB   s *D     6>"z 3 `,$D 0   <.N,$ 0 XVALIDATE     B>"Z`,$D 0 UX H   0޽h ? ̙33  ___PPT10 .Yp+%cD ' = @B D ' = @BA?%,( < +O%,( < +D4' =%(D' =%(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<* %(DA' =%(D' =%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<* %(D' =%(D' =%(D=' =A@BBBB0B%(D' =0l9 CCBB*<3<* DA' =%(D' =%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<* %(++0+  ++0+  ++0+  +  (  x  c $(P     <D@3` : $  0  D<4___PPT9 xAll current lock based STMs work on inconsistent states. They must introduce validation into user code at fixed intervals or loops, use traps, OS support,& And still there are cases, however rare, where an error could occur in user code& :# ' # &  @`H  0޽h ? ̙33___PPT10i.-Y`\J+D=' = @B +  y(  r  S \P     <0   /  6f G,$D 0 GLater: how we learned not to worry about contention and love the clockHHG H  0޽h ? ̙33___PPT10.Y`+ DO' = @B D ' = @BA?%,( < +O%,( < +DA' =%(D' =%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*%(+8+0+ +h  DDZC(  x  c $"t   R  s *Tf LB  c $D2T2LB  c $DpTpLB  c $D T LB  c $D* T* RB  s *D"RB   s *DTT"RB   s *Df TTvRB   s *Df v4   0'jw D<4___PPT9 RV VClock On Read: read lock, read mem, read lock: check unlocked, unchanged, and v# <= RV Commit.ZeP ,= @`LB   c $D" T"   0>T3,$D 0L t # G8  02t \ 87 0     ZB  s *Dvz C  G9,$D 0N t  G  0<t \ 87 0     ZB  s *D`  0>CL t # ?G  0?t [ 34 0     ZB  s *DL t # G   0dDt \ 88 0     ZB  s *DL t #  G   0Ht \ V# 0     ZB  s *DL t  #  G:  ! 0Mt \ 44 0     ZB " s *DL t ## 4 Ho  $ 0\Rt \ V# 0     ZB % s *Dvz C & 2G,$D 0N t ' G ( 0Vt \ 34 0     ZB ) s *D` * 0>CLB + c $D T L t ,#  G  - 0(\t \ 99 0     ZB . s *Dvz C /  G ,$D  0N t 0 G 1 0at \ 99 0     ZB 2 s *D` 3 0>CLB 4 c $Df Tf  5 0>( Tf ,$D  0L t 6# ( Gl  7 0gt \ 50 0     ZB 8 s *Dvz C 9 ) Gm ,$D  0N t : G ; 0lt \ 50 0     ZB < s *D` = 0>C > <j b Mem Locks    N 6u  ,$D 0 z.Reads form a snapshot of memory. No read set! 0/ O <t>2Tp,$D 0 B  P 0> ] ,$D  0  6=0  S100   < ` " TVClock vz C  G9,$D 0N t  G  0Їt \ 87 0     ZB  s *D`  0>Cvz C  2G,$D 0N t  G  0ht \ 34 0     ZB  s *D`  0>Cvz C   G ,$D  0N t  G  0t \ 99 0     ZB  s *D`  0>Cvz C  ) Gm ,$D 0N t  G  0Ht \ 50 0     ZB  s *D`  0>C"z v  v,$D 0(N 0 tv  vz  s *C"?0 mtHN  |u   6v  6 ^`  < TB  c $D ` TB  c $D ` TB  c $D  `  TB  c $D ` ZB  s *D` |` ZB  s *D | ZB  s *D  ZB  s *D` ` T t #  ^t  0Xt \ 87 0     ZB  s *DT t #  t   0t \ 34 0     ZB  s *DT t #  t8   0Хt \ 88 0     ZB  s *DT t #  - tq   0Dt \ V# 0     ZB  s *DT t #  i t   0t \ 44 0     ZB  s *DT t #  u  0t \ V# 0     ZB  s *DTB  c $D o ` o T t #  # t   0t \ 99 0     ZB  s *DTB  c $D ` T t #  t  0t \ 50 0     ZB  s *D  <Ee <   <@   < z   X  ,$D 0 Y <81 W100  Z <X0  NRV H  0޽h ? ̙33##___PPT10#.WЕ> +^D"' = @B D"' = @BA?%,( < +O%,( < +D4' =%(D' =%(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<*X%(D4' =%(D' =%(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<*%(Dt' =%(D' =%(D' =4@BBBB%())))?D' =1:Bvisible*o3>+B#style.visibility<*%(D4' =%(D' =%(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<*%(D4' =%(D' =%(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<*&%(DA' =%(D' =%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*O%(D4' =%(D' =%(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<*%(D4' =%(D' =%(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<*/%(D4' =%(D' =%(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<*P%(D4' =%(D' =%(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<*%(D4' =%(D' =%(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<*9%(D4' =%(D' =%(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<*5%(D4' =%(D' =%(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<*%(D4' =%(D' =%(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<*%(DA' =%(D' =%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*N%(+p+0+N ++0+O +ǟ  ZZ G.Z(  x  c $t      0  _ D<4___PPT9 bDRV VClock On Read/Write: check unlocked and v# <= RV then add to Read/Write-Set Acquire Locks WV = F&I(VClock) Validate each v# <= RV Release locks with v# WV* 8Z 3  @` N 6 m ,$D 0 ~Reads+Inc+Writes =Linearizable$   6zk^ ? S100   <|  TVClock R  s *[ LB  c $D''LB  c $DeeLB  c $D  LB  c $D  RB  s *DRB  s *DRB  s *D[ kRB  s *D[ kLB  c $D    0>(,$D 0L t # )-  0t \ 87 0     ZB  s *Dvz C  -.,$D 0N t  G  0t \ 87 0     ZB  s *D`  0>CL t # 4)  0 t [ 34 0     ZB  s *DL t # )   0$t \ 88 0     ZB  s *DL t #  )/   0)t \ 44 0     ZB  s *DL t # ) *d   0"t \ V# 0     ZB  s *Dvz C  22,$D 0N t  G  0p2t \ 34 0     ZB  s *D`  0>CLB  c $D  L t #  .   048t \ 99 0     ZB  s *Dvz C   2 ,$D  0N t  G  0=t \ 99 0     ZB  s *D`  0>CLB  c $D[ [   0> [ ,$D 0L t #  )a   0Bt \ 50 0     ZB  s *Dvz C  ) 2m ,$D 0N t  G  0@Ht \ 50 0     ZB  s *D`  0>C  <dFpY b Mem Locks     <lR>'e,$D 0 B   0>  ,$D  0vz C  -.,$D 0N t  G  0Ut \ 87 0     ZB  s *D`  0>Cvz C  22,$D  0N t  G   0d[t \ 34 0     ZB   s *D`   0>Cvz C    2 ,$D  0N t   G  0`t \ 99 0     ZB  s *D`  0>Cuz C  ) 2 ,$D 0N t  G  0ft [ 50 0     ZB  s *D`  0>Cz C Q 22,$D 0N t R G S 0kt x 34 1 4    ZB T s *D` U 0>Cz C V  2 ,$D 0N t W G X 0 st x 99 1 4    ZB Y s *D` Z 0>Cwz C D -2,$D 0N t E G F 0zt ] 87 0   ZB G s *D` H 0>C ` <>2p,$D 0 UX  a <> . ,$D 0 UY  A <pvdn,$ 0 VCommit z C b 22,$D 0N t c G d 0|t w 121 0 4    ZB e s *D` f 0>Cz C l  2 ,$D 0N t m G n 0t x 121 0 4    ZB o s *D` p 0>Cwz C I ) 2 ,$D 0N t J G K 0tt ] 50 0   ZB L s *D` M 0>C z v  'k,$@ 0&N 0 tv  vz  s *C"?0 mtFN  |u   6v  6 ^`  < TB  c $D ` TB  c $D ` TB  c $D  `  TB  c $D ` ZB  s *D` |` ZB   s *D | ZB ! s *D  ZB " s *D` ` T t ##  ^t $ 0ht \ 87 0     ZB % s *DT t &#  t  ' 0t [ 121 0     ZB ( s *DT t )#  t8  * 0t \ 88 0     ZB + s *DT t ,#  - tq  - 0Tt \ V# 0     ZB . s *DT t /#  i t  0 0t \ 44 0     ZB 1 s *DT t 2#  u 3 0t \ V# 0     ZB 4 s *DTB 5 c $D o ` o T t 6#  # t  7 0t [ 121 0     ZB 8 s *DTB 9 c $D ` T t :#  t ; 0t \ 50 0     ZB < s *D = <Ee <  > <   < l   D ,$D 0 B <@1 W100  C <0  NRV  E <>zj] ?,$D 0 S100  ? <x>zj] ?,$D  0 S120  @ <T>zj] ?,$D 0 W121  F <,,$ 0 OX  G <  ,$ 0 OY H  0޽h ? ̙33DD___PPT10D.WЕ> +wDB' = @B D@B' = @BA?%,( < +O%,( < +DA' =%(D' =%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*E%(D4' =%(D' =%(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<*D%(D4' =%(D' =%(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<*%(Dt' =%(D' =%(D' =4@BBBB%())))?D' =1:Bvisible*o3>+B#style.visibility<*%(D4' =%(D' =%(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<*%(D4' =%(D' =%(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<*%(DA' =%(D' =%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*%(D4' =%(D' =%(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<*%(D4' =%(D' =%(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<*%(D4' =%(D' =%(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<*%(D4' =%(D' =%(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<* %(D' =%(D' =%(D@' =A@BB BB0B%(D' =1:Bvisible*o3>+B#style.visibility<*?%(D' =-o6Bdissolve*<3<*?D4' =%(D' =%(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<*%(D4' =%(D' =%(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<*%(D4' =%(D' =%(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<*%(D4' =%(D' =%(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<*Q%(D4' =%(D' =%(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<*V%(D' =%(D' =%(D3' =4@BB BB%(D' =1:Bvisible*o3>+B#style.visibility<*@%(D' =-o6Bdissolve*<3<*@D4' =%(D' =%(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<*D%(D4' =%(D' =%(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<*I%(DA' =%(D' =%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*A%(DA' =%(D' =%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*`%(DA' =%(D' =%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*a%(D4' =%(D' =%(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<*b%(D4' =%(D' =%(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<*l%(Df' =%(D' =%(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<*%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*F%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*G%(DA' =%(D' =%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*N%(++0+N ++0+ ++0+` ++0+a ++0+A ++0+E ++0+? ++0+F ++0+G +}  0 $(   r   S P   r   S   H   0޽h ? ̙33___PPT10i.Y@+D=' = @B +}  @$$(  $r $ S &P   r $ S '  H $ 0޽h ? ̙33___PPT10i.Y+D=' = @B +3  ` ,4(  ,r , S  3    , BA ??/   , 64%c l5% Delete 5% Update 90% Lookup   , <,9GH df MVm,$D 0 Z Hand-crafted      , <(0GpHf  ) ,$D 0 Z TL/PS TL2/PS      , <>G!HEf V,$D 0 Z TL/PO TL2/P0     , <CGJHf CV ,$D 0 VEnnals   , <HGHf V <,$D 0 nFarserHarris Lock-free   H , 0޽h ?_P , , , ,, ̙33  ___PPT10 .HZYzw+Ds ' = @B D. ' = @BA?%,( < +O%,( < +DA' =%(D' =%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<* ,%(DA' =%(D' =%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<* ,%(DA' =%(D' =%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*,%(DA' =%(D' =%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<* ,%(DA' =%(D' =%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<* ,%(++0+ , ++0+ , ++0+ , ++0+, ++0+ , +{   P/(  Pr P S h],    P0  `A ? ?t[   P 6(_swm l5% Delete 5% Update 90% Lookup  P <cGHʓf ),$D 0 STL/P0  P <+B#style.visibility<*P%(DA' =%(D' =%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*P%(+p+0+P ++0+P +  ` p)(  pr p S sP    p0 ZA ?AA ?}   p 6DuJ: n 30% Delete 30% Update 40% Lookup!!    p <yGH>wf 6 s ,$D 0 VEnnals   p <L{GHBf V,$D 0 STL/P0   p <|GH'f `,$D 0 TTL2/P0 H p 0޽h ??0 p p p ̙33___PPT10.\ +T D' = @B D' = @BA?%,( < +O%,( < +DA' =%(D' =%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<* p%(DA' =%(D' =%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<* p%(DA' =%(D' =%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<* p%(++0+ p ++0+ p ++0+ p +) -K0 ( P(  r  S 4wP     tA,graph-rb5l-normalizedtVe   < V@  ] Hand- Crafted    <3 UTL/PO     B[ CeDEFAԔe[ @S" n     Bg C0DEFAԔ0tBTg @S"  g    60V z,Large RB-Tree 5% Delete 5% Update 90% Lookup--, H  0޽h ? ̙33___PPT10i.]Zg +D=' = @B +}  p0$(  0r 0 S P   r 0 S t  H 0 0޽h ? ̙33___PPT10i.IZ +D=' = @B +    @X(  @r @ S t    @0 zA & &?core_rb_large_D5U5 &   @ 6BF< t&RB-tree 5% Delete 5% Update 90% Lookup''&   @ <LGHwf `w,$D 0 Z Hand-crafted      @ <ĵGHVf F wf ,$D 0 TSTMs H @ 0޽h ?/  @ @ ̙33\T___PPT104.\p+rCD' = @B DS' = @BA?%,( < +O%,( < +DA' =%(D' =%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<* @%(DA' =%(D' =%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<* @%(+p+0+ @ ++0+ @ +  0(  x  c $P   x  c $  H  0޽h ? ̙33___PPT10i.MZ+D=' = @B +}  4$(  4r 4 S TP   r 4 S (   H 4 0޽h ? ̙33___PPT10i.JZ`Ef+D=' = @B +  (  r  S P   H  0޽h ? ̙33___PPT10i.]+D=' = @B +% 0 NF(  ^  S    $@  c $$ 0  $ We have a long way top go but in some cases are starting to do well& EE D H  0޽h ? 3380___PPT10.$X8">0 0 N(  X  C    $  S  0  $ P"Hanke 10-12 times faster than lockH  0޽h ? 3380___PPT10.Y s/ 0 (  X  C    $  S %$ 0  $ UHolding locks long exposes COM to contention. Order of magnitude faster than MCS lockU H  0޽h ? 3380___PPT10.Y`hC> 0 S(  X  C    $  S $8$ 0  $ UNiagara delivers 3 times the throughput of SunFire with half the processors and cost a factor of 10 less. This is only a 1st generation machine, so the number of instructions on cvomputation path is dominant and ${Y8+  H  0޽h ? 3380___PPT10.]~ 0 80(  X  C    v0  S v 0  v This is not the case of worm expert invited to talk about elephants& &$ H  0޽h ? 3380___PPT10.`s+oR 0 (  ^  S    $  c $L$ 0  $ uEOne can build longer transactions in hardware but all this has a costE H  0޽h ? 3380___PPT10.$X8"G x`F/{ھm wPPacww/0ܡp>o<.]Oi.'9+;Jb!N[+֑; 9qoohCVw'r/dX27G1bC\]GKA-E.OkNT|*moo }A?Wzޕ6??oi/hS!O@Kܥf'߿NZ*{whSb$߃UM?޸[_ԥ޵|/n /5'CNB]qP BJ? !N9rFLș gEΆl gG΁9rn~G~1Gn\Gs?Ï1?.AsrOϊf9o}}+ןII{<y Xq' OD<y Tiӑg D<y\y /D^y ReˑW ;+W!F^yz 7!oFނyvX;w!Fރy~!F>||I8Sȧ E>|EKȗ #_E|M[ȷ E|CGȏϐ#@~ 5w=ȟ?#A ;ȿ#A?D$y=Y K2CV5d9 rRdɑS "!DN9 rZt3 gD΄9 rVlrv9s!F΃9r~ !FF.\rq%K!F.\ry +!WF6 "WE\rMZȵ E\9 r8rCFȍ 7EnrKVȭ EnBrg.]!wG@ro>ȑQ}! G<y`!C!G<F<y Xq' OD<y Tiӑg D<y\y /D^y ReˑW ;+W!F^yz 7!oFނyvX;w!Fރy~!F>||I8Sȧ E>|EKȗ #_E|M[ȷ E|CGȏO"?C~%+o"C~9#'_"C'/"9CC@ Ud YGN9rrȁA)S!FN9rz 3!gF΂99rN\ȹ E·rABȅ E.\rIl\ rYr+ WD\D\ru5k!F\r}0 !7Fnrs-[!Fnr{d rGNȝ wEv@'Ϗ9r r!F<yp#~?~[ ~ܡ:{c5ߣ8߂'C^㾓_v~=ߡ/NMnpfp#66;x7bbw mm`Ⱥ-xjssSln l!ъ!ώbkgWl F k666mmo [^ m|;vnX(l==l?f/< ?oIu?{w;X~&jEM ~D{ֽ?XQyb}]AUů~dP!{ rSl=vP?[:zDp8D?lm v#|ч5ߣ_';moo:Ԗ]u  jՎ_ʂm n7l7[[A߸Am 5~rP;ZH>ŵ%,Ac[[{o#X_hʲ!|?v/i2ݠ`|^B!8yc^tI7n) u{BL*UO5ԏܿlÛi 1L?eK8Ĉ zv4#C!B!B!BH/hOioVn<93^<22_Or31[:KI'a ICKڊt3yk2n1t~47©g7 =#_='ݖN G;߆_8!Jwt߆ퟁE$??NFpKy#̔`/\ >\ $B!؆Ȁv)@Șq@HWC!2k3qKg#l`F5jkFذ+6bءkFذ+65ȴdLGƄ` {뀾=‚_ ޠ`իy]XG #f_ߝi7M<o@mO~?%݆Bo R[fh~l#S/rğؿ6Cma+U9I´+m_iELտN=;28Ĕy1 h_a0A- ;Rh8_7o5t̶pʿ`S6S"zc)~2{&ZMK&MWH&Mߚ(7M[Y[~+H&]J &V'VVVsRb>+"0k *V td?kR ~&"Sשߔɿ嬀uǃXXdՊd_ `TƗN+F?8Q/Pc 8I,/յd8IpUG&ǰ?49[Iaq'0yd=h߄׿t"f;%/h|C3%p=d"_%/``? /r.]<~H@̈M\z/y2S^b8`fI3N` t3 o'"n7h%̫.b +h٠88f^|X@O tewU*5'GI~pFڒX?*V^W &t#h_pu/ 6pmERi_Ey/U5FCe/na,w*J t LT@NXew!2%4N'!B2p {ɖF:kV74z/P*U0 7;r U%ZFZ`@ (*4R/@h%.WQiC_A@ՍpzKh  +bHluKJ`H88* F!9 ),}J5bSXRA+ɿ}![W60 "KJ`OLÿX,ubhLĿ6f`W+HGd:@u J`S7PMt Vm蟮P,cBXUWB"8 O L=2NZaV"Ep(O[*K`ڝ~ _h ޱٿ0@n%k `Xq^ڒXja  N/!BAj?QHi \ a 6X:W`@x,q?}s ]k` TN ,;3( LtK nC q?mpZ@"c8_/v3p Ôf@@3&/Ơ"!u"krq`8Ä^@Y_i !]N.a7h؇ vnjjMe, @;bTKabcR-'/aA@*MrKJ7:h#5錁RFº_@xeQe`Rg`KL?bx : `X]a'ބglVtAAy<3[%P"8E`!K:o}=a3A7Dg?jJmc2@ l>`L pm l6A"XpalU*0Y;+3@ߐk!K`;닠~zԐ_T5"҇̐Ѳ#X )cU +&Fa#rK.FaE0EOCi[ "؋>[eiWmGpvX+xUC)T5{*ج`EM*Wm ^U3_8G"9lTA"809 W#~]-Wg%m_wtA <` &x2lOK+`f; /hlSON%mG'(FjU3@CEPbxƿd AA^ch+ϘA_GTAg CrV)0_qpx_L2`xZ+/f4Wv+G rكO%ˁҧ&IW1} h` /?g49"^ߏF*V?I'6byXCsU7* 4 4i`cP̨N`3QϼIl`3_ ,Z} 8Y |NAb"L+젯7~ 4`}SAϪΞ GjN VA?efL? dJ: EL؇2X``_ Jg+6؋^:V}) ;=@ѣk0Y{jd2%SZf1M?'hi`_%PW_Gh9@ ?w@s ?hi`_`FA  # ?װ@m{nI2PCA( o3:*H@MA0-:^A6RA:- s3PC@ 6 C! TPM+ lRЄ^\ zrsk#(fSЌir=7$%Іa{HzÖr4 šb~O?u3zr􄂁6F")B?Wڈ *5p1P8BFi/# f}F10Vp90HhOCSG0ToCaD Pd$ 0yCGfz9Vo6oXk 3AiBƣ  8j>T9XT+ADJ0_MW߼f@Eg5Tn%J":~o5o=7C|¡UP$3=XoB7K=V"3Rz.j+y5G把\G( ,kՏ͕}.`53%oTQ;)Џ􏄮E쉖Ϫ,[k\îERgH-rXB-E `?SO\fF^g'roM7!7yrB k?R: OkMȫgmDt<{.YHZe$ Jcj`(~Ig #Ar4 wfƒQ'QXs3@:9+kjiE@yB>5%iie HH{&6!-.E0= ')2ǥ"Ȝ?F~B2vP[Zu4#zTS3m4 E@GjQ>@G1ȝ yP(?"Q7W8FM 6QOTYO$/l%rp3/Ujr!Կ|+'V@^q͕Ug}mwȣAI+#sf+)]Hyzt蟥cM|+_NJg)řrOdB]*;_$'[㞪K2#uA$Nvx|d/`+Uv6lߤt?`fmmNZTBkUQyߌZvg([D谧r bsp"ڔܗw(9G(\Ҏ!ǥ۱W1dLGt00Hg֡Va`rrf6UM/jabC.:r~Tmr:n_?#12_b5 #cBHgx #}Hp2`)|ƶO.KȰ$jDh|Djd:0ڈI?b`pK1dL 1d08I Q=Q=hB^àk#&8GLqf4h@L7#dcr74jMZ`Ft>neoaxcȆ؊a VlrTO~eǵ\a3 餬 z Vl 7 MhmqGx:_ȋ؃*:DG!B!B!B!dR W?Bc$7x /3B)Y =^4i)^aѹ25JR1t_W:nEdrd #A<2}y&VOWh_lcNf_ZҔ+i:lN[*B?7N_{L^)2_W_v¡TIn'J"%__y,/ߦniQkm͐I+L!B!B!B!Bq%^ե ar{Qh1c!G<yd)S!OG<yl9s!G^yb%K!/G^ D^y Zu7 oDބy Vmۑcw Dޅy^} D>|Qc.q'O!F>|y /!_F|u7o!F|}!?F#?A~ 9 ȯ_#A~=ȟ?#A ;ȿ#A?Dd!, r/ YFV}*#'AN 99r @ ȩS#AN9=rș3#gAΊ @Ύ9'r.y"CΏ\ r!EC"C.\$r)e"C.\"r%&rPՐ#@\ 6r#!7@Gn1r͐#@n 5r#[;"wB+r7={"B99 /r4r?"B<y(0#G"ȣG#A<y<ȓ'#OA< y: ȳg#A<y>ȋ#/A^ y9 dy%*k"C^y#&["oCގy'.{"Cޏ| !G"Cv#@>| 4#_@| 2xא#@| 6#?@~1 Sgϑ_ D~ [w? ' D Woߑ D_!'"A&C@ Ud YGN9rrȁA)S!FN9rz 3!gF΂99rN\ȹ E·rABȅ E.\rIRȥ E.\rEJȕM*ȡU!WG\rm:u!GCnrc&M!7Gnrk6m!G; wD rWnݑ#{ Dr$rr_h~1 D<yPaÑG DG!F<yx '!OF<yt3g!F<y| !/F^yrJUȫ E^yFMț oEކ9yN]Ȼ EއACȇ E>"G>|9iĽyp>`0oHA|ovaޮ'bccwowClolmo=%vwֶ{ۇlmooME񬿸=gnnonvwrkxƖe`sc{7ؤn`XݏXkxv[ ׇwvww;boGl߿{6lllmc6ͻ oKOL?/ B!B!B!B!BMƄ> #k1I^_F!?Xzy+A/-+k-j$k/=VDHKo޿A1Jv+8.G̑חr ǿN?D$*S?L>?D"5O_EH- OiPϦBHBΦS3OkկRaA&.ʺ&jXO*նN2籈I[7 T{fYwKI7 }kMȫgmD-/_6m//ۄvW.g5;3 T,?H+NHnxg<(ipK[}A2ؓKq[vVk6}ص6NqoK~VK?׉aGOoW)3%=3U({D)#- ѿ($gL)=sHvue^@7STSR#Er"_q!&z]Էoe+:2zCqeⅯ7!m %gyAZ#Wִ뙏пyQ5f,Uei[Fy͓n5R#_:%7̿MW|ۗNgWgW3 C:gP#h+c90byҿQPox7~o ,{CGj2b}~_8)sl0}3Ev>c8a" KXE,o8c3cDָWo]DžE#Ϝ ^v:#k#(k-mՔu ?5wXwos Kz}WτaΐdpmE.| ? _ 7 |pMUO.sSV@\Gپ-?ia@PEFy1}g?gQo L%¾A:~1?'ie_uDOܣEoA\|ۧ!Vgk%Z';Ok9BAG|8svi?hi_?'X[jjׁ_gjYj,! kGAG_sV~:~'ׯf7_;>˺C,uzOd|=?gܾ>vYG`aG?? k}&3/_iYb"ƶ\aa>>_>졋|;~'4_;h~^y6r/>᫷hV—Oп3[^Lz 723g9 _|v*}`brӦ'`_vwпLO{M7<3a"| | Oޟ~3c_{ 74᰷v\Z'߰ttDٽv 7$ڧZ>A}m2 } Eп!>n{ 7cڧ*'_hاӰOi' !_\~Pzn~i٧_w3!0c/XVȻ sso4:w !YRaD}{2dM A:~ s6ŋo٧_ 3*_Q2˾6ݾjgA>aܿD97}m^7|97 hn?E>aGAG6OIk}]k/| 螖r[wmn3}- NmhOE27nZko‹O&YL?]׶7Ԝ64?L1c'E7|+++RNϿQ3Z*柦}݆fJRq|T3zZ龣S3VŒ&_גɥZ_$Nb_ny!!.oL>79GǿFe\iz־ڧv73&b濰'_P׮\Z,E(?0}4]~_[rͭw,}=ͻ/<k_ݾ]="8Pf׶Wױ-_Tھ/nyɮ.p?FK_Ӈx 6Y-~mmii0°7dkKQ?ldqWՕGd/وpːo%q#߀ůݹTkw#._j;sZ͓1x\`ogs2T3T'F_PW;~R}jůEH8)E߾F^wwӻ3,2oz4Rܱ_Ms_>xfC;ZWj?Ct5_lOuoo.|:f P3yuK^zOק8 '4_9a߄[ h.Vk?U|xѧ^rydf]y)OѾ'ܗԼg5՘2iPTlxUJ52]+U )}_k| 1bDi˿uW\l;y!&_:.zR9ڷ]Y%7n(:bʿ6,ٵWunwOӼ3yq ߮iċ_9"o ^_헯|'OɾK$_psn3Po|r?/>{Kkg{>sp ]޾WJ|f} [2@>{sr4_zvgjGӾȿY3]^4X\pgP^8k3iW;P/ynτ^}B{L?ůՊimQ n3Y,~}es=_v^җ|n3MtD>}|&půپ^J4|i}}7|&ٶE0+:7-|&Oz7=|W3-4UGlE3-LW9藟gҾi3%4O&߯/{à|wgB QBR'͕y3 Zwo>L?SelzÛU٧ 7/|&%37>W)}sgk{rMitg,~/ۗױeO8_|tՊ_t|v7oɜT^ԾC:ԏ0X۫f_qծS3V}=G|P۫n3t\ĤpۿOWF}=N犸_ǑG 2O}=NJqؿ/wvuU^sLcb4vQj~S[muG霩~Mo}7ӲOiGTp? D<>iQŔ^aA=\\꽋eO4{-0_V2y$16}jQ*(_;36=q;GZcĿгĸ^^VG˿Ծ2M/p 7V騷(_GWR|k=|18MT˿_Gyэ{Z0En΍M-DپCtOw?ЯTb( :GL;EiۛO}{0v.~}K仇Lfj㻇 F^%3>ֵiw䁇+6}wrP},}c`Ա?P?m!lyckO~p-/ KU?W QZ]70VgZ?Òz706_ }WL:b׈~cM/K(X_ׅM/W*6,}1^`W_Qem*~r,}3 ʋ_Eӛ^{il+i%K_X,}YM3=lu^.\ůf ^`Wl{kyPjv8:p?!5Uى)~Vo/~Eoׯz 7[W}vW}YkEsC/V7ϿrBU5 o?8Nz*s.˴ Z_E}na>O/DrG\.D]\Ѵo*jߪ,)ՏMF?!Vw14H? __<` b'2m.WЏM3yI,?*r*-ptX:7 !pk{SWѾ`yG,2 귲яM {~#ab&8; G&-MJN? 8Moi=|{e> 8Ilomm*v8S)b+k+0j3 6'Pjѿ b (?Q{X],Oaz} sX)DN Nfx28_FzHTs B!B!B!BZtxH?M2Fo8 BZMDABLQOR(1O"TxB+WhxYIx58B! nF xFg߻ŝ ŊmqC k)pwËw8ܡË{q}6F&$y~%'LfOʁ_3D串X'Yud_!=iooO>L5+*rwH={!{z#3n,¿cņnΗJNT$שtMe[yser,vۼoү}~ӓFd>wuq8Tkotũžlw"U{ŗyro.5XTFnilQhlǝ=9D~ /_'E'CN9%r*m4t:! Bl8rf,Y!gG΁l D΅9r^| D.\rQb{rI`Rȥ E.\rEJBqd*r5!=5k!F\r} CÐÑ 7$so 9r ȭ[#An=rd #r']#"wCH+ 7r(h1c"B_C"C<y$- aG/Mp|G8([ >G!F<yx '!OF<yt3g!F<y| !/F^yrJUȫ E^9yFMț oEކyN]Ȼ EއACȇ Ev!G>|i3g!G|e+ W!_G|m;w!G~cd?";^?E~KWȯـ{ȉ?!Fw?!F?IH  YB)2CVUd YGN9rJTȁȩ EN9rFLș gEΆ99rn|a#G]cǑO D>| Ys/ _D| rUkבo D|]{ ?D~ُ)3/_"B~-;?"B+7?"B/`g]A!K22Ef !ɐ#@N 9995r#g@Έ 93rِ#@6s"B΍9/r> "B.\(r1A%K"#B.-"CA.\"r%UMՐ#@\ 6r#7@n1r͐#@n 5r#w@;"wB9b_?^sr4r_~ȱ D<yPaÑG D?6}"1~)vw4{MK[so(Ŝ=8w 体C/;$;;;a#=щ'Fll |nS{[hkw]ͽmqoSbs[.X>>B?;~Wln]%+Xl!x6dq_~;'r;Mc,GĞn,g{wۏu;[ks`I|Kb޿_mJ`};~w=)hۺ#'' Bl#ʲV\:+YA~`zd;{uⓧA#GFG#k #(wdm@:"dQAAE"<-ؒub;-"{3oo|+U;(6ڲnu5 n?a'Yn`]YYd5--Qe  74xݞؿ:d *.և`Cp;Zelb[nPXhw%B!La(I$dnn) uYRn1IԢ"~<TLa6lI,v1G j{v4t#B!B!B!yc紷C{+t7@g 13xaeTs ֆr3x -$ۈ̝`G@kP: b>|7Mdsn1t~47W@So@@]{qd[Ώ3=p!wB5~_Dz*m'aD?H~+tpKqfJRaW !B!+ط!xlq%{|BHK?8%oKb#:5X/ׇa ^lݮF/6oaAKq #.-X` a#F}Ux b#{K0:7ǾJeL 8Oo mş3jG/HŇ|[,i&~cSٔ멏P܃#ڿFO֗re[/GWuXXn`yw+,ѻa\-Pɿ5@'PfO zqڊ'k!"10S?itF800|*)oxT.-F%0*o4t#, ~'PF84p 7^'ud'_T#74 _ J`Β[(_UYSǣ>W?i"~fu$ > u{A?$,c.( ^C{ϸ%Ppy`ֿ ߠ-Yp /t@ OG%P K [‹!>W2o:1QT_x_%F D$ r 0% /;!">!Rf `o?9Ftix,0)R>uR>5k/S3xUQ#VH}3ɗrY}KTSz_R dU gdo8p205U~WT+  +!9/Jr f`81pdiC.aWߣ1$ >+rOv_9T-fKn"插'֦_w 䮠K`fmh+,Tf70.i韆ōTsDbcU]2Z * QAa9qR qMRqK`f7060qV/XcO^L?@^E%dGAm~%4pRT">Π%`^),?-%0'+h 0U3k;ÂE '`I *S1 v Xd`Δ Rp<~ TTPo3H9~'ZFɔ@Ax~ .(}U`7x"[fR?}s.T7Wi ̧O5$E0545JNhGW 8/=&a]Ac?&%0kN @i`5"&/Ԧ/0lKfI"kGA-z éYJ T?@(Gc3R?SNSbm$Do5pe qY*wEPfο-2E͋ l+9`@Qfl%,4f dTch@*Xψ K"T^a@"HD3qY A*XF?3)b X3V TgP61p~Y.5Pa R0EcL X8CSA ^j Za+?aDq#\|80D~g >o[G{a L&ڞc/=ϬōptjE0ܘTm#`іg\VϴřM 4UX0"*e,c+CXWh ?4 30ZGS_7eI 828 X/l3,a9oI./a^i)828 /C-C@ɴc!AQ , +h ̿N,;(j  Ϳli`WEp8eppu#`4cO Ͽ L>8(:lHT#\P63xTk_'a$q#\ *f𨠿epuZB >[m`~*8P07|=,C; m33M1L&gG'mޕ8J?ACFz‹N+]az[M?KL0О>өq1h Q}8&^ ˠ/7q^A?& Ȋ1fvؗI_%XP2bc׽ %P@K z1 h\F*a׽`'w n`X?@1gE@p} g]G_a$ 6A[40u(̪-ESЎ GfU  KeuROX((# lU)ر3T lU-â˦u@`gepY2P*R.KU`]gX~~B/28^@ 拠}88f ؑaa ?kmpG:.&WՏň&]"h]AMh옴p x,s`âuK@fX}aѪ ?5E8so y抠vyVK` 6+/b A&.Aw 9HbhhPtͱw$fکAӿNjA V8H2XA_H@"I;, bhfGpiyuC KilG AM70WݶËe-bHib"hM؛v6( {#9'uG cV_]7m ,Vy9'F߲7Y.V ,*nA /`g4P.K@Q}d.-:"Ux8㣂scm%nJ`77t`#.- `;3_\[1087KY/ l .- l:<&PtT*)<Ŷ ?U64=f q7LF6_5m"37aRg_@ [*b&QzE0W-hMhϿqW-)*X5Y{ز+#`EA/77 ,2ؑp6 L;؅4Ņn L4#cCEOҿ1p^bD]+?u# T^O+`j'R%5LLʠ1MKTL27š@SeЌMAhB^Cؘ0pR00* ڠhK7v+4Д„F(֪l; N E0*Z E}:'C3LBL,OIpp45?4P*85?850lM-U3L\lq[ALANNB ج??@ z"~z3L¸E[ ~@A)H|é´uEk TH|ĭ¼ ??qnԨEc響7fk Xx``Es;- h_p])a 0x\[t8"5>hZA7'xav4F[e)I/SL#)yC9~hK<ፁf4aDZo_'xb"hĈp/Hl̼j㏁Z a._|zᏁEФ Q`[$t7A1 .׸60uR;_ ҿ㑁'oxfo xez7/ H S %pa "H+HA7T4pAA7\<4pAA7dX\@7l\X8~ҿ㥁aFݲ _ ?<sJ'6?ӳKWAᧁ㡙ߨ(3p>sZ(o4ШB11fw~Tu.'&);k@S62X1N }e$yeUC٨|&F̓mL˕\tw%dlK^G'ʟ%T_\YY8BmWȮ7bmDLWK2pD}*{OF HEGm  5MtSiM.b3)pT FXof_H\J>*8 XUᅱtd]Hd,x&6T'2I HHke&*8KXY]ڈadZuX%_()T+\vrG\]+kiq-c_[*PoNeu+ߠhGX2MQ =)T mOPN'ڏ?Hc?Rc_􏔡:t:?62ڍ?!?RQX$a`A_ \YYT^n?XY%􏸄?C=4@5ңO}K7۵φ˩K5}*пR_ˢR?Gɞ bR?G)/r٥|GP#&(?G\BHkt G4@\jX^St<@տ:K=X]1I?b#>iDÿG3by?_#rzqƇa ^lD&M~!c/6‡%xfjy5fr ^lKb#'y/6Œd !YZZiI pmcIQ~ȮȼD2es';`YM~QCֲ`PY4"-Ew9r _悂KrU_.%.vw]_AXdWlGA"o$FdzL׿̗Is= ^AeT|]AŤ$Gc v(USz"lj !B!B!B!B!`9do ׵=䤽}ѭ !xtL`ҺrY<]+>b 1G層qݏ:kc:fqw>!N)_vg\`Cqߒ< G#A<y<ȓ'#OA< y: ȳg#A<y>ȋ#/A^ y9 dy%*k"C^y#&["oCGގy'.{"Cޏ| !G"ǐ#@>| 4#_@| 2א#@| 6#?@~1 Sgϑ_ D~ [w? '"D Woߑ D_!'!AG9A!K22Ef !ɐ#@N 9995r#g@Έ 93rِ#@6s"B΍9/r> "B.\(r1A%K"#B.\,r9+"WB\D\ :r ȵk#A\>rȡaȍ#7An 9r ȭ[#An=rd #r']#"wC'r/}" CE<y C"C<y$< y4#O@< y2Ӑ#@< y6#/@^y1ː#@vW"B^y-:q7"oBތy+6x;w"Bލy/>"B>|(| 8 ȧO#A>|<ȗ/#_AN@| : ȷo#A|>ȏ# ?E~KWȯ E~r"GOȟ EO_ȿ Er6czCed̐dYC֑!'GN9rr rj4i!G΀9rf,Y!gG΁l D΅9r^| D.\rQbőK DF.\ rYr!+ WD\ \ru5k!F\r} CÐÑ!7Fnrs-[!Fnr{rGNȝ G wE9rO^Ƚ G!G#EAy@Aȃ E<yHdyh1c!G<yd)S!OG<yl9s!G^yb%K!/G^ D^y Zu7 oDބy Vmۑw Dޅy^} D>|Qdq'O!^Cc`޷?5>ț]X+ĉ'nۛ;{ۛbo{On]-A[[blc6>+-|>6&^% lnlos ۻKÖ`m{{`v{r}xrgwwgokK>{;b{ؕ۴olȵmbw% oKO }5?^z +B!B!B!B!B&%|qI7{ĿIL)GfT۝ ҿqW*տBob &S $׸f"/.!ƒtUG򅏒P8B!B!B!95Tx(sޜdL<&Z?NGqRM Oňx$eR\%x>,0_e_M;fr ^lKb#-!n'7w&zD|] ,v$ #*$G5RrnP+_YܛW7I^?b졶5^cR~VFL_?bK?=IO#=)R|~y61Fv?Gz#.%rrcr59,*D+Dudj{6br*[e?b ϧ1CCp +++ƨ@#}?GJɍ8hǝX2 씹*Bbx?1){q1rMR5[\GW4@#eĢu#eG^b_4< St48#6(;LHkΰ?Rlee6XKk ̂GH D-/#-h7` [_CuAqÜjyYH T,$6>֪&#? mj4}dotMRuIZrqMR/GH%TKef_j+WEvvC'k#d.r2ԗGTWm?QZו#udg5XoAK͊a1NML_UV_xl F)<3E7z,i+xf*ѿR8e&?oPOs/psOgэP8sgRuyo=GFJt(/lw8įH <͔ZD8c$ΕxW?]q6$`1‰\7!9eE ҿQ6HV_ڽEk^Lx %xJhU??3|A*FL|'.iv3SaQ?'z ӉM3o lE?퓅W#KR|<7d\'K=Ž}廻oxh_7Leog_af7<|ohxg_67, xMyS¹i!3E>CпVa%EqA|u]bɥ~>/G|.pAŵ}++~ӄh~ؾ蟟8 cZRF?pkԼ}ھ7jI5N훚፠>Ҿha_C}}75n_}A}4ʬ}/>MN>NSnx#k\gz`zw5-}%N{&ke>+!N :KKg%Q`bygŃ ɧ9SR7k{8C2ix#u=ld gWCmw;L,@AlKxc?}g ;~f_Fgv/}B,F,^l9cϹ}5.eaQ7'uMLZ3F\7uFf R{1Bo<[ڿ F石Q.۷ ?vJL&}qnG/]:wnz;/}1e<ھPYUklcٖf9ꌘ\nGG埯QlBVuZZgkkK|VvǯJ _D<M}%M _K8/MMየnG/ UrOR' 5I'O=I}W<=X\5MWg>/&Z {MG>L%Ԝ@=Z'Ч,ҽv1adsqݗGޙ/(|-1B_#yuӟvtZ _;+mWݾYHr?9[ 4-~Mj,`͢|BuSMp/˹f-o Ւv~׸1 f7_]xEaz/#sc_nGs= 7 <(ů}"uT$L&_xӱ}Ta'_=׼ӑ.K\`Dm`_Õ>ֲ:P {gþ#}/Q}|I'_xӠ5+<Drg4/w`_#}y/7 kh8%o_/6LyNkkݭҿ96 l`_x%_ _ţ.MtdEXOue_ҧ|T+~|Ҿ]ѠOv7@Ս:^MO?O&_J_S^KoVus#_q1&,}5yڏa_x6 E@5nukd_Ѹ}KQV?*ۗ́|Ɩ5Z,WzekrgاHKF꟝)sQϡ|]F:Cۗz`[L:B>>g t_'ۧF2Y}aSAku: 1.Lm vYvO2"OՕ?+ed]"\"':rO2:?Jܓ?G}ݎwu _8Zv1ҧQլSvzF__Kvߍ @+7ۗ*}6 \w?;'_ѴioR(oqHC\ש~MO3$7_]ښХ~&o/ŒaK]?kkB7훿vO$F=K < }398<{}izR s6ŋo-&_g6?^uNk>2 D5OH%tO~=/z57 oݸ'|Ʒjzq}o=PLktTT"_g~U7ϼsO2HnU9{}}I{[E ѿ_uEwx޺'uNsWs/] 1<:!iۗ-}F{׉~wGE ͿnY;$ W;fJ *(~ uSdHuR䇜}^s[21 +~'fO =pfb#?k̗ag^QVҽ\{g\^o䑦Kߠ _@3XBl7$ϴ~%Mo^Ɇw /b>WZs=3^䇅W~57(~M oȧ{L'Zا_W"Y/ڗ\6ox(?|% gT?7%mWz YRӛm^gw)lzv泷cy/lZgx2?OվXFӘ=×罠ԯ-}zhAWL'_gйEz9 jZΞA Hk5{+;ZU+VBl}agW͈SO~|1Zyư}O{U/nm26w>׀}};c/z2Zo|F:-kekC3ߒ<.O~lhkI3}K{ G ;Wb_}#L+vAeMOo~/B}π~q+?Ai:߱WxY~N=7'`pOL2J/{7?{ncͼz0_־_#(yO{ȟhgl-~O6R?'_j4N3X}i,}K͞vui3;~e'g_峀i^fTTD4U _u:XlaĿ ({29i7/~ )̞F,b?)XZȻ )MC?99[Pf|v1_\5_[{2Mo}5WQ>ۘI@t/|zUQK~%Mod_%,}QAmIb.^|Ӷm_5PcQho>ȴ}D? *\#nj>+rOv_q[kK[|:߼79gM.-}C_͟,mywt@+lzxW޿w'Z?5vB*xwٿWR: 3jbbKտgl4Om}^Go5 l%_ y},}='PVEe{L}䟬}orefpi:]o2P>np̾[G%] oUhK_ѿb'/Ok@;[[f?[(__Կl #a䑔x_Js̥Xz/>7y$9/xؗ򏥯 eԿdR7o4O>y} oun$t  G} g 8yտdH '/~'_lr|$ / Hu;V(>7-<6?ѻxa&>\6)_x埘O/|*ix)ɿͩ> 8@|o&G7ÛC}Iɿľ]IzO:j`}"E_߬|pPx埀bVq9\]eK<o}Y,WYG{OPf ][}+RAGRYiGx_,zh>߀X]Xm3P$^#0bŬP m `b#~Lj&\6s~?ձY3z ?S04FK01o7k G\BKq #.ׇa ^lDMnl ^lDIz>lKb#hFX/OҹJ)!bGb'B!BbbDI BH`j_c;B!K xHŝwaq]mpww983;xURI*JR>?3=Iz景"}cy~$J\Oůĺ6r\řx0_E͑fD< y8_!z#dAN;&xxR4r3yͯ gJ&Gm5_s_{=qKT~ɷ/CFd]]ĕ .!߁k=[ [px8qkNZG?ǥg*%jO9rFL" Ytv9!9Ey"CΏ\ \0rŐ#@.\ 4r#W@+!WF\ru5k!F\WD6B\EnPDqc&M!7Gnrk6m!'"ߐͽrg.]!wGro>}=~ D<yPaHd#G"B<9y,rj{}<Hd)S!OGȅa}_^\.wqB9-ǟ[밖fBD<y\y /D^y ReˑW D^y Zu7 oDބy Vmۑ;w!Fރy~!F>|rq'O!F>|y /!_F|9D|M[ȷ &[o#.{w!! ?C /B~9D^?F~57"=5#O?#?CWߐG9!@_" 5`̑5d#&l#CN9#r&Y"gCΎ9'r.y"CΏ\ \0rŐ#@.\ 4r#W@N@\ 2rՐ#@\ 6r# "7Bn)r3-["Bn-r;D;"wB+r7={"B/?ȃ#A< y8ȣG#'!'#ANA<y<ȓ'#OA< y: dy&,s"Cy!"K"/C^y%*k"C^y#&["oCގ @މ y7#@>|0ǐӐ#@>| 4#_@| 2!57o"B| 7B~wC|}?DcO?E_ 1Gȏ  !B/ȿ";ϑD  ?Wȯxg=:̑5d#&l#CN9#r&Y"gCΎ9'r.y"CΏ\ \0rŐ#@.\ 4r#W@N@\ 2rѾ=ru5k!F\r}drCFȍ 7EnrKVȭ EnrGNȝ wErO^Ƚ E!G<yqqxG9'!'#ANA<y<ȓ'#OA< y: dd!:YKDŰc``_i5O[ Go(>@|t Ng8.rfADM>૟L9vxuh_]-8(ibp_hQ/^!vfggG`Y;Xؐ|ϣpcp'x5#{(n,gۏDo95}guG-#D~=zWj qL?eKzxxAlώadz!B!B!BNY9 Y̾,}{K-0ZNn6~#&^Bsf)"6B6#5o} ]"359h&Ǚ6?nˍ9hhk/~KqG‘,dP˷1/P݆q?"<ۘY`O‰l)olEk+B!2^$}@nOş,,}ux_@ AO-H¡8)Ye7 oHH7OHl0HOH\6"V'ju&~Q<00GDRJ`\_ts?r,ߦɿJ`7Ȧ!+vxdh1ѿ0XRpM'4".j sC MwXz_Ni440oտ 8V0PlFuHro@XMgi`nirpL=up SD P֤s3,~>^Vb0nv\. 4SLF?EMmGh`pö@?̿Fnl'=edXtXIۊ(= \z[d 3ƃ埨Ekf>ڷ)܉EbT)t'7D*X2%(@ XC.4/: h` +II6 JÐK e[P T yi'}_(yII,_ γ8O?r_Y\A82r,q+`5:%P.4ptzL+QxO㟦*8sņ.[\م&Gz%hYǤDN_Ic [J~J`Qiha[y'_m!I4p\zN*[ɿ.%0oi{yk,A 80'?9uhY@@AV Mϫ*mRiX_QkJ`#HFPK8E~JmpsK`b`! iP3аRo'm;(]As\WBD J>]F8/h ,`3V?k/kk{#Dh=,m8/p!Yi*XkMkX>b" ݿVڞc|&{8]2 >ѬC  )^hM1~^׾Dn/(`̿l}Qy:@aV^I8~~W˯7pk(L TD)?˨F'af{/CVQyq5#5tNcW_uu#1=!Sf o-2}a+u#Wijd- 3by " t-phy(8zo (NWWVm#W)1J8~^Չ4;hYcpR?} S  Nt/g8Ϸt6Љ$'< ퟶNGf`M hH[Zo}[ 7CJ`n`93P?G?,$ܚ+_E6B֏ѓ^ozW?qHz_M#x!Z //Xv >I} A?lo%7}㟶;Z1P/89+㟮#t_3~D#1P;BoKX!g:X`RW*_c>RG:~ͷZr{믄埦4@xN t`]]hQF&/?v65v;-ěZ?!hѽyno}I3;2]hi$7+_@S)rii<\5r:]˨Dv܂ˆlңBt~,vHNIAǗZ ED7?8em tsH))b&s$I_K ?d<0mF<+cR&0ϯݩzvR;[3yKRU7c &e5#\{h5|`]륂 Etml@)Imz+UDG~EB-)zUTݔ!Tdz_=4k]4x_{ tiMha)S-*K`} (f}7@ c#[pi^9=mQ 4`L+Jʥ%CX]@|J ?lSj`Y^bN/XZump"W [G k/mʕ*L [^az@ i` Z 5gX \XZ P. `).XXA 3@េo ^ GV(10VP7 $пb`&7s vdxd:j` S̸#ㅁoTڴҿ{t6ol r6U3fD&pOn_&]dFV4g b/ L{i 4^&=PMB잿   ,:  LA75^(32L㻁Ei?@M ?/{n`EAW?O࿁;(H<"+ Z9Ĉ1XIAF @`F}te*? +A)Ǝ@xZtedti4?4u&h 6fhU3]>/ }g ~L78H|'0WQ<6+Xq<,);H 4\F8Mp6NwsgA6M:[ю lV0o%ؼ+!X D0G#< yj @/LB5 ` TZlĈ?mZlLs=U \:;sZ+b@roI@.a˃cg C#TƑҘ>"3HRT44P<:vnп\Mk`1pΨ_ֹ OJ;~5̆-_s붹AgWdKpvmhg8t58IR IG@y[4?ZdyfQ?0?XYFRSпro@ 4ci㹁=h8?jm /A~Q; TC8A԰ոaNR훥:ȗkVѰYvm^RYXiUqul hgCi!)^q:t`a5] ߭6M<(]:fb_4/FjeA<#iԄa+ 9 $[E}c&sco[Ua ߊ2O~c\2 }Krba`2E'RjZaZیhZDZBସWM\cֿ6Eoy`Y?&; G#\#xK-C*U2-PF)Ջ $?ܲS6F3mm-mpQ;,}/g>oƗc4ln ˪*=UZ˛h.Ē7y_TFG{㯍c;H4+Y 4LzNAG ?4S.Xse,ދ/hnAHof3"HHo]Dc #u'n'1ϯt7:[+u8v_H(fWHO/au_:m/$[ge\vS@ (4뵨pfh:S8^_xBdE0rψBSrLtb27pߙz7,w,ilanWz0Hl4Ȉґ}/Gxe1j= gýHH #?RGupÚCG0tnz+abѣkF1:z?(ֿf ?RG2D C٨sӿp!##?2sG){@hȽDcڈKWCI5_Rm /\%HF1D@Z~RZR}~8A#.?2%L #q0z#d4LI`^dn6.eq6ԥF]qI ?₞#>ciDǿGTn0;0؇a ^l?aɷ"c ^lD%GZ ^lD_4b#2J.P\-uőzn2Bz;)~K /WqT !B!B!B!^!7dSJvr{jG:^@e3>r>-Ba]b}]uE=GeI~Z5-ٯQO햍4F/_ܘWx__e쟦5?|QZ Ի'ƩKJ~~Aٜ+$/|Ch6 R(RI .ڳ4ZW7ٮ#ri!B!B!B!B!a\bvtT7umop[=a룣ҏQj1⸲`|[hY|?ww/ӋyN9'=ԝzҩ';Sv|vN|N})gvwG.ek~15K|L<y\y /D^y ReˑW D^y Zu7 oDބy Vmۑ;w!Fރy~!F>|rq'O!F>|y /!_F|9D|M[ȷ &[o#.{w!! ?C /B~91䯑A;"#O?#?CWߐG9!@_" 5}438d! d@6-d9rz 3!gFG΂9rv9s!F΃9r~Bȅ E.\rIRȥ E.\rrEJȕ WE\rMZȵ E\Enrc&M!7Gnrk6m!'"Grg.]!wGro>}=~ D<yPaÑG D<9 9y r XTq' OD<y Tiӑg 3g!F<y| !/F^yr+W!F^yz 7!oFނyvyN]Ȼ EއACȇ E>|ISȧ E>|EKȗ _E!_G|m;o  ]{#!G#)}ϐ?GK䯐 ?D!?B~koE{? ϐA7ߑ@~'_/F_!B~Ļ؅!!sd Y l!#g@Έ 93r"B>|(14'O"B>|,9/"_B|*r| : ȷo%Cqbc3~A#sxt#ww8bopo_ݣ."hqGXON;=;8 ro;x^2ؤ;ڱ.x ?Xk;<:zE_싣?9`g`h ىֶm>3ϣwtp/?-WeC!B!B!B!B!C±Ʉp2%L~"SW(:"p;?QGFf^5oŘ7ʈl?T:Hs6|M81z+TV{ʒHmϕ elCƪA:zLZ,0_F؜A>7rFG|Q;/ӣܬաc7D´A!_:xq1Z3ibbt0ϾQ:ۧkru8v_H??қ:iB>wr?қh/}DE]lbn]b)u2 lAm$4h\A<ܿ[Zj#&dW1K#4s ac7GLtYR6W*m6_1f5vY -jC˛J?bKcqHHZ^m2SjGjÛ=~v6|[e>gn&8,1 UJ|C KHQJ_ #% f#%t-rmk} CslF4lAy8&69ܔY,_uV&iMn V^F'Bmz;se*_~MΆReo~S+^sUSշUW)7m?t/(3vZXRk_MoWAi4m?SFl>2(;+踁otƼAFsr}oq4^vm7=ӊVՍfrҫg[A {F5ۢG'`BvՐ6Uۼп6?(u1(jd̆z[Wms ǼTdJW-}݋pxF,>| &**|)<Wƽ Aا|2SKmK^}|܋>}e.MO^OaKS}g݋}E.]7%>ۗ7LK{}|A&a}|Mg/|)o| ѧ܋㳑}|cFn?DYR&p/\jd7{oT/zb—B$=¿d)݋??ѿ?}kпQo'N uycW 7[鋡]nzDҭ?xa_"ѿaľ湰& - %W8< )P ƼIC@鋡C0}i[__!p5ͺxoN>7P鋉~Ug5þ˻`zJWcV* K?۾ܻ+f:kn5H?j*^`oynU;sVzw~>x &6*-}Mto5'ӿ<`|oO=LVjmOV{ľSJu/mYxɵ[xUbiDǣe/ol'BК/;} //`kX[dd_I /y ǿ-FOelB7zтFoRjm!P7b+QT~_[[fb7x)ߕԿъ_i>WuKҚyjߺ⥴U 6ɎzG)~Ub K:ٳ2:ݾu1x)H?^Hv`Uw] 7<0#?aϼsm_ooksH~;x+?2@F#߫i&pkoV?l0NP>jcCoc<|k¾̓ #VO; [-=&FU^S_thϥ/_F|u1]> Hn|kg?]-2Xkٙ}'_U-el_8 ѳnE_bn_H ѱXۿBh~^ rz~[IS O>/6ZLߖLG R>oet&*_ 7}'l nGݿ◨Z6Ǐ9*}'L+TC4&G0s؆mmoσRaK3,lri:g`mgDѿڧ{tPWh'?2SoS\-kޟn%_E;'_ՎQ^> ?ۗW:0nZ\k:+%liHrV_ygE>fϙzG.g?\Z8\`(7v9+_QeozLw$N2n@esm_s-=%V7Ywaa_uojv= tu7_bVȿꔁswcz\<ֳ2if Oe0~X4uZb*¼eS_ TZ܊>__XhFf_uY;{޹eM>]ً߷.M.y{LF@ ѯG>u8}\z4']wI'gqvex6.YvtMo>jS{hǯ~CG男<\fturٍ|/gL]?}_ξlJڴ䟾orOju -kzwRտ̋Nӭ7B)\N2x)n|KlJh]W&pomS7n\B0s/3x}7E\:j__'m%tEC }ӏrWl~?[zu;gy^ԡV/eo3" 9gD)?W6dn] 3;(n5߬1@@CI^}FOI/Oؿn%o6=ݒ _v(~G|{ }elOY?4gbQո# B(fGհ)3@k&۾{ c mmpw>jb_s/fDW:IH6)"ϱ[+j/PbT>:6ݓ oŌ&`?f'Rg9`U@} l54l{;{1c K4܌~|8zF/gmfԴWvmW6vq/f0Ng1[O3y^\jFX2?jWtOm,bVbt/f6߫uZlаV~}=v3;?Ve_d;~EK[rbл1-pK[娷hpޣkYpjӯnzcޣ~\.*W/;2 ,՝iM/ >{ 'ֶW$ʣכ+$€z_Rk[}G*_p.&U2oL%o~uۘed(}O_!#V $Rg_>~ٕ6ʗ3A.u.|*[moE3\0ĉK~&)_ԾK럙U<|80lҶJ}z_W'`j᦭. ٿmovQ0ߖ~ꗵT@k0)tѯi딯. տvVuP8<n~YgK_/ ٻoͲQ޸04 Q_v‘~WP=T?Elǻ6n ?i߷Vr۫|޽Kq"½~͇ݻly]B_ vַv ?E|{wPOV~ۯm'/{0wj䭯K'X T y~>7 Vvs<_rAF+_9ŏה◞g}+tÐ[_a~b}S@'Q }SmoQhЅG*ֈئ}SK@3ׯ4+~ŵ]7.]lqLP"u{~'GƦGt\ԯ,SfہGRiߴt}¿NUo":trF(=*J&7"Imo\.}o:: 縋_-+)JY&^&1@IҨUoj: hOh{Qhot'$CHt,wr>/ O)Gq\(3#bsOxI`yMl#ʿ'b!v& WF:E2s^f_\nc#O  O܎x׸ _Ih/<盃]@Sۖ}*IA˦:y ~qKmʓgѾ h9~Yc뷶}(gev~Ŏ^zоh/Ef2x_X4i.67H^ʧxɋ_ Z}o;ղ˯obH[/ /*l=O37BPm}=RDGEˍl_GD'oI-TzlD#O;+mo >'Nrӟc κԟpQSRk| 0)~)lB=}h`Pzߢx,!! BY۱ B@Kg_ \@xIǏp(d"AXua h_i&k[_wҽE0-?S-h?d/h\z{= D}s蟈sӽ'OV!Aӌ_N`3;֬BZP[{i3W4_rAAu@Nǿngz/}s ?6A^2E"z '"2|1i3~r|Cܜ >'w!a'0flˆOoji[uߜgF=0T(-l 6bhV {YK6Ʃ#& _G)dJG)dJG)dJG)dJG)dJG)dJB>,?l ^luhyKb#|XAVv ^l$`p %d\xB!B!3쏆O[.cj)_{F7/%$oj)FMK.t {y_X㔶aK 8ݵKB:~a%d8r#l u_\^l7I0^l~%)XUY|?z(^jQ!B!B!B!hOd:?2 L  BQҾŇ qE?v{+ģ|=zDAHWixY̤5zB!7?m8 x`4EP(b X0&R],)"vU{g2;/ٙ-7\p6?sFb!tȺB+|{d2qnCEd 99yDIȄhu]錇4,'h)&os/m_5&+{{\y{+;6 gsę_1xӉ šhzH7Nlǥ&vhk?A8{c`8A8R|ISȧ1ˑ#W _@| 2א#W"W!@| 6#?@~1jxKWȯ N;?""B+7?"B/?Wtd2#CdYDMM !#[ ["7Dn rSdkf6͑[ DEn,#FCGnr{;!;#wFvAvErwdO={!FB {# "ECy?@Aȃ EAE<yHQȣ #G EV!G"G!G# "GCG<yrr"9 9999 9y2 Ӑ#@g!F<y| !/F^9yr+W!"!F^yz 7!oF֐ oEކyNB]Ȼ Eއrr1r r)ACȇ !E>|ISȧ1ˑ#W _@| 2א#W"W!@| 6#?@~1jgϑk_ D~ [w? DE Woߑ D_!!#3Cyd, 1 )rd3dsd dKȍ#[!7Anl 9r ȶȭevm";"CvBn#r'dg.Ȯ]ݐ";ݐ#{"@ 7rd/r?"B<y(rr(00#G"B<99y,<99 99f7>=wr"9 9999 9y2 Ӑ#@yxd80>k8V8GMsGlm>nu?q_ښ8]h \Z1^q/2n/q!&UOZۑ{Ⱥ2]wa*2\4+X]UgS5,ellu"xvdG֮ ~]qU1q'\wx5܆܈ILц bd ,֖o4G+NwL]q&ɚv=ўml|2 BƩ*NUvjnXtgk ȭ3wszǁ{\4/.L fµ#GƩ)j󷍿GN8w7Nmqjwo) #VwqS[BNe,gů,n\moGMĆ #m8ƭ,c`GȭNmqjĭ#iX6V-,4fK!B ix?1.:SCO= Dy‹B,.9,VrjlS6lKJ~K\sϚٔ tRpk}N ]_+lؖU5-aj-Mwdk_ҋ`HCݒ'ܜ+-Epn[XZX@RQEr)-,|¹ ,PgԏȴɓjNyAۿVJ$ >wN?Eܿ I0X깓 z I:yR܉j {Z/i9yR܉Arޘ,:%M;iK1p )\DT4Y  թ% KMhhS<sV-YL.`g X Cb*(1bf71g\/ #"%|"#`@-Oly*#|ՂB} b:{|R2/9sE;+`@.%'N{ɁwꟘzt {Xi\c\Ve 2ԈG*h-z^?T@)n_zk.:kwfd ;8$v_tzudXVRRŰouR-$d3O_oCŰgO>YZ_45fJ%ȹM(*IΨwv c 'X;P,fWh?v&gXjOc ԜJ|Mn |M?.N|}?@}? @?]Q@ݰ?a,zaP',}FK>Kc VG;nwvQN샻 + >_7}pпu_ 6O}pпU_6q(`{п(`kп$KKK}pпt(`0b]ʷ[k 8j6S.fGX4?@~xas(rg}^,ߩ? 8l t! Zk~xa(1"qĿ5io`NlMᅍB B% _q(z_ (r_*}J_y(:_(2_UU*U} _u(`}_ (`m_ׅՃփՄւՅ}p_}(`u(`e WV)V}p:(`yB(`iJ)}pz(`q_Pп&`\ !(`!_S.BJ?1&مE3b#]OEO˃5?0BrIمypAمU@ пV)>0)Z i^CpEȯ$' 3 H̢o}03~ HW%H&韑韩C@g,@@g2 H>?1[@gaW0"8k҇п1L@5M/f_˘%#<ǦIIҿ0VcĴu>-}zA:1phF%Teo[?1E_QE-t PT0; 7; 5RА^XgѿvztP4HAH я=3A@Gҿ>. 9 H}0?: H,@H@[* M`g Z HAGEh?N@g H,C>YV?Щ?G@g%HD>ي?kB@g/:fYM%YN?V@g=tYR@GD}0#. HG7%.dJ?2>0m HD?"nLH6$F?>$DZ*ЊцBLH HH2sͿt#' Or}׷5R:QJoE:KM2?]Y3 ߒCV5OO$7|0Ȯ_~(ng)v~NZ#E *Gt!)?%&Ѣj31 z?IϻT``VyE"蟁LM_ahF' XшXJDzZ#V5":♝]пXF٠`RrzR1:ыA/Km"sCWXZc:Ɨ:Q/~oA%`_nTlHWe#{Uc ͍? '3n_SUQśr#sQ .5]CnHQH͆C66yì8%Gg?R(CGGPl#) #$DV*Tڄ=Ҫ50k%<26~ii)}Bk&UW B!4Gؿ0d!yp Kb`#~}0#-0:C_*pXfB N?G??'wyGʒvz /ctnѤ5R(wB=@0E1ruDU32zQȿH71˿#P_B;CnHa1*~鏌GI'sҥ H_RC6(rtG( #3鋽AoڶF~ٳA|kcA蟁H!y_c^dGH;?%pҏDY~^d-D E-TW~Cqjo@e7Z-$ÿ!#B=O bO5b~gJІYŴu_t2'vHN[M%B!B!B!B!yddх}m\?LN] XuVp[^Ǖ[_o)O]i}iOYm]>N?Cܻ{Ŧ[vM}KNNiiY?y\y /DF^y ReˑW D^y Zu7 #oDބYC.@ނyv; w!Fރy~E%ȥ!F>\|q'O!Fg"C.G>\|"%W"_C\\|&-w"C!#O"!?GA~k7o!Gg/_!Go?!\\E]Y!Y@%d#dcddSfȖ !7FBn rs-m[!ȭ ; EvDnrGNȝ]] !wEvG@rO^Ƚ +>Ⱦ}!G<y`@ `!CCC!!G<yh1cUqȑQ1ȱ' ODGNBNFNANENCNG<9y*43g"g"g!#Yȳ E<yBlEȋ /EA^yJUȹyȫ E^yr>FMț5-[!oGށyn={!G>\\\\|a#eG!G>|id|,9r/"_B|*5ȕU7o"B|.="?B~)s/_!F~{k?!Fw?!Fu{،CC!,"KF&Ȧ ͐͑--"7Bnl)5r3d-[""B[#!#Av@n =rȝ;# "wAvC ;'rȽ{#{!AV}}"!C<y ȁAC" "CC<y$(cÑ#"#cc#!#O@< 99Y<y rTiӑg DDBFȳg#A<y>ȋ#/A^ y9 ȫsW#A^y=|ț7#k["oCގy'r!.{"Cޏ| !Gː"C>|$) Ys+ uܗ\UQښs1%kX^Ob6Vd4U1xu$Fbe2eu4Z+`M-F#lnFh2W3We/:O+ˣe\`֮0^FhKH`K ZO&aщn\&Εц kJFZB!B!B!XN #9!hz j]}?G%w@BB(S0r,zfE)ޖtܭHK-v+j?7eö-鍪[S-MwKmi[ڵF.$tj eonUHU% EtC:<䍷cQ "oCGj!'O?8ﺔtKZL7?R #CH?%dRo|kY蟁Z0/2$z3$7ڏ~kD 2{d?RћԤI] .pGH?({khHaWTaꆊmGOS !8ZN]j>6xd0K?Go:$M\0CnHaI| Ŭe?Ro0GQE>&H\M7hQ%7{TrQIK(}e?:02]xf{ek%r]}M~j3{EkayA%t4`6--!on50aG9'!/#/搗(Tۄ=Ҫ5ewDNŠ5wm%gk$em>c#r-քiMIϠI/Lo£8yrK-/n5RKνI!-|腛RM>*سZkq"6O; $o!wQ79j '] e2%¯TRVj4761ok>  5Kڪg<"-TnL"6:\*?7Lo_#-vIAo5͞䑱`(OsJd<r[ix]FjӴ~ Ѽ}҆~$B@HGH-?AHGH$B{}#GL?ݾׁ)GȌħׁNĥ'q>GD?Y@lKtN^g3]Gl'h`-C@D蟝h]^gGC'me 6Y@A?E ^gzG,AW h:п}h\=ZGѿ^w@_{_O:#jOw F3zF6Cw* *]Ŀ% O7qfJꩉj_{:‡zY!>NIk$0k쫈e y=TqBŭlLOVA,8/{_0>+ӏ^L3ȾׁS\:?1>gOkznӛG4}CпX`_0j52 + e^%WUW`_l{8WqUү_ZĦ!r`}O/ӏ/a[m>ο胕q&:XԾBN@ӿDl-~/:`}<6GX:T5"\稽_1"%<-b ^Bz(u1"u/Za7]Zq3+dCCܩxŬNUk{,i/K}K#2 &\LhG5#Yy!W鍵[!ϧssa;_ڇ֡~!eJpK>i?j1k^Czyk@}o"h_2_e]Q_ M/ 2}_U/bo[eRdzt:CA_{54p Ii E A A5ޢп}~ša[W We }~`[W W U }~աua[WW WWWu5}ա~Ua߫WڧW W}ʠ~ea߫WڧWW%}ʡš~Ea _ FQcDGx"~3EqyͮkmZ ˆoXP"4?~`(}nzg8)\̴>NIklO͢\*im%lEUk?C _ _2ԯ_{ۂ%@Zš~Am `k AZMa/u~@\vs}]AǾK~b{;nh_Xc߫GtVXRh&c߫G4>N^?ڧvGt& #b -m?~˟?BP_ߐ!1}?ڧ9O{ӟg}AO}Qů3_?.?a ?gOܜ+i_kdqo?o9,l'qRbo1Xj[kAT1pIuvdh_ 6!|kp [K+LJKsRE?1+uQԶWT-DQl2)RwB;;rq7?ST/h^RWڿ'0n'ն{g~=l٣42]KzOVUӯ]QhD$Բ-OQbDTKK/Wj@SWO5%>*cGaaeesuO,V[bZy`]t./MzGyMt*} 0Ŀa!8jcC;-b^+*uŋ(^7Iΐg]yϷlob^ nQ5c9wܿVK<ЫeJ T@oڲ/qQenQ2󮈂0v}kܾ\[B_P?ɞ%:yv6h'|_٪-S%j0J29gw:ھDFJ0J׼e(n~)z0j(ݶ1P:CJ z\F0X?#:kP:C0+2j0L^WwldZW/èpP:CSn^ ZeϡU2Cj-w͇+9&ſz!訇:Jh_;/M?Π(Dj ; ɿb慴J_qG=o9y ՎկI4}!'I9޿Ef]n"F|YJwӝQm2ܩ{{ՒEױMN: ߢOuװ$W.ֽGo \{ 7e)D%a[;޴ * hS<Ϙ݋rt_DWp _xaKK1yg--%]Ɵ[.r߰s{i][Li5AyrYå[Կ˵bXoqZJ韾-w_X4߿HcV7uDSO/pӑFl9eIHdձrwI.4Y iҰYy.q a,dp_fk6욿 %mD~i[S7Rdjf۪CJ+VmK@o-%寁_2E5V[sjRrE(54Abj^?%6݄#5@>e=Զi_0,R-Z[SYC zʎ4VC5`z6 mۖPr[B!B!B!N/i"GG:$dv!֦"#-"wKUjx'?Q"!e "}HYI_a8{ Zt!BUrr  3Cŷ)<. %10Qdܪ8 G;p<+#C`>sDKSVKXMORQTnW [ jDQz_c0_yףg İkF>QU$M KrX ]mvOh+'0d hp  ( 4 @LTNo Slide Title Nir ShavittCC:\Program Files\Microsoft Office\Templates\Blank Presentation.potshanirr1071rrMicrosoft PowerPointoso@Ui@E;@0vӯGg  6  x-- @ !x--'@Times New Roman-. '2 eeTransactional Locking    ."Systempi-@"Arial-. 33 2 Nir.-@"Arial-. 332 Shavit .-@"Arial-. 33%2 Tel Aviv University       .-@"Arial-. 3362 `(Joint work with Dave Dice and         .-@"Arial-. 33 2 Ori.-@"Arial-. 332 Shalev  .-@"Arial-. 33 2 ().-՜.+,0    .On-screen Showntheory of computationt?J'{ -Times New RomanArialCourier WingdingsBlank Presentation$ Microsoft Photo Editor 3.0Transactional LockingConcurrent Programming A FIFO QueueA Concurrent FIFO QueueFine Grain LocksLock-Free (JSR-166) %Transactional Memory [HerlihyMoss93]Transactional Memory%Transactional Memory [Herlihy-Moss]TM: How Does It Work Hardware TM [Herlihy-Moss]Software Transactional MemoryThe Brief History of STMAs Good As Fine GrainedPremise of Lock-based STMsTransactional LockingLocking STM Design Choices#Encounter Order Locking (Undo Log)!Commit Time Locking (Write Buff)Why COM and not ENC?COM vs. ENC High LoadCOM vs. ENC Low LoadCOM: Works with Malloc/FreeENC: Fails with Malloc/FreeProblem: Application Safety Solution: TL2s Version Clock#Version Clock: Read-Only COM Trans!Version Clock: Writing COM TransVersion Clock ImplementationPerformance Benchmarks!Uncontended Large Red-Black TreeUncontended Small RB-TreeContended Small RB-TreeSpeedup: Normalized ThroughputOverhead Overhead Overhead2 On Sun T2000 (Niagara): maybe a long way to go Conclusions What Next? Thank You  Fonts UsedDesign TemplateEmbedded OLE Servers Slide Titles'_$shanirshanir  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmopqrstuwxyz{|}Root EntrydO)Pictures4Current User~SummaryInformation(nPowerPoint Document(DocumentSummaryInformation8v