D - Is the current D slow or Java fast ?
- Mike Wynn (1254/1254) Feb 06 2003 I've been testing some crypto code, basic port of some Java crypto to D
- Burton Radons (4/8) Feb 07 2003 Uh, yeah. You need to enable optimisations. When I enabled -O the
- Mike Wynn (42/50) Feb 07 2003 well it's as good as C# using dmd -release
- Walter (4/6) Feb 09 2003 Could you post/email the C version please, just so I'm using the same co...
I've been testing some crypto code, basic port of some Java crypto to D (the C versions are all macro'ed). and I got some disturbing results PC used Athlon 1G33, 512Mb 266 DDR java version "1.4.0_03" Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.0_03-b04) Java HotSpot(TM) Client VM (build 1.4.0_03-b04, mixed mode) testing md5 expect a 3 to 10 minute delay 1M blocks - 24065ms 24s 1K blocks - 21381ms 21s 1G hashed in 1M blocks - 24065ms 24s 1K blocks - 21381ms 21s 100K hashed in 1B blocks - 16704ms 16s - -- - -- - -- - -- - -- - -- - -- - -- - -- - testing sha0 expect a 3 to 10 minute delay 1M blocks - 38215ms 38s 1K blocks - 38085ms 38s 1G hashed in 1M blocks - 38215ms 38s 1K blocks - 38085ms 38s 100K hashed in 1B blocks - 18757ms 18s - -- - -- - -- - -- - -- - -- - -- - -- - -- - compiled with dmd no options testing md5 expect a 3 to 10 minute delay start =1044598753, tm=1044598753 1M blocks - 40s (0m) 1K blocks - 39s (0m) 1G hashed in 1M blocks - 40s (0m) 1K blocks - 39s (0m) 100K hashed in 1B blocks - 35s (0m) - -- - -- - -- - -- - -- - -- - -- - -- - -- - testing sha0 expect a 3 to 10 minute delay start =1044598867, tm=1044598867 1M blocks - 76s (1m) 1K blocks - 76s (1m) 1G hashed in 1M blocks - 76s (1m) 1K blocks - 76s (1m) 100K hashed in 1B blocks - 44s (0m) - -- - -- - -- - -- - -- - -- - -- - -- - -- -] with dmd -release things are a little better testing md5 expect a 3 to 10 minute delay start =1044599115, tm=1044599115 1M blocks - 36s (0m) 1K blocks - 36s (0m) 1G hashed in 1M blocks - 36s (0m) 1K blocks - 36s (0m) 100K hashed in 1B blocks - 9s (0m) - -- - -- - -- - -- - -- - -- - -- - -- - -- - testing sha0 expect a 3 to 10 minute delay start =1044599196, tm=1044599196 1M blocks - 50s (0m) 1K blocks - 49s (0m) 1G hashed in 1M blocks - 50s (0m) 1K blocks - 49s (0m) 100K hashed in 1B blocks - 12s (0m) - -- - -- - -- - -- - -- - -- - -- - -- - -- - apart from the 100K hashed as single bytes, it is still slower than Java a very odd thing happened when I recompiled and ran with the jdk 1.1.8 testing md5 expect a 3 to 10 minute delay 1M blocks - 14511ms 14s 1K blocks - 14370ms 14s 1G hashed in 1M blocks - 14511ms 14s 1K blocks - 14370ms 14s 100K hashed in 1B blocks - 7030ms 7s - -- - -- - -- - -- - -- - -- - -- - -- - -- - testing sha0 expect a 3 to 10 minute delay 1M blocks - 29593ms 29s 1K blocks - 26869ms 26s 1G hashed in 1M blocks - 29593ms 29s 1K blocks - 26869ms 26s 100K hashed in 1B blocks - 8041ms 8s - -- - -- - -- - -- - -- - -- - -- - -- - -- - the same class files run under Java 2 testing md5 expect a 3 to 10 minute delay 1M blocks - 24054ms 24s 1K blocks - 21301ms 21s 1G hashed in 1M blocks - 24054ms 24s 1K blocks - 21301ms 21s 100K hashed in 1B blocks - 16443ms 16s - -- - -- - -- - -- - -- - -- - -- - -- - -- - testing sha0 expect a 3 to 10 minute delay 1M blocks - 40878ms 40s 1K blocks - 38185ms 38s 1G hashed in 1M blocks - 40878ms 40s 1K blocks - 38185ms 38s 100K hashed in 1B blocks - 17916ms 17s - -- - -- - -- - -- - -- - -- - -- - -- - -- - 45M/s with the C version of MD5 I have ) I've included the source, so can someone else please verify my findings, and ideal workout where the performance hit is :) begin 666 speedtest.src.zip M2P,$% `"`` `1S%'+KP9>5!>``````$``!<```!S<&5E9'1E<W0N<W)C+V)U M:6QD+F)A=./E2LE-4= M2LU)32Q.52A)+2[12U%(+JHL*$E-B4G)3 <*%,?D M+DA-!;F9EXN7"P!02P,$" ``````LC5'+ ```````````````!8```!S<&5E M````<W!E961T97-T+G-R8R]C<GEP=&5D+V1I9V5S="YDR\U/*<U)54 NJBPH M24W12\E,3RTNL>;EXN7*S"W(+RI!DRG6\W4QM<8I&>SA:(!7UA"W; B0+ +; MK*^?G)-87*P`M$I!P4K!-\74,[< 1T&A6J$6(0FR"B 9G)%H`)9%ES2$2!HB M)$$0`%!+`P0*``````"R-4<N````````````````' ```'-P965D=&5S="YS M<F,O8W)Y<'1E9"]D:6=E<W1S+U!+`P04``(`" " (T<NGP^EU;P!```N! `` M( ```'-P965D=&5S="YS<F,O8W)Y<'1E9"]D:6=E<W1S+VUD+F1]4LN.FT 0 M/(/$/[0L[7H(:\-&40[9QR&*5HJ4?,'&!QZ-F0 #FFD26UG_ MZJKJJAH.;='7"+DZ=83%MI![U*2WA^(N\ ,_KU.MX2MJG>[QDYT%_J_ [_JL MH.<=.#L+/4/BQ\T^2OIB!2PHCKV96<CKMD$>01S#Y_4!FI; -DFN(,W:WHUE M3V-SHC^QV[+42/,*!CTN'14)$ [TXN8A/$+B>EHBH %Q_V V;*>=>G%\6>]% M+-B;D1J.RXS$$.):,.39L7;AS>SNSA;ZC\QCMKE48E26CJT2GYI2DKG[?RH\ M%OVANZSYVB%,PW.S_)W8!GY6LN:5!O((M^\MT3&]3C&Y%+"Z2MX=80,KPW.] MYH&US9>%_<?7)5LL,/'U5[2E*YC8FJ\;34T],<9>RF]02P,$% `"`` `.RA' M+DN4B7H+! ``A!(``",```!S<&5E9'1E<W0N<W)C+V-R>7!T960O9&EG97-T M?_#Z.3L_/3D]:3]L-]UPK_N#LYO.Q\Z;K+(WNN]!O 8\`K]HY[S[==!KISOW MVO>]OO;/\W6G)U].3[;=9O V!GMT>C)KU\,570% -^O!?QK.2Q/B*_ F_MCN MZ]8`87D.?M\+^T$/_F(7 N\N/ _^OIS346UB+[CV0QI?N[Y.XJG,ZGYHDF8. MZ*]BDKNUOGDV9OL.?BD`R/F<?=RT#J2R=/[5NAUN,U]T5W %GHQCCM'CD+F M6Q<KVH!4BSALLPM GI,`]F.(7O7=T*2N!V.^P9,G52/L738S&_=Y'R*;X0QL MS6:S-U=MS-2L:<XBVF(Q!]\!^.GR< [&XVO2IN.^X/%C`.3?""+>7PMP-.C9 MP\22987F<$E*4WN6YGN=JV 6T3MWT.;?$N'57;QOBLCJ+F(J4X*<(C9Q+,G3 M-:S4?4QTU'W,<M1]3)&],DL&6CP!XZ_1R/DYH)/=#U/M?-]L)LWHMME.FO%M MLYLTD]7Y&#U%OKQL]-(L[=(MWUP!N%H"L82?G.!:4R%'&[M1YY:C,NK0:HEP MHX4O,&%AT*'&QPI?'(*P'.L:'R]\6A)(.2(U/E'X J-<,8AJ?++P<26ADJZ: M/U7XI*$TB/TX[O$A6/A"/) QJ,*'4.&3BEDG3"U_"._YC(((85SA0Z3P!:>D M0(K4^. ^?UPH2J2O\;'"1Y6A4.(\CCWACS].,QA'`EBZ,T<>,SXAC+I)!F/E M<4"0N0I?JESF YA21!FI\;'"YZ1&GLLJ']WS"4>"L;+&IPH?1AY9YWF-C^[S MC4\4/BYX -BI"E]R?N:3#FMJI9XZ\.7+XPK3<<YIHNC$ 5$W(8PC1BA%% *% M0^7LJ#MR($^$3CE^F'-FU$T(4X5)GG.>$0GM;0;O\J'"IZGQ7E-:XZ.%CQKG M;="JPI<SR/.,,X8:#FM\L/ 9;Z(!!:SPY0KG&2>5$=[R&A\L?%YKA$70-3Y2 ME,YSSD0[$SV9PU$W(4Q/:93GG"+ZD)E[?/DMDAW-F&'*DAH?*7PR0&NMPC4^ M6/CB>CL$*ER-#Q4^R21ESJ$*7WX+9[Z I? T5/ARY1)?\-AZ[F&%+Z\2<O[B MIH821"M\R?F9CWHH$=)5/KJOKV!$>(EK?*CP&4=TP(35^'#AP]H)AXVIY4\5 M/F\D=T0=WL*3C5Q< .KC?5ML,\?;M-AFCW=EL<W=;L*V7?LQ[J+R7JJU><<2 MUP1Y0;O,Z]=\MOGL\OE]/O?+7?H8AL,^4Z?(C0-O06/BPKFQ;]U\/E^\7PSY M`& .```J````<W!E961T97-T+G-R8R]C<GEP=&5D+V1I9V5S=',O;61C;W)E M:6UP;"YDO59+C],P$#ZG4O_#G M; 7[WQF/G<3.8ZD$XM34'L]\,_/-XYB$><1AEYY/DH>34!QX)K/),=PE*1?' M4S3O]_H]_$A2"9E,17R8PW0`1W[<G<XP51\9ES"86G)-;:1E%P59!G=!&/+P M>YYRI=[;GB5?;\P1V9M.`:5%S!&DO$_"C$Z]8(M^!#L)WQ,1`H#R MCMNOIS"0W(?*!+BRYD+): ](ERVAT&+\4,T-`;S!%]H7OZD*#ERJ,&&PE5Q= M, N>5P8=EC";TXF).I0G; ?R?46Q;D51QBH.(X(IX8)C&P7=I$K/)6^2>C$ MR"R775&$PK:7Y+*NQ-\%F)0<C;$"/8-%37>I8)N$YT(#T2SZAB(CD ERGAP6 M2=^\&9?EP!C%4CO Z5+UX9FO[]>%V(:-= ZT) U 95<AJWSUC,VQ<UB2H." M7X]'&;>UN Q1M;=L99)YWEV0C>)];!)0N5A% :1,'5LA: :I)6$SUZA)$9G$ M8H',?39[^/"!_1%HP:,61 H)YE&%9CC\;X N)7(G _6HK2]<NDL[BZ-B3+7+ MRG;-7NQP!&$3O(TE3W$*O4WPXZ%<.5MVT7*5J_97R^W&)%!=L7!: M(E'W3? M;3.IU>)<.4D53>IXZ]FFUOI119':Q0*NF,FXFVXJJ+8`U H*V>;2M])./'9H M/$!<2&TU"HBX*+L6&R+MU<N"JD\(/7]U =#UTS+LCQ7Y#USZ>YB7^UM&KG+) ME"0FU2Z2WU!+`P04``(`" ":"$<NE$)&TN\!``!N`P``) ```'-P965D=&5S MZU;2I!LK :T=[5,WPB 9*-9UK-66C"3'-67_?5?RNA0VZ(.M8]][CL[]*(VL M"T)JV\J33*3:D?,NN;NZG"X'_4%_<H1!'T?XFBN'VYCL4#M^I482ML*11%T9 MW7UGUI3P.6$5!-4COHB]P(W:6F';95"*:BM3M5;M<H_A:H39^?F[DS?3Z91O M.3 _F5I+X15+WZA2!7>1>UD4B%P'2X[L_D\ !K\Y&J,T4F4JC=PQ^ZI:I7<0 M6D(JYZW:UE'59.R4JW(F\XVPA(#K[4]*/;R)<J$23[9TD9T:+56 NHY[\/J9 M-%E1L-&4=$H)OIL:+C=U(9&+/44Q2RDI= L1/;VB`5$8=MTHGW<VBQ=-A,J MC1^CY7M2H2%-HPLC_FK'.>3>5XO)I&F:).TN28S=37!H5^CERVYU=6IJNFDN M).BQXKJNM0\-'D)I?[_!&B..!YT>_X!:!I09RW&\Q^QLR><%YE,^CX]C;I?< ML 4"``",`P``) ```'-P965D=&5S="YS<F,O8W)Y<'1E9"]D:6=E<W1S+U-( MW?Y]U\XZ*FU2'V(?Y]YS?.Z]+HVH"PEN#Y67(A5J*YUWZ=WGRVR6=)/NZ 1) M%R?XFBN'VYCL4#M M5+LRU<&J;>[1N^HCN[AX-WPS'H_IEB/SHZFU8%Z1](TJ57 7N9=% <AUL-)) MN_\3B,%O3 Y0&J$VBD?N 'Q5!Z6W8%I *.>M6M=1U6S(*57ES,8WS$H$7*]W MDGMX$^5")5[:TD4V-UJH0'4M]^CUD]32LH*,<JFY3/'=U'"YJ0N!G.UE%+.2 M9*7<I/7#XM59C9*N*BMC_3^/S^6,(D5\?[Q SB$\1TQQE[-K"B3=IZ3;"4WI M]?%$,ZND[?5G^!4(E36>)B %F>_LC1*0CQ55=:U]:&\/2OO[%9;H4SSH=. ' MU "[63ALC*44O$=V/J-]CLF8]M/3F-[F=W847MZK87:^PH\6O7U&DV=PMHIZ M'<(KRN_M,)\CZ^-G (O%`L.L'S/(=?C(_&]02P,$% `"`` `MPA'+M2#XD+^ M!0``YR(``"<```!S<&5E9'1E<W0N<W)C+V-R>7!T960O9&EG97-T<R]S:&%I M;7!L+F2MF=MNVS 0AJ\=(.\P5X'<N(YUMIL#UCIXT46+7:!;I(LB!2B)MKF5 MV&J=7I^?G9]=/8/S,W &?R]9":]E? E5B7_%>4(A(B5-H%KG6?T^+_(5\"4% ME;Q 4255\SEFBKLJ\SG?D(*">*ZB?VG, >=23NR$TV)5RMEQGB5,3"WKN<=< MTY,B`IM#EO,!;'&=F&20Y)LLS<E!6W)8<KY^<76UV6R&<;W(,"\65W LEZCE M:;7J?69T4]-\\0U8R,F$U^PCA?MMEL'-"A^'&WS\+1UG(FH8Y\/JX]U/65V) M]CH_PT[+"_Y5#ZZ2."_HH0WCE)0EO%F2ES "+^ ODB0T><,Q75(DKVE9D 4- M?[$ `-2[\QA_1;,%7VI]^(2%X561 >Z,KN'+(;+DA%.OFL]IX6TY_3K>L>KP M"+\"+" 7)<$^%]&G<3$IN2:"^J.G\6Z)B(DE(K8(L:%)]LU\>%'1TX12&?'G M_)O!AV2D,!X/WEZ[9O)=82P2IB[+EI'4KP$UTM\Q`XF )VLM2!;T9<;X$=8N M[CTRO:WWC.JX9<>U;,,<Z=>G07HSZ%TX\X.I-YXT HQ6T&3L30-_%C:"S%:0 M1,8RJ[(^6UBVKCA$:1Y_%,V>X\$!I"B(.-9V$W4'3..Y: F:<3PW:3D47^9Y M`=( P' 9[$ &-QB+/R\OY6;K)'OW[QG6K:=IF*? > &CI]FL#S MW%<3O)-A_3CLGPP;Q^' 9- \#H M)<QUS1N /X! O-V+C$#DHFF M(1 (P> &+0$I[6 MQ?T6H*B *A9"UI"T!>"_D'0;PG^+RBV:BB.:BBN:BAC M1A.*T=DI1A.*T=DI1NMW2F>G&$TH1F>G&$THAJ4:BJT:BJ,:BJL:RE U%-5. M,54[Q53M%%.U4TS53C%5.\54[113M5-,U4XQ53O%[.P4LPG%ZNP4LPG%ZNP4 MLPG%ZNP4LPG%ZNP4L_7O%$LU%%LU%$<U%%<UE+%J**J=8JMVBJW:*;9JI]BJ MG6*K=HJMVBFV:J?8JIUBJW:*W=DI5A.*T]DI5NN_63H[Q6I"<3H[Q6I"<3H[ MQ6I"<2S54&S54!S54%S54,:JH:AVBJO:*:YJI[BJG>*J=HJKVBFN:J>XJIWB MJG:*J]HI[D^=TKI$1.UI^\X0Q[SV%2&.^>T;01P+VA> .!8>[_O6!7LDG,IK M.Q;+R["Y+FX' 0SD6U3_B _WF[OK4"W^H)$++?H0]^4^1T_V=&RXD\GDQ^+& M+XF3#T M97-T+G-R8R]C<GEP=&5D+V1I9V5S=',O5&EG97(N9*U]VXY=1W+E,_D5Y\F M1;'JQ-D[=V1DQ%H9$;E_O'_]X<WMZ>;=KS\]W+[^XO7=][?O']Y_\37^^^ZK MEU_^YO3R])O3US_<O3_]Z2SY_O3A/?ZXN7]]>[J^>G_[^O3AI_NWCS]_]^[^ MUAI_YXPQN >_M^\_O'U]]7"'"__#W8]W,C#Y:GOSYG3^ZOO3N]OWM^_^_/A[ M^>B?W]]^?OKQ_O7==W<WYR]^CB']].O=V^]/5V]?GU[?O7]X=W?]X7S)^^\P M2#S0^_OO'GZ^>G=[DK]_N/X_MS</IX=[N9H\P\/MNQ_?G[]\<__V]9U\\_WC M/5V=1_1?7.)T]>8>8_[Y[N&'QT&^H?9.=]^=WMX_?'[Z%7>YN7I[>GW_\]LW M]U>72Y_U_\/#PT^___++GW_^^8N;QWM\<?_N^R]/SYH2)6I%/3[CV]N?'^?P M]W\Y1Y >?_K3W;_>GO[7KV_?GO[P(_[ZQ<_XZ]^\*6]%ZHN;^R\^_.L?__]3 M].7+NQ]_NG_W\!>F]N/KF_MWM_CPS5<O87#G0=[C&G=OH9:K#P\_W+\[G?[^ M]MW][=O3^.+T9SSXW]Z^>7W[#C M=?L:DG=O'TZGQR?O=P__</OV^X<?7GUV^C=HZ^'#N MZ[OO%RS[ZNTG1_+=U9OWMQS+F[/ __SND[+/XY"KBG_HSU=^U-4G+WN^[C?? M_(SX[+,K_9$]?/3JZH]__*-WGVD)=Y"XUA_YXY>O__++X2!QHS^*QR_?\,O/ MD_(H^!4>571QL9'3G^_OQ.6\N_V[MW=4Q14N)[/G?( IE]KZF&O+]:[/G^PU MQV_B^I\<V3__!.=\^^HD-H4)NO[PW>FSQV&>+1&+[^$=KO!7K_ )IN?\V.<U M+UZ\PJ5EQO_J/,S/3L__^_>GC\^?6W[^AS^<3N6SX\?N\+%-'WWL#Q^[\-'' M\[/'*7WYY9>G?WR:U1]OX39?O\>OOOCO^Y^RFB=3>![%T^3^\FP&C_Y0;/;J MR\>O^T]]/7SJZ_%37T^?^GI^^B5^^_[FAUO!0*_D23GTQRO*T//'5[3'7SY> MT1U_^?AU_ZFOAT]]/7[JZ^E37\]/O_S/A_YX11EZ_?B*]OC+QRNZXR\?O^X_ M]?7PJ:_'3WT]?>KK^>F79]?W+["CJT=?]SO8T*.7EA5Q<_-D^D?#Y,-^;)CR MK'(-N<'I7^#C6CS^\]59" [D7T3(?/OX,SS&;^5G^_2S?[J(DXN\>O5_Y9// M_O '^_ 8\O"/W_=/\O'I^^'IY_3T_7CY?OCV,X0(YY\ND)\ND)Z^8)XND+^] M/*OQ$X%)IN6C>;E8PF. ^>5SB>:G'S^\>9Z>F_--S[,NG]P8^(C'V/KHY?_J M')4^%TG[_-&KFQ,&?O;RZF/WT<?BY=7'_J./Q<NKC\-''XN75Q_'CSX6+Z\^ M3A]_?!Q:_NCCLY<_VSDT^K7]YN8\J5^[;V[.YO6U_^8FG/\2OKEYM(=KF0OY M(J[^<B*NW$>?'N;ARG_TZ6$:KL)'GQYFX2I^].EA$J[2QY\>1I4_^O1I"JZ? M9N#J>0:NGF? ZGD&KLXS</,T`5?/$W#U M_NC3)_W?/.G_^EG_U\_ZOW[6__59_U=/^K]^UO_UL_ZOG_5_G1\%C_H'1/KZ MZOK-[7OYZW\O-!+F^N(W3]3QGW[7[W^1NX!2?AIJ/X6FER^^E G\YN4+.%'7 M6K=Y[+RJ&7')/'_Y&_G3 )I^?O[++VT$%[KQRP7?RAH4LB(DU\ENS-B7-W/& M/::GB.-UTC2V]NIWVC5OWRCDGZ\S9JVY[#V=W=56=9W Z^28?;.C9E.,J\M1 M*#Y?I]L$3I)Z=:X5/]1U$J\34BE^K65"M;%D0Z'\?)W5VL!3Q6SQ^&,EBA1> M9\1 4^W%E.:CCTH_]?DZ8:P<<9LRYQHA4\0J/9O6W YSSV'F#D8)7?1L3<]I MV])RF'UMJM J/8\T1D_.QS9MZTD)7?1L?7;).ANSV\OM31&E9]M"*0.WJW56 M9VD<]J+GT$?=%8-NQI \U*V4GEW:<:6=5HDNV)$I=-%SB=7DBD=JL8;<J6>K M9,Q]X',YVO/VI9E<L )]<(NFZI2>XT[=!S_J="M/$RATT?-VPY6V,'+3S1K4 MLU-Z3L.L6>+.+F)^&^W07?2<;<32*K"0V<->\2+BE9YM37DWJ'*9O6:ED?F+ M]]U-:-MT. 5_T7,UT1>?!AXOPHZ4B-+S[&F.7=H>/N:^:1S^HF=;^EHMXQ^? MS8XT>:_T;'RV\+TMFEZK29P,?]%S:MV;5G,.<,'P+A>1H/2\PZIN&[>\PP*K MU$^ ?\X>J\MDD^P8;7'(0>EYENU[P'2-%EPSZF87/?<9$]S\CM87MS/U$Y2> M`/F GB/M>:38JS&QSMEMY!*,2L_+(-RD(/'6+/ 0"M&>2UAPB,6EX9L?7#I1 M0 EM.IBU\RW0)40=!UN'&4(%S:_4'!=AO.C98:'6;!LB<_ `"A>1I/3L$233 M6L["HDT(7!>)_MEAEKQK4&5.L?%62>DYSHBEU6/(Q9NRE=!%SZTBB-:"\+5F M`U: B-(SEKEMV::21C"S<;X2[=F:B#F%8RDIC\)Y3]IOC+T7 N"66Y5(HT_4 M\]A]&I<<;&/MK!Y=Z;FW[6H8O<!K3+ \"EWTO%(-*>SHVL;"R)S2K/1<`>JL M/)E!?*&(TO.:N<_E?2EY9#L9!_-%S[GFD&9:*=KBJ^>49AT'>PN(`R7.C =S M:CP7/>=A^]D("YQK3.K1M=^P%2.Q%3Y^MI$X[YEX8Z4!S01H,GI,W$6D*#W' M8D>H"('&N)D"C;Y<]#QG`*)+>'; ,J!-BB ]MQ9B $-8(>->2=WLHN?JR 9 MO*Q!S($&$\P'<(I"%SV[[FTQ(R\X_.XBUT75<7!7UQ'>* RU],[GJA<]QY'* M*( 6R<,/=?J-JO0,[Q,&'((=F*X8N9CK1<^M]]W"PF1UL)6BAJS]LRVA=(,% MA#E MHF<!=*[&#O MP*F+B.:#N75$C 2 C+ +A$RABYY;1NR:<&,;1*8.JE#SP0*(5:$>5ZU=T4P* MT;/IB'& 1T E<X""4T3'P3/MBK&7U&;WG%3R03O!+!"Y 4AR`4.EB(Z#MF(M M03,C4 W<PAG6.BY!S0?]*EW6CNPZS#UHS MT6^3085\L(&9&=C?<%B$`(D447JN:2$&6IG8U'-1U[GH.38L<CR9VRL7,/B+ M2ZG=`1[7"2NCB-:S]]N;OL'VH,/ Q4P^6%M-&0!A5B"74=5XM-\(&7 E[ U0 M OJ]] 9BYW-I/NAW[09D&>$=X<5P\9 /`H"; 84!/8T-M$01I6=38W C3 0Q M/]=6 R:N"R,Z4)T2QT34Y)1J/CBJCSU/L)#D&H XA2YZ]H ] $FIK.E[\K0? MS0=[P8C.<,O9V /MF7QPUPJPO !Y`7]CYGQI/F LD'&R80.5]!HY[^2#MMO0 MQA!JV>3Q*:+T7 )8$=: `8G/WJGK7/0\< % IE6QQF:SG K-!\%C6G8.*\.V M`F1/(>H9OMV 36-U;8?K443I&: F(&!L/P#G`7 I1+PQL6S 4S/B*J X0Z7F M Q H3&=A6F=HH&D4NNBY.S!/7S!KM1;P/8HH/>_EUQQ *5U83>'#DP M!)J'MS ;>*>7UI00>7<&0.HIQ6)R37U11.D9>,\Y^"\7A^MF*B'BNIBS<1V< MQ\)A=D<1I><9.G UZ,S8)?15*<0XB$#E :MPMSY2[A31^\]]#D1<4XP'8G"! M0L1UQH^"X+E#W>)<*:+TO/-T/N%/+, HY.TB1+^1'4 C6%6;SJYR,0VG^2" M(_Y?01D-W,;,%+KH>?0`" .'5P4B#C MX6G/L%709)-<; FCHHCFW?"XK6,F(G#BR$H_C(-/I*&G7->JO([F Y(=FD C M<&/ ,V50B/ YR"ZFZ;"7#M;((6L^"- B"<LPL +A7_CPY(/"_E/J6%Y^!-!9 MBB ]`^[Z.9.5!(6'KZ+01<\1)-A!RW"J0)F6\Z7Y8 <.71;3O $_8]L4(N_N M>:0X`U2_P C5D'5^L,.2):,Y`[CEY+H 'S1E[H(8%N*LB&%<RIH/.CC4!* ] M;<&!MPV2#TY M\\%56I1"C^;&D/)P"M&>?0!U+<8N-T%IZ,<.^<'I9LP6.BJPQ<K)(!^T0"(( MV#AHE1^41'B<!7ZS&=>XE _YP8QUWK' 0P(&\ES,Y(- ;Q)PLT&("L7QT34? M7'U NT":$R0W9T[&F0^^?/$M+O6U>RX%6JDA,(//1%!GJZQ$4\,N'SJI[=\` MJ,I_DAK"B<NF4[4!1*RJ6='4,(R0!GBAK]"42CDZ4L-9_1EXC=H1/91WT-00 M2*IELP* !AP:]U$=J>&4!"%BIJ1-RF"VWFEJ*!NV.>8E7K1,YI$=J>'<UHY4 M$A;!,HG5)TY3PSE7+V%;`\SE._F((S4$U5T[F8 Q11B!>BY-65I99L-3FV7 M QUCJX=G2-Q ;UMX892M*<[7 1IBF3YF=:L4**F'9RD'G$*Q&\9EHFM,93A- M:VIH9PTV1F"!'-OL2H E,Q.(85;P_&+]YE:'U]0P`BNEM0&D<QB36YN>U! > MOO &W--]G_5=71*-KO13%M2C-D62X$\J6%?`8%;=A,78AUW8[VFAJM68)S> M88AEIZ2>BZ4<3OC<ZMXC0E>6<GA[V(H&OC5&4J"X(DLG/*FA[+S/8J56=<N& MX47$';9(B^D1PXD2P+F/X57IJ+A+/SR08 '/I(EI:ICA>0'+\DZKPM=1SZIT M-">I/;5 "S5UEMIY30W;BG!]H&$E[>VY->45-01 D-I)V+T'R::):6IHT\ B M7ICT/:S*)WJ5*C0 (K7/W:*#KY MZF2OJ:$'D(97`!T"(C>L[_*:&D:L<\"_/$>WW WQ_D!90-,!V3/(;%])78=Z M]A%:1( W=6?/DF&OJ6&H?H]S CC&TID2\:2&\+EU2*6+";9U9 &]IH:PDRH7 M"+*%4[FOXKTJA7:(_K"R+;4^+('WFAHBXB+:.+!F<?9+W8Q^8P%D[CP3U(2% MXE7I**).' !H*Y5LF*WWFAJ../T0 )!E3[$I(<9!`, J)<H9<2!R2])K/ B[ MJKU;W_'DVW&?V9,/= LJNVT/,QI 2]JSYH-V(%#TYL MB";.;E;?^G2 X,&/E2IB+R(04[M>I0K!& +,=*\>(<KYTGPPV=)G+U*N`23 M^A.?5&F_0V"?J?28PS1J/'K+W_8.- J0N-)>40E1S]D.. [3X:BJ96K.:SXX M<E\+/!AQ<KC)O*U7I:-^Q3)A"!V3FZ,2*7I+P-A<J .UVLDRO^G)!V=8>\.5 M51"]X;A[Y0^EH[)A/9WL>\/'<*O#DP\V#YKL MU,$4NE=\<"?A`T!K -F;U6]>\T'9LMU2LPXT($B<0DQA 2T#A,XU^PZ.662O M^2"\-QY)& Z2E-W3#LD'1^J M$8V-^'( KJ.+NUO`VX7,SJ, 6ZYF,D'UPZ MS'U2*2-//EAV'AT\$,;30LSJ5AH_]PFYA!$!'B>O!LW4M\N"?&/?;L+%<"HT M'Q2G,C#IX)\(T2P=]>2#OL MB!2!Q0DG39>I^>#LP MEV!9A^G)!TW:?LY>Y]P)3)7/=4 5KA:F5!G&98-*B7CR06>ZV7! #EPX5%:[ MPK EYM0:& BKJ8+F SW%N5K#D M.P0/.,XZPT ^&+H *0#AZH'MF/T-AU0AL!] _,)-35:E28%\$%0L <.Z A U M 5SF!M=2N>\=R =[!CJ*I60L'" M1Q'=XB:[$:N$U&L)>ZF;,24;Y 8=A$\< MMJENEJ#YH(E X'W:$4,!*ML4(N\^%]T,&QSPQ/!JR)IW3[&.)'MCT")+70+Y M!,"H<_:6I;Y!I0IAY]L"`<P6C2KM#YH/(ER(FBTB98%-JINI4CO ,81MJ8VP M:X5KDQZUQGZ-H$I':XS2!!815:UG%C!H/MBL9#E&DUJ&DME7%8(J[<=2MPXT M \F!P=OJ>R_J9BPQJ!X$'Q$0E,8$5K\%S0=EY[ '*%IR\9XEPX%\<,^,8(L( M5VUJEJW>0?-!)_4YME O=3>%+12!?'#E7$'.BX</!^ZG:6 ^Z H8FH%5-^E, M8]U(4*V$V0P!V<XEP9%4H>:#V88*]Q/3E)C"?JA /EC[*M'O#L"_UV;52$B' MV[&,!$,;I:OK'%J"-L \$!?P<<[L6PSD \ZFN?8"SH(2XU0BVF]8Z4.5=BD0 MS,0ZU4 ^6*4R)54\6APQLH0Y:#ZXFF37D\/]<RYL60BZ=+3)ML8"R%PN)"6B M2]K" QHT]^N$R] 4=T6,6VR9"IH/!M^P]DQJYW114$+,IX &#C#S;9.DT^BB M-!],HP-G 5:%-6MG?7LHJL0`$!PK8KK>762K9=!\4-H>^JAP3R#Z,ZCKL 0L MS810V&&,</.LI J:#X M2E^C8\E5(!_T2RIT)]"4MX!3U(_F ]V7.1 /YH:6"NMO`_D 6%41TRI3V!-; M21$=!^5$`E"F67T`*=X48MYJCIJD1"&M&%5I=CSD!\U<( H;W!)_8;U95'P0 MP1JA?I^5?KA?EUQSJ_5A$ DLNRBC/93:;<E/YR8]:H/U[?',!Y]* ?QS*9!4 MLPY,W[8 "YY9[:BI(98F>!\8Y ;4<X0>D=1PE89 EB1;/Z -SHJFAF ['6C! MSY1UU-2P+Y!0&%O':HM+J9S4<,#U(DX!, (D!^[&QD.J,)O6&I R0$54W8"1 MU'""WID*9%K 'PK943Q4D:X-0CR-CP6W4_-+: B8F2HBWG+=-=45% ^GS*2V MP:5!`1#M M4V3ZFQK/ 8)C&MJ8$^2PMJV$*K<DJQS<8;P=93BBI:BI(;C*&L:Y+.7^DZXZ M*OQ3U:WTUMT`=Y3S6B*468T:-$MFIIL8KY'47=:N6E/#U;,O>P"9IXY+*B%2 MZP75 ",VW"J+BAJ::!'"8*P5_S*[&34U1-QP1IKBDUMY$<)$4D,$L.J%SH9E M`%O4=72JL(X +<; =4D**"A$B">-]R#Q!6AY96X)1$T-C92 !EG(9P?,1:A3 MA77&"2>V^\YUJ>OHD" [C5 -AE5L(:2*I(96:I !B=>T""BD8C$>2^VZE((8 MK"(X(!HKJ>$\TY4J&P\-H)%VJ*GAQ,=9V $<,,%::CS4<XV0JDY :5&GDD5- M=%=AFL'+,2H&2W"QSC"2& Y0+"F]EG KDA<130UMZA6A>4-TS\*MUDAJ:$MI MW8(Y(_ $50(6-35$8&INUS)JA;MG:4!4J<)EX,5P*2]M3ZR^C9H:QNV[B1U* M`AILA,"1U- A7C?7 1-SW&ZKZVB_(7O'P< GY%4Z<7LD-;1C9 Q("F\1[;A5 MTP(T-F%*]< N1.VQ'$HY"H)IW-+^VS;W=2.IX9+"6HGN&^BVL$0W:FJXIYF M#Y(5:;NR)"VJ5*%$`3G0;L Q!Z2J45/#TJ34-[GNC1S9PL535.H[[;JJ%(A% M*0NAB/8;" QRTD&5I- P2C_L1G8#H;154*^<`ZM"XZ&KT O\&Q;:\=)E12&F M0M.L=0?7N1\2%34L.T\YE%_.SEFL&HGU4,K1TC)V^3;AKKC%%4D- VM8? ,L M?(8>6/(0#ZG"6&LMP)IQU1$5/R(UE)(*Z= U&7S-DATE30U3E[AE^VYP'IGU M;\FH%-8:,2\YQK*9QNQ+TM0P ("$`/";'%8U6PT2J:'L?&&J&B862" K$;WE M+ZQP!SD6LAK5 I;4*3,N6[]F&LO)F0>+(KK$`' - !XX:_A16<>22 U'QWC' M\'GX+6<04$3CC=X+"-&4(UQW-.IFU+.7>G.WY-!$,#I>Y]!5"&8)G&WE_!?, M/2=#G3 MPZFCB :F`"3*\3"9]5U)I0HK2'P`J)=Z1,\2IZ3Y8-MK9CG7%A"Y.:/&PU0A MXH"8(6=PTI[)!W,OH::0<>F,F,[Y.I2.-CEH%R \`;TE[ELFE2J4?<USVT]? M:;/$(!U.F5FPBPG?VDQ.C5N_2?%!(>9+:G-*AZ;5=?0I8 T^*GGA6.!$S),F M53KJI*,H5CD::*^M]'-H"0+"JM(UZ+/Q3,4G53I:X3)P(3/:]H8E!DGSP6FD MUPG42(X&+"S]2^K448L%6*72' 0\<BLZ:3X(+">5PD6:ZZ0+ED)J2PF8!?,Q M94]-=<FF`Q_<H(? S B$P$&LHTM>=7V7;D;T<^<!-Z9NI?T&EO+$HBA%CO=E MGB*1#PY M#M$?)$;Z_6R*K.]*Y(/&N^:D?"DOK'IF!=*AJW 446$&JXZ ?_2'Y(.F.&E5 MES1$J975Y$GSP;GQZ'T!0D=AH+0?\D'OLH$;'['O(EO %-%Q$. [RYXW,(L< M<&\GI>D6\0#AA?63B7S08SI]* "/*WK'JOVD^2 63C$+OE>.P_)5"9%W1]D= ME-*WA =GJUS2?'"7*36Z9M T6_3J.E&5Q.YI$;LZ9EX=Y) T'\Q P6TEQ"8` MTK[4S> W #D ME6;M"ZAEL7HI:3[H6E[9;&F=QPV;$B+O7E+)6!K,. :SU:WT/I(UN8#IP??* MP4AJT-SRCW-)J\\&K$TJ%9\T'\P+FFY AK,"LW-K/)$/YGP^2")+]4 *K Y, MF \*8RIP&<8W.9N#QD$^N')SUL 93QBYMTKD6#H*%&5&:G)TY%9"/#VP+(/P MJX_<2.2#LX I3] I`(:?K!I)A]+1A16,[\<-DFZ8ITBJ=-3%TH*O< I K4S- M)<T'L_,-=HI' ILWS)LD\L&!4-' BS;<[YCLUDB:#T(&LU0P8)<0F]1U6 HM MU> .7MUW*5]3(AK79?!I.4,O%Q/4*3R)?'"9+D7P<!/-^<*6A:3Y8) .0!/K M:#X85K M7LXGE$,!MFF#V<UT:"7,TE4\BQUQ177D<R(?E!,5BP6J#T(^MWJN0^M5'],' M>44`_*91S\7]C8 ()T=92T8 LMH^U4.K2 (<)+?DW/7U'.ITGXO!]I*A8&P MM,N\9\T'I5H$(X99.%L'ZQ4S^2 0PHK29SD1_XM3(IJG5*E&\TWVNLULZF9L M)<1<([IW9^8N>2D1C9]]E/JP9+$`2V(+3B8?'&UY9S<PF\6\LM4[:SYH7943 MX#V M/K,U+1_XX)K1K;E=ZU5.6J003_,!<]C2PR6'/156967-!^6D%>DY6U _UK"D M8 6!$\.O97;#NN),/ABER<"X*L5"B&%J/'H?J0\C!5<]FF15GU=6^4$WO!U. MBG,0FMGMDP^EHW+X4DURF+<<+.8H1/PL58]^=N<0W .[C[([E$*#E1N ^3JD M\T&0SBDHPDG5?O3J.JKD?%NI3MU%NAN2&K)N59ERQ.>6/ETGU?D4(M[ ..$K M0832B?O%:$OS.ZKG8 O%P,*(4C>)(<6H]'-HJ<?*<,6>]U("CW;(Y(,Y-!-[ MVM(TM :K ?.AE3!9K!T;`^"O7ZP/S(H/[ETS5I?;4K?'[OVL^2" 8<:$2BI. M-1\$V 7\&ZLXN"N;U'54:9)#D 1HE>-?5556/IPZZM=>L_0R P26W R^: < MDM[WEF*792-;$K/F T&.5(0QXK]5C(U"+&ETTV/%6\1AZ)K=4%GSP2W5RZW" MDAA/#Z6CN4N5QZQ MMQ& Y$V3$[;IQ\ ')0^0-H([(NJP/#TD:SX8 'I 7G)DG9/D'874Z51S^(XH M9$=-SO>0([8HQ&HP+/ 004B&I#Q4 MG;-*89DI!_1 B N0%5>1IH9P\[Z!KVQ8DARV22%2E 7/"O:PN]1JL]0E'ZI( M!Z;T,ZFA;#H4.2 MP<5N;DEF30TE:]? YVP&'G<*PI :PO1J2CUX\)&4F+K,AU1A1F3%P <^L5(U MSI3H".'2A]VVN Y3LG!48P)P3 EW3#V50U>AZ07T,.\5 &7('XLZ9:;+ 128 M8P6!`"1'$,[J9H1X+759/$"M9JE= Z*IX?E$^>4+UE"=B52^D!JNOB2':E* M#C*KS8JFAG8.>0O01EPR:7._NJC2T3 1#N$6G)QLPMW&HJGA+-*Q*H6]MLBA M8O,P<A[6Q/J)%%('D"(L-?B[;5T+K XLFAK"#R M!B\GI_Q[BNAN-W/>L[,5$]LS*68A-91>'IB0-^<J8J9HBJ:&P( P"ND^2]$$ MC9*\YJ\EGVHDSBFDAM' ?YOB*QC6J-S2+H>N0M-;E(HB1$U$9MZ,U% .KK5" M%?+90FH('V:[Y _DI:P[J2%K/?L(V+H[% `XE=3#LT17:EP0_T 0O5034D3[ M9^!?4* 2!R)08$E:\:K4#LO M8%FK'EW;,Z9R+=E A\78J93(+?\&U74YUT-Z )E:*9H:`D/5,,">8,Y;;246 M0&/D5+\IQ^ MYLL*J>$"!A53A\\4YJR&K.T9_"-B"4K5U72LGRQ,%9J=0$(W MR(J5\SDY7X=488#SD217ER+DH1Y>=0=-<(>>Y:4H<O[H1>1PZBB(1X>!&#C[ M.ME"4< '?5X5OC>OO&"0+#TNF _*D64)I%FJ9P']"2;(!TOO8/. O0EL);'4 MMV ^"%PC6>V(V.[DF$X*L;1?G 8B ;RR=I2JQJ/M&238Y1:L](6H.O"B2D<! MQ[" K$P=E**Z9*LO*PN($CC.6QU.'87GQ3(U<G;M#EG=C%ND<N1"G\U/X_4! M5N5PZN R6,73P8W[4KBE78HJM9/W7SJ_I UR!S4>S5.J3V9",8":7KTUL*BN MPA 7A-P$8EN&I=E%\T&3/:![;[ 46!_K9HOJ*H01YP;O"T>Z(TL5RN&4F1V* MM-;)D9H]L5ZZD _V5ET'>T_P+LUR*[$<^.!8!6 C`T(WZ1RD$/<W=I4'JH! MSR>R&,,2 ZKYH$.$S%++*&]1-6P1J(H/]BQ[*![7PHV8HJF'%U(`R<H;HCJ& MH<M^+1QB9W:\'D\=Q;*P7AHMPEQ,B53RP02XFZ0Z>44[VU!#UOZY-DQYG;)5 M(&>F4HC[&Y `^#HY&E%R;^HZAQ<&`>ZO .' ;:NW>E3%!X=T?YHEL3E;9CNJ M.VQ%&X3R#L(75O56"5E5*M[WL'N!]:3"$KGJ#EO1!2!!^IXQLLV^SJI.';4- M++VI_M"R.>5UT*#PIF>5GZKJE!E8.[#A3 [T8;(%L&H^F";\UP)0K6Z%R;Q; M57PPPG;D!9]28:M2S?60*O0QISJESDXJ;)003P]LP&MX?C"G*CM3%-%=W_*& M9I G5W8QDR7#E7RP2Z%5;4 E'6N9U<#U\$(*.)4ZK)6F.]N"NHXJ`?/G[3/ M\2UM^A<1S0?AWW-,,/M<4TG,UU?U0 JL_7E.&M39%ZL,Z^$%A2U%3(*\PP_ MA:FG2CYX!EI5#N,?PHPV1;2>Y8A'Y^"^4Y=#Q2C$?5'0=X"16 %<LSKML6H^ M*(UML0_ ES539EZID \&.656'+R10P99Y5PU'S1IFMI\[=+V,[MZ>)7"*O(& M$2#CW MMY19\N')!T/;<._3RXL]\:\2.9S26&O =,H[)4UA*7TE'PQ0\))\"Q10U#MX MZ^$M%+X,P$O 'UA09 M.52\H]!:(%<88,?"6U7/IDADK%5YC2?.:;,522+W0 M2#YQC MW:KYX"[RBC6+I;A\WLS[5_)!+PL4CFX48T)BE4_5?+" V]>^$'F _SI;_"OY MH 77B+XV:S&KEEG)JOE M(BX'E"JS^ "\ZU5M1+&GA<B1I/MT\PJWJKYH!R( M+1X:R&;):Q\HI$[E6'*<NI7\1N]LM:R:#X(RY1D<*,3LB,Q\>/)!:6B5]V;( MB]&V.N"T:CZXHZE"0&$D'HY(W8P\9?<H;:_2P0T 117F0^H;T3A(.]2<6,OJ M.LRG]"A5^P;>Q;3!KKQZ> L%Q &X.HKO,S3V]U7%!Y>;B !;LG]==3'5PPL* M073M\G*"3 ^%)3R5?% F%+ V]1:+&^SNJYH/CC:M-)WE/4N<70GQ].W>0\#R MD<.I=J5TBTM+U5[)2HBX3A9HD01]V#YW-1[M-W:6$[H+, O,GRT=E7PP!MB- MG(\!-Q_5N[^JYH-&7E0FN5JP%]]8_U;)!^6MPLT7<$L/",-NPUH/+<C&>2<+ M7BU3*:+],P)*#V9+RJF/I814Z:B55TPL,*QLUJ6:"B)Z_SE7.7\)% V,F"XE MS') !5\(F,3H!RPZ-']I`82(;G&3MPA(XB$AJN1+R0R$#J?,8 [:DE=O^TM7 M-WR0NJT1=X<3MU3AX06%"4AUN53AS:0FA$+,6ZTXY1A#T$H$Q,7G.KZP?H4` MC35Y70-/+X505"4\`Q,5=\YI\$!(H:VZ],:"H\A[FZ(D?B>%5,NF`;,W)9O8 M)V*D$/U&\<[Y;;,#G M=&5D+V1I9V5S=%]S<&5E9"YDK551;YLP$'Y.I/R'4Z2L0-,$MG4/8WM8U:F; MNDJ36FD/6U49["06V"#LK M/K-?FA42G&]<TNQ>N? P&LZ]T7"QEK'FF;3(,[;D\BLK>$8=R L6PUOXDLGE M $N]3]=LVMINV )MNV_O-UIJI3X:M7]FG(+&D9S;P5P;0SCN:/A 2^R='=C, ML,.T7>B**466K*0. DXA7I'B^RU((AB4*MB*=QHG1 H]!1T(<TG,)<*+,.U% M&\TPZW<0P7O;G=T(;ENQI!7S7[YNA\5NV*LQB,H+G-S"&9M!<;F$R<Q3:)V< MQ1H(O *=0>"#X'*M&5"6DLT/.9Y6-,PQ<\]0![W"3T!&F4E8I&NULCM92B$F MCFO[Q[E8^9!BTZBVLV9 IJU_7VA1=EW3KC 3: 3'FR57#Z3";AO"!^RZ-#O' MRGZ(MW= Y,35\;$9[,!,=M#JO*KS6-9J]&]<9<?3ZAU.R Y,SC;<9-!$5$Q M'%Q!E&9QHC ZH0J<"16NY5,Y2\ <WOCP/.$.$L-[2I&D5Y&D7Y'D8$4NNQ6Q MKUFR5630+TGSO!)TJ!J^=Y B4:\B4:\B?QE3E2(:N)8R%[ B:L7,.XF"U)^X M#B\)*YW:,Q.2\_=3+Y]*33I3SYY*C9JI_V;]?[3'-LOW+_?%ZR+1KAK5'/:J MGL )_ Z]U*?:?Y_1\ ]02P,$% `"`` `3"A'+FRUN!M:" ``(A4``",```!S M<&5E9'1E<W0N<W)C+V-R>7!T960O9&EG97-T7W1E<W0N9,58^U-;QQ7^&6;X M'S;,- %;QOM^U"6=?<9IX[ %DCXHXQ'H`HI!HI((IAWW;^^WNI(0(+?UA)GJ M`D+W[GGM^;YSSNIRV+N^:,C)Z/9JTO1V>OVS9CQY-\&?5QOK&^O]RZOA:/+P M\?BJ:7K3YR?GW='A4;W(FZ3>'>3] W<_^N]^R/MD=V/]<&-][>5+ E>O.^EV M*,):T>Y<EL;(C HNTL*"]E:P*)S+7#MCN-:LRLY$CD_F0HY2IJBS(B8N2Z!) M7IO,1%A6JEJE/L24RS>OO_W=[[][\_W;/_QQ;__ AQ__].>__/73YBCC0BIM MK%OD 1GI [.)&Y-<45YIQB*/KDCF<&/9L&X-+W30I_EO[HHR.17I.0]91*>4 MC](ESS-GU 1M_-25N2^FXK-Z<]Y<7 R'0S*X'HV;+^:ZF& `E84%S3E/)19H M*P!=-I95FPN(W)P/NV0`);<=,N[>CLG^>3.Z[ XZ9'+>X$-W]'ZAM !L6:O MF0W&R$ CRRF&K+E#MM2=TJ7H/IV,3R=P =F8HC?%2QU--,RK6'(2(;J*]N(J M!R<-+S[+&%CPP 4=BXN%"LN8I2%I7OB2Z$)6,2-RY$*HJ(Q*.5/!`RBLN9=, M")J#I4 MKS(2+8LIA5H>97*F(.G%V 71$0;Q5U?$WY&]YKRFO6:^)K_FOT* HJ "H6*A MPJ$BHH*BXF+!2*Z8SIEY8!90*T( &!:E85D**Z7+A0D9[4/SX3\5K< "+94) MP:Y$F >1119:&JHMTQ[\R%P99JRBD>L(_M-D7?J<K CDF$98!,VT,D Q`LJ5 M)4RHNBU"*4FY )KE:ZTBC[0_0O?!M]_DO?OP)H?W\2JX$SYJD(>)0CDJ$Q 8 M` ->, 8)-#R9%?:6IY2-*&(%^(P)N>"'9Y,+\,ESM,6)4)0U%8R:`4_2%%7P M+*?,.T43-A%Y,HI-08+"7J)'74:'YZ[HSP$W,TQZ:7 &S4T2E$HJ&3R.4:$5 M<(\2QC0%%) ZK'E"D--B0G& $,;.Z2YA5*,)W+>R4!^%-PRYQ' 1%*9*F^\L M'V!W1HO-291R08W#J(5Y%V52IQRB%39 DN7H23RXI NK'';"W*GY9>/>\Q>+ M^!;F:WU%I]!U[.0Q%6;181T#T SN*0O4/=A*\H)X4KJH#M\W-^1U=WQ.RO7 M9-(?8F8[OB5[P_&8^$&O&8V' RG/\T6?A/YY]W)1L;S5VG('^&"8P$YSYQ,7 MF'X3\ $B8!C0A*82"5(,4OFRY=/X4.'7(V&)SAAU>)#AJ>MFOWAZ>2F.VI( M'DQ/8U!$1(?$[N7QJ-\[:W8V6P?:UV;,((_VM2JQHE!QT;(PH0"+UG%NP%+! MD \TU&'>SHO]_S. #F ML[V<ZWB3%&EGE!>+:ZYMZN\7]6&:=L8MG"]OZC<H6]N=1U^D;.-Z8/XNJ!<K MK[F=^;)ZY/L\7ZI$=>;18?%IO&&?[0V;><.>VINVVGV6.U.1ZL_C(6Z50W?B M_CT7VW&V7J-7)WH;?=CGTRNQ%),E(M,(48S)%HZW*$>$;T?9-N?HPLRTJ4V) M#F[GZ-4&> W_T%XUOZN+B\L6C?;&B&09?P-],?KOI4%[]=V\+6[18;4HM6B+ MJD3_+JZ+UNBI[;H[FR'7M4&U:4R][)[;IM\;,T'7E2[R0KF.$Z1 H**\0*+4 M2!=-6Q=RX4Q6.6HOBP8U5=[>B-H ^_M"7AG5HK:RUEI :4U]W;C.JBIU87LV M7=<GSB-3FEK,`%*94IDI^E^U0,UEM9AI="F6QMJJC3(%D"+AB+YC`HE9!<PW M17O90<X*68OZ;L>:*G)45NT$W<$H2I1(5S?EK!*/IO.ZND:7;3O?WMJZN;F9 MJFZ,:55?;"$;J:V-C:W7+EZ0/1^YGY>F;FQ87OUFEH7];=LE])5K%(OVLJH1 MY[:86\ !()?FQCUCYSM/-CFA"$PVUN9G)!=Y;FKG'KI='>U9XZ<]LR0^?PB) M3OT?*UU.5\5?5[S^M5NXO&+ ?FW:15VZG%AX.\23$9\:!2)8A)H?DYJZ: $/ MJ%G1776ZJTYW-=39"\8[ Z$V1P6R,V 378W/;;0MSGCDDW-6G*-W[]ZA40JB MJW$O9-_PR5?- !_B6Y2P<\!ZL12SA7'[ARV 8 I[Q>X$O9^ O0G:[Q5 -SRV M2/ V3ABG$28[:P+2"0X.]_9WWZ?9NH!V BQ]O[N_=WBP+H Z`<$1Y2R)O^OA M]GO#BN/7&] 9((:FF0;K`A; ]<(XM8FTR;7#G76DFYOGZ%_ ^>'AV*O^7"L2 M>-Q?9SNQM6KE(*8 MI8IHSC!6O;$LA-W$,**H_,)M985D5H98WKB=6;FF7.> M*)R+/,C,/3/XEJB8BB!S[)E%&F$6DRC(G'CF7+,XXY $F5//'&<ISE(=CG/F M/<0YBA*<Z#C M3"ZB/ TR)YXY3N(<4YV%F.V\<LRIIH*I5 P+^OAX6!RLF]\BRMBPH$'< X9P M-D(0FN0BR!QY9LU,'N&4AYCMDN28,4M3HE=J=#W.F6 M\SNB(L^S9 `-XL&VXN:WA'D2B>'*`>(>M-U6B)O?62168[?&[+9"-U4XESQ3 M49 Y\LQICI52&0TR8\\,I_(\9XD.,A//G/*4<:U)B-F]<CCF7*2)87F(V>7; M,N>&*A,;'&)VKTDNSG"081%A(68[KQPS,S E1(29V4-M)#Q*3$J#S,0S2QV) M UXYQ1^;V=RX;ROHY0_P*U^_[(GAT)V];B?V?N?N]V/TY>%;P^ >?4*C6SC' MC.X^W8_A\ R4W[!T%+9T9RW=6TNWG^["EH[#EF[!DK5V#S:ZZYN63K['!&:L MP3_17_<6:?B1J!^H+E+"69'NKMQ=N_MG=V_<?>T`+6R6/V^VF_[U=C 31L(> M$!N $.Y+Q9NF)_"L8E,^^QFKGX"C%R \^I&$Q\<O0'C\XH2N4DY>`.WD)="^ M_ U02P,$% `"`` `;BU'+M4[+>\]" ``\!L``"$```!S<&5E9'1E<W0N<W)C M+VIA=F$O4&%D9&EN9TU$+FIA=F&U66USV[ 1_ES]BKTT<Z%L6B]N['%LRTTB M^U*W\?G&=CZTF<P-1((2$HK *!D]2;_O;L`P3=)9[M)-)E$(K&[S^X^NPL ME9CD1J6,0,]$!IF,])(I#O0]GWSF 08M29M&+)JK>6:$`YF$ B0S*UKA?,<3 MJQ-2)2)(I/9AA58"ED HETDL6:DZ4G(.,ZW3XWY_N5SV`FNC)]6T#Q2I?H<^ M_1T3LCM2SR88&(:.!S'+,A#S-.9SGF"$">35^<N]6'SA,(EE\*6?VL0#BN2! M!5;#F]M\8I2 >,(19.DER"1>V6S/%.=5-*(\"6S&M81 <:;Q):E:2O6%3)!_ MEWOD>,R3*?+%^,^5 _5ZP55&?']^PQ>"OAV;2GUN7K)<SZ0"^"=7$BMTW(,% M4X)-D$T_`AM6%]R*_W+P1(+EH'G6=>DR593U*(AU+RKX9 $)$^('E(5('2RT MK;J(H6U5AR^-DJ)P-LO2 H^?:$E=\JV5D%&4\36C!GH>74<-D5_S^<2(6."V M)83P0 MLXXE<KL7!=#Y:.R8BUU5=81%M]Y1*K%J=LN +-H>=_AH[S +Z7%V? M7_Q^=4Y?1S#PF\^Q/LWS8>OYW>6[BQM\OE^PR1"<^J!4WYU'SG&+8*>RA9V> M:IYR6!8<NH;MI=U=L+:KYN+TU)M2KWCHWM'\S8I&"?,<J14P3)090D'EJP]3 ML2 =Q,&B\6"*A7YA,^S4.;ZVS;Q.F6+SDIT`[TL=I)&>K\FZQ$N-(QHI5+KN MU8GNEV3HPA]E[ B_M]86_)J4D3 Q`E\?"CV%%6?6C\G ]P]-V4]\>#A2(O(J M`?B)&B?\_'/S$?H.W5+"QE?))8[5)=S0])WSB_N IS0[O6>5J.'3A%<1_.D9 MAKR1I%ZU>E1OA(TU56Q&M0;75)-'Q<^1 67Z6:GOT_IJ;%M%)VB_<ZUHPSL* MGK-B^T^=/YOR4;$E4T&;H0WG\7WO,0& =8\( F<[>M>HS:-> 'V6>]T_"42Q MTO3SK1$QBZIFO34ZM&Y#A.PFXMKNN M(EDP9C.GGKU+?YFDJ%8:QY%0C;(YX MYV:.VU+WZKQ0'+?823/MVVBVD"(L5'Y(\>3$3=+14)KKNLY^_Z]O;F\O;NZ\ M>M)/JWJK5V65[5VL_"K%*/712N[N?L(,&RLGS3YB7H]&%:WK*. 32%5"S2,? M!C5"%D8(6J/ROG:>Y,A30H4['N.&;8UVFV._VQE7A]^(BWU]TOG_0DP&M QE M)5O%7ILF^%[/T_HD<I5<&T3%CK90 >LQR-4&I8;,=81YN U3U5D*;=5N?B.S M)),7& ]_L0C->5Y-<W/5T=Y+58>:E ]/B^63R.N6?*RMM=W5H^$Y&E5GD"[\ MC1Y?=^H,QNTN9/O8-L\;2Q_PW[E:]^[1W>DQ7683U'&W\PWP[$E6:+=7JB;& MA*8*T:,I%F(H6(*[^)"K+6 /#A'IF0&]-SIZ>JZ],G)G9V? "1QQM;P!CS/^ M1."QT#KFC MY.DG(P+=`(1V_V(LB408$RW4N,"^SVTLW,R,I(1J=1$H>FHF(_[;*_)L5112 MIWWSS:<[*V7OL-U\<4KL6GQ6K/W3^QOD/[]/;:JUA*42.-'X/0MTO"HT.884 MZBRHVNT-H9V*!8X.>UO8,Q:*FT/4/\V98HGFU *>[6,<J%1C,I_.MEU/E)?& M)NMUDJ_/UNY)9T,D:3]9NPW17-'M7OD_$N;:G- FS%-,\N.AE-1=,VL9:.S6 M FQEQL,>-P] K>!__1]02P,$% `"`` `U"U'+E<]A920! ``_B<``!L```!S M<&5E9'1E<W0N<W)C+VIA=F$O4TA!+FIA=F&U6FU/VT 0_IY?,1^JRH:0Q.\) MT.H2.[0]776G<A6Z0[3RRX8L=>S(7B=P;?_[S:X3$SOA$">OA:CQS#PS.\\\ M:\JF?P2O/D2G</E^W+OS5WYW!5K/`7TPT/H#NZ];H%FGQNC4LN"6Q!')2 +3 M`9G. ,UI#GDZ8VL_(\#OB MC['(D"0AZ<%?:0'Y/"WB".;^BG"LC(2$8J7 BXJ> 0`_3K'F-67SLLB8!IF? M/9QQ*#J M9%DP".(T_";:E<)P`(9^$E &ZS2+\A[2B<57",C+C&0Y!(2M"0X$IA^(WN*- MMN7PEQ6Z<.]7G\B*\KM3,5JOA-$OV#S- M\ ,DVT<RQ;)X"BR>$5[\'WX4X4Q\]#K?L15]',8D9W["<ORAU][5Z0!>V&JX MI/\04& "P0,CN5K-WMS/Y[QD[K?,Z,IG!+ 2AN7/:(+S0)&$]^/+]U\O/_P] M?K8#INF 6#D M+K[S*R^6)%,J?KJ/ ]7[^+LW_8HQZEGES1GO;3J"2T[(6JS'NFFX;)JRXS(< M[/APN7["?8\I&^R?G4VA6<IP\R)"3 J?]SP+U;UR^<,GBU)$AU7TV3[LA; 5 M$45]LLB=D/)A/>)GQ5*8$90?R>6P5"U^E=)(-,FCMR1G"I=<.31=(:=T-FOR M.$LS1=CHF\$9T//MTF.2W+(Y/CD^!K7RKD7<\8B[<Q/P^YX7OS#O-:8\5BAN MLO+C`K>%Q\$I\PQX[L&][9B6; RTLST'K70 LS#R ^%HWT$O'4;#P(_"&=EW M,$H';6#HENG8 MS3;9L6D-F[MCTQLV;\=F-&S3'9MYLU/,%(ZQR<J8K]-2?^ -E\V)I:JHKIFF MXPIU? C5+5&]+:K70,5W! <N476..N6HTPIU> AU4J*Z6U2W >IU 0.7J 9' MA:V1%+8T+J[VM<7%U3I;&A=7ZVQI7%RMLZ5Q<;7/EB6%+5L*6XX4MH92V!JU MPI9>9TMO1UMZG2V]'6WIC?=6.]K2ZVSI[6A+K[.EFU+8LJ2P94MARY'"UE * M6U*T94C1EB%%6X84;1E2M&5(T98A15N&%&T94K1E2-&6T8ZVC#I;9CO:,NIL MF>UHRZBS9;:C+:/.EMF.MHS&_[=,*6Q94MBRI;#E2&%K*(4M*=JRI&C+DJ(M M2XJV+"G:LJ1HRY*B+4N*MBPIVK*D:,MJ1UMFG2V['6V9C;\\M:,ML\Z6W8ZV MS#I M2-&6(T5;CA1M.5*TY3RGK4,'M8 _/GA BX;)P8-9-+ '#V31X!T\B$7#M#J M/?!)%'X8-]/X,3_XY:%K4/X3-H]=,\**+ $E_*+XKY7 2ZB*3 SNK?%0=T:C MT;-I])>D\;_P%"*!/?5&T\E8>S:!\9($N(H`60I?*_Z/8+N6X84VF;B>^VPJ M% `"`` `VBU'+C./QNM3` ``F 0``!P```!S<&5E9'1E<W0N<W)C+VIA=F$O MV^ILR:!DNT'1_SY*;K(..^RR"89-4WQ\3R25','H7;:"SV^OTOA.=&+:P2Q> MP&F:SI)TD9S.839?G9VOYG,HL,J04,/K^P9&$1SQ`VO3[$ 5I8/Q> *S\_/Y M"6-3^%(BK&G7.'4/;TRK,^&4T?!!U<IA%GOH555! %H M$C=X/=;7RU.H3:9 MRI4,P"E()E*Z`*$SR)1UI+9M2&ER<*6R8$WN>D$(WFZW=R =...S.=;BD&H; MP-+H3'FD':"_=%ZC1A(5BY2H)<;PS;1 2]-6&92B0Y^+4*)BI2""HK^D`%$9 MUMPK5PXB*[4E0;L+GTKEH(V;PHY9I-"0F5Y71AQ2YV1J*)UK5DG2]WTL!X[8 M4)& KU021<E1J!>W[R2%&JT5!7)Y"K2.N0M#S%SOJ_JJ0[*^9*-/V"EOK4*S M1V%3M*XT!/ >R7"3US%T+.KZJ>F!KFFWE9*0*\U'E)6P- P.X+U#G84?4'53 M88V:N[KFPZ/85A ]1$G"HZ*Y;:UTABS_Q_]N11'P>E+G%8TG\!!\?MFV01I/ M+H+C,7H*)M4)AT-T.(0E^2?*.P_ 9R0?A_F2_H2_D1&ZEC1H[(?4ONO/J(<R M' ```'-P965D=&5S="YS<F,O:F%V82]32$$Q+FIA=F&U4]UOTS 0?^]?\7OH M0[NU3;/1:FNWB:F"`4)"XD,3FHKD.M?&);$CVTE6P?YWSDFW,O' "UA1=+'O M]^&[2W2$[MMDAD]OKN/15E1B4"$>37$R'L?1>!J=3!!/9J?GL\D$&\H2LJ3Q MZKY MX,C?K PQ<ZJ3>K16_01GY]/AHP=XW-*6-A=X=4]7IM2)\(KH_%>Y<I3 M S-K7PM+"'&YVI+T\":P>?;BR>:N`4NC$Q60KH4>?-Z0)BLR-BE)2QKAJRGA MU#HSXHEZ;4V.U/MB%D5U78]DJS$R=A,A5"KJ=#K145,P[M\P1D[.B0UQ?3;D M/(MOC&7I_+&L+RNR+M2L^Y$J%:)9T^UN<RA*GQH+O"-KN,N+$2IV=;/O>J-7 ME*M,2:R5YCO*3#C73 [HWI-.F ^HO, H)\UM7?#M2:PRP ]V&O&P:&Y<*;VQ M[Y:X_=TI>VD/FPE>949^YQ\&9V/4QB9N`"$E!^&GX^V0TY:I(/G$L3:V!^:& MNHRG<ZB+LS&_CX_1/^B$%5*VN,3MG1K&TR6^M=&+Q^CL,3A=SI\!>6_)N-X6 M%Q>(^_ 9PJNK*PSC_B'S85_?AU]02P,$% `"`` `D2Y'+GE2GW]K` ``10 ` M`"$```!S<&5E9'1E<W0N<W)C+VIA=F$O5&5S=%-P965D+FIA=F&M54V+VS 0 M/3N0_S 8%NQ\VFWWE/;0D+*%$%A(;NT>9$M)A"TY6'+;M.Q_WY&<+WOC)-" MD27-F]&;-V-K4T0ICR%.B5*P8$K/-XQ1^-=NM5M*$XVV7QFGH-$TX:L]P//; M:V!!:DV"2ZAPCPH;40NDFUN8G96X'>-ODE;YOM83KL9[)I1RN9I-0- >S'6. M!)>%9D!92K8[*8<=DSWH-8,XH\P`EVFAUG8G2RG$),89D12XY!KPR1FA6UAF M7J+4X;6,=<+.=(^M0H49],O*&Y_2W,SO%'NV8N$,HC2+$X5(%[JFF7!TA;(K MSRR'F$ 0^&9;E26[KS2=:_HD%_5)+NN3_*<^T[H^256?Y(P^SCT%"CHWB11= M%"FZ+%)TJTB-,CW!FJ U,Y_HX<]GS<M:DSU0U,Y[H,K_*=W#SVO?9>]=I]=< MDT;7\377Z-3UCM_'/5OI?* F-8%;T".ZX=&U4.CFP_M0Q^?6P?W>,\YF_+6 M_CT``"JW```=````<W!E961T97-T+G-R8R]J879A+U1I9V5R+FIA=F&T6FMO M&T>6_>Y?T1^" 10[<KT?3L:8>B89))A!X %VU_ ,FA1E<482!9*R'>SCM^\I M0NA+HEZR\NLK3EXQU;V?W5S.EK.[+GVZ[[YXUGV)O[JPN/]E.7]_O>[.PGEY MC71OKF==6/YROYY_ZO+BX>ZR7\\7=]T/\]OY>G9Y4=YR-S?=YJU5MYRM9LL/ MV\_+H[^M9B^ZV\7E_&H^W;SXHIOBC/G=^ZZ_N^PNYZOU<CYYV)A<7'7KZ_FJ M6RVNUA_[Y:PKOS],_CF;KKOUHEA;XR[KV?)VM7EYNKB[G)<W5]M7ZSV_G=W- MEOT-+CF=W4UG%]V_+QZZU?7BX>:RN^X_S(JMY6PZF^.F7;^YT:^8Z/J;!>[\ M<;Z^WE[R9CY9]LM?OBZFYE?=W6+]HOL%ITS[N^YR\?'N9M'O35\M%[?=]7I] M_^KERX\?/UY,MV=<+);O7W8E4B^?/7OY<GY[OUBNN[_VEY<(SX_Q:WSXY2:( M_E-S[/GFT/N'R<U\VEW-[^#H]*9?K;:IT\T^K6=WEZMZEPZ7NYG=SNY <4 D M9OWD9M;]9[DV<N9NM>[Q!/]R\?_W\^Q9AQ]$H/MA=O<>87],C^M^=5UN7Q[? M+^<?^O6LPP76>T_F=^ON._?S=__X^?O_2-T?.R80RG+3[S<7!9D?^N6\>/"[ M/3[9!^M%9?SBQ[_$](\WWW^;?CK_>H^?+I:SGU#BZ[/=A__][-D3Y[9';+-H MM9R>#X\JGU5SA<^+'A3AXXM^\/ED]_ED\/ET]_ET<(.MCW_9]HMI2=(GKBYG MZ4D!FYX4L.E)`9N>%+#I20&;GA2PZ;& ==T0)=6HYXW*>=<;F](MW8U\(I1Q M(94VUOD04_ZA.6\#R"D&[ZS12 K.*&D`TRV 6.6D%X%[EJC1/_SJ7?YVCU5M MMF\M-XOIO_;-!;=L+UE&$C#KVWN<53KDY /SKE[B:K$\*^_._TB^[N;?&/SC M^?/S_>--<[Z]?SO?!.UL<]C;[3D(]Q_.BKUS.)'/=SG5_=>3=_<_GW_WFV]* M;V?80B]_I[&Y/6*7V;N;['+VTS"/N[Z47/_BJ=^34F:3P8?34EK3QLUET3>H MYQ1W[>%SZ*%'VW/8H4=; _RX07'<H#QN4!TWJ'>/FAGS=V1\W\Z4KY#MDW:& M/$>F3P_O[)NZVH?L4%V5 !63Y>SN[YA&3C[]TXRK$L%RG_).^RE[5^Y0GK:? M\IU=5NR>G?U/>7[^S3>T=;V$<&N1/WE7[BR*)Y^JG46YMRC>G;]^_9KQ)R;U M_Z%L*_EIJYW2!OAZNS >!K(!L,SL T ^`)8!?1 H!L RC0\"Y0!81N]!H!H" MCSFC!\"G0[4OA+VA;Z>;O'K#WDXW5?"&OYV*S2_B[;1-STFAO7Q('V'\\<5- MLA=3^ G^RS\6&G^-^=)P/L-\?XCYOC+??Y;YGC; SS'?LP'P&/,]'P"/,=^+ M`? 8\[T<`(\QWZLA\) S> `<J*T=\_TC\_TC\_TC\WW+_'3'?/_(?/_(?/_( M!\!CS$_4$'C,&3T`#A M0^:QH[_Y/;_KW![]Y>Z;XY^_\HM/.&OW8?[^WWY,K[J'U6R_N$.B0DS>]NON M9OZO6>=O%A^OYJOKW1N?^5IWNYALGK\IJ57S%-...>>I#EDG2X),/VSNMGD& MFR^V(!<$$Y[PQ 1W)H4*H 74F-,L1.D3)S'*'"*O2%;-J4BH]99GE:W.W%40 M'Y +T5IM<HZ,9DMM8TY4<UIJ[FBPFAC";&(5) ?F/%6",^4M8\[PT)A3U9Q0 MQO"4$A&62J-)!>F!N>1< *M24X0F)%61IIH+4E!EO2'&<<EE$SL[,"="TA*' MFAA3$+HB:4,%<8YE$7,,)&9!&M"0"DJ\5ID:IT7T*=<HTX:*H$+PBG'I(G5> M-: A%91KIBBC4K.<6,X5V5!!G3 FX%1KHV6T9A,=4B%\L-G"$T<(T:$YN*&" MJ2R3RBH9R00-NH*&5!AIB;;PTTDKM*]4T(8* 6 8&62P-IE :Z+0(151FZ05 M1+D:9%;T(B>Y1_*&"FJ5S YA3B2G:&MR\B$5.4J&SF.\55+(6)GE;548;9.- M.C.GBQL5-*3"*,*$L0P-C5,K*FF\H<*);"7GGD400GQM.WQ(A262&ZX"?);( MOP;94!&]BB$;EP.7VN>:37Q(!34^):?QAVN29:T?WE!!N*88`$X2;RU1E2\^ M9.X%B U.,$>:,X=4^" 5)D^6E!N6=8V=:* 0,KL4I1'<$^^9J: A%308RB,* M$L60"B\IH83Y0)QA+%=SLJT*05/*G!+,)HC:2H4<5450TEM"I(W14UFK6S94 M.)Z48[6PY9 *AAY -758*P3'SK-'JH8*CIFN4F(4=4&$J$6F1K." 4_.'**M ME73U8-50(:-$N7HIM.'$Y 8TI,)9C'YK,&93=%A[*K*A`HV$.DV544&0Z"JS M:E05E$ D`1J943J8FBBJ;5 AYX29G<N)1M;242,J0O:1,,604RGK)BP-%=YE MS QRU,K:+'2[S**W8RQ13K*BE-9*U$,JL!&A 8HDX"[!`*S(AHH4M8^)<V-T MTC8H:G$O:C%VH NJ)HH>;5!)!41-(-B2 ^(]TC142$.#L)C8A+"H1"T=,Z0B MW 4H)"MBC9T94J&XI=B>B-:DK*LU44Q#A4K!.*RSA 6EL,U6T&B9U< X2;$R M"AI2P3RGA 2=,(,\D[7(;#NVLV4>8] BSXWWU5D[I$(&98+!'%,<?<_7!F4; M*M#M1 M.RSN2"ULB[RFE&T;5,#JB47;&< H8VIRVM&L$! S9=9*9K"N[,-"22OQ0J(2 M--J C(,*"(QB_\U8X"NRE7 ZB(R%34=%J/*Y H944$ %YQ ^I739&O?(5FUK MYS'+%!0#E M!!/3D-S.THIL&U146'1=1#U*:XBIH"$5"5GNN) IRP"K-7:MVB[/4- )REP9 M2,86B'4K!LUJ#K1J.VUDK MM"QA'&>-YBUJGQBI;:5RM$FB M"GB&G"TH[M1()%A]=8$[03-5%&:CLP.!+0 M=K"/<1_JP:W:)N4'?1/=!.N K!$9J6W!N-;:^Z0BYEZL47ZBMJG"C-5H$2A< MI$(%C70%U89F+D5T+N18H]RJ;80.>8 !ZJER.==9,5+;:(QHW.5+'&-II(T? M&X&[+"=M-*FW:]5VQ/!7+,5DR_K!Z[ ;J>W(D"/($JX,RI;5WM.J;24QK+'9 ML,WMV 8E-/8PD3/VHVQ=I7^DMI%1#H- MU+*/*8L,8+8FRDAM6[02+.,\IYRA:ZJSK=KFV7HB"*8WP> CM1)':AOZA 14 M&6(8,I;"BFRH(%8*%D3$L.4QY<:%T3(K F00BT:&B%E?<Z!5V\%RZ76$<E/, M0:=4T) *CK4.VZ R*7*O>,V[5FU[ _MMMDI&I1>U*D9J.UL+29. `: 'I*[, MMFJ;4$ %147&GN6MK(DR4MO44^%"*/K=E=!49$.%$="5J&M"/!9:UI ;4A% M0/1 U:^ T08548IH[!K;`)1*'?"MVL:UD7()"1"% ^RMH"$5GD'E<P-^K350 MTQ794)$33S% _?)%$)H:D9':#AK8$ )VU("!5A.E5=L))>VE!<'6YT J7R.U MS<%4CD)9AWQ&IE9D.RM2UH0XH .XB*J6SDAM2QL4DMV 7X W62=RJ[:QYF9/ M/-)%>D5SX^Q(5V )= E-RA*AL7+MD:W:QNR7, EL/))XYZJYD=I.EE&!;8&Q M-3M2VQE[NXW.""2]AJ2MR(8*FQ1FNO4VY<1XKMDT4MOEF]'(C D8`B;JQMF6 MBFRHR#K^+QOGF 3)C0+A*TD"]/BIYPE\_[-LTMX8J,&Q7ML1(W=W54F0'R15 MJ.+O.-0")K9%(4"U`C('I<Y3\NU_ME3QM W1C+\& #PA/IUFB_Y^%'LQ(!#A M_2BD0E/B02"R0VAG>[*>MA>D^,W8)P\*7.:S1:'PL=JN<A /Z8*WW77XWO;" M/20D/UOI' 4D6Y*3(;) Y>FZ[PR(]T#Y;6+;2\<=LBWE:?N6!N%6(>Y7UH*_ M+?K[41SJM1UDT=9$5;RM]*VC=&LC[95U,$UVEQ"XHM"\R"GSK5Y!A;;2]RL0 MUX]H%Q=YNP^W*!3)<<8`JN?>5NJX=K&>MAMN&C;H?H/R`Q':HB!FB5:BACM/ MB\*I(!Z->\JW'$"AA<]/;_N4(RWC_G5LY6'/*]!VAL1"QL/S6CM1MRWE:?MH MK0 GL)<KM;*[=\'Q`6C3QC%^(Y3>LNOPM V5B"=Q1D7"?3+M$F)O6QTA<CJ" M]TQE6K#X]+8;(LE"2.$*C4<6)P)M`XI5+;2$5,J]V&WQM'W7Q . V#ZM(ZW8 M\_K1]K\.PW\_])_RER'OU EM`2Z4"6WM]IC'[Z5_6'2J[4&INQ >\!O910N) M(S/P=KBGZ/&;-]<-]J:!>^EZYR7 ]QGT$YM[+&0W%XP\?D,VSI8N0T(AFEII MO03\/MKB1K[7EEW?9F4I'K^UHM^D78WD_9AUH 3\/B_G77O%N;JIFL&K>/P^ MYZ[.+R<(3%I&<B7 =WWEOIH8OU"P=]S%>N:;_::'W)%N0G0C6Q2*4G(17A[P M:^TUQ5VLEU2XVC3+3'<R-7/0E=CLUJ0%[2U[`=6LM5L\?I_=W^M T0D>WN:- M+ &_-] &80:?* 2!9B? XW?N)X^95!H CEO5O 3\1C!-&R</0HYZMJ9]\?B= MU 4'"Z0!=O%T>3S =P:(9*:^H HD6XVX>/R^D-2C0;%BO^_]W!T)>?Q!N#YE M;]%RHSW9#WXC#OSK8!AJ&G1W)!BC$(-Z?MB;2<JTQEGQ^-T;TC/4^5%!NLSK M?$>=JFT 2-=[W<?]_2 2/B27]78]H%_KL!:/WX3M!GF+7=?5D67A.>#WTYX> M> KA8JYF7?;B\9O3I-EP8/?!U9I=L$3\AI[&_CB:*=>VJGD9GSS>!\Z.5CA/ MV X,`WX?(DC"!OVJ= N7>#U^SX:'`>)/"/8[F>6MC.A1XZR;&#Q7[W$:R..W M%K?7P]'(JF^:6Q0:&$ !)SWAMQ$QS5M</'[O) QEN-+*N G6#BLCMO40^X?V M.]]%G'?7X2654"/!(<P35VNNUQ+P>\_.<B%LL3O/-AU,'K\1B1&=0)MEG)*L MF$,!OR&1:H&PV:?B$ZVP0AZ_^TK0/\A0&5J&B_NXD"O2SA?"-8\SKFOKD<=O M1:*=<[N5W5,5,E%M$SS/J8B[(R% :?^OMCKRGG=;D8,\?N<S.(M U3299[E% MBV'&*,J?! ;T?DK:V<<'F_6(`GYK+^?TK,[VI^7B/RO+IVK>TQ+\.%'U8:4F MBM9RC=FT"5JX`^EMAWK\; C_D*+MU3L08NU11&MYJVI1SQ ^HRXST9+'[WD% M 1=PV^M[9.5&BO -K:,V:APB>MU*SN3Q.]>-^'"Q2][.KB-.L=F=0')CG3>E M(/T<6^GQN_?:(6-5R-=YW,>%2L <![L44B&#EVSX M\T2(]&5]. KXC? _MGK*$N>YK(]-'K^QOX9^#FL%;E AC" .7!0(&6S2IXX[ MF\PAC]_0"4B'92&+(O]<]YTA0%WH[-=.Q2W$*;,0X/%;BW1=/3$=SVQ9]9(" M/B;1XN6OJ62+0M4<X?4PJY-QUFX>`/+XS;=KBVATK4V*(20%_"YS0VB=)QH= MR0QY],'OKG9L-9Z4=YR#C )^ QAX%#ZG0QH],PJ0?-PX8^Q):LJ>N=D(%T7\ M!MHU-5&^D=>S`A%]\/M 563HCSJ0EJT/1]%:CK0H&ZKTUMZ265G(X_>60UNU M3M.*\G2+0MJ&AAXZ`=&0H<3JTN1I&_MQK)5IX7:\8FT)"K2]\CKUY<5'$N2U MXE9V7Z=)N?51P*BO9NO74Z#MP_<]1- !C-[%"I/TL99KF^,4;9H F%E1B )M M-% T"BJV*'18S[V0X^>>];B8?X(\;2.3X#IU5 MNX_S8TAS(_;CV>^4</LM3 3:OH_!3_CJA:?+5OFE_AE#P EDOO?AA WS)U& M;=R*S54-;8_/M=%!ZA\+R+O()S2P6:KK85* [?[:7J!L;+K)TMP7>ZY8!^LJ M?A]XH9*[A& !*4U10-8K!R'-'IJG;8U>&[L$D ]]8=9R"K1-`Z&]5S5Y:''! M?9SW,_->[]XTRP$WV) L!=INNT%HJ7=3#A MQ7(SNSX<!=HN::6'N%D>8':819X\;9>=%V0/`CX$SR5WL2V:+ `;("B(U4GF MXKM3<W9!#K0-PJV]X XBEQZRS E[VEZX0.2)//35;VS30!QHN^]-;S1-\3Q> M<BN]F%7C>T$ 4#OSJ.Z.1 MKM'Y7?>=P7? YP&V$9%WGFZ,CSUM)P& K).W<(<&?;8H%#Y^9K>=N4 A;7+7 MX0L?1[=3U;HG[K"9RCC0MHZU=$TH> ^/S>?RI]E]DTXA(GOG0]F:Q!R;W7*A MO9A=VC-ZK4 UGFS#XQRMY5SQ < ,""')6:B8/ ,7`&?HJ[Y?XFGV&0ZTC8B. M9X;4WL9&\G8K?=J&VF.&6OQ9%&QH &.S&X?F98B9,R6Y,23VM(U$ID\B([%W M;&GWG=%$"_$)Z:'>HGQM2H8_UO+4TNW08LAFV34=.= V/WUU`:4&_B TW!?[ M1P'JJ )]I;;-;!/+3-'EGPE(SU):RM6&\]C3-I#WTMF/GM*66<4XT+:, 90M M&00.M/U. U) 0AZYSFPO_6!/VT5]<;EG4K];MXDP#K1]6QN]W4Y(*X DVU*> MMDL'\2:<C:G3OF;&XCC(W=)6!BFEJI2VN^QINV4>"'=2CV8[FQSE0-MCW2[T M%NCHW6>.+*Z?V9>M'8;V&L[!L7DU#K0-L,/>KKG1*F/:= E[VH;JW&U6';TM MZ]C;?#C0]J-41?JNV*>[+_=QGSG)!^2!L 0PM&;#XQQHN^1Z[KM0E;C/<MQ* M'Z"ROCU YTM!\=7L[!QH>ZCYJPY<KVP1FY! 3]MWJMFD%OR:UKK-7/%_6,NG MEIXN=/;%<K?2%\DYWU;[20\BH-CD-0?:QF["6<"VNZ=J(=I6^AH4<$$ >K#M M7A=Q'Q=ZVU"]HQ+4#O+(-)LW>]J&L"M]3\1/I,9CKV#B0-L=^F0R_;I;H'?; MNT 6YZI=7XN,GK;K7I"3X%.^9RR;M^$>W3 %!RO4]8J8D/P[&E;Q[?6' B' MLZA3WA8%YV8]%9E[82\C\YCMD3UMGXLP-J&=<2X`"Q: XB!WHK04?]=/,-B3 MVG5G]J,8:N-O[&G[E=^K(PJGE5>UUPAQH&WF?7^-7 B!Y[R1[&D[XVB5E("- MM $]MN\";8^G%\"/9NN[F5^,/6V_M$^&^"RLY+O<'0FY8M?1`))4"0?(IE'9 MS"TJD;9Q$A9!5HYS<)2&K?1I^Z GF_"MP(]IXR 2:'L`C.?(H,N6$?O<QWG' MQWGMI04FQQ.BYNY=J,S6,LN=:R?DJ&SS[9(_)MJGUHPV=>YWV[R-_&C[8\BC M-XHM`;\/$#H-*/6.<-0--N7C-;]OYWD22<>WNOT0\!MZNPZDZ5M6F6["5C[O M[&Z"U*FUU<;'NC42)[O!(3H1-S)^N2LYB\?OI.,WZT*C'(BXZ^Y(R./C+61 M-T&5N8_SS>ZQ65\D`6BN:D"R14'=ZBM;"H006.(VJ].(Q^^D?G76&/'+`G:P M_Z/9/8X<Q,ZW7AO7?9S/XUIGQFW#C MC:#B MWV#S7NN:D(]\EYF!Y?,>-35_,:U93NIN`D,"?B,VE3ND:D&YN1=CB,?OB;BY M%_0W9ZV>NTN(DDJG0TM=B+?]9G<=OCZ(&T$=_(43RS+=HI"V]<4-(T.V(A3? M["[63W;7PZ0O`TLXUM=LQ1+P>P-<=>A#Q8+^!W]6>OS.=0WHBH>E[W0KPDO M[]S[7#DW0F9DY]P4C]_(G+.\T?<8R$!FGY'8[+X)P1.?2#HF: 9^\? MCU:2 MK1 J'K_5B7<ZMA,R+5]R]R[4!_7UIU"52"HO):L1B\?O\:J^U?3,ON54JW%) MP.]Z`0Z)_\?6E61;=L*P+=&#A[3[7U*D-_CVC6N0Y)P*]6X'MH1E<2BT>4,9 M3AT?8=0`!*B/[ [SZ<9_=?3[4I1/A/(`^H>J_*NEW^^$`\;%4MQ\HKK2ZHO= MY+-K+H5MDP\O!-%")XKW46NOMBD71.0A0.J7M?0[G9V0.X_(*VGISE7U]'N\ MKE=V-3S3T6\JD^C$$#K(<%2RV2S];HOY-:XW$:6Z:EE;\!76NVN_-+>>86H! MQ6X)[190'ZJ0LZH/FV7;\]W3Z:</SC!3,'?GBMU =7>>>Q>R5%$M>+-LN^UX M4 <NT2_[D99/VOV#HS1 M("ELV<X]9!6H-"\M%\0F_%[8\^6 :IQFV?8)[ T%N:35[U");_.NY1%K6] . M5%*N6L!HEFT#P++U8+")F48&.LCO#P*,X<L=;IX:OX/V8=L/Y#MGI,0)G*?2 MYNN\<VP[IQZ0679=;[!4H"-MV 8YZ2R8`(S1`%,'N>YA+,*-==,[-33)/(<M MZX%]Q$0_8!J9:$- \VR;'>*(`7C/<QKCLV;9]GN)/3(1*0J)3S74S;'MC.^? MZ YR676"+[Y+FVX=Y.2" KE>-C!Y6M)5]M LVTX%T0&3+(%5()+ITO&-W$#L MNR'4Q0YPK(KA9MDVLN&-Y13J-KA]I(-\G^2JMQU9%W#LJK"P6;:=9K\]`-D) M.5:A>;;=: ;::"]WY:A(J?6/<K,`<8R-N1*M#U1S;/N,L.;!; =DRD<56>TC M+;\(#OB9^B*FMY;#FI>6ISIFR8+H`_RNY>1FV79/>6*:XSF1>8(6ZYICVQM) M0C$>=,VQ[1L6>W,0CV;*0WNNFF7;Y21 ;2Q&1 *6 G60HWAE($,(PMY:E%#H MR(^TG,UJH2!KEYBU[;(YMCVX!A>3CD0`&WUWEFV7NV)!Z'TK`GVHRK_Y8C>R MYP*HC.6"BFJS5Y-/[TO)I0JR`!;X4UN YMEVI DQS65>F%N+]NW3R-WI&G%& MW/56<VY%<VR;)LHC OL4$OUG'O;3LKKVR84G,"%J!_.P; ^J("'SK [6FJJV M:\W=V>W M0.5D:N&%DV;;/>U[;1SW(G:.. *;8'L'VDYO0JE\0 3NGDF'>1X M!97/^:R4`%&*-FCV]&FX6&T&<![9[/LVUW1[4 "?\TW:/1XZ`.G(3T\]8G&O M:Q4!TU>I97=L6_ 8&Y\QGKA/T<:1;MDVF/TA($IL+:K9_)SO?7F16O8WV*75 MTWHJ4_9T"[66.E$LVP9U(M3!=T#NJMKMW1W;?GNN=1*66:+ED!EINX?#B 'L M-(9Z>$"1#JJ^I>$!2_2'!8M4IE_6LFT` (/+UAK'S*^:AW4=81NKK%)"C1NL MU;R[C_\*EED:\;?M5=1&J#NVW<L,=;7'#MR MV?9[TK%BTZ,P5XU?NF7;`,4=GYZ%8\Y3?2/>1^T*X EMWU\<1<U+^H=MM\8: MG)XYG8R8$ $B\#FT M7^I:)DV=SM3>E^[8=F-W"4(C$RAFH** C[2\+ZJECK127E%9?O>U;8J>8]W( M*> PZNK5+=MN; $(N'EZR%XQ[\YM?+Q,M67"W=0J*M[N']=R,+LQN-=?`+2T M=']4&5"W]'NRC)!JKB V-ZL2HW=?80V'+G68&0,P4M>GI=_(/WF"\#W,0]IR M[G'UX24 [10!L&4B2L6,M) JSD8-1CJ#Q M CJBT0!9SQ SR!$-\/X40DD3T?[IOG2W])N5Y FR'#M(2S((S=%OS%QI;94, M0M>:EN+[I]C= 0H08("[(K5[.N ?/:R(R +<AX7Q3$ZU]+N5%W!O>Q\J)%7B M80U0\/YN`513CCZ\C]JB+Q*F01S,^F;DYR"8\"86#TU&L;ZW#G*?(L<R,/'2 M`EHVVS[#TN_=`>-[?73MR:8I83CZC0S8[HFW#L3O$LQ(F\<1N\["++NKAZ4< M?7CZS?-"$9S('WE<A8ZT1H];JH!S ;<`0'1S38=N9UM<D$#QX9H=G6'I]^\P MDVC,I5O.P]+O,^ VP Z!.. :J(/<IP#PH8-^3N"DKYKG^,C^RULU8A$"[%<% MA!LNWFX"X3Q:)1R.?H,O)YZ3BQC+HY2RCK3MQ.&W1QL%4V!U9?/#T6_V-V+J MY?!K3M JX;#T M1&,X^DT]:6JM2LT7 $O7K*7?/)*39UK/EIM4A7'#T>\:D%+"R +>ND7K(>/3 M`M38S!MQ*G^JR9"N0<(SQ<,ZTN8*T (PTE$W4F117>G(7D2+)9LW. LBU-9* MU[#T&_"\L -K8:&!\IM!KJP7YERC),1.O!1MN!B6? <6&K =BL6(-:F+S$O+ M18"R[RUEYKFTTC4L_<;\FGT5GJF.7'C,-7TM*2\VQ8-=L\M)/\6GL[LFGM!; M'D)QV[I5.QS]%K#OV$L`"\*,NN;N;(O8!!:GZQE0Q!%M&AB.?L^"^0&BBG\E M,=W]P])O[B'F7/!Q$:K,GOYP]+O\CG'N/+[QMJ2]%./;V;WS:(F*Q[.RBAE' M]176T"+><.6I`E$K#L M?T17?,2P>E4H,!S]Q 2X26ZGD\V-T;P6NRKPT>]EK08S+1[S ETM:>+M+EI/ MT>)!RWK#TF] 12D;9!2+XIF-Y.'H-P(=CP0$4EB-Q][H2%O X,%S%[3B;9E- M=9Y[1__ROY$?UW*0M849%9!_Y&A'V'!L._<KR /]]HOYK"T-P[)MVH6VU'X' M,H$ *2YR;'NLM1YH6VD >DV;!H9EVP!LE'54X)-$1V\=Y-J0&)V0HP9[08:8 MN[.K8A=\_UDB>]],"\KPTG(0GO32IL *0</\G%5N\GR_-Y[ N\V Q9_A.[NY M1Y<FWLKD.=,Z!SZ'AJ7\TX#L M,_^5;J[I=LWI[K/.S"=D:PDY/J[E-R! G(24DL?0>L 87D3+`^13ONQ/?\7< MG:5XDELX>&E V]F<E#U M=5"+R;9M'>3VH)[P*040+X/8Z(2W;/O%^;B['A^ 6=8>A.&+W? )$*T67L$" MYWB_!1"_:,^(>!\U\!A$BY^]6 BJQA'+MA,2>J>0&;QD!^UJ$L^V5^>N5\9/ MXK):)93/H6' ]#R"=.$!\(J/#O MD>!96]YS&;MG\=+R\W99W-!'.%XJ%I&O:SG66,SL&ROG:AU.'-MNP/^-S0^W MQC.W>0Z;*V1BCLCAS T=V'60VX/"IT*DI0TRZ\7FYSX'3((4W8*;0PHQI[*) M>EW /I\VWHMW+8\3,&9%Y"H\GPJIQ;)MH$[<_06-N0!NJK.2?S1RW[W#G1DS MN53M )7/$=TRR^F_/2.>DJ4OV+%M ":ZO6.JS-NW=I"+9=L3-'N\C(<8B"G' MW)WSQGD9]'*<27NDH)(WR9^>^G-!&")MS[JIFXKW4</2`2X^+8%R'>V\%LNV MVT'8O(#LDFXY6B06S M"BK<9]21U 4$2*V"A:;Q1CC: R".;2\J(F4";BU$"VTOD,^A88A>LF-D=W.< MQ?R<5V[FWPXIV,JCP<O?2,NVD7)Z;5 \71K O\XF?V 8 LSYE:/DK*O:8OD< MT3U;Q7?B =5 95H2%<>V?[!2>,C1)L5\.M)^"GH\IX14TA:=/'60VR1OO0-E M^_!RQE+=CGS.",MC`V$#WF'F=>U$%']$=X[ [IC+%4\SNWE8JU&+5&3NRX9 MMM../*V.%?&[E[FF`[-C<V&?D1 V;C(_9W=F-R93KK&NEI(Y4ET\VP8*`J&] MB&7;//&#V0*0[?(8+AWD':,NCYN)+*>MI4WP8MDVN&<_)8%OG058H6_$L6VZ MM4K!DJ0-[;RJ\A?+MI?4=P<OB:3W7UO7DEPQ",/V/0U /F:Z(H3<JG>OU$ZQ MK(L\9#NO ?3N8<YJXLE61;UK6Z,&T'\Y:GA:8Q402]FN0"!?J>51+\DT9W2U M*:X`'=X7J1G<:<F*2RTQ`ZS9?R1_+E QB8HM!W<O&^CHH"139SG+<Z&N1+O+ M````B ```!0```!S<&5E9'1E<W0N<W)C+W1E<W0N9,O,+< O*E%(+JHL*$E- MT4O)3$\M+K'FY<K$)AY?`I&$2Q>7%&7FI8-% &)Y)0JYB9EY& K)&8E%T;'1 ML0J)1>EE"IJ\7-6\7)P O1Z)Q1FIQ1J:0!V<1:DEI45Y" 9 =BTO%P!02P$" M% `*``````#A-4 M961T97-T+G-R8R]02P$"% `4``(`" !',4<NO!EY4%X``````0``%P`````` M```!`" `P($L````<W!E961T97-T+G-R8R]B=6EL9"YB87102P$"% `*```` M``"R-4<N````````````````% ```````````! `P$&_````<W!E961T97-T M+G-R8R]C<GEP=&5D+U!+`0(4`!0`` `(`& =1RZ*?^SK: ```.\````>```` M``````$`( " ?,```!S<&5E9'1E<W0N<W)C+V-R>7!T960O9&EG97-T+F10 M2P$"% `*``````"R-4<N````````````````' ```````````! `P$&9`0`` M<W!E961T97-T+G-R8R]C<GEP=&5D+V1I9V5S=',O4$L!`A0`% `"`` `H"-' M+I\/I=6\`0``+ 0``"(``````````0` `("!U0$``'-P965D=&5S="YS<F,O M8W)Y<'1E9"]D:6=E<W1S+VUD+F102P$"% `4``(`" `[*$<N2Y2)> L&``"$ M$ ``(P`````````!`" ` ('1`P``<W!E961T97-T+G-R8R]C<GEP=&5D+V1I M```!`" ` ($=" ``<W!E961T97-T+G-R8R]C<GEP=&5D+V1I9V5S=',O;61C M;W)E:6UP;"YD4$L!`A0`% `"`` `F A'+I1"1M+O`0``; ,``"0````````` M`0` `("!<0X``'-P965D=&5S="YS<F,O8W)Y<'1E9"]D:6=E<W1S+U-(03 N M``!S<&5E9'1E<W0N<W)C+V-R>7!T960O9&EG97-T<R]32$$Q+F102P$"% `4 M``(`" "W"$<NU(/B0OX%``#G( ``)P`````````!`" ` ('I$ ``<W!E961T M97-T+G-R8R]C<GEP=&5D+V1I9V5S=',O<VAA:6UP;"YD4$L!`A0`% `"`` ` M2!Y'+E<$.T]%/ ``K:$``"4``````````0` `("!+!D``'-P965D=&5S="YS M<F,O8W)Y<'1E9"]D:6=E<W1S+U1I9V5R+F102P$"% `4``(`" `$+T<N0P1? M!<P"``"""0``) `````````!`" ` (&T5P``<W!E961T97-T+G-R8R]C<GEP M=&5D+V1I9V5S=%]S<&5E9"YD4$L!`A0`% `"`` `3"A'+FRUN!M:" ``(A4` M`",``````````0` `("!PEH``'-P965D=&5S="YS<F,O8W)Y<'1E9"]D:6=E M<W1?=&5S="YD4$L!`A0`" ``````YC5'+ ```````````````!,````````` M2_KRAL\'``"5&0``&P`````````!`" ` (&.8P``<W!E961T97-T+G-R8R]J M879A+TU$-2YJ879A4$L!`A0`% `"`` `;BU'+M4[+>\]" ``\!L``"$````` M`````0` `("!EFL``'-P965D=&5S="YS<F,O:F%V82]0861D:6YG340N:F%V M85!+`0(4`!0`` `(`-0M1RY7/864D 8``/XG```;``````````$`( " 1)T M,X_&ZU,"``":! ``' `````````!`" ` (';> ``<W!E961T97-T+G-R8R]J M879A+U-(03 N:F%V85!+`0(4`!0`` `(`. M1RYB?!+3: (``- $```<```` M``````$`( " 6A]``!S<&5E9'1E<W0N<W)C+VIA=F$O4TA!,2YJ879A4$L! M965D=&5S="YS<F,O:F%V82]497-T4W!E960N:F%V85!+`0(4`!0`` `(`-<M M1RZFL<T4_CT``"JW```=``````````$`( " ;:"``!S<&5E9'1E<W0N<W)C M+VIA=F$O5&EG97(N:F%V85!+`0(4`!0`` `(`,JR1B[2'*+49 ```( ````4 M``````````$`( " >_ ``!S<&5E9'1E<W0N<W)C+W1E<W0N9%!+!08````` .%P`7`-<&``"%P0`````` ` end
Feb 06 2003
Mike Wynn wrote:I've been testing some crypto code, basic port of some Java crypto to D (the C versions are all macro'ed). and I got some disturbing resultsUh, yeah. You need to enable optimisations. When I enabled -O the first test went from 36s to 21s; when I enabled -inline as well it went from 21s to 14s.
Feb 07 2003
(I've only ported MD5 so far) testing MD5 expect a 3 to 10 minute delay start =10786002 1M blocks - 35670ms (35s) 1K blocks - 33165ms (33s) 1G hashed in 1M blocks - 35670ms (35s) 1K blocks - 33165ms (33m) 100K hashed in 1B blocks - 7130ms (7m) I never noticed -inline or -O yes that helps, much better results -release -inline testing md5 expect a 3 to 10 minute delay start =1044643391, tm=1044643391 1M blocks - 20s (0m) 1K blocks - 19s (0m) 1G hashed in 1M blocks - 20s (0m) 1K blocks - 19s (0m) 100K hashed in 1B blocks - 8s (0m) - -- - -- - -- - -- - -- - -- - -- - -- - -- - -release -inline -O testing md5 expect a 3 to 10 minute delay start =1044644195, tm=1044644195 1M blocks - 14s (0m) 1K blocks - 14s (0m) 1G hashed in 1M blocks - 14s (0m) 1K blocks - 14s (0m) 100K hashed in 1B blocks - 8s (0m) now that's a lot more acceptable, and much closer to what I expected. (not tries just -O) looks like we're running on similar hardware time to find out what a C version can do. Mike. - -- - -- - -- - -- - -- - -- - -- - -- - -- - "Burton Radons" <loth users.sourceforge.net> wrote in message news:b1vs2a$2smt$1 digitaldaemon.com...Mike Wynn wrote:I've been testing some crypto code, basic port of some Java crypto to D (the C versions are all macro'ed). and I got some disturbing resultsUh, yeah. You need to enable optimisations. When I enabled -O the first test went from 36s to 21s; when I enabled -inline as well it went from 21s to 14s.
Feb 07 2003
D is actually faster than dmc :) similar MD5 test (C version) compiled `dmc` MD5 speed test (C) time for 1073741824 bytes (1048576k [1024M]) is 27s (block:1048576 [1024k], count:1024) time for 1073741824 bytes (1048576k [1024M]) is 24s (block:1024 [1k], count:1048576) time for 1073741824 bytes (1048576k [1024M]) is 83s (block:1 [0k], count:1073741824) compiled with `dmc -o+speed` MD5 speed test (C) time for 1073741824 bytes (1048576k [1024M]) is 17s (block:1048576 [1024k], count:1024) time for 1073741824 bytes (1048576k [1024M]) is 14s (block:1024 [1k], count:1048576) time for 1073741824 bytes (1048576k [1024M]) is 60s (block:1 [0k], count:1073741824) gcc --version -> 2.95.3-6 (mingw) MD5 speed test (C) time for 1073741824 bytes (1048576k [1024M]) is 30s (block:1048576 [1024k], count:1024) time for 1073741824 bytes (1048576k [1024M]) is 27s (block:1024 [1k], count:1048576) time for 1073741824 bytes (1048576k [1024M]) is 79s (block:1 [0k], count:1073741824) gcc -O3 MD5 speed test (C) time for 1073741824 bytes (1048576k [1024M]) is 10s (block:1048576 [1024k], count:1024) time for 1073741824 bytes (1048576k [1024M]) is 9s (block:1024 [1k], count:1048576) time for 1073741824 bytes (1048576k [1024M]) is 52s (block:1 [0k], count:1073741824) compiled with VC++6 release MD5 speed test (C) time for 1073741824 bytes (1048576k [1024M]) is 10s (block:1048576 [1024k], count:1024) time for 1073741824 bytes (1048576k [1024M]) is 10s (block:1024 [1k], count:1048576) time for 1073741824 bytes (1048576k [1024M]) is 55s (block:1 [0k], count:1073741824) and I was interested to find gcc -O3 is the same or faster than VC++ has anyone tried to port the linux D gcc front end to mingw (I've never managed to get gcc to build so I'm not going to even start to try) ? "Mike Wynn" <mike.wynn l8night.co.uk> wrote in message news:b210qd$fqe$1 digitaldaemon.com...(I've only ported MD5 so far) testing MD5 expect a 3 to 10 minute delay start =10786002 1M blocks - 35670ms (35s) 1K blocks - 33165ms (33s) 1G hashed in 1M blocks - 35670ms (35s) 1K blocks - 33165ms (33m) 100K hashed in 1B blocks - 7130ms (7m) I never noticed -inline or -O yes that helps, much better results -release -inline testing md5 expect a 3 to 10 minute delay start =1044643391, tm=1044643391 1M blocks - 20s (0m) 1K blocks - 19s (0m) 1G hashed in 1M blocks - 20s (0m) 1K blocks - 19s (0m) 100K hashed in 1B blocks - 8s (0m) - -- - -- - -- - -- - -- - -- - -- - -- - -- - -release -inline -O testing md5 expect a 3 to 10 minute delay start =1044644195, tm=1044644195 1M blocks - 14s (0m) 1K blocks - 14s (0m) 1G hashed in 1M blocks - 14s (0m) 1K blocks - 14s (0m) 100K hashed in 1B blocks - 8s (0m) now that's a lot more acceptable, and much closer to what I expected. (not tries just -O) looks like we're running on similar hardware time to find out what a C version can do. Mike. - -- - -- - -- - -- - -- - -- - -- - -- - -- - "Burton Radons" <loth users.sourceforge.net> wrote in message news:b1vs2a$2smt$1 digitaldaemon.com...DMike Wynn wrote:I've been testing some crypto code, basic port of some Java crypto to(the C versions are all macro'ed). and I got some disturbing resultsUh, yeah. You need to enable optimisations. When I enabled -O the first test went from 36s to 21s; when I enabled -inline as well it went from 21s to 14s.
Feb 07 2003
If MD5 uses floating point math, you should specify -ff switch. It gives real speed gain. Nic Tiger. "Mike Wynn" <mike.wynn l8night.co.uk> сообщил/сообщила в новостях следующее: news:b214it$i5d$1 digitaldaemon.com...D is actually faster than dmc :) similar MD5 test (C version) compiled `dmc` MD5 speed test (C) time for 1073741824 bytes (1048576k [1024M]) is 27s (block:1048576 [1024k], count:1024) time for 1073741824 bytes (1048576k [1024M]) is 24s (block:1024 [1k], count:1048576) time for 1073741824 bytes (1048576k [1024M]) is 83s (block:1 [0k], count:1073741824) compiled with `dmc -o+speed` MD5 speed test (C) time for 1073741824 bytes (1048576k [1024M]) is 17s (block:1048576 [1024k], count:1024) time for 1073741824 bytes (1048576k [1024M]) is 14s (block:1024 [1k], count:1048576) time for 1073741824 bytes (1048576k [1024M]) is 60s (block:1 [0k], count:1073741824) gcc --version -> 2.95.3-6 (mingw) MD5 speed test (C) time for 1073741824 bytes (1048576k [1024M]) is 30s (block:1048576 [1024k], count:1024) time for 1073741824 bytes (1048576k [1024M]) is 27s (block:1024 [1k], count:1048576) time for 1073741824 bytes (1048576k [1024M]) is 79s (block:1 [0k], count:1073741824) gcc -O3 MD5 speed test (C) time for 1073741824 bytes (1048576k [1024M]) is 10s (block:1048576 [1024k], count:1024) time for 1073741824 bytes (1048576k [1024M]) is 9s (block:1024 [1k], count:1048576) time for 1073741824 bytes (1048576k [1024M]) is 52s (block:1 [0k], count:1073741824) compiled with VC++6 release MD5 speed test (C) time for 1073741824 bytes (1048576k [1024M]) is 10s (block:1048576 [1024k], count:1024) time for 1073741824 bytes (1048576k [1024M]) is 10s (block:1024 [1k], count:1048576) time for 1073741824 bytes (1048576k [1024M]) is 55s (block:1 [0k], count:1073741824) and I was interested to find gcc -O3 is the same or faster than VC++ has anyone tried to port the linux D gcc front end to mingw (I've never managed to get gcc to build so I'm not going to even start to try) ? "Mike Wynn" <mike.wynn l8night.co.uk> wrote in message news:b210qd$fqe$1 digitaldaemon.com...to(I've only ported MD5 so far) testing MD5 expect a 3 to 10 minute delay start =10786002 1M blocks - 35670ms (35s) 1K blocks - 33165ms (33s) 1G hashed in 1M blocks - 35670ms (35s) 1K blocks - 33165ms (33m) 100K hashed in 1B blocks - 7130ms (7m) I never noticed -inline or -O yes that helps, much better results -release -inline testing md5 expect a 3 to 10 minute delay start =1044643391, tm=1044643391 1M blocks - 20s (0m) 1K blocks - 19s (0m) 1G hashed in 1M blocks - 20s (0m) 1K blocks - 19s (0m) 100K hashed in 1B blocks - 8s (0m) - -- - -- - -- - -- - -- - -- - -- - -- - -- - -release -inline -O testing md5 expect a 3 to 10 minute delay start =1044644195, tm=1044644195 1M blocks - 14s (0m) 1K blocks - 14s (0m) 1G hashed in 1M blocks - 14s (0m) 1K blocks - 14s (0m) 100K hashed in 1B blocks - 8s (0m) now that's a lot more acceptable, and much closer to what I expected. (not tries just -O) looks like we're running on similar hardware time to find out what a C version can do. Mike. - -- - -- - -- - -- - -- - -- - -- - -- - -- - "Burton Radons" <loth users.sourceforge.net> wrote in message news:b1vs2a$2smt$1 digitaldaemon.com...Mike Wynn wrote:I've been testing some crypto code, basic port of some Java cryptoDwent(the C versions are all macro'ed). and I got some disturbing resultsUh, yeah. You need to enable optimisations. When I enabled -O the first test went from 36s to 21s; when I enabled -inline as well itfrom 21s to 14s.
Feb 08 2003
"Mike Wynn" <mike.wynn l8night.co.uk> wrote in message news:b210qd$fqe$1 digitaldaemon.com...looks like we're running on similar hardware time to find out what a C version can do.When comparing to C, use DMC++. The reason is that DMD and DMC++ share the optimizer and back end code generator, so you really are comparing the languages rather than the back ends.
Feb 07 2003
I used the dmc.exe that comes with the D alpha do you mean use dmc -cpp ? and is -o+speed the right options to get the fastest code ? the C version is a bit of a devils advocate version realy, and realisticly I would expect any OO version to always be a bit slower hashing big blocks (overhead of virtual methods, and the code reuse) and anything when hashing 1 byte entities. just shows how efficient the virtual call code is. I think I started off trying to compare langs, and ended up comparing backends :) a Java version that uses and Interface as Sun's VM used to be very poor with pointers. which means I should write a pointer free D version, along with a D version that use interfaces too. I think what was yesterday a random query about performance will be converted into a real utility to test languages and backends, and methods of optimising for lang X impl Y. at first I was very conserned that D was unexpectly slow, it is not, I was doing the wrong things. however it has reasserted my faith in dynamic compilers, and that compilation speed is irrelivant, gcc which is dog slow, comes out top. so the gauntlet has been put down for the gcc front end coders to get D to compiler to code at least as fast as equiv C++. however, performance of such a dedicated app is almost irrelivant, jview (the MS java) performs about the same as dmd with no options, yet on a real word app it out performs jdk 1.1.8 (or at least its GUI responce is better). like dmd is out performs the Jdk on the single byte at a time hash, where the code path is basically a long chain of calls, branches, and reads. rather than the maths intense md code. and is IMHO a more important benchmark as it reflects the types of ops that a real usefull app would be doing. the 1M hash speed is a test of how good the optimiser for maths code and register allocaters are. I've got a couple of other implementations and will have a play with seeing if the changes to code make any changes to performance. Mike. "Walter" <walter digitalmars.com> wrote in message news:b219t5$la2$1 digitaldaemon.com..."Mike Wynn" <mike.wynn l8night.co.uk> wrote in message news:b210qd$fqe$1 digitaldaemon.com...looks like we're running on similar hardware time to find out what a C version can do.When comparing to C, use DMC++. The reason is that DMD and DMC++ share the optimizer and back end code generator, so you really are comparing the languages rather than the back ends.
Feb 07 2003
In reality, you shouldn't see much difference in that code between much with objects, strings, etc. Those languages all treat integer math about the same.
Feb 07 2003
"Mike Wynn" <mike.wynn l8night.co.uk> wrote in message news:b1vlms$2o31$1 digitaldaemon.com...I've been testing some crypto code, basic port of some Java crypto to D (the C versions are all macro'ed).Could you post/email the C version please, just so I'm using the same code? Thanks!
Feb 09 2003