@loaders.gl/zip 4.1.0-alpha.10 → 4.1.0-alpha.11

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 (33) hide show
  1. package/dist/dist.dev.js +572 -23
  2. package/dist/hash-file-utility.d.ts +15 -2
  3. package/dist/hash-file-utility.d.ts.map +1 -1
  4. package/dist/hash-file-utility.js +14 -6
  5. package/dist/hash-file-utility.js.map +1 -1
  6. package/dist/index.cjs +260 -8
  7. package/dist/index.d.ts +1 -1
  8. package/dist/index.d.ts.map +1 -1
  9. package/dist/index.js +1 -1
  10. package/dist/index.js.map +1 -1
  11. package/dist/parse-zip/end-of-central-directory.d.ts +17 -1
  12. package/dist/parse-zip/end-of-central-directory.d.ts.map +1 -1
  13. package/dist/parse-zip/end-of-central-directory.js +121 -2
  14. package/dist/parse-zip/end-of-central-directory.js.map +1 -1
  15. package/dist/parse-zip/zip-composition.d.ts +38 -0
  16. package/dist/parse-zip/zip-composition.d.ts.map +1 -0
  17. package/dist/parse-zip/zip-composition.js +115 -0
  18. package/dist/parse-zip/zip-composition.js.map +1 -0
  19. package/dist/parse-zip/zip64-info-generation.js +2 -2
  20. package/dist/parse-zip/zip64-info-generation.js.map +1 -1
  21. package/dist/zip-loader.js +1 -1
  22. package/dist/zip-writer.js +1 -1
  23. package/package.json +5 -5
  24. package/src/hash-file-utility.ts +38 -7
  25. package/src/index.ts +1 -1
  26. package/src/parse-zip/end-of-central-directory.ts +241 -3
  27. package/src/parse-zip/zip-composition.ts +235 -0
  28. package/src/parse-zip/zip64-info-generation.ts +3 -3
  29. package/dist/parse-zip/zip-compozition.d.ts +0 -8
  30. package/dist/parse-zip/zip-compozition.d.ts.map +0 -1
  31. package/dist/parse-zip/zip-compozition.js +0 -43
  32. package/dist/parse-zip/zip-compozition.js.map +0 -1
  33. package/src/parse-zip/zip-compozition.ts +0 -113
@@ -1,4 +1,5 @@
1
1
  import { FileProvider } from '@loaders.gl/loader-utils';
2
+ import { ZipCDFileHeader } from './parse-zip/cd-file-header';
2
3
  /**
3
4
  * Reads hash file from buffer and returns it in ready-to-use form
4
5
  * @param arrayBuffer - buffer containing hash file
@@ -11,10 +12,22 @@ export declare function parseHashTable(arrayBuffer: ArrayBuffer): Record<string,
11
12
  * @returns ready to use hash info
12
13
  */
13
14
  export declare function makeHashTableFromZipHeaders(fileProvider: FileProvider): Promise<Record<string, bigint>>;
15
+ /**
16
+ * creates hash table from file offset iterator
17
+ * @param zipCDIterator iterator to use
18
+ * @returns hash table
19
+ */
20
+ export declare function getHashTable(zipCDIterator: AsyncIterable<ZipCDFileHeader>): Promise<Record<string, bigint>>;
21
+ /** item of the file offset list */
22
+ type FileListItem = {
23
+ fileName: string;
24
+ localHeaderOffset: bigint;
25
+ };
14
26
  /**
15
27
  * creates hash file that later can be added to the SLPK archive
16
- * @param fileProvider SLPK archive where we need to add hash file
28
+ * @param zipCDIterator iterator to use
17
29
  * @returns ArrayBuffer containing hash file
18
30
  */
19
- export declare function composeHashFile(fileProvider: FileProvider): Promise<ArrayBuffer>;
31
+ export declare function composeHashFile(zipCDIterator: AsyncIterable<FileListItem> | Iterable<FileListItem>): Promise<ArrayBuffer>;
32
+ export {};
20
33
  //# sourceMappingURL=hash-file-utility.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"hash-file-utility.d.ts","sourceRoot":"","sources":["../src/hash-file-utility.ts"],"names":[],"mappings":"AAKA,OAAO,EACL,YAAY,EAGb,MAAM,0BAA0B,CAAC;AAGlC;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,WAAW,EAAE,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAY/E;AASD;;;;GAIG;AACH,wBAAsB,2BAA2B,CAC/C,YAAY,EAAE,YAAY,GACzB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAejC;AAED;;;;GAIG;AACH,wBAAsB,eAAe,CAAC,YAAY,EAAE,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC,CAMtF"}
1
+ {"version":3,"file":"hash-file-utility.d.ts","sourceRoot":"","sources":["../src/hash-file-utility.ts"],"names":[],"mappings":"AAKA,OAAO,EACL,YAAY,EAGb,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAC,eAAe,EAA0B,MAAM,4BAA4B,CAAC;AAEpF;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,WAAW,EAAE,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAY/E;AASD;;;;GAIG;AACH,wBAAsB,2BAA2B,CAC/C,YAAY,EAAE,YAAY,GACzB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAGjC;AAED;;;;GAIG;AACH,wBAAsB,YAAY,CAChC,aAAa,EAAE,aAAa,CAAC,eAAe,CAAC,GAC5C,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAcjC;AAED,mCAAmC;AACnC,KAAK,YAAY,GAAG;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,iBAAiB,EAAE,MAAM,CAAC;CAC3B,CAAC;AAEF;;;;GAIG;AACH,wBAAsB,eAAe,CACnC,aAAa,EAAE,aAAa,CAAC,YAAY,CAAC,GAAG,QAAQ,CAAC,YAAY,CAAC,GAClE,OAAO,CAAC,WAAW,CAAC,CAkBtB"}
@@ -16,6 +16,9 @@ function bufferToHex(buffer, start, length) {
16
16
  }
