Z8lBkM+WP+N*|Rf%s{_bdcG+e7%gJu9t*u?dahw=n=W>65 z_i;X`{j!#2H6)YCZ*1G%d)BO3^8lwOfXqRI1|>^MN*)wATXT`2w<=o12%C z^oo0^B7k|1&<7urIxY#=fSEU-Y&IK{gIM{%2`bdN^p9bRf{Hs8WaI-#K@#;CUT``? zC$;odr4QNY9LO6GsPHmnU2qG0d(iHIoO^88!H52}*?AmL1D3}8d`?X>kJhLc9L 8eI!SsQ`| zbZ weQEE#_vWUXZsOvLFUGPgcG_tt?z!h4ZoKhER$h5!0GgZXney}V zbTod=We3jTp^H+iyJEzn0)d*jHy~ZJ-hKDo5!I;F2^j{<4H`tRNQBbTQlv)~fZ~!c z(I_lAsF8uaT$UScvC5KNfKXr!!=NjqPmXvzj%k|Oy(&QP?_!;0suE+yi~&HpbBTn* z^b@b?sH!5H&C=M|sJ5-kG&5^P9iLAs=G& $~jGcGgmC 9Cg_q#V_h)m;IptjabYBvK)>TSbd+oJ3^w2| `qDoXR^>Y<`;fA1Yz#seY$)q?O!cNnfb6u(E?j-d z j^NM;YZ &%XQZ%kbgD)t&D69S+bazSH#cPdGAdle9`tm_XKXu!@Uu1%Um#!V*dDfAK}; z3dprL+L)71KAE@Qep{tgDwU$RxLBpvop;{JZMWUVz<~o9F=7NuEU^TUNJO3My@pzz zsjFgiq==109TQrbxo%#WTAtX_M5$@AdP$t&vb?jXZKx>i<+^Gr(rGTd=t4fPn#uJy z-5{x+@gGn!l~O5i@r4(2gFKnKe4!bbR#{1hVPZ%{o`2&F_B{M>rb&8Wn#y0sjvcEi zyo< 2H(zWnk_9)9>?_TPVh=FXj~6m-rx=O{2zu9PEilu2jZ91X6+<2Ca* zr)&n60pq3oklq6nm Y~?JV-4D7rZKawstkZBWu-Fzi+GJ04ufqoLn_-OsRR&~b*rzwI`T6UL^aC9 z9mi4S+ika MT>wPvL(YM4xJZQ-+~dWMTSuBw>J z!!;EG%b+Hkr6Su-T2kt+s L6haY~3w2#!Ww%B3|e*XDq z%FD|Y9D$_vm*Xf^efQmWYWe357x5ESUX|_O_R4ZrE{?H8w3x7ADz&_xsi9iRUX(Q4 zESBVh#te;)8_4GlrKb1ZeU~r3_?(7}s700mT)+VyeDFa&`|LBy%F3t{6Fl+66S?~8 zt4XKRN w)H(oZJE@A_amO8Mdi(9S^X<3a^4xRJDI>2EUpotf ztn1S3I=H~2l4{S?R?*9{85)U_Zg1zZw5T%&O-`0WXHTKsbrm={rtf{y7Emf4aE^G$ z2|j-c(eJ(W_bcT!zy&}f;Pg~M8od{R!0|X=uy6BzgVBYf0Yo2=@*UGOb-`$W(C(nr z2c(l;`oMyRqYp?QidLEh4@du9ENCzRz|a5`tXb>B3Ergjp)6!@^q*oug9!jmFn#m- zQ2Yl|NHGmKz60_bj1~xeIKj7r^r7fCAPXrL035v^FBpaq3>bYl3xA5~ryhkA(|{8= zpd8QwIDn=361$+nae;OqmoK0kGKl|7m5XhZArZ*e#^9p~nAQV8Dzeg>@UdlCKLBe7 z@{K6?_zCzJaJqwJ;r&5BC-IeOno9slAOsj%uO0Irj@zl6Z-JA6* 7;d;Q#;t literal 0 HcmV?d00001 diff --git a/src/ja/hachiraw/res/mipmap-mdpi/ic_launcher.png b/src/ja/hachiraw/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..12f74ef1019f30e3377a5094d66e35e7ed75464c GIT binary patch literal 1264 zcmV *+P;dvfh*M;Laux%TbWi6&@!Y~Zzx(-d#psFeqMS(1@?brjXWHA^8 z;5^&5Ev#+Zwr$(OWP`PB+qP}nmd^g|x|wA9n!7@ivv~Z@-`+bgVZUnx-w^}Lh+<2V zyD#7s3h2cv7od+nVm4+pbncx$;WeDTdI7?J39~Vyp#rWFlh>kv^z>Pbjg7% Pgwzi>Vs>ASD3y+0ZF(7UU~ZJ1q8GJ*N;z5PDaIw6%i91 z0Y?Xe&pK76uU0^W>vTG-U%#I3&VmICFmK*GULZC$98K$IgsyW8iso|D;^?RsAgJDn zv%l}(zmFqFjvziH1h4Ph!OopK!FM3h7k%2s;pxsO%o!ZO@l=xS1TPRB9nD_w2zcq~ zD-;lpi7O=`I2df5K7AVFM~uMpGiR`D$rApYDPO*P$dC|(GP(VbKWBP=2Yd45342z{ zr@m;>A`~f71Zf?ek;%~ojuw^(u(m;>tpoh5tPyE#3kxb?XKIG@b`Jde*R5TT?mc>> zyZ{4>aiJ+E1_j|Qp=j~H-#mJRITI&h%&=iNPCKC+I1p2&Ou@c=`_QjnKis{07h}eZ zK`<4kkMnEfY+@#Cj7bGuPy}|xq@konC*L4U4~fBk`hPFqU@Qrb=hxKbW2Z5D_8j#B z6)RW9o;`bzGiOeIOg!jFJUMw1XZG*MD4h @N(Nmvn)h!$S{I1`^9XDJuy^Nrkn_|b_^ zNMPuc7hqVHzHEw@ucK7SlCYt(>_a(t-~hh{3KuR6wpOfI!H?9OIdiai^Jbhse;&)1 zFUQK2D|wmz{rh7g?b7buyV134R~#i|w5>e~JG)~!;nzhbp%#IU#ic`C`ujHRP@J`` zaP}1ou=5)e69Z4$4Nt<`Qc9ODje7O!@pmVN3>m`CHJ^A%D%rASOT@*+p?vxB2%(F- zSg~TLTD2-#w{DFrS+ej8Ij55=oavfi7p=dgHEI(&i@g()ZR}xgY=X>m{!NXH8CJc3 zH9;x*p38_2PQq PmR^0tA#m3vg}m>IL+m z<>Bgh?FtZ10xbup2ykV*dI3VJ!`1QX1qdgBmVm3_wJ$(O3An`674S+02q%G-fGbR0 zn*#D^3Ai#|y#V1P&;nd}>e?4@A?O1EtN_;>|Ag5L6)>VW5N@IbSU^j{)iaIRxY59} zq=XV|I^_xFSHquBW>dnsO=7WzHWVL9Bqi<_CyL_BOv3RoSi+2AMX~wCv0@f(`oI1! a?bio_=k4mBHmAq{0000 ^g4_8#ZiL5&6shDGK^`;pz!iAhz0L>+0&Ji(uU!Fab?P2IzplqoZT@UdUHLUM90c z*)_GbwQURd0RzyMGy@F47mY?I^+LWQ=IRE7!{Mob&+aX%C_(Xfyr35nTtJ>PrA}}a z0L;D!VD>`3odt Vg)eGb{FVR(*Fbc_6Pp->h zDj;52x77K8T;{z*S4h4BvYkfedt#=7lA~G>1@AL0ruqy}MZOc{IWLf^3~+fi{28vu zHd6udDzm{6Le(Sl9-x+d=gCwozIqSHH2KP+U;TUM#{nucC1YJz_m?2`=Ip@8+A%X% zDuDCmtbSzuzcq7H8S(1LS3vdv7za39id2y4xH&uT0nQK7+&>P;P$^O^hy%4=fxr%X zfFklU?*-x*7kGdIA8=^YtR(uK9|vT9zR0Oac0>>pz#$)SSPQQvUlHochd3JTW|667dP?Z zTW|2mmmgACIh^)zz>U)wnfHL5cix$8w%G=NQKLq2+ikZ2@Zf_FB5w8o;OVEI=B~T$ z0zlI=zOQ+cWk%;RVX&X84+#^DScD@b>~UI*Pri*RApiffcufDVkuF-F_S y z(ECYzzxFdtld7t!bOGeH8PlfWA3Bui+_?ZWH8t7CMujLp&5cl!*G=`j94bmoa q9AM!c&27`xQ=w`R$8hPR4AOL|tK#KO& zS6@+DT1q+rhaP$;4?OSyC!BD?Qk~R0` {L?0$%95PH7gf@ zY+Yyfl1h#j2ETG{0Ra1#4VLeR`T`Uf1_qiu_mu2hP87%PSz3t>thCB1the6!ti8f2 z(#sA#?6AytL(|a>%uQGf@9dP3uBCcDWo2dbz$_@h966GNAke>P5u^Qnp1k)ShL%^* zCEo9_`R1&(_F6=9^LYK0SC}|)A^`8d|GxBqq3oOePWaaO_;QS$@*`c@`nKczd*>%o$tejWK2KhyN9qyFk4EF~(chOv` z#5EjVF^s2L8@aQoj$@8FhN_t}S@7I@l&!NYAAk6v^BIs{i~lTCt!SfwMj-TE4e79A zF@hpOjhq~e++2Lc#r$SjtSF*;^z<3L_Qe;xElSk{@danDup+0Pda5M<$}6vw(YDe` zD=|}SOA1gf%>3PV-{s9W-{i1V6i%2hA?Z7EAAp#JB>&>Nd3+M;NJh6Ld~HGWg03j% zES?KkY+qE)r@=M=rex)?Y;Hc|0@ x%b|D@zs}XEy$Z)Rb^*M43J-I-aI10XuBF3q~W&KRP)7SkI^+`2xdu1`W=R{ zrVAov)V}!QivX;+;)<-h?z${qyqF6vxPWV}xrWzXdyPmWLMRlHCg0rLEX$D)Kzf4+ z2zxXQ&}}6Ec&DSC_dDCLfSFmjd=PBst Tn2vHH0|1x^BOoEcWlV zES_&|0-(OGjw`RYoRd#Gg|TBsbM~2MIzJAWIC(PLY`rx@D~E9NO*iqXAZEuMcCbZ= z1K)IX5Eo^~mn2)5 zrzmHifBrd}ZMK;tIU0>7OOPx_Z@lq_%!UyoMv$AEYYzaE*Af>EAfRhJ($c_7ZOyEd zSHRJtq~z#2I~7-;0l#V*KSjfm=w-6=h$bw)j|7>WlLx?uLcErEj2^u9%B#Hk@+%pe zijd^5zS?RmdglvDrjDhix|%=VML9^c?>mE3NDn~H?Zo488S&{DKYqN7^yi*?P8#r0 zM;#?c&9PVvad)OHLHq8zuM|e?Co@HqAQ|~W7@0joL{ 86{q-g@iFQUWB) zjGUI(WtUyJ>Z+^gK}ku86hM?9xvzL_3oHb%UyDq!1<2P8o3v+In`Ce2`LWXg@M{`A z(SnIY(ifxvj|%c%>u4b%kFjLQQb4{k50H`k@PiL==2>U3nkXH|9efBQEsK#rCC~u0 z0Z%>kRI+Bva`ExU9|KTRQ _TcQZ&pu=G%{ONqA(V)GxgC&V9e3Pu(tuxj=_PKx z^;Y)SV-GoZ^v*l)$a9CoVf$R-S$c%<3b`-9v+d2?(_ANrjnIP|8y1P^|C;^g{=nT$ zwYCV!<8N(P%*D0yl06 A)3sFhaY}e&Yt#Xuw|f8YMK-qCO%Sn5X2!+};H z0>qYB071%p$N$q_{pTuXRFw)~IUe>P;^1H4j{4pTYd>WOzh`ObTQ^Q$S`Z^G&$J>$fyC)#-doF(0P@-r@qshV)- ziMO|@6v`zfNWBNRoP6~HC?MT^^F{9W0QJOsCak_3Wqx$50G C!%1o_X2FI?q 9gjxPQ8@ zKkBCSCMMtm@_;g->{FViO$5kPDRKdR0k#1a070Njit!IH=p9;02wf2Hp%7pt(MmHg zL+Tdt4+G`^;dJu Rw}|{DZ)cQ(2jmZ0;G%J0|Ke$w*~M7h^GYTN1qv2oD}Sc<|uCgKO|RG~lOj TI60gq00000NkvXXu0mjfxWvq! literal 0 HcmV?d00001 diff --git a/src/ja/hachiraw/res/mipmap-xxhdpi/ic_launcher.png b/src/ja/hachiraw/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..0f61528a7fbbbc51a6692dd1108d6169e3a52928 GIT binary patch literal 5440 zcmV-G6~F3 ?>lDp@%78DVBHJU7N#v1*B}m!QinpdWeM6X5w%&GR2U#N zm#LjD!IW_T1T(310?`=8>C>lInx?r|2=O!+48Ee2ZpHG|fMA~FE37MHxjo0ga+UKX zw^zRo-S;;MI>6sRAn-*>`S1V#|I?WFgMexpQAKfB4CBg`E2sT_|Hp-eg~wneE|g%N z;G)$Yfco-!KepE6GR6q!oLH7cmM&c?!B
FLi$jvTpyMIt2(sBVE$ z8)ReW&Yi2Il<&sJ$M?c?y$`irwu(GBIJf~4ecZBT%UaADfF{wJK*{tGLL3P9JU*X~ zDo9cXzbOq3d!45y`cpbHGxHGRlbGezNFbVm0k~ X;D36rj7G5Wd!l4Djf7Il+to@Sl9@m-IK SSC6} zE|g1dFOx$=xXf&^wIbJjldsM!W9jM7{6Cg@hA9sp0c?fiyT8A`$^cc)L1~>K`u7T4 zRo_S+23|P?F7xZ_Yrkk;$Pk@X=;Py~yy4cZOT0bu5N7vWz_SSjivIvqWIoN|@d$te zKNfErNuo LLyOjKL;>lI#=%EyyvVWAN`&DF=-SA8J>aq#eS6t6z|tC0kN)9S_p zssz+Bqk-5!foOR6*3}*=uLOW2GZXP`O}{z?c)W-+M?63jJit(Gr5gI`mT++F;Gv@d z{nZE$5bwlzu=JO~Eh{150B)@g9{pg_U6{Rkp^IF1VfOG?tB=a}7Z1?l;Bm#^Zx`>v zc(>Maj&eXD7Y4us47+m2Ncc+l9mprx_A3* o?*Vf5A| zJV5p{kv>@Zfn~Sl@E~oHS9yIG)*2klsqw1eHr{@i=35>H96xvQF3jNpoD^_y3 E&33b^WCtE3B{r#~*(@-+lKT!-o&&k3asf5PkH~M^x1|qFsW4zvbzVZUdIr z6;+s)Wy$kA)>vZ=uDId~F1_?pcH3a{QM=7fJMF|Cd+fm$TWrCA0Rw2S znwlESy|KtP%;f#IAK};W<9X%Xw<+zNB$4b((HD{nb*Br}mUmm-zY6QwvnS`De?B|z zxTB!4`+ofK#~g9Q5&EatNGF_d0%x6d7UkvTINg5x?H0J!nmKc(Y3mFwJ*q&gq&JCN znk`nUq#~APW@UmxwkLm#UCNJtWylx)aTltot!{rV?0-B|Y1lD0ufsWx&*!t?q|<4n zNF>7Pr=Q*i9%=F7#W=bB5)~D!y<&l$$p};Dz(JcW<*fZYj@vWNB?lL{{HOqz9aq7? zzWy%wd$jKFK9aYbp!r{q)mv?~6&0rAom4f=n>Wu^Q9fYhL4znYaO7)iwG&R}W_N7? z@;pKYwl)9dr!Etqsj-QTSM%_D(3ma~@cYaHgZlUx(A(cdj@$kJv3lU|R)KA^%{DkW zfM(5_g%ma0Z#HtIg(EX}E}jX-UNow9R9&@cSKCPG9QaYS<) drQOUW!) zfZL|FwzkcOm(ONtFzY`3zL8#KMSArv<;iz5gn~Z$RQSyjAerzpXI3+_=I1*E`9vbY z`s=TcxglGpowMG0>+#rQk8$zE7xU(uZ!&oB;J-_y=HULffaP^HIIZ92h!G avHEU7KvByi+-dd`<$ewjXf`gGa>a>@e_JdjH+xrDXXUYoVnS_`SG z9Y&9>zrhB)_Qo5Wa@uJOGGGrKI#e#%1rD^FGf@oa4fOEAFktwwVV&;3>86|7BmG=c zWvyaL_O$8Xrpc2Dnu<+Q$QEerT|_g`c>~vt&n)HJA7(Ib#ysA5FUuL%*0JA3i@4yy zC5)YuZu4BlVo@1Pz$& 9o@(PMm0`38W=UmM~??lr{&2zvX+x=MluW>>ICXxP=b; z`te!EU6z8T-GI;6=}o>i-E1><-FX+TxbiAqeCZ`#e&uD>Gf+AGV=gEQ14W>|8OnUn zudIyrk|UgV-g&nAaw-^LG6teTLj!4(h18KQgJ`=w_uP}y%+VJLg)CgxTz)x|zWo+| z^?dT?wT<^YMw+4Wq7x6m+`X8uzy6vJKl~7L7i0U{8%(<;B_(Q8V0QX`G#PpAwb!!4 z4m F?4ym7ba?YV zAK`xe2$_76tE?nHa|WxYo2W4B*V=evE;-{2%A-+oW*AD(p3VKY-NqH?pT|p|en#GG zqfWo^#vARBDQ&y$wj6rsp&Wbcv5XlrhWh$?2awHI<~G?{XBVefET-YsKEC_zyYuIt ze==jn40bK+!79-N((17UxDM~tpXu2q-mk4B2wg-Qc# z|6rJ2=CQ_Nfr#gENU}FOnRW%x+to{Xv3jwAv_kt?px#eaku%@TO^`Wg|NR*>a3ED< zr!)VZZy0#g&V2d9cZ@NwZ+Xb;ijv();6yOsnEeaD6b0Y$<5`xJee%X_G6ssU8QcBw zI1%%`zIPvf@%+p(oxaWChtqeZl?a#*F=a~r@;&yT@95ENu=^ea42YW5zUZQh1dno) zW~z1DN1GG&*=HZYYC& WnecowI4#X( znUHR@om&wIuy;i-`UFE9-lMPJvFm4K(iW72-_H@rzSI`-)U^!9Nq>+svwjBy&&rV) zn e z-7*6yyeUs~3Z90O+09T63<0V#8S5I&xm-thibWdDFro52VmjN4#c;}){R%}@TD{rW z 04Wz+(^PMoeAKCrRaRNWKL1^J-DRQq>Z`BhCJMuX#sQ=XOppj1 z8<_97;|_t+q0&*-(&?2p0GalmsanLv^Jh?%&mnCRFJqHLDWgLXq%Z1fIC|D3K1@|x zCm9)z62`~eTpB6r`B*6$V?e9IqF*S?md1S&o*!veHq8_RskC6hd@jE5LY{x&c|x%W zvHrdJ_|s1qKY0>!=g#Y10ENS0&NFXjtm*WF4?C10Lx<42PaizLpVle>(}6h9G<7PT zhMwwbiUx{eQRFh}GO5L-^mxqko9t7M3(8xSR8ZmtaOxch+95F7 z0?;oFDFNyZO#9m3fA2kW;Ed&w#~)>9GhDB|`WpQD%P-vvpo(OYjZE_IYh2-+v(Mqp zx8CNFM;>9+s8O_65f~4QS-6m@Uw@&HN|84mnp?V*lyQ<5pMIK~jV)jQ@WaeC4%A+P zM<1S`efQmW8E;%?opsi+4zsbzL@u)^*9 ? z^(G7LSe7IxAY10T#-|%-w)=Z*WPnq(RaYoj$P#{!HKK95eY#lWkH&iYy|u=V8^@Mg zY{glppRUhFIjwvBbA|rK=5M;?7S>*CEpkm6`j#gNm&EV^;ZTTWDV5EVtEeDqI>{+r zTFS#F6f304MHF@w7TaGmrl5Pn4L4|lPY$C_ZIjLPyVjSrRC;nLmFVuIs}^l95Znc4 zs>Ysq<{7oApsmMrS%?5qTXvBIR;hWNc37qvr*I2ks*sdX1jK!VN3nV|fdvMzTep<* z9zMH%h5=aM#XUa*f?*5g_YEmVg`*4$N32UpsY0HyO@giC0aaC5* ^dM!C%prss9j1o~Z|=rt*9JAm}v zoxfAAb8 @al<`%NEb-Ki)Hd{_snD&&~ml7oC;OaJ$3E18^W z#7WT2%B1ZSKv&9J9;YNUsdoSU_cL|cR7!^pq~8{6;SYz{bdyb3VZ{|Xv?1&6VU`-; zqaS_{C~ZQxE4KxYAn0taNc+f9 VpJ87a~DnasgrC+rcx=|OAaM41ca^|5 %|3 -VZG^pvU0 zj!5=l0|U-_u@ayeKR%q>1biN81KR9Nnqmofz~=@Yg>B9ET+x3B!cCz5-cU!nx%kig zv!2SOOHDQKKJi4H=bwGv&fLbEng~``Qx4>S60kon2C9MPmOP@#yng-qxziNNB(6F# zrRstX6`0lutn043j(6U9N5CnoXegDV$e~=tq>ydra1J@-5DiBfnluljjHP{5(yO#r zn}Wve*FkzdL95rLZ5-H3@;PQ{_-TfQcHvcF_s&Ig`7~9{%F#GOf?)=Qj5Ei}Nw&C9 zpe4Kg+?ZnR#yHaR)r-^|^RgM =G6 Wj7V}eWV%ayLb{(8BN0MpfwdOdn? zYD ?GH}&W<)qj%=38GIMg?FwRoltKTvF!tNdWv z_lS5ts&ty={|BC7fM{$2azFtnb^$>DFGqo^nAD-_#13t$!?b9 (8R+Q^#37I8bD3WRZ5BBcD1_2<5qG10;BLxt_j>!+N z0DQ8noLpac-f=)+4KFyfYU0#100^u|)W_t7$0yMT&=@!#j|Z}UMxu{8TX^;_Tk(Hy z9!_}tg0k>{@0tVhX!dg=A6+~kk7oXESC6YI>;Q`J06?JUGgOIrJRXoglHW(C@SFq$ z#u?$M3Zti;g@*$2U;r|TCqTYC?Gx(yKt7=kPf0XD1K G;>P|0QyHFMO zN6TM59uKHwIz0Zi9uH?9Pf7ItSR*`-fJ&yrQxyiH4!{#2xt}aJRbh);f&v7<9Doy^ zs<7ac1Az`TKo+3js6;tHzB}#vL;-4~5uVopc`QESgr`{;$)N(|6KR7jIJaK_y4~A5 zYo#fID2&$a#@+25@OR)fcnMyDA|-+dO9_z_cgcuxcbnbrxqQLhs*71q&Gi0T->Ev) z1HakXadA#~2Uk`MhjX0nq#@=&3gyR`VvP55&Rc6A&ft1ZIU$4xc6(zTY7wR`pvx9e z(J!Cj)Mx(u`FEP8X-gMn^I!=I+mzB-jC HH>;@)N`v}M*KNwW?ehA?% zrq^M5i-^Rjx#XGAcoMu055Uv#iv=|LzeQJhK=Qj$RbRoY@Pa*SVVN1KhQoM1!l&>8 zJOod`dp@53eLjXq3g17N^Cu5qF&Emu=fentDUb|{x-pvxHs)71om@cL=VrV@aiyjo zzR9r#G|vns7&;=xW3*<5V{>GV-J%N`1pyUDWatmyWQ6meR1b&|weAI;oPM!YydzOy zDdNTeqaU48Js>W^T4(m7f4>e9bdSh%(Kty>^aop03*spVs4OHuP3ogg;Kq(f&kykx qNa~|q&H*BX5JCtcgb+dqA> wER)m_4KXsfn2rBl>0Y;A?isNr~&bDnMJ}EB3O0g=$ zXd0Vsbd6cWXlylBZJzf&WA{5_<~TL>ZQf!2$y*D*hnb0UIRi*Dw&%^w&Dn*8g+rY4 zD*%wi7^@KT%$+Z>_UHE#$2i#U?zP2!s^@ZYF7>wx3mX&b }#puZ(CzyV|GbN$t?i5U|CkC&*y`cl@(ZAT$FQH0Hg<;{#^WP<6oC^4vC40 zkdTl7>FMc^lam8Ncf;ZE=*N#AzexBMTT^ULW`OVE=Y4&B!{X&0nx>f<3 zy6=C{zpvyW7K?3IC=`N;i3!Nh&%aVoP;jNYyZii;Cr=*1wp_>r91(gIel9F-czF26 z($dl$;mMh{ZU695otHiuMEq;hOS0necpxn;?L>Kb`Lt=8F9B8f4ghM@m)6tMGh$iR z?a9f>OeN~O0l#|8{>d)%fbaSH%8DT+CFNLUW#wz(1RuZ!8CZ3{>HyW%)p_D0+!qh6 z!cQ+<{_MMd@%8IhnGr?>Q#ISc^@m fZfg@w6+K;WVS`1f_=7Qg#bw>u _D`~Ch52Oog|0NQbfy$?CP1XGZinR#4hfuA@5qbz|8#rVR)!V%%I= U1tx= zviis~fU2K$e~O1}!-t 9Lrxqa4to%cF;?c_gW %GzRdWck {75{={Wo3Vk!^pt_V@f?F#*yiJqhhw UMA06%kc%m>66Md5dIoD%wy0 hDBcevAU}Q>72J`WyU47$1JXy4abv4*;-JZ+a+4TlNtC z6{L^y=%-;H004h}@T Mi7 zfWfCoBn ~_mJV;?Ee=V0G|xM)qlHv0O7B1nRYNfxC_FE zUwKsj?*|(C`er#eyvn1%fzLO~A$7ggpWg@2FO>g1zyz`npkD|841KDNKNIY!Ppc zOwM%9H0z#pw|CF~+Gdbx=6>IIKTNkhjxoc~p+oWGPe0;~H{QT)x7~)TuDS}x9CHkg zKKf|%@82I*3ow3|1NpfYOc?2aEVqm9PjTX<{#b>zV|x7dj}&|DwHI=8a`Ev;A7kp& zsrdZ!&+-2I@8jTu4~ETVLo^1IED3>#MN}wCJ5+`` k^!uIXk5ekLSqk9*;`rM89x%fM5 zt*OP!@4kzO-GSaa?uaa5Ad)Pj$)o&t9->eE!Mx4~V#bXdhu2?!9n|O=sL|hk`)yo% z?X~cDJkU^7RD@SweHBxtOaTo?kK1p*9S=VEAk6T|C!b)|s#Q3Aaur7RcVJ!ZASke* zzIq$1!E&U*j@| YW9Z|)CF1Ag0`dS6M_V0>tOvTr;N>Pw4Lz27V znnxP2e0{j%{wbE!_x_!I0G^|J_wJzNA-Rp)SgmPkX@Q1}j0|w!woqGJ3o}@S5f$|4 zfqh2S!5@^czRUryuMv-49>uQx(f}2(%MuQsmIXplRa|(i3s*kU2#;4u{uy*WkDQu0 zKq^;<^yio`VFD<9jEKczAfcntC^QW0(+6qd^=NamX|1xZuFl*5>~>Jw59u$%7qP$_ zc0dhQWAx5xAcA2veqCHDBmjf^*cc5`+?jOBBRTa+pFA<%V~;&xhHyBHii!$o$PmXJ zkeP{?&j FbGbiyI4=-=IjzFlo_ zrpxH&vcv6G{|SfI7w2Bx$pU?CL& psqP;YP9L;=_n{Dz(EHcgn ^rbRMVYqGKKrC%g!nUMYZfW~ zF8Mplpnd!HZS#X9p*g0YAtFi0()}#ETu_)G>-G-@gJ=tlHP!I7q+{{oD25e!QSJ_7 zdHo>V{z@edp8^c-Z9~*6W9hmuzWgDGH)gm^4R+C@Md;S88+hH6TqmD=GB$49*yiug ziq)>W?#h)QK9BkCyYD)r^vM^7f6X=5V94;{c<}!FF>B^bIP7+?$3myo-jF*| ~=d8LB6ohhj2X6jWssHnwtv^jpFCuLnsiyjn6h<*1QH( zZr*^H>cCe^y5gocvT^=HQJi#B9ZtQY8qfStZ~FVOH_@X<56x(4a9qhqL|JBhorc|E zt1+jXb{ej{;&SXO z+GeFqPTNl+5fX18Ijs$xT&Xct^?0XQjo_St8nXV0GCe9`sSUk|> #347D_!D0zK$yLPBuvNyC&Z7f61>CCGWcAhtz!a}UVQ!v*3s4c!HKpYJsg zN9Pof{E28V)tQ55dJe?yt{f00UJvvj>508vxp<-Xp!gb$Q}erm;JGGbx}brMVSOlo zprU}+J!Z@p>^@}*a-CVA1g!k31Y4i~6piIosI9F7M^?&c*qwhB!W Q63L0PAC2-m;+c`E~F0_03st^g(>UR8$ZRby}M|vU2)f)kR%yU6oBQ&p+mtN z39(KRLwC=Mstn4?Kpb(z5xD1`dtiqA{Cr#@!u-O83qhIX_xquNQGy1*n?G#WFg*I` zqu_peQ0Cov=bd1~Ps6-<^Y{!xn+6VplsT`c2cE94LVYBRGemS4>_~?h@~k#oQrH9Y zy)9T5^0zuyKSvsf{e*`fD30eM2H4Z^PGb!Qq@|-s9It4fvp9B<-vcEseN;t7OeNtY zM8aWoJzxSH{kkHrXLm>dUViCCO#kH 5-mU1;BNMs8Yx_J0z >i1-+gxwtmxc&>#ZQP z#P-WCzr>6gGZJJUF2X;jPU#%H;yN_!C?-hf&YcSm;n9eA%q=1rq=!rfedjx%v?hOL zB!nmHDlp&I(#k2_-mN#f*z6dS;e-ZHEQar!8?i3vhlc)w*rPI?nAy@q&ELv6m{;ta zp5EF(Z8p#t#$~#ozm(=!6w7_y#QVSX<{LQWl#}t)bI(Gu+mKn5hi+qsCL$1J=1}1T z{%=(v4yz@t32TdJBvAqE!CE?i3gJ<0dHJA(Nd}HSGze0vF$KB%?rU0YAX&AfcVF(K z8<0Ecq?0InSXFA(fu?6W^w2{oc@o$A*kh03#1l^hk69xUZta|$J~c`pm&?T`%vufb zU3cAeiG)|5JnBHQwCVXjbJyeEs#3hvPz^oyaOPmw^bB;dTA|@1cOA|t-GDoVzORdf zLF8Gi=wnL*rAt{P2o33ygdrK3a7q^Fks({e>sc5t3_y=!PZRt~tW{O+;}1VXu}E@R z_LNjWvB-G+tv69wTaC}Y`kK-2|6>5G(%dXO-)5n)A9(Z;Hi!Pu=tL=i`C{8)l7tq~ z$a3tk1EOv>%n%c#-ge8)@U2*ZLZQPm1`SGDHr2?b_pm?w@B=tfu}xejt1%kr(Vb2w zCQX`@AY^%YIo=bw0xLT-mLGroQSa>y24D^v!DW|SM$&8K=Q8F6x(E<$B~_~8Ri(u~ z4~#_JGb@KlY~sc*5BNZ-vMCfmX(R-Kl_3{9&j1$qywKo~WlR>wJH<9V(#7l4{)5vp zT2+`nZmfeDW)v5rvAGE<6uke@2RQrm)6rMR&tpXdY<9c Tn1P{a&25 zeLe1~F2!q&)yNj-* H&B%g7l0m3CvQKknqnF(Q z4J^Mdqyd`1El9rWPP<@?xG!g)aRz%MbQt{l|9KvOH&g-;2nL}_GCirNo}2@_)rwI< zFRv9uS}zEl>_g#}Dsg 7wsVWM;@&R5{R#)SKGtb0QVGxuzdy2-(i!Z*& zQex5so+V5^RmQ3XqY|%`uhT&EL?kikiTTWd2996rAHHF?_S p9H+EW@i(=tK$6$LyWwLg>W?luSXnC*2Vs48d+b+xsq zHR-$j=M8{2jMC?^XP&_k2Ok87-GQ(#fQUZ;$s$9_aUv2`=ym^4HHn@h7z}~4J%nWN z=$xU^JnrwEk3{R&uODu@=_ZUEInuNtW}IhXmzhyOU)ACJ>IrUagmE8zmzQ}0t3!Nl zfxQQUUwilNP07XgpdlI~MB QTo*D6^kK~q)DVa z&=8HHB^Co^6N%16xMLBp-*CC8F6CQo&_hyH6t}oL&NOIy_W-(zs>!j3AA$7r49Kzt z{_1+Hx&JNrx79#VRQ&wQ&zMtE!u@~u!iTalWVN=HV~{9%V`0-NX-+}|VEvvTAs=|) z0Wf*pd+)t*;e{8HuzCZaH*fU}0qgUe*`cxUe0}=#0UyAjQ9b|s^Tr&2 wMh zi9`(ngO#QRREEP?9q_>jCe+oDa0mMH= #o0EkY*Gz@^b+~R*{#RgUM4S z6_IEJKh7w|(j`l=aOMnr`u4jZ`Hj&e6F_eOyGRli0Eos7iixgS1Yqfr1kwzTBx?&K zJ*znPi|It3kH*4dnUFGZHa>_#a?&t3@3VI8TKpa;pLW`5Cu12@lQ+hMpQPveC5%K5 zzNSTpfZ;gmbu*&<>}kRyLh6*q32m2T u;F5FBMg77B7@@m3Qg|SM zK>#8EX3;2gW6bpOCh~^lB3VcX?w8a6sOM>P@4WL4*u cl?2K$ z6^s4eRPg?(KMqYITq`Ck9~6lu^8!W%?L(3QbOA6t-hl*EtX2V1ENW5-V)N;Q6HZ8U zWJz|86nrQ;k6MS9o|jdX@#DvnJbL0&>Tnz(LE0@_ws6tQYmF#2r+7~7SZ+()SQ-c? zL0LNGAKRkb;_;g{ZQ^5@G@OKo=XB`#=bx{QMbLmu$-!+rhP{LV0|qb}Y54%ZCaPP{ z)K}rXrn IBruY*kQ;|NPpuPIlgT1mChxk!WOju&>Tmfne@`jv$;g#n|W1^ z9&leq2R6nyWy$7@v1Dng;h7gOSD>M>O!?GPPyJJWdzAeEHsENGjAlGH %G)LGe2aL=dO`9wTns2|UMeE=o^vJZd% zch2x{0dx|-TOz^FU(DgA_&}BZIPmWWNdWq{%fR0&$D{Wz+34ecZAb?Cz^V^_AOL;v zefaPTK%gZGf9Ksw8#I7E06&F44O `^nhrql_aAwbIe@zclsUlt@ZmQHD8jeu3qSy7VDf9#7k~ix0DSlbpn6&a z_-eY)!H0jpCJVhk^|k5?fd2=u>I;Cu*MGuSpGp8e58uCkzrJoj556G$uy@wVS_DB9 z9=ZQU$WtJ%Kun4}1y4baONK*=TZC(fYea}fxU6>5x2m_QYih2~vRiDQs;|ym{q3A} znOfunTN4*L=iURrT0JaU!{344v*XYffv_dZviEtOuT32WJ#SbwnM^)ZRfR)Z2fz?( z?Je^4=>wpbQZ!nC2V4Njv~VzUfTn3~kZ&8vm7@Qn;Hv=OLW1xoF8~VQ_wV0dz4w=C zyjc&D)9@$M?L5!ll7r0LkQRY}Xr^(_?ErwyBMrR phv6Sz2{inIumClCOPwJ2$qOJ$03yIRO94FN7|WPZ zl|aL9g79OTlh#EE8UYfp#6_R _*@r7+Sv3+g{BLi}ec6-w_k z_&tQs&hb5!3TOO&QuQA~4ZiAc`*th<0000m$lrPt`^uv!x&r_J00000K+=%ji?-+^ QrT_o{07*qoM6N<$f(gSB?*IS* literal 0 HcmV?d00001 diff --git a/src/ja/hachiraw/src/eu/kanade/tachiyomi/extension/ja/hachiraw/Hachiraw.kt b/src/ja/hachiraw/src/eu/kanade/tachiyomi/extension/ja/hachiraw/Hachiraw.kt new file mode 100644 index 000000000..0b2fdbaa0 --- /dev/null +++ b/src/ja/hachiraw/src/eu/kanade/tachiyomi/extension/ja/hachiraw/Hachiraw.kt @@ -0,0 +1,186 @@ +package eu.kanade.tachiyomi.extension.ja.hachiraw + +import eu.kanade.tachiyomi.network.GET +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 okhttp3.HttpUrl.Companion.toHttpUrl +import okhttp3.Request +import org.jsoup.nodes.Document +import org.jsoup.nodes.Element +import rx.Observable +import java.text.SimpleDateFormat +import java.util.Locale + +class Hachiraw : ParsedHttpSource() { + + override val name = "Hachiraw" + + override val baseUrl = "https://hachiraw.net" + + override val lang = "ja" + + override val supportsLatest = true + + override val client = network.cloudflareClient + + override fun headersBuilder() = super.headersBuilder() + .add("Referer", "$baseUrl/") + + private val dateFormat by lazy { + SimpleDateFormat("dd-MM-yyyy", Locale.ROOT) + } + + override fun popularMangaRequest(page: Int) = + searchMangaRequest( + page, + "", + FilterList(SortFilter(2)), + ) + + override fun popularMangaSelector() = searchMangaSelector() + + override fun popularMangaFromElement(element: Element) = searchMangaFromElement(element) + + override fun popularMangaNextPageSelector() = searchMangaNextPageSelector() + + override fun latestUpdatesRequest(page: Int) = + searchMangaRequest( + page, + "", + FilterList(SortFilter(0)), + ) + + override fun latestUpdatesSelector() = searchMangaSelector() + + override fun latestUpdatesFromElement(element: Element) = searchMangaFromElement(element) + + override fun latestUpdatesNextPageSelector() = searchMangaNextPageSelector() + + override fun fetchSearchManga( + page: Int, + query: String, + filters: FilterList, + ): Observable { + return if (query.startsWith(PREFIX_SLUG_SEARCH)) { + val slug = query.removePrefix(PREFIX_SLUG_SEARCH) + val manga = SManga.create().apply { url = "/manga/$slug" } + + fetchMangaDetails(manga) + .map { + it.url = "/manga/$slug" + MangasPage(listOf(it), false) + } + } else { + super.fetchSearchManga(page, query, filters) + } + } + + override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request { + val filterList = filters.ifEmpty { getFilterList() } + val sortFilter = filterList.filterIsInstance ().firstOrNull() + val genreFilter = filterList.filterIsInstance ().firstOrNull() + + val url = baseUrl.toHttpUrl().newBuilder().apply { + addPathSegment("list-manga") + + if (query.isNotEmpty()) { + addQueryParameter("search", query) + } else if (genreFilter != null && genreFilter.state != 0) { + // Searching by genre is under /manga-list + setPathSegment(0, "manga-list") + addPathSegment(genreFilter.items[genreFilter.state].id) + } + + if (page > 1) { + addPathSegment(page.toString()) + } + + if (sortFilter != null) { + addQueryParameter("order_by", sortFilter.items[sortFilter.state].id) + } + }.build() + + return GET(url, headers) + } + + override fun searchMangaSelector() = "div.ng-scope > div.top-15" + + override fun searchMangaFromElement(element: Element) = SManga.create().apply { + element.selectFirst("a.ng-binding.SeriesName")!!.let { + setUrlWithoutDomain(it.attr("href")) + title = it.text() + } + + thumbnail_url = element.selectFirst("img.img-fluid")?.absUrl("src") + } + + override fun searchMangaNextPageSelector() = "ul.pagination li:contains(→)" + + override fun mangaDetailsParse(document: Document) = SManga.create().apply { + val row = document.selectFirst("div.BoxBody > div.row")!! + + title = row.selectFirst("h1")!!.text() + author = row.selectFirst("li.list-group-item:contains(著者)")?.ownText() + genre = row.select("li.list-group-item:contains(ジャンル) a").joinToString { it.text() } + thumbnail_url = row.selectFirst("img.img-fluid")?.absUrl("src") + description = buildString { + row.select("li.list-group-item:has(span.mlabel)").forEach { + val key = it.selectFirst("span")!!.text().removeSuffix(":") + val value = it.ownText() + + if (key == "著者" || key == "ジャンル" || value.isEmpty() || value == "-") { + return@forEach + } + + append(key) + append(": ") + appendLine(value) + } + + val desc = row.select("div.Content").text() + + if (desc.isNotEmpty()) { + appendLine() + append(desc) + } + }.trim() + } + + override fun chapterListSelector() = "a.ChapterLink" + + override fun chapterFromElement(element: Element) = SChapter.create().apply { + setUrlWithoutDomain(element.attr("href")) + name = element.selectFirst("span")!!.text() + date_upload = try { + val date = element.selectFirst("span.float-right")!!.text() + dateFormat.parse(date)!!.time + } catch (_: Exception) { + 0L + } + } + + override fun pageListParse(document: Document) = + document.select("#TopPage img").mapIndexed { i, it -> + Page(i, imageUrl = it.absUrl("src")) + } + + override fun imageUrlParse(document: Document) = throw UnsupportedOperationException() + + override fun getFilterList() = FilterList( + // TODO: Not Google translate this + // "Genre filter is ignored when searching by title" + Filter.Header("タイトルで検索する場合、ジャンルフィルターは無視されます"), + Filter.Separator(), + SortFilter(), + GenreFilter(), + ) + + companion object { + internal const val PREFIX_SLUG_SEARCH = "slug:" + } +} diff --git a/src/ja/hachiraw/src/eu/kanade/tachiyomi/extension/ja/hachiraw/HachirawFilters.kt b/src/ja/hachiraw/src/eu/kanade/tachiyomi/extension/ja/hachiraw/HachirawFilters.kt new file mode 100644 index 000000000..96f63c3ed --- /dev/null +++ b/src/ja/hachiraw/src/eu/kanade/tachiyomi/extension/ja/hachiraw/HachirawFilters.kt @@ -0,0 +1,89 @@ +package eu.kanade.tachiyomi.extension.ja.hachiraw + +import eu.kanade.tachiyomi.source.model.Filter + +class SortFilter(state: Int = 2) : SelectFilter( + "Sort By", + listOf( + Selection("最新", "lastest"), + Selection("A-Z", "name"), + Selection("最も多くのビュー", "views"), + ), + state, +) + +// https://hachiraw.net/list-manga +// copy([...document.querySelectorAll("#TypeShow a")].map((e) => `Genre("${e.textContent.trim()}", "${e.href.split("/").slice(-1)}"),`).join("\n")) +class GenreFilter(state: Int = 0) : SelectFilter( + "Genres", + listOf( + // TODO: Is this the correct translation for "All"/"Everything"? + Selection("すべて", ""), + Selection("アクション", "action"), + Selection("メカ", "mecha"), + Selection("オルタナティブワールド", "alternative-world"), + Selection("神秘", "mystery"), + Selection("アダルト", "adult"), + Selection("ワンショット", "one-shot"), + Selection("アニメ", "anime"), + Selection("心理的", "psychological"), + Selection("コメディ", "comedy"), + Selection("ロマンス", "romance"), + Selection("漫画", "comic"), + Selection("学校生活", "school-life"), + Selection("同人誌", "doujinshi"), + Selection("SF", "sci-fi"), + Selection("ドラマ", "drama"), + Selection("青年", "seinen"), + Selection("エッチ", "Ecchi"), + Selection("少女", "Shoujo"), + Selection("ファンタジー", "Fantasy"), + Selection("少女愛", "shojou-ai"), + Selection("ジェンダーベンダー", "Gender-Bender"), + Selection("少年", "Shounen"), + Selection("ハーレム", "Harem"), + Selection("少年愛", "shounen-ai"), + Selection("歴史的", "historical"), + Selection("人生のひとこま", "slice-of-life"), + Selection("ホラー", "Horror"), + Selection("汚い", "Smut"), + Selection("じょうせい", "Josei"), + Selection("スポーツ", "Sports"), + Selection("ライブアクション", "live-action"), + Selection("超自然的な", "supernatural"), + Selection("マンファ", "Manhua"), + Selection("悲劇", "Tragedy"), + Selection("医学", "Medical"), + Selection("冒険", "Adventure"), + Selection("武道", "Martial-art"), + Selection("やおい", "Yaoi"), + Selection("成熟した", "Mature"), + Selection("異世界", "Isekai"), + Selection("魔法", "Magic"), + Selection("ロリコン", "Lolicon"), + Selection("ワンショット", "Oneshot"), + Selection("該当なし", "N-A"), + Selection("食べ物", "Food"), + Selection("ゲーム", "Game"), + Selection("戦争", "War"), + Selection("エルフ", "Elves"), + Selection("武道", "martial-arts"), + Selection("少女愛", "shoujo-ai"), + Selection("更新中", "updating"), + Selection("百合", "yuri"), + Selection("ショタコン", "shotacon"), + Selection("SMARTOON", "SMARTOON"), + ), + state, +) + +open class SelectFilter(name: String, val items: List , state: Int = 0) : Filter.Select ( + name, + items.map { it.name }.toTypedArray(), + state, +) + +data class Selection( + val name: String, + val id: String, +) diff --git a/src/ja/hachiraw/src/eu/kanade/tachiyomi/extension/ja/hachiraw/HachirawUrlActivity.kt b/src/ja/hachiraw/src/eu/kanade/tachiyomi/extension/ja/hachiraw/HachirawUrlActivity.kt new file mode 100644 index 000000000..9e3866fbf --- /dev/null +++ b/src/ja/hachiraw/src/eu/kanade/tachiyomi/extension/ja/hachiraw/HachirawUrlActivity.kt @@ -0,0 +1,35 @@ +package eu.kanade.tachiyomi.extension.ja.hachiraw + +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 HachirawUrlActivity : Activity() { + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + val pathSegments = intent?.data?.pathSegments + + if (pathSegments != null && pathSegments.size > 1) { + val intent = Intent().apply { + action = "eu.kanade.tachiyomi.SEARCH" + putExtra("query", "${Hachiraw.PREFIX_SLUG_SEARCH}${pathSegments[1]}") + putExtra("filter", packageName) + } + + try { + startActivity(intent) + } catch (e: ActivityNotFoundException) { + Log.e("HachirawUrlActivity", "Could not start activity", e) + } + } else { + Log.e("HachirawUrlActivity", "Could not parse URI from intent $intent") + } + + finish() + exitProcess(0) + } +}