From 90de26fbe5e2c488312dc2a2c575c040a12b7c21 Mon Sep 17 00:00:00 2001 From: James Jackson-South Date: Thu, 23 Feb 2017 11:07:21 +1100 Subject: [PATCH] Fix #115 --- src/ImageSharp.Formats.Png/PngDecoderCore.cs | 9 +++------ tests/ImageSharp.Tests/FileTestBase.cs | 3 ++- tests/ImageSharp.Tests/TestImages.cs | 9 +++++---- .../TestImages/Formats/Png/chunklength2.png | Bin 0 -> 12181 bytes 4 files changed, 10 insertions(+), 11 deletions(-) create mode 100644 tests/ImageSharp.Tests/TestImages/Formats/Png/chunklength2.png diff --git a/src/ImageSharp.Formats.Png/PngDecoderCore.cs b/src/ImageSharp.Formats.Png/PngDecoderCore.cs index 076770ce51..a7765342e9 100644 --- a/src/ImageSharp.Formats.Png/PngDecoderCore.cs +++ b/src/ImageSharp.Formats.Png/PngDecoderCore.cs @@ -10,6 +10,7 @@ namespace ImageSharp.Formats using System.Collections.Generic; using System.IO; using System.Linq; + using System.Runtime.CompilerServices; using static ComparableExtensions; @@ -945,12 +946,7 @@ namespace ImageSharp.Formats private void ReadChunkLength(PngChunk chunk) { int numBytes = this.currentStream.Read(this.chunkLengthBuffer, 0, 4); - if (numBytes > 1 && numBytes <= 3) - { - throw new ImageFormatException("Image stream is not valid!"); - } - - if (numBytes <= 1) + if (numBytes < 4) { chunk.Length = -1; return; @@ -966,6 +962,7 @@ namespace ImageSharp.Formats /// /// Th current pass index /// The + [MethodImpl(MethodImplOptions.AggressiveInlining)] private int ComputeColumnsAdam7(int pass) { int width = this.header.Width; diff --git a/tests/ImageSharp.Tests/FileTestBase.cs b/tests/ImageSharp.Tests/FileTestBase.cs index b147e97e88..765ff3a423 100644 --- a/tests/ImageSharp.Tests/FileTestBase.cs +++ b/tests/ImageSharp.Tests/FileTestBase.cs @@ -30,7 +30,8 @@ namespace ImageSharp.Tests TestFile.Create(TestImages.Bmp.Car), // TestFile.Create(TestImages.Bmp.Neg_height), // Perf: Enable for local testing only TestFile.Create(TestImages.Png.Splash), - // TestFile.Create(TestImages.Png.ChunkLength), // Perf: Enable for local testing only + // TestFile.Create(TestImages.Png.ChunkLength1), // Perf: Enable for local testing only + // TestFile.Create(TestImages.Png.ChunkLength2), // Perf: Enable for local testing only // TestFile.Create(TestImages.Png.Powerpoint), // Perf: Enable for local testing only // TestFile.Create(TestImages.Png.Blur), // Perf: Enable for local testing only // TestFile.Create(TestImages.Png.Indexed), // Perf: Enable for local testing only diff --git a/tests/ImageSharp.Tests/TestImages.cs b/tests/ImageSharp.Tests/TestImages.cs index 4924cc1dee..f0a0e8dd81 100644 --- a/tests/ImageSharp.Tests/TestImages.cs +++ b/tests/ImageSharp.Tests/TestImages.cs @@ -25,18 +25,19 @@ namespace ImageSharp.Tests public const string SplashInterlaced = "Png/splash-interlaced.png"; public const string Interlaced = "Png/interlaced.png"; - // filtered test images from http://www.schaik.com/pngsuite/pngsuite_fil_png.html + // Filtered test images from http://www.schaik.com/pngsuite/pngsuite_fil_png.html public const string Filter0 = "Png/filter0.png"; public const string Filter1 = "Png/filter1.png"; public const string Filter2 = "Png/filter2.png"; public const string Filter3 = "Png/filter3.png"; public const string Filter4 = "Png/filter4.png"; - // filter changing per scanline + // Filter changing per scanline public const string FilterVar = "Png/filterVar.png"; - // Chunk length of 1 by end marker - public const string ChunkLength = "Png/chunklength1.png"; + // Odd chunk lengths + public const string ChunkLength1 = "Png/chunklength1.png"; + public const string ChunkLength2 = "Png/chunklength2.png"; } public static class Jpeg diff --git a/tests/ImageSharp.Tests/TestImages/Formats/Png/chunklength2.png b/tests/ImageSharp.Tests/TestImages/Formats/Png/chunklength2.png new file mode 100644 index 0000000000000000000000000000000000000000..0d14abdc4f1fb494914c466021e880bd70a65b73 GIT binary patch literal 12181 zcmYj%WmFtZ6D|-!a3?qf3yZs3f(Cc@;6WF62^wT^0t9yg1a}LvKyY_m0vmK$+_~h< zckj7>=Jc7Vq=4Hulqt<%c(h?V>6o@9(;gwQb zLnD*Hlvl+dJb)ScZ(YIKw{;p9+msjq;#cSjVlt8}?v_zmF9Tvpk*t8jNxgL?OWOkN zNkvLw9w?=jp6~t|Uoz_0`|K;G`TLtq+AOR;$?ipsgg2tdA`V#< zZ51mO2vyLSwtW4hwM=nA>|EI`NzwHq7Mb(X#qF>1?IvLnoouCUrjHXS;LFs~!Fuu8 z{Hv+CJ6|59bSqMi91*r*+P}Na^fB40GXU8U-e`$GJa8UU*hYe19IAJ-QlY8B@4gdq z@G)yF=X2?aX0Z|rms>w*_qQ%&-|DB&o$)2JyQN$SU0C_BlvC`J0DsJ8{8by<(})Lo zytUBbu@PY9^5ZNbQX6qtI14m^U#29T=ikt%XVnv;4eX~Wra(tc9jM2(Q`Crbu$4cF zp|naNsX@;3FnYT%pD!5DkuCet?_6w-A&PH-*|SPp$***$)sN3OLt8jiC9*rDtB(@a z(o>*1Ay4$zZdsCRPE>->Nid2xRMdgd@w5p$%r%%B@XA1+IT?G!oDP`f1kdAoqhXc> zCJP6?w&B}YODke<7bNyU9Y`Tl2$I6^rU4`z|!UT$?emKO0{)A&CR z$^x~CN#&*V8pO<#*&pFqqq8bBc5lFWC`It)t@ge~MY#mOU6;&r0Vh79Mgp0|zx|Xc z66*_SSM;tGfB!|@Hkt=dfw+3kxd$KxQWUq{6GAZYQLDF+y2CoB-VuC~9a)d7@%|xH z^ZFst*{;NBk3?`D?`4fm=*Ka)=o*)kF_s+?u{AF50y<6XR_n!^wvTHu=w3r1IDx}l zj~@qvr?5HDF8s{rcrqitU$=q$XoU?4HnKZ9!Yu9?Kp_^8j>}42*4%~8R|{H&wq>8E zW++$Eyc}U)_(5F6!YJ`xMG7=4gkOOV1)(F0osmOZahlX%PiR*)kL5lgN{$HDlFJ&N*Q=Pg|avXOqW-}G`gd;tu5^Hrk8@&oY# zV*?x4{$fatN+O(M$0VvAj@G}7Cvb>{NSSNkKq)InKk48!b?>j6)KF(jX;u|aE6Eb> zk@<(sN234c}aUGnL2M!LOnO|$k$pj64 zHa!R>ONMr@Ogl^8LAk}uMqh$*9w=iTXV=pOa<(B?hQrJ&)kk6^)*TbvPhT?~wrk0A zjK>t224k-bm~Wd+MZ7=vDS8GK1#MV^(=jL>WPf&z$#v^64ZajGWR7g=*3m$;;BY@D z`=fV0*!Pvn_*`7^JMZJtnfa^_&~|l!I4j-6Mt2(asgr69qkHCX<0kEZ3FFx=5M|d@ z^$20|8?X8Nlz0tvC~ekEWB>}}gA^W>70PgI@5k*W#GiRJ!v&R+Op$zKp)}Jc-69HQ zZ0|C-q{l<*Y@rs$VVj@usRX&wYb2v!{7R#?s~b001{z&gS&pc&mR7B;PrcPIhEZ#iXx9nE7^)ZcUMDe)cFt zTxu)pplu_gVxs~1ozne zHrxVB*w)2y9)BDh@)AUe^XllzTah`Mt(}IcbW+8+qdZ44Dv;N?>|zzThf64eHV@-e zaEwt5!yX^N^LoR4ABA6tDgqicc*zblJ1g`|mHi!k%<+7bgpSAN8a4`0~rt=L5`8W~b{p-V+CwTt`_<%*RB0el`DS3Z3 zEyo)-hpxuEFi?+&8$aAk$|?NlGgqIv`v9LVoIBe-xQ!FM918F{{lv2U-G->K9pYEE zOvd4}|6^eP+HV4JkbOH32=<2#dhAvfSR4ASd9Yf1)1I)+v?o$8TWk^R`r#=3BrT|O zyH>9IAJlJOL`=}w8e$iv&|xBd&I`Asjk{Ee#FlbjG80*?v{_g0aueR&M#m!lPRk-(w(c;W-7%!|`mzU%2mw`&x{VS7AHg zV}}LYy5m4F+HvkLVO|l#2p1{khv;j=Dad`t?uMfvF%+spe!=$0<-sAW^&p7$_QNxZMcdnB%6(bT(Y`V2Bei z^xD_{kFt4t1Vy}C>g%NxCQei-CK31~I582F+8WOWadz$wrw%;e8EtW44(EKMYfI~N z$kL!qQuqh@3V^AjUm4wu6Aac1^`J2?O4l>kTp>8Pfs~;flcaC&hOike@(e;A7?9`l z;Obxod46|Hl38jFb5soY4a%@ApfrTOC3pxRiEc~SMgj(`$LIBUa4X%v&Gb!`A=kV6 zELrYt;cPQvdy6e`-56*C?)EbJJgukcUyb31kZHdS6MNOroyP33deRzIA@1{Ad1^3O z*O2vIs#@$kr>(%TGeEJgw%U=!VxwMoqPe_jWhvMF|HY1nkzxd-OmZsZq+s5__kz{p z`sA^r!yW5t^^T-D;Ix9(v^Bi_X-CTcsv>CcTAj|;ZkzzwCrg8*>Q6GK9>x6Ylav8M zRVM80o;(+Hf2-O=xq9X4PjrM4eqP0TTGjHTkqpryOe#~8i@kSF>0`QGC%|DpdO#SW z&I|S^5fp>MtUfms?Za7HEEWC9;}mu=GJZagT(@KR#|PT6CL(x`VPPrtI!Ts$M&Z?_ zHFvSpa^@r2E0?Lt>G?ieHyYJc`G&;=+eGGbe6sI zM~r^F+11u>t+6vmcu%Dh{V&c?R0|M#@~*2L4iQU^lP$-GIqTIrF?RZ1=5>{4JUwn~ zoNX3jT>puz-ZC`3A;b}Tl)-}*1Hy5k$&v>fXgaSaiT0ew;c_kc#H+#p z1%+vc4eh?}2PnsNDaTX#m+e<)V^7y4Vt!U1wg3zKR9jwTrI?8zx!Va6F;*4OeSUf3|k7z?X zbY%62Hx40hP*EMl#m`4GAayht`?IX{xvs@v)!yOKm4)cYm*C-2zU7}w3ltshw(!+! zOeFI6_7)xee^Of`#TCGcSN8L48V$393$N>HY+kTl$BElIOA<1hTz6XEG0V_ksH4sq zns32)TX!!HbVg@*7n&vrDO64Jyl)W426PEq(*&!H?TJQm4+BFxHc;j4UuZdsUD{-8 zvfdV2_kEPHxA4cQ!m4pfgn%~=*mH01cK83U`%&}RjAw;LSRL%|gW!0|tMB5wMW6se z$*!{?31tg64Ac9G++?NVNoEzDt!-3W+fj|F`mpZ%Qz!AOM!#~y_E^6X%k3TU;ewO* z;hUljuE^};eR7%z!|p?xjdoovT`4Kd2`Z_;u^r9Uty4u3z5?oej3H=rAw1_fy>ZfE_VF&Bj2~EJwQotGNmm%Aq`jyj*fV{@W z)WC<~8;FhgX!O{Mew~9@z3;6h{+P5*VdHxtR61q1BD9o3Es>vitqDaT%Rf(&kC^<6 zztF}{Hw>BvZDyyWew|z&H{jcddFU zi%qR$Cm+32?M%CKBdtTQBpPn?u8kgiv0ywpxDg~I6>$zt_6m%df1@gc-}F1l!Jg}I zT*T7~%kLDe$&!egI&&veJWcYC%W{I&$%B|Yzm;an9|Rjrkt_a_#d<~WjW`~hlrgnyQkeNxh_|E!cUZp&U;^!}-D*}GM=bwsa7n#6p^Lfo@3{^Z+SmIrmMJXq~hz;jnO$EEhAS zd7<|&^E=}FSC=F08Tn6AwtVw?gm^bY7B1ZiC|HMJP^UIM zK9L|1egw^mmrkwIgO1LR4X`#(DRAS(nL0`hb|fpi&*mZl6jll^by%Y4yVx987sHz!B?Zp`hLhf%R@(Ectr6_ zZ-V5HcMp#!$DL0?9nu}Tc|u6r@9br8Y|yxn4Y;^1NK??ir~yh*3lpdvVeiM^qf4!H zy-Yq?sxg11m{tj$j(Lm!n{8S6T|R5d#Rndb=@0x)>v9F6y?Am2(}5p08E^U{tIg+1 zC@W3cu_Wd^ndi&J(hv14VecH^xy4j}y@p05rO(qsxD?x0pVWn!HSm2IZSPRx2k+Gj z@Cu3BJg%$q*!iLUxFdB32xrxo%_dhMhe~XuHlGfY)r7XEmsq#f`p6paV@|cLr7*t+ znHk%ZOn7W@TGVdhV-1A*Bw_cDB~FOgNgacvx%x6; zJYEwC@pLB6^&zF3pv^u>oif|+&k1R_)?}HPWfc<|#_hSB!H+MPGX#A(%e6i$vS*HV z-}hCmUJWvqe|Mx!Rme+u#r}?kS|$pmBvr=yb!F*dV*P5nnAEau1DmYCG`jtZ-p_9_ z&Gs^}9G3OL>39#%s9b{{^Y-fq93*ccWU~)2@$uj**Fvu$JUyw!G3q&;Gt}$yW!bUA zsUQ?w@$vYtx`PVmpO?pIVXFkd+X8vVg|*-g!4Be<1FhSwH@Av_hTS0|B=M(Wzs0VK zXn(agrl?;ETFjmB(`X)0PHse;KHlDJ-%R>hbGhAm2cEW<`dB~W7raqrwsYxM4D
BpTaz?;^)^7m6%TxfM%?F8P@iU_mNeB*DXxJ~UTf%H#0Pne1C#Q8HB^&Nb&cIPM_8hJZk?xa#q#VRj^;gy?mYTJHJtIu8KK+^E2efWu zEEyqILB?8#?JC{ib!0EAmPB)4XW)s>-1kzq7NSx#x!Yb>9C;;Oh!eq3h7++5^Z}x& zd2O|cU(>qAWr$Vs=(T0_eWDdPa(crOr55X}K>>H)CWqB)sQO0e)&<_ED#(bMeuc=1 zD8d^H6L3&Z5j%%{xh)3t#BX~JZe|^Ix!iVJI~pvpHXf&PZ{~7$d4hV-C5gD4&N*Y< ze)lHeNxiCT{tmLL;NMEwrIrYwYri^z3S3D@^^#1&OW8$v(;vuQf?bMGvLbsll9bf7SAJTYy>=TM z+)c2LLk%XapD1o?N=&uqH`lO3a?D6$S1X_;Lyx9DR@#zDvs|_~T?`rRFe4*Yr5?-+ zd6*nFui9ZTeIg3-^+wF8h6m&Z_#NoAxr&kVA41%M?x=>K&ymvI`C#m@Vj`m{J~%5+ z*Ls%Q71Nv7I6!oT4JZ~C3c0!t*qYI$zFsm=l+pyftah-xxD{h$Pu>Ph=ypH#8!}I5 zsvi?%Je9Kt>1GW>&vnYEp92kYbd0JPAxZnHbv_|U>2rm3Zl9lXM=Z??-;>_yi+fmh zkoDZ{QA5+NV9-8bI7z;8M$qafkt&7`O@0%gRGut;Y~}kGhcKCKMze#G?ECZP_9SmM2m723^fMe%QRnn{ozIa7!#PWL;Xl2_?S z*zsD!NlG{OTRkt8vN%%?s@oEFcXfu7?7A*t)bF?8rw~4ebsd>D`f%+$N?`gNHb$gM zQFY)G+O19+9DX&vxt~Fxq93`bQ}Ft;Gk1fCddg9Dm23JCn>WRJNk`8p2;jS284?Z~{_X z0r>YPr8u?C-$Rm=A~>VVJ{Xjw>@H1i!Ux6dxbycz z9E&vQ;cr^g(7|rw4~|j?=2t;CG8RI9_hy-fXQSE8Spj^?k;QB9E4nzdQcZCIBd&1s zP+xW9l~p@qFCEpvwvFRQ$E@)QJGCct_I4M{hr5)*l!9`G37o)(d%S}kTPsm5-A8KS zijn6%GW7{agc|UJl~*c!93II|!xMt;7mJHD(H^1D3D*&k(nN)ud+XzmkB?1?zjo36 z?`$SKPc5G#IjXr!r57Y?8JZ9uxGDU2bgX*1e;Vh1eOY}fvGGLrOz$l<M+o)sV&Gc)#y>PmI8KB891^iOAg~R{$lT-T+Qe|UD&G}~I!h(q~+D1Hv+XVwbIzJG#JIIo$ zyXA=i<+5TkVuX>p<m5wJ^v2a8jcyHh6jRn_A|Cgxf+s6 zO^pVtq3q(j7sgdr{KgL}g4ww<%DTB@n}}jJH`K&%QwiVGn(?3TG(6D5)1>-fTZi>L z@<9Clgp_L4W`3y-XW%Ttj|@J<;M)OKgq>n0lykOHFB!CFcS9%>>D@?vhGV$rq+OP> zs$Gt^FP`q0_*cBXS4miu8A;wnxK%&F_ScFE0TI}L`pWVje1Kc7AHwu(Cg-IH3My%$ zByX=^Jv%%TQhQNsh85SpIH>6|ls--Y$a5t)JLN)r_~cE#t0wWo^=ss1&vQ??tGt_gPz^^@mT$W_-}%nfhzE+UCY9W?@Vz(n|~ z_3A@y^mp7_T=uuN5jcCwKJw_nNlHl|r!H$Uk2w8DQD>j#k;QpjBmkQ{RlTUOa$#XT z$`y(kc-a{Fy}OZ}yY;VV$5;}BUrPii)V2+s9S$RS)y@v%Q?vLBH^E&y#>0g?bdi^c zpg@U1*M_^J{f&XW`z-YLsPwIS*)xl6782E!i}S@17ta;h;U_6M%7eN9>%0Jd^Vynf z{dv9y?mTClf!IHa{KWk*ESTS>*nfA#_hbgC=;yLRy%VG9W4FXkP}d`=_*1#pS?<$= zp#nD(D|RGZLuUSqTlFcHUvUe@{RFD))}~Sf#pO+XW13m#Yo`Je_Y%TQ%q42p3HQ5 z!>Z#4&|RHW3XWFlI3M)o<+Ikm-8Wzt^m16SM)ZVzfA52`u*GX#3{e4z$lFIW9esb9 zSHK!DdEgjFxcO7;=}I-Hz~zI~;c3hOx5vF1mA~st@@5_QlBy9NC`tGU_Mu!rR)0zTjTP!g>mG8IW|k)$N{`AB&?-%Qx1)~TVN~GZqGtSj z^iCRP4pmdtj|@+2ea zse^KKwvd!0OO~6vsE{71aso~()awitT?hs9&#&v+hhI%7fVKIWcvX$2<)jH2044lp zVs+Fs=(lh~{WF=QrJSCe4E6*v{$z^Lz=qN;(_&>~I>tpC-+@-ujJu1`gU?DZ`_e=D#P+uZtj9gACCF>EvwJwtq*AlCzC>$I0GP zX#HBbiX99kH8E+rDBB|~%nmqIqHb7yC(zXa4svsw(s&UQ(t1k7-lSqhR>up(lg4mOqnj#rx^Pk zEH*ZSOzJE@JXf|!H)}|dpcDpof=CLQ@>Jf347V3Butd=QTTh3Lv5{&g+GHJid^Bt2 zT!ci1ZzFEUzZ35_$-U})*JR1a4FAkD6BEed&}1v%5}s=1w3_$ontj@N~FGrs6TEcH@iHxYU;IkV<|Ai zP~t#HQEXI)OCW#mlwQt{BOtQJ)5Co_ldDCyieI}g#&ZP26vwG$2=({B)!qN@BGxh^74>X!-)qQNqVX2imm{asJ%2Ri^vsjPO1FP!!W3VVYA?WotLynS4 z`d?|3e4~aZzFC6>7e>G-J@NbFGyS$teqWDm);}+_?q$|*-!0WXVWmFlfi789pwM%H zW)r1&NabSA_lUw{$34)GdkKnP+Y?oYX5*=v!Pif_a44iZ6cqQE?RS7PibQ$)FM0}h zM>E_e`+Wie*j|UjC_*&;OeV#%K0V&xa61m$iU&fQml^_ah)p>&V1YZHy^>*bd2A%b zA4>4y10U_bxTZy+HuOZ`iFnSP3~9!A`}VkguQ>R?z;jI%M%LhAi>VSWSiCJY6?LN3 zq5O_CUXpzx%KYJGd_h9KdU&1Hpdkr%@4&v&bkt|?XQBBsi*@#(+`7QG=_FnSrW`*X zEYsV4jh|~207CGrFv+&H?~bmeZ=|h!$NmxmB^Lb zhLqyEi?8kk#e`6D1h;d~0ju#+BTA=W6Tw5)e+ja$@O=@)0XrNF$#)TasUl<&=s~$) z>P7=qp#-0%lDC{)3Sm-l26JL^>R5P$xkXFj;!9(b%eH(}Q-u;PyJ419ZWin%rwauj z?d)y(zcs~;aPV}A)^bV1LShsXTk$9_ZMh*Db7|gngq1iVi+#mvy~CjXz0WdUTKgkIx;KXI{2kYC+u%qVSM1{L zAHg2cv0Q%|-mXw2;?x!4%WDu>0S?NR>%TGP8jkg;c8;dSwW}@DWlZL6XCTEPt%y6q z2*VN!C|0UD7HlRLhRM%DtLW@f^(O<+bZ}NUFs!Ivl zoPMZe`vKEM&jOqE6xRqN+e{A2$$*rG3rq69nBHH?2i}i#yFB$__?+HYIjq!$BBpkd z@|Ht@8O#*||z#Zuhf#zAUrOndUx)32Sh!*mi9JRCL4 z|B3GWO70IXp}@-PZZ+Jcge3RBnS59yJNAlx$GCYkBW~#QYa6z}X`8Dq6!E*Dz|jty zuak>Og{^$5%F0;PRjd6x7&_dxw$9^Zi{#J8ffsuQ24y>6=OTMSs#EEs9hv zndPQeI%!}b3dVs2r1O1io+&K&TvUA`c9Lvmsi0Wq?DYG%`Z0~~+tnty6#F;ujLV*k z=JmKPY|~l%oE<%!A`x9p7^w=CGc07lHn;oX8Vi$TF~%rASOdL~A~C{$aTo?=@3*Cn z>%|9~%hJj9p6R!nzq)w?xpy1D4~KWkg0a9V*;(nQf8F`HndJxe0d4~rBEgGXI$u-W z7NTons7k9ZYr#K3r^;GPvmpI8J66hzIaCL`knql)Oux&Og<+2#R3@n4tQJO6EblEo zHa2$u7=JdE^Gbz48jtNpRE1pf4Z2k9SBf!EB;UzT*_kReg|yjE*xY^i1wmMqAD zEfS5+sgj@4D;!fR3^LL(>Vz?h={PP*2Urm7St8l9jWavYSRSNh=Mn1IiDDqWK6>Vp zdxkBS`+E%yyPWg5b~rX{IS~MNEuA!%1&PjFTp8|sc%v$9;+w4(%Vw;Yl+$0eXu+FZ z0ZX+u0>3P8Pb?JwHLeN1pa|q#3K^1w%lE)t-^6()DADWHT9a4kIu?B|$&r@-?D(uL zhu2!)#u^YqpxYiLJWVtN1HdvdS=f;E(5OuB&@qT$vweQ@PCq3Sa8lERARO0-N0lj= zVs&@SENY=9{Kh?#6ZK|wqxN;5X$5n-T)7yA0M*`W zdi+d4l(z@??XlmczKKx>nFXd*amI@~8h|IVFoB$Q<58{h{|-KsA|PTDcU;I<`~2rs z!1szPiw5dQYVAC%F!g?ct}BGXak8PG;+>=tpE#2lu^^2LO^{;D_u_9*+2mEZ%+Fnp zTON#+NJYYoegx}?zjZvhr>B!WhaLw#pvI(CnvLBWYw6D68z>9!04JPtKAr?W8j0OG zG#yo1FD)yJ)|-)5v#&_<0}|xvh24?=tF(vV%DK&A_vB;Q+p`5Qv)GR9lvmil_jz6X zjtOggi;>`P$#5_}5RU2<@L1@L)gO9v*k=gHYSDMFXP+?&i6g=+4}0!G3xuoA@CHa>mgJE4jp`5=eQvL z=~JfKa-u>JlX6ow7Lpn4b|zWjfRWH8DRbp=@YC`Q4}U z79<)I-vMLhcUT(>2nvig!iD&u9KCm=8MJ3GL>j?kG>3dvUlmtgRNz%|< zPSM-*kH?)bG=A9P3xj0&A|^KYT#0*1beLRH9reZMeV zG}KnKvqLF0>JZ96Xka=vR%;nDbElx66OvkKMf>0G76&?!&whFwbk6Y15EvZTG0CkW)d-LK=MEi_=M)6 ztP;SOp~USlX%=|eIdM8;D%xw$!v8F44y+J$NET01E=MN5j;eB{1#4RUZ#z8oS|xPoJEj`J-)3C@+X`CLlo!WUq=EMQOaJ+q;!0Rq@T2(4QzsPh_-Ne&AJ=3o|lt_9*1Pb_-PC0N3_F+@0$n zv1{w9{D=}$xO!fy9PO5RV|PgRsA2E&g-EOWrI7#mgRaI>#b;7jdjE)`K+WdP4m|;x z4VFTPo4WsQk9>+ssp_ZO{}BR}w#M>nX|*uDV)b#l9mb!{tR{77x+cbBV4ji_xM6iZ zEYGCUs2Qpomk=%oTJD%yXV0ckt;D3PEV09ITGpmGW&y4vFTT3gzgvm`8s>!x^282y!>&X!_LpGIA6Gi=pG$ege}>|1KtolG}gX?2k`4EIL|Y Wva+?$&GrcLGAhzPB+WjfqyHa>ugB5= literal 0 HcmV?d00001