@zip.js/zip.js 2.8.26 → 2.8.29
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.
- package/BENCHMARKS.md +168 -0
- package/README.md +2 -2
- package/deno.json +1 -1
- package/dist/zip-core.js +1113 -574
- package/dist/zip-core.min.js +1 -1
- package/dist/zip-fs-core.js +1209 -622
- package/dist/zip-fs-core.min.js +1 -1
- package/dist/zip-fs-native.js +1270 -632
- package/dist/zip-fs-native.min.js +1 -1
- package/dist/zip-fs.js +1347 -686
- package/dist/zip-fs.min.js +1 -1
- package/dist/zip-legacy.js +1114 -575
- package/dist/zip-legacy.min.js +1 -1
- package/dist/zip-module.wasm +0 -0
- package/dist/zip-native.js +1116 -577
- package/dist/zip-native.min.js +1 -1
- package/dist/zip-web-worker-native.js +1 -1
- package/dist/zip-web-worker.js +1 -1
- package/dist/zip.js +1193 -631
- package/dist/zip.min.js +1 -1
- package/eslint.config.mjs +6 -1
- package/index-native.cjs +1270 -632
- package/index-native.min.js +1 -1
- package/index.cjs +1347 -686
- package/index.d.ts +2451 -2355
- package/index.min.js +1 -1
- package/lib/core/codec-pool.js +39 -1
- package/lib/core/codec-worker.js +130 -35
- package/lib/core/configuration.js +3 -0
- package/lib/core/constants.js +6 -0
- package/lib/core/io.js +55 -25
- package/lib/core/options.js +2 -0
- package/lib/core/streams/aes-crypto-stream.js +12 -12
- package/lib/core/streams/codec-stream.js +11 -5
- package/lib/core/streams/codecs/sjcl.js +1 -33
- package/lib/core/streams/common-crypto.js +4 -4
- package/lib/core/streams/zip-crypto-stream.js +25 -15
- package/lib/core/streams/zip-entry-stream.js +89 -5
- package/lib/core/streams/zlib-js/zlib-streams.min.js +1 -1
- package/lib/core/streams/zlib-wasm/zlib-streams.js +79 -56
- package/lib/core/streams/zlib-wasm/zlib-streams.wasm +0 -0
- package/lib/core/util/decode-cp437.js +1 -1
- package/lib/core/util/decode-text.js +2 -1
- package/lib/core/web-worker-base.js +12 -4
- package/lib/core/web-worker-inline-native.js +1 -1
- package/lib/core/web-worker-inline-wasm.js +1 -1
- package/lib/core/zip-fs.js +154 -55
- package/lib/core/zip-reader.js +185 -67
- package/lib/core/zip-writer.js +613 -376
- package/lib/core/zlib-streams-inline.js +1 -1
- package/lib/zip-core-reader.js +3 -1
- package/lib/zip-core-writer.js +1 -0
- package/package.json +20 -6
package/dist/zip-native.js
CHANGED
|
@@ -50,6 +50,7 @@
|
|
|
50
50
|
const END_OF_CENTRAL_DIR_SIGNATURE = 0x06054b50;
|
|
51
51
|
const ZIP64_END_OF_CENTRAL_DIR_SIGNATURE = 0x06064b50;
|
|
52
52
|
const ZIP64_END_OF_CENTRAL_DIR_LOCATOR_SIGNATURE = 0x07064b50;
|
|
53
|
+
const CENTRAL_FILE_HEADER_LENGTH = 46;
|
|
53
54
|
const END_OF_CENTRAL_DIR_LENGTH = 22;
|
|
54
55
|
const ZIP64_END_OF_CENTRAL_DIR_LOCATOR_LENGTH = 20;
|
|
55
56
|
const ZIP64_END_OF_CENTRAL_DIR_LENGTH = 56;
|
|
@@ -97,9 +98,11 @@
|
|
|
97
98
|
const DIRECTORY_SIGNATURE = "/";
|
|
98
99
|
|
|
99
100
|
const HEADER_SIZE = 30;
|
|
101
|
+
const HEADER_OFFSET_VERSION = 0;
|
|
100
102
|
const HEADER_OFFSET_SIGNATURE = 10;
|
|
101
103
|
const HEADER_OFFSET_COMPRESSED_SIZE = 14;
|
|
102
104
|
const HEADER_OFFSET_UNCOMPRESSED_SIZE = 18;
|
|
105
|
+
const LOCAL_HEADER_COMMON_OFFSET = 4;
|
|
103
106
|
|
|
104
107
|
const MAX_DATE = new Date(2107, 11, 31);
|
|
105
108
|
const MIN_DATE = new Date(1980, 0, 1);
|
|
@@ -154,6 +157,7 @@
|
|
|
154
157
|
chunkSize: 64 * 1024,
|
|
155
158
|
maxWorkers,
|
|
156
159
|
terminateWorkerTimeout: 5000,
|
|
160
|
+
workerStarvationTimeout: 5000,
|
|
157
161
|
useWebWorkers: true,
|
|
158
162
|
useCompressionStream: true,
|
|
159
163
|
CompressionStream: typeof CompressionStream != UNDEFINED_TYPE && CompressionStream,
|
|
@@ -176,6 +180,7 @@
|
|
|
176
180
|
chunkSize,
|
|
177
181
|
maxWorkers,
|
|
178
182
|
terminateWorkerTimeout,
|
|
183
|
+
workerStarvationTimeout,
|
|
179
184
|
useCompressionStream,
|
|
180
185
|
useWebWorkers,
|
|
181
186
|
CompressionStream,
|
|
@@ -191,6 +196,7 @@
|
|
|
191
196
|
setIfDefined("chunkSize", chunkSize);
|
|
192
197
|
setIfDefined("maxWorkers", maxWorkers);
|
|
193
198
|
setIfDefined("terminateWorkerTimeout", terminateWorkerTimeout);
|
|
199
|
+
setIfDefined("workerStarvationTimeout", workerStarvationTimeout);
|
|
194
200
|
setIfDefined("useCompressionStream", useCompressionStream);
|
|
195
201
|
setIfDefined("useWebWorkers", useWebWorkers);
|
|
196
202
|
setIfDefined("CompressionStream", CompressionStream);
|
|
@@ -205,7 +211,7 @@
|
|
|
205
211
|
}
|
|
206
212
|
}
|
|
207
213
|
|
|
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 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;}}})("IChlPT57ImZ1bmN0aW9uIj09dHlwZW9mIGRlZmluZSYmgwAIBS5hbWQ/gwALCihlKTplKCl9KSiFADVEKCl7InVzZSBzdHJpY3QiO2NvbnN0e0FycmF5OmUsT2JqZWN0OnQsTnVtYmVyOnIsTWF0aDpuLEVycm9yOmksVWludDiDAC4Bb4IADQIxNoMADgFmggAOAjMygwAOA3MsSYcADQFsgABFInA6YSxEYXRhVmlldzpjLFByb21pc2U6dSxUZXh0RW5jb2SAAG4zdyxjcnlwdG86aCxwb3N0TWVzc2FnZTpkLFRyYW5zZm9ybVN0cmVhbTpwLFJlYWRhYmxlhAARBmssV3JpdIgAEQdiLENvbXBygABCgAD0hAAUBXksRGVjjgAWFm19PXNlbGYsdj12b2lkIDAsZz0idW6DAT8FZCIsUz2HAXAGLFQ9W107gACIFChsZXQgZT0wOzI1Nj5lO2UrKyl7gQATA3Q9ZYoAHwE4hAAdFzEmdD90PXQ+Pj4xXjM5ODgyOTIzODQ6gQAREj0xO1RbZV09dH1jbGFzcyB6e4IBkgRydWN0gABJCGUpe3RoaXMugABZC3x8LTF9YXBwZW5kgQAXgwBvAjB8gwAfhgB2BXI9MCxugAAXDmUubGVuZ3RoO24+cjtygACDgwB/EjheVFsyNTUmKHReZVtyXSldO4QAXwV0fWdldIACHAdyZXR1cm5+gwAWAX2EAJQCQyCAAaWAAHgDcyBwigCegwCGAWWDAkSAAI4ObmV3IHo7c3VwZXIoe3SFAbQEKGUscoAAxwEuhgC8CSxyLmVucXVldYECnwd9LGZsdXNogABMgwBGAXKCAEYFbyg0KTuBAAkPYyhyLmJ1ZmZlcikuc2V0gwJkBSgwLHQuggCwDSksZS52YWx1ZT1yfX2AAA0BPYEAuYAAt4IASwJfPYEAVANjYXSAAIIKdCl7aWYoMD09PYUBGgJ8fIEADgF0hAAOASmDAPkDIGUuhAAzAnQphADXBHI9ZVuFADQDLTFdgAFeB18uaShyKTuEADICMzKAAEcCbj+IADkMOl8ubyh0LG4sMHxygACgBXNsaWNlgACzhwBFASmAAPYBbIEBxYUBOYYBroQApAF0hQCPATCIAIUBdIAAfocAdQIqKIAAEAIpK4MAjAN9LHWGAOSAABuFAE8BPIYASIUBpAJyPYAEQ4cAkw5uLmNlaWwodC8zMikpKYUAhYQANA90Jj0zMSxyPjAmJnQmJiiAAjCAAIGAAP0BaIAA3IMADQ0mMjE0NzQ4MzY0OD4+gACPASyAANoGLGV9LGg6gQCOgAH2Aj0+ggEeB2U/dDoocj+AAq0cOnQ8PDMyLWUpKzEwOTk1MTE2Mjc3NzYqZSxpOoAE3ARuLnJvgAN8AyhlL4oAHwcpfHwzMixvgwBVBCxuKXuBAu6DA66BAXyAAJ0BboADmQopO3Q+PTMyO3QtgAAGBCluLnCBAlcBcoACboADiY0BWIAA+YQCGgEphgM7AWmBACgBPIcBi4ADNYUARQV8ZVtpXYADPwF0gQBOgQAMggDGAXSEAVUBaYYBwAE/igIrBDowLG+CAi0BaYYCLYQAUYIBRQMrbyaAAWCAAAeAASUDP3I6gAAbBG9wKCmCAUQPbn19LHg9e2J5dGVzOntwiQIrAl8ugQI6Ai84gACJgwMpgAKpgQC+AW6KAMgDdD5pggDBBTMmaXx8gAEegAC0Ay80XYAAvoAAvAI9boAAyggyNCxuPDw9OIUAmQRyfSxriQBngAToggRPgQRNggBagQFGAXKHAR6BBFMCbj2AAEMBOIABHAdyXSwzJn5ygABqAXSDAOABboAAwwI9MIcDIwImcoACRIcA+wM4KiiAABOAACSAAOuABGUEfSxBPYIEaY0E+4UAjYED1RA7dC5ibG9ja1NpemU9NTEygAQCGW09WzE3MzI1ODQxOTMsNDAyMzIzMzQxNyyABZaABWAHMzEwMiwyN4AAIxAzODc4LDMyODUzNzc1MjBdgAA8AXaAADwKNTE4NTAwMjQ5LIAACQE5gAAbATOAAEcFMjQwMDmAAA4BMIAAMg0zOTU0Njk3ODJdLGU/gADcAVOAAekBU4UDPYAAuwIuVIAAEQFUiQARAUOAABEFQyk6dC6ABmSBBKABfYQACIQAy4MEoIUBF4AATYAALwFthwBAgABNgAF5gAAHAUOABcYHZX11cGRhdIEFJIsBCQEigQe7Am5nhwf+gAf5gAPWBHguXy6BAcOHBLiBAKABX4YElwMuVCyABXsBboAAFgFDgAKXgQCrAW6ABD6BAk2BAx4Lbz45MDA3MTk5MjWAA9OAA30IMSl0aHJvdyCBAmUnaSgiQ2Fubm90IGhhc2ggbW9yZSB0aGFuIDJeNTMgLSAxIGJpdHMihQB6AWaCApoBc4EFJIECRAFshAJCgwcViAHHAytuLYAAl4gAD4ACJIYADoAE3QM7bz6AB1ACZSuJADQLKXQuQShmLnN1YmGBCFwGKDE2KmwsgAAFAyhsK4ADOQQpLGwrgAdRhQLUAy5zcIQE6YEAJ4ECbAFSjQGLhAe2Ai5UhwVpAy5TO4EDZ4UBOAIsW4ECs4EE3IAEYokAyIMDCgYrMjsxNSaDB+eEAuOAAvmBACiFAwwELmZsb4EC0A0uQy80Mjk0OTY3Mjk2gQL6hAAugAesAUOABLyFA1oCKWWAAOIBdIkAu4AB04YCMoQCUAQscn1ChwUPhQAeBz4xOT9lPjOBAAUBNYEABQM3OT+DBSYROnRecl5uOnQmcnx0Jm58ciaAAAyGABIBfoAAEwJ9RIMGQIUF+wQ8PGV8gQgwgQWsAX2AAI+HB56BATYGLGk9ci5TgAJGA2UoOIQA7YUI8gExhQkQAW+CCNWAAAWCAWMEZj1pW4ADeAFzgAAHgAdDAWyAAAeAA1QBYYAABwQzXSxjgAAHATSLCVcCNzmDAfqACVeBAFGABFmCAE8Dci5EgAGJgAALBC0zXV6BAAcBOIMABwIxNIQACAI2XYYC/wF0ggAuBzUsZikrci6BASwJcyxsLGEpK2MrgQBLgAAUAnZbhgGaBi8yMCldfIAHbAI9YYAAlQFsgACggQA8BTMwLHMpgACzA2YsZoAJH4EAwIIAxQUrZnwwLIEAx4IAzAIrc4IADgEygQAOBDJdK2yCAA4BM4EADgQzXSthggAOATSBAA4GNF0rY3wwgATrA1I9e4AIugdSYW5kb21WgQi6AXOJA+GDAzkBZYUI84EGboAL8oMCpQk5ODc2NTQzMjGGAquGAk8BNYQCIQEogAdyFCh0PTM2OTY5Kig2NTUzNSZ0KSsogAHLgAJHBiZyLCgoKIAB3IAADAErgAQyBDE4ZTOFACaAB5ICKGWEACaBAAOIAqsFKy41KSqAAseACdCAALQIKCk+LjU/MTqCCMaHBnSAAg0DMDtvhwYgBG8rPTSHA2sCciiHAE8CKiiABpOHAE6AAbEBaYQA24AEgAEqgAytBCx0W2+ABq2HAN6ACB8CKCmAAT2FAueAAUYLQj17aW1wb3J0S2WADLeACDmAATgGQi5HKHguggc0gwUJAixJhwMjgATjAnI9gAaiBzFlNCwwPm6ACf0CPnKLBOICaW6ACkmAAy0QcGFyYW1zIHRvIHBia2RmMoYE1wVvPTErKIAHPAU1KTw8MoMC1oMCVQIsdYQAIgF3ggHAggz1AUKCAcEFKG8pLGiCABUDYyh3gwUOAWSAASiDAC4DcD1fgwQogAW7hQC2gAhhAXWABMECKG+AAKoFKT5kO3WBAwOBACUDZj1zgASaAmVugg0hAihwiASeAXWAAvSAArKABPYEPmw7bIAAMIEAL4kALYACxQFhgAB1A2E8c4UBnQFhgQAmBlthXV49c4AABoMBxYAAIoUAdgUmJmw8ZoUALIEAUgFogQt7gg3RBihkLGZbbIAISQFkgAHghQGRAXeHClACLziACowCRzqeB86AAtkFdC5aPUGABpABW4AG8gJbXYAMiQQuVT1bgQErgAGwgQAGAV2GCV6AABqAA3iHBgSACq4BO4UCaQI+aYIG/QEoggAzAikuhgczAS6ABeqHBJqADSkGO2k+dDt0gQi2gABMBVt0XT05gAfnBTIyNDg2gA0KAXSAC9eAA82BABcKMTU0OTU1NjgyOIIAGIEAl4EAfYQAWYEAPYEFugFVgAAuhwAUATGCABQBVoIB6YEF+IEAMpQH+wFlhAAnA2UuWoAD54IAKYAH8ARNPSExiAfvgg1+gAAUgAzngQAKAVaHANcGfWRpZ2VzjQBWASyBBsIBVoEA84QKFoUAXoAAmYUAPAF0ggETkQZJhQIogAB5gAMmgwB8iwMbhAAiBiBvbiBhbIAPNQNkeSCDAFYOZCBobWFjIGNhbGxlZCGAAyqFBkCBAEWGALWDAMaEALqAAMSAA8ABRIUIvARoIT1ngAochAANgQ3ViQUbCD09UyxHPSJJhgObBXNzd29ygA+WAUmHABUFc2lnbmGAAHYOZSIsWj0iemlwanMtYWKABBsHLWNoZWNrLYYANQE7hQ/IAiBVgQDshACrAkQ/jgB2gRE1AVKQABWEDlcYVj0xNixNPXtuYW1lOiJQQktERjIifSxQgAKogABrgACOAih7gQknATqEACEFSE1BQyKAAPMETSksS4gAIwVpdGVyYYEAjgZzOjFlMyyJADIFU0hBLTGEADMERT1bIoARGwRpdmVCgQljB10sTj1bOCyACv+ABuwCLFGACsUBNoAKsoAK3AxdLFc9MTAsaj1bMCyCAAIDXSxIiQFkBixMPUgmJoADyQR1YnRsgBHogQAOhAAfAUyBAB8BJIUEhQIscaILjAFQgAO4ggO5hgADgAAEjAARgQtoAVCBA26CAAMFfHx0LkuAAoKHCp6CABwBNIEPUoEADIAIGIAIUYYEd4cFX4AE24ACmAg0IT09byYmNoMABwE4gQAHkwXAB2FlcyBrZXmAAhgCemWAApKDCYqAC++BBROGC2oBbIALaAFdgAfYDG87NCpvKzI4PmY7ZoURxQFlgAUWAWaBD2wEKGYlb4AONQQwfHw4gAAHgAB2gwAQAjQpggRzAnJbgAcwgA1IgA4MAzI0XoIADgMxNiaAEV2AABECMTaDABEBOIQAEAE4gAAPgRF3AWWAAHSDAFSCAEMBZYEAGoMARgJeYYEAR4AA7YAACAQxXjI4gAeZBGE+PjeBCtOAAI4BXYIAkwVvXV5lfYkJJwFmgQkjBCxmLS2HAZ8Kc1szJmU/ZjpmLYAJUwFsgQk1CDQ+PWZ8fDQ+gQ+FggT8AnJbgQnagAC5Al1eggT1ggAQhAC7gQATATKEABODAL2BABIBM4EAEoEAwAR0XV19iQQwiQPvAU6AB20BMIAEoQFllgAeAzEpfYACAYoEuoICBIAEv4QADIACBIEPYIMCFIEABwFpgQ0QAW+FDo6EAhGUE4IEb1soaYEA8YABVoQBQoABW4ABQgFegQAUhgA0A2M9ZoAANgQhcltjgAZhgAcBgAbzgQIIgAFkgQb9ggIBBW89Zl5mgQBFgAAFATKBAAUBM4EABQU0O289b4ETQoEBCQRvXjk5gA9NBGNdPW+ABjoEb109Y4IKzoEK2YEK5AFjgAL9ggCygAfNBDY4NDOADlMDKmFegQlqAzcqbIAAQQQ3KnNehAAZBjgqYyx3PYEAEwFpgABIhwAWAW+JE9MCOzSEE8aBD2yBAHYDdz13ggJ3AXeBE9SACTGAABaAAIUDdT11ggAWAXWBABaGAiqBAEABNYgAQIABYQJyXYgOtYEAE4EABYYAEwF9gQGtgxJNgQN2hQOUlwNvggeahQNxiQwpgAtlgQdbgAtPgwBDAy80LYARyIgEpIALWoMB+oAAJ4ALaoECDQFsgAAHgAIIAWGAAAeABNaAAa+BDCQBdYAAB4EC0YAAzwd3LGgsZCxwgADGAjBdgANXgAAyAWuBEx0EPzM6MYEAEIAAOwFigAAQATKBAAyAAEABeYIAHAIxOoAMMQFygQBJA209NIoCPwFuhAI9AXeAAzoBcIMDFwRebFtrhgMRBF5hW2KFAwsCXmOCAwUBeYEASwJtXYAJ2QFzgQAphAAzgAAmhwAzAXmMADMBcIIAMwErgACcAWSAADWAACuEADWAACiHADWAAH+KADUBa4MANYIAxQFzgQArhAA1gAAohwA1gACBigA1AWKDADWBAOqACaKAAScBd4ABHwFogAETAWSKAPeABA+EAzSAATkEJi1lOoADJAF1hQEBgwJEiAEFggTRAXWHAQmBBLcBdYgBDAMrK12AAsQBcIAAbgFrgABuAWKAAG4BeYAAtAF3hQgOAW+ABssBRpEGVoECZYICAAJXPYAADIEACQNqPXSDAAmABr2GCUGFABGCACGICSeJBGABTIMIuQJXLIQASQRIKX1PhAjSgQCoAX6BBAwEMjQpKYAQTgExgQDgBTtlbHNlhRe0hQDpgQR9hADkgAK1ggWxgARgATWBFDmAEf+AEZSDAA0Ccj+BEw6EAA0Cbj+AEuoFOisrbimAAAUBcoEABYAVHoERv4AQt4EBOIEACQFygAExgQAIAW6HDMMBJIEAnYEUk4AVWIAOWYIAtIAAsYEKEIIGX4EOYIYAFYAJxwMpfUyEFVSCALUBboEHEwEhgBPZhhbAhBTagAUqhQs3gRHdgBQdiRQXAW6CFBeBDZqCAFwBJIERo4MAL4AUI4YMMYAAFQF0gBQoAl49gQYvgAQgAWmAArmBAA2AAr+BAA2AA1uAAA2AApeBAA2AA1iAAA0CM12FANoDXy51gAyVAWmACeUDLFg9gA2SggOzAVmBCG4BT4cIcQEuhg28gQnhAUqNAB6HCPCAAB8BO4MYgwJlZZQYhAF7hQnggBq+BHJhd1CFAA4CciyBCWgCZWSAGryEANiEGfOBAS6AGq6CCh2FAC4DT25sgBq0A30pe4QYvARzdGFyggJ6hQmvggtmgAJxgAr7ATqBBQGAF28CPT6CAUQCcT2ACuGGAIQBaYACmYABpIcAfAFGgAeKAjEsgRj5gBOzggA7Am99gA0jBmFzeW5jIIkZI40RY4cA2IIARQIscYAbR4MAgA5hfT1yO24/KGF3YWl0KIIASoYO6IAQLYUOrYIAH4AFroQAHAFmgAypgAV0AU6ABWqACFQCZj2CABCCAA6CE/+AAeoBIYIFgAN8fG+AAemBAAyAAnaJBfIBR4EcRoAASIAY2IAAPIAH7IAAPgNmXSuAGDmAAvCCABKEABAGLHM/dC5lgRwwgg2WB2koWikpOmyADY8BOoMAkwFhhAJzAWOEFsGGFzICVy2IAAwDKSVWgRMVhRopAXKAAAOAA9wBY4AAdwRXLCEwgRlCgwFEgxo+hQqhAXuEAXkDdCxYgAICAVmAATyFAXsBZoQBPgJzfYMKw4AA9YAYOYADT4MAlQFzhACVgAZ+A2UoZoAAZoUPAYAAioEGjIEAFYgAE4IC14QAwYEASwFshQOHhgjeBmxlKCQsbIAaxYcNCIgSmogAFIAcfoAAKgN0KX2BDX2HAECAAHKCABkBboUNOYABaIAA/IsO1AFXhA7UgAA7gQ6tAyE9YYEB0YkBtgNJKX2BA9mDAUUBY4ENfIAABIMDUwF0rwNTkANKAW6AAzaCBF+FG/i+AzwDRjpuwQMzAWmAAzOIAfUBcoQWjIMBs4ADPwFsgwMiiQNBhwM/A249VYICvQJvKIMDMYYGy4EDNowDWoAYxoIDGgFpgAAKAixmhwLohQJTAWGEAuiFAiQBK4YC5YUACYEC6wFhgRFkAihsgAtDgA02jAL2AmEshQA8gAAflQL6AViAAvUBWYABpIYBOYQA/AFmhwLxgRmGhQLxAWaCARABc4cCwwFujgLDAXSFAqeCAsyAAOcBO4gCuYAJr4ICoIAPFwJpLoYPhIMAFAFyhwK0hhIbgANHhwKJgAFHgBZFhwA3gADVgR2/gBHrgh2/hg+pgAEAhAFkgAFeAWaHAOoBc4AA6gFshgDqgAURgAQahgcLAi1pgwt7ggMqAWGEABWAB1QCdD2AAHcBYYACNoAH5wEoggI/gAHvgQN1gAEWAT6GCuWGAlMCZTuAAqiFG2OCHn2AAYyACx2GB8OBAfQDYy1jgAG9gRO1gBPWBS1WPj11gBOzAj1WjAQHgAPMBnQsdSx1K4AAKwI7ZoATX44EFAJpPYgRMAE7gA2whgAjAWmBHy+BAH2CAVqAAA4BdYAIa4YAhQEuhAEEgQQvgABjgRHPhAIdhQFDgAKnhgE/AnIuhQMiBT1udWxshAB8AXOPAwmBADGEAR4CIVmFHTQBQocHt4EIWAN0cnmFCYKDAlKIB9cCKCKABDgBIoIASgIhMYEIDoAUrAJjaIUALwFZgBLuASyLAE6AAf6AAiQDaSxQgATkAUWBD5+SA5yBAI8BSocAjwFJgR6JCC5zYWx0LEsuhxFQgAAskQCdhwhWhABRiwCVAUqDAJWXAFSBAKOHEb+BACKAA1sCLEuAAwkBLIAc0AUyKlFbboMHDoYD8AEpgAKVhQIAAWGAANmBACKCAiyHABWBABMBLIMAPIAAGgF3gQHHAWGFABCGE02FAHUDcix7gBDZgB4RgAAGgCNEAUqAIz6FAdABVoAA3QJmaYAA0YAArQI6d4AJfIIFOAFGggTEAXGABfiAANQBZoAjcwIoaoAAZoAHFoAAFgNYKHWABLcCLHeHA22CBYCIGgSACp0Cdj+CJHKBAyWDCZ0Edz09Z4sYrgFvgANLCD11bmVzY2FwgABBgiPKA1VSSYEjfgRvbmVugRAJhiBahwa9gx5Ohhr0giKhgg6bBi5jaGFyQ4AARAFBggqIhQCMhALxggDQAncpgQqqgAAjgROTASmBE60BdIcAxYAD44IAxYMAZQFlhxTwhAV8hQBzgAQQhR9BjgAchQNygRDQhAALgQIVhQtpgANkhgBvggj4gguWhgBphhybggJkhgAqgAO/iQFegAO6gQL3hgAfgAITiwAfgRgMhAepAWGhB6mSAgqABKGOCueBB7GbB6ueAFaAAjgBaIAEcIEALYEjwZgHlIIGdoYEdocCOoEG3IEDaIUBLIAc54ADO4sALoIEpIAHDYAY54AabQEhgAk2kQCOjAqkATuCIt+GHh4EMil9bpAKjocHYoMAiYEGgIYJGAFjtwFv6gFbgg4IASyADdGLAWOTBeUBdIYI0YIBaQN0WzGADmGTAVKADvuWAxkBboIDDgF3gQE1gAdIgAMfBWk9MTJ9gQ9MgAkziwA2gQAcgA5yhwAxgAg0gAa/hwF7gAbHgQF1hgMDgSYPiQDlhAd8jgQ8gSKSAW6HBDwBboAEPAFygAUwAT2BBH8DKV50gQVSgQQcgBOfiAVFiAO0gACNygBogQAKkQBogAHIgib6hQpSBFszMDWAIqoLODk2LDU5MTc1MTCAInqAIpoGMDgyMTkygRpqhAIrAWWEBeiADroBZYIFrAF6hRp4hwAPATKAGmGLDAwCdDyFE2aCDBODAQOJBU+ACMaHAJ2DALqCBSgBW4EKu4AUPoAEdIAAdoAaogFlgCpCgyesgQr8gAkuAX6CABSCJ3GAAdUBYoABu4AHvQN1bCiAAAoDaStrgAHcgAUVAzEzNIAjQgM4MTOAJduBBm8BdIcARQFpgxJXASmAE/qAAEqAABmDAEqDAHABPYQAf4cAm4IBYIYEKgEygCEfgQAogADyhQFkgAByhACBBnQsMV50KYEU7ogA24AAH4cSHYIRxYcAHIAAsocAHIcfP4AAI4MD/AF5lQP8gAGUBGNodW6CHICAC2kCcmWABVyPKmKIBVyAAZ6DCq6FKnKADpYBaYUNQYAADAJvLIArho8AQgJmLIAawgFDgysGAXOFEEeAIJIEZXZlbIMK6QF1hwP+ghULAT2CAHGAG9CDKxEBO4AYqAEhgBbWAiFsgCE2gx6RAUOAACUCU2WAHbsBd4ABqIEdMANkPWeBAA8CZiyAAf+CAFiABieGANwBfYAJ/YIM1QEsgABKAyhzP4QAPIIexYEBPgMpOiiDHtODDAeEAB+ABxgDKSx2gAVQgBWcgSCGhCoaggCNghjsgBp7hgvugQBahgCkgwtlgB8ggynJhinugAIlhSnugQk1iAxkgAt7hQWsAW2kAbABboEBsJEr/pEBsocBggFviAGxgBh9gwGOgwGXggCLgAGaiAHfgCAJkQHTBHUsaWWACZSACI2BARSDFr2MAbSADBQEKG8/cIEBSwFwggFqAWGEAWqABcSBHc+CAWqEAB8BZIEBagFhgAAxAXCBAcYBcIAMWIoA6oIAbIYBw4AAWQEhgB/WgQFthAG2AUOFAEiBCMqAAbGCBmsBcIMBtIAGSgIoIYAMfQFvgBSDAXOHDMSDAaABaIsBoIIQ9gEhgAQ1iAGogAvtASmNEH6KBeOAAHCABJWCJLOBAIWDH+oDcCh7gg7LgQGMgQYggy17gC4igAEjAnR5gAAxASKFASgCIiyBIzwBOoEArIAHKYcAV4ABCIcOJwFvhQC5gBhcAiYmgBWfATqAInABb4AOrwVyLmllP4AdTQJmbIANWAM2NC2BDKMBOoUAEIIADoIMNwFlgQCaAWWCAJoBZoAOpoAE3IMMKYAGsIIMgQF0hQDigQECAmkpiAAvAWmDAC+DFluBACuGHKKACJaGACYBb4QAVYcOSYYAyIIAJIoKJARpcGVUgABDAnVngCowhR6ABFRlPSKADhsDYSIsgCkKBiJjbG9zZYAvx4MtqZcDD4AGiYwC6IAGk4MIlYELTAJjVIAL4QI6b4UCpgRmO28uggjDBnNXaXRoKIUBJgYiKT9mPXmAACiKAB0CaW6EAB2AApUDZj1tgShmBy5vdXRwdXSCKa0BMIQQaoUi+IMRhIASsoER7QFhjAMLgA0zhAIUjAj7gCjlhQhagQSXASuGGpeICFKBCciGLk+GB08Fbix7aW6EAI2BFeWBEGoBdY8AZoILxoQQD4gMJYYAXYAI8IkA14EoloQAgQFliAAXgBswAXaAAnaIABKAEFuHAA2LAx+GIMSAAgGGBEeEG0iMLxiCFNmDBHQEZX09bIcILYAA3ogAGwEsjQDqgAApjANQAW6SA1ABYYoCbAJjKYoADwFsiwAPgQ45hQWBAV+WAnKEMKOOMA8BOocR3oAAjAFpgwF0iwRthwmOASuGEpaACJiCDYmBCDiBAAkBboAB+IYKloEaP4IK7gF9hQAwgB7vAihphwprhy+FgQ3AhgAQggqTgAwPgBmahAFvgSN+iQIBhxK0ghClhTBbAXiDAKkDYSxBhAAJggLkBFJlLEKBAvCMEYMBRIMj1YAEXIMBywFvghVCAXOABa2AABACZmmAE6uBA3eCBFwBLpEGQgEpgQA7hBRUgDKqCS5pbml0TW9kdYEONIEmCYAAQ4UQzZMAQYAkSoABGY8AF4IATo4AF4AC55AHKoMALZAAGYYSwgZ7aGlnaFeABAkIck1hcms6MX2CIdCFAmyAJ/SAASgDayh7gwEdAXCAAa2NKPmCFhkBeIMB3wJCZYEBqwM7R2WAAjqBBJoBIoEAMQMiLG2DNBMESWQ6QoAIBoEBboAAKoAKcRMlci5NQVhfU0FGRV9JTlRFR0VShAfNgga1gAtLAWSAEI4DOml9hBkXAXSBCueGDIiBCRWAAUqBBUqALbMBfYEMpwFmgAC7AXeENFODALsBYoUAu4EAF4IB0oMC4IUFTIcW24AW1gI7QYYAx4ACsoYAxgNUZSyDAJABZakAyoUWcYMAmoMVswFDgRPwBG4pO1KDAoABQYEk8QZDb250cm+AJYsBcoQA/IIEGQhsOmx9PVJlO4MARQFvigPKAXOLA9mBAEoBX4EDLoYIUYARu4IAIQFvgBj/hgBPASyAAgEBdoAR2wFDgQExATqAJqaEABCCAIWAABCAAM+EFmSBCB2BNZmABAEBKYUBYIkAnIIEtQFhiAS1AmMshwUsgQk0AXOHAgIBeoAGMANlc3WAE3ejADyAA62DB7iAAaqJBYOAHZwBSYISO4cHeIAAZIMBz4QCLgF0hAOQAXSBGVmGBGeBA4aFEvSCBIeDNHmALp2CCRIBLIAytwEsgDH/ggAWgA2egwORgTTwgw8ggQAKgggbggAKhwB9gQCNggBWgAYQBlVua25vd4AH+oEQsAIiKYUF/IQCLIAEMYAHdwJja4ER14AHs4AC1YImMAFviQD4gBfuBWU7ZCh7ggBCATqrADqAATIEYWRkRYEBywNMaXOABdWAAbcBIoQAQgQiLCh7gQh1gAZ+hhkmgwGYAXSIAssBcoQC34cDbwFlgglUgAFHgDC2gAgygTC1AiYmggURgAWyAj1UhgQCgDDAgw4YgApagAAKAmRlgAGOgQ5ZASyAAf+EAFSCAXmAA62EAFuCGzEBIoAA1YEAVIcAR4ADeYQAR4AACokARwIpfYAAcQF6gAhHAVKADpqBAqqAABKGAiGEAhIGKTt2YXJ7iDjkAlplijjlAlVliTjYAlZljjiZAk1lgzkxAlBlhDkyA0tlLIMALQFFgAe3B2dsb2JhbFSBCXUCTmWCJ7yAMq0CMTiAFhsGOCw3LDksgAAQCDAsNSwxMSw0gSfjATOAD1UBLIAn6oAADQMsMTWAJ++DAigBWoIjtwFXgwANAVWCAA0BaoAATosvQoUlFQFqgApFggbYASyAIG0EZT84OoA3WIUAFIATdYIA8QIgSI4APwExhSIhAUiLAEADNDoygwAzAUyGAH+AI80BMYAApoAzgYAAwIQom4MolAcsNDgsNjQsgBDwAjEygAAZATmAM44DNTYsgDj5ASyBM8ACNzaAABSAM36AANsBM4AAMQEwgAAtAzMwN4AANQEwgAAxBjYxNDQsOIEAMwQxMjI4gAApATaBADcEMjQ1N4Av4wIsT5EAfQE1gAB/ATeBAIGBFEyCATWBAFaBAIqAAH2BAI0BMIEAkIAAgYAAkwI4MIIAloEAKIEAmgE2gAAzgQCegAAsgBFnhyooASSIDFiFOEABaYQYgIIH8YAG4QIgaYACeANhbmOBFx4DWmU/gwKogAGjhQ0pgAQogSlYA09mZoAGEIQADQFMhAi4A2Y9cowAP4AWboUUvIADpAMraSmFAE+FOQaAEdOHAE8BK4EAmIELqoAC8QFmgR5DhgC6AXGGFpgBMIAVOYEPgbgAqAQpLmZpgAeugCyOgDauiRbUAUaAA1aEDK0Ge29lOlFlgBjVgDb1gAYVATCAELKAAAUBYYIAFQFjgQALgAPCAzAsd4EABQFogAfOASKAEzuAAAuABD8DMCxrgQAFA2JlOoMyq4gFlwFYihfMgCO3AXSEEgIBe4AMg4EHQoYBHYEOyoAEfYIE6QFTgQBPAVSBAAWABNUDMCxDgAAFiABUAVmHB7qJAvSONt4CPTKEI2mCJy6AEvaAAAeAIweKAyUBaYQDJIY29YUN04QCnYABkYEDKwJKZZok/AFfgBDRgyS0gApVhCT+gApWgTIsAmV0kwA6hQKSggAsgAgChABAgAhEhABAAUSAKp+DAAoBR4ADK4MACgVJZT1pfYAxsoUBCgF0iSmkBEF0Wy2CM2kGZT4yPzk6gDP2gCIJAiIiiB2KhDtFgg8iAi5ogABqgQuMhAVBgAJnggAUBSJ6bGligwa9DyAiK3QrIiAoIityKyIpIoUBGogZqoEaG4gZqoATxYI8uooBYoAdmIIBYoI4agMxfDGAMsIBcoM9NIUBaogav4QAUIAu/IE5hgFVgAA4gT1WhxoahTwHgQAIgirNgAn4ggAUgRRAgSX0iALaAWaCABmGJW6CJgyAFKgBPYQzU4IK2gJWZYAfygFNiBpjgAB4gBVHgQArgBPpggAOgAIyAT2BFP6DJlOEABSANCyAFdqAADoDKz0zgABTBGktMSaCAFeAABQES2VbVoEWTwMrdnSAADsCLlCBK98FZS5FZVuAGQQCaSmGABECTWWBKZYBTogQOoEvWYcBTYIA3oENFpIApIAWw4E8jYEACoEAoIYADIAAmIEEBoMAmIIAjIAqFJYAcgFsiQI/gAj2A2UteYgBbYI7WocVhIACWwI/TYE2DQE6gAAGgAAPgjRsAjcpiBX1AWOCADGDA5gEcHQrN4AWdoED8YAAxQEogQAIASmAIhIDaT1QgBzGgjWygDs9AWuBPP8CL2uAAcWAM5iAJ2ACK3CGBB4DLi4uggQ7BDE1KSyCBCoFUWU6NDKABzKABA8BaoUEaAssSGU6MzI3NjcsTIEENgFPgQRAASSBCLoBcYAIXQIsRoMEXIADxYEAJAQ4KSxYhgARgARtAVmBCTsBWoYEf4QAIwFKgQBggA9PggAPAixVgQAOAnR0gAAFgAsUgALagQAFAWmBAAUBb4EABQNmdDqAKwoBc4EAC4AK0QIwLIBBdIAFI4EABQF3gQAFAWiBAAUBZIEABQFrgQAFAWKBAAUBeYEABQF2gQAFAWeBAAUBU4EABQFUgQAFAXqALdiAAIkCVmWAHoUBZ4ACOAMpLEODABKAAJuFABIBX4MAEoAAvwFDggAQAU2BAJ4BToEABQJ4dIEFowFWgQALAUGBAE4BUoEABQZCdDo4LESFAMsBR4EAEwFJgQAFAVqBAAUBS4MA+QRFZSh6gDJVgwYbBikubWFwKII2fwJ7UIEATAFVgQAqAVaBAAUBTYAABYET2QFFhgA3AzIqU4EAhacAOwFQgwC+ggA7AVSrADsES3Q6aIEYbQFFhAAIAU6DAAiJGneIAnqwBhKAAn8Bd4AAUYAHhgFVgAwdByxvLk10PWmFOdwBb4YGE4gDHIEAL4UHNpEAtogaQocAKoIGVAFKgAjxgC1PgRYSgBEBgR0egAG7gi1KihnbhQDRghPZgALcgwDDgBxcgT/9hThOgANMBG1heCiAAyyBQZGCCVCAAWCJAV2HGl4BIIE8ZQIpdIFACoAwGgNdKyuDHHyFADWGG/KFADqAAR2QAFCCOCOHBd4BMYE/r4QshgM9byuAMTCAMXSABeaAOTKALI2HLv+DGtyGAYmBGtyFBjSBNaCECOABboE1vAFpgAGZgAAfhAF0gwD/AW6FAP+AODeBIC2EHN6AAwqHQSiDHKuFAHGOOMqGMhgBcoAF4IA4OoEutoMACgI7boArA4AGZwJlP4AGzgFmgBCygQPqhAATjAgNgAgegQgNBHB0PTiAA9WABWIBYoAa3AI1OIAD1wI9YoEEzgQrMSxtgQALgAPjgAAYATaAA+UBPYEGBQMrMjmAA+sBPYA6jAVUdD0xOYAD7QE9gwPUgAPlgDasgAPZggAuA3h0PYAFIgFBgALCAyJuZYAURAFkgEXcgAIMBWFyeSIsgT4wgAycASCAE6WAAA2AAAOAAZCAE7aCDmOHAB2EAA+BDeSGAA2ACjOAChwDaWNpgA4SgBlrgD34gQBPgwowhgAlgDSUA1J0PYAJWAFqgAFdAUKCAAoBSIAACgFEgw8rgAD6BTE5KTtEgB5xATaABxyAABeAP7QBXYAA/4EACQQ4XT03ggxOA0d0PYACtoIDyoQBa4UD8AI4OJACkIIMoQMzPj2DKP2BAgeAQMmHAB6ADDyBLbeKACABOYgAIIABMQI7MoE8Y4gAIAE3iQAgATiAMlcCODeMAGCIJfiBOluCALKEAKYBM4AEioIApQE1gAAaAVqAIN4DdChHgAaZgAQRgAAKAUmAAAoCVnSHJnKFBF2LHmeHRbCFAm+AJw2AB6sBP4EG/oAACAE6gDz4gALxgAgbgAgwgD8ZgQL0AXKANQMBfYACRIQADYAACoRCC4UOJ4AEoIsuAANyPj2DQhiWBOaEAH2AQCGAA0yDAH0BcoEAfYATEIAACYIY84A0UIA1CwQrby0xgABOAil7gALwgAg5AjtigAJHAWuGGNWAGcsDKE9lgAIZgAZrgAD8hwR3hACagA4BgjzdhkMtigEPgQgxAW6CAQqBAPuAQrABcoBDWYAAh4EBAIgAKYEByIAA0oMAKoQBWIA7oAE3gCDegghkAnI+gAIGAT+AAAQDOnIpgTL2AW6ACHCGBH+AM3IBO4AAhoQKYYAN2YEIn4EoJoQ+uIAEjYgkfwEpgAKd0wHA/wGxhgGxAUyAFr+AICWHDCMBUIoJ5AElgAqmAjIxgQuohwZsAUuGCyiAAGmGRZIDdHx8hgAMAXKFJ7ABMYQCnIEL6oAxb4IK84EAnwJlJoMLVgIsMYcALQEogRlfgSDzAT6BABwCMjGBDsEBLYMAC4AFwYAZ/AIsbocAGgFuhgAaASiBDCYDNnxlgSASgkX0gEA9gACbiwFRgwFQgQBFgQBkAWmGIFYBZZIAbAE9gAEEgBJ0igBaggJGgQGbATWAACUBO4ABIQEtgwAKgwBkhgqlgCERBCk7ZG+GAH+BAbuBAJGDRTyEAICAAaOANv6JQtAEKX13aIAFoQMoLS2AD9wBZYEAgIIGtYIAiIES84QA0YEAgAIxNoMAfoAACK4AZZwBFY0AeYUngIkBB4EFugFFgQTajwW3AjU2iwWvgQPSgwVOhANAh0qyiUsogAv1AyZyP4dLIgFegQ3uAjE6ggAGATuCBYiBAAuIQAqABYyHAq8BToAAsoAMz4UCj4AdqoQAKAIwO4cCj4IDeIgn6oIJCQFpgSldhwAVAWWAIqiCAkOJA+QBcoQEk4APb4JLSQFFgQRmgEtKAWWCJAuAS0qEASOHIlYBXoUCL4UAoQFRggNQAjE2gQ1MAUOAGqGCDpMCZS6AF2eCAAaCDYsBQ4AAB4BNtIAACAM+PTiAAK2CDqOHACSADv2ANEuAAB4CLT2JIvQBV4IAWoIANgI4P4cAV4MASIAJt4oARoAIJ4BAyoIARQMxJjeMAHyHAFQBaoYD3IIARgMxNi2ANPmCACyDDwaCAAwBfIFEK4AAH4AJ3owAzYI6VYAu4wJDZYYO3wFDgTUMgEOmgCDZlwBIhAAniADdAUiCAN2NChABS4oKE4IOsAF0gQ6wiAWbhQArAUWMACuAD1GVACsBUIYl8IMAKwJQdIYAK4IAYwFfgwAOATGAAKcBcoE/dgFugTYXgg8gAWWALC+JAT8BTIYBP4UmG4AAIwF6gAj2gUfhggAIgwAQCWUuSXQtLV0sJIMAMIAEdYgmRAFPhABFiUXmgwCRATyED5+AEbOEAKKDOdgBUIAW4oELDQE8gDWXAXKID2GEAF+GENKCAHyCDMiANp6DB3+ASv6AABcBSYFL7YFLCIEACYAAgIEUDYAAK4E2BYQACoJIogF0gB/ugAQ0AiwhggAjgRDRiAAbASmBRsaCAGCDAGiAABgBcoANFgFpgEpygAPIhAAaiBG8AXGJEL+DIcaAA6QBX4AUUIAAB4AYD4AdWQFzgwAKAkdlgC4dhAgvgQCjgxC/A3Q9eoAA24ABpAFzhAT6gAwWAW+DAQ6CArMDdFsrgBEIAUmABECARduCAKOBAIGAA2iCACWACKKDAgkBO4AID4AAJgI7KYFL0ogANQcyPmw/KytsgQ+9gADLhQIAgABFgAdJgQCAgEBsAS2BI2uAAGsBboBMfgFmgQAlAU2EN3uASLCAMAaDBGiFSAkDSXQvgBdHgQXBAjtygD29ggGbAW+BLreAMAeBBjICcj2CAj2BABOCEcaIAjYBLYADUgFagQUIiwAPgA55hACahAD3gEbmAW6BAAiGAKiBA/CBAPaBA2aCCJmEAAiBBCOBABiAJ7eAAESAADyACqyCADyAAAiBEseDAqqBAeqEAKeAPcaDBqGBAMgBPoAPFoMB0YUAioUArosJMIMB1IAmcoA9wYMB2gFhgAAHAUGDMbeDAeGAJtiBAAqAHTIBd4MACgJEZYA7Y4IACgJJZYAmZ4MBo4ENnQFDgAB3AW+CDZgDZS5fgQ2KhQPIgANMggNRgACIgwHWggpjAVqADS4DO3p0hQcUhgL6BW89bFtsgwDqgQAugQEAAT6BIfMBb4A7MAFkgAAqASyCAB2AAEcDbyxhgApmggHfggBvgT90gVFnAz49d4Ii8gV1W24td4AYlwFzgABRhQF1CnJ0Kz1zKihvK2aAMAaEAhqCABIBY4MAVYAAGIMs8IACqoArtYQIJ4AAe4AC3IEZaoMAagU7KW8tLYABYIIADYACZIMACoADioAQjoMADQFogQAXBGQtPTKEAZUCZD6EDSmAAEuBDxyAASiAAmKBABGBAPmDAFWAABcBboYC5AItLYABC4AA4IEoGAFsgwK5gAA2ggCygQDEAyhvLYQAFgIpKoIACYAA3oQAEYAKvgIsboAAXYIPWIEe54IB84MxqoIEZIIDx4AQsYE/cYMAggExggG8gwdIgDiDgA/1gDXrgg/1gQJzAT2AQYWAACeDTsCECviFO6ODAHOBALuDUIyAAA+BEXABdIA4uoEQkYAAf4IAiAFvgAfGgAJWgQDqiRioiwT8ggCYgA8vgQ/HgEXbAU2AHR2AAc8DbD03gAKVgz4egAGCgQPPgEdWAjM4gAAVATOCPyaBFZKAAPaDBs2DCBKEAMsBaYNKJIIVUIEATwYoKytzPj2AKN0BaYA5SIElFgNhPnOAA3CABkyCAUGAAggBOoAAyQFpgCKiggFriAAagRVsgAANgA8sggAOBik6cz4xMIMAO4APLoIAFIADsYEADgE3hAAwgQC7AW+AA6qBALOBNtWFALICOmmEABEBNoMAD4AACoIA4IkSKgFYjQEYgQEWgQxKgwEWgQLlAXOAADYBbIABFoAAX4IqD4IAYAFsgABRhgc6gUhcgAEKAWGCSFaBNkiAAzCBAEQBYYQBDQQrK2Y+gUFnAW6AAOyCCZgEbD5mKYAC8IIIX4IAzIADEQFVgQZmgwALgAJqhALMgAEkAy0tZoQfNYECtQI/KIAARYECqZgAPIJDDwEshwAhgQFLhQAigQAMgQAjggAeAmYtgB1dgCP9AWaBAWKIAFKBAWiGADGAAAyIADGAHZmAQlABOokALYABh4YALYAADIoAXgEzgQ1MgAFEgBMOgQGfAm8/iAE/AjpuhAARATaDAA+AAAqCAWmJFJoBWYYH/YESoAEpgwEyATCAG/WAApCCCfGDCXSABiWCAAgBfoFMMIJTrIEcuIAX1IAAl4AesYAqE4EAI4IZEoBVJoYAXgFKjwMVgQWggRrYggSWgQjVgQGohD8JBS54dFtzgBR9gAQThwAQgAHjgEsNATiBFQ2DABCAPhaAJ5sBM4EA7wJuP4MKQYMDq4MACIABHwE6gASagBjkgAgShAAfAW+EGO2CACSFAA2CAckCPVKBBK8BLIAAjIEDjQRpLT1PgRlhgwA4gTbQggR/gAJsgBhtgA2jggAXgROigQBKggAIgwBFAUKJAEWADiwBTIcARYA8yoAFhoQCbgFzgAcagADyATuEAJeBCemCAJOBAAmBApSBDO4KZXI9W3tRdDptcoABgYEYToEABQFIgQAFAUyBFboBLIEAHAF2ggAcATSBABwBNIEAHAE4gQAcATSJABwBNYEAHAE1gQAcgB6jgAAdATiJAB0BNoEAHYAAGIAAHoAetYAAHgIzMoMAHwFnjABYgwA8AjE2iQAegAAUgAAfATiHAB+LAD2DAB+JAF2AHv+JACGAABWAACGAAAaBAEGAHxqAACKADbqKAEOAABaBAESAAAeAACSBFHuBAEaAH8eJACWBFNiAACWBAAeCACWDAQOAH9gBfYARv4YcgIIoJIUaIwIqZYA9/QI+NIAcfIA5Y4ccdoQc74UAKIJOvgVlLnFlXoBOpQNlLiSNDWEBboQdWYAwM4A9ZoEADYEACoAABQFtgAslAisogho0gBHXhBY/Ai5GgAAWgABHAUiBRiGAGjOACDoBa4AWUoYa1IUAEoAdVogDOAFpggC4hAAeAU+BEiiAA+OBH3CAABKAF4uAAAiBABUBKYAWXQFYgAjOEFlURVNfUEVSX0VMRU1FTlSIAN2IKSWBA+SAAIMBdoNGp4EMWAFPgCM5gA6BASmBClqBAKuAAG6ARSOEAAiCExIEMDpyLYNV9YAHCIsALYEA2IEALYIACIcALYgc34YeR4USrIEmr4UA+gJpPoEI7YAEtoAz4oAg8YAAPYAA1QFzgA5yAWmAGyKBKyiAAFsBb4EBWwFmgAOIgDH6gQivBGJlLleAIFaAOpABPYESFIAACIIYqIAS1IYlIIAACYcguoAdTYEpfAE6gFgfhAA9gghzgAA/gQ/GpQA/gjjYgATXgQqpAWyCAAiAOmyHHRWRAWGABNKCUAyACmABdIAKswFjgQAFgDntgADpgAU8ggl6AWyABUKCAAkDY3Q/gBRRgFDqggAcgAuqgQBmgQjAASuCHP2AALGCBWkBbYEB94IAB4AhswEtggVrAUeADAaBDRMBbIQACAFzhAAIAW+CPGmCCMKAAAyCAGyABb2BAKcBLIAaYYMBcANlLnmBAW4BKYIToIImhgE9gQGvgAAWgwBlgQA1gAyYAWOBAxeAAA0BY4AJpYEC4oAACIIAYAE9gB0ThQk1gQCAgQAVhA0ugAMUgwMKgQIckQMhgRTzgQAwggCgkQAhgQNBgk6xkgM6gwKfhQMzgA9AggDyggE3iQCeBDspO32GDEMEY3Q8eYEBcIEGcIMA+IIUFAIuU4AO4YABooYBv4IAzYIA94AAooAAHYAQi4EAzoABxIACGgI+bYEAswN0PW2AAU6CA4qAASeCNqGBACsDPXIrgAZ2gwA1ASuEACmBAAmAARoBU4Ef/YQCCQFTgQKBhABTgQAOhwBKgwAogwBNgAFsiQeiAWyCAmKBCPWAG42AAbuEEnEBIYMu84EATgFihQNWASGAFRUBdIAA44AA6YBLjgEygArIAi5RgABzAjU3hQAKAjY5hQAKAjczhQAKAjkxhQAKAjEwhgAVAjExhgALAjY2gE0QgQALiB96hAUDhSDbgB6ZiCDyiB9xiQMdgwCpghenghKkgT7cgSehAXKCCEGAASMBdYUBHgF1gAEZhAuFggL9AWGBASABY4E2aoAIcANyLnSAAfiCApaBASqCABCDAp4Bd4IAEIEAPwEtggAYAVWCAAiBA3WAAAuCL2cBdIEAbgFKgS/Chx2ahADLhQWvgQFMAi5qgAAvgQAGAi5PgwKnjwQygQCLhyUuAkplgEeRggBxgT/5gwAIiABkAXeJAGSCBCSAAGaBCqWBAR+AAbICPjWBVCuGFEqCIwcBLYAO9IEUYIEA/oAAHoECuwFzgACWgAAQAW+AABCAAZSACP2CAZ+ASz6SADqCA+aAAUqKABsBNYM6/4AAOwFmgBFQgAAFgQEhgAr1gACzggJjggGxgwQhhwA7ggAoAXiAACmDKmSFAFyBAI+AB2AEdCk8PYAAB4AHLJAAi4MAcIgAroQAyZEAJgE0gAWnhAAlgQAJggWtgQAQAT2AAowCKSyFAB6HAk8BOIBVKYAphwItOIBNN4EKIYMExwNuLnmBEDEDfHwygF3pAmJ0gAZYgBnngQAJAjE6ggCFgAAKBjI6MyxyfIFJOgE2gwD9ggUtgAASgF3SgQUjBTMxLXIlgF02gALmgDTjggKLhAAkggASgQIHglbFgwAhhFbbgAAVggYqgAIrATGAAVqDALeAYmuCAVCEAWKOAVCAALICNTeEANiCBJKDAmmBHt2BMH0BM4ATqIIACQMxMzmEAAqAA2oBboACmQEpggANgAEAgAKkASSBANwBMIBXW4IADgFPgQDgggAOggQuggAUAXGBAQcBNIsAFAFGgQAUATiLABQBWIEAFIFaC4MAbIEDzoIAGAFZgyTGgAZ6gwAOhiTMjQAWg0rijgAXAjI0iAAXATmGAYaNAasBNIAAuIwAegFKgTMRgAChgQFBggDJgxatiAAigVjBhwBvAWWBF7uDAJyDASmRA8KBBEaCAZCBACOAHleBYKOAAbACNjmDDgWBGs6BAFGFAI2dAAikANGBAG2iAhaCAzKCAFWBAu6CRTWBBJCKAQeFB36BAEGBRGqDAoWFAREBLYEA14MUbYEAIQErgBhWAi5lgBRyhAmHgQANgAAjAVWCBISABWGGARGDATIBcYEEGgFSgUtgggAVggAvASyEBSeCABqBCQOcAMOCExeACcwBfZcAX4EUd4MOL4oAXYAW3oIBKAI3M4EDHgI3M48BCIMCvoYACYZFVIUEGIIA2oMJgoIAwIIAwYIAQYIAaIAAeJwAvYAV5IAtx4QAX4BbwYAA8oBOfIIByIkQN4AIZYUAUYkAuQI5MYEAuQE5gAnQkQC5AViFALkBWNsAuQFYogC5gwCygAf3gQCzgAAHkwC0AU+DAIWCAa6BAtoBZYEDU4sAi5ACxYUDpoIFGoMAhYMFOoUEPIcE7oEAfqgFM4QGRIIHFoAyR4AI9IMILYIIqYcGJIABDoQDmgFtgQWogAmgggZDAXmAT2eLH2cBIYQYmoADIYUG3AFjgQDjggvbgwcNAWOAB9CEAB2IG/GDHt6CBbkBdYMWCYIpI4IKyIEKS4IKxoAL/YML1IAKq4QRCAN0PWuBAYCAOsmCSRSCA9mGAFeAYqyCAFKAC7uALk2IAHCDADQFMCk/PzODCr+AEEmhAE+FHxuACXCCAQaCAeaOAQaDFz2JAQmCCziAJC2CAA2DAQyFABOCB6OIAQmHATeDDFKIARSBABWBC5KCOVqCJd6ADfWCDDWAByeDDCuAEaeAEqkCKyuAE3WLAAiAAXSCV64EdCtidIEDGYQCw5MALacACAJvPoEe9YEAnwNidC2AFnyABOmBAA6ACoKCAfeCABqCAMyFAMcCPGuAAS6dAd2CHHCADeWEAAUBdYED0oIr4oEZxwN1dC2BKkaCADGBCVyDACeBOmCCAAuBASqACHv/Ah6ADMSAFy+AAzQCXS6AC6SBABGBADUBKIADOYBe14ACOYEJ5oMDq4ADbYIDHIAAGIEAHoYCDIMKO4IAJoIDs4AAJYIhJYMfFoAAB4ABS4EMA4ITAoAxVYQTVAFahhMNhAAKgRNYhQwngFL3ATWDDA+AFK6AB+qBKJWBKJABLIAAkoIIEoAD4IIAjYEEDoIAewFsgwfWAXODAAeBAS2BPtGLCt6PBFyEABGBCseACQmBCoMBPoAVtoIENoAQeIcIeZYE04kAE4oJDIQAFIoJCYMASgFshwBKAWyPAEqCABOMAEqCABSEAEqAAnWICpSGIvORCpuDAP2DANWCASSAM92ACAYBV4cFbYEJ/QEpgDlThyobhQ56ggyphAEwAS2DIoSDDniCX2MBUYYR1YBnLwJlPYAqLwF0gA+8Aj1XgQAIAViEAAgBWoQAGIAoRIIACIAoY4QsUINm04QAF4AoaoIAL4YfeIEha4cfW4IADoYfPoIADoA0loQtbAF0gA2HggATgA3mgQAHAVaBAA6ABlKBVUwCLTOAFTqHKr2LDZCCFloBU4MvcIADvII5loEZr4A15YAq2IIAFQE+ghGNgBJ7gAS4ggALgTJ4ghMFgBxdgRCjgBxaggQagBX2AXeEAAqBHswBaIUADIFb7IAcYIUADoAi/IAAZIAqmwIudoICwYAhcoFS1IUEg4EAfIAEgIYSSIQRHAFygAA5gBvKgB+OhAAOgABVAiE9gGxlgwAQgAAMAXWGAByBABoCdymAMdQEdGludYM/cIIkN4Eih4AqAYIAYIAA3QEyhB+VAj5sgQWhggCdAmxdgQMhggBFAWyAHB2AYZyCBDmAHmABboAZVYMGGoApTIEBKYADjIAZd4QSRpYA7IURiYANnoBSOwImY4AlcoAAboIZeYdqtQFmggD8gWzigUzzh0WohAGrhBv3hBimhAa1hRhMgAKKgAZaggOqghHhAWSDE+iCAAqIKBiAAq2AFiAGMzYyNDQ0gymLgR+UATOAJrGCJDaBMfYCPTGBDYiAJCCEDqqFIfCLBuuEABoBOYMhG4UADwExgBrRigAQATOJADqDCGSAK2UEMjt2dIdTUpIAZoYyeoAuXoEDeQEsgiC7gAAogRJ7gwALAUWAAAsBc4gA3IIAXoIcg4EAT4IALIAcpIBS6IQAL4MANIIAE4QAQgFOgABCA3Q9VIAHiIJs04QUj4AaYwFOgQCOgh0JgAbdiWHNgAawAzE0K4Bc84Iv3oEosIEaHoAANYAAGgMzKzeAZ8mCAzyAHoSEAA6AafGCXheCAZeBIcyAGZeAGQ0BOoAABoATHgE1gB8LgAAHATSAEEYBP4kahoAbLoIat4MGIoMaioIaSAJadIAq7oYbGwE0gwAahgIZhQIVAWmCAQuDGWEBLYApgQEsgAUOgxm3gAhyhQAMBW4tNCw0hEo9hCaYhxtwgAEBAWmCAQGAAGABO4Icv4IBVIEX2AEshAAPgAFQgABPgk4ahQFsgB/bhAFjgAAKgBq1hAC1hAGPAUWBAceCJGQBLIAW+IIbWYQAPYQVboAUEAFzgBLYgAAMAXODQH+DFVuCBbeAAsqJSHuEAxOEAZmDAyKCEAOGFdoBdYBfiIEQBwE6gkCvgRpVAmJygx5UhxkbAXmLAEeACP+AN7CIMEKACzWOIy+BADSBDj2BJWgBdoAAy4MdvYQVVYYErgFigTTFgiViAjQygQIHhACTATyBbiaBABmCAA4BLYBUyoUWPYAA+YAOo4AVeYIASIInPYYADoAJF4Jlf4Aj24ACbYIq04MXR4EHpoJxX4AABgFygAbBhgAxASmEBJACZj2BCSCAE8mAB8CFAB2BAScBLIICbYQIRYAhOoY1zIBgzoIi84UAD4BpYoAEE4EnCoUAEoA0vgF+iQAigBmXAX6CACOFAaaBAd2AZ7+CMC2ACRWBGMuCAHqCFMKAAAiAFMWEAfKAAPSACLSEABWAF5eFASaDF8SAAAuBFM6DF9eBAAiAD02AAC+BAFiHF6iLAFiCF6mEAE6BAKSEAE6EAAuBAE6ADfCEDgSAH7aCCdkBc4EKjYIBGYBqhoIL54AXEYAB2YQWoQFsgAvtgklZghhkgQAagwDRhxiNggAUgxhigSTXAWmCC+cBaYUXlo8YiIQBEoQC9IMAm4IZ5oAACANmZS2ASPaBAMaBCxqATpuAADYBK4ECc4EAC4A1+4EAEIRG+IInB4cIiIMAPYIZeokAoIMAXIEAZoECrIEAV4MAxIYAj4BYtoQDZ4dU7IIYFIQAtoAX2IMA3IAg5IIo0oA75IAH+oIKi4ECf4QFNIQCtoIAYYEOmoEDjYIC6YQBRYMAiwJzZYECyIEAH4IH94MGo4EZtIYBRK0BY4BdZYYA0JEBa4A6O4YDUoQDeIEDUIEDTo4Z7YER7oMBeYEa54QBeYEAC4UBeYMYm5ABHIoD6wFphgQjA2ksYoEgNIcAR4MmZoUD8IADJQE9gEo0ASiAayWCDMaCB3CMAVGALlQBboEGNQFygQBFgQYZgARwgwPTiQAmgQPfhwPXhBmXgDMnhgVIgQMPhQOggkqthAHMgQHXgRUriEo6jBeoixAZhBpIjQ8Pghpang8OgV/Mhw8LgQThgxr3ggGpgzRfggEdA3I8PYUb+IIOF4IKq4FO+4QOiIAmW5sOh4YUxIQCegFHhA6NAW6DDo2EAYKEABaPDpWCDwcBVIAFU4IA3IAAH44OqIAAB4Ub5IIAgIMAEIwbxoIANoIb6oMDr4AAawEtgQYghREIiAD/iSOIgQApgQ+bgQAlghIVqw8SggSygRw/ggupATqBAArLDySHTA30AiqBDDaFAY0BaIEACoQByYAALIAA7IUCSAF3gSxlAVSEEXOVAlMBLIA0vIEAEIAb7IMJoIUAIIIgwYMAa4ABTYECCoICFQF3gkSpgAtThBQOjAKIgh20gAb+ggiPgnRnggHqhAKchwiZhgD9gxpNgQBQgirpiAAuimM3hR2SgAKrggIZggD5ggCdigLTATGAAjyEABiKAtWAAA+BAF6AAAeABjCAAoGBK26BBteOAVuLAoeAAO2DAiKAAJ6BAY+FAWKEAKikApiDApkBZIIQk5EBL4MAX4EACOECvYEKBwFTgBs3AjUygERSgCSigjrYgAxBgUgRAyx6coAk+YlXK4ACBIcAIYALaAFDgCSWgURMAiw3gEQygEL0gA9bBV0sX3I9gEO8gQAnAVCAAlEBeIYADgFLgCxnAV+AVfmBOp+AQwqADtsBeIQADgExgD0khEPeA0FyPYAWXYUAPQFShgAOgQA9AUGEAC+AOjoBQ4IAHYkAD4IAPgFCgzpPgUOfgAAWAnpygBFPgUTkgVTCAUSNABuAJiuCABkCR3KBODkBQYAAUQFJggAKAVKAAAoBWooALQFUgF1+ggArAVWNABeBPKYEOSw0OYBESYAAHwFWggBAAV+AAEABTYIACgF4gACWhzTSjAtaAiUygAtagAFmATaINNOUACOAJSqGACQBRZAeNoIHboAjEoENdoAJ9IENb4AI44ELg4AKCoBO9IEG/oBcG4IxxIBA64BO6IExVoEAC4BOjQMudHKAEJ2AcxYBcoAQmIE+8gNuLm6AGi0BMYAPrIMADgFpggAOAXCAACMBdoMANQFrgAALAVODAAsBYoAACwFUgwALAXmAAAsCc3KAaOYBb4B3W4EFtIAE4QF2gDtegQQ/gAskATWAMe4BZ4AtzYMj0IANcgFTgANDAVSAAAQBeoAABIB4dQE7gH9tgyyKgHbVAj5jgwUzgTZAhRkRggULgFPYAmErgS7mgBjDBzw8YyxjKz2Dam4BcoAtCwRhJmhdhAVsAXqBafgBcoAsXYAPvQF6gF8rgAAFgQATAWGAAcmAR4qAUJCAEIOAOyqAVqWFNo6BD+ECNiaAABuAAAkBU4IAGQMseiaBOueAABOCAJYBepEAlQF7gGNkgDQ6ATaAAvqDAEiANBmPAKEEUys9YYAU5gM8PHqBAUqIAJWDNc+TAPCjAFuDAPwBd4AA/AFknwD8hgDhAVTMAOEBVJYA4YMEiwFTgAJpA28tbYEEigNUPnWFGYkDVC11giB4BT5rJiZ5hUPIhWvdAWSASgeBRjSAdQ4DbyBmgQ6sgUlwgBSqhACPATmGAI+DBy8BYoIAuwNDPXCAI5aALBSAAyKNQ86ABeUBKYQB+ANsW0OAAAeBTA+CEwiBUwmIAC0BcpIALYAGLIBXeIAAxwFUhiDxAnI+gAB2gABzAytiLYNj5IAj8gItYoIFiLcAgoESfgFlgBILgGnOjAAtgABYgQa+gQMugCMagAB7iQBgAWKVALWAgo+CALWCALaDASSAAK/eASSCAlMCdD6AOKWEACMBc4IAI4BwU5cADoF/PwE7ghTqiwAXAT6BORqKABSAB5qCAM+BAGaCAHDaAGuGBCICNjSBA0GUAqmBP/SSAqGBA6CBA3ACKyiHAyWARIGMAFaAAAkCMzKBAAmEAEIDMTkxhgBCiwByAWyCYh0CbC+DA6OZAHgBdZEAeIQI1AFngQ55A3Y+b4MqlANfPWOADaoBO4As6gFfgQO5AV+AcHqAV+qCBgIBY4ED1IEGYIIOBQFjgDPogQ1BAmU9gABBCT9nLWkrNTo1LYAtIwFnggyOgBd4BT5vP3YtgEZsAjU3gCuAATeBG0sBdoEYYoA3dYEEGYEZeoA37YAAbokrPgFOiiVwgUJqgBltgD9NAjY6gAAFATSNRV6ACR2CRV0CdXKAIpgBMYBLUgN3cjqAY0OCRWYBaIIACwJkcoFJ44EABQFrgQAFAWKBAAWASbWAGE4BeYIAC4EABQFxgS09AXSBhmkBcoEABQFugQAUAWmBAAUBdoEABQFngQAFAVOBAAUBVIEABQF6gQAjAUOAgSuFRZuAAIQBX4YAD4FALIBNbYVEKwFuhD+UgQl2h0QpAVGAUIqBCLWAAE4Bc4AApYBE64EACwFEgQAFAkdygBNkiDmtgAEOgQPkgh49gC9+hAD/AmFygAD0AWyAACuADrmAQ1OIOYOBADCAckKHACiACV+AACmAGIeAAF6IACkBaoIZu4Qs0YIaaoF6UQE0gFsKhRpjgjtlg3uPhAAQgIFmhRpZggotBEhyPXuAALCAAWUFSXI6QnKACSsDOkdygAkaAzpacoAJAQI6VoCHuAJyOoBM/gFQgAAGgBVoAUuBAOAERXI6NYBM5gFOggA3AVGBAP0DfSxMhABIgEXgA3I6RIIASAFJggBIAVWCAEgBTYIASIBCd4IASAE2gQBIgAKHggBJATSCAEmAZNWBAE+ISlcBT4ICRYVZjIEYBoMCUYF7KAFjgFqthHG/FixrLGIseSxtLHYsZyxTLFQseixDLF+AgvWFQjWAHMMBQYkADQlSPXM/THI6SHKDMnmBPOeADSaDevIBeIB6k4Q0ZIMyjoMyjQJ4W4AyhgFdgUSvgQAaBXc9aS5XgCLRgAduAjt1gBhOgg3xAXiAez8CO3WBF0yAA/oDdz51gAR4Anc9gGdHgAAbAXWFC6gDUi5RgCpuAlM9gAHhgT4SgABFgW+yAVODAAqAFGcBU4BoygFXgAP3gAMSgAEeggBsAWOANOoCdT6ANfiCAGOBdGqAAI+DABoBPoE2NAJ3PYBlkwFwgAAzgXu4hwDIgACEAXCBOSMDLHAtgAA3AWyAMLYCPnCFG9uCdwUBcIIcIIENsoB0rYAaU4Yb+YMAdwFBgQCPgTTKggBVgwBUAkFbgIEaAl09gAAHAl0rgQBUjgEmgRHdgAEngRgCAltBhQEyCF09YSk7c3dphFEfAmNhgTOCAzp6PYAF5wYsXz1SLk2ECbIBO4IAGgExgAAaAlIugAI5AUOAAAeAAoKBACIBUIUAIoBYfwFhgVO2gQAjgAJWgQAjgAKfgQAjAktygQV5AWKAALKAAJCAALYBY4AKiwFmgQGkAWiAcraAN/GACrqAAm4Ba4FJ3wF3gAq3AWuBhmGAAPuAAKoIUi5Ocj9rPj2ABBsEaz5TcoApqYEaYIgAGQJSLoACpQJrPoEAB4YeTYcQCANTPSSANyGBa1eAAosBZYQCewNSLkeADDQBeYEAbgNsLWSAC0OAAAkBaIALpwFtgQ6cBG0tPXmECF0BKIBzBwRkKSttgCXAgAIAAlQrgC0DgQUUAVOFBdOAAVABbYMB7IQATIAGQgQmeTspgHPBg3jKgAAhB3k/KGImPXmAANEBYoATzgIpOoIBBIAOvYAB2gItLYEBpoMd24EChYMBRYA5NQJbb4EBm4EBMgFsggJEA2ImZ4BlFQF2gwg/gAA5gH23gF4vA3cpLIAKCIIAuwJoPYEAyIACZoAADYACjgJoK4EAIoICWoAACwJdLIACTIAtiwFogAB2ggJ0gQCaAWuEADq7AWYCdj2AAJuDAx6BAc4CK3aAASGABQ4BaIEFDYGL4gM6VC2BABiDD4SAAQ0BYoI4n4IDYIAAsQEpgTfkAWKAAaWCANeAHVOHAOuCAOGBAikBd4kCKQFTgAtoAT2AaWyEAY+DAZ+FAZSFAdCKAYSTAYGFD46CALSAdMmCA9UBd4Age4c9Q44E24Bv4YIE3QFhgiwzgESlgD14AXOARKeAOJMGMTxzKWE9gAZFgSdugBgtgnFqhQq0gwArAT6DACuBHaeBABSCEe6AQ6CEMZGAABqBDbEBO4IARYE8U4IASIE754QJd4MAKIMAS4IASQItc5YALYA3poFpqIEdn4BYxwJyOoBS/ocGmwEpgC3uAS2AWEyEAQEBYYIGYgdxcixGcixYhkoaAjU0gBuVAVmAJZKABWiGNkOCBsqDHOWELuaAQ8+DLimADxEBIYBBg4gu9QF0gANhgSJogQlVAT6AWqmAIp+BAAaABuWACTCAAl2AWv6FACEBOIAtc4oAIQExgYXdiBYPAWWARCOFEWMCe1eBAMWBAYIBWYQjp4IBooIDg4JDDwE0gXk+gBUuAkNygB84gATbg0gsgkKUigAYg0gkgEf7gIIciQAYgx6RgAAYgEdqjwBIhQuNgAEhhELGAViASswBXYEBiYE90QRYcixxgT78AW6AAF+CHxmCALABaYBccIIACYBceQFzhQDCgQBOgAc/gj5cgBE1gFT3gQJlgDrMgHTMgRYvgStPAj1vgQL4gBNfgQAHgD04gCT7gQAKgQDoAjMyiwCfAzU7boAABIIHfIMAJQFhhQB7AWOEAHuAXh2AAuQCbCyAAHWBPE+AAHWANfuBB6eCAHSCFqOBcZCAAL+EXTCAA2eBAgMBMYALDAN0cj2AAiOAHlMDcj05gAAHA3JyPYACL4AY/gJyPYEcgoAAmIEAXIICSgJ0boNSxoZeKQJLZYpS0YVgmQIiToFKuoKIXYJZ1YBfBIgIWIFGFYwc9IMDgpMIWIVHUoBW74ACGYICqYACYoMvsoIvqY0u8IAjPIE7S4MGioERn4FSjoAKq4AeiIAR04FU24Q+T4AC2YICw4EwvAF1gkRPhQwrgBNMAXqATmMBdYAbIQF3gAFWAXmBDc+AUy+EBnaEB06BAC6EB1GCAukBOoMPOgFygSPugGm8hQBLhxERAUGCCP8BMoAw9YEvdwQzNTYxgHh3AWGCeD0BcoAvZIIAgQFngAp6gBHOBHIua3KELqWCAAsBU4AAGwFrgAH4gAsmgYHqhABdATiEDNOCFtKCKkuCAAcDLmpygAdvASmAA7aAIWSBAI6AGgMEKFIoOIEKfoAujIAMNwM4KSmAL3yHDXsEY29ycoCSLoBo6QFhgG9dASCCbGsBIoUAZ4YNBIEAZ4B/rwFSgAGLhQA7gFxdglrniF5MgExfA3Rob4BMoZEAPwFCgAA8gBLmgQBDASuAFEqLAPkBYoAAGwI+MYAxpwJiPoEAEI0OGgJ3aYCBxICHVYFhVY8AXYAUvYJSaQFigXK0gxffgCr6ggE9gDbHggFIgAAygEooAyZhP4EBOwE5gQzsAjkxgQFQigkBgQFWgQHKgwGtggBMAmEsgAD2ggvggQAPtgD8BTU3MzQ0gwBDjABChAF3gGN8AmdzgGAZAXSSAN+HAd8BJIAj44EMYYAB44EA0IEAUoAdK4QCV4ICKYcCMIwCMQEyhwDmAzI6QYANeIEAHIcAWgFZgABalwBVAVSUAFUBM4cAVQEzgABVgwE4hwBVgAzigQE8AWGCABWAMG2CAL2vALsBNIcAZgE0gjqoggA+AT+GAakBeYEBqYkAeIA745gAzYsAZwIpOokAOgFxgScpiAB7ATWHAHsBNYECHIYAfoAAMQFogAJkAXmACMABPoEfxIB+SYBt9oQAR4Q03oExT4IACQFMgQAvAWKAAC+CAJwBLYEANwEpgGvqhAAagB6RhAAvgAT3gQUVgEi+lQC8gAQZggC9gBYihRhMgDkwASuAADKBaAuAIHABaIEetwFoggEVgAANgwEehgnYAXaBhj2BAS+ABQaFAOIBNocA4gE2gQDigVvFhAKrgwTWAXOJAD6AKBWBC0uAFq6AFLiACniACKSINc6BOWKAAF+DANuBAA6DANmAL+aBABeBBtABYoUaCQFigGieAT6AZBKBAx68AOwBYogAoYMJKYkB0gFGggHSjgD3ATeHAPcBN4EA94E82rQA9wEkigD3gQAOgwB6gDAk9wD3AViFAPeEAPABOIcA8AE4gQDwhQB+ggDvgwNJhQCHAWGABPODKtuBAIiGBPWFBiIDcmMggJf3AW2BWjWQBK6AA1KKBLIBT4E4EwFkgCPFAjkmgJSIhAajgm5dhQWkhQbsixOshwCvATmEBK6HADKAEX2MBw8BOYBomIQAMAE5ggeOBCFyLmiGLTUBQ4AAKoGKbpAGFoMAcoYAPIIGAIAHm4AK84A2zoYb5oECA4YAJAEygQAkAXKAZFkDKXtEhwCDAzIwNoQBAoQIJIAAtYEAHQF3gAlrAiFSgRB1AUKBAAUCUiiAQq+FD4uGAIIBM4sPiYEW94BMzYgAo4BgV4gAjwFCgABFASyBAJSIADYBMocAToQAiYMAGAEzgDs2iQdLg4PngWH1iQG9gJCJgBw2iwF5AjkzgQCJgQDjgwGAhAIUAWGADcaBCEmAC9KChQ2ALSWMB64Bc4AKEYAKBYMAaoMVWwFzkwcYggOVhABXiwHQgGCIlQGAATSHAOqHBZ4BOYIFnoUFkoIC1YkFmIErEYAAC4AK+4AD2oaYKIEAV4AFfYEKhIQFd4cDXgFsgQAKAWaIBUuGB46UAqgBOYIFPoADSoAI54AIxAFygAjqAjUpgRW8gAH5ggnXgB4cggATgHiigwARAXaBABGACQ4BNIAAEYQANQQ+Mjg2gArcAXKCDUWBADMBPoBUl4MBX4EAFAI/IoEZxARtYW55hAFYgGz8jAASgECShxdJBnN5bWJvbJEBfQFygB10iAUPATmHBQ8DOTc6ggrtgQAigATSAXaADI+EAsuADJSAKbuBABiABNMBXYAAvIAAFgFCgAAFgw1aAjE5gAm7AVSAAC6OACmAEqeAHiaAAMEBQYE7zIAMdIBsKoEABYAeOgFygQx7ATeEh2aBDNCBABYBfYAL+oMADAFugAAMAUeIDhwCeT2ADOaBALaADOaAFNEBdYAUewFygQzmAUeAAAeBDOaCAGgBdYINTIEAWQFtgQAKjhsQgRfmhQKXlglziwEehwU9Ajk4igEeAmdygJKFAVOAAPWDDCEBcIAA1gR0cltSgALZgB36gBGfgBDXgRwMAXiBDkaCUsqAj/UDcilCgI/8AWyCAK+BDeeDAScBPYEAGoZudoFQX4IAK4MFnoEAL4GBlYUAOYILPgFUhgpNhgPcgGevhAIGBXJlcGVhkQDbgQiGhAB2gS5HBGg9MyuBBJSAAFuAd2eCBkYBMYA7MoEAfIEJYIIAeYIB54MAeYES5IMAM4QB/IAsLoQAJoAelosAJgIxMYAAJ4IAFoBHcIN24YAA6gFogQvhgwE2sQC/ggFnAWiAIsSDAmeFAT0BYoISiIIAKYMN04dBeoIBLIAAK4AQKoATkpACCwItLYEG0AFzgH2BgVleBC1vZi2CBLqSAheHAseBDzOCArgBSYgCuAFaiAK4AVWFAriCArWBBvyAArWBAPwELEksWoMCtwFViQK3AUmGArcBWoAACoIAWwNWPVWBAAuCATuCAzcBeoBkW4RtBAFWgBTnjQDPixrPlwLdgA/gATaCAGEBTYIBG4cIaIIAn4cBoICPD4cA3AFLhAAMAWmAAAwBRYIADAFWhwOUAzIsTYIE4oB9/AFLgwDcAUWJANwBUIMA3IAAeAFLgwAKhAQAhADOkQDMhQTElQDGggEVkgceigYtATmFBi2BH3eEABaAAAuECCOBBWaAS+UBNoB/zoAyIYBZewF7gQgrgiIZgBWEgRAIjRAmgCMXgZjVhwKNggATATCdA/oBcIAgNYBAXQEogJqZASaBAAyABzSBAD0Daz1whQA6AWuCHF8DUihrgQNMAWuBACMCPj6BAAyAAEyCABOJAFEBQoIAJoEBXAFCgRTmgAAMgw9hhQRWgQAWgQAMgw0bgQPMgQQyggB4hRCeAzIwNYcBSYAdLoUAHYIA4I4JjYQdXIMAJaAdQ5ACdIANWYCZY4EAQocAHoYJeYAAC4ABqII+fgFBgAFCgD2AggC7ASuABmSDAA4BQoYAFoEA3IUADIAkiYIH8IYAUYYO5IAAC4MFqIEBXgFygwGYgCN+jgGYlgGSgAA00gGSlAFGjB77kAFAAW2EAcmTAUqGD4iAAAuPAUoBbZ4BSoQAR4YPaYAAC4QS1AFsiQNXggljAnctgFMKgABUgAzHgglngABFA21yLYAYq4AF2oFFgYAD1pcA4IsihI4A6IEARAFUgDgLAWiAIP+AAAmAGkGACIIFZS1oKTqBAAoBVIAACoIAZwF5hw9/iQndihXLgHI+giFYgZAWg2X7gSgcgBk0gE7MgAAEAWSDF4ADZD1mgA+PgEwLhg/NnwBNAW+JAEaICluCCjOECi6DB6OCAKiHBIGMC2KAA4SRAWWAAGSDJVKAAI8BbIFKDYwkOIcAP4IKcoMUdYIIJ4ELpgJ3LYAUtoMwkAF3gAA7AWKAAeUBd4YN2gF3hRdvgGpvhQX0A2Ytd4AxpogNHgFngw5/AXSABQOBAsWBFQaIDqGAEXgCYTqCDYGBIHiCf9KADiSOFE+CYIOVFE2DDiSEABWGCnqAAAuFANCBAkWGDpuBANaJDpuIe/KBAOCIDH+FAH2FBIyhAH+GCduAAAsBOoQBhoAacIINX4YAGoAGRoUAGoBQE4kAGwExgA3GgxZ7ATSGHSWFFoyAdGiFbpuBDdKJa70CdG6JAfKDdk+ISACAABWCJGCCDRIBdoAW7gF3gRbngTv3ggCOgAMChAaPgAwTggC6ggASgBTXgAIUggALgBX4gkYthAHvAXeCKEaCPGuDGv6GU9+CFwyDBQqBKN2CF1GBAAmEJraBMEKBOnSEF4mCKMaAFZ+AEJyAeCKIHC+DAseBKNiBK4yAAAeBFZCBACuAACqAeOuBIquAMNGBD3WAABaAMKyFXGqBA92BACKAJaiCbOGEM9SCKWiBABiBbK6FYF+CgH2AGuWASaIBP4NDV4IxxYoAIoJCLIAAcYERPoAAcYIAbAE6gAAqAVSAAw+EAIyHAKaBAJmBADCAMXeGABSBSh6BSMCCCwqSAGWBACuAADWCMXGIANyBABKKOFeAA4UBYYgr8oEj8AEtgjoYgXE2hgE7hQKIgG7xAS2Gm4wBdYEtWoA0NIADzIEBuIEtFoAAlwF1lwPXgi5bjAPAkAB/AXeEAH+BfkOCObyACf4BZYBhY4AQpQI/NoFFTQErgxvZgwjwAT+AKy6GABSEC1eAILKBD4KEACGAC1OBNxaBAfuAIXWAAAaAAImAAAYBeYMydIMADIEvF4ADNoFpxogv34IChodbD4IEV4FGQIIAFgE6hGCRgF6yhgAyAVOKK9ABbYEhvYNrIQFtgpFlhmufggBFAW2ALQOLJRYBVKQAPwFtgaAFh0dqgAAQgDalh0djhQBfATSMAF+ACiqCQUqALCWBLDOALDqBPNeAAbqBA2CALEGELFaCmL6BLEGACvyBPNmBAX+HAEWAA+6ABMoBYYMmFoAmHYEcNoAmBoEFzgFvgW4BhiY5gCYygHx+giYHgQxWgCYDhwBFgATcAXuBGv+AGvuHABWACKKGFNWHersEdG47c4AGX4AqhIIY4YFiUoAaJwFjgBD/ASuDKnmAAEaCKxmFAEcBQYVdwoADroMI+IcAHAFSiFIIgyckAWWAJu2HACCAob2AAJmBAFaAAPmAAteHABqAEmGDABkCNyaAKwQBLYEAB4glaAFugh4khABZghwCAj8tgDRVghyUAm9ughI8AzYsZoQcnYtvY4ADV4Al+YCGXYNvY4AdwYAnDoIAC4AdDYeYTINjjYQ9uoA694AVNIFktIMAM4RwFYRQxoAEGAFYgQBZgQBUhyplhQArhmUGgDJbgBw1gZnRgwBghAAhgWjpggbghHrdhk5qg5T9gABChKQvhF5AhAAdhXHjgWG/AmxlgAZ3gQERiwB0ATyEANaAO+qJALeBdQ2HHXwBc4gfboEAVAJmboAHWgEsgADLgTQugYZkhwF0ggBigXcpgHn5hQBzhHcLh2RsgABDAU2AddiFhySJhueCf8CCDWKHUMYBWYAeJIIDD4ABxYMx/YEGaoMGcIgClQJLZYF+i4F4dwFhgBcvAmQ6gHCDgSDVAT2Bci6AJ9mBAE6APNyBN1uBPpmCAo0DczxphV/vhQFyhAHOhQAYgDj4hG3fgJnchwUUgDkOgHMKggBFAWaBA2MBbICSHYADY4GSN4ADY4WPrgE7gQAOgVOZhQHOAS6AAgSBH8WANJSCHhqBA7OANxKBA7OBADuBrMeFADuFB2OAFc6Ako+BPlKGAieBACmCOiOACUWEBw6AJ9IEbj17dICIQYkyKYAUv4QBhoJ95AF7gaVJgAAsgUGChQGegoCKgCCngAAVAW+Jh5qGAWWAJmeNAWUDcHJvgA9dgB/QgnbiggFnAX2AfmOAoAWAd+qAWemBrJEBfYBYB4Aj44R9VoN1PoAB1IMCAoQhCYEBjIYllIoBIgFmhQEiAW+DASIBb4MBIgFvlQEiAW+BPjKIASKBACnLASKAAJKAKpmMASKBSkmIEi6PASqCARYCaXqCiVeSAS+AP4ODAS+DAp6AIUiAAM2FAuOAORCBAAaMAFSAEmmIAuIBZoJ+lodSkYGx4KADZ4IG04MDqIaBPQIudIZ/J4Eja4QAooF9woMBCYF9GoWAlIEAdYEFSAFhkwU/hoIwhyxPhQCjkwAeAiJngIV1gHnJBGU/MzGLg5SBABQELTE1OoAxJIAsjwQmJiJugrKah6r+gQlegIbFgIvmg4bNgAVGhAEBgAS3A3tZcoIB2YlmpIF2todBOwFigAcEgj/8gmZNAixKgCUWgQAvggrrgDxVgF60ATWAA7EBcIFEg4ZC3QFmgycvASGIIjyBC6aCDEsBIoA1n4NG+4BeK4AVbwE+g4Q3gSI+gADHgAAOhgAzAW6AReSEizuAIMCAADEBZoBf1YBaoYAbUIIV8gE+gANMA2k+OYCgfoANKoAABoGmtoEAKoJSkYFSm4AAGwIwPoA7qgNvPjSCoKODA64BZocAYoMAFIA24YBtgoEAuAFzgwDrhgEggT07gAEAgATNgAOKgAdeAXOBSD6ANgaAJC6BCESAm26GRcIBc4EhawFugAAHgwuggQAPgAANgHo5gQASgBH3gJuCgAhigHO4gJqyhAAigGpPgJpjgQAigVkRgAAMAXGAKT2BABeGc7yAABSHDCECMiqBAEuAA8eBRqGEK/mFABKARquGABIBT4IAEoEME4AABwFZggBsA2krNoAADIBGyIUj9YAASwFZggAngHdCgwANggBrgBOygABdgQAGAViCAAaAeQiAAFGARviBAAuIBd2EAD2ARqYBc4FUQIQAQIB7s4BDYYEADYEjJwFzgETZgEVpgAE6gWIhgHd9gBytgFn9hmzpiEQAhAFvgkeqgQiDgTwAgT2jAXeDZ3aDAjaCC1WArtaDJGKApkSGRzGBRz2AAkiAJVCCJ1yCSB2BAAaBR52AAbCAKZSBAA4BP4Av6oABu4ILzIUAE4IdH4ELE4JHyYBJS4B0dIWR0YFC/YE6hoZHz4A0LgF0hmxngTMAgGMzhG8Bg0UGg3LohDw2AUuKfDOOAC+DCEaBADGES6oBRYIAbYZILoAVM4N0BYkAQoMAE4YARoJnpooAdQFFjgB1jgAzjgB5AVCCO2yGSJmBAHmCdEOLAEaBABOGAEaCZ/SKAHkBUIp0G5IAM4kAeYFEd4ICjIBzsYJEZYRzs4BFJoBRXoFe4oBx34BxwYINTIBrQoYAK4BEvIQAK4BLbgFCgEr4gHH8hQAoAU6IACgBUIGK0od0BgFEgQAqAlR0gWCdgAApiGnNgAAHgD9PgV6jg0TVgo+0gkYdhg5wgwSsgQIVgUEVgAEegkC4glzlgAA+gHJ1gEx2gUfFA10uV4JBr4gAEQFqgQARgHKohgARAUiBABGAcq6GABEBTINNTYIAiYJL8YE7/IIAB4JNJYRNz4A9OIQ7woQ704A+tYIPCIADCoVGzYFhIoRM3IMDM4B6gAEtgAf1gksIgA8AgAAhgA8FgQ88gFWJgCujgCYngADAgJUMgA/ZA246aIGKL4IG9YO28IWD2oAIMoUAC4ML34WEroEVx4QAC4uHCoAHYIEHCAFjnAb4hQq9gSt1hwAVhgQdoQbvkQbGhwRfiQbFgF0agFGugAscAiwhgAaTggExjIrngVqbhAbbhweIiClOjQbOhASVhEqbgABWgV2jAUeAZ0GECFqBAG6CXfyBQrGBdHuABuqCBkuBVeyCBkuCNQoBboMSZYEhHIM0I4iZeYcrqIAAfIINnooHTYQ7VIIAQoMAYoGSa4BsOoAABgE1gQUOggdWAS2Aq9WHADeBHXiAACuARDyCItICPTWCrvmAAiUBIYEAR4AjLAI4PoIHmIE5cYcBPYAAEoAAGIEHUAFpgwWeiBLEgTFvgRKLg07ighLPgSXjgk2hgRIogAcUgEMwjgXqhg5thS0KgKiBgwXPgga3gLOLgQAHoAA4hwYpgAHkgyifgwYuhAYNg1jUgIivgwYOgAFzgS1EigFzAXSCIkeAtmiAItWDAAiAKJyAA22ABLGEAC6CDwmEeeuDgzGAAlIBaoJOCoMAroIESoAGi4EAMIAcwYALG4YACoAboYQACgFzgS4bgAAIgxoGhARmiAAGgVZFAXKDA4SBA5gBcoBHOANuOm6AcneDBI+LA5eBALWSA5eBC5eXA5cBO4yJH4KxPYEKwQI9YYERBAFugAnrgIdFAyk7Cg==");if(g){const A=atob(I),g=new Blob([A],{type:B});return URL.createObjectURL(g)}return "data:"+B+";base64,"+I}});}
|
|
214
|
+
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++],D=I-Y;C(I+Q);for(let A=0;Q>A;A++)B[I++]=B[D+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}});}
|
|
209
215
|
|
|
210
216
|
/*
|
|
211
217
|
Copyright (c) 2022 Gildas Lormeau. All rights reserved.
|
|
@@ -954,37 +960,6 @@
|
|
|
954
960
|
}
|
|
955
961
|
};
|
|
956
962
|
|
|
957
|
-
/**
|
|
958
|
-
* Random values
|
|
959
|
-
* @namespace
|
|
960
|
-
*/
|
|
961
|
-
const random = {
|
|
962
|
-
/**
|
|
963
|
-
* Generate random words with pure js, cryptographically not as strong & safe as native implementation.
|
|
964
|
-
* @param {TypedArray} typedArray The array to fill.
|
|
965
|
-
* @return {TypedArray} The random values.
|
|
966
|
-
*/
|
|
967
|
-
getRandomValues(typedArray) {
|
|
968
|
-
const words = new Uint32Array(typedArray.buffer);
|
|
969
|
-
const r = (m_w) => {
|
|
970
|
-
let m_z = 0x3ade68b1;
|
|
971
|
-
const mask = 0xffffffff;
|
|
972
|
-
return function () {
|
|
973
|
-
m_z = (0x9069 * (m_z & 0xFFFF) + (m_z >> 0x10)) & mask;
|
|
974
|
-
m_w = (0x4650 * (m_w & 0xFFFF) + (m_w >> 0x10)) & mask;
|
|
975
|
-
const result = ((((m_z << 0x10) + m_w) & mask) / 0x100000000) + .5;
|
|
976
|
-
return result * (Math.random() > .5 ? 1 : -1);
|
|
977
|
-
};
|
|
978
|
-
};
|
|
979
|
-
for (let i = 0, rcache; i < typedArray.length; i += 4) {
|
|
980
|
-
const _r = r((rcache || Math.random()) * 0x100000000);
|
|
981
|
-
rcache = _r() * 0x3ade67b7;
|
|
982
|
-
words[i / 4] = (_r() * 0x100000000) | 0;
|
|
983
|
-
}
|
|
984
|
-
return typedArray;
|
|
985
|
-
}
|
|
986
|
-
};
|
|
987
|
-
|
|
988
963
|
/** @fileOverview CTR mode implementation.
|
|
989
964
|
*
|
|
990
965
|
* Special thanks to Roy Nicholson for pointing out a bug in our
|
|
@@ -1215,12 +1190,15 @@
|
|
|
1215
1190
|
const ERR_INVALID_PASSWORD = "Invalid password";
|
|
1216
1191
|
const ERR_INVALID_SIGNATURE = "Invalid signature";
|
|
1217
1192
|
const ERR_ABORT_CHECK_PASSWORD = "zipjs-abort-check-password";
|
|
1193
|
+
const ERR_UNSUPPORTED_CRYPTO_API = "Crypto API not supported";
|
|
1218
1194
|
|
|
1219
1195
|
function getRandomValues(array) {
|
|
1220
1196
|
if (GET_RANDOM_VALUES_SUPPORTED) {
|
|
1221
1197
|
return crypto.getRandomValues(array);
|
|
1222
1198
|
} else {
|
|
1223
|
-
|
|
1199
|
+
// all supported runtimes expose crypto.getRandomValues; failing hard beats
|
|
1200
|
+
// silently generating predictable encryption salts
|
|
1201
|
+
throw new Error(ERR_UNSUPPORTED_CRYPTO_API);
|
|
1224
1202
|
}
|
|
1225
1203
|
}
|
|
1226
1204
|
|
|
@@ -1279,13 +1257,12 @@
|
|
|
1279
1257
|
|
|
1280
1258
|
class AESDecryptionStream extends TransformStream {
|
|
1281
1259
|
|
|
1282
|
-
constructor({ password, rawPassword,
|
|
1260
|
+
constructor({ password, rawPassword, encryptionStrength, checkPasswordOnly }) {
|
|
1283
1261
|
super({
|
|
1284
1262
|
start() {
|
|
1285
1263
|
Object.assign(this, {
|
|
1286
1264
|
ready: new Promise(resolve => this.resolveReady = resolve),
|
|
1287
1265
|
password: encodePassword(password, rawPassword),
|
|
1288
|
-
signed,
|
|
1289
1266
|
strength: encryptionStrength - 1,
|
|
1290
1267
|
pending: new Uint8Array()
|
|
1291
1268
|
});
|
|
@@ -1314,7 +1291,6 @@
|
|
|
1314
1291
|
},
|
|
1315
1292
|
async flush(controller) {
|
|
1316
1293
|
const {
|
|
1317
|
-
signed,
|
|
1318
1294
|
ctr,
|
|
1319
1295
|
hmac,
|
|
1320
1296
|
pending,
|
|
@@ -1331,13 +1307,15 @@
|
|
|
1331
1307
|
const decryptedChunk = ctr.update(encryptedChunk);
|
|
1332
1308
|
decryptedChunkArray = fromBits(codecBytes, decryptedChunk);
|
|
1333
1309
|
}
|
|
1334
|
-
|
|
1335
|
-
|
|
1336
|
-
|
|
1337
|
-
|
|
1338
|
-
|
|
1339
|
-
|
|
1340
|
-
|
|
1310
|
+
const signature = subarray(fromBits(codecBytes, hmac.digest()), 0, SIGNATURE_LENGTH);
|
|
1311
|
+
// branch-free comparison: accumulate the differences instead of
|
|
1312
|
+
// short-circuiting on the first mismatching byte
|
|
1313
|
+
let invalidSignature = pending.length < SIGNATURE_LENGTH ? 1 : 0;
|
|
1314
|
+
for (let indexSignature = 0; indexSignature < SIGNATURE_LENGTH; indexSignature++) {
|
|
1315
|
+
invalidSignature |= signature[indexSignature] ^ originalSignature[indexSignature];
|
|
1316
|
+
}
|
|
1317
|
+
if (invalidSignature) {
|
|
1318
|
+
throw new Error(ERR_INVALID_SIGNATURE);
|
|
1341
1319
|
}
|
|
1342
1320
|
controller.enqueue(decryptedChunkArray);
|
|
1343
1321
|
}
|
|
@@ -1409,11 +1387,11 @@
|
|
|
1409
1387
|
hmac,
|
|
1410
1388
|
pending
|
|
1411
1389
|
} = aesCrypto;
|
|
1412
|
-
const inputLength = input.length - paddingEnd;
|
|
1413
1390
|
if (pending.length) {
|
|
1414
1391
|
input = concat(pending, input);
|
|
1415
|
-
output = expand(output, inputLength - (inputLength % BLOCK_LENGTH));
|
|
1416
1392
|
}
|
|
1393
|
+
const inputLength = input.length - paddingEnd;
|
|
1394
|
+
output = expand(output, paddingStart + (inputLength - (inputLength % BLOCK_LENGTH)));
|
|
1417
1395
|
let offset;
|
|
1418
1396
|
for (offset = 0; offset <= inputLength - BLOCK_LENGTH; offset += BLOCK_LENGTH) {
|
|
1419
1397
|
const inputChunk = toBits(codecBytes, subarray(input, offset, offset + BLOCK_LENGTH));
|
|
@@ -1561,21 +1539,24 @@
|
|
|
1561
1539
|
|
|
1562
1540
|
class ZipCryptoDecryptionStream extends TransformStream {
|
|
1563
1541
|
|
|
1564
|
-
constructor({ password, passwordVerification, checkPasswordOnly }) {
|
|
1542
|
+
constructor({ password, rawPassword, passwordVerification, checkPasswordOnly }) {
|
|
1565
1543
|
super({
|
|
1566
1544
|
start() {
|
|
1567
1545
|
Object.assign(this, {
|
|
1568
1546
|
password,
|
|
1547
|
+
rawPassword,
|
|
1569
1548
|
passwordVerification
|
|
1570
1549
|
});
|
|
1571
|
-
createKeys(this, password);
|
|
1550
|
+
createKeys(this, password, rawPassword);
|
|
1572
1551
|
},
|
|
1573
1552
|
transform(chunk, controller) {
|
|
1574
1553
|
const zipCrypto = this;
|
|
1575
|
-
if (zipCrypto.password) {
|
|
1554
|
+
if (zipCrypto.password || zipCrypto.rawPassword) {
|
|
1576
1555
|
const decryptedHeader = decrypt(zipCrypto, chunk.subarray(0, HEADER_LENGTH));
|
|
1577
|
-
zipCrypto.password = null;
|
|
1578
|
-
|
|
1556
|
+
zipCrypto.password = zipCrypto.rawPassword = null;
|
|
1557
|
+
// verify the password with a branch-free comparison of the verification byte, mirroring
|
|
1558
|
+
// the constant-time AES HMAC signature check
|
|
1559
|
+
if ((decryptedHeader.at(-1) ^ zipCrypto.passwordVerification) != 0) {
|
|
1579
1560
|
throw new Error(ERR_INVALID_PASSWORD);
|
|
1580
1561
|
}
|
|
1581
1562
|
chunk = chunk.subarray(HEADER_LENGTH);
|
|
@@ -1592,21 +1573,22 @@
|
|
|
1592
1573
|
|
|
1593
1574
|
class ZipCryptoEncryptionStream extends TransformStream {
|
|
1594
1575
|
|
|
1595
|
-
constructor({ password, passwordVerification }) {
|
|
1576
|
+
constructor({ password, rawPassword, passwordVerification }) {
|
|
1596
1577
|
super({
|
|
1597
1578
|
start() {
|
|
1598
1579
|
Object.assign(this, {
|
|
1599
1580
|
password,
|
|
1581
|
+
rawPassword,
|
|
1600
1582
|
passwordVerification
|
|
1601
1583
|
});
|
|
1602
|
-
createKeys(this, password);
|
|
1584
|
+
createKeys(this, password, rawPassword);
|
|
1603
1585
|
},
|
|
1604
1586
|
transform(chunk, controller) {
|
|
1605
1587
|
const zipCrypto = this;
|
|
1606
1588
|
let output;
|
|
1607
1589
|
let offset;
|
|
1608
|
-
if (zipCrypto.password) {
|
|
1609
|
-
zipCrypto.password = null;
|
|
1590
|
+
if (zipCrypto.password || zipCrypto.rawPassword) {
|
|
1591
|
+
zipCrypto.password = zipCrypto.rawPassword = null;
|
|
1610
1592
|
const header = getRandomValues(new Uint8Array(HEADER_LENGTH));
|
|
1611
1593
|
header[HEADER_LENGTH - 1] = zipCrypto.passwordVerification;
|
|
1612
1594
|
output = new Uint8Array(chunk.length + header.length);
|
|
@@ -1641,25 +1623,31 @@
|
|
|
1641
1623
|
return output;
|
|
1642
1624
|
}
|
|
1643
1625
|
|
|
1644
|
-
function createKeys(target, password) {
|
|
1626
|
+
function createKeys(target, password, rawPassword) {
|
|
1645
1627
|
const keys = [0x12345678, 0x23456789, 0x34567890];
|
|
1646
1628
|
Object.assign(target, {
|
|
1647
1629
|
keys,
|
|
1648
1630
|
crcKey0: new Crc32(keys[0]),
|
|
1649
1631
|
crcKey2: new Crc32(keys[2])
|
|
1650
1632
|
});
|
|
1651
|
-
|
|
1652
|
-
|
|
1633
|
+
if (rawPassword) {
|
|
1634
|
+
for (let index = 0; index < rawPassword.length; index++) {
|
|
1635
|
+
updateKeys(target, rawPassword[index]);
|
|
1636
|
+
}
|
|
1637
|
+
} else {
|
|
1638
|
+
for (let index = 0; index < password.length; index++) {
|
|
1639
|
+
updateKeys(target, password.charCodeAt(index));
|
|
1640
|
+
}
|
|
1653
1641
|
}
|
|
1654
1642
|
}
|
|
1655
1643
|
|
|
1656
1644
|
function updateKeys(target, byte) {
|
|
1657
|
-
let [
|
|
1645
|
+
let [, key1] = target.keys;
|
|
1658
1646
|
target.crcKey0.append([byte]);
|
|
1659
|
-
key0 = ~target.crcKey0.get();
|
|
1647
|
+
const key0 = ~target.crcKey0.get();
|
|
1660
1648
|
key1 = getInt32(Math.imul(getInt32(key1 + getInt8(key0)), 134775813) + 1);
|
|
1661
1649
|
target.crcKey2.append([key1 >>> 24]);
|
|
1662
|
-
key2 = ~target.crcKey2.get();
|
|
1650
|
+
const key2 = ~target.crcKey2.get();
|
|
1663
1651
|
target.keys = [key0, key1, key2];
|
|
1664
1652
|
}
|
|
1665
1653
|
|
|
@@ -1706,6 +1694,7 @@
|
|
|
1706
1694
|
|
|
1707
1695
|
|
|
1708
1696
|
const ERR_INVALID_UNCOMPRESSED_SIZE = "Invalid uncompressed size";
|
|
1697
|
+
const ERR_INVALID_COMPRESSED_DATA = "Invalid compressed data";
|
|
1709
1698
|
const FORMAT_DEFLATE_RAW = "deflate-raw";
|
|
1710
1699
|
const FORMAT_DEFLATE64_RAW = "deflate64-raw";
|
|
1711
1700
|
|
|
@@ -1762,6 +1751,7 @@
|
|
|
1762
1751
|
}
|
|
1763
1752
|
if (compressed) {
|
|
1764
1753
|
readable = pipeThroughCommpressionStream(readable, useCompressionStream, { chunkSize, deflate64 }, DecompressionStream, DecompressionStreamZlib, DecompressionStream);
|
|
1754
|
+
readable = mapInflateStreamError(readable);
|
|
1765
1755
|
}
|
|
1766
1756
|
if ((!encrypted || zipCrypto) && signed) {
|
|
1767
1757
|
crc32Stream = new Crc32Stream();
|
|
@@ -1790,14 +1780,15 @@
|
|
|
1790
1780
|
function pipeThroughCommpressionStream(readable, useCompressionStream, options, CompressionStreamNative, CompressionStreamZlib, CompressionStream) {
|
|
1791
1781
|
const Stream = useCompressionStream && CompressionStreamNative ? CompressionStreamNative : CompressionStreamZlib || CompressionStream;
|
|
1792
1782
|
const format = options.deflate64 ? FORMAT_DEFLATE64_RAW : FORMAT_DEFLATE_RAW;
|
|
1783
|
+
let codecStream;
|
|
1793
1784
|
try {
|
|
1794
|
-
|
|
1785
|
+
codecStream = new Stream(format, options);
|
|
1795
1786
|
} catch (error) {
|
|
1796
1787
|
if (useCompressionStream) {
|
|
1797
1788
|
if (CompressionStreamZlib) {
|
|
1798
|
-
|
|
1789
|
+
codecStream = new CompressionStreamZlib(format, options);
|
|
1799
1790
|
} else if (CompressionStream) {
|
|
1800
|
-
|
|
1791
|
+
codecStream = new CompressionStream(format, options);
|
|
1801
1792
|
} else {
|
|
1802
1793
|
throw error;
|
|
1803
1794
|
}
|
|
@@ -1805,13 +1796,93 @@
|
|
|
1805
1796
|
throw error;
|
|
1806
1797
|
}
|
|
1807
1798
|
}
|
|
1808
|
-
|
|
1799
|
+
// The native CompressionStream/DecompressionStream and the pure-JS zlib port do not signal
|
|
1800
|
+
// backpressure on their writable side (their `ready` never pends), so a plain pipeThrough drains
|
|
1801
|
+
// the whole source into them and peak memory grows with the entry size. Awaiting each write()
|
|
1802
|
+
// paces the source to the codec's consumption rate, keeping streaming memory bounded. The WASM
|
|
1803
|
+
// codec already backpressures, so this is a no-op cost for it.
|
|
1804
|
+
return pipeThroughBackpressured(readable, codecStream);
|
|
1809
1805
|
}
|
|
1810
1806
|
|
|
1811
1807
|
function pipeThrough(readable, transformStream) {
|
|
1812
1808
|
return readable.pipeThrough(transformStream);
|
|
1813
1809
|
}
|
|
1814
1810
|
|
|
1811
|
+
// Like readable.pipeThrough(transformStream), but drives the writable side manually and awaits each
|
|
1812
|
+
// write() so that a codec which under-reports backpressure cannot pull the whole source into memory.
|
|
1813
|
+
// Errors propagate in both directions: a source error aborts the codec; a downstream cancel/error
|
|
1814
|
+
// (surfaced through the codec's writable rejecting) cancels the source.
|
|
1815
|
+
function pipeThroughBackpressured(readable, transformStream) {
|
|
1816
|
+
const writer = transformStream.writable.getWriter();
|
|
1817
|
+
const reader = readable.getReader();
|
|
1818
|
+
pump();
|
|
1819
|
+
return transformStream.readable;
|
|
1820
|
+
|
|
1821
|
+
async function pump() {
|
|
1822
|
+
try {
|
|
1823
|
+
for (; ;) {
|
|
1824
|
+
await writer.ready;
|
|
1825
|
+
const result = await reader.read();
|
|
1826
|
+
if (result.done) {
|
|
1827
|
+
await writer.close();
|
|
1828
|
+
break;
|
|
1829
|
+
}
|
|
1830
|
+
await writer.write(result.value);
|
|
1831
|
+
}
|
|
1832
|
+
} catch (error) {
|
|
1833
|
+
await abort(writer, error);
|
|
1834
|
+
await cancel(reader, error);
|
|
1835
|
+
}
|
|
1836
|
+
}
|
|
1837
|
+
}
|
|
1838
|
+
|
|
1839
|
+
async function abort(writer, error) {
|
|
1840
|
+
try {
|
|
1841
|
+
await writer.abort(error);
|
|
1842
|
+
} catch {
|
|
1843
|
+
// the writable may already be errored/closed
|
|
1844
|
+
}
|
|
1845
|
+
}
|
|
1846
|
+
|
|
1847
|
+
async function cancel(reader, error) {
|
|
1848
|
+
try {
|
|
1849
|
+
await reader.cancel(error);
|
|
1850
|
+
} catch {
|
|
1851
|
+
// the readable may already be errored/closed
|
|
1852
|
+
}
|
|
1853
|
+
}
|
|
1854
|
+
|
|
1855
|
+
// DecompressionStream implementations can fail with a message-less TypeError on malformed
|
|
1856
|
+
// input; give these errors an identifiable message (errors raised by the other stages of
|
|
1857
|
+
// the pipeline, e.g. ERR_INVALID_PASSWORD, always carry a message and pass through as-is)
|
|
1858
|
+
function mapInflateStreamError(readable) {
|
|
1859
|
+
const reader = readable.getReader();
|
|
1860
|
+
return new ReadableStream({
|
|
1861
|
+
async pull(controller) {
|
|
1862
|
+
let result;
|
|
1863
|
+
try {
|
|
1864
|
+
result = await reader.read();
|
|
1865
|
+
} catch (error) {
|
|
1866
|
+
if (error && error.message) {
|
|
1867
|
+
throw error;
|
|
1868
|
+
}
|
|
1869
|
+
const mappedError = new Error(ERR_INVALID_COMPRESSED_DATA);
|
|
1870
|
+
mappedError.cause = error;
|
|
1871
|
+
throw mappedError;
|
|
1872
|
+
}
|
|
1873
|
+
const { value, done } = result;
|
|
1874
|
+
if (done) {
|
|
1875
|
+
controller.close();
|
|
1876
|
+
} else {
|
|
1877
|
+
controller.enqueue(value);
|
|
1878
|
+
}
|
|
1879
|
+
},
|
|
1880
|
+
cancel(reason) {
|
|
1881
|
+
return reader.cancel(reason);
|
|
1882
|
+
}
|
|
1883
|
+
});
|
|
1884
|
+
}
|
|
1885
|
+
|
|
1815
1886
|
/*
|
|
1816
1887
|
Copyright (c) 2022 Gildas Lormeau. All rights reserved.
|
|
1817
1888
|
|
|
@@ -1841,6 +1912,7 @@
|
|
|
1841
1912
|
*/
|
|
1842
1913
|
|
|
1843
1914
|
|
|
1915
|
+
const DEFAULT_CHUNK_SIZE$1 = 64 * 1024;
|
|
1844
1916
|
const MESSAGE_EVENT_TYPE = "message";
|
|
1845
1917
|
const MESSAGE_START = "start";
|
|
1846
1918
|
const MESSAGE_PULL = "pull";
|
|
@@ -1909,6 +1981,9 @@
|
|
|
1909
1981
|
|
|
1910
1982
|
constructor(chunkSize) {
|
|
1911
1983
|
let pendingChunk;
|
|
1984
|
+
if (!(chunkSize >= 1)) {
|
|
1985
|
+
chunkSize = DEFAULT_CHUNK_SIZE$1;
|
|
1986
|
+
}
|
|
1912
1987
|
super({
|
|
1913
1988
|
transform,
|
|
1914
1989
|
flush(controller) {
|
|
@@ -1926,12 +2001,12 @@
|
|
|
1926
2001
|
chunk = newChunk;
|
|
1927
2002
|
pendingChunk = null;
|
|
1928
2003
|
}
|
|
1929
|
-
|
|
1930
|
-
|
|
1931
|
-
|
|
1932
|
-
|
|
1933
|
-
pendingChunk = chunk;
|
|
2004
|
+
let offset = 0;
|
|
2005
|
+
while (chunk.length - offset > chunkSize) {
|
|
2006
|
+
controller.enqueue(chunk.slice(offset, offset + chunkSize));
|
|
2007
|
+
offset += chunkSize;
|
|
1934
2008
|
}
|
|
2009
|
+
pendingChunk = offset ? chunk.slice(offset) : chunk;
|
|
1935
2010
|
}
|
|
1936
2011
|
}
|
|
1937
2012
|
}
|
|
@@ -1966,8 +2041,10 @@
|
|
|
1966
2041
|
|
|
1967
2042
|
|
|
1968
2043
|
const MODULE_WORKER_OPTIONS = { type: "module" };
|
|
2044
|
+
const ERROR_EVENT_TYPE = "error";
|
|
2045
|
+
const MESSAGE_ERROR_EVENT_TYPE = "messageerror";
|
|
1969
2046
|
|
|
1970
|
-
let webWorkerSupported, webWorkerURI, webWorkerOptions;
|
|
2047
|
+
let webWorkerSupported, webWorkerSource, webWorkerURI, webWorkerOptions;
|
|
1971
2048
|
let transferStreamsSupported = true;
|
|
1972
2049
|
try {
|
|
1973
2050
|
transferStreamsSupported = typeof structuredClone == FUNCTION_TYPE && structuredClone(new DOMException("", "AbortError")).code !== UNDEFINED_VALUE;
|
|
@@ -1982,8 +2059,9 @@
|
|
|
1982
2059
|
const { signal } = streamOptions;
|
|
1983
2060
|
Object.assign(workerData, {
|
|
1984
2061
|
busy: true,
|
|
2062
|
+
generation: (workerData.generation || 0) + 1,
|
|
1985
2063
|
readable: readable
|
|
1986
|
-
.pipeThrough(new ChunkStream(config
|
|
2064
|
+
.pipeThrough(new ChunkStream(getChunkSize(config)))
|
|
1987
2065
|
.pipeThrough(new ProgressWatcherStream(streamOptions), { signal }),
|
|
1988
2066
|
writable,
|
|
1989
2067
|
options: Object.assign({}, options),
|
|
@@ -2006,15 +2084,17 @@
|
|
|
2006
2084
|
});
|
|
2007
2085
|
},
|
|
2008
2086
|
onTaskFinished() {
|
|
2009
|
-
|
|
2010
|
-
|
|
2011
|
-
|
|
2012
|
-
|
|
2013
|
-
|
|
2014
|
-
|
|
2087
|
+
if (workerData.busy) {
|
|
2088
|
+
const { resolveTerminated } = workerData;
|
|
2089
|
+
if (resolveTerminated) {
|
|
2090
|
+
workerData.resolveTerminated = null;
|
|
2091
|
+
workerData.terminated = true;
|
|
2092
|
+
workerData.worker.terminate();
|
|
2093
|
+
resolveTerminated();
|
|
2094
|
+
}
|
|
2095
|
+
workerData.busy = false;
|
|
2096
|
+
onTaskFinished(workerData);
|
|
2015
2097
|
}
|
|
2016
|
-
workerData.busy = false;
|
|
2017
|
-
onTaskFinished(workerData);
|
|
2018
2098
|
}
|
|
2019
2099
|
});
|
|
2020
2100
|
if (webWorkerSupported === UNDEFINED_VALUE) {
|
|
@@ -2083,6 +2163,7 @@
|
|
|
2083
2163
|
}
|
|
2084
2164
|
Object.assign(workerData, {
|
|
2085
2165
|
worker,
|
|
2166
|
+
terminated: false,
|
|
2086
2167
|
interface: {
|
|
2087
2168
|
run: () => runWebWorker(workerData, { chunkSize, wasmURI, baseURI })
|
|
2088
2169
|
}
|
|
@@ -2098,7 +2179,15 @@
|
|
|
2098
2179
|
try {
|
|
2099
2180
|
await initModule(config);
|
|
2100
2181
|
} catch {
|
|
2101
|
-
|
|
2182
|
+
// The WASM module failed to load. Fall back to the native CompressionStream only if the
|
|
2183
|
+
// zlib codec that would otherwise run depends on that module; a self-contained codec
|
|
2184
|
+
// supplied through config (e.g. the pure-JS port) stays usable and is kept as requested.
|
|
2185
|
+
const ZlibStream = options.codecType.startsWith(CODEC_DEFLATE) ?
|
|
2186
|
+
config.CompressionStreamZlib :
|
|
2187
|
+
config.DecompressionStreamZlib;
|
|
2188
|
+
if (!ZlibStream || ZlibStream.requiresModule) {
|
|
2189
|
+
options.useCompressionStream = true;
|
|
2190
|
+
}
|
|
2102
2191
|
}
|
|
2103
2192
|
}
|
|
2104
2193
|
codecStream = new CodecStream(options, config);
|
|
@@ -2137,37 +2226,85 @@
|
|
|
2137
2226
|
result
|
|
2138
2227
|
});
|
|
2139
2228
|
const { readable, options } = workerData;
|
|
2140
|
-
const { writable, closed } = watchClosedStream(workerData.writable);
|
|
2141
|
-
|
|
2142
|
-
|
|
2143
|
-
|
|
2144
|
-
|
|
2145
|
-
|
|
2146
|
-
|
|
2147
|
-
|
|
2229
|
+
const { writable, closed, abortPipe } = watchClosedStream(workerData.writable);
|
|
2230
|
+
let streamsTransferred;
|
|
2231
|
+
try {
|
|
2232
|
+
streamsTransferred = sendMessage({
|
|
2233
|
+
type: MESSAGE_START,
|
|
2234
|
+
options,
|
|
2235
|
+
config,
|
|
2236
|
+
readable,
|
|
2237
|
+
writable
|
|
2238
|
+
}, workerData);
|
|
2239
|
+
} catch (error) {
|
|
2240
|
+
abortPipe();
|
|
2241
|
+
try {
|
|
2242
|
+
await closed;
|
|
2243
|
+
} catch {
|
|
2244
|
+
// ignored
|
|
2245
|
+
}
|
|
2246
|
+
workerData.onTaskFinished();
|
|
2247
|
+
throw error;
|
|
2248
|
+
}
|
|
2148
2249
|
if (!streamsTransferred) {
|
|
2149
2250
|
Object.assign(workerData, {
|
|
2150
2251
|
reader: readable.getReader(),
|
|
2151
2252
|
writer: writable.getWriter()
|
|
2152
2253
|
});
|
|
2153
2254
|
}
|
|
2154
|
-
|
|
2155
|
-
|
|
2156
|
-
await
|
|
2255
|
+
try {
|
|
2256
|
+
const resultValue = await result;
|
|
2257
|
+
await closeWritable();
|
|
2258
|
+
await closed;
|
|
2259
|
+
return resultValue;
|
|
2260
|
+
} catch (error) {
|
|
2261
|
+
await closeWritable();
|
|
2262
|
+
// unblock the pipe watcher if the worker died before closing its end of the stream
|
|
2263
|
+
abortPipe();
|
|
2264
|
+
try {
|
|
2265
|
+
await closed;
|
|
2266
|
+
} catch {
|
|
2267
|
+
// ignored
|
|
2268
|
+
}
|
|
2269
|
+
throw error;
|
|
2270
|
+
}
|
|
2271
|
+
|
|
2272
|
+
async function closeWritable() {
|
|
2273
|
+
if (!streamsTransferred && !writable.locked) {
|
|
2274
|
+
try {
|
|
2275
|
+
await writable.getWriter().close();
|
|
2276
|
+
} catch {
|
|
2277
|
+
// ignored
|
|
2278
|
+
}
|
|
2279
|
+
}
|
|
2157
2280
|
}
|
|
2158
|
-
await closed;
|
|
2159
|
-
return resultValue;
|
|
2160
2281
|
}
|
|
2161
2282
|
|
|
2162
2283
|
function watchClosedStream(writableSource) {
|
|
2284
|
+
const abortController = new AbortController();
|
|
2163
2285
|
const { writable, readable } = new TransformStream();
|
|
2164
|
-
const closed = readable.pipeTo(writableSource, { preventClose: true });
|
|
2165
|
-
|
|
2286
|
+
const closed = readable.pipeTo(writableSource, { preventClose: true, preventAbort: true, signal: abortController.signal });
|
|
2287
|
+
// the pipe can fail before `closed` is awaited (e.g. the destination write fails);
|
|
2288
|
+
// mark the rejection as handled so it cannot kill the process in the meantime
|
|
2289
|
+
closed.catch(() => { });
|
|
2290
|
+
return { writable, closed, abortPipe: () => abortController.abort() };
|
|
2291
|
+
}
|
|
2292
|
+
|
|
2293
|
+
function terminateWorker$1(workerData) {
|
|
2294
|
+
const { worker } = workerData;
|
|
2295
|
+
if (worker) {
|
|
2296
|
+
try {
|
|
2297
|
+
worker.terminate();
|
|
2298
|
+
} catch {
|
|
2299
|
+
// ignored
|
|
2300
|
+
}
|
|
2301
|
+
}
|
|
2302
|
+
workerData.interface = null;
|
|
2166
2303
|
}
|
|
2167
2304
|
|
|
2168
2305
|
function getWebWorker(url, baseURI, workerData, isModuleType, useBlobURI = true) {
|
|
2169
2306
|
let worker, resolvedURI, resolvedOptions;
|
|
2170
|
-
if (webWorkerURI === UNDEFINED_VALUE) {
|
|
2307
|
+
if (webWorkerURI === UNDEFINED_VALUE || webWorkerSource !== url) {
|
|
2171
2308
|
// deno-lint-ignore valid-typeof
|
|
2172
2309
|
const isFunctionURI = typeof url == FUNCTION_TYPE;
|
|
2173
2310
|
if (isFunctionURI) {
|
|
@@ -2224,16 +2361,36 @@
|
|
|
2224
2361
|
}
|
|
2225
2362
|
}
|
|
2226
2363
|
}
|
|
2364
|
+
webWorkerSource = url;
|
|
2227
2365
|
webWorkerURI = resolvedURI;
|
|
2228
2366
|
webWorkerOptions = resolvedOptions;
|
|
2229
2367
|
} else {
|
|
2230
2368
|
worker = new Worker(webWorkerURI, webWorkerOptions);
|
|
2231
2369
|
}
|
|
2232
2370
|
worker.addEventListener(MESSAGE_EVENT_TYPE, event => onMessage(event, workerData));
|
|
2371
|
+
worker.addEventListener(ERROR_EVENT_TYPE, event => onWorkerError(event, workerData));
|
|
2372
|
+
worker.addEventListener(MESSAGE_ERROR_EVENT_TYPE, event => onWorkerError(event, workerData));
|
|
2233
2373
|
return worker;
|
|
2234
2374
|
}
|
|
2235
2375
|
|
|
2236
|
-
function
|
|
2376
|
+
function onWorkerError(event, workerData) {
|
|
2377
|
+
if (event.preventDefault) {
|
|
2378
|
+
event.preventDefault();
|
|
2379
|
+
}
|
|
2380
|
+
const { rejectResult, writer, onTaskFinished } = workerData;
|
|
2381
|
+
// the worker is unusable (e.g. its script failed to load); terminate it and
|
|
2382
|
+
// fail the current task instead of letting it hang forever
|
|
2383
|
+
terminateWorker$1(workerData);
|
|
2384
|
+
if (rejectResult) {
|
|
2385
|
+
rejectResult(event.error || new Error(event.message || ERROR_EVENT_TYPE));
|
|
2386
|
+
if (writer) {
|
|
2387
|
+
writer.releaseLock();
|
|
2388
|
+
}
|
|
2389
|
+
onTaskFinished();
|
|
2390
|
+
}
|
|
2391
|
+
}
|
|
2392
|
+
|
|
2393
|
+
function sendMessage(message, { worker, writer, transferStreams }) {
|
|
2237
2394
|
try {
|
|
2238
2395
|
const { value, readable, writable } = message;
|
|
2239
2396
|
const transferables = [];
|
|
@@ -2267,14 +2424,16 @@
|
|
|
2267
2424
|
if (writer) {
|
|
2268
2425
|
writer.releaseLock();
|
|
2269
2426
|
}
|
|
2270
|
-
onTaskFinished();
|
|
2271
2427
|
throw error;
|
|
2272
2428
|
}
|
|
2273
2429
|
}
|
|
2274
2430
|
|
|
2275
2431
|
async function onMessage({ data }, workerData) {
|
|
2276
2432
|
const { type, value, messageId, result, error } = data;
|
|
2277
|
-
const { reader, writer, resolveResult, rejectResult, onTaskFinished } = workerData;
|
|
2433
|
+
const { reader, writer, resolveResult, rejectResult, onTaskFinished, generation } = workerData;
|
|
2434
|
+
// continuations below can settle after the worker slot has been reassigned to a new
|
|
2435
|
+
// task (e.g. a pending pull read failing late); they must not touch the new task
|
|
2436
|
+
const stale = () => workerData.generation != generation;
|
|
2278
2437
|
try {
|
|
2279
2438
|
if (error) {
|
|
2280
2439
|
const { message, stack, code, name, outputSize } = error;
|
|
@@ -2284,23 +2443,32 @@
|
|
|
2284
2443
|
} else {
|
|
2285
2444
|
if (type == MESSAGE_PULL) {
|
|
2286
2445
|
const { value, done } = await reader.read();
|
|
2287
|
-
|
|
2446
|
+
if (!stale()) {
|
|
2447
|
+
sendMessage({ type: MESSAGE_DATA, value, done, messageId }, workerData);
|
|
2448
|
+
}
|
|
2288
2449
|
}
|
|
2289
2450
|
if (type == MESSAGE_DATA) {
|
|
2290
2451
|
await writer.ready;
|
|
2291
2452
|
await writer.write(new Uint8Array(value));
|
|
2292
|
-
|
|
2453
|
+
if (!stale()) {
|
|
2454
|
+
sendMessage({ type: MESSAGE_ACK_DATA, messageId }, workerData);
|
|
2455
|
+
}
|
|
2293
2456
|
}
|
|
2294
2457
|
if (type == MESSAGE_CLOSE) {
|
|
2295
2458
|
close(null, result);
|
|
2296
2459
|
}
|
|
2297
2460
|
}
|
|
2298
2461
|
} catch (error) {
|
|
2299
|
-
|
|
2300
|
-
|
|
2462
|
+
if (!stale()) {
|
|
2463
|
+
terminateWorker$1(workerData);
|
|
2464
|
+
close(error);
|
|
2465
|
+
}
|
|
2301
2466
|
}
|
|
2302
2467
|
|
|
2303
2468
|
function close(error, result) {
|
|
2469
|
+
if (stale()) {
|
|
2470
|
+
return;
|
|
2471
|
+
}
|
|
2304
2472
|
if (error) {
|
|
2305
2473
|
rejectResult(error);
|
|
2306
2474
|
} else {
|
|
@@ -2344,6 +2512,8 @@
|
|
|
2344
2512
|
|
|
2345
2513
|
let pool = [];
|
|
2346
2514
|
const pendingRequests = [];
|
|
2515
|
+
let starvationTimeout;
|
|
2516
|
+
let starvationDelay;
|
|
2347
2517
|
|
|
2348
2518
|
let indexWorker = 0;
|
|
2349
2519
|
|
|
@@ -2370,14 +2540,20 @@
|
|
|
2370
2540
|
pool.push(workerData);
|
|
2371
2541
|
return new CodecWorker(workerData, stream, workerOptions, onTaskFinished);
|
|
2372
2542
|
} else {
|
|
2373
|
-
return new Promise(resolve =>
|
|
2543
|
+
return new Promise(resolve => {
|
|
2544
|
+
pendingRequests.push({ resolve, stream, workerOptions });
|
|
2545
|
+
starvationDelay = config.workerStarvationTimeout;
|
|
2546
|
+
armStarvationTimeout();
|
|
2547
|
+
});
|
|
2374
2548
|
}
|
|
2375
2549
|
}
|
|
2376
2550
|
|
|
2377
2551
|
function onTaskFinished(workerData) {
|
|
2552
|
+
clearStarvationTimeout();
|
|
2378
2553
|
if (pendingRequests.length) {
|
|
2379
2554
|
const [{ resolve, stream, workerOptions }] = pendingRequests.splice(0, 1);
|
|
2380
2555
|
resolve(new CodecWorker(workerData, stream, workerOptions, onTaskFinished));
|
|
2556
|
+
armStarvationTimeout();
|
|
2381
2557
|
} else if (workerData.worker) {
|
|
2382
2558
|
clearTerminateTimeout(workerData);
|
|
2383
2559
|
terminateWorker(workerData, workerOptions);
|
|
@@ -2387,6 +2563,34 @@
|
|
|
2387
2563
|
}
|
|
2388
2564
|
}
|
|
2389
2565
|
|
|
2566
|
+
function armStarvationTimeout() {
|
|
2567
|
+
if (!starvationTimeout && pendingRequests.length && Number.isFinite(starvationDelay) && starvationDelay >= 0) {
|
|
2568
|
+
starvationTimeout = setTimeout(onWorkerStarvation, starvationDelay);
|
|
2569
|
+
}
|
|
2570
|
+
}
|
|
2571
|
+
|
|
2572
|
+
function clearStarvationTimeout() {
|
|
2573
|
+
if (starvationTimeout) {
|
|
2574
|
+
clearTimeout(starvationTimeout);
|
|
2575
|
+
starvationTimeout = null;
|
|
2576
|
+
}
|
|
2577
|
+
}
|
|
2578
|
+
|
|
2579
|
+
function onWorkerStarvation() {
|
|
2580
|
+
starvationTimeout = null;
|
|
2581
|
+
if (pendingRequests.length) {
|
|
2582
|
+
const [{ resolve, stream, workerOptions }] = pendingRequests.splice(0, 1);
|
|
2583
|
+
const inlineWorkerOptions = Object.assign({}, workerOptions, { useWebWorkers: false, workerURI: UNDEFINED_VALUE });
|
|
2584
|
+
resolve(new CodecWorker({}, stream, inlineWorkerOptions, onInlineTaskFinished));
|
|
2585
|
+
armStarvationTimeout();
|
|
2586
|
+
}
|
|
2587
|
+
}
|
|
2588
|
+
|
|
2589
|
+
function onInlineTaskFinished() {
|
|
2590
|
+
clearStarvationTimeout();
|
|
2591
|
+
armStarvationTimeout();
|
|
2592
|
+
}
|
|
2593
|
+
|
|
2390
2594
|
function terminateWorker(workerData, workerOptions) {
|
|
2391
2595
|
const { config } = workerOptions;
|
|
2392
2596
|
const { terminateWorkerTimeout } = config;
|
|
@@ -2457,6 +2661,7 @@
|
|
|
2457
2661
|
|
|
2458
2662
|
const CONTENT_TYPE_TEXT_PLAIN = "text/plain";
|
|
2459
2663
|
const HTTP_HEADER_CONTENT_LENGTH = "Content-Length";
|
|
2664
|
+
const HTTP_HEADER_CONTENT_ENCODING = "Content-Encoding";
|
|
2460
2665
|
const HTTP_HEADER_CONTENT_RANGE = "Content-Range";
|
|
2461
2666
|
const HTTP_HEADER_ACCEPT_RANGES = "Accept-Ranges";
|
|
2462
2667
|
const HTTP_HEADER_RANGE = "Range";
|
|
@@ -2581,7 +2786,7 @@
|
|
|
2581
2786
|
|
|
2582
2787
|
writeUint8Array(array) {
|
|
2583
2788
|
const writer = this;
|
|
2584
|
-
let indexArray
|
|
2789
|
+
let indexArray;
|
|
2585
2790
|
let dataString = writer.pending;
|
|
2586
2791
|
const delta = writer.pending.length;
|
|
2587
2792
|
writer.pending = "";
|
|
@@ -2591,12 +2796,10 @@
|
|
|
2591
2796
|
for (; indexArray < array.length; indexArray++) {
|
|
2592
2797
|
writer.pending += String.fromCharCode(array[indexArray]);
|
|
2593
2798
|
}
|
|
2594
|
-
if (dataString.length) {
|
|
2595
|
-
|
|
2596
|
-
|
|
2597
|
-
|
|
2598
|
-
writer.pending += dataString;
|
|
2599
|
-
}
|
|
2799
|
+
if (dataString.length > 2) {
|
|
2800
|
+
writer.data += btoa(dataString);
|
|
2801
|
+
} else {
|
|
2802
|
+
writer.pending = dataString + writer.pending;
|
|
2600
2803
|
}
|
|
2601
2804
|
}
|
|
2602
2805
|
|
|
@@ -2643,6 +2846,9 @@
|
|
|
2643
2846
|
}
|
|
2644
2847
|
});
|
|
2645
2848
|
writer.blob = new Response(transformStream.readable, { headers }).blob();
|
|
2849
|
+
// mark early rejections (e.g. aborted pipe) as handled; awaiting getData() still
|
|
2850
|
+
// surfaces them
|
|
2851
|
+
writer.blob.catch(() => { });
|
|
2646
2852
|
}
|
|
2647
2853
|
|
|
2648
2854
|
getData() {
|
|
@@ -2727,7 +2933,8 @@
|
|
|
2727
2933
|
preventHeadRequest,
|
|
2728
2934
|
useRangeHeader,
|
|
2729
2935
|
forceRangeRequests,
|
|
2730
|
-
combineSizeEocd
|
|
2936
|
+
combineSizeEocd,
|
|
2937
|
+
fetch
|
|
2731
2938
|
} = options;
|
|
2732
2939
|
options = Object.assign({}, options);
|
|
2733
2940
|
delete options.preventHeadRequest;
|
|
@@ -2735,13 +2942,15 @@
|
|
|
2735
2942
|
delete options.forceRangeRequests;
|
|
2736
2943
|
delete options.combineSizeEocd;
|
|
2737
2944
|
delete options.useXHR;
|
|
2945
|
+
delete options.fetch;
|
|
2738
2946
|
Object.assign(httpReader, {
|
|
2739
2947
|
url,
|
|
2740
2948
|
options,
|
|
2741
2949
|
preventHeadRequest,
|
|
2742
2950
|
useRangeHeader,
|
|
2743
2951
|
forceRangeRequests,
|
|
2744
|
-
combineSizeEocd
|
|
2952
|
+
combineSizeEocd,
|
|
2953
|
+
fetch
|
|
2745
2954
|
});
|
|
2746
2955
|
}
|
|
2747
2956
|
|
|
@@ -2760,7 +2969,10 @@
|
|
|
2760
2969
|
throw new Error(ERR_HTTP_RANGE);
|
|
2761
2970
|
} else {
|
|
2762
2971
|
if (combineSizeEocd) {
|
|
2763
|
-
|
|
2972
|
+
const eocdCache = new Uint8Array(await response.arrayBuffer());
|
|
2973
|
+
if (response.status == 206 && eocdCache.length == END_OF_CENTRAL_DIR_LENGTH) {
|
|
2974
|
+
httpReader.eocdCache = eocdCache;
|
|
2975
|
+
}
|
|
2764
2976
|
}
|
|
2765
2977
|
let contentSize;
|
|
2766
2978
|
const contentRangeHeader = response.headers.get(HTTP_HEADER_CONTENT_RANGE);
|
|
@@ -2806,7 +3018,18 @@
|
|
|
2806
3018
|
if (response.status != 206) {
|
|
2807
3019
|
throw new Error(ERR_HTTP_RANGE);
|
|
2808
3020
|
}
|
|
2809
|
-
|
|
3021
|
+
const contentRangeHeader = response.headers.get(HTTP_HEADER_CONTENT_RANGE);
|
|
3022
|
+
if (contentRangeHeader) {
|
|
3023
|
+
const rangeStart = Number(contentRangeHeader.trim().split(/[\s-]+/)[1]);
|
|
3024
|
+
if (!Number.isNaN(rangeStart) && rangeStart != index) {
|
|
3025
|
+
throw new Error(ERR_HTTP_RANGE);
|
|
3026
|
+
}
|
|
3027
|
+
}
|
|
3028
|
+
const data = new Uint8Array(await response.arrayBuffer());
|
|
3029
|
+
if (data.length != length) {
|
|
3030
|
+
throw new Error(ERR_HTTP_RANGE);
|
|
3031
|
+
}
|
|
3032
|
+
return data;
|
|
2810
3033
|
}
|
|
2811
3034
|
} else {
|
|
2812
3035
|
const { data } = httpReader;
|
|
@@ -2843,9 +3066,9 @@
|
|
|
2843
3066
|
async function getRequestData(httpReader, sendRequest) {
|
|
2844
3067
|
const response = await sendRequest(HTTP_METHOD_GET, httpReader, getHeaders(httpReader));
|
|
2845
3068
|
httpReader.data = new Uint8Array(await response.arrayBuffer());
|
|
2846
|
-
|
|
2847
|
-
|
|
2848
|
-
|
|
3069
|
+
// the downloaded content is authoritative, e.g. the Content-Length response header
|
|
3070
|
+
// of the HEAD request can be the encoded size when the content is compressed
|
|
3071
|
+
httpReader.size = httpReader.data.length;
|
|
2849
3072
|
}
|
|
2850
3073
|
|
|
2851
3074
|
async function getContentLength(httpReader, sendRequest, getRequestData) {
|
|
@@ -2854,7 +3077,7 @@
|
|
|
2854
3077
|
} else {
|
|
2855
3078
|
const response = await sendRequest(HTTP_METHOD_HEAD, httpReader, getHeaders(httpReader));
|
|
2856
3079
|
const contentLength = response.headers.get(HTTP_HEADER_CONTENT_LENGTH);
|
|
2857
|
-
if (contentLength) {
|
|
3080
|
+
if (contentLength && !response.headers.get(HTTP_HEADER_CONTENT_ENCODING)) {
|
|
2858
3081
|
httpReader.size = Number(contentLength);
|
|
2859
3082
|
} else {
|
|
2860
3083
|
await getRequestData(httpReader, httpReader.options);
|
|
@@ -2862,8 +3085,8 @@
|
|
|
2862
3085
|
}
|
|
2863
3086
|
}
|
|
2864
3087
|
|
|
2865
|
-
async function sendFetchRequest(method, { options, url }, headers) {
|
|
2866
|
-
const response = await
|
|
3088
|
+
async function sendFetchRequest(method, { fetch: fetchFunction = fetch, options, url }, headers) {
|
|
3089
|
+
const response = await fetchFunction(url, Object.assign({}, options, { method, headers }));
|
|
2867
3090
|
if (response.status < 400) {
|
|
2868
3091
|
return response;
|
|
2869
3092
|
} else {
|
|
@@ -2909,7 +3132,8 @@
|
|
|
2909
3132
|
super();
|
|
2910
3133
|
Object.assign(this, {
|
|
2911
3134
|
url,
|
|
2912
|
-
|
|
3135
|
+
// an explicit fetch implementation takes precedence over useXHR
|
|
3136
|
+
reader: options.useXHR && !options.fetch ? new XHRReader(url, options) : new FetchReader(url, options)
|
|
2913
3137
|
});
|
|
2914
3138
|
}
|
|
2915
3139
|
|
|
@@ -2934,8 +3158,7 @@
|
|
|
2934
3158
|
class HttpRangeReader extends HttpReader {
|
|
2935
3159
|
|
|
2936
3160
|
constructor(url, options = {}) {
|
|
2937
|
-
options
|
|
2938
|
-
super(url, options);
|
|
3161
|
+
super(url, Object.assign({}, options, { useRangeHeader: true }));
|
|
2939
3162
|
}
|
|
2940
3163
|
}
|
|
2941
3164
|
|
|
@@ -3009,7 +3232,7 @@
|
|
|
3009
3232
|
reader.lastDiskNumber = 0;
|
|
3010
3233
|
reader.lastDiskOffset = 0;
|
|
3011
3234
|
await Promise.all(readers.map(async (diskReader, indexDiskReader) => {
|
|
3012
|
-
await diskReader
|
|
3235
|
+
await initStream(diskReader);
|
|
3013
3236
|
if (indexDiskReader != readers.length - 1) {
|
|
3014
3237
|
reader.lastDiskOffset += diskReader.size;
|
|
3015
3238
|
}
|
|
@@ -3093,14 +3316,26 @@
|
|
|
3093
3316
|
writer.diskOffset += diskSourceWriter.size;
|
|
3094
3317
|
writer.diskNumber++;
|
|
3095
3318
|
diskWriter = null;
|
|
3096
|
-
|
|
3319
|
+
// the next disk is not opened yet but its space is available; leaving a
|
|
3320
|
+
// stale value here would force a new disk for every subsequent write
|
|
3321
|
+
writer.availableSize = writer.maxSize;
|
|
3322
|
+
if (chunk.length > availableSize) {
|
|
3323
|
+
await this.write(chunk.subarray(availableSize));
|
|
3324
|
+
}
|
|
3097
3325
|
} else {
|
|
3098
3326
|
await writeChunk(chunk);
|
|
3099
3327
|
}
|
|
3100
3328
|
},
|
|
3101
3329
|
async close() {
|
|
3102
|
-
|
|
3103
|
-
|
|
3330
|
+
if (diskWriter) {
|
|
3331
|
+
await diskWriter.ready;
|
|
3332
|
+
await closeDisk();
|
|
3333
|
+
}
|
|
3334
|
+
},
|
|
3335
|
+
async abort(reason) {
|
|
3336
|
+
if (diskWriter) {
|
|
3337
|
+
await diskWriter.abort(reason);
|
|
3338
|
+
}
|
|
3104
3339
|
}
|
|
3105
3340
|
});
|
|
3106
3341
|
Object.defineProperty(writer, PROPERTY_NAME_WRITABLE, {
|
|
@@ -3115,7 +3350,6 @@
|
|
|
3115
3350
|
await diskWriter.ready;
|
|
3116
3351
|
await diskWriter.write(chunk);
|
|
3117
3352
|
diskSourceWriter.size += chunkLength;
|
|
3118
|
-
writer.size += chunkLength;
|
|
3119
3353
|
writer.availableSize -= chunkLength;
|
|
3120
3354
|
}
|
|
3121
3355
|
}
|
|
@@ -3215,7 +3449,7 @@
|
|
|
3215
3449
|
|
|
3216
3450
|
/* global TextDecoder */
|
|
3217
3451
|
|
|
3218
|
-
const CP437 = "\0☺☻♥♦♣♠•◘○◙♂♀♪♫☼►◄↕‼¶§▬↨↑↓→←∟↔▲▼ !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~⌂ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜ¢£¥₧ƒáíóúñѪº¿⌐¬½¼¡«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■
|
|
3452
|
+
const CP437 = "\0☺☻♥♦♣♠•◘○◙♂♀♪♫☼►◄↕‼¶§▬↨↑↓→←∟↔▲▼ !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~⌂ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜ¢£¥₧ƒáíóúñѪº¿⌐¬½¼¡«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ ".split("");
|
|
3219
3453
|
const VALID_CP437 = CP437.length == 256;
|
|
3220
3454
|
|
|
3221
3455
|
function decodeCP437(stringValue) {
|
|
@@ -3263,7 +3497,8 @@
|
|
|
3263
3497
|
if (encoding && encoding.trim().toLowerCase() == "cp437") {
|
|
3264
3498
|
return decodeCP437(value);
|
|
3265
3499
|
} else {
|
|
3266
|
-
|
|
3500
|
+
// ignoreBOM keeps a leading U+FEFF in filenames/comments instead of dropping it
|
|
3501
|
+
return new TextDecoder(encoding, { ignoreBOM: true }).decode(value);
|
|
3267
3502
|
}
|
|
3268
3503
|
}
|
|
3269
3504
|
|
|
@@ -3440,6 +3675,7 @@
|
|
|
3440
3675
|
const OPTION_CHECK_PASSWORD_ONLY = "checkPasswordOnly";
|
|
3441
3676
|
const OPTION_CHECK_OVERLAPPING_ENTRY_ONLY = "checkOverlappingEntryOnly";
|
|
3442
3677
|
const OPTION_CHECK_OVERLAPPING_ENTRY = "checkOverlappingEntry";
|
|
3678
|
+
const OPTION_CHECK_AMBIGUITY = "checkAmbiguity";
|
|
3443
3679
|
const OPTION_CHECK_SIGNATURE = "checkSignature";
|
|
3444
3680
|
const OPTION_USE_WEB_WORKERS = "useWebWorkers";
|
|
3445
3681
|
const OPTION_USE_COMPRESSION_STREAM = "useCompressionStream";
|
|
@@ -3497,12 +3733,16 @@
|
|
|
3497
3733
|
const ERR_EXTRAFIELD_ZIP64_NOT_FOUND = "Zip64 extra field not found";
|
|
3498
3734
|
const ERR_ENCRYPTED = "File contains encrypted entry";
|
|
3499
3735
|
const ERR_UNSUPPORTED_ENCRYPTION = "Encryption method not supported";
|
|
3500
|
-
const ERR_UNSUPPORTED_COMPRESSION = "Compression method not supported";
|
|
3736
|
+
const ERR_UNSUPPORTED_COMPRESSION$1 = "Compression method not supported";
|
|
3501
3737
|
const ERR_SPLIT_ZIP_FILE = "Split zip file";
|
|
3502
3738
|
const ERR_OVERLAPPING_ENTRY = "Overlapping entry found";
|
|
3739
|
+
const ERR_AMBIGUOUS_ARCHIVE = "Ambiguous archive";
|
|
3503
3740
|
const CHARSET_UTF8 = "utf-8";
|
|
3504
3741
|
const PROPERTY_NAME_UTF8_SUFFIX = "UTF8";
|
|
3505
3742
|
const CHARSET_CP437 = "cp437";
|
|
3743
|
+
// bits of the general purpose flag that change how an entry is interpreted; the level bits (1-2) are excluded
|
|
3744
|
+
// because they are informative only
|
|
3745
|
+
const BITFLAG_AMBIGUITY_MASK = BITFLAG_ENCRYPTED | BITFLAG_DATA_DESCRIPTOR | BITFLAG_LANG_ENCODING_FLAG;
|
|
3506
3746
|
const ZIP64_PROPERTIES = [
|
|
3507
3747
|
[PROPERTY_NAME_UNCOMPRESSED_SIZE, MAX_32_BITS],
|
|
3508
3748
|
[PROPERTY_NAME_COMPRESSED_SIZE, MAX_32_BITS],
|
|
@@ -3527,7 +3767,7 @@
|
|
|
3527
3767
|
reader: new GenericReader(reader),
|
|
3528
3768
|
options,
|
|
3529
3769
|
config: getConfiguration(),
|
|
3530
|
-
readRanges:
|
|
3770
|
+
readRanges: new Map()
|
|
3531
3771
|
});
|
|
3532
3772
|
}
|
|
3533
3773
|
|
|
@@ -3560,21 +3800,30 @@
|
|
|
3560
3800
|
const commentOffset = endOfDirectoryInfo.offset;
|
|
3561
3801
|
const commentLength = getUint16(endOfDirectoryView, 20);
|
|
3562
3802
|
const appendedDataOffset = commentOffset + END_OF_CENTRAL_DIR_LENGTH + commentLength;
|
|
3803
|
+
const checkAmbiguity = getOptionValue$1(zipReader, options, OPTION_CHECK_AMBIGUITY);
|
|
3804
|
+
if (checkAmbiguity && appendedDataOffset != reader.size) {
|
|
3805
|
+
throwAmbiguousArchive("appended data");
|
|
3806
|
+
}
|
|
3563
3807
|
let lastDiskNumber = getUint16(endOfDirectoryView, 4);
|
|
3564
3808
|
const expectedLastDiskNumber = reader.lastDiskNumber || 0;
|
|
3565
3809
|
let diskNumber = getUint16(endOfDirectoryView, 6);
|
|
3566
|
-
let filesLength = getUint16(endOfDirectoryView,
|
|
3810
|
+
let filesLength = getUint16(endOfDirectoryView, 10);
|
|
3567
3811
|
let prependedDataLength = 0;
|
|
3568
|
-
let startOffset
|
|
3812
|
+
let startOffset;
|
|
3813
|
+
let zip64EndOfDirectory;
|
|
3569
3814
|
if (directoryDataOffset == MAX_32_BITS || directoryDataLength == MAX_32_BITS || filesLength == MAX_16_BITS || diskNumber == MAX_16_BITS) {
|
|
3570
|
-
const endOfDirectoryLocatorArray =
|
|
3815
|
+
const endOfDirectoryLocatorArray = endOfDirectoryInfo.offset >= ZIP64_END_OF_CENTRAL_DIR_LOCATOR_LENGTH ?
|
|
3816
|
+
await readUint8Array(reader, endOfDirectoryInfo.offset - ZIP64_END_OF_CENTRAL_DIR_LOCATOR_LENGTH, ZIP64_END_OF_CENTRAL_DIR_LOCATOR_LENGTH) :
|
|
3817
|
+
new Uint8Array();
|
|
3571
3818
|
const endOfDirectoryLocatorView = getDataView$1(endOfDirectoryLocatorArray);
|
|
3572
|
-
if (
|
|
3819
|
+
if (endOfDirectoryLocatorArray.length == ZIP64_END_OF_CENTRAL_DIR_LOCATOR_LENGTH &&
|
|
3820
|
+
getUint32(endOfDirectoryLocatorView, 0) == ZIP64_END_OF_CENTRAL_DIR_LOCATOR_SIGNATURE) {
|
|
3573
3821
|
directoryDataOffset = getBigUint64(endOfDirectoryLocatorView, 8);
|
|
3574
3822
|
let endOfDirectoryArray = await readUint8Array(reader, directoryDataOffset, ZIP64_END_OF_CENTRAL_DIR_LENGTH, -1);
|
|
3575
3823
|
let endOfDirectoryView = getDataView$1(endOfDirectoryArray);
|
|
3576
|
-
const expectedDirectoryDataOffset = endOfDirectoryInfo.offset - ZIP64_END_OF_CENTRAL_DIR_LOCATOR_LENGTH - ZIP64_END_OF_CENTRAL_DIR_LENGTH;
|
|
3577
|
-
if (getUint32(endOfDirectoryView, 0) != ZIP64_END_OF_CENTRAL_DIR_SIGNATURE &&
|
|
3824
|
+
const expectedDirectoryDataOffset = endOfDirectoryInfo.offset - ZIP64_END_OF_CENTRAL_DIR_LOCATOR_LENGTH - ZIP64_END_OF_CENTRAL_DIR_LENGTH - (reader.lastDiskOffset || 0);
|
|
3825
|
+
if ((endOfDirectoryArray.length < ZIP64_END_OF_CENTRAL_DIR_LENGTH || getUint32(endOfDirectoryView, 0) != ZIP64_END_OF_CENTRAL_DIR_SIGNATURE) &&
|
|
3826
|
+
directoryDataOffset != expectedDirectoryDataOffset && expectedDirectoryDataOffset >= 0) {
|
|
3578
3827
|
const originalDirectoryDataOffset = directoryDataOffset;
|
|
3579
3828
|
directoryDataOffset = expectedDirectoryDataOffset;
|
|
3580
3829
|
if (directoryDataOffset > originalDirectoryDataOffset) {
|
|
@@ -3583,24 +3832,36 @@
|
|
|
3583
3832
|
endOfDirectoryArray = await readUint8Array(reader, directoryDataOffset, ZIP64_END_OF_CENTRAL_DIR_LENGTH, -1);
|
|
3584
3833
|
endOfDirectoryView = getDataView$1(endOfDirectoryArray);
|
|
3585
3834
|
}
|
|
3586
|
-
if (getUint32(endOfDirectoryView, 0) != ZIP64_END_OF_CENTRAL_DIR_SIGNATURE) {
|
|
3835
|
+
if (endOfDirectoryArray.length < ZIP64_END_OF_CENTRAL_DIR_LENGTH || getUint32(endOfDirectoryView, 0) != ZIP64_END_OF_CENTRAL_DIR_SIGNATURE) {
|
|
3587
3836
|
throw new Error(ERR_EOCDR_LOCATOR_ZIP64_NOT_FOUND);
|
|
3588
3837
|
}
|
|
3838
|
+
zip64EndOfDirectory = true;
|
|
3589
3839
|
if (lastDiskNumber == MAX_16_BITS) {
|
|
3590
3840
|
lastDiskNumber = getUint32(endOfDirectoryView, 16);
|
|
3841
|
+
} else if (checkAmbiguity && lastDiskNumber != getUint32(endOfDirectoryView, 16)) {
|
|
3842
|
+
throwAmbiguousArchive("mismatched zip64 end of central directory record");
|
|
3591
3843
|
}
|
|
3592
3844
|
if (diskNumber == MAX_16_BITS) {
|
|
3593
3845
|
diskNumber = getUint32(endOfDirectoryView, 20);
|
|
3846
|
+
} else if (checkAmbiguity && diskNumber != getUint32(endOfDirectoryView, 20)) {
|
|
3847
|
+
throwAmbiguousArchive("mismatched zip64 end of central directory record");
|
|
3594
3848
|
}
|
|
3595
3849
|
if (filesLength == MAX_16_BITS) {
|
|
3596
3850
|
filesLength = getBigUint64(endOfDirectoryView, 32);
|
|
3851
|
+
} else if (checkAmbiguity && filesLength != getBigUint64(endOfDirectoryView, 32)) {
|
|
3852
|
+
throwAmbiguousArchive("mismatched zip64 end of central directory record");
|
|
3597
3853
|
}
|
|
3598
3854
|
if (directoryDataLength == MAX_32_BITS) {
|
|
3599
3855
|
directoryDataLength = getBigUint64(endOfDirectoryView, 40);
|
|
3856
|
+
} else if (checkAmbiguity && directoryDataLength != getBigUint64(endOfDirectoryView, 40)) {
|
|
3857
|
+
throwAmbiguousArchive("mismatched zip64 end of central directory record");
|
|
3600
3858
|
}
|
|
3601
|
-
directoryDataOffset
|
|
3859
|
+
directoryDataOffset = getBigUint64(endOfDirectoryView, 48) + prependedDataLength;
|
|
3602
3860
|
}
|
|
3603
3861
|
}
|
|
3862
|
+
const declaredDirectoryDataLength = directoryDataLength;
|
|
3863
|
+
const centralDirectoryEndOffset = endOfDirectoryInfo.offset -
|
|
3864
|
+
(zip64EndOfDirectory ? ZIP64_END_OF_CENTRAL_DIR_LENGTH + ZIP64_END_OF_CENTRAL_DIR_LOCATOR_LENGTH : 0);
|
|
3604
3865
|
if (directoryDataOffset >= reader.size) {
|
|
3605
3866
|
prependedDataLength = reader.size - directoryDataOffset - directoryDataLength - END_OF_CENTRAL_DIR_LENGTH;
|
|
3606
3867
|
directoryDataOffset = reader.size - directoryDataLength - END_OF_CENTRAL_DIR_LENGTH;
|
|
@@ -3615,8 +3876,11 @@
|
|
|
3615
3876
|
let directoryArray = await readUint8Array(reader, directoryDataOffset, directoryDataLength, diskNumber);
|
|
3616
3877
|
let directoryView = getDataView$1(directoryArray);
|
|
3617
3878
|
if (directoryDataLength) {
|
|
3618
|
-
|
|
3619
|
-
|
|
3879
|
+
if (directoryArray.length < 4) {
|
|
3880
|
+
throw new Error(ERR_BAD_FORMAT);
|
|
3881
|
+
}
|
|
3882
|
+
const expectedDirectoryDataOffset = centralDirectoryEndOffset - directoryDataLength - (reader.lastDiskOffset || 0);
|
|
3883
|
+
if (getUint32(directoryView, offset) != CENTRAL_FILE_HEADER_SIGNATURE && directoryDataOffset != expectedDirectoryDataOffset && diskNumber == lastDiskNumber) {
|
|
3620
3884
|
const originalDirectoryDataOffset = directoryDataOffset;
|
|
3621
3885
|
directoryDataOffset = expectedDirectoryDataOffset;
|
|
3622
3886
|
if (directoryDataOffset > originalDirectoryDataOffset) {
|
|
@@ -3626,8 +3890,8 @@
|
|
|
3626
3890
|
directoryView = getDataView$1(directoryArray);
|
|
3627
3891
|
}
|
|
3628
3892
|
}
|
|
3629
|
-
const expectedDirectoryDataLength =
|
|
3630
|
-
if (directoryDataLength != expectedDirectoryDataLength && expectedDirectoryDataLength >= 0) {
|
|
3893
|
+
const expectedDirectoryDataLength = centralDirectoryEndOffset - directoryDataOffset - (reader.lastDiskOffset || 0);
|
|
3894
|
+
if (directoryDataLength != expectedDirectoryDataLength && expectedDirectoryDataLength >= 0 && diskNumber == lastDiskNumber) {
|
|
3631
3895
|
directoryDataLength = expectedDirectoryDataLength;
|
|
3632
3896
|
directoryArray = await readUint8Array(reader, directoryDataOffset, directoryDataLength, diskNumber);
|
|
3633
3897
|
directoryView = getDataView$1(directoryArray);
|
|
@@ -3635,16 +3899,19 @@
|
|
|
3635
3899
|
if (directoryDataOffset < 0 || directoryDataOffset >= reader.size) {
|
|
3636
3900
|
throw new Error(ERR_BAD_FORMAT);
|
|
3637
3901
|
}
|
|
3902
|
+
startOffset = directoryDataOffset;
|
|
3638
3903
|
const filenameEncoding = getOptionValue$1(zipReader, options, OPTION_FILENAME_ENCODING);
|
|
3639
3904
|
const commentEncoding = getOptionValue$1(zipReader, options, OPTION_COMMENT_ENCODING);
|
|
3905
|
+
const filenames = checkAmbiguity ? new Set() : UNDEFINED_VALUE;
|
|
3906
|
+
let duplicateFilename;
|
|
3640
3907
|
for (let indexFile = 0; indexFile < filesLength; indexFile++) {
|
|
3641
3908
|
const fileEntry = new ZipEntry(reader, config, zipReader.options);
|
|
3642
|
-
if (getUint32(directoryView, offset) != CENTRAL_FILE_HEADER_SIGNATURE) {
|
|
3909
|
+
if (offset + CENTRAL_FILE_HEADER_LENGTH > directoryArray.length || getUint32(directoryView, offset) != CENTRAL_FILE_HEADER_SIGNATURE) {
|
|
3643
3910
|
throw new Error(ERR_CENTRAL_DIRECTORY_NOT_FOUND);
|
|
3644
3911
|
}
|
|
3645
3912
|
readCommonHeader(fileEntry, directoryView, offset + 6);
|
|
3646
3913
|
const languageEncodingFlag = Boolean(fileEntry.bitFlag.languageEncodingFlag);
|
|
3647
|
-
const filenameOffset = offset +
|
|
3914
|
+
const filenameOffset = offset + CENTRAL_FILE_HEADER_LENGTH;
|
|
3648
3915
|
const extraFieldOffset = filenameOffset + fileEntry.filenameLength;
|
|
3649
3916
|
const commentOffset = extraFieldOffset + fileEntry.extraFieldLength;
|
|
3650
3917
|
const versionMadeBy = getUint16(directoryView, offset + 4);
|
|
@@ -3665,7 +3932,7 @@
|
|
|
3665
3932
|
directory: Boolean(msdosAttributesRaw & FILE_ATTR_MSDOS_DIR_MASK),
|
|
3666
3933
|
archive: Boolean(msdosAttributesRaw & FILE_ATTR_MSDOS_ARCHIVE_MASK)
|
|
3667
3934
|
};
|
|
3668
|
-
const offsetFileEntry = getUint32(directoryView, offset + 42)
|
|
3935
|
+
const offsetFileEntry = getUint32(directoryView, offset + 42);
|
|
3669
3936
|
const decode = getOptionValue$1(zipReader, options, OPTION_DECODE_TEXT) || decodeText;
|
|
3670
3937
|
const rawFilenameEncoding = filenameUTF8 ? CHARSET_UTF8 : filenameEncoding || CHARSET_CP437;
|
|
3671
3938
|
const rawCommentEncoding = commentUTF8 ? CHARSET_UTF8 : commentEncoding || CHARSET_CP437;
|
|
@@ -3678,6 +3945,7 @@
|
|
|
3678
3945
|
comment = decodeText(rawComment, rawCommentEncoding);
|
|
3679
3946
|
}
|
|
3680
3947
|
Object.assign(fileEntry, {
|
|
3948
|
+
index: indexFile,
|
|
3681
3949
|
versionMadeBy,
|
|
3682
3950
|
msDosCompatible,
|
|
3683
3951
|
compressedSize: 0,
|
|
@@ -3697,8 +3965,15 @@
|
|
|
3697
3965
|
filename,
|
|
3698
3966
|
comment
|
|
3699
3967
|
});
|
|
3700
|
-
startOffset = Math.max(offsetFileEntry, startOffset);
|
|
3701
3968
|
readCommonFooter(fileEntry, fileEntry, directoryView, offset + 6);
|
|
3969
|
+
fileEntry.offset += prependedDataLength;
|
|
3970
|
+
startOffset = Math.min(fileEntry.offset, startOffset);
|
|
3971
|
+
if (checkAmbiguity) {
|
|
3972
|
+
if (filenames.has(fileEntry.filename)) {
|
|
3973
|
+
duplicateFilename = true;
|
|
3974
|
+
}
|
|
3975
|
+
filenames.add(fileEntry.filename);
|
|
3976
|
+
}
|
|
3702
3977
|
const unixExternalUpper = (fileEntry.externalFileAttributes >> 16) & MAX_16_BITS;
|
|
3703
3978
|
if (fileEntry.unixMode === UNDEFINED_VALUE && (unixExternalUpper & (FILE_ATTR_UNIX_DEFAULT_MASK | FILE_ATTR_UNIX_EXECUTABLE_MASK | FILE_ATTR_UNIX_TYPE_DIR)) != 0) {
|
|
3704
3979
|
fileEntry.unixMode = unixExternalUpper;
|
|
@@ -3719,7 +3994,7 @@
|
|
|
3719
3994
|
internalFileAttribute: fileEntry.internalFileAttributes,
|
|
3720
3995
|
externalFileAttribute: fileEntry.externalFileAttributes,
|
|
3721
3996
|
executable,
|
|
3722
|
-
directory: modeIsDir || upperIsDir || (msDosCompatible && msdosAttributes.directory) || (filename.endsWith(DIRECTORY_SIGNATURE) && !fileEntry.uncompressedSize),
|
|
3997
|
+
directory: modeIsDir || upperIsDir || (msDosCompatible && msdosAttributes.directory) || (fileEntry.filename.endsWith(DIRECTORY_SIGNATURE) && !fileEntry.uncompressedSize),
|
|
3723
3998
|
zipCrypto: fileEntry.encrypted && !fileEntry.extraFieldAES
|
|
3724
3999
|
});
|
|
3725
4000
|
const entry = new Entry(fileEntry);
|
|
@@ -3742,6 +4017,15 @@
|
|
|
3742
4017
|
}
|
|
3743
4018
|
yield entry;
|
|
3744
4019
|
}
|
|
4020
|
+
if (checkAmbiguity && offset != declaredDirectoryDataLength) {
|
|
4021
|
+
throwAmbiguousArchive("trailing central directory data");
|
|
4022
|
+
}
|
|
4023
|
+
if (duplicateFilename) {
|
|
4024
|
+
throwAmbiguousArchive("duplicate filename");
|
|
4025
|
+
}
|
|
4026
|
+
if (checkAmbiguity && (prependedDataLength || (filesLength && startOffset > 0))) {
|
|
4027
|
+
throwAmbiguousArchive("prepended data");
|
|
4028
|
+
}
|
|
3745
4029
|
const extractPrependedData = getOptionValue$1(zipReader, options, OPTION_EXTRACT_PREPENDED_DATA);
|
|
3746
4030
|
const extractAppendedData = getOptionValue$1(zipReader, options, OPTION_EXTRACT_APPENDED_DATA);
|
|
3747
4031
|
if (extractPrependedData) {
|
|
@@ -3781,9 +4065,21 @@
|
|
|
3781
4065
|
readable: (function () {
|
|
3782
4066
|
const { readable, writable } = new TransformStream();
|
|
3783
4067
|
if (value.getData) {
|
|
3784
|
-
|
|
4068
|
+
getData();
|
|
3785
4069
|
return readable;
|
|
3786
4070
|
}
|
|
4071
|
+
|
|
4072
|
+
async function getData() {
|
|
4073
|
+
try {
|
|
4074
|
+
await value.getData(writable);
|
|
4075
|
+
} catch (error) {
|
|
4076
|
+
try {
|
|
4077
|
+
await writable.abort(error);
|
|
4078
|
+
} catch {
|
|
4079
|
+
// ignored
|
|
4080
|
+
}
|
|
4081
|
+
}
|
|
4082
|
+
}
|
|
3787
4083
|
})()
|
|
3788
4084
|
};
|
|
3789
4085
|
delete chunk.getData;
|
|
@@ -3808,6 +4104,7 @@
|
|
|
3808
4104
|
const zipEntry = this;
|
|
3809
4105
|
const {
|
|
3810
4106
|
reader,
|
|
4107
|
+
index,
|
|
3811
4108
|
offset,
|
|
3812
4109
|
diskNumberStart,
|
|
3813
4110
|
extraFieldAES,
|
|
@@ -3833,27 +4130,42 @@
|
|
|
3833
4130
|
rawPassword = rawPassword && rawPassword.length && rawPassword;
|
|
3834
4131
|
if (extraFieldAES) {
|
|
3835
4132
|
if (extraFieldAES.originalCompressionMethod != COMPRESSION_METHOD_AES) {
|
|
3836
|
-
throw new Error(ERR_UNSUPPORTED_COMPRESSION);
|
|
4133
|
+
throw new Error(ERR_UNSUPPORTED_COMPRESSION$1);
|
|
3837
4134
|
}
|
|
3838
4135
|
}
|
|
3839
4136
|
if ((compressionMethod != COMPRESSION_METHOD_STORE && compressionMethod != COMPRESSION_METHOD_DEFLATE && compressionMethod != COMPRESSION_METHOD_DEFLATE_64) && !passThrough) {
|
|
3840
|
-
throw new Error(ERR_UNSUPPORTED_COMPRESSION);
|
|
4137
|
+
throw new Error(ERR_UNSUPPORTED_COMPRESSION$1);
|
|
3841
4138
|
}
|
|
3842
|
-
if (getUint32(dataView, 0) != LOCAL_FILE_HEADER_SIGNATURE) {
|
|
4139
|
+
if (dataArray.length < HEADER_SIZE || getUint32(dataView, 0) != LOCAL_FILE_HEADER_SIGNATURE) {
|
|
3843
4140
|
throw new Error(ERR_LOCAL_FILE_HEADER_NOT_FOUND);
|
|
3844
4141
|
}
|
|
3845
4142
|
readCommonHeader(localDirectory, dataView, 4);
|
|
3846
4143
|
const {
|
|
3847
4144
|
extraFieldLength,
|
|
3848
|
-
filenameLength
|
|
3849
|
-
lastAccessDate,
|
|
3850
|
-
creationDate
|
|
4145
|
+
filenameLength
|
|
3851
4146
|
} = localDirectory;
|
|
3852
|
-
|
|
3853
|
-
|
|
3854
|
-
|
|
4147
|
+
const checkAmbiguity = getOptionValue$1(zipEntry, options, OPTION_CHECK_AMBIGUITY);
|
|
4148
|
+
let rawLocalFilename = new Uint8Array();
|
|
4149
|
+
if (checkAmbiguity && (filenameLength || extraFieldLength)) {
|
|
4150
|
+
const trailingDataArray = await readUint8Array(reader, offset + HEADER_SIZE, filenameLength + extraFieldLength, diskNumberStart);
|
|
4151
|
+
rawLocalFilename = trailingDataArray.subarray(0, filenameLength);
|
|
4152
|
+
localDirectory.rawExtraField = trailingDataArray.subarray(filenameLength);
|
|
4153
|
+
} else {
|
|
4154
|
+
localDirectory.rawExtraField = extraFieldLength ?
|
|
4155
|
+
await readUint8Array(reader, offset + HEADER_SIZE + filenameLength, extraFieldLength, diskNumberStart) :
|
|
4156
|
+
new Uint8Array();
|
|
4157
|
+
}
|
|
3855
4158
|
readCommonFooter(zipEntry, localDirectory, dataView, 4, true);
|
|
3856
|
-
|
|
4159
|
+
if (checkAmbiguity) {
|
|
4160
|
+
checkLocalDirectory(zipEntry, localDirectory, rawLocalFilename);
|
|
4161
|
+
}
|
|
4162
|
+
const { lastAccessDate, creationDate } = localDirectory;
|
|
4163
|
+
if (lastAccessDate) {
|
|
4164
|
+
fileEntry.lastAccessDate = lastAccessDate;
|
|
4165
|
+
}
|
|
4166
|
+
if (creationDate) {
|
|
4167
|
+
fileEntry.creationDate = creationDate;
|
|
4168
|
+
}
|
|
3857
4169
|
const encrypted = zipEntry.encrypted && localDirectory.encrypted && !passThrough;
|
|
3858
4170
|
const zipCrypto = encrypted && !extraFieldAES;
|
|
3859
4171
|
if (!passThrough) {
|
|
@@ -3899,7 +4211,7 @@
|
|
|
3899
4211
|
outputSize: passThrough ? compressedSize : uncompressedSize,
|
|
3900
4212
|
signature,
|
|
3901
4213
|
compressed: compressionMethod != 0 && !passThrough,
|
|
3902
|
-
encrypted
|
|
4214
|
+
encrypted,
|
|
3903
4215
|
useWebWorkers: getOptionValue$1(zipEntry, options, OPTION_USE_WEB_WORKERS),
|
|
3904
4216
|
useCompressionStream,
|
|
3905
4217
|
transferStreams: getOptionValue$1(zipEntry, options, OPTION_TRANSFER_STREAMS),
|
|
@@ -3913,6 +4225,7 @@
|
|
|
3913
4225
|
await detectOverlappingEntry({
|
|
3914
4226
|
reader,
|
|
3915
4227
|
fileEntry,
|
|
4228
|
+
index,
|
|
3916
4229
|
offset,
|
|
3917
4230
|
diskNumberStart,
|
|
3918
4231
|
signature,
|
|
@@ -4015,7 +4328,7 @@
|
|
|
4015
4328
|
directory.extraFieldUnicodeComment = extraFieldUnicodeComment;
|
|
4016
4329
|
}
|
|
4017
4330
|
const extraFieldAES = extraField.get(EXTRAFIELD_TYPE_AES);
|
|
4018
|
-
if (extraFieldAES) {
|
|
4331
|
+
if (extraFieldAES && extraFieldAES.data.length >= 7) {
|
|
4019
4332
|
readExtraFieldAES(extraFieldAES, directory, compressionMethod);
|
|
4020
4333
|
directory.extraFieldAES = extraFieldAES;
|
|
4021
4334
|
} else {
|
|
@@ -4052,19 +4365,23 @@
|
|
|
4052
4365
|
directory.zip64 = true;
|
|
4053
4366
|
const extraFieldView = getDataView$1(extraFieldZip64.data);
|
|
4054
4367
|
const missingProperties = ZIP64_PROPERTIES.filter(([propertyName, max]) => directory[propertyName] == max);
|
|
4368
|
+
const requiredLength = missingProperties.reduce((length, [, max]) => length + ZIP64_EXTRACTION[max].bytes, 0);
|
|
4369
|
+
if (extraFieldZip64.data.length < requiredLength) {
|
|
4370
|
+
throw new Error(ERR_EXTRAFIELD_ZIP64_NOT_FOUND);
|
|
4371
|
+
}
|
|
4055
4372
|
for (let indexMissingProperty = 0, offset = 0; indexMissingProperty < missingProperties.length; indexMissingProperty++) {
|
|
4056
4373
|
const [propertyName, max] = missingProperties[indexMissingProperty];
|
|
4057
|
-
|
|
4058
|
-
|
|
4059
|
-
|
|
4060
|
-
offset += extraction.bytes;
|
|
4061
|
-
} else if (extraFieldZip64[propertyName]) {
|
|
4062
|
-
throw new Error(ERR_EXTRAFIELD_ZIP64_NOT_FOUND);
|
|
4063
|
-
}
|
|
4374
|
+
const extraction = ZIP64_EXTRACTION[max];
|
|
4375
|
+
directory[propertyName] = extraFieldZip64[propertyName] = extraction.getValue(extraFieldView, offset);
|
|
4376
|
+
offset += extraction.bytes;
|
|
4064
4377
|
}
|
|
4065
4378
|
}
|
|
4066
4379
|
|
|
4067
4380
|
function readExtraFieldUnicode(extraFieldUnicode, propertyName, rawPropertyName, directory, fileEntry) {
|
|
4381
|
+
if (extraFieldUnicode.data.length < 5) {
|
|
4382
|
+
extraFieldUnicode.valid = false;
|
|
4383
|
+
return;
|
|
4384
|
+
}
|
|
4068
4385
|
const extraFieldView = getDataView$1(extraFieldUnicode.data);
|
|
4069
4386
|
const crc32 = new Crc32();
|
|
4070
4387
|
crc32.append(fileEntry[rawPropertyName]);
|
|
@@ -4137,32 +4454,30 @@
|
|
|
4137
4454
|
function readExtraFieldUnix(extraField, directory, isInfoZip) {
|
|
4138
4455
|
try {
|
|
4139
4456
|
const view = getDataView$1(new Uint8Array(extraField.data));
|
|
4140
|
-
let
|
|
4141
|
-
|
|
4142
|
-
|
|
4143
|
-
|
|
4144
|
-
|
|
4145
|
-
|
|
4146
|
-
|
|
4147
|
-
|
|
4148
|
-
|
|
4149
|
-
|
|
4150
|
-
|
|
4151
|
-
if (
|
|
4152
|
-
|
|
4153
|
-
|
|
4154
|
-
|
|
4155
|
-
|
|
4156
|
-
|
|
4457
|
+
let uid, gid;
|
|
4458
|
+
if (isInfoZip) {
|
|
4459
|
+
// Info-ZIP New Unix "ux" field (0x7875): version + variable-length uid/gid
|
|
4460
|
+
let offset = 0;
|
|
4461
|
+
const version = getUint8(view, offset++);
|
|
4462
|
+
const uidSize = getUint8(view, offset++);
|
|
4463
|
+
uid = unpackUnixId(extraField.data.subarray(offset, offset + uidSize));
|
|
4464
|
+
offset += uidSize;
|
|
4465
|
+
const gidSize = getUint8(view, offset++);
|
|
4466
|
+
gid = unpackUnixId(extraField.data.subarray(offset, offset + gidSize));
|
|
4467
|
+
Object.assign(extraField, { version, uid, gid });
|
|
4468
|
+
} else if (extraField.data.length >= 4) {
|
|
4469
|
+
// Info-ZIP Unix "Ux" field (0x7855): fixed 2-byte uid + gid (the file mode, if any, is
|
|
4470
|
+
// carried in the external file attributes, not here)
|
|
4471
|
+
uid = getUint16(view, 0);
|
|
4472
|
+
gid = getUint16(view, 2);
|
|
4473
|
+
Object.assign(extraField, { uid, gid });
|
|
4474
|
+
}
|
|
4157
4475
|
if (uid !== UNDEFINED_VALUE) {
|
|
4158
4476
|
directory.uid = uid;
|
|
4159
4477
|
}
|
|
4160
4478
|
if (gid !== UNDEFINED_VALUE) {
|
|
4161
4479
|
directory.gid = gid;
|
|
4162
4480
|
}
|
|
4163
|
-
if (unixMode !== UNDEFINED_VALUE) {
|
|
4164
|
-
directory.unixMode = unixMode;
|
|
4165
|
-
}
|
|
4166
4481
|
} catch {
|
|
4167
4482
|
// ignored
|
|
4168
4483
|
}
|
|
@@ -4176,6 +4491,9 @@
|
|
|
4176
4491
|
}
|
|
4177
4492
|
|
|
4178
4493
|
function readExtraFieldExtendedTimestamp(extraFieldExtendedTimestamp, directory, localDirectory) {
|
|
4494
|
+
if (!extraFieldExtendedTimestamp.data.length) {
|
|
4495
|
+
return;
|
|
4496
|
+
}
|
|
4179
4497
|
const extraFieldView = getDataView$1(extraFieldExtendedTimestamp.data);
|
|
4180
4498
|
const flags = getUint8(extraFieldView, 0);
|
|
4181
4499
|
const timeProperties = [];
|
|
@@ -4201,7 +4519,8 @@
|
|
|
4201
4519
|
timeProperties.forEach((propertyName, indexProperty) => {
|
|
4202
4520
|
if (extraFieldExtendedTimestamp.data.length >= offset + 4) {
|
|
4203
4521
|
const time = getUint32(extraFieldView, offset);
|
|
4204
|
-
|
|
4522
|
+
// the extended timestamp is a signed 32-bit time_t value
|
|
4523
|
+
directory[propertyName] = extraFieldExtendedTimestamp[propertyName] = new Date((time | 0) * 1000);
|
|
4205
4524
|
const rawPropertyName = timeRawProperties[indexProperty];
|
|
4206
4525
|
extraFieldExtendedTimestamp[rawPropertyName] = time;
|
|
4207
4526
|
}
|
|
@@ -4212,6 +4531,7 @@
|
|
|
4212
4531
|
async function detectOverlappingEntry({
|
|
4213
4532
|
reader,
|
|
4214
4533
|
fileEntry,
|
|
4534
|
+
index,
|
|
4215
4535
|
offset,
|
|
4216
4536
|
diskNumberStart,
|
|
4217
4537
|
signature,
|
|
@@ -4223,10 +4543,9 @@
|
|
|
4223
4543
|
readRanges
|
|
4224
4544
|
}) {
|
|
4225
4545
|
let diskOffset = 0;
|
|
4226
|
-
if (diskNumberStart) {
|
|
4227
|
-
for (let indexReader = 0; indexReader < diskNumberStart; indexReader++) {
|
|
4228
|
-
|
|
4229
|
-
diskOffset += diskReader.size;
|
|
4546
|
+
if (diskNumberStart && reader.readers) {
|
|
4547
|
+
for (let indexReader = 0; indexReader < Math.min(diskNumberStart, reader.readers.length); indexReader++) {
|
|
4548
|
+
diskOffset += reader.readers[indexReader].size;
|
|
4230
4549
|
}
|
|
4231
4550
|
}
|
|
4232
4551
|
let dataDescriptorLength = 0;
|
|
@@ -4239,7 +4558,8 @@
|
|
|
4239
4558
|
}
|
|
4240
4559
|
if (dataDescriptorLength) {
|
|
4241
4560
|
const dataDescriptorArray = await readUint8Array(reader, dataOffset + compressedSize, dataDescriptorLength + DATA_DESCRIPTOR_RECORD_SIGNATURE_LENGTH, diskNumberStart);
|
|
4242
|
-
const dataDescriptorSignature =
|
|
4561
|
+
const dataDescriptorSignature = dataDescriptorArray.length == dataDescriptorLength + DATA_DESCRIPTOR_RECORD_SIGNATURE_LENGTH &&
|
|
4562
|
+
getUint32(getDataView$1(dataDescriptorArray), 0) == DATA_DESCRIPTOR_RECORD_SIGNATURE;
|
|
4243
4563
|
if (dataDescriptorSignature) {
|
|
4244
4564
|
const readSignature = getUint32(getDataView$1(dataDescriptorArray), 4);
|
|
4245
4565
|
let readCompressedSize;
|
|
@@ -4264,14 +4584,14 @@
|
|
|
4264
4584
|
end: diskOffset + dataOffset + compressedSize + dataDescriptorLength,
|
|
4265
4585
|
fileEntry
|
|
4266
4586
|
};
|
|
4267
|
-
for (const otherRange of readRanges) {
|
|
4268
|
-
if (
|
|
4587
|
+
for (const [otherIndex, otherRange] of readRanges) {
|
|
4588
|
+
if (otherIndex != index && range.start < otherRange.end && otherRange.start < range.end) {
|
|
4269
4589
|
const error = new Error(ERR_OVERLAPPING_ENTRY);
|
|
4270
4590
|
error.overlappingEntry = otherRange.fileEntry;
|
|
4271
4591
|
throw error;
|
|
4272
4592
|
}
|
|
4273
4593
|
}
|
|
4274
|
-
readRanges.
|
|
4594
|
+
readRanges.set(index, range);
|
|
4275
4595
|
}
|
|
4276
4596
|
|
|
4277
4597
|
async function seekSignature(reader, signature, startOffset, minimumBytes, maximumLength) {
|
|
@@ -4296,6 +4616,35 @@
|
|
|
4296
4616
|
}
|
|
4297
4617
|
}
|
|
4298
4618
|
|
|
4619
|
+
function checkLocalDirectory(zipEntry, localDirectory, rawLocalFilename) {
|
|
4620
|
+
const { rawFilename } = zipEntry;
|
|
4621
|
+
if (rawLocalFilename.length != rawFilename.length ||
|
|
4622
|
+
rawLocalFilename.some((byteValue, indexByte) => byteValue != rawFilename[indexByte])) {
|
|
4623
|
+
throwAmbiguousArchive("mismatched local file header (filename)");
|
|
4624
|
+
}
|
|
4625
|
+
if ((localDirectory.rawBitFlag & BITFLAG_AMBIGUITY_MASK) != (zipEntry.rawBitFlag & BITFLAG_AMBIGUITY_MASK)) {
|
|
4626
|
+
throwAmbiguousArchive("mismatched local file header (general purpose bit flag)");
|
|
4627
|
+
}
|
|
4628
|
+
if (localDirectory.compressionMethod != zipEntry.compressionMethod) {
|
|
4629
|
+
throwAmbiguousArchive("mismatched local file header (compression method)");
|
|
4630
|
+
}
|
|
4631
|
+
// when the data descriptor flag is set, the local signature and sizes are zeroed out; all-zero values are
|
|
4632
|
+
// also tolerated when the flag is clear because some tools produce them (streaming writers predating bit 3)
|
|
4633
|
+
if (!localDirectory.bitFlag.dataDescriptor &&
|
|
4634
|
+
(localDirectory.signature || localDirectory.compressedSize || localDirectory.uncompressedSize) &&
|
|
4635
|
+
(localDirectory.signature != zipEntry.signature ||
|
|
4636
|
+
localDirectory.compressedSize != zipEntry.compressedSize ||
|
|
4637
|
+
localDirectory.uncompressedSize != zipEntry.uncompressedSize)) {
|
|
4638
|
+
throwAmbiguousArchive("mismatched local file header (signature or sizes)");
|
|
4639
|
+
}
|
|
4640
|
+
}
|
|
4641
|
+
|
|
4642
|
+
function throwAmbiguousArchive(reason) {
|
|
4643
|
+
const error = new Error(ERR_AMBIGUOUS_ARCHIVE);
|
|
4644
|
+
error.reason = reason;
|
|
4645
|
+
throw error;
|
|
4646
|
+
}
|
|
4647
|
+
|
|
4299
4648
|
function getOptionValue$1(zipReader, options, name) {
|
|
4300
4649
|
return options[name] === UNDEFINED_VALUE ? zipReader.options[name] : options[name];
|
|
4301
4650
|
}
|
|
@@ -4334,7 +4683,7 @@
|
|
|
4334
4683
|
}
|
|
4335
4684
|
|
|
4336
4685
|
function getDataView$1(array) {
|
|
4337
|
-
return new DataView(array.buffer);
|
|
4686
|
+
return new DataView(array.buffer, array.byteOffset, array.byteLength);
|
|
4338
4687
|
}
|
|
4339
4688
|
|
|
4340
4689
|
/*
|
|
@@ -4374,13 +4723,19 @@
|
|
|
4374
4723
|
const ERR_INVALID_ENCRYPTION_STRENGTH = "The strength must equal 1, 2, or 3";
|
|
4375
4724
|
const ERR_INVALID_EXTRAFIELD_TYPE = "Extra field type exceeds 65535";
|
|
4376
4725
|
const ERR_INVALID_EXTRAFIELD_DATA = "Extra field data exceeds 64KB";
|
|
4726
|
+
// same message as the constant exported by zip-reader.js
|
|
4727
|
+
const ERR_UNSUPPORTED_COMPRESSION = "Compression method not supported";
|
|
4728
|
+
const MIN_UNIX_TIME = -2147483648;
|
|
4729
|
+
const MAX_UNIX_TIME = 2147483647;
|
|
4377
4730
|
const ERR_UNSUPPORTED_FORMAT = "Zip64 is not supported (set the 'zip64' option to 'true')";
|
|
4378
4731
|
const ERR_UNDEFINED_UNCOMPRESSED_SIZE = "Undefined uncompressed size";
|
|
4732
|
+
const ERR_UNDEFINED_READER = "Undefined reader";
|
|
4379
4733
|
const ERR_ZIP_NOT_EMPTY = "Zip file not empty";
|
|
4380
4734
|
const ERR_INVALID_UID = "Invalid uid (must be integer 0..2^32-1)";
|
|
4381
4735
|
const ERR_INVALID_GID = "Invalid gid (must be integer 0..2^32-1)";
|
|
4382
4736
|
const ERR_INVALID_UNIX_MODE = "Invalid UNIX mode (must be integer 0..65535)";
|
|
4383
4737
|
const ERR_INVALID_UNIX_EXTRA_FIELD_TYPE = "Invalid unixExtraFieldType (must be 'infozip' or 'unix')";
|
|
4738
|
+
const ERR_INVALID_UNIX_ID_SIZE = "uid/gid must be 0..65535 for unixExtraFieldType 'unix' (use 'infozip' for larger ids)";
|
|
4384
4739
|
const ERR_INVALID_MSDOS_ATTRIBUTES = "Invalid msdosAttributesRaw (must be integer 0..255)";
|
|
4385
4740
|
const ERR_INVALID_MSDOS_DATA = "Invalid msdosAttributes (must be an object with boolean flags)";
|
|
4386
4741
|
|
|
@@ -4406,9 +4761,10 @@
|
|
|
4406
4761
|
files: new Map(),
|
|
4407
4762
|
filenames: new Set(),
|
|
4408
4763
|
offset: options[OPTION_OFFSET] === UNDEFINED_VALUE ? writer.size || writer.writable.size || 0 : options[OPTION_OFFSET],
|
|
4409
|
-
|
|
4764
|
+
initialOffset: options[OPTION_OFFSET] === UNDEFINED_VALUE ? 0 : options[OPTION_OFFSET] - (writer.size || writer.writable.size || 0),
|
|
4410
4765
|
pendingAddFileCalls: new Set(),
|
|
4411
|
-
bufferedWrites: 0
|
|
4766
|
+
bufferedWrites: 0,
|
|
4767
|
+
lastFileEntry: UNDEFINED_VALUE
|
|
4412
4768
|
});
|
|
4413
4769
|
}
|
|
4414
4770
|
|
|
@@ -4417,17 +4773,18 @@
|
|
|
4417
4773
|
throw new Error(ERR_ZIP_NOT_EMPTY);
|
|
4418
4774
|
}
|
|
4419
4775
|
reader = new GenericReader(reader);
|
|
4776
|
+
await initStream(reader);
|
|
4420
4777
|
const zipReader = new ZipReader(reader.readable);
|
|
4421
4778
|
const entries = await zipReader.getEntries();
|
|
4422
4779
|
await zipReader.close();
|
|
4780
|
+
await initStream(this.writer);
|
|
4423
4781
|
await reader.readable.pipeTo(this.writer.writable, { preventClose: true, preventAbort: true });
|
|
4424
4782
|
this.writer.size = this.offset = reader.size;
|
|
4425
4783
|
this.filenames = new Set(entries.map(entry => entry.filename));
|
|
4426
4784
|
this.files = new Map(entries.map(entry => {
|
|
4427
4785
|
const {
|
|
4428
4786
|
version,
|
|
4429
|
-
|
|
4430
|
-
lastModDate,
|
|
4787
|
+
rawLastModDate,
|
|
4431
4788
|
lastAccessDate,
|
|
4432
4789
|
creationDate,
|
|
4433
4790
|
rawFilename,
|
|
@@ -4440,6 +4797,7 @@
|
|
|
4440
4797
|
zip64
|
|
4441
4798
|
} = entry;
|
|
4442
4799
|
let {
|
|
4800
|
+
compressionMethod,
|
|
4443
4801
|
rawExtraFieldZip64,
|
|
4444
4802
|
rawExtraFieldAES,
|
|
4445
4803
|
rawExtraFieldExtendedTimestamp,
|
|
@@ -4452,31 +4810,39 @@
|
|
|
4452
4810
|
rawExtraFieldAES = rawExtraFieldAES || new Uint8Array();
|
|
4453
4811
|
rawExtraFieldExtendedTimestamp = rawExtraFieldExtendedTimestamp || new Uint8Array();
|
|
4454
4812
|
rawExtraFieldNTFS = rawExtraFieldNTFS || new Uint8Array();
|
|
4455
|
-
rawExtraFieldUnix =
|
|
4813
|
+
rawExtraFieldUnix = rawExtraFieldUnix || new Uint8Array();
|
|
4456
4814
|
rawExtraField = rawExtraField || new Uint8Array();
|
|
4815
|
+
if (entry.extraFieldAES) {
|
|
4816
|
+
compressionMethod = COMPRESSION_METHOD_AES;
|
|
4817
|
+
}
|
|
4457
4818
|
const extraFieldLength = getLength(rawExtraFieldZip64, rawExtraFieldAES, rawExtraFieldExtendedTimestamp, rawExtraFieldNTFS, rawExtraFieldUnix, rawExtraField);
|
|
4458
|
-
const zip64UncompressedSize = zip64 && uncompressedSize
|
|
4459
|
-
const zip64CompressedSize = zip64 && compressedSize
|
|
4819
|
+
const zip64UncompressedSize = zip64 && uncompressedSize >= MAX_32_BITS;
|
|
4820
|
+
const zip64CompressedSize = zip64 && compressedSize >= MAX_32_BITS;
|
|
4821
|
+
const bitFlagValue = (getBitFlag(level, languageEncodingFlag, dataDescriptor, encrypted, compressionMethod) & ~BITFLAG_LEVEL) | (level << 1);
|
|
4460
4822
|
const {
|
|
4461
4823
|
headerArray,
|
|
4462
4824
|
headerView
|
|
4463
4825
|
} = getHeaderArrayData({
|
|
4464
4826
|
version,
|
|
4465
|
-
bitFlag:
|
|
4827
|
+
bitFlag: bitFlagValue,
|
|
4466
4828
|
compressionMethod,
|
|
4467
4829
|
uncompressedSize,
|
|
4468
4830
|
compressedSize,
|
|
4469
|
-
|
|
4831
|
+
rawLastModDate,
|
|
4470
4832
|
rawFilename,
|
|
4471
4833
|
zip64CompressedSize,
|
|
4472
4834
|
zip64UncompressedSize,
|
|
4473
4835
|
extraFieldLength
|
|
4474
4836
|
});
|
|
4837
|
+
const { signature } = entry;
|
|
4838
|
+
if (signature !== UNDEFINED_VALUE) {
|
|
4839
|
+
setUint32(headerView, HEADER_OFFSET_SIGNATURE, signature);
|
|
4840
|
+
}
|
|
4475
4841
|
Object.assign(entry, {
|
|
4476
4842
|
zip64UncompressedSize,
|
|
4477
4843
|
zip64CompressedSize,
|
|
4478
|
-
zip64Offset: zip64 && this.offset - diskOffset
|
|
4479
|
-
zip64DiskNumberStart: zip64 && diskNumber
|
|
4844
|
+
zip64Offset: zip64 && this.offset - diskOffset >= MAX_32_BITS,
|
|
4845
|
+
zip64DiskNumberStart: zip64 && diskNumber >= MAX_16_BITS,
|
|
4480
4846
|
rawExtraFieldZip64,
|
|
4481
4847
|
rawExtraFieldAES,
|
|
4482
4848
|
rawExtraFieldExtendedTimestamp,
|
|
@@ -4494,6 +4860,7 @@
|
|
|
4494
4860
|
|
|
4495
4861
|
async add(name = "", reader, options = {}) {
|
|
4496
4862
|
const zipWriter = this;
|
|
4863
|
+
options = Object.assign({}, options);
|
|
4497
4864
|
const {
|
|
4498
4865
|
pendingAddFileCalls,
|
|
4499
4866
|
config
|
|
@@ -4504,17 +4871,24 @@
|
|
|
4504
4871
|
await new Promise(resolve => pendingEntries.push(resolve));
|
|
4505
4872
|
}
|
|
4506
4873
|
let promiseAddFile;
|
|
4874
|
+
let nameAdded;
|
|
4507
4875
|
try {
|
|
4508
4876
|
name = name.trim();
|
|
4877
|
+
if (getOptionValue(zipWriter, options, PROPERTY_NAME_DIRECTORY) && !name.endsWith(DIRECTORY_SIGNATURE)) {
|
|
4878
|
+
name += DIRECTORY_SIGNATURE;
|
|
4879
|
+
}
|
|
4509
4880
|
if (zipWriter.filenames.has(name)) {
|
|
4510
4881
|
throw new Error(ERR_DUPLICATED_NAME);
|
|
4511
4882
|
}
|
|
4512
4883
|
zipWriter.filenames.add(name);
|
|
4884
|
+
nameAdded = true;
|
|
4513
4885
|
promiseAddFile = addFile(zipWriter, name, reader, options);
|
|
4514
4886
|
pendingAddFileCalls.add(promiseAddFile);
|
|
4515
4887
|
return await promiseAddFile;
|
|
4516
4888
|
} catch (error) {
|
|
4517
|
-
|
|
4889
|
+
if (nameAdded) {
|
|
4890
|
+
zipWriter.filenames.delete(name);
|
|
4891
|
+
}
|
|
4518
4892
|
throw error;
|
|
4519
4893
|
} finally {
|
|
4520
4894
|
pendingAddFileCalls.delete(promiseAddFile);
|
|
@@ -4547,6 +4921,9 @@
|
|
|
4547
4921
|
const zipWriter = this;
|
|
4548
4922
|
const { pendingAddFileCalls, writer } = this;
|
|
4549
4923
|
const { writable } = writer;
|
|
4924
|
+
if (getLength(comment) > MAX_16_BITS) {
|
|
4925
|
+
throw new Error(ERR_INVALID_COMMENT);
|
|
4926
|
+
}
|
|
4550
4927
|
while (pendingAddFileCalls.size) {
|
|
4551
4928
|
await Promise.allSettled(Array.from(pendingAddFileCalls));
|
|
4552
4929
|
}
|
|
@@ -4565,28 +4942,94 @@
|
|
|
4565
4942
|
const { readable, writable } = new TransformStream();
|
|
4566
4943
|
this.readable = readable;
|
|
4567
4944
|
this.zipWriter = new ZipWriter(writable, options);
|
|
4945
|
+
this.pendingAddFileCalls = new Set();
|
|
4568
4946
|
}
|
|
4569
4947
|
|
|
4570
4948
|
transform(path) {
|
|
4949
|
+
const zipWriter = this.zipWriter;
|
|
4950
|
+
let streamController;
|
|
4571
4951
|
const { readable, writable } = new TransformStream({
|
|
4572
|
-
|
|
4952
|
+
start(controller) {
|
|
4953
|
+
streamController = controller;
|
|
4954
|
+
},
|
|
4955
|
+
flush: () => void closeArchive()
|
|
4573
4956
|
});
|
|
4574
|
-
this.zipWriter.add(path, readable);
|
|
4957
|
+
watchAddFileCall(this, this.zipWriter.add(path, readable), error => streamController.error(error));
|
|
4575
4958
|
return { readable: this.readable, writable };
|
|
4959
|
+
|
|
4960
|
+
async function closeArchive() {
|
|
4961
|
+
try {
|
|
4962
|
+
await zipWriter.close();
|
|
4963
|
+
} catch (error) {
|
|
4964
|
+
try {
|
|
4965
|
+
await zipWriter.writer.writable.abort(error);
|
|
4966
|
+
} catch {
|
|
4967
|
+
// ignored
|
|
4968
|
+
}
|
|
4969
|
+
}
|
|
4970
|
+
}
|
|
4576
4971
|
}
|
|
4577
4972
|
|
|
4578
4973
|
writable(path) {
|
|
4579
|
-
|
|
4580
|
-
|
|
4974
|
+
let streamController;
|
|
4975
|
+
const { readable, writable } = new TransformStream({
|
|
4976
|
+
start(controller) {
|
|
4977
|
+
streamController = controller;
|
|
4978
|
+
}
|
|
4979
|
+
});
|
|
4980
|
+
watchAddFileCall(this, this.zipWriter.add(path, readable), error => streamController.error(error));
|
|
4581
4981
|
return writable;
|
|
4582
4982
|
}
|
|
4583
4983
|
|
|
4584
|
-
close(comment = UNDEFINED_VALUE, options = {}) {
|
|
4984
|
+
async close(comment = UNDEFINED_VALUE, options = {}) {
|
|
4985
|
+
await Promise.all(Array.from(this.pendingAddFileCalls));
|
|
4585
4986
|
return this.zipWriter.close(comment, options);
|
|
4586
4987
|
}
|
|
4587
4988
|
}
|
|
4588
4989
|
|
|
4990
|
+
function watchAddFileCall(zipWriterStream, promiseAddFile, onerror) {
|
|
4991
|
+
zipWriterStream.pendingAddFileCalls.add(promiseAddFile);
|
|
4992
|
+
promiseAddFile.catch(error => {
|
|
4993
|
+
try {
|
|
4994
|
+
onerror(error);
|
|
4995
|
+
} catch {
|
|
4996
|
+
// ignored
|
|
4997
|
+
}
|
|
4998
|
+
});
|
|
4999
|
+
}
|
|
5000
|
+
|
|
4589
5001
|
async function addFile(zipWriter, name, reader, options) {
|
|
5002
|
+
const attributesInfo = resolveAttributes(zipWriter, name, options);
|
|
5003
|
+
({ name } = attributesInfo);
|
|
5004
|
+
const metadataInfo = resolveMetadata(zipWriter, name, options);
|
|
5005
|
+
const { comment } = metadataInfo;
|
|
5006
|
+
const extraField = options[PROPERTY_NAME_EXTRA_FIELD];
|
|
5007
|
+
zipWriter.files.set(name, UNDEFINED_VALUE);
|
|
5008
|
+
let fileEntry;
|
|
5009
|
+
try {
|
|
5010
|
+
const sizesInfo = await resolveSizes(zipWriter, reader, metadataInfo, options);
|
|
5011
|
+
({ reader } = sizesInfo);
|
|
5012
|
+
const { diskOffset, diskNumber } = zipWriter.writer;
|
|
5013
|
+
options = Object.assign({}, options, attributesInfo.resolvedOptions, metadataInfo.resolvedOptions, sizesInfo.resolvedOptions, {
|
|
5014
|
+
internalFileAttribute: metadataInfo.resolvedOptions.internalFileAttributes,
|
|
5015
|
+
externalFileAttribute: attributesInfo.resolvedOptions.externalFileAttributes,
|
|
5016
|
+
signature: options[PROPERTY_NAME_SIGNATURE],
|
|
5017
|
+
offset: zipWriter.offset - diskOffset,
|
|
5018
|
+
diskNumberStart: diskNumber
|
|
5019
|
+
});
|
|
5020
|
+
const headerInfo = getHeaderInfo(options);
|
|
5021
|
+
const dataDescriptorInfo = getDataDescriptorInfo(options);
|
|
5022
|
+
const metadataSize = getLength(headerInfo.localHeaderArray, dataDescriptorInfo.dataDescriptorArray);
|
|
5023
|
+
fileEntry = await getFileEntry(zipWriter, name, reader, { headerInfo, dataDescriptorInfo, metadataSize }, options);
|
|
5024
|
+
} catch (error) {
|
|
5025
|
+
zipWriter.files.delete(name);
|
|
5026
|
+
throw error;
|
|
5027
|
+
}
|
|
5028
|
+
Object.assign(fileEntry, { name, comment, extraField });
|
|
5029
|
+
return new Entry(fileEntry);
|
|
5030
|
+
}
|
|
5031
|
+
|
|
5032
|
+
function resolveAttributes(zipWriter, name, options) {
|
|
4590
5033
|
name = name.trim();
|
|
4591
5034
|
let msDosCompatible = getOptionValue(zipWriter, options, PROPERTY_NAME_MS_DOS_COMPATIBLE);
|
|
4592
5035
|
let versionMadeBy = getOptionValue(zipWriter, options, PROPERTY_NAME_VERSION_MADE_BY, msDosCompatible ? 20 : 768);
|
|
@@ -4594,7 +5037,7 @@
|
|
|
4594
5037
|
const uid = getOptionValue(zipWriter, options, PROPERTY_NAME_UID);
|
|
4595
5038
|
const gid = getOptionValue(zipWriter, options, PROPERTY_NAME_GID);
|
|
4596
5039
|
let unixMode = getOptionValue(zipWriter, options, PROPERTY_NAME_UNIX_MODE);
|
|
4597
|
-
|
|
5040
|
+
let unixExtraFieldType = getOptionValue(zipWriter, options, OPTION_UNIX_EXTRA_FIELD_TYPE);
|
|
4598
5041
|
let setuid = getOptionValue(zipWriter, options, PROPERTY_NAME_SETUID);
|
|
4599
5042
|
let setgid = getOptionValue(zipWriter, options, PROPERTY_NAME_SETGID);
|
|
4600
5043
|
let sticky = getOptionValue(zipWriter, options, PROPERTY_NAME_STICKY);
|
|
@@ -4610,6 +5053,13 @@
|
|
|
4610
5053
|
if (unixExtraFieldType !== UNDEFINED_VALUE && unixExtraFieldType !== INFOZIP_EXTRA_FIELD_TYPE && unixExtraFieldType !== UNIX_EXTRA_FIELD_TYPE) {
|
|
4611
5054
|
throw new Error(ERR_INVALID_UNIX_EXTRA_FIELD_TYPE);
|
|
4612
5055
|
}
|
|
5056
|
+
if (unixExtraFieldType === UNIX_EXTRA_FIELD_TYPE &&
|
|
5057
|
+
((uid !== UNDEFINED_VALUE && uid > MAX_16_BITS) || (gid !== UNDEFINED_VALUE && gid > MAX_16_BITS))) {
|
|
5058
|
+
throw new Error(ERR_INVALID_UNIX_ID_SIZE);
|
|
5059
|
+
}
|
|
5060
|
+
if (unixExtraFieldType === UNDEFINED_VALUE && (uid !== UNDEFINED_VALUE || gid !== UNDEFINED_VALUE)) {
|
|
5061
|
+
unixExtraFieldType = INFOZIP_EXTRA_FIELD_TYPE;
|
|
5062
|
+
}
|
|
4613
5063
|
let msdosAttributesRaw = getOptionValue(zipWriter, options, PROPERTY_NAME_MSDOS_ATTRIBUTES_RAW);
|
|
4614
5064
|
let msdosAttributes = getOptionValue(zipWriter, options, PROPERTY_NAME_MSDOS_ATTRIBUTES);
|
|
4615
5065
|
const hasUnixMetadata = uid !== UNDEFINED_VALUE || gid !== UNDEFINED_VALUE || unixMode !== UNDEFINED_VALUE || unixExtraFieldType;
|
|
@@ -4680,6 +5130,27 @@
|
|
|
4680
5130
|
if (hasMsDosProvided) {
|
|
4681
5131
|
externalFileAttributes = (externalFileAttributes & MAX_32_BITS) | (msdosAttributesRaw & MAX_8_BITS);
|
|
4682
5132
|
}
|
|
5133
|
+
return {
|
|
5134
|
+
name,
|
|
5135
|
+
resolvedOptions: {
|
|
5136
|
+
versionMadeBy,
|
|
5137
|
+
msDosCompatible,
|
|
5138
|
+
externalFileAttributes,
|
|
5139
|
+
unixExternalUpper,
|
|
5140
|
+
uid,
|
|
5141
|
+
gid,
|
|
5142
|
+
unixMode,
|
|
5143
|
+
unixExtraFieldType,
|
|
5144
|
+
setuid,
|
|
5145
|
+
setgid,
|
|
5146
|
+
sticky,
|
|
5147
|
+
msdosAttributesRaw,
|
|
5148
|
+
msdosAttributes
|
|
5149
|
+
}
|
|
5150
|
+
};
|
|
5151
|
+
}
|
|
5152
|
+
|
|
5153
|
+
function resolveMetadata(zipWriter, name, options) {
|
|
4683
5154
|
const encode = getOptionValue(zipWriter, options, OPTION_ENCODE_TEXT, encodeText);
|
|
4684
5155
|
let rawFilename = encode(name);
|
|
4685
5156
|
if (rawFilename === UNDEFINED_VALUE) {
|
|
@@ -4718,10 +5189,14 @@
|
|
|
4718
5189
|
const transferStreams = getOptionValue(zipWriter, options, OPTION_TRANSFER_STREAMS, true);
|
|
4719
5190
|
const bufferedWrite = getOptionValue(zipWriter, options, OPTION_BUFFERED_WRITE);
|
|
4720
5191
|
const createTempStream = getOptionValue(zipWriter, options, OPTION_CREATE_TEMP_STREAM);
|
|
4721
|
-
const dataDescriptorSignature = getOptionValue(zipWriter, options, OPTION_DATA_DESCRIPTOR_SIGNATURE,
|
|
5192
|
+
const dataDescriptorSignature = getOptionValue(zipWriter, options, OPTION_DATA_DESCRIPTOR_SIGNATURE, true);
|
|
4722
5193
|
const signal = getOptionValue(zipWriter, options, OPTION_SIGNAL);
|
|
4723
5194
|
const useUnicodeFileNames = getOptionValue(zipWriter, options, OPTION_USE_UNICODE_FILE_NAMES, true);
|
|
4724
5195
|
const compressionMethod = getOptionValue(zipWriter, options, PROPERTY_NAME_COMPRESSION_METHOD);
|
|
5196
|
+
if (!passThrough && compressionMethod !== UNDEFINED_VALUE &&
|
|
5197
|
+
compressionMethod !== COMPRESSION_METHOD_STORE && compressionMethod !== COMPRESSION_METHOD_DEFLATE) {
|
|
5198
|
+
throw new Error(ERR_UNSUPPORTED_COMPRESSION);
|
|
5199
|
+
}
|
|
4725
5200
|
let level = getOptionValue(zipWriter, options, OPTION_LEVEL);
|
|
4726
5201
|
let useCompressionStream = getOptionValue(zipWriter, options, OPTION_USE_COMPRESSION_STREAM);
|
|
4727
5202
|
let dataDescriptor = getOptionValue(zipWriter, options, OPTION_DATA_DESCRIPTOR);
|
|
@@ -4737,7 +5212,7 @@
|
|
|
4737
5212
|
if (!useCompressionStream && (zipWriter.config.CompressionStream === UNDEFINED_VALUE && zipWriter.config.CompressionStreamZlib === UNDEFINED_VALUE)) {
|
|
4738
5213
|
level = 0;
|
|
4739
5214
|
}
|
|
4740
|
-
|
|
5215
|
+
const zip64 = getOptionValue(zipWriter, options, PROPERTY_NAME_ZIP64);
|
|
4741
5216
|
if (!zipCrypto && (password !== UNDEFINED_VALUE || rawPassword !== UNDEFINED_VALUE) && !(encryptionStrength >= 1 && encryptionStrength <= 3)) {
|
|
4742
5217
|
throw new Error(ERR_INVALID_ENCRYPTION_STRENGTH);
|
|
4743
5218
|
}
|
|
@@ -4748,6 +5223,7 @@
|
|
|
4748
5223
|
let offset = 0;
|
|
4749
5224
|
extraField.forEach(data => extraFieldSize += 4 + getLength(data));
|
|
4750
5225
|
rawExtraField = new Uint8Array(extraFieldSize);
|
|
5226
|
+
const rawExtraFieldView = getDataView(rawExtraField);
|
|
4751
5227
|
extraField.forEach((data, type) => {
|
|
4752
5228
|
if (type > MAX_16_BITS) {
|
|
4753
5229
|
throw new Error(ERR_INVALID_EXTRAFIELD_TYPE);
|
|
@@ -4755,22 +5231,72 @@
|
|
|
4755
5231
|
if (getLength(data) > MAX_16_BITS) {
|
|
4756
5232
|
throw new Error(ERR_INVALID_EXTRAFIELD_DATA);
|
|
4757
5233
|
}
|
|
4758
|
-
|
|
4759
|
-
|
|
5234
|
+
setUint16(rawExtraFieldView, offset, type);
|
|
5235
|
+
setUint16(rawExtraFieldView, offset + 2, getLength(data));
|
|
4760
5236
|
arraySet(rawExtraField, data, offset + 4);
|
|
4761
5237
|
offset += 4 + getLength(data);
|
|
4762
5238
|
});
|
|
4763
5239
|
}
|
|
5240
|
+
return {
|
|
5241
|
+
comment,
|
|
5242
|
+
resolvedOptions: {
|
|
5243
|
+
rawFilename,
|
|
5244
|
+
rawComment,
|
|
5245
|
+
version,
|
|
5246
|
+
lastModDate,
|
|
5247
|
+
lastAccessDate,
|
|
5248
|
+
creationDate,
|
|
5249
|
+
internalFileAttributes,
|
|
5250
|
+
passThrough,
|
|
5251
|
+
password,
|
|
5252
|
+
rawPassword,
|
|
5253
|
+
encryptionStrength,
|
|
5254
|
+
zipCrypto,
|
|
5255
|
+
extendedTimestamp,
|
|
5256
|
+
keepOrder,
|
|
5257
|
+
useWebWorkers,
|
|
5258
|
+
transferStreams,
|
|
5259
|
+
bufferedWrite,
|
|
5260
|
+
createTempStream,
|
|
5261
|
+
dataDescriptorSignature,
|
|
5262
|
+
signal,
|
|
5263
|
+
useUnicodeFileNames,
|
|
5264
|
+
compressionMethod,
|
|
5265
|
+
level,
|
|
5266
|
+
useCompressionStream,
|
|
5267
|
+
dataDescriptor,
|
|
5268
|
+
zip64,
|
|
5269
|
+
rawExtraField
|
|
5270
|
+
}
|
|
5271
|
+
};
|
|
5272
|
+
}
|
|
5273
|
+
|
|
5274
|
+
async function resolveSizes(zipWriter, reader, { resolvedOptions: metadata }, options) {
|
|
5275
|
+
const { passThrough, zipCrypto, password, rawPassword, encryptionStrength } = metadata;
|
|
5276
|
+
let { dataDescriptor, zip64, level, compressionMethod } = metadata;
|
|
4764
5277
|
let maximumCompressedSize = 0;
|
|
4765
|
-
let maximumEntrySize = 0;
|
|
4766
5278
|
let uncompressedSize = 0;
|
|
4767
5279
|
if (passThrough) {
|
|
5280
|
+
// the headers of a passThrough entry describe the payload verbatim: without a
|
|
5281
|
+
// reader they would declare content that is not there
|
|
5282
|
+
if (!reader) {
|
|
5283
|
+
throw new Error(ERR_UNDEFINED_READER);
|
|
5284
|
+
}
|
|
4768
5285
|
uncompressedSize = options[PROPERTY_NAME_UNCOMPRESSED_SIZE];
|
|
4769
5286
|
if (uncompressedSize === UNDEFINED_VALUE) {
|
|
4770
5287
|
throw new Error(ERR_UNDEFINED_UNCOMPRESSED_SIZE);
|
|
4771
5288
|
}
|
|
4772
5289
|
}
|
|
4773
5290
|
const zip64Enabled = zip64 === true;
|
|
5291
|
+
const encrypted = getOptionValue(zipWriter, options, PROPERTY_NAME_ENCRYPTED);
|
|
5292
|
+
// entries without a reader have no payload: write them as empty stored files instead of
|
|
5293
|
+
// declaring a compressed or encrypted content that does not exist
|
|
5294
|
+
const encryptedEntry = Boolean(reader) && (Boolean((password && getLength(password)) || (rawPassword && getLength(rawPassword))) || (passThrough && encrypted));
|
|
5295
|
+
if (!reader) {
|
|
5296
|
+
level = 0;
|
|
5297
|
+
compressionMethod = COMPRESSION_METHOD_STORE;
|
|
5298
|
+
}
|
|
5299
|
+
const encryptionOverhead = encryptedEntry ? (zipCrypto ? 12 : 16 + encryptionStrength * 4) : 0;
|
|
4774
5300
|
if (reader) {
|
|
4775
5301
|
reader = new GenericReader(reader);
|
|
4776
5302
|
await initStream(reader);
|
|
@@ -4783,16 +5309,15 @@
|
|
|
4783
5309
|
}
|
|
4784
5310
|
} else {
|
|
4785
5311
|
options.uncompressedSize = uncompressedSize = reader.size;
|
|
4786
|
-
maximumCompressedSize = getMaximumCompressedSize(uncompressedSize);
|
|
5312
|
+
maximumCompressedSize = getMaximumCompressedSize(uncompressedSize) + encryptionOverhead;
|
|
4787
5313
|
}
|
|
4788
5314
|
} else {
|
|
4789
5315
|
options.uncompressedSize = uncompressedSize;
|
|
4790
|
-
maximumCompressedSize = getMaximumCompressedSize(uncompressedSize);
|
|
5316
|
+
maximumCompressedSize = getMaximumCompressedSize(uncompressedSize) + encryptionOverhead;
|
|
4791
5317
|
}
|
|
4792
5318
|
}
|
|
4793
|
-
const
|
|
4794
|
-
const
|
|
4795
|
-
const zip64CompressedSize = zip64Enabled || maximumCompressedSize > MAX_32_BITS;
|
|
5319
|
+
const zip64UncompressedSize = zip64Enabled || uncompressedSize >= MAX_32_BITS;
|
|
5320
|
+
const zip64CompressedSize = zip64Enabled || maximumCompressedSize >= MAX_32_BITS;
|
|
4796
5321
|
if (zip64UncompressedSize || zip64CompressedSize) {
|
|
4797
5322
|
if (zip64 === false) {
|
|
4798
5323
|
throw new Error(ERR_UNSUPPORTED_FORMAT);
|
|
@@ -4801,73 +5326,19 @@
|
|
|
4801
5326
|
}
|
|
4802
5327
|
}
|
|
4803
5328
|
zip64 = zip64 || false;
|
|
4804
|
-
|
|
4805
|
-
|
|
4806
|
-
|
|
4807
|
-
|
|
4808
|
-
|
|
4809
|
-
|
|
4810
|
-
|
|
4811
|
-
|
|
4812
|
-
|
|
4813
|
-
|
|
4814
|
-
|
|
4815
|
-
|
|
4816
|
-
|
|
4817
|
-
password,
|
|
4818
|
-
rawPassword,
|
|
4819
|
-
level,
|
|
4820
|
-
useWebWorkers,
|
|
4821
|
-
transferStreams,
|
|
4822
|
-
encryptionStrength,
|
|
4823
|
-
extendedTimestamp,
|
|
4824
|
-
zipCrypto,
|
|
4825
|
-
bufferedWrite,
|
|
4826
|
-
createTempStream,
|
|
4827
|
-
keepOrder,
|
|
4828
|
-
useUnicodeFileNames,
|
|
4829
|
-
dataDescriptor,
|
|
4830
|
-
dataDescriptorSignature,
|
|
4831
|
-
signal,
|
|
4832
|
-
msDosCompatible,
|
|
4833
|
-
internalFileAttribute: internalFileAttributes,
|
|
4834
|
-
internalFileAttributes,
|
|
4835
|
-
externalFileAttribute: externalFileAttributes,
|
|
4836
|
-
externalFileAttributes,
|
|
4837
|
-
useCompressionStream,
|
|
4838
|
-
passThrough,
|
|
4839
|
-
encrypted: Boolean((password && getLength(password)) || (rawPassword && getLength(rawPassword))) || (passThrough && encrypted),
|
|
4840
|
-
signature: options[PROPERTY_NAME_SIGNATURE],
|
|
4841
|
-
compressionMethod,
|
|
4842
|
-
uncompressedSize,
|
|
4843
|
-
offset: zipWriter.offset - diskOffset,
|
|
4844
|
-
diskNumberStart: diskNumber,
|
|
4845
|
-
uid,
|
|
4846
|
-
gid,
|
|
4847
|
-
setuid,
|
|
4848
|
-
setgid,
|
|
4849
|
-
sticky,
|
|
4850
|
-
unixMode,
|
|
4851
|
-
msdosAttributesRaw,
|
|
4852
|
-
msdosAttributes,
|
|
4853
|
-
unixExternalUpper
|
|
4854
|
-
});
|
|
4855
|
-
const headerInfo = getHeaderInfo(options);
|
|
4856
|
-
const dataDescriptorInfo = getDataDescriptorInfo(options);
|
|
4857
|
-
const metadataSize = getLength(headerInfo.localHeaderArray, dataDescriptorInfo.dataDescriptorArray);
|
|
4858
|
-
maximumEntrySize = metadataSize + maximumCompressedSize;
|
|
4859
|
-
if (zipWriter.options[OPTION_USDZ]) {
|
|
4860
|
-
maximumEntrySize += maximumEntrySize + 64;
|
|
4861
|
-
}
|
|
4862
|
-
zipWriter.pendingEntriesSize += maximumEntrySize;
|
|
4863
|
-
let fileEntry;
|
|
4864
|
-
try {
|
|
4865
|
-
fileEntry = await getFileEntry(zipWriter, name, reader, { headerInfo, dataDescriptorInfo, metadataSize }, options);
|
|
4866
|
-
} finally {
|
|
4867
|
-
zipWriter.pendingEntriesSize -= maximumEntrySize;
|
|
4868
|
-
}
|
|
4869
|
-
Object.assign(fileEntry, { name, comment, extraField });
|
|
4870
|
-
return new Entry(fileEntry);
|
|
5329
|
+
return {
|
|
5330
|
+
reader,
|
|
5331
|
+
resolvedOptions: {
|
|
5332
|
+
dataDescriptor,
|
|
5333
|
+
zip64,
|
|
5334
|
+
zip64UncompressedSize,
|
|
5335
|
+
zip64CompressedSize,
|
|
5336
|
+
uncompressedSize,
|
|
5337
|
+
level,
|
|
5338
|
+
compressionMethod,
|
|
5339
|
+
encrypted: encryptedEntry
|
|
5340
|
+
}
|
|
5341
|
+
};
|
|
4871
5342
|
}
|
|
4872
5343
|
|
|
4873
5344
|
async function getFileEntry(zipWriter, name, reader, entryInfo, options) {
|
|
@@ -4884,37 +5355,40 @@
|
|
|
4884
5355
|
headerInfo
|
|
4885
5356
|
} = entryInfo;
|
|
4886
5357
|
const usdz = zipWriter.options[OPTION_USDZ];
|
|
4887
|
-
const previousFileEntry =
|
|
5358
|
+
const previousFileEntry = zipWriter.lastFileEntry;
|
|
4888
5359
|
let fileEntry = {};
|
|
4889
5360
|
let bufferedWrite;
|
|
4890
5361
|
let releaseLockWriter;
|
|
4891
5362
|
let releaseLockCurrentFileEntry;
|
|
4892
5363
|
let writingBufferedEntryData;
|
|
4893
5364
|
let writingEntryData;
|
|
5365
|
+
let writerSizeBeforeEntry;
|
|
5366
|
+
let flushedBufferedSize = 0;
|
|
4894
5367
|
let fileWriter;
|
|
4895
5368
|
files.set(name, fileEntry);
|
|
5369
|
+
zipWriter.lastFileEntry = fileEntry;
|
|
4896
5370
|
try {
|
|
4897
5371
|
let lockPreviousFileEntry;
|
|
4898
5372
|
if (keepOrder) {
|
|
4899
5373
|
lockPreviousFileEntry = previousFileEntry && previousFileEntry.lock;
|
|
4900
5374
|
requestLockCurrentFileEntry();
|
|
4901
5375
|
}
|
|
4902
|
-
if (
|
|
5376
|
+
if (options.bufferedWrite || !keepOrder || zipWriter.writerLocked || zipWriter.bufferedWrites || !dataDescriptor) {
|
|
5377
|
+
bufferedWrite = true;
|
|
5378
|
+
zipWriter.bufferedWrites++;
|
|
4903
5379
|
if (options.createTempStream) {
|
|
4904
5380
|
fileWriter = await options.createTempStream();
|
|
4905
5381
|
} else {
|
|
4906
5382
|
fileWriter = new TransformStream(UNDEFINED_VALUE, UNDEFINED_VALUE, { highWaterMark: INFINITY_VALUE });
|
|
4907
5383
|
}
|
|
4908
5384
|
fileWriter.size = 0;
|
|
4909
|
-
bufferedWrite = true;
|
|
4910
|
-
zipWriter.bufferedWrites++;
|
|
4911
5385
|
await initStream(writer);
|
|
4912
5386
|
} else {
|
|
4913
5387
|
fileWriter = writer;
|
|
4914
5388
|
await requestLockWriter();
|
|
4915
5389
|
}
|
|
4916
5390
|
await initStream(fileWriter);
|
|
4917
|
-
const {
|
|
5391
|
+
const { diskOffset } = writer;
|
|
4918
5392
|
if (zipWriter.addSplitZipSignature) {
|
|
4919
5393
|
delete zipWriter.addSplitZipSignature;
|
|
4920
5394
|
const signatureArray = new Uint8Array(4);
|
|
@@ -4923,21 +5397,20 @@
|
|
|
4923
5397
|
await writeData(writer, signatureArray);
|
|
4924
5398
|
zipWriter.offset += 4;
|
|
4925
5399
|
}
|
|
4926
|
-
if (usdz) {
|
|
5400
|
+
if (usdz && !bufferedWrite) {
|
|
4927
5401
|
appendExtraFieldUSDZ(entryInfo, zipWriter.offset - diskOffset);
|
|
4928
5402
|
}
|
|
4929
|
-
const {
|
|
4930
|
-
localHeaderView,
|
|
4931
|
-
localHeaderArray
|
|
4932
|
-
} = headerInfo;
|
|
5403
|
+
const { localHeaderArray } = headerInfo;
|
|
4933
5404
|
if (!bufferedWrite) {
|
|
4934
5405
|
await lockPreviousFileEntry;
|
|
4935
|
-
await skipDiskIfNeeded(
|
|
5406
|
+
await skipDiskIfNeeded();
|
|
4936
5407
|
}
|
|
4937
|
-
const
|
|
4938
|
-
|
|
5408
|
+
const diskNumberStart = writer.diskNumber;
|
|
5409
|
+
const entryOffset = getSegmentOffset(zipWriter, writer);
|
|
5410
|
+
fileEntry.diskNumberStart = diskNumberStart;
|
|
4939
5411
|
if (!bufferedWrite) {
|
|
4940
5412
|
writingEntryData = true;
|
|
5413
|
+
writerSizeBeforeEntry = writer.size;
|
|
4941
5414
|
await writeData(fileWriter, localHeaderArray);
|
|
4942
5415
|
}
|
|
4943
5416
|
fileEntry = await createFileEntry(reader, fileWriter, fileEntry, entryInfo, zipWriter.config, options);
|
|
@@ -4950,16 +5423,24 @@
|
|
|
4950
5423
|
await Promise.all([fileWriter.writable.getWriter().close(), lockPreviousFileEntry]);
|
|
4951
5424
|
await requestLockWriter();
|
|
4952
5425
|
writingBufferedEntryData = true;
|
|
5426
|
+
writerSizeBeforeEntry = writer.size;
|
|
5427
|
+
await skipDiskIfNeeded();
|
|
4953
5428
|
fileEntry.diskNumberStart = writer.diskNumber;
|
|
4954
|
-
fileEntry.offset = zipWriter
|
|
4955
|
-
|
|
4956
|
-
|
|
4957
|
-
|
|
4958
|
-
|
|
5429
|
+
fileEntry.offset = getSegmentOffset(zipWriter, writer);
|
|
5430
|
+
if (usdz) {
|
|
5431
|
+
// the padding depends on the entry offset, only known now that the writer is locked
|
|
5432
|
+
const previousMetadataSize = entryInfo.metadataSize;
|
|
5433
|
+
appendExtraFieldUSDZ(entryInfo, zipWriter.offset - writer.diskOffset);
|
|
5434
|
+
fileEntry.size += entryInfo.metadataSize - previousMetadataSize;
|
|
5435
|
+
}
|
|
5436
|
+
updateLocalHeader(fileEntry, headerInfo.localHeaderView, options);
|
|
5437
|
+
await writeData(writer, headerInfo.localHeaderArray);
|
|
5438
|
+
await flushBufferedData(fileWriter.readable, writer, signal, chunkLength => flushedBufferedSize += chunkLength);
|
|
4959
5439
|
writer.size += fileWriter.size;
|
|
4960
5440
|
writingBufferedEntryData = false;
|
|
4961
5441
|
} else {
|
|
4962
|
-
fileEntry.
|
|
5442
|
+
fileEntry.diskNumberStart = diskNumberStart;
|
|
5443
|
+
fileEntry.offset = entryOffset;
|
|
4963
5444
|
}
|
|
4964
5445
|
zipWriter.offset += fileEntry.size;
|
|
4965
5446
|
return fileEntry;
|
|
@@ -4973,10 +5454,9 @@
|
|
|
4973
5454
|
// ignored
|
|
4974
5455
|
}
|
|
4975
5456
|
}
|
|
5457
|
+
zipWriter.offset += writer.size - writerSizeBeforeEntry;
|
|
4976
5458
|
if (bufferedWrite) {
|
|
4977
|
-
zipWriter.offset +=
|
|
4978
|
-
} else {
|
|
4979
|
-
zipWriter.offset = fileWriter.size;
|
|
5459
|
+
zipWriter.offset += flushedBufferedSize;
|
|
4980
5460
|
}
|
|
4981
5461
|
}
|
|
4982
5462
|
files.delete(name);
|
|
@@ -5007,10 +5487,10 @@
|
|
|
5007
5487
|
await lockWriter;
|
|
5008
5488
|
}
|
|
5009
5489
|
|
|
5010
|
-
async function skipDiskIfNeeded(
|
|
5490
|
+
async function skipDiskIfNeeded() {
|
|
5011
5491
|
if (getLength(headerInfo.localHeaderArray) > writer.availableSize) {
|
|
5012
5492
|
writer.availableSize = 0;
|
|
5013
|
-
await writeData(
|
|
5493
|
+
await writeData(writer, new Uint8Array());
|
|
5014
5494
|
}
|
|
5015
5495
|
}
|
|
5016
5496
|
}
|
|
@@ -5151,6 +5631,10 @@
|
|
|
5151
5631
|
uncompressedSize = result.inputSize;
|
|
5152
5632
|
signature = result.signature;
|
|
5153
5633
|
}
|
|
5634
|
+
if ((!zip64CompressedSize && compressedSize >= MAX_32_BITS) ||
|
|
5635
|
+
(!zip64UncompressedSize && uncompressedSize >= MAX_32_BITS)) {
|
|
5636
|
+
throw new Error(ERR_UNSUPPORTED_FORMAT);
|
|
5637
|
+
}
|
|
5154
5638
|
} catch (error) {
|
|
5155
5639
|
if (error.outputSize !== UNDEFINED_VALUE) {
|
|
5156
5640
|
writer.size += error.outputSize;
|
|
@@ -5213,35 +5697,28 @@
|
|
|
5213
5697
|
uncompressedSize
|
|
5214
5698
|
} = options;
|
|
5215
5699
|
let { version, compressionMethod } = options;
|
|
5216
|
-
const compressed = !directory && (
|
|
5700
|
+
const compressed = !directory && (compressionMethod === UNDEFINED_VALUE
|
|
5701
|
+
? (level === UNDEFINED_VALUE || level > 0)
|
|
5702
|
+
: compressionMethod !== COMPRESSION_METHOD_STORE);
|
|
5217
5703
|
let rawLocalExtraFieldZip64;
|
|
5218
5704
|
const uncompressedFile = passThrough || !compressed;
|
|
5219
|
-
|
|
5220
|
-
|
|
5221
|
-
|
|
5222
|
-
|
|
5223
|
-
|
|
5224
|
-
|
|
5225
|
-
|
|
5226
|
-
|
|
5227
|
-
|
|
5228
|
-
|
|
5229
|
-
|
|
5230
|
-
|
|
5231
|
-
setUint16(rawLocalExtraFieldZip64View, 2, getLength(rawLocalExtraFieldZip64) - 4);
|
|
5705
|
+
// entries without a data descriptor are always buffered (cf. getFileEntry), so the
|
|
5706
|
+
// zip64 extra field values can be patched into the local header before flushing it
|
|
5707
|
+
const zip64ExtraFieldComplete = zip64 && (options.bufferedWrite || !dataDescriptor || ((!zip64UncompressedSize && !zip64CompressedSize) || uncompressedFile));
|
|
5708
|
+
const writeLocalExtraFieldZip64 = zip64ExtraFieldComplete || (zip64 && dataDescriptor && (zip64UncompressedSize || zip64CompressedSize));
|
|
5709
|
+
if (zip64 && (zip64UncompressedSize || zip64CompressedSize)) {
|
|
5710
|
+
// APPNOTE 4.5.3: the zip64 extra field of a local header must include both the
|
|
5711
|
+
// uncompressed and compressed size fields
|
|
5712
|
+
const length = 4 + 16;
|
|
5713
|
+
const extraFieldZip64 = createRecordWriter(length);
|
|
5714
|
+
extraFieldZip64.uint16(EXTRAFIELD_TYPE_ZIP64);
|
|
5715
|
+
extraFieldZip64.uint16(length - 4);
|
|
5716
|
+
rawLocalExtraFieldZip64 = extraFieldZip64.array;
|
|
5232
5717
|
if (zip64ExtraFieldComplete) {
|
|
5233
|
-
|
|
5234
|
-
|
|
5235
|
-
|
|
5236
|
-
|
|
5237
|
-
rawLocalExtraFieldZip64Offset += 8;
|
|
5238
|
-
}
|
|
5239
|
-
if (zip64CompressedSize && uncompressedFile) {
|
|
5240
|
-
setBigUint64(rawLocalExtraFieldZip64View, rawLocalExtraFieldZip64Offset, BigInt(uncompressedSize));
|
|
5241
|
-
rawLocalExtraFieldZip64Offset += 8;
|
|
5242
|
-
}
|
|
5243
|
-
if (rawLocalExtraFieldZip64Offset == 4) {
|
|
5244
|
-
rawLocalExtraFieldZip64 = new Uint8Array();
|
|
5718
|
+
extraFieldZip64.uint64(uncompressedSize);
|
|
5719
|
+
if (uncompressedFile) {
|
|
5720
|
+
const encryptionOverhead = encrypted ? (zipCrypto ? 12 : 16 + encryptionStrength * 4) : 0;
|
|
5721
|
+
extraFieldZip64.uint64(passThrough ? 0 : uncompressedSize + encryptionOverhead);
|
|
5245
5722
|
}
|
|
5246
5723
|
}
|
|
5247
5724
|
} else {
|
|
@@ -5249,11 +5726,11 @@
|
|
|
5249
5726
|
}
|
|
5250
5727
|
let rawExtraFieldAES;
|
|
5251
5728
|
if (encrypted && !zipCrypto) {
|
|
5252
|
-
|
|
5253
|
-
|
|
5254
|
-
|
|
5255
|
-
|
|
5256
|
-
|
|
5729
|
+
const extraFieldAES = createRecordWriter(getLength(EXTRAFIELD_DATA_AES) + 2);
|
|
5730
|
+
extraFieldAES.uint16(EXTRAFIELD_TYPE_AES);
|
|
5731
|
+
extraFieldAES.bytes(EXTRAFIELD_DATA_AES);
|
|
5732
|
+
rawExtraFieldAES = extraFieldAES.array;
|
|
5733
|
+
rawExtraFieldAES[8] = encryptionStrength;
|
|
5257
5734
|
} else {
|
|
5258
5735
|
rawExtraFieldAES = new Uint8Array();
|
|
5259
5736
|
}
|
|
@@ -5261,33 +5738,38 @@
|
|
|
5261
5738
|
let rawExtraFieldExtendedTimestamp;
|
|
5262
5739
|
let extraFieldExtendedTimestampFlag;
|
|
5263
5740
|
if (extendedTimestamp) {
|
|
5264
|
-
|
|
5265
|
-
|
|
5266
|
-
|
|
5267
|
-
|
|
5268
|
-
|
|
5269
|
-
|
|
5270
|
-
|
|
5271
|
-
|
|
5272
|
-
|
|
5273
|
-
|
|
5274
|
-
|
|
5275
|
-
|
|
5276
|
-
|
|
5277
|
-
|
|
5278
|
-
|
|
5741
|
+
const lastModTimeUnix = getTimeUnix(lastModDate);
|
|
5742
|
+
if (inUnixTimeRange(lastModTimeUnix)) {
|
|
5743
|
+
const extraFieldTimestampLength = 9 + (lastAccessDate ? 4 : 0) + (creationDate ? 4 : 0);
|
|
5744
|
+
const extraFieldTimestamp = createRecordWriter(extraFieldTimestampLength);
|
|
5745
|
+
extraFieldExtendedTimestampFlag = 0x1 + (lastAccessDate ? 0x2 : 0) + (creationDate ? 0x4 : 0);
|
|
5746
|
+
extraFieldTimestamp.uint16(EXTRAFIELD_TYPE_EXTENDED_TIMESTAMP);
|
|
5747
|
+
extraFieldTimestamp.uint16(extraFieldTimestampLength - 4);
|
|
5748
|
+
extraFieldTimestamp.uint8(extraFieldExtendedTimestampFlag);
|
|
5749
|
+
extraFieldTimestamp.uint32(lastModTimeUnix);
|
|
5750
|
+
if (lastAccessDate) {
|
|
5751
|
+
extraFieldTimestamp.uint32(clampUnixTime(getTimeUnix(lastAccessDate)));
|
|
5752
|
+
}
|
|
5753
|
+
if (creationDate) {
|
|
5754
|
+
extraFieldTimestamp.uint32(clampUnixTime(getTimeUnix(creationDate)));
|
|
5755
|
+
}
|
|
5756
|
+
rawExtraFieldExtendedTimestamp = extraFieldTimestamp.array;
|
|
5757
|
+
} else {
|
|
5758
|
+
// the date cannot be stored as a 32-bit time_t; the NTFS field replaces it
|
|
5759
|
+
rawExtraFieldExtendedTimestamp = new Uint8Array();
|
|
5279
5760
|
}
|
|
5280
5761
|
try {
|
|
5281
|
-
rawExtraFieldNTFS = new Uint8Array(36);
|
|
5282
|
-
const extraFieldNTFSView = getDataView(rawExtraFieldNTFS);
|
|
5283
5762
|
const lastModTimeNTFS = getTimeNTFS(lastModDate);
|
|
5284
|
-
|
|
5285
|
-
|
|
5286
|
-
|
|
5287
|
-
|
|
5288
|
-
|
|
5289
|
-
|
|
5290
|
-
|
|
5763
|
+
const extraFieldNTFS = createRecordWriter(36);
|
|
5764
|
+
extraFieldNTFS.uint16(EXTRAFIELD_TYPE_NTFS);
|
|
5765
|
+
extraFieldNTFS.uint16(32);
|
|
5766
|
+
extraFieldNTFS.skip(4);
|
|
5767
|
+
extraFieldNTFS.uint16(EXTRAFIELD_TYPE_NTFS_TAG1);
|
|
5768
|
+
extraFieldNTFS.uint16(24);
|
|
5769
|
+
extraFieldNTFS.uint64(lastModTimeNTFS);
|
|
5770
|
+
extraFieldNTFS.uint64(getTimeNTFS(lastAccessDate) || lastModTimeNTFS);
|
|
5771
|
+
extraFieldNTFS.uint64(getTimeNTFS(creationDate) || lastModTimeNTFS);
|
|
5772
|
+
rawExtraFieldNTFS = extraFieldNTFS.array;
|
|
5291
5773
|
} catch {
|
|
5292
5774
|
rawExtraFieldNTFS = new Uint8Array();
|
|
5293
5775
|
}
|
|
@@ -5296,41 +5778,27 @@
|
|
|
5296
5778
|
}
|
|
5297
5779
|
let rawExtraFieldUnix;
|
|
5298
5780
|
try {
|
|
5299
|
-
const { uid, gid,
|
|
5300
|
-
if (unixExtraFieldType && (uid !== UNDEFINED_VALUE || gid !== UNDEFINED_VALUE
|
|
5781
|
+
const { uid, gid, unixExtraFieldType } = options;
|
|
5782
|
+
if (unixExtraFieldType == INFOZIP_EXTRA_FIELD_TYPE && (uid !== UNDEFINED_VALUE || gid !== UNDEFINED_VALUE)) {
|
|
5301
5783
|
const uidBytes = packUnixId(uid);
|
|
5302
5784
|
const gidBytes = packUnixId(gid);
|
|
5303
|
-
|
|
5304
|
-
|
|
5305
|
-
|
|
5306
|
-
|
|
5307
|
-
|
|
5308
|
-
|
|
5309
|
-
|
|
5310
|
-
|
|
5311
|
-
|
|
5312
|
-
|
|
5313
|
-
|
|
5314
|
-
|
|
5315
|
-
|
|
5316
|
-
|
|
5317
|
-
|
|
5318
|
-
|
|
5319
|
-
|
|
5320
|
-
rawExtraFieldUnix = new Uint8Array(4 + payloadLength);
|
|
5321
|
-
const rawExtraFieldUnixView = getDataView(rawExtraFieldUnix);
|
|
5322
|
-
setUint16(rawExtraFieldUnixView, 0, unixExtraFieldType == INFOZIP_EXTRA_FIELD_TYPE ? EXTRAFIELD_TYPE_INFOZIP : EXTRAFIELD_TYPE_UNIX);
|
|
5323
|
-
setUint16(rawExtraFieldUnixView, 2, payloadLength);
|
|
5324
|
-
setUint8(rawExtraFieldUnixView, 4, 1);
|
|
5325
|
-
setUint8(rawExtraFieldUnixView, 5, uidBytes.length);
|
|
5326
|
-
let offset = 6;
|
|
5327
|
-
arraySet(rawExtraFieldUnix, uidBytes, offset);
|
|
5328
|
-
offset += uidBytes.length;
|
|
5329
|
-
setUint8(rawExtraFieldUnixView, offset, gidBytes.length);
|
|
5330
|
-
offset++;
|
|
5331
|
-
arraySet(rawExtraFieldUnix, gidBytes, offset);
|
|
5332
|
-
offset += gidBytes.length;
|
|
5333
|
-
arraySet(rawExtraFieldUnix, modeArray, offset);
|
|
5785
|
+
const payloadLength = 3 + uidBytes.length + gidBytes.length;
|
|
5786
|
+
const extraFieldUnix = createRecordWriter(4 + payloadLength);
|
|
5787
|
+
extraFieldUnix.uint16(EXTRAFIELD_TYPE_INFOZIP);
|
|
5788
|
+
extraFieldUnix.uint16(payloadLength);
|
|
5789
|
+
extraFieldUnix.uint8(1);
|
|
5790
|
+
extraFieldUnix.uint8(uidBytes.length);
|
|
5791
|
+
extraFieldUnix.bytes(uidBytes);
|
|
5792
|
+
extraFieldUnix.uint8(gidBytes.length);
|
|
5793
|
+
extraFieldUnix.bytes(gidBytes);
|
|
5794
|
+
rawExtraFieldUnix = extraFieldUnix.array;
|
|
5795
|
+
} else if (unixExtraFieldType == UNIX_EXTRA_FIELD_TYPE && (uid !== UNDEFINED_VALUE || gid !== UNDEFINED_VALUE)) {
|
|
5796
|
+
const extraFieldUnix = createRecordWriter(8);
|
|
5797
|
+
extraFieldUnix.uint16(EXTRAFIELD_TYPE_UNIX);
|
|
5798
|
+
extraFieldUnix.uint16(4);
|
|
5799
|
+
extraFieldUnix.uint16((uid === UNDEFINED_VALUE ? 0 : uid) & MAX_16_BITS);
|
|
5800
|
+
extraFieldUnix.uint16((gid === UNDEFINED_VALUE ? 0 : gid) & MAX_16_BITS);
|
|
5801
|
+
rawExtraFieldUnix = extraFieldUnix.array;
|
|
5334
5802
|
} else {
|
|
5335
5803
|
rawExtraFieldUnix = new Uint8Array();
|
|
5336
5804
|
}
|
|
@@ -5348,8 +5816,11 @@
|
|
|
5348
5816
|
rawExtraFieldAES[9] = compressionMethod;
|
|
5349
5817
|
compressionMethod = COMPRESSION_METHOD_AES;
|
|
5350
5818
|
}
|
|
5351
|
-
const localExtraFieldZip64Length =
|
|
5819
|
+
const localExtraFieldZip64Length = writeLocalExtraFieldZip64 ? getLength(rawLocalExtraFieldZip64) : 0;
|
|
5352
5820
|
const extraFieldLength = localExtraFieldZip64Length + getLength(rawExtraFieldAES, rawExtraFieldExtendedTimestamp, rawExtraFieldNTFS, rawExtraFieldUnix, rawExtraField);
|
|
5821
|
+
if (extraFieldLength > MAX_16_BITS) {
|
|
5822
|
+
throw new Error(ERR_INVALID_EXTRAFIELD_DATA);
|
|
5823
|
+
}
|
|
5353
5824
|
const {
|
|
5354
5825
|
headerArray,
|
|
5355
5826
|
headerView,
|
|
@@ -5365,29 +5836,27 @@
|
|
|
5365
5836
|
zip64UncompressedSize,
|
|
5366
5837
|
extraFieldLength
|
|
5367
5838
|
});
|
|
5368
|
-
|
|
5369
|
-
const localHeaderArray =
|
|
5839
|
+
const localHeader = createRecordWriter(HEADER_SIZE + getLength(rawFilename) + extraFieldLength);
|
|
5840
|
+
const localHeaderArray = localHeader.array;
|
|
5370
5841
|
const localHeaderView = getDataView(localHeaderArray);
|
|
5371
|
-
|
|
5372
|
-
|
|
5373
|
-
|
|
5374
|
-
|
|
5375
|
-
|
|
5376
|
-
|
|
5377
|
-
|
|
5378
|
-
|
|
5379
|
-
|
|
5380
|
-
|
|
5381
|
-
|
|
5382
|
-
localHeaderOffset += getLength(rawExtraFieldExtendedTimestamp);
|
|
5383
|
-
arraySet(localHeaderArray, rawExtraFieldNTFS, localHeaderOffset);
|
|
5384
|
-
localHeaderOffset += getLength(rawExtraFieldNTFS);
|
|
5385
|
-
arraySet(localHeaderArray, rawExtraFieldUnix, localHeaderOffset);
|
|
5386
|
-
localHeaderOffset += getLength(rawExtraFieldUnix);
|
|
5387
|
-
arraySet(localHeaderArray, rawExtraField, localHeaderOffset);
|
|
5842
|
+
localHeader.uint32(LOCAL_FILE_HEADER_SIGNATURE);
|
|
5843
|
+
localHeader.bytes(headerArray);
|
|
5844
|
+
localHeader.bytes(rawFilename);
|
|
5845
|
+
if (writeLocalExtraFieldZip64) {
|
|
5846
|
+
localHeader.bytes(rawLocalExtraFieldZip64);
|
|
5847
|
+
}
|
|
5848
|
+
localHeader.bytes(rawExtraFieldAES);
|
|
5849
|
+
localHeader.bytes(rawExtraFieldExtendedTimestamp);
|
|
5850
|
+
localHeader.bytes(rawExtraFieldNTFS);
|
|
5851
|
+
localHeader.bytes(rawExtraFieldUnix);
|
|
5852
|
+
localHeader.bytes(rawExtraField);
|
|
5388
5853
|
if (dataDescriptor) {
|
|
5389
|
-
|
|
5390
|
-
|
|
5854
|
+
if (!zip64CompressedSize) {
|
|
5855
|
+
setUint32(localHeaderView, HEADER_OFFSET_COMPRESSED_SIZE + LOCAL_HEADER_COMMON_OFFSET, 0);
|
|
5856
|
+
}
|
|
5857
|
+
if (!zip64UncompressedSize) {
|
|
5858
|
+
setUint32(localHeaderView, HEADER_OFFSET_UNCOMPRESSED_SIZE + LOCAL_HEADER_COMMON_OFFSET, 0);
|
|
5859
|
+
}
|
|
5391
5860
|
}
|
|
5392
5861
|
return {
|
|
5393
5862
|
localHeaderArray,
|
|
@@ -5414,7 +5883,7 @@
|
|
|
5414
5883
|
function appendExtraFieldUSDZ(entryInfo, zipWriterOffset) {
|
|
5415
5884
|
const { headerInfo } = entryInfo;
|
|
5416
5885
|
let { localHeaderArray, extraFieldLength } = headerInfo;
|
|
5417
|
-
let localHeaderArrayView
|
|
5886
|
+
let localHeaderArrayView;
|
|
5418
5887
|
let extraBytesLength = 64 - ((zipWriterOffset + getLength(localHeaderArray)) % 64);
|
|
5419
5888
|
if (extraBytesLength < 4) {
|
|
5420
5889
|
extraBytesLength += 64;
|
|
@@ -5422,13 +5891,14 @@
|
|
|
5422
5891
|
const rawExtraFieldUSDZ = new Uint8Array(extraBytesLength);
|
|
5423
5892
|
const extraFieldUSDZView = getDataView(rawExtraFieldUSDZ);
|
|
5424
5893
|
setUint16(extraFieldUSDZView, 0, EXTRAFIELD_TYPE_USDZ);
|
|
5425
|
-
setUint16(extraFieldUSDZView, 2, extraBytesLength -
|
|
5894
|
+
setUint16(extraFieldUSDZView, 2, extraBytesLength - 4);
|
|
5426
5895
|
const previousLocalHeaderArray = localHeaderArray;
|
|
5427
5896
|
headerInfo.localHeaderArray = localHeaderArray = new Uint8Array(getLength(previousLocalHeaderArray) + extraBytesLength);
|
|
5428
5897
|
arraySet(localHeaderArray, previousLocalHeaderArray);
|
|
5429
5898
|
arraySet(localHeaderArray, rawExtraFieldUSDZ, getLength(previousLocalHeaderArray));
|
|
5430
5899
|
localHeaderArrayView = getDataView(localHeaderArray);
|
|
5431
5900
|
setUint16(localHeaderArrayView, 28, extraFieldLength + extraBytesLength);
|
|
5901
|
+
headerInfo.localHeaderView = localHeaderArrayView;
|
|
5432
5902
|
entryInfo.metadataSize += extraBytesLength;
|
|
5433
5903
|
}
|
|
5434
5904
|
|
|
@@ -5551,37 +6021,32 @@
|
|
|
5551
6021
|
}, localHeaderView, { dataDescriptor }) {
|
|
5552
6022
|
if (!dataDescriptor) {
|
|
5553
6023
|
if (!encrypted) {
|
|
5554
|
-
setUint32(localHeaderView, HEADER_OFFSET_SIGNATURE +
|
|
6024
|
+
setUint32(localHeaderView, HEADER_OFFSET_SIGNATURE + LOCAL_HEADER_COMMON_OFFSET, signature);
|
|
5555
6025
|
}
|
|
5556
6026
|
if (!zip64CompressedSize) {
|
|
5557
|
-
setUint32(localHeaderView, HEADER_OFFSET_COMPRESSED_SIZE +
|
|
6027
|
+
setUint32(localHeaderView, HEADER_OFFSET_COMPRESSED_SIZE + LOCAL_HEADER_COMMON_OFFSET, compressedSize);
|
|
5558
6028
|
}
|
|
5559
6029
|
if (!zip64UncompressedSize) {
|
|
5560
|
-
setUint32(localHeaderView, HEADER_OFFSET_UNCOMPRESSED_SIZE +
|
|
6030
|
+
setUint32(localHeaderView, HEADER_OFFSET_UNCOMPRESSED_SIZE + LOCAL_HEADER_COMMON_OFFSET, uncompressedSize);
|
|
5561
6031
|
}
|
|
5562
6032
|
}
|
|
5563
6033
|
if (zip64 && localExtraFieldZip64Length) {
|
|
5564
|
-
|
|
5565
|
-
|
|
5566
|
-
|
|
5567
|
-
|
|
5568
|
-
}
|
|
5569
|
-
if (zip64CompressedSize) {
|
|
5570
|
-
setBigUint64(localHeaderView, localHeaderOffset, BigInt(compressedSize));
|
|
5571
|
-
localHeaderOffset += 8;
|
|
5572
|
-
}
|
|
6034
|
+
// the local zip64 extra field always contains both size slots
|
|
6035
|
+
const localHeaderOffset = HEADER_SIZE + getLength(rawFilename) + 4;
|
|
6036
|
+
setBigUint64(localHeaderView, localHeaderOffset, BigInt(uncompressedSize));
|
|
6037
|
+
setBigUint64(localHeaderView, localHeaderOffset + 8, BigInt(compressedSize));
|
|
5573
6038
|
}
|
|
5574
6039
|
}
|
|
5575
6040
|
|
|
5576
6041
|
|
|
5577
6042
|
async function closeFile(zipWriter, comment, options) {
|
|
5578
|
-
const
|
|
5579
|
-
const {
|
|
5580
|
-
|
|
5581
|
-
|
|
6043
|
+
const directoryDataLength = createDirectoryRecords(zipWriter.files);
|
|
6044
|
+
const { cdStartDiskNumber, cdStartDiskOffset } = await writeDirectoryRecords(zipWriter, directoryDataLength, options);
|
|
6045
|
+
await writeEndOfDirectoryRecord(zipWriter, comment, options, { cdStartDiskNumber, cdStartDiskOffset, directoryDataLength });
|
|
6046
|
+
}
|
|
6047
|
+
|
|
6048
|
+
function createDirectoryRecords(files) {
|
|
5582
6049
|
let directoryDataLength = 0;
|
|
5583
|
-
let directoryOffset = zipWriter.offset - diskOffset;
|
|
5584
|
-
let filesLength = files.size;
|
|
5585
6050
|
for (const [, fileEntry] of files) {
|
|
5586
6051
|
const {
|
|
5587
6052
|
rawFilename,
|
|
@@ -5598,24 +6063,27 @@
|
|
|
5598
6063
|
uncompressedSize,
|
|
5599
6064
|
compressedSize
|
|
5600
6065
|
} = fileEntry;
|
|
5601
|
-
const zip64Offset = fileEntry.offset
|
|
5602
|
-
const zip64DiskNumberStart = fileEntry.diskNumberStart
|
|
6066
|
+
const zip64Offset = fileEntry.offset >= MAX_32_BITS;
|
|
6067
|
+
const zip64DiskNumberStart = fileEntry.diskNumberStart >= MAX_16_BITS;
|
|
5603
6068
|
let rawExtraFieldZip64;
|
|
5604
6069
|
if (zip64Offset || zip64DiskNumberStart || zip64UncompressedSize || zip64CompressedSize) {
|
|
5605
|
-
|
|
5606
|
-
|
|
5607
|
-
|
|
5608
|
-
|
|
5609
|
-
if (
|
|
5610
|
-
|
|
5611
|
-
|
|
5612
|
-
|
|
5613
|
-
|
|
5614
|
-
|
|
5615
|
-
if (
|
|
5616
|
-
|
|
5617
|
-
|
|
5618
|
-
if (zip64DiskNumberStart) {
|
|
6070
|
+
const length = 4 + (zip64UncompressedSize ? 8 : 0) + (zip64CompressedSize ? 8 : 0) + (zip64Offset ? 8 : 0) + (zip64DiskNumberStart ? 4 : 0);
|
|
6071
|
+
const extraFieldZip64 = createRecordWriter(length);
|
|
6072
|
+
extraFieldZip64.uint16(EXTRAFIELD_TYPE_ZIP64);
|
|
6073
|
+
extraFieldZip64.uint16(length - 4);
|
|
6074
|
+
if (zip64UncompressedSize) {
|
|
6075
|
+
extraFieldZip64.uint64(uncompressedSize);
|
|
6076
|
+
}
|
|
6077
|
+
if (zip64CompressedSize) {
|
|
6078
|
+
extraFieldZip64.uint64(compressedSize);
|
|
6079
|
+
}
|
|
6080
|
+
if (zip64Offset) {
|
|
6081
|
+
extraFieldZip64.uint64(fileEntry.offset);
|
|
6082
|
+
}
|
|
6083
|
+
if (zip64DiskNumberStart) {
|
|
6084
|
+
extraFieldZip64.uint32(fileEntry.diskNumberStart);
|
|
6085
|
+
}
|
|
6086
|
+
rawExtraFieldZip64 = extraFieldZip64.array;
|
|
5619
6087
|
} else {
|
|
5620
6088
|
rawExtraFieldZip64 = new Uint8Array();
|
|
5621
6089
|
}
|
|
@@ -5623,32 +6091,41 @@
|
|
|
5623
6091
|
fileEntry.zip64Offset = zip64Offset;
|
|
5624
6092
|
fileEntry.zip64DiskNumberStart = zip64DiskNumberStart;
|
|
5625
6093
|
let rawExtraFieldTimestamp;
|
|
5626
|
-
|
|
5627
|
-
|
|
5628
|
-
const
|
|
5629
|
-
|
|
5630
|
-
|
|
5631
|
-
|
|
5632
|
-
|
|
6094
|
+
const lastModTimeUnix = getTimeUnix(lastModDate);
|
|
6095
|
+
if (extendedTimestamp && inUnixTimeRange(lastModTimeUnix)) {
|
|
6096
|
+
const extraFieldTimestamp = createRecordWriter(9);
|
|
6097
|
+
extraFieldTimestamp.uint16(EXTRAFIELD_TYPE_EXTENDED_TIMESTAMP);
|
|
6098
|
+
extraFieldTimestamp.uint16(5);
|
|
6099
|
+
extraFieldTimestamp.uint8(extraFieldExtendedTimestampFlag);
|
|
6100
|
+
extraFieldTimestamp.uint32(lastModTimeUnix);
|
|
6101
|
+
rawExtraFieldTimestamp = extraFieldTimestamp.array;
|
|
5633
6102
|
} else {
|
|
5634
6103
|
rawExtraFieldTimestamp = new Uint8Array();
|
|
5635
6104
|
}
|
|
5636
6105
|
fileEntry.rawExtraFieldExtendedTimestamp = rawExtraFieldTimestamp;
|
|
5637
|
-
|
|
5638
|
-
|
|
5639
|
-
|
|
5640
|
-
|
|
5641
|
-
|
|
5642
|
-
|
|
5643
|
-
|
|
5644
|
-
|
|
5645
|
-
|
|
5646
|
-
|
|
6106
|
+
const extraFieldLength = getLength(
|
|
6107
|
+
rawExtraFieldZip64,
|
|
6108
|
+
rawExtraFieldAES,
|
|
6109
|
+
rawExtraFieldNTFS,
|
|
6110
|
+
rawExtraFieldUnix,
|
|
6111
|
+
rawExtraFieldTimestamp,
|
|
6112
|
+
rawExtraField);
|
|
6113
|
+
if (extraFieldLength > MAX_16_BITS) {
|
|
6114
|
+
throw new Error(ERR_INVALID_EXTRAFIELD_DATA);
|
|
6115
|
+
}
|
|
6116
|
+
directoryDataLength += CENTRAL_FILE_HEADER_LENGTH + getLength(rawFilename, rawComment) + extraFieldLength;
|
|
5647
6117
|
}
|
|
6118
|
+
return directoryDataLength;
|
|
6119
|
+
}
|
|
6120
|
+
|
|
6121
|
+
async function writeDirectoryRecords(zipWriter, directoryDataLength, options) {
|
|
6122
|
+
const { files, writer } = zipWriter;
|
|
5648
6123
|
const directoryArray = new Uint8Array(directoryDataLength);
|
|
5649
|
-
const directoryView = getDataView(directoryArray);
|
|
5650
6124
|
await initStream(writer);
|
|
6125
|
+
let offset = 0;
|
|
5651
6126
|
let directoryDiskOffset = 0;
|
|
6127
|
+
let cdStartDiskNumber = writer.diskNumber;
|
|
6128
|
+
let cdStartDiskOffset = writer.diskOffset;
|
|
5652
6129
|
for (const [indexFileEntry, fileEntry] of Array.from(files.values()).entries()) {
|
|
5653
6130
|
const {
|
|
5654
6131
|
offset: fileEntryOffset,
|
|
@@ -5674,52 +6151,46 @@
|
|
|
5674
6151
|
compressedSize
|
|
5675
6152
|
} = fileEntry;
|
|
5676
6153
|
const extraFieldLength = getLength(rawExtraFieldZip64, rawExtraFieldAES, rawExtraFieldExtendedTimestamp, rawExtraFieldNTFS, rawExtraFieldUnix, rawExtraField);
|
|
5677
|
-
|
|
5678
|
-
|
|
6154
|
+
const directoryRecordLength = CENTRAL_FILE_HEADER_LENGTH + getLength(rawFilename, rawComment) + extraFieldLength;
|
|
6155
|
+
if (offset + directoryRecordLength - directoryDiskOffset > writer.availableSize) {
|
|
6156
|
+
await writeData(writer, directoryArray.slice(directoryDiskOffset, offset));
|
|
6157
|
+
directoryDiskOffset = offset;
|
|
6158
|
+
writer.availableSize = 0;
|
|
6159
|
+
await writeData(writer, new Uint8Array());
|
|
6160
|
+
}
|
|
6161
|
+
if (indexFileEntry == 0) {
|
|
6162
|
+
cdStartDiskNumber = writer.diskNumber;
|
|
6163
|
+
cdStartDiskOffset = writer.diskOffset;
|
|
6164
|
+
}
|
|
5679
6165
|
if (!zip64UncompressedSize) {
|
|
5680
6166
|
setUint32(headerView, HEADER_OFFSET_UNCOMPRESSED_SIZE, uncompressedSize);
|
|
5681
6167
|
}
|
|
5682
6168
|
if (!zip64CompressedSize) {
|
|
5683
6169
|
setUint32(headerView, HEADER_OFFSET_COMPRESSED_SIZE, compressedSize);
|
|
5684
6170
|
}
|
|
5685
|
-
|
|
5686
|
-
|
|
5687
|
-
|
|
5688
|
-
|
|
5689
|
-
|
|
5690
|
-
|
|
5691
|
-
|
|
5692
|
-
|
|
5693
|
-
|
|
5694
|
-
|
|
5695
|
-
|
|
5696
|
-
|
|
5697
|
-
|
|
5698
|
-
|
|
5699
|
-
|
|
5700
|
-
|
|
5701
|
-
|
|
5702
|
-
|
|
5703
|
-
|
|
5704
|
-
|
|
5705
|
-
|
|
5706
|
-
|
|
5707
|
-
|
|
5708
|
-
directoryOffset += getLength(rawExtraFieldExtendedTimestamp);
|
|
5709
|
-
arraySet(directoryArray, rawExtraFieldNTFS, directoryOffset);
|
|
5710
|
-
directoryOffset += getLength(rawExtraFieldNTFS);
|
|
5711
|
-
arraySet(directoryArray, rawExtraFieldUnix, directoryOffset);
|
|
5712
|
-
directoryOffset += getLength(rawExtraFieldUnix);
|
|
5713
|
-
arraySet(directoryArray, rawExtraField, directoryOffset);
|
|
5714
|
-
directoryOffset += getLength(rawExtraField);
|
|
5715
|
-
arraySet(directoryArray, rawComment, directoryOffset);
|
|
5716
|
-
directoryOffset += getLength(rawComment);
|
|
5717
|
-
if (offset - directoryDiskOffset > writer.availableSize) {
|
|
5718
|
-
writer.availableSize = 0;
|
|
5719
|
-
await writeData(writer, directoryArray.slice(directoryDiskOffset, offset));
|
|
5720
|
-
directoryDiskOffset = offset;
|
|
5721
|
-
}
|
|
5722
|
-
offset = directoryOffset;
|
|
6171
|
+
if ((zip64Offset || zip64DiskNumberStart) && fileEntry.version < VERSION_ZIP64) {
|
|
6172
|
+
setUint16(headerView, HEADER_OFFSET_VERSION, VERSION_ZIP64);
|
|
6173
|
+
}
|
|
6174
|
+
const directoryRecord = createRecordWriter(directoryRecordLength);
|
|
6175
|
+
directoryRecord.uint32(CENTRAL_FILE_HEADER_SIGNATURE);
|
|
6176
|
+
directoryRecord.uint16(versionMadeBy);
|
|
6177
|
+
directoryRecord.bytes(headerArray.subarray(0, HEADER_SIZE - 4 - 2));
|
|
6178
|
+
directoryRecord.uint16(extraFieldLength);
|
|
6179
|
+
directoryRecord.uint16(getLength(rawComment));
|
|
6180
|
+
directoryRecord.uint16(zip64DiskNumberStart ? MAX_16_BITS : diskNumberStart);
|
|
6181
|
+
directoryRecord.uint16(internalFileAttributes);
|
|
6182
|
+
directoryRecord.uint32(externalFileAttributes);
|
|
6183
|
+
directoryRecord.uint32(zip64Offset ? MAX_32_BITS : fileEntryOffset);
|
|
6184
|
+
directoryRecord.bytes(rawFilename);
|
|
6185
|
+
directoryRecord.bytes(rawExtraFieldZip64);
|
|
6186
|
+
directoryRecord.bytes(rawExtraFieldAES);
|
|
6187
|
+
directoryRecord.bytes(rawExtraFieldExtendedTimestamp);
|
|
6188
|
+
directoryRecord.bytes(rawExtraFieldNTFS);
|
|
6189
|
+
directoryRecord.bytes(rawExtraFieldUnix);
|
|
6190
|
+
directoryRecord.bytes(rawExtraField);
|
|
6191
|
+
directoryRecord.bytes(rawComment);
|
|
6192
|
+
arraySet(directoryArray, directoryRecord.array, offset);
|
|
6193
|
+
offset += directoryRecordLength;
|
|
5723
6194
|
if (options.onprogress) {
|
|
5724
6195
|
try {
|
|
5725
6196
|
await options.onprogress(indexFileEntry + 1, files.size, new Entry(fileEntry));
|
|
@@ -5729,36 +6200,53 @@
|
|
|
5729
6200
|
}
|
|
5730
6201
|
}
|
|
5731
6202
|
await writeData(writer, directoryDiskOffset ? directoryArray.slice(directoryDiskOffset) : directoryArray);
|
|
6203
|
+
return { cdStartDiskNumber, cdStartDiskOffset };
|
|
6204
|
+
}
|
|
6205
|
+
|
|
6206
|
+
async function writeEndOfDirectoryRecord(zipWriter, comment, options, cdInfo) {
|
|
6207
|
+
const { writer } = zipWriter;
|
|
6208
|
+
const { cdStartDiskNumber, cdStartDiskOffset } = cdInfo;
|
|
6209
|
+
let { directoryDataLength } = cdInfo;
|
|
6210
|
+
let filesLength = zipWriter.files.size;
|
|
6211
|
+
let diskNumber = cdStartDiskNumber;
|
|
6212
|
+
let directoryOffset = zipWriter.offset - cdStartDiskOffset - (cdStartDiskNumber ? zipWriter.initialOffset : 0);
|
|
5732
6213
|
let lastDiskNumber = writer.diskNumber;
|
|
5733
|
-
|
|
5734
|
-
if (availableSize < END_OF_CENTRAL_DIR_LENGTH) {
|
|
6214
|
+
if (writer.availableSize < END_OF_CENTRAL_DIR_LENGTH) {
|
|
5735
6215
|
lastDiskNumber++;
|
|
5736
6216
|
}
|
|
5737
6217
|
let zip64 = getOptionValue(zipWriter, options, PROPERTY_NAME_ZIP64);
|
|
5738
|
-
if (directoryOffset
|
|
6218
|
+
if (directoryOffset >= MAX_32_BITS || directoryDataLength >= MAX_32_BITS || filesLength >= MAX_16_BITS || lastDiskNumber >= MAX_16_BITS) {
|
|
5739
6219
|
if (zip64 === false) {
|
|
5740
6220
|
throw new Error(ERR_UNSUPPORTED_FORMAT);
|
|
5741
6221
|
} else {
|
|
5742
6222
|
zip64 = true;
|
|
5743
6223
|
}
|
|
5744
6224
|
}
|
|
5745
|
-
const
|
|
5746
|
-
|
|
5747
|
-
|
|
6225
|
+
const commentLength = getLength(comment);
|
|
6226
|
+
if (commentLength > MAX_16_BITS) {
|
|
6227
|
+
throw new Error(ERR_INVALID_COMMENT);
|
|
6228
|
+
}
|
|
6229
|
+
const endOfdirectoryRecord = createRecordWriter(zip64 ? ZIP64_END_OF_CENTRAL_DIR_TOTAL_LENGTH : END_OF_CENTRAL_DIR_LENGTH);
|
|
6230
|
+
if (getLength(endOfdirectoryRecord.array) + commentLength > writer.availableSize) {
|
|
6231
|
+
writer.availableSize = 0;
|
|
6232
|
+
await writeData(writer, new Uint8Array());
|
|
6233
|
+
}
|
|
6234
|
+
lastDiskNumber = writer.diskNumber;
|
|
5748
6235
|
if (zip64) {
|
|
5749
|
-
|
|
5750
|
-
|
|
5751
|
-
|
|
5752
|
-
|
|
5753
|
-
|
|
5754
|
-
|
|
5755
|
-
|
|
5756
|
-
|
|
5757
|
-
|
|
5758
|
-
|
|
5759
|
-
|
|
5760
|
-
|
|
5761
|
-
|
|
6236
|
+
endOfdirectoryRecord.uint32(ZIP64_END_OF_CENTRAL_DIR_SIGNATURE);
|
|
6237
|
+
endOfdirectoryRecord.uint64(44);
|
|
6238
|
+
endOfdirectoryRecord.uint16(45);
|
|
6239
|
+
endOfdirectoryRecord.uint16(45);
|
|
6240
|
+
endOfdirectoryRecord.uint32(lastDiskNumber);
|
|
6241
|
+
endOfdirectoryRecord.uint32(diskNumber);
|
|
6242
|
+
endOfdirectoryRecord.uint64(filesLength);
|
|
6243
|
+
endOfdirectoryRecord.uint64(filesLength);
|
|
6244
|
+
endOfdirectoryRecord.uint64(directoryDataLength);
|
|
6245
|
+
endOfdirectoryRecord.uint64(directoryOffset);
|
|
6246
|
+
endOfdirectoryRecord.uint32(ZIP64_END_OF_CENTRAL_DIR_LOCATOR_SIGNATURE);
|
|
6247
|
+
endOfdirectoryRecord.uint32(lastDiskNumber);
|
|
6248
|
+
endOfdirectoryRecord.uint64(BigInt(zipWriter.offset) + BigInt(directoryDataLength) - BigInt(writer.diskOffset) - BigInt(writer.diskNumber ? zipWriter.initialOffset : 0));
|
|
6249
|
+
endOfdirectoryRecord.uint32(lastDiskNumber + 1);
|
|
5762
6250
|
const supportZip64SplitFile = getOptionValue(zipWriter, options, OPTION_SUPPORT_ZIP64_SPLIT_FILE, true);
|
|
5763
6251
|
if (supportZip64SplitFile) {
|
|
5764
6252
|
lastDiskNumber = MAX_16_BITS;
|
|
@@ -5767,29 +6255,40 @@
|
|
|
5767
6255
|
filesLength = MAX_16_BITS;
|
|
5768
6256
|
directoryOffset = MAX_32_BITS;
|
|
5769
6257
|
directoryDataLength = MAX_32_BITS;
|
|
5770
|
-
offset += ZIP64_END_OF_CENTRAL_DIR_LENGTH + ZIP64_END_OF_CENTRAL_DIR_LOCATOR_LENGTH;
|
|
5771
|
-
}
|
|
5772
|
-
setUint32(endOfdirectoryView, offset, END_OF_CENTRAL_DIR_SIGNATURE);
|
|
5773
|
-
setUint16(endOfdirectoryView, offset + 4, lastDiskNumber);
|
|
5774
|
-
setUint16(endOfdirectoryView, offset + 6, diskNumber);
|
|
5775
|
-
setUint16(endOfdirectoryView, offset + 8, filesLength);
|
|
5776
|
-
setUint16(endOfdirectoryView, offset + 10, filesLength);
|
|
5777
|
-
setUint32(endOfdirectoryView, offset + 12, directoryDataLength);
|
|
5778
|
-
setUint32(endOfdirectoryView, offset + 16, directoryOffset);
|
|
5779
|
-
const commentLength = getLength(comment);
|
|
5780
|
-
if (commentLength) {
|
|
5781
|
-
if (commentLength <= MAX_16_BITS) {
|
|
5782
|
-
setUint16(endOfdirectoryView, offset + 20, commentLength);
|
|
5783
|
-
} else {
|
|
5784
|
-
throw new Error(ERR_INVALID_COMMENT);
|
|
5785
|
-
}
|
|
5786
6258
|
}
|
|
5787
|
-
|
|
6259
|
+
endOfdirectoryRecord.uint32(END_OF_CENTRAL_DIR_SIGNATURE);
|
|
6260
|
+
endOfdirectoryRecord.uint16(lastDiskNumber);
|
|
6261
|
+
endOfdirectoryRecord.uint16(diskNumber);
|
|
6262
|
+
endOfdirectoryRecord.uint16(filesLength);
|
|
6263
|
+
endOfdirectoryRecord.uint16(filesLength);
|
|
6264
|
+
endOfdirectoryRecord.uint32(directoryDataLength);
|
|
6265
|
+
endOfdirectoryRecord.uint32(directoryOffset);
|
|
6266
|
+
endOfdirectoryRecord.uint16(commentLength);
|
|
6267
|
+
await writeData(writer, endOfdirectoryRecord.array);
|
|
5788
6268
|
if (commentLength) {
|
|
5789
6269
|
await writeData(writer, comment);
|
|
5790
6270
|
}
|
|
5791
6271
|
}
|
|
5792
6272
|
|
|
6273
|
+
function createRecordWriter(length) {
|
|
6274
|
+
const array = new Uint8Array(length);
|
|
6275
|
+
const view = getDataView(array);
|
|
6276
|
+
let offset = 0;
|
|
6277
|
+
return {
|
|
6278
|
+
array,
|
|
6279
|
+
uint8: value => { setUint8(view, offset, value); offset += 1; },
|
|
6280
|
+
uint16: value => { setUint16(view, offset, value); offset += 2; },
|
|
6281
|
+
uint32: value => { setUint32(view, offset, value); offset += 4; },
|
|
6282
|
+
uint64: value => { setBigUint64(view, offset, BigInt(value)); offset += 8; },
|
|
6283
|
+
bytes: value => { arraySet(array, value, offset); offset += getLength(value); },
|
|
6284
|
+
skip: count => offset += count
|
|
6285
|
+
};
|
|
6286
|
+
}
|
|
6287
|
+
|
|
6288
|
+
function getSegmentOffset(zipWriter, writer) {
|
|
6289
|
+
return zipWriter.offset - writer.diskOffset - (writer.diskNumber ? zipWriter.initialOffset : 0);
|
|
6290
|
+
}
|
|
6291
|
+
|
|
5793
6292
|
async function writeData(writer, array) {
|
|
5794
6293
|
const { writable } = writer;
|
|
5795
6294
|
const streamWriter = writable.getWriter();
|
|
@@ -5802,12 +6301,40 @@
|
|
|
5802
6301
|
}
|
|
5803
6302
|
}
|
|
5804
6303
|
|
|
6304
|
+
async function flushBufferedData(readable, writer, signal, onChunkWritten) {
|
|
6305
|
+
const streamWriter = writer.writable.getWriter();
|
|
6306
|
+
try {
|
|
6307
|
+
await readable.pipeTo(new WritableStream({
|
|
6308
|
+
async write(chunk) {
|
|
6309
|
+
await streamWriter.ready;
|
|
6310
|
+
await streamWriter.write(chunk);
|
|
6311
|
+
onChunkWritten(getLength(chunk));
|
|
6312
|
+
}
|
|
6313
|
+
}), { preventClose: true, preventAbort: true, signal });
|
|
6314
|
+
} finally {
|
|
6315
|
+
streamWriter.releaseLock();
|
|
6316
|
+
}
|
|
6317
|
+
}
|
|
6318
|
+
|
|
5805
6319
|
function getTimeNTFS(date) {
|
|
5806
6320
|
if (date) {
|
|
5807
6321
|
return ((BigInt(date.getTime()) + BigInt(11644473600000)) * BigInt(10000));
|
|
5808
6322
|
}
|
|
5809
6323
|
}
|
|
5810
6324
|
|
|
6325
|
+
function getTimeUnix(date) {
|
|
6326
|
+
return Math.floor(date.getTime() / 1000);
|
|
6327
|
+
}
|
|
6328
|
+
|
|
6329
|
+
// the extended timestamp extra field stores dates as signed 32-bit time_t values
|
|
6330
|
+
function inUnixTimeRange(timeUnix) {
|
|
6331
|
+
return timeUnix >= MIN_UNIX_TIME && timeUnix <= MAX_UNIX_TIME;
|
|
6332
|
+
}
|
|
6333
|
+
|
|
6334
|
+
function clampUnixTime(timeUnix) {
|
|
6335
|
+
return Math.min(MAX_UNIX_TIME, Math.max(MIN_UNIX_TIME, timeUnix));
|
|
6336
|
+
}
|
|
6337
|
+
|
|
5811
6338
|
function getOptionValue(zipWriter, options, name, defaultValue) {
|
|
5812
6339
|
const result = options[name] === UNDEFINED_VALUE ? zipWriter.options[name] : options[name];
|
|
5813
6340
|
return result === UNDEFINED_VALUE ? defaultValue : result;
|
|
@@ -5838,7 +6365,7 @@
|
|
|
5838
6365
|
}
|
|
5839
6366
|
|
|
5840
6367
|
function getDataView(array) {
|
|
5841
|
-
return new DataView(array.buffer);
|
|
6368
|
+
return new DataView(array.buffer, array.byteOffset, array.byteLength);
|
|
5842
6369
|
}
|
|
5843
6370
|
|
|
5844
6371
|
function getLength(...arrayLikes) {
|
|
@@ -5854,30 +6381,39 @@
|
|
|
5854
6381
|
uncompressedSize,
|
|
5855
6382
|
compressedSize,
|
|
5856
6383
|
lastModDate,
|
|
6384
|
+
rawLastModDate,
|
|
5857
6385
|
rawFilename,
|
|
5858
6386
|
zip64CompressedSize,
|
|
5859
6387
|
zip64UncompressedSize,
|
|
5860
6388
|
extraFieldLength
|
|
5861
6389
|
}) {
|
|
5862
|
-
const
|
|
6390
|
+
const headerRecord = createRecordWriter(HEADER_SIZE - 4);
|
|
6391
|
+
const headerArray = headerRecord.array;
|
|
5863
6392
|
const headerView = getDataView(headerArray);
|
|
5864
|
-
|
|
5865
|
-
|
|
5866
|
-
|
|
5867
|
-
|
|
5868
|
-
|
|
5869
|
-
|
|
5870
|
-
|
|
5871
|
-
|
|
5872
|
-
|
|
6393
|
+
headerRecord.uint16(version);
|
|
6394
|
+
headerRecord.uint16(bitFlag);
|
|
6395
|
+
headerRecord.uint16(compressionMethod);
|
|
6396
|
+
if (rawLastModDate === UNDEFINED_VALUE) {
|
|
6397
|
+
const dateArray = new Uint32Array(1);
|
|
6398
|
+
const dateView = getDataView(dateArray);
|
|
6399
|
+
setUint16(dateView, 0, (((lastModDate.getHours() << 6) | lastModDate.getMinutes()) << 5) | lastModDate.getSeconds() / 2);
|
|
6400
|
+
setUint16(dateView, 2, ((((lastModDate.getFullYear() - 1980) << 4) | (lastModDate.getMonth() + 1)) << 5) | lastModDate.getDate());
|
|
6401
|
+
rawLastModDate = dateArray[0];
|
|
6402
|
+
}
|
|
6403
|
+
headerRecord.uint32(rawLastModDate);
|
|
6404
|
+
headerRecord.skip(4);
|
|
5873
6405
|
if (zip64CompressedSize || compressedSize !== UNDEFINED_VALUE) {
|
|
5874
|
-
|
|
6406
|
+
headerRecord.uint32(zip64CompressedSize ? MAX_32_BITS : compressedSize);
|
|
6407
|
+
} else {
|
|
6408
|
+
headerRecord.skip(4);
|
|
5875
6409
|
}
|
|
5876
6410
|
if (zip64UncompressedSize || uncompressedSize !== UNDEFINED_VALUE) {
|
|
5877
|
-
|
|
6411
|
+
headerRecord.uint32(zip64UncompressedSize ? MAX_32_BITS : uncompressedSize);
|
|
6412
|
+
} else {
|
|
6413
|
+
headerRecord.skip(4);
|
|
5878
6414
|
}
|
|
5879
|
-
|
|
5880
|
-
|
|
6415
|
+
headerRecord.uint16(getLength(rawFilename));
|
|
6416
|
+
headerRecord.uint16(extraFieldLength);
|
|
5881
6417
|
return {
|
|
5882
6418
|
headerArray,
|
|
5883
6419
|
headerView,
|
|
@@ -5978,7 +6514,7 @@
|
|
|
5978
6514
|
// ignored
|
|
5979
6515
|
}
|
|
5980
6516
|
|
|
5981
|
-
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());}};
|
|
6517
|
+
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());}};
|
|
5982
6518
|
|
|
5983
6519
|
/*
|
|
5984
6520
|
Copyright (c) 2025 Gildas Lormeau. All rights reserved.
|
|
@@ -6012,7 +6548,7 @@
|
|
|
6012
6548
|
configure({
|
|
6013
6549
|
workerURI: "./core/web-worker-native.js",
|
|
6014
6550
|
wasmURI: null,
|
|
6015
|
-
CompressionStreamZlib:
|
|
6551
|
+
CompressionStreamZlib: h_,
|
|
6016
6552
|
DecompressionStreamZlib: x_
|
|
6017
6553
|
});
|
|
6018
6554
|
|
|
@@ -6051,6 +6587,7 @@
|
|
|
6051
6587
|
exports.BlobWriter = BlobWriter;
|
|
6052
6588
|
exports.Data64URIReader = Data64URIReader;
|
|
6053
6589
|
exports.Data64URIWriter = Data64URIWriter;
|
|
6590
|
+
exports.ERR_AMBIGUOUS_ARCHIVE = ERR_AMBIGUOUS_ARCHIVE;
|
|
6054
6591
|
exports.ERR_BAD_FORMAT = ERR_BAD_FORMAT;
|
|
6055
6592
|
exports.ERR_CENTRAL_DIRECTORY_NOT_FOUND = ERR_CENTRAL_DIRECTORY_NOT_FOUND;
|
|
6056
6593
|
exports.ERR_DUPLICATED_NAME = ERR_DUPLICATED_NAME;
|
|
@@ -6060,6 +6597,7 @@
|
|
|
6060
6597
|
exports.ERR_EXTRAFIELD_ZIP64_NOT_FOUND = ERR_EXTRAFIELD_ZIP64_NOT_FOUND;
|
|
6061
6598
|
exports.ERR_HTTP_RANGE = ERR_HTTP_RANGE;
|
|
6062
6599
|
exports.ERR_INVALID_COMMENT = ERR_INVALID_COMMENT;
|
|
6600
|
+
exports.ERR_INVALID_COMPRESSED_DATA = ERR_INVALID_COMPRESSED_DATA;
|
|
6063
6601
|
exports.ERR_INVALID_ENCRYPTION_STRENGTH = ERR_INVALID_ENCRYPTION_STRENGTH;
|
|
6064
6602
|
exports.ERR_INVALID_ENTRY_COMMENT = ERR_INVALID_ENTRY_COMMENT;
|
|
6065
6603
|
exports.ERR_INVALID_ENTRY_NAME = ERR_INVALID_ENTRY_NAME;
|
|
@@ -6072,8 +6610,9 @@
|
|
|
6072
6610
|
exports.ERR_LOCAL_FILE_HEADER_NOT_FOUND = ERR_LOCAL_FILE_HEADER_NOT_FOUND;
|
|
6073
6611
|
exports.ERR_OVERLAPPING_ENTRY = ERR_OVERLAPPING_ENTRY;
|
|
6074
6612
|
exports.ERR_SPLIT_ZIP_FILE = ERR_SPLIT_ZIP_FILE;
|
|
6613
|
+
exports.ERR_UNDEFINED_READER = ERR_UNDEFINED_READER;
|
|
6075
6614
|
exports.ERR_UNDEFINED_UNCOMPRESSED_SIZE = ERR_UNDEFINED_UNCOMPRESSED_SIZE;
|
|
6076
|
-
exports.ERR_UNSUPPORTED_COMPRESSION = ERR_UNSUPPORTED_COMPRESSION;
|
|
6615
|
+
exports.ERR_UNSUPPORTED_COMPRESSION = ERR_UNSUPPORTED_COMPRESSION$1;
|
|
6077
6616
|
exports.ERR_UNSUPPORTED_ENCRYPTION = ERR_UNSUPPORTED_ENCRYPTION;
|
|
6078
6617
|
exports.ERR_UNSUPPORTED_FORMAT = ERR_UNSUPPORTED_FORMAT;
|
|
6079
6618
|
exports.ERR_ZIP_NOT_EMPTY = ERR_ZIP_NOT_EMPTY;
|