From e79e16f7d972ed9f82d22deb1634e5c2e173bd72 Mon Sep 17 00:00:00 2001 From: Chopper <156493704+ttony2chopper@users.noreply.github.com> Date: Fri, 12 Apr 2024 11:41:07 -0300 Subject: [PATCH] Add MangaTerra (#2300) * Add MangaTerra * Cleanup * Add search * Cleanup * Remove override unneeed * Remove override fetchSearchManga * Fix search query * Add fetch manga by slug * Add method modifies * Cleanup * Add srcAttr * Move filters to file * Improved pageListParse * Cleanup Co-authored-by: Vetle Ledaal * Removes the client instance from the loop * Fix search by slug * Fix page index * Remove custom client * Fix redirect last page by default and fix last page * Remove parser type Co-authored-by: AwkwardPeak7 <48650614+AwkwardPeak7@users.noreply.github.com> * Maintains the positions of the method declarations of the ParsedHttpSource class * Move noRedirectClient to class properties * Add warning when GenreFiltrs is empty * Cleanup * Remove spaces * Use cloudflareClient --------- Co-authored-by: Vetle Ledaal Co-authored-by: AwkwardPeak7 <48650614+AwkwardPeak7@users.noreply.github.com> --- src/pt/mangaterra/AndroidManifest.xml | 22 ++ src/pt/mangaterra/build.gradle | 8 + .../res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 4992 bytes .../res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 2626 bytes .../res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 7444 bytes .../res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 14231 bytes .../res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 22145 bytes .../MangaTerra.kt | 242 ++++++++++++++++++ .../MangaTerraFilters.kt | 7 + .../MangaTerraUrlActivity.kt | 38 +++ 10 files changed, 317 insertions(+) create mode 100644 src/pt/mangaterra/AndroidManifest.xml create mode 100644 src/pt/mangaterra/build.gradle create mode 100644 src/pt/mangaterra/res/mipmap-hdpi/ic_launcher.png create mode 100644 src/pt/mangaterra/res/mipmap-mdpi/ic_launcher.png create mode 100644 src/pt/mangaterra/res/mipmap-xhdpi/ic_launcher.png create mode 100644 src/pt/mangaterra/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 src/pt/mangaterra/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 src/pt/mangaterra/src/eu/kanade.tachiyomi.extension.pt.mangaterra/MangaTerra.kt create mode 100644 src/pt/mangaterra/src/eu/kanade.tachiyomi.extension.pt.mangaterra/MangaTerraFilters.kt create mode 100644 src/pt/mangaterra/src/eu/kanade.tachiyomi.extension.pt.mangaterra/MangaTerraUrlActivity.kt diff --git a/src/pt/mangaterra/AndroidManifest.xml b/src/pt/mangaterra/AndroidManifest.xml new file mode 100644 index 000000000..0b740e3f6 --- /dev/null +++ b/src/pt/mangaterra/AndroidManifest.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + diff --git a/src/pt/mangaterra/build.gradle b/src/pt/mangaterra/build.gradle new file mode 100644 index 000000000..aefaab357 --- /dev/null +++ b/src/pt/mangaterra/build.gradle @@ -0,0 +1,8 @@ +ext { + extName = 'Manga Terra' + extClass = '.MangaTerra' + extVersionCode = 1 + isNsfw = true +} + +apply from: "$rootDir/common.gradle" diff --git a/src/pt/mangaterra/res/mipmap-hdpi/ic_launcher.png b/src/pt/mangaterra/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..d1db501d70b4d1387992eaa5dcdcb52eae2695b1 GIT binary patch literal 4992 zcmV-`6MyW9P)dH(Lb^W53lr#I{8t{=e;j=`~8Xj%w1U}I2;QX0`pMU)7sp)Hjtl(va!Nk}4+ zmX@lhYKVC>rJ+PE0yQn9QX$TUr-rbqmdEQ6A|D1bg?(ELX z?AmcFk2IdynS0OUJKz8Pk8{Qbu02{JU|hqeH3HWFYQvCg09^xUc_MO+K`Y200rUS0 zpdRNU&$f?FCTxE9-ir^C+NOWdoD~5 zo(C(NcalH-@yXobeFrCITXe1(YX^|^@Ta#7esoXrZ==ra9s_OtVv?;p&8XB0AoKTsrLX6qj}Ct$?p(Z8 zH_&WAi@s}m-K79{>62eF#x~<9Sp)z1xo;Lf@Zfi|O_|gRpyUcG6C}YubI^WE@nA-1vO@w>I55`yF0VZp5Ny0LkZx$-iIy>EX2Vr-tE0 zo14|;U{5Qy2FzMM!`Omze%`uo&7I}HV2{N{dejUclNWbQetqEH)&1rlbf!6-OzKKr z(;0y0=J1zmKIVRoBU`u>fGl2|I{USOd)5q?pQ-{>N9Fp-dY)h!QGFOo*m^12bBQ4O zV{+XX42S(#4h&N?w=;kyXYs|gzwO?~8*+Ru5$k3Q5`el1&}S7uOMqEyR&)*KHn
R=>rlzw40r4TB5NlQ9eM?Z5pwk{+VKIpp99Ta zGC*g(+IP>o0qc|X;LSg6 z%n}geNq81tEfUrs2x20|5+}=0MV>{r#rC|4N8H&?X%KEMO{NyqcZO@j@HA5li}yz& zFo(Jj-+mZoe7+4pdh9C*P@~Aa_L=8)!*f@0Ww!#E1iVb16D4be9h|&yLUBRf^J$o5 zgGJ{kuLO~wkP$ZQ8Qx=a(hi?CCBY^mUA~tm!BDLTBlt8GvG`BA3z5~mu!fJrN{qvZ zXW5T0CvD7h1pqP^nOMO6dc#{B>7LE3!;x3thShEvLy;1?%nD+rjhHO7uMcX1YO(^H z31_~7@>EGD9u$4U(?;m2Ns0k^DD&-tYoTbwFzZ-I-!O(Z-+0`&$ErA{gFNUAhi!}hKO-v+T zAHBF8kG;GXli6-HBdw|a+Kaae+;}ij5gmSCF65EV5Foi$#9T2(KeP_jzn5#GmW$hN zd=01i@Iu#m;r}xbrQ~Vq^NOiWnM~M}iKkNG}thLuAlky+~KrQN0n*VxeHi zajv)u-#qa?{B)+DF$=?e#emv^>Z`;05c*CSM!PH*7eXdhGulS%3GSBgAeeS4Y2x-B z$FYCYi%3U{NYWu#^q5Sx>)02pjSO&kCbkG5mtNzE@mrLLYS+vJ#_q=P`Slo^A7aSj zu+JdGug_xYz*(}8qPS#GF^{6JL5)mnF_Xf0Yuah%r4j~4`?J_SG>L&k9^Ek}>in)N zTEg4cy^M$?QvT|#C_uJr;Eo^sG2N>MNI$ez=toUh!`xW{&SHQFjGttMq#fF za+wUO2S~>E@K0{Xvy)qy1yFzd2v^VBUsdJHYmBPHt7bRaJ_9c$ugZ%RP!uobd%ijr zh6OEPPl&bEG`BjYU;)S?f^+>)7I*A^0l%>3n54bc$BF_ZFyty-I6Cu2{M-01VKUcC zpcuwgCmQq{uqr&o8m+_g3a+dIlx1eFBAS4qeppcF<`=cAnhqGGR!CpKMMyBW*|+5t zd~o{_tVzu&(GD||`x?uLgANIUj0U-wp6pC{0MDF%D_*)Vf@~>Dup%f{k}B#|34PsA z>i-JnTTREPYsGv43)!5Xi}}~f1);{IS#@vKm5U41gp6Ay?YStz-3;L0x%o8Sx8*23 zTJ!j5LDlv1$??&S4|WTj-WI5G)hGtHJz zUanof#6fcckmTs$Ir^Xo^Md%NCPL~nbw2@$5ujKjfa+LVKmHYDP;+1cJ#f6uz}Yvz z%;jn<2#H6)jQSYcS6xoRp0yP~+Kg0KtX?%XA>ST)8+>jsJdW(MC! z)IA~^)LNLsV_pFUEe2>QlVpWoom+z+O>D)pCr42%(z~#Tp6Kd=#p1m3HzBaJhYn9d z57}ltsFKTY7eqO8f1bi5pJmmVDP)xUFP4fZ6e}vFxM5Qkw`@Oy-D}Sv9b;i%b=+8c zf~HmoAl-@7(eHceW+rkJ)?-WtK#Bc+ZWCL;|r?nt2fG%bbDE zp&9|KgF>kX6*F>KWFK>-W+k}x}E8w-rQZ5bFJCgY!;E?{(E0c*PF(G_Po zm!HMBH;{fxa2dfbWHPY1Jye6d9{gHY2Ku^9+<)s! zc*n-EDi7t&iUK4J{_ylRJoV}pymWRLCGJ(#9sy9IsQSHP5`l?zr4WfFYAjOU`fTuL zA$KT%{BlRIRTQ3$w5Plyw}J|E1eJ2BIXM1}5z=bcXcoV|`vmrEK0`*;FXYMq6fz5` z31vzNoXPaz#KqNkdVD*^XSmC$tLnbCXbsUBmF$7hBneP7*~NH;v9DiD(*)A2P~{F) zQS@ulf$oTD`iZdXIdI6BB7wBa+*p)8gD4<~&V69|(-FM?O=ofQhBMeYbP)qx1xmtF z^Ijf6kBEsi^J2QQiW|kT6ZkuWMwgmJhy5j&9E5}%TWe}gJHpm#Zio?U+R$7Y-aP?#DWN#;SJ*(77CHz)={FIN3zJ>*^=z4O3Nzd=FW)2Z6gmuF$cp5 z4}*P4>^P9ahTb36nNy=bE(1VISHYRy3y%@7z2G2wfxDw6J#=AP)tKZh4+$FSC<@FZ zPg2;Qm>b4vvQc)ZhvVE{<~H**qwpNrQK>lGJ9F`lR1t59EMNm`MMj3;lqt{zR&T3n z2FjL^74guWwvZrm%>I7F-^0B&=ZPx?&{9ysJv-BTU|it93oc3*xR*|V>f#@5L<*p2 zuZ2i|Ozn3a8efH{F7_eH&p)>M97cFV=ghQ;$7T{ZUNEsXZsVT8d2EhJ+YX9zY+HHB zP(Y=0PCS^07y*iObF)AI+7}@}-@e=c#arZJHPGCtJ>2qSz-CiK^E{Zq!v>OU1{$MS zB)UUJm|fH$`d$eKzj|r_PZA)Bln!n_i<`_0=Ge|>$5Z(4g&0P8l;(lq3^v4Qa+Dlr zfo-eulM*O@@={jidje!7*+(=AqmKaXPZFTVuQWi7ndDq}JIpB=iw4CA$2#G;h>-e= zUv|kL0`&cvw9=1*o6lpHmBrk72Y)i2#B+r>Hg>tV|GF$j;-WVuh_5f|^&z?Rr`lD) zH|f;dhuD6$>pXTP0BV(L=>FZQU!;l2R)Lf#G+UHB1pf+P;edu;%eL~Nv3`7iniHXk z-8Fg+yCXTwpSSUu@h&`HOkiV@011PrPlQJuW{|p3tzzi+B0}%?D(E#)8PrRFTmp0+yUCyo8FcV; z5=V+%*pRH?^TRoe(8LUyZ6!|=mZLF(MwQIk)tfAsMWk(RS$Mtuh#lxb-2R6v$e;!( zLeRTI4Kk*w56n?3Qx(Q2;(Y7PKwZmvaI}{b>5q^>7QS+d09_zJB;Q>d&k~><0jl8c z(QiAZOdUZ_)jY&%qjt%58dL-5?kYfKAD{#Qa;pHj6zBp0 z5-%2%Kx(~EqqzMnUM$)}$?q3{XkwMi&Y)%hg~gg>im7+PAagt(;3-ct+9i`T;Q|)v z?1F3o_&a$XV9tT zO>3J(T?P*^#L_Ig5+G09{CiUb=pU~XgWAMFQ|}^!ICwIs%vYxz?8^r(Oy93Ee43aB zC_;ex=;nLX0V>5H5$SU_8AO0YgAz6#R2oEp7MNnpu^j721wm@o{+N7#j}_9!+9mr8X%e&0TQQQRk$jHSlS>!Q30rrvDJHHh}r-AdH__< zCY4f5y_;T)08vOQ1c)bc`Jh|&w~UofQ*M|i%6ha0iHUvrBu$K7OpfCn+@#~6%sCP1 zB;9rYrI}pPiEt9|l4H9%7E-k#Rc4@J(3DKZKxRU+eHYKn#PMP#28#u-Tgj9Wv%pP9 z7vEt%HpWn)j~@Hi`dkb}c}|gs7H#Hw1`}1iZ&nSRz5|8=$rQ z_+)LLyV;toBrwuPyY@QaM*C}ov}fhF8Xy1JPPwLze<|{ZTdu=hQZd!tbvp1C*EKcK zPTOuj@lLPcP@I!fc)vX^@DpmqDZZp0Uv|Mhp)X`4x2Mc~MMxLdUF zAII>CeGfnaCiy{K$G;a77mr#KMm*q z`hg;K0G7Lp<1;vR@3--($NvjI;Uwg@V)E0ZC687B2@pJ|h3=a+V$JU!z%82w%{TBD zOmQg#w_Gmy>C#pBP=P)3>9J{?c=Q<@KKwE!d~k$44F}zNqWVXu!X$3!DzN0eq|)u~ zy9(h^LlWwW&PXyOpvY60BUPq`k4`2kfXGvR8ZLnOA?($PLCbLoK=Kqof@jnJbwOI{ z1fbx$0GLkixmpnnKnh-4j`RQeWH0+7Tmz^L#Mc122GH`X@P7fjYY*S54zieygM5$6wF9 zqO0aN6}Vf(EM7+b7y9PY%4`1bx~^A_t#}5l;X#=(9sS&^e{)a2^!jwJ51Hbdm?~+z zT=TZOk1k}Ossm8H#p<|NO>V1z^*kN6u@~-y2fgPC6vg(*td1=L&`vkmxg6BusFaWd z@OJA|NoPg2gt6BAqfloGaJ4v)q6PF>D2W`D=rk=hLqi<;=HQd__yIEh>C98%dW~?i z-Eig|xVaP=o`P4%li@)8^P`AnZfquia^rbr*VqFuzYX4^4&>><#gOc1zy0a#v!OXEG$6d*m<72uSJib!h%B3maB?Hqy{V<*(kZ0lg4CB#6v zgu;uT8~7Tm#S}WDE7-0rqf;{wQ(Z(9f24_%y3f+l6$dHRL6WqbuvQRVoJHPNFzITT zbfU0Hy$pm$yY&6aBY(!h?IW8Fpt+oZ8ph8WY5eGeV^}CqEcl9-dM|;t3I>+vIOgOv zHdu@(I@-fi`>*4LgYOIQ;#ecIDNlR#2C)yI%wJ8|W*fG=*r7~czzlk)=veyq@= z6ji~FRujK`;@7tifX%%yvmb9FS3S?!TEid%Ozox#9Yqt;Yjcm z!CuZ6EKDx0NUsNBF3ts&KA#>m!vC4Ax3Dcejdaq*p&i%A@T^Z#6_2h2RI84L!B_-`oR^VplEqkjb(7VQEBQNrtfcj~8NzHT{^ zp#u+ph}Je{K!OiDEI3~W0}Mds`afRjMKnTMRaBU+j=zuW!V~Zop6v_T%c5I z`XLndIP7`B)h zp%rw+MOP!x*%C+JQ=gzA`cY+6$@r-|3kd+#8OY7`0mB_ICJJz}<-1XZbQ|xEVXzRx z$-&)d)f^mYp2k0DukxoE6`xD2;B?CpkTqd0(vD0N49-RrUoSfbz{QOMh}TG?q<%K)xfcz(DA{pmbTba;0Gy37Pz6AW#a+6WVxSGyqy>v!@QFb5Wu#CH zB)3N~X6ZO_b(@gT*&Rc;AQ)&R00o?CFTk89@L7%@^0+TOg40|ss(;tp&SfL5D<{9a(H9nNeXPJt_O zP+}Q?LqV+5ODhjQx!Hz}h=CWkPT|8*8)qisIGA$qY>Nw<_6QDvmlBe-K&3RQHBueO zG$Qud|B_p%Qr0-?FJ$LK0BUY(c=hT+S9NWbuCk_ebzH0)fO{@F6?Bf}>((;52AC?) ztIey!>L5*UsrW{Hd*YVD@1oaY8ofiW>E+;|HH`Wc3=f`0tFOEvXZyA($Ey9aiYGrs!vh;W9>Z_@zK8G7Z)&JYo-MCNa&-Kjc69&#yXwpLY{gfo zEpMnzv}o)rj*UyDaz%O>ymEaKe|YY7y!7u8@UEZU)t8Q105~@$=tC0XKVd+lPpxtF z3;6a&vPbxjdi-~>1^Up-(~^96+0_i=>ufl6DI(e5NdT;Oelx&8swl44uzJVczOPr+ k>Do))DZ@4m=v@!sf7u7Ye0y?-!2kdN07*qoM6N<$f;&a)!T(I8fUVvnLGD>zwi5fk9%ii(CW6V5-^ta>Z=#0RRES*3047E1z?#au*{cVwSZLs zmRSPJeEC%iI70!@z^wu(0jw(=^=o2S(+ZG}=iOAh{+za*#2sAW2eQD!yBqqPsOxD2 zCxrele|+AWy*tmkwKF^W`V7@BFvuGS6dunoueR=*qt9IfQ*q3DEtl0xk-S*z;9S=NKDkTA-6#$y=bA$I?dgsQr z;SV;_O{-3|(4tcoXte!S{Ye8rnqwRLFD*(s zrhz69ep>BMd;B75bd%DxY#XuqZSDq~H-)`?DgamtfbRMO{evej{IuG+(vDB>Ta4Sh zO$vZHymCZzQWn4fv|(oejx@E9K=bRAL7-CrYk6dt4zf7VVuJIUbBog$Evf#v?iwgp0Y-gHTEJRTL?F;QWuY5g!yYEXDpJNh1VFf-dN64;u9bj- z-|K{cu5Q5qZStIcawg6pcc`Dd;sn(z6*4`CJXorUK3bQ$lwbe7W&jd`yZ8Xy-xpXw zGZ)41n-pTTdJ|cL@Iy`&16QRZ@nTTj1jA)4^0L6VtB1@iSk9iqPcOhyMsN_qXbc$T zj==Z;63+DX(h#L7{>Z3>v?i(XH$J@GdW{Du*M?Qr)LD!7@W-5&{qx;s)P2?hRyM;8ccSYY-?87(%T>)0mb-geGe$ zVmB~&6R)0$&o%#Exs`@?^Gmkg?gL+*w~v2|zIJB>-T)+#>FKgIsGn z1hN%@83b5@ML=sv)wp!ozJ z!^L_SF@EDGLs!zVq4VgR%oMG)tCTm9zQ9)*2BIal1O$(# zE#g-Xu;IOfA6*5Z3$Uu5NfS<;o~>r+JC$x4bn{e$1$bVDZn^j=y6dXP&SU`Qv4|GY z($@xe&}R=_OD^XJOdpDdSeT~ZW%y@^(KcM_FdQmmJnV=};3RYWxn7|{xkMdvh@JrA z9JGJNvFSLXoWrh7$DAz9LGX@nIT8?I2kdM3pQ5Wh7d}mIx%vmK0Z5_!r-_217O(&n zB?wg?JhFrCJ9LfY=cwTe=1@GsP$*u}w4|e+@^p!unQ19dfatPw7n;u$rRc|}B5qQ8 z7wsNAP}83C57Jw&VF04ziF{r;04(GKl;D~~+DuXRJbgPoa^&n_+=^S8#;H6qYq0^^ z(2kXlV*tu1yBqAq*^2z|l&MGqD6!~1k-i0B%4T14=?iq% z72gg;U#F)1BGS6OzQ~#I{R;q)fO4ef8T94BUG&9gUPi9t3hL0C)>4_H$y6&=_{>;} zL#ngWGzSX^3zXkC>GFcg0iT1MeiY z6g8lnMF&e4)AxrirpHHKOmk%j9-*QZhz1}I%a+1d7Qm&9^4v64ONfG$LzM|xNU>Xd zmPuXXoRqe@Y}TgrJsw?l)(Gv`a)>VLJt)Q*b=G`MjsXH|l6_bb02~y&?)?6{1f_5o z$eW4Ya81W^Q3-|6We6h4p;0)EMl6qrHHW4H>u8&Ks4_Q06$OCEBf{DogKm>WM18HI zJPoJ_q|mNqWrzVOtwNS9h0sshlQkEixrDYcOGfI1XN|SAB zt=EA9t2`GBEoA8r{?5mj8h~Jw4g>Hl03e*08c;+N0zu3364Oqc@cDdEbd%OnVF2I* zln?bU<#DyM!Ouj5ui6ePji#PPD?!#QK$9V|ZyBO&jY4fMLl6AcM~m=x*`> ze9gB$`ZgMy&5QgKhS?l*YeD!4Z-k2CXeT6~s37$~Sr`>mR4W{YGX4<@&}hUt;;{D1 zOKHvLH3+;lj)VKapz@Mf5h4SSd^SgKy6P#~d+xUhRqW*ffV+C2xSc-o^d6d?<8pxL zx*CMGan(2dbtvPE(vELPajqbwVOppaBw-a~!x8|M{WcV{(t&fY%!{Q zq58zv=_+LCPpJ6wKY#f$D$cc|0OmqtP-J7X75`&Q zg2DMzJp&lnSWa`ddt>YTQnXoC$wXQ&5b0hK4v*>!QcTub?MRY^CQW2B?gh zyP$3CdKO9tMnP#Tq8UVUl%m*~{pzbJFArDQxoSyi_O8`iX zs`%_+7bRkzyA`h?!3C=2Yk$~S>aZ?G^w^9?C&~b$LC|`}SaZ8JAJu3m65?Ef3v?!4 zGq^wpx^m??M``bc-=*#>X6yuAMink622faX@rYUK@k923fdYkPu;L1gvlUs$R(!QWdl4Vto(%HLP24^(Q#bQXILhg z+c7*(@Bo=yeXI*ax8AlPW&ddta=5n0i_=t?zF6Q$xQuOj4 z(?@NzifKt+>7YQ7$c9^#R{^ItZjF;bEPl2CUKNqKs7AT1kH)lJT2ix0pTI$QgI zSOLhPJ06y&4BC`Y7QlKN-GrFL*MYz!DQT$G5)!5_24Jj)owJX|tsy5+mk|^BDjW7` zLWH3_kuO7710@H0dyTT^JQ8U!MkN-|{$&7Q;mAk;P`?o?1g&CK`Cj%yG|puO4S*#qpalRegug@p zv=+J?q&%+X?V`*tvFNJGi4!lvQqD>>qcvS>v(MN;6FO-U&ROOdwNVCu!2pS1QiX#f znK{eV5kmHUB%{IcyCi);C^0m$8L}>{Qnmqr^xA)#04OA+Ag$Mp9j{@990Oor#hR3{ zq7@B*`WUGW>&B$i!~{NTD`d6T-{qEV8m$u?{oXqRuh| zlJX54;fQq)Yyn8ZJSxfh*&32BLANg5u8(6k=v-QmiKm8<0rK5R&$ExYXY^4Nx4iko|GlISVVX@!FBC(fR93 z^t$a&H_jjH%P)E&_Jxkva`bO}>i01|UUwf>6!}3a9BeyMEA}gwNPuzxz-nuU;v)$P zIohcBeSOwG145Gk@Tv%XZ5^)4&y8&;;DjGR9^yDunwS)G)Xh*w&Qu?@PeD(qqbo-r zzx@%~)`wf?Vz$#@0nGsLb? zX_(N_{gN|bodtv5ee(gjZp-tr!WUy$3Jc&1xtJAuwz!_Y^7D)6;pevc(}iKR3Jib; z7o<)86d?wcZEq(VYx6Y~Ng$-&H>3>O0&oG=ey)f{7g_}qEc$$|7s=~->~t}U#ulKM zEF{DjThN#Tx;!}OH7`9*Z@luy)ZZSy#i|*H(+faMNrL-1Q7+I66aDnx$1bFYpFbB4 zj+c&02}%v~`9oNOv>54tS=ej^Hq#ON1W*!3OR{JeI#0F2?Nt#4F$j7S$0@541vY^m zYrdSH@NmP%95QjX09hkf2BmFEIC4Kv7M57($k8je7wP(~&(S68hN&mNu;6uH79W7m zx2MVjW}J3<{AasqcDzIrvnCB!Oqz7FxakNhmf3PphSp2SHC@yZl6rQIDs~4|GC3?W z=Q}L9*27X!uS!^qXAN~F_5-r87R+J^UjhI#!h#SSxK(O*%9KSV7WYhHH8z*CIRln~ zK?VSE27&u;XpQAkZ`Pw;t4`f(I_RPsDs*1ox0GC)Eu>lZH^mtkbZxRql_GQ=02lzk^F6kt z0kM=t75xnxiP~C3RuIA*ZmjsmXb*j6Y7-`Nxa2^zzRjS^+Ggp6vPH*BHBeuTN@Yi^ zH|3=wd)rHNQ~Naav4&S&tegPfLkai>4mr23!(E<9lVuHqLuhDyt{vrwPTa|f85*Ov z9{}VjSNn8Au?L5pMgWqVp*y^r%p#s&!~m4IbPV!wWTF+MuF^+Hx|T~o4BXY4@5jAl zxL=o}q$iHs^!G!XXsiNC!l^g)j?tY1$Ei5w(d2|lU!Q8D&lN!+5M~$X6k0QBLJP7zK1q%)Yghyf6lfl_+n@XmB6X?#%6SP7hTjBD z$PD(06FK_8(0Uq$Bj>hWyS_+o+E^rSss;c&`pmHmePpx%08Hx5*8#v3U0nbGoLP(V zwRACTA$rO)EKxtnW9#Fkm8=LHh4sP$ZWw?Ce0Ze-urM9D$6f^r;u|RRf~H315u<7- z*+@s~hn@U0g!n@M@WH`#G*T5_nqD(7L3eC~a|i!BMUVdVm_Z*cb_>PsMJn<3-V(in zEkKo~*%E^MPtsqo{!@lEC2ww<1T&bm`NWi;%0FCwkBH#08{je zF7^R@Wob3ys@nQwGOfUuxdR_lXGg63lYj*lVBNS50Q}P#2ml7<4!xSpN!&moxEOIf zmXXw5E}Tga^eTpid0-X-oM8sxVBKaKGU-Pn@Bv5qVF6j;q;KvYr$5|;Qo z6BbZA6D%MmJNAyk2~Uj+3i75MF@f$P3{|36Dj1?Mq48jHgrT`UIKsSK?eL>fL_q*x zw2~9m>YMw<=&sEZ>`sDEpeQX>QgkyWMF1-^@_?j-X!(O?HlJg{AR~O@O4KYct zGjVC4oClZ)J&^;-0D!Byef=vKfEa-{+9?)Z4ebU6jR{BS;f87l!r~RxF`hu4s>&4x zLP?PawDGYSX#s4#3}q(_0Ct^4`RYHe01DclOX&juz)=MN zG|mM8H8@OuRtM8c!_sgi3>}vnwnuFP006>Z03H_rzyiv)C|mDt0>FX=bO{>i1_1Bu zQxwEPpTkYu3INgoG$bJmJa-BJSf0oOvM4pnJfNTKodcAst^^;D3IG|{yGQpR3>_7m z?@eM!B4T#dLb)PBE)xkhnGlKSL;!%9vNk!v^Y}=fK5&!)fCT_0VF8=i0#NLORej=w zK_44i10li!n1T=m2_Jw*5qM<)fJDsW1dsty&zbPA%hwa#kkn@j3&`QQMw|&F57^ZQ z06uyqSU@x+WdQa9fRT6r{FqOVjUUpXoU^t7JS>d?_#r1^M+az(oiP6WX8#DinJEaM zG644;H)!8D1HevL0&pFCfWZLFIT8RY5*EQg7yzXJ8UOAg%f^1!qBm*oO#>BPIwEP zFv=SohJFHJ=)Pi?uz)UrcQ<^%b)9nkkcS#kc>>|80Dz+#6$Xc_FAP8yYyY#Ipdc*L zqTXK0?(78sDKtaj}bmoN<<}ft3tBbO= zl~4;x1po^eC1tjNDFA>`y8u8&K}`KJzL$Xy3qE)i3X1ThZ5=9dih_PLV$pjKZ=hlg zju9rXcWn`Q00RJv!s@tthhPB{-J%rHg<8^QH)dN zaP|RNrXaQeUat-c%I(Zk)>#SF&;v8S9O=kw~KWM>xlXK#k)^fJUxBp z)7H=0ZR%dQlW7F5TS{=w8KU)iL=}f7^S?_MGmLi#@- zc$UjAN9Y&3-$%DRd4z`XQU48@=#8Ad2%|Z9RJQy({}m;sq0ZM|Ll^wjt>!&j2aIia zv|40KDe%PFE)GnF`7#~_-lykJ(4oKkD*fp{KSV!M+RwMwoYG%W;vq2&u@&$iawuGS z4z2&QSDSmUIG0|F2acbO2@?J--Ihq(&kVsM`>svR(UBiNPhWW7gLMCsFVJx%e7+xd z!M~uyBWz^>`WSvD6bqUoA_jtA`OjPN_j-~yNn7cFTKPxI`iXS1ENm7!@2vU!S*!zG zXc$R_CMRbl9kJkf=l5X%R=&6vzlSVb4FFRO|K&X1`8_|4VP5XnT}cW6A1~L4NFZ47 z{3@R{lgyG9fB4JaA_KrX3tR8{k9f8eK6gJ20Qz`UPxb|$wvFW%+v4^>gP^TJe@=9j zQxRVH+*4^MQAbzkL1BJBsZj0ztKe1)o~r;XGZd=;tOBsi5?JQTuUfz|1Mt5Bw>VLF SC3tlJ0000zwOzV$@XR-k_7A0|4+w{)3Fhe`oUl7Ao?8`_cQ|ZvX%R+(bBDS z{Wf1s>bs|V9ElSCrtnI|^V27z;_O=vcx;Xcp4zo{8?a&$bd^hK zxQfy+UJ*u2KVW7{GKN*_m?y0BeOc^~XZUTU>YdYr5_6~Z71!_ezw?Iw<_<;fVC4ps z^;%)!4+?It{d?scqR%o1F+Q&sqa%g>3JRY!{SoFZKmBGuwLJ3PaM2ZYi4Gt(^(&H1V$ zUj$t1o$du}K3{@;ExfTzt z&6*LaEJ^zqeo{QVmen_0G(g#hIeer^3C-%SO~H&984-~Y`MzmIdJ7JEC48f|fc z6$ip;C|*-|d6D?u^V`Q%?7FGg?3pN<^;C*I@f%&6G|HWFl7o7sZPgwbxgFXWE@N%W zGR!CN*Y8VX>PJ%))%V%a8K-12?x1~kHdJl-Ezj>rPbMCICzIxWHg@BEi)FV3NVvi~)le&|Ty2!MSyZ0=x)STiYk9(zmt!-!t)R_nvN*+<~RXAE{O#*0@!(+t2K!heszvR4+%7r=G%c4!y!o)e|xE{7oV89y?6vK`q}X zRr$~Ks@Cg@ILv6bhRh*v=S*H{LO#`){|jubhiH^PM1u!r*f4 zI0Ld;(zZE<_5h_uen19&qWC*Wu1Yp~&>AzT0v`|CLCPCEtV{;|e?5rHrF|rY?ZT0> zRwhN)c#(?1E_vV~heRUbQEC+WVuI`65Nb_)V3NsXFn9SRm&C8j~9Uw92 zg|;|W!JGc18}0&y8J{#>hp!g?yHVR-HdI@j!)`^0Oz%>L*37HZS=-ongV2+W=;cFL zGEx*AfI41;EE__H0p_4QrtZ=jpc}+fNie6!13*;;3sYt6TeT|Qy3$)~W|da& z!$9#X1V6MI@mWa$Ha;}Ye+0k05PnKEjXu*?$|2zfDzw2idvP&;sdPJ^JB~8efuFM4 z`PF>U%;~>Fccyor>e5;BfMi8_3b0*8jYdvxngSM-1rP(!`|&P=2s>@h{ZJvIX=2sl zye}#rzPae7>Qbcd_esYAa|7UAOhAn(urwtn_F76lUyq~z29X5SIr{yZP{>v{h|Kua zVzxQ7jfv1;W!9`39j~gD4x#5>AV|@=-+=VyDp{+APD7sVB~Q{8?2EUHgsXq};1)`v zLnHi$Ilx6F?4wB-o(u*^Eh0#R?E?TsyswYlDg)q`NQ^AR*L_G6Rq5$6HB}r%lIxKn z=F1?#0QAcmgB+C{*`M;w&z~{35o6R+t$x75Q@gh9Eki#FB)*>MMQ@(G>pq={#zfaki4TpE z9#k>F+UG-P5C9lyx7;ncAd|e+$btIWVRaCSqabqO8V_JxfHqkfILX!!)AulCED0@g zp-yJJKelAjL!;G}H}I_eRX-w|4Ja9erI=TLrc4>S+`A|5qZpItmS)Hmc9HPv7~#&O z3F!dMe7yYjE{PLekFJRj(}UCtwQ+<^I7E2xrj?#^fl&IMqqqQmtl6uMB=(^Ro*lE1 zW5DiROdNImfwj!LClt#RsEsT&OA`XdVgB0s5hW9_(pZ{+#7|6&i_Br?hW~W?Em2%a zccr-Lcqzth`$VO|sRl^Kw&!nCZe`^wdfCl=No)n4LJV4+v452&8Qy`#26gllDXXZr zn~+@t5xIrFY6m^HkXw7g-mfqmT0!(Pd1F3V#O+EGswH~idrqjoz5T`WB;YkhE9yWp z_&^Y_QB_{Ep9J-hOv_Yfbd+vHCM?1`fbWb=uVzAO!=rBD-bS`wF5n{5@E-$a zl3%(nD^pb#lZeF(#DXQ(Dv?h%rZdq(9uX;4*PQ1{O{ojMLxLaY$m!MJjyb3e=R%lj zFUeHWt+e&hm(5MKPzIZ=t`wr?O6M-n-&m8=vAtM+v@%V#S7M?8gP?M@#h9A(R{^v1 zIH9q)3#gI?!7fj0W1`m4Js!`_9~P~?1Prhe=NAUhs+Ojdo+m)E7K17MuU6^T zwgkzxhF6`eV_n27L*o?Nm~Dwxiu6N-sFBLVVupFnXDb{#58)gH9jmj;i06me9(w7M zAaGRxP9X?5MG!RROj>2Z0z+T_KDlPBOO5ME!|>0txnn>a_ykz=k2&_~NFkMMq#>AJ zvN0KI0WFX_>3uk;iU7z4(SPEkw6Ds~(h_H~*V6@M*osPl`dFYS6FYopxL$R+snQwg z6kuq@Wn#Oo8=#@j&(Mpo*c1Q6^+oRI6zjidlWE`lug<;-FBkxCY6YEFkFS1mhW}D< zdUTcw%IT-j4q!H{ZgH&_M5anJpCn}|oh5z>ePQBFHywI_mDrW>=ckkt%(aNkh1 z=AkhBrL-ij&U{8$MEYFxt}X#A%g%2QamsdcB$w9*@tK(``?yPJn#reclWtJ$O!n61 zsqJkgY<)65w8M;Iiy#ib=J>Z$&APuQ;oqKq9Hn02PLvtswO15K2~xIPeekSHBgfJW zd<wj(?#(WR{N$6&flv(<~er=20t5GP}MpYs?SgQc#>#jsoQ~pr`i|u&k{Y+G^+FGR6 z141p_<_{6rv36ScG5qG>y#XCM)hi60ag+TCYpgyixEl>#|Gl4zzM{%;)P;heq4xLt z7%v&I#l)d(;1pey{XI|aEhInc^&c@uRuQG#CguQ&_9*`}WqCoh(hgh7YP~q-h zrBv6}Z{VMydruxgmIpf`5B+P}*KPB)2jhFvWU3ZXU+5oIEEF>mu|C?PdTI?|o59f# zz32c38@82lm{p$_=X6QV%thqAmO z4Mb%eqOr>4+le7e)nrO z07{`vkr%9^e=lbYRE4?t(YqN7a!V~#9>7&nTcB~CDt!1AhjR6sDPvm7(QiS9*>x}I zm-^gKdsk&n6NSkj#1wM&foug>*=(jt#LspcNmiwnTc=;SQ$9LzcX-6OSoiBwgx3d^ zuIY66@}!ft$rj;P4e^?*FoUL9sc+}Gez_#kG|2ab)>sOywh(LxhGsT)<-TZ6Y{ zRk?_y;ba@Ji%f+AJp$>3mi4(CV1s@j@UBPo?`OZMU0>W+-9Ld7Bq1Moa)a~HfVU9w zo5ZKBN~jtXqBi^q4Ohf0+|Df(m-W!TpGA+>?4v`HxLJU8>&12qCk{vkKBdBk5MAl} z*B)8T>2hgQtKL&AyQHrHo8p2~c8wtg`Y4C@D?OF%T5rV$quKg60s`+trgbe%5q`eSW@`w-vFXPr@P{?aD80EBYw1puh0!IW17-#<3Q=d|zX&>N zokcl%$03Sya-jX=#cy6F!Cnadd0QJn#)uCqj%@*f{W2T-8Cm{M27Lzm`&b&@kh-c!*-@ad#+P*vMY2b(D|-K$r(8Jg?U&+0yRkdH>oN6wVlADrr_INxcgz_?qQz)E(`Ifk_q#GI8HSFCe28g+4&b0`C!!O} z4<+~ry9?0|@LuCto{XhkdmZ69UDZli9nz-;uh$uM`DwWHUTLProI)otptW~CzX+dw zpQK$=<&s?0#l}Vx*EnI;t?qiOW^n9@dF^nu?}o6}FSPeg7jhl~F}&~A=}=U?(B^%o zQ%oUN^J7YseH0HY=*|8itJlrl??#@!TzBOu_TO+7jn*f{@_y&7KoENkBlX)mFwLkB zmpj$bBS$xtLN*|QmbQG~PmFTSNaJb!GKF~9cl|KhQ+!xFSYXRpb0#+pu|rOh=v6T; zpb?kI)InKf3#(?B0yz#d77W>s{wY8p9Jcgow(^>j>9?%YBG#RMT4gkr@|!XHG}_}l zdf@Z9Q*On2B+vefwI!P)pq<=wC#aKmKVJRkK#u8dEY$rS{dRXdBR?hI!Uyr*;*zmgJe7K-C_N6*J}3{WwU%ItT6si)-FCLB9MxKZjBdc3 zENLxPI@#U(i*@FoQjFZJpLj87a2#V`wL!~=Z|%T2w3uKN@ecb`c#zBhD?-1(|2-AE!-K>pWV?^ zIEPa>!V?Z@S3avBG9cB6z#keZ3XXA?6`i4m>*`0LkJYD)sZ;Ul5hj?`JL{x^qD-v9M%dU?0$QqPNkfnq5Bdf7t~cU(*pCt^M()%b z`P$?RZ#MpA;XrHu&PMsiyIz_-IOt%_x{PQQz|6|c3xuXdX)O~DR>$$vj?BHe4psY& z&okZ=@_#-Tx+vKUO*vM>DA!fhN?x0HL&x9aQ!+o~%CT|!s1ciu-%xP;TOWgq_fEY` zWtv^>EB{Y1!(mBOwOvGx0T{$MGj5eSl|8(Y)3y%y($wx;Z3U@Cp77Yr#cvK+Hdi`H zs`%JS+GR@_BK*g%KA$j;4`iK`Ahm)(bZ^z}K1DL(DBJ=5ln@D}Xpf;kf>fq`!ID z`N0R_ZchnE>1Ceu3mxhoC;hy%t&YbD$JUV8Onv75$ScO##Jg#LUu> z=emxt@7c5qpY>s0O>vzy7&N;GX-X;3P1t8-2oodWHy0#rA}apM6=A)Oc!W+r&E1~A z#*`X-4K2;d81iK};~TjdH`ag}p68-Nc=>Xgw^{kSHM#G0>zr!3l*|8^YY^9ZU3M8# z1s@0w2{k*v?EhUMooAmouMxk+G6NP2CAFsg(>hTD+iL0K{L?Yqhx2mltK;OMkO?xxGWxBI-fsva;Xt?A0>bG;hc_?R z0>Ip6zyMfi(fXy@Ief zlblFW$x0{5jc#p`r_dS$G9wwH7tW~wI;2m$Aa#fcIKIA+D*j7bM~dgX!NurHaHv=T zh9SX!gBI6h+zye56|5-$;j0Mx6LT*)#qzbEBRmMofx$;QEd9=v{HuTrF7o6oS2BO= zsf7AJMh%Y}u77ylF6>>*eR<|^iyYzPQ#}|mx_~V`5^m;)HUza`nXHCMZlt;0P)$pC z2<8o~JjE6^O3^g=kyQ4SUv=qtCoW91CGWh8QMoEbpsNRW-jTxdlH1s>hG2{$-7fb^ zuS$K=s)kur(|Fj)1)n(4j7&q^K(xn{f4)|>;*Va2<85hYjw7SXKyFMx@Avl+w@HDS zq+oU;-ogd)QCkK=>oDP0^ATrz29&>(kT zsV{f=m1(}wX%y-eaFjSpL)R34LE`>rE>;-tjc?D*2lY=4p8`mk9y|QR;>Rsoui3%| z%I~&6Own7Jc^b^D`$+UHr7td`v~;&iXR1ZqBETcpPg69rCQK!K)23z!aIDI0H-x$4 zPS|1yRy0TaXZcu1j5=1jQZCx?6IzFY0KAHm~)H*+K(ZQ#;(g@$8Fr zFV|d5Busqh02#c=LxpQyyU%-J#v`n?q4sJLzR;cOpJ+iu1hV$eIbIlv3J1i=-bk0p z_Q$E^mzL+70}j{}u`yhAD1ml1r9T3;h5h#D41|PY+Ew(pGUR`6iYn9ky-lO+Gnml- zsW_ks{4sO-$I0O#>dMRS@5u1Or=t^j{#9Se`E%wss#8O#Qm|pzX1Bd~m%q4jQ+F`7-9~*REt( zo}tNnUbG*_!U92~$?b!4^cH8_A9&tS)_&7|vld9XY;-Q5nJfl2caLn+> zhPGaW1E=voI^~RDJv84EW+1A7_a<)+Est>AEOMh*i>hJ$A;eMAY!VX+`!t?~f4$M` zm*A%h!^eG;qdjHblMoikpiB#SmyCxgbEd@q#dCsB@XYs(2w6e~)tHni3A8W8kmOqz z#OJyz@mx?t`PEIQ)jhkSwQwnddssx8d3xRH7K38U@IT=advLUcf(6_UhUPJ0Rjh5DAx`78H#THdaeFT`&(4<&!hp&qQWK zh<2psF6WandQ%)D%=2a5KVPID{gR8f=g3niC$F&SV&g<<1C>&y=czhVOZ5Y;QsZu+ zXAtw(?whmh>tCf0=QOPm0NKVC>37-+ku$@x^9yr`w6s0|h@wulES0Zv~%VALKf_1$zPT;IjX;zntoMx7B#Ae7p$=0 zE;jXC54@375LoliH`uO=^DeT)$dfi0d5tM1$)H-vMY$Way@EX^FF{^e&zIXo1=SAV z!M{`7*l_aV8H%s(6Zmb8Mo_tO-en-+OP(yL%UcVE_1Y9vQR1%r{s7Qa7sfe#5u>H` z3wjuN8*8k+$-3rHhnj`R-{To)eX`d^|Mfk84T=YynWr#Lue>>M{)742F^ej5)$~fb z?(b;@Eeu3eKd_*0juG8hVUqjS>cCOeh_N)yaer*dK}cMHmdS>zJ4zhK#|4}rV6=q_ z@0ckji%oPpm6UgSn^oecO0AAjP*otjG$#JbjTP$s`3O)>h!=^4^ zNz$B82d%LZ@oxq*gY}p66j#bFGWZ5v8qbE87kSSq0@YcL_O+8>>+WFH3Xw0|keUZl*uNh0G^k0O27ED!LBrTKeY7AO!Kq;xFO z=n8Y&w8>Wa^33>w|Cog$&$u1LQk!_`zZ6><-?<#*@@R(2<}b5>C$p$1K8$Zt(!SnL zMD0Jr0wyRb1|SEV8lZuX~gc+L{5I|#;enWRN)dJpI?lB z!aWyvGUk{{0|U?~V)P2aS(jNaDJ=yrtA3Y%cc>{TpR9K4C3cw_$n^+LKs2GT^qsQa z6$$o4ZyOkmaYQPb5bntqByh|LL&icW!ZsnzZeP4%v zo>dN>J3_wm0VmHKWi#sMcWNl0@GJU}ndl4R+RlkH*@8*sUX?BLe$nb~A|R}Z9TVjh z?|g0XQYw=+xQciub40XbHC2ghjrCMMW8u0q4oOhnOa*KZ4!D|KFiaol-V&|Px8RsN zL<%9T@+9pnDcQ_ml~aFGSjKlZn01u-++jsrw48Y&(Z5d@P6QB9Q$YxC8WQDiWpjfGcgwC zEeI1DqK&#~MmciI+Wr)0-RMhxdPI7xj|BgVZOCFo)1TrDeM9!C(tIe>hAYPn&w^3z z-!NOP0aNo1C2Z-9*PqBs`UF$;Rx|U7shS9SWGAUz3i|OyPnL&`q4$0OKJgz}6om*R zsc*1V8t!Ja;;{c(2lKft3T~Q790?w?;hGucJ)2IpPBwD&zX>Py?I2(yV!gDsD$Bil zR3AWvF`kk9`6fzB4t^7Ls?o+#{C&P9UN9w3WV6n@@14n@SVxt@}2DuhPa+ur{$uQcQT8=mr^Uh<7mO`#RncTbpt zRAVyxD>4pY&GqtNxX0>^j!;gNAfh1JH_ZLf+SSC#KRlII!b+2~BVeHvMFmvZ`<|0l z3MmhLQrg&U6)A~z5w&yyEakCCeJ@d2QZH7Qf5s7#(3Sm}*$$EPm8ral`PcyE^`JHa zdjQ?N-by%miL*NTLAByfq=>hI?@y}nOxLKy<^03>63LEdhn(ofdw7gEHR%T|=MsEvvn#@GNX`Aj&3qY$Zbg{DS}M=@8ExG zIz60C+E}yepWL;=dDc8{zs?HLbLd4zzIA(8iV^yiqrf1}@|ALYEW8DEyefmf&`R8n z-k~+L%QR;sfuQH9=bbXj`>hO!bA2!O%g%w3v5nz*3?ZYr6+L9EoTC#$WplNtmX@pD zhO1HpoExOSf42WgNW5fCp9eZ*Qh$MsWxKZkHC&4`@+j`>$nj|aC+wRjrGh_loW{%V zcDaLGzLsOiP%QxIFRXmfVD7!sVwT7@M#9PUbmP=d2^^I5J3AEus^ar$@S6~WaWk!i zlF;|W4`rP8N2~U^xaJn$v$VJSAmH;gh8V|p!#$s=qx236um1_n zK!IsupN!`N9CO2BusK?=z`x$%lXm3;sqfu~Qg*I)RA)^jCuBPSpi zmu1kQZr<0?a4`+d%Ex=xt{uCHUUS7kVt%b9_3ECAb6^gZCExK_>Gmf6FN#>#&xM>T zcNx8-nTGwlzW7SQ_jy0BBc9b21zne|)N2|2FYVsD>amN9-|_t976pGwG*8-UhYIt$4(ny*e^)h z->+;Q_hL;KL1cJr50~|O+CU(wvKzlfr+rK&0}<4_)~;|NH=E{nlog3x{-Y2;!Xd3f zK(5K>!)z7o;|+%+07#{X$@TJ8YwASTSDYree7&bZ5EMx!DWgEq*R;szsxQBn&pR%} zvQsz`8nV>c3ZcP8Hp&Q4>W<5@6X<=z2L`fDx3cBQUVmPuBrSpJ_F0WFsO~^~@X zQzVwm5uGg2;#;ko1y}9Ka&Hg$;Ob@m>+w*zIQ}L%uIdt{S8gyI8QvlnVSVRg6;2|d zbN$~7Fa$x?ewpB^CGq+br#OaTz1PZ)pYC1n7h?W; zHxU22ux20x@N_GkB?48cp(IFZ-B-%G^V4cY1 zC5d+DQgJ<07W|F?(~&DtorblqnEZ>mOt?y9G%CeZ(YKg*JLO~Xff}_?Hjv*MK3Ra} zr4!vq1rQMO?UORk_a74>Qk?-c3mBrZaXC;>V*r82b=+vW@=x>l z`oeqh_SaZYpCSV=a#%1bP!e2KL;EYj2m?^3W-&9-gVSPmVx@#a20lK@5_Hmf4;%KNtUqbrj(UQ6GY6T?nt)~Mr6_fIMasB$fr(k#ckQO^Pp($TT1UY_J?)8QOmUTBAG-!!P=fcU~X)ZayzxdwX& zv=R%?1q&OdAHM@FA@i!E>5iMSaCfL90MU$m#IH4dd4}(qOEHlxzV#=PeRRl@tFN=m zG5QASbErJwL$!u{wrb}~3|R?W0Sfq!Z)xm5$q z3kd)MOnpHps0Y6dV3nJHNmRz$1SVsLyYCY?zyXYJTO4W7WCqU`ntxJ;C`1?X=p5L3Ea}?A&I#sOlt}rY)k2ua6T-*~Ya|mo03}s2he};W zI1kB=R)~F&CQ1jY@EqqbbJ;u>0;`r6ld^jfotaEBgw-;%ih{#jtaJM9w8uw7q) z^nSQq&=?32)XuSPrX@Yo9z3?bO2hgcJ?1|5&A#q9faub@KqaXg)l>I zriu^;bx$_18zB+h$Q+^-@!uR%7zb2V9FGjpgcb_pz-Y5Zmx!Rk8lq8TA$l2zpjP2U z0FF3)f5s8a4`xQsJ@hi_8~dgi7Pqa2ir4JMJMH)*b4OBv zY)q2q2dG*J8iX-<0ox1v8S0bJkT%%fif;}Bj8On}tM?!o%42mDNM?%c=_n!i5?s$Q z!T)ytW``O4Uu6RmdQ2gCoG^LCf3bi_00tn`o?2#bQ`_+eCAFB(qO~Mdly+nwtx(ij zDHMf$b1BX3S}ZFCUZOG17L!{l2G2!5)YMOu&ZoaL!8lX*Y+i6coRH8QN5W>rcK;7B zhf5z%^Pm-8X%w?ZM?9E<${LR{{h#93SJ;#S(7bpz$rTiY*(N-J{NNUMl`kHW%r=gt z@#xJ&XmC7Y=C2ts?!LrfVl6Av9K+_#EB5Y%p^%Ye>~u;Ra7v<51d@mk0yLl>I)x%k zz96K9a*7PWh;iigHZOWRpR0EGEVfMQHA2#iw}aw<1Yym%bFGtho>$0Be>>S{aEylq z9m5JE%uEizsyI*~G#|@C_Ec*{!ZAn0nfAqoAZxO^(f1HGHOe6h=Z5vC&K`oRW}sg5 zIyv9A5TFS&vy6axXhoGX7)~#v*KxxHsC5nt5IdYb^l}tqrT;D^^d=0e{%=w-!TVW; zfox@pgro`$3R;zSavRCP9$sT^KDB=XB^eLD?;e37!)FK4H7TRrIfe1fe+TZg4odWBaC_5#<)6< zuMEuNC%BPh6{z!=9HZ>&sEwH@Wgf&jNp6C1za#)2iiSvyB!Auxs0IILtahea%(gc= zI-Rh|8kjv6fsq>^MDfY$dA|V-onRfNsZ-kV76Zbuc3tN} zpMpUUVZ0&~0M|iQ5D!U7V?b%+>j3^aNJc`9tbd8MS=R63lm7ZA!bQwh7*9`x+xvBW z^S7yJ3(>?sj}T8f!C@+ASHP}OBksFBTbr)Jp?H}ojLA%KvYeGgk=Pj=0Je}}7l{k4 zkU4`S{0Ayn8Fu6;N_3Ef3#pM!t|YqACNwopk#Qp03ff5^Krt(*K8#hSXa&d5`@V^! zw_NnOpB$I9;9Tz5YP@%524BrA*dmqW+-)v&2HX1{vw3zE-LN;)+M?@sSgP!oPvN z%tl6{F@oyfNjToO=~^dKNpkf~Nq;}SyTB^rWCa6ZOa@tS8*UOEtAEGkdmhseZ?vKE z2TiS#9R=XO?u}E!z`AWS9Nrg!){eR8zuC*eA<|Ta8K}g2D3no&dX^%LlXl8ZJ>&7Y z`$_VQ^dv}e&#i;pwJuQxu$v33#&l)A_bFi7$v}aF1It~v=MN2=^N)K#(WU-$r~nT~ zPQ8V9jkMQcn+khchI3kf>|ni&-&4+K#ZXwoF@4XQlG* zCQk=6*|svFLQB3_}qSFDt4k(%HG^!Q?$wjiksg1)$J2G$^eJ5Mei#w6P3gtZ`}si zK_Ty74G$HM>R2rG6I_ylyoYEfPyaLCbBO$kT=J}9W<~fj{4M_E#c{*{(OjvE6VMwc z7OeCQ9; zf32L!C^%oyrcxtK+)|t#8(z7uMzfsKvbai%gR$45u#C*}6My!HT<^*4Z~DAsbiKZc zy`4(B1uTftW*AN?B=)>IA_qvbxny%8WRG{R^zMu7tCP+m0%Jlye_Xc4cCNv%+D>Zf z{R6tJy>E}@g>Kp}#!-SVc&^#4a04*ncjJJC4<-WIiC{?P5j)qZu$!TIXkBYQ7GtjH|lV#{@nv*mc@H~rXL-xI2gqi#eLc8 zq^^6uA5|TfcQHH+kv`m+46k&&YSRO*gu}u(8n9Dhp5x%VcOREqs&>O+@&-?A9o5wA znM&5cPMk$7$E>jWrSJUm?T5HYD3zB<@n6Wblgyg7d{rpcJb%REbg{7 z&K#}-xt?f4NwcLg{>F*`*UK;zYCj^ngkM@r8S0soUERrYsS+S|FD-=AO?*)Q4=P&3 z&R;g;L2(n>oA$sh=+;soYx2Y?byIXbtPUJ9Wg6=^qFy-F=%mvuIQs1XNMx z$xi-03VhsXwskkJ55fKSnQ8k*F`{7jy!YDfXKNoikJq9C>rt!oe|fX|kkU#bJ&>B} n^jD9o{~~Lg|8HdN`4tp2jcFlb=rs0U;0}KEFTSnZ?Y`?ChC2 zd-m|NQ7TH(D2Vuo005xK%6w7#Z|?bDhll-dR9m%!0{~J$_KTQ?m*H6_LbjQ6D9g7;U`!yKgFfas{r=-ePSVDfN}1T6p=!iJJP!@&yMgV*`G z(;Ek3EeYcAfgJ*P3)2DxAK8E*PA93U9$dik_Bswu1hyv~cJdGp7iu%w@cn9Y7{HzD z!4rb|24v5Six9u!0^jg?3oVTcLB@r52hr5A?)ZL|Im-s>^`%LhN(c3SIq`O~xaX0x zvGc2VREJg`K8SDE!gZsZEv1B^WCzXy|6V*Kc$#$r@m~(lIo@vr5Ay$3l2GLRat@)$ z0ZAXqioE#q%%WDoZBbz~Q#@x=-BYqg2eHl;uT95LIeP`{cdy(#q7L|<2ax>RltO{< zn%p>Ic4EG_2kg%ttr&W|Gn7(?ko=K9@AFfd9Nh~>`Z-fn=AXma$a?mY>`hSd)?iuc zFH+{%|3`k=70xfuqjJ`~dokam@M1Y3wga`|XlV{uVk2 zs;>=VoD5t>Z8-Z-z1Mag44tqD)%wUc&U)KVr?1gXz#vz~diKB0YaiR~BsSQFzXlk; z5Hy?>?C&0dQy*6K5k9Fw`wq0X81N6Cm8KH3#sxg+oKa|Ryx*||vFZ}TZ>yPD$+FS| z1OJ`yCK&nQJ=I40=v3o1E87uNtrsa$HWnf;7FDS9Gv51P&iXXva6A6Hyy=B^9%YMhQcG~&QNV2G#; zd#pA}unB;E@Gkf2g`*s>?fbqndG8r$^J_V2=;>5P4ToG_pr3Ih{;c#q5dIQn;ofI* zl+~VQm0;Jb$!X8m^L1%)BX%L5`Aj~zps42;;IwMw9)S6A5@`G}De{~`w1H|fJRY)@ z-gNnu_a=S-53xYZU-smH^+(R%kC^3qbk{nq>C~yzhjsOq_v-GKfo3Lv5S|d22o8|eE_ zkNDO9Rc?ciD(He-@npUY=xG(uyz6auJEWLu`DXO=7r{iE2R*7sW4NpnIyY`bQr_q+7zN~0W5`h00Q@^J1M7Y=u#@WTfc*Wd$K7zBr!yg25XO+|zr9#Bs+N4Pc>j1&kc{m}jd1a?Jq z=?+iUds4f*Xw6wHlMAguXM#kt)ZS$Aw2$%8ba`$JE|>4auz_R%8uA0-ac1j}8xJy& z4XRov!R&_VDa^oJd1Wq9`Xfd0jtrg6UvfKm-u_*pvGe^)oA4Vd$Vn9p_;Jy4TruQp zxx2glmUs2&Wm)(@0X#(ND!A2g>XGR1GS|0PjgENiqm^-5!c_(8V-PSmO_6|7*ufA} zJgcItcy0HP&K44&0_f?_AW$$EiII6dnRr`Fl0aK|u=~=+jSydL4{TyKbVu`Ol6LVx z16III4iP{>`R?JMtDDoASji$*35Ulq$tFCy>gxn zdFJESndtEu17#V@4hmO$P&$^5A!|mG-_r>2-el;oQf7bzxCGLGwn4xDyr$vAio?tT zxC2DQu=`^yL{+#(pUW7oMz8YmFj zTeQi1WW&3;9YHG(LyD)&37wrjzmLrFaI9R-TEZ*Gz0BSznkPq!Q#pInTAr&J7#naZ zPXV&ff${;2ybwlcx;oA`^+W;Hl-F_^s*$}S^?#_|4T`#00!0SaGUd*-yP0UR)3CV9 zKm4&-W4ze?@~r)=zv;3tXRdz4BAz3pe@?Ic`)~FD z61MO-%;w9gL#gv|T?0MPKmRqclH9!U#(R_}L49FpTP^0)>@FXregqG2!(YgYwTrO0 z@w3kMYHHZGVDlWG{i>VbQ6JtKq`Ouli+VGAxXW6qNGD3)P)c3w{!Yd2zZJpS?fToC z*utTS9neyI{0cufA=IJQ3fUb!;0$k;pO3CJBPmf&Cw@{6DzCOIbFQxghSY~vkksWBhKg^)8n;9Z8n@{z zxsPjOP$Pgz08q0wW&o4APru2K*|WDrl^c51>?#S#Uvmso>3oI2(==wKdGzY?y>dz4 z!6%AsB%^NH5IKxYLJ@}1&lk%cDPZC<#s3kJDYyePO7K<@1S&5KEj~;_Mg;8j`>{l# zw1WNX<^!r5aGHZELt1e5d;j4S*DHiHQHw#X<`5FI6`_u?K{E;BV0~syN3^-vd>{mg zu9k%ka%HplrAgq$iMz`M+ot^vd?R-J)&J1>@yETn^GY*cWF@5vjAG$`v|4-eZlz`u zmL}swNSxoA1oW_biC{GYcc*G!|$Bt2pEi4l(%qLT1n2|-Hyx3wl1Y@2jGl8KAEMcjnVb|sn~|Bi5G?6c5T zy4Tpy;W(L?S9E>-K=#MjE{Qzb=9wuE*~~M`phK2WA~(cPkwWMV!y2(-Yf=uFfi-c7 zQ<|vUYHLr$yj$%z2nh%<`_%Mu`?DZTg$4xp5i9gqc>N7iTf6JR02#YSoBRNi+GF}1 zUvxF)et_tRSD1n&(QJM=MUWc}s1SeQe~$}8!ohBCD@uS2CR90&lu5?vdZ;qT-Dxo_8(jFbbLoJz%7vnkyc~WJs0Rm#FN2AMdr(&0;3@+t zmDNsw#6fD3Cn?4i9IjYwTQoR@wC~_pnCIKRJ|A~MVE^U>mKUz?j~hrF;w$dXp~BA% zxSIH}^^HN8$w5KmH#M%HhQ^I+Oj3LBGnPoV^?`>BhbNZ47*=8}lUSX^Jddaf$}6<0 zduHm**Prm5s#EAK?CMBSkvpx>+UA{Ot-UYEGK^QdqUOo0L}f~#g;LDIBmVP01z|R9kcEwyQ z1CpZ5N`1p`^CKhG&TIkFXuZ7xq{oEa9Ff}P1JaGOVT@r6n^$}bgcT6G$iiLR6p>I?eIfRjs74$?oAhw0~iI{>O1(kC1k;%A7y+(>Cx%+Vj%l zeHZ#$!42QxioU)fEI~(5iFkhMff$G`z_&S+qKI$zsUeq*z+tFW119+52kNs>mQpF~ z$Dc3Af|B&;eHTA)@l{iFTkUBqKiLeM-(iqG4>`N|VE%qewZAqJT|l{T8ld!(pQkTB zy>P&c*0QWEfOldkedm)c{n@)D1|un0GvSH~=vUr&0vecp0jA<+G&bpH>nz1Nc|(5! zKJ!p6xZy+fpoN+PqWEMqGf(vAst(%89wsC`PEe=dGHMj`C-V6y{M+p?Njh{*ypkV$xP%0q}q?y=pl$a4j0&GaO(4{#lC>qme^b?_8*4(9!MIKgZ|dc$rVbRHE%VG{E*LpwqQOe3 z#jKhsv%8@UQ^6QQ{tDl7lnWf)pl^M1gzqARmUc0XKZmZ$n?qrf73C(|y8MDE-MiWF z$~d)Q8fE@6S9;CmC9|TYF^(QuyPBDexjKp8M0D~Mk*}L5d@fJ(E4gJ8VY8%vUS8PR zPejSijR0{}v`js|2Fe`R=g`24$t7)KzzLK3l~ZcueEG5~{s!xhMt#+v`4@QOiu)3h zP=8d$K)zvP8$-m6hj;}gl5-BvkiT|9t=;0CrOH{K09&%xU4+A_$U32r*Vm1}Bb=?3 z^O2^>pQlL2bpqN+24R^BLG%o**n)@dxc>9k)(zLFJJoFTab(mVd%1t&$`SBRg7Wjf zkky(C5CbE9CrnVla;;LmasMF>Iab>(BK^C#Y`%@cX)7ux+0{x{fj?J3BhxGD=UPy+ zBaxIH6krsZ<6M`KL}O$A^z0%X@Rr)0N@TvIEL7XTXP^vFHg}E!@!UagBi<Ebh=G`*hp3za2sgVtbZ%#EPh)&X2i&~2rNkDN-@fN z4ZAH&bRn!`-spk>N&tFNSjnmA*ud9T{+{W0B0!RA1Eh1@lFBSDg9IMsMJed7C)?{p zL~kQqP~u*OH&pR9hOYf13S+`dq2KIXA-QjJHx$3_&9kF%yV^rSiE`Trx(g4yv2nS_ zHfWySv-KLnJkNmh6w#a-r}*Vd3^-#!GYueYs?YkuPZAC-1%F+kz9sb+_8XTrztA8A ztZ(>{uUt|8{(Z-W6KK-I1`@CyY+ElSL=>3Uw?=dMg5hPW)NsuX7hD4}L-8wp0UaS~ z#zYJWDEKIvkjjkgX%^|YN2(3_bR2#zgtpq-jRPQW>hV$rwGDSV%D}Co@Bh?R-HvU2 z=812u{|Zik`aU)W2%?v~k-3U<7gI4=`%bdgA!QB9puOP4Az=9~o5xWRSB?yjvO+?$ ztW>NEk_qeuC1`)-Tkww%k zlcWMH<4E90X~|?F{~mou!sj$4^55}^k+W?J^|h)MSuf=)fw+0HmN=m!{j%o#43)SK zCGuYC((578&S7uxH|gcUh$rVhh6H}x6skzk3A}aEQMKQ-Ydabecz+S7h@H=>4)dMQ z?OCwpWu|Lm6gXA~@yaTr^ls`k)V6w>z4lp+BOfUm~|n4_%ddB6b#|z3(sC9 z5mQ^-e991z1g0?ry#5SD>}piKvrl69n36E|JO?Fz&2Kgg{IdQSEx?7J@G3_$UC@&x z*17x)=x|-38GdS`zu>>cd|L7}q;!YQEAwfYAPGNDyzpF29$3`QQ_^D{f8y$$3`Ct{ z5PfvzDE$Q3pTxLKMY-Ax-|f)h8sOf9&p0YLZ{Oyng{(9|ZqE)3Icd6`cZSgqzm4WR z+9Cry6!?a{D=AW*=Bj_0LH~Ixsco>ovSGnefgZcVyXt7fzyS|}rLglYMY5On_OVRu zGG{(kix(Flv%Q|VSSZRlg+P^5@#UPOaL1DB-HEInKa43@v-9ya=UR^^K;~Za4PR7Q zI^+Cx_=R7s@mk3m8@6${;^k#<40^wmJIt1 zc(ilyLWqx=P2@e<3@dY|zfNhz8H*tCiOSA27!^>FPa|e6*Btn2hYQv0~rU zy@j-o9Q}HvK@j-k6;7GvM8I1DJ>~cM0Swm` zL-cdq5QG}X|-hR7eqEZbq;U|2{`l`5lUNbZI8$ zBJl5H#U#;(WmDCn0F}4f9^%t9MQzefz57?gp}%NF9K08?tsMgKJ1;}NsnquNQoT=W z694I95yfU=09cE&d$Hh&x=YlA-Bzkc;cbKp@#KG5OWLiW!9|QmG}nkt&#oG)IWvE1 zt$Z)l=fC@P&bOH})XV9WNH8Kv-$t%4iyIx|Di6ws<=I;~fBVcafm^oU=z0^G6Dc_0 z2ukYrZ=)t4A^4)xgB)e1h#QA5ZpyiVQK6*8T`?&tf}Q?vS>C@24KPF|_oRb}P5nvdvbG%MhNYgUr zX-N1xVSqua7bo{A&E8kdLvw%k`_YT}&w0yOENts>&}Mbu!^zm0E~!n<^t84kUpEf| zEdG#HA;XN>^%p%b2NS>Eh{9Y3i^8_STHaCar}`(U`s){2qosGYS((1Y!?;pHIH~6?_x4h1hG2D?a7b`UKWNFX;j@CCU83 z+K%skYH97W)+)Y;x-4x#NRbxYMNW>W1HLV~9UQ8Ff8kDVBUkXQh^Eioy-;YzMH7ZBB+ReK1WC{_#pW>UF!sJS(g;aL3O{S z{uX)PY;+Lq$*TN>3S!VQv=~K|*mq!~#cE4h@;e{$eMIcUT92jYi2L_khdr5BB=F*o zguvdEUt;wcaIzUnW@)a7eaT2i<21&_SX9J20nRU;@h3voic4JOkIdj#wSOd1Mh4S1 zpmmrUw<$25gLiN=8=CDms98F1Ph3vS^Wt6D{$5O=K+gV?>5i9`+9cn+HVuQU+du*P z4aQKWi!%%_kr`s9@PA&!owJ}{*xQ~1@uTvXdMXl>PDr_eVa{1*yha;5_7BG&Z$sx; z`}wxp9i&QsCNH^=2fbbNQ_KGyUJ%^8*ONz?2yRrm9B(HYu-;;8$yc+Ydt8UUE2tT;X9*H(E0Mp;Ai4(uoYg>Q4EmHwLRSb`76w`hzqOH$R}{K>o*`&M<5%enwICWZVQxAcV?Sg&>&o+o?bv3IKMd;_N+zu zaH0ETo?Yj9bx!qEeDKE7YNeMa-hqdl!$bq}iw*esTl!q^mi_5;2hI#;uU`|NxBm~h zc#Qcs1_Gdk)9|HP3Kf|;xiABY>{jkgWx>%=lc?vEDfSaZNV^ejQx^N_m|nLR+M377 zl&%gE{f6K@R1f?inQI}YByi}=t1B*hKS>EHB9QA0W_+gHJ}i-I`o{0PJRfgJThfC1 zsWU-idS{H)6Xr|g!#Vt}w&A6=%bf$UzOZO?2^diBl;nQQ-4vOq0N>?B!tJvpO%ZpA z5%YTIGIG=R`C%->F$tjzR)}di-#7Cd&-#-0C;IK0-j;5tra&crJvXe$YNN&0U3c=4 z#*U(45NKeYCZvRbAhpm0m`D3vqlu(#B_H}0hg~@-=a#&mWu_FTrP^Gp6u5*eOVj1N z1@WX^LsjtO=r9fxSjHL9{8YORg5lzYGLva>plod{d4vFV`kD0(#%Ah0fgixY?~4>T z%gNN@V(ccK?Ilu}V6tQfp>^JQJR6?qJWL9D$cp?ntjg%ugr+^6=ABIC1_v#$PWg^- zbDqaT5+;NmJ;wM`b0hfxZnu^kU!qx#@(p{QlbKvH9rRAuy+OQ#%>)AHOi%JxtL~U9 zn~|JzrKFOd#rkgaD0(wb3+L&+*SyB@Uw^hYN3HtpS?-0uZ6qHB8#%ChK@Q`^*$NsrE_>&AtykG_d*S{Mg`%uVn@2w8=`#(J%Y6T! zfu$yT9xD;ki`;HxtVjagvRuESF75aIOZnX^^#eH~yuzyXxu(5QYgz_2UH23}5q|9@ z#wxawZ^xoWdh@bmzCX@N9Losq!oxdReyi+a>)&0<5}sCji>ajhi#LRz@wqh9I@3^v zshgeRGYr}pQC!4%*I?E>N#=e2C#}lwW2JM2OQo+3o5qsrdM%OWr(S|my8QpO0J)t9 zCb+fIs`LSPH41^!I;o9#C=VNyn8u-i%pPLrB^jRI*<+U3UKGC)R`m`#rB<)>f;j{t zk|hW$8`M+pXg~8+`ZAe(*Dp2ldA3vdFLQ;a_G>P#`t&(ScH-~d-_ z%g3#JhrhJuu4{z6K5cyFJz8;d2bq4p53`K_E|nQT-_)@hEmm_Zw2)~VI^d`Wvz?8< z-(8c&(-jq@Z8iCg{}7>H8E0L>GO`9_UUDU5+lL5FhO~pE0LVPTQ9ZUCHVmKO$CUZ= zNXV@2*33`F5Qk_^S2GyfLp>i8rFQ98xxc#FBIM^SKco~9y8~#7rK$vcpv#3(ste(n z@_PH({;YVF=wQ6jDn;3W($7i~0E;D`Mwob8ounx7#k7D6ycg<`U5rG{(YASlw@fq$ zVz~1OnSx#7LxmeFI-3B?rRr~{6!6a`UO~qfq;4?R!S7I6WeR$ zBsMQ*lqn_?-(41&yT@jyNKPf!W=))yL*2-)S(`=p#A|^;t6Xc^Eg_8t%CFcyRN?-x z*3kpCaojU!0Gv9bU>p3TUZ_T03PZA!w_>w)q-8pO{}N_M^%34=c;^HP6T3qpv8352 zal;o=0~kd96edAf5M(6i1?Pqr-LH*&@L+=`Y?k8ps0h)(22y@C9Hby>oko(`P%<@3 zgr#_ABjI%$3}0PCXw->w{NyC7{}#2uRGk+(QJSu<|0rK(l@&4k&K;r3D@nUu6U*w2 zj5W2R7lUS&kno`C!UYaL$0v9>$;#uu3P$5kH=JdhG zf%_v!*2)<%H%zNc#&)qNx%L^>E~v#i4HnXHfx?0Ndi)k(3y`{R(%sD7xj#_42P5Ei zi%^8^#K{B%HS)+pUHz6M+>Gh(l%Q{f zv(kwVKOzv^w(1$T;oe8E*@IZf~sshFUTch>z8 z8{^8bGG+jg&OsKH9=B$9?G2!G#EjPS97zwi4M5NYn9{}`B zt;zn+mb2Y?|9+up4qcn+R0kMe?s~Ya6l=B{1SiGe1DBtqP!4hZS09ys_Go*ePYC9% z>WXMDjPCfBpV%-*!Yv>J9Ui!EVaN4f5CDSw0-C-r^hs0JZ*CC*^Er3IT_h4w!Wub?t#Aj0D3kKF@1Kfuq==hhj>8Dzv#rZ{J`UUYy0 zh!a*{orR#rjb3?yZKO{@6e~AEg+gEa}SNKHzrGahq}y-4fcjRyrGFBf@8ctlpog1a%=GT%JYS#+$6Gfu_4- zIM4w+>iNQLB?p|>k7n7crNUWV{_i_7?H6$_EH4}b%UM{7jc889o{^`%#m9dUzt)e;X-1ldd_6rk9-cP;sr%TkmuICZZ z`H0C)*w!1irO(QKj}v%k5XPir!ML+m2kXB9n1I(8-5-GHsi>qYvs3cR`Nw&!W7;>G zrdEn~vm|GHd*Atx8YXMJ?xdJod`}Hn;Fe#bQHTUsPWCPFCsqzZd-;hTNg1k{Bz|Oy z6`OuL)ByW{DE18$KRj8znfZc&mJcoCTU@mgKTzxXYs(%|ppoB*70?0!L@A(qFo685 z^ymHQ0pc^jIM_m!KuKMhJgmqcF10#yoC#R|^~d$hFBoxmJ{uSCaeKw((2Biq!>v!5 z@d_tojsDU2vUhIsE7m2yos}ghlL5yBN|@a$qB5}4F~+S+f} z&vDuM;Jyr+me5ycIT@JTBKlG7(Z~nkuwM6-0>0Qw5$AOQR91Ij712J`%0iq!< zw%twP(72yxq(d(vi%|&j4Sg$<>IjzV;+dxEB z(RsAH=OI0&3vnYBPBCA6(xpP_Qs!Ze^HD=#mE#LHSc(3vZ0}!8DXPu6VRz6es^x=` zXw$?nJb#BnHGMmqhOYtQ=LD$GSX2tGdjR2N6Crg_d_l|v62vZqfVCgNh^qPD=$QtO z)z(sT5eFKWf{d-JmLFw~&|WxH51o5wrD~1Y_h!{B#m~v}4dz1DzKj7##Xy*BRK*C% zcST+m{w1G-SkAqJT#Tv5vUBL=0d!BmNYef6qFKvlsu0x_LEnF%=wGfW5P6eolcf|5 zmmO_M?My>)$a0u29^|p6|6&a?mu4I{!w)H7YELSky3x$|g|zQSSqTHUC^foU#&e79 z`el5#n&+K%DWpJBW(mH$2!V+tFD55aRfK`6f%P5>mI5IYn0}{(CD2xse|NJ zoTivT$tC>FAn~yE0vpmKb(I&X6nS!rIO#vu4av2UfA^g`Rx1dNA=E~pyrrOQ^ z<`paJuNNz(IP9pzJte6@FL2o(~s45-@3XSP4WWlRr20Dg9IGF!thj@ae$v|2>bd*_e z2Q|s<#O-3l!u(7T%0caaTYoW*qPP#}!4n^=(31@|Yrw)IdU>WjQe2fEaCQtYqaw!a zE{bl~pQRs4>=JGB^&)ZbQleR75Jl3wh3n%>lor&yxWGBz*3^9Q=Om9XzVDD3d+U6b zc;qkr%%h-r{yDp*9vn3g9qlAdSPXMo%#Lcs`(fAN3Fq?kZtnfghc<3Lhh{n#y`O#? zSPk_b$;)kk4$+J&yBF#uiO8eN(@MltO2!~}>`EWOYV@jbgPk?x`3J~!#{_lnn9^m{ zWbYr!ky16=XmSZlLB%(!kbu8~4T-BiIwBt!zKerr?9=g8>NhU)PqE4ndrgg%P+aNb zHC0z90ua&-zZbq9DW&a8h?nsJ^potn!=-$fnKN#%L5VBb=k@B=WwZ3=3wE=kM2|sVE3;MLyLR*VgdM-OUKU0(1Y<=bvYqsOl87#7iU4nog-S!Qf z*A=W=MAc%5$qb)I3o?T=1*0(zY3IQ`=*}cg7TYeTs4vB1F*=KHTTMj>k&Oo~l6+u&2U++GT^G;Hk4Ig!dGsA`gB!%!Sk}1whvx7*d{H|V%o3nx@b?xUDc;dUX&6t^{~v-EdH>(fQ3jq z^rc8{f|hB7l$t*+BD0R z!Gj>_aS%LTg}6@D`l{E|$3?BORG;=wb&0vv(^7V)?0TBmkfj8?WBVpqHdNj zN%rcM{5qnNd#ckkPOpPc-bJzfRO6ZQWV~<~Kdm{{o_r2gl&d56>-F%lRb+z?zOQ*5 z$$B54`L(rkTOp!y;{mXhTuhOBX>ZMXl-k*$O5Y`cAlGjm50ugzvyImJ?w=b8U-0u| z58DzKvIFcuniX19wWJUxQS_zZ;u0=ooic|@ccU^0DX!=vW3;3!dO5@WvW~$dFURx~ zp0S{Ze<|R0VjNIMzji(Qb3WDnH+`^Kye$`@cv~huTzk7FRb5*FDFXGlOFxI)^~%Nr z24PaNsrqmZIJ6dL zTg8ui_qRxak%?LCf~V2ft)_Ze#A&?~b*Q+~b^|BcfDLA{^eqkQp?kCA?7BeP{|ohx zt7oy015Lc;|K5mtCZ$TUR_;B)#^rzuRiiXvcnM?1m1~RlVXhD-A0w?>b@*#di44i$^BVIqDae8?Ova~ z^lZ7%)^{d22zJM2^V%H}d-IYg@dvxSxj5n6d~rdEg`FM#cHl4w9nG$Ff^_uetYOaY zH!`{g1}#H|K51O_48txrxvQh^QH3cT6=s^wSTbJD#~|e>it>10OS4liRr03 z@X&z|4)#*lNDmdrjttu`TJ^omaPeb~59IYq5cIMm!2R@ggN#lm(#X#;C{eqy&gxU2 z*onj@D(+P&I+y7%BaX)nnkSzlrW@5scHUMX{~OTcj0xc8ln^xZhr~5*bWS;~xh7T& z!(P8!%yVoUdJr?p1mpX??Y_#r-g`R(x0vR&6?+=eAG(7{)ObEt{jXQ7(Kd~Y2j>X8 zF^m2N0gtne0D9&09i~bh6=+l4o&fsczTJocjd%?KeY&(Z=w&+R$kFLyTvFU%jgn*7 zNGT=~E60V8_!*fr*)CrJhpQx^D*Vw`OjhSB0tCx6)cFUe#~~lApAzB0-*W(oD9sj& zd7A3+DT@{pTV!A6<*(5SJ2L6s9zmytp+Z%N`HZIn!Reo8VWXz05MEJfZDnK-9o)e_`0-^T9C6Rd4A z*hq;sH0StDIubxX4%jgNK(W(;VD-l@%DACfNspLj1^vUJj@Z;MFpyr=Bpaj{1Dg+M zRSp&@(i;k?N#sf?#hBX+dM$+01((Fz1^4-STjHl3M4+_3eLbB8xjHKkx@Aq%MM`cqW&<9#!W zvM(b^vxW|Gov1?1xk*pDq|yX1Wy<6?MDy@4WZbfhyNNAHU!O-17RqS6sbz;%Lwl=k z4AX_6RwaiJXHkHHguLX>$%y*BQVG=X`J)w+e=0=fWzKl47n0d?=`r#5*@FLC(P@(U zeo4F-m347#^GKf1ju$PIX6iK6}0RllYO^;DcsECltvk1iOWZ{}mc@r{XDA!>P*pKe?EFI*>j0o=VFp z-hjyADBI!+UAaPAvI4INFshTChAt6kKLO^q67=Q#K70?6noZ~oNk}lHEQDV-vc@{c zLWlw~;K(3(<5Bfb3Vxd=khP)&sVlT-2Wu9zTGLu`sNaliZ2ecPG;)+- zdJJBN0Ystp|I7vJakN~5M@23q)$F^8Aom7YClargq`Ffhw`w)5toG;VJKFHkS9x-bLRm=9o@^{HKipeu zeo-!(CVi}{DK?3jXK0N6heg6tTwSe6TAN!cRx#7>O_umgA&b1;$~St_*nv5qNFEVt z5|AthHVfEiXo!kFD=NTPmH{Aw7qA&tAJojA(s>qNyEWq_PG_0Qz}4n`03>Wt_IyMY z$anao<09xHjxK@Z3zg}mP9A?_%jbVm=#Vgo>Luxnj~Tz0s)fI+LRG*Uqeh0MFwvAt z(O5&^V)vUe(A!Pz-1;<$Z;5<0#zKb{b60n%`DpQ=^*Pg{&& zJ?J1f=+}Nc;`>rm$)EY}>juJ}{o8l%_)AZu-C{B#2sl!_N|3civKWF$QD)IFm3k68wHVjWU3Dd0GvRz^2~G#B1Z5 zA}Oe%H0ZMmc$L0YLiy)pmm&@KtUf<0tSmfHiQ_HH zF^Y6)+@PBTctjg$oLe=;dG#q|crP}VK=(3A&)RGzxU|C{a8zQJ_#hch4!qW`K^jpi z5 zfq=z+io3l3l5cS!2ws_oaML=#`eQCL48`e|6)=uA9zN264YN^}&bi^{KB*%+J=#wt zZ^QZ1%A8`+VW(m!xkxHhA}E|NUvsYh{H}=AfQJB4CSe|58~5GKmjkdnOl7f`kyv$Z z+@GejbK`HuXcxo}MU`twBy?S{{<7igo+j_zJI?PpLHZ1VSoLq>fCd0LqPB~|{z+Qp zByAt2hE}BH{^N+O!F%)jf?NbWS+?_3o)+c<#t0$}*W*O^D{7ofT`o(T5Z-|kzzX7H zg#t(+(6oC2Mu;&lLx7G5FrbYRRQ7cM6iW!UUr0vEOxyE1caf4}Vhe?v`ugvJ*EAdI z{&2Jifs4Gr5SOHc?9*V>Ud`hXaES+Oq64BVaV4q}2EFHc8KKaRos|~5gm&PWBE)H1 z6nd4?-mw{87UZkYyw~MALP=}s5mp$^6;I%iX3yJu%_DnN$F2f;Grn;;wT;g{P=oPz zW++O)SBa%R$hD14F&mzqwYB#c%+Qd9yM=JmxsHt_0A>m3m*%4!vA` zaY3-8Bb19vBAt#KpLUu^hmF>~2}R5E%8_^&BJ>X}_vX*#BTPmH$yiSY0RGz(<0ps} z%UIiK2*&gFY<5QgoCcj8qbG*RdMWAru}ka-pAv`GqIux%&;tpmcS3i!=l8?%7GHdX zxW=4VbOc=>0%cF*B8BGm8~lL3usfo(b1!x?s1D28^?e~xBzhBRHG=wI3}Nfarh1_J za@8mw78Y%=YRm{Ae-T#Nn^sk_rm70kkm{(2wF~$bV*-0{|uj@B&A7N=>3wequ9BM;YM{ zuDH*wR3^(0^Z!-RO%Zef?^hZR{8_RCfZF%#s_cqWb@%adck?3h(~zyVzU`{lfk^-` z#v6o>3@^-zY?6a^lp|`^CRg5qb|{R73JvT;^J(*V`iZDT3ebXr(f$KwUFceRYd+YU z0#!LnNfu>7o=MOV3d}L8t}>d`WQs<|bA}76QaHm18}4gzAuW`fF&yKPttZB+!tD+6 zxw?q?v$%j8deu*8QsBJhxF}m)oC+2RkONe@T)u)gHH|V8{v8LvKz@JS3>m(7*$VIY z%}e398V14FpsO&76(Aswi{0V~vK?z2-4Ap02u(11Z)rx_f= z`OEvSvfVxjFm4#g<&>QGr!5AE7DyM+M>+39JEjxWxk+wA8(eRFAQpV;FHnE)GUbrkxC9cNxeIYw%GP7ae{BD40Lm z%;D=F<&ijlZ>fEH0MbZ=4CvP30A40r$*UgN06@XpAmT*wuzD=7E(Gtl5}4HExIxU4 z|GqJZyZRqq+l*C-VkNZBTPHVG70Tx{L5eh*O@U>433i$S9fLXObE(7hm~|u+q-Z~Y z&>8ZL3_zZ1VyGPDDiW}~{5NIIFdcIC@`N&RID7n2Jw_6&l=aI@xkAzgxbO@klz~u& zx2A}m`&G~fwl^3Mhd`G#X9!(@@)ZHXB-etzXhfhs>e3ntqN$vD!z2Gr+94|FzJ}k62$XEw zNNWG{54Z)#*hB6T0Dt6}zl30u2-F~{|7=?M9B5yIz4pb|xW-LnG|0}pX2`fgY2X@}WrWJg zH4?J7h>MD>s3bD35lU84%C-02GvjxE|G?+*_#)_M7zTw?FSr@fCFA57Rswz}>qUgY34r|QtpT(D zYkWrvSPkgD2uK(bV;Z2a=~G8^0&waG&PXumG(pdcmyxIZS%cOib=Q_ZZ`>qa^Q&+@ zPlYvQRi0()@xUGMFJF)eGOM@V47>ZCk__!5`DK1ZNaM%{TH;}ir?w5u9tpk7`8fSU z=Mp~}6yX8I63S=~dx;7BeN|k67V+2*i@yajzVtoc#YOzL1M^9sWy#}RuDK7n#1NB;avrrX0Fpd@)G|ag%BAarke2w&IS1CM>&e%`a?S|LFc>G0F~x4b6N3N_}G~wUd3@0079kyg$$QqL6ifl z8N24l*B*^E$OG?G(BY!X&i}9exCmo)>c?=sl;j05^(gj)RgU5-vJl z57qY*p^`VPfRq=h-aG^c8S(kg0tas{DqpL+Smi}Lls?MB+EHy47f{j*@eKitS&wlQ zA47PL+L&1fRa1old06E~p7$VYGS?Jzpv?=wNb2Hm8?hWE{TV?89L%bB0sg{WD+PY{ zsO&H%5LfDC{l+89Zgj7cNx-PK(yzvb5kDtpWRPGske-)NcvfaU6WN`x594mKG1eUDP#@Y0 zspy9QLqB_FpolDWk+X{bOlu#=`{bx*jQ^@Ur53vpqtsw~jk6KQ(DCYD%i{?gu!q18^{ zNbJYmsHx62eGc%!g8+TvD!79e%i*SFd_$I#(rsw%mW1nF)z3RlO=J(a8s?-3s6uQ& zUHpsI=)iK=4anFIllB|vaBavbe+*k^n0B9iD()0W7%I@M5FhMJQGgO7Bzp5uFEuF) z;YCtCk}|C+a8N7>r)Zu5v{5HgZ!K#au|Q8!deH1;;)w)URJYF>qMgfFhY_fV#e*Ws z>nIrTBGC$svI+&0M_`c*-8QpEk!TSX0qK4D95|V)X!tTT9P3nCo?Cb28*hmGsID9g z0Y-|@rmwk>N*68QOwNgBFi@BP@t++pK4cPVqR)exLNoNF;)6mBbWxsNUV0?Xnd5Z@((j zE?@Vgg@V`)+u_fVGxFrDE!R{7IMnS_6SDj?h8l83j>_nmk5F~#RT8)*{x^5P0g!Vk zUU$$BOn3s)|GfMQW;pp20jOh@=skIMKG6m{1TsQ6Bztd0s@huLnDE?@H-EBsff^Z6 z=W9E^?FB4fkL#}ze7+g}9vPQf8(;vUr-ZU7gMcyIVgeAb0N`;8$&oN>eH~090fK+_ z5gz~Wi(>|uzJ&y_usvGqN%#xfmoUdUgk5{+cIteYoB=~v4IUX@FJ+lfy|PLV^Z@+W z5^2cb`XrN#0%T7;^p40NSYY%7cyVpVdL>Yl5ROiHiZ)-UW5}9lyhMkGli1k&8^uKc z4g&q8;awWmvgk~M7U1_}kc^j5z4XAe|5q??K-wzmzOGbpHx%5_BXux1+$Dv6Kg~JL zZjz>jqMT1m0e*vk|D{_6$3(ze9UP-I?U*Fs7Pu99LI4?nK(;^R8t)oI6a)?|d6(VrhOaL}ap3h0wr-}I?`DPfFk?SpMNDW^ zudWq&hNSiWGBVa^3?We#%tzAs>@*r~w9Z2NU#B8`*Z%?BRS!dX`&Pv1g5QDVytRKJ zah^28-LZc$eiNx3G=T!(4XZ9Rff$pOQf06KC;@kcEn}VBqg0@rNDN7w>Fj=V-G<-{ zAgLZ$i9wuUWLXqsO=gy8reb*?AEi0*VVXS_t&JtY^q@dp(D2DuYqA(~f}~7USl41} z1_1y9-iw-lEh4}n++n2g%|&3YF0Q}%)5Ol~@L^SV!=JGboji?>W=pBiOopG=V1wK> zUfYG&nIgqn->6wJbNH*#3^sgVhhk>RGPHzk_TL%1+7$DKLMkh^C8E*5GE2M=D+yz`v@9^q@$k8hQ zr9VGFa-(SN+4U&(1j$*%01Wlzv3Bl^Gt*8ka5Kb2j&0b17^^NIo@iyc6SCli4-yZO z_GGR;3A9%~RBfV*gi+uP1$t5vbHCR}{4e3@DMQHwKdF8g0g<1UZldyEhs}8ytw85T zZfN<}RwB>`{MQSl`40DPdhrTm{WYa)HvFa=i@`%Ge(Ql^pE9$p&N zq9aYzD{+h){1mw>LJA=v3~iJt2S3E-JA{caXFi$`)3lgc$W|IB@*ZJc!wgt&@2X@v zA4$~RTrWucMbC7L83HB$e&`1t?N|D&V z6apC72U)-#H>fzHUWZqVA44={AJ!RwVm#HnW%;ITsF8$r@`z+1w2!~EpXUoC|3L2u z*^g;J09a69rIHUy`NtgHfUGkb97Wjx;5Ra$m@;Vt1?%i~ZM1v{tOU2ydhOef=YGlX z_5{YKT{GX}J96eWoe~HAriRF4npkbe{Hois@3(uG)6qJOUBXN!zZ8=!xJrF`cdFFH zgh3r1k~|*CdOnf4D(tJDV#L;@iQ(5_UizZYaHe(<-z*|EyY8eIaY;S?>IGuSchj3{ z5w~%J%uAC7?#jXxuQ%zt6UZ}Lq$sC34>m{`f22yVq~cP~vWp(#>Aeq@j!!V8exxJ; zwrz@)3eWm}?v9Rky+%^)JLhX(>P}X)3#6MtspOneaJn2GJoYp;-+e1)|YC`Ve>3EANnX>^?bJB5F zf7HGZz8aIea)a;gdQ*u>M*}s<|L*3wxPU+nbfjQ!lCx&<(b{!ay(fcVA=G4Z>HCG~VnbtT*0H`?G20I?jnr!D!$k~&`nEem9p)|<`F`_#!pK=k4&-50d%f=3gZ z{viA9r*J|+&r&Jc6^Dj5-AsU2DEodHV0if_&S6zoF3MVdTLVSmepZ|Dx~QnuYwPR^ z{n$kfMFxfV4`BLm!QSqd!xdLOt-X$dJNrWi%$I5{6Lj3aJF#!|Pu9NKi9S4LNSlH- z=|1{MKO8&`p8#-i=B<)xiH+Kx+=R*0<>$Ixrwx=VJkXE2g?9u4C4F91zsO2ojy(Gz zp}-_6Z8n1qS(>LL+n?umQ!wPtmSB4CTcu}lMzhV48U<|`Cfl#F?outqLuCK)v&o7 zD8pD!_KoU9JCCZ^ofWTh_q9aO$tc$cIyWpjtn?40xOB`5i1)w8^N^X0e9SOW4ZUuI z4hZagtdL#gPrl!?daRY;p=;f!oOOuPJ0%p6%ewsG6S{hySlb0SM{xCTrHAJvt8-5G zBk0lA9l@8LF+5RihvL9&CHw z_My$`2Hm?G!P%J@q7gjFH|ny6p4NxT*Og4`b*269G~O!9&Yum0v-!NRe#gUq+dG}Q^E@h8 zwf$qX%OEA)?)UKez3Q*qX?qGBfckpxThngJ>fgqC-)ZNWbsyF*kvWx)&4MM$H(aJ$ zua1WdS1Z^EBm+apqrWtpHW@SKcH*)TSJGW}MEIrQYoj1!XBf1H%$1?N;vazl1PlN9 z;K_G3MfE~wAUW3nfhix&0Uhf(p5E%ITd3)5OjDa2B zJaoIMOZD+Fp4wGY4eD1`SL+daDI4knHjO|=X}cUNRZ6!)CR`lC2h5pj7k_WA?iF6| zEc;GWIeN>+UjJiB>@S}VwlG*;;TyX;ZG|x@7+6@>GI>0>#pX{k#H{qgfvPgXqma(x zcwTP6dn72}sGMQ9V{0DLq{Q|+V=ec=!E8vbNp`}o-~;ph%O{*_x?1WSKnLeew)*H>$R@>vl0QPoeMGHbM3{(J1D_Gk#0?!Pm3iR${vra z16zyLrVay@x1G8KaB6;Kz;jm#Z0SL66ZY4J(CXXGXO&LuR+$eqcrN~QI`Q_^<{$dL__szW&`+fFBMPI|?=jYcM;jVpajd;~tY)YwzJN z8xfn`=nH@3%3g`c)cwjFv|`b1TW$}}wKbKo(oCI&qYYL3GzE^^FHgsh_&*I)(cNoU zU-UkaW9zEGkiw*O&c!PKRET_GL^z(#ivC@jvJ*9;ovslTx6j?YiWd0idsAtX-~24E-PK3L?M& literal 0 HcmV?d00001 diff --git a/src/pt/mangaterra/src/eu/kanade.tachiyomi.extension.pt.mangaterra/MangaTerra.kt b/src/pt/mangaterra/src/eu/kanade.tachiyomi.extension.pt.mangaterra/MangaTerra.kt new file mode 100644 index 000000000..762232fbb --- /dev/null +++ b/src/pt/mangaterra/src/eu/kanade.tachiyomi.extension.pt.mangaterra/MangaTerra.kt @@ -0,0 +1,242 @@ +package eu.kanade.tachiyomi.extension.pt.mangaterra + +import eu.kanade.tachiyomi.network.GET +import eu.kanade.tachiyomi.network.asObservableSuccess +import eu.kanade.tachiyomi.network.interceptor.rateLimit +import eu.kanade.tachiyomi.source.model.Filter +import eu.kanade.tachiyomi.source.model.FilterList +import eu.kanade.tachiyomi.source.model.MangasPage +import eu.kanade.tachiyomi.source.model.Page +import eu.kanade.tachiyomi.source.model.SChapter +import eu.kanade.tachiyomi.source.model.SManga +import eu.kanade.tachiyomi.source.online.ParsedHttpSource +import eu.kanade.tachiyomi.util.asJsoup +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import kotlinx.serialization.decodeFromString +import kotlinx.serialization.json.Json +import okhttp3.HttpUrl.Companion.toHttpUrl +import okhttp3.Request +import okhttp3.Response +import org.jsoup.Jsoup +import org.jsoup.nodes.Document +import org.jsoup.nodes.Element +import rx.Observable +import uy.kohesive.injekt.injectLazy +import java.text.SimpleDateFormat +import java.util.Locale +import java.util.concurrent.TimeUnit + +class MangaTerra : ParsedHttpSource() { + override val lang: String = "pt-BR" + override val supportsLatest: Boolean = true + override val name: String = "Manga Terra" + override val baseUrl: String = "https://manga-terra.com" + + override val client = network.cloudflareClient.newBuilder() + .rateLimit(5, 2, TimeUnit.SECONDS) + .build() + + private val noRedirectClient = network.cloudflareClient.newBuilder() + .followRedirects(false) + .build() + + private val json: Json by injectLazy() + + private var fetchGenresAttempts: Int = 0 + + private var genresList: List = emptyList() + + override fun chapterFromElement(element: Element) = SChapter.create().apply { + name = element.selectFirst("h5")!!.ownText() + date_upload = element.selectFirst("h5 > div")!!.ownText().toDate() + setUrlWithoutDomain(element.absUrl("href")) + } + + override fun chapterListSelector() = ".card-list-chapter a" + + override fun imageUrlParse(document: Document) = document.selectFirst("img")!!.srcAttr() + + override fun latestUpdatesFromElement(element: Element) = popularMangaFromElement(element) + + override fun latestUpdatesNextPageSelector() = popularMangaNextPageSelector() + + override fun latestUpdatesRequest(page: Int) = GET("$baseUrl/manga?q=u&page=$page", headers) + + override fun latestUpdatesSelector() = popularMangaSelector() + + override fun mangaDetailsParse(document: Document) = SManga.create().apply { + title = document.selectFirst(".card-body h1")!!.ownText() + description = document.selectFirst(".card-body p")?.ownText() + thumbnail_url = document.selectFirst(".card-body img")?.srcAttr() + genre = document.select(".card-series-about a").joinToString { it.ownText() } + setUrlWithoutDomain(document.location()) + } + + override fun pageListParse(document: Document): List { + val mangaChapterUrl = document.location() + val maxPage = findPageCount(mangaChapterUrl) + return (1..maxPage).map { page -> Page(page - 1, "$mangaChapterUrl/$page") } + } + + override fun popularMangaFromElement(element: Element) = SManga.create().apply { + title = element.selectFirst("p")!!.ownText() + thumbnail_url = element.selectFirst("img")?.srcAttr() + setUrlWithoutDomain(element.selectFirst("a")!!.absUrl("href")) + } + + override fun popularMangaNextPageSelector() = ".pagination > .page-item:not(.disabled):last-child" + + override fun popularMangaRequest(page: Int) = GET("$baseUrl/manga?q=p&page=$page", headers) + + override fun popularMangaSelector(): String = ".card-body .row > div" + + override fun searchMangaFromElement(element: Element) = popularMangaFromElement(element) + + override fun searchMangaParse(response: Response): MangasPage { + if (response.request.url.pathSegments.contains("search")) { + return searchByQueryMangaParse(response) + } + return super.searchMangaParse(response) + } + + override fun searchMangaNextPageSelector() = popularMangaNextPageSelector() + + override fun fetchSearchManga(page: Int, query: String, filters: FilterList): Observable { + if (query.startsWith(slugPrefix)) { + val slug = query.substringAfter(slugPrefix) + return client.newCall(GET("$baseUrl/manga/$slug", headers)) + .asObservableSuccess().map { response -> + MangasPage(listOf(mangaDetailsParse(response)), false) + } + } + return super.fetchSearchManga(page, query, filters) + } + + override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request { + val url = baseUrl.toHttpUrl().newBuilder() + + if (query.isNotBlank()) { + url.addPathSegment("search") + .addQueryParameter("q", query) + return GET(url.build(), headers) + } + + url.addPathSegment("manga") + + filters.forEach { filter -> + when (filter) { + is GenreFilter -> { + filter.state.forEach { + if (it.state) { + url.addQueryParameter(it.query, it.value) + } + } + } + else -> {} + } + } + + url.addQueryParameter("page", "$page") + + return GET(url.build(), headers) + } + + override fun searchMangaSelector() = popularMangaSelector() + + override fun getFilterList(): FilterList { + CoroutineScope(Dispatchers.IO).launch { fetchGenres() } + val filters = mutableListOf>() + + if (genresList.isNotEmpty()) { + filters += GenreFilter( + title = "Gêneros", + genres = genresList, + ) + } else { + filters += listOf( + Filter.Separator(), + Filter.Header("Aperte 'Redefinir' mostrar os gêneros disponíveis"), + ) + } + return FilterList(filters) + } + + private fun searchByQueryMangaParse(response: Response): MangasPage { + val fragment = Jsoup.parseBodyFragment( + json.decodeFromString(response.body.string()), + baseUrl, + ) + + return MangasPage( + mangas = fragment.select("div.grid-item-series").map(::searchMangaFromElement), + hasNextPage = false, + ) + } + + private fun findPageCount(pageUrl: String): Int { + var lowerBound = 1 + var upperBound = 100 + + while (lowerBound <= upperBound) { + val midpoint = lowerBound + (upperBound - lowerBound) / 2 + + val request = Request.Builder().apply { + url("$pageUrl/$midpoint") + headers(headers) + head() + }.build() + + val response = try { + noRedirectClient.newCall(request).execute() + } catch (e: Exception) { + throw Exception("Failed to fetch $pageUrl") + } + + if (response.code == 302) { + upperBound = midpoint - 1 + } else { + lowerBound = midpoint + 1 + } + } + + return lowerBound + } + + private fun Element.srcAttr(): String = when { + hasAttr("data-src") -> absUrl("data-src") + else -> absUrl("src") + } + + private fun String.toDate() = try { dateFormat.parse(trim())!!.time } catch (_: Exception) { 0L } + + private fun fetchGenres() { + if (fetchGenresAttempts < 3 && genresList.isEmpty()) { + try { + genresList = client.newCall(GET("$baseUrl/manga")).execute() + .use { parseGenres(it.asJsoup()) } + } catch (_: Exception) { + } finally { + fetchGenresAttempts++ + } + } + } + + private fun parseGenres(document: Document): List { + return document.select(".form-filters .custom-checkbox") + .map { element -> + val input = element.selectFirst("input")!! + Genre( + name = element.selectFirst("label")!!.ownText(), + query = input.attr("name"), + value = input.attr("value"), + ) + } + } + + companion object { + val dateFormat = SimpleDateFormat("dd-MM-yyyy", Locale("pt", "BR")) + val slugPrefix = "slug:" + } +} diff --git a/src/pt/mangaterra/src/eu/kanade.tachiyomi.extension.pt.mangaterra/MangaTerraFilters.kt b/src/pt/mangaterra/src/eu/kanade.tachiyomi.extension.pt.mangaterra/MangaTerraFilters.kt new file mode 100644 index 000000000..2f823e692 --- /dev/null +++ b/src/pt/mangaterra/src/eu/kanade.tachiyomi.extension.pt.mangaterra/MangaTerraFilters.kt @@ -0,0 +1,7 @@ +package eu.kanade.tachiyomi.extension.pt.mangaterra + +import eu.kanade.tachiyomi.source.model.Filter + +class Genre(name: String, val query: String, val value: String) : Filter.CheckBox(name) + +class GenreFilter(title: String, genres: List) : Filter.Group(title, genres) diff --git a/src/pt/mangaterra/src/eu/kanade.tachiyomi.extension.pt.mangaterra/MangaTerraUrlActivity.kt b/src/pt/mangaterra/src/eu/kanade.tachiyomi.extension.pt.mangaterra/MangaTerraUrlActivity.kt new file mode 100644 index 000000000..3e14eded1 --- /dev/null +++ b/src/pt/mangaterra/src/eu/kanade.tachiyomi.extension.pt.mangaterra/MangaTerraUrlActivity.kt @@ -0,0 +1,38 @@ +package eu.kanade.tachiyomi.extension.pt.mangaterra + +import android.app.Activity +import android.content.ActivityNotFoundException +import android.content.Intent +import android.os.Bundle +import android.util.Log +import kotlin.system.exitProcess + +class MangaTerraUrlActivity : Activity() { + + private val tag = javaClass.simpleName + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + val pathSegments = intent?.data?.pathSegments + if (pathSegments != null && pathSegments.size > 1) { + val mainIntent = Intent().apply { + action = "eu.kanade.tachiyomi.SEARCH" + putExtra("query", slug(pathSegments)) + putExtra("filter", packageName) + } + + try { + startActivity(mainIntent) + } catch (e: ActivityNotFoundException) { + Log.e(tag, e.toString()) + } + } else { + Log.e(tag, "could not parse uri from intent $intent") + } + + finish() + exitProcess(0) + } + + private fun slug(pathSegments: List) = "${MangaTerra.slugPrefix}${pathSegments.last()}" +}