From 06bf2abfc4e72cdce933699ec7c1ca1f38e1a529 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Sun, 1 Mar 2026 19:48:53 -0500 Subject: [PATCH] fix: #14033, fix gif profile images add test --- src/image.js | 3 ++- src/user/picture.js | 18 +++++++++++------- test/files/animated.gif | Bin 0 -> 46186 bytes test/user.js | 20 ++++++++++++++++++++ 4 files changed, 33 insertions(+), 8 deletions(-) create mode 100644 test/files/animated.gif diff --git a/src/image.js b/src/image.js index b2a69d7e3f..4e8ad3e1c4 100644 --- a/src/image.js +++ b/src/image.js @@ -40,13 +40,14 @@ image.resizeImage = async function (data) { width: data.width, height: data.height, quality: data.quality, + type: data.type, }); } else { const sharp = requireSharp(); const buffer = await fs.promises.readFile(data.path); const sharpImage = sharp(buffer, { failOnError: true, - animated: data.path.endsWith('gif'), + animated: data.type === 'image/gif', }); const metadata = await sharpImage.metadata(); diff --git a/src/user/picture.js b/src/user/picture.js index fbff7fd225..9e7eaf6d00 100644 --- a/src/user/picture.js +++ b/src/user/picture.js @@ -87,10 +87,12 @@ module.exports = function (User) { throw new Error('[[error:invalid-image-extension]]'); } - const newPath = await convertToPNG(userPhoto.path); + const normalizedPath = await convertToPNG(userPhoto.path); + const isNormalized = userPhoto.path !== normalizedPath; await image.resizeImage({ - path: newPath, + path: normalizedPath, + type: isNormalized ? 'image/png' : userPhoto.type, width: meta.config.profileImageDimension, height: meta.config.profileImageDimension, }); @@ -98,7 +100,7 @@ module.exports = function (User) { const filename = generateProfileImageFilename(data.uid, extension); const uploadedImage = await image.uploadImage(filename, `profile/uid-${data.uid}`, { uid: data.uid, - path: newPath, + path: normalizedPath, name: 'profileAvatar', }); @@ -124,17 +126,19 @@ module.exports = function (User) { } validateUpload(data, meta.config.maximumProfileImageSize, User.getAllowedImageTypes()); - - const extension = file.typeToExtension(image.mimeFromBase64(data.imageData)); + const type = image.mimeFromBase64(data.imageData); + const extension = file.typeToExtension(type); if (!extension) { throw new Error('[[error:invalid-image-extension]]'); } picture.path = await image.writeImageDataToTempFile(data.imageData); - picture.path = await convertToPNG(picture.path); - + const normalizedPath = await convertToPNG(picture.path); + const isNormalized = picture.path !== normalizedPath; + picture.path = normalizedPath; await image.resizeImage({ path: picture.path, + type: isNormalized ? 'image/png' : type, width: meta.config.profileImageDimension, height: meta.config.profileImageDimension, }); diff --git a/test/files/animated.gif b/test/files/animated.gif new file mode 100644 index 0000000000000000000000000000000000000000..2d1b9e13a0cbc625fad36912c807cd7f5794b614 GIT binary patch literal 46186 zcmZ6TS3nc#_xEQqGwFfQJA@v3=s^(^I)WH_5j9i+Q3IlaqQ6N(2~7h6qN0YTpx{PD zMMXChX(C2NMMVu_!MbsE61eVjT~)tZF2GK6gnVY)WnO&@2gr{k)oiL*jTRxr*6OR~Y@?1)5r62X$B zVFepnLYg*+p$%+kPtvj>5u86(03f@*r*G8M*ra|;Jz`N_}cxYQ%Vr(rSOB=}6 z1~RuN+SwE7mLykO*n^I>av^)VlCA05?sRQyPi+qmZEbxAdmRV7t+g)Qny|tG?`fsY zv{rTVu(GyhFdTxMRfBA-*SNW?Gt(ma8tDZXI0qUK{Vj;0_QW8%Rv?`i>Q0PeYDTy^ ztYWBUIazL{g|E`vv_>yH)UhzqZdbHNPMH0=O%_^=)%H$d<`(M`oFWMEfs}|f_EDku zj5zA1HFg`L)FZdxcWhMIy2T+QHzq8&FfMRQ7Ptq*TU7C+!B7vQ(ByKNSJe^d`JDhyv~x17b`MPR_yGl+}U}c=yJo( ztF@bJBq=uz7YrWYjZ5|%9E;G2s;1`F=*M(w@_utjIjp^Xlu;;8O6<6h)JCWg6He8V z_Wy?KKI?F_Y2(pmm0PuhJLjApN7Q9G|Li>RYy0Je^p*+Yy<3zQ4^-qI9q)Z6z5Y{Y{)_6Xx7KgIdc67S zJSAT}^=-@4=a4twBVYcR@aW!QaY9>oV|YeLPz_#`Xi@@nu_I3{IT|myPXxIr|a*Wshv7gfA@Uj z#M!2?o|8jYF5I|!Y4T#{&B4AK{a5b|UOv!$zpVRL(}iCLd;YHZP1%0+SC{nD$+mm@ zZhpBmve-57PwnKro5KSWV>c!yZVnF(Jb83~YVzjX%)_C{#qr67j~_m~dHm-3<#E#= zFbphRrvH+{1EQn+*qi_tM+O8gJ+lAr^ZyPL0KW*B>SoE%en?%5XbS`V*s?M*ElsYJ z4L~^4y*a^b43?<1JhF?P+~QxMu4TpKag^+0oSv~;CZqYakU+GKj<2a@BkERBQYtuC zLR7a5ZPa8B__6_tv3Cb+7K8u*12=XapaCQ{9WOg|AtwO?W2js)vSgnwJ-(51K>}k8 zGf;(0=BGw6b}3kpHY-cD*x~2U8Z$gWYgsI}ky_6mKN4x3BenUGQF1#hc&djb@UJ*v z6;#DaOhGC&ESK%wA~k*W2FE!bPG6T|6^jL>MCPX0O^K&8EsjWJGng+}bqnv80Dlm7 ztHdZr4uGSxRJ-+yUDN$7MHR5!iD>Dr+*7v*PCS>!!h3>}zqDQ_a>h5*OTx#h zrE&WSI%&BW((;$RLgK0NiwTHI(Zy%0RJlBj)yooi{n3+PzyN*~J3)ZAOyUj@HR8ns zq*bdjF@y`{8Cuam+E}!28pwD64{gqTkmMlYwPw>LEDRCia0e}2LnO603S52w#|V`2 zL2EJ17ejL%r`KsdyR??@osjh?$2Yw2IO5kVh3d^YA(lB7T~go9U(Tijgb;ZE6ZS26(O9r|OM%@lT8c9PaeSkamW9@_DsLWarGmT_%4HX>>%!J6|e8}PYBj9#s2k^CqY zLzZYE*HmbNgdWG!9eA^j9ViLvVX%&duYLl+v0k)BNKGuqkgY|M0o|1R_nWUrg^zvO zIN!jstygc@q5q##%?3jxQ%0#AF+bWcaL^(;O&;SJCX3Fx^wTzJFonYX3xG3qfh$g7 z!LRBx4QK--^L;$u5&MK2GFAPq=)>ayM3E!x`6~mhKhMnI`%6ra>VZ135@TXc%cSrlWJ<^X6 zX^}l+e^Z=pSMuTyzEX8lS-$&RW^-W|2>kNrYxJ=qj=Tr3w*Ocv=}| zaIGpwCNL3@_OpHI;Mm{KWFMcYJloh#nu-jI4iWjmH710y$v z>4-jt8_f$Sx-#%|l0;~|xV-w`U7ZdKV8Hr&ZH*e)3&*LQvZG>R4HWmqjg%v?G0=^3 z6drPwygccKT_6Lf#_8hnZ9o(BHXaM0JN0N}9Fx^Sl|}Awk-~HZ`_Rx3nh-%FJ1U+N z)D`6#zK z_Q}j^fVxtrZ3-aF@k{1sm*Frb;@hzdSwSHff9T|O*2dKb*!*aJm$r9`!?#Y7hZM@;=4*&-Gq z;D86{2)5k|Bs)r=|J=9msJqj|8+gY!9l=edH_Be?12a=+qmlPvZ8R7T)<3g5RoFgF~zAOSVmzo_31>|?cq-YC&uVHmnP-M0Hs zMoYGfUVMlQ? zzGgq1fzh^3VqHsm+5t>$9QLN{$1s!!U^AJyj#AQNyB)+d-sN}aMPXK-25?)bLc@6) z&b1d~+1Mns$!B9-IKcj?F>_o4x`hb1A1s7lx1HE>c0rw3=P}^}KU!sbyKhYt9pyj2 zwNVh}#n&LqwDno2U3O$EKINCsf$}n!ATL(v*>pfBei<+|i&FHf!F$aB>?-LeOHqW8 zpR67=%D-~QR;Z>aL)LxctIn)LG4`zc&r$^0k$`aOR4G5Q_8@+s1RQxB6r8ZEpxf5n z^hm<@#2?wjn0Yg8NK|6ed@d33pn(5u?KiQw94>MgtFNoV!fzsZ)kC9U$|xP42$%a2sTR@1LtSO2WN)nI+T&UvHn zCQZ9-fl@ER$Bc*Vj}$!}bK%7Ci-Uha0%#FbgM;9KwlkSY`?)qV+;X`GJg>|Lloui9Vk* z_2Wr)SNk-~V41xU{X2a>0@|GnF_qNn2OuN|Vb0EY9Z@!&$PVt#Wp zur!VL%ZT;7q8P>=j|>{{r^C#jHr^@DUJV#cCB{f$eP_Uu>4IA=!x&IO8njD~YGH|j z21-nMtxLxDbS)_3bltM>NDVWop)LUZeaUF|Eckc_OjXj{(*alx>Se-F3bcvFU&q@L z$4S#`j750hdL`+i9AR>h7%70z;wiB!yz>BtEPVO}%S;mahnXpd51O(Jl*yp299|56 z$)Qj&EZHU}8K^5Yrf{sM1$lmD%j~0_H`PUs^cZSTZBIMfX;HzIN|1&kkFa*G(v6Pd zB6SwzEJqmM(MCnqIT6B?BYT1X;Yq-aw&z|PkbiGa-OJE#I7<~c11km^MPOQsMr6&3 zxECCEXA|`lx;kgc>7b4r+#YGYqE%nYxA(r7B(7D*2iU2xN}QA!%mV1n<9pFCBykbU z0%6(CC}~zBr!p14EuKNxG73UG!0kKNg^R?{ARMh~jU-ta;5o3c$6N;6C@@tiscsij z?zlL}TWIYr6<^p|gnmGu2A^2KcruV^Imm~c4tFeulVQ#CcQFofuKsV1t$dmOxs9CJav$djvCRB}j5Tq(WV*umHf{MHV!+w9wFZxXjjz4gkSXqgy zWCxWBdZM@p7WA23=gK3%vPg)tmB@tNye2eoiOB_9QiBNxID{)qBv1}zvv50DxNQOi6WLMByL+#yKR6+xpxB2$UdoT*5Jwa15y5pxAvt ziEz9QbGf)}JlswtmPf;_kODqvY=?P4rxlcJQ|5*?&~6w`Uu5S6{Y6zM^Pil*rM2Pf*!3;Qnig98s-#+gz8DNcQ8a&Q`_wGW16sTk3u|@asZQndR z2kQk`8Mr}A^m#{UQWD~1gbgx62leb!3__@E*q335V8JT4>DJSNP&Blu(!OBnb(E>48vhq>haT-+wv zHd#QyUsh1jLnKKAc~GH3{^prF9WN@R0RUMgpb^7VTL$VgKnD~V)WI0OtMQeAw+bPB zCCHLtoa8|Yj3Z%(`Zpc3{bGCx2kS@eKvylIZt|jt9qoAqz;Y_$BgPfVVIrsV*pH&q zDDk+Gz^WuRGw?fjco7djChe(^;CT$}U!`J%u_sEAl_<_)($4D9je2($6(%(-+8@awS`vJyWiAzBY~VECPy3in`)|XGvPv&W1ue$PGw>3Bp`(g z`HK;ET5I1guA0 zLzm&ja;zr;K@ zB0*9lfB~SsC*y@MbUKPhkpmiu=Ww1X zPa;VYNLQW~EWVlfy(vh6_@i(L2U;mbe6K7bHI*=%3g7$U(Id>W0StC1j^8{SwG4-=0y5gV1GZ<7fBZbH0K!U-|4-hlW-LaAYmPXiPMRpljBK7o?QQ2axs zN&$*H%pk-lFs__VQZ=btO6*e->QRD5@RooKnfei(Ro{>Var@f`pbMv$DS@;)kUV|N z#aD=gJN+LyZlxFwRa{j~$E-T%xGLh_%uLT8kMUwDULw1G%zNq|UE*OL@uZmWP)s-o zV4HcA84hVeK~VrIPsEgnTa-A8ikv~2RgiC^lx8aFu!L|3#l=dXV_ed?rt7`pnbTro zCzmi6NU(o{tY74oZZF&Esl>R6ZzgbhJtbS>*l;?`u=dMwnNfqZ-tGtvdp2#UZ zwF%Cx-kD(-0 z5vfZ;8oNcD*i1Y(N>GN}Oq3uh^P@+lPXky8lZCj+Cqq!^$O$C(-R`{r@i^_}Mc&fZ zico$Hwl{*$um)F_z{z_r&9J<+~Z>ho_SFXRf_| zqCE4M_9kS8@#bY^MM0<1Y7+JyjtbJT{RnqJX55Jj# zEm(==D6rLXih`v=bbNDlGvyuY<2wdP%9>woL^>-bNM$pMK$O;y65Je=)xryH$-E? z1!KZv38hLx`Oiufg_!&rRn>m3y0EAuSM%=gG{JhypcTA-Ql;2x1tsUx>or}J2XdA7 z4AOgv%6kcM{y6arjdY$tIz%O1mXkb>lb-KeWOoxwR35fHLh2cWmp3PYh=9Nb$2#Wh zx%SY9^mP~g%ZZvD`;S>h9=0dEC?;so*p2j1ZFPf-X^(og`~ASH88NrckFo=|Br$Vd z{(RaOqH_0ATFS2Z`DDw9MwjHFzW#3?4SKge?RCGR{oA@_ac}RA?b@Dw-!|^d`pXqa zSp1o!bqUu}(rxcQjz07tC9;GN)gE%-3g>NP`CW_f22OM2=q6LAwXNjJpXbY7sQU;O zyj3u1Aua)CXLFaAyWEwyM(lzYjSg5n^2&WYIoo$=t3j`4ELv)_s(nP)B}?UK&g0E% z%`^U->O5i@`k*VmE4s7dFQT?R_iWS7)wrAYKlh%BOxUn#ye=uM?n>CXG;yu->izUi}S_Wc$dV_V9VFSMWs~{k>H239cNh7F)}kvt9&cG%9^$qXTi0bd%VsX zZSSg0KbnwKW7#m& zTYS{8i7}+>XTpco{e6GE@!$TSCjD|q>)N2B1#LgOkM6M8UUDPCd91BAZvCTdt(YlH zp86_#)7v-J1hQ{vf8Ft@U8iFAj}qO;Pxl}y%c7=O)!sU)xMp+TEVg}%uBrLHzBl%|McUIXT4ioQlo74Hs%$CF^?CC$Eo3d(5E0lF?wrs!U zpI7Hp0;Fu4BRR$iZPm;2MW&^Y>O?ceT{;%@=IEEVmrb@QCroj81}kysgc^H~iU*co zY*J)I32%5lm1S*w=Eqz89D|Y4fCFK5es-JJkuyr_qt_>u^!-VEoj!i`^S5-}{BM&n zVjmc^_}#Lh5vmQk_^7)k=z3O$ns1)S8%H6~E~#a^-}W|{{Cqj&_%>q5`N3e_tm6M{ zS4;K-)cDoA--d2@9~^XT(a=(L=GCW7DPLBdTp!Vtq`>H$7TvJjl3Wp`FxzsRw%=j$ z9(AqqMd2W|^w}ylG0En&&%#^io!Qw#Y|*H}bJ?)#01d=4?b(fxt%QN z>Q&e>XUnyX#x%Bl^?z*NQMqH3>z*5dJ*GZW0w`kzbO@Qv~u+gjj4~nc2L)iuF_3WOS6d$COZ6>Gie84 zle_MC50-juZCJELEgK(XZ)Q+4AE;*PPw{Rur95I98n=8N+N&@(d@3vT==qEfT-#Vi6q9fR(XJ%VEsk4LAUkK|y+}VF$ zGteIJS|n?Js@9zsk9f<~h>&EzX<`#spU=>V+YfhrepLbOMlXTN$j)67S{Jj6z zc5Ra%JgkSNvp?9)rfibXOhJxlwU7CWW+tF+F_|Z;*8`)pVdl|Md);P1lSor zC@(W@E1c>&?Mn~TZXnL-Ff0QddVZ9#C-`T#iTw<_Zbk*WwbbTuJ~SztRVQBwjVF2s zU50X1cNb`zyc%8Yxhh1&?C8Iq%PcmVzk1JsJ+(t~&%=txYE6%8E0&#L9YYF9cA-TA zjSb2{YkOveZGt%V>L^m`WM9Rl4(hb&B4-vQxRAtLmB-a>DF#P64t%iEo6K~2^GS`e zm_F05J1N4t5BERYT{Wjy$)S7peI_$IKw<}Qtu;1N5uy(MziV^h;WKvk9(_C+ z%`T5cF`5VQkuw}{z@Y#fSYOcSFtM$2o#dpBOfp?k$R-tNx|r>m_gi!0JAQNir7Pm% zH|AZ-%lwMx&VTC-a;-aCx_oA}gvW`zmXWg~vWf7dHvq-S6FTRiFOo{A0eC}MMlh}cL z-RGrg{5i{aoRf}u!=Or8FqU<%JwCAOl74N*u=6MGZ9iQwFGnA*D)YEO?;CzFV2`j0-Ps^7Co1|IN25E`I zvODEAHn7fCtVL)Dx`}9)*Q&ISGZHEQ;~;*b{!0AE{VtY$IErO zbi|Q|sYV6PB7s#V<}m}ZK4h=s-#TSj}^ji zyMMPV`rWnHBV^pnaxE)d12U#B0vJFhCtWk9LQ^e}uLN4gC{2|>#43R^Pe7-ya28?Q zr7bFLN0}2kLHshV!j7vf*|31bE;#}ywwM;t@B*W0(29p)@dT#20+Wt@Q<^}v0Mw=n zjJ{&R6~))zmzct(s|~Szv&f)sNgk2rn%QqvfQc$v>040hrwe;=h3--z<3o=z9YEv* z7#0BIS734=Pa3?O=bcI~UdHfq)f7H7hnbDSosIgBeBJl(aRs`iT)<+*uaek#p*c&y z4io6mhs;L%M`;+-1-|M6--LxxRidN<&~f^DIGxSSNBdNV(?p1Xgo+~)gkfn||^ zzQ_>z^RUZ%FEU5Zcoqnm!NS{XQA8S`$pLhLYj*ZPD-ZIN2;ESOUx(1eez>s}`lVmI zN!nQNLqAKbFIHm+F0E{Z0uSMgVDj_FH zad>>m_YSLhJ&O%^Qu<(!7uP$|Er4FI@(u%gkOO-%g57zLI}Nhy3c%#^&%Xq9dVTGa zP>(K8W<1-sL%6JwMMp0)gM#_Eq9G8vG6Qt-*>nk% zMuSJ!!k$dXD;O%VpxSG)bQGZRlD_+Or9yKBvFD~ohv(%!;W8%V+#5Q2zI2yfYkmQa zl2*1u6nMQtRMv~ES3;J(0(}{Z&*W2e1vDmKtCz2Z7Z62ZG(4X)3eY%wjZwkvDa=aR z>OpA<=}T)x#H}Q0<9O?e$E_^i;9|G=0e|$eCqtOl9AIzAGNFdgeFfzjtUGgj*CN(3 zeCTqTkdfwnHCoud92?_0_F*D?hiJHvj->P=1No{erv;5LNS#MjSOU8OP^|-XnMXChTQNw`vI9kKtLgpnjQ z^Wy&QFDvz@pYzZa!|vw@hLA&#e0D-U+Z3!b&$rfvoP*DKGKzf_J#Z0}#wu-lV&)%= z-2p`B?7{7%Mdzbsg(!}VFWykFf4zL^%@_xcz!U|DO4LXpFr$IkOccjOiSc|Ao=;p< zqWA*Pnhp|ad=)%kk6Jm+3)d)x;q!?lVEfD#M%&YYz|F-;gnaRtDV9TaJz$|$HK1IW75hEl${663@Xgae3E{PcHf$wv(& zE@CM>q2*#uWZUZRyMK4t&LNVa6bGR80%p$Q5z+y<=n@}iLI*PwutS#uI6bLc?4DLz ze<^lLdRcyBl72#&FQs&Y2v1#p* zG)rjE9rokOQaRX@_xh&STHCEEPRB?87Ik6!{NzC*ETShmO$+R#d{e4`ES@4r!l?8m zfj#ath2L=ju$~7r6^Uw0kSGVtlrtZnU@WPtO>j-J>K4B zxYcu4sBoDKYqvnQV@Bwg|bh;dY)-GDg*0St1K3>x#c6S4xY*$Hz}0LD1EF8dG`waImMT|glrpZD)VK4 zI5tC)tiPpnBe&EfHK5k8_jCv@u@M&}H@Lp*3`hQO4^eb(;n!4m?@;J;h0cuH)SH`)q% zpyhzyG6i*caIs&3Fr8D1y>NE9M3}-Xb@nc8-S(idx>T>BRQZ>9?K$k(Rk*E`Qcgit zA-*JgaYmSDgjmu?RA~Y`CMLK&4ws2i3&0|GFkvaJG71uP`4&_@Ne*fF=JsIG=YT=i(UX|^}?t#9w!G)8Ga ze3nl*oJvpHohO|AIJ%s^amfei%+iNzi}Ut93MReV{;W?AOUReFE+#5Z^Rlx?7*%TK zuN`QD`wsvEhQLmSp~%rCBX*a(`0W|GG)WRW0CgIuMg`$ufrS(_q+#r3*_*vbOj!c6 zUeIP#m@~RGX`Kt*-M*ZD>4*n*V103V@QSSZ2kA87z-B@(C9O3TJNCLSfcM~``MV6@ zoh1Ct#)b8J>`G}9$42lCyvM?oB2~R#dU#FlT~!W{GXY!yN)!Rq4!+$apCAGF z|7<4l_~1N1?gbxSLsi9BwHe@&JrpM2N(TK$_WP#F*IACwo5EKNzMe}1ww_G&@mmURBB#EPNc&=7BwpK%DI8%zHnQ3kqW#-6Q-12B>y`E~+4WXE? z3xB2v2UC9^4h%ks|1)gm&hYPVm8;R{;K_oepw|a; zKOMlyH{g5YG$nurr-0N8W*jUyvp$_j=M#H>^8Y{$f+JOFAf5}Vb3Gg4-iB^mTFbC{ z&%E3I_6?4E>-*gEfQn=xb*|~8kY=5&yzhNH{QK|<*q2l6wIF1_6zMEXX#p6$Ay>UV z%pzs}_P*KRyHCS$s3PzyW|X6@WU* zuk~D(&MSQ}viq9q9|Pg=!IJzO6+aIZ$vxi;clwMcZ^h7?zLqcREmmGiU2yhi+A{Eb zkLM^(j^d`5Ix%j=JOpl4m;=x3;y)Udpp_4^@81Vh8GIE$V5r#DG?I1 zn7WtmnBJ_?)2-+VE+*@_Zk(*kN*fM4G*UTMr5EZi3P0*;`+TVUeCaJc_nawtT5B!G z)UT50uq?J~`fU10>7xDchiOy)DjIl7CIh3f#(Rqva$(Jr4sonKcNQ^$H?_=z_EE<; zLcAI!+kh*Trj(RZtzx5Pa@vrPi1mzbR4(npDKy`Xzi4fxi2pFlWpH}oML_y!mBXo~ zQ43RFo0wrQ^VeVWT$=C8o1^C4jQmdS)Nk<{6~9ZlU1ynC_u-LwP*{9?fs6({RyD5s z`gz+ck+#!%@$Ne*L!(rc?DA>gGdNJGPInAekSvBogf$LgD!TL@YcQf2{okvajyQw;N!EHxU72ks1TlL2se z3bkZs^7rZA;a!hT9UI zXcS4~&{s5A_dWO{1xNoIaCrU)8q=Fj8X}=a%FpiqnV4W$ZE-r&XM*xZO)I!BbyIZ`u!jx;`o8$k?4CQ=)!E|D z!-pocBgrn~_E5Czy)eIOw_BRR!`a)1K%9|~=8J_w1A%&+N~VI{ovG$5R2zB3_0OA} z1qS-ur#V7M&0EZd)M0l2A~b&=@P$;Bdr=vx zww7fL-=C^}RgxP-W-n6@?r8t?fKsP#3k1E6_w9hso_4~or0biQ^*+d$a30mX9p*Z= z%|7Ay?)PqsCyR$3MC29U`1|XV}|=6b-# z!_gOHcYN~Tln0e>XzfHi`;&T(0aBtBAoK1`m_f7noFk)IGSwj_ATV>wPTBcGW_Apu z45w%6kF_3}@ab*-cVf7}IJ9^+yv6r}7eqIYKAmP9OPTKMGRic7 ztL?AmiG=!_b6VZJ=gF^ZT3z~HH0~{G*T3I{^%#-Hy6&s-9!B!$x8~QoFMej`1~1O( zl}($TIYSlrd&xYnpO(G$VJ)NbXru&|THgBn5-WYs!FXDRoXP}^dL*zpqaP0DfEr=| ztJxu|ag!mcX)-Lek&D=i$r<@u4Lx#NzbmK68+BC+i*v#zt1fl>lhf(r^kGx49ixX2 z&E?)*l9^6??#&%`)*tI7o9TlhJ01#Z^vWQbxWvpm019GO;d-gq`_)LrC`d~1ref5) z6vzf4AHRwtAXwCS6F=UH(ynjCqg*T;fOVV649gV@t6y*}M#TNSSv}7B23JNo;+g~5 z#(v=?nilR|ub6o%E`HA{v93P(KK|2ufxhw(#0oIM@mP!aV2%J+!GpU2G2Z#ylp5zU zU-JV>FlT{;NDk)DJ{jy3JpX9s?U4m%Ze>hmxC7jNWy^u}Ske`FG{p|%344g#kF=7j~1iH1T3@0DgIU_@`RFDz>Zr!iFfH^%d zB9Iey2fLmMYxUAj6CL>YaGrSSV6$Rz-4_bmO~%L0$lwivVdi9n3SzRYS7ooc*RzG# zO#zVk*q71afpUlJ#;>|h|30>2Am}MIv{koQBpjm$;k{(0eTfTi?^en9salq)*&lE!%YPP|-u)2oNtBb}dv1EG~2 z{i+ugZvR#zBQ<7%=2$6zRckB~7Tf_PT)6O@g@S5g6t{sEkN1c-QVIKRwpt~bUa3;xh`t&QdLzU%O|*Z zM~si8!O|aXcoVVML5vr#>aIUR^ZUmJ(R{q6Xuhc1``^vN^oyfuv35;*wVT}gzW449 zyL99=_ZL^IFlpF6r7TZ6XvnQC(S5{yzsitwzXcy~N*M`#YN54ezxs`o^qF?%DQg8T z=Xbt_(;PjuaPX5W!yPt)i5OlzOFh8e?VnreNDu~~A4 z0%Lt$u{|W&wC{k~(;*kJ;WxGBIpeL-E%U7he>)lk+sxmBdtSQ=Snc1efL)W@CO<{Y z?Y%kdU6yNl)F8QX^^LFzMlDlLT~QqWlA}|<{lJ$Sb*>gdBaYFT;+y(?x3u$b^o3R2 z>%u3nB9>>d?H3z;D-#;Pl6EI1z6O8uW4}wO9-!p!ti?j#se`xqPDD4 z{Lmj=U$-PY3}Qb&z{DP0`C|Q5q&ZQm{rP9^cCCi3)$x%HgWpHPTmpnmIiV$8e1k5& zKKGSA*K(%smd8a9m;hiNdKbpRy8P?G1pE}xwh;bnNcHLr7t3Y6uR#gLi!ql=SgU=I zA#oX=f$<<~xUq!Hroo2KGl_&(7@}q0U$Ix6U#C7BlqXk)1k7FR9e&o=ug?h0N^AAl zWofXq4)R$0I^5ytB^V);hEM0uXx>unEub%j`HQf52Ncnn;Gk0N>cz}&=Dh0Ci`<=A- zC!tHn!%UQuSOGoJMid>d!Xow|#KjcVaGz zM|mV&1=U$$rJ%tmU(3pmyC<4*C~=#MwKO8ZNkzNf@)(nKFHO$BKUQqm+i#dZtjFS) zX44N|uh#eHc}6pP!izqv-E)o=h%L?CJi7>79Shv zH=`a1wCt?C_~evYn()Q3dm)fpPhENX>|)rIe^>{2a7SiA;s%X^w;qYF*446_XHv^) zug|_0W@l@!x0^*bH8$9CXQv4FnI2s+0Rb;zHP=h9?`6%KoXF zT;yORo6+^tOCVw6NtReFt+dH7*2%Cmnps^+d-d$Eb?#!#Pmgj`pB-E4tiG8V8fyPR zgZW`#{ks7H{f^+Io|NC_!iJV~=wkqO!lbtD$Q73C)Tf)f`$j0!DDJBcfmeOI?f4bW zNOCk{(Ca^Oif=T73vq6r+}x?>LO3nGq9?@|M6Vi5%e2zj(pH)`->|E_$FZyIFgrGO zZpHW{$y-*#NEq<1`_;a>@T{d8jeqGQiy&8bc#%vL0Esg!8#VU546_&K{LQFQ?xMk! zU%7vD-k(z(Yq;gmz@Bx{^D~t9Ya2Th>^-TPX>&JwZjiX8;1o!f5-%&@Dh%C{{mRQ7wh_%C#=_HaJiD;qmU!>Vii)e#r zSRk4~doXbx zRys_kHq%|#7Phd3Z0&GXbZskJ#MKt>X+yAb)uFrL+}(6MT&%2YT2Nw1NyYIm?Ivp4x$S)K!{} zp$_(;bo%BHynie%I1v{Ut`(M!i{FWh-%JVPIE8Mti`+)cN;1uHSQVzTc3o6x=n|d0 zl@q!vjk7)@bw9AXfx*fLMp_+Bkn$;i3mxVAJtq%z&Na%0dE+}w~8Ql1r4w>j#6;O4jk z+oDeFito&eK2nr=a96rGH*<+^?k>!2joSEQP3+H@oPRR27Yho0X5~GLP5TtMLQ}jx z`fO~MAn9DmfBELaqV30O3p-0PFH~e+sonfPi1Uul+W#WXU3KY44o43iE*L$K`?_{d z)gQa;J*qOyYs^BAq(!zQL=M!EtIpu}ol!sAL~p%A5Wgpi-V+-?Y1e*ssFPE>-;+=N zp>^hq)0w*t;-ufaU&OY4{U2_ zI=Xb6suOk}t~yyS`aj6>(VElsmH!{IeED?S{~*ileHYLEe)&T82}$kY3pWlI-w}%! zMWz2VRQ;%_A8RlF-{A6eN5h@-2jyMjUnd$rNgKy5bPQeT`7geFspFpuoj)&}dRNiC z#4!)|_uad3<)6{sziwW9GTU-k7 zmLOy{L{`)1WXc#aygD_+O?MWAOYmf4?*&D2DOTSpt+&xMB@jz-bj!4FtO1L0)cA`< zG}l(#A>G8@j)+!-V&K4-$aGE}CQ;NFST2=izWOkT0RWCTqaRQg`-{f8r{W+k1(0&N z1DaZ@(u?^V@hqxt5mwc~VTT}iW91fDEv2+VZ_mbFYIFZa97*r^#jv7#+4mb(Pixnq zd2N;24*N>w5;m`rYHFeRRS`b`H-sKY5$my7(Z2y$85Yn+A)MNl9lb`NP`LCf0S?_c zWeY)5-*l*W3>XuVO)9jFy!?hM$tw*9lMY3|p*JXIi}d|tG~Z;Md8d;zN@t9UwX+*- zLIL<;39A0BDvaju?>bce7hCrk)x_Gri+?gRnRE!fL+GIzs(_RUy&I~aprIoOMnT28 zCka(S1EK<=1`tF=4OVR1fQYD|0UK^x5LB!?y48)1=gjjv|NmL*taaY77K;}IGBcUE z@9*cjqIEFx$(SUxD0BV&C2-%3L;b|ov@}0~; zY1O^8PrN(Fmb)%5)q;=cbZKp9T2;whzPCbZEY{2xEQXUA3VFO~4_h*FvK zIPqwaOvwM7dZV9aoG$>3sBtQk$l`=)!Dei|KqT}$D+ml6<^<9A-1s-1`&Hw6dW^fq zo4iQp74=KYjaNtrh~MhaL@nn_%HWu2qSO%K_4hR<_D0%%}jy>d*WK%OZ*mK2+2xEz4U%;Nx9rUT?@WGfFK>6y6@fupS&SVKSm1t4l~;tY_S zHy2!`xeO~p^aJ6ZcR7FA7`KJ$vvP8Hlm)EkJUi>XkBD?H^FYM2Ptspy`lU1BYViKh zoe+z|T(v09g;HENJ&<-BV=R+BCVD*XCR{S=<2WGjnGh!Rmp`+=l{1V5we~&mIV#q; z8I~|`AkcAHEaTn5ep=JZ>Jqw}qf5wAm!6fD@QlKF9SA3FpMd^X=8#9O zX+(Gs*{Pcq*c{H>z5iv={YJuVz3{J#cP<_Ebq3;H6r#4%|3T(Q&SNSDcGnHb`*i|! z52hu(s%R{1ZM<8PmEjZ0Y8h0w-^v@Tsc2lLe(u~FQU7z! zS|jrE5282Y!1<bF?Zu4#N&yBheVg_4#gA960LOVtO9L`mgzb<3hidH?pKYhqG*e`#3iUA6MgTjf% zcg0r-07Sqn)n*1WuS7q%^58DP>>x(4+bD;f`C>KTWw~p0TK}fd(QXgA9pmu;QS@1Z zzIKRhMbBb;yf8;LDXlb66Y~?5M*qoI4+MEs2;m5KzxfRI&KW#>@}sKRSz(v@k7m|} zrI`2#xr(ssJxEtrI&{SyM;^K@%UR4SXQYwD=826j?}_)Pey~b47#Xc_W_0f=GvLWpkbrCO-a$Lv@h?0s7Sd8(q<8ihXM5?@=9Yz7RhI} zA6y|wf4?^I2t{^$%a~i>+%w(wnO-6Fme$GIa1?$OS96wgvH_5U;bv~2c=n&Ns{OOaGaRL@$UR6&kqozP!8(9XOZXgQ0suDvfst+=N#v2d*oM$%Bahlb{7 z^nLTWk4Ql)b}WU8V#XJxko62#dxBSCiusU8UfAw4#$t&e=1R{iv{Fw7jQWpGm?Yhq zXKB>9%XJ3Ya8v#R-X8i}-=V{Xad_qX5ft)#Tp|B7FYrHIr@%D8h1$P1I8gwCr8v-K z6V&H6@rY(kX(Ye=)jRcg08!>c;LM;jO@Wx$w}~{~arZ%&A!I&vk@(@`%pFeP!D&G# zc-XmfTdl4zo)L2Taic_48ntZlyTId^`-1|N<#Nq0Qm<8ZT%scfGt)<>{ghno9wo$s z+HTlzxD+M^5b+rZ+6=+ynFM<0%qN|EJM$p=pirMoXm^`9ychFtI9M%}`o0~eRLGl` z&U>}8dE*6SqU1e|t~o6_ZWk{MYPRa_gtR1I$ULB4yNUJKJ|8802?y$b@;|Ip5sY~I zA=5z!=@TLS%Y%Nf_{_u5I40YLx8}It)G4D;IibQ|3l5%R37LX^{e~uC zm1>GGnhJniP2qIM_8waF17h6su6ZR#7n|f@h}JAXmOC%kLWRycOyCbofG7Y~?SX6_ zB3T^7A4~I-K&4gqtpH?#5>Kh9{xZmi2|u{MsCgB~87nZYEW9${X&~{W15T9>VRM-# z3)9t*g6lGLgsXh7l=^!2JHNNc);(yozQWYL)0mBcmK@?W7d;&e02SbT6rk||5(aQF zY=r{JkwP|mAaypv%m>H_63|xyE|Y>)*9xvK0*Dxp;)UeMu}pc5 z&AMWI&BT_K8zg|kq)0k|@L3^mS3wtC;Y{76QZUYm4;jf(g(u-whEBd~G7|&s?&_Ah zl(S`^qW~nyGJKj0I86UO-AGftb-E}a`y?@giPYwUe};kC0)9nD9fSczhp<(0 zM~YrUJ~E7~TDKXch$ZA|9$BO!l5-3G=>mfIJE(F{RD$Y*%Mm7~|5@LFC3t&%O?(6a z4*}TL(R{=$a`GGq;PQp&%G4L}hLD z!F^zz7f2J%3+V%+@$p6!GIik&J@D|>HP_>Stn*;E0WqFQ^i{OHd9eDy8i!)d!j&Rm z1(UQ2C9O~*=kxZ^4M{mHB!`dW062i#*&@NelB=0y{$PQ#6j-?jA|ee${G!SMGzC_O z0suc78Ox2FBm^ArnxF(LwA_-fv5rg7ls4P3h>>zwH%U`>x2cCR>UtL;q?(w(A->cl z`Y9yy1(2jEXWnZYoSCMvD1kg6S%s`pAuDC;=#gDTm~<5f$(53KVQu>q6dWW~bI4x2 z28z7ZQ3=^#z?J#p({g^J5mPZ($i5F-I%stmN3f-!=! zHw2OJMU0R|zICLhMMhc1THR`cBx9J`P}2fMXM<{8qJGaBfHpv-=@ybs0F)M%Y_E(l zBBS5t9NLGH3s_KBH$;{SGbPee9&y!c$V$?(r3FG*fY$;b?+sv%fx(3YOF87As6XmP zpm`JTHGw!kOO%0&bdhNw7foTXP7ua)>7*E>RuVm4Lr)K#L?D2`pli6bx5+g=APX-evE|S|P;9 zt#ZoIBRygcxdo*pdF5zsMgBB`Z|0>hkU;?|C=(@77L(Sp&YfV=WE@&Mi#m3ZG09ZB zry97&WQ@reZSw6#t$Q3Foz=aCTzms%8xb|j8ZsV1Itqe49&Cd`_5frn1056ua~^(x z5P6c8;B8<$N=(3r(K2|kAkfmqTX$!qlblp7AzK?AYGL*_V&vtEkv=;T{_&Ls?DUcK z8`VOZZ+mgx-lIh3N|l$Mu>On9AF~(=T-`C%zcba}O4Mdl6pv^mbLMD~;_L|(mAZKK zg+mpa->!+16#b+T<1wP^5NIOfdnpJUbop-@F+o6N%i$y?f+N9mj>K)%a0Ju5YYp4) zF1Q&b8*dn@VIIP%VBr%=nX-3?+Ex;cWGOFl*26(eQZBZaY`;eWs3}?04)o+CrZx%O zxXWT}T0$vAVJ-kU%K3X7X?nDCnm)*$S&Yo;%uNMXtqR@+YamUy1n1U_VYL zjn}!b3rtX*{C)J=ipx|SnvN9FdL+a{64-1`arjk`ox04!iAi2{lYU30CV4;L=18sF zJn;gj)f}~#mmm4Ws69m0e@WD*(c#B{+6#32oeZbnk6y^0J3V;J}f4V z>Mg&6;R?OhPk4?M^v4_eD2k8HFq|*lom7raUV1*wQnMR*KEk3-tJHAP`$ML7Kt^e2 zO*HeTUnuT=x%~X4{E?q2FN$9|8#*~dFn%{%vH^UHvz&qp}a z?J{yb4>37PyTGBXll`?8$E>WbUVhKOUr16ulE)(D@%ux0ud`9a^jX^Nuh1eE(dzb- z6FgckpLQ0T(J*-!A%nwJ@Ph`CDG%Bzqfe#Xem?rh-)Z_^|CjAj%KqYKkC}{53fvT` z%eJdcD=Dg3;xazGR7v_3tG0LFyJ{STD;RYu<@jxKt&F^l|7tCtc1}iv{I}H>M^9KJAgJ@R_JS8XPJmsULXm)H?B4 z#dxk@Y~zsFSI9dQj8{xbEr)iBNxO)?-xhN}H}+py5t7eB)))7qivNZrbdh1MbYlzy ze`98@ptNJEf5v{pdD)>c%ERUgn6IRdE9fKGIfqLO-ZHfg8Ksd)#(3nv>eN2T)W$Kj zA1u`zQ~iKqV3{%vPXtQmaMD%(%@k-q{`}`N@^%Gd`A_cH?wxx>xC(r2&a;WD8!nubV6Ue(bS{_nLwWrPGXDOU3*qj z?Z$joZ{2MdWOGE#rRW)Na{@`%F}1gNy^h1ThevF?=DxlQo2PT+Ra(#VqoL>)_uR)m z@2qVj7Y=YKhN_RuKRSc2;4GMtgzR3@5cN@SS**)7{h0x7#Rc2_ z^2}Yq{ux~h;%+{owMPFrGqaU*+NFzT8~Vb^_}^J>kJ%sJdJk>`i_yO;?et{u&beTN zoSl)O8ac)*jh7F0h9>?~X|n!a_G_cH6E0QJRNCsy1q=Ag@W3tEuSxppSo zWN>yY%*-a|C24<@Kt`x?qO#GX=q9_WTQQe@tu|V@>EsRTl_T|sQrFKe*S)>hIQ8J| zaNWb6o|C1$ke!=gTSuMXgvI>b$1lW}>Zfg3-gwQ{sxxet!2wku!{7DI!JS2AaF|;z z&}&8q9!(p2UGy$VExFf9 zx{&|K{BFJ5kuz@&E%+#dbQk2>9DD4uX``jrf`Yl@*1J=4&s#U87mrmKWmc|w*_dV# z^HMu{Ct%s=_d`FYaSOpXq;(C4kV6K2W`JrZZFzq~^iYjX@|JHk9%g+`Z*5I;b9?ZWW6S{T4QJ|Vd;r4jY)y2V)aPRu?r3Ju5p)N<7sl(+6!S6UcQBvbav3zm0Pp0Co5(p z*#2WW&TDOVm-R98N3mrms}KCHRa>b@GdSY9YyO0=q)lAm6gi)kK4Y=wDt{lR{8Q_N zmtcGwPs|b=s`2m1U^FVytp&E!TtPdtSrP5sP^G`d%0fLv8EV_NikvrN>GF#+;`!}b zt+DIsO||#TEy`vbz1sdZvfZX7y!}OM|BNWRr@7{L@S-Z;@0DpMFyia-5@+WPE^997 zS8^)3p(WZK`iJxb^=3Ie+%IkF<<*wPQ*+&yDO)p5?j_XvwAPbz9By^=eEzy zUaxG_Uxr-OU@Y&+)|yIbzOj9cqrx#ix*ob|VRe0Q0sW9#`RC_J$XDuOnT2k^UFsr< z=V|AUnfkp}L*9Q)suh2+&}+~SGz*Ta@$b%HtbPKs%Wt^EZ4$X{{u%7seqOfGF-W7P zFSO^cvpY6R#Ri+ThHc?ql0VR{HG)>I^)#=3JbHE0E=LRRxPP=(jNPESw$+Rl?2Zgq zX7Y*!kVCfcW(qyb;nm4&PTBo;{!oMTPr7%{OX;mN$1=4Vfp;wAlS^RjuB@v!O@sS; zccfl(GTMIx@%{K|q_52~(Qq=D^+PsSpRqy!)r9KNZfm~gostn>p6sJ7b&S!!!mD?9A~`q8d(qa&cCdCIv(983 zUG`F+=++XazFG3c^nO0#c8Xh9&~0fp+eh-1_J`k=bF?-IIg*Pub*RX*{l2 zXg;S3<0@4v%h}i0GM2>7x%q8(U!5|z{+N8L13vw^p0|=I!ie)Z=9DNraP$beEwT6; z&)W5=BKqHud(@P*TzR_nuc7(dzkgnOKs90*_K8yJHP7V!aHXqbeU&duq;)$5ai9K0 z&zlx#?NbffdQB4N8IP#fphLDk8p&qyCrzHue6+l&eLi&9O0xtD(koXGodCjR$lrulpy;^5CnQONYgVpCyRjdvj*1e(#U+lse7vgMmwMKuK;svCjr!~3ZV56*i-{hICEb^E}wHsaCL zV`Lt4V2^lWk_ERReq;-Qxar%o4XHJ;?o$SeluB3n7!hvVL`VmM%r#e0vc0kf@xfyA z&>ngY@PZa9_tyB#Bu8lp!R3nF+Q$AG~uE;QKp9PuwIc9IeCx=6K zi?rK;=Ybk2rHk#xoYUScgg{8|0_w!soLYmzv5e))waOpTs>pmqdo#0;1+J>e@|x1; z10XIpW*bf^X`6vy3wl2#D0^W0A3R9^o4_E}*y42o09y}@ZU1uYhM@XeW$g6pkVQRn zQM6bAsQ2G7*c1D|Ch!6^PacQucw9;pDl{UuCf+XYR9;Y41c=+ZyT?VkWm4E|R>|-0 z5|VHK;s50C`xG9%UGsdbudQ=0iDk@JmCyUGHm)S0`UA}BS+Q-ys+zr1o6OhaaPSKj zBbaUdXJw%KJkg15eC5D@j$-1wg(5?#(1wWzii&J_uyd24&G39&6x)!61}UPaQAZZ3 zs7v%&y(OJXWcGYA&6inTT+&x*A+jv<*Dk+^N-AUZ%QcP5133XGN7MiX7`X%REFoZ4 zd<`o1<9pw76IptRW?aGMQ@DI7FH(8eyEv8zs+3d2c^8QPxjI*o&ZI4wSx%Z}hY=H*9n#eDMF2A+*;6WDE{xc4uKuP7L zoABkIViYJxC!mHP3=#~6reP+`OZbyDZV&PMUQ14SloxC{c;1g$9w#74&PTFTkD;7&co3ca(d?6(fA1(t8SyxH3K=d1TZDx>q6Twy>w&#oOT^qYERJ3zj zynXAJNQpj5$WQ;MzmQi8EmbTG4GtgWKt zhFoz$e7J$=ISVb*EI;riDBwMWQ_`a8@?Gsi_|Y(rEQ%Q6cDP5fI5&;MZ<(Q9ftr9&4HeoofmXPs0mN#2 z;5=POQem}UFsJHa{S?qs241NpE@tghyxp2}sp6PdbO;aP8#?%fi~aDYf?=pA&Fyu^ zabG|@54|bPzHX8N+{q5>FA1)cd(WE?cmL{-0`#*v@PT_`w9n*`Z6<4B6jjetB>WtyPkDIKBa zR5;2(JU)RsfjKEa<}gO#15Dh}Rs$Nt!|M7%BTPt{0Z1uv+Dd}`FlgU>!m<0r*zz;U z-L}bP;(b%%b4KOgtiYHjP+wv6pK~D8`V;K%1z=UQ%?F|Urzl7=UX_3N^Qm~jKk&lp z%G}{36N}y{yQ-`>=Ht?;2cL*9^NHaV;sm8IcNbtKNyfFLHXl%z0y{%M4M1q8!Wc7v zMjxOi07xjoLGHNdmdG)s;)kf>$Lce;#uL*Z7-fS2Uqoi_&t4uE2ThCpX2E%V=Pdz| z2>=E0$^EKmmKPEQG<2Pbj{@e$3eM)?t`umSooz(~1AlLDp^@M#v&UIDI2f0)#5`>tFZ zJqyjPd?(&#d}aAPXzSgJfhdg1&$w5I`TrF8Vmq#oL6%CKP89n?O%B)K*qKo8y+~m< zl8++U5=8SBT+Ff9qX_uz#*(EGlRFaF;X-XGhKo(AAdN;Q;4i{S0^{)m0iA#$9?W+Q zqvaFmWq>Ira`YN|wemx~dWrG~X0l|C7e-`5MPX*4z z2Mmkn&2~@6lm~giL0*+ve9!E%$7vNvAu}VN_c%{F5jR`86kse3CoW}IKGCjBmJ!nw zw;iiR+Ne-lDSZFong3=Ws7`3uB>ZO-&>_ds*Z>0)>dJucYv$zkvyX1Qo&T5k-j5%` zdBf#b#-L^6P;k?tV%ptk6gCPh4%<*Qw7%?c_6M=@gNPOP=Z-s@12VDl0CDkr9++rD zF!@svdHg}(E`UxZFyv88T%YF?7y=<}&P%8(0sa+%?BNU6)uKg}m#wnEL>0j^yxgR{ z++XDo%si@ZyJ^GY=@29utqcNS&x?aWvrw*2WlkA#=IcdeNM-hL(v->Bf~LxR z=5ozYq%*bU4W}ZJM@(RDOOjkZkR;ktnQdAvvYS{MfJZMj0nGexjTsETo|BZAE>@tY zBI|Gn)^bo&>W9AoQ_RmwDT-iM;M;d0eQ>V@Y^gcQ}? z!A_v35@YrW19YCxk@E>8nGlxzmpeCo#Wi}K22*H<3h_(JiLNT^8R0%l_|tithw1Nf zQgX9rU}drQ^QFj+jg>8q>`f8%*?P4`{r5*@tw3wj3abKO&>4Oj#6Nf(=}|r6wnweUE7kV{}}^^9bk4 zQ+1g4^dxXZ9|6DA=`47v0UdZ|Q>m`AFj-Q zHB}%(G((rGcfmpVmtm`wP7)EJWcqtWrm1q3X$pbd2aZ-k_MGPwo{&K%sPX48avw%l zVssfmuf|9`;jUePHd??vvy#gYLfJx7OdQ4Y|3oNX5Ltf7=41WR$}gv9UL@x}kA>0j zk;6H5m)({)J`K*VM09N@{VFT*GvZ_H!WDtU`wm}hiu3F{xDhcr_ zsm!ZJ&K!$a_6p7|^YqF>f@NOkFSZcX$_<_bFP!c33wZY70Y3VHM9cR?lEtw03#V|< zru$iv>_TGG^F>I3)RYh(MsQF2%)sv;o&#hi;ku4+WG*(1ge{}y18(mDWgK+u6RO=Ue3QAG?3OTN+R{6*@chCwv{M zaAsXq?;bAR1A+-T+ENj|4K_0ROhftX!!c~o@7C5Q7zN)w01}z{Py9Roo@)I<>c%>A zK?k|$?tZxrUl^@|aU`Fw`)296kL6~|n^q$WXW*#e@y}Wb1}iQSW4~oBTwJIAB|G1< z5t*znM)LlFdGbBZs)PWYAWL!L$@lZ^%Ak{t%fgRi8pD$lxft^+_8(mWU4b!7z78@r z(B&ASx=Rfw=rDy2Y$1LxqeCW`&46=gaq-gEW!wKimh+b6d{cgT|KoF^Qhm|WCHMk{ zL%?q@Bzky?;g2*H|IAV@sDD+y{3jkTfkluuF=yP3_kdokD94%kBXuCV8$WS`IeoPW=++Q6_a+iL3K z@HMBY;>M)Z zgW+xQ)=}C!6WdjoYkMHk)Q)#h-#jpgtZro8%@a=ImX_{3qToygQs!Ihw<>!@gW8%b z(@SxQHCna{Z?$+VnR~S+)irx~_j>!s6o+In%pkm&dg=7UPlVt>c^vb=itCNsqsffL zZp%mgYc$soaja@q&$hb}Ol@rRZ4W*is2NG5T82wm{RYA1)@+|LjL)s$QJMPTO#A-+ zZCcu{392+Lm^ihU8t=^>Z7{id z+|lUtiWdj0A?MM%w!8y$Zkehdf|zd27zS2c&%T*-geS}tktlY*^sZ?)=L`YFMcujt zDEXj5NVF)!$Fnq|OxFxW5}FDeOi!N*DUd=zq6+iGaC(TeRFX|q`^nCCjy+84cgPg!7GYSym% z#$0l*M^X zCe2QZ%*MxCAoVZypg7Qvql0M39~MG(>}>;4Rw}I8ruuzbsA0&#$qKVQ;aaV>H(6J8 z+-@0YPo;17pU+%FbZK1V`DoR;Xt%rk4GhmOM@m+DjPTlT*f@MC=M#%10AWu3_x;5V zIf*jvqwLujVIYxNrUI@FEM+$mO@FxyPw15D+U%;~3Wr%y-)>NBhS{e^1b5JXPD<~< zYfS^IOvN|SD~&VBOR7>>)e7LMY}QFTbDw2{QgxY#JIo7iNB%a*rSv~30vft zCSW>p^^e6DG(vX&8}rHP8XCfT58I^qwjugoT0E$(PPb4}G~JbaWh6L=(RDxNpJ?~J zOT}N@MSpfjOVcx6+_^i>s_ zJf?$P{u@_c9{A2zWvZ@}LQeTyL|>&vPQws2z5=qxh}HEN$Vw5yzS5dk5m|VH6&OjGUfCu1{P`8M2$Zx>|0x(Dg?q!#uO2p>ibDefp(d zKR3wm_CGM&y$y679a^-eouch~5@hq*0v3tDh{co&^=u`z-Ql&EF!mK)L%J5hSv#$JJL!IMcejuwTUJVXyXCD*gkJG>UV}|X}^m7Qmbdm zFyy)!c8wpt-SreQ`Y@iBsyI~>lbt!26fXyfji_jpxBQRK=WBJ%p=JP&#)xg=#_9j1 zptWj1xtnGRo>(=GhGRsF30TlFS(|@w%H(TxuCG$Ky;N>larffT<>n`+viBoqzpy81iDdW?S^l=ulv0o(O7NtJnk4KHMpW4#b7MwG@BOj~{-Bp8@wZWFM=qCPhhuio%N1{ZO*)5^j z!AzpX@Qp$bxgu>Tt9VXNj*_R7U0hwlLG?ZiUM!(xqgVUn>3M$7GM;QQ{&%S$>3Ujc z*yXFMj&G_K=h0t#3~q3Wxi~x9y7oEg%+Po^Q#eD2N@=%dJFbbmS&-wMjtTHn(BNtVIzY7Nhi1mf63u)ptMl-|af@VQMvcbm_6{0|m@g zl4?lvM`P%`jjG0dyR}`K57*OUtL>R$a_lIq3e5`&c(vl=jb+xOYOr}m}O^{b}Wf1j*8WSi1iq$Sy>)mrVn z>*<=7iNWSMSF`mJE~SCd&fKgL3{lKB zy>xmg9_{~qGGf=OFwLLDL(N;)S#!hE_6=NpmXq87y*)(Q=1sYhhW=A^g`ZwhEIftq`b)%q2mf1li?^5gB_KI5`( zhfqA{_N(XL?Jai~oBY-JwdQ`$;T)Brb_E)21J@%Szkq<=lYv`Q5Q{pCX{-YB!`?<6 zQ0GNwX$UaHmAS;`-u2|beBP#s&9}Z`RV_J@ z0=k*mFM=6xfW^C|Byt0UH{!jw6&;ix=TWM7%aYpU8wZo0%;+Ir1f=Hvg9ynM^FY=d z3v}gOrL^t;@f50vXj*z+d0Dpe*Vz3JMVieTd)D5+8avj~W1_aGC!94SG(9LZea|)1 zUuJlaVD<&wU4COl`HlGdL(%vq{Tpg#aP6z*QUgj;3Z;UYHe3)apRH4fxIwF5iu-!` z-8s#ND`I~|Ogy>&_{nAC%X0CJV|OpB%)T<~7vw-e_flCZ!Wk98+DZy`^_%Jww0Utc z;bYp0iClVG9?*DPIYd%XH5KxQ>+c)XBvJY_RODv(JZc-hI|P2P@{{)NUW2#Ii;XX^ zj9nSWuCeLJ5o=eKYiX6WN@zAQY33F6;pqUjq zjAAf-2V8a^8IIA4Ln+LKTAQ;}>?Y0B!S6Zo!|NX%Hh9=~?5@cRarylhK3)6Ok{ens z*9Mo8?xcaX`U7Uo!@RN>+r4lmZX&TIfhTR0(NS$^)TA3){!@EJ^Ss;NFxEmwGM5qjxxpGppH5?un z){rf8#~@#x86C7%4V?`R`VQBuzTENS*d+D1^5>Je$E-C~+-#Bguc-h{{NQpDZ4}CkuJk8!nEr2@#q~(&cF7bxw`vC>xv&{ z$3E=$$ggrs0Wre^rp!)Mm%B=H#!$ag(ACY7VN@Rau?#gnf18|EeSNwnuT!r5i)5T4 zOxPZuqO&u^oN&FgYoArlA3xX@t!Cy=w^4WRt6kk(^2j`<_|e+V6rYqJcQ$09%8FOZ zb!8TQ9%c4uhj|FMBUl4CB}C{${*$zA>+9~qQ3ya*u}d69|w+hV=mtUZZ{^FxWH z;m5!9D?4-IkFYJu0^QOQ?2A*o>so%TxxL_Edb-W-4^N-Dl?_-+x7Gi!6Y9<=k8!1@ z%NK7UbX0Vv91hj0!^TK?^y5NOWq6h3=*z_jaxCigO8KU&;l3J76GgThOQ$bAgnRIvZ_p5xV+l|H2BzLgyTe{SS@^$sVEElBsS8;!7pYCsXZp zY2G>%YgpSJm$~qNtAy=ndLCpwww~U6T|FHq120>Ow~c|LgAPu6X|N5AXip*AX~R}V zu$4BBdLes#n!UcR9fRV=AiLp&m#NFKhH#>5Wd%9dgAR5ywkzc1PPS$1u|0Kdt%$C6 z6c10t%}&>IzOILsy#w3U#>a;3>f{_JD*g{p@)#?M`}5R+p~GDF3YXwal#xeldO^=_42~>OBSlHDbidR>f!U4;jZ>krjB{hYOxDBQH45bHj7h}q9WI)gs$L4tj~!{Usk+R zOKrOwa@>P{(3tgz&8p>5PVf*(5$VKgB3?XPlVDe!?Ym=@!|^PKI|&p;5i%oSDAR3Q zEz-(U!?xw(ZN$+#|L->9hShP0Hl`j~7mK$M?`rf?`qY}#ddiC++YX5Yqed*Ty*sJk*kMrkV=dt~Er>>jcyQBF@q4V{n z!I#_4st@z-KX&e|OlcP3y~S&q>(~8n*W0!A|0^v%w_|nZ@tn^mVh8uGA8stVdAMxy zK+3;kv3I}l-u_(l_t(gO#@0;yEP3-oFn)7U&m@1*YKe95)((@#_RKwF?p=j-&HmkY z_U`y^qwulj|08rO{#z=%rw$jo=Z?1abvK>q+<})0pF8^hmkOW7ONCEM>W&TWt+-KN zi8l)WSLGgSP#kYjoY;Bubl3mx625cp*o$M;y<@w(AGY2ampuMi^XNy@&6!=Vf7iVF z-Sqd@%Ks6%7w_Nfd;I(Glb@%i=enonPR`7opSo9jbLju{3iso^!uS8DSNQFJuD_kV zi}wnTeODYD9l^D(^{+D4q;RW_gB2PsXQCpAWNH!45(=q$&Q=Ou;MIy+ecRZPrvAXn zZ93+`t&MWmYuC2frS$N*Zn;~@8Yz8JbGKJi4fD{(Spcf6Z3y2no+xyyC~tDKVwR!O z0&2G%5}eXjUV#xGKckb$`W_`Dh(X(E7vr)q$xay~QcD4SEgsSaYkz?*VH_bnWBOpk5b^xF!d!P&$ zV5SiU_J!4%vtJbJ?qmEKKr=1F(bEG{X^$*wChvKS_TF9Y-3 zdpQQ{7ae9vBV2n~Alaf+*1y?gI&5dW{+oMK(QfirmbA5#gXRq>rqwJmbdV`e&1w%x z2H;JSK$=x8CvdarTAaX|xuaFEMzoYkbhNe-(u5ho9e{14tfI}PQ6Z$eQK}`F2iH0^ z#?kBhPO?#HZ#F65^1s=Qp*I!8I{x5bB24O%rWL0OmGbE?~~gD}})6aP74 z4Bz5zc51W=ini)MC!!c(V_?MI5ERJMKQ7VHhaHIYl$u6ejVc0CC?L-c_2?i$>cHy*YlF2^RHY*|3tGy|i-*-2Vodo2>hF2Q^knVo#KDd7* zRDi;Cjs)D~iqgbt>EVUzC>@vIADhdqvw({qg+Duc{B}(7)}n6LlrcE><9=o$Ip}#v z(BZ;%n*ov&r;L9es@Bnc0AfrBoS>g+J8w7k2vjr0=h+a#y{AH|hw|_u@K)?=5ySN! zAEH+sf6qPR{+F*7J^Z`h)zO>1Y0s5WKCwF)-A)=}d{wf4BguRf_94c_Pe-eP#q&#g zow6y z9nhPC_|5SHBEy~`tHc(e=0Jreyj6~v;MB>ikLlptGXvxT>B->9V?s`0B2EA0{OdPfLN+{2ibAKK{G$#@pQd!b80tn$Ba-q; zwRpt?ti;Zm=r>wXwBwb|<4eB2fh~SoMu7o5-`t3ZeTp9jBu4C>z(Cw2Nv;Z ztqqhtTc@LH&C4^`1`m+PoyW;9!kq8b6ZE@EwBrNER<4fIX}~pVf@?l_khYDSX@IHM zO6L>jf*v+3Jtv$j`saXEe!~?iN+fkVfqOIz=%VBfO{qN8R0R-DR50-%wejnrd6jjB9{CYSL zzbpFo4Q=(I0-)^VVn50^!ZXad)I3B;;+Ki`Kj826G>*abjacN%2SI(p!{BjzA3@IR zzxw!HysIca@FV=}ZQy3k(F0b;3L~1IKz+oP7!Azbsy_mH zjOWzNx9aAubf4bK`JK@I_q*lG#?~0^zE)w)>_%x88$u0IEOA{$r&~-qqx!$8JlHtTxIkRGzs$!{3qGc8BE==5z5uf}=5z{C(3-@ZCq9 zzW*e~SIrGCbw0xfDHGZ6;(35&^d!YYbw>-Y)~Qz8vGMizQN~JOoMClj->bh~#r}Qj zq;hScU0}n*w8pHVqocOxxY=$5;S9u96-IzTgTJbybV6%4FN3nN5X z2{3x1610+jVoFrVOlX@%j6$A8NdXl{qT{UjZyCkRv7Zu_^;zTIxdznGW&1cEt*u9C zy9IVvTnd)2BlJhC;Gf{eq9sYE{wBquw%=}B6VpS5U0b3+^?WjdmXZM*zVH|afDGlr zE+c;Vd|wNaSG7ntobxKC*v;zqX?5z5Z?3jf8o|Hcyzt!rs^~n}n#dY9Jd@0%2STqx z=%ApXhd!Z(CZV}eQ9~6FCDK)NCm}#+8Wa^>#84De)L_LPiVDhVzy^vMJ7C%9Ye9FH z@0JlH=SofL5yz)J9UDy*!>o^k4CI>%tl| z`tiEkMM*oKG!0Qx%I+>-aL6?L!G~iJJD>M&#`j}I=z{ZY(drF)qWO(}pcX2{8LMQV ze;YtH#xyyI#3|+lJ*gWQX%WBwNrStZMwX@v8LkGWv<>pafyZw9M;I87% z&%tNTS^btOIGb)k;Z>?$00={e$Y2o@3yfLNv=>GWlN*_E;aUjuR~jot7A$}(Bkw}s zI62HyrgC0o+v1nmYkt!?WL0UChP!FvB3maK(^;v6=U1wPjU0T8dWjDsG*B0`N!4en zw$^poDo;5D6k8rj$|~UKEl~ggN+29qplSr@EWn)SYNP^S7PNu^Un7zaAf-u6*dcO%;p6OH>pj z3LsOaASLGL%W!b8z3t0G+hjF)?x%Mc|^5IgNZu-hp3leNl{|eVKW}^ozKoo#J zfVck*autN^?JEm)$fzrwH+!)RINFX|{|Y}SpezM;z}W;^U+fYOdz-l}jViJXf#;{U z#H$D&!euc$0@fH!A;XR=z9E@u8HTJ9H2xckJh%aRY8F8oowXS?Z{ru#>zZIE^-Hph zFz-7J0S#r~%?P(Y&w&+Qxc@s_^C$t(QvrrN>(O!OGLz8O2ZX2rV8FgHhN zWbKmy<&i%Lt=P()Ns*LR@>Vvc8}dmHMC!CAq-i=@g=%}E&>Z^ zqrOJRtYFfW!r4Lsz|(8NFePBZwC!sQ+I!kb0OQi!v4#zhj5Y@;fLb4j%>(I3IelJO z4yz?khCmp>E&|R6$h#Tj-7{MXtM}~?Qly&J116;QefcbPt{2Ne=WOoq4~%)jf2zVe zFab!tkUGuqBH)&|do-uw(VY!=V;vQF!EGF<&sguziF5;;14}Jkc)@FSVGk1@&Vp=b z@imixF|yb0QMS&5#KD0aA&-23g`IN~^HJ#PyYg;?&}zsG$(9JjUW z;IG5K!7_0FTZRsR2Lxb7Z;5ugSBMQ*KJGwZLCy4A`er0lf5X!`A7|6JwTKwI;2XB#39w7qzVRn zel1YB_V@Z9b#w;&AMY#^RqqCp<3T_G{I2ioS;}^0g03h)=T)wl`{QvlKm)osJjqIp z`<>9VAD@4FqR%F(flxI*hy{o8dO~D5k4#o&*f)BO_pIarTo(4*-9lma287gwkm@#5 zhEUotf+4(BJhao1iPK3g8!H9F8E|uWmm>wB%K%MOrvb`Ob_XxKjlQ-I$5LYY9mr4# z=+%~x)IdQb7_H!V0gWXgORN|xqSF>zD}W#t6r{voH0o+DIbh6#O_jOKv+!y)Jiw%_ z)Ie!`axDY7?Smd{*-T;ZKs&4bx1$TAig)8u;8Qo0osxA(`7C@IG}04^TBxkF-+ zY5ZCx)r-d&5$%(`Z$eIH5+ z;sDr=g*WBF2^x~qJ3{3pa+ij3OhM@p(r?OWlLGp%;Pg%wWhd+4b^uOOlNu1XQG@w% zTgAT!5eQ_=>(Q#J>YxCFl0Gp7qz7AAt;dX5AMRs8wNZq z320%6Tsr$66I_5aCKMsS=r$-Cfu8oqjE~1{`DXv4pHidf=s-!~=nbKF>07M)`Qnbq z7v*$( zT*~Zz5LKElEa<2MZEhJQtI-Gn>6=8h#KTUcw(A}sc??hWyuBN_FQ7Bo3 z^OYZ&IE*(@cit_A(vM!^piqH~ut7!0RzOP`go-g8UcWr(Gw6N0yZ#sD2#Ww5xl;Kz z+3zEzT~2LLkS{VR?aGl}8GR=}eWIXq*V7-%=tr;6c`o#)tdU^>>57W-A7m+i(8n6` zM(^co$Ol=fRw21nMLwt^(*ocm7Mvddy(VmF{R8jHgMOP=LN}}MIeYQpLO7gx9#LXC zSZJC0QLma1%o}%jD)fxU?QG0$&!O%>McQvSI5fX92EhBX-gF3T$B(j7*FjqU82Xn zr=U0G(bZJy`+7A2bMW3#lUucaA=*zEBa?D^2ZO2>Jf>||AKm))PZj+ML(908iZRz` zQR-PGH5ni`^IDrV22OLr5$W60wwAxCOLElhypqEhS?_>%`-e8cMI=%~O<~aEH!4aOa8QKc@Jn zimp)i9ojULZR{gWH~-YLrPFVF$^eJ^J;@)riu4gnSdC!7)r%%$0EDMD%>gs z{Vr?d5#z%Ypf$L?Z`b9)V>0@Cl{Q0L%QI%gub$o`AU&?7C0g zBb%pgTup6Lk*D&grvb{gPfzv$6gZZ=TYm5H--KNl*ed_uuO2u}194K|nRzH#hL2HU z)7z`&4VcaD3KrcCTm3p)FyX-y zq2xS5CYJkUk$O;i&lUA9+Q@6oTdWgchVgEOr`0F>a&fN?a80H`{^^DN^eyF`$3k`}v`gF7qOx z6VYhp!kO2*RuuHZ2MY2ESw<`JL=>+h*}X?~kCgxY(R-o22(Qcj#NNL1jK_r`7lQ}< z5bZU}&o>Wl{Mx;A2dif!+;7=1+sST0kz$mQcWQF_^0u!gS@o8i$o9>y!ahNLLc-4~ z^M0P_&DFAki!+Cdteq8xDZwL|4o~t%>=4(S{)RuhdM?iD#rb}o|JbPYr>@S>3h8y zvTcHn=MLR@x$wwqEw=rILERX)_;tr)zQ`)+VWfZUp3c6dg!rvr?P|mLzJXLV?k+U$ zpv8L6o>{Y1(;u-vMA-L&ydc3vNlW~+1vab>H-Qb;Z`gWs**$3J&=JCISBKXB`)4x3 zVu|~WN<*($FN$LvYhT#WIOK(7FlyAd?#UVF3$J&^l%er zGL_S=^itlFYRmJ971f^j_-A(MyIuAz)Q{8pk@40qbZAKL>?e7s9`D!vq20@e8#5a{ zAF?0qEqtFV-ThnNrf`D-m2#nOPKXc6+yB<&U3#ElA&(D%+!su3C6>ch{HK+m~kdzwYtBJ214< z@00SC?ucjPt=*$Wshwc~#;FpOCv!v5AM0B--Y}-|fUd0#mzqLDE3geKGodt z(180&l&@DE<5x~D#a2!&IO{I#@lPH0-qgf$xN*uX_uQF7|L32LoGIhoa16CNVtzvR ziS?R|YTlm6qygQa6sq0gwx+oYX*!z(keT5|y3n@5ceB)ZkNG*u+B5C6Be{qkt+y5` z!JDgwZ+M<~ac$iPj?Nf+$Fa0iwZF;R8C}SAr=|Ur3pKv*W)P zC15LoQ%*r`Z7u#_dz5NG@A{??Gqo%*M(|R1&zaDJJKd*B1)J+n*L$` zKL*o8v_zS;!9+HuW@_7!W1FVErLW5EL>nnPMwa+=xXQC?zVl4-{YHblQ8_U}L=U+7 z=X(31>JzoQwaP*hk<^7M+SnPntH~X`CN#vZ)6RPRflA#5zm}RQBZ~E{{B4hw)j{LE zw*vGBnk2?>pp_TJ*^X}bkRQ?bt8vE$M;jgDZo$K%M-3bDD$E|D9p-g2^;v>JldP3t zeqX%?WR;`#gHhE!7D>#Vfzyued6Y_V0sCxByWSi8*sl+&<2U~0xrCg79d{N`Z59U` zzGK~VQ8r3_=Th~13v7n&RB?W9$C>b#YR$)-FxR zf@wv~Qo*8&k;s6-V-y;E)~_g2NM2Qm+vh*LbT*phOUmAy@);waZZI!T?^xY78O&@q z``;C!$IiC;kZ!MQW6~QQ-8v2Fow)5Ce-hjh8c8Alh-ihRAy+GVQbQD`%Jte)Nt9ek znLaysPAxIt$s;<*GZ+V&Lv4DHYApnQ z*mTV77{^aPdDG=i>Fv z(9h~Uh4Uh{Fk4z=H78sdI1h*!OxwelphKF3*xdT=Qfbnng6_x$jBoI6xHdIXLg&8g z5Akof(KuD?4oc?&spn?w1VG)nLOD$iu{LRgl51XHQ?YEh@Ty<y(s2HNxjjq0r(iA9OdIjnh z2N?f{8wU;J{5~jOVG!W(aaVshL0XwwV`1oDojq`)sJU8L)*r+4K6o1Mz!o!kIFn(K z;e1cD2i^0u#=-(nm{vwm_2b$=d)Lf z6ZZ!QmyAPE!_Xp`*ij~SW=S#};UET-+&n1l+5brv0AMFK0$hVL&fXD6l_CK50`v;M z#O5m7VSolNA* zV2;ibKa5%C`xE3SrsT7l15Fts{kaN?P$Zs+Gv!4YsldggTjtVEyA~%;wB@nB5s#&l z|G9!ajZc$$IxEGA6BWQ^m+D3M%jMAo-W~1aJJ!NGv~2OKMHMP4lz`FTj+HACE0Jlu zb904OS|xQ0qmUH$IWML_J(iy$iA!kwxejm52VfK(rHSnXA_FdHC=iL|pq*?UEjuGx z+$}OhMOfFfQ+LHc0X~X{_hfe^zxMZ2NCM03p8u~Rh+VnpGH%iIp98}<5;x>s(j9Z& z9eV+e+N^Y@^t*$qa-Ox;zi9Dfd<{+0zSx)ffMdxr|b%wvOj;WtJ8nsKU~q0 z#H~s!Q}J8yKw+BZF;yk(HMbjW*o)^Uu;s|`ukPA`~6yx{Ic(;rM zsBt%Fm@P6uL1O`msX=Y9t}Ya^;^Q&Rmp3WV&#?z73p+K1S6v!V6|w`)+$N}^Zv(ow zv&959<@UnI6V?!99wT!(a2l+i;oL zR;vjcvq#qj6AKaId}?BKN*^4dchVEVf78QJHJ~LM6>sGm$N{DlFp!HJzQq~HP^LhfZrI&<$@&UueZ|qwmwnU~(zy`)s|vR4?56-pMzhz@g!cn$ z*j=Gyd%(+H_}hX} z0JcYI)C?L3MT^-LohhJ^3^2jpHp$qf@Qq0#7k)x@19&J;LWnv zb?*G{mtJ6dZb|7?yzNyOr)O4Dl_Y@Is^T|x`%!JGjm!ymYbxXWF8d?+KW{_+4DkZv zbPFth%*T!mMf%2XjT9pNGErxdNMDMYb6+i<1{nMZ8dq#FA+ltOEv1jW**7h@xJMuH zVfN5qsHCtmC7BNoKRuP?Sb6;YsZjO#P(fvYV?`(zu9}ajvU9IW<-!TPO8X6jExS(T z2&&T9FEd#$Kl@jYSB}pA3mc8x598_-bxboIU%?vCx_bqw3>%FonJ*$|sZFFJW1d=P z4y7{yV+=i(iJjD-g({25#9hBPy>}&6#=s0#=LGZaKedIcLJ4Wgl&Y`3>6(Wt2d=D) zsZ8Y&lKraE1n-g@2^AX%Inq-(%xp=?f1G|A@U-%rBBi+!leOOQF$!QbdCuV;HOw4c zg<3IjHW=?w29T61$O6<*E;16}9JWqqacAtiarIxpMVL|s3CjB)7+^@kYI&0sr`V7G z++sL;!YsGSBQ29haG$G?DwXrB82HZ8sw{q028)o!sw8++rpZ%!9_A)2Wn=9CPyMU! zU8!8r2lJ;}-23X*4A(u_>SMtRTD=T~WnxPK00SZtirPPT5A&kTNjVOgB5kh7)DhK| z0>tT1Q$Cuv9W)h)VL4zjjZ4)K9ryHY@p`$`zG_UXFC8H`%+H24OGDVcG+V;ohJD*C zF8yBkG3nmyaj%bQJUA?T)o*I2-?}Tpe&Q}lg%``TJV-bTw%A}0fTgPlD8Li|CJ68< z_LX6o$Vi%QR5oEEyKBw{rDxHn#o&(cji$}09V^ykx^lIwBh`jC-1uwz;=h>vpwbI;Vu8`k%dH5n^_F3$r7Qdgs{jVdN z>hQ^ii?v1wEQG*=dQ`s*@R8xjWe?2DKoent328>QOkl_pnG2E)c&OgIzvoXd| z73jSl&_s>%Id#g?8ym$Rmo9}iL=bE~<)^Whyn68@kY$m7eKJ8dm1LQDZ+=h8-&rq5 z!YjkFsj@3tBIBSaeJRBVN14E{FS)zGSYWN5zI64ePAT6Z^K(VA$bc`tv~7dK0W~%q zkfdPPk8DFZY9bRw2Yt*$tJaoPVXpF}8{V<~-<_~wbBv(@kJk1}%ky3Cr?Rt!-s}Gk zFTTCoCK-V}H9r2lic(30UD@~&ZctI-DwrXz-JP>~HH!Z)$_@~O8w{BD;P|Ytu$zHOXw)LAEk3Q*?eWNX#laY=rAtdu={w&k0Lu&VOB|SpdWGGg%H` zhv`%)Se+bYP==BepU_OvROMEtKy0MIt&1oz;{BAke;f(RF8u3C?oe3%)BJ(2{!^!( z{jubJ0(Z?rJ^S?%d1PVZcXvWxp;`ECw3|BZuKhzixrQfpEwK*JRa4e~d z)=2SiBzppoj#YOqx(+BmrmQZ^=D#% zRFeJ&^;m_N;gPdV!xr0)?68U4KBt-Qf29QBKto5qj7h*OFSeJ3{X;k^iNsWN-wqx^ z@m%w6=?lCR$E4bF`Su&z-7*b!^qy*--MFy1bA>78b+v7zd)7bY9z(sEF(Itzn${fJ z<1^V+q7y3&-fJCpUU^O!-=6VlJ2PstMr}3Zt!0@Dc6)|V z?T|UNpAniD7K)$!tOk~E3DyiiOC}WWD2w!8pso9|E~X!R(^$#dT-BLCbLUy4$7CFx zDjjnj9*u~~bS=&pwybFG)jgiBl_+=Z3fr~9W0Yn__u#oD#<<>S`SQVWy}71Bo8iye z3u$Xcl-dE(GDwF!#FpS|EXKmkLY!5AHnlzs+@gob#T4fWg_uJ2R}WB~dSnAs$sw6| z9w!TQU|^`6D|aE!Fj2>~>gkUJry~;-y-cg*b30G&bm^13!i#PG?7iQd_a$Jg=Zo_~ z*%{7Fogis9LPI(gNoJI8-UEhzQP>H5C`}Y<7FzZ|UndmHsHQSH1;3>LolLM~^DVP} zBxWZJwjF_Pe{iL{xqlC#9}(|5))<+^jb<)zyXSUozph)%HPgDcihEP(cLSXKPE!^Z zE=?et8{1n+g2NQTkGLh>%9YF08>UZaze{-VL@R{VCNADMW{0CDC8~m<;D=$&P}z6I zpq5R-`hJfik@rR?Zf^e<(*vh;QYvohzsg6gvn5^XG0h4q09j*E_;d^n``Vey@xrLlb3yHfR81@;m< z^^CcLO{cT9tsc3GnDb3vWc*-uNak2SrAhAY_9oZP7j zQ&nA+yWF!jUXZ3+(p-yoWG$KBbQ}J$5_pf<(H%UjNCDj`zax z+~h%#TW&TZws+Sm$%?_+wP#sCF-`srpHXw9R*t+=L0;tTUsA}xD?&a?)quox`Ml z?cnUES}W9T27PjcgQJLqXhbo+2%&i2WB-}6d;S_`TK<%O@J(8&y}3N(Aa8x{!t_U+ z9DZ>|t~kLYvLvR2mYDx9{e6JcxgnELp}$RC!TcqF+RuVy)s$$gUfpEby~vqO+s@c7 zoO(7V^X332t3#Fd7+68Dzvt&JTLuV?h9wk5a;P_aA8xKcZ!sNaw=kI;llts@^D@te zuIV?m0v>e?+neq2Zf>hjVh%9GObHW9Z`(5N+*-XH?N1u=y>@X4Swj`;?|;cn-sLV> z++9bDVTn!i1W@sOFF4C&iR@Wc1mZAb|^iApT<;lNGMT}m)d z{FjOezk9JABB_EdX5{t^u6D_siQkd0&zmHMy7V?%(X(aF`S-RHZVlv~%5Re87skXc zOXf)9nPP@S6JkECY_~BMk;0K-DdoZLXR6D^XaZVOrkL9Fh`UX(nnPqyt)loNak@Ot zL2KS#1I7~ziskpRSh7~yp)apmkM~`VNxZ2is zn>X1rpQ2kIZje92qpath&@NRU@8T&poPJ|Jo8zF*s}hh z<-B~2`Dp*`vr3RztAjpf7}pwzD#i4n@p?+4B0^BP+j^@)HU{MueTF4n>`MZN8;VL;K-Gp-d){2^j{Xw)3XvPo^;+-lh! zhEGDU*g0XiMH|=~DO!Qmt2M9?ZDa!R51V75rD(PN5tC}q#rxnxzhr(n-B1B<1N-ctr&<*BBxq39$K3UYqQS9RcPiSRPIe4af-&e-z}H&HQn{Xqj1H~JBn6*rY9rt3Hy8p9FIyLf0#_BOxUV+u zrl7pJ3174;(WAQb2%;?4#$82e*~WSZs`t%?(R|-(1rUD(Sz4o9wACP@B%|J>#m3%> zJ8OcgS-=V#W;L}R(zzQBiJ3!W=2ww%TE9Vx$h>7IQm+W8K=lQH!Og(gA_RYcGUnT1U!DNpVGhnqP1ZsO6t_pUYs?{l+dh{TDEA^1ptz9rAhIE z{^-&edh$cy{^Nh)NQ8qgB~bt`G2c%_#gC{3yA0*@FX8- zS)K^>TwnEpM70Hqxk@Kyi2J;7PicX5K#M*8M94a)R<@VvSLbN=p4vkrhb&10%;Cf2 zhZ(W00`vQCuok67SsWv5hvBtyUL9RJs^{5j`R6c|qm0%8K)rerUPe7&_n@^CDILC7 zdIl*PzFtBWFZ37&w+_}ftj(D%QR3IP^TSBmTP~Ha#K*kFjfNfcaKamlo?%}E{{Zoh%H>7ed&4GI{<*E|kG|sp zIBfd`Q8jzD*QB*4b5eC{)1NaYo#}(yEC}t{^YddPM0MRY-0Ox6-vy1 zs5I%hp5cas>Ke?i20^%fxW*ab#`fc4fNSweh*5Qphk(|~!cO9ruScyUM;0|c;=c^x zN3|_F^3b>C@V4Vd#9W9=8!%Vd9lXDhrhPMASpQ1%bIeP3e+haXpb&0scc4cW5qA=5aRe5c1; zbxeQC_vn=y{pIb@j+Zm5ejTA-MoDwj#&YDE@v5R#btR;?2~daN>#8M5gNCC($@Q?H R?;V9raQ+;Sj}=Y${Xd_y?6?2` literal 0 HcmV?d00001 diff --git a/test/user.js b/test/user.js index b2ad5970a8..f35720e217 100644 --- a/test/user.js +++ b/test/user.js @@ -1077,6 +1077,26 @@ describe('User', () => { }); }); + it('should upload a gif file as profile image', async () => { + const uid = await User.create({ username: 'giflover', password: '123456' }); + const { jar, csrf_token } = await helpers.loginUser('giflover', '123456'); + const pathToGif = path.join(__dirname, '../test/files/animated.gif'); + + const { response } = await helpers.uploadFile( + `${nconf.get('url')}/api/user/giflover/uploadpicture`, + pathToGif, { }, jar, csrf_token + ); + assert.strictEqual(response.statusCode, 200); + const picture = await db.getObjectField(`user:${uid}`, 'picture'); + const uploadedPath = path.join( + nconf.get('upload_path'), `${picture.replace(nconf.get('upload_url'), '')}` + ); + const sharp = require('sharp'); + const metadata = await sharp(uploadedPath).metadata(); + assert.strictEqual(metadata.format, 'gif'); + assert.ok(metadata.pages > 1); + }); + describe('user.uploadCroppedPicture', () => { const badImage = 'data:audio/mp3;base64,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';