@secrecy/lib 1.0.0-dev.8 → 1.0.0-dev.80
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/README.md +1 -1
- package/dist/BaseClient.d.ts +104 -0
- package/dist/BaseClient.js +430 -0
- package/{lib → dist}/PopupTools.d.ts +1 -1
- package/dist/PopupTools.js +196 -0
- package/{lib → dist}/ZeusThunder.d.ts +0 -0
- package/dist/ZeusThunder.js +65 -0
- package/dist/cache.d.ts +6 -0
- package/dist/cache.js +4 -0
- package/dist/client/SecrecyAppClient.d.ts +17 -0
- package/dist/client/SecrecyAppClient.js +227 -0
- package/dist/client/SecrecyCloudClient.d.ts +89 -0
- package/dist/client/SecrecyCloudClient.js +1411 -0
- package/dist/client/SecrecyDbClient.d.ts +21 -0
- package/dist/client/SecrecyDbClient.js +177 -0
- package/dist/client/SecrecyMailClient.d.ts +42 -0
- package/dist/client/SecrecyMailClient.js +1022 -0
- package/dist/client/SecrecyPayClient.d.ts +28 -0
- package/dist/client/SecrecyPayClient.js +68 -0
- package/dist/client/SecrecyWalletClient.d.ts +30 -0
- package/dist/client/SecrecyWalletClient.js +73 -0
- package/{lib → dist}/client/convert/file.d.ts +3 -3
- package/dist/client/convert/file.js +33 -0
- package/dist/client/convert/mail.d.ts +3 -0
- package/dist/client/convert/mail.js +43 -0
- package/dist/client/convert/node.d.ts +9 -0
- package/dist/client/convert/node.js +88 -0
- package/{lib → dist}/client/helpers.d.ts +6 -1
- package/dist/client/helpers.js +119 -0
- package/dist/client/index.d.ts +34 -0
- package/dist/client/index.js +46 -0
- package/{lib → dist}/client/storage.d.ts +0 -0
- package/dist/client/storage.js +12 -0
- package/dist/client/types/File.d.ts +14 -0
- package/dist/client/types/File.js +3 -0
- package/{lib → dist}/client/types/Inputs.d.ts +2 -7
- package/dist/client/types/Inputs.js +3 -0
- package/dist/client/types/Node.d.ts +56 -0
- package/dist/client/types/Node.js +3 -0
- package/{lib → dist}/client/types/UserAppNotifications.d.ts +1 -1
- package/dist/client/types/UserAppNotifications.js +3 -0
- package/{lib → dist}/client/types/UserAppSettings.d.ts +1 -3
- package/dist/client/types/UserAppSettings.js +3 -0
- package/{lib → dist}/client/types/index.d.ts +9 -43
- package/dist/client/types/index.js +8 -0
- package/dist/client/types/selectors.d.ts +400 -0
- package/dist/client/types/selectors.js +135 -0
- package/{lib → dist}/crypto/file.d.ts +0 -0
- package/dist/crypto/file.js +195 -0
- package/{lib → dist}/crypto/index.d.ts +0 -0
- package/dist/crypto/index.js +45 -0
- package/dist/error.d.ts +33 -0
- package/dist/error.js +3 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.js +10 -0
- package/{lib → dist}/minify/index.d.ts +0 -0
- package/dist/minify/index.js +23 -0
- package/{lib → dist}/minify/lz4.d.ts +0 -0
- package/dist/minify/lz4.js +539 -0
- package/{lib → dist}/sodium.d.ts +0 -0
- package/dist/sodium.js +6 -0
- package/{lib → dist}/utils/store-buddy.d.ts +0 -0
- package/dist/utils/store-buddy.js +58 -0
- package/{lib → dist}/utils/time.d.ts +0 -0
- package/dist/utils/time.js +12 -0
- package/{lib → dist/utils}/utils.d.ts +0 -0
- package/dist/utils/utils.js +47 -0
- package/{lib → dist}/worker/md5.d.ts +0 -0
- package/dist/worker/md5.js +24 -0
- package/{lib → dist}/worker/sodium.d.ts +0 -0
- package/dist/worker/sodium.js +118 -0
- package/{lib → dist}/worker/workerCodes.d.ts +0 -0
- package/dist/worker/workerCodes.js +255 -0
- package/{lib → dist}/zeus/const.d.ts +5 -0
- package/dist/zeus/const.js +1664 -0
- package/dist/zeus/index.d.ts +7873 -0
- package/dist/zeus/index.js +602 -0
- package/package.json +64 -54
- package/lib/BaseClient.d.ts +0 -266
- package/lib/BaseClient.js +0 -1332
- package/lib/PopupTools.js +0 -213
- package/lib/ZeusThunder.js +0 -112
- package/lib/cache.d.ts +0 -7
- package/lib/cache.js +0 -5
- package/lib/client/convert/file.js +0 -39
- package/lib/client/convert/folder.d.ts +0 -8
- package/lib/client/convert/folder.js +0 -264
- package/lib/client/convert/mail.d.ts +0 -3
- package/lib/client/convert/mail.js +0 -46
- package/lib/client/convert/vFile.d.ts +0 -5
- package/lib/client/convert/vFile.js +0 -164
- package/lib/client/helpers.js +0 -116
- package/lib/client/index.d.ts +0 -168
- package/lib/client/index.js +0 -3795
- package/lib/client/storage.js +0 -12
- package/lib/client/types/File.d.ts +0 -21
- package/lib/client/types/File.js +0 -2
- package/lib/client/types/FilesOnUsersOnApplications.d.ts +0 -9
- package/lib/client/types/FilesOnUsersOnApplications.js +0 -2
- package/lib/client/types/Folder.d.ts +0 -68
- package/lib/client/types/Folder.js +0 -7
- package/lib/client/types/Inputs.js +0 -2
- package/lib/client/types/UserAppNotifications.js +0 -2
- package/lib/client/types/UserAppSettings.js +0 -2
- package/lib/client/types/VFile.d.ts +0 -62
- package/lib/client/types/VFile.js +0 -4
- package/lib/client/types/index.js +0 -9
- package/lib/client/types/queries.d.ts +0 -535
- package/lib/client/types/queries.js +0 -192
- package/lib/crypto/file.js +0 -291
- package/lib/crypto/index.js +0 -37
- package/lib/index.d.ts +0 -11
- package/lib/index.js +0 -40
- package/lib/minify/index.js +0 -28
- package/lib/minify/lz4.js +0 -633
- package/lib/sodium.js +0 -28
- package/lib/utils/store-buddy.js +0 -69
- package/lib/utils/time.js +0 -22
- package/lib/utils.js +0 -188
- package/lib/worker/__mock__/sodium.worker.d.ts +0 -19
- package/lib/worker/__mock__/sodium.worker.js +0 -57
- package/lib/worker/md5.js +0 -43
- package/lib/worker/sodium.js +0 -155
- package/lib/worker/workerCodes.js +0 -3
- package/lib/zeus/const.js +0 -1644
- package/lib/zeus/index.d.ts +0 -26279
- package/lib/zeus/index.js +0 -552
package/lib/minify/lz4.js
DELETED
|
@@ -1,633 +0,0 @@
|
|
|
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
|
-
var errInvalidSource = new Error("invalid source");
|
|
34
|
-
var errShortBuffer = new Error("short buffer"); // The following constants are used to setup the compression algorithm.
|
|
35
|
-
|
|
36
|
-
var minMatch = 4; // the minimum size of the match sequence size (4 bytes)
|
|
37
|
-
|
|
38
|
-
var winSizeLog = 16; // LZ4 64Kb window size limit
|
|
39
|
-
|
|
40
|
-
var winSize = 1 << winSizeLog;
|
|
41
|
-
var 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
|
-
var hashSizeLog = 16;
|
|
48
|
-
var hashSize = 1 << hashSizeLog;
|
|
49
|
-
var hashShift = minMatch * 8 - hashSizeLog;
|
|
50
|
-
var mfLimit = 8 + minMatch; // The last match cannot start within the last 12 bytes.
|
|
51
|
-
|
|
52
|
-
var skipStrength = 6; // variable step for fast scan
|
|
53
|
-
|
|
54
|
-
var 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
|
-
var ah = a >>> 16 & 0xffff;
|
|
59
|
-
var al = a & 0xffff;
|
|
60
|
-
var bh = b >>> 16 & 0xffff;
|
|
61
|
-
var 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
|
-
var 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 (var i = 0; i < len; ++i) {
|
|
75
|
-
dest[di++] = src[si++];
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
export function calcUncompressedLen(src) {
|
|
80
|
-
var sn = src.length;
|
|
81
|
-
|
|
82
|
-
if (sn === 0) {
|
|
83
|
-
return 0;
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
var si = 0;
|
|
87
|
-
var di = 0;
|
|
88
|
-
|
|
89
|
-
while (true) {
|
|
90
|
-
// literals and match lengths (token)
|
|
91
|
-
var lLen = src[si] >> 4;
|
|
92
|
-
var 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
|
-
var 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
|
-
var sn = src.length;
|
|
165
|
-
var dn = dest.length;
|
|
166
|
-
|
|
167
|
-
if (sn === 0) {
|
|
168
|
-
return 0;
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
var si = 0;
|
|
172
|
-
var di = 0;
|
|
173
|
-
|
|
174
|
-
while (true) {
|
|
175
|
-
// literals and match lengths (token)
|
|
176
|
-
var lLen = src[si] >> 4;
|
|
177
|
-
var 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
|
-
var 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
|
-
var sn = src.length - mfLimit;
|
|
265
|
-
var dn = dest.length;
|
|
266
|
-
|
|
267
|
-
if (sn <= 0 || dn === 0 || soffset >= sn) {
|
|
268
|
-
return 0;
|
|
269
|
-
}
|
|
270
|
-
|
|
271
|
-
var si = 0,
|
|
272
|
-
di = 0; // fast scan strategy:
|
|
273
|
-
// we only need a hash table to store the last sequences (4 bytes)
|
|
274
|
-
|
|
275
|
-
var 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
|
-
var h = imul(getUint32(src, si), hasher) >>> hashShift;
|
|
280
|
-
hashTable[h] = ++si;
|
|
281
|
-
}
|
|
282
|
-
|
|
283
|
-
var anchor = si;
|
|
284
|
-
var fma = 1 << skipStrength;
|
|
285
|
-
|
|
286
|
-
while (si < sn - minMatch) {
|
|
287
|
-
// hash the next 4 bytes (sequence)...
|
|
288
|
-
var _h = imul(getUint32(src, si), hasher) >>> hashShift; // -1 to separate existing entries from new ones
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
var ref = hashTable[_h] - 1; // ...and store the position of the hash in the hash table (+1 to compensate the -1 upon saving)
|
|
292
|
-
|
|
293
|
-
hashTable[_h] = si + 1; // no need to check the last 3 bytes in the first literal 4 bytes as
|
|
294
|
-
// this guarantees that the next match, if any, is compressed with
|
|
295
|
-
// a lower size, since to have some compression we must have:
|
|
296
|
-
// ll+ml-overlap > 1 + (ll-15)/255 + (ml-4-15)/255 + 2 (uncompressed size>compressed size)
|
|
297
|
-
// => ll+ml>3+2*overlap => ll+ml>= 4+2*overlap
|
|
298
|
-
// and by definition we do have:
|
|
299
|
-
// ll >= 1, ml >= 4
|
|
300
|
-
// => ll+ml >= 5
|
|
301
|
-
// => so overlap must be 0
|
|
302
|
-
// the sequence is new, out of bound (64kb) or not valid: try next sequence
|
|
303
|
-
|
|
304
|
-
if (ref < 0 || //(fma & ((1 << skipStrength) - 1)) < 4 || // this code seems has a big penalty for size...
|
|
305
|
-
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]) {
|
|
306
|
-
// variable step: improves performance on non-compressible data
|
|
307
|
-
si += fma >> skipStrength;
|
|
308
|
-
++fma;
|
|
309
|
-
continue;
|
|
310
|
-
} // match found
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
fma = 1 << skipStrength;
|
|
314
|
-
|
|
315
|
-
var _lLen = si - anchor;
|
|
316
|
-
|
|
317
|
-
var offset = si - ref; // encode match length part 1
|
|
318
|
-
|
|
319
|
-
si += minMatch;
|
|
320
|
-
var mLen = si; // match length has minMatch already
|
|
321
|
-
|
|
322
|
-
while (si <= sn && src[si] === src[si - offset]) {
|
|
323
|
-
si++;
|
|
324
|
-
}
|
|
325
|
-
|
|
326
|
-
mLen = si - mLen;
|
|
327
|
-
|
|
328
|
-
if (mLen < 0xf) {
|
|
329
|
-
dest[di] = mLen;
|
|
330
|
-
} else {
|
|
331
|
-
dest[di] = 0xf;
|
|
332
|
-
} // encode literals length
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
if (_lLen < 0xf) {
|
|
336
|
-
dest[di] |= _lLen << 4;
|
|
337
|
-
} else {
|
|
338
|
-
dest[di] |= 0xf0;
|
|
339
|
-
|
|
340
|
-
if (++di === dn) {
|
|
341
|
-
throw errShortBuffer;
|
|
342
|
-
}
|
|
343
|
-
|
|
344
|
-
var l = _lLen - 0xf;
|
|
345
|
-
|
|
346
|
-
for (; l >= 0xff; l -= 0xff) {
|
|
347
|
-
dest[di] = 0xff;
|
|
348
|
-
|
|
349
|
-
if (++di === dn) {
|
|
350
|
-
throw errShortBuffer;
|
|
351
|
-
}
|
|
352
|
-
}
|
|
353
|
-
|
|
354
|
-
dest[di] = l & 0xff;
|
|
355
|
-
}
|
|
356
|
-
|
|
357
|
-
if (++di === dn) {
|
|
358
|
-
throw errShortBuffer;
|
|
359
|
-
} // literals
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
if (di + _lLen >= dn) {
|
|
363
|
-
throw errShortBuffer;
|
|
364
|
-
}
|
|
365
|
-
|
|
366
|
-
copy(dest, src, di, anchor, _lLen);
|
|
367
|
-
di += _lLen;
|
|
368
|
-
anchor = si; // encode offset
|
|
369
|
-
|
|
370
|
-
di += 2;
|
|
371
|
-
|
|
372
|
-
if (di >= dn) {
|
|
373
|
-
throw errShortBuffer;
|
|
374
|
-
}
|
|
375
|
-
|
|
376
|
-
dest[di - 2] = offset;
|
|
377
|
-
dest[di - 1] = offset >> 8; // encode match length part 2
|
|
378
|
-
|
|
379
|
-
if (mLen >= 0xf) {
|
|
380
|
-
for (mLen -= 0xf; mLen >= 0xff; mLen -= 0xff) {
|
|
381
|
-
dest[di] = 0xff;
|
|
382
|
-
|
|
383
|
-
if (++di === dn) {
|
|
384
|
-
throw errShortBuffer;
|
|
385
|
-
}
|
|
386
|
-
}
|
|
387
|
-
|
|
388
|
-
dest[di] = mLen;
|
|
389
|
-
|
|
390
|
-
if (++di === dn) {
|
|
391
|
-
throw errShortBuffer;
|
|
392
|
-
}
|
|
393
|
-
}
|
|
394
|
-
}
|
|
395
|
-
|
|
396
|
-
if (anchor === 0) {
|
|
397
|
-
// incompressible
|
|
398
|
-
return 0;
|
|
399
|
-
} // last literals
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
var lLen = src.length - anchor;
|
|
403
|
-
|
|
404
|
-
if (lLen < 0xf) {
|
|
405
|
-
dest[di] = lLen << 4;
|
|
406
|
-
} else {
|
|
407
|
-
dest[di] = 0xf0;
|
|
408
|
-
|
|
409
|
-
if (++di === dn) {
|
|
410
|
-
throw errShortBuffer;
|
|
411
|
-
}
|
|
412
|
-
|
|
413
|
-
for (lLen -= 0xf; lLen >= 0xff; lLen -= 0xff) {
|
|
414
|
-
dest[di] = 0xff;
|
|
415
|
-
|
|
416
|
-
if (++di === dn) {
|
|
417
|
-
throw errShortBuffer;
|
|
418
|
-
}
|
|
419
|
-
}
|
|
420
|
-
|
|
421
|
-
dest[di] = lLen;
|
|
422
|
-
}
|
|
423
|
-
|
|
424
|
-
if (++di === dn) {
|
|
425
|
-
throw errShortBuffer;
|
|
426
|
-
} // write literals
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
var lastLen = src.length - anchor;
|
|
430
|
-
var n = di + lastLen;
|
|
431
|
-
|
|
432
|
-
if (n > dn) {
|
|
433
|
-
throw errShortBuffer;
|
|
434
|
-
} else if (n >= sn) {
|
|
435
|
-
// incompressible
|
|
436
|
-
return 0;
|
|
437
|
-
}
|
|
438
|
-
|
|
439
|
-
copy(dest, src, di, anchor, lastLen);
|
|
440
|
-
di += lastLen;
|
|
441
|
-
return di;
|
|
442
|
-
}
|
|
443
|
-
export function compressBlockHC(src, dest, soffset) {
|
|
444
|
-
var sn = src.length - mfLimit;
|
|
445
|
-
var dn = dest.length;
|
|
446
|
-
|
|
447
|
-
if (sn <= 0 || dn === 0 || soffset >= sn) {
|
|
448
|
-
return 0;
|
|
449
|
-
}
|
|
450
|
-
|
|
451
|
-
var si = 0;
|
|
452
|
-
var di = 0; // Hash Chain strategy:
|
|
453
|
-
// we need a hash table and a chain table
|
|
454
|
-
// the chain table cannot contain more entries than the window size (64Kb entries)
|
|
455
|
-
|
|
456
|
-
var hashTable = new Uint32Array(hashSize);
|
|
457
|
-
var chainTable = new Uint32Array(winSize); // Initialise the hash table with the first 64Kb of the input buffer
|
|
458
|
-
// (used when compressing dependent blocks)
|
|
459
|
-
|
|
460
|
-
while (si < soffset) {
|
|
461
|
-
var h = imul(getUint32(src, si), hasher) >>> hashShift;
|
|
462
|
-
chainTable[si & winMask] = hashTable[h];
|
|
463
|
-
hashTable[h] = ++si;
|
|
464
|
-
}
|
|
465
|
-
|
|
466
|
-
var anchor = si;
|
|
467
|
-
|
|
468
|
-
while (si < sn - minMatch) {
|
|
469
|
-
// hash the next 4 bytes (sequence)...
|
|
470
|
-
var _h2 = imul(getUint32(src, si), hasher) >>> hashShift; // follow the chain until out of window and give the longest match
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
var mLen = 0;
|
|
474
|
-
var offset = 0;
|
|
475
|
-
|
|
476
|
-
for (var next = hashTable[_h2] - 1; next > 0 && next > si - winSize; next = chainTable[next & winMask] - 1) {
|
|
477
|
-
// the first (mLen==0) or next byte (mLen>=minMatch) at current match length must match to improve on the match length
|
|
478
|
-
if (src[next + mLen] === src[si + mLen]) {
|
|
479
|
-
for (var _ml = 0;; ++_ml) {
|
|
480
|
-
if (src[next + _ml] !== src[si + _ml] || si + _ml > sn) {
|
|
481
|
-
// found a longer match, keep its position and length
|
|
482
|
-
if (mLen < _ml && _ml >= minMatch) {
|
|
483
|
-
mLen = _ml;
|
|
484
|
-
offset = si - next;
|
|
485
|
-
}
|
|
486
|
-
|
|
487
|
-
break;
|
|
488
|
-
}
|
|
489
|
-
}
|
|
490
|
-
}
|
|
491
|
-
}
|
|
492
|
-
|
|
493
|
-
chainTable[si & winMask] = hashTable[_h2];
|
|
494
|
-
hashTable[_h2] = si + 1; // no match found
|
|
495
|
-
|
|
496
|
-
if (mLen === 0) {
|
|
497
|
-
++si;
|
|
498
|
-
continue;
|
|
499
|
-
}
|
|
500
|
-
|
|
501
|
-
var si2 = si + 1;
|
|
502
|
-
var ml = si + mLen; // match found
|
|
503
|
-
// update hash/chain tables with overlaping bytes:
|
|
504
|
-
// si already hashed, add everything from si+1 up to the match length
|
|
505
|
-
|
|
506
|
-
while (si2 < ml) {
|
|
507
|
-
var _h3 = imul(getUint32(src, si2), hasher) >>> hashShift;
|
|
508
|
-
|
|
509
|
-
chainTable[si2 & winMask] = hashTable[_h3];
|
|
510
|
-
hashTable[_h3] = ++si2;
|
|
511
|
-
}
|
|
512
|
-
|
|
513
|
-
var _lLen2 = si - anchor;
|
|
514
|
-
|
|
515
|
-
si += mLen;
|
|
516
|
-
mLen -= minMatch; // match length does not include minMatch
|
|
517
|
-
|
|
518
|
-
if (mLen < 0xf) {
|
|
519
|
-
dest[di] = mLen;
|
|
520
|
-
} else {
|
|
521
|
-
dest[di] = 0xf;
|
|
522
|
-
} // encode literals length
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
if (_lLen2 < 0xf) {
|
|
526
|
-
dest[di] |= _lLen2 << 4;
|
|
527
|
-
} else {
|
|
528
|
-
dest[di] |= 0xf0;
|
|
529
|
-
|
|
530
|
-
if (++di === dn) {
|
|
531
|
-
throw errShortBuffer;
|
|
532
|
-
}
|
|
533
|
-
|
|
534
|
-
var l = _lLen2 - 0xf;
|
|
535
|
-
|
|
536
|
-
for (; l >= 0xff; l -= 0xff) {
|
|
537
|
-
dest[di] = 0xff;
|
|
538
|
-
|
|
539
|
-
if (++di === dn) {
|
|
540
|
-
throw errShortBuffer;
|
|
541
|
-
}
|
|
542
|
-
}
|
|
543
|
-
|
|
544
|
-
dest[di] = l & 0xff;
|
|
545
|
-
}
|
|
546
|
-
|
|
547
|
-
if (++di === dn) {
|
|
548
|
-
throw errShortBuffer;
|
|
549
|
-
} // literals
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
if (di + _lLen2 >= dn) {
|
|
553
|
-
throw errShortBuffer;
|
|
554
|
-
}
|
|
555
|
-
|
|
556
|
-
copy(dest, src, di, anchor, _lLen2);
|
|
557
|
-
di += _lLen2;
|
|
558
|
-
anchor = si; // encode offset
|
|
559
|
-
|
|
560
|
-
di += 2;
|
|
561
|
-
|
|
562
|
-
if (di >= dn) {
|
|
563
|
-
throw errShortBuffer;
|
|
564
|
-
}
|
|
565
|
-
|
|
566
|
-
dest[di - 2] = offset;
|
|
567
|
-
dest[di - 1] = offset >> 8; // encode match length part 2
|
|
568
|
-
|
|
569
|
-
if (mLen >= 0xf) {
|
|
570
|
-
for (mLen -= 0xf; mLen >= 0xff; mLen -= 0xff) {
|
|
571
|
-
dest[di] = 0xff;
|
|
572
|
-
|
|
573
|
-
if (++di === dn) {
|
|
574
|
-
throw errShortBuffer;
|
|
575
|
-
}
|
|
576
|
-
}
|
|
577
|
-
|
|
578
|
-
dest[di] = mLen;
|
|
579
|
-
|
|
580
|
-
if (++di === dn) {
|
|
581
|
-
throw errShortBuffer;
|
|
582
|
-
}
|
|
583
|
-
}
|
|
584
|
-
}
|
|
585
|
-
|
|
586
|
-
if (anchor === 0) {
|
|
587
|
-
// incompressible
|
|
588
|
-
return 0;
|
|
589
|
-
} // last literals
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
var lLen = src.length - anchor;
|
|
593
|
-
|
|
594
|
-
if (lLen < 0xf) {
|
|
595
|
-
dest[di] = lLen << 4;
|
|
596
|
-
} else {
|
|
597
|
-
dest[di] = 0xf0;
|
|
598
|
-
|
|
599
|
-
if (++di === dn) {
|
|
600
|
-
throw errShortBuffer;
|
|
601
|
-
}
|
|
602
|
-
|
|
603
|
-
for (lLen -= 0xf; lLen >= 0xff; lLen -= 0xff) {
|
|
604
|
-
dest[di] = 0xff;
|
|
605
|
-
|
|
606
|
-
if (++di === dn) {
|
|
607
|
-
throw errShortBuffer;
|
|
608
|
-
}
|
|
609
|
-
}
|
|
610
|
-
|
|
611
|
-
dest[di] = lLen;
|
|
612
|
-
}
|
|
613
|
-
|
|
614
|
-
if (++di === dn) {
|
|
615
|
-
throw errShortBuffer;
|
|
616
|
-
} // write literals
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
var lastLen = src.length - anchor;
|
|
620
|
-
var n = di + lastLen;
|
|
621
|
-
|
|
622
|
-
if (n > dn) {
|
|
623
|
-
throw errShortBuffer;
|
|
624
|
-
} else if (n >= sn) {
|
|
625
|
-
// incompressible
|
|
626
|
-
return 0;
|
|
627
|
-
}
|
|
628
|
-
|
|
629
|
-
copy(dest, src, di, anchor, lastLen);
|
|
630
|
-
di += lastLen;
|
|
631
|
-
return di;
|
|
632
|
-
}
|
|
633
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9taW5pZnkvbHo0LnRzIl0sIm5hbWVzIjpbImVyckludmFsaWRTb3VyY2UiLCJFcnJvciIsImVyclNob3J0QnVmZmVyIiwibWluTWF0Y2giLCJ3aW5TaXplTG9nIiwid2luU2l6ZSIsIndpbk1hc2siLCJoYXNoU2l6ZUxvZyIsImhhc2hTaXplIiwiaGFzaFNoaWZ0IiwibWZMaW1pdCIsInNraXBTdHJlbmd0aCIsImhhc2hlciIsImltdWxQb2x5ZmlsbCIsImEiLCJiIiwiYWgiLCJhbCIsImJoIiwiYmwiLCJpbXVsIiwiTWF0aCIsImdldFVpbnQzMiIsImkiLCJjb3B5IiwiZGVzdCIsInNyYyIsImRpIiwic2kiLCJsZW4iLCJjYWxjVW5jb21wcmVzc2VkTGVuIiwic24iLCJsZW5ndGgiLCJsTGVuIiwibUxlbiIsIm9mZnNldCIsInVuY29tcHJlc3NCbG9jayIsImRuIiwiY29tcHJlc3NCbG9ja0JvdW5kIiwibiIsImNvbXByZXNzQmxvY2siLCJzb2Zmc2V0IiwiaGFzaFRhYmxlIiwiVWludDMyQXJyYXkiLCJoIiwiYW5jaG9yIiwiZm1hIiwicmVmIiwibCIsImxhc3RMZW4iLCJjb21wcmVzc0Jsb2NrSEMiLCJjaGFpblRhYmxlIiwibmV4dCIsIm1sIiwic2kyIl0sIm1hcHBpbmdzIjoiQUFBQTs7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQSxJQUFNQSxnQkFBZ0IsR0FBRyxJQUFJQyxLQUFKLENBQVUsZ0JBQVYsQ0FBekI7QUFDQSxJQUFNQyxjQUFjLEdBQUcsSUFBSUQsS0FBSixDQUFVLGNBQVYsQ0FBdkIsQyxDQUVBOztBQUNBLElBQU1FLFFBQVEsR0FBRyxDQUFqQixDLENBQW9COztBQUNwQixJQUFNQyxV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O0FBQ0QsU0FBSytCLElBQUksSUFBSSxHQUFiLEVBQWtCQSxJQUFJLElBQUksSUFBMUIsRUFBZ0NBLElBQUksSUFBSSxJQUF4QyxFQUE4QztBQUM1Q1IsTUFBQUEsSUFBSSxDQUFDRSxFQUFELENBQUosR0FBVyxJQUFYOztBQUNBLFVBQUksRUFBRUEsRUFBRixLQUFTVSxFQUFiLEVBQWlCO0FBQ2YsY0FBTW5DLGNBQU47QUFDRDtBQUNGOztBQUNEdUIsSUFBQUEsSUFBSSxDQUFDRSxFQUFELENBQUosR0FBV00sSUFBWDtBQUNEOztBQUNELE1BQUksRUFBRU4sRUFBRixLQUFTVSxFQUFiLEVBQWlCO0FBQ2YsVUFBTW5DLGNBQU47QUFDRCxHQTdKTyxDQStKUjs7O0FBQ0EsTUFBTStDLE9BQU8sR0FBR3ZCLEdBQUcsQ0FBQ00sTUFBSixHQUFhYSxNQUE3QjtBQUNBLE1BQU1OLENBQUMsR0FBR1osRUFBRSxHQUFHc0IsT0FBZjs7QUFDQSxNQUFJVixDQUFDLEdBQUdGLEVBQVIsRUFBWTtBQUNWLFVBQU1uQyxjQUFOO0FBQ0QsR0FGRCxNQUVPLElBQUlxQyxDQUFDLElBQUlSLEVBQVQsRUFBYTtBQUNsQjtBQUNBLFdBQU8sQ0FBUDtBQUNEOztBQUNEUCxFQUFBQSxJQUFJLENBQUNDLElBQUQsRUFBT0MsR0FBUCxFQUFZQyxFQUFaLEVBQWdCa0IsTUFBaEIsRUFBd0JJLE9BQXhCLENBQUo7QUFDQXRCLEVBQUFBLEVBQUUsSUFBSXNCLE9BQU47QUFDQSxTQUFPdEIsRUFBUDtBQUNEIiwic291cmNlc0NvbnRlbnQiOlsiLy8gbHo0LXRzIEBsaWNlbnNlIEJTRC0zLUNsYXVzZSAvIENvcHlyaWdodCAoYykgMjAxNSwgUGllcnJlIEN1cnRvIC8gMjAxNiwgb292LiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTUsIFBpZXJyZSBDdXJ0b1xuICogQ29weXJpZ2h0IChjKSAyMDE2LCBvb3ZcbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbiAqXG4gKiAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xuICogICBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbiAqXG4gKiAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSxcbiAqICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvblxuICogICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi5cbiAqXG4gKiAqIE5laXRoZXIgdGhlIG5hbWUgb2YgeHhIYXNoIG5vciB0aGUgbmFtZXMgb2YgaXRzXG4gKiAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tXG4gKiAgIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4gKlxuICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRVxuICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRVxuICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUxcbiAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SXG4gKiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUlxuICogQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSxcbiAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFXG4gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuICovXG5cbmNvbnN0IGVyckludmFsaWRTb3VyY2UgPSBuZXcgRXJyb3IoXCJpbnZhbGlkIHNvdXJjZVwiKTtcbmNvbnN0IGVyclNob3J0QnVmZmVyID0gbmV3IEVycm9yKFwic2hvcnQgYnVmZmVyXCIpO1xuXG4vLyBUaGUgZm9sbG93aW5nIGNvbnN0YW50cyBhcmUgdXNlZCB0byBzZXR1cCB0aGUgY29tcHJlc3Npb24gYWxnb3JpdGhtLlxuY29uc3QgbWluTWF0Y2ggPSA0OyAvLyB0aGUgbWluaW11bSBzaXplIG9mIHRoZSBtYXRjaCBzZXF1ZW5jZSBzaXplICg0IGJ5dGVzKVxuY29uc3Qgd2luU2l6ZUxvZyA9IDE2OyAvLyBMWjQgNjRLYiB3aW5kb3cgc2l6ZSBsaW1pdFxuY29uc3Qgd2luU2l6ZSA9IDEgPDwgd2luU2l6ZUxvZztcbmNvbnN0IHdpbk1hc2sgPSB3aW5TaXplIC0gMTsgLy8gNjRLYiB3aW5kb3cgb2YgcHJldmlvdXMgZGF0YSBmb3IgZGVwZW5kZW50IGJsb2Nrc1xuXG4vLyBoYXNoU2l6ZUxvZyBkZXRlcm1pbmVzIHRoZSBzaXplIG9mIHRoZSBoYXNoIHRhYmxlIHVzZWQgdG8gcXVpY2tseSBmaW5kIGEgcHJldmlvdXMgbWF0Y2ggcG9zaXRpb24uXG4vLyBJdHMgdmFsdWUgaW5mbHVlbmNlcyB0aGUgY29tcHJlc3Npb24gc3BlZWQgYW5kIG1lbW9yeSB1c2FnZSwgdGhlIGxvd2VyIHRoZSBmYXN0ZXIsXG4vLyBidXQgYXQgdGhlIGV4cGVuc2Ugb2YgdGhlIGNvbXByZXNzaW9uIHJhdGlvLlxuLy8gMTYgc2VlbXMgdG8gYmUgdGhlIGJlc3QgY29tcHJvbWlzZS5cbmNvbnN0IGhhc2hTaXplTG9nID0gMTY7XG5jb25zdCBoYXNoU2l6ZSA9IDEgPDwgaGFzaFNpemVMb2c7XG5jb25zdCBoYXNoU2hpZnQgPSBtaW5NYXRjaCAqIDggLSBoYXNoU2l6ZUxvZztcblxuY29uc3QgbWZMaW1pdCA9IDggKyBtaW5NYXRjaDsgLy8gVGhlIGxhc3QgbWF0Y2ggY2Fubm90IHN0YXJ0IHdpdGhpbiB0aGUgbGFzdCAxMiBieXRlcy5cbmNvbnN0IHNraXBTdHJlbmd0aCA9IDY7IC8vIHZhcmlhYmxlIHN0ZXAgZm9yIGZhc3Qgc2NhblxuXG5jb25zdCBoYXNoZXIgPSAyNjU0NDM1NzYxIHwgMDsgLy8gcHJpbWUgbnVtYmVyIHVzZWQgdG8gaGFzaCBtaW5NYXRjaFxuXG4vLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9NYXRoL2ltdWwjUG9seWZpbGxcbmZ1bmN0aW9uIGltdWxQb2x5ZmlsbChhOiBudW1iZXIsIGI6IG51bWJlcik6IG51bWJlciB7XG4gIGNvbnN0IGFoID0gKGEgPj4+IDE2KSAmIDB4ZmZmZjtcbiAgY29uc3QgYWwgPSBhICYgMHhmZmZmO1xuICBjb25zdCBiaCA9IChiID4+PiAxNikgJiAweGZmZmY7XG4gIGNvbnN0IGJsID0gYiAmIDB4ZmZmZjtcbiAgLy8gdGhlIHNoaWZ0IGJ5IDAgZml4ZXMgdGhlIHNpZ24gb24gdGhlIGhpZ2ggcGFydFxuICAvLyB0aGUgZmluYWwgfDAgY29udmVydHMgdGhlIHVuc2lnbmVkIHZhbHVlIGludG8gYSBzaWduZWQgdmFsdWVcbiAgcmV0dXJuIChhbCAqIGJsICsgKCgoYWggKiBibCArIGFsICogYmgpIDw8IDE2KSA+Pj4gMCkpIHwgMDtcbn1cbmNvbnN0IGltdWwgPSBNYXRoLmltdWwgPyBNYXRoLmltdWwgOiBpbXVsUG9seWZpbGw7XG5cbmZ1bmN0aW9uIGdldFVpbnQzMihhOiBVaW50OEFycmF5LCBpOiBudW1iZXIpOiBudW1iZXIge1xuICByZXR1cm4gYVtpICsgM10gfCAoYVtpICsgMl0gPDwgOCkgfCAoYVtpICsgMV0gPDwgMTYpIHwgKGFbaV0gPDwgMjQpO1xufVxuXG5mdW5jdGlvbiBjb3B5KFxuICBkZXN0OiBVaW50OEFycmF5LFxuICBzcmM6IFVpbnQ4QXJyYXksXG4gIGRpOiBudW1iZXIsXG4gIHNpOiBudW1iZXIsXG4gIGxlbjogbnVtYmVyXG4pOiB2b2lkIHtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47ICsraSkge1xuICAgIGRlc3RbZGkrK10gPSBzcmNbc2krK107XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNhbGNVbmNvbXByZXNzZWRMZW4oc3JjOiBVaW50OEFycmF5KTogbnVtYmVyIHtcbiAgY29uc3Qgc24gPSBzcmMubGVuZ3RoO1xuICBpZiAoc24gPT09IDApIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIGxldCBzaSA9IDA7XG4gIGxldCBkaSA9IDA7XG5cbiAgd2hpbGUgKHRydWUpIHtcbiAgICAvLyBsaXRlcmFscyBhbmQgbWF0Y2ggbGVuZ3RocyAodG9rZW4pXG4gICAgbGV0IGxMZW4gPSBzcmNbc2ldID4+IDQ7XG4gICAgbGV0IG1MZW4gPSBzcmNbc2ldICYgMHhmO1xuICAgIGlmICgrK3NpID09PSBzbikge1xuICAgICAgdGhyb3cgZXJySW52YWxpZFNvdXJjZTtcbiAgICB9XG5cbiAgICAvLyBsaXRlcmFsc1xuICAgIGlmIChsTGVuID4gMCkge1xuICAgICAgaWYgKGxMZW4gPT09IDB4Zikge1xuICAgICAgICB3aGlsZSAoc3JjW3NpXSA9PT0gMHhmZikge1xuICAgICAgICAgIGxMZW4gKz0gMHhmZjtcbiAgICAgICAgICBpZiAoKytzaSA9PT0gc24pIHtcbiAgICAgICAgICAgIHRocm93IGVyckludmFsaWRTb3VyY2U7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGxMZW4gKz0gc3JjW3NpXTtcbiAgICAgICAgaWYgKCsrc2kgPT09IHNuKSB7XG4gICAgICAgICAgdGhyb3cgZXJySW52YWxpZFNvdXJjZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZGkgKz0gbExlbjtcbiAgICAgIHNpICs9IGxMZW47XG4gICAgICBpZiAoc2kgPj0gc24pIHtcbiAgICAgICAgcmV0dXJuIGRpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHNpICs9IDI7XG4gICAgaWYgKHNpID49IHNuKSB7XG4gICAgICB0aHJvdyBlcnJJbnZhbGlkU291cmNlO1xuICAgIH1cbiAgICBjb25zdCBvZmZzZXQgPSBzcmNbc2kgLSAyXSB8IChzcmNbc2kgLSAxXSA8PCA4KTtcbiAgICBpZiAoZGkgLSBvZmZzZXQgPCAwIHx8IG9mZnNldCA9PT0gMCkge1xuICAgICAgdGhyb3cgZXJySW52YWxpZFNvdXJjZTtcbiAgICB9XG5cbiAgICAvLyBtYXRjaFxuICAgIGlmIChtTGVuID09PSAweGYpIHtcbiAgICAgIHdoaWxlIChzcmNbc2ldID09PSAweGZmKSB7XG4gICAgICAgIG1MZW4gKz0gMHhmZjtcbiAgICAgICAgaWYgKCsrc2kgPT09IHNuKSB7XG4gICAgICAgICAgdGhyb3cgZXJySW52YWxpZFNvdXJjZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgbUxlbiArPSBzcmNbc2ldO1xuICAgICAgaWYgKCsrc2kgPT09IHNuKSB7XG4gICAgICAgIHRocm93IGVyckludmFsaWRTb3VyY2U7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIG1pbmltdW0gbWF0Y2ggbGVuZ3RoIGlzIDRcbiAgICBtTGVuICs9IDQ7XG5cbiAgICAvLyBjb3B5IHRoZSBtYXRjaCAoTkIuIG1hdGNoIGlzIGF0IGxlYXN0IDQgYnl0ZXMgbG9uZylcbiAgICBmb3IgKDsgbUxlbiA+PSBvZmZzZXQ7IG1MZW4gLT0gb2Zmc2V0KSB7XG4gICAgICBkaSArPSBvZmZzZXQ7XG4gICAgfVxuICAgIGRpICs9IG1MZW47XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVuY29tcHJlc3NCbG9jayhzcmM6IFVpbnQ4QXJyYXksIGRlc3Q6IFVpbnQ4QXJyYXkpOiBudW1iZXIge1xuICBjb25zdCBzbiA9IHNyYy5sZW5ndGg7XG4gIGNvbnN0IGRuID0gZGVzdC5sZW5ndGg7XG4gIGlmIChzbiA9PT0gMCkge1xuICAgIHJldHVybiAwO1xuICB9XG5cbiAgbGV0IHNpID0gMDtcbiAgbGV0IGRpID0gMDtcblxuICB3aGlsZSAodHJ1ZSkge1xuICAgIC8vIGxpdGVyYWxzIGFuZCBtYXRjaCBsZW5ndGhzICh0b2tlbilcbiAgICBsZXQgbExlbiA9IHNyY1tzaV0gPj4gNDtcbiAgICBsZXQgbUxlbiA9IHNyY1tzaV0gJiAweGY7XG4gICAgaWYgKCsrc2kgPT09IHNuKSB7XG4gICAgICB0aHJvdyBlcnJJbnZhbGlkU291cmNlO1xuICAgIH1cblxuICAgIC8vIGxpdGVyYWxzXG4gICAgaWYgKGxMZW4gPiAwKSB7XG4gICAgICBpZiAobExlbiA9PT0gMHhmKSB7XG4gICAgICAgIHdoaWxlIChzcmNbc2ldID09PSAweGZmKSB7XG4gICAgICAgICAgbExlbiArPSAweGZmO1xuICAgICAgICAgIGlmICgrK3NpID09PSBzbikge1xuICAgICAgICAgICAgdGhyb3cgZXJySW52YWxpZFNvdXJjZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbExlbiArPSBzcmNbc2ldO1xuICAgICAgICBpZiAoKytzaSA9PT0gc24pIHtcbiAgICAgICAgICB0aHJvdyBlcnJJbnZhbGlkU291cmNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoZG4gLSBkaSA8IGxMZW4gfHwgc2kgKyBsTGVuID4gc24pIHtcbiAgICAgICAgdGhyb3cgZXJyU2hvcnRCdWZmZXI7XG4gICAgICB9XG4gICAgICBjb3B5KGRlc3QsIHNyYywgZGksIHNpLCBsTGVuKTtcbiAgICAgIGRpICs9IGxMZW47XG4gICAgICBzaSArPSBsTGVuO1xuICAgICAgaWYgKHNpID49IHNuKSB7XG4gICAgICAgIHJldHVybiBkaTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBzaSArPSAyO1xuICAgIGlmIChzaSA+PSBzbikge1xuICAgICAgdGhyb3cgZXJySW52YWxpZFNvdXJjZTtcbiAgICB9XG4gICAgY29uc3Qgb2Zmc2V0ID0gc3JjW3NpIC0gMl0gfCAoc3JjW3NpIC0gMV0gPDwgOCk7XG4gICAgaWYgKGRpIC0gb2Zmc2V0IDwgMCB8fCBvZmZzZXQgPT09IDApIHtcbiAgICAgIHRocm93IGVyckludmFsaWRTb3VyY2U7XG4gICAgfVxuXG4gICAgLy8gbWF0Y2hcbiAgICBpZiAobUxlbiA9PT0gMHhmKSB7XG4gICAgICB3aGlsZSAoc3JjW3NpXSA9PT0gMHhmZikge1xuICAgICAgICBtTGVuICs9IDB4ZmY7XG4gICAgICAgIGlmICgrK3NpID09PSBzbikge1xuICAgICAgICAgIHRocm93IGVyckludmFsaWRTb3VyY2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIG1MZW4gKz0gc3JjW3NpXTtcbiAgICAgIGlmICgrK3NpID09PSBzbikge1xuICAgICAgICB0aHJvdyBlcnJJbnZhbGlkU291cmNlO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBtaW5pbXVtIG1hdGNoIGxlbmd0aCBpcyA0XG4gICAgbUxlbiArPSA0O1xuICAgIGlmIChkbiAtIGRpIDw9IG1MZW4pIHtcbiAgICAgIHRocm93IGVyclNob3J0QnVmZmVyO1xuICAgIH1cblxuICAgIC8vIGNvcHkgdGhlIG1hdGNoIChOQi4gbWF0Y2ggaXMgYXQgbGVhc3QgNCBieXRlcyBsb25nKVxuICAgIGZvciAoOyBtTGVuID49IG9mZnNldDsgbUxlbiAtPSBvZmZzZXQpIHtcbiAgICAgIGNvcHkoZGVzdCwgZGVzdCwgZGksIGRpIC0gb2Zmc2V0LCBvZmZzZXQpO1xuICAgICAgZGkgKz0gb2Zmc2V0O1xuICAgIH1cbiAgICBjb3B5KGRlc3QsIGRlc3QsIGRpLCBkaSAtIG9mZnNldCwgbUxlbik7XG4gICAgZGkgKz0gbUxlbjtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY29tcHJlc3NCbG9ja0JvdW5kKG46IG51bWJlcik6IG51bWJlciB7XG4gIHJldHVybiBuICsgKChuIC8gMjU1KSB8IDApICsgMTY7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb21wcmVzc0Jsb2NrKFxuICBzcmM6IFVpbnQ4QXJyYXksXG4gIGRlc3Q6IFVpbnQ4QXJyYXksXG4gIHNvZmZzZXQ6IG51bWJlclxuKTogbnVtYmVyIHtcbiAgY29uc3Qgc24gPSBzcmMubGVuZ3RoIC0gbWZMaW1pdDtcbiAgY29uc3QgZG4gPSBkZXN0Lmxlbmd0aDtcbiAgaWYgKHNuIDw9IDAgfHwgZG4gPT09IDAgfHwgc29mZnNldCA+PSBzbikge1xuICAgIHJldHVybiAwO1xuICB9XG4gIGxldCBzaSA9IDAsXG4gICAgZGkgPSAwO1xuXG4gIC8vIGZhc3Qgc2NhbiBzdHJhdGVneTpcbiAgLy8gd2Ugb25seSBuZWVkIGEgaGFzaCB0YWJsZSB0byBzdG9yZSB0aGUgbGFzdCBzZXF1ZW5jZXMgKDQgYnl0ZXMpXG4gIGNvbnN0IGhhc2hUYWJsZSA9IG5ldyBVaW50MzJBcnJheShoYXNoU2l6ZSk7XG5cbiAgLy8gSW5pdGlhbGlzZSB0aGUgaGFzaCB0YWJsZSB3aXRoIHRoZSBmaXJzdCA2NEtiIG9mIHRoZSBpbnB1dCBidWZmZXJcbiAgLy8gKHVzZWQgd2hlbiBjb21wcmVzc2luZyBkZXBlbmRlbnQgYmxvY2tzKVxuICB3aGlsZSAoc2kgPCBzb2Zmc2V0KSB7XG4gICAgY29uc3QgaCA9IGltdWwoZ2V0VWludDMyKHNyYywgc2kpLCBoYXNoZXIpID4+PiBoYXNoU2hpZnQ7XG4gICAgaGFzaFRhYmxlW2hdID0gKytzaTtcbiAgfVxuXG4gIGxldCBhbmNob3IgPSBzaTtcbiAgbGV0IGZtYSA9IDEgPDwgc2tpcFN0cmVuZ3RoO1xuICB3aGlsZSAoc2kgPCBzbiAtIG1pbk1hdGNoKSB7XG4gICAgLy8gaGFzaCB0aGUgbmV4dCA0IGJ5dGVzIChzZXF1ZW5jZSkuLi5cbiAgICBjb25zdCBoID0gaW11bChnZXRVaW50MzIoc3JjLCBzaSksIGhhc2hlcikgPj4+IGhhc2hTaGlmdDtcbiAgICAvLyAtMSB0byBzZXBhcmF0ZSBleGlzdGluZyBlbnRyaWVzIGZyb20gbmV3IG9uZXNcbiAgICBjb25zdCByZWYgPSBoYXNoVGFibGVbaF0gLSAxO1xuICAgIC8vIC4uLmFuZCBzdG9yZSB0aGUgcG9zaXRpb24gb2YgdGhlIGhhc2ggaW4gdGhlIGhhc2ggdGFibGUgKCsxIHRvIGNvbXBlbnNhdGUgdGhlIC0xIHVwb24gc2F2aW5nKVxuICAgIGhhc2hUYWJsZVtoXSA9IHNpICsgMTtcbiAgICAvLyBubyBuZWVkIHRvIGNoZWNrIHRoZSBsYXN0IDMgYnl0ZXMgaW4gdGhlIGZpcnN0IGxpdGVyYWwgNCBieXRlcyBhc1xuICAgIC8vIHRoaXMgZ3VhcmFudGVlcyB0aGF0IHRoZSBuZXh0IG1hdGNoLCBpZiBhbnksIGlzIGNvbXByZXNzZWQgd2l0aFxuICAgIC8vIGEgbG93ZXIgc2l6ZSwgc2luY2UgdG8gaGF2ZSBzb21lIGNvbXByZXNzaW9uIHdlIG11c3QgaGF2ZTpcbiAgICAvLyBsbCttbC1vdmVybGFwID4gMSArIChsbC0xNSkvMjU1ICsgKG1sLTQtMTUpLzI1NSArIDIgKHVuY29tcHJlc3NlZCBzaXplPmNvbXByZXNzZWQgc2l6ZSlcbiAgICAvLyA9PiBsbCttbD4zKzIqb3ZlcmxhcCA9PiBsbCttbD49IDQrMipvdmVybGFwXG4gICAgLy8gYW5kIGJ5IGRlZmluaXRpb24gd2UgZG8gaGF2ZTpcbiAgICAvLyBsbCA+PSAxLCBtbCA+PSA0XG4gICAgLy8gPT4gbGwrbWwgPj0gNVxuICAgIC8vID0+IHNvIG92ZXJsYXAgbXVzdCBiZSAwXG5cbiAgICAvLyB0aGUgc2VxdWVuY2UgaXMgbmV3LCBvdXQgb2YgYm91bmQgKDY0a2IpIG9yIG5vdCB2YWxpZDogdHJ5IG5leHQgc2VxdWVuY2VcbiAgICBpZiAoXG4gICAgICByZWYgPCAwIHx8IC8vKGZtYSAmICgoMSA8PCBza2lwU3RyZW5ndGgpIC0gMSkpIDwgNCB8fCAvLyB0aGlzIGNvZGUgc2VlbXMgaGFzIGEgYmlnIHBlbmFsdHkgZm9yIHNpemUuLi5cbiAgICAgIChzaSAtIHJlZikgPj4gd2luU2l6ZUxvZyA+IDAgfHxcbiAgICAgIHNyY1tyZWZdICE9PSBzcmNbc2ldIHx8XG4gICAgICBzcmNbcmVmICsgMV0gIT09IHNyY1tzaSArIDFdIHx8XG4gICAgICBzcmNbcmVmICsgMl0gIT09IHNyY1tzaSArIDJdIHx8XG4gICAgICBzcmNbcmVmICsgM10gIT09IHNyY1tzaSArIDNdXG4gICAgKSB7XG4gICAgICAvLyB2YXJpYWJsZSBzdGVwOiBpbXByb3ZlcyBwZXJmb3JtYW5jZSBvbiBub24tY29tcHJlc3NpYmxlIGRhdGFcbiAgICAgIHNpICs9IGZtYSA+PiBza2lwU3RyZW5ndGg7XG4gICAgICArK2ZtYTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICAvLyBtYXRjaCBmb3VuZFxuICAgIGZtYSA9IDEgPDwgc2tpcFN0cmVuZ3RoO1xuICAgIGNvbnN0IGxMZW4gPSBzaSAtIGFuY2hvcjtcbiAgICBjb25zdCBvZmZzZXQgPSBzaSAtIHJlZjtcblxuICAgIC8vIGVuY29kZSBtYXRjaCBsZW5ndGggcGFydCAxXG4gICAgc2kgKz0gbWluTWF0Y2g7XG4gICAgbGV0IG1MZW4gPSBzaTsgLy8gbWF0Y2ggbGVuZ3RoIGhhcyBtaW5NYXRjaCBhbHJlYWR5XG4gICAgd2hpbGUgKHNpIDw9IHNuICYmIHNyY1tzaV0gPT09IHNyY1tzaSAtIG9mZnNldF0pIHtcbiAgICAgIHNpKys7XG4gICAgfVxuICAgIG1MZW4gPSBzaSAtIG1MZW47XG4gICAgaWYgKG1MZW4gPCAweGYpIHtcbiAgICAgIGRlc3RbZGldID0gbUxlbjtcbiAgICB9IGVsc2Uge1xuICAgICAgZGVzdFtkaV0gPSAweGY7XG4gICAgfVxuXG4gICAgLy8gZW5jb2RlIGxpdGVyYWxzIGxlbmd0aFxuICAgIGlmIChsTGVuIDwgMHhmKSB7XG4gICAgICBkZXN0W2RpXSB8PSBsTGVuIDw8IDQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlc3RbZGldIHw9IDB4ZjA7XG4gICAgICBpZiAoKytkaSA9PT0gZG4pIHtcbiAgICAgICAgdGhyb3cgZXJyU2hvcnRCdWZmZXI7XG4gICAgICB9XG4gICAgICBsZXQgbCA9IGxMZW4gLSAweGY7XG4gICAgICBmb3IgKDsgbCA+PSAweGZmOyBsIC09IDB4ZmYpIHtcbiAgICAgICAgZGVzdFtkaV0gPSAweGZmO1xuICAgICAgICBpZiAoKytkaSA9PT0gZG4pIHtcbiAgICAgICAgICB0aHJvdyBlcnJTaG9ydEJ1ZmZlcjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZGVzdFtkaV0gPSBsICYgMHhmZjtcbiAgICB9XG4gICAgaWYgKCsrZGkgPT09IGRuKSB7XG4gICAgICB0aHJvdyBlcnJTaG9ydEJ1ZmZlcjtcbiAgICB9XG5cbiAgICAvLyBsaXRlcmFsc1xuICAgIGlmIChkaSArIGxMZW4gPj0gZG4pIHtcbiAgICAgIHRocm93IGVyclNob3J0QnVmZmVyO1xuICAgIH1cbiAgICBjb3B5KGRlc3QsIHNyYywgZGksIGFuY2hvciwgbExlbik7XG4gICAgZGkgKz0gbExlbjtcbiAgICBhbmNob3IgPSBzaTtcblxuICAgIC8vIGVuY29kZSBvZmZzZXRcbiAgICBkaSArPSAyO1xuICAgIGlmIChkaSA+PSBkbikge1xuICAgICAgdGhyb3cgZXJyU2hvcnRCdWZmZXI7XG4gICAgfVxuICAgIGRlc3RbZGkgLSAyXSA9IG9mZnNldDtcbiAgICBkZXN0W2RpIC0gMV0gPSBvZmZzZXQgPj4gODtcblxuICAgIC8vIGVuY29kZSBtYXRjaCBsZW5ndGggcGFydCAyXG4gICAgaWYgKG1MZW4gPj0gMHhmKSB7XG4gICAgICBmb3IgKG1MZW4gLT0gMHhmOyBtTGVuID49IDB4ZmY7IG1MZW4gLT0gMHhmZikge1xuICAgICAgICBkZXN0W2RpXSA9IDB4ZmY7XG4gICAgICAgIGlmICgrK2RpID09PSBkbikge1xuICAgICAgICAgIHRocm93IGVyclNob3J0QnVmZmVyO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBkZXN0W2RpXSA9IG1MZW47XG4gICAgICBpZiAoKytkaSA9PT0gZG4pIHtcbiAgICAgICAgdGhyb3cgZXJyU2hvcnRCdWZmZXI7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKGFuY2hvciA9PT0gMCkge1xuICAgIC8vIGluY29tcHJlc3NpYmxlXG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICAvLyBsYXN0IGxpdGVyYWxzXG4gIGxldCBsTGVuID0gc3JjLmxlbmd0aCAtIGFuY2hvcjtcbiAgaWYgKGxMZW4gPCAweGYpIHtcbiAgICBkZXN0W2RpXSA9IGxMZW4gPDwgNDtcbiAgfSBlbHNlIHtcbiAgICBkZXN0W2RpXSA9IDB4ZjA7XG4gICAgaWYgKCsrZGkgPT09IGRuKSB7XG4gICAgICB0aHJvdyBlcnJTaG9ydEJ1ZmZlcjtcbiAgICB9XG4gICAgZm9yIChsTGVuIC09IDB4ZjsgbExlbiA+PSAweGZmOyBsTGVuIC09IDB4ZmYpIHtcbiAgICAgIGRlc3RbZGldID0gMHhmZjtcbiAgICAgIGlmICgrK2RpID09PSBkbikge1xuICAgICAgICB0aHJvdyBlcnJTaG9ydEJ1ZmZlcjtcbiAgICAgIH1cbiAgICB9XG4gICAgZGVzdFtkaV0gPSBsTGVuO1xuICB9XG4gIGlmICgrK2RpID09PSBkbikge1xuICAgIHRocm93IGVyclNob3J0QnVmZmVyO1xuICB9XG5cbiAgLy8gd3JpdGUgbGl0ZXJhbHNcbiAgY29uc3QgbGFzdExlbiA9IHNyYy5sZW5ndGggLSBhbmNob3I7XG4gIGNvbnN0IG4gPSBkaSArIGxhc3RMZW47XG4gIGlmIChuID4gZG4pIHtcbiAgICB0aHJvdyBlcnJTaG9ydEJ1ZmZlcjtcbiAgfSBlbHNlIGlmIChuID49IHNuKSB7XG4gICAgLy8gaW5jb21wcmVzc2libGVcbiAgICByZXR1cm4gMDtcbiAgfVxuICBjb3B5KGRlc3QsIHNyYywgZGksIGFuY2hvciwgbGFzdExlbik7XG4gIGRpICs9IGxhc3RMZW47XG4gIHJldHVybiBkaTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbXByZXNzQmxvY2tIQyhcbiAgc3JjOiBVaW50OEFycmF5LFxuICBkZXN0OiBVaW50OEFycmF5LFxuICBzb2Zmc2V0OiBudW1iZXJcbik6IG51bWJlciB7XG4gIGNvbnN0IHNuID0gc3JjLmxlbmd0aCAtIG1mTGltaXQ7XG4gIGNvbnN0IGRuID0gZGVzdC5sZW5ndGg7XG4gIGlmIChzbiA8PSAwIHx8IGRuID09PSAwIHx8IHNvZmZzZXQgPj0gc24pIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuICBsZXQgc2kgPSAwO1xuICBsZXQgZGkgPSAwO1xuXG4gIC8vIEhhc2ggQ2hhaW4gc3RyYXRlZ3k6XG4gIC8vIHdlIG5lZWQgYSBoYXNoIHRhYmxlIGFuZCBhIGNoYWluIHRhYmxlXG4gIC8vIHRoZSBjaGFpbiB0YWJsZSBjYW5ub3QgY29udGFpbiBtb3JlIGVudHJpZXMgdGhhbiB0aGUgd2luZG93IHNpemUgKDY0S2IgZW50cmllcylcbiAgY29uc3QgaGFzaFRhYmxlID0gbmV3IFVpbnQzMkFycmF5KGhhc2hTaXplKTtcbiAgY29uc3QgY2hhaW5UYWJsZSA9IG5ldyBVaW50MzJBcnJheSh3aW5TaXplKTtcblxuICAvLyBJbml0aWFsaXNlIHRoZSBoYXNoIHRhYmxlIHdpdGggdGhlIGZpcnN0IDY0S2Igb2YgdGhlIGlucHV0IGJ1ZmZlclxuICAvLyAodXNlZCB3aGVuIGNvbXByZXNzaW5nIGRlcGVuZGVudCBibG9ja3MpXG4gIHdoaWxlIChzaSA8IHNvZmZzZXQpIHtcbiAgICBjb25zdCBoID0gaW11bChnZXRVaW50MzIoc3JjLCBzaSksIGhhc2hlcikgPj4+IGhhc2hTaGlmdDtcbiAgICBjaGFpblRhYmxlW3NpICYgd2luTWFza10gPSBoYXNoVGFibGVbaF07XG4gICAgaGFzaFRhYmxlW2hdID0gKytzaTtcbiAgfVxuXG4gIGxldCBhbmNob3IgPSBzaTtcbiAgd2hpbGUgKHNpIDwgc24gLSBtaW5NYXRjaCkge1xuICAgIC8vIGhhc2ggdGhlIG5leHQgNCBieXRlcyAoc2VxdWVuY2UpLi4uXG4gICAgY29uc3QgaCA9IGltdWwoZ2V0VWludDMyKHNyYywgc2kpLCBoYXNoZXIpID4+PiBoYXNoU2hpZnQ7XG5cbiAgICAvLyBmb2xsb3cgdGhlIGNoYWluIHVudGlsIG91dCBvZiB3aW5kb3cgYW5kIGdpdmUgdGhlIGxvbmdlc3QgbWF0Y2hcbiAgICBsZXQgbUxlbiA9IDA7XG4gICAgbGV0IG9mZnNldCA9IDA7XG4gICAgZm9yIChcbiAgICAgIGxldCBuZXh0ID0gaGFzaFRhYmxlW2hdIC0gMTtcbiAgICAgIG5leHQgPiAwICYmIG5leHQgPiBzaSAtIHdpblNpemU7XG4gICAgICBuZXh0ID0gY2hhaW5UYWJsZVtuZXh0ICYgd2luTWFza10gLSAxXG4gICAgKSB7XG4gICAgICAvLyB0aGUgZmlyc3QgKG1MZW49PTApIG9yIG5leHQgYnl0ZSAobUxlbj49bWluTWF0Y2gpIGF0IGN1cnJlbnQgbWF0Y2ggbGVuZ3RoIG11c3QgbWF0Y2ggdG8gaW1wcm92ZSBvbiB0aGUgbWF0Y2ggbGVuZ3RoXG4gICAgICBpZiAoc3JjW25leHQgKyBtTGVuXSA9PT0gc3JjW3NpICsgbUxlbl0pIHtcbiAgICAgICAgZm9yIChsZXQgbWwgPSAwOyA7ICsrbWwpIHtcbiAgICAgICAgICBpZiAoc3JjW25leHQgKyBtbF0gIT09IHNyY1tzaSArIG1sXSB8fCBzaSArIG1sID4gc24pIHtcbiAgICAgICAgICAgIC8vIGZvdW5kIGEgbG9uZ2VyIG1hdGNoLCBrZWVwIGl0cyBwb3NpdGlvbiBhbmQgbGVuZ3RoXG4gICAgICAgICAgICBpZiAobUxlbiA8IG1sICYmIG1sID49IG1pbk1hdGNoKSB7XG4gICAgICAgICAgICAgIG1MZW4gPSBtbDtcbiAgICAgICAgICAgICAgb2Zmc2V0ID0gc2kgLSBuZXh0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGNoYWluVGFibGVbc2kgJiB3aW5NYXNrXSA9IGhhc2hUYWJsZVtoXTtcbiAgICBoYXNoVGFibGVbaF0gPSBzaSArIDE7XG5cbiAgICAvLyBubyBtYXRjaCBmb3VuZFxuICAgIGlmIChtTGVuID09PSAwKSB7XG4gICAgICArK3NpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgbGV0IHNpMiA9IHNpICsgMTtcbiAgICBjb25zdCBtbCA9IHNpICsgbUxlbjtcblxuICAgIC8vIG1hdGNoIGZvdW5kXG4gICAgLy8gdXBkYXRlIGhhc2gvY2hhaW4gdGFibGVzIHdpdGggb3ZlcmxhcGluZyBieXRlczpcbiAgICAvLyBzaSBhbHJlYWR5IGhhc2hlZCwgYWRkIGV2ZXJ5dGhpbmcgZnJvbSBzaSsxIHVwIHRvIHRoZSBtYXRjaCBsZW5ndGhcbiAgICB3aGlsZSAoc2kyIDwgbWwpIHtcbiAgICAgIGNvbnN0IGggPSBpbXVsKGdldFVpbnQzMihzcmMsIHNpMiksIGhhc2hlcikgPj4+IGhhc2hTaGlmdDtcbiAgICAgIGNoYWluVGFibGVbc2kyICYgd2luTWFza10gPSBoYXNoVGFibGVbaF07XG4gICAgICBoYXNoVGFibGVbaF0gPSArK3NpMjtcbiAgICB9XG5cbiAgICBjb25zdCBsTGVuID0gc2kgLSBhbmNob3I7XG4gICAgc2kgKz0gbUxlbjtcbiAgICBtTGVuIC09IG1pbk1hdGNoOyAvLyBtYXRjaCBsZW5ndGggZG9lcyBub3QgaW5jbHVkZSBtaW5NYXRjaFxuXG4gICAgaWYgKG1MZW4gPCAweGYpIHtcbiAgICAgIGRlc3RbZGldID0gbUxlbjtcbiAgICB9IGVsc2Uge1xuICAgICAgZGVzdFtkaV0gPSAweGY7XG4gICAgfVxuXG4gICAgLy8gZW5jb2RlIGxpdGVyYWxzIGxlbmd0aFxuICAgIGlmIChsTGVuIDwgMHhmKSB7XG4gICAgICBkZXN0W2RpXSB8PSBsTGVuIDw8IDQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlc3RbZGldIHw9IDB4ZjA7XG4gICAgICBpZiAoKytkaSA9PT0gZG4pIHtcbiAgICAgICAgdGhyb3cgZXJyU2hvcnRCdWZmZXI7XG4gICAgICB9XG4gICAgICBsZXQgbCA9IGxMZW4gLSAweGY7XG4gICAgICBmb3IgKDsgbCA+PSAweGZmOyBsIC09IDB4ZmYpIHtcbiAgICAgICAgZGVzdFtkaV0gPSAweGZmO1xuICAgICAgICBpZiAoKytkaSA9PT0gZG4pIHtcbiAgICAgICAgICB0aHJvdyBlcnJTaG9ydEJ1ZmZlcjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZGVzdFtkaV0gPSBsICYgMHhmZjtcbiAgICB9XG4gICAgaWYgKCsrZGkgPT09IGRuKSB7XG4gICAgICB0aHJvdyBlcnJTaG9ydEJ1ZmZlcjtcbiAgICB9XG5cbiAgICAvLyBsaXRlcmFsc1xuICAgIGlmIChkaSArIGxMZW4gPj0gZG4pIHtcbiAgICAgIHRocm93IGVyclNob3J0QnVmZmVyO1xuICAgIH1cbiAgICBjb3B5KGRlc3QsIHNyYywgZGksIGFuY2hvciwgbExlbik7XG4gICAgZGkgKz0gbExlbjtcbiAgICBhbmNob3IgPSBzaTtcblxuICAgIC8vIGVuY29kZSBvZmZzZXRcbiAgICBkaSArPSAyO1xuICAgIGlmIChkaSA+PSBkbikge1xuICAgICAgdGhyb3cgZXJyU2hvcnRCdWZmZXI7XG4gICAgfVxuICAgIGRlc3RbZGkgLSAyXSA9IG9mZnNldDtcbiAgICBkZXN0W2RpIC0gMV0gPSBvZmZzZXQgPj4gODtcblxuICAgIC8vIGVuY29kZSBtYXRjaCBsZW5ndGggcGFydCAyXG4gICAgaWYgKG1MZW4gPj0gMHhmKSB7XG4gICAgICBmb3IgKG1MZW4gLT0gMHhmOyBtTGVuID49IDB4ZmY7IG1MZW4gLT0gMHhmZikge1xuICAgICAgICBkZXN0W2RpXSA9IDB4ZmY7XG4gICAgICAgIGlmICgrK2RpID09PSBkbikge1xuICAgICAgICAgIHRocm93IGVyclNob3J0QnVmZmVyO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBkZXN0W2RpXSA9IG1MZW47XG4gICAgICBpZiAoKytkaSA9PT0gZG4pIHtcbiAgICAgICAgdGhyb3cgZXJyU2hvcnRCdWZmZXI7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKGFuY2hvciA9PT0gMCkge1xuICAgIC8vIGluY29tcHJlc3NpYmxlXG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICAvLyBsYXN0IGxpdGVyYWxzXG4gIGxldCBsTGVuID0gc3JjLmxlbmd0aCAtIGFuY2hvcjtcbiAgaWYgKGxMZW4gPCAweGYpIHtcbiAgICBkZXN0W2RpXSA9IGxMZW4gPDwgNDtcbiAgfSBlbHNlIHtcbiAgICBkZXN0W2RpXSA9IDB4ZjA7XG4gICAgaWYgKCsrZGkgPT09IGRuKSB7XG4gICAgICB0aHJvdyBlcnJTaG9ydEJ1ZmZlcjtcbiAgICB9XG4gICAgZm9yIChsTGVuIC09IDB4ZjsgbExlbiA+PSAweGZmOyBsTGVuIC09IDB4ZmYpIHtcbiAgICAgIGRlc3RbZGldID0gMHhmZjtcbiAgICAgIGlmICgrK2RpID09PSBkbikge1xuICAgICAgICB0aHJvdyBlcnJTaG9ydEJ1ZmZlcjtcbiAgICAgIH1cbiAgICB9XG4gICAgZGVzdFtkaV0gPSBsTGVuO1xuICB9XG4gIGlmICgrK2RpID09PSBkbikge1xuICAgIHRocm93IGVyclNob3J0QnVmZmVyO1xuICB9XG5cbiAgLy8gd3JpdGUgbGl0ZXJhbHNcbiAgY29uc3QgbGFzdExlbiA9IHNyYy5sZW5ndGggLSBhbmNob3I7XG4gIGNvbnN0IG4gPSBkaSArIGxhc3RMZW47XG4gIGlmIChuID4gZG4pIHtcbiAgICB0aHJvdyBlcnJTaG9ydEJ1ZmZlcjtcbiAgfSBlbHNlIGlmIChuID49IHNuKSB7XG4gICAgLy8gaW5jb21wcmVzc2libGVcbiAgICByZXR1cm4gMDtcbiAgfVxuICBjb3B5KGRlc3QsIHNyYywgZGksIGFuY2hvciwgbGFzdExlbik7XG4gIGRpICs9IGxhc3RMZW47XG4gIHJldHVybiBkaTtcbn1cbiJdfQ==
|