0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

JavaScriptでShift JIS符号化と復号

Posted at

今更ですがShift JIS符号化と復号program晒しておきます。もっとも…復号に関してはTextDecoder使えばいい話ですが、自前実装。
大昔は御丁寧にJIS漢字1万文字以上をjs fileに埋め込んで実装していたものです。

const SJIS={
/* SJIS文字対応map召喚
@b7: mapに7bits文字を含めるかどうかの真偽値
@hk: mapに半角カタカナを含めるかどうかの真偽値
@ic: mapに不正な1byte文字(80h,FDh,FEh,FFh)を含めるかどうかの真偽値
*/
getMap(b7,hk,ic){
	let a=160,S={__proto__:null},D=new TextDecoder('sjis');
	for(let b,c,A=new Uint8Array(2);++a<221;)
		for(A[0]=a^32,b=63;b<252;)if(++b^127)
			A[1]=b,c=D.decode(A),
			c.charCodeAt()^65533&&(S[c]=A[1]|A[0]<<8);
	D=String.fromCharCode;
	if(b7)for(a=128;S[D(--a)]=a;);//7bits文字
	if(hk)for(a=63;a;)S[D(--a+65377)]=a+161;//半角片仮名
	if(ic)S["\x80"]=128,S["\uF8F0"]=160,S["\uF8F1"]=253,S["\uF8F2"]=254,S["\uF8F3"]=255;//不正文字
	return S
},
//sjis 全2bytes文字列召喚
getTxt(s){
	for(var a=160,b,c,A=new Uint8Array(2),D=new TextDecoder('sjis'),S=[];++a<221;)
		for(A[0]=a^32,b=63;b<252;)if(++b^127)
			A[1]=b,c=D.decode(A),
			S.push(c.charCodeAt()^65533?c:"\u30fb");
	return s?S.join``:S
},
/* encode string to array
@S: 文字列
@return: Array
*/
encode(S){
	var a=0,b=0,c,z=S.length,m=this.map||(this.map=this.getMap(1,1,1)),A=[];
	for(;a<z;A[b++]=c)
		c=m[S.charAt(a++)]??33093,
		c>>8&&(A[b++]=c>>8,c&=255);
	return A
},
/* decode array to string
@S: Array
@return: 文字列
*/
decode(A){
	if((typeof TextDecoder)[0]=="f")return new TextDecoder("sjis").decode(A.buffer||new Uint8Array(A))
	let a=0,c=129,s=0,z=A.length,B=[],S=[],C=String.fromCharCode;
	for(;c;)B[--c]=C(c);
	for(B[160]=C(63728);c<63;)B[c+++161]=C(c+65376);
	for(;c<66;)B[c+++190]=C(c+63665);
	for(C=this.txt||(this.txt=this.getTxt());a<z;)S[s++]=B[c=A[a++]]||C[(c-=c<160?129:193)*188+(c=A[a++])-(c<127?64:65)];
	return S.join``
}}
test
let codes=SJIS.encode("、。ぁあ一丁ァアヲンaAbB"), txt=SJIS.decode(codes);
console.log(codes,txt)

試し斬り

See the Pen Unicode converter by xezz (@xezz) on CodePen.

大昔とやらの実装

JIS漢字22560bytesを12851bytesに圧縮した変態実装。Escape Codec Libraryの展開処理を高速化した代物。符号化と復号は省略。

