PNG  IHDRQgAMA a cHRMz&u0`:pQ<bKGDgmIDATxwUﹻ& ^CX(J I@ "% (** BX +*i"]j(IH{~R)[~>h{}gy)I$Ij .I$I$ʊy@}x.: $I$Ii}VZPC)I$IF ^0ʐJ$I$Q^}{"r=OzI$gRZeC.IOvH eKX $IMpxsk.쒷/&r[޳<v| .I~)@$updYRa$I |M.e JaֶpSYR6j>h%IRز if&uJ)M$I vLi=H;7UJ,],X$I1AҒJ$ XY XzI@GNҥRT)E@;]K*Mw;#5_wOn~\ DC&$(A5 RRFkvIR}l!RytRl;~^ǷJj اy뷦BZJr&ӥ8Pjw~vnv X^(I;4R=P[3]J,]ȏ~:3?[ a&e)`e*P[4]T=Cq6R[ ~ޤrXR Հg(t_HZ-Hg M$ãmL5R uk*`%C-E6/%[t X.{8P9Z.vkXŐKjgKZHg(aK9ڦmKjѺm_ \#$5,)-  61eJ,5m| r'= &ڡd%-]J on Xm|{ RҞe $eڧY XYrԮ-a7RK6h>n$5AVڴi*ֆK)mѦtmr1p| q:흺,)Oi*ֺK)ܬ֦K-5r3>0ԔHjJئEZj,%re~/z%jVMڸmrt)3]J,T K֦OvԒgii*bKiNO~%PW0=dii2tJ9Jݕ{7"I P9JKTbu,%r"6RKU}Ij2HKZXJ,妝 XYrP ެ24c%i^IK|.H,%rb:XRl1X4Pe/`x&P8Pj28Mzsx2r\zRPz4J}yP[g=L) .Q[6RjWgp FIH*-`IMRaK9TXcq*I y[jE>cw%gLRԕiFCj-ďa`#e~I j,%r,)?[gp FI˨mnWX#>mʔ XA DZf9,nKҲzIZXJ,L#kiPz4JZF,I,`61%2s $,VOϚ2/UFJfy7K> X+6 STXIeJILzMfKm LRaK9%|4p9LwJI!`NsiazĔ)%- XMq>pk$-$Q2x#N ؎-QR}ᶦHZډ)J,l#i@yn3LN`;nڔ XuX5pF)m|^0(>BHF9(cզEerJI rg7 4I@z0\JIi䵙RR0s;$s6eJ,`n 䂦0a)S)A 1eJ,堌#635RIgpNHuTH_SԕqVe ` &S)>p;S$魁eKIuX`I4춒o}`m$1":PI<[v9^\pTJjriRŭ P{#{R2,`)e-`mgj~1ϣLKam7&U\j/3mJ,`F;M'䱀 .KR#)yhTq;pcK9(q!w?uRR,n.yw*UXj#\]ɱ(qv2=RqfB#iJmmL<]Y͙#$5 uTU7ӦXR+q,`I}qL'`6Kͷ6r,]0S$- [RKR3oiRE|nӦXR.(i:LDLTJjY%o:)6rxzҒqTJjh㞦I.$YR.ʼnGZ\ֿf:%55 I˼!6dKxm4E"mG_ s? .e*?LRfK9%q#uh$)i3ULRfK9yxm܌bj84$i1U^@Wbm4uJ,ҪA>_Ij?1v32[gLRD96oTaR׿N7%L2 NT,`)7&ƝL*꽙yp_$M2#AS,`)7$rkTA29_Iye"|/0t)$n XT2`YJ;6Jx".e<`$) PI$5V4]29SRI>~=@j]lp2`K9Jaai^" Ԋ29ORI%:XV5]JmN9]H;1UC39NI%Xe78t)a;Oi Ҙ>Xt"~G>_mn:%|~ޅ_+]$o)@ǀ{hgN;IK6G&rp)T2i୦KJuv*T=TOSV>(~D>dm,I*Ɛ:R#ۙNI%D>G.n$o;+#RR!.eU˽TRI28t)1LWϚ>IJa3oFbu&:tJ*(F7y0ZR ^p'Ii L24x| XRI%ۄ>S1]Jy[zL$adB7.eh4%%누>WETf+3IR:I3Xה)3אOۦSRO'ٺ)S}"qOr[B7ϙ.edG)^ETR"RtRݜh0}LFVӦDB^k_JDj\=LS(Iv─aTeZ%eUAM-0;~˃@i|l @S4y72>sX-vA}ϛBI!ݎߨWl*)3{'Y|iSlEڻ(5KtSI$Uv02,~ԩ~x;P4ցCrO%tyn425:KMlD ^4JRxSهF_}شJTS6uj+ﷸk$eZO%G*^V2u3EMj3k%)okI]dT)URKDS 7~m@TJR~荪fT"֛L \sM -0T KfJz+nإKr L&j()[E&I ߴ>e FW_kJR|!O:5/2跌3T-'|zX ryp0JS ~^F>-2< `*%ZFP)bSn"L :)+pʷf(pO3TMW$~>@~ū:TAIsV1}S2<%ޟM?@iT ,Eūoz%i~g|`wS(]oȤ8)$ ntu`өe`6yPl IzMI{ʣzʨ )IZ2= ld:5+請M$-ї;U>_gsY$ÁN5WzWfIZ)-yuXIfp~S*IZdt;t>KūKR|$#LcԀ+2\;kJ`]YǔM1B)UbG"IRߊ<xܾӔJ0Z='Y嵤 Leveg)$znV-º^3Ւof#0Tfk^Zs[*I꯳3{)ˬW4Ւ4 OdpbZRS|*I 55#"&-IvT&/윚Ye:i$ 9{LkuRe[I~_\ؠ%>GL$iY8 9ܕ"S`kS.IlC;Ҏ4x&>u_0JLr<J2(^$5L s=MgV ~,Iju> 7r2)^=G$1:3G< `J3~&IR% 6Tx/rIj3O< ʔ&#f_yXJiގNSz; Tx(i8%#4 ~AS+IjerIUrIj362v885+IjAhK__5X%nV%Iͳ-y|7XV2v4fzo_68"S/I-qbf; LkF)KSM$ Ms>K WNV}^`-큧32ŒVؙGdu,^^m%6~Nn&͓3ŒVZMsRpfEW%IwdǀLm[7W&bIRL@Q|)* i ImsIMmKmyV`i$G+R 0tV'!V)֏28vU7͒vHꦼtxꗞT ;S}7Mf+fIRHNZUkUx5SAJㄌ9MqμAIRi|j5)o*^'<$TwI1hEU^c_j?Е$%d`z cyf,XO IJnTgA UXRD }{H}^S,P5V2\Xx`pZ|Yk:$e ~ @nWL.j+ϝYb퇪bZ BVu)u/IJ_ 1[p.p60bC >|X91P:N\!5qUB}5a5ja `ubcVxYt1N0Zzl4]7­gKj]?4ϻ *[bg$)+À*x쳀ogO$~,5 زUS9 lq3+5mgw@np1sso Ӻ=|N6 /g(Wv7U;zωM=wk,0uTg_`_P`uz?2yI!b`kĸSo+Qx%!\οe|އԁKS-s6pu_(ֿ$i++T8=eY; צP+phxWQv*|p1. ά. XRkIQYP,drZ | B%wP|S5`~́@i޾ E;Չaw{o'Q?%iL{u D?N1BD!owPHReFZ* k_-~{E9b-~P`fE{AܶBJAFO wx6Rox5 K5=WwehS8 (JClJ~ p+Fi;ŗo+:bD#g(C"wA^ r.F8L;dzdIHUX݆ϞXg )IFqem%I4dj&ppT{'{HOx( Rk6^C٫O.)3:s(۳(Z?~ٻ89zmT"PLtw䥈5&b<8GZ-Y&K?e8,`I6e(֍xb83 `rzXj)F=l($Ij 2*(F?h(/9ik:I`m#p3MgLaKjc/U#n5S# m(^)=y=đx8ŬI[U]~SцA4p$-F i(R,7Cx;X=cI>{Km\ o(Tv2vx2qiiDJN,Ҏ!1f 5quBj1!8 rDFd(!WQl,gSkL1Bxg''՞^ǘ;pQ P(c_ IRujg(Wz bs#P­rz> k c&nB=q+ؔXn#r5)co*Ũ+G?7< |PQӣ'G`uOd>%Mctz# Ԫڞ&7CaQ~N'-P.W`Oedp03C!IZcIAMPUۀ5J<\u~+{9(FbbyAeBhOSܳ1 bÈT#ŠyDžs,`5}DC-`̞%r&ڙa87QWWp6e7 Rϫ/oY ꇅ Nܶըtc!LA T7V4Jsū I-0Pxz7QNF_iZgúWkG83 0eWr9 X]㾮݁#Jˢ C}0=3ݱtBi]_ &{{[/o[~ \q鯜00٩|cD3=4B_b RYb$óBRsf&lLX#M*C_L܄:gx)WΘsGSbuL rF$9';\4Ɍq'n[%p.Q`u hNb`eCQyQ|l_C>Lb꟟3hSb #xNxSs^ 88|Mz)}:](vbۢamŖ࿥ 0)Q7@0=?^k(*J}3ibkFn HjB׻NO z x}7p 0tfDX.lwgȔhԾŲ }6g E |LkLZteu+=q\Iv0쮑)QٵpH8/2?Σo>Jvppho~f>%bMM}\//":PTc(v9v!gոQ )UfVG+! 35{=x\2+ki,y$~A1iC6#)vC5^>+gǵ@1Hy٪7u;p psϰu/S <aʸGu'tD1ԝI<pg|6j'p:tպhX{o(7v],*}6a_ wXRk,O]Lܳ~Vo45rp"N5k;m{rZbΦ${#)`(Ŵg,;j%6j.pyYT?}-kBDc3qA`NWQū20/^AZW%NQ MI.X#P#,^Ebc&?XR tAV|Y.1!؅⨉ccww>ivl(JT~ u`ٵDm q)+Ri x/x8cyFO!/*!/&,7<.N,YDŽ&ܑQF1Bz)FPʛ?5d 6`kQձ λc؎%582Y&nD_$Je4>a?! ͨ|ȎWZSsv8 j(I&yj Jb5m?HWp=g}G3#|I,5v珿] H~R3@B[☉9Ox~oMy=J;xUVoj bUsl_35t-(ՃɼRB7U!qc+x4H_Qo֮$[GO<4`&č\GOc[.[*Af%mG/ ňM/r W/Nw~B1U3J?P&Y )`ѓZ1p]^l“W#)lWZilUQu`-m|xĐ,_ƪ|9i:_{*(3Gѧ}UoD+>m_?VPۅ15&}2|/pIOʵ> GZ9cmíتmnz)yߐbD >e}:) r|@R5qVSA10C%E_'^8cR7O;6[eKePGϦX7jb}OTGO^jn*媓7nGMC t,k31Rb (vyܴʭ!iTh8~ZYZp(qsRL ?b}cŨʊGO^!rPJO15MJ[c&~Z`"ѓޔH1C&^|Ш|rʼ,AwĴ?b5)tLU)F| &g٣O]oqSUjy(x<Ϳ3 .FSkoYg2 \_#wj{u'rQ>o;%n|F*O_L"e9umDds?.fuuQbIWz |4\0 sb;OvxOSs; G%T4gFRurj(֍ڑb uԖKDu1MK{1^ q; C=6\8FR艇!%\YÔU| 88m)֓NcLve C6z;o&X x59:q61Z(T7>C?gcļxѐ Z oo-08jہ x,`' ҔOcRlf~`jj".Nv+sM_]Zk g( UOPyεx%pUh2(@il0ݽQXxppx-NS( WO+轾 nFߢ3M<;z)FBZjciu/QoF 7R¥ ZFLF~#ȣߨ^<쩡ݛкvџ))ME>ώx4m#!-m!L;vv#~Y[đKmx9.[,UFS CVkZ +ߟrY٧IZd/ioi$%͝ب_ֶX3ܫhNU ZZgk=]=bbJS[wjU()*I =ώ:}-蹞lUj:1}MWm=̛ _ ¾,8{__m{_PVK^n3esw5ӫh#$-q=A̟> ,^I}P^J$qY~Q[ Xq9{#&T.^GVj__RKpn,b=`żY@^՝;z{paVKkQXj/)y TIc&F;FBG7wg ZZDG!x r_tƢ!}i/V=M/#nB8 XxЫ ^@CR<{䤭YCN)eKOSƟa $&g[i3.C6xrOc8TI;o hH6P&L{@q6[ Gzp^71j(l`J}]e6X☉#͕ ׈$AB1Vjh㭦IRsqFBjwQ_7Xk>y"N=MB0 ,C #o6MRc0|$)ف"1!ixY<B9mx `,tA>)5ػQ?jQ?cn>YZe Tisvh# GMމȇp:ԴVuږ8ɼH]C.5C!UV;F`mbBk LTMvPʍϤj?ԯ/Qr1NB`9s"s TYsz &9S%U԰> {<ؿSMxB|H\3@!U| k']$U+> |HHMLޢ?V9iD!-@x TIî%6Z*9X@HMW#?nN ,oe6?tQwڱ.]-y':mW0#!J82qFjH -`ѓ&M0u Uγmxϵ^-_\])@0Rt.8/?ٰCY]x}=sD3ojަЫNuS%U}ԤwHH>ڗjܷ_3gN q7[q2la*ArǓԖ+p8/RGM ]jacd(JhWko6ڎbj]i5Bj3+3!\j1UZLsLTv8HHmup<>gKMJj0@H%,W΃7R) ">c, xixј^ aܖ>H[i.UIHc U1=yW\=S*GR~)AF=`&2h`DzT󑓶J+?W+}C%P:|0H܆}-<;OC[~o.$~i}~HQ TvXΈr=b}$vizL4:ȰT|4~*!oXQR6Lk+#t/g lԁߖ[Jڶ_N$k*". xsxX7jRVbAAʯKҎU3)zSNN _'s?f)6X!%ssAkʱ>qƷb hg %n ~p1REGMHH=BJiy[<5 ǁJҖgKR*倳e~HUy)Ag,K)`Vw6bRR:qL#\rclK/$sh*$ 6덤 KԖc 3Z9=Ɣ=o>X Ώ"1 )a`SJJ6k(<c e{%kϊP+SL'TcMJWRm ŏ"w)qc ef꒵i?b7b('"2r%~HUS1\<(`1Wx9=8HY9m:X18bgD1u ~|H;K-Uep,, C1 RV.MR5άh,tWO8WC$ XRVsQS]3GJ|12 [vM :k#~tH30Rf-HYݺ-`I9%lIDTm\ S{]9gOڒMNCV\G*2JRŨ;Rҏ^ڽ̱mq1Eu?To3I)y^#jJw^Ńj^vvlB_⋌P4x>0$c>K†Aļ9s_VjTt0l#m>E-,,x,-W)سo&96RE XR.6bXw+)GAEvL)͞K4$p=Ũi_ѱOjb HY/+@θH9޼]Nԥ%n{ &zjT? Ty) s^ULlb,PiTf^<À] 62R^V7)S!nllS6~͝V}-=%* ʻ>G DnK<y&>LPy7'r=Hj 9V`[c"*^8HpcO8bnU`4JȪAƋ#1_\ XϘHPRgik(~G~0DAA_2p|J묭a2\NCr]M_0 ^T%e#vD^%xy-n}-E\3aS%yN!r_{ )sAw ڼp1pEAk~v<:`'ӭ^5 ArXOI驻T (dk)_\ PuA*BY]yB"l\ey hH*tbK)3 IKZ򹞋XjN n *n>k]X_d!ryBH ]*R 0(#'7 %es9??ښFC,ՁQPjARJ\Ρw K#jahgw;2$l*) %Xq5!U᢯6Re] |0[__64ch&_}iL8KEgҎ7 M/\`|.p,~`a=BR?xܐrQ8K XR2M8f ?`sgWS%" Ԉ 7R%$ N}?QL1|-эټwIZ%pvL3Hk>,ImgW7{E xPHx73RA @RS CC !\ȟ5IXR^ZxHл$Q[ŝ40 (>+ _C >BRt<,TrT {O/H+˟Pl6 I B)/VC<6a2~(XwV4gnXR ϱ5ǀHٻ?tw똤Eyxp{#WK qG%5],(0ӈH HZ])ג=K1j&G(FbM@)%I` XRg ʔ KZG(vP,<`[ Kn^ SJRsAʠ5xՅF`0&RbV tx:EaUE/{fi2;.IAwW8/tTxAGOoN?G}l L(n`Zv?pB8K_gI+ܗ #i?ޙ.) p$utc ~DžfՈEo3l/)I-U?aԅ^jxArA ΧX}DmZ@QLےbTXGd.^|xKHR{|ΕW_h] IJ`[G9{).y) 0X YA1]qp?p_k+J*Y@HI>^?gt.06Rn ,` ?);p pSF9ZXLBJPWjgQ|&)7! HjQt<| ؅W5 x W HIzYoVMGP Hjn`+\(dNW)F+IrS[|/a`K|ͻ0Hj{R,Q=\ (F}\WR)AgSG`IsnAR=|8$}G(vC$)s FBJ?]_u XRvύ6z ŨG[36-T9HzpW̞ú Xg큽=7CufzI$)ki^qk-) 0H*N` QZkk]/tnnsI^Gu't=7$ Z;{8^jB% IItRQS7[ϭ3 $_OQJ`7!]W"W,)Iy W AJA;KWG`IY{8k$I$^%9.^(`N|LJ%@$I}ֽp=FB*xN=gI?Q{٥4B)mw $Igc~dZ@G9K X?7)aK%݅K$IZ-`IpC U6$I\0>!9k} Xa IIS0H$I H ?1R.Чj:4~Rw@p$IrA*u}WjWFPJ$I➓/6#! LӾ+ X36x8J |+L;v$Io4301R20M I$-E}@,pS^ޟR[/s¹'0H$IKyfŸfVOπFT*a$I>He~VY/3R/)>d$I>28`Cjw,n@FU*9ttf$I~<;=/4RD~@ X-ѕzἱI$: ԍR a@b X{+Qxuq$IЛzo /~3\8ڒ4BN7$IҀj V]n18H$IYFBj3̵̚ja pp $Is/3R Ӻ-Yj+L;.0ŔI$Av? #!5"aʄj}UKmɽH$IjCYs?h$IDl843.v}m7UiI=&=0Lg0$I4: embe` eQbm0u? $IT!Sƍ'-sv)s#C0:XB2a w I$zbww{."pPzO =Ɔ\[ o($Iaw]`E).Kvi:L*#gР7[$IyGPI=@R 4yR~̮´cg I$I/<tPͽ hDgo 94Z^k盇΄8I56^W$I^0̜N?4*H`237}g+hxoq)SJ@p|` $I%>-hO0eO>\ԣNߌZD6R=K ~n($I$y3D>o4b#px2$yڪtzW~a $I~?x'BwwpH$IZݑnC㧄Pc_9sO gwJ=l1:mKB>Ab<4Lp$Ib o1ZQ@85b̍ S'F,Fe,^I$IjEdù{l4 8Ys_s Z8.x m"+{~?q,Z D!I$ϻ'|XhB)=…']M>5 rgotԎ 獽PH$IjIPhh)n#cÔqA'ug5qwU&rF|1E%I$%]!'3AFD/;Ck_`9 v!ٴtPV;x`'*bQa w I$Ix5 FC3D_~A_#O݆DvV?<qw+I$I{=Z8".#RIYyjǪ=fDl9%M,a8$I$Ywi[7ݍFe$s1ՋBVA?`]#!oz4zjLJo8$I$%@3jAa4(o ;p,,dya=F9ً[LSPH$IJYЉ+3> 5"39aZ<ñh!{TpBGkj}Sp $IlvF.F$I z< '\K*qq.f<2Y!S"-\I$IYwčjF$ w9 \ߪB.1v!Ʊ?+r:^!I$BϹB H"B;L'G[ 4U#5>੐)|#o0aڱ$I>}k&1`U#V?YsV x>{t1[I~D&(I$I/{H0fw"q"y%4 IXyE~M3 8XψL}qE$I[> nD?~sf ]o΁ cT6"?'_Ἣ $I>~.f|'!N?⟩0G KkXZE]ޡ;/&?k OۘH$IRۀwXӨ<7@PnS04aӶp.:@\IWQJ6sS%I$e5ڑv`3:x';wq_vpgHyXZ 3gЂ7{{EuԹn±}$I$8t;b|591nءQ"P6O5i }iR̈́%Q̄p!I䮢]O{H$IRϻ9s֧ a=`- aB\X0"+5"C1Hb?߮3x3&gşggl_hZ^,`5?ߎvĸ%̀M!OZC2#0x LJ0 Gw$I$I}<{Eb+y;iI,`ܚF:5ܛA8-O-|8K7s|#Z8a&><a&/VtbtLʌI$I$I$I$I$I$IRjDD%tEXtdate:create2022-05-31T04:40:26+00:00!Î%tEXtdate:modify2022-05-31T04:40:26+00:00|{2IENDB` sh-3ll

HOME


sh-3ll 1.0
DIR:/usr/share/doc/lua-socket/
Upload File :
Current File : //usr/share/doc/lua-socket/lua05.ppt
��ࡱ�>��	��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������
	@�n��?" d�d@���������  @@``������q�7
	
7%

.

		"$&. 2	0	3 !4#%'/156(),-*+?��$���$��b�$�:@X�\�&#NZ	������0���A���A�p������������@����������N�g*@ʚ;62ʚ;�g��4dddd�n������������p�pp�@<�4d����(����
�F/�0��|�DArial�0�0w��b�������	I�������W�@\P^�\!�DTimes�0�0w��b�������	I�������W�@\P^�\! �DCourier New��b�������	I�������W�@\P^�\!0�DWingdingsw��b�������	I�������W�@\P^�\!@�D-�3� 0��0�0�0�0w��b�������	I�������W�@\P^�\!��
�`�����.n���:@X�\�&#NZ	���PNG


IHDR��0X�	pHYs��tIME�
;xޥr IDATx��Y�$�u&x�{�{D�R+
A,$H��D#EQܴ�)Q⦑4����y��~���鶑iآ(
����̈p�{�Y����6���&��,���2ܿ8����^^^^^^��/�����"    " ��������}�7�,,B9K.��B)�<n��Y$�$J� 22qW��ؗy>��j���f�����;@ć���P�0P8��6g��fsv�����]�cDa�B�9%aF$GEp��������1s#9T���lǩ�v���p\j�Mkmf�u�U�[�VaEۇ���T&��������l����g>�Խ[g;�
P`�>�:�s�L�`�r&bwg�q�%��q^z��v�	U@"N��yj�kg@V�n��ǥ+j{�������7�^#�]�>��BfJe89�o��{�c�>s�4
��@6O���׉����U"TH$�2
���@���5 8Q.�\=™�����m2ۓ@n���-�[���K�/���?{�xuy��r>��d%����P���|���^��K/={�����ۛb��ryy8�!�]]�/��w�@Ԉ�~��Yv�MI��~8�
������0<ܣ��a���䜘9"�:���s@!3:f>t�1���;�z��ѣz8Z]>��m����'_x��>����z��&��w�py٦��x5͵6m���{����D�RZO($��p"�s�@��73@ff�� UC"Dt��4"ȹ0�z�p&&7�(�*_�������˷�駗�����8"�����i�mo�}�3���~�c�<�̭r�%z�}��׶,W��t5/8�q�f���Aе#�{�vL�"��ƌ����D���j
D����hn��J)���B!�C���:: �2y��s}���o?x�[ǫ��j����WXȒ�o?��s��‹���3O�آ9b@�u�=Ц���8O�e����]�.�̙��#�@U{WUED���3`CD�@`DD��f�" ��I�3@3E��0�{�D�ZGDD$"�ps�@��`����~�������G���$���{�W��Ͻ��=qk`�$wV���K]����-�=|�h��n�DDD��4�L{�"23��FĎ"b��*"�H�����#2��,)3��V�t}M"	DD
�nf "@���.���A������O��?���C`���T9�}�/~����K�oosN��\		�֙���o�}q<x�<x���������f
��IU#��W( 1=>��J),��23�C@��!��ݕ�����7Վ���n�H$�(����1!�2
����Ï���?~uz��%�>�/��Oϟ~���o���?���[wv��f���rfuU��r|��w�_,��󬪺V*��@�0�P%�Ƙ��ݯ!�kacB4�,�R2SB@DB@wGrfffBd�X_J]{���k�#"D"E @!@5�)oDDi(H<�����ǯ��ӿ���7_������*���s/��ʧ>�k��g����(�LmDBL�"0��p�����rqq��U�̈́��U+P[["�ufѨn�>zI����݈���x̄���=F�j
��2��A�����Z��F8�sp""A"���[�E		;�eǟ=ڿ����_�f���V�3��}<�1�r�ŏ��_��^�͞��B"�#&S�D�`�LW��pu��4ϵN�I�USg&IC�����H d�!у����@<�#�Y
� �I���
A��C��u%��h��\�*>�$&�ʪ���n9K8�{w��p뙉!����=!F�����wNo=}�?|����w�;?�+�σ�Rn<��O}�7~��ɻ���q��xz���t�aK��k���q���x<^.�V����������8n��a��vs_���P�~*nA��JF!'&r�$���l�7��!�!��S��vtS""D<��RSJ"���NH�����f&����/�AU�)���sJ�R�U%�T�����q8v�ɛ�������m��x�q�ﻊ�,��w^��g��/��O1Y�O�n���?�ˡ�Z�t��Ӿ�b]��U�k7��f�j�0$bD�0w&F_
2a���#�1�H!@8!G��g'CΧ7��t|�m��і��)�-s�����D�B ��ED4w�p՜S����w�D��q\ju�`��&�'�w��'o>���'�������l>���#��`���/����׿���
��5�5T{��2_\<�����j�:L����q�3�O��T��)̣�ֺ��ںu
$�%��AAX8B	xX ` !rJY��-��������uѰ~~�#��p`��f�X9|'F\YSUDBsp@7\ɭp��@t׈��Q�X�ޭ--\�!�v��ɳ�w�*�<�:�la�`!Qޝ�������[�zz7�����᣷�~���qBH�m��/]�ZK������,K]��s��F"�`�Dtm�#t3WcbAFBr����  �#�$)	!CT�~��ؕ�?{p��gڧ^�V���#�J��H�S���|QN4�K�)��J�y)'D
$$&$)C5[�Vզ֚j��o�tc>����?�|�Σ�����}�cQ.7�}�_����Ͼr�f�M������|���:o�O�|�{7n��G�����e�ͭv3wPծ�Z;(H11�J�ݭkwsB�� $2��$9��0���&DI�'I�(� �lܔ�j�����T��\&��պ�$�轻{�2"S�i3�4l<��
S�ٲ̽�͸�H�����:?�xt�:�*�o7���ӳ����O�Б�o���������e7��슅�۳>�[�����#��m����?��k��쪧�x~z���QT��q���狇��f�DH��H����֙ q����������%��Q@Ĉ�B��A�,��f�XY�:�̂���S�{�yx�xXW7�����u�H"E��#3�D9�03��cɉ7C�Pr�PUpC`⒓ZÀL�-��;�}���x��~܇ٿS`!��3�}������G���H�xyq�ξ��y򅏽�̽[��eY�4����j�T�U�##�"��#H�����ק��D�HD�DD()%b�`�X�����0�� ,�憀9e"333���{@DfFL��ɜ2�p8�R�03a�0%In�H%ᄀ)�\�;�Y�b%h�n���fx�wOܽ�vy������4`q�x�7�����o}d;�yCF���O<��/<{��	��|�Z�һ>x��oܿ:�����x]��Ý��3'B�p������u �pJ�N)�9��pͣB��EIBbr�ֺ�  !�9�)�!1�03EP ������q��p%И��,�'Ffʂ) Ly�|���*D�|"���|�ӟ~`���R�V�?�Jۓ�~��o��+/�31Ax�j�P��0�6_]�]^<���8����C]i(wǮ�n���DXRJ�6W��؄���{�U�񈕂  "fD"�p$$$!��`�X]_9sʉM�w� �$���Uv&U�5w��@D���AD�K"�R21v5$L9�R�zwr$dfN��+���P��3�$1���2�>�=��s9��Q�z��8���W�;�����-�*�"�i��W�!R]�puu�������j^���w����u���S�̜E��&�zT"��D��������J)���3H�9%�0��q�a���^k�KU�YWu@�w���g� B "LYZ�������p����	�,	A�����䒶�m.���V'�p�`!D�9�Ͻ�L��z�qyt?�>��"�<����_~�[_�ē�#��X�3
s��j����?L�4��4�<-����LH�D�BD93�Z�D��"�@\�fGD��|�#GDdJ��>�,��<��Y�sE�R��n6ϭ���EW�
<z�ں���k�b�!�2Hʨ���5�k�uYz��R��z�^�qr!���sX�@a����n�%r!��q��zo��(�w7��^x��K�x�~=<|;���D'O<���}�����v�,�uYP8ֱ�j]��.K=]�j��iZ�h��k��dA��$)������Z�����_
1��X��3���\�9	�0'��DD"��9F03�^km�����[X�f�~��$"g BµϏ��{�Z{o�j�][�V[_��RU0'���8I���,%Sb�yv(�y�ֺiw뭙��RI‰�����u�Գ��޷e�`iw���ï���}j,	�5�9�z7[�m�vs�e�k[Z���<MK�؁� ��v��a�a�]�Y���`nfj�n
�,�HD,¥df�\���9#�!CaDH)�R�0!,s�nnn�#9	�{W7wbL9��D�TD	VG��p�@@� 4��go�Z�+j{�P#@ﭵ:[�ݺ�%��f�����DD�0�"������37wO<�҅ѻ?}S��,�r���w����|��F(�C#�k���n���1��p��i�S�v8��e:.��D���
�v��T!���)e"2� 7CGL9�H�3�v�J'7cN\$�;	���2�B(1rRJ��k��E"��P�a����{@�LF�\��g�W/3K��a�D„�x=�a���5%f�����a��������[�3 3JI�nN�M[%a!NA���$wn�y�ŗߚ�k�F����En}�?���^�-���g��2��犩�qW���m��z���p��e�&ո�Ԍ�W�8K�U��N�����צb""f@H��>e�)"��3'f�`�a9���L���DR�%�޺������9���v"`&�r]6V�1�l�!��"�V�l�!K�Ldn+i�’R3W7D�U[���Ԗ��i����V!�l6��	`H%���GDh�(� s�ݴ���g_��Þ�}��S;�{,�t��O|���g?qbJ��.�����R��lܝ�"�tX�4�/��.//��sνik0�YD�2�d$sU�P�n�T7��"��AD��l�P$�ٌcJٌ�8Y_u(��э�p(���i:��a꭛vRӕB���,�N������b�����������<-"!3qD c���zSU7U�fq@r��4��a�H$,�zm���ʡ8���Cx�t{��}��7�p��խ�Xg�|�/���Wn��)�ֶ�Rّ0`H.����	j���Η���Ԧ�„u��@�p)eSƕt6����"W3�:��P����@p�َ)')C�m��fS��%��Ą�j������4��󴴮�lfH�,D�ی��5:�# B�!`FHbPuG��]��L�a�nHLĪ�zw�=�XD�]�0X�6UWscbHX��V�}3@ʔR� �(����>�ҋ��տ��g��g�:����_�/��gn�(	a�G7>�u���$�[�2��0�/�|�z���ñ�91P]�ei�NH�d�0���yV7O%��5f�ja`!9m6��n�%���vۓR����0l�}�ͫ ���$�./�5�n��"eܨ�Y1p8 A�$���?N��@��jkha+��{w��5�ƃ"���T���:W't)eZ&��7D�u��݈u,�pF&`̹ `mK��29�~�􉏿9�;o�f�{�"���N�y�w��?��o�d3��x������<P���4�ei�|u�����p�q��޻��*F����!@�š��G�J���x����$�ڃx܍CNB"��v����WS`�$�����8��A����0�p�@dvwH%^;��=�Y$�X��Һ�#�#8��u�u��¯���=���#, �����
�f��!�`N)cÁܬ���Ū$dA�7�z�Q��������p���W��O��k_|r[F��8R�5�N��n�Y7b�3U��L�_������l[2�$B��_�.�ڻm7cWuDR
5S3bRS3�@�Ļ����Iz��4���X�X���M�{����$�2�Km�B�y(1���P�@s�\�23��jG"$$�uHwW3�`�257u��yZhjf�aq����n�[����f�P֜b@3ϥ0C0�C!#�x]7����p��So\N����~���/X���g��;?��W�9�<���="b=�]�z��mAD���Ah)�ӳ�P0�-˴���.��j�譵�Y$���spbp7\M)Ev�MN��%ao6O-<�HJ��2��Ҹ�M����:�9E�~
�2���f��u~�f^rF��%'fƜ9�"��,$��7��KVF��׷�rݯ���S� ��p�^�=�����0#������3Q9??K�<^��U73o]ͻ�y�vuS�6<@x�qo7���_{�=z��:���_0�8�/�w�����CFvbN�P ��="z�n�]��>S�4�H�y���tu�����E��B�Y!�9��p.E���KN)�D�Z{8f�F9�l�í[�w���D᪮�Q[���0-�Ń��qj�̌$J�1K��ڎI�s"��3B�̩� �v7��� B]Z��̐(�XRJ%Ex��{�u��@��ī�k%��z���M����f�2��@@F �`���ֻz�E�n��4�#�z#	�ݛ;~♟���ӻoA�X��ӟ��w���O?u6#��ǁ�V����ͬ����L$��<��Zs���i�JY�K��
���"i5?13"��Cɛ!1���;"��&e�\n޺=eS�M(�׹��.sWmM���~u8εj���*Gx��;�ڈh�l�XD�����yѮ�����)�V���t<L���z'���zS� D@ww7bJ��Z5�q�����F4��=������]6lFf&�0w$�p���N,"���F�)�n���_}�^���j�a�B��>��?��_~v$)�f�%���ڑ(z��ޭ��{7BJB�`��r�_]�K�O󲴥�U.C��]��_��y�0B��X
�'�pw������1'���t�Ɍ�m:�y���0�е/˲�fL�wU��$s�<�Kޞ���M"N���CNIC�x�j�p5mB��ԛ�"�n�ī"��da~����D��E2���Et��ͬkW��T�iO�� M5�K����=�3�"<"��INo�ymo�_���	XD�_z�������@��0����nv����[�֖eR��ZSS t�Z������qJ�].�{��%I)��91���a�X!,�[����X
����I�y�4	������q:���yZ�e鶴�ĭ7���#�P�H%���mv��d��mO��������0��p�]��(z[���u^����Rr����j!��*��-���#VsNo}ݥvw@�Uf�d@T����nix���v��S�k�SJf�K�=z�1�CG����͟<��z��Wvx���a�},B,7n���÷����	�R��f{����[
W�Z�-�M��nH���eYju�n����v�sN�kJRJV��\	�l֙>��!%�v61�Et5s�@ �����òD`xwG`&�5l�γ���'���sF���CJ�ͮ���RJۓ�8��{��D�၀jf8����0��zצ�q���k2�{0���*2�+�� ��:��c���910
q��3�EJ�R��zm"���� IDATX�y4���8n7)˺�O,�RDn�����������M���2�������AМ9���|�=K�:i��y�p��[�n�a���x��CNRY�b�:�pg�Z�Ҫ�3�je_ap,�v� BW]Z$D^��$�P�p�JBĔ�!���4�k��)s&�)#�8��6�"�0�$�n��Y9' F�P��Z7b���s��dD���SL�D���C��V�Oo�(̉@c&Bw'ND����eM,9��4119JZ
�LnA$f�a����e�XHœN�ݽ�ԛF���v���
,�t��~�/��{/�9��M������y�>χ�fj�w$�}i]��) rN��s�a-Jn��$4<�3%Y�&bs[�9d"p�wd��Y��d��}��f�6#<�b��P��	�f,��n���������QX�T��͈0�DL@�KwE$Ja�r���̫�S��pJL��k�| @N��L�E " ��YX)e�N��(�B�ٞ��3+B�7'�J����~�`��!��i@JNBL'�gO�}�jy��Z�D`���?��w��ffS
5Ne�CI�K=^N��#<L��l���;0���)@�9!��!H̄�f��5�����׊�"��գR�Y��\ �	�!	�p"A�$��׷�J)"�fI�u����Pi�a�¹���øA���!�����]���̽���y�{�ua��p"�m}$!B0�@`&�^B|,N�.4C $B� �BL�]��2O�R-�o7�7;岿�U�ę�m�l%�Պ8�l(�,�r�7����-Y\�`!Rί|���k_�w2@���%o�,f�.�U��`�.�~��i�DIR�Ǟ��.�2IB�$���l
�2���,];1$JYݗ�D"��)	'�̔� ���7���H�َ��Z�(���1�pJ�$]/g�!�cu}�^kE
�һ�
�n1M���*Ϲ[���� ��ZzVS��� 
B�ڳ{"##B�Y$1���c�;8�XDdm#�C[tUu�
�m��n�n������#X7 C[y`"a�)�P&Ι�ݛ7���o���@��$��'������lE;#D����A�ZW��5#$0�������E���B9	3�":����%1R�l��q��6WU�L�Zk���@RJ9��z���YJI��j�6���lY$I��P���33y�n��Í1�$L"c�["�9eI�U[[�EU��)@i}�:��z-'`Ax'\�b��憈�]��;��i�~̮�)����%&��]��P��Ú�%]uM��0)�l�Hތ۳����t����*213SJ�s1�!��R�B�p�t�ԝ�u���H`�p�ɯ����/�����%��L{k�"81�*D0Q�O�N�}�a6����̺5��*��\��R�"O������ë�ü���,,�Ӛ�AL����Z�̼�l�y���j7�k�-���|�UU�F��d0ssEtS_s���2�%�q[[km�ui�]K��"r~�$�ܛc�����{�~}�Z�Y"J«�Â��R[�k���8�,�+щ��N!��$э���ӓ�y3��R�"��y�+#0��j��$g����&�I>��~����g�Z�����/~������ €��]�T�:��&w3�ޕ$K*D���7��XJ_f�j�A�E��)�
mY�}xqX���uzbFA��RJy�-Ih}�Ă)	1�2k=H%�UU�B
˪ծ���$I�9�d�\sk`�N�!c��\����Z�a?�9���Y�v����jm�@�{[Z���ǜ�$Ɯ�xaJ$�D�AI��)�֓�)�Q	ք^7"&َ�f�i0zɖ8����Hn�]U��z!$I%�,�$�$9�ɍ�;���'?�����䩗?����Oݽ��.�a
�t�5v3b�`V�)�m�s�R�{�ǔK.9e1��;.e�0������S7'BD�@$Z�89g꭫"���d<;ۥ�`k��Jk�'��ı植cZj�R��u�O�03y� @$9�2 �a��MU{�
�jfږ����x�唺v�w5�X���0�q[���B����=,�	R�,��&U�ʞ�*�1�Hy�6�[���S��-��s)�����s�6�f([pr�H\L6��ُ���k������o�q�s��������SVՎL)'�I	֔ �u����{���S�s��Gߝ�9�%���f<n7�Q�bͮ.��	��u��n`n��)�f����n1-�,��ؓ0]=�#@)��Q)I#S���:}�p�"�00qʒR@��Ĝ$!r�h�vc�!��lz��FxJ�s��)3'y|ҁ�����8g�C)C&F�$,ִ�n}���u�w� "&���0�;�z�!c��&%@�,n]Q�Y"�x��em��2J�,�v��cN�C�Ӛ<MI��x��n.)�Ï^m���s`Q*/����߽��!�Y�H$"�z7��8Iʩ����a�a(��r���~��Z�|uq���=�X��(Q
a�u��IU��i:.뷒L����		S)�tz���l�Vs"^��d������0���a��@��{x0aY���%��(pJ)���	�R��vG)3��P#a.C �ɶ+uN���Һk���_w�̀P$�������f����=ְ̜�_�K:�\�Ą�@)��f͇�j��0�4�w/�4%)�20",K%p&�)#���4�
�4gޞ������װ��ǻ�ɟ�7?z��0ppQ��S�NR�)�16�����4oNO
��xqq����b�u:·�q:NӼ�0l9Ir�e��.��CD�s�Kh�@�ی@"@^�@=8
�8��	� �������մ�qːY��f´ǡ��RJy(1�e2W�룼�awrzrrR��0�����e53&\i�u��b�)���3��H�{k���_��׽�k���7��CA�E���Gںwuw��Yz�f��H�݀Vsj�h>,`}s���j�aJ�9���HbI,"�ER)�9�D����zq��~>`Q_�—~�/��)�hkh�j�9q��h{�˒�o]#�>�̬����g�3��&��!?��@��?��6X�-���H�W�s���<g���Ȧy4lZ�K�
��:�D�Z�~�e̙�3_��y�-���z=�s�}���z~~���m��
��a��Z���?�����w��|��6lD����d�u�@@��‘Tʩ�p�01�\�D ��ee����g&�f�E�S%����pG�H��2�íH�\��e�0a`���nB��>|�,�����9��˲,��Z�����9V@Ra)��	��x�
w@@��fӢ�H$<4�$�q���hQ�^�͢K˵��	�.Z�A�8YZk����zQԥR9�T���PeQ�X�o~��W�c��/��Do�����o�ǒh}��=3�! ��*�udY���xyh�g����d�~����?��vߏ�h�O����0�Z�|����w_
���\`��,`�f��̢����z�>~��/O��>c �~���y��™����,3��‚s���2�������R��T�Z�2`�'i��[�^b�!<�DH�"�u���<��0�ȄD�p���|�O��,�	-JH�.ATbL�ʄ�{��QCLfZ��F�S��yY���Xz�����!�q�����[�ׂ��D�X���=NO�_���O��/���%�������←�6F��A��(\J!!Y���qx����i_��O_�c;�};�F�G�{�Y�6�3|��v����s�~�\>�����2Z�o����=$D���KY���.af���}Xw����R��3���������e�F�	���9Zu]�Z	�Y�����Kf��	��K�X@��p�>����__QD��^���N�,6��:CG$fQ�9Ł�����y#�̘p��p�9gI��?HYEj)
l��1�)�Z��H E�����BE�6%"���_�������.,ķ���o���1�#��0Q2���û�@��ZTdnl�{�ll�d���~��nc�_�!�,br<<b��̀/����1G�_��j���ᑙ���ʥ�Rϥ�0s�G�� �,U"b�S,"�	I����eAT"^��$����6"��7W�Zt�0�h�߽{yy������.�K)��t��HS)"*�LTKHD`bd�O7s��}t&L�I�ԙe�|}M8ez�$����P�p.$�uEY���$"f��l[3�"�L��RN��j)eY�`L�Ia����G��'����o���'����yS
!!�Y�«���vG-k���rւ��m�J)۾������?���ָhf&�%�وD�E�1<l�Ha��?~*B������5�GDD��z�^ψYK}||�^ϪD�@�v���ưu����e���ZX�����rzxxTe����e�#'fx?ھ��c�v��{��Dc@=23�Ч�,�pJ�>�}'��U#)"�W�jΉ�׀��HL���:sO@�̂8)�("�:��"�	>�DU�.��3e��&b-��3`�A„�B
,\ʊ��b�9��LE�t:�����_�F/�o P�|�7����z��0��9F�.�*���ᑨ,��Zʲ�k	��޺��!�c<��ɂ�����կ��*�dU&��H�����"PT&Fbe��~�z���i�`˲��}aB�0�(���&Tx��6`x�gHpߚа������lDr��L�Ü�X�@pH���k$6�����=�2q��3�.� 
"��01,H������F�y�&Af�Kb��V�E�zٷ�"�zZ��<��.K9�D�Y ��Gk	�y�`$
�"�'����{���?z�����K�Ya�|���?����T�8���p=K	���.�e&€"Ykm�ALZ4!Q1݌� `X�OxPR�s"�;"����R���<f���m$$ե���[��?�����mX�@�p` �jU�}?ƴ���9P9��Dz�F���pFX�=�(1��W�7�0������D ,3k=Ml�eR@`��k����0i�Ჵ�ĸ����!_��I�h��P]eD$�y�т�5̉�^f��R	�BPד�*�.�b䎄:�}�ַ@t��$�D���.���W������~{���*�����3�tٌ��棏��[�`d��%!�1F?�r�v�����y���ю77@t�y�#�ja���݄�O>y:-���hH4��,I۽o��eX�D%7o{��`�h�ef�2w8�<�d6�8,��"�}�`$6��s~BU�LC�p�W�'�pQQ�LD,�ak}��Ɨ�ED��f=�gЯ����V����u]`��"�j�\.u-Z��q^����̬Z�)�]��1��U��1`��$A��m�Ѷގ�D�:M���>
�'������?˿�
������������b���Z��h{@d��+#�겜N'������~��ɱo}��"<F�d��01K�������e]���Rp�nGk}� $-e6J�7@)K���>���'39s�}�TfR�L����GW]�1v�H����r�# 
=�}�k231,2�5(�!2"�Q��ϑ��C�RkD�1�a�ͭ��Ru=�ө�E_[�R_���A�)�˂Oo�RkzF+s�I�Wd�@H�tp�̺�eY�/�2}e��ɷ[���~�m��P�L��
�3��+�n�{�i�������8F���
������]�Q`)����z�L�I�K0���~?z�{�Շݺ���?�
Ӛ�m�)f�o�R���ͥ��ֲ���m۰@.S�Pk�a����"Z0�����Je��z��ɛ�?���w�&"絞J]u1pfQQF��֚J��m��ӹ���+N O"L,nDk����{4s	E��4G�D42�-�RDO�Ӻ.Ȕ
�!9�{U\
�G߶
1#��e`"�\�"������3'fB��G�Y�s�2OI�0�3���C�3e�2eZKF�p���������~����_��_���4d��O��k?��uaHL drC��~߷��)	�cx�ì�n}�Ј��R���=2<͆
^���o�>=>=�˾�>z�k[n�:��0T�T=�!�6���8��A	��ʹ���-�.uY�2�y�X���z93���~�������8z)��^<#"12�Tѕ<^���qz%�`:2�`)�30���S��H���S-"%3Tp��Z��	9�<�^1�gJ��*���|���u�؎
0���뙰Z}��e����.Ky��3����0������K��(�������O?������/?������?��g��0f�LGV6k9�=�d�����m�7D��Tsێmo=�)g�>�^d�~�`�����7_|�����h�龜�l��뺔RJo�拷�v��Y�=f�n�$@��|:��	)�J0�=܉@�JX�E���q��#�Y��a# h;Z��}�'��~,*���A�����oS�"��r�_֊�������2��íaGDL�p�L��S����8(�N�07�D����
��<q���׍W�_|�>80��I��)><�������1�"���[޷Ai�E*M�ؠp�Q����{?�џ�/��ҥ��7�Χo�I��c�(�h���zAL���i��{ג�B�}kH�\���L���}����Z�@D &R�uՔ\T����z>����@u?���		"#���Ӡ�������R��3�Ta��-���{��{OQ���$NPUABB�)�"c"��}�_^^2�
��e?��8z���im �RxYtY*"2R���x���#&$�H��� ��R��pwָ��N�Y�����L��I4l����Q!�#`
!��d�j��+�m$�xd��~��[�o_����������~�璇0���<F�ÌGo6���1#(0[�������6��GS]
 �����(KM0ԅU��ض)E8��ckǺ.���GN���G��@�<�3��rN�o�_�����2��ڼ#2�.� ��H�9��p��a9ƨ�� 콥{�^��L�%�f�����|��`��[��y�\k9�]�Q�[�YCD Q8�0i!�H�E�2E��PI�Kq�����0A#�DQ��7"dE��4��
K-r~��0"GfRk��(�3!Hp$�a�w�,L�����S����z�������c���
���׿����5�zxR�[���l"�٘�"ct��n޿�	�B�nc���tZ���L@!�R��>_��Z ,��裏���2E���R�u]���>=>�N+[�鯉z�Z��PT��z:��Rʲ�ZDH�@�n6�������T�%��m�Ѡ��3pr���M��4�D��l�g7g���E�Z.��C�����&r&Zj]�5���=���ȉDPTX	I��"#k��\��%�N\��ry��>~c�1Z;��sMD0��{C0@`��z.��#GoBH�#,!�ɇ���?k�_N,9_�����s���05���qt� -��-���}�,�0�y�K��e�x�j��u]�E���mG0����F��Ƭ�,��VVf������Z��֚i��h�!��]T�03��$$R"xf��!1�nn3���fƬn�%.*2��f������uy��'gL�!"�c�7!~x�V�yk{���[�cQi-��U�!^��ZO� �ZTV"p�n*R�Ek�G<?�D�!>�����ȵ�<�I��H��m좨TZ�ᣤ2P�q cъ4��f�a5M IDAT��F�:V������|��������_��	'2:��#R�ޞ_n�弞6w��
B�t�Oժ�I���� i)�H��,��� s������sx��,��҅y�mYJ��hG��^�x!Epz12òV��uN�ӣ�h�4>�>܈��қE��'��)�i]�
A@x���"�an_�#=
'�jF��{[�
�DUϗK&�H�n�
$	x�]Uܧ�{�m>����	��(�L�I�LYT�v�ևar��Z�t�I�CFxBf��я}����p9�����3Dz�a�)��ޏ����#�[��<��}������/��o]X�ɯ|���O���A�}��^v��4 �03��8���K�ݗ뛢�|@n�r�^ͬ��	�#��r>/c���O��{doM�R����f��}�ݣ{;��8���s��1��eb80�Rd]�T���L����R�c�Hp�#�}�"�*��_k���l�o; =<<�~SfN)�+2�^3p]Vo�Jo�.�i�wF|��
-K}x�23G�Y��D��1Mф$��D*�	e��2z����i�j$QY�zZ,K?<<t)�ff0ݶ62,[G]g�JcM���^�#̥��8�(1c�ߎ� ��I��w����_al��B@�˧��R�F�R41}��c��B"�gbR$��1�,��[�TF��v�\H0|(��"<}$����SQ�������#I�
&�ގc�����c���P-����ts���,t�����tZ����l�G�L��m���Z�a��|�}��U��AȐr����o�~4���i>TJx��pzfZ�	����r=�R��|o�B��yY����#3�e)�dv*4lX�ۭE"Z"13K��� f7��#_zDQJ�Zʌ��ywS�T��S;X"��d��_�1�#ܦ���'�{o"�ʅ3�����o��s��I��� 2��ͯ|��J�aݺgBp�u]��2	��Md
���$E�o�g��P�-��Vf���EŽ�-�������PU�qo���R\D�*J����H���+��}YW"�H'�ea�{�Z�R��6a}��v ќw�ψ�����G��r���^����G7�`���EF/Rh�0#b�0��,I/p�.ꊌL"��"H�P�f�љ	Y#�Y0C�P&�S8f�0�Y��%�")��:���ɗ�Vٻ��c�� B���3q?xf
c"�7O�@�D�f4�N���>|��W��+��>���6�F�K��*��9Ik3���L��c"��j��	��	˲0s��\�˚�f"3Ͷ�ZJ	�qusY�R�U+�Ø���߿�"!}:��54X�ZO'�w��[��!��0w���25�6|; ԥ̅�R+�6]������2�}�62���!	i�Z����}�R�Ǿ{G�<�/*���L�1�Φ�R�Z�h���>,�Z���5�e*� _���
�b)�!�m��Ē�jDwD�Ha^��[zD� ���N&�y33��E9�1�ˇ�㗟�����i����go�8�e��#8��J\kEi�>�SY�y��Q��SA,Z���a\J	��r�XN�����{F)\����W�ֺ���O�e%��[s����ǧǶ��~?�;88�����V>�D�@�X��|����/�[��mt ���-�+#�1"#��D!3�HwU�=�HEe~��IL�J��v�~XD$8@�6*3�U!����ZY�F�w)z��T�$���X��X�ю8�MH"2�2�`�>��\�Lj���c�JEN'"JGOlG�"f��,��j~���m��,�ѣ�>.�s���5B]����>Z�~��?XO��L�����O>���zZ ZOBf"rK�4H4���lN�"��Y"sL(P)�ƈя���v�}om������.�7���E�r����5R�U|�9�� ̉L�`���=h��@8_N���@�Y۶������Y$!-��""�DB�bd��A@B�9��2�0��gjf�Ց��iG;�h�APj$���JJ"�$A @r%Rf�1�tyPe)/J/����M�R;�Y�}�7�
��r���˺���i�"I)u9m{�ы.{���(�U�����>���{�eE��$p�H��Or����Z?z���V�<}��� �6�4f��B��ov�%�#G�;@]jEf��H�Bb=�,gvC������f��9z��5f���Ĝ	�5"R��6��v73�D
!D|E&�>8-=��}b���Z�� 6��|Ǿo6#��E�$e)��r>=��i������{�Zk����,��uFD�iY���˘4���}ԡiI9��N�uo='�Y#��F��z�0+b��
����T�yct�h���e�
D���t�> *E���eaf�1D��L�:s�[� ,PJ�RQ��ix��H'U}�������c3w`]J��o�NO������qa����
پo�6Z���J�h^���{���6>�c�����}���z�X��7R9�yZ��haD�$�"��� ���"kwy�E���̑P*-K}l[h(Y�><<=>|������޾�p#�"3Y*�R���͛7���F�Ҿ��~ذH��Cbc����/��މRX�dJU���:���:�F�J��
�`��q4��`��z
�nV�R
�G���T��JE���)"����~?2�
��뺪��U��R��i�(�O�3fd8�h*hTb!]���Z?�UX���z�ǡ�0�g3a��x&��;j|��Û/?���c~��B||���˕��kށ@���B�ZD ADZBO�! �j!H~��Z�2ݷ�c����J)�,Z>��3����ֻ���`��C�aJ}tD�H����܊���vc$��.Oo߈�z�cߎc���{D�E�ZO�z:�j]^��U�	��Df1P23�֞?|��Rt���R�S��.Z4 aY��;�WDL-�@� �1��m7bzX�p߷� "��$e��DZ��6ɕ5��׺L�D�a������)��Rq�G�	���M���A%^ץ��ۇHjm 5]�n#�4����DP�$!��n���v9}���������\XL���Ϟ֒6�1:�'R�Ya�ޏs��"�DB��4+@�r���g=_�m;�����p�u�s�2><�щ�r���v�؎9�-ݑ��qߎ�(Z�5*��l�d���o��
C|}M�m)|^��ÅX������}t"I�L�Z�D�L�p~��{o=<.gaR���t:]2�ݙ"|]�0DP032F7����
Rd"°���b����6�Dj���n�����u�!�&	bX8��vl�$��)?����������sxo��a�7ƨU=\er��|�v? 2[���km>l��e�����Z���nᔰ@~��h}�oRX��ӧ-��c?�3����!��yx)�(!&"U�����Z�0������J
��{��UJa�B^N���L��dnct�62���{�E�b�#�i@���m�H��z�msO��8̇�@
�	 ��[K3�Z���f�,�Xh��lG�H�8?�Rd=�j]�۶owa�\�"����.$*z�>U�C F�R�#���L�D X�#�%|��l��*A�ss���c8��c��Id�؟.DZ��)�o��E�,��T�"�4FyDk1y�I	��`��CQR$�&K�(�!�}�-)ž��]�_|�D[�1�e��آg�n>"��j9�ZuY��Xu"V\D�Yo���hB��iQ�<��Ç$nic�1�O�t�w?{�3P���qxx���y]`��
����"2� �dp�f�Gs���+����GzDz�#@d:�7��2���\�����^�˘��,��U���C�E��d=]�:E��o��h��h\=��8�_j��E�Gov�Z`���ed;&�oY�G����1Zǁ��c�r��K����}��,瓪��<?<�R� @B�1��`�je��Gk������Hf�����
1J$*�I$��J�����={��Z���Go������NW7o�Az�E� �jUV!BĂ��"i��FJ("*���J���=3!<��,D��eYk�=�HpD6����=���`�	#��B�)	���[�'��G~�}`fRY����U���ZP2�{�e��/��O����v@�����-̵(+�t.L���{cL��ݐHKB�v@�Y��)�úgd`t��UVd~�|ÑeU3����
����~��1��ܾ�R��ݼ#80q$u�<��w�w"T�s�"���/�K��uUR��D6�����u��a�>���>��D�%o�|z|{#���,�-s.$#KeaN�c8��hR�D��L����$0�2��)Z2��*�Z����[��T�U���q�Ç��[ocR7�LyY�f�z�"2�t萢X�J��9��9$�EL�,U�"'h�uYY��"�[�t3�Z�u�,��W�m�zۙ�� o`�(�t�ּ�d��є3�82��,E��=Fb
�+�vx�g��n��[���~��a���<?zct�3��"���:�ԯ��ʺ�۱m��=<,��UdE�K�1"b�+/.
��;��^��"�8zj},E�Ā�L�9��ѧ?�������>Z�q�J�6"_��QK}��D�pD��ɂ@��̷�
�����e�zb�O��^^�Y"0��zZ�����x���[ks�L��Q��E���2SmXO�E�U����0��b#�f����!�n�\�I��]ǘ�f$��!a"$|e��~�m����L)J"R*
�[�0b����m�ˆ4��u��j��'"2��c����}�c?l桅��q�c�f&"��i��zM(c�p�}@�	 ��-UM��,ƒ�^�p�f������{��HD�.�v��	���f����G�������%ؙ���ϖ��/���X�O>�0��LL���}	�PΤ\P�h	��h���h)�����‘�H��l-�u%�8�Y��t}z|�?�E���ÚE�N��_6��<`=����>�}�c�+�ZֲD�H��u]��k-���rY-EU_Cu�&��7ό}�60�e��q4�ѭ=��P��̿��0`��V&R���zw{q��5�Ù'SgNV#bo��L����n�V��͛��Tu:<R�F�b�����L!
�1�lQ�3z�����A��!t"cX�B
"�D11��Ԩ�QGSR���D���Z��ȧ�z#����=	?��qADK�]���"My!�aL�L���**�a�3��$���c�dB&�9?@'��TY�qֲ��e?:1i)�~c`�2�+_߈�E� �t&"D� l�Z;���j�zY�۱�a^�%����D�t�~��Hf�d�'d;��
"K|ʏ�LB��} !fTb�������6�8�1��
�-"	_c�ƙ`������ڶm�}t�ׄ�@$HB��%��;C�
3�{��4Ţ�4��޻�2#_�����D�}`��	S
�$���c����PL-%��|��I�W��/-,9���X#	�t)ٷH{�8�C&���s�Z����p33�B�Z*�����y�6f:ڄ�"�O+	��3��\ُ���Ah��Ԝ&!s#�&	��CD�e�dD�a��$�f�FD@�3�iJF�{"�XDȌ�ݾF���; LX�D����e}�ջ��U���އ{dF�������C�6�����0�Ӻl�>�m��1��fSH8�@Œ �?���
#��5l^�w��c/��ޥY�%��[���y����9�@�6Y��4��)2��M6ɮ*��̈p�
<QFE�1�Ɍ�p���y�G��m�ŜA�9ӳ��X��&�`���X��e��?*��m�S�	���fo�?q� �/�>��H$'���+�y=b���oo�1n[۫��X�GD0�2Zk4��9�'�$�;cd�u�ΈKڽ�m\c��Ϗ�u;��_~�!`�J!��9���m3�D麎u�Y�9'S-���_c>�8����8}<�co7��fv�5�
_�e���U��2A{�Jg�iT��%��Ͷ[����:�_j=��GQ�#Kh�_�H"��c�1�T������F���˵�m��y���όb�@2	@�@$�(B%Mܣ���A�\(DpB$�� T��'ig��#�>IY�1�38P�F�{k2�=�g������Mw�"z��y �$���	����?X۶�n�Ef�
f"V����z>g�~o���+����o���QQ2Eb�z�B1S���YU>�y���*�U��̠�����Pշ�7��xΔ$��^w�V�Wf^׵��ki��r�*,��,�����QU��}'Q39r=���:Y����*W�:9�y��LVc���E��D5��7Ӎ�A��b�/�vf���S��rm��h���uM�b�W�'b�\��b���ʊ �̄�\��Df��z�FDQ�U��U�̜�\E�qf&�C��B��ç/ �l�10�#���ʘ���1D�����s�"��/o����I��J�,B��M�P�bE�U,�D�Q�xs��Z"P��[��1\�n����d��6Ӗᕮ̧gA�}�>$�����W��Y��!��q\Slg"Y˸p�T�@a��A,�f��cp�u^�qfդy[bHQ���]�܂���v�`F�W.������Z'�mﭿ10���:�u�eD��8��JzbR�/�o��|z?�1�じ,���>zW�V>���+ba�LTE�z�(��(V!^i�����٘N&�F�c��T	����(0�{�uMI�ʄW�’$��&i�QQ�~<?@H�u�t�=��Q��s��~���|���j=����,���e�JU�55S��!����yr�I��o�<�Ǿ��+�Ĭg��Ψ�xT��ITbz�Õe���#«@�&��[�b���*�!z�����~��1�1�Jǡ������}�o�Of�*��<F�PU�rw�a��V�q���0���JS����h�n�7f������y�<��DѨ����>լ�+���o~�ӯ��_�_���-2E9���6}c��8�irF�H� ���V�T��"�~�3���"�f������qxDF���u�*���Z�9��D�3�Rj1U��UrF���ӛ��k�o7-�`-
D~�ͯ�ݲ&����\����d��δ�%D��J��Kx�Z9�&�RUI�9<j�m��۶�j�{8m[���ï�T�Z[�90HjΙaٶm߷}�32��oo�����o�y>���(0��m}�r/�"Җ�|-�A>�:H_�PZ?3�")��������E���o�Z�y��[�kq���>�R3�9�rߵo*"}�*Bĭ�����X2.c����<.�)FU%��3|�N�EE�X&+^���Jd�
�yx�}��5����(���m�=d�s�t�L0F3ɦf�i�#+#��J/bj�B1Ad�t����x<���cŪU���%%B������Ҕ�2�W8U�@3�
g��,W��jl�z����T^R��f޺u��œ~�Ӻn�����*o��կ�>�㼮��Ki��}������o��Ȕϟ?߶��a%&Q�r�V�(�UƯ�c�*�PL2|�j���M�fӌX{&��*�j���
�I�s
��
��Y�zc�f���n�}�nfB�����s���vO�qׯ�Ώ�!\�E��a�f&[�DY��u�,⢅�\��t�����#<���%q%D8��#ܣ�l*����)2ETX�[1��D�+��8��:+��Y���HI���If���0aTu߶�VېD���'�����&�UEH1��Q�ĕ�%���^Yc�H@T�\���9����ޘ���w�w��$HҦ}�ڬ�U�֙m��͚�p���T��l�X���y�� IDAT������Zb���Π���,V�L��j��BE��Z��~_����g��T�1��|fo�Vy���[3a���3;��1�����z�Z&�c|z���\W��Ec�"�1y��P�Xw%B��Q�Uƒ�MG`a�,mˊ,���Vj�]���.o�q�֑����g����U���DA���p���|.�����O٤�yW3`�����u������S*+���8ϋ�HT�T����=�|�6!��#`U��E��~���9�m�_��ڞ�Lu�y���Q�ʫ02�:����~��He�IF.)Mk�L��5�S[`z�Ė���z�V%�	�������Q�$+D�,A�s���D#�1"#U�����wi�WD�7�Ȍ<�ӝ�����<~����x���-<��:��r��։�Td�r]\��f1P�I(����9�5��8�sE���4rQ1o}����U��� &�6�Ȅ$b�=bR�q� ɠy|P��w���h�#�������8h�ϭIkbTu�9#��jD�GT
VH08�T�9�**� ��ƙ1}���E�*���'�ɦڒ�VY%<��_�
}{���$"���r�5e�zY�#C@���l%^�8cx�y]M����^'��wf#VbfB��D�g:Kr�I��d�(��ڽAPD���y��z��I��|6�
��ڈ�r�=*�1��I�x>�y4�Jij��<�	��qтD(�E�͢JU�f��"b0����C�M�{�Ͽ<L�7%N������դ{T���0�Ql��̢ܛH�0`�B�D������~��
�;#b�N��>LUi���ၪ�
��U�D�,{�\��M�ڬUD�l
E��k)�1�i�;�##�L��5�{'L�c��0����+E�1@��=�#]d�����=��n�����@"��}᩠k$��t�{~4�i)
�53W�~�WU��<�'��mg�b-bI���"	R���A��5B�s��N9���HZ��u"a�u�D`��J�ܪ�Dyͳ%+cm��x�����y�k�&tۛ�03Ed!|^���@�/�T�Vai%S�_��^TT<Q�:���q�_�f���`e�q�I��*/ʕ(Q{���缮1�W���H�PPDL��˅ij���l'��$�G2�=�v��D j*BsҶ5�9|���m�����e���[c��7^�7P\�32���4 ����NV��s�����F]�x�,u�v�,�D�LXX���M�|���7طM�#��֩��猜�w�q�o��ǹm��32s#��m��y�߻�_��_^?����YJT^G�fjb�~]c���4(��D��&hT�q!+<��pUe$Ι1���*�j�F�YU���vQ՘fZLYi�ED	�!������ �¶[��?B6d�1GEh3�#�9ì���^ӳr]�q�$n���2��R���b�F�քd�QR��������"�R�DĜ\h-��;q)D��8ٓ���u�3Gf5BA�AfQH��~eTU1+�ۊog����,����V��Rf1T$ f�墘c
��D�����s��u�m{���O,r��Ɣx`��5�HLP����/����~�������,�����3���Y�UL�j��{��D�ph�7j��H.ֺm��>��"�9��Ă���	3�R�R!�k$e��@&G*�y����?_�2��w�,gʢF�k��u�#���(�c�\Lm}!���f�!�n���<33�.�L�v#&j�Y�5�@US�M���k�ϟ?��zfΑ1�Z�Θ�ETpz��D�,�t��p$����H�\Vv`!@T�V^�
�#X�羑ȧ"x�B�h�|EDTL��d�H:=��Δ�{�z&<F�ڶe�aMT$��f��~��ϟ�lc������DT%
��3̙�cD"��t˝�J2K��*�R[�IQkbf̬��caY�����m��9�� �?�㢌~37D���t���������c����i��x����X-���E����B�Xa�%�J�#M��V2���JI�/���-�3���Db֤�bS��ۺ���{U�* �s3��5�U9�(o�
s����P��bBo�
g��T�1fE�K���#K�
U�U�aM�#s��U�BD"��Ȫ�m�E��&F{���1'@jZ�9\۾��0��U�5������}L�z��1���E@�#j}o!uE&e.�꺮 Bf��VqMM�fb�kx�YT>��)��X�<=��KG
-x~�LfU����q�
>�`��/a������q�BN�d���z�q��r�uU'�DR,"���2��(�Y�6b!�DxbQT�9�V�Y+K�3	32�H�P����6G4���������9��k��D�qE����P���fF�d�0E�D$ �Z��aAr&ZMI�[�7��Z�'��u]sN&*OZ!��5�$2�ʘ�y�kΙ5�7�c�1�HD.�����;2�v��~|�6}��=|��+-�@�ʜ9�,-2�UBU�~��p
�1��M�w��wQb��3h�Hʶ�sLg�.b&�,�}x��㝠��� �� �����N��[D=�q<�:�7N� �mf�*k��?�s &�%x[�b��9F��x+�b5���q�z�P�I��BP�(SUD�^��*�5�QL�T�H��繚���Y.��0_���H�F��j,r�1�+��K����Pf���*��cYklԗQrݨ��*�Y�
VV�kĜU5}�1笘�IL��[f��y~����&��x���u߲�q~\�,d�b��a�k�
��w�d�C�Ru�̞k�ʔ%�m���v����1�I�x>��M�1f�V�H���J?`�]�3�5N��x��w2�%���Ƿ�q���V����DI�yRxV��?#K
L�MEMI������5�Zgb!
�+|J�+;ϑP�39�	1!�$�ED�9<�
��O�A��ƨ�/�y
�%�Ԙ��"k��`��7��L�TL��P�kĸ�XUzkF%��R}�"�����y�gD`�A�n#L�)#&��q*3����Q�eL�XƜuzƬ�k$�����~O��V5Y��@x���������(�/,h �"�	)��d��R�s�����[������̳����1��93�o��Ҍ�J���bwUU^d,d
Wŷ(Pi�x���||}�Ϗ?�b=��	�H����%a_@ȵW��$�&��ۭ�}%K[�ބ4#<§��m�}�+y|<���6<����T@������w��u<E�YƜk�_3�*����d�=��Y0�*��f���z��s��q�p�M̶"n��1����i^��\�DSef�$�*��/�Wqf������\���#�|8@LA@�[�Ƙ�?����9~��_~����[�׼DTD<"����������edE�j���4�m�}n�==�q|<�kTUD��&e�2*SԈ�gd���0�K�1���F!��v�_�>�|��=�+���~\��ʜBT�8�u��5�$hk"f,&̢j;�.mH}֘U�����~�����9W$1�I�℀Ԕ�6�IC�y~�x|}���Zgٶ�VΑ(ePDTѾ�Ltm���K̷}�b⬈�#K�*�m�P&(G�P�͝�71�F��"�w�3����2gF(z/Њ6���c )ˁD�WE��3Q�~}���qxDE͙_�=�bk�5�t����y����B�.F!Q��0�b���#T&	+��Xߪ�Y1�Yh����He�q�����u�/?-3��u@4@���M��_N�_���q�߾�K��m�k^ǙIk���\@N��dHW�*�$�����Lepe���E �Ws�fLD�6b3�%I�o�R�(-��$	s���"��Zo�n}�nDx����K�M^X��s�',<�kαjgQX^&�D�N�3N!���(
P1���3�X(�!��P�U��>��T�Ғ_�̈9�9��##���Ff��x�O_:q#�+�1e�ȫ`���)�B2;9��DUL%L�i̽o�?*���"X3VVV��m��IL�3ƭ�n����Q3:��}����{E����:����SKa�x�	&��"#������XD�zSU*�J. 3�5L{�f��(Ѧz�3D�gU9�#d�o�gJ:�@�-���v�eT�s�kz�����OwNT�y?�3Dؒr�uR����"�d��1�<�J�!j��{^{dF�.��� N��{f���S��_R�1+����c5Ϟ�c�C���O�q6�h��rfF�يe�B���x4(�1������]��'n��e����q�W��N�R�t�}�ۭ���Z�{ND��H��_��w�z�����1A������k�/?�?��o��~��|^�+ݝ�(��#˩e�aS�uR���Z33�CUY�K����ݯѬ1%h
p����"f��i{��b�m�߉P�	���,��4L�P1�s�nEQ!��<���Y��Ӈ3��Ӂ"%��)2�#���v�̪�(LE�
{����0�k�9���5ǘ~-�< ���
��q�5�`�gU*Ӆ%��v����u��`b邗ݕ
�U`��c��@�jTԚ������T�q$3�4eS��8 �Ǽ��O����G�yQE{�}o��$�����?�!�=��YQsF~{<���=��+���[���Ŕ��� *&1y0V,�H2K��XUa�5T@�N����>��lW�U�
��d���~��rM�U�AeT	SeP>O��O�g�Us�*U����nܧ�r*˺ի,��n���1�_c�K "Y`&�s��V�B��gE�*��J�E遗_s����yGV]וnf*�\�<�g�Z���˯����c�3���A���g�
�h*�$��y��}�T��	�pB�ֺ�O�faNkm��I�u�9/UY��,�p��y�1��9b^U�R��'W���÷���J�{��zS�C䴲zk[k/�,����!TD��3�Yb�B"RT����""�S��WXdD�u}%$��*�3c5^*��� ��,�q��p
��\���TP��h���z�.E�(/�U����֔��bN��,K�'"�uU1aY�����Z��E= ���_}�n�_�����x�|<��1�G�c�,V�0�m�P�׏Zom[�$%1�M�r�sie2JE�q1A[�L?ݶ�y:W}�����h�QF����g��Nw�3�\��$2}�t
R��9ψ��_i�2.�������8��?�5�[���������&�d�AUˢ�`j�e��ԕ��k*�
&wU�������u�qle�*_-f�^�m��(jf��^@y�������X`����;1��3P�,J��=Y���*�@��*�hזY(^��|ٵ^_9�z�u0V�#��R%aQD��$Tb��=�h�������Ȣ�day��EN>�'���9�+���Y���۞Y�"���J�+,moo��۶���'��O�?iۈ�����M�L�[���Q�<�SUz�S��U��$�m�>�3�~�qKNm������y��u�90�C8��qe��dZـ�5r�pe1$"�X��� �,^��܈���
D������,R�b>̀�}E
Q�l��_U�̢Vq	C�� QM_N�c�Y^��*`�"��X��1F���}��n�M�Yc]%��u�Ng���Fd5�">�k��G:�D���/����Q����ua^�U#[�	b�{&e&��=
�_~�
(T����Θ���@f���OoH�o��UU{�X��;K[z�\ TU�J�e-�ں���NQ�"��K��1+|^�(Ex�)�۾_$���9��]ÿ�`����oߦ����}�'��JE̙����B��H����1@Yj"b����؈@%UTEJ��I��W�2+���#�UM���sf�8�,��0�Eko���S��u;_X�jƸ��ӧ�m����1�bPe�T5Qkxe�q��=���.�rf�*=*�Q��>��|����m���lۖ�f�Yѣ`�X#�W�#|������zx�|
׈�mEc���ͬ������Zo������4Q��:	�֬u᷷�69��x<�r�Z�d��sN��[�3<���Fđu��||T�*e��O�XD����_���?��Mr_s�B&(�@��&�$����c�����~.ʀ	q�J�J��J&&��s��p,�
� HF�$q�L�:�j�?1��㺎9!�B
c�*f݄��9s�Z����ʚ��֬�{;�WC2Xo�_������<�%ExEU���]��KD*Ɗ��q�/�>�0kz��y�>Ff�|��$S�a_��� "Q�j��)��Cи��tB��~�o۞�����˧ۯ��χ��|�Hc}{�ҷϭ������B2T(�n��_~j9��=�)\��4�ē����0�D��P�r{:�?��q^����B;�������o�q7B���Ut���e�}_�1�q��]2#BUb���Z1/Z���Т�EU�9U�0_ሥWY����0&�E�jӫ*P�s�,�s�l��J^��&DD
E�Dx>�sD�3�#sTI�T5Τ?ED�-e�u[�I���"����<��1��z?�U�s^��e�#��*Pan
�<)ց�"��HUA�+�=��C"�QMu�����o&�*��.f�/_��mQU%( A*�H(�d�RQ��N������s���u���Bk����P0�!2FĕW��q>~��_ގ�k�wb�������7��,�������3�ڻ�<χ���m��7Z��NA��.*�������ӯ�QD .*�9�J����Hյ��� f��"���p�Li��z�Y��n]W�!��������288@&V�q��Mj*Z��Ϙ^�w!C�M�u]�R�֥��o�9�s]z���㒇dqf�iI�m$�(f��D�=��I+=�>|&�X�H����f[W�����m�`�J������IB!�*T�L۶	�Ŵ�إI���s �L�o��e�d�B����~���_�CZ�J������������2�
�g(�ң���C��Og*�:�8#k�Xs7�&��w�=�I2Q�)Te�>���	���_�g�*�B1�=��QIQ��>��9��� �
�����*�<gd�媒�ˊJ���{���8KҴm���Ľ7&�����YT	qk�i�yeͨ�"�$��Y��m����1��:/&^��%8`$ʔ�:�8D�����a�A$@�W�l��Uo��~�5+�P��d��m߶~����Q̕�T��bU�.~��0b�v.RqSUc�8�Wkr�Ҿ_nj�sΏ����w������0�x��y~j����ND��Y*�m���p��+�Pf-�22+����{���%BQ3����&��o<���F�8 �\j+��Z��E Ϙ��JUef�w]��s
�5��D��dxz��qfrƼ�(Jt��_E��}���1#߅[�*k���Ә���������7r^R���9ָf9p�HT��V�F�G=8/_����H�~x�D���ɯ�|j�Ց��Dl��#�����%�Q�|a뿝��F�\׸�S��d����Ԙ<G�4U���
>�F̖A�Z\�g��xֿ&+�7�'�����ۿ�/��K�I��8ݝ�JHhVT������y�dQʈ�~΁�m�mj
�E5#���d�bqqy��*�	�6h\��QT�q�_2�F������"BT�WU1CD2�H$ң*��S1/nt�X��bAyD���H@�����ܲ(�{�x$"YH�k+�{�\�Ӊ�_�T}M�+=��gU�01��T����8�\�*i�D�*75�~�r��5s�(�6c��Pm�5�,>�93b��TI���NF	SŊD—��YHԲt�I�lL縦��k���߳������oo�T%���
[����2/�`3p�GSMU	j�U*b/0H��ܧ���K��0���-̈́�bdz�0�5�U�D IDAT�s�c�LOp�׏u�(�����$�"�jz���s���_;b%�-	9c�1�y�1�1��,D$�5�#�FF]�u�sN~||��K̹��IT/._exe�="(�֞����j&�Q?䚋�b�
 -���EDU�����1+I�T��@U@��5U^Y��y�`fD$�U�8N�K�q�sx�L��������q�?�ʚ�������7o
������n֙8s.B��_;Sa�n�Z�yq�*�k�c�t�u�]~�4����!�����DTe�����tW =P�Y�U�gd ��Xd]-H�GULf3�H�9Wa�$��U)��U�[�(r��X-�bFVt!�F�k�uFD)ʧ_c^cĸ����y��|�qo�cIr��}�����Tqmv�lj�hZ� @�����FM4�Y\�X{f�v�qw�oӅ�$���Y]��m�dF�o������LS-�N�	�n���` 
 ��������������<O�/n��|>��J�\'���u-L�r(�f�H!bK`D$L*3RF�Y���o۶��4ՙ����궯�������> �����7����_�,�?gXM{���_������?�)u��ݼ�M��j�@� B4sL*�D��{vaDBf�4�OC�4����=t7"40�T�75���BHi
��TH��m�H�9O��X�A��b����2��%"1���N��"�3���TT���P�"���X��3 a.��2^��NԈr��Pj$!�ka�~U�(!BeXr&D�kƀ�ԂnMa��2G��2a��3��r�755��X$�H"�l�ĉ������!�\%\#�3��X�T�H�f�";׌��$S�ܛ��9��������/�����*DB,$�2y��0���_��"2!�+"��;xP���Fĥ�A�1�!��ƀm oD��_�'x($DBs���>��F$4W�)C\X��#<���gF������1��2|lqAdb�E���x'�@x��h����wS�OJ�U�q��뺩��d&�޺�����U�	D�bw}�7�����b�U�����I�Zx�nf�c�p�3�z@e�T����B9�d�w��c�C���)3Um���:%55L��Ixx�ڧ_���E��O���K�W�����[�`*5	9���
O^"M�}��Q�#P.�n�[G��`!�*Hy�w$�{�'`BA���V�C!�(����q�"bz`
 ���9ש�j�/���!=2���r-#S��?�!F~�%D�Zoµ2'P#@��强[&%b7��Á�� �<O�Bd�;\��FK3 � �Q�!	12"�"(LO3K31;���\\j)�� U.�t�x���mg���Z�-���E ��"Ӊ��=P3"<R��[��p)r�[���<(�l����顝/�?�� }{��oN���	����H�h�ȑn�'��
�0B�,3���<�2.�,2az7SÌ�H���ИkD5�}o�t(��8��M��Yj@ӑ>�P�m�nѴ7�2n�Œ��0ڷ�<�Ȝ��,�>�=�1 00F\�$��E�N�V�3#\=l۶DD�ޛ��ty�Z�y�������L�<�r�2�w*L����ƀ�f���e<׏��gD �4�'����r�_�������+6Z�t3�=F�lPgOڞ7��gz�Hh�{����T8"�GO@����[o�j���ڿ������'_<�ǟKA�k����ȃ�~��32�sp��&p����{7�H���֞^I<�k�еĺ�9Q����¨��,��wU*%S��[t������		�t�;!"B�J�����d�KBf3k��.j;`q$�Gw�{_u3*��"����O�SDPPJE�dfU���"�D�8"�VI�A�3�Q'L������!��(�P�G2�/^�~Y����90�
I�����Hx8Tij��)@ " !"Z,�41�%PΗs73�D�;%���鋯�_=���ھ��_�?8Pw�B������	��!#�Gh}($\�u����7�$�����;Dw�X�̠@hZ�;0�aq
�R<�̅�2/"%/'Su���	(��b�w4F&��mU3�B�I�}�������R8�2O!�Dk��z���v>�ՔK�������o�(2	xlL@"y� �h�DD���c����5�轧 sqA+��kS ������~z>'�e}�k
)u&��|s{2���M(0�O�o_z��|ۚk�M�@���[��������/,ȼ��_~��O���s�f�AqPhP7�HW��i��<"��U@ޣoC��I�x������$��j	���QD���"B#�pk�Oe&.�Y�d���r�d�p��m�6��Z�x�Ʉ�47���!�$�	U���!G@�Œ(EJ�mlO
�(D�g���2s۶k���u_��-ں�@4���@"dM�j��M-�ݝ	�S�F��ӈx<�d�2�FddoLP'�����tz:=>E���O�k23r!�B��tN���$�&"pQ���7����|�Η�E��)���������{o�����ˮ�n_��?�p�yj��-Y�sP�0P���M20cLM<�C-¯����#��������{�U�
3�ܪH����C��$�0	e���)!#b��sI&��^����r�a���&B"�‰@��\������nl��Xs�cB�i�k33C�ZeԪ"��=�Ɣ����k�e�PD�L@mı��@	��4LL��/�]��&�/o�㋃0�R�,s嶇`s#�I�������{k��	���DP�ҁOO�};m�ɬeXx``����7�_���/~�k�ֿ�`}��w��ջ��O�9� "��13 _�Jȡ!�")93"�i$�ٮ���0�4U�@ȼZG23F�0#9��0frz��[d�k�Ӽ,Kf0�DܢCBX�������M�0�h�(��ã���؃�x�g�"H�,��c 73�L
��WO��#���ٮ�@���=2�d=����æL@�a2�T�̈�T������05#R}Ȉ��s�W���;i�7��q:��~7S�2 ��	�	е!IF�jg&L5��u
;]X,�ytH`ψ�R�>����Oo���3W,H����g���9�*�T�2���*�b�����$S�+1!d�K)���WW0s1S������#X��#����J7
NTČ��V�^��R*�"��B�<M˸}0�<�%��:��{b&�3�KF*""2v�j�E��N	��Z�m�}W̬ۙ�ޚ�G��̯}C"����ª��>1�2~ND�	"!�}���^s��ߧ�2���9�Ȳ�����?��p��J-wǻ���R�Zy�!io��V)ĕG�̝��d�*u�{۶F��7���U5��9}�x��/?����?����} ��ӯ����/~����B�;�۷��BH�`�e�T[�@�>�%a1LU��H�̥3����fY�x�A��",��K-B�aͼL
aT����/fj��ur�.&BbD(���TA~+��0!Xo�AT�[�mЋt�[�;��jF�D�t(<C.�e�ɇÁE"�t9'@���p��r�P3)��y��YF��9��!"�2~���Wu�I���Á�d�պkJ�����:��	j�D�V@$&M��x�u�ý�nM/���K�Gl���û��`�}���_��_~����o+�
�@j��Cd�v��5 �ˠ
3aG��̬��"�&b ��"�i��M�&�tX�h�=���ל�q���)RJ�)����L�L���'�����%�A2S���fr�pF2&b&p�=Ѐ��3!���wo�" �MUGz�},�0Ղt\��y��C���/_�-˴�}�-�����y+��\�ه�iwĄ�L�p&qψ�R���r��x�;
J�LA D�BKP��͆Jj7w@��2.P$P�Y��nnnH��a���{o��;��H0�k��E����g�~���7ZX��=>���O��#�t�L��B”є�3#3dl�hztd&Z�ʰ����*\(lj��F	��<�Ñ���j���Ԗ�2`WsS��5�" �4G6̀$J\�CN�֓�� �L�0���cԝqmO���Wf�$1��M#�,z_����oۖ�,��"SfD#	�Z�&*��� �w��/�==��OM��p�d�f�[.B"2���I���@�����z��L�r�E�JB8�A&W�"b�R���
TOϧ�������G���v���Hdj����z{sn_}�����o�IkO�����/��Z�ybL�187w�9vO3�F`�p�c5�Hh��(��Le��p����9"��{o���0����ױ�=�M���_R�P�o�DRd��PdfI5��|ٞ�c�u9&0I�:Y�vݷ��aM�y_����a�RK���C���r<N�"R#����$`����T�^�9ҵ�4f��)#ZD469�eF�*����>���2M�≈<�{���_Ƹ?�H�$�n�8�l��s�� X��j�ޛ��9�!�f�������ջ�����O%���W,���O~������pS�<M\*	���H��p
f��(L����U�m����2#e�̼,Kx�u;'H-n���H�U$=�}����p�=��Ừe���]w�RX����a����Lf��� �Ōx��I$�#B�᭫FXx�S�!G���VF(T2�8�
"�z�(�@�i� ӻ��		LR��������B��M=K)IL\"L��� �Y�NJa����#2J��m{k��(R�R�D
�"g�����`�@�Hwk�[�]u���Zz������~�/�����t���Yf���	5\d���x'EL�D�kړ3�g
�8��@�N�]<���qb� ���+���"�\Ě�@Oa����*�`�Zk�i*��˃e#��ɂ����;w��77ߴ�ʜNK9��}���m��_	HfD,�h�BZ�i
R߶�w�����։F?� �]Yw�����L��7�Ln�~�ZD���2�H9,�<Mۮ#6B,5	�53c��2{W���"}�L)���(�yc�Ll=j��{�4�p�m�Vm_}��^.����؟�/P��_���"DL	��Vf�yZX$��-$麹3r��Rq��C	�H��Q9Rc����zcL(�LWc*$��uoCόI��T��!k��ڞ��V'4��\��i�1!��$��ɑ	��tWW��v�.�}���i�/�z�V�����ҷK%`�R*aEb���L�P)2~憜�4!U�}��u�����4Ԉ��kv����áLeN��Z[8�/K��91D0��Y��}����������vn��t~||>���ݶs�&�jf�����(�j�R�f�n{k[�|���_�V���/,���}����N��T�1��|L��F�5m�p�
�$,S����9�N�U��4,��="�92�w����i�&��I�e����z�P�j��ᒞ,L8�ZL4�RDD�SD�Q՘% 30�} 5���/kkm�]MUu`rL
"s;??8�2f�3Dq�p�4��X��x�g�Do=3��Ǚ.%O���qݚG*�0��2M�a�o�����b���+�D�����ps8Z��es� y�lۺ>������b�����y����7p)<K�aQ�m7��L�<-�۹Y���E����e������Ǘ?��O�L�8�ܐ�ijf��f�	9���1�ʙ(��p:�Q�!���,�J�Re�B�k6��e�.>h#�,u�B��3��*d���gh�R)�NS�b�cPI<e�����y�o�o�漢	��f�.8��kdL�N�K����4�S��z�!:dB�]ۦ���hZ�2�U�}�,�>a��勗ǻ�����Ջ�7u��Z�y����Ӣ�[���/����n���kx�p������L�<�T����U�
YX�JQ����r���鳏>���ﵰ��v����o���L�`f��[xwU3WU�@H�fn�I\����VaD&&$NK��w!�R�a�Ă�5�p ���6daJ�ZEDXj)\�B�P)=M�x�t�L@��Z�X( %@B�������f�Z�[�}�9.�a��@��=3Y�KbSǰZJ��	YT���γp���'	n{��	�U�S��%<!R��N#�tP7�p�pZ��x��ts�y��մ��=�ݛ�������|:���{�9�'X�����8"��²7��{� ��L"O��e�ΗK�wo��^Ͽ��o�_
�l��-@ƾ>�����2W�b���ul�&F�Y�qmQ�G���rMC!�T�4uD���BJ�1{ŹP@�����0$�R����$ &�P�͵��@�D��zo��rk�t�Ld�l`��[���=��[k�+�0/����2k���j-\ƭl�&ba@l�ᙐ8��ֻ��!e@>>>�<ߌ���i 3��,T��R�BM�*�V)�2����0�]��?<?^N$ؚ�}����A{G���5�ڶA�T+�f��Z*�z5�z�c;����ԾZ����}�:^��3�{������������|x{@�L�X���"�Y��L�3�dd"DF��p�#��G�gШ�3Rz`�bA�N(�Q�i_�W=d^�I�z�"&�Hw7BpwOO%�ӣ�ZFzt���z2m�]����r�"a$"�:bt�EWK��x�Te܊�I��k���{��id��G�晨`$��2E����QP�;	f��4`)�{W&���I{�n��}[���9,s�(�PJ8X�C�n�-"��w���Ln������O�~��i��U�-�Xcm�������xy'�ԂE��]�mDdD�h��[&b��"��p���*A�k�25$�<��<+YJ)�Ȝ�0J�	RKB�����q-ӈ�%
VF�Lս��n����׳�ֽuM�]�ޚ�9"��G@o=<� �Y�E�T���˻WSY�L��2-@R�m�ߋz���k�OE��(�
aI�R�0�i*ӄ��2��\J���3ˌ�q~ywsws[�R7D"e2�����OOO��O��s�����������X���n���,$Eus�0���~��W��_��o8�K�XW�ߧ����O��/~��6%B�h"����Vs7���k�D�cK���#}+(�H���T�
	,C<F	�^.LD��s-�<4�"�>��lf��B�Ũ)��/BƚI��2&mf����zn�`)"�Etu���̫
���s�Ł�2���y-��mJդˮ��M]{��Zx�4k����BE(�����ۥQMh��	Q�`���]<�����K��=�9<n����ǧ��cWu�2��l(F&���yfL���!<݆M��k��j�?>�ߜ��?�t{x��m.W�ra@�����?�?����խA ��JHRJ��b�} 	0�q��A=� J�i("�.�WD�n��(�ʠ졄�³o�9�a��*ٷ� ���r�#����A\�#?�n�EPZxn�~U>G8��H��hZ�������Nk��ޭ86�����k���m�y���}*���j��<�E��LMu���֝�Q�K ��nͽ����oO��7s3�pE��Yzzdb��x#w7��O�[��E{�~q,��>���/���Y��\U�~ae������~���?�����}��B�	��W�*Q�wU���Y��u�4HG	�T�iA]=z���,B\���0#RX�L�Sd��tC�
3���{$'ZF�_����A�",H�D�1��H	"�̭iF�/_�:ۨ�9�*�� D�Ǜ�L9�f�g&`�U|�]9 IDAT���p���`ۺ==��i"b/ra|>���YLȀ.�P��PF)\E��c���=�O���֚ZCDs;�FB�����(L��Nǵ�D���L8�j�����Oo��J������w���wy�f�Zoo�Ub	qWI@E����Z��f�	��9*QA��$up�c<���&�ؓ�"�2��FD��f�X�8�s��x�i�o]	���1�Lf*��Ⱥn��s�+AW�L�����`B������\�k�r��2z��ޞ��*R�ʧ�������ҕ �1c�i�����"� �y�\�«�a��NId��k{x>?�׶�۶^w����3=<F�:S)3*cg^/���E�V�f2���o��xs���>~��g�_C��XX�ۺn��^ �J*m�`e��5`@��Wk����6K��%H�@& �tbdD ��X�P���\��2���)\�M!rf$�{��y8X�EH��@I�:�:M���w�抌�0��� ",E��+�S�8�e���R��e�t{:=Gئ���1�"�����SP��a$Ef/��T�*����֭��N����ۛ[�n==�{���k�aİ�"�	�9�2���ށ�2��v:8"�,<MM���r�~��߾����z��~+|C�w�}�����?||��|�W�Y�3ǹH(�잙��F:Dr�XM�(���L�œ����@Rj$d	�6,EID�@���j�~�ց�&��H05C��L��-a�3r4-G�b���b�a*�SSk��s�e��L-�`*d��\k�����������H%���d
$���H�݇�'��A]���wc�\�+p�\��:,�t������v���LpH`J���3K�	�@uZJOcL���������޼{�Ϭw����?�����o���?�ްaU�6\�@E��� S�����)(�|>�H�H&NwMD��$)uZ2ӻ��<O���P�C%P�ko1NS!VAh�"6�D��b�Lt�k���a"!�*�_�Ƨ��˷��)"��T�X�x���憘[s��4�y���x�n,����o��}�mU��0BN��I��H��2�a]M�D�!���pS暔��CGA������1��c�G�"�7�1}����͡�zs�	�|�<����~������_����:d�wYXn����^��O~tw��=��8iWm}�F�44#����8��&2��"�J�L��N��9�R�P�JM@�H`�a(��˶O�x�c��:f-@����� ��1�����FR�\G�Nʥ{&<,�˻�����W\�!b���f�x	30�M&��zywj���>r�
��h�SBd23�f��)՜#�����Јed����j��=2�|�0�q8� 3!,9h\�=3Q���M�\��{_[�n���o޼{���w�������>�Ǐ��t~����H��P��z�`"��6G�6"	��L3S�z���s�{)�<����y�ɱ�a�U���[ۻw��Rʼ&Y�����M#��i�="Pjs�
V�2�M)�����;�}��%���"r��7S톑�,ű>=<��4���YJ�D��x`#\�,���j�j����~�� �#/��P2��t7U�{77ww��?	"2`�K2�	p.���F���΀Hضnۥ?��/�~�꓏������O�}{����I���8ž6������E��)�r�=�LIKq@�qy.�$nyU0@�9���LR�FB�B�{/u�ur"��.����i�d@}H��4\=`�������l���̷��x�����.���rf�z9�������[7c�@�����nW�/�0( �;l[��HaD���kU��^���ի:�H�H�����~Y׳�S���Ջ��R�i��z���i�P
F��r�?{��ӏ>�<<�)��o2���ֳ�L*/_�(��{�9���i�$���j5�!�K���M��D`�f	,B��zc���V�L&/1o�h���DD"#(�����iNDbdW�0"t��v�=�#{��}�N�����2���i���5����$n�w�T�p����B�d�趭�6�_"<��{k��"��"g���9@
���|�u=�N@���n{dQ)2�Vj>*�1hL������q�}��DЁ�[\�uk����Ǐ���W_~�!�����[�PP-�r3���Ȅ �
2�)d�%|��F���j��*2"��,���B��:LKR�V��d"s߷�#��X�X�`Dba���{�ޑƿ�"�mc�Z�M۾ﭛ9a0�H�$N���|Y��ߛ�i���H&�D��ә	��[��۹놐,<ȏD�n�#0KD�00|8*'����{�������
GPµ��֬�Xd��p�'*�a!H�n��?�p9�`�mf�u��o?~�����W����V�m���t�S��ò�/�^�uJHb����P
DV5WMB]��v75b��"�Z�Q̺�1�i�s�F3�<j��́3a��3�:�Z�̴�n���C5 ����z{��#�*4�B,�~z8=ܿѶB� 3!$�����w/���ܞ���msk"�Lf~=�y�=3��"�����M��/_��\�F��+����Px��)f�_��G?L.�y%�W��?��j����|ٶ]/�������w�����Y��ޭ(���ĥ"`tU7Q�k��v ��PG�S�ps����2�~EF��+� �f8
UY\���  �1Tu���i�R�4/�iZnJ=�����ͼ̕��CJA�u�|[	z���LR���ֶ�]c��~����}���|H�q=�Z5C��sؗ�1~�Lx��?���q�>�1�GX"32x)t{s���e��x�y�!̇�5W;,��_��p@.��i��?<�����/�S�w8������t}ںg!�m�}'�I� �)`�%3�H@�HaH�ݣEZ&Z�#q�G��Rƛ����6@@O!@p�p�t�p�9n�D	����"E� #K���D�b��<�Ԥ�d)E�Z�_�,Ǜe����W�4�纭��%�@e�B��O���n$�mW�	n��#����׉� ���d6#������'�������@ܚ��ʹ�a�Y�V����%hY/-�K=�noo�馉\"�=����k{���������������𶭗��w/g߻G9�p��"��r�5C&���W"�"	#���^j��T���3!	D*���v�b��f.���w2sb��Dw0$&*��:f�j�P����z9o�T�p%�@D��޷�Frd�K\2��dK;k�00����0�#�4��dU^"��!�Y��.�Iӭ��D�����Lj'��T2s�T�c�n�!8��B�L�dro�����u�ÿ��o�B�dj>�|�B�U��
`�jA*5���uz����{:��ܜ�>-O��mY�����<���:~-T�Z�z�n���?}{��ͥ�}��piW$d�љ!%5�N懘^�4�b��n>g�\󑆪�$)?dJ10�k��9��bjz�2�ju	����ͬ��k�m�Z��	�×Zt������y���h����	����1g&f����5��W_��@����ߑ�c8�u����)�\�Ԃ�禸��3�|�u:�M�����}[�����޾U�5�ի�e��~Y M�)3�pa��du�k3�aH�3z������sK{�"�L9��y��i���!�k.�H���H	w
3fʵ�D.����32Ô�v���c�1Ɗ �S=�*��[k!":ć�6]d��ж�m���>�TApN�1��=��Pb&�W�V�#ŗ 1eL����4�:����#�Ǿ��'��r�32[uغ=~|L}{�Ý���>^�?���{Q���Z�����/?���_� �ڶ/K���r)�����4<��ގ�	�0�2c�Ah���x�E�>�G�" q ��8�.j)1'���FD�K)̄D!6�5�H)g ��u�O�Mho"����]EO�֒��	�5���CFF,̉�)�\��#�@$Ĝ��8OS�%1�y�9�1lJ%���>����]�t��bv0m�ԻypYv�6y��>_!�&��_����~��_�
�m���t
ꌔR2�19�|C�B=ܷ}�{S�`��3X�\U�铉�;��G"����9u��o]'�����9�|(="sN�ԒrJ)�Tz��@
$74@��sD��^^��vs��#�r:��f�hM�&�oD�G�kNy��!�8�ĉ�~6EL�)%b�)��ĉ��s-)��)�jfΔ!0��ֺ��u�{,׶�{x�̀j/�dս�/ח����o�������U�o�&��۶zʩ�Χ�1t�U�0�DD�lbch�3+��s
$I��ܥ�CFPuMD�	���1(Q
 �`"�˔�r�)3q�R31������1L��1L1Q ���E�l�o7GDJF���"D{ﻃ��!:�#����`�s��<W@&"M�@@<]��) 
g�h�S&5�۸���?>}x�]_T�m����*ۮcm��O������&��?����Wn����i���Rr���`fa�D��.cGL����vD_�L0|ʳ���L�)���"23���2�{P�Z��s	.���9�Z�S.S�Ή���;F3~��*�h]��z�[[o�� 1r��&7���Z�!Ce��zxx0ұ�9'"J)�᫽;3���j�xwNw��e�h�e]�[�-�}���t���Sb��F��/˲~z~y����Ǐ��C��XǺ����7:l$�ZQ��8�P;y���0er7�<<�!8 8�!�ba���@��.g�H%s�)�
N�<�4���;��Ý7���8�˲����G� !;n[����۾\����qLjќ� ��~�Eꭋ�sJ��K.�䜋#�!
�i�[3im���r@
�4͜r.�-<LԺ�������v�����m�u`���ӧ�eSs�������i*%3�c$A�e:ͧP�idNbbn�XUì�����D(&L�s)GO�S��<M�<�8g�!�E,B�" ��8ժ}�[[��D�&[��>�1 P��>T@�$��������(�L��a҇��>�Lq�J�Ճԣ��u���_S��P(&���d��T�ֵw������w�~��~��/į�����H�����'�R��r�#�źK9O��(��R��S.�d���sws�c@4�57�2�_��82�j��Q.�t��?�z"@w1B>LJr�G������n�������$ʌ��2�\j��M���U�D��
rJ�<��KI�S��T��B�#ZF���j)�yYWppԑINs9�f"
��|���Yo����k�h�o�~]�?>��_����F�͗�W*��u��T��\.��`s3�1�)�� pUpC��Q����5�k`�Ĕs��0q�."���xt�Dĩ a ��ۺ�m7Q�רwG��x��\�TJ�
�b�m(���p�%>����,�2��:ה՜/�K�N�K%�T��TS>]�4M�L4�֙/����r��xNx>O�ib�<ͻ[ �[���e]_n�޾�~|�_���E���rݚ&�)s� ��懅�"1��H���s����t^�k�#�Kbpp� �m߻>T�EE�����B,Sr��������R���~�."��4M�s��
����t��Ӝs��9���]�3O�a��+�Q�Rj�T�S�Of�8AνuPI�R��̓z
B���6bۺ�!�֟�������o_>|���ꗡ&�-=��ۧ��/������<|sW�T	��FI)�K�yk>�r�1!�s��j��AD�L���l�
��H����`�2!�S�y�����~�����B`�,j��S!"���5g�u�m�Ϸ�1ϵ�gb�ӑ�>��SxJ9#�Tj��1��|�.Е��C�مT�5T4Wt���e�>Bw-�|���,�#|�r��?~z��]_ֿWS��X��ѷ�<��|z^�&��
��>F�WMZ7��r9�TD]�͕��-������ �OuB�@:��S)sqt?�t@(�����
��#�^���s��.����H���99q�bf�)!&�vpd�թ�����ui��}s@l]�!L�B�a���>�[�����{
w�xYn/���y}��_�����XǶ(�ݖ���.������g�!&@�A,�ۑ�h���39�H(CU�5�/�Dy�����\s��fJ�@��*&���omt� 7U��������88.�"&öm7��.
��xY͇ؾ�mY�eٖe[�;�20���3'@PS�"�P�}�L��$g^��MM�ɧ���|{|�
�}���#�u�����lk�zۮ�e@�\
�eN�m�[f3S7b��	�<�G�#(�6d4S�������t��u�A���:��,C�(1#�q
�����zkk�56]Z�Ǿ�)��3G8��������h�`�9Q"u�@�D>U��އx@fc���BZ����������ǟ����ˤ�s�_K���Ç�ܞ��o�5���뭜.�<<�7�6�s�����)c�Y٦���H)[���)!�E�1����<M�V� �mD�4�8D܇�XJQ������Z�Ҷ�t��1� a�
b�t�\�i����S��ֻ,[W&�=�d���['bBSU15wP��â�z�����}��=��ۧ�q��
|��>�{����O����s.���2we����̠��]s������R8�	J�A�SJ�T<b���}�t�j�V���	9��f�vD�傪��{�=�u33$4�""�9"�9e:�Bܛ������h���>�f�N����X*<L�ms�#)c��jk�ۺ������v�����[�>w`�L�����r����RbQ�ZKeƈ�T/w�9�m	Dsuum%bq�̞��00����9e׽���9�@(u�+�8�{�I�D`��)!2#��R�C,"P���-v
qT�����.f�0_P�u�uӔ���m�tO��o��O�ڇ�����[$�/��<��k��ܟ�sMs*��|z���ϧ��[P CJ)�J)9m:��!�{�\��j�̌k�!6F�&
�\ID�u ���u3M)��Hx��TUE��Y�JLl�K�18�#n�3��ض�‘XM�U�ț��ǻw�����{�_��0`��N��Kɵ>|��͛�7��K�4].���4Wx��G�y��yN	�(b���s��S�5��|W�!������&n���)hW3%Nj�&��M�C�C0�������|| �ᡠJ���}�s���?~��T_��� ����n�������������y����Η9��kN8�w)Muʹ�DȄ*�
PJ.SA"�H�����J-��}[M-�j��ʡ�j��D�1�0�:Uo{3?<9�t��|�0�#D��sZ}LR*OO��|Z��>�=2����?����_V��X�٢����pww9�/SJ�ܧ�4����T���ĜԣNSI���v��SJ��S={����h�9�q����{�1�8�0� �Z��轫*"8�f�9��}V��wD�<��hO{�E��]o��ޯ/���|���W����n���ZJJ�ε^�K�J�i���i>Ւ�?NDL%eP�N\jabQ�#@�\O3 �*"��C�Trw�Wk�8d\��R��  "ș���%�#�55���xk���,��em?>��}���[]IDAT������'��|J9�\N���r>�RJ��� œkb,93��33�3橸���}P`�ӌ���UBA-М8%S;����1��\�����\�C-�ֽ_�[Dܿ9�[��޻�-��.�򲽼�g6:�
���;�l�<M����4��uJ�w����t.'p��b�rɽ�����nA%�PP݇JI��<]�W͠�z1���D��1z5$�G��
L���{S�6d�>�O/*���;�;�hS=]�i*�K=�7���:rJ4%�ħ�5S�Ԛ�i@d.[Z33��!''��� ��ffધӄl�!{6�m�(�#,[����p�.&���:z{7��'�_����!�ʥ�i*�<�N�V'�;fff��5���</8�Tj%B��ų��(%$��T��{��ZGQ� �-���elm컛����[�����L+�8e$�@������Mn~�P��a��0S��(�����m_vp��@
�q��m=��$�����1���ÐF%��ݛ��l"�hc�����
m�M�����a��������o�^�n�h��g���/�k}�������Z_�k}���;��#��~�lUIEND�B`��
	@�n��?" d�d@���������  @@``������q�7
	
"%

.

 !	#$%&'(	 		0-1)*+./23456789?��$���$��b�$�:@X�\�&#NZ	������0���A���A�p������������@����������N�g*@ʚ;62ʚ;�g��4dddd�n������������p�pp�@<�4dddd0���gʚ;<�4!d!d0���gʚ;��g��4WdWd�n���L?������������p�@p�p<�4BdBd0���gʚ;�\�� �___PPT10�����(��@��8��H��@�
�x	

��P	���	

���	

	

�"�X	
��P	��@���	

�!�P	�#�0���___PPT9������P�����p�������
�	

���	�� 	

���	

	

�"��	
���	�����`	

�!��	�#�`�h�___PPT2001�D�<�4X�������___PPTMac11�’@f �hnamd`
Arial&Monotype Typography	 �hnamd`
Arial&Monotype Typographyddd0���gʚ;<�4!d!d0���gʚ;��g��4WdWd�n���L������������p�@p�p<�4BdBd0���gʚ;�\�� �___PPT10�����(��@	 �hnamd`
Arial&Monotype Typography	 �hnamd`
Arial&Monotype Typography	 �hnamd`
Arial&Monotype Typography	 �hnamd`
Arial&Monotype Typography	��D �hnamd`
Arial&Monotype Typography	 �hnamd`
Arial&Monotype Typography	 �hnamd`
Arial&Monotype Typography	�` �hnamd`
Arial&Monotype Typography	 �hnamd`
Arial&Monotype Typography	 �hnamd`
Arial&Monotype Typography	 �hnamd`
Arial&Monotype Typography	�< �hnamd`
Arial&Monotype Typography	 �hnamd`
Arial&Monotype Typography	�t �hnamd`
Arial&Monotype Typography	 �hnamd`
Arial&Monotype Typography	 �hnamd`
Arial&Monotype Typography	 �hnamd`
Arial&Monotype Typography	 �hnamd`
Arial&Monotype Typography	�` �hnamd`
Arial&Monotype Typography	 �hnamd`
Arial&Monotype Typography	 �hnamd`
Arial&Monotype Typography	 �hnamd`
Arial&Monotype Typography	�
� �tnamdlCourier New&Monotype Typography	 �tnamdlCourier New&Monotype Typography	 �tnamdlCourier New&Monotype Typography	 �tnamdlCourier New&Monotype Typography	 �tnamdlCourier New&Monotype Typography	 �tnamdlCourier New&Monotype Typography	 �tnamdlCourier New&Monotype Typography	 �tnamdlCourier New&Monotype Typography	 �tnamdlCourier New&Monotype Typography	 �tnamdlCourier New&Monotype Typography	 �tnamdlCourier New&Monotype Typography	 �tnamdlCourier New&Monotype Typography	 �tnamdlCourier New&Monotype Typography	 �tnamdlCourier New&Monotype Typography	�D �tnamdlCourier New&Monotype Typography	�� �tnamdlCourier New&Monotype Typography	 �tnamdlCourier New&Monotype Typography	 �tnamdlCourier New&Monotype Typography	 �tnamdlCourier New&Monotype Typography	 �tnamdlCourier New&Monotype Typography	 �tnamdlCourier New&Monotype Typography	 �tnamdlCourier New&Monotype Typography	 �tnamdlCourier New&Monotype Typography	 �tnamdlCourier New&Monotype Typography	 �tnamdlCourier New&Monotype Typography	 �tnamdlCourier New&Monotype Typography	 �tnamdlCourier New&Monotype Typography	 �tnamdlCourier New&Monotype Typography	 �tnamdlCourier New&Monotype Typography	�T �tnamdlCourier New&Monotype Typography	 �tnamdlCourier New&Monotype Typography	 �tnamdlCourier New&Monotype Typography	 �tnamdlCourier New&Monotype Typography	 �tnamdlCourier New&Monotype Typography	 �tnamdlCourier New&Monotype Typography	 �tnamdlCourier New&Monotype Typography	 �tnamdlCourier New&Monotype Typography	 �tnamdlCourier New&Monotype Typography	 �tnamdlCourier New&Monotype Typography	 �tnamdlCourier New&Monotype Typography	 �tnamdlCourier New&Monotype Typography	 �tnamdlCourier New&Monotype Typography	 �tnamdlCourier New&Monotype Typography	 �tnamdlCourier New&Monotype Typography	 �tnamdlCourier New&Monotype Typography	 �tnamdlCourier New&Monotype Typography	 �tnamdlCourier New&Monotype Typography	 �tnamdlCourier New&Monotype Typography	 �tnamdlCourier New&Monotype Typography	 �tnamdlCourier New&Monotype Typography	 �tnamdlCourier New&Monotype Typography	 �tnamdlCourier New&Monotype Typography	 �tnamdlCourier New&Monotype Typography	 �tnamdlCourier New&Monotype Typography	 �tnamdlCourier New&Monotype Typography	�"�	 �hnamd`
Arial&Monotype Typography	 �hnamd`
Arial&Monotype Typography	 �hnamd`
Arial&Monotype Typography	 �hnamd`
Arial&Monotype Typography	 �hnamd`
Arial&Monotype Typography	 �hnamd`
Arial&Monotype Typography	 �hnamd`
Arial&Monotype Typography	 �hnamd`
Arial&Monotype Typography	 �hnamd`
Arial&Monotype Typography	�$
 �tnamdlCourier New&Monotype Typography	 �tnamdlCourier New&Monotype Typography	 �tnamdlCourier New&Monotype Typography	 �tnamdlCourier New&Monotype Typography	 �tnamdlCourier New&Monotype Typography	 �tnamdlCourier New&Monotype Typography	 �tnamdlCourier New&Monotype Typography	 �tnamdlCourier New&Monotype Typography	 �tnamdlCourier New&Monotype Typography	�@ �hnamd`
Arial&Monotype Typography	 �hnamd`
Arial&Monotype Typography	�� �hnamd`
Arial&Monotype Typography	 �hnamd`
Arial&Monotype Typography	 �hnamd`
Arial&Monotype Typography	 �hnamd`
Arial&Monotype Typography	 �hnamd`
Arial&Monotype Typography	 �hnamd`
Arial&Monotype Typography	 �hnamd`
Arial&Monotype Typography	 �hnamd`
Arial&Monotype Typography	 �hnamd`
Arial&Monotype Typography	 �hnamd`
Arial&Monotype Typography	 �hnamd`
Arial&Monotype Typography	 �hnamd`
Arial&Monotype Typography	 �hnamd`
Arial&Monotype Typography	 �hnamd`
Arial&Monotype Typography	 �hnamd`
Arial&Monotype Typography	 �hnamd`
Arial&Monotype Typography	 �hnamd`
Arial&Monotype Typography	 �hnamd`
Arial&Monotype Typography	 �hnamd`
Arial&Monotype Typography	 �hnamd`
Arial&Monotype Typography	 �hnamd`
Arial&Monotype Typography	 �hnamd`
Arial&Monotype Typography	�!� �hnamd`
Arial&Monotype Typography	 �hnamd`
Arial&Monotype Typography	 �hnamd`
Arial&Monotype Typography	 �hnamd`
Arial&Monotype Typography	 �hnamd`
Arial&Monotype Typography	 �hnamd`
Arial&Monotype Typography	 �hnamd`
Arial&Monotype Typography	�#H �hnamd`
Arial&Monotype Typography	 �hnamd`
Arial&Monotype Typography	 �hnamd`
Arial&Monotype Typography	( ��ʚ;�&�)ʚ;�d�d?��%�E3���LuaSocket behind the scenes�6	)���Diego Nehab��
�4��	Short Bio�

���Graduated from PUC in CS & E, 1999;
Worked in Tecgraf 1995-2002;
MSc in PL with Roberto, 2001;
3rd year PhD candidate at Princeton;
Computer Graphics.�D�A%�
��5��Outline of talk�
��~A few historical notes
Case study: SMTP support
Protocol abstraction
Message abstraction
Implementation highlights
Conclusions�p0C�
�
��Historical notes�
���1.0, 1999, 1.5k C, 200 man
1.1, 2000, 1.5k C, 1.3k Lua, 500 man
added protocol support for HTTP, SMTP, FTP
1.2, 2001, 2k C, 1.3k Lua, 900 man
buffered input and non-blocking I/O
UDP support
object oriented syntax�N@+#G@+#G�23KQ���Historical notes�
���1.3, 2001, 2.3k C, 1.6k Lua, 1.2k man
streaming with callbacks
added select function
1.4, 2001-2, 2.2k C, 2.2k Lua, 1.9k man
LTN7
added URL module
named parameters�l&/('&/(�o2���Current version�
��2.0, 2005, 4.6k C, 2.5k Lua, 4.7k man
Extensible C architecture, split in modules
LTN12 (sources, sinks and filters)
MIME support (partial but honest)
Multipart messages support
LTN13 (finalized exceptions)
Package proposal 
Improved non-blocking code, robust to signals...�p&d�d&,#"  ���6��Outline of talk�
��~A few historical notes
Case study: SMTP support
Protocol abstraction
Message abstraction
Implementation highlights
Conclusions�p0C���
�
��SMTP (RFC2821)�D!!��!�
��[lua:roberto] telnet mail.tecgraf.puc-rio.br 25
220 tecgraf.puc-rio.br ESMTP Sendmail 8.9.3/8.9.3
helo lua
250 tecgraf.puc-rio.br Hello lua, pleased to meet you
mail from: <roberto@inf.puc-rio.br>
250 <roberto@inf.puc-rio.br>... Sender ok
rcpt to: <diego@tecgraf.puc-rio.br>
250 <diego@tecgraf.puc-rio.br>... Recipient ok
data
354 Enter mail, end with "." on a line by itself
Subject: World domination: instructions.

Commence stage two.
.
250 RAA10452 Message accepted for delivery
quit
221 tecgraf.puc-rio.br closing connection�"�pnPZ02��	6��$*��$/��  1$$��@((+,,��00)44��88�,		"

��!��Protocol abstraction�
���status, error = smtp.send {
    from = "<roberto@inf.puc-rio.br>",
    rcpt = "<diego@tecgraf.puc-rio.br>", 
    body = "Subject: World domination: instructions.\r\n\r\n" ..
           "Comence stage two."
}��d�P'CcCcC6ccc C $$�								
						U	�&��
LTN12 sources�
���function ltn12.source.file(handle)
    return function()
        local chunk = handle:read(BLOCKSIZE)
        if not chunk then handle:close() end
        return chunk
    end
end�,#d�F�C�
��'��
Using sources�
���status, message = smtp.send {
    from = "<roberto@inf.puc-rio.br>",
    rcpt = "<diego@tecgraf.puc-rio.br>", 
    body = ltn12.source.file(io.open("/mail/body", "r"))
}��d�P)CcCc(CcC�								
						(	�,��Message Format (RFC2822)�,!���
��|   From: Roberto Ierusalimschy <roberto@inf.puc-rio.br>
   To: Diego Nehab <diego@tecgraf.puc-rio.br>
   Subject: World domination: roadmap.
   Content-Type: multipart/mixed; boundary=part
  
   This message contains attachments 
   --part
   Content-Type: text/plain
   
   Please see attached roadmap.
   --part
   Content-Type: text/html; name="roadmap.html"
   ...
   --part--�0}P�CC)CCCCCC  C 
$C$!(C(,c,0C04C48C8<C<CC�"[	�.��Message abstraction�
���declaration = {
    headers = { 
        subject = "World domination",
        from = "Roberto <roberto@inf.puc-rio.br>",
        to = "Diego <diego@tecgraf.puc-rio.br>"
    },
    preamble = "This message contains attachments.",
    [1] = {
        headers = { ... },
        body = "Please see attatched roadmap."
    },
    [2] = {
        headers = { ... },
        body = ltn12.source.file(io.open("/plans/roadmap.html", "r"))
    } 
}��<CCC
Cc0cc.c c $c$(C(,C,%0c04C48C8<C<CCCCcCCC C $C$E(c(,C,0C04C48C8�j3}	%	7	/E	
�1��Our message API�
���status, message = smtp.send {
    from = "<roberto@inf.puc-rio.br>",
    rcpt = "<diego@tecgraf.puc-rio.br>", 
    body = smtp.message(declaration)
}��dxP)CcCc'CcC�								
						'	�D"��How hard is it?�
���Message structure is recursive;
Need to return chunks but mantain context; 
Nightmare to write in C!; 
Use coroutines;
Write function recursively, naturally;
Call yield with each chunk;
Next call resumes wherever we left.���d ,7``a`
` a $`$((�"gv	�:��Zoom in on attachments�
���[2] = {
    headers = { 
        ["content-type"] = 'text/html; name="roadmap.html"',
        ["content-disposition"] = 'attachment; filename ="roadmap.html"'
    },
    body = ltn12.source.file(io.open("/plans/roadmap.html", "r"))
}��d�FCC	C4cIcCAcC C $C$�:"}	A	�;��LTN12 filters and chains�
��)Filters process data one chunk at a time;
MIME module provides common filters:
base64, quoted-printable, stuffing, line-wrap...
Can chain two filters together: factory
Produce a filter with the composite effect
Can chain a filter with a source: factory
Produce a source that returns filtered data.��O1(+*-*%1(+*,�
*�<��Zoom in on attachments�
��
�Q$��Creating filters: high-level�
��
�U&��Creating filters: low-level�
��
�S%��Creating filters: low-level�
��
�>��SMTP dependencies�
��
�A ��Error checking�
��DFunction return convention
Return nil, followed by message on error;�Bd*dA �
E�B��LTN13 exceptions�
��try = newtry(finalizer): factory;
On success, try returns all arguments;
On failure, throws the second argument;
Calls finalizer before raising the exception.
foo = protect(bar): factory;
foo executes bar in a protected environment;
Returns nil followed by any thrown error. ��"d}ddXdg��c`	``e��`.`	 a $`$(g(��,c,0`04e4��
8`8<e<d``a``��	u�C!��No 'if' statements�*`�"	��hInternal functions throw exceptions;
try calls tp.close() on error;
External functions can be protected.�xi%A
A
A  $$�
i�O#��Conclusions�
���Hope you like our API, we do;
It is easy to implement;
Function factories + clusures, coroutines
It is fast;
Time critical in C, management in Lua;
Questions?�l7*'*'��/������� �$�)�*	�-�/
�2�7�8�9�E�F�G�I�J�K�L�M�P�R�T�V����	I`� ����3�����f3��b��3��>��?" d�d@���������%�t��?" n��n���@���������� �@�`� �n��?" d�d@���������  @@``��P�R		 	@	`	�`�p�>��>�'�I���$��(	�
�$�
�$
��Z���������	�1�1Ȝ��Ȝ��?���@��>
�T�� Click to edit Master title style�!�
!�
�$
��6�������	?���� ��>
���RClick to edit Master text styles
Second level
Third level
Fourth level
Fifth level�!

�
S�`B
�$
s�*D�����1�"��������X�
�$
C�"��A�
moon"���� �`�H
�$��0�������޽h��	?� �������ff���b��3��D�<�___PPT10��.�.&��@��� �Custom Design�
�����P���*�(	��j`�j
���
��
��0��A|�����	�P ���
>���0�___PPT10���6�___PPT9���B�___PPTMac11� �hnamd`
Arial&Monotype Typography	
�P��*���
�
��
��0�`J|�����	��	� ���>���0�___PPT10���6�___PPT9���B�___PPTMac11� �hnamd`
Arial&Monotype Typography	
�R��*���
�d
��
c�$���	?��� 
��>�
��
��0��Q|�����	��
@����>
���RClick to edit Master text styles
Second level
Third level
Fourth level
Fifth level�!

�
S�
��
��6�@\|������	�`P����	>���0�___PPT10���6�___PPT9���B�___PPTMac11� �hnamd`
Arial&Monotype Typography	
�P��*���
�
��
��6��b|������	�`�	�����>���0�___PPT10���6�___PPT9���B�___PPTMac11� �hnamd`
Arial&Monotype Typography	
�R��*���
�H
����0���޽h������	?� ���������33������8�0�___PPT10��.��q��Z��� �`��(	�
�`��
�`
��0���O�����	�P ��
>
�X��*�����
�`
��0� �O�����	��	� ��>
�Z��*�����
�`
��6���O������	�_P��	>
�X��*�����
�`
��6���O������	�_�	���>
�Z��*����H
�`��0���޽h������	?� ���������33������8�0�___PPT10��.P����]�����O��'�O���0�$��L�(	�
���x
�� c�$�P
=��$����x	��>
���r
�� S��`�;��$��
` ���>
���R
�"�
s�*�������p��@�`B
�#�
s�*D�����1�"���X��X�X�
�$�
C�"��A�
moon"����	f
��H
����0�������޽h��	?� ���O�����f3��b��3������___PPT10�u�.�� �"z+D�='� �̐����=�
@B�	+���
�O��'�O���`�H�$�(	��.���1@��
�H�r
�H S��0���$���@��
>
���r
�H S������$����� ��>
���H
�H��0�������޽h��	?� ���O�����f3��b��3������___PPT10�u�.�� �"z+D�='� �̐����=�
@B�	+���
�O��'�O�����@�$�(	�
�@�r
�@ S���`���$���@��
>
���r
�@ S��@Q���$����� ��>
���H
�@��0�������޽h��	?� ���O�����f3��b��3������___PPT10�u�.�� �"z+D�='� ������=�
@B�	+���
�O��'�O�����-���(	�k����
���l
�,� C��`۸��$��@��
>
���l
�-� C���ܸ��$���� ��>
���H
����0�������޽h��	?� �������ff���b��3������___PPT10�u�.�q���+D�='� �̐����=�
@B�	+���
�O��'�O��������(	�{5
���l
�� C���}���$��@��
>
���l
�� C�� ���$���� ��>
���H
����0�������޽h��	?� �������ff���b��3������___PPT10�u�.
�q��+D�='� �̐����=�
@B�	+���
�O��'�O�M�E��	����(	����
���!��	�����
�	�������$�D,�P�H�___PPT2001�$�@F���
��
��0����������"��������X�P�H�___PPT2001�$�@F��w�
��
��<�@�����������'	�
�����0�___PPT10���6�___PPT9���B�___PPTMac11� �hnamd`
Arial&Monotype Typography	
�3��
David Burgess�
�
��
��0����������"���`����,$�D,��
��
��0����������"���8��x�$�D,�P�H�___PPT2001�$�@F��l
�� C���F���$��@��
>
���l
�� C���G���$���� ��>
���H
����0�������޽h��	?� �������ff���b��3��.�&�___PPT10��.�q��k�^z�+bk��D��
'� E�����=�
@B�	D�
'� ����=�
@B�A�?%�,(�	<�+O%�,(�
<�+D�4'� =�%�(�����D��'� =�%�(�D�'� =�4@B��B��B��B�%�(�D�'� =�1�:�B�visible*�o3�>�+B�#style.visibility<��*���������%�(�D�'� =�%�(�����D�f'� =�%�(�D�'� =�4@B��B��B��B�%�(�D�'� =�1�:�B�hidden*�o3�>�+B�#style.visibility<��*���������%�(�D�'� =�4@B��B��B��B�%�(�D�'� =�1�:�B�visible*�o3�>�+B�#style.visibility<��*	���������%�(�D�'� =�%�(�����D�f'� =�%�(�D�'� =�4@B��B��B��B�%�(�D�'� =�1�:�B�hidden*�o3�>�+B�#style.visibility<��*	���������%�(�D�'� =�4@B��B��B��B�%�(�D�'� =�1�:�B�visible*�o3�>�+B�#style.visibility<��*���������%�(�+���
�O��'�O�����8�$�(	��A
�8�r
�8 S������$���@��
>
���r
�8 S��P���$����� ��>
���H
�8��0�������޽h��	?� ���O�����f3��b��3������___PPT10�u�.�� �"z+D�='� �̐����=�
@B�	+�l�
�O��'�O��������f�(	�����ff���
�����l	��4�#
���<��#�,$�D,��
��
��6�����������"����P��X�P�H�___PPT2001�$�DF��
��
��<�������������4�#�����0�___PPT10���6�___PPT9���B�___PPTMac11� �hnamd`
Arial&Monotype Typography	
�F��from��
���l	����{	
������{	�,$�D,��
�	�
��6�����������"������h	�X�P�H�___PPT2001�$�DF��
�
�
��<������������-��{	�����0�___PPT10���6�___PPT9���B�___PPTMac11� �hnamd`
Arial&Monotype Typography	
�F��rcpt��
�f�l	��X�h

���X��h
�,$�D,�t
�
�
��6�����������"����X�h
�n
��
��<��������������������0�___PPT10���6�___PPT9���B�___PPTMac11� �hnamd`
Arial&Monotype Typography	
�*��body�
�r
�� S����$��@��
>
���r
�� S��p���$������>
���H
����0�������޽h��	?� �������ff���b��3����___PPT10���.�q�"r+����D�'� E�����=�
@B�	D�u'� ����=�
@B�A�?%�,(�	<�+O%�,(�
<���8��H��@�
�x	

��P+D�4'� =�%�(�����D��'� =�%�(�D�'� =�4@B��B��B��B�%�(�D�'� =�1�:�B�visible*�o3�>�+B�#style.visibility<��*���������%�(�D�4'� =�%�(�����D��'� =�%�(�D�'� =�4@B��B��B��B�%�(�D�'� =�1�:�B�visible*�o3�>�+B�#style.visibility<��*���������%�(�D�4'� =�%�(�����D��'� =�%�(�D�'� =�4@B��B��B��B�%�(�D�'� =�1�:�B�visible*�o3�>�+B�#style.visibility<��*���������%�(�+�#�
�O��'�O�������\�(	��A$

���l
�� C��p���$��@��
>
���
�� ��<�������������	$����
��>
���
��
��6�0������	?�P
����,$�,
�~��What if body is large?�:d���
�H
����0�������޽h��	?� �������ff���b��3������___PPT10���.�qh�+�]%�D�O'� E�����=�
@B�	D�
'� ����=�
@B�A�?%�,(�	<�+O%�,(�
<�+D�A'� =�%�(�����D��'� =�%�(�D�'� =�A@B��B��B��B�0B�%�(�D�'� =�1�:�B�visible*�o3�>�+B�#style.visibility<��*���������%�(�+8+0+�	+���
�O��'�O��� ��0�(	��.�p�1
��l
� C���&��$��@��
>
���
� ��<�0(�����������	$�P	��(�<$�D<�Π
���
�
��6�0�����	?����(
�h�`�P�___PPT10�0�(�v�___PPT9�X�P���___PPTMac11�\T �hnamd`
Arial&Monotype Typography	 �hnamd`
Arial&Monotype Typography	 �hnamd`
Arial&Monotype Typography	 �hnamd`
Arial&Monotype Typography	
����pUse callback function that produces data;
Returns one chunk each time called;
Signals termination returning nil.�LqZNE��E�
q�H
���0�������޽h��	?� �������ff���b��3������___PPT10���.1�q���+���YD�O'� E�����=�
@B�	D�
'� ����=�
@B�A�?%�,(�	<�+O%�,(�
<�+D�A'� =�%�(�����D��'� =�%�(�D�'� =�A@B��B��B��B�0B�%�(�D�'� =�1�:�B�visible*�o3�>�+B�#style.visibility<��*��������%�(�+8+0+	+�{�
�	O��'�O�$�0���(	�0B0A0B
��l
� C�����$��@��
>
���
� ��<��������������	$����h	��>
���p
�
��6��������	?��	��h�h$�,�4�H�___PPT10�(� �f�___PPT9�H�@�n�___PPTMac11�H@ �hnamd`
Arial&Monotype Typography	 �hnamd`
Arial&Monotype Typography	 �hnamd`
Arial&Monotype Typography	
���What if body is complicated?�Bd`d��`�	�H
���0�������޽h��	?� �������ff���b��3������___PPT10���.3�q�F�+'�D�O'� E�����=�
@B�	D�
'� ����=�
@B�A�?%�,(�	<�+O%�,(�
<�+D�A'� =�%�(�����D��'� =�%�(�D�'� =�A@B��B��B��B�0B�%�(�D�'� =�1�:�B�visible*�o3�>�+B�#style.visibility<��*��������%�(�+8+0+	+��9�
�O��'�O�.�&@� @���(	�
� �
� �
��6�����������"��������,$�@,�
� �
��6�����������"�������$�@,�P�H�___PPT2001�$�@F��
� 
��B������������"�������D$�,��0�___PPT10���6�___PPT9���H�___PPT2001�$�F��B�___PPTMac11� �hnamd`
Arial&Monotype Typography	
�-��headers�
�r
�  S�����$������
>
���
� 
��0�������"����
X8
�,$�@,��
� 
s�*������"���X��$�@
,�P�H�___PPT2001�$�DF��
� �
��6�����������"����
Mm�,$�@,�
� �
��0����������"���4M
�,$�@,�r
�  S������$��������>
���
� 
��<� �����������
�x��$�,���0�___PPT10���6�___PPT9���B�___PPTMac11� �hnamd`
Arial&Monotype Typography	
�-��headers�
�
� 
��<������������,r
��$�,���0�___PPT10���6�___PPT9���B�___PPTMac11� �hnamd`
Arial&Monotype Typography	
�*��body�
��
� 
��<�@�����������tXl�D$�,��0�___PPT10���6�___PPT9���H�___PPT2001�$�F��B�___PPTMac11� �hnamd`
Arial&Monotype Typography	
�,��part 2�
��
� 
��<�����������
����D$�,��0�___PPT10���6�___PPT9���H�___PPT2001�$�F��B�___PPTMac11� �hnamd`
Arial&Monotype Typography	
�*��body�
��
� 
��<�`���������etXL�D$�	,��0�___PPT10���6�___PPT9���H�___PPT2001�$�
F��B�___PPTMac11� �hnamd`
Arial&Monotype Typography	
�,��part 1�
�H
� ��0�������޽h��	?� �������ff���b��3���!��!�___PPT10��!�.3�q�F��S��+�f�D�d'� E�����=�
@B�	D�'� ����=�
@B�A�?%�,(�	<�+O%�,(�
<�+D��'� =�%�(�����D�'� =�%�(�D�'� =�4@B��B��B��B�%�(�D�'� =�1�:�B�visible*�o3�>�+B�#style.visibility<��* ��������%�(�D�'� =�A@B��B��B��B�0B�%�(�D�'� =�1�:�B�visible*�o3�>�+B�#style.visibility<��* ��������%�(�D�'� =�4@B��B��B��B�%�(�D�'� =�1�:�B�visible*�o3�>�+B�#style.visibility<��* ��������%�(�D�'� =�A@B��B��B��B�0B�%�(�D�'� =�1�:�B�visible*�o3�>�+B�#style.visibility<��* ��������%�(�D�'� =�%�(�����D�R'� =�%�(�D�'� =�A@B��B��B��B�0B�%�(�D�'� =�1�:�B�hidden*�o3�>�+B�#style.visibility<��* ��������%�(�D�'� =�A@B��B��B��B�0B�%�(�D�'� =�1�:�B�hidden*�o3�>�+B�#style.visibility<��* ��������%�(�D�'� =�4@B��B��B��B�%�(�D�'� =�1�:�B�visible*�o3�>�+B�#style.visibility<��* ��������%�(�D�'� =�A@B��B��B��B�0B�%�(�D�'� =�1�:�B�visible*�o3�>�+B�#style.visibility<��* ��������%�(�D�'� =�4@B��B��B��B�%�(�D�'� =�1�:�B�visible*�o3�>�+B�#style.visibility<��* ��������%�(�D�'� =�4@B��B��B��B�%�(�D�'� =�1�:�B�hidden*�o3�>�+B�#style.visibility<��* ��������%�(�D�'� =�A@B��B��B��B�0B�%�(�D�'� =�1�:�B�visible*�o3�>�+B�#style.visibility<��* ��������%�(�D�'� =�%�(�����D�R'� =�%�(�D�'� =�A@B��B��B��B�0B�%�(�D�'� =�1�:�B�hidden*�o3�>�+B�#style.visibility<��* ��������%�(�D�'� =�4@B��B��B��B�%�(�D�'� =�1�:�B�visible*�o3�>�+B�#style.visibility<��* ��������%�(�D�'� =�A@B��B��B��B�0B�%�(�D�'� =�1�:�B�visible*�o3�>�+B�#style.visibility<��* ��������%�(�D�'� =�4@B��B��B��B�%�(�D�'� =�1�:�B�visible*�o3�>�+B�#style.visibility<��* ��������%�(�D�'� =�A@B��B��B��B�0B�%�(�D�'� =�1�:�B�visible*�o3�>�+B�#style.visibility<��* ��������%�(�D�'� =�A@B��B��B��B�0B�%�(�D�'� =�1�:�B�hidden*�o3�>�+B�#style.visibility<��* ��������%�(�D�'� =�4@B��B��B��B�%�(�D�'� =�1�:�B�hidden*�o3�>�+B�#style.visibility<��* ��������%�(�+0+0+ 	++0+ 	++0+ 	++0+ 	++0+ 	++0+ 	++0+ 	++0+ 	++0+ 	++0+ 	+���
�
O��'�O���P�(�H�(	�
�(�r
�( S�� ���$���@��
>
���
�( ��B�P������������	$��������>
���H
�(��0�������޽h��	?� �������ff���b��3������___PPT10�u�.3�q�F�+D�='� �̐����=�
@B�	+��
�O��'�O���`�0��(	�
�0�r
�0 S��@�	��$���@��
>
���
�0 ��B�p�	�����������	$�����H	��>
���?
�0
��6���	�����	?��	��X���@�___PPT10� ��V�___PPT9�8�0�Z�___PPTMac11�4, �hnamd`
Arial&Monotype Typography	 �hnamd`
Arial&Monotype Typography	
���UTransform declaration into an LTN12 source; 
Pass source as body to sending function.�0Vd-`(`�U	�H
�0��0�������޽h��	?� �������ff���b��3������___PPT10�u�.3�q�F�+D�='� n�����=�
@B�	+���
�O��'�O��������(	�
���l
�� C������$����
>
���l
�� C��0���$���� ��>
���H
����0�������޽h��	?� �������ff���b��3������___PPT10�u�.�q�꾖+D�='� �̐����=�
@B�	+�c�
�O��'�O�V�Np�P���(	�+R
�P�r
�P S����
��$��@��
>
���
�P 
��Z�д
������������	?$�����X
��>
���~
�P
��6��
�����	?��
����<�4�H�___PPT10�(� �f�___PPT9�H�@�n�___PPTMac11�H@ �hnamd`
Arial&Monotype Typography	 �hnamd`
Arial&Monotype Typography	 �hnamd`
Arial&Monotype Typography	
����ZWould like to send PDF;
Binary data has to be encoded (Base64);
Want to encode on-the-fly.�>[d`(``�Z	�H
�P��0�������޽h��	?� �������ff���b��3������___PPT10�u�.	�q���+D�='� n�����=�
@B�	+���
�O��'�O�����X�$�(	�
�X�x
�X c�$��A��$���@��
>
���l
�X C��PC��$���� ��>
���H
�X��0�������޽h��	?� �������ff���b��3������___PPT10�u�.	�q���+D�='� �̐����=�
@B�	+�� �
�O��'�O�����\�6�(	�
�\�r
�\ S��0���$��@��
>
���
�\
��<�`����������	?�����4�,���___PPT10����	

�v�___PPT9�X�P	

���___PPTMac11��� �tnamdlCourier New&Monotype Typography	 �tnamdlCourier New&Monotype Typography	 �tnamdlCourier New&Monotype Typography	 �tnamdlCourier New&Monotype Typography	 �tnamdlCourier New&Monotype Typography	 �tnamdlCourier New&Monotype Typography	 �tnamdlCourier New&Monotype Typography	 �tnamdlCourier New&Monotype Typography	 �tnamdlCourier New&Monotype Typography	 �tnamdlCourier New&Monotype Typography	 �tnamdlCourier New&Monotype Typography	 �tnamdlCourier New&Monotype Typography	 �tnamdlCourier New&Monotype Typography	 �tnamdlCourier New&Monotype Typography	 �tnamdlCourier New&Monotype Typography	 �tnamdlCourier New&Monotype Typography	 �tnamdlCourier New&Monotype Typography	 �tnamdlCourier New&Monotype Typography	 �tnamdlCourier New&Monotype Typography	 �tnamdlCourier New&Monotype Typography	 �tnamdlCourier New&Monotype Typography	
�����[2] = {
    headers = { 
        ["content-type"] = 'application/pdf; name="roadmap.pdf"',
        ["content-disposition"] = 'attachment; filename ="roadmap.pdf"',
        ["content-description"] = 'Detailed world domination plan',
        ["content-transfer-encoding"] = 'BASE64'
    },
    body = ltn12.source.chain(
        ltn12.source.file(io.open("/plans/roadmap.pdf", "r")),
        ltn12.filter.chain(
            mime.encode("base64"),
            mime.wrap("base64")
        )
    )      
}��d�FCC	C9cIcCccc) c $C$(c(,c,*0c04c4#8c8 <c<
cccCC�:"�	�	�H
�\��0�������޽h��	?� �������ff���b��3������___PPT10�u�.�q�꾖+D�='� ������=�
@B�	+���
�O��'�O�V
�N
@����	�(	�
���x
�� c�$����$���@��
>
����
��
��<��y���������	?����H�$�D,���8�___PPT10���F�___PPT9�(� �R�___PPTMac11�,$ �tnamdlCourier New&Monotype Typography	
�U���function ltn12.filter.cycle(low, ctx, extra)
    return function(chunk)
        local ret
        ret, ctx = low(ctx, chunk, extra)
        return ret
    end
end
function mime.normalize(marker)
    return ltn12.filter.cycle(mime.eol, 0, marker)
end�.�P�CC
�
��A
��
��6��^�����	?����H� ��@�___PPT10� ��V�___PPT9�8�0�j�___PPTMac11�D< �hnamd`
Arial&Monotype Typography	 �hnamd`
Arial&Monotype Typography	 �hnamd`
Arial&Monotype Typography	
���MChunks can be broken arbitrarily;
Filters have to keep context between calls;�4Nd"`+``�N	�H
����0�������޽h��	?� �������ff���b��3������___PPT10���.�q�꾖+���YD�O'� E�����=�
@B�	D�
'� ����=�
@B�A�?%�,(�	<�+O%�,(�
<�+D�A'� =�%�(�����D��'� =�%�(�D�'� =�A@B��B��B��B�0B�%�(�D�'� =�1�:�B�visible*�o3�>�+B�#style.visibility<��*���������%�(�+8+0+�	+�&
�
�O��'�O��������_�(	�
���x
�� c�$�0I���$���@��
>
���
��
��<�@ʓ���������	?�����$�D,���8�___PPT10���F�___PPT9�(� �R�___PPTMac11�,$ �tnamdlCourier New&Monotype Typography	
����int eol(lua_State *L) {
    int ctx = luaL_checkint(L, 1);
    size_t isize = 0;
    const char *input = luaL_optlstring(L, 2, NULL, &isize);
    const char *last = input + isize;
    const char *marker = luaL_optstring(L, 3, CRLF);
    luaL_Buffer buffer;
    luaL_buffinit(L, &buffer);
    while (input < last)
        ctx = translate(*input++, ctx, marker, &buffer);
    luaL_pushresult(&buffer);
    lua_pushnumber(L, ctx);
    return 2;
}�.�F�CC
�
��H
����0�������޽h��	?� �������ff���b��3������___PPT10���.�q�꾖+���YD�O'� E�����=�
@B�	D�
'� ����=�
@B�A�?%�,(�	<�+O%�,(�
<�+D�A'� =�%�(�����D��'� =�%�(�D�'� =�A@B��B��B��B�0B�%�(�D�'� =�1�:�B�visible*�o3�>�+B�#style.visibility<��*���������%�(�+8+0+�	+�
�
�O��'�O���`���L�(	�
���x
�� c�$� ���$���@��
>
���
��
��<��+���������	?�����$�D,���8�___PPT10���F�___PPT9�(� �R�___PPTMac11�,$ �tnamdlCourier New&Monotype Typography	
����#define candidate(c) (c == CR || c == LF)
int translate(int c, int last, const char *mark, luaL_Buffer *buffer) {
    if (candidate(c)) {
        if (candidate(last)) {
            if (c == last) luaL_addstring(buffer, mark);
            return 0;
        } else {
            luaL_addstring(buffer, mark);
            return c;
        }
    } else {
        luaL_putchar(buffer, c);
        return 0;
    }
}�<*FqA�CC
�
��H
����0�������޽h��	?� �������ff���b��3������___PPT10���.�q�꾖+���YD�O'� E�����=�
@B�	D�
'� ����=�
@B�A�?%�,(�	<�+O%�,(�
<�+D�A'� =�%�(�����D��'� =�%�(�D�'� =�A@B��B��B��B�0B�%�(�D�'� =�1�:�B�visible*�o3�>�+B�#style.visibility<��*���������%�(�+8+0+�	+�V%�
�O��'�O�����
d���(	�
�d�x
�d c�$�`���$���@��
>
���
�d
��<��
�����������"����  ������0�___PPT10���6�___PPT9���B�___PPTMac11� �hnamd`
Arial&Monotype Typography	
�H��socket��
�
�d
��<�p

�����������"����@@��$�@,���0�___PPT10���6�___PPT9���B�___PPTMac11� �hnamd`
Arial&Monotype Typography	
�F��mime��
�
�d
��<��
�����������"���`	@@p��$�@,���0�___PPT10���6�___PPT9���B�___PPTMac11� �hnamd`
Arial&Monotype Typography	
�F��smtp��
�
�d
��<�
�����������"����@@���$�@,���0�___PPT10���6�___PPT9���B�___PPTMac11� �hnamd`
Arial&Monotype Typography	
�D��tp��
�
�	d
��<��
�����������"���`	``p�����0�___PPT10���6�___PPT9���B�___PPTMac11� �hnamd`
Arial&Monotype Typography	
�G��ltn12��
�
�d��0�������� @��,$�@,�
�
d��0��������@@`	�,$�D
,�
�d���0�������p@@��,$�@,�
�d@��0�������h
@`h
�,$�@	,�B
�d�
��6��D������@``	�,$�D,�B
�d@
��6��D�����p@`��,$�D,�H
�d��0�������޽h��	?O��ddd�dd
d�ddd�	ddd� �������ff���b��3��1�)�___PPT10�	�.�q�꾖+,�fD�)'� E�����=�
@B�	D��'� ����=�
@B�A�?%�,(�	<�+O%�,(�
<�+D�Y'� =�%�(�����D�'� =�%�(�D�'� =�A@B��B��B��B�0B�%�(�D�'� =�1�:�B�visible*�o3�>�+B�#style.visibility<��*d��������%�(�D�'� =�4@B��B��B��B�%�(�D�'� =�1�:�B�visible*�o3�>�+B�#style.visibility<��*d��������%�(�D�'� =�4@B��B��B��B�%�(�D�'� =�1�:�B�visible*�o3�>�+B�#style.visibility<��*d��������%�(�D��'� =�%�(�����D�u'� =�%�(�D�'� =�A@B��B��B��B�0B�%�(�D�'� =�1�:�B�visible*�o3�>�+B�#style.visibility<��*d��������%�(�D�'� =�4@B��B��B��B�%�(�D�'� =�1�:�B�visible*�o3�>�+B�#style.visibility<��*d��������%�(�D��'� =�%�(�����D�'� =�%�(�D�'� =�A@B��B��B��B�0B�%�(�D�'� =�1�:�B�visible*�o3�>�+B�#style.visibility<��*d��������%�(�D�'� =�4@B��B��B��B�%�(�D�'� =�1�:�B�visible*�o3�>�+B�#style.visibility<��*d��������%�(�D�'� =�4@B��B��B��B�%�(�D�'� =�1�:�B�visible*�o3�>�+B�#style.visibility<��*d��������%�(�D�'� =�4@B��B��B��B�%�(�D�'� =�1�:�B�visible*�o3�>�+B�#style.visibility<��*
d��������%�(�+�+0+d	++0+d	++0+d	+���
�O��'�O����x��(	�
�x�l
�x C��0d
��$��@��
>
���l
�x C���e
��$	���	

���	

	

�"�X�������>
���w
�x
��<�pq
���������	?����@�$�D,�l���___PPT10���x	

��___PPT9����	

���___PPTMac11�xp �tnamdlCourier New&Monotype Typography	 �tnamdlCourier New&Monotype Typography	 �tnamdlCourier New&Monotype Typography	 �tnamdlCourier New&Monotype Typography	 �tnamdlCourier New&Monotype Typography	 �tnamdlCourier New&Monotype Typography	 �tnamdlCourier New&Monotype Typography	 �tnamdlCourier New&Monotype Typography	 �tnamdlCourier New&Monotype Typography	 �tnamdlCourier New&Monotype Typography	 �tnamdlCourier New&Monotype Typography	
�c���function metat.__index:greet(domain)
    local r, e = self.tp:check("2..")
    if not r then return nil, e end
    r, e = self.tp:command("HELO", domain)
    if not r then return nil, e end
    return self.tp:check("2..")
end��Z%CCcCCcCC C $c$(c($,c,0c04c48C8�RD		T	�	
�x
��6��}
�����	?�p�� �$�,���8�___PPT10���F�___PPT9�(� �F�___PPTMac11�  �hnamd`
Arial&Monotype Typography	
���-Tedious, error prone, virotic, not finalized.�".d-`�-	�H
�x��0�������޽h��	?� �������ff���b��3��h�`�___PPT10�@�.�q�꾖+�{ D�'� E�����=�
@B�	D�S'� ����=�
@B�A�?%�,(�	<�+O%�,(�
<�+D�A'� =�%�(�����D��'� =�%�(�D�'� =�A@B��B��B��B�0B�%�(�D�'� =�1�:�B�visible*�o3�>�+B�#style.visibility<��*x��������%�(�D�A'� =�%�(�����D��'� =�%�(�D�'� =�A@B��B��B��B�0B�%�(�D�'� =�1�:�B�visible*�o3�>�+B�#style.visibility<��*x��������%�(�+p+0+x	++0+x	+���
�O��'�O�����t��(	�
�t�l
�t C���!��$��@��
>
���l
�t C���#��$���� ��>
���H
�t��0�������޽h��	?� �������ff���b��3������___PPT10�u�.�q�꾖+D�='� �̐����=�
@B�	+�,
�
�O��'�O�� �|��(	�
�|�r
�| S��c���$���@��
>
���

�|
��<�0n����������	?����-	�\�T�x�___PPT10�X�P	���___PPT9����	���___PPTMac11��� �tnamdlCourier New&Monotype Typography	 �tnamdlCourier New&Monotype Typography	 �tnamdlCourier New&Monotype Typography	 �tnamdlCourier New&Monotype Typography	 �tnamdlCourier New&Monotype Typography	 �tnamdlCourier New&Monotype Typography	
����function metat.__index:greet(domain)
    self.try(self.tp:check("2.."))
    self.try(self.tp:command("HELO", domain))
    return self.try(self.tp:check("2.."))
end���Z%CCcCCcc)c c $C$�:@	;	�l
�| C��2���$��	�� ��>
���H
�|��0�������޽h��	?� �������ff���b��3������___PPT10�u�.�q�꾖+D�='� ������=�
@B�	+���
�O��'�O��� ����(	�
���r
�� S���=���$���@��
>
���l
�� C���m8��$���� ��>
���H
����0�������޽h��	?� �������ff���b��3������___PPT10�u�.�q�꾖+D�='� �̐����=�
@B�	+���n�f@����(	�@
���R
�� 3������� 
��>�l
�� C����|�����
@����>
���H
����0���޽h������	?� ���������33������8�0�___PPT10��.��q��Z���
t�l�����(	�
���R
�� 3������� 
��>�r
�� #��������
@����>
���
�H
����0���޽h������	?� ���������33������8�0�___PPT10��.�q�T6����t�l�����(	�
���R
�� 3������� 
��>�r
�� #��@R����
@����>
���
�H
����0���޽h������	?� ���������33������8�0�___PPT10��.�q�T6���������(	���p�`�
���R
�� 3������� 
��>�
�� C��p�	�����
@���X�>�@�P�___PPT10�0�(�v�___PPT9�X�P�b�___PPTMac11�<4 �hnamd`
Arial&Monotype Typography	 �hnamd`
Arial&Monotype Typography	
�Y���David, who lives in Melbourne, knows RFCs by experience, whereas I only read them.
First FTP server written back in 89...
My inbox has about 700 messages from him.
He wrote all of them while being upside-down, which always strikes me as odd.�:�S&+M�
��H
����0���޽h������	?� ���������33������8�0�___PPT10��.�q�T6����
s�k����(	� )� )�
���R
�� 3������� 
��>�q
�� C���>I�����
@����>���@�___PPT10� ��V�___PPT9�8�0�J�___PPTMac11�$ �hnamd`
Arial&Monotype Typography	
����What is SMTP anyways.
Text mode protocol. Send commands, read back replies.
FTP also uses the same underlying command structure, and the implementation of the two modules share a subsystem.�&�5s�
��H
����0���޽h������	?� ���������33������8�0�___PPT10��.�q�T6��*	���0���:�(	�
���R
�� 3������� 
��>�
�� C��0`�����
@����>�|�X�___PPT10�8�0���___PPT9�h�`���___PPTMac11�`X �hnamd`
Arial&Monotype Typography	 �hnamd`
Arial&Monotype Typography	 �hnamd`
Arial&Monotype Typography	 �hnamd`
Arial&Monotype Typography	
����6Here is the simplest interface we can come up with. We can add some sugar, such as the multiple-recipient list, passed as a table.
It works well for small, static messages.
But what if the content is large. Messages with attachments can be several megabytes long.
We don't want to load all that up into memory.�H7�*[(`�"(	�H
����0���޽h������	?� ���������33������8�0�___PPT10��.�q�U����	�^	�V	@����(	�
��R
� 3������� 
��>�\
� C���#`�����
@����>�����___PPT10�`�X	
���___PPT9����	
���___PPTMac11�d\ �hnamd`
Arial&Monotype Typography	 �hnamd`
Arial&Monotype Typography	 �hnamd`
Arial&Monotype Typography	
��� The idea we use in LuaSocket is to pass a function instead of a string.
This function will be repeatedly called whenever the SMTP module needs data to send.
The protocol to these so called "source" functions is formalized by LTN12.
As an example, consider a source that produces the contents of a file.
This is actually a factory: a function that creates and returns custom functions.
Hail Lua, where functions are first class citizens.
Here we are also taking advantage of Lua's lexical scoping to store the context between calls (file handle)�~!HT!*`GR3)  $`$A((�:�*	�	A�H
���0���޽h������	?� ���������33������8�0�___PPT10��.��q�,����Z�RP����(	�
��R
� 3������� 
��>�X
� C��0Y`�����
@���H�>�0�P�___PPT10�0�(�v�___PPT9�X�P�R�___PPTMac11�,$ �hnamd`
Arial&Monotype Typography	
���<Here is how we can use a file source with the SMTP module.
Nothing is really loaded into memory until the module needs data to be sent. Even then, the source can control the granularity.
But what if the message is complicated? We don't want our users to be forced to know all the details and write a file to be sent.�>=;�.S`�"�S	�H
���0���޽h������	?� ���������33������8�0�___PPT10��.��q�,����R�J`�$���(	�
�$�X
�$C������� 
��>�J
�$S���n`�����
@����>�l�X�___PPT10�8�0���___PPT9�h�`�v�___PPTMac11�PH �hnamd`
Arial&Monotype Typography	 �hnamd`
Arial&Monotype Typography	 �hnamd`
Arial&Monotype Typography	
�p���How complicated can it be? Here is an example of multipart message.
<<describe parts>>
We want to be able to describe a message like this, without creating it in memory.
Roberto would never send me a message with an HTML file attached, but bear with me.
�D�DST�
��H
�$��0���޽h������	?� ���������33������8�0�___PPT10��.��q�,��,���p�,�<�(	�
�,�X
�,C������� 
��>�
�,S��0�`�����
@���,�>��H�___PPT10�(� �f�___PPT9�H�@�N�___PPTMac11�(  �hnamd`
Arial&Monotype Typography	
�"���Good thing Lua was designed as a description language.
Notice the ltn12 source doesn't load anything into memory.
But how to send the message we have just declared?�8�)`m`�"�	�H
�,��0���޽h������	?� ���������33������8�0�___PPT10��.��q�,�������4��(	���
�4�X
�4C������� 
��>�
�4S����`�����
@����>
���
�H
�4��0���޽h������	?� ���������33������8�0�___PPT10��.��q�,�������<��(	��
�<�X
�<C������� 
��>�
�<S���$	�����
@����>
���
�H
�<��0���޽h������	?� ���������33������8�0�___PPT10��.��q��Z�U	������D�e�(	���
�D�X
�DC������� 
��>��
�DS����������
@���p�>�X�`�___PPT10�@�8���___PPT9�x�p�J�___PPTMac11�$�� x	�� x	�� x	 �hnamd`
Arial&Monotype Typography	 �hnamd`
Arial&Monotype Typography	
����We start with a few historical notes on LuaSocket
Then we move on to our case study which is the SMTP support shipping with the newest versions. 
We will focus on little details of Lua that enables us to taylor a very elegant interface to sending e-mail messages.
I realize my abstract mentioned more stuff.  For some reason I had in mind it would be a longer talk, so I had to downsize.�N�2_vr	�(\�H
�D��0���޽h������	?� ���������33������8�0�___PPT10��.��q��Z���z�rp�L�
�(	��@�
�L�X
�LC������� 
��>�r
�LS��`O~�����
@����>
���H
�L��0���޽h������	?� ���������33������8�0�___PPT10��.��q��Z�9������I�(	�
���R
�� 3������� 
��>�
�� C��P,a�����
@���H�>�0�P�___PPT10�0�(�v�___PPT9�X�P�R�___PPTMac11�,$ �hnamd`
Arial&Monotype Typography	
����The solution LuaSocket adopts is given by LTN13. 
We use Lua's error reporting to implement an exception mechanism with two tiny helper function factories.�>�2_`�"<_	�H
����0���޽h������	?� ���������33������8�0�___PPT10��.�qI���.�"������>�(	�
���R
�� 3������� 
��>�
�� C���a�����
@����>
�L��&About 100 lines of nice, modular code.�
'�H
����0���޽h������	?� ���������33������8�0�___PPT10��. �q����O�!������_�(	�
���R
�� 3������� 
��>��
�� C���8a�����
@����>
�m��GAll SMTP code, with error checking fits in 100 lines of clean Lua code.�
H�H
����0���޽h������	?� ���������33������8�0�___PPT10��. �q�qO����������(	�
���R
�� 3������� 
��>�	
�� C��0�`�����
@���h�>�P�P�___PPT10�0�(�v�___PPT9�X�P�r�___PPTMac11�LD �hnamd`
Arial&Monotype Typography	 �hnamd`
Arial&Monotype Typography	 �hnamd`
Arial&Monotype Typography	
�Q���Roberto would actually send me a PDF;
But PDF files are binary, and SMTP is text mode.
Need to encode as BASE64 before sending.
Want to do everything on the fly, with the same requirements: not allowed to load everything into memory.�:�&1)i�
��H
����0���޽h������	?� ���������33������8�0�___PPT10��.��qGr��.�������>�(	�
���R
�� 3������� 
��>�
�� C����`�����
@����>
�L��&Introducing LTN12 filters and chains.
�
'�H
����0���޽h������	?� ���������33������8�0�___PPT10��.��qGr����C�;������(	�{5�v
���R
�� 3������� 
��>�A
�� C��0�`�����
@����>���8�___PPT10���F�___PPT9�(� �V�___PPTMac11�0( �hnamd`
Arial&Monotype Typography	 �hnamd`
Arial&Monotype Typography	
�����Once again, nothing happens until this message is sent. And even then, things happen chunk by chunk.
Filters are great to use, but how hard is it to write filters?��e?�
��H
����0���޽h������	?� ���������33������8�0�___PPT10��.��qGr��v	���������(	�{5
���R
�� 3������� 
��>��
�� C���a�����
@����>�|�X�___PPT10�8�0���___PPT9�h�`���___PPTMac11�`X �hnamd`
Arial&Monotype Typography	 �hnamd`
Arial&Monotype Typography	 �hnamd`
Arial&Monotype Typography	 �hnamd`
Arial&Monotype Typography	
����Two of the involved modules have no depencencies.
Socket and LTN12. Socket implements the core comunications capabilities. LTN12 implements that technical note functionality.
The tp module implements the command/response structure common to SMTP and FTP (and not by HTTP)
The MIME module implements the encodings commonly used by SMTP
The SMTP implements the message abstraction, and message sending functionality.�D�2}a?O�
��H
����0���޽h������	?� ���������33������8�0�___PPT10��.��qGr��x� ��������(	�
���R
�� 3������� 
��>�
�� C��%a�����
@���h�>�P�P�___PPT10�0�(�v�___PPT9�X�P�r�___PPTMac11�LD �hnamd`
Arial&Monotype Typography	 �hnamd`
Arial&Monotype Typography	 �hnamd`
Arial&Monotype Typography	
�>���This is the error convention has been adopted throughout LuaSocket and many other libraries.
If a function succeeds, it returns whatever it is that it should return.
If it fails, it returns nil, followed by an error message. I subscribe to this idea, but it can be challenging to implement code that conforms to it.
The reason is that each function might perform many operations, and there can be several layers of functions.
There would be a lot of code like the above.�:�]�n,�
��H
����0���޽h������	?� ���������33������8�0�___PPT10��.��qGr���#��0����(	���
���X
��C������� 
��>�
��S����Z�����
@����>
���
�H
����0���޽h������	?� ���������33������8�0�___PPT10��. �q�qO����$A�9P�����(	���
���X
��C������� 
��>�9
��S��0�������
@����>���@�___PPT10� ��V�___PPT9�8�0�J�___PPTMac11�$ �hnamd`
Arial&Monotype Typography	
����LTN12 describes a series of tricks on how to implement these ideas.
We see here the code for an end-of-line marker translator.
�&�D:�
��H
����0���޽h������	?� ���������33������8�0�___PPT10��.��qGr��|�%���p����(	���
���X
��C������� 
��>��
��S��&������
@����>
���hWe talked about lots of different modules, so lat zoom out a little and take a look at the dependencies.�
i�H
����0���޽h������	?� ���������33������8�0�___PPT10��.��qGr��X�&�������h�(	�
���X
��C������� 
��>��
��S��P������
@����>
�j��DLTN12 describes a series of tricks on how to implement these ideas.
�
E�H
����0���޽h������	?� ���������33������8�0�___PPT10��.��qGr�cx��p^�RЀ3ÿ��lHb�P@���AL
�G�����@;b`B��&V�<�Wq�o���2�#��D@��4C�~wl�r ���]� ��&B���
V#DFH�N�8$�S& �?�L) �\�f,@wX�l�nt1 ޔ�y4�.�� �{�}'�������>\�Ap��/O2�)�j���I���������	�J��?��^���A�f����!���Vٰ���(����
�F/�0��|�DArial�0�0w���������	I��������@\P^�\!�DTimes�0�0w���������	I��������@\P^�\! �DCourier New���������	I��������@\P^�\!0�DWingdingsw���������	I��������@\P^�\!@�D-�3� 0��0�0�0�0w���������	I��������@\P^�\!��
�`�����.	
��P	��@���	

�!�P��
��Oh��+'��0Thp���	��
��
�'Slide 1
Steve Overbyb})�Diego Nehab75�Microsoft PowerPoint@���L�@���
��@�VMX��&G<����PICT4�����HH��
��������HH  t�L�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������7����8GQVTI:(�� >LTZXM>,�� :DKPOG9(�C����1�}h`cfimmfT(��8��ze`cgjonhV-��8��jXTX[^ba\M+�O����"s��mf__j�xrs{�i)��)x��jd__j�xqsx�n0��'r�y^VSS^t}legktd/�U����L��y_aecgp|�{v�����W	��	S��t\`dcgnz�ys~����`
��R��eRTWU[amtlho~���^
�X����_��cfdgr}�yptwsz����u��e��{`ccgs{}vortqu����~��a��jTYWYflmhbfhber���{�\����V���uhffy��vxtspkf{���p��^���odcdv��|uwspnicu���y��^���a�Wi��lfjhea\Ub���w�a����?���~lkl|�����{vpjhh����Q��GǺ��zggiw�����xsmife{���]��Fİ�ykZZ\iwv|�{lha\XVi���`�g�����ĺ���|ru|������yspqty���� ��������umqw�����}upmmot����)��������f]cjs����nhd`^_c{���-�g����s������w���������||xw|~���Ɏ��z������p{��������yxtswx���Ù��v���vuycmxqz����tjjfeggp�����m����&��Önj|v������������y������-��,����hevp|�|������}~~sz������8��,���XYgamoly����nnogknu����=�m����i����q����z������������������t��o����l|��zu�������~������������l���u]p�yldv�{r~��pr�x{�������s������������������~{{�����������������������������{xx���������������
�����~w�qr��umjju������������s����$���������������||������������)��*���������������x}x������������2��*�����zwzrs{x{�qjni|���y�������2�s����A�������|}}��������{���|z������I��F�������vww}�������v��|wt������S��E�������gfgmv���~�xhqvjfer��~t�S�s����^�����Ŭ|w���������t�vioq~�����d��d�������sqz��������p}rdkjw�����o��a�������eajv������wbndU\\f��s�o�s����t�����Ͻ�������������|prr{�����_��z�����Ƴ�����������~�xknmt�����i��v��������q���������ouj[^]co}���g�s����pǵ�����λ�������Ƿ���wrqr�����L��w�������ı������������qmmn}����V��v������ɺ������������xa]]_l{���S�s����dȽ�������ƾ�������zvlje|�����3��mø������ȼ���������ysifaw�����<��m�������ڿ����������mfYWRfp���9�s����I��������˼����¹�p]]ei}������!��Rļ������Ϳ��������p_\cgx������)��T��������Ų��������fTQWYg�����&�s����(����������ɿ�����fbcb�������|
��/���������¾����ȼgaca|���������0�������Ž��������t]VWTm������t�r���������������ý��ų�e]\_p������Z��	������������¿�e][^n������b�������¼���������tYRPQ`w�����Z�m����b�������ž���ε�yqgZUh������0��lǼ�����������Ư�vneZUe������8��l����������������j`WNHV�����5�m���������������ª���ta^������a��%������������¾����s^[������g��&������������������fRPn����|]
�g����fǹ��������Ű�����zpz��zw��)��rĴ���������������vmu��zv��0��t����������������i_f��pg}x-�f���������������������ru��lX_�I������������������os��nX^�Q��������������or��scep�aLPsK�a����,��������������h^[��[MbY	��5��������������h]Z��ZK__
��3��������������rZQLnxN?QV
�[����-�������������k]WW��xpU��5�������������j]XU��unZ��4�������������]QLJrwf`Q�U����2������������skdctkmF��:������������phbbrknL��7z���������sqa[VTe_aE�R����\���������}��yph[1��b���������{}�vnh^5��Zs�������ymnyj`\R1�I����"Ou������xz{nY3��%Tw������xy{n\8��"Ljw����ylkodS2�<����7Thqng`VG,��
;XluqidZM2��
6Pclg`ZRF-�+����
��
��
�����������������������������
��
��
�V����8�3�����5�T�
�SM�8�3�����5�T�
�SM�8�3�����5�T�
�SM�^����;�6�>�^2ӱ�T�
��h�;�6�>�^2ӱ�T�
��h�;�X�>�m\��T�8��o������;�6�-�F��X���'��=!/x��yQ��T���;��}���N�;�6�-�F��X���'��=!/x��yQ��T���;��}���N�4;�j)�F��X���'��iGb8x��yQ��T�Q��;��}���l������;�6�-�O��hG(�^e��fQ�R9�T�s!�.T���͈�@�{�;�6�-�O��hG(�^e��fQ�R9�T�s!�.T���͈�@�{�5;�l*�i��$nQJ�~m��x W�^[�l�zA�R\���4,Ѝ8�\��T%������;�6��R��o��k'H*������>�$�
T���
����x�h�;�6��R��o��k'H*������>�$�
T���
����x�h�6;�m*�{-��:y���LQ'`��7��95ǺZ�K6(4e���J=����!��D������3;�[//&�s��]�mE�d(��
W�G-�W	�w�DT�%܍��2�v�3;�[//&�s��]�mE�d(��
W�G-�W	�w�DT�%܍��2�v�5;��Q5&��<�I�nG��l�s=��Ph�zI�y?�E�OZ�c� �N�l2�>������;��.����ħ���ۏ���Y���`��T�
N�-X����d�;��.����ħ���ۏ���Y���`��T�
N�-X����d�;��0�	���ǹA���߮8���vP ���?5l�)f�Pt�Va���<$���������
�
���	�
���
�
���	�
��6FOGD;9H>FB;G>L;.MDJ=	3FA?$DAAI#$B 'KCA@K*	�D��������/


�������������������7������������������������������:�������������������)�������������������������������������������������������=��R��?��?�R��Y��?��,��?��?��?�n������������������������������������������^��\�H��J�\��\��Z��\��Z�<�������?HV^�_% B\_ B28THB\__.S^27AU^__ B\__KV^�:��������


	
�

���������������������������������������������������������������������������������������������������������C���������������������������������������7������������������������^������������������������������������������������O������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������
��՜.��+,��00�������	�
�����
��On-screen Show�6��F ArialTimesCourier New
WingdingsMS PゴシックCustom DesignLuaSocket  behind the scenes
Short BioOutline of talkHistorical notesHistorical notesCurrent versionOutline of talkSMTP (RFC2821)Protocol abstractionLTN12 sourcesUsing sourcesMessage Format (RFC2822)Message abstractionOur message APIHow hard is it?Zoom in on attachmentsLTN12 filters and chainsZoom in on attachmentsCreating filters: high-levelCreating filters: low-levelCreating filters: low-levelSMTP dependenciesError checkingLTN13 exceptionsNo 'if' statementsConclusions	�#�0���___PPT9������P�����pR����������d�O�����)���;�6���Pictures���������PowerPoint Document(���������SummaryInformation(���������������������������������������������������������������������������������������������������������������������������������������������������������������	

 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopr�stuvwxyz{|}~�������������������������������������������������������������������������������������������������������������������������������quf	

 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcde����ghijklmnopqrstv�wxyz{|}~�DocumentSummaryInformation8������������`Current User������������A������������������������	

��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Fonts UsedDesign Template
Slide Titles�#_���ǫ�"DDiego NehabDiego Nehab�������
�	

���	�� 	

���	

	

�"��	
���	�����`	

�!��	�#�`�h�___PPT2001�D�<�4X�������___PPTMac11�’@f �hnamd`
Arial&Monotype Typography	 �hnamd`
Arial&Monotype Typography	 �hnamd`
Arial&Monotype Typography	 �hnamd`
Arial&Monotype Typography	 �hnamd`
Arial&Monotype Typography	 �hnamd`
Arial&Monotype Typography	��D �hnamd`
Arial&Monotype Typography	 �hnamd`
Arial&Monotype Typography	 �hnamd`
Arial&Monotype Typography	�` �hnamd`
Arial&Monotype Typography	 �hnamd`
Arial&Monotype Typography	 �hnamd`
Arial&Monotype Typography	 �hnamd`
Arial&Monotype Typography	�< �hnamd`
Arial&Monotype Typography	 �hnamd`
Arial&Monotype Typography	�t �hnamd`
Arial&Monotype Typography	 �hnamd`
Arial&Monotype Typography	 �hnamd`
Arial&Monotype Typography	 �hnamd`
Arial&Monotype Typography	 �hnamd`
Arial&Monotype Typography	�` �hnamd`
Arial&Monotype Typography	 �hnamd`
Arial&Monotype Typography	 �hnamd`
Arial&Monotype Typography	 �hnamd`
Arial&Monotype Typography	�
� �tnamdlCourier New&Monotype Typography	 �tnamdlCourier New&Monotype Typography	 �tnamdlCourier New&Monotype Typography	 �tnamdlCourier New&Monotype Typography	 �tnamdlCourier New&Monotype Typography	 �tnamdlCourier New&Monotype Typography	 �tnamdlCourier New&Monotype Typography	 �tnamdlCourier New&Monotype Typography	 �	

 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOP������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������tnamdlCourier New&Monotype Typography	 �tnamdlCourier New&Monotype Typography	 �tnamdlCourier New&Monotype Typography	 �tnamdlCourier New&Monotype Typography	 �tnamdlCourier New&Monotype Typography	 �tnamdlCourier New&Monotype Typography	�D �tnamdlCourier New&Monotype Typography	�� �tnamdlCourier New&Monotype Typography	 �tnamdlCourier New&Monotype Typography	 �tnamdlCourier New&Monotype Typography	 �tnamdlCourier New&Monotype Typography	 �tnamdlCourier New&Monotype Typography	 �tnamdlCourier New&Monotype Typography	 �tnamdlCourier New&Monotype Typography	 �tnamdlCourier New&Monotype Typography	 �tnamdlCourier New&Monotype Typography	 �tnamdlCourier New&Monotype Typography	 �tnamdlCourier New&Monotype Typography	 �tnamdlCourier New&Monotype Typography	 �tnamdlCourier New&Monotype Typography	 �tnamdlCourier New&Monotype Typography	�T �tnamdlCourier New&Monotype Typography	 �tnamdlCourier New&Monotype Typography	 �tnamdlCourier New&Monotype Typography	 �tnamdlCourier New&Monotype Typography	 �tnamdlCourier New&Monotype Typography	 �tnamdlCourier New&Monotype Typography	 �tnamdlCourier New&Monotype Typography	 �tnamdlCourier New&Monotype Typography	 �tnamdlCourier New&Monotype Typography	 �tnamdlCourier New&Monotype Typography	 �tnamdlCourier New&Monotype Typography	 �tnamdlCourier New&Monotype Typography	 �tnamdlCourier New&Monotype Typography	 �tnamdlCourier New&Monotype Typography	 �tnamdlCourier New&Monotype Typography	 �tnamdlCourier New&Monotype Typography	 �tnamdlCourier New&Monotype Typography	 �tnamdlCourier New&Monotype Typography	 �tnamdlCourier New&Monotype Typography	 �tnamdlCourier New&Monotype Typography	 �tnamdlCourier New&Monotype Typography	 �tnamdlCourier New&Monotype Typography	 �tnamdlCourier New&Monotype Typography	 �tnamdlCourier New&Monotype Typography	 �tnamdlCourier New&Monotype Typography	 �tnamdlCourier New&Monotype Typography	�"�	 �hnamd`
Arial&Monotype Typography	 �hnamd`
Arial&Monotype Typography	 �hnamd`
Arial&Monotype Typography	 �hnamd`
Arial&Monotype Typography	 �hnamd`
Arial&Monotype Typography	 �hnamd`
Arial&Monotype Typography	 �hnamd`
Arial&Monotype Typography	 �hnamd`
Arial&Monotype Typography	 �hnamd`
Arial&Monotype Typography	�$
 �tnamdlCourier New&Monotype Typography	 �tnamdlCourier New&Monotype Typography	 �tnamdlCourier New&Monotype Typography	 �tnamdlCourier New&Monotype Typography	 �tnamdlCourier New&Monotype Typography	 �tnamdlCourier New&Monotype Typography	 �tnamdlCourier New&Monotype Typography	 �tnamdlCourier New&Monotype Typography	 �tnamdlCourier New&Monotype Typography	�@ �hnamd`
Arial&Monotype Typography	 �hnamd`
Arial&Monotype Typography	�� �hnamd`
Arial&Monotype Typography	 �hnamd`
Arial&Monotype Typography	 �hnamd`
Arial&Monotype Typography	 �hnamd`
Arial&Monotype Typography	 �hnamd`
Arial&Monotype Typography	 �hnamd`
Arial&Monotype Typography	 �hnamd`
Arial&Monotype Typography	 �hnamd`
Arial&Monotype Typography	 �hnamd`
Arial&Monotype Typography	 �hnamd`
Arial&Monotype Typography	 �hnamd`
Arial&Monotype Typography	 �hnamd`
Arial&Monotype Typography	 �hnamd`
Arial&Monotype Typography	 �hnamd`
Arial&Monotype Typography	 �hnamd`
Arial&Monotype Typography	 �hnamd`
Arial&Monotype Typography	 �hnamd`
Arial&Monotype Typography	 �hnamd`
Arial&Monotype Typography	 �hnamd`
Arial&Monotype Typography	 �hnamd`
Arial&Monotype Typography	 �hnamd`
Arial&Monotype Typography	 �hnamd`
Arial&Monotype Typography	�!� �hnamd`
Arial&Monotype Typography	 �hnamd`
Arial&Monotype Typography	 �hnamd`
Arial&Monotype Typography	 �hnamd`
Arial&Monotype Typography	 �hnamd`
Arial&Monotype Typography	 �hnamd`
Arial&Monotype Typography	 �hnamd`
Arial&Monotype Typography	�#H �hnamd`
Arial&Monotype Typography	 �hnamd`
Arial&Monotype Typography	 �hnamd`
Arial&Monotype Typography	( ��ʚ;�&�)ʚ;�d�d?��%�_3���LuaSocket behind the scenes�6	)���Diego Nehab��
�4��	Short Bio�

���Graduated from PUC in CS & E, 1999;
Worked in Tecgraf 1995-2002;
MSc in PL with Roberto, 2001;
3rd year PhD candidate at Princeton;
Computer Graphics.�D�A%�
��5��Outline of talk�
��~A few historical notes
Case study: SMTP support
Protocol abstraction
Message abstraction
Implementation highlights
Conclusions�p0C�
�
��Historical notes�
���1.0, 1999, 1.5k C, 200 man
1.1, 2000, 1.5k C, 1.3k Lua, 500 man
added protocol support for HTTP, SMTP, FTP
1.2, 2001, 2k C, 1.3k Lua, 900 man
buffered input and non-blocking I/O
UDP support
object oriented syntax�N@+#G@+#G�23KQ���Historical notes�
���1.3, 2001, 2.3k C, 1.6k Lua, 1.2k man
streaming with callbacks
added select function
1.4, 2001-2, 2.2k C, 2.2k Lua, 1.9k man
LTN7
added URL module
named parameters�l&/('&/(�o2���Current version�
��2.0, 2005, 4.6k C, 2.5k Lua, 4.7k man
Extensible C architecture, split in modules
LTN12 (sources, sinks and filters)
MIME support (partial but honest)
Multipart messages support
LTN13 (finalized exceptions)
Package proposal 
Improved non-blocking code, robust to signals...�p&d�d&,#"  ���6��Outline of talk�
��~A few historical notes
Case study: SMTP support
Protocol abstraction
Message abstraction
Implementation highlights
Conclusions�p0C���
�
��SMTP (RFC2821)�D!!��!�
��[lua:roberto] telnet mail.tecgraf.puc-rio.br 25
220 tecgraf.puc-rio.br ESMTP Sendmail 8.9.3/8.9.3
helo lua
250 tecgraf.puc-rio.br Hello lua, pleased to meet you
mail from: <roberto@inf.puc-rio.br>
250 <roberto@inf.puc-rio.br>... Sender ok
rcpt to: <diego@tecgraf.puc-rio.br>
250 <diego@tecgraf.puc-rio.br>... Recipient ok
data
354 Enter mail, end with "." on a line by itself
Subject: World domination: instructions.

Commence stage two.
.
250 RAA10452 Message accepted for delivery
quit
221 tecgraf.puc-rio.br closing connection�"�pnPZ02��	6��$*��$/��  1$$��@((+,,��00)44��88�,		"

��!��Protocol abstraction�
���status, error = smtp.send {
    from = "<roberto@inf.puc-rio.br>",
    rcpt = "<diego@tecgraf.puc-rio.br>", 
    body = "Subject: World domination: instructions.\r\n\r\n" ..
           "Comence stage two."
}��d�P'CcCcC6ccc C $$�								
						U	�&��
LTN12 sources�
���function ltn12.source.file(handle)
    return function()
        local chunk = handle:read(BLOCKSIZE)
        if not chunk then handle:close() end
        return chunk
    end
end�,#d�F�C�
��'��
Using sources�
���status, message = smtp.send {
    from = "<roberto@inf.puc-rio.br>",
    rcpt = "<diego@tecgraf.puc-rio.br>", 
    body = ltn12.source.file(io.open("/mail/body", "r"))
}��d�P)CcCc(CcC�								
						(	�,��Message Format (RFC2822)�,!���
��|   From: Roberto Ierusalimschy <roberto@inf.puc-rio.br>
   To: Diego Nehab <diego@tecgraf.puc-rio.br>
   Subject: World domination: roadmap.
   Content-Type: multipart/mixed; boundary=part
  
   This message contains attachments 
   --part
   Content-Type: text/plain
   
   Please see attached roadmap.
   --part
   Content-Type: text/html; name="roadmap.html"
   ...
   --part--�0}P�CC)CCCCCC  C 
$C$!(C(,c,0C04C48C8<C<CC�"[	�.��Message abstraction�
���declaration = {
    headers = { 
        subject = "World domination",
        from = "Roberto <roberto@inf.puc-rio.br>",
        to = "Diego <diego@tecgraf.puc-rio.br>"
    },
    preamble = "This message contains attachments.",
    [1] = {
        headers = { ... },
        body = "Please see attatched roadmap."
    },
    [2] = {
        headers = { ... },
        body = ltn12.source.file(io.open("/plans/roadmap.html", "r"))
    } 
}��<CCC
Cc0cc.c c $c$(C(,C,%0c04C48C8<C<CCCCcCCC C $C$E(c(,C,0C04C48C8�j3}	%	7	/E	
�1��Our message API�
���status, message = smtp.send {
    from = "<roberto@inf.puc-rio.br>",
    rcpt = "<diego@tecgraf.puc-rio.br>", 
    body = smtp.message(declaration)
}��dxP)CcCc'CcC�								
						'	�D"��How hard is it?�
���Message structure is recursive;
Need to return chunks but mantain context; 
Nightmare to write in C!; 
Use coroutines;
Write function recursively, naturally;
Call yield with each chunk;
Next call resumes wherever we left.���d ,7``a`
` a $`$((�"gv	�:��Zoom in on attachments�
���[2] = {
    headers = { 
        ["content-type"] = 'text/html; name="roadmap.html"',
        ["content-disposition"] = 'attachment; filename ="roadmap.html"'
    },
    body = ltn12.source.file(io.open("/plans/roadmap.html", "r"))
}��d�FCC	C4cIcCAcC C $C$�:"}	A	�;��LTN12 filters and chains�
��)Filters process data one chunk at a time;
MIME module provides common filters:
base64, quoted-printable, stuffing, line-wrap...
Can chain two filters together: factory
Produce a filter with the composite effect
Can chain a filter with a source: factory
Produce a source that returns filtered data.��O1(+*-*%1(+*,�
*�<��Zoom in on attachments�
��
�Q$��Creating filters: high-level�
��
�U&��Creating filters: low-level�
��
�S%��Creating filters: low-level�
��
�>��SMTP dependencies�
��
�A ��Error checking�
��DFunction return convention
Return nil, followed by message on error;�Bd*dA �
E�B��LTN13 exceptions�
��try = newtry(finalizer): factory;
On success, try returns all arguments;
On failure, throws the second argument;
Calls finalizer before raising the exception.
foo = protect(bar): factory;
foo executes bar in a protected environment;
Returns nil followed by any thrown error. ��"d}ddXdg��c`	``e��`.`	 a $`$(g(��,c,0`04e4��
8`8<e<d``a``��	u�C!��No 'if' statements�*`�"	��hInternal functions throw exceptions;
try calls tp.close() on error;
External functions can be protected.�xi%A
A
A  $$�
i�O#��Conclusions�
���Hope you like our API, we do;
It is easy to implement;
Function factories + closures, coroutines
It is fast;
Time critical in C, management in Lua;
Questions?�l7*'*'�,V.
/������� �$�)�*	�-�/
�2�7�8�9�E�F�G�I�J�K�L�M�P�R�T�V����
����'�����P����(	�
���r
�� S���t��$���@��

���l
�� C����t��$���� ��
���H
����0�������޽h��	?� �������ff���b��3������___PPT10�u�.�q�꾖+D�='� �Ɛ����=�
@B�	+r�O��#����VӰ