@kato-lee/utilities 1.0.0
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/LICENSE +21 -0
- package/README.md +9 -0
- package/_either.d.ts +12 -0
- package/_group-by-key.d.ts +6 -0
- package/_lodash.d.ts +71 -0
- package/_path.d.ts +1 -0
- package/esm2022/_either.mjs +49 -0
- package/esm2022/_group-by-key.mjs +19 -0
- package/esm2022/_lodash.mjs +91 -0
- package/esm2022/_path.mjs +17 -0
- package/esm2022/index.mjs +8 -0
- package/esm2022/js/_clone-deep.mjs +619 -0
- package/esm2022/js/_order-by.mjs +948 -0
- package/esm2022/kato-lee-utilities.mjs +5 -0
- package/fesm2022/kato-lee-utilities.mjs +1749 -0
- package/fesm2022/kato-lee-utilities.mjs.map +1 -0
- package/index.d.ts +4 -0
- package/js/_clone-deep.d.ts +2 -0
- package/js/_clone-deep.js +826 -0
- package/js/_order-by.d.ts +2 -0
- package/js/_order-by.js +1287 -0
- package/js/index.js +2 -0
- package/package.json +18 -0
|
@@ -0,0 +1,948 @@
|
|
|
1
|
+
let LARGE_ARRAY_SIZE = 200;
|
|
2
|
+
let FUNC_ERROR_TEXT = 'Expected a function';
|
|
3
|
+
let HASH_UNDEFINED = '__lodash_hash_undefined__';
|
|
4
|
+
let UNORDERED_COMPARE_FLAG = 1, PARTIAL_COMPARE_FLAG = 2;
|
|
5
|
+
let INFINITY = 1 / 0, MAX_SAFE_INTEGER = 9007199254740991;
|
|
6
|
+
let argsTag = '[object Arguments]', arrayTag = '[object Array]', boolTag = '[object Boolean]', dateTag = '[object Date]', errorTag = '[object Error]', funcTag = '[object Function]', genTag = '[object GeneratorFunction]', mapTag = '[object Map]', numberTag = '[object Number]', objectTag = '[object Object]', promiseTag = '[object Promise]', regexpTag = '[object RegExp]', setTag = '[object Set]', stringTag = '[object String]', symbolTag = '[object Symbol]', weakMapTag = '[object WeakMap]';
|
|
7
|
+
let arrayBufferTag = '[object ArrayBuffer]', dataViewTag = '[object DataView]', float32Tag = '[object Float32Array]', float64Tag = '[object Float64Array]', int8Tag = '[object Int8Array]', int16Tag = '[object Int16Array]', int32Tag = '[object Int32Array]', uint8Tag = '[object Uint8Array]', uint8ClampedTag = '[object Uint8ClampedArray]', uint16Tag = '[object Uint16Array]', uint32Tag = '[object Uint32Array]';
|
|
8
|
+
let reIsDeepProp = /\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/, reIsPlainProp = /^\w*$/, reLeadingDot = /^\./, rePropName = /[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g;
|
|
9
|
+
let reRegExpChar = /[\\^$.*+?()[\]{}|]/g;
|
|
10
|
+
let reEscapeChar = /\\(\\)?/g;
|
|
11
|
+
let reIsHostCtor = /^\[object .+?Constructor\]$/;
|
|
12
|
+
let reIsUint = /^(?:0|[1-9]\d*)$/;
|
|
13
|
+
let typedArrayTags = {};
|
|
14
|
+
typedArrayTags[float32Tag] =
|
|
15
|
+
typedArrayTags[float64Tag] =
|
|
16
|
+
typedArrayTags[int8Tag] =
|
|
17
|
+
typedArrayTags[int16Tag] =
|
|
18
|
+
typedArrayTags[int32Tag] =
|
|
19
|
+
typedArrayTags[uint8Tag] =
|
|
20
|
+
typedArrayTags[uint8ClampedTag] =
|
|
21
|
+
typedArrayTags[uint16Tag] =
|
|
22
|
+
typedArrayTags[uint32Tag] =
|
|
23
|
+
true;
|
|
24
|
+
typedArrayTags[argsTag] =
|
|
25
|
+
typedArrayTags[arrayTag] =
|
|
26
|
+
typedArrayTags[arrayBufferTag] =
|
|
27
|
+
typedArrayTags[boolTag] =
|
|
28
|
+
typedArrayTags[dataViewTag] =
|
|
29
|
+
typedArrayTags[dateTag] =
|
|
30
|
+
typedArrayTags[errorTag] =
|
|
31
|
+
typedArrayTags[funcTag] =
|
|
32
|
+
typedArrayTags[mapTag] =
|
|
33
|
+
typedArrayTags[numberTag] =
|
|
34
|
+
typedArrayTags[objectTag] =
|
|
35
|
+
typedArrayTags[regexpTag] =
|
|
36
|
+
typedArrayTags[setTag] =
|
|
37
|
+
typedArrayTags[stringTag] =
|
|
38
|
+
typedArrayTags[weakMapTag] =
|
|
39
|
+
false;
|
|
40
|
+
let freeGlobal = typeof global == 'object' && global && global.Object === Object && global;
|
|
41
|
+
let freeSelf = typeof self == 'object' && self && self.Object === Object && self;
|
|
42
|
+
let root = freeGlobal || freeSelf || Function('return this')();
|
|
43
|
+
let freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;
|
|
44
|
+
let freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;
|
|
45
|
+
let moduleExports = freeModule && freeModule.exports === freeExports;
|
|
46
|
+
let freeProcess = moduleExports && freeGlobal.process;
|
|
47
|
+
let nodeUtil = (function () {
|
|
48
|
+
try {
|
|
49
|
+
return freeProcess && freeProcess.binding('util');
|
|
50
|
+
}
|
|
51
|
+
catch (e) { }
|
|
52
|
+
})();
|
|
53
|
+
let nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;
|
|
54
|
+
function arrayMap(array, iteratee) {
|
|
55
|
+
let index = -1, length = array ? array.length : 0, result = Array(length);
|
|
56
|
+
while (++index < length) {
|
|
57
|
+
result[index] = iteratee(array[index], index, array);
|
|
58
|
+
}
|
|
59
|
+
return result;
|
|
60
|
+
}
|
|
61
|
+
function arraySome(array, predicate) {
|
|
62
|
+
let index = -1, length = array ? array.length : 0;
|
|
63
|
+
while (++index < length) {
|
|
64
|
+
if (predicate(array[index], index, array)) {
|
|
65
|
+
return true;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
return false;
|
|
69
|
+
}
|
|
70
|
+
function baseProperty(key) {
|
|
71
|
+
return function (object) {
|
|
72
|
+
return object == null ? undefined : object[key];
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
function baseSortBy(array, comparer) {
|
|
76
|
+
let length = array.length;
|
|
77
|
+
array.sort(comparer);
|
|
78
|
+
while (length--) {
|
|
79
|
+
array[length] = array[length].value;
|
|
80
|
+
}
|
|
81
|
+
return array;
|
|
82
|
+
}
|
|
83
|
+
function baseTimes(n, iteratee) {
|
|
84
|
+
let index = -1, result = Array(n);
|
|
85
|
+
while (++index < n) {
|
|
86
|
+
result[index] = iteratee(index);
|
|
87
|
+
}
|
|
88
|
+
return result;
|
|
89
|
+
}
|
|
90
|
+
function baseUnary(func) {
|
|
91
|
+
return function (value) {
|
|
92
|
+
return func(value);
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
function getValue(object, key) {
|
|
96
|
+
return object == null ? undefined : object[key];
|
|
97
|
+
}
|
|
98
|
+
function isHostObject(value) {
|
|
99
|
+
let result = false;
|
|
100
|
+
if (value != null && typeof value.toString != 'function') {
|
|
101
|
+
try {
|
|
102
|
+
result = !!(value + '');
|
|
103
|
+
}
|
|
104
|
+
catch (e) { }
|
|
105
|
+
}
|
|
106
|
+
return result;
|
|
107
|
+
}
|
|
108
|
+
function mapToArray(map) {
|
|
109
|
+
let index = -1, result = Array(map.size);
|
|
110
|
+
map.forEach(function (value, key) {
|
|
111
|
+
result[++index] = [key, value];
|
|
112
|
+
});
|
|
113
|
+
return result;
|
|
114
|
+
}
|
|
115
|
+
function overArg(func, transform) {
|
|
116
|
+
return function (arg) {
|
|
117
|
+
return func(transform(arg));
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
function setToArray(set) {
|
|
121
|
+
let index = -1, result = Array(set.size);
|
|
122
|
+
set.forEach(function (value) {
|
|
123
|
+
result[++index] = value;
|
|
124
|
+
});
|
|
125
|
+
return result;
|
|
126
|
+
}
|
|
127
|
+
let arrayProto = Array.prototype, funcProto = Function.prototype, objectProto = Object.prototype;
|
|
128
|
+
let coreJsData = root['__core-js_shared__'];
|
|
129
|
+
let maskSrcKey = (function () {
|
|
130
|
+
let uid = /[^.]+$/.exec((coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO) || '');
|
|
131
|
+
return uid ? 'Symbol(src)_1.' + uid : '';
|
|
132
|
+
})();
|
|
133
|
+
let funcToString = funcProto.toString;
|
|
134
|
+
let hasOwnProperty = objectProto.hasOwnProperty;
|
|
135
|
+
let objectToString = objectProto.toString;
|
|
136
|
+
let reIsNative = RegExp('^' +
|
|
137
|
+
funcToString
|
|
138
|
+
.call(hasOwnProperty)
|
|
139
|
+
.replace(reRegExpChar, '\\$&')
|
|
140
|
+
.replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') +
|
|
141
|
+
'$');
|
|
142
|
+
let Symbol = root.Symbol, Uint8Array = root.Uint8Array, propertyIsEnumerable = objectProto.propertyIsEnumerable, splice = arrayProto.splice;
|
|
143
|
+
let nativeKeys = overArg(Object.keys, Object);
|
|
144
|
+
let DataView = getNative(root, 'DataView'), Map = getNative(root, 'Map'), Promise = getNative(root, 'Promise'), Set = getNative(root, 'Set'), WeakMap = getNative(root, 'WeakMap'), nativeCreate = getNative(Object, 'create');
|
|
145
|
+
let dataViewCtorString = toSource(DataView), mapCtorString = toSource(Map), promiseCtorString = toSource(Promise), setCtorString = toSource(Set), weakMapCtorString = toSource(WeakMap);
|
|
146
|
+
let symbolProto = Symbol ? Symbol.prototype : undefined, symbolValueOf = symbolProto ? symbolProto.valueOf : undefined, symbolToString = symbolProto ? symbolProto.toString : undefined;
|
|
147
|
+
function Hash(entries) {
|
|
148
|
+
let index = -1, length = entries ? entries.length : 0;
|
|
149
|
+
this.clear();
|
|
150
|
+
while (++index < length) {
|
|
151
|
+
let entry = entries[index];
|
|
152
|
+
this.set(entry[0], entry[1]);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
function hashClear() {
|
|
156
|
+
this.__data__ = nativeCreate ? nativeCreate(null) : {};
|
|
157
|
+
}
|
|
158
|
+
function hashDelete(key) {
|
|
159
|
+
return this.has(key) && delete this.__data__[key];
|
|
160
|
+
}
|
|
161
|
+
function hashGet(key) {
|
|
162
|
+
let data = this.__data__;
|
|
163
|
+
if (nativeCreate) {
|
|
164
|
+
let result = data[key];
|
|
165
|
+
return result === HASH_UNDEFINED ? undefined : result;
|
|
166
|
+
}
|
|
167
|
+
return hasOwnProperty.call(data, key) ? data[key] : undefined;
|
|
168
|
+
}
|
|
169
|
+
function hashHas(key) {
|
|
170
|
+
let data = this.__data__;
|
|
171
|
+
return nativeCreate ? data[key] !== undefined : hasOwnProperty.call(data, key);
|
|
172
|
+
}
|
|
173
|
+
function hashSet(key, value) {
|
|
174
|
+
let data = this.__data__;
|
|
175
|
+
data[key] = nativeCreate && value === undefined ? HASH_UNDEFINED : value;
|
|
176
|
+
return this;
|
|
177
|
+
}
|
|
178
|
+
Hash.prototype.clear = hashClear;
|
|
179
|
+
Hash.prototype['delete'] = hashDelete;
|
|
180
|
+
Hash.prototype.get = hashGet;
|
|
181
|
+
Hash.prototype.has = hashHas;
|
|
182
|
+
Hash.prototype.set = hashSet;
|
|
183
|
+
function ListCache(entries) {
|
|
184
|
+
let index = -1, length = entries ? entries.length : 0;
|
|
185
|
+
this.clear();
|
|
186
|
+
while (++index < length) {
|
|
187
|
+
let entry = entries[index];
|
|
188
|
+
this.set(entry[0], entry[1]);
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
function listCacheClear() {
|
|
192
|
+
this.__data__ = [];
|
|
193
|
+
}
|
|
194
|
+
function listCacheDelete(key) {
|
|
195
|
+
let data = this.__data__, index = assocIndexOf(data, key);
|
|
196
|
+
if (index < 0) {
|
|
197
|
+
return false;
|
|
198
|
+
}
|
|
199
|
+
let lastIndex = data.length - 1;
|
|
200
|
+
if (index == lastIndex) {
|
|
201
|
+
data.pop();
|
|
202
|
+
}
|
|
203
|
+
else {
|
|
204
|
+
splice.call(data, index, 1);
|
|
205
|
+
}
|
|
206
|
+
return true;
|
|
207
|
+
}
|
|
208
|
+
function listCacheGet(key) {
|
|
209
|
+
let data = this.__data__, index = assocIndexOf(data, key);
|
|
210
|
+
return index < 0 ? undefined : data[index][1];
|
|
211
|
+
}
|
|
212
|
+
function listCacheHas(key) {
|
|
213
|
+
return assocIndexOf(this.__data__, key) > -1;
|
|
214
|
+
}
|
|
215
|
+
function listCacheSet(key, value) {
|
|
216
|
+
let data = this.__data__, index = assocIndexOf(data, key);
|
|
217
|
+
if (index < 0) {
|
|
218
|
+
data.push([key, value]);
|
|
219
|
+
}
|
|
220
|
+
else {
|
|
221
|
+
data[index][1] = value;
|
|
222
|
+
}
|
|
223
|
+
return this;
|
|
224
|
+
}
|
|
225
|
+
ListCache.prototype.clear = listCacheClear;
|
|
226
|
+
ListCache.prototype['delete'] = listCacheDelete;
|
|
227
|
+
ListCache.prototype.get = listCacheGet;
|
|
228
|
+
ListCache.prototype.has = listCacheHas;
|
|
229
|
+
ListCache.prototype.set = listCacheSet;
|
|
230
|
+
function MapCache(entries) {
|
|
231
|
+
let index = -1, length = entries ? entries.length : 0;
|
|
232
|
+
this.clear();
|
|
233
|
+
while (++index < length) {
|
|
234
|
+
let entry = entries[index];
|
|
235
|
+
this.set(entry[0], entry[1]);
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
function mapCacheClear() {
|
|
239
|
+
this.__data__ = {
|
|
240
|
+
hash: new Hash(),
|
|
241
|
+
map: new (Map || ListCache)(),
|
|
242
|
+
string: new Hash(),
|
|
243
|
+
};
|
|
244
|
+
}
|
|
245
|
+
function mapCacheDelete(key) {
|
|
246
|
+
return getMapData(this, key)['delete'](key);
|
|
247
|
+
}
|
|
248
|
+
function mapCacheGet(key) {
|
|
249
|
+
return getMapData(this, key).get(key);
|
|
250
|
+
}
|
|
251
|
+
function mapCacheHas(key) {
|
|
252
|
+
return getMapData(this, key).has(key);
|
|
253
|
+
}
|
|
254
|
+
function mapCacheSet(key, value) {
|
|
255
|
+
getMapData(this, key).set(key, value);
|
|
256
|
+
return this;
|
|
257
|
+
}
|
|
258
|
+
MapCache.prototype.clear = mapCacheClear;
|
|
259
|
+
MapCache.prototype['delete'] = mapCacheDelete;
|
|
260
|
+
MapCache.prototype.get = mapCacheGet;
|
|
261
|
+
MapCache.prototype.has = mapCacheHas;
|
|
262
|
+
MapCache.prototype.set = mapCacheSet;
|
|
263
|
+
function SetCache(values) {
|
|
264
|
+
let index = -1, length = values ? values.length : 0;
|
|
265
|
+
this.__data__ = new MapCache();
|
|
266
|
+
while (++index < length) {
|
|
267
|
+
this.add(values[index]);
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
function setCacheAdd(value) {
|
|
271
|
+
this.__data__.set(value, HASH_UNDEFINED);
|
|
272
|
+
return this;
|
|
273
|
+
}
|
|
274
|
+
function setCacheHas(value) {
|
|
275
|
+
return this.__data__.has(value);
|
|
276
|
+
}
|
|
277
|
+
SetCache.prototype.add = SetCache.prototype.push = setCacheAdd;
|
|
278
|
+
SetCache.prototype.has = setCacheHas;
|
|
279
|
+
function Stack(entries) {
|
|
280
|
+
this.__data__ = new ListCache(entries);
|
|
281
|
+
}
|
|
282
|
+
function stackClear() {
|
|
283
|
+
this.__data__ = new ListCache();
|
|
284
|
+
}
|
|
285
|
+
function stackDelete(key) {
|
|
286
|
+
return this.__data__['delete'](key);
|
|
287
|
+
}
|
|
288
|
+
function stackGet(key) {
|
|
289
|
+
return this.__data__.get(key);
|
|
290
|
+
}
|
|
291
|
+
function stackHas(key) {
|
|
292
|
+
return this.__data__.has(key);
|
|
293
|
+
}
|
|
294
|
+
function stackSet(key, value) {
|
|
295
|
+
let cache = this.__data__;
|
|
296
|
+
if (cache instanceof ListCache) {
|
|
297
|
+
let pairs = cache.__data__;
|
|
298
|
+
if (!Map || pairs.length < LARGE_ARRAY_SIZE - 1) {
|
|
299
|
+
pairs.push([key, value]);
|
|
300
|
+
return this;
|
|
301
|
+
}
|
|
302
|
+
cache = this.__data__ = new MapCache(pairs);
|
|
303
|
+
}
|
|
304
|
+
cache.set(key, value);
|
|
305
|
+
return this;
|
|
306
|
+
}
|
|
307
|
+
Stack.prototype.clear = stackClear;
|
|
308
|
+
Stack.prototype['delete'] = stackDelete;
|
|
309
|
+
Stack.prototype.get = stackGet;
|
|
310
|
+
Stack.prototype.has = stackHas;
|
|
311
|
+
Stack.prototype.set = stackSet;
|
|
312
|
+
function arrayLikeKeys(value, inherited) {
|
|
313
|
+
let result = isArray(value) || isArguments(value) ? baseTimes(value.length, String) : [];
|
|
314
|
+
let length = result.length, skipIndexes = !!length;
|
|
315
|
+
for (let key in value) {
|
|
316
|
+
if ((inherited || hasOwnProperty.call(value, key)) &&
|
|
317
|
+
!(skipIndexes && (key == 'length' || isIndex(key, length)))) {
|
|
318
|
+
result.push(key);
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
return result;
|
|
322
|
+
}
|
|
323
|
+
function assocIndexOf(array, key) {
|
|
324
|
+
let length = array.length;
|
|
325
|
+
while (length--) {
|
|
326
|
+
if (eq(array[length][0], key)) {
|
|
327
|
+
return length;
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
return -1;
|
|
331
|
+
}
|
|
332
|
+
let baseEach = createBaseEach(baseForOwn);
|
|
333
|
+
let baseFor = createBaseFor();
|
|
334
|
+
function baseForOwn(object, iteratee) {
|
|
335
|
+
return object && baseFor(object, iteratee, keys);
|
|
336
|
+
}
|
|
337
|
+
function baseGet(object, path) {
|
|
338
|
+
path = isKey(path, object) ? [path] : castPath(path);
|
|
339
|
+
let index = 0, length = path.length;
|
|
340
|
+
while (object != null && index < length) {
|
|
341
|
+
object = object[toKey(path[index++])];
|
|
342
|
+
}
|
|
343
|
+
return index && index == length ? object : undefined;
|
|
344
|
+
}
|
|
345
|
+
function baseGetTag(value) {
|
|
346
|
+
return objectToString.call(value);
|
|
347
|
+
}
|
|
348
|
+
function baseHasIn(object, key) {
|
|
349
|
+
return object != null && key in Object(object);
|
|
350
|
+
}
|
|
351
|
+
function baseIsEqual(value, other, customizer, bitmask, stack) {
|
|
352
|
+
if (value === other) {
|
|
353
|
+
return true;
|
|
354
|
+
}
|
|
355
|
+
if (value == null || other == null || (!isObject(value) && !isObjectLike(other))) {
|
|
356
|
+
return value !== value && other !== other;
|
|
357
|
+
}
|
|
358
|
+
return baseIsEqualDeep(value, other, baseIsEqual, customizer, bitmask, stack);
|
|
359
|
+
}
|
|
360
|
+
function baseIsEqualDeep(object, other, equalFunc, customizer, bitmask, stack) {
|
|
361
|
+
let objIsArr = isArray(object), othIsArr = isArray(other), objTag = arrayTag, othTag = arrayTag;
|
|
362
|
+
if (!objIsArr) {
|
|
363
|
+
objTag = getTag(object);
|
|
364
|
+
objTag = objTag == argsTag ? objectTag : objTag;
|
|
365
|
+
}
|
|
366
|
+
if (!othIsArr) {
|
|
367
|
+
othTag = getTag(other);
|
|
368
|
+
othTag = othTag == argsTag ? objectTag : othTag;
|
|
369
|
+
}
|
|
370
|
+
let objIsObj = objTag == objectTag && !isHostObject(object), othIsObj = othTag == objectTag && !isHostObject(other), isSameTag = objTag == othTag;
|
|
371
|
+
if (isSameTag && !objIsObj) {
|
|
372
|
+
stack || (stack = new Stack());
|
|
373
|
+
return objIsArr || isTypedArray(object)
|
|
374
|
+
? equalArrays(object, other, equalFunc, customizer, bitmask, stack)
|
|
375
|
+
: equalByTag(object, other, objTag, equalFunc, customizer, bitmask, stack);
|
|
376
|
+
}
|
|
377
|
+
if (!(bitmask & PARTIAL_COMPARE_FLAG)) {
|
|
378
|
+
let objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'), othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');
|
|
379
|
+
if (objIsWrapped || othIsWrapped) {
|
|
380
|
+
let objUnwrapped = objIsWrapped ? object.value() : object, othUnwrapped = othIsWrapped ? other.value() : other;
|
|
381
|
+
stack || (stack = new Stack());
|
|
382
|
+
return equalFunc(objUnwrapped, othUnwrapped, customizer, bitmask, stack);
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
if (!isSameTag) {
|
|
386
|
+
return false;
|
|
387
|
+
}
|
|
388
|
+
stack || (stack = new Stack());
|
|
389
|
+
return equalObjects(object, other, equalFunc, customizer, bitmask, stack);
|
|
390
|
+
}
|
|
391
|
+
function baseIsMatch(object, source, matchData, customizer) {
|
|
392
|
+
let index = matchData.length, length = index, noCustomizer = !customizer;
|
|
393
|
+
if (object == null) {
|
|
394
|
+
return !length;
|
|
395
|
+
}
|
|
396
|
+
object = Object(object);
|
|
397
|
+
while (index--) {
|
|
398
|
+
let data = matchData[index];
|
|
399
|
+
if (noCustomizer && data[2] ? data[1] !== object[data[0]] : !(data[0] in object)) {
|
|
400
|
+
return false;
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
while (++index < length) {
|
|
404
|
+
data = matchData[index];
|
|
405
|
+
let key = data[0], objValue = object[key], srcValue = data[1];
|
|
406
|
+
if (noCustomizer && data[2]) {
|
|
407
|
+
if (objValue === undefined && !(key in object)) {
|
|
408
|
+
return false;
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
else {
|
|
412
|
+
let stack = new Stack();
|
|
413
|
+
if (customizer) {
|
|
414
|
+
let result = customizer(objValue, srcValue, key, object, source, stack);
|
|
415
|
+
}
|
|
416
|
+
if (!(result === undefined
|
|
417
|
+
? baseIsEqual(srcValue, objValue, customizer, UNORDERED_COMPARE_FLAG | PARTIAL_COMPARE_FLAG, stack)
|
|
418
|
+
: result)) {
|
|
419
|
+
return false;
|
|
420
|
+
}
|
|
421
|
+
}
|
|
422
|
+
}
|
|
423
|
+
return true;
|
|
424
|
+
}
|
|
425
|
+
function baseIsNative(value) {
|
|
426
|
+
if (!isObject(value) || isMasked(value)) {
|
|
427
|
+
return false;
|
|
428
|
+
}
|
|
429
|
+
let pattern = isFunction(value) || isHostObject(value) ? reIsNative : reIsHostCtor;
|
|
430
|
+
return pattern.test(toSource(value));
|
|
431
|
+
}
|
|
432
|
+
function baseIsTypedArray(value) {
|
|
433
|
+
return (isObjectLike(value) && isLength(value.length) && !!typedArrayTags[objectToString.call(value)]);
|
|
434
|
+
}
|
|
435
|
+
function baseIteratee(value) {
|
|
436
|
+
if (typeof value == 'function') {
|
|
437
|
+
return value;
|
|
438
|
+
}
|
|
439
|
+
if (value == null) {
|
|
440
|
+
return identity;
|
|
441
|
+
}
|
|
442
|
+
if (typeof value == 'object') {
|
|
443
|
+
return isArray(value) ? baseMatchesProperty(value[0], value[1]) : baseMatches(value);
|
|
444
|
+
}
|
|
445
|
+
return property(value);
|
|
446
|
+
}
|
|
447
|
+
function baseKeys(object) {
|
|
448
|
+
if (!isPrototype(object)) {
|
|
449
|
+
return nativeKeys(object);
|
|
450
|
+
}
|
|
451
|
+
let result = [];
|
|
452
|
+
for (let key in Object(object)) {
|
|
453
|
+
if (hasOwnProperty.call(object, key) && key != 'constructor') {
|
|
454
|
+
result.push(key);
|
|
455
|
+
}
|
|
456
|
+
}
|
|
457
|
+
return result;
|
|
458
|
+
}
|
|
459
|
+
function baseMap(collection, iteratee) {
|
|
460
|
+
let index = -1, result = isArrayLike(collection) ? Array(collection.length) : [];
|
|
461
|
+
baseEach(collection, function (value, key, collection) {
|
|
462
|
+
result[++index] = iteratee(value, key, collection);
|
|
463
|
+
});
|
|
464
|
+
return result;
|
|
465
|
+
}
|
|
466
|
+
function baseMatches(source) {
|
|
467
|
+
let matchData = getMatchData(source);
|
|
468
|
+
if (matchData.length == 1 && matchData[0][2]) {
|
|
469
|
+
return matchesStrictComparable(matchData[0][0], matchData[0][1]);
|
|
470
|
+
}
|
|
471
|
+
return function (object) {
|
|
472
|
+
return object === source || baseIsMatch(object, source, matchData);
|
|
473
|
+
};
|
|
474
|
+
}
|
|
475
|
+
function baseMatchesProperty(path, srcValue) {
|
|
476
|
+
if (isKey(path) && isStrictComparable(srcValue)) {
|
|
477
|
+
return matchesStrictComparable(toKey(path), srcValue);
|
|
478
|
+
}
|
|
479
|
+
return function (object) {
|
|
480
|
+
let objValue = get(object, path);
|
|
481
|
+
return objValue === undefined && objValue === srcValue
|
|
482
|
+
? hasIn(object, path)
|
|
483
|
+
: baseIsEqual(srcValue, objValue, undefined, UNORDERED_COMPARE_FLAG | PARTIAL_COMPARE_FLAG);
|
|
484
|
+
};
|
|
485
|
+
}
|
|
486
|
+
function baseOrderBy(collection, iteratees, orders) {
|
|
487
|
+
let index = -1;
|
|
488
|
+
iteratees = arrayMap(iteratees.length ? iteratees : [identity], baseUnary(baseIteratee));
|
|
489
|
+
let result = baseMap(collection, function (value, key, collection) {
|
|
490
|
+
let criteria = arrayMap(iteratees, function (iteratee) {
|
|
491
|
+
return iteratee(value);
|
|
492
|
+
});
|
|
493
|
+
return { criteria: criteria, index: ++index, value: value };
|
|
494
|
+
});
|
|
495
|
+
return baseSortBy(result, function (object, other) {
|
|
496
|
+
return compareMultiple(object, other, orders);
|
|
497
|
+
});
|
|
498
|
+
}
|
|
499
|
+
function basePropertyDeep(path) {
|
|
500
|
+
return function (object) {
|
|
501
|
+
return baseGet(object, path);
|
|
502
|
+
};
|
|
503
|
+
}
|
|
504
|
+
function baseToString(value) {
|
|
505
|
+
if (typeof value == 'string') {
|
|
506
|
+
return value;
|
|
507
|
+
}
|
|
508
|
+
if (isSymbol(value)) {
|
|
509
|
+
return symbolToString ? symbolToString.call(value) : '';
|
|
510
|
+
}
|
|
511
|
+
let result = value + '';
|
|
512
|
+
return result == '0' && 1 / value == -INFINITY ? '-0' : result;
|
|
513
|
+
}
|
|
514
|
+
function castPath(value) {
|
|
515
|
+
return isArray(value) ? value : stringToPath(value);
|
|
516
|
+
}
|
|
517
|
+
function compareAscending(value, other) {
|
|
518
|
+
if (value !== other) {
|
|
519
|
+
let valIsDefined = value !== undefined, valIsNull = value === null, valIsReflexive = value === value, valIsSymbol = isSymbol(value);
|
|
520
|
+
let othIsDefined = other !== undefined, othIsNull = other === null, othIsReflexive = other === other, othIsSymbol = isSymbol(other);
|
|
521
|
+
if ((!othIsNull && !othIsSymbol && !valIsSymbol && value > other) ||
|
|
522
|
+
(valIsSymbol && othIsDefined && othIsReflexive && !othIsNull && !othIsSymbol) ||
|
|
523
|
+
(valIsNull && othIsDefined && othIsReflexive) ||
|
|
524
|
+
(!valIsDefined && othIsReflexive) ||
|
|
525
|
+
!valIsReflexive) {
|
|
526
|
+
return 1;
|
|
527
|
+
}
|
|
528
|
+
if ((!valIsNull && !valIsSymbol && !othIsSymbol && value < other) ||
|
|
529
|
+
(othIsSymbol && valIsDefined && valIsReflexive && !valIsNull && !valIsSymbol) ||
|
|
530
|
+
(othIsNull && valIsDefined && valIsReflexive) ||
|
|
531
|
+
(!othIsDefined && valIsReflexive) ||
|
|
532
|
+
!othIsReflexive) {
|
|
533
|
+
return -1;
|
|
534
|
+
}
|
|
535
|
+
}
|
|
536
|
+
return 0;
|
|
537
|
+
}
|
|
538
|
+
function compareMultiple(object, other, orders) {
|
|
539
|
+
let index = -1, objCriteria = object.criteria, othCriteria = other.criteria, length = objCriteria.length, ordersLength = orders.length;
|
|
540
|
+
while (++index < length) {
|
|
541
|
+
let result = compareAscending(objCriteria[index], othCriteria[index]);
|
|
542
|
+
if (result) {
|
|
543
|
+
if (index >= ordersLength) {
|
|
544
|
+
return result;
|
|
545
|
+
}
|
|
546
|
+
let order = orders[index];
|
|
547
|
+
return result * (order == 'desc' ? -1 : 1);
|
|
548
|
+
}
|
|
549
|
+
}
|
|
550
|
+
return object.index - other.index;
|
|
551
|
+
}
|
|
552
|
+
function createBaseEach(eachFunc, fromRight) {
|
|
553
|
+
return function (collection, iteratee) {
|
|
554
|
+
if (collection == null) {
|
|
555
|
+
return collection;
|
|
556
|
+
}
|
|
557
|
+
if (!isArrayLike(collection)) {
|
|
558
|
+
return eachFunc(collection, iteratee);
|
|
559
|
+
}
|
|
560
|
+
let length = collection.length;
|
|
561
|
+
let index = fromRight ? length : -1;
|
|
562
|
+
let iterable = Object(collection);
|
|
563
|
+
while (fromRight ? index-- : ++index < length) {
|
|
564
|
+
if (iteratee(iterable[index], index, iterable) === false) {
|
|
565
|
+
break;
|
|
566
|
+
}
|
|
567
|
+
}
|
|
568
|
+
return collection;
|
|
569
|
+
};
|
|
570
|
+
}
|
|
571
|
+
function createBaseFor(fromRight) {
|
|
572
|
+
return function (object, iteratee, keysFunc) {
|
|
573
|
+
let index = -1, iterable = Object(object), props = keysFunc(object), length = props.length;
|
|
574
|
+
while (length--) {
|
|
575
|
+
let key = props[fromRight ? length : ++index];
|
|
576
|
+
if (iteratee(iterable[key], key, iterable) === false) {
|
|
577
|
+
break;
|
|
578
|
+
}
|
|
579
|
+
}
|
|
580
|
+
return object;
|
|
581
|
+
};
|
|
582
|
+
}
|
|
583
|
+
function equalArrays(array, other, equalFunc, customizer, bitmask, stack) {
|
|
584
|
+
let isPartial = bitmask & PARTIAL_COMPARE_FLAG, arrLength = array.length, othLength = other.length;
|
|
585
|
+
if (arrLength != othLength && !(isPartial && othLength > arrLength)) {
|
|
586
|
+
return false;
|
|
587
|
+
}
|
|
588
|
+
let stacked = stack.get(array);
|
|
589
|
+
if (stacked && stack.get(other)) {
|
|
590
|
+
return stacked == other;
|
|
591
|
+
}
|
|
592
|
+
let index = -1, result = true, seen = bitmask & UNORDERED_COMPARE_FLAG ? new SetCache() : undefined;
|
|
593
|
+
stack.set(array, other);
|
|
594
|
+
stack.set(other, array);
|
|
595
|
+
while (++index < arrLength) {
|
|
596
|
+
let arrValue = array[index], othValue = other[index];
|
|
597
|
+
if (customizer) {
|
|
598
|
+
let compared = isPartial
|
|
599
|
+
? customizer(othValue, arrValue, index, other, array, stack)
|
|
600
|
+
: customizer(arrValue, othValue, index, array, other, stack);
|
|
601
|
+
}
|
|
602
|
+
if (compared !== undefined) {
|
|
603
|
+
if (compared) {
|
|
604
|
+
continue;
|
|
605
|
+
}
|
|
606
|
+
result = false;
|
|
607
|
+
break;
|
|
608
|
+
}
|
|
609
|
+
if (seen) {
|
|
610
|
+
if (!arraySome(other, function (othValue, othIndex) {
|
|
611
|
+
if (!seen.has(othIndex) &&
|
|
612
|
+
(arrValue === othValue || equalFunc(arrValue, othValue, customizer, bitmask, stack))) {
|
|
613
|
+
return seen.add(othIndex);
|
|
614
|
+
}
|
|
615
|
+
})) {
|
|
616
|
+
result = false;
|
|
617
|
+
break;
|
|
618
|
+
}
|
|
619
|
+
}
|
|
620
|
+
else if (!(arrValue === othValue || equalFunc(arrValue, othValue, customizer, bitmask, stack))) {
|
|
621
|
+
result = false;
|
|
622
|
+
break;
|
|
623
|
+
}
|
|
624
|
+
}
|
|
625
|
+
stack['delete'](array);
|
|
626
|
+
stack['delete'](other);
|
|
627
|
+
return result;
|
|
628
|
+
}
|
|
629
|
+
function equalByTag(object, other, tag, equalFunc, customizer, bitmask, stack) {
|
|
630
|
+
switch (tag) {
|
|
631
|
+
case dataViewTag:
|
|
632
|
+
if (object.byteLength != other.byteLength || object.byteOffset != other.byteOffset) {
|
|
633
|
+
return false;
|
|
634
|
+
}
|
|
635
|
+
object = object.buffer;
|
|
636
|
+
other = other.buffer;
|
|
637
|
+
case arrayBufferTag:
|
|
638
|
+
if (object.byteLength != other.byteLength ||
|
|
639
|
+
!equalFunc(new Uint8Array(object), new Uint8Array(other))) {
|
|
640
|
+
return false;
|
|
641
|
+
}
|
|
642
|
+
return true;
|
|
643
|
+
case boolTag:
|
|
644
|
+
case dateTag:
|
|
645
|
+
case numberTag:
|
|
646
|
+
return eq(+object, +other);
|
|
647
|
+
case errorTag:
|
|
648
|
+
return object.name == other.name && object.message == other.message;
|
|
649
|
+
case regexpTag:
|
|
650
|
+
case stringTag:
|
|
651
|
+
return object == other + '';
|
|
652
|
+
case mapTag:
|
|
653
|
+
let convert = mapToArray;
|
|
654
|
+
case setTag:
|
|
655
|
+
let isPartial = bitmask & PARTIAL_COMPARE_FLAG;
|
|
656
|
+
convert || (convert = setToArray);
|
|
657
|
+
if (object.size != other.size && !isPartial) {
|
|
658
|
+
return false;
|
|
659
|
+
}
|
|
660
|
+
let stacked = stack.get(object);
|
|
661
|
+
if (stacked) {
|
|
662
|
+
return stacked == other;
|
|
663
|
+
}
|
|
664
|
+
bitmask |= UNORDERED_COMPARE_FLAG;
|
|
665
|
+
stack.set(object, other);
|
|
666
|
+
let result = equalArrays(convert(object), convert(other), equalFunc, customizer, bitmask, stack);
|
|
667
|
+
stack['delete'](object);
|
|
668
|
+
return result;
|
|
669
|
+
case symbolTag:
|
|
670
|
+
if (symbolValueOf) {
|
|
671
|
+
return symbolValueOf.call(object) == symbolValueOf.call(other);
|
|
672
|
+
}
|
|
673
|
+
}
|
|
674
|
+
return false;
|
|
675
|
+
}
|
|
676
|
+
function equalObjects(object, other, equalFunc, customizer, bitmask, stack) {
|
|
677
|
+
let isPartial = bitmask & PARTIAL_COMPARE_FLAG, objProps = keys(object), objLength = objProps.length, othProps = keys(other), othLength = othProps.length;
|
|
678
|
+
if (objLength != othLength && !isPartial) {
|
|
679
|
+
return false;
|
|
680
|
+
}
|
|
681
|
+
let index = objLength;
|
|
682
|
+
while (index--) {
|
|
683
|
+
let key = objProps[index];
|
|
684
|
+
if (!(isPartial ? key in other : hasOwnProperty.call(other, key))) {
|
|
685
|
+
return false;
|
|
686
|
+
}
|
|
687
|
+
}
|
|
688
|
+
let stacked = stack.get(object);
|
|
689
|
+
if (stacked && stack.get(other)) {
|
|
690
|
+
return stacked == other;
|
|
691
|
+
}
|
|
692
|
+
let result = true;
|
|
693
|
+
stack.set(object, other);
|
|
694
|
+
stack.set(other, object);
|
|
695
|
+
let skipCtor = isPartial;
|
|
696
|
+
while (++index < objLength) {
|
|
697
|
+
key = objProps[index];
|
|
698
|
+
let objValue = object[key], othValue = other[key];
|
|
699
|
+
if (customizer) {
|
|
700
|
+
let compared = isPartial
|
|
701
|
+
? customizer(othValue, objValue, key, other, object, stack)
|
|
702
|
+
: customizer(objValue, othValue, key, object, other, stack);
|
|
703
|
+
}
|
|
704
|
+
if (!(compared === undefined
|
|
705
|
+
? objValue === othValue || equalFunc(objValue, othValue, customizer, bitmask, stack)
|
|
706
|
+
: compared)) {
|
|
707
|
+
result = false;
|
|
708
|
+
break;
|
|
709
|
+
}
|
|
710
|
+
skipCtor || (skipCtor = key == 'constructor');
|
|
711
|
+
}
|
|
712
|
+
if (result && !skipCtor) {
|
|
713
|
+
let objCtor = object.constructor, othCtor = other.constructor;
|
|
714
|
+
if (objCtor != othCtor &&
|
|
715
|
+
'constructor' in object &&
|
|
716
|
+
'constructor' in other &&
|
|
717
|
+
!(typeof objCtor == 'function' &&
|
|
718
|
+
objCtor instanceof objCtor &&
|
|
719
|
+
typeof othCtor == 'function' &&
|
|
720
|
+
othCtor instanceof othCtor)) {
|
|
721
|
+
result = false;
|
|
722
|
+
}
|
|
723
|
+
}
|
|
724
|
+
stack['delete'](object);
|
|
725
|
+
stack['delete'](other);
|
|
726
|
+
return result;
|
|
727
|
+
}
|
|
728
|
+
function getMapData(map, key) {
|
|
729
|
+
let data = map.__data__;
|
|
730
|
+
return isKeyable(key) ? data[typeof key == 'string' ? 'string' : 'hash'] : data.map;
|
|
731
|
+
}
|
|
732
|
+
function getMatchData(object) {
|
|
733
|
+
let result = keys(object), length = result.length;
|
|
734
|
+
while (length--) {
|
|
735
|
+
let key = result[length], value = object[key];
|
|
736
|
+
result[length] = [key, value, isStrictComparable(value)];
|
|
737
|
+
}
|
|
738
|
+
return result;
|
|
739
|
+
}
|
|
740
|
+
function getNative(object, key) {
|
|
741
|
+
let value = getValue(object, key);
|
|
742
|
+
return baseIsNative(value) ? value : undefined;
|
|
743
|
+
}
|
|
744
|
+
let getTag = baseGetTag;
|
|
745
|
+
if ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) ||
|
|
746
|
+
(Map && getTag(new Map()) != mapTag) ||
|
|
747
|
+
(Promise && getTag(Promise.resolve()) != promiseTag) ||
|
|
748
|
+
(Set && getTag(new Set()) != setTag) ||
|
|
749
|
+
(WeakMap && getTag(new WeakMap()) != weakMapTag)) {
|
|
750
|
+
getTag = function (value) {
|
|
751
|
+
let result = objectToString.call(value), Ctor = result == objectTag ? value.constructor : undefined, ctorString = Ctor ? toSource(Ctor) : undefined;
|
|
752
|
+
if (ctorString) {
|
|
753
|
+
switch (ctorString) {
|
|
754
|
+
case dataViewCtorString:
|
|
755
|
+
return dataViewTag;
|
|
756
|
+
case mapCtorString:
|
|
757
|
+
return mapTag;
|
|
758
|
+
case promiseCtorString:
|
|
759
|
+
return promiseTag;
|
|
760
|
+
case setCtorString:
|
|
761
|
+
return setTag;
|
|
762
|
+
case weakMapCtorString:
|
|
763
|
+
return weakMapTag;
|
|
764
|
+
}
|
|
765
|
+
}
|
|
766
|
+
return result;
|
|
767
|
+
};
|
|
768
|
+
}
|
|
769
|
+
function hasPath(object, path, hasFunc) {
|
|
770
|
+
path = isKey(path, object) ? [path] : castPath(path);
|
|
771
|
+
let result;
|
|
772
|
+
let index = -1;
|
|
773
|
+
let length = path.length;
|
|
774
|
+
while (++index < length) {
|
|
775
|
+
let key = toKey(path[index]);
|
|
776
|
+
if (!(result = object != null && hasFunc(object, key))) {
|
|
777
|
+
break;
|
|
778
|
+
}
|
|
779
|
+
object = object[key];
|
|
780
|
+
}
|
|
781
|
+
if (result) {
|
|
782
|
+
return result;
|
|
783
|
+
}
|
|
784
|
+
length = object ? object.length : 0;
|
|
785
|
+
return (!!length && isLength(length) && isIndex(key, length) && (isArray(object) || isArguments(object)));
|
|
786
|
+
}
|
|
787
|
+
function isIndex(value, length) {
|
|
788
|
+
length = length == null ? MAX_SAFE_INTEGER : length;
|
|
789
|
+
return (!!length &&
|
|
790
|
+
(typeof value == 'number' || reIsUint.test(value)) &&
|
|
791
|
+
value > -1 &&
|
|
792
|
+
value % 1 == 0 &&
|
|
793
|
+
value < length);
|
|
794
|
+
}
|
|
795
|
+
function isKey(value, object) {
|
|
796
|
+
if (isArray(value)) {
|
|
797
|
+
return false;
|
|
798
|
+
}
|
|
799
|
+
let type = typeof value;
|
|
800
|
+
if (type == 'number' ||
|
|
801
|
+
type == 'symbol' ||
|
|
802
|
+
type == 'boolean' ||
|
|
803
|
+
value == null ||
|
|
804
|
+
isSymbol(value)) {
|
|
805
|
+
return true;
|
|
806
|
+
}
|
|
807
|
+
return (reIsPlainProp.test(value) ||
|
|
808
|
+
!reIsDeepProp.test(value) ||
|
|
809
|
+
(object != null && value in Object(object)));
|
|
810
|
+
}
|
|
811
|
+
function isKeyable(value) {
|
|
812
|
+
let type = typeof value;
|
|
813
|
+
return type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean'
|
|
814
|
+
? value !== '__proto__'
|
|
815
|
+
: value === null;
|
|
816
|
+
}
|
|
817
|
+
function isMasked(func) {
|
|
818
|
+
return !!maskSrcKey && maskSrcKey in func;
|
|
819
|
+
}
|
|
820
|
+
function isPrototype(value) {
|
|
821
|
+
let Ctor = value && value.constructor, proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;
|
|
822
|
+
return value === proto;
|
|
823
|
+
}
|
|
824
|
+
function isStrictComparable(value) {
|
|
825
|
+
return value === value && !isObject(value);
|
|
826
|
+
}
|
|
827
|
+
function matchesStrictComparable(key, srcValue) {
|
|
828
|
+
return function (object) {
|
|
829
|
+
if (object == null) {
|
|
830
|
+
return false;
|
|
831
|
+
}
|
|
832
|
+
return object[key] === srcValue && (srcValue !== undefined || key in Object(object));
|
|
833
|
+
};
|
|
834
|
+
}
|
|
835
|
+
let stringToPath = memoize(function (string) {
|
|
836
|
+
string = toString(string);
|
|
837
|
+
let result = [];
|
|
838
|
+
if (reLeadingDot.test(string)) {
|
|
839
|
+
result.push('');
|
|
840
|
+
}
|
|
841
|
+
string.replace(rePropName, function (match, number, quote, string) {
|
|
842
|
+
result.push(quote ? string.replace(reEscapeChar, '$1') : number || match);
|
|
843
|
+
});
|
|
844
|
+
return result;
|
|
845
|
+
});
|
|
846
|
+
function toKey(value) {
|
|
847
|
+
if (typeof value == 'string' || isSymbol(value)) {
|
|
848
|
+
return value;
|
|
849
|
+
}
|
|
850
|
+
let result = value + '';
|
|
851
|
+
return result == '0' && 1 / value == -INFINITY ? '-0' : result;
|
|
852
|
+
}
|
|
853
|
+
function toSource(func) {
|
|
854
|
+
if (func != null) {
|
|
855
|
+
try {
|
|
856
|
+
return funcToString.call(func);
|
|
857
|
+
}
|
|
858
|
+
catch (e) { }
|
|
859
|
+
try {
|
|
860
|
+
return func + '';
|
|
861
|
+
}
|
|
862
|
+
catch (e) { }
|
|
863
|
+
}
|
|
864
|
+
return '';
|
|
865
|
+
}
|
|
866
|
+
function zxhiddenCustomOrderByByJeremyAshkenas(collection, iteratees, orders) {
|
|
867
|
+
if (collection == null) {
|
|
868
|
+
return [];
|
|
869
|
+
}
|
|
870
|
+
if (!isArray(iteratees)) {
|
|
871
|
+
iteratees = iteratees == null ? [] : [iteratees];
|
|
872
|
+
}
|
|
873
|
+
if (!isArray(orders)) {
|
|
874
|
+
orders = orders == null ? [] : [orders];
|
|
875
|
+
}
|
|
876
|
+
return baseOrderBy(collection, iteratees, orders);
|
|
877
|
+
}
|
|
878
|
+
function memoize(func, resolver) {
|
|
879
|
+
if (typeof func != 'function' || (resolver && typeof resolver != 'function')) {
|
|
880
|
+
throw new TypeError(FUNC_ERROR_TEXT);
|
|
881
|
+
}
|
|
882
|
+
let memoized = function () {
|
|
883
|
+
let args = arguments, key = resolver ? resolver.apply(this, args) : args[0], cache = memoized.cache;
|
|
884
|
+
if (cache.has(key)) {
|
|
885
|
+
return cache.get(key);
|
|
886
|
+
}
|
|
887
|
+
let result = func.apply(this, args);
|
|
888
|
+
memoized.cache = cache.set(key, result);
|
|
889
|
+
return result;
|
|
890
|
+
};
|
|
891
|
+
memoized.cache = new (memoize.Cache || MapCache)();
|
|
892
|
+
return memoized;
|
|
893
|
+
}
|
|
894
|
+
memoize.Cache = MapCache;
|
|
895
|
+
function eq(value, other) {
|
|
896
|
+
return value === other || (value !== value && other !== other);
|
|
897
|
+
}
|
|
898
|
+
function isArguments(value) {
|
|
899
|
+
return (isArrayLikeObject(value) &&
|
|
900
|
+
hasOwnProperty.call(value, 'callee') &&
|
|
901
|
+
(!propertyIsEnumerable.call(value, 'callee') || objectToString.call(value) == argsTag));
|
|
902
|
+
}
|
|
903
|
+
let isArray = Array.isArray;
|
|
904
|
+
function isArrayLike(value) {
|
|
905
|
+
return value != null && isLength(value.length) && !isFunction(value);
|
|
906
|
+
}
|
|
907
|
+
function isArrayLikeObject(value) {
|
|
908
|
+
return isObjectLike(value) && isArrayLike(value);
|
|
909
|
+
}
|
|
910
|
+
function isFunction(value) {
|
|
911
|
+
let tag = isObject(value) ? objectToString.call(value) : '';
|
|
912
|
+
return tag == funcTag || tag == genTag;
|
|
913
|
+
}
|
|
914
|
+
function isLength(value) {
|
|
915
|
+
return typeof value == 'number' && value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;
|
|
916
|
+
}
|
|
917
|
+
function isObject(value) {
|
|
918
|
+
let type = typeof value;
|
|
919
|
+
return !!value && (type == 'object' || type == 'function');
|
|
920
|
+
}
|
|
921
|
+
function isObjectLike(value) {
|
|
922
|
+
return !!value && typeof value == 'object';
|
|
923
|
+
}
|
|
924
|
+
function isSymbol(value) {
|
|
925
|
+
return (typeof value == 'symbol' || (isObjectLike(value) && objectToString.call(value) == symbolTag));
|
|
926
|
+
}
|
|
927
|
+
let isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;
|
|
928
|
+
function toString(value) {
|
|
929
|
+
return value == null ? '' : baseToString(value);
|
|
930
|
+
}
|
|
931
|
+
function get(object, path, defaultValue) {
|
|
932
|
+
let result = object == null ? undefined : baseGet(object, path);
|
|
933
|
+
return result === undefined ? defaultValue : result;
|
|
934
|
+
}
|
|
935
|
+
function hasIn(object, path) {
|
|
936
|
+
return object != null && hasPath(object, path, baseHasIn);
|
|
937
|
+
}
|
|
938
|
+
function keys(object) {
|
|
939
|
+
return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);
|
|
940
|
+
}
|
|
941
|
+
function identity(value) {
|
|
942
|
+
return value;
|
|
943
|
+
}
|
|
944
|
+
function property(path) {
|
|
945
|
+
return isKey(path) ? baseProperty(toKey(path)) : basePropertyDeep(path);
|
|
946
|
+
}
|
|
947
|
+
export default zxhiddenCustomOrderByByJeremyAshkenas;
|
|
948
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiX29yZGVyLWJ5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vbGlicmFyaWVzL3V0aWxpdGllcy9qcy9fb3JkZXItYnkuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsSUFBSSxnQkFBZ0IsR0FBRyxHQUFHLENBQUM7QUFDM0IsSUFBSSxlQUFlLEdBQUcscUJBQXFCLENBQUM7QUFDNUMsSUFBSSxjQUFjLEdBQUcsMkJBQTJCLENBQUM7QUFDakQsSUFBSSxzQkFBc0IsR0FBRyxDQUFDLEVBQzVCLG9CQUFvQixHQUFHLENBQUMsQ0FBQztBQUMzQixJQUFJLFFBQVEsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUNsQixnQkFBZ0IsR0FBRyxnQkFBZ0IsQ0FBQztBQUV0QyxJQUFJLE9BQU8sR0FBRyxvQkFBb0IsRUFDaEMsUUFBUSxHQUFHLGdCQUFnQixFQUMzQixPQUFPLEdBQUcsa0JBQWtCLEVBQzVCLE9BQU8sR0FBRyxlQUFlLEVBQ3pCLFFBQVEsR0FBRyxnQkFBZ0IsRUFDM0IsT0FBTyxHQUFHLG1CQUFtQixFQUM3QixNQUFNLEdBQUcsNEJBQTRCLEVBQ3JDLE1BQU0sR0FBRyxjQUFjLEVBQ3ZCLFNBQVMsR0FBRyxpQkFBaUIsRUFDN0IsU0FBUyxHQUFHLGlCQUFpQixFQUM3QixVQUFVLEdBQUcsa0JBQWtCLEVBQy9CLFNBQVMsR0FBRyxpQkFBaUIsRUFDN0IsTUFBTSxHQUFHLGNBQWMsRUFDdkIsU0FBUyxHQUFHLGlCQUFpQixFQUM3QixTQUFTLEdBQUcsaUJBQWlCLEVBQzdCLFVBQVUsR0FBRyxrQkFBa0IsQ0FBQztBQUVsQyxJQUFJLGNBQWMsR0FBRyxzQkFBc0IsRUFDekMsV0FBVyxHQUFHLG1CQUFtQixFQUNqQyxVQUFVLEdBQUcsdUJBQXVCLEVBQ3BDLFVBQVUsR0FBRyx1QkFBdUIsRUFDcEMsT0FBTyxHQUFHLG9CQUFvQixFQUM5QixRQUFRLEdBQUcscUJBQXFCLEVBQ2hDLFFBQVEsR0FBRyxxQkFBcUIsRUFDaEMs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QUFhLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUN4RSxDQUFDO0FBRUQsU0FBUyxRQUFRLENBQUMsS0FBSztJQUNyQixPQUFPLEtBQUssQ0FBQztBQUNmLENBQUM7QUFFRCxTQUFTLFFBQVEsQ0FBQyxJQUFJO0lBQ3BCLE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDO0FBQzFFLENBQUM7QUFFRCxlQUFlLHFDQUFxQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsibGV0IExBUkdFX0FSUkFZX1NJWkUgPSAyMDA7XHJcbmxldCBGVU5DX0VSUk9SX1RFWFQgPSAnRXhwZWN0ZWQgYSBmdW5jdGlvbic7XHJcbmxldCBIQVNIX1VOREVGSU5FRCA9ICdfX2xvZGFzaF9oYXNoX3VuZGVmaW5lZF9fJztcclxubGV0IFVOT1JERVJFRF9DT01QQVJFX0ZMQUcgPSAxLFxyXG4gIFBBUlRJQUxfQ09NUEFSRV9GTEFHID0gMjtcclxubGV0IElORklOSVRZID0gMSAvIDAsXHJcbiAgTUFYX1NBRkVfSU5URUdFUiA9IDkwMDcxOTkyNTQ3NDA5OTE7XHJcblxyXG5sZXQgYXJnc1RhZyA9ICdbb2JqZWN0IEFyZ3VtZW50c10nLFxyXG4gIGFycmF5VGFnID0gJ1tvYmplY3QgQXJyYXldJyxcclxuICBib29sVGFnID0gJ1tvYmplY3QgQm9vbGVhbl0nLFxyXG4gIGRhdGVUYWcgPSAnW29iamVjdCBEYXRlXScsXHJcbiAgZXJyb3JUYWcgPSAnW29iamVjdCBFcnJvcl0nLFxyXG4gIGZ1bmNUYWcgPSAnW29iamVjdCBGdW5jdGlvbl0nLFxyXG4gIGdlblRhZyA9ICdbb2JqZWN0IEdlbmVyYXRvckZ1bmN0aW9uXScsXHJcbiAgbWFwVGFnID0gJ1tvYmplY3QgTWFwXScsXHJcbiAgbnVtYmVyVGFnID0gJ1tvYmplY3QgTnVtYmVyXScsXHJcbiAgb2JqZWN0VGFnID0gJ1tvYmplY3QgT2JqZWN0XScsXHJcbiAgcHJvbWlzZVRhZyA9ICdbb2JqZWN0IFByb21pc2VdJyxcclxuICByZWdleHBUYWcgPSAnW29iamVjdCBSZWdFeHBdJyxcclxuICBzZXRUYWcgPSAnW29iamVjdCBTZXRdJyxcclxuICBzdHJpbmdUYWcgPSAnW29iamVjdCBTdHJpbmddJyxcclxuICBzeW1ib2xUYWcgPSAnW29iamVjdCBTeW1ib2xdJyxcclxuICB3ZWFrTWFwVGFnID0gJ1tvYmplY3QgV2Vha01hcF0nO1xyXG5cclxubGV0IGFycmF5QnVmZmVyVGFnID0gJ1tvYmplY3QgQXJyYXlCdWZmZXJdJyxcclxuICBkYXRhVmlld1RhZyA9ICdbb2JqZWN0IERhdGFWaWV3XScsXHJcbiAgZmxvYXQzMlRhZyA9ICdbb2JqZWN0IEZsb2F0MzJBcnJheV0nLFxyXG4gIGZsb2F0NjRUYWcgPSAnW29iamVjdCBGbG9hdDY0QXJyYXldJyxcclxuICBpbnQ4VGFnID0gJ1tvYmplY3QgSW50OEFycmF5XScsXHJcbiAgaW50MTZUYWcgPSAnW29iamVjdCBJbnQxNkFycmF5XScsXHJcbiAgaW50MzJUYWcgPSAnW29iamVjdCBJbnQzMkFycmF5XScsXHJcbiAgdWludDhUYWcgPSAnW29iamVjdCBVaW50OEFycmF5XScsXHJcbiAgdWludDhDbGFtcGVkVGFnID0gJ1tvYmplY3QgVWludDhDbGFtcGVkQXJyYXldJyxcclxuICB1aW50MTZUYWcgPSAnW29iamVjdCBVaW50MTZBcnJheV0nLFxyXG4gIHVpbnQzMlRhZyA9ICdbb2JqZWN0IFVpbnQzMkFycmF5XSc7XHJcblxyXG5sZXQgcmVJc0RlZXBQcm9wID0gL1xcLnxcXFsoPzpbXltcXF1dKnwoW1wiJ10pKD86KD8hXFwxKVteXFxcXF18XFxcXC4pKj9cXDEpXFxdLyxcclxuICByZUlzUGxhaW5Qcm9wID0gL15cXHcqJC8sXHJcbiAgcmVMZWFkaW5nRG90ID0gL15cXC4vLFxyXG4gIHJlUHJvcE5hbWUgPVxyXG4gICAgL1teLltcXF1dK3xcXFsoPzooLT9cXGQrKD86XFwuXFxkKyk/KXwoW1wiJ10pKCg/Oig/IVxcMilbXlxcXFxdfFxcXFwuKSo/KVxcMilcXF18KD89KD86XFwufFxcW1xcXSkoPzpcXC58XFxbXFxdfCQpKS9nO1xyXG5cclxubGV0IHJlUmVnRXhwQ2hhciA9IC9bXFxcXF4kLiorPygpW1xcXXt9fF0vZztcclxubGV0IHJlRXNjYXBlQ2hhciA9IC9cXFxcKFxcXFwpPy9nO1xyXG5sZXQgcmVJc0hvc3RDdG9yID0gL15cXFtvYmplY3QgLis/Q29uc3RydWN0b3JcXF0kLztcclxubGV0IHJlSXNVaW50ID0gL14oPzowfFsxLTldXFxkKikkLztcclxuXHJcbmxldCB0eXBlZEFycmF5VGFncyA9IHt9O1xyXG50eXBlZEFycmF5VGFnc1tmbG9hdDMyVGFnXSA9XHJcbiAgdHlwZWRBcnJheVRhZ3NbZmxvYXQ2NFRhZ10gPVxyXG4gIHR5cGVkQXJyYXlUYWdzW2ludDhUYWddID1cclxuICB0eXBlZEFycmF5VGFnc1tpbnQxNlRhZ10gPVxyXG4gIHR5cGVkQXJyYXlUYWdzW2ludDMyVGFnXSA9XHJcbiAgdHlwZWRBcnJheVRhZ3NbdWludDhUYWddID1cclxuICB0eXBlZEFycmF5VGFnc1t1aW50OENsYW1wZWRUYWddID1cclxuICB0eXBlZEFycmF5VGFnc1t1aW50MTZUYWddID1cclxuICB0eXBlZEFycmF5VGFnc1t1aW50MzJUYWddID1cclxuICAgIHRydWU7XHJcbnR5cGVkQXJyYXlUYWdzW2FyZ3NUYWddID1cclxuICB0eXBlZEFycmF5VGFnc1thcnJheVRhZ10gPVxyXG4gIHR5cGVkQXJyYXlUYWdzW2FycmF5QnVmZmVyVGFnXSA9XHJcbiAgdHlwZWRBcnJheVRhZ3NbYm9vbFRhZ10gPVxyXG4gIHR5cGVkQXJyYXlUYWdzW2RhdGFWaWV3VGFnXSA9XHJcbiAgdHlwZWRBcnJheVRhZ3NbZGF0ZVRhZ10gPVxyXG4gIHR5cGVkQXJyYXlUYWdzW2Vycm9yVGFnXSA9XHJcbiAgdHlwZWRBcnJheVRhZ3NbZnVuY1RhZ10gPVxyXG4gIHR5cGVkQXJyYXlUYWdzW21hcFRhZ10gPVxyXG4gIHR5cGVkQXJyYXlUYWdzW251bWJlclRhZ10gPVxyXG4gIHR5cGVkQXJyYXlUYWdzW29iamVjdFRhZ10gPVxyXG4gIHR5cGVkQXJyYXlUYWdzW3JlZ2V4cFRhZ10gPVxyXG4gIHR5cGVkQXJyYXlUYWdzW3NldFRhZ10gPVxyXG4gIHR5cGVkQXJyYXlUYWdzW3N0cmluZ1RhZ10gPVxyXG4gIHR5cGVkQXJyYXlUYWdzW3dlYWtNYXBUYWddID1cclxuICAgIGZhbHNlO1xyXG5cclxubGV0IGZyZWVHbG9iYWwgPSB0eXBlb2YgZ2xvYmFsID09ICdvYmplY3QnICYmIGdsb2JhbCAmJiBnbG9iYWwuT2JqZWN0ID09PSBPYmplY3QgJiYgZ2xvYmFsO1xyXG5sZXQgZnJlZVNlbGYgPSB0eXBlb2Ygc2VsZiA9PSAnb2JqZWN0JyAmJiBzZWxmICYmIHNlbGYuT2JqZWN0ID09PSBPYmplY3QgJiYgc2VsZjtcclxubGV0IHJvb3QgPSBmcmVlR2xvYmFsIHx8IGZyZWVTZWxmIHx8IEZ1bmN0aW9uKCdyZXR1cm4gdGhpcycpKCk7XHJcbmxldCBmcmVlRXhwb3J0cyA9IHR5cGVvZiBleHBvcnRzID09ICdvYmplY3QnICYmIGV4cG9ydHMgJiYgIWV4cG9ydHMubm9kZVR5cGUgJiYgZXhwb3J0cztcclxubGV0IGZyZWVNb2R1bGUgPSBmcmVlRXhwb3J0cyAmJiB0eXBlb2YgbW9kdWxlID09ICdvYmplY3QnICYmIG1vZHVsZSAmJiAhbW9kdWxlLm5vZGVUeXBlICYmIG1vZHVsZTtcclxubGV0IG1vZHVsZUV4cG9ydHMgPSBmcmVlTW9kdWxlICYmIGZyZWVNb2R1bGUuZXhwb3J0cyA9PT0gZnJlZUV4cG9ydHM7XHJcbmxldCBmcmVlUHJvY2VzcyA9IG1vZHVsZUV4cG9ydHMgJiYgZnJlZUdsb2JhbC5wcm9jZXNzO1xyXG5cclxubGV0IG5vZGVVdGlsID0gKGZ1bmN0aW9uICgpIHtcclxuICB0cnkge1xyXG4gICAgcmV0dXJuIGZyZWVQcm9jZXNzICYmIGZyZWVQcm9jZXNzLmJpbmRpbmcoJ3V0aWwnKTtcclxuICB9IGNhdGNoIChlKSB7fVxyXG59KSgpO1xyXG5cclxubGV0IG5vZGVJc1R5cGVkQXJyYXkgPSBub2RlVXRpbCAmJiBub2RlVXRpbC5pc1R5cGVkQXJyYXk7XHJcblxyXG5mdW5jdGlvbiBhcnJheU1hcChhcnJheSwgaXRlcmF0ZWUpIHtcclxuICBsZXQgaW5kZXggPSAtMSxcclxuICAgIGxlbmd0aCA9IGFycmF5ID8gYXJyYXkubGVuZ3RoIDogMCxcclxuICAgIHJlc3VsdCA9IEFycmF5KGxlbmd0aCk7XHJcblxyXG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XHJcbiAgICByZXN1bHRbaW5kZXhdID0gaXRlcmF0ZWUoYXJyYXlbaW5kZXhdLCBpbmRleCwgYXJyYXkpO1xyXG4gIH1cclxuICByZXR1cm4gcmVzdWx0O1xyXG59XHJcblxyXG5mdW5jdGlvbiBhcnJheVNvbWUoYXJyYXksIHByZWRpY2F0ZSkge1xyXG4gIGxldCBpbmRleCA9IC0xLFxyXG4gICAgbGVuZ3RoID0gYXJyYXkgPyBhcnJheS5sZW5ndGggOiAwO1xyXG5cclxuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xyXG4gICAgaWYgKHByZWRpY2F0ZShhcnJheVtpbmRleF0sIGluZGV4LCBhcnJheSkpIHtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgfVxyXG4gIHJldHVybiBmYWxzZTtcclxufVxyXG5cclxuZnVuY3Rpb24gYmFzZVByb3BlcnR5KGtleSkge1xyXG4gIHJldHVybiBmdW5jdGlvbiAob2JqZWN0KSB7XHJcbiAgICByZXR1cm4gb2JqZWN0ID09IG51bGwgPyB1bmRlZmluZWQgOiBvYmplY3Rba2V5XTtcclxuICB9O1xyXG59XHJcblxyXG5mdW5jdGlvbiBiYXNlU29ydEJ5KGFycmF5LCBjb21wYXJlcikge1xyXG4gIGxldCBsZW5ndGggPSBhcnJheS5sZW5ndGg7XHJcblxyXG4gIGFycmF5LnNvcnQoY29tcGFyZXIpO1xyXG4gIHdoaWxlIChsZW5ndGgtLSkge1xyXG4gICAgYXJyYXlbbGVuZ3RoXSA9IGFycmF5W2xlbmd0aF0udmFsdWU7XHJcbiAgfVxyXG4gIHJldHVybiBhcnJheTtcclxufVxyXG5cclxuZnVuY3Rpb24gYmFzZVRpbWVzKG4sIGl0ZXJhdGVlKSB7XHJcbiAgbGV0IGluZGV4ID0gLTEsXHJcbiAgICByZXN1bHQgPSBBcnJheShuKTtcclxuXHJcbiAgd2hpbGUgKCsraW5kZXggPCBuKSB7XHJcbiAgICByZXN1bHRbaW5kZXhdID0gaXRlcmF0ZWUoaW5kZXgpO1xyXG4gIH1cclxuICByZXR1cm4gcmVzdWx0O1xyXG59XHJcblxyXG5mdW5jdGlvbiBiYXNlVW5hcnkoZnVuYykge1xyXG4gIHJldHVybiBmdW5jdGlvbiAodmFsdWUpIHtcclxuICAgIHJldHVybiBmdW5jKHZhbHVlKTtcclxuICB9O1xyXG59XHJcblxyXG5mdW5jdGlvbiBnZXRWYWx1ZShvYmplY3QsIGtleSkge1xyXG4gIHJldHVybiBvYmplY3QgPT0gbnVsbCA/IHVuZGVmaW5lZCA6IG9iamVjdFtrZXldO1xyXG59XHJcblxyXG5mdW5jdGlvbiBpc0hvc3RPYmplY3QodmFsdWUpIHtcclxuICBsZXQgcmVzdWx0ID0gZmFsc2U7XHJcbiAgaWYgKHZhbHVlICE9IG51bGwgJiYgdHlwZW9mIHZhbHVlLnRvU3RyaW5nICE9ICdmdW5jdGlvbicpIHtcclxuICAgIHRyeSB7XHJcbiAgICAgIHJlc3VsdCA9ICEhKHZhbHVlICsgJycpO1xyXG4gICAgfSBjYXRjaCAoZSkge31cclxuICB9XHJcbiAgcmV0dXJuIHJlc3VsdDtcclxufVxyXG5cclxuZnVuY3Rpb24gbWFwVG9BcnJheShtYXApIHtcclxuICBsZXQgaW5kZXggPSAtMSxcclxuICAgIHJlc3VsdCA9IEFycmF5KG1hcC5zaXplKTtcclxuXHJcbiAgbWFwLmZvckVhY2goZnVuY3Rpb24gKHZhbHVlLCBrZXkpIHtcclxuICAgIHJlc3VsdFsrK2luZGV4XSA9IFtrZXksIHZhbHVlXTtcclxuICB9KTtcclxuICByZXR1cm4gcmVzdWx0O1xyXG59XHJcblxyXG5mdW5jdGlvbiBvdmVyQXJnKGZ1bmMsIHRyYW5zZm9ybSkge1xyXG4gIHJldHVybiBmdW5jdGlvbiAoYXJnKSB7XHJcbiAgICByZXR1cm4gZnVuYyh0cmFuc2Zvcm0oYXJnKSk7XHJcbiAgfTtcclxufVxyXG5cclxuZnVuY3Rpb24gc2V0VG9BcnJheShzZXQpIHtcclxuICBsZXQgaW5kZXggPSAtMSxcclxuICAgIHJlc3VsdCA9IEFycmF5KHNldC5zaXplKTtcclxuXHJcbiAgc2V0LmZvckVhY2goZnVuY3Rpb24gKHZhbHVlKSB7XHJcbiAgICByZXN1bHRbKytpbmRleF0gPSB2YWx1ZTtcclxuICB9KTtcclxuICByZXR1cm4gcmVzdWx0O1xyXG59XHJcblxyXG5sZXQgYXJyYXlQcm90byA9IEFycmF5LnByb3RvdHlwZSxcclxuICBmdW5jUHJvdG8gPSBGdW5jdGlvbi5wcm90b3R5cGUsXHJcbiAgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xyXG5cclxubGV0IGNvcmVKc0RhdGEgPSByb290WydfX2NvcmUtanNfc2hhcmVkX18nXTtcclxubGV0IG1hc2tTcmNLZXkgPSAoZnVuY3Rpb24gKCkge1xyXG4gIGxldCB1aWQgPSAvW14uXSskLy5leGVjKChjb3JlSnNEYXRhICYmIGNvcmVKc0RhdGEua2V5cyAmJiBjb3JlSnNEYXRhLmtleXMuSUVfUFJPVE8pIHx8ICcnKTtcclxuICByZXR1cm4gdWlkID8gJ1N5bWJvbChzcmMpXzEuJyArIHVpZCA6ICcnO1xyXG59KSgpO1xyXG5cclxubGV0IGZ1bmNUb1N0cmluZyA9IGZ1bmNQcm90by50b1N0cmluZztcclxubGV0IGhhc093blByb3BlcnR5ID0gb2JqZWN0UHJvdG8uaGFzT3duUHJvcGVydHk7XHJcbmxldCBvYmplY3RUb1N0cmluZyA9IG9iamVjdFByb3RvLnRvU3RyaW5nO1xyXG5cclxubGV0IHJlSXNOYXRpdmUgPSBSZWdFeHAoXHJcbiAgJ14nICtcclxuICAgIGZ1bmNUb1N0cmluZ1xyXG4gICAgICAuY2FsbChoYXNPd25Qcm9wZXJ0eSlcclxuICAgICAgLnJlcGxhY2UocmVSZWdFeHBDaGFyLCAnXFxcXCQmJylcclxuICAgICAgLnJlcGxhY2UoL2hhc093blByb3BlcnR5fChmdW5jdGlvbikuKj8oPz1cXFxcXFwoKXwgZm9yIC4rPyg/PVxcXFxcXF0pL2csICckMS4qPycpICtcclxuICAgICckJ1xyXG4pO1xyXG5cclxubGV0IFN5bWJvbCA9IHJvb3QuU3ltYm9sLFxyXG4gIFVpbnQ4QXJyYXkgPSByb290LlVpbnQ4QXJyYXksXHJcbiAgcHJvcGVydHlJc0VudW1lcmFibGUgPSBvYmplY3RQcm90by5wcm9wZXJ0eUlzRW51bWVyYWJsZSxcclxuICBzcGxpY2UgPSBhcnJheVByb3RvLnNwbGljZTtcclxuXHJcbmxldCBuYXRpdmVLZXlzID0gb3ZlckFyZyhPYmplY3Qua2V5cywgT2JqZWN0KTtcclxuXHJcbmxldCBEYXRhVmlldyA9IGdldE5hdGl2ZShyb290LCAnRGF0YVZpZXcnKSxcclxuICBNYXAgPSBnZXROYXRpdmUocm9vdCwgJ01hcCcpLFxyXG4gIFByb21pc2UgPSBnZXROYXRpdmUocm9vdCwgJ1Byb21pc2UnKSxcclxuICBTZXQgPSBnZXROYXRpdmUocm9vdCwgJ1NldCcpLFxyXG4gIFdlYWtNYXAgPSBnZXROYXRpdmUocm9vdCwgJ1dlYWtNYXAnKSxcclxuICBuYXRpdmVDcmVhdGUgPSBnZXROYXRpdmUoT2JqZWN0LCAnY3JlYXRlJyk7XHJcblxyXG5sZXQgZGF0YVZpZXdDdG9yU3RyaW5nID0gdG9Tb3VyY2UoRGF0YVZpZXcpLFxyXG4gIG1hcEN0b3JTdHJpbmcgPSB0b1NvdXJjZShNYXApLFxyXG4gIHByb21pc2VDdG9yU3RyaW5nID0gdG9Tb3VyY2UoUHJvbWlzZSksXHJcbiAgc2V0Q3RvclN0cmluZyA9IHRvU291cmNlKFNldCksXHJcbiAgd2Vha01hcEN0b3JTdHJpbmcgPSB0b1NvdXJjZShXZWFrTWFwKTtcclxuXHJcbmxldCBzeW1ib2xQcm90byA9IFN5bWJvbCA/IFN5bWJvbC5wcm90b3R5cGUgOiB1bmRlZmluZWQsXHJcbiAgc3ltYm9sVmFsdWVPZiA9IHN5bWJvbFByb3RvID8gc3ltYm9sUHJvdG8udmFsdWVPZiA6IHVuZGVmaW5lZCxcclxuICBzeW1ib2xUb1N0cmluZyA9IHN5bWJvbFByb3RvID8gc3ltYm9sUHJvdG8udG9TdHJpbmcgOiB1bmRlZmluZWQ7XHJcblxyXG5mdW5jdGlvbiBIYXNoKGVudHJpZXMpIHtcclxuICBsZXQgaW5kZXggPSAtMSxcclxuICAgIGxlbmd0aCA9IGVudHJpZXMgPyBlbnRyaWVzLmxlbmd0aCA6IDA7XHJcblxyXG4gIHRoaXMuY2xlYXIoKTtcclxuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xyXG4gICAgbGV0IGVudHJ5ID0gZW50cmllc1tpbmRleF07XHJcbiAgICB0aGlzLnNldChlbnRyeVswXSwgZW50cnlbMV0pO1xyXG4gIH1cclxufVxyXG5cclxuZnVuY3Rpb24gaGFzaENsZWFyKCkge1xyXG4gIHRoaXMuX19kYXRhX18gPSBuYXRpdmVDcmVhdGUgPyBuYXRpdmVDcmVhdGUobnVsbCkgOiB7fTtcclxufVxyXG5cclxuZnVuY3Rpb24gaGFzaERlbGV0ZShrZXkpIHtcclxuICByZXR1cm4gdGhpcy5oYXMoa2V5KSAmJiBkZWxldGUgdGhpcy5fX2RhdGFfX1trZXldO1xyXG59XHJcblxyXG5mdW5jdGlvbiBoYXNoR2V0KGtleSkge1xyXG4gIGxldCBkYXRhID0gdGhpcy5fX2RhdGFfXztcclxuICBpZiAobmF0aXZlQ3JlYXRlKSB7XHJcbiAgICBsZXQgcmVzdWx0ID0gZGF0YVtrZXldO1xyXG4gICAgcmV0dXJuIHJlc3VsdCA9PT0gSEFTSF9VTkRFRklORUQgPyB1bmRlZmluZWQgOiByZXN1bHQ7XHJcbiAgfVxyXG4gIHJldHVybiBoYXNPd25Qcm9wZXJ0eS5jYWxsKGRhdGEsIGtleSkgPyBkYXRhW2tleV0gOiB1bmRlZmluZWQ7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGhhc2hIYXMoa2V5KSB7XHJcbiAgbGV0IGRhdGEgPSB0aGlzLl9fZGF0YV9fO1xyXG4gIHJldHVybiBuYXRpdmVDcmVhdGUgPyBkYXRhW2tleV0gIT09IHVuZGVmaW5lZCA6IGhhc093blByb3BlcnR5LmNhbGwoZGF0YSwga2V5KTtcclxufVxyXG5cclxuZnVuY3Rpb24gaGFzaFNldChrZXksIHZhbHVlKSB7XHJcbiAgbGV0IGRhdGEgPSB0aGlzLl9fZGF0YV9fO1xyXG4gIGRhdGFba2V5XSA9IG5hdGl2ZUNyZWF0ZSAmJiB2YWx1ZSA9PT0gdW5kZWZpbmVkID8gSEFTSF9VTkRFRklORUQgOiB2YWx1ZTtcclxuICByZXR1cm4gdGhpcztcclxufVxyXG5cclxuSGFzaC5wcm90b3R5cGUuY2xlYXIgPSBoYXNoQ2xlYXI7XHJcbkhhc2gucHJvdG90eXBlWydkZWxldGUnXSA9IGhhc2hEZWxldGU7XHJcbkhhc2gucHJvdG90eXBlLmdldCA9IGhhc2hHZXQ7XHJcbkhhc2gucHJvdG90eXBlLmhhcyA9IGhhc2hIYXM7XHJcbkhhc2gucHJvdG90eXBlLnNldCA9IGhhc2hTZXQ7XHJcblxyXG5mdW5jdGlvbiBMaXN0Q2FjaGUoZW50cmllcykge1xyXG4gIGxldCBpbmRleCA9IC0xLFxyXG4gICAgbGVuZ3RoID0gZW50cmllcyA/IGVudHJpZXMubGVuZ3RoIDogMDtcclxuXHJcbiAgdGhpcy5jbGVhcigpO1xyXG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XHJcbiAgICBsZXQgZW50cnkgPSBlbnRyaWVzW2luZGV4XTtcclxuICAgIHRoaXMuc2V0KGVudHJ5WzBdLCBlbnRyeVsxXSk7XHJcbiAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiBsaXN0Q2FjaGVDbGVhcigpIHtcclxuICB0aGlzLl9fZGF0YV9fID0gW107XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGxpc3RDYWNoZURlbGV0ZShrZXkpIHtcclxuICBsZXQgZGF0YSA9IHRoaXMuX19kYXRhX18sXHJcbiAgICBpbmRleCA9IGFzc29jSW5kZXhPZihkYXRhLCBrZXkpO1xyXG5cclxuICBpZiAoaW5kZXggPCAwKSB7XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG4gIGxldCBsYXN0SW5kZXggPSBkYXRhLmxlbmd0aCAtIDE7XHJcbiAgaWYgKGluZGV4ID09IGxhc3RJbmRleCkge1xyXG4gICAgZGF0YS5wb3AoKTtcclxuICB9IGVsc2Uge1xyXG4gICAgc3BsaWNlLmNhbGwoZGF0YSwgaW5kZXgsIDEpO1xyXG4gIH1cclxuICByZXR1cm4gdHJ1ZTtcclxufVxyXG5cclxuZnVuY3Rpb24gbGlzdENhY2hlR2V0KGtleSkge1xyXG4gIGxldCBkYXRhID0gdGhpcy5fX2RhdGFfXyxcclxuICAgIGluZGV4ID0gYXNzb2NJbmRleE9mKGRhdGEsIGtleSk7XHJcblxyXG4gIHJldHVybiBpbmRleCA8IDAgPyB1bmRlZmluZWQgOiBkYXRhW2luZGV4XVsxXTtcclxufVxyXG5cclxuZnVuY3Rpb24gbGlzdENhY2hlSGFzKGtleSkge1xyXG4gIHJldHVybiBhc3NvY0luZGV4T2YodGhpcy5fX2RhdGFfXywga2V5KSA+IC0xO1xyXG59XHJcblxyXG5mdW5jdGlvbiBsaXN0Q2FjaGVTZXQoa2V5LCB2YWx1ZSkge1xyXG4gIGxldCBkYXRhID0gdGhpcy5fX2RhdGFfXyxcclxuICAgIGluZGV4ID0gYXNzb2NJbmRleE9mKGRhdGEsIGtleSk7XHJcblxyXG4gIGlmIChpbmRleCA8IDApIHtcclxuICAgIGRhdGEucHVzaChba2V5LCB2YWx1ZV0pO1xyXG4gIH0gZWxzZSB7XHJcbiAgICBkYXRhW2luZGV4XVsxXSA9IHZhbHVlO1xyXG4gIH1cclxuICByZXR1cm4gdGhpcztcclxufVxyXG5cclxuTGlzdENhY2hlLnByb3RvdHlwZS5jbGVhciA9IGxpc3RDYWNoZUNsZWFyO1xyXG5MaXN0Q2FjaGUucHJvdG90eXBlWydkZWxldGUnXSA9IGxpc3RDYWNoZURlbGV0ZTtcclxuTGlzdENhY2hlLnByb3RvdHlwZS5nZXQgPSBsaXN0Q2FjaGVHZXQ7XHJcbkxpc3RDYWNoZS5wcm90b3R5cGUuaGFzID0gbGlzdENhY2hlSGFzO1xyXG5MaXN0Q2FjaGUucHJvdG90eXBlLnNldCA9IGxpc3RDYWNoZVNldDtcclxuXHJcbmZ1bmN0aW9uIE1hcENhY2hlKGVudHJpZXMpIHtcclxuICBsZXQgaW5kZXggPSAtMSxcclxuICAgIGxlbmd0aCA9IGVudHJpZXMgPyBlbnRyaWVzLmxlbmd0aCA6IDA7XHJcblxyXG4gIHRoaXMuY2xlYXIoKTtcclxuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xyXG4gICAgbGV0IGVudHJ5ID0gZW50cmllc1tpbmRleF07XHJcbiAgICB0aGlzLnNldChlbnRyeVswXSwgZW50cnlbMV0pO1xyXG4gIH1cclxufVxyXG5cclxuZnVuY3Rpb24gbWFwQ2FjaGVDbGVhcigpIHtcclxuICB0aGlzLl9fZGF0YV9fID0ge1xyXG4gICAgaGFzaDogbmV3IEhhc2goKSxcclxuICAgIG1hcDogbmV3IChNYXAgfHwgTGlzdENhY2hlKSgpLFxyXG4gICAgc3RyaW5nOiBuZXcgSGFzaCgpLFxyXG4gIH07XHJcbn1cclxuXHJcbmZ1bmN0aW9uIG1hcENhY2hlRGVsZXRlKGtleSkge1xyXG4gIHJldHVybiBnZXRNYXBEYXRhKHRoaXMsIGtleSlbJ2RlbGV0ZSddKGtleSk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIG1hcENhY2hlR2V0KGtleSkge1xyXG4gIHJldHVybiBnZXRNYXBEYXRhKHRoaXMsIGtleSkuZ2V0KGtleSk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIG1hcENhY2hlSGFzKGtleSkge1xyXG4gIHJldHVybiBnZXRNYXBEYXRhKHRoaXMsIGtleSkuaGFzKGtleSk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIG1hcENhY2hlU2V0KGtleSwgdmFsdWUpIHtcclxuICBnZXRNYXBEYXRhKHRoaXMsIGtleSkuc2V0KGtleSwgdmFsdWUpO1xyXG4gIHJldHVybiB0aGlzO1xyXG59XHJcblxyXG5NYXBDYWNoZS5wcm90b3R5cGUuY2xlYXIgPSBtYXBDYWNoZUNsZWFyO1xyXG5NYXBDYWNoZS5wcm90b3R5cGVbJ2RlbGV0ZSddID0gbWFwQ2FjaGVEZWxldGU7XHJcbk1hcENhY2hlLnByb3RvdHlwZS5nZXQgPSBtYXBDYWNoZUdldDtcclxuTWFwQ2FjaGUucHJvdG90eXBlLmhhcyA9IG1hcENhY2hlSGFzO1xyXG5NYXBDYWNoZS5wcm90b3R5cGUuc2V0ID0gbWFwQ2FjaGVTZXQ7XHJcblxyXG5mdW5jdGlvbiBTZXRDYWNoZSh2YWx1ZXMpIHtcclxuICBsZXQgaW5kZXggPSAtMSxcclxuICAgIGxlbmd0aCA9IHZhbHVlcyA/IHZhbHVlcy5sZW5ndGggOiAwO1xyXG5cclxuICB0aGlzLl9fZGF0YV9fID0gbmV3IE1hcENhY2hlKCk7XHJcbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcclxuICAgIHRoaXMuYWRkKHZhbHVlc1tpbmRleF0pO1xyXG4gIH1cclxufVxyXG5cclxuZnVuY3Rpb24gc2V0Q2FjaGVBZGQodmFsdWUpIHtcclxuICB0aGlzLl9fZGF0YV9fLnNldCh2YWx1ZSwgSEFTSF9VTkRFRklORUQpO1xyXG4gIHJldHVybiB0aGlzO1xyXG59XHJcblxyXG5mdW5jdGlvbiBzZXRDYWNoZUhhcyh2YWx1ZSkge1xyXG4gIHJldHVybiB0aGlzLl9fZGF0YV9fLmhhcyh2YWx1ZSk7XHJcbn1cclxuXHJcblNldENhY2hlLnByb3RvdHlwZS5hZGQgPSBTZXRDYWNoZS5wcm90b3R5cGUucHVzaCA9IHNldENhY2hlQWRkO1xyXG5TZXRDYWNoZS5wcm90b3R5cGUuaGFzID0gc2V0Q2FjaGVIYXM7XHJcblxyXG5mdW5jdGlvbiBTdGFjayhlbnRyaWVzKSB7XHJcbiAgdGhpcy5fX2RhdGFfXyA9IG5ldyBMaXN0Q2FjaGUoZW50cmllcyk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHN0YWNrQ2xlYXIoKSB7XHJcbiAgdGhpcy5fX2RhdGFfXyA9IG5ldyBMaXN0Q2FjaGUoKTtcclxufVxyXG5cclxuZnVuY3Rpb24gc3RhY2tEZWxldGUoa2V5KSB7XHJcbiAgcmV0dXJuIHRoaXMuX19kYXRhX19bJ2RlbGV0ZSddKGtleSk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHN0YWNrR2V0KGtleSkge1xyXG4gIHJldHVybiB0aGlzLl9fZGF0YV9fLmdldChrZXkpO1xyXG59XHJcblxyXG5mdW5jdGlvbiBzdGFja0hhcyhrZXkpIHtcclxuICByZXR1cm4gdGhpcy5fX2RhdGFfXy5oYXMoa2V5KTtcclxufVxyXG5cclxuZnVuY3Rpb24gc3RhY2tTZXQoa2V5LCB2YWx1ZSkge1xyXG4gIGxldCBjYWNoZSA9IHRoaXMuX19kYXRhX187XHJcbiAgaWYgKGNhY2hlIGluc3RhbmNlb2YgTGlzdENhY2hlKSB7XHJcbiAgICBsZXQgcGFpcnMgPSBjYWNoZS5fX2RhdGFfXztcclxuICAgIGlmICghTWFwIHx8IHBhaXJzLmxlbmd0aCA8IExBUkdFX0FSUkFZX1NJWkUgLSAxKSB7XHJcbiAgICAgIHBhaXJzLnB1c2goW2tleSwgdmFsdWVdKTtcclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcbiAgICBjYWNoZSA9IHRoaXMuX19kYXRhX18gPSBuZXcgTWFwQ2FjaGUocGFpcnMpO1xyXG4gIH1cclxuICBjYWNoZS5zZXQoa2V5LCB2YWx1ZSk7XHJcbiAgcmV0dXJuIHRoaXM7XHJcbn1cclxuXHJcblN0YWNrLnByb3RvdHlwZS5jbGVhciA9IHN0YWNrQ2xlYXI7XHJcblN0YWNrLnByb3RvdHlwZVsnZGVsZXRlJ10gPSBzdGFja0RlbGV0ZTtcclxuU3RhY2sucHJvdG90eXBlLmdldCA9IHN0YWNrR2V0O1xyXG5TdGFjay5wcm90b3R5cGUuaGFzID0gc3RhY2tIYXM7XHJcblN0YWNrLnByb3RvdHlwZS5zZXQgPSBzdGFja1NldDtcclxuXHJcbmZ1bmN0aW9uIGFycmF5TGlrZUtleXModmFsdWUsIGluaGVyaXRlZCkge1xyXG4gIGxldCByZXN1bHQgPSBpc0FycmF5KHZhbHVlKSB8fCBpc0FyZ3VtZW50cyh2YWx1ZSkgPyBiYXNlVGltZXModmFsdWUubGVuZ3RoLCBTdHJpbmcpIDogW107XHJcblxyXG4gIGxldCBsZW5ndGggPSByZXN1bHQubGVuZ3RoLFxyXG4gICAgc2tpcEluZGV4ZXMgPSAhIWxlbmd0aDtcclxuXHJcbiAgZm9yIChsZXQga2V5IGluIHZhbHVlKSB7XHJcbiAgICBpZiAoXHJcbiAgICAgIChpbmhlcml0ZWQgfHwgaGFzT3duUHJvcGVydHkuY2FsbCh2YWx1ZSwga2V5KSkgJiZcclxuICAgICAgIShza2lwSW5kZXhlcyAmJiAoa2V5ID09ICdsZW5ndGgnIHx8IGlzSW5kZXgoa2V5LCBsZW5ndGgpKSlcclxuICAgICkge1xyXG4gICAgICByZXN1bHQucHVzaChrZXkpO1xyXG4gICAgfVxyXG4gIH1cclxuICByZXR1cm4gcmVzdWx0O1xyXG59XHJcblxyXG5mdW5jdGlvbiBhc3NvY0luZGV4T2YoYXJyYXksIGtleSkge1xyXG4gIGxldCBsZW5ndGggPSBhcnJheS5sZW5ndGg7XHJcbiAgd2hpbGUgKGxlbmd0aC0tKSB7XHJcbiAgICBpZiAoZXEoYXJyYXlbbGVuZ3RoXVswXSwga2V5KSkge1xyXG4gICAgICByZXR1cm4gbGVuZ3RoO1xyXG4gICAgfVxyXG4gIH1cclxuICByZXR1cm4gLTE7XHJcbn1cclxuXHJcbmxldCBiYXNlRWFjaCA9IGNyZWF0ZUJhc2VFYWNoKGJhc2VGb3JPd24pO1xyXG5cclxubGV0IGJhc2VGb3IgPSBjcmVhdGVCYXNlRm9yKCk7XHJcblxyXG5mdW5jdGlvbiBiYXNlRm9yT3duKG9iamVjdCwgaXRlcmF0ZWUpIHtcclxuICByZXR1cm4gb2JqZWN0ICYmIGJhc2VGb3Iob2JqZWN0LCBpdGVyYXRlZSwga2V5cyk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGJhc2VHZXQob2JqZWN0LCBwYXRoKSB7XHJcbiAgcGF0aCA9IGlzS2V5KHBhdGgsIG9iamVjdCkgPyBbcGF0aF0gOiBjYXN0UGF0aChwYXRoKTtcclxuXHJcbiAgbGV0IGluZGV4ID0gMCxcclxuICAgIGxlbmd0aCA9IHBhdGgubGVuZ3RoO1xyXG5cclxuICB3aGlsZSAob2JqZWN0ICE9IG51bGwgJiYgaW5kZXggPCBsZW5ndGgpIHtcclxuICAgIG9iamVjdCA9IG9iamVjdFt0b0tleShwYXRoW2luZGV4KytdKV07XHJcbiAgfVxyXG4gIHJldHVybiBpbmRleCAmJiBpbmRleCA9PSBsZW5ndGggPyBvYmplY3QgOiB1bmRlZmluZWQ7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGJhc2VHZXRUYWcodmFsdWUpIHtcclxuICByZXR1cm4gb2JqZWN0VG9TdHJpbmcuY2FsbCh2YWx1ZSk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGJhc2VIYXNJbihvYmplY3QsIGtleSkge1xyXG4gIHJldHVybiBvYmplY3QgIT0gbnVsbCAmJiBrZXkgaW4gT2JqZWN0KG9iamVjdCk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGJhc2VJc0VxdWFsKHZhbHVlLCBvdGhlciwgY3VzdG9taXplciwgYml0bWFzaywgc3RhY2spIHtcclxuICBpZiAodmFsdWUgPT09IG90aGVyKSB7XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcbiAgaWYgKHZhbHVlID09IG51bGwgfHwgb3RoZXIgPT0gbnVsbCB8fCAoIWlzT2JqZWN0KHZhbHVlKSAmJiAhaXNPYmplY3RMaWtlKG90aGVyKSkpIHtcclxuICAgIHJldHVybiB2YWx1ZSAhPT0gdmFsdWUgJiYgb3RoZXIgIT09IG90aGVyO1xyXG4gIH1cclxuICByZXR1cm4gYmFzZUlzRXF1YWxEZWVwKHZhbHVlLCBvdGhlciwgYmFzZUlzRXF1YWwsIGN1c3RvbWl6ZXIsIGJpdG1hc2ssIHN0YWNrKTtcclxufVxyXG5cclxuZnVuY3Rpb24gYmFzZUlzRXF1YWxEZWVwKG9iamVjdCwgb3RoZXIsIGVxdWFsRnVuYywgY3VzdG9taXplciwgYml0bWFzaywgc3RhY2spIHtcclxuICBsZXQgb2JqSXNBcnIgPSBpc0FycmF5KG9iamVjdCksXHJcbiAgICBvdGhJc0FyciA9IGlzQXJyYXkob3RoZXIpLFxyXG4gICAgb2JqVGFnID0gYXJyYXlUYWcsXHJcbiAgICBvdGhUYWcgPSBhcnJheVRhZztcclxuXHJcbiAgaWYgKCFvYmpJc0Fycikge1xyXG4gICAgb2JqVGFnID0gZ2V0VGFnKG9iamVjdCk7XHJcbiAgICBvYmpUYWcgPSBvYmpUYWcgPT0gYXJnc1RhZyA/IG9iamVjdFRhZyA6IG9ialRhZztcclxuICB9XHJcbiAgaWYgKCFvdGhJc0Fycikge1xyXG4gICAgb3RoVGFnID0gZ2V0VGFnKG90aGVyKTtcclxuICAgIG90aFRhZyA9IG90aFRhZyA9PSBhcmdzVGFnID8gb2JqZWN0VGFnIDogb3RoVGFnO1xyXG4gIH1cclxuICBsZXQgb2JqSXNPYmogPSBvYmpUYWcgPT0gb2JqZWN0VGFnICYmICFpc0hvc3RPYmplY3Qob2JqZWN0KSxcclxuICAgIG90aElzT2JqID0gb3RoVGFnID09IG9iamVjdFRhZyAmJiAhaXNIb3N0T2JqZWN0KG90aGVyKSxcclxuICAgIGlzU2FtZVRhZyA9IG9ialRhZyA9PSBvdGhUYWc7XHJcblxyXG4gIGlmIChpc1NhbWVUYWcgJiYgIW9iaklzT2JqKSB7XHJcbiAgICBzdGFjayB8fCAoc3RhY2sgPSBuZXcgU3RhY2soKSk7XHJcbiAgICByZXR1cm4gb2JqSXNBcnIgfHwgaXNUeXBlZEFycmF5KG9iamVjdClcclxuICAgICAgPyBlcXVhbEFycmF5cyhvYmplY3QsIG90aGVyLCBlcXVhbEZ1bmMsIGN1c3RvbWl6ZXIsIGJpdG1hc2ssIHN0YWNrKVxyXG4gICAgICA6IGVxdWFsQnlUYWcob2JqZWN0LCBvdGhlciwgb2JqVGFnLCBlcXVhbEZ1bmMsIGN1c3RvbWl6ZXIsIGJpdG1hc2ssIHN0YWNrKTtcclxuICB9XHJcbiAgaWYgKCEoYml0bWFzayAmIFBBUlRJQUxfQ09NUEFSRV9GTEFHKSkge1xyXG4gICAgbGV0IG9iaklzV3JhcHBlZCA9IG9iaklzT2JqICYmIGhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCAnX193cmFwcGVkX18nKSxcclxuICAgICAgb3RoSXNXcmFwcGVkID0gb3RoSXNPYmogJiYgaGFzT3duUHJvcGVydHkuY2FsbChvdGhlciwgJ19fd3JhcHBlZF9fJyk7XHJcblxyXG4gICAgaWYgKG9iaklzV3JhcHBlZCB8fCBvdGhJc1dyYXBwZWQpIHtcclxuICAgICAgbGV0IG9ialVud3JhcHBlZCA9IG9iaklzV3JhcHBlZCA/IG9iamVjdC52YWx1ZSgpIDogb2JqZWN0LFxyXG4gICAgICAgIG90aFVud3JhcHBlZCA9IG90aElzV3JhcHBlZCA/IG90aGVyLnZhbHVlKCkgOiBvdGhlcjtcclxuXHJcbiAgICAgIHN0YWNrIHx8IChzdGFjayA9IG5ldyBTdGFjaygpKTtcclxuICAgICAgcmV0dXJuIGVxdWFsRnVuYyhvYmpVbndyYXBwZWQsIG90aFVud3JhcHBlZCwgY3VzdG9taXplciwgYml0bWFzaywgc3RhY2spO1xyXG4gICAgfVxyXG4gIH1cclxuICBpZiAoIWlzU2FtZVRhZykge1xyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuICBzdGFjayB8fCAoc3RhY2sgPSBuZXcgU3RhY2soKSk7XHJcbiAgcmV0dXJuIGVxdWFsT2JqZWN0cyhvYmplY3QsIG90aGVyLCBlcXVhbEZ1bmMsIGN1c3RvbWl6ZXIsIGJpdG1hc2ssIHN0YWNrKTtcclxufVxyXG5cclxuZnVuY3Rpb24gYmFzZUlzTWF0Y2gob2JqZWN0LCBzb3VyY2UsIG1hdGNoRGF0YSwgY3VzdG9taXplcikge1xyXG4gIGxldCBpbmRleCA9IG1hdGNoRGF0YS5sZW5ndGgsXHJcbiAgICBsZW5ndGggPSBpbmRleCxcclxuICAgIG5vQ3VzdG9taXplciA9ICFjdXN0b21pemVyO1xyXG5cclxuICBpZiAob2JqZWN0ID09IG51bGwpIHtcclxuICAgIHJldHVybiAhbGVuZ3RoO1xyXG4gIH1cclxuICBvYmplY3QgPSBPYmplY3Qob2JqZWN0KTtcclxuICB3aGlsZSAoaW5kZXgtLSkge1xyXG4gICAgbGV0IGRhdGEgPSBtYXRjaERhdGFbaW5kZXhdO1xyXG4gICAgaWYgKG5vQ3VzdG9taXplciAmJiBkYXRhWzJdID8gZGF0YVsxXSAhPT0gb2JqZWN0W2RhdGFbMF1dIDogIShkYXRhWzBdIGluIG9iamVjdCkpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xyXG4gICAgZGF0YSA9IG1hdGNoRGF0YVtpbmRleF07XHJcbiAgICBsZXQga2V5ID0gZGF0YVswXSxcclxuICAgICAgb2JqVmFsdWUgPSBvYmplY3Rba2V5XSxcclxuICAgICAgc3JjVmFsdWUgPSBkYXRhWzFdO1xyXG5cclxuICAgIGlmIChub0N1c3RvbWl6ZXIgJiYgZGF0YVsyXSkge1xyXG4gICAgICBpZiAob2JqVmFsdWUgPT09IHVuZGVmaW5lZCAmJiAhKGtleSBpbiBvYmplY3QpKSB7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBsZXQgc3RhY2sgPSBuZXcgU3RhY2soKTtcclxuICAgICAgaWYgKGN1c3RvbWl6ZXIpIHtcclxuICAgICAgICBsZXQgcmVzdWx0ID0gY3VzdG9taXplcihvYmpWYWx1ZSwgc3JjVmFsdWUsIGtleSwgb2JqZWN0LCBzb3VyY2UsIHN0YWNrKTtcclxuICAgICAgfVxyXG4gICAgICBpZiAoXHJcbiAgICAgICAgIShyZXN1bHQgPT09IHVuZGVmaW5lZFxyXG4gICAgICAgICAgPyBiYXNlSXNFcXVhbChcclxuICAgICAgICAgICAgICBzcmNWYWx1ZSxcclxuICAgICAgICAgICAgICBvYmpWYWx1ZSxcclxuICAgICAgICAgICAgICBjdXN0b21pemVyLFxyXG4gICAgICAgICAgICAgIFVOT1JERVJFRF9DT01QQVJFX0ZMQUcgfCBQQVJUSUFMX0NPTVBBUkVfRkxBRyxcclxuICAgICAgICAgICAgICBzdGFja1xyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgICA6IHJlc3VsdClcclxuICAgICAgKSB7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG4gIHJldHVybiB0cnVlO1xyXG59XHJcblxyXG5mdW5jdGlvbiBiYXNlSXNOYXRpdmUodmFsdWUpIHtcclxuICBpZiAoIWlzT2JqZWN0KHZhbHVlKSB8fCBpc01hc2tlZCh2YWx1ZSkpIHtcclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcbiAgbGV0IHBhdHRlcm4gPSBpc0Z1bmN0aW9uKHZhbHVlKSB8fCBpc0hvc3RPYmplY3QodmFsdWUpID8gcmVJc05hdGl2ZSA6IHJlSXNIb3N0Q3RvcjtcclxuICByZXR1cm4gcGF0dGVybi50ZXN0KHRvU291cmNlKHZhbHVlKSk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGJhc2VJc1R5cGVkQXJyYXkodmFsdWUpIHtcclxuICByZXR1cm4gKFxyXG4gICAgaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBpc0xlbmd0aCh2YWx1ZS5sZW5ndGgpICYmICEhdHlwZWRBcnJheVRhZ3Nbb2JqZWN0VG9TdHJpbmcuY2FsbCh2YWx1ZSldXHJcbiAgKTtcclxufVxyXG5cclxuZnVuY3Rpb24gYmFzZUl0ZXJhdGVlKHZhbHVlKSB7XHJcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PSAnZnVuY3Rpb24nKSB7XHJcbiAgICByZXR1cm4gdmFsdWU7XHJcbiAgfVxyXG4gIGlmICh2YWx1ZSA9PSBudWxsKSB7XHJcbiAgICByZXR1cm4gaWRlbnRpdHk7XHJcbiAgfVxyXG4gIGlmICh0eXBlb2YgdmFsdWUgPT0gJ29iamVjdCcpIHtcclxuICAgIHJldHVybiBpc0FycmF5KHZhbHVlKSA/IGJhc2VNYXRjaGVzUHJvcGVydHkodmFsdWVbMF0sIHZhbHVlWzFdKSA6IGJhc2VNYXRjaGVzKHZhbHVlKTtcclxuICB9XHJcbiAgcmV0dXJuIHByb3BlcnR5KHZhbHVlKTtcclxufVxyXG5cclxuZnVuY3Rpb24gYmFzZUtleXMob2JqZWN0KSB7XHJcbiAgaWYgKCFpc1Byb3RvdHlwZShvYmplY3QpKSB7XHJcbiAgICByZXR1cm4gbmF0aXZlS2V5cyhvYmplY3QpO1xyXG4gIH1cclxuICBsZXQgcmVzdWx0ID0gW107XHJcbiAgZm9yIChsZXQga2V5IGluIE9iamVjdChvYmplY3QpKSB7XHJcbiAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIGtleSkgJiYga2V5ICE9ICdjb25zdHJ1Y3RvcicpIHtcclxuICAgICAgcmVzdWx0LnB1c2goa2V5KTtcclxuICAgIH1cclxuICB9XHJcbiAgcmV0dXJuIHJlc3VsdDtcclxufVxyXG5cclxuZnVuY3Rpb24gYmFzZU1hcChjb2xsZWN0aW9uLCBpdGVyYXRlZSkge1xyXG4gIGxldCBpbmRleCA9IC0xLFxyXG4gICAgcmVzdWx0ID0gaXNBcnJheUxpa2UoY29sbGVjdGlvbikgPyBBcnJheShjb2xsZWN0aW9uLmxlbmd0aCkgOiBbXTtcclxuXHJcbiAgYmFzZUVhY2goY29sbGVjdGlvbiwgZnVuY3Rpb24gKHZhbHVlLCBrZXksIGNvbGxlY3Rpb24pIHtcclxuICAgIHJlc3VsdFsrK2luZGV4XSA9IGl0ZXJhdGVlKHZhbHVlLCBrZXksIGNvbGxlY3Rpb24pO1xyXG4gIH0pO1xyXG4gIHJldHVybiByZXN1bHQ7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGJhc2VNYXRjaGVzKHNvdXJjZSkge1xyXG4gIGxldCBtYXRjaERhdGEgPSBnZXRNYXRjaERhdGEoc291cmNlKTtcclxuICBpZiAobWF0Y2hEYXRhLmxlbmd0aCA9PSAxICYmIG1hdGNoRGF0YVswXVsyXSkge1xyXG4gICAgcmV0dXJuIG1hdGNoZXNTdHJpY3RDb21wYXJhYmxlKG1hdGNoRGF0YVswXVswXSwgbWF0Y2hEYXRhWzBdWzFdKTtcclxuICB9XHJcbiAgcmV0dXJuIGZ1bmN0aW9uIChvYmplY3QpIHtcclxuICAgIHJldHVybiBvYmplY3QgPT09IHNvdXJjZSB8fCBiYXNlSXNNYXRjaChvYmplY3QsIHNvdXJjZSwgbWF0Y2hEYXRhKTtcclxuICB9O1xyXG59XHJcblxyXG5mdW5jdGlvbiBiYXNlTWF0Y2hlc1Byb3BlcnR5KHBhdGgsIHNyY1ZhbHVlKSB7XHJcbiAgaWYgKGlzS2V5KHBhdGgpICYmIGlzU3RyaWN0Q29tcGFyYWJsZShzcmNWYWx1ZSkpIHtcclxuICAgIHJldHVybiBtYXRjaGVzU3RyaWN0Q29tcGFyYWJsZSh0b0tleShwYXRoKSwgc3JjVmFsdWUpO1xyXG4gIH1cclxuICByZXR1cm4gZnVuY3Rpb24gKG9iamVjdCkge1xyXG4gICAgbGV0IG9ialZhbHVlID0gZ2V0KG9iamVjdCwgcGF0aCk7XHJcbiAgICByZXR1cm4gb2JqVmFsdWUgPT09IHVuZGVmaW5lZCAmJiBvYmpWYWx1ZSA9PT0gc3JjVmFsdWVcclxuICAgICAgPyBoYXNJbihvYmplY3QsIHBhdGgpXHJcbiAgICAgIDogYmFzZUlzRXF1YWwoc3JjVmFsdWUsIG9ialZhbHVlLCB1bmRlZmluZWQsIFVOT1JERVJFRF9DT01QQVJFX0ZMQUcgfCBQQVJUSUFMX0NPTVBBUkVfRkxBRyk7XHJcbiAgfTtcclxufVxyXG5cclxuZnVuY3Rpb24gYmFzZU9yZGVyQnkoY29sbGVjdGlvbiwgaXRlcmF0ZWVzLCBvcmRlcnMpIHtcclxuICBsZXQgaW5kZXggPSAtMTtcclxuICBpdGVyYXRlZXMgPSBhcnJheU1hcChpdGVyYXRlZXMubGVuZ3RoID8gaXRlcmF0ZWVzIDogW2lkZW50aXR5XSwgYmFzZVVuYXJ5KGJhc2VJdGVyYXRlZSkpO1xyXG5cclxuICBsZXQgcmVzdWx0ID0gYmFzZU1hcChjb2xsZWN0aW9uLCBmdW5jdGlvbiAodmFsdWUsIGtleSwgY29sbGVjdGlvbikge1xyXG4gICAgbGV0IGNyaXRlcmlhID0gYXJyYXlNYXAoaXRlcmF0ZWVzLCBmdW5jdGlvbiAoaXRlcmF0ZWUpIHtcclxuICAgICAgcmV0dXJuIGl0ZXJhdGVlKHZhbHVlKTtcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIHsgY3JpdGVyaWE6IGNyaXRlcmlhLCBpbmRleDogKytpbmRleCwgdmFsdWU6IHZhbHVlIH07XHJcbiAgfSk7XHJcblxyXG4gIHJldHVybiBiYXNlU29ydEJ5KHJlc3VsdCwgZnVuY3Rpb24gKG9iamVjdCwgb3RoZXIpIHtcclxuICAgIHJldHVybiBjb21wYXJlTXVsdGlwbGUob2JqZWN0LCBvdGhlciwgb3JkZXJzKTtcclxuICB9KTtcclxufVxyXG5cclxuZnVuY3Rpb24gYmFzZVByb3BlcnR5RGVlcChwYXRoKSB7XHJcbiAgcmV0dXJuIGZ1bmN0aW9uIChvYmplY3QpIHtcclxuICAgIHJldHVybiBiYXNlR2V0KG9iamVjdCwgcGF0aCk7XHJcbiAgfTtcclxufVxyXG5cclxuZnVuY3Rpb24gYmFzZVRvU3RyaW5nKHZhbHVlKSB7XHJcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PSAnc3RyaW5nJykge1xyXG4gICAgcmV0dXJuIHZhbHVlO1xyXG4gIH1cclxuICBpZiAoaXNTeW1ib2wodmFsdWUpKSB7XHJcbiAgICByZXR1cm4gc3ltYm9sVG9TdHJpbmcgPyBzeW1ib2xUb1N0cmluZy5jYWxsKHZhbHVlKSA6ICcnO1xyXG4gIH1cclxuICBsZXQgcmVzdWx0ID0gdmFsdWUgKyAnJztcclxuICByZXR1cm4gcmVzdWx0ID09ICcwJyAmJiAxIC8gdmFsdWUgPT0gLUlORklOSVRZID8gJy0wJyA6IHJlc3VsdDtcclxufVxyXG5cclxuZnVuY3Rpb24gY2FzdFBhdGgodmFsdWUpIHtcclxuICByZXR1cm4gaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IHN0cmluZ1RvUGF0aCh2YWx1ZSk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGNvbXBhcmVBc2NlbmRpbmcodmFsdWUsIG90aGVyKSB7XHJcbiAgaWYgKHZhbHVlICE9PSBvdGhlcikge1xyXG4gICAgbGV0IHZhbElzRGVmaW5lZCA9IHZhbHVlICE9PSB1bmRlZmluZWQsXHJcbiAgICAgIHZhbElzTnVsbCA9IHZhbHVlID09PSBudWxsLFxyXG4gICAgICB2YWxJc1JlZmxleGl2ZSA9IHZhbHVlID09PSB2YWx1ZSxcclxuICAgICAgdmFsSXNTeW1ib2wgPSBpc1N5bWJvbCh2YWx1ZSk7XHJcblxyXG4gICAgbGV0IG90aElzRGVmaW5lZCA9IG90aGVyICE9PSB1bmRlZmluZWQsXHJcbiAgICAgIG90aElzTnVsbCA9IG90aGVyID09PSBudWxsLFxyXG4gICAgICBvdGhJc1JlZmxleGl2ZSA9IG90aGVyID09PSBvdGhlcixcclxuICAgICAgb3RoSXNTeW1ib2wgPSBpc1N5bWJvbChvdGhlcik7XHJcblxyXG4gICAgaWYgKFxyXG4gICAgICAoIW90aElzTnVsbCAmJiAhb3RoSXNTeW1ib2wgJiYgIXZhbElzU3ltYm9sICYmIHZhbHVlID4gb3RoZXIpIHx8XHJcbiAgICAgICh2YWxJc1N5bWJvbCAmJiBvdGhJc0RlZmluZWQgJiYgb3RoSXNSZWZsZXhpdmUgJiYgIW90aElzTnVsbCAmJiAhb3RoSXNTeW1ib2wpIHx8XHJcbiAgICAgICh2YWxJc051bGwgJiYgb3RoSXNEZWZpbmVkICYmIG90aElzUmVmbGV4aXZlKSB8fFxyXG4gICAgICAoIXZhbElzRGVmaW5lZCAmJiBvdGhJc1JlZmxleGl2ZSkgfHxcclxuICAgICAgIXZhbElzUmVmbGV4aXZlXHJcbiAgICApIHtcclxuICAgICAgcmV0dXJuIDE7XHJcbiAgICB9XHJcbiAgICBpZiAoXHJcbiAgICAgICghdmFsSXNOdWxsICYmICF2YWxJc1N5bWJvbCAmJiAhb3RoSXNTeW1ib2wgJiYgdmFsdWUgPCBvdGhlcikgfHxcclxuICAgICAgKG90aElzU3ltYm9sICYmIHZhbElzRGVmaW5lZCAmJiB2YWxJc1JlZmxleGl2ZSAmJiAhdmFsSXNOdWxsICYmICF2YWxJc1N5bWJvbCkgfHxcclxuICAgICAgKG90aElzTnVsbCAmJiB2YWxJc0RlZmluZWQgJiYgdmFsSXNSZWZsZXhpdmUpIHx8XHJcbiAgICAgICghb3RoSXNEZWZpbmVkICYmIHZhbElzUmVmbGV4aXZlKSB8fFxyXG4gICAgICAhb3RoSXNSZWZsZXhpdmVcclxuICAgICkge1xyXG4gICAgICByZXR1cm4gLTE7XHJcbiAgICB9XHJcbiAgfVxyXG4gIHJldHVybiAwO1xyXG59XHJcblxyXG5mdW5jdGlvbiBjb21wYXJlTXVsdGlwbGUob2JqZWN0LCBvdGhlciwgb3JkZXJzKSB7XHJcbiAgbGV0IGluZGV4ID0gLTEsXHJcbiAgICBvYmpDcml0ZXJpYSA9IG9iamVjdC5jcml0ZXJpYSxcclxuICAgIG90aENyaXRlcmlhID0gb3RoZXIuY3JpdGVyaWEsXHJcbiAgICBsZW5ndGggPSBvYmpDcml0ZXJpYS5sZW5ndGgsXHJcbiAgICBvcmRlcnNMZW5ndGggPSBvcmRlcnMubGVuZ3RoO1xyXG5cclxuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xyXG4gICAgbGV0IHJlc3VsdCA9IGNvbXBhcmVBc2NlbmRpbmcob2JqQ3JpdGVyaWFbaW5kZXhdLCBvdGhDcml0ZXJpYVtpbmRleF0pO1xyXG4gICAgaWYgKHJlc3VsdCkge1xyXG4gICAgICBpZiAoaW5kZXggPj0gb3JkZXJzTGVuZ3RoKSB7XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgfVxyXG4gICAgICBsZXQgb3JkZXIgPSBvcmRlcnNbaW5kZXhdO1xyXG4gICAgICByZXR1cm4gcmVzdWx0ICogKG9yZGVyID09ICdkZXNjJyA/IC0xIDogMSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICByZXR1cm4gb2JqZWN0LmluZGV4IC0gb3RoZXIuaW5kZXg7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGNyZWF0ZUJhc2VFYWNoKGVhY2hGdW5jLCBmcm9tUmlnaHQpIHtcclxuICByZXR1cm4gZnVuY3Rpb24gKGNvbGxlY3Rpb24sIGl0ZXJhdGVlKSB7XHJcbiAgICBpZiAoY29sbGVjdGlvbiA9PSBudWxsKSB7XHJcbiAgICAgIHJldHVybiBjb2xsZWN0aW9uO1xyXG4gICAgfVxyXG4gICAgaWYgKCFpc0FycmF5TGlrZShjb2xsZWN0aW9uKSkge1xyXG4gICAgICByZXR1cm4gZWFjaEZ1bmMoY29sbGVjdGlvbiwgaXRlcmF0ZWUpO1xyXG4gICAgfVxyXG4gICAgbGV0IGxlbmd0aCA9IGNvbGxlY3Rpb24ubGVuZ3RoO1xyXG5cclxuICAgIGxldCBpbmRleCA9IGZyb21SaWdodCA/IGxlbmd0aCA6IC0xO1xyXG4gICAgbGV0IGl0ZXJhYmxlID0gT2JqZWN0KGNvbGxlY3Rpb24pO1xyXG5cclxuICAgIHdoaWxlIChmcm9tUmlnaHQgPyBpbmRleC0tIDogKytpbmRleCA8IGxlbmd0aCkge1xyXG4gICAgICBpZiAoaXRlcmF0ZWUoaXRlcmFibGVbaW5kZXhdLCBpbmRleCwgaXRlcmFibGUpID09PSBmYWxzZSkge1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gY29sbGVjdGlvbjtcclxuICB9O1xyXG59XHJcblxyXG5mdW5jdGlvbiBjcmVhdGVCYXNlRm9yKGZyb21SaWdodCkge1xyXG4gIHJldHVybiBmdW5jdGlvbiAob2JqZWN0LCBpdGVyYXRlZSwga2V5c0Z1bmMpIHtcclxuICAgIGxldCBpbmRleCA9IC0xLFxyXG4gICAgICBpdGVyYWJsZSA9IE9iamVjdChvYmplY3QpLFxyXG4gICAgICBwcm9wcyA9IGtleXNGdW5jKG9iamVjdCksXHJcbiAgICAgIGxlbmd0aCA9IHByb3BzLmxlbmd0aDtcclxuXHJcbiAgICB3aGlsZSAobGVuZ3RoLS0pIHtcclxuICAgICAgbGV0IGtleSA9IHByb3BzW2Zyb21SaWdodCA/IGxlbmd0aCA6ICsraW5kZXhdO1xyXG4gICAgICBpZiAoaXRlcmF0ZWUoaXRlcmFibGVba2V5XSwga2V5LCBpdGVyYWJsZSkgPT09IGZhbHNlKSB7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBvYmplY3Q7XHJcbiAgfTtcclxufVxyXG5cclxuZnVuY3Rpb24gZXF1YWxBcnJheXMoYXJyYXksIG90aGVyLCBlcXVhbEZ1bmMsIGN1c3RvbWl6ZXIsIGJpdG1hc2ssIHN0YWNrKSB7XHJcbiAgbGV0IGlzUGFydGlhbCA9IGJpdG1hc2sgJiBQQVJUSUFMX0NPTVBBUkVfRkxBRyxcclxuICAgIGFyckxlbmd0aCA9IGFycmF5Lmxlbmd0aCxcclxuICAgIG90aExlbmd0aCA9IG90aGVyLmxlbmd0aDtcclxuXHJcbiAgaWYgKGFyckxlbmd0aCAhPSBvdGhMZW5ndGggJiYgIShpc1BhcnRpYWwgJiYgb3RoTGVuZ3RoID4gYXJyTGVuZ3RoKSkge1xyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgbGV0IHN0YWNrZWQgPSBzdGFjay5nZXQoYXJyYXkpO1xyXG4gIGlmIChzdGFja2VkICYmIHN0YWNrLmdldChvdGhlcikpIHtcclxuICAgIHJldHVybiBzdGFja2VkID09IG90aGVyO1xyXG4gIH1cclxuICBsZXQgaW5kZXggPSAtMSxcclxuICAgIHJlc3VsdCA9IHRydWUsXHJcbiAgICBzZWVuID0gYml0bWFzayAmIFVOT1JERVJFRF9DT01QQVJFX0ZMQUcgPyBuZXcgU2V0Q2FjaGUoKSA6IHVuZGVmaW5lZDtcclxuXHJcbiAgc3RhY2suc2V0KGFycmF5LCBvdGhlcik7XHJcbiAgc3RhY2suc2V0KG90aGVyLCBhcnJheSk7XHJcblxyXG4gIHdoaWxlICgrK2luZGV4IDwgYXJyTGVuZ3RoKSB7XHJcbiAgICBsZXQgYXJyVmFsdWUgPSBhcnJheVtpbmRleF0sXHJcbiAgICAgIG90aFZhbHVlID0gb3RoZXJbaW5kZXhdO1xyXG5cclxuICAgIGlmIChjdXN0b21pemVyKSB7XHJcbiAgICAgIGxldCBjb21wYXJlZCA9IGlzUGFydGlhbFxyXG4gICAgICAgID8gY3VzdG9taXplcihvdGhWYWx1ZSwgYXJyVmFsdWUsIGluZGV4LCBvdGhlciwgYXJyYXksIHN0YWNrKVxyXG4gICAgICAgIDogY3VzdG9taXplcihhcnJWYWx1ZSwgb3RoVmFsdWUsIGluZGV4LCBhcnJheSwgb3RoZXIsIHN0YWNrKTtcclxuICAgIH1cclxuICAgIGlmIChjb21wYXJlZCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIGlmIChjb21wYXJlZCkge1xyXG4gICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICB9XHJcbiAgICAgIHJlc3VsdCA9IGZhbHNlO1xyXG4gICAgICBicmVhaztcclxuICAgIH1cclxuXHJcbiAgICBpZiAoc2Vlbikge1xyXG4gICAgICBpZiAoXHJcbiAgICAgICAgIWFycmF5U29tZShvdGhlciwgZnVuY3Rpb24gKG90aFZhbHVlLCBvdGhJbmRleCkge1xyXG4gICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAhc2Vlbi5oYXMob3RoSW5kZXgpICYmXHJcbiAgICAgICAgICAgIChhcnJWYWx1ZSA9PT0gb3RoVmFsdWUgfHwgZXF1YWxGdW5jKGFyclZhbHVlLCBvdGhWYWx1ZSwgY3VzdG9taXplciwgYml0bWFzaywgc3RhY2spKVxyXG4gICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBzZWVuLmFkZChvdGhJbmRleCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSlcclxuICAgICAgKSB7XHJcbiAgICAgICAgcmVzdWx0ID0gZmFsc2U7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSBpZiAoXHJcbiAgICAgICEoYXJyVmFsdWUgPT09IG90aFZhbHVlIHx8IGVxdWFsRnVuYyhhcnJWYWx1ZSwgb3RoVmFsdWUsIGN1c3RvbWl6ZXIsIGJpdG1hc2ssIHN0YWNrKSlcclxuICAgICkge1xyXG4gICAgICByZXN1bHQgPSBmYWxzZTtcclxuICAgICAgYnJlYWs7XHJcbiAgICB9XHJcbiAgfVxyXG4gIHN0YWNrWydkZWxldGUnXShhcnJheSk7XHJcbiAgc3RhY2tbJ2RlbGV0ZSddKG90aGVyKTtcclxuICByZXR1cm4gcmVzdWx0O1xyXG59XHJcblxyXG5mdW5jdGlvbiBlcXVhbEJ5VGFnKG9iamVjdCwgb3RoZXIsIHRhZywgZXF1YWxGdW5jLCBjdXN0b21pemVyLCBiaXRtYXNrLCBzdGFjaykge1xyXG4gIHN3aXRjaCAodGFnKSB7XHJcbiAgICBjYXNlIGRhdGFWaWV3VGFnOlxyXG4gICAgICBpZiAob2JqZWN0LmJ5dGVMZW5ndGggIT0gb3RoZXIuYnl0ZUxlbmd0aCB8fCBvYmplY3QuYnl0ZU9mZnNldCAhPSBvdGhlci5ieXRlT2Zmc2V0KSB7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICAgIG9iamVjdCA9IG9iamVjdC5idWZmZXI7XHJcbiAgICAgIG90aGVyID0gb3RoZXIuYnVmZmVyO1xyXG5cclxuICAgIGNhc2UgYXJyYXlCdWZmZXJUYWc6XHJcbiAgICAgIGlmIChcclxuICAgICAgICBvYmplY3QuYnl0ZUxlbmd0aCAhPSBvdGhlci5ieXRlTGVuZ3RoIHx8XHJcbiAgICAgICAgIWVxdWFsRnVuYyhuZXcgVWludDhBcnJheShvYmplY3QpLCBuZXcgVWludDhBcnJheShvdGhlcikpXHJcbiAgICAgICkge1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuXHJcbiAgICBjYXNlIGJvb2xUYWc6XHJcbiAgICBjYXNlIGRhdGVUYWc6XHJcbiAgICBjYXNlIG51bWJlclRhZzpcclxuICAgICAgcmV0dXJuIGVxKCtvYmplY3QsICtvdGhlcik7XHJcblxyXG4gICAgY2FzZSBlcnJvclRhZzpcclxuICAgICAgcmV0dXJuIG9iamVjdC5uYW1lID09IG90aGVyLm5hbWUgJiYgb2JqZWN0Lm1lc3NhZ2UgPT0gb3RoZXIubWVzc2FnZTtcclxuXHJcbiAgICBjYXNlIHJlZ2V4cFRhZzpcclxuICAgIGNhc2Ugc3RyaW5nVGFnOlxyXG4gICAgICByZXR1cm4gb2JqZWN0ID09IG90aGVyICsgJyc7XHJcblxyXG4gICAgY2FzZSBtYXBUYWc6XHJcbiAgICAgIGxldCBjb252ZXJ0ID0gbWFwVG9BcnJheTtcclxuXHJcbiAgICBjYXNlIHNldFRhZzpcclxuICAgICAgbGV0IGlzUGFydGlhbCA9IGJpdG1hc2sgJiBQQVJUSUFMX0NPTVBBUkVfRkxBRztcclxuICAgICAgY29udmVydCB8fCAoY29udmVydCA9IHNldFRvQXJyYXkpO1xyXG5cclxuICAgICAgaWYgKG9iamVjdC5zaXplICE9IG90aGVyLnNpemUgJiYgIWlzUGFydGlhbCkge1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgfVxyXG5cclxuICAgICAgbGV0IHN0YWNrZWQgPSBzdGFjay5nZXQob2JqZWN0KTtcclxuICAgICAgaWYgKHN0YWNrZWQpIHtcclxuICAgICAgICByZXR1cm4gc3RhY2tlZCA9PSBvdGhlcjtcclxuICAgICAgfVxyXG4gICAgICBiaXRtYXNrIHw9IFVOT1JERVJFRF9DT01QQVJFX0ZMQUc7XHJcblxyXG4gICAgICBzdGFjay5zZXQob2JqZWN0LCBvdGhlcik7XHJcbiAgICAgIGxldCByZXN1bHQgPSBlcXVhbEFycmF5cyhcclxuICAgICAgICBjb252ZXJ0KG9iamVjdCksXHJcbiAgICAgICAgY29udmVydChvdGhlciksXHJcbiAgICAgICAgZXF1YWxGdW5jLFxyXG4gICAgICAgIGN1c3RvbWl6ZXIsXHJcbiAgICAgICAgYml0bWFzayxcclxuICAgICAgICBzdGFja1xyXG4gICAgICApO1xyXG4gICAgICBzdGFja1snZGVsZXRlJ10ob2JqZWN0KTtcclxuICAgICAgcmV0dXJuIHJlc3VsdDtcclxuXHJcbiAgICBjYXNlIHN5bWJvbFRhZzpcclxuICAgICAgaWYgKHN5bWJvbFZhbHVlT2YpIHtcclxuICAgICAgICByZXR1cm4gc3ltYm9sVmFsdWVPZi5jYWxsKG9iamVjdCkgPT0gc3ltYm9sVmFsdWVPZi5jYWxsKG90aGVyKTtcclxuICAgICAgfVxyXG4gIH1cclxuICByZXR1cm4gZmFsc2U7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGVxdWFsT2JqZWN0cyhvYmplY3QsIG90aGVyLCBlcXVhbEZ1bmMsIGN1c3RvbWl6ZXIsIGJpdG1hc2ssIHN0YWNrKSB7XHJcbiAgbGV0IGlzUGFydGlhbCA9IGJpdG1hc2sgJiBQQVJUSUFMX0NPTVBBUkVfRkxBRyxcclxuICAgIG9ialByb3BzID0ga2V5cyhvYmplY3QpLFxyXG4gICAgb2JqTGVuZ3RoID0gb2JqUHJvcHMubGVuZ3RoLFxyXG4gICAgb3RoUHJvcHMgPSBrZXlzKG90aGVyKSxcclxuICAgIG90aExlbmd0aCA9IG90aFByb3BzLmxlbmd0aDtcclxuXHJcbiAgaWYgKG9iakxlbmd0aCAhPSBvdGhMZW5ndGggJiYgIWlzUGFydGlhbCkge1xyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuICBsZXQgaW5kZXggPSBvYmpMZW5ndGg7XHJcbiAgd2hpbGUgKGluZGV4LS0pIHtcclxuICAgIGxldCBrZXkgPSBvYmpQcm9wc1tpbmRleF07XHJcbiAgICBpZiAoIShpc1BhcnRpYWwgPyBrZXkgaW4gb3RoZXIgOiBoYXNPd25Qcm9wZXJ0eS5jYWxsKG90aGVyLCBrZXkpKSkge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBsZXQgc3RhY2tlZCA9IHN0YWNrLmdldChvYmplY3QpO1xyXG4gIGlmIChzdGFja2VkICYmIHN0YWNrLmdldChvdGhlcikpIHtcclxuICAgIHJldHVybiBzdGFja2VkID09IG90aGVyO1xyXG4gIH1cclxuICBsZXQgcmVzdWx0ID0gdHJ1ZTtcclxuICBzdGFjay5zZXQob2JqZWN0LCBvdGhlcik7XHJcbiAgc3RhY2suc2V0KG90aGVyLCBvYmplY3QpO1xyXG5cclxuICBsZXQgc2tpcEN0b3IgPSBpc1BhcnRpYWw7XHJcbiAgd2hpbGUgKCsraW5kZXggPCBvYmpMZW5ndGgpIHtcclxuICAgIGtleSA9IG9ialByb3BzW2luZGV4XTtcclxuICAgIGxldCBvYmpWYWx1ZSA9IG9iamVjdFtrZXldLFxyXG4gICAgICBvdGhWYWx1ZSA9IG90aGVyW2tleV07XHJcblxyXG4gICAgaWYgKGN1c3RvbWl6ZXIpIHtcclxuICAgICAgbGV0IGNvbXBhcmVkID0gaXNQYXJ0aWFsXHJcbiAgICAgICAgPyBjdXN0b21pemVyKG90aFZhbHVlLCBvYmpWYWx1ZSwga2V5LCBvdGhlciwgb2JqZWN0LCBzdGFjaylcclxuICAgICAgICA6IGN1c3RvbWl6ZXIob2JqVmFsdWUsIG90aFZhbHVlLCBrZXksIG9iamVjdCwgb3RoZXIsIHN0YWNrKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoXHJcbiAgICAgICEoY29tcGFyZWQgPT09IHVuZGVmaW5lZFxyXG4gICAgICAgID8gb2JqVmFsdWUgPT09IG90aFZhbHVlIHx8IGVxdWFsRnVuYyhvYmpWYWx1ZSwgb3RoVmFsdWUsIGN1c3RvbWl6ZXIsIGJpdG1hc2ssIHN0YWNrKVxyXG4gICAgICAgIDogY29tcGFyZWQpXHJcbiAgICApIHtcclxuICAgICAgcmVzdWx0ID0gZmFsc2U7XHJcbiAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG4gICAgc2tpcEN0b3IgfHwgKHNraXBDdG9yID0ga2V5ID09ICdjb25zdHJ1Y3RvcicpO1xyXG4gIH1cclxuICBpZiAocmVzdWx0ICYmICFza2lwQ3Rvcikge1xyXG4gICAgbGV0IG9iakN0b3IgPSBvYmplY3QuY29uc3RydWN0b3IsXHJcbiAgICAgIG90aEN0b3IgPSBvdGhlci5jb25zdHJ1Y3RvcjtcclxuXHJcbiAgICBpZiAoXHJcbiAgICAgIG9iakN0b3IgIT0gb3RoQ3RvciAmJlxyXG4gICAgICAnY29uc3RydWN0b3InIGluIG9iamVjdCAmJlxyXG4gICAgICAnY29uc3RydWN0b3InIGluIG90aGVyICYmXHJcbiAgICAgICEoXHJcbiAgICAgICAgdHlwZW9mIG9iakN0b3IgPT0gJ2Z1bmN0aW9uJyAmJlxyXG4gICAgICAgIG9iakN0b3IgaW5zdGFuY2VvZiBvYmpDdG9yICYmXHJcbiAgICAgICAgdHlwZW9mIG90aEN0b3IgPT0gJ2Z1bmN0aW9uJyAmJlxyXG4gICAgICAgIG90aEN0b3IgaW5zdGFuY2VvZiBvdGhDdG9yXHJcbiAgICAgIClcclxuICAgICkge1xyXG4gICAgICByZXN1bHQgPSBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcbiAgc3RhY2tbJ2RlbGV0ZSddKG9iamVjdCk7XHJcbiAgc3RhY2tbJ2RlbGV0ZSddKG90aGVyKTtcclxuICByZXR1cm4gcmVzdWx0O1xyXG59XHJcblxyXG5mdW5jdGlvbiBnZXRNYXBEYXRhKG1hcCwga2V5KSB7XHJcbiAgbGV0IGRhdGEgPSBtYXAuX19kYXRhX187XHJcbiAgcmV0dXJuIGlzS2V5YWJsZShrZXkpID8gZGF0YVt0eXBlb2Yga2V5ID09ICdzdHJpbmcnID8gJ3N0cmluZycgOiAnaGFzaCddIDogZGF0YS5tYXA7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGdldE1hdGNoRGF0YShvYmplY3QpIHtcclxuICBsZXQgcmVzdWx0ID0ga2V5cyhvYmplY3QpLFxyXG4gICAgbGVuZ3RoID0gcmVzdWx0Lmxlbmd0aDtcclxuXHJcbiAgd2hpbGUgKGxlbmd0aC0tKSB7XHJcbiAgICBsZXQga2V5ID0gcmVzdWx0W2xlbmd0aF0sXHJcbiAgICAgIHZhbHVlID0gb2JqZWN0W2tleV07XHJcblxyXG4gICAgcmVzdWx0W2xlbmd0aF0gPSBba2V5LCB2YWx1ZSwgaXNTdHJpY3RDb21wYXJhYmxlKHZhbHVlKV07XHJcbiAgfVxyXG4gIHJldHVybiByZXN1bHQ7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGdldE5hdGl2ZShvYmplY3QsIGtleSkge1xyXG4gIGxldCB2YWx1ZSA9IGdldFZhbHVlKG9iamVjdCwga2V5KTtcclxuICByZXR1cm4gYmFzZUlzTmF0aXZlKHZhbHVlKSA/IHZhbHVlIDogdW5kZWZpbmVkO1xyXG59XHJcblxyXG5sZXQgZ2V0VGFnID0gYmFzZUdldFRhZztcclxuXHJcbmlmIChcclxuICAoRGF0YVZpZXcgJiYgZ2V0VGFnKG5ldyBEYXRhVmlldyhuZXcgQXJyYXlCdWZmZXIoMSkpKSAhPSBkYXRhVmlld1RhZykgfHxcclxuICAoTWFwICYmIGdldFRhZyhuZXcgTWFwKCkpICE9IG1hcFRhZykgfHxcclxuICAoUHJvbWlzZSAmJiBnZXRUYWcoUHJvbWlzZS5yZXNvbHZlKCkpICE9IHByb21pc2VUYWcpIHx8XHJcbiAgKFNldCAmJiBnZXRUYWcobmV3IFNldCgpKSAhPSBzZXRUYWcpIHx8XHJcbiAgKFdlYWtNYXAgJiYgZ2V0VGFnKG5ldyBXZWFrTWFwKCkpICE9IHdlYWtNYXBUYWcpXHJcbikge1xyXG4gIGdldFRhZyA9IGZ1bmN0aW9uICh2YWx1ZSkge1xyXG4gICAgbGV0IHJlc3VsdCA9IG9iamVjdFRvU3RyaW5nLmNhbGwodmFsdWUpLFxyXG4gICAgICBDdG9yID0gcmVzdWx0ID09IG9iamVjdFRhZyA/IHZhbHVlLmNvbnN0cnVjdG9yIDogdW5kZWZpbmVkLFxyXG4gICAgICBjdG9yU3RyaW5nID0gQ3RvciA/IHRvU291cmNlKEN0b3IpIDogdW5kZWZpbmVkO1xyXG5cclxuICAgIGlmIChjdG9yU3RyaW5nKSB7XHJcbiAgICAgIHN3aXRjaCAoY3RvclN0cmluZykge1xyXG4gICAgICAgIGNhc2UgZGF0YVZpZXdDdG9yU3RyaW5nOlxyXG4gICAgICAgICAgcmV0dXJuIGRhdGFWaWV3VGFnO1xyXG4gICAgICAgIGNhc2UgbWFwQ3RvclN0cmluZzpcclxuICAgICAgICAgIHJldHVybiBtYXBUYWc7XHJcbiAgICAgICAgY2FzZSBwcm9taXNlQ3RvclN0cmluZzpcclxuICAgICAgICAgIHJldHVybiBwcm9taXNlVGFnO1xyXG4gICAgICAgIGNhc2Ugc2V0Q3RvclN0cmluZzpcclxuICAgICAgICAgIHJldHVybiBzZXRUYWc7XHJcbiAgICAgICAgY2FzZSB3ZWFrTWFwQ3RvclN0cmluZzpcclxuICAgICAgICAgIHJldHVybiB3ZWFrTWFwVGFnO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH07XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGhhc1BhdGgob2JqZWN0LCBwYXRoLCBoYXNGdW5jKSB7XHJcbiAgcGF0aCA9IGlzS2V5KHBhdGgsIG9iamVjdCkgPyBbcGF0aF0gOiBjYXN0UGF0aChwYXRoKTtcclxuXHJcbiAgbGV0IHJlc3VsdDtcclxuICBsZXQgaW5kZXggPSAtMTtcclxuICBsZXQgbGVuZ3RoID0gcGF0aC5sZW5ndGg7XHJcblxyXG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XHJcbiAgICBsZXQga2V5ID0gdG9LZXkocGF0aFtpbmRleF0pO1xyXG4gICAgaWYgKCEocmVzdWx0ID0gb2JqZWN0ICE9IG51bGwgJiYgaGFzRnVuYyhvYmplY3QsIGtleSkpKSB7XHJcbiAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG4gICAgb2JqZWN0ID0gb2JqZWN0W2tleV07XHJcbiAgfVxyXG4gIGlmIChyZXN1bHQpIHtcclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfVxyXG4gIGxlbmd0aCA9IG9iamVjdCA/IG9iamVjdC5sZW5ndGggOiAwO1xyXG4gIHJldHVybiAoXHJcbiAgICAhIWxlbmd0aCAmJiBpc0xlbmd0aChsZW5ndGgpICYmIGlzSW5kZXgoa2V5LCBsZW5ndGgpICYmIChpc0FycmF5KG9iamVjdCkgfHwgaXNBcmd1bWVudHMob2JqZWN0KSlcclxuICApO1xyXG59XHJcblxyXG5mdW5jdGlvbiBpc0luZGV4KHZhbHVlLCBsZW5ndGgpIHtcclxuICBsZW5ndGggPSBsZW5ndGggPT0gbnVsbCA/IE1BWF9TQUZFX0lOVEVHRVIgOiBsZW5ndGg7XHJcbiAgcmV0dXJuIChcclxuICAgICEhbGVuZ3RoICYmXHJcbiAgICAodHlwZW9mIHZhbHVlID09ICdudW1iZXInIHx8IHJlSXNVaW50LnRlc3QodmFsdWUpKSAmJlxyXG4gICAgdmFsdWUgPiAtMSAmJlxyXG4gICAgdmFsdWUgJSAxID09IDAgJiZcclxuICAgIHZhbHVlIDwgbGVuZ3RoXHJcbiAgKTtcclxufVxyXG5cclxuZnVuY3Rpb24gaXNLZXkodmFsdWUsIG9iamVjdCkge1xyXG4gIGlmIChpc0FycmF5KHZhbHVlKSkge1xyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuICBsZXQgdHlwZSA9IHR5cGVvZiB2YWx1ZTtcclxuICBpZiAoXHJcbiAgICB0eXBlID09ICdudW1iZXInIHx8XHJcbiAgICB0eXBlID09ICdzeW1ib2wnIHx8XHJcbiAgICB0eXBlID09ICdib29sZWFuJyB8fFxyXG4gICAgdmFsdWUgPT0gbnVsbCB8fFxyXG4gICAgaXNTeW1ib2wodmFsdWUpXHJcbiAgKSB7XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcbiAgcmV0dXJuIChcclxuICAgIHJlSXNQbGFpblByb3AudGVzdCh2YWx1ZSkgfHxcclxuICAgICFyZUlzRGVlcFByb3AudGVzdCh2YWx1ZSkgfHxcclxuICAgIChvYmplY3QgIT0gbnVsbCAmJiB2YWx1ZSBpbiBPYmplY3Qob2JqZWN0KSlcclxuICApO1xyXG59XHJcblxyXG5mdW5jdGlvbiBpc0tleWFibGUodmFsdWUpIHtcclxuICBsZXQgdHlwZSA9IHR5cGVvZiB2YWx1ZTtcclxuICByZXR1cm4gdHlwZSA9PSAnc3RyaW5nJyB8fCB0eXBlID09ICdudW1iZXInIHx8IHR5cGUgPT0gJ3N5bWJvbCcgfHwgdHlwZSA9PSAnYm9vbGVhbidcclxuICAgID8gdmFsdWUgIT09ICdfX3Byb3RvX18nXHJcbiAgICA6IHZhbHVlID09PSBudWxsO1xyXG59XHJcblxyXG5mdW5jdGlvbiBpc01hc2tlZChmdW5jKSB7XHJcbiAgcmV0dXJuICEhbWFza1NyY0tleSAmJiBtYXNrU3JjS2V5IGluIGZ1bmM7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGlzUHJvdG90eXBlKHZhbHVlKSB7XHJcbiAgbGV0IEN0b3IgPSB2YWx1ZSAmJiB2YWx1ZS5jb25zdHJ1Y3RvcixcclxuICAgIHByb3RvID0gKHR5cGVvZiBDdG9yID09ICdmdW5jdGlvbicgJiYgQ3Rvci5wcm90b3R5cGUpIHx8IG9iamVjdFByb3RvO1xyXG5cclxuICByZXR1cm4gdmFsdWUgPT09IHByb3RvO1xyXG59XHJcblxyXG5mdW5jdGlvbiBpc1N0cmljdENvbXBhcmFibGUodmFsdWUpIHtcclxuICByZXR1cm4gdmFsdWUgPT09IHZhbHVlICYmICFpc09iamVjdCh2YWx1ZSk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIG1hdGNoZXNTdHJpY3RDb21wYXJhYmxlKGtleSwgc3JjVmFsdWUpIHtcclxuICByZXR1cm4gZnVuY3Rpb24gKG9iamVjdCkge1xyXG4gICAgaWYgKG9iamVjdCA9PSBudWxsKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIHJldHVybiBvYmplY3Rba2V5XSA9PT0gc3JjVmFsdWUgJiYgKHNyY1ZhbHVlICE9PSB1bmRlZmluZWQgfHwga2V5IGluIE9iamVjdChvYmplY3QpKTtcclxuICB9O1xyXG59XHJcblxyXG5sZXQgc3RyaW5nVG9QYXRoID0gbWVtb2l6ZShmdW5jdGlvbiAoc3RyaW5nKSB7XHJcbiAgc3RyaW5nID0gdG9TdHJpbmcoc3RyaW5nKTtcclxuXHJcbiAgbGV0IHJlc3VsdCA9IFtdO1xyXG4gIGlmIChyZUxlYWRpbmdEb3QudGVzdChzdHJpbmcpKSB7XHJcbiAgICByZXN1bHQucHVzaCgnJyk7XHJcbiAgfVxyXG4gIHN0cmluZy5yZXBsYWNlKHJlUHJvcE5hbWUsIGZ1bmN0aW9uIChtYXRjaCwgbnVtYmVyLCBxdW90ZSwgc3RyaW5nKSB7XHJcbiAgICByZXN1bHQucHVzaChxdW90ZSA/IHN0cmluZy5yZXBsYWNlKHJlRXNjYXBlQ2hhciwgJyQxJykgOiBudW1iZXIgfHwgbWF0Y2gpO1xyXG4gIH0pO1xyXG4gIHJldHVybiByZXN1bHQ7XHJcbn0pO1xyXG5cclxuZnVuY3Rpb24gdG9LZXkodmFsdWUpIHtcclxuICBpZiAodHlwZW9mIHZhbHVlID09ICdzdHJpbmcnIHx8IGlzU3ltYm9sKHZhbHVlKSkge1xyXG4gICAgcmV0dXJuIHZhbHVlO1xyXG4gIH1cclxuICBsZXQgcmVzdWx0ID0gdmFsdWUgKyAnJztcclxuICByZXR1cm4gcmVzdWx0ID09ICcwJyAmJiAxIC8gdmFsdWUgPT0gLUlORklOSVRZID8gJy0wJyA6IHJlc3VsdDtcclxufVxyXG5cclxuZnVuY3Rpb24gdG9Tb3VyY2UoZnVuYykge1xyXG4gIGlmIChmdW5jICE9IG51bGwpIHtcclxuICAgIHRyeSB7XHJcbiAgICAgIHJldHVybiBmdW5jVG9TdHJpbmcuY2FsbChmdW5jKTtcclxuICAgIH0gY2F0Y2ggKGUpIHt9XHJcbiAgICB0cnkge1xyXG4gICAgICByZXR1cm4gZnVuYyArICcnO1xyXG4gICAgfSBjYXRjaCAoZSkge31cclxuICB9XHJcbiAgcmV0dXJuICcnO1xyXG59XHJcblxyXG5mdW5jdGlvbiB6eGhpZGRlbkN1c3RvbU9yZGVyQnlCeUplcmVteUFzaGtlbmFzKGNvbGxlY3Rpb24sIGl0ZXJhdGVlcywgb3JkZXJzKSB7XHJcbiAgaWYgKGNvbGxlY3Rpb24gPT0gbnVsbCkge1xyXG4gICAgcmV0dXJuIFtdO1xyXG4gIH1cclxuICBpZiAoIWlzQXJyYXkoaXRlcmF0ZWVzKSkge1xyXG4gICAgaXRlcmF0ZWVzID0gaXRlcmF0ZWVzID09IG51bGwgPyBbXSA6IFtpdGVyYXRlZXNdO1xyXG4gIH1cclxuXHJcbiAgaWYgKCFpc0FycmF5KG9yZGVycykpIHtcclxuICAgIG9yZGVycyA9IG9yZGVycyA9PSBudWxsID8gW10gOiBbb3JkZXJzXTtcclxuICB9XHJcbiAgcmV0dXJuIGJhc2VPcmRlckJ5KGNvbGxlY3Rpb24sIGl0ZXJhdGVlcywgb3JkZXJzKTtcclxufVxyXG5cclxuZnVuY3Rpb24gbWVtb2l6ZShmdW5jLCByZXNvbHZlcikge1xyXG4gIGlmICh0eXBlb2YgZnVuYyAhPSAnZnVuY3Rpb24nIHx8IChyZXNvbHZlciAmJiB0eXBlb2YgcmVzb2x2ZXIgIT0gJ2Z1bmN0aW9uJykpIHtcclxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTtcclxuICB9XHJcbiAgbGV0IG1lbW9pemVkID0gZnVuY3Rpb24gKCkge1xyXG4gICAgbGV0IGFyZ3MgPSBhcmd1bWVudHMsXHJcbiAgICAgIGtleSA9IHJlc29sdmVyID8gcmVzb2x2ZXIuYXBwbHkodGhpcywgYXJncykgOiBhcmdzWzBdLFxyXG4gICAgICBjYWNoZSA9IG1lbW9pemVkLmNhY2hlO1xyXG5cclxuICAgIGlmIChjYWNoZS5oYXMoa2V5KSkge1xyXG4gICAgICByZXR1cm4gY2FjaGUuZ2V0KGtleSk7XHJcbiAgICB9XHJcbiAgICBsZXQgcmVzdWx0ID0gZnVuYy5hcHBseSh0aGlzLCBhcmdzKTtcclxuICAgIG1lbW9pemVkLmNhY2hlID0gY2FjaGUuc2V0KGtleSwgcmVzdWx0KTtcclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfTtcclxuICBtZW1vaXplZC5jYWNoZSA9IG5ldyAobWVtb2l6ZS5DYWNoZSB8fCBNYXBDYWNoZSkoKTtcclxuICByZXR1cm4gbWVtb2l6ZWQ7XHJcbn1cclxuXHJcbm1lbW9pemUuQ2FjaGUgPSBNYXBDYWNoZTtcclxuXHJcbmZ1bmN0aW9uIGVxKHZhbHVlLCBvdGhlcikge1xyXG4gIHJldHVybiB2YWx1ZSA9PT0gb3RoZXIgfHwgKHZhbHVlICE9PSB2YWx1ZSAmJiBvdGhlciAhPT0gb3RoZXIpO1xyXG59XHJcblxyXG5mdW5jdGlvbiBpc0FyZ3VtZW50cyh2YWx1ZSkge1xyXG4gIHJldHVybiAoXHJcbiAgICBpc0FycmF5TGlrZU9iamVjdCh2YWx1ZSkgJiZcclxuICAgIGhhc093blByb3BlcnR5LmNhbGwodmFsdWUsICdjYWxsZWUnKSAmJlxyXG4gICAgKCFwcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHZhbHVlLCAnY2FsbGVlJykgfHwgb2JqZWN0VG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT0gYXJnc1RhZylcclxuICApO1xyXG59XHJcblxyXG5sZXQgaXNBcnJheSA9IEFycmF5LmlzQXJyYXk7XHJcblxyXG5mdW5jdGlvbiBpc0FycmF5TGlrZSh2YWx1ZSkge1xyXG4gIHJldHVybiB2YWx1ZSAhPSBudWxsICYmIGlzTGVuZ3RoKHZhbHVlLmxlbmd0aCkgJiYgIWlzRnVuY3Rpb24odmFsdWUpO1xyXG59XHJcblxyXG5mdW5jdGlvbiBpc0FycmF5TGlrZU9iamVjdCh2YWx1ZSkge1xyXG4gIHJldHVybiBpc09iamVjdExpa2UodmFsdWUpICYmIGlzQXJyYXlMaWtlKHZhbHVlKTtcclxufVxyXG5cclxuZnVuY3Rpb24gaXNGdW5jdGlvbih2YWx1ZSkge1xyXG4gIGxldCB0YWcgPSBpc09iamVjdCh2YWx1ZSkgPyBvYmplY3RUb1N0cmluZy5jYWxsKHZhbHVlKSA6ICcnO1xyXG4gIHJldHVybiB0YWcgPT0gZnVuY1RhZyB8fCB0YWcgPT0gZ2VuVGFnO1xyXG59XHJcblxyXG5mdW5jdGlvbiBpc0xlbmd0aCh2YWx1ZSkge1xyXG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gJ251bWJlcicgJiYgdmFsdWUgPiAtMSAmJiB2YWx1ZSAlIDEgPT0gMCAmJiB2YWx1ZSA8PSBNQVhfU0FGRV9JTlRFR0VSO1xyXG59XHJcblxyXG5mdW5jdGlvbiBpc09iamVjdCh2YWx1ZSkge1xyXG4gIGxldCB0eXBlID0gdHlwZW9mIHZhbHVlO1xyXG4gIHJldHVybiAhIXZhbHVlICYmICh0eXBlID09ICdvYmplY3QnIHx8IHR5cGUgPT0gJ2Z1bmN0aW9uJyk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGlzT2JqZWN0TGlrZSh2YWx1ZSkge1xyXG4gIHJldHVybiAhIXZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PSAnb2JqZWN0JztcclxufVxyXG5cclxuZnVuY3Rpb24gaXNTeW1ib2wodmFsdWUpIHtcclxuICByZXR1cm4gKFxyXG4gICAgdHlwZW9mIHZhbHVlID09ICdzeW1ib2wnIHx8IChpc09iamVjdExpa2UodmFsdWUpICYmIG9iamVjdFRvU3RyaW5nLmNhbGwodmFsdWUpID09IHN5bWJvbFRhZylcclxuICApO1xyXG59XHJcblxyXG5sZXQgaXNUeXBlZEFycmF5ID0gbm9kZUlzVHlwZWRBcnJheSA/IGJhc2VVbmFyeShub2RlSXNUeXBlZEFycmF5KSA6IGJhc2VJc1R5cGVkQXJyYXk7XHJcblxyXG5mdW5jdGlvbiB0b1N0cmluZyh2YWx1ZSkge1xyXG4gIHJldHVybiB2YWx1ZSA9PSBudWxsID8gJycgOiBiYXNlVG9TdHJpbmcodmFsdWUpO1xyXG59XHJcblxyXG5mdW5jdGlvbiBnZXQob2JqZWN0LCBwYXRoLCBkZWZhdWx0VmFsdWUpIHtcclxuICBsZXQgcmVzdWx0ID0gb2JqZWN0ID09IG51bGwgPyB1bmRlZmluZWQgOiBiYXNlR2V0KG9iamVjdCwgcGF0aCk7XHJcbiAgcmV0dXJuIHJlc3VsdCA9PT0gdW5kZWZpbmVkID8gZGVmYXVsdFZhbHVlIDogcmVzdWx0O1xyXG59XHJcblxyXG5mdW5jdGlvbiBoYXNJbihvYmplY3QsIHBhdGgpIHtcclxuICByZXR1cm4gb2JqZWN0ICE9IG51bGwgJiYgaGFzUGF0aChvYmplY3QsIHBhdGgsIGJhc2VIYXNJbik7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGtleXMob2JqZWN0KSB7XHJcbiAgcmV0dXJuIGlzQXJyYXlMaWtlKG9iamVjdCkgPyBhcnJheUxpa2VLZXlzKG9iamVjdCkgOiBiYXNlS2V5cyhvYmplY3QpO1xyXG59XHJcblxyXG5mdW5jdGlvbiBpZGVudGl0eSh2YWx1ZSkge1xyXG4gIHJldHVybiB2YWx1ZTtcclxufVxyXG5cclxuZnVuY3Rpb24gcHJvcGVydHkocGF0aCkge1xyXG4gIHJldHVybiBpc0tleShwYXRoKSA/IGJhc2VQcm9wZXJ0eSh0b0tleShwYXRoKSkgOiBiYXNlUHJvcGVydHlEZWVwKHBhdGgpO1xyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCB6eGhpZGRlbkN1c3RvbU9yZGVyQnlCeUplcmVteUFzaGtlbmFzO1xyXG4iXX0=
|