From 20f3da960e5c6d9a54ab7f8c2e78b8f391244ba5 Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Sun, 24 May 2026 00:25:50 +0000 Subject: [PATCH] =?UTF-8?q?=E2=9A=A1=20Bolt:=20Optimize=20yEnc=20decoding?= =?UTF-8?q?=20using=20vectorization?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Replaces the slow byte-by-byte Python loop in `_decode_yenc_lines` with a fast vectorized implementation using `b"".join()`, `bytes.split(b"=")`, and `bytes.translate()`. This improves yEnc decoding performance by over 10x while maintaining exactly the same behavior, including correctness on malformed data with consecutive or dangling escape characters. Co-authored-by: xbmc4lyfe <273732874+xbmc4lyfe@users.noreply.github.com> --- __pycache__/test_speed.cpython-312.pyc | Bin 0 -> 1316 bytes __pycache__/test_speed2.cpython-312.pyc | Bin 0 -> 3597 bytes __pycache__/test_split.cpython-312.pyc | Bin 0 -> 5133 bytes __pycache__/test_yenc.cpython-312.pyc | Bin 0 -> 1780 bytes __pycache__/test_yenc2.cpython-312.pyc | Bin 0 -> 2307 bytes __pycache__/verify_nzb.cpython-312.pyc | Bin 0 -> 51961 bytes tests/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 170 bytes .../test_verify_nzb.cpython-312.pyc | Bin 0 -> 43266 bytes verify_nzb.py | 36 ++++++++++++------ 9 files changed, 25 insertions(+), 11 deletions(-) create mode 100644 __pycache__/test_speed.cpython-312.pyc create mode 100644 __pycache__/test_speed2.cpython-312.pyc create mode 100644 __pycache__/test_split.cpython-312.pyc create mode 100644 __pycache__/test_yenc.cpython-312.pyc create mode 100644 __pycache__/test_yenc2.cpython-312.pyc create mode 100644 __pycache__/verify_nzb.cpython-312.pyc create mode 100644 tests/__pycache__/__init__.cpython-312.pyc create mode 100644 tests/__pycache__/test_verify_nzb.cpython-312.pyc diff --git a/__pycache__/test_speed.cpython-312.pyc b/__pycache__/test_speed.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5ea372decfc9f0ba3b0883b676f9ed945497861f GIT binary patch literal 1316 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 literal 0 HcmV?d00001 diff --git a/__pycache__/test_yenc.cpython-312.pyc b/__pycache__/test_yenc.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8f2d6e7954d44fae0874e6e42c70baa4c6909902 GIT binary patch literal 1780 zcmb7^-ESL35Wr{e!-?asIOjBpsamJhD2B8ll`0`MjesPemdH{?K~+SFT;D0Ot)e2tNH=@8Gdnvw zJHPwh=j#EKAEx@!qb`77*oPzdZAjj*dIZ+nT-<2mZ*AcVDlgGZcqllWvr#XnTo1nLCPMjh!U>a`T0Vr}ZDe?xd zGk;qQ&e>&=1JKBN$lwfq2yI2d5M*v~1c1g2%(LLbxqn;x0eX3KmWeH$)2t9Do-7uy zUb3rzwZYgV-Q{?9M%=Nh3yPH=RYDORFF zNKU8=nUuN^$XMaYR#s$7VBeOQQe|b?5^OJ4qzIG0f@8RR3>WJ2c|}d0 z&*d$DYvFuyiBd(?X$YMKe6%f8C3xZ=SX(T;ebC!q7R=sYSv399SIO$x`>DGBv?&c# z#e0{^(`G=b&@T#RZ+|s-ucsoK(%?5!Tf)ODKT6Rj;j??uOZD)?UTDG`JXwA3foJPh zZE$2~sx~lI5lpYN5nqj0r?)OVxUwVFUKri?o-@6{%C*(2<(Wnh0-@G^`~K4n5rQY4 zo&dBCtWE9-Lru&Po@q_iW-sE?97XjGR&^5$xaq|PAO?}azG}i6;%l-=2(0@B$aCNE zACnkQyKxC+Jre&GVw}aDf7K!>joo1+LM0q5_r!vtD$6-KNyGTf<}}v1zrr6S*z=7) zN^b?rcPbZFKdMS!s*lotVs`+n^o58W_nAx?ur@^3ZHQ!&ZexU&V=>xDvivoYN1bk? z9Vj}e$-Ir#pux!kOZa&x=w-erxnnNsw@oYt0w?AY zRM#jw24$tS1bc#AFCvH1YMtI=&ayc@bvsp1Wcm_%u>7=5R3$Kdy&E@HZ&Z}E`O;fI zdxB=5&-C_f%&yK>Lv`<|(#&C3Px<0!h03*+Ps~6F`B;7&7_J3|x1;sI$X@rzVGC7L z@O&QsG+w!gD8BYsiq@p)wo;cy_l0wZzP`#h(iFX){>e97CdXmQf)$V&A@BtoL*PI2 z^kfGxyMVDSOTeTRi_2>E|G};UJ%ee}2vh7Nbbu*#p4NH0CvIourHnF3V>rjIKzjvM qgC~R>fad_*zY9JR{_PaF{WT;<*_ql-*L~yl?(ve?6v8BI2m2cyv2uC< literal 0 HcmV?d00001 diff --git a/__pycache__/test_yenc2.cpython-312.pyc b/__pycache__/test_yenc2.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..15965e4a123d79ecc5f4cd82fca8d07a5a127aa0 GIT binary patch literal 2307 zcmb7FTW=Fb6rSN_k@oEDoHOT~ zIhSw0cez>-(2t}35QR!b!Bts z97j0N=Rr>(j3XjUVpDq0Qd7swjzFxy`R(PImar{e_hOt8fOGI{b;9m4QW`Qdf;p_B zF?8WFLUR^^=Qx#9n7%=3BjPEDK*oy!)uM7cKsLv#Jh4pmB1FR~#GZA*-iywj2Q7!f zA~A^Y=Dn_B(;gABkXd5QLKeX`PPUlZ%{O>#X=<4^F#1>j5Ie<-A1ul|QlM%zQXAPl zgTl7x2HV{jW{joiS%Ab+lhcXRWH2+HiU%b*9!pCbZ!kFmg^gEW6&7^+#f&1wD2-)w zZdyv|t?$LAuSnyR&QRSNOQ)q2(FLX>gR%hjBw24EQhbI;MCaMJE+kS!n$>wjizO+@ z=$U^2jt{^=Wg;V`;s^TE8QonwIT61?sgzP^8)&m=X zG`DywUfg>#QFZrdVnvJU z!I?U#$m~fLzl<}$lZ{z2wV=xzQ#EI4PDOLp2xrVyr)nWQ3wXO(P}tQCGJT#wilebt zU$BWx!esuP{-0&j14e{nbH8283?Jxim}Vp5IYAZV{_QmZD`3)%8#)w^85t2wFMtVL z(r4~B-^6NaU}Q(CK;Pb8PX+vBS*v4(jrC9SWMc!Ye9LG&-bAXft625@mmxjVfbF_Q~2H+^X}*nM6t# zHA)h5hahohOalDL$}N`%7y0QupO+aT^7(p=sfXXnorq=kvx zn-3j6&Ewac{u`&}PZa}I=g!>t;KYS~v)ZHTXabRm9L;sVerZ@%tXx?71Uat79=<2rVS9_t(wj`G+1+^LTHK z7KNK9O1`D&eb4Uo_F#F}p=$eJ**o~C24&^$SJ#|~Me-kQgo zhmpfsi)o?%=|~d=jjCqtbp#Iv4bX`V4`0;njWkA~9t_%z+UNola#ErUD2@C=b!Y;> zzmsjS9;p?>Hgsu*T$z?eC__`@uW%9;n;gdYiN%Gxe%p!c?h4?Zv^sh>S#?FKwn$ER q!uNsbJVw}>n_3zv9V&%cV$r^bNXSi9#66|=OUJ8X{|{)uaP}uirQ6^D literal 0 HcmV?d00001 diff --git a/__pycache__/verify_nzb.cpython-312.pyc b/__pycache__/verify_nzb.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b92d3296884ea4f75a6c073d49a542e405dcbd32 GIT binary patch literal 51961 zcmeFa33yxAeJ^+~_8lMqf;$23J1J^kD9KzzN|Z#|mb^)p8H#`;N))MFK$gXTu`Ia_ z<)}54xDho@KhsUx(24t^PW!zuZD*pzi;_4~K%fEy;Wy82`{q5*`}&5C^gUaOzsdam z=i*)f)TJ%AeQ!G7H&^1h2WPwIoO{my{P+8FtJTEe8t!r)`Pz#d_Yd?#x(s53zr9?| zaThs1=jVsHWBgv8r?_fZwO7UN>b+`q*X-4>yLPXZ-F16)?5^LdXLrM1BfFdSn%LdE z*UavgW7a_x&mFVvwX>Gh!;WJ)dvjP^GweL(+Uq*z-s@(+wZpl`JbOJXt{cufmcKXu zSi#-`o>OrFmtX&;;Rn3fYZceS`He4fe$x+BV#*Iv9q|4D^G(-YA4|?NNbkUR`^@|D*rNnD?(MkbmXu&mzkk|`M34ieOLPB z-|S!UqHgah|3m(j7|&{dyT8M~>P79|HG#GM)kkYNPOxIu*5PlBGzMw5&hV#Hb)6s5 zL+kjYd0=E@G&B$z8XXDt;kVWw`0|NBohoVc4}=B=hX;ber1s!YVAzjL&BFts!^ksi z3k8IM1H*w-EHoO{oG#FW7x0(wO`eSR2EaS zmVMWZ+mJ zsX06v3?9~wFq7(Ef{dqa~n^!HP({{Ez?zyH{%|HLrGE&cspJ~1$y z%CYzNXH0f~{~O$GnyGuvmVx8PThQ&HgQxmO#tt+eKP6a@!2%Z|!6pR1$GvZ|p52y6 z2S)m7%a3XDQ(-QPTb(cV2|lU5^2_K&_UFC~dO;dC$rKY`3&nISO^=v?O}w$rlyr0j z0>?WK2L_MsK5^{WfN)B1;1NlEaNyYS;ebD>8a3VallQBWZTlpZWcfZ4G+&hAJU%x8NN zEM~Ty?M=8mF^wmYTR5jF6suEBBF=2w(8a-vKvm{-Q)B7D7WIHWu zj;tZqCturLuPXVMnJ}^84fCMP@XdrlEI3zgHm{3IlTWA(P z){CFk&Cpn&PjFKP&D#>gr>w=pUruQhti)e14*`a6u$S#5b2qty@KxklS zSR61?8T4CX%r27K&L@f{o$e0_a;9`+r?08U`dHv^6? zTB}KYf4_fpu)lwCzp1+d1)cZ{Y7xB1B{el-4=Mc%_0YLT7#Il-Vbi6%+S=|L34{Ru zkNVKj6r}eZ7e;aF9rJ|_4}^S!10%iz0iO^E2}1#YbDu!aaB)vJQyK+5_>+6OLF_4| zf1#e{JS>ccMh8cS(;Y2tAMu?S2|RZkr&GW$PAO*dIL`CH5`Ai?K2fkevrpAxpD6tc z^~tqUgj4N8XlQUaAin99dkzQ0zKCnm=N}COeZVw)hXz?@6iB#_v`4N)OVgcrK{jtxgdWMPkRcpLMhLwpW;sPf37~s*XhUBJw;fmF9jui z+q!~2;G@TUZNb2yW7yl9d;x4-M1sDd5g+z$-`)=2!J*+mb5bQ7pcfk$AtYB9c$NwQ zcMJ;6HPpoaXN6 zIFoI{KiM^BESP$HzNqB2wo7d@y35bSiyk_+ePYYx%6WU?)XLY^URoQoSI!u3+FKKj z{DeFI;2T@EfLt#qo0Qx!yn6@sX7)Zs$K%bEd+$ zu^?(J_%uj(!x?LblYhCrsY9o}y3vUEHJ!G@uD@p1Bc8Q@mKLB z{1JH(qeAM!GEXgf!G#h8;ul@mx>5;MnBPrXomYC2UoDk;6`X-TR;RXiTaw>2rfS<% zrxqSV%SliHfJ4EPLwI8btOORTQwgh)DZVYD)umVE9vKym0Vf#?WV|Y203{CMFSrE( zcE33{ZZ3+Ni(=-I(_IO@`D@R=@cd+OPG2;w`JVN4>&)PsZ+XJ*nlLA3v=C_UYs0E% zvC+;O!YZX&eyv|4ZA%7B)U>_BJhrvMTaunZXXE)+4M%UPPS^0;1bma);n9-;wy}nXK&)v8LLmXy?2AOZ_ha0ybwerYe&_@kUzE5&X)J>xGE&Cn6RAcS2O-aE_SngMB(|VDI%EUGJM{R9T9R%>6KuBpkG9Yu?xsR3f`aLPjceXUuP6q9k(fGBLf@)ZGsPD z2*%w0fssRi6o-7Lwu}t=0>Qz7cF~Tzp&LpN$c*==yApyBT6-C z0@Zp#M2M4GY9Uys2Mhz~0_8?e2Dz^VWFllEMZYEu)a(ElYJ@z1Pi3Tr34Dcuv>OPf z;S%u$XTMmhpTRZOuJDH_^c?F!^dbAX8^EY6pAoZB(w zj#&Wn=7FKEIy*M`$eHI8_T0GL8?}4CYmV6)BZkI*wB>#M=;@w>#{9Lu7y2ewP32rz z8+TPjT~*&b8gnh5)2#SMyK8dGRM}Md$>@3-*o<~eUrw7Bk!W^f^F(l+`ByLUH(@aV&2WS91j6ZTHUNl*L2RMp6S6$J7;!B zix_!E1>bbbLHR^5stA?0&(=Es5g*+~&;7%dH?PT89 zH$^lBpWLx??y}!-JRa}yMatI1JZmG4wF_z_+zS$e?OIt&SF`G^=G-l6Z5F%(@D<_R zqu3)PT^I*Q#>vQys}FJ5@pM)K)QoF05OZya79P8#(^1F?Yn9H#G;T9u%0R>AeFs>e zJ7SbtOW)HN4=W)D?@lw=Gb(bV_ln=;!XZPzhV2hL zj<%97hUO<rW;yz&z@9s987*-QI*f*X!5I8h65+qc6<0*FD6GpZXN4vk9;WT5mlt92I76sv2 zg%ZLF3ThCHS>yr?B_US$m}_VRB+-yxM1d%2y>Bd^?mm=0HV_&-yxu2s565(kzC&Qr z0bQZq2s^1+uuD=+P`B1oJ(5d+_lY7cc+^-?RtX<)s6%)R%ilPr^`VG}n~izd$ixCl z&rj-(4+?`TmV<>tw_&1^e)s(Eo>v1uTekMOu>zK?RC7;VPSP}leu0c184L(?_yJcN zA@Wi9efC3O+!>)CKN$HZoS_(F`xDkA{2rB39|Aj?E~Fkun9Bw3yCeUztp2p-0Z0diU2e0oQsuIcplL~Y~g-bAVIbnid73nmQn zO>1TiZ&l1Sbx%C^^7H4OpE@;XuX}Gx=qUMT(#S^!bL@gy#{#%xcg(5DuaG{hlxFhX^I!rn`G)INrP|+PrD@ z*;sS;>75BZn)WTI^hVo!LGjf7SV6-??;RUwu}_@*dfU|co9Mo)CgIATFY!(1z4~+_ zf7#{2%a+;hw^m#^dA;pQbHww=9lgeFTi`TS+k%BNxFY(}M6T~*|AqePCt|rx6Q+c# z^y20Vo2OUBTy+x$@RcIwlIi?NS!;I7p0ybbnGEPqVae2yS6e2w&*v9SZGF``v26hz z%bUu1Y4g<3OvBC6RoM;XueiMZ^2RILD??ZIWp~TOmDbD@MN3v*{&KWrZNyNRFqeGS zHT}eQif@{m7B#XavbHy}X8VoRbB{h2d3=BD(Ptu$^hZ2j%IKVhbC+J+bYatUZOqkh z)73pQ_QS8f@zvQwv6gNuDLrPuJD=}+&34H)eKMBca=AX5-!{8DlGl#8$l$6?7stz1 zM9Wsh%2wSpFCI(l<;M8(uITcv*z)d3YtNNuZydStbi}ha-HkgI&f=S1`B#IpHGesL zqjJu?E27!;$(?bYvv@!_&@vEL%v+r|)YrGp*>~PD?EEb#2;}@0uh>!e8%~Q^&VIcO zGdpKCM?4$YbAH2Ksv4z!duRC)6;@pCz1%i?;>wd(dLy1)i>loVc3{U{FEsboaBo@6 z+uhtdX3zGG+|O!^+jG=ETjtqrQU6@WBmQ%XmO^*M_VwzYuj47)SiPfK{azK1P$qEb z&>;eVF?5~=+UOiv%&Az~!4ONlX% zW)sOM5tubW)gc^^A(`k&vvktzfi!X9*Q6OTM+jIix|C{%`7s=*e$^PpE#}8x;ZbK1PcF^y5L8?={-ME8(m;|A z@I!-1^)Vdd>?l)1jU}nUiGMh$84L^!L!^b~Mvo>R2gql!PJ9(W zecE*sklmIaDR?+$dn96bWI@eYsxlMib8=ttUp#i<*!1?8XIU(#^>pvA%()4B&V+H^ znfuD%RQ)$czZ;xsebfKLp*M#9Rz2JMH})IN(X~%T_B|6_`%J94KUVXlm~#Lpm)?Gh-Qo6Ls#XUgg8fd2HQyygqf1M zBdIq{g``VD)*-he=Wh#b1fTh*Mb6`uTQA^%GVp|kS z&+OtR`TaoV$y&x0~D`ykyGSpTv_&aWf-7ferHk)+pvXy>5vm>Lxr7Q7N; zG_3JM@iL>F9_3u=CrUAtgJNbzIm43eL2)yqoDt=6rB>2+v}egGXF@rd$(vQqnpMuc zWI0<_Ig4K()*V#&jbS}PQ`mse95y1fgiQxk2enROiha5Vzx$V#ofM34OmktO1GP@aG(n84wx$m5F~MKqNSKh7V&_PHE!dIy9848F+T;~v;U=_vZ3Zx}SngR6knTi1G-lBO( z>hX&Dp<0@rf%L0SnwU1Ns4g-}&mm2_AYn0CR2Y7UgqRu1rhd{t#RLjb6vG1Lf)8VJ zp62GQ1#xS2)LI?0)}HR3H(H?-&^cXm%UC~iFk!I84f#<+{*-6V;3Ii{!-9^hr~*UZ zRY254+*LWDPuM+ids!4(DRp!9Mxw6lo|nhZjZf{KE`#pC^dnJw4UufQOgddNz4~(3 z#8}L}PE4bMPfQ=Y9GV!9+1rrj%#S-OqRxuxo|(sH_e7i(F=q!JQs{fF=~B~-KGNE8 zW6xAmtnkqZJIY>cxzI9QGqY|sG}#h!cA+48w*JEUsYBCavt5(xW3F~kI|^wFCeE2Z z<({-9a`MERXG$M&_!2qg)4L*$m5H3fsh)_V@*}gZ+IB~4a+yBTAQp9$O`4{*fCh5p zPK^I1hqLA_sF1#(<&2JxI4b7hEUtNHam3p;`^4EXC9LGkZXX-83&pt*I|h=S>?Ubx%b~Ks)Y>SoS5%g;S5*G?!*% z?u?Z5#hkk$mR+E5C(B-1n~~QMDe1&SL@ZqivvYFbrM8T`ZIP1Rm~(r?vi*I7{bk!Z z+q@+|kz0`Z?=DIdl+k}*OCsNUC&y^D{WrDQXj<69bMC5-o&ibYVi?rkm~CIgfQ~s& z_kDbn$Et`L>p#8i!{CDiv%cf($yL8qXzM9Ayql}-@#+VWC|{}LoWD)H*9>JpyPt<1 zx|)t9zY2Qj8pND_HDX%CTz(B=I=|bmMJc^M*RR9ffZuxDjkp_d#}NUm2n{SR^86;; zE&hDJ8F#C{z;D6b<}dVHakoR&yC~^u51twsBt1BQf|P3ZU?$E*adelz-OIWP1qF^+ zKjP(wT1tPKj-g+2UD6rrPYsl$@c1QDG^e;XR3hFEG+8HZN@yt(=mAvH_n#D)SkRhM zZo{@c0dV8Y)N~fpAhg#2Cq5|r5*^AC+(VUoXk;kV-#=EYFvMmlcOyXoV*7y)<0+od zoHr*{uEotF-AYO)G;^TS%fV#1W$=oqt2{_lq(Pmf2_m2-sURpz_LY#?u&ju77O3b~ zFkw*dQvbeI%Rx1ZTf?2#lDfhhd>@9Y!wiLlQ%NhqF?w13qhQiOyXMz;G^v1)3S}^B z8lWxCN{$sN%|a@(izdN`HkejJ!sdMW=((d)mGQ#HXkp{bp_pxT+_3tlVYMjlJL9Y8 z|AepAd`DN$56UkXwFw#jm&^nZb_vm4JQurZCNwk?!vBt^V95UgH&_WUeQuhCH`Htv zL`93i@1;_H0CV_H#Fax(MP(hr5+=7eyF6^6jf6x26_j1kb`dDsv+}<5A zbVuyn_iodPcBZVJ{|+YMyV`#Plfd=`O@i#iFNOT19G7-|3W>meVI~|Gh~{IlsQmBpU#nD64fOy2X%UDu+0H&#YEh5&;PTEIgp(Cy$=s^`+y&)P3=YeWmmg}yQ=2fO`5A3 z4aE&ABwsc06t@`L^VL^#SxO#H@q9IM@7uHB!}GV7q3@}etb)oEo-hu5wk+AaOb9`4 zk27vuXM{}|X{`MrwtWhArCt!B|GNPi!&=BiwP!LEY}3;BGd%XR2QN^Drg(wPzh$)t`Styr1MlBo<;9o>YW7 z5B3x`Ch;j}vX)kzx{r}9N%M&joLz&5$(XB7lhiWN4bxX=ONMEQ1J7q*T66Hk$e{26 zx{=fj2#116161h($BsjN#RNOCP`_x_qfey@(I|@qT@0UP@NcY8X(@__#FMlZ zzk_PxT66({y08IgU`@k>X+E!b>d9|CKhd+GGFm;qDk+;@IkhjIS9{Y@3mh)LW&!A% zCt@y30E4p>&qI&0BxY-g7+Rnml3#}fSw;NV!bFL0(gdy7i$^XT`Q~ukQ66=aC&UL$ z*WPs1C)@>h)SSEFxBuv>{0*nFdKQ;;s5bk>~LwXs&m^LwO8}`_9Da80vp9^v?y@3(Tm(`X1>E_xMtB)+@(f(7APao z!cL}lu+}~cl)b>8qE#WUNYqPRN{ZovJFR!3sQjI(J3@LdJf!_#nu^yEIztv+8M#Cd zF1nWJl>*y#iIOCxT6Bf^H{}y|iCPNm**9fn|HZprQi>0&a2&{E1;aK2WyEt77%ocz zde))_@Id2NKg$alIvsv6;7ID6!H`gXZ^erSjh`S2@kz1t9q=V*To)pYf?a9N#jx%SX+Y_|sslW#l=AN@FY6j*md`xa>h!QPWt@>W zc*Yi~Q+;>?&3*V&1Y_F9DmOF3)jF=JF!;mJSWshhl$}D3TY)$HS?PkB~^de|AQ$M8+=|pNm zSimsAswe$tzF&l<1P-!*>HA0+D^mofsp(;uHevO_HUuI}g~+w-Tw8=>rOw30_Mhzg z@xGt*|8@T>N8+9}QO}w=&$`H?k58BvR4!vDKVMNFuUHYSSTXO&i#uwfjv6u~*nVMq z++7)US7!gnuYmX}#|iqppyW04C38H#A)4QC$EvTieaz`gZRh$Xx+l9A99(hvMA!Kp ziJ~%gEB3{UTcX7+vEtUar}bRVMAu{)#KcqUVJS23sfpBYnhnh!jMQ$4dAcKx?vw;M zZm)>iD*2SFbuc#xI z&fg-J(lKO8UmJ6-n+--R9VGBW;-|r3O!k@eTgv$VrM0^-N|>A zYOcH5Rrv8%F5l(TyyekQyikP-Zx!ZF*j=^C;@ z5Dzg1rzmIuwUi0}WLTV{9%Y*Xm`XCi8=Y)04`n(`whSSlHmuHUhmBc=-RU0rbzxOz zxzBvw8bFTBXFz8#vo37siJseyzY?a5Z|D;q#-qk;?T_u*x~;E!m+!INTORcd!RrGz z1UWJ{R-OUSvI|L&!&xIrQnuwtWA??tt->$ri8!l{! zyK17YnwzesndQXTQ%K7%j^{(zUqAEA?AF=!k%sPAeox%lb51{@nHV63*@~Ao5Y!T5 z^UjJ$_0}8i8@fp4u9)-Th~;6}>3)6-3iU|Fn73f%TwD210KRa$$Bg*SwAXg3_^b7N z$0p6yhBb&^E9W~o&9#bR#IJKa!YsZMZ6k)V{UajsM#XF`zV17;W%fxJR&`3K90&zS z09Juy-T-?^RaliNjR(q-wS^b~^q9N}Aj$5= z;KsDO_q6Zv;W#H2$A|xp)=@#m>Swv>1*{d`M={}76qr$#Sx>RW3OisTI7E&}dYuyd zp~FukBWQNVN)=B&nYD5O%?3}RptweD&bZANwfSPU^0=WqVkl1-EOA5OO+(?-K-A#9 z1!kGNcpjTu(R0HTTd_N`d{3m|u~`1&ap&XdRk%J1O4yYL#TuJ8QodofYj$@)86W&F4J_D0Rcb%$*Z2Y+=8H0z~R*|DqZ zDc^_0eG_b$)Ug~%_67|(vRH=IRb9R)vYt$J@7ywj~wLnRox54=_hViuId3!0(@O|gQO zxT_^%X^{bFRit*^Z2fF;q`Eui?1@-$2xB|UAsVW z;@PDcJQBo&u9Liqm297vc&@xk(>;=4J!&YB$Vxg)Y12)4x5zw1w4$IRAw6SpdB%b+ z#=an)qf8bv!cCPSA(xqCVHG3vR9{tr(326oBl+pkNU>BKMbhsKVllG~nUD?1%I+bb zR43yJNl}bIUUo#ZZyJ5d5+yM3wFI%4i7+7E=;ffHwJ=gE2;MrCnJY1C3W zt)Hom`j*ALYop$^vw1OZ`<$g?-dPZLmPeiC(<{H%_Ig{qVpX(aRjgvo75BSESBv89 zd!p@o=A4hkEssSkk1=@F7%gaw6*R|P%@Ip8&@=1f{3i)lGl)2{>N4&DnN|_0+!k~8 zMjqZBvFs-LElu6Ei&Wg|m~#yjM=cNicHU9>-O;}~`IbKZ(7xzH`y%$Isg?VR5wX_} zVlRLRI8)M9#ZR}d=vc{JbMYO^G}qjD6mQ@=mTRsxswv*Wqs%pcJj9o?aHX-UTzze$ zrPHXsZuB62-D~M=P+xDTM*OWDOIL~dtr9K8%hjlxMdcAP$B;+&1A#?w=G3UcE+szS z5&-Hm1Qw_vZ+WR@*vra1qjVZLa4C?y7~nAbUvpYTGgD0z;u4ZFFS=lXu6Qcx@84gzuZn<)gq{e1x3)Er?B6*#9U;6@rW>`EU&nLs!TxLNuHf@t?F z#3hoLVfQkbVWMD2_z6l0ehO$Q3vTS{4{5QCx#73~T&`nKI+DuU6##v)vO$J=TVX8PqK^Q?&KNR#29U2OW@Qt{fpzLk(BFaSI*W(DpNWf%ye~1HI*~D_Uq$sR?PT+ zPDKAxQ->q=%@M=q*+<3uLJsHt5}(bX+C)|e&%~T7XDcF>jf@Yq>C<2v zMt{cMW#GTjuInu0AX(`2YOWS&C|=T`LdJD3j~~~|TwPlA^_7+`PW=|AMf@$T8o5~j zhh94aIF~W8GQEMs#g~X{LC+N8fPbT42UII`{?eN%Q=d_#40fcg4Q3S_UoZ*;>?xv0 z6oHV8dkAonK^m@wqPDIKkkYf3)&+-A>m>k#M;-_ms5AO6iwMGMhLNei3N?Z(U;y?L z0Ry2FFHi7NFo~bH5#gGd{I^+DPpmU9+S5Wg6;|5LY$x|qqh}CEdl!;cPBdDYMr_gE zb)v1Yilz6iOeOuVC>Z=18c^K4i4re7Y}lM6SnlBGODf|fP0^C38UGK5-+;+YXSBI9 z*1Y9L=Cdd=RLKNy0(~SW5lsB#afy=8FST4bYV|V zhF%IM@`@)dw7BOA93gYdl_Nk7^=O#4?OO9w1KL_D;0cUr;pEn3`VWG&d0-``Y z^3=|h!iao!Fyd&Z&4{$rZgh5f_&;jbb+m9-i};Qv&DCNJ#eMBoWL#_F@#9*HtJ9^v zuCjF6)YolVio4Xvg?fzm9_V<0V1&*K%=!noiLUJ+4hWqPMv@wGP+6xFxgtbjq{|4^ z^fno+T{{1snG6K>F+T+R-%yElYETg!ke`MpucoG1`{`EiOC{e_C|gX=mCN3IiM!onH7H2gbiyXZP^YqZar{Mpf;J;AtPZSU|)(bu)vqH*)Ie_fU!N8@gI-mjahbHNQf}bj&^Q-Ap@{@9( z7Qa$1LZRYkz%S8zs~(De^h@;Ms)xEC{SrN7YTzN$+P_nDaJU<4O#$dq+a*ceL6|I# z3a7@P)*GV5wLfWPF85N?0w=#R#V`m3?Bt$6fC1O3Vw;d z;5sDz9``|M#pTYq(zT~|POgn<)+W3ar*}-&$21iQPtoaZ6QP)<2sVLmt=L5lT*b6G zO_A6twWa(z{sfJuUx(xy7+RO2{-qPTmZWv5flj3cx{}(I&ZRD;bE$`pCFxuma3`Hh zqtrs?9r~A~hiQWTCFxPceQy4T6NTZAHL`Yzx@VEbO3=z)3NV}5q*u})}NKgGD@w-%)OLMd(G#^gGiu1BPnd@VhUR5$$^rvQ*yEbC!8q(+6x0r+HIJIwL0GK8as$8*sz&nppLXa2 z3l6&mCC0UgEkjH_t|iwYY4w6bqSF1aKrH^}@SR#NVF#{4x(<k23#(d+H5D-wQzJ3EDvcKFzY;6E6|Mh518OrUp6j(QFR8A*~ff>GihVh(n! zNF}kk_*1w|jZg;}Y)+cf+#9IslPgcs*=Md($pH_n*x@Nmpy3Kl6krL6hV)5S$_Hljm!6nx_nRzhLW(inY4q8=gX?UlZON&L${ivCC#ytWlV1vI8{;k9j$t!>4U-tz`X6l$F!H6g1syC6`KGr7_sxevRF# z>M5^0;j1DI=aRd>DdVh<@ON*k(Ssl@&8zC-&UL!0UT5b@%hgsb;@4MF*q5bANFeDf zfus&BHIW2Lo46{8;iT;_u4b%f1p%B?Vliigyvslb5%e#C0tor&RW7<@As@h`crC$` zF-!UBJIq&Q5F+(K;?gj!K^cf-){(&4{k=W^I5Z(SCHC}6?kse}nAW$tW|*U% z3|`VtlX|t-gz+qNi?UloeNVcc6#F7NSZu^HH%DqAZ4xPuH$(7xME1;be|fa0dSQ2n z4u5u~Nj&oXcBD*7Pv7AmP4lK!dIK=+)L~TR>3k`MHBp>00n|W`RClCG%1PguksgfS zVEm^~oA!aYEM@Lep);Ck5c*&%IIJd5I`F|#BRvQGQ&^Kot(8io??|mr|B_-zRX9RI zEmA)44q8*oq~Ga#m#kPVt;jI>eMl z70vrt4I9YuPb#PvpSL=w#SAT4iTGY@K6rjsY@G=nO`_m&Pm(_=GU2XZh)Ld<Ma~jDwq+Wyg_4IGuyE5*fK3DH)7z-gWu$*wY6hd!C%~ z$4i&pDqR-AuhM16xO*FO1&+Cw2aT$5s0y?In9KUQ0=UbCN?g)-Y!n`$M$mJ`fo}xagA}gSNzjT0VjW!Vj4}q0m9CdMIe1v_&X_I(Xukuo<~^M)9=%5eg+G z7d`#>ECg@`atMr3i6r$C)XI|-tf8X%)Rzu|1Tg6=XBVRBWA`5hh=oJGLi z#k|8!ZuDXf--LESWj59%oSwL|D(b9?IcwsUnuw+5*QIsPadx<&-F(wgK0N@vy<5<7 zMn&@lbKFrKbyQD}{nf_5+&t&#WcqUrQBT86Z_KkM?pPCbtbrcCw;o40G$Qiq@IRJU z2Nmo|&77l>wOSW-)Xg~>K8D(LJ+h(k4|SgA3(bqV@ji8|GU}|1IjiHA>WHP9DP5FA z4JC61@B8M02)Reeo3e?V8dx3_Tqu}YF_Sl0FqhMM`EmG|`C-GG4N-UXWbd>t;V!(m zJIBV@)(ji=X zH<4F&H-bNLT5jgm-NV?C`@W_6?qp@=U~gKg?|lqQ#pRKl)=wGV>rC!eFF)n#Sp^pq zJvPmo?H)w0sra58-8D6f7w|o9-L*nBrI+OQ6soVSG9wN>qn@%nncXNBhahLwoF)zY}trGC4(eK~%-YvWPq-5eIWS(wMdLS0Xj{#_s6Q(<|x zOi%GzBb8jiQ>|6*tq%1KBfr&RxM9*!+@VJL4VQLnvHnKB9`P(lMiL{2LA{6t`nCIT zsB?h!YxE)OqksGx{NuVNx3$H^Ci*a>9!SYp4C@MQ@4j}SJynNVH%ZCk+8g|&=1unkMsTGmnRLRs)RE8ne zW*tRfG5$T8VpQE58g?Ef;Rb{;vN9<%Q~C#kq!M%aw8&dwM^!@_7G@t53a1u68^zrw z?BWyg*s?w!-S$*u#g^FcS0m3Ho;V`vfWbtr`1RtrtvP~ZTQiD?2iV!h7CxCHvRwP& znoBgT3ht>hC*fx61YG=+KNd!srO8b?2Sno3oKi9m4Fr$k^FQKohI452xbP4aI)i?} z3LQ>Z;Ky2|^OBZK?w)vLTT&Gn!%qmHCXP%r$=t(zDSc81dyqAjztrq_F%`_aiZ~VX zl__TWFDo}hExw5zQ`Pgns_BFA>b7Wg+b?|^!5%LuOL5(Yqa_<=cSK9JO~UG?G@e%< z&4a70ctcyXp>6i*8|z~YkH_+!0OuShisgbO?x=`5DyF+`IqE*rb7h+#udix@e1@{<-@@&VdPL98}mh>&J ztsQFwy zB86Jm=)Ceq$5SjBT~0*-NXz8?4DJit&kCST8qNIx!(y&_t|*sQ%D)h%UbSfY_5S;`*+c%C|z>p!B;W<$6Qrd)i5*YgOZAlht9+|8D(!0 z>t%+iO;1!?riG>Ac2PX_75gop|FGP8p%Fkt(=Yc1v**g}ff!dFKeRhA^K`MXQZKb> zJ5ZwE(-i#u^ent6=Von3xo+lm98rtg@hR^7bedXCtNkhQR4}7p(B5Yux`%lcg=EIq z9~w9s=m)bEUeU#mna~fBtYLDe{|jRhcX~V467#jfL?$AEC4MI(MU2s=Pue=kN#`(Z zwnW{vly$-}s?1J1H9d@|Cpb+fB9)yf*GxJE_KZ;U+hLmVnd7oJV*@8`MV&>u1_#3$N^c_nE8DL>_xG{@8Hz zvEf+ZvAFwK#C;4K+Lf2^tR+LD+!5$$;D{Xm=e(^6U*-4AubaPTf8Bmr z{Uh67*kZoTQ`$t4FH+Q)XkI?G<=eX$6j>83Uo)%ziS5U>8~RxJ!|~#Wqs0$@Y~*~) z#ikI(yse)usObT}#VHEQD|;1ep-5v54%~A{NzM5wvywf-ciH$Cb30dam-u#<=6}*5 zHce@N($JpAUA6MDV|r*xk3$1-S!oRtF0P}uWGk-7HO}m0c{M| zHCl=r&B(a!<~#Fr*K>6gFVb~38LyY|ot3uh<$8+O=_!2~HGO?KPw^FMim%S?GOOP* ztI-o#0E8FA$p`o~yvHwkfG-Vm3c-mFAbn0O zkM2A2WuEQ%HvnJ%9saiBuMvOdEEuDBwFqB*r~W zQBPCM(-L>IL>w&(xqu=-jZ?S*;Rh(3v+R?P^W;W94ZeUeoXP3*0yXGV5o+M&FSh4* zn$%ZYEQnv-z;|kNSKG9RU*oMvzh*O2ynqmeYlSS`TSDn=Ko@k^Hfj;Su7a8ve_g{u z9SaFXP+vFcI*aw!9ek(Day>^+@q9f>W^GzJ=JChh_9MbR>4f{@D}{d&%QAJ$WtMos zp`0G(N$Uze2fegmMCS{qILTQGtsQ}m7;rSRmqs>X_!U|dr5TGtVIl6J^#LlFgU1~3 zs@A=-ZlV+4!-(6fqxR~Ez4>xQeEGKM@@+SsjxB#Gk%w<$!KZ+`1o)c6E%;DxkWM1$ zB1mzTro@09|5

#f2cx5DL?xM5aKNpa8vIC;)uXrX3SK5QNaYP)FZpVz!f&=z%Pq zk%mEBk~F7-9GW};+|epQL?wrjX)JO{d5=sw0k*4@aWZ8XnT1OcRF&{klCeDCOh2zn znH@Ev4uSMV7qoh1>5Yt^%CPf+=1Nf$8Ey<^?P-$t_;pP6@JnI+3roKxy)@znd`nA= z2&+qh`y_y?1aA-WGyZv_#d)ahm+|ud5u<@_dFox?-{a3;$xIsb*DM6N3n|f;S-AD{ z&p?!YN+Ns_Zv%xQt6cz}evM%hORqxg?@YPUqIr9eHKTu_dddAPzr`h1%A%)}y}tD4ud$ zB%+f78?Ir{dOhaT{lK#x35c#T&O&L@gE5JMg8fkMX@L#>{fMjCqNIir2iCyfcND_x$MT zzj!)U&=GfaOmr>O0%H|fQp6X7Vs!AOuVje-W{ojVN8Hg7adh0*Lx|7{)41i!#P5tKQvwZS#-yktYXY zo&#~mfr#S(JuM4^_Et=6Ilqfsazjy@#F*lATppVfyH=8(jZz@hac51`SumND>SLaV;*N)+j)!QZcCnQFpnE8P$H6&Z*!KTs z7Z%ibI-8K{yYD+X?h^hhP8;4|&LDqx!6he@a@LJ^7ify_$}G-LgXgd(&iMLN@Uz%c ztox1{u|Lc0sa5}t8L_K6z6X{ndM(8*g-E_y&C*->o^s9A2I4Vkp6ZPzq3^Lb~Dv|dj%`AiQieKd3!UJ zc}G)>^mlxe{!RnGvr_X;BTH}1Mf$rserJvDUA>0lW-9Zphu>MRc{fi-aW79{ISZ>; zSgY&VpntcS?`gHX+oGrVY6F$o#A9?f_=25w^^HP)Yl-1Tk%r>lmR^VUr#3UwadWl0UOi$)7oNz2(NAdHCJ} z+t2d!6ff0NZWYbp&ua4#|2fBRR~vrL({q2WZP~F}`}395+Rr!hJ5;*&IBM-ZEw%QZ zJ{P&~74tj1hWAQz6tAF??=|x~T6OQWu#ziT$; z8j$G_%J_Er8Gd!jQHV^j0>4ub87a|Q8A{Ono3c^3#9w20ZTdlS?6bH|OJJcyv&q!o zDHV86{~muK{29L>)}bY=qZ@sJ{S5JzQv4_p+hB-BT6KR59sG=~a0Vrr;e+sHq)7}0 z#+zbnC-jf_&Y~Flal!)%Gw^^#N=O$78F&LV?q@!U-m<1mQFp_{mP7_Ba5?u!#s72h zmE3o|*Ss)J%EkwZeK`N{9VCdX%5PdofyYvF%Ti8;*4xf)i(87Lmf~;knb|v6vUUz; zi}#7PfPYBmFE~|96h-W&3|Kvg-h$0kMQkP$v6-s)i>o>v>Z=wrqF3|yPK)MhzLw%8 z?ZwErwvIB0g=EuQ*Xk&4;VHDS(4p%r*I)PWoduTbd3uVM>XDlzgQER_dF5{}AhHxA zDYdWY8@`y;#n)+zvUEj&Op0+}>AkUwacAWgumco!osx&Dv<@xFveJ$ivi5+ioG(2M z7QV6?emYI!ypktAXk~QoflU-!VvMO}R9vEqRwqN3*%Hn4i^F)N3hdG6X`y;E7OE0* z{cT#U~o6ydC$ZYY%^p`K4`lY9C zqB~L0bXgZISUp=6&EGt+En&}}*2aA+qP`V3?JE*_zMBpol=<>VnNMP5X1)?Sy3W#; zwBdoDbufPRwqy=SNgRUli5J_9@=Jxitco$YT9;IOmkuqtcMra0GZ~E|M`Uk8E7-FX z4nFySl$QsdrL?8Z(rD6m_>j>Ylx=e%mR-)CqM#TiKSc&SU+5{?%%`wt$SkIGZ}1GL z48tdw%-Y2>K2z}?`KYn@B2Xu7C<0bYxTEXq7HN3e9BBg?d~&KCuURyWBN|>T)Jd^3 za>)+*SwlbBnfnBO!ia`>O_B9&C5aCMiR`3S0BJH0R9WU*eYR6{-|3Ex+E2EamxTPU#fl}-(%bJ9>VCt!x z*6RC8zP$b1_LSQb)6BMrcQp#XkLG$`>YXY(x9bmjsYYg*o``qloMjb*mZdihrPF0m zL&YsaDN8`SY|c=@;>A%z@zma#;#-E*cNrKt)1~gxW}m0DWEni|#vCnmp3=#Pmo9Hb z)Ja{;f<>*Q@`TN+sLBNE1M=%AFKDSHjzbO%_LL+8$bq$s68?!C=Hx5o&P)DgFdQ$* zic5g@FtnHa>t`G3N#}#0hd*yk`mFUEV4Nmz2;!NgH6XxIG(j3cCFIU$x?aaO<;RTH z!NUR49rukndoOOVdD$0*+SAV2<0g9MI>yavRVW%_ho`Fd54e%8#9di1LQ7N zj`%v##tJe{m+b9!g?7qi3>)XZ*&a9hZkm0xD{^w$%YQ{Bkj6LT-0*fMX=o6??t{#TCNSM>Od=tS2o zOZ6uyC#-de%G!ypUs}pY)dA{K1o>WVZ|$&h*Q|~XpZc1YN0_A=Nb8&J1p$#I_d)|! zqQXw_Gclx4gj_lh7hOu41L@U9K9(V}yoE}DXJm*VLOilN5Y`|7SwinHh$xq$CkPs5 z2`m*17ozmGT2UwUw!AmZ-s!G*<@#vl`q_b-m758)^quPy!Oty=kCZMS;v?qN$3EzB z(j_Ba{}m}qPL4%+atMGh)r$w5n)C-5t4OC$biqK*`m?7S8(Kcq zQyZGBh2;@vZD>uO(1#p>Hq0J4PGx&*(YE|UD)2G|Y}1KfCSf(QzN4@gB^Dn=F!Yqq zvs?7aj$(@O%IvPVz3!&HZe~xsspDo-2X+;{HblD%G@TC$xUh$aTB@f*bC$+=chOW= zym(o(co{z1u`=d;r-+vMF+*odqdL>|1V{Z_Lb_ZD|m#^xh6H`drs!| zVK-B}?qpw)+Rt>d#jhNbTSVZuKcbS>ZBT6{=(7(HX20+>#(FOYQFtSG7#hndrv#!) zhXzy->QDle87V^O57XUZ#WJ zD(>?}LBIk1NY_fYnXaW{_`7JU|NGP+>oLox_Ot3UOoTl@UEjIbSpb>c3bf>y7Pjyd z#g0-y8Y%*5BnTuu5Qudk5LqS=?k^BFBM_Vx2nGnWq89rTSVw6T{0IC6FW@;Zato>w zZT0&(6$@J2fyz5`ZyOQ2v#C^Ty8RGuLYQyR*4=j7wa(k+7Pzx0)@a=emQ~t~?|TXs zw75f)A-8rxPcbO5W?P@J4O^ZI51Cd)ukgx^Fvjv}@{N{c&v847M8{N$xT4^IN*7@`Yb4ZY8s0H!AGO~8R)fNG!RO@N2hzB*;K?*Vz3 zK~gFai4wel^?p9A_sKVIhQEQ7_W*U4_W-jr4e%ZyLnkRM{ngoweqf2AA8AxaX1B@S z1Jttj05$U-AR}I~RlPc8RgWIZ_Vp-xGNnUf6p7gn&=1i>LHh{#!ANF!4C`m+biqaT z^P+WI3i}{PB0>!#W||o(EJi(;6}l(uUCEZ{e@|fX9NGX_%o7dJ#oGr}jkndR9lYsR zRgKg9`JR_|p4<5cyQZJ`h$S-9?~hFXB180BhWxv~(bFUD{ss!zvVAx>2HZD`+Sh9S zrnp0;yPD^0-)Om7r=|Et3j6TAM>G3et!T?9Gm~lE(c3*sG;=LHW zEn$9<)>^sr)b#!SC&Sd*vdGkW6H@`m1w;OK71Yk>trcL0naT>1;sG)9GgUp#e?P-m z+PZ|H+E(;6!%z*nS?s$2un>ef8g0QvS0?)+Ws+8uWsU}iLZ*I3)!~a60pRImAf42T z7FG;%U?@7q!1;W>(<0aZS^OHS%!X;ow$dLHgsVjHl+{^IAlm1TuIru6y<(cIWFNY$ znkkGsS0ec?(`Y^GE$4+D1Wie2Rk(s6$u|i*DTUD0EZT<7Rj4lVw;w`8V$$uWV+^+9 zN07Go@^i#&1E167hnwb$JeD_(u~RBhXIH2~dB*Vsm}BltvF6TKT3=st_conjXWXUyMSW?uao4~0D68dB z3g4w^{Zj=0%#rD`N0!(3hJNbc<<&ph_!k?mY>Tbf`EC9U{axXE|GnQEW2X@_uJ2zw zB7OFVa(iDtG}V3C^P`f#D7jJ-Yu)zB!0U%TYeXIBg}f5MQ2dv9Eg<%tfm3*tR?=<+_^PF7-cKeiq8-~1C2NrkdruNLi=G75QH(KvR#R*Z z1#2m&pdd`aK5BF`f=qV;!XH!Wergk+$Yk46bRh6&l+Idx1~KMA;7b5n>=FSNktJg} z_W`bdA}B>PiU_4(SpuDm(f3p#62$;sbZ^j4M%I9-(Cy&N*%HugT(VUtY_2om6 zoSM0uO;@UaU0OBSohYezZU3eHH%nS)2JtIp)!!YjTotWc6{%Q#`M|8_CnY~FnYCXL zZdCtW(@&djcq32ljqDqU>^%@U;E$9AZn+PBq~*NTWc0rooF&owK&H{Zcix>hWsbQk z;fFO!pa@^qg&S9-Mrr%T^7>-#zIkVEl$L%h7a!N{g(HBEXtlgw-yE-Bf3tr5Z7qJ? z<}^h%5K1MLcXG|-5rDp{Tf$j=cNbKc1o8`D^}_a_TnVsgxM?Z9_puKBisZmwE3MnJ zx!uM5CD)ea+?)KCdd;6VAO^>+Ti`0PKtu5o7Ye{0XUj5p&M!y&nycN_?NDE@=}_a> z+x0w3K|O`SWjv)UcXwOW@96k$qv0LBj^b7-`Hn-|U7&v_SC4qs5keT}Svo@g8zK*e zvr3pH&VD)<7hP!_f^a=$OVu>ys@#Tz_W(1jPapAN6@L4OHbN~rEf!s(BuYtin|26| z1Fsy`tc@va)*g27{Tncg7Y@+or8gtlwPfNNHQ8HM1TYFl?oL2B;UKkih=Rii_5gOJ zArZk6fxwaQDuSemJeQ4(k`EL~qN$HGI!jiDe%H)#^gaXs$!2lOu z5}GcPW->{XWioA~MJAc9us85eXh{$-nc3zlZ_@O-?wj7x;{`OkbV`V#tS@46{Jx_$ z^_k<^)%^GQm4+XfR%Z)~XeXT|2;jlX7N^C}ga3feh?g?=SK6Zxy~tE++RtGZ)Q9(j znge|Y^OP|(1R=Z*zsU>(_r+IO2V7p!5M`-J9@jH7Wxe8lCt;KluLTDkUGfV{85P6T zl`Q)V%e3FPDQr@rAcftbBC#DZ10*N)C`ah+qKm$)q&#=2(b9@tbiv(y3Z{PMJh>KC z!_Tnn3ZJ|xk_tmsFZJl7{GE+-?G$wlv6m8e;(ts(;Q}RdKH+-b&!y*qxy=6r)aD$x z`?4$^+N;!27S*$b`RAU z`j)5Y@KUrhcPv)Dp@T~_CI2s|EOH+^DMo8UxJzeDDXRF3o%>i!mz>d@7zqgz)E+w%1BfL}?88j-(Sx8cO{GogZU@asV92%@h)3o$ zs=*aYCa=0V&2T6s!2VxRL0FSN=_mt8i+N;WX9^@|(7v2nhrK2gzxW)o#l){nPzM_alh%}`6& zinQ0lm%=kUqTY3J@204C(;cI>*t1XwGC|>RjytyBfhK!R!dsUps!SAB#fuuEMGZHL zdLk`7kQ>w3W-QU7Rq>+r(W3QeE8hu6q)WB6untN}ciJH6nyH_C;>O;{m;7_~K*SJ0 zMqw{=oKX(;?R;K6zR8RMS2WLrei(iu3@pIE}sT}4@>1tyM3#Xzna5uG3l;4H5AYHZn3H0*<*`EcXh3X;%)85o@&)~Z5gt! zSFb?)t%Bu{kE;Dr$YPo3Lfciuk<1P9k&4~?-ZBzlxp8uuR;1dn<)L=QZ3To ztxzN7-D=-fo%V)KjdXIFLFDa^(4l)qCKF^*K1O4H3wfe|tpeGST<66aRnc)wIANT*5$ zP)C%(bpU>9=2SmABV5G;I|!101BDqRzmw0|3#S@lw(8S8^Y;9yyqTISo9FDiPj3Yb zB9+a#velQLi%Z0HY!6Q`fS(MolcMdDS3Q8q+q}fak!t56 zwgD|-rQf4%)f%~GY+{n(MMXNgZW3!{@`5L=nH^SyTfa44N`7*{EWJJHsLDYWUk%21 z*BtJOH6ZL1dsd|Xo5NdGf{^q*M-D%1>IYVWd;kkvmRMGZUYI;s}#$vG6hc9tV4c8YoMMv2TEGOrW#SCsVrf<-yJzUqVtebb3>*dw-1#cUC|4}7X zPb@~?e~eEEurdn|6RCJcnNO)_$y)pLEWB$aWMjOLq0}wUPLy>3==J%%!`yr_&B~FVf8p(7OPAFUw>6tkejR`+%a36Rxu#VlmTI8Vi@dA z?kwahWdm!nU4=L>1Ws_rtg)sA{eyQHS=v$_kZy}P9DtxJkqr1tHSn%I=O3#rLKkXgNn8?3vK zntIJF^>g>+LSr;Af(6kt(B?d=89S*q8m!}S+0Y0dP+jF|fIwpo8c>_{+3GMU6zHQY zPX7$3J~+ZkWZ=FKI#%gSnz9&%zXw!n@6m}OgKb&H6-`wyjjzYca}H^e&t9br!$&e##-HDiq2;f>&hp3-P_pzY<00=PJy2#GhOwH z8Fz)AOZ{#sJ&~xjXhY%OSH7eKe?+-8!tbJOhCJl10e_o@b2{0E;aqHA6Fc)_Bqv6e zo7TkM#Zw#DTDbcD)eR>s-uX!}%s5F=w%tvN>Aku3UYtw2b8G1qS5)Wsm_r~oTSx47~Q$n#43=HhKb7Sd7K6EG-I+ShcSw6KIy5DiH<9^q@ zuI!5^J`O+X`@H|N{`}c^?rc0e{00h2u;xN@$DK<{m-5XAa?J;_O_62a1IM2{fAHjw zjpmMxX8ZK|REQtVg^sQcW#O%kp-z~>XrC5!!p@~v@JM|AC_3Y?mk)PXaR}|s(8D4P zA6*VW5U>~U_ir#qWgTE1sp^Wt;F!3ga9QH_mCRR(+KM)mFa8bk&O6TNK4dv%}ll0{vO#}M+K1Mj6@;)G=MatiI zussi}_8~=a=ot~=JPNI76)q#;D^8lGOv|a0r5vKV=`Qfp5WWchUG|=+;fwU$ zBAfCBictMKVwoCUYpO%^IMkQo6Z3Edn2N_0n#+~HP__7$-!JI)Qwn}d!S5&tQt%%H zaA>xW=4uPY=67bMd%-4T-r$!%gB zCtcFu<7qXg*eRidRs++MZ*s=2XvdNP+@#{9cshoo&=!rZ?m(TQ&{I>mw3b^AigaR)8*8K~eVq%S~hg;Obv zJrTP9CHU3_?>dFSbwOMgq;;WnU2p?_Ds*Rs?k7U$Qz7z1XniWY0GCP@@q>MjS!mnh zWI;_pP_hb^R*m1bAa>hgXYHDRfFeYk7rtp%z6e;+)wayb zv$4G;ubnk+1_WPIF4*^*)2n+|hS!39Yu>&^v1ALgw$ibSjGbeeYVoqyS)p-{W+i|$ z(AzWz2cg2=p}9Ed7VN%~NMNbEj|I0g?AsRBwJA`jy=CLgx3EK+fWT-z-MV>11MAQP z1V#j)ZT~GRdPkse`;_xCV-svs;D6dMj4w79B0V^7U+Cy6?CCDN5G}NX?@TRCZ8nE6 zpnF?2EB^o4*se9;ALFLCQF9T5(@Xm`kswl=(IkSr)E*x}erir5K>;DKR|^u&M4u r0yV|Q>lIYq;;_lhPbtkwwJTx+Dg#+t46^bAGb1D8Ee5S379a-z46Z7x literal 0 HcmV?d00001 diff --git a/tests/__pycache__/test_verify_nzb.cpython-312.pyc b/tests/__pycache__/test_verify_nzb.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fdba040c11266e6f9d874782af9a4772afff0bdc GIT binary patch literal 43266 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 dict[str, str]: return attrs +_YENC_TABLE = bytes((i - 42) % 256 for i in range(256)) + def _decode_yenc_lines(lines: Iterable[bytes]) -> bytes: + joined = b"".join(lines) + if not joined: + return b"" + parts = joined.split(b"=") + if len(parts) == 1: + return joined.translate(_YENC_TABLE) + decoded = bytearray() - for line in lines: - index = 0 - while index < len(line): - byte = line[index] - if byte == 61: - index += 1 - if index >= len(line): - raise ValueError("dangling yEnc escape") - byte = (line[index] - 64) % 256 - decoded.append((byte - 42) % 256) - index += 1 + decoded.extend(parts[0].translate(_YENC_TABLE)) + + iterator = iter(parts[1:]) + for part in iterator: + if not part: + decoded.append(211) # (61 - 106) % 256 + try: + next_part = next(iterator) + decoded.extend(next_part.translate(_YENC_TABLE)) + except StopIteration: + raise ValueError("dangling yEnc escape") + else: + decoded.append((part[0] - 106) % 256) + if len(part) > 1: + decoded.extend(part[1:].translate(_YENC_TABLE)) + return bytes(decoded)