From a8b4f9f2faee7d964b240f98d3696ad32a0d850d Mon Sep 17 00:00:00 2001 From: Hunter Trujillo Date: Thu, 2 Feb 2023 21:00:35 -0700 Subject: [PATCH] Support MP4 inscriptions (#1419) --- Cargo.lock | 34 +++++++++++++++++++++++++ Cargo.toml | 1 + examples/h264.mp4 | Bin 0 -> 61382 bytes src/inscription.rs | 8 +----- src/media.rs | 60 +++++++++++++++++++++++++++++++++++++++------ tests/core.rs | 1 + 6 files changed, 90 insertions(+), 14 deletions(-) create mode 100644 examples/h264.mp4 diff --git a/Cargo.lock b/Cargo.lock index 7a9e511663..aaf37e866d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -627,6 +627,12 @@ version = "3.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0d261e256854913907f67ed06efbc3338dfe6179796deefc1ff763fc1aee5535" +[[package]] +name = "byteorder" +version = "1.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" + [[package]] name = "bytes" version = "1.3.0" @@ -1930,6 +1936,20 @@ dependencies = [ "windows-sys", ] +[[package]] +name = "mp4" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b3f2d2c1de60843b72f18e2cc79c3529791e109747737e65d547540482c10e8" +dependencies = [ + "byteorder", + "bytes", + "num-rational", + "serde", + "serde_json", + "thiserror", +] + [[package]] name = "native-tls" version = "0.2.11" @@ -2018,6 +2038,19 @@ dependencies = [ "num-traits", ] +[[package]] +name = "num-rational" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0638a1c9d0a3c0914158145bc76cff373a75a627e6ecbfb71cbe6f453a5a19b0" +dependencies = [ + "autocfg", + "num-bigint", + "num-integer", + "num-traits", + "serde", +] + [[package]] name = "num-traits" version = "0.2.15" @@ -2146,6 +2179,7 @@ dependencies = [ "mime", "mime_guess", "miniscript", + "mp4", "ord-bitcoincore-rpc", "pretty_assertions", "pulldown-cmark", diff --git a/Cargo.toml b/Cargo.toml index ac1e25078c..46fa8f2228 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -36,6 +36,7 @@ log = "0.4.14" mime = "0.3.16" mime_guess = "2.0.4" miniscript = "9.0.0" +mp4 = "0.12.0" ord-bitcoincore-rpc = "0.16.5" redb = "0.12.1" regex = "1.6.0" diff --git a/examples/h264.mp4 b/examples/h264.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..11d8bd50e2d8ce8981818f05496476aea5331947 GIT binary patch literal 61382 zcmZs?2_Tf;+c11)F=H7F#=Z^N4aPoX8Cw)t${I0t$}*NL5o2GoWvdjWBoQiGS;k%| zR7g<Tx#5+4!i6~w@6 zBO)XIyFvcSl>cos2K*cTr_TQ{h>Xj&V4#2F-|+vF_z(Mkqylt0gZkSQOd!To6n!2D z`!nEsCPYHw-XZuQKxFiezX>aBkhK;9-~pqYPZ=f9WX}jP0L;CNNM+Ch5t08ont}dn zmH%%?V+0JN{(l?bZ}?lAzfpw2^Zv_Vg#YF-GaK=?K^D{D<&iO=oGT^CT-+$rXY>EHb_>2w{?nx&9ZJ+-)C1eyqi)X=z}Uu->8JzF1XFZ3b$g%wVY;w>2|Y(!d%ynlSQwe7zYN zCZXimAYZ>otQsD#uB3)n)nPCLA|uJVDk{;@(aL|jYiN*Xh;nGSzsg^|$^ntVK@6Et za%5m=NQ5rd+tbU_TOW^QbV+?xtdFl(P^kA=eY`H?hxH8c42q5L{Yznkef1f`1sieB zi-F;>26omrmXWQmrupBf2V?x}tKqQ`-o7Ee-sk@6`nUXFpM?8H1Tg4uZ+-7@KWwlU z!x4X7$sqLA)Rpnru)pT@@yc2Zl>ArEztA&AUrUFuX>G$qcVD+K%CL4Mq!v z>Ei(f0Pzyv%v4)*uPme!nR+@AN+a8P){k)2c591PmFdjlG~4 zGVT8&8bUq#t^+94Gn+94Ax%-V`7Ulvrj#KLZA*dE#Fpg871(s7gAl#uYzD`7soM}U zg%c&WImJ#;J_nl%4}4I7Nhtu1!Y60}2=N9p$U}&Bzt4uwrYtx*x)WrKS0GfT3ZDBE ziWaBE6V(cZm@lEvV zF|rDU`yZsWOqxq%YBr>2XH7gJpHE8lZJ8X2{ExT7AzJ5 za8c&CC4+MMvhhu4jI3okzbyo9r3C+#O7#DDb!e0xyiuZxpj+-_=x;zWb(4KnO0!h$!(>E6NM{UGGOP%NU;-vc1b8L+pDhWx@BM{f+G%vMQyR zKOLap<%*>T^hJ0|X%BC3+B%3$)0XCA-jFtHIXr_DFI7ezhqYbr-HTgl5>PytRiPli zi%U=ixVl*kpxfmq(J=wg+He&i-%@#>ssIbbyc{BxB3yW904^m&xUbmYKYYJXw%6sx zWi}cr*o8VrZ+%Y>lBq%|ncuHGn2F9R@FX(t8<3=UK6Y)b#3sH$kwnCeO!C|ncjtys zIlG>kKx7UhO$t{!e@?s2HMnv%Z5@*OsTJ}hb^B89+!ODf`h#D;-q>6`m?3wA_7v|- z5byKs+33#5VyKD=KY#W@GurkO`tH1_{FF8t z1NB*7cE3?X6jPYx9$b3C`F<`Na*{dKpHoqkjZf}jMi2i6UXu^{yyjMR_G!+wdFGP7 zbU%@Ow&U&ur4PneOZJqjkoiz!Gh5~uaW(O}52KOuukTve$FjmOw8;7i+(+b!%Z2dB z&qP6NEn=sMbDm=IlNrt}wkd5?1WjG{>`u6uQ5D&~?Cc7pD$0o^`}W6TLLiZZZZB3{ z^+(MokKpX2m7d-;TOUXfF1TO|qHGH(p9K(`Snv!2Lw4w_iujrdD2wZnoOWJ-o&sMY z_<0*3G|0UuDlqvj}FSws$7z*SgFf!rqem2aTobRU#CO{n)j9g zxGgYZ#cM33I=?XXi(*frD{-^hA|9=S-tA;j=s&HBb>NnNP=>#Fzrn#mQ$5d zpLURF4fQETH8oSHG?Rcfv_`;9-sGB7Xl||fctD2C_v**XwJa)(47iA;+SOJ)m#|E| zk^5GdnU|-^ie#B-^MYlQ2uE8r9o+zy!|Esbf+~|klPD!`5Ao|!p~rl4@VxjMpNi@4 z^-FLKHg52YTgsSsCnuhlsL1pPd-JxuDYV&1a_d z?Sq&lQTOWO?;g)^aw+w8!UP~17!qH@DPprISm6ifI4LaGA3vwaOW2BH7usoScdpJ; zN#Lm}WAUdPQ-EQ}(IY2QZiC-y-_Fx5Bg$H+}V7Mx1g-Lpn z*agy;#UJ16it;<+(&adi(ApO=PefCn=k3gfFwH^;!NHR0uqLe!V{hI!f>+m(&7!)N(38OL!ylk57tEen~zJD%tAxR1dxOOTxzkM3NvW-HMFiTc5IQU@>+(FeKBYZ& z{2ciq<<={8&s(h;=0-N3pT>NlqNujlP~w*n7S0`Pzi{~QxMg2Q-HO3N4RVYBayS&%BhSC2jWn&tQTWO~LiN6$n5cq$b=Is;a#v25o8 zseDJqRrN>Myf#~i78{Lk5|)IMppbwjJ!S%a{j3JXhb*<;H7%9DdApzud=0ddW*Jd} zlw4da++3FuL5Q%gkKVVlWIAjMVB@iv0G@VJu~Q{5)ov3MH@ zP}r#`EbVLD@LoX5>teAs;xx|X1k(79Z3h;lI&wcP6JrwejD_~=<#?SJcmXc4jjK!h zKpRZq&nz|0e=emc5MV~n!bxf{YJd^ET7~V;u#@N?x$k%jU_t>D6c(;K4IR9ijjcUK z{sc45z8yZL@QgSf=2puhB_jG9)sm+z5+aSo(|GFwTc=m%b3tfI2`}s(>+YWD6JOVB z|IngRuGEwpZnRD-Yckb`pv@!L%GCq!1UEZQ+ZQ1Ce(D+0Ypyb8LkN^Kkg@y|QP^H1 zy%1hDv;+E7h)oS>PwiY9?+u8sOzclT(kCLGiGR67wJePfmDS6h-1b#2ox+SRVh*dR z`p~!gk>3_-y$0!%w#R0cm>O=lmg=uK%U5OE8Ff1=TWC(RvOtJMNsv2UN7=l_0s2m4 zY*DdIE>k=Pb~wz3BmS%74^H@c5=F>J;7kB7pDNXVxYODBG!c<5iVo5Xym87@p!+nW zau7z2DWZBN#K0xLK6?!IsH1Yy1c^bmpEy4?CJei~1@pD(M@(%LKGy-6U{B{B6m-ir z2|Oqg%*0Ce-WSJSH0wjkE@r<$zB*0G11SK#6q0$hQKbW($+TvEkTIFd`uGAsCyi^8gA< z2Fpa$=~-K*EC7F6_-5F62cktJqGenY`U~6m3Of(Tn&KNze^YhI94UL=dJuJ&n~0!s zg&47OM2NUxfv_}*DC9kuJje_pL}0&dCNFWa0gfB!#hiPR6_(HyxCyb?p(~qcUFF}Q zbgorlaPnp4kGt}vD*UAYB5(V=@{<%)SuUv^ek6mbpqjk$StDcH{Uc{eHGhV+Al2F7 zF_6E)^$iwv^WYS=RC$roL>@eLPqmH!sXdF=zzF9<)B}!?H5E7u3*ytj`5d+?vwrNA z#CJw!m%w~QobxEu2S;NgM=p)`@i1jur2eRmGp@he*x%9roW*nYksDn_eL3IYQVlaA z0>S5m!JS%fR~Yu=`dVf*bEvX4DV)eM9B41}%_rj!z4Yh!KEhjQ5eFmOmMnd{aVO;m zM+n*$O~bPeiDH4z%kw?iP)~sbN7h0qbb9;2ZI8QhN}W}?}f#lE%nntu;J0nES_m^r`{ESW2)VZreW$%;`kYm@@?ad-P1rF zlY43FP~&kQk^x_#P5PPPJzNeKrX_QDo6|~qod$l`1D}fM1<31hvOgamK0c-o$chjx zlEoC-xo?*A4K4BnlXclQ6J7eLNe34hR7% z?@ubOt7X6UY(^+8Oe>s$46R;$lFkC)0&(!0-&+OmaO>@mNWe47IE_#p;Pu{Jevh9* zV*Qc#R3g*zZfd&%#Asn}f5w4A-*hQZ(s;}}-80{+^v>2GW8F1;Ry zp@{M?^hyFOtU``ve#Lw;%h{GxCL#Cwn}lG;Npdh^?xR=yERM#CVoOnf;?`uQAh5+I zb17w*l$~9G4a}UUS(c$Lpi*^x;a9nnuu=(Dj-*dS*f01iO`xG15>2btGSpH zSjgm4RyZmD8C6ppW&-h5gQq-KxvtSMbdK$?UOAmUv%9go_2MLDFpx?zt~Qmb9_^_uMt@t?xpKCvSuGEbI`W5c;ucVcLelxbP?5NeIF z4ER*nx&|36kKM^7flcP7Hy7eyg>m0z>a2!06>&xWyA4b2a&}v z+~Vz0#;wcC;_u*w>94%}PN`ovpWJM}YIXE9h0>Cl8yJ~G&Bi>ATnx3w$E8CI9M5{U zO;w#Lhn2VsLU*7PQ*0)r^^0?XRpS%WE-dICNmkN(p}*x03%Cx^{mwmodYiTSmx|cM z*ywh8e!>XJAB8#sk}tk|HMDr~7#&e zOdV1pBYi7?Q^!Ya;Q{yC#Qjh~!+sJcDKozJ!f!cf(#uyh4CetVH-`x%71HDq2;Hfi z;XIdgh;re)8m>{coM{3@Vk?t_m`RV3ULNp{msahTbWqSN>swcy|LJ|eeoS(R;0^fT zmKu6uxzMEXuXac77wcYympGYH{){3 zd?w`43lJEVi)59M-Fj+QJ1zDnTm14nH57q|%2A(2!eosrAE<1M?CvTLS0eWksTbb} zRPLUeN)E~U+DTbD4DJDUNFj zra{iYUk~s|*g+cE02>Y{ok>>)Exg4cIOjq&!faSOFMfVODsN{hBe(2l)q#iyilm5e zuL{FQC=@VvCo8OG_+L{SjM%?63e-jkN9}rNYvm;lbUW-YDOq78$gv|;;P`{|6d0x0 z_vN6=`|2Y)@h_kU&}p6=E?^w5&t}VSa^94;pAwrxeI(RRSO zJbt4`=*Z;wt3csJv#gk613B{1GzSZBG%A-V`^|B+7hjZr%=-g#5#4%PoB185-=E%u zVn}%rzNP{nu>#^5F?1NU=uPp25bC8S1xUL!U?I3OF|4c>Ng(Jegi@M`Z`<}LV_5?!)z45<9IdzRR2%)^En=yEcRt>5xG^Kw?Th@_>&744RBWQe)=O%b39k-p=w3WAb;K2TZ;Xlkj-i*ZuFtz0E?!zVg<>+geWGx- ztUvqnQCdEE-rcqmL57VQ5A%PBVP_7}S-s({^SNFmw5wt_M9+9!Yo?D&?glbVM_@kx z+F8?5HfV|nGK?gmHBp74J*2>@gbFmE^1s_71MhPFCIkw2(9M$e`ZV8%wcBbLHRn>X z^S%9XkO!DY>Moy?+wobcuQ`a%pL+Fi;J9HJJQl8l1OnoB7k@o3(9WQ4#qt_IUBc11 zjsBp}Y#jw`)PNv0*(|fMIi_OpniP+62<;%v?LtQj6s^@**^nO;tiB5Hqm}_b zw}#{aB;1FIE1f;nNH6?X{Nz(8;>EBiU}>wOfJ_})fW7ftiVCrq!ex5>yTEkOLD5sE zs_IY2_BL`Jvdubo3+^_}`c}E@-FKK4AZz+&b*8eWxUN-%xg2$y(Vk(yiM&X8$0}wO zvF=YL&qAqP-}GjC?{i?AUVE;eSU$cueI%lvbZ)!@%Ov+uNb(}q_4MJVg4*-c=t7Tq z##ot+dE?$Vepar%4jFQ)j|UKm1ju5NDM!STfskT^ej{0kBSCRk!CsZZ;Y(?HRrDQi zW0cEkcBAeCCkEwu6R_(Lp$`u087w4oGpEeI95xhlo1d2?&ZA+h_{$3;vj0%;6GWxN zWJUURKo|~RhNpIa$e68N(bW%X_Mxeb0jt_l`LA1PuS4}F(IAkzmCjp#u$=8O`gqVN zMFt?Gl&j#LzC7A;RcC$$C2ql7d@2ixf`dfSu_YNR>T1CrtL@=m*u|u6pwb)w1WF+0 zw)o?hyy{Q%cA4)}ezTfy^qpoSupUB6r?KQ*413EVF+x4Z?TEE-R&L_07*@MhPC0^O zii{vOsloC&b1QAF*kR6{m!_^$0=w!>(nQ2j?Wn2?nP?5+pQ8`D9PIf7?ilu@WiewQ z$)AXC2dkB@@Qpd|8TT&q25oo`)M#$HE{1<*Z~Nw8!*V$B?MjxfdZyP!Pi+9dd^Bql8tXZncDg-_w$arbqZb~@4Ly~54?}`4c@4Bb zFO`@mI=D~|h4UJC4Rm<9&59HUnHsqBNiVaW7-(N`d-;NL;{p#e6AlXDNlj%eoPPwO z&L}+5`O4z7W5|xUgsg1`8uQG8fh3q2#pidGEVAUOk1OTz4%!QyM=*B$EFdBAeB2eb zM3R5g%XhiC@$I*3ZTSZY3WQPk3-1Gytqn2mXEdU>T;P?$ML&fB{LBO&|EVc?iJKb> z&_c5sllui~Rq&^C=rg{y_$>O`RJpd?E@e%k95QlSuWR^&j|5&dIi0#4lkNQig`e_P zVzc?sH{4{OH_o_2oq=kLY!)nwZRfte^K}u&2KnKQGHBTiHI_HAlNjIJNgQ_KU^ZrY zA$09%q&)vkc)#ppdx6F;$sRBQn;KUYO2=Nr@w18eJ)oF-JO*DJC=R%W+<`^N3gx=m zI{&Rs_^Bbsdw^Gz3?$ud+qy+jLE8J2@)sV?QdkeBO9QB{%Ib%FO5LNHWTguPhcg<^ zy~$&rF9C@p;qD{`p9zfaI>T=Z z?`>F(jkTZt;e2L;zGUVR&)7L5^fd{m4}Sc(^-acvxA7bciMing*HZ9-d+XiDA)Du0 z?AlEy)b~|yl?;{btDb?!e9b{xG(HJVn}9tcnL8g4=o`5rT%B((E|pFD6zEQoJRcnx z7;LY9x>5DE&gUQNySqC+1&rrIy!M0BZ8g^n+w6)ta_Ef11#n!e;SiSnh(;q5&vs7r zPJ=?=;t#`}phXjpL{u%b2q}33&AL_Bv$onZHj|i`D7v#YH2=DF?mn*+f`*#l40|!P zzjoorc9^+D1tecX7SY(Ur2o-lb#>r7pM2}e^>XI|mOESmhs?S>PBRYo&a5o#d|chb z(FotA3@?1#E>+z6AwUJsebXe4nt!8DJq!~tO%)?b*zNbI`?ZZ{} zL=Sw`0IEiQP}l+6eD?Xn?-{lso5Ym+pUwCl2(9f&iGz2LJ*Biv5KS5fs6FFIgxDLz zWp|XQHPUzm$Tf+%tEU`TI{hJ@I!qak@O-m zw!1EIC=pcz7N5>+(&@o1zgAoM$Z(jR#A)bUBCl7&gXMi+vv2FIOy^^+CDN;k_Gdo! z!zt`>)naC2+sifkXNkWIpDoOXGtP|+pr=ZSMPJZn=w-=3nwGT4bTZ!VJ4bRAFR9TH z27}Q^sV%TqSQ6C0OfPm`4>1Yb(DUN0i^o|wEOA`TYKW%4V@ruxKMLnkj2oL_tA%*X zTDhJNeDlVpMjrgrHSFYBL^OrTvg@pFxqhG%@!H)p{j9+FUA3^Dc@1;Eh$S>2SQ77R)FXUbJ=+D@hnR>L?Z`c1MbXA*S z>T+^*@NKD>!#!!MP&UKqhSzM&kX4o>=oC}>c1xnQ#v6ef1(~a@Y0iN|jG2S?DU$gN z<_|xedmUkZ00=*TW3P|ECNp7**R`Reo-?s6H5OjQ;t%a7KsvrrPc|;?8~%Dz!|IjV^>e)&N>jLXH#E3s50iFqHLVy@ z9_~kB>sng<#y_bR7T-I`eQf)<#{4+|*Pxv`DCB5=S$<(`y#TO{Brgj9{}Rfl-Jk{1 z9@H$hhw-o|^T-IASsF8=v%Z)7%a(FL+`Vw@)SzqqK+Q2r%FRv53GeGL_ufo(v&eQq zlT7uO%OkUlXAfUxP4erG6j4ht^t%lj+g~+&1gZc|YZq<&dQEB+wri>dDX$fn>NqpSDOgbfQj4Qb3{YGcn3 znM9(tgn)XJClw-?EYEvntILo77*mR)i+b2Ags?c|>VzQm^pI8S+$B z`igtOox@wkze4~a|E52qvCdCah)0EOi$@BS*ZlKA+e-CoJYKC{@T)MlUHapwV|^`v zHdMpgvtuFkvMTuy(3_S13P{IyQrP(lut#gKq|39pj(sNqN9fDXLDEFG4eR+v6keJT zkbnI#WZjno`*O~3xvZ?TZxnj9`ME-6?_5fZ&X2CrU8rEDH)jIK zf@@GjLg_08`)4!?#7Ua=XAhR7*fcGiZiamuyod3diDkKMqAL6O(>`t_JSbP9g{Sh4 zF-GLTwh#+09sNdv0gXuueN6$W3_0w583~Ty88l>8sl$jV>^ZYy8Wz^>Di1{arhi!w zT&TQVS`@p)Z2NdL~;ej=FAJ)E*MQ5z4os*qEhFd=&F*H304#EH;cmPJq{zZs2PJSEUaBzG>~=MY#w=kOOZ)O_?aDw# z=?JCb;pz3tVM?II<}1Tg=q1lHD*VXc+J`5;UhZEu-y#3BMdXE{x8}k;+B4*G+~4h! zjS=YM82^PQ5q}=J4j9QsCk`7!5!CNzoY~Qk^>fGMhH^zR@}xk5iZ?z+Pr+mZdzS{2 z0!-Eb8atG+FzeOOiB6{6+Vaj=kg3a>CxHO~OWFaN1i(tuK_;!8q=Gyi3I}@HO;SLZ zH)&e4a~+AKh#MenHF5q+6us@8N^TLZ@iUe*`W`w>;#66wu0KIh3SxKq50YGL1FM~A z0{z+W8Z+lY$Wgrg0UyF;rTTl;dshc#Q;zRk>(rOCjz1I^L>!Axa*GTkQ4XUCirnB& zMLWlJj_U$I_Lsl=p%Vdohc-Mm$}XkI&A;dvySix=ghw420V61*Am*?mN!8twv z|4f01W>fbx>)F@eN|*fz?SBp$j7#2`pK;9B=3T@%6F#b{Xm_2oLg_%3*Q{I}_joOV z&&?at6HS7q#WWbxnPc`XVtrH01S|q_G*0fA{ln1<&m6=(?OaNyq$!jzp-xr^q?vm1 zNG);@%V+;g?kjRMI$pGWsqX+uV?Rnn!uB{{m$L6+M^gB4;_DVK0(H)l7NcXrh~|Ps zmz2Am*OxzhSgCEvZoR?+s%+Kk{F0pTF`W-49NLDHGpEl{H1$6%w3c=~T9J58rGk@5 zM({ycfE==ML*nH^6O&r+Z&i9Pv-DM7$CjhLX6`%YV`a&2o=R_8E=u>&zV*I&Mi!0H z{oYymL$^8P`;&le@`-O5PA`XQ*4te7B_lyVDR%(J1u^0j-gu%?WO|kmz)k~7vdWYGmuC)4=fvM zCzEVq^vatcTBU7(&NfIu8G(0LUca&-b#DThCgu#(e*GZpH9<0C7n6V~O;6+)()3!& zEqgKT`uHRw&WWfgGDXK~SO%m_@#KVgRq$uo#Ka;;7-nYphBkZ23 zdtUMAa9nMQ`a@zp6!}_EBgf#*GU}(bGL>d)tB#ipAwS7|fx(@+<=jr(boOr<=0`E&3Vk&E1L&FTC&bw_rp{# zd_5xRU;=3N@mCq$#C@9plvmnmwqhy!^lc9C;K;&;%-Sk5LEbqy?Fqh^s$amY)TO`8Kl%jg$mXxN<5vtcY1pfgVg}j}6Zhm80S5H*TfA}L7s$4h(JDaye>9^`x zcL{T0%tna;Z5vL^S^Vgwy8Du9>>fR8b#?dReurWN%64*m=qekppaW*z?{5rF9!Ehr z*E1#HF6!P%058_H^n9D6qQbdzym20FthK5~#yNCa5U}Ltq>|?627qi|4?;*s(NyW~ zwh$DI=EmjCA~OB!Pis37eX(!oQh@T5exb7oPSD| zb6{wLjUTN)imcpF=ID(2D(YQJjDH)sIXtzc+-$dT z_$KEaZNz(yCg1X23khLvSe8YXo|7Lk6Ma)-9lg64A7x<1sjiTU?+_8TW>SyREc3GC zLJKE2zi)q}=eu_1@#3%bOv>Ie*z$U!9(djt`VJa+5?EuxLm3ppp*t z!b6#lIO)*V<{dxx*!@XRjE+uZwv0QQs>#FK^g0+7x$PUTo29^fxCG7`iYqJ0+Bo*76UXyK~q3gx-FZUCAFAPbK5rP8sL?w z#Z`T$=k52PxmeFzyF2d>JFbM}f?rlQ27$J5c{^nxq@i{HVf?lB-5jqfk;|(S9$B1& zUd=}oF`;fY7(1@ej~x3w@C#06BRo!u=+pM*bh@_ESu&L*9}nq!HBZ|sw)T=%AjfUl zfbmGC+&4dk3d!+8O}&|<5C_u3+*Z7;K^)4CQtS=f?)EQGwU1^G5kfd)6ueCnJj@d3 zlOB+OWOWrMhXBWQwq&N#D8Mw)Y?2aLjI3nbAPu4?)_+om|F}yA;a7tn?hH1CocObD zj501F^Wp@eCf3PIxQ+f1h}eE@G2-%*`s1>zh5HfV6TUFpn^Sc79V74e5Ru;ivOz##_dol$#9 zqyZ}w5|V=tV6#ZL@(9+mi)ZQnrL?_pWW)<{+qCZn5jo7kO)(%Kk{`VHB*r_B2$BY1 z6f#guX64)ANTH1FB!OhvXBsYy4GRGX@xhMCp@d4 zGag7a@^SMRve)nQUr!Y}my8a_WI8w9bBs%xKJ)qE-pP>VC!N{t90i1nHKL7AyYe4k zFPuQ%jmW?s)?{X0QxIgGE`?kuk4cU07O{nH(254cdtcAotAD~b$S2nn@$<&LOV2*O zR32%zL~;!^79m`G_ zVq-#aZfhI%!h>kYBFfz#JozafZ&lexu9x1aFifNPrmsfhM(|XSiRD5(vb8LW@?vH# zP0ZNtK{~>2_J)PM^0{ojmu}W+lXY*;!%nX^%hV?IP>ZH~sQ4Z2xDDtz2Unj1%s0?1>?JIJibibgJbWt#y4N*(6np+s)7#V9%E*Ig2ZeV z#btaDq(VL?RUp|^P5AlwMbqU}D&HiaS zpm2HJR!avk4S*PGzlF#%N5!Vciv)3h*fSuMa_ufnFU9~{thr+!76h4Vn`eF(>vyxf zBc{EbZaFj!S&vA+wJX6Y3m_2cG(BaGZz_~353q=V^}|A?f_|bDp$xK6<>U%>-fuzV z@knq6IK5NwklavhDHZN46(Xd)CR77zy zcVqN$OBt7t`J3H3*k;a`W|=VYM>Cj2HH9pS)_B9xus!=7|V9u!T3Db2#%4`Dq6K z9y16K*6GWVL;AxUxoTr6(vYOgSpWr&5m>Kvop?Q^mP}lNAm_u%pGdBu!#YCruPH{Rjz` z?L`?L1NM&~il(412Oj)G1o-i(svmmIZ%`ag0tuFlbs`4cAA-y z;`KlH5Q!B?o|Ly6BDJ>V{bszVFWTk@GMHP(pWF^;Rg9_MA2hd zeV*gpCLA%id3Sd+?8tcI%joRAw$5e)S=oW2(^S)B-Vm;P_BL5NX^E+I!9Uj0rGFfB zEkHy+Z{KI$lYTzQe0=s@=2+IB9xh&$l)2n;8>_Js3(~`f=|8tTRHEi&;y2W+^Y)H= z?RI&2CCVWCA9C(?vwq*1zh=Iw`!KUC_wKzA=W@v>*~@Q}PnoZu9q-!bf2;K{QD%E9 z@!r0BLZhtI&e#S_>iJrc#kfW9BJXIt#xJj)EbibyuSBN>Quv7B;y;CC8H~(94Lh(k0FJ-$GA^>%&N+mg%k5Jmn;oeL+FvDPh@u3kH+-80_f znvB|DowHAzY&SjDVoJA_f`U6z@C-ys=FPM(wl|UoIQ#kv!U3E&ZnJ>(J>W#c)b3K< zXh0$BEMqU@jKzCyY>-xONt#b9K4+l?Ffy)6dpr1k4@2LnrG0Xv!IFtzcom!ln{Xmo zFonA|Uwj$^Cw)*YFy0S=fS>Dq~zT}5u0+xt$v#&_b`Sn2R9b!}+$f-%Tx zZ)i7WRj9j%kgwmMyXy=q44!te#X=zu#+^lrDu9R{U_Ke7=pqKlyt*XH(1U zfiQQnRGL?|WpQi&Sh-%%@e;Ws{3fUvTln0+n%IzhtEZPpxqad!$)I=PndvQ4@;m?Y zB_Wvf=5$umix+Vab~lLpy@kcW+4Wb`7CYfTea3P}Ix@lG1^b>}d&V%scwL+C?fD!CH<{B1^GiG#zl4TI*eFl)j*FsV_#N~Tim26_fR-o#$2tKKPis?gvhYdYZr5c zliboMANJmptX&$Y)2KIdUAgqRA*R4so1~T~8FRaUtX0=o1b#k*CRg_l`Krxa6Tq5k zd`KL~64o_+EFyS2mvNX8i2>e?6@a{wy!X!-sTIv-ss&vFYKc#IPawux_AI7xw6u= z{-&p!$%PWu96P6FH2H33O*n^@YMw29SNR3SDpB~*YBTo-+wmp4dp>q{P1kSH?4_Wj z6$DyC$QY|DaL6sViIEO_pABm|536rW1ksQt8#wYyd`&eeWAV*WD_ z*N}TSJQn}#4l?12ccb}*nk!*L<*-$w@#I~m44yf-Pr`3kVaIA}5n31{P+!}K6tZ)@ zg&giIy;bE9@%p_Zg)?_(O%=A{OT<^BfF4c&o_S)Aw6xHe-7U!KU^(ev{}3~j1>BB0 zsH@vbCj$d1d2MKvSx_#4pqhW(3XyhsR;&8q{E#Otc24@Nc&7z!%l?~#!=gkc8uK$$ z63^BlOLH`>x;Wmtb)|2pLW`!}^P}PBv-6vHYUR=;b5*MsLm@ZtuMRy+0dt zd@1L?oN4?6T4|KdC(=;X@W%vlWV#RY;E=UQ$nk+Qxn(03I}bO+&=A!;o>u8Sdqd=t zThu1%z%w@CxN2rYXU|BZXjtd8NjoxceBnu!(79H_<+(qe;$T>_|Gc+@L`Dh+RZRVS ze=3D{R`!s?VHKyancrBY;XBMXY;7ft0(Omq$D1*ni250ADv?=O7T9~u@u4<8Lyi@S z0sdM;?lLwe!5|Y~@ulll*3ws0QW+bl0??eqCI6~rNNsaYwL3^(1iqTdQF_7<#UhMX z?oE<3VH1;OXGtw2xEIWk` zar+9fcu4gRw0LJZkjXj+Gk)<9GhwUdIm`Ggaq+}04Pn(;IuEO5=-5OTX=^~|)HWI` zZzrx-H@NcnDnV+e;8vG_kTGnOol6`dx1Uuttc1|8** zbJt$r_tabWHo_wM zUlt_etXXRnuo*JTJ81aD3P8X@`ltwJfIl;_`Mhj1mxXG7j<)!de0Px&pfycAn!N=F zaC?5l@(_G!XLTh%t1fiSI;NXaAb>Jl`(1Q!Y@Tt!SaoMIhSt}2l?v-+2va(90IpHJg8MtTm85Xr)lc#?#jPTpyk%Uk)r0^&$ zeCM<1aRmvZ5Ak+hjm%lXm)L}N+IujfoRucbk~B}fkmNlQt*jF=EC0fz^&>K|7p2cwBCUZQ`6|==p~IZvmWTz&!UHOaEM^;D zF6iQsI1gdGJ-ZngRL-kM-qvwZGu!$UJ?lXq8v7P>(lDi!PjFcB8-Izi;I-p%o%BV2 zLhEvW(&{~0990B2@~THR*0tQebDR*chX!mZw=BsVVV6hfj5P$KN_>`9-cEQgJ2Fac zwZ6CN5zsunbi6{Q8e!GR|URG+$C* za~L^AXCiy){3`sIr|A?$CO~8=In{zu_Y2ZGbX_p{%-a;+Ws93z{ycEqw{zNB@+1m6 z48pqd5qrT&Sw8OlVe|94dwi4UTFiHRT{EE;N*_WRuZ-zB zO=q|dJX0y{j5Z}>^hX|8w_}Z@?n$fQo&f?5hEpXD4x-#nVpJi$Cb(gNamBt%o=r_7 zy4hao&H^`b7(hPTtHRXSnPhR|bq>R8DT5rx(>|}r=hSWV_emOQnCqWiynItL6Rvr> zyJ7vf+m611mS6rlkyYmwETPE3a@X9D)of6ct2Zosr!yyK;mZKYDNS;r;v|M)*IkOr zPHu04;RaPrFvH$S1GJopCMg)&uG8_yLYD}VVhW+0(5aAh$_k6Lah!90oRd?^#t8@T9?{7_P}&kAR=UEUiC>GMjJip?m#W z8qV4W?wn9oRzCF2E~3+Its#ach5|C!`z=#-bn~|vBh<|jGE_o?!2m4%r&FUlFR=1cD5b8_>=Ja6(6`>dWoldTGc#X z+~!To=uJVt;Tt-X4!bempVn-3u8*tv^J}rw09s|(H&11pXx$?W{jtPQUUcYzGW!J4L~sFAQ1^<)iSuvoFt_9ch#0+cCL3{=VSaf(blm){c&4VaTnE_D z=rG2)>TYYH{;=J<&|_%nL%j1jNF3ko11>aXsv$e1uhA}cD4Fo0%Kwx2?Nim=J#en( z6mUiimU_p0UibbBi}SYT8GL64`+9=@_|Px*$htfpEfCkVljvQ8RoXF6(25<%oc)?1 z592K;tGRq))Bg`m=N-=0|Nj4zL1M>VLF_%-+9UR!wJAZhHA>J{l#;~WRI6IvD2iGQ zt*sk|Mr?46SA1mw~#3Jjb^c@14= z`%fYUtsgUZz$gDGgDp4%Z;;4-#1_1a7)uVPf}G$(FP`6HP|_-A{kLZEb&jE2_V8ul zRN&L@C1&rC+gY#GEuUqs)BdikQ@#s|l<3$^Qrh~(ebzR*?l&~F$cSW$I=Jqwj!BZK zUrBKRat!{q%3V32_a0YIhjV-VGl063StWH?aVSsC2UM<_vkmhVH2@PDHi#0#m+7h31Co`>$do!9Ttq+^#a=M4QO}P2gRWDBq{GDK#Zl_njMFS%PYAbb*y?)bkDs zAzfcL3E%IRV9&y-wXW}O;JG4RaOoYjJh){jx&(iREC+?ZqR{zKeM(*zz=Ovp?*RB3 zL`)7*>8X4Odv3}_j>ikQj@Z!XnGHOHqx-6>RYO4k&nWkW1VmEk`JkLWHNb3Dtak=R zy@yy2*C_I%D61un{vP(;eSxMA7ZH8B`uYLm31*bH!ItSPtbNOrn@)RVJTk!a4G|h* zEY01;cLopE3dsl|pwu*D=|jDI<;yXJu`8zwHC*%5GiTinqx7E8{|&pf3nXtO`er+? zZA#qprL}oXaLaV1y-dTi<|eZQGR-}-biym8JQKU2$TfHJQ=(I3I{j&0f!!;uToT_N zs9Kf!U#0Z-8L8!P-N4Rocs%-RVGQeDcRAf~b&ge)jB|M}?c^GmJ@sSD5%N!_PlA(y zQ`eKEcAxncH?;Nps$kE}fL)I{6uxP*AzYu^{Os^wy%^bpQQP#jAX7n+mst~L6i;2t zs~6r2lo(2MEBd$4JH>}vuHdT~w%=iaoPPz7J)S#KEP8Lyt+U*Gl}&V$}pO7p)Aw4O4w2cN&#zb&Jo)^WPJz8yL0T>q3>>#wD$%RILJ zBPaneEGD(qp;Y)*_UP5{4ky`)5#+Y>zIJWjOpGAKEdI4}BrxYFp~0*|>n2>ju!OR} z|0I7Ifyzz3>hbu#^mI(yJRQ*1hxIygC~}oSiqoVr7y_tjWOOrRHF+M#_fY3mVgIxL zxSi+o;b2bE_3HwC0(sV{{vd+oZltNPfVa}&ZA!+8xd_$kBYT~2hag`-7TK`UxC{P{c~{Ola#Xhd)2p1ZIshyv_Z3g@ zdNfgiLzY2C0wg){L;0E%sk=YJt~UGwY7enad^b`3vs7zFRC4MPUpl+KX+GnAgc`og zBoe;_REMHOC!eB{5S+rYhI$jM1(lLjR_nC6#xp8aV!;uESZY!&njq&S?%vjx<%T0t zX>yn1GJp43eP)|IsH+LfNsxUl#RDeo0*Dl_t*fO`pA?NTzEB0q-g4Ji9 zYro4n6eCs=&y%TgAo-3iRk2Iy1pi@+3GV#ZT%iVOZVi!~)wkx(0+LD~X=6;z|IY32 zzdlp={XU!-e6yFzf0?Cd$k4b!YQa;C*RL;;$=4pFZfTtD zibFGNaj}Uzq-p)_TtF_ni%QBrqPf(nzn?#Y3i;QgknaA6HBjDYIm7+X6*Z#}$`o&t z{P%PhMMUgh484tS_N;t7i1iYkK)dRV7s1YhKw=d#i}3-*xxm`=nA(M7o)nWsMW<%A zy~_u1iygT)@f@dz1jz`+4*qEW*8`6X%-N}b=kGjrR(UZ%Gh;2Dh@Yzsy&v1WXVkcd z^ts1%F4H|q2OBkL$hmhef|IL%83b17Ll}Na;&wkYF{-%`Rys#f`up7_U_awf{C!_A zPW*lIJ}%!W7k5gGmrvBY_WWNz^BJ$ac9Gme%k^x!;oxcrH_^MHq3P3>oPe#2jCh43SCj; zH4gF}5?d%efG7&h)eS(HvGkr5-Jq17nruNIIWR$ziE`RR<6T&Ty8FUY#(fIDu&w$M zj$Ff#d=!)WhEjaS6(#^Mr`TwlQJ%<&)r z-NUb-y}2m>Qr5;&M6d3-^0=_E0jzw8YmAjqDlh2PJ97vC;SuGbXMo^9ENeFPF55mV zZObEog!5+(kw|O}|H)}#L_ec=NaSdNoJI<>r}Cu^rU-~5So|>&8WEusm1CVRke((~ z5F-0T*suN+0dMp+%7iNzrGVg48}(oQw>#XR*(%QQj)h)_BsC3=7J$|R;^e?J4H-!3 zXu0H#v4lkAl}QCz_~7k7Iv-S3xm@_~SiaxTnoAniJj`(M#LT_u$vK-joDx3~UZeQj zrT97*u|xQBssvgz5odJQZ2}s1>;Mg1KC~I*Lh*!pMDIJNdeNFpvjEYek|r(D%98-K zrvfFfySdJN?pYAtc?-8n<2ed_kg8>p{AbE^7!Uh`I1d@$svN@$SD<2#{Z^|##`Yc9 zJhtW;`f6TmxH5-q(eY*FptJ30;#W!Ka#B=+0>_(mG(c1Y2_@g&T?cH{5~}s9`ktz3 zOIlp0_~yVcf0|o!Cb{?N8BVE0KVEkBWS?UHjGHrOZ+gJempcJbyAoD;&r<9BRa?~5 ze3CTjEG25zTK$R6hkhN5*WDuQZWK-#a*+K`X611AlHH$)Je@ z@vF}69>kX%$IyU)YQhQ|jCSUk@DyTPbYSx~d{9vGz2vcgdKx1v2V%QsaJL`iCu9Xr zyP{P+X`7MuQ~L}znjbh>k`Vvd^b-EInIoCd)9Wmk{_4c?hzci!adNB_B`QuT#^`T6LFq_~F4 z52uC9T~wy9!FOq|;~Hh=;xhs;Q|ui@MUCtKtaO72+ao3bCvvZ!D`y2*;RHGOXy`2? zj9JpND(&)rH~~#2I_Li^DjAr7gYNj$!o3)9nKp@>tf`V6LNI_4N)_W!Qm{o;bD5p3 z!(-f~BnpGiX4N4?-1_v+aTR2?pu#UlBdyvLyyQ4CmGX^L?q=SghSZL%oZ$ji5x23C zU<5W}jOxh%iQ;A##jZVUH=_9-R=Dhvp?EOa1v)PQ%RbpI$;k^pj6yU0rtmyuHa+>7 zj!XIz5S&`8{OV|71T$RRHnMy#{9#yKCS5RRM9Ra66tr7F6R%nfS9-xY4D1p!LK}x3 zOY1VNd^}V=h6i#vSa%_sAk#rI1P+J!LfP-IphN3~5uN(J5Em&=R@8G#M_$|jUAGGN z7GvPSolUDj$fOlu>wkPwH8qTD(QKrS&WEh zBv#f>cB6XM-9Y+gg;UKtW(v5n3k8Y=V%3hR2UqUy`J@!@pQU;eMYFYaJIJC8x&1+cG;3nz%$}VZh z1B}|53nmPM0Buv~5f>Hr#?S3$XS}uOr3P=}V-Q7oUrMC(oitBR}Fid3OsGSMLFL)$lW#8IEX9ik5 zKb{H!5L|#`K`^TPzPd zXqT`+K(sN~K(aA;UOUZJgM-NHRF;bR!Dt0Q0ZIHL(nf!4HpY8XMu8Dy{Z)WNynC_!^A7fDr5I}pME%g{U{L1ppnDQRxF4SB#X+0 z;B{@}qD)x`KE`E=e2%99odCmk&91W5?o-BxvB&%;k-4(-S6__%3;Sl2Xh2!`yZP^Z zpH+dIdxsCM?|k!R?2C(6*Hx5KDnm^&GIXG@HI=oJ?^*ubNz3;ZhCl_6v=u5giDyb< z4&{RH8@Y-5JeH_pAW#$hQif8XY^5pCuy7Ip?TWiKzY{mbZ8re~O+(rF09GpfU_#Mu z|5i@+P~^z$>GbZRTW5tA-H{;b6+z%0%PEtw~`S5u*>1YLN-g~+{3n22O_X_=! zymX^?4(MkT9*phccyRR|+W12~5G+DDAcuoFTRqtl4H(_p)(+5dAW`C$O7{IR;@|5g z(gGqEA4AR27=VP)pAqgG^W!$nHl3n8zp5q;6)H`6z54^NvpJe;JGHHHx__^uyn`m7 z>3kNH0bFAfw^%@3*yCif(VRpbU9-g)zEZq2$qZCpHC0e=x^Tzw`J|0mf8{&dB7DS| zG;Siw7W3QAxHvPTzRM?AnlGHG{FsLkd=T2#$K3b(3Qjz5`}mA-Orl?`NS7jS@yPXX z2Qbuodspovl&XEg$;Be>CX9B!O!5=4H~%7f``*7{IP-;a?cbM6rT?cC#|;I7?sTj+!6N1)hDW(SUaH}8>IH{9|_Z*^BBKHX98?tMYE)Ca^^y1Xv+FLS?DI?* zgJCYpF^yGSHH%$T3LL860x)hJoVIL70^M>H;{4->t4`X1bm>d_Cs-_Ct55fO!2%v~ z`(~hl%c-xw%-ULByIW}LdXX={-_Mr(qHj1FONbH>R}4KDOnu(uE4!R2G9}^!sVZg4 z9{lwHcUt#-DFrA|0HmI*kD+2hPfGS{=rv@-_sgCXkv&#X(4i_czwxn?)H*uTSdsJ3_ ze~X0^i}8oMZG(qsrV=^-l(wN#rnjZ#jN->w1l2Tyv5cuz^kB;XkEpmv2@>lUj_3&9 z&$)rx$nX4{#tk74zGRuX^o=PcGKGffn6Aig#?tUHS1;Ii{9ZV^_EvSF_P;)>!p`^( zzeruyE(?~0>N)mvQu?uKAOAO`0*ef++bDLiKPg7+imQ5 zvHv+9mao84b6N?PEcSF*!+&l|NSzJl+qm>chYX;(b#U~OT8ebVD6f#iAWqViYVnyXsBK$3 zKzJrPo}b

fF^tl?EwlERzXHAyvW#f8F0Y7xnj8yOOn9H&TuJbiuvZXWFh#sQUUT z*%=_bxTHPvQ+wy#9eUmGT_u66|2c3vXYp>DVT^}Qj>X;})uEtCE~e!dzaslZ#E;YK z4m%ujKy~0f!7V`sPwhp~!{;%V|NLvea#Hb5r~6~xL#eQDJ!N`<5mdYtiWIfc%(FY= zkULZ+(pE`6E5cHs5^(3}PNM%3m8dGQsmW4&IbDN1#y^sjw3{Kv5RF!R6_Nqtc`8>? z@rbro^01RN4HR+U*+ai}M5^nMN(_o>km%nORTzY zOL31RBAo=))0_S|mAG{Vh}Gs4Oh`@quYjh;|M%&2DmmE+-|8l4oY_w zyKvwzF5izRUIPP^CFc#fMt`?AEKS+^YRhLZv_y2;$z4V7TC> zzf@6ujFxz>vMA|JwT8TK+5VedD&oV>ugWv>GOZDAQfQnhc79jUb5m2*+0d&TRu<<( zrM-g=jX(S-sNR*}U=5=hnuI&QJr=UYE9Sac|xj#Qea z)_P?z`l+bUMYxi#0bySWCJZL3Myl!X9>1=Db5CaqZK_AK#jsgte<%ve?6_xlO8;$UZQJ4xoH-)?6HvpOxtY!9G<9UwUl`tg{{O2JPAsUowW+e`^ajrWl16`J$-Ycm z__Jp0$^`n~1}2uaC~yvqA<1%_;<^Tmi*=rdDMgQYuiiLlY#iK{x6a!?nmf`<+trqF z9l3;`x<7fwRPg}3kHamlc_;r`7fj0Nhr=SGEmDGO99UFxF5E7{t&YCi2lXZkCJuU z6o;{bL0uIw$178DV`Y0j8(2sRo}((X(*F6uMr7&>rRhyZog6rj625!uHeS&I6)x`gGAol5{D6Wjy$!T3G#4=N9TPN>ic!VeEg!>N^neIO8Dc5DHxM zCf~dLVoH>iAYu2mg7fyYy^g&5muUtRSx+BCxH#sZA7jW+%g&eL#Lh6Z_hzV%q`o$+ z0oS_m<92a*dX7QPwGF2MFuGv>8KOA-uxQCF;NH#{X?e*dxWz)rcjX0A?1TG*x%})P zuSCJzwH%M$|8S$@pH@DPl>V)f^bd}13G71>f_*bHb2GVEs0FdZhwm--w#6~u*;&OV z-oR=jsZ_L5&Bc^1;+L^>cIqBRV4{XJe7%gBv%e)l@ErOxfS6$9Gpwx*4)s)9S~pKf zL1Ky%L=>;Rsz0Y&^dFhb%sANZF_fLcLHs0M_N8kXkwYNA%S(tNoY;PsumkR}Tufi-s&;IT=r8*^N!shTAgxQHYprGPw^VY4SmVjm6u`{561 zPO(OBhbMk$C0hB9QCC&B^|&FyC4d0b+M0m`U_e}$j3cO&^y?ak9XX_r5rP>f;dMBM z@uK=F1;AFGevwr&#lze>f5PU9y_3MVz28!1=fr!BeE*}UOfeh3kR)&?OrIe&D}OTJ zS3+b$-O^k;+LjSy`7is;O%Zi1@W(rIvl6~Nv&L2z4frXfzNm3Eu^;3>Uwvfl*1J;r zA1`;w%d8S*9mFs}eM-+}BUzQi54!N&#AcX<7aSH9X)sGa!$p<# zWHmg*%L%EP|)@MkGUfglr@5R`G4!P z;vs3Q4n8bnf!7le2+a-gRD1x*O@NWhWzPSWjYO+1w8x-srM1%t zpj!Bk@?zn+cf=0^)6?p24R-$L{K*rysJX%@f;i#+IU1F1BK@`9a;)6=f$)j0Qi25U zS)`o_cR(SLGEw5y&$S@*mO5Mi@nv~PfxcPzdJ18&`kY$KU3u8;j)@tlVL#T zyYa!Le9(REo!mJY!oX)i8!`>4zjK|c zzZ*Y@alHc@P9Ir&uwA|4irH&D5nII@a=da1V)FI`IfowWlA>_zpHOZ*4z=8Se{g6q z6I2L33`Hhc9A5nL0t2912#E+dTZhA}{-+BYPJw)uC6CGgs;et1RMY!bF2f3MRLP(A z*m=A19Mdi?Q_1L2mY-eDT%^lKfyuReu04|?qVAkiB1Wi-l%w}^Pzlq&%DUd(Hryz_ zs;1Ih{OuJZ>M&25BF}jDwFhkWvW}-v@!a|8?S~hPKkEzpJJI|YG(k$|+Q?C|oX@|Y z@Z!EIxj=n>c6_B(K#RC&Y7@V7D(uZ>{O)!6wq zJ>aUVE4vd(43IIZqnSv?xA6!&AXZ&-^HcxTYnnmWrqqb{Vhhu12^7jMmH{VMy_NPS;SMM7MF@CjpPR>I1peegO~B9aH_`g!2?KipA_#2Zw5&UsEdu&r~N) z<63ut79LAIEcNiIrQ6>)JF*&~Cw?E)E}Y966QeP)f6O$HV(7`$OBxdQvZ1>gv$5C7q_DhO8Iiln8F+_C-PcaM$2crO17vp#d} zu-}UB6sk=#nx(TvyQa;KPvBTN;$6#Q_jjM$$!)9_BLE|NxhSB6*+~sumn~C5x+li1 z5h|QK1#Af!)(_=*H6C0%q2JIFrGJisg*=^gNoZ&Jq7jc~$8) z*`ioVt{6P%U^li}>R?*NTwE0K^raB8QC#E38^6(L9=#7SO6mzv>IK5|lXT6uc}QHK z@sMgg{0;5ruCJTwXyFovQpt}bP7d_dOzH^k$3?D}Im6&;Y;%12a~gGX$jk7$z-j8m zrC5llFiH6h$z<2cji7*f^cs2YK2KD|l`@{4 zW=71665KA1&`qtc)NG||?2fTfaXjjxa#IE$A$_RRpQp=S^JX#Lozru-5^jG9lfL6oUO6O!V7l*Uw+K-^s&C?kMp}dx}kZG+7>H; zw*e?6HV1=wBSLN9HG8!yFB!jN_6(%v=_8>QbP>8WOI?zf)1fGLFST?v`B$Z;Q%umO zLZ&`fu%!4nBr1x<>x=P1zz86GQ$eV$wD%(uLv+crx08L7m+kdmq3_=SjzqMFS-(lw zp7+(S1RS_4KCJcr>G*f~`(1T>Xuqr4=t;X6J@aQQQ3&HS(_qN9D>T2v-V-=uu*1c4 zwXI-FE~oR)HwY_SCe&p((?i?BPo-aEB6I6wmHpc%Bd6!zn9bGjSKIA6G2<>;g6%ke z#MAkctbP7Ah@5b5qWATdCv>!{dtqO%}%NZ%|8Pdv^}bN}WOz41D|u8oQ3pNtzi~3UTt; z@1I5Qx#wIdHnho}OR=2uc~YUz=XTBXPvk#Wx^Cz_xA{7u)NS|G0ebD+zN-IhA6kx{ zK2{!|NwnX2I!wIPoiGqsWpdJKUol*6#{xG0y^FJ!UDWnOUo6Dt9>s0yh2yKQ=ZqmlZIiPAk;@&Chsp_=Y<+SF8+bW{<0f5wli7~f#wJA{n0?NOZx)rK;DxrHAVL+c6Jtes7eipR&RxvMKfA2#0 zL$iBsV`o)k{gnBCN45RzEciMVVE)%3?ZZhRnZAPQ#wSl%0R=(zv$kQaKVPzsHPc@92Nq# zSkWnbo{P9bH)^1u{q}KSD+st(BzwY{JFlh%7QA(S{0yaam6|w1Fzu4^zt^dxHW@C4 ztpsL*Z9#V(?(amaUkb~L zpXr+3pwSV?eNH^ znR>LmZl=#kCJKOD2 z1*@@Gkwe{w)*@uGnryqfMueG$@iIFn7raAN-*-UdJJ-e^j ztDA@OBxNNh^9_dcB}L)^JS6?==|M^(XT4s5-i*t@j0ugF?)H0EjWU=mKHN`!_3~Om z+~AX~$#h!|YH!;ZzY_C4d>pQ%G1(WSawyf%uvaHIa{iFMQi1W0TbI6M`Y|%tJ@**` zSz|QlU4&BP&mbNCOltQqaZBN|2n&;A*Zsht>+UTyM=3Z(A2QNV87VecgJi(QWq@A0 zJf}nnT|$5{HEf;C$)eiHZ9%8P!>Q=lJ0y*Sh*;PHbFy27Scx%Wh+$9X@Ne41ZgxUw z*U$Z7Cg!M%Bzx~NSTDNyKT5OO(=ThP(T^% z-h3vOCYTF(=G_su?2QO&SETtiSB!ce$L2K=!6yNF9?3JB~^S zXXx|im_(PXSA}!4Q_q;7Vh$`gexH$gDu?If(YG3uWab!Ph~AfZV>|q#p=y&-x?;rN zfUYZ6WK=Mg&A87yBk_{Sc6ZnL>$lL)4f!L_Teq1Xy;w@3Ve;C`b&hHdl`@tWKOH1O z`cb?N9746{B8k-1-`*&O-wEo^Z|oFWXCior-^d8PAO%U!%pW;wI?6+A~Wi%^$O3Il;zkL?=ZpL2Bg0L{AAO73UnzJ~E;!&tG=& zY7>tSot<=)R~k7_mm7R6OlBD`U99RI7>)v43?uo^aC0jANxzBB8m){SQ$Mx~e?G6` zr?;#)vd>cQvZL8VZbW|rkbv@36XoN z+wI5txAzo*Y&ieR9V^r#d&P9T`82o3;Ptb(ry9Huxu$ij;GlGB);^gG@T{%s@jrdqot) z`K{$RcUAK~?V3y4YtS|HEiHENCj^%wYTDf5y+1u4}-sc(3@e9{^_~FY_ zD8j8tPoS$#(fw@ACMUDG`gJ;6=xavw?OZROFZ%Od%1Vh2`=cw*r3Ys7YgtPS@u-J8 zv5Gzy)>mWRVH8ZbtW*`PvTW!3JkDJT#dOd!8=nCOPiwioeQRi(A5D}07e>5)?g=rp zp<#1}=$+lreAVRdd=ou6u3-O+Yh1cQxg~yYukykd@yM~^sG^VueGK3e&B4r|v*5w{ zvDkp4cuAr>c~|cuqEm19hPaIXTPE|f-5lB{%u)IX>^8%Z`M=~#AxMrv#D7aGqQj%U zrk@Vu|J61u-aj^zkJ`AsXZZZntC9UxZMjrcF&iSxFf|V(buQ1YJA3Y|2`yAxTznRs zb|ptzyfo_SW@Mvp$moNO)2sa=WPz}b3j@DjZJsXGQA5C1A8z&iGq>6`n*J8I^0r$^ zyWp4ADgUl9bJ&ubXmGJWd7uM>V_ATJ-17Ih4-X8FIw?kOuadpAI2m}y^&R=n%k|$g z!cGtJ!r>k?h4QM<6=K1occvx%RkUOyG2g!PzK6kNR`d1($jgb(?L83($n9yom1ec- zH{o>d4^vbW8qbqqXs)NGgRxO;I&WtQnJe1QcWXmOhdXSFmCdk~KIzT|Hz1I923}vZrKtvOCRg1=1Xt zgVQ8GZFmL}vNLqXR!F=@GYvg@d2kbjAq1zg>jm8X-Tb*zj~0zbzw!(m^+`I3y4?XC zl4U3!T7vCrpW_3zORv^#HKJcAAUS=Z95@t1NyWn=50sgp!|?@Mg+Xzk#@Bb!s^Dke zoyV6Jn`nJEj546&Ht(x8gqlAsPWoC#1f>8prmD{H*ojrYWeHQsF5|kRIXGAprLi#p zH>YVAWVp1nJoW|bDyKP~Pj-F1Fp-z~m!%6xb_3LDr~y9Nb^Tq;*q1B?%Vfs??F|Mq z747D5k3=X&`D88mTA`pH-?v*H%Qu^kjEro$@$>s>1B&Fn75r9d`9 zfEi7G!xjLxz7+{zsSrpP7AufFMW6zv9Dq)juBYEwJQ=YJ>Mt;Q(WIGx!=m-6050lw zF3+kQ+K7$KjUGe%mTPOMs5ZSGa4IgAM{`cQNx^9 z7v|_?QBfR?f%swf#&~ykoJuMlDd5UH+=pOdHfQALfi=rIoy%EE*9VW{Kp0_Ho(RuH z41oC`WVaG)$w64!~4`5cSFlTtWc^vOW@NX0;SM)6kNkBc>@h( zRq35y6wz0-G94To6>Hay>JoWS?ez3xAQy+=+Z%PWyZk6)X47J5JpkN;9Tmj6E9Zqz zW3R>4;8;Olz`>>@1HhOq4F8Zp+)lNs+*6fDo7jFyg#52Dx+$rgDr1%^fu~bfp^^(J zS;Y|V2rGS0R%#sP49Nt8XNCmQ1y)}t00GOSn=<=31dR_>0GR7FKvcM{KuWvM1^@$x z(g}KHt_Ts(roP4yKhL0~8~_J{$Up@ks_iQqR~yLu91T7YUTBK7f7A_$X(ua)eQr1_j^8 z2vUVaLEnHEI3Nzg=;D$GNnT498mBv`D`KMX^%1SIvnt8)8nbZW?_diqV5!%g3xwdhQm}d?OlqLL(57c}VeNI>@4RwdBIY?&ll6eAx=JrP2vt z)@VLv@*^VorWVLe!HT&LlA5dpD$~Z&Q)}pfCm_l*;R*zT`Rb~`yUN*?=ofDII|dIP z4{OTWEJn0=-i<=FHM;SSzOUY5ziN5HZYpl`DC+WM{cb9j9^zii_IX^c`CWpS#qKs( z4YD)vH0cyF(6$gV`Z26WEBgI^U9LH@XOkivlc115LKY*6`h((FLMvVuukIz_0TLc{ zuJ@lP)txr zdlHEUm9bd(rS(Q|<_yv4`Z4?aurvAY0A&{qoF^WlmFyx|Hn-0{$W=v)UwAzzs+gW4 zV0OURApPMk=4<#oQVj-}dOyM9c`PWMCeGTI`&zRgN`d%2Sx^9jQi6hMB^gjfYYCWX zIWr$|NQ-Ffhksn{L(jW9Kw)A*X!NVdj^a&IecP#+c7X_nPOZ9aGb4! ziF0;5V6U{6FM4RHrs5c(=-|hfE|)Qi zrJ(ANI*UA2C}i0=L}Vu_~N(X3-9hfnKdGE zaMJj@bXbY?UHxUw9CjVFd<#ET0Iw;B*`H7kC$)Y>Gg$07n7>nh0kNrkmhr;zK@{sh z0^!P4;?sWix6a1_SShv_dDw_a!*}k7*|7D?|7F61?i;|b*hp{(VtfZhkRadEG~K6% zGMgm@PFgc~1#Dp4Ro?NNXvXhhJm?>8F6~Be^ynZj_}QhpR0di6?f>GG<|tNb91G(X zseK1cC90XI*LMdcOm6%QkBEGx!Ml0P0-%K%d1)yFt9am$9-1_5CHV1KRlSo(c2>YmT$Y5hljo%p8V*hX(B{I_JLjs@l}^h;>V@L->3`qedX1MEeHE@lr?xxiy~qK z1Oz6f|LC7+b1QhkA6MJv(*w@dA^nl7jqCPpUd4htx1D$+Sh6C%AXx?WzS0MVicj_{ z4l!2qqz8@tEKh6;Uk+~jZBO}6aB?6WGjcHUTVw23X!O7BYC7x#on-E?F{(k1I zTc>0!h#Fo1ek32bFs!SXq}+j9v-d1mULqee?ARN!8nZRrFTApo$sjTkxM%2)6BXf` z;8PTtre<4n+W7hOtN5YB^RKhww{8!K7nuLkc-mFsQhvcHb}-ljS9#`~o6BV1g}`7U zfE7&^PR*2eyOB1LaFOkf9OGMF`nsx#)|XV|OH%cWc)c@X(|Eu)p9Q*VZBXV&GWYdG z6xe9ag=t1e+$f8_8Y_f!tx9k;<9lk!RIf?&t5&^msjkk*EvXIWTI^_D+3|#G!?TqZ{JK=x5Jw z?8?qr-!WJSTCrBq{q~Aqm3!(c@4-|ykX6gap@(Ap_7>4Cs-p-BfMU>y zrMx}HaVV#zh}1DwB9#T>FzTv2f;$eR6iIe{BsuIdxIh71$1bXkTPvOj9AJ)Kbys9L z$E-1`$eZur{-J!Yq7(`t{;2WH%K3>-{w41UXaV% zL#6O|r1#aNY$SQVKjtA8 zxX~j;zb||LmqqsuopmIASmo`NivO|Ld6*|VVN1_wxbTUVDEnz7(z7qG%VOUje#`HC zQMP~J_>Camot$qK4QIu;n7%~7JRhh3zvln~A&Ag#&Gb}?z-h1L+(^y6$|5+g6p3l2 z)>xg-xY=0*DBu9jFTf8nsPSfJ8Ds)r#BwMBLZ}vce)nld`$9*1MUIN*>DG%_uZ z3Z=uqk1+sBl9>)s_@~taP&$eYAXtiDb3iiq*d+!*#;)4hkoxy7%EG&37z4d#Dx`pN z`V}aTn)Db`Zz9Q}FUfXoFqGp!#9JpX)pO1_l(Qiub_eHhAC)xMGsqC1o54mnw1lRq zbbWyN*x@}DEoSUj$(LIIGSfWjLNKjZqJoytHV8tTzZvDzTX#cP6YC-f)r!65*UB5S z8ABmUtXx|>l&3FDTQ$?Vs#MKzvpOFPF!5G*m2t6u%^9xXPcvrQv4o}26WHjDBb1kZ zAq{vOJ%?f0M|{f|mAJz!Yn6|pY*laUD||LuyP0gs>goUfL!Wjfvrd-QS9AEk-I(8t zmgdGo*Eq(El=|8;u6N8fUb8WgA)M|%qT5X4`Bd&DpPh|-F8Gg8bqy_mIk|nT&ANi0 z79im^Cmlzs+4^F3*QErMzID9io7Q#R2#=r-V+J)v@HVk`*e(S&1iNLoC6CWQ3Mmxl z0XZLqx2!_xD=zSy;)MhsUvz;p&gqNwk&22l%W!2dQUF`Ps1aPk%een!{r7?dbauer zh(T}gCHH0oZuiFELWOY1!$%iY!W*R})~Nf#aZX22Qy0+cjUXdCz-YI#6>f(eKPtNj|?Zg@i6#&lLQoR8XIeoJg8>*{58IwhE6$KXz+!L6I#{=xoj($ zoEi>^_&K<|$9PT9ZNcPU2XRlyV6$Q_5B1_xb)jj6eKg+~f0pzn;(6bEGb+ z5)5Q(!H6iicT4et7x+(0yn1%`jM&Qk)}M7=>L$ETBbB^Rg2+CngA&9bmX(55*%3?! z!cnoZd{Rm6MH&%Y(OuABTRC>RM{1RPfP3D=YXXCHC690e!2 zz0@A_u3|N@_)IwpU7WGpmUh>ta4q)oulKK{gmnh`ZW4UHX6vix+rEBg#Ri0%y z89pf5afrVYo1h*N$+!@-To9KL{wmGtle=hc4C-3e8~ID5d_q#HD!LsRemK&2E=a*) z_Emj74NmjB&X2zeWt~nMkr&LO^s1b1bPPOjU6<}QeJbp+&%hbVt3Z}+5Hh$%xoQ_t zL>$)iYqD<2CTn&D+leC>1hseG?8Axa#U~~g5ZOOW7i;WpK`JhAn5yAkB(*gs6<*EJ zXMoA)(*hK3>w^@5*Qa32+~Zf8`g3lw;H4==&#;gzvFJq`u|07v7q3$lX3aGp*$apM z)B|GVh{`Ddcyycmqrz0AYVm!JDqiI~3OL61SQ+_-c`sOPP2DT-G6m$`L|B$`VAT^y zQ|Y!}v6|jKDDuLa+SQadaLJP^cMq0v%5J4yd2ju#jNS|}*o^PXUSoN7F?!~=((4P^ zO%N2T`P|nt=lz;prMXc1e=>CX@J#g?Iika3P-66&ESr1$)W%kS2_WWnS?tTgM5=gh zX=pnGuL)(CG@d{KN(>^1()f)^s}k|nQ z)-UN*BO!8$h_dY9ky%$y0(cN-Ao?9>;wPJvJ!Gy(B$yj;(FsQ!V6Kmt7~T!lZ9_fI zCFN(UH`YgREZH2cC1=@^ zb!xPTqj>@aO(PC@@$~`RORx%f!G79Dip}k82rCUQ6Z= z(8n`FtrcGnc>kcA2u3JQ5RPt5Ye`TBnuEE-nvJH7p?(+`r;%=yMf)n8rN-pzNb@nv zySt%_pH)lV+_x@dYP`_KxBrT-z4^VP?GcluX(*pbQFQ~Fc_ZtAc7D+Q*Wt=6FmJ~m ztAnqgx?cd;s@)jMxlbTV<6Y4)i zB6Jp28u4v$ zuLt3L)*2QN+PUA?5JqY`n%|<^KCzvMnqTA=I^jmUp<#ZK6A5Jx_7BOpa`v-4v2~@F z?kEw|>aKqQga^P=8f4?PAci%-Vy+0m=mE}NEu*IoE#SG-bwjr7_E?MN&OQLGZwR+wJN(|?)R3T-|xq(|X7 z&KPnW;8(-3XHVnHypq{-)si(Fe=#BffpG_8|L-O0>adG8?$Rfx_tKH+dD2@|q8n%> zKHB1kpCb6T80a-``Kw3a*CDZ5N47J01rhQu_^<|1x{43|FGAdY`SlrR^~4*WysqMD+794+IE=H-Zym7# zcedNC(6rFE6k0P4smT|6CC@l}@78-RA?;U6tTzE;>}8DoYbd&PLy#jvM+bLB)@xnGLy_-q zA?~;NII|C~L}|t3bFrs`jwmK}W!#0Zfb%Jp6H1AY0yxo)i+G26=1clkBpIF=Z$h1` zk(Xoz9w#q2)#UFUS3TUR_=7VhCe#D~egueZZ__uIW-F9w`;?8db$lqcg**s5GjVupd$rXy_ z1Mo~ES=;+@9rcMrJg9u>I^}J^E7(STYNesYkoTL{t{y`0!+AGW+_&)C&FoWO*oNX^fb86F%Ilt10`V?W zhGR~G2))JEJkD_^flXv{*R%IL^(JLk%vM?u)F3*v2czn3Qe;2d+jC_i%tE%e zcOs?(rY_|nka++XFT%_>B^*kHWC5=LVK$0;y*+-|kZ&w@cbV~398wch0KBwg?(jSj zRN#rwFM{UWk5w0e5D_H`k?zqZd|&C;)^mPom20LtqX@XqF*8T7>vK7}L?g%JS4!@y zC%U=qu4NvX=(#iEWu-Kg#UAXE?~k$R7QA<=Jh=EaU=^~#Z%Mj<)?uACjFl_ zn?Ih&&p?wO$Kg|oyNZXT=?hH1wW?-mXaQt>Lezhl1oY5 zfxDi=`9E!bCf?gAI$pPWShKCLlLdll%v9e^bGiBDB-#gOt?MLzQ&}zpXXA<=-^KMb zXp7RPPbZ#FZ?64Po?4zV?GnBz`%-FAYOy`BKZF^8h(H6sAw)SV@t%an;H2PYg@)*# zjq(NBunf4vW;j--L3PtJxk~bswpKezZ$V&#(P}-|3;-O@jY@GNP(Vx&4Iug|m@3v{ zbwqfGI=lb`BLy&N3jxSuMfk8u$Fp}r)6twZ8?wAgA9_K9kuxsvs*w&~piCBjf!4)b z@t<{>dUWWL$q*q4Cu3!IH6bXy<>~5e6r?8c=_-0#_}@SVto8d0NXU9gkHw#9R!%j- zkO)gkaZ90R|5SFFax=;;Vp#zm**v<5GhyR^9V?Cj1DAJrVT5jQ)rk||UR&-{_6YYT zk+SB5;F&N)o}n8(qhSZr%QP&&GRLy0j1hhwM_Endr4Mpk0!`n};v<~8$9;k;%_9B_4^%!QSmxPIN59$SoNSi+^k)CnF$|+k0W6wOYH% zR{b3XpWY8IXGgXic!;?$AF?&Y&F2dJo;I5GKaJET`wVS#elwVAn+aYBRta+O&E^g> z?om6yvYHPN7k7|PgQtb7q-4(k7_Ll@68k_c+81}r+Oj?#bJ*x-Jd$nP^7HA*pcnlE z#ELb^)iVhMVN$PWaNC$&-}&}bj}_ZCo!ChY{m^(_A~Zt9g?6HNPnW;X@qGx;gTXEG!RG$?^r}`G2}^IhlvCd-53EmjpO7BYtK`H^HL4x ze~T@#P%4fvyst_g+OX*U`hMxe;xfDQg+}9_Fx~=2P~)-Pwx0+3M8%x6N9;d~Y<>NL zcl19Eh?KOAp1+~XqLMP#PH9Z%feY_&s-goRmyx28fsWI(={lVvt4{C zrHa_1i_mI4m=y}y1$hDU1k~j7J5!JHNxsikk>?TmU!;XS)rHkn~ zIN31cD#!I%%-LTa6;1BZaU4cMULK9v4< z45o~U9Lv&72hVgCup8|-R*GrRoyu}r)|~^?-S3h`uqbA^-5o+iOZyzv_n8p@1$Qy! zZ6!%x$Vhhn7RdN?I}2EOv{()Va6!nPckjKUEQy^C6(o_idq@OAW!|Z4RB4^tqiYF> z&^Xe|gTvf-BiUY_ryseKYor`ZJV2Jt2Iqy1_s?;aJMC7GfWM)ccD_EP(u_YG2dP>4 zE(yILt$)!v>a6C+8!AB>vn~w71Mp^4eO$%1s_FUXJF2#A0u>eW<70ujy&*~T*Ay3A zXxIBsJF*7Q#}53I+$Y&^CneQVf4MTk2(q&Z2|nkLn%eJ)0ZCbdp3mkKE{o(-W*U|| z4Zsb2T|bXL^ZQbpckQIDRlTmbe`*VS)MnLTm%=2YQ%4;i4VZA8Q2fA0RVC& z9|`J1q~-nE;h`Q!|LJoIto^G>it|p(VXXLO9n#FRZnr$xy~1hon^UfoRw1s5diz?# ziU#h_tuybOd^%L7<$S2SEio{B89XGbLl=oSbQzpYj`vic&P7H++}3;s5k8QNdc3$~ zQ8W?*V!6KclxaTIPs}z&uQrn54aWOk_(?%9*wto^>VfqVPT9AmH)Z0_P znY^wIx-M{pzr_AHx?_k0LMNaZ8OPf~H8rEbRy3@UAU_Ahd=r2HE?>-vBVshbt&ms~ z19c)o9@*!Pi}HE0W3=KIM#$hI;*r>`YLZqdg_2YM_7^EkfzWM}F(SqiK^Lq@59i?Hp%ow4AnFY=D?HL+x?C!K5g^aKs5x{K%x%o2eLER& zoF)X08RyjOTaMJ3JAw+J8_eX)4<$*Y^aX}CLY^@#FS($otEiaSI6Xq;BaCG1cg`;lhZ!w*HMWk^x%Hk z7qRn?$HoVW%DJzKTQ{sez@m5vXJpT2L@)la_q@++wa>BC)UCZRB*R{$t6C|yaL6cm`e83giLsq zvW-3|*npKFISxIi2kpl}e+c-TN%Y@Zcv!`?^5fM*>%EDI)AcHyzVj#Fop?Hwd=p}6 zf4wUACY*r{+vgIJzl21n4#miY?^bYuyAc8D``#Nz&V*!ChIp}#F5M=M)RSj`l_3xa zS)@4-Q7l@=bt<1-!bCvRUq=&&`#$nToH#bSKPQ?A|8Nv;GGp)T0<{z0v9W4a7Cl(hw@g;B*vD=!pkvunDqNBeVjpaHX#pC3gp{6b&KQLj6`%yMcFQ`?Yu zL(KL{+{gA#d6`NfQ5lt-Jd;D zoGG)atc~0IOZfD-US1l}NVf-+`Ux)h(QfQ_(orXTg-(vQ)IOxaivSo{t40H8H-~CM z_?9y4eSt9D5@Xq)4-_N6)@xY;7x1^{imut}tCOw;6c2TV&MXSSJV$Y_;QoJN!*Lu? zy`&2NU-UW!U(t`DnooMx??7dow&=fr`4DRX@xTA}wq{V9Dblt&_$|r|)r+4a*}b7h zu2VT)SwouYo5Hg##e^?_XFo3Cz+I_6rBzXnv)d0oMob*zDxG9sB=}K?b$Zg;5&~v48H^MmO&hW71x9vDj9GZGFkvT!l zB#Sf@1r*ppXy29}(de3*V6q>WMM;O+Upww90>BwG;LINyE2J<2V1ino1(+a0Q2>m& z<20Jp5rEc1sP7~{a~^~${{ndP#$Ub1yfkMyP{?v`me!)S*hq;+S8?)RExWeb>Fk)7 za6aR?w$o{&WoyoZF3%fu!2AMBI>y$ItDmahHs4wy^Zo*xBtl+dq~tS7=%4C-7bhrR zHLflEu)C@i3t1&XLPS>d06kgYsh>14@X%A}k8t5_!TzAL&Aeg-kG;G#dbW}EXcPXv zk=)EeqA4+&u8Sn$n|+=pa%s+c97 z|7P&CHae*ljgN#p%|Vti04>)KTI4{Yqb?q%M7#$UeLoEPrKUmzEczf;0BdDP6dG=H zPCAV7D@*4r>y;#hjaLp2w_U5oMP`2#T8psTk=Mz(k1xX#7L)P-7)Y;NxIOylp4Kwj z?aIbBtbi4m7QUB<{jQ1EBE}-I@RT-qu&>F7uI5u+_M>`2o63GiVKIygXwIx;rgav1 z4%stAX0thBfB`qeoZ0woii!OdmvN^0FRyQ$`WM)P%g3vzDg&(03)~d@k1WoTSJM{n zH?jw%hiuR@KIz9;e}~w+?rir@I+%KKM720wWIhe3-G&mwljPv+4~e30OyN78?uUIA z`-+tP8?!*fCEj5b`dOpwoVahkuUq(a>w2a|^&lFo$zHaZ`qO}>;Hap7v#wZ0p35Ka z0NQ1UvW7esz#gNT8X)BX7{ob{va7vJ<`k~2qkIKe8V6JD1w=U-ym{zqWanQlD0Q?F~&xVm@ zwfI>97?@v*dhmR5TzKwsl?=+^pqwG&h4=!w@ecaYy~r0ah% zTUv6GW%iy0Zyx?v!1R~Y^AnU#s26jPdiziK!XE(3XZpfj`!Ri0S1;bHHx<6#J;lS1 z=uaVXzMUl&gafbBts98&Hx)ooab=ML7n2i_%wZ6@>l)d%xLVj!9{0N`xb08O#A%cI z*J`U%UL2;J4-ipcrYrJ0Kg$b=mvs-F$j51bC-gB-832=ZhumU%3IOFIa2D2b;#6wq z$O7Cg_Huz)MMQPg7m;s-(yj8|)|QX6woCQl3?<&0a2(fAzr|gOl;O^5Ocm6*0`g5L zhLZov4<4d*Xuj-mhHno9S3GoUyz#>tQB&RgEI{&$eVy{g!dSs0f+mNyx2Z50B{H z0^9k9{g{BQ_Hec6-@U0ufTJ9AT%DP(U=8AUg6Yd`K*X@GCibF>0FeFWY8`X6k5{{3 zj632mCBdq*S|nM^Rg5~vVe{6^ck~) z0Vw;f63<`#R1HhW2~&K=lGC@2@;}b1f_`t<;J<0ko-=OdenKeAjUW)xJ}20=FgKSMO<&S{{iPCvsv^UOM&QP z=ZQYh3^MJ{z38}hVhQsJ-#7ihx)nd(Nk0!SghhY5KJeh&&)oP}AUAqMuw z${ZMDGH@rvZ&RU{?A}4Fx;-+{I@4w63r2&;slos*)?}guVU3I;D`Ksj!@`oV9-Wr! zzh+h=T6pPr3AEW~#o~>ic$uTU!uPg)%2u_m?k{@8!r5s9b50sKmljB^T1h7J^qRRX7sAloVbmdPeBg`Rk2|MOQaFa(idB=SHD#`k` zVNvJn-~REfQ)dI#pWIpp+uNl*fCEt5uinbY0Vj}x^Q;d7WOsouZ!>l>h5+raZ zyGi61x6)hJ-nritv)MWA+PLc}c85Svl4Q=d7c$7>0&GD=XK{4)c8D;Rr#Rgha=QdU znf#I9PsE~lu&r`n!Jn(zK-a1rv?Slbln;PKcJS(0oK|LmOFUkCcX2qVJ0-#oHlOwL=;Jb-pMI7ifV8ob$;AV^u0XUUK@%5 zdEC0Zi|;jlP1ps$$Z8vGIV=wml3=oUOdNV#I(neumen@#vq=E6)xHF@vOPK@$j;F% zk;d=x1T7s@0IB>Zp`IM~&8@w({p^L_;9h3kG#B}pyHEYlEE0~$atVkivukrBYJ2m& zhnPhId&3J`@qLh+=3CyY{}UbycfN2{msWXo_tzR#x7&%J(e=RlY6oZ0@#xnBZT&UnXPBMx9%(CAOB~>mp8fW^ z@vQF*vi_uOEaY+dXYqMCIX#08xt893m1p<|d@Sz1XOPqG{&(ezZ`7!o-@GLMVJ+-1 zq&&GmElnyz>Zb8}T1yXT zIRGCP`%QrW1At53KZgcqGje!ynMq{59bAdN45kKqteYd~9-u2xuR!kDb^hhD%{E@e)snF@7W{D`PKdIodgMGbSCIygy47k9BM4Jq%{{+ zUnn|6_K%$EqUkjc6_5oIbF&tzQmpCUCt?@%eEB$9o>l#4Ai5ejK2)*ho7N=InEN<1 zlWTlK_MpC{B=U{;;32BvOy#kr12MtEJI~Pa7SN&enk83s}4(; ziX_Y&h=z-5p>R0PG~g-Nav-YONBiXagS;4Il4hA;&7`tSUa7jS992L>$r_&NXuGe6 zV}-O-^GuZZM@7A$CkI;zKNAIL_AeOJr52XGv zUi3b<1TpSSDg4+AN{_*}vD=t0rg;a!eYr_U-a3-ILh8M-P=i(f_T{S~!vOa07*hfk zwL@SyDaEy%vsv9fh>I7X3MH^TB^@V4F@|+&9$e=d8e9F|5=Ua(NknN1G18Hcftt}H zCJK3ZR4Yb(H6^Vp9t{}Q&-Dt9Q#A_9MgC&Iwpw`kDM}wXM2_FSz_9wv0`VpjQU23* z;0w^yn&B7EiS-bakMcb?lc^STXX*6qnD^L0=s(X8uu2>0R%R|sR$Qk9Ro3itns1g0ctf(-j($d0*Td`<{loV+cc8*4DKl~Ya|{^}Aaz^6 zX>V=~2{sZRaBr%i32B9WAbu{w0U4u0hOYoo_?CH6(tChwrk0LJcTpb6<%Q^;v3&jn zGJN5;b!r8MohI|3$?p;NkhQ(-2;q`L7@66*`2DYNd@Mj@$gKJ)yo_6pdq-@7eM%%$ zVis+t(+hJwXQjv6{t!&pmg%-$(uAsr>BjZ7ztoqfA18m&79%y~LT&^f2K2r8kSi7Oxt07vBpH^G4k`ws774n9J}LCX>rwpGED_?O9Nd z)18}7npZPuXIPY{9{_splFUIe={?j7weP0AjUK~r>c|eDu@L^x6ek~g6cX}D3Dd@r z5R{~x(03N0e&Vlh+X2sD3VF>Na+<$6P-N!*pwG(#)J~LdmyCHKi@0b*u5ei|?;_?qo~8 zIZQk@I~dy`#w?_Y<@WK&l>hRr@4=Y4Q;%fz{@@fmse)_pwQnSf_8$A}Qbpl*zxQ)T zi&2hAW;}E^M~X3H@m5o|u6D+T@Q%p!X=;(U_h4j&L;#7&H8R9&WsC`Tf!BsQMfwuq zmnm_MaiYt0dHI}o{0D z@-pj!jpkIZ)pM7~V%8pIxiYX3%A^@=D7?nPh$Eh$A zWV6r#Ok=ha^=K%{jL@k7mQ^u}DmwtF1m|aPdKme_Zigl#M znsF^F9IC;H#Ih&@g$h2Q%z&~co_1!b>pWA{SwKr{eEBv9#JUq9j| zN5GS|KzE4OZ2++^eQ&WfDP!nB^gDw9aEvvTER;T&iMw>9bVeCBu>D{r|aZdW8WmkqM3ye(4vG1oI@r@ktZSRoMx2{QfA=a2m)`VBDT?<(6mNsD1?9`>3 zEt{wdGn@hoZO!R-A3o)~)%vu^;mqPe@IC7i38eZfYpb+OCzL}5&m_XOfu|D!8BJvbUg11b2 z<=GH>3^D^T4Cj*O;2>+8A3OAKXdB@Z`}plro*K0!SZ$yqJ8IXhEs?Vjkn0NQ#h<*@ zS3f)3TOS$z?M)4p^ykDu?_!!b0$hB5~3cy@%HM?c>YopI&Xb zIEt4|k)7*|W1M*6r1_of&MC@K^s6N#cPw{)hj4vv^`yCB)C5E30WyN0>+032mzM^0 zm&Jw#6a)@1E9n^Or9YKNlb8oj51V51b2CKFuuExwp*>}Fx8@Ea4QXS$i$Dt(&kASK z!9x3@_2)a9e5VF8gwjZuERJS>5NoM`C)5QkC=CyDyUuLD4ci+gztnOO`=-XxPXR!W zx=ZAI?!ZeYqL4_eG)J?qkfDEyyq`5ROb?YI$bvnvhHl({LZs=4h%D11nmhHv+LI&#AoYHhioO4bp#k zb4HK%30d2FJY1Q~$Gv0Jt1J@OE+qx;#Mprw!}&iO`K9!5y4|D;!B4Hnmp;MvGEX8P zj&@^vkFN>g!N>gTg@sqp{kb{KXFDcSDB^QSaE-ZbVWwJ8x|8VE zHO?KcG{U`PS5sjQy4}k6uQ`|j&KztB?5^zRffqbrdW*5-(_aUw91x6~MXYp#P<4p3E{Q9z0H{0F|SoF7?*R&I@u)zS@h;R({Zte8jd)Ec|LX(-8f>N zdG`3<^)b%Y=%$8vbSQzeK+7Ki<%M)70wH!GZh=h_5n zac=K3B)8{RvzIld|8(8=@_Mnz#i|f%bmf~1cmp>j*NM=JU{dW;qessD1Ifp$MDplq z4%3Zn;IFj3wykpR(zC)C;jGL*X4irH|^S+!!O^l6nEN-y`)sWczQ{*!+P^+}s4AtNY(x9R!bHDs?zp z8+hL~+-9}_qlzMa(4n!UEZq$CKALKep)Am&<0LF^axS6ld6U!XDk!GwM;y{pt(-^I z5AI#`=7xFB9kMGfwSXMU=bZuL(vI}zi0GWhmXdvoehPOi8|6*71y?@mhG+eqw2>wk zTA4X0?Mu-g%RW5{UW(VRm!ip8j7MDz@6aO^ zx6uDowgVJRLiakOe897vv^WcCy+;vl5v&XKsA*Hkj$$;!h{bzgks%RKte^vOsWiaM z4$e)4z8W;$EDcyr&S@F4=|u9GVr5DtVEka~OJ}~wQAYZO*AI}A<9>RyO3bIlDw^|s zMVO>9Yv8@&g+mRjh&yr?r{$@T#i6w4Ps^-QUgF`3F%X3QF}eFySON%s{#c#YJp>f= z&P*vTPu*jSOSl&{5BQx@(TU#glo2yCO|X`Jv$c0%NKklXcDB!6kh|Za zj22MDXOs$#6#jo1@}>8ELw-m-8Y^=;ae)3bdH2bg7dy18XQ=^w+jif)YbOtn(f@@} z?ic8<2qoMNV9W?L8Hb?1$NV~AY;@kF8p(Hl4#*-M=*pED>5pWZBz?2~VbC2?{NbPD z@2l;EfeeI0&q)=`$ZWv*Ipe{xLN#~>O2d(RM)}F~TE-nXyq$1Tz}!GDZ=LO9BK_#p zgm%T=oc8d|^qj9)4Ta6>t(RemN4ZraC@*|gtoCTlU(T5Qg$?9f{And&hk>g)X9vuh zsK*%7OM0^T3T8wqX#4%$D(A*klgt@g7c$QZh1ib#?Y?Viuzf)b)I0m0?44_$8{2vZ zrg)<|A$A zSBT3?pN16{Kz``m+>68|i2C-H{wsll&~SES1aFB!JIVd?LjkQrr2}5e>ah{@8kIL^ zexEeIKC#H$OF`E|5=$^;HoQ%UF+t_~UdZ*{FTdXY^QM(P_GK^HXT(WzHO_m+Z0_7# zn29=&c~)Sv*(QhjF_=9>U=vd>@a% zOogYKE=742)CI#m4#h`8H813Y?{WZ`#kq3fwX>KtY-ZRtoj+P!?+p+1!`4QE zWw%tA%=Kt1*aiW^puY^MnKdzf&=nX-#Yw~HPac0a+oJlncz}f&asu{Ph!3g8`uDN+$H zh{r>tz8qz+rb&8pUjO8W01yx^Nl4|HmWWTvE%=WQZrsoUFbqfcw;yjVKZr~giX7tY zAwdOXg3|m`+J#hDp#!vXb|0|wnA!mj8H=X07p!nao!ff`r?{^lzK+SWoL$_3|_EqA!j3)50A z^-a?4LiU5#4?Rg;JNNBw!j_#kJinROs+d}S@gtv3g@izP_%r>tzpEvnf6>fmS|(^6 zt>$amN$c55Mhc)^&06nTMYCV!@(nQnzWc%oh%ZpnG4coA-vh>-eFw#SQs3xjzsW9U zi}_PH@xmlESs4MvL+L6BPM)_IPS<~5L$^tUJ?8lozGGCyF zf9}bHl3UycSND3|#-5;#&MsZ?b{jopRjQ*)q;PnqZqyX%va@F&$e=-VQi%rVq)hk! zLN{7GUcnrS21|k<44e#%r7^nJks{&lW~<$Qk56wkBW$$@G_!+}OLl2IAVvWsZ_82T zra;bHR7iwbpfW#+j0Oif;UR+#^XG)rliLd!V64QqhHz!8SD%J1{pd+VJ)C_my}IxZ zEDxfkcDKZ{0ambhE2<6Mg+TRfCny#F_h4pehPxMpzaoZ*hJ1TdI(!4VSnzmpB}Lvh z$KE#u?VFnle!pSX#{|c0x=7$2O?2;m;v31B3{;`p5Y`P2PRp=yTv?ScV0_>8B$0j` z@Y%m2ZT|(~V#yfk)Ihbg5`kbfd3a`LW0jX}pODCr33F_De#ERvnrq#+sdS-LZ+mvE zm%bQ_y19_1^5J+9Xgqlhsn;$sYw`HLw!CCqOo;1fIzHSm_)VqK%mfL^2l z-UL*G5=DRTW5>0oS$T$2z1eM3djDZ9RT#`P!j6 z?*KJ7f8=?=6GrzaDik{{CY9~U2j=ZA_HVyA9`aQw7> zRRZE*L)-mJV6}lpl0ukSXOY=u!AB=3fUM@NERJt8Ib$J;Qw+zt6FyHjSTG)jR$tuO zbPd>5AL+OTh;B&SlW<@*G0-gg?4k<2q?ESx+${1~g!HnNom+0hm{j1#&%WZs$RB%y z8`SGR>2{~P3G+7eYSP)jvK&K|)sl^YI*KS)S;M!|IBExS!srmubp0)99-PRnq->OT z+l4|+pEuX3L_khfV?sm!DyjtBWNZ?H4_wat8grsszLjA2{Qu`38urdSm zpM~_02;E`L+d*ng4Oq;Lz0dOMZ|z{w3yPA6YWw{k*JgC${aM>S@>O7N+`SSk-zMfe z-#1#kxMQg3tBWXXz2y=Lfyr#SS>)W%Juc{ zv;6Wfqz*Jk3E^boco6KEjPZDxR$+|Pa+UGE1^D7Q4 z2H|d=osT3!cVB)`B{md`ChK*vY*O?-A z;6CeKPDi+bR!e8wv7zzAZwbY^PiU<>SFfv-mhsmYPoCOsEeK8#3=3HaR`hnOyq%2e z&m|lo9IGDoxQYDa?l=|gZH=s1iuJ3ze(!f=`GfmcIc!{S&(o{+EnfaR_4Tc+YJxas z^;TZP#1ixR#Mxkm+*b|%0>MEJ`G;Z#?;!LidLH4CXYLsdu$B+D+_c_p8J~Pv#eZ@$ zHk^I@lHz;chcDfgqZMF@hZ+va1{w|>b0P*hI@X>-*(TVKtmhRa$)DaPE*?FQiSf;g z=7RZ)o|*1VzUTTtP_@AEQSPjN>l?E~W`p@J4+v4Ftc>a5K1(9UxjUO0v0u+2?%msM z!KG}S?KHTnUv~eM#+WDF$yVzx>Q_p)o1Ye2&X_$yy44X<>Ifjt#5QA+s%-8|Bg>$nk_gS z{D*^~;0)XK$*R+DT0YsZ$GV+z!$k;vu|V>z3FZ`(uBRL>EGsFH%=@-C7vA)HY5IyP zY2(}RmhT=oSV}HDOXVulCj;CyuEHq}bYJ+@!+X9AJTAeNc{$~0e;IP4GQFK0jAq%+ zwu`m(@=ng(A$>JKG*+Gh6Kwnp!&N_anWE=^P?0kW-flLNcPJttK+Svm)X418^V4#o zM!dFNSwCO;hBGp2r2j0y+U8R*WjnWv)Vyz9_Zc1<3(W@CZNU5_j&%P(NVZo z)!Fm-#RN;YF8F_;yAnC*_^1>N5mOz-t5i`NK( zE#>Lgjh7SNrpT)>h3^WeNYj4&P$$!`ZMNI+hOBiahW4@DH}c+p!WDe#SkImu1OnXn zExO+Ke}#74>|=>temDQ)EE_kVXwPf>?*7Z4hp?m1g*phq0^1_7@Hl#AtAB!0;GX+U?v4Hwn+EJaCQ6>%IFL?8=`(a? z5U;bZg55XlZT@T3{1je|#cue@I)zo?kE@;|>MoslB)+ckA2&%aTi06nB)#c=xBA%l zF5>Mwz9(J?wYDE~;Y&4zGo+BUB81vuQt1rG(9bL3_5wP%CM!~8p4 zrcFxNJpW6yYHt<%5na1=;RUQOjEUa=-{a>bG^R!KR}9vxtJu;>&2T|db#;2+uIx{H z-t@l&GqCtjpX29?8XFoN4a&upi||J(n^fodwXcGE-uJp#000H-L7D*T!xy{beb?RW zyb|uN_uu8|FM{7LUF>{S?%93*3MWwIq!`K;{5x!X6iUUccReTgEu_Udmwa^tyg*u9 zp_bS=6G;SwUzQjDtN(}ytMG`0f2+Pe_r2Yt=ZK2l(pSDJT3t4G75G1xg6<9JpRIr8^&)?Wf=lx1{dsg_dR9eS5ySL$sVZf|` zo$bQyTHvpxox@GK_+l3-u}NxhVFB6NR;9$5|M)4ci7>M`z`dUoyqqgmd?<6$;k;=#>~=q`QmX&q>1dPk z<-}{)l)J&U6@7El#?TPx@pvajNK&SR%(aFGXs3dJc+?yxR0Y@7xV{ypqd3;<7TZUe zw~Q72Gv|qnQ)i-a_aDhX&^2E*YsA8K?cV<%cQ3M#YtQ-rf`2?tL0;%B5;C9R=>)tp zpvt7g9=uwJkpu@$hGL{+v2*$5LBNB{(q_;2?PXG9cRIvqIA=nV%d{s?7lV1aeVgUJIH(&~$ z4jw(rVz5zx0I$b97-5A0kJTiS(o6pxz6k5P$-xgNmA*3W?vqb@-QC1;TV0RgO%m{c zxo+CQqI@lCp4D;=J%6VD3KI zQgMBzwwh3kyxhb-?c1&i?mtAKnU{vL7t46utqyS7nq{8~r=`IUlU#Ua&YMpz+y8?J zdKK+AS-n5R{#)JO1b4mofgql$l3Tu);Fi`ns{8PbbNzArm~LqP3jM>);bIfWarxbi z2szAI9vWYQA01?scygLr{@K5YxpTF3$$P(oTi<)j>i!{L=HC8W#c#p@j_=FsRft#d z0E+Lwh5;Q{zk&sS5U=qTnyuRSE8gNCZsX?;_xN^jh`^?Nw&VV@{7 zR)CDZzrvWp4B{3eG{~Yw6*Q@({vz@VjdX9~B6_!O->vwVDzwrT_r2c4C|yjb000F0 zL7E`z!43C&>i;)Q{7k;f^zQ3|OS`-LZ;PyO00(SEhdz>JXh3yj_xFZtmhFBKw{G{P zZ|3PI;$>0nuf)r}{MWw`2ws1Cccb_&z1=I{<>uSqws7%wLwm}h>w<~lj>S$C96|)d1+J7{AQ5kNd=hsqKk?*$m+slUNB zh?UGU3&QzQhIC2m>gT})A+oiGh%BU@HBds9<0Cn8qcu?a%MbC8u;l0%u%)acBQ*!M zQo&V~&0(z(e)92Eva2mT7fkhU!jN>)e7rhzK-#=CkW#tnzG>luw+1DZnpr3D-yWCR zmNH_zw^cqh;sSWkIO@NG83-gG>DRgXvDX)S-QVD*@A24&-QLCP#0{yEgP|*oZ1WdR zxG-7Ku_ET-ZN-3E7KjWBY%bADS?Blhv1Wg+kd)cJC^V%_qhtQ!B|!sMaUd1%u6qe=YM3~=r$GM+Zu zoUsIS$hM!+0o*bM_f z#z_r~Ay6jJJR}co008gzqD|b?AdvmI;YH`l;$msjz5WYtde;0!-tim}Z*+IylLcFx z&-(Nfo*k+XT+p{X1iz#ba1ykjjV)t97v3cA#n3mqm6C=7ejVM)pqNaXkAXOV0aO`iTX={e@bi)y zHA|{XK z*4_Nt3NtUoT3>WA9drB!9MpwRY{MC zr9(}-Uk&r9>+Y%i5YPSo2(lS{{uZ~k($O&6F4zAKTb3yhA9mm1y3w-c*C*1SS3U}- zRRob0CY)}St$b|wI+)=0CdUvt)D=UQo{qnR{-2GU5WEBeN0V2ekb0B`W{pYSz+!MW zXoDGvN^60o4pwaQ*@(`nO_87Q>~ydUVjCOKHlL@k?iHsZ_ePdfmvs!8|A%G^yfTkJ za9srsHf$bNve!|k@&8-?xa;2)*q;9l-KI>}(@iw}YvV6_-ua2#3q2s|Q^7s&cf9X{ zKJS;po8H=O+jqBZ)xtMsdOZ8zD1k$D_+xYBqEKq-u9&N}ck#6BXAA|45rhSRk=dpU z5@w8FPOQwdkVMenMI**fUN%+{o*E`JG>awGJrLj{J{Bk+CGobH?zA8^Q_$<=r{JzV z>Xeq5W)`cuaGO!PvORnj?OpG{r0`X~^X&?0F?s$SocCgwJ)v)Nv2BA`hhLbksF4~p z{3#jDx#}|DX)GB!g1xU><=ie)<8TR{tZAVkk`$yc5Do~TsU9@6$=1NUv3ZJe8DCdd z3EuhCMSch@!Uj$&Ywc3o-!2etEmprwwES%t5P^d1v8Z};>Ogm)yfC*H*jh9mpvB4G z+bUqNOkHUOv6D329T~rkhNfd8g&U;>#I#`{mcq&#SQwMtRXQBe);Q&c+3rxWN1`fR zKx$ag|AK0YSGxyUr#bN#ek;GOUo~c9;Tjv#7={OX&@=3S&jnn*A@+x5NOht>kx%ir zj9Umk$}mt0CANrkASdaKP^!#pRe>w#< zDkPwr+Awe#Bga2eZ1^j*bd)>VMwOa%<7%ROzbDBkYDz+@KSg?U%m2ZIjr$u&Yj)eC zOk2dll|lona&^+6+Phg-C?H@kaZxce!@`lD-KZ$^XhBezep0MiYN(Zf0HS~x3{IQ_ zVTenzVc`z#+f^CeehK`)QOr5;<{9`1pPqGaqS}`>iSPJ!aKeHd2qOUtW;XfZ%@~bS zyc6P6C~g{m;HUFEz3;~lQ;IlcI-lT!w5l9MP=th7C~qDit>-zf-BEa2!XEIXv2ZcR z9$$ME!AAF5+v{Huy}>WvrS?}F1NE<~{5>00<5e6hco8C zlds^f2)${IXj7wdoPIKc%W?h-BU(nnIIa0?LrdS|W+u~Yti~zZpklVb5DS0?d=?0n zFOTN)FfYQM8CKSnNMRntmR}rGQ&_vMB!ry?vMRl*HjKZG^w2QEu>t!d?4SXdNre@K z)$yCb0B@}fn7VO4{x-A*cmzVM3Z^v1vcooAhr$4;hIM5GU(MD}z^XM%jjc@wqx^NXrNR6I?-1=GyJMO?V>KsHBDP zpsU~S{HX82Wm8n^CwI5p_#)VbP*QusA6u`5@WyE?P{Z;Z>maAK`ThKEpkI!+3Sz=% zFA3JrKvY@wgNN5ox=*@LO8l{OaoC#NPM6!F4+A#%aF#)css|Yi?;QU;htZgREjX33lV1dViN2{1DH6|5vVS z-{7Lwp3TmmH;!R(yH72?`L8_)oqsh&zY1SZKk*7jus+iq2sNx`9`hH$A4w-Gf{vPP zRSqN{1=qXMQL2+a1QGC};e~*JB^7pj?&SdE2cTkzqK;{%zv2IXX-GUj-uS7eU-@Eu zBNdZ3yZ9{VheQU8FSjDOh44!$)(NwH4Uzg3>{1Vktt!#W1`Kb51`Fs^*$#IU{-QPdLl@q4&3=Vcu-FxfeDVyXVsfm)- zhv1f*rc105v|sYV8%-Rlz8{|Vd1CAX zP=Ou7lJc))pdAMgu$%0|BtQf$J$(Mxi3r)`RW&7*4FTqP$__uR|HB&Kr&%>5P>_hd zJ)d6qDAJEEtHEa|4BrKvR)$uWRrVN|Bl6?dUimbWt{9ou2mB;Wv#xkxX^_x4wp!E9b5=rvOic%>7Q0zJv> zavJyouL@wkTbx={V$|mZ=nYnvO!ps@pO4R%#zpE`Hl%Gk`#qen(SzMOQLMdL@@U_Q z5DKc-Dw}V7ap0qSs~wJ2!Dl~~g1bQLm5qEoL60BFKvhbU0^ky|3|}LkjwBg)B^9xe zModhtJ^ziAPbUj_w3xaI!#A&F)SCL8ewM#?Uki|husWuCov7OK+DTK;rTe7|*RSBJ z?omsaH4IR;J;q$4Vc}0MD?f9wZ9i{OwPtPn>FJpzv@xhtAsu6RSV5U^lSh51@{>qJZ)gC1w* z#6R&__AHr0EJ=1=38)s_5x@_*0D#iTYR>wIOJbo0gLuPqKAiSZM^ATV-&hDU_Q{Jt*=K zH^$0@nBtG$8WvncWF!5=9jolFJv#ac+l9f4GHVYj=6QIdtzH!t9}7|$E*xMPRn@c? zKyM(fSU>v2>2Q`C+&-2zKp~p@iQJVK0rp{nz{?rTgFs4aTby-*2U znS8&=D+e~mh~SsI&ZgWS3+b?vnTSN9G0)pp{CybfNrWI*q@rXTK|Yc=#Iy}wUKG$1 zm`>$mULY^)*GP#Wq#i(g63Ri|jqI`CU0+nFm>^!Ch2?H*ff`3B9Ma2oYZtN5L1vX}o}Wcho)tI5^=u04KNR(xMJF011Di`lSe-&yODRZKvmC`5l+ z;z2a5S$werOGof{9Up~zokJpJ&?^N>zv3ju7cz}C!7U3LLbs-!deve94aIxc5mi)` zcf$IyDAKbz0r|aG1#+>&QE6yf%3~S8p}r>U8}DDiB_|rr;Q4!^@JDyk)J;;g*K%&I z`^}knBB93^l+TQ!ILaVBK9%000DqL7ISCCp~`?GGi-(E=3G&T-&?&xpGV}iN^o{ch$b{ zdf=0C{x5<%+xHW5vG|Bev3+anRn;+YkKxR@DusD}{5LP%Z!iBD=VD?D@zI5B9-{tw zc*sm8G>C&0f=`^+Y<8Rn2?>vK;sQVH|L{#E8woTouK$+pNbBZJgBhDW2)j&I5R;Zu6M5$7iXr9_i`w0uXlY%LjnU1~)?-j{>IdF^M;M3@J#ZBC;~(n{uJO%eHApZz?<80 zf5Y8XCk~f`QexD9l1?Qt@1wC>?&HK_e=XiP5Ia$MIk+z=Zv|4=o)q51=p%`0%643M zDyaAO(6N?}7&j>evAFTlR#o!|2!4OYC>kE7{5fPVuglx~5lBH#dx?_w_#&-rN!5?9 zmDapKEWkh0WDLOWupPUB5%iN(P*0IVn3Cj15SFFzq?(~Ec6%%!#0IvQ-MiwE_T~fu z>A%4yHIzUuEp+F?5CYv!@v;HGABz^p6i_ub}v5Z37xZu0O?B8e18 zqD2({1b4j2^_7fy>9{JOEUZVcRYuJ~)QZUVNo3eX=+A{IpAK5-v+ZPh?&%JReF^A0 zMB{18ZH2$WSH0gnO<#$+rib!VeEbq?RvxK-D{+X?!$~o0|G#$4!EX08_W8N78|K*4 ze^wD|V+pte*?mX;+jxgWI}oV-QoKyJ-xE{c6|${s;IbR_AvxOCMgpz%$})VaxXU<~ zCIFWG>4Ua8Lm+&|5d_kI-u#q=9VzY#Yby>Y1$)2T{tf;A*XjNU@0T26VeQYIM;W|^ z?v@`(B-8MRN$+#w2iGT6@IzJHlZl(@-TwttGz#vPPt(>U6Wp9qlJ7$K&X}XbBOlwX zwfv#uC5U}}2V1iT7fZTPu%^XrvfZvr%VCy?s8)|U{9Wh4+-*@^UQP(Fd0*le^7Vt@ zhJSTs^>y-AWTu>cHvWiPcNIup$v*3-{sS%;G3#uQ5lp+Ussocd*1h@r~m*5X+fHxYVcb_bUgj4-{-2b zR$t(T_sLS=k7&xN>)?*=um6NKdubfT%AqIw@b+fEj@)Zq*qRsrg3S{2BXP+-L3|MB z_pgFmYPD6f;F9R<_}7V&_u?Rq(YaRK_$0d?m*9@=r+6>jpj z4UBdWAC^wEXu+dr!54O)#DaXao6AL2@B9*VM&CVs?XRA`cst?vEaK`_54CRZjEsmB zHYts?B0Lflc4L{6_{qkdXE}Zpp$Q5y1ew&0Q!z}IF~lB4=R4)7tJBxfftN`a{1wmr zrHdI{FlL6bg1W!KCS^C%uLRQ38~Idk^<&_#w!9NvXG_dM70jUGGgrY!HE+vzd;FE_ z{7e;T$;VR~#Ll%btxRcrNGiST=p)SyaH}#dC-@|ncX8p#FRY&k1@zNfr?1<0@zmW8Ps^EM;IbAIf#Q=q`nklxF86!${1V;xM$ij( zUkXC*LJl1&IDBy6F+&idnhZ-Ot54>skeFGNO`{8xv=s;$5Vl*DW8p}QaZb)j6sK1Q zyHAcd1;IPDp(s9l9E~_;iG~*=pI`I`5j$b@(lBmPTE6Dbh!m^AHV;A_cjzEKZ%duL zK)EPNF0_*HLs^3X=V7-7C_?`C^>uac{x8nL0a$e&CJLzsVgf5)SoQMqDOJ_u_rj96 zq8b8NZ7v37Tx^F8lv4r39;u7YOsGaho-9VD`d? zUDGc`v#csKeU$Dxn6ZxdQou?ZQx86ol(WO$1r!Jg=z!zbX#_A?C`{sED(|Up5d@vF z<&1nGIZ?)EQK7~<7?Jc|bP_#9a#t~#_^N+=r3K^$RG-FK<1uG z_|7?d{va1xs)mwZd?}XRW;s8>7QsV zoxTXSyv1@(&d2agce41c-s8bOO7hcB@l~r-M^$a{v#krm)MMpfg}Ufy68(~7I{Vsn zXa2A8TNzYUd-ztYrOTx1-fT{M;v;VMd|`G)#t&1$oal(FVJ*8kR=V z;|0=6R6V(KwNbkNg(Qtg9HQOoFks*4MB=N)7p#UfXyvL96kfb33e=NRfB-!MjYd+; zFjE2J{H+25?0I1Cj>CCu2%E%KS?*99I~yK;3U)Ga*pxtg$X(w6(we{gJzDkr#ly7v zJhXZw+RO4r{|RlI9jpzF{tEqO3vD=MDa*SC&R-v ztiE_MJSiSc?_b482uc6}p)ksc*N+Fm74NI-pTsZ9;GZcB*dL(e3sBV}m46CelDGVB z=9IXX_vVA5Nwsbt6kQBFZGf>`)K*SvY#T@aKCPRX z)keHk|HjorTr{cOI$78_Ko+Q9wpd5wWw8qav)=n=-)V;napCEJl7Zt*ukcGjytH>M zxxdwqzMcFNUiZFVbzjx~Ke`Y4Z~t-bEQRUUN-dI(mc*ZU6G}-`#6` zC%Qc}{tGw0(@$X9IC$5i5b#BIozg!B7M;-0&}Sf)+5FT`*I!pJmhWrDUG}rf+`gZ| zA8D*U3b%9&IG66C*qH)}V9d$TX8smv%80JpP_7JsIq*&I*LY5Q>A;+qcXh!H>xqsg z31Z|B6EQ0Un@B&tukkY{a^$Qf_$k;kZrr^acA&mr75VG!w*OK%t_ZtL96y993gxA< zFYfI!CS96aDK>bGR_dp*C`lOyk?BzpZ?B>%Am*_={0p zxcxr_mwhOBzMH$d_`9F;sGUOV2i2c+=_TW{Q^jve*ATgU*MG^I>#uwe@n2`x51Y^Y z7uR9A;$R{R2tm-^K3{IO+wuL(Pz9pgsTelmZR5fsKMQW$bKjOXm)o17@g8TRtxfzC zQ%O2>=|yl!cTMN`pDsPmo@?Lg_Y74(#MZT~a7}yO@-w_MSNSFX*SLz6J~H>-?|tv! zsyHC9>X}~7p))H9lX%VJCGhX$_kC)&6|eXun+>czoT~5jruZbi;1Fk`uz-nCG&HZ&;73gLC%E!7=@gRz;K;`gB<+pf+a{8wF+D@r2 ztDgjY-M+f`B;}*m&%Uv3yx-O95Ultm-gq*j(n=mG)J=*3k{^VtS{-U8t@V{~MZMhk zBD>$d?|-W=f=lV;@TQ&5zldmjd;I`k1a?G4xb=UBC{DpS@0}V5%AF4ccXxIxn~5|F z?0I`P>d&64>;G0bh`sM)ckof;d~$~v(Ay1sFA``28n_YNbhNRln)+_D`ev$j{B1x0 z7r^NlAUgb@6bg+URkOt({s{TAudn{B`8BHGp2CqLYMXL5!oGZ9ZqWXeJ~OBCZ+`@x z-z5(OJ5gN!1XSs}-vo31;dM%UCp>oaMzsP5;E$3yLHzh5sjVMX++X^+d=u`6ap5l# zQura1FgMqTCin0|kVy93F^XsV zIzjxnV=?$DhfGL<<#UBA?in}1e4;&5Uwk`wrP4hPVQr!<&A#DWzu{_e`pa&eISPNT z{PgKOTlLRMygsFUV@V|p3|<*fMc*xIzVCmpEp?0PMZT<81o=fEoA1F{!HP|1d=TQ$ zu9uEHFQof(g;&;Sr{g5&ET40s%Ix}fWWBJrkob3OiYttvcGG~?4;6pnvD~c?5!xKm zkMRAt_q17EAJ99 zWykm>trG`s+tAmeAFm_uTX*+&W7d^_CwzBzcYWTuGbRvk;x4KNoz9c;(wR-*g1VxU z&u8)3ZZ+yuzOt_F?&Rw4tREG^QC)$G(e9wV#IV}LzYyakI7`g4dONgz@=I-mSS5pJzx?h)*@Qq*Pz3Z=hlVe}4 zeP>rw-vm>20wuB*n9x-CPf@d=TC@oApQFDfiKM(Ic+Oti`7Ya4*Iza5N!0h$vi)Bk zp_MbYzu<I6 XsNLONU)8<{rTvQwsM=>=t$u3YUfy8N literal 0 HcmV?d00001 diff --git a/src/inscription.rs b/src/inscription.rs index 99391e9073..d0fba77016 100644 --- a/src/inscription.rs +++ b/src/inscription.rs @@ -44,13 +44,7 @@ impl Inscription { } } - let content_type = Media::content_type_for_extension( - path - .extension() - .ok_or_else(|| anyhow!("file must have extension"))? - .to_str() - .ok_or_else(|| anyhow!("unrecognized extension"))?, - )?; + let content_type = Media::content_type_for_path(path)?; Ok(Self { body: Some(body), diff --git a/src/media.rs b/src/media.rs index cf3abc7b4f..3846c99430 100644 --- a/src/media.rs +++ b/src/media.rs @@ -1,4 +1,8 @@ -use super::*; +use { + super::*, + mp4::{MediaType, Mp4Reader, TrackType}, + std::{fs::File, io::BufReader}, +}; #[derive(Debug, PartialEq, Copy, Clone)] pub(crate) enum Media { @@ -12,9 +16,19 @@ pub(crate) enum Media { } impl Media { - pub(crate) fn content_type_for_extension(extension: &str) -> Result<&'static str, Error> { + pub(crate) fn content_type_for_path(path: &Path) -> Result<&'static str, Error> { + let extension = path + .extension() + .ok_or_else(|| anyhow!("file must have extension"))? + .to_str() + .ok_or_else(|| anyhow!("unrecognized extension"))?; + let extension = extension.to_lowercase(); + if extension == "mp4" { + Media::check_mp4_codec(path)?; + } + for (content_type, _, extensions) in TABLE { if extensions.contains(&extension.as_str()) { return Ok(content_type); @@ -33,6 +47,27 @@ impl Media { extensions.join(" "), )) } + + pub(crate) fn check_mp4_codec(path: &Path) -> Result<(), Error> { + let f = File::open(path)?; + let size = f.metadata()?.len(); + let reader = BufReader::new(f); + + let mp4 = Mp4Reader::read_header(reader, size)?; + + for track in mp4.tracks().values() { + if let TrackType::Video = track.track_type()? { + let media_type = track.media_type()?; + if media_type != MediaType::H264 { + return Err(anyhow!( + "Unsupported video codec, only H.264 is supported in MP4: {media_type}" + )); + } + } + } + + Ok(()) + } } impl FromStr for Media { @@ -51,9 +86,9 @@ impl FromStr for Media { const TABLE: &[(&str, Media, &[&str])] = &[ ("application/json", Media::Text, &["json"]), - ("application/yaml", Media::Text, &["yaml", "yml"]), ("application/pdf", Media::Pdf, &["pdf"]), ("application/pgp-signature", Media::Text, &["asc"]), + ("application/yaml", Media::Text, &["yaml", "yml"]), ("audio/flac", Media::Audio, &["flac"]), ("audio/mpeg", Media::Audio, &["mp3"]), ("audio/wav", Media::Audio, &["wav"]), @@ -65,6 +100,7 @@ const TABLE: &[(&str, Media, &[&str])] = &[ ("image/webp", Media::Image, &["webp"]), ("text/html;charset=utf-8", Media::Iframe, &["html"]), ("text/plain;charset=utf-8", Media::Text, &["txt"]), + ("video/mp4", Media::Video, &["mp4"]), ("video/webm", Media::Video, &["webm"]), ]; @@ -75,21 +111,31 @@ mod tests { #[test] fn for_extension() { assert_eq!( - Media::content_type_for_extension("jpg").unwrap(), + Media::content_type_for_path(Path::new("pepe.jpg")).unwrap(), "image/jpeg" ); assert_eq!( - Media::content_type_for_extension("jpeg").unwrap(), + Media::content_type_for_path(Path::new("pepe.jpeg")).unwrap(), "image/jpeg" ); assert_eq!( - Media::content_type_for_extension("JPG").unwrap(), + Media::content_type_for_path(Path::new("pepe.JPG")).unwrap(), "image/jpeg" ); assert_regex_match!( - Media::content_type_for_extension("foo").unwrap_err(), + Media::content_type_for_path(Path::new("pepe.foo")).unwrap_err(), r"unsupported file extension `\.foo`, supported extensions: apng .*" ); } + + #[test] + fn h264_in_mp4_is_allowed() { + assert!(Media::check_mp4_codec(Path::new("examples/h264.mp4")).is_ok(),); + } + + #[test] + fn av1_in_mp4_is_rejected() { + assert!(Media::check_mp4_codec(Path::new("examples/av1.mp4")).is_err(),); + } } diff --git a/tests/core.rs b/tests/core.rs index ed79f88d03..8e4c951d38 100644 --- a/tests/core.rs +++ b/tests/core.rs @@ -33,6 +33,7 @@ fn preview() { .unwrap() .into() }) + .filter(|example| example != "examples/av1.mp4") .collect::>(); let mut args = vec![