@zip.js/zip.js 2.15.0 → 2.16.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 (44) hide show
  1. package/BENCHMARKS.md +4 -2
  2. package/deno.json +1 -1
  3. package/dist/zip-core-external.js +410 -227
  4. package/dist/zip-core-external.min.js +1 -1
  5. package/dist/zip-core.js +234 -109
  6. package/dist/zip-core.min.js +1 -1
  7. package/dist/zip-fs-core-external.js +552 -237
  8. package/dist/zip-fs-core-external.min.js +1 -1
  9. package/dist/zip-fs-core.js +377 -118
  10. package/dist/zip-fs-core.min.js +1 -1
  11. package/dist/zip-fs-external.js +552 -237
  12. package/dist/zip-fs-external.min.js +1 -1
  13. package/dist/zip-fs-native.js +379 -120
  14. package/dist/zip-fs-native.min.js +1 -1
  15. package/dist/zip-fs.js +554 -237
  16. package/dist/zip-fs.min.js +1 -1
  17. package/dist/zip-legacy.js +236 -111
  18. package/dist/zip-legacy.min.js +1 -1
  19. package/dist/zip-native.js +236 -111
  20. package/dist/zip-native.min.js +1 -1
  21. package/dist/zip-web-worker-native.js +1 -1
  22. package/dist/zip-web-worker.js +1 -1
  23. package/dist/zip.js +411 -228
  24. package/dist/zip.min.js +1 -1
  25. package/eslint.config.mjs +1 -1
  26. package/index-native.cjs +379 -120
  27. package/index-native.min.js +1 -1
  28. package/index.cjs +554 -237
  29. package/index.d.cts +143 -16
  30. package/index.d.ts +143 -16
  31. package/index.min.js +1 -1
  32. package/lib/core/io.js +3 -2
  33. package/lib/core/streams/aes-crypto-stream.js +60 -17
  34. package/lib/core/streams/zip-crypto-stream.js +7 -7
  35. package/lib/core/streams/zip-entry-stream.js +146 -73
  36. package/lib/core/streams/zlib-wasm/zlib-streams.js +176 -118
  37. package/lib/core/util/compatible-streams.js +10 -5
  38. package/lib/core/version.js +1 -1
  39. package/lib/core/web-worker-inline-native.js +1 -1
  40. package/lib/core/web-worker-inline-wasm.js +1 -1
  41. package/lib/core/zip-fs.js +144 -10
  42. package/lib/core/zip-reader.js +5 -5
  43. package/lib/core/zip-writer.js +4 -2
  44. package/package.json +3 -2
@@ -445,7 +445,7 @@
445
445
  Object.assign(config, DEFAULT_CONFIGURATION);
446
446
  }
447
447
 
