{"version":3,"file":"browser-image-compression.js","sources":["../node_modules/uzip/UZIP.js","../lib/UPNG.js","../lib/config/browser-name.js","../lib/utils.js","../lib/image-compression.js","../lib/web-worker.js","../lib/index.js"],"sourcesContent":["\r\n\r\nvar UZIP = {};\r\nif(typeof module == \"object\") module.exports = UZIP;\r\n\r\n\r\nUZIP[\"parse\"] = function(buf, onlyNames)\t// ArrayBuffer\r\n{\r\n\tvar rUs = UZIP.bin.readUshort, rUi = UZIP.bin.readUint, o = 0, out = {};\r\n\tvar data = new Uint8Array(buf);\r\n\tvar eocd = data.length-4;\r\n\t\r\n\twhile(rUi(data, eocd)!=0x06054b50) eocd--;\r\n\t\r\n\tvar o = eocd;\r\n\to+=4;\t// sign = 0x06054b50\r\n\to+=4; // disks = 0;\r\n\tvar cnu = rUs(data, o); o+=2;\r\n\tvar cnt = rUs(data, o); o+=2;\r\n\t\t\t\r\n\tvar csize = rUi(data, o); o+=4;\r\n\tvar coffs = rUi(data, o); o+=4;\r\n\t\r\n\to = coffs;\r\n\tfor(var i=0; i8514000) {\r\n\t\t\t//console.log(PUtils.readASCII(buf , 8514500, 500));\r\n\t\t\t//console.log(PUtils.readASCII(nbuf, 8514500, 500));\r\n\t\t}\r\n\t\tfor(var i=0; i>>4);\r\n\t//console.log(CM, CINFO,CMF,FLG);\r\n\treturn UZIP.inflateRaw(new Uint8Array(file.buffer, file.byteOffset+2, file.length-6), buf); \r\n}\r\nUZIP.deflate = function(data, opts/*, buf, off*/) {\r\n\tif(opts==null) opts={level:6};\r\n\tvar off=0, buf=new Uint8Array(50+Math.floor(data.length*1.1));\r\n\tbuf[off]=120; buf[off+1]=156; off+=2;\r\n\toff = UZIP.F.deflateRaw(data, buf, off, opts.level);\r\n\tvar crc = UZIP.adler(data, 0, data.length);\r\n\tbuf[off+0]=((crc>>>24)&255); \r\n\tbuf[off+1]=((crc>>>16)&255); \r\n\tbuf[off+2]=((crc>>> 8)&255); \r\n\tbuf[off+3]=((crc>>> 0)&255); \t\r\n\treturn new Uint8Array(buf.buffer, 0, off+4);\r\n}\r\nUZIP.deflateRaw = function(data, opts) {\r\n\tif(opts==null) opts={level:6};\r\n\tvar buf=new Uint8Array(50+Math.floor(data.length*1.1));\r\n\tvar off = UZIP.F.deflateRaw(data, buf, off, opts.level);\r\n\treturn new Uint8Array(buf.buffer, 0, off);\r\n}\r\n\r\n\r\nUZIP.encode = function(obj, noCmpr) {\r\n\tif(noCmpr==null) noCmpr=false;\r\n\tvar tot = 0, wUi = UZIP.bin.writeUint, wUs = UZIP.bin.writeUshort;\r\n\tvar zpd = {};\r\n\tfor(var p in obj) { var cpr = !UZIP._noNeed(p) && !noCmpr, buf = obj[p], crc = UZIP.crc.crc(buf,0,buf.length); \r\n\t\tzpd[p] = { cpr:cpr, usize:buf.length, crc:crc, file: (cpr ? UZIP.deflateRaw(buf) : buf) }; }\r\n\t\r\n\tfor(var p in zpd) tot += zpd[p].file.length + 30 + 46 + 2*UZIP.bin.sizeUTF8(p);\r\n\ttot += 22;\r\n\t\r\n\tvar data = new Uint8Array(tot), o = 0;\r\n\tvar fof = []\r\n\t\r\n\tfor(var p in zpd) {\r\n\t\tvar file = zpd[p]; fof.push(o);\r\n\t\to = UZIP._writeHeader(data, o, p, file, 0);\r\n\t}\r\n\tvar i=0, ioff = o;\r\n\tfor(var p in zpd) {\r\n\t\tvar file = zpd[p]; fof.push(o);\r\n\t\to = UZIP._writeHeader(data, o, p, file, 1, fof[i++]);\t\t\r\n\t}\r\n\tvar csize = o-ioff;\r\n\t\r\n\twUi(data, o, 0x06054b50); o+=4;\r\n\to += 4; // disks\r\n\twUs(data, o, i); o += 2;\r\n\twUs(data, o, i); o += 2;\t// number of c d records\r\n\twUi(data, o, csize); o += 4;\r\n\twUi(data, o, ioff ); o += 4;\r\n\to += 2;\r\n\treturn data.buffer;\r\n}\r\n// no need to compress .PNG, .ZIP, .JPEG ....\r\nUZIP._noNeed = function(fn) { var ext = fn.split(\".\").pop().toLowerCase(); return \"png,jpg,jpeg,zip\".indexOf(ext)!=-1; }\r\n\r\nUZIP._writeHeader = function(data, o, p, obj, t, roff)\r\n{\r\n\tvar wUi = UZIP.bin.writeUint, wUs = UZIP.bin.writeUshort;\r\n\tvar file = obj.file;\r\n\t\r\n\twUi(data, o, t==0 ? 0x04034b50 : 0x02014b50); o+=4; // sign\r\n\tif(t==1) o+=2; // ver made by\r\n\twUs(data, o, 20); o+=2;\t// ver\r\n\twUs(data, o, 0); o+=2; // gflip\r\n\twUs(data, o, obj.cpr?8:0); o+=2;\t// cmpr\r\n\t\t\r\n\twUi(data, o, 0); o+=4;\t// time\t\t\r\n\twUi(data, o, obj.crc); o+=4;\t// crc32\r\n\twUi(data, o, file.length); o+=4;\t// csize\r\n\twUi(data, o, obj.usize); o+=4;\t// usize\r\n\t\t\r\n\twUs(data, o, UZIP.bin.sizeUTF8(p)); o+=2;\t// nlen\r\n\twUs(data, o, 0); o+=2;\t// elen\r\n\t\r\n\tif(t==1) {\r\n\t\to += 2; // comment length\r\n\t\to += 2; // disk number\r\n\t\to += 6; // attributes\r\n\t\twUi(data, o, roff); o+=4;\t// usize\r\n\t}\r\n\tvar nlen = UZIP.bin.writeUTF8(data, o, p); o+= nlen;\t\r\n\tif(t==0) { data.set(file, o); o += file.length; }\r\n\treturn o;\r\n}\r\n\r\n\r\n\r\n\r\n\r\nUZIP.crc = {\r\n\ttable : ( function() {\r\n\t var tab = new Uint32Array(256);\r\n\t for (var n=0; n<256; n++) {\r\n\t\t\tvar c = n;\r\n\t\t\tfor (var k=0; k<8; k++) {\r\n\t\t\t\tif (c & 1) c = 0xedb88320 ^ (c >>> 1);\r\n\t\t\t\telse c = c >>> 1;\r\n\t\t\t}\r\n\t\t\ttab[n] = c; } \r\n\t\treturn tab; })(),\r\n\tupdate : function(c, buf, off, len) {\r\n\t\tfor (var i=0; i>> 8);\r\n\t\treturn c;\r\n\t},\r\n\tcrc : function(b,o,l) { return UZIP.crc.update(0xffffffff,b,o,l) ^ 0xffffffff; }\r\n}\r\nUZIP.adler = function(data,o,len) {\r\n\tvar a = 1, b = 0;\r\n\tvar off = o, end=o+len;\r\n\twhile(off>8)&255; },\r\n\treadUint : function(buff,p) { return (buff[p+3]*(256*256*256)) + ((buff[p+2]<<16) | (buff[p+1]<< 8) | buff[p]); },\r\n\twriteUint : function(buff,p,n){ buff[p]=n&255; buff[p+1]=(n>>8)&255; buff[p+2]=(n>>16)&255; buff[p+3]=(n>>24)&255; },\r\n\treadASCII : function(buff,p,l){ var s = \"\"; for(var i=0; i> 6)); buff[p+i+1] = (128|((code>> 0)&63)); i+=2; }\r\n\t\t\telse if((code&(0xffffffff-(1<<16)+1))==0) { buff[p+i] = (224|(code>>12)); buff[p+i+1] = (128|((code>> 6)&63)); buff[p+i+2] = (128|((code>>0)&63)); i+=3; }\r\n\t\t\telse if((code&(0xffffffff-(1<<21)+1))==0) { buff[p+i] = (240|(code>>18)); buff[p+i+1] = (128|((code>>12)&63)); buff[p+i+2] = (128|((code>>6)&63)); buff[p+i+3] = (128|((code>>0)&63)); i+=4; }\r\n\t\t\telse throw \"e\";\r\n\t\t}\r\n\t\treturn i;\r\n\t},\r\n\tsizeUTF8 : function(str) {\r\n\t\tvar strl = str.length, i=0;\r\n\t\tfor(var ci=0; ci>>3;\r\n\t}\r\n\r\n\tvar lits = U.lits, strt=U.strt, prev=U.prev, li=0, lc=0, bs=0, ebits=0, c=0, nc=0; // last_item, literal_count, block_start\r\n\tif(dlen>2) { nc=UZIP.F._hash(data,0); strt[nc]=0; }\r\n\tvar nmch=0,nmci=0;\r\n\t\r\n\tfor(i=0; i14000 || lc>26697) && (dlen-i)>100) {\r\n\t\t\t\tif(cvrd>>16)>>16)>(mch>>>16)) mch=0;\r\n\t\t\t}//*/\r\n\t\t\tvar len = mch>>>16, dst = mch&0xffff; //if(i-dst<0) throw \"e\";\r\n\t\t\tif(mch!=0) { \r\n\t\t\t\tvar len = mch>>>16, dst = mch&0xffff; //if(i-dst<0) throw \"e\";\r\n\t\t\t\tvar lgi = goodIndex(len, U.of0); U.lhst[257+lgi]++; \r\n\t\t\t\tvar dgi = goodIndex(dst, U.df0); U.dhst[ dgi]++; ebits += U.exb[lgi] + U.dxb[dgi]; \r\n\t\t\t\tlits[li] = (len<<23)|(i-cvrd); lits[li+1] = (dst<<16)|(lgi<<8)|dgi; li+=2;\r\n\t\t\t\tcvrd = i + len; \r\n\t\t\t}\r\n\t\t\telse {\tU.lhst[data[i]]++; }\r\n\t\t\tlc++;\r\n\t\t}\r\n\t}\r\n\tif(bs!=i || data.length==0) {\r\n\t\tif(cvrd>>3;\r\n}\r\nUZIP.F._bestMatch = function(data, i, prev, c, nice, chain) {\r\n\tvar ci = (i&0x7fff), pi=prev[ci]; \r\n\t//console.log(\"----\", i);\r\n\tvar dif = ((ci-pi + (1<<15)) & 0x7fff); if(pi==ci || c!=UZIP.F._hash(data,i-dif)) return 0;\r\n\tvar tl=0, td=0; // top length, top distance\r\n\tvar dlim = Math.min(0x7fff, i);\r\n\twhile(dif<=dlim && --chain!=0 && pi!=ci /*&& c==UZIP.F._hash(data,i-dif)*/) {\r\n\t\tif(tl==0 || (data[i+tl]==data[i+tl-dif])) {\r\n\t\t\tvar cl = UZIP.F._howLong(data, i, dif);\r\n\t\t\tif(cl>tl) { \r\n\t\t\t\ttl=cl; td=dif; if(tl>=nice) break; //* \r\n\t\t\t\tif(dif+2maxd) { maxd=curd; pi = ei; }\r\n\t\t\t\t} //*/\r\n\t\t\t}\r\n\t\t}\r\n\t\t\r\n\t\tci=pi; pi = prev[ci];\r\n\t\tdif += ((ci-pi + (1<<15)) & 0x7fff);\r\n\t}\r\n\treturn (tl<<16)|td;\r\n}\r\nUZIP.F._howLong = function(data, i, dif) {\r\n\tif(data[i]!=data[i-dif] || data[i+1]!=data[i+1-dif] || data[i+2]!=data[i+2-dif]) return 0;\r\n\tvar oi=i, l = Math.min(data.length, i+258); i+=3;\r\n\t//while(i+4>>23), end = off+(qb&((1<<23)-1));\r\n\t\t\twhile(off>16), lgi=(qc>>8)&255, dgi=(qc&255);\r\n\t\t\t\tpos = UZIP.F._writeLit(257+lgi, ltree, out, pos);\r\n\t\t\t\tputsE(out, pos, len-U.of0[lgi]); pos+=U.exb[lgi];\r\n\t\t\t\t\r\n\t\t\t\tpos = UZIP.F._writeLit(dgi, dtree, out, pos);\r\n\t\t\t\tputsF(out, pos, dst-U.df0[dgi]); pos+=U.dxb[dgi]; off+=len;\r\n\t\t\t}\r\n\t\t}\r\n\t\tpos = UZIP.F._writeLit(256, ltree, out, pos);\r\n\t}\r\n\t//console.log(pos-opos, fxdSize, dynSize, cstSize);\r\n\treturn pos;\r\n}\r\nUZIP.F._copyExact = function(data,off,len,out,pos) {\r\n\tvar p8 = (pos>>>3);\r\n\tout[p8]=(len); out[p8+1]=(len>>>8); out[p8+2]=255-out[p8]; out[p8+3]=255-out[p8+1]; p8+=4;\r\n\tout.set(new Uint8Array(data.buffer, off, len), p8);\r\n\t//for(var i=0; i4 && U.itree[(U.ordr[numh-1]<<1)+1]==0) numh--;\r\n\treturn [ML, MD, MH, numl, numd, numh, lset, dset];\r\n}\r\nUZIP.F.getSecond= function(a) { var b=[]; for(var i=0; i>1)+\",\"; return b; }\r\nUZIP.F.contSize = function(tree, hst) { var s=0; for(var i=0; i15) { UZIP.F._putsE(out, pos, rst, rsl); pos+=rsl; }\r\n\t}\r\n\treturn pos;\r\n}\r\nUZIP.F._lenCodes = function(tree, set) {\r\n\tvar len=tree.length; while(len!=2 && tree[len-1]==0) len-=2; // when no distances, keep one code with length 0\r\n\tfor(var i=0; i>>1, 138);\r\n\t\t\tif(zc<11) set.push(17, zc-3);\r\n\t\t\telse set.push(18, zc-11);\r\n\t\t\ti += zc*2-2;\r\n\t\t}\r\n\t\telse if(l==prv && nxt==l && nnxt==l) {\r\n\t\t\tvar lz = i+5;\r\n\t\t\twhile(lz+2>>1, 6);\r\n\t\t\tset.push(16, zc-3);\r\n\t\t\ti += zc*2-2;\r\n\t\t}\r\n\t\telse set.push(l, 0);\r\n\t}\r\n\treturn len>>>1;\r\n}\r\nUZIP.F._hufTree = function(hst, tree, MAXL) {\r\n\tvar list=[], hl = hst.length, tl=tree.length, i=0;\r\n\tfor(i=0; iMAXL) { UZIP.F.restrictDepth(l2, MAXL, maxl); maxl = MAXL; }\r\n\tfor(i=0; iMD) { var od=dps[i].d; dps[i].d=MD; dbt+=bCost-(1<<(maxl-od)); } else break;\r\n\tdbt = dbt>>>(maxl-MD);\r\n\twhile(dbt>0) { var od=dps[i].d; if(od=0; i--) if(dps[i].d==MD && dbt<0) { dps[i].d--; dbt++; } if(dbt!=0) console.log(\"debt left\");\r\n}\r\n\r\nUZIP.F._goodIndex = function(v, arr) {\r\n\tvar i=0; if(arr[i|16]<=v) i|=16; if(arr[i|8]<=v) i|=8; if(arr[i|4]<=v) i|=4; if(arr[i|2]<=v) i|=2; if(arr[i|1]<=v) i|=1; return i;\r\n}\r\nUZIP.F._writeLit = function(ch, ltree, out, pos) {\r\n\tUZIP.F._putsF(out, pos, ltree[ch<<1]);\r\n\treturn pos+ltree[(ch<<1)+1];\r\n}\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\nUZIP.F.inflate = function(data, buf) {\r\n\tvar u8=Uint8Array;\r\n\tif(data[0]==3 && data[1]==0) return (buf ? buf : new u8(0));\r\n\tvar F=UZIP.F, bitsF = F._bitsF, bitsE = F._bitsE, decodeTiny = F._decodeTiny, makeCodes = F.makeCodes, codes2map=F.codes2map, get17 = F._get17;\r\n\tvar U = F.U;\r\n\t\r\n\tvar noBuf = (buf==null);\r\n\tif(noBuf) buf = new u8((data.length>>>2)<<3);\r\n\t\r\n\tvar BFINAL=0, BTYPE=0, HLIT=0, HDIST=0, HCLEN=0, ML=0, MD=0; \t\r\n\tvar off = 0, pos = 0;\r\n\tvar lmap, dmap;\r\n\t\r\n\twhile(BFINAL==0) {\t\t\r\n\t\tBFINAL = bitsF(data, pos , 1);\r\n\t\tBTYPE = bitsF(data, pos+1, 2); pos+=3;\r\n\t\t//console.log(BFINAL, BTYPE);\r\n\t\t\r\n\t\tif(BTYPE==0) {\r\n\t\t\tif((pos&7)!=0) pos+=8-(pos&7);\r\n\t\t\tvar p8 = (pos>>>3)+4, len = data[p8-4]|(data[p8-3]<<8); //console.log(len);//bitsF(data, pos, 16), \r\n\t\t\tif(noBuf) buf=UZIP.F._check(buf, off+len);\r\n\t\t\tbuf.set(new u8(data.buffer, data.byteOffset+p8, len), off);\r\n\t\t\t//for(var i=0; itl)tl=l; } pos+=3*HCLEN; //console.log(itree);\r\n\t\t\tmakeCodes(U.itree, tl);\r\n\t\t\tcodes2map(U.itree, tl, U.imap);\r\n\t\t\t\r\n\t\t\tlmap = U.lmap; dmap = U.dmap;\r\n\t\t\t\r\n\t\t\tpos = decodeTiny(U.imap, (1<>>24))-1; pos+=(ml&0xffffff);\r\n\t\t\tmakeCodes(U.ltree, mx0);\r\n\t\t\tcodes2map(U.ltree, mx0, lmap);\r\n\t\t\t\r\n\t\t\t//var md = decodeTiny(U.imap, (1<>>24))-1; pos+=(md&0xffffff);\r\n\t\t\tmakeCodes(U.dtree, mx1);\r\n\t\t\tcodes2map(U.dtree, mx1, dmap);\r\n\t\t}\r\n\t\t//var ooff=off, opos=pos;\r\n\t\twhile(true) {\r\n\t\t\tvar code = lmap[get17(data, pos) & ML]; pos += code&15;\r\n\t\t\tvar lit = code>>>4; //U.lhst[lit]++; \r\n\t\t\tif((lit>>>8)==0) { buf[off++] = lit; }\r\n\t\t\telse if(lit==256) { break; }\r\n\t\t\telse {\r\n\t\t\t\tvar end = off+lit-254;\r\n\t\t\t\tif(lit>264) { var ebs = U.ldef[lit-257]; end = off + (ebs>>>3) + bitsE(data, pos, ebs&7); pos += ebs&7; }\r\n\t\t\t\t//UZIP.F.dst[end-off]++;\r\n\t\t\t\t\r\n\t\t\t\tvar dcode = dmap[get17(data, pos) & MD]; pos += dcode&15;\r\n\t\t\t\tvar dlit = dcode>>>4;\r\n\t\t\t\tvar dbs = U.ddef[dlit], dst = (dbs>>>4) + bitsF(data, pos, dbs&15); pos += dbs&15;\r\n\t\t\t\t\r\n\t\t\t\t//var o0 = off-dst, stp = Math.min(end-off, dst);\r\n\t\t\t\t//if(stp>20) while(off>>3);\r\n\t}\r\n\t//console.log(UZIP.F.dst);\r\n\t//console.log(tlen, dlen, off-tlen+tcnt);\r\n\treturn buf.length==off ? buf : buf.slice(0,off);\r\n}\r\nUZIP.F._check=function(buf, len) {\r\n\tvar bl=buf.length; if(len<=bl) return buf;\r\n\tvar nbuf = new Uint8Array(Math.max(bl<<1,len)); nbuf.set(buf,0);\r\n\t//for(var i=0; i>>4; \r\n\t\tif(lit<=15) { tree[i]=lit; i++; }\r\n\t\telse {\r\n\t\t\tvar ll = 0, n = 0;\r\n\t\t\tif(lit==16) {\r\n\t\t\t\tn = (3 + bitsE(data, pos, 2)); pos += 2; ll = tree[i-1];\r\n\t\t\t}\r\n\t\t\telse if(lit==17) {\r\n\t\t\t\tn = (3 + bitsE(data, pos, 3)); pos += 3;\r\n\t\t\t}\r\n\t\t\telse if(lit==18) {\r\n\t\t\t\tn = (11 + bitsE(data, pos, 7)); pos += 7;\r\n\t\t\t}\r\n\t\t\tvar ni = i+n;\r\n\t\t\twhile(i>>1;\r\n\twhile(imx)mx=v; i++; }\r\n\twhile(i>1;\r\n\t\tvar cl = tree[i+1], val = (lit<<4)|cl; // : (0x8000 | (U.of0[lit-257]<<7) | (U.exb[lit-257]<<4) | cl);\r\n\t\tvar rest = (MAX_BITS-cl), i0 = tree[i]<>>(15-MAX_BITS);\r\n\t\twhile(i0!=i1) {\r\n\t\t\tvar p0 = r15[i0]>>>(15-MAX_BITS);\r\n\t\t\tmap[p0]=val; i0++;\r\n\t\t}\r\n\t}\r\n}\r\nUZIP.F.revCodes = function(tree, MAX_BITS) {\r\n\tvar r15 = UZIP.F.U.rev15, imb = 15-MAX_BITS;\r\n\tfor(var i=0; i>>imb; }\r\n}\r\n\r\n// used only in deflate\r\nUZIP.F._putsE= function(dt, pos, val ) { val = val<<(pos&7); var o=(pos>>>3); dt[o]|=val; dt[o+1]|=(val>>>8); }\r\nUZIP.F._putsF= function(dt, pos, val ) { val = val<<(pos&7); var o=(pos>>>3); dt[o]|=val; dt[o+1]|=(val>>>8); dt[o+2]|=(val>>>16); }\r\n\r\nUZIP.F._bitsE= function(dt, pos, length) { return ((dt[pos>>>3] | (dt[(pos>>>3)+1]<<8) )>>>(pos&7))&((1<>>3] | (dt[(pos>>>3)+1]<<8) | (dt[(pos>>>3)+2]<<16))>>>(pos&7))&((1<>>3] | (dt[(pos>>>3)+1]<<8))>>>(pos&7))&511;\r\n} */\r\nUZIP.F._get17= function(dt, pos) {\t// return at least 17 meaningful bytes\r\n\treturn (dt[pos>>>3] | (dt[(pos>>>3)+1]<<8) | (dt[(pos>>>3)+2]<<16) )>>>(pos&7);\r\n}\r\nUZIP.F._get25= function(dt, pos) {\t// return at least 17 meaningful bytes\r\n\treturn (dt[pos>>>3] | (dt[(pos>>>3)+1]<<8) | (dt[(pos>>>3)+2]<<16) | (dt[(pos>>>3)+3]<<24) )>>>(pos&7);\r\n}\r\nUZIP.F.U = function(){\r\n\tvar u16=Uint16Array, u32=Uint32Array;\r\n\treturn {\r\n\t\tnext_code : new u16(16),\r\n\t\tbl_count : new u16(16),\r\n\t\tordr : [ 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15 ],\r\n\t\tof0 : [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,999,999,999],\r\n\t\texb : [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],\r\n\t\tldef : new u16(32),\r\n\t\tdf0 : [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, 65535, 65535],\r\n\t\tdxb : [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],\r\n\t\tddef : new u32(32),\r\n\t\tflmap: new u16( 512), fltree: [],\r\n\t\tfdmap: new u16( 32), fdtree: [],\r\n\t\tlmap : new u16(32768), ltree : [], ttree:[],\r\n\t\tdmap : new u16(32768), dtree : [],\r\n\t\timap : new u16( 512), itree : [],\r\n\t\t//rev9 : new u16( 512)\r\n\t\trev15: new u16(1<<15),\r\n\t\tlhst : new u32(286), dhst : new u32( 30), ihst : new u32(19),\r\n\t\tlits : new u32(15000),\r\n\t\tstrt : new u16(1<<16),\r\n\t\tprev : new u16(1<<15)\r\n\t}; \r\n} ();\r\n\r\n(function(){\t\r\n\tvar U = UZIP.F.U;\r\n\tvar len = 1<<15;\r\n\tfor(var i=0; i>> 1) | ((x & 0x55555555) << 1));\r\n\t\tx = (((x & 0xcccccccc) >>> 2) | ((x & 0x33333333) << 2));\r\n\t\tx = (((x & 0xf0f0f0f0) >>> 4) | ((x & 0x0f0f0f0f) << 4));\r\n\t\tx = (((x & 0xff00ff00) >>> 8) | ((x & 0x00ff00ff) << 8));\r\n\t\tU.rev15[i] = (((x >>> 16) | (x << 16)))>>>17;\r\n\t}\r\n\t\r\n\tfunction pushV(tgt, n, sv) { while(n--!=0) tgt.push(0,sv); }\r\n\t\r\n\tfor(var i=0; i<32; i++) { U.ldef[i]=(U.of0[i]<<3)|U.exb[i]; U.ddef[i]=(U.df0[i]<<4)|U.dxb[i]; }\r\n\t\r\n\tpushV(U.fltree, 144, 8); pushV(U.fltree, 255-143, 9); pushV(U.fltree, 279-255, 7); pushV(U.fltree,287-279,8);\r\n\t/*\r\n\tvar i = 0;\r\n\tfor(; i<=143; i++) U.fltree.push(0,8);\r\n\tfor(; i<=255; i++) U.fltree.push(0,9);\r\n\tfor(; i<=279; i++) U.fltree.push(0,7);\r\n\tfor(; i<=287; i++) U.fltree.push(0,8);\r\n\t*/\r\n\tUZIP.F.makeCodes(U.fltree, 9);\r\n\tUZIP.F.codes2map(U.fltree, 9, U.flmap);\r\n\tUZIP.F.revCodes (U.fltree, 9)\r\n\t\r\n\tpushV(U.fdtree,32,5);\r\n\t//for(i=0;i<32; i++) U.fdtree.push(0,5);\r\n\tUZIP.F.makeCodes(U.fdtree, 5);\r\n\tUZIP.F.codes2map(U.fdtree, 5, U.fdmap);\r\n\tUZIP.F.revCodes (U.fdtree, 5)\r\n\t\r\n\tpushV(U.itree,19,0); pushV(U.ltree,286,0); pushV(U.dtree,30,0); pushV(U.ttree,320,0);\r\n\t/*\r\n\tfor(var i=0; i< 19; i++) U.itree.push(0,0);\r\n\tfor(var i=0; i<286; i++) U.ltree.push(0,0);\r\n\tfor(var i=0; i< 30; i++) U.dtree.push(0,0);\r\n\tfor(var i=0; i<320; i++) U.ttree.push(0,0);\r\n\t*/\r\n})()\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n","// https://github.com/photopea/UPNG.js/blob/c976240e62b0497167f8aafabd7889625f8b2016/UPNG.js\n\n// import * as pako from 'pako'\nimport * as UZIP from 'uzip';\n\nconst UPNG = {};\n\nUPNG.toRGBA8 = function (out) {\n const w = out.width; const\n h = out.height;\n if (out.tabs.acTL == null) return [UPNG.toRGBA8.decodeImage(out.data, w, h, out).buffer];\n\n const frms = [];\n if (out.frames[0].data == null) out.frames[0].data = out.data;\n\n const len = w * h * 4; const img = new Uint8Array(len); const empty = new Uint8Array(len); const\n prev = new Uint8Array(len);\n for (let i = 0; i < out.frames.length; i++) {\n const frm = out.frames[i];\n const fx = frm.rect.x; const fy = frm.rect.y; const fw = frm.rect.width; const\n fh = frm.rect.height;\n const fdata = UPNG.toRGBA8.decodeImage(frm.data, fw, fh, out);\n\n if (i != 0) for (var j = 0; j < len; j++) prev[j] = img[j];\n\n if (frm.blend == 0) UPNG._copyTile(fdata, fw, fh, img, w, h, fx, fy, 0);\n else if (frm.blend == 1) UPNG._copyTile(fdata, fw, fh, img, w, h, fx, fy, 1);\n\n frms.push(img.buffer.slice(0));\n\n if (frm.dispose == 0) {} else if (frm.dispose == 1) UPNG._copyTile(empty, fw, fh, img, w, h, fx, fy, 0);\n else if (frm.dispose == 2) for (var j = 0; j < len; j++) img[j] = prev[j];\n }\n return frms;\n};\nUPNG.toRGBA8.decodeImage = function (data, w, h, out) {\n const area = w * h; const\n bpp = UPNG.decode._getBPP(out);\n const bpl = Math.ceil(w * bpp / 8);\t// bytes per line\n\n const bf = new Uint8Array(area * 4); const\n bf32 = new Uint32Array(bf.buffer);\n const { ctype } = out;\n const { depth } = out;\n const rs = UPNG._bin.readUshort;\n\n // console.log(ctype, depth);\n const time = Date.now();\n\n if (ctype == 6) { // RGB + alpha\n const qarea = area << 2;\n if (depth == 8) for (var i = 0; i < qarea; i += 4) { bf[i] = data[i]; bf[i + 1] = data[i + 1]; bf[i + 2] = data[i + 2]; bf[i + 3] = data[i + 3]; }\n if (depth == 16) for (var i = 0; i < qarea; i++) { bf[i] = data[i << 1]; }\n } else if (ctype == 2) {\t// RGB\n const ts = out.tabs.tRNS;\n if (ts == null) {\n if (depth == 8) for (var i = 0; i < area; i++) { var ti = i * 3; bf32[i] = (255 << 24) | (data[ti + 2] << 16) | (data[ti + 1] << 8) | data[ti]; }\n if (depth == 16) for (var i = 0; i < area; i++) { var ti = i * 6; bf32[i] = (255 << 24) | (data[ti + 4] << 16) | (data[ti + 2] << 8) | data[ti]; }\n } else {\n var tr = ts[0]; const tg = ts[1]; const\n tb = ts[2];\n if (depth == 8) {\n for (var i = 0; i < area; i++) {\n var qi = i << 2; var\n ti = i * 3; bf32[i] = (255 << 24) | (data[ti + 2] << 16) | (data[ti + 1] << 8) | data[ti];\n if (data[ti] == tr && data[ti + 1] == tg && data[ti + 2] == tb) bf[qi + 3] = 0;\n }\n }\n if (depth == 16) {\n for (var i = 0; i < area; i++) {\n var qi = i << 2; var\n ti = i * 6; bf32[i] = (255 << 24) | (data[ti + 4] << 16) | (data[ti + 2] << 8) | data[ti];\n if (rs(data, ti) == tr && rs(data, ti + 2) == tg && rs(data, ti + 4) == tb) bf[qi + 3] = 0;\n }\n }\n }\n } else if (ctype == 3) {\t// palette\n const p = out.tabs.PLTE;\n const ap = out.tabs.tRNS;\n const tl = ap ? ap.length : 0;\n // console.log(p, ap);\n if (depth == 1) {\n for (var y = 0; y < h; y++) {\n var s0 = y * bpl; var\n t0 = y * w;\n for (var i = 0; i < w; i++) {\n var qi = (t0 + i) << 2; var j = ((data[s0 + (i >> 3)] >> (7 - ((i & 7) << 0))) & 1); var\n cj = 3 * j; bf[qi] = p[cj]; bf[qi + 1] = p[cj + 1]; bf[qi + 2] = p[cj + 2]; bf[qi + 3] = (j < tl) ? ap[j] : 255;\n }\n }\n }\n if (depth == 2) {\n for (var y = 0; y < h; y++) {\n var s0 = y * bpl; var\n t0 = y * w;\n for (var i = 0; i < w; i++) {\n var qi = (t0 + i) << 2; var j = ((data[s0 + (i >> 2)] >> (6 - ((i & 3) << 1))) & 3); var\n cj = 3 * j; bf[qi] = p[cj]; bf[qi + 1] = p[cj + 1]; bf[qi + 2] = p[cj + 2]; bf[qi + 3] = (j < tl) ? ap[j] : 255;\n }\n }\n }\n if (depth == 4) {\n for (var y = 0; y < h; y++) {\n var s0 = y * bpl; var\n t0 = y * w;\n for (var i = 0; i < w; i++) {\n var qi = (t0 + i) << 2; var j = ((data[s0 + (i >> 1)] >> (4 - ((i & 1) << 2))) & 15); var\n cj = 3 * j; bf[qi] = p[cj]; bf[qi + 1] = p[cj + 1]; bf[qi + 2] = p[cj + 2]; bf[qi + 3] = (j < tl) ? ap[j] : 255;\n }\n }\n }\n if (depth == 8) {\n for (var i = 0; i < area; i++) {\n var qi = i << 2; var j = data[i]; var\n cj = 3 * j; bf[qi] = p[cj]; bf[qi + 1] = p[cj + 1]; bf[qi + 2] = p[cj + 2]; bf[qi + 3] = (j < tl) ? ap[j] : 255;\n }\n }\n } else if (ctype == 4) {\t// gray + alpha\n if (depth == 8) {\n for (var i = 0; i < area; i++) {\n var qi = i << 2; var di = i << 1; var\n gr = data[di]; bf[qi] = gr; bf[qi + 1] = gr; bf[qi + 2] = gr; bf[qi + 3] = data[di + 1];\n }\n }\n if (depth == 16) {\n for (var i = 0; i < area; i++) {\n var qi = i << 2; var di = i << 2; var\n gr = data[di]; bf[qi] = gr; bf[qi + 1] = gr; bf[qi + 2] = gr; bf[qi + 3] = data[di + 2];\n }\n }\n } else if (ctype == 0) {\t// gray\n var tr = out.tabs.tRNS ? out.tabs.tRNS : -1;\n for (var y = 0; y < h; y++) {\n const off = y * bpl; const\n to = y * w;\n if (depth == 1) {\n for (var x = 0; x < w; x++) {\n var gr = 255 * ((data[off + (x >>> 3)] >>> (7 - ((x & 7)))) & 1); var\n al = (gr == tr * 255) ? 0 : 255; bf32[to + x] = (al << 24) | (gr << 16) | (gr << 8) | gr;\n }\n } else if (depth == 2) {\n for (var x = 0; x < w; x++) {\n var gr = 85 * ((data[off + (x >>> 2)] >>> (6 - ((x & 3) << 1))) & 3); var\n al = (gr == tr * 85) ? 0 : 255; bf32[to + x] = (al << 24) | (gr << 16) | (gr << 8) | gr;\n }\n } else if (depth == 4) {\n for (var x = 0; x < w; x++) {\n var gr = 17 * ((data[off + (x >>> 1)] >>> (4 - ((x & 1) << 2))) & 15); var\n al = (gr == tr * 17) ? 0 : 255; bf32[to + x] = (al << 24) | (gr << 16) | (gr << 8) | gr;\n }\n } else if (depth == 8) {\n for (var x = 0; x < w; x++) {\n var gr = data[off + x]; var\n al = (gr == tr) ? 0 : 255; bf32[to + x] = (al << 24) | (gr << 16) | (gr << 8) | gr;\n }\n } else if (depth == 16) {\n for (var x = 0; x < w; x++) {\n var gr = data[off + (x << 1)]; var\n al = (rs(data, off + (x << i)) == tr) ? 0 : 255; bf32[to + x] = (al << 24) | (gr << 16) | (gr << 8) | gr;\n }\n }\n }\n }\n // console.log(Date.now()-time);\n return bf;\n};\n\nUPNG.decode = function (buff) {\n const data = new Uint8Array(buff); let offset = 8; const bin = UPNG._bin; const rUs = bin.readUshort; const\n rUi = bin.readUint;\n const out = { tabs: {}, frames: [] };\n const dd = new Uint8Array(data.length); let\n doff = 0;\t // put all IDAT data into it\n let fd; let\n foff = 0;\t// frames\n\n const mgck = [0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a];\n for (var i = 0; i < 8; i++) if (data[i] != mgck[i]) throw 'The input is not a PNG file!';\n\n while (offset < data.length) {\n const len = bin.readUint(data, offset); offset += 4;\n const type = bin.readASCII(data, offset, 4); offset += 4;\n // console.log(type,len);\n\n if (type == 'IHDR') { UPNG.decode._IHDR(data, offset, out); } else if (type == 'CgBI') { out.tabs[type] = data.slice(offset, offset + 4); } else if (type == 'IDAT') {\n for (var i = 0; i < len; i++) dd[doff + i] = data[offset + i];\n doff += len;\n } else if (type == 'acTL') {\n out.tabs[type] = { num_frames: rUi(data, offset), num_plays: rUi(data, offset + 4) };\n fd = new Uint8Array(data.length);\n } else if (type == 'fcTL') {\n if (foff != 0) {\n var fr = out.frames[out.frames.length - 1];\n fr.data = UPNG.decode._decompress(out, fd.slice(0, foff), fr.rect.width, fr.rect.height); foff = 0;\n }\n const rct = {\n x: rUi(data, offset + 12), y: rUi(data, offset + 16), width: rUi(data, offset + 4), height: rUi(data, offset + 8),\n };\n let del = rUs(data, offset + 22); del = rUs(data, offset + 20) / (del == 0 ? 100 : del);\n const frm = {\n rect: rct, delay: Math.round(del * 1000), dispose: data[offset + 24], blend: data[offset + 25],\n };\n // console.log(frm);\n out.frames.push(frm);\n } else if (type == 'fdAT') {\n for (var i = 0; i < len - 4; i++) fd[foff + i] = data[offset + i + 4];\n foff += len - 4;\n } else if (type == 'pHYs') {\n out.tabs[type] = [bin.readUint(data, offset), bin.readUint(data, offset + 4), data[offset + 8]];\n } else if (type == 'cHRM') {\n out.tabs[type] = [];\n for (var i = 0; i < 8; i++) out.tabs[type].push(bin.readUint(data, offset + i * 4));\n } else if (type == 'tEXt' || type == 'zTXt') {\n if (out.tabs[type] == null) out.tabs[type] = {};\n var nz = bin.nextZero(data, offset);\n var keyw = bin.readASCII(data, offset, nz - offset);\n var text; var\n tl = offset + len - nz - 1;\n if (type == 'tEXt') text = bin.readASCII(data, nz + 1, tl);\n else {\n var bfr = UPNG.decode._inflate(data.slice(nz + 2, nz + 2 + tl));\n text = bin.readUTF8(bfr, 0, bfr.length);\n }\n out.tabs[type][keyw] = text;\n } else if (type == 'iTXt') {\n if (out.tabs[type] == null) out.tabs[type] = {};\n var nz = 0; let\n off = offset;\n nz = bin.nextZero(data, off);\n var keyw = bin.readASCII(data, off, nz - off); off = nz + 1;\n const cflag = data[off]; const\n cmeth = data[off + 1]; off += 2;\n nz = bin.nextZero(data, off);\n const ltag = bin.readASCII(data, off, nz - off); off = nz + 1;\n nz = bin.nextZero(data, off);\n const tkeyw = bin.readUTF8(data, off, nz - off); off = nz + 1;\n var text; var\n tl = len - (off - offset);\n if (cflag == 0) text = bin.readUTF8(data, off, tl);\n else {\n var bfr = UPNG.decode._inflate(data.slice(off, off + tl));\n text = bin.readUTF8(bfr, 0, bfr.length);\n }\n out.tabs[type][keyw] = text;\n } else if (type == 'PLTE') {\n out.tabs[type] = bin.readBytes(data, offset, len);\n } else if (type == 'hIST') {\n const pl = out.tabs.PLTE.length / 3;\n out.tabs[type] = []; for (var i = 0; i < pl; i++) out.tabs[type].push(rUs(data, offset + i * 2));\n } else if (type == 'tRNS') {\n if (out.ctype == 3) out.tabs[type] = bin.readBytes(data, offset, len);\n else if (out.ctype == 0) out.tabs[type] = rUs(data, offset);\n else if (out.ctype == 2) out.tabs[type] = [rUs(data, offset), rUs(data, offset + 2), rUs(data, offset + 4)];\n // else console.log(\"tRNS for unsupported color type\",out.ctype, len);\n } else if (type == 'gAMA') out.tabs[type] = bin.readUint(data, offset) / 100000;\n else if (type == 'sRGB') out.tabs[type] = data[offset];\n else if (type == 'bKGD') {\n if (out.ctype == 0 || out.ctype == 4) out.tabs[type] = [rUs(data, offset)];\n else if (out.ctype == 2 || out.ctype == 6) out.tabs[type] = [rUs(data, offset), rUs(data, offset + 2), rUs(data, offset + 4)];\n else if (out.ctype == 3) out.tabs[type] = data[offset];\n } else if (type == 'IEND') {\n break;\n }\n // else { log(\"unknown chunk type\", type, len); }\n offset += len;\n const crc = bin.readUint(data, offset); offset += 4;\n }\n if (foff != 0) {\n var fr = out.frames[out.frames.length - 1];\n fr.data = UPNG.decode._decompress(out, fd.slice(0, foff), fr.rect.width, fr.rect.height); foff = 0;\n }\n out.data = UPNG.decode._decompress(out, dd, out.width, out.height);\n\n delete out.compress; delete out.interlace; delete out.filter;\n return out;\n};\n\nUPNG.decode._decompress = function (out, dd, w, h) {\n var time = Date.now();\n const bpp = UPNG.decode._getBPP(out); const bpl = Math.ceil(w * bpp / 8); const\n buff = new Uint8Array((bpl + 1 + out.interlace) * h);\n if (out.tabs.CgBI) dd = UPNG.inflateRaw(dd, buff);\n else dd = UPNG.decode._inflate(dd, buff);\n // console.log(dd.length, buff.length);\n // console.log(Date.now()-time);\n\n var time = Date.now();\n if (out.interlace == 0) dd = UPNG.decode._filterZero(dd, out, 0, w, h);\n else if (out.interlace == 1) dd = UPNG.decode._readInterlace(dd, out);\n // console.log(Date.now()-time);\n return dd;\n};\n\nUPNG.decode._inflate = function (data, buff) { const out = UPNG.inflateRaw(new Uint8Array(data.buffer, 2, data.length - 6), buff); return out; };\nUPNG.inflateRaw = (function () {\n const H = {}; H.H = {}; H.H.N = function (N, W) {\n const R = Uint8Array; let i = 0; let m = 0; let J = 0; let h = 0; let Q = 0; let X = 0; let u = 0; let w = 0; let d = 0; let v; let C;\n if (N[0] == 3 && N[1] == 0) return W || new R(0); const V = H.H; const n = V.b; const A = V.e; const l = V.R; const M = V.n; const I = V.A; const e = V.Z; const b = V.m; const Z = W == null;\n if (Z)W = new R(N.length >>> 2 << 5); while (i == 0) {\n i = n(N, d, 1); m = n(N, d + 1, 2); d += 3; if (m == 0) {\n if ((d & 7) != 0)d += 8 - (d & 7);\n const D = (d >>> 3) + 4; const q = N[D - 4] | N[D - 3] << 8; if (Z)W = H.H.W(W, w + q); W.set(new R(N.buffer, N.byteOffset + D, q), w); d = D + q << 3;\n w += q; continue;\n } if (Z)W = H.H.W(W, w + (1 << 17)); if (m == 1) { v = b.J; C = b.h; X = (1 << 9) - 1; u = (1 << 5) - 1; } if (m == 2) {\n J = A(N, d, 5) + 257;\n h = A(N, d + 5, 5) + 1; Q = A(N, d + 10, 4) + 4; d += 14; const E = d; let j = 1; for (var c = 0; c < 38; c += 2) { b.Q[c] = 0; b.Q[c + 1] = 0; } for (var c = 0;\n c < Q; c++) { const K = A(N, d + c * 3, 3); b.Q[(b.X[c] << 1) + 1] = K; if (K > j)j = K; }d += 3 * Q; M(b.Q, j); I(b.Q, j, b.u); v = b.w; C = b.d;\n d = l(b.u, (1 << j) - 1, J + h, N, d, b.v); const r = V.V(b.v, 0, J, b.C); X = (1 << r) - 1; const S = V.V(b.v, J, h, b.D); u = (1 << S) - 1; M(b.C, r);\n I(b.C, r, v); M(b.D, S); I(b.D, S, C);\n } while (!0) {\n const T = v[e(N, d) & X]; d += T & 15; const p = T >>> 4; if (p >>> 8 == 0) { W[w++] = p; } else if (p == 256) { break; } else {\n let z = w + p - 254;\n if (p > 264) { const _ = b.q[p - 257]; z = w + (_ >>> 3) + A(N, d, _ & 7); d += _ & 7; } const $ = C[e(N, d) & u]; d += $ & 15; const s = $ >>> 4; const Y = b.c[s]; const a = (Y >>> 4) + n(N, d, Y & 15);\n d += Y & 15; while (w < z) { W[w] = W[w++ - a]; W[w] = W[w++ - a]; W[w] = W[w++ - a]; W[w] = W[w++ - a]; }w = z;\n }\n }\n } return W.length == w ? W : W.slice(0, w);\n };\n H.H.W = function (N, W) { const R = N.length; if (W <= R) return N; const V = new Uint8Array(R << 1); V.set(N, 0); return V; };\n H.H.R = function (N, W, R, V, n, A) {\n const l = H.H.e; const M = H.H.Z; let I = 0; while (I < R) {\n const e = N[M(V, n) & W]; n += e & 15; const b = e >>> 4;\n if (b <= 15) { A[I] = b; I++; } else {\n let Z = 0; let m = 0; if (b == 16) { m = 3 + l(V, n, 2); n += 2; Z = A[I - 1]; } else if (b == 17) {\n m = 3 + l(V, n, 3);\n n += 3;\n } else if (b == 18) { m = 11 + l(V, n, 7); n += 7; } const J = I + m; while (I < J) { A[I] = Z; I++; }\n }\n } return n;\n }; H.H.V = function (N, W, R, V) {\n let n = 0; let A = 0; const l = V.length >>> 1;\n while (A < R) { const M = N[A + W]; V[A << 1] = 0; V[(A << 1) + 1] = M; if (M > n)n = M; A++; } while (A < l) { V[A << 1] = 0; V[(A << 1) + 1] = 0; A++; } return n;\n };\n H.H.n = function (N, W) {\n const R = H.H.m; const V = N.length; let n; let A; let l; var M; let I; const e = R.j; for (var M = 0; M <= W; M++)e[M] = 0; for (M = 1; M < V; M += 2)e[N[M]]++;\n const b = R.K; n = 0; e[0] = 0; for (A = 1; A <= W; A++) { n = n + e[A - 1] << 1; b[A] = n; } for (l = 0; l < V; l += 2) {\n I = N[l + 1]; if (I != 0) {\n N[l] = b[I];\n b[I]++;\n }\n }\n }; H.H.A = function (N, W, R) {\n const V = N.length; const n = H.H.m; const A = n.r; for (let l = 0; l < V; l += 2) {\n if (N[l + 1] != 0) {\n const M = l >> 1; const I = N[l + 1]; const e = M << 4 | I; const b = W - I; let Z = N[l] << b; const m = Z + (1 << b);\n while (Z != m) { const J = A[Z] >>> 15 - W; R[J] = e; Z++; }\n }\n }\n }; H.H.l = function (N, W) {\n const R = H.H.m.r; const V = 15 - W; for (let n = 0; n < N.length;\n n += 2) { const A = N[n] << W - N[n + 1]; N[n] = R[A] >>> V; }\n }; H.H.M = function (N, W, R) { R <<= (W & 7); const V = W >>> 3; N[V] |= R; N[V + 1] |= R >>> 8; };\n H.H.I = function (N, W, R) { R <<= (W & 7); const V = W >>> 3; N[V] |= R; N[V + 1] |= R >>> 8; N[V + 2] |= R >>> 16; }; H.H.e = function (N, W, R) { return (N[W >>> 3] | N[(W >>> 3) + 1] << 8) >>> (W & 7) & (1 << R) - 1; };\n H.H.b = function (N, W, R) { return (N[W >>> 3] | N[(W >>> 3) + 1] << 8 | N[(W >>> 3) + 2] << 16) >>> (W & 7) & (1 << R) - 1; }; H.H.Z = function (N, W) { return (N[W >>> 3] | N[(W >>> 3) + 1] << 8 | N[(W >>> 3) + 2] << 16) >>> (W & 7); };\n H.H.i = function (N, W) { return (N[W >>> 3] | N[(W >>> 3) + 1] << 8 | N[(W >>> 3) + 2] << 16 | N[(W >>> 3) + 3] << 24) >>> (W & 7); }; H.H.m = (function () {\n const N = Uint16Array; const W = Uint32Array;\n return {\n K: new N(16), j: new N(16), X: [16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15], S: [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, 999, 999, 999], T: [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], q: new N(32), p: [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, 65535, 65535], z: [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], c: new W(32), J: new N(512), _: [], h: new N(32), $: [], w: new N(32768), C: [], v: [], d: new N(32768), D: [], u: new N(512), Q: [], r: new N(1 << 15), s: new W(286), Y: new W(30), a: new W(19), t: new W(15e3), k: new N(1 << 16), g: new N(1 << 15),\n };\n }());\n (function () {\n const N = H.H.m; const W = 1 << 15; for (var R = 0; R < W; R++) {\n let V = R; V = (V & 2863311530) >>> 1 | (V & 1431655765) << 1;\n V = (V & 3435973836) >>> 2 | (V & 858993459) << 2; V = (V & 4042322160) >>> 4 | (V & 252645135) << 4; V = (V & 4278255360) >>> 8 | (V & 16711935) << 8;\n N.r[R] = (V >>> 16 | V << 16) >>> 17;\n } function n(A, l, M) { while (l-- != 0)A.push(0, M); } for (var R = 0; R < 32; R++) {\n N.q[R] = N.S[R] << 3 | N.T[R];\n N.c[R] = N.p[R] << 4 | N.z[R];\n }n(N._, 144, 8); n(N._, 255 - 143, 9); n(N._, 279 - 255, 7); n(N._, 287 - 279, 8); H.H.n(N._, 9);\n H.H.A(N._, 9, N.J); H.H.l(N._, 9); n(N.$, 32, 5); H.H.n(N.$, 5); H.H.A(N.$, 5, N.h); H.H.l(N.$, 5); n(N.Q, 19, 0); n(N.C, 286, 0);\n n(N.D, 30, 0); n(N.v, 320, 0);\n }()); return H.H.N;\n}());\n\nUPNG.decode._readInterlace = function (data, out) {\n const w = out.width; const\n h = out.height;\n const bpp = UPNG.decode._getBPP(out); const cbpp = bpp >> 3; const\n bpl = Math.ceil(w * bpp / 8);\n const img = new Uint8Array(h * bpl);\n let di = 0;\n\n const starting_row = [0, 0, 4, 0, 2, 0, 1];\n const starting_col = [0, 4, 0, 2, 0, 1, 0];\n const row_increment = [8, 8, 8, 4, 4, 2, 2];\n const col_increment = [8, 8, 4, 4, 2, 2, 1];\n\n let pass = 0;\n while (pass < 7) {\n const ri = row_increment[pass]; const\n ci = col_increment[pass];\n let sw = 0; let\n sh = 0;\n let cr = starting_row[pass]; while (cr < h) { cr += ri; sh++; }\n let cc = starting_col[pass]; while (cc < w) { cc += ci; sw++; }\n const bpll = Math.ceil(sw * bpp / 8);\n UPNG.decode._filterZero(data, out, di, sw, sh);\n\n let y = 0; let\n row = starting_row[pass];\n while (row < h) {\n let col = starting_col[pass];\n let cdi = (di + y * bpll) << 3;\n\n while (col < w) {\n if (bpp == 1) {\n var val = data[cdi >> 3]; val = (val >> (7 - (cdi & 7))) & 1;\n img[row * bpl + (col >> 3)] |= (val << (7 - ((col & 7) << 0)));\n }\n if (bpp == 2) {\n var val = data[cdi >> 3]; val = (val >> (6 - (cdi & 7))) & 3;\n img[row * bpl + (col >> 2)] |= (val << (6 - ((col & 3) << 1)));\n }\n if (bpp == 4) {\n var val = data[cdi >> 3]; val = (val >> (4 - (cdi & 7))) & 15;\n img[row * bpl + (col >> 1)] |= (val << (4 - ((col & 1) << 2)));\n }\n if (bpp >= 8) {\n const ii = row * bpl + col * cbpp;\n for (let j = 0; j < cbpp; j++) img[ii + j] = data[(cdi >> 3) + j];\n }\n cdi += bpp; col += ci;\n }\n y++; row += ri;\n }\n if (sw * sh != 0) di += sh * (1 + bpll);\n pass += 1;\n }\n return img;\n};\n\nUPNG.decode._getBPP = function (out) {\n const noc = [1, null, 3, 1, 2, null, 4][out.ctype];\n return noc * out.depth;\n};\n\nUPNG.decode._filterZero = function (data, out, off, w, h) {\n let bpp = UPNG.decode._getBPP(out); const bpl = Math.ceil(w * bpp / 8); const\n paeth = UPNG.decode._paeth;\n bpp = Math.ceil(bpp / 8);\n\n let i = 0; let di = 1; let type = data[off]; let\n x = 0;\n\n if (type > 1) data[off] = [0, 0, 1][type - 2];\n if (type == 3) for (x = bpp; x < bpl; x++) data[x + 1] = (data[x + 1] + (data[x + 1 - bpp] >>> 1)) & 255;\n\n for (let y = 0; y < h; y++) {\n i = off + y * bpl; di = i + y + 1;\n type = data[di - 1]; x = 0;\n\n if (type == 0) for (; x < bpl; x++) data[i + x] = data[di + x];\n else if (type == 1) {\n for (; x < bpp; x++) data[i + x] = data[di + x];\n for (; x < bpl; x++) data[i + x] = (data[di + x] + data[i + x - bpp]);\n } else if (type == 2) { for (; x < bpl; x++) data[i + x] = (data[di + x] + data[i + x - bpl]); } else if (type == 3) {\n for (; x < bpp; x++) data[i + x] = (data[di + x] + (data[i + x - bpl] >>> 1));\n for (; x < bpl; x++) data[i + x] = (data[di + x] + ((data[i + x - bpl] + data[i + x - bpp]) >>> 1));\n } else {\n for (; x < bpp; x++) data[i + x] = (data[di + x] + paeth(0, data[i + x - bpl], 0));\n for (; x < bpl; x++) data[i + x] = (data[di + x] + paeth(data[i + x - bpp], data[i + x - bpl], data[i + x - bpp - bpl]));\n }\n }\n return data;\n};\n\nUPNG.decode._paeth = function (a, b, c) {\n const p = a + b - c; const pa = (p - a); const pb = (p - b); const\n pc = (p - c);\n if (pa * pa <= pb * pb && pa * pa <= pc * pc) return a;\n if (pb * pb <= pc * pc) return b;\n return c;\n};\n\nUPNG.decode._IHDR = function (data, offset, out) {\n const bin = UPNG._bin;\n out.width = bin.readUint(data, offset); offset += 4;\n out.height = bin.readUint(data, offset); offset += 4;\n out.depth = data[offset]; offset++;\n out.ctype = data[offset]; offset++;\n out.compress = data[offset]; offset++;\n out.filter = data[offset]; offset++;\n out.interlace = data[offset]; offset++;\n};\n\nUPNG._bin = {\n nextZero(data, p) { while (data[p] != 0) p++; return p; },\n readUshort(buff, p) { return (buff[p] << 8) | buff[p + 1]; },\n writeUshort(buff, p, n) { buff[p] = (n >> 8) & 255; buff[p + 1] = n & 255; },\n readUint(buff, p) { return (buff[p] * (256 * 256 * 256)) + ((buff[p + 1] << 16) | (buff[p + 2] << 8) | buff[p + 3]); },\n writeUint(buff, p, n) { buff[p] = (n >> 24) & 255; buff[p + 1] = (n >> 16) & 255; buff[p + 2] = (n >> 8) & 255; buff[p + 3] = n & 255; },\n readASCII(buff, p, l) { let s = ''; for (let i = 0; i < l; i++) s += String.fromCharCode(buff[p + i]); return s; },\n writeASCII(data, p, s) { for (let i = 0; i < s.length; i++) data[p + i] = s.charCodeAt(i); },\n readBytes(buff, p, l) { const arr = []; for (let i = 0; i < l; i++) arr.push(buff[p + i]); return arr; },\n pad(n) { return n.length < 2 ? `0${n}` : n; },\n readUTF8(buff, p, l) {\n let s = '';\n let ns;\n for (let i = 0; i < l; i++) s += `%${UPNG._bin.pad(buff[p + i].toString(16))}`;\n try { ns = decodeURIComponent(s); } catch (e) { return UPNG._bin.readASCII(buff, p, l); }\n return ns;\n },\n};\nUPNG._copyTile = function (sb, sw, sh, tb, tw, th, xoff, yoff, mode) {\n const w = Math.min(sw, tw); const\n h = Math.min(sh, th);\n let si = 0; let\n ti = 0;\n for (let y = 0; y < h; y++) {\n for (let x = 0; x < w; x++) {\n if (xoff >= 0 && yoff >= 0) { si = (y * sw + x) << 2; ti = ((yoff + y) * tw + xoff + x) << 2; } else { si = ((-yoff + y) * sw - xoff + x) << 2; ti = (y * tw + x) << 2; }\n\n if (mode == 0) { tb[ti] = sb[si]; tb[ti + 1] = sb[si + 1]; tb[ti + 2] = sb[si + 2]; tb[ti + 3] = sb[si + 3]; } else if (mode == 1) {\n var fa = sb[si + 3] * (1 / 255); var fr = sb[si] * fa; var fg = sb[si + 1] * fa; var\n fb = sb[si + 2] * fa;\n var ba = tb[ti + 3] * (1 / 255); var br = tb[ti] * ba; var bg = tb[ti + 1] * ba; var\n bb = tb[ti + 2] * ba;\n\n const ifa = 1 - fa; const oa = fa + ba * ifa; const\n ioa = (oa == 0 ? 0 : 1 / oa);\n tb[ti + 3] = 255 * oa;\n tb[ti + 0] = (fr + br * ifa) * ioa;\n tb[ti + 1] = (fg + bg * ifa) * ioa;\n tb[ti + 2] = (fb + bb * ifa) * ioa;\n } else if (mode == 2) {\t// copy only differences, otherwise zero\n var fa = sb[si + 3]; var fr = sb[si]; var fg = sb[si + 1]; var\n fb = sb[si + 2];\n var ba = tb[ti + 3]; var br = tb[ti]; var bg = tb[ti + 1]; var\n bb = tb[ti + 2];\n if (fa == ba && fr == br && fg == bg && fb == bb) { tb[ti] = 0; tb[ti + 1] = 0; tb[ti + 2] = 0; tb[ti + 3] = 0; } else { tb[ti] = fr; tb[ti + 1] = fg; tb[ti + 2] = fb; tb[ti + 3] = fa; }\n } else if (mode == 3) {\t// check if can be blended\n var fa = sb[si + 3]; var fr = sb[si]; var fg = sb[si + 1]; var\n fb = sb[si + 2];\n var ba = tb[ti + 3]; var br = tb[ti]; var bg = tb[ti + 1]; var\n bb = tb[ti + 2];\n if (fa == ba && fr == br && fg == bg && fb == bb) continue;\n // if(fa!=255 && ba!=0) return false;\n if (fa < 220 && ba > 20) return false;\n }\n }\n }\n return true;\n};\n\nUPNG.encode = function (bufs, w, h, ps, dels, tabs, forbidPlte) {\n if (ps == null) ps = 0;\n if (forbidPlte == null) forbidPlte = false;\n\n const nimg = UPNG.encode.compress(bufs, w, h, ps, [false, false, false, 0, forbidPlte]);\n UPNG.encode.compressPNG(nimg, -1);\n\n return UPNG.encode._main(nimg, w, h, dels, tabs);\n};\n\nUPNG.encodeLL = function (bufs, w, h, cc, ac, depth, dels, tabs) {\n const nimg = { ctype: 0 + (cc == 1 ? 0 : 2) + (ac == 0 ? 0 : 4), depth, frames: [] };\n\n const time = Date.now();\n const bipp = (cc + ac) * depth; const\n bipl = bipp * w;\n for (let i = 0; i < bufs.length; i++) {\n nimg.frames.push({\n rect: {\n x: 0, y: 0, width: w, height: h,\n },\n img: new Uint8Array(bufs[i]),\n blend: 0,\n dispose: 1,\n bpp: Math.ceil(bipp / 8),\n bpl: Math.ceil(bipl / 8),\n });\n }\n\n UPNG.encode.compressPNG(nimg, 0, true);\n\n const out = UPNG.encode._main(nimg, w, h, dels, tabs);\n return out;\n};\n\nUPNG.encode._main = function (nimg, w, h, dels, tabs) {\n if (tabs == null) tabs = {};\n const { crc } = UPNG.crc;\n const wUi = UPNG._bin.writeUint;\n const wUs = UPNG._bin.writeUshort;\n const wAs = UPNG._bin.writeASCII;\n let offset = 8; const anim = nimg.frames.length > 1; let\n pltAlpha = false;\n\n let leng = 8 + (16 + 5 + 4) /* + (9+4) */ + (anim ? 20 : 0);\n if (tabs.sRGB != null) leng += 8 + 1 + 4;\n if (tabs.pHYs != null) leng += 8 + 9 + 4;\n if (nimg.ctype == 3) {\n var dl = nimg.plte.length;\n for (var i = 0; i < dl; i++) if ((nimg.plte[i] >>> 24) != 255) pltAlpha = true;\n leng += (8 + dl * 3 + 4) + (pltAlpha ? (8 + dl * 1 + 4) : 0);\n }\n for (var j = 0; j < nimg.frames.length; j++) {\n var fr = nimg.frames[j];\n if (anim) leng += 38;\n leng += fr.cimg.length + 12;\n if (j != 0) leng += 4;\n }\n leng += 12;\n\n const data = new Uint8Array(leng);\n const wr = [0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a];\n for (var i = 0; i < 8; i++) data[i] = wr[i];\n\n wUi(data, offset, 13); offset += 4;\n wAs(data, offset, 'IHDR'); offset += 4;\n wUi(data, offset, w); offset += 4;\n wUi(data, offset, h); offset += 4;\n data[offset] = nimg.depth; offset++; // depth\n data[offset] = nimg.ctype; offset++; // ctype\n data[offset] = 0; offset++; // compress\n data[offset] = 0; offset++; // filter\n data[offset] = 0; offset++; // interlace\n wUi(data, offset, crc(data, offset - 17, 17)); offset += 4; // crc\n\n // 13 bytes to say, that it is sRGB\n if (tabs.sRGB != null) {\n wUi(data, offset, 1); offset += 4;\n wAs(data, offset, 'sRGB'); offset += 4;\n data[offset] = tabs.sRGB; offset++;\n wUi(data, offset, crc(data, offset - 5, 5)); offset += 4; // crc\n }\n if (tabs.pHYs != null) {\n wUi(data, offset, 9); offset += 4;\n wAs(data, offset, 'pHYs'); offset += 4;\n wUi(data, offset, tabs.pHYs[0]); offset += 4;\n wUi(data, offset, tabs.pHYs[1]); offset += 4;\n data[offset] = tabs.pHYs[2];\t\t\toffset++;\n wUi(data, offset, crc(data, offset - 13, 13)); offset += 4; // crc\n }\n\n if (anim) {\n wUi(data, offset, 8); offset += 4;\n wAs(data, offset, 'acTL'); offset += 4;\n wUi(data, offset, nimg.frames.length); offset += 4;\n wUi(data, offset, tabs.loop != null ? tabs.loop : 0); offset += 4;\n wUi(data, offset, crc(data, offset - 12, 12)); offset += 4; // crc\n }\n\n if (nimg.ctype == 3) {\n var dl = nimg.plte.length;\n wUi(data, offset, dl * 3); offset += 4;\n wAs(data, offset, 'PLTE'); offset += 4;\n for (var i = 0; i < dl; i++) {\n const ti = i * 3; const c = nimg.plte[i]; const r = (c) & 255; const g = (c >>> 8) & 255; const\n b = (c >>> 16) & 255;\n data[offset + ti + 0] = r; data[offset + ti + 1] = g; data[offset + ti + 2] = b;\n }\n offset += dl * 3;\n wUi(data, offset, crc(data, offset - dl * 3 - 4, dl * 3 + 4)); offset += 4; // crc\n\n if (pltAlpha) {\n wUi(data, offset, dl); offset += 4;\n wAs(data, offset, 'tRNS'); offset += 4;\n for (var i = 0; i < dl; i++) data[offset + i] = (nimg.plte[i] >>> 24) & 255;\n offset += dl;\n wUi(data, offset, crc(data, offset - dl - 4, dl + 4)); offset += 4; // crc\n }\n }\n\n let fi = 0;\n for (var j = 0; j < nimg.frames.length; j++) {\n var fr = nimg.frames[j];\n if (anim) {\n wUi(data, offset, 26); offset += 4;\n wAs(data, offset, 'fcTL'); offset += 4;\n wUi(data, offset, fi++); offset += 4;\n wUi(data, offset, fr.rect.width); offset += 4;\n wUi(data, offset, fr.rect.height); offset += 4;\n wUi(data, offset, fr.rect.x); offset += 4;\n wUi(data, offset, fr.rect.y); offset += 4;\n wUs(data, offset, dels[j]); offset += 2;\n wUs(data, offset, 1000); offset += 2;\n data[offset] = fr.dispose; offset++;\t// dispose\n data[offset] = fr.blend; offset++;\t// blend\n wUi(data, offset, crc(data, offset - 30, 30)); offset += 4; // crc\n }\n\n const imgd = fr.cimg; var\n dl = imgd.length;\n wUi(data, offset, dl + (j == 0 ? 0 : 4)); offset += 4;\n const ioff = offset;\n wAs(data, offset, (j == 0) ? 'IDAT' : 'fdAT'); offset += 4;\n if (j != 0) { wUi(data, offset, fi++); offset += 4; }\n data.set(imgd, offset);\n offset += dl;\n wUi(data, offset, crc(data, ioff, offset - ioff)); offset += 4; // crc\n }\n\n wUi(data, offset, 0); offset += 4;\n wAs(data, offset, 'IEND'); offset += 4;\n wUi(data, offset, crc(data, offset - 4, 4)); offset += 4; // crc\n\n return data.buffer;\n};\n\nUPNG.encode.compressPNG = function (out, filter, levelZero) {\n for (let i = 0; i < out.frames.length; i++) {\n const frm = out.frames[i]; const nw = frm.rect.width; const\n nh = frm.rect.height;\n const fdata = new Uint8Array(nh * frm.bpl + nh);\n frm.cimg = UPNG.encode._filterZero(frm.img, nh, frm.bpp, frm.bpl, fdata, filter, levelZero);\n }\n};\n\nUPNG.encode.compress = function (bufs, w, h, ps, prms) // prms: onlyBlend, minBits, forbidPlte\n{\n // var time = Date.now();\n const onlyBlend = prms[0]; const evenCrd = prms[1]; const forbidPrev = prms[2]; const minBits = prms[3]; const\n forbidPlte = prms[4];\n\n let ctype = 6; let depth = 8; let\n alphaAnd = 255;\n\n for (var j = 0; j < bufs.length; j++) { // when not quantized, other frames can contain colors, that are not in an initial frame\n const img = new Uint8Array(bufs[j]); var\n ilen = img.length;\n for (var i = 0; i < ilen; i += 4) alphaAnd &= img[i + 3];\n }\n const gotAlpha = (alphaAnd != 255);\n\n // console.log(\"alpha check\", Date.now()-time); time = Date.now();\n\n // var brute = gotAlpha && forGIF;\t\t// brute : frames can only be copied, not \"blended\"\n const frms = UPNG.encode.framize(bufs, w, h, onlyBlend, evenCrd, forbidPrev);\n // console.log(\"framize\", Date.now()-time); time = Date.now();\n\n const cmap = {}; const plte = []; const\n inds = [];\n\n if (ps != 0) {\n const nbufs = []; for (var i = 0; i < frms.length; i++) nbufs.push(frms[i].img.buffer);\n\n const abuf = UPNG.encode.concatRGBA(nbufs); const\n qres = UPNG.quantize(abuf, ps); // console.log(qres);\n let cof = 0; const\n bb = new Uint8Array(qres.abuf);\n for (var i = 0; i < frms.length; i++) {\n var ti = frms[i].img; const\n bln = ti.length; inds.push(new Uint8Array(qres.inds.buffer, cof >> 2, bln >> 2));\n for (var j = 0; j < bln; j += 4) { ti[j] = bb[cof + j]; ti[j + 1] = bb[cof + j + 1]; ti[j + 2] = bb[cof + j + 2]; ti[j + 3] = bb[cof + j + 3]; } cof += bln;\n }\n\n for (var i = 0; i < qres.plte.length; i++) plte.push(qres.plte[i].est.rgba);\n // console.log(\"quantize\", Date.now()-time); time = Date.now();\n } else {\n // what if ps==0, but there are <=256 colors? we still need to detect, if the palette could be used\n for (var j = 0; j < frms.length; j++) { // when not quantized, other frames can contain colors, that are not in an initial frame\n var frm = frms[j]; const img32 = new Uint32Array(frm.img.buffer); var nw = frm.rect.width; var\n ilen = img32.length;\n const ind = new Uint8Array(ilen); inds.push(ind);\n for (var i = 0; i < ilen; i++) {\n const c = img32[i];\n if (i != 0 && c == img32[i - 1]) ind[i] = ind[i - 1];\n else if (i > nw && c == img32[i - nw]) ind[i] = ind[i - nw];\n else {\n let cmc = cmap[c];\n if (cmc == null) { cmap[c] = cmc = plte.length; plte.push(c); if (plte.length >= 300) break; }\n ind[i] = cmc;\n }\n }\n }\n // console.log(\"make palette\", Date.now()-time); time = Date.now();\n }\n\n const cc = plte.length; // console.log(\"colors:\",cc);\n if (cc <= 256 && forbidPlte == false) {\n if (cc <= 2) depth = 1; else if (cc <= 4) depth = 2; else if (cc <= 16) depth = 4; else depth = 8;\n depth = Math.max(depth, minBits);\n }\n\n for (var j = 0; j < frms.length; j++) {\n var frm = frms[j]; const nx = frm.rect.x; const ny = frm.rect.y; var nw = frm.rect.width; const\n nh = frm.rect.height;\n let cimg = frm.img; const\n cimg32 = new Uint32Array(cimg.buffer);\n let bpl = 4 * nw; let\n bpp = 4;\n if (cc <= 256 && forbidPlte == false) {\n bpl = Math.ceil(depth * nw / 8);\n var nimg = new Uint8Array(bpl * nh);\n const inj = inds[j];\n for (let y = 0; y < nh; y++) {\n var i = y * bpl; const\n ii = y * nw;\n if (depth == 8) for (var x = 0; x < nw; x++) nimg[i + (x)] = (inj[ii + x]);\n else if (depth == 4) for (var x = 0; x < nw; x++) nimg[i + (x >> 1)] |= (inj[ii + x] << (4 - (x & 1) * 4));\n else if (depth == 2) for (var x = 0; x < nw; x++) nimg[i + (x >> 2)] |= (inj[ii + x] << (6 - (x & 3) * 2));\n else if (depth == 1) for (var x = 0; x < nw; x++) nimg[i + (x >> 3)] |= (inj[ii + x] << (7 - (x & 7) * 1));\n }\n cimg = nimg; ctype = 3; bpp = 1;\n } else if (gotAlpha == false && frms.length == 1) {\t// some next \"reduced\" frames may contain alpha for blending\n var nimg = new Uint8Array(nw * nh * 3); const\n area = nw * nh;\n for (var i = 0; i < area; i++) {\n var ti = i * 3; const\n qi = i * 4; nimg[ti] = cimg[qi]; nimg[ti + 1] = cimg[qi + 1]; nimg[ti + 2] = cimg[qi + 2];\n }\n cimg = nimg; ctype = 2; bpp = 3; bpl = 3 * nw;\n }\n frm.img = cimg; frm.bpl = bpl; frm.bpp = bpp;\n }\n // console.log(\"colors => palette indices\", Date.now()-time); time = Date.now();\n\n return {\n ctype, depth, plte, frames: frms,\n };\n};\nUPNG.encode.framize = function (bufs, w, h, alwaysBlend, evenCrd, forbidPrev) {\n /* DISPOSE\n - 0 : no change\n - 1 : clear to transparent\n - 2 : retstore to content before rendering (previous frame disposed)\n BLEND\n - 0 : replace\n - 1 : blend\n */\n const frms = [];\n for (var j = 0; j < bufs.length; j++) {\n const cimg = new Uint8Array(bufs[j]); const\n cimg32 = new Uint32Array(cimg.buffer);\n var nimg;\n\n let nx = 0; let ny = 0; let nw = w; let nh = h; let\n blend = alwaysBlend ? 1 : 0;\n if (j != 0) {\n const tlim = (forbidPrev || alwaysBlend || j == 1 || frms[j - 2].dispose != 0) ? 1 : 2; let tstp = 0; let\n tarea = 1e9;\n for (let it = 0; it < tlim; it++) {\n var pimg = new Uint8Array(bufs[j - 1 - it]); const\n p32 = new Uint32Array(bufs[j - 1 - it]);\n let mix = w; let miy = h; let max = -1; let may = -1;\n for (let y = 0; y < h; y++) {\n for (let x = 0; x < w; x++) {\n var i = y * w + x;\n if (cimg32[i] != p32[i]) {\n if (x < mix) mix = x; if (x > max) max = x;\n if (y < miy) miy = y; if (y > may) may = y;\n }\n }\n }\n if (max == -1) mix = miy = max = may = 0;\n if (evenCrd) { if ((mix & 1) == 1)mix--; if ((miy & 1) == 1)miy--; }\n const sarea = (max - mix + 1) * (may - miy + 1);\n if (sarea < tarea) {\n tarea = sarea; tstp = it;\n nx = mix; ny = miy; nw = max - mix + 1; nh = may - miy + 1;\n }\n }\n\n // alwaysBlend: pokud zjistím, že blendit nelze, nastavím předchozímu snímku dispose=1. Zajistím, aby obsahoval můj obdélník.\n var pimg = new Uint8Array(bufs[j - 1 - tstp]);\n if (tstp == 1) frms[j - 1].dispose = 2;\n\n nimg = new Uint8Array(nw * nh * 4);\n UPNG._copyTile(pimg, w, h, nimg, nw, nh, -nx, -ny, 0);\n\n blend = UPNG._copyTile(cimg, w, h, nimg, nw, nh, -nx, -ny, 3) ? 1 : 0;\n if (blend == 1) {\n UPNG.encode._prepareDiff(cimg, w, h, nimg, {\n x: nx, y: ny, width: nw, height: nh,\n });\n } else UPNG._copyTile(cimg, w, h, nimg, nw, nh, -nx, -ny, 0);\n // UPNG._copyTile(cimg,w,h, nimg,nw,nh, -nx,-ny, blend==1?2:0);\n } else nimg = cimg.slice(0);\t// img may be rewritten further ... don't rewrite input\n\n frms.push({\n rect: {\n x: nx, y: ny, width: nw, height: nh,\n },\n img: nimg,\n blend,\n dispose: 0,\n });\n }\n\n if (alwaysBlend) {\n for (var j = 0; j < frms.length; j++) {\n var frm = frms[j]; if (frm.blend == 1) continue;\n const r0 = frm.rect; const\n r1 = frms[j - 1].rect;\n const miX = Math.min(r0.x, r1.x); const\n miY = Math.min(r0.y, r1.y);\n const maX = Math.max(r0.x + r0.width, r1.x + r1.width); const\n maY = Math.max(r0.y + r0.height, r1.y + r1.height);\n const r = {\n x: miX, y: miY, width: maX - miX, height: maY - miY,\n };\n\n frms[j - 1].dispose = 1;\n if (j - 1 != 0) { UPNG.encode._updateFrame(bufs, w, h, frms, j - 1, r, evenCrd); }\n UPNG.encode._updateFrame(bufs, w, h, frms, j, r, evenCrd);\n }\n }\n let area = 0;\n if (bufs.length != 1) {\n for (var i = 0; i < frms.length; i++) {\n var frm = frms[i];\n area += frm.rect.width * frm.rect.height;\n // if(i==0 || frm.blend!=1) continue;\n // var ob = new Uint8Array(\n // console.log(frm.blend, frm.dispose, frm.rect);\n }\n }\n // if(area!=0) console.log(area);\n return frms;\n};\nUPNG.encode._updateFrame = function (bufs, w, h, frms, i, r, evenCrd) {\n const U8 = Uint8Array; const\n U32 = Uint32Array;\n const pimg = new U8(bufs[i - 1]); const pimg32 = new U32(bufs[i - 1]); const\n nimg = i + 1 < bufs.length ? new U8(bufs[i + 1]) : null;\n const cimg = new U8(bufs[i]); const\n cimg32 = new U32(cimg.buffer);\n\n let mix = w; let miy = h; let max = -1; let may = -1;\n for (let y = 0; y < r.height; y++) {\n for (let x = 0; x < r.width; x++) {\n const cx = r.x + x; const\n cy = r.y + y;\n const j = cy * w + cx; const\n cc = cimg32[j];\n // no need to draw transparency, or to dispose it. Or, if writing the same color and the next one does not need transparency.\n if (cc == 0 || (frms[i - 1].dispose == 0 && pimg32[j] == cc && (nimg == null || nimg[j * 4 + 3] != 0))/**/) {} else {\n if (cx < mix) mix = cx; if (cx > max) max = cx;\n if (cy < miy) miy = cy; if (cy > may) may = cy;\n }\n }\n }\n if (max == -1) mix = miy = max = may = 0;\n if (evenCrd) { if ((mix & 1) == 1)mix--; if ((miy & 1) == 1)miy--; }\n r = {\n x: mix, y: miy, width: max - mix + 1, height: may - miy + 1,\n };\n\n const fr = frms[i]; fr.rect = r; fr.blend = 1; fr.img = new Uint8Array(r.width * r.height * 4);\n if (frms[i - 1].dispose == 0) {\n UPNG._copyTile(pimg, w, h, fr.img, r.width, r.height, -r.x, -r.y, 0);\n UPNG.encode._prepareDiff(cimg, w, h, fr.img, r);\n // UPNG._copyTile(cimg,w,h, fr.img,r.width,r.height, -r.x,-r.y, 2);\n } else { UPNG._copyTile(cimg, w, h, fr.img, r.width, r.height, -r.x, -r.y, 0); }\n};\nUPNG.encode._prepareDiff = function (cimg, w, h, nimg, rec) {\n UPNG._copyTile(cimg, w, h, nimg, rec.width, rec.height, -rec.x, -rec.y, 2);\n /*\n var n32 = new Uint32Array(nimg.buffer);\n var og = new Uint8Array(rec.width*rec.height*4), o32 = new Uint32Array(og.buffer);\n UPNG._copyTile(cimg,w,h, og,rec.width,rec.height, -rec.x,-rec.y, 0);\n for(var i=4; i>>2]==o32[(i>>>2)-1]) {\n n32[i>>>2]=o32[i>>>2];\n //var j = i, c=p32[(i>>>2)-1];\n //while(p32[j>>>2]==c) { n32[j>>>2]=c; j+=4; }\n }\n }\n for(var i=nimg.length-8; i>0; i-=4) {\n if(nimg[i+7]!=0 && nimg[i+3]==0 && o32[i>>>2]==o32[(i>>>2)+1]) {\n n32[i>>>2]=o32[i>>>2];\n //var j = i, c=p32[(i>>>2)-1];\n //while(p32[j>>>2]==c) { n32[j>>>2]=c; j+=4; }\n }\n } */\n};\n\nUPNG.encode._filterZero = function (img, h, bpp, bpl, data, filter, levelZero) {\n const fls = []; let\n ftry = [0, 1, 2, 3, 4];\n if (filter != -1) ftry = [filter];\n else if (h * bpl > 500000 || bpp == 1) ftry = [0];\n let opts; if (levelZero) opts = { level: 0 };\n\n // var CMPR = (data.length>10e6 && typeof UZIP !== 'undefined') ? UZIP : pako;\n const CMPR = UZIP;\n\n const time = Date.now();\n for (var i = 0; i < ftry.length; i++) {\n for (let y = 0; y < h; y++) UPNG.encode._filterLine(data, img, y, bpl, bpp, ftry[i]);\n // var nimg = new Uint8Array(data.length);\n // var sz = UZIP.F.deflate(data, nimg); fls.push(nimg.slice(0,sz));\n // var dfl = pako[\"deflate\"](data), dl=dfl.length-4;\n // var crc = (dfl[dl+3]<<24)|(dfl[dl+2]<<16)|(dfl[dl+1]<<8)|(dfl[dl+0]<<0);\n // console.log(crc, UZIP.adler(data,2,data.length-6));\n fls.push(CMPR.deflate(data, opts));\n }\n\n let ti; let\n tsize = 1e9;\n for (var i = 0; i < fls.length; i++) if (fls[i].length < tsize) { ti = i; tsize = fls[i].length; }\n return fls[ti];\n};\nUPNG.encode._filterLine = function (data, img, y, bpl, bpp, type) {\n const i = y * bpl; let di = i + y; const\n paeth = UPNG.decode._paeth;\n data[di] = type; di++;\n\n if (type == 0) {\n if (bpl < 500) for (var x = 0; x < bpl; x++) data[di + x] = img[i + x];\n else data.set(new Uint8Array(img.buffer, i, bpl), di);\n } else if (type == 1) {\n for (var x = 0; x < bpp; x++) data[di + x] = img[i + x];\n for (var x = bpp; x < bpl; x++) data[di + x] = (img[i + x] - img[i + x - bpp] + 256) & 255;\n } else if (y == 0) {\n for (var x = 0; x < bpp; x++) data[di + x] = img[i + x];\n\n if (type == 2) for (var x = bpp; x < bpl; x++) data[di + x] = img[i + x];\n if (type == 3) for (var x = bpp; x < bpl; x++) data[di + x] = (img[i + x] - (img[i + x - bpp] >> 1) + 256) & 255;\n if (type == 4) for (var x = bpp; x < bpl; x++) data[di + x] = (img[i + x] - paeth(img[i + x - bpp], 0, 0) + 256) & 255;\n } else {\n if (type == 2) { for (var x = 0; x < bpl; x++) data[di + x] = (img[i + x] + 256 - img[i + x - bpl]) & 255; }\n if (type == 3) {\n for (var x = 0; x < bpp; x++) data[di + x] = (img[i + x] + 256 - (img[i + x - bpl] >> 1)) & 255;\n for (var x = bpp; x < bpl; x++) data[di + x] = (img[i + x] + 256 - ((img[i + x - bpl] + img[i + x - bpp]) >> 1)) & 255;\n }\n if (type == 4) {\n for (var x = 0; x < bpp; x++) data[di + x] = (img[i + x] + 256 - paeth(0, img[i + x - bpl], 0)) & 255;\n for (var x = bpp; x < bpl; x++) data[di + x] = (img[i + x] + 256 - paeth(img[i + x - bpp], img[i + x - bpl], img[i + x - bpp - bpl])) & 255;\n }\n }\n};\n\nUPNG.crc = {\n table: (function () {\n const tab = new Uint32Array(256);\n for (let n = 0; n < 256; n++) {\n let c = n;\n for (let k = 0; k < 8; k++) {\n if (c & 1) c = 0xedb88320 ^ (c >>> 1);\n else c >>>= 1;\n }\n tab[n] = c;\n }\n return tab;\n }()),\n update(c, buf, off, len) {\n for (let i = 0; i < len; i++) c = UPNG.crc.table[(c ^ buf[off + i]) & 0xff] ^ (c >>> 8);\n return c;\n },\n crc(b, o, l) { return UPNG.crc.update(0xffffffff, b, o, l) ^ 0xffffffff; },\n};\n\nUPNG.quantize = function (abuf, ps) {\n const oimg = new Uint8Array(abuf); const nimg = oimg.slice(0); const\n nimg32 = new Uint32Array(nimg.buffer);\n\n const KD = UPNG.quantize.getKDtree(nimg, ps);\n const root = KD[0]; const\n leafs = KD[1];\n\n const { planeDst } = UPNG.quantize;\n const sb = oimg; const tb = nimg32; const\n len = sb.length;\n\n const inds = new Uint8Array(oimg.length >> 2); let\n nd;\n if (oimg.length < 20e6) // precise, but slow :(\n {\n for (var i = 0; i < len; i += 4) {\n var r = sb[i] * (1 / 255); var g = sb[i + 1] * (1 / 255); var b = sb[i + 2] * (1 / 255); var\n a = sb[i + 3] * (1 / 255);\n\n nd = UPNG.quantize.getNearest(root, r, g, b, a);\n inds[i >> 2] = nd.ind; tb[i >> 2] = nd.est.rgba;\n }\n } else {\n for (var i = 0; i < len; i += 4) {\n var r = sb[i] * (1 / 255); var g = sb[i + 1] * (1 / 255); var b = sb[i + 2] * (1 / 255); var\n a = sb[i + 3] * (1 / 255);\n\n nd = root; while (nd.left) nd = (planeDst(nd.est, r, g, b, a) <= 0) ? nd.left : nd.right;\n inds[i >> 2] = nd.ind; tb[i >> 2] = nd.est.rgba;\n }\n }\n return { abuf: nimg.buffer, inds, plte: leafs };\n};\n\nUPNG.quantize.getKDtree = function (nimg, ps, err) {\n if (err == null) err = 0.0001;\n const nimg32 = new Uint32Array(nimg.buffer);\n\n const root = {\n i0: 0, i1: nimg.length, bst: null, est: null, tdst: 0, left: null, right: null,\n }; // basic statistic, extra statistic\n root.bst = UPNG.quantize.stats(nimg, root.i0, root.i1); root.est = UPNG.quantize.estats(root.bst);\n const leafs = [root];\n\n while (leafs.length < ps) {\n let maxL = 0; let\n mi = 0;\n for (var i = 0; i < leafs.length; i++) if (leafs[i].est.L > maxL) { maxL = leafs[i].est.L; mi = i; }\n if (maxL < err) break;\n const node = leafs[mi];\n\n const s0 = UPNG.quantize.splitPixels(nimg, nimg32, node.i0, node.i1, node.est.e, node.est.eMq255);\n const s0wrong = (node.i0 >= s0 || node.i1 <= s0);\n // console.log(maxL, leafs.length, mi);\n if (s0wrong) { node.est.L = 0; continue; }\n\n const ln = {\n i0: node.i0, i1: s0, bst: null, est: null, tdst: 0, left: null, right: null,\n }; ln.bst = UPNG.quantize.stats(nimg, ln.i0, ln.i1);\n ln.est = UPNG.quantize.estats(ln.bst);\n const rn = {\n i0: s0, i1: node.i1, bst: null, est: null, tdst: 0, left: null, right: null,\n }; rn.bst = { R: [], m: [], N: node.bst.N - ln.bst.N };\n for (var i = 0; i < 16; i++) rn.bst.R[i] = node.bst.R[i] - ln.bst.R[i];\n for (var i = 0; i < 4; i++) rn.bst.m[i] = node.bst.m[i] - ln.bst.m[i];\n rn.est = UPNG.quantize.estats(rn.bst);\n\n node.left = ln; node.right = rn;\n leafs[mi] = ln; leafs.push(rn);\n }\n leafs.sort((a, b) => b.bst.N - a.bst.N);\n for (var i = 0; i < leafs.length; i++) leafs[i].ind = i;\n return [root, leafs];\n};\n\nUPNG.quantize.getNearest = function (nd, r, g, b, a) {\n if (nd.left == null) { nd.tdst = UPNG.quantize.dist(nd.est.q, r, g, b, a); return nd; }\n const planeDst = UPNG.quantize.planeDst(nd.est, r, g, b, a);\n\n let node0 = nd.left; let\n node1 = nd.right;\n if (planeDst > 0) { node0 = nd.right; node1 = nd.left; }\n\n const ln = UPNG.quantize.getNearest(node0, r, g, b, a);\n if (ln.tdst <= planeDst * planeDst) return ln;\n const rn = UPNG.quantize.getNearest(node1, r, g, b, a);\n return rn.tdst < ln.tdst ? rn : ln;\n};\nUPNG.quantize.planeDst = function (est, r, g, b, a) { const { e } = est; return e[0] * r + e[1] * g + e[2] * b + e[3] * a - est.eMq; };\nUPNG.quantize.dist = function (q, r, g, b, a) {\n const d0 = r - q[0]; const d1 = g - q[1]; const d2 = b - q[2]; const\n d3 = a - q[3]; return d0 * d0 + d1 * d1 + d2 * d2 + d3 * d3;\n};\n\nUPNG.quantize.splitPixels = function (nimg, nimg32, i0, i1, e, eMq) {\n const { vecDot } = UPNG.quantize;\n i1 -= 4;\n const shfs = 0;\n while (i0 < i1) {\n while (vecDot(nimg, i0, e) <= eMq) i0 += 4;\n while (vecDot(nimg, i1, e) > eMq) i1 -= 4;\n if (i0 >= i1) break;\n\n const t = nimg32[i0 >> 2]; nimg32[i0 >> 2] = nimg32[i1 >> 2]; nimg32[i1 >> 2] = t;\n\n i0 += 4; i1 -= 4;\n }\n while (vecDot(nimg, i0, e) > eMq) i0 -= 4;\n return i0 + 4;\n};\nUPNG.quantize.vecDot = function (nimg, i, e) {\n return nimg[i] * e[0] + nimg[i + 1] * e[1] + nimg[i + 2] * e[2] + nimg[i + 3] * e[3];\n};\nUPNG.quantize.stats = function (nimg, i0, i1) {\n const R = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];\n const m = [0, 0, 0, 0];\n const N = (i1 - i0) >> 2;\n for (let i = i0; i < i1; i += 4) {\n const r = nimg[i] * (1 / 255); const g = nimg[i + 1] * (1 / 255); const b = nimg[i + 2] * (1 / 255); const\n a = nimg[i + 3] * (1 / 255);\n // var r = nimg[i], g = nimg[i+1], b = nimg[i+2], a = nimg[i+3];\n m[0] += r; m[1] += g; m[2] += b; m[3] += a;\n\n R[0] += r * r; R[1] += r * g; R[2] += r * b; R[3] += r * a;\n R[5] += g * g; R[6] += g * b; R[7] += g * a;\n R[10] += b * b; R[11] += b * a;\n R[15] += a * a;\n }\n R[4] = R[1]; R[8] = R[2]; R[9] = R[6]; R[12] = R[3]; R[13] = R[7]; R[14] = R[11];\n\n return { R, m, N };\n};\nUPNG.quantize.estats = function (stats) {\n const { R } = stats;\n const { m } = stats;\n const { N } = stats;\n\n // when all samples are equal, but N is large (millions), the Rj can be non-zero ( 0.0003.... - precission error)\n const m0 = m[0]; const m1 = m[1]; const m2 = m[2]; const m3 = m[3]; const\n iN = (N == 0 ? 0 : 1 / N);\n const Rj = [\n R[0] - m0 * m0 * iN, R[1] - m0 * m1 * iN, R[2] - m0 * m2 * iN, R[3] - m0 * m3 * iN,\n R[4] - m1 * m0 * iN, R[5] - m1 * m1 * iN, R[6] - m1 * m2 * iN, R[7] - m1 * m3 * iN,\n R[8] - m2 * m0 * iN, R[9] - m2 * m1 * iN, R[10] - m2 * m2 * iN, R[11] - m2 * m3 * iN,\n R[12] - m3 * m0 * iN, R[13] - m3 * m1 * iN, R[14] - m3 * m2 * iN, R[15] - m3 * m3 * iN,\n ];\n\n const A = Rj; const\n M = UPNG.M4;\n let b = [Math.random(), Math.random(), Math.random(), Math.random()]; let mi = 0; let\n tmi = 0;\n\n if (N != 0) {\n for (let i = 0; i < 16; i++) {\n b = M.multVec(A, b); tmi = Math.sqrt(M.dot(b, b)); b = M.sml(1 / tmi, b);\n if (i != 0 && Math.abs(tmi - mi) < 1e-9) break; mi = tmi;\n }\n }\n // b = [0,0,1,0]; mi=N;\n const q = [m0 * iN, m1 * iN, m2 * iN, m3 * iN];\n const eMq255 = M.dot(M.sml(255, q), b);\n\n return {\n Cov: Rj,\n q,\n e: b,\n L: mi,\n eMq255,\n eMq: M.dot(b, q),\n rgba: (((Math.round(255 * q[3]) << 24) | (Math.round(255 * q[2]) << 16) | (Math.round(255 * q[1]) << 8) | (Math.round(255 * q[0]) << 0)) >>> 0),\n };\n};\nUPNG.M4 = {\n multVec(m, v) {\n return [\n m[0] * v[0] + m[1] * v[1] + m[2] * v[2] + m[3] * v[3],\n m[4] * v[0] + m[5] * v[1] + m[6] * v[2] + m[7] * v[3],\n m[8] * v[0] + m[9] * v[1] + m[10] * v[2] + m[11] * v[3],\n m[12] * v[0] + m[13] * v[1] + m[14] * v[2] + m[15] * v[3],\n ];\n },\n dot(x, y) { return x[0] * y[0] + x[1] * y[1] + x[2] * y[2] + x[3] * y[3]; },\n sml(a, y) { return [a * y[0], a * y[1], a * y[2], a * y[3]]; },\n};\n\nUPNG.encode.concatRGBA = function (bufs) {\n let tlen = 0;\n for (var i = 0; i < bufs.length; i++) tlen += bufs[i].byteLength;\n const nimg = new Uint8Array(tlen); let\n noff = 0;\n for (var i = 0; i < bufs.length; i++) {\n const img = new Uint8Array(bufs[i]); const\n il = img.length;\n for (let j = 0; j < il; j += 4) {\n let r = img[j]; let g = img[j + 1]; let b = img[j + 2]; const\n a = img[j + 3];\n if (a == 0) r = g = b = 0;\n nimg[noff + j] = r; nimg[noff + j + 1] = g; nimg[noff + j + 2] = b; nimg[noff + j + 3] = a;\n }\n noff += il;\n }\n return nimg.buffer;\n};\n\nexport default UPNG;\n","export default {\n CHROME: 'CHROME',\n FIREFOX: 'FIREFOX',\n DESKTOP_SAFARI: 'DESKTOP_SAFARI',\n IE: 'IE',\n MOBILE_SAFARI: 'MOBILE_SAFARI',\n ETC: 'ETC',\n};\n","import UPNG from './UPNG';\nimport MAX_CANVAS_SIZE from './config/max-canvas-size';\nimport BROWSER_NAME from './config/browser-name';\n\nconst isBrowser = typeof window !== 'undefined'; // change browser environment to support SSR\n\n// add support for cordova-plugin-file\nconst moduleMapper = isBrowser && window.cordova && window.cordova.require && window.cordova.require('cordova/modulemapper');\nexport const CustomFile = isBrowser && ((moduleMapper && moduleMapper.getOriginalSymbol(window, 'File')) || (typeof window.File !== 'undefined' && File));\nexport const CustomFileReader = isBrowser && ((moduleMapper && moduleMapper.getOriginalSymbol(window, 'FileReader')) || (typeof window.FileReader !== 'undefined' && FileReader));\n\n/**\n * getFilefromDataUrl\n *\n * @param {string} dataUrl\n * @param {string} filename\n * @param {number} [lastModified=Date.now()]\n * @returns {Promise}\n */\nexport function getFilefromDataUrl(dataUrl, filename, lastModified = Date.now()) {\n return new Promise((resolve) => {\n const arr = dataUrl.split(',');\n const mime = arr[0].match(/:(.*?);/)[1];\n const bstr = globalThis.atob(arr[1]);\n let n = bstr.length;\n const u8arr = new Uint8Array(n);\n while (n--) {\n u8arr[n] = bstr.charCodeAt(n);\n }\n const file = new Blob([u8arr], { type: mime });\n file.name = filename;\n file.lastModified = lastModified;\n resolve(file);\n\n // Safari has issue with File constructor not being able to POST in FormData\n // https://github.com/Donaldcwl/browser-image-compression/issues/8\n // https://bugs.webkit.org/show_bug.cgi?id=165081\n // let file\n // try {\n // file = new File([u8arr], filename, { type: mime }) // Edge do not support File constructor\n // } catch (e) {\n // file = new Blob([u8arr], { type: mime })\n // file.name = filename\n // file.lastModified = lastModified\n // }\n // resolve(file)\n });\n}\n\n/**\n * getDataUrlFromFile\n *\n * @param {File | Blob} file\n * @returns {Promise}\n */\nexport function getDataUrlFromFile(file) {\n return new Promise((resolve, reject) => {\n const reader = new CustomFileReader();\n reader.onload = () => resolve(reader.result);\n reader.onerror = (e) => reject(e);\n reader.readAsDataURL(file);\n });\n}\n\n/**\n * loadImage\n *\n * @param {string} src\n * @returns {Promise}\n */\nexport function loadImage(src) {\n return new Promise((resolve, reject) => {\n const img = new Image();\n img.onload = () => resolve(img);\n img.onerror = (e) => reject(e);\n img.src = src;\n });\n}\n\n/**\n * getBrowserName\n *\n * Extracts the browser name from the useragent.\n *\n * ref: https://stackoverflow.com/a/26358856\n *\n * @returns {string}\n */\nexport function getBrowserName() {\n if (getBrowserName.cachedResult !== undefined) {\n return getBrowserName.cachedResult;\n }\n let browserName = BROWSER_NAME.ETC;\n const { userAgent } = navigator;\n if (/Chrom(e|ium)/i.test(userAgent)) {\n browserName = BROWSER_NAME.CHROME;\n } else if (/iP(ad|od|hone)/i.test(userAgent) && /WebKit/i.test(userAgent) && !(/(CriOS|FxiOS|OPiOS|mercury)/i.test(userAgent))) {\n // see: https://stackoverflow.com/a/35813965\n browserName = BROWSER_NAME.MOBILE_SAFARI;\n } else if (/Safari/i.test(userAgent)) {\n browserName = BROWSER_NAME.DESKTOP_SAFARI;\n } else if (/Firefox/i.test(userAgent)) {\n browserName = BROWSER_NAME.FIREFOX;\n } else if (/MSIE/i.test(userAgent) || (!!document.documentMode) === true) { // IF IE > 10\n browserName = BROWSER_NAME.IE;\n }\n getBrowserName.cachedResult = browserName;\n return getBrowserName.cachedResult;\n}\n\n/**\n * approximateBelowCanvasMaximumSizeOfBrowser\n *\n * it uses binary search to converge below the browser's maximum Canvas size.\n *\n * @param {number} initWidth\n * @param {number} initHeight\n * @returns {object}\n */\nexport function approximateBelowMaximumCanvasSizeOfBrowser(initWidth, initHeight) {\n const browserName = getBrowserName();\n const maximumCanvasSize = MAX_CANVAS_SIZE[browserName];\n\n let width = initWidth;\n let height = initHeight;\n let size = width * height;\n const ratio = width > height ? height / width : width / height;\n\n while (size > maximumCanvasSize * maximumCanvasSize) {\n const halfSizeWidth = (maximumCanvasSize + width) / 2;\n const halfSizeHeight = (maximumCanvasSize + height) / 2;\n if (halfSizeWidth < halfSizeHeight) {\n height = halfSizeHeight;\n width = halfSizeHeight * ratio;\n } else {\n height = halfSizeWidth * ratio;\n width = halfSizeWidth;\n }\n\n size = width * height;\n }\n\n return {\n width, height,\n };\n}\n\n/**\n * get new Canvas and it's context\n * @param width\n * @param height\n * @returns {[HTMLCanvasElement | OffscreenCanvas, CanvasRenderingContext2D]}\n */\nexport function getNewCanvasAndCtx(width, height) {\n let canvas;\n let ctx;\n try {\n canvas = new OffscreenCanvas(width, height);\n ctx = canvas.getContext('2d');\n if (ctx === null) {\n throw new Error('getContext of OffscreenCanvas returns null');\n }\n } catch (e) {\n canvas = document.createElement('canvas');\n ctx = canvas.getContext('2d');\n }\n canvas.width = width;\n canvas.height = height;\n // ctx.fillStyle = '#fff'\n // ctx.fillRect(0, 0, width, height)\n return [canvas, ctx];\n}\n\n/**\n * drawImageInCanvas\n *\n * @param {HTMLImageElement} img\n * @param {string} [fileType=undefined]\n * @returns {HTMLCanvasElement | OffscreenCanvas}\n */\nexport function drawImageInCanvas(img, fileType = undefined) {\n const { width, height } = approximateBelowMaximumCanvasSizeOfBrowser(img.width, img.height);\n const [canvas, ctx] = getNewCanvasAndCtx(width, height);\n if (fileType && /jpe?g/.test(fileType)) {\n ctx.fillStyle = 'white'; // to fill the transparent background with white color for png file in jpeg extension\n ctx.fillRect(0, 0, canvas.width, canvas.height);\n }\n ctx.drawImage(img, 0, 0, canvas.width, canvas.height);\n return canvas;\n}\n\n/**\n * Detect IOS device\n * see: https://stackoverflow.com/a/9039885\n * @returns {boolean} isIOS device\n */\nexport function isIOS() {\n if (isIOS.cachedResult !== undefined) {\n return isIOS.cachedResult;\n }\n isIOS.cachedResult = [\n 'iPad Simulator',\n 'iPhone Simulator',\n 'iPod Simulator',\n 'iPad',\n 'iPhone',\n 'iPod',\n ].includes(navigator.platform)\n // iPad on iOS 13 detection\n || (navigator.userAgent.includes('Mac') && typeof document !== 'undefined' && 'ontouchend' in document);\n return isIOS.cachedResult;\n}\n\n/**\n * drawFileInCanvas\n *\n * @param {File | Blob} file\n * @returns {Promise<[ImageBitmap | HTMLImageElement, HTMLCanvasElement | OffscreenCanvas]>}\n */\nexport async function drawFileInCanvas(file, options = {}) {\n let img;\n try {\n if (isIOS() || [BROWSER_NAME.DESKTOP_SAFARI, BROWSER_NAME.MOBILE_SAFARI].includes(getBrowserName())) {\n throw new Error('Skip createImageBitmap on IOS and Safari'); // see https://github.com/Donaldcwl/browser-image-compression/issues/118\n }\n img = await createImageBitmap(file);\n } catch (e) {\n if (process.env.BUILD === 'development') {\n console.error(e);\n }\n try {\n const dataUrl = await getDataUrlFromFile(file);\n img = await loadImage(dataUrl);\n } catch (e2) {\n if (process.env.BUILD === 'development') {\n console.error(e2);\n }\n throw e2;\n }\n }\n const canvas = drawImageInCanvas(img, options.fileType || file.type);\n return [img, canvas];\n}\n\n/**\n * canvasToFile\n *\n * @param {HTMLCanvasElement | OffscreenCanvas} canvas\n * @param {string} fileType\n * @param {string} fileName\n * @param {number} fileLastModified\n * @param {number} [quality]\n * @returns {Promise}\n */\nexport async function canvasToFile(canvas, fileType, fileName, fileLastModified, quality = 1) {\n let file;\n if (fileType === 'image/png') {\n const ctx = canvas.getContext('2d');\n const { data } = ctx.getImageData(0, 0, canvas.width, canvas.height);\n const png = UPNG.encode([data], canvas.width, canvas.height, 256 * quality);\n file = new Blob([png], { type: fileType });\n file.name = fileName;\n file.lastModified = fileLastModified;\n } else if (typeof OffscreenCanvas === 'function' && canvas instanceof OffscreenCanvas) { // checked on Win Chrome 83, MacOS Chrome 83\n file = await canvas.convertToBlob({ type: fileType, quality });\n file.name = fileName;\n file.lastModified = fileLastModified;\n // some browser do not support quality parameter, see: https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toBlob\n // } else if (typeof canvas.toBlob === 'function') {\n // file = await new Promise(resolve => canvas.toBlob(resolve, fileType, quality))\n } else { // checked on Win Edge 44, Win IE 11, Win Firefox 76, MacOS Firefox 77, MacOS Safari 13.1\n const dataUrl = canvas.toDataURL(fileType, quality);\n file = await getFilefromDataUrl(dataUrl, fileName, fileLastModified);\n }\n return file;\n}\n\n/**\n * clear Canvas memory\n * @param canvas\n * @returns null\n */\nexport function cleanupCanvasMemory(canvas) {\n // garbage clean canvas for safari\n // ref: https://bugs.webkit.org/show_bug.cgi?id=195325\n // eslint-disable-next-line no-param-reassign\n canvas.width = 0;\n // eslint-disable-next-line no-param-reassign\n canvas.height = 0;\n}\n\n// Check if browser supports automatic image orientation\n// see https://github.com/blueimp/JavaScript-Load-Image/blob/1e4df707821a0afcc11ea0720ee403b8759f3881/js/load-image-orientation.js#L37-L53\nexport async function isAutoOrientationInBrowser() {\n if (isAutoOrientationInBrowser.cachedResult !== undefined) return isAutoOrientationInBrowser.cachedResult;\n\n // black 2x1 JPEG, with the following meta information set:\n // EXIF Orientation: 6 (Rotated 90° CCW)\n const testImageURL = 'data:image/jpeg;base64,/9j/4QAiRXhpZgAATU0AKgAAAAgAAQESAAMAAAABAAYAAAA'\n + 'AAAD/2wCEAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBA'\n + 'QEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE'\n + 'BAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAf/AABEIAAEAAgMBEQACEQEDEQH/x'\n + 'ABKAAEAAAAAAAAAAAAAAAAAAAALEAEAAAAAAAAAAAAAAAAAAAAAAQEAAAAAAAAAAAAAAAA'\n + 'AAAAAEQEAAAAAAAAAAAAAAAAAAAAA/9oADAMBAAIRAxEAPwA/8H//2Q==';\n const testImageFile = await getFilefromDataUrl(testImageURL, 'test.jpg', Date.now());\n\n const testImageCanvas = (await drawFileInCanvas(testImageFile))[1];\n const testImageFile2 = await canvasToFile(testImageCanvas, testImageFile.type, testImageFile.name, testImageFile.lastModified);\n cleanupCanvasMemory(testImageCanvas);\n const img = (await drawFileInCanvas(testImageFile2))[0];\n // console.log('img', img.width, img.height)\n\n isAutoOrientationInBrowser.cachedResult = img.width === 1 && img.height === 2;\n return isAutoOrientationInBrowser.cachedResult;\n}\n\n/**\n * getExifOrientation\n * get image exif orientation info\n * source: https://stackoverflow.com/a/32490603/10395024\n *\n * @param {File | Blob} file\n * @returns {Promise} - orientation id, see https://i.stack.imgur.com/VGsAj.gif\n */\nexport function getExifOrientation(file) {\n return new Promise((resolve, reject) => {\n const reader = new CustomFileReader();\n reader.onload = (e) => {\n const view = new DataView(e.target.result);\n if (view.getUint16(0, false) != 0xFFD8) {\n return resolve(-2);\n }\n const length = view.byteLength;\n let offset = 2;\n while (offset < length) {\n if (view.getUint16(offset + 2, false) <= 8) return resolve(-1);\n const marker = view.getUint16(offset, false);\n offset += 2;\n if (marker == 0xFFE1) {\n if (view.getUint32(offset += 2, false) != 0x45786966) {\n return resolve(-1);\n }\n\n const little = view.getUint16(offset += 6, false) == 0x4949;\n offset += view.getUint32(offset + 4, little);\n const tags = view.getUint16(offset, little);\n offset += 2;\n for (let i = 0; i < tags; i++) {\n if (view.getUint16(offset + (i * 12), little) == 0x0112) {\n return resolve(view.getUint16(offset + (i * 12) + 8, little));\n }\n }\n } else if ((marker & 0xFF00) != 0xFF00) {\n break;\n } else {\n offset += view.getUint16(offset, false);\n }\n }\n return resolve(-1);\n };\n reader.onerror = (e) => reject(e);\n reader.readAsArrayBuffer(file);\n });\n}\n\n/**\n *\n * @param {HTMLCanvasElement | OffscreenCanvas} canvas\n * @param options\n * @returns {HTMLCanvasElement | OffscreenCanvas}\n */\nexport function handleMaxWidthOrHeight(canvas, options) {\n const { width } = canvas;\n const { height } = canvas;\n const { maxWidthOrHeight } = options;\n\n const needToHandle = isFinite(maxWidthOrHeight) && (width > maxWidthOrHeight || height > maxWidthOrHeight);\n\n let newCanvas = canvas;\n let ctx;\n\n if (needToHandle) {\n [newCanvas, ctx] = getNewCanvasAndCtx(width, height);\n if (width > height) {\n newCanvas.width = maxWidthOrHeight;\n newCanvas.height = (height / width) * maxWidthOrHeight;\n } else {\n newCanvas.width = (width / height) * maxWidthOrHeight;\n newCanvas.height = maxWidthOrHeight;\n }\n ctx.drawImage(canvas, 0, 0, newCanvas.width, newCanvas.height);\n\n cleanupCanvasMemory(canvas);\n }\n\n return newCanvas;\n}\n\n/**\n * followExifOrientation\n * source: https://stackoverflow.com/a/40867559/10395024\n *\n * @param {HTMLCanvasElement | OffscreenCanvas} canvas\n * @param {number} exifOrientation\n * @returns {HTMLCanvasElement | OffscreenCanvas} canvas\n */\nexport function followExifOrientation(canvas, exifOrientation) {\n const { width } = canvas;\n const { height } = canvas;\n\n const [newCanvas, ctx] = getNewCanvasAndCtx(width, height);\n\n // set proper canvas dimensions before transform & export\n if (exifOrientation > 4 && exifOrientation < 9) {\n newCanvas.width = height;\n newCanvas.height = width;\n } else {\n newCanvas.width = width;\n newCanvas.height = height;\n }\n\n // transform context before drawing image\n switch (exifOrientation) {\n case 2:\n ctx.transform(-1, 0, 0, 1, width, 0);\n break;\n case 3:\n ctx.transform(-1, 0, 0, -1, width, height);\n break;\n case 4:\n ctx.transform(1, 0, 0, -1, 0, height);\n break;\n case 5:\n ctx.transform(0, 1, 1, 0, 0, 0);\n break;\n case 6:\n ctx.transform(0, 1, -1, 0, height, 0);\n break;\n case 7:\n ctx.transform(0, -1, -1, 0, height, width);\n break;\n case 8:\n ctx.transform(0, -1, 1, 0, 0, width);\n break;\n default:\n break;\n }\n\n ctx.drawImage(canvas, 0, 0, width, height);\n\n cleanupCanvasMemory(canvas);\n\n return newCanvas;\n}\n","import {\n canvasToFile,\n cleanupCanvasMemory,\n drawFileInCanvas,\n followExifOrientation,\n getExifOrientation,\n getNewCanvasAndCtx,\n handleMaxWidthOrHeight,\n isAutoOrientationInBrowser,\n} from './utils';\n\n/**\n * Compress an image file.\n *\n * @param {File} file\n * @param {Object} options\n * @param {number} [options.maxSizeMB=Number.POSITIVE_INFINITY]\n * @param {number} [options.maxWidthOrHeight=undefined]\n * @param {boolean} [options.useWebWorker=true]\n * @param {number} [options.maxIteration=10]\n * @param {number} [options.exifOrientation] - default to be the exif orientation from the image file\n * @param {Function} [options.onProgress] - a function takes one progress argument (progress from 0 to 100)\n * @param {string} [options.fileType] - default to be the original mime type from the image file\n * @param {number} [options.initialQuality=1.0]\n * @param {boolean} [options.alwaysKeepResolution=false]\n * @param {AbortSignal} [options.signal]\n * @param {number} previousProgress - for internal try catch rerunning start from previous progress\n * @returns {Promise}\n */\nexport default async function compress(file, options, previousProgress = 0) {\n let progress = previousProgress;\n\n function incProgress(inc = 5) {\n if (options.signal && options.signal.aborted) {\n throw options.signal.reason;\n }\n progress += inc;\n options.onProgress(Math.min(progress, 100));\n }\n\n function setProgress(p) {\n if (options.signal && options.signal.aborted) {\n throw options.signal.reason;\n }\n progress = Math.min(Math.max(p, progress), 100);\n options.onProgress(progress);\n }\n\n let remainingTrials = options.maxIteration || 10;\n\n const maxSizeByte = options.maxSizeMB * 1024 * 1024;\n\n incProgress();\n\n // drawFileInCanvas\n const [, origCanvas] = await drawFileInCanvas(file, options);\n\n incProgress();\n\n // handleMaxWidthOrHeight\n const maxWidthOrHeightFixedCanvas = handleMaxWidthOrHeight(origCanvas, options);\n\n incProgress();\n\n // exifOrientation\n const exifOrientation = options.exifOrientation || await getExifOrientation(file);\n incProgress();\n const orientationFixedCanvas = (await isAutoOrientationInBrowser()) ? maxWidthOrHeightFixedCanvas : followExifOrientation(maxWidthOrHeightFixedCanvas, exifOrientation);\n incProgress();\n\n let quality = options.initialQuality || 1.0;\n\n const outputFileType = options.fileType || file.type;\n\n const tempFile = await canvasToFile(orientationFixedCanvas, outputFileType, file.name, file.lastModified, quality);\n incProgress();\n\n const origExceedMaxSize = tempFile.size > maxSizeByte;\n const sizeBecomeLarger = tempFile.size > file.size;\n if (process.env.BUILD === 'development') {\n console.log('original file size', file.size);\n console.log('current file size', tempFile.size);\n }\n\n // check if we need to compress or resize\n if (!origExceedMaxSize && !sizeBecomeLarger) {\n // no need to compress\n if (process.env.BUILD === 'development') {\n console.log('no need to compress');\n }\n setProgress(100);\n return tempFile;\n }\n\n const sourceSize = file.size;\n const renderedSize = tempFile.size;\n let currentSize = renderedSize;\n let compressedFile;\n let newCanvas;\n let ctx;\n let canvas = orientationFixedCanvas;\n const shouldReduceResolution = !options.alwaysKeepResolution && origExceedMaxSize;\n while (remainingTrials-- && (currentSize > maxSizeByte || currentSize > sourceSize)) {\n const newWidth = shouldReduceResolution ? canvas.width * 0.95 : canvas.width;\n const newHeight = shouldReduceResolution ? canvas.height * 0.95 : canvas.height;\n if (process.env.BUILD === 'development') {\n console.log('current width', newWidth);\n console.log('current height', newHeight);\n console.log('current quality', quality);\n }\n [newCanvas, ctx] = getNewCanvasAndCtx(newWidth, newHeight);\n\n ctx.drawImage(canvas, 0, 0, newWidth, newHeight);\n\n quality *= 0.95;\n // eslint-disable-next-line no-await-in-loop\n compressedFile = await canvasToFile(newCanvas, outputFileType, file.name, file.lastModified, quality);\n\n cleanupCanvasMemory(canvas);\n\n canvas = newCanvas;\n\n currentSize = compressedFile.size;\n // console.log('currentSize', currentSize)\n setProgress(Math.min(99, Math.floor(((renderedSize - currentSize) / (renderedSize - maxSizeByte)) * 100)));\n }\n\n cleanupCanvasMemory(canvas);\n cleanupCanvasMemory(newCanvas);\n cleanupCanvasMemory(maxWidthOrHeightFixedCanvas);\n cleanupCanvasMemory(orientationFixedCanvas);\n cleanupCanvasMemory(origCanvas);\n\n setProgress(100);\n return compressedFile;\n}\n","import * as UZIP from 'uzip';\n// eslint-disable-next-line import/no-cycle\nimport lib from './index';\nimport compress from './image-compression';\nimport { getNewCanvasAndCtx, isIOS } from './utils';\nimport UPNG from './UPNG';\nimport MAX_CANVAS_SIZE from './config/max-canvas-size';\nimport BROWSER_NAME from './config/browser-name';\n\nlet cnt = 0;\nlet imageCompressionLibUrl;\nlet worker;\n\nfunction createWorker(script) {\n const blobArgs = [];\n if (typeof script === 'function') {\n blobArgs.push(`(${script})()`);\n } else {\n blobArgs.push(script);\n }\n return new Worker(URL.createObjectURL(new Blob(blobArgs)));\n}\n\nfunction createSourceObject(str) {\n // console.log('createSourceObject', str)\n return URL.createObjectURL(new Blob([str], { type: 'application/javascript' }));\n}\n\nfunction stringify(o) {\n return JSON.stringify(o, (key, value) => ((typeof value === 'function') ? `BIC_FN:::(function () { return ${value.toString()} })()` : value));\n}\n\nfunction parse(o) {\n if (typeof o === 'string') return o;\n const result = {};\n Object.entries(o).forEach(([key, value]) => {\n if (typeof value === 'string' && value.startsWith('BIC_FN:::')) {\n try {\n // eslint-disable-next-line no-eval\n result[key] = eval(value.replace(/^BIC_FN:::/, ''));\n } catch (e) {\n if (process.env.BUILD === 'development') {\n console.error(key, e);\n }\n throw e;\n }\n } else {\n result[key] = parse(value);\n }\n });\n return result;\n}\n\nfunction generateLib() {\n // prepare the lib to be used inside WebWorker\n return createSourceObject(`\n // reconstruct library\n function imageCompression (){return (${lib}).apply(null, arguments)}\n\n imageCompression.getDataUrlFromFile = ${lib.getDataUrlFromFile}\n imageCompression.getFilefromDataUrl = ${lib.getFilefromDataUrl}\n imageCompression.loadImage = ${lib.loadImage}\n imageCompression.drawImageInCanvas = ${lib.drawImageInCanvas}\n imageCompression.drawFileInCanvas = ${lib.drawFileInCanvas}\n imageCompression.canvasToFile = ${lib.canvasToFile}\n imageCompression.getExifOrientation = ${lib.getExifOrientation}\n imageCompression.handleMaxWidthOrHeight = ${lib.handleMaxWidthOrHeight}\n imageCompression.followExifOrientation = ${lib.followExifOrientation}\n imageCompression.cleanupCanvasMemory = ${lib.cleanupCanvasMemory}\n imageCompression.isAutoOrientationInBrowser = ${lib.isAutoOrientationInBrowser}\n imageCompression.approximateBelowMaximumCanvasSizeOfBrowser = ${lib.approximateBelowMaximumCanvasSizeOfBrowser}\n imageCompression.getBrowserName = ${lib.getBrowserName}\n\n // functions / objects\n getDataUrlFromFile = imageCompression.getDataUrlFromFile\n getFilefromDataUrl = imageCompression.getFilefromDataUrl\n loadImage = imageCompression.loadImage\n drawImageInCanvas = imageCompression.drawImageInCanvas\n drawFileInCanvas = imageCompression.drawFileInCanvas\n canvasToFile = imageCompression.canvasToFile\n getExifOrientation = imageCompression.getExifOrientation\n handleMaxWidthOrHeight = imageCompression.handleMaxWidthOrHeight\n followExifOrientation = imageCompression.followExifOrientation\n cleanupCanvasMemory = imageCompression.cleanupCanvasMemory\n isAutoOrientationInBrowser = imageCompression.isAutoOrientationInBrowser\n approximateBelowMaximumCanvasSizeOfBrowser = imageCompression.approximateBelowMaximumCanvasSizeOfBrowser\n getBrowserName = imageCompression.getBrowserName\n isIOS = ${isIOS}\n \n getNewCanvasAndCtx = ${getNewCanvasAndCtx}\n CustomFileReader = FileReader\n CustomFile = File\n MAX_CANVAS_SIZE = ${JSON.stringify(MAX_CANVAS_SIZE)}\n BROWSER_NAME = ${JSON.stringify(BROWSER_NAME)}\n function compress (){return (${compress}).apply(null, arguments)}\n\n // core-js\n function _slicedToArray(arr, n) { return arr }\n function _typeof(a) { return typeof a }\n function _objectSpread2(target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i] != null ? arguments[i] : {};\n \n Object.assign(target, source)\n }\n \n return target;\n }\n\n // Libraries\n const parse = ${parse}\n const UPNG = {}\n UPNG.toRGBA8 = ${UPNG.toRGBA8}\n UPNG.toRGBA8.decodeImage = ${UPNG.toRGBA8.decodeImage}\n UPNG.decode = ${UPNG.decode}\n UPNG.decode._decompress = ${UPNG.decode._decompress}\n UPNG.decode._inflate = ${UPNG.decode._inflate}\n UPNG.decode._readInterlace = ${UPNG.decode._readInterlace}\n UPNG.decode._getBPP = ${UPNG.decode._getBPP} \n UPNG.decode._filterZero = ${UPNG.decode._filterZero}\n UPNG.decode._paeth = ${UPNG.decode._paeth}\n UPNG.decode._IHDR = ${UPNG.decode._IHDR}\n UPNG._bin = parse(${stringify(UPNG._bin)})\n UPNG._copyTile = ${UPNG._copyTile}\n UPNG.encode = ${UPNG.encode}\n UPNG.encodeLL = ${UPNG.encodeLL} \n UPNG.encode._main = ${UPNG.encode._main}\n UPNG.encode.compressPNG = ${UPNG.encode.compressPNG} \n UPNG.encode.compress = ${UPNG.encode.compress}\n UPNG.encode.framize = ${UPNG.encode.framize} \n UPNG.encode._updateFrame = ${UPNG.encode._updateFrame} \n UPNG.encode._prepareDiff = ${UPNG.encode._prepareDiff} \n UPNG.encode._filterZero = ${UPNG.encode._filterZero} \n UPNG.encode._filterLine = ${UPNG.encode._filterLine}\n UPNG.encode.concatRGBA = ${UPNG.encode.concatRGBA}\n UPNG.crc = parse(${stringify(UPNG.crc)})\n UPNG.crc.table = ( function() {\n var tab = new Uint32Array(256);\n for (var n=0; n<256; n++) {\n var c = n;\n for (var k=0; k<8; k++) {\n if (c & 1) c = 0xedb88320 ^ (c >>> 1);\n else c = c >>> 1;\n }\n tab[n] = c; }\n return tab; })()\n UPNG.quantize = ${UPNG.quantize} \n UPNG.quantize.getKDtree = ${UPNG.quantize.getKDtree} \n UPNG.quantize.getNearest = ${UPNG.quantize.getNearest} \n UPNG.quantize.planeDst = ${UPNG.quantize.planeDst} \n UPNG.quantize.dist = ${UPNG.quantize.dist} \n UPNG.quantize.splitPixels = ${UPNG.quantize.splitPixels} \n UPNG.quantize.vecDot = ${UPNG.quantize.vecDot} \n UPNG.quantize.stats = ${UPNG.quantize.stats} \n UPNG.quantize.estats = ${UPNG.quantize.estats}\n UPNG.M4 = parse(${stringify(UPNG.M4)})\n UPNG.encode.concatRGBA = ${UPNG.encode.concatRGBA}\n UPNG.inflateRaw=function(){\n var H={};H.H={};H.H.N=function(N,W){var R=Uint8Array,i=0,m=0,J=0,h=0,Q=0,X=0,u=0,w=0,d=0,v,C;\n if(N[0]==3&&N[1]==0)return W?W:new R(0);var V=H.H,n=V.b,A=V.e,l=V.R,M=V.n,I=V.A,e=V.Z,b=V.m,Z=W==null;\n if(Z)W=new R(N.length>>>2<<5);while(i==0){i=n(N,d,1);m=n(N,d+1,2);d+=3;if(m==0){if((d&7)!=0)d+=8-(d&7);\n var D=(d>>>3)+4,q=N[D-4]|N[D-3]<<8;if(Z)W=H.H.W(W,w+q);W.set(new R(N.buffer,N.byteOffset+D,q),w);d=D+q<<3;\n w+=q;continue}if(Z)W=H.H.W(W,w+(1<<17));if(m==1){v=b.J;C=b.h;X=(1<<9)-1;u=(1<<5)-1}if(m==2){J=A(N,d,5)+257;\n h=A(N,d+5,5)+1;Q=A(N,d+10,4)+4;d+=14;var E=d,j=1;for(var c=0;c<38;c+=2){b.Q[c]=0;b.Q[c+1]=0}for(var c=0;\n cj)j=K}d+=3*Q;M(b.Q,j);I(b.Q,j,b.u);v=b.w;C=b.d;\n d=l(b.u,(1<>>4;if(p>>>8==0){W[w++]=p}else if(p==256){break}else{var z=w+p-254;\n if(p>264){var _=b.q[p-257];z=w+(_>>>3)+A(N,d,_&7);d+=_&7}var $=C[e(N,d)&u];d+=$&15;var s=$>>>4,Y=b.c[s],a=(Y>>>4)+n(N,d,Y&15);\n d+=Y&15;while(w>>4;\n if(b<=15){A[I]=b;I++}else{var Z=0,m=0;if(b==16){m=3+l(V,n,2);n+=2;Z=A[I-1]}else if(b==17){m=3+l(V,n,3);\n n+=3}else if(b==18){m=11+l(V,n,7);n+=7}var J=I+m;while(I>>1;\n while(An)n=M;A++}while(A>1,I=N[l+1],e=M<<4|I,b=W-I,Z=N[l]<>>15-W;R[J]=e;Z++}}};H.H.l=function(N,W){var R=H.H.m.r,V=15-W;for(var n=0;n>>V}};H.H.M=function(N,W,R){R=R<<(W&7);var V=W>>>3;N[V]|=R;N[V+1]|=R>>>8};\n H.H.I=function(N,W,R){R=R<<(W&7);var V=W>>>3;N[V]|=R;N[V+1]|=R>>>8;N[V+2]|=R>>>16};H.H.e=function(N,W,R){return(N[W>>>3]|N[(W>>>3)+1]<<8)>>>(W&7)&(1<>>3]|N[(W>>>3)+1]<<8|N[(W>>>3)+2]<<16)>>>(W&7)&(1<>>3]|N[(W>>>3)+1]<<8|N[(W>>>3)+2]<<16)>>>(W&7)};\n H.H.i=function(N,W){return(N[W>>>3]|N[(W>>>3)+1]<<8|N[(W>>>3)+2]<<16|N[(W>>>3)+3]<<24)>>>(W&7)};H.H.m=function(){var N=Uint16Array,W=Uint32Array;\n return{K:new N(16),j:new N(16),X:[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],S:[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,999,999,999],T:[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],q:new N(32),p:[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,65535,65535],z:[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],c:new W(32),J:new N(512),_:[],h:new N(32),$:[],w:new N(32768),C:[],v:[],d:new N(32768),D:[],u:new N(512),Q:[],r:new N(1<<15),s:new W(286),Y:new W(30),a:new W(19),t:new W(15e3),k:new N(1<<16),g:new N(1<<15)}}();\n (function(){var N=H.H.m,W=1<<15;for(var R=0;R>>1|(V&1431655765)<<1;\n V=(V&3435973836)>>>2|(V&858993459)<<2;V=(V&4042322160)>>>4|(V&252645135)<<4;V=(V&4278255360)>>>8|(V&16711935)<<8;\n N.r[R]=(V>>>16|V<<16)>>>17}function n(A,l,M){while(l--!=0)A.push(0,M)}for(var R=0;R<32;R++){N.q[R]=N.S[R]<<3|N.T[R];\n N.c[R]=N.p[R]<<4|N.z[R]}n(N._,144,8);n(N._,255-143,9);n(N._,279-255,7);n(N._,287-279,8);H.H.n(N._,9);\n H.H.A(N._,9,N.J);H.H.l(N._,9);n(N.$,32,5);H.H.n(N.$,5);H.H.A(N.$,5,N.h);H.H.l(N.$,5);n(N.Q,19,0);n(N.C,286,0);\n n(N.D,30,0);n(N.v,320,0)}());return H.H.N}()\n \n const UZIP = {}\n UZIP[\"parse\"] = ${UZIP.parse}\n UZIP._readLocal = ${UZIP._readLocal}\n UZIP.inflateRaw = ${UZIP.inflateRaw}\n UZIP.inflate = ${UZIP.inflate}\n UZIP.deflate = ${UZIP.deflate}\n UZIP.deflateRaw = ${UZIP.deflateRaw}\n UZIP.encode = ${UZIP.encode}\n UZIP._noNeed = ${UZIP._noNeed}\n UZIP._writeHeader = ${UZIP._writeHeader}\n UZIP.crc = parse(${stringify(UZIP.crc)})\n UZIP.crc.table = ( function() {\n var tab = new Uint32Array(256);\n for (var n=0; n<256; n++) {\n var c = n;\n for (var k=0; k<8; k++) {\n if (c & 1) c = 0xedb88320 ^ (c >>> 1);\n else c = c >>> 1;\n }\n tab[n] = c; }\n return tab; })()\n \n UZIP.adler = ${UZIP.adler}\n UZIP.bin = parse(${stringify(UZIP.bin)})\n UZIP.F = {}\n UZIP.F.deflateRaw = ${UZIP.F.deflateRaw}\n UZIP.F._bestMatch = ${UZIP.F._bestMatch}\n UZIP.F._howLong = ${UZIP.F._howLong}\n UZIP.F._hash = ${UZIP.F._hash}\n UZIP.saved = ${UZIP.saved}\n UZIP.F._writeBlock = ${UZIP.F._writeBlock}\n UZIP.F._copyExact = ${UZIP.F._copyExact}\n UZIP.F.getTrees = ${UZIP.F.getTrees}\n UZIP.F.getSecond = ${UZIP.F.getSecond}\n UZIP.F.nonZero = ${UZIP.F.nonZero}\n UZIP.F.contSize = ${UZIP.F.contSize}\n UZIP.F._codeTiny = ${UZIP.F._codeTiny} \n UZIP.F._lenCodes = ${UZIP.F._lenCodes} \n UZIP.F._hufTree = ${UZIP.F._hufTree} \n UZIP.F.setDepth = ${UZIP.F.setDepth} \n UZIP.F.restrictDepth = ${UZIP.F.restrictDepth}\n UZIP.F._goodIndex = ${UZIP.F._goodIndex} \n UZIP.F._writeLit = ${UZIP.F._writeLit} \n UZIP.F.inflate = ${UZIP.F.inflate} \n UZIP.F._check = ${UZIP.F._check} \n UZIP.F._decodeTiny = ${UZIP.F._decodeTiny} \n UZIP.F._copyOut = ${UZIP.F._copyOut} \n UZIP.F.makeCodes = ${UZIP.F.makeCodes} \n UZIP.F.codes2map = ${UZIP.F.codes2map} \n UZIP.F.revCodes = ${UZIP.F.revCodes} \n\n // used only in deflate\n UZIP.F._putsE = ${UZIP.F._putsE}\n UZIP.F._putsF = ${UZIP.F._putsF}\n \n UZIP.F._bitsE = ${UZIP.F._bitsE}\n UZIP.F._bitsF = ${UZIP.F._bitsF}\n\n UZIP.F._get17 = ${UZIP.F._get17}\n UZIP.F._get25 = ${UZIP.F._get25}\n UZIP.F.U = function(){\n var u16=Uint16Array, u32=Uint32Array;\n return {\n next_code : new u16(16),\n bl_count : new u16(16),\n ordr : [ 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15 ],\n of0 : [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,999,999,999],\n exb : [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],\n ldef : new u16(32),\n df0 : [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, 65535, 65535],\n dxb : [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],\n ddef : new u32(32),\n flmap: new u16( 512), fltree: [],\n fdmap: new u16( 32), fdtree: [],\n lmap : new u16(32768), ltree : [], ttree:[],\n dmap : new u16(32768), dtree : [],\n imap : new u16( 512), itree : [],\n //rev9 : new u16( 512)\n rev15: new u16(1<<15),\n lhst : new u32(286), dhst : new u32( 30), ihst : new u32(19),\n lits : new u32(15000),\n strt : new u16(1<<16),\n prev : new u16(1<<15)\n };\n } ();\n\n (function(){\n var U = UZIP.F.U;\n var len = 1<<15;\n for(var i=0; i>> 1) | ((x & 0x55555555) << 1));\n x = (((x & 0xcccccccc) >>> 2) | ((x & 0x33333333) << 2));\n x = (((x & 0xf0f0f0f0) >>> 4) | ((x & 0x0f0f0f0f) << 4));\n x = (((x & 0xff00ff00) >>> 8) | ((x & 0x00ff00ff) << 8));\n U.rev15[i] = (((x >>> 16) | (x << 16)))>>>17;\n }\n \n function pushV(tgt, n, sv) { while(n--!=0) tgt.push(0,sv); }\n \n for(var i=0; i<32; i++) { U.ldef[i]=(U.of0[i]<<3)|U.exb[i]; U.ddef[i]=(U.df0[i]<<4)|U.dxb[i]; }\n \n pushV(U.fltree, 144, 8); pushV(U.fltree, 255-143, 9); pushV(U.fltree, 279-255, 7); pushV(U.fltree,287-279,8);\n /*\n var i = 0;\n for(; i<=143; i++) U.fltree.push(0,8);\n for(; i<=255; i++) U.fltree.push(0,9);\n for(; i<=279; i++) U.fltree.push(0,7);\n for(; i<=287; i++) U.fltree.push(0,8);\n */\n UZIP.F.makeCodes(U.fltree, 9);\n UZIP.F.codes2map(U.fltree, 9, U.flmap);\n UZIP.F.revCodes (U.fltree, 9)\n \n pushV(U.fdtree,32,5);\n //for(i=0;i<32; i++) U.fdtree.push(0,5);\n UZIP.F.makeCodes(U.fdtree, 5);\n UZIP.F.codes2map(U.fdtree, 5, U.fdmap);\n UZIP.F.revCodes (U.fdtree, 5)\n \n pushV(U.itree,19,0); pushV(U.ltree,286,0); pushV(U.dtree,30,0); pushV(U.ttree,320,0);\n /*\n for(var i=0; i< 19; i++) U.itree.push(0,0);\n for(var i=0; i<286; i++) U.ltree.push(0,0);\n for(var i=0; i< 30; i++) U.dtree.push(0,0);\n for(var i=0; i<320; i++) U.ttree.push(0,0);\n */\n })()\n `);\n}\n\nfunction generateWorkerScript() {\n // code to be run in the WebWorker\n return createWorker(`\n let scriptImported = false\n self.addEventListener('message', async (e) => {\n const { file, id, imageCompressionLibUrl, options } = e.data\n options.onProgress = (progress) => self.postMessage({ progress, id })\n try {\n if (!scriptImported) {\n // console.log('[worker] importScripts', imageCompressionLibUrl)\n self.importScripts(imageCompressionLibUrl)\n scriptImported = true\n }\n // console.log('[worker] self', self)\n const compressedFile = await imageCompression(file, options)\n self.postMessage({ file: compressedFile, id })\n } catch (e) {\n // console.error('[worker] error', e)\n self.postMessage({ error: e.message + '\\\\n' + e.stack, id })\n }\n })\n `);\n}\n\nexport default function compressOnWebWorker(file, options) {\n return new Promise((resolve, reject) => {\n cnt += 1;\n const id = cnt;\n\n if (!imageCompressionLibUrl) {\n imageCompressionLibUrl = generateLib();\n }\n\n if (!worker) {\n worker = generateWorkerScript();\n }\n\n function handler(e) {\n if (e.data.id === id) {\n if (options.signal && options.signal.aborted) {\n return;\n }\n if (e.data.progress !== undefined) {\n options.onProgress(e.data.progress);\n return;\n }\n worker.removeEventListener('message', handler);\n if (e.data.error) {\n reject(new Error(e.data.error));\n }\n resolve(e.data.file);\n }\n }\n\n worker.addEventListener('message', handler);\n worker.addEventListener('error', reject);\n if (options.signal) {\n options.signal.addEventListener('abort', () => {\n worker.terminate();\n reject(options.signal.reason);\n });\n }\n\n worker.postMessage({\n file,\n id,\n imageCompressionLibUrl,\n options: { ...options, onProgress: undefined, signal: undefined },\n });\n });\n}\n","import compress from './image-compression';\nimport {\n canvasToFile,\n drawFileInCanvas,\n drawImageInCanvas,\n getDataUrlFromFile,\n getFilefromDataUrl,\n loadImage,\n getExifOrientation,\n handleMaxWidthOrHeight,\n followExifOrientation,\n CustomFile,\n cleanupCanvasMemory,\n isAutoOrientationInBrowser,\n approximateBelowMaximumCanvasSizeOfBrowser,\n getBrowserName,\n} from './utils';\n// eslint-disable-next-line import/no-cycle\nimport compressOnWebWorker from './web-worker';\n\n/**\n * Compress an image file.\n *\n * @param {File} file\n * @param {Object} options - { maxSizeMB=Number.POSITIVE_INFINITY, maxWidthOrHeight, useWebWorker=false, maxIteration = 10, exifOrientation, fileType }\n * @param {number} [options.maxSizeMB=Number.POSITIVE_INFINITY]\n * @param {number} [options.maxWidthOrHeight=undefined]\n * @param {boolean} [options.useWebWorker=true]\n * @param {number} [options.maxIteration=10]\n * @param {number} [options.exifOrientation] - default to be the exif orientation from the image file\n * @param {Function} [options.onProgress] - a function takes one progress argument (progress from 0 to 100)\n * @param {string} [options.fileType] - default to be the original mime type from the image file\n * @param {number} [options.initialQuality=1.0]\n * @param {boolean} [options.alwaysKeepResolution=false]\n * @param {AbortSignal} [options.signal]\n * @returns {Promise}\n */\nasync function imageCompression(file, options) {\n const opts = { ...options };\n\n let compressedFile;\n let progress = 0;\n const { onProgress } = opts;\n\n opts.maxSizeMB = opts.maxSizeMB || Number.POSITIVE_INFINITY;\n const useWebWorker = typeof opts.useWebWorker === 'boolean' ? opts.useWebWorker : true;\n delete opts.useWebWorker;\n opts.onProgress = (aProgress) => {\n progress = aProgress;\n if (typeof onProgress === 'function') {\n onProgress(progress);\n }\n };\n\n if (!(file instanceof Blob || file instanceof CustomFile)) {\n throw new Error('The file given is not an instance of Blob or File');\n } else if (!/^image/.test(file.type)) {\n throw new Error('The file given is not an image');\n }\n\n // try run in web worker, fall back to run in main thread\n // eslint-disable-next-line no-undef, no-restricted-globals\n const inWebWorker = typeof WorkerGlobalScope !== 'undefined' && self instanceof WorkerGlobalScope;\n\n if (process.env.BUILD === 'development') {\n if ((useWebWorker && typeof Worker === 'function') || inWebWorker) {\n console.log('run compression in web worker');\n } else {\n console.log('run compression in main thread');\n }\n }\n\n if (useWebWorker && typeof Worker === 'function' && !inWebWorker) {\n try {\n // \"compressOnWebWorker\" is kind of like a recursion to call \"imageCompression\" again inside web worker\n compressedFile = await compressOnWebWorker(file, opts);\n } catch (e) {\n if (process.env.BUILD === 'development') {\n console.warn('Run compression in web worker failed:', e, ', fall back to main thread');\n }\n compressedFile = await compress(file, opts);\n }\n } else {\n compressedFile = await compress(file, opts);\n }\n\n try {\n compressedFile.name = file.name;\n compressedFile.lastModified = file.lastModified;\n } catch (e) {\n if (process.env.BUILD === 'development') {\n console.error(e);\n }\n }\n\n return compressedFile;\n}\n\nimageCompression.getDataUrlFromFile = getDataUrlFromFile;\nimageCompression.getFilefromDataUrl = getFilefromDataUrl;\nimageCompression.loadImage = loadImage;\nimageCompression.drawImageInCanvas = drawImageInCanvas;\nimageCompression.drawFileInCanvas = drawFileInCanvas;\nimageCompression.canvasToFile = canvasToFile;\nimageCompression.getExifOrientation = getExifOrientation;\n\nimageCompression.handleMaxWidthOrHeight = handleMaxWidthOrHeight;\nimageCompression.followExifOrientation = followExifOrientation;\nimageCompression.cleanupCanvasMemory = cleanupCanvasMemory;\nimageCompression.isAutoOrientationInBrowser = isAutoOrientationInBrowser;\nimageCompression.approximateBelowMaximumCanvasSizeOfBrowser = approximateBelowMaximumCanvasSizeOfBrowser;\nimageCompression.getBrowserName = getBrowserName;\nimageCompression.version = __buildVersion__;\n\nexport default imageCompression;\n"],"names":["u32","UZIP","eocd","data","length","rUi","_readLocal","roff","out","csize","usize","onlyNames","rUs","nlen","buf","Uint8Array","Math","floor","adler","crc","level","F","deflateRaw","p","cpr","zpd","file","bin","sizeUTF8","tot","o","_writeHeader","i","ioff","wUi","ext","fn","obj","n","c","off","len","table","end","buff","str","charCodeAt","code","_goodIndex","_hash","putsE","_putsE","dlen","li","mch","lits","dst","lgi","dgi","lc","cvrd","ci","cl","j","U","pos","l0","BTYPE","o0","makeCodes","dtree","itree","si","dxb","p8","dset","b","tree","set","push","lz","l","_hufTree","list","hl","hst","l2","slice","maxl","MAXL","lit","bCost","MD","dbt","arr","v","ch","ltree","u8","noBuf","HLIT","HDIST","HCLEN","ML","bitsE","ttree","mx1","dmap","ebs","ldef","_check","lmap","LL","_bitsE","_copyOut","bl_count","MAX_BITS","dt","Uint32Array","flmap","u16","fdmap","strt","x","rev15","sv","exb","w","height","h","img","frames","fh","frm","dispose","bpp","area","bf32","buffer","ctype","depth","tabs","tRNS","ts","ti","ap","y","bf","qi","cj","t0","di","gr","al","tr","readASCII","doff","num_frames","num_plays","del","offset","fd","readUint","type","text","keyw","readUTF8","pl","PLTE","foff","bpl","interlace","CgBI","UPNG","inflateRaw","decode","_inflate","dd","_filterZero","_readInterlace","H","N","m","Z","W","A","u","C","r","D","X","Y","e","I","V","R","M","S","starting_row","row_increment","pass","cr","cc","row","starting_col","bpll","val","col","cbpp","sh","_paeth","pa","pc","s","fb","ifa","tb","fr","fg","mode","fa","sb","ba","bufs","nimg","encode","_main","ac","_bin","wUs","wAs","dl","anim","leng","sRGB","pHYs","loop","cimg","imgd","nh","onlyBlend","inds","nbufs","cof","bln","ind","ilen","img32","ceil","inj","gotAlpha","frms","nx","tlim","forbidPrev","alwaysBlend","it","pimg","mix","evenCrd","sarea","min","miY","r0","miX","max","_updateFrame","rect","width","U8","pimg32","cx","miy","blend","rec","ftry","filter","opts","paeth","k","oimg","nimg32","KD","quantize","getKDtree","root","nd","a","err","i0","maxL","splitPixels","i1","node","left","planeDst","ln","rn","getNearest","q","d0","d1","d2","g","stats","m0","Rj","m1","iN","m3","Cov","round","M4","noff","isBrowser","window","cordova","CustomFileReader","resolve","reader","onload","result","readAsDataURL","Promise","Image","CHROME","test","browserName","BROWSER_NAME","approximateBelowMaximumCanvasSizeOfBrowser","maximumCanvasSize","drawImageInCanvas","canvas","png","Blob","fileLastModified","then","$await_11","testImageCanvas","$await_13","cachedResult","view","getUint32","little","maxWidthOrHeight","getExifOrientation","maxSizeByte","cnt","worker","script","blobArgs","Worker","value","createSourceObject","parse","Number","imageCompression","getDataUrlFromFile","getFilefromDataUrl","loadImage","drawFileInCanvas","canvasToFile","handleMaxWidthOrHeight","followExifOrientation","cleanupCanvasMemory","isAutoOrientationInBrowser"],"mappings":";;;;;;;uhFA0jBKA,EApjBLC,KAAA,0HAUCC,EAAGC,EAAAC,OAAA,EACH,WAAAC,EAAAF,EAAAD,8BACyB,UAEE,qBAIvBG,OADJ,iGAaMF,iEASPF,KAAAK,WAAAH,EAAAI,EAAAC,EAAAC,EAAAC,EAAAC,UAK4BH,6CACAI,sGAY3B,qBAC2B,YAEoB,6CAIdC,gIAetB,+CACZC,EAAA,IAAAC,WAAAL,kDAIW,WAAeI,0MAOK,EAAAA,EAAA,IAAAC,WAAA,GAAAC,KAAAC,MAAA,IAAAd,EAAAC,cAC9B,QAAmB,GAAA,uDAETc,QAAA,EAAAf,EAAAC,sBACFe,eACJ,UAAe,kCAEC,IACpB,IAAAJ,uEAEIK,8DAEInB,KAAAoB,EAAAC,WAAAnB,sBACR,IAAAY,sCACO,2FAKJ,IAAAQ,6GACOC,EAAAvB,KAAAqB,WAAAR,GAAAA,gBAEeW,KACxBA,EAAAF,GAAAG,KAAAtB,OAAA,GAAA,GAAA,EAAAH,KAAA0B,IAAAC,SAAAL,8BAA2CM,GAAAC,EAAA,mDAExCC,4BAA4BC,EAAP,EAAOC,iBACxBR,yHAUUS,EAAA/B,uEAMSgC,EAAAC,kKAI3BV,EAAAW,EAAAX,6CAAsB,gCACA,qCAKKQ,EAAA/B,KAAvB,SAAoC+B,EAAA/B,0CAEpC,+BAGJ,EAEA,yBAEmB+B,EAAA/B,oFAOOgB,IAAA,iDAG1BmB,EAAI,EAAAA,oGAMkBC,EAAAzB,EAAA0B,EAAAC,kCAENC,MAAI,KAAAH,EAAAzB,EAAA0B,EAAAR,KAAAO,IAAA,SAAUA,yCACxBtC,KAAAkB,sFAQPwB,obAW2BC,wEACdzC,qCAAgBmC,qFAGF,mKAOnBN,8CACL,yDACAA,GAAA,4NAEDY,EAAArB,kGAQiCsB,EAAAC,6GACrB,IAAA,WAAAC,qOAgBX,yBAC4E9C,KAAAoB,EAAA2B,WAAA/C,KAAAoB,EAAA4B,UAAAC,EAAAjD,KAAAoB,EAAA8B,iDAC9CC,GAAA,mMAEyF,gBAAoE,6GAK7LC,4JAWCC,8HAQFC,EAAAF,aAEAE,EACKF,EAAA,GAAAG,GAAA,GAAAC,GAAA,EAAAC,iCAsBJC,6BACoCC,kBAEjC,+DACoB,kGAKnBC,qHAIJ,6EAGC,QACC,EAAAC,2BAGKC,EAAAD,EAAA,MAAL,yWA6BC,8EACCzC,EAAA2C,0IACGC,OAAsB,cAA2BC,gSAAiD,sEAGzG1D,EAAAyD,EAAO,EAAAE,qDAKmFhE,EAAAiE,EAAAF,EAAA1D,EAAAyD,8GAI5EhE,KAAAoB,EAAAgD,YAAsBC,oCAE5BrE,KAAAoB,EAAAgD,qCACGL,EAAAO,qFAER,EAAAvC,YACAiC,IAAAjC,IAAauC,kHAIiB,EAAAC,2FAKhC,KAAA,gEACkB,iFAGpBP,GAAAD,EAAAS,IAAAf,qJASW,QAAD,GAQVgB,GAAA,2CAQ2BjC,yBAAkB,0BAAWpB,WAAWA,qCAAWA,sKAE5DsD,EAAA3C,sGAGW,oCAAqD,oBAAF4C,EAAe,sNAEzCC,KAAA7C,kCAAkD,SAAA8C,qCAE1F,sLAMC,uBAGTrC,uBACMT,EAAA,EAAAS,EAAAoC,4EAAM7C,EAAA,0DAChB+C,KAAA,iEAGC/C,EAAA,IAAgC,EAAAS,GAAOoC,EAAAG,EAAA,IAAAC,kGAQ7BC,6BAAWC,KAAAC,kDAAKP,4BAA6BQ,qCAEvDjF,OAAAkF,EAAAH,EAAAI,MAAA,SAAA5C,sGAGOiC,wMAGc,yBAImBY,kEACjCA,EAAAC,yBAG4BC,KAAA,mLAOtC1D,EAAA,EAAA2D,EAAA,GAAAH,EAAAI,EAAAC,EAAA,yBAEWjB,6FACVe,GAAS,+DAAuC3D,oDAChD6D,sJAGDC,EAAA,EAAA9D,IAAA+D,IAMO/D,GAAP,oEAS0CgE,SAA0BC,EAAA,GAAAD,GAAA,yDAG/D7F,wBAAoD,IAAA+F,EAAA,iGAA6BlC,YACjFmC,gDAA8E,EAAAC,EAAA,EAAAC,EAAA,EAAAC,EAAA,EAAAC,EAAA,EAAAX,EAAA,uBACpCzF,iJAUxCqG,wBAAP,IAAAxE,EAAA,EAAAA,EAAA,GAAAA,GAAA,uBAC6BA,KAAK,kFAA0BiD,QAGvDqB,iEAGY,MAAU,EAAAF,EAAQC,EAAAlG,EAAA8D,EAAAD,EAAAyC,4JAU3BC,EAAAC,qBAEDxG,EAAA8D,GAAAsC,6FAIPK,EAAA5C,EAAA6C,KAAAnB,EAAA,KAEyB/C,EAAAH,wGAExByB,GAAU,wEACVnD,EAAG0B,GAAA1B,EAAA0B,IAAAgB,4FAnCoBvD,KAAAoB,EAAAyF,OAAAhG,EAAA0B,EAAAC,qEAsCnBrC,QAAEoC,EAAA1B,EAAAA,EAAAyE,MAAA,EAAA/C,8DAAuD1B,iFAEzD,SAAAiG,EAAAC,EAAAvE,EAAAtC,EAAA8D,EAAAY,kBAAiDxD,EAAA4F,qFACjDvB,0DACkB,sGAIQwB,SAAH,4BAAiB,EAAAlF,+GAI7CA,+BAEQ,8BAGHgC,EAAA/D,KAAAoB,MAAoCwD,aAClCsC,SAAanF,OAAAoF,EAAApF,gCAGYA,sDACzBe,wFAEwC,SAAA8B,sFAGxCA,oUAGPwC,EAAOvF,EAAP,mDACyBmC,EAAA7D,oEAarB,SAAciH,EAAApD,8BAAgC,qBAApB,uGAIzB,oBACM,SAAcoD,EAAApD,uGAGpBjE,EAAAsH,YAAA,iBAKY,mBALZ,sDAAA,iBAQA,EARA,EAAA,EAAA,GAAA,GAAA,GAAA,GAAA,GAAA,GAAA,GAAA,GAAA,GAAA,GAAA,GAAA,GAAA,GAAA,GAAA,GAAA,GAAA,IAAA,QASF,QAAI,0EATF,EAAA,EAAA,EAAA,EAAA,EAAA,yBAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,GAAA,GAAA,GAAA,GAAA,GAAA,GAAA,GAAA,IAAA,IAAA,IAAA,IAAA,IAAA,IAAA,KAAA,eAAA,KAAA,KAAA,KAAA,MAAA,MAAA,MAAA,MAAA,wBAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,GAAA,GAAA,GAAA,GAAA,GAAA,GAAA,GAAA,KAAA,cAAA,IAWYC,MAXZ,IAAAC,EAAA,YAAA,GAYMC,MAZN,IAAAD,EAAA,WAAA,cAAA,OAeKvB,MAfL,SAAA,QAAA,IAAAuB,EAAA,aAAA,cAAA,WAAA,eAAA,kBAAA,gBAAA,oCAHME,KAAA,IAAAF,EAAA,wNA8BK,GAAA,SAAAG,IAAA,EAAE3D,EAAA4D,yEAA+CC,oCAAwC7F,IAAA,EAAAgC,EAAA8D,IAAA9F,uQAoB3F/B,KAAAoB,8QC5lBR0G,EAAIvH,UAAwBA,EAAIwH,UAExB,2IAGVvF,EAAMsF,EAAAE,IAAiBC,kEACW1H,EAAA2H,kCAAuBnG,yGAIf,IAAA,IAAU+B,uDAEMqE,0GAKgB,GAAmB,GAAfC,EAAAC,wJAKlFC,6DAGwB,EAAAC,GAEtBC,oBAA0BC,QACxBC,IAAAA,MACIC,EAAYpI,EAAZoI,qCASA,eAAiD,KAAQ,IAAK,wEAAO,MAAH,IAAiB5G,iCAAQ,YAA4BxB,EAAAqI,KAASC,cAAxIC,8FACgD/G,EAAKwG,sFAEtC,SACPxG,IAAYA,kBACV,IAAiB,IAAAyG,EAAAzG,GAAe,KAAJ,WAAA,WAAA,gEACV,EAAAA,IAAWA,OAAiBA,OAAqB,IAALyG,EAAAzG,GAAU,UAA+BgH,SAAO7I,EAAtC6I,EAAsC,0EAG3G,4BAEAF,SACHG,EAAA7I,iCAES8I,uFAINC,EAAAC,GAAW7H,EAAI8H,sEAG0DpB,EAAGiB,mCAI5EI,wGAMF,WACH,IAASrB,EAAIiB,wBAGPlH,IAAMA,IAAD,GAAesH,cAA0BnJ,QAAA,eAAL,OAC3CgJ,EAAAC,GAAS7H,oFAErB6H,4FAIiB,qBAEOpH,oBACJuH,EAAKvH,GAAM,YAAwBoH,KAAaI,IAAMJ,OAAiBD,IAAA,2BAC3BnH,EAAGwG,EAAHxG,IAAe,YAAS,QAAcA,GAAD,0EAK/ExB,EAAAqI,iBACVK,IAAKA,yCAGqBvB,EAAMI,MAAK,iBAChCvF,wEAAkD,eAA6BuF,EAARJ,IAAc,CAEtG8B,0FAEQb,MACGjB,EAAI,IAAOI,EAAIJ,UAClB,IAASxH,SAAA,gBAAA,YAAgBuJ,0CACF,WAAU,EAAK/B,EAARI,EAAeJ,IAAK,MAAOxH,EAAKqC,EAAKmF,OAAyB,oDAGvF,EAASA,aACFnF,UACdiH,IAAStJ,EAAOqC,WAAXkH,+EAKPvJ,mEAEI0I,QAASV,iDACuD,IAAG,GAAH,GAAkB,uFAG7E/H,0CAEAuB,EAAAgI,UAAcxJ,eAGjB,6GACc6B,MAAO4H,yBAC6C,qBAC1BC,WAAWxJ,EAAMF,KAAP2J,UAAsCzJ,6CAEjF,UAAA,2CAEqB,iCACrBG,kEAEY0I,gDAEnB/I,IAAgB,IAAK4J,MAALC,sDACkCD,WAA0B5J,EAA3B6J,8CAIjD,uBACQ,EAAMhI,IAAMiI,IAAAjI,iBAAS,8BAEtB,6DACO,WACd,eACQA,mBAAAL,EAAAuI,sCAAiE,QAAtBC,EAA6B,gIAS1F,gDACyCC,mEAEjC5J,EAAAqI,KAAAsB,2BAAkB3H,sBAClB6H,kFAK0BlK,iCACAwB,EAAA2I,0GAIeF,EAAAzI,EAAA2I,oCAGvBF,UAAiD,QAAJD,uCAAkF,QAAJA,OAC/II,EAAK/J,EAAAqI,KAAA2B,KAAApK,mBAA4B,OAAiB4B,IAAAA,qDAEzC,WAAAxB,EAAAqI,KAAAsB,sBACT,GAAA3J,EAAAmI,uBAA+B,aAAAnI,EAAAqI,KAAAsB,uFACtB,iGAGa,6DACL3J,EAAAqI,KAAAsB,iBAAkF,qBAG3CxI,EAAAuI,cAD5CF,mFAGsD,EAAWS,yHAEnBjK,uDAIjD,+CAC6CkK,2CACxCC,8BACTC,KAAIC,KAAAC,gBACTD,KAAAE,OAAAC,SAAkBC,sBAGyBJ,KAAAE,OAAAG,YAAwBD,IAAS,EAAAlD,wBACnE8C,KAAAE,OAAAI,+IAMT,GAAIC,EAAAA,oDAA2C,mJAEzCC,EAAAjL,SAAA,GAAkB,wBACtBkL,EAAOhJ,MAAA,QAAqB,WAI9BiJ,YAAIC,8DAAiC,MACrCC,MAAS,EAAT,yFACQ,+FACRxG,EAAAL,EAAA8G,GAAK,MAAa,gGAClBC,EAAAC,SAAWC,SAAcA,IAAMF,iBACzB5F,SAAQ+F,uEACZ/D,EAAAxG,EAAQ,SAAe,mIACzBwK,EAAkBhE,4EAVxB,6HAEAA,wBAUWyD,+BACkDH,EAAKG,iIAE9CJ,EAAAA,kBACdY,EAAIX,yCAAYI,EAAAQ,0EAEVC,IAAM,+FAKZV,EAAiBW,EAAAD,WACvB5J,IAAemJ,EAAA,sBACH,KAAKW,IAASX,EAATD,yGACeH,eAAsDI,EAAaxG,cAA5BoG,4EACxD/I,EAAA,EAAA0J,EAAA,wDACQ,QAAjB/G,EAAI,iGAIqBA,aACtBmH,EAAInH,GAAA,+CAAgBsG,GAAAD,sEAGIhJ,iCAAkCkJ,EAAIH,IAAM,QAASc,EAAAV,0BACnED,KAAJW,0DAAoBd,OAAJc,MAAsBX,8IACtCA,EAAAW,sSAKCpI,EAAA,IAAAsH,4qBAGQ,eACpBa,iDAAAA,cAAUA,mBAA6BA,IAAmB,0GAEjD5J,IAAK2C,kBAAwBwG,EAAA1G,KAAI,6BAEjCsG,EAAAgB,EAAAF,IAAA,gBAAqBd,EAAA9J,EAAA4K,IAAA,uEAChCf,EAAAA,EAAAK,wKAK4D,gCAE5DxD,EAAIzH,EAAIwH,OAAWO,mDACdL,mBAAKwC,OAKc4B,GAAK,QAAA,YACpB,EAAA,WAAoBC,EAAK,CAAY,UAAe,2BAKhBC,EAAY,kCAE3CC,6BAAcC,uFACkBxD,EAAI,IAAWoD,KAAOK,gBAAmBC,WAAWC,eACmCC,QADNvE,6BACvHoE,EAAAjC,GAAaqC,2BAAyC,QAAWD,EAAM3M,sBAASwM,EAAAjC,8BAAkC,QAAWoC,EAAM3M,uBAASwM,EAAAjC,iCAAkC,sBACpK,IAAAsC,EAAAjJ,0BACdwE,yBACOgB,GAAD0D,4CAC0F,qBAA0C,KAAQ,sGAE7HzM,wBAAgBqK,KAAAE,OAAYmC,mBAAE3E,aAAkBgB,EAAK,EAADY,oBAAsChK,EAAAqC,sBAC7G,IAAMmF,IAAFA,qDACoBuB,EAAMjB,EAAGiB,WAAiD,kBAAjCwB,QAAS,aAA4C/C,IAAIxH,IAAAwH,kBAAU,KAAI,UAAUA,IAAExH,EAAJ6B,EAAI2F,gEAC9HA,EAAG+C,0DAAmB1I,KAAO7B,IAAAwH,2BAAaA,IAAKxH,EAAF6B,EAAE2F,GAAPxH,IAAAwH,6CAAsCxH,IAAAwH,kHAChF,aAAOpF,eAA2C4K,EAAS5L,iCAA0C4L,EAAAA,cAAmBC,EAAKA,yBACpG,iFAEjBjN,wCAAqC6J,iBAAaA,GAAWA,eAAKA,GAASA,kBAAUA,GAASA,+KAE7DpH,EAAArB,GAAWe,GAAN,EAAgB,IAAGM,IAAA,0DAAaA,EAAArB,gLAAmB8L,EAAI,2FAAYA,kGAAuBvH,2FAAmBxD,qCAAQ2C,wBACxIA,MAAOoI,4CAAE,+BAAmBA,oKAKjE,kLAA6F,yBAAWC,2DAEhGC,EAAM,yBAAsBC,EAAAxE,EAAA,SAAWwE,IAAA,IAAcC,iBAC/CC,qBAAyBH,gBAAII,EAAgB,CACvDC,EAAIC,EAAArJ,EAAS,uBAAIA,EAAK,KAAGgJ,sCACfC,2GAAkBjJ,EAAK,yBAAM,OAAoBwE,EAAK,yBAAG,kBAAkC0E,8BAEjGI,6CACoFC,kDAE9FC,oFACKnD,KAAAoD,OAAAC,yCAC+BH,yBAChCC,EAAO,CAAArF,2BAAA,yBAA+C+D,EAAAyB,GAAHvF,MAAyBb,MAAM/F,oCAAc2F,wNAGqB,2BAAoBxG,UAAgB0J,KAAAuD,eACzJC,EAAMxD,KAAAuD,iBAASE,yBAAc,yBAAQ,IAA6C,2DAC1E,sCACJ,EAAAtM,EAAOuM,yCACPA,qDAGCC,OAAc,sCACC,GAAAzK,qCAEN0K,aAAkB,GAAM,0BAAU,MAAItO,EAAA6B,iBAAiC,QAAIgI,iBAAqBA,YACnGA,KAAU/B,QAAU,KAAmBW,4FAIbzI,WAAgB6J,KAC/B,UAAQA,MAAqBnB,EAAA6F,OAAvDvO,8BACO0I,EAAA8F,SAA2BxO,EAAO6J,OAAQ7J,iBAAmBA,oBAAWA,OAAY0I,EAAA8F,SAA3FxO,kBACE+B,EAAI/B,MAAcgB,EAAMhB,wBAAkDA,EAAM6J,EAAM,KAAS7J,EAAH6J,KAAe,QAA7G9H,0BAA0HA,EAAI/B,OAAc,MAAA0I,EAAA+F,iBAAWzO,SAAQA,EAAgB6J,EAAD,GAAF,KAAdA,GAA8C,GACnK,WAAA,CAA0F9H,EAAI/B,2BAAsBA,kBAAuB,uBAC1K6I,sCAAkBpE,mDACDzE,OAAjBoO,oCACCA,oBACmDvE,GAAc,MAAgChI,IAAUA,EAAMuM,EAAMvM,uBAAgC,GAAgC,WAAKuM,EAAyDpN,EAAMhB,EAAS6J,EAAAuE,EAAqB,IAAY,gEADrSxK,0BAAA,iKACqvB0J,4CAAwDoB,+CAExzBP,6DAEIQ,EAAU9E,KAA0B7J,KAAboO,IAA6BpO,0BAElD6J,EAAK,YAAmD,eAAD,EAAoD7I,MAAD,EAA0B,2CAEpF,wGAChD,IAAAJ,WAASgO,EAAc1G,EAAdqC,cACTG,KAAAoD,OAAA/C,YAA2B7C,8EAE7B2G,qCAAwD,QAAe,IAA+BjL,EAAK,yBAAUmE,sCAC1FlG,sDAOjB+L,oBAEe,GAC3BkB,kBAIMC,SAAuBlN,EAAM,8FAKjCmN,EAAM,iCAEG,sBAETC,eAAShP,2DAA2B2D,EAAA,0NAGpCsL,GADAC,IAAalP,2DAILmP,oFAKOhN,8NAcTyF,+BACmC6G,EAAJnG,yCAGzC1H,KAAAwO,0CACWC,EAAAR,kBAEHjN,EAAAkH,EAAAwB,QAAcxB,UAClBN,4NAMcD,IAAeJ,SACxB,GAAA,GAAAmH,wDAIQ,IAAOlH,aACpBY,MAAQ4E,IAD2C,wDAI9B3F,EAAAH,MAAgBG,EAAAqC,4CAIVvC,OAASwH,wBAGtB,yCAML5B,uCAAkChK,MACpC,IAAAuD,sBAAXsI,oBACsB,YAAK,SACrBC,EAAOC,GAAAC,GAAA,MAAA,4BAAc,IAChBC,qBACLC,EAAO,IAAAlP,uBAAc,IAAAuG,cAAoBvD,EAAA,EAAUiM,IACnDE,oBAA0B,EAAAhH,EAALjB,oEAM3BiB,WAAwCA,+BAGlCiH,IAAsB,IAAtB,+CACAC,uCAMoCH,kCACvBN,IAAA,GAAArH,aACjB,IAAAvH,sDAEe,qFACFmI,6EAKbyG,EAAA5K,sCADUmD,sBAEoB,oFAGdlH,KAAAqP,aAAQC,WAAgBC,EAANrH,OAA8E0C,EAAK,GAAA4E,IAAAF,iBAA9CC,EAAA5I,uBAA8C6I,SAA9BxP,KAAAyP,IAAUF,EAAArH,EAADqH,mDACpB1F,KAAAoD,OAAAyC,0EACP,mDAClD1O,IAAW2O,KAAAC,uFAI5BC,uCAC+C,IAASC,oDAClD,IAAAD,8CACC,0IAQJE,EAAQb,IAAGA,kBACLc,4CACsG,MAACd,YAAyB,EAA3Bc,gBAAlH9H,sCAEwClH,GAAGyL,EAAAkD,KAAa/E,EAAA6B,EAAAwD,iDAAsB,kCAAehB,IAAHhI,EAAawF,EAAGvF,4FACxDH,kEACnC,SAAA8G,kCACEqC,EAAcN,qDAc6B,uDAA4CO,EAAG,CAAKC,gCAAiBC,sCAEhHjR,wBAAgB8I,IAAKA,+DAGpBmI,mJAUlBC,EAAAzG,KAAAE,OAAwBmC,eAClB/C,cACoBO,MAAA,uCAExBvK,EAAA2E,qBAAa4D,YAAqCa,QAC7C,qBAEoB5B,4EAG3BuB,SACe,8BAAoDiB,mCAAe,GAARA,wHAExE,uEAGgB,EAAAxC,QAAiBxH,EAAKoJ,EAAL5B,sCAC/BY,EAAAZ,wDAEI,KAAG,OAAM,wDADLA,sHAOS,gCAInB4J,YAEY,qBAA2B,mDAOvChP,aACA,QAAYP,4EAEIF,6FAIO0P,EAAA,IAAAzQ,2BACvB0Q,EAAS,IAAAnK,sBACLoK,EAAK7G,KAAA8G,SAAAC,eACPC,gBAC0EhH,uBAC1EgD,EAAA2D,EAAkBhE,EAAViE,EACZhP,WAEIwM,0CACkB,YAEdjN,EAAK,gIAKO8P,gDAGKlG,EAAUiC,EAAA7L,6CAC7B+P,wEACkB/P,qCAEjB,MAALgM,EAAKtF,yEAEUsJ,2CAEfC,4FAC4BJ,gFAIJK,EAAA,IACtB,IAA2B,qDAC3BA,IAAA,mBAC6CrH,KAAA8G,SAAAQ,gLAKjBnE,2DACKoE,GAAUC,qEAC5BhH,wJAIjBgH,EAAAC,yFAE6B,EAAUtQ,4JAGUuQ,mDAI3CT,gBACcA,sBAClBU,iDAA2BD,iBAC3BE,EAAK5H,KAAA8G,SAAAe,uEACiD,oGAAqBC,mBAAiBA,uCAE5EC,EAAAA,EAAUC,EAAVA,IAAAC,6DAENjI,4BACV,sCAGyBmD,qCAEdiE,GAAO,GAAIR,KAAA,6BACpB,WACiEQ,qEAKhEjE,EAAAhM,GAAWgK,EAAX,YAAA,YAAA,8DAGD,GAAI,IAAM,6BAAa,KAAA,EAAU,OACjCiG,SAA2BjQ,sFAEO4J,gCACCA,IAAAO,EAAA,kCACnC4G,EAAIA,wEAEJ5G,EAAA,GAAUA,UAAaA,mGAGvB6G,UAENC,qCAEiB,IAASC,QAEtBD,EAAAA,SAAwBA,EAAAE,+EACXC,2CACTC,EAAAJ,IAAe9G,EAAA,QAAmBiH,6BACxBF,mFAGd,eAAmD,0GAKjDP,OAAcQ,QAAUE,YAK9BC,MACEX,EAAAA,uEAIkB,IAALA,OAAP,GAA+B3R,KAAAuS,YAAA,KAA/B,yBAAA,wBAAJ,SAIJ1I,KAAA2I,6BAGQlI,2BAAiEvF,mCAAyBuF,EAAA,2CACjFvF,4FAKVmD,UAAWvB,EAAA,GAASuB,EAAT,UAAA,UAAA,uLAahBuK,oCACEvL,yBAEEA,SACFnE,yBAAkCgP,oBAAsB7K,kBAEtCtD,cACJoJ,MAAA,kECluBH,QAAA,iBAAA,yBAAA,oBAAA,mBAAA,8fCOT0F,6EAYgDC,OAAAC,gLAElDC,iZAmC2BvR,0DAK/BwR,oCAuC+BpS,2CAE3B,IAAAmS,iBACJE,EAAAC,OAAA,sBAAaC,mBACK,SAAAjI,YAAaA,IAC/B+H,EAAAG,oBAoBE,6BACA,IAAAC,SAAA,oBAEO,IAAAC,mCACkBlM,mCACC8D,8MA4BlBqI,0HAIC,UAAAC,sCAEP,WAAAA,QACJC,wEAEEA,EAAAC,2EA6BK,SAASC,wDACVF,mBACFG,mDAqBkBA,4WAmBtBC,yUAfMzM,yJA+BC,qxBAUiCsM,qcAkBII,uBAI1CC,EAAAhK,KAAAoD,oCAEAvM,EAAO,IAAAoT,KAAS,gMAKXpT,yHAaoBqT,+uCAmBLC,MAAA,SAAAC,iCAAAA,6CAElBC,qCACeF,MAAA,SAAAG,gBAAAA,gLAMWC,4VAqBV,iGAKhBC,EAAAC,gBAAA,qEAW2CC,0BAEvCvL,4BAG8C,6EAMtC,+CAMA,cAEE,SAAAgC,qPAwCEhE,EAAd4I,6BAGA4E,gyCCjWFC,mcAgBEC,6gCCrFN,IAAIC,6BAGFC,6BAEgBC,uCAGlBC,EAAA/Q,oCAIS,IAAAgR,kJAOT,2KAGoCjU,MACnB,yIAETkU,sLA2RR,8BAESC,y7FAjUTC,wmcC8EqBC,w+BAuBrBC,iBAAAC,sCACAD,iBAAAE,sCACAF,iBAAAG,UAAAA,UACAH,iBAAAzB,kBAAAA,kBAEAyB,iBAAAI,kCACAJ,iBAAAK,0BACAL,iBAAAX,mBAAAA,mBAEAW,iBAAAM,8CACAN,iBAAAO,4CACAP,iBAAAQ,wCAEAR,iBAAAS,sDAlHAT,iBAAA3B"}