From e957120480380fe7588837c7f831da03dcca52cf Mon Sep 17 00:00:00 2001 From: Harald Kuhr Date: Tue, 25 Aug 2015 12:12:10 +0200 Subject: [PATCH] TMI #169 NullPointerException when reading JPEG image --- .../imageio/plugins/jpeg/JPEGImageReader.java | 32 +++++++--------- .../plugins/jpeg/JPEGImageReaderTest.java | 36 ++++++++++++++++++ .../exif-jfif-app13-app14ycck-3channel.jpg | Bin 0 -> 26698 bytes 3 files changed, 49 insertions(+), 19 deletions(-) create mode 100644 imageio/imageio-jpeg/src/test/resources/jpeg/exif-jfif-app13-app14ycck-3channel.jpg diff --git a/imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/JPEGImageReader.java b/imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/JPEGImageReader.java index faeffcd3..86c53931 100644 --- a/imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/JPEGImageReader.java +++ b/imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/JPEGImageReader.java @@ -267,10 +267,15 @@ public class JPEGImageReader extends ImageReaderBase { @Override public ImageTypeSpecifier getRawImageType(int imageIndex) throws IOException { // If delegate can determine the spec, we'll just go with that - ImageTypeSpecifier rawType = delegate.getRawImageType(imageIndex); + try { + ImageTypeSpecifier rawType = delegate.getRawImageType(imageIndex); - if (rawType != null) { - return rawType; + if (rawType != null) { + return rawType; + } + } + catch (NullPointerException ignore) { + // Fall through } // Otherwise, consult the image metadata @@ -312,22 +317,10 @@ public class JPEGImageReader extends ImageReaderBase { assertInput(); checkBounds(imageIndex); -// CompoundDirectory exif = getExif(); -// if (exif != null) { -// System.err.println("exif: " + exif); -// System.err.println("Orientation: " + exif.getEntryById(TIFF.TAG_ORIENTATION)); -// Entry exifIFDEntry = exif.getEntryById(TIFF.TAG_EXIF_IFD); -// -// if (exifIFDEntry != null) { -// Directory exifIFD = (Directory) exifIFDEntry.getValue(); -// System.err.println("PixelXDimension: " + exifIFD.getEntryById(EXIF.TAG_PIXEL_X_DIMENSION)); -// System.err.println("PixelYDimension: " + exifIFD.getEntryById(EXIF.TAG_PIXEL_Y_DIMENSION)); -// } -// } - SOFSegment sof = getSOF(); ICC_Profile profile = getEmbeddedICCProfile(false); AdobeDCTSegment adobeDCT = getAdobeDCT(); + boolean bogusAdobeDCT = false; if (adobeDCT != null && (adobeDCT.getTransform() == AdobeDCTSegment.YCC && sof.componentsInFrame() != 3 || adobeDCT.getTransform() == AdobeDCTSegment.YCCK && sof.componentsInFrame() != 4)) { @@ -338,6 +331,7 @@ public class JPEGImageReader extends ImageReaderBase { sof.marker & 0xf, sof.componentsInFrame() )); + bogusAdobeDCT = true; adobeDCT = null; } @@ -346,11 +340,11 @@ public class JPEGImageReader extends ImageReaderBase { // We need to apply ICC profile unless the profile is sRGB/default gray (whatever that is) // - or only filter out the bad ICC profiles in the JPEGSegmentImageInputStream. if (delegate.canReadRaster() && ( + bogusAdobeDCT || sourceCSType == JPEGColorSpace.CMYK || sourceCSType == JPEGColorSpace.YCCK || - adobeDCT != null && adobeDCT.getTransform() == AdobeDCTSegment.YCCK || - profile != null && !ColorSpaces.isCS_sRGB(profile)) || - sourceCSType == JPEGColorSpace.YCbCr && getRawImageType(imageIndex) != null) { // TODO: Issue warning? + profile != null && !ColorSpaces.isCS_sRGB(profile) || + sourceCSType == JPEGColorSpace.YCbCr && getRawImageType(imageIndex) != null)) { // TODO: Issue warning? if (DEBUG) { System.out.println("Reading using raster and extra conversion"); System.out.println("ICC color profile: " + profile); 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 63f982b3..5b83076f 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 @@ -1491,4 +1491,40 @@ public class JPEGImageReaderTest extends ImageReaderAbstractTestgjpk=lQo^B9iX0`^J4MET>XbF!1!~@=J!7cse-3h#};^CWu^MZFZ9$rWqJV8Q8 z9lT3|=P_`5M)FVLoCohuz^x1jacO;h8oCnq5#+Xe5J^OT58?qiBP%&OPhVGJpg*9a zs;aA}s;;M|A*ZIPr>>!=rVD`_uTJO60T=JpY3ka5B;S|!BV6*}ng#KFDc>weZTM>) z=789*byxu2|EL3dh=+HYnk<0xetEYRo~C9B9$dm-pPV*1`(V= zNOY<`cq0plm-88#GZlhdk8l%nS|KAyboT7oLbFAMghc0w2#d^<5*HN}ms&J`zSR8r zi{^<=U0)v4fgk_5M0mtRM8xKZ&7Cu6uH>9Kb0oQcb0nve&HGzKo)s4)C_0M-{CB{{Gg=z(X-cPuh^JXEVZ+Swo+rC-!UQK1q&A~ULvocxN7wpO)YJm zb-H>+n~XP`n3`>|vbM3c+qK)?#g*XZ?%}!LpA>K?Feo@A{CLEP$djj{;?Mn_a6a*0 z7cM5JT)%NM^;X*L?3~=Z`}q$Z7L=5hl~+_gefGSzuD+qM=}mJ>XIJ<8o)5hr`}*m_ zBco%Cab#kWTQ45a5x!nOt=BwIFJ69rK7K)Ny?A&7!Ob_1UtpQqED6IMg3br$FIPW0 zTXN&sYgxrYD>Qb}r1tsM2rpQv*(p!wR&AN9HS14pRW)0aF|tHMpf5h<(A!4KNPVl+Pxl)?sMoZ;@J$rwGg&Swla6cd zxw0<4f0ZIE-xD4N`Rp*3gnqnj#Ek5+>)fIT$5mS#p2q83SbrzjRZYO!bFtm$=VRnF zMPJPa{K(cWl@?@s~T3sY+SyI$Hv;n+87gH<9P^sm352vMpe)8#^I8+*Jf>U<$qe} zD-A#1^Z97%p4L5m)#>bw{aMu*+M|UR`2_HU;L)I-fwS3=od3fIZ&9L z;U4%T?tMrt?o-9cgbHNFfrM^ma-fZ`u1!>Opz@j@!i|S66T2?&XWA_Y$<@}L3>&?F zc4Ongmxr!yw)NbT0?Xhz&~f()%BX592kI!mplgrD0!W=52fF6Ioz)FE`|*cxAC-0* zsY6dl!>oly(>czrj=_C&&gVeIBpk~TT93}Rz@rhDjYi@)P;|<7p_?42M5Ehsa*+=Q zqB)9lpoJ!^6$Y9hyA$mkNZ>UGqLU!A?wFmc-r3O_ucj?YJfxrxrTAkWvs*rnra#Ec zeYF0g%W!hRG2L1N1Dmt9HkOG!6M;<{IuW5Rn(7--xg*za)jU`dYSeRJ$3qD?ApK^o z^0uVw&7S3~I(MSf!*kMs!KPWn*7L282)rsa)5C+u-f}|7kOS>;<3O+P-mbDehi=>s zH!Y@)D(%1b{LYPCgk5{XUx)uT`}5fpvlaZC1TMenfOOs5Z~?Xt*nXxx^o$tgtt+F< zMedteCG6ce_jzg0{yw*w+-Du}g7@QIBrMTs;k}$8Y|x0mK(@^==ryj*#V_nzaM3Z_ zzLcR>s!7Uwh)@7@3pH8<=O6Bdo%KLx=&4r(iU5A@udWY=? zl;Y@utT=lUcF;Rm{;E(R=o}cQl^p0^83&pawP~VT0+x+438B50+38MnWekX&i` zo@LgV+JFr>e2ySfXPy%6Ahhz0>BF{Qg{Ose%+xmd^k5D&v7q4jD&Esd%ir!+emG)$ z=jgCsAfMMG6&7C0>2@vrbc^_8w+p5;JJ zI+SM~yhJ_@RM~V2H=u??!=(ajo+B94pb%8j`4k5lU6g+NDsR-PKi$GJ^VpwD8I}k~ zA5?(>;9zqR`i=(~CDR-l`NAP6=?NGfV_lX^QA-YVwcOFhuSk#s#brvsZ}!3LS!?=l zLCI08ez?5~Hb=bQd$RDn%MpX?ulXfr)X+=f@C4ksBDeXV4?Bsm`{fgT5+c+6u1wpVyV`cMU z;y`_IsP!$rrdyfIfPB&6KwIJA8=J{u9HMl%bpss%2=r9jQ*1-~hn{1j~NX3^nO3J+{s z?p@-!b}#izAUBS0a5|1h89afC@bx*BPGKr;&eZ?ZAMOY=O;Kzr$jwW33Ul%IVZM>6 zu+Y>$_~V&QHLV>3#h9B$aqd*C@RXv=edV1h&)5{y6vDc>ff#S_KWhrY^96G4!o_b8 zbr8b?*@OSDI9gK>l|LX;G!YPnpaVeX{^`Z{ksJNfD9-;RZi+LrxwIi}UAcC`Z`1b| zF3JKZ1WmQr6z&pkkk1DEP1lDTgm{jCTN}L0h0Gx$6acwGa*z$U4}p*$={r$jWP3amjjRg?fUZt_<36!@3ID2ePJ$_`QJk<{M`xP zL1sC7ldPTHzk|(jA%Jv*Ad;ECskOz{eMF)+m*DKL;O~%yJcxcFhTfj;UpXZ{U3t^5 zV31M}*j&y5-X!oUbco+;Q zJYX3>@+ZvfIKtkbBmD^~x{pW#9qLbT5zxdQKcY{KuvOfQAW?Ah;Am6t(~@c4)H}}? zImLBHOm}GhsZ?BiNSHeaxJ*0>?yKPSI0OwJ0r2h6B4DroI~M-&|FMPt|IE5SI>Wke z17lf;Q^tb>mHghu2fh^EuQoo4xSP6@$T0$Ni=Sf(by4@z)w`FsK3e30appcwcbG*<5G^g9-BWF_U|uSu7m z#VvrKf>uc_C`8IaS7RG(5~1r`5&pUaihmS=^S#k+9d9PTdS$%X7PFP{JLAn({(k+; zu!?34;jZt9!_tm-D|3BYl@$AX8?R8B4rWym8hTn|Uq-&}AJ`k7m(RY^`YG*#&5pzD zg{_-Me;)*7Rs%9yc7ng(0j*Td>#=Y2t@R@9O8W9`7_5s2)dmQ$W7xx9iK_KW8uco* zsGFP8`_J2GwqLf8pewouTPwzO8K+vCGSdG++$qc8Ro@_K6f2RshTJTAy9^_Qvc z)l5Tc`Z&bTg z5o?;p$?=EP)RYSz4cyFc+cc^D@ajWgiI2Y9+&@0x#=aG%F)4tl7h0VQ_31+lK_3P&(HPc}2Nuhf%RuM7eC66W&@a!Kqagt> zdMG5a9gkYLlLp|s8@$%1pEkI=Z4S=zRldY+$4JLYFTSNsdQIook2C-SC1(t{GOjFz z*_Boxy_qt#H`NaKHr#K8jRD2A_6PbqI8YMK5jW8Z%>TCmxCu?_hw3IvH0U7c5i*vj zg}nL?3BD_k3F^%z0pgJu4s@`7n*8_Veor?j4A_z$mN}VMzvOv~)A;;7P|d^2K63xZ zNn6L=ZCG)=i|jSow=x)Zsd@Lc?&n=;C+3HI@SRK_tLXQ>!GU(IQqGIL+d-O)%*=Q&=Hc`t4}N+G@Ym>t<|*Vj^M%f6~P7^F;Y(s|qNm54c46JlpP z*r4mwFmA#QVn^UY%+jE|};KI{h?E#%RM@t` zUt_(=>Q%Y7KG`{pB`PIfa**C;prR}GT+aJoR%2EvoHiPkw3@wu1MNIrO$%t~_flqz zzHn%wG$aK{wMM;kP>Wu9&gOi(O%*jTXVT(Mm=oo($Mm51Ui#DlURtYsax}PdJ;aA0 z>?>8v&?{-o>RmRz!&pl9)mv61Zb5a8x0%^Y{(jHx-DX?%z>VT8M^YSX#f6C_j|3{& zdw~O}37CN;x|FkNt99z(KKyRnC>>^7nBU%$`CV{^Se+qftvK~#HqY3uleuVGQp4~z zso-t-DW~^{D8Dg%)^@?|`D3d|#m_lX@2IG7L0P=j=JRjfo>pizxK)17VC&^4U7r)l zfe)R&>l9y$xo7nMX)zoAyUzGE-yhji{Xb(*Bgl8h;bsSsfdekmY5u2q=<@P%Iq1$5 zRAFfH4uP-_Pa(3p%bL%|Fm(pJZUufNVd(5D-=xiczCZyLpN)qx7wf=ejjQW;O^U2>JkInr%p4xy0PxIN8emLo0W-SmHvo>)Jf(Lo1DYlT zS%Dj9rVu0!83N;v2 z2TteW01p!BfF2g>>%Z2SyVkbWh3JC~az21nTdRtN^l?E4oL#&KB)NSAU{`HW9C}1m zl=F1mplGLMp=xo!h~VLA8sbN=3fX4u65{2e>#B$|5Y`XU3-USOLm)ZJ1^IaU`s)R4 zP@E#J2j010tfJf$3dw7O;x3ErawK4_czKfKfKNk3eVwwLo1e1}A&}_jC8xGlTM-cS zb9K|(xoPtkav-!p@k_Y_0|VCvYOE#txntFIb#<|->R5Gk6@a1QAM8tV4pQ;;UjcHP zDu(B-Z^^!^uIH|)+JcOP<)*UQMDTa<^E^QEB>Kv6vvvknFlmEgK!B&K-ac1?wwi{P zmWrFMtE!5cnyahIIyG%=6@tb-f{vT6hKtKOXGLMTFIf`6TItU-<;Hx?R!&Zz8`PV! zj;sL32?m<#x|+J$I_kPw`q&@i0QG77?Vdpd?_HZbeF(n(psWTOYN}tbe~kG)$?h3R z)@ja6G9w1?0?V!Z3}*ZVZ) zNuF+h(LK2_GYZWO>H$Xz0gNf`urN^5$NmY%ZKx^WuAKybqIbX)qK2v}_AByC_&4O; ze}Oy`{tfvLTpM3cl7ae{Qv3k^&oB>2$)C6SSMfRBbwNna$d3SAPMg4Oz}>Z=qN=W< zreXbc*MgF&nw}~cxj$fXE6oL25M4dpg8xq98JJ%aPvs1JF+jq89XDV5+KkN2dOdI%+hi~` zeWZtEqr>>%{u@7_t?)2fjPhCTW;HsudP+jMuzE5|bKK4&(L34bi=t^`600N%` zC{9nR008EtKSaovEY$u^7Bh%(Tb$bkEi7hMa!UGsf&Oz-6XCkacQb8rs!G&yDEk<4iK}^l^44VD}#&xa(v8fd0I^ z(~~7oQh>UG{iXnM+4sMH{mSGY@%R_JezEHxao`^z|LR@8*!7P%@Q;vx^{!v+`bQl2 zN65c=*DrScBM$r{OtKVHaVc`9l zKc>xew76nJwqDI|0+Kua&D$=4rH_<$il4fog7kGz#o+yy-5J41+VxOb4E6xwb6r^VisKZ;l9dUx_So+jR&Zc608(B3#e#HO%C&5;DSp!qW>~=sKNE zWtPYalQK-Wf%H9kVud&_+G-V4*@+7u+vWDKw$O%-Ewvvit|C6UB3-XCm`VC{VU!(M zzQFc;&hkBmD~wn3ZX*5*c1~bLz{R!HMI>xl%r*1~*- zEV8V72w6pr2Ipkl@h$i+%VMgi1s&g=IB?;1C`22I#JS(acUGTB#?K42tRc&Apt7zY zM^SiylJ zmtap{r;U!Q1mjNV|JLQGQz1L={KViLJ8Pm4@@QL8ok4xprbLYEhz;-4ya{7a9w*RS z^3h^F3`?Skkw`ZwrM4XINUf0ZXPjVPW`)s`Ix>%-OIe#~?Wb7&-59A*U)r|x4o9i# zW2AIuoMfLZSqdC8I@7>UC7*8JX6OU*Xj=Kg5^y+AR9niUVk=x-pN!#g|=zunCX^Tu01(Bz) z<~xTw?QdylxE%37X|Zm+;S+tkzIlVMHe~BE-Y@mXzaqxK9cS?Oh%8Ae1DrxRcBP#R zwv-8t#YrKV#T+OfcSI8>h;*0Y=CT4is1k_7wub;~AK2@r7vPl?W*{a~w&2~8$7W+H z_QAXGedAFtpU*BkI0&(|5qZ$gU@yxtG77e!VSI6JnC2$NO~i%X+AW`YEYyfTYkU)8 zb_*ZGfl6(Q=F%!sl07CXGO=Y;vA)U3(%mbgchIGNKiF!L{w!GUrE9E0%t{iIK~1E- zp`c;}HrNK@%z;|&GrOCP7paHtLb7Pp+Y$F}aUN{u^e(8T>60Of}LCePn<#5aG(+Y-!Q}-__?59 zKfp~`>!TT9gIux>2f85MmC1p0Gb;1=k-x#;L$S~9jWwszRI?yAa}9fb+cX<|XWe=9Fp zF!Dv3VVe?J}iQXElW?(ng%< zbJA$NB^NVdNXgxn6pLCFishpig}h;~wmEs5dh*q}iiMv~4{q4_{@_I<4wWfqE{1EQ zInc{UI@oiVbP?D27N3>Ko=0Upg{9z$hgZe(Z)Ki@e}Ja^IU&Rhi9#a(4F7usuj6Rj zuy3mKi?a}x5t7aV)ze#aReTKsb`1%{gHGs-)`pC=hog(gEf|6Mm51~y(mOw8M!v(* zRS}c!>cPhnlOyI0q{kX1c*zbLIVZD<5bT1jPBjiBu2kyXJR~A$aBXSL3qVaK)`Jl1 z;l_^aju%QMs_QOK?9Ns;o({e#Ss>Qxmw1#zv zolMlS2;9|>SbWjJ;l3N;KL8==zViI2x7paZQTDsG)b5O&EuKl1&87E`E^1-9VP=~u-lb^30 zxV6po!NY{=J?}3aA?N>imiMp1c2DqGm8?saEGZbR9`CG13+hmzbUYaxrK2~cW_5J8 zMe&-_7r#;Mk}xkfD#j@vV1s zJTY^}80J;cdZJiR3`}fCw#G%~6?cjwExN{BqtRB}XZ2-2_M%1yvmap0LCX0N= z-X>gj(jbm7vI&em_J^uVuLa+bxW~Bubeo2dDHkfQT@^?!A|N-IOUTcu()zn~V#z8j ze#D(FUZJC{ZBM8?6>8P_XoHpQ#Zn6+sfcrJRTsqauKRBCsxi#GP^5=efDVa2LJ=^) zh90CR4&0zAw3fhv28)A+x*|{ZKBUDadI@`w`DhhsU13`{l%3qE&ba7uWLvNt6f#%5 zPEToKGte^pSz=5uD;NI;cU&kEMpEc@jDyI$uFMz%J|vY+>?D?7-ihV&Y^<>GtuFTu z8Y%H&XiMnNGo;m37A#$5{^CQheDwKuf}h)2>+y`)94N&cSplX^+sk04e=XRWn%cuc zlg}5K(JTjKn9`v-bhn6Z3WQcsg$fnBF`{@e^WW$Sk)7+MWgIrwOX$R`y@OrmNZYf< zwDiDxUawE&cWng+{9su>51#3nkowGI4`_NAF0G_?o`_xVgxI~G$6@817 zf;$ytc|prWvagbGEg$f+VXz|<%qAu79mH&QDmtH<82KqG71wq}vYs2O#g~rojzB(fp7JPiz7k z6~7C5fQh7IX&ncmz^Bj)zuQfKDWYr*evFKpNN-1XNWwD%_P8oU@IO-U?XY<0WFT9K z^%88Il)_F@!IsRn%xm+M!QU`7j27>VzB2ly)mNcTl<*;bcf@fXJ zQtwABJk^5`=|+s>G?LTuFg~V<{SxzjubYLRynQpOGB4Gfx?X%pMOvpSZH@njE!*>| zKYxf?$0xX0P-f)Pp=xjvIO^QqKOa$D#bdH#jDZ%~Jp~#Hejv@0c>sMz1t&gT+2&m) zr;6r(q)M}N+&ci1k=~LehtA#(I=7Y9+%y_yS+>OYvRB6S7IW;W(HL!?wLLdB?yO~4 z$u{$@n|v1qp`l>^={qc<&~yUspupL^r}L-+tbO#}G7Aw#JY6RLG%<8pw~S)xeOp-p zpxzG#R-jN}eJCzC*}-)eI;kJ_7s@LFmo zi%Q$F7VchS(u7J92UlDPkDFN0TgRf~f%aZ(h_H|0e1@2s*cPk%@CR_jKR<-!4}_L0 zwIdb}W@BWP-GDURtJ`D{X6nHuZAfA#rR7s4Ra6rv0hhc*20O4>LDI&E4o$o~#O(wL zK7pIhlImnqa=cKj`p*V+T6YrT7?)#|Oe9T@ZE5n1-Ffl%75r4pYbFlGJOgS?G7xCD zf#xC2GzBUfCFQ5k%tkD7LL8m##ep^(0tH2hiHAqf6m(fQ;2`KRHD}-t&(WrKpfTJU z*Dq(bf2N$H(ojo8ej!`N4&B?{V#0wgu`z!Jk+a}3RhVXkpHvrTHRD@AQ&Yw;bWsdz zZWDSMkk__j6aneNHhK5~^BC=$0Bt7z9^|?Mu4#Zjh_SE36V)|8fi-&UfWn zDc+b;>wFQ52P4DHm}|f9FgCmT7g`|?Fl**Vqg!8ew6p7RZ2KbJ%>48&45GM@bs@2s z%De?n=7sv>iGQ4T$A4%8+Z_ZsGG{BRF`Ae?r^j3V=Gh`oZ(lP$0Wkd z*T}Wh$(x~`PIh2Y0z7)Y76s$2nZ*L5rZJFxzAy8b(^YW#AF~;D)ZAfg2&%l9y-svp z<#V%&*=ru`;W=XgnHiIfKymeP9oNy-?E4&OKNeY?IWUpITKhVbFO~eHJ=Zv~7$b(9 zGo{O3yZer{Ir|Y^vHY<>-k`fhVV&~c*O`Y{T4wtHT6tOH(2Ga!1*lFxeq7?|>>t;d&8xD_e2PY}^BOi+1T@?`ImxYBtjKPZ#lhURg&0gp#+ULk%tpZ0Que)9s z-IDy}bK}h=1LqZo1&CJhnTbX%<-KwCgr8DM<^m*|se``aK#Kxi;OB=rAR;t}uDDam znh!`yDsY!hNjo3X?vPuf;+vT{nCoTXP}Z^_4JO_&gwx(u%M?7#QqFnWX=FM94Zxl5 zpv+QTN5&Q*=c3LSeONYIcseAky9T+q>m) zAVEpceH_LvFWjEhFdBw0Z_m$2y|Moyp{?lJ&HfPZ1)ISa9ZHX6Oe~9X;~gAYrCZH* zn!258(Ot3kxv3nb&xoN4=1*H(M*=SULY=-LU9fZLBopBm_rpjsTlJn`{k_HlqwU}e8G)1`dCn$xp47rmPY4g=`FOO z6D-{>xRq*11Ma#}6@xm{*P|-)P1z4Zc~blAwc~E=GV&ta^t2~L6drJBEnQ;7zvK3r z2uK(&TC~|8Nt>j+j$=tmqgz)nz~Ii=$i4xOZAEIS2Gov5N^2@(1N#)*aSkV=Z^g7l zYp5ayf^RIDfuUB^I?bWQNb)Pp!l0-|T=OReKFWj^cO)0ELVRh^^G$~X#bgt1zBAR< zc`;0%6anhYEO3NzHanj>@S5tmtr@7-8r|F4K8={5V!*w2%#U1#$**QfM0Urjl6`~TDeVRi;p;ol2R}u92B`sd~S50C*E@{O? z<(G~%&%Eco0WxDl4ciBSx$!cG9I~q%$?iHDqBLt^zx!rQb>U z#B0xj@rXkFEzcI~^Jfs}fh|VFv_AX1fm0efjAIF{il4<pm6N;FR zVMbQfFOdb(S7d!>K3fvY2V5Y#fy5gw$wC!aIGRai-0>mAm9Dg#Tv zfCYSeA2t`Aq>Z0oZRltdG@<1mXW>$U97<&|_wLtfV#I=o=2B%^|Sz?`Y%nD;@%@F}UOPh>D+=)y?PLU-s&M*e*?y>7|@pjhsEA!}Z><7r-^P9bDKimds$A zg|ejV!%@MNbI{9039Ra%QbrY$MjJ=x7&jTrLdF><>I>&HF^D@V)Ql_7oFAlEVW3&Z zQloj57A?zd2z^nF@yfhY?S9R3q3x;RXSXbsotG_gZ#noIrcOp`7&E|R2BGDYyhHh2 z7-6&u&ci<;#u}`mCBJ)?8HDdlEXT|aN-sOFN2X}qz0p_{io4P8-#>!vd515R49Qh} zcGE)n=<)}F{NfoqE@w*<@9VfP-Vn%B5h6RvLs$Gir#S+Je%9VIa7Q9lc3~R6wYw|a z&vaCG$66Fj(|5ZsCOVz1wpxu#ez6!3PCOdh|A>KEczH zVk{{_F$XAeURQyY>n8ZJ`4#V|on79T2>xbdDNM7?Y{oJ?*^zL^b+Arlh(8TyRTpDU zP;$g$43?qqWalE7?mh$lAd^jqLo)KBvprhhhZbED@+zSVI|os(-duyt_*{tXc6714 zNNc^@FnB&qQ^!)@T-ca>cH~OoJa))I$|F|fU04r@VM=p)cT*+41uRV*?Z$+|LZO~? zOi4Qr+>uP3Q?!yrXk;m-RHyF>)uu^BmQjusTpo`uwA0jGVtdp*HHggcRD|0qWpd8d zQj_1JvW2l>8m|t<^=vhh&wl+gH%r4$ESOv01T+~Rdl2cqWH*rq7i*u60~*s}xY+S# z{5!AJYeSux!EKLkRG(#}+ZM7PkTGpx@!d}^cC`;`S2)J?JW}Xczbls7r-bkggaAK+ zb~~cLuw*R_2Ek*+QlHvs+ldpZajl2ZDiKBk2Wrsh-ZD%@Gz8Hdf%JB? zy09DCW$K z$gm)RgX|1;2Twv0ZQ>+ z+`wTlyB~o+9YPjRYd8OOWLl{D#Nz6%)P6Dw7aLOFmwa(D0lUt+I!5U^Fe_hTCXCxF zVJ40eg_{IcOmd%;(iHZV$$?uLV&?q?*NDBDw#t>6w=1}(dcZTwpVgC0mwO=gx zlkxhCCBIlQ(}VPL7svmNUXpvef_;Hasxg)lXbUt1Uw>Ta_!{W30!<{axX2UG#@)Z< z_@@Zy;$c-FNxscRGd1Hdua`ww76Gwh;((2&Sl%83T)%}YXsMlWc+-}1w2cI`8ZX(!RLfbPcoawx6l40n-A;1*ZaeYB3(E2Jz{pCS zK{Mt$^fe}%dLmSYX4D;7iiwt8gV+|lrAUy(BT?0w!X0Tri}k(eN?qF5I%m<1@1F}G zO{&th&R;mF5=Xh$X2O4W(Q@s|{svePrnxr_HLF{`$?slRf;)z%9cW@nRhPqy(KVsEh*77b zNmuINP$v^35xSjT8NuSY`tDN`3_Mp6c}hNWs&~piYWy5VRkbI0$(^%E_- zc@s`W)l1c1&dZvb&&LdzhM}u*GDSQrUj)N03|&K34_$^N(9#OGlX5b|=TJ^w5pE1! z#x5$rGGfoNv)Hi#;RhL(c`fXe7sITNsfTD^V8K0~F;lffF?h^NU!y4oFLAy~RSbLZS z7I8j~Q(dtvGkiFX)dIYwe}Y+UJJj%Ka^5q`l*lDdCXh} zcWq%U2A+c2xSs(p_q4H#pNW5fgIVvtTi=`+kYY;%M`AH`Z`|aDp=RJ9lCbLl{&DT! z;hzDW9NXV6J%hTBQ(pbJAp2wZpYYZAS4qF|G;V?_%BWI*7CWPE31#qRGWVf7({v} z{mqP_&`P>_M{flOS{jt$6Ziz5H&iwh?j#%kyrKoik2rM3JrS4mRCRP%q0)G@AioSB z@lKhpe6Ib`ERt76#G-wghG+Cg$yJoR#ZQ0-_Ee}ZaNI>>n9CXO;VNOEI2%Lc0M-U} z6j_J0ns)wj2R^brpHhJpMJ%@zHeqwyBuYC12cquV>KH6<%CnT{uaJU|dUrT}vac$u zTzR>6>H87Kd+a3K{rn2J)5=Z%kP? zIUH6nSS@2Z>5e%&y?JI;KdyRAigh1-jiY(uS@Yub38g>)ap&73+3GRUt+WiZX{;PczQ zaX&9j(^#GH(&5jtuQ1Q!-aDXjzyvww2o{EkgP^MQX;yRlSJ^7za>m zczHX0mN-jd2#ux=j({Fx!T|OD=#cVrf&oDPFwuV$nG-pjGO++mC#t}Y0gr-wi4>L| zE{6)f_}_;4DaFiBH=}fW-fp;rOTawMXBmbAujwPOq%*_>dm%b&*q6Z;umvCgf+Tk_ zt$J$!_mr@4;Bz2#q>s+m0v5=HE=Mwor#o^voup(&2 T)!hEwZ+HJn_dV~xx6J=P92!I; literal 0 HcmV?d00001