448
- const n=[3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,43,51,59,67,83,99,115,131,163,195,227,258],r=[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],c=[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],t=[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],s=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],e=new Uint8Array(288);e.fill(8,0,144),e.fill(9,144,256),e.fill(7,256,280),e.fill(8,280,288);const u=new Uint8Array(30).fill(5);function f(n){const r=new Uint16Array(16);for(const c of n)r[c]++;r[0]=0;const c=new Uint16Array(17);for(let n=1;n<=15;n++)c[n+1]=c[n]+r[n];const t=new Uint16Array(n.length);for(let r=0;r<n.length;r++)n[r]&&(t[c[n[r]]++]=r);return {lengthCounts:r,symbols:t}}const i="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",o=(v=()=>function(i){let o=0,v=0,O=0,E=new Uint8Array(1024),l=0,C=0;for(;!C;){C=g(1);const n=g(2);if(0==n)B();else if(1==n)V(f(e),f(u));else {if(2!=n)throw new Error("invalid deflate block type");V(...L());}}return E.subarray(0,l);function W(){if(o>=i.length)throw new Error("unexpected end of deflate data");return i[o++]}function g(n){for(;O<n;)v|=W()<<O,O+=8;const r=v&(1<<n)-1;return v>>>=n,O-=n,r}function B(){v=0,O=0;const n=W()|W()<<8;o+=2,b(l+n);for(let r=0;r<n;r++)E[l++]=W();}function V(s,e){let u=a(s);for(;256!=u;){if(u<256)b(l+1),E[l++]=u;else {const s=u-257,f=n[s]+g(r[s]),i=a(e),o=c[i]+g(t[i]);b(l+f);const v=l-o;for(let n=0;n<f;n++)E[l++]=E[v+n];}u=a(s);}}function L(){const n=g(5)+257,r=g(5)+1,c=g(4)+4,t=new Uint8Array(19);for(let n=0;n<c;n++)t[s[n]]=g(3);const e=f(t),u=new Uint8Array(n+r);let i=0;for(;i<u.length;){const n=a(e);if(n<16)u[i++]=n;else if(16==n){const n=u[i-1];let r=g(2)+3;for(;r--;)u[i++]=n;}else i+=17==n?g(3)+3:g(7)+11;}return [f(u.subarray(0,n)),f(u.subarray(n))]}function a(n){const{lengthCounts:r,symbols:c}=n;let t=0,s=0,e=0;for(let n=1;n<=15;n++){t|=g(1);const u=r[n];if(t-s<u)return c[e+(t-s)];e+=u,s=s+u<<1,t<<=1;}throw new Error("invalid huffman code")}function b(n){if(E.length<n){let r=2*E.length;for(;r<n;)r*=2;const c=new Uint8Array(r);c.set(E.subarray(0,l)),E=c;}}}(function(n){const r=(n=String(n).replace(/[^A-Za-z0-9+/=]/g,"")).length,c=[];for(let t=0;t<r;t+=4){const r=i.indexOf(n[t])<<18|i.indexOf(n[t+1])<<12|(63&i.indexOf(n[t+2]))<<6|63&i.indexOf(n[t+3]);c.push(r>>16&255),"="!==n[t+2]&&c.push(r>>8&255),"="!==n[t+3]&&c.push(255&r);}return new Uint8Array(c)}("zb17c9s4rzj8//spksw+GnFF6UjyJY5s2tOmt3Tbbts0vXncjiNTiRqHykp03DT2+ezvAKQk+pJuN+c8z/nNZByJ4hUEQQAEwN1kJmKZZsLm5HavfNljTN5c8SzZmfAkFdyy1H9vfDkZqEebk4jbZGlXFZDbvVnBdwqZp7Hc68aZKOTtgzwf30Sc/nn6jccykvTV7PKU55GgL8fyPMrp4zzP8iijJ6mQHZU7xZegrd4SfGuE6i2mR/VLQV+Or6IZfTSW4/cpn0dT+jrPLtOCR2P6jn+Xj0WcTXgezWmc31zJLJrQq6yQL3lRjM94dE7f5WNRJFl+eSxzPr6MruhbPp6MT6dcJ9zQD3kqjYRLephdXuW8KNJM6LQL+ojHG6mnS1bwaUKv2XWWTnZ8esb2ZkJBb7JHj1kNbvqDCT7fSek3NhyO6La/UTfJcnvK5Q5nfpf3wla7yx2H3EKSZHztcwc/ShZYciD7/X7wpXHQ6YQHYaPTjDCh+23oj4Z8xORye81lqmRBV/Y6XQmt4azuCPZtKN0Aine/DSVWI/r9fucLVhq2WpYYLTHv8JC+pt/pET2hD+hb+njEvnXj6bgodj6pyvJZLLMc0E+ep4WXMb5YuMFyfHXFxQSSVR/8hfrcLXvgL7g35eJMnnchR878bprYos86lsW901mS8Lzsb4bgndplOuXe6Y3kfyZJwSUVhKZMuB0EYTfvsbSbO6xTFuZMfsm8My4R8+yc7vqECmYmOU1I7Er2GMfOR1/eDjnAwwpbrdGXB/gStNXbCb6FTfV2pKH15ftQ1CVe40tZ4hDfdInlUndTdHOcYomAP8R6bPmFD/MRGXU1MOXyjEub3OZcznLx3yp1uVQz8HWHf5dcTIqdq5W5UDDnGtQSgfepW8yueG7fynLJ2JwKciu9aqao8Lj4a8ZnQByWNJnOinO7RhnEcLtJumouRDlHXsGlWuK2T6WH/SWUe9fj6YwzsVwSyhl0fLksF8zOI5tTuV51iQ+O1A+kq4a9I6AN1UN4kLTMSqioK30J2FaW+Am+qJcXqgKF5TvvWLtJn7DQp690b4ZB2BkR+lC/BoQ+w8fCHgb7jbDVaQYHDdr0w0bYaDSDfRq22mGj0wj8kIb7wX6j0dnv0EbYaTX291uhPyL0ja4rbLUJfa9rw5cP5stf5ssfxgsulBdsN+hWY/5TAXLXoOJpYu++0CjAAgrLf5Ldcob4xb/wXi/4Ygdhx+KDcD/yCaGSadyTvV6w+hquvjYJhZLSgnd2QOgbIB36uw3FF7Lf3yf4HMJzWz034Lmlnpvw3CRfDg7Icn6eTrkd7DJOum+G/ogdHNxFKEtshiapYJ9tSWjORK8XNhfQcht+OwvxRXbfQ69y+gH/wfJa5JCN/lUmBG1ICdr0jzIlbEJKZ/mC7frLpU26Jm4WdtuHxurN1sTeEhn7/RA65LRpxpq/27kTqBlLWVCNCchctfSH+YjxYfP3fISDwEcnGOFY1Es4giGp54a5hYgu72X1BpIzOeRuMOryfwnG/IGds+c2jGehxka+pAiAlH22U0Ii0W9bFuZtWpbKDHiA28mQu2L0JV/qlZQvkVDQTEOiCdT2N1uqsSXMpzHz6Yz5dAxjw0K3V3kW86JQcJKWlXqzq8lYcptT31i8JvNiEqtfWrm0hny1gyjS6gTtHgMYs6BN5jahEshGSf6lQfjJl2wIK9PM4DRXsjhNyBSsZ+qsZupApnA9UxCu5gpCyNYYEdjq8p4gt3ObdOuNusINCps17ARfWDaU/X44wml0O7/bDUuS5RKIoVwstsN1SSfpGS9kZBPWTz31YpNlTTbmNrlNWOIEC58mi4Udsxif48XCnrEZPs8WC3vMxvBMiJptzj7aCfkihv6ISvbRjuE5GNGUfbRn8ByOaME+2mN4bozolL3Xm+Xoy4ehNLbEv4ZpvVv+gXtfMfoihs0RnbP3mFUVSlcKFeuFOBRqjeiEvcesqlCxUoivF5JQqD2i5+w9ZlWF+EohuV4ohUL7oy5n74fTqtB8pdBkvdA5FOoAsN5jVlVoslLofL3QFAodAFTfY1ZV6Hyl0HS90BwKBT7A/z3mVaWmK6Xm66UmWCq4z0wF4X2mKmjcZ66C5n0mK2iN6D+fraB9n+kK9u81X517zdfBfeYr9O8zX2Fwn/kKw/vMV9i4z3yFzfvMV9i6z3yF7fvMV7h/r/nq3Gu+Du4zXw3/PvPVCO4zX43wPvPVaNxnvhrN+8xXo3Wf+Wq07zNfjf17zVfnXvN1MMJd/Io1/W7eD3zLsv/5/DX9+8xfM7jP/DXD+8xf836cx71Yj+a9eI/mvZiP5v6IXrFmh9C8H4T3m7x78SLNezEjrXsxI617MSOtezEjrXsxI617MSOtFkweSPQgcTD7TTlzKPq9MWcP5b83xgyCHPdGTyJw1lcjChIJVDJfqWSyUcn5lkqmqhIngGpCrGayUs35RjXTLdXMdTUhVNPAas5XqpluVDPfUs1EV9MYGfqh30yJ0NBtlBo9JYo+A+WEegzaIA8q9cq7Ulg1lFQ00R87SpLRMmspryopKhqXgtNGk5J1fp9RwXIvmWZZbsv/aoYHzYP2fngAU4pKPCV+ju1X1KcB6bbauyzukrH9UL0nMO9KEUgTmD6lIqQJzAHqDmkCcBQ0GTZHLCtzttQz5myrZ8i5P2IZHdsJ9Wmn1FYUepBPCJ1rCBQlBFbETNmrRGeQNOe10Nr8XVI+lKNK98ZR5faMVGJ+sTQEyTGI+LRS1KZMOjkItzOH5TQmtyiQy15qWXHvXZeIYew4oPSQjjPqxoy9syx7bmfUx/rJMk1s6bzrsXRVOfhLCgEl/aviXemwd2RuCyrJsuzEWvtLQxwWMIZVxVOg9E6oFBErCoHfuUKijKaMgyycMA5icMy4koA5CL8z0O2sq/2DVpc7rEVmzE57vdYCSc8+cWw7/lIQK/lSEGfmBK2g0/L9sHngQPMgpLOk12v4iwTy04LZMyg9q0onX2JipV9i4hRrpZ0AyqcsxfLYHo2ZXUD5oiqffkmINfuSECdeLx9C+RmbYXlskSbMjqF8XJWffUmJVXxJiZOsl29A+YIVWB5bpCmzEyifVOWLLzNixV9mxEnXyzehfMxiLI8tdv8B9ILWJvgyJkEQ/SKHHfgJ4ccf0YxloMCEBdYIKCSx7NdBnW1AGZtpQuUH8IMNBpvNBNDML89ItjEZ2EwLK/fht6nGtNFOCO388sxlG5MG7WADQQC/LTWmjWYa0MwvT3C2Mbf1eglhwTR9tWAyVEw2LDVS7naqp6CpHwPY1jfBC6ksoxs4k3yJNb50Wgf7+63GQQO7s4kr3A2r1vbrdqvOOAE8bbSs07chUfol0Qi02vYmAnE3qFps121XHXLCO9oOddsbmDX7kmqsWm17G1YBnwTtteqWq+44jTtabuiWN3Ct+DLTeLba8iaeadBhi826bb9qu3lH203d9gYCxl8KjXyrbd+FfIB3vfa/D/mseGEni5hYiIJh0/cPWgf7fuc/h4JWsrDTRUIsRMS1HvxHENFKF/ZskRIL0XGtB/8BdLRmC7tYzIiFSLnW/n8EKa1iYceLgliImms9uAs122gg8O+ni43GQavZPtjvhP95urjW9n+ULq61/R+ki2st/0fp4lrbq8gHXC6yuk668Ckwu8jxOgm+hSNkfJ0Y3xoj5H+dAt+aeMQ5cmYLPFbdFNLgsVsdoYI8ILcfFnImq6OsdWnmnWndkrNavBmALBP5XTGUI9ZqfslpBk8HYX3AWTUnqE/fEXpbtY5CgdEbeC/P1gxhtO5Wt8qcqbpWhvKkFNNys8gdvciXhjj83LBseFOqRrSUzTekbL5FyuaGtPPRqI1jLXa7FXZ8ixM8bcbimLJQTdVFPxtFlT0BWBOE+7/bHI79S2uKp5X52S47s6zyBYSot2MxyS7fg21Iwdgx5ZztHYnr8TSd7FyNi2Ke5ZM9Kjnb+5FefSvc8WmWSzc+5/GFW32v5U80ZAOTh6dEd2ujFZuTrjzPszkahWT23iHaku08eH20IzK5U8yurrJc8sle2f2cs1sxvuTR3uuHfzx6Eu4taQbTPC6K9EzYt+fj4jzSOZ69fHC4t1zSnBOamplSyfMx9LGIAt6gZpnjZw/coCyUcDbcm/A8veYPU1nsjWjM2bBDg5DCUVTB2TBo07BJQXE+4yzw6ZSb8KVjzqZg4ucVs1M55SiazlWazjbm5jyMuZdewpD/4DeMHZvpdT9gbiac/amNvc75HbZGt+WkRJzm4/nr8k1SLtBoTxvUwWKMBMWJLDP9KaY3Ua7SHszkORcyjRFmh9mERwmYYpBbbbdUyHEOq+6G22BMREHvIMiSjosbEe+YVk2GaQbmrLuY0KLsSkynUUFzPp7cRLMlE91kYI/n41TuqApNUw9FCEoNh8p1yvWXM27n1KcxKk1Az4QJ6hU0IenQH+0yUP4sFukwwOdgRBRGXnC0akK85JwsbUFjmkCdXNUZj5wQrKkYJpUJNB/YF9wWQGA4GGDaqgrJCSFRYRMSqV7ONMWZrplYuTPumi/kX0EbqFdp/3UJdIjTKfXpjINtXAVoZRVWauduzyNJLyOhAZkvEeIwbEluVRdy3YUYhiCoMBqlpb7qTJE98xv0prQiKdA6T1UzM2knYPqUlcV6Mz4IIn9N4zLjqMaZLthsyEdfYrB5TBN7alkJWSELJRUar2DiDlig7sEOVcKmIMsljcci5lOb3F4odCTLJSnN8q7+d9bK/y7q5zXqZ3QaJXrGYkB9AFbBfnTzgV2wuxdBvb8KbquJ01hfbmKP7JyuLY+cIFZnFHSwNWLG1XSqiorS9q9CyvIBMXOGSsgC1IQbSDqjZWHq093gfwFVS8ZEmEiYQd06Ay7yGg9xlZgo8sjOaELuxpNq+7rRbAXN0BJTbR2c3qo+Qi/GtmR97k2ZJLSazGuOCktjSt2AXkY/lqSu+rKaAQqdqYAQ08uoWDLeLaEGHBd7ZBdUEnOR6WnI6JTN3Nm/gjaa566ZwAH0LEv2Ky6tNorr2lyDURK0EYUlTkqmiwNS5M6U0GnNSCEZyDG5q9TOAGbq0ykhNPZqo7Kkrse7xLmg0xVT0Atu355HfEluOVgTT9LiKivMR5ssV1FcYaxQsOJeCWomZtNpRcEKPhSg371jjQiYxjSx55zI/KZaLTq3sevae/l4vkc5zTjdDWjCa0tXhFhVot6P7ZqzKMZTGYklTTmhOe38ngHfNZbx+e2cs92gBM3aDpaVcE4YnK7QWM9OVpPhctKdJqGzjfODQtneEoO+BlQwvyuUJSIVDntCbmeGPXBZIQU+p2RwC+pXK7Y0kExqml5uWKlXTNOY2yvtgQadN5TdY1Vhirw1XalldQ94orYAoP8sHfLRMsaxTIFjGoMrgu3T3LtMhf2EZq4gBMirBmOM9o/UpxlZwrKm4e+xExrHI+dswgFRYVwxofgUQy6iX+CxRs1rrpZOyfczxq4HpiEkrCnFkM0ZOyO3nM0EL+LxFbc5+kOcvD0CH4ZMcAFG0WTFzrve42sgqEkqJ6Mr8FRDjBj34vNxDrzWAwnEruySHjrS+DnxVKtgEw5OI7IeyhkvN4b6rKgEKO5Qaj88/uf7YfnhPc/TRO/E27nHzV3y29ou+ZP9EUlatdYXC+EZ3aiP/g5xozGRJQgJWS3MVsoi2aD+LrOVurzOZ46IrDAgHLYQZjQThGSZDzY5vKjeAlXPiMl9/Pjfgvb/DLJokUuzv4HwT+Fn4LVmNxDsCFG2HaJgf32HLwHNcc2/5ngmCJxExoJwyacF31kvBd/8rlGAE5qZrEe+to9/u2Mfr0AuVkCebwd5tjRNok2pI2PDht9qBgedgzZtHQT7rcBvHtDOfsfvhMFBiCyt2fAFvymijF4jD/HJVlbOx9VbOCJLQnOyqkXJzTPh7zCkHKUYhNFqVrGRVZjERALXpxUmFZAO+TavD7lBrpSNfEWuwFRegKn8EdCgL2A1T1WL4ClTbZx1O6//l9uRd7TzXbcz5XJIkZwC1Lvcuy59ahB65Qz+N3xA75iuYA+4nXvp5WxqP+C2cE64nRFCg0Zzf7/VCRrECcCF5riqSNkNVLWlUNuxrk21y4YZFTQ19Dw4joqIhQuVbxiOyrGcVJ2QNPgiCSh+jPk64WvaHl5/e2B+q0whVrK8LVUzfCcVhQRGOEt2bko9Te2exFFjw8cTntsrjNCNfat4rKvZdFoz8uhYFAk6yQQHPl5xS9IDphkqGHAvniKPF9UsOdArxYxHnPWlpxlzTpal1uex4ldntXLpkznIx9hNKKCyfzUUVzNRug/yyU6R/uB79BFnexOeTMeSu8jsveRs7+xHerVH33E2bAQ0aBzQzkjrV57cRbU5vY3PZ+LiOP3BI7npvPhkPJ2ejuOLSGxxbDR2x6VGndu6p1FWyp18EqV0VvDNGhL6I71SCrMoplB2JvlhHjfCqKBTfs2n0Yzqcbab0ZjCdjCW4LFZ1/WSy/NsEk1oKq5mEkdyvmScXtVbxQ29pBf0lGFvcSbBZ1OjyDWbW9Ynbs8JPWPrMmmJThZ4SkbCsoT3bSAi5bO5tBOag/fKMSssK7Os3bFl7V5blr2bLuD0zXqYZVM+FvaZUtZY1m68WOwWi8XxYmHfIEZ8pafsL26f0hsC20Ca2NfklP0BKe+5fe1tQI3O6W0JG3PytoHERB0NGaIpbprYx+QCu/CKU90ivJ3ZL/nWFpaElH290JWAIHLKPkBSsr0MAkgJEJW7ZheKKYYyt1/yUr5Q7Apf6r7IqjXVR7JMLcuOB0biD1hCJLIvsa4rVHfpz5eEEPqG21f0lIKjyq0BfPvKiwHJ2PHgQj1FShy5UW6Fle/hWe17SEjNBL3iP3eNBK84vzqL8Mk250glyxn7iJIQDOdD3HRdJuiuvcK4CULKLAo7lyXVFutqDkS6HuuUVBHQ1hbskWLrKnVD6nZorDuQVHoy0s0MlYMwGdSYrDKsiRsDuLHmOn01F+ZZ9/uU7CWIBlzPhzQhjp603FtH4ZVM6Flr+oCqCXr4i/Rui2O2QfG2uW1vo3k1DUsMkhcreaKkZgrNZtQgkPPtRHFiULzzkuJdblneF8D1PUzlk+n4LDql2UyW9O8MNDCAisf0B/1GD9cJX5rYsWXZyeAQFsshrqVjvZaUs/k5riX9+QdM7rzWpFwivbxEDOXkEJbrIRAr7m0BGb1chfnfjmODZp1VNAvoxiGQm0M6Wa3VANk6yUkT+3yxOANJWEtECjZ/R4a+Kc9mesg2tfXonEhjWqDN4hScZhVwlGHk2EbejfVvY8ZpweSSdOee6hESoyWhYrGIK4XERBGwUhhac1hM7QD8x1FgeMdhUZTrUm7KSXLFzXpNVzlluz69gaPE/EarJefLJBXj6fTm9tIuuQ9ZmbPSjL0ErUy24oedK94QV6j5pUmFXrVmBytm6BZOy2C1npfDXet7briLz5zKAZPO+kwMYptEU8u6sU1RiW+rv9KeAPpyOiEU/gOaQisUmPRKRWoTGDdNWMHlu/SSZzOJU1RokfgrJ4S2eMPUfQL5mvJxXuZPwGXykEp6Rr+RpYkv9Tz+OhuKOhWcILHGfK7gNOobL1WsigqvzekzDh0M/nEyluO98sgSGNVZwRmncmlyv7niflNQ36dbGd78JwyvfUiWhWXtfrMs+1jzOJqSHKtNGeX8Q70vJ3ZRk5Zvg28Kt8DiWe/Kx3fvyqg1B4NgcPHeet5y+PawEe5pFQY28myDE39THccL6KagGjtx2QDJB4xToTle59kVz+WNzeleSU736O0ZV+6wwtSRv68UWOA0v9Y/g+7vXCIdXD8uNpGEK41XVfUHQ/1uWEdbVj7Io2yxyMEi3auI4mCvekRxIXqkSGCMaFbqapN1srkrF4vdbLFIGctqFNPIlRhaTFxZphryr1U1JApr3lV6xd+d59ns7BzoQpX5jzWJWnpzHVUFphoirMCaofn2NbSmJye3MCS0ye6WJy8C189Nt0QyfR5TinSwmDxA+Dq/Rvjuac7HF8syFboFuxyiI+BTCau7TrVUZ9RX7qGxAYxc7TPLpVL9/FphvcDM0jmFTiA5LFFRo/gLEA9hodM/a0FxTwuDv93NHIkN5gasSfCoD5S08bubK6QKCnuSburhflV8SOW5/Scng4Q94dFK6l4qVOsEGA72EE4VvJpVYX7pMLHiZJCoqACzNcaFTu/YOJAYVgdOsbF1mFuFwX5W2qyc3tZyY7zE7Wm82Uq5jOE8qm5IGPvcyrAcVh9OGMm7jF1blpmxb35e1dh+3QiTcquYSL5kRdccgE6m6wPpblCtfCvVmq0szenqSi1WX8eGHPT8TkyqD3OHyiswY2Di59c0N7bXeRzt9iDKQAuix7u1hjIHG/qUcVd0s/JEnqUDW3FFGWCLcFj5CdSx52kCtlxRmcUUWFI4g6E5GuHX6SnWkVZkLXNxZ7R3hZcWT1KBq58sFrwXEHSQa7dajTahG+IdYgsMIveuYP4koVmNEt2sz7skcRg3YuLEdo2enNxmsFoclhms1PbwIOUh6EqQCg3YnSzZ4aSMapMTmhudqDSONuwhqOTf3OVw7e/VGGogTQJ4AI1+5CxUrLQ6VxLj6/RsLLMcrYKqN+98nE/m45wfZiKe5TkX8Y1l2R85+2mWit7VVmKm3qxUsHBiWXsZhhGrw5OV5PCp3vEpl/pBrvh9Qed1fQqFZzmfHE4zfTKQEUPDmOn+qPy7AUZzQbwF1fXaqa9i5VHYoClNutW57W12pYy3QOslkvRMHZqDXOYpiY/UxH/b1rD7mHvn4wLHLS1rC27cbkqWd4m0THbrY0Gxaxht5bvseDtfhfvBzmU2mU3BgOWxOlHn9B80i0p8HKKtzq5BsU+WFQho7GErJ2+PVvkSxAAEEFc5jrD4k3E65RMw69IoU0pywGJu6tEw/toW9VqxTYpVmbeJt9DJkrsGFVM5fziX2wR8xVptWDrsclLilKaDz0qdcFcsFrbQqPushLQg5aJH/zGgARD3BeVcRGnNOALnVMEkhyP8miIYYXg0sGGLX9/VtwAv2gol+kjPi0JchBmQzZeIJjbMFiB7zcNUUv2vFdgOUBgdQrtSvuA8VGqZf9Kj3S1jLVVClrXl4+dpempZ9k+KsTtKEbq7FYhmc1s+Vw3+pCi7s2RtAXF7np6dfxhLnr8c5xdRsKRzxitOawAse/VGorsPTPT+PbY56z9VuCkkqhczaeOeEO1BgT2qhdWjSSQkKEAks4V0AvIv4b188PHr8YMnj78evXr3+Onjt90t0mhWncV0TTmUZsD7aYZ9uaRT0k0Yr0SIdeOHleOiyzuOi0qZwxTBLu1b5P+VvKtFAUKxYdwQZdkJioy+yqd4fiUW151S8Lws4VlWprXjtR2cBquE+GVclrAFbqIE7QtOFZD4PwGvljlyBJf2cv6N2zEtMNghn+88N/mNarfN2B4E8BRn1R5rS5ahpYdWxcF25Mk8vbTJQNiSRJIC83QkJD/juZ0Ry8r6LBjk3uX4u53RdpNEyEV1r8f5jqTZ0i5IKRPN10TGlddUv4IkenuV82su5CFOxq5P9fsDnAiw89U1JubsVlKeyVyvHCOZOtUr2CZrlMayezTnxWwqo78vvDS2sBLX0kFqcP8Rhqg09zZDTJIlgUoTO7Gs3cSbZvEFnxi0bevYqmISNxrDqCCT62eeUrMguHdVB9qqKyrcoi0YzGftIg0mF7WP9C4rPeKNxEFp7RgJUnpZn9ucDnWlo7KPABq1IcBTt34CzDAOxvVQdNc11keCFhLU9jmFbSxKKRrDJ+YkxBS1XaCMX2cawEi7xvdSfXYiLkQ2FztoIrNHqmWAczTgkcp2jCsCxUsgCFP2j/qEBloyipcA+cKy7KnWySlr/sKDf+XajopS47ckdKYyb+F/CJWKfzSOfXbO7VscRzSl+B/dFyI99bzCz9tlnXFJluPJ5DGspBdpIbngub2nO7BH7VtQMYAZJOi5cTJwaUiTEtF1Es6RCU4Tew+ZDCAkloUkkkrGXvBaFfhUsT+CdJ+CqeKUS7RJ53a5LSwWKiyurhrd+/fG8QXUWVfDZVkNlyvVmAqcVJaa6XJ9o8Zob4nYd2uEH07kSvzhWK6EHJYbMYNnUsUynkodzHgsqco8l0t2Ns1Ox9N3IGVNJLpiBPs06EDUBbpPD2ibBj5t0SCgTXDZaNCgQUMaNGlAwRPrXJHuRNo+oVfqJcaXGwmS96qdooo4cCOVTMqpzxgfdKIm6ZZpGEkCltvlluJBE8tfrpZvRqEqclE1P/RpQKGzTdqm2tVEuZjQZoe2m/SgDXE+aXAQQlhT2ug0aSsI6X67QwM/bNKg1WjT0G92aMPfD2nTP2jTdtBs0g4UCcKw06FBG4qFzdZ+e0To6bbGW7RN96EDPvahid3woSdhBzvjQ39abehSx8deQT7oWdtXvQub1B8ZxwXX0tS7pontg2pULTNtbLrCYCRSk4lE/lLQyYSJteLGeSrYLmekrK4ktSv02IF+gVqOSzuhppL1TJbKaH+XCdBe/A/6SbwknU4hIC+VjqmXPq6jCd8eRueSvo58ehT59CTy6QNIeBv59FPk06+RTx9Fe3tURj5NI5++jHz6rjSsqGv8ISszqB3Bgl5PllFVnkSczipoEPoqEvQikvRh5NNnkU+vIp++j8y6vtXiuIneyoCV1wasLCzjnqJFdgb/nGB9PagAqXo11KKUxkNJlrAqDiVDXdmaolXqeNYfQMEED38wqR5eMH+5pK/vKFZZAULWP8vCv5WF/2JCPTxnuXr4yDIzoMp3aXrniSHvue3FgvfDwUEUuny0WOztGSZestZDc+8R+15rr21BMGnvxzQ9VRvkzp6jt0JJnL0de88Rzh7ZqxwhDdOvlTkFL0CflqqrGr4S4ZszCKW7CCxBwUqNBd1KZK3NxXR93Ps85N5TiMFitPZWf8VcGGeJUFWi9GQ0EPhxtUwUAmD4bZqhpq9lSdBAepw73JO8ttH+PExVmGJQ130epk6gA+lA5TophJDBUMxhDfCgdQML66QgZQ1nYBro/CGdYOQJsHbnXsaHj6SdkSpBcsa4lxo2cJ9W4IhDw1OSLR3MR8zHnkAI4OoRQgNVncKOiJ8093UFebxX7gcDyo9WPkJc5cFUDPkomkI4xLajXDgN+8GXxmJ8Jp19qlY3zZkN/4kb0IxNpY6IZEvnjXQD8l9vJIgoQa/XcZ5VpMDzPKQTQYtQIAsJj5ohjXnk04JrmkJnPGqE++19OgUeZQzs2Rw5Ex5l9FyRv1jakKdD6FWVIAi9Aebtc0lrdI5LqP5CVdqhTyOfnkLKNfycwc8x/ABfT7/xyA3pITy+hp/v8HMEPyfw8wB+3sLPY/j5BD9f4ecR/LyEn3fw8wR+XqmOFdIOf38B8h19WJHuMuVZ1fmP+C6hYAo/bzgQYQ6P7+HnA/z8xaMO/aMcyQtI+hN+foOfXNU1l/ZzWdJ94l2Or/CY3L4VkOk5/HyEn8888uHANKuKhb//CZ349aJPjaK//bOiXEavwDBB6P+Z+m/sAe/+Z3sATdkTsIpNveec5TT1PnOWUb0J1CcHxsJ4YmyJ23pd53xV58Rd5FDawxGeRb+WNpr8n4O7kk/BGK0q9bAcEB7RRZJOSw+/FTsENeKpRLnb8zxeOsvPpW3CuHZ9V6cHsu9bFvi3O06pbVSFKju1sqT2uF+rj6YrhB18bJii7ClLHYFxxXu9gGYQCCv9WRixcrsYylFX8zBgQM6yoRg5Tgl6BYW8hAJXwazzkj0Mf1+1wi/bg16mdXtp2R5nYpiOFhigQqqnbj7MMMzX4ASYLE5gkeikNSYgV0zAM8k69I1kDfoewt136AfJ3gNBcwL6FzzSPyC9TV9IBnuAEx7QPyVr+PQ3yYID+lwytbLpR8mCFv2scj+VzA0oF2y4JziYdqQ42+P8Zo+CnoaPL3e4mOzRvT26l6RTrgXZ+qN+BTmueklFMUuSNE65kDuX/DLD6hRLWGXaG1Ep2Ddp30hCBT5dgqJZlHAODkg3x3DHLKQ5RjBmDXzojNg+CgyZYA+leUGMhrde+p3OFpxErGBBs9FVIczliHWMr0GzCd/DVqv+fmB8h2j/8H3/oP6+b37vYP1hZ9+sv3YqBA9s7LXuZMPXfWyBC6Fg76SdCUILfErgAHvdpdE84ay9BLjpJXCrzkvBL2AAO+EwH0UBxoLLR07mBt20D7gv4KBS9MJWB1/CVocYCxRYYrghoGwHcD2DsPWZcXfLBtHTjacMHLhU4wIaT5AIgoYi67PEsrIeS5zUDchtPsxGTGg7iWXZ0vYG3KBuIl9vIsUmnBzHB6efmXEQi63U1dB8aZ9KKgWhU7GFymkAtILQDOPvrt+TANhQ3ZSQ95gYAIgjHGqdE3OpgP8VDcr7/f2uVHyN6Iet1iBstSJBRjhJxo05YWu/y3utIESK5zMIsjICl9jyLoRgZDjG2f9WXPm/Ro76qOlCUgGnV3WcR2FYSil2jTEmF4vqWZSa+kAjuWLIOWzMKkSJ4qbTynqg73crktIPeWMQ8kYkusJlHG4syVnuyGHqOBDAL2OZky98fV+I64LH7L+giTCgmX4o3RYzjIOSo4EaUve5+Hdcy1RfyPQFQ9Tqa5nm4j73Mqn5nIvqWiZ4NO5lUrXqi5mux/lwIui5oFeC3gh6KeiFoKeCXosRm4t61sAXjPm1hZss58jv1vOG2CdXHHJz5i/+m+P2mya2LZArSQV4zpX5SB9uWKo3hKktS62EvPtypgxCc2ZOWVSy/AuvQ2tm+momM0lfzZSza1GG4D0VZozdC7ESIfhS6CDA6vVGlPczXQnzgqZzsXJD00RsuaIp66n1lqs7ZCATxrzJv8hhBnc0aXyr3Z++aKSrtS1I84I2CGrvBzYKuty7AvvbK5Tx3jMfjDbf47VX9gPze7/POpDDZaZT1g+sEUp0BlV1WINvWWb595wFjg3lA2t/pUFD3VKtaqggaLtiYENGtXThEe7U4d57Qle7LgF0LvfeVyLye4cJN2iT6K4KVBbTHRBHss5O5iscJUq8EiReg8qWWbO1rNndWZ+uZX1aZ8UmPqu3AK6t4oh/CCwJz8fcBNnrdccjQNdXGP5V/1fv3PuTu+6IHqn8wUp4gu+GoXrJu6gO9bSAv1iUPWQ6xbKAl+6xfChMHz+xqg3BtlEaEr1eUC066A3s2D318F25sbziw8wpO57B/4dwPJg5Dt3FLPnqJ9Ilun5WpguW0azXA6lBfzG0PifmNolxKFImvQ/AqHt/eH/SGP8/pwXTOz/0DgH/G2fPpQ4uEOPO5u+yVAECUPQVHzoO5B6xAhUkD7Ftn0SY6XOJA13I0wu7JGOrhXrhwHEKkLmHWTX1D2FI2P41d12agA7WO+MuSyDTZ672Y+m9YAUVteYDqvyvkHQF6L6E6xKclJQK0s1YDFuZYK/LJJqv4ovrwmiVlsd4zauO6VE76TCH/1U3bT3oPsOHfDTQCZF+J05AsfBHqCTH/1mFpDDJup9BeQ0XDKTPQtJd6UrZ3S2sj5pTin4WOLMQOOQFner5HeP/3+gc//9FJ/j/Iz3Xs6NEOvZRojTHvWcc1HTqWzHUy+g3PlITihvDb9wJuqL3XCJS1PiesmJYqEFCbhh6f2JZdsom9NxxCMWPnzlL6a6d92doHagadBywe6R5H7wM7YSNh7k7H0GAjKIC+TV3WPy7nToJoVONFpgyVdU6CVEBAfxddk5uJ9mtGt/EDbpwCKNa6pLUdbv6xXWpenKCkcNC9TKB5HOXhXpGzvtatkrZBETqtJu6LnIQeVWpv8vyCsFdV4zorp2pERYKb3dZin2GUdipq1PJ74VCMaoTWEpo7rp4uxSYMKx7WmqXfpqy4UiZimI/AmC+P0rkduFOKTHMtcYAsI4lmE0zsBI31JK5Us3CAOBCOXx9ztmJtFPUZkBAmuXSTingFIzW2DwebOmVG6AKwIdKMVp5wfbpjDWxAz4DztcuWNDo0BlrwG1noC6Ccas9TDHvWozIWIKV5SoL3bUdJ+6BDyljCYA27s0GuI8gCB0WR/4uywZ2hsA2voCm9ikHORvfSBT3WOCrssG+SozUW0cXgL6nLIPju2RgdDnKdEJbvdp6gKay6e06YAAsaQUWdV/bPi1YExAT/TWx/oI1anEDIuPPABQz0AKByVqKdcwMaCS92LJyxlKCvGXSK8gku0WOAkeTw2RWj595SWT8Xea6ibYeANwd2PkuA3nyJ2Vp4rqE1hkAms+NZ8iCXxO3QUNCogSBbFQJoH5uPK+UaIARspG3Y+TtrOQNAroPchEDkSSHGUoHBgSjXCe01autYW3qNx+L+pyI+USBzHdy2iAUuTvFawn9/7/BbhpNSOFo0/sM3aKSoj01HKUwg6/4tLkqgDgrNt7fZcDREBSt0J3fewPx5MDm2K7fnWAEYSBBbFPv4YjGcPrgM5YPFMeoVqr6/5mTyE7ZTAA7oD+n+qDkufmC08gkaOsgMgqsxsxlp6CzU+UwZhZQIJqyR6CaU8lQAGrC/6oSYVaSu+yiriSHSkpci3s44q7uFnB5z8sHwEgQDr8KNrxNZfRU0AROOmP4KeBnJiN/SeEbz+FbE7414VsHvjU3vrXgW9CGj52Nj2342AjhYyNUX+Vatapo0Da/duBrcGdh4zMci8/w30aGRmhkCFsrDTRCrCLsQBZQfUIdftjczAMf6zxw5r8c1bLmI9MMLfwd4gv2m4ODyDeI08s15tm2UTqY8C+CWNyb8zXx6Z0ojw0fc/ZSrc/H8DMbSsfG46ZR6ZPAvXM+lBb3ZsizXAHv8JiP6iO2MgUMpAzlv5an8OsY1D3Mp3AU711BCEZbJZLf4d17+Ond4+Ovrx+//fr4xeOXj1+9M8b2qlZvwdqG7Vixiwyq6ErQdkjXRS7mCph7qv8z0Wf5QLi5Dl0oWb6a+1znPl/LbZwwrDm+wto9Kkee9XNU1uUElnA28EFEO3JZRq/BxBgYz0PKvdcQ4SYAXuWdF/MB91IGSh8vpVohtVW+dyCwGM1IFJYlkdNI2dmvlwU69lp5UpzAv8yA6rMtUJ1ktxiKjnt/cJd73+HnNRq7CMtCbus11w/f+UCwPHID/CaQ53rN+yx38KjUsmwkqjMMNDyD2HMuktUX3MXD4Nf6/6H+j+5Ar9UYf3BsiVCcefBLURDm3hPviKBKDW31GMyO9wQbgAIOdEtR7+/ghqT+Y93sjayYI2gbErVg9BhamylE2LIYQEsJubFnW77DWhkRescioSurQyLP8gNEoF276lzvDcQHJN1lJSx8570P0rJwX4EhKze9hz2Yl2rOWDXkLnwTA1wQf3BXUNn/Cy8SZn9JopbcjGJsJu49ZMKRoNZ42BOOzgUPLvceUgg3iDP/ENPLl6oOzIO1OGzFoPJNaWIMR3WMVeb8ysMNanqnFw34VUrvyS5cZt4Md5n0Em5Zrf3yqX1QPu03yqeDoHwK/CoxCKrHdrutHg3/U2EYPkiIvkMNGwjDmdRcBdjNFdtf1DItCcaDZQLYgz73PmngfCJUM9iI6g8o995S4X0GqySu4PTWUUajGhu/qn+fXEx9Cv9gbXlP0Z/ulDPhXXKT5/xrRR0O3QP/BYjEUnBvKrdSBOF9rs2jLrmjmoKzKvxnOp+uSpxYf5rYOJmLhey3FgvZ80vNJlrEuCEi4y73HiwWiJ9HlrXLvcPFot1uM7jFiVtWc5fJbcVwDX9a/dJS4d5Y7n3jFH4AKLss954iQuEE0dWCmOuppP6yjOaC348s6xHYXffYI2ELsq0bqjGjp2oI2zI1wyoPPCD5hXcWBA1Cy6817nQcO/cu3A5c5d3rdRSByr2vIPcvFrn3iffCgR/hQ3sQRNiFT3wQRg0qFkz2em01biSCYsEaIZK+RuCKfzUC+h7cHQUx8mAK91LQGBL1XZ8MeCmS/pQFtOwy1YBUkN0AZJrYrX09JCQ2iFU+rpqcNgL9EDQO9FNHhX0j+GLDozeXECSYOOptKgchvimSgGnncuBHzdW0G0jrrKZdQFrQJrotWLSYfip1in6rjJjWU5X2eSNZaaF18kE1Aeuz1Iz89ZavYf3MptPdciBKp2zkOFvp21ndNwWojdWae58pTAV8/gBKGJyp9kEVoQgrKzvyd/9/cTDkF/EBV8lBieIgpyqyY0KgOmjwnlLBbIV6JShcGJS+NNx76oh+7l3wbslDwYube0+hmWtpa1BQXTECBBiY3HuKWakmg/gB+Jif912CRstl2fKuqgVW7TCxUjHzlwic/Qashv3Gxug1ulYPVWTekgTAiBQLBT3HrmNxbEWQv+m2YP5SlmtiiEN1RmrmpCHiS9It6zN7fRBArw+C7b2+kNXDv6/XF7/Ua9XdwEcoB/4dYJ5KnfLUCRF3LMte6chmT6rlCORP9QCJY0kiKpq2xIp/lSyqHQI3u9z7zvFBap6j3gEE8/UKfCpw6BFuEF9NH6x6I9/V5wfd0o4auDjLsp/Vm913TsqPxtmiOk5GAn2kFLef1OnRbAjc4EixvpoZh8DB5SJ9Du3rgCFqFVe1yqWqEAIS0Cb6D5hl/NoTTJUbyKihSkj+S9WXp9dLBZjG3YBRWm8TNsgLs/cKGxR4yiTcmA3Y1JAk62CCRBABQH34msN5np0pOSBAtmcGGpacMcfJUPNm/IdZUJz2ewnLRKP09sy//j/rpSBWHHH2Xrp26mYwriOQgb4rSeOIq6GUo4Duw/nMa071zxGngqHNboBv7hupp5/hR+x0+QhgIJH9N/hC/p9EmK9iCCtr5KWKquDJeciYWCwaYB1RMmbtdhsXj1gsQsNqQvGOmAmXNVHbmxJc4Z9c8ZNEjVYIKkN8ikWp3NJPoCdTYoGdk6ilBIDHyJxhZGLYkhvo2WM/EbYSXHM1q8C34UZ/qP4BACG82AqPu0mEyligAEpgIGPeY/4giOxQMaYD++9In5GywhmppBWuSNVyUmU42ajlZLOWk7oWEhl8aWWbsoU9VYOG/uN6hAfmwm9JjYEFNISVF6WIieKJhpIb1gImFSgDGtf+sHNJpXfO2RX8v9L/P6vkN1z9f6XvvEXXIek91MnPdO7q1BysPeqDcXx7uvJWcKatraV3icYhINHBPw7/ggCQdeA2TPXSn+vUDwbCqaI4YF3kncCBC/deQig1JF6oXhkg8cJHUKeiKotOgZJxOoZ/6ND8ncMlzLI3H7yHuKHnbAzK3Cv4B4fTN/iQuMGIXqrHUTeBQ89HeKLdhwNLGvfneJIxJ5V2SNLxUDjJaJddLhb46MLlKzf4Mtpl5yoV0q5InAmZihnXkVDC8uB8YlnQZDZiDDJnoy7JHEd58Wc07yea/L8AeTBhOZwixlr3s6Xjpe7Elmw2lHARc79A6c51s4oeJT02HyTR3LgNWcPfXg9zpw4Q0OZL6/m594n3/YEdKj2U4uafeHLTBo8K1vQPGu2w2Wzua8Uj2lY2AjCSAF8OFoCUFVhCS6ClLcbqbqa/HCizhfI18NfeG2bJQDfYCLuy94dEqwyjLrmat2wODIUJPVGqLS6rRyHhtHZjhNjGA5UlV0W8F4TqlEyVhBRdTSZBf/KbdIOu7LOGViE+5cOJHEo8hO5K1zUi/8N5auN3NKZ2Wk7LaUIoGrgHiuG3hrPf7zdwfZxVb3bSY+li0YSqv6IGMmUJIVHKEiacFhVOswfHcnJgnhORKMGDJUX21VnRJ0X4aSGq06um+rI9GmKG8FBHIW7Y2qet8oDFDarn3G3SpjK8zno5ntbW52ITOPDBA8AG6b6tAAtqePq2gqpwA4wbouDtBBrMTkBj8HT4ZExIBvN5qEisZf3QaixeqUpd0LxSiQpYgr+K5HxAjapBdp+LlWhmasGgnF9qZD8NUNKPYPvDc5+PQp371icYn1cr4T1wuTP8BJ5uMWeBMiAmggnUK6KPV1EdWhGijwIJ5nunGQICYGd62WKBzN0T75ObIXdXjlb0cwcrQLs8/UyoQJNbwTJCBVynbSt1N2y3i4WPpphit8pONA1KWBM3ecHKTwAUiqilGYGEUO2V5TaVGYp6aaDpYad6D0fsv+uvAbzBZz0VMH92jqasOROEoq7xCWobn3hv9YQecghxhCkOqtNh9Prhq6MV7fBfuKBLh8oq3Xldl6iqEGUVoqxCVMIcHNNjtB5XTQdcRg6vsHO8ggOfYwiKVG7LT7zXLhwtGKcBT7xDxLxXeDwBiPeKVkp/pdLTmufXvMdiJLSvkat9RVcOFVTB14jAx7wXAnt/zLWOffM4gZSlNQP9BE9noIOxiuoL/HKMhR1AP3h8hScFwKrrFVJfjwPqeN3CQ31ekQCH/p6zDm2QSMmJTfwtDy+UAAIvh3CjFiKqHil25aiPET0OOQIT6z7UI/+nMMicCrDbQJH1y6WQ6UMGCCZir52o0KyES1bDJavhgmcBm3AwV2VWreSMfkSb1bIKsrI67bwP5NvOkYRLgjvjCujyHoMYGraAGoB003IR1nlgOdYLUZ17JAaVA9TWC4toMzSYL5i6cOVAleeruvFVkV0f0axLpR9+SSgVKxKpLdg71VecF+Xdg2ARPVaepaEA96dSoGhJEU60sCeIOi+0RJgriVCDVaduSoZHHCwXn2DowO/6dAxzukBcS+WB0THTxAQywoqATOVyXRM1aXWshmLmtpM1LBOUd2DkPxdMkS/8Z6IpUg84nENeOYKnf6+wWqGO/D9CHRAWykl4AE96+hmOvUSsE94rZ/5uHNMo0lICMvBTiwV+r5QoiF19MFWoyqLVgOpGqWxReHbCzbNXPLJ038iuRt0HHIusoG7gVukryHsCGhv8x0LAVLA6hU1iAxir+HrC9RHqW4WbJUw0ov8iZpWKeahGaSdXkRbPgXPLQh7JJ2XtGpFLbqma4HLpvFUmskbepW4Et/zNJtQwCP2/QXOMSJOzTiukec4uJDqmctbnwIJmOTuVZrBJNyB1hgahac4uVZFLuLawervISTfVESPbTRrCN/UWNEOqw2zEObuR+vIyH84Uq4qKrV+g0rispk0Dut+AABk+hPqgRVU/RBTZD+GnU8YAmVVOk0PP8zJQi0BgErjqZ7r+qaE/jHNwBYxzQuf4VOSETlYy57nOer6eDN7HB7R5ELQaI0KvsHyaE3qDT0lu+Atd5qu3nP0rHPCIO0HbuKPvjixhp85zmm+c/eK2/RplrLcoWx0ix/2AFiz3ZnTGcnCd6EPM99x7j09jlnvHks5Z7klJJ+i+nns/0IP9XL/l+HbFcu8VlrlhufcQny5Z7j3Dpws4/pX0lKWuDaYInwi9Zik4WXwCgQpuJ8kcNK5pwY0jPv3BfPqN+fQQJPNIWwV3p72gpajsrp31ksqjBunnDu/OHDA4d5xRrzelU4d10B1FsPFwZk1GmkB/Y7X/CoWrydk3OnXZN6o+QFgUxr6R2xg9qLRDhqhV80Hb+oYVHZff6DcLXFe/kbKX37Z18jb3DiUL2qGv9fw7fLnZ4WOHzSwA7DeAqtG95U8h8GuVK2jMhzPr/NehUY33x79jvD/uHK8iWsd0zFL3FGjWj/64PGD54Y6RivVvLOtCR+tIdfTOSapCv+zILNtJxvkORA3co1VvDqreqB1YBa08ZFcuXEciepLUvjVltA7H4UTjQzE8dJxRt9R77fA1ZzWxJTNedXLIUvdHtclc9gS5PWRXzqWroutwJtxLtL2w+f37oN12uo4j1zKrG1c4rCi6a1/+T4d5uX2Yl8YwFVgv/yNgRUSU/bBbZokxC/3Zm3RZowucxVpyP1hPIyp4G/Yf2/u3NlVRmnYTVt525MbLlbchNaxvfVgviGPXi4uM1mtOE7sRwoOuJjgIqmpWWp3ilezT/1JL+2dtj+9sW3NsWe/MstLetTI+fc2m/X6jm7nsNSz6171eg84s3FimRDFwKJm+ZSmwdSzrnQ3O3MxpRS3XztwzYJI+sbR3Pbh2Uyds7Udhax/O267h6OGKzVT8He89tKN9Wq/z+kDAcPg090t2ndOcyUHQbLajoNlsrgdj8VUslkOwIA46Pn0to91ABWX5jo9HYAZ9Aj8P4OctWkVDeJLH8DSBn3P4OZaRoBJ+fsBrDj+f4Ocr/DyCn5fw8w6yPJF1IBef0FfVKwQUoA9lGTwlJ/QZFPoG8SHpG3h8Dz8fZCQNo77jfP0msF4vbILbYdBeGIa+P3LlC4vn0X6VuypueEVCzsDM0W5SgJbhu5jXxs62Mp4n2CwE0VEHUdg+vOpTqF6vs+DVAVQ1j69zdvsBgf2XjGY5/UNG45y+kNEkp3/K6Cqnv8ko9OlzMLzepx8BAp9l1DoI6VMsxgWEz6TfdT0+1DPFeuZYzznWc4P1YKQKMACHetxAVdTEinysKDAiUR0Z8ayUH4HCq4LO6JSO6ZxO6Dm9ovrqNnpNz6i+zYi+pt+rOBNtQo/MlxMWD77n0etc+Xkxv1v0WNDqFnCT5LAoHcCUD4pyQfk+lMPZCAKcwJc5yzwp6BgKjfssQJH0+3A86o5BPQ8XMPfHlmXP2RjVv+NSPjjxuBjYx+xbbgewsiQ4VbNj9RTAE1TMAuqTqIxFwILutDfWTUxH3anjKD+ZeW+KbUwJvWIBLVhgjCNN7CvwiqRXLoMx0avKQhFc/hP7Co8TQdpaLIJdNib1V6j8aIh26KpSXefRsIDIUEfDYuRAnRtQAk3UcAbBC9LhUQmxEZuRbjFPy8CmY/C6ib6xQ5bS1+zE+00qutfFL0H0jZ14f0l6yE68PyTmeF7mmPBkDKFUIcsLleVPleWjBHJ8yXy8bKlgU/qDJTBHEwYHej69Bi+kGwgKNadn7MYN0NLcsuwT76kc3PSZyKObvsgJHoqbH068zzK66cM/snp6BKzfMTvJ7RSugKfnlGvUO/E+SEIvoLXCPaen8DChU3YKsvipyy40p2Jf9vvnxDnt4vz/cPiIHdcS+amaZl1N0L20LrrkAuObqZOqi4F9abELuHndYRckwuE7DmCc68IE4dZUAP4p+BUQnwZmBcOd44nlpXVGdiEauHZRgysrztmc0B+O6vWEwRCu8KU7cc4BFW1EqolzDp5+Vz04ne+SieNQRDno3Y0u/T8D8jW7tM7U4oDJdK5H7Di3J3ROf7iQQJba8ugSPRJxXRXuOQGHvsuuHtMujkmPE0cHCDI3EUQVJHpF/nDUvMBy3Ab87ZCvLj2HjrIbtZDn1DjEPtkgZ7RQBG2GgV0HcOzYiyP45wS9mMzYj9wGG72c8voa3CprX2WF814VFzaAQJOl+8VQjkAk7GIlCXpKu8qnVzNhKp+qCity4zsz78zM0Lcre9dBW+1MtnDzSnsyw53lgcEh0Lc5uxWwU9BclBtsq9mEaDnRg5zG8Lukj38ll3E/al6ftWq7ebj0ylaGDru2aUUvvQ9oxu8dyh7yaJB0KPvIepHFYnctQ8evMwQBIaZF+Ne6Xca9D3LwOI/e5lSwWykif6nuQhamF5x2VQUHT4hARLj3BHw7nTI4kY41Y6QfVOkd30zfr9M7q/VILxdGTC14pdJLBEtpxg7UfTzYw3RJY3zIlrQo+4xUP7eBWXwiKcRPBQzl3itJC8qRoqVqyWQshn/ceyZZAU9qXI3Q7E6rm7FWV/lyYqZp2fRYN90VsERm9Ci3Q9VoI8R9HdsUuk3pxYKlWmc1g3cBhoFL7h1LMGSBfD8kO4BgCZAQQ0IuWUv1D9pAZHyUq3CZ1XU0Y7l2L6e6omXvFcTJusxyCH56NZNwL1iNcC/zO5zPt7MkZSidJjIFiK2LhXIKAGeANbt6N+zG1Q4G6iMIeXku4SycpvCQaB/0dxQRGFwiDlGlW8odIaHfILg8i+mcFfQCpNj6qiu9CUNuvQ8jmkdKfhdgU3RbV1Vrao6Qawotgdb9jVY7aDE2I7dY6ALbv2AQV1F4D6S2h8fHYxv+0RmhryHgnq66E9RVKzcN/OcVgsE5/i7Ye0BfFgvbPrE7wLeCEATOKeRfjaCS5OIsz3ksd87xtq8dvEpzr2ylEqeglc4uO7GbRJec6ZDd8cb1attLP7CbhF5iDU6Hrgz6ktDLftBaLC77wltXoMxTMcnm+jbmjYqFdyJhc7mkwjuSqG6H21kfSHB68zW0WkFozQYAs4MIpxwAucIuATijao6wqhnt7Cp/Wni976hb+41mU9WwWoEGdzIdnxU7BZdbx1bP6lyC9NixAgIBnLFCy2pqXLJX0WQNT8J6jGF0ZKOjh1HzqWSzuyv9cUeljbrSRlRCra50poKkzjDRu1ad/+ddb9atNNGZFUsPqml6DNNktnv208GsNkMis+S5ZOfSaLpVN92K0HZct25Z9oRB03TSj/ElJnSiq9G+UuCwoZymwPbhkum+uVCM9Kov17Jsm14iFZzc3fczoTqf1+cdGc2cCaETiIjnsgmcwU8QKC6bKOhUTOA1XFYP4PLrEbbrEbZhhBAGXGOqImWxWXrCfGC7LxkEYJyAusgY7xiv634se9WbGtiNHEIybGSX5SHZpWVNejFS8v/pWC+NDioGy5zRG5zRjWHv18Peh2HDoeI9hz1fGfa8GvbF/+WwL8ph6/F26vF2IqN1HK5aSGU3ZrulYw30oyR55caQxzuXaXEJMam3EKvXNlkhWFNgGo5kv39gBbTcmAJS0+ezmj4bur66sweaVlUFDnN7bQs88KvsB7j/7grve3WKeGgTGna37QeqvaooUv4Wml61jTNxmP4qTxjhNvtaktu3dQ9Cv62Hr5mCI7sBH19Ltrt7AsqJB/BzYoekEtmrHjRWBfY0sb/m4PpZZTigZnce2CGh16v7VljX1jbTG9HKFnoKN5jswG0L5sQtocY1qB80oB8wQgV8jQ4zssuAdegH7S/Kwnptky5klvOyIaWXLbZviLgcda2rk9mkd0K/WY+zpssHSJdLWozobFJksMi1J6xA1dHErPZa2sBuaoJbr6sCnhKDiFb78B04etDWPEMThvFVshO7RUDvSx/YyMc90klBmfBJKgaoSZEdgkL9sNNeLHYFik1QpN/wFXQhabAH50aXY3GjwboXrafsZHmtiC9uLk+zabGVm3hp0sGDmg4e7EcqkKP3EkjZJ9klGo+fSLAVhXTHGY3YCaQ+sHWAGZU/OOiSjYx+V3jvgAA8BHfgY5Qf4OcdvP6QbB8lGiXBQOqSnurnH3JJHxvy3wU7QuEd5JrggI7pKRUg1zymAuUabGcMghFWfApP6xwkHBCUSHknq7UKnJpoHnRWgPNVOjBHWivSvWIwvOGJDa0T0OPYV7XDQo9NSZd8Vxff6qV0RXpBmzwwsylAa+DptXHVLc+sIOhgVVYT7dAxy8OcmNUhb/1SrkHhNJUlwuT8io+3gQE4Fd0VMHefsIYDtIsCpVA7TbBv9AYYscZPuwK6NFWLxhwS2Uf2/i+UCQLnxN6Hb/sqIhfCZ9KvpuAew8Mpm7iuxtgS4pdLdZAe+gdKFqyDPiAon2D82dE2rHJd2BOLVJxB/Gc3S1wkgVsxrF4QIGjjCvhkrICvxgp4VK4ARP9AoT+MnH6iX9UCeGQugE/VAvjqSXWA+5I9gkcE3LFae5XFykuysUZWz9TuXia5ZG2s/x0CpuZUsHf15NAnxtBe6edcLulDfH5ZL+6QvkNKSZ/QV2poD82hPVFDyyV7pZ7kymC2DKWkhXcNAkGydYtd2XMOIlFbDOjU0C/ZDCDWcZ+1LavoY0ToW2A30MxlrrQH67qFNxBDnBiYiEn+PyEhV8rxydotn8Kmr8+xb9hVWZNenjfEsU9s+6auy8GXsElIv2+mq0ZXMm7twQMzD4XuO6xOUTL+1UaOOoUae/8VLQdBKm1J6LfqKdIjbITwGWG3wSsa2drNn+KzPiPegs/nkukqbNxuG0GkVDA6Z1BPfRAJ5Yl/ZMODkrAcdqLfHlSpMOry+b1U/ElVYVhXGEbVHiIVAuR/gwA/mXj5//LE3zVLa/YDW+ZnUiOMOVlBq87cqCHa2Jyiyd9Oka6mWVfT1Lq8wiQMyGvO3QLr7Gt+k8GLO6GwLz0E9u2b/DX7n42hQg3PBvbEZcJ7Rs+Z8F65ExLBwzPdwONa92Dyt2uhrSdompIOE3VRjvBmw/MRdZyEOs65OrM4Z4kLHaeVIuPv60rNWgzmGplmzS8rzuOxoUsNfX9NxAj91lboDhPYirE7BcTLWrPWqou3lSQWc80LgZgyd1mhAt7MqfDeSvhfCrXz8oQhrTerxJ1TCF1YyaJK8JZ0jh7QoPQ1RPMjOZhFKH3CaT/ZxTIb+lO82uEu7amSjnXifj2Y/XIwlimTw5BMmbwOTG3B6MhG2yWV+5XWO3XrnUjPwAULqLH5hf5B/cVtrHwKfP3JbVYHyaXefblyd/TKtWePcnO2y+ui69vebGX2hvLgq8Vivqu8qIU6RQr9A8uyFYWukjpR9dgmiwWG3ynneg5WnbBkt8Y+LUMP7dq5N8PTg9ybaUtB8AnxZuWJA5qUXsCJ5owYJ6oKgXP0mcm9V0xlo7n3DD2tH4K9NMR3814RjAoC7jOyirnu5t4rmqNHSlUg9151q/NEDq9u7j3rcvTE4toTCyrKvWdmVYJyQm0ItU8G9ra2hArd8YyJsh0S2bn3zGEck6tRPINO597DXpnw0GFg2m44bYL5fL2IuPfWBceqt4TWisYSzQKfus2y7Bg9QWCVcu+Tig43vnO56rg15rrcaHaump2j/T/ssO8dVM4M2k0MAmTwXoMg7FRpmr9fLFCpoDOErTb4F8KMKvuQOf5eKM8g9QxeBxcMzIEvjIv+EKnq0N9IKc6ETo3G5ZNh47RiKX0KVivqLrFTsBOpgvhQrOSUhmthFH/8YvHTYahe9fZ7Omyod2W0VFbfXKv+m62iTzxAc+y36AL+CY21D7WxdozzOGPCu6JTALthSWUDVXqAlnFvWYKWcECTD1X8PbSbO2IxFWAHB4wRmxrB2G1yO1NndUZwdbvWyCqCAYvyUd6NXZfOdKxTuPiCgPkuxMFGe11fGxdX5k9ldPrutMeRnzFsCYxQl8o8kBPX8K15AN+xVg4GgQbBemvrD/vWFD7tW1Pz6ivDrEydrg/cMFKGYk/UjRpt+irfdvMgC9pUsie5vnlwIiBIMz6eC+MaCxVSXV/nwGmTYBxtXUS5GpQhGwlZXoG9AdRZG+aWWasbW2QfjjldtzQ61BngDijco1TGfhVtb6esobhCSUzHxjeuZUrwqtecT/m4wEu3V9vs6VFZ1kq3+cpJ8cN89bKZV7ndCOmTHO/Umk2ndc7crk0JboSt7p+4gAht2s5Heb8LA5fG0t6DK+p3EnU18c6eI0h96aVpnZhh//ObW4jRUA6ovMfXHPRM2rd4365NbpdUlnfUgsaR3IrFAnyBbaLsTWOQoRV0T4V5t2lRhr0veml54UG5d+k5L9Pdgupb8mYmh1PQwskVOxd7h2xGY+81+DR7R6zc6bqxd1Rd3ZIz6V0B1FJwIIOBxt4DltPYe4vFPrG8LFYGJr0Gn1WfoL+G7kusNt2i75dXiuwGYM5xJqLc9NMpCNVQxPvcb/liYXO269MaujnEDO+mkJhUd9ALZM+UgQ7AjO0aQYogbvfa5F7lWczBWAHvA97ZcyAkaSrG0+nNbbpYZHBt2LKEvzbuchhc1p5M1TVz6PoNfEg9QWuTmOAkloZseu0oWOYlLBPvARM0QVgm3icmtsAyAX/9uPrkJgqW8QosM4SlMGEZ/z0sBcIyh8S0gmVWw7JWd22CEMGV/hhrN9VNOOYAR7AhUxjNvWNhJ+Wai3HNxWt1cjExllwM10EbkWLz1bv57lpQ1X2pshoS985EqeQidQ95BQhSzSy5hUZ3DXOs22V50TmQhEjSHwJu9uNqA6yP+9Vt00/G0ylIcuCouPHx8zQ9xR3zEY9/VnDLZyjaBZ5vwiGy0J+EFnyaeNCll9lkNuVsXNyIeIez/q20LHUfvdSBF+yfdBQc8TPM8pNOsQwC9d/eWUm0bcPam/BkOpZ8rzZYN8C65eve2Y/0ag+utG4EUfndzcdzTHODVhRAFH9pWXtidnnKc7hm/OYKxAhga6/5dKD/g3WvRpWHuX17I3AJbFx0B3cl19E+3jG8EJXCLXP0QkTcKIFSAuvQHDyKMvYMrqHV6y9RJpm7vDYzQo/GR2xvj0JgYhXdtk1o3vNVKH3g7Xtu0KpL5MzNlSI97wctvKYipLnLgjaumKwXLBZZ/2Cx6OzC9Oe9zmKRo2mM7IEhHXxK4SntNxeLDmO5ZQW7LKlbUGl2zg7KPQZHWw4/hpgB71hMY+8J4zSGSFZwgSvEQ0pobIQVir0LpP8o3cTeBY29GWex98oNaOxNOcucfRp7Y66+T6GyOWSAONs09iac2ZBc3SYLFbDq+tQY5J8YwiVpk3KdcGUkjDmkPMQN6AbbyZw2jb3PlUHY7/ABMl1wpl6gFcuCiuH3Cn8/D+wYIjDF3ueacpYlOaRfckcXTjmEgoEXsKKKvU8QESj2vsKNI7H3Fwc6vnEN3mbIGg1ujB4FvJ/NvRPwbEYLJUQZEFxCqkwspfe0jOAE0ZzAWo/3fLSihDhVEuNUQbgpFjIwzuOD1j7cuwuCUpmC5+mROuWWEM3LDVd6isiaoyd2FWWqz55Lsuqs9VyaFzapK1hRMIUU8x7XjeyKfYMCOoxcho1ldWP6ftrVGlSiefXTSqPZlkbXimw0/JSrmzuMhn/b1vBvdS1PNxp+urXhlSJmwxAlh+m7ZDEqjr5NNhZUCgo3J9AXkn6UKLIKI2tWZS0EFYL69M8qX2bke8pXLqjNIedvEm6xMO8EUxeG+SoYz9KG8HMQxKda/z7SKRMvICQIg8taX9EnOkDAE86+iiHHKHgxiN+PjIQEEl4aCQUkvDMSZlJFWvFVpB8VQwD//agc4jF6gPaKf1uFcAAlg/eOqPBLcOuGDrRH9Z3obpNQjMxG3SYhkdtc4k0RHSpoB1jRaxH9IeixiF6IJVG333RRuJjnqRyfTiHkdfmohKqcjyf6Q/noXaVX/N15ns3Ozm3gRoBr+Mmm+fNNcZNEbH77+w2xTGw3jeR2FLTus/2hc9lucOcOWNnlru93inJpptWFg+mK0OWqVgzg8g7ip+H2gk552UAZ2SjftK3XtKqmUFBe2V2Vo7jU+6nswcV01XeBqrMPUveESuZKbQ7FWo4t+/0mURl2Ayp7TbiYT4KrMOmWcYE/yMEKFHELhz1X9jNFtmvFIDj65N6FisCYY7g/FVAQNWsXEDfurl2g0gDYJbl/heT+If6CCvCXi5bbiPTeynovkfV9DYFV7haHYMeNI6yhL9E0KaDS+67/H+HRmgQzWsyNugl9P/mET7nkOxBsECIaYm/f4y8ajT8ENaOsnt5VT9+kkj/UsZ0iQNUPBEAW+v+1iF7msF7f5UtFplZXq7xrtcqfrtYlWZLu//f/Aw==")),n=>n({workerURI:n=>{const r="text/javascript";let c=v();if("string"==typeof c&&(c=(new TextEncoder).encode(c)),n){const n=new Blob([c],{type:r});return URL.createObjectURL(n)}return "data:"+r+";base64,"+function(n){let r="";const c=n.length;let t=0;for(;t+2<c;t+=3){const c=n[t]<<16|n[t+1]<<8|n[t+2];r+=i[c>>18&63]+i[c>>12&63]+i[c>>6&63]+i[63&c];}const s=c-t;if(1===s){const c=n[t]<<16;r+=i[c>>18&63]+i[c>>12&63]+"==";}else if(2===s){const c=n[t]<<16|n[t+1]<<8;r+=i[c>>18&63]+i[c>>12&63]+i[c>>6&63]+"=";}return r}(c)}}));var v;
448
+ const n=[3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,43,51,59,67,83,99,115,131,163,195,227,258],t=[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0],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],o=[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],V=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],L$1=new Uint8Array(288);L$1.fill(8,0,144),L$1.fill(9,144,256),L$1.fill(7,256,280),L$1.fill(8,280,288);const a=new Uint8Array(30).fill(5);function l(n){const t=new Uint16Array(16);for(const r of n)t[r]++;t[0]=0;const r=new Uint16Array(17);for(let n=1;n<=15;n++)r[n+1]=r[n]+t[n];const o=new Uint16Array(n.length);for(let t=0;t<n.length;t++)n[t]&&(o[r[n[t]]++]=t);return {lengthCounts:t,symbols:o}}const s="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",f=(C$1=()=>function(s){let f=0,C=0,K=0,u=new Uint8Array(1024),e=0,g=0;for(;!g;){g=h(1);const n=h(2);if(0==n)q();else if(1==n)b(l(L$1),l(a));else {if(2!=n)throw new Error("invalid deflate block type");b(...c());}}return u.subarray(0,e);function J(){if(f>=s.length)throw new Error("unexpected end of deflate data");return s[f++]}function h(n){for(;K<n;)C|=J()<<K,K+=8;const t=C&(1<<n)-1;return C>>>=n,K-=n,t}function q(){C=0,K=0;const n=J()|J()<<8;f+=2,A(e+n);for(let t=0;t<n;t++)u[e++]=J();}function b(V,L){let a=W(V);for(;256!=a;){if(a<256)A(e+1),u[e++]=a;else {const V=a-257,l=n[V]+h(t[V]),s=W(L),f=r[s]+h(o[s]);A(e+l);const C=e-f;for(let n=0;n<l;n++)u[e++]=u[C+n];}a=W(V);}}function c(){const n=h(5)+257,t=h(5)+1,r=h(4)+4,o=new Uint8Array(19);for(let n=0;n<r;n++)o[V[n]]=h(3);const L=l(o),a=new Uint8Array(n+t);let s=0;for(;s<a.length;){const n=W(L);if(n<16)a[s++]=n;else if(16==n){const n=a[s-1];let t=h(2)+3;for(;t--;)a[s++]=n;}else s+=17==n?h(3)+3:h(7)+11;}return [l(a.subarray(0,n)),l(a.subarray(n))]}function W(n){const{lengthCounts:t,symbols:r}=n;let o=0,V=0,L=0;for(let n=1;n<=15;n++){o|=h(1);const a=t[n];if(o-V<a)return r[L+(o-V)];L+=a,V=V+a<<1,o<<=1;}throw new Error("invalid huffman code")}function A(n){if(u.length<n){let t=2*u.length;for(;t<n;)t*=2;const r=new Uint8Array(t);r.set(u.subarray(0,e)),u=r;}}}(function(n){const t=(n=String(n).replace(/[^A-Za-z0-9+/=]/g,"")).length,r=[];for(let o=0;o<t;o+=4){const t=s.indexOf(n[o])<<18|s.indexOf(n[o+1])<<12|(63&s.indexOf(n[o+2]))<<6|63&s.indexOf(n[o+3]);r.push(t>>16&255),"="!==n[o+2]&&r.push(t>>8&255),"="!==n[o+3]&&r.push(255&t);}return new Uint8Array(r)}("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")),n=>n({workerURI:n=>{const t="text/javascript";let r=C$1();if("string"==typeof r&&(r=(new TextEncoder).encode(r)),n){const n=new Blob([r],{type:t});return URL.createObjectURL(n)}return "data:"+t+";base64,"+function(n){let t="";const r=n.length;let o=0;for(;o+2<r;o+=3){const r=n[o]<<16|n[o+1]<<8|n[o+2];t+=s[r>>18&63]+s[r>>12&63]+s[r>>6&63]+s[63&r];}const V=r-o;if(1===V){const r=n[o]<<16;t+=s[r>>18&63]+s[r>>12&63]+"==";}else if(2===V){const r=n[o]<<16|n[o+1]<<8;t+=s[r>>18&63]+s[r>>12&63]+s[r>>6&63]+"=";}return t}(r)}}));var C$1;
449
449
 
