@zip.js/zip.js 2.11.3 → 2.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. package/deno.json +1 -1
  2. package/dist/zip-core-external.js +444 -114
  3. package/dist/zip-core-external.min.js +1 -1
  4. package/dist/zip-core.js +454 -111
  5. package/dist/zip-core.min.js +1 -1
  6. package/dist/zip-fs-core-external.js +509 -236
  7. package/dist/zip-fs-core-external.min.js +1 -1
  8. package/dist/zip-fs-core.js +522 -233
  9. package/dist/zip-fs-core.min.js +1 -1
  10. package/dist/zip-fs-external.js +509 -236
  11. package/dist/zip-fs-external.min.js +1 -1
  12. package/dist/zip-fs-native.js +524 -235
  13. package/dist/zip-fs-native.min.js +1 -1
  14. package/dist/zip-fs.js +525 -236
  15. package/dist/zip-fs.min.js +1 -1
  16. package/dist/zip-legacy.js +456 -113
  17. package/dist/zip-legacy.min.js +1 -1
  18. package/dist/zip-native.js +456 -113
  19. package/dist/zip-native.min.js +1 -1
  20. package/dist/zip-web-worker-native.js +1 -1
  21. package/dist/zip-web-worker.js +1 -1
  22. package/dist/zip.js +457 -114
  23. package/dist/zip.min.js +1 -1
  24. package/index-native.cjs +524 -235
  25. package/index-native.min.js +1 -1
  26. package/index.cjs +525 -236
  27. package/index.d.cts +480 -59
  28. package/index.d.ts +480 -59
  29. package/index.min.js +1 -1
  30. package/lib/core/codec-worker-web.js +10 -2
  31. package/lib/core/codec-worker.js +4 -3
  32. package/lib/core/configuration.js +20 -5
  33. package/lib/core/constants.js +2 -0
  34. package/lib/core/io.js +20 -10
  35. package/lib/core/options.js +29 -0
  36. package/lib/core/streams/codec-stream.js +6 -0
  37. package/lib/core/util/warnings.js +42 -0
  38. package/lib/core/version.js +1 -1
  39. package/lib/core/web-worker-base.js +4 -3
  40. package/lib/core/web-worker-inline-native.js +1 -1
  41. package/lib/core/web-worker-inline-wasm.js +1 -1
  42. package/lib/core/zip-entry.js +49 -1
  43. package/lib/core/zip-fs.js +43 -134
  44. package/lib/core/zip-reader.js +108 -47
  45. package/lib/core/zip-writer.js +238 -54
  46. package/lib/zip-core-base.js +9 -3
  47. package/lib/zip-core-reader.js +2 -0
  48. package/lib/zip-core-writer.js +6 -1
  49. package/lib/zip-module-wasm-base.js +2 -2
  50. package/package.json +5 -3
package/dist/zip-fs.js CHANGED
@@ -134,6 +134,7 @@
134
134
  const BOOLEAN_TYPE = "boolean";
135
135
 
136
136
  const EMPTY_UINT8_ARRAY = new Uint8Array();
137
+ const SYMBOL_ASYNC_DISPOSE = Symbol.asyncDispose || Symbol();
137
138
 
