@zip.js/zip.js 2.8.25 → 2.8.28

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 (52) hide show
  1. package/README.md +2 -2
  2. package/deno.json +1 -1
  3. package/dist/zip-core.js +1050 -569
  4. package/dist/zip-core.min.js +1 -1
  5. package/dist/zip-fs-core.js +1146 -617
  6. package/dist/zip-fs-core.min.js +1 -1
  7. package/dist/zip-fs-native.js +1207 -627
  8. package/dist/zip-fs-native.min.js +1 -1
  9. package/dist/zip-fs.js +1279 -681
  10. package/dist/zip-fs.min.js +1 -1
  11. package/dist/zip-legacy.js +1051 -570
  12. package/dist/zip-legacy.min.js +1 -1
  13. package/dist/zip-module.wasm +0 -0
  14. package/dist/zip-native.js +1053 -572
  15. package/dist/zip-native.min.js +1 -1
  16. package/dist/zip-web-worker-native.js +1 -1
  17. package/dist/zip-web-worker.js +1 -1
  18. package/dist/zip.js +1125 -626
  19. package/dist/zip.min.js +1 -1
  20. package/eslint.config.mjs +6 -1
  21. package/index-native.cjs +1207 -627
  22. package/index-native.min.js +1 -1
  23. package/index.cjs +1279 -681
  24. package/index.d.ts +2451 -2355
  25. package/index.min.js +1 -1
  26. package/lib/core/codec-pool.js +39 -1
  27. package/lib/core/codec-worker.js +120 -34
  28. package/lib/core/configuration.js +3 -0
  29. package/lib/core/constants.js +6 -0
  30. package/lib/core/io.js +55 -25
  31. package/lib/core/options.js +2 -0
  32. package/lib/core/streams/aes-crypto-stream.js +12 -12
  33. package/lib/core/streams/codec-stream.js +11 -5
  34. package/lib/core/streams/codecs/sjcl.js +1 -33
  35. package/lib/core/streams/common-crypto.js +4 -4
  36. package/lib/core/streams/zip-crypto-stream.js +25 -15
  37. package/lib/core/streams/zip-entry-stream.js +35 -1
  38. package/lib/core/streams/zlib-js/zlib-streams.min.js +1 -1
  39. package/lib/core/streams/zlib-wasm/zlib-streams.js +73 -55
  40. package/lib/core/streams/zlib-wasm/zlib-streams.wasm +0 -0
  41. package/lib/core/util/decode-cp437.js +1 -1
  42. package/lib/core/util/decode-text.js +2 -1
  43. package/lib/core/web-worker-base.js +12 -4
  44. package/lib/core/web-worker-inline-native.js +1 -1
  45. package/lib/core/web-worker-inline-wasm.js +1 -1
  46. package/lib/core/zip-fs.js +154 -55
  47. package/lib/core/zip-reader.js +185 -67
  48. package/lib/core/zip-writer.js +613 -376
  49. package/lib/core/zlib-streams-inline.js +1 -1
  50. package/lib/zip-core-reader.js +3 -1
  51. package/lib/zip-core-writer.js +1 -0
  52. package/package.json +20 -6
package/index-native.cjs CHANGED
@@ -44,6 +44,7 @@ const CENTRAL_FILE_HEADER_SIGNATURE = 0x02014b50;
44
44
  const END_OF_CENTRAL_DIR_SIGNATURE = 0x06054b50;
45
45
  const ZIP64_END_OF_CENTRAL_DIR_SIGNATURE = 0x06064b50;
46
46
  const ZIP64_END_OF_CENTRAL_DIR_LOCATOR_SIGNATURE = 0x07064b50;
47
+ const CENTRAL_FILE_HEADER_LENGTH = 46;
47
48
  const END_OF_CENTRAL_DIR_LENGTH = 22;
48
49
  const ZIP64_END_OF_CENTRAL_DIR_LOCATOR_LENGTH = 20;
49
50
  const ZIP64_END_OF_CENTRAL_DIR_LENGTH = 56;
@@ -91,9 +92,11 @@ const VERSION_AES = 0x33;
91
92
  const DIRECTORY_SIGNATURE = "/";
92
93
 
93
94
  const HEADER_SIZE = 30;
95
+ const HEADER_OFFSET_VERSION = 0;
94
96
  const HEADER_OFFSET_SIGNATURE = 10;
95
97
  const HEADER_OFFSET_COMPRESSED_SIZE = 14;
96
98
  const HEADER_OFFSET_UNCOMPRESSED_SIZE = 18;
99
+ const LOCAL_HEADER_COMMON_OFFSET = 4;
97
100
 
98
101
  const MAX_DATE = new Date(2107, 11, 31);
99
102
  const MIN_DATE = new Date(1980, 0, 1);
@@ -148,6 +151,7 @@ const DEFAULT_CONFIGURATION = {
148
151
  chunkSize: 64 * 1024,
149
152
  maxWorkers,
150
153
  terminateWorkerTimeout: 5000,
154
+ workerStarvationTimeout: 5000,
151
155
  useWebWorkers: true,
152
156
  useCompressionStream: true,
153
157
  CompressionStream: typeof CompressionStream != UNDEFINED_TYPE && CompressionStream,
@@ -170,6 +174,7 @@ function configure(configuration) {
170
174
  chunkSize,
171
175
  maxWorkers,
172
176
  terminateWorkerTimeout,
177
+ workerStarvationTimeout,
173
178
  useCompressionStream,
174
179
  useWebWorkers,
175
180
  CompressionStream,
@@ -185,6 +190,7 @@ function configure(configuration) {
185
190
  setIfDefined("chunkSize", chunkSize);
186
191
  setIfDefined("maxWorkers", maxWorkers);
187
192
  setIfDefined("terminateWorkerTimeout", terminateWorkerTimeout);
193
+ setIfDefined("workerStarvationTimeout", workerStarvationTimeout);
188
194
  setIfDefined("useCompressionStream", useCompressionStream);
189
195
  setIfDefined("useWebWorkers", useWebWorkers);
190
196
  setIfDefined("CompressionStream", CompressionStream);
@@ -199,7 +205,7 @@ function setIfDefined(propertyName, propertyValue) {
199
205
  }
200
206
  }
201
207
 
202
- const A="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";function g$1(g){g({workerURI:g=>{const B="text/javascript",I=(g=>{g=(g=>{const B=(g=(g+"").replace(/[^A-Za-z0-9+/=]/g,"")).length,I=[];for(let C=0;B>C;C+=4){const B=A.indexOf(g[C])<<18|A.indexOf(g[C+1])<<12|(63&A.indexOf(g[C+2]))<<6|63&A.indexOf(g[C+3]);I.push(B>>16&255),"="!==g[C+2]&&I.push(B>>8&255),"="!==g[C+3]&&I.push(255&B);}return new Uint8Array(I)})(g);let B=new Uint8Array(1024),I=0;for(let A=0;A<g.length;){const E=g[A++];if(128&E){const Q=3+(127&E),Y=g[A++]<<8|g[A++],F=I-Y;C(I+Q);for(let A=0;Q>A;A++)B[I++]=B[F+A];}else {const Q=E;C(I+Q);for(let C=0;Q>C&&A<g.length;C++)B[I++]=g[A++];}}return (g=>{let B="";const I=g.length;let C=0;for(;I>C+2;C+=3){const I=g[C]<<16|g[C+1]<<8|g[C+2];B+=A[I>>18&63]+A[I>>12&63]+A[I>>6&63]+A[63&I];}const E=I-C;if(1===E){const I=g[C]<<16;B+=A[I>>18&63]+A[I>>12&63]+"==";}else if(2===E){const I=g[C]<<16|g[C+1]<<8;B+=A[I>>18&63]+A[I>>12&63]+A[I>>6&63]+"=";}return B})(new Uint8Array(B.buffer.slice(0,I)));function C(A){if(B.length<A){let g=2*B.length;for(;A>g;)g*=2;const C=new Uint8Array(g);C.set(B.subarray(0,I)),B=C;}}})("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");if(g){const A=atob(I),g=new Blob([A],{type:B});return URL.createObjectURL(g)}return "data:"+B+";base64,"+I}});}
208
+ const A="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";function g$1(g){g({workerURI:g=>{const B="text/javascript",I=(g=>{g=(g=>{const B=(g=(g+"").replace(/[^A-Za-z0-9+/=]/g,"")).length,I=[];for(let E=0;B>E;E+=4){const B=A.indexOf(g[E])<<18|A.indexOf(g[E+1])<<12|(63&A.indexOf(g[E+2]))<<6|63&A.indexOf(g[E+3]);I.push(B>>16&255),"="!==g[E+2]&&I.push(B>>8&255),"="!==g[E+3]&&I.push(255&B);}return new Uint8Array(I)})(g);let B=new Uint8Array(1024),I=0;for(let A=0;A<g.length;){const C=g[A++];if(128&C){const Q=3+(127&C),Y=g[A++]<<8|g[A++],F=I-Y;E(I+Q);for(let A=0;Q>A;A++)B[I++]=B[F+A];}else {const Q=C;E(I+Q);for(let E=0;Q>E&&A<g.length;E++)B[I++]=g[A++];}}return (g=>{let B="";const I=g.length;let E=0;for(;I>E+2;E+=3){const I=g[E]<<16|g[E+1]<<8|g[E+2];B+=A[I>>18&63]+A[I>>12&63]+A[I>>6&63]+A[63&I];}const C=I-E;if(1===C){const I=g[E]<<16;B+=A[I>>18&63]+A[I>>12&63]+"==";}else if(2===C){const I=g[E]<<16|g[E+1]<<8;B+=A[I>>18&63]+A[I>>12&63]+A[I>>6&63]+"=";}return B})(new Uint8Array(B.buffer.slice(0,I)));function E(A){if(B.length<A){let g=2*B.length;for(;A>g;)g*=2;const E=new Uint8Array(g);E.set(B.subarray(0,I)),B=E;}}})("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");if(g){const A=atob(I),g=new Blob([A],{type:B});return URL.createObjectURL(g)}return "data:"+B+";base64,"+I}});}
203
209
 
204
210
  /*
205
211
  Copyright (c) 2022 Gildas Lormeau. All rights reserved.
@@ -948,37 +954,6 @@ cipher.aes = class {
948
954
  }
949
955
  };
950
956
 
951
- /**
952
- * Random values
953
- * @namespace
954
- */
955
- const random = {
956
- /**
957
- * Generate random words with pure js, cryptographically not as strong & safe as native implementation.
958
- * @param {TypedArray} typedArray The array to fill.
959
- * @return {TypedArray} The random values.
960
- */
961
- getRandomValues(typedArray) {
962
- const words = new Uint32Array(typedArray.buffer);
963
- const r = (m_w) => {
964
- let m_z = 0x3ade68b1;
965
- const mask = 0xffffffff;
966
- return function () {
967
- m_z = (0x9069 * (m_z & 0xFFFF) + (m_z >> 0x10)) & mask;
968
- m_w = (0x4650 * (m_w & 0xFFFF) + (m_w >> 0x10)) & mask;
969
- const result = ((((m_z << 0x10) + m_w) & mask) / 0x100000000) + .5;
970
- return result * (Math.random() > .5 ? 1 : -1);
971
- };
972
- };
973
- for (let i = 0, rcache; i < typedArray.length; i += 4) {
974
- const _r = r((rcache || Math.random()) * 0x100000000);
975
- rcache = _r() * 0x3ade67b7;
976
- words[i / 4] = (_r() * 0x100000000) | 0;
977
- }
978
- return typedArray;
979
- }
980
- };
981
-
982
957
  /** @fileOverview CTR mode implementation.
983
958
  *
984
959
  * Special thanks to Roy Nicholson for pointing out a bug in our
@@ -1209,12 +1184,15 @@ const GET_RANDOM_VALUES_SUPPORTED = typeof crypto != UNDEFINED_TYPE && typeof cr
1209
1184
  const ERR_INVALID_PASSWORD = "Invalid password";
1210
1185
  const ERR_INVALID_SIGNATURE = "Invalid signature";
1211
1186
  const ERR_ABORT_CHECK_PASSWORD = "zipjs-abort-check-password";
1187
+ const ERR_UNSUPPORTED_CRYPTO_API = "Crypto API not supported";
1212
1188
 
1213
1189
  function getRandomValues(array) {
1214
1190
  if (GET_RANDOM_VALUES_SUPPORTED) {
1215
1191
  return crypto.getRandomValues(array);
1216
1192
  } else {
1217
- return random.getRandomValues(array);
1193
+ // all supported runtimes expose crypto.getRandomValues; failing hard beats
1194
+ // silently generating predictable encryption salts
1195
+ throw new Error(ERR_UNSUPPORTED_CRYPTO_API);
1218
1196
  }
1219
1197
  }
1220
1198
 
@@ -1273,13 +1251,12 @@ let DERIVE_BITS_SUPPORTED = CRYPTO_API_SUPPORTED && SUBTLE_API_SUPPORTED && type
1273
1251
 
1274
1252
  class AESDecryptionStream extends TransformStream {
1275
1253
 
1276
- constructor({ password, rawPassword, signed, encryptionStrength, checkPasswordOnly }) {
1254
+ constructor({ password, rawPassword, encryptionStrength, checkPasswordOnly }) {
1277
1255
  super({
1278
1256
  start() {
1279
1257
  Object.assign(this, {
1280
1258
  ready: new Promise(resolve => this.resolveReady = resolve),
1281
1259
  password: encodePassword(password, rawPassword),
1282
- signed,
1283
1260
  strength: encryptionStrength - 1,
1284
1261
  pending: new Uint8Array()
1285
1262
  });
@@ -1308,7 +1285,6 @@ class AESDecryptionStream extends TransformStream {
1308
1285
  },
1309
1286
  async flush(controller) {
1310
1287
  const {
1311
- signed,
1312
1288
  ctr,
1313
1289
  hmac,
1314
1290
  pending,
@@ -1325,13 +1301,15 @@ class AESDecryptionStream extends TransformStream {
1325
1301
  const decryptedChunk = ctr.update(encryptedChunk);
1326
1302
  decryptedChunkArray = fromBits(codecBytes, decryptedChunk);
1327
1303
  }
1328
- if (signed) {
1329
- const signature = subarray(fromBits(codecBytes, hmac.digest()), 0, SIGNATURE_LENGTH);
1330
- for (let indexSignature = 0; indexSignature < SIGNATURE_LENGTH; indexSignature++) {
1331
- if (signature[indexSignature] != originalSignature[indexSignature]) {
1332
- throw new Error(ERR_INVALID_SIGNATURE);
1333
- }
1334
- }
1304
+ const signature = subarray(fromBits(codecBytes, hmac.digest()), 0, SIGNATURE_LENGTH);
1305
+ // branch-free comparison: accumulate the differences instead of
1306
+ // short-circuiting on the first mismatching byte
1307
+ let invalidSignature = pending.length < SIGNATURE_LENGTH ? 1 : 0;
1308
+ for (let indexSignature = 0; indexSignature < SIGNATURE_LENGTH; indexSignature++) {
1309
+ invalidSignature |= signature[indexSignature] ^ originalSignature[indexSignature];
1310
+ }
1311
+ if (invalidSignature) {
1312
+ throw new Error(ERR_INVALID_SIGNATURE);
1335
1313
  }
1336
1314
  controller.enqueue(decryptedChunkArray);
1337
1315
  }
@@ -1403,11 +1381,11 @@ function append(aesCrypto, input, output, paddingStart, paddingEnd, verifySignat
1403
1381
  hmac,
1404
1382
  pending
1405
1383
  } = aesCrypto;
1406
- const inputLength = input.length - paddingEnd;
1407
1384
  if (pending.length) {
1408
1385
  input = concat(pending, input);
1409
- output = expand(output, inputLength - (inputLength % BLOCK_LENGTH));
1410
1386
  }
1387
+ const inputLength = input.length - paddingEnd;
1388
+ output = expand(output, paddingStart + (inputLength - (inputLength % BLOCK_LENGTH)));
1411
1389
  let offset;
1412
1390
  for (offset = 0; offset <= inputLength - BLOCK_LENGTH; offset += BLOCK_LENGTH) {
1413
1391
  const inputChunk = toBits(codecBytes, subarray(input, offset, offset + BLOCK_LENGTH));
@@ -1555,21 +1533,24 @@ const HEADER_LENGTH = 12;
1555
1533
 
1556
1534
  class ZipCryptoDecryptionStream extends TransformStream {
1557
1535
 
1558
- constructor({ password, passwordVerification, checkPasswordOnly }) {
1536
+ constructor({ password, rawPassword, passwordVerification, checkPasswordOnly }) {
1559
1537
  super({
1560
1538
  start() {
1561
1539
  Object.assign(this, {
1562
1540
  password,
1541
+ rawPassword,
1563
1542
  passwordVerification
1564
1543
  });
1565
- createKeys(this, password);
1544
+ createKeys(this, password, rawPassword);
1566
1545
  },
1567
1546
  transform(chunk, controller) {
1568
1547
  const zipCrypto = this;
1569
- if (zipCrypto.password) {
1548
+ if (zipCrypto.password || zipCrypto.rawPassword) {
1570
1549
  const decryptedHeader = decrypt(zipCrypto, chunk.subarray(0, HEADER_LENGTH));
1571
- zipCrypto.password = null;
1572
- if (decryptedHeader.at(-1) != zipCrypto.passwordVerification) {
1550
+ zipCrypto.password = zipCrypto.rawPassword = null;
1551
+ // verify the password with a branch-free comparison of the verification byte, mirroring
1552
+ // the constant-time AES HMAC signature check
1553
+ if ((decryptedHeader.at(-1) ^ zipCrypto.passwordVerification) != 0) {
1573
1554
  throw new Error(ERR_INVALID_PASSWORD);
1574
1555
  }
1575
1556
  chunk = chunk.subarray(HEADER_LENGTH);
@@ -1586,21 +1567,22 @@ class ZipCryptoDecryptionStream extends TransformStream {
1586
1567
 
1587
1568
  class ZipCryptoEncryptionStream extends TransformStream {
1588
1569
 
1589
- constructor({ password, passwordVerification }) {
1570
+ constructor({ password, rawPassword, passwordVerification }) {
1590
1571
  super({
1591
1572
  start() {
1592
1573
  Object.assign(this, {
1593
1574
  password,
1575
+ rawPassword,
1594
1576
  passwordVerification
1595
1577
  });
1596
- createKeys(this, password);
1578
+ createKeys(this, password, rawPassword);
1597
1579
  },
1598
1580
  transform(chunk, controller) {
1599
1581
  const zipCrypto = this;
1600
1582
  let output;
1601
1583
  let offset;
1602
- if (zipCrypto.password) {
1603
- zipCrypto.password = null;
1584
+ if (zipCrypto.password || zipCrypto.rawPassword) {
1585
+ zipCrypto.password = zipCrypto.rawPassword = null;
1604
1586
  const header = getRandomValues(new Uint8Array(HEADER_LENGTH));
1605
1587
  header[HEADER_LENGTH - 1] = zipCrypto.passwordVerification;
1606
1588
  output = new Uint8Array(chunk.length + header.length);
@@ -1635,25 +1617,31 @@ function encrypt(target, input) {
1635
1617
  return output;
1636
1618
  }
1637
1619
 
1638
- function createKeys(target, password) {
1620
+ function createKeys(target, password, rawPassword) {
1639
1621
  const keys = [0x12345678, 0x23456789, 0x34567890];
1640
1622
  Object.assign(target, {
1641
1623
  keys,
1642
1624
  crcKey0: new Crc32(keys[0]),
1643
1625
  crcKey2: new Crc32(keys[2])
1644
1626
  });
1645
- for (let index = 0; index < password.length; index++) {
1646
- updateKeys(target, password.charCodeAt(index));
1627
+ if (rawPassword) {
1628
+ for (let index = 0; index < rawPassword.length; index++) {
1629
+ updateKeys(target, rawPassword[index]);
1630
+ }
1631
+ } else {
1632
+ for (let index = 0; index < password.length; index++) {
1633
+ updateKeys(target, password.charCodeAt(index));
1634
+ }
1647
1635
  }
1648
1636
  }
1649
1637
 
1650
1638
  function updateKeys(target, byte) {
1651
- let [key0, key1, key2] = target.keys;
1639
+ let [, key1] = target.keys;
1652
1640
  target.crcKey0.append([byte]);
1653
- key0 = ~target.crcKey0.get();
1641
+ const key0 = ~target.crcKey0.get();
1654
1642
  key1 = getInt32(Math.imul(getInt32(key1 + getInt8(key0)), 134775813) + 1);
1655
1643
  target.crcKey2.append([key1 >>> 24]);
1656
- key2 = ~target.crcKey2.get();
1644
+ const key2 = ~target.crcKey2.get();
1657
1645
  target.keys = [key0, key1, key2];
1658
1646
  }
1659
1647
 
@@ -1700,6 +1688,7 @@ function getInt32(number) {
1700
1688
 
1701
1689
 
1702
1690
  const ERR_INVALID_UNCOMPRESSED_SIZE = "Invalid uncompressed size";
1691
+ const ERR_INVALID_COMPRESSED_DATA = "Invalid compressed data";
1703
1692
  const FORMAT_DEFLATE_RAW = "deflate-raw";
1704
1693
  const FORMAT_DEFLATE64_RAW = "deflate64-raw";
1705
1694
 
@@ -1756,6 +1745,7 @@ class InflateStream extends TransformStream {
1756
1745
  }
1757
1746
  if (compressed) {
1758
1747
  readable = pipeThroughCommpressionStream(readable, useCompressionStream, { chunkSize, deflate64 }, DecompressionStream, DecompressionStreamZlib, DecompressionStream);
1748
+ readable = mapInflateStreamError(readable);
1759
1749
  }
1760
1750
  if ((!encrypted || zipCrypto) && signed) {
1761
1751
  crc32Stream = new Crc32Stream();
@@ -1806,6 +1796,37 @@ function pipeThrough(readable, transformStream) {
1806
1796
  return readable.pipeThrough(transformStream);
1807
1797
  }
1808
1798
 
1799
+ // DecompressionStream implementations can fail with a message-less TypeError on malformed
1800
+ // input; give these errors an identifiable message (errors raised by the other stages of
1801
+ // the pipeline, e.g. ERR_INVALID_PASSWORD, always carry a message and pass through as-is)
1802
+ function mapInflateStreamError(readable) {
1803
+ const reader = readable.getReader();
1804
+ return new ReadableStream({
1805
+ async pull(controller) {
1806
+ let result;
1807
+ try {
1808
+ result = await reader.read();
1809
+ } catch (error) {
1810
+ if (error && error.message) {
1811
+ throw error;
1812
+ }
1813
+ const mappedError = new Error(ERR_INVALID_COMPRESSED_DATA);
1814
+ mappedError.cause = error;
1815
+ throw mappedError;
1816
+ }
1817
+ const { value, done } = result;
1818
+ if (done) {
1819
+ controller.close();
1820
+ } else {
1821
+ controller.enqueue(value);
1822
+ }
1823
+ },
1824
+ cancel(reason) {
1825
+ return reader.cancel(reason);
1826
+ }
1827
+ });
1828
+ }
1829
+
1809
1830
  /*
1810
1831
  Copyright (c) 2022 Gildas Lormeau. All rights reserved.
1811
1832
 
@@ -1835,6 +1856,7 @@ function pipeThrough(readable, transformStream) {
1835
1856
  */
1836
1857
 
1837
1858
 
1859
+ const DEFAULT_CHUNK_SIZE$1 = 64 * 1024;
1838
1860
  const MESSAGE_EVENT_TYPE = "message";
1839
1861
  const MESSAGE_START = "start";
1840
1862
  const MESSAGE_PULL = "pull";
@@ -1903,6 +1925,9 @@ class ChunkStream extends TransformStream {
1903
1925
 
1904
1926
  constructor(chunkSize) {
1905
1927
  let pendingChunk;
1928
+ if (!(chunkSize >= 1)) {
1929
+ chunkSize = DEFAULT_CHUNK_SIZE$1;
1930
+ }
1906
1931
  super({
1907
1932
  transform,
1908
1933
  flush(controller) {
@@ -1920,12 +1945,12 @@ class ChunkStream extends TransformStream {
1920
1945
  chunk = newChunk;
1921
1946
  pendingChunk = null;
1922
1947
  }
1923
- if (chunk.length > chunkSize) {
1924
- controller.enqueue(chunk.slice(0, chunkSize));
1925
- transform(chunk.slice(chunkSize), controller);
1926
- } else {
1927
- pendingChunk = chunk;
1948
+ let offset = 0;
1949
+ while (chunk.length - offset > chunkSize) {
1950
+ controller.enqueue(chunk.slice(offset, offset + chunkSize));
1951
+ offset += chunkSize;
1928
1952
  }
1953
+ pendingChunk = offset ? chunk.slice(offset) : chunk;
1929
1954
  }
1930
1955
  }
1931
1956
  }
@@ -1960,8 +1985,10 @@ class ChunkStream extends TransformStream {
1960
1985
 
1961
1986
 
1962
1987
  const MODULE_WORKER_OPTIONS = { type: "module" };
1988
+ const ERROR_EVENT_TYPE = "error";
1989
+ const MESSAGE_ERROR_EVENT_TYPE = "messageerror";
1963
1990
 
1964
- let webWorkerSupported, webWorkerURI, webWorkerOptions;
1991
+ let webWorkerSupported, webWorkerSource, webWorkerURI, webWorkerOptions;
1965
1992
  let transferStreamsSupported = true;
1966
1993
  try {
1967
1994
  transferStreamsSupported = typeof structuredClone == FUNCTION_TYPE && structuredClone(new DOMException("", "AbortError")).code !== UNDEFINED_VALUE;
@@ -1976,8 +2003,9 @@ class CodecWorker {
1976
2003
  const { signal } = streamOptions;
1977
2004
  Object.assign(workerData, {
1978
2005
  busy: true,
2006
+ generation: (workerData.generation || 0) + 1,
1979
2007
  readable: readable
1980
- .pipeThrough(new ChunkStream(config.chunkSize))
2008
+ .pipeThrough(new ChunkStream(getChunkSize(config)))
1981
2009
  .pipeThrough(new ProgressWatcherStream(streamOptions), { signal }),
1982
2010
  writable,
1983
2011
  options: Object.assign({}, options),
@@ -2000,15 +2028,17 @@ class CodecWorker {
2000
2028
  });
2001
2029
  },
2002
2030
  onTaskFinished() {
2003
- const { resolveTerminated } = workerData;
2004
- if (resolveTerminated) {
2005
- workerData.resolveTerminated = null;
2006
- workerData.terminated = true;
2007
- workerData.worker.terminate();
2008
- resolveTerminated();
2031
+ if (workerData.busy) {
2032
+ const { resolveTerminated } = workerData;
2033
+ if (resolveTerminated) {
2034
+ workerData.resolveTerminated = null;
2035
+ workerData.terminated = true;
2036
+ workerData.worker.terminate();
2037
+ resolveTerminated();
2038
+ }
2039
+ workerData.busy = false;
2040
+ onTaskFinished(workerData);
2009
2041
  }
2010
- workerData.busy = false;
2011
- onTaskFinished(workerData);
2012
2042
  }
2013
2043
  });
2014
2044
  if (webWorkerSupported === UNDEFINED_VALUE) {
@@ -2077,6 +2107,7 @@ function createWebWorkerInterface(workerData, config) {
2077
2107
  }
2078
2108
  Object.assign(workerData, {
2079
2109
  worker,
2110
+ terminated: false,
2080
2111
  interface: {
2081
2112
  run: () => runWebWorker(workerData, { chunkSize, wasmURI, baseURI })
2082
2113
  }
@@ -2131,37 +2162,85 @@ async function runWebWorker(workerData, config) {
2131
2162
  result
2132
2163
  });
2133
2164
  const { readable, options } = workerData;
2134
- const { writable, closed } = watchClosedStream(workerData.writable);
2135
- const streamsTransferred = sendMessage({
2136
- type: MESSAGE_START,
2137
- options,
2138
- config,
2139
- readable,
2140
- writable
2141
- }, workerData);
2165
+ const { writable, closed, abortPipe } = watchClosedStream(workerData.writable);
2166
+ let streamsTransferred;
2167
+ try {
2168
+ streamsTransferred = sendMessage({
2169
+ type: MESSAGE_START,
2170
+ options,
2171
+ config,
2172
+ readable,
2173
+ writable
2174
+ }, workerData);
2175
+ } catch (error) {
2176
+ abortPipe();
2177
+ try {
2178
+ await closed;
2179
+ } catch {
2180
+ // ignored
2181
+ }
2182
+ workerData.onTaskFinished();
2183
+ throw error;
2184
+ }
2142
2185
  if (!streamsTransferred) {
2143
2186
  Object.assign(workerData, {
2144
2187
  reader: readable.getReader(),
2145
2188
  writer: writable.getWriter()
2146
2189
  });
2147
2190
  }
2148
- const resultValue = await result;
2149
- if (!streamsTransferred) {
2150
- await writable.getWriter().close();
2191
+ try {
2192
+ const resultValue = await result;
2193
+ await closeWritable();
2194
+ await closed;
2195
+ return resultValue;
2196
+ } catch (error) {
2197
+ await closeWritable();
2198
+ // unblock the pipe watcher if the worker died before closing its end of the stream
2199
+ abortPipe();
2200
+ try {
2201
+ await closed;
2202
+ } catch {
2203
+ // ignored
2204
+ }
2205
+ throw error;
2206
+ }
2207
+
2208
+ async function closeWritable() {
2209
+ if (!streamsTransferred && !writable.locked) {
2210
+ try {
2211
+ await writable.getWriter().close();
2212
+ } catch {
2213
+ // ignored
2214
+ }
2215
+ }
2151
2216
  }
2152
- await closed;
2153
- return resultValue;
2154
2217
  }
2155
2218
 
2156
2219
  function watchClosedStream(writableSource) {
2220
+ const abortController = new AbortController();
2157
2221
  const { writable, readable } = new TransformStream();
2158
- const closed = readable.pipeTo(writableSource, { preventClose: true });
2159
- return { writable, closed };
2222
+ const closed = readable.pipeTo(writableSource, { preventClose: true, preventAbort: true, signal: abortController.signal });
2223
+ // the pipe can fail before `closed` is awaited (e.g. the destination write fails);
2224
+ // mark the rejection as handled so it cannot kill the process in the meantime
2225
+ closed.catch(() => { });
2226
+ return { writable, closed, abortPipe: () => abortController.abort() };
2227
+ }
2228
+
2229
+ function terminateWorker$1(workerData) {
2230
+ const { worker } = workerData;
2231
+ if (worker) {
2232
+ try {
2233
+ worker.terminate();
2234
+ } catch {
2235
+ // ignored
2236
+ }
2237
+ }
2238
+ workerData.interface = null;
2160
2239
  }
2161
2240
 
2162
2241
  function getWebWorker(url, baseURI, workerData, isModuleType, useBlobURI = true) {
2163
2242
  let worker, resolvedURI, resolvedOptions;
2164
- if (webWorkerURI === UNDEFINED_VALUE) {
2243
+ if (webWorkerURI === UNDEFINED_VALUE || webWorkerSource !== url) {
2165
2244
  // deno-lint-ignore valid-typeof
2166
2245
  const isFunctionURI = typeof url == FUNCTION_TYPE;
2167
2246
  if (isFunctionURI) {
@@ -2218,16 +2297,36 @@ function getWebWorker(url, baseURI, workerData, isModuleType, useBlobURI = true)
2218
2297
  }
2219
2298
  }
2220
2299
  }
2300
+ webWorkerSource = url;
2221
2301
  webWorkerURI = resolvedURI;
2222
2302
  webWorkerOptions = resolvedOptions;
2223
2303
  } else {
2224
2304
  worker = new Worker(webWorkerURI, webWorkerOptions);
2225
2305
  }
2226
2306
  worker.addEventListener(MESSAGE_EVENT_TYPE, event => onMessage(event, workerData));
2307
+ worker.addEventListener(ERROR_EVENT_TYPE, event => onWorkerError(event, workerData));
2308
+ worker.addEventListener(MESSAGE_ERROR_EVENT_TYPE, event => onWorkerError(event, workerData));
2227
2309
  return worker;
2228
2310
  }
2229
2311
 
2230
- function sendMessage(message, { worker, writer, onTaskFinished, transferStreams }) {
2312
+ function onWorkerError(event, workerData) {
2313
+ if (event.preventDefault) {
2314
+ event.preventDefault();
2315
+ }
2316
+ const { rejectResult, writer, onTaskFinished } = workerData;
2317
+ // the worker is unusable (e.g. its script failed to load); terminate it and
2318
+ // fail the current task instead of letting it hang forever
2319
+ terminateWorker$1(workerData);
2320
+ if (rejectResult) {
2321
+ rejectResult(event.error || new Error(event.message || ERROR_EVENT_TYPE));
2322
+ if (writer) {
2323
+ writer.releaseLock();
2324
+ }
2325
+ onTaskFinished();
2326
+ }
2327
+ }
2328
+
2329
+ function sendMessage(message, { worker, writer, transferStreams }) {
2231
2330
  try {
2232
2331
  const { value, readable, writable } = message;
2233
2332
  const transferables = [];
@@ -2261,14 +2360,16 @@ function sendMessage(message, { worker, writer, onTaskFinished, transferStreams
2261
2360
  if (writer) {
2262
2361
  writer.releaseLock();
2263
2362
  }
2264
- onTaskFinished();
2265
2363
  throw error;
2266
2364
  }
2267
2365
  }
2268
2366
 
2269
2367
  async function onMessage({ data }, workerData) {
2270
2368
  const { type, value, messageId, result, error } = data;
2271
- const { reader, writer, resolveResult, rejectResult, onTaskFinished } = workerData;
2369
+ const { reader, writer, resolveResult, rejectResult, onTaskFinished, generation } = workerData;
2370
+ // continuations below can settle after the worker slot has been reassigned to a new
2371
+ // task (e.g. a pending pull read failing late); they must not touch the new task
2372
+ const stale = () => workerData.generation != generation;
2272
2373
  try {
2273
2374
  if (error) {
2274
2375
  const { message, stack, code, name, outputSize } = error;
@@ -2278,23 +2379,32 @@ async function onMessage({ data }, workerData) {
2278
2379
  } else {
2279
2380
  if (type == MESSAGE_PULL) {
2280
2381
  const { value, done } = await reader.read();
2281
- sendMessage({ type: MESSAGE_DATA, value, done, messageId }, workerData);
2382
+ if (!stale()) {
2383
+ sendMessage({ type: MESSAGE_DATA, value, done, messageId }, workerData);
2384
+ }
2282
2385
  }
2283
2386
  if (type == MESSAGE_DATA) {
2284
2387
  await writer.ready;
2285
2388
  await writer.write(new Uint8Array(value));
2286
- sendMessage({ type: MESSAGE_ACK_DATA, messageId }, workerData);
2389
+ if (!stale()) {
2390
+ sendMessage({ type: MESSAGE_ACK_DATA, messageId }, workerData);
2391
+ }
2287
2392
  }
2288
2393
  if (type == MESSAGE_CLOSE) {
2289
2394
  close(null, result);
2290
2395
  }
2291
2396
  }
2292
2397
  } catch (error) {
2293
- sendMessage({ type: MESSAGE_CLOSE, messageId }, workerData);
2294
- close(error);
2398
+ if (!stale()) {
2399
+ terminateWorker$1(workerData);
2400
+ close(error);
2401
+ }
2295
2402
  }
2296
2403
 
2297
2404
  function close(error, result) {
2405
+ if (stale()) {
2406
+ return;
2407
+ }
2298
2408
  if (error) {
2299
2409
  rejectResult(error);
2300
2410
  } else {
@@ -2338,6 +2448,8 @@ async function onMessage({ data }, workerData) {
2338
2448
 
2339
2449
  let pool = [];
2340
2450
  const pendingRequests = [];
2451
+ let starvationTimeout;
2452
+ let starvationDelay;
2341
2453
 
2342
2454
  let indexWorker = 0;
2343
2455
 
@@ -2364,14 +2476,20 @@ async function runWorker(stream, workerOptions) {
2364
2476
  pool.push(workerData);
2365
2477
  return new CodecWorker(workerData, stream, workerOptions, onTaskFinished);
2366
2478
  } else {
2367
- return new Promise(resolve => pendingRequests.push({ resolve, stream, workerOptions }));
2479
+ return new Promise(resolve => {
2480
+ pendingRequests.push({ resolve, stream, workerOptions });
2481
+ starvationDelay = config.workerStarvationTimeout;
2482
+ armStarvationTimeout();
2483
+ });
2368
2484
  }
2369
2485
  }
2370
2486
 
2371
2487
  function onTaskFinished(workerData) {
2488
+ clearStarvationTimeout();
2372
2489
  if (pendingRequests.length) {
2373
2490
  const [{ resolve, stream, workerOptions }] = pendingRequests.splice(0, 1);
2374
2491
  resolve(new CodecWorker(workerData, stream, workerOptions, onTaskFinished));
2492
+ armStarvationTimeout();
2375
2493
  } else if (workerData.worker) {
2376
2494
  clearTerminateTimeout(workerData);
2377
2495
  terminateWorker(workerData, workerOptions);
@@ -2381,6 +2499,34 @@ async function runWorker(stream, workerOptions) {
2381
2499
  }
2382
2500
  }
2383
2501
 
2502
+ function armStarvationTimeout() {
2503
+ if (!starvationTimeout && pendingRequests.length && Number.isFinite(starvationDelay) && starvationDelay >= 0) {
2504
+ starvationTimeout = setTimeout(onWorkerStarvation, starvationDelay);
2505
+ }
2506
+ }
2507
+
2508
+ function clearStarvationTimeout() {
2509
+ if (starvationTimeout) {
2510
+ clearTimeout(starvationTimeout);
2511
+ starvationTimeout = null;
2512
+ }
2513
+ }
2514
+
2515
+ function onWorkerStarvation() {
2516
+ starvationTimeout = null;
2517
+ if (pendingRequests.length) {
2518
+ const [{ resolve, stream, workerOptions }] = pendingRequests.splice(0, 1);
2519
+ const inlineWorkerOptions = Object.assign({}, workerOptions, { useWebWorkers: false, workerURI: UNDEFINED_VALUE });
2520
+ resolve(new CodecWorker({}, stream, inlineWorkerOptions, onInlineTaskFinished));
2521
+ armStarvationTimeout();
2522
+ }
2523
+ }
2524
+
2525
+ function onInlineTaskFinished() {
2526
+ clearStarvationTimeout();
2527
+ armStarvationTimeout();
2528
+ }
2529
+
2384
2530
  function terminateWorker(workerData, workerOptions) {
2385
2531
  const { config } = workerOptions;
2386
2532
  const { terminateWorkerTimeout } = config;
@@ -2451,6 +2597,7 @@ const ERR_WRITER_NOT_INITIALIZED = "Writer not initialized";
2451
2597
 
2452
2598
  const CONTENT_TYPE_TEXT_PLAIN = "text/plain";
2453
2599
  const HTTP_HEADER_CONTENT_LENGTH = "Content-Length";
2600
+ const HTTP_HEADER_CONTENT_ENCODING = "Content-Encoding";
2454
2601
  const HTTP_HEADER_CONTENT_RANGE = "Content-Range";
2455
2602
  const HTTP_HEADER_ACCEPT_RANGES = "Accept-Ranges";
2456
2603
  const HTTP_HEADER_RANGE = "Range";
@@ -2575,7 +2722,7 @@ class Data64URIWriter extends Writer {
2575
2722
 
2576
2723
  writeUint8Array(array) {
2577
2724
  const writer = this;
2578
- let indexArray = 0;
2725
+ let indexArray;
2579
2726
  let dataString = writer.pending;
2580
2727
  const delta = writer.pending.length;
2581
2728
  writer.pending = "";
@@ -2585,12 +2732,10 @@ class Data64URIWriter extends Writer {
2585
2732
  for (; indexArray < array.length; indexArray++) {
2586
2733
  writer.pending += String.fromCharCode(array[indexArray]);
2587
2734
  }
2588
- if (dataString.length) {
2589
- if (dataString.length > 2) {
2590
- writer.data += btoa(dataString);
2591
- } else {
2592
- writer.pending += dataString;
2593
- }
2735
+ if (dataString.length > 2) {
2736
+ writer.data += btoa(dataString);
2737
+ } else {
2738
+ writer.pending = dataString + writer.pending;
2594
2739
  }
2595
2740
  }
2596
2741
 
@@ -2637,6 +2782,9 @@ class BlobWriter extends Stream {
2637
2782
  }
2638
2783
  });
2639
2784
  writer.blob = new Response(transformStream.readable, { headers }).blob();
2785
+ // mark early rejections (e.g. aborted pipe) as handled; awaiting getData() still
2786
+ // surfaces them
2787
+ writer.blob.catch(() => { });
2640
2788
  }
2641
2789
 
2642
2790
  getData() {
@@ -2721,7 +2869,8 @@ function createHttpReader(httpReader, url, options) {
2721
2869
  preventHeadRequest,
2722
2870
  useRangeHeader,
2723
2871
  forceRangeRequests,
2724
- combineSizeEocd
2872
+ combineSizeEocd,
2873
+ fetch
2725
2874
  } = options;
2726
2875
  options = Object.assign({}, options);
2727
2876
  delete options.preventHeadRequest;
@@ -2729,13 +2878,15 @@ function createHttpReader(httpReader, url, options) {
2729
2878
  delete options.forceRangeRequests;
2730
2879
  delete options.combineSizeEocd;
2731
2880
  delete options.useXHR;
2881
+ delete options.fetch;
2732
2882
  Object.assign(httpReader, {
2733
2883
  url,
2734
2884
  options,
2735
2885
  preventHeadRequest,
2736
2886
  useRangeHeader,
2737
2887
  forceRangeRequests,
2738
- combineSizeEocd
2888
+ combineSizeEocd,
2889
+ fetch
2739
2890
  });
2740
2891
  }
2741
2892
 
@@ -2754,7 +2905,10 @@ async function initHttpReader(httpReader, sendRequest, getRequestData) {
2754
2905
  throw new Error(ERR_HTTP_RANGE);
2755
2906
  } else {
2756
2907
  if (combineSizeEocd) {
2757
- httpReader.eocdCache = new Uint8Array(await response.arrayBuffer());
2908
+ const eocdCache = new Uint8Array(await response.arrayBuffer());
2909
+ if (response.status == 206 && eocdCache.length == END_OF_CENTRAL_DIR_LENGTH) {
2910
+ httpReader.eocdCache = eocdCache;
2911
+ }
2758
2912
  }
2759
2913
  let contentSize;
2760
2914
  const contentRangeHeader = response.headers.get(HTTP_HEADER_CONTENT_RANGE);
@@ -2800,7 +2954,18 @@ async function readUint8ArrayHttpReader(httpReader, index, length, sendRequest,
2800
2954
  if (response.status != 206) {
2801
2955
  throw new Error(ERR_HTTP_RANGE);
2802
2956
  }
2803
- return new Uint8Array(await response.arrayBuffer());
2957
+ const contentRangeHeader = response.headers.get(HTTP_HEADER_CONTENT_RANGE);
2958
+ if (contentRangeHeader) {
2959
+ const rangeStart = Number(contentRangeHeader.trim().split(/[\s-]+/)[1]);
2960
+ if (!Number.isNaN(rangeStart) && rangeStart != index) {
2961
+ throw new Error(ERR_HTTP_RANGE);
2962
+ }
2963
+ }
2964
+ const data = new Uint8Array(await response.arrayBuffer());
2965
+ if (data.length != length) {
2966
+ throw new Error(ERR_HTTP_RANGE);
2967
+ }
2968
+ return data;
2804
2969
  }
2805
2970
  } else {
2806
2971
  const { data } = httpReader;
@@ -2837,9 +3002,9 @@ async function getXMLHttpRequestData(httpReader) {
2837
3002
  async function getRequestData(httpReader, sendRequest) {
2838
3003
  const response = await sendRequest(HTTP_METHOD_GET, httpReader, getHeaders(httpReader));
2839
3004
  httpReader.data = new Uint8Array(await response.arrayBuffer());
2840
- if (!httpReader.size) {
2841
- httpReader.size = httpReader.data.length;
2842
- }
3005
+ // the downloaded content is authoritative, e.g. the Content-Length response header
3006
+ // of the HEAD request can be the encoded size when the content is compressed
3007
+ httpReader.size = httpReader.data.length;
2843
3008
  }
2844
3009
 
2845
3010
  async function getContentLength(httpReader, sendRequest, getRequestData) {
@@ -2848,7 +3013,7 @@ async function getContentLength(httpReader, sendRequest, getRequestData) {
2848
3013
  } else {
2849
3014
  const response = await sendRequest(HTTP_METHOD_HEAD, httpReader, getHeaders(httpReader));
2850
3015
  const contentLength = response.headers.get(HTTP_HEADER_CONTENT_LENGTH);
2851
- if (contentLength) {
3016
+ if (contentLength && !response.headers.get(HTTP_HEADER_CONTENT_ENCODING)) {
2852
3017
  httpReader.size = Number(contentLength);
2853
3018
  } else {
2854
3019
  await getRequestData(httpReader, httpReader.options);
@@ -2856,8 +3021,8 @@ async function getContentLength(httpReader, sendRequest, getRequestData) {
2856
3021
  }
2857
3022
  }
2858
3023
 
2859
- async function sendFetchRequest(method, { options, url }, headers) {
2860
- const response = await fetch(url, Object.assign({}, options, { method, headers }));
3024
+ async function sendFetchRequest(method, { fetch: fetchFunction = fetch, options, url }, headers) {
3025
+ const response = await fetchFunction(url, Object.assign({}, options, { method, headers }));
2861
3026
  if (response.status < 400) {
2862
3027
  return response;
2863
3028
  } else {
@@ -2903,7 +3068,8 @@ class HttpReader extends Reader {
2903
3068
  super();
2904
3069
  Object.assign(this, {
2905
3070
  url,
2906
- reader: options.useXHR ? new XHRReader(url, options) : new FetchReader(url, options)
3071
+ // an explicit fetch implementation takes precedence over useXHR
3072
+ reader: options.useXHR && !options.fetch ? new XHRReader(url, options) : new FetchReader(url, options)
2907
3073
  });
2908
3074
  }
2909
3075
 
@@ -2928,8 +3094,7 @@ class HttpReader extends Reader {
2928
3094
  class HttpRangeReader extends HttpReader {
2929
3095
 
2930
3096
  constructor(url, options = {}) {
2931
- options.useRangeHeader = true;
2932
- super(url, options);
3097
+ super(url, Object.assign({}, options, { useRangeHeader: true }));
2933
3098
  }
2934
3099
  }
2935
3100
 
@@ -3003,7 +3168,7 @@ class SplitDataReader extends Reader {
3003
3168
  reader.lastDiskNumber = 0;
3004
3169
  reader.lastDiskOffset = 0;
3005
3170
  await Promise.all(readers.map(async (diskReader, indexDiskReader) => {
3006
- await diskReader.init();
3171
+ await initStream(diskReader);
3007
3172
  if (indexDiskReader != readers.length - 1) {
3008
3173
  reader.lastDiskOffset += diskReader.size;
3009
3174
  }
@@ -3087,14 +3252,26 @@ class SplitDataWriter extends Stream {
3087
3252
  writer.diskOffset += diskSourceWriter.size;
3088
3253
  writer.diskNumber++;
3089
3254
  diskWriter = null;
3090
- await this.write(chunk.subarray(availableSize));
3255
+ // the next disk is not opened yet but its space is available; leaving a
3256
+ // stale value here would force a new disk for every subsequent write
3257
+ writer.availableSize = writer.maxSize;
3258
+ if (chunk.length > availableSize) {
3259
+ await this.write(chunk.subarray(availableSize));
3260
+ }
3091
3261
  } else {
3092
3262
  await writeChunk(chunk);
3093
3263
  }
3094
3264
  },
3095
3265
  async close() {
3096
- await diskWriter.ready;
3097
- await closeDisk();
3266
+ if (diskWriter) {
3267
+ await diskWriter.ready;
3268
+ await closeDisk();
3269
+ }
3270
+ },
3271
+ async abort(reason) {
3272
+ if (diskWriter) {
3273
+ await diskWriter.abort(reason);
3274
+ }
3098
3275
  }
3099
3276
  });
3100
3277
  Object.defineProperty(writer, PROPERTY_NAME_WRITABLE, {
@@ -3109,7 +3286,6 @@ class SplitDataWriter extends Stream {
3109
3286
  await diskWriter.ready;
3110
3287
  await diskWriter.write(chunk);
3111
3288
  diskSourceWriter.size += chunkLength;
3112
- writer.size += chunkLength;
3113
3289
  writer.availableSize -= chunkLength;
3114
3290
  }
3115
3291
  }
@@ -3209,7 +3385,7 @@ function readUint8Array(reader, offset, size, diskNumber) {
3209
3385
 
3210
3386
  /* global TextDecoder */
3211
3387
 
3212
- const CP437 = "\0☺☻♥♦♣♠•◘○◙♂♀♪♫☼►◄↕‼¶§▬↨↑↓→←∟↔▲▼ !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~⌂ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜ¢£¥₧ƒáíóúñѪº¿⌐¬½¼¡«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ ".split("");
3388
+ const CP437 = "\0☺☻♥♦♣♠•◘○◙♂♀♪♫☼►◄↕‼¶§▬↨↑↓→←∟↔▲▼ !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~⌂ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜ¢£¥₧ƒáíóúñѪº¿⌐¬½¼¡«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ ".split("");
3213
3389
  const VALID_CP437 = CP437.length == 256;
3214
3390
 
3215
3391
  function decodeCP437(stringValue) {
@@ -3257,7 +3433,8 @@ function decodeText(value, encoding) {
3257
3433
  if (encoding && encoding.trim().toLowerCase() == "cp437") {
3258
3434
  return decodeCP437(value);
3259
3435
  } else {
3260
- return new TextDecoder(encoding).decode(value);
3436
+ // ignoreBOM keeps a leading U+FEFF in filenames/comments instead of dropping it
3437
+ return new TextDecoder(encoding, { ignoreBOM: true }).decode(value);
3261
3438
  }
3262
3439
  }
3263
3440
 
@@ -3434,6 +3611,7 @@ const OPTION_SIGNAL = "signal";
3434
3611
  const OPTION_CHECK_PASSWORD_ONLY = "checkPasswordOnly";
3435
3612
  const OPTION_CHECK_OVERLAPPING_ENTRY_ONLY = "checkOverlappingEntryOnly";
3436
3613
  const OPTION_CHECK_OVERLAPPING_ENTRY = "checkOverlappingEntry";
3614
+ const OPTION_CHECK_AMBIGUITY = "checkAmbiguity";
3437
3615
  const OPTION_CHECK_SIGNATURE = "checkSignature";
3438
3616
  const OPTION_USE_WEB_WORKERS = "useWebWorkers";
3439
3617
  const OPTION_USE_COMPRESSION_STREAM = "useCompressionStream";
@@ -3491,12 +3669,16 @@ const ERR_LOCAL_FILE_HEADER_NOT_FOUND = "Local file header not found";
3491
3669
  const ERR_EXTRAFIELD_ZIP64_NOT_FOUND = "Zip64 extra field not found";
3492
3670
  const ERR_ENCRYPTED = "File contains encrypted entry";
3493
3671
  const ERR_UNSUPPORTED_ENCRYPTION = "Encryption method not supported";
3494
- const ERR_UNSUPPORTED_COMPRESSION = "Compression method not supported";
3672
+ const ERR_UNSUPPORTED_COMPRESSION$1 = "Compression method not supported";
3495
3673
  const ERR_SPLIT_ZIP_FILE = "Split zip file";
3496
3674
  const ERR_OVERLAPPING_ENTRY = "Overlapping entry found";
3675
+ const ERR_AMBIGUOUS_ARCHIVE = "Ambiguous archive";
3497
3676
  const CHARSET_UTF8 = "utf-8";
3498
3677
  const PROPERTY_NAME_UTF8_SUFFIX = "UTF8";
3499
3678
  const CHARSET_CP437 = "cp437";
3679
+ // bits of the general purpose flag that change how an entry is interpreted; the level bits (1-2) are excluded
3680
+ // because they are informative only
3681
+ const BITFLAG_AMBIGUITY_MASK = BITFLAG_ENCRYPTED | BITFLAG_DATA_DESCRIPTOR | BITFLAG_LANG_ENCODING_FLAG;
3500
3682
  const ZIP64_PROPERTIES = [
3501
3683
  [PROPERTY_NAME_UNCOMPRESSED_SIZE, MAX_32_BITS],
3502
3684
  [PROPERTY_NAME_COMPRESSED_SIZE, MAX_32_BITS],
@@ -3521,7 +3703,7 @@ class ZipReader {
3521
3703
  reader: new GenericReader(reader),
3522
3704
  options,
3523
3705
  config: getConfiguration(),
3524
- readRanges: []
3706
+ readRanges: new Map()
3525
3707
  });
3526
3708
  }
3527
3709
 
@@ -3554,21 +3736,30 @@ class ZipReader {
3554
3736
  const commentOffset = endOfDirectoryInfo.offset;
3555
3737
  const commentLength = getUint16(endOfDirectoryView, 20);
3556
3738
  const appendedDataOffset = commentOffset + END_OF_CENTRAL_DIR_LENGTH + commentLength;
3739
+ const checkAmbiguity = getOptionValue$1(zipReader, options, OPTION_CHECK_AMBIGUITY);
3740
+ if (checkAmbiguity && appendedDataOffset != reader.size) {
3741
+ throwAmbiguousArchive("appended data");
3742
+ }
3557
3743
  let lastDiskNumber = getUint16(endOfDirectoryView, 4);
3558
3744
  const expectedLastDiskNumber = reader.lastDiskNumber || 0;
3559
3745
  let diskNumber = getUint16(endOfDirectoryView, 6);
3560
- let filesLength = getUint16(endOfDirectoryView, 8);
3746
+ let filesLength = getUint16(endOfDirectoryView, 10);
3561
3747
  let prependedDataLength = 0;
3562
- let startOffset = 0;
3748
+ let startOffset;
3749
+ let zip64EndOfDirectory;
3563
3750
  if (directoryDataOffset == MAX_32_BITS || directoryDataLength == MAX_32_BITS || filesLength == MAX_16_BITS || diskNumber == MAX_16_BITS) {
3564
- const endOfDirectoryLocatorArray = await readUint8Array(reader, endOfDirectoryInfo.offset - ZIP64_END_OF_CENTRAL_DIR_LOCATOR_LENGTH, ZIP64_END_OF_CENTRAL_DIR_LOCATOR_LENGTH);
3751
+ const endOfDirectoryLocatorArray = endOfDirectoryInfo.offset >= ZIP64_END_OF_CENTRAL_DIR_LOCATOR_LENGTH ?
3752
+ await readUint8Array(reader, endOfDirectoryInfo.offset - ZIP64_END_OF_CENTRAL_DIR_LOCATOR_LENGTH, ZIP64_END_OF_CENTRAL_DIR_LOCATOR_LENGTH) :
3753
+ new Uint8Array();
3565
3754
  const endOfDirectoryLocatorView = getDataView$1(endOfDirectoryLocatorArray);
3566
- if (getUint32(endOfDirectoryLocatorView, 0) == ZIP64_END_OF_CENTRAL_DIR_LOCATOR_SIGNATURE) {
3755
+ if (endOfDirectoryLocatorArray.length == ZIP64_END_OF_CENTRAL_DIR_LOCATOR_LENGTH &&
3756
+ getUint32(endOfDirectoryLocatorView, 0) == ZIP64_END_OF_CENTRAL_DIR_LOCATOR_SIGNATURE) {
3567
3757
  directoryDataOffset = getBigUint64(endOfDirectoryLocatorView, 8);
3568
3758
  let endOfDirectoryArray = await readUint8Array(reader, directoryDataOffset, ZIP64_END_OF_CENTRAL_DIR_LENGTH, -1);
3569
3759
  let endOfDirectoryView = getDataView$1(endOfDirectoryArray);
3570
- const expectedDirectoryDataOffset = endOfDirectoryInfo.offset - ZIP64_END_OF_CENTRAL_DIR_LOCATOR_LENGTH - ZIP64_END_OF_CENTRAL_DIR_LENGTH;
3571
- if (getUint32(endOfDirectoryView, 0) != ZIP64_END_OF_CENTRAL_DIR_SIGNATURE && directoryDataOffset != expectedDirectoryDataOffset) {
3760
+ const expectedDirectoryDataOffset = endOfDirectoryInfo.offset - ZIP64_END_OF_CENTRAL_DIR_LOCATOR_LENGTH - ZIP64_END_OF_CENTRAL_DIR_LENGTH - (reader.lastDiskOffset || 0);
3761
+ if ((endOfDirectoryArray.length < ZIP64_END_OF_CENTRAL_DIR_LENGTH || getUint32(endOfDirectoryView, 0) != ZIP64_END_OF_CENTRAL_DIR_SIGNATURE) &&
3762
+ directoryDataOffset != expectedDirectoryDataOffset && expectedDirectoryDataOffset >= 0) {
3572
3763
  const originalDirectoryDataOffset = directoryDataOffset;
3573
3764
  directoryDataOffset = expectedDirectoryDataOffset;
3574
3765
  if (directoryDataOffset > originalDirectoryDataOffset) {
@@ -3577,24 +3768,36 @@ class ZipReader {
3577
3768
  endOfDirectoryArray = await readUint8Array(reader, directoryDataOffset, ZIP64_END_OF_CENTRAL_DIR_LENGTH, -1);
3578
3769
  endOfDirectoryView = getDataView$1(endOfDirectoryArray);
3579
3770
  }
3580
- if (getUint32(endOfDirectoryView, 0) != ZIP64_END_OF_CENTRAL_DIR_SIGNATURE) {
3771
+ if (endOfDirectoryArray.length < ZIP64_END_OF_CENTRAL_DIR_LENGTH || getUint32(endOfDirectoryView, 0) != ZIP64_END_OF_CENTRAL_DIR_SIGNATURE) {
3581
3772
  throw new Error(ERR_EOCDR_LOCATOR_ZIP64_NOT_FOUND);
3582
3773
  }
3774
+ zip64EndOfDirectory = true;
3583
3775
  if (lastDiskNumber == MAX_16_BITS) {
3584
3776
  lastDiskNumber = getUint32(endOfDirectoryView, 16);
3777
+ } else if (checkAmbiguity && lastDiskNumber != getUint32(endOfDirectoryView, 16)) {
3778
+ throwAmbiguousArchive("mismatched zip64 end of central directory record");
3585
3779
  }
3586
3780
  if (diskNumber == MAX_16_BITS) {
3587
3781
  diskNumber = getUint32(endOfDirectoryView, 20);
3782
+ } else if (checkAmbiguity && diskNumber != getUint32(endOfDirectoryView, 20)) {
3783
+ throwAmbiguousArchive("mismatched zip64 end of central directory record");
3588
3784
  }
3589
3785
  if (filesLength == MAX_16_BITS) {
3590
3786
  filesLength = getBigUint64(endOfDirectoryView, 32);
3787
+ } else if (checkAmbiguity && filesLength != getBigUint64(endOfDirectoryView, 32)) {
3788
+ throwAmbiguousArchive("mismatched zip64 end of central directory record");
3591
3789
  }
3592
3790
  if (directoryDataLength == MAX_32_BITS) {
3593
3791
  directoryDataLength = getBigUint64(endOfDirectoryView, 40);
3792
+ } else if (checkAmbiguity && directoryDataLength != getBigUint64(endOfDirectoryView, 40)) {
3793
+ throwAmbiguousArchive("mismatched zip64 end of central directory record");
3594
3794
  }
3595
- directoryDataOffset -= directoryDataLength;
3795
+ directoryDataOffset = getBigUint64(endOfDirectoryView, 48) + prependedDataLength;
3596
3796
  }
3597
3797
  }
3798
+ const declaredDirectoryDataLength = directoryDataLength;
3799
+ const centralDirectoryEndOffset = endOfDirectoryInfo.offset -
3800
+ (zip64EndOfDirectory ? ZIP64_END_OF_CENTRAL_DIR_LENGTH + ZIP64_END_OF_CENTRAL_DIR_LOCATOR_LENGTH : 0);
3598
3801
  if (directoryDataOffset >= reader.size) {
3599
3802
  prependedDataLength = reader.size - directoryDataOffset - directoryDataLength - END_OF_CENTRAL_DIR_LENGTH;
3600
3803
  directoryDataOffset = reader.size - directoryDataLength - END_OF_CENTRAL_DIR_LENGTH;
@@ -3609,8 +3812,11 @@ class ZipReader {
3609
3812
  let directoryArray = await readUint8Array(reader, directoryDataOffset, directoryDataLength, diskNumber);
3610
3813
  let directoryView = getDataView$1(directoryArray);
3611
3814
  if (directoryDataLength) {
3612
- const expectedDirectoryDataOffset = endOfDirectoryInfo.offset - directoryDataLength;
3613
- if (getUint32(directoryView, offset) != CENTRAL_FILE_HEADER_SIGNATURE && directoryDataOffset != expectedDirectoryDataOffset) {
3815
+ if (directoryArray.length < 4) {
3816
+ throw new Error(ERR_BAD_FORMAT);
3817
+ }
3818
+ const expectedDirectoryDataOffset = centralDirectoryEndOffset - directoryDataLength - (reader.lastDiskOffset || 0);
3819
+ if (getUint32(directoryView, offset) != CENTRAL_FILE_HEADER_SIGNATURE && directoryDataOffset != expectedDirectoryDataOffset && diskNumber == lastDiskNumber) {
3614
3820
  const originalDirectoryDataOffset = directoryDataOffset;
3615
3821
  directoryDataOffset = expectedDirectoryDataOffset;
3616
3822
  if (directoryDataOffset > originalDirectoryDataOffset) {
@@ -3620,8 +3826,8 @@ class ZipReader {
3620
3826
  directoryView = getDataView$1(directoryArray);
3621
3827
  }
3622
3828
  }
3623
- const expectedDirectoryDataLength = endOfDirectoryInfo.offset - directoryDataOffset - (reader.lastDiskOffset || 0);
3624
- if (directoryDataLength != expectedDirectoryDataLength && expectedDirectoryDataLength >= 0) {
3829
+ const expectedDirectoryDataLength = centralDirectoryEndOffset - directoryDataOffset - (reader.lastDiskOffset || 0);
3830
+ if (directoryDataLength != expectedDirectoryDataLength && expectedDirectoryDataLength >= 0 && diskNumber == lastDiskNumber) {
3625
3831
  directoryDataLength = expectedDirectoryDataLength;
3626
3832
  directoryArray = await readUint8Array(reader, directoryDataOffset, directoryDataLength, diskNumber);
3627
3833
  directoryView = getDataView$1(directoryArray);
@@ -3629,16 +3835,19 @@ class ZipReader {
3629
3835
  if (directoryDataOffset < 0 || directoryDataOffset >= reader.size) {
3630
3836
  throw new Error(ERR_BAD_FORMAT);
3631
3837
  }
3838
+ startOffset = directoryDataOffset;
3632
3839
  const filenameEncoding = getOptionValue$1(zipReader, options, OPTION_FILENAME_ENCODING);
3633
3840
  const commentEncoding = getOptionValue$1(zipReader, options, OPTION_COMMENT_ENCODING);
3841
+ const filenames = checkAmbiguity ? new Set() : UNDEFINED_VALUE;
3842
+ let duplicateFilename;
3634
3843
  for (let indexFile = 0; indexFile < filesLength; indexFile++) {
3635
3844
  const fileEntry = new ZipEntry$1(reader, config, zipReader.options);
3636
- if (getUint32(directoryView, offset) != CENTRAL_FILE_HEADER_SIGNATURE) {
3845
+ if (offset + CENTRAL_FILE_HEADER_LENGTH > directoryArray.length || getUint32(directoryView, offset) != CENTRAL_FILE_HEADER_SIGNATURE) {
3637
3846
  throw new Error(ERR_CENTRAL_DIRECTORY_NOT_FOUND);
3638
3847
  }
3639
3848
  readCommonHeader(fileEntry, directoryView, offset + 6);
3640
3849
  const languageEncodingFlag = Boolean(fileEntry.bitFlag.languageEncodingFlag);
3641
- const filenameOffset = offset + 46;
3850
+ const filenameOffset = offset + CENTRAL_FILE_HEADER_LENGTH;
3642
3851
  const extraFieldOffset = filenameOffset + fileEntry.filenameLength;
3643
3852
  const commentOffset = extraFieldOffset + fileEntry.extraFieldLength;
3644
3853
  const versionMadeBy = getUint16(directoryView, offset + 4);
@@ -3659,7 +3868,7 @@ class ZipReader {
3659
3868
  directory: Boolean(msdosAttributesRaw & FILE_ATTR_MSDOS_DIR_MASK),
3660
3869
  archive: Boolean(msdosAttributesRaw & FILE_ATTR_MSDOS_ARCHIVE_MASK)
3661
3870
  };
3662
- const offsetFileEntry = getUint32(directoryView, offset + 42) + prependedDataLength;
3871
+ const offsetFileEntry = getUint32(directoryView, offset + 42);
3663
3872
  const decode = getOptionValue$1(zipReader, options, OPTION_DECODE_TEXT) || decodeText;
3664
3873
  const rawFilenameEncoding = filenameUTF8 ? CHARSET_UTF8 : filenameEncoding || CHARSET_CP437;
3665
3874
  const rawCommentEncoding = commentUTF8 ? CHARSET_UTF8 : commentEncoding || CHARSET_CP437;
@@ -3672,6 +3881,7 @@ class ZipReader {
3672
3881
  comment = decodeText(rawComment, rawCommentEncoding);
3673
3882
  }
3674
3883
  Object.assign(fileEntry, {
3884
+ index: indexFile,
3675
3885
  versionMadeBy,
3676
3886
  msDosCompatible,
3677
3887
  compressedSize: 0,
@@ -3691,8 +3901,15 @@ class ZipReader {
3691
3901
  filename,
3692
3902
  comment
3693
3903
  });
3694
- startOffset = Math.max(offsetFileEntry, startOffset);
3695
3904
  readCommonFooter(fileEntry, fileEntry, directoryView, offset + 6);
3905
+ fileEntry.offset += prependedDataLength;
3906
+ startOffset = Math.min(fileEntry.offset, startOffset);
3907
+ if (checkAmbiguity) {
3908
+ if (filenames.has(fileEntry.filename)) {
3909
+ duplicateFilename = true;
3910
+ }
3911
+ filenames.add(fileEntry.filename);
3912
+ }
3696
3913
  const unixExternalUpper = (fileEntry.externalFileAttributes >> 16) & MAX_16_BITS;
3697
3914
  if (fileEntry.unixMode === UNDEFINED_VALUE && (unixExternalUpper & (FILE_ATTR_UNIX_DEFAULT_MASK | FILE_ATTR_UNIX_EXECUTABLE_MASK | FILE_ATTR_UNIX_TYPE_DIR)) != 0) {
3698
3915
  fileEntry.unixMode = unixExternalUpper;
@@ -3713,7 +3930,7 @@ class ZipReader {
3713
3930
  internalFileAttribute: fileEntry.internalFileAttributes,
3714
3931
  externalFileAttribute: fileEntry.externalFileAttributes,
3715
3932
  executable,
3716
- directory: modeIsDir || upperIsDir || (msDosCompatible && msdosAttributes.directory) || (filename.endsWith(DIRECTORY_SIGNATURE) && !fileEntry.uncompressedSize),
3933
+ directory: modeIsDir || upperIsDir || (msDosCompatible && msdosAttributes.directory) || (fileEntry.filename.endsWith(DIRECTORY_SIGNATURE) && !fileEntry.uncompressedSize),
3717
3934
  zipCrypto: fileEntry.encrypted && !fileEntry.extraFieldAES
3718
3935
  });
3719
3936
  const entry = new Entry(fileEntry);
@@ -3736,6 +3953,15 @@ class ZipReader {
3736
3953
  }
3737
3954
  yield entry;
3738
3955
  }
3956
+ if (checkAmbiguity && offset != declaredDirectoryDataLength) {
3957
+ throwAmbiguousArchive("trailing central directory data");
3958
+ }
3959
+ if (duplicateFilename) {
3960
+ throwAmbiguousArchive("duplicate filename");
3961
+ }
3962
+ if (checkAmbiguity && (prependedDataLength || (filesLength && startOffset > 0))) {
3963
+ throwAmbiguousArchive("prepended data");
3964
+ }
3739
3965
  const extractPrependedData = getOptionValue$1(zipReader, options, OPTION_EXTRACT_PREPENDED_DATA);
3740
3966
  const extractAppendedData = getOptionValue$1(zipReader, options, OPTION_EXTRACT_APPENDED_DATA);
3741
3967
  if (extractPrependedData) {
@@ -3775,9 +4001,21 @@ class ZipReaderStream {
3775
4001
  readable: (function () {
3776
4002
  const { readable, writable } = new TransformStream();
3777
4003
  if (value.getData) {
3778
- value.getData(writable);
4004
+ getData();
3779
4005
  return readable;
3780
4006
  }
4007
+
4008
+ async function getData() {
4009
+ try {
4010
+ await value.getData(writable);
4011
+ } catch (error) {
4012
+ try {
4013
+ await writable.abort(error);
4014
+ } catch {
4015
+ // ignored
4016
+ }
4017
+ }
4018
+ }
3781
4019
  })()
3782
4020
  };
3783
4021
  delete chunk.getData;
@@ -3802,6 +4040,7 @@ let ZipEntry$1 = class ZipEntry {
3802
4040
  const zipEntry = this;
3803
4041
  const {
3804
4042
  reader,
4043
+ index,
3805
4044
  offset,
3806
4045
  diskNumberStart,
3807
4046
  extraFieldAES,
@@ -3827,27 +4066,42 @@ let ZipEntry$1 = class ZipEntry {
3827
4066
  rawPassword = rawPassword && rawPassword.length && rawPassword;
3828
4067
  if (extraFieldAES) {
3829
4068
  if (extraFieldAES.originalCompressionMethod != COMPRESSION_METHOD_AES) {
3830
- throw new Error(ERR_UNSUPPORTED_COMPRESSION);
4069
+ throw new Error(ERR_UNSUPPORTED_COMPRESSION$1);
3831
4070
  }
3832
4071
  }
3833
4072
  if ((compressionMethod != COMPRESSION_METHOD_STORE && compressionMethod != COMPRESSION_METHOD_DEFLATE && compressionMethod != COMPRESSION_METHOD_DEFLATE_64) && !passThrough) {
3834
- throw new Error(ERR_UNSUPPORTED_COMPRESSION);
4073
+ throw new Error(ERR_UNSUPPORTED_COMPRESSION$1);
3835
4074
  }
3836
- if (getUint32(dataView, 0) != LOCAL_FILE_HEADER_SIGNATURE) {
4075
+ if (dataArray.length < HEADER_SIZE || getUint32(dataView, 0) != LOCAL_FILE_HEADER_SIGNATURE) {
3837
4076
  throw new Error(ERR_LOCAL_FILE_HEADER_NOT_FOUND);
3838
4077
  }
3839
4078
  readCommonHeader(localDirectory, dataView, 4);
3840
4079
  const {
3841
4080
  extraFieldLength,
3842
- filenameLength,
3843
- lastAccessDate,
3844
- creationDate
4081
+ filenameLength
3845
4082
  } = localDirectory;
3846
- localDirectory.rawExtraField = extraFieldLength ?
3847
- await readUint8Array(reader, offset + HEADER_SIZE + filenameLength, extraFieldLength, diskNumberStart) :
3848
- new Uint8Array();
4083
+ const checkAmbiguity = getOptionValue$1(zipEntry, options, OPTION_CHECK_AMBIGUITY);
4084
+ let rawLocalFilename = new Uint8Array();
4085
+ if (checkAmbiguity && (filenameLength || extraFieldLength)) {
4086
+ const trailingDataArray = await readUint8Array(reader, offset + HEADER_SIZE, filenameLength + extraFieldLength, diskNumberStart);
4087
+ rawLocalFilename = trailingDataArray.subarray(0, filenameLength);
4088
+ localDirectory.rawExtraField = trailingDataArray.subarray(filenameLength);
4089
+ } else {
4090
+ localDirectory.rawExtraField = extraFieldLength ?
4091
+ await readUint8Array(reader, offset + HEADER_SIZE + filenameLength, extraFieldLength, diskNumberStart) :
4092
+ new Uint8Array();
4093
+ }
3849
4094
  readCommonFooter(zipEntry, localDirectory, dataView, 4, true);
3850
- Object.assign(fileEntry, { lastAccessDate, creationDate });
4095
+ if (checkAmbiguity) {
4096
+ checkLocalDirectory(zipEntry, localDirectory, rawLocalFilename);
4097
+ }
4098
+ const { lastAccessDate, creationDate } = localDirectory;
4099
+ if (lastAccessDate) {
4100
+ fileEntry.lastAccessDate = lastAccessDate;
4101
+ }
4102
+ if (creationDate) {
4103
+ fileEntry.creationDate = creationDate;
4104
+ }
3851
4105
  const encrypted = zipEntry.encrypted && localDirectory.encrypted && !passThrough;
3852
4106
  const zipCrypto = encrypted && !extraFieldAES;
3853
4107
  if (!passThrough) {
@@ -3893,7 +4147,7 @@ let ZipEntry$1 = class ZipEntry {
3893
4147
  outputSize: passThrough ? compressedSize : uncompressedSize,
3894
4148
  signature,
3895
4149
  compressed: compressionMethod != 0 && !passThrough,
3896
- encrypted: zipEntry.encrypted && !passThrough,
4150
+ encrypted,
3897
4151
  useWebWorkers: getOptionValue$1(zipEntry, options, OPTION_USE_WEB_WORKERS),
3898
4152
  useCompressionStream,
3899
4153
  transferStreams: getOptionValue$1(zipEntry, options, OPTION_TRANSFER_STREAMS),
@@ -3907,6 +4161,7 @@ let ZipEntry$1 = class ZipEntry {
3907
4161
  await detectOverlappingEntry({
3908
4162
  reader,
3909
4163
  fileEntry,
4164
+ index,
3910
4165
  offset,
3911
4166
  diskNumberStart,
3912
4167
  signature,
@@ -4009,7 +4264,7 @@ function readCommonFooter(fileEntry, directory, dataView, offset, localDirectory
4009
4264
  directory.extraFieldUnicodeComment = extraFieldUnicodeComment;
4010
4265
  }
4011
4266
  const extraFieldAES = extraField.get(EXTRAFIELD_TYPE_AES);
4012
- if (extraFieldAES) {
4267
+ if (extraFieldAES && extraFieldAES.data.length >= 7) {
4013
4268
  readExtraFieldAES(extraFieldAES, directory, compressionMethod);
4014
4269
  directory.extraFieldAES = extraFieldAES;
4015
4270
  } else {
@@ -4046,19 +4301,23 @@ function readExtraFieldZip64(extraFieldZip64, directory) {
4046
4301
  directory.zip64 = true;
4047
4302
  const extraFieldView = getDataView$1(extraFieldZip64.data);
4048
4303
  const missingProperties = ZIP64_PROPERTIES.filter(([propertyName, max]) => directory[propertyName] == max);
4304
+ const requiredLength = missingProperties.reduce((length, [, max]) => length + ZIP64_EXTRACTION[max].bytes, 0);
4305
+ if (extraFieldZip64.data.length < requiredLength) {
4306
+ throw new Error(ERR_EXTRAFIELD_ZIP64_NOT_FOUND);
4307
+ }
4049
4308
  for (let indexMissingProperty = 0, offset = 0; indexMissingProperty < missingProperties.length; indexMissingProperty++) {
4050
4309
  const [propertyName, max] = missingProperties[indexMissingProperty];
4051
- if (directory[propertyName] == max) {
4052
- const extraction = ZIP64_EXTRACTION[max];
4053
- directory[propertyName] = extraFieldZip64[propertyName] = extraction.getValue(extraFieldView, offset);
4054
- offset += extraction.bytes;
4055
- } else if (extraFieldZip64[propertyName]) {
4056
- throw new Error(ERR_EXTRAFIELD_ZIP64_NOT_FOUND);
4057
- }
4310
+ const extraction = ZIP64_EXTRACTION[max];
4311
+ directory[propertyName] = extraFieldZip64[propertyName] = extraction.getValue(extraFieldView, offset);
4312
+ offset += extraction.bytes;
4058
4313
  }
4059
4314
  }
4060
4315
 
4061
4316
  function readExtraFieldUnicode(extraFieldUnicode, propertyName, rawPropertyName, directory, fileEntry) {
4317
+ if (extraFieldUnicode.data.length < 5) {
4318
+ extraFieldUnicode.valid = false;
4319
+ return;
4320
+ }
4062
4321
  const extraFieldView = getDataView$1(extraFieldUnicode.data);
4063
4322
  const crc32 = new Crc32();
4064
4323
  crc32.append(fileEntry[rawPropertyName]);
@@ -4131,32 +4390,30 @@ function readExtraFieldNTFS(extraFieldNTFS, directory) {
4131
4390
  function readExtraFieldUnix(extraField, directory, isInfoZip) {
4132
4391
  try {
4133
4392
  const view = getDataView$1(new Uint8Array(extraField.data));
4134
- let offset = 0;
4135
- const version = getUint8(view, offset++);
4136
- const uidSize = getUint8(view, offset++);
4137
- const uidBytes = extraField.data.subarray(offset, offset + uidSize);
4138
- offset += uidSize;
4139
- const uid = unpackUnixId(uidBytes);
4140
- const gidSize = getUint8(view, offset++);
4141
- const gidBytes = extraField.data.subarray(offset, offset + gidSize);
4142
- offset += gidSize;
4143
- const gid = unpackUnixId(gidBytes);
4144
- let unixMode = UNDEFINED_VALUE;
4145
- if (!isInfoZip && offset + 2 <= extraField.data.length) {
4146
- const base = extraField.data;
4147
- const modeView = new DataView(base.buffer, base.byteOffset + offset, 2);
4148
- unixMode = modeView.getUint16(0, true);
4149
- }
4150
- Object.assign(extraField, { version, uid, gid, unixMode });
4393
+ let uid, gid;
4394
+ if (isInfoZip) {
4395
+ // Info-ZIP New Unix "ux" field (0x7875): version + variable-length uid/gid
4396
+ let offset = 0;
4397
+ const version = getUint8(view, offset++);
4398
+ const uidSize = getUint8(view, offset++);
4399
+ uid = unpackUnixId(extraField.data.subarray(offset, offset + uidSize));
4400
+ offset += uidSize;
4401
+ const gidSize = getUint8(view, offset++);
4402
+ gid = unpackUnixId(extraField.data.subarray(offset, offset + gidSize));
4403
+ Object.assign(extraField, { version, uid, gid });
4404
+ } else if (extraField.data.length >= 4) {
4405
+ // Info-ZIP Unix "Ux" field (0x7855): fixed 2-byte uid + gid (the file mode, if any, is
4406
+ // carried in the external file attributes, not here)
4407
+ uid = getUint16(view, 0);
4408
+ gid = getUint16(view, 2);
4409
+ Object.assign(extraField, { uid, gid });
4410
+ }
4151
4411
  if (uid !== UNDEFINED_VALUE) {
4152
4412
  directory.uid = uid;
4153
4413
  }
4154
4414
  if (gid !== UNDEFINED_VALUE) {
4155
4415
  directory.gid = gid;
4156
4416
  }
4157
- if (unixMode !== UNDEFINED_VALUE) {
4158
- directory.unixMode = unixMode;
4159
- }
4160
4417
  } catch {
4161
4418
  // ignored
4162
4419
  }
@@ -4170,6 +4427,9 @@ function unpackUnixId(bytes) {
4170
4427
  }
4171
4428
 
4172
4429
  function readExtraFieldExtendedTimestamp(extraFieldExtendedTimestamp, directory, localDirectory) {
4430
+ if (!extraFieldExtendedTimestamp.data.length) {
4431
+ return;
4432
+ }
4173
4433
  const extraFieldView = getDataView$1(extraFieldExtendedTimestamp.data);
4174
4434
  const flags = getUint8(extraFieldView, 0);
4175
4435
  const timeProperties = [];
@@ -4195,7 +4455,8 @@ function readExtraFieldExtendedTimestamp(extraFieldExtendedTimestamp, directory,
4195
4455
  timeProperties.forEach((propertyName, indexProperty) => {
4196
4456
  if (extraFieldExtendedTimestamp.data.length >= offset + 4) {
4197
4457
  const time = getUint32(extraFieldView, offset);
4198
- directory[propertyName] = extraFieldExtendedTimestamp[propertyName] = new Date(time * 1000);
4458
+ // the extended timestamp is a signed 32-bit time_t value
4459
+ directory[propertyName] = extraFieldExtendedTimestamp[propertyName] = new Date((time | 0) * 1000);
4199
4460
  const rawPropertyName = timeRawProperties[indexProperty];
4200
4461
  extraFieldExtendedTimestamp[rawPropertyName] = time;
4201
4462
  }
@@ -4206,6 +4467,7 @@ function readExtraFieldExtendedTimestamp(extraFieldExtendedTimestamp, directory,
4206
4467
  async function detectOverlappingEntry({
4207
4468
  reader,
4208
4469
  fileEntry,
4470
+ index,
4209
4471
  offset,
4210
4472
  diskNumberStart,
4211
4473
  signature,
@@ -4217,10 +4479,9 @@ async function detectOverlappingEntry({
4217
4479
  readRanges
4218
4480
  }) {
4219
4481
  let diskOffset = 0;
4220
- if (diskNumberStart) {
4221
- for (let indexReader = 0; indexReader < diskNumberStart; indexReader++) {
4222
- const diskReader = reader.readers[indexReader];
4223
- diskOffset += diskReader.size;
4482
+ if (diskNumberStart && reader.readers) {
4483
+ for (let indexReader = 0; indexReader < Math.min(diskNumberStart, reader.readers.length); indexReader++) {
4484
+ diskOffset += reader.readers[indexReader].size;
4224
4485
  }
4225
4486
  }
4226
4487
  let dataDescriptorLength = 0;
@@ -4233,7 +4494,8 @@ async function detectOverlappingEntry({
4233
4494
  }
4234
4495
  if (dataDescriptorLength) {
4235
4496
  const dataDescriptorArray = await readUint8Array(reader, dataOffset + compressedSize, dataDescriptorLength + DATA_DESCRIPTOR_RECORD_SIGNATURE_LENGTH, diskNumberStart);
4236
- const dataDescriptorSignature = getUint32(getDataView$1(dataDescriptorArray), 0) == DATA_DESCRIPTOR_RECORD_SIGNATURE;
4497
+ const dataDescriptorSignature = dataDescriptorArray.length == dataDescriptorLength + DATA_DESCRIPTOR_RECORD_SIGNATURE_LENGTH &&
4498
+ getUint32(getDataView$1(dataDescriptorArray), 0) == DATA_DESCRIPTOR_RECORD_SIGNATURE;
4237
4499
  if (dataDescriptorSignature) {
4238
4500
  const readSignature = getUint32(getDataView$1(dataDescriptorArray), 4);
4239
4501
  let readCompressedSize;
@@ -4258,14 +4520,14 @@ async function detectOverlappingEntry({
4258
4520
  end: diskOffset + dataOffset + compressedSize + dataDescriptorLength,
4259
4521
  fileEntry
4260
4522
  };
4261
- for (const otherRange of readRanges) {
4262
- if (otherRange.fileEntry != fileEntry && range.start >= otherRange.start && range.start < otherRange.end) {
4523
+ for (const [otherIndex, otherRange] of readRanges) {
4524
+ if (otherIndex != index && range.start < otherRange.end && otherRange.start < range.end) {
4263
4525
  const error = new Error(ERR_OVERLAPPING_ENTRY);
4264
4526
  error.overlappingEntry = otherRange.fileEntry;
4265
4527
  throw error;
4266
4528
  }
4267
4529
  }
4268
- readRanges.push(range);
4530
+ readRanges.set(index, range);
4269
4531
  }
4270
4532
 
4271
4533
  async function seekSignature(reader, signature, startOffset, minimumBytes, maximumLength) {
@@ -4290,6 +4552,35 @@ async function seekSignature(reader, signature, startOffset, minimumBytes, maxim
4290
4552
  }
4291
4553
  }
4292
4554
 
4555
+ function checkLocalDirectory(zipEntry, localDirectory, rawLocalFilename) {
4556
+ const { rawFilename } = zipEntry;
4557
+ if (rawLocalFilename.length != rawFilename.length ||
4558
+ rawLocalFilename.some((byteValue, indexByte) => byteValue != rawFilename[indexByte])) {
4559
+ throwAmbiguousArchive("mismatched local file header (filename)");
4560
+ }
4561
+ if ((localDirectory.rawBitFlag & BITFLAG_AMBIGUITY_MASK) != (zipEntry.rawBitFlag & BITFLAG_AMBIGUITY_MASK)) {
4562
+ throwAmbiguousArchive("mismatched local file header (general purpose bit flag)");
4563
+ }
4564
+ if (localDirectory.compressionMethod != zipEntry.compressionMethod) {
4565
+ throwAmbiguousArchive("mismatched local file header (compression method)");
4566
+ }
4567
+ // when the data descriptor flag is set, the local signature and sizes are zeroed out; all-zero values are
4568
+ // also tolerated when the flag is clear because some tools produce them (streaming writers predating bit 3)
4569
+ if (!localDirectory.bitFlag.dataDescriptor &&
4570
+ (localDirectory.signature || localDirectory.compressedSize || localDirectory.uncompressedSize) &&
4571
+ (localDirectory.signature != zipEntry.signature ||
4572
+ localDirectory.compressedSize != zipEntry.compressedSize ||
4573
+ localDirectory.uncompressedSize != zipEntry.uncompressedSize)) {
4574
+ throwAmbiguousArchive("mismatched local file header (signature or sizes)");
4575
+ }
4576
+ }
4577
+
4578
+ function throwAmbiguousArchive(reason) {
4579
+ const error = new Error(ERR_AMBIGUOUS_ARCHIVE);
4580
+ error.reason = reason;
4581
+ throw error;
4582
+ }
4583
+
4293
4584
  function getOptionValue$1(zipReader, options, name) {
4294
4585
  return options[name] === UNDEFINED_VALUE ? zipReader.options[name] : options[name];
4295
4586
  }
@@ -4328,7 +4619,7 @@ function setUint32$1(view, offset, value) {
4328
4619
  }
4329
4620
 
4330
4621
  function getDataView$1(array) {
4331
- return new DataView(array.buffer);
4622
+ return new DataView(array.buffer, array.byteOffset, array.byteLength);
4332
4623
  }
4333
4624
 
4334
4625
  /*
@@ -4368,13 +4659,19 @@ const ERR_INVALID_VERSION = "Version exceeds 65535";
4368
4659
  const ERR_INVALID_ENCRYPTION_STRENGTH = "The strength must equal 1, 2, or 3";
4369
4660
  const ERR_INVALID_EXTRAFIELD_TYPE = "Extra field type exceeds 65535";
4370
4661
  const ERR_INVALID_EXTRAFIELD_DATA = "Extra field data exceeds 64KB";
4662
+ // same message as the constant exported by zip-reader.js
4663
+ const ERR_UNSUPPORTED_COMPRESSION = "Compression method not supported";
4664
+ const MIN_UNIX_TIME = -2147483648;
4665
+ const MAX_UNIX_TIME = 2147483647;
4371
4666
  const ERR_UNSUPPORTED_FORMAT = "Zip64 is not supported (set the 'zip64' option to 'true')";
4372
4667
  const ERR_UNDEFINED_UNCOMPRESSED_SIZE = "Undefined uncompressed size";
4668
+ const ERR_UNDEFINED_READER = "Undefined reader";
4373
4669
  const ERR_ZIP_NOT_EMPTY = "Zip file not empty";
4374
4670
  const ERR_INVALID_UID = "Invalid uid (must be integer 0..2^32-1)";
4375
4671
  const ERR_INVALID_GID = "Invalid gid (must be integer 0..2^32-1)";
4376
4672
  const ERR_INVALID_UNIX_MODE = "Invalid UNIX mode (must be integer 0..65535)";
4377
4673
  const ERR_INVALID_UNIX_EXTRA_FIELD_TYPE = "Invalid unixExtraFieldType (must be 'infozip' or 'unix')";
4674
+ const ERR_INVALID_UNIX_ID_SIZE = "uid/gid must be 0..65535 for unixExtraFieldType 'unix' (use 'infozip' for larger ids)";
4378
4675
  const ERR_INVALID_MSDOS_ATTRIBUTES = "Invalid msdosAttributesRaw (must be integer 0..255)";
4379
4676
  const ERR_INVALID_MSDOS_DATA = "Invalid msdosAttributes (must be an object with boolean flags)";
4380
4677
 
@@ -4400,9 +4697,10 @@ class ZipWriter {
4400
4697
  files: new Map(),
4401
4698
  filenames: new Set(),
4402
4699
  offset: options[OPTION_OFFSET] === UNDEFINED_VALUE ? writer.size || writer.writable.size || 0 : options[OPTION_OFFSET],
4403
- pendingEntriesSize: 0,
4700
+ initialOffset: options[OPTION_OFFSET] === UNDEFINED_VALUE ? 0 : options[OPTION_OFFSET] - (writer.size || writer.writable.size || 0),
4404
4701
  pendingAddFileCalls: new Set(),
4405
- bufferedWrites: 0
4702
+ bufferedWrites: 0,
4703
+ lastFileEntry: UNDEFINED_VALUE
4406
4704
  });
4407
4705
  }
4408
4706
 
@@ -4411,17 +4709,18 @@ class ZipWriter {
4411
4709
  throw new Error(ERR_ZIP_NOT_EMPTY);
4412
4710
  }
4413
4711
  reader = new GenericReader(reader);
4712
+ await initStream(reader);
4414
4713
  const zipReader = new ZipReader(reader.readable);
4415
4714
  const entries = await zipReader.getEntries();
4416
4715
  await zipReader.close();
4716
+ await initStream(this.writer);
4417
4717
  await reader.readable.pipeTo(this.writer.writable, { preventClose: true, preventAbort: true });
4418
4718
  this.writer.size = this.offset = reader.size;
4419
4719
  this.filenames = new Set(entries.map(entry => entry.filename));
4420
4720
  this.files = new Map(entries.map(entry => {
4421
4721
  const {
4422
4722
  version,
4423
- compressionMethod,
4424
- lastModDate,
4723
+ rawLastModDate,
4425
4724
  lastAccessDate,
4426
4725
  creationDate,
4427
4726
  rawFilename,
@@ -4434,6 +4733,7 @@ class ZipWriter {
4434
4733
  zip64
4435
4734
  } = entry;
4436
4735
  let {
4736
+ compressionMethod,
4437
4737
  rawExtraFieldZip64,
4438
4738
  rawExtraFieldAES,
4439
4739
  rawExtraFieldExtendedTimestamp,
@@ -4446,31 +4746,39 @@ class ZipWriter {
4446
4746
  rawExtraFieldAES = rawExtraFieldAES || new Uint8Array();
4447
4747
  rawExtraFieldExtendedTimestamp = rawExtraFieldExtendedTimestamp || new Uint8Array();
4448
4748
  rawExtraFieldNTFS = rawExtraFieldNTFS || new Uint8Array();
4449
- rawExtraFieldUnix = entry.rawExtraFieldUnix || new Uint8Array();
4749
+ rawExtraFieldUnix = rawExtraFieldUnix || new Uint8Array();
4450
4750
  rawExtraField = rawExtraField || new Uint8Array();
4751
+ if (entry.extraFieldAES) {
4752
+ compressionMethod = COMPRESSION_METHOD_AES;
4753
+ }
4451
4754
  const extraFieldLength = getLength(rawExtraFieldZip64, rawExtraFieldAES, rawExtraFieldExtendedTimestamp, rawExtraFieldNTFS, rawExtraFieldUnix, rawExtraField);
4452
- const zip64UncompressedSize = zip64 && uncompressedSize > MAX_32_BITS;
4453
- const zip64CompressedSize = zip64 && compressedSize > MAX_32_BITS;
4755
+ const zip64UncompressedSize = zip64 && uncompressedSize >= MAX_32_BITS;
4756
+ const zip64CompressedSize = zip64 && compressedSize >= MAX_32_BITS;
4757
+ const bitFlagValue = (getBitFlag(level, languageEncodingFlag, dataDescriptor, encrypted, compressionMethod) & ~BITFLAG_LEVEL) | (level << 1);
4454
4758
  const {
4455
4759
  headerArray,
4456
4760
  headerView
4457
4761
  } = getHeaderArrayData({
4458
4762
  version,
4459
- bitFlag: getBitFlag(level, languageEncodingFlag, dataDescriptor, encrypted, compressionMethod),
4763
+ bitFlag: bitFlagValue,
4460
4764
  compressionMethod,
4461
4765
  uncompressedSize,
4462
4766
  compressedSize,
4463
- lastModDate,
4767
+ rawLastModDate,
4464
4768
  rawFilename,
4465
4769
  zip64CompressedSize,
4466
4770
  zip64UncompressedSize,
4467
4771
  extraFieldLength
4468
4772
  });
4773
+ const { signature } = entry;
4774
+ if (signature !== UNDEFINED_VALUE) {
4775
+ setUint32(headerView, HEADER_OFFSET_SIGNATURE, signature);
4776
+ }
4469
4777
  Object.assign(entry, {
4470
4778
  zip64UncompressedSize,
4471
4779
  zip64CompressedSize,
4472
- zip64Offset: zip64 && this.offset - diskOffset > MAX_32_BITS,
4473
- zip64DiskNumberStart: zip64 && diskNumber > MAX_16_BITS,
4780
+ zip64Offset: zip64 && this.offset - diskOffset >= MAX_32_BITS,
4781
+ zip64DiskNumberStart: zip64 && diskNumber >= MAX_16_BITS,
4474
4782
  rawExtraFieldZip64,
4475
4783
  rawExtraFieldAES,
4476
4784
  rawExtraFieldExtendedTimestamp,
@@ -4488,6 +4796,7 @@ class ZipWriter {
4488
4796
 
4489
4797
  async add(name = "", reader, options = {}) {
4490
4798
  const zipWriter = this;
4799
+ options = Object.assign({}, options);
4491
4800
  const {
4492
4801
  pendingAddFileCalls,
4493
4802
  config
@@ -4498,17 +4807,24 @@ class ZipWriter {
4498
4807
  await new Promise(resolve => pendingEntries.push(resolve));
4499
4808
  }
4500
4809
  let promiseAddFile;
4810
+ let nameAdded;
4501
4811
  try {
4502
4812
  name = name.trim();
4813
+ if (getOptionValue(zipWriter, options, PROPERTY_NAME_DIRECTORY) && !name.endsWith(DIRECTORY_SIGNATURE)) {
4814
+ name += DIRECTORY_SIGNATURE;
4815
+ }
4503
4816
  if (zipWriter.filenames.has(name)) {
4504
4817
  throw new Error(ERR_DUPLICATED_NAME);
4505
4818
  }
4506
4819
  zipWriter.filenames.add(name);
4820
+ nameAdded = true;
4507
4821
  promiseAddFile = addFile(zipWriter, name, reader, options);
4508
4822
  pendingAddFileCalls.add(promiseAddFile);
4509
4823
  return await promiseAddFile;
4510
4824
  } catch (error) {
4511
- zipWriter.filenames.delete(name);
4825
+ if (nameAdded) {
4826
+ zipWriter.filenames.delete(name);
4827
+ }
4512
4828
  throw error;
4513
4829
  } finally {
4514
4830
  pendingAddFileCalls.delete(promiseAddFile);
@@ -4541,6 +4857,9 @@ class ZipWriter {
4541
4857
  const zipWriter = this;
4542
4858
  const { pendingAddFileCalls, writer } = this;
4543
4859
  const { writable } = writer;
4860
+ if (getLength(comment) > MAX_16_BITS) {
4861
+ throw new Error(ERR_INVALID_COMMENT);
4862
+ }
4544
4863
  while (pendingAddFileCalls.size) {
4545
4864
  await Promise.allSettled(Array.from(pendingAddFileCalls));
4546
4865
  }
@@ -4559,28 +4878,94 @@ class ZipWriterStream {
4559
4878
  const { readable, writable } = new TransformStream();
4560
4879
  this.readable = readable;
4561
4880
  this.zipWriter = new ZipWriter(writable, options);
4881
+ this.pendingAddFileCalls = new Set();
4562
4882
  }
4563
4883
 
4564
4884
  transform(path) {
4885
+ const zipWriter = this.zipWriter;
4886
+ let streamController;
4565
4887
  const { readable, writable } = new TransformStream({
4566
- flush: () => { this.zipWriter.close(); }
4888
+ start(controller) {
4889
+ streamController = controller;
4890
+ },
4891
+ flush: () => void closeArchive()
4567
4892
  });
4568
- this.zipWriter.add(path, readable);
4893
+ watchAddFileCall(this, this.zipWriter.add(path, readable), error => streamController.error(error));
4569
4894
  return { readable: this.readable, writable };
4895
+
4896
+ async function closeArchive() {
4897
+ try {
4898
+ await zipWriter.close();
4899
+ } catch (error) {
4900
+ try {
4901
+ await zipWriter.writer.writable.abort(error);
4902
+ } catch {
4903
+ // ignored
4904
+ }
4905
+ }
4906
+ }
4570
4907
  }
4571
4908
 
4572
4909
  writable(path) {
4573
- const { readable, writable } = new TransformStream();
4574
- this.zipWriter.add(path, readable);
4910
+ let streamController;
4911
+ const { readable, writable } = new TransformStream({
4912
+ start(controller) {
4913
+ streamController = controller;
4914
+ }
4915
+ });
4916
+ watchAddFileCall(this, this.zipWriter.add(path, readable), error => streamController.error(error));
4575
4917
  return writable;
4576
4918
  }
4577
4919
 
4578
- close(comment = UNDEFINED_VALUE, options = {}) {
4920
+ async close(comment = UNDEFINED_VALUE, options = {}) {
4921
+ await Promise.all(Array.from(this.pendingAddFileCalls));
4579
4922
  return this.zipWriter.close(comment, options);
4580
4923
  }
4581
4924
  }
4582
4925
 
4926
+ function watchAddFileCall(zipWriterStream, promiseAddFile, onerror) {
4927
+ zipWriterStream.pendingAddFileCalls.add(promiseAddFile);
4928
+ promiseAddFile.catch(error => {
4929
+ try {
4930
+ onerror(error);
4931
+ } catch {
4932
+ // ignored
4933
+ }
4934
+ });
4935
+ }
4936
+
4583
4937
  async function addFile(zipWriter, name, reader, options) {
4938
+ const attributesInfo = resolveAttributes(zipWriter, name, options);
4939
+ ({ name } = attributesInfo);
4940
+ const metadataInfo = resolveMetadata(zipWriter, name, options);
4941
+ const { comment } = metadataInfo;
4942
+ const extraField = options[PROPERTY_NAME_EXTRA_FIELD];
4943
+ zipWriter.files.set(name, UNDEFINED_VALUE);
4944
+ let fileEntry;
4945
+ try {
4946
+ const sizesInfo = await resolveSizes(zipWriter, reader, metadataInfo, options);
4947
+ ({ reader } = sizesInfo);
4948
+ const { diskOffset, diskNumber } = zipWriter.writer;
4949
+ options = Object.assign({}, options, attributesInfo.resolvedOptions, metadataInfo.resolvedOptions, sizesInfo.resolvedOptions, {
4950
+ internalFileAttribute: metadataInfo.resolvedOptions.internalFileAttributes,
4951
+ externalFileAttribute: attributesInfo.resolvedOptions.externalFileAttributes,
4952
+ signature: options[PROPERTY_NAME_SIGNATURE],
4953
+ offset: zipWriter.offset - diskOffset,
4954
+ diskNumberStart: diskNumber
4955
+ });
4956
+ const headerInfo = getHeaderInfo(options);
4957
+ const dataDescriptorInfo = getDataDescriptorInfo(options);
4958
+ const metadataSize = getLength(headerInfo.localHeaderArray, dataDescriptorInfo.dataDescriptorArray);
4959
+ fileEntry = await getFileEntry(zipWriter, name, reader, { headerInfo, dataDescriptorInfo, metadataSize }, options);
4960
+ } catch (error) {
4961
+ zipWriter.files.delete(name);
4962
+ throw error;
4963
+ }
4964
+ Object.assign(fileEntry, { name, comment, extraField });
4965
+ return new Entry(fileEntry);
4966
+ }
4967
+
4968
+ function resolveAttributes(zipWriter, name, options) {
4584
4969
  name = name.trim();
4585
4970
  let msDosCompatible = getOptionValue(zipWriter, options, PROPERTY_NAME_MS_DOS_COMPATIBLE);
4586
4971
  let versionMadeBy = getOptionValue(zipWriter, options, PROPERTY_NAME_VERSION_MADE_BY, msDosCompatible ? 20 : 768);
@@ -4588,7 +4973,7 @@ async function addFile(zipWriter, name, reader, options) {
4588
4973
  const uid = getOptionValue(zipWriter, options, PROPERTY_NAME_UID);
4589
4974
  const gid = getOptionValue(zipWriter, options, PROPERTY_NAME_GID);
4590
4975
  let unixMode = getOptionValue(zipWriter, options, PROPERTY_NAME_UNIX_MODE);
4591
- const unixExtraFieldType = getOptionValue(zipWriter, options, OPTION_UNIX_EXTRA_FIELD_TYPE);
4976
+ let unixExtraFieldType = getOptionValue(zipWriter, options, OPTION_UNIX_EXTRA_FIELD_TYPE);
4592
4977
  let setuid = getOptionValue(zipWriter, options, PROPERTY_NAME_SETUID);
4593
4978
  let setgid = getOptionValue(zipWriter, options, PROPERTY_NAME_SETGID);
4594
4979
  let sticky = getOptionValue(zipWriter, options, PROPERTY_NAME_STICKY);
@@ -4604,6 +4989,13 @@ async function addFile(zipWriter, name, reader, options) {
4604
4989
  if (unixExtraFieldType !== UNDEFINED_VALUE && unixExtraFieldType !== INFOZIP_EXTRA_FIELD_TYPE && unixExtraFieldType !== UNIX_EXTRA_FIELD_TYPE) {
4605
4990
  throw new Error(ERR_INVALID_UNIX_EXTRA_FIELD_TYPE);
4606
4991
  }
4992
+ if (unixExtraFieldType === UNIX_EXTRA_FIELD_TYPE &&
4993
+ ((uid !== UNDEFINED_VALUE && uid > MAX_16_BITS) || (gid !== UNDEFINED_VALUE && gid > MAX_16_BITS))) {
4994
+ throw new Error(ERR_INVALID_UNIX_ID_SIZE);
4995
+ }
4996
+ if (unixExtraFieldType === UNDEFINED_VALUE && (uid !== UNDEFINED_VALUE || gid !== UNDEFINED_VALUE)) {
4997
+ unixExtraFieldType = INFOZIP_EXTRA_FIELD_TYPE;
4998
+ }
4607
4999
  let msdosAttributesRaw = getOptionValue(zipWriter, options, PROPERTY_NAME_MSDOS_ATTRIBUTES_RAW);
4608
5000
  let msdosAttributes = getOptionValue(zipWriter, options, PROPERTY_NAME_MSDOS_ATTRIBUTES);
4609
5001
  const hasUnixMetadata = uid !== UNDEFINED_VALUE || gid !== UNDEFINED_VALUE || unixMode !== UNDEFINED_VALUE || unixExtraFieldType;
@@ -4674,6 +5066,27 @@ async function addFile(zipWriter, name, reader, options) {
4674
5066
  if (hasMsDosProvided) {
4675
5067
  externalFileAttributes = (externalFileAttributes & MAX_32_BITS) | (msdosAttributesRaw & MAX_8_BITS);
4676
5068
  }
5069
+ return {
5070
+ name,
5071
+ resolvedOptions: {
5072
+ versionMadeBy,
5073
+ msDosCompatible,
5074
+ externalFileAttributes,
5075
+ unixExternalUpper,
5076
+ uid,
5077
+ gid,
5078
+ unixMode,
5079
+ unixExtraFieldType,
5080
+ setuid,
5081
+ setgid,
5082
+ sticky,
5083
+ msdosAttributesRaw,
5084
+ msdosAttributes
5085
+ }
5086
+ };
5087
+ }
5088
+
5089
+ function resolveMetadata(zipWriter, name, options) {
4677
5090
  const encode = getOptionValue(zipWriter, options, OPTION_ENCODE_TEXT, encodeText);
4678
5091
  let rawFilename = encode(name);
4679
5092
  if (rawFilename === UNDEFINED_VALUE) {
@@ -4712,10 +5125,14 @@ async function addFile(zipWriter, name, reader, options) {
4712
5125
  const transferStreams = getOptionValue(zipWriter, options, OPTION_TRANSFER_STREAMS, true);
4713
5126
  const bufferedWrite = getOptionValue(zipWriter, options, OPTION_BUFFERED_WRITE);
4714
5127
  const createTempStream = getOptionValue(zipWriter, options, OPTION_CREATE_TEMP_STREAM);
4715
- const dataDescriptorSignature = getOptionValue(zipWriter, options, OPTION_DATA_DESCRIPTOR_SIGNATURE, false);
5128
+ const dataDescriptorSignature = getOptionValue(zipWriter, options, OPTION_DATA_DESCRIPTOR_SIGNATURE, true);
4716
5129
  const signal = getOptionValue(zipWriter, options, OPTION_SIGNAL);
4717
5130
  const useUnicodeFileNames = getOptionValue(zipWriter, options, OPTION_USE_UNICODE_FILE_NAMES, true);
4718
5131
  const compressionMethod = getOptionValue(zipWriter, options, PROPERTY_NAME_COMPRESSION_METHOD);
5132
+ if (!passThrough && compressionMethod !== UNDEFINED_VALUE &&
5133
+ compressionMethod !== COMPRESSION_METHOD_STORE && compressionMethod !== COMPRESSION_METHOD_DEFLATE) {
5134
+ throw new Error(ERR_UNSUPPORTED_COMPRESSION);
5135
+ }
4719
5136
  let level = getOptionValue(zipWriter, options, OPTION_LEVEL);
4720
5137
  let useCompressionStream = getOptionValue(zipWriter, options, OPTION_USE_COMPRESSION_STREAM);
4721
5138
  let dataDescriptor = getOptionValue(zipWriter, options, OPTION_DATA_DESCRIPTOR);
@@ -4731,7 +5148,7 @@ async function addFile(zipWriter, name, reader, options) {
4731
5148
  if (!useCompressionStream && (zipWriter.config.CompressionStream === UNDEFINED_VALUE && zipWriter.config.CompressionStreamZlib === UNDEFINED_VALUE)) {
4732
5149
  level = 0;
4733
5150
  }
4734
- let zip64 = getOptionValue(zipWriter, options, PROPERTY_NAME_ZIP64);
5151
+ const zip64 = getOptionValue(zipWriter, options, PROPERTY_NAME_ZIP64);
4735
5152
  if (!zipCrypto && (password !== UNDEFINED_VALUE || rawPassword !== UNDEFINED_VALUE) && !(encryptionStrength >= 1 && encryptionStrength <= 3)) {
4736
5153
  throw new Error(ERR_INVALID_ENCRYPTION_STRENGTH);
4737
5154
  }
@@ -4742,6 +5159,7 @@ async function addFile(zipWriter, name, reader, options) {
4742
5159
  let offset = 0;
4743
5160
  extraField.forEach(data => extraFieldSize += 4 + getLength(data));
4744
5161
  rawExtraField = new Uint8Array(extraFieldSize);
5162
+ const rawExtraFieldView = getDataView(rawExtraField);
4745
5163
  extraField.forEach((data, type) => {
4746
5164
  if (type > MAX_16_BITS) {
4747
5165
  throw new Error(ERR_INVALID_EXTRAFIELD_TYPE);
@@ -4749,22 +5167,72 @@ async function addFile(zipWriter, name, reader, options) {
4749
5167
  if (getLength(data) > MAX_16_BITS) {
4750
5168
  throw new Error(ERR_INVALID_EXTRAFIELD_DATA);
4751
5169
  }
4752
- arraySet(rawExtraField, new Uint16Array([type]), offset);
4753
- arraySet(rawExtraField, new Uint16Array([getLength(data)]), offset + 2);
5170
+ setUint16(rawExtraFieldView, offset, type);
5171
+ setUint16(rawExtraFieldView, offset + 2, getLength(data));
4754
5172
  arraySet(rawExtraField, data, offset + 4);
4755
5173
  offset += 4 + getLength(data);
4756
5174
  });
4757
5175
  }
5176
+ return {
5177
+ comment,
5178
+ resolvedOptions: {
5179
+ rawFilename,
5180
+ rawComment,
5181
+ version,
5182
+ lastModDate,
5183
+ lastAccessDate,
5184
+ creationDate,
5185
+ internalFileAttributes,
5186
+ passThrough,
5187
+ password,
5188
+ rawPassword,
5189
+ encryptionStrength,
5190
+ zipCrypto,
5191
+ extendedTimestamp,
5192
+ keepOrder,
5193
+ useWebWorkers,
5194
+ transferStreams,
5195
+ bufferedWrite,
5196
+ createTempStream,
5197
+ dataDescriptorSignature,
5198
+ signal,
5199
+ useUnicodeFileNames,
5200
+ compressionMethod,
5201
+ level,
5202
+ useCompressionStream,
5203
+ dataDescriptor,
5204
+ zip64,
5205
+ rawExtraField
5206
+ }
5207
+ };
5208
+ }
5209
+
5210
+ async function resolveSizes(zipWriter, reader, { resolvedOptions: metadata }, options) {
5211
+ const { passThrough, zipCrypto, password, rawPassword, encryptionStrength } = metadata;
5212
+ let { dataDescriptor, zip64, level, compressionMethod } = metadata;
4758
5213
  let maximumCompressedSize = 0;
4759
- let maximumEntrySize = 0;
4760
5214
  let uncompressedSize = 0;
4761
5215
  if (passThrough) {
5216
+ // the headers of a passThrough entry describe the payload verbatim: without a
5217
+ // reader they would declare content that is not there
5218
+ if (!reader) {
5219
+ throw new Error(ERR_UNDEFINED_READER);
5220
+ }
4762
5221
  uncompressedSize = options[PROPERTY_NAME_UNCOMPRESSED_SIZE];
4763
5222
  if (uncompressedSize === UNDEFINED_VALUE) {
4764
5223
  throw new Error(ERR_UNDEFINED_UNCOMPRESSED_SIZE);
4765
5224
  }
4766
5225
  }
4767
5226
  const zip64Enabled = zip64 === true;
5227
+ const encrypted = getOptionValue(zipWriter, options, PROPERTY_NAME_ENCRYPTED);
5228
+ // entries without a reader have no payload: write them as empty stored files instead of
5229
+ // declaring a compressed or encrypted content that does not exist
5230
+ const encryptedEntry = Boolean(reader) && (Boolean((password && getLength(password)) || (rawPassword && getLength(rawPassword))) || (passThrough && encrypted));
5231
+ if (!reader) {
5232
+ level = 0;
5233
+ compressionMethod = COMPRESSION_METHOD_STORE;
5234
+ }
5235
+ const encryptionOverhead = encryptedEntry ? (zipCrypto ? 12 : 16 + encryptionStrength * 4) : 0;
4768
5236
  if (reader) {
4769
5237
  reader = new GenericReader(reader);
4770
5238
  await initStream(reader);
@@ -4777,16 +5245,15 @@ async function addFile(zipWriter, name, reader, options) {
4777
5245
  }
4778
5246
  } else {
4779
5247
  options.uncompressedSize = uncompressedSize = reader.size;
4780
- maximumCompressedSize = getMaximumCompressedSize(uncompressedSize);
5248
+ maximumCompressedSize = getMaximumCompressedSize(uncompressedSize) + encryptionOverhead;
4781
5249
  }
4782
5250
  } else {
4783
5251
  options.uncompressedSize = uncompressedSize;
4784
- maximumCompressedSize = getMaximumCompressedSize(uncompressedSize);
5252
+ maximumCompressedSize = getMaximumCompressedSize(uncompressedSize) + encryptionOverhead;
4785
5253
  }
4786
5254
  }
4787
- const { diskOffset, diskNumber } = zipWriter.writer;
4788
- const zip64UncompressedSize = zip64Enabled || uncompressedSize > MAX_32_BITS;
4789
- const zip64CompressedSize = zip64Enabled || maximumCompressedSize > MAX_32_BITS;
5255
+ const zip64UncompressedSize = zip64Enabled || uncompressedSize >= MAX_32_BITS;
5256
+ const zip64CompressedSize = zip64Enabled || maximumCompressedSize >= MAX_32_BITS;
4790
5257
  if (zip64UncompressedSize || zip64CompressedSize) {
4791
5258
  if (zip64 === false) {
4792
5259
  throw new Error(ERR_UNSUPPORTED_FORMAT);
@@ -4795,73 +5262,19 @@ async function addFile(zipWriter, name, reader, options) {
4795
5262
  }
4796
5263
  }
4797
5264
  zip64 = zip64 || false;
4798
- const encrypted = getOptionValue(zipWriter, options, PROPERTY_NAME_ENCRYPTED);
4799
- options = Object.assign({}, options, {
4800
- rawFilename,
4801
- rawComment,
4802
- version,
4803
- versionMadeBy,
4804
- lastModDate,
4805
- lastAccessDate,
4806
- creationDate,
4807
- rawExtraField,
4808
- zip64,
4809
- zip64UncompressedSize,
4810
- zip64CompressedSize,
4811
- password,
4812
- rawPassword,
4813
- level,
4814
- useWebWorkers,
4815
- transferStreams,
4816
- encryptionStrength,
4817
- extendedTimestamp,
4818
- zipCrypto,
4819
- bufferedWrite,
4820
- createTempStream,
4821
- keepOrder,
4822
- useUnicodeFileNames,
4823
- dataDescriptor,
4824
- dataDescriptorSignature,
4825
- signal,
4826
- msDosCompatible,
4827
- internalFileAttribute: internalFileAttributes,
4828
- internalFileAttributes,
4829
- externalFileAttribute: externalFileAttributes,
4830
- externalFileAttributes,
4831
- useCompressionStream,
4832
- passThrough,
4833
- encrypted: Boolean((password && getLength(password)) || (rawPassword && getLength(rawPassword))) || (passThrough && encrypted),
4834
- signature: options[PROPERTY_NAME_SIGNATURE],
4835
- compressionMethod,
4836
- uncompressedSize,
4837
- offset: zipWriter.offset - diskOffset,
4838
- diskNumberStart: diskNumber,
4839
- uid,
4840
- gid,
4841
- setuid,
4842
- setgid,
4843
- sticky,
4844
- unixMode,
4845
- msdosAttributesRaw,
4846
- msdosAttributes,
4847
- unixExternalUpper
4848
- });
4849
- const headerInfo = getHeaderInfo(options);
4850
- const dataDescriptorInfo = getDataDescriptorInfo(options);
4851
- const metadataSize = getLength(headerInfo.localHeaderArray, dataDescriptorInfo.dataDescriptorArray);
4852
- maximumEntrySize = metadataSize + maximumCompressedSize;
4853
- if (zipWriter.options[OPTION_USDZ]) {
4854
- maximumEntrySize += maximumEntrySize + 64;
4855
- }
4856
- zipWriter.pendingEntriesSize += maximumEntrySize;
4857
- let fileEntry;
4858
- try {
4859
- fileEntry = await getFileEntry(zipWriter, name, reader, { headerInfo, dataDescriptorInfo, metadataSize }, options);
4860
- } finally {
4861
- zipWriter.pendingEntriesSize -= maximumEntrySize;
4862
- }
4863
- Object.assign(fileEntry, { name, comment, extraField });
4864
- return new Entry(fileEntry);
5265
+ return {
5266
+ reader,
5267
+ resolvedOptions: {
5268
+ dataDescriptor,
5269
+ zip64,
5270
+ zip64UncompressedSize,
5271
+ zip64CompressedSize,
5272
+ uncompressedSize,
5273
+ level,
5274
+ compressionMethod,
5275
+ encrypted: encryptedEntry
5276
+ }
5277
+ };
4865
5278
  }
4866
5279
 
4867
5280
  async function getFileEntry(zipWriter, name, reader, entryInfo, options) {
@@ -4878,37 +5291,40 @@ async function getFileEntry(zipWriter, name, reader, entryInfo, options) {
4878
5291
  headerInfo
4879
5292
  } = entryInfo;
4880
5293
  const usdz = zipWriter.options[OPTION_USDZ];
4881
- const previousFileEntry = Array.from(files.values()).pop();
5294
+ const previousFileEntry = zipWriter.lastFileEntry;
4882
5295
  let fileEntry = {};
4883
5296
  let bufferedWrite;
4884
5297
  let releaseLockWriter;
4885
5298
  let releaseLockCurrentFileEntry;
4886
5299
  let writingBufferedEntryData;
4887
5300
  let writingEntryData;
5301
+ let writerSizeBeforeEntry;
5302
+ let flushedBufferedSize = 0;
4888
5303
  let fileWriter;
4889
5304
  files.set(name, fileEntry);
5305
+ zipWriter.lastFileEntry = fileEntry;
4890
5306
  try {
4891
5307
  let lockPreviousFileEntry;
4892
5308
  if (keepOrder) {
4893
5309
  lockPreviousFileEntry = previousFileEntry && previousFileEntry.lock;
4894
5310
  requestLockCurrentFileEntry();
4895
5311
  }
4896
- if ((options.bufferedWrite || !keepOrder || zipWriter.writerLocked || zipWriter.bufferedWrites || !dataDescriptor) && !usdz) {
5312
+ if (options.bufferedWrite || !keepOrder || zipWriter.writerLocked || zipWriter.bufferedWrites || !dataDescriptor) {
5313
+ bufferedWrite = true;
5314
+ zipWriter.bufferedWrites++;
4897
5315
  if (options.createTempStream) {
4898
5316
  fileWriter = await options.createTempStream();
4899
5317
  } else {
4900
5318
  fileWriter = new TransformStream(UNDEFINED_VALUE, UNDEFINED_VALUE, { highWaterMark: INFINITY_VALUE });
4901
5319
  }
4902
5320
  fileWriter.size = 0;
4903
- bufferedWrite = true;
4904
- zipWriter.bufferedWrites++;
4905
5321
  await initStream(writer);
4906
5322
  } else {
4907
5323
  fileWriter = writer;
4908
5324
  await requestLockWriter();
4909
5325
  }
4910
5326
  await initStream(fileWriter);
4911
- const { writable, diskOffset } = writer;
5327
+ const { diskOffset } = writer;
4912
5328
  if (zipWriter.addSplitZipSignature) {
4913
5329
  delete zipWriter.addSplitZipSignature;
4914
5330
  const signatureArray = new Uint8Array(4);
@@ -4917,21 +5333,20 @@ async function getFileEntry(zipWriter, name, reader, entryInfo, options) {
4917
5333
  await writeData(writer, signatureArray);
4918
5334
  zipWriter.offset += 4;
4919
5335
  }
4920
- if (usdz) {
5336
+ if (usdz && !bufferedWrite) {
4921
5337
  appendExtraFieldUSDZ(entryInfo, zipWriter.offset - diskOffset);
4922
5338
  }
4923
- const {
4924
- localHeaderView,
4925
- localHeaderArray
4926
- } = headerInfo;
5339
+ const { localHeaderArray } = headerInfo;
4927
5340
  if (!bufferedWrite) {
4928
5341
  await lockPreviousFileEntry;
4929
- await skipDiskIfNeeded(writable);
5342
+ await skipDiskIfNeeded();
4930
5343
  }
4931
- const { diskNumber } = writer;
4932
- fileEntry.diskNumberStart = diskNumber;
5344
+ const diskNumberStart = writer.diskNumber;
5345
+ const entryOffset = getSegmentOffset(zipWriter, writer);
5346
+ fileEntry.diskNumberStart = diskNumberStart;
4933
5347
  if (!bufferedWrite) {
4934
5348
  writingEntryData = true;
5349
+ writerSizeBeforeEntry = writer.size;
4935
5350
  await writeData(fileWriter, localHeaderArray);
4936
5351
  }
4937
5352
  fileEntry = await createFileEntry(reader, fileWriter, fileEntry, entryInfo, zipWriter.config, options);
@@ -4944,16 +5359,24 @@ async function getFileEntry(zipWriter, name, reader, entryInfo, options) {
4944
5359
  await Promise.all([fileWriter.writable.getWriter().close(), lockPreviousFileEntry]);
4945
5360
  await requestLockWriter();
4946
5361
  writingBufferedEntryData = true;
5362
+ writerSizeBeforeEntry = writer.size;
5363
+ await skipDiskIfNeeded();
4947
5364
  fileEntry.diskNumberStart = writer.diskNumber;
4948
- fileEntry.offset = zipWriter.offset - writer.diskOffset;
4949
- updateLocalHeader(fileEntry, localHeaderView, options);
4950
- await skipDiskIfNeeded(writable);
4951
- await writeData(writer, localHeaderArray);
4952
- await fileWriter.readable.pipeTo(writable, { preventClose: true, preventAbort: true, signal });
5365
+ fileEntry.offset = getSegmentOffset(zipWriter, writer);
5366
+ if (usdz) {
5367
+ // the padding depends on the entry offset, only known now that the writer is locked
5368
+ const previousMetadataSize = entryInfo.metadataSize;
5369
+ appendExtraFieldUSDZ(entryInfo, zipWriter.offset - writer.diskOffset);
5370
+ fileEntry.size += entryInfo.metadataSize - previousMetadataSize;
5371
+ }
5372
+ updateLocalHeader(fileEntry, headerInfo.localHeaderView, options);
5373
+ await writeData(writer, headerInfo.localHeaderArray);
5374
+ await flushBufferedData(fileWriter.readable, writer, signal, chunkLength => flushedBufferedSize += chunkLength);
4953
5375
  writer.size += fileWriter.size;
4954
5376
  writingBufferedEntryData = false;
4955
5377
  } else {
4956
- fileEntry.offset = zipWriter.offset - diskOffset;
5378
+ fileEntry.diskNumberStart = diskNumberStart;
5379
+ fileEntry.offset = entryOffset;
4957
5380
  }
4958
5381
  zipWriter.offset += fileEntry.size;
4959
5382
  return fileEntry;
@@ -4967,10 +5390,9 @@ async function getFileEntry(zipWriter, name, reader, entryInfo, options) {
4967
5390
  // ignored
4968
5391
  }
4969
5392
  }
5393
+ zipWriter.offset += writer.size - writerSizeBeforeEntry;
4970
5394
  if (bufferedWrite) {
4971
- zipWriter.offset += fileWriter.size;
4972
- } else {
4973
- zipWriter.offset = fileWriter.size;
5395
+ zipWriter.offset += flushedBufferedSize;
4974
5396
  }
4975
5397
  }
4976
5398
  files.delete(name);
@@ -5001,10 +5423,10 @@ async function getFileEntry(zipWriter, name, reader, entryInfo, options) {
5001
5423
  await lockWriter;
5002
5424
  }
5003
5425
 
5004
- async function skipDiskIfNeeded(writable) {
5426
+ async function skipDiskIfNeeded() {
5005
5427
  if (getLength(headerInfo.localHeaderArray) > writer.availableSize) {
5006
5428
  writer.availableSize = 0;
5007
- await writeData(writable, new Uint8Array());
5429
+ await writeData(writer, new Uint8Array());
5008
5430
  }
5009
5431
  }
5010
5432
  }
@@ -5145,6 +5567,10 @@ async function createFileEntry(reader, writer, { diskNumberStart, lock }, entryI
5145
5567
  uncompressedSize = result.inputSize;
5146
5568
  signature = result.signature;
5147
5569
  }
5570
+ if ((!zip64CompressedSize && compressedSize >= MAX_32_BITS) ||
5571
+ (!zip64UncompressedSize && uncompressedSize >= MAX_32_BITS)) {
5572
+ throw new Error(ERR_UNSUPPORTED_FORMAT);
5573
+ }
5148
5574
  } catch (error) {
5149
5575
  if (error.outputSize !== UNDEFINED_VALUE) {
5150
5576
  writer.size += error.outputSize;
@@ -5207,35 +5633,28 @@ function getHeaderInfo(options) {
5207
5633
  uncompressedSize
5208
5634
  } = options;
5209
5635
  let { version, compressionMethod } = options;
5210
- const compressed = !directory && (level > 0 || (level === UNDEFINED_VALUE && compressionMethod !== 0));
5636
+ const compressed = !directory && (compressionMethod === UNDEFINED_VALUE
5637
+ ? (level === UNDEFINED_VALUE || level > 0)
5638
+ : compressionMethod !== COMPRESSION_METHOD_STORE);
5211
5639
  let rawLocalExtraFieldZip64;
5212
5640
  const uncompressedFile = passThrough || !compressed;
5213
- const zip64ExtraFieldComplete = zip64 && (options.bufferedWrite || ((!zip64UncompressedSize && !zip64CompressedSize) || uncompressedFile));
5214
- if (zip64) {
5215
- let rawLocalExtraFieldZip64Length = 4;
5216
- if (zip64UncompressedSize) {
5217
- rawLocalExtraFieldZip64Length += 8;
5218
- }
5219
- if (zip64CompressedSize) {
5220
- rawLocalExtraFieldZip64Length += 8;
5221
- }
5222
- rawLocalExtraFieldZip64 = new Uint8Array(rawLocalExtraFieldZip64Length);
5223
- const rawLocalExtraFieldZip64View = getDataView(rawLocalExtraFieldZip64);
5224
- setUint16(rawLocalExtraFieldZip64View, 0, EXTRAFIELD_TYPE_ZIP64);
5225
- setUint16(rawLocalExtraFieldZip64View, 2, getLength(rawLocalExtraFieldZip64) - 4);
5641
+ // entries without a data descriptor are always buffered (cf. getFileEntry), so the
5642
+ // zip64 extra field values can be patched into the local header before flushing it
5643
+ const zip64ExtraFieldComplete = zip64 && (options.bufferedWrite || !dataDescriptor || ((!zip64UncompressedSize && !zip64CompressedSize) || uncompressedFile));
5644
+ const writeLocalExtraFieldZip64 = zip64ExtraFieldComplete || (zip64 && dataDescriptor && (zip64UncompressedSize || zip64CompressedSize));
5645
+ if (zip64 && (zip64UncompressedSize || zip64CompressedSize)) {
5646
+ // APPNOTE 4.5.3: the zip64 extra field of a local header must include both the
5647
+ // uncompressed and compressed size fields
5648
+ const length = 4 + 16;
5649
+ const extraFieldZip64 = createRecordWriter(length);
5650
+ extraFieldZip64.uint16(EXTRAFIELD_TYPE_ZIP64);
5651
+ extraFieldZip64.uint16(length - 4);
5652
+ rawLocalExtraFieldZip64 = extraFieldZip64.array;
5226
5653
  if (zip64ExtraFieldComplete) {
5227
- const rawLocalExtraFieldZip64View = getDataView(rawLocalExtraFieldZip64);
5228
- let rawLocalExtraFieldZip64Offset = 4;
5229
- if (zip64UncompressedSize) {
5230
- setBigUint64(rawLocalExtraFieldZip64View, rawLocalExtraFieldZip64Offset, BigInt(uncompressedSize));
5231
- rawLocalExtraFieldZip64Offset += 8;
5232
- }
5233
- if (zip64CompressedSize && uncompressedFile) {
5234
- setBigUint64(rawLocalExtraFieldZip64View, rawLocalExtraFieldZip64Offset, BigInt(uncompressedSize));
5235
- rawLocalExtraFieldZip64Offset += 8;
5236
- }
5237
- if (rawLocalExtraFieldZip64Offset == 4) {
5238
- rawLocalExtraFieldZip64 = new Uint8Array();
5654
+ extraFieldZip64.uint64(uncompressedSize);
5655
+ if (uncompressedFile) {
5656
+ const encryptionOverhead = encrypted ? (zipCrypto ? 12 : 16 + encryptionStrength * 4) : 0;
5657
+ extraFieldZip64.uint64(passThrough ? 0 : uncompressedSize + encryptionOverhead);
5239
5658
  }
5240
5659
  }
5241
5660
  } else {
@@ -5243,11 +5662,11 @@ function getHeaderInfo(options) {
5243
5662
  }
5244
5663
  let rawExtraFieldAES;
5245
5664
  if (encrypted && !zipCrypto) {
5246
- rawExtraFieldAES = new Uint8Array(getLength(EXTRAFIELD_DATA_AES) + 2);
5247
- const extraFieldAESView = getDataView(rawExtraFieldAES);
5248
- setUint16(extraFieldAESView, 0, EXTRAFIELD_TYPE_AES);
5249
- arraySet(rawExtraFieldAES, EXTRAFIELD_DATA_AES, 2);
5250
- setUint8(extraFieldAESView, 8, encryptionStrength);
5665
+ const extraFieldAES = createRecordWriter(getLength(EXTRAFIELD_DATA_AES) + 2);
5666
+ extraFieldAES.uint16(EXTRAFIELD_TYPE_AES);
5667
+ extraFieldAES.bytes(EXTRAFIELD_DATA_AES);
5668
+ rawExtraFieldAES = extraFieldAES.array;
5669
+ rawExtraFieldAES[8] = encryptionStrength;
5251
5670
  } else {
5252
5671
  rawExtraFieldAES = new Uint8Array();
5253
5672
  }
@@ -5255,33 +5674,38 @@ function getHeaderInfo(options) {
5255
5674
  let rawExtraFieldExtendedTimestamp;
5256
5675
  let extraFieldExtendedTimestampFlag;
5257
5676
  if (extendedTimestamp) {
5258
- rawExtraFieldExtendedTimestamp = new Uint8Array(9 + (lastAccessDate ? 4 : 0) + (creationDate ? 4 : 0));
5259
- const extraFieldExtendedTimestampView = getDataView(rawExtraFieldExtendedTimestamp);
5260
- setUint16(extraFieldExtendedTimestampView, 0, EXTRAFIELD_TYPE_EXTENDED_TIMESTAMP);
5261
- setUint16(extraFieldExtendedTimestampView, 2, getLength(rawExtraFieldExtendedTimestamp) - 4);
5262
- extraFieldExtendedTimestampFlag = 0x1 + (lastAccessDate ? 0x2 : 0) + (creationDate ? 0x4 : 0);
5263
- setUint8(extraFieldExtendedTimestampView, 4, extraFieldExtendedTimestampFlag);
5264
- let offset = 5;
5265
- setUint32(extraFieldExtendedTimestampView, offset, Math.floor(lastModDate.getTime() / 1000));
5266
- offset += 4;
5267
- if (lastAccessDate) {
5268
- setUint32(extraFieldExtendedTimestampView, offset, Math.floor(lastAccessDate.getTime() / 1000));
5269
- offset += 4;
5270
- }
5271
- if (creationDate) {
5272
- setUint32(extraFieldExtendedTimestampView, offset, Math.floor(creationDate.getTime() / 1000));
5677
+ const lastModTimeUnix = getTimeUnix(lastModDate);
5678
+ if (inUnixTimeRange(lastModTimeUnix)) {
5679
+ const extraFieldTimestampLength = 9 + (lastAccessDate ? 4 : 0) + (creationDate ? 4 : 0);
5680
+ const extraFieldTimestamp = createRecordWriter(extraFieldTimestampLength);
5681
+ extraFieldExtendedTimestampFlag = 0x1 + (lastAccessDate ? 0x2 : 0) + (creationDate ? 0x4 : 0);
5682
+ extraFieldTimestamp.uint16(EXTRAFIELD_TYPE_EXTENDED_TIMESTAMP);
5683
+ extraFieldTimestamp.uint16(extraFieldTimestampLength - 4);
5684
+ extraFieldTimestamp.uint8(extraFieldExtendedTimestampFlag);
5685
+ extraFieldTimestamp.uint32(lastModTimeUnix);
5686
+ if (lastAccessDate) {
5687
+ extraFieldTimestamp.uint32(clampUnixTime(getTimeUnix(lastAccessDate)));
5688
+ }
5689
+ if (creationDate) {
5690
+ extraFieldTimestamp.uint32(clampUnixTime(getTimeUnix(creationDate)));
5691
+ }
5692
+ rawExtraFieldExtendedTimestamp = extraFieldTimestamp.array;
5693
+ } else {
5694
+ // the date cannot be stored as a 32-bit time_t; the NTFS field replaces it
5695
+ rawExtraFieldExtendedTimestamp = new Uint8Array();
5273
5696
  }
5274
5697
  try {
5275
- rawExtraFieldNTFS = new Uint8Array(36);
5276
- const extraFieldNTFSView = getDataView(rawExtraFieldNTFS);
5277
5698
  const lastModTimeNTFS = getTimeNTFS(lastModDate);
5278
- setUint16(extraFieldNTFSView, 0, EXTRAFIELD_TYPE_NTFS);
5279
- setUint16(extraFieldNTFSView, 2, 32);
5280
- setUint16(extraFieldNTFSView, 8, EXTRAFIELD_TYPE_NTFS_TAG1);
5281
- setUint16(extraFieldNTFSView, 10, 24);
5282
- setBigUint64(extraFieldNTFSView, 12, lastModTimeNTFS);
5283
- setBigUint64(extraFieldNTFSView, 20, getTimeNTFS(lastAccessDate) || lastModTimeNTFS);
5284
- setBigUint64(extraFieldNTFSView, 28, getTimeNTFS(creationDate) || lastModTimeNTFS);
5699
+ const extraFieldNTFS = createRecordWriter(36);
5700
+ extraFieldNTFS.uint16(EXTRAFIELD_TYPE_NTFS);
5701
+ extraFieldNTFS.uint16(32);
5702
+ extraFieldNTFS.skip(4);
5703
+ extraFieldNTFS.uint16(EXTRAFIELD_TYPE_NTFS_TAG1);
5704
+ extraFieldNTFS.uint16(24);
5705
+ extraFieldNTFS.uint64(lastModTimeNTFS);
5706
+ extraFieldNTFS.uint64(getTimeNTFS(lastAccessDate) || lastModTimeNTFS);
5707
+ extraFieldNTFS.uint64(getTimeNTFS(creationDate) || lastModTimeNTFS);
5708
+ rawExtraFieldNTFS = extraFieldNTFS.array;
5285
5709
  } catch {
5286
5710
  rawExtraFieldNTFS = new Uint8Array();
5287
5711
  }
@@ -5290,41 +5714,27 @@ function getHeaderInfo(options) {
5290
5714
  }
5291
5715
  let rawExtraFieldUnix;
5292
5716
  try {
5293
- const { uid, gid, unixMode, setuid, setgid, sticky, unixExtraFieldType } = options;
5294
- if (unixExtraFieldType && (uid !== UNDEFINED_VALUE || gid !== UNDEFINED_VALUE || unixMode !== UNDEFINED_VALUE)) {
5717
+ const { uid, gid, unixExtraFieldType } = options;
5718
+ if (unixExtraFieldType == INFOZIP_EXTRA_FIELD_TYPE && (uid !== UNDEFINED_VALUE || gid !== UNDEFINED_VALUE)) {
5295
5719
  const uidBytes = packUnixId(uid);
5296
5720
  const gidBytes = packUnixId(gid);
5297
- let modeArray = new Uint8Array();
5298
- if (unixExtraFieldType == UNIX_EXTRA_FIELD_TYPE && unixMode !== UNDEFINED_VALUE) {
5299
- let modeToWrite = unixMode & MAX_16_BITS;
5300
- if (setuid) {
5301
- modeToWrite |= FILE_ATTR_UNIX_SETUID_MASK;
5302
- }
5303
- if (setgid) {
5304
- modeToWrite |= FILE_ATTR_UNIX_SETGID_MASK;
5305
- }
5306
- if (sticky) {
5307
- modeToWrite |= FILE_ATTR_UNIX_STICKY_MASK;
5308
- }
5309
- modeArray = new Uint8Array(2);
5310
- const modeDataView = new DataView(modeArray.buffer);
5311
- modeDataView.setUint16(0, modeToWrite, true);
5312
- }
5313
- const payloadLength = 3 + uidBytes.length + gidBytes.length + modeArray.length;
5314
- rawExtraFieldUnix = new Uint8Array(4 + payloadLength);
5315
- const rawExtraFieldUnixView = getDataView(rawExtraFieldUnix);
5316
- setUint16(rawExtraFieldUnixView, 0, unixExtraFieldType == INFOZIP_EXTRA_FIELD_TYPE ? EXTRAFIELD_TYPE_INFOZIP : EXTRAFIELD_TYPE_UNIX);
5317
- setUint16(rawExtraFieldUnixView, 2, payloadLength);
5318
- setUint8(rawExtraFieldUnixView, 4, 1);
5319
- setUint8(rawExtraFieldUnixView, 5, uidBytes.length);
5320
- let offset = 6;
5321
- arraySet(rawExtraFieldUnix, uidBytes, offset);
5322
- offset += uidBytes.length;
5323
- setUint8(rawExtraFieldUnixView, offset, gidBytes.length);
5324
- offset++;
5325
- arraySet(rawExtraFieldUnix, gidBytes, offset);
5326
- offset += gidBytes.length;
5327
- arraySet(rawExtraFieldUnix, modeArray, offset);
5721
+ const payloadLength = 3 + uidBytes.length + gidBytes.length;
5722
+ const extraFieldUnix = createRecordWriter(4 + payloadLength);
5723
+ extraFieldUnix.uint16(EXTRAFIELD_TYPE_INFOZIP);
5724
+ extraFieldUnix.uint16(payloadLength);
5725
+ extraFieldUnix.uint8(1);
5726
+ extraFieldUnix.uint8(uidBytes.length);
5727
+ extraFieldUnix.bytes(uidBytes);
5728
+ extraFieldUnix.uint8(gidBytes.length);
5729
+ extraFieldUnix.bytes(gidBytes);
5730
+ rawExtraFieldUnix = extraFieldUnix.array;
5731
+ } else if (unixExtraFieldType == UNIX_EXTRA_FIELD_TYPE && (uid !== UNDEFINED_VALUE || gid !== UNDEFINED_VALUE)) {
5732
+ const extraFieldUnix = createRecordWriter(8);
5733
+ extraFieldUnix.uint16(EXTRAFIELD_TYPE_UNIX);
5734
+ extraFieldUnix.uint16(4);
5735
+ extraFieldUnix.uint16((uid === UNDEFINED_VALUE ? 0 : uid) & MAX_16_BITS);
5736
+ extraFieldUnix.uint16((gid === UNDEFINED_VALUE ? 0 : gid) & MAX_16_BITS);
5737
+ rawExtraFieldUnix = extraFieldUnix.array;
5328
5738
  } else {
5329
5739
  rawExtraFieldUnix = new Uint8Array();
5330
5740
  }
@@ -5342,8 +5752,11 @@ function getHeaderInfo(options) {
5342
5752
  rawExtraFieldAES[9] = compressionMethod;
5343
5753
  compressionMethod = COMPRESSION_METHOD_AES;
5344
5754
  }
5345
- const localExtraFieldZip64Length = zip64ExtraFieldComplete ? getLength(rawLocalExtraFieldZip64) : 0;
5755
+ const localExtraFieldZip64Length = writeLocalExtraFieldZip64 ? getLength(rawLocalExtraFieldZip64) : 0;
5346
5756
  const extraFieldLength = localExtraFieldZip64Length + getLength(rawExtraFieldAES, rawExtraFieldExtendedTimestamp, rawExtraFieldNTFS, rawExtraFieldUnix, rawExtraField);
5757
+ if (extraFieldLength > MAX_16_BITS) {
5758
+ throw new Error(ERR_INVALID_EXTRAFIELD_DATA);
5759
+ }
5347
5760
  const {
5348
5761
  headerArray,
5349
5762
  headerView,
@@ -5359,29 +5772,27 @@ function getHeaderInfo(options) {
5359
5772
  zip64UncompressedSize,
5360
5773
  extraFieldLength
5361
5774
  });
5362
- let localHeaderOffset = HEADER_SIZE;
5363
- const localHeaderArray = new Uint8Array(localHeaderOffset + getLength(rawFilename) + extraFieldLength);
5775
+ const localHeader = createRecordWriter(HEADER_SIZE + getLength(rawFilename) + extraFieldLength);
5776
+ const localHeaderArray = localHeader.array;
5364
5777
  const localHeaderView = getDataView(localHeaderArray);
5365
- setUint32(localHeaderView, 0, LOCAL_FILE_HEADER_SIGNATURE);
5366
- arraySet(localHeaderArray, headerArray, 4);
5367
- arraySet(localHeaderArray, rawFilename, localHeaderOffset);
5368
- localHeaderOffset += getLength(rawFilename);
5369
- if (zip64ExtraFieldComplete) {
5370
- arraySet(localHeaderArray, rawLocalExtraFieldZip64, localHeaderOffset);
5371
- }
5372
- localHeaderOffset += localExtraFieldZip64Length;
5373
- arraySet(localHeaderArray, rawExtraFieldAES, localHeaderOffset);
5374
- localHeaderOffset += getLength(rawExtraFieldAES);
5375
- arraySet(localHeaderArray, rawExtraFieldExtendedTimestamp, localHeaderOffset);
5376
- localHeaderOffset += getLength(rawExtraFieldExtendedTimestamp);
5377
- arraySet(localHeaderArray, rawExtraFieldNTFS, localHeaderOffset);
5378
- localHeaderOffset += getLength(rawExtraFieldNTFS);
5379
- arraySet(localHeaderArray, rawExtraFieldUnix, localHeaderOffset);
5380
- localHeaderOffset += getLength(rawExtraFieldUnix);
5381
- arraySet(localHeaderArray, rawExtraField, localHeaderOffset);
5778
+ localHeader.uint32(LOCAL_FILE_HEADER_SIGNATURE);
5779
+ localHeader.bytes(headerArray);
5780
+ localHeader.bytes(rawFilename);
5781
+ if (writeLocalExtraFieldZip64) {
5782
+ localHeader.bytes(rawLocalExtraFieldZip64);
5783
+ }
5784
+ localHeader.bytes(rawExtraFieldAES);
5785
+ localHeader.bytes(rawExtraFieldExtendedTimestamp);
5786
+ localHeader.bytes(rawExtraFieldNTFS);
5787
+ localHeader.bytes(rawExtraFieldUnix);
5788
+ localHeader.bytes(rawExtraField);
5382
5789
  if (dataDescriptor) {
5383
- setUint32(localHeaderView, HEADER_OFFSET_COMPRESSED_SIZE + 4, 0);
5384
- setUint32(localHeaderView, HEADER_OFFSET_UNCOMPRESSED_SIZE + 4, 0);
5790
+ if (!zip64CompressedSize) {
5791
+ setUint32(localHeaderView, HEADER_OFFSET_COMPRESSED_SIZE + LOCAL_HEADER_COMMON_OFFSET, 0);
5792
+ }
5793
+ if (!zip64UncompressedSize) {
5794
+ setUint32(localHeaderView, HEADER_OFFSET_UNCOMPRESSED_SIZE + LOCAL_HEADER_COMMON_OFFSET, 0);
5795
+ }
5385
5796
  }
5386
5797
  return {
5387
5798
  localHeaderArray,
@@ -5408,7 +5819,7 @@ function getHeaderInfo(options) {
5408
5819
  function appendExtraFieldUSDZ(entryInfo, zipWriterOffset) {
5409
5820
  const { headerInfo } = entryInfo;
5410
5821
  let { localHeaderArray, extraFieldLength } = headerInfo;
5411
- let localHeaderArrayView = getDataView(localHeaderArray);
5822
+ let localHeaderArrayView;
5412
5823
  let extraBytesLength = 64 - ((zipWriterOffset + getLength(localHeaderArray)) % 64);
5413
5824
  if (extraBytesLength < 4) {
5414
5825
  extraBytesLength += 64;
@@ -5416,13 +5827,14 @@ function appendExtraFieldUSDZ(entryInfo, zipWriterOffset) {
5416
5827
  const rawExtraFieldUSDZ = new Uint8Array(extraBytesLength);
5417
5828
  const extraFieldUSDZView = getDataView(rawExtraFieldUSDZ);
5418
5829
  setUint16(extraFieldUSDZView, 0, EXTRAFIELD_TYPE_USDZ);
5419
- setUint16(extraFieldUSDZView, 2, extraBytesLength - 2);
5830
+ setUint16(extraFieldUSDZView, 2, extraBytesLength - 4);
5420
5831
  const previousLocalHeaderArray = localHeaderArray;
5421
5832
  headerInfo.localHeaderArray = localHeaderArray = new Uint8Array(getLength(previousLocalHeaderArray) + extraBytesLength);
5422
5833
  arraySet(localHeaderArray, previousLocalHeaderArray);
5423
5834
  arraySet(localHeaderArray, rawExtraFieldUSDZ, getLength(previousLocalHeaderArray));
5424
5835
  localHeaderArrayView = getDataView(localHeaderArray);
5425
5836
  setUint16(localHeaderArrayView, 28, extraFieldLength + extraBytesLength);
5837
+ headerInfo.localHeaderView = localHeaderArrayView;
5426
5838
  entryInfo.metadataSize += extraBytesLength;
5427
5839
  }
5428
5840
 
@@ -5545,37 +5957,32 @@ function updateLocalHeader({
5545
5957
  }, localHeaderView, { dataDescriptor }) {
5546
5958
  if (!dataDescriptor) {
5547
5959
  if (!encrypted) {
5548
- setUint32(localHeaderView, HEADER_OFFSET_SIGNATURE + 4, signature);
5960
+ setUint32(localHeaderView, HEADER_OFFSET_SIGNATURE + LOCAL_HEADER_COMMON_OFFSET, signature);
5549
5961
  }
5550
5962
  if (!zip64CompressedSize) {
5551
- setUint32(localHeaderView, HEADER_OFFSET_COMPRESSED_SIZE + 4, compressedSize);
5963
+ setUint32(localHeaderView, HEADER_OFFSET_COMPRESSED_SIZE + LOCAL_HEADER_COMMON_OFFSET, compressedSize);
5552
5964
  }
5553
5965
  if (!zip64UncompressedSize) {
5554
- setUint32(localHeaderView, HEADER_OFFSET_UNCOMPRESSED_SIZE + 4, uncompressedSize);
5966
+ setUint32(localHeaderView, HEADER_OFFSET_UNCOMPRESSED_SIZE + LOCAL_HEADER_COMMON_OFFSET, uncompressedSize);
5555
5967
  }
5556
5968
  }
5557
5969
  if (zip64 && localExtraFieldZip64Length) {
5558
- let localHeaderOffset = HEADER_SIZE + getLength(rawFilename) + 4;
5559
- if (zip64UncompressedSize) {
5560
- setBigUint64(localHeaderView, localHeaderOffset, BigInt(uncompressedSize));
5561
- localHeaderOffset += 8;
5562
- }
5563
- if (zip64CompressedSize) {
5564
- setBigUint64(localHeaderView, localHeaderOffset, BigInt(compressedSize));
5565
- localHeaderOffset += 8;
5566
- }
5970
+ // the local zip64 extra field always contains both size slots
5971
+ const localHeaderOffset = HEADER_SIZE + getLength(rawFilename) + 4;
5972
+ setBigUint64(localHeaderView, localHeaderOffset, BigInt(uncompressedSize));
5973
+ setBigUint64(localHeaderView, localHeaderOffset + 8, BigInt(compressedSize));
5567
5974
  }
5568
5975
  }
5569
5976
 
5570
5977
 
5571
5978
  async function closeFile(zipWriter, comment, options) {
5572
- const { files, writer } = zipWriter;
5573
- const { diskOffset } = writer;
5574
- let { diskNumber } = writer;
5575
- let offset = 0;
5979
+ const directoryDataLength = createDirectoryRecords(zipWriter.files);
5980
+ const { cdStartDiskNumber, cdStartDiskOffset } = await writeDirectoryRecords(zipWriter, directoryDataLength, options);
5981
+ await writeEndOfDirectoryRecord(zipWriter, comment, options, { cdStartDiskNumber, cdStartDiskOffset, directoryDataLength });
5982
+ }
5983
+
5984
+ function createDirectoryRecords(files) {
5576
5985
  let directoryDataLength = 0;
5577
- let directoryOffset = zipWriter.offset - diskOffset;
5578
- let filesLength = files.size;
5579
5986
  for (const [, fileEntry] of files) {
5580
5987
  const {
5581
5988
  rawFilename,
@@ -5592,24 +5999,27 @@ async function closeFile(zipWriter, comment, options) {
5592
5999
  uncompressedSize,
5593
6000
  compressedSize
5594
6001
  } = fileEntry;
5595
- const zip64Offset = fileEntry.offset > MAX_32_BITS;
5596
- const zip64DiskNumberStart = fileEntry.diskNumberStart > MAX_16_BITS;
6002
+ const zip64Offset = fileEntry.offset >= MAX_32_BITS;
6003
+ const zip64DiskNumberStart = fileEntry.diskNumberStart >= MAX_16_BITS;
5597
6004
  let rawExtraFieldZip64;
5598
6005
  if (zip64Offset || zip64DiskNumberStart || zip64UncompressedSize || zip64CompressedSize) {
5599
- let length = 4;
5600
- if (zip64UncompressedSize) length += 8;
5601
- if (zip64CompressedSize) length += 8;
5602
- if (zip64Offset) length += 8;
5603
- if (zip64DiskNumberStart) length += 4;
5604
- rawExtraFieldZip64 = new Uint8Array(length);
5605
- const zip64View = getDataView(rawExtraFieldZip64);
5606
- setUint16(zip64View, 0, EXTRAFIELD_TYPE_ZIP64);
5607
- setUint16(zip64View, 2, length - 4);
5608
- let zip64FieldOffset = 4;
5609
- if (zip64UncompressedSize) { setBigUint64(zip64View, zip64FieldOffset, BigInt(uncompressedSize)); zip64FieldOffset += 8; }
5610
- if (zip64CompressedSize) { setBigUint64(zip64View, zip64FieldOffset, BigInt(compressedSize)); zip64FieldOffset += 8; }
5611
- if (zip64Offset) { setBigUint64(zip64View, zip64FieldOffset, BigInt(fileEntry.offset)); zip64FieldOffset += 8; }
5612
- if (zip64DiskNumberStart) { setUint32(zip64View, zip64FieldOffset, fileEntry.diskNumberStart); }
6006
+ const length = 4 + (zip64UncompressedSize ? 8 : 0) + (zip64CompressedSize ? 8 : 0) + (zip64Offset ? 8 : 0) + (zip64DiskNumberStart ? 4 : 0);
6007
+ const extraFieldZip64 = createRecordWriter(length);
6008
+ extraFieldZip64.uint16(EXTRAFIELD_TYPE_ZIP64);
6009
+ extraFieldZip64.uint16(length - 4);
6010
+ if (zip64UncompressedSize) {
6011
+ extraFieldZip64.uint64(uncompressedSize);
6012
+ }
6013
+ if (zip64CompressedSize) {
6014
+ extraFieldZip64.uint64(compressedSize);
6015
+ }
6016
+ if (zip64Offset) {
6017
+ extraFieldZip64.uint64(fileEntry.offset);
6018
+ }
6019
+ if (zip64DiskNumberStart) {
6020
+ extraFieldZip64.uint32(fileEntry.diskNumberStart);
6021
+ }
6022
+ rawExtraFieldZip64 = extraFieldZip64.array;
5613
6023
  } else {
5614
6024
  rawExtraFieldZip64 = new Uint8Array();
5615
6025
  }
@@ -5617,32 +6027,41 @@ async function closeFile(zipWriter, comment, options) {
5617
6027
  fileEntry.zip64Offset = zip64Offset;
5618
6028
  fileEntry.zip64DiskNumberStart = zip64DiskNumberStart;
5619
6029
  let rawExtraFieldTimestamp;
5620
- if (extendedTimestamp) {
5621
- rawExtraFieldTimestamp = new Uint8Array(9);
5622
- const extraFieldExtendedTimestampView = getDataView(rawExtraFieldTimestamp);
5623
- setUint16(extraFieldExtendedTimestampView, 0, EXTRAFIELD_TYPE_EXTENDED_TIMESTAMP);
5624
- setUint16(extraFieldExtendedTimestampView, 2, 5);
5625
- setUint8(extraFieldExtendedTimestampView, 4, extraFieldExtendedTimestampFlag);
5626
- setUint32(extraFieldExtendedTimestampView, 5, Math.floor(lastModDate.getTime() / 1000));
6030
+ const lastModTimeUnix = getTimeUnix(lastModDate);
6031
+ if (extendedTimestamp && inUnixTimeRange(lastModTimeUnix)) {
6032
+ const extraFieldTimestamp = createRecordWriter(9);
6033
+ extraFieldTimestamp.uint16(EXTRAFIELD_TYPE_EXTENDED_TIMESTAMP);
6034
+ extraFieldTimestamp.uint16(5);
6035
+ extraFieldTimestamp.uint8(extraFieldExtendedTimestampFlag);
6036
+ extraFieldTimestamp.uint32(lastModTimeUnix);
6037
+ rawExtraFieldTimestamp = extraFieldTimestamp.array;
5627
6038
  } else {
5628
6039
  rawExtraFieldTimestamp = new Uint8Array();
5629
6040
  }
5630
6041
  fileEntry.rawExtraFieldExtendedTimestamp = rawExtraFieldTimestamp;
5631
- directoryDataLength += 46 +
5632
- getLength(
5633
- rawFilename,
5634
- rawComment,
5635
- rawExtraFieldZip64,
5636
- rawExtraFieldAES,
5637
- rawExtraFieldNTFS,
5638
- rawExtraFieldUnix,
5639
- rawExtraFieldTimestamp,
5640
- rawExtraField);
6042
+ const extraFieldLength = getLength(
6043
+ rawExtraFieldZip64,
6044
+ rawExtraFieldAES,
6045
+ rawExtraFieldNTFS,
6046
+ rawExtraFieldUnix,
6047
+ rawExtraFieldTimestamp,
6048
+ rawExtraField);
6049
+ if (extraFieldLength > MAX_16_BITS) {
6050
+ throw new Error(ERR_INVALID_EXTRAFIELD_DATA);
6051
+ }
6052
+ directoryDataLength += CENTRAL_FILE_HEADER_LENGTH + getLength(rawFilename, rawComment) + extraFieldLength;
5641
6053
  }
6054
+ return directoryDataLength;
6055
+ }
6056
+
6057
+ async function writeDirectoryRecords(zipWriter, directoryDataLength, options) {
6058
+ const { files, writer } = zipWriter;
5642
6059
  const directoryArray = new Uint8Array(directoryDataLength);
5643
- const directoryView = getDataView(directoryArray);
5644
6060
  await initStream(writer);
6061
+ let offset = 0;
5645
6062
  let directoryDiskOffset = 0;
6063
+ let cdStartDiskNumber = writer.diskNumber;
6064
+ let cdStartDiskOffset = writer.diskOffset;
5646
6065
  for (const [indexFileEntry, fileEntry] of Array.from(files.values()).entries()) {
5647
6066
  const {
5648
6067
  offset: fileEntryOffset,
@@ -5668,52 +6087,46 @@ async function closeFile(zipWriter, comment, options) {
5668
6087
  compressedSize
5669
6088
  } = fileEntry;
5670
6089
  const extraFieldLength = getLength(rawExtraFieldZip64, rawExtraFieldAES, rawExtraFieldExtendedTimestamp, rawExtraFieldNTFS, rawExtraFieldUnix, rawExtraField);
5671
- setUint32(directoryView, offset, CENTRAL_FILE_HEADER_SIGNATURE);
5672
- setUint16(directoryView, offset + 4, versionMadeBy);
6090
+ const directoryRecordLength = CENTRAL_FILE_HEADER_LENGTH + getLength(rawFilename, rawComment) + extraFieldLength;
6091
+ if (offset + directoryRecordLength - directoryDiskOffset > writer.availableSize) {
6092
+ await writeData(writer, directoryArray.slice(directoryDiskOffset, offset));
6093
+ directoryDiskOffset = offset;
6094
+ writer.availableSize = 0;
6095
+ await writeData(writer, new Uint8Array());
6096
+ }
6097
+ if (indexFileEntry == 0) {
6098
+ cdStartDiskNumber = writer.diskNumber;
6099
+ cdStartDiskOffset = writer.diskOffset;
6100
+ }
5673
6101
  if (!zip64UncompressedSize) {
5674
6102
  setUint32(headerView, HEADER_OFFSET_UNCOMPRESSED_SIZE, uncompressedSize);
5675
6103
  }
5676
6104
  if (!zip64CompressedSize) {
5677
6105
  setUint32(headerView, HEADER_OFFSET_COMPRESSED_SIZE, compressedSize);
5678
6106
  }
5679
- arraySet(directoryArray, headerArray, offset + 6);
5680
- let directoryOffset = offset + HEADER_SIZE;
5681
- setUint16(directoryView, directoryOffset, extraFieldLength);
5682
- directoryOffset += 2;
5683
- setUint16(directoryView, directoryOffset, getLength(rawComment));
5684
- directoryOffset += 2;
5685
- setUint16(directoryView, directoryOffset, zip64DiskNumberStart ? MAX_16_BITS : diskNumberStart);
5686
- directoryOffset += 2;
5687
- setUint16(directoryView, directoryOffset, internalFileAttributes);
5688
- directoryOffset += 2;
5689
- if (externalFileAttributes) {
5690
- setUint32(directoryView, directoryOffset, externalFileAttributes);
5691
- }
5692
- directoryOffset += 4;
5693
- setUint32(directoryView, directoryOffset, zip64Offset ? MAX_32_BITS : fileEntryOffset);
5694
- directoryOffset += 4;
5695
- arraySet(directoryArray, rawFilename, directoryOffset);
5696
- directoryOffset += getLength(rawFilename);
5697
- arraySet(directoryArray, rawExtraFieldZip64, directoryOffset);
5698
- directoryOffset += getLength(rawExtraFieldZip64);
5699
- arraySet(directoryArray, rawExtraFieldAES, directoryOffset);
5700
- directoryOffset += getLength(rawExtraFieldAES);
5701
- arraySet(directoryArray, rawExtraFieldExtendedTimestamp, directoryOffset);
5702
- directoryOffset += getLength(rawExtraFieldExtendedTimestamp);
5703
- arraySet(directoryArray, rawExtraFieldNTFS, directoryOffset);
5704
- directoryOffset += getLength(rawExtraFieldNTFS);
5705
- arraySet(directoryArray, rawExtraFieldUnix, directoryOffset);
5706
- directoryOffset += getLength(rawExtraFieldUnix);
5707
- arraySet(directoryArray, rawExtraField, directoryOffset);
5708
- directoryOffset += getLength(rawExtraField);
5709
- arraySet(directoryArray, rawComment, directoryOffset);
5710
- directoryOffset += getLength(rawComment);
5711
- if (offset - directoryDiskOffset > writer.availableSize) {
5712
- writer.availableSize = 0;
5713
- await writeData(writer, directoryArray.slice(directoryDiskOffset, offset));
5714
- directoryDiskOffset = offset;
5715
- }
5716
- offset = directoryOffset;
6107
+ if ((zip64Offset || zip64DiskNumberStart) && fileEntry.version < VERSION_ZIP64) {
6108
+ setUint16(headerView, HEADER_OFFSET_VERSION, VERSION_ZIP64);
6109
+ }
6110
+ const directoryRecord = createRecordWriter(directoryRecordLength);
6111
+ directoryRecord.uint32(CENTRAL_FILE_HEADER_SIGNATURE);
6112
+ directoryRecord.uint16(versionMadeBy);
6113
+ directoryRecord.bytes(headerArray.subarray(0, HEADER_SIZE - 4 - 2));
6114
+ directoryRecord.uint16(extraFieldLength);
6115
+ directoryRecord.uint16(getLength(rawComment));
6116
+ directoryRecord.uint16(zip64DiskNumberStart ? MAX_16_BITS : diskNumberStart);
6117
+ directoryRecord.uint16(internalFileAttributes);
6118
+ directoryRecord.uint32(externalFileAttributes);
6119
+ directoryRecord.uint32(zip64Offset ? MAX_32_BITS : fileEntryOffset);
6120
+ directoryRecord.bytes(rawFilename);
6121
+ directoryRecord.bytes(rawExtraFieldZip64);
6122
+ directoryRecord.bytes(rawExtraFieldAES);
6123
+ directoryRecord.bytes(rawExtraFieldExtendedTimestamp);
6124
+ directoryRecord.bytes(rawExtraFieldNTFS);
6125
+ directoryRecord.bytes(rawExtraFieldUnix);
6126
+ directoryRecord.bytes(rawExtraField);
6127
+ directoryRecord.bytes(rawComment);
6128
+ arraySet(directoryArray, directoryRecord.array, offset);
6129
+ offset += directoryRecordLength;
5717
6130
  if (options.onprogress) {
5718
6131
  try {
5719
6132
  await options.onprogress(indexFileEntry + 1, files.size, new Entry(fileEntry));
@@ -5723,36 +6136,53 @@ async function closeFile(zipWriter, comment, options) {
5723
6136
  }
5724
6137
  }
5725
6138
  await writeData(writer, directoryDiskOffset ? directoryArray.slice(directoryDiskOffset) : directoryArray);
6139
+ return { cdStartDiskNumber, cdStartDiskOffset };
6140
+ }
6141
+
6142
+ async function writeEndOfDirectoryRecord(zipWriter, comment, options, cdInfo) {
6143
+ const { writer } = zipWriter;
6144
+ const { cdStartDiskNumber, cdStartDiskOffset } = cdInfo;
6145
+ let { directoryDataLength } = cdInfo;
6146
+ let filesLength = zipWriter.files.size;
6147
+ let diskNumber = cdStartDiskNumber;
6148
+ let directoryOffset = zipWriter.offset - cdStartDiskOffset - (cdStartDiskNumber ? zipWriter.initialOffset : 0);
5726
6149
  let lastDiskNumber = writer.diskNumber;
5727
- const { availableSize } = writer;
5728
- if (availableSize < END_OF_CENTRAL_DIR_LENGTH) {
6150
+ if (writer.availableSize < END_OF_CENTRAL_DIR_LENGTH) {
5729
6151
  lastDiskNumber++;
5730
6152
  }
5731
6153
  let zip64 = getOptionValue(zipWriter, options, PROPERTY_NAME_ZIP64);
5732
- if (directoryOffset > MAX_32_BITS || directoryDataLength > MAX_32_BITS || filesLength > MAX_16_BITS || lastDiskNumber > MAX_16_BITS) {
6154
+ if (directoryOffset >= MAX_32_BITS || directoryDataLength >= MAX_32_BITS || filesLength >= MAX_16_BITS || lastDiskNumber >= MAX_16_BITS) {
5733
6155
  if (zip64 === false) {
5734
6156
  throw new Error(ERR_UNSUPPORTED_FORMAT);
5735
6157
  } else {
5736
6158
  zip64 = true;
5737
6159
  }
5738
6160
  }
5739
- const endOfdirectoryArray = new Uint8Array(zip64 ? ZIP64_END_OF_CENTRAL_DIR_TOTAL_LENGTH : END_OF_CENTRAL_DIR_LENGTH);
5740
- const endOfdirectoryView = getDataView(endOfdirectoryArray);
5741
- offset = 0;
6161
+ const commentLength = getLength(comment);
6162
+ if (commentLength > MAX_16_BITS) {
6163
+ throw new Error(ERR_INVALID_COMMENT);
6164
+ }
6165
+ const endOfdirectoryRecord = createRecordWriter(zip64 ? ZIP64_END_OF_CENTRAL_DIR_TOTAL_LENGTH : END_OF_CENTRAL_DIR_LENGTH);
6166
+ if (getLength(endOfdirectoryRecord.array) + commentLength > writer.availableSize) {
6167
+ writer.availableSize = 0;
6168
+ await writeData(writer, new Uint8Array());
6169
+ }
6170
+ lastDiskNumber = writer.diskNumber;
5742
6171
  if (zip64) {
5743
- setUint32(endOfdirectoryView, 0, ZIP64_END_OF_CENTRAL_DIR_SIGNATURE);
5744
- setBigUint64(endOfdirectoryView, 4, BigInt(44));
5745
- setUint16(endOfdirectoryView, 12, 45);
5746
- setUint16(endOfdirectoryView, 14, 45);
5747
- setUint32(endOfdirectoryView, 16, lastDiskNumber);
5748
- setUint32(endOfdirectoryView, 20, diskNumber);
5749
- setBigUint64(endOfdirectoryView, 24, BigInt(filesLength));
5750
- setBigUint64(endOfdirectoryView, 32, BigInt(filesLength));
5751
- setBigUint64(endOfdirectoryView, 40, BigInt(directoryDataLength));
5752
- setBigUint64(endOfdirectoryView, 48, BigInt(directoryOffset));
5753
- setUint32(endOfdirectoryView, 56, ZIP64_END_OF_CENTRAL_DIR_LOCATOR_SIGNATURE);
5754
- setBigUint64(endOfdirectoryView, 64, BigInt(directoryOffset) + BigInt(directoryDataLength));
5755
- setUint32(endOfdirectoryView, 72, lastDiskNumber + 1);
6172
+ endOfdirectoryRecord.uint32(ZIP64_END_OF_CENTRAL_DIR_SIGNATURE);
6173
+ endOfdirectoryRecord.uint64(44);
6174
+ endOfdirectoryRecord.uint16(45);
6175
+ endOfdirectoryRecord.uint16(45);
6176
+ endOfdirectoryRecord.uint32(lastDiskNumber);
6177
+ endOfdirectoryRecord.uint32(diskNumber);
6178
+ endOfdirectoryRecord.uint64(filesLength);
6179
+ endOfdirectoryRecord.uint64(filesLength);
6180
+ endOfdirectoryRecord.uint64(directoryDataLength);
6181
+ endOfdirectoryRecord.uint64(directoryOffset);
6182
+ endOfdirectoryRecord.uint32(ZIP64_END_OF_CENTRAL_DIR_LOCATOR_SIGNATURE);
6183
+ endOfdirectoryRecord.uint32(lastDiskNumber);
6184
+ endOfdirectoryRecord.uint64(BigInt(zipWriter.offset) + BigInt(directoryDataLength) - BigInt(writer.diskOffset) - BigInt(writer.diskNumber ? zipWriter.initialOffset : 0));
6185
+ endOfdirectoryRecord.uint32(lastDiskNumber + 1);
5756
6186
  const supportZip64SplitFile = getOptionValue(zipWriter, options, OPTION_SUPPORT_ZIP64_SPLIT_FILE, true);
5757
6187
  if (supportZip64SplitFile) {
5758
6188
  lastDiskNumber = MAX_16_BITS;
@@ -5761,29 +6191,40 @@ async function closeFile(zipWriter, comment, options) {
5761
6191
  filesLength = MAX_16_BITS;
5762
6192
  directoryOffset = MAX_32_BITS;
5763
6193
  directoryDataLength = MAX_32_BITS;
5764
- offset += ZIP64_END_OF_CENTRAL_DIR_LENGTH + ZIP64_END_OF_CENTRAL_DIR_LOCATOR_LENGTH;
5765
- }
5766
- setUint32(endOfdirectoryView, offset, END_OF_CENTRAL_DIR_SIGNATURE);
5767
- setUint16(endOfdirectoryView, offset + 4, lastDiskNumber);
5768
- setUint16(endOfdirectoryView, offset + 6, diskNumber);
5769
- setUint16(endOfdirectoryView, offset + 8, filesLength);
5770
- setUint16(endOfdirectoryView, offset + 10, filesLength);
5771
- setUint32(endOfdirectoryView, offset + 12, directoryDataLength);
5772
- setUint32(endOfdirectoryView, offset + 16, directoryOffset);
5773
- const commentLength = getLength(comment);
5774
- if (commentLength) {
5775
- if (commentLength <= MAX_16_BITS) {
5776
- setUint16(endOfdirectoryView, offset + 20, commentLength);
5777
- } else {
5778
- throw new Error(ERR_INVALID_COMMENT);
5779
- }
5780
6194
  }
5781
- await writeData(writer, endOfdirectoryArray);
6195
+ endOfdirectoryRecord.uint32(END_OF_CENTRAL_DIR_SIGNATURE);
6196
+ endOfdirectoryRecord.uint16(lastDiskNumber);
6197
+ endOfdirectoryRecord.uint16(diskNumber);
6198
+ endOfdirectoryRecord.uint16(filesLength);
6199
+ endOfdirectoryRecord.uint16(filesLength);
6200
+ endOfdirectoryRecord.uint32(directoryDataLength);
6201
+ endOfdirectoryRecord.uint32(directoryOffset);
6202
+ endOfdirectoryRecord.uint16(commentLength);
6203
+ await writeData(writer, endOfdirectoryRecord.array);
5782
6204
  if (commentLength) {
5783
6205
  await writeData(writer, comment);
5784
6206
  }
5785
6207
  }
5786
6208
 
6209
+ function createRecordWriter(length) {
6210
+ const array = new Uint8Array(length);
6211
+ const view = getDataView(array);
6212
+ let offset = 0;
6213
+ return {
6214
+ array,
6215
+ uint8: value => { setUint8(view, offset, value); offset += 1; },
6216
+ uint16: value => { setUint16(view, offset, value); offset += 2; },
6217
+ uint32: value => { setUint32(view, offset, value); offset += 4; },
6218
+ uint64: value => { setBigUint64(view, offset, BigInt(value)); offset += 8; },
6219
+ bytes: value => { arraySet(array, value, offset); offset += getLength(value); },
6220
+ skip: count => offset += count
6221
+ };
6222
+ }
6223
+
6224
+ function getSegmentOffset(zipWriter, writer) {
6225
+ return zipWriter.offset - writer.diskOffset - (writer.diskNumber ? zipWriter.initialOffset : 0);
6226
+ }
6227
+
5787
6228
  async function writeData(writer, array) {
5788
6229
  const { writable } = writer;
5789
6230
  const streamWriter = writable.getWriter();
@@ -5796,12 +6237,40 @@ async function writeData(writer, array) {
5796
6237
  }
5797
6238
  }
5798
6239
 
6240
+ async function flushBufferedData(readable, writer, signal, onChunkWritten) {
6241
+ const streamWriter = writer.writable.getWriter();
6242
+ try {
6243
+ await readable.pipeTo(new WritableStream({
6244
+ async write(chunk) {
6245
+ await streamWriter.ready;
6246
+ await streamWriter.write(chunk);
6247
+ onChunkWritten(getLength(chunk));
6248
+ }
6249
+ }), { preventClose: true, preventAbort: true, signal });
6250
+ } finally {
6251
+ streamWriter.releaseLock();
6252
+ }
6253
+ }
6254
+
5799
6255
  function getTimeNTFS(date) {
5800
6256
  if (date) {
5801
6257
  return ((BigInt(date.getTime()) + BigInt(11644473600000)) * BigInt(10000));
5802
6258
  }
5803
6259
  }
5804
6260
 
6261
+ function getTimeUnix(date) {
6262
+ return Math.floor(date.getTime() / 1000);
6263
+ }
6264
+
6265
+ // the extended timestamp extra field stores dates as signed 32-bit time_t values
6266
+ function inUnixTimeRange(timeUnix) {
6267
+ return timeUnix >= MIN_UNIX_TIME && timeUnix <= MAX_UNIX_TIME;
6268
+ }
6269
+
6270
+ function clampUnixTime(timeUnix) {
6271
+ return Math.min(MAX_UNIX_TIME, Math.max(MIN_UNIX_TIME, timeUnix));
6272
+ }
6273
+
5805
6274
  function getOptionValue(zipWriter, options, name, defaultValue) {
5806
6275
  const result = options[name] === UNDEFINED_VALUE ? zipWriter.options[name] : options[name];
5807
6276
  return result === UNDEFINED_VALUE ? defaultValue : result;
@@ -5832,7 +6301,7 @@ function arraySet(array, typedArray, offset) {
5832
6301
  }
5833
6302
 
5834
6303
  function getDataView(array) {
5835
- return new DataView(array.buffer);
6304
+ return new DataView(array.buffer, array.byteOffset, array.byteLength);
5836
6305
  }
5837
6306
 
5838
6307
  function getLength(...arrayLikes) {
@@ -5848,30 +6317,39 @@ function getHeaderArrayData({
5848
6317
  uncompressedSize,
5849
6318
  compressedSize,
5850
6319
  lastModDate,
6320
+ rawLastModDate,
5851
6321
  rawFilename,
5852
6322
  zip64CompressedSize,
5853
6323
  zip64UncompressedSize,
5854
6324
  extraFieldLength
5855
6325
  }) {
5856
- const headerArray = new Uint8Array(HEADER_SIZE - 4);
6326
+ const headerRecord = createRecordWriter(HEADER_SIZE - 4);
6327
+ const headerArray = headerRecord.array;
5857
6328
  const headerView = getDataView(headerArray);
5858
- setUint16(headerView, 0, version);
5859
- setUint16(headerView, 2, bitFlag);
5860
- setUint16(headerView, 4, compressionMethod);
5861
- const dateArray = new Uint32Array(1);
5862
- const dateView = getDataView(dateArray);
5863
- setUint16(dateView, 0, (((lastModDate.getHours() << 6) | lastModDate.getMinutes()) << 5) | lastModDate.getSeconds() / 2);
5864
- setUint16(dateView, 2, ((((lastModDate.getFullYear() - 1980) << 4) | (lastModDate.getMonth() + 1)) << 5) | lastModDate.getDate());
5865
- const rawLastModDate = dateArray[0];
5866
- setUint32(headerView, 6, rawLastModDate);
6329
+ headerRecord.uint16(version);
6330
+ headerRecord.uint16(bitFlag);
6331
+ headerRecord.uint16(compressionMethod);
6332
+ if (rawLastModDate === UNDEFINED_VALUE) {
6333
+ const dateArray = new Uint32Array(1);
6334
+ const dateView = getDataView(dateArray);
6335
+ setUint16(dateView, 0, (((lastModDate.getHours() << 6) | lastModDate.getMinutes()) << 5) | lastModDate.getSeconds() / 2);
6336
+ setUint16(dateView, 2, ((((lastModDate.getFullYear() - 1980) << 4) | (lastModDate.getMonth() + 1)) << 5) | lastModDate.getDate());
6337
+ rawLastModDate = dateArray[0];
6338
+ }
6339
+ headerRecord.uint32(rawLastModDate);
6340
+ headerRecord.skip(4);
5867
6341
  if (zip64CompressedSize || compressedSize !== UNDEFINED_VALUE) {
5868
- setUint32(headerView, HEADER_OFFSET_COMPRESSED_SIZE, zip64CompressedSize ? MAX_32_BITS : compressedSize);
6342
+ headerRecord.uint32(zip64CompressedSize ? MAX_32_BITS : compressedSize);
6343
+ } else {
6344
+ headerRecord.skip(4);
5869
6345
  }
5870
6346
  if (zip64UncompressedSize || uncompressedSize !== UNDEFINED_VALUE) {
5871
- setUint32(headerView, HEADER_OFFSET_UNCOMPRESSED_SIZE, zip64UncompressedSize ? MAX_32_BITS : uncompressedSize);
6347
+ headerRecord.uint32(zip64UncompressedSize ? MAX_32_BITS : uncompressedSize);
6348
+ } else {
6349
+ headerRecord.skip(4);
5872
6350
  }
5873
- setUint16(headerView, 22, getLength(rawFilename));
5874
- setUint16(headerView, 24, extraFieldLength);
6351
+ headerRecord.uint16(getLength(rawFilename));
6352
+ headerRecord.uint16(extraFieldLength);
5875
6353
  return {
5876
6354
  headerArray,
5877
6355
  headerView,
@@ -5972,7 +6450,7 @@ try {
5972
6450
  // ignored
5973
6451
  }
5974
6452
 
5975
- var{Uint8Array:x,Uint16Array:E,Int32Array:H,TransformStream:U,Math:N,Error:z,Array:v}=globalThis,Se=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],F=new x(0),qe=new E(0),de=[];for(let e=0;e<6;e++)de.push(e,0==e?8:4);de.push(0,1);var Ee=[];for(let e=0;e<14;e++)Ee.push(e,0==e?4:2);var ge=new E([0,1,2,3,4,6,8,12,16,24,32,48,64,96,128,192,256,384,512,768,1024,1536,2048,3072,4096,6144,8192,12288,16384,24576]),Te=new E([0,1,2,3,4,5,6,7,8,10,12,14,16,20,24,28,32,40,48,56,64,80,96,112,128,160,192,224,0]);function M(e,t,n,r,i){if(0==i)return;let f=e instanceof x?e:new x(e.buffer,e.byteOffset,e.byteLength),_=n instanceof x?n.subarray(r,r+i):new x(n.buffer,n.byteOffset+r,i);f.set(_,t);}function je(e,t,n){0!=n&&(e instanceof x?e:new x(e.buffer,e.byteOffset,e.byteLength)).fill(0,t,t+n);}function Ve(){return {next_in:F,next_in_index:0,avail_in:0,total_in:0,next_out:F,next_out_index:0,avail_out:0,total_out:0,msg:"",t:0,i:0,_:0,l:void 0}}function Je(e,t){let n=1<<t;return {o:e,u:new x(n),h:n,v:t,k:0,m:0,p:0,I:0}}function te(e){let t=[];for(let n=0;n<e.length;n+=2){let r=e[n],i=e[n+1];for(let e=0;e<i;e++)t.push(r);}return new E(t)}var ne=class{constructor(e,t){this.L=e,this.M=t,this.F=0;}},re=class{constructor(e,t,n,r,i){this.q=e,this.N=t,this.V=n,this.W=r,this.S=i;}};function g_(e){return V_[e<-6||e>2?9:2-e]||""}function Ae(e,t){try{e.msg=g_(t);}catch(n){e.msg="zlib error "+String(t)+" ("+n+")";}return t}function $e(e,t){let n=e>>>0,r=0;for(let e=0;e<t;e++)r=r<<1|1&n,n>>>=1;return r}function g(e,t){e.$[e.A++]=t;}function De(e,t){g(e,255&t),g(e,t>>>8&255);}function e_(e,t,n){let r=255&n,i=65535&t,f=e.U+e.D;return e.$[f]=255&i,e.$[f+1]=i>>>8&255,e.$[f+2]=r,e.D+=3,i=i-1&65535,e.C[__[r]+ie+1].Z++,e.T[T_(i)].Z++,e.D==e.B}function ye(e,t){let n=255&t,r=e.U+e.D;return e.$[r]=0,e.$[r+1]=0,e.$[r+2]=n,e.D+=3,e.C[n].Z++,e.D==e.B}function ve(e){return e.h-ae}function T_(e){return e<256?E_[e]:E_[256+(e>>7)]}function w_(e){let t=He+7,n=1<<t,r=(1<<t)-1,i=N.floor((t+I-1)/I),f=1<<8+He;return {...Je(e,15),o:e,R:42,G:0,O:void 0,P:32767,H:t,J:n,X:r,Y:i,j:new E(32768),K:new E(n),ee:f,$:new x(32768),te:0,ne:32768,A:0,re:0,ie:0,fe:0,_e:0,le:0,oe:-2,ue:0,ae:0,ce:0,se:0,he:0,de:0,we:0,be:0,ge:0,ve:0,ke:0,me:0,xe:0,ye:0,pe:new H(2*we+1),Ie:new x(2*we+1),ze:new E(be+1),D:0,B:0,Le:F,U:0,Ee:0,Me:0,Fe:8,qe:32768,Ne:0,Ve:0,We:0,C:new v(le).fill(0).map(()=>Q()),T:new v(2*me+1).fill(0).map(()=>Q()),Se:new v(2*oe+1).fill(0).map(()=>Q()),$e:S_(),Ae:S_(),Ue:S_()}}function A_(e){let t=[];for(let n=0;n<e.length;n+=2){let r=e[n],i=e[n+1],f=Q();f.Qe=r,f.De=i,t.push(f);}return t}function Q(){return {Z:0,Qe:0,Ze:0,De:0}}function S_(){return new ne([],mn(null,F,0,0,0))}function mn(e,t,n,r,i){return new re(e,t,n,r,i)}function J_(){let e=new v(288).fill(0);for(let t=0;t<=143;t++)e[t]=8;for(let t=144;t<=255;t++)e[t]=9;for(let t=256;t<=279;t++)e[t]=7;for(let t=280;t<=287;t++)e[t]=8;return e}function D_(e){let{code:t,length:n}=bn(e),r=new E(2*e.length),i=0;for(let f=0;f<e.length;f++){let e=n[f]||0,_=t[f]||0;r[i++]=e?$e(_,e):0,r[i++]=e;}return new E(r)}function Q_(e,t,n){let r=0;for(let n=0;n<e.length;n++){let i=t[n]?1<<t[n]:1,f=e[n]+i-1;f>r&&(r=f);}r<n&&(r=n);let i=new x(r+1);for(let n=0;n<=r;n++)for(let r=0;r<e.length;r++){let f=t[r]?1<<t[r]:1,_=e[r];if(n>=_&&n<=_+f-1){i[n]=r;break}}return i}function $_(e,t){let n=0;for(let r=0;r<e.length;r++){let i=t[r]?1<<t[r]:1,f=e[r]+i-1;f>n&&(n=f);}let r=new x(n+1);for(let i=0;i<=n;i++)for(let n=0;n<e.length;n++){let f=t[n]?1<<t[n]:1,_=e[n];if(i>=_&&i<=_+f-1){r[i]=n;break}}return r}function et(e){let t=new x(512),n=e.length-1;for(let r=0;r<256;r++)t[r]=r<=n?e[r]:e[n];for(let r=256;r<=n;r++){let n=r>>7;t[256+(n>255?255:n)]=e[r];}for(let e=257;e<512;e++)0==t[e]&&(t[e]=t[e-1]);return t}function bn(e){let t=N.max(...e),n=new v(t+1).fill(0);for(let t of e)t>0&&n[t]++;let r=new v(e.length).fill(0),i=new v(t+1).fill(0),f=0;for(let e=1;e<=t;e++)f=f+n[e-1]<<1,i[e]=f;for(let t=0;t<e.length;t++){let n=e[t];0!=n&&(r[t]=i[n]++);}return {code:r,length:e}}var He=8,I=3,_e=258,ae=_e+I+1,Ue=16,Be=_e,hn=29,ie=256,we=ie+1+hn,me=30,oe=19,le=2*we+1,be=15,_t=9,tt=255,nt=32,rt=4,ke=256,t_=16,n_=17,r_=18,at=0,y_=1,it=2,$=-1,V_=["need dictionary","stream end","","file error","stream error","data error","insufficient memory","buffer error",""],a_=te(de),i_=te(Ee),Ze=new E(19);Ze[16]=2,Ze[17]=3,Ze[18]=7;var sn=D_(J_()),xn=D_(new v(30).fill(5)),Fe=A_(sn),v_=A_(xn),__=Q_(Te,a_,_e),E_=et($_(ge,i_));function Pe(e){return e%65521>>>0}function he(e,t,n){if(void 0===t||void 0===n)return 1;let r=e>>>16&65535;if(e&=65535,1==n)return (e+=t[0])>=65521&&(e-=65521),r+=e,r>=65521&&(r-=65521),(r<<16|e)>>>0;if(n<16){for(let i=0;i<n;i++)r+=e+=t[i];return e>=65521&&(e-=65521),r=Pe(r),(r<<16|e)>>>0}for(;n>=5552;){n-=5552;let i=N.floor(347);do{for(let n=0;n<16;n++)r+=e+=t[n];t=t.subarray(16);}while(--i);e=Pe(e),r=Pe(r);}if(n){for(;n>=16;){n-=16;for(let n=0;n<16;n++)r+=e+=t[n];t=t.subarray(16);}for(let i=0;i<n;i++)r+=e+=t[i];e=Pe(e),r=Pe(r);}return (r<<16|e)>>>0}var pn=(()=>{let e=new v(256);for(let t=0;t<256;t++){let n=t;for(let e=0;e<8;e++)n=1&n?3988292384^n>>>1:n>>>1;e[t]=n>>>0;}return e})();function W(e=0,t,n){if(!t)return 0;void 0===n&&(n=t.length),n=N.min(n,t.length),e=~e>>>0;for(let r=0;r<n;r++)e=e>>>8^pn[255&(e^t[r])];return (4294967295^e)>>>0}function mt(e){16==e.I?(De(e,e.p),e.p=0,e.I=0):e.I>=8&&(g(e,e.p),e.p>>=8,e.I-=8);}function bt(e){e.I>8?De(e,e.p):e.I>0&&g(e,e.p),e.Ee=1+(e.I-1&7),e.p=0,e.I=0;}function Sn(e,t,n){let r,i,f=[],_=0;for(r=1;r<=be;r++)_=_+n[r-1]<<1,f[r]=_;for(i=0;i<=t;i++){let t=e[i].De;0!=t&&(e[i].Qe=$e(f[t]++,t));}}function L(e,t,n){e.I>Ue-n?(e.p=65535&(e.p|t<<e.I),De(e,e.p),e.p=t>>Ue-e.I&65535,e.I+=n-Ue):(e.p=65535&(e.p|t<<e.I),e.I+=n);}function ht(e){for(let t=0;t<e.C.length;t++)e.C[t].Z=0;for(let t=0;t<e.T.length;t++)e.T[t].Z=0;for(let t=0;t<e.Se.length;t++)e.Se[t].Z=0;e.C[ke].Z=1,e.ie=e.fe=0,e.D=e._e=0;}function st(e){if(e.C&&e.C.length>=le)for(let t=0;t<le;t++)e.C[t]=Q();else {e.C=[];for(let t=0;t<le;t++)e.C.push(Q());}if(e.T&&e.T.length>=2*me+1)for(let t=0;t<2*me+1;t++)e.T[t]=Q();else {e.T=[];for(let t=0;t<2*me+1;t++)e.T.push(Q());}if(e.Se&&e.Se.length>=2*oe+1)for(let t=0;t<2*oe+1;t++)e.Se[t]=Q();else {e.Se=[];for(let t=0;t<2*oe+1;t++)e.Se.push(Q());}e.$e=new ne(e.C,new re(Fe,a_,ie+1,we,be)),e.Ae=new ne(e.T,new re(v_,i_,0,me,be)),e.Ue=new ne(e.Se,new re(null,Ze,0,oe,7)),e.p=0,e.I=0,e.Ee=0,ht(e);}var se=1;function En(e,t,n){return n=e.pe[se],e.pe[se]=e.pe[e.Ve--],k_(e,t,se),n}function ft(e,t,n,r){return e[t].Z<e[n].Z||e[t].Z==e[n].Z&&r[t]<=r[n]}function k_(e,t,n){let r=e.pe[n],i=n<<1;for(;i<=e.Ve&&(i<e.Ve&&ft(t,e.pe[i+1],e.pe[i],e.Ie)&&i++,!ft(t,r,e.pe[i],e.Ie));)e.pe[n]=e.pe[i],n=i,i<<=1;e.pe[n]=r;}function gn(e,t){let n,r,i,f,_,l,o=t.L,u=t.F,a=t.M.q,c=t.M.N,s=t.M.V,h=t.M.S,d=0;for(f=0;f<=be;f++)e.ze[f]=0;for(o[e.pe[e.We]].De=0,n=e.We+1;n<le;n++)r=e.pe[n],f=o[o[r].Ze].De+1,f>h&&(f=h,d++),o[r].De=f,!(r>u)&&(e.ze[f]++,_=0,r>=s&&(_=c[r-s]),l=o[r].Z,e.ie+=l*(f+_),a&&(e.fe+=l*(a[r].De+_)));if(0!=d){do{for(f=h-1;0==e.ze[f];)f--;e.ze[f]--,e.ze[f+1]+=2,e.ze[h]--,d-=2;}while(d>0);for(f=h;0!=f;f--)for(r=e.ze[f];0!=r;)i=e.pe[--n],!(i>u)&&(o[i].De!=f&&(e.ie+=(f-o[i].De)*o[i].Z,o[i].De=f),r--);}}function I_(e,t){let n,r,i,f=t.L,_=t.M.q,l=t.M.W,o=-1;for(e.Ve=0,e.We=le,n=0;n<l;n++)0!=f[n].Z?(e.pe[++e.Ve]=o=n,e.Ie[n]=0):f[n].De=0;for(;e.Ve<2;)i=e.pe[++e.Ve]=o<2?++o:0,f[i].Z=1,e.Ie[i]=0,e.ie--,_&&(e.fe-=_[i].De);for(t.F=o,n=N.floor(e.Ve/2);n>=1;n--)k_(e,f,n);i=l;do{n=En(e,f,n),r=e.pe[se],e.pe[--e.We]=n,e.pe[--e.We]=r,f[i].Z=f[n].Z+f[r].Z,e.Ie[i]=(e.Ie[n]>=e.Ie[r]?e.Ie[n]:e.Ie[r])+1,f[n].Ze=f[r].Ze=i,e.pe[se]=i++,k_(e,f,se);}while(e.Ve>=2);e.pe[--e.We]=e.pe[se],gn(e,t),Sn(f,t.F,e.ze);}function ut(e,t,n){let r,i,f=-1,_=t[0].De,l=0,o=7,u=4;for(0==_&&(o=138,u=3),t[n+1].De=65535,r=0;r<=n;r++)i=_,_=t[r+1].De,!(++l<o&&i==_)&&(l<u?e.Se[i].Z+=l:0!=i?(i!=f&&e.Se[i].Z++,e.Se[t_].Z++):l<=10?e.Se[n_].Z++:e.Se[r_].Z++,l=0,f=i,0==_?(o=138,u=3):i==_?(o=6,u=3):(o=7,u=4));}function ct(e,t,n){let r,i=-1,f=t[0].De,_=0,l=7,o=4;0==f&&(l=138,o=3);for(let u=0;u<=n;u++)if(r=f,f=t[u+1].De,!(++_<l&&r==f)){if(_<o)do{L(e,e.Se[r].Qe,e.Se[r].De);}while(0!=--_);else 0!=r?(r!=i&&(L(e,e.Se[r].Qe,e.Se[r].De),_--),L(e,e.Se[t_].Qe,e.Se[t_].De),L(e,_-3,2)):_<=10?(L(e,e.Se[n_].Qe,e.Se[n_].De),L(e,_-3,3)):(L(e,e.Se[r_].Qe,e.Se[r_].De),L(e,_-11,7));_=0,i=r,0==f?(l=138,o=3):r==f?(l=6,o=3):(l=7,o=4);}}function Tn(e){let t;for(ut(e,e.C,e.$e.F),ut(e,e.T,e.Ae.F),I_(e,e.Ue),t=oe-1;t>=3&&0==e.Se[Se[t]].De;t--);return e.ie+=3*(t+1)+5+5+4,t}function wn(e,t,n,r){let i;for(L(e,t-257,5),L(e,n-1,5),L(e,r-4,4),i=0;i<r;i++)L(e,e.Se[Se[i]].De,3);ct(e,e.C,t-1),ct(e,e.T,n-1);}function Me(e,t,n,r,i=0){L(e,(at<<1)+r,3),bt(e),De(e,n),De(e,~n),n&&t&&M(e.$,e.A,t,i,n),e.A+=n;}function xt(e){mt(e);}function pt(e){L(e,y_<<1,3),L(e,Fe[ke].Qe,Fe[ke].De),mt(e);}function dt(e,t,n){let r,i,f,_,l=0;if(0!=e.D)do{r=255&e.Le[l],r+=(255&e.Le[l+1])<<8,i=e.Le[l+2],l+=3,0==r?L(e,t[i].Qe,t[i].De):(f=__[i],L(e,t[f+ie+1].Qe,t[f+ie+1].De),_=a_[f],0!=_&&(i-=Te[f],L(e,i,_)),r--,f=T_(r),L(e,n[f].Qe,n[f].De),_=i_[f],0!=_&&(r-=ge[f],L(e,r,_)));}while(l<e.D);L(e,t[ke].Qe,t[ke].De);}function An(e){let t,n=4093624447;for(t=0;t<=31;t++,n>>=1)if(1&n&&0!=e.C[t].Z)return 0;if(0!=e.C[9].Z||0!=e.C[10].Z||0!=e.C[13].Z)return 1;for(t=32;t<ie;t++)if(0!=e.C[t].Z)return 1;return 0}function St(e,t,n,r,i=0){let f,_,l=0;e.ge>0?(2==e.o.t&&(e.o.t=An(e)),I_(e,e.$e),I_(e,e.Ae),l=Tn(e),f=e.ie+3+7>>3,_=e.fe+3+7>>3,(_<=f||4==e.ve)&&(f=_)):f=_=n+5,n+4<=f&&t?Me(e,t,n,r,i):_==f?(L(e,(y_<<1)+r,3),dt(e,Fe,v_)):(L(e,(it<<1)+r,3),wn(e,e.$e.F+1,e.Ae.F+1,l+1),dt(e,e.C,e.T)),ht(e),r&&bt(e);}function wt(){let e=Ve();return e.l=w_(e),e}var Xe=[{Ce:It,Te:0,Be:0,Re:0,Ge:0},{Ce:z_,Te:4,Be:4,Re:8,Ge:4},{Ce:z_,Te:5,Be:5,Re:16,Ge:8},{Ce:z_,Te:6,Be:16,Re:32,Ge:32},{Ce:Re,Te:4,Be:4,Re:16,Ge:16},{Ce:Re,Te:16,Be:8,Re:16,Ge:32},{Ce:Re,Te:16,Be:16,Re:32,Ge:128},{Ce:Re,Te:32,Be:32,Re:128,Ge:256},{Ce:Re,Te:128,Be:128,Re:256,Ge:1024},{Ce:Re,Te:258,Be:258,Re:258,Ge:4096}];function Et(e){return 2*e-(e>4?9:0)}function f_(e,t,n){return ((t<<e.Y^n)&e.X)>>>0}function u_(e,t){e.be=f_(e,e.be,e.u[t+(I-1)]);let n=e.j[t&e.P]=e.K[e.be];return e.K[e.be]=t,n}function At(e){e.K[e.J-1]=0,je(e.K,0,(e.J-1)*e.K.BYTES_PER_ELEMENT);}function Nn(e){let t,n,r=e.h;for(t=e.J;t>0;)t--,n=e.K[t],e.K[t]=n>=r?n-r:0;for(t=r;t>0;)t--,n=e.j[t],e.j[t]=n>=r?n-r:0;}function C_(e,t,n,r){let i=e.avail_in;return i>r&&(i=r),0==i?0:(e.avail_in-=i,M(t,n,e.next_in,e.next_in_index,i),1==e.l.G?e.i=he(e.i,new x(t.buffer,t.byteOffset+n,i),i):2==e.l.G&&(e.i=W(e.i,new x(t.buffer,t.byteOffset+n,i),i)),e.next_in_index+=i,e.total_in+=i,i)}function c_(e){let t,n,r=e.h;do{if(n=e.qe-e.ce-e.ae,0==n&&0==e.ae&&0==e.ce?n=r:-1==n&&n--,e.ae>=r+ve(e)&&(M(e.u,0,e.u,r,r-n),e.Ne-=r,e.ae-=r,e.ue-=r,e.le>e.ae&&(e.le=e.ae),Nn(e),n+=r),0==e.o.avail_in)break;if(t=C_(e.o,e.u,e.ae+e.ce,n),e.ce+=t,e.ce+e.le>=I){let t=e.ae-e.le;for(e.be=e.u[t],e.be=f_(e,e.be,e.u[t+1]);e.le&&(e.be=f_(e,e.be,e.u[t+I-1]),e.j[t&e.P]=e.K[e.be],e.K[e.be]=t,t++,e.le--,!(e.ce+e.le<I)););}}while(e.ce<ae&&0!=e.o.avail_in);if(e.k<e.qe){let t,n=e.ae+e.ce;e.k<n?(t=e.qe-n,t>Be&&(t=Be),je(e.u,n,t),e.k=n+t):e.k<n+Be&&(t=n+Be-e.k,t>e.qe-e.k&&(t=e.qe-e.k),je(e.u,e.k,t),e.k+=t);}}function Dt(e,t,n=8,r=15,i=He,f=0){let _=1;if(!e)return -2;if(e.msg="",-1==t&&(t=6),r<0){if(_=0,r<-15)return -2;r=-r;}else r>15&&(_=2,r-=16);if(i<1||i>_t||8!=n||r<8||r>15||t<0||t>9||f<0||f>4||8==r&&1!=_)return -2;8==r&&(r=9);let l=w_(e);return l?(e.l=l,l.o=e,l.R=42,l.G=_,l.O=void 0,l.v=r,l.h=1<<l.v,l.P=l.h-1,l.H=i+7,l.J=1<<l.H,l.X=l.J-1,l.Y=(l.H+I-1)/I,l.u=new x(2*l.h),l.j=new E(l.h),l.K=new E(l.J),l.k=0,l.ee=1<<i+6,l.$=new x(l.ee*rt),l.ne=4*l.ee,l.u&&l.j&&l.K&&l.$?(l.Le=l.$.subarray(l.ee),l.U=l.te+l.ee,l.B=3*(l.ee-1),l.ge=t,l.ve=f,l.Fe=n,Cn(e)):(l.R=666,e.msg=g_(-4),B_(e),-4)):-4}function U_(e){if(null==e)return true;let t=e.l;return !t||t.o!=e||42!=t.R&&57!=t.R&&69!=t.R&&73!=t.R&&91!=t.R&&103!=t.R&&113!=t.R&&666!=t.R}function Rn(e){let t;return U_(e)?-2:(e.total_in=e.total_out=0,e.msg="",e.t=2,t=e.l,t.A=0,t.re=t.te,t.G<0&&(t.G=-t.G),t.R=2==t.G?57:42,e.i=2==t.G?W(0):he(0),t.oe=-2,st(t),0)}function zn(e){e.qe=2*e.h,At(e),e.ye=Xe[e.ge].Te,e.ke=Xe[e.ge].Be,e.me=Xe[e.ge].Re,e.xe=Xe[e.ge].Ge,e.ae=0,e.ue=0,e.ce=0,e.le=0,e.se=e.he=I-1,e.we=0,e.be=0;}function Cn(e){let t=Rn(e);return 0==t&&zn(e.l),t}function Ye(e,t){g(e,t>>8),g(e,255&t);}function q(e){let t,n=e.l;xt(n),t=n.A,t>e.avail_out&&(t=e.avail_out),0!=t&&(M(e.next_out,e.next_out_index,n.$,n.re,t),e.next_out_index+=t,n.re+=t,e.total_out+=t,e.avail_out-=t,n.A-=t,0==n.A&&(n.re=n.te));}function Ie(e,t){let n=e.l;n.O&&n.O.Oe&&(e.i=W(e.i,new x(n.$.buffer,n.te+t,n.A-t),n.A-t));}function yt(e,t){let n,r=e.l;if(U_(e)||t>5||t<0)return Ae(e,-2);if(!e.next_out||0!=e.avail_in&&!e.next_in||666==r.R&&4!=t)return Ae(e,-2);if(0==e.avail_out)return Ae(e,-5);if(n=r.oe,r.oe=t,0!=r.A){if(q(e),0==e.avail_out)return r.oe=$,0}else if(0==e.avail_in&&Et(t)<=Et(n)&&4!=t)return Ae(e,-5);if(666==r.R&&0!=e.avail_in)return Ae(e,-5);if(42==r.R&&0==r.G&&(r.R=113),42==r.R){let t,n=8+(r.v-8<<4)<<8;if(t=r.ve>=2||r.ge<2?0:r.ge<6?1:6==r.ge?2:3,n|=t<<6,0!=r.ae&&(n|=nt),n+=31-n%31,Ye(r,n),0!=r.ae&&(Ye(r,e.i>>16),Ye(r,65535&e.i)),e.i=1,r.R=113,q(e),0!=r.A)return r.oe=$,0}if(57==r.R)if(e.i=W(0),g(r,31),g(r,139),g(r,8),r.O)g(r,(r.O.Pe?1:0)+(r.O.Oe?2:0)+(null==r.O.He?0:4)+(null==r.O.Je?0:8)+(null==r.O.Xe?0:16)),g(r,255&r.O.Ye),g(r,r.O.Ye>>>8&255),g(r,r.O.Ye>>>16&255),g(r,r.O.Ye>>>24&255),g(r,9==r.ge?2:r.ve>=2||r.ge<2?4:0),g(r,255&r.O.je),null!=r.O.He&&(g(r,255&r.O.Ke),g(r,r.O.Ke>>>8&255)),r.O.Oe&&(e.i=W(e.i,r.$,r.A)),r.Me=0,r.R=69;else if(g(r,0),g(r,0),g(r,0),g(r,0),g(r,0),g(r,9==r.ge?2:r.ve>=2||r.ge<2?4:0),g(r,tt),r.R=113,q(e),0!=r.A)return r.oe=$,0;if(69==r.R){if(r.O&&null!=r.O.He){let t=r.A,n=(65535&r.O.Ke)-r.Me;for(;r.A+n>r.ne;){let i=r.ne-r.A;if(M(r.$,r.A,r.O.He,r.Me,i),r.A=r.ne,Ie(e,t),r.Me+=i,q(e),0!=r.A)return r.oe=$,0;t=0,n-=i;}M(r.$,r.A,r.O.He,r.Me,n),r.A+=n,Ie(e,t),r.Me=0;}r.R=73;}if(73==r.R){if(r.O&&r.O.Je&&r.O.Je.length){let t,n=r.A;do{if(r.A==r.ne){if(Ie(e,n),q(e),0!=r.A)return r.oe=$,0;n=0;}t=r.O.Je[r.Me++],g(r,t);}while(0!=t);Ie(e,n),r.Me=0;}r.R=91;}if(91==r.R){if(r.O&&r.O.Xe&&r.O.Xe.length){let t,n=r.A;do{if(r.A==r.ne){if(Ie(e,n),q(e),0!=r.A)return r.oe=$,0;n=0;}t=r.O.Xe[r.Me++],g(r,t);}while(0!=t);Ie(e,n);}r.R=103;}if(103==r.R){if(r.O&&r.O.Oe){if(r.A+2>r.ne&&(q(e),0!=r.A))return r.oe=$,0;g(r,255&e.i),g(r,e.i>>>8&255),e.i=W(0);}if(r.R=113,q(e),0!=r.A)return r.oe=$,0}if(0!=e.avail_in||0!=r.ce||0!=t&&666!=r.R){let n=0==r.ge?It(r,t):2==r.ve?On(r,t):3==r.ve?Ln(r,t):Xe[r.ge].Ce(r,t);if((2==n||3==n)&&(r.R=666),0==n||2==n)return 0==e.avail_out&&(r.oe=$),0;if(1==n&&(1==t?pt(r):5!=t&&(Me(r,null,0,0),3==t&&(At(r),0==r.ce&&(r.ae=0,r.ue=0,r.le=0))),q(e),0==e.avail_out))return r.oe=$,0}return 4!=t?0:r.G<=0?1:(2==r.G?(g(r,255&e.i),g(r,e.i>>>8&255),g(r,e.i>>>16&255),g(r,e.i>>>24&255),g(r,255&e.total_in),g(r,e.total_in>>>8&255),g(r,e.total_in>>>16&255),g(r,e.total_in>>>24&255)):(Ye(r,e.i>>>16&65535),Ye(r,65535&e.i)),q(e),r.G>0&&(r.G=-r.G),0!=r.A?0:1)}function B_(e){if(U_(e))return -2;let t=e.l,n=t.R;return t.u=F,t.j=qe,t.K=qe,t.$=F,t.Le=F,t.pe=new H(0),t.Ie=F,t.ze=qe,t.C.length=0,t.T.length=0,t.Se.length=0,t.O=void 0,t.te=0,t.re=0,t.U=0,113==n?-3:0}function vt(e,t){let n,r,i=e.xe,f=e.ae,_=e.he,l=e.me,o=e.ae>ve(e)?e.ae-ve(e):0,u=e.j,a=e.P,c=e.u[f],s=e.u[f+1],h=e.u[f+_-1],d=e.u[f+_];e.he>=e.ke&&(i>>=2),l>e.ce&&(l=e.ce);do{if(n=t,e.u[n+_]!=d||e.u[n+_-1]!=h||e.u[n]!=c||e.u[n+1]!=s)continue;let i=N.min(_e,e.ce),o=2;for(;o<i&&e.u[f+o]==e.u[n+o];)o++;if(r=o,r>_){if(e.Ne=t,_=r,r>=l)break;h=e.u[f+_-1],d=e.u[f+_];}}while((t=u[t&a])>o&&0!=--i);return _<=e.ce?_:e.ce}function kt(e,t){St(e,e.u,e.ae-e.ue,t,e.ue),e.ue=e.ae,q(e.o);}function V(e,t){return kt(e,t?1:0),0==e.o.avail_out?t?2:0:null}var gt=65535;function Ne(e,t){return e<t?e:t}function It(e,t){let n,r,i,f=Ne(e.ne-5,e.h),_=0,l=e.o.avail_in;do{if(n=gt,i=e.I+42>>3,e.o.avail_out<i||(i=e.o.avail_out-i,r=e.ae-e.ue,n>r+e.o.avail_in&&(n=r+e.o.avail_in),n>i&&(n=i),n<f&&(0==n&&4!=t||0==t||n!=r+e.o.avail_in)))break;_=4==t&&n==r+e.o.avail_in?1:0,Me(e,null,0,_),e.$[e.A-4]=n,e.$[e.A-3]=n>>8,e.$[e.A-2]=~n,e.$[e.A-1]=~n>>8,q(e.o),r&&(r>n&&(r=n),M(e.o.next_out,e.o.next_out_index,e.u,e.ue,r),e.o.next_out_index+=r,e.o.avail_out-=r,e.o.total_out+=r,e.ue+=r,n-=r),n&&(C_(e.o,e.o.next_out,e.o.next_out_index,n),e.o.next_out_index+=n,e.o.avail_out-=n,e.o.total_out+=n);}while(0==_);if(l-=e.o.avail_in,l){if(l>=e.h){e._e=2;let t=e.o.next_in_index-e.h;M(e.u,0,e.o.next_in,t,e.h),e.ae=e.h,e.le=e.ae;}else e.qe-e.ae<=l&&(e.ae-=e.h,M(e.u,0,e.u,e.h,e.ae),e._e<2&&e._e++,e.le>e.ae&&(e.le=e.ae)),M(e.u,e.ae,e.o.next_in,e.o.next_in_index-l,l),e.ae+=l,e.le+=Ne(l,e.h-e.le);e.ue=e.ae;}return e.k<e.ae&&(e.k=e.ae),_?(e.Ee=8,3):0!=t&&4!=t&&0==e.o.avail_in&&e.ae==e.ue?1:(i=e.qe-e.ae,e.o.avail_in>i&&e.ue>=e.h&&(e.ue-=e.h,e.ae-=e.h,M(e.u,0,e.u,e.h,e.ae),e._e<2&&e._e++,i+=e.h,e.le>e.ae&&(e.le=e.ae)),i>e.o.avail_in&&(i=e.o.avail_in),i&&(C_(e.o,e.u,e.ae,i),e.ae+=i,e.le+=Ne(i,e.h-e.le)),e.k<e.ae&&(e.k=e.ae),i=e.I+42>>3,i=Ne(e.ne-i,gt),f=Ne(i,e.h),r=e.ae-e.ue,(r>=f||(r||4==t)&&0!=t&&0==e.o.avail_in&&r<=i)&&(n=Ne(r,i),_=4==t&&0==e.o.avail_in&&n==r?1:0,Me(e,e.u,n,_,e.ue),e.ue+=n,q(e.o)),_&&(e.Ee=8),_?2:0)}function z_(e,t){let n,r=false;for(;;){if(e.ce<ae){if(c_(e),e.ce<ae&&0==t)return 0;if(0==e.ce)break}if(n=0,e.ce>=I&&(n=u_(e,e.ae)),0!=n&&e.ae-n<=ve(e)&&(e.se=vt(e,n)),e.se>=I)if(e.ae,e.Ne,e.se,r=e_(e,e.ae-e.Ne,e.se-I),e.ce-=e.se,e.se<=e.ye&&e.ce>=I){e.se--;do{e.ae++,n=u_(e,e.ae);}while(0!=--e.se);e.ae++;}else e.ae+=e.se,e.se=0,e.be=e.u[e.ae],e.be=f_(e,e.be,e.u[e.ae+1]);else r=ye(e,e.u[e.ae]),e.ce--,e.ae++;if(r){let t=V(e,false);if(null!=t)return t}}if(e.le=e.ae<I-1?e.ae:I-1,4==t){return V(e,true)??3}if(e.D){let t=V(e,false);if(null!=t)return t}return 1}function Re(e,t){let n,r=false;for(;;){if(e.ce<ae){if(c_(e),e.ce<ae&&0==t)return 0;if(0==e.ce)break}if(n=0,e.ce>=I&&(n=u_(e,e.ae)),e.he=e.se,e.de=e.Ne,e.se=I-1,0!=n&&e.he<e.ye&&e.ae-n<=ve(e)&&(e.se=vt(e,n),e.se<=5&&1==e.ve&&(e.se=I-1)),e.he>=I&&e.se<=e.he){let t=e.ae+e.ce-I;e.ae,e.de,e.he,r=e_(e,e.ae-1-e.de,e.he-I),e.ce-=e.he-1,e.he-=2;do{++e.ae<=t&&(n=u_(e,e.ae));}while(0!=--e.he);if(e.we=0,e.se=I-1,e.ae++,r){let t=V(e,false);if(null!=t)return t}}else if(e.we){if(r=ye(e,e.u[e.ae-1]),r&&kt(e,0),e.ae++,e.ce--,0==e.o.avail_out)return 0}else e.we=1,e.ae++,e.ce--;}if(e.we&&(r=ye(e,e.u[e.ae-1]),e.we=0),e.le=e.ae<I-1?e.ae:I-1,4==t){return V(e,true)??3}if(e.D){let t=V(e,false);if(null!=t)return t}return 1}function Ln(e,t){let n,r,i,f;for(;;){if(e.ce<=_e){if(c_(e),e.ce<=_e&&0==t)return 0;if(0==e.ce)break}if(e.se=0,e.ce>=I&&e.ae>0&&(i=e.ae-1,r=e.u[i],r==++i&&r==++i&&r==++i)){f=e.ae+_e;do{}while(r==++i&&r==++i&&r==++i&&r==++i&&r==++i&&r==++i&&r==++i&&r==++i&&i<f);e.se=_e-(f-i),e.se>e.ce&&(e.se=e.ce);}if(e.se>=I?(e.ae,e.ae,e.se,n=e_(e,1,e.se-I),e.ce-=e.se,e.ae+=e.se,e.se=0):(n=ye(e,e.u[e.ae]),e.ce--,e.ae++),n){let t=V(e,false);if(null!=t)return t}}if(e.le=0,4==t){return V(e,true)??3}if(e.D){let t=V(e,false);if(null!=t)return t}return 1}function On(e,t){let n=false;for(;;){if(0==e.ce&&(c_(e),0==e.ce)){if(0==t)return 0;break}if(e.se=0,n=ye(e,e.u[e.ae]),e.ce--,e.ae++,n){let t=V(e,false);if(null!=t)return t}}if(e.le=0,4==t){return V(e,true)??3}if(e.D){let t=V(e,false);if(null!=t)return t}return 1}var ue=852,d_=592,m_=594,Nt=ge.map(e=>e+1),Rt=Te.subarray(0,-1).map(e=>e+3),zt=[16,1,73,1,200,1],Ct=Ee.map(Wt),Lt=Ee.map(Gt);Ct.push(64,2),Lt.push(142,2);var Ot=de.map(Wt),Ht=de.map(Gt);Ot.push(...zt),Ht.push(...zt);var Ut=new E([...Rt,258,0,0]),Bt=new E([...Rt,3,0,0]),Zt=te(Ot),Ft=te(Ht),Pt=new E([...Nt,0,0]),Mt=new E([...Nt,32769,49153]),Yt=te(Ct),Xt=te(Lt);function Wt(e,t){return t%2?e:e+16}function Gt(e,t){return t%2?e:e+128}function qt(e,t){let n,r=e.l,i=e.next_in_index,f=e.next_out_index,_=e.next_in,l=e.next_out,o=r.u,u=r.p>>>0,a=r.I>>>0,c=r.et,s=r.tt,h=(1<<r.nt)-1,d=(1<<r.rt)-1,w=r.h>>>0,b=r.k>>>0,g=r.m>>>0,v=r.it,k=f-(t-e.avail_out),m=f+(e.avail_out-257),x=i+(e.avail_in-5),y=0,p=0,I=0,z=0;e:do{for(;a<15;){if(!(i<_.length))break e;u+=_[i++]<<a,a+=8;}n=c[u&h];t:for(;;){if(I=n.ft,u>>>=I,a-=I,I=n._t,0==I){l[f++]=n.lt;break}if(16&I){if(y=n.lt,I&=15,I){for(;a<I;){if(!(i<_.length)){r.ot=16200;break e}u+=_[i++]<<a,a+=8;}y+=u&(1<<I)-1,u>>>=I,a-=I;}for(;a<15;){if(!(i<_.length)){r.ot=16200;break e}u+=_[i++]<<a,a+=8;}n=s[u&d];n:for(;;){if(I=n.ft,u>>>=I,a-=I,I=n._t,16&I){if(p=n.lt,I&=15,I){for(;a<I;){if(!(i<_.length)){r.ot=16200;break e}u+=_[i++]<<a,a+=8;}p+=u&(1<<I)-1,u>>>=I,a-=I;}let t=y,c=f-k;if(p>c){let n=p-c;if(n>b&&v){e.msg="invalid distance too far back",r.ot=16209;break e}if(0==g){if(z=w-n,!(n<t)){for(let e=0;e<t;++e)l[f++]=o[z++];continue e}for(let e=0;e<n;++e)l[f++]=o[z++];t-=n,z=f-p;}else if(g<n){z=w+g-n;let e=n-g;if(!(e<t)){for(let e=0;e<t;++e)l[f++]=o[z++];continue e}for(let t=0;t<e;++t)l[f++]=o[z++];if(t-=e,z=0,g<t){for(let e=0;e<g;++e)l[f++]=o[z++];t-=g,z=f-p;}}else {if(z=g-n,!(n<t)){for(let e=0;e<t;++e)l[f++]=o[z++];continue e}for(let e=0;e<n;++e)l[f++]=o[z++];t-=n,z=f-p;}for(;t>2;)l[f++]=l[z++],l[f++]=l[z++],l[f++]=l[z++],t-=3;t&&(l[f++]=l[z++],t>1&&(l[f++]=l[z++]));}else {for(z=f-p;t>2;)l[f++]=l[z++],l[f++]=l[z++],l[f++]=l[z++],t-=3;t&&(l[f++]=l[z++],t>1&&(l[f++]=l[z++]));}break}if(64&I){e.msg="invalid distance code",r.ot=16209;break e}n=s[n.lt+(u&(1<<I)-1)];continue n}break}if(64&I){if(32&I){r.ot=16191;break e}e.msg="invalid literal/length code",r.ot=16209;break e}n=c[n.lt+(u&(1<<I)-1)];continue t}}while(i<x&&f<m);let L=a>>3;i-=L,a-=L<<3,u&=(1<<a)-1,e.next_in_index=i,e.next_out_index=f,e.avail_in=i<x?x-i+5:5-(i-x),e.avail_out=f<m?m-f+257:257-(f-m),r.p=u>>>0,r.I=a>>>0;}function Z_(e,t){let n=[],r=t?ue+m_:ue+d_;return {...Je(e,0),o:e,ot:16180,ut:false,G:0,ct:false,st:0,ht:0,dt:0,wt:0,u:F,bt:0,gt:0,He:0,et:n,tt:n,nt:0,rt:0,vt:0,kt:0,xt:0,yt:0,It:n,zt:new E(320),Lt:new E(288),Et:new v(r).fill(null).map(()=>pe()),Mt:0,it:true,Ft:0,qt:0,Nt:t}}function pe(e=0,t=0,n=0){return {_t:e,ft:t,lt:n}}function F_(e=1){return {_t:64,ft:e,lt:0}}function jt(e=0){return {_t:96,ft:e,lt:0}}function P_(e){return (255&e)<<24|(e>>8&255)<<16|(e>>16&255)<<8|e>>24&255}var Le=15,Un={Nt:false,Vt:Ut,Wt:Zt,St:Pt,$t:Yt,At:20,Ut:257,Qt:0,Dt:d_,Zt:false,Ct:true},Bn={Nt:true,Vt:Bt,Wt:Ft,St:Mt,$t:Xt,At:19,Ut:256,Qt:-1,Dt:m_,Zt:true,Ct:false};function Oe(e,t,n,r,i,f,_,l){let o,u,a,c,s,h,d,w,b,g,v,k,m,x,y,p,I,z,L,M=new E(Le+1),F=new E(Le+1),q=l?Bn:Un;for(o=0;o<=Le;o++)M[o]=0;for(u=0;u<n;u++)M[t[u]]++;for(s=i.Tt,c=Le;c>=1&&0==M[c];c--);if(s>c&&(s=c),0==c)return q.Ct?(y=F_(1),r.Tt[0]=y,r.Tt[1]=y,i.Tt=1,0):-1;for(a=1;a<c&&0==M[a];a++);for(s<a&&(s=a),w=1,o=1;o<=Le;o++)if(w<<=1,w-=M[o],w<0)return -1;if(w>0&&(0==e||1!=c))return -1;for(F[1]=0,o=1;o<Le;o++)F[o+1]=F[o]+M[o];for(u=0;u<n;u++)0!=t[u]&&(f[F[t[u]]++]=u);switch(e){case 0:I=z=f,L=q.At;break;case 1:I=q.Vt,z=q.Wt,L=q.Ut;break;default:I=q.St,z=q.$t,L=q.Qt;}if(g=0,u=0,o=a,p=_.Tt,h=s,d=0,m=-1,b=1<<s,x=b-1,1==e&&(q.Zt?b>=ue:b>ue)||2==e&&(q.Zt?b>=q.Dt:b>q.Dt))return 1;for(;;){y=Zn(f,u,o,d,e,I,z,L,q.Nt),v=1<<o-d,k=1<<h,a=k;do{k-=v;let e=(g>>d)+k;r.Tt[p+e]={...y};}while(0!=k);for(v=1<<o-1;g&v;)v>>=1;if(0!=v?(g&=v-1,g+=v):g=0,u++,0==--M[o]){if(o==c)break;o=t[f[u]];}if(o>s&&(g&x)!=m){for(0==d&&(d=s),p+=1<<h,h=o-d,w=1<<h;h+d<c&&(w-=M[h+d],!(w<=0));)h++,w<<=1;if(b+=1<<h,1==e&&(q.Zt?b>=ue:b>ue)||2==e&&(q.Zt?b>=q.Dt:b>q.Dt))return 1;m=g&x,r.Tt[_.Tt+m]={_t:h,ft:s,lt:p-_.Tt};}}if(0!=g)for(y=F_(o-d);0!=g;){for(0!=d&&(g&x)!=m&&(d=0,o=s,p=_.Tt,h=s,y.ft=o),r.Tt[p+(g>>d)]={...y},v=1<<o-1;g&v;)v>>=1;0!=v?(g&=v-1,g+=v):g=0;}return _.Tt+=b,i.Tt=s,0}function Zn(e,t,n,r,i,f,_,l,o){let u;if(o?e[t]<l:e[t]+1<l)u=pe(0,n-r,e[t]);else if(o?e[t]>l:e[t]>=l)if(o&&1==i){let i=e[t]-257;u=pe(_[i],n-r,f[i]);}else {let i=o?e[t]:e[t]-l;u=pe(_[i],n-r,f[i]);}else u=jt(n-r);return u}var Qt,$t,Vt=new v(544),Jt=true;function en(e){let t=Ve();return t.l=Z_(t,!!e),t}function Ge(e){let t;return !(e&&(t=e.l,!(!t||t.o!=e||t.Nt&&(t.ot<16191||t.ot>16209)||!t.Nt&&(t.ot<16180||t.ot>16211))))}function Xn(e){let t;return Ge(e)?-2:(t=e.l,e.total_in=e.total_out=t.wt=0,e.msg="",t.G&&(e.i=1&t.G),t.ot=t.Nt?16191:16180,t.ut=false,t.ct=false,t.st=-1,t.ht=t.Nt?65536:32768,delete t.O,t.p=0,t.I=0,t.et=t.Et,t.tt=t.Et,t.It=t.Et,t.it=true,t.Ft=-1,0)}function Wn(e){let t;return Ge(e)?-2:(t=e.l,t.h=0,t.k=0,t.m=0,Xn(e))}function Gn(e,t){let n,r,i;if(Ge(e))return -2;if(r=e.l,r.Nt?(t=-16,i=16):i=15,t<0){if(t<-i)return -2;n=0,t=-t;}else n=5+(t>>4),!r.Nt&&t<48&&(t&=15);return t&&(t<8||t>i)?-2:(r.u.length>0&&r.v!=t&&(r.u=F),r.G=n,r.v=t,Wn(e))}function _n(e,t){let n,r;if(!e)return -2;e.msg="";let i=!!e.l.Nt;return r=Z_(e,i),i&&(t=-16),e.l=r,r.o=e,r.ot=r.Nt?16191:16180,n=Gn(e,t),n}function Kn(e){let t={Tt:0};if(Jt){let n,r,i;for(n=0;n<144;)e.zt[n++]=8;for(;n<256;)e.zt[n++]=9;for(;n<280;)e.zt[n++]=7;for(;n<288;)e.zt[n++]=8;for(let e=0;e<544;e++)Vt[e]=pe();i=Vt,Qt=i,r=9;let f={Tt:i},_={Tt:r},l={Tt:0};for(Oe(1,e.zt,288,f,_,e.Lt,l,e.Nt),i=f.Tt,r=_.Tt,e.Mt=l.Tt,n=0;n<32;)e.zt[n++]=5;r=5;let o=l.Tt,u={Tt:i},a={Tt:r};t.Tt=o,Oe(2,e.zt,32,u,a,e.Lt,t,e.Nt),$t=i.slice(o),Jt=false;}e.et=Qt,e.nt=9,e.tt=$t,e.rt=5,e.Mt=t.Tt;}function qn(e,t,n){let r=e.l;if(!(r.u&&0!=r.u.length||(r.u=new x(1<<r.v),r.u)))return 1;if(0==r.h&&(r.h=1<<r.v,r.m=0,r.k=0),n>=r.h)M(r.u,0,t,t.length-r.h,r.h),r.m=0,r.k=r.h;else {let e=r.h-r.m;e>n&&(e=n),M(r.u,r.m,t,t.length-n,e),(n-=e)?(M(r.u,0,t,t.length-n,n),r.m=n,r.k=r.h):(r.m+=e,r.m==r.h&&(r.m=0),r.k<r.h&&(r.k+=e));}return 0}var h_=class extends z{constructor(){super("Need more input");}};function tn(e,t){let n,r,i,f,_,l,o,u,a,c,s,h,d,w,b,g,v,k=new x(4);if(Ge(e)||!e.next_out||!e.next_in&&0!=e.avail_in)return -2;l=0,u=0,o=0,a=0,r=F,i=0,f=F,_=0,n=e.l,16191==n.ot&&(n.ot=16192),z(),c=l,s=o,v=0;try{for(;;)switch(n.ot){case 16180:if(0==n.G){n.ot=16192;break}if(N(16),2&n.G&&35615==u){0==n.v&&(n.v=15),n.dt=W(0),n.dt=p(n.dt,u),E(),n.ot=16181;break}if(n.O&&(n.O.Bt=-1),!(1&n.G)||((V(8)<<8)+(u>>8))%31){e.msg="incorrect header check",n.ot=16209;break}if(8!=V(4)){e.msg="unknown compression method",n.ot=16209;break}if(S(4),g=V(4)+8,0==n.v&&(n.v=g),g>15||g>n.v){e.msg="invalid window size",n.ot=16209;break}n.ht=1<<g,n.st=0,e.i=n.dt=he(0),n.ot=512&u?16189:16191,E();break;case 16181:if(N(16),n.st=u,8!=(255&n.st)){e.msg="unknown compression method",n.ot=16209;break}if(57344&n.st){e.msg="unknown header flags set",n.ot=16209;break}n.O&&(n.O.Pe=u>>8&1),512&n.st&&4&n.G&&(n.dt=p(n.dt,u)),E(),n.ot=16182;case 16182:N(32),n.O&&(n.O.Ye=u),512&n.st&&4&n.G&&(n.dt=I(n.dt,u)),E(),n.ot=16183;case 16183:N(16),n.O&&(n.O.Rt=255&u,n.O.je=u>>8),512&n.st&&4&n.G&&(n.dt=p(n.dt,u)),E(),n.ot=16184;case 16184:1024&n.st?(N(16),n.bt=u,n.O&&(n.O.Ke=u),512&n.st&&4&n.G&&(n.dt=p(n.dt,u)),E()):n.O&&(n.O.He=F),n.ot=16185;case 16185:if(1024&n.st&&(h=n.bt,h>l&&(h=l),h&&(n.O&&n.O.He&&n.O.Gt&&(g=n.O.Ke-n.bt)<n.O.Gt&&M(n.O.He,g,r,i,h),512&n.st&&4&n.G&&(n.dt=W(n.dt,r.subarray(i,i+h),h)),l-=h,i+=h,n.bt-=h),n.bt))return m();n.bt=0,n.ot=16186;case 16186:if(2048&n.st){if(0==l)return m();h=0;do{g=r[i+h++],n.O&&n.O.Ot&&n.bt<n.O.Ot&&(n.O.Je[n.bt++]=g);}while(g&&h<l);if(512&n.st&&4&n.G&&(n.dt=W(n.dt,r.subarray(i,i+h),h)),l-=h,i+=h,g)return m()}else n.O&&(n.O.Je=F);n.bt=0,n.ot=16187;case 16187:if(4096&n.st){if(0==l)return m();h=0;do{g=r[i+h++],n.O&&n.O.Pt&&n.bt<n.O.Pt&&(n.O.Xe[n.bt++]=g);}while(g&&h<l);if(512&n.st&&4&n.G&&(n.dt=W(n.dt,r.subarray(i,i+h),h)),l-=h,i+=h,g)return m()}else n.O&&(n.O.Xe=F);n.ot=16188;case 16188:if(512&n.st){if(N(16),4&n.G&&u!=(65535&n.dt)){e.msg="header crc mismatch",n.ot=16209;break}E();}n.O&&(n.O.Oe=n.st>>9&1,n.O.Bt=1),e.i=n.dt=W(0),n.ot=16191;break;case 16189:N(32),e.i=n.dt=P_(u),E(),n.ot=16190;case 16190:if(!n.ct)return L(),2;e.i=n.dt=he(0),n.ot=16191;case 16191:if(5==t||6==t)return m();case 16192:if(n.ut){$(),n.ot=16206;break}switch(N(3),n.ut=!!V(1),S(1),V(2)){case 0:n.ot=16193;break;case 1:if(Kn(n),n.ot=16199,6==t)return S(2),m();break;case 2:n.ot=16196;break;case 3:e.msg="invalid block type",n.ot=16209;}S(2);break;case 16193:if($(),N(32),(65535&u)!=(u>>>16^65535)){e.msg="invalid stored block lengths",n.ot=16209;break}if(n.bt=65535&u,E(),n.ot=16194,6==t)return m();case 16194:n.ot=16195;case 16195:if(h=n.bt,h){if(h>l&&(h=l),h>o&&(h=o),0==h)return m();M(f,_,r,i,h),l-=h,i+=h,o-=h,_+=h,n.bt-=h;break}n.ot=16191;break;case 16196:if(N(14),n.kt=V(5)+257,S(5),n.xt=V(5)+1,S(5),n.vt=V(4)+4,S(4),n.kt>286||!n.Nt&&n.xt>30){e.msg=n.Nt?"too many length":"too many length or distance symbols",n.ot=16209;break}n.yt=0,n.ot=16197;case 16197:for(;n.yt<n.vt;)N(3),n.zt[Se[n.yt++]]=V(3),S(3);for(;n.yt<19;)n.zt[Se[n.yt++]]=0;n.It=n.Et,n.et=n.tt=n.It,n.nt=7;let c={Tt:n.It},k={Tt:n.nt},x={Tt:0};if(v=Oe(0,n.zt,19,c,k,n.Lt,x,n.Nt),n.It=c.Tt,n.nt=k.Tt,v){e.msg="invalid code lengths set",n.ot=16209;break}n.yt=0,n.ot=16198;case 16198:for(;n.yt<n.kt+n.xt;){for(;w=n.et[V(n.nt)],!(w.ft<=a);)q();if(w.lt<16)S(w.ft),n.zt[n.yt++]=w.lt;else {if(16==w.lt){if(N(w.ft+2),S(w.ft),0==n.yt){e.msg="invalid bit length repeat",n.ot=16209;break}g=n.zt[n.yt-1],h=3+V(2),S(2);}else 17==w.lt?(N(w.ft+3),S(w.ft),g=0,h=3+V(3),S(3)):(N(w.ft+7),S(w.ft),g=0,h=11+V(7),S(7));if(n.yt+h>n.kt+n.xt){e.msg="invalid bit length repeat",n.ot=16209;break}for(;h--;)n.zt[n.yt++]=g;}}if(16209==n.ot)break;if(0==n.zt[256]){e.msg="invalid code -- missing end-of-block",n.ot=16209;break}n.It=n.Et,n.nt=9;let A={Tt:n.It},U={Tt:n.nt},Q={Tt:0};v=Oe(1,n.zt,n.kt,A,U,n.Lt,Q,n.Nt),n.It=A.Tt,n.nt=U.Tt;let D=Q.Tt;if(n.et=n.It.slice(0,D),v){e.msg="invalid literal/lengths set",n.ot=16209;break}n.rt=6;let Z=n.zt.subarray(n.kt,n.kt+n.xt),C={Tt:n.It},T={Tt:n.rt},B={Tt:D};if(v=Oe(2,Z,n.xt,C,T,n.Lt,B,n.Nt),n.It=C.Tt,n.rt=T.Tt,n.tt=n.It.slice(D),v){e.msg="invalid distances set",n.ot=16209;break}if(n.ot=16199,6==t)return m();case 16199:n.ot=16200;case 16200:if(!n.Nt&&l>=6&&o>=258){L(),qt(e,s),z(),16191==n.ot&&(n.Ft=-1);break}for(n.Ft=0;w=n.et[V(n.nt)],!(w.ft<=a);)q();if(w._t&&!(240&w._t)){for(b=w;w=n.et[b.lt+(V(b.ft+b._t)>>b.ft)],!(b.ft+w.ft<=a);)q();S(b.ft),n.Ft+=b.ft;}if(S(w.ft),n.Ft+=w.ft,n.bt=w.lt,0==w._t){n.ot=16205;break}if(32&w._t){n.Ft=-1,n.ot=16191;break}if(64&w._t){e.msg="invalid literal/length code",n.ot=16209;break}n.He=15&w._t,n.ot=16201;case 16201:n.He&&(N(n.He),n.bt+=V(n.He),S(n.He),n.Ft+=n.He),n.qt=n.bt,n.ot=16202;case 16202:for(;w=n.tt[V(n.rt)],!(w.ft<=a);)q();if(!(240&w._t)){for(b=w;w=n.tt[b.lt+(V(b.ft+b._t)>>b.ft)],!(b.ft+w.ft<=a);)q();S(b.ft),n.Ft+=b.ft;}if(S(w.ft),n.Ft+=w.ft,64&w._t){e.msg="invalid distance code",n.ot=16209;break}n.gt=w.lt,n.He=15&w._t,n.ot=16203;case 16203:n.He&&(N(n.He),n.gt+=V(n.He),S(n.He),n.Ft+=n.He),n.ot=16204;case 16204:if(0==o)return m();if(h=s-o,n.gt>h){if(h=n.gt-h,h>n.k&&n.it){e.msg="invalid distance too far back",n.ot=16209;break}h>n.m?(h-=n.m,d=n.h-h):d=n.m-h,h>n.bt&&(h=n.bt),h>o&&(h=o);for(let e=0;e<h;++e)f[_]=255&n.u[d],++_,++d;}else {d=_-n.gt,h=n.bt,h>o&&(h=o);for(let e=0;e<h;++e)f[_]=f[d],++_,++d;}h>o&&(h=o),o-=h,n.bt-=h,0==n.bt&&(n.ot=16200);break;case 16205:if(0==o)return m();f[_++]=n.bt,o--,n.ot=16200;break;case 16206:if(n.G){if(N(32),s-=o,e.total_out+=s,n.wt+=s,4&n.G&&s){let t=f.subarray(_-s,_);e.i=n.dt=y(n.dt,t,s);}if(s=o,4&n.G&&(n.st?u:P_(u)>>>0)!=n.dt){e.msg="incorrect data check",n.ot=16209;break}E();}n.ot=16207;case 16207:if(n.G&&n.st){if(N(32),4&n.G&&u!=(4294967295&n.wt)){e.msg="incorrect length check",n.ot=16209;break}E();}n.ot=16208;case 16208:return v=1,m();case 16209:return v=-3,m();case 16210:return -4;default:return -2}}catch(e){if(e instanceof h_)return m();throw e}function m(){if(L(),n.h||s!=e.avail_out&&n.ot<16209&&(n.Nt?n.ot<16208:n.ot<16206)||4!=t){let t=s-e.avail_out;if(qn(e,e.next_out.subarray(e.next_out_index-t,e.next_out_index),t))return n.ot=16210,-4}return c-=e.avail_in,s-=e.avail_out,e.total_in+=c,e.total_out+=s,n.wt+=s,4&n.G&&s&&(e.i=n.dt=y(n.dt,e.next_out.subarray(e.next_out_index-s,e.next_out_index),s)),e.t=n.I+(n.ut?64:0)+(16191==n.ot?128:0)+(16199==n.ot||16194==n.ot?256:0),(0==c&&0==s&&0==v||4==t&&0==v)&&(v=-5),v}function y(e,t,r){return n.st?W(e,t,r):he(e,t,r)}function p(e,t){return k[0]=255&t,k[1]=t>>>8&255,W(e,k,2)>>>0}function I(e,t){return k[0]=255&t,k[1]=t>>>8&255,k[2]=t>>>16&255,k[3]=t>>>24&255,W(e,k,4)>>>0}function z(){f=e.next_out,_=e.next_out_index,o=e.avail_out,r=e.next_in,i=e.next_in_index,l=e.avail_in,u=n.p,a=n.I;}function L(){e.next_out=f,e.next_out_index=_,e.avail_out=o,e.next_in=r,e.next_in_index=i,e.avail_in=l,n.p=u,n.I=a;}function E(){u=0,a=0;}function q(){if(0==l)throw new h_;l--,u+=(255&r[i])<<a,i++,u>>>=0,a+=8;}function N(e){for(;a<e;)q();}function V(e){return u&(1<<e)-1}function S(e){u>>>=e,a-=e;}function $(){u>>>=7&a,a-=7&a;}}function nn(e){return Ge(e)?-2:0}var M_=65536,jn=32768,Y_=class{constructor(e=16,t=M_){this.Ht=[],this.Jt=e;for(let n=0;n<N.min(e,4);n++)this.Ht.push(new x(t));}acquire(e=M_){for(let t=this.Ht.length-1;t>=0;t--){let n=this.Ht[t];if(n.length>=e)return this.Ht.splice(t,1),n}return new x(e)}release(e){this.Ht.length<this.Jt&&this.Ht.push(e);}};function rn(e){let t=new Y_(32,M_),n=null;function r(e){try{t.release(e);}catch{}}return new U({start(){},transform(i,f){if(!n){let t=e.Xt(),r=e.Yt(t);if(0!=r&&0!=r)throw new z("init failed: "+r);n={o:t};}let _=n.o,l=0;for(;l<i.length;){let n=N.min(i.length-l,jn),o=i.subarray(l,l+n);for(_.next_in=o,_.next_in_index=0,_.avail_in=o.length;_.avail_in>0;){let n=t.acquire(),i=false;try{_.next_out=n,_.next_out_index=0,_.avail_out=n.length;let r=e.jt(_,0),l=n.length-_.avail_out;if(l>0){let e=!1,r={Kt:n.subarray(0,l),release:()=>{e||(e=!0,t.release(n));}};i=!0,f.enqueue(r);}if(0!=r&&1!=r)throw new z("process error: "+r)}finally{i||r(n);}}l+=n;}},flush(i){if(!n)return;let f=n.o;for(;;){let n=t.acquire(),_=false;try{f.next_out=n,f.next_out_index=0,f.avail_out=n.length;let r=e.jt(f,4),l=n.length-f.avail_out;if(l>0){let e=!1,r={Kt:n.subarray(0,l),release:()=>{e||(e=!0,t.release(n));}};_=!0,i.enqueue(r);}if(1==r)break;if(0!=r)throw new z("finalization error: "+r)}finally{_||r(n);}}let _=e.en(f);if(0!=_&&0!=_)throw new z("end failed: "+_)}})}function an(){return new U({start(){},transform(e,t){try{t.enqueue(e.Kt.slice(0));}finally{e.release();}},flush(){}})}function Vn(e="deflate",t){let n="gzip"==e?31:"deflate-raw"==e?-15:15,r=t&&"number"==typeof t.level?t.level:-1;return rn({Xt:()=>wt(),Yt:e=>Dt(e,r,8,n,8,0),jt:yt,en:B_})}function Jn(e="deflate"){let t="gzip"==e?31:"deflate-raw"==e?-15:15;return rn({Xt:()=>en("deflate64-raw"==e),Yt:e=>_n(e,t),jt:tn,en:nn})}var s_=class{constructor(e="deflate",t){let n=Vn(e,t);this.writable=n.writable,this.readable=n.readable.pipeThrough(an());}},x_=class{constructor(e="deflate"){let t=Jn(e);this.writable=t.writable,this.readable=t.readable.pipeThrough(an());}};
6453
+ var{Uint8Array:x,Uint16Array:E,Int32Array:H,TransformStream:U,Math:N,Error:z,Array:y}=globalThis,Se=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],Z=new x(0),qe=new E(0),de=[];for(let e=0;e<6;e++)de.push(e,0==e?8:4);de.push(0,1);var Ee=[];for(let e=0;e<14;e++)Ee.push(e,0==e?4:2);var ge=new E([0,1,2,3,4,6,8,12,16,24,32,48,64,96,128,192,256,384,512,768,1024,1536,2048,3072,4096,6144,8192,12288,16384,24576]),Te=new E([0,1,2,3,4,5,6,7,8,10,12,14,16,20,24,28,32,40,48,56,64,80,96,112,128,160,192,224,0]);function M(e,t,n,r,i){if(0==i)return;let f=e instanceof x?e:new x(e.buffer,e.byteOffset,e.byteLength),_=n instanceof x?n.subarray(r,r+i):new x(n.buffer,n.byteOffset+r,i);f.set(_,t);}function je(e,t,n){0!=n&&(e instanceof x?e:new x(e.buffer,e.byteOffset,e.byteLength)).fill(0,t,t+n);}function Ve(){return {next_in:Z,next_in_index:0,avail_in:0,total_in:0,next_out:Z,next_out_index:0,avail_out:0,total_out:0,msg:"",t:0,i:0,_:0,l:void 0}}function Je(e,t){let n=1<<t;return {o:e,u:new x(n),h:n,k:t,m:0,v:0,p:0,M:0}}function te(e){let t=[];for(let n=0;n<e.length;n+=2){let r=e[n],i=e[n+1];for(let e=0;e<i;e++)t.push(r);}return new E(t)}var ne=class{constructor(e,t){this.L=e,this.Z=t,this.q=0;}},re=class{constructor(e,t,n,r,i){this.N=e,this.V=t,this.W=n,this.S=r,this.$=i;}};function g_(e){return V_[e<-6||e>2?9:2-e]||""}function Ae(e,t){try{e.msg=g_(t);}catch(n){e.msg="zlib error "+String(t)+" ("+n+")";}return t}function $e(e,t){let n=e>>>0,r=0;for(let e=0;e<t;e++)r=r<<1|1&n,n>>>=1;return r}function g(e,t){e.I[e.D++]=t;}function De(e,t){g(e,255&t),g(e,t>>>8&255);}function e_(e,t,n){let r=255&n,i=65535&t,f=e.A+e.U;return e.I[f]=255&i,e.I[f+1]=i>>>8&255,e.I[f+2]=r,e.U+=3,i=i-1&65535,e.R[__[r]+ie+1].P++,e.X[T_(i)].P++,e.U==e.C}function ye(e,t){let n=255&t,r=e.A+e.U;return e.I[r]=0,e.I[r+1]=0,e.I[r+2]=n,e.U+=3,e.R[n].P++,e.U==e.C}function ve(e){return e.h-ae}function T_(e){return e<256?E_[e]:E_[256+(e>>7)]}function w_(e){let t=He+7,n=1<<t,r=(1<<t)-1,i=N.floor((t+k-1)/k),f=1<<8+He;return {...Je(e,15),o:e,H:42,O:0,T:void 0,Y:32767,B:t,F:n,j:r,G:i,J:new E(32768),K:new E(n),ee:f,I:new x(32768),te:0,ne:32768,D:0,re:0,ie:0,fe:0,_e:0,le:0,oe:-2,ue:0,ae:0,ce:0,se:0,de:0,he:0,we:0,ke:0,be:0,ge:0,me:0,ve:0,xe:0,ye:0,pe:new H(2*we+1),ze:new x(2*we+1),Me:new E(be+1),U:0,C:0,Le:Z,A:0,Ee:0,Ze:0,qe:8,Ne:32768,Ve:0,We:0,Se:0,R:new y(le).fill(0).map(()=>Q()),X:new y(2*me+1).fill(0).map(()=>Q()),$e:new y(2*oe+1).fill(0).map(()=>Q()),Ie:S_(),De:S_(),Ae:S_()}}function A_(e){let t=[];for(let n=0;n<e.length;n+=2){let r=e[n],i=e[n+1],f=Q();f.Qe=r,f.Ue=i,t.push(f);}return t}function Q(){return {P:0,Qe:0,Pe:0,Ue:0}}function S_(){return new ne([],ln(null,Z,0,0,0))}function ln(e,t,n,r,i){return new re(e,t,n,r,i)}function J_(){let e=new y(288).fill(0);for(let t=0;t<=143;t++)e[t]=8;for(let t=144;t<=255;t++)e[t]=9;for(let t=256;t<=279;t++)e[t]=7;for(let t=280;t<=287;t++)e[t]=8;return e}function D_(e){let{code:t,length:n}=fn(e),r=new E(2*e.length),i=0;for(let f=0;f<e.length;f++){let e=n[f]||0,_=t[f]||0;r[i++]=e?$e(_,e):0,r[i++]=e;}return new E(r)}function Q_(e,t,n){let r=0;for(let n=0;n<e.length;n++){let i=t[n]?1<<t[n]:1,f=e[n]+i-1;f>r&&(r=f);}r<n&&(r=n);let i=new x(r+1);for(let n=0;n<=r;n++)for(let r=0;r<e.length;r++){let f=t[r]?1<<t[r]:1,_=e[r];if(n>=_&&n<=_+f-1){i[n]=r;break}}return i}function $_(e,t){let n=0;for(let r=0;r<e.length;r++){let i=t[r]?1<<t[r]:1,f=e[r]+i-1;f>n&&(n=f);}let r=new x(n+1);for(let i=0;i<=n;i++)for(let n=0;n<e.length;n++){let f=t[n]?1<<t[n]:1,_=e[n];if(i>=_&&i<=_+f-1){r[i]=n;break}}return r}function et(e){let t=new x(512),n=e.length-1;for(let r=0;r<256;r++)t[r]=r<=n?e[r]:e[n];for(let r=256;r<=n;r++){let n=r>>7;t[256+(n>255?255:n)]=e[r];}for(let e=257;e<512;e++)0==t[e]&&(t[e]=t[e-1]);return t}function fn(e){let t=N.max(...e),n=new y(t+1).fill(0);for(let t of e)t>0&&n[t]++;let r=new y(e.length).fill(0),i=new y(t+1).fill(0),f=0;for(let e=1;e<=t;e++)f=f+n[e-1]<<1,i[e]=f;for(let t=0;t<e.length;t++){let n=e[t];0!=n&&(r[t]=i[n]++);}return {code:r,length:e}}var He=8,k=3,_e=258,ae=_e+k+1,Ue=16,Be=_e,un=29,ie=256,we=ie+1+un,me=30,oe=19,le=2*we+1,be=15,_t=9,tt=255,nt=32,rt=4,Ie=256,t_=16,n_=17,r_=18,at=0,y_=1,it=2,$=-1,V_=["need dictionary","stream end","","file error","stream error","data error","insufficient memory","buffer error",""],a_=te(de),i_=te(Ee),Fe=new E(19);Fe[16]=2,Fe[17]=3,Fe[18]=7;var cn=D_(J_()),dn=D_(new y(30).fill(5)),Ze=A_(cn),v_=A_(dn),__=Q_(Te,a_,_e),E_=et($_(ge,i_));function Pe(e){return e%65521>>>0}function se(e,t,n){if(void 0===t||void 0===n)return 1;let r=e>>>16&65535;if(e&=65535,1==n)return (e+=t[0])>=65521&&(e-=65521),r+=e,r>=65521&&(r-=65521),(r<<16|e)>>>0;if(n<16){for(let i=0;i<n;i++)r+=e+=t[i];return e>=65521&&(e-=65521),r=Pe(r),(r<<16|e)>>>0}for(;n>=5552;){n-=5552;let i=N.floor(347);do{for(let n=0;n<16;n++)r+=e+=t[n];t=t.subarray(16);}while(--i);e=Pe(e),r=Pe(r);}if(n){for(;n>=16;){n-=16;for(let n=0;n<16;n++)r+=e+=t[n];t=t.subarray(16);}for(let i=0;i<n;i++)r+=e+=t[i];e=Pe(e),r=Pe(r);}return (r<<16|e)>>>0}var mn=(()=>{let e=new y(256);for(let t=0;t<256;t++){let n=t;for(let e=0;e<8;e++)n=1&n?3988292384^n>>>1:n>>>1;e[t]=n>>>0;}return e})();function W(e=0,t,n){if(!t)return 0;void 0===n&&(n=t.length),n=N.min(n,t.length),e=~e>>>0;for(let r=0;r<n;r++)e=e>>>8^mn[255&(e^t[r])];return (4294967295^e)>>>0}function mt(e){16==e.M?(De(e,e.p),e.p=0,e.M=0):e.M>=8&&(g(e,e.p),e.p>>=8,e.M-=8);}function bt(e){e.M>8?De(e,e.p):e.M>0&&g(e,e.p),e.Ee=1+(e.M-1&7),e.p=0,e.M=0;}function bn(e,t,n){let r,i,f=[],_=0;for(r=1;r<=be;r++)_=_+n[r-1]<<1,f[r]=_;for(i=0;i<=t;i++){let t=e[i].Ue;0!=t&&(e[i].Qe=$e(f[t]++,t));}}function L(e,t,n){e.M>Ue-n?(e.p=65535&(e.p|t<<e.M),De(e,e.p),e.p=t>>Ue-e.M&65535,e.M+=n-Ue):(e.p=65535&(e.p|t<<e.M),e.M+=n);}function st(e){for(let t=0;t<e.R.length;t++)e.R[t].P=0;for(let t=0;t<e.X.length;t++)e.X[t].P=0;for(let t=0;t<e.$e.length;t++)e.$e[t].P=0;e.R[Ie].P=1,e.ie=e.fe=0,e.U=e._e=0;}function ht(e){if(e.R&&e.R.length>=le)for(let t=0;t<le;t++)e.R[t]=Q();else {e.R=[];for(let t=0;t<le;t++)e.R.push(Q());}if(e.X&&e.X.length>=2*me+1)for(let t=0;t<2*me+1;t++)e.X[t]=Q();else {e.X=[];for(let t=0;t<2*me+1;t++)e.X.push(Q());}if(e.$e&&e.$e.length>=2*oe+1)for(let t=0;t<2*oe+1;t++)e.$e[t]=Q();else {e.$e=[];for(let t=0;t<2*oe+1;t++)e.$e.push(Q());}e.Ie=new ne(e.R,new re(Ze,a_,ie+1,we,be)),e.De=new ne(e.X,new re(v_,i_,0,me,be)),e.Ae=new ne(e.$e,new re(null,Fe,0,oe,7)),e.p=0,e.M=0,e.Ee=0,st(e);}var he=1;function sn(e,t,n){return n=e.pe[he],e.pe[he]=e.pe[e.We--],I_(e,t,he),n}function ft(e,t,n,r){return e[t].P<e[n].P||e[t].P==e[n].P&&r[t]<=r[n]}function I_(e,t,n){let r=e.pe[n],i=n<<1;for(;i<=e.We&&(i<e.We&&ft(t,e.pe[i+1],e.pe[i],e.ze)&&i++,!ft(t,r,e.pe[i],e.ze));)e.pe[n]=e.pe[i],n=i,i<<=1;e.pe[n]=r;}function hn(e,t){let n,r,i,f,_,l,o=t.L,u=t.q,a=t.Z.N,c=t.Z.V,s=t.Z.W,d=t.Z.$,h=0;for(f=0;f<=be;f++)e.Me[f]=0;for(o[e.pe[e.Se]].Ue=0,n=e.Se+1;n<le;n++)r=e.pe[n],f=o[o[r].Pe].Ue+1,f>d&&(f=d,h++),o[r].Ue=f,!(r>u)&&(e.Me[f]++,_=0,r>=s&&(_=c[r-s]),l=o[r].P,e.ie+=l*(f+_),a&&(e.fe+=l*(a[r].Ue+_)));if(0!=h){do{for(f=d-1;0==e.Me[f];)f--;e.Me[f]--,e.Me[f+1]+=2,e.Me[d]--,h-=2;}while(h>0);for(f=d;0!=f;f--)for(r=e.Me[f];0!=r;)i=e.pe[--n],!(i>u)&&(o[i].Ue!=f&&(e.ie+=(f-o[i].Ue)*o[i].P,o[i].Ue=f),r--);}}function k_(e,t){let n,r,i,f=t.L,_=t.Z.N,l=t.Z.S,o=-1;for(e.We=0,e.Se=le,n=0;n<l;n++)0!=f[n].P?(e.pe[++e.We]=o=n,e.ze[n]=0):f[n].Ue=0;for(;e.We<2;)i=e.pe[++e.We]=o<2?++o:0,f[i].P=1,e.ze[i]=0,e.ie--,_&&(e.fe-=_[i].Ue);for(t.q=o,n=N.floor(e.We/2);n>=1;n--)I_(e,f,n);i=l;do{n=sn(e,f,n),r=e.pe[he],e.pe[--e.Se]=n,e.pe[--e.Se]=r,f[i].P=f[n].P+f[r].P,e.ze[i]=(e.ze[n]>=e.ze[r]?e.ze[n]:e.ze[r])+1,f[n].Pe=f[r].Pe=i,e.pe[he]=i++,I_(e,f,he);}while(e.We>=2);e.pe[--e.Se]=e.pe[he],hn(e,t),bn(f,t.q,e.Me);}function ut(e,t,n){let r,i,f=-1,_=t[0].Ue,l=0,o=7,u=4;for(0==_&&(o=138,u=3),t[n+1].Ue=65535,r=0;r<=n;r++)i=_,_=t[r+1].Ue,!(++l<o&&i==_)&&(l<u?e.$e[i].P+=l:0!=i?(i!=f&&e.$e[i].P++,e.$e[t_].P++):l<=10?e.$e[n_].P++:e.$e[r_].P++,l=0,f=i,0==_?(o=138,u=3):i==_?(o=6,u=3):(o=7,u=4));}function ct(e,t,n){let r,i=-1,f=t[0].Ue,_=0,l=7,o=4;0==f&&(l=138,o=3);for(let u=0;u<=n;u++)if(r=f,f=t[u+1].Ue,!(++_<l&&r==f)){if(_<o)do{L(e,e.$e[r].Qe,e.$e[r].Ue);}while(0!=--_);else 0!=r?(r!=i&&(L(e,e.$e[r].Qe,e.$e[r].Ue),_--),L(e,e.$e[t_].Qe,e.$e[t_].Ue),L(e,_-3,2)):_<=10?(L(e,e.$e[n_].Qe,e.$e[n_].Ue),L(e,_-3,3)):(L(e,e.$e[r_].Qe,e.$e[r_].Ue),L(e,_-11,7));_=0,i=r,0==f?(l=138,o=3):r==f?(l=6,o=3):(l=7,o=4);}}function xn(e){let t;for(ut(e,e.R,e.Ie.q),ut(e,e.X,e.De.q),k_(e,e.Ae),t=oe-1;t>=3&&0==e.$e[Se[t]].Ue;t--);return e.ie+=3*(t+1)+5+5+4,t}function pn(e,t,n,r){let i;for(L(e,t-257,5),L(e,n-1,5),L(e,r-4,4),i=0;i<r;i++)L(e,e.$e[Se[i]].Ue,3);ct(e,e.R,t-1),ct(e,e.X,n-1);}function Me(e,t,n,r,i=0){L(e,(at<<1)+r,3),bt(e),De(e,n),De(e,~n),n&&t&&M(e.I,e.D,t,i,n),e.D+=n;}function xt(e){mt(e);}function pt(e){L(e,y_<<1,3),L(e,Ze[Ie].Qe,Ze[Ie].Ue),mt(e);}function dt(e,t,n){let r,i,f,_,l=0;if(0!=e.U)do{r=255&e.Le[l],r+=(255&e.Le[l+1])<<8,i=e.Le[l+2],l+=3,0==r?L(e,t[i].Qe,t[i].Ue):(f=__[i],L(e,t[f+ie+1].Qe,t[f+ie+1].Ue),_=a_[f],0!=_&&(i-=Te[f],L(e,i,_)),r--,f=T_(r),L(e,n[f].Qe,n[f].Ue),_=i_[f],0!=_&&(r-=ge[f],L(e,r,_)));}while(l<e.U);L(e,t[Ie].Qe,t[Ie].Ue);}function Sn(e){let t,n=4093624447;for(t=0;t<=31;t++,n>>=1)if(1&n&&0!=e.R[t].P)return 0;if(0!=e.R[9].P||0!=e.R[10].P||0!=e.R[13].P)return 1;for(t=32;t<ie;t++)if(0!=e.R[t].P)return 1;return 0}function St(e,t,n,r,i=0){let f,_,l=0;e.be>0?(2==e.o.t&&(e.o.t=Sn(e)),k_(e,e.Ie),k_(e,e.De),l=xn(e),f=e.ie+3+7>>3,_=e.fe+3+7>>3,(_<=f||4==e.ge)&&(f=_)):f=_=n+5,n+4<=f&&t?Me(e,t,n,r,i):_==f?(L(e,(y_<<1)+r,3),dt(e,Ze,v_)):(L(e,(it<<1)+r,3),pn(e,e.Ie.q+1,e.De.q+1,l+1),dt(e,e.R,e.X)),st(e),r&&bt(e);}function wt(){let e=Ve();return e.l=w_(e),e}var Ye=[{Re:kt,Xe:0,Ce:0,He:0,Oe:0},{Re:z_,Xe:4,Ce:4,He:8,Oe:4},{Re:z_,Xe:5,Ce:5,He:16,Oe:8},{Re:z_,Xe:6,Ce:16,He:32,Oe:32},{Re:Re,Xe:4,Ce:4,He:16,Oe:16},{Re:Re,Xe:16,Ce:8,He:16,Oe:32},{Re:Re,Xe:16,Ce:16,He:32,Oe:128},{Re:Re,Xe:32,Ce:32,He:128,Oe:256},{Re:Re,Xe:128,Ce:128,He:256,Oe:1024},{Re:Re,Xe:258,Ce:258,He:258,Oe:4096}];function Et(e){return 2*e-(e>4?9:0)}function f_(e,t,n){return ((t<<e.G^n)&e.j)>>>0}function u_(e,t){e.ke=f_(e,e.ke,e.u[t+(k-1)]);let n=e.J[t&e.Y]=e.K[e.ke];return e.K[e.ke]=t,n}function At(e){e.K[e.F-1]=0,je(e.K,0,(e.F-1)*e.K.BYTES_PER_ELEMENT);}function Dn(e){let t,n,r=e.h;for(t=e.F;t>0;)t--,n=e.K[t],e.K[t]=n>=r?n-r:0;for(t=r;t>0;)t--,n=e.J[t],e.J[t]=n>=r?n-r:0;}function C_(e,t,n,r){let i=e.avail_in;return i>r&&(i=r),0==i?0:(e.avail_in-=i,M(t,n,e.next_in,e.next_in_index,i),1==e.l.O?e.i=se(e.i,new x(t.buffer,t.byteOffset+n,i),i):2==e.l.O&&(e.i=W(e.i,new x(t.buffer,t.byteOffset+n,i),i)),e.next_in_index+=i,e.total_in+=i,i)}function c_(e){let t,n,r=e.h;do{if(n=e.Ne-e.ce-e.ae,0==n&&0==e.ae&&0==e.ce?n=r:-1==n&&n--,e.ae>=r+ve(e)&&(M(e.u,0,e.u,r,r-n),e.Ve-=r,e.ae-=r,e.ue-=r,e.le>e.ae&&(e.le=e.ae),Dn(e),n+=r),0==e.o.avail_in)break;if(t=C_(e.o,e.u,e.ae+e.ce,n),e.ce+=t,e.ce+e.le>=k){let t=e.ae-e.le;for(e.ke=e.u[t],e.ke=f_(e,e.ke,e.u[t+1]);e.le&&(e.ke=f_(e,e.ke,e.u[t+k-1]),e.J[t&e.Y]=e.K[e.ke],e.K[e.ke]=t,t++,e.le--,!(e.ce+e.le<k)););}}while(e.ce<ae&&0!=e.o.avail_in);if(e.m<e.Ne){let t,n=e.ae+e.ce;e.m<n?(t=e.Ne-n,t>Be&&(t=Be),je(e.u,n,t),e.m=n+t):e.m<n+Be&&(t=n+Be-e.m,t>e.Ne-e.m&&(t=e.Ne-e.m),je(e.u,e.m,t),e.m+=t);}}function Dt(e,t,n=8,r=15,i=He,f=0){let _=1;if(!e)return -2;if(e.msg="",-1==t&&(t=6),r<0){if(_=0,r<-15)return -2;r=-r;}else r>15&&(_=2,r-=16);if(i<1||i>_t||8!=n||r<8||r>15||t<0||t>9||f<0||f>4||8==r&&1!=_)return -2;8==r&&(r=9);let l=w_(e);return l?(e.l=l,l.o=e,l.H=42,l.O=_,l.T=void 0,l.k=r,l.h=1<<l.k,l.Y=l.h-1,l.B=i+7,l.F=1<<l.B,l.j=l.F-1,l.G=(l.B+k-1)/k,l.u=new x(2*l.h),l.J=new E(l.h),l.K=new E(l.F),l.m=0,l.ee=1<<i+6,l.I=new x(l.ee*rt),l.ne=4*l.ee,l.u&&l.J&&l.K&&l.I?(l.Le=l.I.subarray(l.ee),l.A=l.te+l.ee,l.C=3*(l.ee-1),l.be=t,l.ge=f,l.qe=n,In(e)):(l.H=666,e.msg=g_(-4),B_(e),-4)):-4}function U_(e){if(null==e)return true;let t=e.l;return !t||t.o!=e||42!=t.H&&57!=t.H&&69!=t.H&&73!=t.H&&91!=t.H&&103!=t.H&&113!=t.H&&666!=t.H}function yn(e){let t;return U_(e)?-2:(e.total_in=e.total_out=0,e.msg="",e.t=2,t=e.l,t.D=0,t.re=t.te,t.O<0&&(t.O=-t.O),t.H=2==t.O?57:42,e.i=2==t.O?W(0):se(0),t.oe=-2,ht(t),0)}function vn(e){e.Ne=2*e.h,At(e),e.ye=Ye[e.be].Xe,e.me=Ye[e.be].Ce,e.ve=Ye[e.be].He,e.xe=Ye[e.be].Oe,e.ae=0,e.ue=0,e.ce=0,e.le=0,e.se=e.de=k-1,e.we=0,e.ke=0;}function In(e){let t=yn(e);return 0==t&&vn(e.l),t}function Xe(e,t){g(e,t>>8),g(e,255&t);}function q(e){let t,n=e.l;xt(n),t=n.D,t>e.avail_out&&(t=e.avail_out),0!=t&&(M(e.next_out,e.next_out_index,n.I,n.re,t),e.next_out_index+=t,n.re+=t,e.total_out+=t,e.avail_out-=t,n.D-=t,0==n.D&&(n.re=n.te));}function ke(e,t){let n=e.l;n.T&&n.T.Te&&(e.i=W(e.i,new x(n.I.buffer,n.te+t,n.D-t),n.D-t));}function yt(e,t){let n,r=e.l;if(U_(e)||t>5||t<0)return Ae(e,-2);if(!e.next_out||0!=e.avail_in&&!e.next_in||666==r.H&&4!=t)return Ae(e,-2);if(0==e.avail_out)return Ae(e,-5);if(n=r.oe,r.oe=t,0!=r.D){if(q(e),0==e.avail_out)return r.oe=$,0}else if(0==e.avail_in&&Et(t)<=Et(n)&&4!=t)return Ae(e,-5);if(666==r.H&&0!=e.avail_in)return Ae(e,-5);if(42==r.H&&0==r.O&&(r.H=113),42==r.H){let t,n=8+(r.k-8<<4)<<8;if(t=r.ge>=2||r.be<2?0:r.be<6?1:6==r.be?2:3,n|=t<<6,0!=r.ae&&(n|=nt),n+=31-n%31,Xe(r,n),0!=r.ae&&(Xe(r,e.i>>16),Xe(r,65535&e.i)),e.i=1,r.H=113,q(e),0!=r.D)return r.oe=$,0}if(57==r.H)if(e.i=W(0),g(r,31),g(r,139),g(r,8),r.T)g(r,(r.T.Ye?1:0)+(r.T.Te?2:0)+(null==r.T.Be?0:4)+(null==r.T.Fe?0:8)+(null==r.T.je?0:16)),g(r,255&r.T.Ge),g(r,r.T.Ge>>>8&255),g(r,r.T.Ge>>>16&255),g(r,r.T.Ge>>>24&255),g(r,9==r.be?2:r.ge>=2||r.be<2?4:0),g(r,255&r.T.Je),null!=r.T.Be&&(g(r,255&r.T.Ke),g(r,r.T.Ke>>>8&255)),r.T.Te&&(e.i=W(e.i,r.I,r.D)),r.Ze=0,r.H=69;else if(g(r,0),g(r,0),g(r,0),g(r,0),g(r,0),g(r,9==r.be?2:r.ge>=2||r.be<2?4:0),g(r,tt),r.H=113,q(e),0!=r.D)return r.oe=$,0;if(69==r.H){if(r.T&&null!=r.T.Be){let t=r.D,n=(65535&r.T.Ke)-r.Ze;for(;r.D+n>r.ne;){let i=r.ne-r.D;if(M(r.I,r.D,r.T.Be,r.Ze,i),r.D=r.ne,ke(e,t),r.Ze+=i,q(e),0!=r.D)return r.oe=$,0;t=0,n-=i;}M(r.I,r.D,r.T.Be,r.Ze,n),r.D+=n,ke(e,t),r.Ze=0;}r.H=73;}if(73==r.H){if(r.T&&r.T.Fe&&r.T.Fe.length){let t,n=r.D;do{if(r.D==r.ne){if(ke(e,n),q(e),0!=r.D)return r.oe=$,0;n=0;}t=r.T.Fe[r.Ze++],g(r,t);}while(0!=t);ke(e,n),r.Ze=0;}r.H=91;}if(91==r.H){if(r.T&&r.T.je&&r.T.je.length){let t,n=r.D;do{if(r.D==r.ne){if(ke(e,n),q(e),0!=r.D)return r.oe=$,0;n=0;}t=r.T.je[r.Ze++],g(r,t);}while(0!=t);ke(e,n);}r.H=103;}if(103==r.H){if(r.T&&r.T.Te){if(r.D+2>r.ne&&(q(e),0!=r.D))return r.oe=$,0;g(r,255&e.i),g(r,e.i>>>8&255),e.i=W(0);}if(r.H=113,q(e),0!=r.D)return r.oe=$,0}if(0!=e.avail_in||0!=r.ce||0!=t&&666!=r.H){let n=0==r.be?kt(r,t):2==r.ge?Nn(r,t):3==r.ge?kn(r,t):Ye[r.be].Re(r,t);if((2==n||3==n)&&(r.H=666),0==n||2==n)return 0==e.avail_out&&(r.oe=$),0;if(1==n&&(1==t?pt(r):5!=t&&(Me(r,null,0,0),3==t&&(At(r),0==r.ce&&(r.ae=0,r.ue=0,r.le=0))),q(e),0==e.avail_out))return r.oe=$,0}return 4!=t?0:r.O<=0?1:(2==r.O?(g(r,255&e.i),g(r,e.i>>>8&255),g(r,e.i>>>16&255),g(r,e.i>>>24&255),g(r,255&e.total_in),g(r,e.total_in>>>8&255),g(r,e.total_in>>>16&255),g(r,e.total_in>>>24&255)):(Xe(r,e.i>>>16&65535),Xe(r,65535&e.i)),q(e),r.O>0&&(r.O=-r.O),0!=r.D?0:1)}function B_(e){if(U_(e))return -2;let t=e.l,n=t.H;return t.u=Z,t.J=qe,t.K=qe,t.I=Z,t.Le=Z,t.pe=new H(0),t.ze=Z,t.Me=qe,t.R.length=0,t.X.length=0,t.$e.length=0,t.T=void 0,t.te=0,t.re=0,t.A=0,113==n?-3:0}function vt(e,t){let n,r,i=e.xe,f=e.ae,_=e.de,l=e.ve,o=e.ae>ve(e)?e.ae-ve(e):0,u=e.J,a=e.Y,c=e.u[f],s=e.u[f+1],d=e.u[f+_-1],h=e.u[f+_];e.de>=e.me&&(i>>=2),l>e.ce&&(l=e.ce);do{if(n=t,e.u[n+_]!=h||e.u[n+_-1]!=d||e.u[n]!=c||e.u[n+1]!=s)continue;let i=N.min(_e,e.ce),o=2;for(;o<i&&e.u[f+o]==e.u[n+o];)o++;if(r=o,r>_){if(e.Ve=t,_=r,r>=l)break;d=e.u[f+_-1],h=e.u[f+_];}}while((t=u[t&a])>o&&0!=--i);return _<=e.ce?_:e.ce}function It(e,t){St(e,e.u,e.ae-e.ue,t,e.ue),e.ue=e.ae,q(e.o);}function V(e,t){return It(e,t?1:0),0==e.o.avail_out?t?2:0:null}var gt=65535;function Ne(e,t){return e<t?e:t}function kt(e,t){let n,r,i,f=Ne(e.ne-5,e.h),_=0,l=e.o.avail_in;do{if(n=gt,i=e.M+42>>3,e.o.avail_out<i||(i=e.o.avail_out-i,r=e.ae-e.ue,n>r+e.o.avail_in&&(n=r+e.o.avail_in),n>i&&(n=i),n<f&&(0==n&&4!=t||0==t||n!=r+e.o.avail_in)))break;_=4==t&&n==r+e.o.avail_in?1:0,Me(e,null,0,_),e.I[e.D-4]=n,e.I[e.D-3]=n>>8,e.I[e.D-2]=~n,e.I[e.D-1]=~n>>8,q(e.o),r&&(r>n&&(r=n),M(e.o.next_out,e.o.next_out_index,e.u,e.ue,r),e.o.next_out_index+=r,e.o.avail_out-=r,e.o.total_out+=r,e.ue+=r,n-=r),n&&(C_(e.o,e.o.next_out,e.o.next_out_index,n),e.o.next_out_index+=n,e.o.avail_out-=n,e.o.total_out+=n);}while(0==_);if(l-=e.o.avail_in,l){if(l>=e.h){e._e=2;let t=e.o.next_in_index-e.h;M(e.u,0,e.o.next_in,t,e.h),e.ae=e.h,e.le=e.ae;}else e.Ne-e.ae<=l&&(e.ae-=e.h,M(e.u,0,e.u,e.h,e.ae),e._e<2&&e._e++,e.le>e.ae&&(e.le=e.ae)),M(e.u,e.ae,e.o.next_in,e.o.next_in_index-l,l),e.ae+=l,e.le+=Ne(l,e.h-e.le);e.ue=e.ae;}return e.m<e.ae&&(e.m=e.ae),_?(e.Ee=8,3):0!=t&&4!=t&&0==e.o.avail_in&&e.ae==e.ue?1:(i=e.Ne-e.ae,e.o.avail_in>i&&e.ue>=e.h&&(e.ue-=e.h,e.ae-=e.h,M(e.u,0,e.u,e.h,e.ae),e._e<2&&e._e++,i+=e.h,e.le>e.ae&&(e.le=e.ae)),i>e.o.avail_in&&(i=e.o.avail_in),i&&(C_(e.o,e.u,e.ae,i),e.ae+=i,e.le+=Ne(i,e.h-e.le)),e.m<e.ae&&(e.m=e.ae),i=e.M+42>>3,i=Ne(e.ne-i,gt),f=Ne(i,e.h),r=e.ae-e.ue,(r>=f||(r||4==t)&&0!=t&&0==e.o.avail_in&&r<=i)&&(n=Ne(r,i),_=4==t&&0==e.o.avail_in&&n==r?1:0,Me(e,e.u,n,_,e.ue),e.ue+=n,q(e.o)),_&&(e.Ee=8),_?2:0)}function z_(e,t){let n,r=false;for(;;){if(e.ce<ae){if(c_(e),e.ce<ae&&0==t)return 0;if(0==e.ce)break}if(n=0,e.ce>=k&&(n=u_(e,e.ae)),0!=n&&e.ae-n<=ve(e)&&(e.se=vt(e,n)),e.se>=k)if(e.ae,e.Ve,e.se,r=e_(e,e.ae-e.Ve,e.se-k),e.ce-=e.se,e.se<=e.ye&&e.ce>=k){e.se--;do{e.ae++,n=u_(e,e.ae);}while(0!=--e.se);e.ae++;}else e.ae+=e.se,e.se=0,e.ke=e.u[e.ae],e.ke=f_(e,e.ke,e.u[e.ae+1]);else r=ye(e,e.u[e.ae]),e.ce--,e.ae++;if(r){let t=V(e,false);if(null!=t)return t}}if(e.le=e.ae<k-1?e.ae:k-1,4==t){return V(e,true)??3}if(e.U){let t=V(e,false);if(null!=t)return t}return 1}function Re(e,t){let n,r=false;for(;;){if(e.ce<ae){if(c_(e),e.ce<ae&&0==t)return 0;if(0==e.ce)break}if(n=0,e.ce>=k&&(n=u_(e,e.ae)),e.de=e.se,e.he=e.Ve,e.se=k-1,0!=n&&e.de<e.ye&&e.ae-n<=ve(e)&&(e.se=vt(e,n),e.se<=5&&1==e.ge&&(e.se=k-1)),e.de>=k&&e.se<=e.de){let t=e.ae+e.ce-k;e.ae,e.he,e.de,r=e_(e,e.ae-1-e.he,e.de-k),e.ce-=e.de-1,e.de-=2;do{++e.ae<=t&&(n=u_(e,e.ae));}while(0!=--e.de);if(e.we=0,e.se=k-1,e.ae++,r){let t=V(e,false);if(null!=t)return t}}else if(e.we){if(r=ye(e,e.u[e.ae-1]),r&&It(e,0),e.ae++,e.ce--,0==e.o.avail_out)return 0}else e.we=1,e.ae++,e.ce--;}if(e.we&&(r=ye(e,e.u[e.ae-1]),e.we=0),e.le=e.ae<k-1?e.ae:k-1,4==t){return V(e,true)??3}if(e.U){let t=V(e,false);if(null!=t)return t}return 1}function kn(e,t){let n,r,i,f;for(;;){if(e.ce<=_e){if(c_(e),e.ce<=_e&&0==t)return 0;if(0==e.ce)break}if(e.se=0,e.ce>=k&&e.ae>0&&(i=e.ae-1,r=e.u[i],r==++i&&r==++i&&r==++i)){f=e.ae+_e;do{}while(r==++i&&r==++i&&r==++i&&r==++i&&r==++i&&r==++i&&r==++i&&r==++i&&i<f);e.se=_e-(f-i),e.se>e.ce&&(e.se=e.ce);}if(e.se>=k?(e.ae,e.ae,e.se,n=e_(e,1,e.se-k),e.ce-=e.se,e.ae+=e.se,e.se=0):(n=ye(e,e.u[e.ae]),e.ce--,e.ae++),n){let t=V(e,false);if(null!=t)return t}}if(e.le=0,4==t){return V(e,true)??3}if(e.U){let t=V(e,false);if(null!=t)return t}return 1}function Nn(e,t){let n=false;for(;;){if(0==e.ce&&(c_(e),0==e.ce)){if(0==t)return 0;break}if(e.se=0,n=ye(e,e.u[e.ae]),e.ce--,e.ae++,n){let t=V(e,false);if(null!=t)return t}}if(e.le=0,4==t){return V(e,true)??3}if(e.U){let t=V(e,false);if(null!=t)return t}return 1}var ue=852,d_=592,m_=594,Nt=ge.map(e=>e+1),Rt=Te.subarray(0,-1).map(e=>e+3),Rn=[16,1,73,1,200,1],zn=[144,1,72,1,78,1],zt=Ee.map(Yt),Ct=Ee.map(Wt);zt.push(64,2),Ct.push(142,2);var Lt=de.slice(0,-2).map(Yt),Ot=de.slice(0,-2).map(Wt);Lt.push(...Rn),Ot.push(...zn);var Ht=new E([...Rt,258,0,0]),Ut=new E([...Rt,3,0,0]),Bt=te(Lt),Ft=te(Ot),Zt=new E([...Nt,0,0]),Pt=new E([...Nt,32769,49153]),Mt=te(zt),Xt=te(Ct);function Yt(e,t){return t%2?e:e+16}function Wt(e,t){return t%2?e:e+128}function Kt(e,t){let n,r=e.l,i=e.next_in_index,f=e.next_out_index,_=e.next_in,l=e.next_out,o=r.u,u=r.p>>>0,a=r.M>>>0,c=r.et,s=r.tt,d=(1<<r.nt)-1,h=(1<<r.rt)-1,w=r.h>>>0,k=r.m>>>0,b=r.v>>>0,g=r.it,m=f-(t-e.avail_out),v=f+(e.avail_out-257),x=i+(e.avail_in-5),y=0,p=0,z=0,M=0;e:do{for(;a<15;){if(!(i<_.length))break e;u+=_[i++]<<a,a+=8;}n=c[u&d];t:for(;;){if(z=n.ft,u>>>=z,a-=z,z=n._t,0==z){l[f++]=n.lt;break}if(16&z){if(y=n.lt,z&=15,z){for(;a<z;){if(!(i<_.length)){r.ot=16200;break e}u+=_[i++]<<a,a+=8;}y+=u&(1<<z)-1,u>>>=z,a-=z;}for(;a<15;){if(!(i<_.length)){r.ot=16200;break e}u+=_[i++]<<a,a+=8;}n=s[u&h];n:for(;;){if(z=n.ft,u>>>=z,a-=z,z=n._t,16&z){if(p=n.lt,z&=15,z){for(;a<z;){if(!(i<_.length)){r.ot=16200;break e}u+=_[i++]<<a,a+=8;}p+=u&(1<<z)-1,u>>>=z,a-=z;}let t=y,c=f-m;if(p>c){let n=p-c;if(n>k&&g){e.msg="invalid distance too far back",r.ot=16209;break e}if(0==b){if(M=w-n,!(n<t)){for(let e=0;e<t;++e)l[f++]=o[M++];continue e}for(let e=0;e<n;++e)l[f++]=o[M++];t-=n,M=f-p;}else if(b<n){M=w+b-n;let e=n-b;if(!(e<t)){for(let e=0;e<t;++e)l[f++]=o[M++];continue e}for(let t=0;t<e;++t)l[f++]=o[M++];if(t-=e,M=0,b<t){for(let e=0;e<b;++e)l[f++]=o[M++];t-=b,M=f-p;}}else {if(M=b-n,!(n<t)){for(let e=0;e<t;++e)l[f++]=o[M++];continue e}for(let e=0;e<n;++e)l[f++]=o[M++];t-=n,M=f-p;}for(;t>2;)l[f++]=l[M++],l[f++]=l[M++],l[f++]=l[M++],t-=3;t&&(l[f++]=l[M++],t>1&&(l[f++]=l[M++]));}else {for(M=f-p;t>2;)l[f++]=l[M++],l[f++]=l[M++],l[f++]=l[M++],t-=3;t&&(l[f++]=l[M++],t>1&&(l[f++]=l[M++]));}break}if(64&z){e.msg="invalid distance code",r.ot=16209;break e}n=s[n.lt+(u&(1<<z)-1)];continue n}break}if(64&z){if(32&z){r.ot=16191;break e}e.msg="invalid literal/length code",r.ot=16209;break e}n=c[n.lt+(u&(1<<z)-1)];continue t}}while(i<x&&f<v);let L=a>>3;i-=L,a-=L<<3,u&=(1<<a)-1,e.next_in_index=i,e.next_out_index=f,e.avail_in=i<x?x-i+5:5-(i-x),e.avail_out=f<v?v-f+257:257-(f-v),r.p=u>>>0,r.M=a>>>0;}function F_(e,t){let n=[],r=t?ue+m_:ue+d_;return {...Je(e,0),o:e,ot:16180,ut:false,O:0,ct:false,st:0,dt:0,ht:0,wt:0,u:Z,kt:0,bt:0,Be:0,et:n,tt:n,nt:0,rt:0,gt:0,vt:0,xt:0,yt:0,zt:n,Mt:new E(320),Lt:new E(288),Et:new y(r).fill(null).map(()=>pe()),Zt:0,it:true,qt:0,Nt:0,Vt:t}}function pe(e=0,t=0,n=0){return {_t:e,ft:t,lt:n}}function Z_(e=1){return {_t:64,ft:e,lt:0}}function qt(e=0){return {_t:96,ft:e,lt:0}}function P_(e){return (255&e)<<24|(e>>8&255)<<16|(e>>16&255)<<8|e>>24&255}var Le=15,Ln={Vt:false,Wt:Ht,St:Bt,$t:Zt,It:Mt,Dt:20,At:257,Qt:0,Ut:d_,Pt:false,Rt:true},On={Vt:true,Wt:Ut,St:Ft,$t:Pt,It:Xt,Dt:19,At:256,Qt:-1,Ut:m_,Pt:true,Rt:false};function Oe(e,t,n,r,i,f,_,l){let o,u,a,c,s,d,h,w,k,b,g,m,v,x,y,p,z,M,L,Z=new E(Le+1),q=new E(Le+1),N=l?On:Ln;for(o=0;o<=Le;o++)Z[o]=0;for(u=0;u<n;u++)Z[t[u]]++;for(s=i.Xt,c=Le;c>=1&&0==Z[c];c--);if(s>c&&(s=c),0==c)return N.Rt?(y=Z_(1),r.Xt[0]=y,r.Xt[1]=y,i.Xt=1,0):-1;for(a=1;a<c&&0==Z[a];a++);for(s<a&&(s=a),w=1,o=1;o<=Le;o++)if(w<<=1,w-=Z[o],w<0)return -1;if(w>0&&(0==e||1!=c))return -1;for(q[1]=0,o=1;o<Le;o++)q[o+1]=q[o]+Z[o];for(u=0;u<n;u++)0!=t[u]&&(f[q[t[u]]++]=u);switch(e){case 0:z=M=f,L=N.Dt;break;case 1:z=N.Wt,M=N.St,L=N.At;break;default:z=N.$t,M=N.It,L=N.Qt;}if(b=0,u=0,o=a,p=_.Xt,d=s,h=0,v=-1,k=1<<s,x=k-1,1==e&&(N.Pt?k>=ue:k>ue)||2==e&&(N.Pt?k>=N.Ut:k>N.Ut))return 1;for(;;){y=Hn(f,u,o,h,e,z,M,L,N.Vt),g=1<<o-h,m=1<<d,a=m;do{m-=g;let e=(b>>h)+m;r.Xt[p+e]={...y};}while(0!=m);for(g=1<<o-1;b&g;)g>>=1;if(0!=g?(b&=g-1,b+=g):b=0,u++,0==--Z[o]){if(o==c)break;o=t[f[u]];}if(o>s&&(b&x)!=v){for(0==h&&(h=s),p+=1<<d,d=o-h,w=1<<d;d+h<c&&(w-=Z[d+h],!(w<=0));)d++,w<<=1;if(k+=1<<d,1==e&&(N.Pt?k>=ue:k>ue)||2==e&&(N.Pt?k>=N.Ut:k>N.Ut))return 1;v=b&x,r.Xt[_.Xt+v]={_t:d,ft:s,lt:p-_.Xt};}}if(0!=b)for(y=Z_(o-h);0!=b;){for(0!=h&&(b&x)!=v&&(h=0,o=s,p=_.Xt,d=s,y.ft=o),r.Xt[p+(b>>h)]={...y},g=1<<o-1;b&g;)g>>=1;0!=g?(b&=g-1,b+=g):b=0;}return _.Xt+=k,i.Xt=s,0}function Hn(e,t,n,r,i,f,_,l,o){let u;if(o?e[t]<l:e[t]+1<l)u=pe(0,n-r,e[t]);else if(o?e[t]>l:e[t]>=l)if(o&&1==i){let i=e[t]-257;u=pe(_[i],n-r,f[i]);}else {let i=o?e[t]:e[t]-l;u=pe(_[i],n-r,f[i]);}else u=qt(n-r);return u}var Pn={Ct:true,Ht:new y(544),Ot:[],Tt:[]},Mn={Ct:true,Ht:new y(544),Ot:[],Tt:[]};function jt(e){let t=Ve();return t.l=F_(t,!!e),t}function Ge(e){let t;return !(e&&(t=e.l,!(!t||t.o!=e||t.Vt&&(t.ot<16191||t.ot>16209)||!t.Vt&&(t.ot<16180||t.ot>16211))))}function Xn(e){let t;return Ge(e)?-2:(t=e.l,e.total_in=e.total_out=t.wt=0,e.msg="",t.O&&(e.i=1&t.O),t.ot=t.Vt?16191:16180,t.ut=false,t.ct=false,t.st=-1,t.dt=t.Vt?65536:32768,delete t.T,t.p=0,t.M=0,t.et=t.Et,t.tt=t.Et,t.zt=t.Et,t.it=true,t.qt=-1,0)}function Yn(e){let t;return Ge(e)?-2:(t=e.l,t.h=0,t.m=0,t.v=0,Xn(e))}function Wn(e,t){let n,r,i;if(Ge(e))return -2;if(r=e.l,r.Vt?(t=-16,i=16):i=15,t<0){if(t<-i)return -2;n=0,t=-t;}else n=5+(t>>4),!r.Vt&&t<48&&(t&=15);return t&&(t<8||t>i)?-2:(r.u.length>0&&r.k!=t&&(r.u=Z),r.O=n,r.k=t,Yn(e))}function Vt(e,t){let n,r;if(!e)return -2;e.msg="";let i=!!e.l.Vt;return r=F_(e,i),i&&(t=-16),e.l=r,r.o=e,r.ot=r.Vt?16191:16180,n=Wn(e,t),n}function Gn(e){let t=e.Vt?Mn:Pn,n={Xt:0};if(t.Ct){let r,i,f;for(r=0;r<144;)e.Mt[r++]=8;for(;r<256;)e.Mt[r++]=9;for(;r<280;)e.Mt[r++]=7;for(;r<288;)e.Mt[r++]=8;for(let e=0;e<544;e++)t.Ht[e]=pe();f=t.Ht,t.Ot=f,i=9;let _={Xt:f},l={Xt:i},o={Xt:0};for(Oe(1,e.Mt,288,_,l,e.Lt,o,e.Vt),f=_.Xt,i=l.Xt,e.Zt=o.Xt,r=0;r<32;)e.Mt[r++]=5;i=5;let u=o.Xt,a={Xt:f},c={Xt:i};n.Xt=u,Oe(2,e.Mt,32,a,c,e.Lt,n,e.Vt),t.Tt=f.slice(u),t.Ct=false;}e.et=t.Ot,e.nt=9,e.tt=t.Tt,e.rt=5,e.Zt=n.Xt;}function Kn(e,t,n){let r=e.l;if(!(r.u&&0!=r.u.length||(r.u=new x(1<<r.k),r.u)))return 1;if(0==r.h&&(r.h=1<<r.k,r.v=0,r.m=0),n>=r.h)M(r.u,0,t,t.length-r.h,r.h),r.v=0,r.m=r.h;else {let e=r.h-r.v;e>n&&(e=n),M(r.u,r.v,t,t.length-n,e),(n-=e)?(M(r.u,0,t,t.length-n,n),r.v=n,r.m=r.h):(r.v+=e,r.v==r.h&&(r.v=0),r.m<r.h&&(r.m+=e));}return 0}var s_=class extends z{constructor(){super("Need more input");}};function Jt(e,t){let n,r,i,f,_,l,o,u,a,c,s,d,h,w,k,b,g,m=new x(4);if(Ge(e)||!e.next_out||!e.next_in&&0!=e.avail_in)return -2;l=0,u=0,o=0,a=0,r=Z,i=0,f=Z,_=0,n=e.l,16191==n.ot&&(n.ot=16192),L(),c=l,s=o,g=0;try{for(;;)switch(n.ot){case 16180:if(0==n.O){n.ot=16192;break}if(V(16),2&n.O&&35615==u){0==n.k&&(n.k=15),n.ht=W(0),n.ht=p(n.ht,u),q(),n.ot=16181;break}if(n.T&&(n.T.Yt=-1),!(1&n.O)||((S(8)<<8)+(u>>8))%31){e.msg="incorrect header check",n.ot=16209;break}if(8!=S(4)){e.msg="unknown compression method",n.ot=16209;break}if($(4),b=S(4)+8,0==n.k&&(n.k=b),b>15||b>n.k){e.msg="invalid window size",n.ot=16209;break}n.dt=1<<b,n.st=0,e.i=n.ht=se(0),n.ot=512&u?16189:16191,q();break;case 16181:if(V(16),n.st=u,8!=(255&n.st)){e.msg="unknown compression method",n.ot=16209;break}if(57344&n.st){e.msg="unknown header flags set",n.ot=16209;break}n.T&&(n.T.Ye=u>>8&1),512&n.st&&4&n.O&&(n.ht=p(n.ht,u)),q(),n.ot=16182;case 16182:V(32),n.T&&(n.T.Ge=u),512&n.st&&4&n.O&&(n.ht=z(n.ht,u)),q(),n.ot=16183;case 16183:V(16),n.T&&(n.T.Bt=255&u,n.T.Je=u>>8),512&n.st&&4&n.O&&(n.ht=p(n.ht,u)),q(),n.ot=16184;case 16184:1024&n.st?(V(16),n.kt=u,n.T&&(n.T.Ke=u),512&n.st&&4&n.O&&(n.ht=p(n.ht,u)),q()):n.T&&(n.T.Be=Z),n.ot=16185;case 16185:if(1024&n.st&&(d=n.kt,d>l&&(d=l),d&&(n.T&&n.T.Be&&n.T.Ft&&(b=n.T.Ke-n.kt)<n.T.Ft&&M(n.T.Be,b,r,i,d),512&n.st&&4&n.O&&(n.ht=W(n.ht,r.subarray(i,i+d),d)),l-=d,i+=d,n.kt-=d),n.kt))return v();n.kt=0,n.ot=16186;case 16186:if(2048&n.st){if(0==l)return v();d=0;do{b=r[i+d++],n.T&&n.T.jt&&n.kt<n.T.jt&&(n.T.Fe[n.kt++]=b);}while(b&&d<l);if(512&n.st&&4&n.O&&(n.ht=W(n.ht,r.subarray(i,i+d),d)),l-=d,i+=d,b)return v()}else n.T&&(n.T.Fe=Z);n.kt=0,n.ot=16187;case 16187:if(4096&n.st){if(0==l)return v();d=0;do{b=r[i+d++],n.T&&n.T.Gt&&n.kt<n.T.Gt&&(n.T.je[n.kt++]=b);}while(b&&d<l);if(512&n.st&&4&n.O&&(n.ht=W(n.ht,r.subarray(i,i+d),d)),l-=d,i+=d,b)return v()}else n.T&&(n.T.je=Z);n.ot=16188;case 16188:if(512&n.st){if(V(16),4&n.O&&u!=(65535&n.ht)){e.msg="header crc mismatch",n.ot=16209;break}q();}n.T&&(n.T.Te=n.st>>9&1,n.T.Yt=1),e.i=n.ht=W(0),n.ot=16191;break;case 16189:V(32),e.i=n.ht=P_(u),q(),n.ot=16190;case 16190:if(!n.ct)return E(),2;e.i=n.ht=se(0),n.ot=16191;case 16191:if(5==t||6==t)return v();case 16192:if(n.ut){I(),n.ot=16206;break}switch(V(3),n.ut=!!S(1),$(1),S(2)){case 0:n.ot=16193;break;case 1:if(Gn(n),n.ot=16199,6==t)return $(2),v();break;case 2:n.ot=16196;break;case 3:e.msg="invalid block type",n.ot=16209;}$(2);break;case 16193:if(I(),V(32),(65535&u)!=(u>>>16^65535)){e.msg="invalid stored block lengths",n.ot=16209;break}if(n.kt=65535&u,q(),n.ot=16194,6==t)return v();case 16194:n.ot=16195;case 16195:if(d=n.kt,d){if(d>l&&(d=l),d>o&&(d=o),0==d)return v();M(f,_,r,i,d),l-=d,i+=d,o-=d,_+=d,n.kt-=d;break}n.ot=16191;break;case 16196:if(V(14),n.vt=S(5)+257,$(5),n.xt=S(5)+1,$(5),n.gt=S(4)+4,$(4),n.vt>286||!n.Vt&&n.xt>30){e.msg=n.Vt?"too many length":"too many length or distance symbols",n.ot=16209;break}n.yt=0,n.ot=16197;case 16197:for(;n.yt<n.gt;)V(3),n.Mt[Se[n.yt++]]=S(3),$(3);for(;n.yt<19;)n.Mt[Se[n.yt++]]=0;n.zt=n.Et,n.et=n.tt=n.zt,n.nt=7;let c={Xt:n.zt},m={Xt:n.nt},x={Xt:0};if(g=Oe(0,n.Mt,19,c,m,n.Lt,x,n.Vt),n.zt=c.Xt,n.nt=m.Xt,g){e.msg="invalid code lengths set",n.ot=16209;break}n.yt=0,n.ot=16198;case 16198:for(;n.yt<n.vt+n.xt;){for(;w=n.et[S(n.nt)],!(w.ft<=a);)N();if(w.lt<16)$(w.ft),n.Mt[n.yt++]=w.lt;else {if(16==w.lt){if(V(w.ft+2),$(w.ft),0==n.yt){e.msg="invalid bit length repeat",n.ot=16209;break}b=n.Mt[n.yt-1],d=3+S(2),$(2);}else 17==w.lt?(V(w.ft+3),$(w.ft),b=0,d=3+S(3),$(3)):(V(w.ft+7),$(w.ft),b=0,d=11+S(7),$(7));if(n.yt+d>n.vt+n.xt){e.msg="invalid bit length repeat",n.ot=16209;break}for(;d--;)n.Mt[n.yt++]=b;}}if(16209==n.ot)break;if(0==n.Mt[256]){e.msg="invalid code -- missing end-of-block",n.ot=16209;break}n.zt=n.Et,n.nt=9;let D={Xt:n.zt},A={Xt:n.nt},Q={Xt:0};g=Oe(1,n.Mt,n.vt,D,A,n.Lt,Q,n.Vt),n.zt=D.Xt,n.nt=A.Xt;let U=Q.Xt;if(n.et=n.zt.slice(0,U),g){e.msg="invalid literal/lengths set",n.ot=16209;break}n.rt=6;let P=n.Mt.subarray(n.vt,n.vt+n.xt),R={Xt:n.zt},X={Xt:n.rt},C={Xt:U};if(g=Oe(2,P,n.xt,R,X,n.Lt,C,n.Vt),n.zt=R.Xt,n.rt=X.Xt,n.tt=n.zt.slice(U),g){e.msg="invalid distances set",n.ot=16209;break}if(n.ot=16199,6==t)return v();case 16199:n.ot=16200;case 16200:if(!n.Vt&&l>=6&&o>=258){E(),Kt(e,s),L(),16191==n.ot&&(n.qt=-1);break}for(n.qt=0;w=n.et[S(n.nt)],!(w.ft<=a);)N();if(w._t&&!(240&w._t)){for(k=w;w=n.et[k.lt+(S(k.ft+k._t)>>k.ft)],!(k.ft+w.ft<=a);)N();$(k.ft),n.qt+=k.ft;}if($(w.ft),n.qt+=w.ft,n.kt=w.lt,0==w._t){n.ot=16205;break}if(32&w._t){n.qt=-1,n.ot=16191;break}if(64&w._t){e.msg="invalid literal/length code",n.ot=16209;break}n.Be=w._t&(n.Vt?31:15),n.ot=16201;case 16201:n.Be&&(V(n.Be),n.kt+=S(n.Be),$(n.Be),n.qt+=n.Be),n.Nt=n.kt,n.ot=16202;case 16202:for(;w=n.tt[S(n.rt)],!(w.ft<=a);)N();if(!(240&w._t)){for(k=w;w=n.tt[k.lt+(S(k.ft+k._t)>>k.ft)],!(k.ft+w.ft<=a);)N();$(k.ft),n.qt+=k.ft;}if($(w.ft),n.qt+=w.ft,64&w._t){e.msg="invalid distance code",n.ot=16209;break}n.bt=w.lt,n.Be=15&w._t,n.ot=16203;case 16203:n.Be&&(V(n.Be),n.bt+=S(n.Be),$(n.Be),n.qt+=n.Be),n.ot=16204;case 16204:if(0==o)return v();if(d=s-o,n.bt>d){if(d=n.bt-d,d>n.m&&n.it){e.msg="invalid distance too far back",n.ot=16209;break}d>n.v?(d-=n.v,h=n.h-d):h=n.v-d,d>n.kt&&(d=n.kt),d>o&&(d=o);for(let e=0;e<d;++e)f[_]=255&n.u[h],++_,++h;}else {h=_-n.bt,d=n.kt,d>o&&(d=o);for(let e=0;e<d;++e)f[_]=f[h],++_,++h;}d>o&&(d=o),o-=d,n.kt-=d,0==n.kt&&(n.ot=16200);break;case 16205:if(0==o)return v();f[_++]=n.kt,o--,n.ot=16200;break;case 16206:if(n.O){if(V(32),s-=o,e.total_out+=s,n.wt+=s,4&n.O&&s){let t=f.subarray(_-s,_);e.i=n.ht=y(n.ht,t,s);}if(s=o,4&n.O&&(n.st?u:P_(u)>>>0)!=n.ht){e.msg="incorrect data check",n.ot=16209;break}q();}n.ot=16207;case 16207:if(n.O&&n.st){if(V(32),4&n.O&&u!=(4294967295&n.wt)){e.msg="incorrect length check",n.ot=16209;break}q();}n.ot=16208;case 16208:return g=1,v();case 16209:return g=-3,v();case 16210:return -4;default:return -2}}catch(e){if(e instanceof s_)return v();throw e}function v(){if(E(),n.h||s!=e.avail_out&&n.ot<16209&&(n.Vt?n.ot<16208:n.ot<16206)||4!=t){let t=s-e.avail_out;if(Kn(e,e.next_out.subarray(e.next_out_index-t,e.next_out_index),t))return n.ot=16210,-4}return c-=e.avail_in,s-=e.avail_out,e.total_in+=c,e.total_out+=s,n.wt+=s,4&n.O&&s&&(e.i=n.ht=y(n.ht,e.next_out.subarray(e.next_out_index-s,e.next_out_index),s)),e.t=n.M+(n.ut?64:0)+(16191==n.ot?128:0)+(16199==n.ot||16194==n.ot?256:0),(0==c&&0==s&&0==g||4==t&&0==g)&&(g=-5),g}function y(e,t,r){return n.st?W(e,t,r):se(e,t,r)}function p(e,t){return m[0]=255&t,m[1]=t>>>8&255,W(e,m,2)>>>0}function z(e,t){return m[0]=255&t,m[1]=t>>>8&255,m[2]=t>>>16&255,m[3]=t>>>24&255,W(e,m,4)>>>0}function L(){f=e.next_out,_=e.next_out_index,o=e.avail_out,r=e.next_in,i=e.next_in_index,l=e.avail_in,u=n.p,a=n.M;}function E(){e.next_out=f,e.next_out_index=_,e.avail_out=o,e.next_in=r,e.next_in_index=i,e.avail_in=l,n.p=u,n.M=a;}function q(){u=0,a=0;}function N(){if(0==l)throw new s_;l--,u+=(255&r[i])<<a,i++,u>>>=0,a+=8;}function V(e){for(;a<e;)N();}function S(e){return u&(1<<e)-1}function $(e){u>>>=e,a-=e;}function I(){u>>>=7&a,a-=7&a;}}function Qt(e){return Ge(e)?-2:0}var M_=65536,qn=32768,X_=class{constructor(e=16,t=M_){this.Jt=[],this.Kt=e;for(let n=0;n<N.min(e,4);n++)this.Jt.push(new x(t));}acquire(e=M_){for(let t=this.Jt.length-1;t>=0;t--){let n=this.Jt[t];if(n.length>=e)return this.Jt.splice(t,1),n}return new x(e)}release(e){this.Jt.length<this.Kt&&this.Jt.push(e);}};function $t(e){let t=new X_(32,M_),n=null;function r(e){try{t.release(e);}catch{}}return new U({start(){},transform(i,f){if(!n){let t=e.en(),r=e.tn(t);if(0!=r&&0!=r)throw new z("init failed: "+r);n={o:t};}let _=n.o,l=0;for(;l<i.length;){let n=N.min(i.length-l,qn),o=i.subarray(l,l+n);for(_.next_in=o,_.next_in_index=0,_.avail_in=o.length;_.avail_in>0;){let n=t.acquire(),i=false;try{_.next_out=n,_.next_out_index=0,_.avail_out=n.length;let r=e.nn(_,0),l=n.length-_.avail_out;if(l>0){let e=!1,r={rn:n.subarray(0,l),release:()=>{e||(e=!0,t.release(n));}};i=!0,f.enqueue(r);}if(0!=r&&1!=r)throw new z("process error: "+r)}finally{i||r(n);}}l+=n;}},flush(i){if(!n)return;let f=n.o;for(;;){let n=t.acquire(),_=false;try{f.next_out=n,f.next_out_index=0,f.avail_out=n.length;let r=e.nn(f,4),l=n.length-f.avail_out;if(l>0){let e=!1,r={rn:n.subarray(0,l),release:()=>{e||(e=!0,t.release(n));}};_=!0,i.enqueue(r);}if(1==r)break;if(0!=r)throw new z("finalization error: "+r)}finally{_||r(n);}}let _=e.fn(f);if(0!=_&&0!=_)throw new z("end failed: "+_)}})}function en(){return new U({start(){},transform(e,t){try{t.enqueue(e.rn.slice(0));}finally{e.release();}},flush(){}})}function jn(e="deflate",t){let n="gzip"==e?31:"deflate-raw"==e?-15:15,r=t&&"number"==typeof t.level?t.level:-1;return $t({en:()=>wt(),tn:e=>Dt(e,r,8,n,8,0),nn:yt,fn:B_})}function Vn(e="deflate"){let t="gzip"==e?31:"deflate-raw"==e?-15:15;return $t({en:()=>jt("deflate64-raw"==e),tn:e=>Vt(e,t),nn:Jt,fn:Qt})}var h_=class{constructor(e="deflate",t){let n=jn(e,t);this.writable=n.writable,this.readable=n.readable.pipeThrough(en());}},x_=class{constructor(e="deflate"){let t=Vn(e);this.writable=t.writable,this.readable=t.readable.pipeThrough(en());}};
5976
6454
 
5977
6455
  /*
5978
6456
  Copyright (c) 2025 Gildas Lormeau. All rights reserved.
@@ -6006,7 +6484,7 @@ var{Uint8Array:x,Uint16Array:E,Int32Array:H,TransformStream:U,Math:N,Error:z,Arr
6006
6484
  configure({
6007
6485
  workerURI: "./core/web-worker-native.js",
6008
6486
  wasmURI: null,
6009
- CompressionStreamZlib: s_,
6487
+ CompressionStreamZlib: h_,
6010
6488
  DecompressionStreamZlib: x_
6011
6489
  });
6012
6490
 
@@ -6039,12 +6517,15 @@ configure({
6039
6517
  */
6040
6518
 
6041
6519
 
6520
+ const ERR_ENTRY_EXISTS = "Entry filename already exists";
6521
+ const ERR_READABLE_CONSUMED = "Readable stream already consumed";
6522
+
6042
6523
  class ZipEntry {
6043
6524
 
6044
6525
  constructor(fs, name, params, parent) {
6045
6526
  const zipEntry = this;
6046
6527
  if (fs.root && parent && parent.getChildByName(name)) {
6047
- throw new Error("Entry filename already exists");
6528
+ throw new Error(ERR_ENTRY_EXISTS);
6048
6529
  }
6049
6530
  if (!params) {
6050
6531
  params = {};
@@ -6054,13 +6535,17 @@ class ZipEntry {
6054
6535
  name,
6055
6536
  data: params.data,
6056
6537
  options: params.options,
6057
- id: fs.entries.length,
6538
+ id: fs.entryIdCounter++,
6058
6539
  parent,
6059
6540
  children: [],
6060
6541
  uncompressedSize: params.uncompressedSize || 0,
6061
6542
  passThrough: params.passThrough
6062
6543
  });
6063
- fs.entries.push(zipEntry);
6544
+ // detached entries (e.g. clones) are not registered until they are attached,
6545
+ // otherwise they could never be garbage collected
6546
+ if (parent || !fs.root) {
6547
+ fs.entries[zipEntry.id] = zipEntry;
6548
+ }
6064
6549
  if (parent) {
6065
6550
  zipEntry.parent.children.push(zipEntry);
6066
6551
  }
@@ -6098,7 +6583,7 @@ class ZipEntry {
6098
6583
  rename(name) {
6099
6584
  const parent = this.parent;
6100
6585
  if (parent && parent.getChildByName(name)) {
6101
- throw new Error("Entry filename already exists");
6586
+ throw new Error(ERR_ENTRY_EXISTS);
6102
6587
  } else {
6103
6588
  this.name = name;
6104
6589
  }
@@ -6137,16 +6622,17 @@ class ZipFileEntry extends ZipEntry {
6137
6622
  }
6138
6623
 
6139
6624
  isPasswordProtected() {
6140
- return this.data.encrypted;
6625
+ return Boolean(this.data && this.data.encrypted);
6141
6626
  }
6142
6627
 
6143
6628
  async checkPassword(password, options = {}) {
6144
6629
  const zipEntry = this;
6145
6630
  if (zipEntry.isPasswordProtected()) {
6146
- options.password = password;
6147
- options.checkPasswordOnly = true;
6148
6631
  try {
6149
- await zipEntry.data.getData(null, options);
6632
+ await zipEntry.data.getData(null, Object.assign({}, options, {
6633
+ password,
6634
+ checkPasswordOnly: true
6635
+ }));
6150
6636
  return true;
6151
6637
  } catch (error) {
6152
6638
  if (error.message == ERR_INVALID_PASSWORD) {
@@ -6180,8 +6666,15 @@ class ZipFileEntry extends ZipEntry {
6180
6666
  return this.getData({ writable }, options);
6181
6667
  }
6182
6668
 
6183
- getArrayBuffer(options) {
6184
- return this.data.arrayBuffer(options);
6669
+ async getArrayBuffer(options) {
6670
+ // this.data may be a string, a Uint8Array, a data URI or a Blob depending on how the entry
6671
+ // was created, so retrieve the bytes through getUint8Array rather than assuming a Blob; this
6672
+ // also applies the options (password, signal, onprogress...) like the other getData() getters
6673
+ const array = await this.getUint8Array(options);
6674
+ // return the backing buffer directly when the array spans it, slicing the exact bytes otherwise
6675
+ return array.byteOffset || array.byteLength != array.buffer.byteLength
6676
+ ? array.buffer.slice(array.byteOffset, array.byteOffset + array.byteLength)
6677
+ : array.buffer;
6185
6678
  }
6186
6679
 
6187
6680
  replaceBlob(blob) {
@@ -6223,7 +6716,7 @@ class ZipFileEntry extends ZipEntry {
6223
6716
  replaceReadable(readable) {
6224
6717
  Object.assign(this, {
6225
6718
  data: null,
6226
- Reader: function () { return { readable }; },
6719
+ Reader: getReadableReader(readable),
6227
6720
  Writer: null,
6228
6721
  reader: null
6229
6722
  });
@@ -6239,7 +6732,7 @@ class ZipDirectoryEntry extends ZipEntry {
6239
6732
 
6240
6733
  clone(deepClone) {
6241
6734
  const zipEntry = this;
6242
- const clonedEntry = new ZipDirectoryEntry(zipEntry.fs, zipEntry.name);
6735
+ const clonedEntry = new ZipDirectoryEntry(zipEntry.fs, zipEntry.name, zipEntry);
6243
6736
  if (deepClone) {
6244
6737
  clonedEntry.children = zipEntry.children.map(child => {
6245
6738
  const childClone = child.clone(deepClone);
@@ -6313,7 +6806,7 @@ class ZipDirectoryEntry extends ZipEntry {
6313
6806
 
6314
6807
  addReadable(name, readable, options = {}) {
6315
6808
  return addChild(this, name, {
6316
- Reader: function () { return { readable }; },
6809
+ Reader: getReadableReader(readable),
6317
6810
  options
6318
6811
  });
6319
6812
  }
@@ -6327,6 +6820,7 @@ class ZipDirectoryEntry extends ZipEntry {
6327
6820
  }
6328
6821
 
6329
6822
  addFile(file, options = {}) {
6823
+ options = Object.assign({}, options);
6330
6824
  if (!options.lastModDate) {
6331
6825
  options.lastModDate = new Date(file.lastModified);
6332
6826
  }
@@ -6393,11 +6887,15 @@ class ZipDirectoryEntry extends ZipEntry {
6393
6887
  try {
6394
6888
  const path = entry.filename.split("/");
6395
6889
  const name = path.pop();
6396
- path.forEach((pathPart, pathIndex) => {
6890
+ path.forEach(pathPart => {
6397
6891
  const previousParent = parent;
6398
6892
  parent = parent.getChildByName(pathPart);
6399
- if (!parent) {
6400
- parent = new ZipDirectoryEntry(this.fs, pathPart, { data: pathIndex == path.length - 1 ? entry : null }, previousParent);
6893
+ if (parent) {
6894
+ if (!parent.directory) {
6895
+ throw new Error(ERR_ENTRY_EXISTS);
6896
+ }
6897
+ } else {
6898
+ parent = new ZipDirectoryEntry(this.fs, pathPart, { data: null }, previousParent);
6401
6899
  importedEntries.push(parent);
6402
6900
  }
6403
6901
  });
@@ -6408,6 +6906,22 @@ class ZipDirectoryEntry extends ZipEntry {
6408
6906
  uncompressedSize: entry.uncompressedSize,
6409
6907
  passThrough: options.passThrough
6410
6908
  }));
6909
+ } else {
6910
+ let directoryEntry = parent;
6911
+ if (name) {
6912
+ directoryEntry = parent.getChildByName(name);
6913
+ if (directoryEntry) {
6914
+ if (!directoryEntry.directory) {
6915
+ throw new Error(ERR_ENTRY_EXISTS);
6916
+ }
6917
+ } else {
6918
+ directoryEntry = new ZipDirectoryEntry(this.fs, name, { data: null }, parent);
6919
+ importedEntries.push(directoryEntry);
6920
+ }
6921
+ }
6922
+ if (directoryEntry != this && !directoryEntry.data) {
6923
+ directoryEntry.data = entry;
6924
+ }
6411
6925
  }
6412
6926
  } catch (error) {
6413
6927
  try {
@@ -6423,14 +6937,15 @@ class ZipDirectoryEntry extends ZipEntry {
6423
6937
  return importedEntries;
6424
6938
  }
6425
6939
 
6426
- async exportZip(writer, options) {
6940
+ async exportZip(writer, options = {}) {
6427
6941
  const zipEntry = this;
6942
+ options = Object.assign({}, options);
6428
6943
  if (options.bufferedWrite === UNDEFINED_VALUE) {
6429
6944
  options.bufferedWrite = true;
6430
6945
  }
6431
- await Promise.all([initReaders(zipEntry, options.readerOptions), initStream(writer)]);
6946
+ const [readers] = await Promise.all([initReaders(zipEntry, options.readerOptions), initStream(writer)]);
6432
6947
  const zipWriter = new ZipWriter(writer, options);
6433
- await exportZip(zipWriter, zipEntry, getTotalSize([zipEntry], "uncompressedSize"), options);
6948
+ await exportZip(zipWriter, zipEntry, getTotalSize([zipEntry], "uncompressedSize"), options, readers);
6434
6949
  await zipWriter.close();
6435
6950
  return writer.getData ? writer.getData() : writer.writable;
6436
6951
  }
@@ -6476,7 +6991,15 @@ class FS {
6476
6991
 
6477
6992
  remove(entry) {
6478
6993
  detach(entry);
6479
- this.entries[entry.id] = null;
6994
+ const removedEntries = [entry];
6995
+ while (removedEntries.length) {
6996
+ const removedEntry = removedEntries.pop();
6997
+ this.entries[removedEntry.id] = null;
6998
+ for (const child of removedEntry.children) {
6999
+ removedEntries.push(child);
7000
+ }
7001
+ }
7002
+ entry.parent = UNDEFINED_VALUE;
6480
7003
  }
6481
7004
 
6482
7005
  move(entry, destination) {
@@ -6486,12 +7009,17 @@ class FS {
6486
7009
  if (destination.directory) {
6487
7010
  if (!destination.isDescendantOf(entry)) {
6488
7011
  if (entry != destination) {
6489
- if (destination.getChildByName(entry.name)) {
6490
- throw new Error("Entry filename already exists");
7012
+ const existingChild = destination.getChildByName(entry.name);
7013
+ if (existingChild) {
7014
+ if (existingChild != entry) {
7015
+ throw new Error(ERR_ENTRY_EXISTS);
7016
+ }
7017
+ } else {
7018
+ detach(entry);
7019
+ entry.parent = destination;
7020
+ destination.children.push(entry);
7021
+ registerEntries(this, entry);
6491
7022
  }
6492
- detach(entry);
6493
- entry.parent = destination;
6494
- destination.children.push(entry);
6495
7023
  }
6496
7024
  } else {
6497
7025
  throw new Error("Entry is a ancestor of target entry");
@@ -6508,6 +7036,11 @@ class FS {
6508
7036
  for (let index = 0; node && index < path.length; index++) {
6509
7037
  node = node.getChildByName(path[index]);
6510
7038
  }
7039
+ if (!node) {
7040
+ // exclude detached entries, e.g. clones registered in `entries` but not attached
7041
+ node = this.entries.find(entry => entry && (entry == this.root || entry.isDescendantOf(this.root)) &&
7042
+ entry.getRelativeName() == fullname);
7043
+ }
6511
7044
  return node;
6512
7045
  }
6513
7046
 
@@ -6589,6 +7122,7 @@ class FS {
6589
7122
  }
6590
7123
 
6591
7124
  importZip(reader, options) {
7125
+ resetFS(this);
6592
7126
  return this.root.importZip(reader, options);
6593
7127
  }
6594
7128
 
@@ -6608,6 +7142,10 @@ class FS {
6608
7142
  return this.root.exportWritable(writable, options);
6609
7143
  }
6610
7144
 
7145
+ exportZip(writer, options) {
7146
+ return this.root.exportZip(writer, options);
7147
+ }
7148
+
6611
7149
  isPasswordProtected() {
6612
7150
  return this.root.isPasswordProtected();
6613
7151
  }
@@ -6621,15 +7159,26 @@ const fs = { FS, ZipDirectoryEntry, ZipFileEntry };
6621
7159
 
6622
7160
  function getTotalSize(entries, propertyName) {
6623
7161
  let size = 0;
6624
- entries.forEach(process);
7162
+ const pendingEntries = Array.from(entries);
7163
+ while (pendingEntries.length) {
7164
+ const entry = pendingEntries.pop();
7165
+ size += entry[propertyName] || 0;
7166
+ for (const child of entry.children) {
7167
+ pendingEntries.push(child);
7168
+ }
7169
+ }
6625
7170
  return size;
7171
+ }
6626
7172
 
6627
- function process(entry) {
6628
- size += entry[propertyName];
6629
- if (entry.children) {
6630
- entry.children.forEach(process);
7173
+ function getReadableReader(readable) {
7174
+ let consumed;
7175
+ return function () {
7176
+ if (consumed) {
7177
+ throw new Error(ERR_READABLE_CONSUMED);
6631
7178
  }
6632
- }
7179
+ consumed = true;
7180
+ return { readable };
7181
+ };
6633
7182
  }
6634
7183
 
6635
7184
  function getZipBlobReader(options) {
@@ -6644,7 +7193,7 @@ function getZipBlobReader(options) {
6644
7193
  async init() {
6645
7194
  const zipBlobReader = this;
6646
7195
  zipBlobReader.size = zipBlobReader.entry.uncompressedSize;
6647
- const data = await zipBlobReader.entry.getData(new BlobWriter(), Object.assign({}, zipBlobReader.options, options));
7196
+ const data = await zipBlobReader.entry.getData(new BlobWriter(), Object.assign({}, options, zipBlobReader.options));
6648
7197
  zipBlobReader.data = data;
6649
7198
  zipBlobReader.blobReader = new BlobReader(data);
6650
7199
  super.init();
@@ -6657,29 +7206,41 @@ function getZipBlobReader(options) {
6657
7206
  }
6658
7207
 
6659
7208
  async function initReaders(entry, options) {
6660
- if (entry.children.length) {
6661
- await Promise.all(entry.children.map(async child => {
7209
+ const fileEntries = [];
7210
+ const pendingEntries = [entry];
7211
+ // per-export map so concurrent exports do not share (and lock) the same readers
7212
+ const readers = new Map();
7213
+ while (pendingEntries.length) {
7214
+ const pendingEntry = pendingEntries.pop();
7215
+ for (const child of pendingEntry.children) {
6662
7216
  if (child.directory) {
6663
- await initReaders(child, options);
7217
+ pendingEntries.push(child);
6664
7218
  } else {
6665
- const reader = child.reader = new child.Reader(child.data, options);
6666
- try {
6667
- await initStream(reader);
6668
- } catch (error) {
6669
- try {
6670
- error.entryId = child.id;
6671
- error.cause = {
6672
- entry: child
6673
- };
6674
- } catch {
6675
- // ignored
6676
- }
6677
- throw error;
6678
- }
6679
- child.uncompressedSize = reader.size;
7219
+ fileEntries.push(child);
6680
7220
  }
6681
- }));
7221
+ }
6682
7222
  }
7223
+ await Promise.all(fileEntries.map(async child => {
7224
+ const reader = child.reader = new child.Reader(child.data, options);
7225
+ readers.set(child, reader);
7226
+ try {
7227
+ await initStream(reader);
7228
+ } catch (error) {
7229
+ try {
7230
+ error.entryId = child.id;
7231
+ error.cause = {
7232
+ entry: child
7233
+ };
7234
+ } catch {
7235
+ // ignored
7236
+ }
7237
+ throw error;
7238
+ }
7239
+ if (reader.size !== UNDEFINED_VALUE) {
7240
+ child.uncompressedSize = reader.size;
7241
+ }
7242
+ }));
7243
+ return readers;
6683
7244
  }
6684
7245
 
6685
7246
  function detach(entry) {
@@ -6693,7 +7254,7 @@ function detach(entry) {
6693
7254
  }
6694
7255
  }
6695
7256
 
6696
- async function exportZip(zipWriter, entry, totalSize, options) {
7257
+ async function exportZip(zipWriter, entry, totalSize, options, readers) {
6697
7258
  const selectedEntry = entry;
6698
7259
  const entryOffsets = new Map();
6699
7260
  await process(zipWriter, entry);
@@ -6703,7 +7264,11 @@ async function exportZip(zipWriter, entry, totalSize, options) {
6703
7264
 
6704
7265
  async function exportChild() {
6705
7266
  if (options.bufferedWrite) {
6706
- await Promise.allSettled(entry.children.map(processChild));
7267
+ const results = await Promise.allSettled(entry.children.map(processChild));
7268
+ const errorResult = results.find(result => result.status == "rejected");
7269
+ if (errorResult) {
7270
+ throw errorResult.reason;
7271
+ }
6707
7272
  } else {
6708
7273
  for (const child of entry.children) {
6709
7274
  await processChild(child);
@@ -6758,7 +7323,7 @@ async function exportZip(zipWriter, entry, totalSize, options) {
6758
7323
  });
6759
7324
  }
6760
7325
  }
6761
- await zipWriter.add(name, child.reader, Object.assign({}, options, zipEntryOptions, childOptions, {
7326
+ await zipWriter.add(name, readers.get(child), Object.assign({}, options, zipEntryOptions, childOptions, {
6762
7327
  directory: child.directory,
6763
7328
  onprogress: async indexProgress => {
6764
7329
  if (options.onprogress) {
@@ -6807,7 +7372,7 @@ function addFileSystemHandle(zipEntry, handle, options) {
6807
7372
  }
6808
7373
  } catch (error) {
6809
7374
  const message = error.message + (handle ? " (" + handle.name + ")" : "");
6810
- throw new Error(message);
7375
+ throw new Error(message, { cause: error });
6811
7376
  }
6812
7377
  }
6813
7378
  return addedEntries;
@@ -6867,9 +7432,21 @@ async function transformToFileSystemhandles(entry) {
6867
7432
 
6868
7433
  function resetFS(fs) {
6869
7434
  fs.entries = [];
7435
+ fs.entryIdCounter = 0;
6870
7436
  fs.root = new ZipDirectoryEntry(fs);
6871
7437
  }
6872
7438
 
7439
+ function registerEntries(fs, entry) {
7440
+ const pendingEntries = [entry];
7441
+ while (pendingEntries.length) {
7442
+ const pendingEntry = pendingEntries.pop();
7443
+ fs.entries[pendingEntry.id] = pendingEntry;
7444
+ for (const child of pendingEntry.children) {
7445
+ pendingEntries.push(child);
7446
+ }
7447
+ }
7448
+ }
7449
+
6873
7450
  function addChild(parent, name, params, directory) {
6874
7451
  if (parent.directory) {
6875
7452
  return directory ? new ZipDirectoryEntry(parent.fs, name, params, parent) : new ZipFileEntry(parent.fs, name, params, parent);
@@ -8545,6 +9122,7 @@ exports.BlobReader = BlobReader;
8545
9122
  exports.BlobWriter = BlobWriter;
8546
9123
  exports.Data64URIReader = Data64URIReader;
8547
9124
  exports.Data64URIWriter = Data64URIWriter;
9125
+ exports.ERR_AMBIGUOUS_ARCHIVE = ERR_AMBIGUOUS_ARCHIVE;
8548
9126
  exports.ERR_BAD_FORMAT = ERR_BAD_FORMAT;
8549
9127
  exports.ERR_CENTRAL_DIRECTORY_NOT_FOUND = ERR_CENTRAL_DIRECTORY_NOT_FOUND;
8550
9128
  exports.ERR_DUPLICATED_NAME = ERR_DUPLICATED_NAME;
@@ -8554,6 +9132,7 @@ exports.ERR_EOCDR_NOT_FOUND = ERR_EOCDR_NOT_FOUND;
8554
9132
  exports.ERR_EXTRAFIELD_ZIP64_NOT_FOUND = ERR_EXTRAFIELD_ZIP64_NOT_FOUND;
8555
9133
  exports.ERR_HTTP_RANGE = ERR_HTTP_RANGE;
8556
9134
  exports.ERR_INVALID_COMMENT = ERR_INVALID_COMMENT;
9135
+ exports.ERR_INVALID_COMPRESSED_DATA = ERR_INVALID_COMPRESSED_DATA;
8557
9136
  exports.ERR_INVALID_ENCRYPTION_STRENGTH = ERR_INVALID_ENCRYPTION_STRENGTH;
8558
9137
  exports.ERR_INVALID_ENTRY_COMMENT = ERR_INVALID_ENTRY_COMMENT;
8559
9138
  exports.ERR_INVALID_ENTRY_NAME = ERR_INVALID_ENTRY_NAME;
@@ -8566,8 +9145,9 @@ exports.ERR_INVALID_VERSION = ERR_INVALID_VERSION;
8566
9145
  exports.ERR_LOCAL_FILE_HEADER_NOT_FOUND = ERR_LOCAL_FILE_HEADER_NOT_FOUND;
8567
9146
  exports.ERR_OVERLAPPING_ENTRY = ERR_OVERLAPPING_ENTRY;
8568
9147
  exports.ERR_SPLIT_ZIP_FILE = ERR_SPLIT_ZIP_FILE;
9148
+ exports.ERR_UNDEFINED_READER = ERR_UNDEFINED_READER;
8569
9149
  exports.ERR_UNDEFINED_UNCOMPRESSED_SIZE = ERR_UNDEFINED_UNCOMPRESSED_SIZE;
8570
- exports.ERR_UNSUPPORTED_COMPRESSION = ERR_UNSUPPORTED_COMPRESSION;
9150
+ exports.ERR_UNSUPPORTED_COMPRESSION = ERR_UNSUPPORTED_COMPRESSION$1;
8571
9151
  exports.ERR_UNSUPPORTED_ENCRYPTION = ERR_UNSUPPORTED_ENCRYPTION;
8572
9152
  exports.ERR_UNSUPPORTED_FORMAT = ERR_UNSUPPORTED_FORMAT;
8573
9153
  exports.ERR_ZIP_NOT_EMPTY = ERR_ZIP_NOT_EMPTY;