@zip.js/zip.js 2.13.0 → 2.14.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/BENCHMARKS.md +46 -1
- package/deno.json +1 -1
- package/dist/zip-core-external.js +594 -935
- package/dist/zip-core-external.min.js +1 -1
- package/dist/zip-core.js +461 -908
- package/dist/zip-core.min.js +1 -1
- package/dist/zip-fs-core-external.js +601 -938
- package/dist/zip-fs-core-external.min.js +1 -1
- package/dist/zip-fs-core.js +468 -911
- package/dist/zip-fs-core.min.js +1 -1
- package/dist/zip-fs-external.js +601 -938
- package/dist/zip-fs-external.min.js +1 -1
- package/dist/zip-fs-native.js +470 -913
- package/dist/zip-fs-native.min.js +1 -1
- package/dist/zip-fs.js +604 -941
- package/dist/zip-fs.min.js +1 -1
- package/dist/zip-legacy.js +463 -910
- package/dist/zip-legacy.min.js +1 -1
- package/dist/zip-module.wasm +0 -0
- package/dist/zip-native.js +463 -910
- package/dist/zip-native.min.js +1 -1
- package/dist/zip-web-worker-native.js +1 -1
- package/dist/zip-web-worker.js +1 -1
- package/dist/zip.js +597 -938
- package/dist/zip.min.js +1 -1
- package/index-native.cjs +470 -913
- package/index-native.min.js +1 -1
- package/index.cjs +604 -941
- package/index.d.cts +58 -12
- package/index.d.ts +58 -12
- package/index.min.js +1 -1
- package/lib/core/codec-worker-web.js +35 -11
- package/lib/core/codec-worker.js +33 -23
- package/lib/core/io.js +29 -21
- package/lib/core/streams/aes-crypto-stream.js +58 -99
- package/lib/core/streams/codecs/aes-hmac-sha1.js +348 -0
- package/lib/core/streams/zlib-wasm/aes-hmac-sha1-wasm.js +106 -0
- package/lib/core/streams/zlib-wasm/zlib-streams-loader.js +4 -0
- package/lib/core/streams/zlib-wasm/zlib-streams.wasm +0 -0
- package/lib/core/version.js +1 -1
- package/lib/core/web-worker-base.js +15 -9
- package/lib/core/web-worker-inline-native.js +1 -1
- package/lib/core/web-worker-inline-wasm.js +1 -1
- package/lib/core/web-worker-wasm.js +2 -0
- package/lib/core/zip-fs.js +7 -3
- package/lib/core/zip-writer.js +1 -2
- package/lib/core/zlib-streams-inline.js +1 -1
- package/lib/zip-module-wasm-base.js +3 -1
- package/package.json +1 -1
- package/lib/core/streams/codecs/sjcl.js +0 -795
package/dist/zip-native.js
CHANGED
|
@@ -445,7 +445,7 @@
|
|
|
445
445
|
Object.assign(config, DEFAULT_CONFIGURATION);
|
|
446
446
|
}
|
|
447
447
|
|
|
448
|
-
const t=[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],o=[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],r=[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],e=[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],n=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],A=new Uint8Array(288);A.fill(8,0,144),A.fill(9,144,256),A.fill(7,256,280),A.fill(8,280,288);const s=new Uint8Array(30).fill(5);function B(t){const o=new Uint16Array(16);for(const r of t)o[r]++;o[0]=0;const r=new Uint16Array(17);for(let t=1;t<=15;t++)r[t+1]=r[t]+o[t];const e=new Uint16Array(t.length);for(let o=0;o<t.length;o++)t[o]&&(e[r[t[o]]++]=o);return {o:o,symbols:e}}const l="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",i=(z$1=()=>function(l){let i=0,z=0,V=0,w=new Uint8Array(1024),F=0,a=0;for(;!a;){a=d(1);const t=d(2);if(0==t)b();else if(1==t)f(B(A),B(s));else {if(2!=t)throw new Error("invalid deflate block type");f(...N());}}return w.subarray(0,F);function g(){if(i>=l.length)throw new Error("unexpected end of deflate data");return l[i++]}function d(t){for(;V<t;)z|=g()<<V,V+=8;const o=z&(1<<t)-1;return z>>>=t,V-=t,o}function b(){z=0,V=0;const t=g()|g()<<8;i+=2,v(F+t);for(let o=0;o<t;o++)w[F++]=g();}function f(n,A){let s=u(n);for(;256!=s;){if(s<256)v(F+1),w[F++]=s;else {const n=s-257,B=t[n]+d(o[n]),l=u(A),i=r[l]+d(e[l]);v(F+B);const z=F-i;for(let t=0;t<B;t++)w[F++]=w[z+t];}s=u(n);}}function N(){const t=d(5)+257,o=d(5)+1,r=d(4)+4,e=new Uint8Array(19);for(let t=0;t<r;t++)e[n[t]]=d(3);const A=B(e),s=new Uint8Array(t+o);let l=0;for(;l<s.length;){const t=u(A);if(t<16)s[l++]=t;else if(16==t){const t=s[l-1];let o=d(2)+3;for(;o--;)s[l++]=t;}else l+=17==t?d(3)+3:d(7)+11;}return [B(s.subarray(0,t)),B(s.subarray(t))]}function u(t){const{o:o,symbols:r}=t;let e=0,n=0,A=0;for(let t=1;t<=15;t++){e|=d(1);const s=o[t];if(e-n<s)return r[A+(e-n)];A+=s,n=n+s<<1,e<<=1;}throw new Error("invalid huffman code")}function v(t){if(w.length<t){let o=2*w.length;for(;o<t;)o*=2;const r=new Uint8Array(o);r.set(w.subarray(0,F)),w=r;}}}(function(t){const o=(t=String(t).replace(/[^A-Za-z0-9+/=]/g,"")).length,r=[];for(let e=0;e<o;e+=4){const o=l.indexOf(t[e])<<18|l.indexOf(t[e+1])<<12|(63&l.indexOf(t[e+2]))<<6|63&l.indexOf(t[e+3]);r.push(o>>16&255),"="!==t[e+2]&&r.push(o>>8&255),"="!==t[e+3]&&r.push(255&o);}return new Uint8Array(r)}("zL0Jc9s40jD8VyzXrIoYglySOixTglSJc4wncZLJMUdUSkqmQIuxBCoQFMWxtL/9q26AJCTLmezu83zPW0lZJIiz0Wj0hUYtXYlEZblwOLk9Ll6OGVM3C56nRxOeZoLX6/rXH88nA/3ocBJzh2ydsgJye7xa8qOlklmijrtJLpbq9oGU45uY05eXn3iiYkVfrOaXXMaCXozVNJb0sZS5jHP6LhOqo3Nn+BK29VuKb41IvyX0vHpZ0ovxIh7TR2M1/j3j63hGX8l8ni15vKJv+Vf1WCT5hMt4TRN5s1B5PKWLfKku+HI5vuLxhL6VY7FMczl/oyQfz+MFfc3Hk/HljJuEG/qHzJSVMKdn+Xwh+XKZ5cKkXdNHPLmTerllSz5L6Rf2Jc8mRwG9YscroaE3OaZvWAVu+o0Jvj7K6BkbDkf00P9RN82lM+PqiLOgy3tRq93lrktuIUkxvve5gx8VC+tqoPr9fvihcdrpRKdRo9OMMaF7NgxGQz5ianu45iJVsbCrep2ugtZwVo8EOxsqL4Ti3bOhwmpEv9/vfMBKo1arLkZbzDv8RF/Rr/QBPafv6Gv6ccTOuslsvFwePdaVyVWicgnop6bZ0s8Z32y8cDteLLiYQLLuQ7DRn7tFD4IN92dcXKlpF3JIFnSz1BF91qnXuX+5SlMui/7mCN6ZU6RT7l/eKP4yTZdcUUFoxoTXQRB2ZY9lXemyTlGYM/Uh96+4QsxzJK0FhApmJ7lNSOwq9hHHzkcfXg85wKMetVqjD+/wJWzrt3N8i5r67YGB1oevQ1GVeIUvRYlP+GZKbLemm6IrcYoVAv4T1uOoD3woR2TUNcBU2yuuHHIruVpJ8S+dut3qGfjriH9VXEyWR4ududAw5wbUCoH3uLtcLbh0blWxZBxOBblVfjlTVPhcfF7xFRCHLU1nq+XUqVAGMdxpkq6eC1HMkb/kSi9xJ6DKx/4Syv0v49mKM7HdEsoZdHy7LRbM0SOHU7VfdYEPrjIPpKuHfSSgDd1DeFC0yEqoqCq9AGwrSnwHX/TLc12BxvKjhww6k4yV7liWOgFjrGhms4G3slumDe6bIoqUWM2HRRkvHFHJHvozR5TjaESMMTmwCsYP/amjqKTBRlDuL2dZwp2AVpUQsqWXmdK9hQEWk1quHtNXVXQrsDoDi7xq/GdHeSFxdZ+2dF6OtRH9XFTXK+vhZT0OZ1XXpJ/wbOaofzYiQkjRCVNG1VkjpKIf1OuqXnf4UHjhiD30v8Cc4Us9CpsnzU6j3ez0+8oLaQjIsqVfYugNFYT1EUp8oGJHDIKNilWv14g8TtwwOD1thWE7Ojk5af/M6SzmrC99ma8Af/+585lsNo2ITnWlVJJbWHWakMMc1OuOZMMR6ao+a0Rd5bFGRKS/AJQXQB6CO3CVxaxxUhLrnAXdvFdORe66ZSUbPsxH/X5fQW3wjKNQ3YKiFYUGOygTBzRDpMlLpDEVIhDdrN4IqXKzfiMaiFj6i3zhEISh3G7pW3YLqL2Mb9/YqPLQtzHonx1arDhFNO3dG4/CgTTq+WbjSOj7P5sjQsUwHzGJhIzKXo91ytW5pWd2c8MR1ioo0HSoGaApKigJgBKTvV5nw4diRBv1f4nNxlF6nJJAuWrJ1EW9rioQdH52GnVBqCSEqu12S58wJIb7m1HRGSA8XeVfzvLk+k32jbNWGFHlf2LD8KQRtTrN8LRBm0HUiBqNZnhCo1Y7anQaYRDR6CQ8aTQ6Jx3aiDqtxslJKwpGVPmv2DBshZ1WEETNUxp2WqcnJ63GaYNGzSA4bZ2eBB3aaJy2mu3Tk040onzgKP8B4/6DYhERqvxzxv1zO+Ed4/47EitfciByZGt+q20MhlLSHqjwU1We++dsOKLcf8cCyrerxWSs+B1AHAN3J64q/pDDKmVv/dc+TGFFx6B/D0sy5Z9TDtOi/Hc0g79MurtIBasl658GwUl4ehq1mifN4PQ0JGoq8zUS49w5PhsLkauj6Xg5PZrnkh+p6VgcRR9ajSPvKDy6zNTyuOhBihiaAO0EXFoaTNJcjjWdrvScnde69eaFpMuBHeCuXYYo/6OT+svV5RjYUCds/7ykYftnZ+mGhBC6dFlo7TwLQ/ggG+DcX/tTYjg4/7wivP6DrrLgR4eAukDrRmRnHGbDi7phq841y6dRPdD5ijXhp7Mc8Np/989mdNo8bZ9Ep21YASb3BlCnW9TXJdz/6Ci764RUmGPwiorto4o8Fl97LDwdqLrY/EvVZcx7rHE6UB/EB3xu6U+qLjdCfz0pvmrSur3Qe0qxHfR6fAP8DdDv7UfH2vIBcjRnwn9AM8adTkD2OOBQc7EZsrjAqMKnlOXDYEQTlg/DEV2yfBiN6Jjlw8aIzlg+bO6z2ezkVLPZvM/Cdr3uYH3Cv3BCmg251xh9gJ+O/gmb5rc9KteCwtwtmhJX+ACwhC7pmLgzF6pyhf9qWE7PP6OAjDZBd8bGdMyWdIllGwFNCE1YSlOmtjAAHIWbbgIK48DBuAm+RSMck7vEt8YIh+aO8a05whG6s02w3dIX7DabL3KpnvEb2AdhvbzwHzpvkbtZ6vVM31YzDNw1E5tNyIF+B5uN6AW7CzQTX8azbHK0GMvxfHmk8qPF5fUkjcpVmbHQdWS/3yK9XqQnRIODrkyONa5bFO8eIuvlZIRODfu+1ot5wgoWZcEeajRnVa8VoSsWdic9J9tsQtJdwexBppQljPtcoCjoLKzFtRrBqmVhd9kT3aURfezMCaFjFnTHvaRYIWPINRyPPrBkONZIAzSmaLVeX/bSIi/UOAXGU0sLE5oOlyNCJy5rbg2iryv26J8dsqUP47/dlCgQ2SfsCZVGZhx1lf+CDQFUguLfUcksKP/FMBhVJOyfjahb7Kf9HGm4g0WIX1J+/y+HVItKsaCrejlKgRKEPDVip8FpK4qanfYHPlQjKochJoet5mmr1e5EHUzvmsZNxVAYCM+LYWilhZj2O060cHSJe3YwbrJx/4nDdUbK/V9YLbR2LRR0fmG1gOLT79WwtpPsii/3a6VAgH+HIRvmpqg9HJUgUQiSQ3SwwBOOq0S3vbs0TI6jXByNZ5KPJzdHutbJ0XQ+To6S8WzGJ7XjsnqspOy0HoXpOSfAt/xebMHTGruq14sXkJ9ej8Ukn/8O8tOSsTf0F3Z8Xi7N5XKdy8kx/Y0df8sWn5be+DKXykumPLn2ys/dUir6w4zq94KPvdMEbN+7GzUqW44evDo/gg17uVoAneGT40JaesbCNn3ObsV4zuPjVw+fPXoSHW/pZ6b88XKZXQnnFnb52GT45eLB2fF2S58T+tLKkikux9DHZRzyBrVLvPnlgReaIj+x4fGEy+wLfwgcwoj+yoYdGkY0bI/on2wYtmnUpI1oRN+zMKBP2TCg+G9EObeBTBVnnNfrU9j61YxTod9NFsUhj+QFLaI5/yHW8g823FP6jOh+ArCNf8Cqw/+bjfKfOTazhd+aI2Sx/oCtLWM72hFDZlkIfFazxlhWr7f1Twd+DtPxMV8eXfObo2X2jR8XDMUrNkwqcQ7oJnQ4ZVk37TV/ztyo000LvRRnyTAFEdJJ/5ExxoLNpsOwVf3eJEh6hNGIjHq9qPkB34zqo9cL2zqhY947H4TRsVBTJ1bB4Yuu5cMYqqFjNu71wg9Rp/GzM+73T4AzS4bpCLuUjT7wHbVXCrs8TT2vmp5k2KjzQRqnXnPUXcK2n/ZYc7PhveZAxUgDxVDpjo8+IPHDd9N1SIpMUqdMaUAK9F+NRlubbtjL/rnDaUC2E37v15Bsn+1RMMQBqorncIRio8YJ+MmBvc8K4cogxD1KxWzo5DBgXkKQIwQ/QFpZZsZSFnRrYjgbdWcfWLLZhIAHw3QEWyAiQMbSDylUkvZ6EfxpwJ9mN2MZKK0AENmH01MKdbCMymE2YjNkyIA3AzZtNhrpHq9Y2O40G0Fw+vP4Q7vVapz8vPwQtU5+Tj6YD52fZ3TNICkfZqMqNSt7rAXJJkqQIDpCq2u2RrRbgxqNKkjNRmzFVpi6gtTtbvlWWZ7BH0sGgyRlJ22flzoSWHWl2une5YY7dLHgbF7Xf4VbLBOmin82vQims6RVaTHzCvjbFJBhyVLAgzFLgc2dsRTY3BVLgc2F4azplE7ogvFhMPogoMQN6HwGjTiE93BE54wPI3iORvQav4VxA94bI3rJmnvoIxF51iwZLvSy+LAc3lRqzPFwXio4Z7gIrqGqyxGdsgQymiJzu8j1XpEFFnHDEZ2wBLKaQtd2ocVeoRtdCAeRQFZTaGEXutkrNNeFYKQua9IFW9MbNqVzNtkbdtOsGTVo1D0e8xFbFQDQOGQBAQnaqgIEkK2VBQvXHdE1W9AFu6E3bE7n7Jpes3XBFWTbLc0ObiuAZYgALxnX3MJPTOmHX5kqOakiATNY/JJNYP7UHMxLair6lWzfGyYAOvovIAZRkxDushAG2OWzJS/sEMVIgfqYQVLJkGJ3o1YLFGIDR7GA6hcxAO2OeZEDyYLYdSWJXVfAH0U5qCNcpgBw8CB6vQ78yoJ15tun0DlQtTmAyHps7/GZ4P4CIlKZGI4I2f5pdIW3WnuVpU7NkZV+1nA6w4p/tpUVal99J7u5y5oGtk9B5aCLSUuCEKSrhvnoA5NIpYe5G+JLqF8ifIn0SwNfGqNihA/9uaNoTrZbmnL2wn+IizfRzIewGRC/lOiA7VseylFxQoy9MZaYMb/HEHBb8IMxp3K8flW8KWrGZaxdAJdYUOQhi0wvxewmljrtwUpNuVBZguzaWT7hccpqwZbcGqPCUo0loOeKI+5RPT1bOl7eiOTINjnsqwCqLqZ0WXQloZzHS4p8djzeMtFNB854Pc7Uka6xsnoW0m0hoOpcU26+LLgjaUB/HSqQEVOG7/iGGqthMKohrd1ssmGIz+Foh7r/QraOoAlNoSqOVSUjNwKlNcMU807lQPkcjKGOLvgbIfHSISQ2/TZINdszdnjvPeuZ/OMZqHEKM8yaO4JyOqMBfQ8WqhKi2jZT8KK3iseKCh4LKnksDdyyreZQQe6v1xW51R3JTEcSZmAjq9bpUidaSYirY/YNqimk54pxmXNHcpqQrqhknXL1KCttzG4wqyxEiBm0pNNEIRgRAgMlhl0oOtF7PwjjYI9mv0eavdqw2ZDDTsBH0MFVvZ7u7s2F3DTeweAjMCsfky4vIT0GmYwUhrXZ/8yC+p9dH7JaHzmsj9TMcwLrQytJv3XlwFmy+1dKUblkfzgaD/XKKPanR46keytIElwBOZWEphU+J2aaxwafl4Uus0Tm4gFQeox2uyVFRfcedo9pUZb+mxieH8bwvKtZV8RZeQdnS7ScG4zcwV6aGUzlBaam7A6altqe9zYOPXIymhKDSKX8DdZUACPN0diqZV9Ob/UQAHgrR7E+90FYJbSc7glARxJr0r0QBv9tS6rK1+Us0ZymFrASABZQUCCfvDs2UKjXHcUeOWOqSv3mrNw3PQ24lbHZ2Jij9SL1uurzPXgKxrsgAhp7ElqDHQHiT7m/wzhcZ+bN/vGMgHIv6K56bOY9665c9myfliy4o+iKrtxnoLyq15d3CEvOEist3WzKLHlhINYTlhO6cmXVEV8iyVZ0BTqf3eUB+F5CUfjFLDCxms1Kgvm9HQimF/iQhBd6lhfVbg48h5I3BZem67G3e+dYjtfHWFMtBFYhGatkWuRPOKuFdLe+7dYJaE4/04D+BHT7e2se+rW0+vUWLejL8UzRl36lhaHicC8rlsNUuNu7pend/bVut06l9YEMcbqlLwlNaOdnJ/r5z6HUO2pJSwidVegwpgGFLIg7ViqkUV2aEGC6IdG8l1q4ollBb6/5zTKGv/GM5uBhVEzy71xmqdkZ4vWWKo7LMuN6J+fODBSUqcznzlNCkArx9VHKnRXZErquVuOE71o/GGNfBraDFiwizcmtGbsit5ytBF8mY2Ak0NXp3etzcE/KBRfKssepPaaB7EnEyjatohTL/WQ6lsCpPVCWA4IyiwFHtia+bhU0kuAPpqqhLHiBPOXqKe1liAJlzpvdQXP/DWBn+Xm+/xk0/Gabvf73t9mDc3aQc727+X7Z23y/s+3illJSgc1G+FY3KhXTFe5gFWQCGkaE7BZmO2WRoNCgxhw1DEFK9w+NiOyxoF10wCjtlRHZHuI2q51V9wu2opKlufyfgvV/B1cU2Gj+N/D9LvTKNVGwMAhzBCc7DE5Qu9zjYUQlbhhvAGCKAH+SszDagkR8tF8KvgVdqwAnsMdUYJdkd+v/cs/WX0Jc7EBcHoZ4viXUouiWtJOzYSNoNcPTzmmbtk7Dk1YYNE9p56QTdKLwNEKe2G4YSWBOM03BHjs5Gl/S6jUaAUmTZNdqVPBQaDz6BoOSKEEhlHazijtZhU2JFDCTegwVmK74IW8wdYfWgTuJrGgdeM+JoRyxMyBgHxRsB7pFewew/MPe/A+3o+5p55tpZ8bVkCItBrh3uZ/xwtkOwVdM4r/wC/rNdQV7xR3pZ/PVzHnFHeF+AraG0LDRPDlpdcIGcUPcjaqqtG/hqLLR/gs/6/p022yYU0GzUdXHsx3fkGij8w2j0lvsU9kNRcMPioAe1ZqzT7bWCbVD1bdX9rfSXWEny1dutkN+lImlGosENsWbfdczMOqBsYqPJ1xWpjuYuBvnVjM7i9VsVskJ6HQYCzrJBY/l1rBF4FMznkAF4Hs3y5fcIXHFuAPRSqAP6FCmfP0Mu2IhAzzQHO64Mqud24N8oMFdigzveGWxW4nCtZhPtGKYvubseMLT2VhxD/m+j5wdX33LFsf0MWfDRkjDxintjIx656/7SDent8l0JdAiHKu7js1PxrPZ5Ti5jsUBp2drg9wa3LmtegoippZo+STO6GrJ79aQ0m/ZQtsK44RC2ZXiZzJpRPGSzvgXPovH1Iyz3YxXFPaEsQJv7qquC66m+SSe0kwsVgpHMtkyThfVfnFD5/SaXjLsLc4k+HMbFPnC1vX6OXfWhF6xZb2e1+u1Vb1e+1KvO7Vss0lIvf4wz2d8LJy0Xpda71Ov15LNprbcbK42G+cGJ/cvesl+584lvSFA17PU+UIu2S+Q8oQ7X/w7AKBrelsM056HQ6OzscAMkhgCmqXOFbnGLjzi1LQIb9L5CC4cplfXJjtw6JfsBSSlB9vfUlny6KX/NTL2mo3Eag0Lr9kMvjWtqrI13Ruyzep1JxlYiZeA9yR25tqnA0Vm83kOJrq33FnQS+oQ1r+1wAz+GoAZ7GpwrZ9i7RNyo/2ES2fiq8qZmJCKfXnEv+/rTBXYfguaHpBD3s5aQrM2AOnPM2F7E+N+6TFBa84OxyVKR1dDobYFrRX7ag9Erx7rFKQM/KIcwR5phqz0bsu8Dk1MB1Iqyg7kljZB2IxlQnYZzdRLANxYc5W+mwvz7DtyK3YBAgE386FsiKNrPPf3kXUnE7rK207deoIufpBIHThpYZGpQ+cwDhGqivCkFp1KtBxQkCCNZmNqUbX1YUo2tcjUpCBT8wML+RoYtoeZejIbX8WXNF+pgmhdgZoFUPEN/UbP9mkVKE/rdScdnMFSOcOVdG1Wkj47MsaVZD5/g6ldW6oRJHFzxE9OzmCxngFR4v4BgNH5LsT/dhR3aNNVSZuAapwBsTmj091aLYDtE5wsdSabzRVIv0aO0ZD5OyJ0xu5TVuoDDLYjREBnrBbuOJ2tHGS7WP82YZwumdqS7trXvUJytCVUbDZJ6Xih3dIWhSBj8UNGroAjIcjtP+awLIqVqe7KOGrn5MSeBnMGbkw3jlauaIZkvU0zMZ7Nbm7nTsE0FM12QM64AJVRvnO0QmqWDteo/aUJSqNgv4MlD3O7RIcjQifFcPf6Lq0TIGO3tHHTcZ+JQeKQeFav3zi2nMMP1V/6VQEKczolFH4BVaEVOiEV73TjEBg3TdmSq7fZnOcrhVO0NNLsO9j3Wrxh6xGAgM34WBb5U1ArnVFFr8gO5tgnJH6Ud0RNCk6P2OMYd7Caw8mkuT58VmK2PXmWwcFi+iZjNT4uXKyAu1yBZY+qrc2ySs2yZqDMzw5yqfI7XKpzRrbLet15YzgZQ0fe6A0ZpfMzsyenzrIiLHoPfrO7BwOVGdc0+KqdISSHLStnr88a0bFRNeizNHeY5be8EFwFdEy7Ny6cW1wiQOABu/TJulcyX3CpbhxOjwvyeUxvr7iKof/C1n4/4baGk+95m1dk72iOdG/fmc1GCb6n1XrBbcVusdurel0OZJxvNpKmTPglERwcl4/I0cevNclLEKkSs7LTfTJZU5tNLd9sMsbyCqEMKmFu00VcRYnVv9931WooT/mLbMHfTmW+upru6OB+2RN8lb82hyJhiuGAJKwQKg+vmD2dMrmFIeEZtm5hcRG4Wm66BVrpVFlIXbB0fEDvKr9B7+6l5OPrbZEK3YJdDdER8KmA1X3abd0Z/ZX76AmJ6kXcV7ZbraP5scJmOdmlJRiBtkj6ClQ0KP4bSHCwrOkfnB3jYI7ps0qsOzai2/P7uSJxh6sBkyma/EAnm7y9WSA50IiUdjMft6nlH5maOs84GaTsLx7vpB5nQrcObhMpu4AzG37Fo7BA42Tpfr1ETEuxM+CvvsOz0Nk9+wVSwdKclFg7hr1DWHxnqYGS9LaS8pIt7kqru60UKxrsTVVDwtredobllgYsyq3kGmNf6nU7Y9/+vEvN3t058HiruUe+ZeDjWQ3AJNP9gXTvEDB5kICNd1bpbHfRLndfV5YA9PleTKrYJOMbmLOAgmdfuf4TZ5+14drILsyxGjid1a20iujjkjHuiW5eGOFZBqeYgBnKAVuEy4pPoEKdZinYReMiiy2pZAQKSDz2UKVnWEdWUrjcwy3RqQk/Wz7JBBICAt6aoXYyBZfBNqF35DrEFhiEOSenCM0rlOjmfd4lqcu4dbo1cSr05OQW/OdTl+UWB7VLJvYUhqQ8sIznDDRgj+AwFSnOp8IhNqsTpY7Qge0E9fJ3Nzxc+8cVhlpIkwIeQKMvOYs0F63NSGL8Jbsaq1yiD3n55k/HcrIeS36Wi2QlJRfJTb3uvOTsu1lK0ldizk+2lqtQo3BSrx/nGBDAOkhmKOOvZvOnfxYP7znb2zwKwyGi8EryydksF8baRix9YL5jaKyFQIsR9k855aBv3rPhKlXqO2hGU7334mLOF9rPHNRUIs2u4iUQVnRp0dIeqbaCQxtF7QH3p+MlDl3V6wfQ4/auVHmfOMtUtzIEihp7U/p3yRp7c5jLwi3haJ5PVjNwXHnA9Ylo+m80i5p3HKKjDcmgjSfbEgQ08bGVd6/Pd7kURAIEENc5zrH4k3E24xNwAzNYU8hxwGLe1ZZhMIUDSrTlIRlWZz4k3EInC84a1EvF/OFcHhLuNaN1x5mhVtjDa6EhhQ8LJW4XTqMKg70PC0gLUqx7gfkU8jUSpVzEasNGAh9VwkTCqZaKKBTETgLUy11+f2M/ALz4IJToazMvGnERZkA5LxBNHDxmnmZXFUdTyvQ/VuAwQGF0tQN9LNQ44LNx5+P7WXZZrzvfKcbuKUVo7eDg7eYOfC4b/E5Rdm/JyjnmdppdTf8YKy4vxvI6Drd0zXjJJA2A8S7fSHy/ZcJsvSuHs/6vBqcUqgSFcpCcx8dQ4JgaAfN8EnMFajbFHK7ckPxD+BcP/vz45sGTxx/PX7x9/PTx6+4BCTIvjR5dW3akObBthu3ebumMdFPGS0Fg301hxy4zv8cuU0gOtiA1d26Ri9cyqmHoCcWGcS9TRScosus6n+bctShbdUrDc17As6jMaLRt5RCCVTFOun+WsIWD9wVof+NUA4n/O+A1koNEcFE9gc+5k9AlRhzh66PPNqtQbpQ52z9n7SiWo0+GUaDBNuIrmc0dMhAQBkJR4HvOheJXXDo5qdfzPgsH0p+Pvzo5bTdJjAxQ98tYHimab50lIfSp3mMfAPTOcqFkPptxabACONbxLJ5u2VPeNWqnPRFx5zUzryB5loXpQvIvXKgznL9aULxjkzG4ABsgpTZClOKdzUpPLJ55YatOr2FHLKfqD04lX65mKv77cltroyowMxtkFpsfYxwHewez5CFVEMYsBdtQLfXh9AafWDT14LCKYlJHC7Es/kLtmyKVYTRwhyptzborOkKKIxjMfhWgBNwhqgglNVZEWrESB5oVFSQWpIhxMnE4HZpKR0UfQaunyT48dasnwCPLZm2GYrpu1kgs6FKBYl5S2KzijOLpvNSehISiPgvU7fusAbgeVqujUJC9E9ciX4sj9F45JuWiwTkaaFeE3HmD6wflSCAfM/Zv9Qkdr1ScbAHyoBebGa2bPl649OGnoATxstDpATLrzAe4HELfc2Jxr3jgfeLc4jjiGcVfPFAZm6nnJX7ebquMW7IdTyaPYRE9z5aKCy6dY9OBY+rcgloh5lvUY2tvTlgVyqJbgu4TfI6sbpY6x8hKANmp15Ebpoqx33il8PtVMzmCdH8Fx74ZV2D+ptwpNpHNRkeyMlUTWBvH4+Qa6qyq+bOs5s/dashWMfYHr9efFuoYa4lqEg+q6GLHQ7XR8RbR8dYKIZarnRhimbLDhqXqTtyvROl4ZEtlApKNFdWZZ2rLrmb55Xj2FuSrlcIDo+EJDTs0oB16Qk9pm4YBbdEwpE04V9qgYYNGNGzSkIatEV0b5a6CM2JTI0LjywSDnex6pusTeBMTmYHTAGLZdOIm6RZpAQ31+lscKB7q00iL3fLNONJFbsrmhwENKXS2SdvUnIfVB2Fps0PbTXrapmHUoeFpBEFNaKPTpBD75KTdoWEQNWnYarRpFDQ7tBGcRLQZnLZpO2w2aQeKhFHU6dCwDcWiZuukPSJ0fqjxFm3TE+hAgH1oYjcC6EnUwc4E0J9WG7rUCbBXkA961g5076ImDUaWfeBa7XnVBqAf1evO+Hbv8Ce5KuiG+pGQT6C63StumVAllW5OiuoK2rtDoF3oFyjkuHJSamtaL1WhkQ5qTIDe4r/oJ/HTbDaDoFpUubZy+ksVEew24fFa0SWPAzqGPzP4s8LENTxO4c8E/sB6O6YKIgzFAb2BpDkv4nZY3liq9F46EnBATBn27vYa2KdVCRlCL4EaX8eKfoHKrrCROKBveGxX+KaSym10vxMUiEXmPBeeyqQ5/Ljh/vrI7SgplURl8FKRLaySb+q7R+y+8eKM3RkvDtl94gyiapzdU7J048OjnGX5r2X5z0zohwecSf10zlm+3VZo/ck+CvxeDXnPa282vB8NTuPI46PN5vjY8qJSlY6a+wvOPlWqbUcQnXb8bZZd6q306Ng1m6Yi7vGRc+wK95gcb0vP38r5ameG4dB1UIZqqgCtENAYpynchHVBwc+sCowjq/oemPq4/w5iWb3mrotRCUtXKfMd8+HZaUJ1mSJgnoXb79TO2T48eShojuq/Vl3hwfiP3OX+Y15FcnjH4cwvZAUlHry5EFalqL5Ii0YM1ttj7rIGzVnuhXWsloIdfZiAk5/7h3LDkf8XnCbn/gUfPlZOTsqExxwOAT+0PNle7wATR4eGlEN9lCM4DIlP0L/yORoxUfYL+yK+0+JHG424f8m9XyxgP975CifCB0sx5KN4CefW264+CW55Av5lLc8nyj2hetFTyRz4JV5Ic7ZUJsSNo9wXEETuny8UyEBhr9dxn5QUwvd9JB9hi1CkFm953IzoE6AMLwpaQ3/ncSM6aZ/QX4Cv+Q2IyB/AzTzjcU6fG+d75UCeDqGfywRB6Etg+N6VRNRk+Qnq/1XX2qGv4e1P+PMe/jyFPxzInoA/uYrh4DU8pvAngT9L+DODPyv4s4Y/U/hzA3+u4c8l/PkCf67gzxv4803pkwDKiX5+BjIkPVNF14qUT6ro/k/4/hi68xD+vFJApD/C41eo7QH8OVdxh75TxVAg6SP8eQx/HumBz5TzUhWbA/Hn4wUaz53bv6CuvzAn/LlQcQCm1YuyWPTzc+jEjxd9qKqin/+9om9V/BDcFZ6Y3xf61w4C+d9tDDRjF+Dimvl/KSZp5l8olhcRsSrDgrU2Lqx981Cvq5wPq5y4tXxTznCEVusz5aAL/1rpg/vEol1viwGhBS9WdFYcBNzxT9AjXiqU7X3f50XMmplybBhXsXu0cUFBWEUxVCPXLTSRulDpv1aUpPmh+mi2Q+RDCI+lqXzGMldA3Cs4304xdES2FzmI247dxdYB0YEMowMe4SwfipHrFqDXUJAFFPgWRTlZ8JBVzEntWF+0B73MqvayKhiJGGajzQaMW0o/deUwh82GD74CJ8ZJHNAiaY8zkJozeKJYh75QrEF/Vyxqdegviv0ONM0N6W/wSP+A9DZ9phhsBW50Sp8r1gjoZ8XCU/pSMb2y6U+KhS36q879p2JeSN8rNjwWHFw+Mpztsbw5pqAL4uP5EReTY3p8TI/TDM6XovhbfTSvIP2VL5lYrtI0SzIu1NGcz3OsTvONZabjEX2q2BvlTBShXMDTQhGqRAHn8JR0lRiG7RGLKDycjFgDHzojdqIVAYK9VXYkaANvs/Q7nQM4iVjBwmYDMQJQgXWsr2GzCd+jVqv6fmp9h1Al8P3ktPp+Yn/vYP1R58SuvzpTCBEvsdemk43A9LEF3ruCPVKOEISm+CQFocn+iUbbAFq5/XPb7f9Wm1PB0X8Am+FQjuIQWBDgFHIv7GZ9wH0BdkzRi1odfIlaHWItUOCV3XA/6AATGGTzXqLnFgFY4DiXblxA4ykSQdBr5H2W1ut5j6Vu5oXkVkJ8TmE8KrZFS4cb8MKqCbnfRIZNuBLHB8bR3LLTYitVNVRunbmiTxWhS3GAyhkAtMIIw6BWze9CHbABoyEDjyR7TAwAxDEOtcqJuQBysqJBst8/6SrN2oh+1GoNolYrFmSEk2TFCIpaJ13ea4URUryAYVBBOA9rAgx6oXVscOv8r+LK/zVyVGaoGzi5TizZe2yfGi3j5arNpnwWhTUgNEiuWXMOG7MOeq2Z6qx0LugH3ZKk9CPeGES8EYuu8BjvTvJbyaSrhpnrjiDMIctduQm262k2447ncdKV/4AmopDm5qE4xJhDUJGNhLMpAVL3mfjfiL9eRV7/gJHXTfz1mfhPArDr+ZyJMv46PFoB2HWtJgL7l7EcrgRdCzoVdCLoQtAbQeeCXosRm4lq1i5BwRpUvnBWMOhq3hD7quNOBo83/+K4/Wap4wjkSjI4LlsFU+lDKHVrQ4B4q1p1oe6Pwp5D2NXcLYoqJj/wKuB6bmKw20kmBrtk10WArQ9zHZ/LRPW50W9FwJ9FEbxLv05EEYh9KuxI7GuxE4p9JQ7EYs97er1JDG/cgUwYjF1+gJgvpDgT5VRnmT4YpKtUMkjzwjYIa2/4wEGZl/sLcMtdoKT3hrMA3DnfcAxx7zywc/T7rIN5PGafsrrCWrFMZ1BWqSsJ6nW7iq8KYnNiFWH9ZLdZSxdTrm6sI2x7YuBAVr2G4XEDQVv9N5zQ3TFgZDQPvpRC8xuI5+OFbRLfW4fJZI3pG45pn7l8tMNfogysQAa2aG6R9WIv68X9WR+q3awPVZkVm/hVv4WU++/hwMdTjFYEMjf3wcHEOi8n9s5DA/J+UxD/x/zqd+5/VJ43oq90/nAnQP0ncTferu5Qz4j8m00xGGZS6nXgrHtMDoUltL8Su1oSbBtlI9HrheUShN7A/t3TD5/0YZdvOnyReYLfMwUGR9elNcwidz8RiCf8zRwr1+mC5TTv9UCGMF8sfdBXe9PEmAoQM/obB77dP+P+K04T/fQA/PQNMwBd1NBX7KWies9LcLMLaizT0ABk/aaGrgu5R2yJepMz7EBAYsx0oYp9B/L0oi7J2W6hXjRw3SXoQYd5Of9nMC5s/z33PJqC7tZ/yj2WQqYLVYRP/MQZhG4tFSJQ5z8j0hWgGxOeR3BqMoilkLMEtjfBzookKnexxvNguFr7Y73Ksmdm2G42lPBb9tMxo+4zfJCjgUmIzTtxIb6xGPmPFMPCjxQ6uGlUhak2/QyJ2WphIH0Wke5OV4ruHmCH9MxSPJGh53fMAD50Vk7zSj995XStnz7TqX4453Ri5knLe+wnhaIe9z+BcGe+LYdmVT1WIz21uGs8Vm7YFb2XysSSL9A/Y8vhUo8WcgMM+uA7mrEpnbguofjxQrGM1hzZH6NnoW4QokeygMo+nCd0UrYaSm89grDNyxL277nLkp+dzE0JnRkEwZSZrtZNiT79H9TYhNxO8ls9PuB3wYyjW+qSzPO65sXzqH5yw5HLIv0yheSJxyIzNZO+EbwyNgV5O+tmnofshSwrDWpMlqjueWJEa06uR7jUGFyDuJ2OHoWTeSaV/LzUuEZNAssIlZ4Hjs94cGP/TI45wY+hKLWbKfYjBM78J4WscMpSVwylUScA+rEUsxnuVt8vUHBeulkYgL4yAnqj2FflZKjqgFA1262TUcQtGK61mTw40C0vRAVBALXShAV0yU7o2AQ7DBjwxc6ShY0OHbMGBn0Eje+F0vsX1ay9ETJyHbQb9bVQXc1x3aQHx0wZSwG2SW88wH0FYeiyJA5qLB84OULb+gK63IcKpHB8I3HSY2Ggy4YnOjHWbx1TAPqesRwsgOnA6nKcm4S2fnXMAG1V1Pk+YAAsWQkWQPWEndAlawJm4ilPrH/JGpUwomNmM4HRstHZLcM6xhY00l5Sr0sIQYucZ9pbkkl+i3wGjgbWjiofL1RBboIa87zUeCQA8g4cWWMgbX6nLAZ4pVUGhKaqniELfk29Bo0IiVMEslUlglpVzzslGuDBbOXtWHk7O3nDkJ6A1MRAYJEwQ9nAgmAsTUJbvzoG1rb2850VOogFRIMscCVtEIp8n+a/hPn9Fzhdo/MpWEf9d9DH11ABumOj1YVZrMbruwsDKLW51gQO9zzmBGUvPLzvv1LDZAQ+y0717oYjAtEagajgezSiCZgoAgj1qFlJvVr174UisZOxBC4KoeZzVhhUlPWCM8meAt2CUCiwIHOPzfEdy0EUJqRCNGOPQXenk0H/BzXhr66EC6sS6bGbqhIJlRTolvRwxF3TLWT8lHm4MFbDj4INb39X8Z+C/gI64d/gzx/w5xlohyl8e4/fmvCtCd868K1551sLvoWgRYw7dz624WMjgo+NSH99uletLhq27a8d+BreW9j6DMb1Z/hzJ0MjsjJErZ0GGhFWEXUgC+hGoY4gat7NAx+rPOA5sB1Vwuhj2xcu+pl7Du83B6dxYNGnv/b4acdBkeEZ/yBInft/8D356pEobIxTxf7SS3QKa3M1VK6DJqlRcaaB+8/5UNW5/zuEO/Y/g1FyqkaVKa5IAb8ryzpghC38+hvogxiYfRxIoQF1dCL5Gd79h3+9ffzm46vHrz8+fv744vGLt9bYHlb6L1jeDGx05poDqKOrQB+iPA9Zmc8Yet/8MtFnciA8aeIdKiZ3cz83uZ/v5bZsEJaMoRVK3B+XZsi8L1GfJwks4nwQgOQ25h7L6TW4KAMjmgBslxg+LQSmZc79J3zA/YyBbsjPqNFbHVQDuALK5SSOyqLIdGTs8scL4yF2rk9kzPA3t0/9HQLvJNf3W3D/nfK4n8CfVMEgRb2OvFeqzEOiBoLJ2Avxm0AOLFV9Jl20rNbrDlLYFQVhYEUllZ6msMpD83FqfjPzKyAoXoq8iy8UtkQo4gCccNGQhvAq/pgT1L+hOyCDifKvObYBZVzomabliXKZ0r9YPXuhSm4JmodEIzNNIWmlkeLAygCdJuTGzh34DgsHr184uGLozlJRyMMIQMWaU3au9wIFxO62FCMS1fsFYF0rR60PAH7hPZidcupYOeoufhQDXCDvlCeo6v+mMFbhbxCSQk8HBmiCnEy4CpQgUMY1+eDBgyQKs/FOP+OX8q2sSGfTdblsx3/zReH/DDY+xsozAkF5yc+8WEtwdlP517wGFx42oxpT/lter7dOiqf2afF00iieTsPiKQzKxDAsH9vttn60TnoKy3sCYtEb5wntSGEd8rSXhe7ojm8yaqi2BKzocKXNaw2paQGkKSfUsOAa/QFP1nBq6h38+dNAbA0Qw3eNohPzO+Uepr/GX1h2/muOp/bgHJD/E7eZ0992tOrYVeG/gFDH/gvuP1cHKQZ0pHLG+om7pjlw89a/Vgt/7Aqquo0sdXB+NxvVb202qhcUWlL0tfEiRNQajH2zQfQd83q9BhRxs2m324xJnKRmrboUzi6J63zKdz+1dDg4Jv1cwbFFBeCpMem/1oiG00b3imK+PxUNtkWEGMwA3XkM7uI99lg4ghzqim7P6q0ZyKFczajMBA9IquGdhWGD0OJrhVQd15H+tdfp9ZrAGGo6Jv1r0BtsNtK/Ub1oEMT40B6EMfbhRg2iuEHFBmKAt/XYkVqKDdy5BzSyEXriH42Q/g4nLAWx8mAK9zPQPRL93Vgb/Ay3iYyFtOgyNbA00L0Dyyx1WidmTEiREMUCXE+SNkLzEDZOzVMHDpq+4ARfHHj0P0ME/YC4+u05jA3eNLnAtJdqEMTN3bSfIK2zm/YrpMHFXLotWM6Y/qcyKeat9JHaT9Uq7TvJWrVtkk/LGdifpmYc7Lf8HpbSajarFQPRWmorx9Odvj2t+qYBdWfpSiAeOBmQ4QGob3Cy2qdl6COsrujK3/3+4HDIj6IELpXTAs0xWjCSIRsIpQEDSKZgjsa/AhweDMtcPAsymOhL/1feLXgvePHgA7R0rZwSINTUjmABrgcSMTs11BG/AO/zN0NAnZjH8u391QtdvcvETuUs2CKcThqwNE4ad+BgcLd8KEP/FgQBR6ZZL+w/DgArwHYE+bvOCxZsVbFGhjhid6Tn0dYUKNItKrQ7fhpCx0/Dwx3/VZUP/6sd//WHOq57HAYI6zC4B9jPFSn65EaISvW6s9uVu30p1ygQRd0HJJkF3SgJ3Rar/mFiaXYO3Aulnyh8UIZJqXYGwQKzLP8UOPwYN45rNThkQ68Z60S3cOwGBrBed55U+2CiSPHRsmNq0zXS7aXWA7/W9qnVEBjJkWacDTfvuoXqQ7GX0H4t1PswruyyVrXVFQqosIknHOwy1S2kptxAxQ1d4jH/oeoLS/lWA6ZxP2C0Nt2GDXLS7HeNERo8RRJu2BZsKkiSfTBBIggQoIxM0YPMybUUESJftAJljWTMdXPU41m/MAuaSf9dwWIxaH0484//5r0MhJIleFt5TublKO4BM5ro7WOp9FCKUUD3wfCTKmr+LGENo6dwiG/eC2Wmn+FH7HTxCGAgsfM3+EL+n0SYj2IIK2vk/64pC1rpIwbXODbAE6Ng2NrtNi4esdlEloeGYSsxFy5sovc8LfrCj9o5+InasQg0kFoNJwpFmXkCnZuWIxxJ4pYWF94h14ZhjWGjbuDhI+dCOFr0lXpagaHD7T/TPwBBiHK2y//epUNFGFEAJrCWT3iPBYMwdiLNsg6cvyN/VsoOy6STdtglXcuMlzlm/E49M363oll1IzyokCuutfSGOcC86pHDGHBVwgPz4G9JlYFBtISaZ4VwilKMAZUXWaIp3in5llfRz1dsrajyn3M2hd/P5vcd1+mvlP79ph21UqVvIj4zyZ+Uzl4a58HFpLK/41tpYse3F5wZJ2/l/4QeKSD/wc9H+AlDwNqB17A1Vs/3ySC4hWhH/xQsFdyfgR2H+18UXWJiHxU1A6Ri+AiHX1A7RmdwDSQYHkHQXyMdoVP2u+qtB79D5NEJW4GCeAE/YAO/wQe4447O9eOom4JV9RIN532wiNKkv0YDyZqUeiZFV0PhpqMam282+OjB9TE3+DKqsYlOhbQFSXKhMrHiJjpLVNjnp/U6NJmPGIPM+ahLctfVYQVyKvup2Qdeg9CYMgnWycTokA50vFDBOIqNh6o+G5H+EuU/z6tuE097bD1IYytq/WcDf+fulQZgl0BHM2M74P6N6gcDJzIaLU2v4eGu6x8VrBmcNtpRs9k8MdpMdOlshF3cn+E0CchhIdzwjbxG4fSxu7GZL6faP6J4DYO994ZdMjQNwtXuvT8Uun9YdandvEVzW7wy96vWkb1V5eMThdf37o8Q23igszzSRfxPQDt00oUuikmmItimFPusvBDvnTcKyYdquALHFDSDKs+zrigFW23jZ/Tidltuy21CiBy8pAS/NdyTfr+Ba+Rp+eakPZZtNk2cI3DscDKWEhJnLGXCbVHhNntg8VMD2wRF4hRtVnoL0Gao13oToKkoDWNN/eXu/UuI2ggRbWLxotYJbRWGGy8sn6XXpE3t8a2v3nJJZXJbgSEJbYsN0j0vQQvqfXpeglV4IQYzMRB3wwLQbkgTOGTx2pqUC5jTb5rW1utXRgtW6V090ORShQpd5JW1khXJs3/NLfr7UuzEXNPrBtUBpYp3ygeoEohhP0Sj0k9C25Ur88ivu9XwHpwKtE4p/HnAfQbKgCgJXleXnBj7rdGvlkTpJ4HE8w13mxFggulSL99skOnDNy9Hvq8YuOhL19SD/oHlG6ECnX8Fg2tVemAi1tp02Io3mwCdQkXNKkAMaUpZE3kAwaqPACaK+GY4hZTQ8ryY19QuMMVrA50hO1ZKNGL/snOE8A5ZilmCuXUkethKJghFHea1UWNeoyZTT3iGwZlMmosKfA2W4nFiUjMFv8IDDT5UW+nrd6sVVm2iqk1UtYlSIASnAYw65BVzRxOk8QluOWh+4opVW/o1GEI8tHBYRolrNNIogwswl1ialvYHrTY0mu9U9ViChDpF/viS0x0DhymaIvZz1YtAVOCFtv+ubYMUxQ0zfm1MRrqviY5UDPx3ghW4gLwJtoKGC+D9zRqrbuZB24Bp5ws3NpQUmP6vcGCjQWItejbxb2VQ0VINvGawEhHLzaCpydLHwCeZ0hDW+qkCDv8+SHK3AvUh0OT9ajHlpQEEgq84+wYfmheAyitA5RagtIXiAGB2FnleEoec/oROuGU1ZGelO7IP+4IjcW+AjSG4A03ZYxB7xBFQCewKtFjMdi5Y2NWC1raZ1CKgsBCKhUmMKx3MI0xptGMGfr+np9/VDhhb0r4A/MsPyb9iR/iFENy6szhN+tASwkb0WGH3Q1nxudbXGKEUTG/YE0So10b4lFr4NLA1qXeF0KUCF8w3KHsnxoyHOT0g2YWewuqY7RsDGWGtQKZiPe9JtbS0/6FEe8gEiGXC4q4O+X0ZGDnPf08KRvICVkTkxmN4+t+Vi0vUefp/hDogjhSTsIInM/0Mx14g1gzcj9+o7+OYQZGWFsWBW9ts8Hupr0Hs6oODRVkWfR10Nwq9jsaz2Y6RGA2r3gvVNai7wjD3u6gbemX6DvLOYCT4wyLAVPCchV3kDjB28XWmjKV3rXGzgIlB9B/ErMIwANVoZegu0qLBWtbryH4FpKjdIHLFiJVTXCyetWLhbu6taQaZhruN6IEQ+n+D6MA8csk6rYgqyW4UnrjlrM+BwRWSzZUdZNMLSZWhQaiUbKGLLCD2V/l2I0lXmkiZ7SaN4Jt+C5sRNUFGMskmqrzj0ItIWVF68AtUmhXVtGlITxoQHiSAQCc0LeuHeConEfzpFBFQkvI06ND3fQEamA5eh03ocv9Tw3wYSzjjmElCZ/iUSkJXO5mVNFnX+8lwrPqUNk/DVmNE6BTLS0noBJ9yaR2EWsjdy9z+EQ14zN2wbV19dk+WqGPFLZd3LdG4gS85SnFrjuJbwpGfX4FDvPRXdMwknArpQ5x7CUc14BHuROWCrpn0Fag14IC+9JWAM/oT8ybxxP6CSf9SF7ph0v+iH+cMYsjj4zWTvhD0kmWeA1QGzP9fWAYnSKYcZDe4TiV3tXcQiG4soN9YQM9YQD+BJiA23s3dWS9saZpbc/JeWh4bQmp6xLtjF1zoXXfU683ozGX6NnbBVsNxfToy5PqMVYd06BgCTZzRmcfOqP4AAWIYOyO3CR4TMydNRGUTCNv1M6zoTfGNntXhfO4ZKXp5dqiTt9KXgoXtKDAGhiO+vdvhNy4b1wG8ZwBbq3vb70LgxyrX0FgPx/XJj0OjHO+3/43xfrt3vJqAvaErlnmXQL++9VeFZeebt0KK1r+p16+L+CSZiV86yXQUnCOV50fpWB5B/MVjWnbntOyO3pB12M5PbOHBZSyiByah/fgkrsuJQYjl8JPr4nXfqGg74ntH8sSBzHjRyyeWed/KPWfeE+T2E1u4c08HGuJMeHN9vzj/z/tgjiN1XVftZdb3zXBYUrTmzP/bYc4PD3NuDVODdf7/C1gRE1U/6hZZEsxCv/emPNbowo68l9wP99OIDmyH/cf2/lebKklNuwlL7x7sxnulD2E1rHDjOiCI61TLi4z2q85SpxHBg6kmPA3LanabneEtq7N/6tX9vcZX9zZuWLi8d1WvZ70v2of2FZv1+41u7rFXsO5f9XoNOq7jDjMjyNEtOUqta84yCnsEy3tXgysvd1txy3Ny74qgUxjLel8GX7zMjVoncdQ6AXvfFzB6LNhYxx2CA4qz8gDvtawMEdbpVnsPZdeSSqYGYbPZjsNms7kffCYwsWekiMN22AloKuJaqIPQJPi4FGAwgD8z+LPCPxgxC54m4PH9Ev5wuFpUKfgDHySGhcEs8GcBf27gzzXkuxRV4JoAzGTFK4RPoFeiCBWDzuwQjUZAOM1v8HgGfz6JWNl3R8r9C1h7vagJByvD9sbyWr6S+uQvWsSDMndZ3Dr7CTlDO0e7SQFc1tlMWXluO/okAMFmIWqQNoNh+/BqTGC9XmfDS+NXOZFnkt1+QmC/EnEi6VcRjyV9IOKVpOcinkr6TsRRQF8LQAv6ESDwWMSt04j+hcUeAXi29JOpJ4B6lljPDOtZYz0TrCc81fW0oR4v1BU1saIAKwqtKFyvrHhe+lCERqwlHdMZXdE1ndIJXVBz6xz9Qq8o3ulEP9FX9GsZVaNN6AP75Zwlg08yPpP64BoLusseC1vdpeuSr8NlcaJNn6nRR2q+DtVwPIJwLvBlzXL/QtAVFFr1WYiS6tfhatRdgU0gS511f1WvO2u2QoXzqhAazv1HYuC8YW+kE8LauoAj5OyNfgrhCSpmIQ1IXEReYGF31luZJmaj7sx19bmfdW+GbcwIXbCQLllojSNLnQWc+qQLj8GY6KL0oYQAB6mzQFMmCGGbTVhjK1J9RWPJEJ3qdaWmzgfDJQTDejBcjlyo8w6UQEs1HEOohmz4oIDYiI1Jd7nOiuCvYzhFFJ+xTyyjr9i5/84wh138EsZn7Nx/BfvSuf9VYI7XRY4JT8cQbhayPNBZznWWjwKo8pwFeOHUks3oN5bCHE0ZWBID+gVOVd1AFKw1vWI3Xoge8/W6c+7/JQY3fcZlfNPnkqBZ3v5w7j8W8U0ffsiu0Qp4wDfsq3QyOqZLOqHcoN65/wkU29Da0pvQS3iY0hm7BBH90mPXhmNx5v3+hLiXXZz/by4fsTeVoH6pp9lUE3bn9esuucbIbtpAdj1w5nV27YV07rJrEuPwXRcwzvNggnCHWgL+afgtIRoPzAoGfkdT6bx+RWoQF90cuZvU686ErQn95upeTxkMYYEv3ak7AVR0EKmm7gSOLi564B7QJVPXpYhy0LsbU/q/A/IXNq9f6cUBk+l+GbEv0pnSNf3mQQLZGuenOR6xxHW19CYETijOu2ZMNRyTGSeODhBkbSOILkjMivzm6nmB5XgI+IchX6gDsKPsRi/kNbWs51/vkDO61ARtjMFvB2Dt7CUx/LhhLyFjdiUdcBmUlFe3+JZZ+zorGJp17NwQYm8WR0mGagTCYRcrSfEkuKdPKxtmTOfTVWFFXnJv5qOxHR54Z+86beudyRGerC4iwp3lgcUi0HPJbh8imX9bbrCtZpPQJyJ+IOkL+Lul734kV7VDvJaVidf4+juFm/yc05qz4/qv/E9gHlK+FD1k1iBJij6yYGSzqe1l6ARVhjAkxHZb/1i1DAd7xeCdjM8lFez2QsTBVl/n/NA+1GdO38KRVYi4RLh/KYYS6KMJxKFj61jpp2V6J7DTT6r0zm49yn8rrBhi8EqV/0SwjObsVF9PhD3MtjTBh3xLl0WfodZX0gGm8VJQCCoLOMr9L4Iu4Tgvmixw0eQsgR/uvxFsCU96XI3I7k6rm7NWV59OxUyzoumVaborYJGM6SvpRLrRRoQ7O7YpTJvKfyFYZlRZY3h/CM6JW4iZz2B0lPtKsFP4UQxyU+5LxVq6f9AGouNjqQOGlrfzjNXe/aT6xprjFxAXbJ5LiAi7WCm4Ma1Cub/kPQfrDzMlReigJrIFiK+bjTm4gOcV9t3+vaiblNsY6JQg4udagRWeZvCQmpP1c04RieEAh8SIMYUQEhF65sB9TQldsyW9Bpm2ugjMbMWQ2+zGiOqxluYFeDXdVlVVipsHyDtFdYGnDxqtdthibExusdA1tn/NIJyk8GfCuOvj4xsHfuiY0FcOJOmqO2FVtT5Sgj/+74KBC0ENnE2gL5uN45w7HeBeQSCCUzXkH42wkuuSXEqeqKMpXoZ2hPeKHhfNlLIVNNOpsXOnSYqiKxPePLlz/dzh4u+cJqFzrMLt0J1hzwmd98PWZjPvC/+ORmWdiUm+NjdK36lZ+GOM4zmnwl9qewZeVivgEF9gANYKo/p4AGA7jXHWAZY7fBNANC6nCasa005NnxKG1/943K2TRrOpq9irwYA8nY2vlkdLrg6OrprazwpEyU49JBDeGmus15sGoZxdXNlDlqgaZRQ/cPA0ilXzn4qN76/02z2VNqpKG3EBt6rSX3SQ2DEm+u915//9rjerVpp4SBdLD8qJWsNE2e0+/e5gdpshsV3yJXgDWk23qqZbMTqzm9brdWfKoGk67Sf4khA6NdWYw11wqAQffoPsc2b65kEx0iu/XKuibTpHcji9v++XQndeVvaQnObulNApITTx2BSs9lMEisemGjolP/jFIV0EV1CNsF2NsA0jhCDpBlU1PUvs0lMWAAc+ZxB5cgoaJGu8f8ARU38teuWbHthPagjJsKPNCzPavF6f9hIk6f/tWOdWBzWvZc/oTzijd4Z9Ug37BIYNZsf/cNjPdob9rBz2r/+Xw/61GLYZb6cabye2Wsfh6oVUdGNcKw7+QD9KolfsDjI5mmfLOYTmPkCtXjlkh2I9h/OXS9Hvn9ZDWmxPIalI9GVFoi31X9XbU0OsygLfpLO3EZ4GZfZT3IVrwk9Kv/BPDqFR99CWoNsriyLxb6GrV9sym8P8l3miGDfbVJDb11UPoqBthm9YgwdOAz6mgtVq56CoeAd/zp2IlOJ72YPGrvCepc5HCQdXywyn1O7OOyci9Mvu1hVVtbXt9Ea8u41ewpUvR3AbhT1zW6hyD+ynDegIDFFD3yDEmNQYcBD9sP1Bu3rv79RLlUtetKR1tcvDmyKuSFPt7nQ26b3wb1YjrUjzKZLmghwjRttEGRyDnSlboiJpald7rRxgPQ3NrZbWEp5Si46WW/E9WHraNoxDE4YxEezcaRHQA9N3DvJzC5MUFglTodmgJkWmCAr1o057s6kJFKGgSL8RGPBC2uAYzEnzsbgxcD2O91OOclmp55c388t8tjzIUdzYtPC0ooWnJ7GOYunfADmbii4xqHwpwF8V0l13NGLnkPrOMfFzdP7wtEvuZAy6wr8GEeJK4KWUTICIAWlUgMxxguKNFmcgdUsvzbMSW/rREgav2SuU5UHICU/pil5SAULORypQyMF2ViAlYcWX8HSHkQSzQYGW9/Jbu9CpKOdpZwc6E+HCLBktSXfBYHzDcweaJ6DXcRbV6Ykem5Eu+aovCDaraUF6YZu8s7NpSBvomdWx6Ba2LAi5WJY1lDty7fIwKXZ1yGPfiH0wXGaqQBnJF3x8CA7Ar5i+gOP9lDVcIGAUqIXeb8ITqzvAjjW+2xdQrulaDO6Q2HngnPxAmTB0z50T+HaiY44hgKb9cg7+k/HhpE09zyBtAfP5VtvYo+BUy4VVHAsE5iVeLTA6iFieB1vjMhNXEADby1MP6eBBJKsWBUjeuAoeW6vgL2sVPCpWAS6BUC8BGDt9TP/Si+CRvQgel4vgL/9C23Yv2CN4RNDhIrwWpWfLBbm7TnatbfcvFalYGxt4iKCpWBbsXjU/9K01tifmWaotfYHPF9UKj+hDpJf0LX2ix/bCHttbPTap2BMzSmWP5tBYCop43ygQKAf32p2t5zQWlT+BSY2Cgt8Amp30WbteX/YxKPYt8B3oELPWyoR9VcM3FNMtZMSk4N+hIwt9EqteK56iZmCM3DdsUdRklugNcZ1zx7mp6nLxJWoS0u/b6brRnYwHe/DOzkOh+y6rUrTAv7iTo0qhFguwoMUgSKk8iYJWNUVmhI0IPiPs7jCNVrZ28/sYbezHBzD6pWKmDgd33UYYa5WMyRlWcx/GwgQOcOBBC1suOzdv78pUGHbxfCY0n1JWGFUVRnG5kyiFGCDV9zHgOzOv1P/DM3/vNO15FxyYoIkqUcaerbBVZW5UIG3cnaOJ+rs5MtU0q2qaRrm3tEkDMp1rb4l19g3jyeDFm1LYnb6giCjEDzoI3Rks1HHFB87Uw3t46QSILPemJJ5ggmlmXWkjbHZ3L8r3FP1XsmGqLw8S/mo4GVHXTanrTrRBY8JSD7pPS9XG39eV2bVYvDby0IZ91mzI2lKxRkGwJ3JEQesgjIcp7MrYnSUEBtvz6aqKt7Vo9oQbxgjElrXHliZwz5oKfyXgt5Bz14X1Iau2rdRb05RU0uKVlsUVXeMJbVAGW9L6UgzGMcqj4AtAaljmrl4V77m4T6uqBWaTeFIN56QYTt2W02FQtpxeRemGCRXkbuMFvfuR5jtV853YTMI1C6m1D0bBafXFa+x8CgPzyWuWhuZCJb/duWV756a4x9Ke8OJi7co5xNHucSghXvLNZl0zB72FtjJFwWm97mhqXSZ14vKxTTYbjB1UzPcafUBh+R6M91oGUKo50l+hdUH6K+NWCGdK/FVhk0Av1Guweq6IZXXVeCz1ERz4YTojBZdUPBH+BWyAFGLawdEVjGYC53FUGYregw9U6oMtVilI6ZbWR/3uQYYuxwNh3BwIg/og2a5SUE6oAzcRkIFzqE2hg45ccSaq1kjsQJLLuP5UjesKBwEZe2UaRBmD+FfWMVNwNOfVEgNHKk+hPxWBeLeFD7lBwjCgXrMovvLQsAPrGKbMhMhb3b+kTUgee+0eaH1tWl/j2QJgIN9wF9U6g3YTYxxZzNogjDplmpEJNhtURpgMUasN5yJhzrWXyRr/XuuzR/oZQ+0x8C6+tvyZEO+qAOlIUS6FSY3HxZPl17TjhH0Jvi/6GrZL8DYpYxRRrOSSRnuRJb/9aPFhpF/Ndn05bOh37fpUVN/cq/7M0VE0VtrPe83xDPuUoyt4UrqCJ3pSx0z4CzpD6Ftx4x2gYSvta7fmLNW+dUsM1oiHFY073pizBCQF1P2DY50VMd4ht2Nt+rOcB5xKtauJDCzix7KbeB4dm2CwcHUIAd9giBqOzsCB8VwuozAXEf27sx5HbsgKRGzFAtWOh5x41jGed/Ada+XgamjfrOeYDyf1GXw6qc/sy8MsVzVtsR94Uaydzy70nSRt+lAeus2RhW2q2IU0tzk+FxDJWl/iKKyLQHQEenMhBqdNgsHGTRF9pqEIZknIFg51YJ2V02+RtbzzRvXBaOp5hSejyQC3aOHGpjP2y7CDR0UNywVKcuY+Aetiqxxv1JV8xsdLvBp9t82eGVW9vtNtvmN7fit3r+t5KJ1GRC8k3kq2ms2qnNKpnBN+Eo6+weNXCEhnfIf0QX5h4dJYOceZgIu09ZXQR8euINaForbLY44DkDe3yq9GVFygbI86Uc4tXnTskNstVcVdwKC4JLdis4FjzA7RrqwJiMJcw/dPYV8iuyzuCVj2suKaiGK7M7NepHtLaq4aHNuc0ZIuXan5wARW4pgmsBIDmsBKHBeVwlt5BY5kyn8JsMvgxBqMNoGVLWkCKxuKTmGPMUWLCK7v4QhtQPBwiOlSYvbrZT8ormepheAq8lTE0j4atCTUgDOGC/tu+WbjcFaDoBwFmCWEWO9mkJj6XHxe8RXc57zVoWJyEC//FKxmBWGCKOd707yQecLBEQIvYD46diFoaybGs9nNbbbZ5HAF27aYB+M65jK53dJ0pq/sw1PswMNUE7U3m6mezcJPziwjDVBZADQFgAqaaoCmAFBxAKAphCFIyk9eagCa7AA0R4AKG6DJ3wNUIEAlJGYlQPMKoJX+7C4cEWbZtzGuiUPAlABMcFPT+M19Lp20WIIJLsFkr04uJtYKTOASbiugrty97PC+5VVeR6vKIXH/aak0I1UPeQkIUk4vuYVGa5bH1+22uG8eKESstowjRTmrXAj09d5PxrMZiINwOvLOx/ez7BI300c8+V7BA5+haHfJZ6kPHbjIJ6sZZ+PljUiOOOvfqnp9vB5n6ggvUkdO8v6+AY8pMct3+sFgCTi391YSH9qtjic8nY0VP65c4C0gHvh6fPUtWxzDteGNMC6+e3K8xjQvbMUhXHOg6vVjsZpfcgl3u98sQO4AtvcLnw3ML7gLG8R4K53bnwQi/J17AuE+6ipmyZwzvFOWwi199FcRc6sIChWsQyUcVsrZE4jzY5Zbqp08a5bPEh6cBNntmEK4Zh3qt02o7AX6tgEQAXpe2KqKSOZJrYqX/bCFV3lEVHosbOMKyXvhZpP3TzebTg2iZcleZ7OR6GWjeuCZB58yeMr6zc2mw5is18MaS6sWdJoj2Wmxw+BwCwAkELVgDoxY4l/DRdEJBOhqRjSBAE8pTawgSYl/jZRfS0OJf00T/3fOIMELaeL/wlnuntDE/81k+AWq+wNy/KZzPOPMgeTyVl6aVKJY9HOCwlICAaCMq3qR8tlK+Q1Tvujt5yU2lbttmkCcqMLT7Gf4Atl+5Uy/QEv1OtQNfz/j33d84CQQVgoeK5pZlP0IPf+Ju6b4Qw7BbeAFnLMS/wbiHCX+NdzPkvjnCoj4nRsF74bhMYDHqFjABOJ9qAzkIfR70vgDMk1EjQungpiPJjgVBKoCd0beC9BLE6JwKYzCBaG0WMTAG5APWidwkzEIUkUKWuljbTtXEK/Mi3a6i8j7CENUlAG0+uylIrvHwl4q+8orfaUtCrOQYt+Leye7ZuaggAmVd4GNXVSNmft+d2vQifblWTuNXhxodK/InYYfKn3XidXw50MNf65qwau4dhp+qA41vFPEbhiC/zBzNy+G+jG38+aCPoVbXN2QPlP0J31k/4mV9aLMmgrKBQ3o8zLfCyvfQ7Vz4a+CnJ8V3Puxc7mavnst0CGGtg6E2IPgRCU9CJBu2YgBIUoY3H57yemFiU3wRrGPYsgx1t9vGNnFSvgFEr5YCX9AwpWV8EzHPNR+fkXYR/wR5Vl8DFxgDuSvy+gRoI3w54DtGP0qdhITT5AWl857TUIx9Bz1moTEXnOLl2t0qKAd4Enfi/gPQbmMn4kt0ZcGdVHcWMtMjS9nwH0Vj1rMknw8MR+KR3+RLfjbqcxXV1MHGBJgHL6zk35/p7xLK+5++/tdskhsN63kdhy2/qM9EQ+x1cJ7t8XS+Xd/EzQUzLCuHhi8S5ondbUYSWYOUoTUew4eAswH2oVHn4I7eP2tbg3F551d15xTV2afVT245a/MIFDz9kmYzlDFPBNySLCW66h+v0l0hlpIVa8J1x0qOJ5MukVY5E9isANK3NphL1b9XBPxSr8IZ4qkf62jTUqMaajjJqJK7hpi4923J5SKAaek/Jea8n/RP6hF/PHi1c6i/JWwthdVXXQR1ovtQ4JsgiOtpkGhB1RIlZ+Y3yUa7hQ47GJuVF2YC+AnfMYVP4LAinCz+f83sJODIS4HL1NPB63EB69PB7Oy4WJ5eZAOCWRWEFIiwQnQAdB5UDoqzyqyCJR7XYpqIeUWat4twZV3S/Dm3VrNWk1rLgA=")),t=>t({workerURI:t=>{const o="text/javascript";let r=z$1();if("string"==typeof r&&(r=(new TextEncoder).encode(r)),t){const t=new Blob([r],{type:o});return URL.createObjectURL(t)}return "data:"+o+";base64,"+function(t){let o="";const r=t.length;let e=0;for(;e+2<r;e+=3){const r=t[e]<<16|t[e+1]<<8|t[e+2];o+=l[r>>18&63]+l[r>>12&63]+l[r>>6&63]+l[63&r];}const n=r-e;if(1===n){const r=t[e]<<16;o+=l[r>>18&63]+l[r>>12&63]+"==";}else if(2===n){const r=t[e]<<16|t[e+1]<<8;o+=l[r>>18&63]+l[r>>12&63]+l[r>>6&63]+"=";}return o}(r)}}));var z$1;
|
|
448
|
+
const n=[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],e=[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],t=[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],r=[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],f=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],q$1=new Uint8Array(288);q$1.fill(8,0,144),q$1.fill(9,144,256),q$1.fill(7,256,280),q$1.fill(8,280,288);const o=new Uint8Array(30).fill(5);function u(n){const e=new Uint16Array(16);for(const t of n)e[t]++;e[0]=0;const t=new Uint16Array(17);for(let n=1;n<=15;n++)t[n+1]=t[n]+e[n];const r=new Uint16Array(n.length);for(let e=0;e<n.length;e++)n[e]&&(r[t[n[e]]++]=e);return {o:e,symbols:r}}const v="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",c=(a=()=>function(v){let c=0,a=0,y=0,V=new Uint8Array(1024),z=0,i=0;for(;!i;){i=P(1);const n=P(2);if(0==n)j();else if(1==n)T(u(q$1),u(o));else {if(2!=n)throw new Error("invalid deflate block type");T(...O());}}return V.subarray(0,z);function X(){if(c>=v.length)throw new Error("unexpected end of deflate data");return v[c++]}function P(n){for(;y<n;)a|=X()<<y,y+=8;const e=a&(1<<n)-1;return a>>>=n,y-=n,e}function j(){a=0,y=0;const n=X()|X()<<8;c+=2,h(z+n);for(let e=0;e<n;e++)V[z++]=X();}function T(f,q){let o=C(f);for(;256!=o;){if(o<256)h(z+1),V[z++]=o;else {const f=o-257,u=n[f]+P(e[f]),v=C(q),c=t[v]+P(r[v]);h(z+u);const a=z-c;for(let n=0;n<u;n++)V[z++]=V[a+n];}o=C(f);}}function O(){const n=P(5)+257,e=P(5)+1,t=P(4)+4,r=new Uint8Array(19);for(let n=0;n<t;n++)r[f[n]]=P(3);const q=u(r),o=new Uint8Array(n+e);let v=0;for(;v<o.length;){const n=C(q);if(n<16)o[v++]=n;else if(16==n){const n=o[v-1];let e=P(2)+3;for(;e--;)o[v++]=n;}else v+=17==n?P(3)+3:P(7)+11;}return [u(o.subarray(0,n)),u(o.subarray(n))]}function C(n){const{o:e,symbols:t}=n;let r=0,f=0,q=0;for(let n=1;n<=15;n++){r|=P(1);const o=e[n];if(r-f<o)return t[q+(r-f)];q+=o,f=f+o<<1,r<<=1;}throw new Error("invalid huffman code")}function h(n){if(V.length<n){let e=2*V.length;for(;e<n;)e*=2;const t=new Uint8Array(e);t.set(V.subarray(0,z)),V=t;}}}(function(n){const e=(n=String(n).replace(/[^A-Za-z0-9+/=]/g,"")).length,t=[];for(let r=0;r<e;r+=4){const e=v.indexOf(n[r])<<18|v.indexOf(n[r+1])<<12|(63&v.indexOf(n[r+2]))<<6|63&v.indexOf(n[r+3]);t.push(e>>16&255),"="!==n[r+2]&&t.push(e>>8&255),"="!==n[r+3]&&t.push(255&e);}return new Uint8Array(t)}("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")),n=>n({workerURI:n=>{const e="text/javascript";let t=a();if("string"==typeof t&&(t=(new TextEncoder).encode(t)),n){const n=new Blob([t],{type:e});return URL.createObjectURL(n)}return "data:"+e+";base64,"+function(n){let e="";const t=n.length;let r=0;for(;r+2<t;r+=3){const t=n[r]<<16|n[r+1]<<8|n[r+2];e+=v[t>>18&63]+v[t>>12&63]+v[t>>6&63]+v[63&t];}const f=t-r;if(1===f){const t=n[r]<<16;e+=v[t>>18&63]+v[t>>12&63]+"==";}else if(2===f){const t=n[r]<<16|n[r+1]<<8;e+=v[t>>18&63]+v[t>>12&63]+v[t>>6&63]+"=";}return e}(t)}}));var a;
|
|
449
449
|
|
|
450
450
|
/*
|
|
451
451
|
Copyright (c) 2026 Gildas Lormeau. All rights reserved.
|
|
@@ -575,7 +575,7 @@
|
|
|
575
575
|
T$1[k][n] = (previous >>> 8) ^ T$1[0][previous & 0xFF];
|
|
576
576
|
}
|
|
577
577
|
}
|
|
578
|
-
const [T0, T1, T2, T3, T4, T5, T6, T7] = T$1;
|
|
578
|
+
const [T0$1, T1$1, T2$1, T3$1, T4, T5, T6, T7] = T$1;
|
|
579
579
|
|
|
580
580
|
class Crc32 {
|
|
581
581
|
|
|
@@ -597,12 +597,12 @@
|
|
|
597
597
|
const a = crc ^ view.getInt32(offset, true);
|
|
598
598
|
const b = view.getInt32(offset + 4, true);
|
|
599
599
|
crc = T7[a & 0xFF] ^ T6[(a >>> 8) & 0xFF] ^ T5[(a >>> 16) & 0xFF] ^ T4[(a >>> 24) & 0xFF] ^
|
|
600
|
-
T3[b & 0xFF] ^ T2[(b >>> 8) & 0xFF] ^ T1[(b >>> 16) & 0xFF] ^ T0[(b >>> 24) & 0xFF];
|
|
600
|
+
T3$1[b & 0xFF] ^ T2$1[(b >>> 8) & 0xFF] ^ T1$1[(b >>> 16) & 0xFF] ^ T0$1[(b >>> 24) & 0xFF];
|
|
601
601
|
}
|
|
602
602
|
}
|
|
603
603
|
// Remaining tail (and non-typed inputs) byte-at-a-time with the base table.
|
|
604
604
|
for (; offset < length; offset++) {
|
|
605
|
-
crc = (crc >>> 8) ^ T0[(crc ^ data[offset]) & 0xFF];
|
|
605
|
+
crc = (crc >>> 8) ^ T0$1[(crc ^ data[offset]) & 0xFF];
|
|
606
606
|
}
|
|
607
607
|
this.crc = crc;
|
|
608
608
|
}
|
|
@@ -706,794 +706,349 @@
|
|
|
706
706
|
}
|
|
707
707
|
}
|
|
708
708
|
|
|
709
|
-
// Derived from https://github.com/xqdoo00o/jszip/blob/master/lib/sjcl.js and https://github.com/bitwiseshiftleft/sjcl
|
|
710
|
-
|
|
711
|
-
// deno-lint-ignore-file no-this-alias
|
|
712
|
-
|
|
713
709
|
/*
|
|
714
|
-
|
|
715
|
-
* license or under the GNU GPL, version 2.0.
|
|
716
|
-
*/
|
|
717
|
-
|
|
718
|
-
/** @fileOverview Javascript cryptography implementation.
|
|
719
|
-
*
|
|
720
|
-
* Crush to remove comments, shorten variable names and
|
|
721
|
-
* generally reduce transmission size.
|
|
722
|
-
*
|
|
723
|
-
* @author Emily Stark
|
|
724
|
-
* @author Mike Hamburg
|
|
725
|
-
* @author Dan Boneh
|
|
726
|
-
*/
|
|
727
|
-
|
|
728
|
-
/*jslint indent: 2, bitwise: false, nomen: false, plusplus: false, white: false, regexp: false */
|
|
729
|
-
|
|
730
|
-
/** @fileOverview Arrays of bits, encoded as arrays of Numbers.
|
|
731
|
-
*
|
|
732
|
-
* @author Emily Stark
|
|
733
|
-
* @author Mike Hamburg
|
|
734
|
-
* @author Dan Boneh
|
|
735
|
-
*/
|
|
736
|
-
|
|
737
|
-
/**
|
|
738
|
-
* Arrays of bits, encoded as arrays of Numbers.
|
|
739
|
-
* @namespace
|
|
740
|
-
* @description
|
|
741
|
-
* <p>
|
|
742
|
-
* These objects are the currency accepted by SJCL's crypto functions.
|
|
743
|
-
* </p>
|
|
744
|
-
*
|
|
745
|
-
* <p>
|
|
746
|
-
* Most of our crypto primitives operate on arrays of 4-byte words internally,
|
|
747
|
-
* but many of them can take arguments that are not a multiple of 4 bytes.
|
|
748
|
-
* This library encodes arrays of bits (whose size need not be a multiple of 8
|
|
749
|
-
* bits) as arrays of 32-bit words. The bits are packed, big-endian, into an
|
|
750
|
-
* array of words, 32 bits at a time. Since the words are double-precision
|
|
751
|
-
* floating point numbers, they fit some extra data. We use this (in a private,
|
|
752
|
-
* possibly-changing manner) to encode the number of bits actually present
|
|
753
|
-
* in the last word of the array.
|
|
754
|
-
* </p>
|
|
755
|
-
*
|
|
756
|
-
* <p>
|
|
757
|
-
* Because bitwise ops clear this out-of-band data, these arrays can be passed
|
|
758
|
-
* to ciphers like AES which want arrays of words.
|
|
759
|
-
* </p>
|
|
760
|
-
*/
|
|
761
|
-
const bitArray = {
|
|
762
|
-
/**
|
|
763
|
-
* Concatenate two bit arrays.
|
|
764
|
-
* @param {bitArray} a1 The first array.
|
|
765
|
-
* @param {bitArray} a2 The second array.
|
|
766
|
-
* @return {bitArray} The concatenation of a1 and a2.
|
|
767
|
-
*/
|
|
768
|
-
concat(a1, a2) {
|
|
769
|
-
if (a1.length === 0 || a2.length === 0) {
|
|
770
|
-
return a1.concat(a2);
|
|
771
|
-
}
|
|
772
|
-
|
|
773
|
-
const last = a1[a1.length - 1], shift = bitArray.getPartial(last);
|
|
774
|
-
if (shift === 32) {
|
|
775
|
-
return a1.concat(a2);
|
|
776
|
-
} else {
|
|
777
|
-
return bitArray._shiftRight(a2, shift, last | 0, a1.slice(0, a1.length - 1));
|
|
778
|
-
}
|
|
779
|
-
},
|
|
780
|
-
|
|
781
|
-
/**
|
|
782
|
-
* Find the length of an array of bits.
|
|
783
|
-
* @param {bitArray} a The array.
|
|
784
|
-
* @return {Number} The length of a, in bits.
|
|
785
|
-
*/
|
|
786
|
-
bitLength(a) {
|
|
787
|
-
const l = a.length;
|
|
788
|
-
if (l === 0) {
|
|
789
|
-
return 0;
|
|
790
|
-
}
|
|
791
|
-
const x = a[l - 1];
|
|
792
|
-
return (l - 1) * 32 + bitArray.getPartial(x);
|
|
793
|
-
},
|
|
794
|
-
|
|
795
|
-
/**
|
|
796
|
-
* Truncate an array.
|
|
797
|
-
* @param {bitArray} a The array.
|
|
798
|
-
* @param {Number} len The length to truncate to, in bits.
|
|
799
|
-
* @return {bitArray} A new array, truncated to len bits.
|
|
800
|
-
*/
|
|
801
|
-
clamp(a, len) {
|
|
802
|
-
if (a.length * 32 < len) {
|
|
803
|
-
return a;
|
|
804
|
-
}
|
|
805
|
-
a = a.slice(0, Math.ceil(len / 32));
|
|
806
|
-
const l = a.length;
|
|
807
|
-
len = len & 31;
|
|
808
|
-
if (l > 0 && len) {
|
|
809
|
-
a[l - 1] = bitArray.partial(len, a[l - 1] & 0x80000000 >> (len - 1), 1);
|
|
810
|
-
}
|
|
811
|
-
return a;
|
|
812
|
-
},
|
|
813
|
-
|
|
814
|
-
/**
|
|
815
|
-
* Make a partial word for a bit array.
|
|
816
|
-
* @param {Number} len The number of bits in the word.
|
|
817
|
-
* @param {Number} x The bits.
|
|
818
|
-
* @param {Number} [_end=0] Pass 1 if x has already been shifted to the high side.
|
|
819
|
-
* @return {Number} The partial word.
|
|
820
|
-
*/
|
|
821
|
-
partial(len, x, _end) {
|
|
822
|
-
if (len === 32) {
|
|
823
|
-
return x;
|
|
824
|
-
}
|
|
825
|
-
return (_end ? x | 0 : x << (32 - len)) + len * 0x10000000000;
|
|
826
|
-
},
|
|
710
|
+
Copyright (c) 2026 Gildas Lormeau. All rights reserved.
|
|
827
711
|
|
|
828
|
-
|
|
829
|
-
|
|
830
|
-
* @param {Number} x The partial word.
|
|
831
|
-
* @return {Number} The number of bits used by the partial word.
|
|
832
|
-
*/
|
|
833
|
-
getPartial(x) {
|
|
834
|
-
return Math.round(x / 0x10000000000) || 32;
|
|
835
|
-
},
|
|
712
|
+
Redistribution and use in source and binary forms, with or without
|
|
713
|
+
modification, are permitted provided that the following conditions are met:
|
|
836
714
|
|
|
837
|
-
|
|
838
|
-
|
|
839
|
-
* @param {Number} shift The number of bits to shift.
|
|
840
|
-
* @param {Number} [carry=0] A byte to carry in
|
|
841
|
-
* @param {bitArray} [out=[]] An array to prepend to the output.
|
|
842
|
-
* @private
|
|
843
|
-
*/
|
|
844
|
-
_shiftRight(a, shift, carry, out) {
|
|
845
|
-
if (out === undefined) {
|
|
846
|
-
out = [];
|
|
847
|
-
}
|
|
715
|
+
1. Redistributions of source code must retain the above copyright notice,
|
|
716
|
+
this list of conditions and the following disclaimer.
|
|
848
717
|
|
|
849
|
-
|
|
850
|
-
|
|
851
|
-
|
|
852
|
-
}
|
|
853
|
-
if (shift === 0) {
|
|
854
|
-
return out.concat(a);
|
|
855
|
-
}
|
|
718
|
+
2. Redistributions in binary form must reproduce the above copyright
|
|
719
|
+
notice, this list of conditions and the following disclaimer in
|
|
720
|
+
the documentation and/or other materials provided with the distribution.
|
|
856
721
|
|
|
857
|
-
|
|
858
|
-
|
|
859
|
-
carry = a[i] << (32 - shift);
|
|
860
|
-
}
|
|
861
|
-
const last2 = a.length ? a[a.length - 1] : 0;
|
|
862
|
-
const shift2 = bitArray.getPartial(last2);
|
|
863
|
-
out.push(bitArray.partial(shift + shift2 & 31, (shift + shift2 > 32) ? carry : out.pop(), 1));
|
|
864
|
-
return out;
|
|
865
|
-
}
|
|
866
|
-
};
|
|
722
|
+
3. The names of the authors may not be used to endorse or promote products
|
|
723
|
+
derived from this software without specific prior written permission.
|
|
867
724
|
|
|
868
|
-
|
|
869
|
-
|
|
870
|
-
|
|
871
|
-
|
|
872
|
-
|
|
725
|
+
THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
|
|
726
|
+
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
|
|
727
|
+
FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT,
|
|
728
|
+
INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
729
|
+
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
730
|
+
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
|
|
731
|
+
OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
|
732
|
+
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
|
733
|
+
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
|
|
734
|
+
EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
873
735
|
*/
|
|
874
736
|
|
|
875
|
-
|
|
876
|
-
|
|
877
|
-
|
|
878
|
-
|
|
879
|
-
const
|
|
880
|
-
|
|
881
|
-
|
|
882
|
-
|
|
883
|
-
|
|
884
|
-
|
|
885
|
-
|
|
886
|
-
|
|
887
|
-
|
|
888
|
-
|
|
889
|
-
|
|
890
|
-
|
|
891
|
-
|
|
892
|
-
|
|
893
|
-
|
|
894
|
-
|
|
895
|
-
|
|
896
|
-
|
|
897
|
-
|
|
898
|
-
|
|
899
|
-
|
|
900
|
-
|
|
901
|
-
|
|
902
|
-
|
|
903
|
-
|
|
904
|
-
|
|
905
|
-
tmp = 0;
|
|
906
|
-
}
|
|
737
|
+
const BLOCK_LENGTH$1 = 16;
|
|
738
|
+
const ROUND_KEYS_LENGTH = 60;
|
|
739
|
+
const SHA1_BLOCK_LENGTH = 64;
|
|
740
|
+
const SHA1_DIGEST_LENGTH = 20;
|
|
741
|
+
const SHA1_SCHEDULE_LENGTH = 80;
|
|
742
|
+
const SHA1_LENGTH_OFFSET = 56;
|
|
743
|
+
const SHA1_PADDING = new Uint8Array([0x80]);
|
|
744
|
+
const SHA1_ZERO = new Uint8Array(1);
|
|
745
|
+
const SHA1_INITIAL_STATE = new Int32Array([0x67452301, 0xEFCDAB89, 0x98BADCFE, 0x10325476, 0xC3D2E1F0]);
|
|
746
|
+
const HMAC_INNER_PADDING = 0x36;
|
|
747
|
+
const HMAC_OUTER_PADDING = 0x5c;
|
|
748
|
+
const S_BOX = new Uint8Array(256);
|
|
749
|
+
const T0 = new Int32Array(256);
|
|
750
|
+
const T1 = new Int32Array(256);
|
|
751
|
+
const T2 = new Int32Array(256);
|
|
752
|
+
const T3 = new Int32Array(256);
|
|
753
|
+
|
|
754
|
+
let tablesInitialized = false;
|
|
755
|
+
|
|
756
|
+
function createEngine$1(key, authenticationKey) {
|
|
757
|
+
initTables();
|
|
758
|
+
const roundKeys = new Int32Array(ROUND_KEYS_LENGTH);
|
|
759
|
+
const rounds = expandKey(key, roundKeys);
|
|
760
|
+
const counter = new Uint8Array(BLOCK_LENGTH$1);
|
|
761
|
+
const keystream = new Int32Array(BLOCK_LENGTH$1 / 4);
|
|
762
|
+
const hmac = createHmac(authenticationKey);
|
|
763
|
+
return {
|
|
764
|
+
process(data, decrypt) {
|
|
765
|
+
if (decrypt) {
|
|
766
|
+
hmac.update(data, 0, data.length);
|
|
907
767
|
}
|
|
908
|
-
|
|
909
|
-
|
|
768
|
+
encrypt(data);
|
|
769
|
+
if (!decrypt) {
|
|
770
|
+
hmac.update(data, 0, data.length);
|
|
910
771
|
}
|
|
911
|
-
|
|
912
|
-
|
|
913
|
-
|
|
914
|
-
};
|
|
915
|
-
|
|
916
|
-
const hash = {};
|
|
917
|
-
|
|
918
|
-
/**
|
|
919
|
-
* Context for a SHA-1 operation in progress.
|
|
920
|
-
* @constructor
|
|
921
|
-
*/
|
|
922
|
-
hash.sha1 = class {
|
|
923
|
-
constructor(hash) {
|
|
924
|
-
const sha1 = this;
|
|
925
|
-
/**
|
|
926
|
-
* The hash's block size, in bits.
|
|
927
|
-
* @constant
|
|
928
|
-
*/
|
|
929
|
-
sha1.blockSize = 512;
|
|
930
|
-
/**
|
|
931
|
-
* The SHA-1 initialization vector.
|
|
932
|
-
* @private
|
|
933
|
-
*/
|
|
934
|
-
sha1._init = [0x67452301, 0xEFCDAB89, 0x98BADCFE, 0x10325476, 0xC3D2E1F0];
|
|
935
|
-
/**
|
|
936
|
-
* The SHA-1 hash key.
|
|
937
|
-
* @private
|
|
938
|
-
*/
|
|
939
|
-
sha1._key = [0x5A827999, 0x6ED9EBA1, 0x8F1BBCDC, 0xCA62C1D6];
|
|
940
|
-
if (hash) {
|
|
941
|
-
sha1._h = hash._h.slice(0);
|
|
942
|
-
sha1._buffer = hash._buffer.slice(0);
|
|
943
|
-
sha1._length = hash._length;
|
|
944
|
-
} else {
|
|
945
|
-
sha1.reset();
|
|
946
|
-
}
|
|
947
|
-
}
|
|
948
|
-
|
|
949
|
-
/**
|
|
950
|
-
* Reset the hash state.
|
|
951
|
-
* @return this
|
|
952
|
-
*/
|
|
953
|
-
reset() {
|
|
954
|
-
const sha1 = this;
|
|
955
|
-
sha1._h = sha1._init.slice(0);
|
|
956
|
-
sha1._buffer = [];
|
|
957
|
-
sha1._length = 0;
|
|
958
|
-
return sha1;
|
|
959
|
-
}
|
|
960
|
-
|
|
961
|
-
/**
|
|
962
|
-
* Input several words to the hash.
|
|
963
|
-
* @param {bitArray|String} data the data to hash.
|
|
964
|
-
* @return this
|
|
965
|
-
*/
|
|
966
|
-
update(data) {
|
|
967
|
-
const sha1 = this;
|
|
968
|
-
if (typeof data === "string") {
|
|
969
|
-
data = codec.utf8String.toBits(data);
|
|
970
|
-
}
|
|
971
|
-
const b = sha1._buffer = bitArray.concat(sha1._buffer, data);
|
|
972
|
-
const ol = sha1._length;
|
|
973
|
-
const nl = sha1._length = ol + bitArray.bitLength(data);
|
|
974
|
-
if (nl > 9007199254740991) {
|
|
975
|
-
throw new Error("Cannot hash more than 2^53 - 1 bits");
|
|
976
|
-
}
|
|
977
|
-
const c = new Uint32Array(b);
|
|
978
|
-
let j = 0;
|
|
979
|
-
for (let i = sha1.blockSize + ol - ((sha1.blockSize + ol) & (sha1.blockSize - 1)); i <= nl;
|
|
980
|
-
i += sha1.blockSize) {
|
|
981
|
-
sha1._block(c.subarray(16 * j, 16 * (j + 1)));
|
|
982
|
-
j += 1;
|
|
983
|
-
}
|
|
984
|
-
b.splice(0, 16 * j);
|
|
985
|
-
return sha1;
|
|
986
|
-
}
|
|
987
|
-
|
|
988
|
-
/**
|
|
989
|
-
* Complete hashing and output the hash value.
|
|
990
|
-
* @return {bitArray} The hash value, an array of 5 big-endian words. TODO
|
|
991
|
-
*/
|
|
992
|
-
finalize() {
|
|
993
|
-
const sha1 = this;
|
|
994
|
-
let b = sha1._buffer;
|
|
995
|
-
const h = sha1._h;
|
|
996
|
-
|
|
997
|
-
// Round out and push the buffer
|
|
998
|
-
b = bitArray.concat(b, [bitArray.partial(1, 1)]);
|
|
999
|
-
// Round out the buffer to a multiple of 16 words, less the 2 length words.
|
|
1000
|
-
for (let i = b.length + 2; i & 15; i++) {
|
|
1001
|
-
b.push(0);
|
|
1002
|
-
}
|
|
1003
|
-
|
|
1004
|
-
// append the length
|
|
1005
|
-
b.push(Math.floor(sha1._length / 0x100000000));
|
|
1006
|
-
b.push(sha1._length | 0);
|
|
1007
|
-
|
|
1008
|
-
while (b.length) {
|
|
1009
|
-
sha1._block(b.splice(0, 16));
|
|
1010
|
-
}
|
|
1011
|
-
|
|
1012
|
-
sha1.reset();
|
|
1013
|
-
return h;
|
|
1014
|
-
}
|
|
1015
|
-
|
|
1016
|
-
/**
|
|
1017
|
-
* The SHA-1 logical functions f(0), f(1), ..., f(79).
|
|
1018
|
-
* @private
|
|
1019
|
-
*/
|
|
1020
|
-
_f(t, b, c, d) {
|
|
1021
|
-
if (t <= 19) {
|
|
1022
|
-
return (b & c) | (~b & d);
|
|
1023
|
-
} else if (t <= 39) {
|
|
1024
|
-
return b ^ c ^ d;
|
|
1025
|
-
} else if (t <= 59) {
|
|
1026
|
-
return (b & c) | (b & d) | (c & d);
|
|
1027
|
-
} else if (t <= 79) {
|
|
1028
|
-
return b ^ c ^ d;
|
|
1029
|
-
}
|
|
1030
|
-
}
|
|
1031
|
-
|
|
1032
|
-
/**
|
|
1033
|
-
* Circular left-shift operator.
|
|
1034
|
-
* @private
|
|
1035
|
-
*/
|
|
1036
|
-
_S(n, x) {
|
|
1037
|
-
return (x << n) | (x >>> 32 - n);
|
|
1038
|
-
}
|
|
1039
|
-
|
|
1040
|
-
/**
|
|
1041
|
-
* Perform one cycle of SHA-1.
|
|
1042
|
-
* @param {Uint32Array|bitArray} words one block of words.
|
|
1043
|
-
* @private
|
|
1044
|
-
*/
|
|
1045
|
-
_block(words) {
|
|
1046
|
-
const sha1 = this;
|
|
1047
|
-
const h = sha1._h;
|
|
1048
|
-
// When words is passed to _block, it has 16 elements. SHA1 _block
|
|
1049
|
-
// function extends words with new elements (at the end there are 80 elements).
|
|
1050
|
-
// The problem is that if we use Uint32Array instead of Array,
|
|
1051
|
-
// the length of Uint32Array cannot be changed. Thus, we replace words with a
|
|
1052
|
-
// normal Array here.
|
|
1053
|
-
const w = Array(80); // do not use Uint32Array here as the instantiation is slower
|
|
1054
|
-
for (let j = 0; j < 16; j++) {
|
|
1055
|
-
w[j] = words[j];
|
|
1056
|
-
}
|
|
1057
|
-
|
|
1058
|
-
let a = h[0];
|
|
1059
|
-
let b = h[1];
|
|
1060
|
-
let c = h[2];
|
|
1061
|
-
let d = h[3];
|
|
1062
|
-
let e = h[4];
|
|
1063
|
-
|
|
1064
|
-
for (let t = 0; t <= 79; t++) {
|
|
1065
|
-
if (t >= 16) {
|
|
1066
|
-
w[t] = sha1._S(1, w[t - 3] ^ w[t - 8] ^ w[t - 14] ^ w[t - 16]);
|
|
1067
|
-
}
|
|
1068
|
-
const tmp = (sha1._S(5, a) + sha1._f(t, b, c, d) + e + w[t] +
|
|
1069
|
-
sha1._key[Math.floor(t / 20)]) | 0;
|
|
1070
|
-
e = d;
|
|
1071
|
-
d = c;
|
|
1072
|
-
c = sha1._S(30, b);
|
|
1073
|
-
b = a;
|
|
1074
|
-
a = tmp;
|
|
772
|
+
},
|
|
773
|
+
digest() {
|
|
774
|
+
return hmac.digest();
|
|
1075
775
|
}
|
|
776
|
+
};
|
|
1076
777
|
|
|
1077
|
-
|
|
1078
|
-
|
|
1079
|
-
|
|
1080
|
-
|
|
1081
|
-
|
|
778
|
+
function encrypt(data) {
|
|
779
|
+
const view = new DataView(data.buffer, data.byteOffset, data.byteLength);
|
|
780
|
+
const length = data.length;
|
|
781
|
+
let offset = 0;
|
|
782
|
+
for (; offset + BLOCK_LENGTH$1 <= length; offset += BLOCK_LENGTH$1) {
|
|
783
|
+
nextKeystream();
|
|
784
|
+
view.setInt32(offset, view.getInt32(offset) ^ keystream[0]);
|
|
785
|
+
view.setInt32(offset + 4, view.getInt32(offset + 4) ^ keystream[1]);
|
|
786
|
+
view.setInt32(offset + 8, view.getInt32(offset + 8) ^ keystream[2]);
|
|
787
|
+
view.setInt32(offset + 12, view.getInt32(offset + 12) ^ keystream[3]);
|
|
788
|
+
}
|
|
789
|
+
if (offset < length) {
|
|
790
|
+
nextKeystream();
|
|
791
|
+
for (let indexByte = 0; offset < length; offset++, indexByte++) {
|
|
792
|
+
data[offset] ^= keystream[indexByte >> 2] >>> (24 - 8 * (indexByte & 3));
|
|
793
|
+
}
|
|
794
|
+
}
|
|
795
|
+
}
|
|
796
|
+
|
|
797
|
+
function nextKeystream() {
|
|
798
|
+
for (let indexByte = 0; indexByte < BLOCK_LENGTH$1; indexByte++) {
|
|
799
|
+
counter[indexByte]++;
|
|
800
|
+
if (counter[indexByte] !== 0) {
|
|
801
|
+
break;
|
|
802
|
+
}
|
|
803
|
+
}
|
|
804
|
+
let s0 = ((counter[0] << 24) | (counter[1] << 16) | (counter[2] << 8) | counter[3]) ^ roundKeys[0];
|
|
805
|
+
let s1 = ((counter[4] << 24) | (counter[5] << 16) | (counter[6] << 8) | counter[7]) ^ roundKeys[1];
|
|
806
|
+
let s2 = ((counter[8] << 24) | (counter[9] << 16) | (counter[10] << 8) | counter[11]) ^ roundKeys[2];
|
|
807
|
+
let s3 = ((counter[12] << 24) | (counter[13] << 16) | (counter[14] << 8) | counter[15]) ^ roundKeys[3];
|
|
808
|
+
let indexKey = 4;
|
|
809
|
+
for (let round = 1; round < rounds; round++, indexKey += 4) {
|
|
810
|
+
const t0 = T0[s0 >>> 24] ^ T1[(s1 >>> 16) & 255] ^ T2[(s2 >>> 8) & 255] ^ T3[s3 & 255] ^ roundKeys[indexKey];
|
|
811
|
+
const t1 = T0[s1 >>> 24] ^ T1[(s2 >>> 16) & 255] ^ T2[(s3 >>> 8) & 255] ^ T3[s0 & 255] ^ roundKeys[indexKey + 1];
|
|
812
|
+
const t2 = T0[s2 >>> 24] ^ T1[(s3 >>> 16) & 255] ^ T2[(s0 >>> 8) & 255] ^ T3[s1 & 255] ^ roundKeys[indexKey + 2];
|
|
813
|
+
const t3 = T0[s3 >>> 24] ^ T1[(s0 >>> 16) & 255] ^ T2[(s1 >>> 8) & 255] ^ T3[s2 & 255] ^ roundKeys[indexKey + 3];
|
|
814
|
+
s0 = t0;
|
|
815
|
+
s1 = t1;
|
|
816
|
+
s2 = t2;
|
|
817
|
+
s3 = t3;
|
|
818
|
+
}
|
|
819
|
+
keystream[0] = ((S_BOX[s0 >>> 24] << 24) | (S_BOX[(s1 >>> 16) & 255] << 16) | (S_BOX[(s2 >>> 8) & 255] << 8) | S_BOX[s3 & 255]) ^ roundKeys[indexKey];
|
|
820
|
+
keystream[1] = ((S_BOX[s1 >>> 24] << 24) | (S_BOX[(s2 >>> 16) & 255] << 16) | (S_BOX[(s3 >>> 8) & 255] << 8) | S_BOX[s0 & 255]) ^ roundKeys[indexKey + 1];
|
|
821
|
+
keystream[2] = ((S_BOX[s2 >>> 24] << 24) | (S_BOX[(s3 >>> 16) & 255] << 16) | (S_BOX[(s0 >>> 8) & 255] << 8) | S_BOX[s1 & 255]) ^ roundKeys[indexKey + 2];
|
|
822
|
+
keystream[3] = ((S_BOX[s3 >>> 24] << 24) | (S_BOX[(s0 >>> 16) & 255] << 16) | (S_BOX[(s1 >>> 8) & 255] << 8) | S_BOX[s2 & 255]) ^ roundKeys[indexKey + 3];
|
|
823
|
+
}
|
|
824
|
+
}
|
|
825
|
+
|
|
826
|
+
function pbkdf2(password, salt, iterations, length) {
|
|
827
|
+
const hmac = createHmac(password);
|
|
828
|
+
const result = new Uint8Array(length);
|
|
829
|
+
const block = new Uint8Array(salt.length + 4);
|
|
830
|
+
const blockView = new DataView(block.buffer);
|
|
831
|
+
block.set(salt);
|
|
832
|
+
for (let indexBlock = 1, offset = 0; offset < length; indexBlock++, offset += SHA1_DIGEST_LENGTH) {
|
|
833
|
+
blockView.setUint32(salt.length, indexBlock);
|
|
834
|
+
hmac.update(block, 0, block.length);
|
|
835
|
+
let previous = hmac.digest();
|
|
836
|
+
const output = previous.slice();
|
|
837
|
+
for (let iteration = 1; iteration < iterations; iteration++) {
|
|
838
|
+
hmac.update(previous, 0, SHA1_DIGEST_LENGTH);
|
|
839
|
+
previous = hmac.digest();
|
|
840
|
+
for (let indexByte = 0; indexByte < SHA1_DIGEST_LENGTH; indexByte++) {
|
|
841
|
+
output[indexByte] ^= previous[indexByte];
|
|
842
|
+
}
|
|
843
|
+
}
|
|
844
|
+
result.set(output.subarray(0, Math.min(SHA1_DIGEST_LENGTH, length - offset)), offset);
|
|
1082
845
|
}
|
|
1083
|
-
|
|
1084
|
-
|
|
1085
|
-
/** @fileOverview Low-level AES implementation.
|
|
1086
|
-
*
|
|
1087
|
-
* This file contains a low-level implementation of AES, optimized for
|
|
1088
|
-
* size and for efficiency on several browsers. It is based on
|
|
1089
|
-
* OpenSSL's aes_core.c, a public-domain implementation by Vincent
|
|
1090
|
-
* Rijmen, Antoon Bosselaers and Paulo Barreto.
|
|
1091
|
-
*
|
|
1092
|
-
* An older version of this implementation is available in the public
|
|
1093
|
-
* domain, but this one is (c) Emily Stark, Mike Hamburg, Dan Boneh,
|
|
1094
|
-
* Stanford University 2008-2010 and BSD-licensed for liability
|
|
1095
|
-
* reasons.
|
|
1096
|
-
*
|
|
1097
|
-
* @author Emily Stark
|
|
1098
|
-
* @author Mike Hamburg
|
|
1099
|
-
* @author Dan Boneh
|
|
1100
|
-
*/
|
|
1101
|
-
|
|
1102
|
-
const cipher = {};
|
|
1103
|
-
|
|
1104
|
-
/**
|
|
1105
|
-
* Schedule out an AES key for both encryption and decryption. This
|
|
1106
|
-
* is a low-level class. Use a cipher mode to do bulk encryption.
|
|
1107
|
-
*
|
|
1108
|
-
* @constructor
|
|
1109
|
-
* @param {Array} key The key as an array of 4, 6 or 8 words.
|
|
1110
|
-
*/
|
|
1111
|
-
cipher.aes = class {
|
|
1112
|
-
constructor(key) {
|
|
1113
|
-
/**
|
|
1114
|
-
* The expanded S-box and inverse S-box tables. These will be computed
|
|
1115
|
-
* on the client so that we don't have to send them down the wire.
|
|
1116
|
-
*
|
|
1117
|
-
* There are two tables, _tables[0] is for encryption and
|
|
1118
|
-
* _tables[1] is for decryption.
|
|
1119
|
-
*
|
|
1120
|
-
* The first 4 sub-tables are the expanded S-box with MixColumns. The
|
|
1121
|
-
* last (_tables[01][4]) is the S-box itself.
|
|
1122
|
-
*
|
|
1123
|
-
* @private
|
|
1124
|
-
*/
|
|
1125
|
-
const aes = this;
|
|
1126
|
-
aes._tables = [[[], [], [], [], []], [[], [], [], [], []]];
|
|
1127
|
-
|
|
1128
|
-
if (!aes._tables[0][0][0]) {
|
|
1129
|
-
aes._precompute();
|
|
1130
|
-
}
|
|
1131
|
-
|
|
1132
|
-
const sbox = aes._tables[0][4];
|
|
1133
|
-
const decTable = aes._tables[1];
|
|
1134
|
-
const keyLen = key.length;
|
|
1135
|
-
|
|
1136
|
-
let i, encKey, decKey, rcon = 1;
|
|
1137
|
-
|
|
1138
|
-
if (keyLen !== 4 && keyLen !== 6 && keyLen !== 8) {
|
|
1139
|
-
throw new Error("invalid aes key size");
|
|
1140
|
-
}
|
|
1141
|
-
|
|
1142
|
-
aes._key = [encKey = key.slice(0), decKey = []];
|
|
1143
|
-
|
|
1144
|
-
// schedule encryption keys
|
|
1145
|
-
for (i = keyLen; i < 4 * keyLen + 28; i++) {
|
|
1146
|
-
let tmp = encKey[i - 1];
|
|
1147
|
-
|
|
1148
|
-
// apply sbox
|
|
1149
|
-
if (i % keyLen === 0 || (keyLen === 8 && i % keyLen === 4)) {
|
|
1150
|
-
tmp = sbox[tmp >>> 24] << 24 ^ sbox[tmp >> 16 & 255] << 16 ^ sbox[tmp >> 8 & 255] << 8 ^ sbox[tmp & 255];
|
|
1151
|
-
|
|
1152
|
-
// shift rows and add rcon
|
|
1153
|
-
if (i % keyLen === 0) {
|
|
1154
|
-
tmp = tmp << 8 ^ tmp >>> 24 ^ rcon << 24;
|
|
1155
|
-
rcon = rcon << 1 ^ (rcon >> 7) * 283;
|
|
1156
|
-
}
|
|
1157
|
-
}
|
|
1158
|
-
|
|
1159
|
-
encKey[i] = encKey[i - keyLen] ^ tmp;
|
|
1160
|
-
}
|
|
846
|
+
return result;
|
|
847
|
+
}
|
|
1161
848
|
|
|
1162
|
-
|
|
1163
|
-
|
|
1164
|
-
|
|
1165
|
-
|
|
1166
|
-
|
|
1167
|
-
|
|
1168
|
-
|
|
1169
|
-
decTable[1][sbox[tmp >> 16 & 255]] ^
|
|
1170
|
-
decTable[2][sbox[tmp >> 8 & 255]] ^
|
|
1171
|
-
decTable[3][sbox[tmp & 255]];
|
|
1172
|
-
}
|
|
1173
|
-
}
|
|
1174
|
-
}
|
|
1175
|
-
// public
|
|
1176
|
-
/* Something like this might appear here eventually
|
|
1177
|
-
name: "AES",
|
|
1178
|
-
blockSize: 4,
|
|
1179
|
-
keySizes: [4,6,8],
|
|
1180
|
-
*/
|
|
1181
|
-
|
|
1182
|
-
/**
|
|
1183
|
-
* Encrypt an array of 4 big-endian words.
|
|
1184
|
-
* @param {Array} data The plaintext.
|
|
1185
|
-
* @return {Array} The ciphertext.
|
|
1186
|
-
*/
|
|
1187
|
-
encrypt(data) {
|
|
1188
|
-
return this._crypt(data, 0);
|
|
1189
|
-
}
|
|
1190
|
-
|
|
1191
|
-
/**
|
|
1192
|
-
* Decrypt an array of 4 big-endian words.
|
|
1193
|
-
* @param {Array} data The ciphertext.
|
|
1194
|
-
* @return {Array} The plaintext.
|
|
1195
|
-
*/
|
|
1196
|
-
decrypt(data) {
|
|
1197
|
-
return this._crypt(data, 1);
|
|
1198
|
-
}
|
|
1199
|
-
|
|
1200
|
-
/**
|
|
1201
|
-
* Expand the S-box tables.
|
|
1202
|
-
*
|
|
1203
|
-
* @private
|
|
1204
|
-
*/
|
|
1205
|
-
_precompute() {
|
|
1206
|
-
const encTable = this._tables[0];
|
|
1207
|
-
const decTable = this._tables[1];
|
|
1208
|
-
const sbox = encTable[4];
|
|
1209
|
-
const sboxInv = decTable[4];
|
|
1210
|
-
const d = [];
|
|
1211
|
-
const th = [];
|
|
1212
|
-
let xInv, x2, x4, x8;
|
|
1213
|
-
|
|
1214
|
-
// Compute double and third tables
|
|
1215
|
-
for (let i = 0; i < 256; i++) {
|
|
1216
|
-
th[(d[i] = i << 1 ^ (i >> 7) * 283) ^ i] = i;
|
|
1217
|
-
}
|
|
1218
|
-
|
|
1219
|
-
for (let x = xInv = 0; !sbox[x]; x ^= x2 || 1, xInv = th[xInv] || 1) {
|
|
1220
|
-
// Compute sbox
|
|
1221
|
-
let s = xInv ^ xInv << 1 ^ xInv << 2 ^ xInv << 3 ^ xInv << 4;
|
|
1222
|
-
s = s >> 8 ^ s & 255 ^ 99;
|
|
1223
|
-
sbox[x] = s;
|
|
1224
|
-
sboxInv[s] = x;
|
|
1225
|
-
|
|
1226
|
-
// Compute MixColumns
|
|
1227
|
-
x8 = d[x4 = d[x2 = d[x]]];
|
|
1228
|
-
let tDec = x8 * 0x1010101 ^ x4 * 0x10001 ^ x2 * 0x101 ^ x * 0x1010100;
|
|
1229
|
-
let tEnc = d[s] * 0x101 ^ s * 0x1010100;
|
|
1230
|
-
|
|
1231
|
-
for (let i = 0; i < 4; i++) {
|
|
1232
|
-
encTable[i][x] = tEnc = tEnc << 24 ^ tEnc >>> 8;
|
|
1233
|
-
decTable[i][s] = tDec = tDec << 24 ^ tDec >>> 8;
|
|
1234
|
-
}
|
|
1235
|
-
}
|
|
1236
|
-
|
|
1237
|
-
// Compactify. Considerable speedup on Firefox.
|
|
1238
|
-
for (let i = 0; i < 5; i++) {
|
|
1239
|
-
encTable[i] = encTable[i].slice(0);
|
|
1240
|
-
decTable[i] = decTable[i].slice(0);
|
|
1241
|
-
}
|
|
1242
|
-
}
|
|
1243
|
-
|
|
1244
|
-
/**
|
|
1245
|
-
* Encryption and decryption core.
|
|
1246
|
-
* @param {Array} input Four words to be encrypted or decrypted.
|
|
1247
|
-
* @param dir The direction, 0 for encrypt and 1 for decrypt.
|
|
1248
|
-
* @return {Array} The four encrypted or decrypted words.
|
|
1249
|
-
* @private
|
|
1250
|
-
*/
|
|
1251
|
-
_crypt(input, dir) {
|
|
1252
|
-
if (input.length !== 4) {
|
|
1253
|
-
throw new Error("invalid aes block size");
|
|
1254
|
-
}
|
|
1255
|
-
|
|
1256
|
-
const key = this._key[dir];
|
|
1257
|
-
|
|
1258
|
-
const nInnerRounds = key.length / 4 - 2;
|
|
1259
|
-
const out = [0, 0, 0, 0];
|
|
1260
|
-
const table = this._tables[dir];
|
|
1261
|
-
|
|
1262
|
-
// load up the tables
|
|
1263
|
-
const t0 = table[0];
|
|
1264
|
-
const t1 = table[1];
|
|
1265
|
-
const t2 = table[2];
|
|
1266
|
-
const t3 = table[3];
|
|
1267
|
-
const sbox = table[4];
|
|
1268
|
-
|
|
1269
|
-
// state variables a,b,c,d are loaded with pre-whitened data
|
|
1270
|
-
let a = input[0] ^ key[0];
|
|
1271
|
-
let b = input[dir ? 3 : 1] ^ key[1];
|
|
1272
|
-
let c = input[2] ^ key[2];
|
|
1273
|
-
let d = input[dir ? 1 : 3] ^ key[3];
|
|
1274
|
-
let kIndex = 4;
|
|
1275
|
-
let a2, b2, c2;
|
|
1276
|
-
|
|
1277
|
-
// Inner rounds. Cribbed from OpenSSL.
|
|
1278
|
-
for (let i = 0; i < nInnerRounds; i++) {
|
|
1279
|
-
a2 = t0[a >>> 24] ^ t1[b >> 16 & 255] ^ t2[c >> 8 & 255] ^ t3[d & 255] ^ key[kIndex];
|
|
1280
|
-
b2 = t0[b >>> 24] ^ t1[c >> 16 & 255] ^ t2[d >> 8 & 255] ^ t3[a & 255] ^ key[kIndex + 1];
|
|
1281
|
-
c2 = t0[c >>> 24] ^ t1[d >> 16 & 255] ^ t2[a >> 8 & 255] ^ t3[b & 255] ^ key[kIndex + 2];
|
|
1282
|
-
d = t0[d >>> 24] ^ t1[a >> 16 & 255] ^ t2[b >> 8 & 255] ^ t3[c & 255] ^ key[kIndex + 3];
|
|
1283
|
-
kIndex += 4;
|
|
1284
|
-
a = a2; b = b2; c = c2;
|
|
1285
|
-
}
|
|
1286
|
-
|
|
1287
|
-
// Last round.
|
|
1288
|
-
for (let i = 0; i < 4; i++) {
|
|
1289
|
-
out[dir ? 3 & -i : i] =
|
|
1290
|
-
sbox[a >>> 24] << 24 ^
|
|
1291
|
-
sbox[b >> 16 & 255] << 16 ^
|
|
1292
|
-
sbox[c >> 8 & 255] << 8 ^
|
|
1293
|
-
sbox[d & 255] ^
|
|
1294
|
-
key[kIndex++];
|
|
1295
|
-
a2 = a; a = b; b = c; c = d; d = a2;
|
|
1296
|
-
}
|
|
1297
|
-
|
|
1298
|
-
return out;
|
|
849
|
+
function createHmac(key) {
|
|
850
|
+
const sha1 = createSha1();
|
|
851
|
+
const innerKey = new Uint8Array(SHA1_BLOCK_LENGTH);
|
|
852
|
+
const outerKey = new Uint8Array(SHA1_BLOCK_LENGTH);
|
|
853
|
+
if (key.length > SHA1_BLOCK_LENGTH) {
|
|
854
|
+
sha1.update(key, 0, key.length);
|
|
855
|
+
key = sha1.digest();
|
|
1299
856
|
}
|
|
1300
|
-
|
|
1301
|
-
|
|
1302
|
-
|
|
1303
|
-
|
|
1304
|
-
* Special thanks to Roy Nicholson for pointing out a bug in our
|
|
1305
|
-
* implementation.
|
|
1306
|
-
*
|
|
1307
|
-
* @author Emily Stark
|
|
1308
|
-
* @author Mike Hamburg
|
|
1309
|
-
* @author Dan Boneh
|
|
1310
|
-
*/
|
|
1311
|
-
|
|
1312
|
-
/** Brian Gladman's CTR Mode.
|
|
1313
|
-
* @constructor
|
|
1314
|
-
* @param {Object} _prf The aes instance to generate key.
|
|
1315
|
-
* @param {bitArray} _iv The iv for ctr mode, it must be 128 bits.
|
|
1316
|
-
*/
|
|
1317
|
-
|
|
1318
|
-
const mode = {};
|
|
1319
|
-
|
|
1320
|
-
/**
|
|
1321
|
-
* Brian Gladman's CTR Mode.
|
|
1322
|
-
* @namespace
|
|
1323
|
-
*/
|
|
1324
|
-
mode.ctrGladman = class {
|
|
1325
|
-
constructor(prf, iv) {
|
|
1326
|
-
this._prf = prf;
|
|
1327
|
-
this._initIv = iv;
|
|
1328
|
-
this._iv = iv;
|
|
857
|
+
for (let indexByte = 0; indexByte < SHA1_BLOCK_LENGTH; indexByte++) {
|
|
858
|
+
const keyByte = indexByte < key.length ? key[indexByte] : 0;
|
|
859
|
+
innerKey[indexByte] = keyByte ^ HMAC_INNER_PADDING;
|
|
860
|
+
outerKey[indexByte] = keyByte ^ HMAC_OUTER_PADDING;
|
|
1329
861
|
}
|
|
862
|
+
sha1.update(innerKey, 0, SHA1_BLOCK_LENGTH);
|
|
863
|
+
return {
|
|
864
|
+
update(data, offset, length) {
|
|
865
|
+
sha1.update(data, offset, length);
|
|
866
|
+
},
|
|
867
|
+
digest() {
|
|
868
|
+
const innerDigest = sha1.digest();
|
|
869
|
+
sha1.update(outerKey, 0, SHA1_BLOCK_LENGTH);
|
|
870
|
+
sha1.update(innerDigest, 0, SHA1_DIGEST_LENGTH);
|
|
871
|
+
const result = sha1.digest();
|
|
872
|
+
sha1.update(innerKey, 0, SHA1_BLOCK_LENGTH);
|
|
873
|
+
return result;
|
|
874
|
+
}
|
|
875
|
+
};
|
|
876
|
+
}
|
|
1330
877
|
|
|
1331
|
-
|
|
1332
|
-
|
|
1333
|
-
|
|
878
|
+
function createSha1() {
|
|
879
|
+
const state = new Int32Array(SHA1_INITIAL_STATE);
|
|
880
|
+
const schedule = new Int32Array(SHA1_SCHEDULE_LENGTH);
|
|
881
|
+
const block = new Uint8Array(SHA1_BLOCK_LENGTH);
|
|
882
|
+
const blockView = new DataView(block.buffer);
|
|
883
|
+
const lengthBytes = new Uint8Array(8);
|
|
884
|
+
let blockLength = 0;
|
|
885
|
+
let totalLength = 0;
|
|
886
|
+
return {
|
|
887
|
+
update,
|
|
888
|
+
digest
|
|
889
|
+
};
|
|
1334
890
|
|
|
1335
|
-
|
|
1336
|
-
|
|
1337
|
-
|
|
1338
|
-
|
|
1339
|
-
|
|
891
|
+
function update(data, offset, length) {
|
|
892
|
+
const end = offset + length;
|
|
893
|
+
totalLength += length;
|
|
894
|
+
if (blockLength) {
|
|
895
|
+
while (offset < end && blockLength < SHA1_BLOCK_LENGTH) {
|
|
896
|
+
block[blockLength++] = data[offset++];
|
|
897
|
+
}
|
|
898
|
+
if (blockLength == SHA1_BLOCK_LENGTH) {
|
|
899
|
+
compress(blockView, 0);
|
|
900
|
+
blockLength = 0;
|
|
901
|
+
}
|
|
902
|
+
}
|
|
903
|
+
if (offset + SHA1_BLOCK_LENGTH <= end) {
|
|
904
|
+
const view = new DataView(data.buffer, data.byteOffset, data.byteLength);
|
|
905
|
+
for (; offset + SHA1_BLOCK_LENGTH <= end; offset += SHA1_BLOCK_LENGTH) {
|
|
906
|
+
compress(view, offset);
|
|
907
|
+
}
|
|
908
|
+
}
|
|
909
|
+
while (offset < end) {
|
|
910
|
+
block[blockLength++] = data[offset++];
|
|
911
|
+
}
|
|
912
|
+
}
|
|
913
|
+
|
|
914
|
+
function digest() {
|
|
915
|
+
const bits = totalLength * 8;
|
|
916
|
+
const high = Math.floor(bits / 0x100000000);
|
|
917
|
+
const low = bits >>> 0;
|
|
918
|
+
update(SHA1_PADDING, 0, 1);
|
|
919
|
+
while (blockLength != SHA1_LENGTH_OFFSET) {
|
|
920
|
+
update(SHA1_ZERO, 0, 1);
|
|
921
|
+
}
|
|
922
|
+
lengthBytes[0] = high >>> 24;
|
|
923
|
+
lengthBytes[1] = high >>> 16;
|
|
924
|
+
lengthBytes[2] = high >>> 8;
|
|
925
|
+
lengthBytes[3] = high;
|
|
926
|
+
lengthBytes[4] = low >>> 24;
|
|
927
|
+
lengthBytes[5] = low >>> 16;
|
|
928
|
+
lengthBytes[6] = low >>> 8;
|
|
929
|
+
lengthBytes[7] = low;
|
|
930
|
+
update(lengthBytes, 0, 8);
|
|
931
|
+
const result = new Uint8Array(SHA1_DIGEST_LENGTH);
|
|
932
|
+
const resultView = new DataView(result.buffer);
|
|
933
|
+
for (let indexWord = 0; indexWord < state.length; indexWord++) {
|
|
934
|
+
resultView.setInt32(4 * indexWord, state[indexWord]);
|
|
935
|
+
}
|
|
936
|
+
state.set(SHA1_INITIAL_STATE);
|
|
937
|
+
blockLength = 0;
|
|
938
|
+
totalLength = 0;
|
|
939
|
+
return result;
|
|
1340
940
|
}
|
|
1341
941
|
|
|
1342
|
-
|
|
1343
|
-
|
|
1344
|
-
|
|
1345
|
-
let b2 = (word >> 8) & 0xff;
|
|
1346
|
-
let b3 = word & 0xff;
|
|
1347
|
-
|
|
1348
|
-
if (b1 === 0xff) { // overflow b1
|
|
1349
|
-
b1 = 0;
|
|
1350
|
-
if (b2 === 0xff) {
|
|
1351
|
-
b2 = 0;
|
|
1352
|
-
if (b3 === 0xff) {
|
|
1353
|
-
b3 = 0;
|
|
1354
|
-
} else {
|
|
1355
|
-
++b3;
|
|
1356
|
-
}
|
|
1357
|
-
} else {
|
|
1358
|
-
++b2;
|
|
1359
|
-
}
|
|
1360
|
-
} else {
|
|
1361
|
-
++b1;
|
|
1362
|
-
}
|
|
1363
|
-
|
|
1364
|
-
word = 0;
|
|
1365
|
-
word += (b1 << 16);
|
|
1366
|
-
word += (b2 << 8);
|
|
1367
|
-
word += b3;
|
|
1368
|
-
} else {
|
|
1369
|
-
word += (0x01 << 24);
|
|
942
|
+
function compress(view, offset) {
|
|
943
|
+
for (let index = 0; index < 16; index++) {
|
|
944
|
+
schedule[index] = view.getInt32(offset + 4 * index);
|
|
1370
945
|
}
|
|
1371
|
-
|
|
1372
|
-
|
|
1373
|
-
|
|
1374
|
-
incCounter(counter) {
|
|
1375
|
-
if ((counter[0] = this.incWord(counter[0])) === 0) {
|
|
1376
|
-
// encr_data in fileenc.c from Dr Brian Gladman's counts only with DWORD j < 8
|
|
1377
|
-
counter[1] = this.incWord(counter[1]);
|
|
946
|
+
for (let index = 16; index < SHA1_SCHEDULE_LENGTH; index++) {
|
|
947
|
+
const word = schedule[index - 3] ^ schedule[index - 8] ^ schedule[index - 14] ^ schedule[index - 16];
|
|
948
|
+
schedule[index] = (word << 1) | (word >>> 31);
|
|
1378
949
|
}
|
|
1379
|
-
|
|
1380
|
-
|
|
1381
|
-
|
|
1382
|
-
let
|
|
1383
|
-
|
|
1384
|
-
|
|
950
|
+
let a = state[0];
|
|
951
|
+
let b = state[1];
|
|
952
|
+
let c = state[2];
|
|
953
|
+
let d = state[3];
|
|
954
|
+
let e = state[4];
|
|
955
|
+
let t;
|
|
956
|
+
for (let index = 0; index < 20; index++) {
|
|
957
|
+
t = (((a << 5) | (a >>> 27)) + ((b & c) | (~b & d)) + e + 0x5A827999 + schedule[index]) | 0;
|
|
958
|
+
e = d;
|
|
959
|
+
d = c;
|
|
960
|
+
c = (b << 30) | (b >>> 2);
|
|
961
|
+
b = a;
|
|
962
|
+
a = t;
|
|
963
|
+
}
|
|
964
|
+
for (let index = 20; index < 40; index++) {
|
|
965
|
+
t = (((a << 5) | (a >>> 27)) + (b ^ c ^ d) + e + 0x6ED9EBA1 + schedule[index]) | 0;
|
|
966
|
+
e = d;
|
|
967
|
+
d = c;
|
|
968
|
+
c = (b << 30) | (b >>> 2);
|
|
969
|
+
b = a;
|
|
970
|
+
a = t;
|
|
971
|
+
}
|
|
972
|
+
for (let index = 40; index < 60; index++) {
|
|
973
|
+
t = (((a << 5) | (a >>> 27)) + ((b & c) | (b & d) | (c & d)) + e + 0x8F1BBCDC + schedule[index]) | 0;
|
|
974
|
+
e = d;
|
|
975
|
+
d = c;
|
|
976
|
+
c = (b << 30) | (b >>> 2);
|
|
977
|
+
b = a;
|
|
978
|
+
a = t;
|
|
1385
979
|
}
|
|
1386
|
-
|
|
1387
|
-
|
|
1388
|
-
|
|
1389
|
-
|
|
1390
|
-
|
|
1391
|
-
|
|
1392
|
-
|
|
1393
|
-
data[i + 3] ^= e[3];
|
|
980
|
+
for (let index = 60; index < SHA1_SCHEDULE_LENGTH; index++) {
|
|
981
|
+
t = (((a << 5) | (a >>> 27)) + (b ^ c ^ d) + e + 0xCA62C1D6 + schedule[index]) | 0;
|
|
982
|
+
e = d;
|
|
983
|
+
d = c;
|
|
984
|
+
c = (b << 30) | (b >>> 2);
|
|
985
|
+
b = a;
|
|
986
|
+
a = t;
|
|
1394
987
|
}
|
|
1395
|
-
|
|
988
|
+
state[0] = (state[0] + a) | 0;
|
|
989
|
+
state[1] = (state[1] + b) | 0;
|
|
990
|
+
state[2] = (state[2] + c) | 0;
|
|
991
|
+
state[3] = (state[3] + d) | 0;
|
|
992
|
+
state[4] = (state[4] + e) | 0;
|
|
1396
993
|
}
|
|
1397
|
-
}
|
|
994
|
+
}
|
|
1398
995
|
|
|
1399
|
-
|
|
1400
|
-
|
|
1401
|
-
|
|
1402
|
-
|
|
1403
|
-
|
|
1404
|
-
|
|
1405
|
-
|
|
1406
|
-
|
|
1407
|
-
|
|
1408
|
-
|
|
1409
|
-
|
|
1410
|
-
const arrayBuffer = new ArrayBuffer(byteLength);
|
|
1411
|
-
const out = new DataView(arrayBuffer);
|
|
1412
|
-
let outLength = 0;
|
|
1413
|
-
const b = bitArray;
|
|
1414
|
-
salt = codec.bytes.toBits(salt);
|
|
1415
|
-
for (k = 1; outLength < (byteLength || 1); k++) {
|
|
1416
|
-
u = ui = prf.encrypt(b.concat(salt, [k]));
|
|
1417
|
-
for (i = 1; i < count; i++) {
|
|
1418
|
-
ui = prf.encrypt(ui);
|
|
1419
|
-
for (j = 0; j < ui.length; j++) {
|
|
1420
|
-
u[j] ^= ui[j];
|
|
1421
|
-
}
|
|
1422
|
-
}
|
|
1423
|
-
for (i = 0; outLength < (byteLength || 1) && i < u.length; i++) {
|
|
1424
|
-
out.setInt32(outLength, u[i]);
|
|
1425
|
-
outLength += 4;
|
|
996
|
+
function initTables() {
|
|
997
|
+
if (!tablesInitialized) {
|
|
998
|
+
let p = 1;
|
|
999
|
+
let q = 1;
|
|
1000
|
+
do {
|
|
1001
|
+
p = (p ^ (p << 1) ^ ((p & 0x80) ? 0x1b : 0)) & 255;
|
|
1002
|
+
q = (q ^ (q << 1)) & 255;
|
|
1003
|
+
q = (q ^ (q << 2)) & 255;
|
|
1004
|
+
q = (q ^ (q << 4)) & 255;
|
|
1005
|
+
if (q & 0x80) {
|
|
1006
|
+
q ^= 0x09;
|
|
1426
1007
|
}
|
|
1008
|
+
S_BOX[p] = (q ^ ((q << 1) | (q >> 7)) ^ ((q << 2) | (q >> 6)) ^ ((q << 3) | (q >> 5)) ^ ((q << 4) | (q >> 4)) ^ 0x63) & 255;
|
|
1009
|
+
} while (p != 1);
|
|
1010
|
+
S_BOX[0] = 0x63;
|
|
1011
|
+
for (let index = 0; index < 256; index++) {
|
|
1012
|
+
const s = S_BOX[index];
|
|
1013
|
+
const s2 = multiplyByTwo(s);
|
|
1014
|
+
const t = (s2 << 24) | (s << 16) | (s << 8) | (s2 ^ s);
|
|
1015
|
+
T0[index] = t;
|
|
1016
|
+
T1[index] = (t >>> 8) | (t << 24);
|
|
1017
|
+
T2[index] = (t >>> 16) | (t << 16);
|
|
1018
|
+
T3[index] = (t >>> 24) | (t << 8);
|
|
1427
1019
|
}
|
|
1428
|
-
|
|
1020
|
+
tablesInitialized = true;
|
|
1429
1021
|
}
|
|
1430
|
-
}
|
|
1431
|
-
|
|
1432
|
-
/** @fileOverview HMAC implementation.
|
|
1433
|
-
*
|
|
1434
|
-
* @author Emily Stark
|
|
1435
|
-
* @author Mike Hamburg
|
|
1436
|
-
* @author Dan Boneh
|
|
1437
|
-
*/
|
|
1438
|
-
|
|
1439
|
-
/** HMAC with the specified hash function.
|
|
1440
|
-
* @constructor
|
|
1441
|
-
* @param {bitArray} key the key for HMAC.
|
|
1442
|
-
* @param {Object} [Hash=hash.sha1] The hash function to use.
|
|
1443
|
-
*/
|
|
1444
|
-
misc.hmacSha1 = class {
|
|
1445
|
-
|
|
1446
|
-
constructor(key) {
|
|
1447
|
-
const hmac = this;
|
|
1448
|
-
const Hash = hmac._hash = hash.sha1;
|
|
1449
|
-
const exKey = [[], []];
|
|
1450
|
-
hmac._baseHash = [new Hash(), new Hash()];
|
|
1451
|
-
const bs = hmac._baseHash[0].blockSize / 32;
|
|
1452
|
-
|
|
1453
|
-
if (key.length > bs) {
|
|
1454
|
-
key = new Hash().update(key).finalize();
|
|
1455
|
-
}
|
|
1456
|
-
|
|
1457
|
-
for (let i = 0; i < bs; i++) {
|
|
1458
|
-
exKey[0][i] = key[i] ^ 0x36363636;
|
|
1459
|
-
exKey[1][i] = key[i] ^ 0x5C5C5C5C;
|
|
1460
|
-
}
|
|
1022
|
+
}
|
|
1461
1023
|
|
|
1462
|
-
|
|
1463
|
-
|
|
1464
|
-
|
|
1024
|
+
function expandKey(key, roundKeys) {
|
|
1025
|
+
const keyWords = key.length >> 2;
|
|
1026
|
+
const rounds = keyWords + 6;
|
|
1027
|
+
const total = 4 * (rounds + 1);
|
|
1028
|
+
let roundConstant = 1;
|
|
1029
|
+
for (let index = 0; index < keyWords; index++) {
|
|
1030
|
+
roundKeys[index] = (key[4 * index] << 24) | (key[4 * index + 1] << 16) | (key[4 * index + 2] << 8) | key[4 * index + 3];
|
|
1465
1031
|
}
|
|
1466
|
-
|
|
1467
|
-
|
|
1468
|
-
|
|
1469
|
-
|
|
1470
|
-
|
|
1471
|
-
|
|
1472
|
-
|
|
1473
|
-
|
|
1474
|
-
|
|
1475
|
-
hmac._resultHash.update(data);
|
|
1032
|
+
for (let index = keyWords; index < total; index++) {
|
|
1033
|
+
let word = roundKeys[index - 1];
|
|
1034
|
+
if (index % keyWords == 0) {
|
|
1035
|
+
word = substituteWord((word << 8) | (word >>> 24)) ^ (roundConstant << 24);
|
|
1036
|
+
roundConstant = multiplyByTwo(roundConstant);
|
|
1037
|
+
} else if (keyWords > 6 && index % keyWords == 4) {
|
|
1038
|
+
word = substituteWord(word);
|
|
1039
|
+
}
|
|
1040
|
+
roundKeys[index] = roundKeys[index - keyWords] ^ word;
|
|
1476
1041
|
}
|
|
1042
|
+
return rounds;
|
|
1043
|
+
}
|
|
1477
1044
|
|
|
1478
|
-
|
|
1479
|
-
|
|
1480
|
-
|
|
1481
|
-
const result = new (hmac._hash)(hmac._baseHash[1]).update(w).finalize();
|
|
1482
|
-
|
|
1483
|
-
hmac.reset();
|
|
1484
|
-
|
|
1485
|
-
return result;
|
|
1486
|
-
}
|
|
1045
|
+
function substituteWord(word) {
|
|
1046
|
+
return (S_BOX[word >>> 24] << 24) | (S_BOX[(word >>> 16) & 255] << 16) | (S_BOX[(word >>> 8) & 255] << 8) | S_BOX[word & 255];
|
|
1047
|
+
}
|
|
1487
1048
|
|
|
1488
|
-
|
|
1489
|
-
|
|
1490
|
-
|
|
1491
|
-
return this.digest(data);
|
|
1492
|
-
} else {
|
|
1493
|
-
throw new Error("encrypt on already updated hmac called!");
|
|
1494
|
-
}
|
|
1495
|
-
}
|
|
1496
|
-
};
|
|
1049
|
+
function multiplyByTwo(value) {
|
|
1050
|
+
return ((value << 1) ^ ((value >> 7) * 0x1b)) & 255;
|
|
1051
|
+
}
|
|
1497
1052
|
|
|
1498
1053
|
/*
|
|
1499
1054
|
Copyright (c) 2022 Gildas Lormeau. All rights reserved.
|
|
@@ -1548,8 +1103,8 @@
|
|
|
1548
1103
|
1. Redistributions of source code must retain the above copyright notice,
|
|
1549
1104
|
this list of conditions and the following disclaimer.
|
|
1550
1105
|
|
|
1551
|
-
2. Redistributions in binary form must reproduce the above copyright
|
|
1552
|
-
notice, this list of conditions and the following disclaimer in
|
|
1106
|
+
2. Redistributions in binary form must reproduce the above copyright
|
|
1107
|
+
notice, this list of conditions and the following disclaimer in
|
|
1553
1108
|
the documentation and/or other materials provided with the distribution.
|
|
1554
1109
|
|
|
1555
1110
|
3. The names of the authors may not be used to endorse or promote products
|
|
@@ -1573,24 +1128,21 @@
|
|
|
1573
1128
|
const PBKDF2_ALGORITHM = { name: "PBKDF2" };
|
|
1574
1129
|
const HASH_ALGORITHM = { name: "HMAC" };
|
|
1575
1130
|
const HASH_FUNCTION = "SHA-1";
|
|
1131
|
+
const PBKDF2_ITERATIONS = 1000;
|
|
1576
1132
|
const BASE_KEY_ALGORITHM = Object.assign({ hash: HASH_ALGORITHM }, PBKDF2_ALGORITHM);
|
|
1577
|
-
const DERIVED_BITS_ALGORITHM = Object.assign({ iterations:
|
|
1133
|
+
const DERIVED_BITS_ALGORITHM = Object.assign({ iterations: PBKDF2_ITERATIONS, hash: { name: HASH_FUNCTION } }, PBKDF2_ALGORITHM);
|
|
1578
1134
|
const DERIVED_BITS_USAGE = ["deriveBits"];
|
|
1579
1135
|
const SALT_LENGTH = [8, 12, 16];
|
|
1580
1136
|
const KEY_LENGTH = [16, 24, 32];
|
|
1581
1137
|
const AUTHENTICATION_CODE_LENGTH = 10;
|
|
1582
|
-
const
|
|
1138
|
+
const PASSWORD_VERIFICATION_LENGTH = 2;
|
|
1583
1139
|
// deno-lint-ignore valid-typeof
|
|
1584
1140
|
const CRYPTO_API_SUPPORTED = typeof crypto != UNDEFINED_TYPE;
|
|
1585
1141
|
const subtle = CRYPTO_API_SUPPORTED && crypto.subtle;
|
|
1586
1142
|
const SUBTLE_API_SUPPORTED = CRYPTO_API_SUPPORTED && typeof subtle != UNDEFINED_TYPE;
|
|
1587
|
-
const codecBytes = codec.bytes;
|
|
1588
|
-
const Aes = cipher.aes;
|
|
1589
|
-
const CtrGladman = mode.ctrGladman;
|
|
1590
|
-
const HmacSha1 = misc.hmacSha1;
|
|
1591
1143
|
|
|
1592
|
-
let
|
|
1593
|
-
let
|
|
1144
|
+
let DERIVE_BITS_SUPPORTED = SUBTLE_API_SUPPORTED && typeof subtle.importKey == FUNCTION_TYPE && typeof subtle.deriveBits == FUNCTION_TYPE;
|
|
1145
|
+
let createEngine = createEngine$1;
|
|
1594
1146
|
|
|
1595
1147
|
class AESDecryptionStream extends TransformStream {
|
|
1596
1148
|
|
|
@@ -1608,9 +1160,10 @@
|
|
|
1608
1160
|
ready
|
|
1609
1161
|
} = aesCrypto;
|
|
1610
1162
|
if (password) {
|
|
1611
|
-
await createDecryptionKeys(aesCrypto, strength, password, subarray(chunk, 0, SALT_LENGTH[strength] +
|
|
1612
|
-
chunk = subarray(chunk, SALT_LENGTH[strength] +
|
|
1163
|
+
await createDecryptionKeys(aesCrypto, strength, password, subarray(chunk, 0, SALT_LENGTH[strength] + PASSWORD_VERIFICATION_LENGTH));
|
|
1164
|
+
chunk = subarray(chunk, SALT_LENGTH[strength] + PASSWORD_VERIFICATION_LENGTH);
|
|
1613
1165
|
if (checkPasswordOnly) {
|
|
1166
|
+
disposeEngine(aesCrypto);
|
|
1614
1167
|
controller.error(new Error(ERR_ABORT_CHECK_PASSWORD));
|
|
1615
1168
|
} else {
|
|
1616
1169
|
resolveReady();
|
|
@@ -1623,23 +1176,16 @@
|
|
|
1623
1176
|
},
|
|
1624
1177
|
async flush(controller) {
|
|
1625
1178
|
const {
|
|
1626
|
-
|
|
1627
|
-
hmac,
|
|
1179
|
+
engine,
|
|
1628
1180
|
pendingInput,
|
|
1629
1181
|
ready
|
|
1630
1182
|
} = this;
|
|
1631
|
-
if (
|
|
1183
|
+
if (engine) {
|
|
1632
1184
|
await ready;
|
|
1633
|
-
const chunkToDecrypt = subarray(pendingInput, 0, pendingInput.length - AUTHENTICATION_CODE_LENGTH);
|
|
1634
1185
|
const originalAuthenticationCode = subarray(pendingInput, pendingInput.length - AUTHENTICATION_CODE_LENGTH);
|
|
1635
|
-
|
|
1636
|
-
|
|
1637
|
-
|
|
1638
|
-
hmac.update(encryptedChunk);
|
|
1639
|
-
const decryptedChunk = ctr.update(encryptedChunk);
|
|
1640
|
-
decryptedChunkArray = fromBits(codecBytes, decryptedChunk);
|
|
1641
|
-
}
|
|
1642
|
-
const authenticationCode = subarray(fromBits(codecBytes, hmac.digest()), 0, AUTHENTICATION_CODE_LENGTH);
|
|
1186
|
+
const decryptedChunkArray = new Uint8Array(subarray(pendingInput, 0, pendingInput.length - AUTHENTICATION_CODE_LENGTH));
|
|
1187
|
+
engine.process(decryptedChunkArray, true);
|
|
1188
|
+
const authenticationCode = engine.digest();
|
|
1643
1189
|
let invalidAuthenticationCode = pendingInput.length < AUTHENTICATION_CODE_LENGTH ? 1 : 0;
|
|
1644
1190
|
for (let indexByte = 0; indexByte < AUTHENTICATION_CODE_LENGTH; indexByte++) {
|
|
1645
1191
|
invalidAuthenticationCode |= authenticationCode[indexByte] ^ originalAuthenticationCode[indexByte];
|
|
@@ -1649,6 +1195,9 @@
|
|
|
1649
1195
|
}
|
|
1650
1196
|
controller.enqueue(decryptedChunkArray);
|
|
1651
1197
|
}
|
|
1198
|
+
},
|
|
1199
|
+
cancel() {
|
|
1200
|
+
disposeEngine(this);
|
|
1652
1201
|
}
|
|
1653
1202
|
});
|
|
1654
1203
|
}
|
|
@@ -1678,26 +1227,24 @@
|
|
|
1678
1227
|
}
|
|
1679
1228
|
const output = new Uint8Array(preamble.length + chunk.length - (chunk.length % BLOCK_LENGTH));
|
|
1680
1229
|
output.set(preamble, 0);
|
|
1681
|
-
controller.enqueue(append(aesCrypto, chunk, output, preamble.length, 0));
|
|
1230
|
+
controller.enqueue(append(aesCrypto, chunk, output, preamble.length, 0, false));
|
|
1682
1231
|
},
|
|
1683
1232
|
async flush(controller) {
|
|
1684
1233
|
const {
|
|
1685
|
-
|
|
1686
|
-
hmac,
|
|
1234
|
+
engine,
|
|
1687
1235
|
pendingInput,
|
|
1688
1236
|
ready
|
|
1689
1237
|
} = this;
|
|
1690
|
-
if (
|
|
1238
|
+
if (engine) {
|
|
1691
1239
|
await ready;
|
|
1692
|
-
|
|
1693
|
-
|
|
1694
|
-
|
|
1695
|
-
hmac.update(encryptedChunk);
|
|
1696
|
-
encryptedChunkArray = fromBits(codecBytes, encryptedChunk);
|
|
1697
|
-
}
|
|
1698
|
-
const authenticationCode = fromBits(codecBytes, hmac.digest()).slice(0, AUTHENTICATION_CODE_LENGTH);
|
|
1240
|
+
const encryptedChunkArray = new Uint8Array(pendingInput);
|
|
1241
|
+
engine.process(encryptedChunkArray, false);
|
|
1242
|
+
const authenticationCode = subarray(engine.digest(), 0, AUTHENTICATION_CODE_LENGTH);
|
|
1699
1243
|
controller.enqueue(concat(encryptedChunkArray, authenticationCode));
|
|
1700
1244
|
}
|
|
1245
|
+
},
|
|
1246
|
+
cancel() {
|
|
1247
|
+
disposeEngine(this);
|
|
1701
1248
|
}
|
|
1702
1249
|
});
|
|
1703
1250
|
}
|
|
@@ -1712,30 +1259,23 @@
|
|
|
1712
1259
|
});
|
|
1713
1260
|
}
|
|
1714
1261
|
|
|
1715
|
-
function append(aesCrypto, input, output, paddingStart, paddingEnd,
|
|
1262
|
+
function append(aesCrypto, input, output, paddingStart, paddingEnd, decrypt) {
|
|
1716
1263
|
const {
|
|
1717
|
-
|
|
1718
|
-
hmac,
|
|
1264
|
+
engine,
|
|
1719
1265
|
pendingInput
|
|
1720
1266
|
} = aesCrypto;
|
|
1721
1267
|
if (pendingInput.length) {
|
|
1722
1268
|
input = concat(pendingInput, input);
|
|
1723
1269
|
}
|
|
1724
1270
|
const inputLength = input.length - paddingEnd;
|
|
1725
|
-
|
|
1726
|
-
|
|
1727
|
-
|
|
1728
|
-
const
|
|
1729
|
-
|
|
1730
|
-
|
|
1731
|
-
|
|
1732
|
-
|
|
1733
|
-
if (!verifyAuthenticationCode) {
|
|
1734
|
-
hmac.update(outputChunk);
|
|
1735
|
-
}
|
|
1736
|
-
output.set(fromBits(codecBytes, outputChunk), offset + paddingStart);
|
|
1737
|
-
}
|
|
1738
|
-
aesCrypto.pendingInput = subarray(input, offset);
|
|
1271
|
+
const alignedLength = inputLength - (inputLength % BLOCK_LENGTH);
|
|
1272
|
+
output = expand(output, paddingStart + alignedLength);
|
|
1273
|
+
if (alignedLength) {
|
|
1274
|
+
const chunk = subarray(output, paddingStart, paddingStart + alignedLength);
|
|
1275
|
+
chunk.set(subarray(input, 0, alignedLength));
|
|
1276
|
+
engine.process(chunk, decrypt);
|
|
1277
|
+
}
|
|
1278
|
+
aesCrypto.pendingInput = subarray(input, alignedLength);
|
|
1739
1279
|
return output;
|
|
1740
1280
|
}
|
|
1741
1281
|
|
|
@@ -1743,10 +1283,17 @@
|
|
|
1743
1283
|
const passwordVerificationKey = await createKeys$1(decrypt, strength, password, subarray(preamble, 0, SALT_LENGTH[strength]));
|
|
1744
1284
|
const passwordVerification = subarray(preamble, SALT_LENGTH[strength]);
|
|
1745
1285
|
if (passwordVerificationKey[0] != passwordVerification[0] || passwordVerificationKey[1] != passwordVerification[1]) {
|
|
1286
|
+
disposeEngine(decrypt);
|
|
1746
1287
|
throw new Error(ERR_INVALID_PASSWORD);
|
|
1747
1288
|
}
|
|
1748
1289
|
}
|
|
1749
1290
|
|
|
1291
|
+
function disposeEngine({ engine }) {
|
|
1292
|
+
if (engine && engine.dispose) {
|
|
1293
|
+
engine.dispose();
|
|
1294
|
+
}
|
|
1295
|
+
}
|
|
1296
|
+
|
|
1750
1297
|
async function createEncryptionKeys(encrypt, strength, password) {
|
|
1751
1298
|
const salt = getRandomValues(new Uint8Array(SALT_LENGTH[strength]));
|
|
1752
1299
|
const passwordVerification = await createKeys$1(encrypt, strength, password, salt);
|
|
@@ -1755,48 +1302,22 @@
|
|
|
1755
1302
|
|
|
1756
1303
|
async function createKeys$1(aesCrypto, strength, password, salt) {
|
|
1757
1304
|
aesCrypto.password = null;
|
|
1758
|
-
const
|
|
1759
|
-
const
|
|
1760
|
-
|
|
1761
|
-
|
|
1762
|
-
const authentication = toBits(codecBytes, subarray(compositeKey, KEY_LENGTH[strength], KEY_LENGTH[strength] * 2));
|
|
1763
|
-
const passwordVerification = subarray(compositeKey, KEY_LENGTH[strength] * 2);
|
|
1764
|
-
Object.assign(aesCrypto, {
|
|
1765
|
-
keys: {
|
|
1766
|
-
key,
|
|
1767
|
-
authentication,
|
|
1768
|
-
passwordVerification
|
|
1769
|
-
},
|
|
1770
|
-
ctr: new CtrGladman(new Aes(key), Array.from(COUNTER_DEFAULT_VALUE)),
|
|
1771
|
-
hmac: new HmacSha1(authentication)
|
|
1772
|
-
});
|
|
1773
|
-
return passwordVerification;
|
|
1774
|
-
}
|
|
1775
|
-
|
|
1776
|
-
async function importKey(format, password, algorithm, extractable, keyUsages) {
|
|
1777
|
-
if (IMPORT_KEY_SUPPORTED) {
|
|
1778
|
-
try {
|
|
1779
|
-
return await subtle.importKey(format, password, algorithm, extractable, keyUsages);
|
|
1780
|
-
} catch {
|
|
1781
|
-
IMPORT_KEY_SUPPORTED = false;
|
|
1782
|
-
return misc.importKey(password);
|
|
1783
|
-
}
|
|
1784
|
-
} else {
|
|
1785
|
-
return misc.importKey(password);
|
|
1786
|
-
}
|
|
1305
|
+
const keyLength = KEY_LENGTH[strength];
|
|
1306
|
+
const compositeKey = await deriveKey(password, salt, keyLength * 2 + PASSWORD_VERIFICATION_LENGTH);
|
|
1307
|
+
aesCrypto.engine = createEngine(subarray(compositeKey, 0, keyLength), subarray(compositeKey, keyLength, keyLength * 2));
|
|
1308
|
+
return subarray(compositeKey, keyLength * 2);
|
|
1787
1309
|
}
|
|
1788
1310
|
|
|
1789
|
-
async function
|
|
1311
|
+
async function deriveKey(password, salt, length) {
|
|
1790
1312
|
if (DERIVE_BITS_SUPPORTED) {
|
|
1791
1313
|
try {
|
|
1792
|
-
|
|
1314
|
+
const baseKey = await subtle.importKey(RAW_FORMAT, password, BASE_KEY_ALGORITHM, false, DERIVED_BITS_USAGE);
|
|
1315
|
+
return new Uint8Array(await subtle.deriveBits(Object.assign({ salt }, DERIVED_BITS_ALGORITHM), baseKey, length * 8));
|
|
1793
1316
|
} catch {
|
|
1794
1317
|
DERIVE_BITS_SUPPORTED = false;
|
|
1795
|
-
return misc.pbkdf2(baseKey, algorithm.salt, DERIVED_BITS_ALGORITHM.iterations, length);
|
|
1796
1318
|
}
|
|
1797
|
-
} else {
|
|
1798
|
-
return misc.pbkdf2(baseKey, algorithm.salt, DERIVED_BITS_ALGORITHM.iterations, length);
|
|
1799
1319
|
}
|
|
1320
|
+
return pbkdf2(password, salt, PBKDF2_ITERATIONS, length);
|
|
1800
1321
|
}
|
|
1801
1322
|
|
|
1802
1323
|
function encodePassword(password, rawPassword) {
|
|
@@ -1820,13 +1341,6 @@
|
|
|
1820
1341
|
return array.subarray(begin, end);
|
|
1821
1342
|
}
|
|
1822
1343
|
|
|
1823
|
-
function fromBits(codecBytes, chunk) {
|
|
1824
|
-
return codecBytes.fromBits(chunk);
|
|
1825
|
-
}
|
|
1826
|
-
function toBits(codecBytes, chunk) {
|
|
1827
|
-
return codecBytes.toBits(chunk);
|
|
1828
|
-
}
|
|
1829
|
-
|
|
1830
1344
|
/*
|
|
1831
1345
|
Copyright (c) 2022 Gildas Lormeau. All rights reserved.
|
|
1832
1346
|
|
|
@@ -2766,11 +2280,18 @@
|
|
|
2766
2280
|
return true;
|
|
2767
2281
|
}
|
|
2768
2282
|
if (FallbackStream) {
|
|
2283
|
+
return await loadModule(config);
|
|
2284
|
+
}
|
|
2285
|
+
return false;
|
|
2286
|
+
}
|
|
2287
|
+
|
|
2288
|
+
async function loadModule(config) {
|
|
2289
|
+
if (initModule) {
|
|
2769
2290
|
try {
|
|
2770
2291
|
await initModule(config);
|
|
2771
2292
|
return true;
|
|
2772
2293
|
} catch {
|
|
2773
|
-
|
|
2294
|
+
// ignored
|
|
2774
2295
|
}
|
|
2775
2296
|
}
|
|
2776
2297
|
return false;
|
|
@@ -2813,26 +2334,27 @@
|
|
|
2813
2334
|
terminate() {
|
|
2814
2335
|
return new Promise(resolve => {
|
|
2815
2336
|
const { worker, busy } = workerData;
|
|
2816
|
-
if (
|
|
2817
|
-
|
|
2818
|
-
|
|
2819
|
-
|
|
2337
|
+
if (busy) {
|
|
2338
|
+
workerData.resolveTerminated = resolve;
|
|
2339
|
+
} else {
|
|
2340
|
+
if (worker) {
|
|
2820
2341
|
worker.terminate();
|
|
2821
|
-
|
|
2342
|
+
workerData.worker = null;
|
|
2822
2343
|
}
|
|
2823
|
-
workerData.interface = null;
|
|
2824
|
-
} else {
|
|
2825
2344
|
resolve();
|
|
2826
2345
|
}
|
|
2346
|
+
workerData.interface = null;
|
|
2827
2347
|
});
|
|
2828
2348
|
},
|
|
2829
2349
|
onTaskFinished() {
|
|
2830
2350
|
if (workerData.busy) {
|
|
2831
|
-
const { resolveTerminated } = workerData;
|
|
2351
|
+
const { resolveTerminated, worker } = workerData;
|
|
2832
2352
|
if (resolveTerminated) {
|
|
2833
2353
|
workerData.resolveTerminated = null;
|
|
2834
|
-
|
|
2835
|
-
|
|
2354
|
+
if (worker) {
|
|
2355
|
+
workerData.terminated = true;
|
|
2356
|
+
worker.terminate();
|
|
2357
|
+
}
|
|
2836
2358
|
resolveTerminated();
|
|
2837
2359
|
}
|
|
2838
2360
|
workerData.busy = false;
|
|
@@ -2889,28 +2411,23 @@
|
|
|
2889
2411
|
}
|
|
2890
2412
|
|
|
2891
2413
|
async function runWorker$1({ options, readable, writable, onTaskFinished, workerOptions }, config) {
|
|
2892
|
-
let codecStream, chunkStream;
|
|
2414
|
+
let codecStream, chunkStream, modulePromise;
|
|
2893
2415
|
try {
|
|
2894
2416
|
if (options.compressed && !options.format) {
|
|
2895
2417
|
const deflate = options.codecType.startsWith(CODEC_DEFLATE);
|
|
2896
2418
|
const FallbackStream = deflate ? config.CompressionStreamFallback : config.DecompressionStreamFallback;
|
|
2897
2419
|
const NativeStream = deflate ? config.CompressionStream : config.DecompressionStream;
|
|
2898
2420
|
if (!options.useCompressionStream) {
|
|
2899
|
-
|
|
2900
|
-
|
|
2901
|
-
} catch {
|
|
2902
|
-
if (!FallbackStream || FallbackStream.requiresModule) {
|
|
2903
|
-
options.useCompressionStream = true;
|
|
2904
|
-
}
|
|
2421
|
+
if (!await moduleLoaded() && (!FallbackStream || FallbackStream.requiresModule)) {
|
|
2422
|
+
options.useCompressionStream = true;
|
|
2905
2423
|
}
|
|
2906
2424
|
} else if (FallbackStream && FallbackStream.requiresModule && !supportsDeflateRaw(NativeStream)) {
|
|
2907
|
-
|
|
2908
|
-
await initModule(config);
|
|
2909
|
-
} catch {
|
|
2910
|
-
// ignored
|
|
2911
|
-
}
|
|
2425
|
+
await moduleLoaded();
|
|
2912
2426
|
}
|
|
2913
2427
|
}
|
|
2428
|
+
if (options.encrypted && !options.zipCrypto) {
|
|
2429
|
+
await moduleLoaded();
|
|
2430
|
+
}
|
|
2914
2431
|
codecStream = new CodecStream(options, config);
|
|
2915
2432
|
chunkStream = new ChunkStream(getChunkSize(config));
|
|
2916
2433
|
await readable
|
|
@@ -2943,6 +2460,13 @@
|
|
|
2943
2460
|
} finally {
|
|
2944
2461
|
onTaskFinished();
|
|
2945
2462
|
}
|
|
2463
|
+
|
|
2464
|
+
function moduleLoaded() {
|
|
2465
|
+
if (!modulePromise) {
|
|
2466
|
+
modulePromise = loadModule(config);
|
|
2467
|
+
}
|
|
2468
|
+
return modulePromise;
|
|
2469
|
+
}
|
|
2946
2470
|
}
|
|
2947
2471
|
|
|
2948
2472
|
/*
|
|
@@ -3049,7 +2573,7 @@
|
|
|
3049
2573
|
rejectResult = error => {
|
|
3050
2574
|
const { outputSize, workerOptions } = workerData;
|
|
3051
2575
|
workerOptions.outputSize = outputSize;
|
|
3052
|
-
if (isErrorObject(error)
|
|
2576
|
+
if (isErrorObject(error)) {
|
|
3053
2577
|
try {
|
|
3054
2578
|
error.outputSize = outputSize;
|
|
3055
2579
|
} catch {
|
|
@@ -3063,12 +2587,14 @@
|
|
|
3063
2587
|
reader: null,
|
|
3064
2588
|
writer: null,
|
|
3065
2589
|
outputSize: 0,
|
|
2590
|
+
destinationFailed: false,
|
|
2591
|
+
destinationError: null,
|
|
3066
2592
|
resolveResult,
|
|
3067
2593
|
rejectResult,
|
|
3068
2594
|
result
|
|
3069
2595
|
});
|
|
3070
2596
|
const { readable, options } = workerData;
|
|
3071
|
-
const { writable, closed, abortPipe } = watchClosedStream(workerData.writable);
|
|
2597
|
+
const { writable, closed, abortPipe } = watchClosedStream(workerData.writable, workerData);
|
|
3072
2598
|
let streamsTransferred;
|
|
3073
2599
|
try {
|
|
3074
2600
|
streamsTransferred = sendMessage({
|
|
@@ -3111,7 +2637,18 @@
|
|
|
3111
2637
|
} catch {
|
|
3112
2638
|
// ignored
|
|
3113
2639
|
}
|
|
3114
|
-
|
|
2640
|
+
const { outputSize, workerOptions, destinationFailed, destinationError } = workerData;
|
|
2641
|
+
workerOptions.outputSize = outputSize;
|
|
2642
|
+
const workerFailed = isErrorObject(error) && (error.codecImportFailed || error.workerStartupFailed);
|
|
2643
|
+
const reportedError = destinationFailed && !workerFailed ? destinationError : error;
|
|
2644
|
+
if (isErrorObject(reportedError)) {
|
|
2645
|
+
try {
|
|
2646
|
+
reportedError.outputSize = outputSize;
|
|
2647
|
+
} catch {
|
|
2648
|
+
// ignored
|
|
2649
|
+
}
|
|
2650
|
+
}
|
|
2651
|
+
throw reportedError;
|
|
3115
2652
|
}
|
|
3116
2653
|
|
|
3117
2654
|
async function closeWritable() {
|
|
@@ -3125,12 +2662,27 @@
|
|
|
3125
2662
|
}
|
|
3126
2663
|
}
|
|
3127
2664
|
|
|
3128
|
-
function watchClosedStream(writableSource) {
|
|
2665
|
+
function watchClosedStream(writableSource, workerData) {
|
|
3129
2666
|
const abortController = new AbortController();
|
|
3130
|
-
|
|
2667
|
+
let aborting;
|
|
2668
|
+
const { writable, readable } = new TransformStream({
|
|
2669
|
+
transform(chunk, controller) {
|
|
2670
|
+
workerData.outputSize += chunk.length;
|
|
2671
|
+
controller.enqueue(chunk);
|
|
2672
|
+
}
|
|
2673
|
+
});
|
|
3131
2674
|
const closed = readable.pipeTo(writableSource, { preventClose: true, preventAbort: true, signal: abortController.signal });
|
|
3132
|
-
closed.catch(
|
|
3133
|
-
|
|
2675
|
+
closed.catch(error => {
|
|
2676
|
+
if (!aborting) {
|
|
2677
|
+
Object.assign(workerData, { destinationFailed: true, destinationError: error });
|
|
2678
|
+
}
|
|
2679
|
+
});
|
|
2680
|
+
return {
|
|
2681
|
+
writable, closed, abortPipe: () => {
|
|
2682
|
+
aborting = true;
|
|
2683
|
+
abortController.abort();
|
|
2684
|
+
}
|
|
2685
|
+
};
|
|
3134
2686
|
}
|
|
3135
2687
|
|
|
3136
2688
|
function releaseWorkerStreams(workerData) {
|
|
@@ -3328,9 +2880,6 @@
|
|
|
3328
2880
|
const stale = () => workerData.generation != generation;
|
|
3329
2881
|
try {
|
|
3330
2882
|
if (error) {
|
|
3331
|
-
if (error.outputSize !== UNDEFINED_VALUE) {
|
|
3332
|
-
workerData.outputSize = error.outputSize;
|
|
3333
|
-
}
|
|
3334
2883
|
fail(getResponseError(error, errorValue));
|
|
3335
2884
|
} else {
|
|
3336
2885
|
if (type == MESSAGE_PULL) {
|
|
@@ -3343,7 +2892,6 @@
|
|
|
3343
2892
|
const chunk = new Uint8Array(value);
|
|
3344
2893
|
await writer.ready;
|
|
3345
2894
|
await writer.write(chunk);
|
|
3346
|
-
workerData.outputSize += chunk.length;
|
|
3347
2895
|
if (!stale()) {
|
|
3348
2896
|
sendMessage({ type: MESSAGE_ACK_DATA, messageId }, workerData);
|
|
3349
2897
|
}
|
|
@@ -4055,16 +3603,14 @@
|
|
|
4055
3603
|
combineSizeEocd
|
|
4056
3604
|
} = httpReader;
|
|
4057
3605
|
if (isHttpFamily(url) && (useRangeHeader || forceRangeRequests) && (typeof preventHeadRequest == UNDEFINED_TYPE || preventHeadRequest)) {
|
|
4058
|
-
const response = await sendRequest(HTTP_METHOD_GET, httpReader, getRangeHeaders(httpReader, combineSizeEocd ? -
|
|
3606
|
+
const response = await sendRequest(HTTP_METHOD_GET, httpReader, getRangeHeaders(httpReader, combineSizeEocd ? -65557 : undefined));
|
|
4059
3607
|
const acceptRanges = response.headers.get(HTTP_HEADER_ACCEPT_RANGES);
|
|
4060
3608
|
if (!forceRangeRequests && (!acceptRanges || acceptRanges.toLowerCase() != HTTP_RANGE_UNIT)) {
|
|
4061
3609
|
throw new Error(ERR_HTTP_RANGE);
|
|
4062
3610
|
} else {
|
|
4063
|
-
|
|
4064
|
-
|
|
4065
|
-
|
|
4066
|
-
httpReader.eocdCache = eocdCache;
|
|
4067
|
-
}
|
|
3611
|
+
let eocdCache;
|
|
3612
|
+
if (combineSizeEocd && response.status == 206) {
|
|
3613
|
+
eocdCache = new Uint8Array(await response.arrayBuffer());
|
|
4068
3614
|
}
|
|
4069
3615
|
setResourceValidators(httpReader, response);
|
|
4070
3616
|
const contentSize = getContentRangeSize(response);
|
|
@@ -4073,6 +3619,9 @@
|
|
|
4073
3619
|
} else {
|
|
4074
3620
|
httpReader.size = contentSize;
|
|
4075
3621
|
}
|
|
3622
|
+
if (eocdCache && eocdCache.length && getContentRangeOffset(response) === httpReader.size - eocdCache.length) {
|
|
3623
|
+
httpReader.eocdCache = eocdCache;
|
|
3624
|
+
}
|
|
4076
3625
|
}
|
|
4077
3626
|
} else {
|
|
4078
3627
|
await getContentLength(httpReader, sendRequest, getRequestData);
|
|
@@ -4088,25 +3637,23 @@
|
|
|
4088
3637
|
options
|
|
4089
3638
|
} = httpReader;
|
|
4090
3639
|
if (useRangeHeader || forceRangeRequests) {
|
|
4091
|
-
if (eocdCache && index == size - END_OF_CENTRAL_DIR_LENGTH && length == END_OF_CENTRAL_DIR_LENGTH) {
|
|
4092
|
-
return eocdCache;
|
|
4093
|
-
}
|
|
4094
3640
|
if (index >= size || length === 0) {
|
|
4095
3641
|
return EMPTY_UINT8_ARRAY;
|
|
4096
3642
|
} else {
|
|
4097
3643
|
if (index + length > size) {
|
|
4098
3644
|
length = size - index;
|
|
4099
3645
|
}
|
|
3646
|
+
if (eocdCache && index >= size - eocdCache.length) {
|
|
3647
|
+
const cacheIndex = index - (size - eocdCache.length);
|
|
3648
|
+
return eocdCache.slice(cacheIndex, cacheIndex + length);
|
|
3649
|
+
}
|
|
4100
3650
|
const response = await sendRequest(HTTP_METHOD_GET, httpReader, getRangeHeaders(httpReader, index, length));
|
|
4101
3651
|
if (response.status != 206) {
|
|
4102
3652
|
throw new Error(ERR_HTTP_RANGE);
|
|
4103
3653
|
}
|
|
4104
|
-
const
|
|
4105
|
-
if (
|
|
4106
|
-
|
|
4107
|
-
if (!Number.isNaN(rangeStart) && rangeStart != index) {
|
|
4108
|
-
throw new Error(ERR_HTTP_RANGE);
|
|
4109
|
-
}
|
|
3654
|
+
const rangeStart = getContentRangeOffset(response);
|
|
3655
|
+
if (rangeStart !== UNDEFINED_VALUE && rangeStart != index) {
|
|
3656
|
+
throw new Error(ERR_HTTP_RANGE);
|
|
4110
3657
|
}
|
|
4111
3658
|
checkResourceValidators(httpReader, response);
|
|
4112
3659
|
setResourceValidators(httpReader, response);
|
|
@@ -4166,12 +3713,9 @@
|
|
|
4166
3713
|
if (response.status != 206) {
|
|
4167
3714
|
throw new Error(ERR_HTTP_RANGE);
|
|
4168
3715
|
}
|
|
4169
|
-
const
|
|
4170
|
-
if (
|
|
4171
|
-
|
|
4172
|
-
if (!Number.isNaN(rangeStart) && rangeStart != windowOffset) {
|
|
4173
|
-
throw new Error(ERR_HTTP_RANGE);
|
|
4174
|
-
}
|
|
3716
|
+
const rangeStart = getContentRangeOffset(response);
|
|
3717
|
+
if (rangeStart !== UNDEFINED_VALUE && rangeStart != windowOffset) {
|
|
3718
|
+
throw new Error(ERR_HTTP_RANGE);
|
|
4175
3719
|
}
|
|
4176
3720
|
checkResourceValidators(httpReader, response);
|
|
4177
3721
|
setResourceValidators(httpReader, response);
|
|
@@ -4187,6 +3731,16 @@
|
|
|
4187
3731
|
}
|
|
4188
3732
|
}
|
|
4189
3733
|
|
|
3734
|
+
function getContentRangeOffset(response) {
|
|
3735
|
+
const contentRangeHeader = response.headers.get(HTTP_HEADER_CONTENT_RANGE);
|
|
3736
|
+
if (contentRangeHeader) {
|
|
3737
|
+
const rangeStart = Number(contentRangeHeader.trim().split(/[\s-]+/)[1]);
|
|
3738
|
+
if (!Number.isNaN(rangeStart)) {
|
|
3739
|
+
return rangeStart;
|
|
3740
|
+
}
|
|
3741
|
+
}
|
|
3742
|
+
}
|
|
3743
|
+
|
|
4190
3744
|
function getContentRangeSize(response) {
|
|
4191
3745
|
const contentRangeHeader = response.headers.get(HTTP_HEADER_CONTENT_RANGE);
|
|
4192
3746
|
if (contentRangeHeader) {
|
|
@@ -6706,7 +6260,6 @@
|
|
|
6706
6260
|
rawExtraFieldUnix: EMPTY_UINT8_ARRAY,
|
|
6707
6261
|
rawExtraField,
|
|
6708
6262
|
rawCentralExtraField: EMPTY_UINT8_ARRAY,
|
|
6709
|
-
extendedTimestamp: false,
|
|
6710
6263
|
headerArray,
|
|
6711
6264
|
headerView
|
|
6712
6265
|
});
|
|
@@ -7450,7 +7003,7 @@
|
|
|
7450
7003
|
}
|
|
7451
7004
|
}
|
|
7452
7005
|
const emptyEntry = !encryptedEntry && (!hasContent || (contentSize === 0 && !passThroughCompression)) && !isCompressed(compressionMethod, level);
|
|
7453
|
-
if (emptyEntry &&
|
|
7006
|
+
if (emptyEntry && getOptionValue(zipWriter, options, OPTION_DATA_DESCRIPTOR) === UNDEFINED_VALUE) {
|
|
7454
7007
|
dataDescriptor = false;
|
|
7455
7008
|
}
|
|
7456
7009
|
const zip64UncompressedSize = zip64Enabled || unknownSize || uncompressedSize >= MAX_32_BITS;
|
|
@@ -8962,7 +8515,7 @@
|
|
|
8962
8515
|
EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
8963
8516
|
*/
|
|
8964
8517
|
|
|
8965
|
-
const VERSION = "2.
|
|
8518
|
+
const VERSION = "2.14.0";
|
|
8966
8519
|
|
|
8967
8520
|
/*
|
|
8968
8521
|
Copyright (c) 2025 Gildas Lormeau. All rights reserved.
|
|
@@ -9478,7 +9031,7 @@
|
|
|
9478
9031
|
*/
|
|
9479
9032
|
|
|
9480
9033
|
|
|
9481
|
-
|
|
9034
|
+
c(setDefaultConfiguration);
|
|
9482
9035
|
|
|
9483
9036
|
exports.BlobReader = BlobReader;
|
|
9484
9037
|
exports.BlobWriter = BlobWriter;
|