@secrecy/lib 1.0.0-dev.63 → 1.0.0-dev.65

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (196) hide show
  1. package/dist/BaseClient-15fdf493.d.ts +351 -0
  2. package/dist/BaseClient.cjs +2 -0
  3. package/dist/BaseClient.cjs.map +1 -0
  4. package/dist/BaseClient.d.ts +16 -104
  5. package/dist/BaseClient.js +2 -482
  6. package/dist/BaseClient.js.map +1 -0
  7. package/dist/PopupTools.cjs +2 -0
  8. package/dist/PopupTools.cjs.map +1 -0
  9. package/dist/PopupTools.d.ts +5 -4
  10. package/dist/PopupTools.js +2 -216
  11. package/dist/PopupTools.js.map +1 -0
  12. package/dist/ZeusThunder.cjs +2 -0
  13. package/dist/ZeusThunder.cjs.map +1 -0
  14. package/dist/ZeusThunder.d.ts +6 -2
  15. package/dist/ZeusThunder.js +2 -79
  16. package/dist/ZeusThunder.js.map +1 -0
  17. package/dist/cache.cjs +2 -0
  18. package/dist/cache.cjs.map +1 -0
  19. package/dist/cache.d.ts +22 -4
  20. package/dist/cache.js +2 -4
  21. package/dist/cache.js.map +1 -0
  22. package/dist/chunk-5WPCTUWH.cjs +2 -0
  23. package/dist/chunk-5WPCTUWH.cjs.map +1 -0
  24. package/dist/chunk-KMTF2BZE.js +2 -0
  25. package/dist/chunk-KMTF2BZE.js.map +1 -0
  26. package/dist/client/SecrecyAppClient.cjs +2 -0
  27. package/dist/client/SecrecyAppClient.cjs.map +1 -0
  28. package/dist/client/SecrecyAppClient.d.ts +16 -17
  29. package/dist/client/SecrecyAppClient.js +2 -256
  30. package/dist/client/SecrecyAppClient.js.map +1 -0
  31. package/dist/client/SecrecyCloudClient.cjs +2 -0
  32. package/dist/client/SecrecyCloudClient.cjs.map +1 -0
  33. package/dist/client/SecrecyCloudClient.d.ts +16 -89
  34. package/dist/client/SecrecyCloudClient.js +2 -1627
  35. package/dist/client/SecrecyCloudClient.js.map +1 -0
  36. package/dist/client/SecrecyDbClient.cjs +2 -0
  37. package/dist/client/SecrecyDbClient.cjs.map +1 -0
  38. package/dist/client/SecrecyDbClient.d.ts +16 -21
  39. package/dist/client/SecrecyDbClient.js +2 -198
  40. package/dist/client/SecrecyDbClient.js.map +1 -0
  41. package/dist/client/SecrecyMailClient.cjs +2 -0
  42. package/dist/client/SecrecyMailClient.cjs.map +1 -0
  43. package/dist/client/SecrecyMailClient.d.ts +16 -42
  44. package/dist/client/SecrecyMailClient.js +2 -1187
  45. package/dist/client/SecrecyMailClient.js.map +1 -0
  46. package/dist/client/SecrecyPayClient.cjs +2 -0
  47. package/dist/client/SecrecyPayClient.cjs.map +1 -0
  48. package/dist/client/SecrecyPayClient.d.ts +16 -7
  49. package/dist/client/SecrecyPayClient.js +2 -37
  50. package/dist/client/SecrecyPayClient.js.map +1 -0
  51. package/dist/client/SecrecyWalletClient.cjs +2 -0
  52. package/dist/client/SecrecyWalletClient.cjs.map +1 -0
  53. package/dist/client/SecrecyWalletClient.d.ts +16 -30
  54. package/dist/client/SecrecyWalletClient.js +2 -76
  55. package/dist/client/SecrecyWalletClient.js.map +1 -0
  56. package/dist/client/convert/file.cjs +2 -0
  57. package/dist/client/convert/file.cjs.map +1 -0
  58. package/dist/client/convert/file.d.ts +11 -5
  59. package/dist/client/convert/file.js +2 -34
  60. package/dist/client/convert/file.js.map +1 -0
  61. package/dist/client/convert/mail.cjs +2 -0
  62. package/dist/client/convert/mail.cjs.map +1 -0
  63. package/dist/client/convert/mail.d.ts +13 -3
  64. package/dist/client/convert/mail.js +2 -48
  65. package/dist/client/convert/mail.js.map +1 -0
  66. package/dist/client/convert/node.cjs +2 -0
  67. package/dist/client/convert/node.cjs.map +1 -0
  68. package/dist/client/convert/node.d.ts +18 -9
  69. package/dist/client/convert/node.js +2 -100
  70. package/dist/client/convert/node.js.map +1 -0
  71. package/dist/client/helpers.cjs +2 -0
  72. package/dist/client/helpers.cjs.map +1 -0
  73. package/dist/client/helpers.d.ts +16 -28
  74. package/dist/client/helpers.js +2 -126
  75. package/dist/client/helpers.js.map +1 -0
  76. package/dist/client/index.cjs +2 -0
  77. package/dist/client/index.cjs.map +1 -0
  78. package/dist/client/index.d.ts +16 -34
  79. package/dist/client/index.js +2 -52
  80. package/dist/client/index.js.map +1 -0
  81. package/dist/client/storage.cjs +2 -0
  82. package/dist/client/storage.cjs.map +1 -0
  83. package/dist/client/storage.d.ts +6 -3
  84. package/dist/client/storage.js +2 -12
  85. package/dist/client/storage.js.map +1 -0
  86. package/dist/client/types/File.cjs +1 -0
  87. package/dist/client/types/File.cjs.map +1 -0
  88. package/dist/client/types/File.d.ts +9 -5
  89. package/dist/client/types/File.js +1 -3
  90. package/dist/client/types/File.js.map +1 -0
  91. package/dist/client/types/Inputs.cjs +1 -0
  92. package/dist/client/types/Inputs.cjs.map +1 -0
  93. package/dist/client/types/Inputs.d.ts +6 -4
  94. package/dist/client/types/Inputs.js +1 -3
  95. package/dist/client/types/Inputs.js.map +1 -0
  96. package/dist/client/types/Node.cjs +1 -0
  97. package/dist/client/types/Node.cjs.map +1 -0
  98. package/dist/client/types/Node.d.ts +9 -56
  99. package/dist/client/types/Node.js +1 -3
  100. package/dist/client/types/Node.js.map +1 -0
  101. package/dist/client/types/UserAppNotifications.cjs +1 -0
  102. package/dist/client/types/UserAppNotifications.cjs.map +1 -0
  103. package/dist/client/types/UserAppNotifications.d.ts +3 -1
  104. package/dist/client/types/UserAppNotifications.js +1 -3
  105. package/dist/client/types/UserAppNotifications.js.map +1 -0
  106. package/dist/client/types/UserAppSettings.cjs +1 -0
  107. package/dist/client/types/UserAppSettings.cjs.map +1 -0
  108. package/dist/client/types/UserAppSettings.d.ts +3 -1
  109. package/dist/client/types/UserAppSettings.js +1 -3
  110. package/dist/client/types/UserAppSettings.js.map +1 -0
  111. package/dist/client/types/index.cjs +2 -0
  112. package/dist/client/types/index.cjs.map +1 -0
  113. package/dist/client/types/index.d.ts +86 -30
  114. package/dist/client/types/index.js +2 -8
  115. package/dist/client/types/index.js.map +1 -0
  116. package/dist/client/types/selectors.cjs +2 -0
  117. package/dist/client/types/selectors.cjs.map +1 -0
  118. package/dist/client/types/selectors.d.ts +7 -5
  119. package/dist/client/types/selectors.js +2 -138
  120. package/dist/client/types/selectors.js.map +1 -0
  121. package/dist/crypto/file.cjs +2 -0
  122. package/dist/crypto/file.cjs.map +1 -0
  123. package/dist/crypto/file.d.ts +8 -6
  124. package/dist/crypto/file.js +2 -210
  125. package/dist/crypto/file.js.map +1 -0
  126. package/dist/crypto/index.cjs +2 -0
  127. package/dist/crypto/index.cjs.map +1 -0
  128. package/dist/crypto/index.d.ts +11 -9
  129. package/dist/crypto/index.js +2 -47
  130. package/dist/crypto/index.js.map +1 -0
  131. package/dist/error.cjs +1 -0
  132. package/dist/error.cjs.map +1 -0
  133. package/dist/error.d.ts +12 -10
  134. package/dist/error.js +1 -3
  135. package/dist/error.js.map +1 -0
  136. package/dist/index.cjs +2 -0
  137. package/dist/index.cjs.map +1 -0
  138. package/dist/index.d.ts +19 -11
  139. package/dist/index.js +2 -9
  140. package/dist/index.js.map +1 -0
  141. package/dist/minify/index.cjs +2 -0
  142. package/dist/minify/index.cjs.map +1 -0
  143. package/dist/minify/index.d.ts +4 -2
  144. package/dist/minify/index.js +2 -28
  145. package/dist/minify/index.js.map +1 -0
  146. package/dist/minify/lz4.cjs +3 -0
  147. package/dist/minify/lz4.cjs.map +1 -0
  148. package/dist/minify/lz4.d.ts +7 -5
  149. package/dist/minify/lz4.js +3 -627
  150. package/dist/minify/lz4.js.map +1 -0
  151. package/dist/sodium.cjs +2 -0
  152. package/dist/sodium.cjs.map +1 -0
  153. package/dist/sodium.d.ts +5 -3
  154. package/dist/sodium.js +2 -6
  155. package/dist/sodium.js.map +1 -0
  156. package/dist/utils/store-buddy.cjs +2 -0
  157. package/dist/utils/store-buddy.cjs.map +1 -0
  158. package/dist/utils/store-buddy.d.ts +4 -3
  159. package/dist/utils/store-buddy.js +2 -65
  160. package/dist/utils/store-buddy.js.map +1 -0
  161. package/dist/utils/time.cjs +2 -0
  162. package/dist/utils/time.cjs.map +1 -0
  163. package/dist/utils/time.d.ts +4 -2
  164. package/dist/utils/time.js +2 -14
  165. package/dist/utils/time.js.map +1 -0
  166. package/dist/utils/utils.cjs +2 -0
  167. package/dist/utils/utils.cjs.map +1 -0
  168. package/dist/utils/utils.d.ts +6 -4
  169. package/dist/utils/utils.js +2 -57
  170. package/dist/utils/utils.js.map +1 -0
  171. package/dist/worker/md5.cjs +2 -0
  172. package/dist/worker/md5.cjs.map +1 -0
  173. package/dist/worker/md5.d.ts +3 -1
  174. package/dist/worker/md5.js +2 -25
  175. package/dist/worker/md5.js.map +1 -0
  176. package/dist/worker/sodium.cjs +2 -0
  177. package/dist/worker/sodium.cjs.map +1 -0
  178. package/dist/worker/sodium.d.ts +6 -3
  179. package/dist/worker/sodium.js +2 -120
  180. package/dist/worker/sodium.js.map +1 -0
  181. package/dist/worker/workerCodes.cjs +254 -0
  182. package/dist/worker/workerCodes.cjs.map +1 -0
  183. package/dist/worker/workerCodes.d.ts +4 -2
  184. package/dist/worker/workerCodes.js +4 -5
  185. package/dist/worker/workerCodes.js.map +1 -0
  186. package/dist/zeus/const.cjs +2 -0
  187. package/dist/zeus/const.cjs.map +1 -0
  188. package/dist/zeus/const.d.ts +5 -3
  189. package/dist/zeus/const.js +2 -1286
  190. package/dist/zeus/const.js.map +1 -0
  191. package/dist/zeus/index.cjs +5 -0
  192. package/dist/zeus/index.cjs.map +1 -0
  193. package/dist/zeus/index.d.ts +80 -78
  194. package/dist/zeus/index.js +5 -687
  195. package/dist/zeus/index.js.map +1 -0
  196. package/package.json +27 -30
