footprintjs 9.48.2 → 9.48.3
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/dist/esm/lib/capture/ownData.d.ts +12 -1
- package/dist/esm/lib/capture/ownData.js +23 -2
- package/dist/esm/lib/memory/TransactionBuffer.js +5 -4
- package/dist/esm/lib/memory/merge.d.ts +1 -1
- package/dist/esm/lib/memory/merge.js +4 -12
- package/dist/esm/lib/memory/pathOps.d.ts +15 -12
- package/dist/esm/lib/memory/pathOps.js +30 -27
- package/dist/esm/lib/memory/utils.js +2 -10
- package/dist/lib/capture/ownData.js +25 -3
- package/dist/lib/memory/TransactionBuffer.js +5 -4
- package/dist/lib/memory/merge.js +4 -12
- package/dist/lib/memory/pathOps.js +30 -27
- package/dist/lib/memory/utils.js +8 -16
- package/dist/types/lib/capture/ownData.d.ts +12 -1
- package/dist/types/lib/memory/merge.d.ts +1 -1
- package/dist/types/lib/memory/pathOps.d.ts +15 -12
- package/package.json +1 -1
|
@@ -65,6 +65,7 @@
|
|
|
65
65
|
*/
|
|
66
66
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
67
67
|
exports.TransactionBuffer = void 0;
|
|
68
|
+
const ownData_js_1 = require("../capture/ownData.js");
|
|
68
69
|
const admission_js_1 = require("./admission.js");
|
|
69
70
|
const deltaEncoding_js_1 = require("./deltaEncoding.js");
|
|
70
71
|
const keyPaths_js_1 = require("./keyPaths.js");
|
|
@@ -452,12 +453,12 @@ class TransactionBuffer {
|
|
|
452
453
|
if (value !== atBase || this.staged.has(value))
|
|
453
454
|
return;
|
|
454
455
|
if (i === path.length - 1) {
|
|
455
|
-
parent
|
|
456
|
+
(0, ownData_js_1.putOwn)(parent, k, this.privateCopyOf(value));
|
|
456
457
|
return;
|
|
457
458
|
}
|
|
458
459
|
value = (0, pathOps_js_1.shallowCopy)(value);
|
|
459
460
|
this.owned.add(value);
|
|
460
|
-
parent
|
|
461
|
+
(0, ownData_js_1.putOwn)(parent, k, value);
|
|
461
462
|
}
|
|
462
463
|
parent = value;
|
|
463
464
|
base = atBase;
|
|
@@ -485,7 +486,7 @@ class TransactionBuffer {
|
|
|
485
486
|
if (this.owned.has(child))
|
|
486
487
|
work.push([child, atBase]);
|
|
487
488
|
else if (child === atBase && !this.staged.has(child)) {
|
|
488
|
-
node
|
|
489
|
+
(0, ownData_js_1.putOwn)(node, key, this.privateCopyOf(child));
|
|
489
490
|
}
|
|
490
491
|
}
|
|
491
492
|
this.privateTrees.add(node);
|
|
@@ -947,4 +948,4 @@ function flattenedTraceRow(op) {
|
|
|
947
948
|
function provenance(readKeys) {
|
|
948
949
|
return readKeys !== undefined ? { readKeys } : undefined;
|
|
949
950
|
}
|
|
950
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVHJhbnNhY3Rpb25CdWZmZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL21lbW9yeS9UcmFuc2FjdGlvbkJ1ZmZlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQStERzs7O0FBRUgsaURBQWdIO0FBQ2hILHlEQUFvSDtBQUNwSCwrQ0FBeUM7QUFDekMsNkNBVXNCO0FBRXRCLHlDQUFzRjtBQUV0RixNQUFhLGlCQUFpQjtJQUM1Qjs7Ozs7T0FLRztJQUNLLFlBQVksQ0FBTTtJQUNsQixXQUFXLENBQU07SUFFakIsY0FBYyxHQUFnQixFQUFFLENBQUM7SUFDakMsV0FBVyxHQUFnQixFQUFFLENBQUM7SUFDOUIsT0FBTyxHQUEwRCxFQUFFLENBQUM7SUFDcEUsYUFBYSxHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7SUFDMUM7Ozs7Ozs7T0FPRztJQUNLLFFBQVEsR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO0lBQ3JDLDBFQUEwRTtJQUN6RCxZQUFZLENBQW1CO0lBRWhEOzs7K0VBRzJFO0lBQzFELGdCQUFnQixDQUFrQjtJQUVuRDs7Ozs7OztPQU9HO0lBQ0ssS0FBSyxHQUFHLElBQUksT0FBTyxFQUFVLENBQUM7SUFFdEM7Ozs7OztPQU1HO0lBQ0ssTUFBTSxHQUFHLElBQUksT0FBTyxFQUFVLENBQUM7SUFFdkM7Ozs7O09BS0c7SUFDSyxZQUFZLEdBQUcsSUFBSSxPQUFPLEVBQVUsQ0FBQztJQUU3Qzs7OztPQUlHO0lBQ0ssU0FBUyxDQUFtQjtJQUVwQzs7O09BR0c7SUFDSyxZQUFZLENBQW1CO0lBRXZDOzs7Ozs7T0FNRztJQUNjLE9BQU8sQ0FBb0I7SUFFNUMsb0VBQW9FO0lBQzVELFlBQVksR0FBRyxDQUFDLENBQUM7SUFDekIsb0ZBQW9GO0lBQzVFLFNBQVMsR0FBRyxDQUFDLENBQUM7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O0lBQ2hGLE9BQU8sRUFBRSxDQUFDLElBQUksS0FBSyxRQUFRO1FBQ3pCLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFjLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxRQUFRLEtBQUssU0FBUyxJQUFJLEVBQUUsUUFBUSxFQUFFLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxFQUFFO1FBQ3RHLENBQUMsQ0FBQyxFQUFFLENBQUM7QUFDVCxDQUFDO0FBRUQsMEZBQTBGO0FBQzFGLFNBQVMsVUFBVSxDQUFDLFFBQThCO0lBQ2hELE9BQU8sUUFBUSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0FBQzNELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFRyYW5zYWN0aW9uQnVmZmVyIOKAlCBQZXItc3RhZ2UgU1RBR0lORyBidWZmZXIgZm9yIHN0YXRlIG11dGF0aW9uc1xuICpcbiAqIFdoYXQgaXQgSVM6IGEgc3RhZ2luZyBidWZmZXIgd2l0aCByZWFkLXlvdXItd3JpdGVzIGFuZCBuZXQtY2hhbmdlIGNvbW1pdHMuXG4gKiAtIENoYW5nZXMgYXJlIHN0YWdlZCBoZXJlIGR1cmluZyBzdGFnZSBleGVjdXRpb24gYW5kIGZsdXNoZWQgdG9cbiAqICAgU2hhcmVkTWVtb3J5IGluIE9ORSBiYXRjaCBwZXIgc3RhZ2UgKGBjb21taXQoKWApIOKAlCBvdGhlciBzdGFnZXMgYW5kXG4gKiAgIHBhcmFsbGVsIHNpYmxpbmdzIG5ldmVyIG9ic2VydmUgYSBzdGFnZSdzIGhhbGYtZmluaXNoZWQgd3JpdGVzLlxuICogLSBSZWFkLWFmdGVyLXdyaXRlIGNvbnNpc3RlbmN5IHdpdGhpbiBhIHN0YWdlIOKAlCBhIHN0YWdlIHNlZXMgaXRzIG93blxuICogICBzdGFnZWQgd3JpdGVzIGltbWVkaWF0ZWx5LlxuICogLSBgY29tbWl0KClgIHJlY29yZHMgdGhlIHN0YWdlJ3MgTkVUIGNoYW5nZSAoc2VlIHtAbGluayBjb21taXR9KSwgcGx1cyBhblxuICogICBvcGVyYXRpb24gdHJhY2UgZm9yIGRldGVybWluaXN0aWMgcmVwbGF5LlxuICpcbiAqIFdoYXQgaXQgaXMgTk9UOiBhIHJvbGxiYWNrIG1lY2hhbmlzbS4gRGVzcGl0ZSB0aGUgbmFtZSwgdGhlcmUgaXMgbm9cbiAqIGFib3J0L3JvbGxiYWNrIHBhdGgg4oCUIHdoZW4gYSBzdGFnZSBUSFJPV1MsIHRoZSBlbmdpbmUgc3RpbGwgY29tbWl0c1xuICogZXZlcnl0aGluZyBzdGFnZWQgc28gZmFyIGJlZm9yZSByZS10aHJvd2luZyAoY29tbWl0LW9uLWVycm9yIGluXG4gKiBgRmxvd2NoYXJ0VHJhdmVyc2VyYCkuIFRoYXQgaXMgZGVsaWJlcmF0ZTogdGhlIGF1ZGl0IHRyYWlsIG11c3QgcmVjb3JkXG4gKiB3aGF0IHRoZSBmYWlsaW5nIHN0YWdlIGNoYW5nZWQuIERvIG5vdCByZWx5IG9uIFwic3RhZ2UgZmFpbGVkIOKGkiBpdHNcbiAqIHdyaXRlcyB2YW5pc2hlZFwiLlxuICpcbiAqIFRoZSBwYXRjaCB0cmVlcyBob2xkIFJFRkVSRU5DRVMgdW50aWwgY29tbWl0ICg5LjIzLjApLiBBIGBzZXRgIHN0b3JlcyB0aGVcbiAqIGNhbGxlcidzIG93biB2YWx1ZSBpbiBgb3ZlcndyaXRlUGF0Y2hgIGV4YWN0bHkgYXMgaXQgYWx3YXlzIGRpZCBpblxuICogYHdvcmtpbmdDb3B5YDsgdGhlIGNvcHkgdGhlIHJlY29yZCBuZWVkcyBpcyB0YWtlbiBPTkNFIHBlciBzdXJ2aXZpbmcgcGF0aFxuICogd2hlbiB0aGUgcGF5bG9hZCBsZWF2ZXMgdGhlIGJ1ZmZlciAoYHRvQ2hhbmdlT25seVBheWxvYWRgIC9cbiAqIGB0b0RlbHRhUGF5bG9hZGAg4oCUIGV2ZXJ5IHZhbHVlIHRoZXkgZW1pdCBwYXNzZXMgdGhyb3VnaCBgc3RydWN0dXJlZENsb25lYFxuICogdGhlcmUpLiBUaGUgbGF3IFwidGhlIHJlY29yZCBuZXZlciBhbGlhc2VzIGEgY2FsbGVyJ3Mgb2JqZWN0XCIgaXMga2VwdCBhdFxuICogdGhlIGNvbW1pdCBib3VuZGFyeSBpbnN0ZWFkIG9mIGF0IGV2ZXJ5IHdyaXRlLCB3aGljaCBpcyB3aGF0IG1ha2VzIE5cbiAqIHdyaXRlcyB0byBvbmUgcGF0aCBPKE4pIGluc3RlYWQgb2YgTyhOIMOXIHNpemUpLiBDb25zZXF1ZW5jZSwgYnkgZGVzaWduOiBhXG4gKiBjYWxsZXIgd2hvIG11dGF0ZXMgaXRzIG93biBvYmplY3QgQUZURVIgdGhlIHdyaXRlIGFuZCBCRUZPUkUgdGhlIHN0YWdlXG4gKiBlbmRzIGNvbW1pdHMgdGhlIHZhbHVlIGFzIHRoZSBzdGFnZSByZWFkIGl0IGJhY2sg4oCUIHRoZSByZWNvcmQgYWdyZWVzIHdpdGhcbiAqIHRoZSBzdGFnZSAoQ0xBVURFLm1kIGxhbmRtaW5lIDMncyBmaXJzdCBiaXRlLCBjbG9zZWQpLiBUaGUgb25lIHBsYWNlIHRoZVxuICogZW5naW5lIGl0c2VsZiBlZGl0cyBUSFJPVUdIIGEgc3RhZ2VkIHZhbHVlIOKAlCBhIGxhdGVyIG5lc3RlZCBvcCB1bmRlciBhXG4gKiBgc2V0YCBwYXRoIOKAlCBkZXRhY2hlcyB0aGF0IHZhbHVlIGZpcnN0ICh7QGxpbmsgZGV0YWNoSGVsZEFuY2VzdG9yc30pLCBzb1xuICogYHdvcmtpbmdDb3B5YCBhbmQgYG92ZXJ3cml0ZVBhdGNoYCBuZXZlciBzaGFyZSBhIGNvbnRhaW5lciB0aGUgZW5naW5lXG4gKiBtdXRhdGVzIG9uIG9uZSBzaWRlIG9ubHkuXG4gKlxuICogQ09QWS1PTi1XUklURSAoOS4yOS4wIOKAlCBkb2NzL2Rlc2lnbi8yMDI2LTEwLWNvcHktb24td3JpdGUtY29tbWl0Lm1kKS4gVGhlXG4gKiBidWZmZXIgbm8gbG9uZ2VyIGNsb25lcyB0aGUgY29tbWl0dGVkIHN0YXRlIGl0IHN0YXJ0cyBmcm9tLiBgYmFzZVNuYXBzaG90YFxuICogSVMgdGhlIGNvbW1pdHRlZCBnZW5lcmF0aW9uIHRoZSBzdGFnZSBmaXJzdCB0b3VjaGVkIChoZWxkIGJ5IHJlZmVyZW5jZSDigJRcbiAqIGNvbW1pdHRlZCBzdGF0ZSBpcyBpbW11dGFibGUtYWZ0ZXItc3dhcCksIGFuZCBgd29ya2luZ0NvcHlgIHN0YXJ0cyBhcyBhXG4gKiBjb3B5IG9mIGl0cyBST09UIG9ubHk6IGVhY2ggd3JpdGUgY29waWVzIHRoZSBjb250YWluZXJzIG9uIGl0cyBvd24gcGF0aFxuICogKHtAbGluayBvd25TcGluZX0pLCBhbmQgdGhlIGZpcnN0IFJFQUQgYWZ0ZXIgdGhlIHN0YWdlJ3MgZmlyc3Qgd3JpdGUgb2YgYVxuICogY29udGFpbmVyIHN0aWxsIHNoYXJlZCB3aXRoIGNvbW1pdHRlZCBzdGF0ZSB0YWtlcyBhIHByaXZhdGUgZGVlcCBjb3B5IG9mXG4gKiBpdCAoe0BsaW5rIHByaXZhdGlzZX0pIOKAlCB3aGF0IHRoZSB3aG9sZS1zdGF0ZSBjbG9uZSB1c2VkIHRvIGdpdmUgZXZlcnlcbiAqIHJlYWQsIHNvIGFuIGluLXBsYWNlIGVkaXQgb2YgYSByZWFkIHZhbHVlIHN0YXlzIHByaXZhdGUgZXhhY3RseSBhcyBpdCBkaWQuXG4gKiBBIHJlYWQgdGhlIHdvcmtpbmcgY29weSBjYW5ub3QgYW5zd2VyIGlzIHNlcnZlZCBmcm9tIGxpdmUgc3RhdGUgYnkgdGhlXG4gKiBjYWxsZXIsIGFzIGJlZm9yZTsgdGhlIGJ1ZmZlciB0aGVuIHJlcGxhY2VzIHRoYXQgcGF0aCBvZiBpdHMgZGlmZiBiYXNlXG4gKiB3aXRoIGEgcHJpdmF0ZSBjb3B5ICh7QGxpbmsgZGV0YWNoQmFzZX0pLCBhcyB0aGUgY2xvbmUgaGFkIGl0LlxuICpcbiAqIFRIRSBBRE1JVFRFRCBSRUNPUkQgKDkuMzAuMCDigJQgZG9jcy9kZXNpZ24vMjAyNi0xMC1hZG1pdHRlZC1yZWNvcmQubWQpLiBBXG4gKiBjb21taXQgaXMgYWRtaXR0ZWQgb25seSBpZiBpdHMgYnVuZGxlIGZvbGRzIGJhY2sgdG8gdGhlIHN0YWdlJ3NcbiAqIHJlYWQteW91ci13cml0ZXMgdmlldyBhdCBldmVyeSBwYXRoIHRoZSBzdGFnZSB0b3VjaGVkIChhbmQgYXQgZXZlcnlcbiAqIGNvbnRhaW5lciBpdHMgd3JpdGVzIGNyZWF0ZWQgb24gdGhlIHdheSB0aGVyZSwgYmVsb3cgdGhlIHN0YWdlJ3MgYWRkcmVzcykuXG4gKiBCb3RoIGVuY29kZXJzIGNvbW1pdCB0aGUgdmFsdWUgdGhlIHN0YWdlIHJlYWQ6IGEgY29tcGFjdCByb3cg4oCUIGEgYG1lcmdlYFxuICogZGVsdGEsIGFuIGBhcHBlbmRgIHRhaWwg4oCUIGlzIGtlcHQgd2hlcmUgaXQgcHJvdmFibHkgZm9sZHMgYmFjazsgYSBmYW1pbHkgb2ZcbiAqIHJvd3MgdGhhdCBkb2VzIG5vdCBpcyByZWNvcmRlZCBhcyBgc2V0YCByb3dzIG9mIHRoZSB2YWx1ZXMgdGhlIHN0YWdlIHJlYWRcbiAqICh7QGxpbmsgYWRtaXR9KS4gQmVmb3JlIDkuMzAuMCB0aGUgb25lIGFjY3VtdWxhdGVkIG1lcmdlIGRlbHRhIHBlciBwYXRoIHdhc1xuICogcmVwbGF5ZWQgYXQgZXZlcnkgYG1lcmdlYCByb3cgb2YgdGhhdCBwYXRoLCB3aGljaCBsaWVkIGFjcm9zcyBhIGhhcmQgd3JpdGVcbiAqIChgJHVwZGF0ZShrLHt4fSk7IGsgPSB7eX07ICR1cGRhdGUoayx7en0pYCBjb21taXR0ZWQgYHt5LCB4LCB6fWAgZm9yIGFcbiAqIHJlYWQtYmFjayBvZiBge3ksIHp9YCksIGFuIGBbXWAgY2xlYXIsIGEga2luZCBjaGFuZ2Ugb3IgYW4gYXJyYXkgdW5pb25cbiAqIGRlZHVwbGljYXRlZCBieSByZWZlcmVuY2UuIFZlcmlmaWVkIHdoZW4gdGhlIHN0YWdlIHN0YWdlZCBhIGBtZXJnZWAgb3IgYVxuICogbmVzdGVkIG9wOyBhIHN0YWdlIHRoYXQgc3RhZ2VkIG9ubHkgYHNldGAgLyBgZGVsZXRlYCBvZiBrZXlzIGRpcmVjdGx5IHVuZGVyXG4gKiBpdHMgYWRkcmVzcyBpcyBjb2hlcmVudCBieSBjb25zdHJ1Y3Rpb24g4oCUIGJvdGggdHJlZXMgcmVjZWl2ZSB0aGUgc2FtZVxuICogd3JpdGUg4oCUIGFuZCBpcyBhZG1pdHRlZCB3aXRob3V0IHRoZSBmb2xkLlxuICovXG5cbmltcG9ydCB7IHR5cGUgRmFtaWx5LCB0eXBlIExvc3N5LCB0eXBlIE1lbWJlciwgdHlwZSBSb3dzLCBhZGRyZXNzRGVwdGhPZiwgbG9zc3lGYW1pbGllcyB9IGZyb20gJy4vYWRtaXNzaW9uLmpzJztcbmltcG9ydCB7IHR5cGUgT3BWZXJiLCB0eXBlIFN1cnZpdm9yLCBlbWl0SW5GYW1pbHlPcmRlciwgZ3JvdXBJbnRvRmFtaWxpZXMsIHB1c2hWYWx1ZVJvdyB9IGZyb20gJy4vZGVsdGFFbmNvZGluZy5qcyc7XG5pbXBvcnQgeyByZWxhdGlvbiB9IGZyb20gJy4va2V5UGF0aHMuanMnO1xuaW1wb3J0IHtcbiAgYWRvcHQsXG4gIGlzQ29udGFpbmVyLFxuICBuYXRpdmVHZXQgYXMgX2dldCxcbiAgbmF0aXZlU2V0IGFzIF9zZXQsXG4gIG93bixcbiAgb3duQ2hpbGQsXG4gIG93bmVkUm9vdE9mLFxuICBvd25TcGluZSxcbiAgc2hhbGxvd0NvcHksXG59IGZyb20gJy4vcGF0aE9wcy5qcyc7XG5pbXBvcnQgdHlwZSB7IENvbW1pdFZhbHVlc01vZGUsIE1lbW9yeVBhdGNoLCBUcmFjZUVudHJ5IH0gZnJvbSAnLi90eXBlcy5qcyc7XG5pbXBvcnQgeyBkZWVwRXF1YWwsIGRlZXBTbWFydE1lcmdlLCBERUxJTSwgZHJ5Rm9sZCwgbm9ybWFsaXNlUGF0aCB9IGZyb20gJy4vdXRpbHMuanMnO1xuXG5leHBvcnQgY2xhc3MgVHJhbnNhY3Rpb25CdWZmZXIge1xuICAvKipcbiAgICogVGhlIG5ldC1jaGFuZ2UgZGlmZiBiYXNlOiB0aGUgY29tbWl0dGVkIGdlbmVyYXRpb24gdGhlIHN0YWdlIGZpcnN0XG4gICAqIHRvdWNoZWQsIGJ5IHJlZmVyZW5jZSDigJQgZXhjZXB0IHdoZXJlIHtAbGluayBkZXRhY2hCYXNlfSByZXBsYWNlZCBhIHBhdGhcbiAgICogb2YgaXQgd2l0aCBhIHByaXZhdGUgY29weSAoaXRzIHJvb3QgYW5kIHRoZSBjb250YWluZXJzIG9uIHRoZSB3YXkgYXJlXG4gICAqIHRoZW4gY29waWVzIHRvbywgb3duZWQgYnkge0BsaW5rIGJhc2VPd25lZH0pLlxuICAgKi9cbiAgcHJpdmF0ZSBiYXNlU25hcHNob3Q6IGFueTtcbiAgcHJpdmF0ZSB3b3JraW5nQ29weTogYW55O1xuXG4gIHByaXZhdGUgb3ZlcndyaXRlUGF0Y2g6IE1lbW9yeVBhdGNoID0ge307XG4gIHByaXZhdGUgdXBkYXRlUGF0Y2g6IE1lbW9yeVBhdGNoID0ge307XG4gIHByaXZhdGUgb3BUcmFjZTogeyBwYXRoOiBzdHJpbmc7IHZlcmI6IE9wVmVyYjsgcmVhZEtleXM/OiBzdHJpbmdbXSB9W10gPSBbXTtcbiAgcHJpdmF0ZSByZWRhY3RlZFBhdGhzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIC8qKlxuICAgKiBQYXRocyB3aG9zZSBgb3ZlcndyaXRlUGF0Y2hgIHZhbHVlIGlzIHRoZSBjYWxsZXIncyBvd24gb2JqZWN0ICg5LjIzLjApOlxuICAgKiBhIGBzZXRgIG9mIGEgY29udGFpbmVyIHN0b3JlcyB0aGUgcmVmZXJlbmNlLCBhbmQgdGhpcyBpcyB0aGUgbGVkZ2VyIG9mXG4gICAqIHdoaWNoIG9uZXMgYXJlIHN0aWxsIHNoYXJlZCB3aXRoIHRoZSBjYWxsZXIgKGFuZCB3aXRoIGB3b3JraW5nQ29weWApLlxuICAgKiBDb25zdWx0ZWQgb25seSBieSB0aGUgZW5naW5lJ3MgbmVzdGVkIG9wcyDigJQgc2VlXG4gICAqIHtAbGluayBkZXRhY2hIZWxkQW5jZXN0b3JzfTsgdGhlIGNvbW1pdCBwYXlsb2FkIGNsb25lcyBldmVyeSBzdXJ2aXZpbmdcbiAgICogdmFsdWUgYW55d2F5IGFuZCBuZXZlciBhc2tzLiBDbGVhcmVkIHdpdGggdGhlIHJlc3QgYXQgYGNvbW1pdCgpYC5cbiAgICovXG4gIHByaXZhdGUgaGVsZFJlZnMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgLyoqIENvbW1pdC12YWx1ZSBlbmNvZGluZyBwb2xpY3kgKCMxM2MtQikuIGAnZnVsbCdgID0gaGlzdG9yaWNhbCBieXRlcy4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBjb21taXRWYWx1ZXM6IENvbW1pdFZhbHVlc01vZGU7XG5cbiAgLyoqIFBlci13cml0ZSByZWFkLXByb3ZlbmFuY2Ugc291cmNlICgjUDEpLiBXaGVuIHNldCAodGhlXG4gICAqICBgd3JpdGVQcm92ZW5hbmNlOiAncmVhZHMtcHJlZml4J2AgZGlhbCksIGV2ZXJ5IHN0YWdlZCBvcCBzbmFwc2hvdHMgdGhlXG4gICAqICBrZXlzIHRyYWNrZWQtcmVhZCBzbyBmYXIg4oCUIHRoZSB0ZW1wb3JhbC1wcmVmaXggYXR0cmlidXRpb24gY29uc3VtZWQgYnlcbiAgICogIGNhdXNhbCBzbGljaW5nLiBVbmRlZmluZWQgKGRlZmF1bHQpID0gemVybyBjb3N0LCBieXRlLWlkZW50aWNhbCBvcHMuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgcmVhZEtleXNQcm92aWRlcj86ICgpID0+IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBUaGUgY29udGFpbmVycyBpbiBgd29ya2luZ0NvcHlgIHRoaXMgYnVmZmVyIENSRUFURUQ6IGl0cyByb290IGNvcHksIHRoZVxuICAgKiBwYXRoIGNvcGllcyBpdHMgd3JpdGVzIG1hZGUsIHRoZSBtZXJnZSByZXN1bHRzIGl0IGJ1aWx0LCBhbmQgZXZlcnlcbiAgICogY29udGFpbmVyIG9mIHRoZSBwcml2YXRlIGNvcGllcyBpdHMgcmVhZHMgdG9vay4gQSB3cml0ZSBlZGl0cyB0aGVzZSBpblxuICAgKiBwbGFjZS4gRXZlcnl0aGluZyBlbHNlIGluIGB3b3JraW5nQ29weWAgaXMgU0hBUkVEIOKAlCB3aXRoIHRoZSBjb21taXR0ZWRcbiAgICogZ2VuZXJhdGlvbiB0aGUgc3RhZ2UgZmlyc3QgdG91Y2hlZCwgb3Igd2l0aCBhIHZhbHVlIHRoZSBzdGFnZSBzdGFnZWQg4oCUXG4gICAqIGFuZCBpcyBjb3BpZWQgYmVmb3JlIGEgd3JpdGUgcGFzc2VzIHRocm91Z2ggaXQgKHtAbGluayBvd25TcGluZX0pLlxuICAgKi9cbiAgcHJpdmF0ZSBvd25lZCA9IG5ldyBXZWFrU2V0PG9iamVjdD4oKTtcblxuICAvKipcbiAgICogQ29udGFpbmVyIHZhbHVlcyB0aGUgc3RhZ2Ugc3RhZ2VkIHdpdGgge0BsaW5rIHNldH0g4oCUIGl0cyBvd24gb2JqZWN0cyxcbiAgICogaGVsZCBieSByZWZlcmVuY2UgKDkuMjMuMCkuIEEgcmVhZCBoYW5kcyB0aGVtIGJhY2sgYXMgdGhleSBhcmUsIGV4YWN0bHlcbiAgICogYXMgdGhlIHByaXZhdGUgd29ya2luZyBjb3B5IGFsd2F5cyBkaWQsIGFuZCBuZXZlciBwcml2YXRpc2VzIHRoZW06IGFcbiAgICogcHJpdmF0ZSBjb3B5IG9mIGEgc3RhZ2VkIHZhbHVlIHdvdWxkIGxlYXZlIGB3b3JraW5nQ29weWAgYW5kXG4gICAqIGBvdmVyd3JpdGVQYXRjaGAgZGlzYWdyZWVpbmcgYWJvdXQgYSB2YWx1ZSB0aGUgc3RhZ2Ugd3JvdGUuXG4gICAqL1xuICBwcml2YXRlIHN0YWdlZCA9IG5ldyBXZWFrU2V0PG9iamVjdD4oKTtcblxuICAvKipcbiAgICogT3duZWQgY29udGFpbmVycyB3aXRoIG5vIGNvbnRhaW5lciBzdGlsbCBzaGFyZWQgd2l0aCBjb21taXR0ZWQgc3RhdGVcbiAgICogYW55d2hlcmUgYmVsb3cgdGhlbSAoYSBwcml2YXRlIGRlZXAgY29weSwgYSBtZXJnZSByZXN1bHQgYnVpbHQgb24gYVxuICAgKiBwcml2YXRlIGJhc2UsIGEgcGF0aCBjb3B5IHdob3NlIHNoYXJlZCBjaGlsZHJlbiB3ZXJlIHByaXZhdGlzZWQpLiBBIHJlYWRcbiAgICogdGhhdCBsYW5kcyBvbiBvbmUgbmVlZHMgbm8gd2FsayDigJQgc2VlIHtAbGluayBwcml2YXRpc2VCZWxvd30uXG4gICAqL1xuICBwcml2YXRlIHByaXZhdGVUcmVlcyA9IG5ldyBXZWFrU2V0PG9iamVjdD4oKTtcblxuICAvKipcbiAgICogVGhlIGNvbnRhaW5lcnMgb2Yge0BsaW5rIGJhc2VTbmFwc2hvdH0gdGhhdCB7QGxpbmsgZGV0YWNoQmFzZX0gY3JlYXRlZDpcbiAgICogaXRzIHJvb3QgY29weSBhbmQgdGhlIGNvcGllcyBvbiB0aGUgd2F5IHRvIGEgZGV0YWNoZWQgcGF0aC4gQWxsb2NhdGVkXG4gICAqIG9ubHkgYnkgdGhlIGZpcnN0IGRldGFjaCDigJQgdGhlIGluLWNvbnRyYWN0IHN0YWdlIG5ldmVyIHBheXMgZm9yIGl0LlxuICAgKi9cbiAgcHJpdmF0ZSBiYXNlT3duZWQ/OiBXZWFrU2V0PG9iamVjdD47XG5cbiAgLyoqXG4gICAqIFRoZSBwcml2YXRlIGRlZXAgY29waWVzIHtAbGluayBkZXRhY2hCYXNlfSBwdXQgaW50byB0aGUgZGlmZiBiYXNlOiBub3RoaW5nXG4gICAqIGF0IG9yIGJlbG93IG9uZSBpcyBjb21taXR0ZWQgc3RhdGUsIHNvIGEgbGF0ZXIgZGV0YWNoIGluc2lkZSBpdCBpcyBhIG5vLW9wLlxuICAgKi9cbiAgcHJpdmF0ZSBkZXRhY2hlZEJhc2U/OiBXZWFrU2V0PG9iamVjdD47XG5cbiAgLyoqXG4gICAqIFdoZXJlIHRoZSBzdGFnZSB3cml0ZXMgKDkuMzAuMCk6IGEgcGF0aCBwcmVmaXggaXRzIGZyYW1lIGNvbXB1dGVkIGFuZFxuICAgKiBoYW5kcyBvdmVyIGFzIGRhdGEgKEMyIOKAlCBmb3IgdGhlIGVuZ2luZSwgdGhlIGZyYW1lJ3MgcnVuIG5hbWVzcGFjZSwgb3JcbiAgICogYFtdYCBmb3IgdGhlIHJvb3QpLiBJdHMgY29udGFpbmVycyBhcmUgdGhlIHN0YWdlJ3MgQUREUkVTUywgbm90IGEgdmFsdWVcbiAgICogdGhlIHN0YWdlIHJlYWRzIChldmVyeSByZWFkIGl0IG1ha2VzIGlzIGEga2V5IGJlbG93IGl0KSwgc28gYSBzaGVsbCBhXG4gICAqIHdyaXRlIGxlYXZlcyB0aGVyZSBpcyBubyBwYXJ0IG9mIHRoZSByZWFkLWJhY2sgdGhlIHJlY29yZCBtdXN0IGhvbGQuXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGFkZHJlc3M6IHJlYWRvbmx5IHN0cmluZ1tdO1xuXG4gIC8qKiBgbWVyZ2VgIG9wcyBzdGFnZWQgc2luY2UgdGhlIGxhc3QgY29tbWl0IOKAlCBzZWUge0BsaW5rIGFkbWl0fS4gKi9cbiAgcHJpdmF0ZSBzdGFnZWRNZXJnZXMgPSAwO1xuICAvKiogT3BzIHN0YWdlZCBkZWVwZXIgdGhhbiBvbmUga2V5IGJlbG93IHRoZSBzdGFnZSdzIGFkZHJlc3Mg4oCUIHNlZSB7QGxpbmsgYWRtaXR9LiAqL1xuICBwcml2YXRlIG5lc3RlZE9wcyA9IDA7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgYmFzZTogYW55LFxuICAgIGNvbW1pdFZhbHVlczogQ29tbWl0VmFsdWVzTW9kZSA9ICdmdWxsJyxcbiAgICByZWFkS2V5c1Byb3ZpZGVyPzogKCkgPT4gc3RyaW5nW10sXG4gICAgYWRkcmVzczogcmVhZG9ubHkgc3RyaW5nW10gPSBbXSxcbiAgKSB7XG4gICAgLy8gYGJhc2VgIGlzIHRoZSBjb21taXR0ZWQgZ2VuZXJhdGlvbiB0aGUgc3RhZ2UgZmlyc3QgdG91Y2hlZCDigJRcbiAgICAvLyBpbW11dGFibGUtYWZ0ZXItc3dhcCwgdGhlIGludmFyaWFudCB0aGUgZmlyc3QtdG91Y2ggdmlldyBhbHJlYWR5IHJlc3RzXG4gICAgLy8gb24g4oCUIHNvIHRoZSBkaWZmIGJhc2UgaXMgaGVsZCBieSBSRUZFUkVOQ0UsIGFuZCB0aGUgd29ya2luZyBjb3B5IHN0YXJ0c1xuICAgIC8vIGFzIGEgY29weSBvZiBpdHMgUk9PVCBvbmx5LiBCZWZvcmUgOS4yOS4wIHRoZXNlIHR3byBsaW5lcyB3ZXJlIHR3b1xuICAgIC8vIGBzdHJ1Y3R1cmVkQ2xvbmVgcyBvZiB0aGUgd2hvbGUgc3RhdGUsIHBhaWQgYnkgZXZlcnkgc3RhZ2UgdGhhdCB3cm90ZS5cbiAgICB0aGlzLmJhc2VTbmFwc2hvdCA9IGJhc2U7XG4gICAgdGhpcy53b3JraW5nQ29weSA9IG93bmVkUm9vdE9mKGJhc2UsIHRoaXMub3duZWQpO1xuICAgIHRoaXMuY29tbWl0VmFsdWVzID0gY29tbWl0VmFsdWVzO1xuICAgIHRoaXMucmVhZEtleXNQcm92aWRlciA9IHJlYWRLZXlzUHJvdmlkZXI7XG4gICAgdGhpcy5hZGRyZXNzID0gYWRkcmVzcztcbiAgfVxuXG4gIC8qKiBTdGFtcCB0aGUgY3VycmVudCByZWFkIHByZWZpeCBvbnRvIGEgc3RhZ2VkIG9wIOKAlCBvbmx5IHdoZW4gdGhlXG4gICAqICBwcm92ZW5hbmNlIGRpYWwgaXMgb24gKHByb3ZpZGVyIHByZXNlbnQpLCBzbyB0aGUgZGVmYXVsdCBwYXRoIGFsbG9jYXRlc1xuICAgKiAgbm90aGluZyBhbmQgY29tbWl0IGJ1bmRsZXMgc3RheSBieXRlLWlkZW50aWNhbC4gKi9cbiAgcHJpdmF0ZSBzdGFtcFJlYWRLZXlzKG9wOiB7IHBhdGg6IHN0cmluZzsgdmVyYjogT3BWZXJiOyByZWFkS2V5cz86IHN0cmluZ1tdIH0pOiB0eXBlb2Ygb3Age1xuICAgIGlmICh0aGlzLnJlYWRLZXlzUHJvdmlkZXIpIG9wLnJlYWRLZXlzID0gdGhpcy5yZWFkS2V5c1Byb3ZpZGVyKCk7XG4gICAgcmV0dXJuIG9wO1xuICB9XG5cbiAgLyoqIFN0YWdlIGFuIG9wIGludG8gYG9wVHJhY2VgLCBjb3VudGluZyB3aGF0IGRlY2lkZXMgd2hldGhlciB7QGxpbmsgYWRtaXR9IG11c3QgZm9sZC4gKi9cbiAgcHJpdmF0ZSBzdGFnZShwYXRoOiAoc3RyaW5nIHwgbnVtYmVyKVtdLCBrZXk6IHN0cmluZywgdmVyYjogT3BWZXJiKTogdm9pZCB7XG4gICAgaWYgKHZlcmIgPT09ICdtZXJnZScpIHRoaXMuc3RhZ2VkTWVyZ2VzKys7XG4gICAgaWYgKHBhdGgubGVuZ3RoIC0gYWRkcmVzc0RlcHRoT2YocGF0aCwgdGhpcy5hZGRyZXNzKSA+IDEpIHRoaXMubmVzdGVkT3BzKys7XG4gICAgdGhpcy5vcFRyYWNlLnB1c2godGhpcy5zdGFtcFJlYWRLZXlzKHsgcGF0aDoga2V5LCB2ZXJiIH0pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYXJkIG92ZXJ3cml0ZSBhdCB0aGUgc3BlY2lmaWVkIHBhdGguIFN0b3JlcyB0aGUgUkVGRVJFTkNFIGluIGJvdGggdHJlZXNcbiAgICogKDkuMjMuMCkg4oCUIHRoZSByZWNvcmQncyBjb3B5IGlzIHRha2VuIG9uY2UsIGF0IGNvbW1pdDsgc2VlIHRoZSBoZWFkZXIuXG4gICAqL1xuICBzZXQocGF0aDogKHN0cmluZyB8IG51bWJlcilbXSwgdmFsdWU6IGFueSwgc2hvdWxkUmVkYWN0ID0gZmFsc2UpOiB2b2lkIHtcbiAgICBjb25zdCBrZXkgPSBub3JtYWxpc2VQYXRoKHBhdGgpO1xuICAgIHRoaXMuZGV0YWNoSGVsZEFuY2VzdG9ycyhwYXRoKTtcbiAgICBvd25TcGluZSh0aGlzLndvcmtpbmdDb3B5LCBwYXRoLCB0aGlzLm93bmVkKTtcbiAgICBfc2V0KHRoaXMud29ya2luZ0NvcHksIHBhdGgsIHZhbHVlKTtcbiAgICBfc2V0KHRoaXMub3ZlcndyaXRlUGF0Y2gsIHBhdGgsIHZhbHVlKTtcbiAgICBpZiAoaXNDb250YWluZXIodmFsdWUpKSB7XG4gICAgICB0aGlzLmhlbGRSZWZzLmFkZChrZXkpO1xuICAgICAgdGhpcy5zdGFnZWQuYWRkKHZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5oZWxkUmVmcy5kZWxldGUoa2V5KTtcbiAgICB9XG4gICAgaWYgKHNob3VsZFJlZGFjdCkge1xuICAgICAgdGhpcy5yZWRhY3RlZFBhdGhzLmFkZChrZXkpO1xuICAgIH1cbiAgICB0aGlzLnN0YWdlKHBhdGgsIGtleSwgJ3NldCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEEgbmVzdGVkIG9wIGlzIGFib3V0IHRvIHdyaXRlIFRIUk9VR0ggYSBwYXRoIHdob3NlIGBvdmVyd3JpdGVQYXRjaGBcbiAgICogdmFsdWUgaXMgYSBoZWxkIHJlZmVyZW5jZSAoOS4yMy4wKS4gVG9kYXkncyBsYXcgaXMgdGhhdCB0aGUgdHdvIHRyZWVzXG4gICAqIHJlY2VpdmUgdGhlIHNhbWUgbmVzdGVkIGBzZXRgL2BkZWxldGVgIG11dGF0aW9ucyBidXQgT05MWSBgd29ya2luZ0NvcHlgXG4gICAqIHJlY2VpdmVzIGEgbmVzdGVkIGBtZXJnZWAncyByZXN1bHQgKGB1cGRhdGVQYXRjaGAgZ2V0cyB0aGUgZGVsdGEpIOKAlCBzbyBhXG4gICAqIGNvbnRhaW5lciBzaGFyZWQgYmV0d2VlbiB0aGUgdHJlZXMgd291bGQgbGVhayB0aGUgbWVyZ2VkIHZhbHVlIGludG8gdGhlXG4gICAqIG92ZXJ3cml0ZSBwYXlsb2FkLCBhbmQgYSBzaGFyZWQgY29udGFpbmVyIGlzIGFsc28gdGhlIGNhbGxlcidzIG93blxuICAgKiBvYmplY3QsIHdoaWNoIHRoZSBlbmdpbmUgbXVzdCBub3QgZWRpdCBvbiB0aGUgcmVjb3JkJ3MgYmVoYWxmLiBSZXBsYWNpbmdcbiAgICogdGhlIGhlbGQgYW5jZXN0b3Igd2l0aCBpdHMgY2xvbmUgaW4gYG92ZXJ3cml0ZVBhdGNoYCByZXN0b3JlcyBleGFjdGx5XG4gICAqIHRoZSBwcml2YXRlIHRyZWUgdGhlIHBlci13cml0ZSBjbG9uZSB1c2VkIHRvIGdpdmUgaXQsIHBhaWQgb25jZSBwZXJcbiAgICogYW5jZXN0b3IgYW5kIG9ubHkgb24gdGhlIG5lc3RlZC1vcCBwYXRoIHRoZSBwdWJsaWMgc3VyZmFjZSBuZXZlciB0YWtlc1xuICAgKiAodGhlIHNjb3BlIHByb3h5IHdyaXRlcyBST09UIGtleXMpLiBgd29ya2luZ0NvcHlgIGtlZXBzIHRoZSByZWZlcmVuY2UsXG4gICAqIGFzIGl0IGFsd2F5cyBkaWQuXG4gICAqL1xuICBwcml2YXRlIGRldGFjaEhlbGRBbmNlc3RvcnMocGF0aDogKHN0cmluZyB8IG51bWJlcilbXSk6IHZvaWQge1xuICAgIGlmICh0aGlzLmhlbGRSZWZzLnNpemUgPT09IDApIHJldHVybjtcbiAgICBmb3IgKGxldCBpID0gMTsgaSA8IHBhdGgubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGFuY2VzdG9yID0gcGF0aC5zbGljZSgwLCBpKTtcbiAgICAgIGNvbnN0IGtleSA9IG5vcm1hbGlzZVBhdGgoYW5jZXN0b3IpO1xuICAgICAgaWYgKCF0aGlzLmhlbGRSZWZzLmhhcyhrZXkpKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IGhlbGQgPSBfZ2V0KHRoaXMub3ZlcndyaXRlUGF0Y2gsIGFuY2VzdG9yKTtcbiAgICAgIGlmIChoZWxkICE9PSBudWxsICYmIHR5cGVvZiBoZWxkID09PSAnb2JqZWN0JykgX3NldCh0aGlzLm92ZXJ3cml0ZVBhdGNoLCBhbmNlc3Rvciwgc3RydWN0dXJlZENsb25lKGhlbGQpKTtcbiAgICAgIHRoaXMuaGVsZFJlZnMuZGVsZXRlKGtleSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEV4cGxpY2l0IGtleSBkZWxldGlvbiBhdCB0aGUgc3BlY2lmaWVkIHBhdGggKCMxM2MtQjsgYWJzb3JicyBiYWNrbG9nIEI4KS5cbiAgICpcbiAgICogU3RhZ2VzIEVYQUNUTFkgdGhlIHNhbWUgYnVmZmVyIG11dGF0aW9ucyBhcyBgc2V0KHBhdGgsIHVuZGVmaW5lZClgIOKAlFxuICAgKiBgd29ya2luZ0NvcHlgL2BvdmVyd3JpdGVQYXRjaGAgZ2V0IGFuIG93biBgdW5kZWZpbmVkYCBhdCB0aGUgcGF0aCAodGhlXG4gICAqIGhpc3RvcmljYWwgZmxhdHRlbmluZywgcHJlc2VydmluZyByZWFkIGJlaGF2aW9yIGFuZCB0aGUgZGVkdXAgZGlmZiBiYXNlXG4gICAqIGFjcm9zcyBtb2Rlcykg4oCUIGJ1dCByZWNvcmRzIHRoZSBvcCB2ZXJiIGFzIGAnZGVsZXRlJ2AuIEF0IGNvbW1pdDpcbiAgICogYCdmdWxsJ2AgbW9kZSBtYXBzIGl0IGJhY2sgdG8gYSBgJ3NldCdgIHRyYWNlIGVudHJ5IChieXRlLWlkZW50aWNhbCB0b1xuICAgKiB0b2RheSk7IGAnZGVsdGEnYCBtb2RlIGVtaXRzIGEgcmVhbCBgJ2RlbGV0ZSdgIGVudHJ5IHdob3NlIHJlcGxheVxuICAgKiBSRU1PVkVTIHRoZSBrZXkgaW5zdGVhZCBvZiBsZWF2aW5nIGBrZXk6IHVuZGVmaW5lZGAgYmVoaW5kLlxuICAgKlxuICAgKiBUaGUgbmV0LWNoYW5nZSBmaWx0ZXIgcmVhZHMgdGhhdCBzdGFnZWQgb3duIGB1bmRlZmluZWRgIGFzIEFCU0VOVFxuICAgKiAoYGRlZXBFcXVhbGAsIDkuMTkuMSkg4oCUIHNvIHVuZGVyIGAnZGVsdGEnYCwgd2hvc2UgY29tbWl0dGVkIHN0YXRlIHJlYWxseVxuICAgKiBsYWNrcyB0aGUga2V5LCBkZWxldGluZyBhbiBhYnNlbnQga2V5IGluc2lkZSBhIGNvbnRhaW5lciB0aGUgc3RhZ2UgYWxzb1xuICAgKiByZS13cm90ZSBpcyB0aGUgbm8tb3AgaXQgaXMsIG5vdCBhIGBzZXRgIG9mIHRoZSB3aG9sZSBjb250YWluZXIuXG4gICAqL1xuICBkZWxldGUocGF0aDogKHN0cmluZyB8IG51bWJlcilbXSwgc2hvdWxkUmVkYWN0ID0gZmFsc2UpOiB2b2lkIHtcbiAgICBjb25zdCBrZXkgPSBub3JtYWxpc2VQYXRoKHBhdGgpO1xuICAgIHRoaXMuZGV0YWNoSGVsZEFuY2VzdG9ycyhwYXRoKTtcbiAgICBvd25TcGluZSh0aGlzLndvcmtpbmdDb3B5LCBwYXRoLCB0aGlzLm93bmVkKTtcbiAgICBfc2V0KHRoaXMud29ya2luZ0NvcHksIHBhdGgsIHVuZGVmaW5lZCk7XG4gICAgX3NldCh0aGlzLm92ZXJ3cml0ZVBhdGNoLCBwYXRoLCB1bmRlZmluZWQpO1xuICAgIHRoaXMuaGVsZFJlZnMuZGVsZXRlKGtleSk7XG4gICAgaWYgKHNob3VsZFJlZGFjdCkge1xuICAgICAgdGhpcy5yZWRhY3RlZFBhdGhzLmFkZChrZXkpO1xuICAgIH1cbiAgICB0aGlzLnN0YWdlKHBhdGgsIGtleSwgJ2RlbGV0ZScpO1xuICB9XG5cbiAgLyoqIERlZXAgdW5pb24gbWVyZ2UgYXQgdGhlIHNwZWNpZmllZCBwYXRoLiBgZGVlcFNtYXJ0TWVyZ2VgIGJ1aWxkcyBmcmVzaFxuICAgKiAgY29udGFpbmVycywgc28gbmVpdGhlciB0cmVlIGV2ZXIgaG9sZHMgdGhlIG1lcmdlIElOUFVUIGJ5IHJlZmVyZW5jZTtcbiAgICogIHRoZSBuZXN0ZWQtb3AgZGV0YWNoIGd1YXJkcyB0aGUgYW5jZXN0b3IgaXQgd3JpdGVzIElOVE8uXG4gICAqXG4gICAqICBUaGUgdmFsdWUgbWVyZ2VkIElOVE8gaXMgbWFkZSBwcml2YXRlIGZpcnN0IChgcHJpdmF0aXNlYCksIGFzIHRoZVxuICAgKiAgd2hvbGUtc3RhdGUgY2xvbmUgbWFkZSBpdCBiZWZvcmUgOS4yOS4wLiBOb3Qgb25seSBmb3IgdGhlIHJlYWRzIHRoYXRcbiAgICogIGZvbGxvdzogYGRlZXBTbWFydE1lcmdlYCB1bmlvbnMgYXJyYXlzIEJZIFJFRkVSRU5DRSwgc28gd2hldGhlciBhblxuICAgKiAgZWxlbWVudCB0aGUgc3RhZ2UgcGFzc2VzIGluIGlzIFwiYWxyZWFkeSB0aGVyZVwiIGRlcGVuZHMgb24gd2hpY2ggb2JqZWN0c1xuICAgKiAgdGhlIGJhc2UgaG9sZHMg4oCUIGEgY29tbWl0dGVkIGFycmF5IHdvdWxkIGRlZHVwIGFuIGVsZW1lbnQgdGhlIHN0YWdlXG4gICAqICByZWFkIGZyb20gaXQgYmVmb3JlIGl0cyBmaXJzdCB3cml0ZSwgd2hlcmUgdGhlIHByaXZhdGUgY29weSAoYW5kXG4gICAqICA5LjI4LjApIGFwcGVuZHMgaXQuICovXG4gIG1lcmdlKHBhdGg6IChzdHJpbmcgfCBudW1iZXIpW10sIHZhbHVlOiBhbnksIHNob3VsZFJlZGFjdCA9IGZhbHNlKTogdm9pZCB7XG4gICAgY29uc3Qga2V5ID0gbm9ybWFsaXNlUGF0aChwYXRoKTtcbiAgICB0aGlzLmRldGFjaEhlbGRBbmNlc3RvcnMocGF0aCk7XG4gICAgdGhpcy5wcml2YXRpc2UocGF0aCk7XG4gICAgY29uc3QgZXhpc3RpbmcgPSBfZ2V0KHRoaXMud29ya2luZ0NvcHksIHBhdGgpID8/IHt9O1xuICAgIGNvbnN0IG1lcmdlZCA9IGRlZXBTbWFydE1lcmdlKGV4aXN0aW5nLCB2YWx1ZSk7XG4gICAgb3duU3BpbmUodGhpcy53b3JraW5nQ29weSwgcGF0aCwgdGhpcy5vd25lZCk7XG4gICAgb3duKG1lcmdlZCwgdGhpcy5vd25lZCk7XG4gICAgaWYgKGlzQ29udGFpbmVyKG1lcmdlZCkpIHRoaXMucHJpdmF0ZVRyZWVzLmFkZChtZXJnZWQpO1xuICAgIF9zZXQodGhpcy53b3JraW5nQ29weSwgcGF0aCwgbWVyZ2VkKTtcbiAgICBfc2V0KHRoaXMudXBkYXRlUGF0Y2gsIHBhdGgsIGRlZXBTbWFydE1lcmdlKF9nZXQodGhpcy51cGRhdGVQYXRjaCwgcGF0aCkgPz8ge30sIHZhbHVlKSk7XG4gICAgaWYgKHNob3VsZFJlZGFjdCkge1xuICAgICAgdGhpcy5yZWRhY3RlZFBhdGhzLmFkZChrZXkpO1xuICAgIH1cbiAgICB0aGlzLnN0YWdlKHBhdGgsIGtleSwgJ21lcmdlJyk7XG4gIH1cblxuICAvKipcbiAgICogRmllbGQtbGV2ZWwgcmVkYWN0aW9uICg5LjE5LjApOiBtYXJrIGRvdC1wYXRocyBJTlNJREUgdGhlIHZhbHVlIHN0YWdlZCBhdFxuICAgKiBgcGF0aGAgYXMgc2VjcmV0LCBzbyBgc2NydWJQYXRjaGAgc2NydWJzIHRoZW0gaW4gdGhlIGNvbW1pdCBsb2cgYW5kIHRoZVxuICAgKiBtaXJyb3IgdGhlIHNhbWUgd2F5IGEgd2hvbGUta2V5IHJlZGFjdGlvbiBpcyBzY3J1YmJlZC4gQSBmaWVsZCBpc1xuICAgKiByZWdpc3RlcmVkIGFzIGEgbGl0ZXJhbCBrZXkgQU5ELCB3aGVuIGRvdHRlZCwgYXMgdGhlIG5lc3RlZCBwYXRoIGl0XG4gICAqIG5hbWVzIOKAlCB3aGljaGV2ZXIgZXhpc3RzIGluIHRoZSBwYXRjaCBpcyB0aGUgb25lIGBzY3J1YlBhdGNoYCBmaW5kcy5cbiAgICogTWFya2VkIHBhdGhzIHN1cnZpdmUgY29tbWl0IG9ubHkgd2hpbGUgdGhlIG9wIHBhdGggdGhleSBzaXQgdW5kZXIgZG9lc1xuICAgKiAoc2VlIHtAbGluayBzdXJ2aXZpbmdSZWRhY3RlZFBhdGhzfSkuXG4gICAqL1xuICBtYXJrUmVkYWN0ZWRGaWVsZHMocGF0aDogKHN0cmluZyB8IG51bWJlcilbXSwgZmllbGRzOiByZWFkb25seSBzdHJpbmdbXSk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgZmllbGQgb2YgZmllbGRzKSB7XG4gICAgICB0aGlzLnJlZGFjdGVkUGF0aHMuYWRkKG5vcm1hbGlzZVBhdGgoWy4uLnBhdGgsIGZpZWxkXSkpO1xuICAgICAgaWYgKGZpZWxkLmluY2x1ZGVzKCcuJykpIHRoaXMucmVkYWN0ZWRQYXRocy5hZGQobm9ybWFsaXNlUGF0aChbLi4ucGF0aCwgLi4uZmllbGQuc3BsaXQoJy4nKV0pKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRG9lcyBhIHJlZGFjdGlvbiBtYXJrIGFkZHJlc3MgYW4gYXJyYXkgRUxFTUVOVCByaWdodCBiZWxvdyBgcGF0aGBcbiAgICogKGBsaXN0LjEudG9rZW5gKT8gQW4gYGFwcGVuZGAgcm93IHJlLWJhc2VzIHRoZSBpbmRpY2VzIG9udG8gdGhlIHRhaWwsIHNvXG4gICAqIHN1Y2ggYSBwYXRoIHRha2VzIHRoZSB3aG9sZS12YWx1ZSBgc2V0YCAoYGRlbHRhRW5jb2RpbmcgwrcgcHVzaFZhbHVlUm93YCkuXG4gICAqIEEgbWFyayBieSBOQU1FIGJlbG93IGFuIGFycmF5IChgb2JqLnlgKSBtZWFucyB0aGUgc2FtZSB0aGluZyBvbiB0aGUgdGFpbFxuICAgKiBhcyBvbiB0aGUgd2hvbGUgdmFsdWUsIHNvIHRoZSBjb21wYWN0IHJvdyBzdGF5cyAoYnl0ZS1pZGVudGljYWwpLlxuICAgKi9cbiAgcHJpdmF0ZSBtYXJrZWRCZWxvdyhwYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCBwcmVmaXggPSBwYXRoICsgREVMSU07XG4gICAgZm9yIChjb25zdCBtYXJrZWQgb2YgdGhpcy5yZWRhY3RlZFBhdGhzKSB7XG4gICAgICBpZiAoIW1hcmtlZC5zdGFydHNXaXRoKHByZWZpeCkpIGNvbnRpbnVlO1xuICAgICAgY29uc3QgbmV4dCA9IG1hcmtlZC5zbGljZShwcmVmaXgubGVuZ3RoKS5zcGxpdChERUxJTSlbMF07XG4gICAgICBpZiAoL14oMHxbMS05XVxcZCopJC8udGVzdChuZXh0KSkgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgcmVkYWN0ZWQgcGF0aHMgdGhhdCBzdXJ2aXZlIHRoZSBuZXQtY2hhbmdlIGZpbHRlcjogYSBwYXRoIHN1cnZpdmVzXG4gICAqIHdoZW4gaXQgSVMgYSBzdXJ2aXZpbmcgb3AgcGF0aCAoYSB3aG9sZS1rZXkgcmVkYWN0aW9uKSBvciBzaXRzIFVOREVSIG9uZVxuICAgKiAoYSBmaWVsZCBpbnNpZGUgYSBzdXJ2aXZpbmcgd3JpdGUpLiBBIGRyb3BwZWQgb3AgdGFrZXMgaXRzIGZpZWxkcyB3aXRoIGl0LlxuICAgKi9cbiAgcHJpdmF0ZSBzdXJ2aXZpbmdSZWRhY3RlZFBhdGhzKHN1cnZpdmluZ1BhdGhzOiBTZXQ8c3RyaW5nPik6IFNldDxzdHJpbmc+IHtcbiAgICBjb25zdCBvdXQgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBmb3IgKGNvbnN0IHBhdGggb2YgdGhpcy5yZWRhY3RlZFBhdGhzKSB7XG4gICAgICBpZiAoc3Vydml2aW5nUGF0aHMuaGFzKHBhdGgpKSB7XG4gICAgICAgIG91dC5hZGQocGF0aCk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgZm9yIChjb25zdCBvcCBvZiBzdXJ2aXZpbmdQYXRocykge1xuICAgICAgICBpZiAocGF0aC5zdGFydHNXaXRoKG9wICsgREVMSU0pKSB7XG4gICAgICAgICAgb3V0LmFkZChwYXRoKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gb3V0O1xuICB9XG5cbiAgLyoqXG4gICAqIFJlYWQgY3VycmVudCB2YWx1ZSBhdCBwYXRoIChpbmNsdWRlcyB1bmNvbW1pdHRlZCBjaGFuZ2VzKS4gVGhlIHZhbHVlIGlzXG4gICAqIHRoZSBzdGFnZSdzIG93biDigJQgcHJpdmF0ZSB0byBpdCwgYXMgdGhlIHdob2xlLXN0YXRlIGNsb25lIG1hZGUgZXZlcnkgcmVhZFxuICAgKiBhZnRlciB0aGUgZmlyc3Qgd3JpdGUgYmVmb3JlIDkuMjkuMCAoYHByaXZhdGlzZWApLlxuICAgKi9cbiAgZ2V0KHBhdGg6IChzdHJpbmcgfCBudW1iZXIpW10sIGRlZmF1bHRWYWx1ZT86IGFueSkge1xuICAgIHRoaXMucHJpdmF0aXNlKHBhdGgpO1xuICAgIHJldHVybiBfZ2V0KHRoaXMud29ya2luZ0NvcHksIHBhdGgsIGRlZmF1bHRWYWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogUmVhZCB0aGUgd29ya2luZyBjb3B5IGF0IGBwYXRoYCBXSVRIT1VUIHRha2luZyBhIHByaXZhdGUgY29weSDigJQgZm9yIGFcbiAgICogcmVhZGVyIHRoYXQgb25seSBjb21wYXJlcyAodGhlIGRldi1tb2RlIGJvcnJvd2VkLW11dGF0aW9uIHJlcG9ydCBpblxuICAgKiBgU3RhZ2VDb250ZXh0LmNvbW1pdGApLCBuZXZlciBmb3IgYSB2YWx1ZSBoYW5kZWQgdG8gYSBzdGFnZS5cbiAgICovXG4gIHBlZWsocGF0aDogKHN0cmluZyB8IG51bWJlcilbXSk6IHVua25vd24ge1xuICAgIHJldHVybiBfZ2V0KHRoaXMud29ya2luZ0NvcHksIHBhdGgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEtlZXAgdGhlIGRpZmYgYmFzZSBleGFjdCB1bmRlciBhIHJlYWQgdGhlIHdvcmtpbmcgY29weSBjYW5ub3QgYW5zd2VyLlxuICAgKlxuICAgKiBXaGVuIGB3b3JraW5nQ29weWAgaG9sZHMgbm90aGluZyBhdCBgcGF0aGAg4oCUIHRoZSBzdGFnZSBkZWxldGVkIG9yIHVuc2V0XG4gICAqIGl0LCBvciBhIHdyaXRlIHJlcGxhY2VkIGEgY29udGFpbmVyIGFib3ZlIGl0IOKAlCBgUmVjb3JkRnJhbWUgwrcgcmVhZGBcbiAgICogc2VydmVzIHRoZSByZWFkIGZyb20gTElWRSBjb21taXR0ZWQgc3RhdGUsIGV4YWN0bHkgYXMgOS4yOC4wXG4gICAqIGRpZCwgc28gdGhlIHZhbHVlIGl0IGhhbmRzIG91dCBpcyBjb21taXR0ZWQgc3RhdGUgaXRzZWxmLiBPbiA5LjI4LjAgdGhlXG4gICAqIGRpZmYgYmFzZSB3YXMgYSB3aG9sZS1zdGF0ZSBjbG9uZSB0YWtlbiBhdCB0aGUgc3RhZ2UncyBmaXJzdCB3cml0ZSwgYW5kXG4gICAqIGFuIGluLXBsYWNlIGVkaXQgb2YgdGhhdCB2YWx1ZSAob3V0IG9mIGNvbnRyYWN0IOKAlCByZWFkcyBhcmUgYm9ycm93ZWQpXG4gICAqIGNvdWxkIG5vdCBtb3ZlIGl0OiB3cml0dGVuIGJhY2ssIHRoZSBlZGl0IHdhcyByZWNvcmRlZC4gSGVyZSB0aGUgZGlmZlxuICAgKiBiYXNlIElTIGEgY29tbWl0dGVkIGdlbmVyYXRpb24sIGFuZCBpdCB2ZXJ5IG9mdGVuIGhvbGRzIHRoYXQgc2FtZVxuICAgKiBjb250YWluZXIgYXQgYHBhdGhgIOKAlCB0aGUgZWRpdCB3b3VsZCBtb3ZlIHRoZSBiYXNlIHdpdGggaXQsIGFuZCB0aGVcbiAgICogd3JpdGUtYmFjayB3b3VsZCBjb21taXQgbm8gY2hhbmdlLiBTbyBiZWZvcmUgdGhlIHZhbHVlIGdvZXMgb3V0LCB0aGVcbiAgICogYmFzZSdzIHZhbHVlIGF0IGBwYXRoYCBpcyByZXBsYWNlZCBieSBhIHByaXZhdGUgZGVlcCBjb3B5ICh0aGUgYmFzZSdzXG4gICAqIHJvb3QgYW5kIHRoZSBjb250YWluZXJzIG9uIHRoZSB3YXkgY29waWVkIHNoYWxsb3dseSkg4oCUIHdoYXQgOS4yOC4wJ3NcbiAgICogYmFzZSBoZWxkIHRoZXJlLiBUaGUgY29tbWl0J3MgbmV0LWNoYW5nZSB0ZXN0IGNvbXBhcmVzIGFnYWluc3QgaXQgYW5kXG4gICAqIHRoZSBkZWx0YSBlbmNvZGVyIHJlcGxheXMgZnJvbSBpdDsgdGhlIHZhbHVlIGhhbmRlZCBvdXQgc3RheXMgdGhlIGxpdmVcbiAgICogb25lLCBzbyB3aGF0ZXZlciBlbHNlIGFuIGVkaXQgb2YgaXQgcmVhY2hlcyAobGl2ZSBzdGF0ZSwgdGhlIG5leHRcbiAgICogZ2VuZXJhdGlvbikgYmVoYXZlcyBhcyBvbiA5LjI4LjAgdG9vLlxuICAgKlxuICAgKiBOb3QgYHByaXZhdGlzZWA6IGEgcHJpdmF0ZSBjb3B5IGhhbmRlZCB0byB0aGUgc3RhZ2Ugd291bGQgYWxzbyBrZWVwIHRoZVxuICAgKiBlZGl0IG91dCBvZiBsaXZlIHN0YXRlLCB3aGVyZSA5LjI4LjAgbGV0IGl0IGluIOKAlCBhIHJ1bi1uYW1lc3BhY2VkIHJlYWRcbiAgICogdGhhdCBmYWxscyBiYWNrIHRvIGEgZ2xvYmFsIGtleSB3b3VsZCB0aGVuIGVuZCBkaWZmZXJlbnRseSAodGhlXG4gICAqIGRpZmZlcmVudGlhbCdzIE5FU1RFRCBmYW1pbHkgZmFpbHMgd2l0aGluIDEwMCBwcm9ncmFtcyB0aGF0IHdheSkuXG4gICAqXG4gICAqIENvcGllcyBub3RoaW5nIHdoZW4gdGhlIGJhc2UgaG9sZHMgbm8gY29udGFpbmVyIGF0IGBwYXRoYCwgYW5kIG5vdGhpbmdcbiAgICogdHdpY2U6IGEgcGF0aCBhdCBvciBiZWxvdyBhbiBlYXJsaWVyIGRldGFjaCBpcyBhbHJlYWR5IHByaXZhdGUuIE8ocGF0aClcbiAgICogb3RoZXJ3aXNlLCBwbHVzIE8odmFsdWUpIG9uY2UgcGVyIGRldGFjaGVkIHBhdGguXG4gICAqL1xuICBkZXRhY2hCYXNlKHBhdGg6IChzdHJpbmcgfCBudW1iZXIpW10pOiB2b2lkIHtcbiAgICBpZiAocGF0aC5sZW5ndGggPT09IDAgfHwgIWlzQ29udGFpbmVyKHRoaXMuYmFzZVNuYXBzaG90KSkgcmV0dXJuO1xuICAgIGxldCBhdDogb2JqZWN0ID0gdGhpcy5iYXNlU25hcHNob3Q7XG4gICAgZm9yIChjb25zdCBrIG9mIHBhdGgpIHtcbiAgICAgIGlmICh0aGlzLmRldGFjaGVkQmFzZT8uaGFzKGF0KSkgcmV0dXJuO1xuICAgICAgY29uc3QgY2hpbGQgPSBvd25DaGlsZChhdCwgayk7XG4gICAgICBpZiAoIWlzQ29udGFpbmVyKGNoaWxkKSkgcmV0dXJuO1xuICAgICAgYXQgPSBjaGlsZDtcbiAgICB9XG4gICAgaWYgKHRoaXMuZGV0YWNoZWRCYXNlPy5oYXMoYXQpKSByZXR1cm47XG4gICAgY29uc3Qgb3duZWQgPSAodGhpcy5iYXNlT3duZWQgPz89IG5ldyBXZWFrU2V0PG9iamVjdD4oKSk7XG4gICAgaWYgKCFvd25lZC5oYXModGhpcy5iYXNlU25hcHNob3QpKSB0aGlzLmJhc2VTbmFwc2hvdCA9IG93bmVkUm9vdE9mKHRoaXMuYmFzZVNuYXBzaG90LCBvd25lZCk7XG4gICAgb3duU3BpbmUodGhpcy5iYXNlU25hcHNob3QsIHBhdGgsIG93bmVkKTtcbiAgICBjb25zdCBjb3B5OiBvYmplY3QgPSBzdHJ1Y3R1cmVkQ2xvbmUoYXQpO1xuICAgICh0aGlzLmRldGFjaGVkQmFzZSA/Pz0gbmV3IFdlYWtTZXQ8b2JqZWN0PigpKS5hZGQoY29weSk7XG4gICAgX3NldCh0aGlzLmJhc2VTbmFwc2hvdCwgcGF0aCwgY29weSk7XG4gIH1cblxuICAvKipcbiAgICogUHJpdmF0ZSByZWFkcyAoOS4yOS4wKTogbWFrZSB0aGUgdmFsdWUgYXQgYHBhdGhgIHRoZSBzdGFnZSdzIG93biBiZWZvcmVcbiAgICogYSByZWFkIGhhbmRzIGl0IG91dCDigJQgc28gYSByZWFkIGFmdGVyIHRoZSBzdGFnZSdzIGZpcnN0IHdyaXRlIGJlaGF2ZXNcbiAgICogZXhhY3RseSBhcyBpdCBkaWQgd2hlbiB0aGUgYnVmZmVyIGJlZ2FuIHdpdGggYSBkZWVwIGNsb25lIG9mIHRoZSB3aG9sZVxuICAgKiBzdGF0ZS4gQW4gaW4tcGxhY2UgZWRpdCBvZiB3aGF0IHRoZSByZWFkIHJldHVybmVkIChvdXQgb2YgY29udHJhY3Qg4oCUXG4gICAqIHJlYWRzIGFyZSBib3Jyb3dlZCkgc3RheXMgaW5zaWRlIHRoZSBidWZmZXIsIGFuZCBjb21taXR0ZWQgc3RhdGUgaXMgbmV2ZXJcbiAgICogdG91Y2hlZC4gV2hldGhlciB0aGUgUkVDT1JEIGtlZXBzIGl0IGlzIHRoZSBhZG1pdHRlZCByZWNvcmQncyBsYXdcbiAgICogKDkuMzAuMCwgb3duZXIgcnVsaW5nIFIxIOKAlCB0aGUgcmVjb3JkIGtlZXBzIHdoYXQgdGhlIHN0YWdlIHJlYWQgYmFjayk6IGl0XG4gICAqIGlzIGtlcHQgd2hlbiB0aGUgZWRpdGVkIHZhbHVlIGxpZXMgYXQgb3IgYmVsb3cgYSBwYXRoIHRoZSBzdGFnZSB3cm90ZSBpblxuICAgKiB0aGlzIHN0YWdlIOKAlCBzZXQsIG1lcmdlZCBvciB3cml0dGVuIGJhY2sgYWxpa2Ug4oCUIGFuZCBsb3N0IG90aGVyd2lzZS5cbiAgICpcbiAgICogV2Fsa2luZyB0aGUgcGF0aCBmcm9tIHRoZSAob3duZWQpIHJvb3Q6XG4gICAqICAtIGEgY29udGFpbmVyIHN0aWxsIFNIQVJFRCB3aXRoIGNvbW1pdHRlZCBzdGF0ZSBhdCB0aGUgc2FtZSBwb3NpdGlvbiBpc1xuICAgKiAgICByZXBsYWNlZCBieSBhIHByaXZhdGUgZGVlcCBjb3B5IHdoZW4gaXQgaXMgdGhlIHZhbHVlIHJlYWQsIG9yIGJ5IGFcbiAgICogICAgc2hhbGxvdyBjb3B5IHdoZW4gaXQgaXMgYSBjb250YWluZXIgb24gdGhlIHdheSB0byBpdCAoc28gYSByZWFkIG9mXG4gICAqICAgIGBrYCB1bmRlciBhIGZvcmsgY2hpbGQncyBhZGRyZXNzIGNvcGllcyBga2AsIG5vdCBldmVyeSBjaGlsZCdzIG5hbWVzcGFjZSk7XG4gICAqICAtIGEgY29udGFpbmVyIHRoZSBzdGFnZSBTVEFHRUQgKG9yIGFueXRoaW5nIGVsc2UgdGhlIGJ1ZmZlciBkaWQgbm90XG4gICAqICAgIHRha2UgZnJvbSBjb21taXR0ZWQgc3RhdGUpIGlzIGhhbmRlZCBiYWNrIGJ5IHJlZmVyZW5jZSwgYXMgYmVmb3JlO1xuICAgKiAgLSBhIGNvbnRhaW5lciB0aGUgYnVmZmVyIG93bnMgaXMgd2Fsa2VkIG9uIOKAlCBhbmQgd2hlbiBpdCBpcyB0aGUgdmFsdWVcbiAgICogICAgcmVhZCwgaXRzIHN0aWxsLXNoYXJlZCBkZXNjZW5kYW50cyBhcmUgcHJpdmF0aXNlZFxuICAgKiAgICAoe0BsaW5rIHByaXZhdGlzZUJlbG93fSkuXG4gICAqXG4gICAqIENvc3Q6IE8ocGF0aCkgcGVyIHJlYWQsIHBsdXMgTyh2YWx1ZSkgT05DRSBwZXIgc2hhcmVkIGNvbnRhaW5lciBhIHN0YWdlXG4gICAqIHJlYWRzIGFmdGVyIGl0cyBmaXJzdCB3cml0ZS4gQSBzdGFnZSB0aGF0IG5ldmVyIHJlYWRzIGFmdGVyIHdyaXRpbmcgcGF5c1xuICAgKiBub3RoaW5nOyBhIHJlYWQgYmVmb3JlIHRoZSBmaXJzdCB3cml0ZSBuZXZlciByZWFjaGVzIHRoZSBidWZmZXIuXG4gICAqL1xuICBwcml2YXRlIHByaXZhdGlzZShwYXRoOiAoc3RyaW5nIHwgbnVtYmVyKVtdKTogdm9pZCB7XG4gICAgaWYgKHBhdGgubGVuZ3RoID09PSAwKSByZXR1cm47XG4gICAgLy8gUmVzb2x2ZSBmaXJzdDogYSByZWFkIHRoYXQgbGFuZHMgb24gbm90aGluZyAoYSBtaXNzaW5nIGtleSwgYSByZWZ1c2VkXG4gICAgLy8gc2VnbWVudCwgYSBwcmltaXRpdmUpIHJldHVybnMgbm90aGluZyBhbmQgbXVzdCBjb3B5IG5vdGhpbmcuXG4gICAgY29uc3QgY2hhaW46IG9iamVjdFtdID0gW107XG4gICAgbGV0IGF0OiB1bmtub3duID0gdGhpcy53b3JraW5nQ29weTtcbiAgICBmb3IgKGNvbnN0IGsgb2YgcGF0aCkge1xuICAgICAgYXQgPSBvd25DaGlsZChhdCwgayk7XG4gICAgICBpZiAoIWlzQ29udGFpbmVyKGF0KSkgcmV0dXJuO1xuICAgICAgY2hhaW4ucHVzaChhdCk7XG4gICAgfVxuICAgIGxldCBwYXJlbnQ6IGFueSA9IHRoaXMud29ya2luZ0NvcHk7XG4gICAgbGV0IGJhc2U6IHVua25vd24gPSB0aGlzLmJhc2VTbmFwc2hvdDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhdGgubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGsgPSBwYXRoW2ldO1xuICAgICAgY29uc3QgYXRCYXNlID0gb3duQ2hpbGQoYmFzZSwgayk7XG4gICAgICBsZXQgdmFsdWUgPSBjaGFpbltpXTtcbiAgICAgIGlmICghdGhpcy5vd25lZC5oYXModmFsdWUpKSB7XG4gICAgICAgIGlmICh2YWx1ZSAhPT0gYXRCYXNlIHx8IHRoaXMuc3RhZ2VkLmhhcyh2YWx1ZSkpIHJldHVybjtcbiAgICAgICAgaWYgKGkgPT09IHBhdGgubGVuZ3RoIC0gMSkge1xuICAgICAgICAgIHBhcmVudFtrXSA9IHRoaXMucHJpdmF0ZUNvcHlPZih2YWx1ZSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHZhbHVlID0gc2hhbGxvd0NvcHkodmFsdWUpO1xuICAgICAgICB0aGlzLm93bmVkLmFkZCh2YWx1ZSk7XG4gICAgICAgIHBhcmVudFtrXSA9IHZhbHVlO1xuICAgICAgfVxuICAgICAgcGFyZW50ID0gdmFsdWU7XG4gICAgICBiYXNlID0gYXRCYXNlO1xuICAgIH1cbiAgICB0aGlzLnByaXZhdGlzZUJlbG93KHBhcmVudCwgYmFzZSk7XG4gIH1cblxuICAvKipcbiAgICogQW4gT1dORUQgY29udGFpbmVyIGlzIGFib3V0IHRvIGJlIHJlYWQgd2hvbGUgKGEgcGF0aCBjb3B5IGEgbmVzdGVkIHdyaXRlXG4gICAqIG1hZGUsIHNheSk6IGl0cyBkZXNjZW5kYW50cyBzdGlsbCBzaGFyZWQgd2l0aCBjb21taXR0ZWQgc3RhdGUgYXJlXG4gICAqIHJlcGxhY2VkIGJ5IHByaXZhdGUgZGVlcCBjb3BpZXMsIHNvIG5vdGhpbmcgdGhlIHJlYWQgaGFuZHMgb3V0IGlzXG4gICAqIGNvbW1pdHRlZCBzdGF0ZS4gV2Fsa3Mgb3duZWQgY29udGFpbmVycyBvbmx5OyBtYXJrcyBlYWNoIG9uZSBmaW5pc2hlZFxuICAgKiAoe0BsaW5rIHByaXZhdGVUcmVlc30pLCBzbyBhIGNvbnRhaW5lciBpcyBzY2FubmVkIG9uY2UgcGVyIHN0YWdlLlxuICAgKi9cbiAgcHJpdmF0ZSBwcml2YXRpc2VCZWxvdyhjb250YWluZXI6IG9iamVjdCwgYmFzZTogdW5rbm93bik6IHZvaWQge1xuICAgIGNvbnN0IHdvcms6IEFycmF5PFtvYmplY3QsIHVua25vd25dPiA9IFtbY29udGFpbmVyLCBiYXNlXV07XG4gICAgd2hpbGUgKHdvcmsubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgW25vZGUsIG5vZGVCYXNlXSA9IHdvcmsucG9wKCkhO1xuICAgICAgaWYgKHRoaXMucHJpdmF0ZVRyZWVzLmhhcyhub2RlKSkgY29udGludWU7XG4gICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhub2RlKSkge1xuICAgICAgICBjb25zdCBjaGlsZCA9IG93bkNoaWxkKG5vZGUsIGtleSk7XG4gICAgICAgIGlmICghaXNDb250YWluZXIoY2hpbGQpKSBjb250aW51ZTtcbiAgICAgICAgY29uc3QgYXRCYXNlID0gb3duQ2hpbGQobm9kZUJhc2UsIGtleSk7XG4gICAgICAgIGlmICh0aGlzLm93bmVkLmhhcyhjaGlsZCkpIHdvcmsucHVzaChbY2hpbGQsIGF0QmFzZV0pO1xuICAgICAgICBlbHNlIGlmIChjaGlsZCA9PT0gYXRCYXNlICYmICF0aGlzLnN0YWdlZC5oYXMoY2hpbGQpKSB7XG4gICAgICAgICAgKG5vZGUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2tleV0gPSB0aGlzLnByaXZhdGVDb3B5T2YoY2hpbGQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLnByaXZhdGVUcmVlcy5hZGQobm9kZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqIEEgcHJpdmF0ZSBkZWVwIGNvcHkgb2YgYSBjb21taXR0ZWQgY29udGFpbmVyIOKAlCBvd25lZCB0aHJvdWdoIGFuZCB0aHJvdWdoLiAqL1xuICBwcml2YXRlIHByaXZhdGVDb3B5T2YodmFsdWU6IG9iamVjdCk6IG9iamVjdCB7XG4gICAgY29uc3QgY29weSA9IHN0cnVjdHVyZWRDbG9uZSh2YWx1ZSk7XG4gICAgYWRvcHQoY29weSwgdGhpcy5vd25lZCk7XG4gICAgdGhpcy5wcml2YXRlVHJlZXMuYWRkKGNvcHkpO1xuICAgIHJldHVybiBjb3B5O1xuICB9XG5cbiAgLyoqXG4gICAqIERpZCBhbnkgc3RhZ2VkIG9wIHRvdWNoIGBwYXRoYCwgb3IgYSBwYXRoIGFib3ZlIG9yIGJlbG93IGl0P1xuICAgKlxuICAgKiBUaGUgZGV2LW1vZGUgYm9ycm93ZWQtcmVhZCBjaGVjayAoYFN0YWdlQ29udGV4dC5jb21taXRgKSBhc2tzIHRoaXMgYmVmb3JlXG4gICAqIGFjY3VzaW5nIGEgc3RhZ2Ugb2YgbXV0YXRpbmcgYSB2YWx1ZSBpbiBwbGFjZTogYSBrZXkgdGhlIHN0YWdlIGxlZ2l0aW1hdGVseVxuICAgKiBXUk9URSBpcyBleHBlY3RlZCB0byBkaWZmZXIgZnJvbSB3aGF0IGl0IHJlYWQsIGFuZCB3cml0ZXMgcmVhY2ggdGhlIGJ1ZmZlclxuICAgKiBmcm9tIHBhdGhzIHRoYXQgYnlwYXNzIHVzZXItbGV2ZWwgd3JpdGUgdHJhY2tpbmcgdG9vICh0aGUgc3ViZmxvdyBzZWVkLFxuICAgKiBgb3V0cHV0TWFwcGVyYCBtZXJnZS1iYWNrLCB0aGUgcmVzdW1lIHJlLXNlZWQpLiBEZXYtbW9kZSBvbmx5IOKAlCBub3RoaW5nIG9uXG4gICAqIHRoZSBob3QgcGF0aCBjYWxscyBpdC5cbiAgICovXG4gIHdhc1N0YWdlZChwYXRoOiAoc3RyaW5nIHwgbnVtYmVyKVtdKTogYm9vbGVhbiB7XG4gICAgY29uc3QgdGFyZ2V0ID0gbm9ybWFsaXNlUGF0aChwYXRoKTtcbiAgICBmb3IgKGNvbnN0IG9wIG9mIHRoaXMub3BUcmFjZSkge1xuICAgICAgLy8gT24gdGhlIHBhdGgsIGJlbG93IGl0IG9yIGFib3ZlIGl0IOKAlCB0aGUgb25lIHBhdGggcmVsYXRpb24gZXZlcnkga2V5IHF1ZXJ5IGFza3MuXG4gICAgICBpZiAocmVsYXRpb24ob3AucGF0aCwgdGFyZ2V0KSAhPT0gdW5kZWZpbmVkKSByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIEZsdXNoIGFsbCBzdGFnZWQgbXV0YXRpb25zIGFuZCByZXR1cm4gdGhlIGNvbW1pdCBidW5kbGUg4oCUIHJlY29yZGluZyB0aGVcbiAgICogc3RhZ2UncyBORVQgQ0hBTkdFLCBub3QgaXRzIHJhdyB3cml0ZSBsb2cuXG4gICAqXG4gICAqIOKUgOKUgCBXSFkgKHRoZSBkZWZlY3QgdGhpcyBmaXhlcykg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gICAqIFByZXZpb3VzbHkgZXZlcnkgYHNldGAvYG1lcmdlYCB3YXMgcmVjb3JkZWQgdmVyYmF0aW0sIHNvIHRoZSBjb21taXQgYnVuZGxlXG4gICAqIHdhcyBhIGxvZyBvZiAqb3BlcmF0aW9ucyogcmF0aGVyIHRoYW4gKmNoYW5nZXMqLiBUd28gb3BlcmF0aW9ucyBwcm9kdWNlIG5vXG4gICAqIG5ldCBjaGFuZ2UgeWV0IHdlcmUgc3RpbGwgY29tbWl0dGVkIGFzIFwibXV0YXRpb25zXCI6XG4gICAqXG4gICAqICAgMS4gTm8tb3Agd3JpdGUgICDigJQgd3JpdGluZyBhIGtleSB0aGUgdmFsdWUgaXQgYWxyZWFkeSBob2xkcyAoZS5nLiBhblxuICAgKiAgICAgICAgICAgICAgICAgICAgICBhZ2VudCBjb250ZXh0IHNsb3QgcmUtZW1pdHRpbmcgaWRlbnRpY2FsIGNvbnRlbnQgZXZlcnlcbiAgICogICAgICAgICAgICAgICAgICAgICAgdHVybikuIGJhc2UgSz0xLCBzdGFnZSB3cml0ZXMgSz0xLlxuICAgKiAgIDIuIFdyaXRlLXJldmVydCAg4oCUIGNoYW5naW5nIHRoZW4gcmVzdG9yaW5nIGEga2V5IHdpdGhpbiBvbmUgc3RhZ2UuXG4gICAqICAgICAgICAgICAgICAgICAgICAgIGJhc2UgSz0xLCBzdGFnZSB3cml0ZXMgSz0yIHRoZW4gSz0xLlxuICAgKlxuICAgKiBSZWNvcmRpbmcgdGhlc2UgYXMgbXV0YXRpb25zIChhKSBibG9hdGVkIGNhdXNhbCBzbGljaW5nIC8gYmFja3RyYWNraW5nIHdpdGhcbiAgICogc3B1cmlvdXMgZGVwZW5kZW5jaWVzIG9uIGludGVybWVkaWF0ZSB2YWx1ZXMgdGhhdCBuZXZlciByZWFjaCBmaW5hbCBzdGF0ZSxcbiAgICogYW5kIChiKSBtYWRlIGRvd25zdHJlYW0gXCJ3aGF0IGNoYW5nZWQgaGVyZT9cIiBjb25zdW1lcnMgbGlnaHQgdXAgc3RhZ2VzIHRoYXRcbiAgICogY2hhbmdlZCBub3RoaW5nIOKAlCBtb3N0IHZpc2libHkgdGhlIGxlbnMgaGlnaGxpZ2h0IGZsYWdnaW5nIGV2ZXJ5IHNsb3QuXG4gICAqXG4gICAqIOKUgOKUgCBIT1cg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gICAqIEF0IGNvbW1pdCB3ZSBob2xkIEJPVEggYGJhc2VTbmFwc2hvdGAgKHN0YXRlIHdoZW4gdGhlIHN0YWdlIGJlZ2FuKSBhbmRcbiAgICogYHdvcmtpbmdDb3B5YCAoc3RhdGUgYWZ0ZXIgYWxsIGl0cyB3cml0ZXMpLiBGb3IgZWFjaCBwYXRoIHRoZSBzdGFnZSB0b3VjaGVkXG4gICAqIHdlIGtlZXAgaXQgaW4gdGhlIGJ1bmRsZSBPTkxZIGlmIGl0cyBmaW5hbCB2YWx1ZSBkaWZmZXJzIGZyb20gdGhlIGJhc2VcbiAgICogdmFsdWUgKHtAbGluayBkZWVwRXF1YWx9KS4gTm8tb3AgQU5EIHdyaXRlLXJldmVydCBwYXRocyBkcm9wIG91dCwgYmVjYXVzZVxuICAgKiBib3RoIGNvbXBhcmUgZXF1YWwgdG8gYmFzZS4gVGhpcyBpcyBhIHNpbmdsZSBuZXQtZGVsdGEgZGlmZiBhdCBjb21taXQgdGltZVxuICAgKiDigJQgb25lIGRlZXAgY29tcGFyZSBwZXIgdG91Y2hlZCBwYXRoLCBPKGNoYW5nZWQgc3RhdGUpLCBwYWlkIG9uY2UgcGVyIHN0YWdlXG4gICAqIChOT1QgcGVyIHdyaXRlKS4gQSBuYWl2ZSBwZXItd3JpdGUgZGVlcC1lcXVhbCBza2lwIHdvdWxkIGJlIG1vcmUgZXhwZW5zaXZlXG4gICAqIGFuZCB3b3VsZCBzdGlsbCBtaXNzIHdyaXRlLXJldmVydCAodGhlIGludGVybWVkaWF0ZSB3cml0ZSBkaWZmZXJzIGZyb20gdGhlXG4gICAqIHZhbHVlIHByZXNlbnQgYXQgdGhlIG1vbWVudCBvZiB3cml0aW5nKS5cbiAgICpcbiAgICog4pSA4pSAIFRXTyBIT05FU1QgVElFUlMgKGJ5IGRlc2lnbiDigJQgZG8gbm90IFwidW5pZnlcIiB0aGVtKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgICogICDigKIgY29tbWl0IChoZXJlKSAgID0gQ0hBTkdFLWxldmVsIOKAlCB0cnV0aGZ1bCBuZXQgZGVsdGEuIEZlZWRzIHRoZSBjb21taXRcbiAgICogICAgICAgICAgICAgICAgICAgICAgIGxvZywgY2F1c2FsIGNoYWluLCBuYXJyYXRpdmUsIGFuZCB0aGUgbGVucyBoaWdobGlnaHQuXG4gICAqICAg4oCiIGBvbldyaXRlYCBldmVudCA9IE9QLWxldmVsIOKAlCBmaXJlcyBvbiBFVkVSWSB3cml0ZSBhdHRlbXB0IHJlZ2FyZGxlc3Mgb2ZcbiAgICogICAgICAgICAgICAgICAgICAgICAgIG5ldCBjaGFuZ2UuIEZlZWRzIG1ldHJpY3MgLyBiZWhhdmlvdXJhbCBvYnNlcnZhYmlsaXR5XG4gICAqICAgICAgICAgICAgICAgICAgICAgICAoYSBkZWJ1Z2dlciB3YW50cyB0byBzZWUgXCJ3cm90ZSAyLCB0aGVuIHJldmVydGVkXCIpLlxuICAgKiBgb25Xcml0ZWAgaXMgdW5jaGFuZ2VkIGJ5IHRoaXMgbWV0aG9kOyBvbmx5IHRoZSBDT01NSVQgYmVjb21lcyBjaGFuZ2Utb25seS5cbiAgICpcbiAgICog4pSA4pSAIEVNUFRZIENPTU1JVFMgQVJFIElOVEVOVElPTkFMIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAgKiBBIHN0YWdlIHRoYXQgbmV0cyBubyBjaGFuZ2UgY29tbWl0cyBhbiBFTVBUWSBwYXRjaCDigJQgTk9UIG5vdGhpbmcuXG4gICAqIHtAbGluayBTdGFnZUNvbnRleHQuY29tbWl0fSBzdGlsbCByZWNvcmRzIHRoZSBidW5kbGUgdW5jb25kaXRpb25hbGx5LCBzb1xuICAgKiBldmVyeSBleGVjdXRlZCBzdGFnZSByZW1haW5zIGEgdGltZS10cmF2ZWwgY3Vyc29yIHN0b3AgKGl0cyBgcnVudGltZVN0YWdlSWRgXG4gICAqIG1hcmtlciBpcyBwcmVzZXJ2ZWQpOyBvbmx5IGl0cyBQQVRDSCBpcyBlbXB0eS4gVGhpcyBpcyB3aGF0IGtlZXBzIHRoZVxuICAgKiBjb21taXQtaW5kZXhlZCBzbGlkZXIgc3RhYmxlIHdoaWxlIG1ha2luZyB0aGUgaGlnaGxpZ2h0IHRydXRoZnVsLlxuICAgKlxuICAgKiDilIDilIAgS05PV04gTElNSVRBVElPTlMgLyBGVVRVUkUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gICAqICAg4oCiIEV4cGxpY2l0IGtleSBERUxFVElPTiB1bmRlciB0aGUgZGVmYXVsdCAnZnVsbCcgbW9kZSBpcyBzdGlsbFxuICAgKiAgICAgZmxhdHRlbmVkIHRvIHNldC1vZi1gdW5kZWZpbmVkYCAoYSByZW1vdmVkIGtleSBjYW5ub3QgYmUgZXhwcmVzc2VkXG4gICAqICAgICBpbiBNZW1vcnlQYXRjaCBhbG9uZSkuIENMT1NFRCB1bmRlciBgY29tbWl0VmFsdWVzOiAnZGVsdGEnYCAoIzEzYy1CKTpcbiAgICogICAgIHtAbGluayBkZWxldGV9IHN0YWdlcyBhIGRpc3RpbmN0IG9wIGFuZCB0aGUgYnVuZGxlIGNhcnJpZXMgYSByZWFsXG4gICAqICAgICBgZGVsZXRlYCB0cmFjZSB2ZXJiIHdob3NlIHJlcGxheSByZW1vdmVzIHRoZSBrZXkuXG4gICAqICAg4oCiIEFycmF5LW1lcmdlIGRlZHVwIGluIHtAbGluayBkZWVwU21hcnRNZXJnZX0gc3RpbGwgdXNlcyByZWZlcmVuY2UgZXF1YWxpdHlcbiAgICogICAgIChgbmV3IFNldGApLCBzbyBkZWVwLWVxdWFsICpvYmplY3RzKiBpbiBhIG1lcmdlZCBhcnJheSBhcmUgbm90IGRlZHVwZWQuXG4gICAqICAgICBPcnRob2dvbmFsIHRvIHRoaXMgY2hhbmdlOyB0cmFja2VkIHNlcGFyYXRlbHkuXG4gICAqXG4gICAqIFJlc2V0cyB0aGUgYnVmZmVyIHRvIGVtcHR5IHN0YXRlIGFmdGVyIGNvbW1pdC5cbiAgICovXG4gIGNvbW1pdCgpOiB7XG4gICAgb3ZlcndyaXRlOiBNZW1vcnlQYXRjaDtcbiAgICB1cGRhdGVzOiBNZW1vcnlQYXRjaDtcbiAgICByZWRhY3RlZFBhdGhzOiBTZXQ8c3RyaW5nPjtcbiAgICB0cmFjZTogVHJhY2VFbnRyeVtdO1xuICB9IHtcbiAgICBjb25zdCByb3dzID0gdGhpcy5jb21taXRWYWx1ZXMgPT09ICdkZWx0YScgPyB0aGlzLnRvRGVsdGFQYXlsb2FkKCkgOiB0aGlzLnRvQ2hhbmdlT25seVBheWxvYWQoKTtcbiAgICBjb25zdCByZWRhY3RlZFBhdGhzID0gdGhpcy5zdXJ2aXZpbmdSZWRhY3RlZFBhdGhzKG5ldyBTZXQocm93cy50cmFjZS5tYXAoKHQpID0+IHQucGF0aCkpKTtcbiAgICAvLyBUaGUgYnVuZGxlJ3Mga2V5IG9yZGVyIGlzIGByZWNvcmRDb21taXRgJ3M7IGEgZGlyZWN0IGNhbGxlciBrZWVwcyB0aGlzIHNhbWUgb3JkZXIuXG4gICAgY29uc3QgcGF5bG9hZCA9IHsgb3ZlcndyaXRlOiByb3dzLm92ZXJ3cml0ZSwgdXBkYXRlczogcm93cy51cGRhdGVzLCByZWRhY3RlZFBhdGhzLCB0cmFjZTogcm93cy50cmFjZSB9O1xuXG4gICAgdGhpcy5vdmVyd3JpdGVQYXRjaCA9IHt9O1xuICAgIHRoaXMudXBkYXRlUGF0Y2ggPSB7fTtcbiAgICB0aGlzLm9wVHJhY2UubGVuZ3RoID0gMDtcbiAgICB0aGlzLnJlZGFjdGVkUGF0aHMuY2xlYXIoKTtcbiAgICB0aGlzLmhlbGRSZWZzLmNsZWFyKCk7XG4gICAgdGhpcy53b3JraW5nQ29weSA9IHt9O1xuICAgIHRoaXMub3duZWQgPSBuZXcgV2Vha1NldCgpO1xuICAgIHRoaXMub3duZWQuYWRkKHRoaXMud29ya2luZ0NvcHkpO1xuICAgIHRoaXMuc3RhZ2VkID0gbmV3IFdlYWtTZXQoKTtcbiAgICB0aGlzLnByaXZhdGVUcmVlcyA9IG5ldyBXZWFrU2V0KCk7XG4gICAgdGhpcy5zdGFnZWRNZXJnZXMgPSAwO1xuICAgIHRoaXMubmVzdGVkT3BzID0gMDtcblxuICAgIHJldHVybiBwYXlsb2FkO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlYnVpbGQgb3ZlcndyaXRlIC8gdXBkYXRlcyAvIHRyYWNlIGtlZXBpbmcgT05MWSBwYXRocyB3aG9zZSBmaW5hbCB2YWx1ZVxuICAgKiBkaWZmZXJzIGZyb20gdGhlIGJhc2UgdmFsdWUg4oCUIGkuZS4gdGhlIHN0YWdlJ3MgbmV0IGNoYW5nZS4gU2VlXG4gICAqIHtAbGluayBUcmFuc2FjdGlvbkJ1ZmZlci5jb21taXR9IGZvciB0aGUgcmF0aW9uYWxlLlxuICAgKlxuICAgKiBQYXRocyBhcmUgY29tcGFyZWQgYXQgdGhlIGV4YWN0IGdyYW51bGFyaXR5IHRoZXkgd2VyZSB3cml0dGVuIChlYWNoIHRyYWNlXG4gICAqIGVudHJ5J3MgcGF0aCksIGFnYWluc3QgYHdvcmtpbmdDb3B5YCAoZmluYWwpIHZzIGBiYXNlU25hcHNob3RgIChzdGFydCkuXG4gICAqIFN1cnZpdmluZyBgc2V0YCBwYXRocyBjb3B5IHRoZWlyIGZpbmFsIHZhbHVlIGZyb20gYG92ZXJ3cml0ZVBhdGNoYDtcbiAgICogc3Vydml2aW5nIGBtZXJnZWAgcGF0aHMgY29weSB0aGVpciBhY2N1bXVsYXRlZCBkZWx0YSBmcm9tIGB1cGRhdGVQYXRjaGAsXG4gICAqIGtlZXBpbmcgdGhlIHNldC12cy1tZXJnZSB2ZXJiIOKAlCBhbmQgdGhlIHJlc3VsdCBpcyBBRE1JVFRFRCAoe0BsaW5rIGFkbWl0fSk6XG4gICAqIGEgZmFtaWx5IG9mIHJvd3Mgd2hvc2UgcmVwbGF5IGRvZXMgbm90IGdpdmUgYmFjayB3aGF0IHRoZSBzdGFnZSByZWFkIGlzXG4gICAqIHJlY29yZGVkIGFzIGBzZXRgIHJvd3Mgb2YgdGhlIHJlYWQtYmFjayBpbnN0ZWFkICg5LjMwLjApLlxuICAgKlxuICAgKiBUaGlzIGlzIHRoZSBERUZBVUxUIChgY29tbWl0VmFsdWVzOiAnZnVsbCdgKSBwYXlsb2FkLCBpbmNsdWRpbmcgdGhlXG4gICAqIGhpc3RvcmljYWwgZmxhdHRlbmluZyBvZiBzdGFnZWQgYGRlbGV0ZWAgb3BzIGludG8gYHNldGAtb2YtYHVuZGVmaW5lZGBcbiAgICogdHJhY2UgZW50cmllcy4gVGhlIGRlbHRhIGVuY29kaW5nIGxpdmVzIGluIHtAbGluayB0b0RlbHRhUGF5bG9hZH0uXG4gICAqXG4gICAqIFdvcmssIG5vdCBieXRlcyAoOS4yMi4xKTogdGhlIG5ldC1jaGFuZ2UgdmVyZGljdCBpcyBwYWlkIG9uY2UgcGVyIFBBVEhcbiAgICogYW5kIHRoZSBjbG9uZSBvbmNlIHBlciBDT05TRUNVVElWRSBydW4gb2Ygb3BzIG9uIGEgcGF0aCwgbm90IG9uY2UgcGVyIG9wXG4gICAqIOKAlCBzZWUgdGhlIHR3byBtZW1vcyBpbnNpZGUuIFBpbm5lZCBieVxuICAgKiB0ZXN0L2xpYi9tZW1vcnkvc2NlbmFyaW8vcmVwZWF0ZWQtcGF0aC1ieXRlLWlkZW50aXR5LnRlc3QudHMgYWdhaW5zdCB0aGVcbiAgICogOS4yMi4wIGJ5dGVzLiBTaW5jZSA5LjIzLjAgdGhhdCBjbG9uZSBpcyBUSEUgY2xvbmU6IHRoZSBwYXRjaCB0cmVlcyBob2xkXG4gICAqIHRoZSBjYWxsZXIncyByZWZlcmVuY2VzIChzZWUgdGhlIGNsYXNzIGhlYWRlciksIHNvIHRoaXMgbG9vcCBpcyB0aGUgb25lXG4gICAqIHBsYWNlIHRoZSByZWNvcmQgaXMgZGV0YWNoZWQgZnJvbSB0aGVtLlxuICAgKi9cbiAgcHJpdmF0ZSB0b0NoYW5nZU9ubHlQYXlsb2FkKCk6IFJvd3Mge1xuICAgIHJldHVybiB0aGlzLmFkbWl0KChsb3NzeSkgPT4gdGhpcy5jaGFuZ2VPbmx5Um93cyhsb3NzeSkpO1xuICB9XG5cbiAgLyoqIFRoZSAnZnVsbCcgcm93czsgYSBmYW1pbHkgaW4gYGxvc3N5YCBpcyB3cml0dGVuIGFzIGl0cyByZWFkLWJhY2ssIGF0IGl0cyBsYXN0IHRvdWNoICh7QGxpbmsgZW1pdFJlYWRCYWNrfSkuICovXG4gIHByaXZhdGUgY2hhbmdlT25seVJvd3MobG9zc3k6IExvc3N5IHwgdW5kZWZpbmVkKTogUm93cyB7XG4gICAgY29uc3Qgcm93czogUm93cyA9IHsgb3ZlcndyaXRlOiB7fSwgdXBkYXRlczoge30sIHRyYWNlOiBbXSB9O1xuICAgIGNvbnN0IHsgb3ZlcndyaXRlLCB1cGRhdGVzLCB0cmFjZSB9ID0gcm93cztcbiAgICAvLyBQZXIgUEFUSCwgZGVjaWRlZCBvbmNlICg5LjIyLjEpOiBiYXNlIGFuZCBmaW5hbCB2YWx1ZSBhcmUgZml4ZWQgYXRcbiAgICAvLyBjb21taXQsIHNvIGV2ZXJ5IGxhdGVyIG9wIG9uIGEgcGF0aCBnZXRzIHRoZSB2ZXJkaWN0IGl0cyBmaXJzdCBvcCBnb3QuXG4gICAgLy8gYHVuZGVmaW5lZGAgPSBub3QgeWV0IGRlY2lkZWQ7IHRoZSBzdXJ2aXZpbmcgcGF0aHMgYXJlIHRoZSBgdHJ1ZWAga2V5cy5cbiAgICBjb25zdCBzdXJ2aXZlcyA9IG5ldyBNYXA8c3RyaW5nLCBib29sZWFuPigpO1xuICAgIC8vIFRoZSBwYXRoIHRoZSBMQVNUIHN1cnZpdmluZyBvcCBjb3BpZWQgaW50byBlYWNoIHBhdGNoIHRyZWUgKDkuMjIuMSkuXG4gICAgLy8gVGhlIHZhbHVlIGF0IGEgcGF0aCBpcyBmaXhlZCBhdCBjb21taXQsIHNvIGFuIG9wIHdob3NlIHByZWRlY2Vzc29yIG9uXG4gICAgLy8gdGhlIFNBTUUgdHJlZSBhbHJlYWR5IGNvcGllZCB0aGF0IHBhdGggd291bGQgd3JpdGUgdGhlIHNhbWUgYnl0ZXMgb3ZlclxuICAgIC8vIHRoZSBzYW1lIGtleSDigJQgaXQga2VlcHMgaXRzIHRyYWNlIHJvdyAodGhlIGxvZyBpcyBieXRlLWlkZW50aWNhbCkgYW5kXG4gICAgLy8gcGF5cyBubyBzZWNvbmQgY2xvbmUuIFRoZSA5LjIyLjAgZWxlbWVudC13cml0ZSBmdW5uZWwgc3RhZ2VzIE5cbiAgICAvLyB3aG9sZS1hcnJheSBzZXRzIG9uIE9ORSBwYXRoOyB0aGlzIGlzIHdoYXQgbWFrZXMgdGhhdCBjb21taXQgTyhOKVxuICAgIC8vIGluc3RlYWQgb2YgTyhOIMOXIG9wcykuIENPTlNFQ1VUSVZFIG9ubHkg4oCUIGFuIG9wIG9uIGFub3RoZXIgcGF0aCBpblxuICAgIC8vIGJldHdlZW4gbWF5IGhhdmUgY29lcmNlZCBvciBncm93biB0aGlzIG9uZSdzIGNvbnRhaW5lciAoYSBkZXNjZW5kYW50XG4gICAgLy8gYG5hdGl2ZVNldGAgdGhyb3VnaCBhIHByaW1pdGl2ZSwgYSBga2V5OiB1bmRlZmluZWRgIHNoZWxsKSBhbmQgdGhlXG4gICAgLy8gcmUtY29weSBpcyB3aGF0IHJlcGFpcnMgaXQ7IGEgYG1lcmdlYCBiZXR3ZWVuIHR3byBzZXRzIHRvdWNoZXMgdGhlXG4gICAgLy8gb3RoZXIgdHJlZSBhbmQgZG9lcyBub3QgY291bnQuIFNhbWUgbGF3IGFzIGBzdXBlcnNlZGVkQnlOZXh0U2V0YC5cbiAgICBsZXQgbGFzdFNldFBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBsZXQgbGFzdE1lcmdlUGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm9wVHJhY2UubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IG9wID0gdGhpcy5vcFRyYWNlW2ldO1xuICAgICAgY29uc3QgZmFtaWx5ID0gbG9zc3k/LmZhbWlsaWVzLmdldChsb3NzeS5yb290T2YuZ2V0KG9wLnBhdGgpIGFzIHN0cmluZyk7XG4gICAgICBpZiAoZmFtaWx5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKGkgPT09IGZhbWlseS5zbG90KSB7XG4gICAgICAgICAgdGhpcy5lbWl0UmVhZEJhY2soZmFtaWx5LCByb3dzLCAnZnVsbCcpO1xuICAgICAgICAgIGxhc3RTZXRQYXRoID0gbGFzdE1lcmdlUGF0aCA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGxldCBrZWVwID0gc3Vydml2ZXMuZ2V0KG9wLnBhdGgpO1xuICAgICAgaWYgKGtlZXAgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBrZWVwID0gdGhpcy5jaGFuZ2VkU2luY2VCYXNlKG9wLnBhdGguc3BsaXQoREVMSU0pKTtcbiAgICAgICAgc3Vydml2ZXMuc2V0KG9wLnBhdGgsIGtlZXApO1xuICAgICAgfVxuICAgICAgaWYgKCFrZWVwKSBjb250aW51ZTsgLy8gbm8tb3Agb3Igd3JpdGUtdGhlbi1yZXZlcnQg4oaSIG5vIG5ldCBjaGFuZ2VcblxuICAgICAgdHJhY2UucHVzaChmbGF0dGVuZWRUcmFjZVJvdyhvcCkpO1xuICAgICAgaWYgKG9wLnZlcmIgPT09ICdtZXJnZScpIHtcbiAgICAgICAgaWYgKGxhc3RNZXJnZVBhdGggPT09IG9wLnBhdGgpIGNvbnRpbnVlO1xuICAgICAgICBsYXN0TWVyZ2VQYXRoID0gb3AucGF0aDtcbiAgICAgICAgY29uc3Qgc2VnbWVudHMgPSBvcC5wYXRoLnNwbGl0KERFTElNKTtcbiAgICAgICAgX3NldCh1cGRhdGVzLCBzZWdtZW50cywgc3RydWN0dXJlZENsb25lKF9nZXQodGhpcy51cGRhdGVQYXRjaCwgc2VnbWVudHMpKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAobGFzdFNldFBhdGggPT09IG9wLnBhdGgpIGNvbnRpbnVlO1xuICAgICAgICBsYXN0U2V0UGF0aCA9IG9wLnBhdGg7XG4gICAgICAgIGNvbnN0IHNlZ21lbnRzID0gb3AucGF0aC5zcGxpdChERUxJTSk7XG4gICAgICAgIF9zZXQob3ZlcndyaXRlLCBzZWdtZW50cywgc3RydWN0dXJlZENsb25lKF9nZXQodGhpcy5vdmVyd3JpdGVQYXRjaCwgc2VnbWVudHMpKSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByb3dzO1xuICB9XG5cbiAgLyoqXG4gICAqIERlbHRhLWVuY29kZWQgcGF5bG9hZCAoYGNvbW1pdFZhbHVlczogJ2RlbHRhJ2AsICMxM2MtQikg4oCUIHNhbWUgbmV0LWNoYW5nZVxuICAgKiBmaWx0ZXIgYXMge0BsaW5rIHRvQ2hhbmdlT25seVBheWxvYWR9LCB0aHJlZSBlbmNvZGluZyBkaWZmZXJlbmNlczpcbiAgICpcbiAgICogMS4gKipPbmUgdHJhY2UgZW50cnkgcGVyIHN1cnZpdmluZyBwYXRoKiogKHRoZSDCpzIuNSBkZWR1cCBydWxlIOKAlCBgYXBwZW5kYFxuICAgKiAgICBpcyBOT1QgaWRlbXBvdGVudCBvbiByZXBsYXksIHNvIGR1cGxpY2F0ZSBlbnRyaWVzIHdvdWxkIG11bHRpcGx5XG4gICAqICAgIHRhaWxzKS4gVGhlIHZlcmIgaXMgcmVzb2x2ZWQgZnJvbSB0aGUgcGF0aCdzIG9wIG1peCArIGJhc2XihpJmaW5hbFxuICAgKiAgICByZWxhdGlvbnNoaXA7IGVudHJpZXMgYXJlIG9yZGVyZWQgYnkgZWFjaCBwYXRoJ3MgTEFTVCB0b3VjaCxcbiAgICogICAgcHJlc2VydmluZyBsYXN0LXdyaXRlci13aW5zIGZvciBuZXN0ZWQvb3ZlcmxhcHBpbmcgcGF0aHMuXG4gICAqIDIuICoqVmVyYiByZXNvbHV0aW9uIHBlciBwYXRoKiog4oCUIGZvciBhIHBhdGggd2l0aCBOTyBzdXJ2aXZpbmcgcmVsYXRpdmVcbiAgICogICAgKHNlZSAzKTpcbiAgICogICAgLSBsYXN0IG9wIGAnZGVsZXRlJ2AgQU5EIGZpbmFsIHZhbHVlIGdvbmUg4oaSIGBkZWxldGVgICh0aGUgcGF0aCBzdGF5c1xuICAgKiAgICAgIGVudW1lcmF0ZWQgaW4gYG92ZXJ3cml0ZWAgd2l0aCBgdW5kZWZpbmVkYCBmb3Iga2V5LXNldCBjb25zdW1lcnMpLlxuICAgKiAgICAgIFJlcXVpcmVzIHRoZSBwYXJlbnQgdG8gYmUgYSByZWFsIGNvbnRhaW5lciBpbiB0aGUgYmFzZSDigJQgcmVwbGF5IHVzZXNcbiAgICogICAgICBgbmF0aXZlRGVsZXRlYCwgd2hpY2ggaXMgaW5lcnQgb24gYSBwcmltaXRpdmUvYWJzZW50IHBhcmVudCwgd2hlcmVhc1xuICAgKiAgICAgIHRoZSBgJ2Z1bGwnYCBmbGF0dGVuaW5nIChgX3NldGAgb2YgYHVuZGVmaW5lZGApIENPRVJDRVMgdGhhdCBwYXJlbnRcbiAgICogICAgICBpbnRvIGFuIG9iamVjdDsgd2hlbiB0aGV5IHdvdWxkIGRpc2FncmVlIHdlIGtlZXAgdGhlIGZsYXR0ZW5pbmc7XG4gICAqICAgIC0gT05MWSBgJ21lcmdlJ2Agb3BzIOKGkiBgbWVyZ2VgIHdpdGggdGhlIGFjY3VtdWxhdGVkIGB1cGRhdGVQYXRjaGBcbiAgICogICAgICBkZWx0YTtcbiAgICogICAgLSBvdGhlcndpc2UgKGBzZXRgL21peGVkKTogdGhlIHZhbHVlIHRoZSBzdGFnZSdzICdmdWxsJyByb3dzIGdpdmUgdGhlXG4gICAqICAgICAgcGF0aCAoe0BsaW5rIGZ1bGxSb3dzVmFsdWV9KS4gSWYgYmFzZSBhbmQgdGhhdCB2YWx1ZSBhcmUgYXJyYXlzIGFuZFxuICAgKiAgICAgIGJhc2UgaXMgYSBTVFJJQ1QgUFJFRklYIOKGkiBgYXBwZW5kYCBzdG9yaW5nIG9ubHkgdGhlIHRhaWw7IGVsc2UgYHNldGBcbiAgICogICAgICBzdG9yaW5nIHRoZSBmdWxsIHZhbHVlLlxuICAgKiAzLiAqKk9WRVJMQVAgRkFNSUxJRVMgdGFrZSB0aGUgZnVsbC12YWx1ZSBmYWxsYmFjay4qKiBgb3ZlcndyaXRlYCAvXG4gICAqICAgIGB1cGRhdGVzYCBhcmUgbmVzdGVkIHBhdGggVFJFRVMsIHNvIHR3byBzdXJ2aXZpbmcgcGF0aHMgd2hlcmUgb25lIGlzXG4gICAqICAgIGFuIGFuY2VzdG9yIG9mIHRoZSBvdGhlciAoYGFgIGFuZCBgYS5wYCkgc2hhcmUgc3RvcmFnZS4gRGVsdGEnc1xuICAgKiAgICBwZXItcGF0aCBlbmNvZGluZ3Mgd291bGQgY2xvYmJlciBlYWNoIG90aGVyIHRoZXJlIChhbiBgYXBwZW5kYFxuICAgKiAgICBhbmNlc3RvciBzdG9yZXMgb25seSBhIFRBSUwsIGEgYGRlbGV0ZWAgYW5jZXN0b3IgYHVuZGVmaW5lZGApLCBzbyBldmVyeVxuICAgKiAgICBwYXRoIHRoYXQgaGFzIGEgc3Vydml2aW5nIGFuY2VzdG9yL2Rlc2NlbmRhbnQgaXMgY29tbWl0dGVkIGFzIGEgcGxhaW5cbiAgICogICAgYHNldGAgb2YgdGhlIHZhbHVlIHRoZSAnZnVsbCcgcm93cyBnaXZlIGl0LCBhbmQgdGhlIGZhbWlseSdzXG4gICAqICAgIHNoYWxsb3dlc3QgcGF0aCAod2hvc2Ugc2V0IGNvdmVycyB0aGUgd2hvbGUgc3VidHJlZSkgaXMgZW1pdHRlZCBMQVNULlxuICAgKlxuICAgKiBUaGUgcmVzdWx0IGlzIEFETUlUVEVEICh7QGxpbmsgYWRtaXR9KSBsaWtlIHRoZSAnZnVsbCcgcGF5bG9hZDogYSBjb21wYWN0XG4gICAqIHJvdyBpcyBrZXB0IG9ubHkgd2hlcmUgdGhlIGJ1bmRsZSBwcm92YWJseSBmb2xkcyBiYWNrLCBhbmQgYSBmYW1pbHkgdGhhdFxuICAgKiBkb2VzIG5vdCBpcyByZWNvcmRlZCBhcyB3aGF0IHRoZSBzdGFnZSByZWFkLiBTbyBib3RoIGVuY29kaW5ncyBjb21taXQgdGhlXG4gICAqIHZhbHVlIHRoZSBzdGFnZSByZWFkOyBiZWZvcmUgOS4zMC4wIHRoZXkgc2hhcmVkIGEgcmVwbGF5IHRoYXQgZGlkIG5vdFxuICAgKiAoYHJlcGxheVBhdGhWZXJic2AgLyBgcmVwbGF5RmFtaWx5VmVyYnNgLCBkZWxldGVkKS5cbiAgICovXG4gIHByaXZhdGUgdG9EZWx0YVBheWxvYWQoKTogUm93cyB7XG4gICAgY29uc3QgZnVsbFZhbHVlQXQgPSB0aGlzLmZ1bGxSb3dzVmFsdWUoKTtcbiAgICByZXR1cm4gdGhpcy5hZG1pdCgobG9zc3kpID0+IHRoaXMuZGVsdGFSb3dzKGxvc3N5LCBmdWxsVmFsdWVBdCkpO1xuICB9XG5cbiAgLyoqIFRoZSBkZWx0YSByb3dzOyBhIGZhbWlseSBpbiBgbG9zc3lgIGlzIHdyaXR0ZW4gYXMgaXRzIHJlYWQtYmFjaywgYXQgaXRzIGxhc3QgdG91Y2ggKHtAbGluayBlbWl0UmVhZEJhY2t9KS4gKi9cbiAgcHJpdmF0ZSBkZWx0YVJvd3MobG9zc3k6IExvc3N5IHwgdW5kZWZpbmVkLCBmdWxsVmFsdWVBdDogKHNlZ21lbnRzOiBzdHJpbmdbXSkgPT4gdW5rbm93bik6IFJvd3Mge1xuICAgIGNvbnN0IHJvd3M6IFJvd3MgPSB7IG92ZXJ3cml0ZToge30sIHVwZGF0ZXM6IHt9LCB0cmFjZTogW10gfTtcbiAgICBjb25zdCB7IG92ZXJ3cml0ZSwgdXBkYXRlcywgdHJhY2UgfSA9IHJvd3M7XG4gICAgY29uc3QgaW5Mb3NzeSA9IChwYXRoOiBzdHJpbmcpID0+IGxvc3N5Py5mYW1pbGllcy5oYXMobG9zc3kucm9vdE9mLmdldChwYXRoKSBhcyBzdHJpbmcpID09PSB0cnVlO1xuICAgIGNvbnN0IHN1cnZpdm9ycyA9IHRoaXMubmV0Q2hhbmdlU3Vydml2b3JzKHRoaXMub3BzQnlQYXRoKCkpLmZpbHRlcigocykgPT4gIWluTG9zc3kocy5wYXRoKSk7XG4gICAgY29uc3QgeyByb290T2YsIGJ5Um9vdCB9ID0gZ3JvdXBJbnRvRmFtaWxpZXMoc3Vydml2b3JzLCBuZXcgU2V0KHN1cnZpdm9ycy5tYXAoKHMpID0+IHMucGF0aCkpKTtcblxuICAgIC8vIFRIRSBWRVJCIENIT0lDRSDigJQgdGhlIGRlbHRhIGVuY29kZXIgcGlja3MgYSB2ZXJiIHBlciBwYXRoOyB0aGUgVkFMVUVTXG4gICAgLy8gaXQgZW5jb2RlcyBjb21lIGZyb20gdGhlIG9uZSByZXBsYXkgKGBmdWxsVmFsdWVBdGApLCBuZXZlciBhIHJlcGxpY2Egb2ZcbiAgICAvLyB0aGUgdmVyYiBsYXcgKDkuMzAuMDogQ0xBVURFLm1kJ3MgdmVyYi1zd2l0Y2ggcmVwbGljYXMgbG9zdCB0d28gaGVyZSkuXG4gICAgY29uc3QgZW1pdCA9IChzOiBTdXJ2aXZvcik6IHZvaWQgPT4ge1xuICAgICAgY29uc3QgeyBwYXRoLCBzZWdtZW50cywgdmVyYnMsIGJlZm9yZSB9ID0gcztcbiAgICAgIGNvbnN0IHByb3YgPSBwcm92ZW5hbmNlKHMucmVhZEtleXMpO1xuICAgICAgaWYgKChieVJvb3QuZ2V0KHJvb3RPZi5nZXQocGF0aCkgYXMgc3RyaW5nKSBhcyBTdXJ2aXZvcltdKS5sZW5ndGggPiAxKSB7XG4gICAgICAgIC8vIFJ1bGUgMyDigJQgb25lIGNvaGVyZW50IHRyZWU6IGV2ZXJ5IG1lbWJlciBhIHNldCBvZiBpdHMgdmFsdWUuXG4gICAgICAgIHRyYWNlLnB1c2goeyBwYXRoLCB2ZXJiOiAnc2V0JywgLi4ucHJvdiB9KTtcbiAgICAgICAgX3NldChvdmVyd3JpdGUsIHNlZ21lbnRzLCBzdHJ1Y3R1cmVkQ2xvbmUoZnVsbFZhbHVlQXQoc2VnbWVudHMpKSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGxhc3RWZXJiID0gdmVyYnNbdmVyYnMubGVuZ3RoIC0gMV07XG4gICAgICBpZiAobGFzdFZlcmIgPT09ICdkZWxldGUnICYmIHMuYWZ0ZXIgPT09IHVuZGVmaW5lZCAmJiB0aGlzLmRlbGV0ZVJlcGxheXNBc0ZsYXR0ZW5pbmcoc2VnbWVudHMpKSB7XG4gICAgICAgIC8vIFJlYWwgZGVsZXRpb24g4oCUIHJlcGxheSByZW1vdmVzIHRoZSBrZXkuIEtlZXAgdGhlIHBhdGggZW51bWVyYXRlZFxuICAgICAgICAvLyBpbiBgb3ZlcndyaXRlYCAodW5kZWZpbmVkKSBzbyBPYmplY3Qua2V5cyBjb25zdW1lcnMgc2VlIGl0LlxuICAgICAgICB0cmFjZS5wdXNoKHsgcGF0aCwgdmVyYjogJ2RlbGV0ZScsIC4uLnByb3YgfSk7XG4gICAgICAgIF9zZXQob3ZlcndyaXRlLCBzZWdtZW50cywgdW5kZWZpbmVkKTtcbiAgICAgIH0gZWxzZSBpZiAodmVyYnMuZXZlcnkoKHYpID0+IHYgPT09ICdtZXJnZScpKSB7XG4gICAgICAgIHRyYWNlLnB1c2goeyBwYXRoLCB2ZXJiOiAnbWVyZ2UnLCAuLi5wcm92IH0pO1xuICAgICAgICBfc2V0KHVwZGF0ZXMsIHNlZ21lbnRzLCBzdHJ1Y3R1cmVkQ2xvbmUoX2dldCh0aGlzLnVwZGF0ZVBhdGNoLCBzZWdtZW50cykpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHB1c2hWYWx1ZVJvdyhyb3dzLCBwYXRoLCBzZWdtZW50cywgYmVmb3JlLCBmdWxsVmFsdWVBdChzZWdtZW50cyksIHByb3YsIHRoaXMubWFya2VkQmVsb3cocGF0aCkpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvLyBBIGZhbWlseSB0aGF0IGRpZCBub3QgZm9sZCBiYWNrIHRha2VzIGl0cyBwbGFjZSBieSBpdHMgbGFzdCB0b3VjaC5cbiAgICBjb25zdCBwZW5kaW5nID0gbG9zc3kgPT09IHVuZGVmaW5lZCA/IFtdIDogWy4uLmxvc3N5LmZhbWlsaWVzLnZhbHVlcygpXS5zb3J0KChhLCBiKSA9PiBhLnNsb3QgLSBiLnNsb3QpO1xuICAgIGxldCBuZXh0ID0gMDtcbiAgICBjb25zdCBmbHVzaEJlZm9yZSA9ICh0b3VjaDogbnVtYmVyKTogdm9pZCA9PiB7XG4gICAgICB3aGlsZSAobmV4dCA8IHBlbmRpbmcubGVuZ3RoICYmIHBlbmRpbmdbbmV4dF0uc2xvdCA8IHRvdWNoKSB0aGlzLmVtaXRSZWFkQmFjayhwZW5kaW5nW25leHQrK10sIHJvd3MsICdkZWx0YScpO1xuICAgIH07XG4gICAgZW1pdEluRmFtaWx5T3JkZXIoc3Vydml2b3JzLCByb290T2YsIGJ5Um9vdCwgZW1pdCwgZmx1c2hCZWZvcmUpO1xuICAgIGZsdXNoQmVmb3JlKEluZmluaXR5KTtcbiAgICByZXR1cm4gcm93cztcbiAgfVxuXG4gIC8vIOKUgOKUgCBUaGUgYWRtaXR0ZWQgcmVjb3JkICg5LjMwLjApIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKlxuICAgKiBUSEUgQURNSVNTSU9OIOKAlCBhIGNvbW1pdCBpcyBhZG1pdHRlZCBvbmx5IGlmIGl0cyBidW5kbGUgZm9sZHMgYmFjayB0byB0aGVcbiAgICogc3RhZ2UncyByZWFkLXlvdXItd3JpdGVzIHZpZXcgYXQgZXZlcnkgcGF0aCB0aGUgc3RhZ2UgdG91Y2hlZC4gYGJ1aWxkYFxuICAgKiBsYXlzIHRoZSByb3dzIG91dCAob25lIGVuY29kZXI6IGAnZnVsbCdgIG9yIGAnZGVsdGEnYCk7IHRoZSBjYW5kaWRhdGUgaXNcbiAgICogY2hlY2tlZCAoe0BsaW5rIGxvc3N5RmFtaWxpZXN9KSwgYW5kIHdoZW4gc29tZSBmYW1pbHkncyByb3dzIGRvIG5vdCBmb2xkXG4gICAqIGJhY2sgdGhlIHJvd3MgYXJlIGxhaWQgb3V0IGFnYWluIHdpdGggdGhvc2UgZmFtaWxpZXMgd3JpdHRlbiBhcyB3aGF0IHRoZVxuICAgKiBzdGFnZSByZWFkICh7QGxpbmsgZW1pdFJlYWRCYWNrfSkg4oCUIGV2ZXJ5IG90aGVyIGZhbWlseSdzIGJ5dGVzIGV4YWN0bHkgYXNcbiAgICogdGhlIGZpcnN0IGxheW91dCBtYWRlIHRoZW0uXG4gICAqL1xuICBwcml2YXRlIGFkbWl0KGJ1aWxkOiAobG9zc3k6IExvc3N5IHwgdW5kZWZpbmVkKSA9PiBSb3dzKTogUm93cyB7XG4gICAgY29uc3QgY2FuZGlkYXRlID0gYnVpbGQodW5kZWZpbmVkKTtcbiAgICBjb25zdCBsb3NzeSA9IHRoaXMubG9zc3lGYW1pbGllcyhjYW5kaWRhdGUpO1xuICAgIHJldHVybiBsb3NzeSA9PT0gdW5kZWZpbmVkID8gY2FuZGlkYXRlIDogYnVpbGQobG9zc3kpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBmYW1pbGllcyB3aG9zZSByb3dzIGRvIG5vdCBmb2xkIGJhY2sgdG8gd2hhdCB0aGUgc3RhZ2UgcmVhZCDigJRcbiAgICogYHVuZGVmaW5lZGAgd2hlbiB0aGVyZSBhcmUgbm9uZSAoYGFkbWlzc2lvbi50cyDCtyBsb3NzeUZhbWlsaWVzYDogdGhlXG4gICAqIGNhbmRpZGF0ZSByZXBsYXllZCBvbnRvIHRoZSBkaWZmIGJhc2UgYnkgYGRyeUZvbGRgLCBldmVyeSBmYW1pbHkgb2ZcbiAgICogdG91Y2hlZCBwYXRocyBjb21wYXJlZCB3aXRoIHRoZSB3b3JraW5nIGNvcHkgYXQgaXRzIHJvb3QgYW5kIG9uIHRoZSB3YXlcbiAgICogZG93biB0byBpdCkuXG4gICAqXG4gICAqIFdpdGhvdXQgYSBmb2xkLCB3aGVuIHRoZSBzdGFnZSBzdGFnZWQgbm8gYG1lcmdlYCBhbmQgbm8gbmVzdGVkIG9wOiBpdHNcbiAgICogcm93cyBhcmUgYHNldGAgLyBgZGVsZXRlYCBvZiBrZXlzIGRpcmVjdGx5IHVuZGVyIGl0cyBhZGRyZXNzLCBlYWNoXG4gICAqIHdyaXRpbmcgdGhlIFNBTUUgdmFsdWUgaW50byBgd29ya2luZ0NvcHlgIGFuZCBgb3ZlcndyaXRlUGF0Y2hgIOKAlCB0aGVcbiAgICogcmVjb3JkIGlzIHRoZSByZWFkLWJhY2sgYnkgY29uc3RydWN0aW9uICh0aGUgcHJvcGVydHkncyBST09ULU9OTFkgYXJtXG4gICAqIHBpbnMgdGhpcykuIFRoYXQga2VlcHMgdGhlIGNvbW1pdCBvZiB0aGUgdHlwZWQgc2NvcGUncyByb290LWtleSB3cml0ZXNcbiAgICogZXhhY3RseSBhcyBjaGVhcCBhcyBpdCB3YXMuXG4gICAqL1xuICBwcml2YXRlIGxvc3N5RmFtaWxpZXMoY2FuZGlkYXRlOiBSb3dzKTogTG9zc3kgfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLnN0YWdlZE1lcmdlcyA9PT0gMCAmJiB0aGlzLm5lc3RlZE9wcyA9PT0gMCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICByZXR1cm4gbG9zc3lGYW1pbGllcyhjYW5kaWRhdGUsIHRoaXMuYmFzZVNuYXBzaG90LCB0aGlzLndvcmtpbmdDb3B5LCB0aGlzLm9wVHJhY2UsIHRoaXMuYWRkcmVzcyk7XG4gIH1cblxuICAvKipcbiAgICogQSBmYW1pbHkgd2hvc2Ugcm93cyBkaWQgbm90IGZvbGQgYmFjaywgd3JpdHRlbiBhcyB3aGF0IHRoZSBzdGFnZSByZWFkOlxuICAgKiBvbmUgYHNldGAgcm93IHBlciBtZW1iZXIgdGhhdCBjaGFuZ2VkIChkZXNjZW5kYW50cyBieSBsYXN0IHRvdWNoLCBlYWNoXG4gICAqIHdpdGggaXRzIG93biByZWFkIHByZWZpeCksIHRoZSBST09UIGxhc3QsIGFuZCB0aGUgcm9vdCdzIHJlYWQtYmFjayB2YWx1ZVxuICAgKiBpbiBgb3ZlcndyaXRlYCDigJQgb25lIGNvaGVyZW50IHRyZWUsIHNvIG5vIHJvdyBjYW4gY2xvYmJlciBhbm90aGVyLiBUaGVcbiAgICogcm9vdCdzIHJvdyBpcyB3cml0dGVuIGV2ZW4gd2hlbiB0aGUgcm9vdCBpdHNlbGYgZGlkIG5vdCBjaGFuZ2U6IGl0IGlzIHRoZVxuICAgKiByb3cgdGhhdCBjYXJyaWVzIHRoZSBmYW1pbHkncyByZWFkLWJhY2sgKGFuZCB0aGUgY29udGFpbmVycyBMLTEncyBkcm9wcGVkXG4gICAqIG9wIGxlZnQpLiBBIGxvbmUgcm9vdCB1bmRlciBgJ2RlbHRhJ2Aga2VlcHMgdGhlIGNvbXBhY3QgYGFwcGVuZGAgd2hlbiB0aGVcbiAgICogdmFsdWUgaXQgcmVhZCBpcyBpdHMgYmFzZSBwbHVzIGEgdGFpbC5cbiAgICovXG4gIHByaXZhdGUgZW1pdFJlYWRCYWNrKGZhbWlseTogRmFtaWx5LCByb3dzOiBSb3dzLCBlbmNvZGluZzogQ29tbWl0VmFsdWVzTW9kZSk6IHZvaWQge1xuICAgIGxldCByb290OiBNZW1iZXIgPSBmYW1pbHkubWVtYmVyc1swXTtcbiAgICBsZXQgY2hhbmdlZCA9IDA7XG4gICAgZm9yIChjb25zdCBtIG9mIGZhbWlseS5tZW1iZXJzKSB7XG4gICAgICBpZiAobS5wYXRoID09PSBmYW1pbHkucm9vdCkge1xuICAgICAgICByb290ID0gbTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoIXRoaXMuY2hhbmdlZFNpbmNlQmFzZShtLnBhdGguc3BsaXQoREVMSU0pKSkgY29udGludWU7XG4gICAgICByb3dzLnRyYWNlLnB1c2goeyBwYXRoOiBtLnBhdGgsIHZlcmI6ICdzZXQnLCAuLi5wcm92ZW5hbmNlKG0ucmVhZEtleXMpIH0pO1xuICAgICAgY2hhbmdlZCsrO1xuICAgIH1cbiAgICBjb25zdCBhZnRlciA9IF9nZXQodGhpcy53b3JraW5nQ29weSwgZmFtaWx5LnJvb3RTZWdtZW50cyk7XG4gICAgaWYgKGVuY29kaW5nID09PSAnZGVsdGEnICYmIGNoYW5nZWQgPT09IDAgJiYgYWZ0ZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgYmVmb3JlID0gX2dldCh0aGlzLmJhc2VTbmFwc2hvdCwgZmFtaWx5LnJvb3RTZWdtZW50cyk7XG4gICAgICBwdXNoVmFsdWVSb3coXG4gICAgICAgIHJvd3MsXG4gICAgICAgIGZhbWlseS5yb290LFxuICAgICAgICBmYW1pbHkucm9vdFNlZ21lbnRzLFxuICAgICAgICBiZWZvcmUsXG4gICAgICAgIGFmdGVyLFxuICAgICAgICBwcm92ZW5hbmNlKHJvb3QucmVhZEtleXMpLFxuICAgICAgICB0aGlzLm1hcmtlZEJlbG93KGZhbWlseS5yb290KSxcbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHJvd3MudHJhY2UucHVzaCh7IHBhdGg6IGZhbWlseS5yb290LCB2ZXJiOiAnc2V0JywgLi4ucHJvdmVuYW5jZShyb290LnJlYWRLZXlzKSB9KTtcbiAgICAvLyBUaGUgY2xvbmUgdGhlIGNoZWNrIHRvb2sgKGBhZG1pc3Npb24udHMgwrcgZm9sZHNCYWNrYCksIHdoZW4gaXQgdG9vayBvbmUuXG4gICAgX3NldChyb3dzLm92ZXJ3cml0ZSwgZmFtaWx5LnJvb3RTZWdtZW50cywgZmFtaWx5LmhlbGQgIT09IHVuZGVmaW5lZCA/IGZhbWlseS5oZWxkLnZhbHVlIDogc3RydWN0dXJlZENsb25lKGFmdGVyKSk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHZhbHVlIHRoZSBzdGFnZSdzICdmdWxsJyByb3dzIGdpdmUgYSBwYXRoIOKAlCB3aGF0IHRoZSBkZWx0YSBlbmNvZGVyXG4gICAqIGNvbW1pdHMgZm9yIGEgZmFtaWx5IG1lbWJlciBvciBhIHBhdGggd2l0aCBhIGBzZXRgIOKAlCByZWFkIGZyb20gT05FXG4gICAqIHtAbGluayBkcnlGb2xkfSBvZiB0aG9zZSByb3dzIG92ZXIgdGhlIHBhdGNoIHRyZWVzIHRoZW1zZWx2ZXMsIHRha2VuIHRoZVxuICAgKiBmaXJzdCB0aW1lIGl0IGlzIGFza2VkLiBCeSByZWZlcmVuY2UsIGFzIHRoZSBzdGFnZSBoZWxkIHRoZW06IGFuIGVsZW1lbnRcbiAgICogYSBgc2V0YCBhbmQgYSBgbWVyZ2VgIG9mIG9uZSBwYXRoIHNoYXJlIHN0YXlzIG9uZSBlbGVtZW50LiBBIHN0YWdlIHRoYXRcbiAgICogc3RhZ2VkIG5vIGBtZXJnZWAgYW5kIG5vIG5lc3RlZCBvcCBuZWVkcyBubyBmb2xkIOKAlCBhIHBhdGgncyB2YWx1ZSBpcyBpdHNcbiAgICogbGFzdCBzdGFnZWQgdmFsdWUuIChCZWZvcmUgOS4zMC4wOiB0d28gcmVwbGljYXMgb2YgdGhlIHZlcmIgbGF3LFxuICAgKiBgcmVwbGF5UGF0aFZlcmJzYCBhbmQgYHJlcGxheUZhbWlseVZlcmJzYC4pXG4gICAqL1xuICBwcml2YXRlIGZ1bGxSb3dzVmFsdWUoKTogKHNlZ21lbnRzOiBzdHJpbmdbXSkgPT4gdW5rbm93biB7XG4gICAgaWYgKHRoaXMuc3RhZ2VkTWVyZ2VzID09PSAwICYmIHRoaXMubmVzdGVkT3BzID09PSAwKSByZXR1cm4gKHNlZ21lbnRzKSA9PiBfZ2V0KHRoaXMub3ZlcndyaXRlUGF0Y2gsIHNlZ21lbnRzKTtcbiAgICBsZXQgZm9sZDogdW5rbm93bjtcbiAgICByZXR1cm4gKHNlZ21lbnRzKSA9PiB7XG4gICAgICBmb2xkID8/PSBkcnlGb2xkKHRoaXMuYmFzZVNuYXBzaG90LCB0aGlzLnVwZGF0ZVBhdGNoLCB0aGlzLm92ZXJ3cml0ZVBhdGNoLCB0aGlzLmZ1bGxSb3dzKCkpO1xuICAgICAgcmV0dXJuIF9nZXQoZm9sZCwgc2VnbWVudHMpO1xuICAgIH07XG4gIH1cblxuICAvKiogVGhlIHN0YWdlJ3MgJ2Z1bGwnIHJvd3M6IGV2ZXJ5IG9wIG9uIGEgcGF0aCB0aGUgbmV0LWNoYW5nZSBmaWx0ZXIga2VlcHMsIGEgYGRlbGV0ZWAgc3BlbGxlZCBgc2V0YC4gKi9cbiAgcHJpdmF0ZSBmdWxsUm93cygpOiBUcmFjZUVudHJ5W10ge1xuICAgIGNvbnN0IGtlZXAgPSBuZXcgTWFwPHN0cmluZywgYm9vbGVhbj4oKTtcbiAgICBjb25zdCByb3dzOiBUcmFjZUVudHJ5W10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IG9wIG9mIHRoaXMub3BUcmFjZSkge1xuICAgICAgbGV0IGsgPSBrZWVwLmdldChvcC5wYXRoKTtcbiAgICAgIGlmIChrID09PSB1bmRlZmluZWQpIGtlZXAuc2V0KG9wLnBhdGgsIChrID0gdGhpcy5jaGFuZ2VkU2luY2VCYXNlKG9wLnBhdGguc3BsaXQoREVMSU0pKSkpO1xuICAgICAgaWYgKGspIHJvd3MucHVzaCh7IHBhdGg6IG9wLnBhdGgsIHZlcmI6IG9wLnZlcmIgPT09ICdtZXJnZScgPyAnbWVyZ2UnIDogJ3NldCcgfSk7XG4gICAgfVxuICAgIHJldHVybiByb3dzO1xuICB9XG5cbiAgLyoqXG4gICAqIERpZCB0aGUgc3RhZ2UgY2hhbmdlIHRoZSB2YWx1ZSBhdCBgc2VnbWVudHNgPyBCYXNlIGFuZCBmaW5hbCB2YWx1ZSBhcmVcbiAgICogZml4ZWQgYXQgY29tbWl0LCBzbyB0aGlzIGlzIHRoZSBPTkUgbmV0LWNoYW5nZSB2ZXJkaWN0IGJvdGggcGF5bG9hZFxuICAgKiBlbmNvZGluZ3MgYXBwbHkgKGEgbm8tb3Agd3JpdGUgYW5kIGEgd3JpdGUtdGhlbi1yZXZlcnQgYm90aCBmYWlsIGl0KS5cbiAgICovXG4gIHByaXZhdGUgY2hhbmdlZFNpbmNlQmFzZShzZWdtZW50czogc3RyaW5nW10pOiBib29sZWFuIHtcbiAgICByZXR1cm4gIWRlZXBFcXVhbChfZ2V0KHRoaXMuYmFzZVNuYXBzaG90LCBzZWdtZW50cyksIF9nZXQodGhpcy53b3JraW5nQ29weSwgc2VnbWVudHMpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXRoIOKGkiBpdHMgb3AtdmVyYiBzZXF1ZW5jZSwgb3JkZXJlZCBieSBMQVNUIHRvdWNoIChkZWxldGUgKyByZS1pbnNlcnRcbiAgICogbW92ZXMgYSByZS10b3VjaGVkIHBhdGggdG8gdGhlIGVuZCBvZiB0aGUgTWFwJ3MgaW5zZXJ0aW9uIG9yZGVyIOKAlFxuICAgKiBwcmVzZXJ2aW5nIGxhc3Qtd3JpdGVyLXdpbnMgZm9yIG5lc3RlZC9vdmVybGFwcGluZyBwYXRocykuIFBlci13cml0ZVxuICAgKiBwcm92ZW5hbmNlICgjUDEpOiB0aGUgTEFTVCBvcCdzIHJlYWRLZXlzIGlzIGtlcHQg4oCUIHJlYWQgcHJlZml4ZXMgb25seSBncm93XG4gICAqIHdpdGhpbiBhIHN0YWdlLCBzbyBsYXN0ID09IHVuaW9uIGFjcm9zcyB0aGUgcGF0aC5cbiAgICovXG4gIHByaXZhdGUgb3BzQnlQYXRoKCk6IE1hcDxzdHJpbmcsIHsgdmVyYnM6IE9wVmVyYltdOyByZWFkS2V5cz86IHN0cmluZ1tdOyBsYXN0OiBudW1iZXIgfT4ge1xuICAgIGNvbnN0IGJ5UGF0aCA9IG5ldyBNYXA8c3RyaW5nLCB7IHZlcmJzOiBPcFZlcmJbXTsgcmVhZEtleXM/OiBzdHJpbmdbXTsgbGFzdDogbnVtYmVyIH0+KCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm9wVHJhY2UubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IG9wID0gdGhpcy5vcFRyYWNlW2ldO1xuICAgICAgY29uc3QgcHJldiA9IGJ5UGF0aC5nZXQob3AucGF0aCk7XG4gICAgICBpZiAocHJldikge1xuICAgICAgICBwcmV2LnZlcmJzLnB1c2gob3AudmVyYik7XG4gICAgICAgIHByZXYubGFzdCA9IGk7XG4gICAgICAgIGlmIChvcC5yZWFkS2V5cyAhPT0gdW5kZWZpbmVkKSBwcmV2LnJlYWRLZXlzID0gb3AucmVhZEtleXM7XG4gICAgICAgIGJ5UGF0aC5kZWxldGUob3AucGF0aCk7XG4gICAgICAgIGJ5UGF0aC5zZXQob3AucGF0aCwgcHJldik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBieVBhdGguc2V0KG9wLnBhdGgsIHtcbiAgICAgICAgICB2ZXJiczogW29wLnZlcmJdLFxuICAgICAgICAgIGxhc3Q6IGksXG4gICAgICAgICAgLi4uKG9wLnJlYWRLZXlzICE9PSB1bmRlZmluZWQgJiYgeyByZWFkS2V5czogb3AucmVhZEtleXMgfSksXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYnlQYXRoO1xuICB9XG5cbiAgLyoqIFRoZSBuZXQtY2hhbmdlIGZpbHRlciDigJQgaWRlbnRpY2FsIHRvICdmdWxsJyAoe0BsaW5rIGNoYW5nZWRTaW5jZUJhc2V9KS4gU3Vydml2b3JzIGtlZXAgbGFzdC10b3VjaCBvcmRlci4gKi9cbiAgcHJpdmF0ZSBuZXRDaGFuZ2VTdXJ2aXZvcnMoYnlQYXRoOiBNYXA8c3RyaW5nLCB7IHZlcmJzOiBPcFZlcmJbXTsgcmVhZEtleXM/OiBzdHJpbmdbXTsgbGFzdDogbnVtYmVyIH0+KTogU3Vydml2b3JbXSB7XG4gICAgY29uc3Qgc3Vydml2b3JzOiBTdXJ2aXZvcltdID0gW107XG4gICAgZm9yIChjb25zdCBbcGF0aCwgeyB2ZXJicywgcmVhZEtleXMsIGxhc3QgfV0gb2YgYnlQYXRoKSB7XG4gICAgICBjb25zdCBzZWdtZW50cyA9IHBhdGguc3BsaXQoREVMSU0pO1xuICAgICAgaWYgKCF0aGlzLmNoYW5nZWRTaW5jZUJhc2Uoc2VnbWVudHMpKSBjb250aW51ZTsgLy8gbm8tb3Agb3Igd3JpdGUtdGhlbi1yZXZlcnQg4oaSIG5vIG5ldCBjaGFuZ2VcbiAgICAgIGNvbnN0IGJlZm9yZSA9IF9nZXQodGhpcy5iYXNlU25hcHNob3QsIHNlZ21lbnRzKTtcbiAgICAgIGNvbnN0IGFmdGVyID0gX2dldCh0aGlzLndvcmtpbmdDb3B5LCBzZWdtZW50cyk7XG4gICAgICBzdXJ2aXZvcnMucHVzaCh7IHBhdGgsIHNlZ21lbnRzLCB2ZXJicywgcmVhZEtleXMsIGxhc3QsIGJlZm9yZSwgYWZ0ZXIgfSk7XG4gICAgfVxuICAgIHJldHVybiBzdXJ2aXZvcnM7XG4gIH1cblxuICAvKipcbiAgICogTWF5IGEgc3RhZ2VkIGBkZWxldGVgIGF0IHRoaXMgcGF0aCBjb21taXQgYXMgdGhlIGAnZGVsZXRlJ2AgdmVyYj9cbiAgICpcbiAgICogT25seSB3aGVuIHJlbW92aW5nIHRoZSBrZXkgYW5kIHRoZSBgJ2Z1bGwnYCBtb2RlJ3MgZmxhdHRlbmluZyAoYF9zZXRgIG9mXG4gICAqIGB1bmRlZmluZWRgKSBsYW5kIGluIHRoZSBzYW1lIHBsYWNlLiBUaGV5IGRpdmVyZ2Ugd2hlbiB0aGUgcGFyZW50IGlzIG5vdFxuICAgKiBhIGNvbnRhaW5lcjogYG5hdGl2ZURlbGV0ZWAgd2Fsa3MgYXdheSB1bnRvdWNoZWQsIHdoaWxlIGBuYXRpdmVTZXRgXG4gICAqIENPRVJDRVMgdGhlIHByaW1pdGl2ZSBwYXJlbnQgaW50byBhbiBvYmplY3QgdG8gaG9sZCB0aGUga2V5LiBDb21taXR0aW5nXG4gICAqIGBkZWxldGVgIHRoZXJlIHdvdWxkIHNpbGVudGx5IGRyb3AgYSBzdGF0ZSBjaGFuZ2UgdGhlIHN0YWdlIHJlYWxseSBtYWRlLFxuICAgKiBzbyB0aG9zZSAocGF0aG9sb2dpY2FsKSBkZWxldGVzIGtlZXAgdGhlIGhpc3RvcmljYWwgZmxhdHRlbmluZy5cbiAgICovXG4gIHByaXZhdGUgZGVsZXRlUmVwbGF5c0FzRmxhdHRlbmluZyhzZWdtZW50czogc3RyaW5nW10pOiBib29sZWFuIHtcbiAgICBpZiAoc2VnbWVudHMubGVuZ3RoID09PSAxKSByZXR1cm4gdHJ1ZTsgLy8gcGFyZW50IGlzIHRoZSBzdGF0ZSByb290IOKAlCBhbHdheXMgYSBjb250YWluZXJcbiAgICBjb25zdCBwYXJlbnQgPSBfZ2V0KHRoaXMuYmFzZVNuYXBzaG90LCBzZWdtZW50cy5zbGljZSgwLCAtMSkpO1xuICAgIHJldHVybiBwYXJlbnQgIT09IG51bGwgJiYgdHlwZW9mIHBhcmVudCA9PT0gJ29iamVjdCc7XG4gIH1cbn1cblxuLyoqXG4gKiBIaXN0b3JpY2FsIGZsYXR0ZW5pbmcgZm9yIHRoZSBgJ2Z1bGwnYCBwYXlsb2FkOiBhbiBleHBsaWNpdCBkZWxldGUgY29tbWl0c1xuICogYXMgc2V0LW9mLXVuZGVmaW5lZC4gUGVyLXdyaXRlIHByb3ZlbmFuY2UgKCNQMSkgcmlkZXMgZWFjaCBzdXJ2aXZpbmcgZW50cnlcbiAqIHVudG91Y2hlZC5cbiAqL1xuZnVuY3Rpb24gZmxhdHRlbmVkVHJhY2VSb3cob3A6IHsgcGF0aDogc3RyaW5nOyB2ZXJiOiBPcFZlcmI7IHJlYWRLZXlzPzogc3RyaW5nW10gfSk6IFRyYWNlRW50cnkge1xuICByZXR1cm4gb3AudmVyYiA9PT0gJ2RlbGV0ZSdcbiAgICA/IHsgcGF0aDogb3AucGF0aCwgdmVyYjogJ3NldCcgYXMgY29uc3QsIC4uLihvcC5yZWFkS2V5cyAhPT0gdW5kZWZpbmVkICYmIHsgcmVhZEtleXM6IG9wLnJlYWRLZXlzIH0pIH1cbiAgICA6IG9wO1xufVxuXG4vKiogQSByb3cncyBgcmVhZEtleXNgIGZyYWdtZW50IOKAlCBhYnNlbnQgdW5sZXNzIHRoZSBwcm92ZW5hbmNlIGRpYWwgcmVjb3JkZWQgb25lICgjUDEpLiAqL1xuZnVuY3Rpb24gcHJvdmVuYW5jZShyZWFkS2V5czogc3RyaW5nW10gfCB1bmRlZmluZWQpOiB7IHJlYWRLZXlzOiBzdHJpbmdbXSB9IHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIHJlYWRLZXlzICE9PSB1bmRlZmluZWQgPyB7IHJlYWRLZXlzIH0gOiB1bmRlZmluZWQ7XG59XG4iXX0=
|
|
951
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVHJhbnNhY3Rpb25CdWZmZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL21lbW9yeS9UcmFuc2FjdGlvbkJ1ZmZlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQStERzs7O0FBRUgsc0RBQStDO0FBQy9DLGlEQUFnSDtBQUNoSCx5REFBb0g7QUFDcEgsK0NBQXlDO0FBQ3pDLDZDQVVzQjtBQUV0Qix5Q0FBc0Y7QUFFdEYsTUFBYSxpQkFBaUI7SUFDNUI7Ozs7O09BS0c7SUFDSyxZQUFZLENBQU07SUFDbEIsV0FBVyxDQUFNO0lBRWpCLGNBQWMsR0FBZ0IsRUFBRSxDQUFDO0lBQ2pDLFdBQVcsR0FBZ0IsRUFBRSxDQUFDO0lBQzlCLE9BQU8sR0FBMEQsRUFBRSxDQUFDO0lBQ3BFLGFBQWEsR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO0lBQzFDOzs7Ozs7O09BT0c7SUFDSyxRQUFRLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztJQUNyQywwRUFBMEU7SUFDekQsWUFBWSxDQUFtQjtJQUVoRDs7OytFQUcyRTtJQUMxRCxnQkFBZ0IsQ0FBa0I7SUFFbkQ7Ozs7Ozs7T0FPRztJQUNLLEtBQUssR0FBRyxJQUFJLE9BQU8sRUFBVSxDQUFDO0lBRXRDOzs7Ozs7T0FNRztJQUNLLE1BQU0sR0FBRyxJQUFJLE9BQU8sRUFBVSxDQUFDO0lBRXZDOzs7OztPQUtHO0lBQ0ssWUFBWSxHQUFHLElBQUksT0FBTyxFQUFVLENBQUM7SUFFN0M7Ozs7T0FJRztJQUNLLFNBQVMsQ0FBbUI7SUFFcEM7OztPQUdHO0lBQ0ssWUFBWSxDQUFtQjtJQUV2Qzs7Ozs7O09BTUc7SUFDYyxPQUFPLENBQW9CO0lBRTVDLG9FQUFvRTtJQUM1RCxZQUFZLEdBQUcsQ0FBQyxDQUFDO0lBQ3pCLG9GQUFvRjtJQUM1RSxTQUFTLEdB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O0NBQ0Y7QUF2M0JELDhDQXUzQkM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBUyxpQkFBaUIsQ0FBQyxFQUF1RDtJQUNoRixPQUFPLEVBQUUsQ0FBQyxJQUFJLEtBQUssUUFBUTtRQUN6QixDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsS0FBYyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsUUFBUSxLQUFLLFNBQVMsSUFBSSxFQUFFLFFBQVEsRUFBRSxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUMsRUFBRTtRQUN0RyxDQUFDLENBQUMsRUFBRSxDQUFDO0FBQ1QsQ0FBQztBQUVELDBGQUEwRjtBQUMxRixTQUFTLFVBQVUsQ0FBQyxRQUE4QjtJQUNoRCxPQUFPLFFBQVEsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztBQUMzRCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBUcmFuc2FjdGlvbkJ1ZmZlciDigJQgUGVyLXN0YWdlIFNUQUdJTkcgYnVmZmVyIGZvciBzdGF0ZSBtdXRhdGlvbnNcbiAqXG4gKiBXaGF0IGl0IElTOiBhIHN0YWdpbmcgYnVmZmVyIHdpdGggcmVhZC15b3VyLXdyaXRlcyBhbmQgbmV0LWNoYW5nZSBjb21taXRzLlxuICogLSBDaGFuZ2VzIGFyZSBzdGFnZWQgaGVyZSBkdXJpbmcgc3RhZ2UgZXhlY3V0aW9uIGFuZCBmbHVzaGVkIHRvXG4gKiAgIFNoYXJlZE1lbW9yeSBpbiBPTkUgYmF0Y2ggcGVyIHN0YWdlIChgY29tbWl0KClgKSDigJQgb3RoZXIgc3RhZ2VzIGFuZFxuICogICBwYXJhbGxlbCBzaWJsaW5ncyBuZXZlciBvYnNlcnZlIGEgc3RhZ2UncyBoYWxmLWZpbmlzaGVkIHdyaXRlcy5cbiAqIC0gUmVhZC1hZnRlci13cml0ZSBjb25zaXN0ZW5jeSB3aXRoaW4gYSBzdGFnZSDigJQgYSBzdGFnZSBzZWVzIGl0cyBvd25cbiAqICAgc3RhZ2VkIHdyaXRlcyBpbW1lZGlhdGVseS5cbiAqIC0gYGNvbW1pdCgpYCByZWNvcmRzIHRoZSBzdGFnZSdzIE5FVCBjaGFuZ2UgKHNlZSB7QGxpbmsgY29tbWl0fSksIHBsdXMgYW5cbiAqICAgb3BlcmF0aW9uIHRyYWNlIGZvciBkZXRlcm1pbmlzdGljIHJlcGxheS5cbiAqXG4gKiBXaGF0IGl0IGlzIE5PVDogYSByb2xsYmFjayBtZWNoYW5pc20uIERlc3BpdGUgdGhlIG5hbWUsIHRoZXJlIGlzIG5vXG4gKiBhYm9ydC9yb2xsYmFjayBwYXRoIOKAlCB3aGVuIGEgc3RhZ2UgVEhST1dTLCB0aGUgZW5naW5lIHN0aWxsIGNvbW1pdHNcbiAqIGV2ZXJ5dGhpbmcgc3RhZ2VkIHNvIGZhciBiZWZvcmUgcmUtdGhyb3dpbmcgKGNvbW1pdC1vbi1lcnJvciBpblxuICogYEZsb3djaGFydFRyYXZlcnNlcmApLiBUaGF0IGlzIGRlbGliZXJhdGU6IHRoZSBhdWRpdCB0cmFpbCBtdXN0IHJlY29yZFxuICogd2hhdCB0aGUgZmFpbGluZyBzdGFnZSBjaGFuZ2VkLiBEbyBub3QgcmVseSBvbiBcInN0YWdlIGZhaWxlZCDihpIgaXRzXG4gKiB3cml0ZXMgdmFuaXNoZWRcIi5cbiAqXG4gKiBUaGUgcGF0Y2ggdHJlZXMgaG9sZCBSRUZFUkVOQ0VTIHVudGlsIGNvbW1pdCAoOS4yMy4wKS4gQSBgc2V0YCBzdG9yZXMgdGhlXG4gKiBjYWxsZXIncyBvd24gdmFsdWUgaW4gYG92ZXJ3cml0ZVBhdGNoYCBleGFjdGx5IGFzIGl0IGFsd2F5cyBkaWQgaW5cbiAqIGB3b3JraW5nQ29weWA7IHRoZSBjb3B5IHRoZSByZWNvcmQgbmVlZHMgaXMgdGFrZW4gT05DRSBwZXIgc3Vydml2aW5nIHBhdGhcbiAqIHdoZW4gdGhlIHBheWxvYWQgbGVhdmVzIHRoZSBidWZmZXIgKGB0b0NoYW5nZU9ubHlQYXlsb2FkYCAvXG4gKiBgdG9EZWx0YVBheWxvYWRgIOKAlCBldmVyeSB2YWx1ZSB0aGV5IGVtaXQgcGFzc2VzIHRocm91Z2ggYHN0cnVjdHVyZWRDbG9uZWBcbiAqIHRoZXJlKS4gVGhlIGxhdyBcInRoZSByZWNvcmQgbmV2ZXIgYWxpYXNlcyBhIGNhbGxlcidzIG9iamVjdFwiIGlzIGtlcHQgYXRcbiAqIHRoZSBjb21taXQgYm91bmRhcnkgaW5zdGVhZCBvZiBhdCBldmVyeSB3cml0ZSwgd2hpY2ggaXMgd2hhdCBtYWtlcyBOXG4gKiB3cml0ZXMgdG8gb25lIHBhdGggTyhOKSBpbnN0ZWFkIG9mIE8oTiDDlyBzaXplKS4gQ29uc2VxdWVuY2UsIGJ5IGRlc2lnbjogYVxuICogY2FsbGVyIHdobyBtdXRhdGVzIGl0cyBvd24gb2JqZWN0IEFGVEVSIHRoZSB3cml0ZSBhbmQgQkVGT1JFIHRoZSBzdGFnZVxuICogZW5kcyBjb21taXRzIHRoZSB2YWx1ZSBhcyB0aGUgc3RhZ2UgcmVhZCBpdCBiYWNrIOKAlCB0aGUgcmVjb3JkIGFncmVlcyB3aXRoXG4gKiB0aGUgc3RhZ2UgKENMQVVERS5tZCBsYW5kbWluZSAzJ3MgZmlyc3QgYml0ZSwgY2xvc2VkKS4gVGhlIG9uZSBwbGFjZSB0aGVcbiAqIGVuZ2luZSBpdHNlbGYgZWRpdHMgVEhST1VHSCBhIHN0YWdlZCB2YWx1ZSDigJQgYSBsYXRlciBuZXN0ZWQgb3AgdW5kZXIgYVxuICogYHNldGAgcGF0aCDigJQgZGV0YWNoZXMgdGhhdCB2YWx1ZSBmaXJzdCAoe0BsaW5rIGRldGFjaEhlbGRBbmNlc3RvcnN9KSwgc29cbiAqIGB3b3JraW5nQ29weWAgYW5kIGBvdmVyd3JpdGVQYXRjaGAgbmV2ZXIgc2hhcmUgYSBjb250YWluZXIgdGhlIGVuZ2luZVxuICogbXV0YXRlcyBvbiBvbmUgc2lkZSBvbmx5LlxuICpcbiAqIENPUFktT04tV1JJVEUgKDkuMjkuMCDigJQgZG9jcy9kZXNpZ24vMjAyNi0xMC1jb3B5LW9uLXdyaXRlLWNvbW1pdC5tZCkuIFRoZVxuICogYnVmZmVyIG5vIGxvbmdlciBjbG9uZXMgdGhlIGNvbW1pdHRlZCBzdGF0ZSBpdCBzdGFydHMgZnJvbS4gYGJhc2VTbmFwc2hvdGBcbiAqIElTIHRoZSBjb21taXR0ZWQgZ2VuZXJhdGlvbiB0aGUgc3RhZ2UgZmlyc3QgdG91Y2hlZCAoaGVsZCBieSByZWZlcmVuY2Ug4oCUXG4gKiBjb21taXR0ZWQgc3RhdGUgaXMgaW1tdXRhYmxlLWFmdGVyLXN3YXApLCBhbmQgYHdvcmtpbmdDb3B5YCBzdGFydHMgYXMgYVxuICogY29weSBvZiBpdHMgUk9PVCBvbmx5OiBlYWNoIHdyaXRlIGNvcGllcyB0aGUgY29udGFpbmVycyBvbiBpdHMgb3duIHBhdGhcbiAqICh7QGxpbmsgb3duU3BpbmV9KSwgYW5kIHRoZSBmaXJzdCBSRUFEIGFmdGVyIHRoZSBzdGFnZSdzIGZpcnN0IHdyaXRlIG9mIGFcbiAqIGNvbnRhaW5lciBzdGlsbCBzaGFyZWQgd2l0aCBjb21taXR0ZWQgc3RhdGUgdGFrZXMgYSBwcml2YXRlIGRlZXAgY29weSBvZlxuICogaXQgKHtAbGluayBwcml2YXRpc2V9KSDigJQgd2hhdCB0aGUgd2hvbGUtc3RhdGUgY2xvbmUgdXNlZCB0byBnaXZlIGV2ZXJ5XG4gKiByZWFkLCBzbyBhbiBpbi1wbGFjZSBlZGl0IG9mIGEgcmVhZCB2YWx1ZSBzdGF5cyBwcml2YXRlIGV4YWN0bHkgYXMgaXQgZGlkLlxuICogQSByZWFkIHRoZSB3b3JraW5nIGNvcHkgY2Fubm90IGFuc3dlciBpcyBzZXJ2ZWQgZnJvbSBsaXZlIHN0YXRlIGJ5IHRoZVxuICogY2FsbGVyLCBhcyBiZWZvcmU7IHRoZSBidWZmZXIgdGhlbiByZXBsYWNlcyB0aGF0IHBhdGggb2YgaXRzIGRpZmYgYmFzZVxuICogd2l0aCBhIHByaXZhdGUgY29weSAoe0BsaW5rIGRldGFjaEJhc2V9KSwgYXMgdGhlIGNsb25lIGhhZCBpdC5cbiAqXG4gKiBUSEUgQURNSVRURUQgUkVDT1JEICg5LjMwLjAg4oCUIGRvY3MvZGVzaWduLzIwMjYtMTAtYWRtaXR0ZWQtcmVjb3JkLm1kKS4gQVxuICogY29tbWl0IGlzIGFkbWl0dGVkIG9ubHkgaWYgaXRzIGJ1bmRsZSBmb2xkcyBiYWNrIHRvIHRoZSBzdGFnZSdzXG4gKiByZWFkLXlvdXItd3JpdGVzIHZpZXcgYXQgZXZlcnkgcGF0aCB0aGUgc3RhZ2UgdG91Y2hlZCAoYW5kIGF0IGV2ZXJ5XG4gKiBjb250YWluZXIgaXRzIHdyaXRlcyBjcmVhdGVkIG9uIHRoZSB3YXkgdGhlcmUsIGJlbG93IHRoZSBzdGFnZSdzIGFkZHJlc3MpLlxuICogQm90aCBlbmNvZGVycyBjb21taXQgdGhlIHZhbHVlIHRoZSBzdGFnZSByZWFkOiBhIGNvbXBhY3Qgcm93IOKAlCBhIGBtZXJnZWBcbiAqIGRlbHRhLCBhbiBgYXBwZW5kYCB0YWlsIOKAlCBpcyBrZXB0IHdoZXJlIGl0IHByb3ZhYmx5IGZvbGRzIGJhY2s7IGEgZmFtaWx5IG9mXG4gKiByb3dzIHRoYXQgZG9lcyBub3QgaXMgcmVjb3JkZWQgYXMgYHNldGAgcm93cyBvZiB0aGUgdmFsdWVzIHRoZSBzdGFnZSByZWFkXG4gKiAoe0BsaW5rIGFkbWl0fSkuIEJlZm9yZSA5LjMwLjAgdGhlIG9uZSBhY2N1bXVsYXRlZCBtZXJnZSBkZWx0YSBwZXIgcGF0aCB3YXNcbiAqIHJlcGxheWVkIGF0IGV2ZXJ5IGBtZXJnZWAgcm93IG9mIHRoYXQgcGF0aCwgd2hpY2ggbGllZCBhY3Jvc3MgYSBoYXJkIHdyaXRlXG4gKiAoYCR1cGRhdGUoayx7eH0pOyBrID0ge3l9OyAkdXBkYXRlKGsse3p9KWAgY29tbWl0dGVkIGB7eSwgeCwgen1gIGZvciBhXG4gKiByZWFkLWJhY2sgb2YgYHt5LCB6fWApLCBhbiBgW11gIGNsZWFyLCBhIGtpbmQgY2hhbmdlIG9yIGFuIGFycmF5IHVuaW9uXG4gKiBkZWR1cGxpY2F0ZWQgYnkgcmVmZXJlbmNlLiBWZXJpZmllZCB3aGVuIHRoZSBzdGFnZSBzdGFnZWQgYSBgbWVyZ2VgIG9yIGFcbiAqIG5lc3RlZCBvcDsgYSBzdGFnZSB0aGF0IHN0YWdlZCBvbmx5IGBzZXRgIC8gYGRlbGV0ZWAgb2Yga2V5cyBkaXJlY3RseSB1bmRlclxuICogaXRzIGFkZHJlc3MgaXMgY29oZXJlbnQgYnkgY29uc3RydWN0aW9uIOKAlCBib3RoIHRyZWVzIHJlY2VpdmUgdGhlIHNhbWVcbiAqIHdyaXRlIOKAlCBhbmQgaXMgYWRtaXR0ZWQgd2l0aG91dCB0aGUgZm9sZC5cbiAqL1xuXG5pbXBvcnQgeyBwdXRPd24gfSBmcm9tICcuLi9jYXB0dXJlL293bkRhdGEuanMnO1xuaW1wb3J0IHsgdHlwZSBGYW1pbHksIHR5cGUgTG9zc3ksIHR5cGUgTWVtYmVyLCB0eXBlIFJvd3MsIGFkZHJlc3NEZXB0aE9mLCBsb3NzeUZhbWlsaWVzIH0gZnJvbSAnLi9hZG1pc3Npb24uanMnO1xuaW1wb3J0IHsgdHlwZSBPcFZlcmIsIHR5cGUgU3Vydml2b3IsIGVtaXRJbkZhbWlseU9yZGVyLCBncm91cEludG9GYW1pbGllcywgcHVzaFZhbHVlUm93IH0gZnJvbSAnLi9kZWx0YUVuY29kaW5nLmpzJztcbmltcG9ydCB7IHJlbGF0aW9uIH0gZnJvbSAnLi9rZXlQYXRocy5qcyc7XG5pbXBvcnQge1xuICBhZG9wdCxcbiAgaXNDb250YWluZXIsXG4gIG5hdGl2ZUdldCBhcyBfZ2V0LFxuICBuYXRpdmVTZXQgYXMgX3NldCxcbiAgb3duLFxuICBvd25DaGlsZCxcbiAgb3duZWRSb290T2YsXG4gIG93blNwaW5lLFxuICBzaGFsbG93Q29weSxcbn0gZnJvbSAnLi9wYXRoT3BzLmpzJztcbmltcG9ydCB0eXBlIHsgQ29tbWl0VmFsdWVzTW9kZSwgTWVtb3J5UGF0Y2gsIFRyYWNlRW50cnkgfSBmcm9tICcuL3R5cGVzLmpzJztcbmltcG9ydCB7IGRlZXBFcXVhbCwgZGVlcFNtYXJ0TWVyZ2UsIERFTElNLCBkcnlGb2xkLCBub3JtYWxpc2VQYXRoIH0gZnJvbSAnLi91dGlscy5qcyc7XG5cbmV4cG9ydCBjbGFzcyBUcmFuc2FjdGlvbkJ1ZmZlciB7XG4gIC8qKlxuICAgKiBUaGUgbmV0LWNoYW5nZSBkaWZmIGJhc2U6IHRoZSBjb21taXR0ZWQgZ2VuZXJhdGlvbiB0aGUgc3RhZ2UgZmlyc3RcbiAgICogdG91Y2hlZCwgYnkgcmVmZXJlbmNlIOKAlCBleGNlcHQgd2hlcmUge0BsaW5rIGRldGFjaEJhc2V9IHJlcGxhY2VkIGEgcGF0aFxuICAgKiBvZiBpdCB3aXRoIGEgcHJpdmF0ZSBjb3B5IChpdHMgcm9vdCBhbmQgdGhlIGNvbnRhaW5lcnMgb24gdGhlIHdheSBhcmVcbiAgICogdGhlbiBjb3BpZXMgdG9vLCBvd25lZCBieSB7QGxpbmsgYmFzZU93bmVkfSkuXG4gICAqL1xuICBwcml2YXRlIGJhc2VTbmFwc2hvdDogYW55O1xuICBwcml2YXRlIHdvcmtpbmdDb3B5OiBhbnk7XG5cbiAgcHJpdmF0ZSBvdmVyd3JpdGVQYXRjaDogTWVtb3J5UGF0Y2ggPSB7fTtcbiAgcHJpdmF0ZSB1cGRhdGVQYXRjaDogTWVtb3J5UGF0Y2ggPSB7fTtcbiAgcHJpdmF0ZSBvcFRyYWNlOiB7IHBhdGg6IHN0cmluZzsgdmVyYjogT3BWZXJiOyByZWFkS2V5cz86IHN0cmluZ1tdIH1bXSA9IFtdO1xuICBwcml2YXRlIHJlZGFjdGVkUGF0aHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgLyoqXG4gICAqIFBhdGhzIHdob3NlIGBvdmVyd3JpdGVQYXRjaGAgdmFsdWUgaXMgdGhlIGNhbGxlcidzIG93biBvYmplY3QgKDkuMjMuMCk6XG4gICAqIGEgYHNldGAgb2YgYSBjb250YWluZXIgc3RvcmVzIHRoZSByZWZlcmVuY2UsIGFuZCB0aGlzIGlzIHRoZSBsZWRnZXIgb2ZcbiAgICogd2hpY2ggb25lcyBhcmUgc3RpbGwgc2hhcmVkIHdpdGggdGhlIGNhbGxlciAoYW5kIHdpdGggYHdvcmtpbmdDb3B5YCkuXG4gICAqIENvbnN1bHRlZCBvbmx5IGJ5IHRoZSBlbmdpbmUncyBuZXN0ZWQgb3BzIOKAlCBzZWVcbiAgICoge0BsaW5rIGRldGFjaEhlbGRBbmNlc3RvcnN9OyB0aGUgY29tbWl0IHBheWxvYWQgY2xvbmVzIGV2ZXJ5IHN1cnZpdmluZ1xuICAgKiB2YWx1ZSBhbnl3YXkgYW5kIG5ldmVyIGFza3MuIENsZWFyZWQgd2l0aCB0aGUgcmVzdCBhdCBgY29tbWl0KClgLlxuICAgKi9cbiAgcHJpdmF0ZSBoZWxkUmVmcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAvKiogQ29tbWl0LXZhbHVlIGVuY29kaW5nIHBvbGljeSAoIzEzYy1CKS4gYCdmdWxsJ2AgPSBoaXN0b3JpY2FsIGJ5dGVzLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGNvbW1pdFZhbHVlczogQ29tbWl0VmFsdWVzTW9kZTtcblxuICAvKiogUGVyLXdyaXRlIHJlYWQtcHJvdmVuYW5jZSBzb3VyY2UgKCNQMSkuIFdoZW4gc2V0ICh0aGVcbiAgICogIGB3cml0ZVByb3ZlbmFuY2U6ICdyZWFkcy1wcmVmaXgnYCBkaWFsKSwgZXZlcnkgc3RhZ2VkIG9wIHNuYXBzaG90cyB0aGVcbiAgICogIGtleXMgdHJhY2tlZC1yZWFkIHNvIGZhciDigJQgdGhlIHRlbXBvcmFsLXByZWZpeCBhdHRyaWJ1dGlvbiBjb25zdW1lZCBieVxuICAgKiAgY2F1c2FsIHNsaWNpbmcuIFVuZGVmaW5lZCAoZGVmYXVsdCkgPSB6ZXJvIGNvc3QsIGJ5dGUtaWRlbnRpY2FsIG9wcy4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSByZWFkS2V5c1Byb3ZpZGVyPzogKCkgPT4gc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIFRoZSBjb250YWluZXJzIGluIGB3b3JraW5nQ29weWAgdGhpcyBidWZmZXIgQ1JFQVRFRDogaXRzIHJvb3QgY29weSwgdGhlXG4gICAqIHBhdGggY29waWVzIGl0cyB3cml0ZXMgbWFkZSwgdGhlIG1lcmdlIHJlc3VsdHMgaXQgYnVpbHQsIGFuZCBldmVyeVxuICAgKiBjb250YWluZXIgb2YgdGhlIHByaXZhdGUgY29waWVzIGl0cyByZWFkcyB0b29rLiBBIHdyaXRlIGVkaXRzIHRoZXNlIGluXG4gICAqIHBsYWNlLiBFdmVyeXRoaW5nIGVsc2UgaW4gYHdvcmtpbmdDb3B5YCBpcyBTSEFSRUQg4oCUIHdpdGggdGhlIGNvbW1pdHRlZFxuICAgKiBnZW5lcmF0aW9uIHRoZSBzdGFnZSBmaXJzdCB0b3VjaGVkLCBvciB3aXRoIGEgdmFsdWUgdGhlIHN0YWdlIHN0YWdlZCDigJRcbiAgICogYW5kIGlzIGNvcGllZCBiZWZvcmUgYSB3cml0ZSBwYXNzZXMgdGhyb3VnaCBpdCAoe0BsaW5rIG93blNwaW5lfSkuXG4gICAqL1xuICBwcml2YXRlIG93bmVkID0gbmV3IFdlYWtTZXQ8b2JqZWN0PigpO1xuXG4gIC8qKlxuICAgKiBDb250YWluZXIgdmFsdWVzIHRoZSBzdGFnZSBzdGFnZWQgd2l0aCB7QGxpbmsgc2V0fSDigJQgaXRzIG93biBvYmplY3RzLFxuICAgKiBoZWxkIGJ5IHJlZmVyZW5jZSAoOS4yMy4wKS4gQSByZWFkIGhhbmRzIHRoZW0gYmFjayBhcyB0aGV5IGFyZSwgZXhhY3RseVxuICAgKiBhcyB0aGUgcHJpdmF0ZSB3b3JraW5nIGNvcHkgYWx3YXlzIGRpZCwgYW5kIG5ldmVyIHByaXZhdGlzZXMgdGhlbTogYVxuICAgKiBwcml2YXRlIGNvcHkgb2YgYSBzdGFnZWQgdmFsdWUgd291bGQgbGVhdmUgYHdvcmtpbmdDb3B5YCBhbmRcbiAgICogYG92ZXJ3cml0ZVBhdGNoYCBkaXNhZ3JlZWluZyBhYm91dCBhIHZhbHVlIHRoZSBzdGFnZSB3cm90ZS5cbiAgICovXG4gIHByaXZhdGUgc3RhZ2VkID0gbmV3IFdlYWtTZXQ8b2JqZWN0PigpO1xuXG4gIC8qKlxuICAgKiBPd25lZCBjb250YWluZXJzIHdpdGggbm8gY29udGFpbmVyIHN0aWxsIHNoYXJlZCB3aXRoIGNvbW1pdHRlZCBzdGF0ZVxuICAgKiBhbnl3aGVyZSBiZWxvdyB0aGVtIChhIHByaXZhdGUgZGVlcCBjb3B5LCBhIG1lcmdlIHJlc3VsdCBidWlsdCBvbiBhXG4gICAqIHByaXZhdGUgYmFzZSwgYSBwYXRoIGNvcHkgd2hvc2Ugc2hhcmVkIGNoaWxkcmVuIHdlcmUgcHJpdmF0aXNlZCkuIEEgcmVhZFxuICAgKiB0aGF0IGxhbmRzIG9uIG9uZSBuZWVkcyBubyB3YWxrIOKAlCBzZWUge0BsaW5rIHByaXZhdGlzZUJlbG93fS5cbiAgICovXG4gIHByaXZhdGUgcHJpdmF0ZVRyZWVzID0gbmV3IFdlYWtTZXQ8b2JqZWN0PigpO1xuXG4gIC8qKlxuICAgKiBUaGUgY29udGFpbmVycyBvZiB7QGxpbmsgYmFzZVNuYXBzaG90fSB0aGF0IHtAbGluayBkZXRhY2hCYXNlfSBjcmVhdGVkOlxuICAgKiBpdHMgcm9vdCBjb3B5IGFuZCB0aGUgY29waWVzIG9uIHRoZSB3YXkgdG8gYSBkZXRhY2hlZCBwYXRoLiBBbGxvY2F0ZWRcbiAgICogb25seSBieSB0aGUgZmlyc3QgZGV0YWNoIOKAlCB0aGUgaW4tY29udHJhY3Qgc3RhZ2UgbmV2ZXIgcGF5cyBmb3IgaXQuXG4gICAqL1xuICBwcml2YXRlIGJhc2VPd25lZD86IFdlYWtTZXQ8b2JqZWN0PjtcblxuICAvKipcbiAgICogVGhlIHByaXZhdGUgZGVlcCBjb3BpZXMge0BsaW5rIGRldGFjaEJhc2V9IHB1dCBpbnRvIHRoZSBkaWZmIGJhc2U6IG5vdGhpbmdcbiAgICogYXQgb3IgYmVsb3cgb25lIGlzIGNvbW1pdHRlZCBzdGF0ZSwgc28gYSBsYXRlciBkZXRhY2ggaW5zaWRlIGl0IGlzIGEgbm8tb3AuXG4gICAqL1xuICBwcml2YXRlIGRldGFjaGVkQmFzZT86IFdlYWtTZXQ8b2JqZWN0PjtcblxuICAvKipcbiAgICogV2hlcmUgdGhlIHN0YWdlIHdyaXRlcyAoOS4zMC4wKTogYSBwYXRoIHByZWZpeCBpdHMgZnJhbWUgY29tcHV0ZWQgYW5kXG4gICAqIGhhbmRzIG92ZXIgYXMgZGF0YSAoQzIg4oCUIGZvciB0aGUgZW5naW5lLCB0aGUgZnJhbWUncyBydW4gbmFtZXNwYWNlLCBvclxuICAgKiBgW11gIGZvciB0aGUgcm9vdCkuIEl0cyBjb250YWluZXJzIGFyZSB0aGUgc3RhZ2UncyBBRERSRVNTLCBub3QgYSB2YWx1ZVxuICAgKiB0aGUgc3RhZ2UgcmVhZHMgKGV2ZXJ5IHJlYWQgaXQgbWFrZXMgaXMgYSBrZXkgYmVsb3cgaXQpLCBzbyBhIHNoZWxsIGFcbiAgICogd3JpdGUgbGVhdmVzIHRoZXJlIGlzIG5vIHBhcnQgb2YgdGhlIHJlYWQtYmFjayB0aGUgcmVjb3JkIG11c3QgaG9sZC5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgYWRkcmVzczogcmVhZG9ubHkgc3RyaW5nW107XG5cbiAgLyoqIGBtZXJnZWAgb3BzIHN0YWdlZCBzaW5jZSB0aGUgbGFzdCBjb21taXQg4oCUIHNlZSB7QGxpbmsgYWRtaXR9LiAqL1xuICBwcml2YXRlIHN0YWdlZE1lcmdlcyA9IDA7XG4gIC8qKiBPcHMgc3RhZ2VkIGRlZXBlciB0aGFuIG9uZSBrZXkgYmVsb3cgdGhlIHN0YWdlJ3MgYWRkcmVzcyDigJQgc2VlIHtAbGluayBhZG1pdH0uICovXG4gIHByaXZhdGUgbmVzdGVkT3BzID0gMDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBiYXNlOiBhbnksXG4gICAgY29tbWl0VmFsdWVzOiBDb21taXRWYWx1ZXNNb2RlID0gJ2Z1bGwnLFxuICAgIHJlYWRLZXlzUHJvdmlkZXI/OiAoKSA9PiBzdHJpbmdbXSxcbiAgICBhZGRyZXNzOiByZWFkb25seSBzdHJpbmdbXSA9IFtdLFxuICApIHtcbiAgICAvLyBgYmFzZWAgaXMgdGhlIGNvbW1pdHRlZCBnZW5lcmF0aW9uIHRoZSBzdGFnZSBmaXJzdCB0b3VjaGVkIOKAlFxuICAgIC8vIGltbXV0YWJsZS1hZnRlci1zd2FwLCB0aGUgaW52YXJpYW50IHRoZSBmaXJzdC10b3VjaCB2aWV3IGFscmVhZHkgcmVzdHNcbiAgICAvLyBvbiDigJQgc28gdGhlIGRpZmYgYmFzZSBpcyBoZWxkIGJ5IFJFRkVSRU5DRSwgYW5kIHRoZSB3b3JraW5nIGNvcHkgc3RhcnRzXG4gICAgLy8gYXMgYSBjb3B5IG9mIGl0cyBST09UIG9ubHkuIEJlZm9yZSA5LjI5LjAgdGhlc2UgdHdvIGxpbmVzIHdlcmUgdHdvXG4gICAgLy8gYHN0cnVjdHVyZWRDbG9uZWBzIG9mIHRoZSB3aG9sZSBzdGF0ZSwgcGFpZCBieSBldmVyeSBzdGFnZSB0aGF0IHdyb3RlLlxuICAgIHRoaXMuYmFzZVNuYXBzaG90ID0gYmFzZTtcbiAgICB0aGlzLndvcmtpbmdDb3B5ID0gb3duZWRSb290T2YoYmFzZSwgdGhpcy5vd25lZCk7XG4gICAgdGhpcy5jb21taXRWYWx1ZXMgPSBjb21taXRWYWx1ZXM7XG4gICAgdGhpcy5yZWFkS2V5c1Byb3ZpZGVyID0gcmVhZEtleXNQcm92aWRlcjtcbiAgICB0aGlzLmFkZHJlc3MgPSBhZGRyZXNzO1xuICB9XG5cbiAgLyoqIFN0YW1wIHRoZSBjdXJyZW50IHJlYWQgcHJlZml4IG9udG8gYSBzdGFnZWQgb3Ag4oCUIG9ubHkgd2hlbiB0aGVcbiAgICogIHByb3ZlbmFuY2UgZGlhbCBpcyBvbiAocHJvdmlkZXIgcHJlc2VudCksIHNvIHRoZSBkZWZhdWx0IHBhdGggYWxsb2NhdGVzXG4gICAqICBub3RoaW5nIGFuZCBjb21taXQgYnVuZGxlcyBzdGF5IGJ5dGUtaWRlbnRpY2FsLiAqL1xuICBwcml2YXRlIHN0YW1wUmVhZEtleXMob3A6IHsgcGF0aDogc3RyaW5nOyB2ZXJiOiBPcFZlcmI7IHJlYWRLZXlzPzogc3RyaW5nW10gfSk6IHR5cGVvZiBvcCB7XG4gICAgaWYgKHRoaXMucmVhZEtleXNQcm92aWRlcikgb3AucmVhZEtleXMgPSB0aGlzLnJlYWRLZXlzUHJvdmlkZXIoKTtcbiAgICByZXR1cm4gb3A7XG4gIH1cblxuICAvKiogU3RhZ2UgYW4gb3AgaW50byBgb3BUcmFjZWAsIGNvdW50aW5nIHdoYXQgZGVjaWRlcyB3aGV0aGVyIHtAbGluayBhZG1pdH0gbXVzdCBmb2xkLiAqL1xuICBwcml2YXRlIHN0YWdlKHBhdGg6IChzdHJpbmcgfCBudW1iZXIpW10sIGtleTogc3RyaW5nLCB2ZXJiOiBPcFZlcmIpOiB2b2lkIHtcbiAgICBpZiAodmVyYiA9PT0gJ21lcmdlJykgdGhpcy5zdGFnZWRNZXJnZXMrKztcbiAgICBpZiAocGF0aC5sZW5ndGggLSBhZGRyZXNzRGVwdGhPZihwYXRoLCB0aGlzLmFkZHJlc3MpID4gMSkgdGhpcy5uZXN0ZWRPcHMrKztcbiAgICB0aGlzLm9wVHJhY2UucHVzaCh0aGlzLnN0YW1wUmVhZEtleXMoeyBwYXRoOiBrZXksIHZlcmIgfSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhcmQgb3ZlcndyaXRlIGF0IHRoZSBzcGVjaWZpZWQgcGF0aC4gU3RvcmVzIHRoZSBSRUZFUkVOQ0UgaW4gYm90aCB0cmVlc1xuICAgKiAoOS4yMy4wKSDigJQgdGhlIHJlY29yZCdzIGNvcHkgaXMgdGFrZW4gb25jZSwgYXQgY29tbWl0OyBzZWUgdGhlIGhlYWRlci5cbiAgICovXG4gIHNldChwYXRoOiAoc3RyaW5nIHwgbnVtYmVyKVtdLCB2YWx1ZTogYW55LCBzaG91bGRSZWRhY3QgPSBmYWxzZSk6IHZvaWQge1xuICAgIGNvbnN0IGtleSA9IG5vcm1hbGlzZVBhdGgocGF0aCk7XG4gICAgdGhpcy5kZXRhY2hIZWxkQW5jZXN0b3JzKHBhdGgpO1xuICAgIG93blNwaW5lKHRoaXMud29ya2luZ0NvcHksIHBhdGgsIHRoaXMub3duZWQpO1xuICAgIF9zZXQodGhpcy53b3JraW5nQ29weSwgcGF0aCwgdmFsdWUpO1xuICAgIF9zZXQodGhpcy5vdmVyd3JpdGVQYXRjaCwgcGF0aCwgdmFsdWUpO1xuICAgIGlmIChpc0NvbnRhaW5lcih2YWx1ZSkpIHtcbiAgICAgIHRoaXMuaGVsZFJlZnMuYWRkKGtleSk7XG4gICAgICB0aGlzLnN0YWdlZC5hZGQodmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmhlbGRSZWZzLmRlbGV0ZShrZXkpO1xuICAgIH1cbiAgICBpZiAoc2hvdWxkUmVkYWN0KSB7XG4gICAgICB0aGlzLnJlZGFjdGVkUGF0aHMuYWRkKGtleSk7XG4gICAgfVxuICAgIHRoaXMuc3RhZ2UocGF0aCwga2V5LCAnc2V0Jyk7XG4gIH1cblxuICAvKipcbiAgICogQSBuZXN0ZWQgb3AgaXMgYWJvdXQgdG8gd3JpdGUgVEhST1VHSCBhIHBhdGggd2hvc2UgYG92ZXJ3cml0ZVBhdGNoYFxuICAgKiB2YWx1ZSBpcyBhIGhlbGQgcmVmZXJlbmNlICg5LjIzLjApLiBUb2RheSdzIGxhdyBpcyB0aGF0IHRoZSB0d28gdHJlZXNcbiAgICogcmVjZWl2ZSB0aGUgc2FtZSBuZXN0ZWQgYHNldGAvYGRlbGV0ZWAgbXV0YXRpb25zIGJ1dCBPTkxZIGB3b3JraW5nQ29weWBcbiAgICogcmVjZWl2ZXMgYSBuZXN0ZWQgYG1lcmdlYCdzIHJlc3VsdCAoYHVwZGF0ZVBhdGNoYCBnZXRzIHRoZSBkZWx0YSkg4oCUIHNvIGFcbiAgICogY29udGFpbmVyIHNoYXJlZCBiZXR3ZWVuIHRoZSB0cmVlcyB3b3VsZCBsZWFrIHRoZSBtZXJnZWQgdmFsdWUgaW50byB0aGVcbiAgICogb3ZlcndyaXRlIHBheWxvYWQsIGFuZCBhIHNoYXJlZCBjb250YWluZXIgaXMgYWxzbyB0aGUgY2FsbGVyJ3Mgb3duXG4gICAqIG9iamVjdCwgd2hpY2ggdGhlIGVuZ2luZSBtdXN0IG5vdCBlZGl0IG9uIHRoZSByZWNvcmQncyBiZWhhbGYuIFJlcGxhY2luZ1xuICAgKiB0aGUgaGVsZCBhbmNlc3RvciB3aXRoIGl0cyBjbG9uZSBpbiBgb3ZlcndyaXRlUGF0Y2hgIHJlc3RvcmVzIGV4YWN0bHlcbiAgICogdGhlIHByaXZhdGUgdHJlZSB0aGUgcGVyLXdyaXRlIGNsb25lIHVzZWQgdG8gZ2l2ZSBpdCwgcGFpZCBvbmNlIHBlclxuICAgKiBhbmNlc3RvciBhbmQgb25seSBvbiB0aGUgbmVzdGVkLW9wIHBhdGggdGhlIHB1YmxpYyBzdXJmYWNlIG5ldmVyIHRha2VzXG4gICAqICh0aGUgc2NvcGUgcHJveHkgd3JpdGVzIFJPT1Qga2V5cykuIGB3b3JraW5nQ29weWAga2VlcHMgdGhlIHJlZmVyZW5jZSxcbiAgICogYXMgaXQgYWx3YXlzIGRpZC5cbiAgICovXG4gIHByaXZhdGUgZGV0YWNoSGVsZEFuY2VzdG9ycyhwYXRoOiAoc3RyaW5nIHwgbnVtYmVyKVtdKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaGVsZFJlZnMuc2l6ZSA9PT0gMCkgcmV0dXJuO1xuICAgIGZvciAobGV0IGkgPSAxOyBpIDwgcGF0aC5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgYW5jZXN0b3IgPSBwYXRoLnNsaWNlKDAsIGkpO1xuICAgICAgY29uc3Qga2V5ID0gbm9ybWFsaXNlUGF0aChhbmNlc3Rvcik7XG4gICAgICBpZiAoIXRoaXMuaGVsZFJlZnMuaGFzKGtleSkpIGNvbnRpbnVlO1xuICAgICAgY29uc3QgaGVsZCA9IF9nZXQodGhpcy5vdmVyd3JpdGVQYXRjaCwgYW5jZXN0b3IpO1xuICAgICAgaWYgKGhlbGQgIT09IG51bGwgJiYgdHlwZW9mIGhlbGQgPT09ICdvYmplY3QnKSBfc2V0KHRoaXMub3ZlcndyaXRlUGF0Y2gsIGFuY2VzdG9yLCBzdHJ1Y3R1cmVkQ2xvbmUoaGVsZCkpO1xuICAgICAgdGhpcy5oZWxkUmVmcy5kZWxldGUoa2V5KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRXhwbGljaXQga2V5IGRlbGV0aW9uIGF0IHRoZSBzcGVjaWZpZWQgcGF0aCAoIzEzYy1COyBhYnNvcmJzIGJhY2tsb2cgQjgpLlxuICAgKlxuICAgKiBTdGFnZXMgRVhBQ1RMWSB0aGUgc2FtZSBidWZmZXIgbXV0YXRpb25zIGFzIGBzZXQocGF0aCwgdW5kZWZpbmVkKWAg4oCUXG4gICAqIGB3b3JraW5nQ29weWAvYG92ZXJ3cml0ZVBhdGNoYCBnZXQgYW4gb3duIGB1bmRlZmluZWRgIGF0IHRoZSBwYXRoICh0aGVcbiAgICogaGlzdG9yaWNhbCBmbGF0dGVuaW5nLCBwcmVzZXJ2aW5nIHJlYWQgYmVoYXZpb3IgYW5kIHRoZSBkZWR1cCBkaWZmIGJhc2VcbiAgICogYWNyb3NzIG1vZGVzKSDigJQgYnV0IHJlY29yZHMgdGhlIG9wIHZlcmIgYXMgYCdkZWxldGUnYC4gQXQgY29tbWl0OlxuICAgKiBgJ2Z1bGwnYCBtb2RlIG1hcHMgaXQgYmFjayB0byBhIGAnc2V0J2AgdHJhY2UgZW50cnkgKGJ5dGUtaWRlbnRpY2FsIHRvXG4gICAqIHRvZGF5KTsgYCdkZWx0YSdgIG1vZGUgZW1pdHMgYSByZWFsIGAnZGVsZXRlJ2AgZW50cnkgd2hvc2UgcmVwbGF5XG4gICAqIFJFTU9WRVMgdGhlIGtleSBpbnN0ZWFkIG9mIGxlYXZpbmcgYGtleTogdW5kZWZpbmVkYCBiZWhpbmQuXG4gICAqXG4gICAqIFRoZSBuZXQtY2hhbmdlIGZpbHRlciByZWFkcyB0aGF0IHN0YWdlZCBvd24gYHVuZGVmaW5lZGAgYXMgQUJTRU5UXG4gICAqIChgZGVlcEVxdWFsYCwgOS4xOS4xKSDigJQgc28gdW5kZXIgYCdkZWx0YSdgLCB3aG9zZSBjb21taXR0ZWQgc3RhdGUgcmVhbGx5XG4gICAqIGxhY2tzIHRoZSBrZXksIGRlbGV0aW5nIGFuIGFic2VudCBrZXkgaW5zaWRlIGEgY29udGFpbmVyIHRoZSBzdGFnZSBhbHNvXG4gICAqIHJlLXdyb3RlIGlzIHRoZSBuby1vcCBpdCBpcywgbm90IGEgYHNldGAgb2YgdGhlIHdob2xlIGNvbnRhaW5lci5cbiAgICovXG4gIGRlbGV0ZShwYXRoOiAoc3RyaW5nIHwgbnVtYmVyKVtdLCBzaG91bGRSZWRhY3QgPSBmYWxzZSk6IHZvaWQge1xuICAgIGNvbnN0IGtleSA9IG5vcm1hbGlzZVBhdGgocGF0aCk7XG4gICAgdGhpcy5kZXRhY2hIZWxkQW5jZXN0b3JzKHBhdGgpO1xuICAgIG93blNwaW5lKHRoaXMud29ya2luZ0NvcHksIHBhdGgsIHRoaXMub3duZWQpO1xuICAgIF9zZXQodGhpcy53b3JraW5nQ29weSwgcGF0aCwgdW5kZWZpbmVkKTtcbiAgICBfc2V0KHRoaXMub3ZlcndyaXRlUGF0Y2gsIHBhdGgsIHVuZGVmaW5lZCk7XG4gICAgdGhpcy5oZWxkUmVmcy5kZWxldGUoa2V5KTtcbiAgICBpZiAoc2hvdWxkUmVkYWN0KSB7XG4gICAgICB0aGlzLnJlZGFjdGVkUGF0aHMuYWRkKGtleSk7XG4gICAgfVxuICAgIHRoaXMuc3RhZ2UocGF0aCwga2V5LCAnZGVsZXRlJyk7XG4gIH1cblxuICAvKiogRGVlcCB1bmlvbiBtZXJnZSBhdCB0aGUgc3BlY2lmaWVkIHBhdGguIGBkZWVwU21hcnRNZXJnZWAgYnVpbGRzIGZyZXNoXG4gICAqICBjb250YWluZXJzLCBzbyBuZWl0aGVyIHRyZWUgZXZlciBob2xkcyB0aGUgbWVyZ2UgSU5QVVQgYnkgcmVmZXJlbmNlO1xuICAgKiAgdGhlIG5lc3RlZC1vcCBkZXRhY2ggZ3VhcmRzIHRoZSBhbmNlc3RvciBpdCB3cml0ZXMgSU5UTy5cbiAgICpcbiAgICogIFRoZSB2YWx1ZSBtZXJnZWQgSU5UTyBpcyBtYWRlIHByaXZhdGUgZmlyc3QgKGBwcml2YXRpc2VgKSwgYXMgdGhlXG4gICAqICB3aG9sZS1zdGF0ZSBjbG9uZSBtYWRlIGl0IGJlZm9yZSA5LjI5LjAuIE5vdCBvbmx5IGZvciB0aGUgcmVhZHMgdGhhdFxuICAgKiAgZm9sbG93OiBgZGVlcFNtYXJ0TWVyZ2VgIHVuaW9ucyBhcnJheXMgQlkgUkVGRVJFTkNFLCBzbyB3aGV0aGVyIGFuXG4gICAqICBlbGVtZW50IHRoZSBzdGFnZSBwYXNzZXMgaW4gaXMgXCJhbHJlYWR5IHRoZXJlXCIgZGVwZW5kcyBvbiB3aGljaCBvYmplY3RzXG4gICAqICB0aGUgYmFzZSBob2xkcyDigJQgYSBjb21taXR0ZWQgYXJyYXkgd291bGQgZGVkdXAgYW4gZWxlbWVudCB0aGUgc3RhZ2VcbiAgICogIHJlYWQgZnJvbSBpdCBiZWZvcmUgaXRzIGZpcnN0IHdyaXRlLCB3aGVyZSB0aGUgcHJpdmF0ZSBjb3B5IChhbmRcbiAgICogIDkuMjguMCkgYXBwZW5kcyBpdC4gKi9cbiAgbWVyZ2UocGF0aDogKHN0cmluZyB8IG51bWJlcilbXSwgdmFsdWU6IGFueSwgc2hvdWxkUmVkYWN0ID0gZmFsc2UpOiB2b2lkIHtcbiAgICBjb25zdCBrZXkgPSBub3JtYWxpc2VQYXRoKHBhdGgpO1xuICAgIHRoaXMuZGV0YWNoSGVsZEFuY2VzdG9ycyhwYXRoKTtcbiAgICB0aGlzLnByaXZhdGlzZShwYXRoKTtcbiAgICBjb25zdCBleGlzdGluZyA9IF9nZXQodGhpcy53b3JraW5nQ29weSwgcGF0aCkgPz8ge307XG4gICAgY29uc3QgbWVyZ2VkID0gZGVlcFNtYXJ0TWVyZ2UoZXhpc3RpbmcsIHZhbHVlKTtcbiAgICBvd25TcGluZSh0aGlzLndvcmtpbmdDb3B5LCBwYXRoLCB0aGlzLm93bmVkKTtcbiAgICBvd24obWVyZ2VkLCB0aGlzLm93bmVkKTtcbiAgICBpZiAoaXNDb250YWluZXIobWVyZ2VkKSkgdGhpcy5wcml2YXRlVHJlZXMuYWRkKG1lcmdlZCk7XG4gICAgX3NldCh0aGlzLndvcmtpbmdDb3B5LCBwYXRoLCBtZXJnZWQpO1xuICAgIF9zZXQodGhpcy51cGRhdGVQYXRjaCwgcGF0aCwgZGVlcFNtYXJ0TWVyZ2UoX2dldCh0aGlzLnVwZGF0ZVBhdGNoLCBwYXRoKSA/PyB7fSwgdmFsdWUpKTtcbiAgICBpZiAoc2hvdWxkUmVkYWN0KSB7XG4gICAgICB0aGlzLnJlZGFjdGVkUGF0aHMuYWRkKGtleSk7XG4gICAgfVxuICAgIHRoaXMuc3RhZ2UocGF0aCwga2V5LCAnbWVyZ2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaWVsZC1sZXZlbCByZWRhY3Rpb24gKDkuMTkuMCk6IG1hcmsgZG90LXBhdGhzIElOU0lERSB0aGUgdmFsdWUgc3RhZ2VkIGF0XG4gICAqIGBwYXRoYCBhcyBzZWNyZXQsIHNvIGBzY3J1YlBhdGNoYCBzY3J1YnMgdGhlbSBpbiB0aGUgY29tbWl0IGxvZyBhbmQgdGhlXG4gICAqIG1pcnJvciB0aGUgc2FtZSB3YXkgYSB3aG9sZS1rZXkgcmVkYWN0aW9uIGlzIHNjcnViYmVkLiBBIGZpZWxkIGlzXG4gICAqIHJlZ2lzdGVyZWQgYXMgYSBsaXRlcmFsIGtleSBBTkQsIHdoZW4gZG90dGVkLCBhcyB0aGUgbmVzdGVkIHBhdGggaXRcbiAgICogbmFtZXMg4oCUIHdoaWNoZXZlciBleGlzdHMgaW4gdGhlIHBhdGNoIGlzIHRoZSBvbmUgYHNjcnViUGF0Y2hgIGZpbmRzLlxuICAgKiBNYXJrZWQgcGF0aHMgc3Vydml2ZSBjb21taXQgb25seSB3aGlsZSB0aGUgb3AgcGF0aCB0aGV5IHNpdCB1bmRlciBkb2VzXG4gICAqIChzZWUge0BsaW5rIHN1cnZpdmluZ1JlZGFjdGVkUGF0aHN9KS5cbiAgICovXG4gIG1hcmtSZWRhY3RlZEZpZWxkcyhwYXRoOiAoc3RyaW5nIHwgbnVtYmVyKVtdLCBmaWVsZHM6IHJlYWRvbmx5IHN0cmluZ1tdKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBmaWVsZCBvZiBmaWVsZHMpIHtcbiAgICAgIHRoaXMucmVkYWN0ZWRQYXRocy5hZGQobm9ybWFsaXNlUGF0aChbLi4ucGF0aCwgZmllbGRdKSk7XG4gICAgICBpZiAoZmllbGQuaW5jbHVkZXMoJy4nKSkgdGhpcy5yZWRhY3RlZFBhdGhzLmFkZChub3JtYWxpc2VQYXRoKFsuLi5wYXRoLCAuLi5maWVsZC5zcGxpdCgnLicpXSkpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEb2VzIGEgcmVkYWN0aW9uIG1hcmsgYWRkcmVzcyBhbiBhcnJheSBFTEVNRU5UIHJpZ2h0IGJlbG93IGBwYXRoYFxuICAgKiAoYGxpc3QuMS50b2tlbmApPyBBbiBgYXBwZW5kYCByb3cgcmUtYmFzZXMgdGhlIGluZGljZXMgb250byB0aGUgdGFpbCwgc29cbiAgICogc3VjaCBhIHBhdGggdGFrZXMgdGhlIHdob2xlLXZhbHVlIGBzZXRgIChgZGVsdGFFbmNvZGluZyDCtyBwdXNoVmFsdWVSb3dgKS5cbiAgICogQSBtYXJrIGJ5IE5BTUUgYmVsb3cgYW4gYXJyYXkgKGBvYmoueWApIG1lYW5zIHRoZSBzYW1lIHRoaW5nIG9uIHRoZSB0YWlsXG4gICAqIGFzIG9uIHRoZSB3aG9sZSB2YWx1ZSwgc28gdGhlIGNvbXBhY3Qgcm93IHN0YXlzIChieXRlLWlkZW50aWNhbCkuXG4gICAqL1xuICBwcml2YXRlIG1hcmtlZEJlbG93KHBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHByZWZpeCA9IHBhdGggKyBERUxJTTtcbiAgICBmb3IgKGNvbnN0IG1hcmtlZCBvZiB0aGlzLnJlZGFjdGVkUGF0aHMpIHtcbiAgICAgIGlmICghbWFya2VkLnN0YXJ0c1dpdGgocHJlZml4KSkgY29udGludWU7XG4gICAgICBjb25zdCBuZXh0ID0gbWFya2VkLnNsaWNlKHByZWZpeC5sZW5ndGgpLnNwbGl0KERFTElNKVswXTtcbiAgICAgIGlmICgvXigwfFsxLTldXFxkKikkLy50ZXN0KG5leHQpKSByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSByZWRhY3RlZCBwYXRocyB0aGF0IHN1cnZpdmUgdGhlIG5ldC1jaGFuZ2UgZmlsdGVyOiBhIHBhdGggc3Vydml2ZXNcbiAgICogd2hlbiBpdCBJUyBhIHN1cnZpdmluZyBvcCBwYXRoIChhIHdob2xlLWtleSByZWRhY3Rpb24pIG9yIHNpdHMgVU5ERVIgb25lXG4gICAqIChhIGZpZWxkIGluc2lkZSBhIHN1cnZpdmluZyB3cml0ZSkuIEEgZHJvcHBlZCBvcCB0YWtlcyBpdHMgZmllbGRzIHdpdGggaXQuXG4gICAqL1xuICBwcml2YXRlIHN1cnZpdmluZ1JlZGFjdGVkUGF0aHMoc3Vydml2aW5nUGF0aHM6IFNldDxzdHJpbmc+KTogU2V0PHN0cmluZz4ge1xuICAgIGNvbnN0IG91dCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIGZvciAoY29uc3QgcGF0aCBvZiB0aGlzLnJlZGFjdGVkUGF0aHMpIHtcbiAgICAgIGlmIChzdXJ2aXZpbmdQYXRocy5oYXMocGF0aCkpIHtcbiAgICAgICAgb3V0LmFkZChwYXRoKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IG9wIG9mIHN1cnZpdmluZ1BhdGhzKSB7XG4gICAgICAgIGlmIChwYXRoLnN0YXJ0c1dpdGgob3AgKyBERUxJTSkpIHtcbiAgICAgICAgICBvdXQuYWRkKHBhdGgpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBvdXQ7XG4gIH1cblxuICAvKipcbiAgICogUmVhZCBjdXJyZW50IHZhbHVlIGF0IHBhdGggKGluY2x1ZGVzIHVuY29tbWl0dGVkIGNoYW5nZXMpLiBUaGUgdmFsdWUgaXNcbiAgICogdGhlIHN0YWdlJ3Mgb3duIOKAlCBwcml2YXRlIHRvIGl0LCBhcyB0aGUgd2hvbGUtc3RhdGUgY2xvbmUgbWFkZSBldmVyeSByZWFkXG4gICAqIGFmdGVyIHRoZSBmaXJzdCB3cml0ZSBiZWZvcmUgOS4yOS4wIChgcHJpdmF0aXNlYCkuXG4gICAqL1xuICBnZXQocGF0aDogKHN0cmluZyB8IG51bWJlcilbXSwgZGVmYXVsdFZhbHVlPzogYW55KSB7XG4gICAgdGhpcy5wcml2YXRpc2UocGF0aCk7XG4gICAgcmV0dXJuIF9nZXQodGhpcy53b3JraW5nQ29weSwgcGF0aCwgZGVmYXVsdFZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFkIHRoZSB3b3JraW5nIGNvcHkgYXQgYHBhdGhgIFdJVEhPVVQgdGFraW5nIGEgcHJpdmF0ZSBjb3B5IOKAlCBmb3IgYVxuICAgKiByZWFkZXIgdGhhdCBvbmx5IGNvbXBhcmVzICh0aGUgZGV2LW1vZGUgYm9ycm93ZWQtbXV0YXRpb24gcmVwb3J0IGluXG4gICAqIGBTdGFnZUNvbnRleHQuY29tbWl0YCksIG5ldmVyIGZvciBhIHZhbHVlIGhhbmRlZCB0byBhIHN0YWdlLlxuICAgKi9cbiAgcGVlayhwYXRoOiAoc3RyaW5nIHwgbnVtYmVyKVtdKTogdW5rbm93biB7XG4gICAgcmV0dXJuIF9nZXQodGhpcy53b3JraW5nQ29weSwgcGF0aCk7XG4gIH1cblxuICAvKipcbiAgICogS2VlcCB0aGUgZGlmZiBiYXNlIGV4YWN0IHVuZGVyIGEgcmVhZCB0aGUgd29ya2luZyBjb3B5IGNhbm5vdCBhbnN3ZXIuXG4gICAqXG4gICAqIFdoZW4gYHdvcmtpbmdDb3B5YCBob2xkcyBub3RoaW5nIGF0IGBwYXRoYCDigJQgdGhlIHN0YWdlIGRlbGV0ZWQgb3IgdW5zZXRcbiAgICogaXQsIG9yIGEgd3JpdGUgcmVwbGFjZWQgYSBjb250YWluZXIgYWJvdmUgaXQg4oCUIGBSZWNvcmRGcmFtZSDCtyByZWFkYFxuICAgKiBzZXJ2ZXMgdGhlIHJlYWQgZnJvbSBMSVZFIGNvbW1pdHRlZCBzdGF0ZSwgZXhhY3RseSBhcyA5LjI4LjBcbiAgICogZGlkLCBzbyB0aGUgdmFsdWUgaXQgaGFuZHMgb3V0IGlzIGNvbW1pdHRlZCBzdGF0ZSBpdHNlbGYuIE9uIDkuMjguMCB0aGVcbiAgICogZGlmZiBiYXNlIHdhcyBhIHdob2xlLXN0YXRlIGNsb25lIHRha2VuIGF0IHRoZSBzdGFnZSdzIGZpcnN0IHdyaXRlLCBhbmRcbiAgICogYW4gaW4tcGxhY2UgZWRpdCBvZiB0aGF0IHZhbHVlIChvdXQgb2YgY29udHJhY3Qg4oCUIHJlYWRzIGFyZSBib3Jyb3dlZClcbiAgICogY291bGQgbm90IG1vdmUgaXQ6IHdyaXR0ZW4gYmFjaywgdGhlIGVkaXQgd2FzIHJlY29yZGVkLiBIZXJlIHRoZSBkaWZmXG4gICAqIGJhc2UgSVMgYSBjb21taXR0ZWQgZ2VuZXJhdGlvbiwgYW5kIGl0IHZlcnkgb2Z0ZW4gaG9sZHMgdGhhdCBzYW1lXG4gICAqIGNvbnRhaW5lciBhdCBgcGF0aGAg4oCUIHRoZSBlZGl0IHdvdWxkIG1vdmUgdGhlIGJhc2Ugd2l0aCBpdCwgYW5kIHRoZVxuICAgKiB3cml0ZS1iYWNrIHdvdWxkIGNvbW1pdCBubyBjaGFuZ2UuIFNvIGJlZm9yZSB0aGUgdmFsdWUgZ29lcyBvdXQsIHRoZVxuICAgKiBiYXNlJ3MgdmFsdWUgYXQgYHBhdGhgIGlzIHJlcGxhY2VkIGJ5IGEgcHJpdmF0ZSBkZWVwIGNvcHkgKHRoZSBiYXNlJ3NcbiAgICogcm9vdCBhbmQgdGhlIGNvbnRhaW5lcnMgb24gdGhlIHdheSBjb3BpZWQgc2hhbGxvd2x5KSDigJQgd2hhdCA5LjI4LjAnc1xuICAgKiBiYXNlIGhlbGQgdGhlcmUuIFRoZSBjb21taXQncyBuZXQtY2hhbmdlIHRlc3QgY29tcGFyZXMgYWdhaW5zdCBpdCBhbmRcbiAgICogdGhlIGRlbHRhIGVuY29kZXIgcmVwbGF5cyBmcm9tIGl0OyB0aGUgdmFsdWUgaGFuZGVkIG91dCBzdGF5cyB0aGUgbGl2ZVxuICAgKiBvbmUsIHNvIHdoYXRldmVyIGVsc2UgYW4gZWRpdCBvZiBpdCByZWFjaGVzIChsaXZlIHN0YXRlLCB0aGUgbmV4dFxuICAgKiBnZW5lcmF0aW9uKSBiZWhhdmVzIGFzIG9uIDkuMjguMCB0b28uXG4gICAqXG4gICAqIE5vdCBgcHJpdmF0aXNlYDogYSBwcml2YXRlIGNvcHkgaGFuZGVkIHRvIHRoZSBzdGFnZSB3b3VsZCBhbHNvIGtlZXAgdGhlXG4gICAqIGVkaXQgb3V0IG9mIGxpdmUgc3RhdGUsIHdoZXJlIDkuMjguMCBsZXQgaXQgaW4g4oCUIGEgcnVuLW5hbWVzcGFjZWQgcmVhZFxuICAgKiB0aGF0IGZhbGxzIGJhY2sgdG8gYSBnbG9iYWwga2V5IHdvdWxkIHRoZW4gZW5kIGRpZmZlcmVudGx5ICh0aGVcbiAgICogZGlmZmVyZW50aWFsJ3MgTkVTVEVEIGZhbWlseSBmYWlscyB3aXRoaW4gMTAwIHByb2dyYW1zIHRoYXQgd2F5KS5cbiAgICpcbiAgICogQ29waWVzIG5vdGhpbmcgd2hlbiB0aGUgYmFzZSBob2xkcyBubyBjb250YWluZXIgYXQgYHBhdGhgLCBhbmQgbm90aGluZ1xuICAgKiB0d2ljZTogYSBwYXRoIGF0IG9yIGJlbG93IGFuIGVhcmxpZXIgZGV0YWNoIGlzIGFscmVhZHkgcHJpdmF0ZS4gTyhwYXRoKVxuICAgKiBvdGhlcndpc2UsIHBsdXMgTyh2YWx1ZSkgb25jZSBwZXIgZGV0YWNoZWQgcGF0aC5cbiAgICovXG4gIGRldGFjaEJhc2UocGF0aDogKHN0cmluZyB8IG51bWJlcilbXSk6IHZvaWQge1xuICAgIGlmIChwYXRoLmxlbmd0aCA9PT0gMCB8fCAhaXNDb250YWluZXIodGhpcy5iYXNlU25hcHNob3QpKSByZXR1cm47XG4gICAgbGV0IGF0OiBvYmplY3QgPSB0aGlzLmJhc2VTbmFwc2hvdDtcbiAgICBmb3IgKGNvbnN0IGsgb2YgcGF0aCkge1xuICAgICAgaWYgKHRoaXMuZGV0YWNoZWRCYXNlPy5oYXMoYXQpKSByZXR1cm47XG4gICAgICBjb25zdCBjaGlsZCA9IG93bkNoaWxkKGF0LCBrKTtcbiAgICAgIGlmICghaXNDb250YWluZXIoY2hpbGQpKSByZXR1cm47XG4gICAgICBhdCA9IGNoaWxkO1xuICAgIH1cbiAgICBpZiAodGhpcy5kZXRhY2hlZEJhc2U/LmhhcyhhdCkpIHJldHVybjtcbiAgICBjb25zdCBvd25lZCA9ICh0aGlzLmJhc2VPd25lZCA/Pz0gbmV3IFdlYWtTZXQ8b2JqZWN0PigpKTtcbiAgICBpZiAoIW93bmVkLmhhcyh0aGlzLmJhc2VTbmFwc2hvdCkpIHRoaXMuYmFzZVNuYXBzaG90ID0gb3duZWRSb290T2YodGhpcy5iYXNlU25hcHNob3QsIG93bmVkKTtcbiAgICBvd25TcGluZSh0aGlzLmJhc2VTbmFwc2hvdCwgcGF0aCwgb3duZWQpO1xuICAgIGNvbnN0IGNvcHk6IG9iamVjdCA9IHN0cnVjdHVyZWRDbG9uZShhdCk7XG4gICAgKHRoaXMuZGV0YWNoZWRCYXNlID8/PSBuZXcgV2Vha1NldDxvYmplY3Q+KCkpLmFkZChjb3B5KTtcbiAgICBfc2V0KHRoaXMuYmFzZVNuYXBzaG90LCBwYXRoLCBjb3B5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcml2YXRlIHJlYWRzICg5LjI5LjApOiBtYWtlIHRoZSB2YWx1ZSBhdCBgcGF0aGAgdGhlIHN0YWdlJ3Mgb3duIGJlZm9yZVxuICAgKiBhIHJlYWQgaGFuZHMgaXQgb3V0IOKAlCBzbyBhIHJlYWQgYWZ0ZXIgdGhlIHN0YWdlJ3MgZmlyc3Qgd3JpdGUgYmVoYXZlc1xuICAgKiBleGFjdGx5IGFzIGl0IGRpZCB3aGVuIHRoZSBidWZmZXIgYmVnYW4gd2l0aCBhIGRlZXAgY2xvbmUgb2YgdGhlIHdob2xlXG4gICAqIHN0YXRlLiBBbiBpbi1wbGFjZSBlZGl0IG9mIHdoYXQgdGhlIHJlYWQgcmV0dXJuZWQgKG91dCBvZiBjb250cmFjdCDigJRcbiAgICogcmVhZHMgYXJlIGJvcnJvd2VkKSBzdGF5cyBpbnNpZGUgdGhlIGJ1ZmZlciwgYW5kIGNvbW1pdHRlZCBzdGF0ZSBpcyBuZXZlclxuICAgKiB0b3VjaGVkLiBXaGV0aGVyIHRoZSBSRUNPUkQga2VlcHMgaXQgaXMgdGhlIGFkbWl0dGVkIHJlY29yZCdzIGxhd1xuICAgKiAoOS4zMC4wLCBvd25lciBydWxpbmcgUjEg4oCUIHRoZSByZWNvcmQga2VlcHMgd2hhdCB0aGUgc3RhZ2UgcmVhZCBiYWNrKTogaXRcbiAgICogaXMga2VwdCB3aGVuIHRoZSBlZGl0ZWQgdmFsdWUgbGllcyBhdCBvciBiZWxvdyBhIHBhdGggdGhlIHN0YWdlIHdyb3RlIGluXG4gICAqIHRoaXMgc3RhZ2Ug4oCUIHNldCwgbWVyZ2VkIG9yIHdyaXR0ZW4gYmFjayBhbGlrZSDigJQgYW5kIGxvc3Qgb3RoZXJ3aXNlLlxuICAgKlxuICAgKiBXYWxraW5nIHRoZSBwYXRoIGZyb20gdGhlIChvd25lZCkgcm9vdDpcbiAgICogIC0gYSBjb250YWluZXIgc3RpbGwgU0hBUkVEIHdpdGggY29tbWl0dGVkIHN0YXRlIGF0IHRoZSBzYW1lIHBvc2l0aW9uIGlzXG4gICAqICAgIHJlcGxhY2VkIGJ5IGEgcHJpdmF0ZSBkZWVwIGNvcHkgd2hlbiBpdCBpcyB0aGUgdmFsdWUgcmVhZCwgb3IgYnkgYVxuICAgKiAgICBzaGFsbG93IGNvcHkgd2hlbiBpdCBpcyBhIGNvbnRhaW5lciBvbiB0aGUgd2F5IHRvIGl0IChzbyBhIHJlYWQgb2ZcbiAgICogICAgYGtgIHVuZGVyIGEgZm9yayBjaGlsZCdzIGFkZHJlc3MgY29waWVzIGBrYCwgbm90IGV2ZXJ5IGNoaWxkJ3MgbmFtZXNwYWNlKTtcbiAgICogIC0gYSBjb250YWluZXIgdGhlIHN0YWdlIFNUQUdFRCAob3IgYW55dGhpbmcgZWxzZSB0aGUgYnVmZmVyIGRpZCBub3RcbiAgICogICAgdGFrZSBmcm9tIGNvbW1pdHRlZCBzdGF0ZSkgaXMgaGFuZGVkIGJhY2sgYnkgcmVmZXJlbmNlLCBhcyBiZWZvcmU7XG4gICAqICAtIGEgY29udGFpbmVyIHRoZSBidWZmZXIgb3ducyBpcyB3YWxrZWQgb24g4oCUIGFuZCB3aGVuIGl0IGlzIHRoZSB2YWx1ZVxuICAgKiAgICByZWFkLCBpdHMgc3RpbGwtc2hhcmVkIGRlc2NlbmRhbnRzIGFyZSBwcml2YXRpc2VkXG4gICAqICAgICh7QGxpbmsgcHJpdmF0aXNlQmVsb3d9KS5cbiAgICpcbiAgICogQ29zdDogTyhwYXRoKSBwZXIgcmVhZCwgcGx1cyBPKHZhbHVlKSBPTkNFIHBlciBzaGFyZWQgY29udGFpbmVyIGEgc3RhZ2VcbiAgICogcmVhZHMgYWZ0ZXIgaXRzIGZpcnN0IHdyaXRlLiBBIHN0YWdlIHRoYXQgbmV2ZXIgcmVhZHMgYWZ0ZXIgd3JpdGluZyBwYXlzXG4gICAqIG5vdGhpbmc7IGEgcmVhZCBiZWZvcmUgdGhlIGZpcnN0IHdyaXRlIG5ldmVyIHJlYWNoZXMgdGhlIGJ1ZmZlci5cbiAgICovXG4gIHByaXZhdGUgcHJpdmF0aXNlKHBhdGg6IChzdHJpbmcgfCBudW1iZXIpW10pOiB2b2lkIHtcbiAgICBpZiAocGF0aC5sZW5ndGggPT09IDApIHJldHVybjtcbiAgICAvLyBSZXNvbHZlIGZpcnN0OiBhIHJlYWQgdGhhdCBsYW5kcyBvbiBub3RoaW5nIChhIG1pc3Npbmcga2V5LCBhIHJlZnVzZWRcbiAgICAvLyBzZWdtZW50LCBhIHByaW1pdGl2ZSkgcmV0dXJucyBub3RoaW5nIGFuZCBtdXN0IGNvcHkgbm90aGluZy5cbiAgICBjb25zdCBjaGFpbjogb2JqZWN0W10gPSBbXTtcbiAgICBsZXQgYXQ6IHVua25vd24gPSB0aGlzLndvcmtpbmdDb3B5O1xuICAgIGZvciAoY29uc3QgayBvZiBwYXRoKSB7XG4gICAgICBhdCA9IG93bkNoaWxkKGF0LCBrKTtcbiAgICAgIGlmICghaXNDb250YWluZXIoYXQpKSByZXR1cm47XG4gICAgICBjaGFpbi5wdXNoKGF0KTtcbiAgICB9XG4gICAgbGV0IHBhcmVudDogYW55ID0gdGhpcy53b3JraW5nQ29weTtcbiAgICBsZXQgYmFzZTogdW5rbm93biA9IHRoaXMuYmFzZVNuYXBzaG90O1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGF0aC5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgayA9IHBhdGhbaV07XG4gICAgICBjb25zdCBhdEJhc2UgPSBvd25DaGlsZChiYXNlLCBrKTtcbiAgICAgIGxldCB2YWx1ZSA9IGNoYWluW2ldO1xuICAgICAgaWYgKCF0aGlzLm93bmVkLmhhcyh2YWx1ZSkpIHtcbiAgICAgICAgaWYgKHZhbHVlICE9PSBhdEJhc2UgfHwgdGhpcy5zdGFnZWQuaGFzKHZhbHVlKSkgcmV0dXJuO1xuICAgICAgICBpZiAoaSA9PT0gcGF0aC5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgcHV0T3duKHBhcmVudCwgaywgdGhpcy5wcml2YXRlQ29weU9mKHZhbHVlKSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHZhbHVlID0gc2hhbGxvd0NvcHkodmFsdWUpO1xuICAgICAgICB0aGlzLm93bmVkLmFkZCh2YWx1ZSk7XG4gICAgICAgIHB1dE93bihwYXJlbnQsIGssIHZhbHVlKTtcbiAgICAgIH1cbiAgICAgIHBhcmVudCA9IHZhbHVlO1xuICAgICAgYmFzZSA9IGF0QmFzZTtcbiAgICB9XG4gICAgdGhpcy5wcml2YXRpc2VCZWxvdyhwYXJlbnQsIGJhc2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFuIE9XTkVEIGNvbnRhaW5lciBpcyBhYm91dCB0byBiZSByZWFkIHdob2xlIChhIHBhdGggY29weSBhIG5lc3RlZCB3cml0ZVxuICAgKiBtYWRlLCBzYXkpOiBpdHMgZGVzY2VuZGFudHMgc3RpbGwgc2hhcmVkIHdpdGggY29tbWl0dGVkIHN0YXRlIGFyZVxuICAgKiByZXBsYWNlZCBieSBwcml2YXRlIGRlZXAgY29waWVzLCBzbyBub3RoaW5nIHRoZSByZWFkIGhhbmRzIG91dCBpc1xuICAgKiBjb21taXR0ZWQgc3RhdGUuIFdhbGtzIG93bmVkIGNvbnRhaW5lcnMgb25seTsgbWFya3MgZWFjaCBvbmUgZmluaXNoZWRcbiAgICogKHtAbGluayBwcml2YXRlVHJlZXN9KSwgc28gYSBjb250YWluZXIgaXMgc2Nhbm5lZCBvbmNlIHBlciBzdGFnZS5cbiAgICovXG4gIHByaXZhdGUgcHJpdmF0aXNlQmVsb3coY29udGFpbmVyOiBvYmplY3QsIGJhc2U6IHVua25vd24pOiB2b2lkIHtcbiAgICBjb25zdCB3b3JrOiBBcnJheTxbb2JqZWN0LCB1bmtub3duXT4gPSBbW2NvbnRhaW5lciwgYmFzZV1dO1xuICAgIHdoaWxlICh3b3JrLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IFtub2RlLCBub2RlQmFzZV0gPSB3b3JrLnBvcCgpITtcbiAgICAgIGlmICh0aGlzLnByaXZhdGVUcmVlcy5oYXMobm9kZSkpIGNvbnRpbnVlO1xuICAgICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMobm9kZSkpIHtcbiAgICAgICAgY29uc3QgY2hpbGQgPSBvd25DaGlsZChub2RlLCBrZXkpO1xuICAgICAgICBpZiAoIWlzQ29udGFpbmVyKGNoaWxkKSkgY29udGludWU7XG4gICAgICAgIGNvbnN0IGF0QmFzZSA9IG93bkNoaWxkKG5vZGVCYXNlLCBrZXkpO1xuICAgICAgICBpZiAodGhpcy5vd25lZC5oYXMoY2hpbGQpKSB3b3JrLnB1c2goW2NoaWxkLCBhdEJhc2VdKTtcbiAgICAgICAgZWxzZSBpZiAoY2hpbGQgPT09IGF0QmFzZSAmJiAhdGhpcy5zdGFnZWQuaGFzKGNoaWxkKSkge1xuICAgICAgICAgIHB1dE93bihub2RlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LCBrZXksIHRoaXMucHJpdmF0ZUNvcHlPZihjaGlsZCkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLnByaXZhdGVUcmVlcy5hZGQobm9kZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqIEEgcHJpdmF0ZSBkZWVwIGNvcHkgb2YgYSBjb21taXR0ZWQgY29udGFpbmVyIOKAlCBvd25lZCB0aHJvdWdoIGFuZCB0aHJvdWdoLiAqL1xuICBwcml2YXRlIHByaXZhdGVDb3B5T2YodmFsdWU6IG9iamVjdCk6IG9iamVjdCB7XG4gICAgY29uc3QgY29weSA9IHN0cnVjdHVyZWRDbG9uZSh2YWx1ZSk7XG4gICAgYWRvcHQoY29weSwgdGhpcy5vd25lZCk7XG4gICAgdGhpcy5wcml2YXRlVHJlZXMuYWRkKGNvcHkpO1xuICAgIHJldHVybiBjb3B5O1xuICB9XG5cbiAgLyoqXG4gICAqIERpZCBhbnkgc3RhZ2VkIG9wIHRvdWNoIGBwYXRoYCwgb3IgYSBwYXRoIGFib3ZlIG9yIGJlbG93IGl0P1xuICAgKlxuICAgKiBUaGUgZGV2LW1vZGUgYm9ycm93ZWQtcmVhZCBjaGVjayAoYFN0YWdlQ29udGV4dC5jb21taXRgKSBhc2tzIHRoaXMgYmVmb3JlXG4gICAqIGFjY3VzaW5nIGEgc3RhZ2Ugb2YgbXV0YXRpbmcgYSB2YWx1ZSBpbiBwbGFjZTogYSBrZXkgdGhlIHN0YWdlIGxlZ2l0aW1hdGVseVxuICAgKiBXUk9URSBpcyBleHBlY3RlZCB0byBkaWZmZXIgZnJvbSB3aGF0IGl0IHJlYWQsIGFuZCB3cml0ZXMgcmVhY2ggdGhlIGJ1ZmZlclxuICAgKiBmcm9tIHBhdGhzIHRoYXQgYnlwYXNzIHVzZXItbGV2ZWwgd3JpdGUgdHJhY2tpbmcgdG9vICh0aGUgc3ViZmxvdyBzZWVkLFxuICAgKiBgb3V0cHV0TWFwcGVyYCBtZXJnZS1iYWNrLCB0aGUgcmVzdW1lIHJlLXNlZWQpLiBEZXYtbW9kZSBvbmx5IOKAlCBub3RoaW5nIG9uXG4gICAqIHRoZSBob3QgcGF0aCBjYWxscyBpdC5cbiAgICovXG4gIHdhc1N0YWdlZChwYXRoOiAoc3RyaW5nIHwgbnVtYmVyKVtdKTogYm9vbGVhbiB7XG4gICAgY29uc3QgdGFyZ2V0ID0gbm9ybWFsaXNlUGF0aChwYXRoKTtcbiAgICBmb3IgKGNvbnN0IG9wIG9mIHRoaXMub3BUcmFjZSkge1xuICAgICAgLy8gT24gdGhlIHBhdGgsIGJlbG93IGl0IG9yIGFib3ZlIGl0IOKAlCB0aGUgb25lIHBhdGggcmVsYXRpb24gZXZlcnkga2V5IHF1ZXJ5IGFza3MuXG4gICAgICBpZiAocmVsYXRpb24ob3AucGF0aCwgdGFyZ2V0KSAhPT0gdW5kZWZpbmVkKSByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIEZsdXNoIGFsbCBzdGFnZWQgbXV0YXRpb25zIGFuZCByZXR1cm4gdGhlIGNvbW1pdCBidW5kbGUg4oCUIHJlY29yZGluZyB0aGVcbiAgICogc3RhZ2UncyBORVQgQ0hBTkdFLCBub3QgaXRzIHJhdyB3cml0ZSBsb2cuXG4gICAqXG4gICAqIOKUgOKUgCBXSFkgKHRoZSBkZWZlY3QgdGhpcyBmaXhlcykg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gICAqIFByZXZpb3VzbHkgZXZlcnkgYHNldGAvYG1lcmdlYCB3YXMgcmVjb3JkZWQgdmVyYmF0aW0sIHNvIHRoZSBjb21taXQgYnVuZGxlXG4gICAqIHdhcyBhIGxvZyBvZiAqb3BlcmF0aW9ucyogcmF0aGVyIHRoYW4gKmNoYW5nZXMqLiBUd28gb3BlcmF0aW9ucyBwcm9kdWNlIG5vXG4gICAqIG5ldCBjaGFuZ2UgeWV0IHdlcmUgc3RpbGwgY29tbWl0dGVkIGFzIFwibXV0YXRpb25zXCI6XG4gICAqXG4gICAqICAgMS4gTm8tb3Agd3JpdGUgICDigJQgd3JpdGluZyBhIGtleSB0aGUgdmFsdWUgaXQgYWxyZWFkeSBob2xkcyAoZS5nLiBhblxuICAgKiAgICAgICAgICAgICAgICAgICAgICBhZ2VudCBjb250ZXh0IHNsb3QgcmUtZW1pdHRpbmcgaWRlbnRpY2FsIGNvbnRlbnQgZXZlcnlcbiAgICogICAgICAgICAgICAgICAgICAgICAgdHVybikuIGJhc2UgSz0xLCBzdGFnZSB3cml0ZXMgSz0xLlxuICAgKiAgIDIuIFdyaXRlLXJldmVydCAg4oCUIGNoYW5naW5nIHRoZW4gcmVzdG9yaW5nIGEga2V5IHdpdGhpbiBvbmUgc3RhZ2UuXG4gICAqICAgICAgICAgICAgICAgICAgICAgIGJhc2UgSz0xLCBzdGFnZSB3cml0ZXMgSz0yIHRoZW4gSz0xLlxuICAgKlxuICAgKiBSZWNvcmRpbmcgdGhlc2UgYXMgbXV0YXRpb25zIChhKSBibG9hdGVkIGNhdXNhbCBzbGljaW5nIC8gYmFja3RyYWNraW5nIHdpdGhcbiAgICogc3B1cmlvdXMgZGVwZW5kZW5jaWVzIG9uIGludGVybWVkaWF0ZSB2YWx1ZXMgdGhhdCBuZXZlciByZWFjaCBmaW5hbCBzdGF0ZSxcbiAgICogYW5kIChiKSBtYWRlIGRvd25zdHJlYW0gXCJ3aGF0IGNoYW5nZWQgaGVyZT9cIiBjb25zdW1lcnMgbGlnaHQgdXAgc3RhZ2VzIHRoYXRcbiAgICogY2hhbmdlZCBub3RoaW5nIOKAlCBtb3N0IHZpc2libHkgdGhlIGxlbnMgaGlnaGxpZ2h0IGZsYWdnaW5nIGV2ZXJ5IHNsb3QuXG4gICAqXG4gICAqIOKUgOKUgCBIT1cg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gICAqIEF0IGNvbW1pdCB3ZSBob2xkIEJPVEggYGJhc2VTbmFwc2hvdGAgKHN0YXRlIHdoZW4gdGhlIHN0YWdlIGJlZ2FuKSBhbmRcbiAgICogYHdvcmtpbmdDb3B5YCAoc3RhdGUgYWZ0ZXIgYWxsIGl0cyB3cml0ZXMpLiBGb3IgZWFjaCBwYXRoIHRoZSBzdGFnZSB0b3VjaGVkXG4gICAqIHdlIGtlZXAgaXQgaW4gdGhlIGJ1bmRsZSBPTkxZIGlmIGl0cyBmaW5hbCB2YWx1ZSBkaWZmZXJzIGZyb20gdGhlIGJhc2VcbiAgICogdmFsdWUgKHtAbGluayBkZWVwRXF1YWx9KS4gTm8tb3AgQU5EIHdyaXRlLXJldmVydCBwYXRocyBkcm9wIG91dCwgYmVjYXVzZVxuICAgKiBib3RoIGNvbXBhcmUgZXF1YWwgdG8gYmFzZS4gVGhpcyBpcyBhIHNpbmdsZSBuZXQtZGVsdGEgZGlmZiBhdCBjb21taXQgdGltZVxuICAgKiDigJQgb25lIGRlZXAgY29tcGFyZSBwZXIgdG91Y2hlZCBwYXRoLCBPKGNoYW5nZWQgc3RhdGUpLCBwYWlkIG9uY2UgcGVyIHN0YWdlXG4gICAqIChOT1QgcGVyIHdyaXRlKS4gQSBuYWl2ZSBwZXItd3JpdGUgZGVlcC1lcXVhbCBza2lwIHdvdWxkIGJlIG1vcmUgZXhwZW5zaXZlXG4gICAqIGFuZCB3b3VsZCBzdGlsbCBtaXNzIHdyaXRlLXJldmVydCAodGhlIGludGVybWVkaWF0ZSB3cml0ZSBkaWZmZXJzIGZyb20gdGhlXG4gICAqIHZhbHVlIHByZXNlbnQgYXQgdGhlIG1vbWVudCBvZiB3cml0aW5nKS5cbiAgICpcbiAgICog4pSA4pSAIFRXTyBIT05FU1QgVElFUlMgKGJ5IGRlc2lnbiDigJQgZG8gbm90IFwidW5pZnlcIiB0aGVtKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgICogICDigKIgY29tbWl0IChoZXJlKSAgID0gQ0hBTkdFLWxldmVsIOKAlCB0cnV0aGZ1bCBuZXQgZGVsdGEuIEZlZWRzIHRoZSBjb21taXRcbiAgICogICAgICAgICAgICAgICAgICAgICAgIGxvZywgY2F1c2FsIGNoYWluLCBuYXJyYXRpdmUsIGFuZCB0aGUgbGVucyBoaWdobGlnaHQuXG4gICAqICAg4oCiIGBvbldyaXRlYCBldmVudCA9IE9QLWxldmVsIOKAlCBmaXJlcyBvbiBFVkVSWSB3cml0ZSBhdHRlbXB0IHJlZ2FyZGxlc3Mgb2ZcbiAgICogICAgICAgICAgICAgICAgICAgICAgIG5ldCBjaGFuZ2UuIEZlZWRzIG1ldHJpY3MgLyBiZWhhdmlvdXJhbCBvYnNlcnZhYmlsaXR5XG4gICAqICAgICAgICAgICAgICAgICAgICAgICAoYSBkZWJ1Z2dlciB3YW50cyB0byBzZWUgXCJ3cm90ZSAyLCB0aGVuIHJldmVydGVkXCIpLlxuICAgKiBgb25Xcml0ZWAgaXMgdW5jaGFuZ2VkIGJ5IHRoaXMgbWV0aG9kOyBvbmx5IHRoZSBDT01NSVQgYmVjb21lcyBjaGFuZ2Utb25seS5cbiAgICpcbiAgICog4pSA4pSAIEVNUFRZIENPTU1JVFMgQVJFIElOVEVOVElPTkFMIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAgKiBBIHN0YWdlIHRoYXQgbmV0cyBubyBjaGFuZ2UgY29tbWl0cyBhbiBFTVBUWSBwYXRjaCDigJQgTk9UIG5vdGhpbmcuXG4gICAqIHtAbGluayBTdGFnZUNvbnRleHQuY29tbWl0fSBzdGlsbCByZWNvcmRzIHRoZSBidW5kbGUgdW5jb25kaXRpb25hbGx5LCBzb1xuICAgKiBldmVyeSBleGVjdXRlZCBzdGFnZSByZW1haW5zIGEgdGltZS10cmF2ZWwgY3Vyc29yIHN0b3AgKGl0cyBgcnVudGltZVN0YWdlSWRgXG4gICAqIG1hcmtlciBpcyBwcmVzZXJ2ZWQpOyBvbmx5IGl0cyBQQVRDSCBpcyBlbXB0eS4gVGhpcyBpcyB3aGF0IGtlZXBzIHRoZVxuICAgKiBjb21taXQtaW5kZXhlZCBzbGlkZXIgc3RhYmxlIHdoaWxlIG1ha2luZyB0aGUgaGlnaGxpZ2h0IHRydXRoZnVsLlxuICAgKlxuICAgKiDilIDilIAgS05PV04gTElNSVRBVElPTlMgLyBGVVRVUkUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gICAqICAg4oCiIEV4cGxpY2l0IGtleSBERUxFVElPTiB1bmRlciB0aGUgZGVmYXVsdCAnZnVsbCcgbW9kZSBpcyBzdGlsbFxuICAgKiAgICAgZmxhdHRlbmVkIHRvIHNldC1vZi1gdW5kZWZpbmVkYCAoYSByZW1vdmVkIGtleSBjYW5ub3QgYmUgZXhwcmVzc2VkXG4gICAqICAgICBpbiBNZW1vcnlQYXRjaCBhbG9uZSkuIENMT1NFRCB1bmRlciBgY29tbWl0VmFsdWVzOiAnZGVsdGEnYCAoIzEzYy1CKTpcbiAgICogICAgIHtAbGluayBkZWxldGV9IHN0YWdlcyBhIGRpc3RpbmN0IG9wIGFuZCB0aGUgYnVuZGxlIGNhcnJpZXMgYSByZWFsXG4gICAqICAgICBgZGVsZXRlYCB0cmFjZSB2ZXJiIHdob3NlIHJlcGxheSByZW1vdmVzIHRoZSBrZXkuXG4gICAqICAg4oCiIEFycmF5LW1lcmdlIGRlZHVwIGluIHtAbGluayBkZWVwU21hcnRNZXJnZX0gc3RpbGwgdXNlcyByZWZlcmVuY2UgZXF1YWxpdHlcbiAgICogICAgIChgbmV3IFNldGApLCBzbyBkZWVwLWVxdWFsICpvYmplY3RzKiBpbiBhIG1lcmdlZCBhcnJheSBhcmUgbm90IGRlZHVwZWQuXG4gICAqICAgICBPcnRob2dvbmFsIHRvIHRoaXMgY2hhbmdlOyB0cmFja2VkIHNlcGFyYXRlbHkuXG4gICAqXG4gICAqIFJlc2V0cyB0aGUgYnVmZmVyIHRvIGVtcHR5IHN0YXRlIGFmdGVyIGNvbW1pdC5cbiAgICovXG4gIGNvbW1pdCgpOiB7XG4gICAgb3ZlcndyaXRlOiBNZW1vcnlQYXRjaDtcbiAgICB1cGRhdGVzOiBNZW1vcnlQYXRjaDtcbiAgICByZWRhY3RlZFBhdGhzOiBTZXQ8c3RyaW5nPjtcbiAgICB0cmFjZTogVHJhY2VFbnRyeVtdO1xuICB9IHtcbiAgICBjb25zdCByb3dzID0gdGhpcy5jb21taXRWYWx1ZXMgPT09ICdkZWx0YScgPyB0aGlzLnRvRGVsdGFQYXlsb2FkKCkgOiB0aGlzLnRvQ2hhbmdlT25seVBheWxvYWQoKTtcbiAgICBjb25zdCByZWRhY3RlZFBhdGhzID0gdGhpcy5zdXJ2aXZpbmdSZWRhY3RlZFBhdGhzKG5ldyBTZXQocm93cy50cmFjZS5tYXAoKHQpID0+IHQucGF0aCkpKTtcbiAgICAvLyBUaGUgYnVuZGxlJ3Mga2V5IG9yZGVyIGlzIGByZWNvcmRDb21taXRgJ3M7IGEgZGlyZWN0IGNhbGxlciBrZWVwcyB0aGlzIHNhbWUgb3JkZXIuXG4gICAgY29uc3QgcGF5bG9hZCA9IHsgb3ZlcndyaXRlOiByb3dzLm92ZXJ3cml0ZSwgdXBkYXRlczogcm93cy51cGRhdGVzLCByZWRhY3RlZFBhdGhzLCB0cmFjZTogcm93cy50cmFjZSB9O1xuXG4gICAgdGhpcy5vdmVyd3JpdGVQYXRjaCA9IHt9O1xuICAgIHRoaXMudXBkYXRlUGF0Y2ggPSB7fTtcbiAgICB0aGlzLm9wVHJhY2UubGVuZ3RoID0gMDtcbiAgICB0aGlzLnJlZGFjdGVkUGF0aHMuY2xlYXIoKTtcbiAgICB0aGlzLmhlbGRSZWZzLmNsZWFyKCk7XG4gICAgdGhpcy53b3JraW5nQ29weSA9IHt9O1xuICAgIHRoaXMub3duZWQgPSBuZXcgV2Vha1NldCgpO1xuICAgIHRoaXMub3duZWQuYWRkKHRoaXMud29ya2luZ0NvcHkpO1xuICAgIHRoaXMuc3RhZ2VkID0gbmV3IFdlYWtTZXQoKTtcbiAgICB0aGlzLnByaXZhdGVUcmVlcyA9IG5ldyBXZWFrU2V0KCk7XG4gICAgdGhpcy5zdGFnZWRNZXJnZXMgPSAwO1xuICAgIHRoaXMubmVzdGVkT3BzID0gMDtcblxuICAgIHJldHVybiBwYXlsb2FkO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlYnVpbGQgb3ZlcndyaXRlIC8gdXBkYXRlcyAvIHRyYWNlIGtlZXBpbmcgT05MWSBwYXRocyB3aG9zZSBmaW5hbCB2YWx1ZVxuICAgKiBkaWZmZXJzIGZyb20gdGhlIGJhc2UgdmFsdWUg4oCUIGkuZS4gdGhlIHN0YWdlJ3MgbmV0IGNoYW5nZS4gU2VlXG4gICAqIHtAbGluayBUcmFuc2FjdGlvbkJ1ZmZlci5jb21taXR9IGZvciB0aGUgcmF0aW9uYWxlLlxuICAgKlxuICAgKiBQYXRocyBhcmUgY29tcGFyZWQgYXQgdGhlIGV4YWN0IGdyYW51bGFyaXR5IHRoZXkgd2VyZSB3cml0dGVuIChlYWNoIHRyYWNlXG4gICAqIGVudHJ5J3MgcGF0aCksIGFnYWluc3QgYHdvcmtpbmdDb3B5YCAoZmluYWwpIHZzIGBiYXNlU25hcHNob3RgIChzdGFydCkuXG4gICAqIFN1cnZpdmluZyBgc2V0YCBwYXRocyBjb3B5IHRoZWlyIGZpbmFsIHZhbHVlIGZyb20gYG92ZXJ3cml0ZVBhdGNoYDtcbiAgICogc3Vydml2aW5nIGBtZXJnZWAgcGF0aHMgY29weSB0aGVpciBhY2N1bXVsYXRlZCBkZWx0YSBmcm9tIGB1cGRhdGVQYXRjaGAsXG4gICAqIGtlZXBpbmcgdGhlIHNldC12cy1tZXJnZSB2ZXJiIOKAlCBhbmQgdGhlIHJlc3VsdCBpcyBBRE1JVFRFRCAoe0BsaW5rIGFkbWl0fSk6XG4gICAqIGEgZmFtaWx5IG9mIHJvd3Mgd2hvc2UgcmVwbGF5IGRvZXMgbm90IGdpdmUgYmFjayB3aGF0IHRoZSBzdGFnZSByZWFkIGlzXG4gICAqIHJlY29yZGVkIGFzIGBzZXRgIHJvd3Mgb2YgdGhlIHJlYWQtYmFjayBpbnN0ZWFkICg5LjMwLjApLlxuICAgKlxuICAgKiBUaGlzIGlzIHRoZSBERUZBVUxUIChgY29tbWl0VmFsdWVzOiAnZnVsbCdgKSBwYXlsb2FkLCBpbmNsdWRpbmcgdGhlXG4gICAqIGhpc3RvcmljYWwgZmxhdHRlbmluZyBvZiBzdGFnZWQgYGRlbGV0ZWAgb3BzIGludG8gYHNldGAtb2YtYHVuZGVmaW5lZGBcbiAgICogdHJhY2UgZW50cmllcy4gVGhlIGRlbHRhIGVuY29kaW5nIGxpdmVzIGluIHtAbGluayB0b0RlbHRhUGF5bG9hZH0uXG4gICAqXG4gICAqIFdvcmssIG5vdCBieXRlcyAoOS4yMi4xKTogdGhlIG5ldC1jaGFuZ2UgdmVyZGljdCBpcyBwYWlkIG9uY2UgcGVyIFBBVEhcbiAgICogYW5kIHRoZSBjbG9uZSBvbmNlIHBlciBDT05TRUNVVElWRSBydW4gb2Ygb3BzIG9uIGEgcGF0aCwgbm90IG9uY2UgcGVyIG9wXG4gICAqIOKAlCBzZWUgdGhlIHR3byBtZW1vcyBpbnNpZGUuIFBpbm5lZCBieVxuICAgKiB0ZXN0L2xpYi9tZW1vcnkvc2NlbmFyaW8vcmVwZWF0ZWQtcGF0aC1ieXRlLWlkZW50aXR5LnRlc3QudHMgYWdhaW5zdCB0aGVcbiAgICogOS4yMi4wIGJ5dGVzLiBTaW5jZSA5LjIzLjAgdGhhdCBjbG9uZSBpcyBUSEUgY2xvbmU6IHRoZSBwYXRjaCB0cmVlcyBob2xkXG4gICAqIHRoZSBjYWxsZXIncyByZWZlcmVuY2VzIChzZWUgdGhlIGNsYXNzIGhlYWRlciksIHNvIHRoaXMgbG9vcCBpcyB0aGUgb25lXG4gICAqIHBsYWNlIHRoZSByZWNvcmQgaXMgZGV0YWNoZWQgZnJvbSB0aGVtLlxuICAgKi9cbiAgcHJpdmF0ZSB0b0NoYW5nZU9ubHlQYXlsb2FkKCk6IFJvd3Mge1xuICAgIHJldHVybiB0aGlzLmFkbWl0KChsb3NzeSkgPT4gdGhpcy5jaGFuZ2VPbmx5Um93cyhsb3NzeSkpO1xuICB9XG5cbiAgLyoqIFRoZSAnZnVsbCcgcm93czsgYSBmYW1pbHkgaW4gYGxvc3N5YCBpcyB3cml0dGVuIGFzIGl0cyByZWFkLWJhY2ssIGF0IGl0cyBsYXN0IHRvdWNoICh7QGxpbmsgZW1pdFJlYWRCYWNrfSkuICovXG4gIHByaXZhdGUgY2hhbmdlT25seVJvd3MobG9zc3k6IExvc3N5IHwgdW5kZWZpbmVkKTogUm93cyB7XG4gICAgY29uc3Qgcm93czogUm93cyA9IHsgb3ZlcndyaXRlOiB7fSwgdXBkYXRlczoge30sIHRyYWNlOiBbXSB9O1xuICAgIGNvbnN0IHsgb3ZlcndyaXRlLCB1cGRhdGVzLCB0cmFjZSB9ID0gcm93cztcbiAgICAvLyBQZXIgUEFUSCwgZGVjaWRlZCBvbmNlICg5LjIyLjEpOiBiYXNlIGFuZCBmaW5hbCB2YWx1ZSBhcmUgZml4ZWQgYXRcbiAgICAvLyBjb21taXQsIHNvIGV2ZXJ5IGxhdGVyIG9wIG9uIGEgcGF0aCBnZXRzIHRoZSB2ZXJkaWN0IGl0cyBmaXJzdCBvcCBnb3QuXG4gICAgLy8gYHVuZGVmaW5lZGAgPSBub3QgeWV0IGRlY2lkZWQ7IHRoZSBzdXJ2aXZpbmcgcGF0aHMgYXJlIHRoZSBgdHJ1ZWAga2V5cy5cbiAgICBjb25zdCBzdXJ2aXZlcyA9IG5ldyBNYXA8c3RyaW5nLCBib29sZWFuPigpO1xuICAgIC8vIFRoZSBwYXRoIHRoZSBMQVNUIHN1cnZpdmluZyBvcCBjb3BpZWQgaW50byBlYWNoIHBhdGNoIHRyZWUgKDkuMjIuMSkuXG4gICAgLy8gVGhlIHZhbHVlIGF0IGEgcGF0aCBpcyBmaXhlZCBhdCBjb21taXQsIHNvIGFuIG9wIHdob3NlIHByZWRlY2Vzc29yIG9uXG4gICAgLy8gdGhlIFNBTUUgdHJlZSBhbHJlYWR5IGNvcGllZCB0aGF0IHBhdGggd291bGQgd3JpdGUgdGhlIHNhbWUgYnl0ZXMgb3ZlclxuICAgIC8vIHRoZSBzYW1lIGtleSDigJQgaXQga2VlcHMgaXRzIHRyYWNlIHJvdyAodGhlIGxvZyBpcyBieXRlLWlkZW50aWNhbCkgYW5kXG4gICAgLy8gcGF5cyBubyBzZWNvbmQgY2xvbmUuIFRoZSA5LjIyLjAgZWxlbWVudC13cml0ZSBmdW5uZWwgc3RhZ2VzIE5cbiAgICAvLyB3aG9sZS1hcnJheSBzZXRzIG9uIE9ORSBwYXRoOyB0aGlzIGlzIHdoYXQgbWFrZXMgdGhhdCBjb21taXQgTyhOKVxuICAgIC8vIGluc3RlYWQgb2YgTyhOIMOXIG9wcykuIENPTlNFQ1VUSVZFIG9ubHkg4oCUIGFuIG9wIG9uIGFub3RoZXIgcGF0aCBpblxuICAgIC8vIGJldHdlZW4gbWF5IGhhdmUgY29lcmNlZCBvciBncm93biB0aGlzIG9uZSdzIGNvbnRhaW5lciAoYSBkZXNjZW5kYW50XG4gICAgLy8gYG5hdGl2ZVNldGAgdGhyb3VnaCBhIHByaW1pdGl2ZSwgYSBga2V5OiB1bmRlZmluZWRgIHNoZWxsKSBhbmQgdGhlXG4gICAgLy8gcmUtY29weSBpcyB3aGF0IHJlcGFpcnMgaXQ7IGEgYG1lcmdlYCBiZXR3ZWVuIHR3byBzZXRzIHRvdWNoZXMgdGhlXG4gICAgLy8gb3RoZXIgdHJlZSBhbmQgZG9lcyBub3QgY291bnQuIFNhbWUgbGF3IGFzIGBzdXBlcnNlZGVkQnlOZXh0U2V0YC5cbiAgICBsZXQgbGFzdFNldFBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBsZXQgbGFzdE1lcmdlUGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm9wVHJhY2UubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IG9wID0gdGhpcy5vcFRyYWNlW2ldO1xuICAgICAgY29uc3QgZmFtaWx5ID0gbG9zc3k/LmZhbWlsaWVzLmdldChsb3NzeS5yb290T2YuZ2V0KG9wLnBhdGgpIGFzIHN0cmluZyk7XG4gICAgICBpZiAoZmFtaWx5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKGkgPT09IGZhbWlseS5zbG90KSB7XG4gICAgICAgICAgdGhpcy5lbWl0UmVhZEJhY2soZmFtaWx5LCByb3dzLCAnZnVsbCcpO1xuICAgICAgICAgIGxhc3RTZXRQYXRoID0gbGFzdE1lcmdlUGF0aCA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGxldCBrZWVwID0gc3Vydml2ZXMuZ2V0KG9wLnBhdGgpO1xuICAgICAgaWYgKGtlZXAgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBrZWVwID0gdGhpcy5jaGFuZ2VkU2luY2VCYXNlKG9wLnBhdGguc3BsaXQoREVMSU0pKTtcbiAgICAgICAgc3Vydml2ZXMuc2V0KG9wLnBhdGgsIGtlZXApO1xuICAgICAgfVxuICAgICAgaWYgKCFrZWVwKSBjb250aW51ZTsgLy8gbm8tb3Agb3Igd3JpdGUtdGhlbi1yZXZlcnQg4oaSIG5vIG5ldCBjaGFuZ2VcblxuICAgICAgdHJhY2UucHVzaChmbGF0dGVuZWRUcmFjZVJvdyhvcCkpO1xuICAgICAgaWYgKG9wLnZlcmIgPT09ICdtZXJnZScpIHtcbiAgICAgICAgaWYgKGxhc3RNZXJnZVBhdGggPT09IG9wLnBhdGgpIGNvbnRpbnVlO1xuICAgICAgICBsYXN0TWVyZ2VQYXRoID0gb3AucGF0aDtcbiAgICAgICAgY29uc3Qgc2VnbWVudHMgPSBvcC5wYXRoLnNwbGl0KERFTElNKTtcbiAgICAgICAgX3NldCh1cGRhdGVzLCBzZWdtZW50cywgc3RydWN0dXJlZENsb25lKF9nZXQodGhpcy51cGRhdGVQYXRjaCwgc2VnbWVudHMpKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAobGFzdFNldFBhdGggPT09IG9wLnBhdGgpIGNvbnRpbnVlO1xuICAgICAgICBsYXN0U2V0UGF0aCA9IG9wLnBhdGg7XG4gICAgICAgIGNvbnN0IHNlZ21lbnRzID0gb3AucGF0aC5zcGxpdChERUxJTSk7XG4gICAgICAgIF9zZXQob3ZlcndyaXRlLCBzZWdtZW50cywgc3RydWN0dXJlZENsb25lKF9nZXQodGhpcy5vdmVyd3JpdGVQYXRjaCwgc2VnbWVudHMpKSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByb3dzO1xuICB9XG5cbiAgLyoqXG4gICAqIERlbHRhLWVuY29kZWQgcGF5bG9hZCAoYGNvbW1pdFZhbHVlczogJ2RlbHRhJ2AsICMxM2MtQikg4oCUIHNhbWUgbmV0LWNoYW5nZVxuICAgKiBmaWx0ZXIgYXMge0BsaW5rIHRvQ2hhbmdlT25seVBheWxvYWR9LCB0aHJlZSBlbmNvZGluZyBkaWZmZXJlbmNlczpcbiAgICpcbiAgICogMS4gKipPbmUgdHJhY2UgZW50cnkgcGVyIHN1cnZpdmluZyBwYXRoKiogKHRoZSDCpzIuNSBkZWR1cCBydWxlIOKAlCBgYXBwZW5kYFxuICAgKiAgICBpcyBOT1QgaWRlbXBvdGVudCBvbiByZXBsYXksIHNvIGR1cGxpY2F0ZSBlbnRyaWVzIHdvdWxkIG11bHRpcGx5XG4gICAqICAgIHRhaWxzKS4gVGhlIHZlcmIgaXMgcmVzb2x2ZWQgZnJvbSB0aGUgcGF0aCdzIG9wIG1peCArIGJhc2XihpJmaW5hbFxuICAgKiAgICByZWxhdGlvbnNoaXA7IGVudHJpZXMgYXJlIG9yZGVyZWQgYnkgZWFjaCBwYXRoJ3MgTEFTVCB0b3VjaCxcbiAgICogICAgcHJlc2VydmluZyBsYXN0LXdyaXRlci13aW5zIGZvciBuZXN0ZWQvb3ZlcmxhcHBpbmcgcGF0aHMuXG4gICAqIDIuICoqVmVyYiByZXNvbHV0aW9uIHBlciBwYXRoKiog4oCUIGZvciBhIHBhdGggd2l0aCBOTyBzdXJ2aXZpbmcgcmVsYXRpdmVcbiAgICogICAgKHNlZSAzKTpcbiAgICogICAgLSBsYXN0IG9wIGAnZGVsZXRlJ2AgQU5EIGZpbmFsIHZhbHVlIGdvbmUg4oaSIGBkZWxldGVgICh0aGUgcGF0aCBzdGF5c1xuICAgKiAgICAgIGVudW1lcmF0ZWQgaW4gYG92ZXJ3cml0ZWAgd2l0aCBgdW5kZWZpbmVkYCBmb3Iga2V5LXNldCBjb25zdW1lcnMpLlxuICAgKiAgICAgIFJlcXVpcmVzIHRoZSBwYXJlbnQgdG8gYmUgYSByZWFsIGNvbnRhaW5lciBpbiB0aGUgYmFzZSDigJQgcmVwbGF5IHVzZXNcbiAgICogICAgICBgbmF0aXZlRGVsZXRlYCwgd2hpY2ggaXMgaW5lcnQgb24gYSBwcmltaXRpdmUvYWJzZW50IHBhcmVudCwgd2hlcmVhc1xuICAgKiAgICAgIHRoZSBgJ2Z1bGwnYCBmbGF0dGVuaW5nIChgX3NldGAgb2YgYHVuZGVmaW5lZGApIENPRVJDRVMgdGhhdCBwYXJlbnRcbiAgICogICAgICBpbnRvIGFuIG9iamVjdDsgd2hlbiB0aGV5IHdvdWxkIGRpc2FncmVlIHdlIGtlZXAgdGhlIGZsYXR0ZW5pbmc7XG4gICAqICAgIC0gT05MWSBgJ21lcmdlJ2Agb3BzIOKGkiBgbWVyZ2VgIHdpdGggdGhlIGFjY3VtdWxhdGVkIGB1cGRhdGVQYXRjaGBcbiAgICogICAgICBkZWx0YTtcbiAgICogICAgLSBvdGhlcndpc2UgKGBzZXRgL21peGVkKTogdGhlIHZhbHVlIHRoZSBzdGFnZSdzICdmdWxsJyByb3dzIGdpdmUgdGhlXG4gICAqICAgICAgcGF0aCAoe0BsaW5rIGZ1bGxSb3dzVmFsdWV9KS4gSWYgYmFzZSBhbmQgdGhhdCB2YWx1ZSBhcmUgYXJyYXlzIGFuZFxuICAgKiAgICAgIGJhc2UgaXMgYSBTVFJJQ1QgUFJFRklYIOKGkiBgYXBwZW5kYCBzdG9yaW5nIG9ubHkgdGhlIHRhaWw7IGVsc2UgYHNldGBcbiAgICogICAgICBzdG9yaW5nIHRoZSBmdWxsIHZhbHVlLlxuICAgKiAzLiAqKk9WRVJMQVAgRkFNSUxJRVMgdGFrZSB0aGUgZnVsbC12YWx1ZSBmYWxsYmFjay4qKiBgb3ZlcndyaXRlYCAvXG4gICAqICAgIGB1cGRhdGVzYCBhcmUgbmVzdGVkIHBhdGggVFJFRVMsIHNvIHR3byBzdXJ2aXZpbmcgcGF0aHMgd2hlcmUgb25lIGlzXG4gICAqICAgIGFuIGFuY2VzdG9yIG9mIHRoZSBvdGhlciAoYGFgIGFuZCBgYS5wYCkgc2hhcmUgc3RvcmFnZS4gRGVsdGEnc1xuICAgKiAgICBwZXItcGF0aCBlbmNvZGluZ3Mgd291bGQgY2xvYmJlciBlYWNoIG90aGVyIHRoZXJlIChhbiBgYXBwZW5kYFxuICAgKiAgICBhbmNlc3RvciBzdG9yZXMgb25seSBhIFRBSUwsIGEgYGRlbGV0ZWAgYW5jZXN0b3IgYHVuZGVmaW5lZGApLCBzbyBldmVyeVxuICAgKiAgICBwYXRoIHRoYXQgaGFzIGEgc3Vydml2aW5nIGFuY2VzdG9yL2Rlc2NlbmRhbnQgaXMgY29tbWl0dGVkIGFzIGEgcGxhaW5cbiAgICogICAgYHNldGAgb2YgdGhlIHZhbHVlIHRoZSAnZnVsbCcgcm93cyBnaXZlIGl0LCBhbmQgdGhlIGZhbWlseSdzXG4gICAqICAgIHNoYWxsb3dlc3QgcGF0aCAod2hvc2Ugc2V0IGNvdmVycyB0aGUgd2hvbGUgc3VidHJlZSkgaXMgZW1pdHRlZCBMQVNULlxuICAgKlxuICAgKiBUaGUgcmVzdWx0IGlzIEFETUlUVEVEICh7QGxpbmsgYWRtaXR9KSBsaWtlIHRoZSAnZnVsbCcgcGF5bG9hZDogYSBjb21wYWN0XG4gICAqIHJvdyBpcyBrZXB0IG9ubHkgd2hlcmUgdGhlIGJ1bmRsZSBwcm92YWJseSBmb2xkcyBiYWNrLCBhbmQgYSBmYW1pbHkgdGhhdFxuICAgKiBkb2VzIG5vdCBpcyByZWNvcmRlZCBhcyB3aGF0IHRoZSBzdGFnZSByZWFkLiBTbyBib3RoIGVuY29kaW5ncyBjb21taXQgdGhlXG4gICAqIHZhbHVlIHRoZSBzdGFnZSByZWFkOyBiZWZvcmUgOS4zMC4wIHRoZXkgc2hhcmVkIGEgcmVwbGF5IHRoYXQgZGlkIG5vdFxuICAgKiAoYHJlcGxheVBhdGhWZXJic2AgLyBgcmVwbGF5RmFtaWx5VmVyYnNgLCBkZWxldGVkKS5cbiAgICovXG4gIHByaXZhdGUgdG9EZWx0YVBheWxvYWQoKTogUm93cyB7XG4gICAgY29uc3QgZnVsbFZhbHVlQXQgPSB0aGlzLmZ1bGxSb3dzVmFsdWUoKTtcbiAgICByZXR1cm4gdGhpcy5hZG1pdCgobG9zc3kpID0+IHRoaXMuZGVsdGFSb3dzKGxvc3N5LCBmdWxsVmFsdWVBdCkpO1xuICB9XG5cbiAgLyoqIFRoZSBkZWx0YSByb3dzOyBhIGZhbWlseSBpbiBgbG9zc3lgIGlzIHdyaXR0ZW4gYXMgaXRzIHJlYWQtYmFjaywgYXQgaXRzIGxhc3QgdG91Y2ggKHtAbGluayBlbWl0UmVhZEJhY2t9KS4gKi9cbiAgcHJpdmF0ZSBkZWx0YVJvd3MobG9zc3k6IExvc3N5IHwgdW5kZWZpbmVkLCBmdWxsVmFsdWVBdDogKHNlZ21lbnRzOiBzdHJpbmdbXSkgPT4gdW5rbm93bik6IFJvd3Mge1xuICAgIGNvbnN0IHJvd3M6IFJvd3MgPSB7IG92ZXJ3cml0ZToge30sIHVwZGF0ZXM6IHt9LCB0cmFjZTogW10gfTtcbiAgICBjb25zdCB7IG92ZXJ3cml0ZSwgdXBkYXRlcywgdHJhY2UgfSA9IHJvd3M7XG4gICAgY29uc3QgaW5Mb3NzeSA9IChwYXRoOiBzdHJpbmcpID0+IGxvc3N5Py5mYW1pbGllcy5oYXMobG9zc3kucm9vdE9mLmdldChwYXRoKSBhcyBzdHJpbmcpID09PSB0cnVlO1xuICAgIGNvbnN0IHN1cnZpdm9ycyA9IHRoaXMubmV0Q2hhbmdlU3Vydml2b3JzKHRoaXMub3BzQnlQYXRoKCkpLmZpbHRlcigocykgPT4gIWluTG9zc3kocy5wYXRoKSk7XG4gICAgY29uc3QgeyByb290T2YsIGJ5Um9vdCB9ID0gZ3JvdXBJbnRvRmFtaWxpZXMoc3Vydml2b3JzLCBuZXcgU2V0KHN1cnZpdm9ycy5tYXAoKHMpID0+IHMucGF0aCkpKTtcblxuICAgIC8vIFRIRSBWRVJCIENIT0lDRSDigJQgdGhlIGRlbHRhIGVuY29kZXIgcGlja3MgYSB2ZXJiIHBlciBwYXRoOyB0aGUgVkFMVUVTXG4gICAgLy8gaXQgZW5jb2RlcyBjb21lIGZyb20gdGhlIG9uZSByZXBsYXkgKGBmdWxsVmFsdWVBdGApLCBuZXZlciBhIHJlcGxpY2Egb2ZcbiAgICAvLyB0aGUgdmVyYiBsYXcgKDkuMzAuMDogQ0xBVURFLm1kJ3MgdmVyYi1zd2l0Y2ggcmVwbGljYXMgbG9zdCB0d28gaGVyZSkuXG4gICAgY29uc3QgZW1pdCA9IChzOiBTdXJ2aXZvcik6IHZvaWQgPT4ge1xuICAgICAgY29uc3QgeyBwYXRoLCBzZWdtZW50cywgdmVyYnMsIGJlZm9yZSB9ID0gcztcbiAgICAgIGNvbnN0IHByb3YgPSBwcm92ZW5hbmNlKHMucmVhZEtleXMpO1xuICAgICAgaWYgKChieVJvb3QuZ2V0KHJvb3RPZi5nZXQocGF0aCkgYXMgc3RyaW5nKSBhcyBTdXJ2aXZvcltdKS5sZW5ndGggPiAxKSB7XG4gICAgICAgIC8vIFJ1bGUgMyDigJQgb25lIGNvaGVyZW50IHRyZWU6IGV2ZXJ5IG1lbWJlciBhIHNldCBvZiBpdHMgdmFsdWUuXG4gICAgICAgIHRyYWNlLnB1c2goeyBwYXRoLCB2ZXJiOiAnc2V0JywgLi4ucHJvdiB9KTtcbiAgICAgICAgX3NldChvdmVyd3JpdGUsIHNlZ21lbnRzLCBzdHJ1Y3R1cmVkQ2xvbmUoZnVsbFZhbHVlQXQoc2VnbWVudHMpKSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGxhc3RWZXJiID0gdmVyYnNbdmVyYnMubGVuZ3RoIC0gMV07XG4gICAgICBpZiAobGFzdFZlcmIgPT09ICdkZWxldGUnICYmIHMuYWZ0ZXIgPT09IHVuZGVmaW5lZCAmJiB0aGlzLmRlbGV0ZVJlcGxheXNBc0ZsYXR0ZW5pbmcoc2VnbWVudHMpKSB7XG4gICAgICAgIC8vIFJlYWwgZGVsZXRpb24g4oCUIHJlcGxheSByZW1vdmVzIHRoZSBrZXkuIEtlZXAgdGhlIHBhdGggZW51bWVyYXRlZFxuICAgICAgICAvLyBpbiBgb3ZlcndyaXRlYCAodW5kZWZpbmVkKSBzbyBPYmplY3Qua2V5cyBjb25zdW1lcnMgc2VlIGl0LlxuICAgICAgICB0cmFjZS5wdXNoKHsgcGF0aCwgdmVyYjogJ2RlbGV0ZScsIC4uLnByb3YgfSk7XG4gICAgICAgIF9zZXQob3ZlcndyaXRlLCBzZWdtZW50cywgdW5kZWZpbmVkKTtcbiAgICAgIH0gZWxzZSBpZiAodmVyYnMuZXZlcnkoKHYpID0+IHYgPT09ICdtZXJnZScpKSB7XG4gICAgICAgIHRyYWNlLnB1c2goeyBwYXRoLCB2ZXJiOiAnbWVyZ2UnLCAuLi5wcm92IH0pO1xuICAgICAgICBfc2V0KHVwZGF0ZXMsIHNlZ21lbnRzLCBzdHJ1Y3R1cmVkQ2xvbmUoX2dldCh0aGlzLnVwZGF0ZVBhdGNoLCBzZWdtZW50cykpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHB1c2hWYWx1ZVJvdyhyb3dzLCBwYXRoLCBzZWdtZW50cywgYmVmb3JlLCBmdWxsVmFsdWVBdChzZWdtZW50cyksIHByb3YsIHRoaXMubWFya2VkQmVsb3cocGF0aCkpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvLyBBIGZhbWlseSB0aGF0IGRpZCBub3QgZm9sZCBiYWNrIHRha2VzIGl0cyBwbGFjZSBieSBpdHMgbGFzdCB0b3VjaC5cbiAgICBjb25zdCBwZW5kaW5nID0gbG9zc3kgPT09IHVuZGVmaW5lZCA/IFtdIDogWy4uLmxvc3N5LmZhbWlsaWVzLnZhbHVlcygpXS5zb3J0KChhLCBiKSA9PiBhLnNsb3QgLSBiLnNsb3QpO1xuICAgIGxldCBuZXh0ID0gMDtcbiAgICBjb25zdCBmbHVzaEJlZm9yZSA9ICh0b3VjaDogbnVtYmVyKTogdm9pZCA9PiB7XG4gICAgICB3aGlsZSAobmV4dCA8IHBlbmRpbmcubGVuZ3RoICYmIHBlbmRpbmdbbmV4dF0uc2xvdCA8IHRvdWNoKSB0aGlzLmVtaXRSZWFkQmFjayhwZW5kaW5nW25leHQrK10sIHJvd3MsICdkZWx0YScpO1xuICAgIH07XG4gICAgZW1pdEluRmFtaWx5T3JkZXIoc3Vydml2b3JzLCByb290T2YsIGJ5Um9vdCwgZW1pdCwgZmx1c2hCZWZvcmUpO1xuICAgIGZsdXNoQmVmb3JlKEluZmluaXR5KTtcbiAgICByZXR1cm4gcm93cztcbiAgfVxuXG4gIC8vIOKUgOKUgCBUaGUgYWRtaXR0ZWQgcmVjb3JkICg5LjMwLjApIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKlxuICAgKiBUSEUgQURNSVNTSU9OIOKAlCBhIGNvbW1pdCBpcyBhZG1pdHRlZCBvbmx5IGlmIGl0cyBidW5kbGUgZm9sZHMgYmFjayB0byB0aGVcbiAgICogc3RhZ2UncyByZWFkLXlvdXItd3JpdGVzIHZpZXcgYXQgZXZlcnkgcGF0aCB0aGUgc3RhZ2UgdG91Y2hlZC4gYGJ1aWxkYFxuICAgKiBsYXlzIHRoZSByb3dzIG91dCAob25lIGVuY29kZXI6IGAnZnVsbCdgIG9yIGAnZGVsdGEnYCk7IHRoZSBjYW5kaWRhdGUgaXNcbiAgICogY2hlY2tlZCAoe0BsaW5rIGxvc3N5RmFtaWxpZXN9KSwgYW5kIHdoZW4gc29tZSBmYW1pbHkncyByb3dzIGRvIG5vdCBmb2xkXG4gICAqIGJhY2sgdGhlIHJvd3MgYXJlIGxhaWQgb3V0IGFnYWluIHdpdGggdGhvc2UgZmFtaWxpZXMgd3JpdHRlbiBhcyB3aGF0IHRoZVxuICAgKiBzdGFnZSByZWFkICh7QGxpbmsgZW1pdFJlYWRCYWNrfSkg4oCUIGV2ZXJ5IG90aGVyIGZhbWlseSdzIGJ5dGVzIGV4YWN0bHkgYXNcbiAgICogdGhlIGZpcnN0IGxheW91dCBtYWRlIHRoZW0uXG4gICAqL1xuICBwcml2YXRlIGFkbWl0KGJ1aWxkOiAobG9zc3k6IExvc3N5IHwgdW5kZWZpbmVkKSA9PiBSb3dzKTogUm93cyB7XG4gICAgY29uc3QgY2FuZGlkYXRlID0gYnVpbGQodW5kZWZpbmVkKTtcbiAgICBjb25zdCBsb3NzeSA9IHRoaXMubG9zc3lGYW1pbGllcyhjYW5kaWRhdGUpO1xuICAgIHJldHVybiBsb3NzeSA9PT0gdW5kZWZpbmVkID8gY2FuZGlkYXRlIDogYnVpbGQobG9zc3kpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBmYW1pbGllcyB3aG9zZSByb3dzIGRvIG5vdCBmb2xkIGJhY2sgdG8gd2hhdCB0aGUgc3RhZ2UgcmVhZCDigJRcbiAgICogYHVuZGVmaW5lZGAgd2hlbiB0aGVyZSBhcmUgbm9uZSAoYGFkbWlzc2lvbi50cyDCtyBsb3NzeUZhbWlsaWVzYDogdGhlXG4gICAqIGNhbmRpZGF0ZSByZXBsYXllZCBvbnRvIHRoZSBkaWZmIGJhc2UgYnkgYGRyeUZvbGRgLCBldmVyeSBmYW1pbHkgb2ZcbiAgICogdG91Y2hlZCBwYXRocyBjb21wYXJlZCB3aXRoIHRoZSB3b3JraW5nIGNvcHkgYXQgaXRzIHJvb3QgYW5kIG9uIHRoZSB3YXlcbiAgICogZG93biB0byBpdCkuXG4gICAqXG4gICAqIFdpdGhvdXQgYSBmb2xkLCB3aGVuIHRoZSBzdGFnZSBzdGFnZWQgbm8gYG1lcmdlYCBhbmQgbm8gbmVzdGVkIG9wOiBpdHNcbiAgICogcm93cyBhcmUgYHNldGAgLyBgZGVsZXRlYCBvZiBrZXlzIGRpcmVjdGx5IHVuZGVyIGl0cyBhZGRyZXNzLCBlYWNoXG4gICAqIHdyaXRpbmcgdGhlIFNBTUUgdmFsdWUgaW50byBgd29ya2luZ0NvcHlgIGFuZCBgb3ZlcndyaXRlUGF0Y2hgIOKAlCB0aGVcbiAgICogcmVjb3JkIGlzIHRoZSByZWFkLWJhY2sgYnkgY29uc3RydWN0aW9uICh0aGUgcHJvcGVydHkncyBST09ULU9OTFkgYXJtXG4gICAqIHBpbnMgdGhpcykuIFRoYXQga2VlcHMgdGhlIGNvbW1pdCBvZiB0aGUgdHlwZWQgc2NvcGUncyByb290LWtleSB3cml0ZXNcbiAgICogZXhhY3RseSBhcyBjaGVhcCBhcyBpdCB3YXMuXG4gICAqL1xuICBwcml2YXRlIGxvc3N5RmFtaWxpZXMoY2FuZGlkYXRlOiBSb3dzKTogTG9zc3kgfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLnN0YWdlZE1lcmdlcyA9PT0gMCAmJiB0aGlzLm5lc3RlZE9wcyA9PT0gMCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICByZXR1cm4gbG9zc3lGYW1pbGllcyhjYW5kaWRhdGUsIHRoaXMuYmFzZVNuYXBzaG90LCB0aGlzLndvcmtpbmdDb3B5LCB0aGlzLm9wVHJhY2UsIHRoaXMuYWRkcmVzcyk7XG4gIH1cblxuICAvKipcbiAgICogQSBmYW1pbHkgd2hvc2Ugcm93cyBkaWQgbm90IGZvbGQgYmFjaywgd3JpdHRlbiBhcyB3aGF0IHRoZSBzdGFnZSByZWFkOlxuICAgKiBvbmUgYHNldGAgcm93IHBlciBtZW1iZXIgdGhhdCBjaGFuZ2VkIChkZXNjZW5kYW50cyBieSBsYXN0IHRvdWNoLCBlYWNoXG4gICAqIHdpdGggaXRzIG93biByZWFkIHByZWZpeCksIHRoZSBST09UIGxhc3QsIGFuZCB0aGUgcm9vdCdzIHJlYWQtYmFjayB2YWx1ZVxuICAgKiBpbiBgb3ZlcndyaXRlYCDigJQgb25lIGNvaGVyZW50IHRyZWUsIHNvIG5vIHJvdyBjYW4gY2xvYmJlciBhbm90aGVyLiBUaGVcbiAgICogcm9vdCdzIHJvdyBpcyB3cml0dGVuIGV2ZW4gd2hlbiB0aGUgcm9vdCBpdHNlbGYgZGlkIG5vdCBjaGFuZ2U6IGl0IGlzIHRoZVxuICAgKiByb3cgdGhhdCBjYXJyaWVzIHRoZSBmYW1pbHkncyByZWFkLWJhY2sgKGFuZCB0aGUgY29udGFpbmVycyBMLTEncyBkcm9wcGVkXG4gICAqIG9wIGxlZnQpLiBBIGxvbmUgcm9vdCB1bmRlciBgJ2RlbHRhJ2Aga2VlcHMgdGhlIGNvbXBhY3QgYGFwcGVuZGAgd2hlbiB0aGVcbiAgICogdmFsdWUgaXQgcmVhZCBpcyBpdHMgYmFzZSBwbHVzIGEgdGFpbC5cbiAgICovXG4gIHByaXZhdGUgZW1pdFJlYWRCYWNrKGZhbWlseTogRmFtaWx5LCByb3dzOiBSb3dzLCBlbmNvZGluZzogQ29tbWl0VmFsdWVzTW9kZSk6IHZvaWQge1xuICAgIGxldCByb290OiBNZW1iZXIgPSBmYW1pbHkubWVtYmVyc1swXTtcbiAgICBsZXQgY2hhbmdlZCA9IDA7XG4gICAgZm9yIChjb25zdCBtIG9mIGZhbWlseS5tZW1iZXJzKSB7XG4gICAgICBpZiAobS5wYXRoID09PSBmYW1pbHkucm9vdCkge1xuICAgICAgICByb290ID0gbTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoIXRoaXMuY2hhbmdlZFNpbmNlQmFzZShtLnBhdGguc3BsaXQoREVMSU0pKSkgY29udGludWU7XG4gICAgICByb3dzLnRyYWNlLnB1c2goeyBwYXRoOiBtLnBhdGgsIHZlcmI6ICdzZXQnLCAuLi5wcm92ZW5hbmNlKG0ucmVhZEtleXMpIH0pO1xuICAgICAgY2hhbmdlZCsrO1xuICAgIH1cbiAgICBjb25zdCBhZnRlciA9IF9nZXQodGhpcy53b3JraW5nQ29weSwgZmFtaWx5LnJvb3RTZWdtZW50cyk7XG4gICAgaWYgKGVuY29kaW5nID09PSAnZGVsdGEnICYmIGNoYW5nZWQgPT09IDAgJiYgYWZ0ZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgYmVmb3JlID0gX2dldCh0aGlzLmJhc2VTbmFwc2hvdCwgZmFtaWx5LnJvb3RTZWdtZW50cyk7XG4gICAgICBwdXNoVmFsdWVSb3coXG4gICAgICAgIHJvd3MsXG4gICAgICAgIGZhbWlseS5yb290LFxuICAgICAgICBmYW1pbHkucm9vdFNlZ21lbnRzLFxuICAgICAgICBiZWZvcmUsXG4gICAgICAgIGFmdGVyLFxuICAgICAgICBwcm92ZW5hbmNlKHJvb3QucmVhZEtleXMpLFxuICAgICAgICB0aGlzLm1hcmtlZEJlbG93KGZhbWlseS5yb290KSxcbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHJvd3MudHJhY2UucHVzaCh7IHBhdGg6IGZhbWlseS5yb290LCB2ZXJiOiAnc2V0JywgLi4ucHJvdmVuYW5jZShyb290LnJlYWRLZXlzKSB9KTtcbiAgICAvLyBUaGUgY2xvbmUgdGhlIGNoZWNrIHRvb2sgKGBhZG1pc3Npb24udHMgwrcgZm9sZHNCYWNrYCksIHdoZW4gaXQgdG9vayBvbmUuXG4gICAgX3NldChyb3dzLm92ZXJ3cml0ZSwgZmFtaWx5LnJvb3RTZWdtZW50cywgZmFtaWx5LmhlbGQgIT09IHVuZGVmaW5lZCA/IGZhbWlseS5oZWxkLnZhbHVlIDogc3RydWN0dXJlZENsb25lKGFmdGVyKSk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHZhbHVlIHRoZSBzdGFnZSdzICdmdWxsJyByb3dzIGdpdmUgYSBwYXRoIOKAlCB3aGF0IHRoZSBkZWx0YSBlbmNvZGVyXG4gICAqIGNvbW1pdHMgZm9yIGEgZmFtaWx5IG1lbWJlciBvciBhIHBhdGggd2l0aCBhIGBzZXRgIOKAlCByZWFkIGZyb20gT05FXG4gICAqIHtAbGluayBkcnlGb2xkfSBvZiB0aG9zZSByb3dzIG92ZXIgdGhlIHBhdGNoIHRyZWVzIHRoZW1zZWx2ZXMsIHRha2VuIHRoZVxuICAgKiBmaXJzdCB0aW1lIGl0IGlzIGFza2VkLiBCeSByZWZlcmVuY2UsIGFzIHRoZSBzdGFnZSBoZWxkIHRoZW06IGFuIGVsZW1lbnRcbiAgICogYSBgc2V0YCBhbmQgYSBgbWVyZ2VgIG9mIG9uZSBwYXRoIHNoYXJlIHN0YXlzIG9uZSBlbGVtZW50LiBBIHN0YWdlIHRoYXRcbiAgICogc3RhZ2VkIG5vIGBtZXJnZWAgYW5kIG5vIG5lc3RlZCBvcCBuZWVkcyBubyBmb2xkIOKAlCBhIHBhdGgncyB2YWx1ZSBpcyBpdHNcbiAgICogbGFzdCBzdGFnZWQgdmFsdWUuIChCZWZvcmUgOS4zMC4wOiB0d28gcmVwbGljYXMgb2YgdGhlIHZlcmIgbGF3LFxuICAgKiBgcmVwbGF5UGF0aFZlcmJzYCBhbmQgYHJlcGxheUZhbWlseVZlcmJzYC4pXG4gICAqL1xuICBwcml2YXRlIGZ1bGxSb3dzVmFsdWUoKTogKHNlZ21lbnRzOiBzdHJpbmdbXSkgPT4gdW5rbm93biB7XG4gICAgaWYgKHRoaXMuc3RhZ2VkTWVyZ2VzID09PSAwICYmIHRoaXMubmVzdGVkT3BzID09PSAwKSByZXR1cm4gKHNlZ21lbnRzKSA9PiBfZ2V0KHRoaXMub3ZlcndyaXRlUGF0Y2gsIHNlZ21lbnRzKTtcbiAgICBsZXQgZm9sZDogdW5rbm93bjtcbiAgICByZXR1cm4gKHNlZ21lbnRzKSA9PiB7XG4gICAgICBmb2xkID8/PSBkcnlGb2xkKHRoaXMuYmFzZVNuYXBzaG90LCB0aGlzLnVwZGF0ZVBhdGNoLCB0aGlzLm92ZXJ3cml0ZVBhdGNoLCB0aGlzLmZ1bGxSb3dzKCkpO1xuICAgICAgcmV0dXJuIF9nZXQoZm9sZCwgc2VnbWVudHMpO1xuICAgIH07XG4gIH1cblxuICAvKiogVGhlIHN0YWdlJ3MgJ2Z1bGwnIHJvd3M6IGV2ZXJ5IG9wIG9uIGEgcGF0aCB0aGUgbmV0LWNoYW5nZSBmaWx0ZXIga2VlcHMsIGEgYGRlbGV0ZWAgc3BlbGxlZCBgc2V0YC4gKi9cbiAgcHJpdmF0ZSBmdWxsUm93cygpOiBUcmFjZUVudHJ5W10ge1xuICAgIGNvbnN0IGtlZXAgPSBuZXcgTWFwPHN0cmluZywgYm9vbGVhbj4oKTtcbiAgICBjb25zdCByb3dzOiBUcmFjZUVudHJ5W10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IG9wIG9mIHRoaXMub3BUcmFjZSkge1xuICAgICAgbGV0IGsgPSBrZWVwLmdldChvcC5wYXRoKTtcbiAgICAgIGlmIChrID09PSB1bmRlZmluZWQpIGtlZXAuc2V0KG9wLnBhdGgsIChrID0gdGhpcy5jaGFuZ2VkU2luY2VCYXNlKG9wLnBhdGguc3BsaXQoREVMSU0pKSkpO1xuICAgICAgaWYgKGspIHJvd3MucHVzaCh7IHBhdGg6IG9wLnBhdGgsIHZlcmI6IG9wLnZlcmIgPT09ICdtZXJnZScgPyAnbWVyZ2UnIDogJ3NldCcgfSk7XG4gICAgfVxuICAgIHJldHVybiByb3dzO1xuICB9XG5cbiAgLyoqXG4gICAqIERpZCB0aGUgc3RhZ2UgY2hhbmdlIHRoZSB2YWx1ZSBhdCBgc2VnbWVudHNgPyBCYXNlIGFuZCBmaW5hbCB2YWx1ZSBhcmVcbiAgICogZml4ZWQgYXQgY29tbWl0LCBzbyB0aGlzIGlzIHRoZSBPTkUgbmV0LWNoYW5nZSB2ZXJkaWN0IGJvdGggcGF5bG9hZFxuICAgKiBlbmNvZGluZ3MgYXBwbHkgKGEgbm8tb3Agd3JpdGUgYW5kIGEgd3JpdGUtdGhlbi1yZXZlcnQgYm90aCBmYWlsIGl0KS5cbiAgICovXG4gIHByaXZhdGUgY2hhbmdlZFNpbmNlQmFzZShzZWdtZW50czogc3RyaW5nW10pOiBib29sZWFuIHtcbiAgICByZXR1cm4gIWRlZXBFcXVhbChfZ2V0KHRoaXMuYmFzZVNuYXBzaG90LCBzZWdtZW50cyksIF9nZXQodGhpcy53b3JraW5nQ29weSwgc2VnbWVudHMpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXRoIOKGkiBpdHMgb3AtdmVyYiBzZXF1ZW5jZSwgb3JkZXJlZCBieSBMQVNUIHRvdWNoIChkZWxldGUgKyByZS1pbnNlcnRcbiAgICogbW92ZXMgYSByZS10b3VjaGVkIHBhdGggdG8gdGhlIGVuZCBvZiB0aGUgTWFwJ3MgaW5zZXJ0aW9uIG9yZGVyIOKAlFxuICAgKiBwcmVzZXJ2aW5nIGxhc3Qtd3JpdGVyLXdpbnMgZm9yIG5lc3RlZC9vdmVybGFwcGluZyBwYXRocykuIFBlci13cml0ZVxuICAgKiBwcm92ZW5hbmNlICgjUDEpOiB0aGUgTEFTVCBvcCdzIHJlYWRLZXlzIGlzIGtlcHQg4oCUIHJlYWQgcHJlZml4ZXMgb25seSBncm93XG4gICAqIHdpdGhpbiBhIHN0YWdlLCBzbyBsYXN0ID09IHVuaW9uIGFjcm9zcyB0aGUgcGF0aC5cbiAgICovXG4gIHByaXZhdGUgb3BzQnlQYXRoKCk6IE1hcDxzdHJpbmcsIHsgdmVyYnM6IE9wVmVyYltdOyByZWFkS2V5cz86IHN0cmluZ1tdOyBsYXN0OiBudW1iZXIgfT4ge1xuICAgIGNvbnN0IGJ5UGF0aCA9IG5ldyBNYXA8c3RyaW5nLCB7IHZlcmJzOiBPcFZlcmJbXTsgcmVhZEtleXM/OiBzdHJpbmdbXTsgbGFzdDogbnVtYmVyIH0+KCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm9wVHJhY2UubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IG9wID0gdGhpcy5vcFRyYWNlW2ldO1xuICAgICAgY29uc3QgcHJldiA9IGJ5UGF0aC5nZXQob3AucGF0aCk7XG4gICAgICBpZiAocHJldikge1xuICAgICAgICBwcmV2LnZlcmJzLnB1c2gob3AudmVyYik7XG4gICAgICAgIHByZXYubGFzdCA9IGk7XG4gICAgICAgIGlmIChvcC5yZWFkS2V5cyAhPT0gdW5kZWZpbmVkKSBwcmV2LnJlYWRLZXlzID0gb3AucmVhZEtleXM7XG4gICAgICAgIGJ5UGF0aC5kZWxldGUob3AucGF0aCk7XG4gICAgICAgIGJ5UGF0aC5zZXQob3AucGF0aCwgcHJldik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBieVBhdGguc2V0KG9wLnBhdGgsIHtcbiAgICAgICAgICB2ZXJiczogW29wLnZlcmJdLFxuICAgICAgICAgIGxhc3Q6IGksXG4gICAgICAgICAgLi4uKG9wLnJlYWRLZXlzICE9PSB1bmRlZmluZWQgJiYgeyByZWFkS2V5czogb3AucmVhZEtleXMgfSksXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYnlQYXRoO1xuICB9XG5cbiAgLyoqIFRoZSBuZXQtY2hhbmdlIGZpbHRlciDigJQgaWRlbnRpY2FsIHRvICdmdWxsJyAoe0BsaW5rIGNoYW5nZWRTaW5jZUJhc2V9KS4gU3Vydml2b3JzIGtlZXAgbGFzdC10b3VjaCBvcmRlci4gKi9cbiAgcHJpdmF0ZSBuZXRDaGFuZ2VTdXJ2aXZvcnMoYnlQYXRoOiBNYXA8c3RyaW5nLCB7IHZlcmJzOiBPcFZlcmJbXTsgcmVhZEtleXM/OiBzdHJpbmdbXTsgbGFzdDogbnVtYmVyIH0+KTogU3Vydml2b3JbXSB7XG4gICAgY29uc3Qgc3Vydml2b3JzOiBTdXJ2aXZvcltdID0gW107XG4gICAgZm9yIChjb25zdCBbcGF0aCwgeyB2ZXJicywgcmVhZEtleXMsIGxhc3QgfV0gb2YgYnlQYXRoKSB7XG4gICAgICBjb25zdCBzZWdtZW50cyA9IHBhdGguc3BsaXQoREVMSU0pO1xuICAgICAgaWYgKCF0aGlzLmNoYW5nZWRTaW5jZUJhc2Uoc2VnbWVudHMpKSBjb250aW51ZTsgLy8gbm8tb3Agb3Igd3JpdGUtdGhlbi1yZXZlcnQg4oaSIG5vIG5ldCBjaGFuZ2VcbiAgICAgIGNvbnN0IGJlZm9yZSA9IF9nZXQodGhpcy5iYXNlU25hcHNob3QsIHNlZ21lbnRzKTtcbiAgICAgIGNvbnN0IGFmdGVyID0gX2dldCh0aGlzLndvcmtpbmdDb3B5LCBzZWdtZW50cyk7XG4gICAgICBzdXJ2aXZvcnMucHVzaCh7IHBhdGgsIHNlZ21lbnRzLCB2ZXJicywgcmVhZEtleXMsIGxhc3QsIGJlZm9yZSwgYWZ0ZXIgfSk7XG4gICAgfVxuICAgIHJldHVybiBzdXJ2aXZvcnM7XG4gIH1cblxuICAvKipcbiAgICogTWF5IGEgc3RhZ2VkIGBkZWxldGVgIGF0IHRoaXMgcGF0aCBjb21taXQgYXMgdGhlIGAnZGVsZXRlJ2AgdmVyYj9cbiAgICpcbiAgICogT25seSB3aGVuIHJlbW92aW5nIHRoZSBrZXkgYW5kIHRoZSBgJ2Z1bGwnYCBtb2RlJ3MgZmxhdHRlbmluZyAoYF9zZXRgIG9mXG4gICAqIGB1bmRlZmluZWRgKSBsYW5kIGluIHRoZSBzYW1lIHBsYWNlLiBUaGV5IGRpdmVyZ2Ugd2hlbiB0aGUgcGFyZW50IGlzIG5vdFxuICAgKiBhIGNvbnRhaW5lcjogYG5hdGl2ZURlbGV0ZWAgd2Fsa3MgYXdheSB1bnRvdWNoZWQsIHdoaWxlIGBuYXRpdmVTZXRgXG4gICAqIENPRVJDRVMgdGhlIHByaW1pdGl2ZSBwYXJlbnQgaW50byBhbiBvYmplY3QgdG8gaG9sZCB0aGUga2V5LiBDb21taXR0aW5nXG4gICAqIGBkZWxldGVgIHRoZXJlIHdvdWxkIHNpbGVudGx5IGRyb3AgYSBzdGF0ZSBjaGFuZ2UgdGhlIHN0YWdlIHJlYWxseSBtYWRlLFxuICAgKiBzbyB0aG9zZSAocGF0aG9sb2dpY2FsKSBkZWxldGVzIGtlZXAgdGhlIGhpc3RvcmljYWwgZmxhdHRlbmluZy5cbiAgICovXG4gIHByaXZhdGUgZGVsZXRlUmVwbGF5c0FzRmxhdHRlbmluZyhzZWdtZW50czogc3RyaW5nW10pOiBib29sZWFuIHtcbiAgICBpZiAoc2VnbWVudHMubGVuZ3RoID09PSAxKSByZXR1cm4gdHJ1ZTsgLy8gcGFyZW50IGlzIHRoZSBzdGF0ZSByb290IOKAlCBhbHdheXMgYSBjb250YWluZXJcbiAgICBjb25zdCBwYXJlbnQgPSBfZ2V0KHRoaXMuYmFzZVNuYXBzaG90LCBzZWdtZW50cy5zbGljZSgwLCAtMSkpO1xuICAgIHJldHVybiBwYXJlbnQgIT09IG51bGwgJiYgdHlwZW9mIHBhcmVudCA9PT0gJ29iamVjdCc7XG4gIH1cbn1cblxuLyoqXG4gKiBIaXN0b3JpY2FsIGZsYXR0ZW5pbmcgZm9yIHRoZSBgJ2Z1bGwnYCBwYXlsb2FkOiBhbiBleHBsaWNpdCBkZWxldGUgY29tbWl0c1xuICogYXMgc2V0LW9mLXVuZGVmaW5lZC4gUGVyLXdyaXRlIHByb3ZlbmFuY2UgKCNQMSkgcmlkZXMgZWFjaCBzdXJ2aXZpbmcgZW50cnlcbiAqIHVudG91Y2hlZC5cbiAqL1xuZnVuY3Rpb24gZmxhdHRlbmVkVHJhY2VSb3cob3A6IHsgcGF0aDogc3RyaW5nOyB2ZXJiOiBPcFZlcmI7IHJlYWRLZXlzPzogc3RyaW5nW10gfSk6IFRyYWNlRW50cnkge1xuICByZXR1cm4gb3AudmVyYiA9PT0gJ2RlbGV0ZSdcbiAgICA/IHsgcGF0aDogb3AucGF0aCwgdmVyYjogJ3NldCcgYXMgY29uc3QsIC4uLihvcC5yZWFkS2V5cyAhPT0gdW5kZWZpbmVkICYmIHsgcmVhZEtleXM6IG9wLnJlYWRLZXlzIH0pIH1cbiAgICA6IG9wO1xufVxuXG4vKiogQSByb3cncyBgcmVhZEtleXNgIGZyYWdtZW50IOKAlCBhYnNlbnQgdW5sZXNzIHRoZSBwcm92ZW5hbmNlIGRpYWwgcmVjb3JkZWQgb25lICgjUDEpLiAqL1xuZnVuY3Rpb24gcHJvdmVuYW5jZShyZWFkS2V5czogc3RyaW5nW10gfCB1bmRlZmluZWQpOiB7IHJlYWRLZXlzOiBzdHJpbmdbXSB9IHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIHJlYWRLZXlzICE9PSB1bmRlZmluZWQgPyB7IHJlYWRLZXlzIH0gOiB1bmRlZmluZWQ7XG59XG4iXX0=
|
package/dist/lib/memory/merge.js
CHANGED
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
/**
|
|
3
3
|
* merge.ts — the union merge the `merge` verb applies. A leaf (L0, imports
|
|
4
|
-
*
|
|
4
|
+
* only the own-slot writer): `deepSmartMerge`, the law every replay, fold and reader
|
|
5
5
|
* of a recorded `merge` row runs. Re-exported from `utils.ts`, so no importer
|
|
6
6
|
* moved.
|
|
7
7
|
*/
|
|
8
8
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
9
|
exports.deepSmartMerge = void 0;
|
|
10
|
+
const ownData_js_1 = require("../capture/ownData.js");
|
|
10
11
|
/**
|
|
11
12
|
* Deep union merge helper.
|
|
12
13
|
* - Arrays (non-empty): union without duplicates (encounter order preserved)
|
|
@@ -47,18 +48,9 @@ function mergeGuarded(dst, src, inFlight) {
|
|
|
47
48
|
for (const k of Object.keys(src)) {
|
|
48
49
|
const owns = Object.prototype.hasOwnProperty.call(out, k);
|
|
49
50
|
const value = mergeGuarded(owns ? out[k] : undefined, src[k], inFlight);
|
|
50
|
-
|
|
51
|
-
// assigned too, unless an inherited key (notably __proto__) intercepts
|
|
52
|
-
// the write. Keep that key as DATA, rather than dropping it or invoking
|
|
53
|
-
// a setter; Reflect.has tests existence without reading an inherited getter.
|
|
54
|
-
if (!owns && Reflect.has(out, k)) {
|
|
55
|
-
Object.defineProperty(out, k, { value, enumerable: true, writable: true, configurable: true });
|
|
56
|
-
}
|
|
57
|
-
else {
|
|
58
|
-
out[k] = value;
|
|
59
|
-
}
|
|
51
|
+
(0, ownData_js_1.putOwn)(out, k, value);
|
|
60
52
|
}
|
|
61
53
|
inFlight.delete(src);
|
|
62
54
|
return out;
|
|
63
55
|
}
|
|
64
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
56
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVyZ2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL21lbW9yeS9tZXJnZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7O0dBS0c7OztBQUVILHNEQUErQztBQUUvQzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBa0JHO0FBQ0gsU0FBZ0IsY0FBYyxDQUFDLEdBQVEsRUFBRSxHQUFRO0lBQy9DLE9BQU8sWUFBWSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsU0FBUyxDQUFDLENBQUM7QUFDM0MsQ0FBQztBQUZELHdDQUVDO0FBRUQsU0FBUyxZQUFZLENBQUMsR0FBUSxFQUFFLEdBQVEsRUFBRSxRQUEwQztJQUNsRixJQUFJLEdBQUcsS0FBSyxJQUFJLElBQUksT0FBTyxHQUFHLEtBQUssUUFBUTtRQUFFLE9BQU8sR0FBRyxDQUFDO0lBRXhELElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ3ZCLElBQUksR0FBRyxDQUFDLE1BQU0sS0FBSyxDQUFDO1lBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQywrQkFBK0I7UUFDaEUsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQztZQUFFLE9BQU8sQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDOUQsT0FBTyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUM7SUFDbEIsQ0FBQztJQUVELElBQUksUUFBUSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUM7UUFBRSxPQUFPLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyx5Q0FBeUM7SUFFM0YsTUFBTSxHQUFHLEdBQVEsRUFBRSxHQUFHLENBQUMsR0FBRyxJQUFJLE9BQU8sR0FBRyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQ3BFLENBQUMsUUFBUSxLQUFLLElBQUksT0FBTyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQzNDLEtBQUssTUFBTSxDQUFDLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ2pDLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDMUQsTUFBTSxLQUFLLEdBQUcsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ3hFLElBQUEsbUJBQU0sRUFBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ3hCLENBQUM7SUFDRCxRQUFRLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3JCLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogbWVyZ2UudHMg4oCUIHRoZSB1bmlvbiBtZXJnZSB0aGUgYG1lcmdlYCB2ZXJiIGFwcGxpZXMuIEEgbGVhZiAoTDAsIGltcG9ydHNcbiAqIG9ubHkgdGhlIG93bi1zbG90IHdyaXRlcik6IGBkZWVwU21hcnRNZXJnZWAsIHRoZSBsYXcgZXZlcnkgcmVwbGF5LCBmb2xkIGFuZCByZWFkZXJcbiAqIG9mIGEgcmVjb3JkZWQgYG1lcmdlYCByb3cgcnVucy4gUmUtZXhwb3J0ZWQgZnJvbSBgdXRpbHMudHNgLCBzbyBubyBpbXBvcnRlclxuICogbW92ZWQuXG4gKi9cblxuaW1wb3J0IHsgcHV0T3duIH0gZnJvbSAnLi4vY2FwdHVyZS9vd25EYXRhLmpzJztcblxuLyoqXG4gKiBEZWVwIHVuaW9uIG1lcmdlIGhlbHBlci5cbiAqIC0gQXJyYXlzIChub24tZW1wdHkpOiB1bmlvbiB3aXRob3V0IGR1cGxpY2F0ZXMgKGVuY291bnRlciBvcmRlciBwcmVzZXJ2ZWQpXG4gKiAtIEFycmF5cyAoZW1wdHkpOiAgICAgcmVwbGFjZSDigJQgc3JjIGBbXWAgY2xlYXJzIHRoZSBkZXN0aW5hdGlvbiBhcnJheS5cbiAqICAgUmF0aW9uYWxlOiB3cml0aW5nIGBzY29wZS50YWdzID0gW11gIG1lYW5zIFwiY2xlYXIgdGFnc1wiLCBub3QgXCJhcHBlbmQgbm90aGluZ1wiLlxuICogICBXaXRob3V0IHRoaXMgcnVsZSwgYW4gZW1wdHktYXJyYXkgd3JpdGUgc2lsZW50bHkgYmVjb21lcyBhIG5vLW9wIHdoaWNoIGlzXG4gKiAgIGltcG9zc2libGUgdG8gZGlzdGluZ3Vpc2ggZnJvbSBhIGJ1Zy5cbiAqIC0gT2JqZWN0czogcmVjdXJzaXZlIG1lcmdlIG9mIG93biBlbnVtZXJhYmxlIHN0cmluZyBrZXlzLCBpbmNsdWRpbmcgc3BlY2lhbCBrZXlzO1xuICogICBpbmhlcml0ZWQgZGVzdGluYXRpb24gdmFsdWVzIGFuZCBzZXR0ZXJzIG5ldmVyIHBhcnRpY2lwYXRlLlxuICogLSBQcmltaXRpdmVzOiBzb3VyY2Ugd2luc1xuICpcbiAqIFRlcm1pbmF0ZXMgb24gYSBDWUNMSUMgYHNyY2AgKDkuMTguMSwgc2FtZSBsYXcgYXMge0BsaW5rIGRlZXBFcXVhbH06IGFcbiAqIHN0YXRlIHZhbHVlIHN1cnZpdmVzIGBzdHJ1Y3R1cmVkQ2xvbmVgLCB3aGljaCBwcmVzZXJ2ZXMgY3ljbGVzKS4gQSBgc3JjYFxuICogb2JqZWN0IHJlLWVudGVyZWQgd2hpbGUgaXQgaXMgc3RpbGwgYmVpbmcgbWVyZ2VkIGhpZ2hlciB1cCB0aGUgc3RhY2sgaGFuZHNcbiAqIGJhY2sgdGhlIG91dHB1dCBiZWluZyBidWlsdCBmb3IgaXQsIHNvIHRoZSBtZXJnZWQgdmFsdWUgbWlycm9ycyB0aGUgY3ljbGVcbiAqIGluc3RlYWQgb2YgdW5yb2xsaW5nIGl0IGZvcmV2ZXIuIE9ubHkgdGhlIGFuY2VzdG9ycyBvbiB0aGUgc3RhY2sgYXJlXG4gKiBndWFyZGVkIOKAlCBhIHNoYXJlZCAoYWN5Y2xpYykgYHNyY2AgcmVmZXJlbmNlIG1ldCBhZ2FpbiBhdCBhIGRpZmZlcmVudFxuICogYGRzdGAgbWVyZ2VzIGFnYWluc3QgVEhBVCBgZHN0YCwgZXhhY3RseSBhcyBiZWZvcmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWVwU21hcnRNZXJnZShkc3Q6IGFueSwgc3JjOiBhbnkpOiBhbnkge1xuICByZXR1cm4gbWVyZ2VHdWFyZGVkKGRzdCwgc3JjLCB1bmRlZmluZWQpO1xufVxuXG5mdW5jdGlvbiBtZXJnZUd1YXJkZWQoZHN0OiBhbnksIHNyYzogYW55LCBpbkZsaWdodDogV2Vha01hcDxvYmplY3QsIGFueT4gfCB1bmRlZmluZWQpOiBhbnkge1xuICBpZiAoc3JjID09PSBudWxsIHx8IHR5cGVvZiBzcmMgIT09ICdvYmplY3QnKSByZXR1cm4gc3JjO1xuXG4gIGlmIChBcnJheS5pc0FycmF5KHNyYykpIHtcbiAgICBpZiAoc3JjLmxlbmd0aCA9PT0gMCkgcmV0dXJuIFtdOyAvLyBlbXB0eSBzcmMgPSBjbGVhciwgbm90IG5vLW9wXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZHN0KSkgcmV0dXJuIFsuLi5uZXcgU2V0KFsuLi5kc3QsIC4uLnNyY10pXTtcbiAgICByZXR1cm4gWy4uLnNyY107XG4gIH1cblxuICBpZiAoaW5GbGlnaHQ/LmhhcyhzcmMpKSByZXR1cm4gaW5GbGlnaHQuZ2V0KHNyYyk7IC8vIGN5Y2xlIOKAlCByZS1lbnRlciB0aGUgdmFsdWUgYmVpbmcgYnVpbHRcblxuICBjb25zdCBvdXQ6IGFueSA9IHsgLi4uKGRzdCAmJiB0eXBlb2YgZHN0ID09PSAnb2JqZWN0JyA/IGRzdCA6IHt9KSB9O1xuICAoaW5GbGlnaHQgPz89IG5ldyBXZWFrTWFwKCkpLnNldChzcmMsIG91dCk7XG4gIGZvciAoY29uc3QgayBvZiBPYmplY3Qua2V5cyhzcmMpKSB7XG4gICAgY29uc3Qgb3ducyA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvdXQsIGspO1xuICAgIGNvbnN0IHZhbHVlID0gbWVyZ2VHdWFyZGVkKG93bnMgPyBvdXRba10gOiB1bmRlZmluZWQsIHNyY1trXSwgaW5GbGlnaHQpO1xuICAgIHB1dE93bihvdXQsIGssIHZhbHVlKTtcbiAgfVxuICBpbkZsaWdodC5kZWxldGUoc3JjKTtcbiAgcmV0dXJuIG91dDtcbn1cbiJdfQ==
|