@zip.js/zip.js 2.13.1 → 2.14.1

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.
Files changed (51) hide show
  1. package/BENCHMARKS.md +349 -416
  2. package/deno.json +1 -1
  3. package/dist/zip-core-external.js +761 -945
  4. package/dist/zip-core-external.min.js +1 -1
  5. package/dist/zip-core.js +626 -911
  6. package/dist/zip-core.min.js +1 -1
  7. package/dist/zip-fs-core-external.js +768 -948
  8. package/dist/zip-fs-core-external.min.js +1 -1
  9. package/dist/zip-fs-core.js +633 -914
  10. package/dist/zip-fs-core.min.js +1 -1
  11. package/dist/zip-fs-external.js +768 -948
  12. package/dist/zip-fs-external.min.js +1 -1
  13. package/dist/zip-fs-native.js +635 -916
  14. package/dist/zip-fs-native.min.js +1 -1
  15. package/dist/zip-fs.js +771 -951
  16. package/dist/zip-fs.min.js +1 -1
  17. package/dist/zip-legacy.js +628 -913
  18. package/dist/zip-legacy.min.js +1 -1
  19. package/dist/zip-module.wasm +0 -0
  20. package/dist/zip-native.js +628 -913
  21. package/dist/zip-native.min.js +1 -1
  22. package/dist/zip-web-worker-native.js +1 -1
  23. package/dist/zip-web-worker.js +1 -1
  24. package/dist/zip.js +764 -948
  25. package/dist/zip.min.js +1 -1
  26. package/index-native.cjs +635 -916
  27. package/index-native.min.js +1 -1
  28. package/index.cjs +771 -951
  29. package/index.d.cts +52 -12
  30. package/index.d.ts +52 -12
  31. package/index.min.js +1 -1
  32. package/lib/core/codec-worker.js +37 -26
  33. package/lib/core/io.js +29 -21
  34. package/lib/core/streams/aes-crypto-stream.js +58 -99
  35. package/lib/core/streams/codecs/aes-hmac-sha1.js +486 -0
  36. package/lib/core/streams/zlib-wasm/aes-hmac-sha1-wasm.js +106 -0
  37. package/lib/core/streams/zlib-wasm/zlib-streams-loader.js +4 -0
  38. package/lib/core/streams/zlib-wasm/zlib-streams.js +2 -7
  39. package/lib/core/streams/zlib-wasm/zlib-streams.wasm +0 -0
  40. package/lib/core/version.js +1 -1
  41. package/lib/core/web-worker-base.js +15 -9
  42. package/lib/core/web-worker-inline-native.js +1 -1
  43. package/lib/core/web-worker-inline-wasm.js +1 -1
  44. package/lib/core/web-worker-wasm.js +2 -0
  45. package/lib/core/zip-fs.js +7 -3
  46. package/lib/core/zip-reader.js +53 -6
  47. package/lib/core/zip-writer.js +1 -2
  48. package/lib/core/zlib-streams-inline.js +1 -1
  49. package/lib/zip-module-wasm-base.js +3 -1
  50. package/package.json +1 -1
  51. package/lib/core/streams/codecs/sjcl.js +0 -795
package/index-native.cjs CHANGED
@@ -439,7 +439,7 @@ function resetConfiguration() {
439
439
  Object.assign(config, DEFAULT_CONFIGURATION);
440
440
  }
441
441
 