450
450
  /*
451
451
  Copyright (c) 2026 Gildas Lormeau. All rights reserved.
@@ -1285,12 +1285,12 @@
1285
1285
  class AESDecryptionStream extends TransformStream {
1286
1286
 
1287
1287
  constructor({ password, rawPassword, encryptionStrength, checkPasswordOnly, checkAuthenticationCode = true }) {
1288
+ const aesCrypto = {};
1288
1289
  super({
1289
1290
  start() {
1290
- initAesCrypto(this, password, rawPassword, encryptionStrength);
1291
+ initAesCrypto(aesCrypto, password, rawPassword, encryptionStrength);
1291
1292
  },
1292
1293
  async transform(chunk, controller) {
1293
- const aesCrypto = this;
1294
1294
  const {
1295
1295
  password,
1296
1296
  strength,
@@ -1309,6 +1309,9 @@
1309
1309
  } else {
1310
1310
  await ready;
1311
1311
  }
1312
+ if (aesCrypto.discarded) {
1313
+ return;
1314
+ }
1312
1315
  const output = new Uint8Array(chunk.length - AUTHENTICATION_CODE_LENGTH - ((chunk.length - AUTHENTICATION_CODE_LENGTH) % BLOCK_LENGTH));
1313
1316
  controller.enqueue(append(aesCrypto, chunk, output, 0, AUTHENTICATION_CODE_LENGTH, true));
1314
1317
  },
@@ -1317,9 +1320,12 @@
1317
1320
  engine,
1318
1321
  pendingInput,
1319
1322
  ready
1320
- } = this;
1323
+ } = aesCrypto;
1321
1324
  if (engine) {
1322
1325
  await ready;
1326
+ if (aesCrypto.discarded) {
1327
+ return;
1328
+ }
1323
1329
  const originalAuthenticationCode = subarray(pendingInput, pendingInput.length - AUTHENTICATION_CODE_LENGTH);
1324
1330
  const decryptedChunkArray = new Uint8Array(subarray(pendingInput, 0, pendingInput.length - AUTHENTICATION_CODE_LENGTH));
1325
1331
  engine.process(decryptedChunkArray, true);
@@ -1329,27 +1335,26 @@
1329
1335
  invalidAuthenticationCode |= authenticationCode[indexByte] ^ originalAuthenticationCode[indexByte];
1330
1336
  }
1331
1337
  if (invalidAuthenticationCode && checkAuthenticationCode) {
1332
- throw new Error(ERR_INVALID_AUTHENTICATION_CODE);
1338
+ controller.error(new Error(ERR_INVALID_AUTHENTICATION_CODE));
1339
+ return;
1333
1340
  }
1334
1341
  controller.enqueue(decryptedChunkArray);
1335
1342
  }
1336
- },
1337
- cancel() {
1338
- disposeEngine(this);
1339
1343
  }
1340
1344
  });
1345
+ setDisposingReadable(this, aesCrypto);
1341
1346
  }
1342
1347
  }
1343
1348
 
1344
1349
  class AESEncryptionStream extends TransformStream {
1345
1350
 
1346
1351
  constructor({ password, rawPassword, encryptionStrength }) {
1352
+ const aesCrypto = {};
1347
1353
  super({
1348
1354
  start() {
1349
- initAesCrypto(this, password, rawPassword, encryptionStrength);
1355
+ initAesCrypto(aesCrypto, password, rawPassword, encryptionStrength);
1350
1356
  },
1351
1357
  async transform(chunk, controller) {
1352
- const aesCrypto = this;
1353
1358
  const {
1354
1359
  password,
1355
1360
  strength,
@@ -1363,6 +1368,9 @@
1363
1368
  } else {
1364
1369
  await ready;
1365
1370
  }
1371
+ if (aesCrypto.discarded) {
1372
+ return;
1373
+ }
1366
1374
  const output = new Uint8Array(preamble.length + chunk.length - (chunk.length % BLOCK_LENGTH));
1367
1375
  output.set(preamble, 0);
1368
1376
  controller.enqueue(append(aesCrypto, chunk, output, preamble.length, 0, false));
@@ -1372,19 +1380,20 @@
1372
1380
  engine,
1373
1381
  pendingInput,
1374
1382
  ready
1375
- } = this;
1383
+ } = aesCrypto;
1376
1384
  if (engine) {
1377
1385
  await ready;
1386
+ if (aesCrypto.discarded) {
1387
+ return;
1388
+ }
1378
1389
  const encryptedChunkArray = new Uint8Array(pendingInput);
1379
1390
  engine.process(encryptedChunkArray, false);
1380
1391
  const authenticationCode = subarray(engine.digest(), 0, AUTHENTICATION_CODE_LENGTH);
1381
1392
  controller.enqueue(concat(encryptedChunkArray, authenticationCode));
1382
1393
  }
1383
- },
1384
- cancel() {
1385
- disposeEngine(this);
1386
1394
  }
1387
1395
  });
1396
+ setDisposingReadable(this, aesCrypto);
1388
1397
  }
1389
1398
  }
1390
1399
 
@@ -1393,7 +1402,37 @@
1393
1402
  ready: new Promise(resolve => aesCrypto.resolveReady = resolve),
1394
1403
  password: encodePassword(password, rawPassword),
1395
1404
  strength: encryptionStrength - 1,
1396
- pendingInput: EMPTY_UINT8_ARRAY
1405
+ pendingInput: EMPTY_UINT8_ARRAY,
1406
+ discarded: false
1407
+ });
1408
+ }
1409
+
1410
+ function setDisposingReadable(stream, aesCrypto) {
1411
+ const reader = stream.readable.getReader();
1412
+ const readable = new ReadableStream({
1413
+ async pull(controller) {
1414
+ try {
1415
+ const { value, done } = await reader.read();
1416
+ if (done) {
1417
+ controller.close();
1418
+ } else {
1419
+ controller.enqueue(value);
1420
+ }
1421
+ } catch (error) {
1422
+ disposeEngine(aesCrypto);
1423
+ reader.cancel(error).catch(() => { });
1424
+ throw error;
1425
+ }
1426
+ },
1427
+ cancel(reason) {
1428
+ disposeEngine(aesCrypto);
1429
+ return reader.cancel(reason);
1430
+ }
1431
+ });
1432
+ Object.defineProperty(stream, "readable", {
1433
+ get() {
1434
+ return readable;
1435
+ }
1397
1436
  });
1398
1437
  }
1399
1438
 
@@ -1426,7 +1465,9 @@
1426
1465
  }
1427
1466
  }
1428
1467
 
1429
- function disposeEngine({ engine }) {
1468
+ function disposeEngine(aesCrypto) {
1469
+ const { engine } = aesCrypto;
1470
+ aesCrypto.discarded = true;
1430
1471
  if (engine && engine.dispose) {
1431
1472
  engine.dispose();
1432
1473
  }
@@ -1443,6 +1484,9 @@
1443
1484
  const keyLength = KEY_LENGTH[strength];
1444
1485
  const compositeKey = await deriveKey(password, salt, keyLength * 2 + PASSWORD_VERIFICATION_LENGTH);
1445
1486
  aesCrypto.engine = createEngine(subarray(compositeKey, 0, keyLength), subarray(compositeKey, keyLength, keyLength * 2));
1487
+ if (aesCrypto.discarded) {
1488
+ disposeEngine(aesCrypto);
1489
+ }
1446
1490
  return subarray(compositeKey, keyLength * 2);
1447
1491
  }
1448
1492
 
@@ -1594,11 +1638,11 @@
1594
1638
  }
1595
1639
 
1596
1640
  function createKeys(target, password, rawPassword) {
1597
- const keys = [0x12345678, 0x23456789, 0x34567890];
1641
+ const cryptoKeys = [0x12345678, 0x23456789, 0x34567890];
1598
1642
  Object.assign(target, {
1599
- keys,
1600
- crcKey0: new Crc32(keys[0]),
1601
- crcKey2: new Crc32(keys[2])
1643
+ cryptoKeys,
1644
+ crcKey0: new Crc32(cryptoKeys[0]),
1645
+ crcKey2: new Crc32(cryptoKeys[2])
1602
1646
  });
1603
1647
  if (rawPassword) {
1604
1648
  for (let index = 0; index < rawPassword.length; index++) {
@@ -1612,17 +1656,17 @@
1612
1656
  }
1613
1657
 
1614
1658
  function updateKeys(target, byte) {
1615
- let [, key1] = target.keys;
1659
+ let [, key1] = target.cryptoKeys;
1616
1660
  target.crcKey0.append([byte]);
1617
1661
  const key0 = ~target.crcKey0.get();
1618
1662
  key1 = getInt32(Math.imul(getInt32(key1 + getInt8(key0)), 134775813) + 1);
1619
1663
  target.crcKey2.append([key1 >>> 24]);
1620
1664
  const key2 = ~target.crcKey2.get();
1621
- target.keys = [key0, key1, key2];
1665
+ target.cryptoKeys = [key0, key1, key2];
1622
1666
  }
1623
1667
 
1624
1668
  function getByte(target) {
1625
- const temp = target.keys[2] | 2;
1669
+ const temp = target.cryptoKeys[2] | 2;
1626
1670
  return getInt8(Math.imul(temp, (temp ^ 1)) >>> 8);
1627
1671
  }
1628
1672
 
@@ -1670,11 +1714,16 @@
1670
1714
  const reader = readable.getReader();
1671
1715
  return new ReadableStream({
1672
1716
  async pull(controller) {
1673
- const { value, done } = await reader.read();
1674
- if (done) {
1675
- controller.close();
1676
- } else {
1677
- controller.enqueue(value);
1717
+ try {
1718
+ const { value, done } = await reader.read();
1719
+ if (done) {
1720
+ controller.close();
1721
+ } else {
1722
+ controller.enqueue(value);
1723
+ }
1724
+ } catch (error) {
1725
+ reader.cancel(error).catch(() => { });
1726
+ throw error;
1678
1727
  }
1679
1728
  },
1680
1729
  cancel(reason) {
@@ -1860,7 +1909,6 @@
1860
1909
  const GZIP_HEADER_LENGTH = 10;
1861
1910
  const GZIP_TRAILER_LENGTH = 8;
1862
1911
  const GZIP_HEADER_BYTES = [0x1f, 0x8b, 0x08];
1863
- const GZIP_OUTPUT_STALL_TIMEOUT = 5000;
1864
1912
 
1865
1913
  class DeflateStream extends TransformStream {
1866
1914
 
@@ -1871,7 +1919,7 @@
1871
1919
  let crc32Stream, encryptionStream, gzipCrc32Stream;
1872
1920
  let readable = super.readable;
1873
1921
  const codecStreams = format && getCodecStreams(format);
1874
- const GzipCompressionStream = getGzipCompressionStream(useCompressionStream, CompressionStream, CompressionStreamFallback);
1922
+ const GzipCompressionStream = getGzipCodecStream(useCompressionStream, CompressionStream, CompressionStreamFallback);
1875
1923
  const useGzipCrc32 = computeCrc32 && compressed && !deflate64 && !codecStreams && (!encrypted || zipCrypto) && Boolean(GzipCompressionStream);
1876
1924
  if ((!encrypted || zipCrypto) && computeCrc32 && !useGzipCrc32) {
1877
1925
  crc32Stream = new Crc32Stream();
@@ -1888,6 +1936,9 @@
1888
1936
  try {
1889
1937
  readable = pipeThroughCompressionStream(readable, useCompressionStream, { level, chunkSize }, CompressionStream, CompressionStreamFallback);
1890
1938
  } catch (error) {
1939
+ if (!useCompressionStream && CompressionStreamFallback) {
1940
+ throw error;
1941
+ }
1891
1942
  let gzipStream;
1892
1943
  try {
1893
1944
  gzipStream = new CompressionStream(FORMAT_GZIP);
@@ -1957,74 +2008,134 @@
1957
2008
  }
1958
2009
 
1959
2010
  function pipeThroughGzipDecompressionStream(readable, gzipStream, outputSize, crc32) {
2011
+ const writer = gzipStream.writable.getWriter();
2012
+ const reader = gzipStream.readable.getReader();
2013
+ const outputCrc32 = crc32 === UNDEFINED_VALUE ? new Crc32() : UNDEFINED_VALUE;
1960
2014
  let outputLength = 0;
1961
2015
  let inputDone = false;
1962
- let watchdogTimeout;
2016
+ let trailerWritten = false;
2017
+ let idleCheckArmed = false;
2018
+ let readCount = 0;
2019
+ let readPending = false;
1963
2020
  let resolveTrailerReady, rejectTrailerReady;
1964
2021
  const trailerReady = new Promise((resolve, reject) => {
1965
2022
  resolveTrailerReady = resolve;
1966
2023
  rejectTrailerReady = reject;
1967
2024
  });
1968
2025
  trailerReady.catch(() => { });
1969
- if (!outputSize) {
1970
- resolveTrailerReady();
1971
- }
1972
- const gzipWrapStream = new TransformStream({
1973
- start(controller) {
2026
+ pump();
2027
+ return new ReadableStream({
2028
+ async pull(controller) {
2029
+ try {
2030
+ const { value, done } = await read();
2031
+ if (done) {
2032
+ controller.close();
2033
+ } else {
2034
+ outputLength += value.length;
2035
+ if (outputLength > outputSize) {
2036
+ throw new Error(ERR_INVALID_UNCOMPRESSED_SIZE);
2037
+ }
2038
+ if (outputCrc32) {
2039
+ outputCrc32.append(value);
2040
+ }
2041
+ controller.enqueue(value);
2042
+ }
2043
+ } catch (error) {
2044
+ rejectTrailerReady(error);
2045
+ await cancel(reader, error);
2046
+ throw trailerWritten ? getTrailerError(error) : error;
2047
+ }
2048
+ },
2049
+ cancel(reason) {
2050
+ rejectTrailerReady(reason);
2051
+ return reader.cancel(reason);
2052
+ }
2053
+ });
2054
+
2055
+ async function pump() {
2056
+ const inputReader = readable.getReader();
2057
+ try {
1974
2058
  const header = new Uint8Array(GZIP_HEADER_LENGTH);
1975
2059
  header.set(GZIP_HEADER_BYTES);
1976
- controller.enqueue(header);
1977
- },
1978
- transform(chunk, controller) {
1979
- controller.enqueue(chunk);
1980
- },
1981
- async flush(controller) {
2060
+ await writer.write(header);
2061
+ for (; ;) {
2062
+ await writer.ready;
2063
+ const { value, done } = await inputReader.read();
2064
+ if (done) {
2065
+ break;
2066
+ }
2067
+ await writer.write(value);
2068
+ }
1982
2069
  inputDone = true;
1983
- startWatchdog();
1984
- try {
2070
+ if (outputCrc32) {
2071
+ if (readPending) {
2072
+ armIdleCheck();
2073
+ }
1985
2074
  await trailerReady;
1986
- } finally {
1987
- stopWatchdog();
1988
2075
  }
1989
2076
  const trailer = new Uint8Array(GZIP_TRAILER_LENGTH);
1990
2077
  const dataView = getDataView(trailer);
1991
- dataView.setUint32(0, crc32.get(), true);
2078
+ dataView.setUint32(0, outputCrc32 ? outputCrc32.get() : crc32, true);
1992
2079
  dataView.setUint32(4, outputSize, true);
1993
- controller.enqueue(trailer);
1994
- },
1995
- cancel(reason) {
1996
- rejectTrailerReady(reason);
2080
+ trailerWritten = true;
2081
+ await writer.write(trailer);
2082
+ await writer.close();
2083
+ } catch (error) {
2084
+ await abort(writer, error);
2085
+ await cancel(inputReader, error);
1997
2086
  }
1998
- });
1999
- const outputStream = new TransformStream({
2000
- transform(chunk, controller) {
2001
- crc32.append(chunk);
2002
- outputLength += chunk.length;
2003
- if (outputLength >= outputSize) {
2004
- resolveTrailerReady();
2005
- } else if (inputDone) {
2006
- startWatchdog();
2007
- }
2008
- controller.enqueue(chunk);
2009
- },
2010
- cancel(reason) {
2011
- rejectTrailerReady(reason);
2087
+ }
2088
+
2089
+ function read() {
2090
+ readCount++;
2091
+ readPending = true;
2092
+ const result = reader.read();
2093
+ result.then(onReadSettled, onReadSettled);
2094
+ if (inputDone && outputCrc32) {
2095
+ armIdleCheck();
2012
2096
  }
2013
- });
2014
- readable = pipeThrough(readable, gzipWrapStream);
2015
- readable = pipeThroughBackpressured(readable, gzipStream);
2016
- return pipeThrough(readable, outputStream);
2097
+ return result;
2098
+ }
2017
2099
 
2018
- function startWatchdog() {
2019
- stopWatchdog();
2020
- watchdogTimeout = setTimeout(() => rejectTrailerReady(new Error(ERR_INVALID_UNCOMPRESSED_SIZE)), GZIP_OUTPUT_STALL_TIMEOUT);
2100
+ function onReadSettled() {
2101
+ readPending = false;
2021
2102
  }
2022
2103
 
2023
- function stopWatchdog() {
2024
- clearTimeout(watchdogTimeout);
2104
+ async function armIdleCheck() {
2105
+ if (!idleCheckArmed) {
2106
+ idleCheckArmed = true;
2107
+ const count = readCount;
2108
+ await nextTask();
2109
+ idleCheckArmed = false;
2110
+ if (readPending) {
2111
+ if (readCount == count) {
2112
+ resolveTrailerReady();
2113
+ } else {
2114
+ armIdleCheck();
2115
+ }
2116
+ }
2117
+ }
2118
+ }
2119
+
2120
+ function getTrailerError(error) {
2121
+ const trailerError = new Error(outputLength == outputSize ? ERR_INVALID_CRC32 : ERR_INVALID_UNCOMPRESSED_SIZE);
2122
+ trailerError.cause = error;
2123
+ return trailerError;
2025
2124
  }
2026
2125
  }
2027
2126
 
2127
+ function nextTask() {
2128
+ return new Promise(resolve => {
2129
+ const { port1, port2 } = new MessageChannel();
2130
+ port2.onmessage = () => {
2131
+ port1.close();
2132
+ port2.close();
2133
+ resolve();
2134
+ };
2135
+ port1.postMessage(UNDEFINED_VALUE);
2136
+ });
2137
+ }
2138
+
2028
2139
  class InflateStream extends TransformStream {
2029
2140
 
2030
2141
  constructor(options, { chunkSize, DecompressionStreamFallback, DecompressionStream }) {
@@ -2045,20 +2156,32 @@
2045
2156
  if (codecStreams) {
2046
2157
  readable = pipeThroughBackpressured(readable, createCodecStream(codecStreams.DecompressionStream, format, { chunkSize, compressionMethod, rawBitFlag, uncompressedSize: outputSize }));
2047
2158
  } else {
2048
- try {
2049
- readable = pipeThroughCompressionStream(readable, useCompressionStream, { chunkSize, deflate64 }, DecompressionStream, DecompressionStreamFallback);
2050
- } catch (error) {
2051
- if (deflate64 || outputSize === UNDEFINED_VALUE) {
2052
- throw error;
2053
- }
2054
- let gzipStream;
2159
+ let gzipStream;
2160
+ const GzipDecompressionStream = getGzipCodecStream(useCompressionStream, DecompressionStream, DecompressionStreamFallback);
2161
+ if (checkCrc32 && !deflate64 && crc32 !== UNDEFINED_VALUE && outputSize !== UNDEFINED_VALUE && GzipDecompressionStream) {
2055
2162
  try {
2056
- gzipStream = new DecompressionStream(FORMAT_GZIP);
2163
+ gzipStream = new GzipDecompressionStream(FORMAT_GZIP, { chunkSize });
2057
2164
  } catch {
2058
- throw error;
2165
+ gzipStream = UNDEFINED_VALUE;
2059
2166
  }
2060
- gzipCrc32 = new Crc32();
2061
- readable = pipeThroughGzipDecompressionStream(readable, gzipStream, outputSize, gzipCrc32);
2167
+ }
2168
+ if (!gzipStream) {
2169
+ try {
2170
+ readable = pipeThroughCompressionStream(readable, useCompressionStream, { chunkSize, deflate64 }, DecompressionStream, DecompressionStreamFallback);
2171
+ } catch (error) {
2172
+ if (deflate64 || outputSize === UNDEFINED_VALUE || (!useCompressionStream && DecompressionStreamFallback)) {
2173
+ throw error;
2174
+ }
2175
+ try {
2176
+ gzipStream = new DecompressionStream(FORMAT_GZIP);
2177
+ } catch {
2178
+ throw error;
2179
+ }
2180
+ }
2181
+ }
2182
+ if (gzipStream) {
2183
+ gzipCrc32 = true;
2184
+ readable = pipeThroughGzipDecompressionStream(readable, gzipStream, outputSize, crc32);
2062
2185
  }
2063
2186
  }
2064
2187
  readable = mapInflateStreamError(readable);
@@ -2068,8 +2191,8 @@
2068
2191
  readable = pipeThrough(readable, crc32Stream);
2069
2192
  }
2070
2193
  setReadable(this, readable, () => {
2071
- if (checkCrc32) {
2072
- const computedCrc32 = gzipCrc32 ? gzipCrc32.get() >>> 0 : new DataView(crc32Stream.value.buffer).getUint32(0, false);
2194
+ if (crc32Stream) {
2195
+ const computedCrc32 = new DataView(crc32Stream.value.buffer).getUint32(0, false);
2073
2196
  if (crc32 != computedCrc32) {
2074
2197
  throw new Error(ERR_INVALID_CRC32);
2075
2198
  }
@@ -2126,11 +2249,11 @@
2126
2249
  return new CodecStreamClass(format, options);
2127
2250
  }
2128
2251
 
2129
- function getGzipCompressionStream(useCompressionStream, CompressionStreamNative, CompressionStreamFallback) {
2130
- if (useCompressionStream && CompressionStreamNative) {
2131
- return CompressionStreamNative;
2132
- } else if (CompressionStreamFallback && CompressionStreamFallback.requiresModule) {
2133
- return CompressionStreamFallback;
2252
+ function getGzipCodecStream(useCompressionStream, CodecStreamNative, CodecStreamFallback) {
2253
+ if (useCompressionStream && CodecStreamNative) {
2254
+ return CodecStreamNative;
2255
+ } else if (CodecStreamFallback && CodecStreamFallback.requiresModule) {
2256
+ return CodecStreamFallback;
2134
2257
  }
2135
2258
  }
2136
2259
 
@@ -2200,10 +2323,15 @@
2200
2323
  const reader = readable.getReader();
2201
2324
  return new ReadableStream({
2202
2325
  async pull(controller) {
2203
- let result;
2204
2326
  try {
2205
- result = await reader.read();
2327
+ const { value, done } = await reader.read();
2328
+ if (done) {
2329
+ controller.close();
2330
+ } else {
2331
+ controller.enqueue(value);
2332
+ }
2206
2333
  } catch (error) {
2334
+ await cancel(reader, error);
2207
2335
  if (error && error.message) {
2208
2336
  throw error;
2209
2337
  }
@@ -2211,12 +2339,6 @@
2211
2339
  mappedError.cause = error;
2212
2340
  throw mappedError;
2213
2341
  }
2214
- const { value, done } = result;
2215
- if (done) {
2216
- controller.close();
2217
- } else {
2218
- controller.enqueue(value);
2219
- }
2220
2342
  },
2221
2343
  cancel(reason) {
2222
2344
  return reader.cancel(reason);
@@ -3708,10 +3830,11 @@
3708
3830
 
3709
3831
  createReadable(options) {
3710
3832
  const reader = this;
3711
- const { useRangeHeader, forceRangeRequests, size } = reader;
3833
+ const { useRangeHeader, forceRangeRequests, size, eocdCache } = reader;
3712
3834
  if ((useRangeHeader || forceRangeRequests) && size !== UNDEFINED_VALUE) {
3713
3835
  const { offset = 0, size: readSize = size - offset } = options || {};
3714
- if (readSize > 0 && offset < size) {
3836
+ const cached = eocdCache && offset >= size - eocdCache.length;
3837
+ if (readSize > 0 && offset < size && !cached) {
3715
3838
  return createRangeReadable(reader, offset, Math.min(readSize, size - offset));
3716
3839
  }
3717
3840
  }
@@ -5270,8 +5393,8 @@
5270
5393
  const passThroughCompression = Boolean(passThrough);
5271
5394
  const passThroughEncryption = passThrough === true;
5272
5395
  checkPasswordOption(password, rawPassword);
5273
- password = password && password.length && password;
5274
- rawPassword = rawPassword && rawPassword.length && rawPassword;
5396
+ password = password && password.length ? password : UNDEFINED_VALUE;
5397
+ rawPassword = rawPassword && rawPassword.length ? rawPassword : UNDEFINED_VALUE;
5275
5398
  if (extraFieldAES) {
5276
5399
  if (extraFieldAES.originalCompressionMethod != COMPRESSION_METHOD_AES) {
5277
5400
  throw new Error(ERR_UNSUPPORTED_COMPRESSION);
@@ -6032,7 +6155,7 @@
6032
6155
  async function findEndOfCentralDirectory(reader, rejectAmbiguous, maxAppendedDataSize) {
6033
6156
  const { size } = reader;
6034
6157
  const anchoredLength = Math.min(size, END_OF_CENTRAL_DIR_LENGTH + MAX_16_BITS);
6035
- const remoteProbeBudget = { count: MAX_END_OF_CENTRAL_DIR_PROBES };
6158
+ const remoteProbeBudget = { remaining: MAX_END_OF_CENTRAL_DIR_PROBES };
6036
6159
  let endOfDirectoryInfo;
6037
6160
  let plausibleEndOfDirectoryInfo;
6038
6161
  let endOfDirectoryReachingEndCount = 0;
@@ -6125,8 +6248,8 @@
6125
6248
  if (signatureOffset >= anchoredOffset) {
6126
6249
  return getUint32$1(view, signatureOffset - anchoredOffset);
6127
6250
  }
6128
- if (remoteProbeBudget.count > 0) {
6129
- remoteProbeBudget.count--;
6251
+ if (remoteProbeBudget.remaining > 0) {
6252
+ remoteProbeBudget.remaining--;
6130
6253
  const signatureArray = await readUint8Array(reader, signatureOffset, 4);
6131
6254
  return getUint32$1(getDataView(signatureArray), 0);
6132
6255
  }
@@ -7042,9 +7165,11 @@
7042
7165
  const passThrough = checkPassThroughOption(getOptionValue(zipWriter, options, OPTION_PASS_THROUGH));
7043
7166
  const passThroughCompression = Boolean(passThrough);
7044
7167
  const passThroughEncryption = passThrough === true;
7045
- const password = getOptionValue(zipWriter, options, OPTION_PASSWORD);
7046
- const rawPassword = getOptionValue(zipWriter, options, OPTION_RAW_PASSWORD);
7168
+ let password = getOptionValue(zipWriter, options, OPTION_PASSWORD);
7169
+ let rawPassword = getOptionValue(zipWriter, options, OPTION_RAW_PASSWORD);
7047
7170
  checkPasswordOption(password, rawPassword);
7171
+ password = password && password.length ? password : UNDEFINED_VALUE;
7172
+ rawPassword = rawPassword && rawPassword.length ? rawPassword : UNDEFINED_VALUE;
7048
7173
  const encryptionStrength = getNumberOptionValue(zipWriter, options, OPTION_ENCRYPTION_STRENGTH, 3);
7049
7174
  const zipCrypto = getOptionValue(zipWriter, options, PROPERTY_NAME_ZIPCRYPTO);
7050
7175
  const extendedTimestamp = getOptionValue(zipWriter, options, OPTION_EXTENDED_TIMESTAMP, true);
@@ -8742,7 +8867,7 @@
8742
8867
  EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
8743
8868
  */
8744
8869
 
8745
- const VERSION = "2.15.0";
8870
+ const VERSION = "2.16.1";
8746
8871
 
8747
8872
  /*
8748
8873
  Copyright (c) 2025 Gildas Lormeau. All rights reserved.
@@ -9258,7 +9383,7 @@
9258
9383
  */
9259
9384
 
9260
9385
 
9261
- o(setDefaultConfiguration);
9386
+ f(setDefaultConfiguration);
9262
9387
 
9263
9388
  exports.BlobReader = BlobReader;
9264
9389
  exports.BlobWriter = BlobWriter;