138
139
  /*
139
140
  Copyright (c) 2022 Gildas Lormeau. All rights reserved.
@@ -178,6 +179,7 @@
178
179
  const OPTION_CHECK_OVERLAPPING_ENTRY = "checkOverlappingEntry";
179
180
  const OPTION_CHECK_AMBIGUITY = "checkAmbiguity";
180
181
  const OPTION_CHECK_LOCAL_DIRECTORY = "checkLocalDirectory";
182
+ const OPTION_CHECK_LOCAL_FILENAME = "checkLocalFilename";
181
183
  const OPTION_CHECK_SIGNATURE = "checkSignature";
182
184
  const OPTION_CHECK_CRC32 = "checkCrc32";
183
185
  const OPTION_CHECK_AUTHENTICATION_CODE = "checkAuthenticationCode";
@@ -208,15 +210,20 @@
208
210
  const OPTION_MAX_APPENDED_DATA_SIZE = "maxAppendedDataSize";
209
211
  const OPTION_DECRYPT_CENTRAL_DIRECTORY = "decryptCentralDirectory";
210
212
  const OPTION_SIGN_CENTRAL_DIRECTORY = "signCentralDirectory";
213
+ const OPTION_ENTRY = "entry";
211
214
  const TEXT_TYPE_FILENAME = "filename";
212
215
  const TEXT_TYPE_COMMENT = "comment";
213
216
  const STRICTNESS_STRICT = "strict";
214
217
  const STRICTNESS_BALANCED = "balanced";
215
218
  const STRICTNESS_TOLERANT = "tolerant";
219
+ const PASS_THROUGH_COMPRESSED = "compressed";
216
220
 
217
221
  const ERR_INVALID_FUNCTION_OPTION = "Invalid option (must be a function)";
218
222
  const ERR_INVALID_SIGNAL = "Invalid signal (must be an AbortSignal instance)";
219
223
  const ERR_INVALID_PASSWORD_TYPE = "Invalid password (password must be a string, rawPassword must be a Uint8Array)";
224
+ const ERR_INVALID_PASS_THROUGH_VALUE = "Invalid passThrough option (must be a boolean or 'compressed')";
225
+ const ERR_ABORTED = "The operation was aborted";
226
+ const ABORT_ERROR_NAME = "AbortError";
220
227
 
221
228
  function checkFunctionOption(value) {
222
229
  if (value && typeof value != FUNCTION_TYPE) {
@@ -232,12 +239,25 @@
232
239
  return signal || UNDEFINED_VALUE;
233
240
  }
234
241
 
242
+ function throwIfAborted(signal) {
243
+ if (signal && signal.aborted) {
244
+ throw signal.reason === UNDEFINED_VALUE ? new DOMException(ERR_ABORTED, ABORT_ERROR_NAME) : signal.reason;
245
+ }
246
+ }
247
+
235
248
  function checkPasswordOption(password, rawPassword) {
236
249
  if ((password && typeof password != STRING_TYPE) || (rawPassword && !(rawPassword instanceof Uint8Array))) {
237
250
  throw new Error(ERR_INVALID_PASSWORD_TYPE);
238
251
  }
239
252
  }
240
253
 
254
+ function checkPassThroughOption(passThrough) {
255
+ if (passThrough !== UNDEFINED_VALUE && typeof passThrough != BOOLEAN_TYPE && passThrough !== PASS_THROUGH_COMPRESSED) {
256
+ throw new Error(ERR_INVALID_PASS_THROUGH_VALUE);
257
+ }
258
+ return passThrough;
259
+ }
260
+
241
261
  function checkInteger(value, maxValue, errorMessage) {
242
262
  if (!Number.isInteger(value) || value < 0 || value > maxValue) {
243
263
  throw new Error(errorMessage);
@@ -287,6 +307,8 @@
287
307
  const MINIMUM_CHUNK_SIZE = 64;
288
308
  const MINIMUM_PROPERTY_VALUE = 1;
289
309
  const ERR_INVALID_MAX_WORKERS = "Invalid maxWorkers (must be an integer greater than 0)";
310
+ const ERR_INVALID_BASE_URI = "Invalid baseURI (must be a string)";
311
+ const ERR_INVALID_URI = "Invalid URI (must be a string or a function returning a string)";
290
312
  let maxWorkers = 2;
291
313
  try {
292
314
  if (typeof navigator != UNDEFINED_TYPE && navigator.hardwareConcurrency) {
@@ -311,9 +333,9 @@
311
333
  };
312
334
 
313
335
  const PROPERTY_NAME_MAX_WORKERS = "maxWorkers";
336
+ const PROPERTY_NAME_BASE_URI = "baseURI";
314
337
 
315
- const STRING_PROPERTY_NAMES = [
316
- "baseURI",
338
+ const URI_PROPERTY_NAMES = [
317
339
  "wasmURI",
318
340
  "workerURI"
319
341
  ];
@@ -337,7 +359,8 @@
337
359
  "DecompressionStreamFallback"
338
360
  ];
339
361
  const CONFIGURABLE_PROPERTY_NAMES = [
340
- ...STRING_PROPERTY_NAMES,
362
+ PROPERTY_NAME_BASE_URI,
363
+ ...URI_PROPERTY_NAMES,
341
364
  ...BOOLEAN_PROPERTY_NAMES,
342
365
  ...NUMBER_PROPERTY_NAMES,
343
366
  ...FUNCTION_PROPERTY_NAMES
@@ -381,6 +404,14 @@
381
404
  }
382
405
  } else if (FUNCTION_PROPERTY_NAMES.includes(propertyName)) {
383
406
  checkFunctionOption(propertyValue);
407
+ } else if (propertyName == PROPERTY_NAME_BASE_URI) {
408
+ if (propertyValue && typeof propertyValue != STRING_TYPE) {
409
+ throw new Error(ERR_INVALID_BASE_URI);
410
+ }
411
+ } else if (URI_PROPERTY_NAMES.includes(propertyName)) {
412
+ if (propertyValue && typeof propertyValue != STRING_TYPE && typeof propertyValue != FUNCTION_TYPE) {
413
+ throw new Error(ERR_INVALID_URI);
414
+ }
384
415
  }
385
416
  return propertyValue;
386
417
  }
@@ -414,7 +445,7 @@
414
445
  Object.assign(config, DEFAULT_CONFIGURATION);
415
446
  }
416
447
 
417
- const t$1=new Uint8Array(288);t$1.fill(8,0,144),t$1.fill(9,144,256),t$1.fill(7,256,280),t$1.fill(8,280,288),new Uint8Array(30).fill(5);const e$1="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",n$1=t=>t({workerURI:t=>{const n="text/javascript";let s='!function(t){"function"==typeof define&&define.amd?define(t):t()}(function(){"use strict";const{Array:t,Object:n,Number:e,Math:s,Error:r,Uint8Array:o,Uint16Array:c,Uint32Array:i,Int32Array:a,Map:f,DataView:u,Promise:l,TextEncoder:w,crypto:h,postMessage:p,TransformStream:d,ReadableStream:y,WritableStream:m,CompressionStream:S,DecompressionStream:g}=self,v=void 0,b="undefined",k="function",z=new o,C=[[],[],[],[],[],[],[],[]];for(let t=0;t<256;t++){let n=t;for(let t=0;t<8;t++)n=1&n?n>>>1^3988292384:n>>>1;C[0][t]=n}for(let t=0;t<256;t++)for(let n=1;n<8;n++){const e=C[n-1][t];C[n][t]=e>>>8^C[0][255&e]}const[I,A,x,M,P,B,D,F]=C;class R{constructor(t){this.o=t||-1}append(t){let n=0|this.o;const e=0|t.length;let s=0;if(e>=8&&t.buffer){const r=new u(t.buffer,t.byteOffset,e),o=e-8;for(;s<=o;s+=8){const t=n^r.getInt32(s,!0),e=r.getInt32(s+4,!0);n=F[255&t]^D[t>>>8&255]^B[t>>>16&255]^P[t>>>24&255]^M[255&e]^x[e>>>8&255]^A[e>>>16&255]^I[e>>>24&255]}}for(;s<e;s++)n=n>>>8^I[255&(n^t[s])];this.o=n}get(){return~this.o}}class U extends d{constructor(){let t;const n=new R;super({transform(t,e){n.append(t),e.enqueue(t)},flush(){const e=new o(4);new u(e.buffer).setUint32(0,n.get()),t.value=e}}),t=this}}function W(t,n){const e=new o(t.length+n.length);return e.set(t),e.set(n,t.length),e}function _(t){return new u(t.buffer,t.byteOffset,t.byteLength)}const T={concat(t,n){if(0===t.length||0===n.length)return t.concat(n);const e=t[t.length-1],s=T.l(e);return 32===s?t.concat(n):T.h(n,s,0|e,t.slice(0,t.length-1))},bitLength(t){const n=t.length;if(0===n)return 0;const e=t[n-1];return 32*(n-1)+T.l(e)},m(t,n){if(32*t.length<n)return t;const e=(t=t.slice(0,s.ceil(n/32))).length;return n&=31,e>0&&n&&(t[e-1]=T.S(n,t[e-1]&2147483648>>n-1,1)),t},S:(t,n,e)=>32===t?n:(e?0|n:n<<32-t)+1099511627776*t,l:t=>s.round(t/1099511627776)||32,h(t,n,e,s){for(void 0===s&&(s=[]);n>=32;n-=32)s.push(e),e=0;if(0===n)return s.concat(t);for(let r=0;r<t.length;r++)s.push(e|t[r]>>>n),e=t[r]<<32-n;const r=t.length?t[t.length-1]:0,o=T.l(r);return s.push(T.S(n+o&31,n+o>32?e:s.pop(),1)),s}},V={bytes:{v(t){const n=T.bitLength(t)/8,e=new o(n);let s;for(let r=0;r<n;r++)3&r||(s=t[r/4]),e[r]=s>>>24,s<<=8;return e},C(t){const n=[];let e,s=0;for(e=0;e<t.length;e++)s=s<<8|t[e],3&~e||(n.push(s),s=0);return 3&e&&n.push(T.S(8*(3&e),s)),n}}},K=class{constructor(t){const n=this;n.blockSize=512,n.I=[1732584193,4023233417,2562383102,271733878,3285377520],n.A=[1518500249,1859775393,2400959708,3395469782],t?(n.M=t.M.slice(0),n.P=t.P.slice(0),n.B=t.B):n.reset()}reset(){const t=this;return t.M=t.I.slice(0),t.P=[],t.B=0,t}update(t){const n=this;"string"==typeof t&&(t=V.D.C(t));const e=n.P=T.concat(n.P,t),s=n.B,o=n.B=s+T.bitLength(t);if(o>9007199254740991)throw new r("Cannot hash more than 2^53 - 1 bits");const c=new i(e);let a=0;for(let t=n.blockSize+s-(n.blockSize+s&n.blockSize-1);t<=o;t+=n.blockSize)n.F(c.subarray(16*a,16*(a+1))),a+=1;return e.splice(0,16*a),n}R(){const t=this;let n=t.P;const e=t.M;n=T.concat(n,[T.S(1,1)]);for(let t=n.length+2;15&t;t++)n.push(0);for(n.push(s.floor(t.B/4294967296)),n.push(0|t.B);n.length;)t.F(n.splice(0,16));return t.reset(),e}U(t,n,e,s){return t<=19?n&e|~n&s:t<=39?n^e^s:t<=59?n&e|n&s|e&s:t<=79?n^e^s:void 0}W(t,n){return n<<t|n>>>32-t}F(n){const e=this,r=e.M,o=t(80);for(let t=0;t<16;t++)o[t]=n[t];let c=r[0],i=r[1],a=r[2],f=r[3],u=r[4];for(let t=0;t<=79;t++){t>=16&&(o[t]=e.W(1,o[t-3]^o[t-8]^o[t-14]^o[t-16]));const n=e.W(5,c)+e.U(t,i,a,f)+u+o[t]+e.A[s.floor(t/20)]|0;u=f,f=a,a=e.W(30,i),i=c,c=n}r[0]=r[0]+c|0,r[1]=r[1]+i|0,r[2]=r[2]+a|0,r[3]=r[3]+f|0,r[4]=r[4]+u|0}},E={importKey:t=>new E._(V.bytes.C(t)),T(t,n,e,s){if(e=e||1e4,s<0||e<0)throw new r("invalid params to pbkdf2");const o=1+(s>>5)<<2;let c,i,a,f,l;const w=new ArrayBuffer(o),h=new u(w);let p=0;const d=T;for(n=V.bytes.C(n),l=1;p<(o||1);l++){for(c=i=t.encrypt(d.concat(n,[l])),a=1;a<e;a++)for(i=t.encrypt(i),f=0;f<i.length;f++)c[f]^=i[f];for(a=0;p<(o||1)&&a<c.length;a++)h.setInt32(p,c[a]),p+=4}return w.slice(0,s/8)},_:class{constructor(t){const n=this,e=n.V=K,s=[[],[]];n.K=[new e,new e];const r=n.K[0].blockSize/32;t.length>r&&(t=(new e).update(t).R());for(let n=0;n<r;n++)s[0][n]=909522486^t[n],s[1][n]=1549556828^t[n];n.K[0].update(s[0]),n.K[1].update(s[1]),n.L=new e(n.K[0])}reset(){const t=this;t.L=new t.V(t.K[0]),t.O=!1}update(t){this.O=!0,this.L.update(t)}digest(){const t=this,n=t.L.R(),e=new t.V(t.K[1]).update(n).R();return t.reset(),e}encrypt(t){if(this.O)throw new r("encrypt on already updated hmac called!");return this.update(t),this.digest(t)}}},L=typeof h!=b&&typeof h.getRandomValues==k,O="Invalid password",j="zipjs-abort-check-password";function H(t){if(L)return h.getRandomValues(t);throw new r("Crypto API not supported")}const N=16,q={name:"PBKDF2"},G=n.assign({hash:{name:"HMAC"}},q),J=n.assign({iterations:1e3,hash:{name:"SHA-1"}},q),Q=["deriveBits"],X=[8,12,16],Y=[16,24,32],Z=10,$=[0,0,0,0],tt=typeof h!=b,nt=tt&&h.subtle,et=tt&&typeof nt!=b,st=V.bytes,rt=class{constructor(t){const n=this;n.j=[[[],[],[],[],[]],[[],[],[],[],[]]],n.j[0][0][0]||n.H();const e=n.j[0][4],s=n.j[1],o=t.length;let c,i,a,f=1;if(4!==o&&6!==o&&8!==o)throw new r("invalid aes key size");for(n.A=[i=t.slice(0),a=[]],c=o;c<4*o+28;c++){let t=i[c-1];(c%o===0||8===o&&c%o===4)&&(t=e[t>>>24]<<24^e[t>>16&255]<<16^e[t>>8&255]<<8^e[255&t],c%o===0&&(t=t<<8^t>>>24^f<<24,f=f<<1^283*(f>>7))),i[c]=i[c-o]^t}for(let t=0;c;t++,c--){const n=i[3&t?c:c-4];a[t]=c<=4||t<4?n:s[0][e[n>>>24]]^s[1][e[n>>16&255]]^s[2][e[n>>8&255]]^s[3][e[255&n]]}}encrypt(t){return this.N(t,0)}decrypt(t){return this.N(t,1)}H(){const t=this.j[0],n=this.j[1],e=t[4],s=n[4],r=[],o=[];let c,i,a,f;for(let t=0;t<256;t++)o[(r[t]=t<<1^283*(t>>7))^t]=t;for(let u=c=0;!e[u];u^=i||1,c=o[c]||1){let o=c^c<<1^c<<2^c<<3^c<<4;o=o>>8^255&o^99,e[u]=o,s[o]=u,f=r[a=r[i=r[u]]];let l=16843009*f^65537*a^257*i^16843008*u,w=257*r[o]^16843008*o;for(let e=0;e<4;e++)t[e][u]=w=w<<24^w>>>8,n[e][o]=l=l<<24^l>>>8}for(let e=0;e<5;e++)t[e]=t[e].slice(0),n[e]=n[e].slice(0)}N(t,n){if(4!==t.length)throw new r("invalid aes block size");const e=this.A[n],s=e.length/4-2,o=[0,0,0,0],c=this.j[n],i=c[0],a=c[1],f=c[2],u=c[3],l=c[4];let w,h,p,d=t[0]^e[0],y=t[n?3:1]^e[1],m=t[2]^e[2],S=t[n?1:3]^e[3],g=4;for(let t=0;t<s;t++)w=i[d>>>24]^a[y>>16&255]^f[m>>8&255]^u[255&S]^e[g],h=i[y>>>24]^a[m>>16&255]^f[S>>8&255]^u[255&d]^e[g+1],p=i[m>>>24]^a[S>>16&255]^f[d>>8&255]^u[255&y]^e[g+2],S=i[S>>>24]^a[d>>16&255]^f[y>>8&255]^u[255&m]^e[g+3],g+=4,d=w,y=h,m=p;for(let t=0;t<4;t++)o[n?3&-t:t]=l[d>>>24]<<24^l[y>>16&255]<<16^l[m>>8&255]<<8^l[255&S]^e[g++],w=d,d=y,y=m,m=S,S=w;return o}},ot=class{constructor(t,n){this.G=t,this.J=n,this.X=n}reset(){this.X=this.J}update(t){return this.Y(this.G,t,this.X)}Z(t){if(255&~(t>>24))t+=1<<24;else{let n=t>>16&255,e=t>>8&255,s=255&t;255===n?(n=0,255===e?(e=0,255===s?s=0:++s):++e):++n,t=0,t+=n<<16,t+=e<<8,t+=s}return t}$(t){0===(t[0]=this.Z(t[0]))&&(t[1]=this.Z(t[1]))}Y(t,n,e){let s;if(!(s=n.length))return[];const r=T.bitLength(n);for(let r=0;r<s;r+=4){this.$(e);const s=t.encrypt(e);n[r]^=s[0],n[r+1]^=s[1],n[r+2]^=s[2],n[r+3]^=s[3]}return T.m(n,r)}},ct=E._;let it=tt&&et&&typeof nt.importKey==k,at=tt&&et&&typeof nt.deriveBits==k;class ft extends d{constructor({password:t,rawPassword:n,encryptionStrength:e,checkPasswordOnly:s,checkAuthenticationCode:c=!0}){super({start(){lt(this,t,n,e)},async transform(t,n){const e=this,{password:c,strength:i,nt:a,ready:f}=e;c?(await async function(t,n,e,s){const o=await ht(t,n,e,dt(s,0,X[n])),c=dt(s,X[n]);if(o[0]!=c[0]||o[1]!=c[1])throw new r(O)}(e,i,c,dt(t,0,X[i]+2)),t=dt(t,X[i]+2),s?n.error(new r(j)):a()):await f;const u=new o(t.length-Z-(t.length-Z)%N);n.enqueue(wt(e,t,u,0,Z,!0))},async flush(t){const{et:n,st:e,ot:s,ready:o}=this;if(e&&n){await o;const i=dt(s,0,s.length-Z),a=dt(s,s.length-Z);let f=z;if(i.length){const t=mt(st,i);e.update(t);const s=n.update(t);f=yt(st,s)}const u=dt(yt(st,e.digest()),0,Z);let l=s.length<Z?1:0;for(let t=0;t<Z;t++)l|=u[t]^a[t];if(l&&c)throw new r("Invalid authentication code");t.enqueue(f)}}})}}class ut extends d{constructor({password:t,rawPassword:n,encryptionStrength:e}){super({start(){lt(this,t,n,e)},async transform(t,n){const e=this,{password:s,strength:r,nt:c,ready:i}=e;let a=z;s?(a=await async function(t,n,e){const s=H(new o(X[n]));return W(s,await ht(t,n,e,s))}(e,r,s),c()):await i;const f=new o(a.length+t.length-t.length%N);f.set(a,0),n.enqueue(wt(e,t,f,a.length,0))},async flush(t){const{et:n,st:e,ot:s,ready:r}=this;if(e&&n){await r;let o=z;if(s.length){const t=n.update(mt(st,s));e.update(t),o=yt(st,t)}const c=yt(st,e.digest()).slice(0,Z);t.enqueue(W(o,c))}}})}}function lt(t,e,s,r){n.assign(t,{ready:new l(n=>t.nt=n),password:pt(e,s),strength:r-1,ot:z})}function wt(t,n,e,s,r,c){const{et:i,st:a,ot:f}=t;f.length&&(n=W(f,n));const u=n.length-r;let l;for(e=function(t,n){if(n&&n>t.length){const e=t;(t=new o(n)).set(e,0)}return t}(e,s+(u-u%N)),l=0;l<=u-N;l+=N){const t=mt(st,dt(n,l,l+N));c&&a.update(t);const r=i.update(t);c||a.update(r),e.set(yt(st,r),l+s)}return t.ot=dt(n,l),e}async function ht(e,s,r,c){e.password=null;const i=await async function(t,n,e,s,r){if(!it)return E.importKey(n);try{return await nt.importKey("raw",n,e,!1,r)}catch{return it=!1,E.importKey(n)}}(0,r,G,0,Q),a=await async function(t,n,e){if(!at)return E.T(n,t.salt,J.iterations,e);try{return await nt.deriveBits(t,n,e)}catch{return at=!1,E.T(n,t.salt,J.iterations,e)}}(n.assign({salt:c},J),i,8*(2*Y[s]+2)),f=new o(a),u=mt(st,dt(f,0,Y[s])),l=mt(st,dt(f,Y[s],2*Y[s])),w=dt(f,2*Y[s]);return n.assign(e,{keys:{key:u,ct:l,passwordVerification:w},et:new ot(new rt(u),t.from($)),st:new ct(l)}),w}function pt(t,n){return n===v?function(t){if(typeof w==b){t=unescape(encodeURIComponent(t));const n=new o(t.length);for(let e=0;e<n.length;e++)n[e]=t.charCodeAt(e);return n}return(new w).encode(t)}(t):n}function dt(t,n,e){return t.subarray(n,e)}function yt(t,n){return t.v(n)}function mt(t,n){return t.C(n)}class St extends d{constructor({password:t,rawPassword:n,passwordVerification:e,checkPasswordOnly:s}){super({start(){vt(this,t,n,e)},transform(t,n){const e=this;if(e.password||e.rawPassword){const n=bt(e,t.subarray(0,12));if(e.password=e.rawPassword=null,0!=(n[11]^e.passwordVerification))throw new r(O);t=t.subarray(12)}s?n.error(new r(j)):n.enqueue(bt(e,t))}})}}class gt extends d{constructor({password:t,rawPassword:n,passwordVerification:e}){super({start(){vt(this,t,n,e)},transform(t,n){const e=this;let s,r;if(e.password||e.rawPassword){e.password=e.rawPassword=null;const n=H(new o(12));n[11]=e.passwordVerification,s=new o(t.length+n.length),s.set(kt(e,n),0),r=12}else s=new o(t.length),r=0;s.set(kt(e,t),r),n.enqueue(s)}})}}function vt(t,e,s,r){n.assign(t,{password:e,rawPassword:s,passwordVerification:r}),function(t,e,s){const r=[305419896,591751049,878082192];if(n.assign(t,{keys:r,it:new R(r[0]),ft:new R(r[2])}),s)for(let n=0;n<s.length;n++)zt(t,s[n]);else for(let n=0;n<e.length;n++)zt(t,e.charCodeAt(n))}(t,e,s)}function bt(t,n){const e=new o(n.length);for(let s=0;s<n.length;s++)e[s]=Ct(t)^n[s],zt(t,e[s]);return e}function kt(t,n){const e=new o(n.length);for(let s=0;s<n.length;s++)e[s]=Ct(t)^n[s],zt(t,n[s]);return e}function zt(t,n){let[,e]=t.keys;t.it.append([n]);const r=~t.it.get();e=At(s.imul(At(e+It(r)),134775813)+1),t.ft.append([e>>>24]);const o=~t.ft.get();t.keys=[r,e,o]}function Ct(t){const n=2|t.keys[2];return It(s.imul(n,1^n)>>>8)}function It(t){return 255&t}function At(t){return 4294967295&t}function xt(t){if(t instanceof y)return t;const n=t.getReader();return new y({async pull(t){const{value:e,done:s}=await n.read();s?t.close():t.enqueue(e)},cancel:t=>n.cancel(t)})}const Mt=new f;function Pt(t){return Mt.get(t)}const Bt="Invalid uncompressed size",Dt="deflate-raw",Ft="gzip",Rt=[31,139,8];class Ut extends d{constructor(t,{chunkSize:n,CompressionStreamFallback:e,CompressionStream:s}){super({});const{compressed:r,encrypted:o,useCompressionStream:c,zipCrypto:i,computeCrc32:a,level:f,deflate64:l,format:w,compressionMethod:h,inputSize:p}=t,d=this;let y,m,S,g=super.readable;const v=w&&Pt(w),b=a&&r&&!l&&!v&&(!o||i)&&Boolean(c&&s);if(o&&!i||!a||b||(y=new U,g=Lt(g,y)),r)if(v)g=Ot(g,Kt(v.CompressionStream,w,{level:f,chunkSize:n,compressionMethod:h,uncompressedSize:p}));else if(b)S=new Wt,g=Ot(g,new s(Ft)),g=Lt(g,S);else try{g=Et(g,c,{level:f,chunkSize:n},s,e)}catch(t){let n;try{n=new s(Ft)}catch{throw t}g=Ot(g,n),g=Lt(g,new Wt)}o&&(i?g=Lt(g,new gt(t)):(m=new ut(t),g=Lt(g,m))),Vt(d,g,()=>{o&&!i||!a||(d.crc32=b?S.crc32:new u(y.value.buffer).getUint32(0))})}}class Wt extends d{constructor(){let t,n=10,e=new o(0);super({transform(t,r){if(n){const e=s.min(n,t.length);if(n-=e,!(t=t.subarray(e)).length)return}const o=e.length+t.length;if(o<=8)return void(e=W(e,t));const c=o-8,i=s.min(c,e.length);r.enqueue(W(e.subarray(0,i),t.subarray(0,c-i))),e=W(e.subarray(i),t.subarray(c-i))},flush(){const n=_(e);t.crc32=n.getUint32(0,!0),t.uncompressedSize=n.getUint32(4,!0)}}),t=this}}class _t extends d{constructor(t,{chunkSize:n,DecompressionStreamFallback:e,DecompressionStream:s}){super({});const{zipCrypto:c,encrypted:i,checkCrc32:a,crc32:f,compressed:w,useCompressionStream:h,deflate64:p,format:m,compressionMethod:S,rawBitFlag:g,outputSize:b}=t;let k,z,C=super.readable;if(i&&(c?C=Lt(C,new St(t)):(z=new ft(t),C=Lt(C,z))),w){const t=m&&Pt(m);if(t)C=Ot(C,Kt(t.DecompressionStream,m,{chunkSize:n,compressionMethod:S,rawBitFlag:g,uncompressedSize:b}));else try{C=Et(C,h,{chunkSize:n,deflate64:p},s,e)}catch(t){if(p||b===v)throw t;let n;try{n=new s(Ft)}catch{throw t}C=function(t,n,e){const s=new R;let c,i,a,f=0,u=!1;const w=new l((t,n)=>{i=t,a=n});w.catch(()=>{}),e||i();const h=new d({start(t){const n=new o(10);n.set(Rt),t.enqueue(n)},transform(t,n){n.enqueue(t)},async flush(t){u=!0,y();try{await w}finally{m()}const n=new o(8),r=_(n);r.setUint32(0,s.get(),!0),r.setUint32(4,e,!0),t.enqueue(n)},cancel(t){a(t)}}),p=new d({transform(t,n){s.append(t),f+=t.length,f>=e?i():u&&y(),n.enqueue(t)},cancel(t){a(t)}});return t=Lt(t,h),Lt(t=Ot(t,n),p);function y(){m(),c=setTimeout(()=>a(new r(Bt)),5e3)}function m(){clearTimeout(c)}}(C,n,b)}C=function(t){const n=t.getReader();return new y({async pull(t){let e;try{e=await n.read()}catch(t){if(t&&t.message)throw t;const n=new r("Invalid compressed data");throw n.cause=t,n}const{value:s,done:o}=e;o?t.close():t.enqueue(s)},cancel:t=>n.cancel(t)})}(C)}a&&(k=new U,C=Lt(C,k)),Vt(this,C,()=>{if(a){const t=new u(k.value.buffer);if(f!=t.getUint32(0,!1))throw new r("Invalid CRC32")}})}}const Tt=new f;function Vt(t,e,s){e=Lt(e,new d({flush:s})),n.defineProperty(t,"readable",{get:()=>e})}function Kt(t,n,e){if(!t)throw new r("Compression method not supported");return new t(n,e)}function Et(t,n,e,s,r){const o=n&&s?s:r||s,c=e.deflate64?"deflate64-raw":Dt;let i;try{i=new o(c,e)}catch(t){if(!n||!r||o==r)throw t;i=new r(c,e)}return Ot(t,i)}function Lt(t,n){return xt(t).pipeThrough(n)}function Ot(t,n){const e=n.writable.getWriter(),s=t.getReader();return async function(){try{for(;;){await e.ready;const t=await s.read();if(t.done){await e.close();break}await e.write(t.value)}}catch(t){await async function(t,n){try{await t.abort(n)}catch{}}(e,t),await async function(t,n){try{await t.cancel(n)}catch{}}(s,t)}}(),n.readable}const jt="data",Ht="close",Nt="deflate";class qt extends d{constructor(t,e){super({});const s=this,{codecType:o}=t;let c;o.startsWith(Nt)?c=Ut:o.startsWith("inflate")&&(c=_t),s.outputSize=0;let i=0;const a=new c(t,e),f=super.readable,u=new d({transform(t,n){t&&t.length&&(i+=t.length,n.enqueue(t))},flush(){n.assign(s,{inputSize:i})}}),l=new d({transform(n,e){if(n&&n.length&&(e.enqueue(n),s.outputSize+=n.length,t.outputSize!==v&&s.outputSize>t.outputSize))throw new r(Bt)},flush(){const{crc32:t}=a;n.assign(s,{crc32:t,inputSize:i})}});n.defineProperty(s,"readable",{get:()=>f.pipeThrough(u).pipeThrough(a).pipeThrough(l)})}}class Gt extends d{constructor(t){const n=[];let s=0;function r(){const e=new o(t);let r=0;for(;r<t;){const s=n[0],o=t-r;s.length<=o?(e.set(s,r),r+=s.length,n.shift()):(e.set(s.subarray(0,o),r),n[0]=s.subarray(o),r+=o)}return s-=t,e}(!e.isFinite(t)||t<1)&&(t=65536),super({transform(e,o){for(n.push(e),s+=e.length;s>t;)o.enqueue(r())},flush(t){s&&t.enqueue(function(t,n){const e=new o(n);let s=0;for(const n of t)e.set(n,s),s+=n.length;return e}(n,s))}})}}let Jt=2;try{typeof navigator!=b&&navigator.hardwareConcurrency&&(Jt=navigator.hardwareConcurrency)}catch{}const Qt=new f,Xt=new f;let Yt,Zt=0;async function $t(t){let n,o;try{const{options:c,config:i}=t;if(c.format)try{await async function(t,n){!Mt.has(t)&&n&&function(t,n){const{CompressionStream:e,DecompressionStream:s}=n;if(typeof e!=k&&typeof s!=k)throw new r("Invalid codec module");Mt.set(t,{CompressionStream:e,DecompressionStream:s})}(t,await(import(n)))}(c.format,c.codecURI)}catch(t){throw t.codecImportFailed=!0,t}if(i.CompressionStream=self.CompressionStream,i.DecompressionStream=self.DecompressionStream,c.compressed&&!c.format)if(c.useCompressionStream){if(!function(t,n){if(!t)return!1;let e=Tt.get(t);e||(e=new f,Tt.set(t,e));let s=e.get(n);if(s===v){try{new t(n),s=!0}catch{s=!1}e.set(n,s)}return s}(c.codecType.startsWith(Nt)?i.CompressionStream:i.DecompressionStream,Dt))try{await self.initModule(t.config)}catch{}}else try{await self.initModule(t.config)}catch{c.useCompressionStream=!0}!i.CompressionStreamFallback&&i.CompressionStreamZlib&&(i.CompressionStreamFallback=i.CompressionStreamZlib),!i.DecompressionStreamFallback&&i.DecompressionStreamZlib&&(i.DecompressionStreamFallback=i.DecompressionStreamZlib);const a={highWaterMark:1},u=t.readable?xt(t.readable):new y({async pull(t){const n=new l(t=>Qt.set(Zt,t));tn({type:"pull",messageId:Zt}),Zt=(Zt+1)%e.MAX_SAFE_INTEGER;const{value:s,done:r}=await n;t.enqueue(s),r&&t.close()}},a);o=t.writable?function(t){if(t instanceof m)return t;const n=t.getWriter();return new m({write:t=>n.write(t),close:()=>n.close(),abort:t=>n.abort(t)})}(t.writable):new m({async write(t){let n;const s=new l(t=>n=t);Xt.set(Zt,n),tn({type:jt,value:t,messageId:Zt}),Zt=(Zt+1)%e.MAX_SAFE_INTEGER,await s}},a),n=new qt(c,i),Yt=new AbortController;const{signal:w}=Yt;await u.pipeThrough(n).pipeThrough(new Gt(function(t){return r="string"==typeof(n=r=t.chunkSize)&&n.trim()?e(n):n,e.isInteger(r)&&r>=1?s.max(r,64):65536;var n,r}(i))).pipeTo(o,{signal:w,preventClose:!0,preventAbort:!0}),await o.getWriter().close();const{crc32:h,inputSize:p,outputSize:d}=n;tn({type:Ht,result:{crc32:h,inputSize:p,outputSize:d}})}catch(t){if(t.outputSize=n?n.outputSize:0,o&&!o.locked)try{await o.getWriter().close()}catch{}nn(t)}}function tn(t){const{value:n}=t;if(n)if(n.length)try{t.value=(e=n,e.byteOffset||e.byteLength!=e.buffer.byteLength?new o(e):e).buffer,p(t,[t.value])}catch{p(t)}else p(t);else p(t);var e}function nn(t=new r("Unknown error")){const{message:n,stack:e,code:s,name:o,outputSize:c,cause:i,codecImportFailed:a}=t,f={message:n,stack:e,code:s,name:o,outputSize:c};i&&(f.cause={name:i.name,message:i.message}),a&&(f.codecImportFailed=!0),p({error:f})}addEventListener("message",({data:t})=>{const{type:n,messageId:e,value:s,done:r}=t;try{if("start"==n&&$t(t),n==jt){const t=Qt.get(e);Qt.delete(e),t({value:s||new o,done:r})}if("ack"==n){const t=Xt.get(e);Xt.delete(e),t()}n==Ht&&Yt.abort()}catch(t){nn(t)}}),p({type:"ready"});const en="deflate",sn="deflate-raw",rn="deflate64-raw",on="gzip";let cn,an,fn,un,ln;function wn(t,n,e={}){if(!cn){const t=new r("WASM module not loaded");throw t.cause=ln,t}const c="number"==typeof e.level?e.level:-1,i="number"==typeof e.outBuffer?e.outBuffer:65536,a="number"==typeof e.inBufferSize?e.inBufferSize:65536;return new d({start(){try{let e;if(this.ut=an(i),this.in=an(a),this.inBufferSize=a,!this.ut||!this.in)throw new r("allocation failed");if(this.lt=new o(i),t?(this.wt=cn.deflate_process,this.ht=cn.deflate_last_consumed,this.yt=cn.deflate_end,this.St=cn.deflate_new(),e=n===on?cn.deflate_init_gzip(this.St,c):n===sn?cn.deflate_init_raw(this.St,c):cn.deflate_init(this.St,c)):n===rn?(this.wt=cn.inflate9_process,this.ht=cn.inflate9_last_consumed,this.yt=cn.inflate9_end,this.St=cn.inflate9_new(),e=cn.inflate9_init_raw(this.St)):(this.wt=cn.inflate_process,this.ht=cn.inflate_last_consumed,this.yt=cn.inflate_end,this.St=cn.inflate_new(),e=n===sn?cn.inflate_init_raw(this.St):n===on?cn.inflate_init_gzip(this.St):cn.inflate_init(this.St)),0!==e)throw new r("init failed:"+e)}catch(t){throw f(this),t}},transform(t,n){try{const e=t,c=new o(un.buffer),a=this.wt,f=this.ht,u=this.ut,l=this.lt;let w=0;for(;w<e.length;){const t=s.min(e.length-w,32768);if((!this.in||this.inBufferSize<t)&&(this.in&&fn&&(fn(this.in),this.in=0),this.in=an(t),this.inBufferSize=t,!this.in))throw new r("allocation failed");c.set(e.subarray(w,w+t),this.in);const o=a(this.St,this.in,t,u,i,0),h=o>>24&255,p=128&h?h-256:h;if(p<0)throw new r("process error:"+p);const d=16777215&o;d&&(l.set(c.subarray(u,u+d),0),n.enqueue(l.slice(0,d)));const y=f(this.St);if(0===y&&0===d)break;w+=y}}catch(t){f(this),n.error(t)}},flush(t){try{const n=new o(un.buffer),e=this.wt,s=this.ut,c=this.lt;for(;;){const o=e(this.St,0,0,s,i,4),a=o>>24&255,f=128&a?a-256:a;if(f<0)throw new r("process error:"+f);const u=16777215&o;if(u&&(c.set(n.subarray(s,s+u),0),t.enqueue(c.slice(0,u))),1===a||0===u)break}}catch(n){t.error(n)}finally{const n=f(this);0!==n&&t.error(new r("end error:"+n))}},cancel(){f(this)}});function f(t){let n=0;return t.St&&t.yt&&(n=t.yt(t.St)),t.St=0,t.in&&fn&&fn(t.in),t.in=0,t.ut&&fn&&fn(t.ut),t.ut=0,n}}class hn{constructor(t=en,n){return wn(!0,t,n)}}class pn{constructor(t=en,n){return wn(!1,t,n)}}hn.gt=!0,pn.gt=!0,hn.vt=[en,sn,on],pn.vt=[en,sn,on,rn];let dn=!1;!function(t={}){const{init:n}=t,e=t.CompressionStreamFallback||t.CompressionStreamZlib,s=t.DecompressionStreamFallback||t.DecompressionStreamZlib;self.initModule=async t=>{n&&await n(t),e&&(t.CompressionStreamFallback=e),s&&(t.DecompressionStreamFallback=s)}}({CompressionStreamFallback:hn,DecompressionStreamFallback:pn,init:t=>async function(t,{baseURI:n}){if(!dn)try{await async function(t,n){let e,s;try{try{s=new URL(t,n)}catch{}const r=await fetch(s);e=await r.arrayBuffer()}catch(n){if(!t.startsWith("data:application/wasm;base64,"))throw n;e=function(t){const n=t.split(",")[1],e=atob(n),s=e.length,r=new o(s);for(let t=0;t<s;++t)r[t]=e.charCodeAt(t);return r.buffer}(t)}!function(t){if(cn=t,({malloc:an,free:fn,memory:un}=cn),"function"!=typeof an||"function"!=typeof fn||!un)throw cn=an=fn=un=null,new r("Invalid WASM module")}((await WebAssembly.instantiate(e)).instance.exports)}(t,n),dn=!0}catch(t){throw function(t){ln=t}(t),t}}(t.wasmURI,t)})});\n';if("string"==typeof s&&(s=(new TextEncoder).encode(s)),t){const t=new Blob([s],{type:n});return URL.createObjectURL(t)}return "data:"+n+";base64,"+function(t){let n="";const s=t.length;let r=0;for(;r+2<s;r+=3){const s=t[r]<<16|t[r+1]<<8|t[r+2];n+=e$1[s>>18&63]+e$1[s>>12&63]+e$1[s>>6&63]+e$1[63&s];}const o=s-r;if(1===o){const s=t[r]<<16;n+=e$1[s>>18&63]+e$1[s>>12&63]+"==";}else if(2===o){const s=t[r]<<16|t[r+1]<<8;n+=e$1[s>>18&63]+e$1[s>>12&63]+e$1[s>>6&63]+"=";}return n}(s)}});
448
+ const t$1=new Uint8Array(288);t$1.fill(8,0,144),t$1.fill(9,144,256),t$1.fill(7,256,280),t$1.fill(8,280,288),new Uint8Array(30).fill(5);const e$1="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",n$1=t=>t({workerURI:t=>{const n="text/javascript";let s='!function(t){"function"==typeof define&&define.amd?define(t):t()}(function(){"use strict";const{Array:t,Object:n,Number:e,Math:s,Error:r,Uint8Array:o,Uint16Array:c,Uint32Array:i,Int32Array:a,Map:f,DataView:u,Promise:l,TextEncoder:w,crypto:h,postMessage:p,TransformStream:d,ReadableStream:y,WritableStream:m,CompressionStream:S,DecompressionStream:g}=self,v=void 0,b="undefined",k="function",z=new o,C=[[],[],[],[],[],[],[],[]];for(let t=0;t<256;t++){let n=t;for(let t=0;t<8;t++)n=1&n?n>>>1^3988292384:n>>>1;C[0][t]=n}for(let t=0;t<256;t++)for(let n=1;n<8;n++){const e=C[n-1][t];C[n][t]=e>>>8^C[0][255&e]}const[I,A,x,M,P,B,D,F]=C;class R{constructor(t){this.o=t||-1}append(t){let n=0|this.o;const e=0|t.length;let s=0;if(e>=8&&t.buffer){const r=new u(t.buffer,t.byteOffset,e),o=e-8;for(;s<=o;s+=8){const t=n^r.getInt32(s,!0),e=r.getInt32(s+4,!0);n=F[255&t]^D[t>>>8&255]^B[t>>>16&255]^P[t>>>24&255]^M[255&e]^x[e>>>8&255]^A[e>>>16&255]^I[e>>>24&255]}}for(;s<e;s++)n=n>>>8^I[255&(n^t[s])];this.o=n}get(){return~this.o}}class U extends d{constructor(){let t;const n=new R;super({transform(t,e){n.append(t),e.enqueue(t)},flush(){const e=new o(4);new u(e.buffer).setUint32(0,n.get()),t.value=e}}),t=this}}function W(t,n){const e=new o(t.length+n.length);return e.set(t),e.set(n,t.length),e}function _(t){return new u(t.buffer,t.byteOffset,t.byteLength)}const T={concat(t,n){if(0===t.length||0===n.length)return t.concat(n);const e=t[t.length-1],s=T.l(e);return 32===s?t.concat(n):T.h(n,s,0|e,t.slice(0,t.length-1))},bitLength(t){const n=t.length;if(0===n)return 0;const e=t[n-1];return 32*(n-1)+T.l(e)},m(t,n){if(32*t.length<n)return t;const e=(t=t.slice(0,s.ceil(n/32))).length;return n&=31,e>0&&n&&(t[e-1]=T.S(n,t[e-1]&2147483648>>n-1,1)),t},S:(t,n,e)=>32===t?n:(e?0|n:n<<32-t)+1099511627776*t,l:t=>s.round(t/1099511627776)||32,h(t,n,e,s){for(void 0===s&&(s=[]);n>=32;n-=32)s.push(e),e=0;if(0===n)return s.concat(t);for(let r=0;r<t.length;r++)s.push(e|t[r]>>>n),e=t[r]<<32-n;const r=t.length?t[t.length-1]:0,o=T.l(r);return s.push(T.S(n+o&31,n+o>32?e:s.pop(),1)),s}},V={bytes:{v(t){const n=T.bitLength(t)/8,e=new o(n);let s;for(let r=0;r<n;r++)3&r||(s=t[r/4]),e[r]=s>>>24,s<<=8;return e},C(t){const n=[];let e,s=0;for(e=0;e<t.length;e++)s=s<<8|t[e],3&~e||(n.push(s),s=0);return 3&e&&n.push(T.S(8*(3&e),s)),n}}},K=class{constructor(t){const n=this;n.blockSize=512,n.I=[1732584193,4023233417,2562383102,271733878,3285377520],n.A=[1518500249,1859775393,2400959708,3395469782],t?(n.M=t.M.slice(0),n.P=t.P.slice(0),n.B=t.B):n.reset()}reset(){const t=this;return t.M=t.I.slice(0),t.P=[],t.B=0,t}update(t){const n=this;"string"==typeof t&&(t=V.D.C(t));const e=n.P=T.concat(n.P,t),s=n.B,o=n.B=s+T.bitLength(t);if(o>9007199254740991)throw new r("Cannot hash more than 2^53 - 1 bits");const c=new i(e);let a=0;for(let t=n.blockSize+s-(n.blockSize+s&n.blockSize-1);t<=o;t+=n.blockSize)n.F(c.subarray(16*a,16*(a+1))),a+=1;return e.splice(0,16*a),n}R(){const t=this;let n=t.P;const e=t.M;n=T.concat(n,[T.S(1,1)]);for(let t=n.length+2;15&t;t++)n.push(0);for(n.push(s.floor(t.B/4294967296)),n.push(0|t.B);n.length;)t.F(n.splice(0,16));return t.reset(),e}U(t,n,e,s){return t<=19?n&e|~n&s:t<=39?n^e^s:t<=59?n&e|n&s|e&s:t<=79?n^e^s:void 0}W(t,n){return n<<t|n>>>32-t}F(n){const e=this,r=e.M,o=t(80);for(let t=0;t<16;t++)o[t]=n[t];let c=r[0],i=r[1],a=r[2],f=r[3],u=r[4];for(let t=0;t<=79;t++){t>=16&&(o[t]=e.W(1,o[t-3]^o[t-8]^o[t-14]^o[t-16]));const n=e.W(5,c)+e.U(t,i,a,f)+u+o[t]+e.A[s.floor(t/20)]|0;u=f,f=a,a=e.W(30,i),i=c,c=n}r[0]=r[0]+c|0,r[1]=r[1]+i|0,r[2]=r[2]+a|0,r[3]=r[3]+f|0,r[4]=r[4]+u|0}},E={importKey:t=>new E._(V.bytes.C(t)),T(t,n,e,s){if(e=e||1e4,s<0||e<0)throw new r("invalid params to pbkdf2");const o=1+(s>>5)<<2;let c,i,a,f,l;const w=new ArrayBuffer(o),h=new u(w);let p=0;const d=T;for(n=V.bytes.C(n),l=1;p<(o||1);l++){for(c=i=t.encrypt(d.concat(n,[l])),a=1;a<e;a++)for(i=t.encrypt(i),f=0;f<i.length;f++)c[f]^=i[f];for(a=0;p<(o||1)&&a<c.length;a++)h.setInt32(p,c[a]),p+=4}return w.slice(0,s/8)},_:class{constructor(t){const n=this,e=n.V=K,s=[[],[]];n.K=[new e,new e];const r=n.K[0].blockSize/32;t.length>r&&(t=(new e).update(t).R());for(let n=0;n<r;n++)s[0][n]=909522486^t[n],s[1][n]=1549556828^t[n];n.K[0].update(s[0]),n.K[1].update(s[1]),n.L=new e(n.K[0])}reset(){const t=this;t.L=new t.V(t.K[0]),t.O=!1}update(t){this.O=!0,this.L.update(t)}digest(){const t=this,n=t.L.R(),e=new t.V(t.K[1]).update(n).R();return t.reset(),e}encrypt(t){if(this.O)throw new r("encrypt on already updated hmac called!");return this.update(t),this.digest(t)}}},L=typeof h!=b&&typeof h.getRandomValues==k,O="Invalid password",j="zipjs-abort-check-password";function H(t){if(L)return h.getRandomValues(t);throw new r("Crypto API not supported")}const N=16,q={name:"PBKDF2"},G=n.assign({hash:{name:"HMAC"}},q),J=n.assign({iterations:1e3,hash:{name:"SHA-1"}},q),Q=["deriveBits"],X=[8,12,16],Y=[16,24,32],Z=10,$=[0,0,0,0],tt=typeof h!=b,nt=tt&&h.subtle,et=tt&&typeof nt!=b,st=V.bytes,rt=class{constructor(t){const n=this;n.j=[[[],[],[],[],[]],[[],[],[],[],[]]],n.j[0][0][0]||n.H();const e=n.j[0][4],s=n.j[1],o=t.length;let c,i,a,f=1;if(4!==o&&6!==o&&8!==o)throw new r("invalid aes key size");for(n.A=[i=t.slice(0),a=[]],c=o;c<4*o+28;c++){let t=i[c-1];(c%o===0||8===o&&c%o===4)&&(t=e[t>>>24]<<24^e[t>>16&255]<<16^e[t>>8&255]<<8^e[255&t],c%o===0&&(t=t<<8^t>>>24^f<<24,f=f<<1^283*(f>>7))),i[c]=i[c-o]^t}for(let t=0;c;t++,c--){const n=i[3&t?c:c-4];a[t]=c<=4||t<4?n:s[0][e[n>>>24]]^s[1][e[n>>16&255]]^s[2][e[n>>8&255]]^s[3][e[255&n]]}}encrypt(t){return this.N(t,0)}decrypt(t){return this.N(t,1)}H(){const t=this.j[0],n=this.j[1],e=t[4],s=n[4],r=[],o=[];let c,i,a,f;for(let t=0;t<256;t++)o[(r[t]=t<<1^283*(t>>7))^t]=t;for(let u=c=0;!e[u];u^=i||1,c=o[c]||1){let o=c^c<<1^c<<2^c<<3^c<<4;o=o>>8^255&o^99,e[u]=o,s[o]=u,f=r[a=r[i=r[u]]];let l=16843009*f^65537*a^257*i^16843008*u,w=257*r[o]^16843008*o;for(let e=0;e<4;e++)t[e][u]=w=w<<24^w>>>8,n[e][o]=l=l<<24^l>>>8}for(let e=0;e<5;e++)t[e]=t[e].slice(0),n[e]=n[e].slice(0)}N(t,n){if(4!==t.length)throw new r("invalid aes block size");const e=this.A[n],s=e.length/4-2,o=[0,0,0,0],c=this.j[n],i=c[0],a=c[1],f=c[2],u=c[3],l=c[4];let w,h,p,d=t[0]^e[0],y=t[n?3:1]^e[1],m=t[2]^e[2],S=t[n?1:3]^e[3],g=4;for(let t=0;t<s;t++)w=i[d>>>24]^a[y>>16&255]^f[m>>8&255]^u[255&S]^e[g],h=i[y>>>24]^a[m>>16&255]^f[S>>8&255]^u[255&d]^e[g+1],p=i[m>>>24]^a[S>>16&255]^f[d>>8&255]^u[255&y]^e[g+2],S=i[S>>>24]^a[d>>16&255]^f[y>>8&255]^u[255&m]^e[g+3],g+=4,d=w,y=h,m=p;for(let t=0;t<4;t++)o[n?3&-t:t]=l[d>>>24]<<24^l[y>>16&255]<<16^l[m>>8&255]<<8^l[255&S]^e[g++],w=d,d=y,y=m,m=S,S=w;return o}},ot=class{constructor(t,n){this.G=t,this.J=n,this.X=n}reset(){this.X=this.J}update(t){return this.Y(this.G,t,this.X)}Z(t){if(255&~(t>>24))t+=1<<24;else{let n=t>>16&255,e=t>>8&255,s=255&t;255===n?(n=0,255===e?(e=0,255===s?s=0:++s):++e):++n,t=0,t+=n<<16,t+=e<<8,t+=s}return t}$(t){0===(t[0]=this.Z(t[0]))&&(t[1]=this.Z(t[1]))}Y(t,n,e){let s;if(!(s=n.length))return[];const r=T.bitLength(n);for(let r=0;r<s;r+=4){this.$(e);const s=t.encrypt(e);n[r]^=s[0],n[r+1]^=s[1],n[r+2]^=s[2],n[r+3]^=s[3]}return T.m(n,r)}},ct=E._;let it=tt&&et&&typeof nt.importKey==k,at=tt&&et&&typeof nt.deriveBits==k;class ft extends d{constructor({password:t,rawPassword:n,encryptionStrength:e,checkPasswordOnly:s,checkAuthenticationCode:c=!0}){super({start(){lt(this,t,n,e)},async transform(t,n){const e=this,{password:c,strength:i,nt:a,ready:f}=e;c?(await async function(t,n,e,s){const o=await ht(t,n,e,dt(s,0,X[n])),c=dt(s,X[n]);if(o[0]!=c[0]||o[1]!=c[1])throw new r(O)}(e,i,c,dt(t,0,X[i]+2)),t=dt(t,X[i]+2),s?n.error(new r(j)):a()):await f;const u=new o(t.length-Z-(t.length-Z)%N);n.enqueue(wt(e,t,u,0,Z,!0))},async flush(t){const{et:n,st:e,ot:s,ready:o}=this;if(e&&n){await o;const i=dt(s,0,s.length-Z),a=dt(s,s.length-Z);let f=z;if(i.length){const t=mt(st,i);e.update(t);const s=n.update(t);f=yt(st,s)}const u=dt(yt(st,e.digest()),0,Z);let l=s.length<Z?1:0;for(let t=0;t<Z;t++)l|=u[t]^a[t];if(l&&c)throw new r("Invalid authentication code");t.enqueue(f)}}})}}class ut extends d{constructor({password:t,rawPassword:n,encryptionStrength:e}){super({start(){lt(this,t,n,e)},async transform(t,n){const e=this,{password:s,strength:r,nt:c,ready:i}=e;let a=z;s?(a=await async function(t,n,e){const s=H(new o(X[n]));return W(s,await ht(t,n,e,s))}(e,r,s),c()):await i;const f=new o(a.length+t.length-t.length%N);f.set(a,0),n.enqueue(wt(e,t,f,a.length,0))},async flush(t){const{et:n,st:e,ot:s,ready:r}=this;if(e&&n){await r;let o=z;if(s.length){const t=n.update(mt(st,s));e.update(t),o=yt(st,t)}const c=yt(st,e.digest()).slice(0,Z);t.enqueue(W(o,c))}}})}}function lt(t,e,s,r){n.assign(t,{ready:new l(n=>t.nt=n),password:pt(e,s),strength:r-1,ot:z})}function wt(t,n,e,s,r,c){const{et:i,st:a,ot:f}=t;f.length&&(n=W(f,n));const u=n.length-r;let l;for(e=function(t,n){if(n&&n>t.length){const e=t;(t=new o(n)).set(e,0)}return t}(e,s+(u-u%N)),l=0;l<=u-N;l+=N){const t=mt(st,dt(n,l,l+N));c&&a.update(t);const r=i.update(t);c||a.update(r),e.set(yt(st,r),l+s)}return t.ot=dt(n,l),e}async function ht(e,s,r,c){e.password=null;const i=await async function(t,n,e,s,r){if(!it)return E.importKey(n);try{return await nt.importKey("raw",n,e,!1,r)}catch{return it=!1,E.importKey(n)}}(0,r,G,0,Q),a=await async function(t,n,e){if(!at)return E.T(n,t.salt,J.iterations,e);try{return await nt.deriveBits(t,n,e)}catch{return at=!1,E.T(n,t.salt,J.iterations,e)}}(n.assign({salt:c},J),i,8*(2*Y[s]+2)),f=new o(a),u=mt(st,dt(f,0,Y[s])),l=mt(st,dt(f,Y[s],2*Y[s])),w=dt(f,2*Y[s]);return n.assign(e,{keys:{key:u,ct:l,passwordVerification:w},et:new ot(new rt(u),t.from($)),st:new ct(l)}),w}function pt(t,n){return n===v?function(t){if(typeof w==b){t=unescape(encodeURIComponent(t));const n=new o(t.length);for(let e=0;e<n.length;e++)n[e]=t.charCodeAt(e);return n}return(new w).encode(t)}(t):n}function dt(t,n,e){return t.subarray(n,e)}function yt(t,n){return t.v(n)}function mt(t,n){return t.C(n)}class St extends d{constructor({password:t,rawPassword:n,passwordVerification:e,checkPasswordOnly:s}){super({start(){vt(this,t,n,e)},transform(t,n){const e=this;if(e.password||e.rawPassword){const n=bt(e,t.subarray(0,12));if(e.password=e.rawPassword=null,0!=(n[11]^e.passwordVerification))throw new r(O);t=t.subarray(12)}s?n.error(new r(j)):n.enqueue(bt(e,t))}})}}class gt extends d{constructor({password:t,rawPassword:n,passwordVerification:e}){super({start(){vt(this,t,n,e)},transform(t,n){const e=this;let s,r;if(e.password||e.rawPassword){e.password=e.rawPassword=null;const n=H(new o(12));n[11]=e.passwordVerification,s=new o(t.length+n.length),s.set(kt(e,n),0),r=12}else s=new o(t.length),r=0;s.set(kt(e,t),r),n.enqueue(s)}})}}function vt(t,e,s,r){n.assign(t,{password:e,rawPassword:s,passwordVerification:r}),function(t,e,s){const r=[305419896,591751049,878082192];if(n.assign(t,{keys:r,it:new R(r[0]),ft:new R(r[2])}),s)for(let n=0;n<s.length;n++)zt(t,s[n]);else for(let n=0;n<e.length;n++)zt(t,e.charCodeAt(n))}(t,e,s)}function bt(t,n){const e=new o(n.length);for(let s=0;s<n.length;s++)e[s]=Ct(t)^n[s],zt(t,e[s]);return e}function kt(t,n){const e=new o(n.length);for(let s=0;s<n.length;s++)e[s]=Ct(t)^n[s],zt(t,n[s]);return e}function zt(t,n){let[,e]=t.keys;t.it.append([n]);const r=~t.it.get();e=At(s.imul(At(e+It(r)),134775813)+1),t.ft.append([e>>>24]);const o=~t.ft.get();t.keys=[r,e,o]}function Ct(t){const n=2|t.keys[2];return It(s.imul(n,1^n)>>>8)}function It(t){return 255&t}function At(t){return 4294967295&t}function xt(t){if(t instanceof y)return t;const n=t.getReader();return new y({async pull(t){const{value:e,done:s}=await n.read();s?t.close():t.enqueue(e)},cancel:t=>n.cancel(t)})}const Mt=new f;function Pt(t){return Mt.get(t)}const Bt="Invalid uncompressed size",Dt="deflate-raw",Ft="gzip",Rt=[31,139,8];class Ut extends d{constructor(t,{chunkSize:n,CompressionStreamFallback:e,CompressionStream:s}){super({});const{compressed:r,encrypted:o,useCompressionStream:c,zipCrypto:i,computeCrc32:a,level:f,deflate64:l,format:w,compressionMethod:h,inputSize:p}=t,d=this;let y,m,S,g=super.readable;const v=w&&Pt(w),b=a&&r&&!l&&!v&&(!o||i)&&Boolean(c&&s);if(o&&!i||!a||b||(y=new U,g=Lt(g,y)),r)if(v)g=Ot(g,Kt(v.CompressionStream,w,{level:f,chunkSize:n,compressionMethod:h,uncompressedSize:p}));else if(b)S=new Wt,g=Ot(g,new s(Ft)),g=Lt(g,S);else try{g=Et(g,c,{level:f,chunkSize:n},s,e)}catch(t){let n;try{n=new s(Ft)}catch{throw t}g=Ot(g,n),g=Lt(g,new Wt)}o&&(i?g=Lt(g,new gt(t)):(m=new ut(t),g=Lt(g,m))),Vt(d,g,()=>{o&&!i||!a||(d.crc32=b?S.crc32:new u(y.value.buffer).getUint32(0))})}}class Wt extends d{constructor(){let t,n=10,e=new o(0);super({transform(t,r){if(n){const e=s.min(n,t.length);if(n-=e,!(t=t.subarray(e)).length)return}const o=e.length+t.length;if(o<=8)return void(e=W(e,t));const c=o-8,i=s.min(c,e.length);r.enqueue(W(e.subarray(0,i),t.subarray(0,c-i))),e=W(e.subarray(i),t.subarray(c-i))},flush(){const n=_(e);t.crc32=n.getUint32(0,!0),t.uncompressedSize=n.getUint32(4,!0)}}),t=this}}class _t extends d{constructor(t,{chunkSize:n,DecompressionStreamFallback:e,DecompressionStream:s}){super({});const{zipCrypto:c,encrypted:i,checkCrc32:a,crc32:f,compressed:w,useCompressionStream:h,deflate64:p,format:m,compressionMethod:S,rawBitFlag:g,outputSize:b}=t;let k,z,C=super.readable;if(i&&(c?C=Lt(C,new St(t)):(z=new ft(t),C=Lt(C,z))),w){const t=m&&Pt(m);if(t)C=Ot(C,Kt(t.DecompressionStream,m,{chunkSize:n,compressionMethod:S,rawBitFlag:g,uncompressedSize:b}));else try{C=Et(C,h,{chunkSize:n,deflate64:p},s,e)}catch(t){if(p||b===v)throw t;let n;try{n=new s(Ft)}catch{throw t}C=function(t,n,e){const s=new R;let c,i,a,f=0,u=!1;const w=new l((t,n)=>{i=t,a=n});w.catch(()=>{}),e||i();const h=new d({start(t){const n=new o(10);n.set(Rt),t.enqueue(n)},transform(t,n){n.enqueue(t)},async flush(t){u=!0,y();try{await w}finally{m()}const n=new o(8),r=_(n);r.setUint32(0,s.get(),!0),r.setUint32(4,e,!0),t.enqueue(n)},cancel(t){a(t)}}),p=new d({transform(t,n){s.append(t),f+=t.length,f>=e?i():u&&y(),n.enqueue(t)},cancel(t){a(t)}});return t=Lt(t,h),Lt(t=Ot(t,n),p);function y(){m(),c=setTimeout(()=>a(new r(Bt)),5e3)}function m(){clearTimeout(c)}}(C,n,b)}C=function(t){const n=t.getReader();return new y({async pull(t){let e;try{e=await n.read()}catch(t){if(t&&t.message)throw t;const n=new r("Invalid compressed data");throw n.cause=t,n}const{value:s,done:o}=e;o?t.close():t.enqueue(s)},cancel:t=>n.cancel(t)})}(C)}a&&(k=new U,C=Lt(C,k)),Vt(this,C,()=>{if(a){const t=new u(k.value.buffer);if(f!=t.getUint32(0,!1))throw new r("Invalid CRC32")}})}}const Tt=new f;function Vt(t,e,s){e=Lt(e,new d({flush:s})),n.defineProperty(t,"readable",{get:()=>e})}function Kt(t,n,e){if(!t)throw new r("Compression method not supported");return new t(n,e)}function Et(t,n,e,s,r){const o=n&&s?s:r||s,c=e.deflate64?"deflate64-raw":Dt;let i;try{i=new o(c,e)}catch(t){if(!n||!r||o==r)throw t;i=new r(c,e)}return Ot(t,i)}function Lt(t,n){return xt(t).pipeThrough(n)}function Ot(t,n){const e=n.writable.getWriter(),s=t.getReader();return async function(){try{for(;;){await e.ready;const t=await s.read();if(t.done){await e.close();break}await e.write(t.value)}}catch(t){await async function(t,n){try{await t.abort(n)}catch{}}(e,t),await async function(t,n){try{await t.cancel(n)}catch{}}(s,t)}}(),n.readable}const jt="data",Ht="close",Nt="deflate";class qt extends d{constructor(t,e){super({});const s=this,{codecType:o}=t;let c;o.startsWith(Nt)?c=Ut:o.startsWith("inflate")&&(c=_t),s.outputSize=0;let i=0;const a=new c(t,e),f=super.readable,u=new d({transform(t,n){t&&t.length&&(i+=t.length,n.enqueue(t))},flush(){n.assign(s,{inputSize:i})}}),l=new d({transform(n,e){if(n&&n.length&&(e.enqueue(n),s.outputSize+=n.length,t.outputSize!==v&&s.outputSize>t.outputSize))throw new r(Bt)},flush(){const{crc32:t}=a;n.assign(s,{crc32:t,inputSize:i})}});n.defineProperty(s,"readable",{get:()=>f.pipeThrough(u).pipeThrough(a).pipeThrough(l)})}}class Gt extends d{constructor(t){const s=[];let r=0,c=0;function i(){const n=new o(t);let e=0;for(;e<t;){const r=s[0],o=t-e;r.length<=o?(n.set(r,e),e+=r.length,s.shift()):(n.set(r.subarray(0,o),e),s[0]=r.subarray(o),e+=o)}return r-=t,n}(!e.isFinite(t)||t<1)&&(t=65536),super({transform(n,e){for(s.push(n),r+=n.length;r>t;)c+=t,e.enqueue(i())},flush(t){r&&(c+=r,t.enqueue(function(t,n){const e=new o(n);let s=0;for(const n of t)e.set(n,s),s+=n.length;return e}(s,r)))}}),n.defineProperty(this,"outputSize",{get:()=>c})}}let Jt=2;try{typeof navigator!=b&&navigator.hardwareConcurrency&&(Jt=navigator.hardwareConcurrency)}catch{}const Qt=new f,Xt=new f;let Yt,Zt=0;async function $t(t){let n,o,c;try{const{options:i,config:a}=t;if(i.format)try{await async function(t,n){!Mt.has(t)&&n&&function(t,n){const{CompressionStream:e,DecompressionStream:s}=n;if(typeof e!=k&&typeof s!=k)throw new r("Invalid codec module");Mt.set(t,{CompressionStream:e,DecompressionStream:s})}(t,await(import(n)))}(i.format,i.codecURI)}catch(t){throw t.codecImportFailed=!0,t}if(a.CompressionStream=self.CompressionStream,a.DecompressionStream=self.DecompressionStream,i.compressed&&!i.format)if(i.useCompressionStream){if(!function(t,n){if(!t)return!1;let e=Tt.get(t);e||(e=new f,Tt.set(t,e));let s=e.get(n);if(s===v){try{new t(n),s=!0}catch{s=!1}e.set(n,s)}return s}(i.codecType.startsWith(Nt)?a.CompressionStream:a.DecompressionStream,Dt))try{await self.initModule(t.config)}catch{}}else try{await self.initModule(t.config)}catch{i.useCompressionStream=!0}!a.CompressionStreamFallback&&a.CompressionStreamZlib&&(a.CompressionStreamFallback=a.CompressionStreamZlib),!a.DecompressionStreamFallback&&a.DecompressionStreamZlib&&(a.DecompressionStreamFallback=a.DecompressionStreamZlib);const u={highWaterMark:1},w=t.readable?xt(t.readable):new y({async pull(t){const n=new l(t=>Qt.set(Zt,t));tn({type:"pull",messageId:Zt}),Zt=(Zt+1)%e.MAX_SAFE_INTEGER;const{value:s,done:r}=await n;t.enqueue(s),r&&t.close()}},u);c=t.writable?function(t){if(t instanceof m)return t;const n=t.getWriter();return new m({write:t=>n.write(t),close:()=>n.close(),abort:t=>n.abort(t)})}(t.writable):new m({async write(t){let n;const s=new l(t=>n=t);Xt.set(Zt,n),tn({type:jt,value:t,messageId:Zt}),Zt=(Zt+1)%e.MAX_SAFE_INTEGER,await s}},u),n=new qt(i,a),o=new Gt(function(t){return r="string"==typeof(n=r=t.chunkSize)&&n.trim()?e(n):n,e.isInteger(r)&&r>=1?s.max(r,64):65536;var n,r}(a)),Yt=new AbortController;const{signal:h}=Yt;await w.pipeThrough(n).pipeThrough(o).pipeTo(c,{signal:h,preventClose:!0,preventAbort:!0}),await c.getWriter().close();const{crc32:p,inputSize:d,outputSize:S}=n;tn({type:Ht,result:{crc32:p,inputSize:d,outputSize:S}})}catch(t){if(t.outputSize=o?o.outputSize:0,c&&!c.locked)try{await c.getWriter().close()}catch{}nn(t)}}function tn(t){const{value:n}=t;if(n)if(n.length)try{t.value=(e=n,e.byteOffset||e.byteLength!=e.buffer.byteLength?new o(e):e).buffer,p(t,[t.value])}catch{p(t)}else p(t);else p(t);var e}function nn(t=new r("Unknown error")){const{message:n,stack:e,code:s,name:o,outputSize:c,cause:i,codecImportFailed:a}=t,f={message:n,stack:e,code:s,name:o,outputSize:c};i&&(f.cause={name:i.name,message:i.message}),a&&(f.codecImportFailed=!0),p({error:f})}addEventListener("message",({data:t})=>{const{type:n,messageId:e,value:s,done:r}=t;try{if("start"==n&&$t(t),n==jt){const t=Qt.get(e);Qt.delete(e),t({value:s||new o,done:r})}if("ack"==n){const t=Xt.get(e);Xt.delete(e),t()}n==Ht&&Yt.abort()}catch(t){nn(t)}}),p({type:"ready"});const en="deflate",sn="deflate-raw",rn="deflate64-raw",on="gzip";let cn,an,fn,un,ln;function wn(t,n,e={}){if(!cn){const t=new r("WASM module not loaded");throw t.cause=ln,t}const c="number"==typeof e.level?e.level:-1,i="number"==typeof e.outBuffer?e.outBuffer:65536,a="number"==typeof e.inBufferSize?e.inBufferSize:65536;return new d({start(){try{let e;if(this.ut=an(i),this.in=an(a),this.inBufferSize=a,!this.ut||!this.in)throw new r("allocation failed");if(this.lt=new o(i),t?(this.wt=cn.deflate_process,this.ht=cn.deflate_last_consumed,this.yt=cn.deflate_end,this.St=cn.deflate_new(),e=n===on?cn.deflate_init_gzip(this.St,c):n===sn?cn.deflate_init_raw(this.St,c):cn.deflate_init(this.St,c)):n===rn?(this.wt=cn.inflate9_process,this.ht=cn.inflate9_last_consumed,this.yt=cn.inflate9_end,this.St=cn.inflate9_new(),e=cn.inflate9_init_raw(this.St)):(this.wt=cn.inflate_process,this.ht=cn.inflate_last_consumed,this.yt=cn.inflate_end,this.St=cn.inflate_new(),e=n===sn?cn.inflate_init_raw(this.St):n===on?cn.inflate_init_gzip(this.St):cn.inflate_init(this.St)),0!==e)throw new r("init failed:"+e)}catch(t){throw f(this),t}},transform(t,n){try{const e=t,c=new o(un.buffer),a=this.wt,f=this.ht,u=this.ut,l=this.lt;let w=0;for(;w<e.length;){const t=s.min(e.length-w,32768);if((!this.in||this.inBufferSize<t)&&(this.in&&fn&&(fn(this.in),this.in=0),this.in=an(t),this.inBufferSize=t,!this.in))throw new r("allocation failed");c.set(e.subarray(w,w+t),this.in);const o=a(this.St,this.in,t,u,i,0),h=o>>24&255,p=128&h?h-256:h;if(p<0)throw new r("process error:"+p);const d=16777215&o;d&&(l.set(c.subarray(u,u+d),0),n.enqueue(l.slice(0,d)));const y=f(this.St);if(0===y&&0===d)break;w+=y}}catch(t){f(this),n.error(t)}},flush(t){try{const n=new o(un.buffer),e=this.wt,s=this.ut,c=this.lt;for(;;){const o=e(this.St,0,0,s,i,4),a=o>>24&255,f=128&a?a-256:a;if(f<0)throw new r("process error:"+f);const u=16777215&o;if(u&&(c.set(n.subarray(s,s+u),0),t.enqueue(c.slice(0,u))),1===a||0===u)break}}catch(n){t.error(n)}finally{const n=f(this);0!==n&&t.error(new r("end error:"+n))}},cancel(){f(this)}});function f(t){let n=0;return t.St&&t.yt&&(n=t.yt(t.St)),t.St=0,t.in&&fn&&fn(t.in),t.in=0,t.ut&&fn&&fn(t.ut),t.ut=0,n}}class hn{constructor(t=en,n){return wn(!0,t,n)}}class pn{constructor(t=en,n){return wn(!1,t,n)}}hn.gt=!0,pn.gt=!0,hn.vt=[en,sn,on],pn.vt=[en,sn,on,rn];let dn=!1;!function(t={}){const{init:n}=t,e=t.CompressionStreamFallback||t.CompressionStreamZlib,s=t.DecompressionStreamFallback||t.DecompressionStreamZlib;self.initModule=async t=>{n&&await n(t),e&&(t.CompressionStreamFallback=e),s&&(t.DecompressionStreamFallback=s)}}({CompressionStreamFallback:hn,DecompressionStreamFallback:pn,init:t=>async function(t,{baseURI:n}){if(!dn)try{await async function(t,n){let e,s;try{try{s=new URL(t,n)}catch{}const r=await fetch(s);e=await r.arrayBuffer()}catch(n){if(!t.startsWith("data:application/wasm;base64,"))throw n;e=function(t){const n=t.split(",")[1],e=atob(n),s=e.length,r=new o(s);for(let t=0;t<s;++t)r[t]=e.charCodeAt(t);return r.buffer}(t)}!function(t){if(cn=t,({malloc:an,free:fn,memory:un}=cn),"function"!=typeof an||"function"!=typeof fn||!un)throw cn=an=fn=un=null,new r("Invalid WASM module")}((await WebAssembly.instantiate(e)).instance.exports)}(t,n),dn=!0}catch(t){throw function(t){ln=t}(t),t}}(t.wasmURI,t)})});\n';if("string"==typeof s&&(s=(new TextEncoder).encode(s)),t){const t=new Blob([s],{type:n});return URL.createObjectURL(t)}return "data:"+n+";base64,"+function(t){let n="";const s=t.length;let r=0;for(;r+2<s;r+=3){const s=t[r]<<16|t[r+1]<<8|t[r+2];n+=e$1[s>>18&63]+e$1[s>>12&63]+e$1[s>>6&63]+e$1[63&s];}const o=s-r;if(1===o){const s=t[r]<<16;n+=e$1[s>>18&63]+e$1[s>>12&63]+"==";}else if(2===o){const s=t[r]<<16|t[r+1]<<8;n+=e$1[s>>18&63]+e$1[s>>12&63]+e$1[s>>6&63]+"=";}return n}(s)}});
418
449
 
419
450
  /*
420
451
  Copyright (c) 2026 Gildas Lormeau. All rights reserved.
@@ -2599,6 +2630,7 @@
2599
2630
  constructor(chunkSize) {
2600
2631
  const pendingChunks = [];
2601
2632
  let pendingLength = 0;
2633
+ let outputSize = 0;
2602
2634
  if (!Number.isFinite(chunkSize) || chunkSize < 1) {
2603
2635
  chunkSize = DEFAULT_CHUNK_SIZE;
2604
2636
  }
@@ -2607,15 +2639,20 @@
2607
2639
  pendingChunks.push(chunk);
2608
2640
  pendingLength += chunk.length;
2609
2641
  while (pendingLength > chunkSize) {
2642
+ outputSize += chunkSize;
2610
2643
  controller.enqueue(shiftChunk());
2611
2644
  }
2612
2645
  },
2613
2646
  flush(controller) {
2614
2647
  if (pendingLength) {
2648
+ outputSize += pendingLength;
2615
2649
  controller.enqueue(concatChunks(pendingChunks, pendingLength));
2616
2650
  }
2617
2651
  }
2618
2652
  });
2653
+ Object.defineProperty(this, "outputSize", {
2654
+ get: () => outputSize
2655
+ });
2619
2656
 
2620
2657
  function shiftChunk() {
2621
2658
  const result = new Uint8Array(chunkSize);
@@ -2820,7 +2857,7 @@
2820
2857
  }
2821
2858
 
2822
2859
  async function runWorker$1({ options, readable, writable, onTaskFinished }, config) {
2823
- let codecStream;
2860
+ let codecStream, chunkStream;
2824
2861
  try {
2825
2862
  if (options.compressed && !options.format) {
2826
2863
  const deflate = options.codecType.startsWith(CODEC_DEFLATE);
@@ -2843,9 +2880,10 @@
2843
2880
  }
2844
2881
  }
2845
2882
  codecStream = new CodecStream(options, config);
2883
+ chunkStream = new ChunkStream(getChunkSize(config));
2846
2884
  await readable
2847
2885
  .pipeThrough(codecStream)
2848
- .pipeThrough(new ChunkStream(getChunkSize(config)))
2886
+ .pipeThrough(chunkStream)
2849
2887
  .pipeTo(writable, { preventClose: true, preventAbort: true });
2850
2888
  const {
2851
2889
  crc32,
@@ -2859,7 +2897,7 @@
2859
2897
  };
2860
2898
  } catch (error) {
2861
2899
  if (codecStream) {
2862
- error.outputSize = codecStream.outputSize;
2900
+ error.outputSize = chunkStream ? chunkStream.outputSize : 0;
2863
2901
  }
2864
2902
  throw error;
2865
2903
  } finally {
@@ -2968,11 +3006,17 @@
2968
3006
  let resolveResult, rejectResult;
2969
3007
  const result = new Promise((resolve, reject) => {
2970
3008
  resolveResult = resolve;
2971
- rejectResult = reject;
3009
+ rejectResult = error => {
3010
+ if (error && error.outputSize === UNDEFINED_VALUE) {
3011
+ error.outputSize = workerData.outputSize;
3012
+ }
3013
+ reject(error);
3014
+ };
2972
3015
  });
2973
3016
  Object.assign(workerData, {
2974
3017
  reader: null,
2975
3018
  writer: null,
3019
+ outputSize: 0,
2976
3020
  resolveResult,
2977
3021
  rejectResult,
2978
3022
  result
@@ -3256,8 +3300,10 @@
3256
3300
  }
3257
3301
  }
3258
3302
  if (type == MESSAGE_DATA) {
3303
+ const chunk = new Uint8Array(value);
3259
3304
  await writer.ready;
3260
- await writer.write(new Uint8Array(value));
3305
+ await writer.write(chunk);
3306
+ workerData.outputSize += chunk.length;
3261
3307
  if (!stale()) {
3262
3308
  sendMessage({ type: MESSAGE_ACK_DATA, messageId }, workerData);
3263
3309
  }
@@ -3565,10 +3611,13 @@
3565
3611
 
3566
3612
 
3567
3613
  const ERR_HTTP_STATUS = "HTTP error ";
3614
+ const MIN_SUCCESS_HTTP_STATUS = 200;
3615
+ const MAX_SUCCESS_HTTP_STATUS = 299;
3568
3616
  const ERR_HTTP_RANGE = "HTTP Range not supported";
3569
3617
  const ERR_HTTP_RESOURCE_CHANGED = "HTTP resource changed";
3570
3618
  const ERR_ITERATOR_COMPLETED_TOO_SOON = "Writer iterator completed too soon";
3571
3619
  const ERR_WRITER_NOT_INITIALIZED = "Writer not initialized";
3620
+ const ERR_WRITER_SIZE_NOT_WRITABLE = "Invalid writer (size must be writable)";
3572
3621
 
3573
3622
  const CONTENT_TYPE_TEXT_PLAIN = "text/plain";
3574
3623
  const HTTP_HEADER_CONTENT_LENGTH = "Content-Length";
@@ -3760,11 +3809,14 @@
3760
3809
  const reader = this;
3761
3810
  const { sourceBlob, size } = reader;
3762
3811
  const { offset = 0, size: readSize = size - offset } = options || {};
3763
- if (!offset && readSize >= size) {
3764
- return toCompatibleReadable(sourceBlob.stream());
3765
- }
3766
- if (blobSliceReliable) {
3767
- return toCompatibleReadable(sourceBlob.slice(offset, offset + readSize).stream());
3812
+ // deno-lint-ignore valid-typeof
3813
+ if (typeof sourceBlob.stream == FUNCTION_TYPE) {
3814
+ if (!offset && readSize >= size) {
3815
+ return toCompatibleReadable(sourceBlob.stream());
3816
+ }
3817
+ if (blobSliceReliable) {
3818
+ return toCompatibleReadable(sourceBlob.slice(offset, offset + readSize).stream());
3819
+ }
3768
3820
  }
3769
3821
  return super.createReadable(options);
3770
3822
  }
@@ -4164,7 +4216,7 @@
4164
4216
 
4165
4217
  async function sendFetchRequest(method, { fetch: fetchFunction = fetch, options, url }, headers) {
4166
4218
  const response = await fetchFunction(url, Object.assign({}, options, { method, headers }));
4167
- if (response.status < 400) {
4219
+ if (response.status >= MIN_SUCCESS_HTTP_STATUS && response.status <= MAX_SUCCESS_HTTP_STATUS) {
4168
4220
  return response;
4169
4221
  } else {
4170
4222
  throw response.status == 416 ? new Error(ERR_HTTP_RANGE) : new Error(ERR_HTTP_STATUS + (response.statusText || response.status));
@@ -4175,7 +4227,7 @@
4175
4227
  return new Promise((resolve, reject) => {
4176
4228
  const request = new XMLHttpRequest();
4177
4229
  request.addEventListener("load", () => {
4178
- if (request.status < 400) {
4230
+ if (request.status >= MIN_SUCCESS_HTTP_STATUS && request.status <= MAX_SUCCESS_HTTP_STATUS) {
4179
4231
  const headers = [];
4180
4232
  request.getAllResponseHeaders().trim().split(/[\r\n]+/).forEach(header => {
4181
4233
  const splitHeader = header.trim().split(/\s*:\s*/);