17
17
  export async function makeHashTableFromZipHeaders(fileProvider) {
18
18
  const zipCDIterator = makeZipCDHeaderIterator(fileProvider);
19
+ return getHashTable(zipCDIterator);
20
+ }
21
+ export async function getHashTable(zipCDIterator) {
19
22
  const md5Hash = new MD5Hash();
20
23
  const textEncoder = new TextEncoder();
21
24
  const hashTable = {};
@@ -27,12 +30,17 @@ export async function makeHashTableFromZipHeaders(fileProvider) {
27
30
  }
28
31
  return hashTable;
29
32
  }
30
- export async function composeHashFile(fileProvider) {
31
- const hashArray = await makeHashTableFromZipHeaders(fileProvider);
32
- const bufferArray = Object.entries(hashArray).map(_ref => {
33
- let [key, value] = _ref;
34
- return concatenateArrayBuffers(hexStringToBuffer(key), bigintToBuffer(value));
35
- }).sort(compareHashes);
33
+ export async function composeHashFile(zipCDIterator) {
34
+ const md5Hash = new MD5Hash();
35
+ const textEncoder = new TextEncoder();
36
+ const hashArray = [];
37
+ for await (const cdHeader of zipCDIterator) {
38
+ const filename = cdHeader.fileName.split('\\').join('/').toLocaleLowerCase();
39
+ const arrayBuffer = textEncoder.encode(filename).buffer;
40
+ const md5 = await md5Hash.hash(arrayBuffer, 'hex');
41
+ hashArray.push(concatenateArrayBuffers(hexStringToBuffer(md5), bigintToBuffer(cdHeader.localHeaderOffset)));
42
+ }
43
+ const bufferArray = hashArray.sort(compareHashes);
36
44
  return concatenateArrayBuffersFromArray(bufferArray);
37
45
  }
38
46
  function compareHashes(arrA, arrB) {
@@ -1 +1 @@
1
- {"version":3,"file":"hash-file-utility.js","names":["MD5Hash","concatenateArrayBuffers","concatenateArrayBuffersFromArray","makeZipCDHeaderIterator","parseHashTable","arrayBuffer","dataView","DataView","hashMap","i","byteLength","offset","getBigUint64","hash","bufferToHex","buffer","start","length","Uint8Array","map","x","toString","padStart","join","makeHashTableFromZipHeaders","fileProvider","zipCDIterator","md5Hash","textEncoder","TextEncoder","hashTable","cdHeader","filename","fileName","split","toLocaleLowerCase","encode","md5","localHeaderOffset","composeHashFile","hashArray","bufferArray","Object","entries","_ref","key","value","hexStringToBuffer","bigintToBuffer","sort","compareHashes","arrA","arrB","a","BigUint64Array","b","Number","str","_str$match","byteArray","match","h","parseInt","Array","n"],"sources":["../src/hash-file-utility.ts"],"sourcesContent":["// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {MD5Hash} from '@loaders.gl/crypto';\nimport {\n FileProvider,\n concatenateArrayBuffers,\n concatenateArrayBuffersFromArray\n} from '@loaders.gl/loader-utils';\nimport {makeZipCDHeaderIterator} from './parse-zip/cd-file-header';\n\n/**\n * Reads hash file from buffer and returns it in ready-to-use form\n * @param arrayBuffer - buffer containing hash file\n * @returns Map containing hash and offset\n */\nexport function parseHashTable(arrayBuffer: ArrayBuffer): Record<string, bigint> {\n const dataView = new DataView(arrayBuffer);\n\n const hashMap: Record<string, bigint> = {};\n\n for (let i = 0; i < arrayBuffer.byteLength; i = i + 24) {\n const offset = dataView.getBigUint64(i + 16, true);\n const hash = bufferToHex(arrayBuffer, i, 16);\n hashMap[hash] = offset;\n }\n\n return hashMap;\n}\n\nfunction bufferToHex(buffer: ArrayBuffer, start: number, length: number): string {\n // buffer is an ArrayBuffer\n return [...new Uint8Array(buffer, start, length)]\n .map((x) => x.toString(16).padStart(2, '0'))\n .join('');\n}\n\n/**\n * generates hash info from zip files \"central directory\"\n * @param fileProvider - provider of the archive\n * @returns ready to use hash info\n */\nexport async function makeHashTableFromZipHeaders(\n fileProvider: FileProvider\n): Promise<Record<string, bigint>> {\n const zipCDIterator = makeZipCDHeaderIterator(fileProvider);\n const md5Hash = new MD5Hash();\n const textEncoder = new TextEncoder();\n\n const hashTable: Record<string, bigint> = {};\n\n for await (const cdHeader of zipCDIterator) {\n const filename = cdHeader.fileName.split('\\\\').join('/').toLocaleLowerCase();\n const arrayBuffer = textEncoder.encode(filename).buffer;\n const md5 = await md5Hash.hash(arrayBuffer, 'hex');\n hashTable[md5] = cdHeader.localHeaderOffset;\n }\n\n return hashTable;\n}\n\n/**\n * creates hash file that later can be added to the SLPK archive\n * @param fileProvider SLPK archive where we need to add hash file\n * @returns ArrayBuffer containing hash file\n */\nexport async function composeHashFile(fileProvider: FileProvider): Promise<ArrayBuffer> {\n const hashArray = await makeHashTableFromZipHeaders(fileProvider);\n const bufferArray = Object.entries(hashArray)\n .map(([key, value]) => concatenateArrayBuffers(hexStringToBuffer(key), bigintToBuffer(value)))\n .sort(compareHashes);\n return concatenateArrayBuffersFromArray(bufferArray);\n}\n\n/**\n * Function to compare md5 hashes according to https://github.com/Esri/i3s-spec/blob/master/docs/2.0/slpk_hashtable.pcsl.md\n * @param arrA first hash to compare\n * @param arrB second hash to compare\n * @returns 0 if equal, negative number if a<b, pozitive if a>b\n */\nfunction compareHashes(arrA: ArrayBuffer, arrB: ArrayBuffer): number {\n const a = new BigUint64Array(arrA);\n const b = new BigUint64Array(arrB);\n\n return Number(a[0] === b[0] ? a[1] - b[1] : a[0] - b[0]);\n}\n\n/**\n * converts hex string to buffer\n * @param str hex string to convert\n * @returns conversion result\n */\nfunction hexStringToBuffer(str: string): ArrayBuffer {\n const byteArray = str.match(/../g)?.map((h) => parseInt(h, 16));\n return new Uint8Array(byteArray ?? new Array(16)).buffer;\n}\n\n/**\n * converts bigint to buffer\n * @param n bigint to convert\n * @returns convertion result\n */\nfunction bigintToBuffer(n: bigint): ArrayBuffer {\n return new BigUint64Array([n]).buffer;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"hash-file-utility.js","names":["MD5Hash","concatenateArrayBuffers","concatenateArrayBuffersFromArray","makeZipCDHeaderIterator","parseHashTable","arrayBuffer","dataView","DataView","hashMap","i","byteLength","offset","getBigUint64","hash","bufferToHex","buffer","start","length","Uint8Array","map","x","toString","padStart","join","makeHashTableFromZipHeaders","fileProvider","zipCDIterator","getHashTable","md5Hash","textEncoder","TextEncoder","hashTable","cdHeader","filename","fileName","split","toLocaleLowerCase","encode","md5","localHeaderOffset","composeHashFile","hashArray","push","hexStringToBuffer","bigintToBuffer","bufferArray","sort","compareHashes","arrA","arrB","a","BigUint64Array","b","Number","str","_str$match","byteArray","match","h","parseInt","Array","n"],"sources":["../src/hash-file-utility.ts"],"sourcesContent":["// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {MD5Hash} from '@loaders.gl/crypto';\nimport {\n FileProvider,\n concatenateArrayBuffers,\n concatenateArrayBuffersFromArray\n} from '@loaders.gl/loader-utils';\nimport {ZipCDFileHeader, makeZipCDHeaderIterator} from './parse-zip/cd-file-header';\n\n/**\n * Reads hash file from buffer and returns it in ready-to-use form\n * @param arrayBuffer - buffer containing hash file\n * @returns Map containing hash and offset\n */\nexport function parseHashTable(arrayBuffer: ArrayBuffer): Record<string, bigint> {\n const dataView = new DataView(arrayBuffer);\n\n const hashMap: Record<string, bigint> = {};\n\n for (let i = 0; i < arrayBuffer.byteLength; i = i + 24) {\n const offset = dataView.getBigUint64(i + 16, true);\n const hash = bufferToHex(arrayBuffer, i, 16);\n hashMap[hash] = offset;\n }\n\n return hashMap;\n}\n\nfunction bufferToHex(buffer: ArrayBuffer, start: number, length: number): string {\n // buffer is an ArrayBuffer\n return [...new Uint8Array(buffer, start, length)]\n .map((x) => x.toString(16).padStart(2, '0'))\n .join('');\n}\n\n/**\n * generates hash info from zip files \"central directory\"\n * @param fileProvider - provider of the archive\n * @returns ready to use hash info\n */\nexport async function makeHashTableFromZipHeaders(\n fileProvider: FileProvider\n): Promise<Record<string, bigint>> {\n const zipCDIterator = makeZipCDHeaderIterator(fileProvider);\n return getHashTable(zipCDIterator);\n}\n\n/**\n * creates hash table from file offset iterator\n * @param zipCDIterator iterator to use\n * @returns hash table\n */\nexport async function getHashTable(\n zipCDIterator: AsyncIterable<ZipCDFileHeader>\n): Promise<Record<string, bigint>> {\n const md5Hash = new MD5Hash();\n const textEncoder = new TextEncoder();\n\n const hashTable: Record<string, bigint> = {};\n\n for await (const cdHeader of zipCDIterator) {\n const filename = cdHeader.fileName.split('\\\\').join('/').toLocaleLowerCase();\n const arrayBuffer = textEncoder.encode(filename).buffer;\n const md5 = await md5Hash.hash(arrayBuffer, 'hex');\n hashTable[md5] = cdHeader.localHeaderOffset;\n }\n\n return hashTable;\n}\n\n/** item of the file offset list */\ntype FileListItem = {\n fileName: string;\n localHeaderOffset: bigint;\n};\n\n/**\n * creates hash file that later can be added to the SLPK archive\n * @param zipCDIterator iterator to use\n * @returns ArrayBuffer containing hash file\n */\nexport async function composeHashFile(\n zipCDIterator: AsyncIterable<FileListItem> | Iterable<FileListItem>\n): Promise<ArrayBuffer> {\n const md5Hash = new MD5Hash();\n const textEncoder = new TextEncoder();\n\n const hashArray: ArrayBuffer[] = [];\n\n for await (const cdHeader of zipCDIterator) {\n const filename = cdHeader.fileName.split('\\\\').join('/').toLocaleLowerCase();\n const arrayBuffer = textEncoder.encode(filename).buffer;\n const md5 = await md5Hash.hash(arrayBuffer, 'hex');\n hashArray.push(\n concatenateArrayBuffers(hexStringToBuffer(md5), bigintToBuffer(cdHeader.localHeaderOffset))\n );\n }\n\n const bufferArray = hashArray.sort(compareHashes);\n\n return concatenateArrayBuffersFromArray(bufferArray);\n}\n\n/**\n * Function to compare md5 hashes according to https://github.com/Esri/i3s-spec/blob/master/docs/2.0/slpk_hashtable.pcsl.md\n * @param arrA first hash to compare\n * @param arrB second hash to compare\n * @returns 0 if equal, negative number if a<b, pozitive if a>b\n */\nfunction compareHashes(arrA: ArrayBuffer, arrB: ArrayBuffer): number {\n const a = new BigUint64Array(arrA);\n const b = new BigUint64Array(arrB);\n\n return Number(a[0] === b[0] ? a[1] - b[1] : a[0] - b[0]);\n}\n\n/**\n * converts hex string to buffer\n * @param str hex string to convert\n * @returns conversion result\n */\nfunction hexStringToBuffer(str: string): ArrayBuffer {\n const byteArray = str.match(/../g)?.map((h) => parseInt(h, 16));\n return new Uint8Array(byteArray ?? new Array(16)).buffer;\n}\n\n/**\n * converts bigint to buffer\n * @param n bigint to convert\n * @returns convertion result\n */\nfunction bigintToBuffer(n: bigint): ArrayBuffer {\n return new BigUint64Array([n]).buffer;\n}\n"],"mappings":"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"}
package/dist/index.cjs CHANGED
@@ -37,6 +37,7 @@ __export(src_exports, {
37
37
  ZipWriter: () => ZipWriter,
38
38
  addOneFile: () => addOneFile,
39
39
  composeHashFile: () => composeHashFile,
40
+ createZip: () => createZip,
40
41
  generateCDHeader: () => generateCDHeader,
41
42
  generateLocalHeader: () => generateLocalHeader,
42
43
  localHeaderSignature: () => signature3,
@@ -403,10 +404,10 @@ function setFieldToNumber(header, fieldSize, fieldOffset, value) {
403
404
  }
404
405
  var NUMBER_SETTERS = {
405
406
  2: (header, offset, value) => {
406
- header.setUint16(offset, Number(value), true);
407
+ header.setUint16(offset, Number(value > 65535 ? 65535 : value), true);
407
408
  },
408
409
  4: (header, offset, value) => {
409
- header.setUint32(offset, Number(value), true);
410
+ header.setUint32(offset, Number(value > 4294967295 ? 4294967295 : value), true);
410
411
  },
411
412
  8: (header, offset, value) => {
412
413
  header.setBigUint64(offset, BigInt(value), true);
@@ -448,11 +449,13 @@ var CD_RECORDS_NUMBER_OFFSET = 8n;
448
449
  var CD_RECORDS_NUMBER_ON_DISC_OFFSET = 10n;
449
450
  var CD_CD_BYTE_SIZE_OFFSET = 12n;
450
451
  var CD_START_OFFSET_OFFSET = 16n;
452
+ var CD_COMMENT_OFFSET = 22n;
451
453
  var ZIP64_EOCD_START_OFFSET_OFFSET = 8n;
452
454
  var ZIP64_CD_RECORDS_NUMBER_OFFSET = 24n;
453
455
  var ZIP64_CD_RECORDS_NUMBER_ON_DISC_OFFSET = 32n;
454
456
  var ZIP64_CD_CD_BYTE_SIZE_OFFSET = 40n;
455
457
  var ZIP64_CD_START_OFFSET_OFFSET = 48n;
458
+ var ZIP64_COMMENT_OFFSET = 56n;
456
459
  var parseEoCDRecord = async (file) => {
457
460
  const zipEoCDOffset = await searchFromTheEnd(file, eoCDSignature);
458
461
  let cdRecordsNumber = BigInt(await file.getUint16(zipEoCDOffset + CD_RECORDS_NUMBER_OFFSET));
@@ -483,7 +486,7 @@ var parseEoCDRecord = async (file) => {
483
486
  }
484
487
  };
485
488
  };
486
- async function updateEoCD(eocdBody, oldEoCDOffsets, newCDStartOffset, eocdStartOffset, newCDRecordsNumber) {
489
+ function updateEoCD(eocdBody, oldEoCDOffsets, newCDStartOffset, eocdStartOffset, newCDRecordsNumber) {
487
490
  const eocd = new DataView(eocdBody);
488
491
  const classicEoCDOffset = oldEoCDOffsets.zip64EoCDOffset ? oldEoCDOffsets.zipEoCDOffset - oldEoCDOffsets.zip64EoCDOffset : 0n;
489
492
  if (Number(newCDRecordsNumber) <= 65535) {
@@ -516,6 +519,182 @@ async function updateEoCD(eocdBody, oldEoCDOffsets, newCDStartOffset, eocdStartO
516
519
  }
517
520
  return new Uint8Array(eocd.buffer);
518
521
  }
522
+ function generateEoCD(options) {
523
+ const header = new DataView(new ArrayBuffer(Number(CD_COMMENT_OFFSET)));
524
+ for (const field of EOCD_FIELDS) {
525
+ setFieldToNumber(
526
+ header,
527
+ field.size,
528
+ field.offset,
529
+ options[field.name ?? ""] ?? field.default ?? 0
530
+ );
531
+ }
532
+ const locator = generateZip64InfoLocator(options);
533
+ const zip64Record = generateZip64Info(options);
534
+ return (0, import_loader_utils2.concatenateArrayBuffers)(zip64Record, locator, header.buffer);
535
+ }
536
+ var EOCD_FIELDS = [
537
+ // End of central directory signature = 0x06054b50
538
+ {
539
+ offset: 0,
540
+ size: 4,
541
+ default: new DataView(eoCDSignature.buffer).getUint32(0, true)
542
+ },
543
+ // Number of this disk (or 0xffff for ZIP64)
544
+ {
545
+ offset: 4,
546
+ size: 2,
547
+ default: 0
548
+ },
549
+ // Disk where central directory starts (or 0xffff for ZIP64)
550
+ {
551
+ offset: 6,
552
+ size: 2,
553
+ default: 0
554
+ },
555
+ // Number of central directory records on this disk (or 0xffff for ZIP64)
556
+ {
557
+ offset: 8,
558
+ size: 2,
559
+ name: "recordsNumber"
560
+ },
561
+ // Total number of central directory records (or 0xffff for ZIP64)
562
+ {
563
+ offset: 10,
564
+ size: 2,
565
+ name: "recordsNumber"
566
+ },
567
+ // Size of central directory (bytes) (or 0xffffffff for ZIP64)
568
+ {
569
+ offset: 12,
570
+ size: 4,
571
+ name: "cdSize"
572
+ },
573
+ // Offset of start of central directory, relative to start of archive (or 0xffffffff for ZIP64)
574
+ {
575
+ offset: 16,
576
+ size: 4,
577
+ name: "cdOffset"
578
+ },
579
+ // Comment length (n)
580
+ {
581
+ offset: 20,
582
+ size: 2,
583
+ default: 0
584
+ }
585
+ ];
586
+ function generateZip64Info(options) {
587
+ const record = new DataView(new ArrayBuffer(Number(ZIP64_COMMENT_OFFSET)));
588
+ for (const field of ZIP64_EOCD_FIELDS) {
589
+ setFieldToNumber(
590
+ record,
591
+ field.size,
592
+ field.offset,
593
+ options[field.name ?? ""] ?? field.default ?? 0
594
+ );
595
+ }
596
+ return record.buffer;
597
+ }
598
+ function generateZip64InfoLocator(options) {
599
+ const locator = new DataView(new ArrayBuffer(Number(20)));
600
+ for (const field of ZIP64_EOCD_LOCATOR_FIELDS) {
601
+ setFieldToNumber(
602
+ locator,
603
+ field.size,
604
+ field.offset,
605
+ options[field.name ?? ""] ?? field.default ?? 0
606
+ );
607
+ }
608
+ return locator.buffer;
609
+ }
610
+ var ZIP64_EOCD_LOCATOR_FIELDS = [
611
+ // zip64 end of central dir locator signature
612
+ {
613
+ offset: 0,
614
+ size: 4,
615
+ default: new DataView(zip64EoCDLocatorSignature.buffer).getUint32(0, true)
616
+ },
617
+ // number of the disk with the start of the zip64 end of
618
+ {
619
+ offset: 4,
620
+ size: 4,
621
+ default: 0
622
+ },
623
+ // start of the zip64 end of central directory
624
+ {
625
+ offset: 8,
626
+ size: 8,
627
+ name: "eoCDStart"
628
+ },
629
+ // total number of disks
630
+ {
631
+ offset: 16,
632
+ size: 4,
633
+ default: 1
634
+ }
635
+ ];
636
+ var ZIP64_EOCD_FIELDS = [
637
+ // End of central directory signature = 0x06064b50
638
+ {
639
+ offset: 0,
640
+ size: 4,
641
+ default: new DataView(zip64EoCDSignature.buffer).getUint32(0, true)
642
+ },
643
+ // Size of the EOCD64 minus 12
644
+ {
645
+ offset: 4,
646
+ size: 8,
647
+ default: 44
648
+ },
649
+ // Version made by
650
+ {
651
+ offset: 12,
652
+ size: 2,
653
+ default: 45
654
+ },
655
+ // Version needed to extract (minimum)
656
+ {
657
+ offset: 14,
658
+ size: 2,
659
+ default: 45
660
+ },
661
+ // Number of this disk
662
+ {
663
+ offset: 16,
664
+ size: 4,
665
+ default: 0
666
+ },
667
+ // Disk where central directory starts
668
+ {
669
+ offset: 20,
670
+ size: 4,
671
+ default: 0
672
+ },
673
+ // Number of central directory records on this disk
674
+ {
675
+ offset: 24,
676
+ size: 8,
677
+ name: "recordsNumber"
678
+ },
679
+ // Total number of central directory records
680
+ {
681
+ offset: 32,
682
+ size: 8,
683
+ name: "recordsNumber"
684
+ },
685
+ // Size of central directory (bytes)
686
+ {
687
+ offset: 40,
688
+ size: 8,
689
+ name: "cdSize"
690
+ },
691
+ // Offset of start of central directory, relative to start of archive
692
+ {
693
+ offset: 48,
694
+ size: 8,
695
+ name: "cdOffset"
696
+ }
697
+ ];
519
698
 
520
699
  // src/parse-zip/cd-file-header.ts
521
700
  var CD_COMPRESSED_SIZE_OFFSET = 20n;
@@ -896,9 +1075,10 @@ var ZIP_HEADER_FIELDS2 = [
896
1075
  }
897
1076
  ];
898
1077
 
899
- // src/parse-zip/zip-compozition.ts
1078
+ // src/parse-zip/zip-composition.ts
900
1079
  var import_loader_utils5 = require("@loaders.gl/loader-utils");
901
1080
  var import_crypto = require("@loaders.gl/crypto");
1081
+ var import_core = require("@loaders.gl/core");
902
1082
  async function cutTheTailOff(provider) {
903
1083
  const oldEoCDinfo = await parseEoCDRecord(provider);
904
1084
  const oldCDStartOffset = oldEoCDinfo.cdStartOffset;
@@ -940,7 +1120,7 @@ async function addOneFile(zipUrl, fileToAdd, fileName) {
940
1120
  await provider.append(new Uint8Array(newCDBody));
941
1121
  const eocdOffset = provider.length;
942
1122
  await provider.append(
943
- await updateEoCD(
1123
+ updateEoCD(
944
1124
  eocdBody,
945
1125
  oldEoCDinfo.offsets,
946
1126
  newCDStartOffset,
@@ -949,6 +1129,65 @@ async function addOneFile(zipUrl, fileToAdd, fileName) {
949
1129
  )
950
1130
  );
951
1131
  }
1132
+ async function createZip(inputPath, outputPath, createAdditionalData) {
1133
+ const fileIterator = getFileIterator(inputPath);
1134
+ const resFile = new import_loader_utils5.NodeFile(outputPath, "w");
1135
+ const fileList = [];
1136
+ const cdArray = [];
1137
+ for await (const file of fileIterator) {
1138
+ await addFile(file, resFile, cdArray, fileList);
1139
+ }
1140
+ if (createAdditionalData) {
1141
+ const additionaldata = await createAdditionalData(fileList);
1142
+ console.log(additionaldata);
1143
+ await addFile(additionaldata, resFile, cdArray);
1144
+ }
1145
+ const cdOffset = (await resFile.stat()).bigsize;
1146
+ const cd = (0, import_loader_utils5.concatenateArrayBuffers)(...cdArray);
1147
+ await resFile.append(new Uint8Array(cd));
1148
+ const eoCDStart = (await resFile.stat()).bigsize;
1149
+ await resFile.append(
1150
+ new Uint8Array(
1151
+ generateEoCD({ recordsNumber: cdArray.length, cdSize: cd.byteLength, cdOffset, eoCDStart })
1152
+ )
1153
+ );
1154
+ }
1155
+ async function addFile(file, resFile, cdArray, fileList) {
1156
+ const size = (await resFile.stat()).bigsize;
1157
+ fileList == null ? void 0 : fileList.push({ fileName: file.path, localHeaderOffset: size });
1158
+ const [localPart, cdHeaderPart] = await generateFileHeaders(file.path, file.file, size);
1159
+ await resFile.append(localPart);
1160
+ cdArray.push(cdHeaderPart);
1161
+ }
1162
+ function getFileIterator(inputPath) {
1163
+ async function* iterable() {
1164
+ const fileList = await getAllFiles(inputPath);
1165
+ for (const filePath of fileList) {
1166
+ const file = await (await (0, import_core.fetchFile)(import_loader_utils5.path.join(inputPath, filePath))).arrayBuffer();
1167
+ yield { path: filePath, file };
1168
+ }
1169
+ }
1170
+ return iterable();
1171
+ }
1172
+ async function getAllFiles(basePath, subfolder = "", fsPassed) {
1173
+ const fs = fsPassed ? fsPassed : new import_loader_utils5.NodeFilesystem({});
1174
+ const files = await fs.readdir(pathJoin(basePath, subfolder));
1175
+ const arrayOfFiles = [];
1176
+ for (const file of files) {
1177
+ const fullPath = pathJoin(basePath, subfolder, file);
1178
+ if ((await fs.stat(fullPath)).isDirectory) {
1179
+ const files2 = await getAllFiles(basePath, pathJoin(subfolder, file));
1180
+ arrayOfFiles.push(...files2);
1181
+ } else {
1182
+ arrayOfFiles.push(pathJoin(subfolder, file));
1183
+ }
1184
+ }
1185
+ return arrayOfFiles;
1186
+ }
1187
+ function pathJoin(...paths) {
1188
+ const resPaths = paths.filter((val) => val.length);
1189
+ return import_loader_utils5.path.join(...resPaths);
1190
+ }
952
1191
 
953
1192
  // src/hash-file-utility.ts
954
1193
  var import_crypto2 = require("@loaders.gl/crypto");
@@ -968,6 +1207,9 @@ function bufferToHex(buffer, start, length) {
968
1207
  }
969
1208
  async function makeHashTableFromZipHeaders(fileProvider) {
970
1209
  const zipCDIterator = makeZipCDHeaderIterator(fileProvider);
1210
+ return getHashTable(zipCDIterator);
1211
+ }
1212
+ async function getHashTable(zipCDIterator) {
971
1213
  const md5Hash = new import_crypto2.MD5Hash();
972
1214
  const textEncoder = new TextEncoder();
973
1215
  const hashTable = {};
@@ -979,9 +1221,19 @@ async function makeHashTableFromZipHeaders(fileProvider) {
979
1221
  }
980
1222
  return hashTable;
981
1223
  }
982
- async function composeHashFile(fileProvider) {
983
- const hashArray = await makeHashTableFromZipHeaders(fileProvider);
984
- const bufferArray = Object.entries(hashArray).map(([key, value]) => (0, import_loader_utils6.concatenateArrayBuffers)(hexStringToBuffer(key), bigintToBuffer(value))).sort(compareHashes);
1224
+ async function composeHashFile(zipCDIterator) {
1225
+ const md5Hash = new import_crypto2.MD5Hash();
1226
+ const textEncoder = new TextEncoder();
1227
+ const hashArray = [];
1228
+ for await (const cdHeader of zipCDIterator) {
1229
+ const filename = cdHeader.fileName.split("\\").join("/").toLocaleLowerCase();
1230
+ const arrayBuffer = textEncoder.encode(filename).buffer;
1231
+ const md5 = await md5Hash.hash(arrayBuffer, "hex");
1232
+ hashArray.push(
1233
+ (0, import_loader_utils6.concatenateArrayBuffers)(hexStringToBuffer(md5), bigintToBuffer(cdHeader.localHeaderOffset))
1234
+ );
1235
+ }
1236
+ const bufferArray = hashArray.sort(compareHashes);
985
1237
  return (0, import_loader_utils6.concatenateArrayBuffersFromArray)(bufferArray);
986
1238
  }
987
1239
  function compareHashes(arrA, arrB) {
package/dist/index.d.ts CHANGED
@@ -5,7 +5,7 @@ export { parseZipCDFileHeader, makeZipCDHeaderIterator, signature as CD_HEADER_S
5
5
  export { parseZipLocalFileHeader, signature as localHeaderSignature, generateLocalHeader } from './parse-zip/local-file-header';
6
6
  export { parseEoCDRecord } from './parse-zip/end-of-central-directory';
7
7
  export { searchFromTheEnd } from './parse-zip/search-from-the-end';
8
- export { addOneFile } from './parse-zip/zip-compozition';
8
+ export { addOneFile, createZip } from './parse-zip/zip-composition';
9
9
  export { parseHashTable, makeHashTableFromZipHeaders, composeHashFile } from './hash-file-utility';
10
10
  export { ZipFileSystem } from './filesystems/zip-filesystem';
11
11
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;AACvC,OAAO,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;AACvC,OAAO,EAAC,UAAU,EAAC,MAAM,eAAe,CAAC;AAEzC,OAAO,EACL,oBAAoB,EACpB,uBAAuB,EACvB,SAAS,IAAI,mBAAmB,EAChC,gBAAgB,EACjB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACL,uBAAuB,EACvB,SAAS,IAAI,oBAAoB,EACjC,mBAAmB,EACpB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAC,eAAe,EAAC,MAAM,sCAAsC,CAAC;AACrE,OAAO,EAAC,gBAAgB,EAAC,MAAM,iCAAiC,CAAC;AACjE,OAAO,EAAC,UAAU,EAAC,MAAM,6BAA6B,CAAC;AAGvD,OAAO,EAAC,cAAc,EAAE,2BAA2B,EAAE,eAAe,EAAC,MAAM,qBAAqB,CAAC;AAEjG,OAAO,EAAC,aAAa,EAAC,MAAM,8BAA8B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;AACvC,OAAO,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;AACvC,OAAO,EAAC,UAAU,EAAC,MAAM,eAAe,CAAC;AAEzC,OAAO,EACL,oBAAoB,EACpB,uBAAuB,EACvB,SAAS,IAAI,mBAAmB,EAChC,gBAAgB,EACjB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACL,uBAAuB,EACvB,SAAS,IAAI,oBAAoB,EACjC,mBAAmB,EACpB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAC,eAAe,EAAC,MAAM,sCAAsC,CAAC;AACrE,OAAO,EAAC,gBAAgB,EAAC,MAAM,iCAAiC,CAAC;AACjE,OAAO,EAAC,UAAU,EAAE,SAAS,EAAC,MAAM,6BAA6B,CAAC;AAGlE,OAAO,EAAC,cAAc,EAAE,2BAA2B,EAAE,eAAe,EAAC,MAAM,qBAAqB,CAAC;AAEjG,OAAO,EAAC,aAAa,EAAC,MAAM,8BAA8B,CAAC"}
package/dist/index.js CHANGED
@@ -5,7 +5,7 @@ export { parseZipCDFileHeader, makeZipCDHeaderIterator, signature as CD_HEADER_S
5
5
  export { parseZipLocalFileHeader, signature as localHeaderSignature, generateLocalHeader } from "./parse-zip/local-file-header.js";
6
6
  export { parseEoCDRecord } from "./parse-zip/end-of-central-directory.js";
7
7
  export { searchFromTheEnd } from "./parse-zip/search-from-the-end.js";
8
- export { addOneFile } from "./parse-zip/zip-compozition.js";
8
+ export { addOneFile, createZip } from "./parse-zip/zip-composition.js";
9
9
  export { parseHashTable, makeHashTableFromZipHeaders, composeHashFile } from "./hash-file-utility.js";
10
10
  export { ZipFileSystem } from "./filesystems/zip-filesystem.js";
11
11
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["ZipLoader","ZipWriter","TarBuilder","parseZipCDFileHeader","makeZipCDHeaderIterator","signature","CD_HEADER_SIGNATURE","generateCDHeader","parseZipLocalFileHeader","localHeaderSignature","generateLocalHeader","parseEoCDRecord","searchFromTheEnd","addOneFile","parseHashTable","makeHashTableFromZipHeaders","composeHashFile","ZipFileSystem"],"sources":["../src/index.ts"],"sourcesContent":["// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nexport {ZipLoader} from './zip-loader';\nexport {ZipWriter} from './zip-writer';\nexport {TarBuilder} from './tar-builder';\n\nexport {\n parseZipCDFileHeader,\n makeZipCDHeaderIterator,\n signature as CD_HEADER_SIGNATURE,\n generateCDHeader\n} from './parse-zip/cd-file-header';\nexport {\n parseZipLocalFileHeader,\n signature as localHeaderSignature,\n generateLocalHeader\n} from './parse-zip/local-file-header';\nexport {parseEoCDRecord} from './parse-zip/end-of-central-directory';\nexport {searchFromTheEnd} from './parse-zip/search-from-the-end';\nexport {addOneFile} from './parse-zip/zip-compozition';\n\n// export type {HashElement} from './hash-file-utility';\nexport {parseHashTable, makeHashTableFromZipHeaders, composeHashFile} from './hash-file-utility';\n\nexport {ZipFileSystem} from './filesystems/zip-filesystem';\n"],"mappings":"SAIQA,SAAS;AAAA,SACTC,SAAS;AAAA,SACTC,UAAU;AAAA,SAGhBC,oBAAoB,EACpBC,uBAAuB,EACvBC,SAAS,IAAIC,mBAAmB,EAChCC,gBAAgB;AAAA,SAGhBC,uBAAuB,EACvBH,SAAS,IAAII,oBAAoB,EACjCC,mBAAmB;AAAA,SAEbC,eAAe;AAAA,SACfC,gBAAgB;AAAA,SAChBC,UAAU;AAAA,SAGVC,cAAc,EAAEC,2BAA2B,EAAEC,eAAe;AAAA,SAE5DC,aAAa"}
1
+ {"version":3,"file":"index.js","names":["ZipLoader","ZipWriter","TarBuilder","parseZipCDFileHeader","makeZipCDHeaderIterator","signature","CD_HEADER_SIGNATURE","generateCDHeader","parseZipLocalFileHeader","localHeaderSignature","generateLocalHeader","parseEoCDRecord","searchFromTheEnd","addOneFile","createZip","parseHashTable","makeHashTableFromZipHeaders","composeHashFile","ZipFileSystem"],"sources":["../src/index.ts"],"sourcesContent":["// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nexport {ZipLoader} from './zip-loader';\nexport {ZipWriter} from './zip-writer';\nexport {TarBuilder} from './tar-builder';\n\nexport {\n parseZipCDFileHeader,\n makeZipCDHeaderIterator,\n signature as CD_HEADER_SIGNATURE,\n generateCDHeader\n} from './parse-zip/cd-file-header';\nexport {\n parseZipLocalFileHeader,\n signature as localHeaderSignature,\n generateLocalHeader\n} from './parse-zip/local-file-header';\nexport {parseEoCDRecord} from './parse-zip/end-of-central-directory';\nexport {searchFromTheEnd} from './parse-zip/search-from-the-end';\nexport {addOneFile, createZip} from './parse-zip/zip-composition';\n\n// export type {HashElement} from './hash-file-utility';\nexport {parseHashTable, makeHashTableFromZipHeaders, composeHashFile} from './hash-file-utility';\n\nexport {ZipFileSystem} from './filesystems/zip-filesystem';\n"],"mappings":"SAIQA,SAAS;AAAA,SACTC,SAAS;AAAA,SACTC,UAAU;AAAA,SAGhBC,oBAAoB,EACpBC,uBAAuB,EACvBC,SAAS,IAAIC,mBAAmB,EAChCC,gBAAgB;AAAA,SAGhBC,uBAAuB,EACvBH,SAAS,IAAII,oBAAoB,EACjCC,mBAAmB;AAAA,SAEbC,eAAe;AAAA,SACfC,gBAAgB;AAAA,SAChBC,UAAU,EAAEC,SAAS;AAAA,SAGrBC,cAAc,EAAEC,2BAA2B,EAAEC,eAAe;AAAA,SAE5DC,aAAa"}
@@ -19,6 +19,16 @@ export type ZipEoCDRecordOffsets = {
19
19
  zip64EoCDOffset?: bigint;
20
20
  zip64EoCDLocatorOffset?: bigint;
21
21
  };
22
+ /**
23
+ * Data to generate End of central directory record
24
+ * according to https://en.wikipedia.org/wiki/ZIP_(file_format)
25
+ */
26
+ export type ZipEoCDGenerationOptions = {
27
+ recordsNumber: number;
28
+ cdSize: number;
29
+ cdOffset: bigint;
30
+ eoCDStart: bigint;
31
+ };
22
32
  /**
23
33
  * Parses end of central directory record of zip file
24
34
  * @param file - FileProvider instance
@@ -33,5 +43,11 @@ export declare const parseEoCDRecord: (file: FileProvider) => Promise<ZipEoCDRec
33
43
  * @param eocdStartOffset EoCD start offset to be updated
34
44
  * @returns new EoCD header
35
45
  */
36
- export declare function updateEoCD(eocdBody: ArrayBuffer, oldEoCDOffsets: ZipEoCDRecordOffsets, newCDStartOffset: bigint, eocdStartOffset: bigint, newCDRecordsNumber: bigint): Promise<Uint8Array>;
46
+ export declare function updateEoCD(eocdBody: ArrayBuffer, oldEoCDOffsets: ZipEoCDRecordOffsets, newCDStartOffset: bigint, eocdStartOffset: bigint, newCDRecordsNumber: bigint): Uint8Array;
47
+ /**
48
+ * generates EoCD record
49
+ * @param options data to generate EoCD record
50
+ * @returns ArrayBuffer with EoCD record
51
+ */
52
+ export declare function generateEoCD(options: ZipEoCDGenerationOptions): ArrayBuffer;
37
53
  //# sourceMappingURL=end-of-central-directory.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"end-of-central-directory.d.ts","sourceRoot":"","sources":["../../src/parse-zip/end-of-central-directory.ts"],"names":[],"mappings":"AAIA,OAAO,EAAC,YAAY,EAAsB,MAAM,0BAA0B,CAAC;AAI3E;;;GAGG;AACH,MAAM,MAAM,aAAa,GAAG;IAC1B,2CAA2C;IAC3C,aAAa,EAAE,MAAM,CAAC;IACtB,2CAA2C;IAC3C,eAAe,EAAE,MAAM,CAAC;IACxB,OAAO,EAAE,oBAAoB,CAAC;CAC/B,CAAC;AAEF;;;GAGG;AACH,MAAM,MAAM,oBAAoB,GAAG;IACjC,aAAa,EAAE,MAAM,CAAC;IAEtB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,sBAAsB,CAAC,EAAE,MAAM,CAAC;CACjC,CAAC;AAiBF;;;;GAIG;AACH,eAAO,MAAM,eAAe,SAAgB,YAAY,KAAG,QAAQ,aAAa,CAmC/E,CAAC;AAEF;;;;;;;GAOG;AACH,wBAAsB,UAAU,CAC9B,QAAQ,EAAE,WAAW,EACrB,cAAc,EAAE,oBAAoB,EACpC,gBAAgB,EAAE,MAAM,EACxB,eAAe,EAAE,MAAM,EACvB,kBAAkB,EAAE,MAAM,GACzB,OAAO,CAAC,UAAU,CAAC,CAmDrB"}
1
+ {"version":3,"file":"end-of-central-directory.d.ts","sourceRoot":"","sources":["../../src/parse-zip/end-of-central-directory.ts"],"names":[],"mappings":"AAIA,OAAO,EAAC,YAAY,EAA+C,MAAM,0BAA0B,CAAC;AAIpG;;;GAGG;AACH,MAAM,MAAM,aAAa,GAAG;IAC1B,2CAA2C;IAC3C,aAAa,EAAE,MAAM,CAAC;IACtB,2CAA2C;IAC3C,eAAe,EAAE,MAAM,CAAC;IACxB,OAAO,EAAE,oBAAoB,CAAC;CAC/B,CAAC;AAEF;;;GAGG;AACH,MAAM,MAAM,oBAAoB,GAAG;IACjC,aAAa,EAAE,MAAM,CAAC;IAEtB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,sBAAsB,CAAC,EAAE,MAAM,CAAC;CACjC,CAAC;AAEF;;;GAGG;AACH,MAAM,MAAM,wBAAwB,GAAG;IACrC,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAmBF;;;;GAIG;AACH,eAAO,MAAM,eAAe,SAAgB,YAAY,KAAG,QAAQ,aAAa,CAmC/E,CAAC;AAEF;;;;;;;GAOG;AACH,wBAAgB,UAAU,CACxB,QAAQ,EAAE,WAAW,EACrB,cAAc,EAAE,oBAAoB,EACpC,gBAAgB,EAAE,MAAM,EACxB,eAAe,EAAE,MAAM,EACvB,kBAAkB,EAAE,MAAM,GACzB,UAAU,CAmDZ;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,wBAAwB,GAAG,WAAW,CAgB3E"}