From 02a427741316eeff8b67bd4d5e11adfed5c1bd34 Mon Sep 17 00:00:00 2001 From: Harald Kuhr Date: Thu, 12 Mar 2015 12:55:55 +0100 Subject: [PATCH] TMI-117: Fix for "componentId attribute out of range" issue. --- .../jpeg/JPEGImage10MetadataCleaner.java | 45 ++++++++++++++++++ .../plugins/jpeg/JPEGImageReaderTest.java | 22 ++++++++- .../jpeg/jfif-component-id-out-of-range.jpg | Bin 0 -> 23323 bytes 3 files changed, 66 insertions(+), 1 deletion(-) create mode 100644 imageio/imageio-jpeg/src/test/resources/jpeg/jfif-component-id-out-of-range.jpg diff --git a/imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/JPEGImage10MetadataCleaner.java b/imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/JPEGImage10MetadataCleaner.java index 99a1bf3c..420bd1b4 100644 --- a/imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/JPEGImage10MetadataCleaner.java +++ b/imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/JPEGImage10MetadataCleaner.java @@ -233,6 +233,26 @@ final class JPEGImage10MetadataCleaner { markerSequence.insertBefore(unknown, next); } + // Known issues in the com.sun classes, if sof/sos component id or selector is negative, + // setFromTree will fail. We'll fix the range from -128...127 to be 0...255. + NodeList sofs = markerSequence.getElementsByTagName("sof"); + + if (sofs.getLength() > 0) { + NodeList components = sofs.item(0).getChildNodes(); + for (int i = 0; i < components.getLength(); i++) { + forceComponentIdInRange((IIOMetadataNode) components.item(i), "componentId"); + } + } + + NodeList sos = markerSequence.getElementsByTagName("sos"); + + for (int i = 0; i < sos.getLength(); i++) { + NodeList specs = sos.item(i).getChildNodes(); + for (int j = 0; j < specs.getLength(); j++) { + forceComponentIdInRange((IIOMetadataNode) specs.item(j), "componentSelector"); + } + } + // Inconsistency issue in the com.sun classes, it can read metadata with dht containing // more than 4 children, but will not allow setting such a tree... // We'll split AC/DC tables into separate dht nodes. @@ -277,4 +297,29 @@ final class JPEGImage10MetadataCleaner { return imageMetadata; } + + private void forceComponentIdInRange(final IIOMetadataNode component, final String attributeName) { + String attribute = component.getAttribute(attributeName); + + if (attribute != null) { + try { + int componentId = Integer.parseInt(attribute); + + if (componentId < 0) { + // Metadata doesn't like negative component ids/specs + // We'll convert to the positive value it probably should have been + componentId = ((byte) componentId) & 0xff; + component.setAttribute(attributeName, String.valueOf(componentId)); + } + } + catch (NumberFormatException ignore) { + if ("scanComponentSpec".equals(component.getNodeName())) { + reader.processWarningOccurred("Bad SOS component selector: " + attribute); + } + else { + reader.processWarningOccurred("Bad SOF component id: " + attribute); + } + } + } + } } diff --git a/imageio/imageio-jpeg/src/test/java/com/twelvemonkeys/imageio/plugins/jpeg/JPEGImageReaderTest.java b/imageio/imageio-jpeg/src/test/java/com/twelvemonkeys/imageio/plugins/jpeg/JPEGImageReaderTest.java index 21adc6cf..e4a6e2b7 100644 --- a/imageio/imageio-jpeg/src/test/java/com/twelvemonkeys/imageio/plugins/jpeg/JPEGImageReaderTest.java +++ b/imageio/imageio-jpeg/src/test/java/com/twelvemonkeys/imageio/plugins/jpeg/JPEGImageReaderTest.java @@ -1349,8 +1349,9 @@ public class JPEGImageReaderTest extends ImageReaderAbstractTestCasep_@Bjp{-a@}r75HFxt7OAbCvPRHO4D{dTDrRXs+D& zU$$xfuX5$;wd*%--lC*pU37!>^GT~u^TY+QUodPZgzGW$ags<@;SU4|*gR@Bww z2@Q=+%`M$My?y-yp9hDCq{*r2nXj|t70T+jwe^kfn_JYwqaQzyPfmZG{SVg_nrr`i z%l;SG|AUM1FW1%U*RNf_^*>x!t_J>X*BGzgcr1OB>6z&*CvRpxnYXkLw9<-dyXg33 zK?f|(J`=ZD1>{x)ssDraf0F&b1B?9sME1YI{%?^&(B*A^dw_|x@&GxU4m~@^yWMk*>6g*2Bkz_9Og)@C9Lt0ANwZ0 zOc01sI0Okcz?I_?zhvyBx?jXSmLzWWbXhTPOT+3Ny5w7uu{@g~i3Z{akc+?&i(tCG z+Z25%HW&6P4*GrTvBLYHZnoNk#+W*{3<-go)AAX^x{SXNkB)Nk`quGmob^EU<-6Xu zVF>A%XBggxv_BI&?_N~dE93*9j3!ASAFpHsfqfx?Rn2&TrM_SxRflgzBIn462W9DA zhProsV79f;hjRv4#Zuc;S-lUxtxkK;p@QQXwp2SsM9H&27npBw>E^-Ec>CpcmCP;HMj~5`^fHhSW0dyWbtLPQI*(E8r3B|7>Fdcd67e(#jv2*ihA? zzLL#sEQKLpn)~^pJ)boM=n6KO@WjLmOr^QDPjP;ECb2LK*}jS&4x=<=Xj6Iee-S8u zXyU_fhCz=Ru6129zw1S5{wpc*<)o!7w&>KEWJ7hxXF7dnH34sXRtb?Y#%>}g_8@LH zU6(3Hg$x(;+(m)k!Q`S)6IGfcSuZYMMLOSBZhamtxI@MYgEC6L-PDW zJOS7i6Kr2>`Igz2TBegM&ZdM1BBb?XeZt!w=T!$!gD%}Hx45235D0C=j`FY6l`Aph zh&~yX%AVa6-eA#GiDk6PmLb^3nSVE0e2WrjgO4GJ2XzysAfGa#?hA#Q?GfT++(Y8 zyY3NpA)NjNMK0oR;5Ell$1R;nRrm{F4;finw-s2@&-RCA_H1Mr(vo!sbvOQ0Xwq?> zy0R227xDIuXW?oDN2vE{*s^2nJDsf9==IawTQQzL&$pAGI>6YxPl4TIrO?9rd#^na zWfQwq0#h!)M)O>g+VLNAyUaF|zuRT zM;DQmhAq@JxR$^2_>R$i=my!YBE~ zbF6tD;zlews<*TFH#60YVv#y)Makr0?r50&Cj0%Q;I7TfNueb6DAK@3SfiDL&@^1J zYQz_}X{o^%T;mo(AW%DJ_i93=elT<<;&X5-O>g&H6JCx|88m*#x9ac>`X0CHQznzV z1zyotCgz0Cz0_%OFb<(O-OXCP;5`}`_(Ri>PiTz&F?RF!?eXj`vQ@mCKW9X0n>rj( z=5cmoe)>cVv$Tm)uL`*2Fl3d`!QubVut1MZ=V2=HyPs3d8xI1SG0;y|!z#6>KdG$K zdw*!`FBjMXIFnR-p=5>58fZ(>*{k6o+&Yi&6aifGU^B4CK?S}@_!u-`*VItoR4{BX z0l#De-pwuEZe2OrY6@xzLS;njSeE2wdi{hA{cLvE{UNsUUDw>s_84CR$~SfgRba){ zRkBt#CO>W{_aiw=H^&R>Ei5$MRHmHb%%M6artq4t;_;r2>3?94jqZa*NOP<|;TA5{`SqmIUDaapB zhH_iVXBc-7tKqL2WwfSa$oe%}`q?oQA{drM$hQy07N>KRG>WZ_JtSLP$w> z#B@9js#&=#WJ?W&V1u%44-UB&6c_@{vMrlC8aw?HP5|j!*40wH)}2W5mV_dx`T6D8 zZ!GVF4uv3|AVRw&+{Aj$v4?qX%ZhP}wO&VJ=lyI0u55F_WD2Bi z@?0(#BB@D1Xw+i#O2770$N-Dx0-cWL)h%NI`oAis=Cl`N0u@v_ZfdNsYh zxu>Xz1~>j>XFSxUYoH-jwjBGC~*?)(lq_shT`dbZca$7 zI!3#;HZ(oYT4S0Ufi+t)dO8By|J4?gZVWKw7$F+-6bikQ7t94vtr(W25-+cu=CkHr zWS4&raCn3yFRmZyority_|#-=HI`h`fm{#S_D5mKxQPAEwz0gmX-pAs|@X*R0M zoOHi!{<8Sn`p#q(F$FgZ%$_#^+y}jmr6c7*rV`(6Am;kL@E2JY!=SuXq1&~{$I8#N zfQ3l4^lyktBkC(m_M&$U^Fnn%`+&8OhBDO`KzkzL>mkmWr z1^IG^k0i?!V)(|C@i}|`TsmpDbv+jlo+pA83Prve`A)1@s+2_~seMw^ENOLDnS}N? z%hD;YhInSmC8OGQxjBPH`is5uD$LBF8e1)P;o1~N6}L&}H)&gsTFyX9hnFtHE|m>|ps+;9RD{j#39lI#_Q6YjG}FimQ zN+%9V6eMgcW{YNvzn8lw-YQ_htP=l($J_^a{SOVKm2@}YbL5Ip6Y&M>QP&gP9~#=J z6ig8mg?#a`b(A{yd8hmjjfaifQk{BN^_{Z4u&2+5#Z4~Czo(pR~iHEHd17&_xH zR^~8$N>h{Xh90MSX(C^Ly6Q#j=kx0)%4y`SgH21aukmp%mO%Skfm~1$f}8dDAUm`z z^RzASpK&>{2h)9>nkYWAuep?U9j4W*0)YIxXMPs78A7mjIG$fndsxY6M4jDQ~3L8{NHyk+h zJ-$43(u}+04^nh+Z?7Y+AN<^pMl3E)IubhYGi)a<3=6vrXe z`4L@M2xhb3dF>VonM0NI*!8E=EjUxit=w!Z;GEXjyy*PRSbdt&yL5+8ct`COH<#{Y zwWkC_7VazRcme13$(bLPXySr*xrk*9miu0mu)eR|Jf)_}Fp9lJcW`q2f{ID<3)9%J z>p1vg8Nl{wsV`K1SRJ7HxmsMPAfh42CoIH_be(MU;b?AlsV@-WdoxY#?4p`*H?niC zMW}cESJs^y(4S(fm8O~A4#Wpex5x9!%gvKqIEYEEoBcR92c{BJw4&j3Qv05L-JL?l z_#S76t5NyJ)$0%3L^HPmrWi1rt^As3N;}$&QQSe2zyV-7W_QGr-{p(685jPRIyGHZ z#k$m7I5kzQF=pws6F~BBy?}OuFP^NE7pmokKkx2H z`rG^VS;clYL|ANH3b#>p2s1tVw;>?%S7UF?vx=<R^m$+spL@b%l$xa^}eN8|77Ft zxxyVY?I5{9JUr0g6KO{m1jN)b&8OO;TmWY#69q(=t|j?jiYd?BQgb{txpjGa7|&JVR`-exthY}X&}b(V@U zZ!dfD&SA8GuNY0IVv!|GIwL4gR)SiiIgG@ZDy&Q}iP!`z_^9p=&5AkiU4&~YplR}_ zI>5ZKy>;qUdiR`NlcJ^7K{1RoIdOhdL#S;Ur!$$|AvoP86hcuQ_D2qMlaWQGkh5(u)0(}Z(tzj!o{R*OscndqmzKjdc9=vG0A>FRr@l7C9Bj;C`sb$v`bwxaKCO2 zN`lxD3JQa(LeoN47JLk~D1lQ1GoOdy8;^WqEI-1vAL~cdY!nPMwj=p8-o3}cql95d$n@^v`#!YjL zs10Diwgdhj=V!MXYRS*MKdk2(PL1qkR1Qb1d@f1$)WpBO(Sd;#>qufMm$o$6WP>W^ zMt(Tn3kvB8SEVjSQ(7JA7q*2gC)?WK&p*c*~Cfx z)VvKUTl~~TIC>4zdvBAijd3Ij82)RP;}l_ zp)GCr8JD0*BnN{#)J5$o@~orn=6FyEK!bNu36Y|3vP)5%a;ZB|JFxH4z?4DA>-7@( zWgRWA8&5`DZtR3VnvmL+&$ZXxJKLkI&xTs46ISgFOY$}Ch(F6;hd1(jmTrNt@ilQ6 z16`TS_IfNJyDq&z&_E@t2$cEQl6k|E6{F%)0-ig!2_0iJoCp$!VvVK_PQPgI)t6#8 zpJI*gC6#Z3d@@iU53rMFP^B&NN^u=!QZKQ}CDi;Bw+svM@L#%l8s=9y%*@zc82I(~ zGp8`lxi50(`9{N*r~%_?7ebC;`rg*j`IA31yY%SOB0qSz{Vj0&nep-;n%-f}c#Z4G zGgt4*uXckxRTy&;MZ>jUCd2UM5t#k8=R7~~PLB~R%#v$_X?+7QStU1T%y?-%yuRsf zHA8^&U2^l$%FPnmb!U35K0(NR`O7)*pWjet17L$%+V)u8&Qv3mp*ec>L$zxw*dYA< zMK&e(A8LQ)%7`X7)|}X;S7Ha19$7j6a0AyqZ|Q`8ck%wHr()9+)gNRwxBDpcHBzo&D|| z#*y(S*~0tbB9Xnykbcw*tBaF@#8=*+ou07hG4U$_&$bW*Z_9}d`G5K;D%JVgKF#4( zB*l%n)c2adH)DY&{)(5t{RLY)-6vD8lJKbB!(7Jiy# z-NZjMbiVNC=M}BFG*_Bd1*&cKL-pE^x8B6tk2GFBS$y9hb>%Ex461$6n}kgMXZ+Sw?^U6P!_ zV1fm9L__}1t}XfRhTpt8*X0iYO&Gp8ylA0-qo2tIjFop_?qok%=TiRtA|ohfre|*k zBLGB5lp>!d`a+n{RY@FxK|kksjRB3qJNHZM9Jtu43XSVhD27^w?BDN?P%u-g0U<%U z0tA13TWnMdf&Lx=Y|p-@+a$g^Eq{GFzRfu7^a(bs z2$F5O6igv64$%of_MP9`D9qQSazeuc3%gXr z6~^2)3RzEsUA*Pf(WO3+v*X^=Z()^5S0-dX{y+{_O%+WlVli8cdf-UN6LkP(p-)P!m<7D&2W0Wcl@&49K^gJ1`62P&nfNJjvb*6k zNjQ#kf@97!1!gZmK8@r+w^5fkMm>86A(h70qjzUV+Mu-`V}Q~4Nab{DNu)t3EOqDW z4l8|^x5Uc9X5FMa)ei9;r57(AQRmv+-W2mpW=uR~XI$vR1R|(_D{=5c&9PUsAj+@p z9!8tlv5c^yxnqCJkcx;qYhBU~JkDWsf*2PHUaYMpJ|{jW&eOqNrUSnu1F;>vTtnCvx$=Iov`LIgvPxx6ch#@Qyx|qu;>DB_`g3Hu=YX9Ph^1K^ zcZ`GSR02pz*jcR6ZrQ$4zZ}uqJN?v!Lf+zp&g-z2gaxWKG7gmKxP=0`>${g`Kg~Hj z6GFXjC}inHW=qSX)9^8fQ{9zFGTo1My_FFgdF^hK z><5ET=rbk~8|Y`6lJ%f`~;DKgio}6Tkwg6qq5D zmheFAN2|ctFWAwV*q+rf#?8j67W?fn_53QYL6MMr%`Y*k5%}v)k|kcx)3jRej*shL zsv4LKu&3T@_3ySg2p@h2E^hZydy$Ao6Z^$a zVJ6m#im~#VcexBTcNtGTr&$jMdQk;93K;Gn_I*9WB-)iWr6$NN=<5X*v_0I4wga@DoDf zP+*w0DXGfS(_tzD5P8&9d~V*+bpEBT)ML`f7j0>gFDy7j*#Mb+D=QRBvY4OJA6spE zSUeRpk#iVaqoH|aMAH?8i%l}i6gj_Lu$XV2;a9TrV1vCSBdN$TS;wf1ml4o{vCU?t zh#50@pc`6b|>ZyiNWS#7HXe!Idmcipmy{I22jRzNBEZvQhe}X^kYRs@^ z%Ou8m%E7Zu$1e)-s()y1gaQv-A|OGpj_H3PcJkHK1Mkg7td5z;T07eQb7o(K%Fl?o z9IubG*IHa{OsWl?bYB{kGRcFJ=XeQ*-Hw9|NUwEboX zEb+ruocx@#w0cn_!>G|fU{Vs~fsiU9IjH7374;&A-O-B|3@S@z`BHGJdr>Kz)wgd0 z3OEz;m93JXfwS(5I^EaY5*f`njL@RqRhuhR9%7!0V9Z$+boKGh zQ);qOcWeVz=(cyhQk81oc(SsRvU%)x!pf9U#ql`I%10mJD#O|qkD^^~LEu|+YLLsr z5?`t_(3AVV-nfvi5XAQlk3!$&5gn&L-Gq8WwhZSfayS^+_W0=`+6U}ZCz(O?7?&Pq zeiIb-zDp?5%=TdDuk`P^r4l{-S6y`;fi-y8P|{pwdbrza`RH6zwzMI%@#6zxgh&Bd z20dLu?S#Z78UXS!#R5W8$)Z^vT|z9MiETyuas-EMgaHsGF*jgR$=)yGw4!2C*BT|T z<#VV@t7(-W|6)DjU%#Wj zTJ?-Z)S|uVb`g%plICVw8C4p>e%I~;fAhcDn$l0_=XEm9o7Z0G_xYL+tgM2(&+So`VSY3 z9Hu!EDqj!{D!I&sjLfsJSt858RDL>sEk_bn+}*!xa4+Q?H;F%t|%=T zO{Y9*mXu7&7+5a?=WCs<6&Prh9_08#*2NwMf`VEtfrtm+E%!ptF;)=--5q{eO|sgD z01VSBaN>frlgC;L7j`YvgV&A6Vr>`mZWydh3Gyth*Hx&5iSh$1*VHC>Gd~#}AL@n< z;(tbeSq7`gD7>G}zR4}KddUbk0^8rR+iF9ZfQ}9OrTwrX3kJHPYE%m*Q}4`DB3ume z<=f~`%DrrqjHiUqU5Iek5$yAnwSg|1LBB!c4v}mdx^}J){ToyGLvzQiEyRX=$sPEj zDMmtFu%jh?RuV-CUWuenJQd)h@xSRL{ucdoi^(49rKX`tIFgDc_qOP??-k*GtIlK_ zm~jv$3CeO8+PzmTTT+M|FAvNY#f^E$YK$>>DTFx#9Oj5QfabGV=f82{J zczp1OCJEeC#;p}Ww@GG;ldHMAskJ9zW=WVtc>0Yofq^R9@rZKR8~^G;U;kqH_Lz9t z1!$~x2sfAc6u3(zc3rP0f-QWU=~NRm-SOZwD z=kIGDL`92z-yK`j%59oqK+%C9|9nqd7H%ck6QM3%R-DG;@62|m#)i$4xW_P<2*946 z>$5x;P;P2pZWwK^+XDiRaDvb2B#W;03{LvrND&*m3uQxwi%)i{YN%Wi-}GfCd4`I~ zX=@v5TPBPfUx)Zs8{eoJFRNszj`C+OA$r2`Yi)pKEhyl6*GDE<2k9A3`QfhhHIfA;=Jnh#=#(7)VDV|&nA{uhG~xw^ z!U`y=z_&N+9^=zD%u@DkcXiKUg%|| ztrV{Ub`nEJC`?$S8((W6$>X4;-oQ6ugh|`7^p=hO3m5C@71CZw1JO3<_YJhosaemo z(ain62O2yU&7=~@?jBrD!fKZjJ|;^Uiw}R;d2sSB6fS?#tE#SWVvu26Upx64SKX$_ zig{8bXUXZ7*OI)RU42T@Z<%n(7@CwnZ{^CDE4^Pb57Bf#VCf`9+-nm&IO<+xp-vI9 zyLN4gPa~0>5pnx_1S}!f-Uf%VajLIto~n`qj!4evx4_8(sjyXbtuxwPmvs6+H23?* zPkUaxqi9CSAy`ADb64#D&_oez;EyJqVIuO|jtmgRt0W-3{8+rsE)q@QO4jO^E13E= zxjIeA{f?_HLM>7br`)M(5f(qcFmOJgOxbpt*J#gUlM_vgY)z0)(lIeO2&u@(*W4u@ zn}9QYHty|*H6l2E=yhxQWq7XSv=)c6Vn{67G5=1?tW*|%?RF0aVsI*7g_svvmY}tg z@|7ohOwe~MZ#VWXvQPWfFmACa90oBvAh#ACfs0CiznD;yxNa;L!=lx*vXrp1p6+ve zAg<8Z$h!Ha5&<29JbZJ9XRsKm*bqq8h%WxE`oSJ5u!+*?sH7M&+u$dwB?Vhx&#Lsw zHhFHhpv213;JY>Q-zFv9Y&vFGQgAEvH)G2JI#@0;DF>{DPL#RfT-A8`5y=cmTn#jv z^_cq44MHD!r2QA6xvmWs0F!(B6XM!PVAAum(le)iDR83lQh17jgWVW9(kgotQhmLg zTWvVKA5QxSlE&bHw`TWHNeYOgpOoIuq#3Hr+qYlJ5& zlPYOP5tmLP6mRA%kYshXqu^ZCk=~&<82%(^c?aJ+ESk%6vjGDrc**Ve$vhv ze45ta-_nqr!t3UU3&t3q>i!&&VVWLe?!w9AZ}yRKqXlD?p+XaFB4rR2#pu7fKqitH zgp;W8Z~xTL%ONVB`fmGxvbA=mi!ADV9eZbg%U3Rm`9ovV5*f71A~ypYWI^d; zqH)!#9nC;qHH1J|p3j~Q!7+cjGO6l2F@>)bOMxy*-bWiF&3xdK8*r_GH1HL1K>&xV z6Pqztmdla&^KyeGbL`u$rsYl2M#a|11Wwp0nKQ#&WGd#awX#tq4y0MCd9^K~eA|(} zO)8|4Okad4ZE-b~qwt0I2)m-534Sr%m6?+usSR@V2!w}GdMfmSS8xAllE+F4A!(~t zQV@hAf!E{3Sw1UnDT~Vnt-H_TO{;%wg534tp7=3loj}S6IE(m1gXO^UT`_nwozPKO zYSZOIug1h+5J8fvcA-rh5GOj0sDg)T?XSr}1ib9T*&OeIhvdf+4#;+Pda%;rV|0p) zfQ`mR_(qABo^XIgS| zcB3W7>B$vZRLG#f0%guoF~&&I@9l>Y8|OF9H0>7K#0 zS`XXb)l2#58J*ejSW)FG(KVK7510em{xYe+t6-6-me$)d)D)?_+GMbXQs6sgNA5~p z*-QQoNkdBpD>doLn}f0pbUIvj_d4C!ghcGicB;^?NLKLx!)JqizPe0U zcCa36Gm{S*oofUzP5kC#8-le^U>XTSLmSv++ALXjZx+G5Y&|6LiJvo@jwm_B35Q%B zB+#d(1#t!pZe*zQH{Y9rB8s8vid3RXKyq+(zvO;(8$IXx#Bc4g(?kPD24ML->)Vpn zc9N(3CR~2INDj%od7P2>vmQlWavY0&NuY{%ejL}1c%b#{jq4HrD+Yl^0eoe|!)i~r zra%Vazo{gh(AkKKy5`nf{q+v>&!~TB-r?^t)C@Srw{*sNR;}fB2L_NEa{T4I`VcM` z<$UdLo$oIm`QEJY8hn{X>$yV+5`v2hC0ZG)WUqyW#QHffb88XN;yTuy5P3t>zDe{g z&T&+UvJmL050*|$FWurXhq-U(q}Pyjn}r?sn{fBEIxJ2jvi-x=CrhBBmd%vcHF$(%V z`Jc0(AV{8VYD3h|JLRuBZ64*k#$z3#l9Jb+zMc^Y&=~qy|N59|#D%Vh36s6-bqYn0 z2@dSd{bl@&w-3(h04DvGIL>&GX$>G>%Ka9gA}XR3@vnwb<7w_P*xu@&rfA7xaJ$Mm zupZ^{`nO^^86O{fQCYIxm=1fBnQc|*nhw_@^>R97_*Xc9$#@6u&L$G;YRc&n^=&vO zc-!*KGWu@}x*Hhbmrah1BY-Wy@i(e5!D;~q#)2_<&sjN>8pYf=pSjjh5)SI{da-4U?rTbt{LO%&@-6gfL99nT$!1S%>zBvx9_o`!spN_d4m=f9Hmf z$01Q{oSiXurUNcDg5M#TpBAa4l_ZoH;RI&tqs7K^(L-h5&7uTF15im7B9nP`bJ#Hv z-!OR_tq!Y)V{}4VFnTTY3%M<;d|M@yXF?69#Y5LsEu6a9V->*?T}qAaJ#S@-yA_y=g5-*&1{Y%d#U z`+OsGXoP<@48^5h?_6NQfvu{q47$|)>ZP>;Sd-G z40sO|d&)Q_4C_CCk-)ibU^?aY@4WPqV8hA#CB0zhvJlP6B0yxfxiwS?U_QB^V{})I z+V*I_v?+9xk2u zgmp1s;VnM|gTtony`JwZzjb7TivQ3IXb8;+5kb@EW;q;E?lA{BHBNf-*JbCx{I+s; z;VW=$z@$Gn&|s}9REzX|QJ@~?!E82Fh4|Qj{D!ZTJCv&sGEaa0qP|T7HYU>8^j_yl zi5y601=e!XIeTt&kn-+eYooV8fdmeUTF6&5ZEy7r3&zgr!O9js%mcqkF0_A}OjeeS$l}e{a^U1W(x{7r|IlACPy+mzrIs1Y-ENQnaCV zR-2JD>1 z<~yrd8?572qr#_oC+BE4lmH6$DusRRt$iFgGtO>QD2e{EhvuvYeULQ@jqc+*{G4&6O?`M#K!gZ^A3JQ&=>>E9Gkm#~ER&@lYEF6SD)Ugr7B zXeMO~n*d`tog`fXS-vyAYG8>{(URpT)>GcsXMnjyXCMaH?ULsJ8Vtc3D5cqANse7k z*ira2)~F;^Hu0n^`$$l5XZH!3<7if_SrcC)`S$0Cy8X1FVQ<2hhg@MA+HFi+G7e6W=)au%N>tt1`R>I6L2 z0!Kf(=RNb6TjV=>9qL^Y@_sE7Wzq_el)&e%c_&wG*^6Py;zcB_0-pq16r&X~Z7pmw z!GR`Td3^i4(8=aJv+&EyF$a%L?lw{!Zq1-AZr0$C)A0$@jk2i>na@f0H;X3dpYd}E zq6GDSKW*uJmpZ(}DhL-FIAI=eW6NHRxUv7a?O2$xaR~EwI03mN2(- z+~G%ptX#9+(%?x192{r=sJ7U{w1OY=w?&#<6Nk_;4Lr_ptsjo(r0}cOTk&Ek&CNPgFx1@ zmkq44vf$B|VShu+CUw+~lB0)C$f_BEezSxu1CqJ7$@(|w-ON?dx-|>Qi+naquan8< z^cKireonXylAa^FcRDE?C+J9L12CTLFOa2kWB^sBmzN=Vw;5}c4FpPbDpH<;yjQCT zHP=ty{SCwX>z|uSueS`p)=gH(t=MX*u7&VK7cUT^+h*Vq{uNuvcgzgo*Aj~))~hpm z{yM4~#~ZN{Nwx@zaqm*J=G6}Fpp4%4QUg*k1wsw?9T$Vb$GRX@+n#4(eTNsB3l6qA z6`QQgeXoV0i<+ho^1^py?CoX&PwJ-G_VQI%_M^l@`6pe}@Ae zMwv{DJY5nYpUjQC{sYZ*d z+wL*-`V55+;aB3ji0`lfyXorM+c-exGWtn{SuR$^{0C^w-(vSh-Ja2=Uab4j)@`)|(U*v1e)LV$el_R>wGR z7}*Wo5nJ9|l3w2P41f#72-Xpwf$cFD3p{TXuEP+~GbmvU}AgNs-Z zj>zfYwuKgmPD>H?Sx!|L#B3Tm&i%_0KYE0XL;kZQ_N2+HoYHPPmpwQbpd+hoVXp(f*Q5C-AkHUXzL~P|v8N z$SKp=KrfFN6^v&Ec}##EMnXJ?8ocLe{ly@ZrgpCeum6zgwS39~y1+uo=_!2ss}OtV z)gjN63||WTjU(UmB2g^fwf>*$uWz?yUzPY|==#XUXQil-wNXan^^c;mtpStBqo@N+ zU!wYL#|MK57s2+?MmfvkHOW;!j z=V^CKP^db)h|;h=36uda^;x^vngxXKyxL&%-KcQ!sCr_Te@iHOczYTvWSL>i5}#QC z!qBP#jNq0fK%}pgUs=iCIsO6+qF(P(+5lnfb3>yQi_mDp3-CD*-RI0PuRP_KbN`_ZTP! zRQ~ami5OzY;c(nza&t?<${2`jDCp_&?u=E_o4*_=tlLXl#oYt^b&+~o!MPE%5Vm_^ zHUQkCr0X8hO=v)FDDZ=r^_+- zMq~*s04Z5hj~g+&e{}m(ul6lA9w@t;!B9S%&A^^9mv$NSm4_?oapbxpN;%4VH2JE& zz+IvqLx~!)&bBW%s8rX+IZ`!Sk(H4_W^UvB^DbQSZ38}z|Jt2+`QF-J#Qw(+xA*h9 z$C#Z#aY-Ve5s)b7vn6AQw)cpK?ZH>o>HAQY@f5*&#rvlT{apXnUY@z8D_AsXA;SS< zf&}tK*6;NMSYj(IQL(9RTB5M`43iHX-@NDZIAMD8MMm(5fc{R}ue-Y+R%2#a4ccby zs`|N<%UYPgN+f~U(dIKz{08R`;@%D2!_49e;Or1&AWP@mm4wgxwKnvv^c!W3z5EoK zi5)V@7kzJpsr5<*7;2T;t*QdaLwO}%HpCVNkn?rEnXYD>Daemvo6|406zUl?u5!fQ zd6wG)0z6aZA4&Umd0y`pZ=S15(taAlbrQ$Khmf>fVAtgLw2@$`Yf=V-U;3sYXfMcF zGrT*;#cSEl&8WoebAPve`I|q^hz+<+H`orLvGop{obxI`0w4`J7pO+PvsGH~m`=68 zoh_ZEv>=BTEsnl5#|U%q{A1I9qRTiho|aXc<~361`T>$*GxR9taH;1_T*HK#g^@A; zsC&wyHGVvLq&K}v_M#LZfm(3B|MA}*xwqf4;U(6KLrAzwiQ^W-a=ho@17;a*hOh1k zN~>2nTzZ}0r3w?^i;P|Gwwq+J_}3bvC(^k})m(ZRpb0p`ZfJV==h&`JmEXu~e5D$MkTknlgZ$m{vsOMc# zN!d`62^5swyx-SfQicwSF9 zL%xt#sg@$w=IM-M_u=rLz>v%&2xX~HG2q(s#w|HVvgYzhANvZy8{KP!T8v-QxtU1l`sAcuu06yJFh^N}{aAToK)Y_VF)z>AV z1pNN+Qi3My+EfamYKtv{JWzpN%PN!Lk9LVOjQP|+Xmq>ki@4+9_13er?roBQF+<&U z;G$Zn)2f8%-ZKORCh{8ixznZjKq!h38RF$4&Eh>- zWF(4H0WkNB7+6F>!d^YaILNc8_-{^S&ASXL>xPevTB0&b%m(ozhOP!eFf;ZZ!S>vK z;=;m^zygGe4%Z9e|4gNmh)R$92K3L~nHX}5Xoz@qZ#L{Vg2Ls<5efjtS1~CzkwW>> z?!Oz7#tm)HIM^3_E)r3zfiW!RK1k0m5Sda_VCv>}p9sBiE(vRxnNIz9>fS2@WrN?S zU$Wb5X*+%@j9N90BilVml`jPuOXavD;17{A*;gIwHx*T4nowm~n2T#v%&OJ92p6en z)=$>BY7Eu4PhsHlKJMCZBlt6FHXuLXcQa3uV3?LDxSGKm94~FEX7U1AHgecu9eE6Dj(@uz95shZl;%gMvkQ{n7g#e3a_H+0T5eoJ+RAlQQv zjiiI{*8jk()wq^t;R^J?=oI3F--2T=OkneBoA(w{#n;}RL9>S$$~d=lNeehj7e^8o zj6#3y66MqRQbzfo#U0iHAN8g(J>nnHFZI3y+KF!24RN3%k_hb~y_ftg@64xvhQt#X zjLr`D9UQjm^&Me=~H8(U8;v8AgfNiZpAuf6nzuD#3@^ z$#Y&#cL=d=PWG+3X*GxpnU#Mmk>7cWuW0ex5ZB-qEf}@K&h(o1x~S)?d_ZNc>^ok+ z6!|OtiB&8FA$o}m1}oh5WH9Wj1?IA6DlUc5=QWzm%F($U@AwHCbA6JN#d=>SYg>y9 zpZWUlsgE6PjihG}SkJExOmDLz*nkwd!{(C+w1Im%d9c{pWL2-K1RGS9PO(ysXL|n7 zoIzN9H*eGgzajg3N*j~;G5@82=ru53D?CnYLwoLlL!oMW2p6^EPhqCu_*_yA| zMnsUt4LB5Z2|m4Y(1E_eTQ@{}fjlwY)1TK$q&>RRe_-HOr}jQWj&dGi&q4pICGN=c zKI~?gzQn?34~g`}Y5A7s{Esw3*_`YwQ4*dpqhE@mB^_uVH?r1(d&H-wy**eJ6IVuz zsX~{xt!Co_5t< zo&TUC7g6jH*fJKyT+it6z{#kzXiQ$py|R?Bo@kfm^G1lhwW}qCJ{u`2l|4G(!g?2d zTQr-{J5_U=9V(s2hOhIfu|?YeOwrLjPHUoBl}1u;g5EfgSmL|KE6>(eH4_T&X|T<9 zMNqj0!tWjECcGml9`Q<`nb#-&QtXC6*js#268hpP+DN_3?d%7^KXjDO&x{{Xd*#Jk_@-wt@k zMfg9ZTv>}d*YF>OEi{8japM{rRgdbAvM+X<7Kpo zX&fsXKb94vh}*m@i5n|i$l`cDw)mB$L;F2^J@`TJn_AR$OK%kTYfAAa#$Slz!`GkL z8uy3(EqL!tu($9QovLcOzM14h4TpjZa$I#UlaZyX_I)bRq?lld>wP7>5yJ{i0T(D4}vt`5n11Az7Ep{lXNWaZ8V{ywx?@s z_qvt5x2N1e7)zn@IirVg76U0_tD$|Q*;8&5zUGBGk0+3}~0SuCaAxrs?`^z1F3Bsa?Ijv=-LZY}Yef-Ca1f zXkv~0*-~YA6kn^&Z8fI2-|&}D^U|Y2oo5wJohph>F7Tw4`5;H%V7g*mqv#|=)3QdK?|PnyS<>CGxq-dt>5;O_@{qm;Wle8g&qvlZZyvZ!bDM9>(_|S9ruf`lHT6l z*EvP%$;HKLqHL|OgtwD-c=N1?(Is$4~NaS>D- z9bs4%V9QNzSADEx%QGCL-fJ4GFZN_?VG>+3Zr&w(b_2|Ct|A9?GsPKCl6b%4<*mG@ zb&4-3*7H+|e5djyw3_E39j;Xl#4IiI_FOZv0?8e{#kAlgZ7fpDw3Y7mlY>#6XsD$a zw&}_Vxkgq}c8q7u7VMh$d1Ym8PG0GI({kjb-!CL13Xn=Om8PvebiL&y^m4n6($%*; zvAosp<&sNXv%(oA`&GWgpU+<{tyOI;e7AJ-3aoxw$r?Pc!mT7RMJ=mlxV4ocyV4Y0 z+U;1@6@!x=(t)*~;TMwXZkj*wd4M|xKEWivvp9@dnEV|^36 z)1#}XkM}Jd+%~bv46+gD!jbkmR8|*%zY)u9W-aB;;wj{iM;lC%M;VF;VuC2yZRDM# zWtAjr$l-T$P7O)AYF4Lzj!I6=dpO=#YUy4wh59Q>^(7QragQ>nskqZo=C`v}P@gK4 zZ9AmfZ;{GUmE{)UIL<1?zMHL21T(gurWTqQY%z?UD9e#}Wg7cMX7RXyUh?B#!AXWtLmdDN@oH_HB*V$+DJfNn@Gg zhDft!SUfR)>Nj?{$v4-&Y~D=a;*cuGZz@^cTgh=8lbE1oyHe0dm?0vLV$uHa#wGKT z2HEh%q15lAhgj4ut>Kf+NLxnGQ&+x{_Iq+POGxYz<4jwNYm507+C_VWwSqf_mLqjM z(ZN{Gr7mB3e)gQ#grwY4=#-M@io2IA6O?S7xe|WG7*?H2P>P*Nr7l`r(y3CUU&Bo( z^GYh52RecAapBiNqwfze-4vA4c5J? zXkYM<6ML`en#I18XK?qI9x2egQKV{qBk(+zS{3wG(CMd4@SdM-2AO?$JU4J=@kQ>1 zZn)8B)h_j$9YWWCLh-e?hog&9)I39X4V8uEpMvzuTP=HD)o!$Zh2A#Nd_j4w=w21F z@fMB-m8Hclvv|6pT}Ic$dZd@~Hk)fq61=4R7JMjkV7VYZiJtST>il zS+>)BTLs$1r6tsQRpsn{AdzphzqH<_n{^fKm7|?51n@N91b@L={{U^xLG=sY*)QQ% ztg*#s94F&0yK6LGXt|p97-X^ddu1)Oam{B7+szHvi9$npcYPb#cy4)NuuV(D8h4)l z&Hn(jJ-6&H{{RI40MvY0Ewhh{pB}tr;%mQ#nibq}%FwNiovwgtMTv=P`dIh90 z-Ax4d2`-^`CY@~srgx9J+}!G# zjyCV2=Mj{p2x9ZdhjF5iE?t5(&l6*^G>}n;pXlS{Y%v({5*qRl1PM3>K+rdG?PWMQkT#RPzjMtjLKW z59mx2l(%iJCmAToPMdD&Hm5jSR^>Z5 zsI;N)O4gjDttmlCQ;p}lMs&52V}jgB7;j6dB-sQTZk?v`tY(e{-03*;!X#|5Ow6kH zQ%5GDYYp|Ojwvq|C?sHzw8l7m$oDL9v#Jp+0ovPaP%?)eU9!oQxRoNkx|%UEqT4`3 zYc!G>%)UvMArz|7DGU3-EU3){x7&b|%yQ9}vo+92_r`)aq*Q35`#J`RV_+5-k)ufE zVG68|wdGiYt-8r9#kbO$adf3R5vLaY=N+J(l6=wTjG~-xcIr6ZH)>K+#VK>SPMwvY zxgzf;dU8^3E<4&u#a(hfXsb$cbvg@so12>`VOXuBHmcG|1;xTj>$T%a=b5h7C%26w zA&hX&&eJr$UA?*wFj}$HqiIw`k=V~~@?PHF#-37P;z+~@Jd0Uwh+uC3ih14ql`R@2 z(QXv#*V2Ebytevy9z>Hv3rbp1I8*XP1**rGva_$9a8euv8Iv)`0M)$9n_E>$E$uAs zBzt&XWM(aP-@d%MxFRLEy0{DFNTw!?MHpcOXrp3MlTMR#eUrM2vQeF#+>}ywYoyz= zlW9A);M%C=9(X8DQc0yL{BpHB^K^u1w3Q_nbenII5ofPQ;~T||6hjPwQ9zL1-o|7B zKn`Ps#|&k@@ko&(Ozn*o0069|@ghR23O#^WfQ>|!yWA{eXb#b`BRBvCWJE&QDypOa zR<00k?-RS%-G`U=U!Pa&+uBbTrK!@kmi_i$x4UiWH`A@&n%}Ok#ea#uCHSx7uNr(x z*JW6B9}w#@Udg9BMC+wPyUWw`s{+x%DAM$uE-Otg*=>YE$4a+?)(BP@);IIyeMUui zt{vl@Y>J%0_JJxoNrq`!WRVgykrc-$5=9A&l~`gpxn(u&tasAfJRfLt=f&nj2yl<) zBgYi04AIAItWfL--c0DS3DQFy)H4aT+oMZwY|nW!7T7|ER*i2M`5;GS9{Jujcw+^v zPmyyis!RTvHd2(O8MscH=51b4P1@x_Mds9Ti*WwW%!cwPP6g7t=^g99V1IN8VYI_ z9x>H*sWdCy4%frl<*N97l2z4p1&Z%aGezQ;+M-3MZu=T6TjNNQGJLswk+CwUU&;WX zCOoo2!!f7~&nMEq4m@9LWYJ#f_ZRj)B{v#%{eo#;9-iOCcRnuC?w-p<@Hc}spAYNW zY`zZC{B@zS#o|8~E}b5tl2|sD%O#TC!>nUcE_7-_Qs+{8$C0*_qU7x-3-ZM|HO)EA zIVDD|)DLF>lw~@K(Wz3L=|;3AQO<|9ilID37}0ex6U5S^D(eML4NA5$SoeaC7L8m? zX<>0aW~()Xx{i;k>H3P=TG{JbRo(upqo#|ic#2IA;&+FxY`j6DUCZGA026#UWtBB? zsk?kK@a2x1py}57rS_fT&mY}htG=tp_(N2iL3_pVMEdTg{utBOK-at_D&1**8@Imj z2CH&3h`dQH&b@zUum1pIEKq6|x;?CsY4GZImT}leeQ{@T_Kv^ATIPwYS?dzmYT9kK zk7H{kox;ti4-?zyeg^T*qowMp@SouS0ET>T;Vm!35O}Y_J|)zzbng{v-Ub?c7M9cM zcWbCFkFKSV`99xQTZ^eAkHhv>vCCy|Z3T{+mj>Quu(OUEtyb>aP`sXbH7!BZ+}*q| zLuGL4%WGwCV;HrpF!b!BD$#_iNlH#lROE$blBXYf7O75*W9(xYN^z2@I7it+5sV7h zg&LBc4iTW2BcP)!9Os3pO9={iX9pX>!wF5-uPj9hvW;xR8HlTw;w3``ht0A6jqwZO z?~J}E>$ct`@m0fLt(A?wh2fhdv$3|1K=A&avnH3K>2`5NX9cCTtcF&VZEUTc^7d^@ zRlIwxTH&UbmN!imtKBW6(8rs2g9y#K+Nu_K-+V}177sed9otCu@kru3iIQe9*3)K& z;?)$wt8*-}TL^r$@?1=@#w3#7IBvk5KQMU~@=GLe$ivL?(ZfVi1u=^ZtH8HRh1MvU8PAh6X%yeQkUB>t%Bn1ulRDfp!E;%1 z$@3|DE5*3o#_g#}Fj9J}Y0TBE+q`Wj7i*^)O-AsKzwZ0frFYENG;JyBrsFBcRn5sM zd|b(5TmiqUk)TCHPq#o7V6d=~ z@!+-He4#j0+BY|9rmQiIQ!07QYMJ*JEJGY@` zF5;a_Ms6{ttkv66+Uc%mXBOSud92qYQcbxS`#4mCsOcpux1*-{txicfN0~V#IZ9Hr zZ8sM02tvyq;`!!~Ng%glxg#we^3ou7jUkZCW^&Of5u{Q)mhQzFmPr~kOWIY;B4~H% zb6hpLxMr4RK4$0g;$aebZite!WQg8bX8E7xaTKWeGpM@8bi0|FZz*iWy|KjdyTb7# zu)}HP$skpD!!&WuWOB&zDR!5o)8Ta6ANG2e6UlMHwh}b$DRt-QFn6Fk*Hsp zZ5c^LG`*yjs_PJ{seoBxvU!IxA&CT3|*114_JL00EZf z77PbM7)gc)sA1G|MK^;@x9qCByWLTXPVO&8=G#un&hK@r>+F4cggwVbt>f;$aXn*Y zyRUb)?^ka^DX!$Tf<%TT+bWOwZLpvoaf&6|ZgB_zM(S9Sq=ef6Yggwr2`(eITbG8` zHIxvs!tPZ-jN6ovOfmV&V#p=f$nNgaJICe08AVMrqS{MNX6-L~Sh!ifYu?Q#t@YP- z+rl*9om7)aC?vV1Yf2GMOY3y4uGe<8-SI7CkInL;^Hry1igk(7-7aHkS^T#qJEe{# z*rY||OsqnOEU24$&jM>NW8$~Bg5J$;HG50#0^Z`{+IyjhTZj_MOEE>TIPDX2*&8Pt_ICbi^s6l|sOM@dS~ElD@bnw6Q?frM36 z6q;2jRHHjNCh66~x^s$Y-ZzC>iApU>4XHuKQHxza#OY(1v}rAD7e%qvqPd?&&}{X+ ze^t^vJvFOGr|Z+(9e(pry`Fy)>J~rR*OEzcKFM(;o=BH;2GfUZMOMRPHEsG_F{t{OEOPI8>@CX;^cX+c{{D?%zN$!LwG zLXw3$Mf=W;*F5agAd8B2tLBe)ABF~}rkj7E~p zn9@cL_{b<9&M$i-@rn%%1Q~_g$Zuuz1DE#D-D7jk7b4uLG7Sc=X+CGXu%Nt#a!6b?~7D-WLjU7}nfU3$EC;@N) s1Pl%aFgT)$Dy0Z>%iUiS@>|2A)2q|W?Rd;mZ7R~T(P