From 668e1e2f14db879f7cc5e2300839c640df920fcd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jindra=20Pet=C5=99=C3=ADk?= Date: Thu, 5 Nov 2015 06:20:43 +0100 Subject: [PATCH] Debugger stub - TODO --- build.properties | 2 +- lib/flashdebugger.jar | Bin 0 -> 211376 bytes .../src/com/jpexs/decompiler/flash/SWF.java | 4 +- .../decompiler/flash/abc/ScriptPack.java | 18 ++- .../flash/abc/types/MethodBody.java | 4 + nbproject/project.xml | 2 +- .../console/CommandLineArgumentParser.java | 2 +- .../decompiler/flash/gui/DebuggerHandler.java | 104 ++++++++++++++++++ src/com/jpexs/decompiler/flash/gui/Main.java | 31 +++++- .../jpexs/decompiler/flash/gui/MainPanel.java | 27 +++++ .../gui/editor/LineMarkedEditorPane.java | 22 +++- 11 files changed, 204 insertions(+), 12 deletions(-) create mode 100644 lib/flashdebugger.jar create mode 100644 src/com/jpexs/decompiler/flash/gui/DebuggerHandler.java diff --git a/build.properties b/build.properties index 77faf1f8f..5540c2fa3 100644 --- a/build.properties +++ b/build.properties @@ -1,5 +1,5 @@ # ---- Run parameters -run.params = +run.params = # ------------------------ diff --git a/lib/flashdebugger.jar b/lib/flashdebugger.jar new file mode 100644 index 0000000000000000000000000000000000000000..8e55110903fcd22ad4bbd1444e044968d501bb39 GIT binary patch literal 211376 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≧c2SWCxo~-JvT&@)+;EW6JoK3+M^_Q<1A-6yDRKdUv zhht`87OP+P+ANF|SDn>ioH2={ajYe8{U`_4RhEimbIyTbup<9-d(vGwI(#zHpFyH;Op8FRu6VbT8kSn1Rr^9Sd8bx@ibWP1?W9%Wi>Hs&FD_1aGyIFy-3x| zce^@M*yMhIC)KLMn>1%^0t`8SnPwVNWe5JbBM6#7)@>;VE0Gc%~D?j1eJo>pOX!3$DU?Y$tLh7$N}E=C<8`GS;WgTB5R#q(%h zjd6aSO9_@?CRQDLK~lU5p3AervDpL_x`j55=kdER^O|s6DqleN;gn3$M+|tTydYC~ z#7YATjTdA(;Tak}3zx%gmrA>;iM=kt+$xT$RWUB3N8{nT9DmePvD%r7KjDQa5MCgw zQGH)WM}B}WKZLUHF-FIBj?&t};$uB~<(DKABZ;&ZlMeNtpu&LuhW(0!&DVuU;Cjh@<6R@XS0sMPrZ5b*=Gk&cZ|^|_=-c1Fl;zm`edmbN7MQQ!~Z01 zus;RTo`T@N2;THTv|k3LKMm3R3^_heDPN$RFHzDLLEk?o=P%p-Q0?*c;Mtq$g(7fm z6Luko!LqZ-Niix8p4^M2$YC(*ah{&1>;i>x1_z&}zrr3=y6AF4U)6qpeNK4oVr!7$@o4PthPt$IV?7jZ&yQf+P2H9+3yR zo!gK)uTRcDAxobV3`7`o7Xags$e+}cDbztb{H}A*zS01W3v1%lm2tefuiA-&cAWx} zHHGv<;mf2~3B2tC9h4b>yx@;>eaoFUGL4fO4l=| zcG!Cx!%q?QM&>-dd(2pOLN(mvvWbBq7&2f+!0`MklgQtb!`GPMzfL!N1LKBoLXWo&?cfJi7_($g4?~up$$>qDukKbd``6rt91KX9V<-Udi@FKBsay()?Q0LKdy6w+^ zB=8HmO$h)e&dTpqGYVs!M?87y6`88=e?^K;LpidVS~=-a8Ffl(ccnHQmyIvmxC#pDhk{Bq<+`Z z_+v7vqOc-<_0qy)r~j#X@`4kx=~-&#;NuKG{*4lT$R_%an4o_Qar+4r{b$tg=g{_F zV6gC?w(Y78yqvE-3!*C3Y6#j{1Ui0>IL@oV%z@=OHJ{2{@CAl}lE`@s1x0r^aic&! z7PWX^Ej`|?W=v}Tf;K~z-cPq?B#uJ2Cm3%z_6c=oJx27%=y5sfNxKyZJ;RQBqCyE~%#Omu9=s zX}EH@fSF*+t#Y4cN-GIUBRK=%Lu8em3pD0q#AG|b(fzMdyT50sxZ+y}6u&DABB!y7 zDUX>gNi*jUR)wzvKIB9ctq^#Ks_4{wo}zf4T(&Z}Ul`ogLRsT=?k}Bi-IUVO>#m+$ znz-)jNmt+bQPRci^l!~T%sjMtB__Wf}AXqr9bV3kR z4;Aq=o|k zR@heQxXq4M4XKR|@&!h=wyyvhS!3H5hdwT{?JESuXWI4^McNmGDk>cR8EkZ#M>Dwd zm#cYn%e!WtH)f28{uc6fNI7c1C19@Fk$gT$CEk&ccP8Y4ggls#hZ6FxguFW;4=3c2 zguEvqk0#{333)6bk0<1bguE{y@5h)kAsv=VY{9?-@LoAcI(9|gNUkT zWJDsPa&=zhQ+(IFcJr3H-D@}2);9%-6DnFQIl#%VdT=t*A~qB2b!5{e{(&`JxWQ`a z)Od|E`l%}*jEZTL6V8QE1<2tJG0%nJ3h?VY&SMc>5A z!!@=@W4ESt7of8>9VYhJ+Bjf$62h2-e&@=q>&&Ds20XTct-U#4C$(@E<(UjQLwwAE zhOW+ixvlXv{r1it=SVkOt5L32t!&QV;VrDgXaq9{E^TZGpT}rweQ3)C2z#Ze1GPsE zZef9+`=(6uRl!!zA;frLJ}HGMo^jiIt=Dq}OF26+2b#LN54Lnzx3aUpzpFDHzL^-jSl$W=2ws-krptFLGkT4>Se(gQoth3bk%RUEKj)n4e0#+Myv-rvHm zRWz<5Cr;%-VegJbK6YRWCr|fo>e`b{qP@%+8xyl5rva~Y>F(Sw#vybA!LRQ~H}6j) zrQUN5yBJ~4Xz^AYSl@DJ3rATagF1Zh;PvhU&3l5w_?9;GLINz*=t@NkZB}z<%b}kA zU75@#Migk=uKa5{qNI9gjg5Zv7PehQXWAIn&(?p`08yIX+R@U}lW~!RXL3BV8; zO@{sfM%M{MW(F(a%n0QJH!KObu}C!o!b_BE6XHQT#E=Rq8RO9oC;&yCe4iOLMQ*r2 zFS8>Asd~ouB`MWC>!k~7iO2=_=zX0ly)DBZf>9=9F&I_#R);jU@ZKs1ZEYhpMIyBE}d=a`Nr zNpt(bLmk$SSbVzZVZ|ydszfAK&77`B)5TyVD_JpQpBM71hZKkJ_4{)o&*$=dUgY_F zo|i_Rm+`zj@_Yf$HIe5PJg@&|*GHZ=@Vqhd zT+j2S$g^`4m2F=m@0%j;H}kwD@_Y%;TO-fTuTwVtcHZxZyw~H*E{!}Z{B}j26@HgR zo)vzVN1hdaS45r_epg1G6@FJmo)vz(BhL!It0T_}zm~|e!f#LHS>e|jc~BzIfZ*SyT;kPgHtnk|(c~Hbeg`7Y3crrX^Ff|FBhOttABsF*%X4?+ zxrgW8$n#;Ik3^o2@_b$7`FfUaMkzJdn-~#`xT~-vavr*x@H(@O@zz||iBk*RUIxsp z?qvw~H?oVNqSZT*y4cKOZ)XjIM8d3@de_suGG}wqKefSDPiuGcdmFz8`MrnV`}pYs zSXYIg2h?`1&)2#Jr zOs!7~FvC8PigSG~Rmk<3R1w!FQy$kRQVFh)q>8ydkVE~% zJ(3#3^-!vm>out|u5GCl*Q-+HTrW+H<+?Rh!L=bZj_dl=c&@8c6S&r-D!HDQn#grw zY7*BusmWYtq^5A4d`hOWc`z+i)hE-De#}TA=AVwFzX?Ne6?0XA*eGHMeGYlR8_1^`0KLSd>7qoo>RQ&+x_#`O!6lnGgsP%Es={e+SFCg?d0qUFr zU0!0f`5CmFJ`ZaAIX&}b(BZEs?QiMtzn5EC>)*yY^o^{d?_h=cCS-1J#tp&U^6$9d z`6(`Veu4P*zv#*TMIP{ftZiRmrT#m45IlMa%h`7$fO#0<%X_eseAJBL+~AZvj#d8q z5Q@CtOp*^`-u@voU5=TV@?j(uPn*?XfI0%Q;u5ol(sUOLJfck9{kjY3=)Dl_0?JnR zJJWtEHzjHjA{P`6`S+?!P$_e`L8iE_N02J6ClJ@2&8CF{+4;J0=>A*;-4nsqo!eSN zWRbhH{+nxlKH(zr(%-O4>kU~q>gqtg-_p9wlQACR4;fY8v}5zdb-OpzZQG{nS~ZZ! zUB(trSyrKCwGGXi^)uG8^$qK`)-~x1)}pC(o13=T7wfk-t=(3SS%$u0oR-_KG0AA& zy|KP-Ywgyx8+Yj|7LvJKUH`f&cQ713(eL{~_zBjuXzyt?AVW$UV70Wm(3eW&9@*yv z&&84FB+n(0XSKKmA~x;l+^+DJPx;YPi$(Ou|DmNE1GL3*JHz}eDbJf##pt|Vq!+d0 zNdmt$`mk0n>xxaCS+AiD8oJ0H3Rw~y3OOn`6mpE-8}x`v?u|*-uiTrGtZ=wwH-a^Il`Typ0a$=Q0pRIQ`9?@G!%yiw#uoUeC|nOvs#tMzD0?k!0~r`-1hhg-G=hg-I(sTA>P zJ=c=^-lWv&eP0q0D|Zf}tk-*c66qHAYxHypy0_v@2# zK<_ss<)Gd<`6 zi#ZQyHVvyGqWAacd_eCX)NekNG*6mi8v1bI>EJJ6p3-8U*2_oq@{DIbnlK+r%E!%pdii)#k8$wK za|wft?QQ0H&mdv@qUrO@@gx$q6UFkPIq8{CCCn+$yqJ`i%%ACaH?d?aQqO%WD!4jL;AUebqm;-cYWj0NUN1=J)_Bqd;wE zgieU9Giaykz4HvJ-k7Adw5g1eqS}t43a+vYLg%n})>n!Vwie8iHo|3SGuL;ltT}qr zsvr$()$gnz3cAz1AhIW4wnzDST7tDo9H|ncs-bJ*aCJO{C}ma#vm^4>y3W=v)vt}( ztHk%TsAcH1%=ej*kfU!2Rf6y!3SkB8L_Y(hN5#zK?H#J=$QX56aM;pWDMY)A-FhbL zrCc4fVHD6p>nlc;En{nXpPEy48)+U{8N(d|8Y!fR12B-_)8$>R^=%_7W}p-;zs3az zMGm?H;m(H)kh8W|l}q=&-ddqKIJ87D0*`{uz4Y?*NVA-54cF>OZ=?97s_F4Id;Fc+ z`NsFypa%_C(K76u%fl)~BJfgmTGZfWqKocDbgG*DJ?UtkUJHtiZF;=2%?B^{8ggZ0 zz7R?3gf*J4drR&GU3v;;CNQMU14O_Fddxf9@QsK9BJteM%`I?^=K05^wCCp;-o@H4xMIM^350JOFsMJU&{ZWwe3z&shRzGUI#N- zryT4pHFAKs@T=rd_6n%(ByopXa~pktqq$w>*BRIF3KM%GA9}3ad4xBLx4qf*MUg+HYYM< z;m}8Ts$Tx1FCuQji$I-uft3urCRdXtS8{*j|vt` zx29Wq^sw-JQ5)c635IF}WGinZb%$W(KNgTGSa&;H&>zY_mF+i8iqcX3P@qBKnRxjZ zwU#3b*9S)&=8uT(R7oRi@*H+sP*%XeDzh@^+13@xUGkrx*0guFbYH*uQ2w(_;9_7c zYg?5NScI{XkKfK8Q|ktMg3n zc-cX+(51yUeDfvwg|FVa37Nl$n!jaTR`}-2x`_BOj=N-vRXB*s^rDgs-~6TdD>fXm zS_y&JkM$(qZQi>^RjGP1wV}N2>gmHBw%JzI(~E8qo&vva{+e~t_HFAIEceadn6DU_ z8J0Vo#3g6{!pU%a^S37Mvq$zNAI)N#`dfL`$J-gc4F5xZF`UANndzIqGhfxq-%|-q zR%TN9AD+u@M?~LZUDsh`H@^9r`8x8TEPMuC+56@j=9@lBhk*bw-b#+yZjg3`pRU0?f96VUl(^EBjL*usD zH&k8E-zwjH-~6*@e&8EWV7Q&4aO^j_l^AP!UH5ApNaie92N5Uu=HJW@(T~fvS7n0Q zzd!QLznj_E_z#K32p&{OP}Cc&&d+=bo#y*vpFL~(dX5?6o1d7U`evzFHX;uM!>vO@ zC}btiIh`CXEJCx$f!@7FcpPOQn^r*|<3WurkzqvLu7!q}*4}bxqt=La7($M0Z@4kC zVxS@qf|!!tu8g#jZulb|>sEq`xSq5d9YfTA9r7nDG1?5@RWWB>w6-oGwJpmwDx-fk zZcdJdT@cU5NhbL2-X6Ce9@G$6)$Q6<3Z`W$a4p;q?{Ngm$hbKw%*&P;0Fq9!?SWnm z4d$pcF5*5w#}lRQLypyckkC+PDCVn27&urd-rj`wIm~haW8)x|s*kk7;cxV0+Mr#L zZ-N+mL}=#FzZ@6_xy-#xrelurJX=p5v`~*{(H&qt*hHP#|D`oo`76RPG#BD3qOxJN z)6m^!L|*o;h7)S08rSKH^r}tr08eT+vlzQdqXwO^>IE2jVQLxQwE#m=Z+a@;Pmucq?}<*?+%hnJG<7M*k3wZ;%Vqu%tpszk@TQH;ml5SQ~KLz@ax}V zG%CJEEi|Mp(w*_ewoL`J>ATni*c!&w-hv(ag1wVejYbMC*9|@bs{z4ye$)A(&W62# zn2Y$;^K0gJCBJ?AuH}dEh`Ey=`Znfaejnh6o{c%q?=$?+uQ6Ze_fP!Lt1?{|O` zeVSMqze)Vg=C_C+8Yr=~{2KY~OJ5aM(f;+hCyt3_xFAq9kiiNLR~g=h|sk*)J>?z zhI$DdwxJ`0j@r<5gs!)t8wlNKLpKq6gALtGD8wNhVp!k^$7`(QdIUYC>&y(f0n4PD zu;;nitd?8NCb`{glRL~+?C$T!O;WeqV{VeS;GgC`bHChg9+7vL56T1PW9UGgKnLox z@`(8>^q;ZU7{)NMlsp}qEYHMd$;V=g<=I$`JQrIh&&Qgi zFLtS%i0zS2#X980*b#XtcB_0kc8`2E_JDjohEZ$m!}6urbMocbi}F{oFUsG<{#O1r z_HFrU>|f<;v0unHV!xJe6~yG*1-Q~F7$@H=sFLp&RLc(v&Xa#FSS3F!*eL&AuvLCi za0S+dN~fwEwXxJmfw9+8Cmn@*Ep>{a1%|GZtoW^&Q2d(zAa386e|97e9avTV!R3J^ zyVzP4ILZs@fGlcfSX(;O%*N0yT1lsdSQ-#h13~{mkXM5vm+GH-a>0v<<8n*?Tz(0e z{#CZAFfewFEEo#qM?`RbBrln!G(bLC+POU-7w$&jF6rK!xADW zB&#~-8mwmguA8jtobe)El*n`uYos9km3&=58g=`f14uOtoOE?IJ6F{bl+%3l;zmWP zIzGrY0Y-!{@&XtcOk@8mDC(^grPF&k=D3Yo944B#bI5MIX}%u66Gw}z6x~KQ;++*@ z87eyEGRlmj$gyZ{jkm>C^DQ$W==VRi?&TSzDM#~B&1K_M<(F_IZhVYYXBeewO#Cb0 z@qenC`fDatU3&#pJHVGZ=TCv7xWjwGDk9$YQGF;)xTiZmTCCj`t=uGFF`3Fu;rOMg zsEbwE%7tDzLOh-l;IR%=oLY=h*B~rbgM$B>92F)Posu`9ar$Np7w~r1%EzQ+K8J1G zb?o$iOo~0BHqCeMO5Jl@?tOWF>Mecp)@Pee$=h}T!uyZQ+ZBHEP^mu$4OCY}%L$oT zRB<-u#B(^ps2a_+d1$3A#Ml2Kw9gi2V0kV$_TQkr;=x4$EX&ZI{EmfXLY867dpdyS zWQqTd@!}a`$^(!pxfs3PGc07m;}Em53e3;TJF&~m9QJXBzIurj6qOJO&@qlpWi zCI2W+uNX8jVt^oVzcKO7{)Jx@NuL=L=*EU55Dt!<_+_b;tM$4_LK6-qqz;Lo;8lQ7 z(Fl6SaDSjr9_(NB4K|0+AAg7=A+0l}*d&9zI-nhj8CB%;(5mWrr{rBA$h%Vy_sJuZ z`{X@+^5~R;K6!7p1ZU%XF~p?7mZHOi^qIj?m7%Crri89lMzIk$K zvLg9NaI)SBITpO?a>*-`!SimlLjUlxH)qlKE}cYST6H3Q3WpQp{1h-MvV!h z5~;`CXAjhPm0s#2ee%r1vbWMJUEL=iU0Pb{)s$6~#y%*cD!qb=(mwfEP1z~=_^#Bm z$K?}fxu+`2`sBHq^2+ir%Dl?*KKW$v0}spe(vnpnLcIV&ReGAVj}U03Cq5R|l#lZZ zPRNOx#3?zsYh3cUe2OC@N7IlZD7J^M1i2}XCT3clX=1cJa6-?!BR83o8B3tE7vq#=+(lCyDqe9_|SaFTy5S(9p7VaHV>Oy&13jTeB8X#Ji+yS=KbbF<|$N2Uo^)M zkbcIvLS-Kl3?|P}azu~dV+^8Ni<0v=CesoO6e?hAs$EKONgc6d9>Gbzicuk#!Ps;Su5V<7mfM@1;X1-DC zw}60#(Wr&~_=CUX18AjZ7MkCPug9{kHm^u>%&Sr!U&{fbqvLCh#_Dy9S{AW=JRWrm`E};m?fE6E;>aP_n+dvXQ^@S{90+w z!6Aa9@k^+H&Q#vivGVC#?&_cX2a)9JLE)!-T4~PDBtI`mo}6kuH4Ku&42 zv<)h-hvKyYl`vVKRVJ$}^=AY>*C(HUSdXjb#Lkf0vR<56rj0Q_1zUfHqW&*z=57|P z3~`1EavBKPYai1~;~DZbner|P%JY?IeSsnho{49Ra8ucT!!7*}!{C>Z?EOskzF85? zUOPh+Q!4gC^9J-|=T^KH_4B}oxKkIO zI7AgTsZYuR_6%q?D&2$mA}_Y>a2o0^>{QZ+%F^n-yTSwg^hrY$?)Ge4p01iDwk#(& zXZbZmx`8rwZADZ^HnYi))f0EV1`@UatMOiNNKfN&y`;y<3{^|EFUUQv4w1Qa;Kl^C z)|IUU+Iv@7&3st03ig^kdC12c^W8pP%4onAsrO|*Y=_Jlk~a4v%)?bU{4~0GIBbBNF6dV>0;)NHS!hf)lwE_AM^2xvv5Q)h+;|g8D>!HmtCAC)sV*_;jYUDyBjY#xQ$o+zetW5%SG| zl{lMl3|~@4vEGJ3Z0>O#65K5waUabWU?11TJpC*0b(*cS`&jr}i|Mvifo@mDU%;UI zloYX)$DwIr!Ap;cI;2Z1=o6MZdNg$jhqIrMQP06fsyoLqdhp&XGG79BU0@lCg;ZNW z;5hygig`1dg2(Y@I^v&M_(WKUz-Eb@&ykEv@lbF9vFc{8kmoXf%DPcC-Y?~@p=C4$ zwwDlt-7;l$f|D#tt08v03eR8{Jz3$&NcqfCd5qPz-Jz zw8vEftG&E|t7bMpxSew1BF)u_$Q$UM#!US+Hq04o&j9FpN~{9iD8UMD>Gfjkw z$hQ(7lrzXB3OUGb(7vnqMv-tr^*mZQ?iT#*5-P32(VKn9*4pyrxTQ#9TR$FgkM@${ zg66>$)a3>z|rAE4{x+($$8*Ug%d(V+ZI0akYR$Ru5qI> zKytO}<@qQC;V?ArI%;=)22iZ6GJqPJso&U4{l-$iOS6D#w1A3MY!@CIT%SeP(J{9W z)*m)GOQb4(abkesfO-t|ZA6Tb?Pl9G4buW+<1d2^B<&O)zBk1fbM& zT=lOo{z;jp1)&4X)q%2_r&gX~(w4hmzUY?kFa0kP>Tebw49S#P)v*CbZ%@FETgnj{ zds5-C6_Z`ly$&B?{Z0v;(Qu|pu@sAFV-3N<UH)nZV!wKM4AF`2oM>E=dtrVBGlKV%06>NpN`FlXTZDW0NBl!);U;WCfNQP zxEvhPMt*2?JtHD2V?5mljqqi12K*ZoXEW-dfq;gA;CO2FM?$XjxcVj0PE<6Bfkc(y zUiNtm&t;M46whNL&lNn6k38#X)e|GnlX#v2PZQ=pjZi|W;7APwQ2jB3c>I;%92{mo z_DOZVtwZ1}uHg`gS=5ZNjL#+j{N@|RIM$d;s;%zF&7A`nw zG?1_5XV{w&3;v;1D@#H%XiTez)&&h6cOVt$FVEZDPkb{fw5<##lJQx&f*bUK?>-%n zTcAXkIM303ywGPMu+?XSXfi}*ewEgXI8ffoQRo8%IA_Z&U(ZzsYke?(vJdKW;be7Y z*&eIZPXId$Yv%9majtoZ>atEi>BPMmgO=ih>V6kV6jmegPMq%MPHksa10R%53?c+@ zv;J#TY^Ie;2iy<_HiQs%K?n2>BH!fc$-ZiaKOIKPOVzR-%x~3wJQ-b zlvJA+;5<{KUXaoDI!5(pOV!!Cr%JRw2M*|~N|b2FR96(~J7f}tZd%te&$09H*^t>u z5Z1}e$5W(&hEJqP(`eF6xWQ^_w3zEs7OyL)iPq087FP!Kqc)0Cw$3Xp;FL_Rw4l>@ ze5IlhWoSsjr(%+oicqv!Wf{tIXxo0tT~qE$l{HMXy0!vy>;9DZpT|#`;MM$;t#9DB zmEWcO^t-E4sfJ@xohs)#lRS>e)YMq66H*miQ>k%W{nU7_MX3o5^Az+2G*DPJDC@C^ zr^T$b&Y_v-vc_7<+ISgagc?@=EBIy=OPz}lB(7lH0d9DX3#Y#i0UR8ZNQmQ9i#^52IM_$+>~AG{qQgSWM2(Wp>`Pci)rGfClP_1l8Z@k|Y({5YBTymo0uD+aVH9%sjk1ui z*|sQE%il&PLKPghM&S;hbfQykmsyH3UyHl5N|@Yi`qAV!Ch}a$GfHcj{FUv{<0``P z#`0Vdc^*eCuvW5lnULG*a{rYVwJ`?tw}KCb?DSkq)?6#~enz&;(;=H(nPn-a!{|L zzOx?`9s1>K?3+fbojOM-_9vjP zD#8>9loQq>lPDd7=6GN~;g(xUbf@$23_BfEfh$5nUDxSfG03hWRSlIvDV1WWB34Ys z<|6O-|M{u^=M=9$mAdAMyrE%fKeTQ2WSO$BaJS>-0u4FtwnSEzAdhyeZ9-OC=GT*2 z{cMeHUBlRx$U4q(NK*0T`mkQ3H|S*}uJUA)roUJpmCYS?NL;{M^@5{Yk4emd^t8(Q zHdwT%Hy%AK6x1qi*7GZS4|l^a&xq`u=GXUuIp;kl*AZ?W+)OgfwR8vnK~q7zoQ8-B^B&TyH&S_Rx4fAX zEN@tX=mICD%NtfUMJJWL>yt$8+D18hx3-yUnQgbW(Jj?#-lz)u{2>3&1as78=BNvp zqx@=gXYJxft;w(@Q(M4HP%SJ{kI76eS$7`GPw0Vq74E3KGL0GM9(B1>U>6w9Qg8t? z-9l!xMF3(k4LgU$)wyu?=dqK;c|m;bX28us6@`7R1*Fg!a5JeE1BNAp*$q8S5-beP zft~j(7q9z>3gV@?GvimkTlnR1%!>L`W`9W9p3CtB?qB*%j4fUu@lhd9jZS|n60%a~ z<_q;<75l0BU?;}fgbI7gWNkv$>0O0Ab}IFBKEzqQM&fFYo%M6ICA~g9s#HOa3@wp2c}jT2P4twK`|NzBwzl2f4-{dg9vP z$rcZX!MPLHXeKUK>pbSIOM-c8E2_7seYLkC-$4IeI9n&6v*_j7%y9X-X$dMCo#5Dc^VvbOvlo}EWVbI@<3)L79P*!Z z_L`ha)cem*f1K&-XrQkMN2v19fz#Pwju3NvAil0SF5)m1L@0wmu%72SF_<%ywCR4I z&KgR)^%Ot7gEaOIu5iztHLivDD(T!X#H`ULUP>im&~ap9N!1sZuyU8`dI)Bb)j`}W}3M;kcDZSri|GgTC3nPTc;VFV?3Q;$^fV;^2B6W?mY8A z^Rz40AS%<}GCmmDJcFCDepAhLXmjXv!CWy}*G|Un5a@!CnZigzLK^j4T&D$t{(R_IM%i6szN1)WQW8XI!IvVFbN%P_+zfe&K=>@MpyoU zW;YhT1$z#)0|^E2ZVf1CG%)NOZ}{N#PK^cZG7Q`e+2+X}R6F`jkY$+(QqkDSZie0$ zSt6}g!`0VwwQ16vU`Cv-TOn<-H##HEz=TFd&#!9lO&{!G4rCF?Jc;<)lYPEw=hM)+ z`8z%fW=Cr2Gsds+IT@tGM-QjdM+xVUkJAd6igJsU{nvsBYV|{=(+L0=@zRqRf8D>hit{Q5U_!^giuYVqmOocffX#yevg4i8T^(lh`ndtH_ zBqPJG0GTt#Kpk~$6mB}}oEl?J)%nzIK7o3~>HhLeu4mi#ZnG)(S&tGPrdz&LUm?eJb}q>V z$7h2RikB6RE1dqoqq5%>Fj12&D;`&TLdutVdK$ib+vY z!H(R-lQPLI9LHBAqK^|Qi`}bng~^s>oE7~pH~A|VuCdGMg-rg7=*q=R>blEw4qb6B zlfNEQc0QB;GWLy@BXqm~eZd;UHY?ElTZO9KMGV{3obpqP4w#;?vlc7vb)3btp0k)X zaLD;aOxEf-duat*e##i=nN7ZB9GtG;5u~%{Q%W&;B;f|8BJ#ZhhGH3^1bHnB;vS?P zF77=nxK)#|n7yhF>f#jrz7lkuo(H~yZ8>GtzM}F~&}J3N_PQ=Epr$GzE;>!aU_@#? zS>sV-DZ|t)9-sL;4C2kN$=uKc#o@YKw&c7GhweMY(pP`W`Cv#=HOTUJtMx0{k1xR% zYOV4Z>o}oB<-DltqQX#&SUSR_lv_mxjbt&)k?fX9DVHs1!)j#6r_@jOFtkf zCGYc`GqXE0+RL0>t)&DzncbP$(K%<%ocZ7X&;JBJAf%Lu+xT%iKVHR;lU{L0LLsFQ z%A8{;jZo@`|xX-@oWF#-oBHE zb{;&kvma;kBWHK^MUVD$^DoNH-?ks>={tOKUvKvgB1X-H{wN_jedEN@l(6t~LqkL3 zEFz%{+~MF|y~c^W(cndZ{Hb3vq_B5tNi}LEq%GE@E0iS8tSL3b5M$XUlS9@sg{4ER zGHkiNM)iy!U&v6Z01EB^5~9X@U^u^A)JpwaJvf|z|D1mfCk2%FF+4$>Ye(TB9`YID za3v2Zqqv3OlroCC1wSZ8(2tO1CF{_#P|F|@d@SQf13w!1(Zmk`PEha17_|hFlx@sO zgo`9fd}`8#rO1ggWjob$kjgTtA=6VF4IlG>kLPm!Kmv0)h4LG-D8Dh0@*8t0zcHQi z8#5}uF{${@5?C1W8w){xGk${S@yz8n9yY$Ib7NiMllI0xkjFywYsvsfOR?zSeyM|l zX970BUkZo;=;NhIETGj>i3ROaGgU_3esCVrdqk&!->9Ly*)a01gjmoBv7nqr#|17Kq7^OJ!4csa zT176`Nws=4_tpTzh0f1)`J8>8p_!Q9tC7#c%Qkx%8(1JZc^S;b`E;V@(}{}g8U7VG zE1ah=6({6!Ykt36qpRIAE$h>oajxZbk8bkPK-20_qRV( zb{g$EGR%fvvCogVsRO(Mz63HMw?OvRk&w?o&WWuS1BZ!$jpzdgZ%A`~1mc;VRT!Q% zS6D&(e#J9@kr=d!rY@wo(7 zq~-{vXHpU%Qx z@0Pw=5B}D0e(s_&xWdZ}>~?tzEAa`dwVl~@9p7~KLU3$uI?T?3-S1#_LjX4*BLi2P zFS@w5(I+-BVkr_8#Di||GU@r0%ufac&8I!PfcESH(m(0>+`wz${w$zTd!N|Pze0)7 z0?`XkTtd!=#ENWEJXm^$rz92dNi#<14<_@C`TG>r&^Jr z_8*+;W+el(+(A+X*upp<86$*XAli|+9H4P664i_kf@js=$_E-T8za8LYcMBGZfF@6 zHLT+d2tw!(oT~BpB3!a4HZbP$e{RJW*AS=-)@Ne;bZCa2j0OaP4wTBeNlHk9dA>rxiy|)9v_sdVVYM*B!WS4%#sA z7}`XRasVUqD+^QlB056;7k>7LbqbH~>Yc_64@qsHu3zYL8|43ADavj|)Vke7f0 zUjG1c*RiUg?DF=&m(t}bw$O0|m6}Z(3`4i*+pG>3FTtCXiE!~fWj{E63GV?nja&zN zbwP(@xWy|PDeX1o;f-wOUJFp1b77lV&Vv>3)$pL*Csy*f8L@l35~dSBO(%ZZMqtlK z5b~A}zc(`7h{r^md7}Kt3|Y-xCrsF9Dt&1zO-ao5&LG{wKD?x&R*hK8d|${_aAJWi zH_E2~S*t=+^4tbx@m6V$^O$`>V}slD4f|kd)adfV8;0gLGk;1;TuR$tZi^;%2A-uR z;-n?TSbX7NaDV~_OQ8ak^_}v4^IO7Ol?wnHIq_I3F5e6f^Ksm2Y~xaH}o}; zuS5XlC#M)u2O-210otIynsI2g=$3-YprJZfLj=eN;VO{PTT*d`5CB;qm;Bo!6@3ND z(g^`>o&AKJaP8baB(rbglK~ z9P|v4#Y;%2mXbEraj)JdmgT~I(BM;)4pAr|c5uAp;Ut1WVA4xKz3}Ut^W%W-x}I^l zu9ZjYM9eO71-;NZxTM6YS}gbD#V9xOs&g7K>7XTeVH8<%YXh}*>c{eHr!%ko`qHD+ z2#%d*km>S;VIn1Q(@fwGIK*Y{Ep-G;7d~m9+b>@+xMSkditJJ#T|q_gDf&RNqfBc{ zWyXVYKP?3rVgxJm9%#&C)2z>cw-ezYEyb;%4|#Mi&nF>G8GqwEu|>81-Az#PoH4~0u1%GaD?26GvUyMQKY+p{>68? zMAG3hmRI0f;Icop8K+=QpU=%+aReHq!{-A@%s%d<#I216ED83B_J13#2$N1_~nElx3I zZa@tBk*ANSJ*^`s?DLGz|1j$W74xl$=kGWkJKdIn;8AZ}&}`hmE5RI-CgkmE5{uDpf_l0>Iu zdRy}32gS)?dqNIGZY2299(YkyiiitvJAi0%5JZDe+-@06K&CXj8+Ijz2_h2}HYC;k zuMBQ?E4W=9xLp~!9pWwX2^7K@$cp!gE+fE#Mlu|B;A`H)qJ?Mi?acZzYmgX@6gWbCu6YT+SWbDUy_Yi!p5iwk^X$xc z$#3pFp8~pqL0p0Z`-aaCJ5wZF8^@3vIRnNqUEXEfB#6San#iI|#+*eJ8Ru3#w?Bee zZ7%a>$Xs^*+6#wH!=B4+BUZOdo35O>zHn$Fl-BCaosreMF22}j4;6OY<#aFKN<&7n z%%fVrYf^g(vw8vNW@rJw?egD$|0mGBxS>3c)&lMy2oH}<^iNC`fD6-O zU(dZ|K4LrqKbHqhK4k{3_lg!?(VB-}00p@sp*qvxP(?Ci$z89tye)Hp^_?CsnO5RH z&v-j515BzzEMU}fxu{^QGIE`LjgfffQc=c}9ZCUMtMh_c20)NIL{)c+)tX}dY&70F zC2a_xT+5Vj2!L6HbxxD42gV3k_6&n8@&F)$Av+1b>^F?B@eL{}2Nxo!5-|x*Wg1jy z%QX!uwC7U9RB&%>+GaTxr=vhz`ZtFBD%Hcp5-V*n(lr|74Im*1hK zPVoNlnop}qq1a&Ea_-by+O8wI^Y3Q0kkB@%!=^sOo<)&*T zJ`oIub`0MI2r|cV&4`U{+4WJ4^-RdoDVSZ1%QQeo$Cp%`b!%bMGGRyizo8D#fI7VF zI;g`f=N~(;6Kswf^ZDG8-HWNaMm;macqfbqS1yNJTo`KM)!VZa)(kMxl1bKRP4!fRlON zE4Io)?zZ#^l&w>XJDCQ%R)nOB%@4@2JDD{hR}yqszVk=8qYr;WeSw-?xfzE9L z49Y8z#HvaaM6OuQ@_9_LXw`We{YY55%K$C9ATGvBUA-h;?H6~8*Z2Wl1BAoZir4wY z>&0bEgdept@6oE_omU4V?c{luZZHa(zXqU6b>p1-0X6s5dW+d7ak-|`Fh2c`1*`9- z>{Z%sNE;-fGk&m;%cgCbF&7!#XM^6Cae9Z0rIjW6HS3!+#U~7wnBT-G`__oWSsrtk z*vN0GZloS2M5f@KlYx zPFJR%5;{r%jg-d_1mi~GM}eDdnY%Fe`XeU@;T%DaWG<_6D>uS5Z@QJuy5vk|C59k6 z_Y@*m7T`$Y*N9wP45^~Hxm=VmaTnfY!ZQ;G!@z|kisM|*6@)DEr_E+Q??RkL_HIRX z_8l^VcRmt&Wd`rRcz6viu6iHPpqbx`I7XTIyWm)~RlmC65`SN?A!m{2&&2$y98~)) zz3G}*{IJNM!&V*>JJiVB!U{ZX6;a7J$qk5+WW8}> zZ5_e%-Gb1^lQ??@(Uqf!v$=$z$=3tw>dj)Sco=9@??DXa2LSN&F+eqb0u_d@0r=w? zBpZJQh?9Q@#L54K)}BXIlV1W+=T|^F;bS_4-a9dl^;k{WSRYH!emz18-V7W`!fG++ z`qzl+q-BhIM33ak`L%@D@?cz#qG$faE#m#eEoCU-sDPW35 zf!GMBt%SlI_@^%*he9#S7Auga&hH3J1kl8-+cK8l;2K;yI&JBTVW}sR&KU_pT(XHn z0Dq2-EvaRsPHZ-cUIGEm7JDSqOSgz_sP?Tj(dl1-9#2o4fz*V!7e5v?o&_bJl`bWp z=-3DrvfYoxztfL58PQL>#BM*{ydF(~BW>{@VTx%I2#(a!1uP&NDmTCx)nt@AV1fYD zn;d{D-?|OVtw6>z5so4n&*XtMpWsc*=u%0hW>6Aogeu<2(wzc9=BoNYy9*}vS+o2= z1bU(dEhv7a&>B@3RJ$$oU-k1gkTjCP<=|IM;8!N}L^0S%(J^u@a4&|~muzcpuDuVy ziIG%PcA|ipnm}ipp%J&>###{&wHzI-z#d^G2sZ&DC(n`FbB`GZq_fMx=NIC}mjJG> z2@zVnWo92BRlrUzfBwaPZR>zthucnE;C}t?8XY(QU2wc^mr>l6M-Jjy%_@T^$3D-? z?CU5k!{W{z8V-+7ur46pw~>Ikn<%Uy;`dN%Jtaqm-#S{P8rh3|cgGhn?PeFezcKG0 zRM19-5O83*RMH_oBK7i7g%f3%)0}K*{8DO{U@|JH$338{Wms5C9y})&T!+Xh7cCx^ z@$EIfSvZid6mAe}3NweJ7^UGEgJ^~c(xju_j~oapr8x2!k%*Aoa730#ToV*PwJ*vi zzI*qh*+`G%rV)Q*xh2Os9PlcfOMqO?w<3Z8-%=uiaU?8!&2L~}0ugM!Q5}##m_1&C zffX6aktnLf5=r~`fm#=+iNpy(wTlu~={bm*Nw~xkn01z8*3X9qCr9u~5J@736`GUV zb^52&p-6LGWwLCA>lh--!%SPW@C-pbn2vXQI!ai?gCB#mduVDdW()!XG==DEZ`0$6 z5#4Xp>xQk8@SAc8MJzP6Vu^`0=7&KN8JHAW+(t239tnFg>o>{D;IVKx)2DC*D}#9T zDt?^g#~mz1exu0Y=x9)C2wk$|t05-YEG-dU8;8%@(lFyQU9g6H&_bltLE2Iw-bCB* zKs>P)LSKR-iXa{cvy`@?1<+Fi#w0eD;v#JjUra8-%HuRxz`zIrM^*^WnhSC_HF&v+K ztOQT4%E?(D`q7-aPlDBRqbh=wPZVy`q*K0geR4Z@5?I6ZOoqS;hksj%29` zM}mBtgo^J{7^BB83}#-tZPSqQaNB9KpEMi=Hes?r3X^;g$!z@9qSXK!K?X3{z#vQp zQJoc@HI@x9N&qa^S_Cp!?Rx8`2~F3jD4%#?xoY{wxC0?A&=egBGfags zC1K{gC`p(=@JYqm@QNC{h0*)oMjYrMvUA1MTF zR*qAndXQbV_AGtq%c)X;p$t=iC6WRR%{B@!H0vn9&-a7Tai}D1a@l_-t`Q_SDm47z;?Ilx^eSq^R;yOS$6PZ5YBAnrLt-8 zg*~I@6H2DSFC<8w1Tsbx1>7=?!-L>SaGU^qf~X< z5PWH8+U(vcqfb9p_&Qea+u(ffKAFCS>?OLdJnJUbeiW(ow@|iafGR>p9WsQsI z;J+(qOjpmKv=S&_(kghV6qW|5W*OcV<-;O%B*-x#j@`hNI*bG~t(ryxngx`RV5ub8 zB#26>XVbSBMuJih#LZGg01@;v?ukUrBaO6HLqQ1)1#D3n3QCO@S*AzTYTzDm>qzd& z0Mrd^kjEGYqK^s~MP(GXSMBHFSNfLoL8halr9McYW#Zm(B=vSmw&dVnFZ&M68{A0h z^w#Wl#1KxQXBo*p+F(#IdfqZb$<}C6GIjGaPS0#4tUN-(j7O7i0evoS+5PEHB6NnE1}vCCws(#qvO7GLXaKQT zMeGs5SXIVExlsD|*W@$IloHT-pQ?)qkq5zgr7~ELL3=0(kx$D8qQiJ?H>zDHG(&6z z2^m(RSaL(ek}3XssrW=n1ZC14?;3B+Il1W*rD4c0kdhMQTuqIXN3Yp*Wnl6d{iw1w zNU)u05?v?k`FoOJcid`@TG@8#f;#5a%0~AD+F?)W*P+>H5 zs=I|La}J1h2NceXpqCgp^3L>D1P0tV}RpEkxhy1k~n~8`MLAN2)_2+Hl*PH8~YI_trl6UQtb< z4w7ThQ=<53QNjrL9MrJ-7o{1qOKad^8MNE^(2$ox= zBu8!G04$4Cyx7RH z5dLAYOH&d3^Y(8nOabHRKxm@>(&#|Y88GJ><7r;Hd^@Go2=`>eyg!hQbX7Q;guoZy zY}H-_1HOjGGO^EizAw=V8@O!FZ~L6UvH)kpjk3&%)=AUV*2Gn-1@rJg)$< z9lQ^!v#ONIN|-A9(I-~0Vi#OPNC-x)Odc@zQTmVIAmWv)8B(`~AM|h~G?0{=%DZp; z!cY(Jmy!2B~%V*ZW zXxfCEXhyp&Fa#`@eJYDEGZWb-ucQYG1_12Qn!)q|`lYg7!k^6XihB61z1ZdW7!=?U zO?K-*7yYS{&EB(F(eH{FW;~r z=hA|lPuD6e#|bH44R|JO!Z8csW!;rAD(E`qUCqsmlfd{sbVR`$&o7zhsfLB)WCAzJ z_ClmG;hQT31T0@`jWh*<*v;oLZMJSB;Z^^BtX@g!s{IHKL7GFipGXE?8jPi_Sc~$d z>{d_BZ*I%~NyBCC4as*2E4s+y#@HVi!wM>pehi5zgA?HRW0MG*ToZ5 zol&n2q#_@0oq#2=3PeKr;7JrzO$)lAm;ugjdgU4Sq$&U>r<>N2YuTkBp4mwJR&_7j z7aATg=w=n@W)0}3nTj-*q_Y6k)s&;24O;6A6Nz>{h$Km(B9K**7~>H4pp3lSi`E%t ziZ>nZJLG)|Q3--y__!#Nrd^bcds-CF5yzsvDYtza=BZuwqDX(G(MufCn*FA?f2agx zm0JfobLpW)9B1JC%urT;V!WIj`MPI}z`6!4lQT4n=_^v=)kB!$_gWA{PkW#YB46PXZ9JfnkUs)66iRb3HD(mw;|J&x0-6)V zlOuD$>Ltq_3lQlxrpBBho1trGyJebY7u|ug-7>bMbf!kEHB{wwz!U(TkzPt^AguIb z-5@yD%hV_dc?L70B0Fx~@0O8Jtn2av`v7fk2B@E&c`$8SV+;AQVW;5nrKU-z;ah`% zM{A)PM-sCj34<~Ql8o8aTa}{Y&McU1Hw(H~ZwC$Os~YNUfiw%!`v$m5soxewz{{Na zZ3*<-Dw}>=9no*ABl>N%MZe_@HrNe)eZyaR@fHN1b6cw+EQLb@!SV6KfzuAz$h9jD zFkR_|(4^#wbB(`<^25drV*O65FAe~T(Z&t>;TGL6`iHaH8&`!@9Mc=O6kJLe#+Vem zagUGu_?w@H*@W9B_lxyV@OlwdX34hQj4y2C*Ngl#nZ?XOD z104NEi$SkvbRvkvq*)Qg?408CdG<6!F`Iy3T5-(IJ4wpn9dXQMjh5#-O`*)rG2IAd z4yP;sEM?z#L$|b89M!J8|g~|1{HAY=)wmp3%4?O-kGsi#2p( zRv8}vg`Q6t`0mJE+b?uU$)Pk;;3uBg%BXU1<(#WLeJ7D1V!W(X8c zqZ_Lqa;s9*V(DpYaH=1&6~P(85PhrQEo9^LKGs50%aVIbK_huz^*Hi~Wp+L7(#?0S z^MSB&TaOF0R#r@NQ%2&jk#u6UFlES!v|5iu8E)=$70zkZ0#P1UQ6=NqB=ZS6k~X4t zBzrXWsub46jeu;h{jR3Hcoh>Fv&-abdHr)dyr48056IqA`sB1>Z zO9kFxE0Fi>pfBqFXP49yp)bb6(WEcFMm5clX3`-rs`FPAfpO}Ovy^HSS17U(FO9>8 zxX-lHI39e%?KStq7ROB^N;D?DI125EdK1Fj=ds8S;@NyG@l&dR1G;=-BM&zD#AbeP z@rkYc?)Hgo{NC$UT1dTYzvz|d zg6f%pUM*q;5ct#x(2qla^2kFzE*#eI&>oUs%RkVGQZ=bslK~dsM@2ATO3A_iS_;}L zF(}`n&*8bC_TlhI;1mmQ81Vw7GLCdEG@q#c=0VgYA(ht$b>Metck`Rr5*<)qWA9`-`!U;z24(mCBgX4jTa8XKIK2 z(qP5GscL^5%9Dm0uN$VdLJ;3FM)wy*i|8R%mDTiQynn?LDm($-1vp=6hW+z`B4uA= z$IE1C7-H!yMU+J=3=7LK7c0V?c)$iySQmnwI7(pA7o_P6sis!1}8z9yal5GY_y+-kaO-K)M&}$&PI7gn;cvj0Oen6PXq$O}ng|r9j7*BMQY8y`m zbXnTiBGum9V!SwqG1CG^%Nxm)GLg}I_J~1aYe8c-fySDp z-(;jj@x#KK{g}v}6G@$7!%jue_Jh0>86uhe%&;&G=^ z^xO->gTa03b)vkJHy9iU4F-4NeI*Ot+th;!M$_-{j&#JXK|=FEb3h~^vLmPwbV#ub zl{mH#$0W^Wu`BB_9UycN6NM{Pe6OYWOT|x?fux)Kg!Q>8!Lz(oqiR2^3;YDd8pQqJ zCuQI#tVFGfTNMHl8=-fseQoR(n{}=NP#Q`e5$(KoZ4SNUl{rs|(x*h()1n->UpQ0D zGZm3DkBJ6eCL52Otb!d9(9x)-1Q*ZnU6ch{Tg$@Jyr6Hd#s=3K~Jwm z+w<}4R^rMkk0MsIhTOdV3F&WzK8}grk~c~Pu~o6IQf#`|8-8prv*DXoQf!}BiRZ3V?R zt32;pK&J~NXu^~T>5O>Z>z-No>r&7%Zkx5}*}l*~V8kp(GVU;hWW+yKYB76cNS5B9 zL7MCnFuSPId`Xq;BTOnKJG}5QA-C7Lr#trEUr}zdG?F(U{mmLbytOz$DF{y@M?76> zEDjKb=q`o$MEDk3AsF#P>q4otI8e;3#Sse0+oh+^eQWpEc7xJzTaOFeFQ)y$(aHXa zsqoxDY>ru@#2>9u!XQSbm(gGVI|t$yiC8a|*iB1D_O4cwbZFD{ZSX9eJg;CL@ zwAJ}6@N=a=Fa`B^w;@B;0n)9e3Z7`{<7tN^CN!F+mS^VFq48q+@d7CAb!u^v3j9JC zDSq=cj_S91M$nXDq)r(|(D}_RbDXjevc@EA6rr-CwojNYaYM}*YKsLfYCa5`RKo=* zmQuO7r{JRElpGm4P}u!TP$q5~Ij>kc$Xpr=h9@pLq#)QDO?Oba)g4r%0HKsSs3__V z%Ef&!E`XE@ZXq~>%2`mLh;_Kua%RYl9V#|)l0LX zav*g{j}ALmc_!>KWYA7Hkg`ELizU!)iJ?fA8s7Obl)|GGjz#1OQ2AbMSdq@r<3a-(>MtALc)U0!4O0Y^4)H%QXtuk6E0t;kPX_|7{E}v4AF)<`S-q4V z5YqAzNy|$WEhikQ8F0mVqKcOHgP4+#0wWZpmo6M3-eS=5RdC+qftZ&|Vvdk184ZBy zr83lNo)Ky_AE8w;TmU~5E9%a!R8baHuCxSASHTNX3qMFRd>|e0fN%(k%C9npz))9u zO0w|FDqOWv&JY8sJYtnyncsGQ=ktA_@Z9v2dGjslaFBVFYc^|b%~KfBowC+eiIwIf zQVQj^SPUGZah5^zOT=cM*urCYaS$3Xk8uGdj0-3c+xdaWfD(aVP1IsaAUrR0Pu{a9 zY}7qNR9#2=kId@qBI`=~j|?s;U2mcQ3q4I%#t zJ!Ih)vR-S-)EcIM$Y}j|MZjjjVHg{LG4&Z_{RSOZ6=SE1j+fw-6_7<^1R;)mz|WIbx0|r-f7V9-L7Qrc=X$AuRdLmhE0ciG)Q*06oxsFXprn{44Ms6UAz!9 zyHwI_2;7opqXxAtJQk$7P?2i(pg^#dI~+jLn26=L#T971%@P6IZ1hUUxfuc5j4K%d z8z*sm*#G>qUx!75n?_0K{yQgwBLim~6dEyBs`fK&5fN-!Xkxud)EUGI9tXhiC5U)QR5IFpg30{Q zi$tT$>NYU`y^Zn-fSgJjt3>&y6zsNYw9ze76{3LtH5f5ru3?qcl7IDrR#OJUzE1I| zdDa@!h2!cC+o>E3c-i?*QO=50G@ABU;&mau7@u^)XoC$ZL79Rb3q_l8 zxJO0+$?(%k#+m|5l%V|#Kdm#uPt8*ZKdl2bkaSOtE`G6T4#!$-I(nD1x2e0N$meWH&C2YuoYzx#dSFu#xZ#8G}9^NCydecUHb@cUMu zxQ%~zyH}j_iaS6{hgFFbdaPu^K>i@>y>AblA09oeNNnz1=Z^-%)1!fj$uI`hX+e$xNW2v|N>=2IfoZeZ zO2(C?GbNBUuko}o;vQ6t4{sjlgza63OxQbslA}^+eW8CK@*_Uz}Q%D6t}V5T46v4DB46A}!k;B>_lZ~W`xqDiFS~;Y4*{<@#k2^dAP*4S2@T|n!CdSG zxi`eU)7(45yQ?2?&M#Dxi`*_34Tm^#a(&O!@!)1#RXn) zF;`p?ug(*9i`V4Axc1t7@jCH(4)?NGya8``JW`s#MAHmvIj&|1G`HBo2Z$hu*V4)+ z_Bwvvm@0`T^GHslQ{pG?wGnmK7)g52qB)Y$f}qlpVzS$;v+#kTxED^R$I3F94Faj= z9;EMJA%n&AhbF@VM&!SPA;xEUWFc=PGVyvpg2~?mF{9B~Op$z$P9jae*)Q%BZ{an6 zNY107{iuh;e%|Uw)cIRt*JMwbh55zX!~=fucCpP5G5wGHD7%HdcX6x_ia+*?cZ-#N z@hALvh(A2ck4O0N9)7%+AAib^_i+Z^FaFFgKERJh#h=9%ApRe5#V`I}@fOUyUwn{B zwU7D5hs1}y;v@Y2bFcWQU;Ksmm|uKcd?KUDU7F76Ldp5BYx;@>4b17eh|1<^Ik2Tr zZ^?2@EZg*PDCC2G$f%ayA-rRDSxo8x=7N^> zp(5CqaS<=4x$G3kX~j8?KCrz!`DK8P+T!w#UmVdku;%6VK=&|dIO`D5iH z!aE1KtJzP8dFsRyV!qr#eXApvzG(Rm`P#f!wzO2Vy`aFcqxm7t&i&kVqF{$Zy|3O)I4rD_i-XtaI zok(ihg>3%au%_(6nI336dm%&b!-Vh0*#k%c?1iq?C(eq4NNhSJUIUPgdx5d>035}C z0zdJe;ffE7PG(h$ z;jCq1PgbiqCm-?Va~aKw5YSK`h&`(DKE1AaC!$o)4{UN6EQuSQ^dZw~QQu z@nAt#3C6q<%K(eOSRmZ%!5w7Db2sBYJfa}02KTZO_k95OeNcE`f{6u*RJ~r&hkVK` zT>BFE>|DzkFK#poAGGi|&%?}fDC@rk=Ckqz(f9(KbskI!-;cvm387e9jKQyP3fa5< z^}cU^2*xUIe1%+UhKIu_RN*k#ARc%L`&r81;5zQr`^2(bOkM+`pLqlt?Ex}unzg0!W{X-%erMMXUrQu;(vT(wwk6u41_gGK`Yr^GBk z+p4n;h~v;sGefzi1e2yrl3GNsh3kU0FuGl_kpd`r5NPF5G4?PQa$m1PjjCw~4x$uc z#p4@quyVF^MT3t}kT>U^|5%76Qfz019B3O|m^@DJ}+~ zr14hZ9cS1shzIs)@Sw4w21kfivn$scP(FT zMFV`Ij()3po?hlt;K)lba$Z5Gg!pg%OZYeQ+M;ozv+Mnao@PFPWN$cXTl%?#8A-Jq zML`<}0~3K2Bf-(rvY3nv252SlmX3C2bWT7PSQNE9QE9&F83=yG%g@C~`K=1VhV|v= zTf^6%uf70-=CKfUab(8NniZh0iCp#8m*Z;n*4N5R0QJ__N$(T;Q{Yx?d#~}<`$Oj}k<@W=k#vscwG2 zV6ZJdJ-|JoU{S%?NZ?X19C5bfOJ7MatXwNIZCf&iHRII6>FI`>8y>U<2vUhW-R7fC zMpKqhYJelq5BYZ|Z9leW0!Kp?gYtJUNDTf8%LBqs)dJN`bZCt+C^}D~5&1X!Aw1(_ zKmDD+ayr0Pwdl}w^N1((UZf_uOtpeIA@smEqnJ%LcX`wh0J_K61gc!IBJ)*5J|366 zf-(9g0*4-ux+8;$q)Cy)I_ZZ|B(V)-trowSK}ZZq`eTD6G76{~G*P8pN%Rmu8UJ z1`tn%eU=f|sg90yN-7B1VHSfKT*@K#7#v|99VggwpFpgV+MNqUUJ-GQM~Q5!p?Iyq zgs!#R`8;C`^cs<9x7msIJKplW?DZhn+%(j(V}Xe&F-M1FFcJJudEh%1DqT*9C}2Rz zXiy|dNetC;14Fgkz)&qW;{VGd@&6#!i2t8YPkcGu@Z|!ieeirI@Hy1N)D(f)^MytR zcd3y6x!6UKFc|a982`|zvpq2SB!X7W5UF>q_Q@%paYAo1-$U(F4?Y6fsriUNw{Ifz&26nwj|wLi^MoZnw8l7=j}E`r@;HjHir_*; z_uXog@=lO`tU^Zn{IHGGYts1HCuD%&8`anDI6pc1x0xohC|s-ePjOR zG3H%s!bu`@pZ1WK@yNkEek z@S;bP>F%5Xy6hU@TFvI*9Y@1k*O_|xkez} z!b+KIdBQ@Oml($;Wk#3_oA0-hXG9?>^1NJYVFM9D9FAsX`C)1Y$fcGbo>?NDB)BLw z`P<@<#ONXOq~(0H+aW6?87BjX3fxf$JTd@0Z_pnY*^F;IUU_VfULpff5O$2zd<%qp z61nMP0L3yP3k-m?zZ8)|U;yQc0g%j_41noaCIetn76-2KqByJv4F<3Q3}7u7KqVOf z2)kqe__pO{;TQ}6p0W7`2dILytvCRCOvC|Jf&;7v+2&{z2iQP!7> z61d3^$KxK1woyKFh~V=HqP?3+SyT>(SZQMp3&cG6GoL;FWFZe3A}Rs6>!>F{MKE%M zT@)a8JV7M3$K@xuMf1V!2k?5}bkL0P!R+<)M&>K6(9(p~mzA1picdLLt_3B)SI1cm zdwF5Lyilz@OhcSYr!Lc`qoC|a8375(fme!&3M86%mhziw0gv(AbpUAsc)Ft2D^VdmB~vaD-gSo-&~OcTCPZU4K7sH8kJsK0J24GoAJ-a)gzt&BzEFq3g7u-&XX*XR{oNiDG*kgTna2bQUkV zs?vM&fQ$O@iEYfvSvL6x)yRZ44+y`GNAi>N^$m0?t~k0mkLHz7+Z0lhXQnU18{#|@&x zNPyT!TT+xK$x09VsFWhP!B_;6?;vNDkV zgv!lrt^yYWF9R0?FN3Au$UkPgPF_|9x?cs;(qiy3_N91P4by&bgqEc#ioA@5yakev zP{Ug!IarOH9GIN&E2oE}ru__vkT`eF;AIVpmzf+4tgJl3$|~eu;l0;Hg<@qKq{+&1 z!OBX($`*p3ECVa!02M21hzzg+%!?K>rm*nYw1bsVpHj~!%F0$=RrWX{gP7CHUui6x zQZ}gQ#h?CF*&KLSu(`9Q887a(z`!|&9#xZzhg6-1!7cEz1_203#NHK&@Nd@>^(erl z#8cdusVuhwb}}mzlADrIe?O?doO>!Ge#lgF{dh5e8sWlTWVzqzA-DQ;5Aq+5JFH0VNQUMsXxO55pcjgPi$b|wN3H*7X%qC-C zCBrS*+-hu;GP9!1D1y^qX#%N$MiYR(f=J1#vFaVGKxd?zYHZPWEcdEv5zG@;suuYx zeFn&Pwu_5z7{0aRXCPkO*5U%!;^Ma9(Lnf8FG_nbCG+oo_snPU*PUVr(HWHZAof*T zZO~Pe_p-zupXkX2iBc)JRYnSKl{nxNy*%IN69@Ty$S3-F{SF=+W?RU|s$x1-74xyG z#4TO{oU#*^w>YP_?_>|ml?6aKLQ?%GfVV~_gCHFw)&>0WK>y+H1KW4@?&8TTI1=Sa z9(dG2cRvs2pivh5@|`kn5xXP7p$UaB7Bjjum%q#Y@G!!|r_UG{=gEEJhYSg*8YUC- znOWu2SL@Ndo)|Whsp_elGo+rgf~?(|jI7blVoqIBnYL4G@sk<)5lDVJ_=Bocwv2Hw zw~1Ftv%I;kAg(sh>JCf2xxR1;TBuC_jVvjgYc|eBmKM&n@LWM_O>~LjWGhe7G9v?T zI>kx9xI=&xpArLpM6bhm;@&)C-tzR2<1{jVr`H zjxyKegDKFQ&q^ta@EwWJ!!d-2JqR&^70`Ewn&20jY-wdf> z3r4gR(s(zd@NF0|lTS<`WL@NL*1>zxh4E~}Z+zyPaJQTBw`zi;5=7@!QO=%}i76^U zY{faGW7{Q&<9}2C+z%kmaAQ`EYYAd|U}R+1aH(uH=MV?wXuG5I)VbF#RXVp{`S$ zGm<%J#o92;LClWMMT4?!w3s2WVr_i)htqOseUMhs;>~)Z#R)f3L%eGuGuGvpLFsi# zMb4Wmh&6Vnd8 zIwe}DD{qxk+ir6>6Eol?OISr#r3**iLI}RhC6;c>9-_C*pbVF~XolgR4gxKy!an@o zQ)hz%6J1zfN?h|oaHC(13=@k{eq-^;Z>%`^ja4SUY0;zYkc^b21F@1U$7IS;pU@j{ z4MmSzv^{jO1+k|^G1HYx?2&j3a8NA18N!1pf!zXeg<=L228a(RMT`A!#FoIM%PzJA zR!J#h4%8u20$TxzqYV;RJ0!4`kia@HZL9DKcH*{I%kE7HOm$CrY88G}5*R1fgSH5% zv&4|VIKfH+;}k0ijFU|34JENsNY4KVg}VG1_lwl-nvHbdOof*7r>Q180M1omHzdDL5o+kIAB49fUG8PDA1EWg!X7l?cTyLI2P&D{f&z>!#(Phu7 zHu3d}R&g150s_h;M!uD~oEGdciILxYzoUj`ZQx6Wq$qa63`UckFrS(BXI0HZ*{~0T zNRi4GQlZZy@Ff*`5G>hx6WVd z@pm4v%ue%uQCiu421DYeWp0NmIx##t=|oYeqFbw+ZmkNhsPr-}E26+&cej>?CEC0l z5VTZuv&2CNwAY#)NZJu`Ma|c-f0|9`zVP~l8Eeexc;Z6Va6B!>;;glJjix%DeA4mc z^c5Aw@Dx*!78-bdNaoe9ZYehn^2; z@x(77eZlg%CksriW*$SCDECt`#mZ}RK2gcW0Zp($Y*c!X&5R^i0QD`Zp z=(84+u>`*%P}ESJmI5-H`Vzkl)k&U$>cnp)2XH2rfkdmAAr2@iKNLjdhv2ZiL$!T;N)Q-4zO72!sb6RCrd24;}6;&c@wjM0zL!;WB5-7RLhNpr zb*YX1i=MvhP?MtU;M0*E`WO80P49u+z-_(G!rdL5=$0-bXVr5gl1p74YJ6E#XvoE@ z4|xHOLs`tI)BqVNjev}_^9sO>lrfF6lrSTu(#Byg^*Q%^XmD}__RF~ncpW4%by9mk4ZQ_Y&xetU_5k%XAuyoUE(?Kf z2YW<%q{P(6*?BCLffEtHqxq_$u~C(yM(pqdx^EZLWPn!UqO{SJ2c=5~uCLKRpX!+6 zg^LghORxoK6)g*tESQ%@K4_LdX7OWnjJcOrn5F`T0S6^JhndioC46dX`ZZDT2{gkT zc~d4?25G^RNxHy}nR1b3aCmlkHzWqoDp5u2MB$SNDTsy}$ov##s9=LCP*znFf}s)j zxEw-5o9v)dHDYwY&<>`;WU*l`Mk$n3$$O_^g9Vu?q};`{d=HEpLJZ@WqDy_mhyl!h{r4vZ;>@iuQ7*$`HJEm2Agf=^XHg<#uhc>l5F9^3@nPw@tXfHS5HSz76?u=MDt} z<5MC7W|hRU-o3W|;K?B3=qwWg*!>}OK#N$>Tz!-venk9^A z4w2e<#3GVCG)%!I8;PU%%8>tJjn>LH@7yY`bm&D<%pz$esp+Fky@=*rClyx~iUvQ( zKG4vl1!Qg`pCH7NG6FJ6s|PZ3`8aW|Tw$&nXpIXaMvzXOH`^SU?rS~!r4oy9oka1-VgPk2#P;6m~0Z9khDTzHeGTqNT{wf-|G%LvhP`uy|AIXp^Zt>`+-QXmdDi z7=n>y`YGWjoLNNbQ1S+wDg~3K34%NAfSBzHmy97>7)eX)R#{W*5U%Kr5;B9sKe?pT~6Yh z!Qj}$nT*j`4R;Epi(R}?D}mML!KwLT+y$2<4lJ|b9whY-)4yZhaZ=*y@C|z#w^>laS1lANlB|H-lVqTa8Y1q{99SgPD>EjViDi(z{n`>D{;4b!j@8yVEV#ft&TAG z;+M~qrB2y~em^MN(C-;#8=4)I4dwr4Gg#jZ$_59YM)-63l&waGvc2>1AAM>OGIO}; zx=)Svqjo2NNR@~n$xy9LjMNMX ze|k0YPey{c}Pk>9SErgatEUSrof}Z+KtYUY|6?M z(3}Av$!maE$Sf0J@-VAZR-f6=sxtuV?jydPmXF39_KefpS0eVD#T*LlT}7fWCWUZH z)ZV9p(D6JS8lnQi1;)3d&`*Wm9--N%*;Hi+BH2d$qnW;1(=~LP26wf;Y87^Ktyja zua_J1TB5_ecJx30gz9R3a5>3(VCCj=cLf;_&OSPPuK-5wv>7LnBDt+&MaVJ{ZQ1 zL$;b#>$c0i^y9p(jI81LSi{bar2Jq_dS36EojaR)xvcF}B7axwEbd)nZ{2en7B)96 zLcA{&a)RW}ss*hQ(ub`50>8X=>S61x$V`V#C^bW z?j9M5l+_tO95T!AIEeCeCGex(2Vk1P-GSwtA-m}=_ar;P{ae*lO%DFDPv&2W_cOuN zB-K|PIsPp4frl=GFwGG62tH3Vv44kau9aYHx-{WNzCY|}4Ccj_{Rg1M$8NzaavuHC1Qsi|F1-aC z8bI~D;Nal^FoSLNPiED+)xhxX3rBA$Bg>b#&(=<+*eKkiFB`@ZAI*a*(pA3cX z$3o_|U1u>L3Z4($6@=0!6UWCwpkK}ujRNp-B| zUdfBSOlPsb@OA%ZL#Q{wZL9ubkH6AGKs#n+7=ps885EW!x_x3Bi%@OP2evY*m!c?z zPnD$D%F}yzVGl}}GLdQv&)m$qru%sHeio`ifr={Dw(1iHdG3&xg{>-C)2d1w@rt8f zam{TS!g0|(Fn~lTaLc0l^vqb*VRRttN-9YguEqLJYH3VNLrRbQqxhB=<+i@$S;nw z+*@AbDOl4(lcN)`9w8XZD{hsQw)iuuYtf1%OJ6mKlV%A7S(KnV91dLCH#|PUx)3OW zZmWvr7ek`eD^B~x88Pe^XT>>yAydk3lXZBF8TX?s^zE|ZLzdW}NyjaBtV_hF8FZmg z-q&?3)PN$+u=VvKaJDcSwlofGY<=qoXLz zfPzAaX4$l81K>Aub?$}X!QehcEoq8QRQLf4eb^{3Xx3ICRQ!TCa1(?s!J<<|zKA!W zszz922|Y%7oEcllV^$=Of+-wATw4}6U1J;stfz&SwHWVV(*tWUjFaEo?xP zgc(}cC~+tmJ=cVII|djE@h66Zxr?EN`A-Ue^RuGh_>-cLm24xsMJ!*i=qXYBv?%e2 zV>p_-Fmj|~580))ye;DnZvq%rE39lAQ1gMqP(T%3#xSUSu~rsuuM1bJDqCGBWWXw0 z9Aq1Ao`bx{7^FnUkb`8FBWuRXXuvsun=oSyI{`eg8Z4QmYgx9|?6fS>X<4MxG9zZ5 z=olal=!9{E${fhwYS6v+@jYvq{gqzw7bT1Z*=mxFZhDg#);tjyG7{E{$ zr~*-vwYlX*+$&Sm84bH0v#jb#@bN^|@Y1U)JyfBesufs+>o?*mkJw~~_o%pM;kPT` zsN%K<7if~!h_5P2V;wsAG~~h;1}_c(>;r^lJJo%_6f5Ryt<#<{|J4p%F)PNDSjDa1 zqx|^Vh|CdVPLj$V(OglPFJIhfUj>jr;^oY5OMek3;$XNdlZowzAu4bh4%BIu6ZEar zD7GazwOReDB@REF`sPUfcq4}%v@iV}`gJ-v^qzZvIdBiiE;p@wEM=WI7MK_~;~=&> zy#|O~9+-*(==BMJ?iP!cRGtZA#{V^mk3H3?Th-%lJ)$%HG*G$bXjHwkEKz=-fe7}*>tm0Zp` zKAQ;a57aw8a*$czuqoY67WuhJY$b><$^vc|J9N^jEQ6b2>Y5}$KNaHZGW9i0Dy?u$ zsKqEGU!vs^(U&m;^k-8lBbLo3xr?lEv0!8ms9lv+MpE>!@~ws$9wFkiZSpylYAu@jwkSLG#)HfwB^Ie3h`IB%P8KCft2P0CunFY%rEQ|qXk4vfu!8H{MPs~u0 z!V^*4r0`6#Wrqqiirt(+Hy~sJ#MZz?jb^?o63@1rB%Zb>wyQ{dxis_O5CoU?Luqd+ z$A1chyH|uH$wgqt^3L@R8c$H z-gt9S3f~c-@X@K^uPwL=rAh4+K5#ZSbPC*wn-&1pq2L989yw_Htn%?{z+9=D0Y#qv z^dO>28FS?fxp9vNr5ezsMf%hMOZvK|2t^mISI2YvxwiS67ta-f+j^{O*LITrcy(ah z0)S8=>GFw zGSG^MnhU58DC-Wu5C3PO04v9o-v<4me1RQMfLB5N>qH-`ahq!(nXSbGG2Lt{j42TC z`l-q@$sj=Lb+V{y|7_=X{~1^&+_W-Njkocxpph5p5Sli6S!o(UURXlvG&`}UA zY096Qc?NY&3uyx_5FMyB?nOoQs1EEMRvECMB48>RQg$^mSDm+QWh9!SiG({yMK+su z6j2}^C$?WQmDYLZNqI@Ns5i=&u3=%?+(zS3!fJ`S5`L_7Kqy<1o7NjuKHR6|I)^ml zd|}!Nzm1+J&}>04VxiNU)jF)TN)Ma$W`S)();o+2_XrD*0!)FvF__h^k$rOWyZra~1yDzmSNlY~SQ zq(?N^70uhf`d=Tt6OoqOv?_UF**!2psJRLi(@(klDhZ%x-)-TS9 z5hKXbeYHCK?anZREPMq=Sh^02oW@X0B?#V#uoTCXlu-{J{d*T-`2vI@IsitL8X70U zvd@UBEMrt<`883o*$AtQoLEC&bLHb=-XoOY7FA@+I7=w5ihF$B&8Rwi6@OvA@O&p|fW{zT6`% zyWK}xg5|`R5398GdlY7QlM*>%Oh{7EBlQ@|EorXZ85R>X?I=hhNYk-0c`^1&rDF1jyYX%1wDiD3r3N$!GWZkQCO%cNMSV^aLmmb)%@K?LQd zRqqn(HD^01zpe`+qq)HAat3;>Rl#10%*!;CHvnqd%(EUht?Jgse$!y|*i zFspW$W!Kk>4QSe^h6&n=&}JOB)|e=D2ys?E97I3!?~swaQ6O516Y>hwgFLG#a&?if{Ny%)#wH#3;9KFe)8zyY@n=u}6y0v^v;Fg)SJn*+3k zOz}Z1_&kPzXNh$_v7SX%Hbi5wD#a!qZ1xd6qf%`3iEe&x^NH;|zm^9(*Z`n6D#b2- z?B>TFuSDIjkZr3-n>S_*i85~X#HF!#c|#ed<{J4!pb+LfTE*a_dh~p6j0B=tOwn&n zM$ws4WSNyeKh)xoc<#uM686*+9lLUaJ!b;r9f$qmb zVZ6R+C6%g>^&GGtg&WF%Ylc>n8<4iDFfV@N5#yNjH0nXWQ<88Yb|(oV06RiNR5b95 ztch`7IA6&9B79sE#VXWbDY{W?ssVOklTGcG5#k(30|+$pjD&axy7%I{hC%NoPa?cZ z2EA8gM}okbtL8o-3KjccyH>XVVvxXtR^T?M$vZW_$q-aA#xakP#MX&ZV`#m3EB+0*Zl zjoXMZHdjD0?ZRQ#&TTXvFt|%R(12AsLYFa)8D=4=FoCoP`pe9S-3(DxfP6B#wh&S* zC2{UC%s5N#Q7vMUEW?dGP#XmD-jt#ciT}!1#FG(RR$~oYHsim{mh(WUYtULPej~vo z1`P9=sBWR`D!%zI2PqpeGgcveD{e%3S&tt*Vws&@{(q0|{D&rR0dBhVvj5J>;K&q= zfa$6o;33Xa1`7x1kw@cRt>jVj^?2FW2{34+`P7rqNJm+K?8eY2$fFFK-M}1SOV}*V zZzd*y7L7E_cIhnE2$!d+q@@5elrss6s4OQN1Iv=fNT&m7;=<= z`mpfkJtndtsLOcTIg&CfdOFQD0J0?=CHY+j@~h-|d-(1AIJWX8Nq?K|^!ICz^#9@z z%re|`O*3YVNk`s7A2JYVUg>1*Yh|SI(biJVOntz50o98K)^s@@Z}BNi)YUxb=HG5( zs4XltvEC9GNh%p|iJhGU zW3hH3NwBr(qx*si)@F36p{9y6ZPjd+0+G~Q*134o3veVrjOcI#^OEjH7?N==Y9?H) zgH-SjXFn>=;H~AR7rKST3~b|&L*|-Q02?~NS;p;TWD(0)D09B3E?O6`Mii6L#LH#z zrc$l6LTB+l@XUqYAQmpSHFyWyTNW{sAS|xpLce=lhks za4U5d?yU_!|D%+tZtq>e@N8bWnpBs!laZxsQe8P;&b6yYb=kx#dGVI(EZ#q@>+zfe z#pSk6kLrfTB%t$bUcEY@i4(^CWMuiuFh8@0DYRE3D9>!;mArt9br$e5RUiD@cSAqr zrYAOB80r}va*DhF`)r^+5f~|j#7F@Wicho<45gI^%Y6zUx`}51Ct661lmfBRD-lvG zmc$75R)*Z*IueDtQLO7o^&))@C^dC(+5u63K$BR-lp>DtWRv-FqW*5wj6lPU=R<>& zBdW%8u^+J>07r@Vb0nbFI1E5kF9nQX8IYFm8K3hAJYW3)Nnl$QMlS@`Y_zg@fVnvWQb9Itg)|+OPGE z*1isGnwu7-J2HB1G<0Fq!KfGH;a)3qF`@IkV!l^YS*h2?;nCp<0Gw;WZzur1?CqgJ zM6VXHHqn8}^QVI0!+}#HGM+Uw5EwCy*v851i8I51LDL{;#{HzosIvzx$cGyTP;O4% z>6}J-GV=OEli`8jE|j#x4M0ya=T3>7UQsQzeH|iTw4h4_R_S?fdJMR@#DJPNN0xSJFgbaIAh&X!Yea?i<( z7IYV}zMO&8mv{+x<9DnUF5yp!tS8lC^GL7*=Mq*_dFm3jT3RFVML9Y`=b8Wd(=`E% zg4=2g#E9athk7KMFcm=Q7IXY{02I~Ke+-j?X^m~R;U zyEohZZZLRCV!|bCfSDrE2A+!Dzz_-po=Mou60;R~$3IWh%z0JSE%ALZT37w!e6)dm zCTE?)qX~z&%xqB(G3=_z(B#CFHv50}{tMqnTihs%n*Xj`zLuy>X#_)$_Vc8c~!cEPM*)rz8E0@ElfRS{p z+e7Ei2Sx`CxDn@wOLpA95Ru>=#2{5L;&=j;Dhp%C2clfL_Z zBxoJn)K&9aUiX7F{|A%8ElO56=@-9}p!uV$79DS$WdHhC2mcTRgd3JhCU&Fm89M#JkK(quku{qCu3UcPJ1!bMj3m_9 z4U2c&zQq(fyUbScedY4oznh@p2sZ)s?-}hLKQ{%H*ZIcJ`{hske}i~qZq&)le^)N= z14)ldPV60R8y*dWFZH5cJ8R}TyZHL|a{jIo&2#HC+sF5n%R@hM-$ghWIM;26)6O0q z>|cBv63LlNE+cr%POe=3@=tYp*m*HdC!M>;9(WeFz>PjX^WT-r!T(>clS9G4c*sy^ zoww5T)jxdd-ROZEb8yUmS1#Z6Ti3m84~&fLnjDoCOJYBhuH&2TUg#Bqo4uQXIazKW zJNWnbL|}BHFBBSy(@oDEUq6Ibn45ideKSv|8%w;PbHetN{owc|h?v~$Z_3>TuDjR~ z90^VYO*$R>UcU9a+6O)jd4rpM%J!GK?r3K?913&ZLh(q--7mbovJ+2*oBe+7Kxs^u zFQn`y0@4@zewO^^&hxQJ%+D6-b`%`gH++6L&Wm&Y+6#wHV*zm6Xs%~`U%C8|8oiEy zn=lbd(9_#4|NZxWg2%&+_~qumE0@nL)$6H$AUr&VsLRQLbFpXdFV`J;=s(d7x2cD-JX9NO1A7K}sU&hGlvPmf?NaI>on4RBQItng#Q6Gl~HCsjB;`qig@jLG6= zUvpoD&r+w46Txt3$M9XlgK;=@%lXF+?8KdLvkO0-Q>XZa5w{qf&IE#cN- zTW24HChfBMU13z$jlHrC{Ak~*?|^i2WALl_@5<%BL~4l3_95eTOJ);Ct@!yD|Fx|H z^TTbY*#o|>T>kfcI-Tqq9XNnH8Lu;$8;@e&*Aw5p`_XKWP;T}&<{kimxW6y6%hRr;Lk*t7JZFURiS`zQ1|7>a!dZwz>Tib@Ksrr?;T ze}0ut2Z?#->e3U97qP;)*+sxN4Y}^cR++~+QA-Z~^|J5aDR5)%ocRwL)H&TAwnNsO zh_kLPZ`u9nPeO&@W@j;P2ddIigi zoBci>f4%!YCeJI*ANysg{LC#6+dou-#<|(4z4xuI zJLn65+{eCw_y4ACXBH-i+aB{3!S|KRXWpUF{`h$J$Vf!I96uZ~?F6xV-T3D98^_Qi zH~T{V%7gBE9SIBs6D_j7;V->-3m6PHJ16_&hu!xQ4h_H}dpMq<=JAmqfAjNrINa>7 z|F-wK?nKotj;iLdXYILPzV~CMVzbNktnPSJv#ZFXO4jG4o9|rb!&BmB*KsyIrrBqr zN42N+FPDEG^oE^?W;cmm*9YHld(HiLP~7aV>(@W-x|>8D)HYr0{VAr3n|(EW z{0a9RDB;ObdCo~0KK)$ya}UENz|GFze)Wt_SIJhuBVYK7uY_Bsew zt9xeQuS?Mxx6QT=pZsf`4)ktZZ)fUi|-{(@SE>ZQK2w&-bARZuTkrkME?? zOGoUR8TLQ_?AI|}-0TA4!#{A}jTM8&`2s!kAC+5wi<{tP*9brJukL$Lp{aHKMyza1 zduM;g=^vLNXOWxzUdn!|+f(e>+V!vZefvY8o!snV!o^>^?%{A43^jK9Jzoq>JcPEn z+3#TNzg)L(#sJ2gqk|XT{e=NM32yctPQ2v0hoiyp_;5T!>O0=@z3la9otu4*igG+| zRkLG(2@})Ext>1utq1?bR0QnI<)J*i_T#(~kNoMiRjr`*-0bqqBgJkyptlw-obJKF z1b4Ay;2)Pvq62PrBC=p!3Z2Bcm7*7a`d4LGOWf>p^`k`^y=;S_EcSwZ!|<&gKZ6F# z%|2IqYjrwE=*KwzH}%i`0A?6&cFXMjO&XmfH_qR8webt@0U_jO@92N7(&;FvdHxrr zmF?CXJd^!ix%~7xy^azX=!5@u_vQ}1gxKs4|E?~LPIkuCU>om0@Bq_ax!E%3^o%Pj~2c5y#^9&c}cBsYM|7-0Tnj zDZD|+ZI%XKvBWjRrpZ5P`0!Wy(FeDECS}3*mCMUVQtRi~nc;ymJ)?Jp&IQNO{Y1QY zp&k9tf8kcVLEP*V=ikB_J?{y{GcMo#8*%vcXq+3XjGObYMhAvLGl>~+*VtS4 zV0j5{_PZIssL|QJP$-Unez5e8PX|B+xa~D>1>aXL*W9hqK_6WIT4o`C^QXsSKc@eU ziFLgY`$hr=AiYyW`_B))_Tov*8aKO;`N#L@bPygMjbqq6mh|MFM>rGlc zNUKwDFs|L{gP#nA@5gO$+ivzEpHbOcG&)k2Cp@L786b|T{KD7$pAA9K;kMP*A;;kQ z;W$lQaeAw`XW{?t?2cU$ilQ)phw+B~0HIC9KcLov8ic^Psnu#J$i`-ghPIY)a8U@t zt)-!v4finj-|gpZ`?(eNC40xRmbvwi zJ9yvNH_@%|B&;-LHBw~vOLs?yX1EpBbEWqGoH2EFb$e!a-FApu;R7l;m7u+?+L%J9 zJ2$&ruoK;_un@ZF2!v(hNB=P_wpJdW?J?_Cc*4$~>CA-Q8ee1H~Rohyy}b59)~wS3JJknXjH#0oIJy9CPWji$s~YaAR8XX#dRe292z z6NK}Y!R$O}jL+dsWjIz8%-~65;;ljsg@e<0Q5=i%2_xcovvFV-pv_kiLVOn^9IOPS zI1mx*!lakToPh)5eyAFwL>zu2oK*s(@g^ZbatSLOC;?^dLs4RlRUYMrQT`N+Xk(IR zYhmQS1jEfUjV5jRv*I~O7`<=N@KcdY@YouNdTu&<`R2#6e$SP}9{Tq4*Iretrxy}y H=S}?pnWpw8 literal 0 HcmV?d00001 diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/SWF.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/SWF.java index bbe5e538a..fb697a221 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/SWF.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/SWF.java @@ -3095,13 +3095,13 @@ public final class SWF implements SWFContainerItem, Timelined { * * @param injectCode Modify AS3 code with debugfile / debugline ? */ - public void enableDebugging(boolean injectCode) { + public void enableDebugging(boolean injectCode, File decompileDir) { if (injectCode) { List packs = getAS3Packs(); for (ScriptPack s : packs) { if (s.isSimple) { - s.injectDebugInfo(); + s.injectDebugInfo(decompileDir); } } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/ScriptPack.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/ScriptPack.java index 135b50408..91130da18 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/ScriptPack.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/ScriptPack.java @@ -52,6 +52,7 @@ import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; +import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Objects; @@ -315,7 +316,7 @@ public class ScriptPack extends AS3ClassTreeItem { * Based on idea of Jacob Thompson * http://securityevaluators.com/knowledge/flash/ */ - public void injectDebugInfo() { + public void injectDebugInfo(File directoryPath) { Map> bodyToPosToLine = new HashMap<>(); try { CachedDecompilation decompiled = SWF.getCached(this); @@ -358,7 +359,7 @@ public class ScriptPack extends AS3ClassTreeItem { } int pos = -1; try { - abc.bodies.get(bodyIndex).getCode().adr2pos(instrOffset); + pos = abc.bodies.get(bodyIndex).getCode().adr2pos(instrOffset); } catch (ConvertException cex) { //ignore } @@ -375,7 +376,10 @@ public class ScriptPack extends AS3ClassTreeItem { Logger.getLogger(ScriptPack.class.getName()).log(Level.SEVERE, "Cannot decompile", ex); } - String filename = path.toString().replace('.', '/') + ".as"; + //String filepath = path.toString().replace('.', '/') + ".as"; + String pkg = path.packageStr.toString(); + String cls = path.className; + String filename = new File(directoryPath, path.packageStr.toFilePath()) + ";" + pkg + ";" + cls + ".as"; for (int bodyIndex : bodyToPosToLine.keySet()) { MethodBody b = abc.bodies.get(bodyIndex); @@ -383,11 +387,19 @@ public class ScriptPack extends AS3ClassTreeItem { List pos = new ArrayList<>(bodyToPosToLine.get(bodyIndex).keySet()); Collections.sort(pos); Collections.reverse(pos); + Set addedLines = new HashSet<>(); for (int i : pos) { int line = bodyToPosToLine.get(bodyIndex).get(i); + if (addedLines.contains(line)) { + continue; + } + addedLines.add(line); + Logger.getLogger(ScriptPack.class.getName()).log(Level.WARNING, "Script " + path + ": Insert debugline(" + line + ") at pos " + i + " to body " + bodyIndex); b.insertInstruction(i, new AVM2Instruction(0, AVM2Instructions.DebugLine, new int[]{line})); } + b.setModified(); } + ((Tag) abc.parentTag).setModified(true); } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/MethodBody.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/MethodBody.java index c59d9a1bc..a3e2b4b27 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/MethodBody.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/MethodBody.java @@ -117,6 +117,10 @@ public final class MethodBody implements Cloneable { this.code = null; } + public void setModified() { + this.codeBytes = null; + } + public synchronized byte[] getCodeBytes() { if (codeBytes != null) { return codeBytes; diff --git a/nbproject/project.xml b/nbproject/project.xml index 4e901f120..286b09cc5 100644 --- a/nbproject/project.xml +++ b/nbproject/project.xml @@ -308,7 +308,7 @@ src - lib/LZMA.jar;lib/jna-3.5.1.jar;lib/jpproxy.jar;lib/trident-6.2.jar;lib/substance-flamingo-6.2.jar;lib/flamingo-6.2.jar;lib/substance-6.2.jar;lib/jl1.0.1.jar;lib/nellymoser.jar;lib/gif.jar;lib/avi.jar;lib/ttf.jar;lib/jpacker.jar;lib/sfntly.jar;lib/gnujpdf.jar;libsrc/ffdec_lib/src;lib/tablelayout.jar;lib/jsyntaxpane-0.9.5.jar;lib/JavactiveX.jar + lib/LZMA.jar;lib/jna-3.5.1.jar;lib/jpproxy.jar;lib/trident-6.2.jar;lib/substance-flamingo-6.2.jar;lib/flamingo-6.2.jar;lib/substance-6.2.jar;lib/jl1.0.1.jar;lib/nellymoser.jar;lib/gif.jar;lib/avi.jar;lib/ttf.jar;lib/jpacker.jar;lib/sfntly.jar;lib/gnujpdf.jar;libsrc/ffdec_lib/src;lib/tablelayout.jar;lib/jsyntaxpane-0.9.5.jar;lib/JavactiveX.jar;lib/flashdebugger.jar build javadoc reports diff --git a/src/com/jpexs/decompiler/flash/console/CommandLineArgumentParser.java b/src/com/jpexs/decompiler/flash/console/CommandLineArgumentParser.java index 2f1d30d06..7e6d5560f 100644 --- a/src/com/jpexs/decompiler/flash/console/CommandLineArgumentParser.java +++ b/src/com/jpexs/decompiler/flash/console/CommandLineArgumentParser.java @@ -2802,7 +2802,7 @@ public class CommandLineArgumentParser { FileInputStream fis = new FileInputStream(file); SWF swf = new SWF(fis, Configuration.parallelSpeedUp.get()); fis.close(); - swf.enableDebugging(injectas3); + swf.enableDebugging(injectas3, new File(outfile).getParentFile()); FileOutputStream fos = new FileOutputStream(outfile); swf.saveTo(fos); fos.close(); diff --git a/src/com/jpexs/decompiler/flash/gui/DebuggerHandler.java b/src/com/jpexs/decompiler/flash/gui/DebuggerHandler.java new file mode 100644 index 000000000..058f3f615 --- /dev/null +++ b/src/com/jpexs/decompiler/flash/gui/DebuggerHandler.java @@ -0,0 +1,104 @@ +/* + * Copyright (C) 2015 JPEXS, All rights reserved. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3.0 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. + */ +package com.jpexs.decompiler.flash.gui; + +import com.jpexs.debugger.flash.DebugConnectionListener; +import com.jpexs.debugger.flash.DebugMessageListener; +import com.jpexs.debugger.flash.Debugger; +import com.jpexs.debugger.flash.DebuggerCommands; +import com.jpexs.debugger.flash.DebuggerConnection; +import com.jpexs.debugger.flash.messages.in.InAskBreakpoints; +import com.jpexs.debugger.flash.messages.in.InBreakAt; +import com.jpexs.debugger.flash.messages.in.InNumScript; +import com.jpexs.debugger.flash.messages.in.InScript; +import com.jpexs.debugger.flash.messages.in.InSwfInfo; +import com.jpexs.decompiler.flash.abc.ClassPath; +import com.jpexs.decompiler.flash.abc.ScriptPack; +import com.jpexs.decompiler.graph.DottedChain; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.logging.ConsoleHandler; +import java.util.logging.Level; +import java.util.logging.Logger; + +/** + * + * @author Jindra + */ +public class DebuggerHandler implements DebugConnectionListener { + + @Override + public void connected(DebuggerConnection con) { + + Level level = Level.FINER; + + Logger rootLog = Logger.getLogger(Debugger.class.getName()); + rootLog.setLevel(level); + ConsoleHandler ch = new ConsoleHandler(); + ch.setLevel(level); + rootLog.addHandler(ch); + //rootLog.getHandlers()[0].setLevel(level); + + final DebuggerCommands dc = new DebuggerCommands(con); + dc.stopWarning(); + dc.setStopOnFault(); + dc.setEnumerateOverride(); + dc.setNotifyFailure(); + dc.setInvokeSetters(); + dc.setSwfLoadNotify(); + dc.setGetterTimeout(1500); + dc.setSetterTimeout(5000); + dc.squelch(true); + List swfs = dc.getSwfInfo(1); + int numScript = con.getMessage(InNumScript.class).num; + final Map moduleNames = new HashMap<>(); + for (int i = 0; i < numScript; i++) { + InScript sc = con.getMessage(InScript.class); + System.out.println("" + sc.module + ":" + sc.name); + moduleNames.put(sc.module, sc.name); + } + + final Map modulePaths = new HashMap<>(); + + for (int mname : moduleNames.keySet()) { + String name = moduleNames.get(mname); + String[] parts = name.split(";"); + + if (parts.length == 3) { + String clsName = parts[2].replace(".as", ""); + String pkg = parts[1]; + modulePaths.put(mname, new ClassPath(DottedChain.parse(pkg), clsName)); + } + } + + con.getMessage(InAskBreakpoints.class); + //dc.addBreakPoint(15, 14); + dc.addBreakPoint(9, 26); + con.addMessageListener(new DebugMessageListener() { + + @Override + public void message(InBreakAt message) { + Logger.getLogger(DebuggerHandler.class.getName()).log(Level.WARNING, "break at {0}:{1}", new Object[]{moduleNames.get(message.file), message.line}); + String cls = modulePaths.get(message.file).toString(); + Main.getMainFrame().getPanel().debuggerBreakAt(Main.getMainFrame().getPanel().getCurrentSwf(), cls, message.line); + //dc.sendContinue(); + } + }); + dc.sendContinue(); + } +} diff --git a/src/com/jpexs/decompiler/flash/gui/Main.java b/src/com/jpexs/decompiler/flash/gui/Main.java index 62af73636..6b41bd7fe 100644 --- a/src/com/jpexs/decompiler/flash/gui/Main.java +++ b/src/com/jpexs/decompiler/flash/gui/Main.java @@ -16,6 +16,16 @@ */ package com.jpexs.decompiler.flash.gui; +import com.jpexs.debugger.flash.DebugConnectionListener; +import com.jpexs.debugger.flash.DebugMessageListener; +import com.jpexs.debugger.flash.Debugger; +import com.jpexs.debugger.flash.DebuggerCommands; +import com.jpexs.debugger.flash.DebuggerConnection; +import com.jpexs.debugger.flash.messages.in.InAskBreakpoints; +import com.jpexs.debugger.flash.messages.in.InBreakAt; +import com.jpexs.debugger.flash.messages.in.InNumScript; +import com.jpexs.debugger.flash.messages.in.InScript; +import com.jpexs.debugger.flash.messages.in.InSwfInfo; import com.jpexs.decompiler.flash.ApplicationInfo; import com.jpexs.decompiler.flash.EventListener; import com.jpexs.decompiler.flash.SWF; @@ -79,8 +89,10 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Calendar; import java.util.Date; +import java.util.HashMap; import java.util.List; import java.util.Locale; +import java.util.Map; import java.util.Map.Entry; import java.util.concurrent.CancellationException; import java.util.concurrent.ExecutionException; @@ -137,6 +149,8 @@ public class Main { public static boolean shouldCloseWhenClosingLoadingDialog; + private static Debugger flashDebugger; + public static void ensureMainFrame() { if (mainFrame == null) { synchronized (Main.class) { @@ -1001,6 +1015,22 @@ public class Main { public void onFinish(String clientId) { } }); + + try { + + /*Level level = Level.FINE; + + Logger rootLog = Logger.getLogger(""); + rootLog.setLevel(level); + rootLog.getHandlers()[0].setLevel(level); + */ + flashDebugger = new Debugger(); + flashDebugger.addConnectionListener(new DebuggerHandler()); + flashDebugger.start(); + } catch (IOException ex) { + Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex); + } + } public static void showModeFrame() { @@ -1203,7 +1233,6 @@ public class Main { * @throws IOException On error */ public static void main(String[] args) throws IOException { - clearTemp(); try { diff --git a/src/com/jpexs/decompiler/flash/gui/MainPanel.java b/src/com/jpexs/decompiler/flash/gui/MainPanel.java index 7605fc46a..f8a8bfbff 100644 --- a/src/com/jpexs/decompiler/flash/gui/MainPanel.java +++ b/src/com/jpexs/decompiler/flash/gui/MainPanel.java @@ -23,6 +23,7 @@ import com.jpexs.decompiler.flash.SWF; import com.jpexs.decompiler.flash.SWFBundle; import com.jpexs.decompiler.flash.SWFSourceInfo; import com.jpexs.decompiler.flash.abc.ABC; +import com.jpexs.decompiler.flash.abc.ClassPath; import com.jpexs.decompiler.flash.abc.RenameType; import com.jpexs.decompiler.flash.abc.ScriptPack; import com.jpexs.decompiler.flash.abc.avm2.AVM2ConstantPool; @@ -1526,6 +1527,32 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se } } + public void gotoClassLine(SWF swf, String cls, int line) { + gotoClass(swf, cls); + if (abcPanel != null) { + abcPanel.decompiledTextArea.selectLine(line); + } + } + + public void debuggerBreakAt(SWF swf, String cls, int line) { + gotoClassLine(swf, cls, line); + if (abcPanel != null) { + abcPanel.decompiledTextArea.setLineColor(line, Color.green); + } + } + + public void gotoClass(SWF swf, String cls) { + if (swf == null) { + return; + } + List abcList = swf.getAbcList(); + if (!abcList.isEmpty()) { + ABCPanel abcPanel = getABCPanel(); + abcPanel.setAbc(abcList.get(0).getABC()); + abcPanel.hilightScript(swf, cls); + } + } + public void gotoDocumentClass(SWF swf) { if (swf == null) { return; diff --git a/src/com/jpexs/decompiler/flash/gui/editor/LineMarkedEditorPane.java b/src/com/jpexs/decompiler/flash/gui/editor/LineMarkedEditorPane.java index 5199adb8a..427b3343c 100644 --- a/src/com/jpexs/decompiler/flash/gui/editor/LineMarkedEditorPane.java +++ b/src/com/jpexs/decompiler/flash/gui/editor/LineMarkedEditorPane.java @@ -32,6 +32,8 @@ import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; +import java.util.HashMap; +import java.util.Map; import javax.swing.event.CaretEvent; import javax.swing.event.CaretListener; import javax.swing.plaf.TextUI; @@ -65,6 +67,15 @@ public class LineMarkedEditorPane extends UndoFixedEditorPane implements LinkHan private LinkHandler linkHandler = this; + private Map lineColors = new HashMap<>(); + + public void setLineColor(int line, Color color) { + lineColors.remove(line); + if (color != null) { + lineColors.put(line, color); + } + } + public int getLine() { return lastLine; } @@ -358,10 +369,11 @@ public class LineMarkedEditorPane extends UndoFixedEditorPane implements LinkHan public void paint(Graphics g) { g.setColor(Color.white); g.fillRect(0, 0, getWidth(), getHeight()); + FontMetrics fontMetrics = g.getFontMetrics(); + int lh = fontMetrics.getHeight(); + int d = fontMetrics.getDescent(); + if (lastLine > 0) { - FontMetrics fontMetrics = g.getFontMetrics(); - int lh = fontMetrics.getHeight(); - int d = fontMetrics.getDescent(); if (error) { g.setColor(new Color(255, 200, 200)); } else { @@ -369,6 +381,10 @@ public class LineMarkedEditorPane extends UndoFixedEditorPane implements LinkHan } g.fillRect(0, d + lh * lastLine - 1, getWidth(), lh); } + for (int line : lineColors.keySet()) { + g.setColor(lineColors.get(line)); + g.fillRect(0, d + lh * line - 1, getWidth(), lh); + } super.paint(g); } }