@@ -4479,8 +4531,10 @@
4479
4531
  writable: toCompatibleWritable(writer)
4480
4532
  };
4481
4533
  }
4482
- if (writer.size === UNDEFINED_VALUE) {
4483
- writer.size = 0;
4534
+ try {
4535
+ writer.size = writer.size === UNDEFINED_VALUE ? 0 : writer.size;
4536
+ } catch {
4537
+ throw new Error(ERR_WRITER_SIZE_NOT_WRITABLE);
4484
4538
  }
4485
4539
  return writer;
4486
4540
  }
@@ -4528,6 +4582,45 @@
4528
4582
  }
4529
4583
  }
4530
4584
 
4585
+ /*
4586
+ Copyright (c) 2026 Gildas Lormeau. All rights reserved.
4587
+
4588
+ Redistribution and use in source and binary forms, with or without
4589
+ modification, are permitted provided that the following conditions are met:
4590
+
4591
+ 1. Redistributions of source code must retain the above copyright notice,
4592
+ this list of conditions and the following disclaimer.
4593
+
4594
+ 2. Redistributions in binary form must reproduce the above copyright
4595
+ notice, this list of conditions and the following disclaimer in
4596
+ the documentation and/or other materials provided with the distribution.
4597
+
4598
+ 3. The names of the authors may not be used to endorse or promote products
4599
+ derived from this software without specific prior written permission.
4600
+
4601
+ THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
4602
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
4603
+ FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT,
4604
+ INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
4605
+ INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
4606
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
4607
+ OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
4608
+ LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
4609
+ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
4610
+ EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
4611
+ */
4612
+
4613
+
4614
+ function addWarning(warnings, reason, filename) {
4615
+ if (!warnings.some(warning => warning.reason == reason)) {
4616
+ const warning = { reason };
4617
+ if (filename !== UNDEFINED_VALUE) {
4618
+ warning.filename = filename;
4619
+ }
4620
+ warnings.push(warning);
4621
+ }
4622
+ }
4623
+
4531
4624
  /*
4532
4625
  Copyright (c) 2025 Gildas Lormeau. All rights reserved.
4533
4626
 
@@ -4556,6 +4649,7 @@
4556
4649
  EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
4557
4650
  */
