mobx-keystone-yjs 1.5.5 → 1.6.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/CHANGELOG.md +57 -52
- package/dist/mobx-keystone-yjs.esm.js +334 -216
- package/dist/mobx-keystone-yjs.esm.mjs +334 -216
- package/dist/mobx-keystone-yjs.umd.js +332 -214
- package/dist/types/binding/applyMobxChangeToYjsObject.d.ts +3 -0
- package/dist/types/binding/applyYjsEventToMobx.d.ts +8 -0
- package/dist/types/binding/convertJsonToYjsData.d.ts +22 -3
- package/dist/types/binding/resolveYjsPath.d.ts +14 -1
- package/dist/types/binding/yjsSnapshotTracking.d.ts +24 -0
- package/dist/types/index.d.ts +1 -0
- package/package.json +90 -88
- package/src/binding/applyMobxChangeToYjsObject.ts +77 -0
- package/src/binding/applyYjsEventToMobx.ts +173 -0
- package/src/binding/bindYjsToMobxKeystone.ts +300 -202
- package/src/binding/convertJsonToYjsData.ts +218 -73
- package/src/binding/resolveYjsPath.ts +51 -27
- package/src/binding/yjsSnapshotTracking.ts +40 -0
- package/src/index.ts +11 -10
- package/src/utils/getOrCreateYjsCollectionAtom.ts +27 -27
- package/dist/types/binding/applyMobxKeystonePatchToYjsObject.d.ts +0 -2
- package/dist/types/binding/convertYjsEventToPatches.d.ts +0 -3
- package/src/binding/applyMobxKeystonePatchToYjsObject.ts +0 -103
- package/src/binding/convertYjsEventToPatches.ts +0 -84
|
@@ -1,9 +1,18 @@
|
|
|
1
1
|
var __defProp = Object.defineProperty;
|
|
2
2
|
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
3
3
|
var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
4
|
-
import { createAtom, reaction, observe, computed, action } from "mobx";
|
|
5
|
-
import { createContext, Model, tProp, types, frozen, getParentToChildPath, onSnapshot, model, modelSnapshotOutWithMetadata,
|
|
4
|
+
import { createAtom, reaction, observe, computed, action, remove } from "mobx";
|
|
5
|
+
import { createContext, Model, tProp, types, frozen, getParentToChildPath, onSnapshot, model, frozenKey, modelTypeKey, DeepChangeType, modelSnapshotOutWithMetadata, resolvePath, runUnprotected, isModel, getSnapshot, getSnapshotModelId, isFrozenSnapshot, fromSnapshot, onGlobalDeepChange, onDeepChange, isTreeNode } from "mobx-keystone";
|
|
6
6
|
import * as Y from "yjs";
|
|
7
|
+
class MobxKeystoneYjsError extends Error {
|
|
8
|
+
constructor(msg) {
|
|
9
|
+
super(msg);
|
|
10
|
+
Object.setPrototypeOf(this, MobxKeystoneYjsError.prototype);
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
function failure(msg) {
|
|
14
|
+
return new MobxKeystoneYjsError(msg);
|
|
15
|
+
}
|
|
7
16
|
const yjsCollectionAtoms = /* @__PURE__ */ new WeakMap();
|
|
8
17
|
const getYjsCollectionAtom = (yjsCollection) => {
|
|
9
18
|
return yjsCollectionAtoms.get(yjsCollection);
|
|
@@ -23,18 +32,14 @@ function isYjsValueDeleted(yjsValue) {
|
|
|
23
32
|
}
|
|
24
33
|
return false;
|
|
25
34
|
}
|
|
26
|
-
class MobxKeystoneYjsError extends Error {
|
|
27
|
-
constructor(msg) {
|
|
28
|
-
super(msg);
|
|
29
|
-
Object.setPrototypeOf(this, MobxKeystoneYjsError.prototype);
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
function failure(msg) {
|
|
33
|
-
return new MobxKeystoneYjsError(msg);
|
|
34
|
-
}
|
|
35
35
|
function resolveYjsPath(yjsObject, path) {
|
|
36
36
|
let currentYjsObject = yjsObject;
|
|
37
|
-
|
|
37
|
+
let i = -1;
|
|
38
|
+
for (const pathPart of path) {
|
|
39
|
+
i++;
|
|
40
|
+
if (currentYjsObject instanceof Y.Text) {
|
|
41
|
+
return currentYjsObject;
|
|
42
|
+
}
|
|
38
43
|
if (currentYjsObject instanceof Y.Map) {
|
|
39
44
|
getOrCreateYjsCollectionAtom(currentYjsObject).reportObserved();
|
|
40
45
|
const key = String(pathPart);
|
|
@@ -50,7 +55,7 @@ function resolveYjsPath(yjsObject, path) {
|
|
|
50
55
|
)} in order to resolve path ${JSON.stringify(path)}, but got ${currentYjsObject} instead`
|
|
51
56
|
);
|
|
52
57
|
}
|
|
53
|
-
}
|
|
58
|
+
}
|
|
54
59
|
return currentYjsObject;
|
|
55
60
|
}
|
|
56
61
|
const yjsBindingContext = createContext(void 0);
|
|
@@ -266,6 +271,13 @@ function hookYjsTextChangedAtom(getYjsText, textChangedAtom) {
|
|
|
266
271
|
disposeObserveYjsText = void 0;
|
|
267
272
|
};
|
|
268
273
|
}
|
|
274
|
+
const yjsContainerToSnapshot = /* @__PURE__ */ new WeakMap();
|
|
275
|
+
function setYjsContainerSnapshot(container, snapshot) {
|
|
276
|
+
yjsContainerToSnapshot.set(container, snapshot);
|
|
277
|
+
}
|
|
278
|
+
function isYjsContainerUpToDate(container, snapshot) {
|
|
279
|
+
return yjsContainerToSnapshot.get(container) === snapshot;
|
|
280
|
+
}
|
|
269
281
|
function isPlainPrimitive(v) {
|
|
270
282
|
const t = typeof v;
|
|
271
283
|
return t === "string" || t === "number" || t === "boolean" || v === null || v === void 0;
|
|
@@ -274,7 +286,7 @@ function isPlainArray(v) {
|
|
|
274
286
|
return Array.isArray(v);
|
|
275
287
|
}
|
|
276
288
|
function isPlainObject(v) {
|
|
277
|
-
return
|
|
289
|
+
return typeof v === "object" && v !== null && !Array.isArray(v);
|
|
278
290
|
}
|
|
279
291
|
function convertJsonToYjsData(v) {
|
|
280
292
|
if (isPlainPrimitive(v)) {
|
|
@@ -286,10 +298,10 @@ function convertJsonToYjsData(v) {
|
|
|
286
298
|
return arr;
|
|
287
299
|
}
|
|
288
300
|
if (isPlainObject(v)) {
|
|
289
|
-
if (v
|
|
301
|
+
if (v[frozenKey] === true) {
|
|
290
302
|
return v;
|
|
291
303
|
}
|
|
292
|
-
if (v
|
|
304
|
+
if (v[modelTypeKey] === yjsTextModelId) {
|
|
293
305
|
const text = new Y.Text();
|
|
294
306
|
const yjsTextModel = v;
|
|
295
307
|
yjsTextModel.deltaList.forEach((frozenDeltas) => {
|
|
@@ -303,102 +315,134 @@ function convertJsonToYjsData(v) {
|
|
|
303
315
|
}
|
|
304
316
|
throw new Error(`unsupported value type: ${v}`);
|
|
305
317
|
}
|
|
306
|
-
const applyJsonArrayToYArray = (dest, source) => {
|
|
307
|
-
|
|
318
|
+
const applyJsonArrayToYArray = (dest, source, options = {}) => {
|
|
319
|
+
const { mode = "add" } = options;
|
|
320
|
+
if (mode === "merge" && isYjsContainerUpToDate(dest, source)) {
|
|
321
|
+
return;
|
|
322
|
+
}
|
|
323
|
+
const srcLen = source.length;
|
|
324
|
+
if (mode === "add") {
|
|
325
|
+
for (let i = 0; i < srcLen; i++) {
|
|
326
|
+
dest.push([convertJsonToYjsData(source[i])]);
|
|
327
|
+
}
|
|
328
|
+
return;
|
|
329
|
+
}
|
|
330
|
+
const destLen = dest.length;
|
|
331
|
+
if (destLen > srcLen) {
|
|
332
|
+
dest.delete(srcLen, destLen - srcLen);
|
|
333
|
+
}
|
|
334
|
+
const minLen = Math.min(destLen, srcLen);
|
|
335
|
+
for (let i = 0; i < minLen; i++) {
|
|
336
|
+
const srcItem = source[i];
|
|
337
|
+
const destItem = dest.get(i);
|
|
338
|
+
if (isPlainObject(srcItem) && destItem instanceof Y.Map) {
|
|
339
|
+
applyJsonObjectToYMap(destItem, srcItem, options);
|
|
340
|
+
continue;
|
|
341
|
+
}
|
|
342
|
+
if (isPlainArray(srcItem) && destItem instanceof Y.Array) {
|
|
343
|
+
applyJsonArrayToYArray(destItem, srcItem, options);
|
|
344
|
+
continue;
|
|
345
|
+
}
|
|
346
|
+
if (isPlainPrimitive(srcItem) && destItem === srcItem) {
|
|
347
|
+
continue;
|
|
348
|
+
}
|
|
349
|
+
dest.delete(i, 1);
|
|
350
|
+
dest.insert(i, [convertJsonToYjsData(srcItem)]);
|
|
351
|
+
}
|
|
352
|
+
for (let i = destLen; i < srcLen; i++) {
|
|
353
|
+
dest.push([convertJsonToYjsData(source[i])]);
|
|
354
|
+
}
|
|
355
|
+
setYjsContainerSnapshot(dest, source);
|
|
308
356
|
};
|
|
309
|
-
const applyJsonObjectToYMap = (dest, source) => {
|
|
310
|
-
|
|
357
|
+
const applyJsonObjectToYMap = (dest, source, options = {}) => {
|
|
358
|
+
const { mode = "add" } = options;
|
|
359
|
+
if (mode === "merge" && isYjsContainerUpToDate(dest, source)) {
|
|
360
|
+
return;
|
|
361
|
+
}
|
|
362
|
+
if (mode === "add") {
|
|
363
|
+
for (const k of Object.keys(source)) {
|
|
364
|
+
const v = source[k];
|
|
365
|
+
if (v !== void 0) {
|
|
366
|
+
dest.set(k, convertJsonToYjsData(v));
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
return;
|
|
370
|
+
}
|
|
371
|
+
const sourceKeysWithValues = new Set(Object.keys(source).filter((k) => source[k] !== void 0));
|
|
372
|
+
for (const key of dest.keys()) {
|
|
373
|
+
if (!sourceKeysWithValues.has(key)) {
|
|
374
|
+
dest.delete(key);
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
for (const k of Object.keys(source)) {
|
|
378
|
+
const v = source[k];
|
|
379
|
+
if (v === void 0) {
|
|
380
|
+
continue;
|
|
381
|
+
}
|
|
382
|
+
const existing = dest.get(k);
|
|
383
|
+
if (isPlainObject(v) && existing instanceof Y.Map) {
|
|
384
|
+
applyJsonObjectToYMap(existing, v, options);
|
|
385
|
+
continue;
|
|
386
|
+
}
|
|
387
|
+
if (isPlainArray(v) && existing instanceof Y.Array) {
|
|
388
|
+
applyJsonArrayToYArray(existing, v, options);
|
|
389
|
+
continue;
|
|
390
|
+
}
|
|
391
|
+
if (isPlainPrimitive(v) && existing === v) {
|
|
392
|
+
continue;
|
|
393
|
+
}
|
|
311
394
|
dest.set(k, convertJsonToYjsData(v));
|
|
312
|
-
}
|
|
395
|
+
}
|
|
396
|
+
setYjsContainerSnapshot(dest, source);
|
|
313
397
|
};
|
|
314
|
-
function
|
|
315
|
-
if (
|
|
398
|
+
function convertValue(v) {
|
|
399
|
+
if (v === null || v === void 0 || typeof v !== "object") {
|
|
400
|
+
return v;
|
|
401
|
+
}
|
|
402
|
+
if (Array.isArray(v) && v.length === 0) {
|
|
403
|
+
return new Y.Array();
|
|
404
|
+
}
|
|
405
|
+
return convertJsonToYjsData(v);
|
|
406
|
+
}
|
|
407
|
+
function applyMobxChangeToYjsObject(change, yjsObject) {
|
|
408
|
+
if (isYjsValueDeleted(yjsObject)) {
|
|
316
409
|
throw failure("cannot apply patch to deleted Yjs value");
|
|
317
410
|
}
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
} else if (yjs instanceof Y.Array) {
|
|
329
|
-
const child = yjs.get(Number(key));
|
|
330
|
-
if (child === void 0) {
|
|
331
|
-
throw failure(
|
|
332
|
-
`invalid patch path, key "${key}" not found in Yjs array - patch: ${JSON.stringify(
|
|
333
|
-
patch
|
|
334
|
-
)}`
|
|
335
|
-
);
|
|
411
|
+
const yjsContainer = resolveYjsPath(yjsObject, change.path);
|
|
412
|
+
if (!yjsContainer) {
|
|
413
|
+
return;
|
|
414
|
+
}
|
|
415
|
+
if (yjsContainer instanceof Y.Array) {
|
|
416
|
+
if (change.type === DeepChangeType.ArraySplice) {
|
|
417
|
+
yjsContainer.delete(change.index, change.removedValues.length);
|
|
418
|
+
if (change.addedValues.length > 0) {
|
|
419
|
+
const valuesToInsert = change.addedValues.map(convertValue);
|
|
420
|
+
yjsContainer.insert(change.index, valuesToInsert);
|
|
336
421
|
}
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
patch
|
|
343
|
-
)}`
|
|
344
|
-
);
|
|
422
|
+
} else if (change.type === DeepChangeType.ArrayUpdate) {
|
|
423
|
+
yjsContainer.delete(change.index, 1);
|
|
424
|
+
yjsContainer.insert(change.index, [convertValue(change.newValue)]);
|
|
425
|
+
} else {
|
|
426
|
+
throw failure(`unsupported array change type: ${change.type}`);
|
|
345
427
|
}
|
|
346
|
-
} else if (
|
|
347
|
-
if (
|
|
348
|
-
const key =
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
break;
|
|
354
|
-
}
|
|
355
|
-
case "remove": {
|
|
356
|
-
yjs.delete(key);
|
|
357
|
-
break;
|
|
358
|
-
}
|
|
359
|
-
default: {
|
|
360
|
-
throw failure(`invalid patch operation for map`);
|
|
361
|
-
}
|
|
428
|
+
} else if (yjsContainer instanceof Y.Map) {
|
|
429
|
+
if (change.type === DeepChangeType.ObjectAdd || change.type === DeepChangeType.ObjectUpdate) {
|
|
430
|
+
const key = change.key;
|
|
431
|
+
if (change.newValue === void 0) {
|
|
432
|
+
yjsContainer.delete(key);
|
|
433
|
+
} else {
|
|
434
|
+
yjsContainer.set(key, convertValue(change.newValue));
|
|
362
435
|
}
|
|
363
|
-
} else if (
|
|
364
|
-
const key =
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
const newLength = patch.value;
|
|
369
|
-
if (yjs.length > newLength) {
|
|
370
|
-
const toDelete = yjs.length - newLength;
|
|
371
|
-
yjs.delete(newLength, toDelete);
|
|
372
|
-
} else if (yjs.length < patch.value) {
|
|
373
|
-
const toInsert = patch.value - yjs.length;
|
|
374
|
-
yjs.insert(yjs.length, Array.from({ length: toInsert }).fill(void 0));
|
|
375
|
-
}
|
|
376
|
-
} else {
|
|
377
|
-
yjs.delete(Number(key));
|
|
378
|
-
yjs.insert(Number(key), [convertJsonToYjsData(patch.value)]);
|
|
379
|
-
}
|
|
380
|
-
break;
|
|
381
|
-
}
|
|
382
|
-
case "add": {
|
|
383
|
-
yjs.insert(Number(key), [convertJsonToYjsData(patch.value)]);
|
|
384
|
-
break;
|
|
385
|
-
}
|
|
386
|
-
case "remove": {
|
|
387
|
-
yjs.delete(Number(key));
|
|
388
|
-
break;
|
|
389
|
-
}
|
|
390
|
-
default: {
|
|
391
|
-
throw failure(`invalid patch operation for array`);
|
|
392
|
-
}
|
|
393
|
-
}
|
|
394
|
-
} else if (yjs instanceof Y.Text) ;
|
|
395
|
-
else {
|
|
396
|
-
throw failure(
|
|
397
|
-
`invalid patch path, the Yjs object is of an unkown type, so key "${String(patch.path[0])}" cannot be found in it`
|
|
398
|
-
);
|
|
436
|
+
} else if (change.type === DeepChangeType.ObjectRemove) {
|
|
437
|
+
const key = change.key;
|
|
438
|
+
yjsContainer.delete(key);
|
|
439
|
+
} else {
|
|
440
|
+
throw failure(`unsupported object change type: ${change.type}`);
|
|
399
441
|
}
|
|
442
|
+
} else if (yjsContainer instanceof Y.Text) {
|
|
443
|
+
return;
|
|
400
444
|
} else {
|
|
401
|
-
throw failure(`
|
|
445
|
+
throw failure(`unsupported Yjs container type: ${yjsContainer}`);
|
|
402
446
|
}
|
|
403
447
|
}
|
|
404
448
|
const convertYjsDataToJson = action((yjsData) => {
|
|
@@ -420,79 +464,119 @@ const convertYjsDataToJson = action((yjsData) => {
|
|
|
420
464
|
}
|
|
421
465
|
return yjsData;
|
|
422
466
|
});
|
|
423
|
-
function
|
|
424
|
-
const
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
}
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
467
|
+
function applyYjsEventToMobx(event, boundObject, reconciliationMap) {
|
|
468
|
+
const path = event.path;
|
|
469
|
+
const { value: target } = resolvePath(boundObject, path);
|
|
470
|
+
if (!target) {
|
|
471
|
+
throw failure(`cannot resolve path ${JSON.stringify(path)}`);
|
|
472
|
+
}
|
|
473
|
+
runUnprotected(() => {
|
|
474
|
+
if (event instanceof Y.YMapEvent) {
|
|
475
|
+
applyYMapEventToMobx(event, target, reconciliationMap);
|
|
476
|
+
} else if (event instanceof Y.YArrayEvent) {
|
|
477
|
+
applyYArrayEventToMobx(event, target, reconciliationMap);
|
|
478
|
+
} else if (event instanceof Y.YTextEvent) {
|
|
479
|
+
applyYTextEventToMobx(event, target);
|
|
480
|
+
}
|
|
481
|
+
});
|
|
482
|
+
}
|
|
483
|
+
function processDeletedValue(val, reconciliationMap) {
|
|
484
|
+
if (val && typeof val === "object" && isModel(val)) {
|
|
485
|
+
const sn = getSnapshot(val);
|
|
486
|
+
const id = getSnapshotModelId(sn);
|
|
487
|
+
if (id) {
|
|
488
|
+
reconciliationMap.set(id, val);
|
|
489
|
+
}
|
|
490
|
+
}
|
|
491
|
+
}
|
|
492
|
+
function reviveValue(jsonValue, reconciliationMap) {
|
|
493
|
+
if (jsonValue === null || typeof jsonValue !== "object") {
|
|
494
|
+
return jsonValue;
|
|
495
|
+
}
|
|
496
|
+
if (isFrozenSnapshot(jsonValue)) {
|
|
497
|
+
return frozen(jsonValue.data);
|
|
498
|
+
}
|
|
499
|
+
if (reconciliationMap && jsonValue && typeof jsonValue === "object") {
|
|
500
|
+
const modelId = getSnapshotModelId(jsonValue);
|
|
501
|
+
if (modelId) {
|
|
502
|
+
const existing = reconciliationMap.get(modelId);
|
|
503
|
+
if (existing) {
|
|
504
|
+
reconciliationMap.delete(modelId);
|
|
505
|
+
return existing;
|
|
459
506
|
}
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
507
|
+
}
|
|
508
|
+
}
|
|
509
|
+
return fromSnapshot(jsonValue);
|
|
510
|
+
}
|
|
511
|
+
function applyYMapEventToMobx(event, target, reconciliationMap) {
|
|
512
|
+
const source = event.target;
|
|
513
|
+
event.changes.keys.forEach((change, key) => {
|
|
514
|
+
switch (change.action) {
|
|
515
|
+
case "add":
|
|
516
|
+
case "update": {
|
|
517
|
+
const yjsValue = source.get(key);
|
|
518
|
+
const jsonValue = convertYjsDataToJson(yjsValue);
|
|
519
|
+
if (change.action === "update") {
|
|
520
|
+
processDeletedValue(target[key], reconciliationMap);
|
|
467
521
|
}
|
|
522
|
+
target[key] = reviveValue(jsonValue, reconciliationMap);
|
|
523
|
+
break;
|
|
468
524
|
}
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
});
|
|
478
|
-
retain++;
|
|
479
|
-
});
|
|
525
|
+
case "delete": {
|
|
526
|
+
processDeletedValue(target[key], reconciliationMap);
|
|
527
|
+
if (isModel(target)) {
|
|
528
|
+
remove(target.$, key);
|
|
529
|
+
} else {
|
|
530
|
+
remove(target, key);
|
|
531
|
+
}
|
|
532
|
+
break;
|
|
480
533
|
}
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
534
|
+
default:
|
|
535
|
+
throw failure(`unsupported Yjs map event action: ${change.action}`);
|
|
536
|
+
}
|
|
537
|
+
});
|
|
538
|
+
}
|
|
539
|
+
function applyYArrayEventToMobx(event, target, reconciliationMap) {
|
|
540
|
+
let currentIndex = 0;
|
|
541
|
+
for (const change of event.changes.delta) {
|
|
542
|
+
if (change.retain) {
|
|
543
|
+
currentIndex += change.retain;
|
|
544
|
+
}
|
|
545
|
+
if (change.delete) {
|
|
546
|
+
const deletedItems = target.slice(currentIndex, currentIndex + change.delete);
|
|
547
|
+
deletedItems.forEach((item) => {
|
|
548
|
+
processDeletedValue(item, reconciliationMap);
|
|
549
|
+
});
|
|
550
|
+
target.splice(currentIndex, change.delete);
|
|
551
|
+
}
|
|
552
|
+
if (change.insert) {
|
|
553
|
+
const insertedItems = Array.isArray(change.insert) ? change.insert : [change.insert];
|
|
554
|
+
const values = insertedItems.map((yjsValue) => {
|
|
555
|
+
const jsonValue = convertYjsDataToJson(yjsValue);
|
|
556
|
+
return reviveValue(jsonValue, reconciliationMap);
|
|
557
|
+
});
|
|
558
|
+
target.splice(currentIndex, 0, ...values);
|
|
559
|
+
currentIndex += values.length;
|
|
560
|
+
}
|
|
561
|
+
}
|
|
562
|
+
}
|
|
563
|
+
function applyYTextEventToMobx(event, target) {
|
|
564
|
+
if (target == null ? void 0 : target.deltaList) {
|
|
565
|
+
target.deltaList.push(frozen(event.delta));
|
|
566
|
+
}
|
|
567
|
+
}
|
|
568
|
+
function captureChangeSnapshots(change) {
|
|
569
|
+
if (change.type === DeepChangeType.ArraySplice && change.addedValues.length > 0) {
|
|
570
|
+
const snapshots = change.addedValues.map((v) => isTreeNode(v) ? getSnapshot(v) : v);
|
|
571
|
+
return { ...change, addedValues: snapshots };
|
|
572
|
+
} else if (change.type === DeepChangeType.ArrayUpdate) {
|
|
573
|
+
const snapshot = isTreeNode(change.newValue) ? getSnapshot(change.newValue) : change.newValue;
|
|
574
|
+
return { ...change, newValue: snapshot };
|
|
575
|
+
} else if (change.type === DeepChangeType.ObjectAdd || change.type === DeepChangeType.ObjectUpdate) {
|
|
576
|
+
const snapshot = isTreeNode(change.newValue) ? getSnapshot(change.newValue) : change.newValue;
|
|
577
|
+
return { ...change, newValue: snapshot };
|
|
494
578
|
}
|
|
495
|
-
return
|
|
579
|
+
return change;
|
|
496
580
|
}
|
|
497
581
|
function bindYjsToMobxKeystone({
|
|
498
582
|
yjsDoc,
|
|
@@ -512,95 +596,129 @@ function bindYjsToMobxKeystone({
|
|
|
512
596
|
return applyingYjsChangesToMobxKeystone > 0;
|
|
513
597
|
}
|
|
514
598
|
};
|
|
599
|
+
if (isYjsValueDeleted(yjsObject)) {
|
|
600
|
+
throw failure("cannot apply patch to deleted Yjs value");
|
|
601
|
+
}
|
|
515
602
|
const yjsJson = convertYjsDataToJson(yjsObject);
|
|
516
|
-
|
|
603
|
+
let boundObject;
|
|
604
|
+
let hasInitChanges = false;
|
|
517
605
|
const createBoundObject = () => {
|
|
518
|
-
const
|
|
519
|
-
|
|
606
|
+
const disposeGlobalListener = onGlobalDeepChange((_target, change) => {
|
|
607
|
+
if (change.isInit) {
|
|
608
|
+
hasInitChanges = true;
|
|
609
|
+
}
|
|
520
610
|
});
|
|
521
611
|
try {
|
|
522
|
-
const
|
|
612
|
+
const result = yjsBindingContext.apply(
|
|
523
613
|
() => fromSnapshot(mobxKeystoneType, yjsJson),
|
|
524
614
|
bindingContext
|
|
525
615
|
);
|
|
526
|
-
yjsBindingContext.set(
|
|
527
|
-
return
|
|
616
|
+
yjsBindingContext.set(result, { ...bindingContext, boundObject: result });
|
|
617
|
+
return result;
|
|
528
618
|
} finally {
|
|
529
|
-
|
|
619
|
+
disposeGlobalListener();
|
|
530
620
|
}
|
|
531
621
|
};
|
|
532
|
-
|
|
622
|
+
boundObject = createBoundObject();
|
|
533
623
|
const observeDeepCb = action((events) => {
|
|
534
|
-
const
|
|
624
|
+
const eventsToApply = [];
|
|
535
625
|
events.forEach((event) => {
|
|
536
626
|
var _a;
|
|
537
627
|
if (event.transaction.origin !== yjsOrigin) {
|
|
538
|
-
|
|
628
|
+
eventsToApply.push(event);
|
|
539
629
|
}
|
|
540
630
|
if (event.target instanceof Y.Map || event.target instanceof Y.Array) {
|
|
541
631
|
(_a = getYjsCollectionAtom(event.target)) == null ? void 0 : _a.reportChanged();
|
|
542
632
|
}
|
|
543
633
|
});
|
|
544
|
-
if (
|
|
634
|
+
if (eventsToApply.length > 0) {
|
|
545
635
|
applyingYjsChangesToMobxKeystone++;
|
|
546
636
|
try {
|
|
547
|
-
|
|
637
|
+
const reconciliationMap = /* @__PURE__ */ new Map();
|
|
638
|
+
const initChanges = [];
|
|
639
|
+
const disposeGlobalListener = onGlobalDeepChange((target, change) => {
|
|
640
|
+
if (change.isInit) {
|
|
641
|
+
initChanges.push({ target, change: captureChangeSnapshots(change) });
|
|
642
|
+
}
|
|
643
|
+
});
|
|
644
|
+
try {
|
|
645
|
+
eventsToApply.forEach((event) => {
|
|
646
|
+
applyYjsEventToMobx(event, boundObject, reconciliationMap);
|
|
647
|
+
});
|
|
648
|
+
} finally {
|
|
649
|
+
disposeGlobalListener();
|
|
650
|
+
}
|
|
651
|
+
if (initChanges.length > 0 && !isYjsValueDeleted(yjsObject)) {
|
|
652
|
+
yjsDoc.transact(() => {
|
|
653
|
+
for (const { target, change } of initChanges) {
|
|
654
|
+
const pathToTarget = getParentToChildPath(boundObject, target);
|
|
655
|
+
if (pathToTarget !== void 0) {
|
|
656
|
+
const changeWithCorrectPath = {
|
|
657
|
+
...change,
|
|
658
|
+
path: [...pathToTarget, ...change.path]
|
|
659
|
+
};
|
|
660
|
+
applyMobxChangeToYjsObject(changeWithCorrectPath, yjsObject);
|
|
661
|
+
}
|
|
662
|
+
}
|
|
663
|
+
}, yjsOrigin);
|
|
664
|
+
}
|
|
665
|
+
if (yjsObject instanceof Y.Map || yjsObject instanceof Y.Array) {
|
|
666
|
+
setYjsContainerSnapshot(yjsObject, getSnapshot(boundObject));
|
|
667
|
+
}
|
|
548
668
|
} finally {
|
|
549
669
|
applyingYjsChangesToMobxKeystone--;
|
|
550
670
|
}
|
|
551
671
|
}
|
|
552
672
|
});
|
|
553
673
|
yjsObject.observeDeep(observeDeepCb);
|
|
554
|
-
let
|
|
555
|
-
const
|
|
674
|
+
let pendingChanges = [];
|
|
675
|
+
const disposeOnDeepChange = onDeepChange(boundObject, (change) => {
|
|
556
676
|
if (applyingYjsChangesToMobxKeystone > 0) {
|
|
557
677
|
return;
|
|
558
678
|
}
|
|
559
|
-
|
|
679
|
+
if (change.isInit) {
|
|
680
|
+
return;
|
|
681
|
+
}
|
|
682
|
+
pendingChanges.push(captureChangeSnapshots(change));
|
|
560
683
|
});
|
|
561
|
-
const disposeOnSnapshot = onSnapshot(boundObject, () => {
|
|
562
|
-
if (
|
|
684
|
+
const disposeOnSnapshot = onSnapshot(boundObject, (boundObjectSnapshot) => {
|
|
685
|
+
if (pendingChanges.length === 0) {
|
|
563
686
|
return;
|
|
564
687
|
}
|
|
565
|
-
const
|
|
566
|
-
|
|
688
|
+
const changesToApply = pendingChanges;
|
|
689
|
+
pendingChanges = [];
|
|
567
690
|
if (isYjsValueDeleted(yjsObject)) {
|
|
568
691
|
return;
|
|
569
692
|
}
|
|
570
693
|
yjsDoc.transact(() => {
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
applyMobxKeystonePatchToYjsObject(patch, yjsObject);
|
|
574
|
-
});
|
|
694
|
+
changesToApply.forEach((change) => {
|
|
695
|
+
applyMobxChangeToYjsObject(change, yjsObject);
|
|
575
696
|
});
|
|
576
697
|
}, yjsOrigin);
|
|
698
|
+
if (yjsObject instanceof Y.Map || yjsObject instanceof Y.Array) {
|
|
699
|
+
setYjsContainerSnapshot(yjsObject, boundObjectSnapshot);
|
|
700
|
+
}
|
|
577
701
|
});
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
if (
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
}
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
if (parentToChildPath !== void 0) {
|
|
589
|
-
patches.forEach((patch) => {
|
|
590
|
-
applyMobxKeystonePatchToYjsObject(
|
|
591
|
-
{
|
|
592
|
-
...patch,
|
|
593
|
-
path: [...parentToChildPath, ...patch.path]
|
|
594
|
-
},
|
|
595
|
-
yjsObject
|
|
596
|
-
);
|
|
702
|
+
const finalSnapshot = getSnapshot(boundObject);
|
|
703
|
+
if (hasInitChanges) {
|
|
704
|
+
yjsDoc.transact(() => {
|
|
705
|
+
if (yjsObject instanceof Y.Map) {
|
|
706
|
+
applyJsonObjectToYMap(yjsObject, finalSnapshot, {
|
|
707
|
+
mode: "merge"
|
|
708
|
+
});
|
|
709
|
+
} else if (yjsObject instanceof Y.Array) {
|
|
710
|
+
applyJsonArrayToYArray(yjsObject, finalSnapshot, {
|
|
711
|
+
mode: "merge"
|
|
597
712
|
});
|
|
598
713
|
}
|
|
599
|
-
});
|
|
600
|
-
}
|
|
714
|
+
}, yjsOrigin);
|
|
715
|
+
}
|
|
716
|
+
if (yjsObject instanceof Y.Map || yjsObject instanceof Y.Array) {
|
|
717
|
+
setYjsContainerSnapshot(yjsObject, finalSnapshot);
|
|
718
|
+
}
|
|
601
719
|
const dispose = () => {
|
|
602
720
|
yjsDoc.off("destroy", dispose);
|
|
603
|
-
|
|
721
|
+
disposeOnDeepChange();
|
|
604
722
|
disposeOnSnapshot();
|
|
605
723
|
yjsObject.unobserveDeep(observeDeepCb);
|
|
606
724
|
};
|
|
@@ -621,4 +739,4 @@ export {
|
|
|
621
739
|
yjsBindingContext,
|
|
622
740
|
yjsTextModelId
|
|
623
741
|
};
|
|
624
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9ieC1rZXlzdG9uZS15anMuZXNtLm1qcyIsInNvdXJjZXMiOlsiLi4vc3JjL3V0aWxzL2dldE9yQ3JlYXRlWWpzQ29sbGVjdGlvbkF0b20udHMiLCIuLi9zcmMvdXRpbHMvaXNZanNWYWx1ZURlbGV0ZWQudHMiLCIuLi9zcmMvdXRpbHMvZXJyb3IudHMiLCIuLi9zcmMvYmluZGluZy9yZXNvbHZlWWpzUGF0aC50cyIsIi4uL3NyYy9iaW5kaW5nL3lqc0JpbmRpbmdDb250ZXh0LnRzIiwiLi4vc3JjL2JpbmRpbmcvWWpzVGV4dE1vZGVsLnRzIiwiLi4vc3JjL2JpbmRpbmcvY29udmVydEpzb25Ub1lqc0RhdGEudHMiLCIuLi9zcmMvYmluZGluZy9hcHBseU1vYnhLZXlzdG9uZVBhdGNoVG9ZanNPYmplY3QudHMiLCIuLi9zcmMvYmluZGluZy9jb252ZXJ0WWpzRGF0YVRvSnNvbi50cyIsIi4uL3NyYy9iaW5kaW5nL2NvbnZlcnRZanNFdmVudFRvUGF0Y2hlcy50cyIsIi4uL3NyYy9iaW5kaW5nL2JpbmRZanNUb01vYnhLZXlzdG9uZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJQXRvbSwgY3JlYXRlQXRvbSB9IGZyb20gXCJtb2J4XCJcbmltcG9ydCAqIGFzIFkgZnJvbSBcInlqc1wiXG5cbmNvbnN0IHlqc0NvbGxlY3Rpb25BdG9tcyA9IG5ldyBXZWFrTWFwPFkuTWFwPHVua25vd24+IHwgWS5BcnJheTx1bmtub3duPiwgSUF0b20+KClcblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IGdldFlqc0NvbGxlY3Rpb25BdG9tID0gKFxuICB5anNDb2xsZWN0aW9uOiBZLk1hcDx1bmtub3duPiB8IFkuQXJyYXk8dW5rbm93bj5cbik6IElBdG9tIHwgdW5kZWZpbmVkID0+IHtcbiAgcmV0dXJuIHlqc0NvbGxlY3Rpb25BdG9tcy5nZXQoeWpzQ29sbGVjdGlvbilcbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IGdldE9yQ3JlYXRlWWpzQ29sbGVjdGlvbkF0b20gPSAoXG4gIHlqc0NvbGxlY3Rpb246IFkuTWFwPHVua25vd24+IHwgWS5BcnJheTx1bmtub3duPlxuKTogSUF0b20gPT4ge1xuICBsZXQgYXRvbSA9IHlqc0NvbGxlY3Rpb25BdG9tcy5nZXQoeWpzQ29sbGVjdGlvbilcbiAgaWYgKCFhdG9tKSB7XG4gICAgYXRvbSA9IGNyZWF0ZUF0b20oYHlqc0NvbGxlY3Rpb25BdG9tYClcbiAgICB5anNDb2xsZWN0aW9uQXRvbXMuc2V0KHlqc0NvbGxlY3Rpb24sIGF0b20pXG4gIH1cbiAgcmV0dXJuIGF0b21cbn1cbiIsImltcG9ydCAqIGFzIFkgZnJvbSBcInlqc1wiXG5cbi8qKlxuICogQ2hlY2tzIGlmIGEgWS5qcyB2YWx1ZSBoYXMgYmVlbiBkZWxldGVkIG9yIGl0cyBkb2N1bWVudCBkZXN0cm95ZWQuXG4gKlxuICogQHBhcmFtIHlqc1ZhbHVlIFRoZSBZLmpzIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMgYHRydWVgIGlmIHRoZSB2YWx1ZSBpcyBkZWxldGVkIG9yIGRlc3Ryb3llZCwgYGZhbHNlYCBvdGhlcndpc2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1lqc1ZhbHVlRGVsZXRlZCh5anNWYWx1ZTogdW5rbm93bik6IGJvb2xlYW4ge1xuICBpZiAoeWpzVmFsdWUgaW5zdGFuY2VvZiBZLkFic3RyYWN0VHlwZSkge1xuICAgIHJldHVybiAhISh5anNWYWx1ZSBhcyBhbnkpLl9pdGVtPy5kZWxldGVkIHx8ICEheWpzVmFsdWUuZG9jPy5pc0Rlc3Ryb3llZFxuICB9XG4gIHJldHVybiBmYWxzZVxufVxuIiwiLyoqXHJcbiAqIEEgbW9ieC1rZXlzdG9uZS15anMgZXJyb3IuXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgTW9ieEtleXN0b25lWWpzRXJyb3IgZXh0ZW5kcyBFcnJvciB7XHJcbiAgY29uc3RydWN0b3IobXNnOiBzdHJpbmcpIHtcclxuICAgIHN1cGVyKG1zZylcclxuXHJcbiAgICAvLyBTZXQgdGhlIHByb3RvdHlwZSBleHBsaWNpdGx5LlxyXG4gICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKHRoaXMsIE1vYnhLZXlzdG9uZVlqc0Vycm9yLnByb3RvdHlwZSlcclxuICB9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBAaW50ZXJuYWxcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBmYWlsdXJlKG1zZzogc3RyaW5nKSB7XHJcbiAgcmV0dXJuIG5ldyBNb2J4S2V5c3RvbmVZanNFcnJvcihtc2cpXHJcbn1cclxuIiwiaW1wb3J0ICogYXMgWSBmcm9tIFwieWpzXCJcbmltcG9ydCB7IGZhaWx1cmUgfSBmcm9tIFwiLi4vdXRpbHMvZXJyb3JcIlxuaW1wb3J0IHsgZ2V0T3JDcmVhdGVZanNDb2xsZWN0aW9uQXRvbSB9IGZyb20gXCIuLi91dGlscy9nZXRPckNyZWF0ZVlqc0NvbGxlY3Rpb25BdG9tXCJcblxuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVZanNQYXRoKHlqc09iamVjdDogdW5rbm93biwgcGF0aDogcmVhZG9ubHkgKHN0cmluZyB8IG51bWJlcilbXSk6IHVua25vd24ge1xuICBsZXQgY3VycmVudFlqc09iamVjdDogdW5rbm93biA9IHlqc09iamVjdFxuXG4gIHBhdGguZm9yRWFjaCgocGF0aFBhcnQsIGkpID0+IHtcbiAgICBpZiAoY3VycmVudFlqc09iamVjdCBpbnN0YW5jZW9mIFkuTWFwKSB7XG4gICAgICBnZXRPckNyZWF0ZVlqc0NvbGxlY3Rpb25BdG9tKGN1cnJlbnRZanNPYmplY3QpLnJlcG9ydE9ic2VydmVkKClcbiAgICAgIGNvbnN0IGtleSA9IFN0cmluZyhwYXRoUGFydClcbiAgICAgIGN1cnJlbnRZanNPYmplY3QgPSBjdXJyZW50WWpzT2JqZWN0LmdldChrZXkpXG4gICAgfSBlbHNlIGlmIChjdXJyZW50WWpzT2JqZWN0IGluc3RhbmNlb2YgWS5BcnJheSkge1xuICAgICAgZ2V0T3JDcmVhdGVZanNDb2xsZWN0aW9uQXRvbShjdXJyZW50WWpzT2JqZWN0KS5yZXBvcnRPYnNlcnZlZCgpXG4gICAgICBjb25zdCBrZXkgPSBOdW1iZXIocGF0aFBhcnQpXG4gICAgICBjdXJyZW50WWpzT2JqZWN0ID0gY3VycmVudFlqc09iamVjdC5nZXQoa2V5KVxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBmYWlsdXJlKFxuICAgICAgICBgWS5NYXAgb3IgWS5BcnJheSB3YXMgZXhwZWN0ZWQgYXQgcGF0aCAke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICAgIHBhdGguc2xpY2UoMCwgaSlcbiAgICAgICAgKX0gaW4gb3JkZXIgdG8gcmVzb2x2ZSBwYXRoICR7SlNPTi5zdHJpbmdpZnkocGF0aCl9LCBidXQgZ290ICR7Y3VycmVudFlqc09iamVjdH0gaW5zdGVhZGBcbiAgICAgIClcbiAgICB9XG4gIH0pXG5cbiAgcmV0dXJuIGN1cnJlbnRZanNPYmplY3Rcbn1cbiIsImltcG9ydCB7IEFueVR5cGUsIGNyZWF0ZUNvbnRleHQgfSBmcm9tIFwibW9ieC1rZXlzdG9uZVwiXG5pbXBvcnQgKiBhcyBZIGZyb20gXCJ5anNcIlxuXG4vKipcbiAqIENvbnRleHQgd2l0aCBpbmZvIG9uIGhvdyBhIG1vYngta2V5c3RvbmUgbW9kZWwgaXMgYm91bmQgdG8gYSBZLmpzIGRhdGEgc3RydWN0dXJlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFlqc0JpbmRpbmdDb250ZXh0IHtcbiAgLyoqXG4gICAqIFRoZSBZLmpzIGRvY3VtZW50LlxuICAgKi9cbiAgeWpzRG9jOiBZLkRvY1xuXG4gIC8qKlxuICAgKiBUaGUgYm91bmQgWS5qcyBkYXRhIHN0cnVjdHVyZS5cbiAgICovXG4gIHlqc09iamVjdDogWS5NYXA8dW5rbm93bj4gfCBZLkFycmF5PHVua25vd24+IHwgWS5UZXh0XG5cbiAgLyoqXG4gICAqIFRoZSBtb2J4LWtleXN0b25lIG1vZGVsIHR5cGUuXG4gICAqL1xuICBtb2J4S2V5c3RvbmVUeXBlOiBBbnlUeXBlXG5cbiAgLyoqXG4gICAqIFRoZSBvcmlnaW4gc3ltYm9sIHVzZWQgZm9yIHRyYW5zYWN0aW9ucy5cbiAgICovXG4gIHlqc09yaWdpbjogc3ltYm9sXG5cbiAgLyoqXG4gICAqIFRoZSBib3VuZCBtb2J4LWtleXN0b25lIGluc3RhbmNlLlxuICAgKi9cbiAgYm91bmRPYmplY3Q6IHVua25vd25cblxuICAvKipcbiAgICogV2hldGhlciB3ZSBhcmUgY3VycmVudGx5IGFwcGx5aW5nIFkuanMgY2hhbmdlcyB0byB0aGUgbW9ieC1rZXlzdG9uZSBtb2RlbC5cbiAgICovXG4gIGlzQXBwbHlpbmdZanNDaGFuZ2VzVG9Nb2J4S2V5c3RvbmU6IGJvb2xlYW5cbn1cblxuLyoqXG4gKiBDb250ZXh0IHdpdGggaW5mbyBvbiBob3cgYSBtb2J4LWtleXN0b25lIG1vZGVsIGlzIGJvdW5kIHRvIGEgWS5qcyBkYXRhIHN0cnVjdHVyZS5cbiAqL1xuZXhwb3J0IGNvbnN0IHlqc0JpbmRpbmdDb250ZXh0ID0gY3JlYXRlQ29udGV4dDxZanNCaW5kaW5nQ29udGV4dCB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKVxuIiwiaW1wb3J0IHsgY29tcHV0ZWQsIGNyZWF0ZUF0b20sIElBdG9tLCBvYnNlcnZlLCByZWFjdGlvbiB9IGZyb20gXCJtb2J4XCJcbmltcG9ydCB7XG4gIEZyb3plbixcbiAgZnJvemVuLFxuICBnZXRQYXJlbnRUb0NoaWxkUGF0aCxcbiAgTW9kZWwsXG4gIG1vZGVsLFxuICBvblNuYXBzaG90LFxuICB0UHJvcCxcbiAgdHlwZXMsXG59IGZyb20gXCJtb2J4LWtleXN0b25lXCJcbmltcG9ydCAqIGFzIFkgZnJvbSBcInlqc1wiXG5pbXBvcnQgeyBmYWlsdXJlIH0gZnJvbSBcIi4uL3V0aWxzL2Vycm9yXCJcbmltcG9ydCB7IGlzWWpzVmFsdWVEZWxldGVkIH0gZnJvbSBcIi4uL3V0aWxzL2lzWWpzVmFsdWVEZWxldGVkXCJcbmltcG9ydCB7IHJlc29sdmVZanNQYXRoIH0gZnJvbSBcIi4vcmVzb2x2ZVlqc1BhdGhcIlxuaW1wb3J0IHsgWWpzQmluZGluZ0NvbnRleHQsIHlqc0JpbmRpbmdDb250ZXh0IH0gZnJvbSBcIi4veWpzQmluZGluZ0NvbnRleHRcIlxuXG4vLyBEZWx0YVtdW10sIHNpbmNlIGVhY2ggc2luZ2xlIGNoYW5nZSBpcyBhIERlbHRhW11cbi8vIHdlIHVzZSBmcm96ZW4gc28gdGhhdCB3ZSBjYW4gcmV1c2UgZWFjaCBkZWx0YSBjaGFuZ2VcbmNvbnN0IGRlbHRhTGlzdFR5cGUgPSB0eXBlcy5hcnJheSh0eXBlcy5mcm96ZW4odHlwZXMudW5jaGVja2VkPHVua25vd25bXT4oKSkpXG5cbmV4cG9ydCBjb25zdCB5anNUZXh0TW9kZWxJZCA9IFwibW9ieC1rZXlzdG9uZS15anMvWWpzVGV4dE1vZGVsXCJcblxuLyoqXG4gKiBBIG1vYngta2V5c3RvbmUgbW9kZWwgdGhhdCByZXByZXNlbnRzIGEgWWpzLlRleHQgb2JqZWN0LlxuICovXG5AbW9kZWwoeWpzVGV4dE1vZGVsSWQpXG5leHBvcnQgY2xhc3MgWWpzVGV4dE1vZGVsIGV4dGVuZHMgTW9kZWwoe1xuICBkZWx0YUxpc3Q6IHRQcm9wKGRlbHRhTGlzdFR5cGUsICgpID0+IFtdKSxcbn0pIHtcbiAgLyoqXG4gICAqIEhlbHBlciBmdW5jdGlvbiB0byBjcmVhdGUgYSBZanNUZXh0TW9kZWwgaW5zdGFuY2Ugd2l0aCBhIHNpbXBsZSB0ZXh0LlxuICAgKi9cbiAgc3RhdGljIHdpdGhUZXh0KHRleHQ6IHN0cmluZyk6IFlqc1RleHRNb2RlbCB7XG4gICAgcmV0dXJuIG5ldyBEZWNvcmF0ZWRZanNUZXh0TW9kZWwoe1xuICAgICAgZGVsdGFMaXN0OiBbXG4gICAgICAgIGZyb3plbihbXG4gICAgICAgICAge1xuICAgICAgICAgICAgaW5zZXJ0OiB0ZXh0LFxuICAgICAgICAgIH0sXG4gICAgICAgIF0pLFxuICAgICAgXSxcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBZLmpzIHBhdGggZnJvbSB0aGUgYm91bmQgb2JqZWN0IHRvIHRoZSBZanNUZXh0TW9kZWwgaW5zdGFuY2UuXG4gICAqL1xuICBAY29tcHV0ZWRcbiAgcHJpdmF0ZSBnZXQgX3lqc09iamVjdFBhdGgoKSB7XG4gICAgY29uc3QgY3R4ID0geWpzQmluZGluZ0NvbnRleHQuZ2V0KHRoaXMpXG4gICAgaWYgKGN0eD8uYm91bmRPYmplY3QgPT0gbnVsbCkge1xuICAgICAgdGhyb3cgZmFpbHVyZShcbiAgICAgICAgXCJ0aGUgWWpzVGV4dE1vZGVsIGluc3RhbmNlIG11c3QgYmUgcGFydCBvZiBhIGJvdW5kIG9iamVjdCBiZWZvcmUgaXQgY2FuIGJlIGFjY2Vzc2VkXCJcbiAgICAgIClcbiAgICB9XG5cbiAgICBjb25zdCBwYXRoID0gZ2V0UGFyZW50VG9DaGlsZFBhdGgoY3R4LmJvdW5kT2JqZWN0LCB0aGlzKVxuICAgIGlmICghcGF0aCkge1xuICAgICAgdGhyb3cgZmFpbHVyZShcImEgcGF0aCBmcm9tIHRoZSBib3VuZCBvYmplY3QgdG8gdGhlIFlqc1RleHRNb2RlbCBpbnN0YW5jZSBpcyBub3QgYXZhaWxhYmxlXCIpXG4gICAgfVxuXG4gICAgcmV0dXJuIHBhdGhcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgWWpzLlRleHQgb2JqZWN0IHByZXNlbnQgYXQgdGhpcyBtb2J4LWtleXN0b25lIG5vZGUncyBwYXRoLlxuICAgKi9cbiAgQGNvbXB1dGVkXG4gIHByaXZhdGUgZ2V0IF95anNPYmplY3RBdFBhdGgoKTogdW5rbm93biB7XG4gICAgY29uc3QgcGF0aCA9IHRoaXMuX3lqc09iamVjdFBhdGhcblxuICAgIGNvbnN0IGN0eCA9IHlqc0JpbmRpbmdDb250ZXh0LmdldCh0aGlzKSFcblxuICAgIHJldHVybiByZXNvbHZlWWpzUGF0aChjdHgueWpzT2JqZWN0LCBwYXRoKVxuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBZanMuVGV4dCBvYmplY3QgcmVwcmVzZW50ZWQgYnkgdGhpcyBtb2J4LWtleXN0b25lIG5vZGUuXG4gICAqL1xuICBAY29tcHV0ZWRcbiAgZ2V0IHlqc1RleHQoKTogWS5UZXh0IHtcbiAgICBjb25zdCB5anNPYmplY3QgPSB0aGlzLl95anNPYmplY3RBdFBhdGhcblxuICAgIGlmICghKHlqc09iamVjdCBpbnN0YW5jZW9mIFkuVGV4dCkpIHtcbiAgICAgIHRocm93IGZhaWx1cmUoYFkuVGV4dCB3YXMgZXhwZWN0ZWQgYXQgcGF0aCAke0pTT04uc3RyaW5naWZ5KHRoaXMuX3lqc09iamVjdFBhdGgpfWApXG4gICAgfVxuXG4gICAgcmV0dXJuIHlqc09iamVjdFxuICB9XG5cbiAgLyoqXG4gICAqIEF0b20gdGhhdCBnZXRzIGNoYW5nZWQgd2hlbiB0aGUgYXNzb2NpYXRlZCBZLmpzIHRleHQgY2hhbmdlcy5cbiAgICovXG4gIHlqc1RleHRDaGFuZ2VkQXRvbSA9IGNyZWF0ZUF0b20oXCJ5anNUZXh0Q2hhbmdlZEF0b21cIilcblxuICAvKipcbiAgICogVGhlIHRleHQgdmFsdWUgb2YgdGhlIFlqcy5UZXh0IG9iamVjdC5cbiAgICogU2hvcnRjdXQgZm9yIGB5anNUZXh0LnRvU3RyaW5nKClgLCBidXQgY29tcHV0ZWQuXG4gICAqL1xuICBAY29tcHV0ZWRcbiAgZ2V0IHRleHQoKTogc3RyaW5nIHtcbiAgICB0aGlzLnlqc1RleHRDaGFuZ2VkQXRvbS5yZXBvcnRPYnNlcnZlZCgpXG5cbiAgICBjb25zdCBjdHggPSB5anNCaW5kaW5nQ29udGV4dC5nZXQodGhpcylcbiAgICBpZiAoY3R4Py5ib3VuZE9iamVjdCAhPSBudWxsKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCB5anNUZXh0U3RyaW5nID0gdGhpcy55anNUZXh0LnRvU3RyaW5nKClcbiAgICAgICAgLy8gaWYgdGhlIHlqc1RleHQgaXMgZGV0YWNoZWQsIHRvU3RyaW5nKCkgcmV0dXJucyBhbiBlbXB0eSBzdHJpbmdcbiAgICAgICAgLy8gaW4gdGhhdCBjYXNlIHdlIHNob3VsZCB1c2UgdGhlIGRlbHRhTGlzdCBhcyBhIGZhbGxiYWNrXG4gICAgICAgIGlmICh5anNUZXh0U3RyaW5nICE9PSBcIlwiIHx8IHRoaXMuZGVsdGFMaXN0Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHJldHVybiB5anNUZXh0U3RyaW5nXG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBmYWxsIGJhY2tcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBmYWxsIGJhY2sgdG8gZGVsdGFMaXN0XG4gICAgcmV0dXJuIHRoaXMuZGVsdGFMaXN0VG9UZXh0KClcbiAgfVxuXG4gIHByaXZhdGUgZGVsdGFMaXN0VG9UZXh0KCk6IHN0cmluZyB7XG4gICAgY29uc3QgZG9jID0gbmV3IFkuRG9jKClcbiAgICBjb25zdCB0ZXh0ID0gZG9jLmdldFRleHQoKVxuICAgIHRoaXMuZGVsdGFMaXN0LmZvckVhY2goKGQpID0+IHtcbiAgICAgIHRleHQuYXBwbHlEZWx0YShkLmRhdGEpXG4gICAgfSlcbiAgICByZXR1cm4gdGV4dC50b1N0cmluZygpXG4gIH1cblxuICBwcm90ZWN0ZWQgb25Jbml0KCkge1xuICAgIGNvbnN0IHNob3VsZFJlcGxpY2F0ZVRvWWpzID0gKGN0eDogWWpzQmluZGluZ0NvbnRleHQgfCB1bmRlZmluZWQpOiBjdHggaXMgWWpzQmluZGluZ0NvbnRleHQgPT4ge1xuICAgICAgcmV0dXJuICEhY3R4ICYmICEhY3R4LmJvdW5kT2JqZWN0ICYmICFjdHguaXNBcHBseWluZ1lqc0NoYW5nZXNUb01vYnhLZXlzdG9uZVxuICAgIH1cblxuICAgIGxldCByZWFwcGx5RGVsdGFzVG9ZanNUZXh0ID0gZmFsc2VcbiAgICBjb25zdCBuZXdEZWx0YXM6IEZyb3plbjx1bmtub3duW10+W10gPSBbXVxuXG4gICAgbGV0IGRpc3Bvc2VPYnNlcnZlRGVsdGFMaXN0OiAoKCkgPT4gdm9pZCkgfCB1bmRlZmluZWRcblxuICAgIGNvbnN0IGRpc3Bvc2VSZWFjdGlvblRvRGVsdGFMaXN0UmVmQ2hhbmdlID0gcmVhY3Rpb24oXG4gICAgICAoKSA9PiB0aGlzLiQuZGVsdGFMaXN0LFxuICAgICAgKGRlbHRhTGlzdCkgPT4ge1xuICAgICAgICBkaXNwb3NlT2JzZXJ2ZURlbHRhTGlzdD8uKClcbiAgICAgICAgZGlzcG9zZU9ic2VydmVEZWx0YUxpc3QgPSB1bmRlZmluZWRcblxuICAgICAgICBkaXNwb3NlT2JzZXJ2ZURlbHRhTGlzdCA9IG9ic2VydmUoZGVsdGFMaXN0LCAoY2hhbmdlKSA9PiB7XG4gICAgICAgICAgaWYgKHJlYXBwbHlEZWx0YXNUb1lqc1RleHQpIHtcbiAgICAgICAgICAgIC8vIGFscmVhZHkgZ29ubmEgcmVwbGFjZSB0aGVtIGFsbFxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghc2hvdWxkUmVwbGljYXRlVG9ZanMoeWpzQmluZGluZ0NvbnRleHQuZ2V0KHRoaXMpKSkge1xuICAgICAgICAgICAgLy8geWpzIHRleHQgaXMgYWxyZWFkeSB1cCB0byBkYXRlIHdpdGggdGhlc2UgY2hhbmdlc1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgY2hhbmdlLnR5cGUgPT09IFwic3BsaWNlXCIgJiZcbiAgICAgICAgICAgIGNoYW5nZS5yZW1vdmVkQ291bnQgPT09IDAgJiZcbiAgICAgICAgICAgIGNoYW5nZS5hZGRlZENvdW50ID4gMCAmJlxuICAgICAgICAgICAgY2hhbmdlLmluZGV4ID09PSB0aGlzLmRlbHRhTGlzdC5sZW5ndGhcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIC8vIG9wdGltaXphdGlvbiwganVzdCBhZGRpbmcgbmV3IG9uZXMgdG8gdGhlIGVuZFxuICAgICAgICAgICAgbmV3RGVsdGFzLnB1c2goLi4uY2hhbmdlLmFkZGVkKVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBhbnkgb3RoZXIgY2hhbmdlLCB3ZSBuZWVkIHRvIHJlYXBwbHkgYWxsIGRlbHRhc1xuICAgICAgICAgICAgcmVhcHBseURlbHRhc1RvWWpzVGV4dCA9IHRydWVcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICB9LFxuICAgICAgeyBmaXJlSW1tZWRpYXRlbHk6IHRydWUgfVxuICAgIClcblxuICAgIGNvbnN0IGRpc3Bvc2VPblNuYXBzaG90ID0gb25TbmFwc2hvdCh0aGlzLCAoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAocmVhcHBseURlbHRhc1RvWWpzVGV4dCkge1xuICAgICAgICAgIGNvbnN0IGN0eCA9IHlqc0JpbmRpbmdDb250ZXh0LmdldCh0aGlzKVxuXG4gICAgICAgICAgaWYgKHNob3VsZFJlcGxpY2F0ZVRvWWpzKGN0eCkpIHtcbiAgICAgICAgICAgIGNvbnN0IHsgeWpzVGV4dCB9ID0gdGhpc1xuICAgICAgICAgICAgaWYgKGlzWWpzVmFsdWVEZWxldGVkKHlqc1RleHQpKSB7XG4gICAgICAgICAgICAgIHRocm93IGZhaWx1cmUoXCJjYW5ub3QgcmVhcHBseSBkZWx0YXMgdG8gZGVsZXRlZCBZanMuVGV4dFwiKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjdHgueWpzRG9jLnRyYW5zYWN0KCgpID0+IHtcbiAgICAgICAgICAgICAgLy8gZGlkbid0IGZpbmQgYSBiZXR0ZXIgd2F5IHRoYW4gdGhpcyB0byByZWFwcGx5IGFsbCBkZWx0YXNcbiAgICAgICAgICAgICAgLy8gd2l0aG91dCBoYXZpbmcgdG8gcmUtY3JlYXRlIHRoZSBZLlRleHQgb2JqZWN0XG4gICAgICAgICAgICAgIGlmICh5anNUZXh0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICB5anNUZXh0LmRlbGV0ZSgwLCB5anNUZXh0Lmxlbmd0aClcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHRoaXMuZGVsdGFMaXN0LmZvckVhY2goKGZyb3plbkRlbHRhcykgPT4ge1xuICAgICAgICAgICAgICAgIHlqc1RleHQuYXBwbHlEZWx0YShmcm96ZW5EZWx0YXMuZGF0YSlcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH0sIGN0eC55anNPcmlnaW4pXG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKG5ld0RlbHRhcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgY29uc3QgY3R4ID0geWpzQmluZGluZ0NvbnRleHQuZ2V0KHRoaXMpXG5cbiAgICAgICAgICBpZiAoc2hvdWxkUmVwbGljYXRlVG9ZanMoY3R4KSkge1xuICAgICAgICAgICAgY29uc3QgeyB5anNUZXh0IH0gPSB0aGlzXG4gICAgICAgICAgICBpZiAoaXNZanNWYWx1ZURlbGV0ZWQoeWpzVGV4dCkpIHtcbiAgICAgICAgICAgICAgdGhyb3cgZmFpbHVyZShcImNhbm5vdCByZWFwcGx5IGRlbHRhcyB0byBkZWxldGVkIFlqcy5UZXh0XCIpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGN0eC55anNEb2MudHJhbnNhY3QoKCkgPT4ge1xuICAgICAgICAgICAgICBuZXdEZWx0YXMuZm9yRWFjaCgoZnJvemVuRGVsdGFzKSA9PiB7XG4gICAgICAgICAgICAgICAgeWpzVGV4dC5hcHBseURlbHRhKGZyb3plbkRlbHRhcy5kYXRhKVxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfSwgY3R4Lnlqc09yaWdpbilcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHJlYXBwbHlEZWx0YXNUb1lqc1RleHQgPSBmYWxzZVxuICAgICAgICBuZXdEZWx0YXMubGVuZ3RoID0gMFxuICAgICAgfVxuICAgIH0pXG5cbiAgICBjb25zdCBkaXBvc2VZanNUZXh0Q2hhbmdlZEF0b20gPSBob29rWWpzVGV4dENoYW5nZWRBdG9tKFxuICAgICAgKCkgPT4gdGhpcy55anNUZXh0LFxuICAgICAgdGhpcy55anNUZXh0Q2hhbmdlZEF0b21cbiAgICApXG5cbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgZGlzcG9zZU9uU25hcHNob3QoKVxuICAgICAgZGlzcG9zZVJlYWN0aW9uVG9EZWx0YUxpc3RSZWZDaGFuZ2UoKVxuICAgICAgZGlzcG9zZU9ic2VydmVEZWx0YUxpc3Q/LigpXG4gICAgICBkaXNwb3NlT2JzZXJ2ZURlbHRhTGlzdCA9IHVuZGVmaW5lZFxuXG4gICAgICBkaXBvc2VZanNUZXh0Q2hhbmdlZEF0b20oKVxuICAgIH1cbiAgfVxufVxuXG4vLyB3ZSB1c2UgdGhpcyB0cmljayBqdXN0IHRvIGF2b2lkIGEgYmFiZWwgYnVnIHRoYXQgY2F1c2VzIGNsYXNzZXMgdXNlZCBpbnNpZGUgY2xhc3NlcyBub3QgdG8gYmUgb3ZlcnJpZGVuXG4vLyBieSB0aGUgZGVjb3JhdG9yXG5jb25zdCBEZWNvcmF0ZWRZanNUZXh0TW9kZWwgPSBZanNUZXh0TW9kZWxcblxuZnVuY3Rpb24gaG9va1lqc1RleHRDaGFuZ2VkQXRvbShnZXRZanNUZXh0OiAoKSA9PiBZLlRleHQsIHRleHRDaGFuZ2VkQXRvbTogSUF0b20pIHtcbiAgbGV0IGRpc3Bvc2VPYnNlcnZlWWpzVGV4dDogKCgpID0+IHZvaWQpIHwgdW5kZWZpbmVkXG5cbiAgY29uc3Qgb2JzZXJ2ZUZuID0gKCkgPT4ge1xuICAgIHRleHRDaGFuZ2VkQXRvbS5yZXBvcnRDaGFuZ2VkKClcbiAgfVxuXG4gIGNvbnN0IGRpc3Bvc2VSZWFjdGlvblRvWVRleHRDaGFuZ2UgPSByZWFjdGlvbihcbiAgICAoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCB5anNUZXh0ID0gZ2V0WWpzVGV4dCgpXG4gICAgICAgIHJldHVybiBpc1lqc1ZhbHVlRGVsZXRlZCh5anNUZXh0KSA/IHVuZGVmaW5lZCA6IHlqc1RleHRcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgICB9XG4gICAgfSxcbiAgICAoeWpzVGV4dCkgPT4ge1xuICAgICAgZGlzcG9zZU9ic2VydmVZanNUZXh0Py4oKVxuICAgICAgZGlzcG9zZU9ic2VydmVZanNUZXh0ID0gdW5kZWZpbmVkXG5cbiAgICAgIGlmICh5anNUZXh0KSB7XG4gICAgICAgIHlqc1RleHQub2JzZXJ2ZShvYnNlcnZlRm4pXG5cbiAgICAgICAgZGlzcG9zZU9ic2VydmVZanNUZXh0ID0gKCkgPT4ge1xuICAgICAgICAgIHlqc1RleHQudW5vYnNlcnZlKG9ic2VydmVGbilcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0ZXh0Q2hhbmdlZEF0b20ucmVwb3J0Q2hhbmdlZCgpXG4gICAgfSxcbiAgICB7XG4gICAgICBmaXJlSW1tZWRpYXRlbHk6IHRydWUsXG4gICAgfVxuICApXG5cbiAgcmV0dXJuICgpID0+IHtcbiAgICBkaXNwb3NlUmVhY3Rpb25Ub1lUZXh0Q2hhbmdlKClcbiAgICBkaXNwb3NlT2JzZXJ2ZVlqc1RleHQ/LigpXG4gICAgZGlzcG9zZU9ic2VydmVZanNUZXh0ID0gdW5kZWZpbmVkXG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIFkgZnJvbSBcInlqc1wiXG5pbXBvcnQgeyBZanNUZXh0TW9kZWwsIHlqc1RleHRNb2RlbElkIH0gZnJvbSBcIi4vWWpzVGV4dE1vZGVsXCJcbmltcG9ydCB7IFNuYXBzaG90T3V0T2YgfSBmcm9tIFwibW9ieC1rZXlzdG9uZVwiXG5pbXBvcnQgeyBZanNEYXRhIH0gZnJvbSBcIi4vY29udmVydFlqc0RhdGFUb0pzb25cIlxuaW1wb3J0IHsgUGxhaW5BcnJheSwgUGxhaW5PYmplY3QsIFBsYWluUHJpbWl0aXZlLCBQbGFpblZhbHVlIH0gZnJvbSBcIi4uL3BsYWluVHlwZXNcIlxuXG5mdW5jdGlvbiBpc1BsYWluUHJpbWl0aXZlKHY6IFBsYWluVmFsdWUpOiB2IGlzIFBsYWluUHJpbWl0aXZlIHtcbiAgY29uc3QgdCA9IHR5cGVvZiB2XG4gIHJldHVybiB0ID09PSBcInN0cmluZ1wiIHx8IHQgPT09IFwibnVtYmVyXCIgfHwgdCA9PT0gXCJib29sZWFuXCIgfHwgdiA9PT0gbnVsbCB8fCB2ID09PSB1bmRlZmluZWRcbn1cblxuZnVuY3Rpb24gaXNQbGFpbkFycmF5KHY6IFBsYWluVmFsdWUpOiB2IGlzIFBsYWluQXJyYXkge1xuICByZXR1cm4gQXJyYXkuaXNBcnJheSh2KVxufVxuXG5mdW5jdGlvbiBpc1BsYWluT2JqZWN0KHY6IFBsYWluVmFsdWUpOiB2IGlzIFBsYWluT2JqZWN0IHtcbiAgcmV0dXJuICFpc1BsYWluQXJyYXkodikgJiYgdHlwZW9mIHYgPT09IFwib2JqZWN0XCIgJiYgdiAhPT0gbnVsbFxufVxuXG4vKipcbiAqIENvbnZlcnRzIGEgcGxhaW4gdmFsdWUgdG8gYSBZLmpzIGRhdGEgc3RydWN0dXJlLlxuICogT2JqZWN0cyBhcmUgY29udmVydGVkIHRvIFkuTWFwcywgYXJyYXlzIHRvIFkuQXJyYXlzLCBwcmltaXRpdmVzIGFyZSB1bnRvdWNoZWQuXG4gKiBGcm96ZW4gdmFsdWVzIGFyZSBhIHNwZWNpYWwgY2FzZSBhbmQgdGhleSBhcmUga2VwdCBhcyBpbW11dGFibGUgcGxhaW4gdmFsdWVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29udmVydEpzb25Ub1lqc0RhdGEodjogUGxhaW5WYWx1ZSk6IFlqc0RhdGEge1xuICBpZiAoaXNQbGFpblByaW1pdGl2ZSh2KSkge1xuICAgIHJldHVybiB2XG4gIH1cblxuICBpZiAoaXNQbGFpbkFycmF5KHYpKSB7XG4gICAgY29uc3QgYXJyID0gbmV3IFkuQXJyYXkoKVxuICAgIGFwcGx5SnNvbkFycmF5VG9ZQXJyYXkoYXJyLCB2KVxuICAgIHJldHVybiBhcnJcbiAgfVxuXG4gIGlmIChpc1BsYWluT2JqZWN0KHYpKSB7XG4gICAgaWYgKHYuJGZyb3plbiA9PT0gdHJ1ZSkge1xuICAgICAgLy8gZnJvemVuIHZhbHVlLCBzYXZlIGFzIGltbXV0YWJsZSBvYmplY3RcbiAgICAgIHJldHVybiB2XG4gICAgfVxuXG4gICAgaWYgKHYuJG1vZGVsVHlwZSA9PT0geWpzVGV4dE1vZGVsSWQpIHtcbiAgICAgIGNvbnN0IHRleHQgPSBuZXcgWS5UZXh0KClcbiAgICAgIGNvbnN0IHlqc1RleHRNb2RlbCA9IHYgYXMgdW5rbm93biBhcyBTbmFwc2hvdE91dE9mPFlqc1RleHRNb2RlbD5cbiAgICAgIHlqc1RleHRNb2RlbC5kZWx0YUxpc3QuZm9yRWFjaCgoZnJvemVuRGVsdGFzKSA9PiB7XG4gICAgICAgIHRleHQuYXBwbHlEZWx0YShmcm96ZW5EZWx0YXMuZGF0YSlcbiAgICAgIH0pXG4gICAgICByZXR1cm4gdGV4dFxuICAgIH1cblxuICAgIGNvbnN0IG1hcCA9IG5ldyBZLk1hcCgpXG4gICAgYXBwbHlKc29uT2JqZWN0VG9ZTWFwKG1hcCwgdilcbiAgICByZXR1cm4gbWFwXG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoYHVuc3VwcG9ydGVkIHZhbHVlIHR5cGU6ICR7dn1gKVxufVxuXG4vKipcbiAqIEFwcGxpZXMgYSBKU09OIGFycmF5IHRvIGEgWS5BcnJheSwgdXNpbmcgdGhlIGNvbnZlcnRKc29uVG9ZanNEYXRhIHRvIGNvbnZlcnQgdGhlIHZhbHVlcy5cbiAqL1xuZXhwb3J0IGNvbnN0IGFwcGx5SnNvbkFycmF5VG9ZQXJyYXkgPSAoZGVzdDogWS5BcnJheTxhbnk+LCBzb3VyY2U6IFBsYWluQXJyYXkpID0+IHtcbiAgZGVzdC5wdXNoKHNvdXJjZS5tYXAoY29udmVydEpzb25Ub1lqc0RhdGEpKVxufVxuXG4vKipcbiAqIEFwcGxpZXMgYSBKU09OIG9iamVjdCB0byBhIFkuTWFwLCB1c2luZyB0aGUgY29udmVydEpzb25Ub1lqc0RhdGEgdG8gY29udmVydCB0aGUgdmFsdWVzLlxuICovXG5leHBvcnQgY29uc3QgYXBwbHlKc29uT2JqZWN0VG9ZTWFwID0gKGRlc3Q6IFkuTWFwPGFueT4sIHNvdXJjZTogUGxhaW5PYmplY3QpID0+IHtcbiAgT2JqZWN0LmVudHJpZXMoc291cmNlKS5mb3JFYWNoKChbaywgdl0pID0+IHtcbiAgICBkZXN0LnNldChrLCBjb252ZXJ0SnNvblRvWWpzRGF0YSh2KSlcbiAgfSlcbn1cbiIsImltcG9ydCB7IFBhdGNoIH0gZnJvbSBcIm1vYngta2V5c3RvbmVcIlxuaW1wb3J0ICogYXMgWSBmcm9tIFwieWpzXCJcbmltcG9ydCB7IFBsYWluVmFsdWUgfSBmcm9tIFwiLi4vcGxhaW5UeXBlc1wiXG5pbXBvcnQgeyBmYWlsdXJlIH0gZnJvbSBcIi4uL3V0aWxzL2Vycm9yXCJcbmltcG9ydCB7IGlzWWpzVmFsdWVEZWxldGVkIH0gZnJvbSBcIi4uL3V0aWxzL2lzWWpzVmFsdWVEZWxldGVkXCJcbmltcG9ydCB7IGNvbnZlcnRKc29uVG9ZanNEYXRhIH0gZnJvbSBcIi4vY29udmVydEpzb25Ub1lqc0RhdGFcIlxuXG5leHBvcnQgZnVuY3Rpb24gYXBwbHlNb2J4S2V5c3RvbmVQYXRjaFRvWWpzT2JqZWN0KHBhdGNoOiBQYXRjaCwgeWpzOiB1bmtub3duKTogdm9pZCB7XG4gIGlmIChpc1lqc1ZhbHVlRGVsZXRlZCh5anMpKSB7XG4gICAgdGhyb3cgZmFpbHVyZShcImNhbm5vdCBhcHBseSBwYXRjaCB0byBkZWxldGVkIFlqcyB2YWx1ZVwiKVxuICB9XG5cbiAgaWYgKHBhdGNoLnBhdGgubGVuZ3RoID4gMSkge1xuICAgIGNvbnN0IFtrZXksIC4uLnJlc3RdID0gcGF0Y2gucGF0aFxuXG4gICAgaWYgKHlqcyBpbnN0YW5jZW9mIFkuTWFwKSB7XG4gICAgICBjb25zdCBjaGlsZCA9IHlqcy5nZXQoU3RyaW5nKGtleSkpIGFzIHVua25vd25cbiAgICAgIGlmIChjaGlsZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRocm93IGZhaWx1cmUoXG4gICAgICAgICAgYGludmFsaWQgcGF0Y2ggcGF0aCwga2V5IFwiJHtrZXl9XCIgbm90IGZvdW5kIGluIFlqcyBtYXAgLSBwYXRjaDogJHtKU09OLnN0cmluZ2lmeShwYXRjaCl9YFxuICAgICAgICApXG4gICAgICB9XG4gICAgICBhcHBseU1vYnhLZXlzdG9uZVBhdGNoVG9ZanNPYmplY3QoeyAuLi5wYXRjaCwgcGF0aDogcmVzdCB9LCBjaGlsZClcbiAgICB9IGVsc2UgaWYgKHlqcyBpbnN0YW5jZW9mIFkuQXJyYXkpIHtcbiAgICAgIGNvbnN0IGNoaWxkID0geWpzLmdldChOdW1iZXIoa2V5KSkgYXMgdW5rbm93blxuICAgICAgaWYgKGNoaWxkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhyb3cgZmFpbHVyZShcbiAgICAgICAgICBgaW52YWxpZCBwYXRjaCBwYXRoLCBrZXkgXCIke2tleX1cIiBub3QgZm91bmQgaW4gWWpzIGFycmF5IC0gcGF0Y2g6ICR7SlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAgICBwYXRjaFxuICAgICAgICAgICl9YFxuICAgICAgICApXG4gICAgICB9XG4gICAgICBhcHBseU1vYnhLZXlzdG9uZVBhdGNoVG9ZanNPYmplY3QoeyAuLi5wYXRjaCwgcGF0aDogcmVzdCB9LCBjaGlsZClcbiAgICB9IGVsc2UgaWYgKHlqcyBpbnN0YW5jZW9mIFkuVGV4dCkge1xuICAgICAgLy8gY2hhbmdlcyB0byBkZWx0YUxpc3Qgd2lsbCBiZSBoYW5kbGVkIGJ5IHRoZSBhcnJheSBvYnNlcnZlIGluIHRoZSBZanNUZXh0TW9kZWwgY2xhc3NcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgZmFpbHVyZShcbiAgICAgICAgYGludmFsaWQgcGF0Y2ggcGF0aCwga2V5IFwiJHtrZXl9XCIgbm90IGZvdW5kIGluIHVua25vd24gWWpzIG9iamVjdCAtIHBhdGNoOiAke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICAgIHBhdGNoXG4gICAgICAgICl9YFxuICAgICAgKVxuICAgIH1cbiAgfSBlbHNlIGlmIChwYXRjaC5wYXRoLmxlbmd0aCA9PT0gMSkge1xuICAgIGlmICh5anMgaW5zdGFuY2VvZiBZLk1hcCkge1xuICAgICAgY29uc3Qga2V5ID0gU3RyaW5nKHBhdGNoLnBhdGhbMF0pXG5cbiAgICAgIHN3aXRjaCAocGF0Y2gub3ApIHtcbiAgICAgICAgY2FzZSBcImFkZFwiOlxuICAgICAgICBjYXNlIFwicmVwbGFjZVwiOiB7XG4gICAgICAgICAgeWpzLnNldChrZXksIGNvbnZlcnRKc29uVG9ZanNEYXRhKHBhdGNoLnZhbHVlIGFzIFBsYWluVmFsdWUpKVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBcInJlbW92ZVwiOiB7XG4gICAgICAgICAgeWpzLmRlbGV0ZShrZXkpXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgdGhyb3cgZmFpbHVyZShgaW52YWxpZCBwYXRjaCBvcGVyYXRpb24gZm9yIG1hcGApXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHlqcyBpbnN0YW5jZW9mIFkuQXJyYXkpIHtcbiAgICAgIGNvbnN0IGtleSA9IHBhdGNoLnBhdGhbMF1cblxuICAgICAgc3dpdGNoIChwYXRjaC5vcCkge1xuICAgICAgICBjYXNlIFwicmVwbGFjZVwiOiB7XG4gICAgICAgICAgaWYgKGtleSA9PT0gXCJsZW5ndGhcIikge1xuICAgICAgICAgICAgY29uc3QgbmV3TGVuZ3RoID0gcGF0Y2gudmFsdWUgYXMgbnVtYmVyXG4gICAgICAgICAgICBpZiAoeWpzLmxlbmd0aCA+IG5ld0xlbmd0aCkge1xuICAgICAgICAgICAgICBjb25zdCB0b0RlbGV0ZSA9IHlqcy5sZW5ndGggLSBuZXdMZW5ndGhcbiAgICAgICAgICAgICAgeWpzLmRlbGV0ZShuZXdMZW5ndGgsIHRvRGVsZXRlKVxuICAgICAgICAgICAgfSBlbHNlIGlmICh5anMubGVuZ3RoIDwgcGF0Y2gudmFsdWUpIHtcbiAgICAgICAgICAgICAgY29uc3QgdG9JbnNlcnQgPSBwYXRjaC52YWx1ZSAtIHlqcy5sZW5ndGhcbiAgICAgICAgICAgICAgeWpzLmluc2VydCh5anMubGVuZ3RoLCBBcnJheS5mcm9tKHsgbGVuZ3RoOiB0b0luc2VydCB9KS5maWxsKHVuZGVmaW5lZCkpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHlqcy5kZWxldGUoTnVtYmVyKGtleSkpXG4gICAgICAgICAgICB5anMuaW5zZXJ0KE51bWJlcihrZXkpLCBbY29udmVydEpzb25Ub1lqc0RhdGEocGF0Y2gudmFsdWUgYXMgUGxhaW5WYWx1ZSldKVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgXCJhZGRcIjoge1xuICAgICAgICAgIHlqcy5pbnNlcnQoTnVtYmVyKGtleSksIFtjb252ZXJ0SnNvblRvWWpzRGF0YShwYXRjaC52YWx1ZSBhcyBQbGFpblZhbHVlKV0pXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgICBjYXNlIFwicmVtb3ZlXCI6IHtcbiAgICAgICAgICB5anMuZGVsZXRlKE51bWJlcihrZXkpKVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgIHRocm93IGZhaWx1cmUoYGludmFsaWQgcGF0Y2ggb3BlcmF0aW9uIGZvciBhcnJheWApXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHlqcyBpbnN0YW5jZW9mIFkuVGV4dCkge1xuICAgICAgLy8gaW5pdGlhbGl6YXRpb24gb2YgYSBZanNUZXh0TW9kZWwsIGRvIG5vdGhpbmdcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgZmFpbHVyZShcbiAgICAgICAgYGludmFsaWQgcGF0Y2ggcGF0aCwgdGhlIFlqcyBvYmplY3QgaXMgb2YgYW4gdW5rb3duIHR5cGUsIHNvIGtleSBcIiR7U3RyaW5nKHBhdGNoLnBhdGhbMF0pfVwiIGNhbm5vdCBiZSBmb3VuZCBpbiBpdGBcbiAgICAgIClcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgZmFpbHVyZShgaW52YWxpZCBwYXRjaCBwYXRoLCBpdCBjYW5ub3QgYmUgZW1wdHlgKVxuICB9XG59XG4iLCJpbXBvcnQgeyBhY3Rpb24gfSBmcm9tIFwibW9ieFwiXG5pbXBvcnQgeyBtb2RlbFNuYXBzaG90T3V0V2l0aE1ldGFkYXRhIH0gZnJvbSBcIm1vYngta2V5c3RvbmVcIlxuaW1wb3J0ICogYXMgWSBmcm9tIFwieWpzXCJcbmltcG9ydCB7IFBsYWluT2JqZWN0LCBQbGFpblZhbHVlIH0gZnJvbSBcIi4uL3BsYWluVHlwZXNcIlxuaW1wb3J0IHsgWWpzVGV4dE1vZGVsIH0gZnJvbSBcIi4vWWpzVGV4dE1vZGVsXCJcblxuZXhwb3J0IHR5cGUgWWpzRGF0YSA9IFkuQXJyYXk8YW55PiB8IFkuTWFwPGFueT4gfCBZLlRleHQgfCBQbGFpblZhbHVlXG5cbmV4cG9ydCBjb25zdCBjb252ZXJ0WWpzRGF0YVRvSnNvbiA9IGFjdGlvbigoeWpzRGF0YTogWWpzRGF0YSk6IFBsYWluVmFsdWUgPT4ge1xuICBpZiAoeWpzRGF0YSBpbnN0YW5jZW9mIFkuQXJyYXkpIHtcbiAgICByZXR1cm4geWpzRGF0YS5tYXAoKHYpID0+IGNvbnZlcnRZanNEYXRhVG9Kc29uKHYpKVxuICB9XG5cbiAgaWYgKHlqc0RhdGEgaW5zdGFuY2VvZiBZLk1hcCkge1xuICAgIGNvbnN0IG9iajogUGxhaW5PYmplY3QgPSB7fVxuICAgIHlqc0RhdGEuZm9yRWFjaCgodiwgaykgPT4ge1xuICAgICAgb2JqW2tdID0gY29udmVydFlqc0RhdGFUb0pzb24odilcbiAgICB9KVxuICAgIHJldHVybiBvYmpcbiAgfVxuXG4gIGlmICh5anNEYXRhIGluc3RhbmNlb2YgWS5UZXh0KSB7XG4gICAgY29uc3QgZGVsdGFzID0geWpzRGF0YS50b0RlbHRhKCkgYXMgdW5rbm93bltdXG5cbiAgICByZXR1cm4gbW9kZWxTbmFwc2hvdE91dFdpdGhNZXRhZGF0YShZanNUZXh0TW9kZWwsIHtcbiAgICAgIGRlbHRhTGlzdDogZGVsdGFzLmxlbmd0aCA+IDAgPyBbeyAkZnJvemVuOiB0cnVlLCBkYXRhOiBkZWx0YXMgfV0gOiBbXSxcbiAgICB9KSBhcyB1bmtub3duIGFzIFBsYWluVmFsdWVcbiAgfVxuXG4gIC8vIGFzc3VtZSBpdCdzIGEgcHJpbWl0aXZlXG4gIHJldHVybiB5anNEYXRhXG59KVxuIiwiaW1wb3J0IHsgUGF0Y2ggfSBmcm9tIFwibW9ieC1rZXlzdG9uZVwiXG5pbXBvcnQgKiBhcyBZIGZyb20gXCJ5anNcIlxuaW1wb3J0IHsgZmFpbHVyZSB9IGZyb20gXCIuLi91dGlscy9lcnJvclwiXG5pbXBvcnQgeyBjb252ZXJ0WWpzRGF0YVRvSnNvbiB9IGZyb20gXCIuL2NvbnZlcnRZanNEYXRhVG9Kc29uXCJcblxuZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnRZanNFdmVudFRvUGF0Y2hlcyhldmVudDogWS5ZRXZlbnQ8YW55Pik6IFBhdGNoW10ge1xuICBjb25zdCBwYXRjaGVzOiBQYXRjaFtdID0gW11cblxuICBpZiAoZXZlbnQgaW5zdGFuY2VvZiBZLllNYXBFdmVudCkge1xuICAgIGNvbnN0IHNvdXJjZSA9IGV2ZW50LnRhcmdldFxuXG4gICAgZXZlbnQuY2hhbmdlcy5rZXlzLmZvckVhY2goKGNoYW5nZSwga2V5KSA9PiB7XG4gICAgICBjb25zdCBwYXRoID0gWy4uLmV2ZW50LnBhdGgsIGtleV1cblxuICAgICAgc3dpdGNoIChjaGFuZ2UuYWN0aW9uKSB7XG4gICAgICAgIGNhc2UgXCJhZGRcIjpcbiAgICAgICAgICBwYXRjaGVzLnB1c2goe1xuICAgICAgICAgICAgb3A6IFwiYWRkXCIsXG4gICAgICAgICAgICBwYXRoLFxuICAgICAgICAgICAgdmFsdWU6IGNvbnZlcnRZanNEYXRhVG9Kc29uKHNvdXJjZS5nZXQoa2V5KSksXG4gICAgICAgICAgfSlcbiAgICAgICAgICBicmVha1xuXG4gICAgICAgIGNhc2UgXCJ1cGRhdGVcIjpcbiAgICAgICAgICBwYXRjaGVzLnB1c2goe1xuICAgICAgICAgICAgb3A6IFwicmVwbGFjZVwiLFxuICAgICAgICAgICAgcGF0aCxcbiAgICAgICAgICAgIHZhbHVlOiBjb252ZXJ0WWpzRGF0YVRvSnNvbihzb3VyY2UuZ2V0KGtleSkpLFxuICAgICAgICAgIH0pXG4gICAgICAgICAgYnJlYWtcblxuICAgICAgICBjYXNlIFwiZGVsZXRlXCI6XG4gICAgICAgICAgcGF0Y2hlcy5wdXNoKHtcbiAgICAgICAgICAgIG9wOiBcInJlbW92ZVwiLFxuICAgICAgICAgICAgcGF0aCxcbiAgICAgICAgICB9KVxuICAgICAgICAgIGJyZWFrXG5cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB0aHJvdyBmYWlsdXJlKGB1bnN1cHBvcnRlZCBZanMgbWFwIGV2ZW50IGFjdGlvbjogJHtjaGFuZ2UuYWN0aW9ufWApXG4gICAgICB9XG4gICAgfSlcbiAgfSBlbHNlIGlmIChldmVudCBpbnN0YW5jZW9mIFkuWUFycmF5RXZlbnQpIHtcbiAgICBsZXQgcmV0YWluID0gMFxuICAgIGV2ZW50LmNoYW5nZXMuZGVsdGEuZm9yRWFjaCgoY2hhbmdlKSA9PiB7XG4gICAgICBpZiAoY2hhbmdlLnJldGFpbikge1xuICAgICAgICByZXRhaW4gKz0gY2hhbmdlLnJldGFpblxuICAgICAgfVxuXG4gICAgICBpZiAoY2hhbmdlLmRlbGV0ZSkge1xuICAgICAgICAvLyByZW1vdmUgWCBpdGVtcyBhdCByZXRhaW4gcG9zaXRpb25cbiAgICAgICAgY29uc3QgcGF0aCA9IFsuLi5ldmVudC5wYXRoLCByZXRhaW5dXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hhbmdlLmRlbGV0ZTsgaSsrKSB7XG4gICAgICAgICAgcGF0Y2hlcy5wdXNoKHtcbiAgICAgICAgICAgIG9wOiBcInJlbW92ZVwiLFxuICAgICAgICAgICAgcGF0aCxcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChjaGFuZ2UuaW5zZXJ0KSB7XG4gICAgICAgIGNvbnN0IG5ld1ZhbHVlcyA9IEFycmF5LmlzQXJyYXkoY2hhbmdlLmluc2VydCkgPyBjaGFuZ2UuaW5zZXJ0IDogW2NoYW5nZS5pbnNlcnRdXG4gICAgICAgIG5ld1ZhbHVlcy5mb3JFYWNoKCh2KSA9PiB7XG4gICAgICAgICAgY29uc3QgcGF0aCA9IFsuLi5ldmVudC5wYXRoLCByZXRhaW5dXG4gICAgICAgICAgcGF0Y2hlcy5wdXNoKHtcbiAgICAgICAgICAgIG9wOiBcImFkZFwiLFxuICAgICAgICAgICAgcGF0aCxcbiAgICAgICAgICAgIHZhbHVlOiBjb252ZXJ0WWpzRGF0YVRvSnNvbih2KSxcbiAgICAgICAgICB9KVxuICAgICAgICAgIHJldGFpbisrXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfSlcbiAgfSBlbHNlIGlmIChldmVudCBpbnN0YW5jZW9mIFkuWVRleHRFdmVudCkge1xuICAgIGNvbnN0IHBhdGggPSBbLi4uZXZlbnQucGF0aCwgXCJkZWx0YUxpc3RcIiwgLTEgLyogbGFzdCBpdGVtICovXVxuICAgIHBhdGNoZXMucHVzaCh7XG4gICAgICBvcDogXCJhZGRcIixcbiAgICAgIHBhdGgsXG4gICAgICB2YWx1ZTogeyAkZnJvemVuOiB0cnVlLCBkYXRhOiBldmVudC5kZWx0YSB9LFxuICAgIH0pXG4gIH1cblxuICByZXR1cm4gcGF0Y2hlc1xufVxuIiwiaW1wb3J0IHsgYWN0aW9uIH0gZnJvbSBcIm1vYnhcIlxuaW1wb3J0IHtcbiAgQW55RGF0YU1vZGVsLFxuICBBbnlNb2RlbCxcbiAgQW55U3RhbmRhcmRUeXBlLFxuICBhcHBseVBhdGNoZXMsXG4gIGZyb21TbmFwc2hvdCxcbiAgZ2V0UGFyZW50VG9DaGlsZFBhdGgsXG4gIE1vZGVsQ2xhc3MsXG4gIG9uR2xvYmFsUGF0Y2hlcyxcbiAgb25QYXRjaGVzLFxuICBvblNuYXBzaG90LFxuICBQYXRjaCxcbiAgU25hcHNob3RJbk9mLFxuICBUeXBlVG9EYXRhLFxufSBmcm9tIFwibW9ieC1rZXlzdG9uZVwiXG5pbXBvcnQgKiBhcyBZIGZyb20gXCJ5anNcIlxuaW1wb3J0IHsgZ2V0WWpzQ29sbGVjdGlvbkF0b20gfSBmcm9tIFwiLi4vdXRpbHMvZ2V0T3JDcmVhdGVZanNDb2xsZWN0aW9uQXRvbVwiXG5pbXBvcnQgeyBpc1lqc1ZhbHVlRGVsZXRlZCB9IGZyb20gXCIuLi91dGlscy9pc1lqc1ZhbHVlRGVsZXRlZFwiXG5pbXBvcnQgeyBhcHBseU1vYnhLZXlzdG9uZVBhdGNoVG9ZanNPYmplY3QgfSBmcm9tIFwiLi9hcHBseU1vYnhLZXlzdG9uZVBhdGNoVG9ZanNPYmplY3RcIlxuaW1wb3J0IHsgY29udmVydFlqc0RhdGFUb0pzb24gfSBmcm9tIFwiLi9jb252ZXJ0WWpzRGF0YVRvSnNvblwiXG5pbXBvcnQgeyBjb252ZXJ0WWpzRXZlbnRUb1BhdGNoZXMgfSBmcm9tIFwiLi9jb252ZXJ0WWpzRXZlbnRUb1BhdGNoZXNcIlxuaW1wb3J0IHsgWWpzQmluZGluZ0NvbnRleHQsIHlqc0JpbmRpbmdDb250ZXh0IH0gZnJvbSBcIi4veWpzQmluZGluZ0NvbnRleHRcIlxuXG4vKipcbiAqIENyZWF0ZXMgYSBiaWRpcmVjdGlvbmFsIGJpbmRpbmcgYmV0d2VlbiBhIFkuanMgZGF0YSBzdHJ1Y3R1cmUgYW5kIGEgbW9ieC1rZXlzdG9uZSBtb2RlbC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJpbmRZanNUb01vYnhLZXlzdG9uZTxcbiAgVFR5cGUgZXh0ZW5kcyBBbnlTdGFuZGFyZFR5cGUgfCBNb2RlbENsYXNzPEFueU1vZGVsPiB8IE1vZGVsQ2xhc3M8QW55RGF0YU1vZGVsPixcbj4oe1xuICB5anNEb2MsXG4gIHlqc09iamVjdCxcbiAgbW9ieEtleXN0b25lVHlwZSxcbn06IHtcbiAgLyoqXG4gICAqIFRoZSBZLmpzIGRvY3VtZW50LlxuICAgKi9cbiAgeWpzRG9jOiBZLkRvY1xuICAvKipcbiAgICogVGhlIGJvdW5kIFkuanMgZGF0YSBzdHJ1Y3R1cmUuXG4gICAqL1xuICB5anNPYmplY3Q6IFkuTWFwPGFueT4gfCBZLkFycmF5PGFueT4gfCBZLlRleHRcbiAgLyoqXG4gICAqIFRoZSBtb2J4LWtleXN0b25lIG1vZGVsIHR5cGUuXG4gICAqL1xuICBtb2J4S2V5c3RvbmVUeXBlOiBUVHlwZVxufSk6IHtcbiAgLyoqXG4gICAqIFRoZSBib3VuZCBtb2J4LWtleXN0b25lIGluc3RhbmNlLlxuICAgKi9cbiAgYm91bmRPYmplY3Q6IFR5cGVUb0RhdGE8VFR5cGU+XG4gIC8qKlxuICAgKiBEaXNwb3NlcyB0aGUgYmluZGluZy5cbiAgICovXG4gIGRpc3Bvc2U6ICgpID0+IHZvaWRcbiAgLyoqXG4gICAqIFRoZSBZLmpzIG9yaWdpbiBzeW1ib2wgdXNlZCBmb3IgYmluZGluZyB0cmFuc2FjdGlvbnMuXG4gICAqL1xuICB5anNPcmlnaW46IHN5bWJvbFxufSB7XG4gIGNvbnN0IHlqc09yaWdpbiA9IFN5bWJvbChcImJpbmRZanNUb01vYnhLZXlzdG9uZVRyYW5zYWN0aW9uT3JpZ2luXCIpXG5cbiAgbGV0IGFwcGx5aW5nWWpzQ2hhbmdlc1RvTW9ieEtleXN0b25lID0gMFxuXG4gIGNvbnN0IGJpbmRpbmdDb250ZXh0OiBZanNCaW5kaW5nQ29udGV4dCA9IHtcbiAgICB5anNEb2MsXG4gICAgeWpzT2JqZWN0LFxuICAgIG1vYnhLZXlzdG9uZVR5cGUsXG4gICAgeWpzT3JpZ2luLFxuICAgIGJvdW5kT2JqZWN0OiB1bmRlZmluZWQsIC8vIG5vdCB5ZXQgY3JlYXRlZFxuXG4gICAgZ2V0IGlzQXBwbHlpbmdZanNDaGFuZ2VzVG9Nb2J4S2V5c3RvbmUoKSB7XG4gICAgICByZXR1cm4gYXBwbHlpbmdZanNDaGFuZ2VzVG9Nb2J4S2V5c3RvbmUgPiAwXG4gICAgfSxcbiAgfVxuXG4gIGNvbnN0IHlqc0pzb24gPSBjb252ZXJ0WWpzRGF0YVRvSnNvbih5anNPYmplY3QpXG5cbiAgY29uc3QgaW5pdGlhbGl6YXRpb25HbG9iYWxQYXRjaGVzOiB7IHRhcmdldDogb2JqZWN0OyBwYXRjaGVzOiBQYXRjaFtdIH1bXSA9IFtdXG5cbiAgY29uc3QgY3JlYXRlQm91bmRPYmplY3QgPSAoKSA9PiB7XG4gICAgY29uc3QgZGlzcG9zZU9uR2xvYmFsUGF0Y2hlcyA9IG9uR2xvYmFsUGF0Y2hlcygodGFyZ2V0LCBwYXRjaGVzKSA9PiB7XG4gICAgICBpbml0aWFsaXphdGlvbkdsb2JhbFBhdGNoZXMucHVzaCh7IHRhcmdldCwgcGF0Y2hlcyB9KVxuICAgIH0pXG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgYm91bmRPYmplY3QgPSB5anNCaW5kaW5nQ29udGV4dC5hcHBseShcbiAgICAgICAgKCkgPT4gZnJvbVNuYXBzaG90KG1vYnhLZXlzdG9uZVR5cGUsIHlqc0pzb24gYXMgdW5rbm93biBhcyBTbmFwc2hvdEluT2Y8VHlwZVRvRGF0YTxUVHlwZT4+KSxcbiAgICAgICAgYmluZGluZ0NvbnRleHRcbiAgICAgIClcbiAgICAgIHlqc0JpbmRpbmdDb250ZXh0LnNldChib3VuZE9iamVjdCwgeyAuLi5iaW5kaW5nQ29udGV4dCwgYm91bmRPYmplY3QgfSlcbiAgICAgIHJldHVybiBib3VuZE9iamVjdFxuICAgIH0gZmluYWxseSB7XG4gICAgICBkaXNwb3NlT25HbG9iYWxQYXRjaGVzKClcbiAgICB9XG4gIH1cblxuICBjb25zdCBib3VuZE9iamVjdCA9IGNyZWF0ZUJvdW5kT2JqZWN0KClcblxuICAvLyBiaW5kIGFueSBjaGFuZ2VzIGZyb20geWpzIHRvIG1vYngta2V5c3RvbmVcbiAgY29uc3Qgb2JzZXJ2ZURlZXBDYiA9IGFjdGlvbigoZXZlbnRzOiBZLllFdmVudDxhbnk+W10pID0+IHtcbiAgICBjb25zdCBwYXRjaGVzOiBQYXRjaFtdID0gW11cbiAgICBldmVudHMuZm9yRWFjaCgoZXZlbnQpID0+IHtcbiAgICAgIGlmIChldmVudC50cmFuc2FjdGlvbi5vcmlnaW4gIT09IHlqc09yaWdpbikge1xuICAgICAgICBwYXRjaGVzLnB1c2goLi4uY29udmVydFlqc0V2ZW50VG9QYXRjaGVzKGV2ZW50KSlcbiAgICAgIH1cblxuICAgICAgaWYgKGV2ZW50LnRhcmdldCBpbnN0YW5jZW9mIFkuTWFwIHx8IGV2ZW50LnRhcmdldCBpbnN0YW5jZW9mIFkuQXJyYXkpIHtcbiAgICAgICAgZ2V0WWpzQ29sbGVjdGlvbkF0b20oZXZlbnQudGFyZ2V0KT8ucmVwb3J0Q2hhbmdlZCgpXG4gICAgICB9XG4gICAgfSlcblxuICAgIGlmIChwYXRjaGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIGFwcGx5aW5nWWpzQ2hhbmdlc1RvTW9ieEtleXN0b25lKytcbiAgICAgIHRyeSB7XG4gICAgICAgIGFwcGx5UGF0Y2hlcyhib3VuZE9iamVjdCwgcGF0Y2hlcylcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGFwcGx5aW5nWWpzQ2hhbmdlc1RvTW9ieEtleXN0b25lLS1cbiAgICAgIH1cbiAgICB9XG4gIH0pXG5cbiAgeWpzT2JqZWN0Lm9ic2VydmVEZWVwKG9ic2VydmVEZWVwQ2IpXG5cbiAgLy8gYmluZCBhbnkgY2hhbmdlcyBmcm9tIG1vYngta2V5c3RvbmUgdG8geWpzXG4gIGxldCBwZW5kaW5nQXJyYXlPZkFycmF5T2ZQYXRjaGVzOiBQYXRjaFtdW10gPSBbXVxuICBjb25zdCBkaXNwb3NlT25QYXRjaGVzID0gb25QYXRjaGVzKGJvdW5kT2JqZWN0LCAocGF0Y2hlcykgPT4ge1xuICAgIGlmIChhcHBseWluZ1lqc0NoYW5nZXNUb01vYnhLZXlzdG9uZSA+IDApIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHBlbmRpbmdBcnJheU9mQXJyYXlPZlBhdGNoZXMucHVzaChwYXRjaGVzKVxuICB9KVxuXG4gIC8vIHRoaXMgaXMgb25seSB1c2VkIHNvIHdlIGNhbiB0cmFuc2FjdCBhbGwgcGF0Y2hlcyB0byB0aGUgc25hcHNob3QgYm91bmRhcnlcbiAgY29uc3QgZGlzcG9zZU9uU25hcHNob3QgPSBvblNuYXBzaG90KGJvdW5kT2JqZWN0LCAoKSA9PiB7XG4gICAgaWYgKHBlbmRpbmdBcnJheU9mQXJyYXlPZlBhdGNoZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBhcnJheU9mQXJyYXlPZlBhdGNoZXMgPSBwZW5kaW5nQXJyYXlPZkFycmF5T2ZQYXRjaGVzXG4gICAgcGVuZGluZ0FycmF5T2ZBcnJheU9mUGF0Y2hlcyA9IFtdXG5cbiAgICBpZiAoaXNZanNWYWx1ZURlbGV0ZWQoeWpzT2JqZWN0KSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgeWpzRG9jLnRyYW5zYWN0KCgpID0+IHtcbiAgICAgIGFycmF5T2ZBcnJheU9mUGF0Y2hlcy5mb3JFYWNoKChhcnJheU9mUGF0Y2hlcykgPT4ge1xuICAgICAgICBhcnJheU9mUGF0Y2hlcy5mb3JFYWNoKChwYXRjaCkgPT4ge1xuICAgICAgICAgIGFwcGx5TW9ieEtleXN0b25lUGF0Y2hUb1lqc09iamVjdChwYXRjaCwgeWpzT2JqZWN0KVxuICAgICAgICB9KVxuICAgICAgfSlcbiAgICB9LCB5anNPcmlnaW4pXG4gIH0pXG5cbiAgLy8gc3luYyBpbml0aWFsIHBhdGNoZXMsIHRoYXQgbWlnaHQgaW5jbHVkZSBzZXR0aW5nIGRlZmF1bHRzLCBJRHMsIGV0Y1xuICB5anNEb2MudHJhbnNhY3QoKCkgPT4ge1xuICAgIC8vIHdlIG5lZWQgdG8gc2tpcCBpbml0aWFsaXphdGlvbnMgdW50aWwgd2UgaGl0IHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgYm91bmQgb2JqZWN0XG4gICAgLy8gdGhpcyBpcyBiZWNhdXNlIGRlZmF1bHQgb2JqZWN0cyBtaWdodCBiZSBjcmVhdGVkIGFuZCBpbml0aWFsaXplZCBiZWZvcmUgdGhlIG1haW4gb2JqZWN0XG4gICAgLy8gYnV0IHdlIGp1c3QgbmVlZCB0byBjYXRjaCB3aGVuIHRob3NlIGFyZSBhY3R1YWxseSBhc3NpZ25lZCB0byB0aGUgYm91bmQgb2JqZWN0XG4gICAgbGV0IGJvdW5kT2JqZWN0Rm91bmQgPSBmYWxzZVxuXG4gICAgaW5pdGlhbGl6YXRpb25HbG9iYWxQYXRjaGVzLmZvckVhY2goKHsgdGFyZ2V0LCBwYXRjaGVzIH0pID0+IHtcbiAgICAgIGlmICghYm91bmRPYmplY3RGb3VuZCkge1xuICAgICAgICBpZiAodGFyZ2V0ICE9PSBib3VuZE9iamVjdCkge1xuICAgICAgICAgIHJldHVybiAvLyBza2lwXG4gICAgICAgIH1cbiAgICAgICAgYm91bmRPYmplY3RGb3VuZCA9IHRydWVcbiAgICAgIH1cblxuICAgICAgY29uc3QgcGFyZW50VG9DaGlsZFBhdGggPSBnZXRQYXJlbnRUb0NoaWxkUGF0aChib3VuZE9iamVjdCwgdGFyZ2V0KVxuICAgICAgLy8gdGhpcyBpcyB1bmRlZmluZWQgb25seSBpZiB0YXJnZXQgaXMgbm90IGEgY2hpbGQgb2YgYm91bmRNb2RlbFxuICAgICAgaWYgKHBhcmVudFRvQ2hpbGRQYXRoICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcGF0Y2hlcy5mb3JFYWNoKChwYXRjaCkgPT4ge1xuICAgICAgICAgIGFwcGx5TW9ieEtleXN0b25lUGF0Y2hUb1lqc09iamVjdChcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgLi4ucGF0Y2gsXG4gICAgICAgICAgICAgIHBhdGg6IFsuLi5wYXJlbnRUb0NoaWxkUGF0aCwgLi4ucGF0Y2gucGF0aF0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgeWpzT2JqZWN0XG4gICAgICAgICAgKVxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0pXG4gIH0sIHlqc09yaWdpbilcblxuICBjb25zdCBkaXNwb3NlID0gKCkgPT4ge1xuICAgIHlqc0RvYy5vZmYoXCJkZXN0cm95XCIsIGRpc3Bvc2UpXG4gICAgZGlzcG9zZU9uUGF0Y2hlcygpXG4gICAgZGlzcG9zZU9uU25hcHNob3QoKVxuICAgIHlqc09iamVjdC51bm9ic2VydmVEZWVwKG9ic2VydmVEZWVwQ2IpXG4gIH1cblxuICB5anNEb2Mub24oXCJkZXN0cm95XCIsIGRpc3Bvc2UpXG5cbiAgcmV0dXJuIHtcbiAgICBib3VuZE9iamVjdCxcbiAgICBkaXNwb3NlLFxuICAgIHlqc09yaWdpbixcbiAgfVxufVxuIl0sIm5hbWVzIjpbImJvdW5kT2JqZWN0Il0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFHQSxNQUFNLHlDQUF5QixRQUFBO0FBS3hCLE1BQU0sdUJBQXVCLENBQ2xDLGtCQUNzQjtBQUN0QixTQUFPLG1CQUFtQixJQUFJLGFBQWE7QUFDN0M7QUFLTyxNQUFNLCtCQUErQixDQUMxQyxrQkFDVTtBQUNWLE1BQUksT0FBTyxtQkFBbUIsSUFBSSxhQUFhO0FBQy9DLE1BQUksQ0FBQyxNQUFNO0FBQ1QsV0FBTyxXQUFXLG1CQUFtQjtBQUNyQyx1QkFBbUIsSUFBSSxlQUFlLElBQUk7QUFBQSxFQUM1QztBQUNBLFNBQU87QUFDVDtBQ2xCTyxTQUFTLGtCQUFrQixVQUE0Qjs7QUFDNUQsTUFBSSxv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
|
|
742
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9ieC1rZXlzdG9uZS15anMuZXNtLm1qcyIsInNvdXJjZXMiOlsiLi4vc3JjL3V0aWxzL2Vycm9yLnRzIiwiLi4vc3JjL3V0aWxzL2dldE9yQ3JlYXRlWWpzQ29sbGVjdGlvbkF0b20udHMiLCIuLi9zcmMvdXRpbHMvaXNZanNWYWx1ZURlbGV0ZWQudHMiLCIuLi9zcmMvYmluZGluZy9yZXNvbHZlWWpzUGF0aC50cyIsIi4uL3NyYy9iaW5kaW5nL3lqc0JpbmRpbmdDb250ZXh0LnRzIiwiLi4vc3JjL2JpbmRpbmcvWWpzVGV4dE1vZGVsLnRzIiwiLi4vc3JjL2JpbmRpbmcveWpzU25hcHNob3RUcmFja2luZy50cyIsIi4uL3NyYy9iaW5kaW5nL2NvbnZlcnRKc29uVG9ZanNEYXRhLnRzIiwiLi4vc3JjL2JpbmRpbmcvYXBwbHlNb2J4Q2hhbmdlVG9ZanNPYmplY3QudHMiLCIuLi9zcmMvYmluZGluZy9jb252ZXJ0WWpzRGF0YVRvSnNvbi50cyIsIi4uL3NyYy9iaW5kaW5nL2FwcGx5WWpzRXZlbnRUb01vYngudHMiLCIuLi9zcmMvYmluZGluZy9iaW5kWWpzVG9Nb2J4S2V5c3RvbmUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXHJcbiAqIEEgbW9ieC1rZXlzdG9uZS15anMgZXJyb3IuXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgTW9ieEtleXN0b25lWWpzRXJyb3IgZXh0ZW5kcyBFcnJvciB7XHJcbiAgY29uc3RydWN0b3IobXNnOiBzdHJpbmcpIHtcclxuICAgIHN1cGVyKG1zZylcclxuXHJcbiAgICAvLyBTZXQgdGhlIHByb3RvdHlwZSBleHBsaWNpdGx5LlxyXG4gICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKHRoaXMsIE1vYnhLZXlzdG9uZVlqc0Vycm9yLnByb3RvdHlwZSlcclxuICB9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBAaW50ZXJuYWxcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBmYWlsdXJlKG1zZzogc3RyaW5nKSB7XHJcbiAgcmV0dXJuIG5ldyBNb2J4S2V5c3RvbmVZanNFcnJvcihtc2cpXHJcbn1cclxuIiwiaW1wb3J0IHsgY3JlYXRlQXRvbSwgSUF0b20gfSBmcm9tIFwibW9ieFwiXG5pbXBvcnQgKiBhcyBZIGZyb20gXCJ5anNcIlxuXG5jb25zdCB5anNDb2xsZWN0aW9uQXRvbXMgPSBuZXcgV2Vha01hcDxZLk1hcDx1bmtub3duPiB8IFkuQXJyYXk8dW5rbm93bj4sIElBdG9tPigpXG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRZanNDb2xsZWN0aW9uQXRvbSA9IChcbiAgeWpzQ29sbGVjdGlvbjogWS5NYXA8dW5rbm93bj4gfCBZLkFycmF5PHVua25vd24+XG4pOiBJQXRvbSB8IHVuZGVmaW5lZCA9PiB7XG4gIHJldHVybiB5anNDb2xsZWN0aW9uQXRvbXMuZ2V0KHlqc0NvbGxlY3Rpb24pXG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRPckNyZWF0ZVlqc0NvbGxlY3Rpb25BdG9tID0gKFxuICB5anNDb2xsZWN0aW9uOiBZLk1hcDx1bmtub3duPiB8IFkuQXJyYXk8dW5rbm93bj5cbik6IElBdG9tID0+IHtcbiAgbGV0IGF0b20gPSB5anNDb2xsZWN0aW9uQXRvbXMuZ2V0KHlqc0NvbGxlY3Rpb24pXG4gIGlmICghYXRvbSkge1xuICAgIGF0b20gPSBjcmVhdGVBdG9tKGB5anNDb2xsZWN0aW9uQXRvbWApXG4gICAgeWpzQ29sbGVjdGlvbkF0b21zLnNldCh5anNDb2xsZWN0aW9uLCBhdG9tKVxuICB9XG4gIHJldHVybiBhdG9tXG59XG4iLCJpbXBvcnQgKiBhcyBZIGZyb20gXCJ5anNcIlxuXG4vKipcbiAqIENoZWNrcyBpZiBhIFkuanMgdmFsdWUgaGFzIGJlZW4gZGVsZXRlZCBvciBpdHMgZG9jdW1lbnQgZGVzdHJveWVkLlxuICpcbiAqIEBwYXJhbSB5anNWYWx1ZSBUaGUgWS5qcyB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgdmFsdWUgaXMgZGVsZXRlZCBvciBkZXN0cm95ZWQsIGBmYWxzZWAgb3RoZXJ3aXNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNZanNWYWx1ZURlbGV0ZWQoeWpzVmFsdWU6IHVua25vd24pOiBib29sZWFuIHtcbiAgaWYgKHlqc1ZhbHVlIGluc3RhbmNlb2YgWS5BYnN0cmFjdFR5cGUpIHtcbiAgICByZXR1cm4gISEoeWpzVmFsdWUgYXMgYW55KS5faXRlbT8uZGVsZXRlZCB8fCAhIXlqc1ZhbHVlLmRvYz8uaXNEZXN0cm95ZWRcbiAgfVxuICByZXR1cm4gZmFsc2Vcbn1cbiIsImltcG9ydCAqIGFzIFkgZnJvbSBcInlqc1wiXG5pbXBvcnQgeyBmYWlsdXJlIH0gZnJvbSBcIi4uL3V0aWxzL2Vycm9yXCJcbmltcG9ydCB7IGdldE9yQ3JlYXRlWWpzQ29sbGVjdGlvbkF0b20gfSBmcm9tIFwiLi4vdXRpbHMvZ2V0T3JDcmVhdGVZanNDb2xsZWN0aW9uQXRvbVwiXG5cbi8qKlxuICogUmVzb2x2ZXMgYSBwYXRoIHdpdGhpbiBhIFlqcyBvYmplY3Qgc3RydWN0dXJlLlxuICogUmV0dXJucyB0aGUgWWpzIGNvbnRhaW5lciBhdCB0aGUgc3BlY2lmaWVkIHBhdGguXG4gKlxuICogV2hlbiBhIFkuVGV4dCBpcyBlbmNvdW50ZXJlZCBkdXJpbmcgcGF0aCByZXNvbHV0aW9uIChlaXRoZXIgYXQgdGhlIHN0YXJ0XG4gKiBvciBtaWQtcGF0aCksIGl0IGlzIHJldHVybmVkIGltbWVkaWF0ZWx5IHNpbmNlIFkuVGV4dCBkb2Vzbid0IHN1cHBvcnRcbiAqIG5lc3RlZCBwYXRoIHRyYXZlcnNhbC5cbiAqXG4gKiBAcGFyYW0geWpzT2JqZWN0IFRoZSByb290IFlqcyBvYmplY3RcbiAqIEBwYXJhbSBwYXRoIEFycmF5IG9mIGtleXMvaW5kaWNlcyB0byB0cmF2ZXJzZVxuICogQHJldHVybnMgVGhlIFlqcyBjb250YWluZXIgYXQgdGhlIHBhdGgsIG9yIFkuVGV4dCBpZiBlbmNvdW50ZXJlZCBkdXJpbmcgdHJhdmVyc2FsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlWWpzUGF0aChcbiAgeWpzT2JqZWN0OiBZLk1hcDx1bmtub3duPiB8IFkuQXJyYXk8dW5rbm93bj4gfCBZLlRleHQsXG4gIHBhdGg6IHJlYWRvbmx5IChzdHJpbmcgfCBudW1iZXIpW11cbik6IHVua25vd24ge1xuICBsZXQgY3VycmVudFlqc09iamVjdDogdW5rbm93biA9IHlqc09iamVjdFxuXG4gIGxldCBpID0gLTFcbiAgZm9yIChjb25zdCBwYXRoUGFydCBvZiBwYXRoKSB7XG4gICAgaSsrXG4gICAgLy8gSWYgd2UgZW5jb3VudGVyIGEgWS5UZXh0IGR1cmluZyBwYXRoIHJlc29sdXRpb24sIHJldHVybiBpdCBpbW1lZGlhdGVseS5cbiAgICAvLyBZLlRleHQgb2JqZWN0cyBkb24ndCBzdXBwb3J0IG5lc3RlZCBwYXRoIHRyYXZlcnNhbCwgYW5kIHRoZWlyIHVwZGF0ZXNcbiAgICAvLyBhcmUgaGFuZGxlZCBzZXBhcmF0ZWx5IGJ5IFlqc1RleHRNb2RlbCdzIG93biBzeW5jaHJvbml6YXRpb24gbWVjaGFuaXNtLlxuICAgIGlmIChjdXJyZW50WWpzT2JqZWN0IGluc3RhbmNlb2YgWS5UZXh0KSB7XG4gICAgICByZXR1cm4gY3VycmVudFlqc09iamVjdFxuICAgIH1cblxuICAgIGlmIChjdXJyZW50WWpzT2JqZWN0IGluc3RhbmNlb2YgWS5NYXApIHtcbiAgICAgIGdldE9yQ3JlYXRlWWpzQ29sbGVjdGlvbkF0b20oY3VycmVudFlqc09iamVjdCkucmVwb3J0T2JzZXJ2ZWQoKVxuICAgICAgY29uc3Qga2V5ID0gU3RyaW5nKHBhdGhQYXJ0KVxuICAgICAgY3VycmVudFlqc09iamVjdCA9IGN1cnJlbnRZanNPYmplY3QuZ2V0KGtleSlcbiAgICB9IGVsc2UgaWYgKGN1cnJlbnRZanNPYmplY3QgaW5zdGFuY2VvZiBZLkFycmF5KSB7XG4gICAgICBnZXRPckNyZWF0ZVlqc0NvbGxlY3Rpb25BdG9tKGN1cnJlbnRZanNPYmplY3QpLnJlcG9ydE9ic2VydmVkKClcbiAgICAgIGNvbnN0IGtleSA9IE51bWJlcihwYXRoUGFydClcbiAgICAgIGN1cnJlbnRZanNPYmplY3QgPSBjdXJyZW50WWpzT2JqZWN0LmdldChrZXkpXG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IGZhaWx1cmUoXG4gICAgICAgIGBZLk1hcCBvciBZLkFycmF5IHdhcyBleHBlY3RlZCBhdCBwYXRoICR7SlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAgcGF0aC5zbGljZSgwLCBpKVxuICAgICAgICApfSBpbiBvcmRlciB0byByZXNvbHZlIHBhdGggJHtKU09OLnN0cmluZ2lmeShwYXRoKX0sIGJ1dCBnb3QgJHtjdXJyZW50WWpzT2JqZWN0fSBpbnN0ZWFkYFxuICAgICAgKVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBjdXJyZW50WWpzT2JqZWN0XG59XG4iLCJpbXBvcnQgeyBBbnlUeXBlLCBjcmVhdGVDb250ZXh0IH0gZnJvbSBcIm1vYngta2V5c3RvbmVcIlxuaW1wb3J0ICogYXMgWSBmcm9tIFwieWpzXCJcblxuLyoqXG4gKiBDb250ZXh0IHdpdGggaW5mbyBvbiBob3cgYSBtb2J4LWtleXN0b25lIG1vZGVsIGlzIGJvdW5kIHRvIGEgWS5qcyBkYXRhIHN0cnVjdHVyZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBZanNCaW5kaW5nQ29udGV4dCB7XG4gIC8qKlxuICAgKiBUaGUgWS5qcyBkb2N1bWVudC5cbiAgICovXG4gIHlqc0RvYzogWS5Eb2NcblxuICAvKipcbiAgICogVGhlIGJvdW5kIFkuanMgZGF0YSBzdHJ1Y3R1cmUuXG4gICAqL1xuICB5anNPYmplY3Q6IFkuTWFwPHVua25vd24+IHwgWS5BcnJheTx1bmtub3duPiB8IFkuVGV4dFxuXG4gIC8qKlxuICAgKiBUaGUgbW9ieC1rZXlzdG9uZSBtb2RlbCB0eXBlLlxuICAgKi9cbiAgbW9ieEtleXN0b25lVHlwZTogQW55VHlwZVxuXG4gIC8qKlxuICAgKiBUaGUgb3JpZ2luIHN5bWJvbCB1c2VkIGZvciB0cmFuc2FjdGlvbnMuXG4gICAqL1xuICB5anNPcmlnaW46IHN5bWJvbFxuXG4gIC8qKlxuICAgKiBUaGUgYm91bmQgbW9ieC1rZXlzdG9uZSBpbnN0YW5jZS5cbiAgICovXG4gIGJvdW5kT2JqZWN0OiB1bmtub3duXG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgd2UgYXJlIGN1cnJlbnRseSBhcHBseWluZyBZLmpzIGNoYW5nZXMgdG8gdGhlIG1vYngta2V5c3RvbmUgbW9kZWwuXG4gICAqL1xuICBpc0FwcGx5aW5nWWpzQ2hhbmdlc1RvTW9ieEtleXN0b25lOiBib29sZWFuXG59XG5cbi8qKlxuICogQ29udGV4dCB3aXRoIGluZm8gb24gaG93IGEgbW9ieC1rZXlzdG9uZSBtb2RlbCBpcyBib3VuZCB0byBhIFkuanMgZGF0YSBzdHJ1Y3R1cmUuXG4gKi9cbmV4cG9ydCBjb25zdCB5anNCaW5kaW5nQ29udGV4dCA9IGNyZWF0ZUNvbnRleHQ8WWpzQmluZGluZ0NvbnRleHQgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZClcbiIsImltcG9ydCB7IGNvbXB1dGVkLCBjcmVhdGVBdG9tLCBJQXRvbSwgb2JzZXJ2ZSwgcmVhY3Rpb24gfSBmcm9tIFwibW9ieFwiXG5pbXBvcnQge1xuICBGcm96ZW4sXG4gIGZyb3plbixcbiAgZ2V0UGFyZW50VG9DaGlsZFBhdGgsXG4gIE1vZGVsLFxuICBtb2RlbCxcbiAgb25TbmFwc2hvdCxcbiAgdFByb3AsXG4gIHR5cGVzLFxufSBmcm9tIFwibW9ieC1rZXlzdG9uZVwiXG5pbXBvcnQgKiBhcyBZIGZyb20gXCJ5anNcIlxuaW1wb3J0IHsgZmFpbHVyZSB9IGZyb20gXCIuLi91dGlscy9lcnJvclwiXG5pbXBvcnQgeyBpc1lqc1ZhbHVlRGVsZXRlZCB9IGZyb20gXCIuLi91dGlscy9pc1lqc1ZhbHVlRGVsZXRlZFwiXG5pbXBvcnQgeyByZXNvbHZlWWpzUGF0aCB9IGZyb20gXCIuL3Jlc29sdmVZanNQYXRoXCJcbmltcG9ydCB7IFlqc0JpbmRpbmdDb250ZXh0LCB5anNCaW5kaW5nQ29udGV4dCB9IGZyb20gXCIuL3lqc0JpbmRpbmdDb250ZXh0XCJcblxuLy8gRGVsdGFbXVtdLCBzaW5jZSBlYWNoIHNpbmdsZSBjaGFuZ2UgaXMgYSBEZWx0YVtdXG4vLyB3ZSB1c2UgZnJvemVuIHNvIHRoYXQgd2UgY2FuIHJldXNlIGVhY2ggZGVsdGEgY2hhbmdlXG5jb25zdCBkZWx0YUxpc3RUeXBlID0gdHlwZXMuYXJyYXkodHlwZXMuZnJvemVuKHR5cGVzLnVuY2hlY2tlZDx1bmtub3duW10+KCkpKVxuXG5leHBvcnQgY29uc3QgeWpzVGV4dE1vZGVsSWQgPSBcIm1vYngta2V5c3RvbmUteWpzL1lqc1RleHRNb2RlbFwiXG5cbi8qKlxuICogQSBtb2J4LWtleXN0b25lIG1vZGVsIHRoYXQgcmVwcmVzZW50cyBhIFlqcy5UZXh0IG9iamVjdC5cbiAqL1xuQG1vZGVsKHlqc1RleHRNb2RlbElkKVxuZXhwb3J0IGNsYXNzIFlqc1RleHRNb2RlbCBleHRlbmRzIE1vZGVsKHtcbiAgZGVsdGFMaXN0OiB0UHJvcChkZWx0YUxpc3RUeXBlLCAoKSA9PiBbXSksXG59KSB7XG4gIC8qKlxuICAgKiBIZWxwZXIgZnVuY3Rpb24gdG8gY3JlYXRlIGEgWWpzVGV4dE1vZGVsIGluc3RhbmNlIHdpdGggYSBzaW1wbGUgdGV4dC5cbiAgICovXG4gIHN0YXRpYyB3aXRoVGV4dCh0ZXh0OiBzdHJpbmcpOiBZanNUZXh0TW9kZWwge1xuICAgIHJldHVybiBuZXcgRGVjb3JhdGVkWWpzVGV4dE1vZGVsKHtcbiAgICAgIGRlbHRhTGlzdDogW1xuICAgICAgICBmcm96ZW4oW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGluc2VydDogdGV4dCxcbiAgICAgICAgICB9LFxuICAgICAgICBdKSxcbiAgICAgIF0sXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgWS5qcyBwYXRoIGZyb20gdGhlIGJvdW5kIG9iamVjdCB0byB0aGUgWWpzVGV4dE1vZGVsIGluc3RhbmNlLlxuICAgKi9cbiAgQGNvbXB1dGVkXG4gIHByaXZhdGUgZ2V0IF95anNPYmplY3RQYXRoKCkge1xuICAgIGNvbnN0IGN0eCA9IHlqc0JpbmRpbmdDb250ZXh0LmdldCh0aGlzKVxuICAgIGlmIChjdHg/LmJvdW5kT2JqZWN0ID09IG51bGwpIHtcbiAgICAgIHRocm93IGZhaWx1cmUoXG4gICAgICAgIFwidGhlIFlqc1RleHRNb2RlbCBpbnN0YW5jZSBtdXN0IGJlIHBhcnQgb2YgYSBib3VuZCBvYmplY3QgYmVmb3JlIGl0IGNhbiBiZSBhY2Nlc3NlZFwiXG4gICAgICApXG4gICAgfVxuXG4gICAgY29uc3QgcGF0aCA9IGdldFBhcmVudFRvQ2hpbGRQYXRoKGN0eC5ib3VuZE9iamVjdCwgdGhpcylcbiAgICBpZiAoIXBhdGgpIHtcbiAgICAgIHRocm93IGZhaWx1cmUoXCJhIHBhdGggZnJvbSB0aGUgYm91bmQgb2JqZWN0IHRvIHRoZSBZanNUZXh0TW9kZWwgaW5zdGFuY2UgaXMgbm90IGF2YWlsYWJsZVwiKVxuICAgIH1cblxuICAgIHJldHVybiBwYXRoXG4gIH1cblxuICAvKipcbiAgICogVGhlIFlqcy5UZXh0IG9iamVjdCBwcmVzZW50IGF0IHRoaXMgbW9ieC1rZXlzdG9uZSBub2RlJ3MgcGF0aC5cbiAgICovXG4gIEBjb21wdXRlZFxuICBwcml2YXRlIGdldCBfeWpzT2JqZWN0QXRQYXRoKCk6IHVua25vd24ge1xuICAgIGNvbnN0IHBhdGggPSB0aGlzLl95anNPYmplY3RQYXRoXG5cbiAgICBjb25zdCBjdHggPSB5anNCaW5kaW5nQ29udGV4dC5nZXQodGhpcykhXG5cbiAgICByZXR1cm4gcmVzb2x2ZVlqc1BhdGgoY3R4Lnlqc09iamVjdCwgcGF0aClcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgWWpzLlRleHQgb2JqZWN0IHJlcHJlc2VudGVkIGJ5IHRoaXMgbW9ieC1rZXlzdG9uZSBub2RlLlxuICAgKi9cbiAgQGNvbXB1dGVkXG4gIGdldCB5anNUZXh0KCk6IFkuVGV4dCB7XG4gICAgY29uc3QgeWpzT2JqZWN0ID0gdGhpcy5feWpzT2JqZWN0QXRQYXRoXG5cbiAgICBpZiAoISh5anNPYmplY3QgaW5zdGFuY2VvZiBZLlRleHQpKSB7XG4gICAgICB0aHJvdyBmYWlsdXJlKGBZLlRleHQgd2FzIGV4cGVjdGVkIGF0IHBhdGggJHtKU09OLnN0cmluZ2lmeSh0aGlzLl95anNPYmplY3RQYXRoKX1gKVxuICAgIH1cblxuICAgIHJldHVybiB5anNPYmplY3RcbiAgfVxuXG4gIC8qKlxuICAgKiBBdG9tIHRoYXQgZ2V0cyBjaGFuZ2VkIHdoZW4gdGhlIGFzc29jaWF0ZWQgWS5qcyB0ZXh0IGNoYW5nZXMuXG4gICAqL1xuICB5anNUZXh0Q2hhbmdlZEF0b20gPSBjcmVhdGVBdG9tKFwieWpzVGV4dENoYW5nZWRBdG9tXCIpXG5cbiAgLyoqXG4gICAqIFRoZSB0ZXh0IHZhbHVlIG9mIHRoZSBZanMuVGV4dCBvYmplY3QuXG4gICAqIFNob3J0Y3V0IGZvciBgeWpzVGV4dC50b1N0cmluZygpYCwgYnV0IGNvbXB1dGVkLlxuICAgKi9cbiAgQGNvbXB1dGVkXG4gIGdldCB0ZXh0KCk6IHN0cmluZyB7XG4gICAgdGhpcy55anNUZXh0Q2hhbmdlZEF0b20ucmVwb3J0T2JzZXJ2ZWQoKVxuXG4gICAgY29uc3QgY3R4ID0geWpzQmluZGluZ0NvbnRleHQuZ2V0KHRoaXMpXG4gICAgaWYgKGN0eD8uYm91bmRPYmplY3QgIT0gbnVsbCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgeWpzVGV4dFN0cmluZyA9IHRoaXMueWpzVGV4dC50b1N0cmluZygpXG4gICAgICAgIC8vIGlmIHRoZSB5anNUZXh0IGlzIGRldGFjaGVkLCB0b1N0cmluZygpIHJldHVybnMgYW4gZW1wdHkgc3RyaW5nXG4gICAgICAgIC8vIGluIHRoYXQgY2FzZSB3ZSBzaG91bGQgdXNlIHRoZSBkZWx0YUxpc3QgYXMgYSBmYWxsYmFja1xuICAgICAgICBpZiAoeWpzVGV4dFN0cmluZyAhPT0gXCJcIiB8fCB0aGlzLmRlbHRhTGlzdC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICByZXR1cm4geWpzVGV4dFN0cmluZ1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gZmFsbCBiYWNrXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gZmFsbCBiYWNrIHRvIGRlbHRhTGlzdFxuICAgIHJldHVybiB0aGlzLmRlbHRhTGlzdFRvVGV4dCgpXG4gIH1cblxuICBwcml2YXRlIGRlbHRhTGlzdFRvVGV4dCgpOiBzdHJpbmcge1xuICAgIGNvbnN0IGRvYyA9IG5ldyBZLkRvYygpXG4gICAgY29uc3QgdGV4dCA9IGRvYy5nZXRUZXh0KClcbiAgICB0aGlzLmRlbHRhTGlzdC5mb3JFYWNoKChkKSA9PiB7XG4gICAgICB0ZXh0LmFwcGx5RGVsdGEoZC5kYXRhKVxuICAgIH0pXG4gICAgcmV0dXJuIHRleHQudG9TdHJpbmcoKVxuICB9XG5cbiAgcHJvdGVjdGVkIG9uSW5pdCgpIHtcbiAgICBjb25zdCBzaG91bGRSZXBsaWNhdGVUb1lqcyA9IChjdHg6IFlqc0JpbmRpbmdDb250ZXh0IHwgdW5kZWZpbmVkKTogY3R4IGlzIFlqc0JpbmRpbmdDb250ZXh0ID0+IHtcbiAgICAgIHJldHVybiAhIWN0eCAmJiAhIWN0eC5ib3VuZE9iamVjdCAmJiAhY3R4LmlzQXBwbHlpbmdZanNDaGFuZ2VzVG9Nb2J4S2V5c3RvbmVcbiAgICB9XG5cbiAgICBsZXQgcmVhcHBseURlbHRhc1RvWWpzVGV4dCA9IGZhbHNlXG4gICAgY29uc3QgbmV3RGVsdGFzOiBGcm96ZW48dW5rbm93bltdPltdID0gW11cblxuICAgIGxldCBkaXNwb3NlT2JzZXJ2ZURlbHRhTGlzdDogKCgpID0+IHZvaWQpIHwgdW5kZWZpbmVkXG5cbiAgICBjb25zdCBkaXNwb3NlUmVhY3Rpb25Ub0RlbHRhTGlzdFJlZkNoYW5nZSA9IHJlYWN0aW9uKFxuICAgICAgKCkgPT4gdGhpcy4kLmRlbHRhTGlzdCxcbiAgICAgIChkZWx0YUxpc3QpID0+IHtcbiAgICAgICAgZGlzcG9zZU9ic2VydmVEZWx0YUxpc3Q/LigpXG4gICAgICAgIGRpc3Bvc2VPYnNlcnZlRGVsdGFMaXN0ID0gdW5kZWZpbmVkXG5cbiAgICAgICAgZGlzcG9zZU9ic2VydmVEZWx0YUxpc3QgPSBvYnNlcnZlKGRlbHRhTGlzdCwgKGNoYW5nZSkgPT4ge1xuICAgICAgICAgIGlmIChyZWFwcGx5RGVsdGFzVG9ZanNUZXh0KSB7XG4gICAgICAgICAgICAvLyBhbHJlYWR5IGdvbm5hIHJlcGxhY2UgdGhlbSBhbGxcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIXNob3VsZFJlcGxpY2F0ZVRvWWpzKHlqc0JpbmRpbmdDb250ZXh0LmdldCh0aGlzKSkpIHtcbiAgICAgICAgICAgIC8vIHlqcyB0ZXh0IGlzIGFscmVhZHkgdXAgdG8gZGF0ZSB3aXRoIHRoZXNlIGNoYW5nZXNcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIGNoYW5nZS50eXBlID09PSBcInNwbGljZVwiICYmXG4gICAgICAgICAgICBjaGFuZ2UucmVtb3ZlZENvdW50ID09PSAwICYmXG4gICAgICAgICAgICBjaGFuZ2UuYWRkZWRDb3VudCA+IDAgJiZcbiAgICAgICAgICAgIGNoYW5nZS5pbmRleCA9PT0gdGhpcy5kZWx0YUxpc3QubGVuZ3RoXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICAvLyBvcHRpbWl6YXRpb24sIGp1c3QgYWRkaW5nIG5ldyBvbmVzIHRvIHRoZSBlbmRcbiAgICAgICAgICAgIG5ld0RlbHRhcy5wdXNoKC4uLmNoYW5nZS5hZGRlZClcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gYW55IG90aGVyIGNoYW5nZSwgd2UgbmVlZCB0byByZWFwcGx5IGFsbCBkZWx0YXNcbiAgICAgICAgICAgIHJlYXBwbHlEZWx0YXNUb1lqc1RleHQgPSB0cnVlXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgfSxcbiAgICAgIHsgZmlyZUltbWVkaWF0ZWx5OiB0cnVlIH1cbiAgICApXG5cbiAgICBjb25zdCBkaXNwb3NlT25TbmFwc2hvdCA9IG9uU25hcHNob3QodGhpcywgKCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKHJlYXBwbHlEZWx0YXNUb1lqc1RleHQpIHtcbiAgICAgICAgICBjb25zdCBjdHggPSB5anNCaW5kaW5nQ29udGV4dC5nZXQodGhpcylcblxuICAgICAgICAgIGlmIChzaG91bGRSZXBsaWNhdGVUb1lqcyhjdHgpKSB7XG4gICAgICAgICAgICBjb25zdCB7IHlqc1RleHQgfSA9IHRoaXNcbiAgICAgICAgICAgIGlmIChpc1lqc1ZhbHVlRGVsZXRlZCh5anNUZXh0KSkge1xuICAgICAgICAgICAgICB0aHJvdyBmYWlsdXJlKFwiY2Fubm90IHJlYXBwbHkgZGVsdGFzIHRvIGRlbGV0ZWQgWWpzLlRleHRcIilcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY3R4Lnlqc0RvYy50cmFuc2FjdCgoKSA9PiB7XG4gICAgICAgICAgICAgIC8vIGRpZG4ndCBmaW5kIGEgYmV0dGVyIHdheSB0aGFuIHRoaXMgdG8gcmVhcHBseSBhbGwgZGVsdGFzXG4gICAgICAgICAgICAgIC8vIHdpdGhvdXQgaGF2aW5nIHRvIHJlLWNyZWF0ZSB0aGUgWS5UZXh0IG9iamVjdFxuICAgICAgICAgICAgICBpZiAoeWpzVGV4dC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgeWpzVGV4dC5kZWxldGUoMCwgeWpzVGV4dC5sZW5ndGgpXG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICB0aGlzLmRlbHRhTGlzdC5mb3JFYWNoKChmcm96ZW5EZWx0YXMpID0+IHtcbiAgICAgICAgICAgICAgICB5anNUZXh0LmFwcGx5RGVsdGEoZnJvemVuRGVsdGFzLmRhdGEpXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9LCBjdHgueWpzT3JpZ2luKVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChuZXdEZWx0YXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGNvbnN0IGN0eCA9IHlqc0JpbmRpbmdDb250ZXh0LmdldCh0aGlzKVxuXG4gICAgICAgICAgaWYgKHNob3VsZFJlcGxpY2F0ZVRvWWpzKGN0eCkpIHtcbiAgICAgICAgICAgIGNvbnN0IHsgeWpzVGV4dCB9ID0gdGhpc1xuICAgICAgICAgICAgaWYgKGlzWWpzVmFsdWVEZWxldGVkKHlqc1RleHQpKSB7XG4gICAgICAgICAgICAgIHRocm93IGZhaWx1cmUoXCJjYW5ub3QgcmVhcHBseSBkZWx0YXMgdG8gZGVsZXRlZCBZanMuVGV4dFwiKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjdHgueWpzRG9jLnRyYW5zYWN0KCgpID0+IHtcbiAgICAgICAgICAgICAgbmV3RGVsdGFzLmZvckVhY2goKGZyb3plbkRlbHRhcykgPT4ge1xuICAgICAgICAgICAgICAgIHlqc1RleHQuYXBwbHlEZWx0YShmcm96ZW5EZWx0YXMuZGF0YSlcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH0sIGN0eC55anNPcmlnaW4pXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICByZWFwcGx5RGVsdGFzVG9ZanNUZXh0ID0gZmFsc2VcbiAgICAgICAgbmV3RGVsdGFzLmxlbmd0aCA9IDBcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgY29uc3QgZGlwb3NlWWpzVGV4dENoYW5nZWRBdG9tID0gaG9va1lqc1RleHRDaGFuZ2VkQXRvbShcbiAgICAgICgpID0+IHRoaXMueWpzVGV4dCxcbiAgICAgIHRoaXMueWpzVGV4dENoYW5nZWRBdG9tXG4gICAgKVxuXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGRpc3Bvc2VPblNuYXBzaG90KClcbiAgICAgIGRpc3Bvc2VSZWFjdGlvblRvRGVsdGFMaXN0UmVmQ2hhbmdlKClcbiAgICAgIGRpc3Bvc2VPYnNlcnZlRGVsdGFMaXN0Py4oKVxuICAgICAgZGlzcG9zZU9ic2VydmVEZWx0YUxpc3QgPSB1bmRlZmluZWRcblxuICAgICAgZGlwb3NlWWpzVGV4dENoYW5nZWRBdG9tKClcbiAgICB9XG4gIH1cbn1cblxuLy8gd2UgdXNlIHRoaXMgdHJpY2sganVzdCB0byBhdm9pZCBhIGJhYmVsIGJ1ZyB0aGF0IGNhdXNlcyBjbGFzc2VzIHVzZWQgaW5zaWRlIGNsYXNzZXMgbm90IHRvIGJlIG92ZXJyaWRlblxuLy8gYnkgdGhlIGRlY29yYXRvclxuY29uc3QgRGVjb3JhdGVkWWpzVGV4dE1vZGVsID0gWWpzVGV4dE1vZGVsXG5cbmZ1bmN0aW9uIGhvb2tZanNUZXh0Q2hhbmdlZEF0b20oZ2V0WWpzVGV4dDogKCkgPT4gWS5UZXh0LCB0ZXh0Q2hhbmdlZEF0b206IElBdG9tKSB7XG4gIGxldCBkaXNwb3NlT2JzZXJ2ZVlqc1RleHQ6ICgoKSA9PiB2b2lkKSB8IHVuZGVmaW5lZFxuXG4gIGNvbnN0IG9ic2VydmVGbiA9ICgpID0+IHtcbiAgICB0ZXh0Q2hhbmdlZEF0b20ucmVwb3J0Q2hhbmdlZCgpXG4gIH1cblxuICBjb25zdCBkaXNwb3NlUmVhY3Rpb25Ub1lUZXh0Q2hhbmdlID0gcmVhY3Rpb24oXG4gICAgKCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgeWpzVGV4dCA9IGdldFlqc1RleHQoKVxuICAgICAgICByZXR1cm4gaXNZanNWYWx1ZURlbGV0ZWQoeWpzVGV4dCkgPyB1bmRlZmluZWQgOiB5anNUZXh0XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZFxuICAgICAgfVxuICAgIH0sXG4gICAgKHlqc1RleHQpID0+IHtcbiAgICAgIGRpc3Bvc2VPYnNlcnZlWWpzVGV4dD8uKClcbiAgICAgIGRpc3Bvc2VPYnNlcnZlWWpzVGV4dCA9IHVuZGVmaW5lZFxuXG4gICAgICBpZiAoeWpzVGV4dCkge1xuICAgICAgICB5anNUZXh0Lm9ic2VydmUob2JzZXJ2ZUZuKVxuXG4gICAgICAgIGRpc3Bvc2VPYnNlcnZlWWpzVGV4dCA9ICgpID0+IHtcbiAgICAgICAgICB5anNUZXh0LnVub2JzZXJ2ZShvYnNlcnZlRm4pXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdGV4dENoYW5nZWRBdG9tLnJlcG9ydENoYW5nZWQoKVxuICAgIH0sXG4gICAge1xuICAgICAgZmlyZUltbWVkaWF0ZWx5OiB0cnVlLFxuICAgIH1cbiAgKVxuXG4gIHJldHVybiAoKSA9PiB7XG4gICAgZGlzcG9zZVJlYWN0aW9uVG9ZVGV4dENoYW5nZSgpXG4gICAgZGlzcG9zZU9ic2VydmVZanNUZXh0Py4oKVxuICAgIGRpc3Bvc2VPYnNlcnZlWWpzVGV4dCA9IHVuZGVmaW5lZFxuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBZIGZyb20gXCJ5anNcIlxuXG4vKipcbiAqIFdlYWtNYXAgdGhhdCB0cmFja3Mgd2hpY2ggc25hcHNob3QgZWFjaCBZLmpzIGNvbnRhaW5lciB3YXMgbGFzdCBzeW5jZWQgZnJvbS5cbiAqIFRoaXMgaXMgdXNlZCBkdXJpbmcgcmVjb25jaWxpYXRpb24gdG8gc2tpcCBjb250YWluZXJzIHRoYXQgYXJlIGFscmVhZHkgdXAtdG8tZGF0ZS5cbiAqXG4gKiBUaGUga2V5IGlzIHRoZSBZLmpzIGNvbnRhaW5lciAoWS5NYXAgb3IgWS5BcnJheSkuXG4gKiBUaGUgdmFsdWUgaXMgdGhlIHNuYXBzaG90IChwbGFpbiBvYmplY3Qgb3IgYXJyYXkpIHRoYXQgd2FzIGxhc3Qgc3luY2VkIHRvIGl0LlxuICovXG5leHBvcnQgY29uc3QgeWpzQ29udGFpbmVyVG9TbmFwc2hvdCA9IG5ldyBXZWFrTWFwPFkuTWFwPGFueT4gfCBZLkFycmF5PGFueT4sIHVua25vd24+KClcblxuLyoqXG4gKiBVcGRhdGVzIHRoZSBzbmFwc2hvdCB0cmFja2luZyBmb3IgYSBZLmpzIGNvbnRhaW5lci5cbiAqIENhbGwgdGhpcyBhZnRlciBzeW5jaW5nIGEgc25hcHNob3QgdG8gYSBZLmpzIGNvbnRhaW5lci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldFlqc0NvbnRhaW5lclNuYXBzaG90KFxuICBjb250YWluZXI6IFkuTWFwPGFueT4gfCBZLkFycmF5PGFueT4sXG4gIHNuYXBzaG90OiB1bmtub3duXG4pOiB2b2lkIHtcbiAgeWpzQ29udGFpbmVyVG9TbmFwc2hvdC5zZXQoY29udGFpbmVyLCBzbmFwc2hvdClcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBsYXN0IHN5bmNlZCBzbmFwc2hvdCBmb3IgYSBZLmpzIGNvbnRhaW5lci5cbiAqIFJldHVybnMgdW5kZWZpbmVkIGlmIHRoZSBjb250YWluZXIgaGFzIG5ldmVyIGJlZW4gc3luY2VkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0WWpzQ29udGFpbmVyU25hcHNob3QoY29udGFpbmVyOiBZLk1hcDxhbnk+IHwgWS5BcnJheTxhbnk+KTogdW5rbm93biB7XG4gIHJldHVybiB5anNDb250YWluZXJUb1NuYXBzaG90LmdldChjb250YWluZXIpXG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGEgWS5qcyBjb250YWluZXIgaXMgdXAtdG8tZGF0ZSB3aXRoIHRoZSBnaXZlbiBzbmFwc2hvdC5cbiAqIFVzZXMgcmVmZXJlbmNlIGVxdWFsaXR5IHRvIGNoZWNrIGlmIHRoZSBzbmFwc2hvdCBpcyB0aGUgc2FtZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzWWpzQ29udGFpbmVyVXBUb0RhdGUoXG4gIGNvbnRhaW5lcjogWS5NYXA8YW55PiB8IFkuQXJyYXk8YW55PixcbiAgc25hcHNob3Q6IHVua25vd25cbik6IGJvb2xlYW4ge1xuICByZXR1cm4geWpzQ29udGFpbmVyVG9TbmFwc2hvdC5nZXQoY29udGFpbmVyKSA9PT0gc25hcHNob3Rcbn1cbiIsImltcG9ydCB7IGZyb3plbktleSwgbW9kZWxUeXBlS2V5LCBTbmFwc2hvdE91dE9mIH0gZnJvbSBcIm1vYngta2V5c3RvbmVcIlxuaW1wb3J0ICogYXMgWSBmcm9tIFwieWpzXCJcbmltcG9ydCB7IFBsYWluQXJyYXksIFBsYWluT2JqZWN0LCBQbGFpblByaW1pdGl2ZSwgUGxhaW5WYWx1ZSB9IGZyb20gXCIuLi9wbGFpblR5cGVzXCJcbmltcG9ydCB7IFlqc0RhdGEgfSBmcm9tIFwiLi9jb252ZXJ0WWpzRGF0YVRvSnNvblwiXG5pbXBvcnQgeyBZanNUZXh0TW9kZWwsIHlqc1RleHRNb2RlbElkIH0gZnJvbSBcIi4vWWpzVGV4dE1vZGVsXCJcbmltcG9ydCB7IGlzWWpzQ29udGFpbmVyVXBUb0RhdGUsIHNldFlqc0NvbnRhaW5lclNuYXBzaG90IH0gZnJvbSBcIi4veWpzU25hcHNob3RUcmFja2luZ1wiXG5cbi8qKlxuICogT3B0aW9ucyBmb3IgYXBwbHlpbmcgSlNPTiBkYXRhIHRvIFkuanMgZGF0YSBzdHJ1Y3R1cmVzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFwcGx5SnNvblRvWWpzT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgbW9kZSB0byB1c2Ugd2hlbiBhcHBseWluZyBKU09OIGRhdGEgdG8gWS5qcyBkYXRhIHN0cnVjdHVyZXMuXG4gICAqIC0gYGFkZGA6IENyZWF0ZXMgbmV3IFkuanMgY29udGFpbmVycyBmb3Igb2JqZWN0cy9hcnJheXMgKGRlZmF1bHQsIGJhY2t3YXJkcyBjb21wYXRpYmxlKVxuICAgKiAtIGBtZXJnZWA6IFJlY3Vyc2l2ZWx5IG1lcmdlcyB2YWx1ZXMsIHByZXNlcnZpbmcgZXhpc3RpbmcgY29udGFpbmVyIHJlZmVyZW5jZXMgd2hlcmUgcG9zc2libGVcbiAgICovXG4gIG1vZGU/OiBcImFkZFwiIHwgXCJtZXJnZVwiXG59XG5cbmZ1bmN0aW9uIGlzUGxhaW5QcmltaXRpdmUodjogUGxhaW5WYWx1ZSk6IHYgaXMgUGxhaW5QcmltaXRpdmUge1xuICBjb25zdCB0ID0gdHlwZW9mIHZcbiAgcmV0dXJuIHQgPT09IFwic3RyaW5nXCIgfHwgdCA9PT0gXCJudW1iZXJcIiB8fCB0ID09PSBcImJvb2xlYW5cIiB8fCB2ID09PSBudWxsIHx8IHYgPT09IHVuZGVmaW5lZFxufVxuXG5mdW5jdGlvbiBpc1BsYWluQXJyYXkodjogUGxhaW5WYWx1ZSk6IHYgaXMgUGxhaW5BcnJheSB7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KHYpXG59XG5cbmZ1bmN0aW9uIGlzUGxhaW5PYmplY3QodjogUGxhaW5WYWx1ZSk6IHYgaXMgUGxhaW5PYmplY3Qge1xuICByZXR1cm4gdHlwZW9mIHYgPT09IFwib2JqZWN0XCIgJiYgdiAhPT0gbnVsbCAmJiAhQXJyYXkuaXNBcnJheSh2KVxufVxuXG4vKipcbiAqIENvbnZlcnRzIGEgcGxhaW4gdmFsdWUgdG8gYSBZLmpzIGRhdGEgc3RydWN0dXJlLlxuICogT2JqZWN0cyBhcmUgY29udmVydGVkIHRvIFkuTWFwcywgYXJyYXlzIHRvIFkuQXJyYXlzLCBwcmltaXRpdmVzIGFyZSB1bnRvdWNoZWQuXG4gKiBGcm96ZW4gdmFsdWVzIGFyZSBhIHNwZWNpYWwgY2FzZSBhbmQgdGhleSBhcmUga2VwdCBhcyBpbW11dGFibGUgcGxhaW4gdmFsdWVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29udmVydEpzb25Ub1lqc0RhdGEodjogUGxhaW5WYWx1ZSk6IFlqc0RhdGEge1xuICBpZiAoaXNQbGFpblByaW1pdGl2ZSh2KSkge1xuICAgIHJldHVybiB2XG4gIH1cblxuICBpZiAoaXNQbGFpbkFycmF5KHYpKSB7XG4gICAgY29uc3QgYXJyID0gbmV3IFkuQXJyYXkoKVxuICAgIGFwcGx5SnNvbkFycmF5VG9ZQXJyYXkoYXJyLCB2KVxuICAgIHJldHVybiBhcnJcbiAgfVxuXG4gIGlmIChpc1BsYWluT2JqZWN0KHYpKSB7XG4gICAgaWYgKHZbZnJvemVuS2V5XSA9PT0gdHJ1ZSkge1xuICAgICAgLy8gZnJvemVuIHZhbHVlLCBzYXZlIGFzIGltbXV0YWJsZSBvYmplY3RcbiAgICAgIHJldHVybiB2XG4gICAgfVxuXG4gICAgaWYgKHZbbW9kZWxUeXBlS2V5XSA9PT0geWpzVGV4dE1vZGVsSWQpIHtcbiAgICAgIGNvbnN0IHRleHQgPSBuZXcgWS5UZXh0KClcbiAgICAgIGNvbnN0IHlqc1RleHRNb2RlbCA9IHYgYXMgdW5rbm93biBhcyBTbmFwc2hvdE91dE9mPFlqc1RleHRNb2RlbD5cbiAgICAgIHlqc1RleHRNb2RlbC5kZWx0YUxpc3QuZm9yRWFjaCgoZnJvemVuRGVsdGFzKSA9PiB7XG4gICAgICAgIHRleHQuYXBwbHlEZWx0YShmcm96ZW5EZWx0YXMuZGF0YSlcbiAgICAgIH0pXG4gICAgICByZXR1cm4gdGV4dFxuICAgIH1cblxuICAgIGNvbnN0IG1hcCA9IG5ldyBZLk1hcCgpXG4gICAgYXBwbHlKc29uT2JqZWN0VG9ZTWFwKG1hcCwgdilcbiAgICByZXR1cm4gbWFwXG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoYHVuc3VwcG9ydGVkIHZhbHVlIHR5cGU6ICR7dn1gKVxufVxuXG4vKipcbiAqIEFwcGxpZXMgYSBKU09OIGFycmF5IHRvIGEgWS5BcnJheSwgdXNpbmcgdGhlIGNvbnZlcnRKc29uVG9ZanNEYXRhIHRvIGNvbnZlcnQgdGhlIHZhbHVlcy5cbiAqXG4gKiBAcGFyYW0gZGVzdCBUaGUgZGVzdGluYXRpb24gWS5BcnJheS5cbiAqIEBwYXJhbSBzb3VyY2UgVGhlIHNvdXJjZSBKU09OIGFycmF5LlxuICogQHBhcmFtIG9wdGlvbnMgT3B0aW9ucyBmb3IgYXBwbHlpbmcgdGhlIEpTT04gZGF0YS5cbiAqL1xuZXhwb3J0IGNvbnN0IGFwcGx5SnNvbkFycmF5VG9ZQXJyYXkgPSAoXG4gIGRlc3Q6IFkuQXJyYXk8YW55PixcbiAgc291cmNlOiBQbGFpbkFycmF5LFxuICBvcHRpb25zOiBBcHBseUpzb25Ub1lqc09wdGlvbnMgPSB7fVxuKSA9PiB7XG4gIGNvbnN0IHsgbW9kZSA9IFwiYWRkXCIgfSA9IG9wdGlvbnNcblxuICAvLyBJbiBtZXJnZSBtb2RlLCBjaGVjayBpZiB0aGUgY29udGFpbmVyIGlzIGFscmVhZHkgdXAtdG8tZGF0ZSB3aXRoIHRoaXMgc25hcHNob3RcbiAgaWYgKG1vZGUgPT09IFwibWVyZ2VcIiAmJiBpc1lqc0NvbnRhaW5lclVwVG9EYXRlKGRlc3QsIHNvdXJjZSkpIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIGNvbnN0IHNyY0xlbiA9IHNvdXJjZS5sZW5ndGhcblxuICBpZiAobW9kZSA9PT0gXCJhZGRcIikge1xuICAgIC8vIEFkZCBtb2RlOiBqdXN0IHB1c2ggYWxsIGl0ZW1zIHRvIHRoZSBlbmRcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNyY0xlbjsgaSsrKSB7XG4gICAgICBkZXN0LnB1c2goW2NvbnZlcnRKc29uVG9ZanNEYXRhKHNvdXJjZVtpXSldKVxuICAgIH1cbiAgICByZXR1cm5cbiAgfVxuXG4gIC8vIE1lcmdlIG1vZGU6IHJlY3Vyc2l2ZWx5IG1lcmdlIHZhbHVlcywgcHJlc2VydmluZyBleGlzdGluZyBjb250YWluZXIgcmVmZXJlbmNlc1xuICBjb25zdCBkZXN0TGVuID0gZGVzdC5sZW5ndGhcblxuICAvLyBSZW1vdmUgZXh0cmEgaXRlbXMgZnJvbSB0aGUgZW5kXG4gIGlmIChkZXN0TGVuID4gc3JjTGVuKSB7XG4gICAgZGVzdC5kZWxldGUoc3JjTGVuLCBkZXN0TGVuIC0gc3JjTGVuKVxuICB9XG5cbiAgLy8gVXBkYXRlIGV4aXN0aW5nIGl0ZW1zXG4gIGNvbnN0IG1pbkxlbiA9IE1hdGgubWluKGRlc3RMZW4sIHNyY0xlbilcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBtaW5MZW47IGkrKykge1xuICAgIGNvbnN0IHNyY0l0ZW0gPSBzb3VyY2VbaV1cbiAgICBjb25zdCBkZXN0SXRlbSA9IGRlc3QuZ2V0KGkpXG5cbiAgICAvLyBJZiBib3RoIGFyZSBvYmplY3RzLCBtZXJnZSByZWN1cnNpdmVseVxuICAgIGlmIChpc1BsYWluT2JqZWN0KHNyY0l0ZW0pICYmIGRlc3RJdGVtIGluc3RhbmNlb2YgWS5NYXApIHtcbiAgICAgIGFwcGx5SnNvbk9iamVjdFRvWU1hcChkZXN0SXRlbSwgc3JjSXRlbSwgb3B0aW9ucylcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuXG4gICAgLy8gSWYgYm90aCBhcmUgYXJyYXlzLCBtZXJnZSByZWN1cnNpdmVseVxuICAgIGlmIChpc1BsYWluQXJyYXkoc3JjSXRlbSkgJiYgZGVzdEl0ZW0gaW5zdGFuY2VvZiBZLkFycmF5KSB7XG4gICAgICBhcHBseUpzb25BcnJheVRvWUFycmF5KGRlc3RJdGVtLCBzcmNJdGVtLCBvcHRpb25zKVxuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICAvLyBTa2lwIGlmIHByaW1pdGl2ZSB2YWx1ZSBpcyB1bmNoYW5nZWQgKG9wdGltaXphdGlvbilcbiAgICBpZiAoaXNQbGFpblByaW1pdGl2ZShzcmNJdGVtKSAmJiBkZXN0SXRlbSA9PT0gc3JjSXRlbSkge1xuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICAvLyBPdGhlcndpc2UsIHJlcGxhY2UgdGhlIGl0ZW1cbiAgICBkZXN0LmRlbGV0ZShpLCAxKVxuICAgIGRlc3QuaW5zZXJ0KGksIFtjb252ZXJ0SnNvblRvWWpzRGF0YShzcmNJdGVtKV0pXG4gIH1cblxuICAvLyBBZGQgbmV3IGl0ZW1zIGF0IHRoZSBlbmRcbiAgZm9yIChsZXQgaSA9IGRlc3RMZW47IGkgPCBzcmNMZW47IGkrKykge1xuICAgIGRlc3QucHVzaChbY29udmVydEpzb25Ub1lqc0RhdGEoc291cmNlW2ldKV0pXG4gIH1cblxuICAvLyBVcGRhdGUgc25hcHNob3QgdHJhY2tpbmcgYWZ0ZXIgc3VjY2Vzc2Z1bCBtZXJnZVxuICBzZXRZanNDb250YWluZXJTbmFwc2hvdChkZXN0LCBzb3VyY2UpXG59XG5cbi8qKlxuICogQXBwbGllcyBhIEpTT04gb2JqZWN0IHRvIGEgWS5NYXAsIHVzaW5nIHRoZSBjb252ZXJ0SnNvblRvWWpzRGF0YSB0byBjb252ZXJ0IHRoZSB2YWx1ZXMuXG4gKlxuICogQHBhcmFtIGRlc3QgVGhlIGRlc3RpbmF0aW9uIFkuTWFwLlxuICogQHBhcmFtIHNvdXJjZSBUaGUgc291cmNlIEpTT04gb2JqZWN0LlxuICogQHBhcmFtIG9wdGlvbnMgT3B0aW9ucyBmb3IgYXBwbHlpbmcgdGhlIEpTT04gZGF0YS5cbiAqL1xuZXhwb3J0IGNvbnN0IGFwcGx5SnNvbk9iamVjdFRvWU1hcCA9IChcbiAgZGVzdDogWS5NYXA8YW55PixcbiAgc291cmNlOiBQbGFpbk9iamVjdCxcbiAgb3B0aW9uczogQXBwbHlKc29uVG9ZanNPcHRpb25zID0ge31cbikgPT4ge1xuICBjb25zdCB7IG1vZGUgPSBcImFkZFwiIH0gPSBvcHRpb25zXG5cbiAgLy8gSW4gbWVyZ2UgbW9kZSwgY2hlY2sgaWYgdGhlIGNvbnRhaW5lciBpcyBhbHJlYWR5IHVwLXRvLWRhdGUgd2l0aCB0aGlzIHNuYXBzaG90XG4gIGlmIChtb2RlID09PSBcIm1lcmdlXCIgJiYgaXNZanNDb250YWluZXJVcFRvRGF0ZShkZXN0LCBzb3VyY2UpKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICBpZiAobW9kZSA9PT0gXCJhZGRcIikge1xuICAgIC8vIEFkZCBtb2RlOiBqdXN0IHNldCBhbGwgdmFsdWVzXG4gICAgZm9yIChjb25zdCBrIG9mIE9iamVjdC5rZXlzKHNvdXJjZSkpIHtcbiAgICAgIGNvbnN0IHYgPSBzb3VyY2Vba11cbiAgICAgIGlmICh2ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZGVzdC5zZXQoaywgY29udmVydEpzb25Ub1lqc0RhdGEodikpXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVyblxuICB9XG5cbiAgLy8gTWVyZ2UgbW9kZTogcmVjdXJzaXZlbHkgbWVyZ2UgdmFsdWVzLCBwcmVzZXJ2aW5nIGV4aXN0aW5nIGNvbnRhaW5lciByZWZlcmVuY2VzXG5cbiAgLy8gRGVsZXRlIGtleXMgdGhhdCBhcmUgbm90IHByZXNlbnQgaW4gc291cmNlIChvciBoYXZlIHVuZGVmaW5lZCB2YWx1ZSlcbiAgY29uc3Qgc291cmNlS2V5c1dpdGhWYWx1ZXMgPSBuZXcgU2V0KE9iamVjdC5rZXlzKHNvdXJjZSkuZmlsdGVyKChrKSA9PiBzb3VyY2Vba10gIT09IHVuZGVmaW5lZCkpXG4gIGZvciAoY29uc3Qga2V5IG9mIGRlc3Qua2V5cygpKSB7XG4gICAgaWYgKCFzb3VyY2VLZXlzV2l0aFZhbHVlcy5oYXMoa2V5KSkge1xuICAgICAgZGVzdC5kZWxldGUoa2V5KVxuICAgIH1cbiAgfVxuXG4gIGZvciAoY29uc3QgayBvZiBPYmplY3Qua2V5cyhzb3VyY2UpKSB7XG4gICAgY29uc3QgdiA9IHNvdXJjZVtrXVxuICAgIC8vIFNraXAgdW5kZWZpbmVkIHZhbHVlcyAtIFkuanMgbWFwcyBjYW5ub3Qgc3RvcmUgdW5kZWZpbmVkXG4gICAgaWYgKHYgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICBjb25zdCBleGlzdGluZyA9IGRlc3QuZ2V0KGspXG5cbiAgICAvLyBJZiBzb3VyY2UgaXMgYW4gb2JqZWN0IGFuZCBkZXN0IGhhcyBhIFkuTWFwLCBtZXJnZSByZWN1cnNpdmVseVxuICAgIGlmIChpc1BsYWluT2JqZWN0KHYpICYmIGV4aXN0aW5nIGluc3RhbmNlb2YgWS5NYXApIHtcbiAgICAgIGFwcGx5SnNvbk9iamVjdFRvWU1hcChleGlzdGluZywgdiwgb3B0aW9ucylcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuXG4gICAgLy8gSWYgc291cmNlIGlzIGFuIGFycmF5IGFuZCBkZXN0IGhhcyBhIFkuQXJyYXksIG1lcmdlIHJlY3Vyc2l2ZWx5XG4gICAgaWYgKGlzUGxhaW5BcnJheSh2KSAmJiBleGlzdGluZyBpbnN0YW5jZW9mIFkuQXJyYXkpIHtcbiAgICAgIGFwcGx5SnNvbkFycmF5VG9ZQXJyYXkoZXhpc3RpbmcsIHYsIG9wdGlvbnMpXG4gICAgICBjb250aW51ZVxuICAgIH1cblxuICAgIC8vIFNraXAgaWYgcHJpbWl0aXZlIHZhbHVlIGlzIHVuY2hhbmdlZCAob3B0aW1pemF0aW9uKVxuICAgIGlmIChpc1BsYWluUHJpbWl0aXZlKHYpICYmIGV4aXN0aW5nID09PSB2KSB7XG4gICAgICBjb250aW51ZVxuICAgIH1cblxuICAgIC8vIE90aGVyd2lzZSwgY29udmVydCBhbmQgc2V0IHRoZSB2YWx1ZSAodGhpcyBjcmVhdGVzIG5ldyBjb250YWluZXJzIGlmIG5lZWRlZClcbiAgICBkZXN0LnNldChrLCBjb252ZXJ0SnNvblRvWWpzRGF0YSh2KSlcbiAgfVxuXG4gIC8vIFVwZGF0ZSBzbmFwc2hvdCB0cmFja2luZyBhZnRlciBzdWNjZXNzZnVsIG1lcmdlXG4gIHNldFlqc0NvbnRhaW5lclNuYXBzaG90KGRlc3QsIHNvdXJjZSlcbn1cbiIsImltcG9ydCB7IERlZXBDaGFuZ2UsIERlZXBDaGFuZ2VUeXBlIH0gZnJvbSBcIm1vYngta2V5c3RvbmVcIlxuaW1wb3J0ICogYXMgWSBmcm9tIFwieWpzXCJcbmltcG9ydCB7IGZhaWx1cmUgfSBmcm9tIFwiLi4vdXRpbHMvZXJyb3JcIlxuaW1wb3J0IHsgaXNZanNWYWx1ZURlbGV0ZWQgfSBmcm9tIFwiLi4vdXRpbHMvaXNZanNWYWx1ZURlbGV0ZWRcIlxuaW1wb3J0IHsgY29udmVydEpzb25Ub1lqc0RhdGEgfSBmcm9tIFwiLi9jb252ZXJ0SnNvblRvWWpzRGF0YVwiXG5pbXBvcnQgeyByZXNvbHZlWWpzUGF0aCB9IGZyb20gXCIuL3Jlc29sdmVZanNQYXRoXCJcblxuLyoqXG4gKiBDb252ZXJ0cyBhIHNuYXBzaG90IHZhbHVlIHRvIGEgWWpzLWNvbXBhdGlibGUgdmFsdWUuXG4gKiBOb3RlOiBBbGwgdmFsdWVzIHBhc3NlZCBoZXJlIGFyZSBhbHJlYWR5IHNuYXBzaG90cyAoY2FwdHVyZWQgYXQgY2hhbmdlIHRpbWUpLlxuICovXG5mdW5jdGlvbiBjb252ZXJ0VmFsdWUodjogdW5rbm93bik6IGFueSB7XG4gIC8vIEhhbmRsZSBwcmltaXRpdmVzIGRpcmVjdGx5XG4gIGlmICh2ID09PSBudWxsIHx8IHYgPT09IHVuZGVmaW5lZCB8fCB0eXBlb2YgdiAhPT0gXCJvYmplY3RcIikge1xuICAgIHJldHVybiB2XG4gIH1cbiAgLy8gSGFuZGxlIHBsYWluIGFycmF5cyAtIHVzZWQgZm9yIGVtcHR5IGFycmF5IGluaXRcbiAgaWYgKEFycmF5LmlzQXJyYXkodikgJiYgdi5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gbmV3IFkuQXJyYXkoKVxuICB9XG4gIC8vIFZhbHVlIGlzIGFscmVhZHkgYSBzbmFwc2hvdCwgY29udmVydCB0byBZanMgZGF0YVxuICByZXR1cm4gY29udmVydEpzb25Ub1lqc0RhdGEodiBhcyBhbnkpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhcHBseU1vYnhDaGFuZ2VUb1lqc09iamVjdChcbiAgY2hhbmdlOiBEZWVwQ2hhbmdlLFxuICB5anNPYmplY3Q6IFkuTWFwPGFueT4gfCBZLkFycmF5PGFueT4gfCBZLlRleHRcbik6IHZvaWQge1xuICAvLyBDaGVjayBpZiB0aGUgWUpTIG9iamVjdCBpcyBkZWxldGVkXG4gIGlmIChpc1lqc1ZhbHVlRGVsZXRlZCh5anNPYmplY3QpKSB7XG4gICAgdGhyb3cgZmFpbHVyZShcImNhbm5vdCBhcHBseSBwYXRjaCB0byBkZWxldGVkIFlqcyB2YWx1ZVwiKVxuICB9XG5cbiAgY29uc3QgeWpzQ29udGFpbmVyID0gcmVzb2x2ZVlqc1BhdGgoeWpzT2JqZWN0LCBjaGFuZ2UucGF0aClcblxuICBpZiAoIXlqc0NvbnRhaW5lcikge1xuICAgIC8vIENvbnRhaW5lciBub3QgZm91bmQsIHNraXAgdGhpcyBjaGFuZ2VcbiAgICByZXR1cm5cbiAgfVxuXG4gIGlmICh5anNDb250YWluZXIgaW5zdGFuY2VvZiBZLkFycmF5KSB7XG4gICAgaWYgKGNoYW5nZS50eXBlID09PSBEZWVwQ2hhbmdlVHlwZS5BcnJheVNwbGljZSkge1xuICAgICAgLy8gc3BsaWNlXG4gICAgICB5anNDb250YWluZXIuZGVsZXRlKGNoYW5nZS5pbmRleCwgY2hhbmdlLnJlbW92ZWRWYWx1ZXMubGVuZ3RoKVxuICAgICAgaWYgKGNoYW5nZS5hZGRlZFZhbHVlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IHZhbHVlc1RvSW5zZXJ0ID0gY2hhbmdlLmFkZGVkVmFsdWVzLm1hcChjb252ZXJ0VmFsdWUpXG4gICAgICAgIHlqc0NvbnRhaW5lci5pbnNlcnQoY2hhbmdlLmluZGV4LCB2YWx1ZXNUb0luc2VydClcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGNoYW5nZS50eXBlID09PSBEZWVwQ2hhbmdlVHlwZS5BcnJheVVwZGF0ZSkge1xuICAgICAgLy8gdXBkYXRlXG4gICAgICB5anNDb250YWluZXIuZGVsZXRlKGNoYW5nZS5pbmRleCwgMSlcbiAgICAgIHlqc0NvbnRhaW5lci5pbnNlcnQoY2hhbmdlLmluZGV4LCBbY29udmVydFZhbHVlKGNoYW5nZS5uZXdWYWx1ZSldKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBmYWlsdXJlKGB1bnN1cHBvcnRlZCBhcnJheSBjaGFuZ2UgdHlwZTogJHtjaGFuZ2UudHlwZX1gKVxuICAgIH1cbiAgfSBlbHNlIGlmICh5anNDb250YWluZXIgaW5zdGFuY2VvZiBZLk1hcCkge1xuICAgIGlmIChjaGFuZ2UudHlwZSA9PT0gRGVlcENoYW5nZVR5cGUuT2JqZWN0QWRkIHx8IGNoYW5nZS50eXBlID09PSBEZWVwQ2hhbmdlVHlwZS5PYmplY3RVcGRhdGUpIHtcbiAgICAgIGNvbnN0IGtleSA9IGNoYW5nZS5rZXlcbiAgICAgIGlmIChjaGFuZ2UubmV3VmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB5anNDb250YWluZXIuZGVsZXRlKGtleSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHlqc0NvbnRhaW5lci5zZXQoa2V5LCBjb252ZXJ0VmFsdWUoY2hhbmdlLm5ld1ZhbHVlKSlcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGNoYW5nZS50eXBlID09PSBEZWVwQ2hhbmdlVHlwZS5PYmplY3RSZW1vdmUpIHtcbiAgICAgIGNvbnN0IGtleSA9IGNoYW5nZS5rZXlcbiAgICAgIHlqc0NvbnRhaW5lci5kZWxldGUoa2V5KVxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBmYWlsdXJlKGB1bnN1cHBvcnRlZCBvYmplY3QgY2hhbmdlIHR5cGU6ICR7Y2hhbmdlLnR5cGV9YClcbiAgICB9XG4gIH0gZWxzZSBpZiAoeWpzQ29udGFpbmVyIGluc3RhbmNlb2YgWS5UZXh0KSB7XG4gICAgLy8gWS5UZXh0IGlzIGhhbmRsZWQgZGlmZmVyZW50bHkgLSBpbml0IGNoYW5nZXMgZm9yIHRleHQgYXJlIG1hbmFnZWQgYnkgWWpzVGV4dE1vZGVsXG4gICAgLy8gU2tpcCBpbml0IGNoYW5nZXMgZm9yIFkuVGV4dCBjb250YWluZXJzXG4gICAgcmV0dXJuXG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgZmFpbHVyZShgdW5zdXBwb3J0ZWQgWWpzIGNvbnRhaW5lciB0eXBlOiAke3lqc0NvbnRhaW5lcn1gKVxuICB9XG59XG4iLCJpbXBvcnQgeyBhY3Rpb24gfSBmcm9tIFwibW9ieFwiXG5pbXBvcnQgeyBtb2RlbFNuYXBzaG90T3V0V2l0aE1ldGFkYXRhIH0gZnJvbSBcIm1vYngta2V5c3RvbmVcIlxuaW1wb3J0ICogYXMgWSBmcm9tIFwieWpzXCJcbmltcG9ydCB7IFBsYWluT2JqZWN0LCBQbGFpblZhbHVlIH0gZnJvbSBcIi4uL3BsYWluVHlwZXNcIlxuaW1wb3J0IHsgWWpzVGV4dE1vZGVsIH0gZnJvbSBcIi4vWWpzVGV4dE1vZGVsXCJcblxuZXhwb3J0IHR5cGUgWWpzRGF0YSA9IFkuQXJyYXk8YW55PiB8IFkuTWFwPGFueT4gfCBZLlRleHQgfCBQbGFpblZhbHVlXG5cbmV4cG9ydCBjb25zdCBjb252ZXJ0WWpzRGF0YVRvSnNvbiA9IGFjdGlvbigoeWpzRGF0YTogWWpzRGF0YSk6IFBsYWluVmFsdWUgPT4ge1xuICBpZiAoeWpzRGF0YSBpbnN0YW5jZW9mIFkuQXJyYXkpIHtcbiAgICByZXR1cm4geWpzRGF0YS5tYXAoKHYpID0+IGNvbnZlcnRZanNEYXRhVG9Kc29uKHYpKVxuICB9XG5cbiAgaWYgKHlqc0RhdGEgaW5zdGFuY2VvZiBZLk1hcCkge1xuICAgIGNvbnN0IG9iajogUGxhaW5PYmplY3QgPSB7fVxuICAgIHlqc0RhdGEuZm9yRWFjaCgodiwgaykgPT4ge1xuICAgICAgb2JqW2tdID0gY29udmVydFlqc0RhdGFUb0pzb24odilcbiAgICB9KVxuICAgIHJldHVybiBvYmpcbiAgfVxuXG4gIGlmICh5anNEYXRhIGluc3RhbmNlb2YgWS5UZXh0KSB7XG4gICAgY29uc3QgZGVsdGFzID0geWpzRGF0YS50b0RlbHRhKCkgYXMgdW5rbm93bltdXG5cbiAgICByZXR1cm4gbW9kZWxTbmFwc2hvdE91dFdpdGhNZXRhZGF0YShZanNUZXh0TW9kZWwsIHtcbiAgICAgIGRlbHRhTGlzdDogZGVsdGFzLmxlbmd0aCA+IDAgPyBbeyAkZnJvemVuOiB0cnVlLCBkYXRhOiBkZWx0YXMgfV0gOiBbXSxcbiAgICB9KSBhcyB1bmtub3duIGFzIFBsYWluVmFsdWVcbiAgfVxuXG4gIC8vIGFzc3VtZSBpdCdzIGEgcHJpbWl0aXZlXG4gIHJldHVybiB5anNEYXRhXG59KVxuIiwiaW1wb3J0IHsgcmVtb3ZlIH0gZnJvbSBcIm1vYnhcIlxuaW1wb3J0IHtcbiAgRnJvemVuLFxuICBmcm9tU25hcHNob3QsXG4gIGZyb3plbixcbiAgZ2V0U25hcHNob3QsXG4gIGdldFNuYXBzaG90TW9kZWxJZCxcbiAgaXNGcm96ZW5TbmFwc2hvdCxcbiAgaXNNb2RlbCxcbiAgUGF0aCxcbiAgcmVzb2x2ZVBhdGgsXG4gIHJ1blVucHJvdGVjdGVkLFxufSBmcm9tIFwibW9ieC1rZXlzdG9uZVwiXG5pbXBvcnQgKiBhcyBZIGZyb20gXCJ5anNcIlxuaW1wb3J0IHsgZmFpbHVyZSB9IGZyb20gXCIuLi91dGlscy9lcnJvclwiXG5pbXBvcnQgeyBjb252ZXJ0WWpzRGF0YVRvSnNvbiB9IGZyb20gXCIuL2NvbnZlcnRZanNEYXRhVG9Kc29uXCJcblxuLy8gUmVwcmVzZW50cyB0aGUgbWFwIG9mIHBvdGVudGlhbCBvYmplY3RzIHRvIHJlY29uY2lsZSAoSUQgLT4gT2JqZWN0KVxuZXhwb3J0IHR5cGUgUmVjb25jaWxpYXRpb25NYXAgPSBNYXA8c3RyaW5nLCBvYmplY3Q+XG5cbi8qKlxuICogQXBwbGllcyBhIFkuanMgZXZlbnQgZGlyZWN0bHkgdG8gdGhlIE1vYlggbW9kZWwgdHJlZSB1c2luZyBwcm9wZXIgbXV0YXRpb25zXG4gKiAoc3BsaWNlIGZvciBhcnJheXMsIHByb3BlcnR5IGFzc2lnbm1lbnQgZm9yIG9iamVjdHMpLlxuICogVGhpcyBpcyBtb3JlIGVmZmljaWVudCB0aGFuIGNvbnZlcnRpbmcgdG8gcGF0Y2hlcyBmaXJzdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5WWpzRXZlbnRUb01vYngoXG4gIGV2ZW50OiBZLllFdmVudDxhbnk+LFxuICBib3VuZE9iamVjdDogb2JqZWN0LFxuICByZWNvbmNpbGlhdGlvbk1hcDogUmVjb25jaWxpYXRpb25NYXBcbik6IHZvaWQge1xuICBjb25zdCBwYXRoID0gZXZlbnQucGF0aCBhcyBQYXRoXG4gIGNvbnN0IHsgdmFsdWU6IHRhcmdldCB9ID0gcmVzb2x2ZVBhdGgoYm91bmRPYmplY3QsIHBhdGgpXG5cbiAgaWYgKCF0YXJnZXQpIHtcbiAgICB0aHJvdyBmYWlsdXJlKGBjYW5ub3QgcmVzb2x2ZSBwYXRoICR7SlNPTi5zdHJpbmdpZnkocGF0aCl9YClcbiAgfVxuXG4gIC8vIFdyYXAgaW4gcnVuVW5wcm90ZWN0ZWQgc2luY2Ugd2UncmUgbW9kaWZ5aW5nIHRoZSB0cmVlIGZyb20gb3V0c2lkZSBhIG1vZGVsIGFjdGlvblxuICBydW5VbnByb3RlY3RlZCgoKSA9PiB7XG4gICAgaWYgKGV2ZW50IGluc3RhbmNlb2YgWS5ZTWFwRXZlbnQpIHtcbiAgICAgIGFwcGx5WU1hcEV2ZW50VG9Nb2J4KGV2ZW50LCB0YXJnZXQsIHJlY29uY2lsaWF0aW9uTWFwKVxuICAgIH0gZWxzZSBpZiAoZXZlbnQgaW5zdGFuY2VvZiBZLllBcnJheUV2ZW50KSB7XG4gICAgICBhcHBseVlBcnJheUV2ZW50VG9Nb2J4KGV2ZW50LCB0YXJnZXQsIHJlY29uY2lsaWF0aW9uTWFwKVxuICAgIH0gZWxzZSBpZiAoZXZlbnQgaW5zdGFuY2VvZiBZLllUZXh0RXZlbnQpIHtcbiAgICAgIGFwcGx5WVRleHRFdmVudFRvTW9ieChldmVudCwgdGFyZ2V0KVxuICAgIH1cbiAgfSlcbn1cblxuZnVuY3Rpb24gcHJvY2Vzc0RlbGV0ZWRWYWx1ZSh2YWw6IHVua25vd24sIHJlY29uY2lsaWF0aW9uTWFwOiBSZWNvbmNpbGlhdGlvbk1hcCkge1xuICBpZiAodmFsICYmIHR5cGVvZiB2YWwgPT09IFwib2JqZWN0XCIgJiYgaXNNb2RlbCh2YWwpKSB7XG4gICAgY29uc3Qgc24gPSBnZXRTbmFwc2hvdCh2YWwpXG4gICAgY29uc3QgaWQgPSBnZXRTbmFwc2hvdE1vZGVsSWQoc24pXG4gICAgaWYgKGlkKSB7XG4gICAgICByZWNvbmNpbGlhdGlvbk1hcC5zZXQoaWQsIHZhbClcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gcmV2aXZlVmFsdWUoanNvblZhbHVlOiBhbnksIHJlY29uY2lsaWF0aW9uTWFwOiBSZWNvbmNpbGlhdGlvbk1hcCk6IGFueSB7XG4gIC8vIEhhbmRsZSBwcmltaXRpdmVzXG4gIGlmIChqc29uVmFsdWUgPT09IG51bGwgfHwgdHlwZW9mIGpzb25WYWx1ZSAhPT0gXCJvYmplY3RcIikge1xuICAgIHJldHVybiBqc29uVmFsdWVcbiAgfVxuXG4gIC8vIEhhbmRsZSBmcm96ZW5cbiAgaWYgKGlzRnJvemVuU25hcHNob3QoanNvblZhbHVlKSkge1xuICAgIHJldHVybiBmcm96ZW4oanNvblZhbHVlLmRhdGEpXG4gIH1cblxuICAvLyBJZiB3ZSBoYXZlIGEgcmVjb25jaWxpYXRpb24gbWFwIGFuZCB0aGUgdmFsdWUgbG9va3MgbGlrZSBhIG1vZGVsIHdpdGggYW4gSUQsIGNoZWNrIGlmIHdlIGhhdmUgaXRcbiAgaWYgKHJlY29uY2lsaWF0aW9uTWFwICYmIGpzb25WYWx1ZSAmJiB0eXBlb2YganNvblZhbHVlID09PSBcIm9iamVjdFwiKSB7XG4gICAgY29uc3QgbW9kZWxJZCA9IGdldFNuYXBzaG90TW9kZWxJZChqc29uVmFsdWUpXG4gICAgaWYgKG1vZGVsSWQpIHtcbiAgICAgIGNvbnN0IGV4aXN0aW5nID0gcmVjb25jaWxpYXRpb25NYXAuZ2V0KG1vZGVsSWQpXG4gICAgICBpZiAoZXhpc3RpbmcpIHtcbiAgICAgICAgcmVjb25jaWxpYXRpb25NYXAuZGVsZXRlKG1vZGVsSWQpXG4gICAgICAgIHJldHVybiBleGlzdGluZ1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmcm9tU25hcHNob3QoanNvblZhbHVlKVxufVxuXG5mdW5jdGlvbiBhcHBseVlNYXBFdmVudFRvTW9ieChcbiAgZXZlbnQ6IFkuWU1hcEV2ZW50PGFueT4sXG4gIHRhcmdldDogUmVjb3JkPHN0cmluZywgYW55PixcbiAgcmVjb25jaWxpYXRpb25NYXA6IFJlY29uY2lsaWF0aW9uTWFwXG4pOiB2b2lkIHtcbiAgY29uc3Qgc291cmNlID0gZXZlbnQudGFyZ2V0XG5cbiAgZXZlbnQuY2hhbmdlcy5rZXlzLmZvckVhY2goKGNoYW5nZSwga2V5KSA9PiB7XG4gICAgc3dpdGNoIChjaGFuZ2UuYWN0aW9uKSB7XG4gICAgICBjYXNlIFwiYWRkXCI6XG4gICAgICBjYXNlIFwidXBkYXRlXCI6IHtcbiAgICAgICAgY29uc3QgeWpzVmFsdWUgPSBzb3VyY2UuZ2V0KGtleSlcbiAgICAgICAgY29uc3QganNvblZhbHVlID0gY29udmVydFlqc0RhdGFUb0pzb24oeWpzVmFsdWUpXG5cbiAgICAgICAgLy8gSWYgdXBkYXRpbmcsIHRoZSBvbGQgdmFsdWUgaXMgb3ZlcndyaXR0ZW4gKGRlbGV0ZWQgY29uY2VwdHVhbGx5KVxuICAgICAgICBpZiAoY2hhbmdlLmFjdGlvbiA9PT0gXCJ1cGRhdGVcIikge1xuICAgICAgICAgIHByb2Nlc3NEZWxldGVkVmFsdWUodGFyZ2V0W2tleV0sIHJlY29uY2lsaWF0aW9uTWFwKVxuICAgICAgICB9XG5cbiAgICAgICAgdGFyZ2V0W2tleV0gPSByZXZpdmVWYWx1ZShqc29uVmFsdWUsIHJlY29uY2lsaWF0aW9uTWFwKVxuICAgICAgICBicmVha1xuICAgICAgfVxuXG4gICAgICBjYXNlIFwiZGVsZXRlXCI6IHtcbiAgICAgICAgcHJvY2Vzc0RlbGV0ZWRWYWx1ZSh0YXJnZXRba2V5XSwgcmVjb25jaWxpYXRpb25NYXApXG4gICAgICAgIC8vIFVzZSBNb2JYJ3MgcmVtb3ZlIHRvIHByb3Blcmx5IGRlbGV0ZSB0aGUga2V5IGZyb20gdGhlIG9ic2VydmFibGUgb2JqZWN0XG4gICAgICAgIC8vIFRoaXMgdHJpZ2dlcnMgdGhlIFwicmVtb3ZlXCIgaW50ZXJjZXB0b3IgaW4gbW9ieC1rZXlzdG9uZSdzIHR3ZWFrZXJcbiAgICAgICAgaWYgKGlzTW9kZWwodGFyZ2V0KSkge1xuICAgICAgICAgIHJlbW92ZSh0YXJnZXQuJCwga2V5KVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlbW92ZSh0YXJnZXQsIGtleSlcbiAgICAgICAgfVxuICAgICAgICBicmVha1xuICAgICAgfVxuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBmYWlsdXJlKGB1bnN1cHBvcnRlZCBZanMgbWFwIGV2ZW50IGFjdGlvbjogJHtjaGFuZ2UuYWN0aW9ufWApXG4gICAgfVxuICB9KVxufVxuXG5mdW5jdGlvbiBhcHBseVlBcnJheUV2ZW50VG9Nb2J4KFxuICBldmVudDogWS5ZQXJyYXlFdmVudDxhbnk+LFxuICB0YXJnZXQ6IGFueVtdLFxuICByZWNvbmNpbGlhdGlvbk1hcDogUmVjb25jaWxpYXRpb25NYXBcbik6IHZvaWQge1xuICAvLyBQcm9jZXNzIGRlbHRhIG9wZXJhdGlvbnMgaW4gb3JkZXJcbiAgbGV0IGN1cnJlbnRJbmRleCA9IDBcblxuICBmb3IgKGNvbnN0IGNoYW5nZSBvZiBldmVudC5jaGFuZ2VzLmRlbHRhKSB7XG4gICAgaWYgKGNoYW5nZS5yZXRhaW4pIHtcbiAgICAgIGN1cnJlbnRJbmRleCArPSBjaGFuZ2UucmV0YWluXG4gICAgfVxuXG4gICAgaWYgKGNoYW5nZS5kZWxldGUpIHtcbiAgICAgIC8vIENhcHR1cmUgZGVsZXRlZCBpdGVtcyBmb3IgcmVjb25jaWxpYXRpb25cbiAgICAgIGNvbnN0IGRlbGV0ZWRJdGVtcyA9IHRhcmdldC5zbGljZShjdXJyZW50SW5kZXgsIGN1cnJlbnRJbmRleCArIGNoYW5nZS5kZWxldGUpXG4gICAgICBkZWxldGVkSXRlbXMuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgICBwcm9jZXNzRGVsZXRlZFZhbHVlKGl0ZW0sIHJlY29uY2lsaWF0aW9uTWFwKVxuICAgICAgfSlcblxuICAgICAgLy8gRGVsZXRlIGl0ZW1zIGF0IGN1cnJlbnQgcG9zaXRpb25cbiAgICAgIHRhcmdldC5zcGxpY2UoY3VycmVudEluZGV4LCBjaGFuZ2UuZGVsZXRlKVxuICAgIH1cblxuICAgIGlmIChjaGFuZ2UuaW5zZXJ0KSB7XG4gICAgICAvLyBJbnNlcnQgaXRlbXMgYXQgY3VycmVudCBwb3NpdGlvblxuICAgICAgY29uc3QgaW5zZXJ0ZWRJdGVtcyA9IEFycmF5LmlzQXJyYXkoY2hhbmdlLmluc2VydCkgPyBjaGFuZ2UuaW5zZXJ0IDogW2NoYW5nZS5pbnNlcnRdXG4gICAgICBjb25zdCB2YWx1ZXMgPSBpbnNlcnRlZEl0ZW1zLm1hcCgoeWpzVmFsdWUpID0+IHtcbiAgICAgICAgY29uc3QganNvblZhbHVlID0gY29udmVydFlqc0RhdGFUb0pzb24oeWpzVmFsdWUpXG4gICAgICAgIHJldHVybiByZXZpdmVWYWx1ZShqc29uVmFsdWUsIHJlY29uY2lsaWF0aW9uTWFwKVxuICAgICAgfSlcblxuICAgICAgdGFyZ2V0LnNwbGljZShjdXJyZW50SW5kZXgsIDAsIC4uLnZhbHVlcylcbiAgICAgIGN1cnJlbnRJbmRleCArPSB2YWx1ZXMubGVuZ3RoXG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGFwcGx5WVRleHRFdmVudFRvTW9ieChcbiAgZXZlbnQ6IFkuWVRleHRFdmVudCxcbiAgdGFyZ2V0OiB7IGRlbHRhTGlzdD86IEZyb3plbjx1bmtub3duW10+W10gfVxuKTogdm9pZCB7XG4gIC8vIFlqc1RleHRNb2RlbCBoYW5kbGVzIHRleHQgZXZlbnRzIGJ5IGFwcGVuZGluZyBkZWx0YSB0byBkZWx0YUxpc3RcbiAgaWYgKHRhcmdldD8uZGVsdGFMaXN0KSB7XG4gICAgdGFyZ2V0LmRlbHRhTGlzdC5wdXNoKGZyb3plbihldmVudC5kZWx0YSkpXG4gIH1cbn1cbiIsImltcG9ydCB7IGFjdGlvbiB9IGZyb20gXCJtb2J4XCJcbmltcG9ydCB7XG4gIEFueURhdGFNb2RlbCxcbiAgQW55TW9kZWwsXG4gIEFueVN0YW5kYXJkVHlwZSxcbiAgRGVlcENoYW5nZSxcbiAgRGVlcENoYW5nZVR5cGUsXG4gIGZyb21TbmFwc2hvdCxcbiAgZ2V0UGFyZW50VG9DaGlsZFBhdGgsXG4gIGdldFNuYXBzaG90LFxuICBpc1RyZWVOb2RlLFxuICBNb2RlbENsYXNzLFxuICBvbkRlZXBDaGFuZ2UsXG4gIG9uR2xvYmFsRGVlcENoYW5nZSxcbiAgb25TbmFwc2hvdCxcbiAgU25hcHNob3RJbk9mLFxuICBUeXBlVG9EYXRhLFxufSBmcm9tIFwibW9ieC1rZXlzdG9uZVwiXG5pbXBvcnQgKiBhcyBZIGZyb20gXCJ5anNcIlxuaW1wb3J0IHR5cGUgeyBQbGFpbkFycmF5LCBQbGFpbk9iamVjdCB9IGZyb20gXCIuLi9wbGFpblR5cGVzXCJcbmltcG9ydCB7IGZhaWx1cmUgfSBmcm9tIFwiLi4vdXRpbHMvZXJyb3JcIlxuaW1wb3J0IHsgZ2V0WWpzQ29sbGVjdGlvbkF0b20gfSBmcm9tIFwiLi4vdXRpbHMvZ2V0T3JDcmVhdGVZanNDb2xsZWN0aW9uQXRvbVwiXG5pbXBvcnQgeyBpc1lqc1ZhbHVlRGVsZXRlZCB9IGZyb20gXCIuLi91dGlscy9pc1lqc1ZhbHVlRGVsZXRlZFwiXG5pbXBvcnQgeyBhcHBseU1vYnhDaGFuZ2VUb1lqc09iamVjdCB9IGZyb20gXCIuL2FwcGx5TW9ieENoYW5nZVRvWWpzT2JqZWN0XCJcbmltcG9ydCB7IGFwcGx5WWpzRXZlbnRUb01vYngsIFJlY29uY2lsaWF0aW9uTWFwIH0gZnJvbSBcIi4vYXBwbHlZanNFdmVudFRvTW9ieFwiXG5pbXBvcnQgeyBhcHBseUpzb25BcnJheVRvWUFycmF5LCBhcHBseUpzb25PYmplY3RUb1lNYXAgfSBmcm9tIFwiLi9jb252ZXJ0SnNvblRvWWpzRGF0YVwiXG5pbXBvcnQgeyBjb252ZXJ0WWpzRGF0YVRvSnNvbiB9IGZyb20gXCIuL2NvbnZlcnRZanNEYXRhVG9Kc29uXCJcbmltcG9ydCB7IFlqc0JpbmRpbmdDb250ZXh0LCB5anNCaW5kaW5nQ29udGV4dCB9IGZyb20gXCIuL3lqc0JpbmRpbmdDb250ZXh0XCJcbmltcG9ydCB7IHNldFlqc0NvbnRhaW5lclNuYXBzaG90IH0gZnJvbSBcIi4veWpzU25hcHNob3RUcmFja2luZ1wiXG5cbi8qKlxuICogQ2FwdHVyZXMgc25hcHNob3RzIG9mIHRyZWUgbm9kZXMgaW4gYSBEZWVwQ2hhbmdlLlxuICogVGhpcyBlbnN1cmVzIHZhbHVlcyBhcmUgY2FwdHVyZWQgYXQgY2hhbmdlIHRpbWUsIG5vdCBhdCBhcHBseSB0aW1lLFxuICogcHJldmVudGluZyBpc3N1ZXMgd2hlbiB2YWx1ZXMgYXJlIG11dGF0ZWQgYWZ0ZXIgYmVpbmcgYWRkZWQgdG8gYSBjb2xsZWN0aW9uLlxuICovXG5mdW5jdGlvbiBjYXB0dXJlQ2hhbmdlU25hcHNob3RzKGNoYW5nZTogRGVlcENoYW5nZSk6IERlZXBDaGFuZ2Uge1xuICBpZiAoY2hhbmdlLnR5cGUgPT09IERlZXBDaGFuZ2VUeXBlLkFycmF5U3BsaWNlICYmIGNoYW5nZS5hZGRlZFZhbHVlcy5sZW5ndGggPiAwKSB7XG4gICAgY29uc3Qgc25hcHNob3RzID0gY2hhbmdlLmFkZGVkVmFsdWVzLm1hcCgodikgPT4gKGlzVHJlZU5vZGUodikgPyBnZXRTbmFwc2hvdCh2KSA6IHYpKVxuICAgIHJldHVybiB7IC4uLmNoYW5nZSwgYWRkZWRWYWx1ZXM6IHNuYXBzaG90cyB9XG4gIH0gZWxzZSBpZiAoY2hhbmdlLnR5cGUgPT09IERlZXBDaGFuZ2VUeXBlLkFycmF5VXBkYXRlKSB7XG4gICAgY29uc3Qgc25hcHNob3QgPSBpc1RyZWVOb2RlKGNoYW5nZS5uZXdWYWx1ZSkgPyBnZXRTbmFwc2hvdChjaGFuZ2UubmV3VmFsdWUpIDogY2hhbmdlLm5ld1ZhbHVlXG4gICAgcmV0dXJuIHsgLi4uY2hhbmdlLCBuZXdWYWx1ZTogc25hcHNob3QgfVxuICB9IGVsc2UgaWYgKFxuICAgIGNoYW5nZS50eXBlID09PSBEZWVwQ2hhbmdlVHlwZS5PYmplY3RBZGQgfHxcbiAgICBjaGFuZ2UudHlwZSA9PT0gRGVlcENoYW5nZVR5cGUuT2JqZWN0VXBkYXRlXG4gICkge1xuICAgIGNvbnN0IHNuYXBzaG90ID0gaXNUcmVlTm9kZShjaGFuZ2UubmV3VmFsdWUpID8gZ2V0U25hcHNob3QoY2hhbmdlLm5ld1ZhbHVlKSA6IGNoYW5nZS5uZXdWYWx1ZVxuICAgIHJldHVybiB7IC4uLmNoYW5nZSwgbmV3VmFsdWU6IHNuYXBzaG90IH1cbiAgfVxuICByZXR1cm4gY2hhbmdlXG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIGJpZGlyZWN0aW9uYWwgYmluZGluZyBiZXR3ZWVuIGEgWS5qcyBkYXRhIHN0cnVjdHVyZSBhbmQgYSBtb2J4LWtleXN0b25lIG1vZGVsLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYmluZFlqc1RvTW9ieEtleXN0b25lPFxuICBUVHlwZSBleHRlbmRzIEFueVN0YW5kYXJkVHlwZSB8IE1vZGVsQ2xhc3M8QW55TW9kZWw+IHwgTW9kZWxDbGFzczxBbnlEYXRhTW9kZWw+LFxuPih7XG4gIHlqc0RvYyxcbiAgeWpzT2JqZWN0LFxuICBtb2J4S2V5c3RvbmVUeXBlLFxufToge1xuICAvKipcbiAgICogVGhlIFkuanMgZG9jdW1lbnQuXG4gICAqL1xuICB5anNEb2M6IFkuRG9jXG4gIC8qKlxuICAgKiBUaGUgYm91bmQgWS5qcyBkYXRhIHN0cnVjdHVyZS5cbiAgICovXG4gIHlqc09iamVjdDogWS5NYXA8YW55PiB8IFkuQXJyYXk8YW55PiB8IFkuVGV4dFxuICAvKipcbiAgICogVGhlIG1vYngta2V5c3RvbmUgbW9kZWwgdHlwZS5cbiAgICovXG4gIG1vYnhLZXlzdG9uZVR5cGU6IFRUeXBlXG59KToge1xuICAvKipcbiAgICogVGhlIGJvdW5kIG1vYngta2V5c3RvbmUgaW5zdGFuY2UuXG4gICAqL1xuICBib3VuZE9iamVjdDogVHlwZVRvRGF0YTxUVHlwZT5cbiAgLyoqXG4gICAqIERpc3Bvc2VzIHRoZSBiaW5kaW5nLlxuICAgKi9cbiAgZGlzcG9zZTogKCkgPT4gdm9pZFxuICAvKipcbiAgICogVGhlIFkuanMgb3JpZ2luIHN5bWJvbCB1c2VkIGZvciBiaW5kaW5nIHRyYW5zYWN0aW9ucy5cbiAgICovXG4gIHlqc09yaWdpbjogc3ltYm9sXG59IHtcbiAgY29uc3QgeWpzT3JpZ2luID0gU3ltYm9sKFwiYmluZFlqc1RvTW9ieEtleXN0b25lVHJhbnNhY3Rpb25PcmlnaW5cIilcblxuICBsZXQgYXBwbHlpbmdZanNDaGFuZ2VzVG9Nb2J4S2V5c3RvbmUgPSAwXG5cbiAgY29uc3QgYmluZGluZ0NvbnRleHQ6IFlqc0JpbmRpbmdDb250ZXh0ID0ge1xuICAgIHlqc0RvYyxcbiAgICB5anNPYmplY3QsXG4gICAgbW9ieEtleXN0b25lVHlwZSxcbiAgICB5anNPcmlnaW4sXG4gICAgYm91bmRPYmplY3Q6IHVuZGVmaW5lZCwgLy8gbm90IHlldCBjcmVhdGVkXG5cbiAgICBnZXQgaXNBcHBseWluZ1lqc0NoYW5nZXNUb01vYnhLZXlzdG9uZSgpIHtcbiAgICAgIHJldHVybiBhcHBseWluZ1lqc0NoYW5nZXNUb01vYnhLZXlzdG9uZSA+IDBcbiAgICB9LFxuICB9XG5cbiAgaWYgKGlzWWpzVmFsdWVEZWxldGVkKHlqc09iamVjdCkpIHtcbiAgICB0aHJvdyBmYWlsdXJlKFwiY2Fubm90IGFwcGx5IHBhdGNoIHRvIGRlbGV0ZWQgWWpzIHZhbHVlXCIpXG4gIH1cblxuICBjb25zdCB5anNKc29uID0gY29udmVydFlqc0RhdGFUb0pzb24oeWpzT2JqZWN0KVxuXG4gIGxldCBib3VuZE9iamVjdDogVHlwZVRvRGF0YTxUVHlwZT5cblxuICAvLyBUcmFjayBpZiBhbnkgaW5pdCBjaGFuZ2VzIG9jY3VyIGR1cmluZyBmcm9tU25hcHNob3RcbiAgLy8gKGUuZy4sIGRlZmF1bHRzIGJlaW5nIGFwcGxpZWQsIG9uSW5pdCBob29rcyBtdXRhdGluZyB0aGUgbW9kZWwpXG4gIGxldCBoYXNJbml0Q2hhbmdlcyA9IGZhbHNlXG5cbiAgY29uc3QgY3JlYXRlQm91bmRPYmplY3QgPSAoKSA9PiB7XG4gICAgLy8gU2V0IHVwIGEgdGVtcG9yYXJ5IGdsb2JhbCBsaXN0ZW5lciB0byBkZXRlY3QgaWYgYW55IGluaXQgY2hhbmdlcyBvY2N1ciBkdXJpbmcgZnJvbVNuYXBzaG90XG4gICAgY29uc3QgZGlzcG9zZUdsb2JhbExpc3RlbmVyID0gb25HbG9iYWxEZWVwQ2hhbmdlKChfdGFyZ2V0LCBjaGFuZ2UpID0+IHtcbiAgICAgIGlmIChjaGFuZ2UuaXNJbml0KSB7XG4gICAgICAgIGhhc0luaXRDaGFuZ2VzID0gdHJ1ZVxuICAgICAgfVxuICAgIH0pXG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzdWx0ID0geWpzQmluZGluZ0NvbnRleHQuYXBwbHkoXG4gICAgICAgICgpID0+IGZyb21TbmFwc2hvdChtb2J4S2V5c3RvbmVUeXBlLCB5anNKc29uIGFzIHVua25vd24gYXMgU25hcHNob3RJbk9mPFR5cGVUb0RhdGE8VFR5cGU+PiksXG4gICAgICAgIGJpbmRpbmdDb250ZXh0XG4gICAgICApXG4gICAgICB5anNCaW5kaW5nQ29udGV4dC5zZXQocmVzdWx0LCB7IC4uLmJpbmRpbmdDb250ZXh0LCBib3VuZE9iamVjdDogcmVzdWx0IH0pXG4gICAgICByZXR1cm4gcmVzdWx0XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGRpc3Bvc2VHbG9iYWxMaXN0ZW5lcigpXG4gICAgfVxuICB9XG5cbiAgYm91bmRPYmplY3QgPSBjcmVhdGVCb3VuZE9iamVjdCgpXG5cbiAgLy8gYmluZCBhbnkgY2hhbmdlcyBmcm9tIHlqcyB0byBtb2J4LWtleXN0b25lXG4gIGNvbnN0IG9ic2VydmVEZWVwQ2IgPSBhY3Rpb24oKGV2ZW50czogWS5ZRXZlbnQ8YW55PltdKSA9PiB7XG4gICAgY29uc3QgZXZlbnRzVG9BcHBseTogWS5ZRXZlbnQ8YW55PltdID0gW11cblxuICAgIGV2ZW50cy5mb3JFYWNoKChldmVudCkgPT4ge1xuICAgICAgaWYgKGV2ZW50LnRyYW5zYWN0aW9uLm9yaWdpbiAhPT0geWpzT3JpZ2luKSB7XG4gICAgICAgIGV2ZW50c1RvQXBwbHkucHVzaChldmVudClcbiAgICAgIH1cblxuICAgICAgaWYgKGV2ZW50LnRhcmdldCBpbnN0YW5jZW9mIFkuTWFwIHx8IGV2ZW50LnRhcmdldCBpbnN0YW5jZW9mIFkuQXJyYXkpIHtcbiAgICAgICAgZ2V0WWpzQ29sbGVjdGlvbkF0b20oZXZlbnQudGFyZ2V0KT8ucmVwb3J0Q2hhbmdlZCgpXG4gICAgICB9XG4gICAgfSlcblxuICAgIGlmIChldmVudHNUb0FwcGx5Lmxlbmd0aCA+IDApIHtcbiAgICAgIGFwcGx5aW5nWWpzQ2hhbmdlc1RvTW9ieEtleXN0b25lKytcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlY29uY2lsaWF0aW9uTWFwOiBSZWNvbmNpbGlhdGlvbk1hcCA9IG5ldyBNYXAoKVxuXG4gICAgICAgIC8vIENvbGxlY3QgaW5pdCBjaGFuZ2VzIHRoYXQgb2NjdXIgZHVyaW5nIGV2ZW50IGFwcGxpY2F0aW9uXG4gICAgICAgIC8vIChlLmcuLCBmcm9tU25hcHNob3QgY2FsbHMgdGhhdCB0cmlnZ2VyIG9uSW5pdCBob29rcylcbiAgICAgICAgLy8gV2Ugc3RvcmUgYm90aCB0YXJnZXQgYW5kIGNoYW5nZSBzbyB3ZSBjYW4gY29tcHV0ZSB0aGUgY29ycmVjdCBwYXRoIGxhdGVyXG4gICAgICAgIC8vIFNuYXBzaG90cyBhcmUgY2FwdHVyZWQgaW1tZWRpYXRlbHkgdG8gcHJlc2VydmUgdmFsdWVzIGF0IGluaXQgdGltZVxuICAgICAgICBjb25zdCBpbml0Q2hhbmdlczogeyB0YXJnZXQ6IG9iamVjdDsgY2hhbmdlOiBEZWVwQ2hhbmdlIH1bXSA9IFtdXG4gICAgICAgIGNvbnN0IGRpc3Bvc2VHbG9iYWxMaXN0ZW5lciA9IG9uR2xvYmFsRGVlcENoYW5nZSgodGFyZ2V0LCBjaGFuZ2UpID0+IHtcbiAgICAgICAgICBpZiAoY2hhbmdlLmlzSW5pdCkge1xuICAgICAgICAgICAgaW5pdENoYW5nZXMucHVzaCh7IHRhcmdldCwgY2hhbmdlOiBjYXB0dXJlQ2hhbmdlU25hcHNob3RzKGNoYW5nZSkgfSlcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBldmVudHNUb0FwcGx5LmZvckVhY2goKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICBhcHBseVlqc0V2ZW50VG9Nb2J4KGV2ZW50LCBib3VuZE9iamVjdCwgcmVjb25jaWxpYXRpb25NYXApXG4gICAgICAgICAgfSlcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBkaXNwb3NlR2xvYmFsTGlzdGVuZXIoKVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gU3luYyBiYWNrIGFueSBpbml0LXRpbWUgbXV0YXRpb25zIGZyb20gZnJvbVNuYXBzaG90IGNhbGxzXG4gICAgICAgIC8vIChlLmcuLCBvbkluaXQgaG9va3MgdGhhdCBtb2RpZnkgdGhlIG1vZGVsKVxuICAgICAgICAvLyBUaGlzIGlzIG5lZWRlZCBiZWNhdXNlIGluaXQgY2hhbmdlcyBkdXJpbmcgWWpzIGV2ZW50IGhhbmRsaW5nIGFyZSBub3RcbiAgICAgICAgLy8gY2FwdHVyZWQgYnkgdGhlIG1haW4gb25EZWVwQ2hhbmdlIChpdCBza2lwcyBjaGFuZ2VzIHdoZW4gYXBwbHlpbmdZanNDaGFuZ2VzVG9Nb2J4S2V5c3RvbmUgPiAwKVxuICAgICAgICBpZiAoaW5pdENoYW5nZXMubGVuZ3RoID4gMCAmJiAhaXNZanNWYWx1ZURlbGV0ZWQoeWpzT2JqZWN0KSkge1xuICAgICAgICAgIHlqc0RvYy50cmFuc2FjdCgoKSA9PiB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHsgdGFyZ2V0LCBjaGFuZ2UgfSBvZiBpbml0Q2hhbmdlcykge1xuICAgICAgICAgICAgICAvLyBDb21wdXRlIHRoZSBwYXRoIGZyb20gYm91bmRPYmplY3QgdG8gdGhlIHRhcmdldFxuICAgICAgICAgICAgICBjb25zdCBwYXRoVG9UYXJnZXQgPSBnZXRQYXJlbnRUb0NoaWxkUGF0aChib3VuZE9iamVjdCwgdGFyZ2V0KVxuICAgICAgICAgICAgICBpZiAocGF0aFRvVGFyZ2V0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAvLyBDcmVhdGUgYSBuZXcgY2hhbmdlIHdpdGggdGhlIGNvcnJlY3QgcGF0aCBmcm9tIHRoZSByb290XG4gICAgICAgICAgICAgICAgY29uc3QgY2hhbmdlV2l0aENvcnJlY3RQYXRoOiBEZWVwQ2hhbmdlID0ge1xuICAgICAgICAgICAgICAgICAgLi4uY2hhbmdlLFxuICAgICAgICAgICAgICAgICAgcGF0aDogWy4uLnBhdGhUb1RhcmdldCwgLi4uY2hhbmdlLnBhdGhdLFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBhcHBseU1vYnhDaGFuZ2VUb1lqc09iamVjdChjaGFuZ2VXaXRoQ29ycmVjdFBhdGgsIHlqc09iamVjdClcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sIHlqc09yaWdpbilcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFVwZGF0ZSBzbmFwc2hvdCB0cmFja2luZzogdGhlIFkuanMgY29udGFpbmVyIGlzIG5vdyBpbiBzeW5jIHdpdGggdGhlIGN1cnJlbnQgTW9iWCBzbmFwc2hvdFxuICAgICAgICAvLyBUaGlzIGVuYWJsZXMgdGhlIG1lcmdlIG9wdGltaXphdGlvbiB0byBza2lwIHVuY2hhbmdlZCBzdWJ0cmVlcyBkdXJpbmcgcmVjb25jaWxpYXRpb25cbiAgICAgICAgaWYgKHlqc09iamVjdCBpbnN0YW5jZW9mIFkuTWFwIHx8IHlqc09iamVjdCBpbnN0YW5jZW9mIFkuQXJyYXkpIHtcbiAgICAgICAgICBzZXRZanNDb250YWluZXJTbmFwc2hvdCh5anNPYmplY3QsIGdldFNuYXBzaG90KGJvdW5kT2JqZWN0KSlcbiAgICAgICAgfVxuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgYXBwbHlpbmdZanNDaGFuZ2VzVG9Nb2J4S2V5c3RvbmUtLVxuICAgICAgfVxuICAgIH1cbiAgfSlcblxuICB5anNPYmplY3Qub2JzZXJ2ZURlZXAob2JzZXJ2ZURlZXBDYilcblxuICAvLyBiaW5kIGFueSBjaGFuZ2VzIGZyb20gbW9ieC1rZXlzdG9uZSB0byB5anMgdXNpbmcgZGVlcCBjaGFuZ2Ugb2JzZXJ2YXRpb25cbiAgLy8gVGhpcyBwcm92aWRlcyBwcm9wZXIgc3BsaWNlIGRldGVjdGlvbiBmb3IgYXJyYXkgb3BlcmF0aW9uc1xuICBsZXQgcGVuZGluZ0NoYW5nZXM6IERlZXBDaGFuZ2VbXSA9IFtdXG5cbiAgY29uc3QgZGlzcG9zZU9uRGVlcENoYW5nZSA9IG9uRGVlcENoYW5nZShib3VuZE9iamVjdCwgKGNoYW5nZSkgPT4ge1xuICAgIGlmIChhcHBseWluZ1lqc0NoYW5nZXNUb01vYnhLZXlzdG9uZSA+IDApIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIC8vIFNraXAgaW5pdCBjaGFuZ2VzIC0gdGhleSBhcmUgaGFuZGxlZCBieSB0aGUgZ2V0U25hcHNob3QgKyBtZXJnZSBhdCB0aGUgZW5kIG9mIGJpbmRpbmdcbiAgICBpZiAoY2hhbmdlLmlzSW5pdCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gQ2FwdHVyZSBzbmFwc2hvdHMgbm93IGJlZm9yZSB0aGUgdmFsdWVzIGNhbiBiZSBtdXRhdGVkIHdpdGhpbiB0aGUgc2FtZSB0cmFuc2FjdGlvbi5cbiAgICAvLyBUaGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIGNoYW5nZXMgYXJlIGNvbGxlY3RlZCBhbmQgYXBwbGllZCBhZnRlciB0aGUgYWN0aW9uIGNvbXBsZXRlcyxcbiAgICAvLyBieSB3aGljaCB0aW1lIHRoZSBvcmlnaW5hbCB2YWx1ZXMgbWF5IGhhdmUgYmVlbiBtb2RpZmllZC5cbiAgICAvLyBFeGFtcGxlOiBgb2JqLml0ZW1zID0gW2EsIGJdOyBvYmouaXRlbXMuc3BsaWNlKDAsIDEpYCAtIHdpdGhvdXQgZWFybHkgY2FwdHVyZSxcbiAgICAvLyB0aGUgT2JqZWN0VXBkYXRlIGZvciBgaXRlbXNgIHdvdWxkIGdldCB0aGUgcG9zdC1zcGxpY2UgYXJyYXkgc3RhdGUuXG4gICAgcGVuZGluZ0NoYW5nZXMucHVzaChjYXB0dXJlQ2hhbmdlU25hcHNob3RzKGNoYW5nZSkpXG4gIH0pXG5cbiAgLy8gdGhpcyBpcyBvbmx5IHVzZWQgc28gd2UgY2FuIHRyYW5zYWN0IGFsbCBjaGFuZ2VzIHRvIHRoZSBzbmFwc2hvdCBib3VuZGFyeVxuICBjb25zdCBkaXNwb3NlT25TbmFwc2hvdCA9IG9uU25hcHNob3QoYm91bmRPYmplY3QsIChib3VuZE9iamVjdFNuYXBzaG90KSA9PiB7XG4gICAgaWYgKHBlbmRpbmdDaGFuZ2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgY2hhbmdlc1RvQXBwbHkgPSBwZW5kaW5nQ2hhbmdlc1xuICAgIHBlbmRpbmdDaGFuZ2VzID0gW11cblxuICAgIC8vIFNraXAgc3luY2luZyB0byBZanMgaWYgdGhlIFlqcyBvYmplY3QgaGFzIGJlZW4gZGVsZXRlZC9kZXRhY2hlZFxuICAgIGlmIChpc1lqc1ZhbHVlRGVsZXRlZCh5anNPYmplY3QpKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB5anNEb2MudHJhbnNhY3QoKCkgPT4ge1xuICAgICAgY2hhbmdlc1RvQXBwbHkuZm9yRWFjaCgoY2hhbmdlKSA9PiB7XG4gICAgICAgIGFwcGx5TW9ieENoYW5nZVRvWWpzT2JqZWN0KGNoYW5nZSwgeWpzT2JqZWN0KVxuICAgICAgfSlcbiAgICB9LCB5anNPcmlnaW4pXG5cbiAgICAvLyBVcGRhdGUgc25hcHNob3QgdHJhY2tpbmc6IHRoZSBZLmpzIGNvbnRhaW5lciBpcyBub3cgaW4gc3luYyB3aXRoIHRoZSBjdXJyZW50IE1vYlggc25hcHNob3RcbiAgICBpZiAoeWpzT2JqZWN0IGluc3RhbmNlb2YgWS5NYXAgfHwgeWpzT2JqZWN0IGluc3RhbmNlb2YgWS5BcnJheSkge1xuICAgICAgc2V0WWpzQ29udGFpbmVyU25hcHNob3QoeWpzT2JqZWN0LCBib3VuZE9iamVjdFNuYXBzaG90KVxuICAgIH1cbiAgfSlcblxuICAvLyBTeW5jIHRoZSBpbml0IGNoYW5nZXMgdG8gdGhlIENSRFQuXG4gIC8vIEluaXQgY2hhbmdlcyBpbmNsdWRlOiBkZWZhdWx0cyBiZWluZyBhcHBsaWVkLCBvbkluaXQgaG9va3MgbXV0YXRpbmcgdGhlIG1vZGVsLlxuICAvLyBXZSB1c2UgZ2V0U25hcHNob3QgKyBtZXJnZSBiZWNhdXNlIHRoZSBwZXItY2hhbmdlIGFwcHJvYWNoIGhhcyBpc3N1ZXMgd2l0aCByZWZlcmVuY2UgbXV0YXRpb25cbiAgLy8gKHZhbHVlcyBjYXB0dXJlZCBpbiBEZWVwQ2hhbmdlIGNhbiBiZSBtdXRhdGVkIGJlZm9yZSB3ZSBhcHBseSB0aGVtKS5cbiAgLy8gVGhlIHNuYXBzaG90IHRyYWNraW5nIG9wdGltaXphdGlvbiBlbnN1cmVzIHVuY2hhbmdlZCBzdWJ0cmVlcyBhcmUgc2tpcHBlZCBkdXJpbmcgbWVyZ2UuXG4gIGNvbnN0IGZpbmFsU25hcHNob3QgPSBnZXRTbmFwc2hvdChib3VuZE9iamVjdClcblxuICBpZiAoaGFzSW5pdENoYW5nZXMpIHtcbiAgICB5anNEb2MudHJhbnNhY3QoKCkgPT4ge1xuICAgICAgaWYgKHlqc09iamVjdCBpbnN0YW5jZW9mIFkuTWFwKSB7XG4gICAgICAgIGFwcGx5SnNvbk9iamVjdFRvWU1hcCh5anNPYmplY3QsIGZpbmFsU25hcHNob3QgYXMgdW5rbm93biBhcyBQbGFpbk9iamVjdCwge1xuICAgICAgICAgIG1vZGU6IFwibWVyZ2VcIixcbiAgICAgICAgfSlcbiAgICAgIH0gZWxzZSBpZiAoeWpzT2JqZWN0IGluc3RhbmNlb2YgWS5BcnJheSkge1xuICAgICAgICBhcHBseUpzb25BcnJheVRvWUFycmF5KHlqc09iamVjdCwgZmluYWxTbmFwc2hvdCBhcyB1bmtub3duIGFzIFBsYWluQXJyYXksIHtcbiAgICAgICAgICBtb2RlOiBcIm1lcmdlXCIsXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfSwgeWpzT3JpZ2luKVxuICB9XG5cbiAgLy8gQWx3YXlzIHVwZGF0ZSBzbmFwc2hvdCB0cmFja2luZyBhZnRlciBiaW5kaW5nIGluaXRpYWxpemF0aW9uXG4gIC8vIFRoaXMgZW5zdXJlcyB0aGUgbWVyZ2Ugb3B0aW1pemF0aW9uIGNhbiBza2lwIHVuY2hhbmdlZCBzdWJ0cmVlcyBpbiBmdXR1cmUgcmVjb25jaWxpYXRpb25zXG4gIGlmICh5anNPYmplY3QgaW5zdGFuY2VvZiBZLk1hcCB8fCB5anNPYmplY3QgaW5zdGFuY2VvZiBZLkFycmF5KSB7XG4gICAgc2V0WWpzQ29udGFpbmVyU25hcHNob3QoeWpzT2JqZWN0LCBmaW5hbFNuYXBzaG90KVxuICB9XG5cbiAgY29uc3QgZGlzcG9zZSA9ICgpID0+IHtcbiAgICB5anNEb2Mub2ZmKFwiZGVzdHJveVwiLCBkaXNwb3NlKVxuICAgIGRpc3Bvc2VPbkRlZXBDaGFuZ2UoKVxuICAgIGRpc3Bvc2VPblNuYXBzaG90KClcbiAgICB5anNPYmplY3QudW5vYnNlcnZlRGVlcChvYnNlcnZlRGVlcENiKVxuICB9XG5cbiAgeWpzRG9jLm9uKFwiZGVzdHJveVwiLCBkaXNwb3NlKVxuXG4gIHJldHVybiB7XG4gICAgYm91bmRPYmplY3QsXG4gICAgZGlzcG9zZSxcbiAgICB5anNPcmlnaW4sXG4gIH1cbn1cbiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFHTyxNQUFNLDZCQUE2QixNQUFNO0FBQUEsRUFDOUMsWUFBWSxLQUFhO0FBQ3ZCLFVBQU0sR0FBRztBQUdULFdBQU8sZUFBZSxNQUFNLHFCQUFxQixTQUFTO0FBQUEsRUFDNUQ7QUFDRjtBQUtPLFNBQVMsUUFBUSxLQUFhO0FBQ25DLFNBQU8sSUFBSSxxQkFBcUIsR0FBRztBQUNyQztBQ2RBLE1BQU0seUNBQXlCLFFBQUE7QUFLeEIsTUFBTSx1QkFBdUIsQ0FDbEMsa0JBQ3NCO0FBQ3RCLFNBQU8s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
|