442
- 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)}("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")),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;
442
+ 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],n=[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0],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],o=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],u=new Uint8Array(288);u.fill(8,0,144),u.fill(9,144,256),u.fill(7,256,280),u.fill(8,280,288);const s=new Uint8Array(30).fill(5);function c(t){const n=new Uint16Array(16);for(const r of t)n[r]++;n[0]=0;const r=new Uint16Array(17);for(let t=1;t<=15;t++)r[t+1]=r[t]+n[t];const e=new Uint16Array(t.length);for(let n=0;n<t.length;n++)t[n]&&(e[r[t[n]]++]=n);return {o:n,symbols:e}}const z$1="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",f=(w=()=>function(z){let f=0,w=0,W=0,Y=new Uint8Array(1024),a=0,C=0;for(;!C;){C=i(1);const t=i(2);if(0==t)d();else if(1==t)K(c(u),c(s));else {if(2!=t)throw new Error("invalid deflate block type");K(...U());}}return Y.subarray(0,a);function Z(){if(f>=z.length)throw new Error("unexpected end of deflate data");return z[f++]}function i(t){for(;W<t;)w|=Z()<<W,W+=8;const n=w&(1<<t)-1;return w>>>=t,W-=t,n}function d(){w=0,W=0;const t=Z()|Z()<<8;f+=2,l(a+t);for(let n=0;n<t;n++)Y[a++]=Z();}function K(o,u){let s=g(o);for(;256!=s;){if(s<256)l(a+1),Y[a++]=s;else {const o=s-257,c=t[o]+i(n[o]),z=g(u),f=r[z]+i(e[z]);l(a+c);const w=a-f;for(let t=0;t<c;t++)Y[a++]=Y[w+t];}s=g(o);}}function U(){const t=i(5)+257,n=i(5)+1,r=i(4)+4,e=new Uint8Array(19);for(let t=0;t<r;t++)e[o[t]]=i(3);const u=c(e),s=new Uint8Array(t+n);let z=0;for(;z<s.length;){const t=g(u);if(t<16)s[z++]=t;else if(16==t){const t=s[z-1];let n=i(2)+3;for(;n--;)s[z++]=t;}else z+=17==t?i(3)+3:i(7)+11;}return [c(s.subarray(0,t)),c(s.subarray(t))]}function g(t){const{o:n,symbols:r}=t;let e=0,o=0,u=0;for(let t=1;t<=15;t++){e|=i(1);const s=n[t];if(e-o<s)return r[u+(e-o)];u+=s,o=o+s<<1,e<<=1;}throw new Error("invalid huffman code")}function l(t){if(Y.length<t){let n=2*Y.length;for(;n<t;)n*=2;const r=new Uint8Array(n);r.set(Y.subarray(0,a)),Y=r;}}}(function(t){const n=(t=String(t).replace(/[^A-Za-z0-9+/=]/g,"")).length,r=[];for(let e=0;e<n;e+=4){const n=z$1.indexOf(t[e])<<18|z$1.indexOf(t[e+1])<<12|(63&z$1.indexOf(t[e+2]))<<6|63&z$1.indexOf(t[e+3]);r.push(n>>16&255),"="!==t[e+2]&&r.push(n>>8&255),"="!==t[e+3]&&r.push(255&n);}return new Uint8Array(r)}("zb17c9s2szj8//spbE8fDVGCPCR1sUwJ8jhO3KRt0lzsNIlGycgUaNOWQReE7DiWzmd/ZxcgCV2cpj7nec5vxiOTIK6LxWJ3sbvYTmciUVkuHE7ud8qXHcbU3TXP060JTzPBGw393x9fTfb1o8NJzB2ycKoKyP3OrOBbhZJZonZ6SS4KdX8g5fgu5vSP0wueqFjRV7OrUy5jQV+O1Xks6TMpcxnn9CQTqqtzZ/gSdvRbim/NSL8l9EX9UtCX4+t4Sp+O1fh9xm/jGX0t86us4PGYHvOv6plI8gmX8S1N5N21yuMJvc4L9ZIXxfiMx+f0WI5Fkeby6p2SfHwVX9O3fDwZn065Sbijf8pMWQlX9DC/upa8KLJcmLRL+pQna6mnC1bwaUpv2E2eTbYCesZ2ZkJDb7JD37Ea3PQbE/x2K6MXbDgc0U1/o16aS2fK1RZnQY/3o3anx12X3EOSYnzlcxc/KhY21L4aDAbh5+ZetxvtRc1uK8aE3sUwGA35iKnF5prLVMXCnup3ewpaw1ndEuxiqLwQivcuhgqrEYPBoPsZK43a7YYYLTDv8JC+pl/pC3pCD+hb+mzELnrJdFwUWx91ZXKWqFwC+qnzrPBzxudzL1yMr6+5mECy7kMw1597ZQ+COfenXJyp8x7kkCzoZakjBqzbaHD/dJamXJb9zRG8M6dMp9w/vVP8jzQtuKKC0IwJr4sg7Mk+y3rSZd2yMGfqc+6fcYWY50i6HRAqmJ3ktiCxp9gzHDsffX475ACPRtRujz4f4EvY0W8n+Ba19NsLA63PX4eiLvEaX8oSh/hmSiwWppuiJ3GKFQL+EOtx1Gc+lCMy6hlgqsUZVw65l1zNpPhvnbpY6Bn4ssW/Ki4mxdb10lxomHMDaoXA+9grZtdcOveqXDIOp4LcK7+aKSp8Lv6a8RkQhwVNp7Pi3KlRBjHcaZGengtRzpFfcKWXuBNQ5WN/CeX+zXg640wsFoRyBh1fLMoFs/XU4VStVl3ig6vMA+npYW8JaEP3EB4ULbMSKupKXwK2lSW+gy/65XddgcbyrWPWadEjFgX0lenNMIy6I0KfmNeQ0Of4WDjDcLcZtbutcK9JW0HUjJrNVrhLo3YnanabYRDRaDfcbTa7u13ajLrt5u5uOwpGhL4xdUXtDqHvTW348qf98pf98pv1ggvld7Yd9qox/6EBuW1R8Sx1tn83KMBCCst/kt9zhvjFP/N+P/zshFG3wfej3TgghCpmcE/1++Hya7T82iIUSqoGvLM9Qt8A6TDfHSg+V4PBLsHnCJ47+rkJz2393ILnFvm8t0cWt+fZlDvhNuOk92YYjNje3kOEssRmaJIK9slRhEom+v2oNYeWO/DbnYvPqvceeiXpn/gPltdcQjb6V5kQdiAl7NDfypSoBSndxe9sO1gsHNKzcbNwOgE0Vm+2NvaWyDgYRNAht0Nz1vrZkW6oZyxjYTUmIHPV0h/KEePD1s9yhIPARzcc4Vj0SzSCIennpr2FiB7v5/UGIpkaci8c9fi/BGPBviPZrw6MZ67HRj5nCICMfXIyQmIx6DQamLfVaOjMgAe4nQy5J0af5cKsJLlAQkFzA4kWUNufHKXHlrKAJiygUxbQMYwNC91fyzzhRaHhpBqNzJ9dT8aKO5wG1uK1mRebWP3QyqU15KsdRJNWN+z0GcCYhR1y6xCqgGyU5F9ZhJ98zoewMu0Mbmspi9uCTOFqpu5ypi5kilYzhdFyrjCCbM0Rga1O9gW5v3VIr96oK9ygsFnDTvCZ5UM1GEQjnEav+7PTbCiyWAAxVPP5Zrgu6CQ744WKHcIGma9fHLKoycatQ+5TlrrhPKDpfO4kLMHnZD53pmyKz9P53BmzMTwTomebsw9OSj6LYTCiin1wEngORzRjH5wpPEcjWrAPzhiemyM6Y+/NZjn6/OdQWVviX8Os3i1/w72vGH0Ww9aI3rL3mFUXypYKFauFOBRqj+iEvcesulCxVIivFlJQqDOi5+w9ZtWF+FIhtVoog0K7ox5n74ezqtDtUqHJaqFzKNQFYL3HrLrQZKnQ+WqhGRTaA6i+x6y60PlSodlqoVsoFAYA//eYV5eaLZW6XS01wVLhY2YqjB4zVWHzMXMVth4zWWF7RP/5bIWdx0xXuPuo+eo+ar72HjNfUfCY+YrCx8xXFD1mvqLmY+Yraj1mvqL2Y+Yr6jxmvqLdR81X91HztfeY+WoGj5mvZviY+WpGj5mvZvMx89VsPWa+mu3HzFez85j5au4+ar66j5qvvRHu4tesFfTkIAwaDeefz18reMz8tcLHzF8resz8tR7HeTyK9Wg9ivdoPYr5aO2O6DVrdQmVgzB63OQ9ihdpPYoZaT+KGWk/ihlpP4oZaT+KGWk/ihlpt2HyQKIHiYM5b8qZQ9HvjT17KP+9sWYQ5Lg3ZhKBs74eUZBIoJLbpUoma5Wcb6hkpitxQ6gmwmomS9Wcr1Uz21DNrakmgmqaWM35UjWztWpuN1QzMdU0R5Z+6CdbIrR0G6VGT4uiz0E5oR/DDsiDWr1yXAqrlpKKpuZjV0syRmYt5VUtRcXjUnBaa1Kx7s9TKpj002meS0f9Vyvaa+11dqM9mFJU4mnxc+y8ogENSa/d2WZJj4ydJ/o9hXnXikCawvRpFSFNYQ5Qd0hTgKOg6bA1YnmZs62fMWdHP0PO3RHL6dhJaUC7pbaiMIM8IvTWQKAoIbAkZqp+JTqDpHlbC62tnxXlQzWqdG8cVW7PSSXmFwtLkByDiE8rRW3GlCtBuJ26TNKE3KNArvpZo5H0j3tEDBPXBaWHct1RL2HsuNFwbp2cBlg/WWSpo9zjPsuWlYM/pBDQ0r8u3lMuOya3jqCKLMpOrLS/sMRhAWNYVjyFWu+EShGxpBD4mWskymnGOMjCKeMgBieMawmYg/A7Bd3Oqto/bPe4y9pkypys32/PkfTsEtdxks8FaaSfC+JO3bAddttBELX2XGgehHSW9vvNYJ5CflowZwqlp1Xp9HNCGtnnhLjFSmk3hPIZy7A8tkcT5hRQvqjKZ59T0ph+TombrJaPoPyUTbE8tkhT5iRQPqnKTz9npFF8zoibrpZvQvmCFVgeW6QZc1Ion1bli89T0kg+T4mbrZZvQfmEJVgeW+z9A+iF7XXw5UyBIPpZDbvwE8FPMKI5y0GBCQusGVJIYvmPgzpfgzI204LK9+AHGwzXmwmhmR+ekXxtMrCZNlYewG9Lj2mtnQja+eGZy9cmDdrBBsIQftt6TGvNNKGZH57gfG1u6/USwYJpBXrB5KiYbDb0SLnXrZ7ClnkMYVtfBy+kspyu4Uz6OTH40m3v7e62m3tN7M46rnAvqlrbrdutOuOG8LTWsknfhETZ59Qg0HLb6wjEvbBqsVO3XXXIjR5oOzJtr2HW9HNmsGq57U1YBXwStNeuW6664zYfaLlpWl7DteLz1ODZcsvreGZAhy226raDqu3WA223TNtrCJh8LgzyLbf9EPIB3vU7/z7kayRzJ50npIEoGLWCYK+9txt0/3Mo2EjnTjZPSQMRcaUH/xFEbGRzZzrPSAPRcaUH/wF0bEznTjGfkgYi5Ur7/xGkbBRzJ5kXpIGoudKDh1CzgwYC/3662GzutVudvd1u9J+niytt/0fp4krb/0G6uNLyf5QurrS9jHzA5SKr62bzgAKzixyvm+JbNELG103wrTlC/tct8K2FR5wjdzrHY9V1IQ0ee9URKsgDavNhIWeqOspalWaObesWyWrxZh9kmTjoiaEasXbrs6Q5PO1F9QFn1ZygAT0m9L5qHYUCqzfwXp6tWcJo3a1elTnXdS0N5agU06Rd5IFeyIUlDv9qWTa8KVUjRsrma1I23yBlc0va+WDVxrEWp9OOukGDEzxtxuKYMtdN1UU/WUW1PQFYE0S7Pzscjv1La4pfKvOzbXbWaJQvIES9HYtJfvUebEMKxt5RztnOC3EznmaTretxUdzmcrJDFWc737Lri8Ibn+ZSeck5Ty696nstf6IhG5g8/EJMt9ZacTjpqXOZ36JRSO7sHKIt2dbB6xdbIldbxez6OpeKT3bK7kvO7sX4isc7r5/89vQo2lnQHKZ5XBTZmXDuz8fFeWxyPH95cLizWFDJCc3sTJnicgx9LOKQN6ld5t3zAy8sC6WcDXcmXGY3/Emmip0RTTgbdmkYUTiKKjgbhh0atSgozqechQGdcRu+dMzZDEz8/GJ2qqYcRdNbnWayjbk9D2PuZ1cw5N/4HWPv7PS6HzA3E87+MMZe5/wBW6P7clJiTuX49nX5pigXaLRnDOpgMcaC4kSWmf4Q07tY6rSDmTrnQmUJwuwwn/A4BVMMcm/slgo1lrDq7rgDxkQU9A6CLOi4uBPJlm3VZJlmYM66iyktyq4kdBoXVPLx5C6eLpjopfvO+HacqS1doW3qoQlBqeHQuU65+XLGHUkDmqDSBPRMmKBfQROSDYPRNgPlz3yeDUN8DkdEY+QlR6smxEvOycIRNKEp1Ml1ncnIjcCaimFSmUDlvnPJHQEEhoMBpqOrUJwQEhcOIbHu5dRQnNmKiZU35Z79Qv4VdoB6lfZfV0CHOJ3RgE452MZVgNZWYaV27v48VvQqFgaQcoEQh2Ercq+7IE0XEhiCoMJqlJb6qjNN9uxv0JvSiqRA6zxdzdSmnYDpM1YW60/5fhgHKxqXKUc1zmzOpkM++pyAzWOWOrNGIyVLZKGkQuMlTNwCC9Qd2KFK2BRksaDJWCR86pD7S42OZLEgpVne9f/OWvnfRX1Zo35Op3FqZiwB1AdgFexbT+47BXt4EdT7q+COnjiD9eUm9tSRdGV5SIJYnVPQwdaImVTTqSsqStu/CinLB8TMKSohC1ATriHplJaFaUC3w/8FVC0ZE2EjYQ51mwy4yGs8xFVio8hTJ6cpeRhPqu3rzrAVNEdLTL11cHqv+wi9GDuKDbg/ZYrQajJvOCosrSn1QnoVf1uQuuqragYodKYCQkKv4mLBeK+EGnBc7KlTUEXsRWamIaczNvWm/wo7aJ67YgIH0Gs01KDi0mqjuJ7DDRgVQRtRWOKkZLo4IIV0Z4TOakYKyYDE5J5WOwOYaUBnhNDEr43K0roe/wrngs6WTEEvuXN/HvMFuedgTTzJiuu8sB8dslhGcY2xQsOK+yWomZhNpxUFK/hQgH73gTUiYBqz1LnlRMm7arWY3Nau6+zI8e0O5TTndDukKa8tXRFiVYl6P3ZqzqIYT1UsFjTjhEra/TkHvmuskvP7W862wxI0KztYXsI5ZXC6QhMzO3lNhstJd1uETtfODwpte0ss+hpSwYKe0JaIVLjsiNxPLXvgskIKfE7J4BY0qFZsaSCZ1jS93LAyv5hmCXeW2gMNOm9qu8eqwgx5a7pUy/IecKS3AKD/LBvy0SLBscyAYxqDK4ITUOlfZcI5orknCAHyasCYoP0jDWhOFrCsafRz4kbW8cg5m3BAVBhXQig+JZCLmBd4rFHzhuulU/L9jLGbfdsQEtaUZshuGTsj95zNBC+S8TV3OPpDnLx9AT4MueACjKLJkp13vcfXQNCTVE5GT+Cphhgx7ifnYwm81oECYld2yQwdafwt8XWrYBMOTiOqHsoZLzeG+qyoBCjuUHo/fPfP98Pyw3sus9TsxJu5x/Vd8mJll/zO/ogkrVrr87nwrW7UR3+HuNHYyBJGhCwXZktlkWzQYJs5Wl1e57NHRJYYEA5bCLOaCSOykPvrHF5cb4G6Z8TmPr79b0H7fwZZtMil+d9A+Lvws/DasBsIdoQo2wxRsL9+wJeASlzzrzmeCQInkbMwWvBpwbdWS8G3oGcV4ITmNushV/bxiwf28QrkYgnkcjPI84VtEm1LHTkbNoN2K9zr7nVoey/cbYdBa492d7tBNwr3ImRp7YYv+V0R5/QGeYiPjrZyfle9RSOyIFSSZS2KtM+Ev8KQJEoxCKPlrGItq7CJiQKuzyhMKiAd8k1eH2qNXGkb+Ypcgam8AFP5F0CDPoPVPNUtgqdMtXHW7bz+X25HPdDOV9POlKshRXIKUO9x/6b0qUHolTP43/ABvWN6gh1wR/rZ1WzqHHBHuCfcyQmhYbO1u9vuhk3ihuBC866qSNsNVLVlUNs7U5tulw1zKmhm6XlwHBURi+Y63zAalWM5qTqhaPhZEVD8WPN1wle0Pbz+dmB/q0whlrK8LVUzfCsThQJGOE+37ko9Te2exFFjw8cTLp0lRujOudc81vVsOq0ZeXQsigWd5IIDH6+5JeUD0wwV7HM/mSKPF9csOdArzYzHnA2UbxhzThal1ueZ5lentXLpoz3IZ9hNKKCzf7EUVzNRug/yyVaRfeM79ClnOxOeTseKe8jsveRs5+xbdr1DjzkbNkMaNvdod2T0K0cPUW1O75Pzmbh8l33jsVp3XjwaT6en4+QyFhscG63dcWFQ577uaZyXciefxBmdFXy9hpR+y661wixOKJSdKX4ok2YUF3TKb/g0nlIzzk4rHlPYDsYKPDbrul5ydZ5P4gnNxPVM4UjOF4zT63qruKNX9JKeMuwtziT4bBoUuWG3jcZH7twSesaKRiNvNLbHjcb2TaPhbGdzOEVrPMnzKR8LJ200pNa7NBrbyXy+XcznZ/O5c4eT+4Wesr+4c0rvCFD0LHVuyCn7DVLec+fGXwMAvaX35TDtedg0OhsLzCCJIZ5Z6pyRS+zCK05Ni/AmnZeckLJXlyY7SA+n7E9ISje2v6AS+Svg+isfyx4U01wgVmuEAs1j8IVpVVWt6d6QRdZoOMm+lfgN8J7EzhXWdY06KvP5ihBC33Dnmp5S8C65t8DsXPsJYAY727/UT7GWIe60L2DlMHhWOwwSUnMur/j3/RnBlS2oDhACssmjUQtgFvHXbL3lMYg7pccE3XaWuC1BSJlFr/hFSWrFqm4C0avPuiUpA/9gR7CnmherdASZ16WJ6UBaKbdIL7f0BMLmKhOyzGWmXgLgxprr9OVcmGfVWVOxl8DPczMfyoY4ur9yfxVZlzKhO6ztuKkn6MkPEqkN3tQWmdrka72JUNWEJ7XoVKKFgJIEaTSbUouq3W6mZBOLTJ2XZOpqw0K+BFbtSaaOpuOz+JTmM1USrTNQmwAqvqPf6MUqrcpSJ2k0nHT/ApbKBa6kd2Ylaf/wc1xJ5vM3mNrbWvlxhSTuCvGTkwtYrBdAlLi/AWD0ahnifzuKNdp0VtEmoBoXQGwu6GS5VgtgqwQnS53z+fwMhFcjxGjI/B0RumAP6xTBSRl9CmlCCzQ1nIGvq86g7RnHDrJcbHCfME4Lphakd+vrXiE5WhAq5vOk0iNMNAkrZZgVP8PMCcHtG/n8Yw7LolyZal28UUve0SsqxhnbDugdnADKO6NNvF2kmRhPp3f3V07JNKjKCpXm7CUoU/Il92mpWTpco/aXFhVm3dodrHiYezjkgvV6Xg53pe/S8vKeupXfJJ0OmNhPHBLPGo07x5Zw+Kb6K6UHoDCnE0LhP6AqtEKBt640mw6BcdOUFVwdZ1c8nymcosJIsl9g32vzpq2yBAI25WNZ5k/B0/GCKnpGljCnnsUf5x1REYLTI1Y4xiWsRiXhlQ4wUWG2PXnWSYHF9E3GarxTnjMCdzkrOONULWyWVWqWNQOde7aRS5Xf4VKdC7IoGg3nneFkDB15pzdkFMwvzJ6cOsWyrfTMebe8B6ON7rYGX70zhGTzkcjh28NmtGO0DFjt8zVm+U11Yi6gY4IaTMQlAgQesEtHz3gt82su1Z3D6U5JPnfo/RnXHqvCVmO/r3RM4NfOl/tnUfmtK6R7qye6NkpwrZSqqv7T0pBbBsyNhtyXcT6fSzAa9ysiuL9TPSJHHz/VJC9BpCrVqekqmdxW8/l2Pp9njOU1QhlUSi1FI64iW1P417KmEOUp/zq75sfnMp+dnQMNqDL/tiL0Kv/WBD6BKYYgKLBCqNy8YlZU2eQehoRm073ycETgarnrlWhljkxKqQuWjg/oXec36N07lXx8uShToVuwqyE6Aj6VsHro4El3Rn/lPtoDwMj1vrJYaO3MjxU2y8kuLSl0AklfiYoGxX8HCQ6WNf2jluV2jLz208OskFhjZcDgA0/jQI+aHN9dIw3Q2JP2Mh/3puLPTJ07f3Cyn7IjHi+l7mRCt06AwWBPQPHv14wJC0qfhiU/gFQ77k9XGBU6e2CTQNJXnQkl1jZhbwsWs1kpnCS9r0W7ZIFb0Xi9lXIZw5FR3ZCw9rSlYbmsPj+wkrcZu2k07IwD+/MyCfuyFsnkXrOMfMGKnj0Ak0xXB9Jbo1pyI9WaLi3N2fJKLZZfx5bU8+uDmFTzRkPtuJczsMILapqbOKv8jPFMEGUsBNHnvVqJKMHMPWPcE728PDRn2b6jOaAcsEW4rPwEGtPzLAVzq7jMYosnGRyTUIl28nV6hnVkFVnLPdwHnW3hZ8VRJnD1k/mc90OCPmyddrvZIXRNmENsgUFI/xrmTxGa1yjRywe8R1KXcStsTeLU6MnJfQ6rxWW5xTZtjuBRnlMuxZEwgN3K0y1OysAzklBpdaJSCjqwh6Aefn2Xw7W/U2OohTQp4AE0+oGzSLPO+uhHjG+ys7HKJRruVG/++VhObseSH+YimUnJRXLXaDgfOPtulore1YZctmqr1J1w0mjs5Bjpq44gVpLDX8yOT7kyD2rJNQs6b+rTKDyTfHI4zY3yPieWEjA3/dH5t0MMuIJ4C9rllYNZzbajcEEzmvaqo9X7/FrbV4FiSqTZmT7XBjnM1/IdqYn/pq1h+xn3z8cFjls1Ghtw435djnxIgGWqV5/ciW3Lrkpus3eb+SrcD7au8slsCjYmz/ShN6f/oFnUs+MQHX28DLp3sqhAQBMfWzl5+2KZL0EMQABxneMFFj8aZ1M+AcsrgzKl5AZM5bp+DEOkbVCbFZukVp15kzgLnSx5aVAolfOHc7lJnNes1ZoxwjYnJU4ZOvi8VNv2xHzuCIO6z0tIC1IuenTxAhoAoVlQrkWUNowjcE4VTCScstcUwYqUY4ANW/zqrr4BePFGKNGnZl404iLMgGy+RDRxYLYA2WseppLif6zAZoDC6BDalaoF56FSwvyTHm1vGGupAGo0Nnz8NM1OGw3nO8XYA6UI3d4IRLu5DZ+rBr9TlD1YsjZSuD/Pzs7/HCsuX47lZRwu6C3jFae1Dyx79Ubih880zP49djgb/KJxUyhUJubKwT0h3oECO9SIpi8msVCg7FDMEcoNyb+E//Lgw5d3B0fPvrx4dfzsl2dvextkz7w6LunZUifNgfczDPtiQWeklzJeiRCr9glLJzpXD5zolDKHLYJdOffI/2vp1ogChGLDuCGqshMUGX2dT/P8WgiuO6XheVXCs6zM6MJttRKCVUGIMa5K2AI3UYL2d041kPg/Aa+ROSSCyzgi/8SdhBYYj5Dfbv1q8xvVbpuzHYixKc6qPdZRLEdjDKN6g+3IVzK7csi+cBSJFQXm6YVQ/IxLJyeNRj5g4b70r8ZfnZx2WiRGLqp3M5ZbiuYLpyClTHS7IjIuvWbmFSTR+2vJb7hQhzgZ2wE17wc4EWCKa2pM7dmtpDybuV466bE1qNewTdYojWV3qOTFbKrivy+8sLawEtey/czi/mOMImnvbZaYpEoClaVwTrSd+tM8ueQTi7ZtHFtVTOFGY53752r1WFIZFgT3rurMWXdFR0R0BIP5rL2YwSqidmPeZqXTupW4XxokxoKUjtDnDqdDU+mo7COARm8I8NSrnwAzrLNrMxTTdYP1saCFAiW9pLCNxRlFe/XUnoSEom4LVO+rTAPYUdf4XirLTsSlyG/FFlqx7JBqGeAc7fNYZ3uHKwLFSyAIM/aP+oQ2VCpOFgB50JHNjAZOG9wXPvwr13ZclPq9BaFTnXkD/0Oo0vyjdcizde7c4zjiGcX/6GEQm6nnFX7eL+qMC7IYTybPYCX9nhWKCy6dHdOBHercg4oBLBVBp42TgUtD2ZSIrpJwjkxwljo7yGQAIWk0kERSxdjvvFb+/aLZH0F6v4A14ZQrNBvnTrktzOc6cq2pGj3wd8bJJdRZV8NVWQ1XS9XYCpxMlVrocn2jxmhngdh3b0UITtVSiOBELUUFVmthfadKhxueKRNveKyoznyrFuxsmp+Op8cgZU0UekuEuzTsQmAEukv3aIeGAW3TMKQt8Kpo0rBJIxq2aEjBWepck+5UOQGh1/olwZc7BZL3simhDgpwp7RMymnAGN/vxi3SK9Mw2AMst6sNxcMWlr9aLt+KI13ksmp+GNCQQmdbtEONN4j2AqGtLu206F4HQnHScC+CyKO02W3RdhjR3U6XhkHUomG72aFR0OrSZrAb0Vaw16GdsNWiXSgSRlG3S8MOFIta7d3OiNDTTY23aYfuQgcC7EMLuxFAT6IudiaA/rQ70KVugL2CfNCzTqB7F7VoMLKOBm6UrXfNUicA1aheZsYedInBSJUhE6n6obiQKRMrxa3TUzAvzklZXUlql+ixC/0CtRxXTkptJeuZKpXRwTYToL34H/ST+Gk2nULMXKpcWy/9rg74e38Rnyt6GAf0dRzQF3FATyDhIA7o2zigH+OAfol3dqiKA5rFAX0aB/RlrONVW9vUN1VZKm0JFvb7qgx8chxzOqugQehRLOglhPmOA/okDuh1HNDnsV3XRS2O2+itbUx5bWPKojI0KRpN5/DPDVfXg45halZDLUoZPFRkAaviUDHUla0oWpUJOf0eFEzw8CdT+uE3FiwW9PUDxSpDPcj6e1n4j7LwX0zoh5+Y1A+/styOefJV2Q50Ysj7Xmc+54Nofy+OPD6az3d2LCssVeuhuf+Ffa21144gmLTzbZqd6g1ya8c1W6Ei7s6Ws+MKd4fsVL6KlnXW0pyCo15AS9VVDV+F8JUMot3Ow4agYEjGwl4lstYWXaY+7n8Ycv8ThEmxWntrvmIuDIVEqC5ROhtaCPysWiYaATBCNs1R09duKNBA+r+43Oe8tqL+MMx0IGHQ1n0YZm5oQt1A3SYpgqC+UMxlTfBx9cIGVkm5L/hwCsZ77m/KDUe+Ant0EL2GT5WTkyqBc8a4n1tWah+XwIgjw0OS9f7JEQuwIxCjt3qE2D1Vn7Af4jutfVlCHf/I+9OC8dOljxD4eH8mhnwUzyBeYcfVPpaWgd9Layk+V+4u1WubSubAf+KFNGczZUIWOcp9o7yQ/NcbBQJK2O933ecVIfB9H6lE2CYUiELG41ZEUx6DG5qhKLTgcTPa7ezSKXAoaIQ3Br7klsc5nWjilygH8nQJPa8SBKFw5kE/lJTG5LiD6q90pV36KQ7oJaScws8N/JzBzzv4+cZjL6IX8HgIP6/h5yv8vICfE/g5gJ+38PMMfj7Czxf4eQo/L+HnGH6OdMcK5UQ//w7SHX1VEe4y5UnV+Q/4zqFgDj/POZDgX+KAvoHX9/DzJ4+79K9yIL9B0u/w8wf8CF3VrXJ+VSXRJ/7V+BrPw517BZl+gp9f4ecDjwM4LZVVsejnP6APP170k1X0p39W9BcevwILBK70f6H/WxvA8f9sA6AZOwKr1cz/iTNJM/8DZzk1O0B9bGCtiyNrP9zU6zrnqzonbiGHyhmO8CD6tXLQJP8c3IkCCnZnVakn5YDwfC5WdFp64C2ZHOgRzxQK3b7v89KZ/VY5Noxr13R9dKAGQaMB/ueuW6oadaHKJK0saTziV+qj2RJVBx8Ypsl6xjJXYNzvfj+kOQSqyr4X5qvcK4Zq1DMMDBh4s3woRq5bgl5DQZZQ4DrYtCx5w+jnZSv5sj3oZVa3l5XtcSaG2WiOASSUfurJYY5huPZPgMPiJA5ombTCAUjNATxXrEvfKNak7yEcfZf+qdh7oGduSP+CR/obpHfo74rBDuBGe/QPxZoB/UmxcI/+qphe2PSDYmGbftK5f1HMCykXbLgjOFhxZDjbY3m3Q0FJw8dXW1xMdujODt1Jsyk3Umz90byCEFe9ZKKYpWmWZFyorSt+lWN1mh+sMu2MqBLsQjl3ilCBT1egZRYlnMM90pMYjphFVGKEYdbEh+6I7aK0kAv2RNkXuBh4m6Xf7W7AScQKFraaPR1iXI1Y1/oatlrwPWq36+971neIxg/fd/fq77v29y7WH3V37fprpz/wkMZem042A9PHNrj4CXasnFwQWuBTCqfXqy6H9vFmbcXPbSv+e31YCnb7+7ARDuUoDjFWmxy5uRf2sgHgvoBTStGP2l18idpdYi1Q4Ichgn/ZDuB6DmHlc+tulTWiZxrPGDhY6cYFNJ4iEQT1RD5gaaOR91nqZl5I7uUwHzFhjCQWZUubG/DCugm52kSGTbgSxwdHn7l1Cout1NVQuXBOFVWC0JnYQOUMANphZIfZ91bvMQBsqG4ykH0m9gHEMQ61zom5dED+igbJwWC3pzRbIwZRu70ftduxICOcJOtGm6i92+P9dhghxQsYBEEZgctqeVdBOLIc15x/K678XyNHfc50qaiAo6s6DqOwzKQ0t8YYU/N59SxKNX1okFxz4xw2Zh1CRPPSWWU6MAh6FUkZRLy5H/FmLHrCYxxuFJFMumqYuS4E2MtZ7sp5YO7z8DzwaP0XNBGFNDcPpVthjnFKJLibBEjdb8W/49qk+sKkzxhC1lybdCsec2+Sns9bUV2bBI/WvUm6VnNx0s1YDieCngt6LeidoFeCXgp6KuiNGLFbUc8a+GqxoDZvU+UcBb163hD71JLDrGTB/L85br9Z6jgCuZJMgGdbmY8M4AakekOYOapUSaiHL0/KIXRm7pZFFZOfeR36MjdXJ9lJ5uokyW5EGSL3VNgxcC/FUgTfK2GC9OrXO1Hen3Qt7AuUzsXSDUoTseEKpbyv15vUd7xAJoxJIz+rYQ53KBl8q92TPhukq1UtSPPCDshpz/cdlHK5fw2Gttco4j1nAdhnPsdrqZwD+/tgwLqQw2O209Q3rBFKdPer6rCGoNGwy7/hLHQdKB82dpcatHQt1aqGCsKOJ/YdyKiXLjzCnTfcf07octcVgM7j/vNKQH7uMuGFHRI/VIHOYrvr4UhW2UmxxFGiwKtA4LWobJlVrmSVD2f9tJL1U50Vm/ik30LQoIHXxg1HYHGOuGiD7LVY8UkGdD3C8Kzmv37n/u/c80b0hc4fLoUP+GqFfSl5F92hvpHv5/Oyh8ykNBrAS/eZHArbB08sq0KwbZSGRL8fVosOegM7dl8/fNUeK0d8mLtlx3P4/wrOBnPXpduYRS5/Ij1i6mdlumA5zft9kBrMF0vlc2JvkxgnImPKfw+Muv+n/ztN8P9PtGBm54feIeD/4OxXZZz/E9zZgm2WaUAAih7xoetC7hErUD/yCtsOSIyZPpQ40IM8/ahHcrZcqB/tu24BWs1hXk39KxgStn/KPY+moID1b7jHUsj0gev9WPm/sYKKWvEBVf5XRHoCFF/C8whOSkYF6eUsga1MsNdlEpXL+OJ5MFqt5LFeZdUxM2o3G0r4X3XTMYMeMHyQo32TEJt34oYUC/8KlUj8n1dICpNs+hmW12TBQAYsIr2lrpTd3cD66Dml6FCBMwuBPX6jMzO/Y/z/B73F/3/RCf7/lZ6b2dEiHfugUJrj/hMOSjr9rRiaZfQHH+kJxY3hD+6GPdH/VSFS1PiesWJY6EFCbhj6YNJoOBmb0HPXJRQ/fuAso9uOHEzRNFA36Lpg9EjlALwAnZSNh9K7HUEAi6IC+Sl3WfKzk7kpoTODFpgy09W6KdEO+8E2Oyf3k/xej2/ihT04gdEt9UjmeT3z4nlUP7nhyGWRfplA8rnHIjMj5wMjW2VsAiJ11ss8DzkIWVUabDNZIbjniRHddnI9wkLj7TbLsM8wCifzTCr5udAoRk0CywiVnoe3P4H9wqonjXG5pxkbjrSdKPYjBOb7g0JuF+58EkNpNAaAdSzFbIaBVbihlsyVbhYGABe+4etPnJ0oJ0NtBgSMWSycjAJOwWitzeNgQ6+8EFUAAVSK0cQLtkunrIUdCBhwvk7BwmaXTlkTbiMDdRGMW+9hmnk3YkTOUqxM6ix023HdpA++oYylANqkP93HfQRB6LIkDrZZvu/kCGzrCyhqP3GQs/GNxEmfhYEuG+7qxFi/dU0B6HvGcji7S/etLse5SejoV8cM0FY2vV0FDIAlq8Ci71PbpQVrAWKiaybWX7BmLW5A5PopgGIKWiCwV8uwjqkFjbSfNBqSsYwgb5n2CzLJ75GjwNFImMzq8QMviUywzTwvNaYDgLv7jtxmIE9+pyxNPY/QOgNA8yfrGbLg19Rr0oiQOEUgW1UCqH+ynpdKNMEC2crbtfJ2l/KGId0FuYiBSCJhhrJ9C4KxNAkd/eoYWNv6zWeiPiRiAdEgC1xJm4Qid6d5LWH+/zcYTaP9KJxr+h+gW1RRNKaGcxRm8RUf11cFEGfNxgfgjsM5QdEK3e395xDvDQyOnfrdDUcQphHENv0ejWgChw8BY3Jfc4x6per/HziJnYxNBbAD5nNmjkl+sl9wGpkCbR1ELoHVmHvsFHR2uhzGtAIKRDP2FFRzOhkKQE34X1ci7Eqkxy7rSiRUUuJa0scR90y3gMv7qXwAjATh8Itgw/tcxb8ImsExZwo/CfwUKg4WFL5xCd9a8K0F37rwrbX2rQ3fwg587K597MDHZgQfm5H+qlaq1UXDjv21C1/DBwtbn+FMvMB/axmakZUhai810IywiqgLWUD1CXUEUWs9D3ys88CB/2JUy5pPbRu06GeI/zdo7e/FgUWcXq4wz46D0sEt/yxIg/tjviI+HYvyzPAtZy/1+nwLP7Ohch08bRqVDglgfjJUDTBuBJ7lHHiHt3xkxVEyKWAdZSn/jTyFX2eg7mEBhXN4/xxCJDo6kfwM7/6Tj8fP3n15/eztl2e/P3v57NWxNbZXtXoL1jZsx5pdZFBFT4G2Q3kecjHnwNxT85+JAZP7wpMmtKBicjn3xOSerOS2ThgseUKri7j/uhx5PpCorJMElnC+H4CI9tpjOb0B+2JgPC8o9w8hAk0IvMpLP+X73M8YKH38jBqF1Eb53oXAXzQncVSWRE4jY2c/Xhbo2KF2o3gB/3ILqs83QHWS32OoOO7/xT3uv4afQ7R0EY0GcluH3Dy85vuCydgL8ZtAnuuQD5h08aS00XCQqM4wEPAMYsN5SFZ/4x4eBR+a/xfm/zvwBTrUY3zHsSVCcebBKUVDmPvH/muCKjU01GMwO/4xNgAFXOiWpt6vwQdJ/8e62RtVMUfQNiQawegttDbTiLBhMYCWEnJjzzZ8h7UyIvSBRUKXVodCnuUdiEDbTtW5/huI30d6i0pYeM37f6pGA/cVGLL20XvVh3mp5oxVQ+7BN7GPC+Iv7gmqBn/hRb/sL0X0kptRjJ3E/VdMuArUGq/6wjW54MHj/isK4QBx5l9hevlS1YF5sBaXLVlTvinti+GojrHKll+7t0FNL82iAadK5R9vw2XjrWibKT/jjUZ7t3zq7JVPu83yaS8sn8KgSgzD6rHT6ehHy/lUWFYPCqLjUMsAwvIktVcBdnPJ8Be1TAuC8VqZAPZgwP23BjhvCTUMNqL6CeX+ARX+Byr8S67hdOCixeilwcaP+t9bD1M/wT9YW/4ndKa75Ez4d9zmOf9aUodD94Sf8EYDfv2p2kgRhP+hto26465uCs6q8J/teboscWL9WergZM7natCez1U/KDWbaA7jRYiM29w/mc8RP183Gtvcv5jPO50OYxInpLXN1KZiuIbfLn9p63BsTPrfOIUfAMo2k/4nRCicILpcEHP9omiwKEO0aJLUaDwFo+s+eyocQTZ1Qzdm9VQPYVOmVlTlgQckv/DOwrBJaPm1xp2u60j/0uvCVdv9flcTKOl/BLl/Ppf+M96P9oMYHzr7YYxdeMb3o7hJxZypfr+jx41EUMxZM0LS1ww98a9mSN+Dr6MgVh5M4X4GGkOiv5uTAT9D0p+xkJZdpgaQGrJrgMxSp71rhoTEBrEqwFUjaTM0D2FzzzzBXXZ+wgm+OPDozxQE8SWufpuq/QjfNEnAtFu1H8St5bRzSOsup91BWtghpi1YtJh+qUyKeassmFZTtfZ5LVlroU3yXjUBq7PUioPVlk9h/cym0+1yIFqnbOW4WerbTd03Dai11Sr9DxSmAj6/ByUMzlRnrwo7hJWVHfm7/z84GPKD+ICrZK9EcZBTNdmxIVAdNPifqGCORr0SFB4Mylzq7X9yxUD6V7xX8lDw4kn/EzRzoxwDCmoqRoAAAyP9T5iVGjKIH4CP+X7fFWi0PJYvHqpaYNUuE0sVs2CBwNltwmrYba6N3qBr9VBFzi1JAIxIs1DQc+w6FsdWBPmbbgsWLFS5JoY4VHekZ05ZIr4ivbI+u9d7IfR6L9zc6ztVPfz7en33Q73W3Q0DhHIYPADmqTIpn9wIcafRcJY6st6TajkC+dM9QOJYkoiKpi2w4h8li3qHwM1O+q85PijDc9Q7gGCBWYG/CBx6jBvER9sBq97It835Qa80ogYurtFwnteb3WtOyo/W2aI+TkYC/VUrbj/q06PZELjBkWZ9DTMOgX3LRfortA9hsA2PZu2MaqErfAcVttB5wC4T1G5guty+ipu6BOc/VH15er3QgGk+DBit9bZhg7wwe6+xQYOnTMKN2YJNDUmyCiZIBBEA1IeHHM7znFzLASGyPTPQsEjGXDdHzZv1H2ZBc9rvFSwTg9KbM//4/7yfgVjxlbP3ynMyL4dxfQUZ6LWWNL5yPZRyFNB9OJ855NT8fOVUMDTYDfHNe6PM9DP8iJ0uHwEMJHb+Bl/I/5MI80UMYWWN/FxTFTw5jxgT83kTrCNKxqzT6eDiEfN5ZFlNaN4RM+GyJnp704Ir/FNLTpKo0YpAZYhPiSiVW+YJ9GRaLHAkidtaAHiGzBlGDoYtuYluPc6RcLTgKvWsAt+GG/2F/gcAhFhiSzzuOhEqY3UCKIGBTHmfBfth7ESaMd13/o70WSlLnJFOWuKKdC0vqgwv1mp5sV7Li7oWElt8aWWbsoE91YOG/uN6hAfmwW9JjYEFtISV30sRE8UTAyUvqgVMKlAGtK7lYecKYzqwa/h/bv5/0MnPuf5/ZO6kRb8h5b8yyU9M7urUHKw96oNxfPu09JZwZoytlX+HxiEg0cG/X1hAwxBwdd9r2tqlP1aJH4yDU01wwLjIfwHnLRBIDu4mBdqF2pV9pF34GMM1V6B8oDOIicjpGOgZOjO/5nBHsurf7r+HsJ7nbAy63Gv4B2fTd/iQeuGIXunHUS+FM88veKA9gPNKmgxu8SDjllTKIUXHQ+Gmo212NZ/jowd3o9zhy2ibnetUSLsmSS5UJmbcREGJynPzSaMBTeYjxiBzPuqR3HW1B39O5SA11P83EAdTJuEQMTGqnw0dL1UnjmLToYJ7kgcFCneel1fkKO2z2/00vrUuKzbwd1bvjNHnB2jyZdT83H/GB8G+E2k1lGbmj321boJHBWsFe81O1Gq1do3eEU0rmyHYSIAfBwtByAobwgigpSnG8mZmvuxpq4XyNQxW3pt2ydA02Ix6qv+bQqMMqy61nLdsDuyECT3Rmq1fePXIFRzWro0Q2zjQWYQu4v9GqEmRuiSkmGqEAvXJT8oLe2rAmkaD+IkPJ2qo8Ay6pzzPCswPx6nNn9GW2m27bbcFYWjgmiaG35ru7mDQxPVxU705aZ9l83kLqv6ICsiMpYTEGUuZcNtUuK0+nMqpffuYiMQpnitpqq+Pij5quk8LUR1etfSX9auFEK0RHvokxIvau7Rdnq94YfUsvRZtabvrvC/xsLY+FpvAeQ+e/zVJ720FWNDC07cVVIUXYswQDW83NGB2Q5qAn8NHa0IkzOehprCNxjejxeKVptQDxStVqH8l+KtJzp+oULWo7q9iKZKZXjAo5pcK2bf7KOjHsPvhsc8HoY996wOMT8uV8D6421luAr9ssGaBMiAlggXUETGnq6gNrQjRB6GP0txWBAiAnenn8znydsf+Wy9H5q4crRhIFytAszzzTKhAi1vBckIF3HbtaG037LbzeYCWmGK7yk4MDUpZC/d4wcpPABSKqGX4gJRQ45HltbQVin5pouVht3qPRuy/668hvMFnMxUwf45ES1bJBKGoajxGZeOxf2Am9IJDeCNMcVGbDqM3Dx9do2eH/8IDVTpUVqnO67pEVYUoqxBlFaKS5eCUHiP1eHo64K5weIWd4wjOe84gIFK5Kx/7hx6cLFiHAcf+BWLeEZ5OAOId0UrnrzV6RvF8yPssQUJ7iEztEV06U9AFDxGBz3g/Au7+jBsV+/ppAilLG/75GA9noIOJjt8L7HKChV1AP3g8woMC4NTNCqlvrwFtvGnhlTmuSIFBf8NZlzZJrMXEFv6WZxda/oCXC7jwChHVjBS78nqA0TwuOAIT674wI/+nMMjdCrCbQJEPyqWQmzMGCCTirByo0LyES17DJa/hgkcB63CwV2VereScfkCT1bIKsrQ6HTkA8u1IJOGK4M64BDrZZxA/wxFQA5BuWi7COg8sx3oh6mOP1KJygNpmYRFjhQbzBVMXLZ2ncrmsGl+W2M0JzapQ+ucPyaRiSSB1BDvWfcV50c49CBbRZ+VRGspvf2j9iREU4UALe4Ko85sRCKUWCA1YTeq6YPiVg+HiMYYNfG0OxzCnB8S11B1YHbMtTCAjrAjIVC7XFUmTVqdqKGVuOljDMmF5RYX8vlyKfOE/k0yResDZHPLKMTz9e2XVCnXU/xHqgLBQTsIJPJnpZzj2ErFe8H458w/jmEGRtpaPgZ+az/F7pUNB7BqApUJVFo0GdDdKXYvGsxfcPnrFE0vvjeoZ1D3hWGQJdUOvSl9C3hegsMF/LAJMBaNT2CTWgLGMry+4OUE90LhZwsQg+g9iVqmXh2q0cnIZafEYWDYayCMFpKzdIHLJLVUTXC6dA20ha+VdmEZwy19vQg+D0P8bNMdoNJJ12xGVkl0q9EvlbMCBBc0lO1V2oEkvJHWGJqGZZFe6yBXcKli9XUJcYxMtstOiEXzTb2EroibERiLZnTJ3iwVwpFhVVGz8ApUmZTUdGtLdJgTHCCDMBy2q+iGayG4EP90y/se08pkc+r6fg1YEgpLATTyz1U9N82EswRMwkYTe4lMhCZ0sZZbSZD1fTQbn4z3a2gvbzRGh11g+k4Te4VMqLXehK7l8Cdm/on0eczfsWFfoPZAl6tZ5TuXa0S9u24coYx2gbHWBHPcJLZj0Z3TKJHhODCC2u/Sf49OYSf9M0VsmfaXoBJ3Xpf8O/dfPzZvEt2sm/SMsc8ek/wqfrpj0n+DTJZz+KnrKMs8BS4S3hN6wDHws3oJABZeH5C7a1rQJfccC+o0F9IIF9BAk89gYBfdm/bCtqey2k/fTyqEG6SeEuXfB3tx1R/3+jM5c1kVvFMHGw2ljMjIE+oLV7isUbg5nF3TmsQuqP0BIFMYuyH2CDlTGH0PUmvmw07jAit6V3+hFAzxXL0jZy4tNnbyX/oViYScKjJp/iy/WO/zOZdMGAPYCoGp1b/FdCPxY5Roat8Np4/zHoVGN99u/Y7zfHhyvJlrv6Jhl3inQrG+DcXm+8s0bIxUb3DUalyZSR2Yid04yHfZlS+X5VjqWWxAxcIdWvdmreqN3YB2w8pBde3DxiOgrUrvWlJE6XJcTgw/F8NB1R71S77XFV3zVxIbMeKnJIcu8b9Umc9UX5P6QXbtXno6sw5nwrtD0wuGP74Px2um5rlrJrO9W4bCi6LZz9T8d5tXmYV5Zw9RgvfqPgBURUQ2iXpklwSz0e2/KY80ecBYryYNwNY3owG3Yf2zv39pURWk6LVh5m5Eb7z7ehNSwvs1ZvSCuUy8uMlqtOUudZgQPpppwL6yqWWp1ijemT/9LL+3vtT1+sG3DseX9s0Yj699o29PXbDYYNHu5x17Don/d7zfptIEby4xoBg4l0wOWAe/E8v7Z/pmXu+247Tm5dwZM0luW9W/2b7zMjdq7cdTeheO2Gzh5uGZTHXvHfw7tGJfWG1mfB1j+nvZ+yW4klUzth61WJw5brdZqKJZAR2K5AAPisBvQQxXjZbEQ/QQfv4IV9Av4OYGfA/iZQXCSt/A0gZ9b+DlTsaAKft7Bq4SfZ/DzEX6+wM9T+HkJWY5VHcYlIPSoeoV4AvSVKkOnSEKfQKFvEBuSPofHN/DzXsXKsul7J1fvCO33oxZ4HYaduWXn+01qV1g8jg6q3FVxyykScoZ2jk6LArQs10VZ2zo72naeYLMQQkefQ2H78GoOofr97pxX50/VPL6W7P49AvtPFU8l/UvFY0l/U/FE0t9VfC3pHyqOIMwEIAX9FSDwQcXtvYh+wmK/YOhM+tXUE0A9M6znFus5x3rusJ5wT9fTgXq8UFfUwooCrCi0olC9sGJZaTcCjVcFndIZHdNbOqHn9Jqam9XoDT2jeG8RPaSv6dcqzESH0Bf2ywlL9r/K+LXUbl4s6BV9FrZ7BVz0OCxK/y/tgqI9UL4O1XA6gvgm8OWWwQVXdAyFxgMWokj6dTge9cagnof7kQfjRsO5ZWNU/45L+eDE/0XtO+/YhXRCWFkcfKrZO/0UwhNUzEIakNg4JM5Y2Jv1x6aJ2ag3c13tJnPbn2EbM0KvWUgLFlrjyFLnGpwi6bXHYEz0ujJQBI//1LnG00SQtubzcJuNSf0VKn8xRDN0Xamp88WwgLhQL4bFyIU616AEmqjhFGIXZMMXJcRGbEp6xW1WBjUdg9NNfMEOWUZfsxP/D6XpXg+/hPEFO/H/VPSQnfh/KczxU5ljwtMxhFGFLL/pLL/rLL8qIMdXLMBLlQo2o99YCnM0YXCgF9AbcEK6g5BQt/SM3XkhGpo3Gs6J/0nt3w2YkPHdQEiCZ+L2hxP/g4rvBvCPLJ8eAev3jp1IJ4Mb2uk55Qb1Tvz3itBLaK3wzukpPEzojJ2CLH7qsUvDqThXg8E5cU97OP/fXD5i72qJ/FRPs6km7F01LnvkEmOb6ZOqy33nqsEu4WJ0l12SGIfvuoBxngcThFtTAfin4VdAeBqYFQx1jieWV40zsg2RwI2HGlxXcc5uCf3m6l5PGAzhGl96E/ccUNFBpJq45+Dod92Hw/kembguRZSD3t2Z0v8zIN+wq8aZXhwwme7NiL2TzoTe0m8eJJCFMTy6QodEXFeFd07An++qZ8a0jWMy48TRAYLc2giiCxKzIr+5el5gOW4C/mbIV3eSQ0fZnV7It9Q6xD5ZI2e00ARtikFd9+HYsZ/E8M8N+wmZsm/SARM9SXl9S22VdaCzwnmvjgkbQpDJ0vtiqEYgEvawkhQdpT3t0muYMJ1PV4UVecmDmbemdtjbpb1rr6N3Jkd4stKe6AOuA4tDoG8lu1cCyLwQ5QbbbrUgHlB8IGkKvwv67EdyWdeXyvqs1ZjNw/VWjrZz2HZsI3rlv0crfv9C9ZFHg6QLNUDWi8zn2ysZukGdIQwJsQ3Cv9TtMu6/V/vPZPxWUsHuuYiDhb6qWNlOcMZTFfw7IQAR4f4xuHa6ZWwiE2rGSt+r0ruBnb5bp3eX61G+EFZILXgFUwzBMpqzPX0XD/YwW9AEH/IFLco+I9WXDjCLx4pC7FTAUO4fKVpQjhQt00smZxBDH/xhFSvgSY+rGdndafdy1u5pV07MNCubHpume3CrCZvSF9KJdKPNCPd1bFOYNpWfCpYZndUU3hXYBS64f6YYjA70e4rtUe4rSEghQSrW1v2DNhAZn0odKrO6imasVm7g1Nez7LyCMFlXuYTAp9czBXeC1Qj3Uj7ge76ZJSkj6bSQKUBsnc+1TwD4AqyY1XtRL6l2MFAfQbjLcwVn4TSDh9S4oL+kiMDgEXGBKt1S7ogIvYDA8iyht6yglyDF1tdcmU0Ycpt9GNE81vK7AJOi+7qqWlPzArmmqCHQuL/Z7oRtxqbkHgtdapcMBlEVhX+ijDk8Pr5z4B+dEvoa4uyZqrthXbX20sB/fiIYnONvg70H9GU+d5wTpwt8KwhB4JtC/tUMK0kuyaXkido6x5u+tvDSzJ2ylUqcgla62+zEaRFTcmbCdSdrV6ttLn3gtAi9whrcLl0a9BWhV4OwPZ9fDYS/qkC5zcQkvzWXJa9VLPwXCjaXKyr8rwrV7XAP64kCn7fAQKsdRo3pPsBsL8YpB0AusUsAzriaI6xqSrvb2p0WXh876vZus9XSNSxXYMCdTsdnxVbB1cax1bM6UyA9dhshgeDNWGGj0TK45CyjyQqeRPUYo/iFg34eVs2Xik0frvTbA5U260qbcQm1utJCR0idYqJ/qjv/z7veqltpoS8rlt6vpuktTJPd7s13B7PcDIntkreKnSur6XbddDtG03HTeqPhTBg0TSeDBF8SQiemGuMqBf4a2mcKbB+umOmbB8VIv/pyo8q26RVSwcnDfT8TuvOyPu/Iae5OCJ1AQDyPTeAMfoJA8dhEQ6diAm/gLnkAV1CPsFOPsAMjhBDgBlM1KUvs0hMWANt9xSD+4gTURdZ4Z+CT6b9V/epND+xcDSEZNrKr8pDsqtGY9BOk5P/TsV5ZHdQMlj2j5zija8PerYe9C8OGQ8VHDnu8NOxxNey7/8th35XDNuPt1uPtxlbrOFy9kMpuTLdLvxroR0nyyo1BJltXWXEF8ag3EKvXDlkiWFNgGr6qwWCvEdJyYwpJTZ/Pavps6frqzu4ZWlUVOJTOyha4F1TZ93D/3Rb+6+oU8dAhNOpt2g90e1VRpPxtNL3qWGfiMP1VnijGbfZQkfu3dQ+ioGOGb5iCF04TPh4qtr19AsqJA/g5cSJSiexVD5rLAnuWOl8keH5WGfao3Z0DJyL0ZnnfiuraOnZ6M17aQk/h9pItuGnBnrgF1LgC9b0m9ANGqIFv0GFKthmwDoOw81kbWK9s0oXKJS8b0nrZYvOGiMvR1Lo8mS36IPRb9ThruryHdLmkxYjONkUGi1xnwgpUHU3sam+UA+ymIbj1uirgKbWIaLUPP4Cjex3DM7RgGB8VO3HaBPS+9MBBPu6LSQrLhGdKM0AtiuwQFBpE3c58vi1QbIIig2agoQtJ+ztwbnQ1FncGrDvxaspWLmtFfHF3dZpPi43cxFObDu7VdHBvN9ZxHP2nQMqeqR4xeHyswFYU0l13NGInkHrgmPgyOn+41yNrGYOe8F8CAXgF3sBn8KTg5yW8vlNsFyUaLcFA6oKemud3akGfWfLfJXuBwjvINeEeHdNTKkCueUYFyjXYzhgEI6z4FJ5WOUg4ICiR8kFWaxk4NdHc6y4B56NyYY6MVqR3DbfBqeGJA60T0OM417W/Qp/NSI981ZfemqV0TfphhxzY2TSgDfDM2rjulWdWEHOwKmuIduTa5WFO7OqQt36qVqBwmqkSYSS/5uNNYABOxXQFzN0nrOkC7aJAKfROE+5avQFGrPndroAuTddiMIfEzgtn9wfKhKF74uzCt10dkAvhMxlUU/CI4eGUTTzPYGwJ8auFPkiPgj0tC9YxHxCUxxh+drQJqzwP9sQiE2cQ/tnLUw9J4EYMqxcECNq4Aj5aK+CLtQKelisA0T/U6A8jpx/pF70AntoL4GO1AL74XB/gvmRP4REBd6bXXmWx8pKsrZHlM7WHl4lUrIP1HyNgak4Fe1dPDj2yhvbKPEu1oE/w+WW9uCN6jJSSHtFXemhP7KEd6aFJxV7pJ7U0mA1DKWnhQ4NAkGzcYpf2nL1Y1BYDJjUKSjYDiHUyYJ1GoxhgQOh7YDfQzOVWaw9WdQvPIYQ4sTARk4J/QkKutd9TY7t8ilqBOce+Y9dlTWZ53hHXOXGcu7ouF1+iFiGDgZ2uG13KuLEHB3YeCt13WZ2iZfzrtRx1CrX2/mtaDoJU2pIoaNdTZEbYjOAzwm6NV7SydVrfxWdzRrwBn28VM1U4uN02w1irYEzOsJ76MBbaEf+FAw9awnLZiXk7qFJh1OXzG6X5k6rCqK4wiqs9RGkEkH+DAN+ZePX/8sQ/NEsr9gMb5mdSI4w9WWG7ztysIdpcn6LJ306RqaZVV9MyurzCJgzIa956BdY5MPwmgxdvQmFfegXs2zf1Y/Y/a0OFGp7sOxOPCf8JPWfCP/ImJIaHJ6aBt7XuweZvVyJbT9A0JRum+pYc4c+G5yPquil13XN9ZnHOUg86TitFxt/Xldm1WMw1Ms2GX9acx1tLlxoFwYqIEQXtjdAdprAVY3cKCJe1Yq1VF+9oSSzlhhcCMeXWY4WOd3NLhX+g4H8p1N6WJwxZvVml3i2FyIWVLKoFb0Vv0QEalL6WaP5V7U9jlD7htJ9sY5k1/Sne7PCQ9lRLxyZxtx7MbjmYhi2Tw5BsmbyOS92A0ZG1tksq9yOtd+vWu7GZgUsWUmvzi4K9+ovXXPoUBuaT16oOkku9+2Lp3uilK8+eSnu2y6ui65veHG32hvLg0Xx+u62dqIU+RYqCvUbD0RS6SurG1WOHzOcYfaec61uw6oQluzH0aRl5aNuR/gxPD6Q/M5aC4BPiz8oTBzQpvYQTzRmxTlQ1Akv0mZH+EdPZqPSfoKP1K7CXhvBu/hHBoCDgPqOqkOue9I+oRI+UqoD0j3rVeSKHV0/6T3ocPbG48cSCiqT/xK5KUE6oA5H2yb6zqS2hI3c8YaJsh8SO9J+4jGNyNYon0Gnpv+qXCa9cBqbtltMmmM/Xi4j7Bx44Vh0QWisaSzQLA+q1yrJjMKZ/DauU+291cLjxg8vVhK2x1+Vas7e62Vu0/4cd9rmLypn9TgtjAFm8134Ydas0w9/P56hUMBmidgf8C2FGtX3ILf5eas8g/QxeB5cMzIEvrUv+EKnqyN9IKc6ESY3H5ZNl47RkKX0KViv6IrFTsBOpYvhQrOSURitRFL/9YPHTYaRfzfZ7Omzqd220VFbfWqn+wtHBJ07QHPsAXcDforH2hTHWTnAep0z413QGYLcsqRygSidoGXfAUrSEA5p8ocPvod3ca5ZQAXZwsAOzmRWLHa6k0Wd1Vmx1p9bIaoIBi/Kp7CWeR6cm1Cnce0HAfBfCYKO9bmCMiyvzpzI4fW/W58jPWLYEVqRLbR7IiWf51hzg+TTUysEg0CJYbx3zYbcxg0+7jZl985VlVqZP1/e9KNaGYkf6Qo0OfSU33TrIwg5V7EiaWwfhxouRvlxwIqxbLHREdXObA6ctgmG0TRHtalBGbCRkcQ72BlBnbZhbZq0ubFEDOOb0vNLo0GSAK6Bwj9IZB1Wwva2yhuIaJTETGt+6lSnFa14ln/JxgRduL7fZN6NqNJa6zZdOip/I5btmXkmnGdEjiVdqzabTOqd0alOCa+Ho6yfuIECbsfPR3u/CwqWxcnbgevqtVF9LvLXjClJfeGlbJ+bYf3l3D0EZygGVd/jag54q5x7v2nXI/YKq8n5a0DiSezGfgy+wQ7S9aQIytIbupbDvNS3KqPdFPyvvOyj3LjPnZbpXUHNH3tTmcApauFKzc4l/waY08cHUOvFfs2lZY+K/rm5ukUz55wC1DBzIYKCJf8IkTfwDLPaWybJYGZf0FHxWA4L+GqYvid50i0FQ3iiyHYI5x42Ipe2nU8CldQhFvMv9ns/nDmfbOuSFhq6EkOG9DBLT6v55geyZNtABmLFtK0YRhO1emdxrmSccjBXwLuCtHRcikmZiPJ3e3WfzeQ63hi1K+BvjLpfBRe3pVN8yh67fwIfUE7QyiSlOYmnIZtaOhqUsYZn6J0zQFGGZ+m+Z2ADLFPz1k+qTl2pYJkuwzBGWwoZl8vewFAhLCYlZBcu8hmWt7loHIYIr+zY2bqrrcJQAR7Ah0xjN/TPhpOWaS3DNJSt1cjGxllwCV0FbgWLl8tV8Dy2o6q5UVQ2J+zeiVHKRuoe8AgSpZpbcQ6PbljnW/aK85BxIQqzoOwEX+3HtNlwf9+ubpo/G0ylIcuCouPbx0zQ7xR3zKU++V3DDZyjaA55vwiGw0B+EFnya+tCll/lkNuVsXNyJZIuzwb1qNPRd9MoEXnC+01FwxM8xy3c6xXKI03//YCXxpg1rZ8LT6Vjxndpg3QLrhq87Z9+y6x24zroZxuV3T45vMc0L23EIQfxVo7EjZlenXMIV43fXIEYAW3vDp/vmP1j3GlR5Ip37a4FLYO2eO7gnuY728ZLhdagULpmjdyLmVgmUEliXSvAoytlzuILWrL9Um2Ru89rMCD0av7CdHQpxiXVw2w6hsh/oSPrA2/e9sF2XkMyTWpEuB2Ebb6mIqPRY2MEVk/fD+Twf7M3n3W2YftnvzucSTWNUHwzp4FMGT9mgNZ93GZONRrjN0roFneZItlfuMTjacvgJxAx4yRKa+MeM0wQCWbUimkA4pJQmVlShxL9E+o/STeJf0sQvOEv8Iy+kiT/lLHd3aeLPuP4+hcrGkAHCbNPEv+XMgeTqLlnIzKrLUxOQfxKIlmRMyk3CuZUw45DyCjega2wndzs08T9UBmE/wwfIdMWZfoFWGg2oGH7P8ffDvpNAAKbE/1BTzrLkLyyBsLWmbM4hEgy8gBFV4j+DgECJ/xHuG0n8PzmQ8bVL8NYj1hhoY+woYP0c7r8Ax2Y0UEKMAbklotrCUvmfyvhNEMsJjPV4P0AjSohSpTBKFQSbYhED2zy+396FS3dBTipT8Dg91ofcCmJ5edFSTxFXBTpiVzGmBuxXRZZ9tX5V9nVN+gJWlEshxb7FdS275t6ggAkiJ7ExWTdmbqddrkEn2hc/LTUqNzS6UmSt4U9c39thNfzTpoZ/qmv5tNbwp40NLxWxG4YgOczcJItBccxdsomgSlC4N4H+riiYZWMYnTqrrLIWggpBA/pHlU9Y+T7xpetpJeT8ScEdFvaNYPq6sEDH4lk4EHwOYvhUyz9AMmXjBUQEYXBV6xE9MvEBjjn7IoYcY+ClIH1/sRIySHhqJSSQ8NJKKJQOtBLoQD86hAD+e1f5w2PwAOMUf1BFcAAdg/+S6OhLcOeGCbNHzXXoXotQjMtGvRYhsdda4D0RXSpoFzjRUxH/JuiZiH8XC6Lvvulp2UJmanw6hYDX5aOWqSQfT8yH8tG/zq758bnMZ2fnDjAjwDR8Z8/8/p64TiLWv/39flgmdlpWcicO24/Z/dC3bDt8cAOszHJXtztNuQzP6sG5dEXopK4V47e8hPBpuLugT16+r21stGvaxktadVMoJy9trtpPXJntVPXhWrrqu0DN2XtlekIV85SxhmJt11GDQYvoDNshVf0WXMunwFOY9MqowO/V/hIUcQeHLVcNck22a70g+PlI/1LHX5QY7E+HE0TF2iWEjXtoF6gUAE5J7o+Q3L/CX9AA/nDRchtR/oGq9xJV39YQNsrd4gLMuHGENfQVWiaFVPmvzf+veLKmwIoWc6NqwtxOPuFTrvgWhBqEa7ext8/xF23GX4GWUVVPL6unb0qLH/rUThOg6gfCHwvz/1TELyWs12O50GRqebWqh1ar+u5qXZAF6f1//z8=")),t=>t({workerURI:t=>{const n="text/javascript";let r=w();if("string"==typeof r&&(r=(new TextEncoder).encode(r)),t){const t=new Blob([r],{type:n});return URL.createObjectURL(t)}return "data:"+n+";base64,"+function(t){let n="";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];n+=z$1[r>>18&63]+z$1[r>>12&63]+z$1[r>>6&63]+z$1[63&r];}const o=r-e;if(1===o){const r=t[e]<<16;n+=z$1[r>>18&63]+z$1[r>>12&63]+"==";}else if(2===o){const r=t[e]<<16|t[e+1]<<8;n+=z$1[r>>18&63]+z$1[r>>12&63]+z$1[r>>6&63]+"=";}return n}(r)}}));var w;
443
443
 