4558
4651
 
4652
+
4559
4653
  const PROPERTY_NAME_FILENAME = "filename";
4560
4654
  const PROPERTY_NAME_RAW_FILENAME = "rawFilename";
4561
4655
  const PROPERTY_NAME_COMMENT = "comment";
@@ -4680,6 +4774,38 @@
4680
4774
 
4681
4775
  }
4682
4776
 
4777
+ const INTERPRETED_EXTRA_FIELD_TYPES = new Set([
4778
+ EXTRAFIELD_TYPE_ZIP64,
4779
+ EXTRAFIELD_TYPE_AES,
4780
+ EXTRAFIELD_TYPE_NTFS,
4781
+ EXTRAFIELD_TYPE_EXTENDED_TIMESTAMP,
4782
+ EXTRAFIELD_TYPE_UNICODE_PATH,
4783
+ EXTRAFIELD_TYPE_UNICODE_COMMENT,
4784
+ EXTRAFIELD_TYPE_USDZ,
4785
+ EXTRAFIELD_TYPE_INFOZIP,
4786
+ EXTRAFIELD_TYPE_UNIX,
4787
+ EXTRAFIELD_TYPE_UNIX_TYPE1,
4788
+ EXTRAFIELD_TYPE_PKWARE_UNIX
4789
+ ]);
4790
+
4791
+ function getUserExtraField(extraField) {
4792
+ if (extraField) {
4793
+ const userExtraField = new Map();
4794
+ extraField.forEach((field, type) => {
4795
+ if (!INTERPRETED_EXTRA_FIELD_TYPES.has(type)) {
4796
+ userExtraField.set(type, field.data);
4797
+ }
4798
+ });
4799
+ if (userExtraField.size) {
4800
+ return userExtraField;
4801
+ }
4802
+ }
4803
+ }
4804
+
4805
+ function getEncryptionOverhead(encrypted, zipCrypto, encryptionStrength) {
4806
+ return encrypted ? (zipCrypto ? 12 : 16 + encryptionStrength * 4) : 0;
4807
+ }
4808
+
4683
4809
  /*
4684
4810
  Copyright (c) 2025 Gildas Lormeau. All rights reserved.
4685
4811
 
@@ -4739,6 +4865,8 @@
4739
4865
  const WARNING_TRAILING_CENTRAL_DIRECTORY_DATA = "trailing central directory data";
4740
4866
  const WARNING_DUPLICATE_FILENAME = "duplicate filename";
4741
4867
  const WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY = "mismatched zip64 end of central directory record";
4868
+ const WARNING_MULTIPLE_END_OF_CENTRAL_DIRECTORY = "multiple end of central directory records";
4869
+ const WARNING_MISMATCHED_LOCAL_FILE_HEADER_FILENAME = "mismatched local file header (filename)";
4742
4870
  const WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG = "mismatched local file header (general purpose bit flag)";
4743
4871
  const WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD = "mismatched local file header (compression method)";
4744
4872
  const WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES = "mismatched local file header (crc32 or sizes)";
@@ -4809,7 +4937,7 @@
4809
4937
  }
4810
4938
  }
4811
4939
  if (rejectAmbiguousEndOfDirectory && endOfDirectoryReachingEndCount > 1) {
4812
- throwAmbiguousArchive("multiple end of central directory records");
4940
+ throwAmbiguousArchive(WARNING_MULTIPLE_END_OF_CENTRAL_DIRECTORY);
4813
4941
  }
4814
4942
  const endOfDirectoryView = getDataView(endOfDirectoryInfo);
4815
4943
  let directoryDataLength = getUint32$1(endOfDirectoryView, 12);
@@ -5107,7 +5235,8 @@
5107
5235
  const writer = new TransformStream();
5108
5236
  const arrayBufferPromise = streamToBlob(writer.readable).then(blob => blob.arrayBuffer());
5109
5237
  arrayBufferPromise.catch(() => { });
5110
- await fileEntry.getData(writer, entry, zipReader.readRanges, options);
5238
+ await fileEntry.getData(writer, entry, zipReader.readRanges,
5239
+ Object.assign({}, options, { preventClose: false }));
5111
5240
  return arrayBufferPromise;
5112
5241
  };
5113
5242
  offset = endOffset;
@@ -5188,48 +5317,101 @@
5188
5317
  await reader.readable.cancel();
5189
5318
  }
5190
5319
  }
5320
+
5321
+ [SYMBOL_ASYNC_DISPOSE]() {
5322
+ return this.close();
5323
+ }
5191
5324
  }
5192
5325
 
5193
5326
  class ZipReaderStream {
5194
5327
 
5195
5328
  constructor(options = {}) {
5196
- const { readable, writable } = new TransformStream();
5197
- const gen = new ZipReader(readable, options).getEntriesGenerator();
5329
+ let sourceController;
5330
+ const { readable, writable } = new TransformStream({
5331
+ start(controller) {
5332
+ sourceController = controller;
5333
+ }
5334
+ });
5335
+ const zipReader = new ZipReader(readable, options);
5336
+ const gen = zipReader.getEntriesGenerator();
5337
+ const pendingEntries = new Set();
5198
5338
  this.readable = new ReadableStream({
5199
5339
  async pull(controller) {
5200
5340
  const { done, value } = await gen.next();
5201
5341
  if (done)
5202
5342
  return controller.close();
5343
+ const entryStream = createEntryStream(value, pendingEntries);
5203
5344
  const chunk = {
5204
5345
  ...value,
5205
- readable: (function () {
5206
- const { readable, writable } = new TransformStream();
5207
- if (value.getData) {
5208
- getData();
5209
- return readable;
5210
- }
5211
-
5212
- async function getData() {
5213
- try {
5214
- await value.getData(writable);
5215
- } catch (error) {
5216
- try {
5217
- await writable.abort(error);
5218
- } catch {
5219
- // ignored
5220
- }
5221
- }
5222
- }
5223
- })()
5346
+ readable: entryStream.readable
5224
5347
  };
5225
5348
  delete chunk.getData;
5349
+ Object.defineProperties(chunk, {
5350
+ localDirectory: {
5351
+ get: () => value.localDirectory,
5352
+ enumerable: true
5353
+ },
5354
+ warnings: {
5355
+ get: () => value.warnings,
5356
+ enumerable: true
5357
+ }
5358
+ });
5226
5359
  controller.enqueue(chunk);
5360
+ },
5361
+ async cancel(reason) {
5362
+ const entryStreams = Array.from(pendingEntries);
5363
+ pendingEntries.clear();
5364
+ sourceController.error(reason);
5365
+ await Promise.allSettled(entryStreams.map(entryStream => entryStream.cancel(reason)));
5366
+ await Promise.allSettled([gen.return(), zipReader.close()]);
5227
5367
  }
5228
5368
  });
5229
5369
  this.writable = writable;
5230
5370
  }
5231
5371
  }
5232
5372
 
5373
+ function createEntryStream(entry, pendingEntries) {
5374
+ const { readable, writable } = new TransformStream();
5375
+ let dataReader;
5376
+ const entryStream = {
5377
+ cancel: async reason => {
5378
+ pendingEntries.delete(entryStream);
5379
+ await (dataReader ? dataReader.cancel(reason) : readable.cancel(reason));
5380
+ }
5381
+ };
5382
+ entryStream.readable = new ReadableStream({
5383
+ async pull(controller) {
5384
+ if (!dataReader) {
5385
+ dataReader = readable.getReader();
5386
+ pendingEntries.add(entryStream);
5387
+ getData();
5388
+ }
5389
+ const { done, value } = await dataReader.read();
5390
+ if (done) {
5391
+ controller.close();
5392
+ } else {
5393
+ controller.enqueue(value);
5394
+ }
5395
+ },
5396
+ cancel: reason => entryStream.cancel(reason)
5397
+ }, { highWaterMark: 0 });
5398
+ return entryStream;
5399
+
5400
+ async function getData() {
5401
+ try {
5402
+ await entry.getData(writable, { preventClose: false });
5403
+ } catch (error) {
5404
+ try {
5405
+ await writable.abort(error);
5406
+ } catch {
5407
+ // ignored
5408
+ }
5409
+ } finally {
5410
+ pendingEntries.delete(entryStream);
5411
+ }
5412
+ }
5413
+ }
5414
+
5233
5415
  async function isZipFile(reader, options = {}) {
5234
5416
  reader = new GenericReader(reader);
5235
5417
  await initStream(reader);
@@ -5289,7 +5471,9 @@
5289
5471
  const dataView = getDataView(dataArray);
5290
5472
  let password = getOptionValue$1(zipEntry, options, OPTION_PASSWORD);
5291
5473
  let rawPassword = getOptionValue$1(zipEntry, options, OPTION_RAW_PASSWORD);
5292
- const passThrough = getOptionValue$1(zipEntry, options, OPTION_PASS_THROUGH);
5474
+ const passThrough = checkPassThroughOption(getOptionValue$1(zipEntry, options, OPTION_PASS_THROUGH));
5475
+ const passThroughCompression = Boolean(passThrough);
5476
+ const passThroughEncryption = passThrough === true;
5293
5477
  checkPasswordOption(password, rawPassword);
5294
5478
  password = password && password.length && password;
5295
5479
  rawPassword = rawPassword && rawPassword.length && rawPassword;
@@ -5310,7 +5494,9 @@
5310
5494
  const checkLocalDirectoryOption = getOptionValue$1(zipEntry, options, OPTION_CHECK_LOCAL_DIRECTORY);
5311
5495
  const entryStrictness = getStrictness(options, zipEntry.options);
5312
5496
  const checkLocalDirectory = getCheckLocalDirectory(checkLocalDirectoryOption, entryStrictness);
5313
- const checkLocalFilename = getCheckLocalFilename(checkLocalDirectoryOption, entryStrictness);
5497
+ const checkLocalFilenameOption = getOptionValue$1(zipEntry, options, OPTION_CHECK_LOCAL_FILENAME);
5498
+ const checkLocalFilename = getCheckLocalFilename(
5499
+ checkLocalFilenameOption === UNDEFINED_VALUE ? checkLocalDirectoryOption : checkLocalFilenameOption, entryStrictness);
5314
5500
  let rawLocalFilename = EMPTY_UINT8_ARRAY;
5315
5501
  if (checkLocalFilename && (filenameLength || extraFieldLength)) {
5316
5502
  const trailingDataArray = await readUint8Array(reader, localHeaderOffset + HEADER_SIZE, filenameLength + extraFieldLength);
@@ -5341,16 +5527,17 @@
5341
5527
  if (gid !== UNDEFINED_VALUE && fileEntry.gid === UNDEFINED_VALUE) {
5342
5528
  fileEntry.gid = gid;
5343
5529
  }
5344
- const encrypted = zipEntry.encrypted && localDirectory.encrypted && !passThrough;
5530
+ const checkPasswordOnly = getOptionValue$1(zipEntry, options, OPTION_CHECK_PASSWORD_ONLY);
5531
+ const encrypted = zipEntry.encrypted && localDirectory.encrypted && (!passThroughEncryption || checkPasswordOnly);
5345
5532
  const zipCrypto = encrypted && !extraFieldAES;
5346
- if (!passThrough) {
5533
+ if (!passThroughEncryption) {
5347
5534
  fileEntry.zipCrypto = zipCrypto;
5348
5535
  }
5349
5536
  if (encrypted && (localDirectory.rawBitFlag & BITFLAG_STRONG_ENCRYPTION) == BITFLAG_STRONG_ENCRYPTION) {
5350
5537
  throw new Error(ERR_UNSUPPORTED_ENCRYPTION);
5351
5538
  }
5352
- const registeredCodec = passThrough ? UNDEFINED_VALUE : getRegisteredCodec(compressionMethod);
5353
- if (compressionMethod != COMPRESSION_METHOD_STORE && compressionMethod != COMPRESSION_METHOD_DEFLATE && compressionMethod != COMPRESSION_METHOD_DEFLATE_64 && !registeredCodec && !passThrough) {
5539
+ const registeredCodec = passThroughCompression ? UNDEFINED_VALUE : getRegisteredCodec(compressionMethod);
5540
+ if (compressionMethod != COMPRESSION_METHOD_STORE && compressionMethod != COMPRESSION_METHOD_DEFLATE && compressionMethod != COMPRESSION_METHOD_DEFLATE_64 && !registeredCodec && !passThroughCompression) {
5354
5541
  throw new Error(ERR_UNSUPPORTED_COMPRESSION);
5355
5542
  }
5356
5543
  if (encrypted) {
@@ -5366,15 +5553,17 @@
5366
5553
  const size = compressedSize;
5367
5554
  const readable = toCompatibleReadable(reader.createReadable({ offset: dataOffset, size }));
5368
5555
  const signal = checkSignalOption(getOptionValue$1(zipEntry, options, OPTION_SIGNAL));
5369
- const checkPasswordOnly = getOptionValue$1(zipEntry, options, OPTION_CHECK_PASSWORD_ONLY);
5556
+ throwIfAborted(signal);
5370
5557
  let checkOverlappingEntry = getOptionValue$1(zipEntry, options, OPTION_CHECK_OVERLAPPING_ENTRY);
5371
5558
  const checkOverlappingEntryOnly = getOptionValue$1(zipEntry, options, OPTION_CHECK_OVERLAPPING_ENTRY_ONLY);
5372
5559
  if (checkOverlappingEntryOnly) {
5373
5560
  checkOverlappingEntry = true;
5374
5561
  }
5375
5562
  const { onstart, onprogress, onend } = options;
5376
- const compressed = compressionMethod != COMPRESSION_METHOD_STORE && !passThrough;
5377
- const outputSize = passThrough ? compressedSize : uncompressedSize;
5563
+ const compressed = compressionMethod != COMPRESSION_METHOD_STORE && !passThroughCompression;
5564
+ const outputSize = passThroughCompression ?
5565
+ compressedSize - getEncryptionOverhead(encrypted, zipCrypto, extraFieldAES && extraFieldAES.strength) :
5566
+ uncompressedSize;
5378
5567
  const deflate64 = compressionMethod == COMPRESSION_METHOD_DEFLATE_64;
5379
5568
  let useCompressionStream = getOptionValue$1(zipEntry, options, OPTION_USE_COMPRESSION_STREAM);
5380
5569
  if (deflate64) {
@@ -5383,7 +5572,7 @@
5383
5572
  const checkCrc32Option = getOptionValue$1(zipEntry, options, OPTION_CHECK_CRC32);
5384
5573
  const checkCrc32 = (checkCrc32Option === UNDEFINED_VALUE ?
5385
5574
  getOptionValue$1(zipEntry, options, OPTION_CHECK_SIGNATURE) :
5386
- checkCrc32Option) && !passThrough &&
5575
+ checkCrc32Option) && !passThroughCompression &&
5387
5576
  (!encrypted || zipCrypto || (extraFieldAES && extraFieldAES.vendorVersion == VENDOR_VERSION_AE_1$1));
5388
5577
  const workerOptions = {
5389
5578
  options: {
@@ -5437,10 +5626,10 @@
5437
5626
  await initStream(writer, getDecodableOutputSize(outputSize, compressedSize, compressed));
5438
5627
  ({ writable } = writer);
5439
5628
  const { outputSize: writtenSize } = await runWorker({ readable, writable }, workerOptions);
5440
- writer.size += writtenSize;
5441
5629
  if (writtenSize != outputSize) {
5442
- throw new Error(ERR_INVALID_UNCOMPRESSED_SIZE);
5630
+ throw Object.assign(new Error(ERR_INVALID_UNCOMPRESSED_SIZE), { outputSize: writtenSize });
5443
5631
  }
5632
+ writer.size += writtenSize;
5444
5633
  }
5445
5634
  } catch (error) {
5446
5635
  if (error.outputSize !== UNDEFINED_VALUE) {
@@ -6106,7 +6295,7 @@
6106
6295
  if (checkLocalFilename && !maskedLocalDirectory &&
6107
6296
  (rawLocalFilename.length != rawFilename.length ||
6108
6297
  rawLocalFilename.some((byteValue, indexByte) => byteValue != rawFilename[indexByte]))) {
6109
- reportAmbiguity(reject, warnings, "mismatched local file header (filename)");
6298
+ reportAmbiguity(reject, warnings, WARNING_MISMATCHED_LOCAL_FILE_HEADER_FILENAME);
6110
6299
  }
6111
6300
  if ((localDirectory.rawBitFlag & BITFLAG_AMBIGUITY_MASK) != (zipEntry.rawBitFlag & BITFLAG_AMBIGUITY_MASK)) {
6112
6301
  reportAmbiguity(reject, warnings, WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG);
@@ -6131,16 +6320,6 @@
6131
6320
  }
6132
6321
  }
6133
6322
 
6134
- function addWarning(warnings, reason, filename) {
6135
- if (!warnings.some(warning => warning.reason == reason)) {
6136
- const warning = { reason };
6137
- if (filename !== UNDEFINED_VALUE) {
6138
- warning.filename = filename;
6139
- }
6140
- warnings.push(warning);
6141
- }
6142
- }
6143
-
6144
6323
  function throwAmbiguousArchive(reason) {
6145
6324
  const error = new Error(ERR_AMBIGUOUS_ARCHIVE);
6146
6325
  error.reason = reason;
@@ -6220,7 +6399,9 @@
6220
6399
  WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG: WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG,
6221
6400
  WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD: WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD,
6222
6401
  WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES: WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES,
6402
+ WARNING_MISMATCHED_LOCAL_FILE_HEADER_FILENAME: WARNING_MISMATCHED_LOCAL_FILE_HEADER_FILENAME,
6223
6403
  WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY: WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY,
6404
+ WARNING_MULTIPLE_END_OF_CENTRAL_DIRECTORY: WARNING_MULTIPLE_END_OF_CENTRAL_DIRECTORY,
6224
6405
  WARNING_PREPENDED_CENTRAL_DIRECTORY: WARNING_PREPENDED_CENTRAL_DIRECTORY,
6225
6406
  WARNING_PREPENDED_DATA: WARNING_PREPENDED_DATA,
6226
6407
  WARNING_TRAILING_CENTRAL_DIRECTORY_DATA: WARNING_TRAILING_CENTRAL_DIRECTORY_DATA,
@@ -6273,7 +6454,7 @@
6273
6454
  const ERR_INVALID_ENCRYPTION_STRENGTH = "The strength must equal 1, 2, or 3";
6274
6455
  const ERR_UNSUPPORTED_ENCRYPTION_USDZ = "Encryption is not supported in USDZ files";
6275
6456
  const ERR_UNSUPPORTED_SPLIT_USDZ = "Split zip files are not supported in USDZ files";
6276
- const ERR_UNSUPPORTED_ENCRYPTION_PASS_THROUGH = "Encryption is not supported when the 'passThrough' option is set";
6457
+ const ERR_UNSUPPORTED_ENCRYPTION_PASS_THROUGH = "Encryption is not supported when the 'passThrough' option is set to true (use 'compressed' instead)";
6277
6458
  const ERR_INVALID_EXTRAFIELD = "Invalid extra field (must be a Map)";
6278
6459
  const ERR_INVALID_EXTRAFIELD_TYPE = "Invalid extra field type (must be integer 0..65535)";
6279
6460
  const ERR_INVALID_EXTRAFIELD_DATA_TYPE = "Invalid extra field data (must be a Uint8Array)";
@@ -6285,6 +6466,7 @@
6285
6466
  const ERR_UNSUPPORTED_FORMAT = "Zip64 is not supported (set the 'zip64' option to 'true')";
6286
6467
  const ERR_UNDEFINED_UNCOMPRESSED_SIZE = "Undefined uncompressed size";
6287
6468
  const ERR_UNDEFINED_COMPRESSION_METHOD = "Undefined compression method";
6469
+ const ERR_UNDEFINED_CRC32 = "Undefined CRC32";
6288
6470
  const ERR_UNDETERMINED_SIZE = "Undetermined size";
6289
6471
  const ERR_UNDEFINED_READER = "Undefined reader";
6290
6472
  const ERR_INVALID_READER = "Invalid reader (must be a Reader instance, a ReadableStream instance, or an object with a 'readable' property)";
@@ -6298,14 +6480,21 @@
6298
6480
  const ERR_INVALID_MSDOS_DATA = "Invalid msdosAttributes (must be an object with boolean flags)";
6299
6481
  const ERR_INVALID_LEVEL = "Invalid level (must be integer 0..9)";
6300
6482
  const ERR_INVALID_SIGNATURE_DATA = "Signature data exceeds 64KB";
6483
+ const ERR_INVALID_ENTRY = "Invalid entry option (must be an entry returned by ZipReader#getEntries())";
6484
+ const ERR_ZIP_CRYPTO_LAST_MOD_DATE = "The last modification date of an entry encrypted with ZipCrypto cannot be changed when passThrough is set";
6485
+ const WARNING_COMPRESSION_UNAVAILABLE = "compression unavailable";
6486
+ const WARNING_CLAMPED_LAST_MODIFICATION_DATE = "clamped last modification date";
6301
6487
 
6302
6488
  const EXTRAFIELD_DATA_AES = new Uint8Array([0x07, 0x00, 0x02, 0x00, 0x41, 0x45, 0x03, 0x00, 0x00]);
6303
6489
  const EXTRAFIELD_OFFSET_AES_VENDOR_VERSION = 4;
6304
6490
  const EXTRAFIELD_OFFSET_AES_COMPRESSION_METHOD = 9;
6305
6491
  const EXTRAFIELD_USDZ_MAX_LENGTH = 67;
6492
+ const MIN_PRINTABLE_ASCII_CHARACTER_CODE = 0x20;
6493
+ const MAX_PRINTABLE_ASCII_CHARACTER_CODE = 0x7e;
6306
6494
  const VENDOR_VERSION_AE_1 = 1;
6307
- const INFOZIP_EXTRA_FIELD_TYPE$1 = "infozip";
6495
+ const INFOZIP_EXTRA_FIELD_TYPE = "infozip";
6308
6496
  const UNIX_EXTRA_FIELD_TYPE = "unix";
6497
+ const LEVEL_BY_BITFLAG_LEVEL = [8, 9, 5, 3];
6309
6498
  const MAX_LEVEL = 9;
6310
6499
 
6311
6500
  let workers = 0;
@@ -6332,9 +6521,11 @@
6332
6521
  initialOffset: options[OPTION_OFFSET] === UNDEFINED_VALUE ? 0 : options[OPTION_OFFSET] - (writer.size || writer.writable.size || 0),
6333
6522
  pendingAddFileCalls: new Set(),
6334
6523
  pendingErrors: [],
6524
+ warnings: [],
6335
6525
  bufferedWrites: 0,
6336
6526
  directWrites: 0,
6337
- lastFileEntry: UNDEFINED_VALUE
6527
+ lastFileEntry: UNDEFINED_VALUE,
6528
+ archiveClosed: false
6338
6529
  });
6339
6530
  }
6340
6531
 
@@ -6499,6 +6690,9 @@
6499
6690
  const zipWriter = this;
6500
6691
  const { pendingAddFileCalls, writer } = this;
6501
6692
  const { writable } = writer;
6693
+ if (zipWriter.archiveClosed) {
6694
+ return getWriterData(writer);
6695
+ }
6502
6696
  if (!(comment instanceof Uint8Array)) {
6503
6697
  throw new Error(ERR_INVALID_COMMENT_TYPE);
6504
6698
  }
@@ -6522,11 +6716,16 @@
6522
6716
  throw error;
6523
6717
  }
6524
6718
  await closeFile(zipWriter, comment, options);
6719
+ zipWriter.archiveClosed = true;
6525
6720
  const preventClose = !ownsWritable(writer) && getOptionValue(zipWriter, options, OPTION_PREVENT_CLOSE);
6526
6721
  if (!preventClose) {
6527
6722
  await writable.getWriter().close();
6528
6723
  }
6529
- return writer.getData ? writer.getData() : writable;
6724
+ return getWriterData(writer);
6725
+ }
6726
+
6727
+ [SYMBOL_ASYNC_DISPOSE]() {
6728
+ return this.close();
6530
6729
  }
6531
6730
  }
6532
6731
 
@@ -6605,6 +6804,10 @@
6605
6804
  }
6606
6805
  }
6607
6806
 
6807
+ function getWriterData(writer) {
6808
+ return writer.getData ? writer.getData() : writer.writable;
6809
+ }
6810
+
6608
6811
  function watchPromiseError(zipWriter, promise) {
6609
6812
  const watchedPromise = new WatchedPromise((resolve, reject) => Promise.prototype.then.call(promise, resolve, reject));
6610
6813
  const watcher = {};
@@ -6623,6 +6826,14 @@
6623
6826
 
6624
6827
  async function addFileEntry(zipWriter, name, reader, options) {
6625
6828
  options = Object.assign({}, options);
6829
+ const entry = options[OPTION_ENTRY];
6830
+ if (entry !== UNDEFINED_VALUE) {
6831
+ const { entryOptions, passThroughOptions } = getSourceEntryOptions(entry,
6832
+ checkPassThroughOption(getOptionValue(zipWriter, options, OPTION_PASS_THROUGH)),
6833
+ getOptionValue(zipWriter, options, PROPERTY_NAME_LAST_MODIFICATION_DATE));
6834
+ delete options[OPTION_ENTRY];
6835
+ options = Object.assign(entryOptions, passThroughOptions, options);
6836
+ }
6626
6837
  if (getOptionValue(zipWriter, options, PROPERTY_NAME_DIRECTORY) && !name.endsWith(DIRECTORY_SIGNATURE)) {
6627
6838
  name += DIRECTORY_SIGNATURE;
6628
6839
  }
@@ -6687,21 +6898,33 @@
6687
6898
  try {
6688
6899
  const { resolvedOptions } = metadataInfo;
6689
6900
  if (resolvedOptions.level != 0 && resolvedOptions.compressionMethod === UNDEFINED_VALUE &&
6690
- !resolvedOptions.passThrough && !(await supportsDeflate(getConfiguration()))) {
6901
+ !resolvedOptions.passThroughCompression && !(await supportsDeflate(getConfiguration()))) {
6691
6902
  resolvedOptions.level = 0;
6903
+ addWarning(zipWriter.warnings, WARNING_COMPRESSION_UNAVAILABLE, name);
6692
6904
  }
6693
6905
  const sizesInfo = await resolveSizes(zipWriter, reader, metadataInfo, options);
6694
6906
  ({ reader } = sizesInfo);
6695
6907
  const diskOffset = getDiskOffset(zipWriter.writer);
6696
6908
  const diskNumber = getDiskNumber(zipWriter.writer);
6909
+ let crc32 = options.crc32 === UNDEFINED_VALUE ? options[PROPERTY_NAME_SIGNATURE] : options.crc32;
6910
+ const storesAE2 = sizesInfo.resolvedOptions.encrypted && !resolvedOptions.zipCrypto;
6911
+ if (resolvedOptions.passThroughCompression && !resolvedOptions.passThroughEncryption && storesAE2) {
6912
+ crc32 = UNDEFINED_VALUE;
6913
+ }
6914
+ if (resolvedOptions.passThroughCompression && reader && !storesAE2 && crc32 === UNDEFINED_VALUE) {
6915
+ throw new Error(ERR_UNDEFINED_CRC32);
6916
+ }
6697
6917
  options = Object.assign({}, options, attributesInfo.resolvedOptions, metadataInfo.resolvedOptions, sizesInfo.resolvedOptions, {
6698
6918
  signature: options[PROPERTY_NAME_SIGNATURE],
6699
- crc32: options.crc32 === UNDEFINED_VALUE ? options[PROPERTY_NAME_SIGNATURE] : options.crc32,
6919
+ crc32,
6700
6920
  offset: zipWriter.offset - diskOffset,
6701
6921
  diskNumberStart: diskNumber,
6702
6922
  [OPTION_USDZ]: zipWriter.options[OPTION_USDZ]
6703
6923
  });
6704
6924
  const headerInfo = getHeaderInfo(options);
6925
+ if (headerInfo.lastModDateClamped) {
6926
+ addWarning(zipWriter.warnings, WARNING_CLAMPED_LAST_MODIFICATION_DATE, name);
6927
+ }
6705
6928
  const dataDescriptorInfo = getDataDescriptorInfo(options);
6706
6929
  const metadataSize = getLength(headerInfo.localHeaderArray, dataDescriptorInfo.dataDescriptorArray);
6707
6930
  fileEntry = await getFileEntry(zipWriter, name, reader, {
@@ -6728,6 +6951,95 @@
6728
6951
  return new Entry(fileEntry);
6729
6952
  }
6730
6953
 
6954
+ function getSourceEntryOptions(entry, passThrough, lastModDateOverride) {
6955
+ if (entry === null || typeof entry != OBJECT_TYPE || Array.isArray(entry)) {
6956
+ throw new Error(ERR_INVALID_ENTRY);
6957
+ }
6958
+ const {
6959
+ externalFileAttributes,
6960
+ versionMadeBy,
6961
+ comment,
6962
+ lastModDate,
6963
+ rawLastModDate,
6964
+ creationDate,
6965
+ lastAccessDate,
6966
+ uncompressedSize,
6967
+ encrypted,
6968
+ zipCrypto,
6969
+ crc32,
6970
+ compressionMethod,
6971
+ extraFieldAES,
6972
+ extraFieldUnix,
6973
+ internalFileAttributes,
6974
+ extraField,
6975
+ bitFlag,
6976
+ directory,
6977
+ uid,
6978
+ gid
6979
+ } = entry;
6980
+ const entryOptions = {
6981
+ externalFileAttributes,
6982
+ versionMadeBy,
6983
+ comment,
6984
+ lastModDate,
6985
+ creationDate,
6986
+ lastAccessDate,
6987
+ internalFileAttributes,
6988
+ directory
6989
+ };
6990
+ if (bitFlag && bitFlag.languageEncodingFlag) {
6991
+ entryOptions[OPTION_USE_UNICODE_FILE_NAMES] = true;
6992
+ }
6993
+ const userExtraField = getUserExtraField(extraField);
6994
+ if (userExtraField) {
6995
+ entryOptions[PROPERTY_NAME_EXTRA_FIELD] = userExtraField;
6996
+ }
6997
+ if (uid !== UNDEFINED_VALUE || gid !== UNDEFINED_VALUE) {
6998
+ Object.assign(entryOptions, {
6999
+ uid,
7000
+ gid,
7001
+ unixExtraFieldType: extraFieldUnix ? UNIX_EXTRA_FIELD_TYPE : INFOZIP_EXTRA_FIELD_TYPE
7002
+ });
7003
+ }
7004
+ const passThroughOptions = {};
7005
+ if (passThrough && !directory) {
7006
+ Object.assign(passThroughOptions, {
7007
+ uncompressedSize,
7008
+ crc32,
7009
+ compressionMethod
7010
+ });
7011
+ if (passThrough !== PASS_THROUGH_COMPRESSED) {
7012
+ Object.assign(passThroughOptions, {
7013
+ encrypted,
7014
+ zipCrypto,
7015
+ encryptionStrength: extraFieldAES ? extraFieldAES.strength : UNDEFINED_VALUE
7016
+ });
7017
+ }
7018
+ if (bitFlag) {
7019
+ passThroughOptions.dataDescriptor = bitFlag.dataDescriptor;
7020
+ passThroughOptions[OPTION_LEVEL] = LEVEL_BY_BITFLAG_LEVEL[bitFlag.level];
7021
+ }
7022
+ if (lastModDateOverride === UNDEFINED_VALUE) {
7023
+ passThroughOptions.rawLastModDate = rawLastModDate;
7024
+ } else if (passThrough !== PASS_THROUGH_COMPRESSED && zipCrypto && (!bitFlag || bitFlag.dataDescriptor) &&
7025
+ lastModDateOverride instanceof Date &&
7026
+ getDosTimeHighByte(lastModDateOverride) != ((rawLastModDate >>> 8) & MAX_8_BITS)) {
7027
+ throw new Error(ERR_ZIP_CRYPTO_LAST_MOD_DATE);
7028
+ }
7029
+ }
7030
+ return { entryOptions, passThroughOptions };
7031
+ }
7032
+
7033
+ function getDosTimeHighByte(lastModDate) {
7034
+ let dosLastModDate = new Date(Math.ceil(Math.floor(lastModDate.getTime() / 1000) / 2) * 2000);
7035
+ if (dosLastModDate < MIN_DATE) {
7036
+ dosLastModDate = MIN_DATE;
7037
+ } else if (dosLastModDate > MAX_DATE) {
7038
+ dosLastModDate = MAX_DATE;
7039
+ }
7040
+ return ((dosLastModDate.getHours() << 3) | (dosLastModDate.getMinutes() >> 3)) & MAX_8_BITS;
7041
+ }
7042
+
6731
7043
  function resolveAttributes(zipWriter, name, options) {
6732
7044
  let msDosCompatible = getOptionValue(zipWriter, options, PROPERTY_NAME_MS_DOS_COMPATIBLE);
6733
7045
  let versionMadeBy = getOptionValue(zipWriter, options, PROPERTY_NAME_VERSION_MADE_BY, msDosCompatible ? VERSION_MADE_BY_MSDOS : VERSION_MADE_BY_UNIX);
@@ -6742,7 +7054,7 @@
6742
7054
  checkIntegerOption(uid, MAX_32_BITS, ERR_INVALID_UID);
6743
7055
  checkIntegerOption(gid, MAX_32_BITS, ERR_INVALID_GID);
6744
7056
  checkIntegerOption(unixMode, MAX_16_BITS, ERR_INVALID_UNIX_MODE);
6745
- if (unixExtraFieldType !== UNDEFINED_VALUE && unixExtraFieldType !== INFOZIP_EXTRA_FIELD_TYPE$1 && unixExtraFieldType !== UNIX_EXTRA_FIELD_TYPE) {
7057
+ if (unixExtraFieldType !== UNDEFINED_VALUE && unixExtraFieldType !== INFOZIP_EXTRA_FIELD_TYPE && unixExtraFieldType !== UNIX_EXTRA_FIELD_TYPE) {
6746
7058
  throw new Error(ERR_INVALID_UNIX_EXTRA_FIELD_TYPE);
6747
7059
  }
6748
7060
  if (unixExtraFieldType === UNIX_EXTRA_FIELD_TYPE &&
@@ -6750,7 +7062,7 @@
6750
7062
  throw new Error(ERR_INVALID_UNIX_ID_SIZE);
6751
7063
  }
6752
7064
  if (unixExtraFieldType === UNDEFINED_VALUE && (uid !== UNDEFINED_VALUE || gid !== UNDEFINED_VALUE)) {
6753
- unixExtraFieldType = INFOZIP_EXTRA_FIELD_TYPE$1;
7065
+ unixExtraFieldType = INFOZIP_EXTRA_FIELD_TYPE;
6754
7066
  }
6755
7067
  let msdosAttributesRaw = getNumberOptionValue(zipWriter, options, PROPERTY_NAME_MSDOS_ATTRIBUTES_RAW);
6756
7068
  let msdosAttributes = getOptionValue(zipWriter, options, PROPERTY_NAME_MSDOS_ATTRIBUTES);
@@ -6881,7 +7193,9 @@
6881
7193
  const lastAccessDate = getDateOptionValue(zipWriter, options, PROPERTY_NAME_LAST_ACCESS_DATE);
6882
7194
  const creationDate = getDateOptionValue(zipWriter, options, PROPERTY_NAME_CREATION_DATE);
6883
7195
  const internalFileAttributes = getOptionValue(zipWriter, options, PROPERTY_NAME_INTERNAL_FILE_ATTRIBUTES, 0);
6884
- const passThrough = getOptionValue(zipWriter, options, OPTION_PASS_THROUGH);
7196
+ const passThrough = checkPassThroughOption(getOptionValue(zipWriter, options, OPTION_PASS_THROUGH));
7197
+ const passThroughCompression = Boolean(passThrough);
7198
+ const passThroughEncryption = passThrough === true;
6885
7199
  const password = getOptionValue(zipWriter, options, OPTION_PASSWORD);
6886
7200
  const rawPassword = getOptionValue(zipWriter, options, OPTION_RAW_PASSWORD);
6887
7201
  checkPasswordOption(password, rawPassword);
@@ -6896,10 +7210,12 @@
6896
7210
  const createTempStream = getFunctionOptionValue(zipWriter, options, OPTION_CREATE_TEMP_STREAM);
6897
7211
  const dataDescriptorSignature = getOptionValue(zipWriter, options, OPTION_DATA_DESCRIPTOR_SIGNATURE, true);
6898
7212
  const signal = checkSignalOption(getOptionValue(zipWriter, options, OPTION_SIGNAL));
6899
- const useUnicodeFileNames = getOptionValue(zipWriter, options, OPTION_USE_UNICODE_FILE_NAMES, true);
7213
+ throwIfAborted(signal);
7214
+ const useUnicodeFileNames = getOptionValue(zipWriter, options, OPTION_USE_UNICODE_FILE_NAMES,
7215
+ !isPrintableASCIIText(rawFilename) || !isPrintableASCIIText(rawComment));
6900
7216
  const compressionMethod = getOptionValue(zipWriter, options, PROPERTY_NAME_COMPRESSION_METHOD);
6901
- const registeredCodec = passThrough || compressionMethod === UNDEFINED_VALUE ? UNDEFINED_VALUE : getRegisteredCodec(compressionMethod);
6902
- if (!passThrough && compressionMethod !== UNDEFINED_VALUE &&
7217
+ const registeredCodec = passThroughCompression || compressionMethod === UNDEFINED_VALUE ? UNDEFINED_VALUE : getRegisteredCodec(compressionMethod);
7218
+ if (!passThroughCompression && compressionMethod !== UNDEFINED_VALUE &&
6903
7219
  compressionMethod !== COMPRESSION_METHOD_STORE && compressionMethod !== COMPRESSION_METHOD_DEFLATE && !registeredCodec) {
6904
7220
  throw new Error(ERR_UNSUPPORTED_COMPRESSION);
6905
7221
  }
@@ -6913,15 +7229,15 @@
6913
7229
  level = 0;
6914
7230
  }
6915
7231
  }
6916
- if (passThrough) {
6917
- level = UNDEFINED_VALUE;
7232
+ if (passThroughCompression) {
7233
+ level = toNumber(options[OPTION_LEVEL]);
6918
7234
  }
6919
7235
  let useCompressionStream = getOptionValue(zipWriter, options, OPTION_USE_COMPRESSION_STREAM);
6920
7236
  let dataDescriptor = getOptionValue(zipWriter, options, OPTION_DATA_DESCRIPTOR);
6921
7237
  if (bufferedWrite && dataDescriptor === UNDEFINED_VALUE) {
6922
7238
  dataDescriptor = false;
6923
7239
  }
6924
- if (dataDescriptor === UNDEFINED_VALUE || (zipCrypto && !passThrough)) {
7240
+ if (dataDescriptor === UNDEFINED_VALUE || (zipCrypto && !passThroughEncryption)) {
6925
7241
  dataDescriptor = true;
6926
7242
  }
6927
7243
  if (level !== UNDEFINED_VALUE && level != 6) {
@@ -6945,7 +7261,8 @@
6945
7261
  lastAccessDate,
6946
7262
  creationDate,
6947
7263
  internalFileAttributes,
6948
- passThrough,
7264
+ passThroughCompression,
7265
+ passThroughEncryption,
6949
7266
  password,
6950
7267
  rawPassword,
6951
7268
  encryptionStrength,
@@ -7006,7 +7323,7 @@
7006
7323
  }
7007
7324
 
7008
7325
  async function resolveSizes(zipWriter, reader, { resolvedOptions: metadata }, options) {
7009
- if (metadata.passThrough && !reader && !getOptionValue(zipWriter, options, PROPERTY_NAME_DIRECTORY)) {
7326
+ if (metadata.passThroughCompression && !reader && !getOptionValue(zipWriter, options, PROPERTY_NAME_DIRECTORY)) {
7010
7327
  throw new Error(ERR_UNDEFINED_READER);
7011
7328
  }
7012
7329
  let contentSize;
@@ -7022,12 +7339,12 @@
7022
7339
  }
7023
7340
 
7024
7341
  function resolveEntrySizes(zipWriter, hasContent, contentSize, metadata, options) {
7025
- const { passThrough, zipCrypto, password, rawPassword, encryptionStrength } = metadata;
7342
+ const { passThroughCompression, passThroughEncryption, zipCrypto, password, rawPassword, encryptionStrength } = metadata;
7026
7343
  let { dataDescriptor, zip64, level, compressionMethod } = metadata;
7027
7344
  let maximumCompressedSize = 0;
7028
7345
  let uncompressedSize = 0;
7029
7346
  let unknownSize = false;
7030
- if (passThrough && hasContent) {
7347
+ if (passThroughCompression && hasContent) {
7031
7348
  uncompressedSize = options[PROPERTY_NAME_UNCOMPRESSED_SIZE];
7032
7349
  if (uncompressedSize === UNDEFINED_VALUE) {
7033
7350
  throw new Error(ERR_UNDEFINED_UNCOMPRESSED_SIZE);
@@ -7038,17 +7355,17 @@
7038
7355
  }
7039
7356
  const zip64Enabled = zip64 === true;
7040
7357
  const encrypted = getOptionValue(zipWriter, options, PROPERTY_NAME_ENCRYPTED);
7041
- if (hasContent && passThrough && !encrypted && getLength(password, rawPassword)) {
7358
+ if (hasContent && passThroughEncryption && !encrypted && getLength(password, rawPassword)) {
7042
7359
  throw new Error(ERR_UNSUPPORTED_ENCRYPTION_PASS_THROUGH);
7043
7360
  }
7044
- const encryptedEntry = hasContent && (Boolean((password && getLength(password)) || (rawPassword && getLength(rawPassword))) || (passThrough && encrypted));
7361
+ const encryptedEntry = hasContent && (Boolean((password && getLength(password)) || (rawPassword && getLength(rawPassword))) || (passThroughEncryption && encrypted));
7045
7362
  if (!hasContent) {
7046
7363
  level = 0;
7047
7364
  compressionMethod = COMPRESSION_METHOD_STORE;
7048
7365
  }
7049
- const encryptionOverhead = encryptedEntry ? (zipCrypto ? 12 : 16 + encryptionStrength * 4) : 0;
7366
+ const encryptionOverhead = getEncryptionOverhead(encryptedEntry, zipCrypto, encryptionStrength);
7050
7367
  if (hasContent) {
7051
- if (!passThrough) {
7368
+ if (!passThroughCompression) {
7052
7369
  if (contentSize === UNDEFINED_VALUE) {
7053
7370
  dataDescriptor = true;
7054
7371
  if (zip64 || zip64 === UNDEFINED_VALUE) {
@@ -7061,10 +7378,12 @@
7061
7378
  }
7062
7379
  } else {
7063
7380
  options.uncompressedSize = uncompressedSize;
7064
- maximumCompressedSize = contentSize === UNDEFINED_VALUE ? getMaximumCompressedSize(uncompressedSize) + encryptionOverhead : contentSize;
7381
+ maximumCompressedSize = contentSize === UNDEFINED_VALUE ?
7382
+ getMaximumCompressedSize(uncompressedSize) + encryptionOverhead :
7383
+ contentSize + (passThroughEncryption ? 0 : encryptionOverhead);
7065
7384
  }
7066
7385
  }
7067
- const emptyEntry = !encryptedEntry && (!hasContent || (contentSize === 0 && !passThrough)) && !isCompressed(compressionMethod, level);
7386
+ const emptyEntry = !encryptedEntry && (!hasContent || (contentSize === 0 && !passThroughCompression)) && !isCompressed(compressionMethod, level);
7068
7387
  if (emptyEntry && !zipCrypto && getOptionValue(zipWriter, options, OPTION_DATA_DESCRIPTOR) === UNDEFINED_VALUE) {
7069
7388
  dataDescriptor = false;
7070
7389
  }
@@ -7113,6 +7432,8 @@
7113
7432
  const initialOffset = writerOptions[OPTION_OFFSET] === UNDEFINED_VALUE ? 0 : writerOptions[OPTION_OFFSET];
7114
7433
  let offset = initialOffset;
7115
7434
  let minimumEntrySize = INFINITY_VALUE;
7435
+ const entrySizes = [];
7436
+ const entriesAlreadyZip64 = new Set();
7116
7437
  for (const entry of entries) {
7117
7438
  let { name } = entry;
7118
7439
  const { size } = entry;
@@ -7124,7 +7445,7 @@
7124
7445
  ({ name } = attributesInfo);
7125
7446
  const { resolvedOptions: metadata } = resolveMetadata(zipWriter, name, options);
7126
7447
  if (metadata.level != 0 && metadata.compressionMethod === UNDEFINED_VALUE &&
7127
- !metadata.passThrough && !(await supportsDeflate(getConfiguration()))) {
7448
+ !metadata.passThroughCompression && !(await supportsDeflate(getConfiguration()))) {
7128
7449
  metadata.level = 0;
7129
7450
  }
7130
7451
  const hasContent = !getOptionValue(zipWriter, options, PROPERTY_NAME_DIRECTORY);
@@ -7132,7 +7453,7 @@
7132
7453
  throw new Error(ERR_UNDETERMINED_SIZE);
7133
7454
  }
7134
7455
  const { maximumCompressedSize, resolvedOptions: sizes } = resolveEntrySizes(zipWriter, hasContent, size, metadata, options);
7135
- if (hasContent && !metadata.passThrough && isCompressed(sizes.compressionMethod, sizes.level)) {
7456
+ if (hasContent && !metadata.passThroughCompression && isCompressed(sizes.compressionMethod, sizes.level)) {
7136
7457
  throw new Error(ERR_UNDETERMINED_SIZE);
7137
7458
  }
7138
7459
  const entryOptions = Object.assign({}, options, attributesInfo.resolvedOptions, metadata, sizes, { [OPTION_USDZ]: usdz });
@@ -7152,10 +7473,15 @@
7152
7473
  compressedSize
7153
7474
  }));
7154
7475
  const entrySize = entryInfo.metadataSize + compressedSize;
7476
+ entrySizes.push(entrySize);
7477
+ entriesAlreadyZip64.add(Boolean(entryOptions.zip64Enabled ||
7478
+ entryOptions.uncompressedSize >= MAX_32_BITS || compressedSize >= MAX_32_BITS));
7155
7479
  minimumEntrySize = Math.min(minimumEntrySize, entrySize);
7156
7480
  offset += entrySize;
7157
7481
  }
7158
- const layoutDependsOnWriteOrder = files.size > 1 && (usdz || offset - minimumEntrySize >= MAX_32_BITS);
7482
+ const layoutDependsOnWriteOrder = files.size > 1 && (usdz ||
7483
+ (offset - minimumEntrySize >= MAX_32_BITS &&
7484
+ (entriesAlreadyZip64.size > 1 || countEntriesBefore4GB(entrySizes, initialOffset, true) != countEntriesBefore4GB(entrySizes, initialOffset, false))));
7159
7485
  if (layoutDependsOnWriteOrder && !writeOrderGuaranteed) {
7160
7486
  throw new Error(ERR_UNDETERMINED_SIZE);
7161
7487
  }
@@ -7173,6 +7499,20 @@
7173
7499
  return offset - initialOffset + directoryDataLength + commentLength + (zip64 ? ZIP64_END_OF_CENTRAL_DIR_TOTAL_LENGTH : END_OF_CENTRAL_DIR_LENGTH);
7174
7500
  }
7175
7501
 
7502
+ function countEntriesBefore4GB(entrySizes, initialOffset, largestFirst) {
7503
+ const ordered = entrySizes.slice().sort((first, second) => largestFirst ? second - first : first - second);
7504
+ let position = initialOffset;
7505
+ let count = 0;
7506
+ for (const entrySize of ordered) {
7507
+ if (position >= MAX_32_BITS) {
7508
+ break;
7509
+ }
7510
+ position += entrySize;
7511
+ count++;
7512
+ }
7513
+ return count;
7514
+ }
7515
+
7176
7516
  async function getFileEntry(zipWriter, name, reader, entryInfo, options) {
7177
7517
  const {
7178
7518
  fileEntries,
@@ -7348,6 +7688,7 @@
7348
7688
  localExtraFieldZip64Length,
7349
7689
  rawExtraFieldExtendedTimestamp,
7350
7690
  extraFieldExtendedTimestampFlag,
7691
+ extraFieldExtendedTimestampTime,
7351
7692
  rawExtraFieldNTFS,
7352
7693
  rawExtraFieldUnix,
7353
7694
  rawExtraFieldAES,
@@ -7360,6 +7701,7 @@
7360
7701
  password,
7361
7702
  rawPassword,
7362
7703
  level,
7704
+ useUnicodeFileNames,
7363
7705
  zip64,
7364
7706
  zip64Enabled,
7365
7707
  zip64UncompressedSize,
@@ -7394,7 +7736,8 @@
7394
7736
  msdosAttributesRaw,
7395
7737
  msdosAttributes,
7396
7738
  useCompressionStream,
7397
- passThrough,
7739
+ passThroughCompression,
7740
+ passThroughEncryption,
7398
7741
  format,
7399
7742
  codecURI
7400
7743
  } = options;
@@ -7405,9 +7748,9 @@
7405
7748
  zip64Enabled,
7406
7749
  directory: Boolean(directory),
7407
7750
  executable: Boolean(executable),
7408
- filenameUTF8: true,
7751
+ filenameUTF8: Boolean(useUnicodeFileNames),
7409
7752
  rawFilename,
7410
- commentUTF8: true,
7753
+ commentUTF8: Boolean(useUnicodeFileNames),
7411
7754
  rawComment,
7412
7755
  rawExtraFieldZip64,
7413
7756
  localExtraFieldZip64Length,
@@ -7438,7 +7781,7 @@
7438
7781
  uncompressedSize
7439
7782
  } = options;
7440
7783
  let compressedSize = 0;
7441
- if (!passThrough) {
7784
+ if (!passThroughCompression) {
7442
7785
  uncompressedSize = 0;
7443
7786
  }
7444
7787
  const { writable } = writer;
@@ -7455,9 +7798,9 @@
7455
7798
  encryptionStrength,
7456
7799
  zipCrypto: encrypted && zipCrypto,
7457
7800
  passwordVerification: encrypted && zipCrypto && (rawLastModDate >> 8) & MAX_8_BITS,
7458
- computeCrc32: !passThrough,
7459
- compressed: compressed && !passThrough,
7460
- encrypted: encrypted && !passThrough,
7801
+ computeCrc32: !passThroughCompression,
7802
+ compressed: compressed && !passThroughCompression,
7803
+ encrypted: encrypted && !passThroughEncryption,
7461
7804
  useWebWorkers,
7462
7805
  useCompressionStream,
7463
7806
  transferStreams,
@@ -7472,7 +7815,7 @@
7472
7815
  const result = await runWorker({ readable, writable }, workerOptions);
7473
7816
  compressedSize = result.outputSize;
7474
7817
  writer.size += compressedSize;
7475
- if (!passThrough) {
7818
+ if (!passThroughCompression) {
7476
7819
  uncompressedSize = result.inputSize;
7477
7820
  if (!encrypted || zipCrypto) {
7478
7821
  crc32 = result.crc32;
@@ -7515,8 +7858,9 @@
7515
7858
  headerArray,
7516
7859
  headerView,
7517
7860
  signature: crc32,
7518
- crc32: encrypted && !zipCrypto && !passThrough ? UNDEFINED_VALUE : crc32,
7861
+ crc32: encrypted && !zipCrypto && !passThroughCompression ? UNDEFINED_VALUE : crc32,
7519
7862
  extraFieldExtendedTimestampFlag,
7863
+ extraFieldExtendedTimestampTime,
7520
7864
  zip64UncompressedSize,
7521
7865
  zip64CompressedSize
7522
7866
  });
@@ -7541,7 +7885,7 @@
7541
7885
  encryptionStrength,
7542
7886
  extendedTimestamp,
7543
7887
  ntfsTimestamp,
7544
- passThrough,
7888
+ passThroughCompression,
7545
7889
  encrypted,
7546
7890
  zip64UncompressedSize,
7547
7891
  zip64CompressedSize,
@@ -7552,7 +7896,7 @@
7552
7896
  let { version, compressionMethod } = options;
7553
7897
  const compressed = !directory && isCompressed(compressionMethod, level);
7554
7898
  let rawLocalExtraFieldZip64;
7555
- const uncompressedFile = passThrough || !compressed;
7899
+ const uncompressedFile = passThroughCompression || !compressed;
7556
7900
  const zip64ExtraFieldComplete = zip64 && (options.bufferedWrite || !dataDescriptor || ((!zip64UncompressedSize && !zip64CompressedSize) || (uncompressedFile && !unknownSize)));
7557
7901
  const writeLocalExtraFieldZip64 = zip64ExtraFieldComplete || (zip64 && dataDescriptor && (zip64UncompressedSize || zip64CompressedSize));
7558
7902
  if (zip64 && (zip64UncompressedSize || zip64CompressedSize)) {
@@ -7564,8 +7908,8 @@
7564
7908
  if (zip64ExtraFieldComplete) {
7565
7909
  extraFieldZip64.writeUint64(uncompressedSize);
7566
7910
  if (uncompressedFile) {
7567
- const encryptionOverhead = encrypted ? (zipCrypto ? 12 : 16 + encryptionStrength * 4) : 0;
7568
- extraFieldZip64.writeUint64(passThrough ? 0 : uncompressedSize + encryptionOverhead);
7911
+ const encryptionOverhead = getEncryptionOverhead(encrypted, zipCrypto, encryptionStrength);
7912
+ extraFieldZip64.writeUint64(passThroughCompression ? 0 : uncompressedSize + encryptionOverhead);
7569
7913
  }
7570
7914
  }
7571
7915
  } else {
@@ -7584,6 +7928,7 @@
7584
7928
  let rawExtraFieldNTFS;
7585
7929
  let rawExtraFieldExtendedTimestamp;
7586
7930
  let extraFieldExtendedTimestampFlag;
7931
+ let extraFieldExtendedTimestampTime;
7587
7932
  if (extendedTimestamp) {
7588
7933
  const lastModTimeUnix = getTimeUnix(lastModDate);
7589
7934
  const lastModTimeUnixInRange = inUnixTimeRange(lastModTimeUnix);
@@ -7591,6 +7936,7 @@
7591
7936
  const extraFieldTimestampLength = 9 + (lastAccessDate ? 4 : 0) + (creationDate ? 4 : 0);
7592
7937
  const extraFieldTimestamp = createRecordWriter(extraFieldTimestampLength);
7593
7938
  extraFieldExtendedTimestampFlag = 0x1 + (lastAccessDate ? 0x2 : 0) + (creationDate ? 0x4 : 0);
7939
+ extraFieldExtendedTimestampTime = lastModTimeUnix;
7594
7940
  extraFieldTimestamp.writeUint16(EXTRAFIELD_TYPE_EXTENDED_TIMESTAMP);
7595
7941
  extraFieldTimestamp.writeUint16(extraFieldTimestampLength - 4);
7596
7942
  extraFieldTimestamp.writeUint8(extraFieldExtendedTimestampFlag);
@@ -7633,7 +7979,7 @@
7633
7979
  let rawExtraFieldUnix;
7634
7980
  try {
7635
7981
  const { uid, gid, unixExtraFieldType } = options;
7636
- if (unixExtraFieldType == INFOZIP_EXTRA_FIELD_TYPE$1 && (uid !== UNDEFINED_VALUE || gid !== UNDEFINED_VALUE)) {
7982
+ if (unixExtraFieldType == INFOZIP_EXTRA_FIELD_TYPE && (uid !== UNDEFINED_VALUE || gid !== UNDEFINED_VALUE)) {
7637
7983
  const uidBytes = packUnixId(uid === UNDEFINED_VALUE ? 0 : uid);
7638
7984
  const gidBytes = packUnixId(gid === UNDEFINED_VALUE ? 0 : gid);
7639
7985
  const payloadLength = 3 + uidBytes.length + gidBytes.length;
@@ -7674,7 +8020,7 @@
7674
8020
  }
7675
8021
  if (encrypted && !zipCrypto) {
7676
8022
  version = version > VERSION_AES ? version : VERSION_AES;
7677
- if (passThrough && crc32 !== UNDEFINED_VALUE) {
8023
+ if (passThroughCompression && crc32 !== UNDEFINED_VALUE) {
7678
8024
  rawExtraFieldAES[EXTRAFIELD_OFFSET_AES_VENDOR_VERSION] = VENDOR_VERSION_AE_1;
7679
8025
  }
7680
8026
  setUint16(getDataView(rawExtraFieldAES), EXTRAFIELD_OFFSET_AES_COMPRESSION_METHOD, compressionMethod);
@@ -7736,12 +8082,14 @@
7736
8082
  headerArray,
7737
8083
  headerView,
7738
8084
  lastModDate: storedLastModDate,
8085
+ lastModDateClamped: storedLastModDate === clampedLastModDate && dosLastModDate.getTime() != clampedLastModDate.getTime(),
7739
8086
  rawLastModDate,
7740
8087
  encrypted,
7741
8088
  compressed,
7742
8089
  version,
7743
8090
  compressionMethod,
7744
8091
  extraFieldExtendedTimestampFlag,
8092
+ extraFieldExtendedTimestampTime,
7745
8093
  rawExtraFieldZip64: EMPTY_UINT8_ARRAY,
7746
8094
  localExtraFieldZip64Length,
7747
8095
  rawExtraFieldExtendedTimestamp,
@@ -7844,7 +8192,7 @@
7844
8192
  }, {
7845
8193
  zip64,
7846
8194
  zipCrypto,
7847
- passThrough,
8195
+ passThroughCompression,
7848
8196
  dataDescriptor
7849
8197
  }) {
7850
8198
  const {
@@ -7855,7 +8203,7 @@
7855
8203
  dataDescriptorView,
7856
8204
  dataDescriptorOffset
7857
8205
  } = dataDescriptorInfo;
7858
- if ((!encrypted || zipCrypto || passThrough) && crc32 !== UNDEFINED_VALUE) {
8206
+ if ((!encrypted || zipCrypto || passThroughCompression) && crc32 !== UNDEFINED_VALUE) {
7859
8207
  setUint32(headerView, HEADER_OFFSET_SIGNATURE, crc32);
7860
8208
  if (dataDescriptor) {
7861
8209
  setUint32(dataDescriptorView, dataDescriptorOffset, crc32);
@@ -7886,9 +8234,9 @@
7886
8234
  uncompressedSize,
7887
8235
  zip64UncompressedSize,
7888
8236
  zip64CompressedSize
7889
- }, localHeaderView, { dataDescriptor, passThrough }) {
8237
+ }, localHeaderView, { dataDescriptor, passThroughCompression }) {
7890
8238
  if (!dataDescriptor) {
7891
- if (!encrypted || (passThrough && crc32 !== UNDEFINED_VALUE)) {
8239
+ if (!encrypted || (passThroughCompression && crc32 !== UNDEFINED_VALUE)) {
7892
8240
  setUint32(localHeaderView, HEADER_OFFSET_SIGNATURE + LOCAL_HEADER_COMMON_OFFSET, crc32);
7893
8241
  }
7894
8242
  if (!zip64CompressedSize) {
@@ -7925,9 +8273,8 @@
7925
8273
  rawExtraFieldUnix,
7926
8274
  rawExtraField,
7927
8275
  rawCentralExtraField,
7928
- extendedTimestamp,
7929
8276
  extraFieldExtendedTimestampFlag,
7930
- lastModDate,
8277
+ extraFieldExtendedTimestampTime,
7931
8278
  zip64Enabled,
7932
8279
  uncompressedSize,
7933
8280
  compressedSize
@@ -7970,16 +8317,15 @@
7970
8317
  fileEntry.zip64Offset = zip64Offset;
7971
8318
  fileEntry.zip64DiskNumberStart = zip64DiskNumberStart;
7972
8319
  let rawExtraFieldTimestamp;
7973
- const lastModTimeUnix = getTimeUnix(lastModDate);
7974
- if (extendedTimestamp && inUnixTimeRange(lastModTimeUnix)) {
8320
+ if (extraFieldExtendedTimestampTime === UNDEFINED_VALUE) {
8321
+ rawExtraFieldTimestamp = EMPTY_UINT8_ARRAY;
8322
+ } else {
7975
8323
  const extraFieldTimestamp = createRecordWriter(9);
7976
8324
  extraFieldTimestamp.writeUint16(EXTRAFIELD_TYPE_EXTENDED_TIMESTAMP);
7977
8325
  extraFieldTimestamp.writeUint16(5);
7978
8326
  extraFieldTimestamp.writeUint8(extraFieldExtendedTimestampFlag);
7979
- extraFieldTimestamp.writeUint32(lastModTimeUnix);
8327
+ extraFieldTimestamp.writeUint32(extraFieldExtendedTimestampTime);
7980
8328
  rawExtraFieldTimestamp = extraFieldTimestamp.array;
7981
- } else {
7982
- rawExtraFieldTimestamp = EMPTY_UINT8_ARRAY;
7983
8329
  }
7984
8330
  fileEntry.rawExtraFieldExtendedTimestamp = rawExtraFieldTimestamp;
7985
8331
  const extraFieldLength = getLength(
@@ -8479,6 +8825,11 @@
8479
8825
  };
8480
8826
  }
8481
8827
 
8828
+ function isPrintableASCIIText(rawText) {
8829
+ return rawText.every(characterCode =>
8830
+ characterCode >= MIN_PRINTABLE_ASCII_CHARACTER_CODE && characterCode <= MAX_PRINTABLE_ASCII_CHARACTER_CODE);
8831
+ }
8832
+
8482
8833
  function getBitFlag(level, useUnicodeFileNames, dataDescriptor, encrypted, compressionMethod) {
8483
8834
  let bitFlag = 0;
8484
8835
  if (useUnicodeFileNames) {
@@ -8640,7 +8991,7 @@
8640
8991
  EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
8641
8992
  */