@@ -1,627 +1,3 @@
1
- // lz4-ts @license BSD-3-Clause / Copyright (c) 2015, Pierre Curto / 2016, oov. All rights reserved.
2
-
3
- /**
4
- * Copyright (c) 2015, Pierre Curto
5
- * Copyright (c) 2016, oov
6
- * All rights reserved.
7
- *
8
- * Redistribution and use in source and binary forms, with or without
9
- * modification, are permitted provided that the following conditions are met:
10
- *
11
- * * Redistributions of source code must retain the above copyright notice, this
12
- * list of conditions and the following disclaimer.
13
- *
14
- * * Redistributions in binary form must reproduce the above copyright notice,
15
- * this list of conditions and the following disclaimer in the documentation
16
- * and/or other materials provided with the distribution.
17
- *
18
- * * Neither the name of xxHash nor the names of its
19
- * contributors may be used to endorse or promote products derived from
20
- * this software without specific prior written permission.
21
- *
22
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
23
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
25
- * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
26
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
27
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
28
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
29
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
30
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
31
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32
- */
33
- const errInvalidSource = new Error("invalid source");
34
- const errShortBuffer = new Error("short buffer"); // The following constants are used to setup the compression algorithm.
35
-
36
- const minMatch = 4; // the minimum size of the match sequence size (4 bytes)
37
-
38
- const winSizeLog = 16; // LZ4 64Kb window size limit
39
-
40
- const winSize = 1 << winSizeLog;
41
- const winMask = winSize - 1; // 64Kb window of previous data for dependent blocks
42
- // hashSizeLog determines the size of the hash table used to quickly find a previous match position.
43
- // Its value influences the compression speed and memory usage, the lower the faster,
44
- // but at the expense of the compression ratio.
45
- // 16 seems to be the best compromise.
46
-
47
- const hashSizeLog = 16;
48
- const hashSize = 1 << hashSizeLog;
49
- const hashShift = minMatch * 8 - hashSizeLog;
50
- const mfLimit = 8 + minMatch; // The last match cannot start within the last 12 bytes.
51
-
52
- const skipStrength = 6; // variable step for fast scan
53
-
54
- const hasher = 2654435761 | 0; // prime number used to hash minMatch
55
- // https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Math/imul#Polyfill
56
-
57
- function imulPolyfill(a, b) {
58
- const ah = a >>> 16 & 0xffff;
59
- const al = a & 0xffff;
60
- const bh = b >>> 16 & 0xffff;
61
- const bl = b & 0xffff; // the shift by 0 fixes the sign on the high part
62
- // the final |0 converts the unsigned value into a signed value
63
-
64
- return al * bl + (ah * bl + al * bh << 16 >>> 0) | 0;
65
- }
66
-
67
- const imul = Math.imul ? Math.imul : imulPolyfill;
68
-
69
- function getUint32(a, i) {
70
- return a[i + 3] | a[i + 2] << 8 | a[i + 1] << 16 | a[i] << 24;
71
- }
72
-
73
- function copy(dest, src, di, si, len) {
74
- for (let i = 0; i < len; ++i) {
75
- dest[di++] = src[si++];
76
- }
77
- }
78
-
79
- export function calcUncompressedLen(src) {
80
- const sn = src.length;
81
-
82
- if (sn === 0) {
83
- return 0;
84
- }
85
-
86
- let si = 0;
87
- let di = 0;
88
-
89
- while (true) {
90
- // literals and match lengths (token)
91
- let lLen = src[si] >> 4;
92
- let mLen = src[si] & 0xf;
93
-
94
- if (++si === sn) {
95
- throw errInvalidSource;
96
- } // literals
97
-
98
-
99
- if (lLen > 0) {
100
- if (lLen === 0xf) {
101
- while (src[si] === 0xff) {
102
- lLen += 0xff;
103
-
104
- if (++si === sn) {
105
- throw errInvalidSource;
106
- }
107
- }
108
-
109
- lLen += src[si];
110
-
111
- if (++si === sn) {
112
- throw errInvalidSource;
113
- }
114
- }
115
-
116
- di += lLen;
117
- si += lLen;
118
-
119
- if (si >= sn) {
120
- return di;
121
- }
122
- }
123
-
124
- si += 2;
125
-
126
- if (si >= sn) {
127
- throw errInvalidSource;
128
- }
129
-
130
- const offset = src[si - 2] | src[si - 1] << 8;
131
-
132
- if (di - offset < 0 || offset === 0) {
133
- throw errInvalidSource;
134
- } // match
135
-
136
-
137
- if (mLen === 0xf) {
138
- while (src[si] === 0xff) {
139
- mLen += 0xff;
140
-
141
- if (++si === sn) {
142
- throw errInvalidSource;
143
- }
144
- }
145
-
146
- mLen += src[si];
147
-
148
- if (++si === sn) {
149
- throw errInvalidSource;
150
- }
151
- } // minimum match length is 4
152
-
153
-
154
- mLen += 4; // copy the match (NB. match is at least 4 bytes long)
155
-
156
- for (; mLen >= offset; mLen -= offset) {
157
- di += offset;
158
- }
159
-
160
- di += mLen;
161
- }
162
- }
163
- export function uncompressBlock(src, dest) {
164
- const sn = src.length;
165
- const dn = dest.length;
166
-
167
- if (sn === 0) {
168
- return 0;
169
- }
170
-
171
- let si = 0;
172
- let di = 0;
173
-
174
- while (true) {
175
- // literals and match lengths (token)
176
- let lLen = src[si] >> 4;
177
- let mLen = src[si] & 0xf;
178
-
179
- if (++si === sn) {
180
- throw errInvalidSource;
181
- } // literals
182
-
183
-
184
- if (lLen > 0) {
185
- if (lLen === 0xf) {
186
- while (src[si] === 0xff) {
187
- lLen += 0xff;
188
-
189
- if (++si === sn) {
190
- throw errInvalidSource;
191
- }
192
- }
193
-
194
- lLen += src[si];
195
-
196
- if (++si === sn) {
197
- throw errInvalidSource;
198
- }
199
- }
200
-
201
- if (dn - di < lLen || si + lLen > sn) {
202
- throw errShortBuffer;
203
- }
204
-
205
- copy(dest, src, di, si, lLen);
206
- di += lLen;
207
- si += lLen;
208
-
209
- if (si >= sn) {
210
- return di;
211
- }
212
- }
213
-
214
- si += 2;
215
-
216
- if (si >= sn) {
217
- throw errInvalidSource;
218
- }
219
-
220
- const offset = src[si - 2] | src[si - 1] << 8;
221
-
222
- if (di - offset < 0 || offset === 0) {
223
- throw errInvalidSource;
224
- } // match
225
-
226
-
227
- if (mLen === 0xf) {
228
- while (src[si] === 0xff) {
229
- mLen += 0xff;
230
-
231
- if (++si === sn) {
232
- throw errInvalidSource;
233
- }
234
- }
235
-
236
- mLen += src[si];
237
-
238
- if (++si === sn) {
239
- throw errInvalidSource;
240
- }
241
- } // minimum match length is 4
242
-
243
-
244
- mLen += 4;
245
-
246
- if (dn - di <= mLen) {
247
- throw errShortBuffer;
248
- } // copy the match (NB. match is at least 4 bytes long)
249
-
250
-
251
- for (; mLen >= offset; mLen -= offset) {
252
- copy(dest, dest, di, di - offset, offset);
253
- di += offset;
254
- }
255
-
256
- copy(dest, dest, di, di - offset, mLen);
257
- di += mLen;
258
- }
259
- }
260
- export function compressBlockBound(n) {
261
- return n + (n / 255 | 0) + 16;
262
- }
263
- export function compressBlock(src, dest, soffset) {
264
- const sn = src.length - mfLimit;
265
- const dn = dest.length;
266
-
267
- if (sn <= 0 || dn === 0 || soffset >= sn) {
268
- return 0;
269
- }
270
-
271
- let si = 0,
272
- di = 0; // fast scan strategy:
273
- // we only need a hash table to store the last sequences (4 bytes)
274
-
275
- const hashTable = new Uint32Array(hashSize); // Initialise the hash table with the first 64Kb of the input buffer
276
- // (used when compressing dependent blocks)
277
-
278
- while (si < soffset) {
279
- const h = imul(getUint32(src, si), hasher) >>> hashShift;
280
- hashTable[h] = ++si;
281
- }
282
-
283
- let anchor = si;
284
- let fma = 1 << skipStrength;
285
-
286
- while (si < sn - minMatch) {
287
- // hash the next 4 bytes (sequence)...
288
- const h = imul(getUint32(src, si), hasher) >>> hashShift; // -1 to separate existing entries from new ones
289
-
290
- const ref = hashTable[h] - 1; // ...and store the position of the hash in the hash table (+1 to compensate the -1 upon saving)
291
-
292
- hashTable[h] = si + 1; // no need to check the last 3 bytes in the first literal 4 bytes as
293
- // this guarantees that the next match, if any, is compressed with
294
- // a lower size, since to have some compression we must have:
295
- // ll+ml-overlap > 1 + (ll-15)/255 + (ml-4-15)/255 + 2 (uncompressed size>compressed size)
296
- // => ll+ml>3+2*overlap => ll+ml>= 4+2*overlap
297
- // and by definition we do have:
298
- // ll >= 1, ml >= 4
299
- // => ll+ml >= 5
300
- // => so overlap must be 0
301
- // the sequence is new, out of bound (64kb) or not valid: try next sequence
302
-
303
- if (ref < 0 || //(fma & ((1 << skipStrength) - 1)) < 4 || // this code seems has a big penalty for size...
304
- si - ref >> winSizeLog > 0 || src[ref] !== src[si] || src[ref + 1] !== src[si + 1] || src[ref + 2] !== src[si + 2] || src[ref + 3] !== src[si + 3]) {
305
- // variable step: improves performance on non-compressible data
306
- si += fma >> skipStrength;
307
- ++fma;
308
- continue;
309
- } // match found
310
-
311
-
312
- fma = 1 << skipStrength;
313
- const lLen = si - anchor;
314
- const offset = si - ref; // encode match length part 1
315
-
316
- si += minMatch;
317
- let mLen = si; // match length has minMatch already
318
-
319
- while (si <= sn && src[si] === src[si - offset]) {
320
- si++;
321
- }
322
-
323
- mLen = si - mLen;
324
-
325
- if (mLen < 0xf) {
326
- dest[di] = mLen;
327
- } else {
328
- dest[di] = 0xf;
329
- } // encode literals length
330
-
331
-
332
- if (lLen < 0xf) {
333
- dest[di] |= lLen << 4;
334
- } else {
335
- dest[di] |= 0xf0;
336
-
337
- if (++di === dn) {
338
- throw errShortBuffer;
339
- }
340
-
341
- let l = lLen - 0xf;
342
-
343
- for (; l >= 0xff; l -= 0xff) {
344
- dest[di] = 0xff;
345
-
346
- if (++di === dn) {
347
- throw errShortBuffer;
348
- }
349
- }
350
-
351
- dest[di] = l & 0xff;
352
- }
353
-
354
- if (++di === dn) {
355
- throw errShortBuffer;
356
- } // literals
357
-
358
-
359
- if (di + lLen >= dn) {
360
- throw errShortBuffer;
361
- }
362
-
363
- copy(dest, src, di, anchor, lLen);
364
- di += lLen;
365
- anchor = si; // encode offset
366
-
367
- di += 2;
368
-
369
- if (di >= dn) {
370
- throw errShortBuffer;
371
- }
372
-
373
- dest[di - 2] = offset;
374
- dest[di - 1] = offset >> 8; // encode match length part 2
375
-
376
- if (mLen >= 0xf) {
377
- for (mLen -= 0xf; mLen >= 0xff; mLen -= 0xff) {
378
- dest[di] = 0xff;
379
-
380
- if (++di === dn) {
381
- throw errShortBuffer;
382
- }
383
- }
384
-
385
- dest[di] = mLen;
386
-
387
- if (++di === dn) {
388
- throw errShortBuffer;
389
- }
390
- }
391
- }
392
-
393
- if (anchor === 0) {
394
- // incompressible
395
- return 0;
396
- } // last literals
397
-
398
-
399
- let lLen = src.length - anchor;
400
-
401
- if (lLen < 0xf) {
402
- dest[di] = lLen << 4;
403
- } else {
404
- dest[di] = 0xf0;
405
-
406
- if (++di === dn) {
407
- throw errShortBuffer;
408
- }
409
-
410
- for (lLen -= 0xf; lLen >= 0xff; lLen -= 0xff) {
411
- dest[di] = 0xff;
412
-
413
- if (++di === dn) {
414
- throw errShortBuffer;
415
- }
416
- }
417
-
418
- dest[di] = lLen;
419
- }
420
-
421
- if (++di === dn) {
422
- throw errShortBuffer;
423
- } // write literals
424
-
425
-
426
- const lastLen = src.length - anchor;
427
- const n = di + lastLen;
428
-
429
- if (n > dn) {
430
- throw errShortBuffer;
431
- } else if (n >= sn) {
432
- // incompressible
433
- return 0;
434
- }
435
-
436
- copy(dest, src, di, anchor, lastLen);
437
- di += lastLen;
438
- return di;
439
- }
440
- export function compressBlockHC(src, dest, soffset) {
441
- const sn = src.length - mfLimit;
442
- const dn = dest.length;
443
-
444
- if (sn <= 0 || dn === 0 || soffset >= sn) {
445
- return 0;
446
- }
447
-
448
- let si = 0;
449
- let di = 0; // Hash Chain strategy:
450
- // we need a hash table and a chain table
451
- // the chain table cannot contain more entries than the window size (64Kb entries)
452
-
453
- const hashTable = new Uint32Array(hashSize);
454
- const chainTable = new Uint32Array(winSize); // Initialise the hash table with the first 64Kb of the input buffer
455
- // (used when compressing dependent blocks)
456
-
457
- while (si < soffset) {
458
- const h = imul(getUint32(src, si), hasher) >>> hashShift;
459
- chainTable[si & winMask] = hashTable[h];
460
- hashTable[h] = ++si;
461
- }
462
-
463
- let anchor = si;
464
-
465
- while (si < sn - minMatch) {
466
- // hash the next 4 bytes (sequence)...
467
- const h = imul(getUint32(src, si), hasher) >>> hashShift; // follow the chain until out of window and give the longest match
468
-
469
- let mLen = 0;
470
- let offset = 0;
471
-
472
- for (let next = hashTable[h] - 1; next > 0 && next > si - winSize; next = chainTable[next & winMask] - 1) {
473
- // the first (mLen==0) or next byte (mLen>=minMatch) at current match length must match to improve on the match length
474
- if (src[next + mLen] === src[si + mLen]) {
475
- for (let ml = 0;; ++ml) {
476
- if (src[next + ml] !== src[si + ml] || si + ml > sn) {
477
- // found a longer match, keep its position and length
478
- if (mLen < ml && ml >= minMatch) {
479
- mLen = ml;
480
- offset = si - next;
481
- }
482
-
483
- break;
484
- }
485
- }
486
- }
487
- }
488
-
489
- chainTable[si & winMask] = hashTable[h];
490
- hashTable[h] = si + 1; // no match found
491
-
492
- if (mLen === 0) {
493
- ++si;
494
- continue;
495
- }
496
-
497
- let si2 = si + 1;
498
- const ml = si + mLen; // match found
499
- // update hash/chain tables with overlaping bytes:
500
- // si already hashed, add everything from si+1 up to the match length
501
-
502
- while (si2 < ml) {
503
- const h = imul(getUint32(src, si2), hasher) >>> hashShift;
504
- chainTable[si2 & winMask] = hashTable[h];
505
- hashTable[h] = ++si2;
506
- }
507
-
508
- const lLen = si - anchor;
509
- si += mLen;
510
- mLen -= minMatch; // match length does not include minMatch
511
-
512
- if (mLen < 0xf) {
513
- dest[di] = mLen;
514
- } else {
515
- dest[di] = 0xf;
516
- } // encode literals length
517
-
518
-
519
- if (lLen < 0xf) {
520
- dest[di] |= lLen << 4;
521
- } else {
522
- dest[di] |= 0xf0;
523
-
524
- if (++di === dn) {
525
- throw errShortBuffer;
526
- }
527
-
528
- let l = lLen - 0xf;
529
-
530
- for (; l >= 0xff; l -= 0xff) {
531
- dest[di] = 0xff;
532
-
533
- if (++di === dn) {
534
- throw errShortBuffer;
535
- }
536
- }
537
-
538
- dest[di] = l & 0xff;
539
- }
540
-
541
- if (++di === dn) {
542
- throw errShortBuffer;
543
- } // literals
544
-
545
-
546
- if (di + lLen >= dn) {
547
- throw errShortBuffer;
548
- }
549
-
550
- copy(dest, src, di, anchor, lLen);
551
- di += lLen;
552
- anchor = si; // encode offset
553
-
554
- di += 2;
555
-
556
- if (di >= dn) {
557
- throw errShortBuffer;
558
- }
559
-
560
- dest[di - 2] = offset;
561
- dest[di - 1] = offset >> 8; // encode match length part 2
562
-
563
- if (mLen >= 0xf) {
564
- for (mLen -= 0xf; mLen >= 0xff; mLen -= 0xff) {
565
- dest[di] = 0xff;
566
-
567
- if (++di === dn) {
568
- throw errShortBuffer;
569
- }
570
- }
571
-
572
- dest[di] = mLen;
573
-
574
- if (++di === dn) {
575
- throw errShortBuffer;
576
- }
577
- }
578
- }
579
-
580
- if (anchor === 0) {
581
- // incompressible
582
- return 0;
583
- } // last literals
584
-
585
-
586
- let lLen = src.length - anchor;
587
-
588
- if (lLen < 0xf) {
589
- dest[di] = lLen << 4;
590
- } else {
591
- dest[di] = 0xf0;
592
-
593
- if (++di === dn) {
594
- throw errShortBuffer;
595
- }
596
-
597
- for (lLen -= 0xf; lLen >= 0xff; lLen -= 0xff) {
598
- dest[di] = 0xff;
599
-
600
- if (++di === dn) {
601
- throw errShortBuffer;
602
- }
603
- }
604
-
605
- dest[di] = lLen;
606
- }
607
-
608
- if (++di === dn) {
609
- throw errShortBuffer;
610
- } // write literals
611
-
612
-
613
- const lastLen = src.length - anchor;
614
- const n = di + lastLen;
615
-
616
- if (n > dn) {
617
- throw errShortBuffer;
618
- } else if (n >= sn) {
619
- // incompressible
620
- return 0;
621
- }
622
-
623
- copy(dest, src, di, anchor, lastLen);
624
- di += lastLen;
625
- return di;
626
- }
627
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJlcnJJbnZhbGlkU291cmNlIiwiRXJyb3IiLCJlcnJTaG9ydEJ1ZmZlciIsIm1pbk1hdGNoIiwid2luU2l6ZUxvZyIsIndpblNpemUiLCJ3aW5NYXNrIiwiaGFzaFNpemVMb2ciLCJoYXNoU2l6ZSIsImhhc2hTaGlmdCIsIm1mTGltaXQiLCJza2lwU3RyZW5ndGgiLCJoYXNoZXIiLCJpbXVsUG9seWZpbGwiLCJhIiwiYiIsImFoIiwiYWwiLCJiaCIsImJsIiwiaW11bCIsIk1hdGgiLCJnZXRVaW50MzIiLCJpIiwiY29weSIsImRlc3QiLCJzcmMiLCJkaSIsInNpIiwibGVuIiwiY2FsY1VuY29tcHJlc3NlZExlbiIsInNuIiwibGVuZ3RoIiwibExlbiIsIm1MZW4iLCJvZmZzZXQiLCJ1bmNvbXByZXNzQmxvY2siLCJkbiIsImNvbXByZXNzQmxvY2tCb3VuZCIsIm4iLCJjb21wcmVzc0Jsb2NrIiwic29mZnNldCIsImhhc2hUYWJsZSIsIlVpbnQzMkFycmF5IiwiaCIsImFuY2hvciIsImZtYSIsInJlZiIsImwiLCJsYXN0TGVuIiwiY29tcHJlc3NCbG9ja0hDIiwiY2hhaW5UYWJsZSIsIm5leHQiLCJtbCIsInNpMiJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9taW5pZnkvbHo0LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIGx6NC10cyBAbGljZW5zZSBCU0QtMy1DbGF1c2UgLyBDb3B5cmlnaHQgKGMpIDIwMTUsIFBpZXJyZSBDdXJ0byAvIDIwMTYsIG9vdi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE1LCBQaWVycmUgQ3VydG9cbiAqIENvcHlyaWdodCAoYykgMjAxNiwgb292XG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG4gKlxuICogKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXNcbiAqICAgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4gKlxuICogKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsXG4gKiAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb25cbiAqICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uXG4gKlxuICogKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHh4SGFzaCBub3IgdGhlIG5hbWVzIG9mIGl0c1xuICogICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbVxuICogICB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuICpcbiAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4gKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkVcbiAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEVcbiAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMXG4gKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUlxuICogU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVJcbiAqIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksXG4gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRVxuICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiAqL1xuXG5jb25zdCBlcnJJbnZhbGlkU291cmNlID0gbmV3IEVycm9yKFwiaW52YWxpZCBzb3VyY2VcIik7XG5jb25zdCBlcnJTaG9ydEJ1ZmZlciA9IG5ldyBFcnJvcihcInNob3J0IGJ1ZmZlclwiKTtcblxuLy8gVGhlIGZvbGxvd2luZyBjb25zdGFudHMgYXJlIHVzZWQgdG8gc2V0dXAgdGhlIGNvbXByZXNzaW9uIGFsZ29yaXRobS5cbmNvbnN0IG1pbk1hdGNoID0gNDsgLy8gdGhlIG1pbmltdW0gc2l6ZSBvZiB0aGUgbWF0Y2ggc2VxdWVuY2Ugc2l6ZSAoNCBieXRlcylcbmNvbnN0IHdpblNpemVMb2cgPSAxNjsgLy8gTFo0IDY0S2Igd2luZG93IHNpemUgbGltaXRcbmNvbnN0IHdpblNpemUgPSAxIDw8IHdpblNpemVMb2c7XG5jb25zdCB3aW5NYXNrID0gd2luU2l6ZSAtIDE7IC8vIDY0S2Igd2luZG93IG9mIHByZXZpb3VzIGRhdGEgZm9yIGRlcGVuZGVudCBibG9ja3NcblxuLy8gaGFzaFNpemVMb2cgZGV0ZXJtaW5lcyB0aGUgc2l6ZSBvZiB0aGUgaGFzaCB0YWJsZSB1c2VkIHRvIHF1aWNrbHkgZmluZCBhIHByZXZpb3VzIG1hdGNoIHBvc2l0aW9uLlxuLy8gSXRzIHZhbHVlIGluZmx1ZW5jZXMgdGhlIGNvbXByZXNzaW9uIHNwZWVkIGFuZCBtZW1vcnkgdXNhZ2UsIHRoZSBsb3dlciB0aGUgZmFzdGVyLFxuLy8gYnV0IGF0IHRoZSBleHBlbnNlIG9mIHRoZSBjb21wcmVzc2lvbiByYXRpby5cbi8vIDE2IHNlZW1zIHRvIGJlIHRoZSBiZXN0IGNvbXByb21pc2UuXG5jb25zdCBoYXNoU2l6ZUxvZyA9IDE2O1xuY29uc3QgaGFzaFNpemUgPSAxIDw8IGhhc2hTaXplTG9nO1xuY29uc3QgaGFzaFNoaWZ0ID0gbWluTWF0Y2ggKiA4IC0gaGFzaFNpemVMb2c7XG5cbmNvbnN0IG1mTGltaXQgPSA4ICsgbWluTWF0Y2g7IC8vIFRoZSBsYXN0IG1hdGNoIGNhbm5vdCBzdGFydCB3aXRoaW4gdGhlIGxhc3QgMTIgYnl0ZXMuXG5jb25zdCBza2lwU3RyZW5ndGggPSA2OyAvLyB2YXJpYWJsZSBzdGVwIGZvciBmYXN0IHNjYW5cblxuY29uc3QgaGFzaGVyID0gMjY1NDQzNTc2MSB8IDA7IC8vIHByaW1lIG51bWJlciB1c2VkIHRvIGhhc2ggbWluTWF0Y2hcblxuLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4vZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvTWF0aC9pbXVsI1BvbHlmaWxsXG5mdW5jdGlvbiBpbXVsUG9seWZpbGwoYTogbnVtYmVyLCBiOiBudW1iZXIpOiBudW1iZXIge1xuICBjb25zdCBhaCA9IChhID4+PiAxNikgJiAweGZmZmY7XG4gIGNvbnN0IGFsID0gYSAmIDB4ZmZmZjtcbiAgY29uc3QgYmggPSAoYiA+Pj4gMTYpICYgMHhmZmZmO1xuICBjb25zdCBibCA9IGIgJiAweGZmZmY7XG4gIC8vIHRoZSBzaGlmdCBieSAwIGZpeGVzIHRoZSBzaWduIG9uIHRoZSBoaWdoIHBhcnRcbiAgLy8gdGhlIGZpbmFsIHwwIGNvbnZlcnRzIHRoZSB1bnNpZ25lZCB2YWx1ZSBpbnRvIGEgc2lnbmVkIHZhbHVlXG4gIHJldHVybiAoYWwgKiBibCArICgoKGFoICogYmwgKyBhbCAqIGJoKSA8PCAxNikgPj4+IDApKSB8IDA7XG59XG5jb25zdCBpbXVsID0gTWF0aC5pbXVsID8gTWF0aC5pbXVsIDogaW11bFBvbHlmaWxsO1xuXG5mdW5jdGlvbiBnZXRVaW50MzIoYTogVWludDhBcnJheSwgaTogbnVtYmVyKTogbnVtYmVyIHtcbiAgcmV0dXJuIGFbaSArIDNdIHwgKGFbaSArIDJdIDw8IDgpIHwgKGFbaSArIDFdIDw8IDE2KSB8IChhW2ldIDw8IDI0KTtcbn1cblxuZnVuY3Rpb24gY29weShcbiAgZGVzdDogVWludDhBcnJheSxcbiAgc3JjOiBVaW50OEFycmF5LFxuICBkaTogbnVtYmVyLFxuICBzaTogbnVtYmVyLFxuICBsZW46IG51bWJlclxuKTogdm9pZCB7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyArK2kpIHtcbiAgICBkZXN0W2RpKytdID0gc3JjW3NpKytdO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjYWxjVW5jb21wcmVzc2VkTGVuKHNyYzogVWludDhBcnJheSk6IG51bWJlciB7XG4gIGNvbnN0IHNuID0gc3JjLmxlbmd0aDtcbiAgaWYgKHNuID09PSAwKSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICBsZXQgc2kgPSAwO1xuICBsZXQgZGkgPSAwO1xuXG4gIHdoaWxlICh0cnVlKSB7XG4gICAgLy8gbGl0ZXJhbHMgYW5kIG1hdGNoIGxlbmd0aHMgKHRva2VuKVxuICAgIGxldCBsTGVuID0gc3JjW3NpXSA+PiA0O1xuICAgIGxldCBtTGVuID0gc3JjW3NpXSAmIDB4ZjtcbiAgICBpZiAoKytzaSA9PT0gc24pIHtcbiAgICAgIHRocm93IGVyckludmFsaWRTb3VyY2U7XG4gICAgfVxuXG4gICAgLy8gbGl0ZXJhbHNcbiAgICBpZiAobExlbiA+IDApIHtcbiAgICAgIGlmIChsTGVuID09PSAweGYpIHtcbiAgICAgICAgd2hpbGUgKHNyY1tzaV0gPT09IDB4ZmYpIHtcbiAgICAgICAgICBsTGVuICs9IDB4ZmY7XG4gICAgICAgICAgaWYgKCsrc2kgPT09IHNuKSB7XG4gICAgICAgICAgICB0aHJvdyBlcnJJbnZhbGlkU291cmNlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsTGVuICs9IHNyY1tzaV07XG4gICAgICAgIGlmICgrK3NpID09PSBzbikge1xuICAgICAgICAgIHRocm93IGVyckludmFsaWRTb3VyY2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGRpICs9IGxMZW47XG4gICAgICBzaSArPSBsTGVuO1xuICAgICAgaWYgKHNpID49IHNuKSB7XG4gICAgICAgIHJldHVybiBkaTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBzaSArPSAyO1xuICAgIGlmIChzaSA+PSBzbikge1xuICAgICAgdGhyb3cgZXJySW52YWxpZFNvdXJjZTtcbiAgICB9XG4gICAgY29uc3Qgb2Zmc2V0ID0gc3JjW3NpIC0gMl0gfCAoc3JjW3NpIC0gMV0gPDwgOCk7XG4gICAgaWYgKGRpIC0gb2Zmc2V0IDwgMCB8fCBvZmZzZXQgPT09IDApIHtcbiAgICAgIHRocm93IGVyckludmFsaWRTb3VyY2U7XG4gICAgfVxuXG4gICAgLy8gbWF0Y2hcbiAgICBpZiAobUxlbiA9PT0gMHhmKSB7XG4gICAgICB3aGlsZSAoc3JjW3NpXSA9PT0gMHhmZikge1xuICAgICAgICBtTGVuICs9IDB4ZmY7XG4gICAgICAgIGlmICgrK3NpID09PSBzbikge1xuICAgICAgICAgIHRocm93IGVyckludmFsaWRTb3VyY2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIG1MZW4gKz0gc3JjW3NpXTtcbiAgICAgIGlmICgrK3NpID09PSBzbikge1xuICAgICAgICB0aHJvdyBlcnJJbnZhbGlkU291cmNlO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBtaW5pbXVtIG1hdGNoIGxlbmd0aCBpcyA0XG4gICAgbUxlbiArPSA0O1xuXG4gICAgLy8gY29weSB0aGUgbWF0Y2ggKE5CLiBtYXRjaCBpcyBhdCBsZWFzdCA0IGJ5dGVzIGxvbmcpXG4gICAgZm9yICg7IG1MZW4gPj0gb2Zmc2V0OyBtTGVuIC09IG9mZnNldCkge1xuICAgICAgZGkgKz0gb2Zmc2V0O1xuICAgIH1cbiAgICBkaSArPSBtTGVuO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1bmNvbXByZXNzQmxvY2soc3JjOiBVaW50OEFycmF5LCBkZXN0OiBVaW50OEFycmF5KTogbnVtYmVyIHtcbiAgY29uc3Qgc24gPSBzcmMubGVuZ3RoO1xuICBjb25zdCBkbiA9IGRlc3QubGVuZ3RoO1xuICBpZiAoc24gPT09IDApIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIGxldCBzaSA9IDA7XG4gIGxldCBkaSA9IDA7XG5cbiAgd2hpbGUgKHRydWUpIHtcbiAgICAvLyBsaXRlcmFscyBhbmQgbWF0Y2ggbGVuZ3RocyAodG9rZW4pXG4gICAgbGV0IGxMZW4gPSBzcmNbc2ldID4+IDQ7XG4gICAgbGV0IG1MZW4gPSBzcmNbc2ldICYgMHhmO1xuICAgIGlmICgrK3NpID09PSBzbikge1xuICAgICAgdGhyb3cgZXJySW52YWxpZFNvdXJjZTtcbiAgICB9XG5cbiAgICAvLyBsaXRlcmFsc1xuICAgIGlmIChsTGVuID4gMCkge1xuICAgICAgaWYgKGxMZW4gPT09IDB4Zikge1xuICAgICAgICB3aGlsZSAoc3JjW3NpXSA9PT0gMHhmZikge1xuICAgICAgICAgIGxMZW4gKz0gMHhmZjtcbiAgICAgICAgICBpZiAoKytzaSA9PT0gc24pIHtcbiAgICAgICAgICAgIHRocm93IGVyckludmFsaWRTb3VyY2U7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGxMZW4gKz0gc3JjW3NpXTtcbiAgICAgICAgaWYgKCsrc2kgPT09IHNuKSB7XG4gICAgICAgICAgdGhyb3cgZXJySW52YWxpZFNvdXJjZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGRuIC0gZGkgPCBsTGVuIHx8IHNpICsgbExlbiA+IHNuKSB7XG4gICAgICAgIHRocm93IGVyclNob3J0QnVmZmVyO1xuICAgICAgfVxuICAgICAgY29weShkZXN0LCBzcmMsIGRpLCBzaSwgbExlbik7XG4gICAgICBkaSArPSBsTGVuO1xuICAgICAgc2kgKz0gbExlbjtcbiAgICAgIGlmIChzaSA+PSBzbikge1xuICAgICAgICByZXR1cm4gZGk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgc2kgKz0gMjtcbiAgICBpZiAoc2kgPj0gc24pIHtcbiAgICAgIHRocm93IGVyckludmFsaWRTb3VyY2U7XG4gICAgfVxuICAgIGNvbnN0IG9mZnNldCA9IHNyY1tzaSAtIDJdIHwgKHNyY1tzaSAtIDFdIDw8IDgpO1xuICAgIGlmIChkaSAtIG9mZnNldCA8IDAgfHwgb2Zmc2V0ID09PSAwKSB7XG4gICAgICB0aHJvdyBlcnJJbnZhbGlkU291cmNlO1xuICAgIH1cblxuICAgIC8vIG1hdGNoXG4gICAgaWYgKG1MZW4gPT09IDB4Zikge1xuICAgICAgd2hpbGUgKHNyY1tzaV0gPT09IDB4ZmYpIHtcbiAgICAgICAgbUxlbiArPSAweGZmO1xuICAgICAgICBpZiAoKytzaSA9PT0gc24pIHtcbiAgICAgICAgICB0aHJvdyBlcnJJbnZhbGlkU291cmNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBtTGVuICs9IHNyY1tzaV07XG4gICAgICBpZiAoKytzaSA9PT0gc24pIHtcbiAgICAgICAgdGhyb3cgZXJySW52YWxpZFNvdXJjZTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gbWluaW11bSBtYXRjaCBsZW5ndGggaXMgNFxuICAgIG1MZW4gKz0gNDtcbiAgICBpZiAoZG4gLSBkaSA8PSBtTGVuKSB7XG4gICAgICB0aHJvdyBlcnJTaG9ydEJ1ZmZlcjtcbiAgICB9XG5cbiAgICAvLyBjb3B5IHRoZSBtYXRjaCAoTkIuIG1hdGNoIGlzIGF0IGxlYXN0IDQgYnl0ZXMgbG9uZylcbiAgICBmb3IgKDsgbUxlbiA+PSBvZmZzZXQ7IG1MZW4gLT0gb2Zmc2V0KSB7XG4gICAgICBjb3B5KGRlc3QsIGRlc3QsIGRpLCBkaSAtIG9mZnNldCwgb2Zmc2V0KTtcbiAgICAgIGRpICs9IG9mZnNldDtcbiAgICB9XG4gICAgY29weShkZXN0LCBkZXN0LCBkaSwgZGkgLSBvZmZzZXQsIG1MZW4pO1xuICAgIGRpICs9IG1MZW47XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbXByZXNzQmxvY2tCb3VuZChuOiBudW1iZXIpOiBudW1iZXIge1xuICByZXR1cm4gbiArICgobiAvIDI1NSkgfCAwKSArIDE2O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29tcHJlc3NCbG9jayhcbiAgc3JjOiBVaW50OEFycmF5LFxuICBkZXN0OiBVaW50OEFycmF5LFxuICBzb2Zmc2V0OiBudW1iZXJcbik6IG51bWJlciB7XG4gIGNvbnN0IHNuID0gc3JjLmxlbmd0aCAtIG1mTGltaXQ7XG4gIGNvbnN0IGRuID0gZGVzdC5sZW5ndGg7XG4gIGlmIChzbiA8PSAwIHx8IGRuID09PSAwIHx8IHNvZmZzZXQgPj0gc24pIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuICBsZXQgc2kgPSAwLFxuICAgIGRpID0gMDtcblxuICAvLyBmYXN0IHNjYW4gc3RyYXRlZ3k6XG4gIC8vIHdlIG9ubHkgbmVlZCBhIGhhc2ggdGFibGUgdG8gc3RvcmUgdGhlIGxhc3Qgc2VxdWVuY2VzICg0IGJ5dGVzKVxuICBjb25zdCBoYXNoVGFibGUgPSBuZXcgVWludDMyQXJyYXkoaGFzaFNpemUpO1xuXG4gIC8vIEluaXRpYWxpc2UgdGhlIGhhc2ggdGFibGUgd2l0aCB0aGUgZmlyc3QgNjRLYiBvZiB0aGUgaW5wdXQgYnVmZmVyXG4gIC8vICh1c2VkIHdoZW4gY29tcHJlc3NpbmcgZGVwZW5kZW50IGJsb2NrcylcbiAgd2hpbGUgKHNpIDwgc29mZnNldCkge1xuICAgIGNvbnN0IGggPSBpbXVsKGdldFVpbnQzMihzcmMsIHNpKSwgaGFzaGVyKSA+Pj4gaGFzaFNoaWZ0O1xuICAgIGhhc2hUYWJsZVtoXSA9ICsrc2k7XG4gIH1cblxuICBsZXQgYW5jaG9yID0gc2k7XG4gIGxldCBmbWEgPSAxIDw8IHNraXBTdHJlbmd0aDtcbiAgd2hpbGUgKHNpIDwgc24gLSBtaW5NYXRjaCkge1xuICAgIC8vIGhhc2ggdGhlIG5leHQgNCBieXRlcyAoc2VxdWVuY2UpLi4uXG4gICAgY29uc3QgaCA9IGltdWwoZ2V0VWludDMyKHNyYywgc2kpLCBoYXNoZXIpID4+PiBoYXNoU2hpZnQ7XG4gICAgLy8gLTEgdG8gc2VwYXJhdGUgZXhpc3RpbmcgZW50cmllcyBmcm9tIG5ldyBvbmVzXG4gICAgY29uc3QgcmVmID0gaGFzaFRhYmxlW2hdIC0gMTtcbiAgICAvLyAuLi5hbmQgc3RvcmUgdGhlIHBvc2l0aW9uIG9mIHRoZSBoYXNoIGluIHRoZSBoYXNoIHRhYmxlICgrMSB0byBjb21wZW5zYXRlIHRoZSAtMSB1cG9uIHNhdmluZylcbiAgICBoYXNoVGFibGVbaF0gPSBzaSArIDE7XG4gICAgLy8gbm8gbmVlZCB0byBjaGVjayB0aGUgbGFzdCAzIGJ5dGVzIGluIHRoZSBmaXJzdCBsaXRlcmFsIDQgYnl0ZXMgYXNcbiAgICAvLyB0aGlzIGd1YXJhbnRlZXMgdGhhdCB0aGUgbmV4dCBtYXRjaCwgaWYgYW55LCBpcyBjb21wcmVzc2VkIHdpdGhcbiAgICAvLyBhIGxvd2VyIHNpemUsIHNpbmNlIHRvIGhhdmUgc29tZSBjb21wcmVzc2lvbiB3ZSBtdXN0IGhhdmU6XG4gICAgLy8gbGwrbWwtb3ZlcmxhcCA+IDEgKyAobGwtMTUpLzI1NSArIChtbC00LTE1KS8yNTUgKyAyICh1bmNvbXByZXNzZWQgc2l6ZT5jb21wcmVzc2VkIHNpemUpXG4gICAgLy8gPT4gbGwrbWw+MysyKm92ZXJsYXAgPT4gbGwrbWw+PSA0KzIqb3ZlcmxhcFxuICAgIC8vIGFuZCBieSBkZWZpbml0aW9uIHdlIGRvIGhhdmU6XG4gICAgLy8gbGwgPj0gMSwgbWwgPj0gNFxuICAgIC8vID0+IGxsK21sID49IDVcbiAgICAvLyA9PiBzbyBvdmVybGFwIG11c3QgYmUgMFxuXG4gICAgLy8gdGhlIHNlcXVlbmNlIGlzIG5ldywgb3V0IG9mIGJvdW5kICg2NGtiKSBvciBub3QgdmFsaWQ6IHRyeSBuZXh0IHNlcXVlbmNlXG4gICAgaWYgKFxuICAgICAgcmVmIDwgMCB8fCAvLyhmbWEgJiAoKDEgPDwgc2tpcFN0cmVuZ3RoKSAtIDEpKSA8IDQgfHwgLy8gdGhpcyBjb2RlIHNlZW1zIGhhcyBhIGJpZyBwZW5hbHR5IGZvciBzaXplLi4uXG4gICAgICAoc2kgLSByZWYpID4+IHdpblNpemVMb2cgPiAwIHx8XG4gICAgICBzcmNbcmVmXSAhPT0gc3JjW3NpXSB8fFxuICAgICAgc3JjW3JlZiArIDFdICE9PSBzcmNbc2kgKyAxXSB8fFxuICAgICAgc3JjW3JlZiArIDJdICE9PSBzcmNbc2kgKyAyXSB8fFxuICAgICAgc3JjW3JlZiArIDNdICE9PSBzcmNbc2kgKyAzXVxuICAgICkge1xuICAgICAgLy8gdmFyaWFibGUgc3RlcDogaW1wcm92ZXMgcGVyZm9ybWFuY2Ugb24gbm9uLWNvbXByZXNzaWJsZSBkYXRhXG4gICAgICBzaSArPSBmbWEgPj4gc2tpcFN0cmVuZ3RoO1xuICAgICAgKytmbWE7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgLy8gbWF0Y2ggZm91bmRcbiAgICBmbWEgPSAxIDw8IHNraXBTdHJlbmd0aDtcbiAgICBjb25zdCBsTGVuID0gc2kgLSBhbmNob3I7XG4gICAgY29uc3Qgb2Zmc2V0ID0gc2kgLSByZWY7XG5cbiAgICAvLyBlbmNvZGUgbWF0Y2ggbGVuZ3RoIHBhcnQgMVxuICAgIHNpICs9IG1pbk1hdGNoO1xuICAgIGxldCBtTGVuID0gc2k7IC8vIG1hdGNoIGxlbmd0aCBoYXMgbWluTWF0Y2ggYWxyZWFkeVxuICAgIHdoaWxlIChzaSA8PSBzbiAmJiBzcmNbc2ldID09PSBzcmNbc2kgLSBvZmZzZXRdKSB7XG4gICAgICBzaSsrO1xuICAgIH1cbiAgICBtTGVuID0gc2kgLSBtTGVuO1xuICAgIGlmIChtTGVuIDwgMHhmKSB7XG4gICAgICBkZXN0W2RpXSA9IG1MZW47XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlc3RbZGldID0gMHhmO1xuICAgIH1cblxuICAgIC8vIGVuY29kZSBsaXRlcmFscyBsZW5ndGhcbiAgICBpZiAobExlbiA8IDB4Zikge1xuICAgICAgZGVzdFtkaV0gfD0gbExlbiA8PCA0O1xuICAgIH0gZWxzZSB7XG4gICAgICBkZXN0W2RpXSB8PSAweGYwO1xuICAgICAgaWYgKCsrZGkgPT09IGRuKSB7XG4gICAgICAgIHRocm93IGVyclNob3J0QnVmZmVyO1xuICAgICAgfVxuICAgICAgbGV0IGwgPSBsTGVuIC0gMHhmO1xuICAgICAgZm9yICg7IGwgPj0gMHhmZjsgbCAtPSAweGZmKSB7XG4gICAgICAgIGRlc3RbZGldID0gMHhmZjtcbiAgICAgICAgaWYgKCsrZGkgPT09IGRuKSB7XG4gICAgICAgICAgdGhyb3cgZXJyU2hvcnRCdWZmZXI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGRlc3RbZGldID0gbCAmIDB4ZmY7XG4gICAgfVxuICAgIGlmICgrK2RpID09PSBkbikge1xuICAgICAgdGhyb3cgZXJyU2hvcnRCdWZmZXI7XG4gICAgfVxuXG4gICAgLy8gbGl0ZXJhbHNcbiAgICBpZiAoZGkgKyBsTGVuID49IGRuKSB7XG4gICAgICB0aHJvdyBlcnJTaG9ydEJ1ZmZlcjtcbiAgICB9XG4gICAgY29weShkZXN0LCBzcmMsIGRpLCBhbmNob3IsIGxMZW4pO1xuICAgIGRpICs9IGxMZW47XG4gICAgYW5jaG9yID0gc2k7XG5cbiAgICAvLyBlbmNvZGUgb2Zmc2V0XG4gICAgZGkgKz0gMjtcbiAgICBpZiAoZGkgPj0gZG4pIHtcbiAgICAgIHRocm93IGVyclNob3J0QnVmZmVyO1xuICAgIH1cbiAgICBkZXN0W2RpIC0gMl0gPSBvZmZzZXQ7XG4gICAgZGVzdFtkaSAtIDFdID0gb2Zmc2V0ID4+IDg7XG5cbiAgICAvLyBlbmNvZGUgbWF0Y2ggbGVuZ3RoIHBhcnQgMlxuICAgIGlmIChtTGVuID49IDB4Zikge1xuICAgICAgZm9yIChtTGVuIC09IDB4ZjsgbUxlbiA+PSAweGZmOyBtTGVuIC09IDB4ZmYpIHtcbiAgICAgICAgZGVzdFtkaV0gPSAweGZmO1xuICAgICAgICBpZiAoKytkaSA9PT0gZG4pIHtcbiAgICAgICAgICB0aHJvdyBlcnJTaG9ydEJ1ZmZlcjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZGVzdFtkaV0gPSBtTGVuO1xuICAgICAgaWYgKCsrZGkgPT09IGRuKSB7XG4gICAgICAgIHRocm93IGVyclNob3J0QnVmZmVyO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChhbmNob3IgPT09IDApIHtcbiAgICAvLyBpbmNvbXByZXNzaWJsZVxuICAgIHJldHVybiAwO1xuICB9XG5cbiAgLy8gbGFzdCBsaXRlcmFsc1xuICBsZXQgbExlbiA9IHNyYy5sZW5ndGggLSBhbmNob3I7XG4gIGlmIChsTGVuIDwgMHhmKSB7XG4gICAgZGVzdFtkaV0gPSBsTGVuIDw8IDQ7XG4gIH0gZWxzZSB7XG4gICAgZGVzdFtkaV0gPSAweGYwO1xuICAgIGlmICgrK2RpID09PSBkbikge1xuICAgICAgdGhyb3cgZXJyU2hvcnRCdWZmZXI7XG4gICAgfVxuICAgIGZvciAobExlbiAtPSAweGY7IGxMZW4gPj0gMHhmZjsgbExlbiAtPSAweGZmKSB7XG4gICAgICBkZXN0W2RpXSA9IDB4ZmY7XG4gICAgICBpZiAoKytkaSA9PT0gZG4pIHtcbiAgICAgICAgdGhyb3cgZXJyU2hvcnRCdWZmZXI7XG4gICAgICB9XG4gICAgfVxuICAgIGRlc3RbZGldID0gbExlbjtcbiAgfVxuICBpZiAoKytkaSA9PT0gZG4pIHtcbiAgICB0aHJvdyBlcnJTaG9ydEJ1ZmZlcjtcbiAgfVxuXG4gIC8vIHdyaXRlIGxpdGVyYWxzXG4gIGNvbnN0IGxhc3RMZW4gPSBzcmMubGVuZ3RoIC0gYW5jaG9yO1xuICBjb25zdCBuID0gZGkgKyBsYXN0TGVuO1xuICBpZiAobiA+IGRuKSB7XG4gICAgdGhyb3cgZXJyU2hvcnRCdWZmZXI7XG4gIH0gZWxzZSBpZiAobiA+PSBzbikge1xuICAgIC8vIGluY29tcHJlc3NpYmxlXG4gICAgcmV0dXJuIDA7XG4gIH1cbiAgY29weShkZXN0LCBzcmMsIGRpLCBhbmNob3IsIGxhc3RMZW4pO1xuICBkaSArPSBsYXN0TGVuO1xuICByZXR1cm4gZGk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb21wcmVzc0Jsb2NrSEMoXG4gIHNyYzogVWludDhBcnJheSxcbiAgZGVzdDogVWludDhBcnJheSxcbiAgc29mZnNldDogbnVtYmVyXG4pOiBudW1iZXIge1xuICBjb25zdCBzbiA9IHNyYy5sZW5ndGggLSBtZkxpbWl0O1xuICBjb25zdCBkbiA9IGRlc3QubGVuZ3RoO1xuICBpZiAoc24gPD0gMCB8fCBkbiA9PT0gMCB8fCBzb2Zmc2V0ID49IHNuKSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cbiAgbGV0IHNpID0gMDtcbiAgbGV0IGRpID0gMDtcblxuICAvLyBIYXNoIENoYWluIHN0cmF0ZWd5OlxuICAvLyB3ZSBuZWVkIGEgaGFzaCB0YWJsZSBhbmQgYSBjaGFpbiB0YWJsZVxuICAvLyB0aGUgY2hhaW4gdGFibGUgY2Fubm90IGNvbnRhaW4gbW9yZSBlbnRyaWVzIHRoYW4gdGhlIHdpbmRvdyBzaXplICg2NEtiIGVudHJpZXMpXG4gIGNvbnN0IGhhc2hUYWJsZSA9IG5ldyBVaW50MzJBcnJheShoYXNoU2l6ZSk7XG4gIGNvbnN0IGNoYWluVGFibGUgPSBuZXcgVWludDMyQXJyYXkod2luU2l6ZSk7XG5cbiAgLy8gSW5pdGlhbGlzZSB0aGUgaGFzaCB0YWJsZSB3aXRoIHRoZSBmaXJzdCA2NEtiIG9mIHRoZSBpbnB1dCBidWZmZXJcbiAgLy8gKHVzZWQgd2hlbiBjb21wcmVzc2luZyBkZXBlbmRlbnQgYmxvY2tzKVxuICB3aGlsZSAoc2kgPCBzb2Zmc2V0KSB7XG4gICAgY29uc3QgaCA9IGltdWwoZ2V0VWludDMyKHNyYywgc2kpLCBoYXNoZXIpID4+PiBoYXNoU2hpZnQ7XG4gICAgY2hhaW5UYWJsZVtzaSAmIHdpbk1hc2tdID0gaGFzaFRhYmxlW2hdO1xuICAgIGhhc2hUYWJsZVtoXSA9ICsrc2k7XG4gIH1cblxuICBsZXQgYW5jaG9yID0gc2k7XG4gIHdoaWxlIChzaSA8IHNuIC0gbWluTWF0Y2gpIHtcbiAgICAvLyBoYXNoIHRoZSBuZXh0IDQgYnl0ZXMgKHNlcXVlbmNlKS4uLlxuICAgIGNvbnN0IGggPSBpbXVsKGdldFVpbnQzMihzcmMsIHNpKSwgaGFzaGVyKSA+Pj4gaGFzaFNoaWZ0O1xuXG4gICAgLy8gZm9sbG93IHRoZSBjaGFpbiB1bnRpbCBvdXQgb2Ygd2luZG93IGFuZCBnaXZlIHRoZSBsb25nZXN0IG1hdGNoXG4gICAgbGV0IG1MZW4gPSAwO1xuICAgIGxldCBvZmZzZXQgPSAwO1xuICAgIGZvciAoXG4gICAgICBsZXQgbmV4dCA9IGhhc2hUYWJsZVtoXSAtIDE7XG4gICAgICBuZXh0ID4gMCAmJiBuZXh0ID4gc2kgLSB3aW5TaXplO1xuICAgICAgbmV4dCA9IGNoYWluVGFibGVbbmV4dCAmIHdpbk1hc2tdIC0gMVxuICAgICkge1xuICAgICAgLy8gdGhlIGZpcnN0IChtTGVuPT0wKSBvciBuZXh0IGJ5dGUgKG1MZW4+PW1pbk1hdGNoKSBhdCBjdXJyZW50IG1hdGNoIGxlbmd0aCBtdXN0IG1hdGNoIHRvIGltcHJvdmUgb24gdGhlIG1hdGNoIGxlbmd0aFxuICAgICAgaWYgKHNyY1tuZXh0ICsgbUxlbl0gPT09IHNyY1tzaSArIG1MZW5dKSB7XG4gICAgICAgIGZvciAobGV0IG1sID0gMDsgOyArK21sKSB7XG4gICAgICAgICAgaWYgKHNyY1tuZXh0ICsgbWxdICE9PSBzcmNbc2kgKyBtbF0gfHwgc2kgKyBtbCA+IHNuKSB7XG4gICAgICAgICAgICAvLyBmb3VuZCBhIGxvbmdlciBtYXRjaCwga2VlcCBpdHMgcG9zaXRpb24gYW5kIGxlbmd0aFxuICAgICAgICAgICAgaWYgKG1MZW4gPCBtbCAmJiBtbCA+PSBtaW5NYXRjaCkge1xuICAgICAgICAgICAgICBtTGVuID0gbWw7XG4gICAgICAgICAgICAgIG9mZnNldCA9IHNpIC0gbmV4dDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBjaGFpblRhYmxlW3NpICYgd2luTWFza10gPSBoYXNoVGFibGVbaF07XG4gICAgaGFzaFRhYmxlW2hdID0gc2kgKyAxO1xuXG4gICAgLy8gbm8gbWF0Y2ggZm91bmRcbiAgICBpZiAobUxlbiA9PT0gMCkge1xuICAgICAgKytzaTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGxldCBzaTIgPSBzaSArIDE7XG4gICAgY29uc3QgbWwgPSBzaSArIG1MZW47XG5cbiAgICAvLyBtYXRjaCBmb3VuZFxuICAgIC8vIHVwZGF0ZSBoYXNoL2NoYWluIHRhYmxlcyB3aXRoIG92ZXJsYXBpbmcgYnl0ZXM6XG4gICAgLy8gc2kgYWxyZWFkeSBoYXNoZWQsIGFkZCBldmVyeXRoaW5nIGZyb20gc2krMSB1cCB0byB0aGUgbWF0Y2ggbGVuZ3RoXG4gICAgd2hpbGUgKHNpMiA8IG1sKSB7XG4gICAgICBjb25zdCBoID0gaW11bChnZXRVaW50MzIoc3JjLCBzaTIpLCBoYXNoZXIpID4+PiBoYXNoU2hpZnQ7XG4gICAgICBjaGFpblRhYmxlW3NpMiAmIHdpbk1hc2tdID0gaGFzaFRhYmxlW2hdO1xuICAgICAgaGFzaFRhYmxlW2hdID0gKytzaTI7XG4gICAgfVxuXG4gICAgY29uc3QgbExlbiA9IHNpIC0gYW5jaG9yO1xuICAgIHNpICs9IG1MZW47XG4gICAgbUxlbiAtPSBtaW5NYXRjaDsgLy8gbWF0Y2ggbGVuZ3RoIGRvZXMgbm90IGluY2x1ZGUgbWluTWF0Y2hcblxuICAgIGlmIChtTGVuIDwgMHhmKSB7XG4gICAgICBkZXN0W2RpXSA9IG1MZW47XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlc3RbZGldID0gMHhmO1xuICAgIH1cblxuICAgIC8vIGVuY29kZSBsaXRlcmFscyBsZW5ndGhcbiAgICBpZiAobExlbiA8IDB4Zikge1xuICAgICAgZGVzdFtkaV0gfD0gbExlbiA8PCA0O1xuICAgIH0gZWxzZSB7XG4gICAgICBkZXN0W2RpXSB8PSAweGYwO1xuICAgICAgaWYgKCsrZGkgPT09IGRuKSB7XG4gICAgICAgIHRocm93IGVyclNob3J0QnVmZmVyO1xuICAgICAgfVxuICAgICAgbGV0IGwgPSBsTGVuIC0gMHhmO1xuICAgICAgZm9yICg7IGwgPj0gMHhmZjsgbCAtPSAweGZmKSB7XG4gICAgICAgIGRlc3RbZGldID0gMHhmZjtcbiAgICAgICAgaWYgKCsrZGkgPT09IGRuKSB7XG4gICAgICAgICAgdGhyb3cgZXJyU2hvcnRCdWZmZXI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGRlc3RbZGldID0gbCAmIDB4ZmY7XG4gICAgfVxuICAgIGlmICgrK2RpID09PSBkbikge1xuICAgICAgdGhyb3cgZXJyU2hvcnRCdWZmZXI7XG4gICAgfVxuXG4gICAgLy8gbGl0ZXJhbHNcbiAgICBpZiAoZGkgKyBsTGVuID49IGRuKSB7XG4gICAgICB0aHJvdyBlcnJTaG9ydEJ1ZmZlcjtcbiAgICB9XG4gICAgY29weShkZXN0LCBzcmMsIGRpLCBhbmNob3IsIGxMZW4pO1xuICAgIGRpICs9IGxMZW47XG4gICAgYW5jaG9yID0gc2k7XG5cbiAgICAvLyBlbmNvZGUgb2Zmc2V0XG4gICAgZGkgKz0gMjtcbiAgICBpZiAoZGkgPj0gZG4pIHtcbiAgICAgIHRocm93IGVyclNob3J0QnVmZmVyO1xuICAgIH1cbiAgICBkZXN0W2RpIC0gMl0gPSBvZmZzZXQ7XG4gICAgZGVzdFtkaSAtIDFdID0gb2Zmc2V0ID4+IDg7XG5cbiAgICAvLyBlbmNvZGUgbWF0Y2ggbGVuZ3RoIHBhcnQgMlxuICAgIGlmIChtTGVuID49IDB4Zikge1xuICAgICAgZm9yIChtTGVuIC09IDB4ZjsgbUxlbiA+PSAweGZmOyBtTGVuIC09IDB4ZmYpIHtcbiAgICAgICAgZGVzdFtkaV0gPSAweGZmO1xuICAgICAgICBpZiAoKytkaSA9PT0gZG4pIHtcbiAgICAgICAgICB0aHJvdyBlcnJTaG9ydEJ1ZmZlcjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZGVzdFtkaV0gPSBtTGVuO1xuICAgICAgaWYgKCsrZGkgPT09IGRuKSB7XG4gICAgICAgIHRocm93IGVyclNob3J0QnVmZmVyO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChhbmNob3IgPT09IDApIHtcbiAgICAvLyBpbmNvbXByZXNzaWJsZVxuICAgIHJldHVybiAwO1xuICB9XG5cbiAgLy8gbGFzdCBsaXRlcmFsc1xuICBsZXQgbExlbiA9IHNyYy5sZW5ndGggLSBhbmNob3I7XG4gIGlmIChsTGVuIDwgMHhmKSB7XG4gICAgZGVzdFtkaV0gPSBsTGVuIDw8IDQ7XG4gIH0gZWxzZSB7XG4gICAgZGVzdFtkaV0gPSAweGYwO1xuICAgIGlmICgrK2RpID09PSBkbikge1xuICAgICAgdGhyb3cgZXJyU2hvcnRCdWZmZXI7XG4gICAgfVxuICAgIGZvciAobExlbiAtPSAweGY7IGxMZW4gPj0gMHhmZjsgbExlbiAtPSAweGZmKSB7XG4gICAgICBkZXN0W2RpXSA9IDB4ZmY7XG4gICAgICBpZiAoKytkaSA9PT0gZG4pIHtcbiAgICAgICAgdGhyb3cgZXJyU2hvcnRCdWZmZXI7XG4gICAgICB9XG4gICAgfVxuICAgIGRlc3RbZGldID0gbExlbjtcbiAgfVxuICBpZiAoKytkaSA9PT0gZG4pIHtcbiAgICB0aHJvdyBlcnJTaG9ydEJ1ZmZlcjtcbiAgfVxuXG4gIC8vIHdyaXRlIGxpdGVyYWxzXG4gIGNvbnN0IGxhc3RMZW4gPSBzcmMubGVuZ3RoIC0gYW5jaG9yO1xuICBjb25zdCBuID0gZGkgKyBsYXN0TGVuO1xuICBpZiAobiA+IGRuKSB7XG4gICAgdGhyb3cgZXJyU2hvcnRCdWZmZXI7XG4gIH0gZWxzZSBpZiAobiA+PSBzbikge1xuICAgIC8vIGluY29tcHJlc3NpYmxlXG4gICAgcmV0dXJuIDA7XG4gIH1cbiAgY29weShkZXN0LCBzcmMsIGRpLCBhbmNob3IsIGxhc3RMZW4pO1xuICBkaSArPSBsYXN0TGVuO1xuICByZXR1cm4gZGk7XG59XG4iXSwibWFwcGluZ3MiOiJBQUFBOztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBLE1BQU1BLGdCQUFnQixHQUFHLElBQUlDLEtBQUosQ0FBVSxnQkFBVixDQUF6QjtBQUNBLE1BQU1DLGNBQWMsR0FBRyxJQUFJRCxLQUFKLENBQVUsY0FBVixDQUF2QixDLENBRUE7O0FBQ0EsTUFBTUUsUUFBUSxHQUFHLENBQWpCLEMsQ0FBb0I7O0FBQ3BCLE1BQU1DLFVBQVUsR0FBRyxFQUFuQixDLENBQXVCOztBQUN2QixNQUFNQyxPQUFPLEdBQUcsS0FBS0QsVUFBckI7QUFDQSxNQUFNRSxPQUFPLEdBQUdELE9BQU8sR0FBRyxDQUExQixDLENBQTZCO0FBRTdCO0FBQ0E7QUFDQTtBQUNBOztBQUNBLE1BQU1FLFdBQVcsR0FBRyxFQUFwQjtBQUNBLE1BQU1DLFFBQVEsR0FBRyxLQUFLRCxXQUF0QjtBQUNBLE1BQU1FLFNBQVMsR0FBR04sUUFBUSxHQUFHLENBQVgsR0FBZUksV0FBakM7QUFFQSxNQUFNRyxPQUFPLEdBQUcsSUFBSVAsUUFBcEIsQyxDQUE4Qjs7QUFDOUIsTUFBTVEsWUFBWSxHQUFHLENBQXJCLEMsQ0FBd0I7O0FBRXhCLE1BQU1DLE1BQU0sR0FBRyxhQUFhLENBQTVCLEMsQ0FBK0I7QUFFL0I7O0FBQ0EsU0FBU0MsWUFBVCxDQUFzQkMsQ0FBdEIsRUFBaUNDLENBQWpDLEVBQW9EO0VBQ2xELE1BQU1DLEVBQUUsR0FBSUYsQ0FBQyxLQUFLLEVBQVAsR0FBYSxN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
1
+ import"../chunk-KMTF2BZE.js";// lz4-ts @license BSD-3-Clause / Copyright (c) 2015, Pierre Curto / 2016, oov. All rights reserved.
2
+ const m=new Error("invalid source"),h=new Error("short buffer"),S=4,H=16,s=1<<H,E=s-1,I=16,P=1<<I,z=S*8-I,j=8+S,C=6,M=-1640531535;function q(t,i){const e=t>>>16&65535,r=t&65535,o=i>>>16&65535,n=i&65535;return r*n+(e*n+r*o<<16>>>0)|0}const v=Math.imul?Math.imul:q;function T(t,i){return t[i+3]|t[i+2]<<8|t[i+1]<<16|t[i]<<24}function k(t,i,e,r,o){for(let n=0;n<o;++n)t[e++]=i[r++]}function D(t){const i=t.length;if(i===0)return 0;let e=0,r=0;for(;;){let o=t[e]>>4,n=t[e]&15;if(++e===i)throw m;if(o>0){if(o===15){for(;t[e]===255;)if(o+=255,++e===i)throw m;if(o+=t[e],++e===i)throw m}if(r+=o,e+=o,e>=i)return r}if(e+=2,e>=i)throw m;const f=t[e-2]|t[e-1]<<8;if(r-f<0||f===0)throw m;if(n===15){for(;t[e]===255;)if(n+=255,++e===i)throw m;if(n+=t[e],++e===i)throw m}for(n+=4;n>=f;n-=f)r+=f;r+=n}}function F(t,i){const e=t.length,r=i.length;if(e===0)return 0;let o=0,n=0;for(;;){let f=t[o]>>4,x=t[o]&15;if(++o===e)throw m;if(f>0){if(f===15){for(;t[o]===255;)if(f+=255,++o===e)throw m;if(f+=t[o],++o===e)throw m}if(r-n<f||o+f>e)throw h;if(k(i,t,n,o,f),n+=f,o+=f,o>=e)return n}if(o+=2,o>=e)throw m;const w=t[o-2]|t[o-1]<<8;if(n-w<0||w===0)throw m;if(x===15){for(;t[o]===255;)if(x+=255,++o===e)throw m;if(x+=t[o],++o===e)throw m}if(x+=4,r-n<=x)throw h;for(;x>=w;x-=w)k(i,i,n,n-w,w),n+=w;k(i,i,n,n-w,x),n+=x}}function G(t){return t+(t/255|0)+16}function J(t,i,e){const r=t.length-j,o=i.length;if(r<=0||o===0||e>=r)return 0;let n=0,f=0;const x=new Uint32Array(P);for(;n<e;){const b=v(T(t,n),M)>>>z;x[b]=++n}let w=n,c=1<<C;for(;n<r-S;){const b=v(T(t,n),M)>>>z,l=x[b]-1;if(x[b]=n+1,l<0||n-l>>H>0||t[l]!==t[n]||t[l+1]!==t[n+1]||t[l+2]!==t[n+2]||t[l+3]!==t[n+3]){n+=c>>C,++c;continue}c=1<<C;const g=n-w,U=n-l;n+=S;let L=n;for(;n<=r&&t[n]===t[n-U];)n++;if(L=n-L,L<15?i[f]=L:i[f]=15,g<15)i[f]|=g<<4;else{if(i[f]|=240,++f===o)throw h;let y=g-15;for(;y>=255;y-=255)if(i[f]=255,++f===o)throw h;i[f]=y&255}if(++f===o||f+g>=o||(k(i,t,f,w,g),f+=g,w=n,f+=2,f>=o))throw h;if(i[f-2]=U,i[f-1]=U>>8,L>=15){for(L-=15;L>=255;L-=255)if(i[f]=255,++f===o)throw h;if(i[f]=L,++f===o)throw h}}if(w===0)return 0;let a=t.length-w;if(a<15)i[f]=a<<4;else{if(i[f]=240,++f===o)throw h;for(a-=15;a>=255;a-=255)if(i[f]=255,++f===o)throw h;i[f]=a}if(++f===o)throw h;const A=t.length-w,B=f+A;if(B>o)throw h;return B>=r?0:(k(i,t,f,w,A),f+=A,f)}function K(t,i,e){const r=t.length-j,o=i.length;if(r<=0||o===0||e>=r)return 0;let n=0,f=0;const x=new Uint32Array(P),w=new Uint32Array(s);for(;n<e;){const b=v(T(t,n),M)>>>z;w[n&E]=x[b],x[b]=++n}let c=n;for(;n<r-S;){const b=v(T(t,n),M)>>>z;let l=0,g=0;for(let u=x[b]-1;u>0&&u>n-s;u=w[u&E]-1)if(t[u+l]===t[n+l]){for(let p=0;;++p)if(t[u+p]!==t[n+p]||n+p>r){l<p&&p>=S&&(l=p,g=n-u);break}}if(w[n&E]=x[b],x[b]=n+1,l===0){++n;continue}let U=n+1;const L=n+l;for(;U<L;){const u=v(T(t,U),M)>>>z;w[U&E]=x[u],x[u]=++U}const y=n-c;if(n+=l,l-=S,l<15?i[f]=l:i[f]=15,y<15)i[f]|=y<<4;else{if(i[f]|=240,++f===o)throw h;let u=y-15;for(;u>=255;u-=255)if(i[f]=255,++f===o)throw h;i[f]=u&255}if(++f===o||f+y>=o||(k(i,t,f,c,y),f+=y,c=n,f+=2,f>=o))throw h;if(i[f-2]=g,i[f-1]=g>>8,l>=15){for(l-=15;l>=255;l-=255)if(i[f]=255,++f===o)throw h;if(i[f]=l,++f===o)throw h}}if(c===0)return 0;let a=t.length-c;if(a<15)i[f]=a<<4;else{if(i[f]=240,++f===o)throw h;for(a-=15;a>=255;a-=255)if(i[f]=255,++f===o)throw h;i[f]=a}if(++f===o)throw h;const A=t.length-c,B=f+A;if(B>o)throw h;return B>=r?0:(k(i,t,f,c,A),f+=A,f)}export{D as calcUncompressedLen,J as compressBlock,G as compressBlockBound,K as compressBlockHC,F as uncompressBlock};
3
+ //# sourceMappingURL=lz4.js.map