From f95b7d32d4431dee0ea47efd1c70eb9dcb34ac42 Mon Sep 17 00:00:00 2001 From: Guillem Hernandez Sola Date: Tue, 14 Apr 2026 20:08:51 +0200 Subject: [PATCH] Added some fixes --- fonts/ComicNeue-Regular.ttf | Bin 0 -> 54844 bytes fonts/ComicRelief-Bold.ttf | Bin 93304 -> 0 bytes manga-renderer.py | 6 +- manga-translator.py | 315 +++++++++++++++++++++++++++--------- pipeline.py | 209 ++++++++++++++---------- 5 files changed, 359 insertions(+), 171 deletions(-) create mode 100755 fonts/ComicNeue-Regular.ttf delete mode 100755 fonts/ComicRelief-Bold.ttf diff --git a/fonts/ComicNeue-Regular.ttf b/fonts/ComicNeue-Regular.ttf new file mode 100755 index 0000000000000000000000000000000000000000..6525a27a54590c3bf1fa44bdee0844a90a5e05d7 GIT binary patch literal 54844 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 Hh2#Ghp~)Wa literal 0 HcmV?d00001 diff --git a/fonts/ComicRelief-Bold.ttf b/fonts/ComicRelief-Bold.ttf deleted file mode 100755 index 7b862465bcfe7b30ac1cfea6d91c93505c49e3eb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 93304 zcmb@v2Ygf4^*Da-Tas*99|}LT(cU6I0qrw z@c86FP9o*+@Q+P{(+rMyX1|Bt#3EsB*4=%Vvdw#M=uxfL}-#+`+F3K{*jW05sgs&eiPo=)f)=z>?QAm_51V4`$JMB7NGh*?S3mM zdPKSfVJ5J1phsv4735zap@H&pW=_L03fn_Ca$bnJWIu)K53++Cs;?)+B@zWQp>+5p zJW59lH3;ctXbW&H4Q&P^(o%lvIqC)KU0O=Z={$Nfy^Fq>zL|cRku&p|Wz2GB zkM2C(4Z3f56`#fHcmr?Yi+B%T##iuFd_8|Ie;a=%f3Kd^EA?tUuQ%u|dZ+$O17+Y0 z$%Zt8%8+Hy843)|hJM448JQ`w+?--gH)oh{Hs51@(fo?}Bg@JY6i6FFJh};BI!DHfsX=xOu zRDdZn4%6U|V7faF6KIOa(Z~~#-$a@tMG;l_g7Ep__2EU~h2e^mH_jcIJ3RN^+~4Nz zox5l5?zy|>HoSk)`_u39NAXcWFiX)Q4e?44s*n8M<*nSwa@nOSZ^?S$Pd;h(|?>4^M@NUJsrSJOQ^&GnA z(5;8gJGAxCs=t0B=@vK%{FbJ+s8e{eJycImPmdpHA%0QWysD=Xis<{QIfbh@k==;&zASe?~s3z zbfw~K#Y@S<$xo(iO8GdoBK66%ytLW0Pm~ua-%4*ve_oZZ`b6EY(Q0nje4Vi*V_znf z*_U}m=I2?(S@zh5UUWrn)7S+*5=hdTl;qHXSFBm z6m@)^yRNowS=~h4?RER>Ua31$_eI@YeNz2d_1o*OtiQAV;rf^A->v^g18!K`@W+Pt z8op}8jj4^sMo(i?3KWHeJ(nZ_}equQnZRI@XMu)0z#<#m$Y)i<(E9&u+fB z`MTzNn;&g{qxpm8f3`?lvRdpdH?(H7+FC1GJ6ii&r&@QkUe$U>>qD*2x4zT*d26^W zrOnXhZmVxw)V88+rtSQ;y=`~59dEyB-t+U0&il3_p(DG)*%9dI?ilP?+wnrjpXc-Q z7tFt7{sWzc&h?$2cKN$%y4t!Hb}jE3>zeM`)OAVM)m=At-P3h{*E3zObp54U(|u+4 zo!t+1KhyoE?jzm*=$>03TcBNFTu`uJY{9_=zg_Uuf|q*AdTM)Gd-n9~>$!QMVWDl| zu7#H^;ua|usTciv(F2QH7QeOllf}n-<-OUx_TH-Aj@~ywdEc=lcgf95GnU@C^t+{V z%a$&?=?v=`g=f5T#?dny&%A$m_VUO3ss8T%7yDlijs(A1!LHD(u&(g0Xj!pz#XBoL zA2@Shcwk~+%fQaT=E1{5>xXs?T{o;8)($^B{KSZ6gcNUuj!;`O0fo z-n#Ohl?PY;cI8tmUs`2cRj|slYVWG=#(TzJTV1`nZS}nqxf4eww@mI_Q?TZvvrK0_ zbk^fj7fh#4UogFI#yNBOtZVkhwVt)>*KS$6bM0T&9$9z(y4~wOT;H+&rVX+U7oNTG z?6)@7o^!{hd7GARPTs8Fyk+yw&DU(cck`p?PHxHAa_^Q$x4gPFu=VL}iQ96v6>h89 zwqV=PwsqT8+pXJ6w~ubWdi#yrpWpt~j_e%`J9h6lbe{RVt>;tc&p-d8oy9ws>>S=X zv2*RtZ95O_{O5&Z7tZc#+0}PZ@m^?^ih@!^&9l{r_|UO8~(jw|oF@=sTOah2w(WmjEwHFx!r zz52a-_P(?a?aSJ?bKglp$tl1pft`|(!P^61?TUGfGU!9mJcXq68__(CeDn>`JcA7M zIng|edce{Y`*MhlHYKyDa% ztV2O)GX!;Fiyw|K2<5Xd@*uRBg8U4OMA|MuEnrFVXnu75(?@Rq0StC%wMgha4dnz% z9=QNA^6;lY_QQE&&;-$1fNu=&3c}tpF3i0S-U%E$l#zLBP?wOO0h;jtj}-bbT}PsG z%)+crpy(u84b&cobQWka29z5Ua4JM~LLH&H19d|g!D9&OPnGjOC_jZ6q2>mGe#3wX z;TkW{nb2tj=rjaxq|GFJt`KTh!{-d}fy@?!nZ}_%4`pWoRAU0A2!)6o#QMefwFX96 z1FZ-h2_H{~ZUK}{2+}bR_)56aB+Mz!{Qo~?ctKhT6suvLnCyu%>_n}A!7%*ss2<>2 z3wTX~r2Uxgr{F)G<_9g|jSxMj6EbXv176K0Cr}aC%*C|+IFrUKdhY~}|*8ryp-$w-b z=7m{Y$OE{LwM``F=X&#~6M9afmC$NHkc=7u?@=h561blCKi16ucj?b(5E^E^Xf3@S z4v8P5T6zoW<{pi_&0dUBxl7SmYz4}t*JB@b3{}FD$W$UZa}+%W?O$e&Vg~9`m<*(Y zvNU);gl8Q*!|=%9>4c{h9uqu0@RUM(CG>p<@?XRA2#nFiT!6MprcpEd4jN<=(RSt= z!W^++1 zz@EeIK`Qn`cppYh(k>YLMWkU>krPm-plP&&8Ak1p)&dN-uuS9tGmTa-Q>c=83@u`^ zk)An-tjq?OD;1fU>d0~CMl?uOp^NFV$Sq7aT1dIj4$hAnnIcrfcu^tKgqoOq*ni$e zXV4!aBmE4r!+RC|0m@`Ipls%07;_xP=|J?tTy!&3?E?`Muij&o{6-k)Tq zaRAaPX!9QQUkGVs{J8+l0^N7Ob0Iui;n@byPIz`m4HJ80*H!FA1Fi z&+ce?e>Clirf-QU+ASLaI-HFzW?_whoIWC~6OdJq*K^5wAu=0H>q$!gMtr9`f&UVu zrrv@z59^80^2aI5qXsA>|t7uORb3PGy&%`4R^zgf-X;>!1hHAf!B`%OIUk)+JdR zKannk@){kK$D@37{`dKdT`UH4?|k@bIi%A{gF z^FZW*DDT^d%oDjIGE3wp4lC#r0t?V}H>|H);5iJ>F?g3B9^VhC1EINQNbBK&b|=AJJh=wSK85r(c&>qQUT3~UXA+n|UnXt3(MHgLa%f*qbRn#xBC;-74%UD-a+1l8d<-&M2(--* zc&vkz=*kl)gHs_3;JA;J3u_rtQbuqjGyoZ{V_t{70_2LoDZmP{FGZ1WB(I@7?pY*f zQ$e3uQ5yRe>JxbU7TO-AR~^u(L>TLE2zw0ZA)r+zk!x-v;ssiLgDwL- zYTz8Go$Eyb=3kM|xCJoBKR^#^Q3dob0PpN^K{suTTqVq{MHaFa$({x@zMAZ75?$ml z=K|e(W8@A3gRozHgH|)g&=t_9Ken!ZoU(Q#jjc6$C!&CES>z#m6MhBx;i-c??tOSx zz_W>71G@Pr=>KO?3hYax>ow378f_(~lx~ zX(v2o42pcuHlTL48tG^)&V@%0wA}`CAHt0Yg^-;Op@qE-eLN3tY(-aFh+D9vH&m<* z<@NOs^Sc)IhA4ATbZQS6S7`P65b6t|I%E9-@F~{y*E&Mj9^(6l9U;nY)Eo7V5N+oN z57Ox>R9hEP*75!Qwfm{`y4w9_x-LZ3^{nSZawBBwf`cKZbNvAbO29B7{ZO`^lpav1 zaBVgZS!3-1C00V6F@!pMhx!hvF=^=tG4>E$5K`6klKDdFy1HlsEkDSI9`6h>mL&)B za8g~vKtqUY=+%d4b6@w;UTCb{)ys!EJE17hr{zN>Bv;bc$L|+g14MaH6n*1EMWnun zw0yj?mj`O>3i6?Z&fb0~;YnQr$@xgm*RSmd7mXIE6_VEtgiv>H2(^*MdU)5ig>)pR zYYRS&9-Bu8`uut;mv z_t`**lkNK{sv$HOtapS`?0^E#hmz}B31*N14uw+4TQ|I=2>eQgfl>sb@IZqB06dgh z*U#_j=R>JLHb*GU-qzE*pBb$0Gli0djO!gCrM<1Iw{3w~sMSNcQYcTi??-8M3w!sc zrPYOSur`!hK$aYcR_*>|@{s}`A*=>o(B@7EJOP7%T(!G^!!T`%O>cy5u{_8FsV7}v zC6n4dz@!P_Z-UYvGV5np2rF)zH%$N;B5-4Iu@HUy>0- zu9okAFe3w_RHQ_;wY7u-=}?D*`_rWbp^FN%1`uyG;HWBagf#a3n4}p%Z<1!(_tPZJ zvhQa|sUY_zbdI93lH@ zmFjrqSz@K*v`S07a!Rb^?I@I7@UwUVQum9f5EV7N6G2ErP9n2K_E2F# zs1Vkp3zk9?NbFB8NMo?XNEG{jYyslv2)Sb{-ml;qh{T0lw*4$tHS~f~BwX~IMxLK* zQ*7tG0_0v8O&q7;f2s-4K0gU9DM#x2z;_A3&njcd{$i{mxcYz|fWS}o>4(JL)rS(A9g8;aOgL zkg>2?eYHf>CV!TOSDFqp%L(eM3@D}`-w>a5TcSfP$Iw#76cANCMS!5;Gpb2X z%>}|z5u*i!T|=xTN(*BJkf}0W6-oeQ!t;&BCNe4EVpXh8Kt`l=2=(+j`3l(33G|d$ z2!qC15#r47)&f;=+eKvJ|CGFbW0YH<`5mF^*lYszqwMM@2F{OBj%7uPvtB6ocoJ#I;`88AJlehJAY7H`-9q8-_ytYagRECsI1`h2C+`D3G3~l@`7C; zeniH0!Ak!**npwVP!WLGAfQad*dkIs2nJfMh&mBxBdjzhtUM8+M*IE**lURN3zGkT zC(=znC1C$AQcUPg^jL+lM5{kdUi5uYIGaELmledQ(hP6q1$x3WLYF8uaT2ru2~^^; z2kQh@xY8N&!76Y4nesLm4yP+aerVHf50yePk5I7z$jvvxCLE(yhn)y?XdaMxzWo3~ zjgaYt3?`W_`vEMJbVEicSwPw}K~)cFLoy3V8+K|j*`$5o!b&%_Y9PI6o>$4xk zV%ZYNiDgSkJ4|Yqk#<7v4AM@>ok`jWx#eWe258n#<|LUQnUiEzkU2?afV63b%phq) zGDD;d$qbV=Br_twRS&sQ0WOjo6W}7bl>%HOw@QGEvZT$7m?dpyg*K#uv{?(CE90ZC6W)X#>%}bT zu|dp|=4Zn=mEw>a#Vl!Xj+iA4HbL8}_;{OzH(|VU#Vl#QMa+`sTcKx_INmlfOB!q! zv!uZeXj>g0?>ym681H;BOPXIGW=Zp%(6d?`??N$48tf9Yq`^h@1BrrV8{)JF7>aIy zLlf*}eYFK4=}?F^b*_(X=ngRSg@2J7(Qm}u4?p2<8(ejRcp?M$%s9B^CWY%t2`CZn z!zIBTu4K3amJ0WSlqemkkQ!-F2FgTPNDKGia*z(?LX<&|49JK~$c!w=3b(-W;nqh1 zvO}E23GuNa1gCt6N)$uH#0Sxn5>yH?xpGv2Dp3`xMgddVSAjCq(kPAqLe0k&{JeG3rHqXbD=1mZ3AynP@rchnUU1=vK4?orivpu0o%n z^U-c}5xO4Tg>J(%+Jzak9bJyTM&F=IFpGAgr_kTfSLg^agqpVkCb@U!V&i zjxvT;LF8&2VrDl%4CO3{&5$?>i6yOtXzFKZJvtkrH5<_;bPjq5-Hgsfo6#1u6@8A5 zp+_)>C0L4OH~}Z3ITXfnoP-rP8AV`Sr{Gka2CG_$)3FMxu?A=0Oq_+aI2-3+9r_pg zw{W*kj|~{^*TF403%24soR4j|0Nb$xJJE6UXIzMjunW7f2Nz>6_F+FR!KJtim*Wat ziH@T8aTTt{0bGM?aUHJ54Y(0E#cuH7b`(PU@jTpt=i^S?g}dEZZ_u(aYDPD%pz-Qv+xE}}c3Os-Z@em%yBX|^#;gxt59!I~$tMLS$#B0z;=wo~q zx&u$)X*`2x@mjnNug4qk*?1#92fdAspm)$;(INCMI*k5;-ou+Pxv91VZ^hg2cDw_h zhtJ0s;GOtFybE81FUFVP-S`*yQoILlj$Mwgz*pj{@YQ%P-iNQj*W&B&_4o#SBfbgW zjBmlW;@j};_zrw0{w2N(-;M9V_u^ln8}YC4Z*U0j#|Q91d>_6aKY$;^58;RLBlx%Y zclh`CQT!OX8b6Moz)zxU@l*I|{0x2;KZl>kFW?vPOZX4?kN9Q$3Vs#8hF`~j!f)U= z@mu)M_-*_b{0{yrK7`-Jf5Y$L!}th3ir>c{;1BUf_+$JD{uFIbJ%AoWPs5Ga`_VIK8+sC5fbK!hQe{**dK5iIRZx}a zci@fso~ot-R1H;2)lv0S19<)#sV1tKYN1-GHnbQ05?zD#p?{#;(Pij5bSL@+x&mEE zwNvw`4r)HtNp(@()B>spJxnd67Qs#2$I%m1FV#map_Wq1IJio@X4IWH3ZFw0tH&m0 zr)86Cho+_nCZ~qz)w3>1&FbL5)Z~ODD5hM^im9QsLtIcuBsG&GlM_R$BtbDvtQ#1c z8kk)@JU+BOao|**sT-V}VFuuXs~-r$aNMAn)K8BGr$;3X(Mg7)lQf8v3<(L-Kspb> zhom7o-H@1a4dN(6LXy~YYQn^kQ+cL|^dEr_Y16>a;Mn+hP&yLLBsQOFmpFPV&or+H zPBEkK!L`hcjSmiSV?rWni9$LSg|tP4bW9{iOBB8_F{N5ssj-!bt*6FKTzM)lZHqy( zDw>h68krgznivmG42}(O?ZJWBnIUdmNTltt#^ccp*DfMIE+kAlL2?{ExDK)3gxIem z)^8%#uS4uNArfsONN#seO#=VvhKUh+XktV%KZ@jJ6v_D_l9NIrn?JZhgh@6T%W>V} zoKxbQ-LW~RVsmzjb54oL0;WHcwAzj}Sp!pBx zVuiVw+M$^s+Y|({iGY?COQQ2JOQ4E|`PiOO$T4I>wk^13O%Rsh>J@`QYThi>F-!H1 z!Qv1gpgPCs?$Jqh!Pv;^Al(z3l|-STJ4eUpI(Ry#$K+(37$nKj2C?^qV4MK*q0=yt z0stae2p&Q%eO9cGbrlL(p+B<%nzJJWDRyvZd?qM~j>Vh}6*Q@w5l|w7v8x1>#zmAS zW~udKl1ULCdTMl%noli_0EB>xCJd2~#XOVLW< zB|+#cWM#qOu`yQ>2xlzkb;Wb;c_(b&y~haKAt-cpF2LXJ3g{IKC&l1vL`;WCqA+#P6JPT z4o`dzPkatowtD2~rj9G{~&K1XqUj#G3gj?YmXpQAWFM{#@(UmPl5 zyoWE|!x!)2i}&!yq4LLJ@yB8D$6@iuNA|}@_Qyx|$4BMjn7dUpTmD@l-L}wLZV!C z6~$^@ptD6zyNY6SxQb$PxQb$PxQb$PxQb$PxQb$UxQgO)xZ-o1g4r7@D=IDF77N=4 zw@yqJ3tI@cPDo^nV`@OQE|w$e)zwhi!1ak8HVBCTGc5R`lBC&*!Kjf58!t!fPOx;Q zVSkz!lnt#P00jl*vMJCo13|DQWfRl0Ylf!ACa1(PN=l1e+?t_j&~8k_?9`-C>T|iH zG6}gTk9;nV*G-^tyWBx!1UguN5qOSopYyU6e1nq4K{VlnZ$gg1{TVRFsT z#ERMR@u3-EIG?YEooy^CDi%JyaxfSG!ZCrq2_5ilym>=TZ>cMu^_G%vA`OR!>1()Q z@Ht43Eno$I1Pu;|5jf7kckU2H;pGhE@O*?M9Lqp6I+f)#1+|RYovxxRCx_#bk}@*%h73(o62}o7 zY9kNf-CQg9KD=m8TS(T~8^}c9ZJ;q6>)|_jK?crd{&|2~HR^ysF@%hNu0e&+!1?nH z$OwUq_~-~+9q}3H4)Xmkg~{M7FnCQ~K3B`ifK;3W{#5B2wMJb|`TW9PB~@&-kUyhE zX*58!5{TgUxcxq_ve;sI)S9hJma8+J1}jC&q+W|DiD6`BolT`y=h77hBW2K+(&c6| zWinx$kdrg~4}fH|XRn#nu^&E96l>I;Q^g-*wu0xWWV5M~D%0yJh0zEegJ_w# zB38!vYz1}U8cBr-oGF${{G6oHYQZ*pEh#gbt(FS02vL!@k&1g9?&Xbw@24_QCX-T< z1P;DHDnTRiM3x32z>9?prj|4CRZUFI9~&DR9~)n_a&U#tqPJA(^7O_eSuXGlL{dW= z4GLO9vL3=h9j#FV_x$YXFKPiHpT%M{DoD_Oc67+3xF zio0EAOO_Usmx~-Sn&#NFG+kv;p|TTS`-AuS+qQPN-8AiRH2!hLeX;CjPZFjynt~F$ zJss2Y!=usn(gNZAdtr1caRBe_XZ)2G3l2Xf17XRlGFvXp(dTHj=_;90qb~a%UyyA$ z_4-ecl$y%iTwJNw*HrMiR~6>v@wtk$?Cf$n;k&C(fBRbBm#f*21;^gFni_QoilPh|L zR@E=mWY`|L2jjfF>Kc5faf`XAc(1_By}OoW!V+F3HJCF^5co2twM(YFxq5uUH9e`% z#9K0OU82d@-dvTG5PlkgkNK>~4cta<47|!N@a&!iK3UxZZ6)Bx!cjKaK#5YArnX4I zFO66VysIqP2_$2{D*rqg<~Sw@mxZgDm}33k_NWkgz{Qck|F(xX2hmhk(7*UR*s19A z{s&w?04d=3&n+2->x*^Z7?2c@747tt$Gv&e)FsmwPp)2mMpdP|%hTyB$jwP0`xPg_ zg2({JF$jUx!h#Hm${n;D=x_2z%86%U6Phv*poZ2qocmTn2Bj7Srxt_O=3+*PEOXS6kun_S*1d* zP$sD|r1H51O#^02Mah|UjVh^1*EMg1&#kRGqc)Jnsr2F6%&h!WrCM#xP|=(sIX&CN z@j1C^X`p#>BiFGe&I7v{?9iw?kX+-2|YZzlZ7^yuBr@bUhP z%wqS-(To3ldDXSXBA3@GPn_#acPWz>cr;*!Q7oG%PaV3tw#@A|SLkvRU~8SXoWj+& zddteJ=7faeC2ybo$gfuTeO&T`w?$Ax_=C~O$+K2hl+#S8^+QjRLYM8ZGw$3rkBy-X z6vIfR35h8wX>?B%0nLnkjE1V^WI?d9ZV+N~<$(mJDJz9zfu10=a9NVj9pUo@ zx)b9wfzTb|YZ$Ku5yeQCjojER(A&asnsk*F5@NMzh}>z^KqWsQKuBdJA5Kal@e^)* zTWL1qn@S1`)oPWhbkC@rq6?hG#m;><*gS5#1LJ~;UzBEMs?yz_ihbB<;s)TOa`EDF zl}hD@ZmQx{4!6f{XBg+Tw-jJ1&sOZQPkL1jM`?L_y2k%YFwX$e$Ix$?TBZhKkqbn8 z)GWqek;BF^0?Q2rIgqF-8ZgU-9GLBWr|L-+9VDj?Vsm0-GGu3|(^C{u4&~uI2~o&^ ztSVh4iJl|;egShp+UphM4iGgO$*xUZRAn?h0U()-6;Be2s}k~e1oHB%d4W3(MkWAT zaA3g#3>D>IYU0N#;S-uwJVzM~6_rNgt=0K?L^@v%&rnOz6A*>v4$3h|h*_YwgeD{> z)K-F;pcL++qAZr3Q7aUl;(~&#Z5ay19a=@QMzm zEuuN82GdfI6uO)kkrY^d5c~p}`l*U)s-rKEjFH)xqfJUgDy(9OB)N5PL{Wgz@1(sc zKA)LOP0_&5X83)nDX^LI)TXhTfYo9vXl|aFa=UG|#)j}W*I%_4NJm|}ch41Hg>Pg2 zT2wSXe)sP;oK0A>ZtX*uTDPwKci~Op4bT1Im6sqGI{Vm@M20?$yh^{ueg!f5g$LpH ze_BN(Qc2Z$ zxqetwiaPr4cUU|$SmS>zb>k7>_r{Y_&vT$snuhdtvqON(uVb0`|jIOm?-o5&q_9B`c6%iYig;dI7L;d$xT(KgSE$5EG4r`x0fca z>%JS8Z&V~$ysKwsW-nDHj^-3PyiT2tWx#)6=VZLDx&+PB=z7dtAbITqsIph{>sBruG?dvcfy{8R-T;fSZiWU|7a#bh>1WLh|N3$7qD zUZj#1b0LZN&xP2cX=hdeJ2_~X-w}RKD($#Bm+G(0vtk=8LU|$kbcThVTi@U;q%aS< z1UDrsE6WGd(to?Sch`hq0u$(0vR;$uEj?l5V*azphGZW6)47)b7_wsGq z54mpb@b#{|UaPIBYDh_a?WtF&UE>DADS62^aR!`&&<}&s(uoN6{BP>5)aqH3;@TE)%Z&U{Anrlf1QRM=n0eknLfswiSG7{K0_M2|jh50O1JCdVL1B|uQ3DKUNS zmCsC1!%eBAEB2I?O?TwyoxSD#_wfc-*I6z%#pLI2OiXHZxiA&>$=vSim!H{&D=N;o zt-6xkJp9J%XKV<+{^IE9^jSwQ8XWKywYLRd9bOscEc#@#xq7(J$xxQO-nzN&9`dJwPKTo)d?5?;7VKgi4GI>{{6tcGVml&3)b7>aSLEaQ@`OOm)-=3uVQCV0oMf_6 zr7C?hzVgn0V$=24bCR9g!{5o}$2M&$I~y-zJ)T*q?8cU6FeaN8T{uxvD#!49aab9- zks4yo14|=?wt^=#1xe_~P%2!m4Ov6p0{BU_hv>&3Lw;NCo$$@nHs*ZL?C^a$`f<#` z&jvb#whz&di;Y7L(iWujYjin%1JeUinjDZ569yz=Z5{>z1%?yIb^(9nKU4hMRZ}((vnAv0%!{Pxe+i9Rc*I;sL5tT8^f+)f148wY{ z(7z9F^OTj@vOwjg8n7~aw2-3m&2G0HpKDO2QPelM-HEZ6H<@`p=d&+B898heZNgq4 z8DCFidTZqOjEsE&WO^xT4$ zym|TgdHJ~vokr0~Ny@bB5`{#YUA)Nc&eFHFPt^PTaFnC4^h0TaEJ>b}B+uKt>8X2q zdl~RlQ>Z!83gLwF;YR5u)ESsJGnGI~PzD5CDBv=X21&qBz%UKF1zN-JMuJ~e0vosl zk0BPk;C*005Yn@B*Sgt(VAuS%mg-7Jfz2l+5@8{yMxdiXA{dPz5o8A<8b;WOVje-E zg}@1c7imPh2nRIbU{4e(xDY>(N*Q@Y%Gro3q^0`Zwc#0K_sqLbb zSM9mc<$ilQJa+DFNae!rZzf#39xw^*f0r(j_3JpeHU}xEX!;NV@G6nQ{qVZvaBWiz;1`PrRJw|+P zvI6O_j`;qt0ZyywvBQ*7PizICEO9sn5@82)86-jmBQ-a%btp~KDfX@@4+e?NF)by2>JHz;7oXuvb!i>n?0zjR*ztFSS=C@oOyIa zv%{ZN>7z0Z*LwT-rOU2KEPkQ{!jy2al`l__!lmha%-4JK^LHrJ`1jpK=k9#%nW{8g zd_%8Ksg$K`+B!XNK|&A9aT^EEai~;sxcB>&(O7o;FV%UVEi>!u4qkEYxr2!bfBj-t zM@L$!lsVa~@EI%?Pe%cej>flwosL{!Grqv3z&&?WAT6fIz&5m+H7Y84J|hc4R9UcL zbE%-E*ys`?hzV#wD!S|Gf<-l6r_1JMX>)${!7u*x@_BgARXFqYyUwWaaZ;_eI^XSG zuyp@q{TaBcdD$rQLYg&~VXdx3c7s*7P;Ux<^}F!p;m00+LMo{-IrDuj9=BYYo?hsc zvP;f={qWi2z6v6b7e`)XuVX)e+x#ZZ48CJ3{E1_YHU$dkmXWL`639)k#_r!09BZ@U;Pk~QIV;X~oAiHYjW5^4j+EWOsg zYT%c5XM*B=N?&sPi%M9Na4e^h;n0fc@*$azvvKWefMnWu@p2*wG z`|L;LI}rgVi9~`9fC~-~{T=~LExIKI)NnsA0m1|p7lepM(j>AR;$MNCO;{ElwTB$< zg-wuEnxp4cR%tSmQxzOtSq__1RTX9n)>8&!RZ>zC^;M_GLs1^jg1Ji-lzUOJo4hQU zdshly8JLOJsS?@45FX)q|MBlD%mgXS=LVWAW*Waq>G^6Q2cjVqT0kMdH4CucL+oL& z;LHI7(P*%#6DKPZgnfwtYy=t7H@Yk)3n$AyjR)Yi1UpTD*KdmDU^6lrZZ>1Mm~O19 zwL7R(d}6T(`jW6x3SVJxb$JBf7tFOLCZws#*x&KKj(Sr!lrd=mfx^=U$7u4 zDK*7gvh2z5pTqCmb|b#-77)b1o3H9vU2dsN8rGgsT1FEV;v(JP=6_3O$Bym1bc5f^ za6MNv=v*#uX>o~rrK9Nc55up8A9?;&sqDVH@$QPeJO;j8Vlp>1S*@7f(zcvP;zZ> z^yw`=y;+n$@lpu5Cy6~1bpjG8B)2I<*N@(?-CgKxzfiYkzRT@&&ZBmB6c%FaaJ0Uo zdpee#o9SR5G1NEP@=w+n4E3$~`DRl?Q=XN6OiTeXXXN*61$z|MJH#P~#Ob07WXow_ z!b+!!d0au_5&x+{HC*-y$b6PYa9$Biz%M0SZ%G9cix^&7xaM^4XRUjBiyJwFjr@XOlT>{?GQCNhr)7diDzleQ8U)yZ8p1in9o8>97 zRGHz%kHJv!(##65ab?TT{B4?&o-i8f8!Q&UayarV^Cozf^U!bFLf{d3(3GWs8(p|v zE9M}w-zTDI~s!XU6?^2D(D{! zUuz<_qy+!Fflo_;Xdy&$qNi#Q&$y9AoT<^R8niD_uOPjc2ro{JDpS6u-sXgF*7ysW z%iMW1XOkt){h3mNa1?n;JB?v!5_Z_xuW&|2-tm2&Y`7Gq)j9Ezu+|L0Po1gOCzs*Z zD2J=ZsyETBb?#48iajfftjH?RqvLD@cH~O&E=nrsSwIA1)K4r#VKqV-rp`OPtS^v6 zp%ew+ltF2T;iw^70}%xYD=fR{rr~*umIutBrfTMP=qab8RzL_FOqKQ|oR?ow4f<2T z?17*Y)*DKWAFj3vanXv%)7)3=cVOR?J?O|_L5&iVFd8BR(=V}u5Va7pQN{_;*| zS;lwICwlEojn*PX_&CJmYKmOG3{}GIHy0@xt7|EB-<-C)5b)+Lfz(vywL59bQrLO& zH9F|Z)^HMILEyyMiv#X#l~ktF+Npoc^jIx6TE=17{8AN_ldHEEl$|A1(_zneerUeDpoE?qQJ^%)Q!$%UXIFc*BzZ_@ACDXht` z9)Hj!NMg2=e(hwsmBv}xBDTSinVFGg28C1&zmuQKehlCB%q6icvK&u^u!IFf#ka+u zsu1=>h;8NOXjC!@O2)~;+5#ILbdjK#Qv5zMqT%ESuDUcOgtp8k`mWzCUQDxZO+53; zy1`HPg@@t)8Nhp9!7K2Rw?4<$TpxZoyoLFTytnT_`1NBOr}}@1YhK-%5D&8FB+v^|O2Sy#u$@5zxJ^X3O5x2!@d`MJ zd?K9v$u@CzwS|cB`jc%=8;2OMKiTHAaflK7lWpST{B(6}2%^IvB%P~+@TMi#EG+sQ zoFiO=j31eVofoz-@<)~zIWQ@G#4!SArK9BfreImsI0~uc1lfmW_cYzrk+p61S65!3 z`tH)My2XqCDX(QeFv9&!CXi3|Tw4u%1u`?Oc+nrR;*7I~k`h%+_-ktG(uqkmzD}Ti zccg{88m!t}I5#>21x^$Ad(=`2R!=)@Yd8pu1q`Epb5LWYepg{`j+uCP;P+%i|7CQ; z5{|bJvPx4z=n8fn5_JO%1lOk~E=%Ch9Sk44_Ap-i@HGc)c5t!ibu^WpZraMSCo#VL zuJCQ)5$d^R6#e|>OGYc?Nd?K8<(B+I=dSwqEq{BS`7C@myz`S={@$>cczt9hz13>A z7&gHD2OWHCwfOd5GHiI`(!1aIY;tp>&FA+k(>vL9gPU>IUw6a*`9b0YPcUz@--5m2 zMo&KgB~&~hl|^m@!X~$cSWzelx?9}sNQ^~XSwGi8jMos6{kaz67>fVULWn;9hwg&> zq~_-p73R6~T_%GzL!%P>l$b~j{DHXOsE>gJ48aoTPFF*)J;FO@R;uBm&e;nDlXS~4@sZF`2pk*C{PYh27~?S=S~uUqpN#yt>zO6sQqVZ+VEX}Nr^0V3ge zqh`yJVEFf$gdfgA!Qgjnd0%7`)afX`&|iU(rBgmn8)-6V;fA@znPVgujyxgK2U zb!`p@m5W!-gO~^|ajKsQnxa^HlcjV9PCG6ke zcL2)TLKcwORAP+-P@t~KW+L1tP>GsB0QOWlY=i{`7GWa<;e#!NaEva7OX|c(7p_M` zF*s4knTnV=Rts~Hg-Vcg2cNiV%e9(I(^9D?lOXAV^@aS^VLW@XEivjq#rzg)fDF6s)L#MGQaI z5%~jafITvYMB!ntgFvO=w9CsU&UMy977#HR$)Q35)DUwj5|hwSBe<||ssi^d+^5#M z4d#^a^Whg#%@$`Z7?xSMuY8R)DT%+2kwzSxHrsjfLV8_MmbRdvv8Ch0zkh9p*_$Je zO550fz;_KafpkxH8jV`O4io{%vy!KLG?RSP>i`BM7#5UqEOHh8BAtMHSde zE!J$@*?y@i%VjjBg#Q+PPXYG^y=Jol@_$PeO~zH@Xhe!!1_iWI~%&R)Jm;N!M?3YQshgixy{rC&J?*W z%TQ5z^5gJxzjgB&*`=(c%%uk!DM04P?<4C`RqTuo6oTVBF<{^uAmqYMd>#F$oZQVJ zS93hVIwFEeE?5bRosFIwS+Ej_kKbsS zdFc)cWx^H4BpJ%3as>;KC5uJWJmh-}BtixS!gm@7U{r1RP#xTelVdng555EOG4K+N zjiv8w$j>(z*w3g!XUo4|Y;(fl%VZ3|-67C0>=|abVUq`6D#EBeay{eXf)KUi4yHc$2&?=m6@4vA(lPplFP|>wc+K| z?Qq{HhTjiDfL{1%45U#eC4dE-i**D)WsKs&U4M>CC(Z^nadgpy>>pR^jW%2T&h(XI za7{2juTF&>^Tj2jbvT{=Z zjb%SKSRc^B(Hu@Ix7DHbEiKBizpB!xEoSt)lG4uoIP<>u-Q*+mRvXV?!uaME-E z$7v0E9*k0VHLR2a;d9tUkzL?Z;{~YT35-nKUU zHNj{F(?gAO=fQ8xq>;W4LZ`KG$w?!$Rth#CTPL2(qG%C|6tjmU5xkd|S3t7Qlt&IGRX=GYJmpjn9`)zsYG>+be zgF`Gp8-$5Tgi0gcmMQmE0$BsqmNn=a4ItuJ$gkAx$Cpz-v~ z$>qCy?RHA`OKU?%i-m8|Hs<=&nxq7?q3Hi`_8#zYR9E}(+-Y0XR$6V*_TE>0S6y03 zmSowM!KxiQl2!swvfB+681k(PYcL;gY2qb}!UU?z5wfjBi z&a5mKAnzCbVx*a~cW3TB_uNyT6Kh@aI7>dRA{G8o(Mj+I>`I1d* z=UOVjFTv8w(g$)(ND4vt%^2&PAQN3&hlhnG%|X~UC}G;d)3Wm|R(`6?<527Bhr?U(-ZqAl$D3xC0kCvI%?H#N5@$_dZP z6RS@+ZS`b*Y-CBZ9U5&gJemrdYkqLkKi<9$QG&Ir7Urs}eUdbc*^Og%w_$d@(1->L zrc|O9S!~#@y4t2qG7<^6e?e2*4!p+Iwm8C1WyJ{3Pu^8x7+M1SzwB})?L&W85J=}F z#p1!_n3|PNNdCJNWgHTuYoNenmam8&%%&o3G?~Nyq!<#jhUY7^uEaFI6Azp}N z(#WEK`AveKHWG5zM3LKoFu0?QI6Ej;v>&RrUdKZ5WSJc1SO8MW4JtG`E7h&o9ZFuh zrY{r{)iW+C7XNeU7WVZo{EWG7Xs)VqReL-EuiF#t{Qfx`M=Pf$E<9o?Wi1B1><^}F zX3p)WT~J;9+*e*I30IsVidSUv`7Uo2!uWOva+TTQt`0W7rP&pq+e30ET6$LcqdEwT zsu68D9LRp_;I1tRK@3Sk)|XZ!Rygb(TAG3>+?0q!U~N!@19HA?zgv;cwp@FTJj}FD z@|tUw?|51tGO|!zm>fPEFtCxv*2W~Oe18G5h+5kw-ejJJmiA?1t*sRmk?3Hy@cr$l zR-8VT$x2uBM_CY!1n_tUwMN80q-AS7MGNB< z?bcA3*C83oSxH1nbo4K=B+vLGX&{!A3PUB*D4BiP+zl)JkqT6bo^-<2VYgTMn#k&k z_x9$9})~w>z$n8zf7|^3A=iHMX=R5LlE8IBovQ`g2cZ zb<*-xi2$wndibo5ROchsePqFm$dO!)Of1S+2|<)QC=|qn9xpT_xuQA!3hsmNfHC0p zlO*n&M_ecxZgAGtz#EGiIc{2mrT23JmL5V;BCmZbSe`rd;+o84Ra9+?a9srXz>Sh~ z<>ONg5hf>MeMWNuDQ&WN?520mzs$t4X>~rEk&`Tu8Wt}7>`qy)#as^*zaH`#)N+ssW#P8x>#`uCd$N8Tv{ep>9*;+#phsO$Jhcu z%2U?XR;59wY0xvUmO+Zmg%ryQ;X)wkt)c2lu5!?9@hRf9I9ZmZGY;Cu%)1YWWxb1^ zd5p&|vE!jb6OW((2MP|oeIHx~qT!3ok?6~J*I4{WR;maVf5L>EqGtVxWTN0HUR)0c zwmJ_nt-d{X@@Rb`J^Vix7LVz&TB2r)KNyL4v+T?7HZ`}mgb{%AxQe$(br4^)@)wrg zVBf<#)C#VGgUsav9({iq(afXsRbp9M9(Y?r17+EX2S75Gc3iPUe2@!B`i4>T6-~;c zz_0s!p<>>sD5_=V0^)VSWyE*(Pf&fhx)wPeYUhL^LGRG~kz^{nX5S-fwswZ1;5+mt z=gtXuKYA5PFm=E>9UB?$>CC2sK5H#_ae_^lxIU_qx=lPtXGK4fz+_@ax}viqm{Pw8 z9xY$wl8W|qqxg1rI3n7SVB1xQr^H$p!bR?StHok8iWQifLPf<8BvKV)zV`OTZW{_J zj7Fx0gMH?T{!ow^ey|)U&f>lTDR`4YqzNxuoTVL?dACr zofjG9&dy!M&kSd1rfA>4MAOlo3;Ic;Ybw1c{Tn?QYK7pTH7oo~;{u<14fp%?_unY{ z^@IKf2O{0r8r*8j!-S}(LT2vT$9Wdzb|uMsEiF|XT-KPC*!b|;#Y01EU1#yV^G`hI z4dy%JIL0;}`=^p11;nADn<^^5K0Y)wbosUCj7{AC&fhNnA`@>u@9(Vs+H2t|7KO3t zAH&G#<@)HhLS;Nw1C0p^o=j5OiM2!vTll(U;W$#-v8IyLjR@-e2b*xuS-yv53h_An$gyaD7Ykq9f@H`7N-jsLR!;vh+RvU1m}~C5ni;-(`4^C4 zgjIvw*mDo0v~ql1@A4B*Tz0g{Fqb_?8l!RgDd}hEfJOTFx8^@cCPqyKY(VT0S%JSn zmKM1A6=a0XTtTdg2)z&nY^^pg24rDK6kpCysNm^tZrIQq1;N6Y79_yZvEMmy7(&n- z?lwNC<*HyX5;$HD9ekdIH-X~QN(dY`a~tUZfZ_w`sm)+G0781JkK`vZ2PCGxLQrlS5eC(n$l9_W2RAvw^{aCtJZiUsF(==F%wzk+v>!8{lWRyNi zxu8(=kl@exn;w!M4g4{&YK^kCM%qQbjGXT^Le0F3$M$;Kl966TSva0M{V zzH!@%ZBduYXcDU<$&*%gZE0+F*c;r-m%M)6_9dBwGxVEH`F>kRZB6gGv4u>v%910x zVqR<3Y-4QR@=Gs1yQ?{7mW)PKQNqzwC3;}g)O2^`I@?<-j1ygF9>4KwU$w<*&4qlb znKEUWkik0NjZ-~I5h&vG4t~P2H7M+aVMy#R!6ck1=2XZqh92;hMwc*T=(zX#g@ z`X8MX%FOnMBMke2i%i<~@Z@Wbauqf8To(r4Nt2yWa~;?b{e@VTRf+!W*w%co!pfwm zzt3bI@P;ID-I}*g+-69J7Bo0B(j9ppKyU-iMPqZz+-gVK70B&ikK_U#ruaiWMcZ#q z-jVC~P&H^n>2>MPa+44gY75m~t#SaK4DMXg97`nBc~UbZKNnbB!t(@$W0CXAkWK2h zcC_~NXFKXx5O};+d#tamEue_6z1+~7ldW~3a5&O9UD=+9M4`d{yD<_AglkurGQZZE`6PFy&R}`31A=|5<-?1Jj&M2YmMWAP<|;^vz^X zU^{ZR5k-A@mWBQzdF|}N)T4%cPITGU)~_tCY)VY@x?DhExUwph9vjazIW8NiY|bw3 z&$L>hdoimm?8zUO`Rw9K>HWs97G?I~+|H&7V{3DtWSV9}i4;_Ac1`i*u}mt_*eMAp zxAFKZDGmcng?{vjh=DvbH8%cJgS3L0#1@$|;k~(!~!Db1)m?p=2hMM{Ycm8*<@vG8|XU zR=dB5!j-HlH7aT#lL@ssi~lPA!`T)}CuPYK9UiEXi;ow78|i9FxgC%_HBJvp7Juq- z)-bW&;Yv04gy1F_Ze5%R%2GWOYaE{9k6Dk$UV{@5-p)PKkI0+QWh?*>Ge-@8j}_BR z4j5u~dM{#ol9%*WU@W<^ueCi`Dn1==M-`N_PQ_7v-SbY2Zf_s!>Pm`pyq0QNsjs(n zP5()Bch+0oRSoso=G=5=an4|8GU%?Zbwwu?acqEFGZV;sh{_gl_DqaGj|}i5i$?`` z<`7k>@rc3x>y*bg6C>!LjYw4~Lp5b{Q2)6c`tPQxB@nlDRjfmt?Cs8Gd>(r}KTN5b5Ob))FoC#$YlXX0Vle}pVMuy| zevyYmJr9pjn;nnej?e+c34u#+j|zuR;B-kmEkG(8Dt6XAxuB^Dg`3Szpw>v@&XXAc zmQu2^ysJ}jxf99uC)ceLB_HZT>a5n0<;%wE>Z~S{Sp4nl+jk%cF${pBaA-B6v99A! z-FX7rbxbU32nNOthK$!+S-E4!>v$8^S-e*4S09DmJyThKVAVTBF^hcys_PqFHV9_& zxFISoZy>47J#RqFh&9$ZBV3>5$(V?pIuL^ZE0PXxC*i9?bdc8uv*ifqAA@URAb^l@bjSABnH$q?t+S3UUp9*T z50i?xOcvOU5)~CU2ao(r7pc&z>PrI0=Di6H$sNd%@TP$u@VC`d?VCJx`w8*7T1!huQ z@ZzyFdFklK3(18i#%{JtbP#~8uvaK9ZG(`pGxbw(-h!br&YPlsBF@{MCxG)NhjpB{ zy}u~qyrGloF7+k!5ttORh1B?9J{GmrppF}RL)+{txdlOrxUi_g+}C5CteE5;BbCg8 z9Ds+cw3YF8SRJ(mztC3K+{1L#k(6qLz@Z;5ukdyTdU+e*6HtDPHDmu$q|V0NMEJoT z#HQHlRmZlrm{AjDuCMQK`n-w6LSI;IUYYCc1bl&Fx5v_-P2|C$et$0^#)!Mm*}nOl z2Pm>Af38$~z~4J^;xW5A_CCg1n&&O5ZN@8Q{596z#;jSEWt+XFu0p)ZUWltoE*y)6 zg8pz%tqOb!3RY}n~Hnm&+K^D+m_8mTyx=s{stgHkrceAvD8NzF6QjJ-X;DiOs*yl`7h zUC+JtD!VKLBGB&f_`Cs2?Qr_!8&CM`v!6e{TJ;BdJ7O`jVl<-QEP2M(^W>YSk1L)sYt2aPrE>dy`3n>hb179&crpl#<2tp!tjoPhAX8MDG9+SJhnP zils*=hUNa68f(3|LawsevI{TyzP0LwH?hlFgp1|7m1Tkt;$T5xe8ZY$5!Ae^5SI&w zdNVR=5wQlC_=`}uU;uBD*ucJH#H}K1WF{_R!sbnYfIoWms=cG6y~f+jNFlLBeW*upK4wbtPcbV4`b##XvwfgwLf`O6S;3FlAl>H1I9s=2eL@q z9B6P=o8@|o-R{P-vVhG|U16zlHF%0Z>X$ONRGAyp%HUPOni_*4;0NeTBp@qa_66ec zg%h_00b3Xk1`LLpn&7Q5Sxnv!=$+=~d`J53!SM=sDZiS|cS!44ZJpQdG^qZD`U(@1 zt7}|#uixEJUCo}s{igdHT%+^C;ozEL{BX07oLBm}-bluZ!XCG+?#` zwpm3Mrz8Sg4{8CdI0TiZ;M}2HO!A=aC&Dd=d+Zqw2>0I%1B1OX5=7;Ftj-=aap*;y zTR7NhBVoVP+hQb3urzH{AHXqva{O$>Y8Y~wE(&&|O+=JjBR#3Hsu~$G9m6mP#kS1L zug2Q2DCwc=!lCZYfd5|Lg&?R@{kPY)SE$K!VLn^fP*nwakZ~2iUi^APHmy9aFkN1Q6p;+8d%QkzB%4V$G*nh(rhg>%r71%} zWRs=)#BTLDXdYoO7?Ear5`#-sX|AOH2sc6`YoCdX{?j^S6C zc|l)gWx#X#(km9uU9d9haB`w^p4fNhS#_1tlQvt;^5G%1qSBnNOHPH0JJRthuQ+dD zuyuZGtKDO(nln~wY-orqTi70ge{sc*Zw!p}Ph5W1^_^oa@l>iiXRY+sj*MFk4KC2M zh1wZgwfer}XwDyzPm}(sT*&jlb3A(^^)X0&Zc>;gBy#2E`$?5_*$@lu$`oG&R}Qdi0T#Cr+I(*w;GI zwjdm=HR@R<(1x(8aW1EIp-ezUd|PYs8fz~@)KREPqL8#+&^#mJb9}uK?Ilhy7|4f2 zKW%ONdRaSz6qkPRnYO+*k5pedF*qlVbkmq8;A_2T<3(33omjZ$H(xvhI8>;NWfp%+ zON;T=3r^fJR2UlEvE?kIdg-REgPrm~|BfAJ);x8`9h;6ev&qc7v7;YOVB7YAUM3C?pK{!3Rp)Nq+TYJq>8PXcy6HLQfAHqdEM3^KMLm6J z{=~-1zZwdB@0MFvE+dY)L0TY->c5bKgs#lHlfec>1k#qh!^ffDXx3;mkn&-OV9WSK zE1z$^t*k10_pD3oEzNzc@JAQ}m53BUbq@xIhtkCt&pX$sE?M&Tkt9yPK(;U#HT$Kl zrtzH3UR4o|wx#m*-QCO2+B%WT)mR+a>#qIjH#cl#PK&i>=@FTJqp_}7vLo)fT)0Ml z7KjmX;DN1&KrrCM29yMe2H`s4MR|c_L@z7dawbQSfM!H6DmV-^+0LRcqeloi~E zoh*jP*-#)53IR7mM`ROK>_7oJV43TKs1838y2xD4_kEi;9JRuW+JCZ~@ej^Q$~MR2 zaVP~@=K2anv6#H5uXl2O?~#40bFJ}cgJWi!Vo|{4&^5Fp46_0WqzVD{`=w2 z9RJmew$5-j<6K{?{bVMOnxPB;CaJE7&2m3ybA~@x+VIKzJ^gzq<;-NVHp71fjr}1NnQeyuDzlBvWVRVD zLu#AIY|`t}i|Q3XC(jAZd=;aFkbwon>ft^_7t&?utd$U{0rFrflY*nqr3qEOXEd`2 z+T<)DWQ}p5qYEnT_2W{9Cr{oNhy>jY4p&WGFpx@zBehjb_1M=hKK|rYEB%$u)Y@em z8e9V%z2U(cDU_7Iff#j7wJ+2h@&RhkZijTLFsJ-Zc57Y|=Z>A2X&UO=(vPHZe=t3{ z$>EqB!{ds=k4jg|KDhxJN4L;h=rX|H#bgE5v^;JtAOVyDNG2$8oeIZD$+tIV60uOg z<*e(rc57HEgmN1t?Td~M@)~PcDX>^Z89E1yy`FBLPr9D= z>B1=@?#3q{r4K?K?0S+h;Fr^-n|kA@bVQNWdD73-pJNq)PfDt&mh=ZfA&gSeA9>Wl zD?pyde{q!wQ^@dj{%Mhk9W&MgPE*>c|9FDH`0OdhJ8|}bdUOiFisgl zb3IVIQgG2BMF{VLtWptqLZWy|TT48gmCUH$fdCt^sp`Yn5ri9w zH`0J+bfZl}O%cy)ZqLPD@zq#llyZc_!GKRu{}LC)l%lSpg!AIQSQzL69uGmW!cbyz zs`02L~K^iM#xW4Hi8zoAyesN zNwf$K#e+VUL>q<5XFryNMk#pll`zNza->NY9{4yi5BX5iLubCF$y!@!7P?tCoi3D9 zu19>q7??PfbO5eil>@=V9TIMEEs2wZYdY-GsqLX~<;&GJTfV-bCmyf4eDvy34_Y}u z&>J^YTkCVaWQ)&VyTf)@mCfGjjSdmtMX}msAi9g@SG#T z2>tjH@#1jtnkSyT_8R6jBS{dK6I7`XSJzSYSItn0@NbhN%3qK^@QwQcQ1R|pZ}S$< z9|ADs%ynoLKNO>qMLLORbUh?~0~uWcdrbTW&*-8ZUnmx&o6w^&DJ1yGG*Von*jaF9GTWvO1t*XN7Z$T!m60EL`1%kF-#jy3r<;zF5 zlc=L7?w2l>o>ZTNe$@SNnEMZOQH+~waDSA{Scqc$s>99VDw=>GNwXu@l!-+&K}>2X z#8L&G9D-LD#F%J0b+`Z~F1O#0n3>mTa1?**_Ot;s z)8lPvZD?Ti#Erj}&Xoh|P0*@)h1)fuV8`)@6g0T{s!$+{_Uj>dKNWL1O_V26)5Ou9 z#t)rw^b-zQDN$%fe*p>qv5^&xNXiEr=gs91@C%o2OJ+s~w~ft%X&~C8%NFm5MCZ;I z+Y^Zz)nvtSXQ}ZwxN4BJ$Lg%nhsFzyP?rdF*r+|Baj9xUm#?+!7f-PJRtuVsA+K_P=ay?yC8rLu=pSD^%d`v?^d4_ zW9Zl_2r==9w*;mN?CF$X{HDYnO!1Aw>8>F<U?zmndGLUhj|i%p z%VV ztwFUdn18|?7_w0fs?B5uQX8P!&OS$jYQxH22z;;Wj7zYl;Q(dN4xuYAA|SN>>?K-O z&|C_d8;uKzCQ39r+1rQEoClh#jpq}MmuL#Y?V?2+N3`hUoDZ673?C5<${q}Csc;qh zk^Wsj(rG>mni~wQL=&NLHVaR&`-w(;jNPx(@Mks@iH4q;EfyX|r(h#!9^6ADB#Y$I zGscI34B9IUu;JZ(F#pPKxDc9HP`pA#yux4*)|yfAO@(Q)EUu$i|NesJPovZdn<-c2 zu#_l&FOR8Fl2|(|<*aYlD5)y{u#|_4N&e8oQXVws;fW3$PS1zIb{go%#C5d*#i_O4 z(^6sbL7k*X9Cp2aR_roF50`bCEJ)n z30I4_Wcr(Zgs~%s!*dp(Iz&dJV?@#CEJ)$^KOqW2zb6xN5q2MVxuv*)aL*vgq7WLY zaQZ-0lVMSC4(@ZLD`PM2Qz;(y13DQ$3jTvx#vaxAPoo){q1nmaVc*wj2>X-1N2A$3 zLsJmWVI`fWG@Hf{n4#G$Jk4$*8u0o}It|ANGPZ#Rd`-_IyutSaJx_T*Xf*j5nw`Rr z*(3UQJ#xS}^gP-)h0?o+JP#ko;F+P>T>6lGNq?R%(Kv!sx>Ltrt3?Gup6OY8$hL&G ztFT>|QE1-`U8Q(!G}ymf>#3nydKC=77Pqms2;o|jqj{az;_d`7$Fro zl^&h`HWJBUu_Z^Y4YL6IZ!zCQPdHM5k{*u_46L2Te`Hpb1i!UG<23cq0fmWU4=LbDSz%Z%HJ zCQmd4HlOnqwlLVg#} z9r&GP5`BNvI_$Z&EE-1HqmF12T}psSus@8&4;;P_c?P2m)*5N#xx=9Hut9~T3@GX~ z`jUx2#<{mLD@lzlog?DcJ{_*7SvexRFcwf0*j|;j4ST-dyf_{VW2PGa3m6~l4UQRM z90s3ta6TJi^VpO6-gr{yMU7@)hGr*PVbI2%k1Fi7LI~%<(%lY}X_0Gh}>5oE;AfW!-PN};e671HWJUWdEOReB`r!A`Z;ree0);Ci}M#cM1OUymUrnVZ?P z$*kmfL-K)gMGy`I_%wTh5eb^=Nl)G%Ayyr;uq6!zs;+Y|mJOw42Qy@o z1HCqv=&NOgmh7AB)>p~t_)%9!3iF$nFS~SA_ee!$htJdW?_j0TQIi^8cixVCYwz6d zIlZYhK8IqkIVacMyl=o{B-BpX7af%zfsJC6sx}<^lLadmoqp+;i+{P|Gl{s_(9}6^ zQLcRp|gKjMD*{f_fYH zZFmojQ;?cT8)pwTV;J0T!~Ioi1Ks~$(h!#Z;dlD?{BGuZT0zsJ%p;l)XpGI)r-(*; ztn}0jO*3e^4E03wFB)et+$vn_Cj$fD<1T&I5I}uA?!QI0@tF8)ZW#|0H_KKzhU+7+ zJD~IZKB?(^N$qpI5?DP0?>MH-!;%m5=lfvhyEPixn?ytNu(EUj6~14ixp!uqg4ChS zL&vP|QC7^{-)wtbf5+F$-&6VvDjq*nj|UAw3t&w?_daN_b4%}+X`oxag!~d(6OCr) zEwmy;GqY}`lR)#4dYevzGqm_BPHt|k)2h(Cl)eO-HjqJ!>ICjNof2`rZ`X>NEfFDQu@0%Lfv zvm?l%9<1E6iv2?yhlD=gb{$Ap(Ei9{cUjR@45zWCK7q=>_aP1p+H=}A#Lb`EC9$^7 z=djO9HZ-8-s6G^mCR#3xhKl!ZnD6s__O#1Ccj5K%%&#q$&Jmy2XNyDCazH}<+mDKhNKR+iTgG;E+uTQ1ZVj- zK{p}GVX)9Ygg{yZNl*yBD2N6tGE$=OX=FG6UKdGGl;I%4AtO;*+Whg}u58-po~0d^ zb1!(S0c1o|=vH&mm0ffcC!`-TNhyKhN}G z7Rk@(73_6|YwPN21I~}XB^jf!epJ#%!b3yhQ1K?4x4|9rh3l%AvB4d$uD8@hTrLyF z62ENoI^8jU`BqK6rB=U%xoRjqBRBKP#xSb(^}q>gI~m+!RIh>@cRiV$gQ_0(4zJj@ zSnJwa(n+ryjT^!^ZyjlerZ!<8l!1qse!S{h6E?=d1&_a%8WF~64kmMT`(B9|ZuMMn+=@<;p+mysr9Haj z;*J~8oD7-<^%SDvy8lk$+0wstntu~tg634vc+_ta4eShX_Advt9WD+d;xZd6`f1srWQ729q*WTWsSk@tE^#PF2oGbi zwBkhW;_fE*y=OlG;^T^_@%~y!N!;dr`O;_v*I>6$t$lz6xIKsvqgEgQ(N-5HT?q!q zeqBk|lR(8P2ZKT8L6E4s8@f`3%2q${6-he#yyDwk1L$8>f&8nXpRZppvrU`dQ!=ch zW5pgeip-_VD2uISC!Y9L@sdk`gFm&gBc1kmrf*UUgO{1i8#+5xoCmxrgr5gACz!Wa z4?GQM?s-1|g9#ELO!J0j=jX9oG`YcU(btFT6$)ZOnqI-C{_#DHqV&D;{A=SF$q%EA zvk)gLKMkRy^3xFCrRgW_Gvh40<3oL%5BHB#+@U*E;M66PtrrqjHp({Ma|<3iAoUx?24m${FVbY{*qcpk!S`AFRfnh~9*zw|GRLp<}Z z1I9UjW}Jd>3HO77X2uVSab&xCw>}Q|_is6ke{&cF-@~89aNNuo7S^KPp?!~fhyFbr zLq@rJ=2V!zP8#GJ0=%r}BIAan$AIXJL~c?$zIDFO9-a8;-ee zOoN6>cMKTk74{0K$R2-1|1RLfDErh!pco|@ahbHGbgxEJx>utq`;L$&bQK1c2wO(6 zaYTbARD>K|F!gqaZ2(9t>lO&-;N(C&Y!h}HPbTj~6iEl1{xOgUm$AaQ-JE;-Vwop z#=_w)G@@kep8peS4S0k571bivBF@)hN_bhb|F9Ni`;Y6PN)u?fKFg*)`mw$eKb~1r z%|EHmjI&TUjyn)Vjg!tw5n#qY}FGVwDXhbaST!5(hv)W+zXJw|1D47O0X^k9D(A7i81r;Q<~Y$2kkBxCva8`hOSi#c74 zs4CyLs_qx&pN%V*>)%hPCvVBzV#1tqi;2c5uBW~M`Z%zA(h*J0MEEmmW2kqQzh7K_ zg7*C!W8X+}E~UT!TcV`DzoflC;m{~G#;u@1H!H}?g77}m&vK>(VF+RA74>hx)vJZ| zuvUu)!~Q~o6?XL|bp4S;RXWzd6s3m;hdCtRClL@fAfbeyjbCeHCK^UvlfJzPC4|AN zN{V5a(D`^t^bF7!Oovax_gBZ}H#N4lPVKpUs--2989O<~g4BNE)A9c01d8iMB4OYk zjQ~J|-SXeV{{z?P9v#c44$^N&!Q90ZLlC-i8Ow9!@=_RRGtp^R+$)G7dSNgR^Q~I^e$2{ht zlK!BLGgbN(yHX$LN`0K&u#=xq8fV6tDn4EMfBHE8Z}vDwX=a>-u;Xbz(pjtT$I>D^ zkE)VBqdm{U;v*%}Xh_C!jfUQ<_!RYo(8p2PlHXAL9x--`-$O@xv-rFiQr^Zn3q&NG z0UQwt@3y4)BJ8hP8jB+%k^7}-_Ols|C_fuy#r5jd+V`qg6AipxSKxUcmz~(F32mnW zsE+UlbP$G_zmQ|K@)49*!ckk^UX(YXfn_`sL)Vj7Y-~3!s>$w-(HT)%w!Zt3ZR-%g0L1+11<5Rz~+u$}7m zzomrNC6Fh4miMeMQiLnRX$!)y4~}q^zB7F{ycs(LT3J;`D2OtCpQpD!mSOVEti{*YoReK}Dpc1ximx#-W0K=&j1_4M6gR>T zo|G?T4GpP%P7Qz~(9GmZi{oiam4`|!6OFxocEdaIRgDR!tW;Uu#ar06CSVX@4tXyJ zBWZ&KLPA>bk?akfi{H?>2{=^ZGsdriW>TXOsztv>Bl>lk{$d~XgwV&qeEoA;=ksaK zZ}eSriXGyud``7-PA|!a>;}EJMEQBdWz19>)khlL|2)zXm9i7~IN~zlhoyUTntRI6 zqxGmLj{`oM5Qp_=9-cMMGH9da_p%5diudU>_wlEue7iRkhf+d3r%{-zS%j3Q1P53d zFz{#!+i<`Y+z=%4CG&hpR=$B&zD|2A0!V~LXEvq~h)Fr%!EN`l=gUfbKzUpTwZr%q zdv(C-3_1EcvUa(c%vYKtbs>K!dGE)y$q+4Q_naSXg0^WlOU38H-OXvc$tWw+Kl#`O z8lq5(RelAtVTC<}j9RQT4jOTngtse~b=vBEp8BXQYOSSmcf9qCTaG+7h-&5mQ8A0p z;rEB;dqGRJF%oKRZK_d=+gp(poXxjCcnC%rtgn&8^44rXQ5#H3@vd|}*9tbi3#Y^( z$YtOqEjl@Z_2tn?@a=O4Mm#{n@wL>OK|_8w;_U&!t;tq5UtSugcsupf(8mGaZaPMz zI0h6nMsY1+bm?Q@{$oMyeo(uwJx8ki9N6}bgS9^WIW8)X0gLMZ2``MmDiYN;$o7T8 z2mDD*rJ9l+Pb%?v5}1k!>!<&rcA@`ARyc__`gk-8-vibM-D~)7Fr)MiAhoy-WdI*q z3&$-(%RU71DAYq8E_ozSzY9@CH>n{UeFGsIXtybIs!)-P2YgO@t%a65iltTKlw+)A zghYUxikw3(*#IVSz``pAsjkjZII7UvYO^~X{abHl-6(;8N39d+w(fna6LUJC1O!AR ztplEo+2)=)K5lLESZ(&6zNThtsM0RZRl<}U9}ITvn z9gRm)u{0rOQfvsj789XaktEW2UVM8_;_22Q@=)^v&HeITLsS$0U_{}9)gEeV@pR2? z2WFyl)XqD;xpXNL4f5Kxzqsl|Lpsq;$`LTuf*pN?vG&EYheAQQYU4-!txk_>wA5r* zu|Q*V%c>nr+_>>c6e2m<>u;Za8b?w)5OZyTj=2^A7xTC{w;@|FZSdi+L2g5mJzusV zHP0{Ekc&X0vZ?0}wITU9T<6ioS;$(r&O_srZ4itjTe!}njkEB{Lwz_}oSse#ZJcH7 z3ykzDiqn_%D;nnlmFzlgoMky4eSs%>e~f0T^h49vmA^oOw;z&H-BDOgBTfHJ1pTtc9Dtn@l~6l46G#yGwBHg-DK@TkWyf0osFmOmPk zGzNAe{4J%|56QQi!n3@pQm^8r|D^Sq{Lz6@gm;}VQoK1wYm7V#;gEPUp>MsY?g9;p z;)n(vkjcU)eUw}Hm@jP{(yFv^3h+0SG@6-Q3>xP{^&x#6XjQKiv^OefQqfzSqz)MR z7?7Ht10x>c;sBw5%{<5H(3JJ>D3xeZ@Yk}^&y}wm<9Od(Cwia42lW&7f|jpJp>cX< zR`z>U;CUWHM_Ihr`+RPmI`I44#a87Ou4U#`dhgSPpO*fqzxO}&@5|tsfXjtvT2A~g zoc@CYo`|m#^#b@Zf2KU;vf!C6#xrR;fB9K}@1@jot%AmZUrgLp)HSLi*QgL}w_=>@ z@jMhkK_4T%!yi0kOgNTOnDw@BkVHHx&_L4p(0knRWkQ3D?tBaHvPQKyP|aZy8#rJ+ zLM7ZRK77**))eRxuR*mp5Wt3~Pv{N=7<=v$8)=9)KZ)hPHC^i5G;a< z!IR&i+a8Qw%#rz#asV~zIA5zc*o%^MB=q)7Ki}&2g#>Y`f zK5FAk3D>jhbUwRIABSVIDJ`H`LHx?59(-Eo=%M{-lrdr-Q~hW#)Mn3*Tfrhzjz0$L!}Z%$*r$@ek&ZOb{QO1A_A07{!?}mI*&+ z{E0CJe`3(!S>!b;$uRAmmetDI7_vS_aRc>gnHggVvy^lnW~uDM>@OZIPsvez4A{xS zop#aIf@)oZe{p1+eeh9Qjm+8CRKMjl_GxxGby7T#aOI0PEB#N~3^&JNB$ z<@j1E#UWN>@gduVcQ_C5&l--J`K*Q2syxS&J*M&;Ps}_2ta63+S&VNH?w5Ha2);$0 z7XTXV8ORsQp8>M(3x~uOv}Yi{1D=7-sDB@11w!8p;vD;xS`Z?Fzu*D36%_~LUka_2 zla3ON5h_<^vot7RS!h38+2RRBq=rcb)>Ex{jSu#$qAs|kc$aaZm8Pu1y^vq9(J-|r|_(z7~aYbaNd%jY9<8joyeXDr2{GsX+ z<_Oz&qc`A8-UAh(p>jn;=?dw}C^f-24hOa=)$@^Mbuzf94jN6z&$s>C>$V63M z06@HPcVX5IY1R$cHIx&X5R8iPBEg`@vSCL#*8t}!m}os*pTb(ngngV-$=spBLDc#m zNG~Bbp-j)Mc>0hD>q(y}WM{|~gS?Bz|0H@WT?5YRjh|Ubz3N+_+Qt{$HM$_Jw>dhpnNy*6)iafara*v2p9NCEf~qeAUz%hqI@xGuT%x1!BcV z{Jxr+wEs9%)a7H5>gqPHEHADVP09$_WJqt~ApUu(CG4=o8*O6K6_VhOW3Twg00VPW3n z3shEkAcN*3A8e`N6`Y;J)q)U59mvt8IP|a$!Z!9dcnK+cjFjqc$~bWU#^tM47sB=8 zOElRj-*HI(G0!7Y&!%yaM;6!e$VkqL$CW5Lis4E;I*MoD8NSA~ka0I?$db=h68CJ_pSh{{+DD2-ad_ehCKyow@Xh^LH_bO zD5HR$27IuG_oa=qILFxL>R7cHCWu1wR<{qpH$K)oT=gBUgv;wmdBTQ(c9w5lLPj>Z|7B8y*mWT?F-6K%=2L z3rc{|ijq7U90$fu@bdiG4Fq0=-Na$9tafp8XX{^`Rh5$D%(S(q?tdWK(t?U@_u&^|_qVA_W6|!;wg(IhF1VC3g)DGI4zFm6>=f z;IB3*io@aYM0&kmRQFos_2N;=L)cXoIA;C~PDgdG{AX?Pz-xB-ROwa#Sj{=dsIthT9mleA2D1YSEY=YhHakfX6`TGlZNabf20Qso%u zJv!8}7C0pEqn9A&+WRH01RxCa9q%c}&6{6i$##6_l;dO8I#n_|`z&?Vs%rFAcbUuz z@VH#I_N=w8Mm)JtTRl9yXz|J|2BpUq2*m5E{3<}m6s5A>D4Wer$zZ6es;;Q63I-D} zjD^q27s)%+93o>&=vjAT`}5ok0krffQ{z4Ud~Rg( zF>6DX>Y8**GAaL}JK#5nvW)J*XD~LhcxwU3HKNDexLOp~<~<%ZxnOHLo~Wxw?yxA_ zCC`y3)gHlycQoz}IVu^)0RsQiq&JE%F15!{Xipq;O}rtQNQ8fvQREb$VzJTx7!p~; zSX`7yBtrV-pwI9AV_24As(iG^Xb8WbMT8j{+SN6le?~Kzu+iW#?7v!rtMP0$tia>3 z_n-38>3#6e6|LX(0x`_cI#Z-V@ndrMH1T zY7maz3p;{;_AL3V(uI&d@b~S#Lc6x-o9bD@GGN0Pgl&6DI$c(tSNaX)hk-3Df5-G( zd42JV+HT#~dGKzgI$-2pxWA!+B~&qqgDLCuvf~kI{SN%RWXsfpu_{ ze42b4zMHyJ_Xy*BxA!MeQGs5m)Vl~8@kIt?K;U_VmHZb0ML)=X64)ZbDQjv(p5QF3 zGNZAKRi>vm==ly*M5g<7c>V*d0CM{rRwb17jUgA1Lzgu*?)%OxP_vgm<_$G`vruq9 zzFGPAJsycR!2g=Li`n~7%d*h`ym5(s*&|Kg} z);@Qtey<-@V^1i*$GsNeEBd{y`aL7=eP8)I?)9+m>Gz;R@$WO0?lD}gt`}nL5(KL0 zNs#4+XuKB@{k6)6cuy^&zp?l|!A|zP^q^gTPi-!cp{UYaU~Vob-6j7{*@wR)7@P_H z2rjHw-WHq!y1_v&(VEfo!pSJbjcZXGE;t#`^bmEST3dVno_K4-x0*V~GcXHm}|`jlcbvCi-HwQ|Jkc)X`L+0IV;^dd89 zUNF}h4Eh6|o&JExj{h%8%jj)+ehTtIRLW1m-y4xLM41XIGzj7zwe(%(2DJ|FURS8` z*Nc>nhFg;vW^|;9QFIGaw+*$(EY=Ly39VlKY2(rWAUhSbm9;d6J3FG;+Ueh0MX9bP zHlFE3(YqE{nDDmHwhEMcxPDeCC8B=08YfhdwM67EHrJ<-Tq#7=$8ls9=JT z$7DYNY0APe*fAO%0DTIzNQG}s#XSv3g%9Q1Xhl1KY)4y#yd)gZjsZcOLv&#_sG{KD z`+kJTho!&FZ)p*wrl!e#ra1s&^P`C@dbVZeiw`bsYeM_z<`w&T4?}qJ05ZQq!J)Yc z05OO!0|Rmx{2dLC4j~QZN4P2Sn^4vB4X#E{Ttu5~%_p9VG|4_A%DfJb%w+BdL_~`8l!J-i-rMKqx1Z zz2cZSQT{77Ag&Q}@z~r^;6Ns5#XErGpXV#y%HJo372cuz2_5E#c4JJgFVZ4Ys99PA ztMQ<KbU9kh-}Fvzv!fiet_Nn}6bKVFNZkk*MIj*gH0a_w9| znM;}M{AqNl?yExM;3}Y_udgO<&n;oL+^nOW(+6dW1_tq_gEm*e>Z#g z_~Vb=^s}qW7pC7CjD-`4(KFva;rPv)f62BFvgeO$Zfb2i(Nz4~*5>B+wiACG?d|pX zVSsiflP<@(=f3sq&Xb)0G^D>1kv_o2n>@SD`_&J&Z+H8|Us&7PKeM^BtM09z)i*XS z*wWYMAU@LjYGeMoIUfy_-cv3^<#e~OVg7>zXk}_kI)Iaf^T}QQ9a9NUAO-iUP*(&` z4T%lfF4`xmNQkV}?r3{RClS{Y&PN)1h^jmrgT!iduwh=brjT^1f~7D$)(ExIYLsx| z)!V3~lV>@QmyHs~skD>z#0L99VY$ZXKH~8w0D^#4fN)rdW@bO{Dm4)7?vCR4ytrds zofwG@jRFhHa&dd3K{d(BYb~;r&Wsh`yY-t(9}Yh7;6Q>9uo468n8deVW^Wae2}uga zdd;Tdt4}X#5RVy2r&Gz%>6^nxFWbCg_awHB1A57=&`Sn{CE7&TQE&y54ry`-rU`3M zsi(_O&#W8Z&lUUcON8}@g!#@qrOczFc?}>_`VG)Fl-7QU>ltO7b<7FgoKkye`;jC? zV^E;Z0C%0BGesoPQ=fY%V#1!&h!Q19;N0Z){4YZ(?5`&LDvU z#aQoeO0RFpyz+(O&x*gi{SS+m_xjJ>Hzy7BU)(#Q!t8OUhmYC&hI5m_ zE-CF{H;_LKag-ZKH7oB~gBvvESW6STUZ=TUqd|v*XXFXx=VA<5p%lZ|(C{BnASTnA)a2gI|iEdD_Hhl;EqMD6$(Y+Q@^jAIDgNA9IqJ4=h) zQ2dpqMQS7PlTHqmOoXMkG?@=0Dhs z-BF7jmB3j7m2R!RL+Bc`yxG^#4GieUeNE`C74&muQ-|XRusipN>Ci{~cWjk%)8|(3 zL7dcyyx#QrD7)S6bh;XxCIe7nq_Cs5RuWC7ieRk;wyrl21pHC)&f@e7l6cb2y_bD^ zMJ6kn?nMvidG7E~Dm^F?u?Eyg;1s>xusJHw(B?>Q?TIC=c!&uk5< zuKLU*>XkgcHdfhG-~2`N0Xloh=G%^&KR34ZvgDEL?%wl{zMxy}4Ya1lYMo--US$h3 zc|&HULQ)>MYE!2uE*0O}oc5dPWOWuFk?Z9oa`@0cDrhxHl&vqEk|pI3>AUm}NIoqG z*5IB+uOIFFpcf_)cN|*d0d0^KBnaPBYHlHw7OPb@TFaQto*3`was27ej-I64V1je6 zDL<_m>x<8%T!`d38&a&@Q6=ulH+j$j++uTdPd_S-cQ(|~8l{k<@o(q}R2u;N)jWij zlfd8>V5Q(d5_q1Lyat*cR~W>#SicxG$A+$#2>P|Qjw%*RuX4n~aBK)bHsXxKd*SUU z-lCO^#$(X~6b3376$h7QGcsGSYHFf?5X~N6tn_+%k38z3?H99c7rn6OwCe!BFl985AqtGZJZeL+Wd$xJ)n(>HYW}ty&OUFlOMGmE=_;O0jCl?Y7l-AJN%k3s$;qaaV&RHMm;O z+Wqn|NA}AmlhJ4k`ui%4g^`n(``M(+DN5+`(z<%!rh>CU6usWjd#jDflz4%~>5N)y zs?9YXuh}A-MaAt(wx?2_F{9~%Gq10xsxq4$zQ&bb-Y{pLYw$8pI1tT;LXtGxSPc(e zD*{=vd1WpZ#T=BrU0f~0=LnlOS_qL3p06-JxA_XE&_b!JttAq2H4H19N1?W~wgrLx zp%rN10OE)XJhDJ>1v|Yhoy1XiKci(`mq2+(rAW9JhHC1s+u!|b_LMDO&8ikwX)@Kg zHZRE7Y}K`pXK$Q06bYJKS4?eVsJY|GZ=v97~;3G0+X2`*?*IW_e*dz6T$#E)_vS06rYuVDv&D;xJD+>$ z&DYq?Z1WGE+qdnv%a<=*`VOo9pQ)*diJxdEGF3xB8--s7D|u$=Re25i@TF<*Mm-kv zcf?9jrb2?ZTgT%vA%r?%mZrT+TseRkhR&U=%%c#hJf)wjnpzLRe+@>^%i(sGbN4j2 zv?>+R;!{twRH|uD80q}3;!P$o=o{#d#T4e2e6E=23-`Wtd2w#cWbk;yb93zJyVJ|t zk~Ud3S2q+NVb*~VfB+jBa;m!T&Y=k4UxdoiyV5>o38LUsw))xDKnnkL`H(l16Tx)xq?e`xzb6u_7m9^gD{ji~;$`X&S zx%lgSuZ%UtDk~~0y2Nv)uNbJTs3~l{&d_XeffHaQioLz)h~cwl=4e0j+IxJ8Rd} zS3quSYC6sWT*v#ELUvTP%C z5f+bi_Xkj%h4zk_%t({ZFPg@_zkDP*5s$S=Yx`m;N+ubcey!QzMBkyr$~p@gwS9IZ zizJhlmeJzqyy%#u7!#5?|Y+Hf#j89Xol%JMl2%@vC` zUa+_+BT1pq=%w9oPe{hP+Qx-H9iTLYM6&NYXKd_0Hso&)Z*26QS6#EY^~7^W%q~aF z9xV&kOyBVE!@UhLOD1>nNvn65RKE|I(1|J>WtEk-rf|s9Tp_1Y!~Ma4Xz(=jZM@|4 zGv;;1l8@be_jPlUjhJPg$1J-s%ZvCd*Oz`I|4yy}4|=IzIfUl|+6~;@nh+)%)6uX` zqLYWxZpw;LhqVp4lRO@!?+nZiF79_R@%eblxWrU7PxS`}`qL?O{HZ1rG;Txa*dxZn zl@;cyDU;gLG~V3A#HOZs`+j}ax{xG$6XL5toD`>5bjMRhLok>ZA1}5}%3impZdq$v zx;`F_x1=rI?EPSHcupvIJio}j zxEAlt-Dp7D#Vx4(gy>Yhys}W^amOO=j3)zRdy7H`g=({raN@Cd+8KO^|cHBzuw*hPR^>_1D^A?>AO3<_dc^bJ3G5Gvwdg#ZhG&86d(yn=z)Y5Ktc~) z0g;X<_aoTV6jfy`1Y-YZfga-AY{j$Pa8<-PD@V)`G00)00fsb>$O3 zU=7z@D+mWjn=+Xm=^h^#+<(dW zBFY3G!w(%H#Yna5g%9~9vG}wP@92;BJs0KKw>R0^t}qh$?P`V=%;# zaaLGQJpgK5hcu$N8b)0G^wFQ z+SM@NaJgK7`#~7KFCgYRSy<-x#K{-r3AZtzpH^e^Eh1{9SZx zFyexyRgA_4ssKpY--LfvKLnD@J^dx|VJWH!YtZdUz^>(hB3GK4*#b0|<46wZwVfnb zI|hWNnjHTub(8>BkXGn&4#d0fX+Xo{$?@1g4E+SN~Y?F*aG||_Ej-y7oyXUmiibW;^Q_&l{!x4#{aRy^L{ohVG zNfGx<L_=eMH8v_yzB| z7A8xOn-p<}OdGvUuQM9-Woh$4<~f~g?qrJHAM^X0nv8G~F+ry@o4wxX^MWUjCFj+4Md#fAy^E?b zxYq4~AJ@LIf9<;Drj7FoZ9u8>^FC)BtDbg{Rj&bmulMW)e<$BJS-dAmPeAAH)NEIS z1Pv`wC-gNkwtUr@FY1n?7(#R_#*V`xqMRn8Gt~lzGk{55AE6V}Q=NasB$F+QV}u?y zw`BQxE3@DrpF~ybQ27t$OK@3d>^01#I-wRQA?P&vVoDwet>;;@B{ZY8uFSb)*&?SB zg?;MJTU3dRL?-88mq@Q(pMjB+>gpEX=oqcdyJS2jd>_?aL@}2gpNbdO6fQmI zPrNcHxut9m)@oqBbBdU>eCxai$NqQdlXo-AXf_Y-kC{qNe^>sKlz=^o&g0#b8U=k8 zDT_>V0n~En7_`GA@ES=&zw+Q5*b01#a4j>6-DPk~SBKV(vNLKLtC;aB) z2Pt9L>c0f6B(;ic^63p?Q@zIpm8tD zRQ-VabT!**znT7{iV9Buv5pFIE+DU)LE|*re)^;O6+fCq1-a(IQ9WoLgdBdCP(gUW z$ukVf<4~MP(AB z#J}i=KGQLqRTZglseC{#iSSu{-*wmT-8`OL@rKv-mWhp{zzuZlEY;_QrTRDM`8Jv0AG&Kelv@^pr6ll%!N~WlJ<2Tpmf(-hLe6 zE-!ulD_ZSfJfE%1X>T{_?Dj&3R$6=9X?`glt@cHtl55?_*4_c46rRV094v+MxcI!h z#On;q_?6Y#&mK_H3|@Xv%`pL9K9gg@GwkJG;TcGthYtFu>DRP>lK%+0nylNiB7A7EAC)2sR4<04>)=)f?5Jn z7%d_13YRnAuG6Acx$5?XsDN|9&6WabFSc{^3`7m%FDY>LqPOuaCW8B3YlFepCAp zd}KYE3C%#YH_VX#fKITeu!1(Q(l&vj-~F@>;wEzUxG7$DVtj10T*@ThAKkB{IJ00Qg@7(g^@acQI<+Kgf9 zel6wY4nk`A#YAF$Arv(=FoUoRVLy82bff~o#_8Mc96O`0S76=Ur(IAx6Rm{cd%a{O zoJllgBekFDm`*XYw$88ZVHeGBYeTp0`3JTh+tVY!Ku@>yF@&s57gIvq?>9FvT|;AP z@RXBoymIG`i3QI*wV=>;@G);^=elJb9X>z%l>zf*ntnmqAisjRn<34rC*Vi`%uH5x z8|aaHW4YIzGsGa=B^oGE5d1zO+{4d+y4_@1g^(3pZ5$dP_d!cG9(CGL_Z9V{Ir9Yj zvm?)~uKesZiVeXi8xXrUjk5_I~-% zgWvjK=6Q#?_QT~7X7?0z5o771T6b?c;zn3UBst#z=%w@EEhkrcM3G(jPnjop#6{D; zm)_E?1n+!S<(-<}ysws$7135rI@CErhAK&^MHQV1u*1=jo^;ms zh@E5;S6)jc_{f1?P@7j$Ivh>51ZiHc4kC!acm$ht5KCL;b$Po`t?6-1;+gT2d?8y%DW806UsQ z6qj0gL5{{O@!4Ju+^_)cfV%Y zboGF@D;j6QR~iDr-uqAW+Y!kG3Vd&@9GB+uuQ4Nw)d}I?07B;(rfWvL5Ohw#y#kde z=Z%$Iw2u*iLWeM)Y$XYI2pwv3xB9WvSWMJ^b;5TTeKQL|jxN7>cKcq%i}_WGjVC7SJH<$OD}{@dW;cpy{lAQT~hk4`>wwnuk<~ z(~PoJX!@M?3-}l2NK=vNgnY9g>G&a$h=HKc5ZJXKt^nuOY=p&6(o~OJNkQ5GED-Am zGbM`4!hl2R!sCy)km+=@*Hwdhn1x7qleQk^S}nl=w(jokf$o96-mXgAk#$AF2CYAb zx(V1UT=BD_ha9ngG76ob7VIe3q1^=+DJ<)hm7E9KD6@(Q4DENdkJcV=x+1=_=L!Q$(a0SG`mNfd_y!lJauQy zBPNo4mL@~(uf2E-Bt*aPIm znOH*LO0Q4K>QahQ`DzZve5&e)r;K|Dt z%p#N!QnX1=35pz>bxA4=hx@GfU+r2gelsoQuAl$ySaYFs%xViiQ~SrNOduF=*sT^= z)VWB+)Zp{Ar@BsGv7+j1Z!L?gxw#85UGt+cM|H)D)4yq8k|`3&A?Dv|aX15kKx%dE z-Dko!>u6`85WeQLQ`aZrW1XJNkZ`>8_06^0dtDxNxEY&|Edj* z_Vjq19(NCGxaXd>sr!b~RA^5VL+|Wc8-l1j-I%$*z@Xm1lq z%<_(mU`u=+XS8vZ@4K8J4HQxZanAS#>9RW7jb9WIrT(xxn58KgjK^9&+}Ewwm3nu6 zb!4))aaAD^W>Pvo@-?>V>CKyLu@75qeX&uKY3+%%@Bieco&>m;-`~9As>+8@JC!x3 z7OXoV8TN>#u-o0xhz;oM=~}m>rQKjnH75-QIUDabm> z88Zd172qsU0Xzr?IR2Gy5^h>PK4o=CH(x9`gb!_9F8snSUVVimUwS@cs}8OeKYZC` z2O6*0EWUHbws)5_8Ow~BBKl=!iXt7|l+(iyD z&|Cnx4`HI`^Bt&;tFNb{81&mDt&8tDh$%2B5@;#fa_SHKf`{!ozUbu&Q~|!}C`uBL z+vb$C_okaZ9%^ass9G$6dutD`T2--XvnE%Q!62nWL8IB@X^oezTX({{tqB-;J%!DHLB4q3+rp~{zP$)~Ib2)|rLT|*KH42v~ftN5BdS+siG}BO*$1o>#*~$0mg;^Wysvk(Zc3u7M(rBC82jedw)% z9TErJM}aPU7XaG;u%@MYbrkGEB)}J+_yLEznVRcHWX`yf=+(v8YogiEJ%7axUIzm) z^j$CA^U-zeqYi*`*6dJsUj%(CPfV8Pw3p=%RVoL6EH_zq7dsP()-#rap>3PLEneT2 z%O&ErU^qHw>SWYu&QNvX%U>S?s2!7(@fHsrJy3$Em>r*!|v2rX0M4?up&n0?E zFdrn6s=zt-%C#4zwQ&Orhv)U>z^R>%@$qeYI=fPd9-V#wI3PRw9A>=pay`p6_w{Jw zowB2vLX)s;ctP#f^H1$)N1M04i`ipCaL_6(Eu*#6>*t)q=GM;WP9#A#n(pa0l((=3 zEt+gKB~g+N-j;0WL(`7P)@U%`cA5>E7S{4U6NG%q|&>m5=Yw<#c+~!x|id8d=*6gM`q|+A%DXnwfWQg800pShMs3pK2)2Q;$sjPCAx{ zti%)510R#t<1^mAQhQB%E8f0W(_iiJL-(4YAW>MMNIE_ktxT=RXNjn@QYaFm1gKeZ9YpSju`0S1ZFfEO?|K!q*G@}>8Tf`Jv4CW+-&*{ z`DJiZ6XMUoPcawFj2(pC16v;!J%osa0`BKSesGU37%W$)Tci%5`_X}hRAA|--z z@@2$mK$OuKX=}WePEf2Qh#JwU?u{?+Jl)wgYFoK%S7B)T;&&f8Wkq#`teiUhu{(YZ zGG>#h{#sWLI>?LpmT?BJP9inn7Vd5gh5Ii(CFrmVwS#&`LoRyiO_$$y<&s!TWOr?f zIcc5-2P07?AGotOmLR^dXZj`Gxcnw^kX{CB(`s@O^}Q5u{0-QbZvq=`CaD?5ND);= z-4`%uY_|&_Hz8Nf2fyI*1Q=X*Dj6WzK4SpV@MwTs9pyU>T%)~MF953=ezAE>``n3p zT8sV!n`iFM~?GCUrrYV9?ysPM8DaEQ`1bu>o6Z6J$Zh^EHH>%P;A4|r$ zLV^WyCAb0&;U;rMj=w%W(c(egA$SwvK|CammXaUCN(wKY*pqeEw!mc~$%v$8k6K5o zXFRp!q+m~OBpNoz154LF_8gNxe(y~$zxms*juhjDz~Vxs&|BKPN4lZBxchW7LKz0C z$&_f@w{*U!U zJyTqxR2Wn*)%+1w4L{~-x1kDe@M`&iBVAp+zZDMO) zdXs(hw%X@v7qH8Y$gPt8dhhoIcYi!7#A99W-Z{X_xTFUl9BP03*f0LZEbLBJzWr`d zs=f1`3@hxF={KeymcFJG5RuoRxwL9S$RGZY+ z8{bfwdQQX4Cd~vmEIxlP`%y5&VkV&_JAWb)X9)=JA-8kOleJT?7!60yPo7-cOOT`( z3yD=@?Wm)+U_$PoBRh8dkL6K)fFV`Y0&KX(7(zpZ>bktvESF-||=kEM&5z$qq@(%o`^+ z*L*7S&6P2aifZBZ05BOfPa{^3VLXxF^iM9W#-KQe`(`dZ`c;@(P@77j@nk%S^lD!Y zHUU`!6fX!K#~He6gew%qghSxca?uG*NdbK(lav+{m(PSx{cmTUwsG@|yBGKDnDhFs z&H!T4n%jzPjfKM8d(J&$&P_sUvK85m$DdNE3=Od-|Fn0nAY6ViX2G=o8o&g5+oF=V zsjZ^}l^ca-vrZ=}E0;V}yCqv4yz$Du{=UAet{)nNw`mns&x0S<4E{Z-xvbiV9AP11 z5=6}~M7M|;rGjukp^17pJEtHXvV($k*B$23@IjYwK=p$jfO%`wXeLLRa}GP+!;Jn# zIig9I6LW;0R3%m4+rFFDq;8?0P7UPff^s}f zh#*1+U9%{Tn5bt~!E>E_wF*HU6_eS4jzUfhu_q>w*Mn5Sk#x=CmYmvrzW3m(0|{uH z&8dFjah6SX4IqdF{tV(mf3N*RdK^*tov?GaR`tbZRL~U_+B=lXgq%w(^d&k*=pQgL zglW>I5jUt}5G`iZ3+e^*Q9|#~g+TPGj;^k*zOKHW?oO2Gp%VF)COxblHiPI92u{lc z%fL~GM1bk>A}z3#OVI7quv|76@6mG6{KBtYBT-HYY3mnEng!Q?DBPxuS ztX}J~8BJaBs4P6+6HBlIQ;$utN$?xqe**m;6vQadnwh6xmxrYodIv128aFPkwAc`g z4})1{-ga;#_-@4uXo0bkb$kPk1obc$854Qv6xi_A6DB9x+mZ=#?AB2`t}F0@8){Mu zh@I$N)sQ&H0A(l1AWM`Y9*a*k=40mpxUZ;xmyr$n(FFICRpC>HWaGWC8c=6tb_LB z&1g~3!|QV{*u9Zqi^~SaZ(C_XJx9%I9L@~cQabH=3>l0mx>+{NeykS z(H4n_Pz@WU>7hyE%$Fu_cDgXn{qV`E)6M7g@VP9jH?l7w$6Zo(b(Wlh5N_#MK5%?& z6uHkV(5rj)l~b!#ow+|0ap<&qy&Tl)@>}n};p`3y%=LOx4sTM|*w&mVk{@D z6N$D(Mmf>YUvLJPm>Cp=j!3u1TbB3r1&0RL-o2?9_9APb!MtQ-uyVdmJLr$Z;^|~s zE17Ltv&RM3tub%Ual3JH`g!R=RM8J=!M)hkJ!9(ItfJp4N@qF$uWI?RMfVq9FE_j#cfPCX(lZS{Jg zH290yoqViR*_Ztqx|J-7jHACuv>=*yE}8)5G)r+Cy>I-80+MsZZ|^N58JUsLi~qHfJWiicFCG-zT-|fJWt+EX8yXB+ zZH@1`mV>tz0^v{y0U2!i@6$h#z9OZe1Hf*zyaxva-y%DR00=noB~2_6@VlK2CM_Z{ zq%6k)lQAihjA4l(u?Pg@u#c)v)=|KjVECvM(%Wk<)!s3h#u3*qi>EFrqT#wO-&XzZ z32UHQoFm0!<0H|i#G;9wMhRnulQZ30>;DV9cF`fDvEua$^4^oCS#|2%k&X`ZbZ?&! z8~YO(vgW3zrk|6)D|yl1?usXnhK41lHK$lRQ+=&x_JD2X80X6>wNstG_g+W-QGV>O z>qt@_dEJqh@czP2AP2@17l9A+4Z+dA+3W_8jSBaHK6t7drxRpB)E!;ysZTZJg01bL z7SrtyG?kji5^kp;nrpu^6%ws2sedgq2 zsXw&4tR}^7b0s^(rE#wVx{51RYhdprJnH9z4;Hd6t4(LNx!S=~v(wK>h|)zg*L+ox zb|MHyKqd1n+!Ibw35*5EKYrv1wy}PKd>Zpx;3mTRN0ZNzFi0JlBVF1slgMxPN>m zAVDk2^zn-Wu*P(ec&V?YfGzz^ks-gK7hT62SUOkk%rrBxR#D)xl;%SL=sdWuE1nVn z3JaRu`Kljwl1OCssL%t^2sdJp zXLw{lG+DV~cCoCiT)unF;?3vw-m!V=**h+~<*#hvEf+C%?m4wrYcC0ifBWpn(9qIz zZ#)lC|9$uU?hluIgbBCpdz0C3yb=B!(7+?pKajpC8DSvBs}byb&9PAZq0rC@1IuQb z`qBoNpX=!WMv12ti?qRcVM)&3IOAs>RB8qLxU(~zme>JGWU2H*cV*FJMbeAOWaq)3 zW8-Erox(j+#~@!nlkO37-O+>q4nIEiEU2*;`qvVURP$bO&|?(MDCh2;>1V{xN@2Wd zui8(*iloNFRcS7(;EJciAmc5#3x`%$5xs;DKGdp~p=L8`qD&IMWaIzB{z88FjE*3j zqolIqy@{Cg*ibTsTn}N#0D(y;*s)0TPIZkX2w6(?3C|H6*w-5gCu6;ELsFj^wc4)a z#~ZK3pA3s9bV2Drm?C+e#rEfcheYG!&h$04^jcL=*2p zhbkWSBg;PW2+v+|#L0SdbzHH!YVf3-D0k+dKnqqbS-3t(;{ypnZzN%?e&LBU6_}r- zCe|T0P+3YW6MHIw%rF%;Mf`N)nDuX;c(uuJ=jBhVTV;&JGMK-HWotfn>0Nr$wR`?& z-CAtP(eh7DSu@1g_~6N_=Ck3N@#MiVHnjGXi2-5W)SJm(_DP@Ca@7|OzOa9{EGC;t zn!DVEm?)if^$WFk9=OJ&^?dI;Lx@^isy}9A_x?4DjY>azu{!mraq*h{yGM@EYrATZ z9?-^n>=}gx^BFVhbG2tOmXiW}uC*t$lt(|7!nf_#k zMAb;`;o5#CJT-)JERff|hyYEt&+RG@)uaJkFimv&1#wy$0UZoJp0d{Uv^Z8CkSY)` z4O3ShuZn-dBgs~>60u74WmQWtfiYnDR3$_0iv(Li{b4&=vFS3&-hl}6 zmE<$8{L00rW5eXK-3UNJ*j^~w*`H~FyJzM8EkZH7<=3P6oT9Y0R%@?4zILZ5w48oQ z7unn;@%a8!4lH@NGVor)76I>Atv#-sgm>(qtb99k98@_Y zoEpS(iGuPr*lVQX%)YWCZbz3l+Cb_%&pNY8ya>$f>+@Hp;0ZnuZajdZ2K|K|=_;%^ z?98ZSvhD=%-q(y#ypqli4A6(4uym#uZp*umjrYx+&s|!ekH1En`x=F(R9eCqx`Z#! zjHh;K?NQ;G*%1kdCwWs2NPQX;s`;#b9Pw7fQLvD57FZChHawU9S+F& zXD@(9LJ%e5jTrEjI}3)Zsr+zCeBz$5X1fhF zPFl9KEja(B8(v+!`iz#Hr$6b9A*>+Ruh-R%?Ia~O8mV0Maf=X%cR1OLO}-|7pjZk7 z6vlpSw1;o|)U%7jQPR>o5t_xI4#qkvkqETGsZd)eO8j)y^qWe*)D5Z|g^c+5<6~tc zypg)sfEkFvNx=~0djYXdd7};(pl7~;ONdQ+Bs$fjfyoj|&0MO{>4C-y3Qb+@SeZP?WtDQ zqmO905XQk!sCW!x>)QC|SiaWRKGpd0oo_8#c0y{;qM!JaS|OM2YHw*lTd+VVZ@c@h z@uJNk2>HU&&UNA+;~f>;So>w|)p)#w911ZSYJ;p`DP{`=%bk(lZaT@1Uex` z)9gy5n~1;H4N$Q3Lyo1R&BAZ~uLINnpI;he*E{`P@pn=Vz80VpASmR@bFR*@Ao90x z-+8_{88;g>B~~I;ssceo+f0p_0E6U^F&$HnaEV0HiX#?kt_vKw$#A4eks4yL;q#vR z)>*f%-1?0tZnz=S1o&m(+69-*PX)AZ&dsA1Rz5%R$ELu_Ik$}$rqG{0)nMt(=BzQ3 z`M8UJ&l;}!gxekpotQ}^tigiM-&D!OBo>SJ4+H~%?gA^d4SpEVn%wmBTBEdC;~>;s zXi&jnWErAGq@+5M1PU1xLKM8F-Kf!O!FN!KPd&($Ycj=-atHiJ@4rL!C(#!Dz&jw} zXa0tI2PyDJx#Q4V9d?JR@)OVez&qYI4nj*l@Q(NW4T4gRa>t>OA9ja24l*Z>a>oaZ zgKUfsyyHFN_~45Vdm&5{w?^onD&Uh+dkd1413r*~BNeykNfoiFt~gRS4!PpgqBXH7 zl*yx7Ey9beb{6uG(!D*&gy3V5L~kFQ>w0P7zp!T5R%T+`I-&j~dJgXGgGK^r+r@0` zL;uRk5vJdrep&pyrNTX+Hba`ylqaKTXfdm z(QWJQEP=JnAmuW3F9%W%!)2R;_g6;!d)|kLG>hqv)Rv-F`W#dnSXiAm2_Wg}b;p83=ZK_mkmxeiRTY{|Sil0tmX)6VM$|>saa1# z-YRU`^n>$uprlZ!D;f@m0YnH0(^lp%n20EH6b_fWN&h*hB|RE71IO5ZZ*MDz%w!G( zift3Mvj_4m9^ijWFl!^B%3va?3$2@YZFm{``Y(2$g~~uT04NIwIy)l~;e^2yRRrW7 zC93kze!gZZgWX*SS`&%Pws6>P|NLEV{Qlw- zjOMsKlkM&C`5I)SkEo3Ld{Lh+h5Ciz`&H-}`@ixl8s3YRQ61k)WUo4A-h&p`Oy7iT z$`@to12mIO`D?ZR4rueM6!nQ~?nbYHZ_59pL04APD4>e)JJ98oM~3p|u9&9jSEgUo zjzSADp_<}phcs>C=ur*2bL&XchL3fl3|(3b^7V5L03s90b_rVZK zcXuG(&L#xI@?3I37M9=-L!FE4>+4<)xNiadlwqN@h? zChZ?pb1noUqUiH?vE!I{`xj|O+4OzrI=c`YcS18>9qFudTVdWmXS8Jfa!xxkgmjD& zIXmi{c7jdJa9aEOI4#i^I4x$4ejI9+0I>)ZbW6c00R9RFLKP5XLMoWKHxy>_j*f5` ze=bzo=>l`Dj_0z1F*H6tcgPj78qNAdyi=?14Tl9`^ReG~=sfAAYdbMmpu4qOQHd?B zveNh=R(jwsv#j)yliCqrX@tVs*D|kmAu`gL(wZM&&;IJHGuY%K#5uzy;+)Gy;>0<* zmqS6x{sH;L+`g7T@|%QI_H`wbKj_V5wYpfMs~;$Ot%&^IPJ%@azEnx&8k+8-Xi#WR z!yor}3O)eIDxi`bn(Af3)72c$kGK)J%+DxqX(E~%A2V|okvdElyxyX43U;5G3#MX~ z+|7t=Gq?&6Pk@dL?>|enw0ah51k)fns(uZDUOs+X{RE~>TnRmZZ6N>LB2qz7bH(1~7DEa>h@ressC$6gIbk;W8DmIvij zxA65w=5n^UpcW&c8a0{Iy*D?aRPw;V?*JE|Ugm1|xG_*>7hXlH84`NgmsR>@Usfd? zBBj19pQP->HLKNYG(Vhvtxn^w)vr;XQ=NUzF44?8kW#n6nGU4tbN065lUseCZRmx}y9FMW$<3cb^$Y6V?6&QBPyGVSvTpiY@|gT9&0Nh!PG*md zaFX-kH!OdW0i>vd_TZtw_A7zvKp${YGB!Z;6C_j%&_6*0^(%;gW-b82)f{b2WCwY# z%496wMgkO3DJoC`mepaCD7tedr^f*=K@=(^M_&qUd?#Wrl5|xAR_J%3)FC%!h7UH6 zWWo)`F!RJF=O+Wqi>&{#dzTM69r-)F#;|8-=)~4UHRQ5-`i4(S$4^?dqcaom-TSGV z=gQ9nC7&bi4T}eim1MCH?`INP=iISypc;-uV!L;C^e&DCqKz%#QZk$mgpKHd*0N>Z zIoqx}=jI1*UA;(HOx%iBgVv2=e$~pdLr|@cs5&sq(TFC9qk(QTR~$(bSObCmUEC@< zQ6)264M10fDE?>Nf~dS7_aRWBOH}GlYWE=_E*$O_mXBmJ&ABnro=#W$Qt4E3co>l- zc)FMURr!f%{g0j=dwwB0nKX~fd*-(0i^YXvLp(k@6i>hfF&d9!4rZQ?62z31Buqat z^?w^qJUkRNmODU#^#ak=$DZ7QS8 zkz?^rgH$`PFxhM}b##vZ1@R(y7tOF_V;3q5VNxrPB3d0!Op?06160a*WE=OFMyLBT zNnKFyado3Ms97i(L;g;!GO2_^1AiXt>M$8osS$)jcI47}dg`yIdyvZZDt}KCJyiv4 z@!UGngm+B}+CoPuq8CPdTBW%Sff(zOTHRM;vRp99A8RQT{C<GP?(E@^IljIa$ zQx@Zi=pFo6DrhsHZw-a3y=V0D`wzWxlnG%CM>(j>rCHKTwJCL$y2jqYEGaVw7bSC; zI`tsl=sd|GYLz9JIqIYnb{TjloukekVg`>gr^3FYO=|7aM?0#_qpAMOVN+esruFPS z2bB^I(rm4r?iLGt{%N+t4&LSGXlrn^W9&*=7p=5NU6)LJYYKg~Tj`)8FINwyk~?vb zFP1@jo4Q!W{JyqIDMkyZ)7Os~TKBbfm1yTpw@P1BZpZ4OUj_LZMGckfqQE{TY{3DI z2&-EoE@p`J@Oj|zr6wTc%;&uXVOoe(&Y$mhZds`2Hpio(=J7HP!p1&my1Lpw7PJ*n zXq_4C0)p2^k#AvV>4k*?H8hxC`#H>xv~oMl;@acU*vKSK9}Es5`vmIosQ4;es-t5t z$cJF#;=P;j-jCwF`!plfK?B}f)~rUrKDzkQdn3vSb^vgjEjR_lA8Nmh5p-4BS_xD^CDfr$Ld1rNUR(bG8bp6&O^^Hak4R2!v&QC@!JY4lF2A zDFmk1eV#tG%zxT2Gfv}AXNLK*j%8*(*M5c!Yz!Ib%;)MOuI-D_(9^Z%A;dZW4j5%W zM#GfRF(}LD)~DdJa1??6ZUsy;DgFj%c>iOlSj6L*2#7QhZ{A4wR3`~PtIDhoZ@PvE zCZ=gHYJAK~eb-oB+;LS>)gqBw&0TLXVcAd@u>V-Ny`xV@y(F`WH{4qp5`Pm%!S(*( z&W>EV}f(Aof zod`$Oj16}#?OKA~8I?d;eKS4YEb#$v7Wog)F>5LsuvzW4U??uf1AeDRY_!G0DR##{ zIsW;hAODim8HuJcaiA2e(Hx2a5K4s8v=9EB!;nCCPT#5@Qa1Dcatk%v(eUOj&7+$0 zs>TbDsyxpLsYFmDDafeGq%jIQBdk{edlWKxn?|oUY=nEM!ZmGiBXzDWi&*xQ1{tk7 zgMQol?|~wXOF~VoPohMZ;dV)6-}P2h-U|tjUZ%h>i^lx1O?cdC=%eAG3I)+tb(49T{j4 zBPk*CZ(aWPfB1qv)E;n}8-2c5JQ!>+GTCKYHoA7>yt!V3J+^panZsGi7XuZO7>Ei{ zRIqnXrM)(5rCiASgl8R=rU%XFIojZlv_$+72mXuuLIy)R;9~pRMPX#*#B9qz_X#~k zQ6CIt<{am6&K+J}yX)V-NB9avyUFAUqyrwm&1$uU+&;ZN=C!l+Er|5#S)WLCwy)_x z7_8SHA6jX*4fV_&@|sL-@6PLJZ*#lx%JQT6<}A2uL26@HC{^fXbuEM)l9-rw(iWJd zKbx?W8bZF_o=nu%(-iV4WkW1D`f^u$-eigfMqcVI7oderN^Qbl@T{Z|^B`+Xh_US) zyL(4-gLu2N3|L-}zO%)ehs1-@PJ9P5!F@y1Pl{u}E|TCZxDWobCrMkI-Xiai)5-;; zGjbh{qnL*m)F`*lv@qm|7ipt;5l&G>xtXCnq;wJVMM)|Y<{h|p1bN7RuEyi>*zj;X zmLS`1`t9jwm6McDL9?l-RtNrSFE?d@_&1nsrr!5t2Dj&l94~&L}0q$fBm68qzkNlskbpL2eKor|%LO)5y|Y4fabpFicv^ zi*iT9Xz50Qc^Q^b43Glw8mmDfNkj#a_yeRxS|Le3U^?Idz;jTCP3TGbVR85+;(lhq)btGsghhuU9q1eemqw3=lISfJ4lO>dC@S6Qz)TQgA|-NTF!b4ZQ`)&~)` zO=Hv;jE3XkC8z*3oe50spAW8B)-O2oj7=NXubUhn9H6Shg?utv4x6CMGm>!x@gt8i znW8V$um5$a#Rf|O!_#srk3yo_siz28f&4ShK&7oWrl8yEy1p7Yq-LHF zKP(H|UqotYE;n}Jg?jC4>c`qN#;|h9O<(S@8W7Ok*kH-0)4sONSJiHN?K3wkeSNWL zIMlsGtE+!HO}@}+c1lvC$?5d_gMo09WjJ@nM^C!!x&1pEln^9xGHH-?I$0Le=j=G{ zBO62PBZ(BZt}=Ls;SmH=YL#tE7g<~mv6H|t zo~zYMwYCFD2ZV!&SHY`adf55ZRhJzxQ*$SKx&mHn%pOAol0~qf!bi@QaH__5Oy+Bb zAnn82s;Ra-B^J?&tFjJF+Z7A!mZMeBD{OQRKH6Q*A4nqbbzdi`V}6MT9kd>2qI3?0-C;DNnW+sn%X= zNhhz_`~6qW-cd$lI!Uu=`c|b+*#M8`u;v)e9!-0-um*TI<+6%UFOZso3ElQyuCR0a z#$%T*9v_WGWCiS?F3b6jsLzwC6N2!$W~|QLq1mf*yZSyLi7fs{`hYOHC_fnS2?$K6 z!Yvey#uMJ4zxC`5yZ6nX7+Ukv6{ol@s4l};W1zJ)uL$2filjyS`@f+INQ-+FT`3zb zB(pAiN1(A$l0%7HE?sR;hhryix%uQR`whwlbP0F6JYH8`Z$M(y+eZhc0)|88oLmL9SF!hKN<=K(sczQcu5tjwzHO zr1B#1bz>$|GBuP#QJc+N5Vp^G-e~#ec^Caxz^%=-O@?3tbyfNs`uZ=v_|bkh73(#M zzyTDKQ*RQR9&U3wjG~0(H?!Hdg(Z6iANelp+|<`TUVG;kUv{{n?d`oCjSbENS6|oC z(ut5G@tWh#Mfp3E8GcGz=rK^?3DYm>cOc8m0w3cr_WZ3?Lo3rOL8jHs_|`jAJQ%rC z`-ls`hP%K3pRr!2aJ^NF(jXvH7!JHl)<%v1qp@%2`)|YFlP>vyd+Q~(s*X~}(#3Np zQLkmVG@K;%Trw)u#f*>@#QK6~;3)A75{8fpWMzmTZSLWj5r@P$h}>sfptLc>dLGe? z(k%at5aYyvaOz}Bvyg9{nEL3z3mM?TXyDe9j0>@;P+~qx%nDI47VC#t5d6Z=Q$zEG zE8kdm{I1gNxVnlh;I=Wj>4i6Tb1eRGDsmHjP;2Bg9)c#)Zs> zpa2zw(qcjQD(+S1II|cS{TXHRSv@bD+tk`JTnU8~LHea7ndnYNhT}i_tkGpb>VY#* zP9&P1m$r1AzG6$<<3Y73b2Pu@nEbUX2F;dx_S}B;j$>PM-uUY$3=BA2I4kPiy?w_n zUV!ejxgl9xx3uS&>mNONURu{+?QCz&yY=$5*W}n~!sYD8H8b!_MUF;_<|YvgJSmzy z8>YT4tctm-8sBib;d0)1g^MEYT**nF|IB3%1TFn~jqLyLOy#b+pm% z_xNmfy+P+TnH0Irk6I9k74r(sjc8vq(%P3z6y2`I##W1!y<6+N6l)e2*DJqQI^cuu zs+K2O1W^+=Q=AIcObvEMt|6ct3L!>ua=7y};==LK!GWGGYFiWz@`WPlSE)1Xncw|l z2ahq~OQ9vv$Uo7pAk~?BHr4))U^G}@Ip(Rh6WxX>U;z=%rCL(BhreBv*(y+#fz<=nJ0goUn4vHZ}VH-@H05^d~ z1GGYcvlzuo1sUk!p3#e!hdG70yljxl;CCX=<d43r&`M7G-BGmTaoq<*IbMUCiwsD%l;iCq`RZve~NWONPTfUsIz6Vb$SCT3Td_ zI)lN$My+zp$#<{sUScf<{2g842+9{Z(PrwGXkQO}Nf1r;q|umkB+EYJqbAbm5oegX zba3#T)#D3K-#0ocN)zK3pSgHo`_7)8+Aj@`s1eI<@*&;VsH^?l;&8ZZXvLPb+H5xQ z6DaJ|jeu^&Y<9aNQMb!%Mp03@PTda!{c6(;qBF{N&Eo2Uv7u^jb6Anl6Ah#S>SJ4g zsRJ`mv|E7iYKTm+J4I1m4Kfq~P|M=trAvI?b*quoLEB=#}d;I7t zCvLZN3hN^Nip?XSuwv2YtM#_z3m$LnivKT{1zd8@^mF2iu((2~m5Xjo6kJ20)*7e- z=-8BP6%;CCMhX!zyt>RrX>oz&5q5-)gX4T7k=9x%{~fuZ)Q`3s4- zG+Wt0X)8jOfg^pOXA_#u`#hVmKO?*%9`6=@HlA;3Eli3+Jl=<%Wzp#1U?hU4BM0?i z=@-g!O;qErdV;7#hQD}3+1GMEpUT7CV}N4RCc2znwaAo9CD->MFJ6*A<7-ZJZBMb| zkGrBL9*f0#YxfSsLJhSa2BM`7VZu`?_v(zb`zryjw&5xXC<8hV^uqX0MB5I0yK5v6 zAQNy4W6A>Y&)9P*M5T{ahf#Dz1I$ns=81@2gV0kn*k8yQRb`AjpL4_DX`s(=W*rp&(rTOcSV`Ag@%O zf9W{XYmsP0H)|$LRPCJ*&>~t)ra-+nzi>mGWFBiNpCK2yA^}S-Lkw`)M}esM$8TW zb?gSxUFK)Ito6#81@kCd#V})`$>eKKt`w< zEu$8J__B8K{JEqIqR=k7*~Rq=%8k*$gBTzQO7dy}s#N75ZD88TwAagJJ|}rmJv4I= zQ${AJdb4^f+mk@W4?|Ov&l}$OVw7dU#p38-3>7^j+3Rh-l(G41caOKCJ32Z>o*;J8ghzrV=`dx0f+1j09&v;tk78`<6(_X&LN@0B z>Vb5Pj!d{_>5auBkxpS5dN-ld+tg=~K&yTS=F~hY3kP<#;s!@kQ>%1CE|IW%Ee*Bb zB@(?|aWK?sH5#3IKywNF<<*9&jI zdyjq}fPE)(9a9TX1S zPw&EBm*3P*;E&axun+HZgm66cgoGHuOWZPbl2EI$*I|}PtN84_DX!#CpbT}~jVE9j z1Q!X%(!hix2O~yA*&?nKYc*l&B=)Af?!W`6dPo#Ch@PN#i)GBER+FwK5J85=K~x_0 zJR0Ldw3|XTH1I819T{S6BNp~WVaL>syG3!M@XXZJ!fOZb6gS`%R%(`r&j_FYp!K1f zR|~>6;qy~B3#g3FCNx#?`@*;W?e|ECSZek(yS=vQOyLS)S#2|_!AzYYT!sDJFnyu? zEoBG%@gWVmFNcDGdiP~3!HY8ZI&Zej;a%hqC%MmxV_SMr*fcTHvruSmG@-k$W$K3$ z!`+LgerPe8OpOgFC-uqNs@kf+YFXMOe8%qep`W(fA$)q3B5$5r=5YH1L2tk!oHX_K zslNzt-JsI)Jj}>fVR_>{h|h3sGM^(Ah#X}zkXk(oL5-%v8^xkR_kv=#$CYhcHaO{U zt{azVNNgM!SRX88Q}c%U97bB%ZcR64^d%mR0FI87 zQpyNN>L8XD0+K=n$u}m#ieMDx(vk}W8qElf@Npa*vjfi;_kDAl9&a-P@lo~WL+=dy z5OyW~&_oI!n#ff!7y4AZ5=}a6NaD5Yl7W2g)w$c|O$@dVntg*q>!Ptr$EuzIvk*!P z>sTmV%ofb1{z41thMCdl*&83Lq&@DDHpDqc2AAz>ZC>5qYu8%?V{4c| z<*P%`21t-=wHCtb1Z8sKy#GEfVz99t9UU@zRIqN@`jhIMRPV&cmMs0mnFCcOT%B)U z{t@A6)=}D>7Sn&d^2$a@5f9FDN&1D@gp?P)Sw3AEM2z8?kN0W>t&XyDDR2|%u;{O% zWdILk5llo=nGY3)qByaYkuAs=cMA1VwS)iTwF6Z5pkdX@k>PQqn6fK7U zsG1>;f$vJ4tA z_5^f9^!}z?D{OtG!js!Xq)CgaJFYA*h*?r`TN?gxJ)%RXmiNrO(PUBgQS>z=2n<0% zWf!Iq(o>y9;4N{j#HTxmmI-?;fT^qFczxq@^9zMa$HK?8a~Dj9gjiyH4A4oCCE|T{ zYwf$As(s0F4$3BoSN6x_2mi(goX(7jwrI4fDBY3Z4U-ED2a0_eN}9?H$g2<*CO39% zuWgLQKy54}-6mY8d{X5!4JNe;_nD}XMXEktk~9@=bCJxaE#6-27ll|y%w=yXmFEq| zVv<~HvblA7lRoAP`&=%MTl#JL-X(MTFu%HVrhho+@nu(9n-S?|;YQ`- z_?yb39yDR%ERCju1K~tVTtjLQ*|i-px1*_CI`nt+I+H2l_W8YDw?|pie!=27eLlZV zo5}PK<=p)51fB54>J3d6*ti!_XE-e?@M_-qGkIH^rq7kW#k4^11MEbNl`>lCNgDwAtr(LHsFSc&cZJZ+Xxncz^r0x2B`-DpG8I} z!)F!ENWu{#>5xh`h+0^CP?S`qzdb={7q9w)Bm^P_Xt{8$gCIJDy(7$Tu str: + t = (text or "").strip().upper() t = t.replace("“", "\"").replace("”", "\"") t = t.replace("’", "'").replace("‘", "'") t = t.replace("…", "...") @@ -54,13 +57,13 @@ def normalize_text(text): t = re.sub(r",\?", "?", t) return t.strip() -def apply_glossary(text): - out = text +def apply_glossary(text: str) -> str: + out = text or "" for k in sorted(GLOSSARY.keys(), key=len, reverse=True): out = re.sub(rf"\b{re.escape(k)}\b", GLOSSARY[k], out, flags=re.IGNORECASE) return out -def postprocess_translation_general(text): +def postprocess_translation_general(text: str) -> str: t = normalize_text(text) t = re.sub(r"\s{2,}", " ", t).strip() t = re.sub(r"([!?]){3,}", r"\1\1", t) @@ -69,23 +72,23 @@ def postprocess_translation_general(text): # ───────────────────────────────────────────── -# FILTERS +# FILTERS # ───────────────────────────────────────────── -def is_sound_effect(text): - cleaned = re.sub(r"[^a-z]", "", text.strip().lower()) +def is_sound_effect(text: str) -> bool: + cleaned = re.sub(r"[^a-z]", "", (text or "").strip().lower()) return any(re.fullmatch(p, cleaned, re.IGNORECASE) for p in SOUND_EFFECT_PATTERNS) -def is_title_text(text): - t = text.strip().lower() +def is_title_text(text: str) -> bool: + t = (text or "").strip().lower() return any(re.fullmatch(p, t, re.IGNORECASE) for p in TITLE_PATTERNS) -def is_noise_text(text): - t = text.strip() +def is_noise_text(text: str) -> bool: + t = (text or "").strip() return any(re.fullmatch(p, t) for p in NOISE_PATTERNS) # ───────────────────────────────────────────── -# GEOMETRY +# GEOMETRY # ───────────────────────────────────────────── def quad_bbox(quad): xs = [p[0] for p in quad] @@ -127,9 +130,9 @@ def overlap_or_near(a, b, gap=0): # ───────────────────────────────────────────── -# QUALITY +# QUALITY / SCORING # ───────────────────────────────────────────── -def ocr_quality_score(text): +def ocr_quality_score(text: str) -> float: if not text or len(text) < 2: return 0.0 alpha_ratio = sum(1 for c in text if c.isalpha()) / max(1, len(text)) @@ -141,21 +144,75 @@ def ocr_quality_score(text): bonus = 0.05 if re.search(r"[.!?]$", text) else 0.0 return max(0.0, min(1.0, alpha_ratio - penalty + bonus)) +def ocr_candidate_score(text: str) -> float: + if not text: + return 0.0 + t = text.strip() + n = len(t) + if n == 0: + return 0.0 + + alpha = sum(c.isalpha() for c in t) / n + spaces = sum(c.isspace() for c in t) / n + punct_ok = sum(c in ".,!?'-:;()[]\"" for c in t) / n + bad = len(re.findall(r"[^\w\s\.\,\!\?\-\'\:\;\(\)\[\]\"]", t)) / n + + penalty = 0.0 + if re.search(r"\b[A-Z]\b", t): + penalty += 0.05 + if re.search(r"[0-9]{2,}", t): + penalty += 0.08 + if re.search(r"(..)\1\1", t): + penalty += 0.08 + + score = (0.62 * alpha) + (0.10 * spaces) + (0.20 * punct_ok) - (0.45 * bad) - penalty + return max(0.0, min(1.0, score)) + # ───────────────────────────────────────────── -# OCR RE-READ +# OCR MULTI-PASS # ───────────────────────────────────────────── def preprocess_variant(crop_bgr, mode): gray = cv2.cvtColor(crop_bgr, cv2.COLOR_BGR2GRAY) + if mode == "raw": return gray + if mode == "clahe": return cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8, 8)).apply(gray) + if mode == "adaptive": den = cv2.GaussianBlur(gray, (3, 3), 0) - return cv2.adaptiveThreshold(den, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 35, 11) + return cv2.adaptiveThreshold( + den, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, + cv2.THRESH_BINARY, 35, 11 + ) + + if mode == "otsu": + den = cv2.GaussianBlur(gray, (3, 3), 0) + _, th = cv2.threshold(den, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU) + return th + + if mode == "invert": + return 255 - gray + return gray +def rotate_image_keep_bounds(img, angle_deg): + h, w = img.shape[:2] + c = (w / 2, h / 2) + M = cv2.getRotationMatrix2D(c, angle_deg, 1.0) + cos = abs(M[0, 0]) + sin = abs(M[0, 1]) + + new_w = int((h * sin) + (w * cos)) + new_h = int((h * cos) + (w * sin)) + + M[0, 2] += (new_w / 2) - c[0] + M[1, 2] += (new_h / 2) - c[1] + + return cv2.warpAffine(img, M, (new_w, new_h), flags=cv2.INTER_CUBIC, borderValue=255) + def run_ocr_on_array(reader, arr): tmp = "_tmp_ocr.png" cv2.imwrite(tmp, arr) @@ -165,35 +222,104 @@ def run_ocr_on_array(reader, arr): if os.path.exists(tmp): os.remove(tmp) -def reread_crop(image, bbox, reader, upscale=2.5, pad=18): +def rebuild_text_from_ocr_result(res): + if not res: + return "" + + norm = [] + for item in res: + if len(item) != 3: + continue + bbox, txt, conf = item + if not txt or not txt.strip(): + continue + b = quad_bbox(bbox) + xc = (b[0] + b[2]) / 2.0 + yc = (b[1] + b[3]) / 2.0 + h = max(1.0, b[3] - b[1]) + norm.append((b, txt, conf, xc, yc, h)) + + if not norm: + return "" + + med_h = float(np.median([x[5] for x in norm])) + row_tol = max(6.0, med_h * 0.75) + + norm.sort(key=lambda z: z[4]) # y + rows = [] + for it in norm: + placed = False + for r in rows: + if abs(it[4] - r["yc"]) <= row_tol: + r["m"].append(it) + r["yc"] = float(np.mean([k[4] for k in r["m"]])) + placed = True + break + if not placed: + rows.append({"yc": it[4], "m": [it]}) + + rows.sort(key=lambda r: r["yc"]) + + lines = [] + for r in rows: + mem = sorted(r["m"], key=lambda z: z[3]) # x + line = normalize_text(" ".join(x[1] for x in mem)) + if line: + lines.append(line) + + return normalize_text(" ".join(lines)) + +def reread_crop_robust(image, bbox, reader, upscale=3.0, pad=22): ih, iw = image.shape[:2] x1, y1, x2, y2 = bbox - x1 = max(0, int(x1 - pad)); y1 = max(0, int(y1 - pad)) - x2 = min(iw, int(x2 + pad)); y2 = min(ih, int(y2 + pad)) + x1 = max(0, int(x1 - pad)) + y1 = max(0, int(y1 - pad)) + x2 = min(iw, int(x2 + pad)) + y2 = min(ih, int(y2 + pad)) crop = image[y1:y2, x1:x2] if crop.size == 0: - return None + return None, 0.0 - up = cv2.resize(crop, (int(crop.shape[1] * upscale), int(crop.shape[0] * upscale)), interpolation=cv2.INTER_CUBIC) + up = cv2.resize( + crop, + (int(crop.shape[1] * upscale), int(crop.shape[0] * upscale)), + interpolation=cv2.INTER_CUBIC + ) - best = None - for mode in ("raw", "clahe", "adaptive"): + modes = ["raw", "clahe", "adaptive", "otsu", "invert"] + angles = [0.0, 1.5, -1.5] + + best_text, best_score = "", 0.0 + + for mode in modes: proc = preprocess_variant(up, mode) - res = run_ocr_on_array(reader, proc) - if not res: - continue - res.sort(key=lambda r: (r[0][0][1], r[0][0][0])) - lines = [normalize_text(t) for _, t, _ in res if t.strip()] - merged = re.sub(r"\s{2,}", " ", " ".join(lines)).strip() - s = ocr_quality_score(merged) - if best is None or s > best[0]: - best = (s, merged) - return best[1] if best else None + if len(proc.shape) == 2: + proc3 = cv2.cvtColor(proc, cv2.COLOR_GRAY2BGR) + else: + proc3 = proc + + for a in angles: + rot = rotate_image_keep_bounds(proc3, a) + if len(rot.shape) == 3: + rot_in = cv2.cvtColor(rot, cv2.COLOR_BGR2GRAY) + else: + rot_in = rot + + res = run_ocr_on_array(reader, rot_in) + txt = rebuild_text_from_ocr_result(res) + sc = ocr_candidate_score(txt) + + if sc > best_score: + best_text, best_score = txt, sc + + if not best_text: + return None, 0.0 + return best_text, best_score # ───────────────────────────────────────────── -# LINES + YELLOW BOXES +# LINES + YELLOW BOXES # ───────────────────────────────────────────── def build_lines_from_indices(indices, ocr): if not indices: @@ -233,14 +359,13 @@ def build_lines_from_indices(indices, ocr): return lines - def build_line_boxes_from_indices(indices, ocr): """ Robust yellow-box generation with punctuation attachment: - row grouping - chunking by x gap - attach tiny punctuation/special tokens to nearest chunk - - coverage guarantee + - token coverage guarantee """ if not indices: return [] @@ -264,13 +389,13 @@ def build_line_boxes_from_indices(indices, ocr): pad = max(1, int(round(med_h * 0.12))) def is_punct_like(t): - raw = t.strip() + raw = (t or "").strip() if raw == "": return True punct_ratio = sum(1 for c in raw if not c.isalnum()) / max(1, len(raw)) return punct_ratio >= 0.5 or len(raw) <= 2 - # 1) rows + # 1) row grouping items_sorted = sorted(items, key=lambda x: x["yc"]) rows = [] for it in items_sorted: @@ -296,7 +421,7 @@ def build_line_boxes_from_indices(indices, ocr): normal = mem punct = [] - # 2) chunk normal tokens + # 2) chunk normal by x-gap chunks = [] cur = [normal[0]] for t in normal[1:]: @@ -310,18 +435,17 @@ def build_line_boxes_from_indices(indices, ocr): cur = [t] chunks.append(cur) - # 3) attach punctuation tokens + # 3) attach punct tokens to nearest chunk for p in punct: pb = p["b"] pxc, pyc = p["xc"], p["yc"] - best_k = -1 best_score = 1e18 + for k, ch in enumerate(chunks): ub = boxes_union_xyxy([x["b"] for x in ch]) cx = (ub[0] + ub[2]) / 2.0 cy = (ub[1] + ub[3]) / 2.0 - dx = abs(pxc - cx) dy = abs(pyc - cy) score = dx + 1.8 * dy @@ -339,22 +463,21 @@ def build_line_boxes_from_indices(indices, ocr): else: chunks.append([p]) - # 4) chunk boxes + # 4) emit chunk boxes for ch in chunks: ub = boxes_union_xyxy([x["b"] for x in ch]) if ub: x1, y1, x2, y2 = ub out_boxes.append((x1 - pad, y1 - pad, x2 + pad, y2 + pad)) - # 5) guarantee all tokens included + # 5) guarantee every token is inside some yellow box token_boxes = [it["b"] for it in items] def inside(tb, lb): return tb[0] >= lb[0] and tb[1] >= lb[1] and tb[2] <= lb[2] and tb[3] <= lb[3] for tb in token_boxes: - ok = any(inside(tb, lb) for lb in out_boxes) - if not ok: + if not any(inside(tb, lb) for lb in out_boxes): x1, y1, x2, y2 = tb out_boxes.append((x1 - pad, y1 - pad, x2 + pad, y2 + pad)) @@ -366,8 +489,8 @@ def build_line_boxes_from_indices(indices, ocr): ix1 = max(b[0], m[0]); iy1 = max(b[1], m[1]) ix2 = min(b[2], m[2]); iy2 = min(b[3], m[3]) inter = max(0, ix2 - ix1) * max(0, iy2 - iy1) - a1 = max(1, (b[2]-b[0])*(b[3]-b[1])) - a2 = max(1, (m[2]-m[0])*(m[3]-m[1])) + a1 = max(1, (b[2] - b[0]) * (b[3] - b[1])) + a2 = max(1, (m[2] - m[0]) * (m[3] - m[1])) iou = inter / float(a1 + a2 - inter) if (a1 + a2 - inter) > 0 else 0.0 if iou > 0.72: merged[i] = boxes_union_xyxy([b, m]) @@ -381,7 +504,7 @@ def build_line_boxes_from_indices(indices, ocr): # ───────────────────────────────────────────── -# GROUPING +# GROUPING # ───────────────────────────────────────────── def auto_gap(image_path, base=18, ref_w=750): img = cv2.imread(image_path) @@ -426,7 +549,13 @@ def group_tokens(ocr, image_shape, gap_px=18, bbox_padding=3): for i in range(n): groups.setdefault(find(i), []).append(i) - sorted_groups = sorted(groups.values(), key=lambda idxs: (min(boxes[i][1] for i in idxs), min(boxes[i][0] for i in idxs))) + sorted_groups = sorted( + groups.values(), + key=lambda idxs: ( + min(boxes[i][1] for i in idxs), + min(boxes[i][0] for i in idxs) + ) + ) bubbles = {} bubble_boxes = {} @@ -436,6 +565,7 @@ def group_tokens(ocr, image_shape, gap_px=18, bbox_padding=3): ih, iw = image_shape[:2] for bid, idxs in enumerate(sorted_groups, start=1): idxs = sorted(idxs, key=lambda k: boxes[k][1]) + lines = build_lines_from_indices(idxs, ocr) quads = [ocr[k][0] for k in idxs] ub = boxes_union_xyxy([quad_bbox(q) for q in quads]) @@ -443,8 +573,10 @@ def group_tokens(ocr, image_shape, gap_px=18, bbox_padding=3): continue x1, y1, x2, y2 = ub - x1 = max(0, x1 - bbox_padding); y1 = max(0, y1 - bbox_padding) - x2 = min(iw, x2 + bbox_padding); y2 = min(ih, y2 + bbox_padding) + x1 = max(0, x1 - bbox_padding) + y1 = max(0, y1 - bbox_padding) + x2 = min(iw, x2 + bbox_padding) + y2 = min(ih, y2 + bbox_padding) bubbles[bid] = lines bubble_boxes[bid] = (x1, y1, x2, y2) @@ -455,23 +587,24 @@ def group_tokens(ocr, image_shape, gap_px=18, bbox_padding=3): # ───────────────────────────────────────────── -# DEBUG +# DEBUG # ───────────────────────────────────────────── def save_debug_clusters(image_path, ocr, bubble_boxes, bubble_indices, out_path="debug_clusters.png"): img = cv2.imread(image_path) if img is None: return - # token quads + # OCR token quads for bbox, txt, conf in ocr: pts = np.array(bbox, dtype=np.int32) cv2.polylines(img, [pts], True, (180, 180, 180), 1) - # bubble boxes + yellow line boxes + # Bubble + line boxes for bid, bb in bubble_boxes.items(): x1, y1, x2, y2 = bb cv2.rectangle(img, (x1, y1), (x2, y2), (0, 220, 0), 2) - cv2.putText(img, f"BOX#{bid}", (x1 + 2, y1 + 16), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 220, 0), 2) + cv2.putText(img, f"BOX#{bid}", (x1 + 2, y1 + 16), + cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 220, 0), 2) idxs = bubble_indices.get(bid, []) line_boxes = build_line_boxes_from_indices(idxs, ocr) @@ -485,7 +618,7 @@ def save_debug_clusters(image_path, ocr, bubble_boxes, bubble_indices, out_path= # ───────────────────────────────────────────── -# EXPORT +# EXPORT # ───────────────────────────────────────────── def estimate_reading_order(bbox_dict, mode="ltr"): items = [] @@ -494,7 +627,7 @@ def estimate_reading_order(bbox_dict, mode="ltr"): cy = (y1 + y2) / 2.0 items.append((bid, cx, cy)) - items.sort(key=lambda t: t[2]) + items.sort(key=lambda t: t[2]) # top to bottom rows = [] tol = 90 @@ -517,7 +650,6 @@ def estimate_reading_order(bbox_dict, mode="ltr"): return {bid: i + 1 for i, bid in enumerate(order)} - def export_bubbles(filepath, bbox_dict, quads_dict, indices_dict, ocr, reading_map, image_shape): out = {} @@ -536,11 +668,15 @@ def export_bubbles(filepath, bbox_dict, quads_dict, indices_dict, ocr, reading_m out[str(bid)] = { "x": int(x1), "y": int(y1), "w": int(x2 - x1), "h": int(y2 - y1), "reading_order": int(reading_map.get(bid, bid)), - "quad_bboxes": [{"x": int(b[0]), "y": int(b[1]), "w": int(b[2]-b[0]), "h": int(b[3]-b[1])} for b in qboxes], - "quads": [[[int(p[0]), int(p[1])] for p in q] for q in quads], + "quad_bboxes": [ + {"x": int(b[0]), "y": int(b[1]), "w": int(b[2] - b[0]), "h": int(b[3] - b[1])} + for b in qboxes + ], + "quads": [ + [[int(p[0]), int(p[1])] for p in q] for q in quads + ], "text_bbox": xyxy_to_xywh(text_union), - # yellow geometry "line_bboxes": [xyxy_to_xywh(lb) for lb in line_boxes_xyxy], "line_union_bbox": xyxy_to_xywh(line_union_xyxy) if line_union_xyxy else None, "line_union_area": int(line_union_area), @@ -551,7 +687,7 @@ def export_bubbles(filepath, bbox_dict, quads_dict, indices_dict, ocr, reading_m # ───────────────────────────────────────────── -# MAIN +# MAIN # ───────────────────────────────────────────── def translate_manga_text( image_path, @@ -606,6 +742,7 @@ def translate_manga_text( skipped += 1 continue + # reduce false positives in very top strip if qb[1] < int(ih * TOP_BAND_RATIO): if conf < 0.70 and len(t) >= 5: skipped += 1 @@ -633,14 +770,28 @@ def translate_manga_text( translator = GoogleTranslator(source=source_lang, target=target_lang) + # robust bubble text cleanup clean_lines = {} for bid, lines in bubbles.items(): - txt = normalize_text(" ".join(lines)) - q = ocr_quality_score(txt) - if q < quality_threshold: - reread = reread_crop(image, bubble_boxes[bid], reader, upscale=2.5, pad=18) - if reread: - txt = normalize_text(reread) + base_txt = normalize_text(" ".join(lines)) + base_sc = ocr_candidate_score(base_txt) + + # only robust reread on low quality + if base_sc < quality_threshold: + rr_txt, rr_sc = reread_crop_robust( + image, + bubble_boxes[bid], + reader, + upscale=3.0, + pad=22 + ) + if rr_txt and rr_sc > base_sc + 0.06: + txt = rr_txt + else: + txt = base_txt + else: + txt = base_txt + clean_lines[bid] = apply_glossary(txt) reading_map = estimate_reading_order(bubble_boxes, mode=reading_mode) @@ -657,18 +808,24 @@ def translate_manga_text( src = clean_lines[bid].strip() if not src: continue - flags = [] + flags = [] try: tgt = translator.translate(src) or "" except Exception as e: tgt = f"[Translation error: {e}]" + flags.append("TRANSLATION_ERROR") tgt = apply_glossary(postprocess_translation_general(tgt)).upper() src_u = src.upper() - out_lines.append(f"#{bid}|{reading_map.get(bid,bid)}|{src_u}|{tgt}|{','.join(flags) if flags else '-'}") - print(f"#{bid:<7} {reading_map.get(bid,bid):<6} {src_u[:50]:<50} {tgt[:50]:<50} {','.join(flags) if flags else '-'}") + out_lines.append( + f"#{bid}|{reading_map.get(bid,bid)}|{src_u}|{tgt}|{','.join(flags) if flags else '-'}" + ) + print( + f"#{bid:<7} {reading_map.get(bid,bid):<6} " + f"{src_u[:50]:<50} {tgt[:50]:<50} {','.join(flags) if flags else '-'}" + ) translated_count += 1 out_lines.append(divider) @@ -691,13 +848,13 @@ def translate_manga_text( print(f"Saved: {export_to_file}") print(f"Saved: {export_bubbles_to}") if debug: - print("Saved: debug_clusters.png (special chars included in yellow boxes)") + print("Saved: debug_clusters.png") if __name__ == "__main__": translate_manga_text( - image_path="002-page.png", - source_lang="en", + image_path="001-page.png", + source_lang="it", target_lang="ca", confidence_threshold=0.12, min_text_length=1, diff --git a/pipeline.py b/pipeline.py index 0ad6015..9625c56 100644 --- a/pipeline.py +++ b/pipeline.py @@ -2,60 +2,76 @@ """ pipeline.py ─────────────────────────────────────────────────────────────── -Translation-only pipeline for Dandadan_059_2022_Digital +Translation + render pipeline Flow per page: - 1. Run translate_manga_text() → output.txt + bubbles.json - 2. Copy original image to workdir for reference + 1) translate_manga_text() -> output.txt + bubbles.json (+ debug_clusters.png if DEBUG) + 2) render_translations() -> page_translated.png + 3) Pack CBZ with originals + rendered pages + text outputs -Folder structure produced: - Dandadan_059_2022_Digital_1r0n/ +Folder structure: + / + ├── 000.png + ├── 001.png └── translated/ - ├── 00/ - │ ├── output.txt ← translations to review - │ ├── bubbles.json ← bubble boxes - │ └── debug_clusters.png ← cluster debug (if DEBUG=True) - ├── 01/ + ├── 000/ + │ ├── output.txt + │ ├── bubbles.json + │ ├── page_translated.png + │ └── debug_clusters.png (optional) + ├── 001/ │ └── ... └── ... - Dandadan_059_translated.cbz ← original pages + translations - zipped for reference +CBZ: + - pages/ + - rendered/_translated.png + - translations/_output.txt """ import os import sys -import shutil import zipfile import importlib.util from pathlib import Path # ───────────────────────────────────────────── -# CONFIG — edit these as needed +# CONFIG # ───────────────────────────────────────────── -CHAPTER_DIR = "/Users/guillemhernandezsola/Downloads/Spy_x_Family_076_2023_Digital_1r0n" -OUTPUT_CBZ = "/Users/guillemhernandezsola/Downloads/Spy_x_Family_076_2023_Digital_1r0n_translated.cbz" -SOURCE_LANG = "en" -TARGET_LANG = "ca" +CHAPTER_DIR = "/Users/guillemhernandezsola/Downloads/Dandadan_059_2022_Digital_1r0n" +OUTPUT_CBZ = "/Users/guillemhernandezsola/Downloads/Dandadan_059_2022_Digital_1r0n_translated.cbz" -# manga-translator.py settings +SOURCE_LANG = "en" +TARGET_LANG = "ca" + +# translator (NEW signature-compatible) CONFIDENCE_THRESHOLD = 0.10 -MIN_TEXT_LENGTH = 2 -CLUSTER_EPS = "auto" -PROXIMITY_PX = 80 +MIN_TEXT_LENGTH = 1 +GAP_PX = "auto" # was cluster/proximity in old version FILTER_SFX = True -QUALITY_THRESHOLD = 0.5 -UPSCALE_FACTOR = 2.5 -BBOX_PADDING = 5 +QUALITY_THRESHOLD = 0.50 +READING_MODE = "ltr" DEBUG = True +# renderer +RENDER_ENABLED = True +RENDER_OUTPUT_NAME = "page_translated.png" + +# optional custom font list for renderer +FONT_CANDIDATES = [ + "fonts/ComicNeue-Regular.ttf", + "fonts/ComicRelief-Regular.ttf" +] + # ───────────────────────────────────────────── # DYNAMIC MODULE LOADER # ───────────────────────────────────────────── def load_module(name, filepath): - spec = importlib.util.spec_from_file_location(name, filepath) + spec = importlib.util.spec_from_file_location(name, filepath) + if spec is None or spec.loader is None: + raise FileNotFoundError(f"Cannot load spec for {filepath}") module = importlib.util.module_from_spec(spec) spec.loader.exec_module(module) return module @@ -65,10 +81,10 @@ def load_module(name, filepath): # HELPERS # ───────────────────────────────────────────── def sorted_pages(chapter_dir): - exts = {".jpg", ".jpeg", ".png", ".webp"} + exts = {".jpg", ".jpeg", ".png", ".webp"} pages = [ p for p in Path(chapter_dir).iterdir() - if p.suffix.lower() in exts + if p.is_file() and p.suffix.lower() in exts ] return sorted(pages, key=lambda p: p.stem) @@ -80,82 +96,97 @@ def make_page_workdir(chapter_dir, page_stem): def pack_cbz(chapter_dir, translated_dir, output_cbz): - """ - Packs into CBZ: - - All original pages (from chapter_dir root) - - All output.txt (one per page subfolder) - Sorted by page stem for correct reading order. - """ - exts = {".jpg", ".jpeg", ".png", ".webp"} - pages = sorted( + exts = {".jpg", ".jpeg", ".png", ".webp"} + + pages = sorted( [p for p in Path(chapter_dir).iterdir() - if p.suffix.lower() in exts], + if p.is_file() and p.suffix.lower() in exts], key=lambda p: p.stem ) - txts = sorted( + + txts = sorted( translated_dir.rglob("output.txt"), key=lambda p: p.parent.name ) + rendered = sorted( + translated_dir.rglob(RENDER_OUTPUT_NAME), + key=lambda p: p.parent.name + ) + if not pages: print("⚠️ No original pages found — CBZ not created.") return - with zipfile.ZipFile(output_cbz, "w", - compression=zipfile.ZIP_STORED) as zf: - # Original pages + with zipfile.ZipFile(output_cbz, "w", compression=zipfile.ZIP_STORED) as zf: + # original pages for img in pages: arcname = f"pages/{img.name}" zf.write(img, arcname) print(f" 🖼 {arcname}") - # Translation text files + # rendered pages + for rp in rendered: + arcname = f"rendered/{rp.parent.name}_translated.png" + zf.write(rp, arcname) + print(f" 🎨 {arcname}") + + # text outputs for txt in txts: arcname = f"translations/{txt.parent.name}_output.txt" zf.write(txt, arcname) print(f" 📄 {arcname}") - print(f"\n✅ CBZ saved → {output_cbz} " - f"({len(pages)} page(s), {len(txts)} translation(s))") + print( + f"\n✅ CBZ saved → {output_cbz} " + f"({len(pages)} original, {len(rendered)} rendered, {len(txts)} text)" + ) # ───────────────────────────────────────────── # PER-PAGE PIPELINE # ───────────────────────────────────────────── -def process_page(page_path, workdir, translator_module): +def process_page(page_path, workdir, translator_module, renderer_module): """ - Runs translator for a single page. - All output files land in workdir. - Returns True on success, False on failure. + Runs translator + renderer for one page. + All generated files are written inside workdir. """ - print(f"\n{'─'*60}") - print(f" PAGE: {page_path.name}") - print(f"{'─'*60}") + print(f"\n{'─' * 70}") + print(f"PAGE: {page_path.name}") + print(f"{'─' * 70}") orig_dir = os.getcwd() try: - # chdir into workdir so debug_clusters.png, - # temp files etc. all land there os.chdir(workdir) + # 1) translate translator_module.translate_manga_text( - image_path = str(page_path.resolve()), - source_lang = SOURCE_LANG, - target_lang = TARGET_LANG, - confidence_threshold = CONFIDENCE_THRESHOLD, - export_to_file = "output.txt", - export_bubbles_to = "bubbles.json", - min_text_length = MIN_TEXT_LENGTH, - cluster_eps = CLUSTER_EPS, - proximity_px = PROXIMITY_PX, - filter_sound_effects = FILTER_SFX, - quality_threshold = QUALITY_THRESHOLD, - upscale_factor = UPSCALE_FACTOR, - bbox_padding = BBOX_PADDING, - debug = DEBUG, + image_path= str(page_path.resolve()), + source_lang=SOURCE_LANG, + target_lang=TARGET_LANG, + confidence_threshold=CONFIDENCE_THRESHOLD, + min_text_length=MIN_TEXT_LENGTH, + gap_px=GAP_PX, + filter_sound_effects=FILTER_SFX, + quality_threshold=QUALITY_THRESHOLD, + export_to_file="output.txt", + export_bubbles_to="bubbles.json", + reading_mode=READING_MODE, + debug=DEBUG ) + print(" ✅ translator done") + + # 2) render + if RENDER_ENABLED: + renderer_module.render_translations( + input_image=str(page_path.resolve()), + output_image=RENDER_OUTPUT_NAME, + translations_file="output.txt", + bubbles_file="bubbles.json", + font_candidates=FONT_CANDIDATES + ) + print(" ✅ renderer done") - print(f" ✅ Translated → {workdir}") return True except Exception as e: @@ -170,16 +201,20 @@ def process_page(page_path, workdir, translator_module): # MAIN # ───────────────────────────────────────────── def main(): - # ── Load translator module ──────────────────────────────────── - print("Loading manga-translator.py...") + print("Loading modules...") + try: - translator = load_module( - "manga_translator", "manga-translator.py") - except FileNotFoundError as e: - print(f"❌ Could not load module: {e}") + translator = load_module("manga_translator", "manga-translator.py") + except Exception as e: + print(f"❌ Could not load manga-translator.py: {e}") + sys.exit(1) + + try: + renderer = load_module("manga_renderer", "manga-renderer.py") + except Exception as e: + print(f"❌ Could not load manga-renderer.py: {e}") sys.exit(1) - # ── Discover pages ──────────────────────────────────────────── pages = sorted_pages(CHAPTER_DIR) if not pages: print(f"❌ No images found in: {CHAPTER_DIR}") @@ -187,33 +222,31 @@ def main(): print(f"\n📖 Chapter : {CHAPTER_DIR}") print(f" Pages : {len(pages)}") - print(f" Source : {SOURCE_LANG} → Target: {TARGET_LANG}\n") + print(f" Source : {SOURCE_LANG} → Target: {TARGET_LANG}") + print(f" Render : {'ON' if RENDER_ENABLED else 'OFF'}\n") - # ── Process each page ───────────────────────────────────────── translated_dir = Path(CHAPTER_DIR) / "translated" succeeded = [] - failed = [] + failed = [] for i, page_path in enumerate(pages, start=1): - print(f"\n[{i}/{len(pages)}] {page_path.name}") + print(f"[{i}/{len(pages)}] {page_path.name}") workdir = make_page_workdir(CHAPTER_DIR, page_path.stem) - ok = process_page(page_path, workdir, translator) + ok = process_page(page_path, workdir, translator, renderer) if ok: succeeded.append(page_path.name) else: failed.append(page_path.name) - # ── Summary ─────────────────────────────────────────────────── - print(f"\n{'═'*60}") - print(f" PIPELINE COMPLETE") - print(f" ✅ {len(succeeded)} page(s) succeeded") + print(f"\n{'═' * 70}") + print("PIPELINE COMPLETE") + print(f"✅ {len(succeeded)} page(s) succeeded") if failed: - print(f" ❌ {len(failed)} page(s) failed:") + print(f"❌ {len(failed)} page(s) failed:") for f in failed: - print(f" • {f}") - print(f"{'═'*60}\n") + print(f" • {f}") + print(f"{'═' * 70}\n") - # ── Pack CBZ ────────────────────────────────────────────────── print("Packing CBZ...") pack_cbz(CHAPTER_DIR, translated_dir, OUTPUT_CBZ)