diff --git a/reader.html b/reader.html new file mode 100644 index 0000000..9e101f2 --- /dev/null +++ b/reader.html @@ -0,0 +1,74 @@ + + + + + + + +
Drop a file here to open it.
+ + + + diff --git a/reader.js b/reader.js new file mode 100644 index 0000000..7405c27 --- /dev/null +++ b/reader.js @@ -0,0 +1,145 @@ +/* global zip: false, fflate: false */ +import { View } from './view.js' + +const { ZipReader, BlobReader, TextWriter, BlobWriter } = zip +zip.configure({ useWebWorkers: false }) + +const isZip = async file => { + const arr = new Uint8Array(await file.slice(0, 4).arrayBuffer()) + return arr[0] === 0x50 && arr[1] === 0x4b && arr[2] === 0x03 && arr[3] === 0x04 +} + +const makeZipLoader = async file => { + const reader = new ZipReader(new BlobReader(file)) + const entries = await reader.getEntries() + const map = new Map(entries.map(entry => [entry.filename, entry])) + const load = f => (name, ...args) => + map.has(name) ? f(map.get(name), ...args) : null + const loadText = load(entry => entry.getData(new TextWriter())) + const loadBlob = load((entry, type) => entry.getData(new BlobWriter(type))) + const getSize = name => map.get(name)?.uncompressedSize ?? 0 + return { entries, loadText, loadBlob, getSize } +} + +const isCBZ = ({ name, type }) => + type === 'application/vnd.comicbook+zip' || name.endsWith('.cbz') + +const isFB2 = ({ name, type }) => + type === 'application/x-fictionbook+xml' || name.endsWith('.fb2') + +const isFBZ = ({ name, type }) => + type === 'application/x-zip-compressed-fb2' + || name.endsWith('.fb2.zip') || name.endsWith('.fbz') + +globalThis.open = async (file, emit) => { + if (!file.size) throw new Error('File not found') + let book + if (await isZip(file)) { + const loader = await makeZipLoader(file) + if (isCBZ(file)) { + const { makeComicBook } = await import('./comic-book.js') + book = makeComicBook(loader, file) + } else if (isFBZ(file)) { + const { makeFB2 } = await import('./fb2.js') + const { entries } = loader + const entry = entries.find(entry => entry.filename.endsWith('.fb2')) + const blob = await loader.loadBlob((entry ?? entries[0]).filename) + book = await makeFB2(blob) + } else { + const { EPUB } = await import('./epub.js') + book = await new EPUB(loader).init() + } + } else { + const { isMOBI, MOBI } = await import('./mobi.js') + if (await isMOBI(file)) + book = await new MOBI({ unzlib: fflate.unzlibSync }).open(file) + else if (isFB2(file)) { + const { makeFB2 } = await import('./fb2.js') + book = await makeFB2(file) + } + } + if (!book) throw new Error('File type not supported') + const view = new View(book, emit) + const element = await view.display() + document.body.append(element) + return view +} + +const getCSS = ({ spacing, justify, hyphenate }) => ` + @namespace epub "http://www.idpf.org/2007/ops"; + html { + color-scheme: light dark; + } + /* https://github.com/whatwg/html/issues/5426 */ + @media (prefers-color-scheme: dark) { + a:link { + color: lightblue; + } + } + p, li, blockquote, dd { + line-height: ${spacing}; + text-align: ${justify ? 'justify' : 'start'}; + -webkit-hyphens: ${hyphenate ? 'auto' : 'manual'}; + -webkit-hyphenate-limit-before: 3; + -webkit-hyphenate-limit-after: 2; + -webkit-hyphenate-limit-lines: 2; + hanging-punctuation: allow-end last; + widows: 2; + } + pre { + white-space: pre-wrap !important; + } + aside[epub|type~="endnote"], + aside[epub|type~="footnote"], + aside[epub|type~="note"], + aside[epub|type~="rearnote"] { + display: none; + } +` + +const $ = document.querySelector.bind(document) + +const locales = 'en' +const percentFormat = new Intl.NumberFormat(locales, { style: 'percent' }) + +const emit = obj => { + console.debug(obj) + switch (obj.type) { + case 'relocated': { + const { fraction, location, pageItem } = obj + const percent = percentFormat.format(fraction) + const loc = pageItem + ? `Page ${pageItem.label}` + : `Loc ${location.current}` + $('#progress-label').innerText = `${percent} · ${loc}` + break + } + } +} + +const dragOverHandler = e => e.preventDefault() +const dropHandler = e => { + e.preventDefault() + const file = Array.from(e.dataTransfer.items) + .find(item => item.kind === 'file')?.getAsFile() + if (file) { + document.body.removeChild($('#drop-target')) + open(file, emit) + .then(view => { + const style = { + spacing: 1.4, + justify: true, + hyphenate: true, + } + view.setAppearance({ css: getCSS(style) }) + view.renderer.next() + $('#nav-bar').style.visibility = 'visible' + $('#left-button').addEventListener('click', () => view.goLeft()) + $('#right-button').addEventListener('click', () => view.goRight()) + }) + .catch(e => emit(e)) + } +} +const dropTarget = $('#drop-target') +dropTarget.addEventListener('drop', dropHandler) +dropTarget.addEventListener('dragover', dragOverHandler) diff --git a/vendor/fflate.min.js b/vendor/fflate.min.js new file mode 100644 index 0000000..47e072c --- /dev/null +++ b/vendor/fflate.min.js @@ -0,0 +1 @@ +!function(f){typeof module!='undefined'&&typeof exports=='object'?module.exports=f():typeof define!='undefined'&&define.amd?define(f):(typeof self!='undefined'?self:this).fflate=f()}(function(){var _e={};"use strict";var t=(typeof module!='undefined'&&typeof exports=='object'?function(_f){"use strict";var e,t=";var __w=require('worker_threads');__w.parentPort.on('message',function(m){onmessage({data:m})}),postMessage=function(m,t){__w.parentPort.postMessage(m,t)},close=process.exit;self=global";try{e=require("worker_threads").Worker}catch(e){}exports.default=e?function(r,n,o,a,s){var u=!1,i=new e(r+t,{eval:!0}).on("error",(function(e){return s(e,null)})).on("message",(function(e){return s(null,e)})).on("exit",(function(e){e&&!u&&s(Error("exited with code "+e),null)}));return i.postMessage(o,a),i.terminate=function(){return u=!0,e.prototype.terminate.call(i)},i}:function(e,t,r,n,o){setImmediate((function(){return o(Error("async operations unsupported - update to Node 12+ (or Node 10-11 with the --experimental-worker CLI flag)"),null)}));var a=function(){};return{terminate:a,postMessage:a}};return _f}:function(_f){"use strict";var e={};_f.default=function(r,t,s,a,n){var o=new Worker(e[t]||(e[t]=URL.createObjectURL(new Blob([r+';addEventListener("error",function(e){e=e.error;postMessage({$e$:[e.message,e.code,e.stack]})})'],{type:"text/javascript"}))));return o.onmessage=function(e){var r=e.data,t=r.$e$;if(t){var s=Error(t[0]);s.code=t[1],s.stack=t[2],n(s,null)}else n(null,r)},o.postMessage(s,a),o};return _f})({}),n=Uint8Array,r=Uint16Array,e=Uint32Array,i=new n([0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0,0]),o=new n([0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13,0,0]),a=new n([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]),s=function(t,n){for(var i=new r(31),o=0;o<31;++o)i[o]=n+=1<>>1|(21845&d)<<1;v[d]=((65280&(g=(61680&(g=(52428&g)>>>2|(13107&g)<<2))>>>4|(3855&g)<<4))>>>8|(255&g)<<8)>>>1}var y=function(t,n,e){for(var i=t.length,o=0,a=new r(n);o>>f]=h}else for(s=new r(i),o=0;o>>15-t[o]);return s},m=new n(288);for(d=0;d<144;++d)m[d]=8;for(d=144;d<256;++d)m[d]=9;for(d=256;d<280;++d)m[d]=7;for(d=280;d<288;++d)m[d]=8;var w=new n(32);for(d=0;d<32;++d)w[d]=5;var x=y(m,9,0),b=y(m,9,1),z=y(w,5,0),k=y(w,5,1),M=function(t){for(var n=t[0],r=1;rn&&(n=t[r]);return n},S=function(t,n,r){var e=n/8|0;return(t[e]|t[e+1]<<8)>>(7&n)&r},T=function(t,n){var r=n/8|0;return(t[r]|t[r+1]<<8|t[r+2]<<16)>>(7&n)},A=function(t){return(t+7)/8|0},E=function(t,i,o){(null==i||i<0)&&(i=0),(null==o||o>t.length)&&(o=t.length);var a=new(2==t.BYTES_PER_ELEMENT?r:4==t.BYTES_PER_ELEMENT?e:n)(o-i);return a.set(t.subarray(i,o)),a};_e.FlateErrorCode={UnexpectedEOF:0,InvalidBlockType:1,InvalidLengthLiteral:2,InvalidDistance:3,StreamFinished:4,NoStreamHandler:5,InvalidHeader:6,NoCallback:7,InvalidUTF8:8,ExtraFieldTooLong:9,InvalidDate:10,FilenameTooLong:11,StreamFinishing:12,InvalidZipData:13,UnknownCompressionMethod:14};var D=["unexpected EOF","invalid block type","invalid length/literal","invalid distance","stream finished","no stream handler",,"no callback","invalid UTF-8 data","extra field too long","date not in range 1980-2099","filename too long","stream finishing","invalid zip data"],C=function(t,n,r){var e=Error(n||D[t]);if(e.code=t,Error.captureStackTrace&&Error.captureStackTrace(e,C),!r)throw e;return e},U=function(t,r,e){var s=t.length;if(!s||e&&e.f&&!e.l)return r||new n(0);var u=!r||e,h=!e||e.i;e||(e={}),r||(r=new n(3*s));var c=function(t){var e=r.length;if(t>e){var i=new n(Math.max(2*e,t));i.set(r),r=i}},p=e.f||0,v=e.p||0,d=e.b||0,g=e.l,m=e.d,w=e.m,x=e.n,z=8*s;do{if(!g){p=S(t,v,1);var D=S(t,v+1,3);if(v+=3,!D){var U=t[(B=A(v)+4)-4]|t[B-3]<<8,I=B+U;if(I>s){h&&C(0);break}u&&c(d+U),r.set(t.subarray(B,I),d),e.b=d+=U,e.p=v=8*I,e.f=p;continue}if(1==D)g=b,m=k,w=9,x=5;else if(2==D){var F=S(t,v,31)+257,Z=S(t,v+10,15)+4,O=F+S(t,v+5,31)+1;v+=14;for(var G=new n(O),L=new n(19),N=0;N>>4)<16)G[N++]=B;else{var Y=0,j=0;for(16==B?(j=3+S(t,v,3),v+=2,Y=G[N-1]):17==B?(j=3+S(t,v,7),v+=3):18==B&&(j=11+S(t,v,127),v+=7);j--;)G[N++]=Y}}var R=G.subarray(0,F),J=G.subarray(F);w=M(R),x=M(J),g=y(R,w,1),m=y(J,x,1)}else C(1);if(v>z){h&&C(0);break}}u&&c(d+131072);for(var K=(1<>>4;if((v+=15&Y)>z){h&&C(0);break}if(Y||C(2),W<256)r[d++]=W;else{if(256==W){V=v,g=null;break}var X=W-254;W>264&&(X=S(t,v,(1<<(nt=i[N=W-257]))-1)+f[N],v+=nt);var $=m[T(t,v)&Q],tt=$>>>4;if($||C(3),v+=15&$,J=l[tt],tt>3){var nt=o[tt];J+=T(t,v)&(1<z){h&&C(0);break}u&&c(d+131072);for(var rt=d+X;d>>8},F=function(t,n,r){var e=n/8|0;t[e]|=r<<=7&n,t[e+1]|=r>>>8,t[e+2]|=r>>>16},Z=function(t,e){for(var i=[],o=0;ov&&(v=s[o].s);var d=new r(v+1),g=O(i[l-1],d,0);if(g>e){o=0;var y=0,m=g-e,w=1<e))break;y+=w-(1<>>=m;y>0;){var b=s[o].s;d[b]=0&&y;--o){var z=s[o].s;d[z]==e&&(--d[z],++y)}g=e}return[new n(d),g]},O=function(t,n,r){return-1==t.s?Math.max(O(t.l,n,r+1),O(t.r,n,r+1)):n[t.s]=r},G=function(t){for(var n=t.length;n&&!t[--n];);for(var e=new r(++n),i=0,o=t[0],a=1,s=function(t){e[i++]=t},u=1;u<=n;++u)if(t[u]==o&&u!=n)++a;else{if(!o&&a>2){for(;a>138;a-=138)s(32754);a>2&&(s(a>10?a-11<<5|28690:a-3<<5|12305),a=0)}else if(a>3){for(s(o),--a;a>6;a-=6)s(8304);a>2&&(s(a-3<<5|8208),a=0)}for(;a--;)s(o);a=1,o=t[u]}return[e.subarray(0,i),n]},L=function(t,n){for(var r=0,e=0;e>>8,t[i+2]=255^t[i],t[i+3]=255^t[i+1];for(var o=0;o4&&!q[a[H-1]];--H);var Y,j,R,J,K=p+5<<3,Q=L(u,m)+L(f,w)+h,V=L(u,g)+L(f,M)+h+14+3*H+L(O,q)+(2*O[16]+3*O[17]+7*O[18]);if(K<=Q&&K<=V)return N(n,v,t.subarray(l,l+p));if(I(n,v,1+(V15&&(I(n,v,tt[P]>>>5&127),v+=tt[P]>>>12)}}else Y=x,j=m,R=z,J=w;for(P=0;P255){var nt;F(n,v,Y[257+(nt=s[P]>>>18&31)]),v+=j[nt+257],nt>7&&(I(n,v,s[P]>>>23&31),v+=i[nt]);var rt=31&s[P];F(n,v,R[rt]),v+=J[rt],rt>3&&(F(n,v,s[P]>>>5&8191),v+=o[rt])}else F(n,v,Y[s[P]]),v+=j[s[P]];return F(n,v,Y[256]),v+j[256]},_=new e([65540,131080,131088,131104,262176,1048704,1048832,2114560,2117632]),q=new n(0),B=function(t,a,s,u,f,c){var l=t.length,v=new n(u+l+5*(1+Math.ceil(l/7e3))+f),d=v.subarray(u,v.length-f),g=0;if(!a||l<8)for(var y=0;y<=l;y+=65535){var m=y+65535;m>=l&&(d[g>>3]=c),g=N(d,g+1,t.subarray(y,m))}else{for(var w=_[a-1],x=w>>>13,b=8191&w,z=(1<7e3||O>24576)&&j>423){g=P(t,d,0,C,U,I,Z,O,L,y-L,g),O=F=Z=0,L=y;for(var R=0;R<286;++R)U[R]=0;for(R=0;R<30;++R)I[R]=0}var J=2,K=0,Q=b,V=H-Y&32767;if(j>2&&B==D(y-V))for(var W=Math.min(x,j)-1,X=Math.min(32767,y),$=Math.min(258,j);V<=X&&--Q&&H!=Y;){if(t[y+J]==t[y+J-V]){for(var tt=0;tt<$&&t[y+tt]==t[y+tt-V];++tt);if(tt>J){if(J=tt,K=V,tt>W)break;var nt=Math.min(V,tt-2),rt=0;for(R=0;Rrt&&(rt=it,Y=et)}}}V+=(H=Y)-(Y=k[H])+32768&32767}if(K){C[O++]=268435456|h[J]<<18|p[K];var ot=31&h[J],at=31&p[K];Z+=i[ot]+o[at],++U[257+ot],++I[at],G=y+J,++F}else C[O++]=t[y],++U[t[y]]}}g=P(t,d,c,C,U,I,Z,O,L,y-L,g),!c&&7&g&&(g=N(d,g+1,q))}return E(v,0,u+A(g)+f)},H=function(){for(var t=new Int32Array(256),n=0;n<256;++n){for(var r=n,e=9;--e;)r=(1&r&&-306674912)^r>>>1;t[n]=r}return t}(),Y=function(){var t=-1;return{p:function(n){for(var r=t,e=0;e>>8;t=r},d:function(){return~t}}},j=function(){var t=1,n=0;return{p:function(r){for(var e=t,i=n,o=0|r.length,a=0;a!=o;){for(var s=Math.min(a+2655,o);a>16),i=(65535&i)+15*(i>>16)}t=e,n=i},d:function(){return(255&(t%=65521))<<24|t>>>8<<16|(255&(n%=65521))<<8|n>>>8}}},R=function(t,n,r,e,i){return B(t,null==n.level?6:n.level,null==n.mem?Math.ceil(1.5*Math.max(8,Math.min(13,Math.log(t.length)))):12+n.mem,r,e,!i)},J=function(t,n){var r={};for(var e in t)r[e]=t[e];for(var e in n)r[e]=n[e];return r},K=function(t,n,r){for(var e=t(),i=""+t,o=i.slice(i.indexOf("[")+1,i.lastIndexOf("]")).replace(/\s+/g,"").split(","),a=0;a>>0},ct=function(t,n){return ht(t,n)+4294967296*ht(t,n+4)},lt=function(t,n,r){for(;r;++n)t[n]=r,r>>>=8},pt=function(t,n){var r=n.filename;if(t[0]=31,t[1]=139,t[2]=8,t[8]=n.level<2?4:9==n.level?2:0,t[9]=3,0!=n.mtime&<(t,4,Math.floor(new Date(n.mtime||Date.now())/1e3)),r){t[3]=8;for(var e=0;e<=r.length;++e)t[e+10]=r.charCodeAt(e)}},vt=function(t){31==t[0]&&139==t[1]&&8==t[2]||C(6,"invalid gzip data");var n=t[3],r=10;4&n&&(r+=t[10]|2+(t[11]<<8));for(var e=(n>>3&1)+(n>>4&1);e>0;e-=!t[r++]);return r+(2&n)},dt=function(t){var n=t.length;return(t[n-4]|t[n-3]<<8|t[n-2]<<16|t[n-1]<<24)>>>0},gt=function(t){return 10+(t.filename&&t.filename.length+1||0)},yt=function(t,n){var r=n.level,e=0==r?0:r<6?1:9==r?3:2;t[0]=120,t[1]=e<<6|(e?32-2*e:1)},mt=function(t){(8!=(15&t[0])||t[0]>>>4>7||(t[0]<<8|t[1])%31)&&C(6,"invalid zlib data"),32&t[1]&&C(6,"invalid zlib data: preset dictionaries not supported")};function wt(t,n){return n||"function"!=typeof t||(n=t,t={}),this.ondata=n,t}var xt=function(){function t(t,n){n||"function"!=typeof t||(n=t,t={}),this.ondata=n,this.o=t||{}}return t.prototype.p=function(t,n){this.ondata(R(t,this.o,0,0,!n),n)},t.prototype.push=function(t,n){this.ondata||C(5),this.d&&C(4),this.d=n,this.p(t,n||!1)},t}();_e.Deflate=xt;var bt=function(){return function(t,n){ut([$,function(){return[st,xt]}],this,wt.call(this,t,n),(function(t){var n=new xt(t.data);onmessage=st(n)}),6)}}();function zt(t,n,r){return r||(r=n,n={}),"function"!=typeof r&&C(7),at(t,n,[$],(function(t){return it(kt(t.data[0],t.data[1]))}),0,r)}function kt(t,n){return R(t,n||{},0,0)}_e.AsyncDeflate=bt,_e.deflate=zt,_e.deflateSync=kt;var Mt=function(){function t(t){this.s={},this.p=new n(0),this.ondata=t}return t.prototype.e=function(t){this.ondata||C(5),this.d&&C(4);var r=this.p.length,e=new n(r+t.length);e.set(this.p),e.set(t,r),this.p=e},t.prototype.c=function(t){this.d=this.s.i=t||!1;var n=this.s.b,r=U(this.p,this.o,this.s);this.ondata(E(r,n,this.s.b),this.d),this.o=E(r,this.s.b-32768),this.s.b=this.o.length,this.p=E(this.p,this.s.p/8|0),this.s.p&=7},t.prototype.push=function(t,n){this.e(t),this.c(n)},t}();_e.Inflate=Mt;var St=function(){return function(t){this.ondata=t,ut([X,function(){return[st,Mt]}],this,0,(function(){var t=new Mt;onmessage=st(t)}),7)}}();function Tt(t,n,r){return r||(r=n,n={}),"function"!=typeof r&&C(7),at(t,n,[X],(function(t){return it(At(t.data[0],ot(t.data[1])))}),1,r)}function At(t,n){return U(t,n)}_e.AsyncInflate=St,_e.inflate=Tt,_e.inflateSync=At;var Et=function(){function t(t,n){this.c=Y(),this.l=0,this.v=1,xt.call(this,t,n)}return t.prototype.push=function(t,n){xt.prototype.push.call(this,t,n)},t.prototype.p=function(t,n){this.c.p(t),this.l+=t.length;var r=R(t,this.o,this.v&>(this.o),n&&8,!n);this.v&&(pt(r,this.o),this.v=0),n&&(lt(r,r.length-8,this.c.d()),lt(r,r.length-4,this.l)),this.ondata(r,n)},t}();_e.Gzip=Et,_e.Compress=Et;var Dt=function(){return function(t,n){ut([$,tt,function(){return[st,xt,Et]}],this,wt.call(this,t,n),(function(t){var n=new Et(t.data);onmessage=st(n)}),8)}}();function Ct(t,n,r){return r||(r=n,n={}),"function"!=typeof r&&C(7),at(t,n,[$,tt,function(){return[Ut]}],(function(t){return it(Ut(t.data[0],t.data[1]))}),2,r)}function Ut(t,n){n||(n={});var r=Y(),e=t.length;r.p(t);var i=R(t,n,gt(n),8),o=i.length;return pt(i,n),lt(i,o-8,r.d()),lt(i,o-4,e),i}_e.AsyncGzip=Dt,_e.AsyncCompress=Dt,_e.gzip=Ct,_e.compress=Ct,_e.gzipSync=Ut,_e.compressSync=Ut;var It=function(){function t(t){this.v=1,Mt.call(this,t)}return t.prototype.push=function(t,n){if(Mt.prototype.e.call(this,t),this.v){var r=this.p.length>3?vt(this.p):4;if(r>=this.p.length&&!n)return;this.p=this.p.subarray(r),this.v=0}n&&(this.p.length<8&&C(6,"invalid gzip data"),this.p=this.p.subarray(0,-8)),Mt.prototype.c.call(this,n)},t}();_e.Gunzip=It;var Ft=function(){return function(t){this.ondata=t,ut([X,nt,function(){return[st,Mt,It]}],this,0,(function(){var t=new It;onmessage=st(t)}),9)}}();function Zt(t,n,r){return r||(r=n,n={}),"function"!=typeof r&&C(7),at(t,n,[X,nt,function(){return[Ot]}],(function(t){return it(Ot(t.data[0]))}),3,r)}function Ot(t,r){return U(t.subarray(vt(t),-8),r||new n(dt(t)))}_e.AsyncGunzip=Ft,_e.gunzip=Zt,_e.gunzipSync=Ot;var Gt=function(){function t(t,n){this.c=j(),this.v=1,xt.call(this,t,n)}return t.prototype.push=function(t,n){xt.prototype.push.call(this,t,n)},t.prototype.p=function(t,n){this.c.p(t);var r=R(t,this.o,this.v&&2,n&&4,!n);this.v&&(yt(r,this.o),this.v=0),n&<(r,r.length-4,this.c.d()),this.ondata(r,n)},t}();_e.Zlib=Gt;var Lt=function(){return function(t,n){ut([$,rt,function(){return[st,xt,Gt]}],this,wt.call(this,t,n),(function(t){var n=new Gt(t.data);onmessage=st(n)}),10)}}();function Nt(t,n,r){return r||(r=n,n={}),"function"!=typeof r&&C(7),at(t,n,[$,rt,function(){return[Pt]}],(function(t){return it(Pt(t.data[0],t.data[1]))}),4,r)}function Pt(t,n){n||(n={});var r=j();r.p(t);var e=R(t,n,2,4);return yt(e,n),lt(e,e.length-4,r.d()),e}_e.AsyncZlib=Lt,_e.zlib=Nt,_e.zlibSync=Pt;var _t=function(){function t(t){this.v=1,Mt.call(this,t)}return t.prototype.push=function(t,n){if(Mt.prototype.e.call(this,t),this.v){if(this.p.length<2&&!n)return;this.p=this.p.subarray(2),this.v=0}n&&(this.p.length<4&&C(6,"invalid zlib data"),this.p=this.p.subarray(0,-4)),Mt.prototype.c.call(this,n)},t}();_e.Unzlib=_t;var qt=function(){return function(t){this.ondata=t,ut([X,et,function(){return[st,Mt,_t]}],this,0,(function(){var t=new _t;onmessage=st(t)}),11)}}();function Bt(t,n,r){return r||(r=n,n={}),"function"!=typeof r&&C(7),at(t,n,[X,et,function(){return[Ht]}],(function(t){return it(Ht(t.data[0],ot(t.data[1])))}),5,r)}function Ht(t,n){return U((mt(t),t.subarray(2,-4)),n)}_e.AsyncUnzlib=qt,_e.unzlib=Bt,_e.unzlibSync=Ht;var Yt=function(){function t(t){this.G=It,this.I=Mt,this.Z=_t,this.ondata=t}return t.prototype.push=function(t,r){if(this.ondata||C(5),this.s)this.s.push(t,r);else{if(this.p&&this.p.length){var e=new n(this.p.length+t.length);e.set(this.p),e.set(t,this.p.length)}else this.p=t;if(this.p.length>2){var i=this,o=function(){i.ondata.apply(i,arguments)};this.s=31==this.p[0]&&139==this.p[1]&&8==this.p[2]?new this.G(o):8!=(15&this.p[0])||this.p[0]>>4>7||(this.p[0]<<8|this.p[1])%31?new this.I(o):new this.Z(o),this.s.push(this.p,r),this.p=null}}},t}();_e.Decompress=Yt;var jt=function(){function t(t){this.G=Ft,this.I=St,this.Z=qt,this.ondata=t}return t.prototype.push=function(t,n){Yt.prototype.push.call(this,t,n)},t}();function Rt(t,n,r){return r||(r=n,n={}),"function"!=typeof r&&C(7),31==t[0]&&139==t[1]&&8==t[2]?Zt(t,n,r):8!=(15&t[0])||t[0]>>4>7||(t[0]<<8|t[1])%31?Tt(t,n,r):Bt(t,n,r)}function Jt(t,n){return 31==t[0]&&139==t[1]&&8==t[2]?Ot(t,n):8!=(15&t[0])||t[0]>>4>7||(t[0]<<8|t[1])%31?At(t,n):Ht(t,n)}_e.AsyncDecompress=jt,_e.decompress=Rt,_e.decompressSync=Jt;var Kt=function(t,r,e,i){for(var o in t){var a=t[o],s=r+o,u=i;Array.isArray(a)&&(u=J(i,a[1]),a=a[0]),a instanceof n?e[s]=[a,u]:(e[s+="/"]=[new n(0),u],Kt(a,s,e,i))}},Qt="undefined"!=typeof TextEncoder&&new TextEncoder,Vt="undefined"!=typeof TextDecoder&&new TextDecoder,Wt=0;try{Vt.decode(q,{stream:!0}),Wt=1}catch(t){}var Xt=function(t){for(var n="",r=0;;){var e=t[r++],i=(e>127)+(e>223)+(e>239);if(r+i>t.length)return[n,E(t,r-1)];i?3==i?(e=((15&e)<<18|(63&t[r++])<<12|(63&t[r++])<<6|63&t[r++])-65536,n+=String.fromCharCode(55296|e>>10,56320|1023&e)):n+=String.fromCharCode(1&i?(31&e)<<6|63&t[r++]:(15&e)<<12|(63&t[r++])<<6|63&t[r++]):n+=String.fromCharCode(e)}},$t=function(){function t(t){this.ondata=t,Wt?this.t=new TextDecoder:this.p=q}return t.prototype.push=function(t,r){if(this.ondata||C(5),r=!!r,this.t)return this.ondata(this.t.decode(t,{stream:!0}),r),void(r&&(this.t.decode().length&&C(8),this.t=null));this.p||C(4);var e=new n(this.p.length+t.length);e.set(this.p),e.set(t,this.p.length);var i=Xt(e),o=i[0],a=i[1];r?(a.length&&C(8),this.p=null):this.p=a,this.ondata(o,r)},t}();_e.DecodeUTF8=$t;var tn=function(){function t(t){this.ondata=t}return t.prototype.push=function(t,n){this.ondata||C(5),this.d&&C(4),this.ondata(nn(t),this.d=n||!1)},t}();function nn(t,r){if(r){for(var e=new n(t.length),i=0;i>1)),s=0,u=function(t){a[s++]=t};for(i=0;ia.length){var f=new n(s+8+(o-i<<1));f.set(a),a=f}var h=t.charCodeAt(i);h<128||r?u(h):h<2048?(u(192|h>>6),u(128|63&h)):h>55295&&h<57344?(u(240|(h=65536+(1047552&h)|1023&t.charCodeAt(++i))>>18),u(128|h>>12&63),u(128|h>>6&63),u(128|63&h)):(u(224|h>>12),u(128|h>>6&63),u(128|63&h))}return E(a,0,s)}function rn(t,n){if(n){for(var r="",e=0;e65535&&C(9),n+=e+4}return n},fn=function(t,n,r,e,i,o,a,s){var u=e.length,f=r.extra,h=s&&s.length,c=un(f);lt(t,n,null!=a?33639248:67324752),n+=4,null!=a&&(t[n++]=20,t[n++]=r.os),t[n]=20,n+=2,t[n++]=r.flag<<1|(null==o&&8),t[n++]=i&&8,t[n++]=255&r.compression,t[n++]=r.compression>>8;var l=new Date(null==r.mtime?Date.now():r.mtime),p=l.getFullYear()-1980;if((p<0||p>119)&&C(10),lt(t,n,p<<25|l.getMonth()+1<<21|l.getDate()<<16|l.getHours()<<11|l.getMinutes()<<5|l.getSeconds()>>>1),n+=4,null!=o&&(lt(t,n,r.crc),lt(t,n+4,o),lt(t,n+8,r.size)),lt(t,n+12,u),lt(t,n+14,c),n+=16,null!=a&&(lt(t,n,h),lt(t,n+6,r.attrs),lt(t,n+10,a),n+=14),t.set(e,n),n+=u,c)for(var v in f){var d=f[v],g=d.length;lt(t,n,+v),lt(t,n+2,g),t.set(d,n+4),n+=4+g}return h&&(t.set(s,n),n+=h),n},hn=function(t,n,r,e,i){lt(t,n,101010256),lt(t,n+8,r),lt(t,n+10,r),lt(t,n+12,e),lt(t,n+16,i)},cn=function(){function t(t){this.filename=t,this.c=Y(),this.size=0,this.compression=0}return t.prototype.process=function(t,n){this.ondata(null,t,n)},t.prototype.push=function(t,n){this.ondata||C(5),this.c.p(t),this.size+=t.length,n&&(this.crc=this.c.d()),this.process(t,n||!1)},t}();_e.ZipPassThrough=cn;var ln=function(){function t(t,n){var r=this;n||(n={}),cn.call(this,t),this.d=new xt(n,(function(t,n){r.ondata(null,t,n)})),this.compression=8,this.flag=en(n.level)}return t.prototype.process=function(t,n){try{this.d.push(t,n)}catch(t){this.ondata(t,null,n)}},t.prototype.push=function(t,n){cn.prototype.push.call(this,t,n)},t}();_e.ZipDeflate=ln;var pn=function(){function t(t,n){var r=this;n||(n={}),cn.call(this,t),this.d=new bt(n,(function(t,n,e){r.ondata(t,n,e)})),this.compression=8,this.flag=en(n.level),this.terminate=this.d.terminate}return t.prototype.process=function(t,n){this.d.push(t,n)},t.prototype.push=function(t,n){cn.prototype.push.call(this,t,n)},t}();_e.AsyncZipDeflate=pn;var vn=function(){function t(t){this.ondata=t,this.u=[],this.d=1}return t.prototype.add=function(t){var r=this;if(this.ondata||C(5),2&this.d)this.ondata(C(4+8*(1&this.d),0,1),null,!1);else{var e=nn(t.filename),i=e.length,o=t.comment,a=o&&nn(o),s=i!=t.filename.length||a&&o.length!=a.length,u=i+un(t.extra)+30;i>65535&&this.ondata(C(11,0,1),null,!1);var f=new n(u);fn(f,0,t,e,s);var h=[f],c=function(){for(var t=0,n=h;t65535&&M(C(11,0,1),null),k)if(g<16e4)try{M(null,kt(e,f))}catch(t){M(t,null)}else c.push(zt(e,f,M));else M(null,e)},g=0;g65535&&C(11);var y=c?kt(f,h):f,m=y.length,w=Y();w.p(f),i.push(J(h,{size:f.length,crc:w.d(),c:y,f:M,m:v,u:l!=s.length||v&&p.length!=d,o:o,compression:c})),o+=30+l+g+m,a+=76+2*(l+g)+(d||0)+m}for(var x=new n(a+22),b=o,z=a-o,k=0;k0){var i=Math.min(this.c,t.length),o=t.subarray(0,i);if(this.c-=i,this.d?this.d.push(o,!this.c):this.k[0].push(o),(t=t.subarray(i)).length)return this.push(t,r)}else{var a=0,s=0,u=void 0,f=void 0;this.p.length?t.length?((f=new n(this.p.length+t.length)).set(this.p),f.set(t,this.p.length)):f=this.p:f=t;for(var h=f.length,c=this.c,l=c&&this.d,p=function(){var t,n=ht(f,s);if(67324752==n){a=1,u=s,v.d=null,v.c=0;var r=ft(f,s+6),i=ft(f,s+8),o=2048&r,l=8&r,p=ft(f,s+26),d=ft(f,s+28);if(h>s+30+p+d){var g=[];v.k.unshift(g),a=2;var y,m=ht(f,s+18),w=ht(f,s+22),x=rn(f.subarray(s+30,s+=30+p),!o);4294967295==m?(t=l?[-2]:sn(f,s),m=t[0],w=t[1]):l&&(m=-1),s+=d,v.c=m;var b={name:x,compression:i,start:function(){if(b.ondata||C(5),m){var t=e.o[i];t||b.ondata(C(14,"unknown compression type "+i,1),null,!1),(y=m<0?new t(x):new t(x,m,w)).ondata=function(t,n,r){b.ondata(t,n,r)};for(var n=0,r=g;n=0&&(b.size=m,b.originalSize=w),v.onfile(b)}return"break"}if(c){if(134695760==n)return u=s+=12+(-2==c&&8),a=3,v.c=0,"break";if(33639248==n)return u=s-=4,a=3,v.c=0,"break"}},v=this;s65558)return s(C(13,0,1),null),o;var f=ft(t,u+8);if(f){var h=f,c=ht(t,u+16),l=4294967295==c;if(l){if(u=ht(t,u-12),101075792!=ht(t,u))return s(C(13,0,1),null),o;h=f=ht(t,u+32),c=ht(t,u+48)}for(var p=r&&r.filter,v=function(r){var e=an(t,c,l),u=e[0],h=e[1],v=e[2],d=e[3],g=e[4],y=on(t,e[5]);c=g;var m=function(t,n){t?(o(),s(t,null)):(n&&(a[d]=n),--f||s(null,a))};if(!p||p({name:d,size:h,originalSize:v,compression:u}))if(u)if(8==u){var w=t.subarray(y,y+h);if(h<32e4)try{m(null,At(w,new n(v)))}catch(t){m(t,null)}else i.push(Tt(w,{size:v},m))}else m(C(14,"unknown compression type "+u,1),null);else m(null,E(t,y,y+h));else m(null,null)},d=0;d65558)&&C(13);var o=ft(t,i+8);if(!o)return{};var a=ht(t,i+16),s=4294967295==a;s&&(i=ht(t,i-12),101075792!=ht(t,i)&&C(13),o=ht(t,i+32),a=ht(t,i+48));for(var u=r&&r.filter,f=0;f{"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).zip={})})(this,(function(e){"use strict";const{Array:t,Object:n,String:i,BigInt:r,Math:a,Date:s,Map:o,URL:l,Error:c,Uint8Array:d,Uint16Array:f,Uint32Array:u,DataView:h,Blob:_,Promise:w,TextEncoder:p,TextDecoder:g,FileReader:b,document:x,crypto:y,btoa:m}=globalThis,k=-2;function v(e){return R(e.map((([e,n])=>new t(e).fill(n,0,e))))}function R(e){return e.reduce(((e,n)=>e.concat(t.isArray(n)?R(n):n)),[])}const E=[0,1,2,3].concat(...v([[2,4],[2,5],[4,6],[4,7],[8,8],[8,9],[16,10],[16,11],[32,12],[32,13],[64,14],[64,15],[2,0],[1,16],[1,17],[2,18],[2,19],[4,20],[4,21],[8,22],[8,23],[16,24],[16,25],[32,26],[32,27],[64,28],[64,29]]));function D(){const e=this;function t(e,t){let n=0;do{n|=1&e,e>>>=1,n<<=1}while(--t>0);return n>>>1}e.build_tree=n=>{const i=e.dyn_tree,r=e.stat_desc.static_tree,s=e.stat_desc.elems;let o,l,c,d=-1;for(n.heap_len=0,n.heap_max=573,o=0;s>o;o++)0!==i[2*o]?(n.heap[++n.heap_len]=d=o,n.depth[o]=0):i[2*o+1]=0;for(;2>n.heap_len;)c=n.heap[++n.heap_len]=2>d?++d:0,i[2*c]=1,n.depth[c]=0,n.opt_len--,r&&(n.static_len-=r[2*c+1]);for(e.max_code=d,o=a.floor(n.heap_len/2);o>=1;o--)n.pqdownheap(i,o);c=s;do{o=n.heap[1],n.heap[1]=n.heap[n.heap_len--],n.pqdownheap(i,1),l=n.heap[1],n.heap[--n.heap_max]=o,n.heap[--n.heap_max]=l,i[2*c]=i[2*o]+i[2*l],n.depth[c]=a.max(n.depth[o],n.depth[l])+1,i[2*o+1]=i[2*l+1]=c,n.heap[1]=c++,n.pqdownheap(i,1)}while(n.heap_len>=2);n.heap[--n.heap_max]=n.heap[1],(t=>{const n=e.dyn_tree,i=e.stat_desc.static_tree,r=e.stat_desc.extra_bits,a=e.stat_desc.extra_base,s=e.stat_desc.max_length;let o,l,c,d,f,u,h=0;for(d=0;15>=d;d++)t.bl_count[d]=0;for(n[2*t.heap[t.heap_max]+1]=0,o=t.heap_max+1;573>o;o++)l=t.heap[o],d=n[2*n[2*l+1]+1]+1,d>s&&(d=s,h++),n[2*l+1]=d,l>e.max_code||(t.bl_count[d]++,f=0,a>l||(f=r[l-a]),u=n[2*l],t.opt_len+=u*(d+f),i&&(t.static_len+=u*(i[2*l+1]+f)));if(0!==h){do{for(d=s-1;0===t.bl_count[d];)d--;t.bl_count[d]--,t.bl_count[d+1]+=2,t.bl_count[s]--,h-=2}while(h>0);for(d=s;0!==d;d--)for(l=t.bl_count[d];0!==l;)c=t.heap[--o],c>e.max_code||(n[2*c+1]!=d&&(t.opt_len+=(d-n[2*c+1])*n[2*c],n[2*c+1]=d),l--)}})(n),((e,n,i)=>{const r=[];let a,s,o,l=0;for(a=1;15>=a;a++)r[a]=l=l+i[a-1]<<1;for(s=0;n>=s;s++)o=e[2*s+1],0!==o&&(e[2*s]=t(r[o]++,o))})(i,e.max_code,n.bl_count)}}function A(e,t,n,i,r){const a=this;a.static_tree=e,a.extra_bits=t,a.extra_base=n,a.elems=i,a.max_length=r}D._length_code=[0,1,2,3,4,5,6,7].concat(...v([[2,8],[2,9],[2,10],[2,11],[4,12],[4,13],[4,14],[4,15],[8,16],[8,17],[8,18],[8,19],[16,20],[16,21],[16,22],[16,23],[32,24],[32,25],[32,26],[31,27],[1,28]])),D.base_length=[0,1,2,3,4,5,6,7,8,10,12,14,16,20,24,28,32,40,48,56,64,80,96,112,128,160,192,224,0],D.base_dist=[0,1,2,3,4,6,8,12,16,24,32,48,64,96,128,192,256,384,512,768,1024,1536,2048,3072,4096,6144,8192,12288,16384,24576],D.d_code=e=>256>e?E[e]:E[256+(e>>>7)],D.extra_lbits=[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0],D.extra_dbits=[0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13],D.extra_blbits=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7],D.bl_order=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15];const F=v([[144,8],[112,9],[24,7],[8,8]]);A.static_ltree=R([12,140,76,204,44,172,108,236,28,156,92,220,60,188,124,252,2,130,66,194,34,162,98,226,18,146,82,210,50,178,114,242,10,138,74,202,42,170,106,234,26,154,90,218,58,186,122,250,6,134,70,198,38,166,102,230,22,150,86,214,54,182,118,246,14,142,78,206,46,174,110,238,30,158,94,222,62,190,126,254,1,129,65,193,33,161,97,225,17,145,81,209,49,177,113,241,9,137,73,201,41,169,105,233,25,153,89,217,57,185,121,249,5,133,69,197,37,165,101,229,21,149,85,213,53,181,117,245,13,141,77,205,45,173,109,237,29,157,93,221,61,189,125,253,19,275,147,403,83,339,211,467,51,307,179,435,115,371,243,499,11,267,139,395,75,331,203,459,43,299,171,427,107,363,235,491,27,283,155,411,91,347,219,475,59,315,187,443,123,379,251,507,7,263,135,391,71,327,199,455,39,295,167,423,103,359,231,487,23,279,151,407,87,343,215,471,55,311,183,439,119,375,247,503,15,271,143,399,79,335,207,463,47,303,175,431,111,367,239,495,31,287,159,415,95,351,223,479,63,319,191,447,127,383,255,511,0,64,32,96,16,80,48,112,8,72,40,104,24,88,56,120,4,68,36,100,20,84,52,116,3,131,67,195,35,163,99,227].map(((e,t)=>[e,F[t]])));const S=v([[30,5]]);function z(e,t,n,i,r){const a=this;a.good_length=e,a.max_lazy=t,a.nice_length=n,a.max_chain=i,a.func=r}A.static_dtree=R([0,16,8,24,4,20,12,28,2,18,10,26,6,22,14,30,1,17,9,25,5,21,13,29,3,19,11,27,7,23].map(((e,t)=>[e,S[t]]))),A.static_l_desc=new A(A.static_ltree,D.extra_lbits,257,286,15),A.static_d_desc=new A(A.static_dtree,D.extra_dbits,0,30,15),A.static_bl_desc=new A(null,D.extra_blbits,0,19,7);const T=[new z(0,0,0,0,0),new z(4,4,8,4,1),new z(4,5,16,8,1),new z(4,6,32,32,1),new z(4,4,16,16,2),new z(8,16,32,32,2),new z(8,16,128,128,2),new z(8,32,128,256,2),new z(32,128,258,1024,2),new z(32,258,258,4096,2)],U=["need dictionary","stream end","","","stream error","data error","","buffer error","",""],C=113,W=666,I=262;function B(e,t,n,i){const r=e[2*t],a=e[2*n];return a>r||r==a&&i[t]<=i[n]}function L(){const e=this;let t,n,i,r,s,o,l,c,u,h,_,w,p,g,b,x,y,m,v,R,E,F,S,z,L,M,N,H,O,P,V,q,Z;const K=new D,G=new D,Y=new D;let j,X,J,Q,$,ee;function te(){let t;for(t=0;286>t;t++)V[2*t]=0;for(t=0;30>t;t++)q[2*t]=0;for(t=0;19>t;t++)Z[2*t]=0;V[512]=1,e.opt_len=e.static_len=0,X=J=0}function ne(e,t){let n,i=-1,r=e[1],a=0,s=7,o=4;0===r&&(s=138,o=3),e[2*(t+1)+1]=65535;for(let l=0;t>=l;l++)n=r,r=e[2*(l+1)+1],++aa?Z[2*n]+=a:0!==n?(n!=i&&Z[2*n]++,Z[32]++):a>10?Z[36]++:Z[34]++,a=0,i=n,0===r?(s=138,o=3):n==r?(s=6,o=3):(s=7,o=4))}function ie(t){e.pending_buf[e.pending++]=t}function re(e){ie(255&e),ie(e>>>8&255)}function ae(e,t){let n;const i=t;ee>16-i?(n=e,$|=n<>>16-ee,ee+=i-16):($|=e<=n;n++)if(i=a,a=e[2*(n+1)+1],++s>=o||i!=a){if(l>s)do{se(i,Z)}while(0!=--s);else 0!==i?(i!=r&&(se(i,Z),s--),se(16,Z),ae(s-3,2)):s>10?(se(18,Z),ae(s-11,7)):(se(17,Z),ae(s-3,3));s=0,r=i,0===a?(o=138,l=3):i==a?(o=6,l=3):(o=7,l=4)}}function le(){16==ee?(re($),$=0,ee=0):8>ee||(ie(255&$),$>>>=8,ee-=8)}function ce(t,n){let i,r,s;if(e.dist_buf[X]=t,e.lc_buf[X]=255&n,X++,0===t?V[2*n]++:(J++,t--,V[2*(D._length_code[n]+256+1)]++,q[2*D.d_code(t)]++),0==(8191&X)&&N>2){for(i=8*X,r=E-y,s=0;30>s;s++)i+=q[2*s]*(5+D.extra_dbits[s]);if(i>>>=3,Jo);se(256,t),Q=t[513]}function fe(){ee>8?re($):ee>0&&ie(255&$),$=0,ee=0}function ue(t,n,i){ae(0+(i?1:0),3),((t,n)=>{fe(),Q=8,re(n),re(~n),e.pending_buf.set(c.subarray(t,t+n),e.pending),e.pending+=n})(t,n)}function he(n){((t,n,i)=>{let r,a,s=0;N>0?(K.build_tree(e),G.build_tree(e),s=(()=>{let t;for(ne(V,K.max_code),ne(q,G.max_code),Y.build_tree(e),t=18;t>=3&&0===Z[2*D.bl_order[t]+1];t--);return e.opt_len+=3*(t+1)+5+5+4,t})(),r=e.opt_len+3+7>>>3,a=e.static_len+3+7>>>3,a>r||(r=a)):r=a=n+5,n+4>r||-1==t?a==r?(ae(2+(i?1:0),3),de(A.static_ltree,A.static_dtree)):(ae(4+(i?1:0),3),((e,t,n)=>{let i;for(ae(e-257,5),ae(t-1,5),ae(n-4,4),i=0;n>i;i++)ae(Z[2*D.bl_order[i]+1],3);oe(V,e-1),oe(q,t-1)})(K.max_code+1,G.max_code+1,s+1),de(V,q)):ue(t,n,i),te(),i&&fe()})(0>y?-1:y,E-y,n),y=E,t.flush_pending()}function _e(){let e,n,i,r;do{if(r=u-S-E,0===r&&0===E&&0===S)r=s;else if(-1==r)r--;else if(E>=s+s-I){c.set(c.subarray(s,s+s),0),F-=s,E-=s,y-=s,e=p,i=e;do{n=65535&_[--i],_[i]=s>n?0:n-s}while(0!=--e);e=s,i=e;do{n=65535&h[--i],h[i]=s>n?0:n-s}while(0!=--e);r+=s}if(0===t.avail_in)return;e=t.read_buf(c,E+S,r),S+=e,3>S||(w=255&c[E],w=(w<S&&0!==t.avail_in)}function we(e){let t,n,i=L,r=E,a=z;const o=E>s-I?E-(s-I):0;let d=P;const f=l,u=E+258;let _=c[r+a-1],w=c[r+a];O>z||(i>>=2),d>S&&(d=S);do{if(t=e,c[t+a]==w&&c[t+a-1]==_&&c[t]==c[r]&&c[++t]==c[r+1]){r+=2,t++;do{}while(c[++r]==c[++t]&&c[++r]==c[++t]&&c[++r]==c[++t]&&c[++r]==c[++t]&&c[++r]==c[++t]&&c[++r]==c[++t]&&c[++r]==c[++t]&&c[++r]==c[++t]&&u>r);if(n=258-(u-r),r=u-258,n>a){if(F=e,a=n,n>=d)break;_=c[r+a-1],w=c[r+a]}}}while((e=65535&h[e&f])>o&&0!=--i);return a>S?S:a}e.depth=[],e.bl_count=[],e.heap=[],V=[],q=[],Z=[],e.pqdownheap=(t,n)=>{const i=e.heap,r=i[n];let a=n<<1;for(;a<=e.heap_len&&(a(F||(F=8),U||(U=8),W||(W=0),t.msg=null,-1==v&&(v=6),1>U||U>9||8!=F||9>D||D>15||0>v||v>9||0>W||W>2?k:(t.dstate=e,o=D,s=1<(t.total_in=t.total_out=0,t.msg=null,e.pending=0,e.pending_out=0,n=C,r=0,K.dyn_tree=V,K.stat_desc=A.static_l_desc,G.dyn_tree=q,G.stat_desc=A.static_d_desc,Y.dyn_tree=Z,Y.stat_desc=A.static_bl_desc,$=0,ee=0,Q=8,te(),(()=>{u=2*s,_[p-1]=0;for(let e=0;p-1>e;e++)_[e]=0;M=T[N].max_lazy,O=T[N].good_length,P=T[N].nice_length,L=T[N].max_chain,E=0,y=0,S=0,m=z=2,R=0,w=0})(),0))(t))),e.deflateEnd=()=>42!=n&&n!=C&&n!=W?k:(e.lc_buf=null,e.dist_buf=null,e.pending_buf=null,_=null,h=null,c=null,e.dstate=null,n==C?-3:0),e.deflateParams=(e,t,n)=>{let i=0;return-1==t&&(t=6),0>t||t>9||0>n||n>2?k:(T[N].func!=T[t].func&&0!==e.total_in&&(i=e.deflate(1)),N!=t&&(N=t,M=T[N].max_lazy,O=T[N].good_length,P=T[N].nice_length,L=T[N].max_chain),H=n,i)},e.deflateSetDictionary=(e,t,i)=>{let r,a=i,o=0;if(!t||42!=n)return k;if(3>a)return 0;for(a>s-I&&(a=s-I,o=i-a),c.set(t.subarray(o,o+a),0),E=a,y=a,w=255&c[0],w=(w<=r;r++)w=(w<{let f,u,g,D,B;if(d>4||0>d)return k;if(!a.next_out||!a.next_in&&0!==a.avail_in||n==W&&4!=d)return a.msg=U[4],k;if(0===a.avail_out)return a.msg=U[7],-5;var L;if(t=a,D=r,r=d,42==n&&(u=8+(o-8<<4)<<8,g=(N-1&255)>>1,g>3&&(g=3),u|=g<<6,0!==E&&(u|=32),u+=31-u%31,n=C,ie((L=u)>>8&255),ie(255&L)),0!==e.pending){if(t.flush_pending(),0===t.avail_out)return r=-1,0}else if(0===t.avail_in&&D>=d&&4!=d)return t.msg=U[7],-5;if(n==W&&0!==t.avail_in)return a.msg=U[7],-5;if(0!==t.avail_in||0!==S||0!=d&&n!=W){switch(B=-1,T[N].func){case 0:B=(e=>{let n,r=65535;for(r>i-5&&(r=i-5);;){if(1>=S){if(_e(),0===S&&0==e)return 0;if(0===S)break}if(E+=S,S=0,n=y+r,(0===E||E>=n)&&(S=E-n,E=n,he(!1),0===t.avail_out))return 0;if(E-y>=s-I&&(he(!1),0===t.avail_out))return 0}return he(4==e),0===t.avail_out?4==e?2:0:4==e?3:1})(d);break;case 1:B=(e=>{let n,i=0;for(;;){if(I>S){if(_e(),I>S&&0==e)return 0;if(0===S)break}if(3>S||(w=(w<s-I||2!=H&&(m=we(i)),3>m)n=ce(0,255&c[E]),S--,E++;else if(n=ce(E-F,m-3),S-=m,m>M||3>S)E+=m,m=0,w=255&c[E],w=(w<{let n,i,r=0;for(;;){if(I>S){if(_e(),I>S&&0==e)return 0;if(0===S)break}if(3>S||(w=(w<z&&s-I>=(E-r&65535)&&(2!=H&&(m=we(r)),5>=m&&(1==H||3==m&&E-F>4096)&&(m=2)),3>z||m>z)if(0!==R){if(n=ce(0,255&c[E-1]),n&&he(!1),E++,S--,0===t.avail_out)return 0}else R=1,E++,S--;else{i=E+S-3,n=ce(E-1-v,z-3),S-=z-1,z-=2;do{++E>i||(w=(w<1+Q+10-ee&&(ae(2,3),se(256,A.static_ltree),le()),Q=7;else if(ue(0,0,!1),3==d)for(f=0;p>f;f++)_[f]=0;if(t.flush_pending(),0===t.avail_out)return r=-1,0}}return 4!=d?0:1}}function M(){const e=this;e.next_in_index=0,e.next_out_index=0,e.avail_in=0,e.total_in=0,e.avail_out=0,e.total_out=0}M.prototype={deflateInit:function(e,t){const n=this;return n.dstate=new L,t||(t=15),n.dstate.deflateInit(n,e,t)},deflate:function(e){const t=this;return t.dstate?t.dstate.deflate(t,e):k},deflateEnd:function(){const e=this;if(!e.dstate)return k;const t=e.dstate.deflateEnd();return e.dstate=null,t},deflateParams:function(e,t){const n=this;return n.dstate?n.dstate.deflateParams(n,e,t):k},deflateSetDictionary:function(e,t){const n=this;return n.dstate?n.dstate.deflateSetDictionary(n,e,t):k},read_buf:function(e,t,n){const i=this;let r=i.avail_in;return r>n&&(r=n),0===r?0:(i.avail_in-=r,e.set(i.next_in.subarray(i.next_in_index,i.next_in_index+r),t),i.next_in_index+=r,i.total_in+=r,r)},flush_pending:function(){const e=this;let t=e.dstate.pending;t>e.avail_out&&(t=e.avail_out),0!==t&&(e.next_out.set(e.dstate.pending_buf.subarray(e.dstate.pending_out,e.dstate.pending_out+t),e.next_out_index),e.next_out_index+=t,e.dstate.pending_out+=t,e.total_out+=t,e.avail_out-=t,e.dstate.pending-=t,0===e.dstate.pending&&(e.dstate.pending_out=0))}};const N=-2,H=-3,O=-5,P=[0,1,3,7,15,31,63,127,255,511,1023,2047,4095,8191,16383,32767,65535],V=[96,7,256,0,8,80,0,8,16,84,8,115,82,7,31,0,8,112,0,8,48,0,9,192,80,7,10,0,8,96,0,8,32,0,9,160,0,8,0,0,8,128,0,8,64,0,9,224,80,7,6,0,8,88,0,8,24,0,9,144,83,7,59,0,8,120,0,8,56,0,9,208,81,7,17,0,8,104,0,8,40,0,9,176,0,8,8,0,8,136,0,8,72,0,9,240,80,7,4,0,8,84,0,8,20,85,8,227,83,7,43,0,8,116,0,8,52,0,9,200,81,7,13,0,8,100,0,8,36,0,9,168,0,8,4,0,8,132,0,8,68,0,9,232,80,7,8,0,8,92,0,8,28,0,9,152,84,7,83,0,8,124,0,8,60,0,9,216,82,7,23,0,8,108,0,8,44,0,9,184,0,8,12,0,8,140,0,8,76,0,9,248,80,7,3,0,8,82,0,8,18,85,8,163,83,7,35,0,8,114,0,8,50,0,9,196,81,7,11,0,8,98,0,8,34,0,9,164,0,8,2,0,8,130,0,8,66,0,9,228,80,7,7,0,8,90,0,8,26,0,9,148,84,7,67,0,8,122,0,8,58,0,9,212,82,7,19,0,8,106,0,8,42,0,9,180,0,8,10,0,8,138,0,8,74,0,9,244,80,7,5,0,8,86,0,8,22,192,8,0,83,7,51,0,8,118,0,8,54,0,9,204,81,7,15,0,8,102,0,8,38,0,9,172,0,8,6,0,8,134,0,8,70,0,9,236,80,7,9,0,8,94,0,8,30,0,9,156,84,7,99,0,8,126,0,8,62,0,9,220,82,7,27,0,8,110,0,8,46,0,9,188,0,8,14,0,8,142,0,8,78,0,9,252,96,7,256,0,8,81,0,8,17,85,8,131,82,7,31,0,8,113,0,8,49,0,9,194,80,7,10,0,8,97,0,8,33,0,9,162,0,8,1,0,8,129,0,8,65,0,9,226,80,7,6,0,8,89,0,8,25,0,9,146,83,7,59,0,8,121,0,8,57,0,9,210,81,7,17,0,8,105,0,8,41,0,9,178,0,8,9,0,8,137,0,8,73,0,9,242,80,7,4,0,8,85,0,8,21,80,8,258,83,7,43,0,8,117,0,8,53,0,9,202,81,7,13,0,8,101,0,8,37,0,9,170,0,8,5,0,8,133,0,8,69,0,9,234,80,7,8,0,8,93,0,8,29,0,9,154,84,7,83,0,8,125,0,8,61,0,9,218,82,7,23,0,8,109,0,8,45,0,9,186,0,8,13,0,8,141,0,8,77,0,9,250,80,7,3,0,8,83,0,8,19,85,8,195,83,7,35,0,8,115,0,8,51,0,9,198,81,7,11,0,8,99,0,8,35,0,9,166,0,8,3,0,8,131,0,8,67,0,9,230,80,7,7,0,8,91,0,8,27,0,9,150,84,7,67,0,8,123,0,8,59,0,9,214,82,7,19,0,8,107,0,8,43,0,9,182,0,8,11,0,8,139,0,8,75,0,9,246,80,7,5,0,8,87,0,8,23,192,8,0,83,7,51,0,8,119,0,8,55,0,9,206,81,7,15,0,8,103,0,8,39,0,9,174,0,8,7,0,8,135,0,8,71,0,9,238,80,7,9,0,8,95,0,8,31,0,9,158,84,7,99,0,8,127,0,8,63,0,9,222,82,7,27,0,8,111,0,8,47,0,9,190,0,8,15,0,8,143,0,8,79,0,9,254,96,7,256,0,8,80,0,8,16,84,8,115,82,7,31,0,8,112,0,8,48,0,9,193,80,7,10,0,8,96,0,8,32,0,9,161,0,8,0,0,8,128,0,8,64,0,9,225,80,7,6,0,8,88,0,8,24,0,9,145,83,7,59,0,8,120,0,8,56,0,9,209,81,7,17,0,8,104,0,8,40,0,9,177,0,8,8,0,8,136,0,8,72,0,9,241,80,7,4,0,8,84,0,8,20,85,8,227,83,7,43,0,8,116,0,8,52,0,9,201,81,7,13,0,8,100,0,8,36,0,9,169,0,8,4,0,8,132,0,8,68,0,9,233,80,7,8,0,8,92,0,8,28,0,9,153,84,7,83,0,8,124,0,8,60,0,9,217,82,7,23,0,8,108,0,8,44,0,9,185,0,8,12,0,8,140,0,8,76,0,9,249,80,7,3,0,8,82,0,8,18,85,8,163,83,7,35,0,8,114,0,8,50,0,9,197,81,7,11,0,8,98,0,8,34,0,9,165,0,8,2,0,8,130,0,8,66,0,9,229,80,7,7,0,8,90,0,8,26,0,9,149,84,7,67,0,8,122,0,8,58,0,9,213,82,7,19,0,8,106,0,8,42,0,9,181,0,8,10,0,8,138,0,8,74,0,9,245,80,7,5,0,8,86,0,8,22,192,8,0,83,7,51,0,8,118,0,8,54,0,9,205,81,7,15,0,8,102,0,8,38,0,9,173,0,8,6,0,8,134,0,8,70,0,9,237,80,7,9,0,8,94,0,8,30,0,9,157,84,7,99,0,8,126,0,8,62,0,9,221,82,7,27,0,8,110,0,8,46,0,9,189,0,8,14,0,8,142,0,8,78,0,9,253,96,7,256,0,8,81,0,8,17,85,8,131,82,7,31,0,8,113,0,8,49,0,9,195,80,7,10,0,8,97,0,8,33,0,9,163,0,8,1,0,8,129,0,8,65,0,9,227,80,7,6,0,8,89,0,8,25,0,9,147,83,7,59,0,8,121,0,8,57,0,9,211,81,7,17,0,8,105,0,8,41,0,9,179,0,8,9,0,8,137,0,8,73,0,9,243,80,7,4,0,8,85,0,8,21,80,8,258,83,7,43,0,8,117,0,8,53,0,9,203,81,7,13,0,8,101,0,8,37,0,9,171,0,8,5,0,8,133,0,8,69,0,9,235,80,7,8,0,8,93,0,8,29,0,9,155,84,7,83,0,8,125,0,8,61,0,9,219,82,7,23,0,8,109,0,8,45,0,9,187,0,8,13,0,8,141,0,8,77,0,9,251,80,7,3,0,8,83,0,8,19,85,8,195,83,7,35,0,8,115,0,8,51,0,9,199,81,7,11,0,8,99,0,8,35,0,9,167,0,8,3,0,8,131,0,8,67,0,9,231,80,7,7,0,8,91,0,8,27,0,9,151,84,7,67,0,8,123,0,8,59,0,9,215,82,7,19,0,8,107,0,8,43,0,9,183,0,8,11,0,8,139,0,8,75,0,9,247,80,7,5,0,8,87,0,8,23,192,8,0,83,7,51,0,8,119,0,8,55,0,9,207,81,7,15,0,8,103,0,8,39,0,9,175,0,8,7,0,8,135,0,8,71,0,9,239,80,7,9,0,8,95,0,8,31,0,9,159,84,7,99,0,8,127,0,8,63,0,9,223,82,7,27,0,8,111,0,8,47,0,9,191,0,8,15,0,8,143,0,8,79,0,9,255],q=[80,5,1,87,5,257,83,5,17,91,5,4097,81,5,5,89,5,1025,85,5,65,93,5,16385,80,5,3,88,5,513,84,5,33,92,5,8193,82,5,9,90,5,2049,86,5,129,192,5,24577,80,5,2,87,5,385,83,5,25,91,5,6145,81,5,7,89,5,1537,85,5,97,93,5,24577,80,5,4,88,5,769,84,5,49,92,5,12289,82,5,13,90,5,3073,86,5,193,192,5,24577],Z=[3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,43,51,59,67,83,99,115,131,163,195,227,258,0,0],K=[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,112,112],G=[1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577],Y=[0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13];function j(){let e,t,n,i,r,a;function s(e,t,s,o,l,c,d,f,u,h,_){let w,p,g,b,x,y,m,k,v,R,E,D,A,F,S;R=0,x=s;do{n[e[t+R]]++,R++,x--}while(0!==x);if(n[0]==s)return d[0]=-1,f[0]=0,0;for(k=f[0],y=1;15>=y&&0===n[y];y++);for(m=y,y>k&&(k=y),x=15;0!==x&&0===n[x];x--);for(g=x,k>x&&(k=x),f[0]=k,F=1<y;y++,F<<=1)if(0>(F-=n[y]))return H;if(0>(F-=n[x]))return H;for(n[x]+=F,a[1]=y=0,R=1,A=2;0!=--x;)a[A]=y+=n[R],A++,R++;x=0,R=0;do{0!==(y=e[t+R])&&(_[a[y]++]=x),R++}while(++x=m;m++)for(w=n[m];0!=w--;){for(;m>D+k;){if(b++,D+=k,S=g-D,S=S>k?k:S,(p=1<<(y=m-D))>w+1&&(p-=w+1,A=m,S>y))for(;++yn[++A];)p-=n[A];if(S=1<1440)return H;r[b]=E=h[0],h[0]+=S,0!==b?(a[b]=x,i[0]=y,i[1]=k,y=x>>>D-k,i[2]=E-r[b-1]-y,u.set(i,3*(r[b-1]+y))):d[0]=E}for(i[1]=m-D,s>R?_[R]_[R]?0:96,i[2]=_[R++]):(i[0]=c[_[R]-o]+16+64,i[2]=l[_[R++]-o]):i[0]=192,p=1<>>D;S>y;y+=p)u.set(i,3*(E+y));for(y=1<>>=1)x^=y;for(x^=y,v=(1<o;o++)t[o]=0;for(o=0;16>o;o++)n[o]=0;for(o=0;3>o;o++)i[o]=0;r.set(n.subarray(0,15),0),a.set(n.subarray(0,16),0)}this.inflate_trees_bits=(n,i,r,a,l)=>{let c;return o(19),e[0]=0,c=s(n,0,19,19,null,null,r,i,a,e,t),c==H?l.msg="oversubscribed dynamic bit lengths tree":c!=O&&0!==i[0]||(l.msg="incomplete dynamic bit lengths tree",c=H),c},this.inflate_trees_dynamic=(n,i,r,a,l,c,d,f,u)=>{let h;return o(288),e[0]=0,h=s(r,0,n,257,Z,K,c,a,f,e,t),0!=h||0===a[0]?(h==H?u.msg="oversubscribed literal/length tree":-4!=h&&(u.msg="incomplete literal/length tree",h=H),h):(o(288),h=s(r,n,i,0,G,Y,d,l,f,e,t),0!=h||0===l[0]&&n>257?(h==H?u.msg="oversubscribed distance tree":h==O?(u.msg="incomplete distance tree",h=H):-4!=h&&(u.msg="empty distance tree with lengths",h=H),h):0)}}function X(){const e=this;let t,n,i,r,a=0,s=0,o=0,l=0,c=0,d=0,f=0,u=0,h=0,_=0;function w(e,t,n,i,r,a,s,o){let l,c,d,f,u,h,_,w,p,g,b,x,y,m,k,v;_=o.next_in_index,w=o.avail_in,u=s.bitb,h=s.bitk,p=s.write,g=ph;)w--,u|=(255&o.read_byte(_++))<>=c[v+1],h-=c[v+1],0!=(16&f)){for(f&=15,y=c[v+2]+(u&P[f]),u>>=f,h-=f;15>h;)w--,u|=(255&o.read_byte(_++))<>=c[v+1],h-=c[v+1],0!=(16&f)){for(f&=15;f>h;)w--,u|=(255&o.read_byte(_++))<>=f,h-=f,g-=y,m>p){k=p-m;do{k+=s.end}while(0>k);if(f=s.end-k,y>f){if(y-=f,p-k>0&&f>p-k)do{s.win[p++]=s.win[k++]}while(0!=--f);else s.win.set(s.win.subarray(k,k+f),p),p+=f,k+=f,f=0;k=0}}else k=p-m,p-k>0&&2>p-k?(s.win[p++]=s.win[k++],s.win[p++]=s.win[k++],y-=2):(s.win.set(s.win.subarray(k,k+2),p),p+=2,k+=2,y-=2);if(p-k>0&&y>p-k)do{s.win[p++]=s.win[k++]}while(0!=--y);else s.win.set(s.win.subarray(k,k+y),p),p+=y,k+=y,y=0;break}if(0!=(64&f))return o.msg="invalid distance code",y=o.avail_in-w,y=y>h>>3?h>>3:y,w+=y,_-=y,h-=y<<3,s.bitb=u,s.bitk=h,o.avail_in=w,o.total_in+=_-o.next_in_index,o.next_in_index=_,s.write=p,H;l+=c[v+2],l+=u&P[f],v=3*(d+l),f=c[v]}break}if(0!=(64&f))return 0!=(32&f)?(y=o.avail_in-w,y=y>h>>3?h>>3:y,w+=y,_-=y,h-=y<<3,s.bitb=u,s.bitk=h,o.avail_in=w,o.total_in+=_-o.next_in_index,o.next_in_index=_,s.write=p,1):(o.msg="invalid literal/length code",y=o.avail_in-w,y=y>h>>3?h>>3:y,w+=y,_-=y,h-=y<<3,s.bitb=u,s.bitk=h,o.avail_in=w,o.total_in+=_-o.next_in_index,o.next_in_index=_,s.write=p,H);if(l+=c[v+2],l+=u&P[f],v=3*(d+l),0===(f=c[v])){u>>=c[v+1],h-=c[v+1],s.win[p++]=c[v+2],g--;break}}else u>>=c[v+1],h-=c[v+1],s.win[p++]=c[v+2],g--}while(g>=258&&w>=10);return y=o.avail_in-w,y=y>h>>3?h>>3:y,w+=y,_-=y,h-=y<<3,s.bitb=u,s.bitk=h,o.avail_in=w,o.total_in+=_-o.next_in_index,o.next_in_index=_,s.write=p,0}e.init=(e,a,s,o,l,c)=>{t=0,f=e,u=a,i=s,h=o,r=l,_=c,n=null},e.proc=(e,p,g)=>{let b,x,y,m,k,v,R,E=0,D=0,A=0;for(A=p.next_in_index,m=p.avail_in,E=e.bitb,D=e.bitk,k=e.write,v=k=258&&m>=10&&(e.bitb=E,e.bitk=D,p.avail_in=m,p.total_in+=A-p.next_in_index,p.next_in_index=A,e.write=k,g=w(f,u,i,h,r,_,e,p),A=p.next_in_index,m=p.avail_in,E=e.bitb,D=e.bitk,k=e.write,v=kD;){if(0===m)return e.bitb=E,e.bitk=D,p.avail_in=m,p.total_in+=A-p.next_in_index,p.next_in_index=A,e.write=k,e.inflate_flush(p,g);g=0,m--,E|=(255&p.read_byte(A++))<>>=n[x+1],D-=n[x+1],y=n[x],0===y){l=n[x+2],t=6;break}if(0!=(16&y)){c=15&y,a=n[x+2],t=2;break}if(0==(64&y)){o=y,s=x/3+n[x+2];break}if(0!=(32&y)){t=7;break}return t=9,p.msg="invalid literal/length code",g=H,e.bitb=E,e.bitk=D,p.avail_in=m,p.total_in+=A-p.next_in_index,p.next_in_index=A,e.write=k,e.inflate_flush(p,g);case 2:for(b=c;b>D;){if(0===m)return e.bitb=E,e.bitk=D,p.avail_in=m,p.total_in+=A-p.next_in_index,p.next_in_index=A,e.write=k,e.inflate_flush(p,g);g=0,m--,E|=(255&p.read_byte(A++))<>=b,D-=b,o=u,n=r,s=_,t=3;case 3:for(b=o;b>D;){if(0===m)return e.bitb=E,e.bitk=D,p.avail_in=m,p.total_in+=A-p.next_in_index,p.next_in_index=A,e.write=k,e.inflate_flush(p,g);g=0,m--,E|=(255&p.read_byte(A++))<>=n[x+1],D-=n[x+1],y=n[x],0!=(16&y)){c=15&y,d=n[x+2],t=4;break}if(0==(64&y)){o=y,s=x/3+n[x+2];break}return t=9,p.msg="invalid distance code",g=H,e.bitb=E,e.bitk=D,p.avail_in=m,p.total_in+=A-p.next_in_index,p.next_in_index=A,e.write=k,e.inflate_flush(p,g);case 4:for(b=c;b>D;){if(0===m)return e.bitb=E,e.bitk=D,p.avail_in=m,p.total_in+=A-p.next_in_index,p.next_in_index=A,e.write=k,e.inflate_flush(p,g);g=0,m--,E|=(255&p.read_byte(A++))<>=b,D-=b,t=5;case 5:for(R=k-d;0>R;)R+=e.end;for(;0!==a;){if(0===v&&(k==e.end&&0!==e.read&&(k=0,v=k7&&(D-=8,m++,A--),e.write=k,g=e.inflate_flush(p,g),k=e.write,v=k{}}j.inflate_trees_fixed=(e,t,n,i)=>(e[0]=9,t[0]=5,n[0]=V,i[0]=q,0);const J=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15];function Q(e,t){const n=this;let i,r=0,a=0,s=0,o=0;const l=[0],c=[0],f=new X;let u=0,h=new Int32Array(4320);const _=new j;n.bitk=0,n.bitb=0,n.win=new d(t),n.end=t,n.read=0,n.write=0,n.reset=(e,t)=>{t&&(t[0]=0),6==r&&f.free(e),r=0,n.bitk=0,n.bitb=0,n.read=n.write=0},n.reset(e,null),n.inflate_flush=(e,t)=>{let i,r,a;return r=e.next_out_index,a=n.read,i=(a>n.write?n.end:n.write)-a,i>e.avail_out&&(i=e.avail_out),0!==i&&t==O&&(t=0),e.avail_out-=i,e.total_out+=i,e.next_out.set(n.win.subarray(a,a+i),r),r+=i,a+=i,a==n.end&&(a=0,n.write==n.end&&(n.write=0),i=n.write-a,i>e.avail_out&&(i=e.avail_out),0!==i&&t==O&&(t=0),e.avail_out-=i,e.total_out+=i,e.next_out.set(n.win.subarray(a,a+i),r),r+=i,a+=i),e.next_out_index=r,n.read=a,t},n.proc=(e,t)=>{let d,w,p,g,b,x,y,m;for(g=e.next_in_index,b=e.avail_in,w=n.bitb,p=n.bitk,x=n.write,y=xp;){if(0===b)return n.bitb=w,n.bitk=p,e.avail_in=b,e.total_in+=g-e.next_in_index,e.next_in_index=g,n.write=x,n.inflate_flush(e,t);t=0,b--,w|=(255&e.read_byte(g++))<>>1){case 0:w>>>=3,p-=3,d=7&p,w>>>=d,p-=d,r=1;break;case 1:k=[],v=[],R=[[]],E=[[]],j.inflate_trees_fixed(k,v,R,E),f.init(k[0],v[0],R[0],0,E[0],0),w>>>=3,p-=3,r=6;break;case 2:w>>>=3,p-=3,r=3;break;case 3:return w>>>=3,p-=3,r=9,e.msg="invalid block type",t=H,n.bitb=w,n.bitk=p,e.avail_in=b,e.total_in+=g-e.next_in_index,e.next_in_index=g,n.write=x,n.inflate_flush(e,t)}break;case 1:for(;32>p;){if(0===b)return n.bitb=w,n.bitk=p,e.avail_in=b,e.total_in+=g-e.next_in_index,e.next_in_index=g,n.write=x,n.inflate_flush(e,t);t=0,b--,w|=(255&e.read_byte(g++))<>>16&65535)!=(65535&w))return r=9,e.msg="invalid stored block lengths",t=H,n.bitb=w,n.bitk=p,e.avail_in=b,e.total_in+=g-e.next_in_index,e.next_in_index=g,n.write=x,n.inflate_flush(e,t);a=65535&w,w=p=0,r=0!==a?2:0!==u?7:0;break;case 2:if(0===b)return n.bitb=w,n.bitk=p,e.avail_in=b,e.total_in+=g-e.next_in_index,e.next_in_index=g,n.write=x,n.inflate_flush(e,t);if(0===y&&(x==n.end&&0!==n.read&&(x=0,y=xb&&(d=b),d>y&&(d=y),n.win.set(e.read_buf(g,d),x),g+=d,b-=d,x+=d,y-=d,0!=(a-=d))break;r=0!==u?7:0;break;case 3:for(;14>p;){if(0===b)return n.bitb=w,n.bitk=p,e.avail_in=b,e.total_in+=g-e.next_in_index,e.next_in_index=g,n.write=x,n.inflate_flush(e,t);t=0,b--,w|=(255&e.read_byte(g++))<29||(d>>5&31)>29)return r=9,e.msg="too many length or distance symbols",t=H,n.bitb=w,n.bitk=p,e.avail_in=b,e.total_in+=g-e.next_in_index,e.next_in_index=g,n.write=x,n.inflate_flush(e,t);if(d=258+(31&d)+(d>>5&31),!i||i.lengthm;m++)i[m]=0;w>>>=14,p-=14,o=0,r=4;case 4:for(;4+(s>>>10)>o;){for(;3>p;){if(0===b)return n.bitb=w,n.bitk=p,e.avail_in=b,e.total_in+=g-e.next_in_index,e.next_in_index=g,n.write=x,n.inflate_flush(e,t);t=0,b--,w|=(255&e.read_byte(g++))<>>=3,p-=3}for(;19>o;)i[J[o++]]=0;if(l[0]=7,d=_.inflate_trees_bits(i,l,c,h,e),0!=d)return(t=d)==H&&(i=null,r=9),n.bitb=w,n.bitk=p,e.avail_in=b,e.total_in+=g-e.next_in_index,e.next_in_index=g,n.write=x,n.inflate_flush(e,t);o=0,r=5;case 5:for(;d=s,258+(31&d)+(d>>5&31)>o;){let a,f;for(d=l[0];d>p;){if(0===b)return n.bitb=w,n.bitk=p,e.avail_in=b,e.total_in+=g-e.next_in_index,e.next_in_index=g,n.write=x,n.inflate_flush(e,t);t=0,b--,w|=(255&e.read_byte(g++))<f)w>>>=d,p-=d,i[o++]=f;else{for(m=18==f?7:f-14,a=18==f?11:3;d+m>p;){if(0===b)return n.bitb=w,n.bitk=p,e.avail_in=b,e.total_in+=g-e.next_in_index,e.next_in_index=g,n.write=x,n.inflate_flush(e,t);t=0,b--,w|=(255&e.read_byte(g++))<>>=d,p-=d,a+=w&P[m],w>>>=m,p-=m,m=o,d=s,m+a>258+(31&d)+(d>>5&31)||16==f&&1>m)return i=null,r=9,e.msg="invalid bit length repeat",t=H,n.bitb=w,n.bitk=p,e.avail_in=b,e.total_in+=g-e.next_in_index,e.next_in_index=g,n.write=x,n.inflate_flush(e,t);f=16==f?i[m-1]:0;do{i[m++]=f}while(0!=--a);o=m}}if(c[0]=-1,D=[],A=[],F=[],S=[],D[0]=9,A[0]=6,d=s,d=_.inflate_trees_dynamic(257+(31&d),1+(d>>5&31),i,D,A,F,S,h,e),0!=d)return d==H&&(i=null,r=9),t=d,n.bitb=w,n.bitk=p,e.avail_in=b,e.total_in+=g-e.next_in_index,e.next_in_index=g,n.write=x,n.inflate_flush(e,t);f.init(D[0],A[0],h,F[0],h,S[0]),r=6;case 6:if(n.bitb=w,n.bitk=p,e.avail_in=b,e.total_in+=g-e.next_in_index,e.next_in_index=g,n.write=x,1!=(t=f.proc(n,e,t)))return n.inflate_flush(e,t);if(t=0,f.free(e),g=e.next_in_index,b=e.avail_in,w=n.bitb,p=n.bitk,x=n.write,y=x{n.reset(e,null),n.win=null,h=null},n.set_dictionary=(e,t,i)=>{n.win.set(e.subarray(t,t+i),0),n.read=n.write=i},n.sync_point=()=>1==r?1:0}const $=13,ee=[0,0,255,255];function te(){const e=this;function t(e){return e&&e.istate?(e.total_in=e.total_out=0,e.msg=null,e.istate.mode=7,e.istate.blocks.reset(e,null),0):N}e.mode=0,e.method=0,e.was=[0],e.need=0,e.marker=0,e.wbits=0,e.inflateEnd=t=>(e.blocks&&e.blocks.free(t),e.blocks=null,0),e.inflateInit=(n,i)=>(n.msg=null,e.blocks=null,8>i||i>15?(e.inflateEnd(n),N):(e.wbits=i,n.istate.blocks=new Q(n,1<{let n,i;if(!e||!e.istate||!e.next_in)return N;const r=e.istate;for(t=4==t?O:0,n=O;;)switch(r.mode){case 0:if(0===e.avail_in)return n;if(n=t,e.avail_in--,e.total_in++,8!=(15&(r.method=e.read_byte(e.next_in_index++)))){r.mode=$,e.msg="unknown compression method",r.marker=5;break}if(8+(r.method>>4)>r.wbits){r.mode=$,e.msg="invalid win size",r.marker=5;break}r.mode=1;case 1:if(0===e.avail_in)return n;if(n=t,e.avail_in--,e.total_in++,i=255&e.read_byte(e.next_in_index++),((r.method<<8)+i)%31!=0){r.mode=$,e.msg="incorrect header check",r.marker=5;break}if(0==(32&i)){r.mode=7;break}r.mode=2;case 2:if(0===e.avail_in)return n;n=t,e.avail_in--,e.total_in++,r.need=(255&e.read_byte(e.next_in_index++))<<24&4278190080,r.mode=3;case 3:if(0===e.avail_in)return n;n=t,e.avail_in--,e.total_in++,r.need+=(255&e.read_byte(e.next_in_index++))<<16&16711680,r.mode=4;case 4:if(0===e.avail_in)return n;n=t,e.avail_in--,e.total_in++,r.need+=(255&e.read_byte(e.next_in_index++))<<8&65280,r.mode=5;case 5:return 0===e.avail_in?n:(n=t,e.avail_in--,e.total_in++,r.need+=255&e.read_byte(e.next_in_index++),r.mode=6,2);case 6:return r.mode=$,e.msg="need dictionary",r.marker=0,N;case 7:if(n=r.blocks.proc(e,n),n==H){r.mode=$,r.marker=0;break}if(0==n&&(n=t),1!=n)return n;n=t,r.blocks.reset(e,r.was),r.mode=12;case 12:return e.avail_in=0,1;case $:return H;default:return N}},e.inflateSetDictionary=(e,t,n)=>{let i=0,r=n;if(!e||!e.istate||6!=e.istate.mode)return N;const a=e.istate;return r<1<{let n,i,r,a,s;if(!e||!e.istate)return N;const o=e.istate;if(o.mode!=$&&(o.mode=$,o.marker=0),0===(n=e.avail_in))return O;for(i=e.next_in_index,r=o.marker;0!==n&&4>r;)e.read_byte(i)==ee[r]?r++:r=0!==e.read_byte(i)?0:4-r,i++,n--;return e.total_in+=i-e.next_in_index,e.next_in_index=i,e.avail_in=n,o.marker=r,4!=r?H:(a=e.total_in,s=e.total_out,t(e),e.total_in=a,e.total_out=s,o.mode=7,0)},e.inflateSyncPoint=e=>e&&e.istate&&e.istate.blocks?e.istate.blocks.sync_point():N}function ne(){}ne.prototype={inflateInit:function(e){const t=this;return t.istate=new te,e||(e=15),t.istate.inflateInit(t,e)},inflate:function(e){const t=this;return t.istate?t.istate.inflate(t,e):N},inflateEnd:function(){const e=this;if(!e.istate)return N;const t=e.istate.inflateEnd(e);return e.istate=null,t},inflateSync:function(){const e=this;return e.istate?e.istate.inflateSync(e):N},inflateSetDictionary:function(e,t){const n=this;return n.istate?n.istate.inflateSetDictionary(n,e,t):N},read_byte:function(e){return this.next_in[e]},read_buf:function(e,t){return this.next_in.subarray(e,e+t)}};const ie={chunkSize:524288,maxWorkers:"undefined"!=typeof navigator&&navigator.hardwareConcurrency||2,terminateWorkerTimeout:5e3,useWebWorkers:!0,workerScripts:void 0},re=n.assign({},ie);function ae(){return re}function se(e){if(void 0!==e.baseURL&&(re.baseURL=e.baseURL),void 0!==e.chunkSize&&(re.chunkSize=e.chunkSize),void 0!==e.maxWorkers&&(re.maxWorkers=e.maxWorkers),void 0!==e.terminateWorkerTimeout&&(re.terminateWorkerTimeout=e.terminateWorkerTimeout),void 0!==e.useWebWorkers&&(re.useWebWorkers=e.useWebWorkers),void 0!==e.Deflate&&(re.Deflate=e.Deflate),void 0!==e.Inflate&&(re.Inflate=e.Inflate),void 0!==e.workerScripts){if(e.workerScripts.deflate){if(!t.isArray(e.workerScripts.deflate))throw new c("workerScripts.deflate must be an array");re.workerScripts||(re.workerScripts={}),re.workerScripts.deflate=e.workerScripts.deflate}if(e.workerScripts.inflate){if(!t.isArray(e.workerScripts.inflate))throw new c("workerScripts.inflate must be an array");re.workerScripts||(re.workerScripts={}),re.workerScripts.inflate=e.workerScripts.inflate}}}const oe=[];for(let e=0;256>e;e++){let t=e;for(let e=0;8>e;e++)1&t?t=t>>>1^3988292384:t>>>=1;oe[e]=t}class le{constructor(e){this.crc=e||-1}append(e){let t=0|this.crc;for(let n=0,i=0|e.length;i>n;n++)t=t>>>8^oe[255&(t^e[n])];this.crc=t}get(){return~this.crc}}function ce(e){if(void 0===p){const t=new d((e=unescape(encodeURIComponent(e))).length);for(let n=0;n0&&t&&(e[n-1]=de.partial(t,e[n-1]&2147483648>>t-1,1)),e},partial:(e,t,n)=>32===e?t:(n?0|t:t<<32-e)+1099511627776*e,getPartial:e=>a.round(e/1099511627776)||32,_shiftRight(e,t,n,i){for(void 0===i&&(i=[]);t>=32;t-=32)i.push(n),n=0;if(0===t)return i.concat(e);for(let r=0;r>>t),n=e[r]<<32-t;const r=e.length?e[e.length-1]:0,a=de.getPartial(r);return i.push(de.partial(t+a&31,t+a>32?n:i.pop(),1)),i}},fe={bytes:{fromBits(e){const t=de.bitLength(e)/8,n=new d(t);let i;for(let r=0;t>r;r++)0==(3&r)&&(i=e[r/4]),n[r]=i>>>24,i<<=8;return n},toBits(e){const t=[];let n,i=0;for(n=0;n9007199254740991)throw new c("Cannot hash more than 2^53 - 1 bits");const a=new u(n);let s=0;for(let e=t.blockSize+i-(t.blockSize+i&t.blockSize-1);r>=e;e+=t.blockSize)t._block(a.subarray(16*s,16*(s+1))),s+=1;return n.splice(0,16*s),t},finalize:function(){const e=this;let t=e._buffer;const n=e._h;t=de.concat(t,[de.partial(1,1)]);for(let e=t.length+2;15&e;e++)t.push(0);for(t.push(a.floor(e._length/4294967296)),t.push(0|e._length);t.length;)e._block(t.splice(0,16));return e.reset(),n},_init:[1732584193,4023233417,2562383102,271733878,3285377520],_key:[1518500249,1859775393,2400959708,3395469782],_f:(e,t,n,i)=>e>19?e>39?e>59?e>79?void 0:t^n^i:t&n|t&i|n&i:t^n^i:t&n|~t&i,_S:(e,t)=>t<>>32-e,_block:function(e){const n=this,i=n._h,r=t(80);for(let t=0;16>t;t++)r[t]=e[t];let s=i[0],o=i[1],l=i[2],c=i[3],d=i[4];for(let e=0;79>=e;e++){16>e||(r[e]=n._S(1,r[e-3]^r[e-8]^r[e-14]^r[e-16]));const t=n._S(5,s)+n._f(e,o,l,c)+d+r[e]+n._key[a.floor(e/20)]|0;d=c,c=l,l=n._S(30,o),o=s,s=t}i[0]=i[0]+s|0,i[1]=i[1]+o|0,i[2]=i[2]+l|0,i[3]=i[3]+c|0,i[4]=i[4]+d|0}};const he={getRandomValues(e){const t=new u(e.buffer),n=e=>{let t=987654321;const n=4294967295;return()=>(t=36969*(65535&t)+(t>>16)&n,(((t<<16)+(e=18e3*(65535&e)+(e>>16)&n)&n)/4294967296+.5)*(a.random()>.5?1:-1))};for(let i,r=0;rnew _e.hmacSha1(fe.bytes.toBits(e)),pbkdf2(e,t,n,i){if(n=n||1e4,0>i||0>n)throw new c("invalid params to pbkdf2");const r=1+(i>>5)<<2;let a,s,o,l,d;const f=new ArrayBuffer(r);let u=new h(f),_=0;const w=de;for(t=fe.bytes.toBits(t),d=1;(r||1)>_;d++){for(a=s=e.encrypt(w.concat(t,[d])),o=1;n>o;o++)for(s=e.encrypt(s),l=0;l_&&or&&(e=n.hash(e));for(let t=0;r>t;t++)i[0][t]=909522486^e[t],i[1][t]=1549556828^e[t];t._baseHash[0].update(i[0]),t._baseHash[1].update(i[1]),t._resultHash=new n(t._baseHash[0])}reset(){const e=this;e._resultHash=new e._hash(e._baseHash[0]),e._updated=!1}update(e){this._updated=!0,this._resultHash.update(e)}digest(){const e=this,t=e._resultHash.finalize(),n=new e._hash(e._baseHash[1]).update(t).finalize();return e.reset(),n}encrypt(e){if(this._updated)throw new c("encrypt on already updated hmac called!");return this.update(e),this.digest(e)}}},we="Invalid pasword",pe=16,ge={name:"PBKDF2"},be=n.assign({hash:{name:"HMAC"}},ge),xe=n.assign({iterations:1e3,hash:{name:"SHA-1"}},ge),ye=["deriveBits"],me=[8,12,16],ke=[16,24,32],ve=10,Re=[0,0,0,0],Ee=void 0!==y,De=Ee&&void 0!==y.subtle,Ae=fe.bytes,Fe=class{constructor(e){const t=this;t._tables=[[[],[],[],[],[]],[[],[],[],[],[]]],t._tables[0][0][0]||t._precompute();const n=t._tables[0][4],i=t._tables[1],r=e.length;let a,s,o,l=1;if(4!==r&&6!==r&&8!==r)throw new c("invalid aes key size");for(t._key=[s=e.slice(0),o=[]],a=r;4*r+28>a;a++){let e=s[a-1];(a%r==0||8===r&&a%r==4)&&(e=n[e>>>24]<<24^n[e>>16&255]<<16^n[e>>8&255]<<8^n[255&e],a%r==0&&(e=e<<8^e>>>24^l<<24,l=l<<1^283*(l>>7))),s[a]=s[a-r]^e}for(let e=0;a;e++,a--){const t=s[3&e?a:a-4];o[e]=4>=a||4>e?t:i[0][n[t>>>24]]^i[1][n[t>>16&255]]^i[2][n[t>>8&255]]^i[3][n[255&t]]}}encrypt(e){return this._crypt(e,0)}decrypt(e){return this._crypt(e,1)}_precompute(){const e=this._tables[0],t=this._tables[1],n=e[4],i=t[4],r=[],a=[];let s,o,l,c;for(let e=0;256>e;e++)a[(r[e]=e<<1^283*(e>>7))^e]=e;for(let d=s=0;!n[d];d^=o||1,s=a[s]||1){let a=s^s<<1^s<<2^s<<3^s<<4;a=a>>8^255&a^99,n[d]=a,i[a]=d,c=r[l=r[o=r[d]]];let f=16843009*c^65537*l^257*o^16843008*d,u=257*r[a]^16843008*a;for(let n=0;4>n;n++)e[n][d]=u=u<<24^u>>>8,t[n][a]=f=f<<24^f>>>8}for(let n=0;5>n;n++)e[n]=e[n].slice(0),t[n]=t[n].slice(0)}_crypt(e,t){if(4!==e.length)throw new c("invalid aes block size");const n=this._key[t],i=n.length/4-2,r=[0,0,0,0],a=this._tables[t],s=a[0],o=a[1],l=a[2],d=a[3],f=a[4];let u,h,_,w=e[0]^n[0],p=e[t?3:1]^n[1],g=e[2]^n[2],b=e[t?1:3]^n[3],x=4;for(let e=0;i>e;e++)u=s[w>>>24]^o[p>>16&255]^l[g>>8&255]^d[255&b]^n[x],h=s[p>>>24]^o[g>>16&255]^l[b>>8&255]^d[255&w]^n[x+1],_=s[g>>>24]^o[b>>16&255]^l[w>>8&255]^d[255&p]^n[x+2],b=s[b>>>24]^o[w>>16&255]^l[p>>8&255]^d[255&g]^n[x+3],x+=4,w=u,p=h,g=_;for(let e=0;4>e;e++)r[t?3&-e:e]=f[w>>>24]<<24^f[p>>16&255]<<16^f[g>>8&255]<<8^f[255&b]^n[x++],u=w,w=p,p=g,g=b,b=u;return r}},Se=class{constructor(e,t){this._prf=e,this._initIv=t,this._iv=t}reset(){this._iv=this._initIv}update(e){return this.calculate(this._prf,e,this._iv)}incWord(e){if(255==(e>>24&255)){let t=e>>16&255,n=e>>8&255,i=255&e;255===t?(t=0,255===n?(n=0,255===i?i=0:++i):++n):++t,e=0,e+=t<<16,e+=n<<8,e+=i}else e+=1<<24;return e}incCounter(e){0===(e[0]=this.incWord(e[0]))&&(e[1]=this.incWord(e[1]))}calculate(e,t,n){let i;if(!(i=t.length))return[];const r=de.bitLength(t);for(let r=0;i>r;r+=4){this.incCounter(n);const i=e.encrypt(n);t[r]^=i[0],t[r+1]^=i[1],t[r+2]^=i[2],t[r+3]^=i[3]}return de.clamp(t,r)}},ze=_e.hmacSha1;class Te{constructor(e,t,i){n.assign(this,{password:e,signed:t,strength:i-1,pendingInput:new d(0)})}async append(e){const n=this;if(n.password){const i=Be(e,0,me[n.strength]+2);await(async(e,t,n)=>{await We(e,n,Be(t,0,me[e.strength]));const i=Be(t,me[e.strength]),r=e.keys.passwordVerification;if(r[0]!=i[0]||r[1]!=i[1])throw new c(we)})(n,i,n.password),n.password=null,n.aesCtrGladman=new Se(new Fe(n.keys.key),t.from(Re)),n.hmac=new ze(n.keys.authentication),e=Be(e,me[n.strength]+2)}return Ce(n,e,new d(e.length-ve-(e.length-ve)%pe),0,ve,!0)}flush(){const e=this,t=e.pendingInput,n=Be(t,0,t.length-ve),i=Be(t,t.length-ve);let r=new d(0);if(n.length){const t=Ae.toBits(n);e.hmac.update(t);const i=e.aesCtrGladman.update(t);r=Ae.fromBits(i)}let a=!0;if(e.signed){const t=Be(Ae.fromBits(e.hmac.digest()),0,ve);for(let e=0;ve>e;e++)t[e]!=i[e]&&(a=!1)}return{valid:a,data:r}}}class Ue{constructor(e,t){n.assign(this,{password:e,strength:t-1,pendingInput:new d(0)})}async append(e){const n=this;let i=new d(0);n.password&&(i=await(async(e,t)=>{const n=(i=new d(me[e.strength]),Ee&&"function"==typeof y.getRandomValues?y.getRandomValues(i):he.getRandomValues(i));var i;return await We(e,t,n),Ie(n,e.keys.passwordVerification)})(n,n.password),n.password=null,n.aesCtrGladman=new Se(new Fe(n.keys.key),t.from(Re)),n.hmac=new ze(n.keys.authentication));const r=new d(i.length+e.length-e.length%pe);return r.set(i,0),Ce(n,e,r,i.length,0)}flush(){const e=this;let t=new d(0);if(e.pendingInput.length){const n=e.aesCtrGladman.update(Ae.toBits(e.pendingInput));e.hmac.update(n),t=Ae.fromBits(n)}const n=Be(Ae.fromBits(e.hmac.digest()),0,ve);return{data:Ie(t,n),signature:n}}}function Ce(e,t,n,i,r,a){const s=t.length-r;let o;for(e.pendingInput.length&&(t=Ie(e.pendingInput,t),n=((e,t)=>{if(t&&t>e.length){const n=e;(e=new d(t)).set(n,0)}return e})(n,s-s%pe)),o=0;s-pe>=o;o+=pe){const r=Ae.toBits(Be(t,o,o+pe));a&&e.hmac.update(r);const s=e.aesCtrGladman.update(r);a||e.hmac.update(s),n.set(Ae.fromBits(s),o+i)}return e.pendingInput=Be(t,o),n}async function We(e,t,i){const r=ce(t),a=await(async(e,t,n,i,r)=>Ee&&De&&"function"==typeof y.subtle.importKey?y.subtle.importKey("raw",t,n,!1,r):_e.importKey(t))(0,r,be,0,ye),s=await(async(e,t,n)=>Ee&&De&&"function"==typeof y.subtle.deriveBits?await y.subtle.deriveBits(e,t,n):_e.pbkdf2(t,e.salt,xe.iterations,n))(n.assign({salt:i},xe),a,8*(2*ke[e.strength]+2)),o=new d(s);e.keys={key:Ae.toBits(Be(o,0,ke[e.strength])),authentication:Ae.toBits(Be(o,ke[e.strength],2*ke[e.strength])),passwordVerification:Be(o,2*ke[e.strength])}}function Ie(e,t){let n=e;return e.length+t.length&&(n=new d(e.length+t.length),n.set(e,0),n.set(t,e.length)),n}function Be(e,t,n){return e.subarray(t,n)}class Le{constructor(e,t){n.assign(this,{password:e,passwordVerification:t}),Oe(this,e)}append(e){const t=this;if(t.password){const n=Ne(t,e.subarray(0,12));if(t.password=null,n[11]!=t.passwordVerification)throw new c(we);e=e.subarray(12)}return Ne(t,e)}flush(){return{valid:!0,data:new d(0)}}}class Me{constructor(e,t){n.assign(this,{password:e,passwordVerification:t}),Oe(this,e)}append(e){const t=this;let n,i;if(t.password){t.password=null;const r=y.getRandomValues(new d(12));r[11]=t.passwordVerification,n=new d(e.length+r.length),n.set(He(t,r),0),i=12}else n=new d(e.length),i=0;return n.set(He(t,e),i),n}flush(){return{data:new d(0)}}}function Ne(e,t){const n=new d(t.length);for(let i=0;i>>24]),e.keys[2]=~e.crcKey2.get()}function Ve(e){const t=2|e.keys[2];return qe(a.imul(t,1^t)>>>8)}function qe(e){return 255&e}function Ze(e){return 4294967295&e}const Ke="deflate",Ge="inflate",Ye="Invalid signature";class je{constructor(e,{signature:t,password:i,signed:r,compressed:a,zipCrypto:s,passwordVerification:o,encryptionStrength:l},{chunkSize:c}){const d=!!i;n.assign(this,{signature:t,encrypted:d,signed:r,compressed:a,inflate:a&&new e({chunkSize:c}),crc32:r&&new le,zipCrypto:s,decrypt:d&&s?new Le(i,o):new Te(i,r,l)})}async append(e){const t=this;return t.encrypted&&e.length&&(e=await t.decrypt.append(e)),t.compressed&&e.length&&(e=await t.inflate.append(e)),(!t.encrypted||t.zipCrypto)&&t.signed&&e.length&&t.crc32.append(e),e}async flush(){const e=this;let t,n=new d(0);if(e.encrypted){const t=e.decrypt.flush();if(!t.valid)throw new c(Ye);n=t.data}if((!e.encrypted||e.zipCrypto)&&e.signed){const n=new h(new d(4).buffer);if(t=e.crc32.get(),n.setUint32(0,t),e.signature!=n.getUint32(0,!1))throw new c(Ye)}return e.compressed&&(n=await e.inflate.append(n)||new d(0),await e.inflate.flush()),{data:n,signature:t}}}class Xe{constructor(e,{encrypted:t,signed:i,compressed:r,level:a,zipCrypto:s,password:o,passwordVerification:l,encryptionStrength:c},{chunkSize:d}){n.assign(this,{encrypted:t,signed:i,compressed:r,deflate:r&&new e({level:a||5,chunkSize:d}),crc32:i&&new le,zipCrypto:s,encrypt:t&&s?new Me(o,l):new Ue(o,c)})}async append(e){const t=this;let n=e;return t.compressed&&e.length&&(n=await t.deflate.append(e)),t.encrypted&&n.length&&(n=await t.encrypt.append(n)),(!t.encrypted||t.zipCrypto)&&t.signed&&e.length&&t.crc32.append(e),n}async flush(){const e=this;let t,n=new d(0);if(e.compressed&&(n=await e.deflate.flush()||new d(0)),e.encrypted){n=await e.encrypt.append(n);const i=e.encrypt.flush();t=i.signature;const r=new d(n.length+i.data.length);r.set(n,0),r.set(i.data,n.length),n=r}return e.encrypted&&!e.zipCrypto||!e.signed||(t=e.crc32.get()),{data:n,signature:t}}}const Je="init",Qe="append",$e="flush";let et=!0;var tt=(e,t,i,r,a,s,o)=>(n.assign(e,{busy:!0,codecConstructor:t,options:n.assign({},i),scripts:o,terminate(){e.worker&&!e.busy&&(e.worker.terminate(),e.interface=null)},onTaskFinished(){e.busy=!1,a(e)}}),s?((e,t)=>{let n;const i={type:"module"};if(!e.interface){if(et)try{e.worker=r({},t.baseURL)}catch(n){et=!1,e.worker=r(i,t.baseURL)}else e.worker=r(i,t.baseURL);e.worker.addEventListener("message",(t=>{const i=t.data;if(n){const t=i.error,r=i.type;if(t){const i=new c(t.message);i.stack=t.stack,n.reject(i),n=null,e.onTaskFinished()}else if(r==Je||r==$e||r==Qe){const t=i.data;r==$e?(n.resolve({data:new d(t),signature:i.signature}),n=null,e.onTaskFinished()):n.resolve(t&&new d(t))}}}),!1),e.interface={append:e=>a({type:Qe,data:e}),flush:()=>a({type:$e}),abort(){e.onTaskFinished()}}}return e.interface;function r(t,n){let i,r;i=e.scripts[0],"function"==typeof i&&(i=i());try{r=new l(i,n)}catch(e){r=i}return new Worker(r,t)}async function a(i){if(!n){const n=e.options,i=e.scripts.slice(1);await s({scripts:i,type:Je,options:n,config:{chunkSize:t.chunkSize}})}return s(i)}function s(t){const i=e.worker,r=new w(((e,t)=>n={resolve:e,reject:t}));try{if(t.data)try{t.data=t.data.buffer,i.postMessage(t,[t.data])}catch(e){i.postMessage(t)}else i.postMessage(t)}catch(t){n.reject(t),n=null,e.onTaskFinished()}return r}})(e,r):((e,t)=>{const n=((e,t,n)=>t.codecType.startsWith(Ke)?new Xe(e,t,n):t.codecType.startsWith(Ge)?new je(e,t,n):void 0)(e.codecConstructor,e.options,t);return{async append(t){try{return await n.append(t)}catch(t){throw e.onTaskFinished(),t}},async flush(){try{return await n.flush()}finally{e.onTaskFinished()}},abort(){e.onTaskFinished()}}})(e,r));let nt=[],it=[];function rt(e,t,n){const i=!(!t.compressed&&!t.signed&&!t.encrypted)&&(t.useWebWorkers||void 0===t.useWebWorkers&&n.useWebWorkers),r=i&&n.workerScripts?n.workerScripts[t.codecType]:[];if(nt.length!e.busy));return s?(at(s),tt(s,e,t,n,a,i,r)):new w((n=>it.push({resolve:n,codecConstructor:e,options:t,webWorker:i,scripts:r})))}function a(e){if(it.length){const[{resolve:t,codecConstructor:i,options:r,webWorker:s,scripts:o}]=it.splice(0,1);t(tt(e,i,r,n,a,s,o))}else e.worker?(at(e),Number.isFinite(n.terminateWorkerTimeout)&&n.terminateWorkerTimeout>=0&&(e.terminateTimeout=setTimeout((()=>{nt=nt.filter((t=>t!=e)),e.terminate()}),n.terminateWorkerTimeout))):nt=nt.filter((t=>t!=e))}}function at(e){e.terminateTimeout&&(clearTimeout(e.terminateTimeout),e.terminateTimeout=null)}const st="Abort error";async function ot(e,t,n,i,r,s,o){const l=a.max(s.chunkSize,64);return async function s(c=0,d=0){const f=o.signal;if(r>c){lt(f,e);const u=await t.readUint8Array(c+i,a.min(l,r-c)),h=u.length;lt(f,e);const _=await e.append(u);if(lt(f,e),d+=await ct(n,_),o.onprogress)try{o.onprogress(c+h,r)}catch(e){}return s(c+l,d)}{const t=await e.flush();return d+=await ct(n,t.data),{signature:t.signature,length:d}}}()}function lt(e,t){if(e&&e.aborted)throw t.abort(),new c(st)}async function ct(e,t){return t.length&&await e.writeUint8Array(t),t.length}const dt="HTTP error ",ft="HTTP Range not supported",ut="text/plain",ht="GET";class _t{constructor(){this.size=0}init(){this.initialized=!0}}class wt extends _t{}class pt extends _t{writeUint8Array(e){this.size+=e.length}}class gt extends wt{constructor(e){super(),this.blob=e,this.size=e.size}async readUint8Array(e,t){if(this.blob.arrayBuffer)return new d(await this.blob.slice(e,e+t).arrayBuffer());{const n=new b;return new w(((i,r)=>{n.onload=e=>i(new d(e.target.result)),n.onerror=()=>r(n.error),n.readAsArrayBuffer(this.blob.slice(e,e+t))}))}}}class bt extends pt{constructor(e){super(),this.contentType=e,this.arrayBuffers=[]}async writeUint8Array(e){super.writeUint8Array(e),this.arrayBuffers.push(e.buffer)}getData(){return this.blob||(this.blob=new _(this.arrayBuffers,{type:this.contentType})),this.blob}}class xt extends wt{constructor(e,t){super(),this.url=e,this.preventHeadRequest=t.preventHeadRequest,this.useRangeHeader=t.useRangeHeader,this.forceRangeRequests=t.forceRangeRequests,this.options=n.assign({},t),delete this.options.preventHeadRequest,delete this.options.useRangeHeader,delete this.options.forceRangeRequests,delete this.options.useXHR}async init(){super.init(),await mt(this,St,Et)}async readUint8Array(e,t){return kt(this,e,t,St,Et)}}class yt extends wt{constructor(e,t){super(),this.url=e,this.preventHeadRequest=t.preventHeadRequest,this.useRangeHeader=t.useRangeHeader,this.forceRangeRequests=t.forceRangeRequests,this.options=t}async init(){super.init(),await mt(this,zt,Dt)}async readUint8Array(e,t){return kt(this,e,t,zt,Dt)}}async function mt(e,t,n){if((e=>{if(void 0!==x){const t=x.createElement("a");return t.href=e,"http:"==t.protocol||"https:"==t.protocol}return/^https?:\/\//i.test(e)})(e.url)&&(e.useRangeHeader||e.forceRangeRequests)){const i=await t(ht,e,vt(e));if(!e.forceRangeRequests&&"bytes"!=i.headers.get("Accept-Ranges"))throw new c(ft);{let r;const a=i.headers.get("Content-Range");if(a){const e=a.trim().split(/\s*\/\s*/);if(e.length){const t=e[1];t&&"*"!=t&&(r=Number(t))}}void 0===r?await Ft(e,t,n):e.size=r}}else await Ft(e,t,n)}async function kt(e,t,n,i,r){if(e.useRangeHeader||e.forceRangeRequests){const r=await i(ht,e,vt(e,t,n));if(206!=r.status)throw new c(ft);return new d(await r.arrayBuffer())}return e.data||await r(e,e.options),new d(e.data.subarray(t,t+n))}function vt(e,t=0,i=1){return n.assign({},Rt(e),{Range:"bytes="+t+"-"+(t+i-1)})}function Rt(e){let t=e.options.headers;if(t)return Symbol.iterator in t?n.fromEntries(t):t}async function Et(e){await At(e,St)}async function Dt(e){await At(e,zt)}async function At(e,t){const n=await t(ht,e,Rt(e));e.data=new d(await n.arrayBuffer()),e.size||(e.size=e.data.length)}async function Ft(e,t,n){if(e.preventHeadRequest)await n(e,e.options);else{const i=(await t("HEAD",e,Rt(e))).headers.get("Content-Length");i?e.size=Number(i):await n(e,e.options)}}async function St(e,{options:t,url:i},r){const a=await fetch(i,n.assign({},t,{method:e,headers:r}));if(400>a.status)return a;throw new c(dt+(a.statusText||a.status))}function zt(e,{url:t},i){return new w(((r,a)=>{const s=new XMLHttpRequest;if(s.addEventListener("load",(()=>{if(400>s.status){const e=[];s.getAllResponseHeaders().trim().split(/[\r\n]+/).forEach((t=>{const n=t.trim().split(/\s*:\s*/);n[0]=n[0].trim().replace(/^[a-z]|-[a-z]/g,(e=>e.toUpperCase())),e.push(n)})),r({status:s.status,arrayBuffer:()=>s.response,headers:new o(e)})}else a(new c(dt+(s.statusText||s.status)))}),!1),s.addEventListener("error",(e=>a(e.detail.error)),!1),s.open(e,t),i)for(const e of n.entries(i))s.setRequestHeader(e[0],e[1]);s.responseType="arraybuffer",s.send()}))}class Tt extends wt{constructor(e,t={}){super(),this.url=e,t.useXHR?this.reader=new yt(e,t):this.reader=new xt(e,t)}set size(e){}get size(){return this.reader.size}async init(){super.init(),await this.reader.init()}async readUint8Array(e,t){return this.reader.readUint8Array(e,t)}}const Ut=4294967295,Ct=65535,Wt=67324752,It=33639248,Bt=101075792,Lt=117853008,Mt=21589,Nt=2048,Ht="/",Ot=new s(2107,11,31),Pt=new s(1980,0,1),Vt="\0☺☻♥♦♣♠•◘○◙♂♀♪♫☼►◄↕‼¶§▬↨↑↓→←∟↔▲▼ !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~⌂ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜ¢£¥₧ƒáíóúñѪº¿⌐¬½¼¡«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ ".split("");async function qt(e,t){if(t&&"cp437"==t.trim().toLowerCase())return(e=>{let t="";for(let n=0;n{t.onload=e=>n(e.target.result),t.onerror=()=>i(t.error),t.readAsText(new _([e]))}))}return new g(t).decode(e)}const Zt=["filename","rawFilename","directory","encrypted","compressedSize","uncompressedSize","lastModDate","rawLastModDate","comment","rawComment","signature","extraField","rawExtraField","bitFlag","extraFieldZip64","extraFieldUnicodePath","extraFieldUnicodeComment","extraFieldAES","filenameUTF8","commentUTF8","offset","zip64","compressionMethod","extraFieldNTFS","lastAccessDate","creationDate","extraFieldExtendedTimestamp","version","versionMadeBy","msDosCompatible","internalFileAttribute","externalFileAttribute"];class Kt{constructor(e){Zt.forEach((t=>this[t]=e[t]))}}const Gt="File format is not recognized",Yt="End of central directory not found",jt="End of Zip64 central directory not found",Xt="End of Zip64 central directory locator not found",Jt="Central directory header not found",Qt="Local file header not found",$t="Zip64 extra field not found",en="File contains encrypted entry",tn="Encryption method not supported",nn="Compression method not supported",rn="utf-8",an="cp437",sn=["uncompressedSize","compressedSize","offset"];class on{constructor(e,t,i){n.assign(this,{reader:e,config:t,options:i})}async getData(e,t,n={}){const i=this,{reader:r,offset:a,extraFieldAES:s,compressionMethod:o,config:l,bitFlag:d,signature:f,rawLastModDate:u,compressedSize:h}=i,_=i.localDirectory={};r.initialized||await r.init();let w=await xn(r,a,30);const p=bn(w);let g=fn(i,n,"password");if(g=g&&g.length&&g,s&&99!=s.originalCompressionMethod)throw new c(nn);if(0!=o&&8!=o)throw new c(nn);if(pn(p,0)!=Wt)throw new c(Qt);ln(_,p,4),w=await xn(r,a,30+_.filenameLength+_.extraFieldLength),_.rawExtraField=w.subarray(30+_.filenameLength),await cn(i,_,p,4),t.lastAccessDate=_.lastAccessDate,t.creationDate=_.creationDate;const b=i.encrypted&&_.encrypted,x=b&&!s;if(b){if(!x&&void 0===s.strength)throw new c(tn);if(!g)throw new c(en)}const y=await rt(l.Inflate,{codecType:Ge,password:g,zipCrypto:x,encryptionStrength:s&&s.strength,signed:fn(i,n,"checkSignature"),passwordVerification:x&&(d.dataDescriptor?u>>>8&255:f>>>24&255),signature:f,compressed:0!=o,encrypted:b,useWebWorkers:fn(i,n,"useWebWorkers")},l);e.initialized||await e.init();const m=fn(i,n,"signal"),k=a+30+_.filenameLength+_.extraFieldLength;return await ot(y,r,e,k,h,l,{onprogress:n.onprogress,signal:m}),e.getData()}}function ln(e,t,i){const r=e.rawBitFlag=wn(t,i+2),a=1==(1&r),s=pn(t,i+6);n.assign(e,{encrypted:a,version:wn(t,i),bitFlag:{level:(6&r)>>1,dataDescriptor:8==(8&r),languageEncodingFlag:(r&Nt)==Nt},rawLastModDate:s,lastModDate:un(s),filenameLength:wn(t,i+22),extraFieldLength:wn(t,i+24)})}async function cn(e,t,i,r){const l=t.rawExtraField,f=t.extraField=new o,u=bn(new d(l));let h=0;try{for(;h{t.zip64=!0;const n=bn(e.data);e.values=[];for(let t=0;tt[e]==Ut));for(let t=0;t{if(t[n]==Ut){if(void 0===e[n])throw new c($t);t[n]=e[n]}}))})(w,t),t.extraFieldZip64=w);const p=f.get(28789);p&&(await dn(p,"filename","rawFilename",t,e),t.extraFieldUnicodePath=p);const g=f.get(25461);g&&(await dn(g,"comment","rawComment",t,e),t.extraFieldUnicodeComment=g);const b=f.get(39169);b?(((e,t,n)=>{const i=bn(e.data);e.vendorVersion=_n(i,0),e.vendorId=_n(i,2);const r=_n(i,4);e.strength=r,e.originalCompressionMethod=n,t.compressionMethod=e.compressionMethod=wn(i,5)})(b,t,_),t.extraFieldAES=b):t.compressionMethod=_;const x=f.get(10);x&&(((e,t)=>{const i=bn(e.data);let r,a=4;try{for(;a{const n=bn(e.data),i=_n(n,0),r=[],a=[];1==(1&i)&&(r.push("lastModDate"),a.push("rawLastModDate")),2==(2&i)&&(r.push("lastAccessDate"),a.push("rawLastAccessDate")),4==(4&i)&&(r.push("creationDate"),a.push("rawCreationDate"));let o=1;r.forEach(((i,r)=>{if(e.data.length>=o+4){const l=pn(n,o);t[i]=e[i]=new s(1e3*l);const c=a[r];e[c]=l}o+=4}))})(y,t),t.extraFieldExtendedTimestamp=y)}async function dn(e,t,n,i,r){const a=bn(e.data);e.version=_n(a,0),e.signature=pn(a,1);const s=new le;s.append(r[n]);const o=bn(new d(4));o.setUint32(0,s.get(),!0),e[t]=await qt(e.data.subarray(5)),e.valid=!r.bitFlag.languageEncodingFlag&&e.signature==pn(o,0),e.valid&&(i[t]=e[t],i[t+"UTF8"]=!0)}function fn(e,t,n){return void 0===t[n]?e.options[n]:t[n]}function un(e){const t=(4294901760&e)>>16,n=65535&e;try{return new s(1980+((65024&t)>>9),((480&t)>>5)-1,31&t,(63488&n)>>11,(2016&n)>>5,2*(31&n),0)}catch(e){}}function hn(e){return new s(Number(e/r(1e4)-r(116444736e5)))}function _n(e,t){return e.getUint8(t)}function wn(e,t){return e.getUint16(t,!0)}function pn(e,t){return e.getUint32(t,!0)}function gn(e,t){return Number(e.getBigUint64(t,!0))}function bn(e){return new h(e.buffer)}function xn(e,t,n){return e.readUint8Array(t,n)}const yn="File already exists",mn="Zip file comment exceeds 64KB",kn="File entry comment exceeds 64KB",vn="File entry name exceeds 64KB",Rn="Version exceeds 65535",En="The strength must equal 1, 2, or 3",Dn="Extra field type exceeds 65535",An="Extra field data exceeds 64KB",Fn="Zip64 is not supported",Sn=new d([7,0,2,0,65,69,3,0,0]);let zn=0;function Tn(e,t,n){if(e.arrayBuffer)return t||n?e.slice(t,n).arrayBuffer():e.arrayBuffer();{const i=new b;return new w(((r,a)=>{i.onload=e=>r(e.target.result),i.onerror=()=>a(i.error),i.readAsArrayBuffer(t||n?e.slice(t,n):e)}))}}function Un(e){if(e)return(r(e.getTime())+r(116444736e5))*r(1e4)}function Cn(e,t,n){return void 0===t[n]?e.options[n]:t[n]}function Wn(e,t,n){e.setUint8(t,n)}function In(e,t,n){e.setUint16(t,n,!0)}function Bn(e,t,n){e.setUint32(t,n,!0)}function Ln(e,t,n){e.setBigUint64(t,n,!0)}function Mn(e,t,n){e.set(t,n)}function Nn(e){return new h(e.buffer)}se({Deflate:function(e){const t=new M,n=(i=e&&e.chunkSize?e.chunkSize:65536)+5*(a.floor(i/16383)+1);var i;const r=new d(n);let s=e?e.level:-1;void 0===s&&(s=-1),t.deflateInit(s),t.next_out=r,this.append=(e,i)=>{let a,s,o=0,l=0,f=0;const u=[];if(e.length){t.next_in_index=0,t.next_in=e,t.avail_in=e.length;do{if(t.next_out_index=0,t.avail_out=n,a=t.deflate(0),0!=a)throw new c("deflating: "+t.msg);t.next_out_index&&(t.next_out_index==n?u.push(new d(r)):u.push(r.slice(0,t.next_out_index))),f+=t.next_out_index,i&&t.next_in_index>0&&t.next_in_index!=o&&(i(t.next_in_index),o=t.next_in_index)}while(t.avail_in>0||0===t.avail_out);return u.length>1?(s=new d(f),u.forEach((e=>{s.set(e,l),l+=e.length}))):s=u[0]||new d(0),s}},this.flush=()=>{let e,i,a=0,s=0;const o=[];do{if(t.next_out_index=0,t.avail_out=n,e=t.deflate(4),1!=e&&0!=e)throw new c("deflating: "+t.msg);n-t.avail_out>0&&o.push(r.slice(0,t.next_out_index)),s+=t.next_out_index}while(t.avail_in>0||0===t.avail_out);return t.deflateEnd(),i=new d(s),o.forEach((e=>{i.set(e,a),a+=e.length})),i}},Inflate:function(e){const t=new ne,n=e&&e.chunkSize?a.floor(2*e.chunkSize):131072,i=new d(n);let r=!1;t.inflateInit(),t.next_out=i,this.append=(e,a)=>{const s=[];let o,l,f=0,u=0,h=0;if(0!==e.length){t.next_in_index=0,t.next_in=e,t.avail_in=e.length;do{if(t.next_out_index=0,t.avail_out=n,0!==t.avail_in||r||(t.next_in_index=0,r=!0),o=t.inflate(0),r&&o===O){if(0!==t.avail_in)throw new c("inflating: bad input")}else if(0!==o&&1!==o)throw new c("inflating: "+t.msg);if((r||1===o)&&t.avail_in===e.length)throw new c("inflating: bad input");t.next_out_index&&(t.next_out_index===n?s.push(new d(i)):s.push(i.slice(0,t.next_out_index))),h+=t.next_out_index,a&&t.next_in_index>0&&t.next_in_index!=f&&(a(t.next_in_index),f=t.next_in_index)}while(t.avail_in>0||0===t.avail_out);return s.length>1?(l=new d(h),s.forEach((e=>{l.set(e,u),u+=e.length}))):l=s[0]||new d(0),l}},this.flush=()=>{t.inflateEnd()}}}),e.BlobReader=gt,e.BlobWriter=bt,e.Data64URIReader=class extends wt{constructor(e){super(),this.dataURI=e;let t=e.length;for(;"="==e.charAt(t-1);)t--;this.dataStart=e.indexOf(",")+1,this.size=a.floor(.75*(t-this.dataStart))}async readUint8Array(e,t){const n=new d(t),i=4*a.floor(e/3),r=atob(this.dataURI.substring(i+this.dataStart,4*a.ceil((e+t)/3)+this.dataStart)),s=e-3*a.floor(i/4);for(let e=s;s+t>e;e++)n[e-s]=r.charCodeAt(e);return n}},e.Data64URIWriter=class extends pt{constructor(e){super(),this.data="data:"+(e||"")+";base64,",this.pending=[]}async writeUint8Array(e){super.writeUint8Array(e);let t=0,n=this.pending;const r=this.pending.length;for(this.pending="",t=0;t<3*a.floor((r+e.length)/3)-r;t++)n+=i.fromCharCode(e[t]);for(;t2?this.data+=m(n):this.pending=n}getData(){return this.data+m(this.pending)}},e.ERR_ABORT=st,e.ERR_BAD_FORMAT=Gt,e.ERR_CENTRAL_DIRECTORY_NOT_FOUND=Jt,e.ERR_DUPLICATED_NAME=yn,e.ERR_ENCRYPTED=en,e.ERR_EOCDR_LOCATOR_ZIP64_NOT_FOUND=Xt,e.ERR_EOCDR_NOT_FOUND=Yt,e.ERR_EOCDR_ZIP64_NOT_FOUND=jt,e.ERR_EXTRAFIELD_ZIP64_NOT_FOUND=$t,e.ERR_HTTP_RANGE=ft,e.ERR_INVALID_COMMENT=mn,e.ERR_INVALID_ENCRYPTION_STRENGTH=En,e.ERR_INVALID_ENTRY_COMMENT=kn,e.ERR_INVALID_ENTRY_NAME=vn,e.ERR_INVALID_EXTRAFIELD_DATA=An,e.ERR_INVALID_EXTRAFIELD_TYPE=Dn,e.ERR_INVALID_PASSWORD=we,e.ERR_INVALID_SIGNATURE=Ye,e.ERR_INVALID_VERSION=Rn,e.ERR_LOCAL_FILE_HEADER_NOT_FOUND=Qt,e.ERR_UNSUPPORTED_COMPRESSION=nn,e.ERR_UNSUPPORTED_ENCRYPTION=tn,e.ERR_UNSUPPORTED_FORMAT=Fn,e.HttpRangeReader=class extends Tt{constructor(e,t={}){t.useRangeHeader=!0,super(e,t)}},e.HttpReader=Tt,e.Reader=wt,e.TextReader=class extends wt{constructor(e){super(),this.blobReader=new gt(new _([e],{type:ut}))}async init(){super.init(),this.blobReader.init(),this.size=this.blobReader.size}async readUint8Array(e,t){return this.blobReader.readUint8Array(e,t)}},e.TextWriter=class extends pt{constructor(e){super(),this.encoding=e,this.blob=new _([],{type:ut})}async writeUint8Array(e){super.writeUint8Array(e),this.blob=new _([this.blob,e.buffer],{type:ut})}getData(){if(this.blob.text)return this.blob.text();{const e=new b;return new w(((t,n)=>{e.onload=e=>t(e.target.result),e.onerror=()=>n(e.error),e.readAsText(this.blob,this.encoding)}))}}},e.Uint8ArrayReader=class extends wt{constructor(e){super(),this.array=e,this.size=e.length}async readUint8Array(e,t){return this.array.slice(e,e+t)}},e.Uint8ArrayWriter=class extends pt{constructor(){super(),this.array=new d(0)}async writeUint8Array(e){super.writeUint8Array(e);const t=this.array;this.array=new d(t.length+e.length),this.array.set(t),this.array.set(e,t.length)}getData(){return this.array}},e.WritableStreamWriter=class extends pt{constructor(e){super(),this.writableStream=e,this.writer=e.getWriter()}async writeUint8Array(e){return await this.writer.ready,this.writer.write(e)}async getData(){return await this.writer.ready,await this.writer.close(),this.writableStream}},e.Writer=pt,e.ZipReader=class{constructor(e,t={}){n.assign(this,{reader:e,options:t,config:ae()})}async getEntries(e={}){const t=this,i=t.reader;if(i.initialized||await i.init(),22>i.size)throw new c(Gt);const r=await(async(e,t,n)=>{const i=new d(4);return bn(i).setUint32(0,101010256,!0),await r(22)||await r(a.min(1048582,n));async function r(t){const r=n-t,a=await xn(e,r,t);for(let e=a.length-22;e>=0;e--)if(a[e]==i[0]&&a[e+1]==i[1]&&a[e+2]==i[2]&&a[e+3]==i[3])return{offset:r+e,buffer:a.slice(e,e+22).buffer}}})(i,0,i.size);if(!r)throw new c(Yt);const s=bn(r);let o=pn(s,12),l=pn(s,16),f=wn(s,8),u=0;if(l==Ut||o==Ut||f==Ct){const e=bn(await xn(i,r.offset-20,20));if(pn(e,0)!=Lt)throw new c(jt);l=gn(e,8);let t=await xn(i,l,56),n=bn(t);const a=r.offset-20-56;if(pn(n,0)!=Bt&&l!=a){const e=l;l=a,u=l-e,t=await xn(i,l,56),n=bn(t)}if(pn(n,0)!=Bt)throw new c(Xt);f=gn(n,32),o=gn(n,40),l-=o}if(0>l||l>=i.size)throw new c(Gt);let h=0,_=await xn(i,l,o),p=bn(_);if(o){const e=r.offset-o;if(pn(p,h)!=It&&l!=e){const t=l;l=e,u=l-t,_=await xn(i,l,o),p=bn(_)}}if(0>l||l>=i.size)throw new c(Gt);const g=[];for(let r=0;f>r;r++){const a=new on(i,t.config,t.options);if(pn(p,h)!=It)throw new c(Jt);ln(a,p,h+6);const s=!!a.bitFlag.languageEncodingFlag,o=h+46,l=o+a.filenameLength,d=l+a.extraFieldLength,b=wn(p,h+4),x=0==(0&b);n.assign(a,{versionMadeBy:b,msDosCompatible:x,compressedSize:0,uncompressedSize:0,commentLength:wn(p,h+32),directory:x&&16==(16&_n(p,h+38)),offset:pn(p,h+42)+u,internalFileAttribute:pn(p,h+34),externalFileAttribute:pn(p,h+38),rawFilename:_.subarray(o,l),filenameUTF8:s,commentUTF8:s,rawExtraField:_.subarray(l,d)});const y=d+a.commentLength;a.rawComment=_.subarray(d,y);const m=fn(t,e,"filenameEncoding"),k=fn(t,e,"commentEncoding"),[v,R]=await w.all([qt(a.rawFilename,a.filenameUTF8?rn:m||an),qt(a.rawComment,a.commentUTF8?rn:k||an)]);a.filename=v,a.comment=R,!a.directory&&a.filename.endsWith(Ht)&&(a.directory=!0),await cn(a,a,p,h+6);const E=new Kt(a);if(E.getData=(e,t)=>a.getData(e,E,t),g.push(E),h=y,e.onprogress)try{e.onprogress(r+1,f,new Kt(a))}catch(e){}}return g}async close(){}},e.ZipWriter=class{constructor(e,t={}){n.assign(this,{writer:e,options:t,config:ae(),files:new o,offset:e.size,pendingCompressedSize:0,pendingEntries:[]})}async add(e="",i,o={}){const l=this;if(zn>=l.config.maxWorkers)return new w(((t,n)=>l.pendingEntries.push({name:e,reader:i,options:o,resolve:t,reject:n})));zn++;try{return await(async(e,i,o,l)=>{if(i=i.trim(),l.directory&&!i.endsWith(Ht)?i+=Ht:l.directory=i.endsWith(Ht),e.files.has(i))throw new c(yn);const _=ce(i);if(_.length>Ct)throw new c(vn);const p=l.comment||"",g=ce(p);if(g.length>Ct)throw new c(kn);const b=e.options.version||l.version||0;if(b>Ct)throw new c(Rn);const x=e.options.versionMadeBy||l.versionMadeBy||20;if(x>Ct)throw new c(Rn);const y=Cn(e,l,"lastModDate")||new s,m=Cn(e,l,"lastAccessDate"),k=Cn(e,l,"creationDate"),v=Cn(e,l,"password"),R=Cn(e,l,"encryptionStrength")||3,E=Cn(e,l,"zipCrypto");if(void 0!==v&&void 0!==R&&(1>R||R>3))throw new c(En);let D=new d(0);const A=l.extraField;if(A){let e=0,t=0;A.forEach((t=>e+=4+t.length)),D=new d(e),A.forEach(((e,n)=>{if(n>Ct)throw new c(Dn);if(e.length>Ct)throw new c(An);Mn(D,new f([n]),t),Mn(D,new f([e.length]),t+2),Mn(D,e,t+4),t+=4+e.length}))}let F=Cn(e,l,"extendedTimestamp");void 0===F&&(F=!0);let S=0,z=Cn(e,l,"keepOrder");void 0===z&&(z=!0);let T=0,U=Cn(e,l,"msDosCompatible");void 0===U&&(U=!0);const C=Cn(e,l,"internalFileAttribute")||0,W=Cn(e,l,"externalFileAttribute")||0;o&&(o.initialized||await o.init(),T=o.size,S=(e=>e+5*(a.floor(e/16383)+1))(T));let I=l.zip64||e.options.zip64||!1;if(e.offset+e.pendingCompressedSize>=Ut||T>=Ut||S>=Ut){if(!1===l.zip64||!1===e.options.zip64||!z)throw new c(Fn);I=!0}e.pendingCompressedSize+=S,await w.resolve();const B=Cn(e,l,"level"),L=Cn(e,l,"useWebWorkers"),M=Cn(e,l,"bufferedWrite");let N=Cn(e,l,"dataDescriptor"),H=Cn(e,l,"dataDescriptorSignature");const O=Cn(e,l,"signal");void 0===N&&(N=!0),N&&void 0===H&&(H=!0);const P=await(async(e,i,s,o)=>{const l=e.files,f=e.writer,_=t.from(l.values()).pop();let p,g,b,x={};l.set(i,x);try{let y,m,k;if(o.keepOrder&&(y=_&&_.lock),x.lock=k=new w((e=>b=e)),o.bufferedWrite||e.lockWrite||!o.dataDescriptor?(m=new bt,m.init(),p=!0):(e.lockWrite=new w((e=>g=e)),f.initialized||await f.init(),m=f),x=await(async(e,t,i,s)=>{const{rawFilename:o,lastAccessDate:l,creationDate:c,password:f,level:h,zip64:_,zipCrypto:w,dataDescriptor:p,dataDescriptorSignature:g,directory:b,version:x,versionMadeBy:y,rawComment:m,rawExtraField:k,useWebWorkers:v,onprogress:R,signal:E,encryptionStrength:D,extendedTimestamp:A,msDosCompatible:F,internalFileAttribute:S,externalFileAttribute:z}=s,T=!(!f||!f.length),U=0!==h&&!b;let C,W,I;if(T&&!w){C=new d(Sn.length+2);const e=Nn(C);In(e,0,39169),Mn(C,Sn,2),Wn(e,8,D)}else C=new d(0);if(A){I=new d(9+(l?4:0)+(c?4:0));const e=Nn(I);In(e,0,Mt),In(e,2,I.length-4),Wn(e,4,1+(l?2:0)+(c?4:0)),Bn(e,5,a.floor(s.lastModDate.getTime()/1e3)),l&&Bn(e,9,a.floor(l.getTime()/1e3)),c&&Bn(e,13,a.floor(c.getTime()/1e3));try{W=new d(36);const e=Nn(W),t=Un(s.lastModDate);In(e,0,10),In(e,2,32),In(e,8,1),In(e,10,24),Ln(e,12,t),Ln(e,20,Un(l)||t),Ln(e,28,Un(c)||t)}catch(e){W=new d(0)}}else W=I=new d(0);const B={version:x||20,versionMadeBy:y,zip64:_,directory:!!b,filenameUTF8:!0,rawFilename:o,commentUTF8:!0,rawComment:m,rawExtraFieldZip64:new d(_?28:0),rawExtraFieldExtendedTimestamp:I,rawExtraFieldNTFS:W,rawExtraFieldAES:C,rawExtraField:k,extendedTimestamp:A,msDosCompatible:F,internalFileAttribute:S,externalFileAttribute:z};let L=B.uncompressedSize=0,M=Nt;p&&(M|=8);let N=0;U&&(N=8),_&&(B.version=B.version>45?B.version:45),T&&(M|=1,w||(B.version=B.version>51?B.version:51,N=99,U&&(B.rawExtraFieldAES[9]=8))),B.compressionMethod=N;const H=B.headerArray=new d(26),O=Nn(H);In(O,0,B.version),In(O,2,M),In(O,4,N);const P=new u(1),V=Nn(P);let q;q=s.lastModDateOt?Ot:s.lastModDate,In(V,0,(q.getHours()<<6|q.getMinutes())<<5|q.getSeconds()/2),In(V,2,(q.getFullYear()-1980<<4|q.getMonth()+1)<<5|q.getDate());const Z=P[0];Bn(O,6,Z),In(O,22,o.length);const K=C.length+I.length+W.length+B.rawExtraField.length;In(O,24,K);const G=new d(30+o.length+K);let Y;Bn(Nn(G),0,Wt),Mn(G,H,4),Mn(G,o,30),Mn(G,C,30+o.length),Mn(G,I,30+o.length+C.length),Mn(G,W,30+o.length+C.length+I.length),Mn(G,B.rawExtraField,30+o.length+C.length+I.length+W.length);let j=0;if(e){L=B.uncompressedSize=e.size;const n=await rt(i.Deflate,{codecType:Ke,level:h,password:f,encryptionStrength:D,zipCrypto:T&&w,passwordVerification:T&&w&&Z>>8&255,signed:!0,compressed:U,encrypted:T,useWebWorkers:v},i);await t.writeUint8Array(G),B.dataWritten=!0,Y=await ot(n,e,t,0,L,i,{onprogress:R,signal:E}),j=Y.length}else await t.writeUint8Array(G),B.dataWritten=!0;let X,J=new d(0),Q=0;if(p&&(J=new d(_?g?24:20:g?16:12),X=Nn(J),g&&(Q=4,Bn(X,0,134695760))),e){const e=Y.signature;if(T&&!w||void 0===e||(Bn(O,10,e),B.signature=e,p&&Bn(X,Q,e)),_){const e=Nn(B.rawExtraFieldZip64);In(e,0,1),In(e,2,24),Bn(O,14,Ut),Ln(e,12,r(j)),Bn(O,18,Ut),Ln(e,4,r(L)),p&&(Ln(X,Q+4,r(j)),Ln(X,Q+12,r(L)))}else Bn(O,14,j),Bn(O,18,L),p&&(Bn(X,Q+4,j),Bn(X,Q+8,L))}p&&await t.writeUint8Array(J);const $=G.length+j+J.length;return n.assign(B,{compressedSize:j,lastModDate:q,rawLastModDate:Z,creationDate:c,lastAccessDate:l,encrypted:T,length:$}),B})(s,m,e.config,o),x.lock=k,l.set(i,x),x.filename=i,p){let n=0;const i=m.getData();let r;await w.all([e.lockWrite,y]);do{r=t.from(l.values()).find((e=>e.writingBufferedData)),r&&await r.lock}while(r&&r.lock);if(x.writingBufferedData=!0,!o.dataDescriptor){const e=26,t=await Tn(i,0,e),r=new h(t);x.encrypted&&!o.zipCrypto||Bn(r,14,x.signature),x.zip64?(Bn(r,18,Ut),Bn(r,22,Ut)):(Bn(r,18,x.compressedSize),Bn(r,22,x.uncompressedSize)),await f.writeUint8Array(new d(t)),n=e}await(async(e,t,n=0)=>{const i=536870912;await async function r(){if(n=Ut)throw new c(Fn);return e.offset+=x.length,x}catch(t){throw(p&&x.writingBufferedData||!p&&x.dataWritten)&&(t.corruptedEntry=e.hasCorruptedEntries=!0,x.uncompressedSize&&(e.offset+=x.uncompressedSize)),l.delete(i),t}finally{b(),g&&g()}})(e,i,o,n.assign({},l,{rawFilename:_,rawComment:g,version:b,versionMadeBy:x,lastModDate:y,lastAccessDate:m,creationDate:k,rawExtraField:D,zip64:I,password:v,level:B,useWebWorkers:L,encryptionStrength:R,extendedTimestamp:F,zipCrypto:E,bufferedWrite:M,keepOrder:z,dataDescriptor:N,dataDescriptorSignature:H,signal:O,msDosCompatible:U,internalFileAttribute:C,externalFileAttribute:W}));return S&&(e.pendingCompressedSize-=S),n.assign(P,{name:i,comment:p,extraField:A}),new Kt(P)})(l,e,i,o)}finally{zn--;const e=l.pendingEntries.shift();e&&l.add(e.name,e.reader,e.options).then(e.resolve).catch(e.reject)}}async close(e=new d(0),n={}){return await(async(e,n,i)=>{const s=e.writer,o=e.files;let l=0,f=0,u=e.offset,h=o.size;for(const[,e]of o)f+=46+e.rawFilename.length+e.rawComment.length+e.rawExtraFieldZip64.length+e.rawExtraFieldAES.length+e.rawExtraFieldExtendedTimestamp.length+e.rawExtraFieldNTFS.length+e.rawExtraField.length;let _=i.zip64||e.options.zip64||!1;if(u>=Ut||f>=Ut||h>=Ct){if(!1===i.zip64||!1===e.options.zip64)throw new c(Fn);_=!0}const w=new d(f+(_?98:22)),p=Nn(w);if(n&&n.length){if(n.length>Ct)throw new c(mn);In(p,l+20,n.length)}for(const[e,n]of t.from(o.values()).entries()){const{rawFilename:t,rawExtraFieldZip64:r,rawExtraFieldAES:s,rawExtraField:c,rawComment:f,versionMadeBy:u,headerArray:h,directory:_,zip64:g,msDosCompatible:b,internalFileAttribute:x,externalFileAttribute:y}=n;let m,k;if(n.extendedTimestamp){k=n.rawExtraFieldNTFS,m=new d(9);const e=Nn(m);In(e,0,Mt),In(e,2,m.length-4),Wn(e,4,1),Bn(e,5,a.floor(n.lastModDate.getTime()/1e3))}else k=m=new d(0);const v=r.length+s.length+m.length+k.length+c.length;if(Bn(p,l,It),In(p,l+4,u),Mn(w,h,l+6),In(p,l+30,v),In(p,l+32,f.length),Bn(p,l+34,x),y?Bn(p,l+38,y):_&&b&&Wn(p,l+38,16),Bn(p,l+42,g?Ut:n.offset),Mn(w,t,l+46),Mn(w,r,l+46+t.length),Mn(w,s,l+46+t.length+r.length),Mn(w,m,l+46+t.length+r.length+s.length),Mn(w,k,l+46+t.length+r.length+s.length+m.length),Mn(w,c,l+46+t.length+r.length+s.length+m.length+k.length),Mn(w,f,l+46+t.length+v),l+=46+t.length+v+f.length,i.onprogress)try{i.onprogress(e+1,o.size,new Kt(n))}catch(e){}}_&&(Bn(p,l,Bt),Ln(p,l+4,r(44)),In(p,l+12,45),In(p,l+14,45),Ln(p,l+24,r(h)),Ln(p,l+32,r(h)),Ln(p,l+40,r(f)),Ln(p,l+48,r(u)),Bn(p,l+56,Lt),Ln(p,l+64,r(u)+r(f)),Bn(p,l+72,1),h=Ct,u=Ut,f=Ut,l+=76),Bn(p,l,101010256),In(p,l+8,h),In(p,l+10,h),Bn(p,l+12,f),Bn(p,l+16,u),await s.writeUint8Array(w),n&&n.length&&await s.writeUint8Array(n)})(this,e,n),this.writer.getData()}},e.configure=se,e.getMimeType=()=>"application/octet-stream",e.terminateWorkers=()=>{nt.forEach((e=>{at(e),e.terminate()}))},n.defineProperty(e,"__esModule",{value:!0})})); diff --git a/view.js b/view.js new file mode 100644 index 0000000..b6e6fdd --- /dev/null +++ b/view.js @@ -0,0 +1,267 @@ +import * as CFI from './epubcfi.js' +import { TOCProgress, SectionProgress } from './progress.js' + +const textWalker = function* (doc, func) { + const filter = NodeFilter.SHOW_ELEMENT | NodeFilter.SHOW_TEXT + | NodeFilter.SHOW_CDATA_SECTION + const { FILTER_ACCEPT, FILTER_REJECT, FILTER_SKIP } = NodeFilter + const acceptNode = node => { + const name = node.localName?.toLowerCase() + if (name === 'script' || name === 'style') return FILTER_REJECT + if (node.nodeType === 1) return FILTER_SKIP + return FILTER_ACCEPT + } + const walker = doc.createTreeWalker(doc.body, filter, { acceptNode }) + const nodes = [] + for (let node = walker.nextNode(); node; node = walker.nextNode()) + nodes.push(node) + const strs = nodes.map(node => node.nodeValue) + const makeRange = (startIndex, startOffset, endIndex, endOffset) => { + const range = doc.createRange() + range.setStart(nodes[startIndex], startOffset) + range.setEnd(nodes[endIndex], endOffset) + return range + } + for (const match of func(strs, makeRange)) yield match +} + +const frameRect = (frame, rect) => { + const left = rect.left + frame.left + const right = rect.right + frame.left + const top = rect.top + frame.top + const bottom = rect.bottom + frame.top + return { left, right, top, bottom } +} + +const pointIsInView = ({ x, y }) => + x > 0 && y > 0 && x < window.innerWidth && y < window.innerHeight + +export const getPosition = target => { + // TODO: vertical text + const frameElement = (target.getRootNode?.() ?? target?.endContainer?.getRootNode?.()) + ?.defaultView?.frameElement + const frame = frameElement?.getBoundingClientRect() ?? { top: 0, left: 0 } + const rects = Array.from(target.getClientRects()) + const first = frameRect(frame, rects[0]) + const last = frameRect(frame, rects.at(-1)) + const start = { + point: { x: (first.left + first.right) / 2, y: first.top }, + dir: 'up', + } + const end = { + point: { x: (last.left + last.right) / 2, y: last.bottom }, + dir: 'down', + } + const startInView = pointIsInView(start.point) + const endInView = pointIsInView(end.point) + if (!startInView && !endInView) return { point: { x: 0, y: 0 } } + if (!startInView) return end + if (!endInView) return start + return start.point.y > window.innerHeight - end.point.y ? start : end +} + +// https://www.w3.org/TR/epub-ssv-11/ +const SSV = Object.fromEntries(Array.from(Object.entries({ + isRef: ['annoref', 'biblioref', 'glossref', 'noteref'], + isLink: ['backlink'], + isNote: ['annotation', 'note', 'footnote', 'endnote', 'rearnote'], +}), ([k, v]) => [k, el => + el.getAttributeNS('http://www.idpf.org/2007/ops', 'type') + ?.split(/s/)?.some(t => v.includes(t))])) + +export class View { + #sectionProgress + #tocProgress + #pageProgress + language = 'en' + textDirection = '' + isCJK = false + isFixedLayout = false + #css + constructor(book, emit) { + this.book = book + this.emit = emit + + if (book.metadata?.language) try { + const language = book.metadata.language + book.metadata.language = Intl.getCanonicalLocales(language)[0] + const tag = typeof language === 'string' ? language : language[0] + const locale = new Intl.Locale(tag) + this.isCJK = ['zh', 'ja', 'kr'].includes(locale.language) + this.textDirection = locale.textInfo.direction + } catch(e) { + console.warn(e) + } + + if (book.splitTOCHref && book.getTOCFragment) { + const ids = book.sections.map(s => s.id) + this.#sectionProgress = new SectionProgress(book.sections, 150, 1600) + const splitHref = book.splitTOCHref.bind(book) + const getFragment = book.getTOCFragment.bind(book) + this.#tocProgress = new TOCProgress({ + toc: book.toc ?? [], ids, splitHref, getFragment }) + this.#pageProgress = new TOCProgress({ + toc: book.pageList ?? [], ids, splitHref, getFragment }) + } + } + async display() { + const opts = { + book: this.book, + onLoad: this.#onLoad.bind(this), + onRelocated: this.#onRelocated.bind(this), + } + this.isFixedLayout = this.book.rendition?.layout === 'pre-paginated' + if (this.isFixedLayout) { + const { FixedLayout } = await import('./fixed-layout.js') + this.renderer = new FixedLayout(opts) + } else { + const { Paginator } = await import('./paginator.js') + this.renderer = new Paginator(opts) + } + return this.renderer.element + } + #onRelocated(range, index, fraction) { + if (!this.#sectionProgress) return + const progress = this.#sectionProgress.getProgress(index, fraction) + const tocItem = this.#tocProgress.getProgress(index, range) + const pageItem = this.#pageProgress.getProgress(index, range) + const cfi = this.getCFI(index, range) + this.emit?.({ type: 'relocated', ...progress, tocItem, pageItem, cfi }) + } + #onLoad(doc, index) { + const { book } = this + + // set language and dir if not already set + doc.documentElement.lang ||= this.language + doc.documentElement.dir ||= this.isCJK ? '' : this.textDirection + + this.renderer.setStyle(this.#css) + + // set `document` background to `doc` background + // this is needed cause the iframe does not fill the whole viewport + const bodyStyle = doc.defaultView.getComputedStyle(doc.body) + document.body.style.background = + bodyStyle.backgroundColor === 'rgba(0, 0, 0, 0)' + && bodyStyle.backgroundImage === 'none' + ? doc.defaultView.getComputedStyle(doc.documentElement).background + : bodyStyle.background + + // set handlers for links + const section = book.sections[index] + for (const a of doc.querySelectorAll('a[href]')) + a.addEventListener('click', e => { + e.preventDefault() + const href = a.getAttribute('href') + const uri = section?.resolveHref?.(href) ?? href + if (book?.isExternal?.(uri)) + this.emit?.({ type: 'external-link', uri }) + else if (SSV.isRef(a)) { + const { index, anchor } = book.resolveHref(uri) + const pos = getPosition(a) + Promise.resolve(book.sections[index].createDocument()) + .then(doc => [anchor(doc), doc.contentType]) + .then(([el, type]) => + [el?.innerHTML, type, SSV.isNote(el)]) + .then(([content, contentType, isNote]) => content + ? this.emit?.({ + type: 'reference', + href: isNote ? null : uri, + content, contentType, pos, + }) : null) + .catch(e => console.error(e)) + return + } else this.goTo(uri) + }) + } + getCFI(index, range) { + if (!range) return '' + const baseCFI = this.book.sections[index].cfi ?? CFI.fake.fromIndex(index) + return CFI.joinIndir(baseCFI, CFI.fromRange(range)) + } + resolveCFI(cfi) { + if (this.book.resolveCFI) + return this.book.resolveCFI(cfi) + else { + const parts = CFI.parse(cfi) + const index = CFI.fake.toIndex((parts.parent ?? parts).shift()) + const anchor = doc => CFI.toRange(doc, parts) + return { index, anchor } + } + } + resolveNavigation(target) { + try { + if (typeof target === 'number') return { index: target } + if (CFI.isCFI.test(target)) return this.resolveCFI(target) + return this.book.resolveHref(target) + } catch (e) { + console.error(e) + console.error(`Could not resolve target ${target}`) + } + } + async goTo(target) { + const resolved = this.resolveNavigation(target) + try { + await this.renderer.goTo(resolved) + return resolved + } catch(e) { + console.error(e) + console.error(`Could not go to ${target}`) + } + } + async goToFraction(frac) { + const [index, anchor] = this.#sectionProgress.getSection(frac) + return this.renderer.goTo({ index, anchor }) + } + async select(target) { + try { + const obj = await this.resolveNavigation(target) + await this.renderer.goTo({ ...obj, select: true }) + } catch(e) { + console.error(e) + console.error(`Could not go to ${target}`) + } + } + goLeft() { + return this.book.dir === 'rtl' ? this.renderer.next() : this.renderer.prev() + } + goRight() { + return this.book.dir === 'rtl' ? this.renderer.prev() : this.renderer.next() + } + setAppearance({ layout, css }) { + if (this.isFixedLayout) return + Object.assign(this.renderer.layout, layout) + this.#css = css + this.renderer.setStyle(css) + this.renderer.render() + } + async * #searchSection(matcher, query, index) { + const doc = await this.book.sections[index].createDocument() + for (const { range, excerpt } of matcher(doc, query)) + yield { cfi: this.getCFI(index, range), excerpt } + } + async * #searchBook(matcher, query) { + const { sections } = this.book + for (const [index, { createDocument }] of sections.entries()) { + if (!createDocument) continue + const doc = await createDocument() + const subitems = Array.from(matcher(doc, query), ({ range, excerpt }) => + ({ cfi: this.getCFI(index, range), excerpt })) + const progress = (index + 1) / sections.length + yield { progress } + if (subitems.length) yield { index, subitems } + } + } + async * search(opts) { + const { searchMatcher } = await import('./search.js') + const { query, index } = opts + const matcher = searchMatcher(textWalker, + { defaultLocale: this.language, ...opts }) + const iter = index != null + ? this.#searchSection(matcher, query, index) + : this.#searchBook(matcher, query) + for await (const result of iter) yield 'subitems' in result ? { + label: this.#tocProgress.getProgress(result.index)?.label ?? '', + subitems: result.subitems, + } : result + } +}