var JK11280=function(a,C,i,j,s,u,c,p,t){for(t=u(12539);C[u(--i+(i>1)+(i>58)+32)]=i;);for(;c=a[i++];)if(16==(c=C[c]))if((c=C[a[i++]])<87)for(c<86||(c=1879);c--;)s[j++]=u(++p);else s[j++]=s.join("").substr(8272,360);else if(c<86)s[j++]=u(p+=c<51?c-16:(c-55)*92+C[a[i++]]);else if((c=((c-86)*92+C[a[i++]])*92+C[a[i++]])<49152)s[j++]=u(p=c<40960?c:c|57344);else{for(c&=511;c--;)s[j++]=t;p=12539}return s.join("")}("yJU22}iY3yM<}ih25W`yL82x!z}j1x!n}j/YkV5yM>2Vy2V>zDJyJZ22Z_x{:,}i]XNSy$!}jMx{K0$242}iU2yJj2}j,3O3yJ^1*}iX3x!wXGQ}iky$^}ij3y$d2W4Gd;/x!vx{W2Z9}k{UTZE2UY/45Gx!my.l0WC50*0WX0D0<0x{ayJhy!G/23yJi}lDy#b4Y@2,2W$0}lAy$$2}kxy#+3XM4}lDy#zYJY2U%6X|!I2W,XDW^I'2}l@y <U:jD/.x{E2x!|}l=y.T}lH}i^1*}l@}io1:}l?}j21:}l=U|1t}lDW#1w}lAx*w1131'}lAx+:1131'}l`x,=1&WjF1:}lHx,^1&MWc1:}lFy+z3;59-9A)A9WB3=59-=A)AAWR@*@9W[D&D;}q#y*514y r1*yM<_GWH?XLWH@WYXTL7W3J.9P!Y&22 2XVWZ}lA_zyJs3y 'yU.y 2yQv1%Vc28[R00y$O@WG4Wa:YPVT0YfVO%2}n?zCfk#fc|S(zTnzx4^czd?|B'| VT8{bAzv|ayuU{(Z| G{yS|c{{/}z[P{'kz{wzhuzcv|'4|ZY{jtY |bpzzx{hi|-Hzhcane%bt]c|Qi]x{,LzDRXFXeXrYrkR_>YcXN^^fKXQY&eua3nJegRe]c;Xd`rb0e&`<gmXFzPXzC_Ar`{t+|Ck{^PzB%wJ{@p|B={b#qxV<|dXzK*_([ZXE^Ta]g3|ZW{>q{t^dw|SK?XQ[izRqWfn){Fu{qJ|A#ltzQ0|gr{cOzB6{]Ps2{?OzXUU {7&|#C|dezd.zQk{=Gmh|Q0zY#zCZ|BPkP{{D|ZrzRF^*h7dokXZ<Z{dbZ$XWm#_gbl|XQ{zBh'^Zpk{>7o2[,|]szvx|3k`&ob{2dzQozKphI[+[ _jb'[?bgXmqL_N]+YKXgYA[xvxeFX}`dw!^Pvvz`!{()kGqLzM*m&XXi}Y a b#d^ZgYRnm{qNs_|gAW`]hzkg{;/{{qzJIzjmh({w+{/`tXzC!]Rbdzv:{?R{b@|WmzB0g$zD[Y,WfY)WOao[]^paG]dZ_XL{`{{*<[!Kb|[ucAb<i,XRYC[XlxXKXJY8Y=Wbbyb1zXg|8Eb#Y-kz|'CzFzzlQgB{K2a#{wJZAdoi#ts_GZ+zD8Xq|0azZd[zYEj6ZYXaY/WK[|XdZ'_c|b!{)x_Cf<a:fQ[Gl<gIgn|Q,Zm|8:zM!Z6j^zTalM[qe#oSdZw7|!Pbr^qrZl_{=M|]U|(6z]q{.D|(+|GGzNXd1zRjw(d;^-bi-binLgb]c|/tXYc!]I^?f+ZZZ>zh?[Z{2R|Xk2{!0{dY{4HXv{0C|d6{BuzNGamw,_vuaZ5Z3| <f*j9zB9|dczR[{1L[,|VY{.pzKE{cXt]|Fr]bzY<|g={.h{zV[9{hozM9{ys{R;zCGZo^suCzM;Z7@wnzW3`-]n]W=Xe`48_#YAXfX}^s]8_iYGYm_=FZn`iY:W+h(Y-]}XId YhYE]z[ZZ#Ys]{[Eiw[&^4cccV[O/BZ,[|[c{x zB^iTpk[ {No`@ZYzko{qy|9Lt#[^Xe5zDo>e4_$Z5]C[Z]tZ$Z5]-Y7[[dOb1T.<[J]^*]Lzp){8sXtY+r'cRzh<{aMaAztF|/iYN`9Z,[cXst2[9[;zCI^RYHpq^_k<Xs_fjSmWa2c?jhp/`_Yz{!A{|d|VvzRo+]Y{/=^Y|25{[@{,s|kszQ5oh{u7gOt#zB=XNYGXlf.Y3mhbJZ|gE^Af{XQY6b{bqjyXYX|^hWbY-{(T{K4zQ}ph]Tf`?XZwa|&pcac5g4{AsvZ|b;zCr42ZX6[>Y;{d/zKZYJ[lWJY#Y1]s`ue/_ODZNRN`O_3fh_picXLfxr.>Zmb+|DDa+dK[fZmzD^a.ubufa-zjbvh_}u%{/9{hJzIg^ue4ka|JK{'nh<KqyggX^]?_yfeZ}f(ZI^/ej^UzS(|H^zC&^.c8V.{LTZ(e$wV|>$wq3;zKazx3|&tzWI{blzHtziP|BLjCzBW{6@|F}zjs(mA{c4{;,|VI|?{{c?{Hx|Sr{hK{.]{mn{/:|K5zOl[6|$ye9{q1|>B^jzQ'|,v{_FzFxZf[aUid<^/{OSz]X]xisSZZZk!Xd^_YM[?Zm^(i2mDfL`[XsXoYx[-c,X^bia}X}Zmb}rBh2{yf|A/|cnzN]z{$_^{Cz|T&{/*zI2{7)[h`xwz`zwI^8{+bzDd[PWkXa[$Z%XLb)[vZ``ed[`UXhZeYDhhZwp1XPYGf[X}g#{X9sgqd]?]{^E]BaSaF^0]pe6zK,_UEw Yq{?DY:fjY?rkfjn_Zd|S9zBt]occY^_x`u]D`*Z#YAaRaN_dkPeKth|-E{swXbaP_WdgbFd}eb]QkUzC^/Y@diZk&iRgwFZhoA^<t9dT|2d7Z<i{zC'|cNzCnZAXTY/.[@XD[@KXgYbXkXO.],]zXs^0^,:XS_O3AYF<HNY&[GZd[XXcZ8]EZ0XcYwY>YzY;[A`1Z4XaZ/Y3k>[c^:^(`>XFDXhXu_^WlYr3YiX]Ya[5fpF`W]8X|cWYqZf{[X|J `EYo]j]E[L_]zN0Xr[YBfBu3{D=|7da6|k_zK4ZY^e`P{b1|Ei|gv]#{Mf{A{{v1{Rgzu*ZF|`A{LX|@z{7n|W}zD7o`Y9[h]Mip[mdv(_,Y=g`ntmVgM|b#zCeY{eJ[JpFY<9t{epnpbu|1rrl|-qz[zmHeUzIV(ZJ{+YzTwb{[k^JcBa%[benax`2_o|F]{KYhRB[T{'W{jAkUfZjMn'zN9f9{,M{pS|8>zLAhK|Rpz_O{2`{t-zT`p9z^n{]R|iWzEna/_:{#x^?ZUZJ{bvZ;^ |JT{/E|c2{dszP6zKtYssrle]jXY_@e_|$w|T_{Vv|c[{ =|J+q&{WH{)dzB.`,alq0eHc3Z:a=sP^9[gjza,oLfd[feon-{'vZifUzDB0Y+Xg`X]p+^FZb^fZI/XW[_Zg]gXJ]^Xha+_ zh5ue?XL]gcNJYYm'ifY=ayRCb]Y%ZZn8Z1<.XGY'^.Ft^_){7yzCTYwXs]utuYigh]kb&fTc3{;Th@_y[$a.Y>k|XH]i`Gwd{:E|k$zrP|4f|g@{d3|>nzhg|TyzB(iOd3[G]IZDfZ{@LYLkb|9+zhy|#){fbzHp{.9{yJzk&|#t{lxczzL&u}mU|:K{'f{H[nfcca/wrc6]U|($tPzGy`yrfwsrN]k|E=YA[q{z6zi?bT]zzBahXnGkmf[e*mPZajSm.|;,c8p zJW`cYXn*m{kZ{kb|U1zZ`zR3Y`l}Y`]_zGGzww^RuE{`j<b]Zu]6^qXS_kc?[9^ta%Z$Zl['Rgt|F1zD-YT^K^Qzsy_ui'e>]|grvy|FcY|zR9g_`C{>V{_cfF{hez`7{I0zM+|,@n2zG#zlerO{Z aym*|^PzLSzt3jGbi^p_dYiZ7n/ixzo6|B{Z|k(zLtXXz{Ee!Xjm2zqS{l+]Q{+Q|$}XjfwzO![=hWg5ZkZ.|IfbfzIXY-]pXeXHYkZfY#WiZOb6XxYC]*Xs:3:_d7XxYUaP6XyYwWi`-6RXkZr[1].G`$Z5YFXqa%WhXce1[G[jYjY)YPZYXR]GYWbBb%Y{Z'aUY[[9NIP^CYBf;Z+[%Y`` ZfzB//GXZb%ZBgxY+Y^_OaW`*dg_]&iOh/`ZffugkdjK[vzXo]u|Zdz}:j%`&j]{mQ^y^Pmf|ZD|)Vp9zj]zEIYoWQglg2]o=cd]<^6_{Ya`@YscgY>m3YK[t_8YMb2f%Z5a<d-YUeBZYY]]]gCzD'8b'jxY<aa{Rpzj_{ulq=hykGZt{d_|38|X%|ESzZyzQj|AyzSBb.kLh@pje'l$gCb:pnnhZ|]n9b]{Pl|`^zlqY'o@_+|;1rX{ `ce^%{|_|X4T:|.3{C={$WzivzB;{E-gJ{)@zLQY7Yrl>hlYl^>aqXVYqXw_xUYb2`?e>`J]niDc zaM|.2YG[.$XYgl]&i 8{'R{a[lE|THzp&`L[KbqY4]-{Zi_S^U^F`j|8IZ YBYC{]gzM8z}&Z5Ycz|A|1N{bu[J|2r|Tx{k+ehgVzDF_i^PNo}Y$E]ydwR_cbHRegYAWO{-um{^GXP{(8{bq[;_&Y5[l^'YgObRf=_Y[4_}0_/Wba3j0zN!ay{BM^SzKQ{`.fEbC{i;zY-^Ze(lOb90_VsH`S0bfXjYN`UYNXEqDdZ|S$|Bg|ljzJ,]?[eGzGch_b)Y&{JszheZBzP:zwXA_cXHW9YAZ|[)Zzzo8{3FXQg1`nzCR{U*Zyc$_EZYWJ`ca)@[ Xr[L`he}`.Y1albka7zIqn^qy{w8bGniaYzFyYw^([9zv@`xdCkw|;<_fzG0zk#|8h{(<{kOzPp|-'zK`{!Xzh1DYeo<b)|BbzDCuUA{:f|1szV3`u]Am<[qh+{x>{2*|S)bjY)zEeq4d%{rAzkw]/[dYa[8ZRf@iR^C{tGYw[chudZb-XOjbp.|cazDPg&gP{df|F!kihk{AN[WzPq^FjFk}XhXVt<b2da|18u2{C{|3h{{-zLu|(UzRO0zEW|BYV5zbl{uNzoR{d#|@}{0h|70{Lv|dr{4Z|2vzB_g8`K[nz|oZF_=h%`0Y?_Km1aCZ$^g_|YNigcSqGzZi^9j}juZRct[BsK|30zH {ZZz[Yo$[WiwiGs^dSgn`#g=rRs7{fJ{SUhZXzs<|Ar{a6Yoq%zfs{XnzBRZ.zhsdu`{be]gfm|'$^b]vla]Vl*{44iqaE{z8] p5zB&b*YJcIjp^wNXpYXRXWXk_7[,bwY@p.a%a)^Ur`Z.Xai`b.N`FY3ey`{`(fXzO>{ H{X {+oh0m6|8al8`c{<cz`U{1?Z'|A_c&{Ty|A|z_p{.G{!IjLzET{BA{-z|@y|#O{kj|Jz{1qj6z]7]>_.{j={J`zRp|Fy|hnzCwYgZxJ^#|8;zSQcfb[_}Y=IXlXI[{_!YJY[fTbw{]DZqYBc_e8nPZMbC^$YkY:Yq|lW{<!{$5YOYXsHn%ei|BobM{A+zUCv}fa|?gYf_PzKbl@Z'an_;{?${n0{Rr|8Y^|sB{F_zE.{8mc|h<|U,zK7``dRS[c`Qatig]wkop7{|yr3aiZR_I{[>FzO#zqCz[H_NkGzGl[UXtRXTaQb)5Zi_7[oYZas^.]Ib)Z;Y>XD{Wa{>^Y]Ub`r[gzs8{Tvc(^'</]5YazMb| DZpY@dWZ`[O]{^I=d7_V]i^X|QzzIo^^[Dd#d9hVa8p^vJatiqaQ|BX_+zlI|fyzP]zs}M{> fRf`_U^{{9#lh|2s{.H_WzM){bs{1fzjl|fh{z<ziB|E:{D|zYYiXe)eqlt|7ScqnhzSZ{*}|GFzbI|CLzKozBsc&|$gh2{EY{ l|Jq{27|]b{l^{SqzPu{25|>To={:RzCUzj^`r|AJzO||8o{s_iQzr@l3zC<a3oV`Z|WhzDivDjH|2R{D>t<W/zie| R{ML{IBzpn]2bl[,{ITw.zBizr=zBqsZTWtu{C}{i{czXWYQ|@p|/q|'^zoIeh^y|/a{,uh(Y lEd+ze3{p_az|]YzGLzqadGY{]w^n{WL{K%{tEWl|?B^zzGgo%`6{/oZWo*]J|8TzaO|9 sS|A{|*${a1{Z]{}gzE@axZ_z|wfxfqs}g0Zkh_b3uy{+6o}a'{luhM|]ofZzM.{f2{]/b+fD{e%{6MzpZ{sb{SJ@zKT|H?{@Yo'|F,ryzE {pYz|E{e,|QFm5zY[^4|(A|TIzEEa1[3YH?u<j+[s^Cf4Ai[Y,[K[uqocucFkj{fE|F[{HV|X/ZF{ .an{Sd]+^A|#m]]zPGXHZ>gwfzZ_[C]HXQXSa&jIZbqhZf^8[Tc}]^[;o?^d^WcMl,].{4({g^zI:zj`bUnoe!p:`rpc|m({-l{aezPV{T(|a*zsK{v__M{snzs YN{S[iE|BA{/Pzd4Yv{j {Vd|49zGNzsOve^t`iiAeW|,U^B^zzq}ff{Tcd:r*|JMWG|! _J|dVzTovaj%nf`V|8DXM|XX{&u{RKzB2Z4r-[X[H[tzL5zoXY_]+_YaBXQZ0lMf=qrj/XlZiqD[QXhYSq)XIzFd{%,ke{x'_<Zs|D5zj!{2(|Yj| [ZFzD}bEzt2T-qI{`8o#n#YD{>{zrXb#uuzD<{KB|btzM7_._2_8qsZ3{Gdzbp{hRXwX_|U {'P{s3zB>[j^Ukuj(AY]q;zBK|#g|Q*Z;{h<|W{zJ@n[{V;_JzMV{Yw|#:{edzHLq;{J}sI^w|@xKY>zFuaKmQfM|W&zG6{w}|Ilz[,{ FoMt/|-nj={b3zOXhrqCY{evg8{gen?zG}WRaN[Ncu[%_M[a0X[[{dHY|^,Y@[`i+=dEm*iZ`P^*[gZI^l^f[%^ve-_%j0d#Y>zBuXt^A]{fj_Weg]L2_`eFY,Y{ZlzK|{j2boZhs ]=XTh}c=zS)|XIzP4zIw`$gf{%3_|{K@fua |F|zO<{;:Twz^rjQzbU{,){r,zLo{WO{$F{^I|b5bLz^<^C{)8]$dbzU:{3RzpN{v^{-6|c/{.C|d|{/FzCp[Jcoz|ceCh=|A%zFc{mk|kezB,zx|{@MYq|#<zS}{,'|b&zoH{eszkrUO|(z{?t|!V{ablAzc>{hV{9cwizORjN{Gk[Kh9|UXj?{1<zemVszL2_bY5{(|{Wi|AX`>unzd3{K6{A6zK6{0V{kuXN|V7mI{$Uhg{zSzc)^0{9,m1cakj__eSzJx{,%|l!{Wx{,`zOy|ZkzjEiy{hG|8MzVDzw+{iy|Q zO{zC(b<mW{Jp{rh|Fdzrg{ZWzQEzs_{irq)eXe+qJ{.8|$||Mezx!0{;Rsc|3VdyzV$zEc^.]NZnnp`v^yZK_MauZ:k6UZhh2^OdL|-g]uhpXiY)i0|*2zaszCQZ:TF|2Nf+qRzINzpvzc;^ya@g;QZ0^q_hYSau]]`|bzhDfPY;dwYEf-]Qa*_Tiz`*zy;Z}q![_ZZ{qYXQ{>E{pooo[K{,c{|J|XYTL{<X{jsl)|E[zC:fztH{6jf]|%>Y%b`zMZ^;p3wB[h{OpYB[m|-aCqmg/Vpzsq{NLm5sL{!5{S_zN_{=![ih*[^aSdT|Sp{cr|m{zFlzy+e(|&rzCOXI_%zBFc4u3sua)gTg}ae[y_i`ihEp@hh[aex]TzNq{l*zH(bR{-8j9d2_]{wM|?Cmkhr_A{Pnz_V{={{j@|X|zDQXtXw_%Zdwc_[{NxhGsa|GneTXaEn!Z4{*[fCzMHYQ{Fn|-Szqg]3[R{B8^|wN]h_ueP|B(aJzSK|bP{68ht|8`[:rizO-n!eZX[oL__Ic`]Vb8Y`qsdAYBkwsLzKV|k8{`-lT|JW|3?zH*e0|26{7t|8b{u$zwFky|iOzCc0|d9|20|%2W${11h;u*q?}lezrMzB56F86744E3XK4|7ezCS{wxzrNzCWA223?44I0(3-F8@#ICXsWSXL3+ XPC8:WaWl8RW[HA]3TM<Wm;4':'E2XV?WjG,W^ULZCXL94WO!S&X_5{+]zHR,)C-G=9KWiXP/H2Wg@E989'<<-E)2E0078J.6052C+9?{d1zKR25C3gpzKv.73332?3-8229/2/6995C6|&kzLw546:78:+J4567G&82C'G;&;=/A8/W]H:|@f0zO%2@*==;864|ZRzOYD342>3{S1zP*4076:=336970zB<gK5zLd]9<6hhzQ<-<E;70:37>{g7|TgzRD{+UwKzRS+6>8X^4Wj2@#9$%XRXcWdJWNC7*SWg6'?='XcWXGWk8I5W^4HW`K/M>2XJ6Wg!0>WfXy8XDWgW`XOWgB2W_,XKX^WeUeZDFWY4K7AWK8XGW[RXSWiKWcI9 XbWaPWf0OW[Xw3{IqzXr3-7XT*WHX_/M+;G%,G:9/?+63.97435H<806604376/TB[c;B2GWk6@KXyWEWVO;;>D!77D4?/2XXWI>XI?5XwW,XcWgXF{8nz_hWiX^=XUWd=@XEWZ.'H?/730>(9,A<0322697<{03zb&82677{chzbV,/=/;/86.@:MzEpXotf@ES%W.Xn2Xm+#<WkBXGXMWZWj2XM9XQS3>(,XG%@4WkXE2B0<MVxX|=963,B562;58434u zhS74XDC<53<-E3--8767.C3267>37A29696.0UWZe3zC+zk;4D64zc@aQA,7,?*:CAE.$YeV7R;3XgW@-'4?)00XU7-.R84B./Q,@3@WPXH6>57056A84G@0);L2>0.?:.<43WaXO25|kbzpyRR27908>+.28082463.55767Xv0W,76D5<:853W_S6239=75=0.</:'H,0996@KXFWgE*WjZ?V%SXaW6(JWcXDWh+G,WgXLQWeXJ>WfWi-8GW^RW[XK0WlXI=X|VvHWhH,2,FWbXxWTXI$W_UrZ6:WmXDY:WE! 2:%7:OWW'M2XZ(Wh0XD&. 9:63XP5W_22B:,'=Wl/'SXE.!XFWf7 8K4O/0XOWN,4%B{pczz.J.D5+</03392509844:5332?>A6)69E78&E24X`W,BXe+WhEXQWD^dz|rE /)6WQXOXeW`4XWWX7We7X}Wl@Z8UiXi)#XLWHXNWj+GGW3/XwXLWT7NWd:XEWKXtOWO>DAZPU/BWeXz98WUZEVD/C5W]XUO)$3%NWhXP'{wo{%b2z|U_0=X_WG//97.L5WgP09:2303{SD{&n?0)<70F7;2|5;{'e5===4,497:/82A]2T)*)])TS2/WfXT&6)N0842(4?D67,,E6XE)A&/9%O57V8Ym4863I8992|Uj{,+B(<(0@I3*;2XFWeXZWPWlS0L,WbXSXYWBXYWDXWWLXM+06=WHF)R`R{.dXIWaH>WcMY*VQXO;E9Q OWe:/Wf_${0FW8XcWiKXwVW!YHWFX`WMXl5W8XLW>8DWlY&WY#WP=XdWQWe@XZ3 :/W!Yy/WcM$WgXK WHX]WFMWTXR.0XEWgXj-SWm3CWiAzif{3CDW[9WbYLV<@-*PXK;KJWbZuU$*&OW)Y2WLXHWTP9YuV; XRWEY+WAXdWLL(>W` WhY3.DWbO2%|&,{5}90',*XS$?WHXQAB;|&+{6`I5|ao{7(J0{Wf{7B|ZS{7P-78:,853H27250;<.:772540356;69=>09-|kd{9Y<28:0X](>9I<>WeKWaWh<P/XUXNW`WhKWlIWN4>-REWhBXV|,:{<t&C,W_M/W]+XyXQWN'PW^XV8_H{=gY9M&W(CPWO?XG#WlMWh$XVW]<!F5XaXcW=WiX{WkW]WcXjW=XmWTWOXE(EWSZDUSLXlXIWlXRWlMWh#FWlS2W7GNWZYhWM[HT1=7XcW0XaW;XeVtY7WRWbYT%/:0WmWjY^VSF+WYXW4XRW Xo /4F>WbXV'HWf5J.WkXO3WmH ?WmN0V3Yo,8B?%PCXW*NXdW8=,,XRWjC-XQ%P.Xn XTW[-Wh;GXDY1VcBD5XLW`6E(<+C=,?8.7?4<>6053:24276>M;507<5=6C*B4/;5A/2I/zGi{M8$C+8H,+-JA2|l {MyD/99.70XpWiLWk6XF: Z-V<Y/W3WPX[9LWhQ+WfL>8$8=9>D:XD66URZX45365/280>038309/<97A9:.0CWiE@,453</A2WkG0*C749/P!A#9,5&M.98;,Q2.6Wm;)2I3-G9*223A-<=2/G-:2722.653535546449.72G55229<:-=4534|&D{X(>0.XF,+82&M2@D?4 ;K0,F.7@/C747.2/=7;438<?A7[ U/ZtUPXkWdC'O#HC&6S&6:Wh/:6S,$XD(D<09D0FQ(9,,/XH6<D;|m8{`S5672@=C6&3XF6<280V:Yw;4*=E#I28|n.{bb:5<@/4/DPWf7@0,|C,{c]4437/72452584C>,-XNWc26H$?KXKVdXkW;Xc*XQ @$:2,3XP,8Wl@/!8.WKX^XS'<4WcCH=XI4WO0Y@Vz8=W^5Q'WgXN54&I%C@(B,!A986#@8:?>E:&:'8<00.<546.G+;7|ay{i]4335=-K*&X]7Wa5>'BXNWa)XE'7W_EXQ'WOXUWlOP%&CC'WlYWV>>XNWYWeBXI68+N(WmXE6J/!PWlWh3HXEQWR+5;%,9XN'*9,2P!0D09V+Yn|@l{m}:247/423)>2Yb3<822325058292/B;5.6069;0.:=48&93|5!{qR25<0>64;7|ZA{r7/8872468H-@-=73647<0/7453630G)8DzKz{t%XP;%5WeG-XTWd3XK?+=M|Su{ud)F/W(Y:.(2?@63'3O&@0W9XUG86:+643)@5590 C628D2442434447D3>,>J06.66/732W@Xe727@6J%M!XV3-$S08Y_VI)/WcXIWSXNWMY 0W`M0@*H&Wh-Wj2Y2FA&4%VgY0*4#XZW;3XLWgPXnPWUWaXP7WRXTW3XWAWVCLF/VwY@Z7U*Y7W:C[+U`$%XdW>EWeWZWdXe;W9YZVrXy7W^X[%WlP'!6AWHYEW[&XD2E$'0WfXfXD& *Z*V!;XLXEWb:*OWBXH8XqVwFWX8CXZ!FWhH699(NB:)$-=M)G@?zB{|&j<9;SA72W_2XK*F3WhJ[h|'eXJ;<4$-EXD%3)4)G)5WjBXK<)5Wh5!Xh0JWQ3XGWaB7Wi+A8YaVw.WaXNM#4A|Td|*PJWmE0&XU4WlXP/!)2HWAXa60>0A64WlE:/A865:G.QWT9XYW:AF,MWi:WiH=@#C2A525M:+)%;C9/:XQWX862G4(,3EWNXe/9/:.6648663:6:9.7449432K32;>5<D+-@39B<K(%3XU!0'XD.3XE* E2%:R:&IB9%.>XDWI3FWe.XR,DWDXV+8:D|W$|436DWhJ<40,>60B%>46:4=352442Yf8/:5336>;=398-6427WfMz{!|8J.D&2,9C*XD0(XD.2:26.9/4|m;|9TW7Xi3Xs753?IXJ--F<-'@ P2%5J=2'O2#@XD$,5G.345)B<-WGXZ#R-;67/080:/46B(<5GWi>844A9J0 D=,A.8+:4-!K>9/=.-?..9:6722XY45;39XD<.96Y^VFB%2H5=WjB)&M@05W<Xy1$W9X]&I37;88j7|BxA,50;07J835XN3z{M|D(XHA8J/K=3<35;0J/*Q:5,<07729367:3+R*2XIW_FIWg-Xo*Wl5LWbXoW'=6Xn+.9W<Y:Wh/XSXGWiXlWhWi:):H,7R5M#WfX|-2WeXFN2B.$WiK$)MXW+0 5:XG&;WjJ8B#H63-=|Gc_@637WZS34/Zm64;3328907@0/6={DS|Qe;0:03765.Xa872D;4-XMWc3038=+R<.3D.;2/5332F./5|/&|TjXRWEXE<33<,4/84<77:52733+8D5533zOK|V@79=(6*=652==/.A2@434BBmS|Wl{cu|Wp0K.XMWj.G7::-Q52240XX636?04XD3I7:35:-27-=3@258-<,72+:Xd2>92?XD-3,*M242:.:?'WZXXC=?./4,H)?-9440630Xe4=5@332;2424:-47.75<C3642331$524C0=/248MP ?62929==;Wm>:32B03 >X{W500XF0&;*+3;)+XKWk;0.@HWiE)M78@3Y465J0WaI4XE-YNVM-XFWN.XP/093F27Wk0:JH/XEWA<Q;6:C.+.3=:$H+XFWl83?N24Xy55584274-=95@#4|V6m]322593046486323322;2{W@|l_=<C=93@-22626/>,5P85z_D{3@|B_{PrzLj{I*}q={n+vGu=Uv|!bzG!{Fa{)B`4|I{{+Tzs*zBMZ!L54XWNX^)A+XZY8W`WZPXIXKWOXtY%WbY7KXZRXOXJYL;KLXF8NXpRPXL}ZdzTIWlPXxYL^(=XiM0}Ze2z`WEX{Xj937XcG]MY/{S(ziUEXSYMEX]XSXM}ZgzmOXLXm2H[_DXTXrXHYDXI6Xv(XmWOPXG*Y-Y@YX[]Y0X_XRYEYxFXGWKXF 7Xc#3}Zh{*(XG8C>X]E}X6{,dXwY]VGXcXeYP}Zi{2=}Zj{2nXlXpX]WXXN<Y)3Z[Y.NXKWgY0XKYHWfXHGXDXJ+;X_XDWHFYHZ2XNXbA3RY!XGY)&XzWh2}Zk{IRX_Yy>Y+}Zl{N<Xh=>>WmXVWlXR506XUXHGY'Y3Z}K3.<}Zm{XtzO({[:XNGGY|}Zn22{`=}Zq{`D[CG}Zr{d$Yy}Zs{jYEX}WgXWYAZ_X|}Zt{zRY&NXjXPXtY1Ye7C}Zu|% }Zv2|+PZW[*XFXdXOHR}Zx|3`Y!XM]!5OY)}Zy|>D}Zz2|BmY<}Z||DcCYy.8@2'2R;+XQ7-C<)WfXOXbWM2Y4 3(}Z}|IV<$Xt-WW}[ |JCW_OWcY3WeXoSIKXZE4[W}Z1Xo|T*CYI99;335Zl?}[#2|[0}[%|]KYvYP4Y_.NS;Xg] ,}[&|iwZ }l;y!%1*}kx3UX,}n=|o51xy!%1*We1*}kx3UX,yP_y '<[ 1y}n1".split(""),[],92,0,[],String.fromCharCode);
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?