From 4a7145f7d7b843a83bd054cb681055dc62450c8a Mon Sep 17 00:00:00 2001 From: Magnus Klaar Date: Wed, 10 Aug 2011 17:25:29 +0200 Subject: [PATCH] add simple test for making a copy of a torrent --- apps/etorrent/src/etorrent_dotfiles.erl | 47 ++++++++++++++---- .../debian-6.0.2.1-amd64-netinst.iso.torrent | Bin 0 -> 13676 bytes 2 files changed, 36 insertions(+), 11 deletions(-) create mode 100644 test/etorrent_eunit_SUITE_data/debian-6.0.2.1-amd64-netinst.iso.torrent diff --git a/apps/etorrent/src/etorrent_dotfiles.erl b/apps/etorrent/src/etorrent_dotfiles.erl index 174b98cb..85257052 100644 --- a/apps/etorrent/src/etorrent_dotfiles.erl +++ b/apps/etorrent/src/etorrent_dotfiles.erl @@ -4,7 +4,8 @@ %% exported functions -export([make/0, - torrents/0]). + torrents/0, + copy/1]). %% private functions -export([exists/1]). @@ -30,9 +31,21 @@ make_(Dir) -> %% @doc List all available torrent files. %% @end --spec torrents() -> [Filenames::string()]. +-spec torrents() -> {ok, [Filenames::string()]} | {error, noent}. torrents() -> - []. + file:list_dir(gproc:get_env(l, etorrent, dotdir)). + +%% @doc Make a private copy of a torrent file. +%% @end +-spec copy(Torrentfile::string()) -> ok. +copy(Torrentfile) when is_list(Torrentfile) -> + File = filename:basename(Torrentfile), + Dotdir = gproc:get_env(l, etorrent, dotdir), + Dest = filename:join([Dotdir, File]), + case file:copy(Torrentfile, Dest) of + {ok, _} -> ok; + {error, _}=Error -> Error + end. %% @private Check if a file path exists. -spec exists(Path::string()) -> boolean(). @@ -61,20 +74,32 @@ teardown_config(_Dir) -> dotfiles_test_() -> {setup,local, fun() -> application:start(gproc) end, - fun(_) -> application:stop(gproc) end, - {foreach, local, - fun setup_config/0, - fun teardown_config/1, [ - ?_test(test_no_torrents()), - ?_test(test_ensure_exists()) - ]}}. + fun(_) -> application:stop(gproc) end, [ + {foreach,local, + fun setup_config/0, + fun teardown_config/1, [ + ?_test(test_no_torrents()), + ?_test(test_ensure_exists()), + {setup,local, + fun() -> ?MODULE:make() end, + fun(_) -> ok end, [ + ?_test(test_copy_torrent()) + ]} + ]} + ]}. test_no_torrents() -> - ?assertEqual([], ?MODULE:torrents()). + ?assertEqual({error, enoent}, ?MODULE:torrents()). test_ensure_exists() -> ?assertNot(?MODULE:exists(gproc:get_env(l, etorrent, dotdir))), ok = ?MODULE:make(), ?assert(?MODULE:exists(gproc:get_env(l, etorrent, dotdir))). +test_copy_torrent() -> + c:pwd(), + Torrent = "../../../test/etorrent_eunit_SUITE_data/debian-6.0.2.1-amd64-netinst.iso.torrent", + ok = ?MODULE:copy(Torrent), + ?assertEqual({ok, ["debian-6.0.2.1-amd64-netinst.iso.torrent"]}, ?MODULE:torrents()). + -endif. diff --git a/test/etorrent_eunit_SUITE_data/debian-6.0.2.1-amd64-netinst.iso.torrent b/test/etorrent_eunit_SUITE_data/debian-6.0.2.1-amd64-netinst.iso.torrent new file mode 100644 index 0000000000000000000000000000000000000000..cc38e5e7474a02bc1430273db87d85f0fce9d4d4 GIT binary patch literal 13676 zcmZvCLy#y8%;ea%ZQHhO+qP}nwr$(CJ@dvk_pAMPtM;(hPA8Q^lBy(a!og)|XJ_wf zXKc#C$YtT;;=n~uZ{*_QWN2({>O^N^YGi3>M`!P3&c(*b#!3Hwx$IoV_O`aBb}r1U zTtp)On?xWiLSW`(Z%bfoVrgq=Zu(xV5ttadm|8M2GjKAov2wDo zo3e0O+L_s#uyNU#+L^mpSTeG+F|skRvvK@qu`{$aWoF{~pDbwE=osjj=oo1YZB5u% zXzfg0EbW|K=q#P>8JV~oEKQ9~3I0zACN?HU78X;s|3RG@nORsExVZ0owh~i;b0Zvr zfe4RJ)DGYvZEDddWhSW{!09aCt27BSV_h1&c_);a-8oDh4>Os{uX)%Tf^<r5zUV{KlPfuj#NVQaKU#4qHAW#^@FhU~~D?4;=34fWVLp2o}TWJVR!90hui z8Ii)Hh9IWJ5_0Kp=cSn+WKI+#-IyL}Y$D;lXT6TN5iP3#V&sFO1B34yv=_XBUH(B! zJKKa@irc0ezHumSV+GzA8R>J>bNQ1qKa8BRRCs>bzH!FAK4Ks^@&g!yK;Z@zgy$w7McMC{EmanXp!!F2ZMHjzC4oxjh7?x zNd=p&ra^}n%H!Wri)l%5w^%#eIst`PQL8|A^4Mp_!e>4@)p#DJyew}6&;^^==01Qy z%^v|pk6s9zfJufOBO%3Q;v+_}cdtbJsPI#^9+tg8(>rpJG3Ra$fR*P#H+E)`%XYmT znBW^XCDmue-ik8IsY{PjGDcec6OJV4S|O5i+Si)><7DXaNdW?NV90E%C8XfB$%mJ! z{OMGui$UbuN}gsOMmxr4ykxSA-pr8*0676zxAQE{35s76F5;m>R1aH$y7$TRkQMl4_Cm;?h60_HYwND7 z;ZA3(#N5fdcX+=+ArtIVlY+Vlc2;KX_ro4%)oID`qf`Zu_34Sz-^I0OxXJ`<9Gfc@ zwiX3+AN%YyVv8GXgD!($9MSk9QbmDf*_ZpZvJ);a2&Chx;;C`iqj=m(&E5$LOt9wx zg)4kC84m$P20e6q6(@38m+iHw+yV%EptFAZByR*WDUe5@tO+S*tbH>?18sjVrwP{htiPuB85R&3DGFDqPCn zEMjA8LY&VvDL*1Pbi@AyEk{SQGEvnw#!4#)wfuXv{d(S{r~S*&hmO-u$r*3kmPI^* zwlI#0n7{Yu+RSW6yFVVZbw2vcb&LXt+Pg4nHDeo|Hse)-yG2VGzP!fdR2`zUqsqM7 z&@%Ta-sLa5nPGvDkozn2-k__axk4+b=pmXFb`9$;d9Ak@Rw+_rCS946*ze%}TE1e) z!zbeMfmgNf`)E_LnGn2q@eNLl5CKCaf zkjzQs=mv+XwNrS%T+UwtBZQ|v@Ug*VF@KR@BK?SG0;8ar)L&3@ky<7`&Rx0>JjpyV zy`_p0FQy7Ghtu!LNB1D|29nLFxLKnh4sOXq)b98lV9TFwkvLz#iz~M0}|$T z1tzTShX`0#Cskjk68<*y-SmLDg~dqNDsAwPIBvMvA9W!*>G`3qooKyJvsM^x>si>EUUQWC~GeA9ylCi}wbeCfMr(q~15|nc?0!7nilL^_v(yTVZ7$eIdy%QkIz2M+qO6yOS(Qj4)-Y4f2NHpSVs^JJE1t0Nei!as!iBfQ(JRA5rA4n59 zLg53bHpt+?{0qwaX zA+7@+z5&Yi_f_1zA;!oo&M2NM#3Ke2EXjPD6Tu|dlL^K|)bN^w4~V-r)1;2!i@Rfm zG0KT4`ukzNhg)_EmUL9EtQ(|?tRhs3rny6ZTpY}m1z&T3EVg49J`YH-NL+q&S|Drp z*6}<=t2kfQke;EyU$tfdjFa5as1zKQ&O?KHzh~m&N=cX@Yzt$HyTMbvaNs`!9P@W= zByH>U>yAZxSzwJcZ}cl&8r5Cjt7aj1vj}(XO#ZUIhd?sx?txp^rzpW5bs7Xse}Awv zSt^fcJs8Y*VM&cPx~xs!zJ7rpEOd%6s0+M^H11Fx4u1u<;p+Yfqd;K$XID#4z#Mqo z@jl^*u`%Ju_Y^?m@xvljnR)nY(&(AM_<%OeU}8FC-rV*deXQI3b$V+J+-n0XNbsnh zulYkVgjBqxk4}7ja;U#G{cbc%O|@;`j`M8bf^|Rq-zX3A&b@3u;#WY$xjA9B06GI8 z-#gS9S7J~1TtZJ2w=g{BlpSDj4gONZlUlbk!IyM!HkkWF(WoPt0np7yx$-X#vJIo^ z!P6&)$er8C)Z!IP!3m1eW%*qD7lsPErP|3}BPnh~)0@3haWp4lh1^=lIdxK5Zs|Qa z(*4o_#~2Vm6;2_z7a6o(2l-`<#%&A{DObIWIC$ZoWOV-GgO`%5=7lk*Ju6Yu7M8X>c|Y0r4WoNuuORem%vWH6B2UBH6y>TKstFhOu!xbw-nbxWwhKn95YMpdbd(-OB zs5jr-%GsNixvC2xHbHRmr||5can?m1UjpQMpE<2j5z5{+oXGkQYFlVClC}r$?zIHd zqk>7v0b+WOv^w!N{Bf{V&m?$|tkvRiuf>d@SqJXSIt5m{Ovu)`2dLGfVriv|`So4` z@A}^C@VQtok=*>)3gslvAGw^X6t$2J#emYd#%AfbjK&?9WGsl`5s#+h^W-o9As%%q z7VD&5F;p`4?L_{Lq#skgSk`8G#AHh(o#H-!IFN$Ez|btU)4krEnfTJZk@Q{R%}rQ0 zBl1_B2{*FNP6CdC#l8kt7$K}-H$s##rvR%kaj)`2<`Z754)lYahCM`01U<&gm7Tc@ zL}ltlASgqPFsgP@TV@YkD{*fp8wodfvBRd<_kfGA-3+2_{MT@Hv?!VboUSq>#+;<) zqZG<*hOx@S<(hv<4niY50UbR>0l`2`LJVh!@S~_VjeO^1r9$J^_(#^``Wc)jX)ZE5 zvzTKkgFew}4b~`>fX_*W-j}@!Ze0Niva*s{p|-~?HW1euB8uM!I$27Vxcm8t2dH&| z={H3$OE;9j*|=XX!%`esM6ck4Sx-}OzQp{zB#v}@@Q`CND+?|X-F zD?Qh#PQoeX*d|HY)!B>hl${OdI+GNr;5#57v2%6X3(_25^YhmLMI**JoQjeL_VOh` zSFrpfzam|Bg8z+H-8f2u;n%y#f5^7Ut!MWUS;hbloi<^9o>Xdmn6Bs18!Yh{~nE02~SLC7pS!ua#iPS=*=XHR$BLB zb??ecU}x^P{({GrHrf)%{&y56dIIuts3gRp;J)@^)T{k8annDv^$2ZcvVlQDvEnSK z^L!LUp;f){Jb7H}D<^HkVh&BttHbwtV zl(PuPzSEG}n5#QELNSovK#C_57aY8M=VHDc_;7__GQ#Osm~*5-w)7?t&6)nj9J14J zCrhBn3xp-SmnF)HMWDgl6{9J5MTP%R~bb125q=xhyfAQAJV3466NFOdtG`+}MIA;!1Va*xJ zZEIGvzU!AV;VKTp)TTn05j*_^Nih!Mz=7#Sj#l7q`a#7JJDfmAD9*-)gG`g!V^lIz zOnkZ4)@CbQlxHd~`mmJdWZVNfonttO#3&k&+5Qk!dsXVVyI$k|IG=So1%LyT?UVg+!yvmr7txri zXljsO&S9fQzptaKlrLH_Z?t}c)dC|LW)>o-U2=$dq-8si+;!IP4{M~74Lj&~kW&T; zsy7uNga~v7b3?Ch8sb0#Et%1F6PtY>l?+E6eboS`Qog*wd3F6@N~lGS&Gi?P1}o8b zOy zjMPFdNmTX?7YT(x6+AQ4CSbKrhFq-smT6bY%xHiTinbNZ^F+?927E%Yfzdaq;L4&}Piv@Lw&NwT!Q}n<&@54NhJx^%V9B5A0ukxy=GvUb+Y?BnHGL9m`9X{FpR3A z%EDjPb{k0Hi6$4Kfhuz#TkM^WW&mpWP{%;IM29W*3LhVSf;_dzaL?wa-QGa}3vyx| zOn5W^YfhdzG^iA;KM9<&?AW4kOwKHq(`&IOC3(H7xWMad8?-Yt5s&WPp&q6~LWjoW zGliN418Sc-%j%fmTd)?lDjRvUw@JK!iu9C53mql89%_R1%EOi1Ou?2VkL~XXRft5j zN@`&y1C)T-UdqPJIkPrB%e1UizL`S;s>`#Ya=(+n=u^*8c!3C{@+G4E!mHW-N#*K8 zqDxC^XlC%KK)E@0*tWHBm{CfX;@9F~72#YQoKGwY-KD!2N6mgtwNomka z-2~0YRqyGarO@KQ-CF%NeB4FHR_?j}0f5MT1biDYA_ywne`BO^+KR!fxPJttvVhW2 zXs|2b4=tbABbvOri(xPv$1)CA9~^R*0jW&(aVJZY3m7J*pu|b;L#oRLOryvbpj{Gf zvWEM`W{!)5y<1Qk-VGvPnB5JvIR4q9vN6z7q%Ddg-?Wsd`b9!1pbmkYNEuR!_KK|p zTZthzXTPuSwbq`|-rgb*WC;*XWj8?Bf&2S|L7>DS8zPu9CbphFrwGv`88od}D&+{& z|8xScz-A5Xv^CT+7he1@R$;PAXjv5oeH6BM^@#!S&pg z5PZLgJ=E~Urbq-6+3_$)Qmb>Pkb*t>`I5PHZ#<1L%D&mM7g1>Fg=db~*v2uYW8wyv zT`Ci6-qvih$+{{*joyCMbm_(0buID@E_nSEl9&Jw)&}rvz#t~QOqxG+2OLR@sdgMV z!Vc{@e$;wC!N2!TByS#L)~wtJv^$e8ueRIw$X9sKTQMwk{OkvTmc*rkbACQ^3!hmS z(vrQTj`h&W?lAX-#{xC^ioZn^G_3rJ?yl8INFRUkf(i2LF21u6|oHvA%T8JQ*~L(pcic< zN4!5!x8}TV+P33lYmP%XY6cI0bvzE*Lcbd6nTP+ohpmF&V0po$R>SwGUYf%J{=J5U zczdL8FXp*OEw@liV+(-0s8Gs>p4`)?*rzNs1TP+gtJvoEfO#ci177hy8-RXR*4p!? zJg{t_9f8K{py)LRZ=_bSDlgp{0_Q-JCB6680kCH*89F21V4x5sT^|8Jpa}M{atgyB zW2j`c6knQwn|I4XDAjjDnsVYD0vXN*N%`x=XLajaOn)iJ!Vw%^iTRsh%V2z- z)KM9T)NxE(!wn)ba{yF4>v=(8v*T-$wNw;iF!= zD)gj3IUu4tTt4CApWxawfiDUX+6X%i#YY=_Pr=Pk&Mb`A5jrn;rGQ=h`G)LP8_O6=3}I4}v;{TXNTzedgPU z@j^WK->7qI?hv*-w243_|S@H{T{ihue} zFFV;#hxF9OBf*UG8`6Cqr+A2?MAcPTFDTOKg+%3I+jkgso$&!fU@!dVK%l{_$X>?F zy3LpWxk_~MrJnmWJQb}}zVWhzvqHNqbl&rz@RAEB3rV{z5hjlNr#{a-d&Is;QK^20 zBJLH^FWwZpf0td5sg*0q#~%HgC;!p&x4sS$=+o^Jv@!0tiY zsI@$#oKLIbm1pjKsIesLKfXD>TNu)ILZrSM!juEkA4KVBe*5kKgj?wHQ;yUyQSN{S z)#oB&_RF_4x)KKLG=hO3He&@8Ghe->RWw3uCtCe9Zx`Mxx_PO&>l46 z5j`^Oo@HJ=waWYC*%*b9S8w`6An6(Gi0EtZbPli$X8M+vpjBNMA+7mGyUNab3UN*M zKw;mE&4$N&oD>CV$Ng=(F3xZ`{PTHut!3XLN;Ck+QXMrb+G?NPeD3JhXRZnrq5oR9 z8mNdJL2DX=&%=Li>qbf3DiIM>K3&3vpOj%P)LkR>p41D9S{z<>)L`00%+RvblZj}Y zrLiNB%`zU#>C3J_dD&nR#x5je1+R3zb zjyue&RMYO$jkRcYs|$jBb@AP!Q4(St_eC z*NMOYIYSzdL9)qX@nl_U8t$Ynr_|X~^txUt2UItO_CyqZYbA z#{i>*%%AX6o|nKA1)O~RisMkp9`fZ6W1#5E0lqyj5|-#>7tlx6VAk)+yTAv~Up_jW zjIiTSPl+sRyH}I3Hxtj{S-TdvniQzXtXLo@jtI0dOFkJL1pqnMBJqxCEUAdc_@?Yt z%LS{}mEZ+QqI+dkV$8x>;u4%}MxckoVc?35a~2&&O=CTBMg5=nzvo(6I?Tn#;761T z%oliXN7M+?C~Hj2loDeS=O037omB))1P{LX_jf6o&W3y9{bfE69El5VzUW>uV^HQZ zTxKfYb8yrz96QhFNF&Z5Z5urBme(x)^XN0XYcA_zd0u)8u=bKp5(?>__ja6x>q+Ux zG`rDJO%Ep*nE`fC_+)Ot} zjQMA(pN|ACx{QR%$P`E^Y>)ucn+A4N#y1U(%y_J-y{H7V z$;+0D(06LVX=&)*Y&0@dVGK3~5eqeHvmR)6oY@pWvhqys#_9x3xKbO$76gY(v#KI$ zi%MTu&oH7u#u+=nv$Z$Entbp3*|Cf$0C|}QoD#@6T?!RpB>yF`g6%b)#u^76LtJY7 z1>S1#T@vxzd(I$5c)+x@xz9O;uC@�H#M1NP^6>=Y9FBOOUb0;0*~Z{h>%wcNbOK z${eHn2*_Ygk2HFjEnxuaW`E~?8Sw2gYEq*fukO-q_i{up4`VIZ%7Xfd#N5J@_adnB z3;lh2-x>*wv1ysY1oE>tE~X^_fJnFrBevNa>L#|fUbHp%TDUPtzGNhYC+ymR`aI`_ zPI!vKFgD6WgW?Wwg~iv^m=m>ko%*|qLd{=@+WLlXsxo|=%+AU-8ieGs z>?3cq94IW5Jz^LMKoOf%<(TF^uO?5oL zW@y@_q|@XYisLcA>g`!c%T+#E8p6)q?mg$Q&;pExZlNl>1!^BXJ7+8;y-!Dw*%7|s zHUWHv^4n`0GWzYMs52Mf?2w8wqh>Y?1n24?L6Tj$PM+Cg?X4Uj+lZBvZO2ka5(>T5 zL6Py_4@1t%ODc$5z!EMg3#3gk&*^Jc9hbbAA;AUPKcXgrfG13@j-YqQM(P>BZE9(? z>wGulMOJbv_mX(pHgQV7ZeXH_(0@;GFL}h+xu5Wf4UuzHM@GLtkd2QHT z4v19JW!;F#;P+b(79c)*gPfF}0QI(n{^5qh($cO;XW9VGl|i1dM-|tz72oear?2&@ctHUtv>=PzTcP zw=JD~N5zW|89YVC8<^@vUiini-R1N!y=sa~ECFQ{RSw}y8-8tY9_hY_W8+_E znp~iH6;u{KZ*+FPCW+L$(HzV%Z>t?W+w?w@M;aQB0H4zYju+y0t9$t18lWsyUPTa6 z>!}f4R{Wo)LwP%ZP6VL=9igH8MnMS61(QRlJ#(HJ?DkIyV6EM5IcsM~Y-_$h+EpKB zj`4%`7w0IjO(5cCG|=HRg{9CQoM|#Tro8Fl@Knk|;iL;+QIbxRrwcX`p#{=Bj3My5 z0ald8n*lULPNOK(2PSDbz%_SJmsuyoG`EgtNV-uoE7d3)Mr^KTqF#!so!;HXqi1x0 zqXs;*0JmBJXXj0+&?EfCeM*@{y}F9c$Fa)0U`TcC(jeL3=KOc2CO$3QZwJva z$_;eZMt&b(4g!3_O)fsuT+@0qt!#YoG^R#vVptX8Mjb3Q2e9f zRv{U?^1B_5_wf#-J19JVYrNoj z44Ask*jK=#VxIRtHkxd^>(mEOC6`W<`xB`(`hc8qEjvM3`sAQ&o=M7?*EEYq)yjr) zTwu4e{#2gjc){Oj$jbO?~HY#Vvl;aAyub770<+utUgEI{9H@$;;%x>JYYk(d0( ziGJU2fE(EMI4|quSg`u|nmY3{HgP4BWjW4w%f^zRQbMESLNpTlFXdn=7%DwQklU}TXu1+8nOv9YrisS(T;+b@!u;i zYCjtkm7uXU423{_9#&+g*Qe?I!JA$UBVv}vxc)s zm%P+My6`0!oy67E=1vMB^(o`9si)Xr+NSeIQD+yp0|8AmDBvFJBQQ4zfVo?+d|=N#}rpt^3KcRGxv|Nf#g} z4;dMr+KlU9LFGZDQ$+?~Ey$7lq$K6!X(!yrz1f@+a*c-iw{y;+5{;i1iqU1}L9Epm zAme-~ejZRz?tS0+lr)~?oIbWj!in}FBr*Z0JT#yotz*-f*F2xlxv8S9KZgU5#?<|T zN?f}Br%|D0kz9Q(gHv3}VJJDku~>bR-Ju=)PKFPdekKYDBwE1|Mb}s9#QMOYk5o~{ z*zVV+%cmr(v9Z$%pBpDH$kSWPkb-ad_>4+edC(nKuCBdRz zj}1vk-`Ectze?MRIu%ucD!&KJ!lwq?Pc9*iy%JGqP)dhqLn@UYd<|m5P5J=`bV9Z7 zXw`x))+3fwa(e+?aO)Hn2^Lp;oSIfXBv>`Jkl1D1d^>LMpXFZ-cS4`Xw~koSqq!A! z!tyiz9&vzO=m;_6gqO3rY{4<;bVmaDH}Hh81C*vPO*DYs>8{nGXNed4KE?eDbxSK1 zb5(I(Ew#n%3dId2)^s*1fFB;%#-iv%?4`_;9aD-@B1yKv%E-Kx@1PIkO8}sH0!x5G z0CFYhjY}%o$JC5tQ84Uo#SS>wZ}yWeP7*cKx|iq4N?N+|3M)KBfgB1Xn{=k>3)5I_ zwXzCrfvDAa_yd{xJlEj58f!b0ft1G@myGc`mT=-^0ykc5DV0!wf5oCH5r`R{JTs|m zbHu0e9{#7;yrd@9HKa4&4)#K(hgR?Hib)FSu3XFudcfKsU2^<(Sar?JMkM4|Q_|#S z6zHOdL{Fh$i%u3uatn`)=b&(xze*4Ds0Ca8gz(^6PPe+1-#=j{%ze2nOq0q>4G`&+aKS48JY=1In|YwkTcTsE-j8D?mmvkXu* zS8scZMv!!13OV(n0AddoH9db_e+9QDEeDNXuT(f2sU#IBC*y(3u6W^E3&D8fk$FOX z74xnQA|d_+(Zior(K7yX<1U|bABNH`d3$Y`4d=m+*hG`a1I{d+Fe5mE7f_jy*F5)| zmP)+NxF#%_H0cxM>(YsY6O)MhC>B{5EE7}Fz?RH%hd=LpsXieI5-11%RnIbjx8p#6 zZq2@gEBKO6<;6W$3{1=g^jCz)RVK`R0{!IweY1iVWm8{ks|2=*v&0G=|lw*_x*?LA-kq zfbQ(~8g(tS!O%mkBkM@@QBv){KtUNG-e6qTBY&@qHvBjFwHJQ~x4P^JSKF!`7ct23 zj)O(Bwh%>=aj=|}OB)DqHTT2B~R9%+l5g~fjRQC7X~6P5N-jy?Di zxk-!7$U6`-iI&dDJ~ut}I>8li?3F_@zKKl5CLQ(JNrFK&Cz>L$O=VooO&sxV`h2#> z5T*!cAKj8qHFK}$z6n1~WS#^yLWU%{w|xVn-wE_kgAqw^hFp`rIV^3nC6?jjrd(NZ zB$j$HPdhn{x58~P>xz^Au ztkDtU6B9b?I;O2fu=`gVQdg{7^WcqHm~#oen7fHS^lRneG`}8mn?EPdX|Z|@BnE*W z{d+{v-~dN?CXyp}F5;+$~~ribf4MRD)gh~@l{z}Q|{ z4$(hs0+@@8)8hFTanuGqq(Tg{j@%56i#jH~ytD^c*Xjzi0GsFxni0IPf7h2RvqSX5 zF&iZo`gZ&kVZgb@dCERK%ZcscN#zDA@bT9|RJKfIn9M5F**&Z5YXl=Omt90Y0T1!g zN_1n^oTolw&tfv>$kDCFuBnudv0=V#%iAldZ8y^65WzLTeQ^uq)vzKg9G?~-9ToRN zt9Vlg2;{XkXUV**Sg}atrVfJ)q|%g|!gsPk-_0>rz|j)Xe&SNp zNv3R{W);$1tBpWY;t=rFzYKHeM3@!CW(o&hL;+1?9=z<7WJK~c(DQd2xfZYF7*v+H zsck{DiVs-kn?#T|m$P!_1^-+e8Ih7!&+tNW6n`&LLxMn_JyENx{ z8`CkVY}iH=q8S5M8_dcCXvt&3vyHx7OqQ>vXk{TK&%=r6OaOq>76b6NgO@|i#7A); zDc&VG%2rO0KF(U?FBF1}dIL}*umm^FFHXmjtq7jw$P;dFgEX%JH0jD}5zRO8tL*sX zMV*~1@lfsCJH_;v!f8_OO=tRMfK|`C^U@Vr!mFAuWr*)n$q8oyPyLLjO02%%1A`S9 z=AxO-XC94%bRsY`;N|PDK0C0%Q6Vi2Ojt-ufOKP~UUAmKJuKs`D{vbq0?&^n3y9?>u8w+E!5I1MM_|a*5uh-@Fm=fN$H_W z<(Yl;p7`Td+)*+G^(5Wihhc3_n-YHoqW^m8u@Fyh-uKsyUDIJ(J_qM;TfpTJ@Q@%i z{(QG!W9D5S(|Hf8`~*>Tb&dJF_#A$05t3+|Tk($Na^K@fL6J>+noivX8_|m{rnXKE z8FQ?%L3B5ZlTh~5UIo)V-rh^$!eI628ML|KF2ekbgw-rM6Y9yY70(_m*Hb$toDE}- zf6)1p)pr{KtPLERbWnWo3`mop5c#Xu2XzI&~7JaZE56Q~aTO-2+ zmBqP;2Bub2v{9xQtfS~8zi7R|HcZ%3g*hcRN-qFnxA%yl)w{rWXg4Hcj$+(Ok9?t_ zY!JK5eC3Jrscc1|7d*$D_s+seL1i_$^!9N$5*a^`u0I4YZSol0Kl`%=qYnChj}^`7 zlTPBRvCBrC%h%Z2q`npspx#r#ib#?rT{}cWY~3zyGHso23aH9IKOyL7Y3hlR`L3^1 zttIx#9ojxgE`x?>q87OOB1=DU!WJ8|x&i9hG(9j=VOHNWjpawWlDIGD?$}`ztYNhFJ;g77TJuA8^~yVDqDaLcQ7{kb zYB6{yyqCoO)q4dvm=Y8uRO?~IRP@tL9+&1fN`o|iUv-a9g*+JkDrWcONIo#<9wbxQ zs?+ToC4+IzUXZIJe4>@szoIb0neYVWX$=GfFCa=9eLkJ)ina7DNdzRgR_s#*bOmJ` z)s$~NBx(2bPE&0WTJ3$cAb$YV8$^P0_%amx=|!w0hvJ_c|HCBhx%*oZrGr0R>p;?v zPmn|!o^>2Y$iiRNZ%=P(tdd1G&<2v#jF5ST;9vm;z?F4&T&mGf_b?pRE{FL=xkgs` z3%RXDppzt$5}O~eAMmOOM)#U!6gX9y`7-_3 zAtlgh=61?eK^^SVc37c`M(qA*oFE^iF??;}v8UKQGwz4T9?Wi=nqDPr@>KVY3~2^$ zNY;TejKFx-+}GLYwP!^ZfYZ~Abq$2KYX#>)E?jq|9idBsHa>Kl@>$O;{PR7bvExi~e%0DptdLqxD8S*t>8Wz8J}^7{*qYwQE;5-N6)usB_zO^5G5^SUDf zaZtXh-mx?ICfvORR+=W_$GL|l=0V_-j)7kml%SurA6@pYn65>YTU5Zt(-z&_MOm$A zlUwFc=h^vhz?D;8YABU!@jHHk@wk)apq-{$D`bC%(rYU$_U0=I&}CvHr{G=gYP>WY z1Shj`W0*9fl;+Dk|KTer<9QTkb!_K2YZHts6&96O_VoIIrcVOOtel<8ktEi0ZQcW! z%O4Yp^+GN{=GcaN{&^hhQ5op(9bJ`j>1 zsT}pla;;y^?N7giyRF?7^4)5uQ|&)c`z9}GHqimVm!GR^jz15ntZWYRJqMm>mjC}S HQ`7$i?@43y literal 0 HcmV?d00001