8642
8993
 
8643
- const VERSION = "2.11.3";
8994
+ const VERSION = "2.12.0";
8644
8995
 
8645
8996
  /*
8646
8997
  Copyright (c) 2025 Gildas Lormeau. All rights reserved.
@@ -9462,9 +9813,9 @@
9462
9813
  DecompressionStreamFallback: DecompressionStreamZlib
9463
9814
  });
9464
9815
 
9465
- function terminateWorkersAndModule() {
9816
+ async function terminateWorkersAndModule() {
9817
+ await terminateWorkers();
9466
9818
  modulePromise = null;
9467
- terminateWorkers();
9468
9819
  resetWasmModule();
9469
9820
  }
9470
9821
 
@@ -9531,7 +9882,10 @@
9531
9882
  const ERR_ENTRY_EXISTS = "Entry filename already exists";
9532
9883
  const ERR_DUPLICATE_IMPORTED_ENTRY = "Duplicate entry filename in the imported zip file";
9533
9884
  const ERR_INVALID_DUPLICATES = "Invalid duplicates option (must be \"throw\", \"keep-first\" or \"keep-last\")";
9534
- const ERR_ANCESTOR_ENTRY = "Entry is a ancestor of target entry";
9885
+ const ERR_ANCESTOR_ENTRY = "Entry is an ancestor of target entry";
9886
+ const ERR_ROOT_DIRECTORY_NOT_MOVABLE = "Root directory cannot be moved";
9887
+ const ERR_TARGET_NOT_DIRECTORY = "Target entry is not a directory";
9888
+ const ERR_PARENT_NOT_DIRECTORY = "Parent entry is not a directory";
9535
9889
  const ERR_READABLE_CONSUMED = "Readable stream already consumed";
9536
9890
  const DUPLICATES_THROW = "throw";
9537
9891
  const DUPLICATES_KEEP_FIRST = "keep-first";
@@ -9539,24 +9893,8 @@
9539
9893
  const DUPLICATES_VALUES = new Set([DUPLICATES_THROW, DUPLICATES_KEEP_FIRST, DUPLICATES_KEEP_LAST]);
9540
9894
  const ERR_INVALID_PASS_THROUGH = "Invalid passThrough option (use readerOptions.passThrough or set uncompressedSize for each entry)";
9541
9895
  const ERR_INVALID_READER_OPTIONS = "Invalid readerOptions (must be an object)";
9542
- const ERR_ZIP_CRYPTO_LAST_MOD_DATE = "The last modification date of an entry encrypted with ZipCrypto cannot be changed when passThrough is set";
9896
+ const ERR_UNSUPPORTED_PASS_THROUGH_VALUE = "The 'compressed' passThrough option is only supported by Entry#getData() and ZipWriter#add()";
9543
9897
  const ERR_ABORT_EXPORT = "zipjs-abort-export";
9544
- const ERR_ABORTED = "The operation was aborted";
9545
- const ABORT_ERROR_NAME = "AbortError";
9546
- const INFOZIP_EXTRA_FIELD_TYPE = "infozip";
9547
- const INTERPRETED_EXTRA_FIELD_TYPES = new Set([
9548
- EXTRAFIELD_TYPE_ZIP64,
9549
- EXTRAFIELD_TYPE_AES,
9550
- EXTRAFIELD_TYPE_NTFS,
9551
- EXTRAFIELD_TYPE_EXTENDED_TIMESTAMP,
9552
- EXTRAFIELD_TYPE_UNICODE_PATH,
9553
- EXTRAFIELD_TYPE_UNICODE_COMMENT,
9554
- EXTRAFIELD_TYPE_USDZ,
9555
- EXTRAFIELD_TYPE_INFOZIP,
9556
- EXTRAFIELD_TYPE_UNIX,
9557
- EXTRAFIELD_TYPE_UNIX_TYPE1,
9558
- EXTRAFIELD_TYPE_PKWARE_UNIX
9559
- ]);
9560
9898
 
9561
9899
  class ZipEntry {
9562
9900
 
@@ -9928,6 +10266,7 @@
9928
10266
  await initStream(reader);
9929
10267
  zipReader = new ZipReader(reader, options);
9930
10268
  }
10269
+ checkPassThroughValue(options.passThrough);
9931
10270
  const duplicates = checkDuplicatesOption(options.duplicates);
9932
10271
  const importedEntries = [];
9933
10272
  const entries = await zipReader.getEntries(options);
@@ -10018,18 +10357,25 @@
10018
10357
 
10019
10358
  async exportZip(writer, options = {}) {
10020
10359
  const zipEntry = this;
10360
+ const zipWriterProvided = Boolean(writer) && typeof writer.add == FUNCTION_TYPE;
10021
10361
  options = Object.assign({}, options);
10022
- if (options.bufferedWrite === UNDEFINED_VALUE) {
10362
+ if (!zipWriterProvided && options.bufferedWrite === UNDEFINED_VALUE) {
10023
10363
  options.bufferedWrite = true;
10024
10364
  }
10025
- const [readers] = await Promise.all([initReaders(zipEntry, checkReaderOptions(options.readerOptions)), initStream(writer)]);
10026
- const zipWriter = new ZipWriter(writer, options);
10365
+ const [readers] = await Promise.all([
10366
+ initReaders(zipEntry, checkReaderOptions(options.readerOptions)),
10367
+ zipWriterProvided ? UNDEFINED_VALUE : initStream(writer)
10368
+ ]);
10369
+ const zipWriter = zipWriterProvided ? writer : new ZipWriter(writer, options);
10027
10370
  await exportZip(zipWriter, zipEntry, getTotalSize([zipEntry], getUncompressedSize), options, readers);
10371
+ if (zipWriterProvided) {
10372
+ return zipWriter;
10373
+ }
10028
10374
  await zipWriter.close(options.globalComment);
10029
10375
  return writer.getData ? writer.getData() : writer.writable;
10030
10376
  }
10031
10377
 
10032
- getExportedSize(options = {}) {
10378
+ async getExportedSize(options = {}) {
10033
10379
  const zipEntry = this;
10034
10380
  options = Object.assign({}, options);
10035
10381
  checkReaderOptions(options.readerOptions);
@@ -10044,7 +10390,7 @@
10044
10390
  const writeOrderGuaranteed = !options.bufferedWrite ||
10045
10391
  (entries.every(entry => entry.options.keepOrder !== false) &&
10046
10392
  children.every(child => isImplicitDirectory(child) || !child.children.length));
10047
- return getEntriesSize(options, entries, writeOrderGuaranteed, options.globalComment);
10393
+ return await getEntriesSize(options, entries, writeOrderGuaranteed, options.globalComment);
10048
10394
  }
10049
10395
 
10050
10396
  getChildByName(name) {
@@ -10105,7 +10451,7 @@
10105
10451
 
10106
10452
  move(entry, destination) {
10107
10453
  if (entry == this.root) {
10108
- throw new Error("Root directory cannot be moved");
10454
+ throw new Error(ERR_ROOT_DIRECTORY_NOT_MOVABLE);
10109
10455
  } else {
10110
10456
  if (destination.directory) {
10111
10457
  if (!destination.isDescendantOf(entry)) {
@@ -10126,7 +10472,7 @@
10126
10472
  throw new Error(ERR_ANCESTOR_ENTRY);
10127
10473
  }
10128
10474
  } else {
10129
- throw new Error("Target entry is not a directory");
10475
+ throw new Error(ERR_TARGET_NOT_DIRECTORY);
10130
10476
  }
10131
10477
  }
10132
10478
  }
@@ -10439,70 +10785,11 @@
10439
10785
  let zipEntryMetadata = {};
10440
10786
  let passThroughOptions = {};
10441
10787
  if (child.data instanceof Entry) {
10442
- const {
10443
- externalFileAttributes,
10444
- versionMadeBy,
10445
- comment,
10446
- lastModDate,
10447
- rawLastModDate,
10448
- creationDate,
10449
- lastAccessDate,
10450
- uncompressedSize,
10451
- encrypted,
10452
- zipCrypto,
10453
- crc32,
10454
- compressionMethod,
10455
- extraFieldAES,
10456
- internalFileAttributes,
10457
- extraField,
10458
- bitFlag,
10459
- uid,
10460
- gid
10461
- } = child.data;
10462
- zipEntryMetadata = {
10463
- externalFileAttributes,
10464
- versionMadeBy,
10465
- comment,
10466
- lastModDate,
10467
- creationDate,
10468
- lastAccessDate,
10469
- internalFileAttributes
10470
- };
10471
- const userExtraField = getUserExtraField(extraField);
10472
- if (userExtraField) {
10473
- zipEntryMetadata.extraField = userExtraField;
10474
- }
10475
- if (uid !== UNDEFINED_VALUE || gid !== UNDEFINED_VALUE) {
10476
- Object.assign(zipEntryMetadata, {
10477
- uid,
10478
- gid,
10479
- unixExtraFieldType: INFOZIP_EXTRA_FIELD_TYPE
10480
- });
10481
- }
10482
- if (isPassThrough(child, options)) {
10483
- let encryptionStrength;
10484
- if (extraFieldAES) {
10485
- encryptionStrength = extraFieldAES.strength;
10486
- }
10487
- passThroughOptions = {
10488
- passThrough: true,
10489
- encrypted,
10490
- zipCrypto,
10491
- crc32,
10492
- uncompressedSize,
10493
- encryptionStrength,
10494
- compressionMethod
10495
- };
10496
- if (bitFlag) {
10497
- passThroughOptions.dataDescriptor = bitFlag.dataDescriptor;
10498
- }
10499
- const lastModDateOverride = childOptions.lastModDate === UNDEFINED_VALUE ? options.lastModDate : childOptions.lastModDate;
10500
- if (lastModDateOverride === UNDEFINED_VALUE) {
10501
- passThroughOptions.rawLastModDate = rawLastModDate;
10502
- } else if (zipCrypto && (!bitFlag || bitFlag.dataDescriptor) && lastModDateOverride instanceof Date &&
10503
- getDosTimeHighByte(lastModDateOverride) != ((rawLastModDate >>> 8) & MAX_8_BITS)) {
10504
- throw new Error(ERR_ZIP_CRYPTO_LAST_MOD_DATE);
10505
- }
10788
+ const passThrough = isPassThrough(child, options);
10789
+ const lastModDateOverride = childOptions.lastModDate === UNDEFINED_VALUE ? options.lastModDate : childOptions.lastModDate;
10790
+ ({ entryOptions: zipEntryMetadata, passThroughOptions } = getSourceEntryOptions(child.data, passThrough, lastModDateOverride));
10791
+ if (passThrough) {
10792
+ passThroughOptions.passThrough = true;
10506
10793
  }
10507
10794
  }
10508
10795
  const entryOptions = Object.assign({ lastModDate: child.defaultLastModDate }, zipEntryMetadata, options, childOptions, passThroughOptions, { directory: child.directory });
@@ -10512,16 +10799,6 @@
10512
10799
  return { name, entryOptions };
10513
10800
  }
10514
10801
 
10515
- function getDosTimeHighByte(lastModDate) {
10516
- let dosLastModDate = new Date(Math.ceil(Math.floor(lastModDate.getTime() / 1000) / 2) * 2000);
10517
- if (dosLastModDate < MIN_DATE) {
10518
- dosLastModDate = MIN_DATE;
10519
- } else if (dosLastModDate > MAX_DATE) {
10520
- dosLastModDate = MAX_DATE;
10521
- }
10522
- return ((dosLastModDate.getHours() << 3) | (dosLastModDate.getMinutes() >> 3)) & MAX_8_BITS;
10523
- }
10524
-
10525
10802
  function getDeterminedSize(child, passThrough) {
10526
10803
  const { reader } = child;
10527
10804
  if (reader && reader.size !== UNDEFINED_VALUE) {
@@ -10534,9 +10811,18 @@
10534
10811
  if (readerOptions && (typeof readerOptions != OBJECT_TYPE || Array.isArray(readerOptions))) {
10535
10812
  throw new Error(ERR_INVALID_READER_OPTIONS);
10536
10813
  }
10814
+ if (readerOptions) {
10815
+ checkPassThroughValue(readerOptions.passThrough);
10816
+ }
10537
10817
  return readerOptions;
10538
10818
  }
10539
10819
 
10820
+ function checkPassThroughValue(passThrough) {
10821
+ if (checkPassThroughOption(passThrough) === PASS_THROUGH_COMPRESSED) {
10822
+ throw new Error(ERR_UNSUPPORTED_PASS_THROUGH_VALUE);
10823
+ }
10824
+ }
10825
+
10540
10826
  function replaceContent(zipEntry, params) {
10541
10827
  const { uncompressedSize } = params;
10542
10828
  Object.assign(zipEntry, params, {
@@ -10565,20 +10851,6 @@
10565
10851
  return child.directory && child.data === null;
10566
10852
  }
10567
10853
 
10568
- function getUserExtraField(extraField) {
10569
- if (extraField) {
10570
- const userExtraField = new Map();
10571
- extraField.forEach((field, type) => {
10572
- if (!INTERPRETED_EXTRA_FIELD_TYPES.has(type)) {
10573
- userExtraField.set(type, field.data);
10574
- }
10575
- });
10576
- if (userExtraField.size) {
10577
- return userExtraField;
10578
- }
10579
- }
10580
- }
10581
-
10582
10854
  async function exportZip(zipWriter, entry, totalSize, options, readers) {
10583
10855
  const { onstart, onprogress, onend, onentryprogress } = options;
10584
10856
  const selectedEntry = entry;
@@ -10681,6 +10953,7 @@
10681
10953
 
10682
10954
  async function exportFileSystemHandle(zipEntry, directoryHandle, options) {
10683
10955
  const { onstart, onprogress, onend } = options;
10956
+ checkPassThroughValue(options.passThrough);
10684
10957
  const readerOptions = checkReaderOptions(options.readerOptions);
10685
10958
  const abortController = new AbortController();
10686
10959
  const { signal } = abortController;
@@ -10756,7 +11029,7 @@
10756
11029
  if (exportAborted || isExportAborted(signal.reason)) {
10757
11030
  return;
10758
11031
  }
10759
- throw signal.reason === UNDEFINED_VALUE ? new DOMException(ERR_ABORTED, ABORT_ERROR_NAME) : signal.reason;
11032
+ throwIfAborted(signal);
10760
11033
  }
10761
11034
  try {
10762
11035
  if (child.directory) {
@@ -10889,7 +11162,7 @@
10889
11162
  }
10890
11163
  return directory ? new ZipDirectoryEntry(parent.fs, name, params, parent) : new ZipFileEntry(parent.fs, name, params, parent);
10891
11164
  } else {
10892
- throw new Error("Parent entry is not a directory");
11165
+ throw new Error(ERR_PARENT_NOT_DIRECTORY);
10893
11166
  }
10894
11167
  }
10895
11168
 
@@ -11031,6 +11304,7 @@
11031
11304
  exports.Data64URIWriter = Data64URIWriter;
11032
11305
  exports.ERR_ABORTED = ERR_ABORTED;
11033
11306
  exports.ERR_AMBIGUOUS_ARCHIVE = ERR_AMBIGUOUS_ARCHIVE;
11307
+ exports.ERR_ANCESTOR_ENTRY = ERR_ANCESTOR_ENTRY;
11034
11308
  exports.ERR_BAD_FORMAT = ERR_BAD_FORMAT;
11035
11309
  exports.ERR_CENTRAL_DIRECTORY_NOT_FOUND = ERR_CENTRAL_DIRECTORY_NOT_FOUND;
11036
11310
  exports.ERR_DUPLICATED_NAME = ERR_DUPLICATED_NAME;
@@ -11044,7 +11318,9 @@
11044
11318
  exports.ERR_EXTRAFIELD_ZIP64_NOT_FOUND = ERR_EXTRAFIELD_ZIP64_NOT_FOUND;
11045
11319
  exports.ERR_HTTP_RANGE = ERR_HTTP_RANGE;
11046
11320
  exports.ERR_HTTP_RESOURCE_CHANGED = ERR_HTTP_RESOURCE_CHANGED;
11321
+ exports.ERR_HTTP_STATUS = ERR_HTTP_STATUS;
11047
11322
  exports.ERR_INVALID_AUTHENTICATION_CODE = ERR_INVALID_AUTHENTICATION_CODE;
11323
+ exports.ERR_INVALID_BASE_URI = ERR_INVALID_BASE_URI;
11048
11324
  exports.ERR_INVALID_CODEC_DEFINITION = ERR_INVALID_CODEC_DEFINITION;
11049
11325
  exports.ERR_INVALID_CODEC_MODULE = ERR_INVALID_CODEC_MODULE;
11050
11326
  exports.ERR_INVALID_COMMENT = ERR_INVALID_COMMENT;
@@ -11054,6 +11330,7 @@
11054
11330
  exports.ERR_INVALID_DATE = ERR_INVALID_DATE;
11055
11331
  exports.ERR_INVALID_DUPLICATES = ERR_INVALID_DUPLICATES;
11056
11332
  exports.ERR_INVALID_ENCRYPTION_STRENGTH = ERR_INVALID_ENCRYPTION_STRENGTH;
11333
+ exports.ERR_INVALID_ENTRY = ERR_INVALID_ENTRY;
11057
11334
  exports.ERR_INVALID_ENTRY_COMMENT = ERR_INVALID_ENTRY_COMMENT;
11058
11335
  exports.ERR_INVALID_ENTRY_COMMENT_TYPE = ERR_INVALID_ENTRY_COMMENT_TYPE;
11059
11336
  exports.ERR_INVALID_ENTRY_NAME = ERR_INVALID_ENTRY_NAME;
@@ -11072,6 +11349,7 @@
11072
11349
  exports.ERR_INVALID_PASSWORD = ERR_INVALID_PASSWORD;
11073
11350
  exports.ERR_INVALID_PASSWORD_TYPE = ERR_INVALID_PASSWORD_TYPE;
11074
11351
  exports.ERR_INVALID_PASS_THROUGH = ERR_INVALID_PASS_THROUGH;
11352
+ exports.ERR_INVALID_PASS_THROUGH_VALUE = ERR_INVALID_PASS_THROUGH_VALUE;
11075
11353
  exports.ERR_INVALID_READER = ERR_INVALID_READER;
11076
11354
  exports.ERR_INVALID_READER_OPTIONS = ERR_INVALID_READER_OPTIONS;
11077
11355
  exports.ERR_INVALID_SIGNAL = ERR_INVALID_SIGNAL;
@@ -11082,14 +11360,19 @@
11082
11360
  exports.ERR_INVALID_UNIX_EXTRA_FIELD_TYPE = ERR_INVALID_UNIX_EXTRA_FIELD_TYPE;
11083
11361
  exports.ERR_INVALID_UNIX_ID_SIZE = ERR_INVALID_UNIX_ID_SIZE;
11084
11362
  exports.ERR_INVALID_UNIX_MODE = ERR_INVALID_UNIX_MODE;
11363
+ exports.ERR_INVALID_URI = ERR_INVALID_URI;
11085
11364
  exports.ERR_INVALID_VERSION = ERR_INVALID_VERSION;
11086
11365
  exports.ERR_ITERATOR_COMPLETED_TOO_SOON = ERR_ITERATOR_COMPLETED_TOO_SOON;
11087
11366
  exports.ERR_LOCAL_FILE_HEADER_NOT_FOUND = ERR_LOCAL_FILE_HEADER_NOT_FOUND;
11088
11367
  exports.ERR_OVERLAPPING_ENTRY = ERR_OVERLAPPING_ENTRY;
11368
+ exports.ERR_PARENT_NOT_DIRECTORY = ERR_PARENT_NOT_DIRECTORY;
11089
11369
  exports.ERR_READABLE_CONSUMED = ERR_READABLE_CONSUMED;
11090
11370
  exports.ERR_RESERVED_COMPRESSION_METHOD = ERR_RESERVED_COMPRESSION_METHOD;
11371
+ exports.ERR_ROOT_DIRECTORY_NOT_MOVABLE = ERR_ROOT_DIRECTORY_NOT_MOVABLE;
11091
11372
  exports.ERR_SPLIT_ZIP_FILE = ERR_SPLIT_ZIP_FILE;
11373
+ exports.ERR_TARGET_NOT_DIRECTORY = ERR_TARGET_NOT_DIRECTORY;
11092
11374
  exports.ERR_UNDEFINED_COMPRESSION_METHOD = ERR_UNDEFINED_COMPRESSION_METHOD;
11375
+ exports.ERR_UNDEFINED_CRC32 = ERR_UNDEFINED_CRC32;
11093
11376
  exports.ERR_UNDEFINED_READER = ERR_UNDEFINED_READER;
11094
11377
  exports.ERR_UNDEFINED_UNCOMPRESSED_SIZE = ERR_UNDEFINED_UNCOMPRESSED_SIZE;
11095
11378
  exports.ERR_UNDETERMINED_SIZE = ERR_UNDETERMINED_SIZE;
@@ -11101,10 +11384,12 @@
11101
11384
  exports.ERR_UNSUPPORTED_ENCRYPTION_PASS_THROUGH = ERR_UNSUPPORTED_ENCRYPTION_PASS_THROUGH;
11102
11385
  exports.ERR_UNSUPPORTED_ENCRYPTION_USDZ = ERR_UNSUPPORTED_ENCRYPTION_USDZ;
11103
11386
  exports.ERR_UNSUPPORTED_FORMAT = ERR_UNSUPPORTED_FORMAT;
11387
+ exports.ERR_UNSUPPORTED_PASS_THROUGH_VALUE = ERR_UNSUPPORTED_PASS_THROUGH_VALUE;
11104
11388
  exports.ERR_UNSUPPORTED_SPLIT_USDZ = ERR_UNSUPPORTED_SPLIT_USDZ;
11105
11389
  exports.ERR_UNSUPPORTED_UINT64 = ERR_UNSUPPORTED_UINT64;
11106
11390
  exports.ERR_WORKER_STARTUP_TIMEOUT = ERR_WORKER_STARTUP_TIMEOUT;
11107
11391
  exports.ERR_WRITER_NOT_INITIALIZED = ERR_WRITER_NOT_INITIALIZED;
11392
+ exports.ERR_WRITER_SIZE_NOT_WRITABLE = ERR_WRITER_SIZE_NOT_WRITABLE;
11108
11393
  exports.ERR_ZIP_CRYPTO_LAST_MOD_DATE = ERR_ZIP_CRYPTO_LAST_MOD_DATE;
11109
11394
  exports.ERR_ZIP_NOT_EMPTY = ERR_ZIP_NOT_EMPTY;
11110
11395
  exports.HttpRangeReader = HttpRangeReader;
@@ -11118,13 +11403,17 @@
11118
11403
  exports.Uint8ArrayWriter = Uint8ArrayWriter;
11119
11404
  exports.VERSION = VERSION;
11120
11405
  exports.WARNING_APPENDED_DATA = WARNING_APPENDED_DATA;
11406
+ exports.WARNING_CLAMPED_LAST_MODIFICATION_DATE = WARNING_CLAMPED_LAST_MODIFICATION_DATE;
11121
11407
  exports.WARNING_COMPRESSED_PATCHED_DATA = WARNING_COMPRESSED_PATCHED_DATA;
11408
+ exports.WARNING_COMPRESSION_UNAVAILABLE = WARNING_COMPRESSION_UNAVAILABLE;
11122
11409
  exports.WARNING_DUPLICATE_FILENAME = WARNING_DUPLICATE_FILENAME;
11123
11410
  exports.WARNING_MALFORMED_EXTRA_FIELD = WARNING_MALFORMED_EXTRA_FIELD;
11124
11411
  exports.WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG = WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG;
11125
11412
  exports.WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD = WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD;
11126
11413
  exports.WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES = WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES;
11414
+ exports.WARNING_MISMATCHED_LOCAL_FILE_HEADER_FILENAME = WARNING_MISMATCHED_LOCAL_FILE_HEADER_FILENAME;
11127
11415
  exports.WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY = WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY;
11416
+ exports.WARNING_MULTIPLE_END_OF_CENTRAL_DIRECTORY = WARNING_MULTIPLE_END_OF_CENTRAL_DIRECTORY;
11128
11417
  exports.WARNING_PREPENDED_CENTRAL_DIRECTORY = WARNING_PREPENDED_CENTRAL_DIRECTORY;
11129
11418
  exports.WARNING_PREPENDED_DATA = WARNING_PREPENDED_DATA;
11130
11419
  exports.WARNING_TRAILING_CENTRAL_DIRECTORY_DATA = WARNING_TRAILING_CENTRAL_DIRECTORY_DATA;