444
444
  /*
445
445
  Copyright (c) 2026 Gildas Lormeau. All rights reserved.
@@ -569,7 +569,7 @@ for (let n = 0; n < 256; n++) {
569
569
  T$1[k][n] = (previous >>> 8) ^ T$1[0][previous & 0xFF];
570
570
  }
571
571
  }
572
- const [T0, T1, T2, T3, T4, T5, T6, T7] = T$1;
572
+ const [T0$1, T1$1, T2$1, T3$1, T4, T5, T6, T7] = T$1;
573
573
 
574
574
  class Crc32 {
575
575
 
@@ -591,12 +591,12 @@ class Crc32 {
591
591
  const a = crc ^ view.getInt32(offset, true);
592
592
  const b = view.getInt32(offset + 4, true);
593
593
  crc = T7[a & 0xFF] ^ T6[(a >>> 8) & 0xFF] ^ T5[(a >>> 16) & 0xFF] ^ T4[(a >>> 24) & 0xFF] ^
594
- T3[b & 0xFF] ^ T2[(b >>> 8) & 0xFF] ^ T1[(b >>> 16) & 0xFF] ^ T0[(b >>> 24) & 0xFF];
594
+ T3$1[b & 0xFF] ^ T2$1[(b >>> 8) & 0xFF] ^ T1$1[(b >>> 16) & 0xFF] ^ T0$1[(b >>> 24) & 0xFF];
595
595
  }
596
596
  }
597
597
  // Remaining tail (and non-typed inputs) byte-at-a-time with the base table.
598
598
  for (; offset < length; offset++) {
599
- crc = (crc >>> 8) ^ T0[(crc ^ data[offset]) & 0xFF];
599
+ crc = (crc >>> 8) ^ T0$1[(crc ^ data[offset]) & 0xFF];
600
600
  }
601
601
  this.crc = crc;
602
602
  }
@@ -700,794 +700,487 @@ function encodeText(value) {
700
700
  }
701
701
  }
702
702
 
703
- // Derived from https://github.com/xqdoo00o/jszip/blob/master/lib/sjcl.js and https://github.com/bitwiseshiftleft/sjcl
704
-
705
- // deno-lint-ignore-file no-this-alias
706
-
707
703
  /*
708
- * SJCL is open. You can use, modify and redistribute it under a BSD
709
- * license or under the GNU GPL, version 2.0.
710
- */
711
-
712
- /** @fileOverview Javascript cryptography implementation.
713
- *
714
- * Crush to remove comments, shorten variable names and
715
- * generally reduce transmission size.
716
- *
717
- * @author Emily Stark
718
- * @author Mike Hamburg
719
- * @author Dan Boneh
720
- */
721
-
722
- /*jslint indent: 2, bitwise: false, nomen: false, plusplus: false, white: false, regexp: false */
723
-
724
- /** @fileOverview Arrays of bits, encoded as arrays of Numbers.
725
- *
726
- * @author Emily Stark
727
- * @author Mike Hamburg
728
- * @author Dan Boneh
729
- */
730
-
731
- /**
732
- * Arrays of bits, encoded as arrays of Numbers.
733
- * @namespace
734
- * @description
735
- * <p>
736
- * These objects are the currency accepted by SJCL's crypto functions.
737
- * </p>
738
- *
739
- * <p>
740
- * Most of our crypto primitives operate on arrays of 4-byte words internally,
741
- * but many of them can take arguments that are not a multiple of 4 bytes.
742
- * This library encodes arrays of bits (whose size need not be a multiple of 8
743
- * bits) as arrays of 32-bit words. The bits are packed, big-endian, into an
744
- * array of words, 32 bits at a time. Since the words are double-precision
745
- * floating point numbers, they fit some extra data. We use this (in a private,
746
- * possibly-changing manner) to encode the number of bits actually present
747
- * in the last word of the array.
748
- * </p>
749
- *
750
- * <p>
751
- * Because bitwise ops clear this out-of-band data, these arrays can be passed
752
- * to ciphers like AES which want arrays of words.
753
- * </p>
754
- */
755
- const bitArray = {
756
- /**
757
- * Concatenate two bit arrays.
758
- * @param {bitArray} a1 The first array.
759
- * @param {bitArray} a2 The second array.
760
- * @return {bitArray} The concatenation of a1 and a2.
761
- */
762
- concat(a1, a2) {
763
- if (a1.length === 0 || a2.length === 0) {
764
- return a1.concat(a2);
765
- }
766
-
767
- const last = a1[a1.length - 1], shift = bitArray.getPartial(last);
768
- if (shift === 32) {
769
- return a1.concat(a2);
770
- } else {
771
- return bitArray._shiftRight(a2, shift, last | 0, a1.slice(0, a1.length - 1));
772
- }
773
- },
774
-
775
- /**
776
- * Find the length of an array of bits.
777
- * @param {bitArray} a The array.
778
- * @return {Number} The length of a, in bits.
779
- */
780
- bitLength(a) {
781
- const l = a.length;
782
- if (l === 0) {
783
- return 0;
784
- }
785
- const x = a[l - 1];
786
- return (l - 1) * 32 + bitArray.getPartial(x);
787
- },
788
-
789
- /**
790
- * Truncate an array.
791
- * @param {bitArray} a The array.
792
- * @param {Number} len The length to truncate to, in bits.
793
- * @return {bitArray} A new array, truncated to len bits.
794
- */
795
- clamp(a, len) {
796
- if (a.length * 32 < len) {
797
- return a;
798
- }
799
- a = a.slice(0, Math.ceil(len / 32));
800
- const l = a.length;
801
- len = len & 31;
802
- if (l > 0 && len) {
803
- a[l - 1] = bitArray.partial(len, a[l - 1] & 0x80000000 >> (len - 1), 1);
804
- }
805
- return a;
806
- },
807
-
808
- /**
809
- * Make a partial word for a bit array.
810
- * @param {Number} len The number of bits in the word.
811
- * @param {Number} x The bits.
812
- * @param {Number} [_end=0] Pass 1 if x has already been shifted to the high side.
813
- * @return {Number} The partial word.
814
- */
815
- partial(len, x, _end) {
816
- if (len === 32) {
817
- return x;
818
- }
819
- return (_end ? x | 0 : x << (32 - len)) + len * 0x10000000000;
820
- },
704
+ Copyright (c) 2026 Gildas Lormeau. All rights reserved.
821
705
 
822
- /**
823
- * Get the number of bits used by a partial word.
824
- * @param {Number} x The partial word.
825
- * @return {Number} The number of bits used by the partial word.
826
- */
827
- getPartial(x) {
828
- return Math.round(x / 0x10000000000) || 32;
829
- },
706
+ Redistribution and use in source and binary forms, with or without
707
+ modification, are permitted provided that the following conditions are met:
830
708
 
831
- /** Shift an array right.
832
- * @param {bitArray} a The array to shift.
833
- * @param {Number} shift The number of bits to shift.
834
- * @param {Number} [carry=0] A byte to carry in
835
- * @param {bitArray} [out=[]] An array to prepend to the output.
836
- * @private
837
- */
838
- _shiftRight(a, shift, carry, out) {
839
- if (out === undefined) {
840
- out = [];
841
- }
709
+ 1. Redistributions of source code must retain the above copyright notice,
710
+ this list of conditions and the following disclaimer.
842
711
 
843
- for (; shift >= 32; shift -= 32) {
844
- out.push(carry);
845
- carry = 0;
846
- }
847
- if (shift === 0) {
848
- return out.concat(a);
849
- }
712
+ 2. Redistributions in binary form must reproduce the above copyright
713
+ notice, this list of conditions and the following disclaimer in
714
+ the documentation and/or other materials provided with the distribution.
850
715
 
851
- for (let i = 0; i < a.length; i++) {
852
- out.push(carry | a[i] >>> shift);
853
- carry = a[i] << (32 - shift);
854
- }
855
- const last2 = a.length ? a[a.length - 1] : 0;
856
- const shift2 = bitArray.getPartial(last2);
857
- out.push(bitArray.partial(shift + shift2 & 31, (shift + shift2 > 32) ? carry : out.pop(), 1));
858
- return out;
859
- }
860
- };
716
+ 3. The names of the authors may not be used to endorse or promote products
717
+ derived from this software without specific prior written permission.
861
718
 
862
- /** @fileOverview Bit array codec implementations.
863
- *
864
- * @author Emily Stark
865
- * @author Mike Hamburg
866
- * @author Dan Boneh
719
+ THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
720
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
721
+ FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT,
722
+ INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
723
+ INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
724
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
725
+ OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
726
+ LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
727
+ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
728
+ EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
867
729
  */
868
730
 
869
- /**
870
- * Arrays of bytes
871
- * @namespace
872
- */
873
- const codec = {
874
- bytes: {
875
- /** Convert from a bitArray to an array of bytes. */
876
- fromBits(arr) {
877
- const bl = bitArray.bitLength(arr);
878
- const byteLength = bl / 8;
879
- const out = new Uint8Array(byteLength);
880
- let tmp;
881
- for (let i = 0; i < byteLength; i++) {
882
- if ((i & 3) === 0) {
883
- tmp = arr[i / 4];
884
- }
885
- out[i] = tmp >>> 24;
886
- tmp <<= 8;
887
- }
888
- return out;
889
- },
890
- /** Convert from an array of bytes to a bitArray. */
891
- toBits(bytes) {
892
- const out = [];
893
- let i;
894
- let tmp = 0;
895
- for (i = 0; i < bytes.length; i++) {
896
- tmp = tmp << 8 | bytes[i];
897
- if ((i & 3) === 3) {
898
- out.push(tmp);
899
- tmp = 0;
900
- }
731
+ const BLOCK_LENGTH$1 = 16;
732
+ const ROUND_KEYS_LENGTH = 60;
733
+ const SHA1_BLOCK_LENGTH = 64;
734
+ const SHA1_DIGEST_LENGTH = 20;
735
+ const SHA1_SCHEDULE_LENGTH = 16;
736
+ const SHA1_LENGTH_OFFSET = 56;
737
+ const SHA1_PADDING = new Uint8Array([0x80]);
738
+ const SHA1_ZERO = new Uint8Array(1);
739
+ const SHA1_INITIAL_STATE = new Int32Array([0x67452301, 0xEFCDAB89, 0x98BADCFE, 0x10325476, 0xC3D2E1F0]);
740
+ const HMAC_INNER_PADDING = 0x36;
741
+ const HMAC_OUTER_PADDING = 0x5c;
742
+ const S_BOX = new Uint8Array(256);
743
+ const T0 = new Int32Array(256);
744
+ const T1 = new Int32Array(256);
745
+ const T2 = new Int32Array(256);
746
+ const T3 = new Int32Array(256);
747
+
748
+ let tablesInitialized = false;
749
+
750
+ function createEngine$1(key, authenticationKey) {
751
+ initTables();
752
+ const roundKeys = new Int32Array(ROUND_KEYS_LENGTH);
753
+ const rounds = expandKey(key, roundKeys);
754
+ const keystream = new Int32Array(BLOCK_LENGTH$1 / 4);
755
+ const hmac = createHmac(authenticationKey);
756
+ let counter0 = 0;
757
+ let counter1 = 0;
758
+ let counter2 = 0;
759
+ let counter3 = 0;
760
+ return {
761
+ process(data, decrypt) {
762
+ if (decrypt) {
763
+ hmac.update(data, 0, data.length);
901
764
  }
902
- if (i & 3) {
903
- out.push(bitArray.partial(8 * (i & 3), tmp));
765
+ encrypt(data);
766
+ if (!decrypt) {
767
+ hmac.update(data, 0, data.length);
904
768
  }
905
- return out;
769
+ },
770
+ digest() {
771
+ return hmac.digest();
906
772
  }
907
- }
908
- };
909
-
910
- const hash = {};
911
-
912
- /**
913
- * Context for a SHA-1 operation in progress.
914
- * @constructor
915
- */
916
- hash.sha1 = class {
917
- constructor(hash) {
918
- const sha1 = this;
919
- /**
920
- * The hash's block size, in bits.
921
- * @constant
922
- */
923
- sha1.blockSize = 512;
924
- /**
925
- * The SHA-1 initialization vector.
926
- * @private
927
- */
928
- sha1._init = [0x67452301, 0xEFCDAB89, 0x98BADCFE, 0x10325476, 0xC3D2E1F0];
929
- /**
930
- * The SHA-1 hash key.
931
- * @private
932
- */
933
- sha1._key = [0x5A827999, 0x6ED9EBA1, 0x8F1BBCDC, 0xCA62C1D6];
934
- if (hash) {
935
- sha1._h = hash._h.slice(0);
936
- sha1._buffer = hash._buffer.slice(0);
937
- sha1._length = hash._length;
938
- } else {
939
- sha1.reset();
940
- }
941
- }
942
-
943
- /**
944
- * Reset the hash state.
945
- * @return this
946
- */
947
- reset() {
948
- const sha1 = this;
949
- sha1._h = sha1._init.slice(0);
950
- sha1._buffer = [];
951
- sha1._length = 0;
952
- return sha1;
953
- }
954
-
955
- /**
956
- * Input several words to the hash.
957
- * @param {bitArray|String} data the data to hash.
958
- * @return this
959
- */
960
- update(data) {
961
- const sha1 = this;
962
- if (typeof data === "string") {
963
- data = codec.utf8String.toBits(data);
964
- }
965
- const b = sha1._buffer = bitArray.concat(sha1._buffer, data);
966
- const ol = sha1._length;
967
- const nl = sha1._length = ol + bitArray.bitLength(data);
968
- if (nl > 9007199254740991) {
969
- throw new Error("Cannot hash more than 2^53 - 1 bits");
970
- }
971
- const c = new Uint32Array(b);
972
- let j = 0;
973
- for (let i = sha1.blockSize + ol - ((sha1.blockSize + ol) & (sha1.blockSize - 1)); i <= nl;
974
- i += sha1.blockSize) {
975
- sha1._block(c.subarray(16 * j, 16 * (j + 1)));
976
- j += 1;
977
- }
978
- b.splice(0, 16 * j);
979
- return sha1;
980
- }
981
-
982
- /**
983
- * Complete hashing and output the hash value.
984
- * @return {bitArray} The hash value, an array of 5 big-endian words. TODO
985
- */
986
- finalize() {
987
- const sha1 = this;
988
- let b = sha1._buffer;
989
- const h = sha1._h;
990
-
991
- // Round out and push the buffer
992
- b = bitArray.concat(b, [bitArray.partial(1, 1)]);
993
- // Round out the buffer to a multiple of 16 words, less the 2 length words.
994
- for (let i = b.length + 2; i & 15; i++) {
995
- b.push(0);
996
- }
997
-
998
- // append the length
999
- b.push(Math.floor(sha1._length / 0x100000000));
1000
- b.push(sha1._length | 0);
1001
-
1002
- while (b.length) {
1003
- sha1._block(b.splice(0, 16));
1004
- }
1005
-
1006
- sha1.reset();
1007
- return h;
1008
- }
1009
-
1010
- /**
1011
- * The SHA-1 logical functions f(0), f(1), ..., f(79).
1012
- * @private
1013
- */
1014
- _f(t, b, c, d) {
1015
- if (t <= 19) {
1016
- return (b & c) | (~b & d);
1017
- } else if (t <= 39) {
1018
- return b ^ c ^ d;
1019
- } else if (t <= 59) {
1020
- return (b & c) | (b & d) | (c & d);
1021
- } else if (t <= 79) {
1022
- return b ^ c ^ d;
1023
- }
1024
- }
1025
-
1026
- /**
1027
- * Circular left-shift operator.
1028
- * @private
1029
- */
1030
- _S(n, x) {
1031
- return (x << n) | (x >>> 32 - n);
1032
- }
1033
-
1034
- /**
1035
- * Perform one cycle of SHA-1.
1036
- * @param {Uint32Array|bitArray} words one block of words.
1037
- * @private
1038
- */
1039
- _block(words) {
1040
- const sha1 = this;
1041
- const h = sha1._h;
1042
- // When words is passed to _block, it has 16 elements. SHA1 _block
1043
- // function extends words with new elements (at the end there are 80 elements).
1044
- // The problem is that if we use Uint32Array instead of Array,
1045
- // the length of Uint32Array cannot be changed. Thus, we replace words with a
1046
- // normal Array here.
1047
- const w = Array(80); // do not use Uint32Array here as the instantiation is slower
1048
- for (let j = 0; j < 16; j++) {
1049
- w[j] = words[j];
1050
- }
1051
-
1052
- let a = h[0];
1053
- let b = h[1];
1054
- let c = h[2];
1055
- let d = h[3];
1056
- let e = h[4];
1057
-
1058
- for (let t = 0; t <= 79; t++) {
1059
- if (t >= 16) {
1060
- w[t] = sha1._S(1, w[t - 3] ^ w[t - 8] ^ w[t - 14] ^ w[t - 16]);
1061
- }
1062
- const tmp = (sha1._S(5, a) + sha1._f(t, b, c, d) + e + w[t] +
1063
- sha1._key[Math.floor(t / 20)]) | 0;
1064
- e = d;
1065
- d = c;
1066
- c = sha1._S(30, b);
1067
- b = a;
1068
- a = tmp;
1069
- }
1070
-
1071
- h[0] = (h[0] + a) | 0;
1072
- h[1] = (h[1] + b) | 0;
1073
- h[2] = (h[2] + c) | 0;
1074
- h[3] = (h[3] + d) | 0;
1075
- h[4] = (h[4] + e) | 0;
1076
- }
1077
- };
1078
-
1079
- /** @fileOverview Low-level AES implementation.
1080
- *
1081
- * This file contains a low-level implementation of AES, optimized for
1082
- * size and for efficiency on several browsers. It is based on
1083
- * OpenSSL's aes_core.c, a public-domain implementation by Vincent
1084
- * Rijmen, Antoon Bosselaers and Paulo Barreto.
1085
- *
1086
- * An older version of this implementation is available in the public
1087
- * domain, but this one is (c) Emily Stark, Mike Hamburg, Dan Boneh,
1088
- * Stanford University 2008-2010 and BSD-licensed for liability
1089
- * reasons.
1090
- *
1091
- * @author Emily Stark
1092
- * @author Mike Hamburg
1093
- * @author Dan Boneh
1094
- */
1095
-
1096
- const cipher = {};
1097
-
1098
- /**
1099
- * Schedule out an AES key for both encryption and decryption. This
1100
- * is a low-level class. Use a cipher mode to do bulk encryption.
1101
- *
1102
- * @constructor
1103
- * @param {Array} key The key as an array of 4, 6 or 8 words.
1104
- */
1105
- cipher.aes = class {
1106
- constructor(key) {
1107
- /**
1108
- * The expanded S-box and inverse S-box tables. These will be computed
1109
- * on the client so that we don't have to send them down the wire.
1110
- *
1111
- * There are two tables, _tables[0] is for encryption and
1112
- * _tables[1] is for decryption.
1113
- *
1114
- * The first 4 sub-tables are the expanded S-box with MixColumns. The
1115
- * last (_tables[01][4]) is the S-box itself.
1116
- *
1117
- * @private
1118
- */
1119
- const aes = this;
1120
- aes._tables = [[[], [], [], [], []], [[], [], [], [], []]];
1121
-
1122
- if (!aes._tables[0][0][0]) {
1123
- aes._precompute();
1124
- }
1125
-
1126
- const sbox = aes._tables[0][4];
1127
- const decTable = aes._tables[1];
1128
- const keyLen = key.length;
1129
-
1130
- let i, encKey, decKey, rcon = 1;
1131
-
1132
- if (keyLen !== 4 && keyLen !== 6 && keyLen !== 8) {
1133
- throw new Error("invalid aes key size");
1134
- }
1135
-
1136
- aes._key = [encKey = key.slice(0), decKey = []];
1137
-
1138
- // schedule encryption keys
1139
- for (i = keyLen; i < 4 * keyLen + 28; i++) {
1140
- let tmp = encKey[i - 1];
1141
-
1142
- // apply sbox
1143
- if (i % keyLen === 0 || (keyLen === 8 && i % keyLen === 4)) {
1144
- tmp = sbox[tmp >>> 24] << 24 ^ sbox[tmp >> 16 & 255] << 16 ^ sbox[tmp >> 8 & 255] << 8 ^ sbox[tmp & 255];
1145
-
1146
- // shift rows and add rcon
1147
- if (i % keyLen === 0) {
1148
- tmp = tmp << 8 ^ tmp >>> 24 ^ rcon << 24;
1149
- rcon = rcon << 1 ^ (rcon >> 7) * 283;
1150
- }
1151
- }
773
+ };
1152
774
 
1153
- encKey[i] = encKey[i - keyLen] ^ tmp;
775
+ function encrypt(data) {
776
+ const view = new DataView(data.buffer, data.byteOffset, data.byteLength);
777
+ const length = data.length;
778
+ let offset = 0;
779
+ for (; offset + BLOCK_LENGTH$1 <= length; offset += BLOCK_LENGTH$1) {
780
+ nextKeystream();
781
+ view.setInt32(offset, view.getInt32(offset) ^ keystream[0]);
782
+ view.setInt32(offset + 4, view.getInt32(offset + 4) ^ keystream[1]);
783
+ view.setInt32(offset + 8, view.getInt32(offset + 8) ^ keystream[2]);
784
+ view.setInt32(offset + 12, view.getInt32(offset + 12) ^ keystream[3]);
1154
785
  }
1155
-
1156
- // schedule decryption keys
1157
- for (let j = 0; i; j++, i--) {
1158
- const tmp = encKey[j & 3 ? i : i - 4];
1159
- if (i <= 4 || j < 4) {
1160
- decKey[j] = tmp;
1161
- } else {
1162
- decKey[j] = decTable[0][sbox[tmp >>> 24]] ^
1163
- decTable[1][sbox[tmp >> 16 & 255]] ^
1164
- decTable[2][sbox[tmp >> 8 & 255]] ^
1165
- decTable[3][sbox[tmp & 255]];
1166
- }
1167
- }
1168
- }
1169
- // public
1170
- /* Something like this might appear here eventually
1171
- name: "AES",
1172
- blockSize: 4,
1173
- keySizes: [4,6,8],
1174
- */
1175
-
1176
- /**
1177
- * Encrypt an array of 4 big-endian words.
1178
- * @param {Array} data The plaintext.
1179
- * @return {Array} The ciphertext.
1180
- */
1181
- encrypt(data) {
1182
- return this._crypt(data, 0);
1183
- }
1184
-
1185
- /**
1186
- * Decrypt an array of 4 big-endian words.
1187
- * @param {Array} data The ciphertext.
1188
- * @return {Array} The plaintext.
1189
- */
1190
- decrypt(data) {
1191
- return this._crypt(data, 1);
1192
- }
1193
-
1194
- /**
1195
- * Expand the S-box tables.
1196
- *
1197
- * @private
1198
- */
1199
- _precompute() {
1200
- const encTable = this._tables[0];
1201
- const decTable = this._tables[1];
1202
- const sbox = encTable[4];
1203
- const sboxInv = decTable[4];
1204
- const d = [];
1205
- const th = [];
1206
- let xInv, x2, x4, x8;
1207
-
1208
- // Compute double and third tables
1209
- for (let i = 0; i < 256; i++) {
1210
- th[(d[i] = i << 1 ^ (i >> 7) * 283) ^ i] = i;
1211
- }
1212
-
1213
- for (let x = xInv = 0; !sbox[x]; x ^= x2 || 1, xInv = th[xInv] || 1) {
1214
- // Compute sbox
1215
- let s = xInv ^ xInv << 1 ^ xInv << 2 ^ xInv << 3 ^ xInv << 4;
1216
- s = s >> 8 ^ s & 255 ^ 99;
1217
- sbox[x] = s;
1218
- sboxInv[s] = x;
1219
-
1220
- // Compute MixColumns
1221
- x8 = d[x4 = d[x2 = d[x]]];
1222
- let tDec = x8 * 0x1010101 ^ x4 * 0x10001 ^ x2 * 0x101 ^ x * 0x1010100;
1223
- let tEnc = d[s] * 0x101 ^ s * 0x1010100;
1224
-
1225
- for (let i = 0; i < 4; i++) {
1226
- encTable[i][x] = tEnc = tEnc << 24 ^ tEnc >>> 8;
1227
- decTable[i][s] = tDec = tDec << 24 ^ tDec >>> 8;
1228
- }
1229
- }
1230
-
1231
- // Compactify. Considerable speedup on Firefox.
1232
- for (let i = 0; i < 5; i++) {
1233
- encTable[i] = encTable[i].slice(0);
1234
- decTable[i] = decTable[i].slice(0);
1235
- }
1236
- }
1237
-
1238
- /**
1239
- * Encryption and decryption core.
1240
- * @param {Array} input Four words to be encrypted or decrypted.
1241
- * @param dir The direction, 0 for encrypt and 1 for decrypt.
1242
- * @return {Array} The four encrypted or decrypted words.
1243
- * @private
1244
- */
1245
- _crypt(input, dir) {
1246
- if (input.length !== 4) {
1247
- throw new Error("invalid aes block size");
1248
- }
1249
-
1250
- const key = this._key[dir];
1251
-
1252
- const nInnerRounds = key.length / 4 - 2;
1253
- const out = [0, 0, 0, 0];
1254
- const table = this._tables[dir];
1255
-
1256
- // load up the tables
1257
- const t0 = table[0];
1258
- const t1 = table[1];
1259
- const t2 = table[2];
1260
- const t3 = table[3];
1261
- const sbox = table[4];
1262
-
1263
- // state variables a,b,c,d are loaded with pre-whitened data
1264
- let a = input[0] ^ key[0];
1265
- let b = input[dir ? 3 : 1] ^ key[1];
1266
- let c = input[2] ^ key[2];
1267
- let d = input[dir ? 1 : 3] ^ key[3];
1268
- let kIndex = 4;
1269
- let a2, b2, c2;
1270
-
1271
- // Inner rounds. Cribbed from OpenSSL.
1272
- for (let i = 0; i < nInnerRounds; i++) {
1273
- a2 = t0[a >>> 24] ^ t1[b >> 16 & 255] ^ t2[c >> 8 & 255] ^ t3[d & 255] ^ key[kIndex];
1274
- b2 = t0[b >>> 24] ^ t1[c >> 16 & 255] ^ t2[d >> 8 & 255] ^ t3[a & 255] ^ key[kIndex + 1];
1275
- c2 = t0[c >>> 24] ^ t1[d >> 16 & 255] ^ t2[a >> 8 & 255] ^ t3[b & 255] ^ key[kIndex + 2];
1276
- d = t0[d >>> 24] ^ t1[a >> 16 & 255] ^ t2[b >> 8 & 255] ^ t3[c & 255] ^ key[kIndex + 3];
1277
- kIndex += 4;
1278
- a = a2; b = b2; c = c2;
1279
- }
1280
-
1281
- // Last round.
1282
- for (let i = 0; i < 4; i++) {
1283
- out[dir ? 3 & -i : i] =
1284
- sbox[a >>> 24] << 24 ^
1285
- sbox[b >> 16 & 255] << 16 ^
1286
- sbox[c >> 8 & 255] << 8 ^
1287
- sbox[d & 255] ^
1288
- key[kIndex++];
1289
- a2 = a; a = b; b = c; c = d; d = a2;
1290
- }
1291
-
1292
- return out;
1293
- }
1294
- };
1295
-
1296
- /** @fileOverview CTR mode implementation.
1297
- *
1298
- * Special thanks to Roy Nicholson for pointing out a bug in our
1299
- * implementation.
1300
- *
1301
- * @author Emily Stark
1302
- * @author Mike Hamburg
1303
- * @author Dan Boneh
1304
- */
1305
-
1306
- /** Brian Gladman's CTR Mode.
1307
- * @constructor
1308
- * @param {Object} _prf The aes instance to generate key.
1309
- * @param {bitArray} _iv The iv for ctr mode, it must be 128 bits.
1310
- */
1311
-
1312
- const mode = {};
1313
-
1314
- /**
1315
- * Brian Gladman's CTR Mode.
1316
- * @namespace
1317
- */
1318
- mode.ctrGladman = class {
1319
- constructor(prf, iv) {
1320
- this._prf = prf;
1321
- this._initIv = iv;
1322
- this._iv = iv;
1323
- }
1324
-
1325
- reset() {
1326
- this._iv = this._initIv;
1327
- }
1328
-
1329
- /** Input some data to calculate.
1330
- * @param {bitArray} data the data to process, it must be intergral multiple of 128 bits unless it's the last.
1331
- */
1332
- update(data) {
1333
- return this.calculate(this._prf, data, this._iv);
1334
- }
1335
-
1336
- incWord(word) {
1337
- if (((word >> 24) & 0xff) === 0xff) { //overflow
1338
- let b1 = (word >> 16) & 0xff;
1339
- let b2 = (word >> 8) & 0xff;
1340
- let b3 = word & 0xff;
1341
-
1342
- if (b1 === 0xff) { // overflow b1
1343
- b1 = 0;
1344
- if (b2 === 0xff) {
1345
- b2 = 0;
1346
- if (b3 === 0xff) {
1347
- b3 = 0;
1348
- } else {
1349
- ++b3;
1350
- }
1351
- } else {
1352
- ++b2;
1353
- }
1354
- } else {
1355
- ++b1;
786
+ if (offset < length) {
787
+ nextKeystream();
788
+ for (let indexByte = 0; offset < length; offset++, indexByte++) {
789
+ data[offset] ^= keystream[indexByte >> 2] >>> (24 - 8 * (indexByte & 3));
1356
790
  }
1357
-
1358
- word = 0;
1359
- word += (b1 << 16);
1360
- word += (b2 << 8);
1361
- word += b3;
1362
- } else {
1363
- word += (0x01 << 24);
1364
- }
1365
- return word;
1366
- }
1367
-
1368
- incCounter(counter) {
1369
- if ((counter[0] = this.incWord(counter[0])) === 0) {
1370
- // encr_data in fileenc.c from Dr Brian Gladman's counts only with DWORD j < 8
1371
- counter[1] = this.incWord(counter[1]);
1372
791
  }
1373
792
  }
1374
793
 
1375
- calculate(prf, data, iv) {
1376
- let l;
1377
- if (!(l = data.length)) {
1378
- return [];
1379
- }
1380
- const bl = bitArray.bitLength(data);
1381
- for (let i = 0; i < l; i += 4) {
1382
- this.incCounter(iv);
1383
- const e = prf.encrypt(iv);
1384
- data[i] ^= e[0];
1385
- data[i + 1] ^= e[1];
1386
- data[i + 2] ^= e[2];
1387
- data[i + 3] ^= e[3];
1388
- }
1389
- return bitArray.clamp(data, bl);
1390
- }
1391
- };
1392
-
1393
- const misc = {
1394
- importKey(password) {
1395
- return new misc.hmacSha1(codec.bytes.toBits(password));
1396
- },
1397
- pbkdf2(prf, salt, count, length) {
1398
- count = count || 10000;
1399
- if (length < 0 || count < 0) {
1400
- throw new Error("invalid params to pbkdf2");
1401
- }
1402
- const byteLength = ((length >> 5) + 1) << 2;
1403
- let u, ui, i, j, k;
1404
- const arrayBuffer = new ArrayBuffer(byteLength);
1405
- const out = new DataView(arrayBuffer);
1406
- let outLength = 0;
1407
- const b = bitArray;
1408
- salt = codec.bytes.toBits(salt);
1409
- for (k = 1; outLength < (byteLength || 1); k++) {
1410
- u = ui = prf.encrypt(b.concat(salt, [k]));
1411
- for (i = 1; i < count; i++) {
1412
- ui = prf.encrypt(ui);
1413
- for (j = 0; j < ui.length; j++) {
1414
- u[j] ^= ui[j];
794
+ function nextKeystream() {
795
+ counter0 = (counter0 + 1) | 0;
796
+ if (!counter0) {
797
+ counter1 = (counter1 + 1) | 0;
798
+ if (!counter1) {
799
+ counter2 = (counter2 + 1) | 0;
800
+ if (!counter2) {
801
+ counter3 = (counter3 + 1) | 0;
1415
802
  }
1416
803
  }
1417
- for (i = 0; outLength < (byteLength || 1) && i < u.length; i++) {
1418
- out.setInt32(outLength, u[i]);
1419
- outLength += 4;
1420
- }
1421
804
  }
1422
- return arrayBuffer.slice(0, length / 8);
805
+ let s0 = swapBytes(counter0) ^ roundKeys[0];
806
+ let s1 = swapBytes(counter1) ^ roundKeys[1];
807
+ let s2 = swapBytes(counter2) ^ roundKeys[2];
808
+ let s3 = swapBytes(counter3) ^ roundKeys[3];
809
+ let t0 = T0[s0 >>> 24] ^ T1[(s1 >>> 16) & 255] ^ T2[(s2 >>> 8) & 255] ^ T3[s3 & 255] ^ roundKeys[4];
810
+ let t1 = T0[s1 >>> 24] ^ T1[(s2 >>> 16) & 255] ^ T2[(s3 >>> 8) & 255] ^ T3[s0 & 255] ^ roundKeys[5];
811
+ let t2 = T0[s2 >>> 24] ^ T1[(s3 >>> 16) & 255] ^ T2[(s0 >>> 8) & 255] ^ T3[s1 & 255] ^ roundKeys[6];
812
+ let t3 = T0[s3 >>> 24] ^ T1[(s0 >>> 16) & 255] ^ T2[(s1 >>> 8) & 255] ^ T3[s2 & 255] ^ roundKeys[7];
813
+ s0 = T0[t0 >>> 24] ^ T1[(t1 >>> 16) & 255] ^ T2[(t2 >>> 8) & 255] ^ T3[t3 & 255] ^ roundKeys[8];
814
+ s1 = T0[t1 >>> 24] ^ T1[(t2 >>> 16) & 255] ^ T2[(t3 >>> 8) & 255] ^ T3[t0 & 255] ^ roundKeys[9];
815
+ s2 = T0[t2 >>> 24] ^ T1[(t3 >>> 16) & 255] ^ T2[(t0 >>> 8) & 255] ^ T3[t1 & 255] ^ roundKeys[10];
816
+ s3 = T0[t3 >>> 24] ^ T1[(t0 >>> 16) & 255] ^ T2[(t1 >>> 8) & 255] ^ T3[t2 & 255] ^ roundKeys[11];
817
+ t0 = T0[s0 >>> 24] ^ T1[(s1 >>> 16) & 255] ^ T2[(s2 >>> 8) & 255] ^ T3[s3 & 255] ^ roundKeys[12];
818
+ t1 = T0[s1 >>> 24] ^ T1[(s2 >>> 16) & 255] ^ T2[(s3 >>> 8) & 255] ^ T3[s0 & 255] ^ roundKeys[13];
819
+ t2 = T0[s2 >>> 24] ^ T1[(s3 >>> 16) & 255] ^ T2[(s0 >>> 8) & 255] ^ T3[s1 & 255] ^ roundKeys[14];
820
+ t3 = T0[s3 >>> 24] ^ T1[(s0 >>> 16) & 255] ^ T2[(s1 >>> 8) & 255] ^ T3[s2 & 255] ^ roundKeys[15];
821
+ s0 = T0[t0 >>> 24] ^ T1[(t1 >>> 16) & 255] ^ T2[(t2 >>> 8) & 255] ^ T3[t3 & 255] ^ roundKeys[16];
822
+ s1 = T0[t1 >>> 24] ^ T1[(t2 >>> 16) & 255] ^ T2[(t3 >>> 8) & 255] ^ T3[t0 & 255] ^ roundKeys[17];
823
+ s2 = T0[t2 >>> 24] ^ T1[(t3 >>> 16) & 255] ^ T2[(t0 >>> 8) & 255] ^ T3[t1 & 255] ^ roundKeys[18];
824
+ s3 = T0[t3 >>> 24] ^ T1[(t0 >>> 16) & 255] ^ T2[(t1 >>> 8) & 255] ^ T3[t2 & 255] ^ roundKeys[19];
825
+ t0 = T0[s0 >>> 24] ^ T1[(s1 >>> 16) & 255] ^ T2[(s2 >>> 8) & 255] ^ T3[s3 & 255] ^ roundKeys[20];
826
+ t1 = T0[s1 >>> 24] ^ T1[(s2 >>> 16) & 255] ^ T2[(s3 >>> 8) & 255] ^ T3[s0 & 255] ^ roundKeys[21];
827
+ t2 = T0[s2 >>> 24] ^ T1[(s3 >>> 16) & 255] ^ T2[(s0 >>> 8) & 255] ^ T3[s1 & 255] ^ roundKeys[22];
828
+ t3 = T0[s3 >>> 24] ^ T1[(s0 >>> 16) & 255] ^ T2[(s1 >>> 8) & 255] ^ T3[s2 & 255] ^ roundKeys[23];
829
+ s0 = T0[t0 >>> 24] ^ T1[(t1 >>> 16) & 255] ^ T2[(t2 >>> 8) & 255] ^ T3[t3 & 255] ^ roundKeys[24];
830
+ s1 = T0[t1 >>> 24] ^ T1[(t2 >>> 16) & 255] ^ T2[(t3 >>> 8) & 255] ^ T3[t0 & 255] ^ roundKeys[25];
831
+ s2 = T0[t2 >>> 24] ^ T1[(t3 >>> 16) & 255] ^ T2[(t0 >>> 8) & 255] ^ T3[t1 & 255] ^ roundKeys[26];
832
+ s3 = T0[t3 >>> 24] ^ T1[(t0 >>> 16) & 255] ^ T2[(t1 >>> 8) & 255] ^ T3[t2 & 255] ^ roundKeys[27];
833
+ t0 = T0[s0 >>> 24] ^ T1[(s1 >>> 16) & 255] ^ T2[(s2 >>> 8) & 255] ^ T3[s3 & 255] ^ roundKeys[28];
834
+ t1 = T0[s1 >>> 24] ^ T1[(s2 >>> 16) & 255] ^ T2[(s3 >>> 8) & 255] ^ T3[s0 & 255] ^ roundKeys[29];
835
+ t2 = T0[s2 >>> 24] ^ T1[(s3 >>> 16) & 255] ^ T2[(s0 >>> 8) & 255] ^ T3[s1 & 255] ^ roundKeys[30];
836
+ t3 = T0[s3 >>> 24] ^ T1[(s0 >>> 16) & 255] ^ T2[(s1 >>> 8) & 255] ^ T3[s2 & 255] ^ roundKeys[31];
837
+ s0 = T0[t0 >>> 24] ^ T1[(t1 >>> 16) & 255] ^ T2[(t2 >>> 8) & 255] ^ T3[t3 & 255] ^ roundKeys[32];
838
+ s1 = T0[t1 >>> 24] ^ T1[(t2 >>> 16) & 255] ^ T2[(t3 >>> 8) & 255] ^ T3[t0 & 255] ^ roundKeys[33];
839
+ s2 = T0[t2 >>> 24] ^ T1[(t3 >>> 16) & 255] ^ T2[(t0 >>> 8) & 255] ^ T3[t1 & 255] ^ roundKeys[34];
840
+ s3 = T0[t3 >>> 24] ^ T1[(t0 >>> 16) & 255] ^ T2[(t1 >>> 8) & 255] ^ T3[t2 & 255] ^ roundKeys[35];
841
+ t0 = T0[s0 >>> 24] ^ T1[(s1 >>> 16) & 255] ^ T2[(s2 >>> 8) & 255] ^ T3[s3 & 255] ^ roundKeys[36];
842
+ t1 = T0[s1 >>> 24] ^ T1[(s2 >>> 16) & 255] ^ T2[(s3 >>> 8) & 255] ^ T3[s0 & 255] ^ roundKeys[37];
843
+ t2 = T0[s2 >>> 24] ^ T1[(s3 >>> 16) & 255] ^ T2[(s0 >>> 8) & 255] ^ T3[s1 & 255] ^ roundKeys[38];
844
+ t3 = T0[s3 >>> 24] ^ T1[(s0 >>> 16) & 255] ^ T2[(s1 >>> 8) & 255] ^ T3[s2 & 255] ^ roundKeys[39];
845
+ let indexKey = 40;
846
+ if (rounds > 10) {
847
+ s0 = T0[t0 >>> 24] ^ T1[(t1 >>> 16) & 255] ^ T2[(t2 >>> 8) & 255] ^ T3[t3 & 255] ^ roundKeys[40];
848
+ s1 = T0[t1 >>> 24] ^ T1[(t2 >>> 16) & 255] ^ T2[(t3 >>> 8) & 255] ^ T3[t0 & 255] ^ roundKeys[41];
849
+ s2 = T0[t2 >>> 24] ^ T1[(t3 >>> 16) & 255] ^ T2[(t0 >>> 8) & 255] ^ T3[t1 & 255] ^ roundKeys[42];
850
+ s3 = T0[t3 >>> 24] ^ T1[(t0 >>> 16) & 255] ^ T2[(t1 >>> 8) & 255] ^ T3[t2 & 255] ^ roundKeys[43];
851
+ t0 = T0[s0 >>> 24] ^ T1[(s1 >>> 16) & 255] ^ T2[(s2 >>> 8) & 255] ^ T3[s3 & 255] ^ roundKeys[44];
852
+ t1 = T0[s1 >>> 24] ^ T1[(s2 >>> 16) & 255] ^ T2[(s3 >>> 8) & 255] ^ T3[s0 & 255] ^ roundKeys[45];
853
+ t2 = T0[s2 >>> 24] ^ T1[(s3 >>> 16) & 255] ^ T2[(s0 >>> 8) & 255] ^ T3[s1 & 255] ^ roundKeys[46];
854
+ t3 = T0[s3 >>> 24] ^ T1[(s0 >>> 16) & 255] ^ T2[(s1 >>> 8) & 255] ^ T3[s2 & 255] ^ roundKeys[47];
855
+ indexKey = 48;
856
+ }
857
+ if (rounds > 12) {
858
+ s0 = T0[t0 >>> 24] ^ T1[(t1 >>> 16) & 255] ^ T2[(t2 >>> 8) & 255] ^ T3[t3 & 255] ^ roundKeys[48];
859
+ s1 = T0[t1 >>> 24] ^ T1[(t2 >>> 16) & 255] ^ T2[(t3 >>> 8) & 255] ^ T3[t0 & 255] ^ roundKeys[49];
860
+ s2 = T0[t2 >>> 24] ^ T1[(t3 >>> 16) & 255] ^ T2[(t0 >>> 8) & 255] ^ T3[t1 & 255] ^ roundKeys[50];
861
+ s3 = T0[t3 >>> 24] ^ T1[(t0 >>> 16) & 255] ^ T2[(t1 >>> 8) & 255] ^ T3[t2 & 255] ^ roundKeys[51];
862
+ t0 = T0[s0 >>> 24] ^ T1[(s1 >>> 16) & 255] ^ T2[(s2 >>> 8) & 255] ^ T3[s3 & 255] ^ roundKeys[52];
863
+ t1 = T0[s1 >>> 24] ^ T1[(s2 >>> 16) & 255] ^ T2[(s3 >>> 8) & 255] ^ T3[s0 & 255] ^ roundKeys[53];
864
+ t2 = T0[s2 >>> 24] ^ T1[(s3 >>> 16) & 255] ^ T2[(s0 >>> 8) & 255] ^ T3[s1 & 255] ^ roundKeys[54];
865
+ t3 = T0[s3 >>> 24] ^ T1[(s0 >>> 16) & 255] ^ T2[(s1 >>> 8) & 255] ^ T3[s2 & 255] ^ roundKeys[55];
866
+ indexKey = 56;
867
+ }
868
+ keystream[0] = ((S_BOX[t0 >>> 24] << 24) | (S_BOX[(t1 >>> 16) & 255] << 16) | (S_BOX[(t2 >>> 8) & 255] << 8) | S_BOX[t3 & 255]) ^ roundKeys[indexKey];
869
+ keystream[1] = ((S_BOX[t1 >>> 24] << 24) | (S_BOX[(t2 >>> 16) & 255] << 16) | (S_BOX[(t3 >>> 8) & 255] << 8) | S_BOX[t0 & 255]) ^ roundKeys[indexKey + 1];
870
+ keystream[2] = ((S_BOX[t2 >>> 24] << 24) | (S_BOX[(t3 >>> 16) & 255] << 16) | (S_BOX[(t0 >>> 8) & 255] << 8) | S_BOX[t1 & 255]) ^ roundKeys[indexKey + 2];
871
+ keystream[3] = ((S_BOX[t3 >>> 24] << 24) | (S_BOX[(t0 >>> 16) & 255] << 16) | (S_BOX[(t1 >>> 8) & 255] << 8) | S_BOX[t2 & 255]) ^ roundKeys[indexKey + 3];
872
+ }
873
+ }
874
+
875
+ function pbkdf2(password, salt, iterations, length) {
876
+ const hmac = createHmac(password);
877
+ const result = new Uint8Array(length);
878
+ const block = new Uint8Array(salt.length + 4);
879
+ const blockView = new DataView(block.buffer);
880
+ block.set(salt);
881
+ for (let indexBlock = 1, offset = 0; offset < length; indexBlock++, offset += SHA1_DIGEST_LENGTH) {
882
+ blockView.setUint32(salt.length, indexBlock);
883
+ hmac.update(block, 0, block.length);
884
+ let previous = hmac.digest();
885
+ const output = previous.slice();
886
+ for (let iteration = 1; iteration < iterations; iteration++) {
887
+ hmac.update(previous, 0, SHA1_DIGEST_LENGTH);
888
+ previous = hmac.digest();
889
+ for (let indexByte = 0; indexByte < SHA1_DIGEST_LENGTH; indexByte++) {
890
+ output[indexByte] ^= previous[indexByte];
891
+ }
892
+ }
893
+ result.set(output.subarray(0, Math.min(SHA1_DIGEST_LENGTH, length - offset)), offset);
1423
894
  }
1424
- };
1425
-
1426
- /** @fileOverview HMAC implementation.
1427
- *
1428
- * @author Emily Stark
1429
- * @author Mike Hamburg
1430
- * @author Dan Boneh
1431
- */
1432
-
1433
- /** HMAC with the specified hash function.
1434
- * @constructor
1435
- * @param {bitArray} key the key for HMAC.
1436
- * @param {Object} [Hash=hash.sha1] The hash function to use.
1437
- */
1438
- misc.hmacSha1 = class {
1439
-
1440
- constructor(key) {
1441
- const hmac = this;
1442
- const Hash = hmac._hash = hash.sha1;
1443
- const exKey = [[], []];
1444
- hmac._baseHash = [new Hash(), new Hash()];
1445
- const bs = hmac._baseHash[0].blockSize / 32;
1446
-
1447
- if (key.length > bs) {
1448
- key = new Hash().update(key).finalize();
1449
- }
1450
-
1451
- for (let i = 0; i < bs; i++) {
1452
- exKey[0][i] = key[i] ^ 0x36363636;
1453
- exKey[1][i] = key[i] ^ 0x5C5C5C5C;
1454
- }
895
+ return result;
896
+ }
1455
897
 
1456
- hmac._baseHash[0].update(exKey[0]);
1457
- hmac._baseHash[1].update(exKey[1]);
1458
- hmac._resultHash = new Hash(hmac._baseHash[0]);
898
+ function createHmac(key) {
899
+ const sha1 = createSha1();
900
+ const innerKey = new Uint8Array(SHA1_BLOCK_LENGTH);
901
+ const outerKey = new Uint8Array(SHA1_BLOCK_LENGTH);
902
+ if (key.length > SHA1_BLOCK_LENGTH) {
903
+ sha1.update(key, 0, key.length);
904
+ key = sha1.digest();
1459
905
  }
1460
- reset() {
1461
- const hmac = this;
1462
- hmac._resultHash = new hmac._hash(hmac._baseHash[0]);
1463
- hmac._updated = false;
906
+ for (let indexByte = 0; indexByte < SHA1_BLOCK_LENGTH; indexByte++) {
907
+ const keyByte = indexByte < key.length ? key[indexByte] : 0;
908
+ innerKey[indexByte] = keyByte ^ HMAC_INNER_PADDING;
909
+ outerKey[indexByte] = keyByte ^ HMAC_OUTER_PADDING;
1464
910
  }
911
+ sha1.update(innerKey, 0, SHA1_BLOCK_LENGTH);
912
+ return {
913
+ update(data, offset, length) {
914
+ sha1.update(data, offset, length);
915
+ },
916
+ digest() {
917
+ const innerDigest = sha1.digest();
918
+ sha1.update(outerKey, 0, SHA1_BLOCK_LENGTH);
919
+ sha1.update(innerDigest, 0, SHA1_DIGEST_LENGTH);
920
+ const result = sha1.digest();
921
+ sha1.update(innerKey, 0, SHA1_BLOCK_LENGTH);
922
+ return result;
923
+ }
924
+ };
925
+ }
1465
926
 
1466
- update(data) {
1467
- const hmac = this;
1468
- hmac._updated = true;
1469
- hmac._resultHash.update(data);
1470
- }
1471
-
1472
- digest() {
1473
- const hmac = this;
1474
- const w = hmac._resultHash.finalize();
1475
- const result = new (hmac._hash)(hmac._baseHash[1]).update(w).finalize();
1476
-
1477
- hmac.reset();
927
+ function createSha1() {
928
+ const state = new Int32Array(SHA1_INITIAL_STATE);
929
+ const schedule = new Int32Array(SHA1_SCHEDULE_LENGTH);
930
+ const block = new Uint8Array(SHA1_BLOCK_LENGTH);
931
+ const blockView = new DataView(block.buffer);
932
+ const lengthBytes = new Uint8Array(8);
933
+ let blockLength = 0;
934
+ let totalLength = 0;
935
+ return {
936
+ update,
937
+ digest
938
+ };
1478
939
 
940
+ function update(data, offset, length) {
941
+ const end = offset + length;
942
+ totalLength += length;
943
+ if (blockLength) {
944
+ while (offset < end && blockLength < SHA1_BLOCK_LENGTH) {
945
+ block[blockLength++] = data[offset++];
946
+ }
947
+ if (blockLength == SHA1_BLOCK_LENGTH) {
948
+ compress(blockView, 0);
949
+ blockLength = 0;
950
+ }
951
+ }
952
+ if (offset + SHA1_BLOCK_LENGTH <= end) {
953
+ const view = new DataView(data.buffer, data.byteOffset, data.byteLength);
954
+ for (; offset + SHA1_BLOCK_LENGTH <= end; offset += SHA1_BLOCK_LENGTH) {
955
+ compress(view, offset);
956
+ }
957
+ }
958
+ while (offset < end) {
959
+ block[blockLength++] = data[offset++];
960
+ }
961
+ }
962
+
963
+ function digest() {
964
+ const bits = totalLength * 8;
965
+ const high = Math.floor(bits / 0x100000000);
966
+ const low = bits >>> 0;
967
+ update(SHA1_PADDING, 0, 1);
968
+ while (blockLength != SHA1_LENGTH_OFFSET) {
969
+ update(SHA1_ZERO, 0, 1);
970
+ }
971
+ lengthBytes[0] = high >>> 24;
972
+ lengthBytes[1] = high >>> 16;
973
+ lengthBytes[2] = high >>> 8;
974
+ lengthBytes[3] = high;
975
+ lengthBytes[4] = low >>> 24;
976
+ lengthBytes[5] = low >>> 16;
977
+ lengthBytes[6] = low >>> 8;
978
+ lengthBytes[7] = low;
979
+ update(lengthBytes, 0, 8);
980
+ const result = new Uint8Array(SHA1_DIGEST_LENGTH);
981
+ const resultView = new DataView(result.buffer);
982
+ for (let indexWord = 0; indexWord < state.length; indexWord++) {
983
+ resultView.setInt32(4 * indexWord, state[indexWord]);
984
+ }
985
+ state.set(SHA1_INITIAL_STATE);
986
+ blockLength = 0;
987
+ totalLength = 0;
1479
988
  return result;
1480
989
  }
1481
990
 
1482
- encrypt(data) {
1483
- if (!this._updated) {
1484
- this.update(data);
1485
- return this.digest(data);
1486
- } else {
1487
- throw new Error("encrypt on already updated hmac called!");
1488
- }
1489
- }
1490
- };
991
+ function compress(view, offset) {
992
+ for (let index = 0; index < 16; index++) {
993
+ schedule[index] = view.getInt32(offset + 4 * index);
994
+ }
995
+ let a = state[0];
996
+ let b = state[1];
997
+ let c = state[2];
998
+ let d = state[3];
999
+ let e = state[4];
1000
+ let t;
1001
+ for (let index = 0; index < 15; index += 5) {
1002
+ e = (((a << 5) | (a >>> 27)) + (((c ^ d) & b) ^ d) + e + 0x5A827999 + schedule[index]) | 0;
1003
+ b = (b << 30) | (b >>> 2);
1004
+ d = (((e << 5) | (e >>> 27)) + (((b ^ c) & a) ^ c) + d + 0x5A827999 + schedule[index + 1]) | 0;
1005
+ a = (a << 30) | (a >>> 2);
1006
+ c = (((d << 5) | (d >>> 27)) + (((a ^ b) & e) ^ b) + c + 0x5A827999 + schedule[index + 2]) | 0;
1007
+ e = (e << 30) | (e >>> 2);
1008
+ b = (((c << 5) | (c >>> 27)) + (((e ^ a) & d) ^ a) + b + 0x5A827999 + schedule[index + 3]) | 0;
1009
+ d = (d << 30) | (d >>> 2);
1010
+ a = (((b << 5) | (b >>> 27)) + (((d ^ e) & c) ^ e) + a + 0x5A827999 + schedule[index + 4]) | 0;
1011
+ c = (c << 30) | (c >>> 2);
1012
+ }
1013
+ e = (((a << 5) | (a >>> 27)) + (((c ^ d) & b) ^ d) + e + 0x5A827999 + schedule[15]) | 0;
1014
+ b = (b << 30) | (b >>> 2);
1015
+ t = schedule[13] ^ schedule[8] ^ schedule[2] ^ schedule[0];
1016
+ t = (t << 1) | (t >>> 31);
1017
+ schedule[0] = t;
1018
+ d = (((e << 5) | (e >>> 27)) + (((b ^ c) & a) ^ c) + d + 0x5A827999 + t) | 0;
1019
+ a = (a << 30) | (a >>> 2);
1020
+ t = schedule[14] ^ schedule[9] ^ schedule[3] ^ schedule[1];
1021
+ t = (t << 1) | (t >>> 31);
1022
+ schedule[1] = t;
1023
+ c = (((d << 5) | (d >>> 27)) + (((a ^ b) & e) ^ b) + c + 0x5A827999 + t) | 0;
1024
+ e = (e << 30) | (e >>> 2);
1025
+ t = schedule[15] ^ schedule[10] ^ schedule[4] ^ schedule[2];
1026
+ t = (t << 1) | (t >>> 31);
1027
+ schedule[2] = t;
1028
+ b = (((c << 5) | (c >>> 27)) + (((e ^ a) & d) ^ a) + b + 0x5A827999 + t) | 0;
1029
+ d = (d << 30) | (d >>> 2);
1030
+ t = schedule[0] ^ schedule[11] ^ schedule[5] ^ schedule[3];
1031
+ t = (t << 1) | (t >>> 31);
1032
+ schedule[3] = t;
1033
+ a = (((b << 5) | (b >>> 27)) + (((d ^ e) & c) ^ e) + a + 0x5A827999 + t) | 0;
1034
+ c = (c << 30) | (c >>> 2);
1035
+ for (let index = 20; index < 40; index += 5) {
1036
+ t = schedule[(index - 3) & 15] ^ schedule[(index - 8) & 15] ^ schedule[(index - 14) & 15] ^ schedule[(index) & 15];
1037
+ t = (t << 1) | (t >>> 31);
1038
+ schedule[(index) & 15] = t;
1039
+ e = (((a << 5) | (a >>> 27)) + (b ^ c ^ d) + e + 0x6ED9EBA1 + t) | 0;
1040
+ b = (b << 30) | (b >>> 2);
1041
+ t = schedule[(index - 2) & 15] ^ schedule[(index - 7) & 15] ^ schedule[(index - 13) & 15] ^ schedule[(index + 1) & 15];
1042
+ t = (t << 1) | (t >>> 31);
1043
+ schedule[(index + 1) & 15] = t;
1044
+ d = (((e << 5) | (e >>> 27)) + (a ^ b ^ c) + d + 0x6ED9EBA1 + t) | 0;
1045
+ a = (a << 30) | (a >>> 2);
1046
+ t = schedule[(index - 1) & 15] ^ schedule[(index - 6) & 15] ^ schedule[(index - 12) & 15] ^ schedule[(index + 2) & 15];
1047
+ t = (t << 1) | (t >>> 31);
1048
+ schedule[(index + 2) & 15] = t;
1049
+ c = (((d << 5) | (d >>> 27)) + (e ^ a ^ b) + c + 0x6ED9EBA1 + t) | 0;
1050
+ e = (e << 30) | (e >>> 2);
1051
+ t = schedule[(index) & 15] ^ schedule[(index - 5) & 15] ^ schedule[(index - 11) & 15] ^ schedule[(index + 3) & 15];
1052
+ t = (t << 1) | (t >>> 31);
1053
+ schedule[(index + 3) & 15] = t;
1054
+ b = (((c << 5) | (c >>> 27)) + (d ^ e ^ a) + b + 0x6ED9EBA1 + t) | 0;
1055
+ d = (d << 30) | (d >>> 2);
1056
+ t = schedule[(index + 1) & 15] ^ schedule[(index - 4) & 15] ^ schedule[(index - 10) & 15] ^ schedule[(index + 4) & 15];
1057
+ t = (t << 1) | (t >>> 31);
1058
+ schedule[(index + 4) & 15] = t;
1059
+ a = (((b << 5) | (b >>> 27)) + (c ^ d ^ e) + a + 0x6ED9EBA1 + t) | 0;
1060
+ c = (c << 30) | (c >>> 2);
1061
+ }
1062
+ for (let index = 40; index < 60; index += 5) {
1063
+ t = schedule[(index - 3) & 15] ^ schedule[(index - 8) & 15] ^ schedule[(index - 14) & 15] ^ schedule[(index) & 15];
1064
+ t = (t << 1) | (t >>> 31);
1065
+ schedule[(index) & 15] = t;
1066
+ e = (((a << 5) | (a >>> 27)) + ((b & c) | ((b | c) & d)) + e + 0x8F1BBCDC + t) | 0;
1067
+ b = (b << 30) | (b >>> 2);
1068
+ t = schedule[(index - 2) & 15] ^ schedule[(index - 7) & 15] ^ schedule[(index - 13) & 15] ^ schedule[(index + 1) & 15];
1069
+ t = (t << 1) | (t >>> 31);
1070
+ schedule[(index + 1) & 15] = t;
1071
+ d = (((e << 5) | (e >>> 27)) + ((a & b) | ((a | b) & c)) + d + 0x8F1BBCDC + t) | 0;
1072
+ a = (a << 30) | (a >>> 2);
1073
+ t = schedule[(index - 1) & 15] ^ schedule[(index - 6) & 15] ^ schedule[(index - 12) & 15] ^ schedule[(index + 2) & 15];
1074
+ t = (t << 1) | (t >>> 31);
1075
+ schedule[(index + 2) & 15] = t;
1076
+ c = (((d << 5) | (d >>> 27)) + ((e & a) | ((e | a) & b)) + c + 0x8F1BBCDC + t) | 0;
1077
+ e = (e << 30) | (e >>> 2);
1078
+ t = schedule[(index) & 15] ^ schedule[(index - 5) & 15] ^ schedule[(index - 11) & 15] ^ schedule[(index + 3) & 15];
1079
+ t = (t << 1) | (t >>> 31);
1080
+ schedule[(index + 3) & 15] = t;
1081
+ b = (((c << 5) | (c >>> 27)) + ((d & e) | ((d | e) & a)) + b + 0x8F1BBCDC + t) | 0;
1082
+ d = (d << 30) | (d >>> 2);
1083
+ t = schedule[(index + 1) & 15] ^ schedule[(index - 4) & 15] ^ schedule[(index - 10) & 15] ^ schedule[(index + 4) & 15];
1084
+ t = (t << 1) | (t >>> 31);
1085
+ schedule[(index + 4) & 15] = t;
1086
+ a = (((b << 5) | (b >>> 27)) + ((c & d) | ((c | d) & e)) + a + 0x8F1BBCDC + t) | 0;
1087
+ c = (c << 30) | (c >>> 2);
1088
+ }
1089
+ for (let index = 60; index < 80; index += 5) {
1090
+ t = schedule[(index - 3) & 15] ^ schedule[(index - 8) & 15] ^ schedule[(index - 14) & 15] ^ schedule[(index) & 15];
1091
+ t = (t << 1) | (t >>> 31);
1092
+ schedule[(index) & 15] = t;
1093
+ e = (((a << 5) | (a >>> 27)) + (b ^ c ^ d) + e + 0xCA62C1D6 + t) | 0;
1094
+ b = (b << 30) | (b >>> 2);
1095
+ t = schedule[(index - 2) & 15] ^ schedule[(index - 7) & 15] ^ schedule[(index - 13) & 15] ^ schedule[(index + 1) & 15];
1096
+ t = (t << 1) | (t >>> 31);
1097
+ schedule[(index + 1) & 15] = t;
1098
+ d = (((e << 5) | (e >>> 27)) + (a ^ b ^ c) + d + 0xCA62C1D6 + t) | 0;
1099
+ a = (a << 30) | (a >>> 2);
1100
+ t = schedule[(index - 1) & 15] ^ schedule[(index - 6) & 15] ^ schedule[(index - 12) & 15] ^ schedule[(index + 2) & 15];
1101
+ t = (t << 1) | (t >>> 31);
1102
+ schedule[(index + 2) & 15] = t;
1103
+ c = (((d << 5) | (d >>> 27)) + (e ^ a ^ b) + c + 0xCA62C1D6 + t) | 0;
1104
+ e = (e << 30) | (e >>> 2);
1105
+ t = schedule[(index) & 15] ^ schedule[(index - 5) & 15] ^ schedule[(index - 11) & 15] ^ schedule[(index + 3) & 15];
1106
+ t = (t << 1) | (t >>> 31);
1107
+ schedule[(index + 3) & 15] = t;
1108
+ b = (((c << 5) | (c >>> 27)) + (d ^ e ^ a) + b + 0xCA62C1D6 + t) | 0;
1109
+ d = (d << 30) | (d >>> 2);
1110
+ t = schedule[(index + 1) & 15] ^ schedule[(index - 4) & 15] ^ schedule[(index - 10) & 15] ^ schedule[(index + 4) & 15];
1111
+ t = (t << 1) | (t >>> 31);
1112
+ schedule[(index + 4) & 15] = t;
1113
+ a = (((b << 5) | (b >>> 27)) + (c ^ d ^ e) + a + 0xCA62C1D6 + t) | 0;
1114
+ c = (c << 30) | (c >>> 2);
1115
+ }
1116
+ state[0] = (state[0] + a) | 0;
1117
+ state[1] = (state[1] + b) | 0;
1118
+ state[2] = (state[2] + c) | 0;
1119
+ state[3] = (state[3] + d) | 0;
1120
+ state[4] = (state[4] + e) | 0;
1121
+ }
1122
+ }
1123
+
1124
+ function initTables() {
1125
+ if (!tablesInitialized) {
1126
+ let p = 1;
1127
+ let q = 1;
1128
+ do {
1129
+ p = (p ^ (p << 1) ^ ((p & 0x80) ? 0x1b : 0)) & 255;
1130
+ q = (q ^ (q << 1)) & 255;
1131
+ q = (q ^ (q << 2)) & 255;
1132
+ q = (q ^ (q << 4)) & 255;
1133
+ if (q & 0x80) {
1134
+ q ^= 0x09;
1135
+ }
1136
+ S_BOX[p] = (q ^ ((q << 1) | (q >> 7)) ^ ((q << 2) | (q >> 6)) ^ ((q << 3) | (q >> 5)) ^ ((q << 4) | (q >> 4)) ^ 0x63) & 255;
1137
+ } while (p != 1);
1138
+ S_BOX[0] = 0x63;
1139
+ for (let index = 0; index < 256; index++) {
1140
+ const s = S_BOX[index];
1141
+ const s2 = multiplyByTwo(s);
1142
+ const t = (s2 << 24) | (s << 16) | (s << 8) | (s2 ^ s);
1143
+ T0[index] = t;
1144
+ T1[index] = (t >>> 8) | (t << 24);
1145
+ T2[index] = (t >>> 16) | (t << 16);
1146
+ T3[index] = (t >>> 24) | (t << 8);
1147
+ }
1148
+ tablesInitialized = true;
1149
+ }
1150
+ }
1151
+
1152
+ function expandKey(key, roundKeys) {
1153
+ const keyWords = key.length >> 2;
1154
+ const rounds = keyWords + 6;
1155
+ const total = 4 * (rounds + 1);
1156
+ let roundConstant = 1;
1157
+ for (let index = 0; index < keyWords; index++) {
1158
+ roundKeys[index] = (key[4 * index] << 24) | (key[4 * index + 1] << 16) | (key[4 * index + 2] << 8) | key[4 * index + 3];
1159
+ }
1160
+ for (let index = keyWords; index < total; index++) {
1161
+ let word = roundKeys[index - 1];
1162
+ if (index % keyWords == 0) {
1163
+ word = substituteWord((word << 8) | (word >>> 24)) ^ (roundConstant << 24);
1164
+ roundConstant = multiplyByTwo(roundConstant);
1165
+ } else if (keyWords > 6 && index % keyWords == 4) {
1166
+ word = substituteWord(word);
1167
+ }
1168
+ roundKeys[index] = roundKeys[index - keyWords] ^ word;
1169
+ }
1170
+ return rounds;
1171
+ }
1172
+
1173
+ function substituteWord(word) {
1174
+ return (S_BOX[word >>> 24] << 24) | (S_BOX[(word >>> 16) & 255] << 16) | (S_BOX[(word >>> 8) & 255] << 8) | S_BOX[word & 255];
1175
+ }
1176
+
1177
+ function swapBytes(value) {
1178
+ return (value << 24) | ((value & 0xff00) << 8) | ((value >>> 8) & 0xff00) | (value >>> 24);
1179
+ }
1180
+
1181
+ function multiplyByTwo(value) {
1182
+ return ((value << 1) ^ ((value >> 7) * 0x1b)) & 255;
1183
+ }
1491
1184
 
1492
1185
  /*
1493
1186
  Copyright (c) 2022 Gildas Lormeau. All rights reserved.
@@ -1542,8 +1235,8 @@ function getRandomValues(array) {
1542
1235
  1. Redistributions of source code must retain the above copyright notice,
1543
1236
  this list of conditions and the following disclaimer.
1544
1237
 
1545
- 2. Redistributions in binary form must reproduce the above copyright
1546
- notice, this list of conditions and the following disclaimer in
1238
+ 2. Redistributions in binary form must reproduce the above copyright
1239
+ notice, this list of conditions and the following disclaimer in
1547
1240
  the documentation and/or other materials provided with the distribution.
1548
1241
 
1549
1242
  3. The names of the authors may not be used to endorse or promote products
@@ -1567,24 +1260,21 @@ const RAW_FORMAT = "raw";
1567
1260
  const PBKDF2_ALGORITHM = { name: "PBKDF2" };
1568
1261
  const HASH_ALGORITHM = { name: "HMAC" };
1569
1262
  const HASH_FUNCTION = "SHA-1";
1263
+ const PBKDF2_ITERATIONS = 1000;
1570
1264
  const BASE_KEY_ALGORITHM = Object.assign({ hash: HASH_ALGORITHM }, PBKDF2_ALGORITHM);
1571
- const DERIVED_BITS_ALGORITHM = Object.assign({ iterations: 1000, hash: { name: HASH_FUNCTION } }, PBKDF2_ALGORITHM);
1265
+ const DERIVED_BITS_ALGORITHM = Object.assign({ iterations: PBKDF2_ITERATIONS, hash: { name: HASH_FUNCTION } }, PBKDF2_ALGORITHM);
1572
1266
  const DERIVED_BITS_USAGE = ["deriveBits"];
1573
1267
  const SALT_LENGTH = [8, 12, 16];
1574
1268
  const KEY_LENGTH = [16, 24, 32];
1575
1269
  const AUTHENTICATION_CODE_LENGTH = 10;
1576
- const COUNTER_DEFAULT_VALUE = [0, 0, 0, 0];
1270
+ const PASSWORD_VERIFICATION_LENGTH = 2;
1577
1271
  // deno-lint-ignore valid-typeof
1578
1272
  const CRYPTO_API_SUPPORTED = typeof crypto != UNDEFINED_TYPE;
1579
1273
  const subtle = CRYPTO_API_SUPPORTED && crypto.subtle;
1580
1274
  const SUBTLE_API_SUPPORTED = CRYPTO_API_SUPPORTED && typeof subtle != UNDEFINED_TYPE;
1581
- const codecBytes = codec.bytes;
1582
- const Aes = cipher.aes;
1583
- const CtrGladman = mode.ctrGladman;
1584
- const HmacSha1 = misc.hmacSha1;
1585
1275
 
1586
- let IMPORT_KEY_SUPPORTED = CRYPTO_API_SUPPORTED && SUBTLE_API_SUPPORTED && typeof subtle.importKey == FUNCTION_TYPE;
1587
- let DERIVE_BITS_SUPPORTED = CRYPTO_API_SUPPORTED && SUBTLE_API_SUPPORTED && typeof subtle.deriveBits == FUNCTION_TYPE;
1276
+ let DERIVE_BITS_SUPPORTED = SUBTLE_API_SUPPORTED && typeof subtle.importKey == FUNCTION_TYPE && typeof subtle.deriveBits == FUNCTION_TYPE;
1277
+ let createEngine = createEngine$1;
1588
1278
 
1589
1279
  class AESDecryptionStream extends TransformStream {
1590
1280
 
@@ -1602,9 +1292,10 @@ class AESDecryptionStream extends TransformStream {
1602
1292
  ready
1603
1293
  } = aesCrypto;
1604
1294
  if (password) {
1605
- await createDecryptionKeys(aesCrypto, strength, password, subarray(chunk, 0, SALT_LENGTH[strength] + 2));
1606
- chunk = subarray(chunk, SALT_LENGTH[strength] + 2);
1295
+ await createDecryptionKeys(aesCrypto, strength, password, subarray(chunk, 0, SALT_LENGTH[strength] + PASSWORD_VERIFICATION_LENGTH));
1296
+ chunk = subarray(chunk, SALT_LENGTH[strength] + PASSWORD_VERIFICATION_LENGTH);
1607
1297
  if (checkPasswordOnly) {
1298
+ disposeEngine(aesCrypto);
1608
1299
  controller.error(new Error(ERR_ABORT_CHECK_PASSWORD));
1609
1300
  } else {
1610
1301
  resolveReady();
@@ -1617,23 +1308,16 @@ class AESDecryptionStream extends TransformStream {
1617
1308
  },
1618
1309
  async flush(controller) {
1619
1310
  const {
1620
- ctr,
1621
- hmac,
1311
+ engine,
1622
1312
  pendingInput,
1623
1313
  ready
1624
1314
  } = this;
1625
- if (hmac && ctr) {
1315
+ if (engine) {
1626
1316
  await ready;
1627
- const chunkToDecrypt = subarray(pendingInput, 0, pendingInput.length - AUTHENTICATION_CODE_LENGTH);
1628
1317
  const originalAuthenticationCode = subarray(pendingInput, pendingInput.length - AUTHENTICATION_CODE_LENGTH);
1629
- let decryptedChunkArray = EMPTY_UINT8_ARRAY;
1630
- if (chunkToDecrypt.length) {
1631
- const encryptedChunk = toBits(codecBytes, chunkToDecrypt);
1632
- hmac.update(encryptedChunk);
1633
- const decryptedChunk = ctr.update(encryptedChunk);
1634
- decryptedChunkArray = fromBits(codecBytes, decryptedChunk);
1635
- }
1636
- const authenticationCode = subarray(fromBits(codecBytes, hmac.digest()), 0, AUTHENTICATION_CODE_LENGTH);
1318
+ const decryptedChunkArray = new Uint8Array(subarray(pendingInput, 0, pendingInput.length - AUTHENTICATION_CODE_LENGTH));
1319
+ engine.process(decryptedChunkArray, true);
1320
+ const authenticationCode = engine.digest();
1637
1321
  let invalidAuthenticationCode = pendingInput.length < AUTHENTICATION_CODE_LENGTH ? 1 : 0;
1638
1322
  for (let indexByte = 0; indexByte < AUTHENTICATION_CODE_LENGTH; indexByte++) {
1639
1323
  invalidAuthenticationCode |= authenticationCode[indexByte] ^ originalAuthenticationCode[indexByte];
@@ -1643,6 +1327,9 @@ class AESDecryptionStream extends TransformStream {
1643
1327
  }
1644
1328
  controller.enqueue(decryptedChunkArray);
1645
1329
  }
1330
+ },
1331
+ cancel() {
1332
+ disposeEngine(this);
1646
1333
  }
1647
1334
  });
1648
1335
  }
@@ -1672,26 +1359,24 @@ class AESEncryptionStream extends TransformStream {
1672
1359
  }
1673
1360
  const output = new Uint8Array(preamble.length + chunk.length - (chunk.length % BLOCK_LENGTH));
1674
1361
  output.set(preamble, 0);
1675
- controller.enqueue(append(aesCrypto, chunk, output, preamble.length, 0));
1362
+ controller.enqueue(append(aesCrypto, chunk, output, preamble.length, 0, false));
1676
1363
  },
1677
1364
  async flush(controller) {
1678
1365
  const {
1679
- ctr,
1680
- hmac,
1366
+ engine,
1681
1367
  pendingInput,
1682
1368
  ready
1683
1369
  } = this;
1684
- if (hmac && ctr) {
1370
+ if (engine) {
1685
1371
  await ready;
1686
- let encryptedChunkArray = EMPTY_UINT8_ARRAY;
1687
- if (pendingInput.length) {
1688
- const encryptedChunk = ctr.update(toBits(codecBytes, pendingInput));
1689
- hmac.update(encryptedChunk);
1690
- encryptedChunkArray = fromBits(codecBytes, encryptedChunk);
1691
- }
1692
- const authenticationCode = fromBits(codecBytes, hmac.digest()).slice(0, AUTHENTICATION_CODE_LENGTH);
1372
+ const encryptedChunkArray = new Uint8Array(pendingInput);
1373
+ engine.process(encryptedChunkArray, false);
1374
+ const authenticationCode = subarray(engine.digest(), 0, AUTHENTICATION_CODE_LENGTH);
1693
1375
  controller.enqueue(concat(encryptedChunkArray, authenticationCode));
1694
1376
  }
1377
+ },
1378
+ cancel() {
1379
+ disposeEngine(this);
1695
1380
  }
1696
1381
  });
1697
1382
  }
@@ -1706,30 +1391,23 @@ function initAesCrypto(aesCrypto, password, rawPassword, encryptionStrength) {
1706
1391
  });
1707
1392
  }
1708
1393
 
1709
- function append(aesCrypto, input, output, paddingStart, paddingEnd, verifyAuthenticationCode) {
1394
+ function append(aesCrypto, input, output, paddingStart, paddingEnd, decrypt) {
1710
1395
  const {
1711
- ctr,
1712
- hmac,
1396
+ engine,
1713
1397
  pendingInput
1714
1398
  } = aesCrypto;
1715
1399
  if (pendingInput.length) {
1716
1400
  input = concat(pendingInput, input);
1717
1401
  }
1718
1402
  const inputLength = input.length - paddingEnd;
1719
- output = expand(output, paddingStart + (inputLength - (inputLength % BLOCK_LENGTH)));
1720
- let offset;
1721
- for (offset = 0; offset <= inputLength - BLOCK_LENGTH; offset += BLOCK_LENGTH) {
1722
- const inputChunk = toBits(codecBytes, subarray(input, offset, offset + BLOCK_LENGTH));
1723
- if (verifyAuthenticationCode) {
1724
- hmac.update(inputChunk);
1725
- }
1726
- const outputChunk = ctr.update(inputChunk);
1727
- if (!verifyAuthenticationCode) {
1728
- hmac.update(outputChunk);
1729
- }
1730
- output.set(fromBits(codecBytes, outputChunk), offset + paddingStart);
1731
- }
1732
- aesCrypto.pendingInput = subarray(input, offset);
1403
+ const alignedLength = inputLength - (inputLength % BLOCK_LENGTH);
1404
+ output = expand(output, paddingStart + alignedLength);
1405
+ if (alignedLength) {
1406
+ const chunk = subarray(output, paddingStart, paddingStart + alignedLength);
1407
+ chunk.set(subarray(input, 0, alignedLength));
1408
+ engine.process(chunk, decrypt);
1409
+ }
1410
+ aesCrypto.pendingInput = subarray(input, alignedLength);
1733
1411
  return output;
1734
1412
  }
1735
1413
 
@@ -1737,10 +1415,17 @@ async function createDecryptionKeys(decrypt, strength, password, preamble) {
1737
1415
  const passwordVerificationKey = await createKeys$1(decrypt, strength, password, subarray(preamble, 0, SALT_LENGTH[strength]));
1738
1416
  const passwordVerification = subarray(preamble, SALT_LENGTH[strength]);
1739
1417
  if (passwordVerificationKey[0] != passwordVerification[0] || passwordVerificationKey[1] != passwordVerification[1]) {
1418
+ disposeEngine(decrypt);
1740
1419
  throw new Error(ERR_INVALID_PASSWORD);
1741
1420
  }
1742
1421
  }
1743
1422
 
1423
+ function disposeEngine({ engine }) {
1424
+ if (engine && engine.dispose) {
1425
+ engine.dispose();
1426
+ }
1427
+ }
1428
+
1744
1429
  async function createEncryptionKeys(encrypt, strength, password) {
1745
1430
  const salt = getRandomValues(new Uint8Array(SALT_LENGTH[strength]));
1746
1431
  const passwordVerification = await createKeys$1(encrypt, strength, password, salt);
@@ -1749,48 +1434,22 @@ async function createEncryptionKeys(encrypt, strength, password) {
1749
1434
 
1750
1435
  async function createKeys$1(aesCrypto, strength, password, salt) {
1751
1436
  aesCrypto.password = null;
1752
- const baseKey = await importKey(RAW_FORMAT, password, BASE_KEY_ALGORITHM, false, DERIVED_BITS_USAGE);
1753
- const derivedBits = await deriveBits(Object.assign({ salt }, DERIVED_BITS_ALGORITHM), baseKey, 8 * ((KEY_LENGTH[strength] * 2) + 2));
1754
- const compositeKey = new Uint8Array(derivedBits);
1755
- const key = toBits(codecBytes, subarray(compositeKey, 0, KEY_LENGTH[strength]));
1756
- const authentication = toBits(codecBytes, subarray(compositeKey, KEY_LENGTH[strength], KEY_LENGTH[strength] * 2));
1757
- const passwordVerification = subarray(compositeKey, KEY_LENGTH[strength] * 2);
1758
- Object.assign(aesCrypto, {
1759
- keys: {
1760
- key,
1761
- authentication,
1762
- passwordVerification
1763
- },
1764
- ctr: new CtrGladman(new Aes(key), Array.from(COUNTER_DEFAULT_VALUE)),
1765
- hmac: new HmacSha1(authentication)
1766
- });
1767
- return passwordVerification;
1437
+ const keyLength = KEY_LENGTH[strength];
1438
+ const compositeKey = await deriveKey(password, salt, keyLength * 2 + PASSWORD_VERIFICATION_LENGTH);
1439
+ aesCrypto.engine = createEngine(subarray(compositeKey, 0, keyLength), subarray(compositeKey, keyLength, keyLength * 2));
1440
+ return subarray(compositeKey, keyLength * 2);
1768
1441
  }
1769
1442
 
1770
- async function importKey(format, password, algorithm, extractable, keyUsages) {
1771
- if (IMPORT_KEY_SUPPORTED) {
1772
- try {
1773
- return await subtle.importKey(format, password, algorithm, extractable, keyUsages);
1774
- } catch {
1775
- IMPORT_KEY_SUPPORTED = false;
1776
- return misc.importKey(password);
1777
- }
1778
- } else {
1779
- return misc.importKey(password);
1780
- }
1781
- }
1782
-
1783
- async function deriveBits(algorithm, baseKey, length) {
1443
+ async function deriveKey(password, salt, length) {
1784
1444
  if (DERIVE_BITS_SUPPORTED) {
1785
1445
  try {
1786
- return await subtle.deriveBits(algorithm, baseKey, length);
1446
+ const baseKey = await subtle.importKey(RAW_FORMAT, password, BASE_KEY_ALGORITHM, false, DERIVED_BITS_USAGE);
1447
+ return new Uint8Array(await subtle.deriveBits(Object.assign({ salt }, DERIVED_BITS_ALGORITHM), baseKey, length * 8));
1787
1448
  } catch {
1788
1449
  DERIVE_BITS_SUPPORTED = false;
1789
- return misc.pbkdf2(baseKey, algorithm.salt, DERIVED_BITS_ALGORITHM.iterations, length);
1790
1450
  }
1791
- } else {
1792
- return misc.pbkdf2(baseKey, algorithm.salt, DERIVED_BITS_ALGORITHM.iterations, length);
1793
1451
  }
1452
+ return pbkdf2(password, salt, PBKDF2_ITERATIONS, length);
1794
1453
  }
1795
1454
 
1796
1455
  function encodePassword(password, rawPassword) {
@@ -1814,13 +1473,6 @@ function subarray(array, begin, end) {
1814
1473
  return array.subarray(begin, end);
1815
1474
  }
1816
1475
 
1817
- function fromBits(codecBytes, chunk) {
1818
- return codecBytes.fromBits(chunk);
1819
- }
1820
- function toBits(codecBytes, chunk) {
1821
- return codecBytes.toBits(chunk);
1822
- }
1823
-
1824
1476
  /*
1825
1477
  Copyright (c) 2022 Gildas Lormeau. All rights reserved.
1826
1478
 
@@ -2760,11 +2412,18 @@ async function supportsDeflate(config) {
2760
2412
  return true;
2761
2413
  }
2762
2414
  if (FallbackStream) {
2415
+ return await loadModule(config);
2416
+ }
2417
+ return false;
2418
+ }
2419
+
2420
+ async function loadModule(config) {
2421
+ if (initModule) {
2763
2422
  try {
2764
2423
  await initModule(config);
2765
2424
  return true;
2766
2425
  } catch {
2767
- return false;
2426
+ // ignored
2768
2427
  }
2769
2428
  }
2770
2429
  return false;
@@ -2807,27 +2466,29 @@ class CodecWorker {
2807
2466
  terminate() {
2808
2467
  return new Promise(resolve => {
2809
2468
  const { worker, busy } = workerData;
2810
- if (worker) {
2811
- if (busy) {
2812
- workerData.resolveTerminated = resolve;
2813
- } else {
2469
+ if (busy) {
2470
+ workerData.terminateResolvers = workerData.terminateResolvers || [];
2471
+ workerData.terminateResolvers.push(resolve);
2472
+ } else {
2473
+ if (worker) {
2814
2474
  worker.terminate();
2815
- resolve();
2475
+ workerData.worker = null;
2816
2476
  }
2817
- workerData.interface = null;
2818
- } else {
2819
2477
  resolve();
2820
2478
  }
2479
+ workerData.interface = null;
2821
2480
  });
2822
2481
  },
2823
2482
  onTaskFinished() {
2824
2483
  if (workerData.busy) {
2825
- const { resolveTerminated } = workerData;
2826
- if (resolveTerminated) {
2827
- workerData.resolveTerminated = null;
2828
- workerData.terminated = true;
2829
- workerData.worker.terminate();
2830
- resolveTerminated();
2484
+ const { terminateResolvers, worker } = workerData;
2485
+ if (terminateResolvers) {
2486
+ workerData.terminateResolvers = null;
2487
+ if (worker) {
2488
+ workerData.terminated = true;
2489
+ worker.terminate();
2490
+ }
2491
+ terminateResolvers.forEach(resolve => resolve());
2831
2492
  }
2832
2493
  workerData.busy = false;
2833
2494
  onTaskFinished(workerData);
@@ -2883,28 +2544,23 @@ function createWorkerInterface(workerData, config) {
2883
2544
  }
2884
2545
 
2885
2546
  async function runWorker$1({ options, readable, writable, onTaskFinished, workerOptions }, config) {
2886
- let codecStream, chunkStream;
2547
+ let codecStream, chunkStream, modulePromise;
2887
2548
  try {
2888
2549
  if (options.compressed && !options.format) {
2889
2550
  const deflate = options.codecType.startsWith(CODEC_DEFLATE);
2890
2551
  const FallbackStream = deflate ? config.CompressionStreamFallback : config.DecompressionStreamFallback;
2891
2552
  const NativeStream = deflate ? config.CompressionStream : config.DecompressionStream;
2892
2553
  if (!options.useCompressionStream) {
2893
- try {
2894
- await initModule(config);
2895
- } catch {
2896
- if (!FallbackStream || FallbackStream.requiresModule) {
2897
- options.useCompressionStream = true;
2898
- }
2554
+ if (!await moduleLoaded() && (!FallbackStream || FallbackStream.requiresModule)) {
2555
+ options.useCompressionStream = true;
2899
2556
  }
2900
2557
  } else if (FallbackStream && FallbackStream.requiresModule && !supportsDeflateRaw(NativeStream)) {
2901
- try {
2902
- await initModule(config);
2903
- } catch {
2904
- // ignored
2905
- }
2558
+ await moduleLoaded();
2906
2559
  }
2907
2560
  }
2561
+ if (options.encrypted && !options.zipCrypto) {
2562
+ await moduleLoaded();
2563
+ }
2908
2564
  codecStream = new CodecStream(options, config);
2909
2565
  chunkStream = new ChunkStream(getChunkSize(config));
2910
2566
  await readable
@@ -2937,6 +2593,13 @@ async function runWorker$1({ options, readable, writable, onTaskFinished, worker
2937
2593
  } finally {
2938
2594
  onTaskFinished();
2939
2595
  }
2596
+
2597
+ function moduleLoaded() {
2598
+ if (!modulePromise) {
2599
+ modulePromise = loadModule(config);
2600
+ }
2601
+ return modulePromise;
2602
+ }
2940
2603
  }
2941
2604
 
2942
2605
  /*
@@ -4093,16 +3756,14 @@ async function initHttpReader(httpReader, sendRequest, getRequestData) {
4093
3756
  combineSizeEocd
4094
3757
  } = httpReader;
4095
3758
  if (isHttpFamily(url) && (useRangeHeader || forceRangeRequests) && (typeof preventHeadRequest == UNDEFINED_TYPE || preventHeadRequest)) {
4096
- const response = await sendRequest(HTTP_METHOD_GET, httpReader, getRangeHeaders(httpReader, combineSizeEocd ? -END_OF_CENTRAL_DIR_LENGTH : undefined));
3759
+ const response = await sendRequest(HTTP_METHOD_GET, httpReader, getRangeHeaders(httpReader, combineSizeEocd ? -65557 : undefined));
4097
3760
  const acceptRanges = response.headers.get(HTTP_HEADER_ACCEPT_RANGES);
4098
3761
  if (!forceRangeRequests && (!acceptRanges || acceptRanges.toLowerCase() != HTTP_RANGE_UNIT)) {
4099
3762
  throw new Error(ERR_HTTP_RANGE);
4100
3763
  } else {
4101
- if (combineSizeEocd) {
4102
- const eocdCache = new Uint8Array(await response.arrayBuffer());
4103
- if (response.status == 206 && eocdCache.length == END_OF_CENTRAL_DIR_LENGTH) {
4104
- httpReader.eocdCache = eocdCache;
4105
- }
3764
+ let eocdCache;
3765
+ if (combineSizeEocd && response.status == 206) {
3766
+ eocdCache = new Uint8Array(await response.arrayBuffer());
4106
3767
  }
4107
3768
  setResourceValidators(httpReader, response);
4108
3769
  const contentSize = getContentRangeSize(response);
@@ -4111,6 +3772,9 @@ async function initHttpReader(httpReader, sendRequest, getRequestData) {
4111
3772
  } else {
4112
3773
  httpReader.size = contentSize;
4113
3774
  }
3775
+ if (eocdCache && eocdCache.length && getContentRangeOffset(response) === httpReader.size - eocdCache.length) {
3776
+ httpReader.eocdCache = eocdCache;
3777
+ }
4114
3778
  }
4115
3779
  } else {
4116
3780
  await getContentLength(httpReader, sendRequest, getRequestData);
@@ -4126,25 +3790,23 @@ async function readUint8ArrayHttpReader(httpReader, index, length, sendRequest,
4126
3790
  options
4127
3791
  } = httpReader;
4128
3792
  if (useRangeHeader || forceRangeRequests) {
4129
- if (eocdCache && index == size - END_OF_CENTRAL_DIR_LENGTH && length == END_OF_CENTRAL_DIR_LENGTH) {
4130
- return eocdCache;
4131
- }
4132
3793
  if (index >= size || length === 0) {
4133
3794
  return EMPTY_UINT8_ARRAY;
4134
3795
  } else {
4135
3796
  if (index + length > size) {
4136
3797
  length = size - index;
4137
3798
  }
3799
+ if (eocdCache && index >= size - eocdCache.length) {
3800
+ const cacheIndex = index - (size - eocdCache.length);
3801
+ return eocdCache.slice(cacheIndex, cacheIndex + length);
3802
+ }
4138
3803
  const response = await sendRequest(HTTP_METHOD_GET, httpReader, getRangeHeaders(httpReader, index, length));
4139
3804
  if (response.status != 206) {
4140
3805
  throw new Error(ERR_HTTP_RANGE);
4141
3806
  }
4142
- const contentRangeHeader = response.headers.get(HTTP_HEADER_CONTENT_RANGE);
4143
- if (contentRangeHeader) {
4144
- const rangeStart = Number(contentRangeHeader.trim().split(/[\s-]+/)[1]);
4145
- if (!Number.isNaN(rangeStart) && rangeStart != index) {
4146
- throw new Error(ERR_HTTP_RANGE);
4147
- }
3807
+ const rangeStart = getContentRangeOffset(response);
3808
+ if (rangeStart !== UNDEFINED_VALUE && rangeStart != index) {
3809
+ throw new Error(ERR_HTTP_RANGE);
4148
3810
  }
4149
3811
  checkResourceValidators(httpReader, response);
4150
3812
  setResourceValidators(httpReader, response);
@@ -4204,12 +3866,9 @@ function createRangeReadable(httpReader, offset, size) {
4204
3866
  if (response.status != 206) {
4205
3867
  throw new Error(ERR_HTTP_RANGE);
4206
3868
  }
4207
- const contentRangeHeader = response.headers.get(HTTP_HEADER_CONTENT_RANGE);
4208
- if (contentRangeHeader) {
4209
- const rangeStart = Number(contentRangeHeader.trim().split(/[\s-]+/)[1]);
4210
- if (!Number.isNaN(rangeStart) && rangeStart != windowOffset) {
4211
- throw new Error(ERR_HTTP_RANGE);
4212
- }
3869
+ const rangeStart = getContentRangeOffset(response);
3870
+ if (rangeStart !== UNDEFINED_VALUE && rangeStart != windowOffset) {
3871
+ throw new Error(ERR_HTTP_RANGE);
4213
3872
  }
4214
3873
  checkResourceValidators(httpReader, response);
4215
3874
  setResourceValidators(httpReader, response);
@@ -4225,6 +3884,16 @@ function createRangeReadable(httpReader, offset, size) {
4225
3884
  }
4226
3885
  }
4227
3886
 
3887
+ function getContentRangeOffset(response) {
3888
+ const contentRangeHeader = response.headers.get(HTTP_HEADER_CONTENT_RANGE);
3889
+ if (contentRangeHeader) {
3890
+ const rangeStart = Number(contentRangeHeader.trim().split(/[\s-]+/)[1]);
3891
+ if (!Number.isNaN(rangeStart)) {
3892
+ return rangeStart;
3893
+ }
3894
+ }
3895
+ }
3896
+
4228
3897
  function getContentRangeSize(response) {
4229
3898
  const contentRangeHeader = response.headers.get(HTTP_HEADER_CONTENT_RANGE);
4230
3899
  if (contentRangeHeader) {
@@ -5005,7 +4674,7 @@ class ZipReader {
5005
4674
  Object.assign(this, {
5006
4675
  reader: new GenericReader(reader),
5007
4676
  options,
5008
- readRanges: new Map()
4677
+ readRanges: { indexes: new Set(), sortedRanges: [], pendingRanges: [] }
5009
4678
  });
5010
4679
  }
5011
4680
 
@@ -5650,7 +5319,6 @@ let ZipEntry$1 = class ZipEntry {
5650
5319
  throw new Error(ERR_ENTRY_DATA_OUT_OF_BOUNDS);
5651
5320
  }
5652
5321
  const size = compressedSize;
5653
- const readable = toCompatibleReadable(reader.createReadable({ offset: dataOffset, size }));
5654
5322
  const signal = checkSignalOption(getOptionValue$1(zipEntry, options, OPTION_SIGNAL));
5655
5323
  throwIfAborted(signal);
5656
5324
  let checkOverlappingEntry = getOptionValue$1(zipEntry, options, OPTION_CHECK_OVERLAPPING_ENTRY);
@@ -5724,6 +5392,7 @@ let ZipEntry$1 = class ZipEntry {
5724
5392
  writer = new GenericWriter(writer);
5725
5393
  await initStream(writer, getDecodableOutputSize(outputSize, compressedSize, compressed));
5726
5394
  ({ writable } = writer);
5395
+ const readable = toCompatibleReadable(reader.createReadable({ offset: dataOffset, size }));
5727
5396
  const { outputSize: writtenSize } = await runWorker({ readable, writable }, workerOptions);
5728
5397
  if (writtenSize != outputSize) {
5729
5398
  throw Object.assign(new Error(ERR_INVALID_UNCOMPRESSED_SIZE), { outputSize: writtenSize });
@@ -6159,14 +5828,61 @@ async function detectOverlappingEntry({
6159
5828
  end: dataOffset + compressedSize + dataDescriptorLength,
6160
5829
  fileEntry
6161
5830
  };
6162
- for (const [otherIndex, otherRange] of readRanges) {
6163
- if (otherIndex != index && range.start < otherRange.end && otherRange.start < range.end) {
5831
+ const { indexes, sortedRanges, pendingRanges } = readRanges;
5832
+ if (!indexes.has(index)) {
5833
+ const overlappingRange = findOverlappingRange(sortedRanges, range) || pendingRanges.find(otherRange => rangesOverlap(range, otherRange));
5834
+ if (overlappingRange) {
6164
5835
  const error = new Error(ERR_OVERLAPPING_ENTRY);
6165
- error.overlappingEntry = otherRange.fileEntry;
5836
+ error.overlappingEntry = overlappingRange.fileEntry;
6166
5837
  throw error;
6167
5838
  }
5839
+ indexes.add(index);
5840
+ pendingRanges.push(range);
5841
+ if (pendingRanges.length * pendingRanges.length > sortedRanges.length) {
5842
+ pendingRanges.sort((range, otherRange) => range.start - otherRange.start);
5843
+ readRanges.sortedRanges = mergeRanges(sortedRanges, pendingRanges);
5844
+ pendingRanges.length = 0;
5845
+ }
5846
+ }
5847
+ }
5848
+
5849
+ function findOverlappingRange(sortedRanges, range) {
5850
+ let low = 0;
5851
+ let high = sortedRanges.length;
5852
+ while (low < high) {
5853
+ const middle = (low + high) >>> 1;
5854
+ if (sortedRanges[middle].start < range.start) {
5855
+ low = middle + 1;
5856
+ } else {
5857
+ high = middle;
5858
+ }
5859
+ }
5860
+ const previousRange = sortedRanges[low - 1];
5861
+ const nextRange = sortedRanges[low];
5862
+ if (previousRange && rangesOverlap(range, previousRange)) {
5863
+ return previousRange;
5864
+ }
5865
+ if (nextRange && rangesOverlap(range, nextRange)) {
5866
+ return nextRange;
5867
+ }
5868
+ }
5869
+
5870
+ function rangesOverlap(range, otherRange) {
5871
+ return range.start < otherRange.end && otherRange.start < range.end;
5872
+ }
5873
+
5874
+ function mergeRanges(sortedRanges, pendingRanges) {
5875
+ const mergedRanges = [];
5876
+ let indexSorted = 0;
5877
+ let indexPending = 0;
5878
+ while (indexSorted < sortedRanges.length || indexPending < pendingRanges.length) {
5879
+ if (indexPending == pendingRanges.length || (indexSorted < sortedRanges.length && sortedRanges[indexSorted].start < pendingRanges[indexPending].start)) {
5880
+ mergedRanges.push(sortedRanges[indexSorted++]);
5881
+ } else {
5882
+ mergedRanges.push(pendingRanges[indexPending++]);
5883
+ }
6168
5884
  }
6169
- readRanges.set(index, range);
5885
+ return mergedRanges;
6170
5886
  }
6171
5887
 
6172
5888
  function readDataDescriptor(dataDescriptorView, offset, extraFieldZip64) {
@@ -6744,7 +6460,6 @@ class ZipWriter {
6744
6460
  rawExtraFieldUnix: EMPTY_UINT8_ARRAY,
6745
6461
  rawExtraField,
6746
6462
  rawCentralExtraField: EMPTY_UINT8_ARRAY,
6747
- extendedTimestamp: false,
6748
6463
  headerArray,
6749
6464
  headerView
6750
6465
  });
@@ -7488,7 +7203,7 @@ function resolveEntrySizes(zipWriter, hasContent, contentSize, metadata, options
7488
7203
  }
7489
7204
  }
7490
7205
  const emptyEntry = !encryptedEntry && (!hasContent || (contentSize === 0 && !passThroughCompression)) && !isCompressed(compressionMethod, level);
7491
- if (emptyEntry && !zipCrypto && getOptionValue(zipWriter, options, OPTION_DATA_DESCRIPTOR) === UNDEFINED_VALUE) {
7206
+ if (emptyEntry && getOptionValue(zipWriter, options, OPTION_DATA_DESCRIPTOR) === UNDEFINED_VALUE) {
7492
7207
  dataDescriptor = false;
7493
7208
  }
7494
7209
  const zip64UncompressedSize = zip64Enabled || unknownSize || uncompressedSize >= MAX_32_BITS;
@@ -9098,7 +8813,7 @@ function formatSupported(StreamClass, format) {
9098
8813
  EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
9099
8814
  */
9100
8815
 
9101
- const VERSION = "2.13.1";
8816
+ const VERSION = "2.14.1";
9102
8817
 
9103
8818
  /*
9104
8819
  Copyright (c) 2025 Gildas Lormeau. All rights reserved.
@@ -10056,12 +9771,16 @@ class ZipDirectoryEntry extends ZipEntry {
10056
9771
  let directoryEntry = parent;
10057
9772
  if (name) {
10058
9773
  directoryEntry = parent.getChildByName(name);
10059
- if (directoryEntry && !directoryEntry.directory) {
9774
+ if (directoryEntry && (!directoryEntry.directory || directoryEntry.data)) {
10060
9775
  if (duplicates == DUPLICATES_KEEP_FIRST) {
10061
9776
  continue;
10062
9777
  } else if (duplicates == DUPLICATES_KEEP_LAST) {
10063
- this.fs.remove(directoryEntry);
10064
- directoryEntry = UNDEFINED_VALUE;
9778
+ if (directoryEntry.directory) {
9779
+ directoryEntry.data = entry;
9780
+ } else {
9781
+ this.fs.remove(directoryEntry);
9782
+ directoryEntry = UNDEFINED_VALUE;
9783
+ }
10065
9784
  } else {
10066
9785
  throw new Error(ERR_DUPLICATE_IMPORTED_ENTRY);
10067
9786
  }
@@ -11031,7 +10750,7 @@ function decodeMimeTypes(data) {
11031
10750
  */
11032
10751
 
11033
10752
 
11034
- i(setDefaultConfiguration);
10753
+ f(setDefaultConfiguration);
11035
10754
 
11036
10755
  exports.BlobReader = BlobReader;
11037
10756
  exports.BlobWriter = BlobWriter;