footprintjs 9.44.3 → 9.45.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CLAUDE.md +2 -1
- package/dist/esm/lib/memory/DiagnosticCollector.js +2 -2
- package/dist/esm/lib/memory/SharedMemory.d.ts +11 -10
- package/dist/esm/lib/memory/SharedMemory.js +19 -20
- package/dist/esm/lib/memory/StageContext.d.ts +7 -1
- package/dist/esm/lib/memory/StageContext.js +27 -14
- package/dist/esm/lib/memory/TransactionBuffer.d.ts +4 -3
- package/dist/esm/lib/memory/TransactionBuffer.js +5 -4
- package/dist/esm/lib/memory/utils.d.ts +11 -7
- package/dist/esm/lib/memory/utils.js +46 -28
- package/dist/lib/memory/DiagnosticCollector.js +2 -2
- package/dist/lib/memory/SharedMemory.js +19 -20
- package/dist/lib/memory/StageContext.js +27 -14
- package/dist/lib/memory/TransactionBuffer.js +5 -4
- package/dist/lib/memory/utils.js +46 -28
- package/dist/types/lib/memory/SharedMemory.d.ts +11 -10
- package/dist/types/lib/memory/StageContext.d.ts +7 -1
- package/dist/types/lib/memory/TransactionBuffer.d.ts +4 -3
- package/dist/types/lib/memory/utils.d.ts +11 -7
- package/package.json +1 -1
|
@@ -132,8 +132,9 @@ export class TransactionBuffer {
|
|
|
132
132
|
*/
|
|
133
133
|
detachedBase;
|
|
134
134
|
/**
|
|
135
|
-
* Where the stage writes (9.30.0):
|
|
136
|
-
*
|
|
135
|
+
* Where the stage writes (9.30.0): a path prefix its frame computed and
|
|
136
|
+
* hands over as data (C2 — for the engine, the frame's run namespace, or
|
|
137
|
+
* `[]` for the root). Its containers are the stage's ADDRESS, not a value
|
|
137
138
|
* the stage reads (every read it makes is a key below it), so a shell a
|
|
138
139
|
* write leaves there is no part of the read-back the record must hold.
|
|
139
140
|
*/
|
|
@@ -414,7 +415,7 @@ export class TransactionBuffer {
|
|
|
414
415
|
* - a container still SHARED with committed state at the same position is
|
|
415
416
|
* replaced by a private deep copy when it is the value read, or by a
|
|
416
417
|
* shallow copy when it is a container on the way to it (so a read of
|
|
417
|
-
* `
|
|
418
|
+
* `k` under a fork child's address copies `k`, not every child's namespace);
|
|
418
419
|
* - a container the stage STAGED (or anything else the buffer did not
|
|
419
420
|
* take from committed state) is handed back by reference, as before;
|
|
420
421
|
* - a container the buffer owns is walked on — and when it is the value
|
|
@@ -942,4 +943,4 @@ function flattenedTraceRow(op) {
|
|
|
942
943
|
function provenance(readKeys) {
|
|
943
944
|
return readKeys !== undefined ? { readKeys } : undefined;
|
|
944
945
|
}
|
|
945
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVHJhbnNhY3Rpb25CdWZmZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL21lbW9yeS9UcmFuc2FjdGlvbkJ1ZmZlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBK0RHO0FBRUgsT0FBTyxFQUFtRCxjQUFjLEVBQUUsYUFBYSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDaEgsT0FBTyxFQUE4QixpQkFBaUIsRUFBRSxpQkFBaUIsRUFBRSxZQUFZLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNwSCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sRUFDTCxLQUFLLEVBQ0wsV0FBVyxFQUNYLFNBQVMsSUFBSSxJQUFJLEVBQ2pCLFNBQVMsSUFBSSxJQUFJLEVBQ2pCLEdBQUcsRUFDSCxRQUFRLEVBQ1IsV0FBVyxFQUNYLFFBQVEsRUFDUixXQUFXLEdBQ1osTUFBTSxjQUFjLENBQUM7QUFFdEIsT0FBTyxFQUFFLFNBQVMsRUFBRSxjQUFjLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFFdEYsTUFBTSxPQUFPLGlCQUFpQjtJQUM1Qjs7Ozs7T0FLRztJQUNLLFlBQVksQ0FBTTtJQUNsQixXQUFXLENBQU07SUFFakIsY0FBYyxHQUFnQixFQUFFLENBQUM7SUFDakMsV0FBVyxHQUFnQixFQUFFLENBQUM7SUFDOUIsT0FBTyxHQUEwRCxFQUFFLENBQUM7SUFDcEUsYUFBYSxHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7SUFDMUM7Ozs7Ozs7T0FPRztJQUNLLFFBQVEsR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO0lBQ3JDLDBFQUEwRTtJQUN6RCxZQUFZLENBQW1CO0lBRWhEOzs7K0VBRzJFO0lBQzFELGdCQUFnQixD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QUcsQ0FBQyxFQUFFLENBQUMsUUFBUSxLQUFLLFNBQVMsSUFBSSxFQUFFLFFBQVEsRUFBRSxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUMsRUFBRTtRQUN0RyxDQUFDLENBQUMsRUFBRSxDQUFDO0FBQ1QsQ0FBQztBQUVELDBGQUEwRjtBQUMxRixTQUFTLFVBQVUsQ0FBQyxRQUE4QjtJQUNoRCxPQUFPLFFBQVEsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztBQUMzRCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBUcmFuc2FjdGlvbkJ1ZmZlciDigJQgUGVyLXN0YWdlIFNUQUdJTkcgYnVmZmVyIGZvciBzdGF0ZSBtdXRhdGlvbnNcbiAqXG4gKiBXaGF0IGl0IElTOiBhIHN0YWdpbmcgYnVmZmVyIHdpdGggcmVhZC15b3VyLXdyaXRlcyBhbmQgbmV0LWNoYW5nZSBjb21taXRzLlxuICogLSBDaGFuZ2VzIGFyZSBzdGFnZWQgaGVyZSBkdXJpbmcgc3RhZ2UgZXhlY3V0aW9uIGFuZCBmbHVzaGVkIHRvXG4gKiAgIFNoYXJlZE1lbW9yeSBpbiBPTkUgYmF0Y2ggcGVyIHN0YWdlIChgY29tbWl0KClgKSDigJQgb3RoZXIgc3RhZ2VzIGFuZFxuICogICBwYXJhbGxlbCBzaWJsaW5ncyBuZXZlciBvYnNlcnZlIGEgc3RhZ2UncyBoYWxmLWZpbmlzaGVkIHdyaXRlcy5cbiAqIC0gUmVhZC1hZnRlci13cml0ZSBjb25zaXN0ZW5jeSB3aXRoaW4gYSBzdGFnZSDigJQgYSBzdGFnZSBzZWVzIGl0cyBvd25cbiAqICAgc3RhZ2VkIHdyaXRlcyBpbW1lZGlhdGVseS5cbiAqIC0gYGNvbW1pdCgpYCByZWNvcmRzIHRoZSBzdGFnZSdzIE5FVCBjaGFuZ2UgKHNlZSB7QGxpbmsgY29tbWl0fSksIHBsdXMgYW5cbiAqICAgb3BlcmF0aW9uIHRyYWNlIGZvciBkZXRlcm1pbmlzdGljIHJlcGxheS5cbiAqXG4gKiBXaGF0IGl0IGlzIE5PVDogYSByb2xsYmFjayBtZWNoYW5pc20uIERlc3BpdGUgdGhlIG5hbWUsIHRoZXJlIGlzIG5vXG4gKiBhYm9ydC9yb2xsYmFjayBwYXRoIOKAlCB3aGVuIGEgc3RhZ2UgVEhST1dTLCB0aGUgZW5naW5lIHN0aWxsIGNvbW1pdHNcbiAqIGV2ZXJ5dGhpbmcgc3RhZ2VkIHNvIGZhciBiZWZvcmUgcmUtdGhyb3dpbmcgKGNvbW1pdC1vbi1lcnJvciBpblxuICogYEZsb3djaGFydFRyYXZlcnNlcmApLiBUaGF0IGlzIGRlbGliZXJhdGU6IHRoZSBhdWRpdCB0cmFpbCBtdXN0IHJlY29yZFxuICogd2hhdCB0aGUgZmFpbGluZyBzdGFnZSBjaGFuZ2VkLiBEbyBub3QgcmVseSBvbiBcInN0YWdlIGZhaWxlZCDihpIgaXRzXG4gKiB3cml0ZXMgdmFuaXNoZWRcIi5cbiAqXG4gKiBUaGUgcGF0Y2ggdHJlZXMgaG9sZCBSRUZFUkVOQ0VTIHVudGlsIGNvbW1pdCAoOS4yMy4wKS4gQSBgc2V0YCBzdG9yZXMgdGhlXG4gKiBjYWxsZXIncyBvd24gdmFsdWUgaW4gYG92ZXJ3cml0ZVBhdGNoYCBleGFjdGx5IGFzIGl0IGFsd2F5cyBkaWQgaW5cbiAqIGB3b3JraW5nQ29weWA7IHRoZSBjb3B5IHRoZSByZWNvcmQgbmVlZHMgaXMgdGFrZW4gT05DRSBwZXIgc3Vydml2aW5nIHBhdGhcbiAqIHdoZW4gdGhlIHBheWxvYWQgbGVhdmVzIHRoZSBidWZmZXIgKGB0b0NoYW5nZU9ubHlQYXlsb2FkYCAvXG4gKiBgdG9EZWx0YVBheWxvYWRgIOKAlCBldmVyeSB2YWx1ZSB0aGV5IGVtaXQgcGFzc2VzIHRocm91Z2ggYHN0cnVjdHVyZWRDbG9uZWBcbiAqIHRoZXJlKS4gVGhlIGxhdyBcInRoZSByZWNvcmQgbmV2ZXIgYWxpYXNlcyBhIGNhbGxlcidzIG9iamVjdFwiIGlzIGtlcHQgYXRcbiAqIHRoZSBjb21taXQgYm91bmRhcnkgaW5zdGVhZCBvZiBhdCBldmVyeSB3cml0ZSwgd2hpY2ggaXMgd2hhdCBtYWtlcyBOXG4gKiB3cml0ZXMgdG8gb25lIHBhdGggTyhOKSBpbnN0ZWFkIG9mIE8oTiDDlyBzaXplKS4gQ29uc2VxdWVuY2UsIGJ5IGRlc2lnbjogYVxuICogY2FsbGVyIHdobyBtdXRhdGVzIGl0cyBvd24gb2JqZWN0IEFGVEVSIHRoZSB3cml0ZSBhbmQgQkVGT1JFIHRoZSBzdGFnZVxuICogZW5kcyBjb21taXRzIHRoZSB2YWx1ZSBhcyB0aGUgc3RhZ2UgcmVhZCBpdCBiYWNrIOKAlCB0aGUgcmVjb3JkIGFncmVlcyB3aXRoXG4gKiB0aGUgc3RhZ2UgKENMQVVERS5tZCBsYW5kbWluZSAzJ3MgZmlyc3QgYml0ZSwgY2xvc2VkKS4gVGhlIG9uZSBwbGFjZSB0aGVcbiAqIGVuZ2luZSBpdHNlbGYgZWRpdHMgVEhST1VHSCBhIHN0YWdlZCB2YWx1ZSDigJQgYSBsYXRlciBuZXN0ZWQgb3AgdW5kZXIgYVxuICogYHNldGAgcGF0aCDigJQgZGV0YWNoZXMgdGhhdCB2YWx1ZSBmaXJzdCAoe0BsaW5rIGRldGFjaEhlbGRBbmNlc3RvcnN9KSwgc29cbiAqIGB3b3JraW5nQ29weWAgYW5kIGBvdmVyd3JpdGVQYXRjaGAgbmV2ZXIgc2hhcmUgYSBjb250YWluZXIgdGhlIGVuZ2luZVxuICogbXV0YXRlcyBvbiBvbmUgc2lkZSBvbmx5LlxuICpcbiAqIENPUFktT04tV1JJVEUgKDkuMjkuMCDigJQgZG9jcy9kZXNpZ24vMjAyNi0xMC1jb3B5LW9uLXdyaXRlLWNvbW1pdC5tZCkuIFRoZVxuICogYnVmZmVyIG5vIGxvbmdlciBjbG9uZXMgdGhlIGNvbW1pdHRlZCBzdGF0ZSBpdCBzdGFydHMgZnJvbS4gYGJhc2VTbmFwc2hvdGBcbiAqIElTIHRoZSBjb21taXR0ZWQgZ2VuZXJhdGlvbiB0aGUgc3RhZ2UgZmlyc3QgdG91Y2hlZCAoaGVsZCBieSByZWZlcmVuY2Ug4oCUXG4gKiBjb21taXR0ZWQgc3RhdGUgaXMgaW1tdXRhYmxlLWFmdGVyLXN3YXApLCBhbmQgYHdvcmtpbmdDb3B5YCBzdGFydHMgYXMgYVxuICogY29weSBvZiBpdHMgUk9PVCBvbmx5OiBlYWNoIHdyaXRlIGNvcGllcyB0aGUgY29udGFpbmVycyBvbiBpdHMgb3duIHBhdGhcbiAqICh7QGxpbmsgb3duU3BpbmV9KSwgYW5kIHRoZSBmaXJzdCBSRUFEIGFmdGVyIHRoZSBzdGFnZSdzIGZpcnN0IHdyaXRlIG9mIGFcbiAqIGNvbnRhaW5lciBzdGlsbCBzaGFyZWQgd2l0aCBjb21taXR0ZWQgc3RhdGUgdGFrZXMgYSBwcml2YXRlIGRlZXAgY29weSBvZlxuICogaXQgKHtAbGluayBwcml2YXRpc2V9KSDigJQgd2hhdCB0aGUgd2hvbGUtc3RhdGUgY2xvbmUgdXNlZCB0byBnaXZlIGV2ZXJ5XG4gKiByZWFkLCBzbyBhbiBpbi1wbGFjZSBlZGl0IG9mIGEgcmVhZCB2YWx1ZSBzdGF5cyBwcml2YXRlIGV4YWN0bHkgYXMgaXQgZGlkLlxuICogQSByZWFkIHRoZSB3b3JraW5nIGNvcHkgY2Fubm90IGFuc3dlciBpcyBzZXJ2ZWQgZnJvbSBsaXZlIHN0YXRlIGJ5IHRoZVxuICogY2FsbGVyLCBhcyBiZWZvcmU7IHRoZSBidWZmZXIgdGhlbiByZXBsYWNlcyB0aGF0IHBhdGggb2YgaXRzIGRpZmYgYmFzZVxuICogd2l0aCBhIHByaXZhdGUgY29weSAoe0BsaW5rIGRldGFjaEJhc2V9KSwgYXMgdGhlIGNsb25lIGhhZCBpdC5cbiAqXG4gKiBUSEUgQURNSVRURUQgUkVDT1JEICg5LjMwLjAg4oCUIGRvY3MvZGVzaWduLzIwMjYtMTAtYWRtaXR0ZWQtcmVjb3JkLm1kKS4gQVxuICogY29tbWl0IGlzIGFkbWl0dGVkIG9ubHkgaWYgaXRzIGJ1bmRsZSBmb2xkcyBiYWNrIHRvIHRoZSBzdGFnZSdzXG4gKiByZWFkLXlvdXItd3JpdGVzIHZpZXcgYXQgZXZlcnkgcGF0aCB0aGUgc3RhZ2UgdG91Y2hlZCAoYW5kIGF0IGV2ZXJ5XG4gKiBjb250YWluZXIgaXRzIHdyaXRlcyBjcmVhdGVkIG9uIHRoZSB3YXkgdGhlcmUsIGJlbG93IHRoZSBzdGFnZSdzIGFkZHJlc3MpLlxuICogQm90aCBlbmNvZGVycyBjb21taXQgdGhlIHZhbHVlIHRoZSBzdGFnZSByZWFkOiBhIGNvbXBhY3Qgcm93IOKAlCBhIGBtZXJnZWBcbiAqIGRlbHRhLCBhbiBgYXBwZW5kYCB0YWlsIOKAlCBpcyBrZXB0IHdoZXJlIGl0IHByb3ZhYmx5IGZvbGRzIGJhY2s7IGEgZmFtaWx5IG9mXG4gKiByb3dzIHRoYXQgZG9lcyBub3QgaXMgcmVjb3JkZWQgYXMgYHNldGAgcm93cyBvZiB0aGUgdmFsdWVzIHRoZSBzdGFnZSByZWFkXG4gKiAoe0BsaW5rIGFkbWl0fSkuIEJlZm9yZSA5LjMwLjAgdGhlIG9uZSBhY2N1bXVsYXRlZCBtZXJnZSBkZWx0YSBwZXIgcGF0aCB3YXNcbiAqIHJlcGxheWVkIGF0IGV2ZXJ5IGBtZXJnZWAgcm93IG9mIHRoYXQgcGF0aCwgd2hpY2ggbGllZCBhY3Jvc3MgYSBoYXJkIHdyaXRlXG4gKiAoYCR1cGRhdGUoayx7eH0pOyBrID0ge3l9OyAkdXBkYXRlKGsse3p9KWAgY29tbWl0dGVkIGB7eSwgeCwgen1gIGZvciBhXG4gKiByZWFkLWJhY2sgb2YgYHt5LCB6fWApLCBhbiBgW11gIGNsZWFyLCBhIGtpbmQgY2hhbmdlIG9yIGFuIGFycmF5IHVuaW9uXG4gKiBkZWR1cGxpY2F0ZWQgYnkgcmVmZXJlbmNlLiBWZXJpZmllZCB3aGVuIHRoZSBzdGFnZSBzdGFnZWQgYSBgbWVyZ2VgIG9yIGFcbiAqIG5lc3RlZCBvcDsgYSBzdGFnZSB0aGF0IHN0YWdlZCBvbmx5IGBzZXRgIC8gYGRlbGV0ZWAgb2Yga2V5cyBkaXJlY3RseSB1bmRlclxuICogaXRzIGFkZHJlc3MgaXMgY29oZXJlbnQgYnkgY29uc3RydWN0aW9uIOKAlCBib3RoIHRyZWVzIHJlY2VpdmUgdGhlIHNhbWVcbiAqIHdyaXRlIOKAlCBhbmQgaXMgYWRtaXR0ZWQgd2l0aG91dCB0aGUgZm9sZC5cbiAqL1xuXG5pbXBvcnQgeyB0eXBlIEZhbWlseSwgdHlwZSBMb3NzeSwgdHlwZSBNZW1iZXIsIHR5cGUgUm93cywgYWRkcmVzc0RlcHRoT2YsIGxvc3N5RmFtaWxpZXMgfSBmcm9tICcuL2FkbWlzc2lvbi5qcyc7XG5pbXBvcnQgeyB0eXBlIE9wVmVyYiwgdHlwZSBTdXJ2aXZvciwgZW1pdEluRmFtaWx5T3JkZXIsIGdyb3VwSW50b0ZhbWlsaWVzLCBwdXNoVmFsdWVSb3cgfSBmcm9tICcuL2RlbHRhRW5jb2RpbmcuanMnO1xuaW1wb3J0IHsgcmVsYXRpb24gfSBmcm9tICcuL2tleVBhdGhzLmpzJztcbmltcG9ydCB7XG4gIGFkb3B0LFxuICBpc0NvbnRhaW5lcixcbiAgbmF0aXZlR2V0IGFzIF9nZXQsXG4gIG5hdGl2ZVNldCBhcyBfc2V0LFxuICBvd24sXG4gIG93bkNoaWxkLFxuICBvd25lZFJvb3RPZixcbiAgb3duU3BpbmUsXG4gIHNoYWxsb3dDb3B5LFxufSBmcm9tICcuL3BhdGhPcHMuanMnO1xuaW1wb3J0IHR5cGUgeyBDb21taXRWYWx1ZXNNb2RlLCBNZW1vcnlQYXRjaCwgVHJhY2VFbnRyeSB9IGZyb20gJy4vdHlwZXMuanMnO1xuaW1wb3J0IHsgZGVlcEVxdWFsLCBkZWVwU21hcnRNZXJnZSwgREVMSU0sIGRyeUZvbGQsIG5vcm1hbGlzZVBhdGggfSBmcm9tICcuL3V0aWxzLmpzJztcblxuZXhwb3J0IGNsYXNzIFRyYW5zYWN0aW9uQnVmZmVyIHtcbiAgLyoqXG4gICAqIFRoZSBuZXQtY2hhbmdlIGRpZmYgYmFzZTogdGhlIGNvbW1pdHRlZCBnZW5lcmF0aW9uIHRoZSBzdGFnZSBmaXJzdFxuICAgKiB0b3VjaGVkLCBieSByZWZlcmVuY2Ug4oCUIGV4Y2VwdCB3aGVyZSB7QGxpbmsgZGV0YWNoQmFzZX0gcmVwbGFjZWQgYSBwYXRoXG4gICAqIG9mIGl0IHdpdGggYSBwcml2YXRlIGNvcHkgKGl0cyByb290IGFuZCB0aGUgY29udGFpbmVycyBvbiB0aGUgd2F5IGFyZVxuICAgKiB0aGVuIGNvcGllcyB0b28sIG93bmVkIGJ5IHtAbGluayBiYXNlT3duZWR9KS5cbiAgICovXG4gIHByaXZhdGUgYmFzZVNuYXBzaG90OiBhbnk7XG4gIHByaXZhdGUgd29ya2luZ0NvcHk6IGFueTtcblxuICBwcml2YXRlIG92ZXJ3cml0ZVBhdGNoOiBNZW1vcnlQYXRjaCA9IHt9O1xuICBwcml2YXRlIHVwZGF0ZVBhdGNoOiBNZW1vcnlQYXRjaCA9IHt9O1xuICBwcml2YXRlIG9wVHJhY2U6IHsgcGF0aDogc3RyaW5nOyB2ZXJiOiBPcFZlcmI7IHJlYWRLZXlzPzogc3RyaW5nW10gfVtdID0gW107XG4gIHByaXZhdGUgcmVkYWN0ZWRQYXRocyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAvKipcbiAgICogUGF0aHMgd2hvc2UgYG92ZXJ3cml0ZVBhdGNoYCB2YWx1ZSBpcyB0aGUgY2FsbGVyJ3Mgb3duIG9iamVjdCAoOS4yMy4wKTpcbiAgICogYSBgc2V0YCBvZiBhIGNvbnRhaW5lciBzdG9yZXMgdGhlIHJlZmVyZW5jZSwgYW5kIHRoaXMgaXMgdGhlIGxlZGdlciBvZlxuICAgKiB3aGljaCBvbmVzIGFyZSBzdGlsbCBzaGFyZWQgd2l0aCB0aGUgY2FsbGVyIChhbmQgd2l0aCBgd29ya2luZ0NvcHlgKS5cbiAgICogQ29uc3VsdGVkIG9ubHkgYnkgdGhlIGVuZ2luZSdzIG5lc3RlZCBvcHMg4oCUIHNlZVxuICAgKiB7QGxpbmsgZGV0YWNoSGVsZEFuY2VzdG9yc307IHRoZSBjb21taXQgcGF5bG9hZCBjbG9uZXMgZXZlcnkgc3Vydml2aW5nXG4gICAqIHZhbHVlIGFueXdheSBhbmQgbmV2ZXIgYXNrcy4gQ2xlYXJlZCB3aXRoIHRoZSByZXN0IGF0IGBjb21taXQoKWAuXG4gICAqL1xuICBwcml2YXRlIGhlbGRSZWZzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIC8qKiBDb21taXQtdmFsdWUgZW5jb2RpbmcgcG9saWN5ICgjMTNjLUIpLiBgJ2Z1bGwnYCA9IGhpc3RvcmljYWwgYnl0ZXMuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgY29tbWl0VmFsdWVzOiBDb21taXRWYWx1ZXNNb2RlO1xuXG4gIC8qKiBQZXItd3JpdGUgcmVhZC1wcm92ZW5hbmNlIHNvdXJjZSAoI1AxKS4gV2hlbiBzZXQgKHRoZVxuICAgKiAgYHdyaXRlUHJvdmVuYW5jZTogJ3JlYWRzLXByZWZpeCdgIGRpYWwpLCBldmVyeSBzdGFnZWQgb3Agc25hcHNob3RzIHRoZVxuICAgKiAga2V5cyB0cmFja2VkLXJlYWQgc28gZmFyIOKAlCB0aGUgdGVtcG9yYWwtcHJlZml4IGF0dHJpYnV0aW9uIGNvbnN1bWVkIGJ5XG4gICAqICBjYXVzYWwgc2xpY2luZy4gVW5kZWZpbmVkIChkZWZhdWx0KSA9IHplcm8gY29zdCwgYnl0ZS1pZGVudGljYWwgb3BzLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHJlYWRLZXlzUHJvdmlkZXI/OiAoKSA9PiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogVGhlIGNvbnRhaW5lcnMgaW4gYHdvcmtpbmdDb3B5YCB0aGlzIGJ1ZmZlciBDUkVBVEVEOiBpdHMgcm9vdCBjb3B5LCB0aGVcbiAgICogcGF0aCBjb3BpZXMgaXRzIHdyaXRlcyBtYWRlLCB0aGUgbWVyZ2UgcmVzdWx0cyBpdCBidWlsdCwgYW5kIGV2ZXJ5XG4gICAqIGNvbnRhaW5lciBvZiB0aGUgcHJpdmF0ZSBjb3BpZXMgaXRzIHJlYWRzIHRvb2suIEEgd3JpdGUgZWRpdHMgdGhlc2UgaW5cbiAgICogcGxhY2UuIEV2ZXJ5dGhpbmcgZWxzZSBpbiBgd29ya2luZ0NvcHlgIGlzIFNIQVJFRCDigJQgd2l0aCB0aGUgY29tbWl0dGVkXG4gICAqIGdlbmVyYXRpb24gdGhlIHN0YWdlIGZpcnN0IHRvdWNoZWQsIG9yIHdpdGggYSB2YWx1ZSB0aGUgc3RhZ2Ugc3RhZ2VkIOKAlFxuICAgKiBhbmQgaXMgY29waWVkIGJlZm9yZSBhIHdyaXRlIHBhc3NlcyB0aHJvdWdoIGl0ICh7QGxpbmsgb3duU3BpbmV9KS5cbiAgICovXG4gIHByaXZhdGUgb3duZWQgPSBuZXcgV2Vha1NldDxvYmplY3Q+KCk7XG5cbiAgLyoqXG4gICAqIENvbnRhaW5lciB2YWx1ZXMgdGhlIHN0YWdlIHN0YWdlZCB3aXRoIHtAbGluayBzZXR9IOKAlCBpdHMgb3duIG9iamVjdHMsXG4gICAqIGhlbGQgYnkgcmVmZXJlbmNlICg5LjIzLjApLiBBIHJlYWQgaGFuZHMgdGhlbSBiYWNrIGFzIHRoZXkgYXJlLCBleGFjdGx5XG4gICAqIGFzIHRoZSBwcml2YXRlIHdvcmtpbmcgY29weSBhbHdheXMgZGlkLCBhbmQgbmV2ZXIgcHJpdmF0aXNlcyB0aGVtOiBhXG4gICAqIHByaXZhdGUgY29weSBvZiBhIHN0YWdlZCB2YWx1ZSB3b3VsZCBsZWF2ZSBgd29ya2luZ0NvcHlgIGFuZFxuICAgKiBgb3ZlcndyaXRlUGF0Y2hgIGRpc2FncmVlaW5nIGFib3V0IGEgdmFsdWUgdGhlIHN0YWdlIHdyb3RlLlxuICAgKi9cbiAgcHJpdmF0ZSBzdGFnZWQgPSBuZXcgV2Vha1NldDxvYmplY3Q+KCk7XG5cbiAgLyoqXG4gICAqIE93bmVkIGNvbnRhaW5lcnMgd2l0aCBubyBjb250YWluZXIgc3RpbGwgc2hhcmVkIHdpdGggY29tbWl0dGVkIHN0YXRlXG4gICAqIGFueXdoZXJlIGJlbG93IHRoZW0gKGEgcHJpdmF0ZSBkZWVwIGNvcHksIGEgbWVyZ2UgcmVzdWx0IGJ1aWx0IG9uIGFcbiAgICogcHJpdmF0ZSBiYXNlLCBhIHBhdGggY29weSB3aG9zZSBzaGFyZWQgY2hpbGRyZW4gd2VyZSBwcml2YXRpc2VkKS4gQSByZWFkXG4gICAqIHRoYXQgbGFuZHMgb24gb25lIG5lZWRzIG5vIHdhbGsg4oCUIHNlZSB7QGxpbmsgcHJpdmF0aXNlQmVsb3d9LlxuICAgKi9cbiAgcHJpdmF0ZSBwcml2YXRlVHJlZXMgPSBuZXcgV2Vha1NldDxvYmplY3Q+KCk7XG5cbiAgLyoqXG4gICAqIFRoZSBjb250YWluZXJzIG9mIHtAbGluayBiYXNlU25hcHNob3R9IHRoYXQge0BsaW5rIGRldGFjaEJhc2V9IGNyZWF0ZWQ6XG4gICAqIGl0cyByb290IGNvcHkgYW5kIHRoZSBjb3BpZXMgb24gdGhlIHdheSB0byBhIGRldGFjaGVkIHBhdGguIEFsbG9jYXRlZFxuICAgKiBvbmx5IGJ5IHRoZSBmaXJzdCBkZXRhY2gg4oCUIHRoZSBpbi1jb250cmFjdCBzdGFnZSBuZXZlciBwYXlzIGZvciBpdC5cbiAgICovXG4gIHByaXZhdGUgYmFzZU93bmVkPzogV2Vha1NldDxvYmplY3Q+O1xuXG4gIC8qKlxuICAgKiBUaGUgcHJpdmF0ZSBkZWVwIGNvcGllcyB7QGxpbmsgZGV0YWNoQmFzZX0gcHV0IGludG8gdGhlIGRpZmYgYmFzZTogbm90aGluZ1xuICAgKiBhdCBvciBiZWxvdyBvbmUgaXMgY29tbWl0dGVkIHN0YXRlLCBzbyBhIGxhdGVyIGRldGFjaCBpbnNpZGUgaXQgaXMgYSBuby1vcC5cbiAgICovXG4gIHByaXZhdGUgZGV0YWNoZWRCYXNlPzogV2Vha1NldDxvYmplY3Q+O1xuXG4gIC8qKlxuICAgKiBXaGVyZSB0aGUgc3RhZ2Ugd3JpdGVzICg5LjMwLjApOiBgWydydW5zJywgcnVuSWRdYCBmb3IgYSBydW4tbmFtZXNwYWNlZFxuICAgKiBzdGFnZSwgYFtdYCBvdGhlcndpc2UuIEl0cyBjb250YWluZXJzIGFyZSB0aGUgc3RhZ2UncyBBRERSRVNTLCBub3QgYSB2YWx1ZVxuICAgKiB0aGUgc3RhZ2UgcmVhZHMgKGV2ZXJ5IHJlYWQgaXQgbWFrZXMgaXMgYSBrZXkgYmVsb3cgaXQpLCBzbyBhIHNoZWxsIGFcbiAgICogd3JpdGUgbGVhdmVzIHRoZXJlIGlzIG5vIHBhcnQgb2YgdGhlIHJlYWQtYmFjayB0aGUgcmVjb3JkIG11c3QgaG9sZC5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgYWRkcmVzczogcmVhZG9ubHkgc3RyaW5nW107XG5cbiAgLyoqIGBtZXJnZWAgb3BzIHN0YWdlZCBzaW5jZSB0aGUgbGFzdCBjb21taXQg4oCUIHNlZSB7QGxpbmsgYWRtaXR9LiAqL1xuICBwcml2YXRlIHN0YWdlZE1lcmdlcyA9IDA7XG4gIC8qKiBPcHMgc3RhZ2VkIGRlZXBlciB0aGFuIG9uZSBrZXkgYmVsb3cgdGhlIHN0YWdlJ3MgYWRkcmVzcyDigJQgc2VlIHtAbGluayBhZG1pdH0uICovXG4gIHByaXZhdGUgbmVzdGVkT3BzID0gMDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBiYXNlOiBhbnksXG4gICAgY29tbWl0VmFsdWVzOiBDb21taXRWYWx1ZXNNb2RlID0gJ2Z1bGwnLFxuICAgIHJlYWRLZXlzUHJvdmlkZXI/OiAoKSA9PiBzdHJpbmdbXSxcbiAgICBhZGRyZXNzOiByZWFkb25seSBzdHJpbmdbXSA9IFtdLFxuICApIHtcbiAgICAvLyBgYmFzZWAgaXMgdGhlIGNvbW1pdHRlZCBnZW5lcmF0aW9uIHRoZSBzdGFnZSBmaXJzdCB0b3VjaGVkIOKAlFxuICAgIC8vIGltbXV0YWJsZS1hZnRlci1zd2FwLCB0aGUgaW52YXJpYW50IHRoZSBmaXJzdC10b3VjaCB2aWV3IGFscmVhZHkgcmVzdHNcbiAgICAvLyBvbiDigJQgc28gdGhlIGRpZmYgYmFzZSBpcyBoZWxkIGJ5IFJFRkVSRU5DRSwgYW5kIHRoZSB3b3JraW5nIGNvcHkgc3RhcnRzXG4gICAgLy8gYXMgYSBjb3B5IG9mIGl0cyBST09UIG9ubHkuIEJlZm9yZSA5LjI5LjAgdGhlc2UgdHdvIGxpbmVzIHdlcmUgdHdvXG4gICAgLy8gYHN0cnVjdHVyZWRDbG9uZWBzIG9mIHRoZSB3aG9sZSBzdGF0ZSwgcGFpZCBieSBldmVyeSBzdGFnZSB0aGF0IHdyb3RlLlxuICAgIHRoaXMuYmFzZVNuYXBzaG90ID0gYmFzZTtcbiAgICB0aGlzLndvcmtpbmdDb3B5ID0gb3duZWRSb290T2YoYmFzZSwgdGhpcy5vd25lZCk7XG4gICAgdGhpcy5jb21taXRWYWx1ZXMgPSBjb21taXRWYWx1ZXM7XG4gICAgdGhpcy5yZWFkS2V5c1Byb3ZpZGVyID0gcmVhZEtleXNQcm92aWRlcjtcbiAgICB0aGlzLmFkZHJlc3MgPSBhZGRyZXNzO1xuICB9XG5cbiAgLyoqIFN0YW1wIHRoZSBjdXJyZW50IHJlYWQgcHJlZml4IG9udG8gYSBzdGFnZWQgb3Ag4oCUIG9ubHkgd2hlbiB0aGVcbiAgICogIHByb3ZlbmFuY2UgZGlhbCBpcyBvbiAocHJvdmlkZXIgcHJlc2VudCksIHNvIHRoZSBkZWZhdWx0IHBhdGggYWxsb2NhdGVzXG4gICAqICBub3RoaW5nIGFuZCBjb21taXQgYnVuZGxlcyBzdGF5IGJ5dGUtaWRlbnRpY2FsLiAqL1xuICBwcml2YXRlIHN0YW1wUmVhZEtleXMob3A6IHsgcGF0aDogc3RyaW5nOyB2ZXJiOiBPcFZlcmI7IHJlYWRLZXlzPzogc3RyaW5nW10gfSk6IHR5cGVvZiBvcCB7XG4gICAgaWYgKHRoaXMucmVhZEtleXNQcm92aWRlcikgb3AucmVhZEtleXMgPSB0aGlzLnJlYWRLZXlzUHJvdmlkZXIoKTtcbiAgICByZXR1cm4gb3A7XG4gIH1cblxuICAvKiogU3RhZ2UgYW4gb3AgaW50byBgb3BUcmFjZWAsIGNvdW50aW5nIHdoYXQgZGVjaWRlcyB3aGV0aGVyIHtAbGluayBhZG1pdH0gbXVzdCBmb2xkLiAqL1xuICBwcml2YXRlIHN0YWdlKHBhdGg6IChzdHJpbmcgfCBudW1iZXIpW10sIGtleTogc3RyaW5nLCB2ZXJiOiBPcFZlcmIpOiB2b2lkIHtcbiAgICBpZiAodmVyYiA9PT0gJ21lcmdlJykgdGhpcy5zdGFnZWRNZXJnZXMrKztcbiAgICBpZiAocGF0aC5sZW5ndGggLSBhZGRyZXNzRGVwdGhPZihwYXRoLCB0aGlzLmFkZHJlc3MpID4gMSkgdGhpcy5uZXN0ZWRPcHMrKztcbiAgICB0aGlzLm9wVHJhY2UucHVzaCh0aGlzLnN0YW1wUmVhZEtleXMoeyBwYXRoOiBrZXksIHZlcmIgfSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhcmQgb3ZlcndyaXRlIGF0IHRoZSBzcGVjaWZpZWQgcGF0aC4gU3RvcmVzIHRoZSBSRUZFUkVOQ0UgaW4gYm90aCB0cmVlc1xuICAgKiAoOS4yMy4wKSDigJQgdGhlIHJlY29yZCdzIGNvcHkgaXMgdGFrZW4gb25jZSwgYXQgY29tbWl0OyBzZWUgdGhlIGhlYWRlci5cbiAgICovXG4gIHNldChwYXRoOiAoc3RyaW5nIHwgbnVtYmVyKVtdLCB2YWx1ZTogYW55LCBzaG91bGRSZWRhY3QgPSBmYWxzZSk6IHZvaWQge1xuICAgIGNvbnN0IGtleSA9IG5vcm1hbGlzZVBhdGgocGF0aCk7XG4gICAgdGhpcy5kZXRhY2hIZWxkQW5jZXN0b3JzKHBhdGgpO1xuICAgIG93blNwaW5lKHRoaXMud29ya2luZ0NvcHksIHBhdGgsIHRoaXMub3duZWQpO1xuICAgIF9zZXQodGhpcy53b3JraW5nQ29weSwgcGF0aCwgdmFsdWUpO1xuICAgIF9zZXQodGhpcy5vdmVyd3JpdGVQYXRjaCwgcGF0aCwgdmFsdWUpO1xuICAgIGlmIChpc0NvbnRhaW5lcih2YWx1ZSkpIHtcbiAgICAgIHRoaXMuaGVsZFJlZnMuYWRkKGtleSk7XG4gICAgICB0aGlzLnN0YWdlZC5hZGQodmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmhlbGRSZWZzLmRlbGV0ZShrZXkpO1xuICAgIH1cbiAgICBpZiAoc2hvdWxkUmVkYWN0KSB7XG4gICAgICB0aGlzLnJlZGFjdGVkUGF0aHMuYWRkKGtleSk7XG4gICAgfVxuICAgIHRoaXMuc3RhZ2UocGF0aCwga2V5LCAnc2V0Jyk7XG4gIH1cblxuICAvKipcbiAgICogQSBuZXN0ZWQgb3AgaXMgYWJvdXQgdG8gd3JpdGUgVEhST1VHSCBhIHBhdGggd2hvc2UgYG92ZXJ3cml0ZVBhdGNoYFxuICAgKiB2YWx1ZSBpcyBhIGhlbGQgcmVmZXJlbmNlICg5LjIzLjApLiBUb2RheSdzIGxhdyBpcyB0aGF0IHRoZSB0d28gdHJlZXNcbiAgICogcmVjZWl2ZSB0aGUgc2FtZSBuZXN0ZWQgYHNldGAvYGRlbGV0ZWAgbXV0YXRpb25zIGJ1dCBPTkxZIGB3b3JraW5nQ29weWBcbiAgICogcmVjZWl2ZXMgYSBuZXN0ZWQgYG1lcmdlYCdzIHJlc3VsdCAoYHVwZGF0ZVBhdGNoYCBnZXRzIHRoZSBkZWx0YSkg4oCUIHNvIGFcbiAgICogY29udGFpbmVyIHNoYXJlZCBiZXR3ZWVuIHRoZSB0cmVlcyB3b3VsZCBsZWFrIHRoZSBtZXJnZWQgdmFsdWUgaW50byB0aGVcbiAgICogb3ZlcndyaXRlIHBheWxvYWQsIGFuZCBhIHNoYXJlZCBjb250YWluZXIgaXMgYWxzbyB0aGUgY2FsbGVyJ3Mgb3duXG4gICAqIG9iamVjdCwgd2hpY2ggdGhlIGVuZ2luZSBtdXN0IG5vdCBlZGl0IG9uIHRoZSByZWNvcmQncyBiZWhhbGYuIFJlcGxhY2luZ1xuICAgKiB0aGUgaGVsZCBhbmNlc3RvciB3aXRoIGl0cyBjbG9uZSBpbiBgb3ZlcndyaXRlUGF0Y2hgIHJlc3RvcmVzIGV4YWN0bHlcbiAgICogdGhlIHByaXZhdGUgdHJlZSB0aGUgcGVyLXdyaXRlIGNsb25lIHVzZWQgdG8gZ2l2ZSBpdCwgcGFpZCBvbmNlIHBlclxuICAgKiBhbmNlc3RvciBhbmQgb25seSBvbiB0aGUgbmVzdGVkLW9wIHBhdGggdGhlIHB1YmxpYyBzdXJmYWNlIG5ldmVyIHRha2VzXG4gICAqICh0aGUgc2NvcGUgcHJveHkgd3JpdGVzIFJPT1Qga2V5cykuIGB3b3JraW5nQ29weWAga2VlcHMgdGhlIHJlZmVyZW5jZSxcbiAgICogYXMgaXQgYWx3YXlzIGRpZC5cbiAgICovXG4gIHByaXZhdGUgZGV0YWNoSGVsZEFuY2VzdG9ycyhwYXRoOiAoc3RyaW5nIHwgbnVtYmVyKVtdKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaGVsZFJlZnMuc2l6ZSA9PT0gMCkgcmV0dXJuO1xuICAgIGZvciAobGV0IGkgPSAxOyBpIDwgcGF0aC5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgYW5jZXN0b3IgPSBwYXRoLnNsaWNlKDAsIGkpO1xuICAgICAgY29uc3Qga2V5ID0gbm9ybWFsaXNlUGF0aChhbmNlc3Rvcik7XG4gICAgICBpZiAoIXRoaXMuaGVsZFJlZnMuaGFzKGtleSkpIGNvbnRpbnVlO1xuICAgICAgY29uc3QgaGVsZCA9IF9nZXQodGhpcy5vdmVyd3JpdGVQYXRjaCwgYW5jZXN0b3IpO1xuICAgICAgaWYgKGhlbGQgIT09IG51bGwgJiYgdHlwZW9mIGhlbGQgPT09ICdvYmplY3QnKSBfc2V0KHRoaXMub3ZlcndyaXRlUGF0Y2gsIGFuY2VzdG9yLCBzdHJ1Y3R1cmVkQ2xvbmUoaGVsZCkpO1xuICAgICAgdGhpcy5oZWxkUmVmcy5kZWxldGUoa2V5KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRXhwbGljaXQga2V5IGRlbGV0aW9uIGF0IHRoZSBzcGVjaWZpZWQgcGF0aCAoIzEzYy1COyBhYnNvcmJzIGJhY2tsb2cgQjgpLlxuICAgKlxuICAgKiBTdGFnZXMgRVhBQ1RMWSB0aGUgc2FtZSBidWZmZXIgbXV0YXRpb25zIGFzIGBzZXQocGF0aCwgdW5kZWZpbmVkKWAg4oCUXG4gICAqIGB3b3JraW5nQ29weWAvYG92ZXJ3cml0ZVBhdGNoYCBnZXQgYW4gb3duIGB1bmRlZmluZWRgIGF0IHRoZSBwYXRoICh0aGVcbiAgICogaGlzdG9yaWNhbCBmbGF0dGVuaW5nLCBwcmVzZXJ2aW5nIHJlYWQgYmVoYXZpb3IgYW5kIHRoZSBkZWR1cCBkaWZmIGJhc2VcbiAgICogYWNyb3NzIG1vZGVzKSDigJQgYnV0IHJlY29yZHMgdGhlIG9wIHZlcmIgYXMgYCdkZWxldGUnYC4gQXQgY29tbWl0OlxuICAgKiBgJ2Z1bGwnYCBtb2RlIG1hcHMgaXQgYmFjayB0byBhIGAnc2V0J2AgdHJhY2UgZW50cnkgKGJ5dGUtaWRlbnRpY2FsIHRvXG4gICAqIHRvZGF5KTsgYCdkZWx0YSdgIG1vZGUgZW1pdHMgYSByZWFsIGAnZGVsZXRlJ2AgZW50cnkgd2hvc2UgcmVwbGF5XG4gICAqIFJFTU9WRVMgdGhlIGtleSBpbnN0ZWFkIG9mIGxlYXZpbmcgYGtleTogdW5kZWZpbmVkYCBiZWhpbmQuXG4gICAqXG4gICAqIFRoZSBuZXQtY2hhbmdlIGZpbHRlciByZWFkcyB0aGF0IHN0YWdlZCBvd24gYHVuZGVmaW5lZGAgYXMgQUJTRU5UXG4gICAqIChgZGVlcEVxdWFsYCwgOS4xOS4xKSDigJQgc28gdW5kZXIgYCdkZWx0YSdgLCB3aG9zZSBjb21taXR0ZWQgc3RhdGUgcmVhbGx5XG4gICAqIGxhY2tzIHRoZSBrZXksIGRlbGV0aW5nIGFuIGFic2VudCBrZXkgaW5zaWRlIGEgY29udGFpbmVyIHRoZSBzdGFnZSBhbHNvXG4gICAqIHJlLXdyb3RlIGlzIHRoZSBuby1vcCBpdCBpcywgbm90IGEgYHNldGAgb2YgdGhlIHdob2xlIGNvbnRhaW5lci5cbiAgICovXG4gIGRlbGV0ZShwYXRoOiAoc3RyaW5nIHwgbnVtYmVyKVtdLCBzaG91bGRSZWRhY3QgPSBmYWxzZSk6IHZvaWQge1xuICAgIGNvbnN0IGtleSA9IG5vcm1hbGlzZVBhdGgocGF0aCk7XG4gICAgdGhpcy5kZXRhY2hIZWxkQW5jZXN0b3JzKHBhdGgpO1xuICAgIG93blNwaW5lKHRoaXMud29ya2luZ0NvcHksIHBhdGgsIHRoaXMub3duZWQpO1xuICAgIF9zZXQodGhpcy53b3JraW5nQ29weSwgcGF0aCwgdW5kZWZpbmVkKTtcbiAgICBfc2V0KHRoaXMub3ZlcndyaXRlUGF0Y2gsIHBhdGgsIHVuZGVmaW5lZCk7XG4gICAgdGhpcy5oZWxkUmVmcy5kZWxldGUoa2V5KTtcbiAgICBpZiAoc2hvdWxkUmVkYWN0KSB7XG4gICAgICB0aGlzLnJlZGFjdGVkUGF0aHMuYWRkKGtleSk7XG4gICAgfVxuICAgIHRoaXMuc3RhZ2UocGF0aCwga2V5LCAnZGVsZXRlJyk7XG4gIH1cblxuICAvKiogRGVlcCB1bmlvbiBtZXJnZSBhdCB0aGUgc3BlY2lmaWVkIHBhdGguIGBkZWVwU21hcnRNZXJnZWAgYnVpbGRzIGZyZXNoXG4gICAqICBjb250YWluZXJzLCBzbyBuZWl0aGVyIHRyZWUgZXZlciBob2xkcyB0aGUgbWVyZ2UgSU5QVVQgYnkgcmVmZXJlbmNlO1xuICAgKiAgdGhlIG5lc3RlZC1vcCBkZXRhY2ggZ3VhcmRzIHRoZSBhbmNlc3RvciBpdCB3cml0ZXMgSU5UTy5cbiAgICpcbiAgICogIFRoZSB2YWx1ZSBtZXJnZWQgSU5UTyBpcyBtYWRlIHByaXZhdGUgZmlyc3QgKGBwcml2YXRpc2VgKSwgYXMgdGhlXG4gICAqICB3aG9sZS1zdGF0ZSBjbG9uZSBtYWRlIGl0IGJlZm9yZSA5LjI5LjAuIE5vdCBvbmx5IGZvciB0aGUgcmVhZHMgdGhhdFxuICAgKiAgZm9sbG93OiBgZGVlcFNtYXJ0TWVyZ2VgIHVuaW9ucyBhcnJheXMgQlkgUkVGRVJFTkNFLCBzbyB3aGV0aGVyIGFuXG4gICAqICBlbGVtZW50IHRoZSBzdGFnZSBwYXNzZXMgaW4gaXMgXCJhbHJlYWR5IHRoZXJlXCIgZGVwZW5kcyBvbiB3aGljaCBvYmplY3RzXG4gICAqICB0aGUgYmFzZSBob2xkcyDigJQgYSBjb21taXR0ZWQgYXJyYXkgd291bGQgZGVkdXAgYW4gZWxlbWVudCB0aGUgc3RhZ2VcbiAgICogIHJlYWQgZnJvbSBpdCBiZWZvcmUgaXRzIGZpcnN0IHdyaXRlLCB3aGVyZSB0aGUgcHJpdmF0ZSBjb3B5IChhbmRcbiAgICogIDkuMjguMCkgYXBwZW5kcyBpdC4gKi9cbiAgbWVyZ2UocGF0aDogKHN0cmluZyB8IG51bWJlcilbXSwgdmFsdWU6IGFueSwgc2hvdWxkUmVkYWN0ID0gZmFsc2UpOiB2b2lkIHtcbiAgICBjb25zdCBrZXkgPSBub3JtYWxpc2VQYXRoKHBhdGgpO1xuICAgIHRoaXMuZGV0YWNoSGVsZEFuY2VzdG9ycyhwYXRoKTtcbiAgICB0aGlzLnByaXZhdGlzZShwYXRoKTtcbiAgICBjb25zdCBleGlzdGluZyA9IF9nZXQodGhpcy53b3JraW5nQ29weSwgcGF0aCkgPz8ge307XG4gICAgY29uc3QgbWVyZ2VkID0gZGVlcFNtYXJ0TWVyZ2UoZXhpc3RpbmcsIHZhbHVlKTtcbiAgICBvd25TcGluZSh0aGlzLndvcmtpbmdDb3B5LCBwYXRoLCB0aGlzLm93bmVkKTtcbiAgICBvd24obWVyZ2VkLCB0aGlzLm93bmVkKTtcbiAgICBpZiAoaXNDb250YWluZXIobWVyZ2VkKSkgdGhpcy5wcml2YXRlVHJlZXMuYWRkKG1lcmdlZCk7XG4gICAgX3NldCh0aGlzLndvcmtpbmdDb3B5LCBwYXRoLCBtZXJnZWQpO1xuICAgIF9zZXQodGhpcy51cGRhdGVQYXRjaCwgcGF0aCwgZGVlcFNtYXJ0TWVyZ2UoX2dldCh0aGlzLnVwZGF0ZVBhdGNoLCBwYXRoKSA/PyB7fSwgdmFsdWUpKTtcbiAgICBpZiAoc2hvdWxkUmVkYWN0KSB7XG4gICAgICB0aGlzLnJlZGFjdGVkUGF0aHMuYWRkKGtleSk7XG4gICAgfVxuICAgIHRoaXMuc3RhZ2UocGF0aCwga2V5LCAnbWVyZ2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaWVsZC1sZXZlbCByZWRhY3Rpb24gKDkuMTkuMCk6IG1hcmsgZG90LXBhdGhzIElOU0lERSB0aGUgdmFsdWUgc3RhZ2VkIGF0XG4gICAqIGBwYXRoYCBhcyBzZWNyZXQsIHNvIGBzY3J1YlBhdGNoYCBzY3J1YnMgdGhlbSBpbiB0aGUgY29tbWl0IGxvZyBhbmQgdGhlXG4gICAqIG1pcnJvciB0aGUgc2FtZSB3YXkgYSB3aG9sZS1rZXkgcmVkYWN0aW9uIGlzIHNjcnViYmVkLiBBIGZpZWxkIGlzXG4gICAqIHJlZ2lzdGVyZWQgYXMgYSBsaXRlcmFsIGtleSBBTkQsIHdoZW4gZG90dGVkLCBhcyB0aGUgbmVzdGVkIHBhdGggaXRcbiAgICogbmFtZXMg4oCUIHdoaWNoZXZlciBleGlzdHMgaW4gdGhlIHBhdGNoIGlzIHRoZSBvbmUgYHNjcnViUGF0Y2hgIGZpbmRzLlxuICAgKiBNYXJrZWQgcGF0aHMgc3Vydml2ZSBjb21taXQgb25seSB3aGlsZSB0aGUgb3AgcGF0aCB0aGV5IHNpdCB1bmRlciBkb2VzXG4gICAqIChzZWUge0BsaW5rIHN1cnZpdmluZ1JlZGFjdGVkUGF0aHN9KS5cbiAgICovXG4gIG1hcmtSZWRhY3RlZEZpZWxkcyhwYXRoOiAoc3RyaW5nIHwgbnVtYmVyKVtdLCBmaWVsZHM6IHJlYWRvbmx5IHN0cmluZ1tdKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBmaWVsZCBvZiBmaWVsZHMpIHtcbiAgICAgIHRoaXMucmVkYWN0ZWRQYXRocy5hZGQobm9ybWFsaXNlUGF0aChbLi4ucGF0aCwgZmllbGRdKSk7XG4gICAgICBpZiAoZmllbGQuaW5jbHVkZXMoJy4nKSkgdGhpcy5yZWRhY3RlZFBhdGhzLmFkZChub3JtYWxpc2VQYXRoKFsuLi5wYXRoLCAuLi5maWVsZC5zcGxpdCgnLicpXSkpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEb2VzIGEgcmVkYWN0aW9uIG1hcmsgYWRkcmVzcyBhbiBhcnJheSBFTEVNRU5UIHJpZ2h0IGJlbG93IGBwYXRoYFxuICAgKiAoYGxpc3QuMS50b2tlbmApPyBBbiBgYXBwZW5kYCByb3cgcmUtYmFzZXMgdGhlIGluZGljZXMgb250byB0aGUgdGFpbCwgc29cbiAgICogc3VjaCBhIHBhdGggdGFrZXMgdGhlIHdob2xlLXZhbHVlIGBzZXRgIChgZGVsdGFFbmNvZGluZyDCtyBwdXNoVmFsdWVSb3dgKS5cbiAgICogQSBtYXJrIGJ5IE5BTUUgYmVsb3cgYW4gYXJyYXkgKGBvYmoueWApIG1lYW5zIHRoZSBzYW1lIHRoaW5nIG9uIHRoZSB0YWlsXG4gICAqIGFzIG9uIHRoZSB3aG9sZSB2YWx1ZSwgc28gdGhlIGNvbXBhY3Qgcm93IHN0YXlzIChieXRlLWlkZW50aWNhbCkuXG4gICAqL1xuICBwcml2YXRlIG1hcmtlZEJlbG93KHBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHByZWZpeCA9IHBhdGggKyBERUxJTTtcbiAgICBmb3IgKGNvbnN0IG1hcmtlZCBvZiB0aGlzLnJlZGFjdGVkUGF0aHMpIHtcbiAgICAgIGlmICghbWFya2VkLnN0YXJ0c1dpdGgocHJlZml4KSkgY29udGludWU7XG4gICAgICBjb25zdCBuZXh0ID0gbWFya2VkLnNsaWNlKHByZWZpeC5sZW5ndGgpLnNwbGl0KERFTElNKVswXTtcbiAgICAgIGlmICgvXigwfFsxLTldXFxkKikkLy50ZXN0KG5leHQpKSByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSByZWRhY3RlZCBwYXRocyB0aGF0IHN1cnZpdmUgdGhlIG5ldC1jaGFuZ2UgZmlsdGVyOiBhIHBhdGggc3Vydml2ZXNcbiAgICogd2hlbiBpdCBJUyBhIHN1cnZpdmluZyBvcCBwYXRoIChhIHdob2xlLWtleSByZWRhY3Rpb24pIG9yIHNpdHMgVU5ERVIgb25lXG4gICAqIChhIGZpZWxkIGluc2lkZSBhIHN1cnZpdmluZyB3cml0ZSkuIEEgZHJvcHBlZCBvcCB0YWtlcyBpdHMgZmllbGRzIHdpdGggaXQuXG4gICAqL1xuICBwcml2YXRlIHN1cnZpdmluZ1JlZGFjdGVkUGF0aHMoc3Vydml2aW5nUGF0aHM6IFNldDxzdHJpbmc+KTogU2V0PHN0cmluZz4ge1xuICAgIGNvbnN0IG91dCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIGZvciAoY29uc3QgcGF0aCBvZiB0aGlzLnJlZGFjdGVkUGF0aHMpIHtcbiAgICAgIGlmIChzdXJ2aXZpbmdQYXRocy5oYXMocGF0aCkpIHtcbiAgICAgICAgb3V0LmFkZChwYXRoKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IG9wIG9mIHN1cnZpdmluZ1BhdGhzKSB7XG4gICAgICAgIGlmIChwYXRoLnN0YXJ0c1dpdGgob3AgKyBERUxJTSkpIHtcbiAgICAgICAgICBvdXQuYWRkKHBhdGgpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBvdXQ7XG4gIH1cblxuICAvKipcbiAgICogUmVhZCBjdXJyZW50IHZhbHVlIGF0IHBhdGggKGluY2x1ZGVzIHVuY29tbWl0dGVkIGNoYW5nZXMpLiBUaGUgdmFsdWUgaXNcbiAgICogdGhlIHN0YWdlJ3Mgb3duIOKAlCBwcml2YXRlIHRvIGl0LCBhcyB0aGUgd2hvbGUtc3RhdGUgY2xvbmUgbWFkZSBldmVyeSByZWFkXG4gICAqIGFmdGVyIHRoZSBmaXJzdCB3cml0ZSBiZWZvcmUgOS4yOS4wIChgcHJpdmF0aXNlYCkuXG4gICAqL1xuICBnZXQocGF0aDogKHN0cmluZyB8IG51bWJlcilbXSwgZGVmYXVsdFZhbHVlPzogYW55KSB7XG4gICAgdGhpcy5wcml2YXRpc2UocGF0aCk7XG4gICAgcmV0dXJuIF9nZXQodGhpcy53b3JraW5nQ29weSwgcGF0aCwgZGVmYXVsdFZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFkIHRoZSB3b3JraW5nIGNvcHkgYXQgYHBhdGhgIFdJVEhPVVQgdGFraW5nIGEgcHJpdmF0ZSBjb3B5IOKAlCBmb3IgYVxuICAgKiByZWFkZXIgdGhhdCBvbmx5IGNvbXBhcmVzICh0aGUgZGV2LW1vZGUgYm9ycm93ZWQtbXV0YXRpb24gcmVwb3J0IGluXG4gICAqIGBTdGFnZUNvbnRleHQuY29tbWl0YCksIG5ldmVyIGZvciBhIHZhbHVlIGhhbmRlZCB0byBhIHN0YWdlLlxuICAgKi9cbiAgcGVlayhwYXRoOiAoc3RyaW5nIHwgbnVtYmVyKVtdKTogdW5rbm93biB7XG4gICAgcmV0dXJuIF9nZXQodGhpcy53b3JraW5nQ29weSwgcGF0aCk7XG4gIH1cblxuICAvKipcbiAgICogS2VlcCB0aGUgZGlmZiBiYXNlIGV4YWN0IHVuZGVyIGEgcmVhZCB0aGUgd29ya2luZyBjb3B5IGNhbm5vdCBhbnN3ZXIuXG4gICAqXG4gICAqIFdoZW4gYHdvcmtpbmdDb3B5YCBob2xkcyBub3RoaW5nIGF0IGBwYXRoYCDigJQgdGhlIHN0YWdlIGRlbGV0ZWQgb3IgdW5zZXRcbiAgICogaXQsIG9yIGEgd3JpdGUgcmVwbGFjZWQgYSBjb250YWluZXIgYWJvdmUgaXQg4oCUIGBTdGFnZUNvbnRleHQgwrdcbiAgICogcmVhZFN0YXRlYCBzZXJ2ZXMgdGhlIHJlYWQgZnJvbSBMSVZFIGNvbW1pdHRlZCBzdGF0ZSwgZXhhY3RseSBhcyA5LjI4LjBcbiAgICogZGlkLCBzbyB0aGUgdmFsdWUgaXQgaGFuZHMgb3V0IGlzIGNvbW1pdHRlZCBzdGF0ZSBpdHNlbGYuIE9uIDkuMjguMCB0aGVcbiAgICogZGlmZiBiYXNlIHdhcyBhIHdob2xlLXN0YXRlIGNsb25lIHRha2VuIGF0IHRoZSBzdGFnZSdzIGZpcnN0IHdyaXRlLCBhbmRcbiAgICogYW4gaW4tcGxhY2UgZWRpdCBvZiB0aGF0IHZhbHVlIChvdXQgb2YgY29udHJhY3Qg4oCUIHJlYWRzIGFyZSBib3Jyb3dlZClcbiAgICogY291bGQgbm90IG1vdmUgaXQ6IHdyaXR0ZW4gYmFjaywgdGhlIGVkaXQgd2FzIHJlY29yZGVkLiBIZXJlIHRoZSBkaWZmXG4gICAqIGJhc2UgSVMgYSBjb21taXR0ZWQgZ2VuZXJhdGlvbiwgYW5kIGl0IHZlcnkgb2Z0ZW4gaG9sZHMgdGhhdCBzYW1lXG4gICAqIGNvbnRhaW5lciBhdCBgcGF0aGAg4oCUIHRoZSBlZGl0IHdvdWxkIG1vdmUgdGhlIGJhc2Ugd2l0aCBpdCwgYW5kIHRoZVxuICAgKiB3cml0ZS1iYWNrIHdvdWxkIGNvbW1pdCBubyBjaGFuZ2UuIFNvIGJlZm9yZSB0aGUgdmFsdWUgZ29lcyBvdXQsIHRoZVxuICAgKiBiYXNlJ3MgdmFsdWUgYXQgYHBhdGhgIGlzIHJlcGxhY2VkIGJ5IGEgcHJpdmF0ZSBkZWVwIGNvcHkgKHRoZSBiYXNlJ3NcbiAgICogcm9vdCBhbmQgdGhlIGNvbnRhaW5lcnMgb24gdGhlIHdheSBjb3BpZWQgc2hhbGxvd2x5KSDigJQgd2hhdCA5LjI4LjAnc1xuICAgKiBiYXNlIGhlbGQgdGhlcmUuIFRoZSBjb21taXQncyBuZXQtY2hhbmdlIHRlc3QgY29tcGFyZXMgYWdhaW5zdCBpdCBhbmRcbiAgICogdGhlIGRlbHRhIGVuY29kZXIgcmVwbGF5cyBmcm9tIGl0OyB0aGUgdmFsdWUgaGFuZGVkIG91dCBzdGF5cyB0aGUgbGl2ZVxuICAgKiBvbmUsIHNvIHdoYXRldmVyIGVsc2UgYW4gZWRpdCBvZiBpdCByZWFjaGVzIChsaXZlIHN0YXRlLCB0aGUgbmV4dFxuICAgKiBnZW5lcmF0aW9uKSBiZWhhdmVzIGFzIG9uIDkuMjguMCB0b28uXG4gICAqXG4gICAqIE5vdCBgcHJpdmF0aXNlYDogYSBwcml2YXRlIGNvcHkgaGFuZGVkIHRvIHRoZSBzdGFnZSB3b3VsZCBhbHNvIGtlZXAgdGhlXG4gICAqIGVkaXQgb3V0IG9mIGxpdmUgc3RhdGUsIHdoZXJlIDkuMjguMCBsZXQgaXQgaW4g4oCUIGEgcnVuLW5hbWVzcGFjZWQgcmVhZFxuICAgKiB0aGF0IGZhbGxzIGJhY2sgdG8gYSBnbG9iYWwga2V5IHdvdWxkIHRoZW4gZW5kIGRpZmZlcmVudGx5ICh0aGVcbiAgICogZGlmZmVyZW50aWFsJ3MgTkVTVEVEIGZhbWlseSBmYWlscyB3aXRoaW4gMTAwIHByb2dyYW1zIHRoYXQgd2F5KS5cbiAgICpcbiAgICogQ29waWVzIG5vdGhpbmcgd2hlbiB0aGUgYmFzZSBob2xkcyBubyBjb250YWluZXIgYXQgYHBhdGhgLCBhbmQgbm90aGluZ1xuICAgKiB0d2ljZTogYSBwYXRoIGF0IG9yIGJlbG93IGFuIGVhcmxpZXIgZGV0YWNoIGlzIGFscmVhZHkgcHJpdmF0ZS4gTyhwYXRoKVxuICAgKiBvdGhlcndpc2UsIHBsdXMgTyh2YWx1ZSkgb25jZSBwZXIgZGV0YWNoZWQgcGF0aC5cbiAgICovXG4gIGRldGFjaEJhc2UocGF0aDogKHN0cmluZyB8IG51bWJlcilbXSk6IHZvaWQge1xuICAgIGlmIChwYXRoLmxlbmd0aCA9PT0gMCB8fCAhaXNDb250YWluZXIodGhpcy5iYXNlU25hcHNob3QpKSByZXR1cm47XG4gICAgbGV0IGF0OiBvYmplY3QgPSB0aGlzLmJhc2VTbmFwc2hvdDtcbiAgICBmb3IgKGNvbnN0IGsgb2YgcGF0aCkge1xuICAgICAgaWYgKHRoaXMuZGV0YWNoZWRCYXNlPy5oYXMoYXQpKSByZXR1cm47XG4gICAgICBjb25zdCBjaGlsZCA9IG93bkNoaWxkKGF0LCBrKTtcbiAgICAgIGlmICghaXNDb250YWluZXIoY2hpbGQpKSByZXR1cm47XG4gICAgICBhdCA9IGNoaWxkO1xuICAgIH1cbiAgICBpZiAodGhpcy5kZXRhY2hlZEJhc2U/LmhhcyhhdCkpIHJldHVybjtcbiAgICBjb25zdCBvd25lZCA9ICh0aGlzLmJhc2VPd25lZCA/Pz0gbmV3IFdlYWtTZXQ8b2JqZWN0PigpKTtcbiAgICBpZiAoIW93bmVkLmhhcyh0aGlzLmJhc2VTbmFwc2hvdCkpIHRoaXMuYmFzZVNuYXBzaG90ID0gb3duZWRSb290T2YodGhpcy5iYXNlU25hcHNob3QsIG93bmVkKTtcbiAgICBvd25TcGluZSh0aGlzLmJhc2VTbmFwc2hvdCwgcGF0aCwgb3duZWQpO1xuICAgIGNvbnN0IGNvcHk6IG9iamVjdCA9IHN0cnVjdHVyZWRDbG9uZShhdCk7XG4gICAgKHRoaXMuZGV0YWNoZWRCYXNlID8/PSBuZXcgV2Vha1NldDxvYmplY3Q+KCkpLmFkZChjb3B5KTtcbiAgICBfc2V0KHRoaXMuYmFzZVNuYXBzaG90LCBwYXRoLCBjb3B5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcml2YXRlIHJlYWRzICg5LjI5LjApOiBtYWtlIHRoZSB2YWx1ZSBhdCBgcGF0aGAgdGhlIHN0YWdlJ3Mgb3duIGJlZm9yZVxuICAgKiBhIHJlYWQgaGFuZHMgaXQgb3V0IOKAlCBzbyBhIHJlYWQgYWZ0ZXIgdGhlIHN0YWdlJ3MgZmlyc3Qgd3JpdGUgYmVoYXZlc1xuICAgKiBleGFjdGx5IGFzIGl0IGRpZCB3aGVuIHRoZSBidWZmZXIgYmVnYW4gd2l0aCBhIGRlZXAgY2xvbmUgb2YgdGhlIHdob2xlXG4gICAqIHN0YXRlLiBBbiBpbi1wbGFjZSBlZGl0IG9mIHdoYXQgdGhlIHJlYWQgcmV0dXJuZWQgKG91dCBvZiBjb250cmFjdCDigJRcbiAgICogcmVhZHMgYXJlIGJvcnJvd2VkKSBzdGF5cyBpbnNpZGUgdGhlIGJ1ZmZlciwgYW5kIGNvbW1pdHRlZCBzdGF0ZSBpcyBuZXZlclxuICAgKiB0b3VjaGVkLiBXaGV0aGVyIHRoZSBSRUNPUkQga2VlcHMgaXQgaXMgdGhlIGFkbWl0dGVkIHJlY29yZCdzIGxhd1xuICAgKiAoOS4zMC4wLCBvd25lciBydWxpbmcgUjEg4oCUIHRoZSByZWNvcmQga2VlcHMgd2hhdCB0aGUgc3RhZ2UgcmVhZCBiYWNrKTogaXRcbiAgICogaXMga2VwdCB3aGVuIHRoZSBlZGl0ZWQgdmFsdWUgbGllcyBhdCBvciBiZWxvdyBhIHBhdGggdGhlIHN0YWdlIHdyb3RlIGluXG4gICAqIHRoaXMgc3RhZ2Ug4oCUIHNldCwgbWVyZ2VkIG9yIHdyaXR0ZW4gYmFjayBhbGlrZSDigJQgYW5kIGxvc3Qgb3RoZXJ3aXNlLlxuICAgKlxuICAgKiBXYWxraW5nIHRoZSBwYXRoIGZyb20gdGhlIChvd25lZCkgcm9vdDpcbiAgICogIC0gYSBjb250YWluZXIgc3RpbGwgU0hBUkVEIHdpdGggY29tbWl0dGVkIHN0YXRlIGF0IHRoZSBzYW1lIHBvc2l0aW9uIGlzXG4gICAqICAgIHJlcGxhY2VkIGJ5IGEgcHJpdmF0ZSBkZWVwIGNvcHkgd2hlbiBpdCBpcyB0aGUgdmFsdWUgcmVhZCwgb3IgYnkgYVxuICAgKiAgICBzaGFsbG93IGNvcHkgd2hlbiBpdCBpcyBhIGNvbnRhaW5lciBvbiB0aGUgd2F5IHRvIGl0IChzbyBhIHJlYWQgb2ZcbiAgICogICAgYHJ1bnMvPGlkPi9rYCBjb3BpZXMgYGtgLCBub3QgZXZlcnkgcnVuJ3MgbmFtZXNwYWNlKTtcbiAgICogIC0gYSBjb250YWluZXIgdGhlIHN0YWdlIFNUQUdFRCAob3IgYW55dGhpbmcgZWxzZSB0aGUgYnVmZmVyIGRpZCBub3RcbiAgICogICAgdGFrZSBmcm9tIGNvbW1pdHRlZCBzdGF0ZSkgaXMgaGFuZGVkIGJhY2sgYnkgcmVmZXJlbmNlLCBhcyBiZWZvcmU7XG4gICAqICAtIGEgY29udGFpbmVyIHRoZSBidWZmZXIgb3ducyBpcyB3YWxrZWQgb24g4oCUIGFuZCB3aGVuIGl0IGlzIHRoZSB2YWx1ZVxuICAgKiAgICByZWFkLCBpdHMgc3RpbGwtc2hhcmVkIGRlc2NlbmRhbnRzIGFyZSBwcml2YXRpc2VkXG4gICAqICAgICh7QGxpbmsgcHJpdmF0aXNlQmVsb3d9KS5cbiAgICpcbiAgICogQ29zdDogTyhwYXRoKSBwZXIgcmVhZCwgcGx1cyBPKHZhbHVlKSBPTkNFIHBlciBzaGFyZWQgY29udGFpbmVyIGEgc3RhZ2VcbiAgICogcmVhZHMgYWZ0ZXIgaXRzIGZpcnN0IHdyaXRlLiBBIHN0YWdlIHRoYXQgbmV2ZXIgcmVhZHMgYWZ0ZXIgd3JpdGluZyBwYXlzXG4gICAqIG5vdGhpbmc7IGEgcmVhZCBiZWZvcmUgdGhlIGZpcnN0IHdyaXRlIG5ldmVyIHJlYWNoZXMgdGhlIGJ1ZmZlci5cbiAgICovXG4gIHByaXZhdGUgcHJpdmF0aXNlKHBhdGg6IChzdHJpbmcgfCBudW1iZXIpW10pOiB2b2lkIHtcbiAgICBpZiAocGF0aC5sZW5ndGggPT09IDApIHJldHVybjtcbiAgICAvLyBSZXNvbHZlIGZpcnN0OiBhIHJlYWQgdGhhdCBsYW5kcyBvbiBub3RoaW5nIChhIG1pc3Npbmcga2V5LCBhIHJlZnVzZWRcbiAgICAvLyBzZWdtZW50LCBhIHByaW1pdGl2ZSkgcmV0dXJucyBub3RoaW5nIGFuZCBtdXN0IGNvcHkgbm90aGluZy5cbiAgICBjb25zdCBjaGFpbjogb2JqZWN0W10gPSBbXTtcbiAgICBsZXQgYXQ6IHVua25vd24gPSB0aGlzLndvcmtpbmdDb3B5O1xuICAgIGZvciAoY29uc3QgayBvZiBwYXRoKSB7XG4gICAgICBhdCA9IG93bkNoaWxkKGF0LCBrKTtcbiAgICAgIGlmICghaXNDb250YWluZXIoYXQpKSByZXR1cm47XG4gICAgICBjaGFpbi5wdXNoKGF0KTtcbiAgICB9XG4gICAgbGV0IHBhcmVudDogYW55ID0gdGhpcy53b3JraW5nQ29weTtcbiAgICBsZXQgYmFzZTogdW5rbm93biA9IHRoaXMuYmFzZVNuYXBzaG90O1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGF0aC5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgayA9IHBhdGhbaV07XG4gICAgICBjb25zdCBhdEJhc2UgPSBvd25DaGlsZChiYXNlLCBrKTtcbiAgICAgIGxldCB2YWx1ZSA9IGNoYWluW2ldO1xuICAgICAgaWYgKCF0aGlzLm93bmVkLmhhcyh2YWx1ZSkpIHtcbiAgICAgICAgaWYgKHZhbHVlICE9PSBhdEJhc2UgfHwgdGhpcy5zdGFnZWQuaGFzKHZhbHVlKSkgcmV0dXJuO1xuICAgICAgICBpZiAoaSA9PT0gcGF0aC5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgcGFyZW50W2tdID0gdGhpcy5wcml2YXRlQ29weU9mKHZhbHVlKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdmFsdWUgPSBzaGFsbG93Q29weSh2YWx1ZSk7XG4gICAgICAgIHRoaXMub3duZWQuYWRkKHZhbHVlKTtcbiAgICAgICAgcGFyZW50W2tdID0gdmFsdWU7XG4gICAgICB9XG4gICAgICBwYXJlbnQgPSB2YWx1ZTtcbiAgICAgIGJhc2UgPSBhdEJhc2U7XG4gICAgfVxuICAgIHRoaXMucHJpdmF0aXNlQmVsb3cocGFyZW50LCBiYXNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBbiBPV05FRCBjb250YWluZXIgaXMgYWJvdXQgdG8gYmUgcmVhZCB3aG9sZSAoYSBwYXRoIGNvcHkgYSBuZXN0ZWQgd3JpdGVcbiAgICogbWFkZSwgc2F5KTogaXRzIGRlc2NlbmRhbnRzIHN0aWxsIHNoYXJlZCB3aXRoIGNvbW1pdHRlZCBzdGF0ZSBhcmVcbiAgICogcmVwbGFjZWQgYnkgcHJpdmF0ZSBkZWVwIGNvcGllcywgc28gbm90aGluZyB0aGUgcmVhZCBoYW5kcyBvdXQgaXNcbiAgICogY29tbWl0dGVkIHN0YXRlLiBXYWxrcyBvd25lZCBjb250YWluZXJzIG9ubHk7IG1hcmtzIGVhY2ggb25lIGZpbmlzaGVkXG4gICAqICh7QGxpbmsgcHJpdmF0ZVRyZWVzfSksIHNvIGEgY29udGFpbmVyIGlzIHNjYW5uZWQgb25jZSBwZXIgc3RhZ2UuXG4gICAqL1xuICBwcml2YXRlIHByaXZhdGlzZUJlbG93KGNvbnRhaW5lcjogb2JqZWN0LCBiYXNlOiB1bmtub3duKTogdm9pZCB7XG4gICAgY29uc3Qgd29yazogQXJyYXk8W29iamVjdCwgdW5rbm93bl0+ID0gW1tjb250YWluZXIsIGJhc2VdXTtcbiAgICB3aGlsZSAod29yay5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBbbm9kZSwgbm9kZUJhc2VdID0gd29yay5wb3AoKSE7XG4gICAgICBpZiAodGhpcy5wcml2YXRlVHJlZXMuaGFzKG5vZGUpKSBjb250aW51ZTtcbiAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKG5vZGUpKSB7XG4gICAgICAgIGNvbnN0IGNoaWxkID0gb3duQ2hpbGQobm9kZSwga2V5KTtcbiAgICAgICAgaWYgKCFpc0NvbnRhaW5lcihjaGlsZCkpIGNvbnRpbnVlO1xuICAgICAgICBjb25zdCBhdEJhc2UgPSBvd25DaGlsZChub2RlQmFzZSwga2V5KTtcbiAgICAgICAgaWYgKHRoaXMub3duZWQuaGFzKGNoaWxkKSkgd29yay5wdXNoKFtjaGlsZCwgYXRCYXNlXSk7XG4gICAgICAgIGVsc2UgaWYgKGNoaWxkID09PSBhdEJhc2UgJiYgIXRoaXMuc3RhZ2VkLmhhcyhjaGlsZCkpIHtcbiAgICAgICAgICAobm9kZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilba2V5XSA9IHRoaXMucHJpdmF0ZUNvcHlPZihjaGlsZCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMucHJpdmF0ZVRyZWVzLmFkZChub2RlKTtcbiAgICB9XG4gIH1cblxuICAvKiogQSBwcml2YXRlIGRlZXAgY29weSBvZiBhIGNvbW1pdHRlZCBjb250YWluZXIg4oCUIG93bmVkIHRocm91Z2ggYW5kIHRocm91Z2guICovXG4gIHByaXZhdGUgcHJpdmF0ZUNvcHlPZih2YWx1ZTogb2JqZWN0KTogb2JqZWN0IHtcbiAgICBjb25zdCBjb3B5ID0gc3RydWN0dXJlZENsb25lKHZhbHVlKTtcbiAgICBhZG9wdChjb3B5LCB0aGlzLm93bmVkKTtcbiAgICB0aGlzLnByaXZhdGVUcmVlcy5hZGQoY29weSk7XG4gICAgcmV0dXJuIGNvcHk7XG4gIH1cblxuICAvKipcbiAgICogRGlkIGFueSBzdGFnZWQgb3AgdG91Y2ggYHBhdGhgLCBvciBhIHBhdGggYWJvdmUgb3IgYmVsb3cgaXQ/XG4gICAqXG4gICAqIFRoZSBkZXYtbW9kZSBib3Jyb3dlZC1yZWFkIGNoZWNrIChgU3RhZ2VDb250ZXh0LmNvbW1pdGApIGFza3MgdGhpcyBiZWZvcmVcbiAgICogYWNjdXNpbmcgYSBzdGFnZSBvZiBtdXRhdGluZyBhIHZhbHVlIGluIHBsYWNlOiBhIGtleSB0aGUgc3RhZ2UgbGVnaXRpbWF0ZWx5XG4gICAqIFdST1RFIGlzIGV4cGVjdGVkIHRvIGRpZmZlciBmcm9tIHdoYXQgaXQgcmVhZCwgYW5kIHdyaXRlcyByZWFjaCB0aGUgYnVmZmVyXG4gICAqIGZyb20gcGF0aHMgdGhhdCBieXBhc3MgdXNlci1sZXZlbCB3cml0ZSB0cmFja2luZyB0b28gKHRoZSBzdWJmbG93IHNlZWQsXG4gICAqIGBvdXRwdXRNYXBwZXJgIG1lcmdlLWJhY2ssIHRoZSByZXN1bWUgcmUtc2VlZCkuIERldi1tb2RlIG9ubHkg4oCUIG5vdGhpbmcgb25cbiAgICogdGhlIGhvdCBwYXRoIGNhbGxzIGl0LlxuICAgKi9cbiAgd2FzU3RhZ2VkKHBhdGg6IChzdHJpbmcgfCBudW1iZXIpW10pOiBib29sZWFuIHtcbiAgICBjb25zdCB0YXJnZXQgPSBub3JtYWxpc2VQYXRoKHBhdGgpO1xuICAgIGZvciAoY29uc3Qgb3Agb2YgdGhpcy5vcFRyYWNlKSB7XG4gICAgICAvLyBPbiB0aGUgcGF0aCwgYmVsb3cgaXQgb3IgYWJvdmUgaXQg4oCUIHRoZSBvbmUgcGF0aCByZWxhdGlvbiBldmVyeSBrZXkgcXVlcnkgYXNrcy5cbiAgICAgIGlmIChyZWxhdGlvbihvcC5wYXRoLCB0YXJnZXQpICE9PSB1bmRlZmluZWQpIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogRmx1c2ggYWxsIHN0YWdlZCBtdXRhdGlvbnMgYW5kIHJldHVybiB0aGUgY29tbWl0IGJ1bmRsZSDigJQgcmVjb3JkaW5nIHRoZVxuICAgKiBzdGFnZSdzIE5FVCBDSEFOR0UsIG5vdCBpdHMgcmF3IHdyaXRlIGxvZy5cbiAgICpcbiAgICog4pSA4pSAIFdIWSAodGhlIGRlZmVjdCB0aGlzIGZpeGVzKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgICogUHJldmlvdXNseSBldmVyeSBgc2V0YC9gbWVyZ2VgIHdhcyByZWNvcmRlZCB2ZXJiYXRpbSwgc28gdGhlIGNvbW1pdCBidW5kbGVcbiAgICogd2FzIGEgbG9nIG9mICpvcGVyYXRpb25zKiByYXRoZXIgdGhhbiAqY2hhbmdlcyouIFR3byBvcGVyYXRpb25zIHByb2R1Y2Ugbm9cbiAgICogbmV0IGNoYW5nZSB5ZXQgd2VyZSBzdGlsbCBjb21taXR0ZWQgYXMgXCJtdXRhdGlvbnNcIjpcbiAgICpcbiAgICogICAxLiBOby1vcCB3cml0ZSAgIOKAlCB3cml0aW5nIGEga2V5IHRoZSB2YWx1ZSBpdCBhbHJlYWR5IGhvbGRzIChlLmcuIGFuXG4gICAqICAgICAgICAgICAgICAgICAgICAgIGFnZW50IGNvbnRleHQgc2xvdCByZS1lbWl0dGluZyBpZGVudGljYWwgY29udGVudCBldmVyeVxuICAgKiAgICAgICAgICAgICAgICAgICAgICB0dXJuKS4gYmFzZSBLPTEsIHN0YWdlIHdyaXRlcyBLPTEuXG4gICAqICAgMi4gV3JpdGUtcmV2ZXJ0ICDigJQgY2hhbmdpbmcgdGhlbiByZXN0b3JpbmcgYSBrZXkgd2l0aGluIG9uZSBzdGFnZS5cbiAgICogICAgICAgICAgICAgICAgICAgICAgYmFzZSBLPTEsIHN0YWdlIHdyaXRlcyBLPTIgdGhlbiBLPTEuXG4gICAqXG4gICAqIFJlY29yZGluZyB0aGVzZSBhcyBtdXRhdGlvbnMgKGEpIGJsb2F0ZWQgY2F1c2FsIHNsaWNpbmcgLyBiYWNrdHJhY2tpbmcgd2l0aFxuICAgKiBzcHVyaW91cyBkZXBlbmRlbmNpZXMgb24gaW50ZXJtZWRpYXRlIHZhbHVlcyB0aGF0IG5ldmVyIHJlYWNoIGZpbmFsIHN0YXRlLFxuICAgKiBhbmQgKGIpIG1hZGUgZG93bnN0cmVhbSBcIndoYXQgY2hhbmdlZCBoZXJlP1wiIGNvbnN1bWVycyBsaWdodCB1cCBzdGFnZXMgdGhhdFxuICAgKiBjaGFuZ2VkIG5vdGhpbmcg4oCUIG1vc3QgdmlzaWJseSB0aGUgbGVucyBoaWdobGlnaHQgZmxhZ2dpbmcgZXZlcnkgc2xvdC5cbiAgICpcbiAgICog4pSA4pSAIEhPVyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgICogQXQgY29tbWl0IHdlIGhvbGQgQk9USCBgYmFzZVNuYXBzaG90YCAoc3RhdGUgd2hlbiB0aGUgc3RhZ2UgYmVnYW4pIGFuZFxuICAgKiBgd29ya2luZ0NvcHlgIChzdGF0ZSBhZnRlciBhbGwgaXRzIHdyaXRlcykuIEZvciBlYWNoIHBhdGggdGhlIHN0YWdlIHRvdWNoZWRcbiAgICogd2Uga2VlcCBpdCBpbiB0aGUgYnVuZGxlIE9OTFkgaWYgaXRzIGZpbmFsIHZhbHVlIGRpZmZlcnMgZnJvbSB0aGUgYmFzZVxuICAgKiB2YWx1ZSAoe0BsaW5rIGRlZXBFcXVhbH0pLiBOby1vcCBBTkQgd3JpdGUtcmV2ZXJ0IHBhdGhzIGRyb3Agb3V0LCBiZWNhdXNlXG4gICAqIGJvdGggY29tcGFyZSBlcXVhbCB0byBiYXNlLiBUaGlzIGlzIGEgc2luZ2xlIG5ldC1kZWx0YSBkaWZmIGF0IGNvbW1pdCB0aW1lXG4gICAqIOKAlCBvbmUgZGVlcCBjb21wYXJlIHBlciB0b3VjaGVkIHBhdGgsIE8oY2hhbmdlZCBzdGF0ZSksIHBhaWQgb25jZSBwZXIgc3RhZ2VcbiAgICogKE5PVCBwZXIgd3JpdGUpLiBBIG5haXZlIHBlci13cml0ZSBkZWVwLWVxdWFsIHNraXAgd291bGQgYmUgbW9yZSBleHBlbnNpdmVcbiAgICogYW5kIHdvdWxkIHN0aWxsIG1pc3Mgd3JpdGUtcmV2ZXJ0ICh0aGUgaW50ZXJtZWRpYXRlIHdyaXRlIGRpZmZlcnMgZnJvbSB0aGVcbiAgICogdmFsdWUgcHJlc2VudCBhdCB0aGUgbW9tZW50IG9mIHdyaXRpbmcpLlxuICAgKlxuICAgKiDilIDilIAgVFdPIEhPTkVTVCBUSUVSUyAoYnkgZGVzaWduIOKAlCBkbyBub3QgXCJ1bmlmeVwiIHRoZW0pIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAgKiAgIOKAoiBjb21taXQgKGhlcmUpICAgPSBDSEFOR0UtbGV2ZWwg4oCUIHRydXRoZnVsIG5ldCBkZWx0YS4gRmVlZHMgdGhlIGNvbW1pdFxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgbG9nLCBjYXVzYWwgY2hhaW4sIG5hcnJhdGl2ZSwgYW5kIHRoZSBsZW5zIGhpZ2hsaWdodC5cbiAgICogICDigKIgYG9uV3JpdGVgIGV2ZW50ID0gT1AtbGV2ZWwg4oCUIGZpcmVzIG9uIEVWRVJZIHdyaXRlIGF0dGVtcHQgcmVnYXJkbGVzcyBvZlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgbmV0IGNoYW5nZS4gRmVlZHMgbWV0cmljcyAvIGJlaGF2aW91cmFsIG9ic2VydmFiaWxpdHlcbiAgICogICAgICAgICAgICAgICAgICAgICAgIChhIGRlYnVnZ2VyIHdhbnRzIHRvIHNlZSBcIndyb3RlIDIsIHRoZW4gcmV2ZXJ0ZWRcIikuXG4gICAqIGBvbldyaXRlYCBpcyB1bmNoYW5nZWQgYnkgdGhpcyBtZXRob2Q7IG9ubHkgdGhlIENPTU1JVCBiZWNvbWVzIGNoYW5nZS1vbmx5LlxuICAgKlxuICAgKiDilIDilIAgRU1QVFkgQ09NTUlUUyBBUkUgSU5URU5USU9OQUwg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gICAqIEEgc3RhZ2UgdGhhdCBuZXRzIG5vIGNoYW5nZSBjb21taXRzIGFuIEVNUFRZIHBhdGNoIOKAlCBOT1Qgbm90aGluZy5cbiAgICoge0BsaW5rIFN0YWdlQ29udGV4dC5jb21taXR9IHN0aWxsIHJlY29yZHMgdGhlIGJ1bmRsZSB1bmNvbmRpdGlvbmFsbHksIHNvXG4gICAqIGV2ZXJ5IGV4ZWN1dGVkIHN0YWdlIHJlbWFpbnMgYSB0aW1lLXRyYXZlbCBjdXJzb3Igc3RvcCAoaXRzIGBydW50aW1lU3RhZ2VJZGBcbiAgICogbWFya2VyIGlzIHByZXNlcnZlZCk7IG9ubHkgaXRzIFBBVENIIGlzIGVtcHR5LiBUaGlzIGlzIHdoYXQga2VlcHMgdGhlXG4gICAqIGNvbW1pdC1pbmRleGVkIHNsaWRlciBzdGFibGUgd2hpbGUgbWFraW5nIHRoZSBoaWdobGlnaHQgdHJ1dGhmdWwuXG4gICAqXG4gICAqIOKUgOKUgCBLTk9XTiBMSU1JVEFUSU9OUyAvIEZVVFVSRSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgICogICDigKIgRXhwbGljaXQga2V5IERFTEVUSU9OIHVuZGVyIHRoZSBkZWZhdWx0ICdmdWxsJyBtb2RlIGlzIHN0aWxsXG4gICAqICAgICBmbGF0dGVuZWQgdG8gc2V0LW9mLWB1bmRlZmluZWRgIChhIHJlbW92ZWQga2V5IGNhbm5vdCBiZSBleHByZXNzZWRcbiAgICogICAgIGluIE1lbW9yeVBhdGNoIGFsb25lKS4gQ0xPU0VEIHVuZGVyIGBjb21taXRWYWx1ZXM6ICdkZWx0YSdgICgjMTNjLUIpOlxuICAgKiAgICAge0BsaW5rIGRlbGV0ZX0gc3RhZ2VzIGEgZGlzdGluY3Qgb3AgYW5kIHRoZSBidW5kbGUgY2FycmllcyBhIHJlYWxcbiAgICogICAgIGBkZWxldGVgIHRyYWNlIHZlcmIgd2hvc2UgcmVwbGF5IHJlbW92ZXMgdGhlIGtleS5cbiAgICogICDigKIgQXJyYXktbWVyZ2UgZGVkdXAgaW4ge0BsaW5rIGRlZXBTbWFydE1lcmdlfSBzdGlsbCB1c2VzIHJlZmVyZW5jZSBlcXVhbGl0eVxuICAgKiAgICAgKGBuZXcgU2V0YCksIHNvIGRlZXAtZXF1YWwgKm9iamVjdHMqIGluIGEgbWVyZ2VkIGFycmF5IGFyZSBub3QgZGVkdXBlZC5cbiAgICogICAgIE9ydGhvZ29uYWwgdG8gdGhpcyBjaGFuZ2U7IHRyYWNrZWQgc2VwYXJhdGVseS5cbiAgICpcbiAgICogUmVzZXRzIHRoZSBidWZmZXIgdG8gZW1wdHkgc3RhdGUgYWZ0ZXIgY29tbWl0LlxuICAgKi9cbiAgY29tbWl0KCk6IHtcbiAgICBvdmVyd3JpdGU6IE1lbW9yeVBhdGNoO1xuICAgIHVwZGF0ZXM6IE1lbW9yeVBhdGNoO1xuICAgIHJlZGFjdGVkUGF0aHM6IFNldDxzdHJpbmc+O1xuICAgIHRyYWNlOiBUcmFjZUVudHJ5W107XG4gIH0ge1xuICAgIGNvbnN0IHJvd3MgPSB0aGlzLmNvbW1pdFZhbHVlcyA9PT0gJ2RlbHRhJyA/IHRoaXMudG9EZWx0YVBheWxvYWQoKSA6IHRoaXMudG9DaGFuZ2VPbmx5UGF5bG9hZCgpO1xuICAgIGNvbnN0IHJlZGFjdGVkUGF0aHMgPSB0aGlzLnN1cnZpdmluZ1JlZGFjdGVkUGF0aHMobmV3IFNldChyb3dzLnRyYWNlLm1hcCgodCkgPT4gdC5wYXRoKSkpO1xuICAgIC8vIFRoZSBidW5kbGUncyBrZXkgb3JkZXIgaXMgYHJlY29yZENvbW1pdGAnczsgYSBkaXJlY3QgY2FsbGVyIGtlZXBzIHRoaXMgc2FtZSBvcmRlci5cbiAgICBjb25zdCBwYXlsb2FkID0geyBvdmVyd3JpdGU6IHJvd3Mub3ZlcndyaXRlLCB1cGRhdGVzOiByb3dzLnVwZGF0ZXMsIHJlZGFjdGVkUGF0aHMsIHRyYWNlOiByb3dzLnRyYWNlIH07XG5cbiAgICB0aGlzLm92ZXJ3cml0ZVBhdGNoID0ge307XG4gICAgdGhpcy51cGRhdGVQYXRjaCA9IHt9O1xuICAgIHRoaXMub3BUcmFjZS5sZW5ndGggPSAwO1xuICAgIHRoaXMucmVkYWN0ZWRQYXRocy5jbGVhcigpO1xuICAgIHRoaXMuaGVsZFJlZnMuY2xlYXIoKTtcbiAgICB0aGlzLndvcmtpbmdDb3B5ID0ge307XG4gICAgdGhpcy5vd25lZCA9IG5ldyBXZWFrU2V0KCk7XG4gICAgdGhpcy5vd25lZC5hZGQodGhpcy53b3JraW5nQ29weSk7XG4gICAgdGhpcy5zdGFnZWQgPSBuZXcgV2Vha1NldCgpO1xuICAgIHRoaXMucHJpdmF0ZVRyZWVzID0gbmV3IFdlYWtTZXQoKTtcbiAgICB0aGlzLnN0YWdlZE1lcmdlcyA9IDA7XG4gICAgdGhpcy5uZXN0ZWRPcHMgPSAwO1xuXG4gICAgcmV0dXJuIHBheWxvYWQ7XG4gIH1cblxuICAvKipcbiAgICogUmVidWlsZCBvdmVyd3JpdGUgLyB1cGRhdGVzIC8gdHJhY2Uga2VlcGluZyBPTkxZIHBhdGhzIHdob3NlIGZpbmFsIHZhbHVlXG4gICAqIGRpZmZlcnMgZnJvbSB0aGUgYmFzZSB2YWx1ZSDigJQgaS5lLiB0aGUgc3RhZ2UncyBuZXQgY2hhbmdlLiBTZWVcbiAgICoge0BsaW5rIFRyYW5zYWN0aW9uQnVmZmVyLmNvbW1pdH0gZm9yIHRoZSByYXRpb25hbGUuXG4gICAqXG4gICAqIFBhdGhzIGFyZSBjb21wYXJlZCBhdCB0aGUgZXhhY3QgZ3JhbnVsYXJpdHkgdGhleSB3ZXJlIHdyaXR0ZW4gKGVhY2ggdHJhY2VcbiAgICogZW50cnkncyBwYXRoKSwgYWdhaW5zdCBgd29ya2luZ0NvcHlgIChmaW5hbCkgdnMgYGJhc2VTbmFwc2hvdGAgKHN0YXJ0KS5cbiAgICogU3Vydml2aW5nIGBzZXRgIHBhdGhzIGNvcHkgdGhlaXIgZmluYWwgdmFsdWUgZnJvbSBgb3ZlcndyaXRlUGF0Y2hgO1xuICAgKiBzdXJ2aXZpbmcgYG1lcmdlYCBwYXRocyBjb3B5IHRoZWlyIGFjY3VtdWxhdGVkIGRlbHRhIGZyb20gYHVwZGF0ZVBhdGNoYCxcbiAgICoga2VlcGluZyB0aGUgc2V0LXZzLW1lcmdlIHZlcmIg4oCUIGFuZCB0aGUgcmVzdWx0IGlzIEFETUlUVEVEICh7QGxpbmsgYWRtaXR9KTpcbiAgICogYSBmYW1pbHkgb2Ygcm93cyB3aG9zZSByZXBsYXkgZG9lcyBub3QgZ2l2ZSBiYWNrIHdoYXQgdGhlIHN0YWdlIHJlYWQgaXNcbiAgICogcmVjb3JkZWQgYXMgYHNldGAgcm93cyBvZiB0aGUgcmVhZC1iYWNrIGluc3RlYWQgKDkuMzAuMCkuXG4gICAqXG4gICAqIFRoaXMgaXMgdGhlIERFRkFVTFQgKGBjb21taXRWYWx1ZXM6ICdmdWxsJ2ApIHBheWxvYWQsIGluY2x1ZGluZyB0aGVcbiAgICogaGlzdG9yaWNhbCBmbGF0dGVuaW5nIG9mIHN0YWdlZCBgZGVsZXRlYCBvcHMgaW50byBgc2V0YC1vZi1gdW5kZWZpbmVkYFxuICAgKiB0cmFjZSBlbnRyaWVzLiBUaGUgZGVsdGEgZW5jb2RpbmcgbGl2ZXMgaW4ge0BsaW5rIHRvRGVsdGFQYXlsb2FkfS5cbiAgICpcbiAgICogV29yaywgbm90IGJ5dGVzICg5LjIyLjEpOiB0aGUgbmV0LWNoYW5nZSB2ZXJkaWN0IGlzIHBhaWQgb25jZSBwZXIgUEFUSFxuICAgKiBhbmQgdGhlIGNsb25lIG9uY2UgcGVyIENPTlNFQ1VUSVZFIHJ1biBvZiBvcHMgb24gYSBwYXRoLCBub3Qgb25jZSBwZXIgb3BcbiAgICog4oCUIHNlZSB0aGUgdHdvIG1lbW9zIGluc2lkZS4gUGlubmVkIGJ5XG4gICAqIHRlc3QvbGliL21lbW9yeS9zY2VuYXJpby9yZXBlYXRlZC1wYXRoLWJ5dGUtaWRlbnRpdHkudGVzdC50cyBhZ2FpbnN0IHRoZVxuICAgKiA5LjIyLjAgYnl0ZXMuIFNpbmNlIDkuMjMuMCB0aGF0IGNsb25lIGlzIFRIRSBjbG9uZTogdGhlIHBhdGNoIHRyZWVzIGhvbGRcbiAgICogdGhlIGNhbGxlcidzIHJlZmVyZW5jZXMgKHNlZSB0aGUgY2xhc3MgaGVhZGVyKSwgc28gdGhpcyBsb29wIGlzIHRoZSBvbmVcbiAgICogcGxhY2UgdGhlIHJlY29yZCBpcyBkZXRhY2hlZCBmcm9tIHRoZW0uXG4gICAqL1xuICBwcml2YXRlIHRvQ2hhbmdlT25seVBheWxvYWQoKTogUm93cyB7XG4gICAgcmV0dXJuIHRoaXMuYWRtaXQoKGxvc3N5KSA9PiB0aGlzLmNoYW5nZU9ubHlSb3dzKGxvc3N5KSk7XG4gIH1cblxuICAvKiogVGhlICdmdWxsJyByb3dzOyBhIGZhbWlseSBpbiBgbG9zc3lgIGlzIHdyaXR0ZW4gYXMgaXRzIHJlYWQtYmFjaywgYXQgaXRzIGxhc3QgdG91Y2ggKHtAbGluayBlbWl0UmVhZEJhY2t9KS4gKi9cbiAgcHJpdmF0ZSBjaGFuZ2VPbmx5Um93cyhsb3NzeTogTG9zc3kgfCB1bmRlZmluZWQpOiBSb3dzIHtcbiAgICBjb25zdCByb3dzOiBSb3dzID0geyBvdmVyd3JpdGU6IHt9LCB1cGRhdGVzOiB7fSwgdHJhY2U6IFtdIH07XG4gICAgY29uc3QgeyBvdmVyd3JpdGUsIHVwZGF0ZXMsIHRyYWNlIH0gPSByb3dzO1xuICAgIC8vIFBlciBQQVRILCBkZWNpZGVkIG9uY2UgKDkuMjIuMSk6IGJhc2UgYW5kIGZpbmFsIHZhbHVlIGFyZSBmaXhlZCBhdFxuICAgIC8vIGNvbW1pdCwgc28gZXZlcnkgbGF0ZXIgb3Agb24gYSBwYXRoIGdldHMgdGhlIHZlcmRpY3QgaXRzIGZpcnN0IG9wIGdvdC5cbiAgICAvLyBgdW5kZWZpbmVkYCA9IG5vdCB5ZXQgZGVjaWRlZDsgdGhlIHN1cnZpdmluZyBwYXRocyBhcmUgdGhlIGB0cnVlYCBrZXlzLlxuICAgIGNvbnN0IHN1cnZpdmVzID0gbmV3IE1hcDxzdHJpbmcsIGJvb2xlYW4+KCk7XG4gICAgLy8gVGhlIHBhdGggdGhlIExBU1Qgc3Vydml2aW5nIG9wIGNvcGllZCBpbnRvIGVhY2ggcGF0Y2ggdHJlZSAoOS4yMi4xKS5cbiAgICAvLyBUaGUgdmFsdWUgYXQgYSBwYXRoIGlzIGZpeGVkIGF0IGNvbW1pdCwgc28gYW4gb3Agd2hvc2UgcHJlZGVjZXNzb3Igb25cbiAgICAvLyB0aGUgU0FNRSB0cmVlIGFscmVhZHkgY29waWVkIHRoYXQgcGF0aCB3b3VsZCB3cml0ZSB0aGUgc2FtZSBieXRlcyBvdmVyXG4gICAgLy8gdGhlIHNhbWUga2V5IOKAlCBpdCBrZWVwcyBpdHMgdHJhY2Ugcm93ICh0aGUgbG9nIGlzIGJ5dGUtaWRlbnRpY2FsKSBhbmRcbiAgICAvLyBwYXlzIG5vIHNlY29uZCBjbG9uZS4gVGhlIDkuMjIuMCBlbGVtZW50LXdyaXRlIGZ1bm5lbCBzdGFnZXMgTlxuICAgIC8vIHdob2xlLWFycmF5IHNldHMgb24gT05FIHBhdGg7IHRoaXMgaXMgd2hhdCBtYWtlcyB0aGF0IGNvbW1pdCBPKE4pXG4gICAgLy8gaW5zdGVhZCBvZiBPKE4gw5cgb3BzKS4gQ09OU0VDVVRJVkUgb25seSDigJQgYW4gb3Agb24gYW5vdGhlciBwYXRoIGluXG4gICAgLy8gYmV0d2VlbiBtYXkgaGF2ZSBjb2VyY2VkIG9yIGdyb3duIHRoaXMgb25lJ3MgY29udGFpbmVyIChhIGRlc2NlbmRhbnRcbiAgICAvLyBgbmF0aXZlU2V0YCB0aHJvdWdoIGEgcHJpbWl0aXZlLCBhIGBrZXk6IHVuZGVmaW5lZGAgc2hlbGwpIGFuZCB0aGVcbiAgICAvLyByZS1jb3B5IGlzIHdoYXQgcmVwYWlycyBpdDsgYSBgbWVyZ2VgIGJldHdlZW4gdHdvIHNldHMgdG91Y2hlcyB0aGVcbiAgICAvLyBvdGhlciB0cmVlIGFuZCBkb2VzIG5vdCBjb3VudC4gU2FtZSBsYXcgYXMgYHN1cGVyc2VkZWRCeU5leHRTZXRgLlxuICAgIGxldCBsYXN0U2V0UGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIGxldCBsYXN0TWVyZ2VQYXRoOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMub3BUcmFjZS5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3Qgb3AgPSB0aGlzLm9wVHJhY2VbaV07XG4gICAgICBjb25zdCBmYW1pbHkgPSBsb3NzeT8uZmFtaWxpZXMuZ2V0KGxvc3N5LnJvb3RPZi5nZXQob3AucGF0aCkgYXMgc3RyaW5nKTtcbiAgICAgIGlmIChmYW1pbHkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAoaSA9PT0gZmFtaWx5LnNsb3QpIHtcbiAgICAgICAgICB0aGlzLmVtaXRSZWFkQmFjayhmYW1pbHksIHJvd3MsICdmdWxsJyk7XG4gICAgICAgICAgbGFzdFNldFBhdGggPSBsYXN0TWVyZ2VQYXRoID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgbGV0IGtlZXAgPSBzdXJ2aXZlcy5nZXQob3AucGF0aCk7XG4gICAgICBpZiAoa2VlcCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGtlZXAgPSB0aGlzLmNoYW5nZWRTaW5jZUJhc2Uob3AucGF0aC5zcGxpdChERUxJTSkpO1xuICAgICAgICBzdXJ2aXZlcy5zZXQob3AucGF0aCwga2VlcCk7XG4gICAgICB9XG4gICAgICBpZiAoIWtlZXApIGNvbnRpbnVlOyAvLyBuby1vcCBvciB3cml0ZS10aGVuLXJldmVydCDihpIgbm8gbmV0IGNoYW5nZVxuXG4gICAgICB0cmFjZS5wdXNoKGZsYXR0ZW5lZFRyYWNlUm93KG9wKSk7XG4gICAgICBpZiAob3AudmVyYiA9PT0gJ21lcmdlJykge1xuICAgICAgICBpZiAobGFzdE1lcmdlUGF0aCA9PT0gb3AucGF0aCkgY29udGludWU7XG4gICAgICAgIGxhc3RNZXJnZVBhdGggPSBvcC5wYXRoO1xuICAgICAgICBjb25zdCBzZWdtZW50cyA9IG9wLnBhdGguc3BsaXQoREVMSU0pO1xuICAgICAgICBfc2V0KHVwZGF0ZXMsIHNlZ21lbnRzLCBzdHJ1Y3R1cmVkQ2xvbmUoX2dldCh0aGlzLnVwZGF0ZVBhdGNoLCBzZWdtZW50cykpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChsYXN0U2V0UGF0aCA9PT0gb3AucGF0aCkgY29udGludWU7XG4gICAgICAgIGxhc3RTZXRQYXRoID0gb3AucGF0aDtcbiAgICAgICAgY29uc3Qgc2VnbWVudHMgPSBvcC5wYXRoLnNwbGl0KERFTElNKTtcbiAgICAgICAgX3NldChvdmVyd3JpdGUsIHNlZ21lbnRzLCBzdHJ1Y3R1cmVkQ2xvbmUoX2dldCh0aGlzLm92ZXJ3cml0ZVBhdGNoLCBzZWdtZW50cykpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJvd3M7XG4gIH1cblxuICAvKipcbiAgICogRGVsdGEtZW5jb2RlZCBwYXlsb2FkIChgY29tbWl0VmFsdWVzOiAnZGVsdGEnYCwgIzEzYy1CKSDigJQgc2FtZSBuZXQtY2hhbmdlXG4gICAqIGZpbHRlciBhcyB7QGxpbmsgdG9DaGFuZ2VPbmx5UGF5bG9hZH0sIHRocmVlIGVuY29kaW5nIGRpZmZlcmVuY2VzOlxuICAgKlxuICAgKiAxLiAqKk9uZSB0cmFjZSBlbnRyeSBwZXIgc3Vydml2aW5nIHBhdGgqKiAodGhlIMKnMi41IGRlZHVwIHJ1bGUg4oCUIGBhcHBlbmRgXG4gICAqICAgIGlzIE5PVCBpZGVtcG90ZW50IG9uIHJlcGxheSwgc28gZHVwbGljYXRlIGVudHJpZXMgd291bGQgbXVsdGlwbHlcbiAgICogICAgdGFpbHMpLiBUaGUgdmVyYiBpcyByZXNvbHZlZCBmcm9tIHRoZSBwYXRoJ3Mgb3AgbWl4ICsgYmFzZeKGkmZpbmFsXG4gICAqICAgIHJlbGF0aW9uc2hpcDsgZW50cmllcyBhcmUgb3JkZXJlZCBieSBlYWNoIHBhdGgncyBMQVNUIHRvdWNoLFxuICAgKiAgICBwcmVzZXJ2aW5nIGxhc3Qtd3JpdGVyLXdpbnMgZm9yIG5lc3RlZC9vdmVybGFwcGluZyBwYXRocy5cbiAgICogMi4gKipWZXJiIHJlc29sdXRpb24gcGVyIHBhdGgqKiDigJQgZm9yIGEgcGF0aCB3aXRoIE5PIHN1cnZpdmluZyByZWxhdGl2ZVxuICAgKiAgICAoc2VlIDMpOlxuICAgKiAgICAtIGxhc3Qgb3AgYCdkZWxldGUnYCBBTkQgZmluYWwgdmFsdWUgZ29uZSDihpIgYGRlbGV0ZWAgKHRoZSBwYXRoIHN0YXlzXG4gICAqICAgICAgZW51bWVyYXRlZCBpbiBgb3ZlcndyaXRlYCB3aXRoIGB1bmRlZmluZWRgIGZvciBrZXktc2V0IGNvbnN1bWVycykuXG4gICAqICAgICAgUmVxdWlyZXMgdGhlIHBhcmVudCB0byBiZSBhIHJlYWwgY29udGFpbmVyIGluIHRoZSBiYXNlIOKAlCByZXBsYXkgdXNlc1xuICAgKiAgICAgIGBuYXRpdmVEZWxldGVgLCB3aGljaCBpcyBpbmVydCBvbiBhIHByaW1pdGl2ZS9hYnNlbnQgcGFyZW50LCB3aGVyZWFzXG4gICAqICAgICAgdGhlIGAnZnVsbCdgIGZsYXR0ZW5pbmcgKGBfc2V0YCBvZiBgdW5kZWZpbmVkYCkgQ09FUkNFUyB0aGF0IHBhcmVudFxuICAgKiAgICAgIGludG8gYW4gb2JqZWN0OyB3aGVuIHRoZXkgd291bGQgZGlzYWdyZWUgd2Uga2VlcCB0aGUgZmxhdHRlbmluZztcbiAgICogICAgLSBPTkxZIGAnbWVyZ2UnYCBvcHMg4oaSIGBtZXJnZWAgd2l0aCB0aGUgYWNjdW11bGF0ZWQgYHVwZGF0ZVBhdGNoYFxuICAgKiAgICAgIGRlbHRhO1xuICAgKiAgICAtIG90aGVyd2lzZSAoYHNldGAvbWl4ZWQpOiB0aGUgdmFsdWUgdGhlIHN0YWdlJ3MgJ2Z1bGwnIHJvd3MgZ2l2ZSB0aGVcbiAgICogICAgICBwYXRoICh7QGxpbmsgZnVsbFJvd3NWYWx1ZX0pLiBJZiBiYXNlIGFuZCB0aGF0IHZhbHVlIGFyZSBhcnJheXMgYW5kXG4gICAqICAgICAgYmFzZSBpcyBhIFNUUklDVCBQUkVGSVgg4oaSIGBhcHBlbmRgIHN0b3Jpbmcgb25seSB0aGUgdGFpbDsgZWxzZSBgc2V0YFxuICAgKiAgICAgIHN0b3JpbmcgdGhlIGZ1bGwgdmFsdWUuXG4gICAqIDMuICoqT1ZFUkxBUCBGQU1JTElFUyB0YWtlIHRoZSBmdWxsLXZhbHVlIGZhbGxiYWNrLioqIGBvdmVyd3JpdGVgIC9cbiAgICogICAgYHVwZGF0ZXNgIGFyZSBuZXN0ZWQgcGF0aCBUUkVFUywgc28gdHdvIHN1cnZpdmluZyBwYXRocyB3aGVyZSBvbmUgaXNcbiAgICogICAgYW4gYW5jZXN0b3Igb2YgdGhlIG90aGVyIChgYWAgYW5kIGBhLnBgKSBzaGFyZSBzdG9yYWdlLiBEZWx0YSdzXG4gICAqICAgIHBlci1wYXRoIGVuY29kaW5ncyB3b3VsZCBjbG9iYmVyIGVhY2ggb3RoZXIgdGhlcmUgKGFuIGBhcHBlbmRgXG4gICAqICAgIGFuY2VzdG9yIHN0b3JlcyBvbmx5IGEgVEFJTCwgYSBgZGVsZXRlYCBhbmNlc3RvciBgdW5kZWZpbmVkYCksIHNvIGV2ZXJ5XG4gICAqICAgIHBhdGggdGhhdCBoYXMgYSBzdXJ2aXZpbmcgYW5jZXN0b3IvZGVzY2VuZGFudCBpcyBjb21taXR0ZWQgYXMgYSBwbGFpblxuICAgKiAgICBgc2V0YCBvZiB0aGUgdmFsdWUgdGhlICdmdWxsJyByb3dzIGdpdmUgaXQsIGFuZCB0aGUgZmFtaWx5J3NcbiAgICogICAgc2hhbGxvd2VzdCBwYXRoICh3aG9zZSBzZXQgY292ZXJzIHRoZSB3aG9sZSBzdWJ0cmVlKSBpcyBlbWl0dGVkIExBU1QuXG4gICAqXG4gICAqIFRoZSByZXN1bHQgaXMgQURNSVRURUQgKHtAbGluayBhZG1pdH0pIGxpa2UgdGhlICdmdWxsJyBwYXlsb2FkOiBhIGNvbXBhY3RcbiAgICogcm93IGlzIGtlcHQgb25seSB3aGVyZSB0aGUgYnVuZGxlIHByb3ZhYmx5IGZvbGRzIGJhY2ssIGFuZCBhIGZhbWlseSB0aGF0XG4gICAqIGRvZXMgbm90IGlzIHJlY29yZGVkIGFzIHdoYXQgdGhlIHN0YWdlIHJlYWQuIFNvIGJvdGggZW5jb2RpbmdzIGNvbW1pdCB0aGVcbiAgICogdmFsdWUgdGhlIHN0YWdlIHJlYWQ7IGJlZm9yZSA5LjMwLjAgdGhleSBzaGFyZWQgYSByZXBsYXkgdGhhdCBkaWQgbm90XG4gICAqIChgcmVwbGF5UGF0aFZlcmJzYCAvIGByZXBsYXlGYW1pbHlWZXJic2AsIGRlbGV0ZWQpLlxuICAgKi9cbiAgcHJpdmF0ZSB0b0RlbHRhUGF5bG9hZCgpOiBSb3dzIHtcbiAgICBjb25zdCBmdWxsVmFsdWVBdCA9IHRoaXMuZnVsbFJvd3NWYWx1ZSgpO1xuICAgIHJldHVybiB0aGlzLmFkbWl0KChsb3NzeSkgPT4gdGhpcy5kZWx0YVJvd3MobG9zc3ksIGZ1bGxWYWx1ZUF0KSk7XG4gIH1cblxuICAvKiogVGhlIGRlbHRhIHJvd3M7IGEgZmFtaWx5IGluIGBsb3NzeWAgaXMgd3JpdHRlbiBhcyBpdHMgcmVhZC1iYWNrLCBhdCBpdHMgbGFzdCB0b3VjaCAoe0BsaW5rIGVtaXRSZWFkQmFja30pLiAqL1xuICBwcml2YXRlIGRlbHRhUm93cyhsb3NzeTogTG9zc3kgfCB1bmRlZmluZWQsIGZ1bGxWYWx1ZUF0OiAoc2VnbWVudHM6IHN0cmluZ1tdKSA9PiB1bmtub3duKTogUm93cyB7XG4gICAgY29uc3Qgcm93czogUm93cyA9IHsgb3ZlcndyaXRlOiB7fSwgdXBkYXRlczoge30sIHRyYWNlOiBbXSB9O1xuICAgIGNvbnN0IHsgb3ZlcndyaXRlLCB1cGRhdGVzLCB0cmFjZSB9ID0gcm93cztcbiAgICBjb25zdCBpbkxvc3N5ID0gKHBhdGg6IHN0cmluZykgPT4gbG9zc3k/LmZhbWlsaWVzLmhhcyhsb3NzeS5yb290T2YuZ2V0KHBhdGgpIGFzIHN0cmluZykgPT09IHRydWU7XG4gICAgY29uc3Qgc3Vydml2b3JzID0gdGhpcy5uZXRDaGFuZ2VTdXJ2aXZvcnModGhpcy5vcHNCeVBhdGgoKSkuZmlsdGVyKChzKSA9PiAhaW5Mb3NzeShzLnBhdGgpKTtcbiAgICBjb25zdCB7IHJvb3RPZiwgYnlSb290IH0gPSBncm91cEludG9GYW1pbGllcyhzdXJ2aXZvcnMsIG5ldyBTZXQoc3Vydml2b3JzLm1hcCgocykgPT4gcy5wYXRoKSkpO1xuXG4gICAgLy8gVEhFIFZFUkIgQ0hPSUNFIOKAlCB0aGUgZGVsdGEgZW5jb2RlciBwaWNrcyBhIHZlcmIgcGVyIHBhdGg7IHRoZSBWQUxVRVNcbiAgICAvLyBpdCBlbmNvZGVzIGNvbWUgZnJvbSB0aGUgb25lIHJlcGxheSAoYGZ1bGxWYWx1ZUF0YCksIG5ldmVyIGEgcmVwbGljYSBvZlxuICAgIC8vIHRoZSB2ZXJiIGxhdyAoOS4zMC4wOiBDTEFVREUubWQncyB2ZXJiLXN3aXRjaCByZXBsaWNhcyBsb3N0IHR3byBoZXJlKS5cbiAgICBjb25zdCBlbWl0ID0gKHM6IFN1cnZpdm9yKTogdm9pZCA9PiB7XG4gICAgICBjb25zdCB7IHBhdGgsIHNlZ21lbnRzLCB2ZXJicywgYmVmb3JlIH0gPSBzO1xuICAgICAgY29uc3QgcHJvdiA9IHByb3ZlbmFuY2Uocy5yZWFkS2V5cyk7XG4gICAgICBpZiAoKGJ5Um9vdC5nZXQocm9vdE9mLmdldChwYXRoKSBhcyBzdHJpbmcpIGFzIFN1cnZpdm9yW10pLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgLy8gUnVsZSAzIOKAlCBvbmUgY29oZXJlbnQgdHJlZTogZXZlcnkgbWVtYmVyIGEgc2V0IG9mIGl0cyB2YWx1ZS5cbiAgICAgICAgdHJhY2UucHVzaCh7IHBhdGgsIHZlcmI6ICdzZXQnLCAuLi5wcm92IH0pO1xuICAgICAgICBfc2V0KG92ZXJ3cml0ZSwgc2VnbWVudHMsIHN0cnVjdHVyZWRDbG9uZShmdWxsVmFsdWVBdChzZWdtZW50cykpKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgbGFzdFZlcmIgPSB2ZXJic1t2ZXJicy5sZW5ndGggLSAxXTtcbiAgICAgIGlmIChsYXN0VmVyYiA9PT0gJ2RlbGV0ZScgJiYgcy5hZnRlciA9PT0gdW5kZWZpbmVkICYmIHRoaXMuZGVsZXRlUmVwbGF5c0FzRmxhdHRlbmluZyhzZWdtZW50cykpIHtcbiAgICAgICAgLy8gUmVhbCBkZWxldGlvbiDigJQgcmVwbGF5IHJlbW92ZXMgdGhlIGtleS4gS2VlcCB0aGUgcGF0aCBlbnVtZXJhdGVkXG4gICAgICAgIC8vIGluIGBvdmVyd3JpdGVgICh1bmRlZmluZWQpIHNvIE9iamVjdC5rZXlzIGNvbnN1bWVycyBzZWUgaXQuXG4gICAgICAgIHRyYWNlLnB1c2goeyBwYXRoLCB2ZXJiOiAnZGVsZXRlJywgLi4ucHJvdiB9KTtcbiAgICAgICAgX3NldChvdmVyd3JpdGUsIHNlZ21lbnRzLCB1bmRlZmluZWQpO1xuICAgICAgfSBlbHNlIGlmICh2ZXJicy5ldmVyeSgodikgPT4gdiA9PT0gJ21lcmdlJykpIHtcbiAgICAgICAgdHJhY2UucHVzaCh7IHBhdGgsIHZlcmI6ICdtZXJnZScsIC4uLnByb3YgfSk7XG4gICAgICAgIF9zZXQodXBkYXRlcywgc2VnbWVudHMsIHN0cnVjdHVyZWRDbG9uZShfZ2V0KHRoaXMudXBkYXRlUGF0Y2gsIHNlZ21lbnRzKSkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcHVzaFZhbHVlUm93KHJvd3MsIHBhdGgsIHNlZ21lbnRzLCBiZWZvcmUsIGZ1bGxWYWx1ZUF0KHNlZ21lbnRzKSwgcHJvdiwgdGhpcy5tYXJrZWRCZWxvdyhwYXRoKSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIEEgZmFtaWx5IHRoYXQgZGlkIG5vdCBmb2xkIGJhY2sgdGFrZXMgaXRzIHBsYWNlIGJ5IGl0cyBsYXN0IHRvdWNoLlxuICAgIGNvbnN0IHBlbmRpbmcgPSBsb3NzeSA9PT0gdW5kZWZpbmVkID8gW10gOiBbLi4ubG9zc3kuZmFtaWxpZXMudmFsdWVzKCldLnNvcnQoKGEsIGIpID0+IGEuc2xvdCAtIGIuc2xvdCk7XG4gICAgbGV0IG5leHQgPSAwO1xuICAgIGNvbnN0IGZsdXNoQmVmb3JlID0gKHRvdWNoOiBudW1iZXIpOiB2b2lkID0+IHtcbiAgICAgIHdoaWxlIChuZXh0IDwgcGVuZGluZy5sZW5ndGggJiYgcGVuZGluZ1tuZXh0XS5zbG90IDwgdG91Y2gpIHRoaXMuZW1pdFJlYWRCYWNrKHBlbmRpbmdbbmV4dCsrXSwgcm93cywgJ2RlbHRhJyk7XG4gICAgfTtcbiAgICBlbWl0SW5GYW1pbHlPcmRlcihzdXJ2aXZvcnMsIHJvb3RPZiwgYnlSb290LCBlbWl0LCBmbHVzaEJlZm9yZSk7XG4gICAgZmx1c2hCZWZvcmUoSW5maW5pdHkpO1xuICAgIHJldHVybiByb3dzO1xuICB9XG5cbiAgLy8g4pSA4pSAIFRoZSBhZG1pdHRlZCByZWNvcmQgKDkuMzAuMCkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqXG4gICAqIFRIRSBBRE1JU1NJT04g4oCUIGEgY29tbWl0IGlzIGFkbWl0dGVkIG9ubHkgaWYgaXRzIGJ1bmRsZSBmb2xkcyBiYWNrIHRvIHRoZVxuICAgKiBzdGFnZSdzIHJlYWQteW91ci13cml0ZXMgdmlldyBhdCBldmVyeSBwYXRoIHRoZSBzdGFnZSB0b3VjaGVkLiBgYnVpbGRgXG4gICAqIGxheXMgdGhlIHJvd3Mgb3V0IChvbmUgZW5jb2RlcjogYCdmdWxsJ2Agb3IgYCdkZWx0YSdgKTsgdGhlIGNhbmRpZGF0ZSBpc1xuICAgKiBjaGVja2VkICh7QGxpbmsgbG9zc3lGYW1pbGllc30pLCBhbmQgd2hlbiBzb21lIGZhbWlseSdzIHJvd3MgZG8gbm90IGZvbGRcbiAgICogYmFjayB0aGUgcm93cyBhcmUgbGFpZCBvdXQgYWdhaW4gd2l0aCB0aG9zZSBmYW1pbGllcyB3cml0dGVuIGFzIHdoYXQgdGhlXG4gICAqIHN0YWdlIHJlYWQgKHtAbGluayBlbWl0UmVhZEJhY2t9KSDigJQgZXZlcnkgb3RoZXIgZmFtaWx5J3MgYnl0ZXMgZXhhY3RseSBhc1xuICAgKiB0aGUgZmlyc3QgbGF5b3V0IG1hZGUgdGhlbS5cbiAgICovXG4gIHByaXZhdGUgYWRtaXQoYnVpbGQ6IChsb3NzeTogTG9zc3kgfCB1bmRlZmluZWQpID0+IFJvd3MpOiBSb3dzIHtcbiAgICBjb25zdCBjYW5kaWRhdGUgPSBidWlsZCh1bmRlZmluZWQpO1xuICAgIGNvbnN0IGxvc3N5ID0gdGhpcy5sb3NzeUZhbWlsaWVzKGNhbmRpZGF0ZSk7XG4gICAgcmV0dXJuIGxvc3N5ID09PSB1bmRlZmluZWQgPyBjYW5kaWRhdGUgOiBidWlsZChsb3NzeSk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGZhbWlsaWVzIHdob3NlIHJvd3MgZG8gbm90IGZvbGQgYmFjayB0byB3aGF0IHRoZSBzdGFnZSByZWFkIOKAlFxuICAgKiBgdW5kZWZpbmVkYCB3aGVuIHRoZXJlIGFyZSBub25lIChgYWRtaXNzaW9uLnRzIMK3IGxvc3N5RmFtaWxpZXNgOiB0aGVcbiAgICogY2FuZGlkYXRlIHJlcGxheWVkIG9udG8gdGhlIGRpZmYgYmFzZSBieSBgZHJ5Rm9sZGAsIGV2ZXJ5IGZhbWlseSBvZlxuICAgKiB0b3VjaGVkIHBhdGhzIGNvbXBhcmVkIHdpdGggdGhlIHdvcmtpbmcgY29weSBhdCBpdHMgcm9vdCBhbmQgb24gdGhlIHdheVxuICAgKiBkb3duIHRvIGl0KS5cbiAgICpcbiAgICogV2l0aG91dCBhIGZvbGQsIHdoZW4gdGhlIHN0YWdlIHN0YWdlZCBubyBgbWVyZ2VgIGFuZCBubyBuZXN0ZWQgb3A6IGl0c1xuICAgKiByb3dzIGFyZSBgc2V0YCAvIGBkZWxldGVgIG9mIGtleXMgZGlyZWN0bHkgdW5kZXIgaXRzIGFkZHJlc3MsIGVhY2hcbiAgICogd3JpdGluZyB0aGUgU0FNRSB2YWx1ZSBpbnRvIGB3b3JraW5nQ29weWAgYW5kIGBvdmVyd3JpdGVQYXRjaGAg4oCUIHRoZVxuICAgKiByZWNvcmQgaXMgdGhlIHJlYWQtYmFjayBieSBjb25zdHJ1Y3Rpb24gKHRoZSBwcm9wZXJ0eSdzIFJPT1QtT05MWSBhcm1cbiAgICogcGlucyB0aGlzKS4gVGhhdCBrZWVwcyB0aGUgY29tbWl0IG9mIHRoZSB0eXBlZCBzY29wZSdzIHJvb3Qta2V5IHdyaXRlc1xuICAgKiBleGFjdGx5IGFzIGNoZWFwIGFzIGl0IHdhcy5cbiAgICovXG4gIHByaXZhdGUgbG9zc3lGYW1pbGllcyhjYW5kaWRhdGU6IFJvd3MpOiBMb3NzeSB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHRoaXMuc3RhZ2VkTWVyZ2VzID09PSAwICYmIHRoaXMubmVzdGVkT3BzID09PSAwKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHJldHVybiBsb3NzeUZhbWlsaWVzKGNhbmRpZGF0ZSwgdGhpcy5iYXNlU25hcHNob3QsIHRoaXMud29ya2luZ0NvcHksIHRoaXMub3BUcmFjZSwgdGhpcy5hZGRyZXNzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIGZhbWlseSB3aG9zZSByb3dzIGRpZCBub3QgZm9sZCBiYWNrLCB3cml0dGVuIGFzIHdoYXQgdGhlIHN0YWdlIHJlYWQ6XG4gICAqIG9uZSBgc2V0YCByb3cgcGVyIG1lbWJlciB0aGF0IGNoYW5nZWQgKGRlc2NlbmRhbnRzIGJ5IGxhc3QgdG91Y2gsIGVhY2hcbiAgICogd2l0aCBpdHMgb3duIHJlYWQgcHJlZml4KSwgdGhlIFJPT1QgbGFzdCwgYW5kIHRoZSByb290J3MgcmVhZC1iYWNrIHZhbHVlXG4gICAqIGluIGBvdmVyd3JpdGVgIOKAlCBvbmUgY29oZXJlbnQgdHJlZSwgc28gbm8gcm93IGNhbiBjbG9iYmVyIGFub3RoZXIuIFRoZVxuICAgKiByb290J3Mgcm93IGlzIHdyaXR0ZW4gZXZlbiB3aGVuIHRoZSByb290IGl0c2VsZiBkaWQgbm90IGNoYW5nZTogaXQgaXMgdGhlXG4gICAqIHJvdyB0aGF0IGNhcnJpZXMgdGhlIGZhbWlseSdzIHJlYWQtYmFjayAoYW5kIHRoZSBjb250YWluZXJzIEwtMSdzIGRyb3BwZWRcbiAgICogb3AgbGVmdCkuIEEgbG9uZSByb290IHVuZGVyIGAnZGVsdGEnYCBrZWVwcyB0aGUgY29tcGFjdCBgYXBwZW5kYCB3aGVuIHRoZVxuICAgKiB2YWx1ZSBpdCByZWFkIGlzIGl0cyBiYXNlIHBsdXMgYSB0YWlsLlxuICAgKi9cbiAgcHJpdmF0ZSBlbWl0UmVhZEJhY2soZmFtaWx5OiBGYW1pbHksIHJvd3M6IFJvd3MsIGVuY29kaW5nOiBDb21taXRWYWx1ZXNNb2RlKTogdm9pZCB7XG4gICAgbGV0IHJvb3Q6IE1lbWJlciA9IGZhbWlseS5tZW1iZXJzWzBdO1xuICAgIGxldCBjaGFuZ2VkID0gMDtcbiAgICBmb3IgKGNvbnN0IG0gb2YgZmFtaWx5Lm1lbWJlcnMpIHtcbiAgICAgIGlmIChtLnBhdGggPT09IGZhbWlseS5yb290KSB7XG4gICAgICAgIHJvb3QgPSBtO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmICghdGhpcy5jaGFuZ2VkU2luY2VCYXNlKG0ucGF0aC5zcGxpdChERUxJTSkpKSBjb250aW51ZTtcbiAgICAgIHJvd3MudHJhY2UucHVzaCh7IHBhdGg6IG0ucGF0aCwgdmVyYjogJ3NldCcsIC4uLnByb3ZlbmFuY2UobS5yZWFkS2V5cykgfSk7XG4gICAgICBjaGFuZ2VkKys7XG4gICAgfVxuICAgIGNvbnN0IGFmdGVyID0gX2dldCh0aGlzLndvcmtpbmdDb3B5LCBmYW1pbHkucm9vdFNlZ21lbnRzKTtcbiAgICBpZiAoZW5jb2RpbmcgPT09ICdkZWx0YScgJiYgY2hhbmdlZCA9PT0gMCAmJiBhZnRlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBiZWZvcmUgPSBfZ2V0KHRoaXMuYmFzZVNuYXBzaG90LCBmYW1pbHkucm9vdFNlZ21lbnRzKTtcbiAgICAgIHB1c2hWYWx1ZVJvdyhcbiAgICAgICAgcm93cyxcbiAgICAgICAgZmFtaWx5LnJvb3QsXG4gICAgICAgIGZhbWlseS5yb290U2VnbWVudHMsXG4gICAgICAgIGJlZm9yZSxcbiAgICAgICAgYWZ0ZXIsXG4gICAgICAgIHByb3ZlbmFuY2Uocm9vdC5yZWFkS2V5cyksXG4gICAgICAgIHRoaXMubWFya2VkQmVsb3coZmFtaWx5LnJvb3QpLFxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcm93cy50cmFjZS5wdXNoKHsgcGF0aDogZmFtaWx5LnJvb3QsIHZlcmI6ICdzZXQnLCAuLi5wcm92ZW5hbmNlKHJvb3QucmVhZEtleXMpIH0pO1xuICAgIC8vIFRoZSBjbG9uZSB0aGUgY2hlY2sgdG9vayAoYGFkbWlzc2lvbi50cyDCtyBmb2xkc0JhY2tgKSwgd2hlbiBpdCB0b29rIG9uZS5cbiAgICBfc2V0KHJvd3Mub3ZlcndyaXRlLCBmYW1pbHkucm9vdFNlZ21lbnRzLCBmYW1pbHkuaGVsZCAhPT0gdW5kZWZpbmVkID8gZmFtaWx5LmhlbGQudmFsdWUgOiBzdHJ1Y3R1cmVkQ2xvbmUoYWZ0ZXIpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgdmFsdWUgdGhlIHN0YWdlJ3MgJ2Z1bGwnIHJvd3MgZ2l2ZSBhIHBhdGgg4oCUIHdoYXQgdGhlIGRlbHRhIGVuY29kZXJcbiAgICogY29tbWl0cyBmb3IgYSBmYW1pbHkgbWVtYmVyIG9yIGEgcGF0aCB3aXRoIGEgYHNldGAg4oCUIHJlYWQgZnJvbSBPTkVcbiAgICoge0BsaW5rIGRyeUZvbGR9IG9mIHRob3NlIHJvd3Mgb3ZlciB0aGUgcGF0Y2ggdHJlZXMgdGhlbXNlbHZlcywgdGFrZW4gdGhlXG4gICAqIGZpcnN0IHRpbWUgaXQgaXMgYXNrZWQuIEJ5IHJlZmVyZW5jZSwgYXMgdGhlIHN0YWdlIGhlbGQgdGhlbTogYW4gZWxlbWVudFxuICAgKiBhIGBzZXRgIGFuZCBhIGBtZXJnZWAgb2Ygb25lIHBhdGggc2hhcmUgc3RheXMgb25lIGVsZW1lbnQuIEEgc3RhZ2UgdGhhdFxuICAgKiBzdGFnZWQgbm8gYG1lcmdlYCBhbmQgbm8gbmVzdGVkIG9wIG5lZWRzIG5vIGZvbGQg4oCUIGEgcGF0aCdzIHZhbHVlIGlzIGl0c1xuICAgKiBsYXN0IHN0YWdlZCB2YWx1ZS4gKEJlZm9yZSA5LjMwLjA6IHR3byByZXBsaWNhcyBvZiB0aGUgdmVyYiBsYXcsXG4gICAqIGByZXBsYXlQYXRoVmVyYnNgIGFuZCBgcmVwbGF5RmFtaWx5VmVyYnNgLilcbiAgICovXG4gIHByaXZhdGUgZnVsbFJvd3NWYWx1ZSgpOiAoc2VnbWVudHM6IHN0cmluZ1tdKSA9PiB1bmtub3duIHtcbiAgICBpZiAodGhpcy5zdGFnZWRNZXJnZXMgPT09IDAgJiYgdGhpcy5uZXN0ZWRPcHMgPT09IDApIHJldHVybiAoc2VnbWVudHMpID0+IF9nZXQodGhpcy5vdmVyd3JpdGVQYXRjaCwgc2VnbWVudHMpO1xuICAgIGxldCBmb2xkOiB1bmtub3duO1xuICAgIHJldHVybiAoc2VnbWVudHMpID0+IHtcbiAgICAgIGZvbGQgPz89IGRyeUZvbGQodGhpcy5iYXNlU25hcHNob3QsIHRoaXMudXBkYXRlUGF0Y2gsIHRoaXMub3ZlcndyaXRlUGF0Y2gsIHRoaXMuZnVsbFJvd3MoKSk7XG4gICAgICByZXR1cm4gX2dldChmb2xkLCBzZWdtZW50cyk7XG4gICAgfTtcbiAgfVxuXG4gIC8qKiBUaGUgc3RhZ2UncyAnZnVsbCcgcm93czogZXZlcnkgb3Agb24gYSBwYXRoIHRoZSBuZXQtY2hhbmdlIGZpbHRlciBrZWVwcywgYSBgZGVsZXRlYCBzcGVsbGVkIGBzZXRgLiAqL1xuICBwcml2YXRlIGZ1bGxSb3dzKCk6IFRyYWNlRW50cnlbXSB7XG4gICAgY29uc3Qga2VlcCA9IG5ldyBNYXA8c3RyaW5nLCBib29sZWFuPigpO1xuICAgIGNvbnN0IHJvd3M6IFRyYWNlRW50cnlbXSA9IFtdO1xuICAgIGZvciAoY29uc3Qgb3Agb2YgdGhpcy5vcFRyYWNlKSB7XG4gICAgICBsZXQgayA9IGtlZXAuZ2V0KG9wLnBhdGgpO1xuICAgICAgaWYgKGsgPT09IHVuZGVmaW5lZCkga2VlcC5zZXQob3AucGF0aCwgKGsgPSB0aGlzLmNoYW5nZWRTaW5jZUJhc2Uob3AucGF0aC5zcGxpdChERUxJTSkpKSk7XG4gICAgICBpZiAoaykgcm93cy5wdXNoKHsgcGF0aDogb3AucGF0aCwgdmVyYjogb3AudmVyYiA9PT0gJ21lcmdlJyA/ICdtZXJnZScgOiAnc2V0JyB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHJvd3M7XG4gIH1cblxuICAvKipcbiAgICogRGlkIHRoZSBzdGFnZSBjaGFuZ2UgdGhlIHZhbHVlIGF0IGBzZWdtZW50c2A/IEJhc2UgYW5kIGZpbmFsIHZhbHVlIGFyZVxuICAgKiBmaXhlZCBhdCBjb21taXQsIHNvIHRoaXMgaXMgdGhlIE9ORSBuZXQtY2hhbmdlIHZlcmRpY3QgYm90aCBwYXlsb2FkXG4gICAqIGVuY29kaW5ncyBhcHBseSAoYSBuby1vcCB3cml0ZSBhbmQgYSB3cml0ZS10aGVuLXJldmVydCBib3RoIGZhaWwgaXQpLlxuICAgKi9cbiAgcHJpdmF0ZSBjaGFuZ2VkU2luY2VCYXNlKHNlZ21lbnRzOiBzdHJpbmdbXSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhZGVlcEVxdWFsKF9nZXQodGhpcy5iYXNlU25hcHNob3QsIHNlZ21lbnRzKSwgX2dldCh0aGlzLndvcmtpbmdDb3B5LCBzZWdtZW50cykpO1xuICB9XG5cbiAgLyoqXG4gICAqIFBhdGgg4oaSIGl0cyBvcC12ZXJiIHNlcXVlbmNlLCBvcmRlcmVkIGJ5IExBU1QgdG91Y2ggKGRlbGV0ZSArIHJlLWluc2VydFxuICAgKiBtb3ZlcyBhIHJlLXRvdWNoZWQgcGF0aCB0byB0aGUgZW5kIG9mIHRoZSBNYXAncyBpbnNlcnRpb24gb3JkZXIg4oCUXG4gICAqIHByZXNlcnZpbmcgbGFzdC13cml0ZXItd2lucyBmb3IgbmVzdGVkL292ZXJsYXBwaW5nIHBhdGhzKS4gUGVyLXdyaXRlXG4gICAqIHByb3ZlbmFuY2UgKCNQMSk6IHRoZSBMQVNUIG9wJ3MgcmVhZEtleXMgaXMga2VwdCDigJQgcmVhZCBwcmVmaXhlcyBvbmx5IGdyb3dcbiAgICogd2l0aGluIGEgc3RhZ2UsIHNvIGxhc3QgPT0gdW5pb24gYWNyb3NzIHRoZSBwYXRoLlxuICAgKi9cbiAgcHJpdmF0ZSBvcHNCeVBhdGgoKTogTWFwPHN0cmluZywgeyB2ZXJiczogT3BWZXJiW107IHJlYWRLZXlzPzogc3RyaW5nW107IGxhc3Q6IG51bWJlciB9PiB7XG4gICAgY29uc3QgYnlQYXRoID0gbmV3IE1hcDxzdHJpbmcsIHsgdmVyYnM6IE9wVmVyYltdOyByZWFkS2V5cz86IHN0cmluZ1tdOyBsYXN0OiBudW1iZXIgfT4oKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMub3BUcmFjZS5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3Qgb3AgPSB0aGlzLm9wVHJhY2VbaV07XG4gICAgICBjb25zdCBwcmV2ID0gYnlQYXRoLmdldChvcC5wYXRoKTtcbiAgICAgIGlmIChwcmV2KSB7XG4gICAgICAgIHByZXYudmVyYnMucHVzaChvcC52ZXJiKTtcbiAgICAgICAgcHJldi5sYXN0ID0gaTtcbiAgICAgICAgaWYgKG9wLnJlYWRLZXlzICE9PSB1bmRlZmluZWQpIHByZXYucmVhZEtleXMgPSBvcC5yZWFkS2V5cztcbiAgICAgICAgYnlQYXRoLmRlbGV0ZShvcC5wYXRoKTtcbiAgICAgICAgYnlQYXRoLnNldChvcC5wYXRoLCBwcmV2KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGJ5UGF0aC5zZXQob3AucGF0aCwge1xuICAgICAgICAgIHZlcmJzOiBbb3AudmVyYl0sXG4gICAgICAgICAgbGFzdDogaSxcbiAgICAgICAgICAuLi4ob3AucmVhZEtleXMgIT09IHVuZGVmaW5lZCAmJiB7IHJlYWRLZXlzOiBvcC5yZWFkS2V5cyB9KSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBieVBhdGg7XG4gIH1cblxuICAvKiogVGhlIG5ldC1jaGFuZ2UgZmlsdGVyIOKAlCBpZGVudGljYWwgdG8gJ2Z1bGwnICh7QGxpbmsgY2hhbmdlZFNpbmNlQmFzZX0pLiBTdXJ2aXZvcnMga2VlcCBsYXN0LXRvdWNoIG9yZGVyLiAqL1xuICBwcml2YXRlIG5ldENoYW5nZVN1cnZpdm9ycyhieVBhdGg6IE1hcDxzdHJpbmcsIHsgdmVyYnM6IE9wVmVyYltdOyByZWFkS2V5cz86IHN0cmluZ1tdOyBsYXN0OiBudW1iZXIgfT4pOiBTdXJ2aXZvcltdIHtcbiAgICBjb25zdCBzdXJ2aXZvcnM6IFN1cnZpdm9yW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IFtwYXRoLCB7IHZlcmJzLCByZWFkS2V5cywgbGFzdCB9XSBvZiBieVBhdGgpIHtcbiAgICAgIGNvbnN0IHNlZ21lbnRzID0gcGF0aC5zcGxpdChERUxJTSk7XG4gICAgICBpZiAoIXRoaXMuY2hhbmdlZFNpbmNlQmFzZShzZWdtZW50cykpIGNvbnRpbnVlOyAvLyBuby1vcCBvciB3cml0ZS10aGVuLXJldmVydCDihpIgbm8gbmV0IGNoYW5nZVxuICAgICAgY29uc3QgYmVmb3JlID0gX2dldCh0aGlzLmJhc2VTbmFwc2hvdCwgc2VnbWVudHMpO1xuICAgICAgY29uc3QgYWZ0ZXIgPSBfZ2V0KHRoaXMud29ya2luZ0NvcHksIHNlZ21lbnRzKTtcbiAgICAgIHN1cnZpdm9ycy5wdXNoKHsgcGF0aCwgc2VnbWVudHMsIHZlcmJzLCByZWFkS2V5cywgbGFzdCwgYmVmb3JlLCBhZnRlciB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHN1cnZpdm9ycztcbiAgfVxuXG4gIC8qKlxuICAgKiBNYXkgYSBzdGFnZWQgYGRlbGV0ZWAgYXQgdGhpcyBwYXRoIGNvbW1pdCBhcyB0aGUgYCdkZWxldGUnYCB2ZXJiP1xuICAgKlxuICAgKiBPbmx5IHdoZW4gcmVtb3ZpbmcgdGhlIGtleSBhbmQgdGhlIGAnZnVsbCdgIG1vZGUncyBmbGF0dGVuaW5nIChgX3NldGAgb2ZcbiAgICogYHVuZGVmaW5lZGApIGxhbmQgaW4gdGhlIHNhbWUgcGxhY2UuIFRoZXkgZGl2ZXJnZSB3aGVuIHRoZSBwYXJlbnQgaXMgbm90XG4gICAqIGEgY29udGFpbmVyOiBgbmF0aXZlRGVsZXRlYCB3YWxrcyBhd2F5IHVudG91Y2hlZCwgd2hpbGUgYG5hdGl2ZVNldGBcbiAgICogQ09FUkNFUyB0aGUgcHJpbWl0aXZlIHBhcmVudCBpbnRvIGFuIG9iamVjdCB0byBob2xkIHRoZSBrZXkuIENvbW1pdHRpbmdcbiAgICogYGRlbGV0ZWAgdGhlcmUgd291bGQgc2lsZW50bHkgZHJvcCBhIHN0YXRlIGNoYW5nZSB0aGUgc3RhZ2UgcmVhbGx5IG1hZGUsXG4gICAqIHNvIHRob3NlIChwYXRob2xvZ2ljYWwpIGRlbGV0ZXMga2VlcCB0aGUgaGlzdG9yaWNhbCBmbGF0dGVuaW5nLlxuICAgKi9cbiAgcHJpdmF0ZSBkZWxldGVSZXBsYXlzQXNGbGF0dGVuaW5nKHNlZ21lbnRzOiBzdHJpbmdbXSk6IGJvb2xlYW4ge1xuICAgIGlmIChzZWdtZW50cy5sZW5ndGggPT09IDEpIHJldHVybiB0cnVlOyAvLyBwYXJlbnQgaXMgdGhlIHN0YXRlIHJvb3Qg4oCUIGFsd2F5cyBhIGNvbnRhaW5lclxuICAgIGNvbnN0IHBhcmVudCA9IF9nZXQodGhpcy5iYXNlU25hcHNob3QsIHNlZ21lbnRzLnNsaWNlKDAsIC0xKSk7XG4gICAgcmV0dXJuIHBhcmVudCAhPT0gbnVsbCAmJiB0eXBlb2YgcGFyZW50ID09PSAnb2JqZWN0JztcbiAgfVxufVxuXG4vKipcbiAqIEhpc3RvcmljYWwgZmxhdHRlbmluZyBmb3IgdGhlIGAnZnVsbCdgIHBheWxvYWQ6IGFuIGV4cGxpY2l0IGRlbGV0ZSBjb21taXRzXG4gKiBhcyBzZXQtb2YtdW5kZWZpbmVkLiBQZXItd3JpdGUgcHJvdmVuYW5jZSAoI1AxKSByaWRlcyBlYWNoIHN1cnZpdmluZyBlbnRyeVxuICogdW50b3VjaGVkLlxuICovXG5mdW5jdGlvbiBmbGF0dGVuZWRUcmFjZVJvdyhvcDogeyBwYXRoOiBzdHJpbmc7IHZlcmI6IE9wVmVyYjsgcmVhZEtleXM/OiBzdHJpbmdbXSB9KTogVHJhY2VFbnRyeSB7XG4gIHJldHVybiBvcC52ZXJiID09PSAnZGVsZXRlJ1xuICAgID8geyBwYXRoOiBvcC5wYXRoLCB2ZXJiOiAnc2V0JyBhcyBjb25zdCwgLi4uKG9wLnJlYWRLZXlzICE9PSB1bmRlZmluZWQgJiYgeyByZWFkS2V5czogb3AucmVhZEtleXMgfSkgfVxuICAgIDogb3A7XG59XG5cbi8qKiBBIHJvdydzIGByZWFkS2V5c2AgZnJhZ21lbnQg4oCUIGFic2VudCB1bmxlc3MgdGhlIHByb3ZlbmFuY2UgZGlhbCByZWNvcmRlZCBvbmUgKCNQMSkuICovXG5mdW5jdGlvbiBwcm92ZW5hbmNlKHJlYWRLZXlzOiBzdHJpbmdbXSB8IHVuZGVmaW5lZCk6IHsgcmVhZEtleXM6IHN0cmluZ1tdIH0gfCB1bmRlZmluZWQge1xuICByZXR1cm4gcmVhZEtleXMgIT09IHVuZGVmaW5lZCA/IHsgcmVhZEtleXMgfSA6IHVuZGVmaW5lZDtcbn1cbiJdfQ==
|
|
946
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVHJhbnNhY3Rpb25CdWZmZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL21lbW9yeS9UcmFuc2FjdGlvbkJ1ZmZlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBK0RHO0FBRUgsT0FBTyxFQUFtRCxjQUFjLEVBQUUsYUFBYSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDaEgsT0FBTyxFQUE4QixpQkFBaUIsRUFBRSxpQkFBaUIsRUFBRSxZQUFZLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNwSCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sRUFDTCxLQUFLLEVBQ0wsV0FBVyxFQUNYLFNBQVMsSUFBSSxJQUFJLEVBQ2pCLFNBQVMsSUFBSSxJQUFJLEVBQ2pCLEdBQUcsRUFDSCxRQUFRLEVBQ1IsV0FBVyxFQUNYLFFBQVEsRUFDUixXQUFXLEdBQ1osTUFBTSxjQUFjLENBQUM7QUFFdEIsT0FBTyxFQUFFLFNBQVMsRUFBRSxjQUFjLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFFdEYsTUFBTSxPQUFPLGlCQUFpQjtJQUM1Qjs7Ozs7T0FLRztJQUNLLFlBQVksQ0FBTTtJQUNsQixXQUFXLENBQU07SUFFakIsY0FBYyxHQUFnQixFQUFFLENBQUM7SUFDakMsV0FBVyxHQUFnQixFQUFFLENBQUM7SUFDOUIsT0FBTyxHQUEwRCxFQUFFLENBQUM7SUFDcEUsYUFBYSxHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7SUFDMUM7Ozs7Ozs7T0FPRztJQUNLLFFBQVEsR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO0lBQ3JDLDBFQUEwRTtJQUN6RCxZQUFZLENBQW1CO0lBRWhEOzs7K0VBRzJFO0lBQzFELGdCQUFnQixD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QUFHLENBQUMsRUFBRSxDQUFDLFFBQVEsS0FBSyxTQUFTLElBQUksRUFBRSxRQUFRLEVBQUUsRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDLEVBQUU7UUFDdEcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztBQUNULENBQUM7QUFFRCwwRkFBMEY7QUFDMUYsU0FBUyxVQUFVLENBQUMsUUFBOEI7SUFDaEQsT0FBTyxRQUFRLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7QUFDM0QsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVHJhbnNhY3Rpb25CdWZmZXIg4oCUIFBlci1zdGFnZSBTVEFHSU5HIGJ1ZmZlciBmb3Igc3RhdGUgbXV0YXRpb25zXG4gKlxuICogV2hhdCBpdCBJUzogYSBzdGFnaW5nIGJ1ZmZlciB3aXRoIHJlYWQteW91ci13cml0ZXMgYW5kIG5ldC1jaGFuZ2UgY29tbWl0cy5cbiAqIC0gQ2hhbmdlcyBhcmUgc3RhZ2VkIGhlcmUgZHVyaW5nIHN0YWdlIGV4ZWN1dGlvbiBhbmQgZmx1c2hlZCB0b1xuICogICBTaGFyZWRNZW1vcnkgaW4gT05FIGJhdGNoIHBlciBzdGFnZSAoYGNvbW1pdCgpYCkg4oCUIG90aGVyIHN0YWdlcyBhbmRcbiAqICAgcGFyYWxsZWwgc2libGluZ3MgbmV2ZXIgb2JzZXJ2ZSBhIHN0YWdlJ3MgaGFsZi1maW5pc2hlZCB3cml0ZXMuXG4gKiAtIFJlYWQtYWZ0ZXItd3JpdGUgY29uc2lzdGVuY3kgd2l0aGluIGEgc3RhZ2Ug4oCUIGEgc3RhZ2Ugc2VlcyBpdHMgb3duXG4gKiAgIHN0YWdlZCB3cml0ZXMgaW1tZWRpYXRlbHkuXG4gKiAtIGBjb21taXQoKWAgcmVjb3JkcyB0aGUgc3RhZ2UncyBORVQgY2hhbmdlIChzZWUge0BsaW5rIGNvbW1pdH0pLCBwbHVzIGFuXG4gKiAgIG9wZXJhdGlvbiB0cmFjZSBmb3IgZGV0ZXJtaW5pc3RpYyByZXBsYXkuXG4gKlxuICogV2hhdCBpdCBpcyBOT1Q6IGEgcm9sbGJhY2sgbWVjaGFuaXNtLiBEZXNwaXRlIHRoZSBuYW1lLCB0aGVyZSBpcyBub1xuICogYWJvcnQvcm9sbGJhY2sgcGF0aCDigJQgd2hlbiBhIHN0YWdlIFRIUk9XUywgdGhlIGVuZ2luZSBzdGlsbCBjb21taXRzXG4gKiBldmVyeXRoaW5nIHN0YWdlZCBzbyBmYXIgYmVmb3JlIHJlLXRocm93aW5nIChjb21taXQtb24tZXJyb3IgaW5cbiAqIGBGbG93Y2hhcnRUcmF2ZXJzZXJgKS4gVGhhdCBpcyBkZWxpYmVyYXRlOiB0aGUgYXVkaXQgdHJhaWwgbXVzdCByZWNvcmRcbiAqIHdoYXQgdGhlIGZhaWxpbmcgc3RhZ2UgY2hhbmdlZC4gRG8gbm90IHJlbHkgb24gXCJzdGFnZSBmYWlsZWQg4oaSIGl0c1xuICogd3JpdGVzIHZhbmlzaGVkXCIuXG4gKlxuICogVGhlIHBhdGNoIHRyZWVzIGhvbGQgUkVGRVJFTkNFUyB1bnRpbCBjb21taXQgKDkuMjMuMCkuIEEgYHNldGAgc3RvcmVzIHRoZVxuICogY2FsbGVyJ3Mgb3duIHZhbHVlIGluIGBvdmVyd3JpdGVQYXRjaGAgZXhhY3RseSBhcyBpdCBhbHdheXMgZGlkIGluXG4gKiBgd29ya2luZ0NvcHlgOyB0aGUgY29weSB0aGUgcmVjb3JkIG5lZWRzIGlzIHRha2VuIE9OQ0UgcGVyIHN1cnZpdmluZyBwYXRoXG4gKiB3aGVuIHRoZSBwYXlsb2FkIGxlYXZlcyB0aGUgYnVmZmVyIChgdG9DaGFuZ2VPbmx5UGF5bG9hZGAgL1xuICogYHRvRGVsdGFQYXlsb2FkYCDigJQgZXZlcnkgdmFsdWUgdGhleSBlbWl0IHBhc3NlcyB0aHJvdWdoIGBzdHJ1Y3R1cmVkQ2xvbmVgXG4gKiB0aGVyZSkuIFRoZSBsYXcgXCJ0aGUgcmVjb3JkIG5ldmVyIGFsaWFzZXMgYSBjYWxsZXIncyBvYmplY3RcIiBpcyBrZXB0IGF0XG4gKiB0aGUgY29tbWl0IGJvdW5kYXJ5IGluc3RlYWQgb2YgYXQgZXZlcnkgd3JpdGUsIHdoaWNoIGlzIHdoYXQgbWFrZXMgTlxuICogd3JpdGVzIHRvIG9uZSBwYXRoIE8oTikgaW5zdGVhZCBvZiBPKE4gw5cgc2l6ZSkuIENvbnNlcXVlbmNlLCBieSBkZXNpZ246IGFcbiAqIGNhbGxlciB3aG8gbXV0YXRlcyBpdHMgb3duIG9iamVjdCBBRlRFUiB0aGUgd3JpdGUgYW5kIEJFRk9SRSB0aGUgc3RhZ2VcbiAqIGVuZHMgY29tbWl0cyB0aGUgdmFsdWUgYXMgdGhlIHN0YWdlIHJlYWQgaXQgYmFjayDigJQgdGhlIHJlY29yZCBhZ3JlZXMgd2l0aFxuICogdGhlIHN0YWdlIChDTEFVREUubWQgbGFuZG1pbmUgMydzIGZpcnN0IGJpdGUsIGNsb3NlZCkuIFRoZSBvbmUgcGxhY2UgdGhlXG4gKiBlbmdpbmUgaXRzZWxmIGVkaXRzIFRIUk9VR0ggYSBzdGFnZWQgdmFsdWUg4oCUIGEgbGF0ZXIgbmVzdGVkIG9wIHVuZGVyIGFcbiAqIGBzZXRgIHBhdGgg4oCUIGRldGFjaGVzIHRoYXQgdmFsdWUgZmlyc3QgKHtAbGluayBkZXRhY2hIZWxkQW5jZXN0b3JzfSksIHNvXG4gKiBgd29ya2luZ0NvcHlgIGFuZCBgb3ZlcndyaXRlUGF0Y2hgIG5ldmVyIHNoYXJlIGEgY29udGFpbmVyIHRoZSBlbmdpbmVcbiAqIG11dGF0ZXMgb24gb25lIHNpZGUgb25seS5cbiAqXG4gKiBDT1BZLU9OLVdSSVRFICg5LjI5LjAg4oCUIGRvY3MvZGVzaWduLzIwMjYtMTAtY29weS1vbi13cml0ZS1jb21taXQubWQpLiBUaGVcbiAqIGJ1ZmZlciBubyBsb25nZXIgY2xvbmVzIHRoZSBjb21taXR0ZWQgc3RhdGUgaXQgc3RhcnRzIGZyb20uIGBiYXNlU25hcHNob3RgXG4gKiBJUyB0aGUgY29tbWl0dGVkIGdlbmVyYXRpb24gdGhlIHN0YWdlIGZpcnN0IHRvdWNoZWQgKGhlbGQgYnkgcmVmZXJlbmNlIOKAlFxuICogY29tbWl0dGVkIHN0YXRlIGlzIGltbXV0YWJsZS1hZnRlci1zd2FwKSwgYW5kIGB3b3JraW5nQ29weWAgc3RhcnRzIGFzIGFcbiAqIGNvcHkgb2YgaXRzIFJPT1Qgb25seTogZWFjaCB3cml0ZSBjb3BpZXMgdGhlIGNvbnRhaW5lcnMgb24gaXRzIG93biBwYXRoXG4gKiAoe0BsaW5rIG93blNwaW5lfSksIGFuZCB0aGUgZmlyc3QgUkVBRCBhZnRlciB0aGUgc3RhZ2UncyBmaXJzdCB3cml0ZSBvZiBhXG4gKiBjb250YWluZXIgc3RpbGwgc2hhcmVkIHdpdGggY29tbWl0dGVkIHN0YXRlIHRha2VzIGEgcHJpdmF0ZSBkZWVwIGNvcHkgb2ZcbiAqIGl0ICh7QGxpbmsgcHJpdmF0aXNlfSkg4oCUIHdoYXQgdGhlIHdob2xlLXN0YXRlIGNsb25lIHVzZWQgdG8gZ2l2ZSBldmVyeVxuICogcmVhZCwgc28gYW4gaW4tcGxhY2UgZWRpdCBvZiBhIHJlYWQgdmFsdWUgc3RheXMgcHJpdmF0ZSBleGFjdGx5IGFzIGl0IGRpZC5cbiAqIEEgcmVhZCB0aGUgd29ya2luZyBjb3B5IGNhbm5vdCBhbnN3ZXIgaXMgc2VydmVkIGZyb20gbGl2ZSBzdGF0ZSBieSB0aGVcbiAqIGNhbGxlciwgYXMgYmVmb3JlOyB0aGUgYnVmZmVyIHRoZW4gcmVwbGFjZXMgdGhhdCBwYXRoIG9mIGl0cyBkaWZmIGJhc2VcbiAqIHdpdGggYSBwcml2YXRlIGNvcHkgKHtAbGluayBkZXRhY2hCYXNlfSksIGFzIHRoZSBjbG9uZSBoYWQgaXQuXG4gKlxuICogVEhFIEFETUlUVEVEIFJFQ09SRCAoOS4zMC4wIOKAlCBkb2NzL2Rlc2lnbi8yMDI2LTEwLWFkbWl0dGVkLXJlY29yZC5tZCkuIEFcbiAqIGNvbW1pdCBpcyBhZG1pdHRlZCBvbmx5IGlmIGl0cyBidW5kbGUgZm9sZHMgYmFjayB0byB0aGUgc3RhZ2Unc1xuICogcmVhZC15b3VyLXdyaXRlcyB2aWV3IGF0IGV2ZXJ5IHBhdGggdGhlIHN0YWdlIHRvdWNoZWQgKGFuZCBhdCBldmVyeVxuICogY29udGFpbmVyIGl0cyB3cml0ZXMgY3JlYXRlZCBvbiB0aGUgd2F5IHRoZXJlLCBiZWxvdyB0aGUgc3RhZ2UncyBhZGRyZXNzKS5cbiAqIEJvdGggZW5jb2RlcnMgY29tbWl0IHRoZSB2YWx1ZSB0aGUgc3RhZ2UgcmVhZDogYSBjb21wYWN0IHJvdyDigJQgYSBgbWVyZ2VgXG4gKiBkZWx0YSwgYW4gYGFwcGVuZGAgdGFpbCDigJQgaXMga2VwdCB3aGVyZSBpdCBwcm92YWJseSBmb2xkcyBiYWNrOyBhIGZhbWlseSBvZlxuICogcm93cyB0aGF0IGRvZXMgbm90IGlzIHJlY29yZGVkIGFzIGBzZXRgIHJvd3Mgb2YgdGhlIHZhbHVlcyB0aGUgc3RhZ2UgcmVhZFxuICogKHtAbGluayBhZG1pdH0pLiBCZWZvcmUgOS4zMC4wIHRoZSBvbmUgYWNjdW11bGF0ZWQgbWVyZ2UgZGVsdGEgcGVyIHBhdGggd2FzXG4gKiByZXBsYXllZCBhdCBldmVyeSBgbWVyZ2VgIHJvdyBvZiB0aGF0IHBhdGgsIHdoaWNoIGxpZWQgYWNyb3NzIGEgaGFyZCB3cml0ZVxuICogKGAkdXBkYXRlKGsse3h9KTsgayA9IHt5fTsgJHVwZGF0ZShrLHt6fSlgIGNvbW1pdHRlZCBge3ksIHgsIHp9YCBmb3IgYVxuICogcmVhZC1iYWNrIG9mIGB7eSwgen1gKSwgYW4gYFtdYCBjbGVhciwgYSBraW5kIGNoYW5nZSBvciBhbiBhcnJheSB1bmlvblxuICogZGVkdXBsaWNhdGVkIGJ5IHJlZmVyZW5jZS4gVmVyaWZpZWQgd2hlbiB0aGUgc3RhZ2Ugc3RhZ2VkIGEgYG1lcmdlYCBvciBhXG4gKiBuZXN0ZWQgb3A7IGEgc3RhZ2UgdGhhdCBzdGFnZWQgb25seSBgc2V0YCAvIGBkZWxldGVgIG9mIGtleXMgZGlyZWN0bHkgdW5kZXJcbiAqIGl0cyBhZGRyZXNzIGlzIGNvaGVyZW50IGJ5IGNvbnN0cnVjdGlvbiDigJQgYm90aCB0cmVlcyByZWNlaXZlIHRoZSBzYW1lXG4gKiB3cml0ZSDigJQgYW5kIGlzIGFkbWl0dGVkIHdpdGhvdXQgdGhlIGZvbGQuXG4gKi9cblxuaW1wb3J0IHsgdHlwZSBGYW1pbHksIHR5cGUgTG9zc3ksIHR5cGUgTWVtYmVyLCB0eXBlIFJvd3MsIGFkZHJlc3NEZXB0aE9mLCBsb3NzeUZhbWlsaWVzIH0gZnJvbSAnLi9hZG1pc3Npb24uanMnO1xuaW1wb3J0IHsgdHlwZSBPcFZlcmIsIHR5cGUgU3Vydml2b3IsIGVtaXRJbkZhbWlseU9yZGVyLCBncm91cEludG9GYW1pbGllcywgcHVzaFZhbHVlUm93IH0gZnJvbSAnLi9kZWx0YUVuY29kaW5nLmpzJztcbmltcG9ydCB7IHJlbGF0aW9uIH0gZnJvbSAnLi9rZXlQYXRocy5qcyc7XG5pbXBvcnQge1xuICBhZG9wdCxcbiAgaXNDb250YWluZXIsXG4gIG5hdGl2ZUdldCBhcyBfZ2V0LFxuICBuYXRpdmVTZXQgYXMgX3NldCxcbiAgb3duLFxuICBvd25DaGlsZCxcbiAgb3duZWRSb290T2YsXG4gIG93blNwaW5lLFxuICBzaGFsbG93Q29weSxcbn0gZnJvbSAnLi9wYXRoT3BzLmpzJztcbmltcG9ydCB0eXBlIHsgQ29tbWl0VmFsdWVzTW9kZSwgTWVtb3J5UGF0Y2gsIFRyYWNlRW50cnkgfSBmcm9tICcuL3R5cGVzLmpzJztcbmltcG9ydCB7IGRlZXBFcXVhbCwgZGVlcFNtYXJ0TWVyZ2UsIERFTElNLCBkcnlGb2xkLCBub3JtYWxpc2VQYXRoIH0gZnJvbSAnLi91dGlscy5qcyc7XG5cbmV4cG9ydCBjbGFzcyBUcmFuc2FjdGlvbkJ1ZmZlciB7XG4gIC8qKlxuICAgKiBUaGUgbmV0LWNoYW5nZSBkaWZmIGJhc2U6IHRoZSBjb21taXR0ZWQgZ2VuZXJhdGlvbiB0aGUgc3RhZ2UgZmlyc3RcbiAgICogdG91Y2hlZCwgYnkgcmVmZXJlbmNlIOKAlCBleGNlcHQgd2hlcmUge0BsaW5rIGRldGFjaEJhc2V9IHJlcGxhY2VkIGEgcGF0aFxuICAgKiBvZiBpdCB3aXRoIGEgcHJpdmF0ZSBjb3B5IChpdHMgcm9vdCBhbmQgdGhlIGNvbnRhaW5lcnMgb24gdGhlIHdheSBhcmVcbiAgICogdGhlbiBjb3BpZXMgdG9vLCBvd25lZCBieSB7QGxpbmsgYmFzZU93bmVkfSkuXG4gICAqL1xuICBwcml2YXRlIGJhc2VTbmFwc2hvdDogYW55O1xuICBwcml2YXRlIHdvcmtpbmdDb3B5OiBhbnk7XG5cbiAgcHJpdmF0ZSBvdmVyd3JpdGVQYXRjaDogTWVtb3J5UGF0Y2ggPSB7fTtcbiAgcHJpdmF0ZSB1cGRhdGVQYXRjaDogTWVtb3J5UGF0Y2ggPSB7fTtcbiAgcHJpdmF0ZSBvcFRyYWNlOiB7IHBhdGg6IHN0cmluZzsgdmVyYjogT3BWZXJiOyByZWFkS2V5cz86IHN0cmluZ1tdIH1bXSA9IFtdO1xuICBwcml2YXRlIHJlZGFjdGVkUGF0aHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgLyoqXG4gICAqIFBhdGhzIHdob3NlIGBvdmVyd3JpdGVQYXRjaGAgdmFsdWUgaXMgdGhlIGNhbGxlcidzIG93biBvYmplY3QgKDkuMjMuMCk6XG4gICAqIGEgYHNldGAgb2YgYSBjb250YWluZXIgc3RvcmVzIHRoZSByZWZlcmVuY2UsIGFuZCB0aGlzIGlzIHRoZSBsZWRnZXIgb2ZcbiAgICogd2hpY2ggb25lcyBhcmUgc3RpbGwgc2hhcmVkIHdpdGggdGhlIGNhbGxlciAoYW5kIHdpdGggYHdvcmtpbmdDb3B5YCkuXG4gICAqIENvbnN1bHRlZCBvbmx5IGJ5IHRoZSBlbmdpbmUncyBuZXN0ZWQgb3BzIOKAlCBzZWVcbiAgICoge0BsaW5rIGRldGFjaEhlbGRBbmNlc3RvcnN9OyB0aGUgY29tbWl0IHBheWxvYWQgY2xvbmVzIGV2ZXJ5IHN1cnZpdmluZ1xuICAgKiB2YWx1ZSBhbnl3YXkgYW5kIG5ldmVyIGFza3MuIENsZWFyZWQgd2l0aCB0aGUgcmVzdCBhdCBgY29tbWl0KClgLlxuICAgKi9cbiAgcHJpdmF0ZSBoZWxkUmVmcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAvKiogQ29tbWl0LXZhbHVlIGVuY29kaW5nIHBvbGljeSAoIzEzYy1CKS4gYCdmdWxsJ2AgPSBoaXN0b3JpY2FsIGJ5dGVzLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGNvbW1pdFZhbHVlczogQ29tbWl0VmFsdWVzTW9kZTtcblxuICAvKiogUGVyLXdyaXRlIHJlYWQtcHJvdmVuYW5jZSBzb3VyY2UgKCNQMSkuIFdoZW4gc2V0ICh0aGVcbiAgICogIGB3cml0ZVByb3ZlbmFuY2U6ICdyZWFkcy1wcmVmaXgnYCBkaWFsKSwgZXZlcnkgc3RhZ2VkIG9wIHNuYXBzaG90cyB0aGVcbiAgICogIGtleXMgdHJhY2tlZC1yZWFkIHNvIGZhciDigJQgdGhlIHRlbXBvcmFsLXByZWZpeCBhdHRyaWJ1dGlvbiBjb25zdW1lZCBieVxuICAgKiAgY2F1c2FsIHNsaWNpbmcuIFVuZGVmaW5lZCAoZGVmYXVsdCkgPSB6ZXJvIGNvc3QsIGJ5dGUtaWRlbnRpY2FsIG9wcy4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSByZWFkS2V5c1Byb3ZpZGVyPzogKCkgPT4gc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIFRoZSBjb250YWluZXJzIGluIGB3b3JraW5nQ29weWAgdGhpcyBidWZmZXIgQ1JFQVRFRDogaXRzIHJvb3QgY29weSwgdGhlXG4gICAqIHBhdGggY29waWVzIGl0cyB3cml0ZXMgbWFkZSwgdGhlIG1lcmdlIHJlc3VsdHMgaXQgYnVpbHQsIGFuZCBldmVyeVxuICAgKiBjb250YWluZXIgb2YgdGhlIHByaXZhdGUgY29waWVzIGl0cyByZWFkcyB0b29rLiBBIHdyaXRlIGVkaXRzIHRoZXNlIGluXG4gICAqIHBsYWNlLiBFdmVyeXRoaW5nIGVsc2UgaW4gYHdvcmtpbmdDb3B5YCBpcyBTSEFSRUQg4oCUIHdpdGggdGhlIGNvbW1pdHRlZFxuICAgKiBnZW5lcmF0aW9uIHRoZSBzdGFnZSBmaXJzdCB0b3VjaGVkLCBvciB3aXRoIGEgdmFsdWUgdGhlIHN0YWdlIHN0YWdlZCDigJRcbiAgICogYW5kIGlzIGNvcGllZCBiZWZvcmUgYSB3cml0ZSBwYXNzZXMgdGhyb3VnaCBpdCAoe0BsaW5rIG93blNwaW5lfSkuXG4gICAqL1xuICBwcml2YXRlIG93bmVkID0gbmV3IFdlYWtTZXQ8b2JqZWN0PigpO1xuXG4gIC8qKlxuICAgKiBDb250YWluZXIgdmFsdWVzIHRoZSBzdGFnZSBzdGFnZWQgd2l0aCB7QGxpbmsgc2V0fSDigJQgaXRzIG93biBvYmplY3RzLFxuICAgKiBoZWxkIGJ5IHJlZmVyZW5jZSAoOS4yMy4wKS4gQSByZWFkIGhhbmRzIHRoZW0gYmFjayBhcyB0aGV5IGFyZSwgZXhhY3RseVxuICAgKiBhcyB0aGUgcHJpdmF0ZSB3b3JraW5nIGNvcHkgYWx3YXlzIGRpZCwgYW5kIG5ldmVyIHByaXZhdGlzZXMgdGhlbTogYVxuICAgKiBwcml2YXRlIGNvcHkgb2YgYSBzdGFnZWQgdmFsdWUgd291bGQgbGVhdmUgYHdvcmtpbmdDb3B5YCBhbmRcbiAgICogYG92ZXJ3cml0ZVBhdGNoYCBkaXNhZ3JlZWluZyBhYm91dCBhIHZhbHVlIHRoZSBzdGFnZSB3cm90ZS5cbiAgICovXG4gIHByaXZhdGUgc3RhZ2VkID0gbmV3IFdlYWtTZXQ8b2JqZWN0PigpO1xuXG4gIC8qKlxuICAgKiBPd25lZCBjb250YWluZXJzIHdpdGggbm8gY29udGFpbmVyIHN0aWxsIHNoYXJlZCB3aXRoIGNvbW1pdHRlZCBzdGF0ZVxuICAgKiBhbnl3aGVyZSBiZWxvdyB0aGVtIChhIHByaXZhdGUgZGVlcCBjb3B5LCBhIG1lcmdlIHJlc3VsdCBidWlsdCBvbiBhXG4gICAqIHByaXZhdGUgYmFzZSwgYSBwYXRoIGNvcHkgd2hvc2Ugc2hhcmVkIGNoaWxkcmVuIHdlcmUgcHJpdmF0aXNlZCkuIEEgcmVhZFxuICAgKiB0aGF0IGxhbmRzIG9uIG9uZSBuZWVkcyBubyB3YWxrIOKAlCBzZWUge0BsaW5rIHByaXZhdGlzZUJlbG93fS5cbiAgICovXG4gIHByaXZhdGUgcHJpdmF0ZVRyZWVzID0gbmV3IFdlYWtTZXQ8b2JqZWN0PigpO1xuXG4gIC8qKlxuICAgKiBUaGUgY29udGFpbmVycyBvZiB7QGxpbmsgYmFzZVNuYXBzaG90fSB0aGF0IHtAbGluayBkZXRhY2hCYXNlfSBjcmVhdGVkOlxuICAgKiBpdHMgcm9vdCBjb3B5IGFuZCB0aGUgY29waWVzIG9uIHRoZSB3YXkgdG8gYSBkZXRhY2hlZCBwYXRoLiBBbGxvY2F0ZWRcbiAgICogb25seSBieSB0aGUgZmlyc3QgZGV0YWNoIOKAlCB0aGUgaW4tY29udHJhY3Qgc3RhZ2UgbmV2ZXIgcGF5cyBmb3IgaXQuXG4gICAqL1xuICBwcml2YXRlIGJhc2VPd25lZD86IFdlYWtTZXQ8b2JqZWN0PjtcblxuICAvKipcbiAgICogVGhlIHByaXZhdGUgZGVlcCBjb3BpZXMge0BsaW5rIGRldGFjaEJhc2V9IHB1dCBpbnRvIHRoZSBkaWZmIGJhc2U6IG5vdGhpbmdcbiAgICogYXQgb3IgYmVsb3cgb25lIGlzIGNvbW1pdHRlZCBzdGF0ZSwgc28gYSBsYXRlciBkZXRhY2ggaW5zaWRlIGl0IGlzIGEgbm8tb3AuXG4gICAqL1xuICBwcml2YXRlIGRldGFjaGVkQmFzZT86IFdlYWtTZXQ8b2JqZWN0PjtcblxuICAvKipcbiAgICogV2hlcmUgdGhlIHN0YWdlIHdyaXRlcyAoOS4zMC4wKTogYSBwYXRoIHByZWZpeCBpdHMgZnJhbWUgY29tcHV0ZWQgYW5kXG4gICAqIGhhbmRzIG92ZXIgYXMgZGF0YSAoQzIg4oCUIGZvciB0aGUgZW5naW5lLCB0aGUgZnJhbWUncyBydW4gbmFtZXNwYWNlLCBvclxuICAgKiBgW11gIGZvciB0aGUgcm9vdCkuIEl0cyBjb250YWluZXJzIGFyZSB0aGUgc3RhZ2UncyBBRERSRVNTLCBub3QgYSB2YWx1ZVxuICAgKiB0aGUgc3RhZ2UgcmVhZHMgKGV2ZXJ5IHJlYWQgaXQgbWFrZXMgaXMgYSBrZXkgYmVsb3cgaXQpLCBzbyBhIHNoZWxsIGFcbiAgICogd3JpdGUgbGVhdmVzIHRoZXJlIGlzIG5vIHBhcnQgb2YgdGhlIHJlYWQtYmFjayB0aGUgcmVjb3JkIG11c3QgaG9sZC5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgYWRkcmVzczogcmVhZG9ubHkgc3RyaW5nW107XG5cbiAgLyoqIGBtZXJnZWAgb3BzIHN0YWdlZCBzaW5jZSB0aGUgbGFzdCBjb21taXQg4oCUIHNlZSB7QGxpbmsgYWRtaXR9LiAqL1xuICBwcml2YXRlIHN0YWdlZE1lcmdlcyA9IDA7XG4gIC8qKiBPcHMgc3RhZ2VkIGRlZXBlciB0aGFuIG9uZSBrZXkgYmVsb3cgdGhlIHN0YWdlJ3MgYWRkcmVzcyDigJQgc2VlIHtAbGluayBhZG1pdH0uICovXG4gIHByaXZhdGUgbmVzdGVkT3BzID0gMDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBiYXNlOiBhbnksXG4gICAgY29tbWl0VmFsdWVzOiBDb21taXRWYWx1ZXNNb2RlID0gJ2Z1bGwnLFxuICAgIHJlYWRLZXlzUHJvdmlkZXI/OiAoKSA9PiBzdHJpbmdbXSxcbiAgICBhZGRyZXNzOiByZWFkb25seSBzdHJpbmdbXSA9IFtdLFxuICApIHtcbiAgICAvLyBgYmFzZWAgaXMgdGhlIGNvbW1pdHRlZCBnZW5lcmF0aW9uIHRoZSBzdGFnZSBmaXJzdCB0b3VjaGVkIOKAlFxuICAgIC8vIGltbXV0YWJsZS1hZnRlci1zd2FwLCB0aGUgaW52YXJpYW50IHRoZSBmaXJzdC10b3VjaCB2aWV3IGFscmVhZHkgcmVzdHNcbiAgICAvLyBvbiDigJQgc28gdGhlIGRpZmYgYmFzZSBpcyBoZWxkIGJ5IFJFRkVSRU5DRSwgYW5kIHRoZSB3b3JraW5nIGNvcHkgc3RhcnRzXG4gICAgLy8gYXMgYSBjb3B5IG9mIGl0cyBST09UIG9ubHkuIEJlZm9yZSA5LjI5LjAgdGhlc2UgdHdvIGxpbmVzIHdlcmUgdHdvXG4gICAgLy8gYHN0cnVjdHVyZWRDbG9uZWBzIG9mIHRoZSB3aG9sZSBzdGF0ZSwgcGFpZCBieSBldmVyeSBzdGFnZSB0aGF0IHdyb3RlLlxuICAgIHRoaXMuYmFzZVNuYXBzaG90ID0gYmFzZTtcbiAgICB0aGlzLndvcmtpbmdDb3B5ID0gb3duZWRSb290T2YoYmFzZSwgdGhpcy5vd25lZCk7XG4gICAgdGhpcy5jb21taXRWYWx1ZXMgPSBjb21taXRWYWx1ZXM7XG4gICAgdGhpcy5yZWFkS2V5c1Byb3ZpZGVyID0gcmVhZEtleXNQcm92aWRlcjtcbiAgICB0aGlzLmFkZHJlc3MgPSBhZGRyZXNzO1xuICB9XG5cbiAgLyoqIFN0YW1wIHRoZSBjdXJyZW50IHJlYWQgcHJlZml4IG9udG8gYSBzdGFnZWQgb3Ag4oCUIG9ubHkgd2hlbiB0aGVcbiAgICogIHByb3ZlbmFuY2UgZGlhbCBpcyBvbiAocHJvdmlkZXIgcHJlc2VudCksIHNvIHRoZSBkZWZhdWx0IHBhdGggYWxsb2NhdGVzXG4gICAqICBub3RoaW5nIGFuZCBjb21taXQgYnVuZGxlcyBzdGF5IGJ5dGUtaWRlbnRpY2FsLiAqL1xuICBwcml2YXRlIHN0YW1wUmVhZEtleXMob3A6IHsgcGF0aDogc3RyaW5nOyB2ZXJiOiBPcFZlcmI7IHJlYWRLZXlzPzogc3RyaW5nW10gfSk6IHR5cGVvZiBvcCB7XG4gICAgaWYgKHRoaXMucmVhZEtleXNQcm92aWRlcikgb3AucmVhZEtleXMgPSB0aGlzLnJlYWRLZXlzUHJvdmlkZXIoKTtcbiAgICByZXR1cm4gb3A7XG4gIH1cblxuICAvKiogU3RhZ2UgYW4gb3AgaW50byBgb3BUcmFjZWAsIGNvdW50aW5nIHdoYXQgZGVjaWRlcyB3aGV0aGVyIHtAbGluayBhZG1pdH0gbXVzdCBmb2xkLiAqL1xuICBwcml2YXRlIHN0YWdlKHBhdGg6IChzdHJpbmcgfCBudW1iZXIpW10sIGtleTogc3RyaW5nLCB2ZXJiOiBPcFZlcmIpOiB2b2lkIHtcbiAgICBpZiAodmVyYiA9PT0gJ21lcmdlJykgdGhpcy5zdGFnZWRNZXJnZXMrKztcbiAgICBpZiAocGF0aC5sZW5ndGggLSBhZGRyZXNzRGVwdGhPZihwYXRoLCB0aGlzLmFkZHJlc3MpID4gMSkgdGhpcy5uZXN0ZWRPcHMrKztcbiAgICB0aGlzLm9wVHJhY2UucHVzaCh0aGlzLnN0YW1wUmVhZEtleXMoeyBwYXRoOiBrZXksIHZlcmIgfSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhcmQgb3ZlcndyaXRlIGF0IHRoZSBzcGVjaWZpZWQgcGF0aC4gU3RvcmVzIHRoZSBSRUZFUkVOQ0UgaW4gYm90aCB0cmVlc1xuICAgKiAoOS4yMy4wKSDigJQgdGhlIHJlY29yZCdzIGNvcHkgaXMgdGFrZW4gb25jZSwgYXQgY29tbWl0OyBzZWUgdGhlIGhlYWRlci5cbiAgICovXG4gIHNldChwYXRoOiAoc3RyaW5nIHwgbnVtYmVyKVtdLCB2YWx1ZTogYW55LCBzaG91bGRSZWRhY3QgPSBmYWxzZSk6IHZvaWQge1xuICAgIGNvbnN0IGtleSA9IG5vcm1hbGlzZVBhdGgocGF0aCk7XG4gICAgdGhpcy5kZXRhY2hIZWxkQW5jZXN0b3JzKHBhdGgpO1xuICAgIG93blNwaW5lKHRoaXMud29ya2luZ0NvcHksIHBhdGgsIHRoaXMub3duZWQpO1xuICAgIF9zZXQodGhpcy53b3JraW5nQ29weSwgcGF0aCwgdmFsdWUpO1xuICAgIF9zZXQodGhpcy5vdmVyd3JpdGVQYXRjaCwgcGF0aCwgdmFsdWUpO1xuICAgIGlmIChpc0NvbnRhaW5lcih2YWx1ZSkpIHtcbiAgICAgIHRoaXMuaGVsZFJlZnMuYWRkKGtleSk7XG4gICAgICB0aGlzLnN0YWdlZC5hZGQodmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmhlbGRSZWZzLmRlbGV0ZShrZXkpO1xuICAgIH1cbiAgICBpZiAoc2hvdWxkUmVkYWN0KSB7XG4gICAgICB0aGlzLnJlZGFjdGVkUGF0aHMuYWRkKGtleSk7XG4gICAgfVxuICAgIHRoaXMuc3RhZ2UocGF0aCwga2V5LCAnc2V0Jyk7XG4gIH1cblxuICAvKipcbiAgICogQSBuZXN0ZWQgb3AgaXMgYWJvdXQgdG8gd3JpdGUgVEhST1VHSCBhIHBhdGggd2hvc2UgYG92ZXJ3cml0ZVBhdGNoYFxuICAgKiB2YWx1ZSBpcyBhIGhlbGQgcmVmZXJlbmNlICg5LjIzLjApLiBUb2RheSdzIGxhdyBpcyB0aGF0IHRoZSB0d28gdHJlZXNcbiAgICogcmVjZWl2ZSB0aGUgc2FtZSBuZXN0ZWQgYHNldGAvYGRlbGV0ZWAgbXV0YXRpb25zIGJ1dCBPTkxZIGB3b3JraW5nQ29weWBcbiAgICogcmVjZWl2ZXMgYSBuZXN0ZWQgYG1lcmdlYCdzIHJlc3VsdCAoYHVwZGF0ZVBhdGNoYCBnZXRzIHRoZSBkZWx0YSkg4oCUIHNvIGFcbiAgICogY29udGFpbmVyIHNoYXJlZCBiZXR3ZWVuIHRoZSB0cmVlcyB3b3VsZCBsZWFrIHRoZSBtZXJnZWQgdmFsdWUgaW50byB0aGVcbiAgICogb3ZlcndyaXRlIHBheWxvYWQsIGFuZCBhIHNoYXJlZCBjb250YWluZXIgaXMgYWxzbyB0aGUgY2FsbGVyJ3Mgb3duXG4gICAqIG9iamVjdCwgd2hpY2ggdGhlIGVuZ2luZSBtdXN0IG5vdCBlZGl0IG9uIHRoZSByZWNvcmQncyBiZWhhbGYuIFJlcGxhY2luZ1xuICAgKiB0aGUgaGVsZCBhbmNlc3RvciB3aXRoIGl0cyBjbG9uZSBpbiBgb3ZlcndyaXRlUGF0Y2hgIHJlc3RvcmVzIGV4YWN0bHlcbiAgICogdGhlIHByaXZhdGUgdHJlZSB0aGUgcGVyLXdyaXRlIGNsb25lIHVzZWQgdG8gZ2l2ZSBpdCwgcGFpZCBvbmNlIHBlclxuICAgKiBhbmNlc3RvciBhbmQgb25seSBvbiB0aGUgbmVzdGVkLW9wIHBhdGggdGhlIHB1YmxpYyBzdXJmYWNlIG5ldmVyIHRha2VzXG4gICAqICh0aGUgc2NvcGUgcHJveHkgd3JpdGVzIFJPT1Qga2V5cykuIGB3b3JraW5nQ29weWAga2VlcHMgdGhlIHJlZmVyZW5jZSxcbiAgICogYXMgaXQgYWx3YXlzIGRpZC5cbiAgICovXG4gIHByaXZhdGUgZGV0YWNoSGVsZEFuY2VzdG9ycyhwYXRoOiAoc3RyaW5nIHwgbnVtYmVyKVtdKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaGVsZFJlZnMuc2l6ZSA9PT0gMCkgcmV0dXJuO1xuICAgIGZvciAobGV0IGkgPSAxOyBpIDwgcGF0aC5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgYW5jZXN0b3IgPSBwYXRoLnNsaWNlKDAsIGkpO1xuICAgICAgY29uc3Qga2V5ID0gbm9ybWFsaXNlUGF0aChhbmNlc3Rvcik7XG4gICAgICBpZiAoIXRoaXMuaGVsZFJlZnMuaGFzKGtleSkpIGNvbnRpbnVlO1xuICAgICAgY29uc3QgaGVsZCA9IF9nZXQodGhpcy5vdmVyd3JpdGVQYXRjaCwgYW5jZXN0b3IpO1xuICAgICAgaWYgKGhlbGQgIT09IG51bGwgJiYgdHlwZW9mIGhlbGQgPT09ICdvYmplY3QnKSBfc2V0KHRoaXMub3ZlcndyaXRlUGF0Y2gsIGFuY2VzdG9yLCBzdHJ1Y3R1cmVkQ2xvbmUoaGVsZCkpO1xuICAgICAgdGhpcy5oZWxkUmVmcy5kZWxldGUoa2V5KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRXhwbGljaXQga2V5IGRlbGV0aW9uIGF0IHRoZSBzcGVjaWZpZWQgcGF0aCAoIzEzYy1COyBhYnNvcmJzIGJhY2tsb2cgQjgpLlxuICAgKlxuICAgKiBTdGFnZXMgRVhBQ1RMWSB0aGUgc2FtZSBidWZmZXIgbXV0YXRpb25zIGFzIGBzZXQocGF0aCwgdW5kZWZpbmVkKWAg4oCUXG4gICAqIGB3b3JraW5nQ29weWAvYG92ZXJ3cml0ZVBhdGNoYCBnZXQgYW4gb3duIGB1bmRlZmluZWRgIGF0IHRoZSBwYXRoICh0aGVcbiAgICogaGlzdG9yaWNhbCBmbGF0dGVuaW5nLCBwcmVzZXJ2aW5nIHJlYWQgYmVoYXZpb3IgYW5kIHRoZSBkZWR1cCBkaWZmIGJhc2VcbiAgICogYWNyb3NzIG1vZGVzKSDigJQgYnV0IHJlY29yZHMgdGhlIG9wIHZlcmIgYXMgYCdkZWxldGUnYC4gQXQgY29tbWl0OlxuICAgKiBgJ2Z1bGwnYCBtb2RlIG1hcHMgaXQgYmFjayB0byBhIGAnc2V0J2AgdHJhY2UgZW50cnkgKGJ5dGUtaWRlbnRpY2FsIHRvXG4gICAqIHRvZGF5KTsgYCdkZWx0YSdgIG1vZGUgZW1pdHMgYSByZWFsIGAnZGVsZXRlJ2AgZW50cnkgd2hvc2UgcmVwbGF5XG4gICAqIFJFTU9WRVMgdGhlIGtleSBpbnN0ZWFkIG9mIGxlYXZpbmcgYGtleTogdW5kZWZpbmVkYCBiZWhpbmQuXG4gICAqXG4gICAqIFRoZSBuZXQtY2hhbmdlIGZpbHRlciByZWFkcyB0aGF0IHN0YWdlZCBvd24gYHVuZGVmaW5lZGAgYXMgQUJTRU5UXG4gICAqIChgZGVlcEVxdWFsYCwgOS4xOS4xKSDigJQgc28gdW5kZXIgYCdkZWx0YSdgLCB3aG9zZSBjb21taXR0ZWQgc3RhdGUgcmVhbGx5XG4gICAqIGxhY2tzIHRoZSBrZXksIGRlbGV0aW5nIGFuIGFic2VudCBrZXkgaW5zaWRlIGEgY29udGFpbmVyIHRoZSBzdGFnZSBhbHNvXG4gICAqIHJlLXdyb3RlIGlzIHRoZSBuby1vcCBpdCBpcywgbm90IGEgYHNldGAgb2YgdGhlIHdob2xlIGNvbnRhaW5lci5cbiAgICovXG4gIGRlbGV0ZShwYXRoOiAoc3RyaW5nIHwgbnVtYmVyKVtdLCBzaG91bGRSZWRhY3QgPSBmYWxzZSk6IHZvaWQge1xuICAgIGNvbnN0IGtleSA9IG5vcm1hbGlzZVBhdGgocGF0aCk7XG4gICAgdGhpcy5kZXRhY2hIZWxkQW5jZXN0b3JzKHBhdGgpO1xuICAgIG93blNwaW5lKHRoaXMud29ya2luZ0NvcHksIHBhdGgsIHRoaXMub3duZWQpO1xuICAgIF9zZXQodGhpcy53b3JraW5nQ29weSwgcGF0aCwgdW5kZWZpbmVkKTtcbiAgICBfc2V0KHRoaXMub3ZlcndyaXRlUGF0Y2gsIHBhdGgsIHVuZGVmaW5lZCk7XG4gICAgdGhpcy5oZWxkUmVmcy5kZWxldGUoa2V5KTtcbiAgICBpZiAoc2hvdWxkUmVkYWN0KSB7XG4gICAgICB0aGlzLnJlZGFjdGVkUGF0aHMuYWRkKGtleSk7XG4gICAgfVxuICAgIHRoaXMuc3RhZ2UocGF0aCwga2V5LCAnZGVsZXRlJyk7XG4gIH1cblxuICAvKiogRGVlcCB1bmlvbiBtZXJnZSBhdCB0aGUgc3BlY2lmaWVkIHBhdGguIGBkZWVwU21hcnRNZXJnZWAgYnVpbGRzIGZyZXNoXG4gICAqICBjb250YWluZXJzLCBzbyBuZWl0aGVyIHRyZWUgZXZlciBob2xkcyB0aGUgbWVyZ2UgSU5QVVQgYnkgcmVmZXJlbmNlO1xuICAgKiAgdGhlIG5lc3RlZC1vcCBkZXRhY2ggZ3VhcmRzIHRoZSBhbmNlc3RvciBpdCB3cml0ZXMgSU5UTy5cbiAgICpcbiAgICogIFRoZSB2YWx1ZSBtZXJnZWQgSU5UTyBpcyBtYWRlIHByaXZhdGUgZmlyc3QgKGBwcml2YXRpc2VgKSwgYXMgdGhlXG4gICAqICB3aG9sZS1zdGF0ZSBjbG9uZSBtYWRlIGl0IGJlZm9yZSA5LjI5LjAuIE5vdCBvbmx5IGZvciB0aGUgcmVhZHMgdGhhdFxuICAgKiAgZm9sbG93OiBgZGVlcFNtYXJ0TWVyZ2VgIHVuaW9ucyBhcnJheXMgQlkgUkVGRVJFTkNFLCBzbyB3aGV0aGVyIGFuXG4gICAqICBlbGVtZW50IHRoZSBzdGFnZSBwYXNzZXMgaW4gaXMgXCJhbHJlYWR5IHRoZXJlXCIgZGVwZW5kcyBvbiB3aGljaCBvYmplY3RzXG4gICAqICB0aGUgYmFzZSBob2xkcyDigJQgYSBjb21taXR0ZWQgYXJyYXkgd291bGQgZGVkdXAgYW4gZWxlbWVudCB0aGUgc3RhZ2VcbiAgICogIHJlYWQgZnJvbSBpdCBiZWZvcmUgaXRzIGZpcnN0IHdyaXRlLCB3aGVyZSB0aGUgcHJpdmF0ZSBjb3B5IChhbmRcbiAgICogIDkuMjguMCkgYXBwZW5kcyBpdC4gKi9cbiAgbWVyZ2UocGF0aDogKHN0cmluZyB8IG51bWJlcilbXSwgdmFsdWU6IGFueSwgc2hvdWxkUmVkYWN0ID0gZmFsc2UpOiB2b2lkIHtcbiAgICBjb25zdCBrZXkgPSBub3JtYWxpc2VQYXRoKHBhdGgpO1xuICAgIHRoaXMuZGV0YWNoSGVsZEFuY2VzdG9ycyhwYXRoKTtcbiAgICB0aGlzLnByaXZhdGlzZShwYXRoKTtcbiAgICBjb25zdCBleGlzdGluZyA9IF9nZXQodGhpcy53b3JraW5nQ29weSwgcGF0aCkgPz8ge307XG4gICAgY29uc3QgbWVyZ2VkID0gZGVlcFNtYXJ0TWVyZ2UoZXhpc3RpbmcsIHZhbHVlKTtcbiAgICBvd25TcGluZSh0aGlzLndvcmtpbmdDb3B5LCBwYXRoLCB0aGlzLm93bmVkKTtcbiAgICBvd24obWVyZ2VkLCB0aGlzLm93bmVkKTtcbiAgICBpZiAoaXNDb250YWluZXIobWVyZ2VkKSkgdGhpcy5wcml2YXRlVHJlZXMuYWRkKG1lcmdlZCk7XG4gICAgX3NldCh0aGlzLndvcmtpbmdDb3B5LCBwYXRoLCBtZXJnZWQpO1xuICAgIF9zZXQodGhpcy51cGRhdGVQYXRjaCwgcGF0aCwgZGVlcFNtYXJ0TWVyZ2UoX2dldCh0aGlzLnVwZGF0ZVBhdGNoLCBwYXRoKSA/PyB7fSwgdmFsdWUpKTtcbiAgICBpZiAoc2hvdWxkUmVkYWN0KSB7XG4gICAgICB0aGlzLnJlZGFjdGVkUGF0aHMuYWRkKGtleSk7XG4gICAgfVxuICAgIHRoaXMuc3RhZ2UocGF0aCwga2V5LCAnbWVyZ2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaWVsZC1sZXZlbCByZWRhY3Rpb24gKDkuMTkuMCk6IG1hcmsgZG90LXBhdGhzIElOU0lERSB0aGUgdmFsdWUgc3RhZ2VkIGF0XG4gICAqIGBwYXRoYCBhcyBzZWNyZXQsIHNvIGBzY3J1YlBhdGNoYCBzY3J1YnMgdGhlbSBpbiB0aGUgY29tbWl0IGxvZyBhbmQgdGhlXG4gICAqIG1pcnJvciB0aGUgc2FtZSB3YXkgYSB3aG9sZS1rZXkgcmVkYWN0aW9uIGlzIHNjcnViYmVkLiBBIGZpZWxkIGlzXG4gICAqIHJlZ2lzdGVyZWQgYXMgYSBsaXRlcmFsIGtleSBBTkQsIHdoZW4gZG90dGVkLCBhcyB0aGUgbmVzdGVkIHBhdGggaXRcbiAgICogbmFtZXMg4oCUIHdoaWNoZXZlciBleGlzdHMgaW4gdGhlIHBhdGNoIGlzIHRoZSBvbmUgYHNjcnViUGF0Y2hgIGZpbmRzLlxuICAgKiBNYXJrZWQgcGF0aHMgc3Vydml2ZSBjb21taXQgb25seSB3aGlsZSB0aGUgb3AgcGF0aCB0aGV5IHNpdCB1bmRlciBkb2VzXG4gICAqIChzZWUge0BsaW5rIHN1cnZpdmluZ1JlZGFjdGVkUGF0aHN9KS5cbiAgICovXG4gIG1hcmtSZWRhY3RlZEZpZWxkcyhwYXRoOiAoc3RyaW5nIHwgbnVtYmVyKVtdLCBmaWVsZHM6IHJlYWRvbmx5IHN0cmluZ1tdKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBmaWVsZCBvZiBmaWVsZHMpIHtcbiAgICAgIHRoaXMucmVkYWN0ZWRQYXRocy5hZGQobm9ybWFsaXNlUGF0aChbLi4ucGF0aCwgZmllbGRdKSk7XG4gICAgICBpZiAoZmllbGQuaW5jbHVkZXMoJy4nKSkgdGhpcy5yZWRhY3RlZFBhdGhzLmFkZChub3JtYWxpc2VQYXRoKFsuLi5wYXRoLCAuLi5maWVsZC5zcGxpdCgnLicpXSkpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEb2VzIGEgcmVkYWN0aW9uIG1hcmsgYWRkcmVzcyBhbiBhcnJheSBFTEVNRU5UIHJpZ2h0IGJlbG93IGBwYXRoYFxuICAgKiAoYGxpc3QuMS50b2tlbmApPyBBbiBgYXBwZW5kYCByb3cgcmUtYmFzZXMgdGhlIGluZGljZXMgb250byB0aGUgdGFpbCwgc29cbiAgICogc3VjaCBhIHBhdGggdGFrZXMgdGhlIHdob2xlLXZhbHVlIGBzZXRgIChgZGVsdGFFbmNvZGluZyDCtyBwdXNoVmFsdWVSb3dgKS5cbiAgICogQSBtYXJrIGJ5IE5BTUUgYmVsb3cgYW4gYXJyYXkgKGBvYmoueWApIG1lYW5zIHRoZSBzYW1lIHRoaW5nIG9uIHRoZSB0YWlsXG4gICAqIGFzIG9uIHRoZSB3aG9sZSB2YWx1ZSwgc28gdGhlIGNvbXBhY3Qgcm93IHN0YXlzIChieXRlLWlkZW50aWNhbCkuXG4gICAqL1xuICBwcml2YXRlIG1hcmtlZEJlbG93KHBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHByZWZpeCA9IHBhdGggKyBERUxJTTtcbiAgICBmb3IgKGNvbnN0IG1hcmtlZCBvZiB0aGlzLnJlZGFjdGVkUGF0aHMpIHtcbiAgICAgIGlmICghbWFya2VkLnN0YXJ0c1dpdGgocHJlZml4KSkgY29udGludWU7XG4gICAgICBjb25zdCBuZXh0ID0gbWFya2VkLnNsaWNlKHByZWZpeC5sZW5ndGgpLnNwbGl0KERFTElNKVswXTtcbiAgICAgIGlmICgvXigwfFsxLTldXFxkKikkLy50ZXN0KG5leHQpKSByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSByZWRhY3RlZCBwYXRocyB0aGF0IHN1cnZpdmUgdGhlIG5ldC1jaGFuZ2UgZmlsdGVyOiBhIHBhdGggc3Vydml2ZXNcbiAgICogd2hlbiBpdCBJUyBhIHN1cnZpdmluZyBvcCBwYXRoIChhIHdob2xlLWtleSByZWRhY3Rpb24pIG9yIHNpdHMgVU5ERVIgb25lXG4gICAqIChhIGZpZWxkIGluc2lkZSBhIHN1cnZpdmluZyB3cml0ZSkuIEEgZHJvcHBlZCBvcCB0YWtlcyBpdHMgZmllbGRzIHdpdGggaXQuXG4gICAqL1xuICBwcml2YXRlIHN1cnZpdmluZ1JlZGFjdGVkUGF0aHMoc3Vydml2aW5nUGF0aHM6IFNldDxzdHJpbmc+KTogU2V0PHN0cmluZz4ge1xuICAgIGNvbnN0IG91dCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIGZvciAoY29uc3QgcGF0aCBvZiB0aGlzLnJlZGFjdGVkUGF0aHMpIHtcbiAgICAgIGlmIChzdXJ2aXZpbmdQYXRocy5oYXMocGF0aCkpIHtcbiAgICAgICAgb3V0LmFkZChwYXRoKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IG9wIG9mIHN1cnZpdmluZ1BhdGhzKSB7XG4gICAgICAgIGlmIChwYXRoLnN0YXJ0c1dpdGgob3AgKyBERUxJTSkpIHtcbiAgICAgICAgICBvdXQuYWRkKHBhdGgpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBvdXQ7XG4gIH1cblxuICAvKipcbiAgICogUmVhZCBjdXJyZW50IHZhbHVlIGF0IHBhdGggKGluY2x1ZGVzIHVuY29tbWl0dGVkIGNoYW5nZXMpLiBUaGUgdmFsdWUgaXNcbiAgICogdGhlIHN0YWdlJ3Mgb3duIOKAlCBwcml2YXRlIHRvIGl0LCBhcyB0aGUgd2hvbGUtc3RhdGUgY2xvbmUgbWFkZSBldmVyeSByZWFkXG4gICAqIGFmdGVyIHRoZSBmaXJzdCB3cml0ZSBiZWZvcmUgOS4yOS4wIChgcHJpdmF0aXNlYCkuXG4gICAqL1xuICBnZXQocGF0aDogKHN0cmluZyB8IG51bWJlcilbXSwgZGVmYXVsdFZhbHVlPzogYW55KSB7XG4gICAgdGhpcy5wcml2YXRpc2UocGF0aCk7XG4gICAgcmV0dXJuIF9nZXQodGhpcy53b3JraW5nQ29weSwgcGF0aCwgZGVmYXVsdFZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFkIHRoZSB3b3JraW5nIGNvcHkgYXQgYHBhdGhgIFdJVEhPVVQgdGFraW5nIGEgcHJpdmF0ZSBjb3B5IOKAlCBmb3IgYVxuICAgKiByZWFkZXIgdGhhdCBvbmx5IGNvbXBhcmVzICh0aGUgZGV2LW1vZGUgYm9ycm93ZWQtbXV0YXRpb24gcmVwb3J0IGluXG4gICAqIGBTdGFnZUNvbnRleHQuY29tbWl0YCksIG5ldmVyIGZvciBhIHZhbHVlIGhhbmRlZCB0byBhIHN0YWdlLlxuICAgKi9cbiAgcGVlayhwYXRoOiAoc3RyaW5nIHwgbnVtYmVyKVtdKTogdW5rbm93biB7XG4gICAgcmV0dXJuIF9nZXQodGhpcy53b3JraW5nQ29weSwgcGF0aCk7XG4gIH1cblxuICAvKipcbiAgICogS2VlcCB0aGUgZGlmZiBiYXNlIGV4YWN0IHVuZGVyIGEgcmVhZCB0aGUgd29ya2luZyBjb3B5IGNhbm5vdCBhbnN3ZXIuXG4gICAqXG4gICAqIFdoZW4gYHdvcmtpbmdDb3B5YCBob2xkcyBub3RoaW5nIGF0IGBwYXRoYCDigJQgdGhlIHN0YWdlIGRlbGV0ZWQgb3IgdW5zZXRcbiAgICogaXQsIG9yIGEgd3JpdGUgcmVwbGFjZWQgYSBjb250YWluZXIgYWJvdmUgaXQg4oCUIGBTdGFnZUNvbnRleHQgwrdcbiAgICogcmVhZFN0YXRlYCBzZXJ2ZXMgdGhlIHJlYWQgZnJvbSBMSVZFIGNvbW1pdHRlZCBzdGF0ZSwgZXhhY3RseSBhcyA5LjI4LjBcbiAgICogZGlkLCBzbyB0aGUgdmFsdWUgaXQgaGFuZHMgb3V0IGlzIGNvbW1pdHRlZCBzdGF0ZSBpdHNlbGYuIE9uIDkuMjguMCB0aGVcbiAgICogZGlmZiBiYXNlIHdhcyBhIHdob2xlLXN0YXRlIGNsb25lIHRha2VuIGF0IHRoZSBzdGFnZSdzIGZpcnN0IHdyaXRlLCBhbmRcbiAgICogYW4gaW4tcGxhY2UgZWRpdCBvZiB0aGF0IHZhbHVlIChvdXQgb2YgY29udHJhY3Qg4oCUIHJlYWRzIGFyZSBib3Jyb3dlZClcbiAgICogY291bGQgbm90IG1vdmUgaXQ6IHdyaXR0ZW4gYmFjaywgdGhlIGVkaXQgd2FzIHJlY29yZGVkLiBIZXJlIHRoZSBkaWZmXG4gICAqIGJhc2UgSVMgYSBjb21taXR0ZWQgZ2VuZXJhdGlvbiwgYW5kIGl0IHZlcnkgb2Z0ZW4gaG9sZHMgdGhhdCBzYW1lXG4gICAqIGNvbnRhaW5lciBhdCBgcGF0aGAg4oCUIHRoZSBlZGl0IHdvdWxkIG1vdmUgdGhlIGJhc2Ugd2l0aCBpdCwgYW5kIHRoZVxuICAgKiB3cml0ZS1iYWNrIHdvdWxkIGNvbW1pdCBubyBjaGFuZ2UuIFNvIGJlZm9yZSB0aGUgdmFsdWUgZ29lcyBvdXQsIHRoZVxuICAgKiBiYXNlJ3MgdmFsdWUgYXQgYHBhdGhgIGlzIHJlcGxhY2VkIGJ5IGEgcHJpdmF0ZSBkZWVwIGNvcHkgKHRoZSBiYXNlJ3NcbiAgICogcm9vdCBhbmQgdGhlIGNvbnRhaW5lcnMgb24gdGhlIHdheSBjb3BpZWQgc2hhbGxvd2x5KSDigJQgd2hhdCA5LjI4LjAnc1xuICAgKiBiYXNlIGhlbGQgdGhlcmUuIFRoZSBjb21taXQncyBuZXQtY2hhbmdlIHRlc3QgY29tcGFyZXMgYWdhaW5zdCBpdCBhbmRcbiAgICogdGhlIGRlbHRhIGVuY29kZXIgcmVwbGF5cyBmcm9tIGl0OyB0aGUgdmFsdWUgaGFuZGVkIG91dCBzdGF5cyB0aGUgbGl2ZVxuICAgKiBvbmUsIHNvIHdoYXRldmVyIGVsc2UgYW4gZWRpdCBvZiBpdCByZWFjaGVzIChsaXZlIHN0YXRlLCB0aGUgbmV4dFxuICAgKiBnZW5lcmF0aW9uKSBiZWhhdmVzIGFzIG9uIDkuMjguMCB0b28uXG4gICAqXG4gICAqIE5vdCBgcHJpdmF0aXNlYDogYSBwcml2YXRlIGNvcHkgaGFuZGVkIHRvIHRoZSBzdGFnZSB3b3VsZCBhbHNvIGtlZXAgdGhlXG4gICAqIGVkaXQgb3V0IG9mIGxpdmUgc3RhdGUsIHdoZXJlIDkuMjguMCBsZXQgaXQgaW4g4oCUIGEgcnVuLW5hbWVzcGFjZWQgcmVhZFxuICAgKiB0aGF0IGZhbGxzIGJhY2sgdG8gYSBnbG9iYWwga2V5IHdvdWxkIHRoZW4gZW5kIGRpZmZlcmVudGx5ICh0aGVcbiAgICogZGlmZmVyZW50aWFsJ3MgTkVTVEVEIGZhbWlseSBmYWlscyB3aXRoaW4gMTAwIHByb2dyYW1zIHRoYXQgd2F5KS5cbiAgICpcbiAgICogQ29waWVzIG5vdGhpbmcgd2hlbiB0aGUgYmFzZSBob2xkcyBubyBjb250YWluZXIgYXQgYHBhdGhgLCBhbmQgbm90aGluZ1xuICAgKiB0d2ljZTogYSBwYXRoIGF0IG9yIGJlbG93IGFuIGVhcmxpZXIgZGV0YWNoIGlzIGFscmVhZHkgcHJpdmF0ZS4gTyhwYXRoKVxuICAgKiBvdGhlcndpc2UsIHBsdXMgTyh2YWx1ZSkgb25jZSBwZXIgZGV0YWNoZWQgcGF0aC5cbiAgICovXG4gIGRldGFjaEJhc2UocGF0aDogKHN0cmluZyB8IG51bWJlcilbXSk6IHZvaWQge1xuICAgIGlmIChwYXRoLmxlbmd0aCA9PT0gMCB8fCAhaXNDb250YWluZXIodGhpcy5iYXNlU25hcHNob3QpKSByZXR1cm47XG4gICAgbGV0IGF0OiBvYmplY3QgPSB0aGlzLmJhc2VTbmFwc2hvdDtcbiAgICBmb3IgKGNvbnN0IGsgb2YgcGF0aCkge1xuICAgICAgaWYgKHRoaXMuZGV0YWNoZWRCYXNlPy5oYXMoYXQpKSByZXR1cm47XG4gICAgICBjb25zdCBjaGlsZCA9IG93bkNoaWxkKGF0LCBrKTtcbiAgICAgIGlmICghaXNDb250YWluZXIoY2hpbGQpKSByZXR1cm47XG4gICAgICBhdCA9IGNoaWxkO1xuICAgIH1cbiAgICBpZiAodGhpcy5kZXRhY2hlZEJhc2U/LmhhcyhhdCkpIHJldHVybjtcbiAgICBjb25zdCBvd25lZCA9ICh0aGlzLmJhc2VPd25lZCA/Pz0gbmV3IFdlYWtTZXQ8b2JqZWN0PigpKTtcbiAgICBpZiAoIW93bmVkLmhhcyh0aGlzLmJhc2VTbmFwc2hvdCkpIHRoaXMuYmFzZVNuYXBzaG90ID0gb3duZWRSb290T2YodGhpcy5iYXNlU25hcHNob3QsIG93bmVkKTtcbiAgICBvd25TcGluZSh0aGlzLmJhc2VTbmFwc2hvdCwgcGF0aCwgb3duZWQpO1xuICAgIGNvbnN0IGNvcHk6IG9iamVjdCA9IHN0cnVjdHVyZWRDbG9uZShhdCk7XG4gICAgKHRoaXMuZGV0YWNoZWRCYXNlID8/PSBuZXcgV2Vha1NldDxvYmplY3Q+KCkpLmFkZChjb3B5KTtcbiAgICBfc2V0KHRoaXMuYmFzZVNuYXBzaG90LCBwYXRoLCBjb3B5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcml2YXRlIHJlYWRzICg5LjI5LjApOiBtYWtlIHRoZSB2YWx1ZSBhdCBgcGF0aGAgdGhlIHN0YWdlJ3Mgb3duIGJlZm9yZVxuICAgKiBhIHJlYWQgaGFuZHMgaXQgb3V0IOKAlCBzbyBhIHJlYWQgYWZ0ZXIgdGhlIHN0YWdlJ3MgZmlyc3Qgd3JpdGUgYmVoYXZlc1xuICAgKiBleGFjdGx5IGFzIGl0IGRpZCB3aGVuIHRoZSBidWZmZXIgYmVnYW4gd2l0aCBhIGRlZXAgY2xvbmUgb2YgdGhlIHdob2xlXG4gICAqIHN0YXRlLiBBbiBpbi1wbGFjZSBlZGl0IG9mIHdoYXQgdGhlIHJlYWQgcmV0dXJuZWQgKG91dCBvZiBjb250cmFjdCDigJRcbiAgICogcmVhZHMgYXJlIGJvcnJvd2VkKSBzdGF5cyBpbnNpZGUgdGhlIGJ1ZmZlciwgYW5kIGNvbW1pdHRlZCBzdGF0ZSBpcyBuZXZlclxuICAgKiB0b3VjaGVkLiBXaGV0aGVyIHRoZSBSRUNPUkQga2VlcHMgaXQgaXMgdGhlIGFkbWl0dGVkIHJlY29yZCdzIGxhd1xuICAgKiAoOS4zMC4wLCBvd25lciBydWxpbmcgUjEg4oCUIHRoZSByZWNvcmQga2VlcHMgd2hhdCB0aGUgc3RhZ2UgcmVhZCBiYWNrKTogaXRcbiAgICogaXMga2VwdCB3aGVuIHRoZSBlZGl0ZWQgdmFsdWUgbGllcyBhdCBvciBiZWxvdyBhIHBhdGggdGhlIHN0YWdlIHdyb3RlIGluXG4gICAqIHRoaXMgc3RhZ2Ug4oCUIHNldCwgbWVyZ2VkIG9yIHdyaXR0ZW4gYmFjayBhbGlrZSDigJQgYW5kIGxvc3Qgb3RoZXJ3aXNlLlxuICAgKlxuICAgKiBXYWxraW5nIHRoZSBwYXRoIGZyb20gdGhlIChvd25lZCkgcm9vdDpcbiAgICogIC0gYSBjb250YWluZXIgc3RpbGwgU0hBUkVEIHdpdGggY29tbWl0dGVkIHN0YXRlIGF0IHRoZSBzYW1lIHBvc2l0aW9uIGlzXG4gICAqICAgIHJlcGxhY2VkIGJ5IGEgcHJpdmF0ZSBkZWVwIGNvcHkgd2hlbiBpdCBpcyB0aGUgdmFsdWUgcmVhZCwgb3IgYnkgYVxuICAgKiAgICBzaGFsbG93IGNvcHkgd2hlbiBpdCBpcyBhIGNvbnRhaW5lciBvbiB0aGUgd2F5IHRvIGl0IChzbyBhIHJlYWQgb2ZcbiAgICogICAgYGtgIHVuZGVyIGEgZm9yayBjaGlsZCdzIGFkZHJlc3MgY29waWVzIGBrYCwgbm90IGV2ZXJ5IGNoaWxkJ3MgbmFtZXNwYWNlKTtcbiAgICogIC0gYSBjb250YWluZXIgdGhlIHN0YWdlIFNUQUdFRCAob3IgYW55dGhpbmcgZWxzZSB0aGUgYnVmZmVyIGRpZCBub3RcbiAgICogICAgdGFrZSBmcm9tIGNvbW1pdHRlZCBzdGF0ZSkgaXMgaGFuZGVkIGJhY2sgYnkgcmVmZXJlbmNlLCBhcyBiZWZvcmU7XG4gICAqICAtIGEgY29udGFpbmVyIHRoZSBidWZmZXIgb3ducyBpcyB3YWxrZWQgb24g4oCUIGFuZCB3aGVuIGl0IGlzIHRoZSB2YWx1ZVxuICAgKiAgICByZWFkLCBpdHMgc3RpbGwtc2hhcmVkIGRlc2NlbmRhbnRzIGFyZSBwcml2YXRpc2VkXG4gICAqICAgICh7QGxpbmsgcHJpdmF0aXNlQmVsb3d9KS5cbiAgICpcbiAgICogQ29zdDogTyhwYXRoKSBwZXIgcmVhZCwgcGx1cyBPKHZhbHVlKSBPTkNFIHBlciBzaGFyZWQgY29udGFpbmVyIGEgc3RhZ2VcbiAgICogcmVhZHMgYWZ0ZXIgaXRzIGZpcnN0IHdyaXRlLiBBIHN0YWdlIHRoYXQgbmV2ZXIgcmVhZHMgYWZ0ZXIgd3JpdGluZyBwYXlzXG4gICAqIG5vdGhpbmc7IGEgcmVhZCBiZWZvcmUgdGhlIGZpcnN0IHdyaXRlIG5ldmVyIHJlYWNoZXMgdGhlIGJ1ZmZlci5cbiAgICovXG4gIHByaXZhdGUgcHJpdmF0aXNlKHBhdGg6IChzdHJpbmcgfCBudW1iZXIpW10pOiB2b2lkIHtcbiAgICBpZiAocGF0aC5sZW5ndGggPT09IDApIHJldHVybjtcbiAgICAvLyBSZXNvbHZlIGZpcnN0OiBhIHJlYWQgdGhhdCBsYW5kcyBvbiBub3RoaW5nIChhIG1pc3Npbmcga2V5LCBhIHJlZnVzZWRcbiAgICAvLyBzZWdtZW50LCBhIHByaW1pdGl2ZSkgcmV0dXJucyBub3RoaW5nIGFuZCBtdXN0IGNvcHkgbm90aGluZy5cbiAgICBjb25zdCBjaGFpbjogb2JqZWN0W10gPSBbXTtcbiAgICBsZXQgYXQ6IHVua25vd24gPSB0aGlzLndvcmtpbmdDb3B5O1xuICAgIGZvciAoY29uc3QgayBvZiBwYXRoKSB7XG4gICAgICBhdCA9IG93bkNoaWxkKGF0LCBrKTtcbiAgICAgIGlmICghaXNDb250YWluZXIoYXQpKSByZXR1cm47XG4gICAgICBjaGFpbi5wdXNoKGF0KTtcbiAgICB9XG4gICAgbGV0IHBhcmVudDogYW55ID0gdGhpcy53b3JraW5nQ29weTtcbiAgICBsZXQgYmFzZTogdW5rbm93biA9IHRoaXMuYmFzZVNuYXBzaG90O1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGF0aC5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgayA9IHBhdGhbaV07XG4gICAgICBjb25zdCBhdEJhc2UgPSBvd25DaGlsZChiYXNlLCBrKTtcbiAgICAgIGxldCB2YWx1ZSA9IGNoYWluW2ldO1xuICAgICAgaWYgKCF0aGlzLm93bmVkLmhhcyh2YWx1ZSkpIHtcbiAgICAgICAgaWYgKHZhbHVlICE9PSBhdEJhc2UgfHwgdGhpcy5zdGFnZWQuaGFzKHZhbHVlKSkgcmV0dXJuO1xuICAgICAgICBpZiAoaSA9PT0gcGF0aC5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgcGFyZW50W2tdID0gdGhpcy5wcml2YXRlQ29weU9mKHZhbHVlKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdmFsdWUgPSBzaGFsbG93Q29weSh2YWx1ZSk7XG4gICAgICAgIHRoaXMub3duZWQuYWRkKHZhbHVlKTtcbiAgICAgICAgcGFyZW50W2tdID0gdmFsdWU7XG4gICAgICB9XG4gICAgICBwYXJlbnQgPSB2YWx1ZTtcbiAgICAgIGJhc2UgPSBhdEJhc2U7XG4gICAgfVxuICAgIHRoaXMucHJpdmF0aXNlQmVsb3cocGFyZW50LCBiYXNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBbiBPV05FRCBjb250YWluZXIgaXMgYWJvdXQgdG8gYmUgcmVhZCB3aG9sZSAoYSBwYXRoIGNvcHkgYSBuZXN0ZWQgd3JpdGVcbiAgICogbWFkZSwgc2F5KTogaXRzIGRlc2NlbmRhbnRzIHN0aWxsIHNoYXJlZCB3aXRoIGNvbW1pdHRlZCBzdGF0ZSBhcmVcbiAgICogcmVwbGFjZWQgYnkgcHJpdmF0ZSBkZWVwIGNvcGllcywgc28gbm90aGluZyB0aGUgcmVhZCBoYW5kcyBvdXQgaXNcbiAgICogY29tbWl0dGVkIHN0YXRlLiBXYWxrcyBvd25lZCBjb250YWluZXJzIG9ubHk7IG1hcmtzIGVhY2ggb25lIGZpbmlzaGVkXG4gICAqICh7QGxpbmsgcHJpdmF0ZVRyZWVzfSksIHNvIGEgY29udGFpbmVyIGlzIHNjYW5uZWQgb25jZSBwZXIgc3RhZ2UuXG4gICAqL1xuICBwcml2YXRlIHByaXZhdGlzZUJlbG93KGNvbnRhaW5lcjogb2JqZWN0LCBiYXNlOiB1bmtub3duKTogdm9pZCB7XG4gICAgY29uc3Qgd29yazogQXJyYXk8W29iamVjdCwgdW5rbm93bl0+ID0gW1tjb250YWluZXIsIGJhc2VdXTtcbiAgICB3aGlsZSAod29yay5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBbbm9kZSwgbm9kZUJhc2VdID0gd29yay5wb3AoKSE7XG4gICAgICBpZiAodGhpcy5wcml2YXRlVHJlZXMuaGFzKG5vZGUpKSBjb250aW51ZTtcbiAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKG5vZGUpKSB7XG4gICAgICAgIGNvbnN0IGNoaWxkID0gb3duQ2hpbGQobm9kZSwga2V5KTtcbiAgICAgICAgaWYgKCFpc0NvbnRhaW5lcihjaGlsZCkpIGNvbnRpbnVlO1xuICAgICAgICBjb25zdCBhdEJhc2UgPSBvd25DaGlsZChub2RlQmFzZSwga2V5KTtcbiAgICAgICAgaWYgKHRoaXMub3duZWQuaGFzKGNoaWxkKSkgd29yay5wdXNoKFtjaGlsZCwgYXRCYXNlXSk7XG4gICAgICAgIGVsc2UgaWYgKGNoaWxkID09PSBhdEJhc2UgJiYgIXRoaXMuc3RhZ2VkLmhhcyhjaGlsZCkpIHtcbiAgICAgICAgICAobm9kZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilba2V5XSA9IHRoaXMucHJpdmF0ZUNvcHlPZihjaGlsZCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMucHJpdmF0ZVRyZWVzLmFkZChub2RlKTtcbiAgICB9XG4gIH1cblxuICAvKiogQSBwcml2YXRlIGRlZXAgY29weSBvZiBhIGNvbW1pdHRlZCBjb250YWluZXIg4oCUIG93bmVkIHRocm91Z2ggYW5kIHRocm91Z2guICovXG4gIHByaXZhdGUgcHJpdmF0ZUNvcHlPZih2YWx1ZTogb2JqZWN0KTogb2JqZWN0IHtcbiAgICBjb25zdCBjb3B5ID0gc3RydWN0dXJlZENsb25lKHZhbHVlKTtcbiAgICBhZG9wdChjb3B5LCB0aGlzLm93bmVkKTtcbiAgICB0aGlzLnByaXZhdGVUcmVlcy5hZGQoY29weSk7XG4gICAgcmV0dXJuIGNvcHk7XG4gIH1cblxuICAvKipcbiAgICogRGlkIGFueSBzdGFnZWQgb3AgdG91Y2ggYHBhdGhgLCBvciBhIHBhdGggYWJvdmUgb3IgYmVsb3cgaXQ/XG4gICAqXG4gICAqIFRoZSBkZXYtbW9kZSBib3Jyb3dlZC1yZWFkIGNoZWNrIChgU3RhZ2VDb250ZXh0LmNvbW1pdGApIGFza3MgdGhpcyBiZWZvcmVcbiAgICogYWNjdXNpbmcgYSBzdGFnZSBvZiBtdXRhdGluZyBhIHZhbHVlIGluIHBsYWNlOiBhIGtleSB0aGUgc3RhZ2UgbGVnaXRpbWF0ZWx5XG4gICAqIFdST1RFIGlzIGV4cGVjdGVkIHRvIGRpZmZlciBmcm9tIHdoYXQgaXQgcmVhZCwgYW5kIHdyaXRlcyByZWFjaCB0aGUgYnVmZmVyXG4gICAqIGZyb20gcGF0aHMgdGhhdCBieXBhc3MgdXNlci1sZXZlbCB3cml0ZSB0cmFja2luZyB0b28gKHRoZSBzdWJmbG93IHNlZWQsXG4gICAqIGBvdXRwdXRNYXBwZXJgIG1lcmdlLWJhY2ssIHRoZSByZXN1bWUgcmUtc2VlZCkuIERldi1tb2RlIG9ubHkg4oCUIG5vdGhpbmcgb25cbiAgICogdGhlIGhvdCBwYXRoIGNhbGxzIGl0LlxuICAgKi9cbiAgd2FzU3RhZ2VkKHBhdGg6IChzdHJpbmcgfCBudW1iZXIpW10pOiBib29sZWFuIHtcbiAgICBjb25zdCB0YXJnZXQgPSBub3JtYWxpc2VQYXRoKHBhdGgpO1xuICAgIGZvciAoY29uc3Qgb3Agb2YgdGhpcy5vcFRyYWNlKSB7XG4gICAgICAvLyBPbiB0aGUgcGF0aCwgYmVsb3cgaXQgb3IgYWJvdmUgaXQg4oCUIHRoZSBvbmUgcGF0aCByZWxhdGlvbiBldmVyeSBrZXkgcXVlcnkgYXNrcy5cbiAgICAgIGlmIChyZWxhdGlvbihvcC5wYXRoLCB0YXJnZXQpICE9PSB1bmRlZmluZWQpIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogRmx1c2ggYWxsIHN0YWdlZCBtdXRhdGlvbnMgYW5kIHJldHVybiB0aGUgY29tbWl0IGJ1bmRsZSDigJQgcmVjb3JkaW5nIHRoZVxuICAgKiBzdGFnZSdzIE5FVCBDSEFOR0UsIG5vdCBpdHMgcmF3IHdyaXRlIGxvZy5cbiAgICpcbiAgICog4pSA4pSAIFdIWSAodGhlIGRlZmVjdCB0aGlzIGZpeGVzKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgICogUHJldmlvdXNseSBldmVyeSBgc2V0YC9gbWVyZ2VgIHdhcyByZWNvcmRlZCB2ZXJiYXRpbSwgc28gdGhlIGNvbW1pdCBidW5kbGVcbiAgICogd2FzIGEgbG9nIG9mICpvcGVyYXRpb25zKiByYXRoZXIgdGhhbiAqY2hhbmdlcyouIFR3byBvcGVyYXRpb25zIHByb2R1Y2Ugbm9cbiAgICogbmV0IGNoYW5nZSB5ZXQgd2VyZSBzdGlsbCBjb21taXR0ZWQgYXMgXCJtdXRhdGlvbnNcIjpcbiAgICpcbiAgICogICAxLiBOby1vcCB3cml0ZSAgIOKAlCB3cml0aW5nIGEga2V5IHRoZSB2YWx1ZSBpdCBhbHJlYWR5IGhvbGRzIChlLmcuIGFuXG4gICAqICAgICAgICAgICAgICAgICAgICAgIGFnZW50IGNvbnRleHQgc2xvdCByZS1lbWl0dGluZyBpZGVudGljYWwgY29udGVudCBldmVyeVxuICAgKiAgICAgICAgICAgICAgICAgICAgICB0dXJuKS4gYmFzZSBLPTEsIHN0YWdlIHdyaXRlcyBLPTEuXG4gICAqICAgMi4gV3JpdGUtcmV2ZXJ0ICDigJQgY2hhbmdpbmcgdGhlbiByZXN0b3JpbmcgYSBrZXkgd2l0aGluIG9uZSBzdGFnZS5cbiAgICogICAgICAgICAgICAgICAgICAgICAgYmFzZSBLPTEsIHN0YWdlIHdyaXRlcyBLPTIgdGhlbiBLPTEuXG4gICAqXG4gICAqIFJlY29yZGluZyB0aGVzZSBhcyBtdXRhdGlvbnMgKGEpIGJsb2F0ZWQgY2F1c2FsIHNsaWNpbmcgLyBiYWNrdHJhY2tpbmcgd2l0aFxuICAgKiBzcHVyaW91cyBkZXBlbmRlbmNpZXMgb24gaW50ZXJtZWRpYXRlIHZhbHVlcyB0aGF0IG5ldmVyIHJlYWNoIGZpbmFsIHN0YXRlLFxuICAgKiBhbmQgKGIpIG1hZGUgZG93bnN0cmVhbSBcIndoYXQgY2hhbmdlZCBoZXJlP1wiIGNvbnN1bWVycyBsaWdodCB1cCBzdGFnZXMgdGhhdFxuICAgKiBjaGFuZ2VkIG5vdGhpbmcg4oCUIG1vc3QgdmlzaWJseSB0aGUgbGVucyBoaWdobGlnaHQgZmxhZ2dpbmcgZXZlcnkgc2xvdC5cbiAgICpcbiAgICog4pSA4pSAIEhPVyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgICogQXQgY29tbWl0IHdlIGhvbGQgQk9USCBgYmFzZVNuYXBzaG90YCAoc3RhdGUgd2hlbiB0aGUgc3RhZ2UgYmVnYW4pIGFuZFxuICAgKiBgd29ya2luZ0NvcHlgIChzdGF0ZSBhZnRlciBhbGwgaXRzIHdyaXRlcykuIEZvciBlYWNoIHBhdGggdGhlIHN0YWdlIHRvdWNoZWRcbiAgICogd2Uga2VlcCBpdCBpbiB0aGUgYnVuZGxlIE9OTFkgaWYgaXRzIGZpbmFsIHZhbHVlIGRpZmZlcnMgZnJvbSB0aGUgYmFzZVxuICAgKiB2YWx1ZSAoe0BsaW5rIGRlZXBFcXVhbH0pLiBOby1vcCBBTkQgd3JpdGUtcmV2ZXJ0IHBhdGhzIGRyb3Agb3V0LCBiZWNhdXNlXG4gICAqIGJvdGggY29tcGFyZSBlcXVhbCB0byBiYXNlLiBUaGlzIGlzIGEgc2luZ2xlIG5ldC1kZWx0YSBkaWZmIGF0IGNvbW1pdCB0aW1lXG4gICAqIOKAlCBvbmUgZGVlcCBjb21wYXJlIHBlciB0b3VjaGVkIHBhdGgsIE8oY2hhbmdlZCBzdGF0ZSksIHBhaWQgb25jZSBwZXIgc3RhZ2VcbiAgICogKE5PVCBwZXIgd3JpdGUpLiBBIG5haXZlIHBlci13cml0ZSBkZWVwLWVxdWFsIHNraXAgd291bGQgYmUgbW9yZSBleHBlbnNpdmVcbiAgICogYW5kIHdvdWxkIHN0aWxsIG1pc3Mgd3JpdGUtcmV2ZXJ0ICh0aGUgaW50ZXJtZWRpYXRlIHdyaXRlIGRpZmZlcnMgZnJvbSB0aGVcbiAgICogdmFsdWUgcHJlc2VudCBhdCB0aGUgbW9tZW50IG9mIHdyaXRpbmcpLlxuICAgKlxuICAgKiDilIDilIAgVFdPIEhPTkVTVCBUSUVSUyAoYnkgZGVzaWduIOKAlCBkbyBub3QgXCJ1bmlmeVwiIHRoZW0pIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAgKiAgIOKAoiBjb21taXQgKGhlcmUpICAgPSBDSEFOR0UtbGV2ZWwg4oCUIHRydXRoZnVsIG5ldCBkZWx0YS4gRmVlZHMgdGhlIGNvbW1pdFxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgbG9nLCBjYXVzYWwgY2hhaW4sIG5hcnJhdGl2ZSwgYW5kIHRoZSBsZW5zIGhpZ2hsaWdodC5cbiAgICogICDigKIgYG9uV3JpdGVgIGV2ZW50ID0gT1AtbGV2ZWwg4oCUIGZpcmVzIG9uIEVWRVJZIHdyaXRlIGF0dGVtcHQgcmVnYXJkbGVzcyBvZlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgbmV0IGNoYW5nZS4gRmVlZHMgbWV0cmljcyAvIGJlaGF2aW91cmFsIG9ic2VydmFiaWxpdHlcbiAgICogICAgICAgICAgICAgICAgICAgICAgIChhIGRlYnVnZ2VyIHdhbnRzIHRvIHNlZSBcIndyb3RlIDIsIHRoZW4gcmV2ZXJ0ZWRcIikuXG4gICAqIGBvbldyaXRlYCBpcyB1bmNoYW5nZWQgYnkgdGhpcyBtZXRob2Q7IG9ubHkgdGhlIENPTU1JVCBiZWNvbWVzIGNoYW5nZS1vbmx5LlxuICAgKlxuICAgKiDilIDilIAgRU1QVFkgQ09NTUlUUyBBUkUgSU5URU5USU9OQUwg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gICAqIEEgc3RhZ2UgdGhhdCBuZXRzIG5vIGNoYW5nZSBjb21taXRzIGFuIEVNUFRZIHBhdGNoIOKAlCBOT1Qgbm90aGluZy5cbiAgICoge0BsaW5rIFN0YWdlQ29udGV4dC5jb21taXR9IHN0aWxsIHJlY29yZHMgdGhlIGJ1bmRsZSB1bmNvbmRpdGlvbmFsbHksIHNvXG4gICAqIGV2ZXJ5IGV4ZWN1dGVkIHN0YWdlIHJlbWFpbnMgYSB0aW1lLXRyYXZlbCBjdXJzb3Igc3RvcCAoaXRzIGBydW50aW1lU3RhZ2VJZGBcbiAgICogbWFya2VyIGlzIHByZXNlcnZlZCk7IG9ubHkgaXRzIFBBVENIIGlzIGVtcHR5LiBUaGlzIGlzIHdoYXQga2VlcHMgdGhlXG4gICAqIGNvbW1pdC1pbmRleGVkIHNsaWRlciBzdGFibGUgd2hpbGUgbWFraW5nIHRoZSBoaWdobGlnaHQgdHJ1dGhmdWwuXG4gICAqXG4gICAqIOKUgOKUgCBLTk9XTiBMSU1JVEFUSU9OUyAvIEZVVFVSRSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgICogICDigKIgRXhwbGljaXQga2V5IERFTEVUSU9OIHVuZGVyIHRoZSBkZWZhdWx0ICdmdWxsJyBtb2RlIGlzIHN0aWxsXG4gICAqICAgICBmbGF0dGVuZWQgdG8gc2V0LW9mLWB1bmRlZmluZWRgIChhIHJlbW92ZWQga2V5IGNhbm5vdCBiZSBleHByZXNzZWRcbiAgICogICAgIGluIE1lbW9yeVBhdGNoIGFsb25lKS4gQ0xPU0VEIHVuZGVyIGBjb21taXRWYWx1ZXM6ICdkZWx0YSdgICgjMTNjLUIpOlxuICAgKiAgICAge0BsaW5rIGRlbGV0ZX0gc3RhZ2VzIGEgZGlzdGluY3Qgb3AgYW5kIHRoZSBidW5kbGUgY2FycmllcyBhIHJlYWxcbiAgICogICAgIGBkZWxldGVgIHRyYWNlIHZlcmIgd2hvc2UgcmVwbGF5IHJlbW92ZXMgdGhlIGtleS5cbiAgICogICDigKIgQXJyYXktbWVyZ2UgZGVkdXAgaW4ge0BsaW5rIGRlZXBTbWFydE1lcmdlfSBzdGlsbCB1c2VzIHJlZmVyZW5jZSBlcXVhbGl0eVxuICAgKiAgICAgKGBuZXcgU2V0YCksIHNvIGRlZXAtZXF1YWwgKm9iamVjdHMqIGluIGEgbWVyZ2VkIGFycmF5IGFyZSBub3QgZGVkdXBlZC5cbiAgICogICAgIE9ydGhvZ29uYWwgdG8gdGhpcyBjaGFuZ2U7IHRyYWNrZWQgc2VwYXJhdGVseS5cbiAgICpcbiAgICogUmVzZXRzIHRoZSBidWZmZXIgdG8gZW1wdHkgc3RhdGUgYWZ0ZXIgY29tbWl0LlxuICAgKi9cbiAgY29tbWl0KCk6IHtcbiAgICBvdmVyd3JpdGU6IE1lbW9yeVBhdGNoO1xuICAgIHVwZGF0ZXM6IE1lbW9yeVBhdGNoO1xuICAgIHJlZGFjdGVkUGF0aHM6IFNldDxzdHJpbmc+O1xuICAgIHRyYWNlOiBUcmFjZUVudHJ5W107XG4gIH0ge1xuICAgIGNvbnN0IHJvd3MgPSB0aGlzLmNvbW1pdFZhbHVlcyA9PT0gJ2RlbHRhJyA/IHRoaXMudG9EZWx0YVBheWxvYWQoKSA6IHRoaXMudG9DaGFuZ2VPbmx5UGF5bG9hZCgpO1xuICAgIGNvbnN0IHJlZGFjdGVkUGF0aHMgPSB0aGlzLnN1cnZpdmluZ1JlZGFjdGVkUGF0aHMobmV3IFNldChyb3dzLnRyYWNlLm1hcCgodCkgPT4gdC5wYXRoKSkpO1xuICAgIC8vIFRoZSBidW5kbGUncyBrZXkgb3JkZXIgaXMgYHJlY29yZENvbW1pdGAnczsgYSBkaXJlY3QgY2FsbGVyIGtlZXBzIHRoaXMgc2FtZSBvcmRlci5cbiAgICBjb25zdCBwYXlsb2FkID0geyBvdmVyd3JpdGU6IHJvd3Mub3ZlcndyaXRlLCB1cGRhdGVzOiByb3dzLnVwZGF0ZXMsIHJlZGFjdGVkUGF0aHMsIHRyYWNlOiByb3dzLnRyYWNlIH07XG5cbiAgICB0aGlzLm92ZXJ3cml0ZVBhdGNoID0ge307XG4gICAgdGhpcy51cGRhdGVQYXRjaCA9IHt9O1xuICAgIHRoaXMub3BUcmFjZS5sZW5ndGggPSAwO1xuICAgIHRoaXMucmVkYWN0ZWRQYXRocy5jbGVhcigpO1xuICAgIHRoaXMuaGVsZFJlZnMuY2xlYXIoKTtcbiAgICB0aGlzLndvcmtpbmdDb3B5ID0ge307XG4gICAgdGhpcy5vd25lZCA9IG5ldyBXZWFrU2V0KCk7XG4gICAgdGhpcy5vd25lZC5hZGQodGhpcy53b3JraW5nQ29weSk7XG4gICAgdGhpcy5zdGFnZWQgPSBuZXcgV2Vha1NldCgpO1xuICAgIHRoaXMucHJpdmF0ZVRyZWVzID0gbmV3IFdlYWtTZXQoKTtcbiAgICB0aGlzLnN0YWdlZE1lcmdlcyA9IDA7XG4gICAgdGhpcy5uZXN0ZWRPcHMgPSAwO1xuXG4gICAgcmV0dXJuIHBheWxvYWQ7XG4gIH1cblxuICAvKipcbiAgICogUmVidWlsZCBvdmVyd3JpdGUgLyB1cGRhdGVzIC8gdHJhY2Uga2VlcGluZyBPTkxZIHBhdGhzIHdob3NlIGZpbmFsIHZhbHVlXG4gICAqIGRpZmZlcnMgZnJvbSB0aGUgYmFzZSB2YWx1ZSDigJQgaS5lLiB0aGUgc3RhZ2UncyBuZXQgY2hhbmdlLiBTZWVcbiAgICoge0BsaW5rIFRyYW5zYWN0aW9uQnVmZmVyLmNvbW1pdH0gZm9yIHRoZSByYXRpb25hbGUuXG4gICAqXG4gICAqIFBhdGhzIGFyZSBjb21wYXJlZCBhdCB0aGUgZXhhY3QgZ3JhbnVsYXJpdHkgdGhleSB3ZXJlIHdyaXR0ZW4gKGVhY2ggdHJhY2VcbiAgICogZW50cnkncyBwYXRoKSwgYWdhaW5zdCBgd29ya2luZ0NvcHlgIChmaW5hbCkgdnMgYGJhc2VTbmFwc2hvdGAgKHN0YXJ0KS5cbiAgICogU3Vydml2aW5nIGBzZXRgIHBhdGhzIGNvcHkgdGhlaXIgZmluYWwgdmFsdWUgZnJvbSBgb3ZlcndyaXRlUGF0Y2hgO1xuICAgKiBzdXJ2aXZpbmcgYG1lcmdlYCBwYXRocyBjb3B5IHRoZWlyIGFjY3VtdWxhdGVkIGRlbHRhIGZyb20gYHVwZGF0ZVBhdGNoYCxcbiAgICoga2VlcGluZyB0aGUgc2V0LXZzLW1lcmdlIHZlcmIg4oCUIGFuZCB0aGUgcmVzdWx0IGlzIEFETUlUVEVEICh7QGxpbmsgYWRtaXR9KTpcbiAgICogYSBmYW1pbHkgb2Ygcm93cyB3aG9zZSByZXBsYXkgZG9lcyBub3QgZ2l2ZSBiYWNrIHdoYXQgdGhlIHN0YWdlIHJlYWQgaXNcbiAgICogcmVjb3JkZWQgYXMgYHNldGAgcm93cyBvZiB0aGUgcmVhZC1iYWNrIGluc3RlYWQgKDkuMzAuMCkuXG4gICAqXG4gICAqIFRoaXMgaXMgdGhlIERFRkFVTFQgKGBjb21taXRWYWx1ZXM6ICdmdWxsJ2ApIHBheWxvYWQsIGluY2x1ZGluZyB0aGVcbiAgICogaGlzdG9yaWNhbCBmbGF0dGVuaW5nIG9mIHN0YWdlZCBgZGVsZXRlYCBvcHMgaW50byBgc2V0YC1vZi1gdW5kZWZpbmVkYFxuICAgKiB0cmFjZSBlbnRyaWVzLiBUaGUgZGVsdGEgZW5jb2RpbmcgbGl2ZXMgaW4ge0BsaW5rIHRvRGVsdGFQYXlsb2FkfS5cbiAgICpcbiAgICogV29yaywgbm90IGJ5dGVzICg5LjIyLjEpOiB0aGUgbmV0LWNoYW5nZSB2ZXJkaWN0IGlzIHBhaWQgb25jZSBwZXIgUEFUSFxuICAgKiBhbmQgdGhlIGNsb25lIG9uY2UgcGVyIENPTlNFQ1VUSVZFIHJ1biBvZiBvcHMgb24gYSBwYXRoLCBub3Qgb25jZSBwZXIgb3BcbiAgICog4oCUIHNlZSB0aGUgdHdvIG1lbW9zIGluc2lkZS4gUGlubmVkIGJ5XG4gICAqIHRlc3QvbGliL21lbW9yeS9zY2VuYXJpby9yZXBlYXRlZC1wYXRoLWJ5dGUtaWRlbnRpdHkudGVzdC50cyBhZ2FpbnN0IHRoZVxuICAgKiA5LjIyLjAgYnl0ZXMuIFNpbmNlIDkuMjMuMCB0aGF0IGNsb25lIGlzIFRIRSBjbG9uZTogdGhlIHBhdGNoIHRyZWVzIGhvbGRcbiAgICogdGhlIGNhbGxlcidzIHJlZmVyZW5jZXMgKHNlZSB0aGUgY2xhc3MgaGVhZGVyKSwgc28gdGhpcyBsb29wIGlzIHRoZSBvbmVcbiAgICogcGxhY2UgdGhlIHJlY29yZCBpcyBkZXRhY2hlZCBmcm9tIHRoZW0uXG4gICAqL1xuICBwcml2YXRlIHRvQ2hhbmdlT25seVBheWxvYWQoKTogUm93cyB7XG4gICAgcmV0dXJuIHRoaXMuYWRtaXQoKGxvc3N5KSA9PiB0aGlzLmNoYW5nZU9ubHlSb3dzKGxvc3N5KSk7XG4gIH1cblxuICAvKiogVGhlICdmdWxsJyByb3dzOyBhIGZhbWlseSBpbiBgbG9zc3lgIGlzIHdyaXR0ZW4gYXMgaXRzIHJlYWQtYmFjaywgYXQgaXRzIGxhc3QgdG91Y2ggKHtAbGluayBlbWl0UmVhZEJhY2t9KS4gKi9cbiAgcHJpdmF0ZSBjaGFuZ2VPbmx5Um93cyhsb3NzeTogTG9zc3kgfCB1bmRlZmluZWQpOiBSb3dzIHtcbiAgICBjb25zdCByb3dzOiBSb3dzID0geyBvdmVyd3JpdGU6IHt9LCB1cGRhdGVzOiB7fSwgdHJhY2U6IFtdIH07XG4gICAgY29uc3QgeyBvdmVyd3JpdGUsIHVwZGF0ZXMsIHRyYWNlIH0gPSByb3dzO1xuICAgIC8vIFBlciBQQVRILCBkZWNpZGVkIG9uY2UgKDkuMjIuMSk6IGJhc2UgYW5kIGZpbmFsIHZhbHVlIGFyZSBmaXhlZCBhdFxuICAgIC8vIGNvbW1pdCwgc28gZXZlcnkgbGF0ZXIgb3Agb24gYSBwYXRoIGdldHMgdGhlIHZlcmRpY3QgaXRzIGZpcnN0IG9wIGdvdC5cbiAgICAvLyBgdW5kZWZpbmVkYCA9IG5vdCB5ZXQgZGVjaWRlZDsgdGhlIHN1cnZpdmluZyBwYXRocyBhcmUgdGhlIGB0cnVlYCBrZXlzLlxuICAgIGNvbnN0IHN1cnZpdmVzID0gbmV3IE1hcDxzdHJpbmcsIGJvb2xlYW4+KCk7XG4gICAgLy8gVGhlIHBhdGggdGhlIExBU1Qgc3Vydml2aW5nIG9wIGNvcGllZCBpbnRvIGVhY2ggcGF0Y2ggdHJlZSAoOS4yMi4xKS5cbiAgICAvLyBUaGUgdmFsdWUgYXQgYSBwYXRoIGlzIGZpeGVkIGF0IGNvbW1pdCwgc28gYW4gb3Agd2hvc2UgcHJlZGVjZXNzb3Igb25cbiAgICAvLyB0aGUgU0FNRSB0cmVlIGFscmVhZHkgY29waWVkIHRoYXQgcGF0aCB3b3VsZCB3cml0ZSB0aGUgc2FtZSBieXRlcyBvdmVyXG4gICAgLy8gdGhlIHNhbWUga2V5IOKAlCBpdCBrZWVwcyBpdHMgdHJhY2Ugcm93ICh0aGUgbG9nIGlzIGJ5dGUtaWRlbnRpY2FsKSBhbmRcbiAgICAvLyBwYXlzIG5vIHNlY29uZCBjbG9uZS4gVGhlIDkuMjIuMCBlbGVtZW50LXdyaXRlIGZ1bm5lbCBzdGFnZXMgTlxuICAgIC8vIHdob2xlLWFycmF5IHNldHMgb24gT05FIHBhdGg7IHRoaXMgaXMgd2hhdCBtYWtlcyB0aGF0IGNvbW1pdCBPKE4pXG4gICAgLy8gaW5zdGVhZCBvZiBPKE4gw5cgb3BzKS4gQ09OU0VDVVRJVkUgb25seSDigJQgYW4gb3Agb24gYW5vdGhlciBwYXRoIGluXG4gICAgLy8gYmV0d2VlbiBtYXkgaGF2ZSBjb2VyY2VkIG9yIGdyb3duIHRoaXMgb25lJ3MgY29udGFpbmVyIChhIGRlc2NlbmRhbnRcbiAgICAvLyBgbmF0aXZlU2V0YCB0aHJvdWdoIGEgcHJpbWl0aXZlLCBhIGBrZXk6IHVuZGVmaW5lZGAgc2hlbGwpIGFuZCB0aGVcbiAgICAvLyByZS1jb3B5IGlzIHdoYXQgcmVwYWlycyBpdDsgYSBgbWVyZ2VgIGJldHdlZW4gdHdvIHNldHMgdG91Y2hlcyB0aGVcbiAgICAvLyBvdGhlciB0cmVlIGFuZCBkb2VzIG5vdCBjb3VudC4gU2FtZSBsYXcgYXMgYHN1cGVyc2VkZWRCeU5leHRTZXRgLlxuICAgIGxldCBsYXN0U2V0UGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIGxldCBsYXN0TWVyZ2VQYXRoOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMub3BUcmFjZS5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3Qgb3AgPSB0aGlzLm9wVHJhY2VbaV07XG4gICAgICBjb25zdCBmYW1pbHkgPSBsb3NzeT8uZmFtaWxpZXMuZ2V0KGxvc3N5LnJvb3RPZi5nZXQob3AucGF0aCkgYXMgc3RyaW5nKTtcbiAgICAgIGlmIChmYW1pbHkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAoaSA9PT0gZmFtaWx5LnNsb3QpIHtcbiAgICAgICAgICB0aGlzLmVtaXRSZWFkQmFjayhmYW1pbHksIHJvd3MsICdmdWxsJyk7XG4gICAgICAgICAgbGFzdFNldFBhdGggPSBsYXN0TWVyZ2VQYXRoID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgbGV0IGtlZXAgPSBzdXJ2aXZlcy5nZXQob3AucGF0aCk7XG4gICAgICBpZiAoa2VlcCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGtlZXAgPSB0aGlzLmNoYW5nZWRTaW5jZUJhc2Uob3AucGF0aC5zcGxpdChERUxJTSkpO1xuICAgICAgICBzdXJ2aXZlcy5zZXQob3AucGF0aCwga2VlcCk7XG4gICAgICB9XG4gICAgICBpZiAoIWtlZXApIGNvbnRpbnVlOyAvLyBuby1vcCBvciB3cml0ZS10aGVuLXJldmVydCDihpIgbm8gbmV0IGNoYW5nZVxuXG4gICAgICB0cmFjZS5wdXNoKGZsYXR0ZW5lZFRyYWNlUm93KG9wKSk7XG4gICAgICBpZiAob3AudmVyYiA9PT0gJ21lcmdlJykge1xuICAgICAgICBpZiAobGFzdE1lcmdlUGF0aCA9PT0gb3AucGF0aCkgY29udGludWU7XG4gICAgICAgIGxhc3RNZXJnZVBhdGggPSBvcC5wYXRoO1xuICAgICAgICBjb25zdCBzZWdtZW50cyA9IG9wLnBhdGguc3BsaXQoREVMSU0pO1xuICAgICAgICBfc2V0KHVwZGF0ZXMsIHNlZ21lbnRzLCBzdHJ1Y3R1cmVkQ2xvbmUoX2dldCh0aGlzLnVwZGF0ZVBhdGNoLCBzZWdtZW50cykpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChsYXN0U2V0UGF0aCA9PT0gb3AucGF0aCkgY29udGludWU7XG4gICAgICAgIGxhc3RTZXRQYXRoID0gb3AucGF0aDtcbiAgICAgICAgY29uc3Qgc2VnbWVudHMgPSBvcC5wYXRoLnNwbGl0KERFTElNKTtcbiAgICAgICAgX3NldChvdmVyd3JpdGUsIHNlZ21lbnRzLCBzdHJ1Y3R1cmVkQ2xvbmUoX2dldCh0aGlzLm92ZXJ3cml0ZVBhdGNoLCBzZWdtZW50cykpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJvd3M7XG4gIH1cblxuICAvKipcbiAgICogRGVsdGEtZW5jb2RlZCBwYXlsb2FkIChgY29tbWl0VmFsdWVzOiAnZGVsdGEnYCwgIzEzYy1CKSDigJQgc2FtZSBuZXQtY2hhbmdlXG4gICAqIGZpbHRlciBhcyB7QGxpbmsgdG9DaGFuZ2VPbmx5UGF5bG9hZH0sIHRocmVlIGVuY29kaW5nIGRpZmZlcmVuY2VzOlxuICAgKlxuICAgKiAxLiAqKk9uZSB0cmFjZSBlbnRyeSBwZXIgc3Vydml2aW5nIHBhdGgqKiAodGhlIMKnMi41IGRlZHVwIHJ1bGUg4oCUIGBhcHBlbmRgXG4gICAqICAgIGlzIE5PVCBpZGVtcG90ZW50IG9uIHJlcGxheSwgc28gZHVwbGljYXRlIGVudHJpZXMgd291bGQgbXVsdGlwbHlcbiAgICogICAgdGFpbHMpLiBUaGUgdmVyYiBpcyByZXNvbHZlZCBmcm9tIHRoZSBwYXRoJ3Mgb3AgbWl4ICsgYmFzZeKGkmZpbmFsXG4gICAqICAgIHJlbGF0aW9uc2hpcDsgZW50cmllcyBhcmUgb3JkZXJlZCBieSBlYWNoIHBhdGgncyBMQVNUIHRvdWNoLFxuICAgKiAgICBwcmVzZXJ2aW5nIGxhc3Qtd3JpdGVyLXdpbnMgZm9yIG5lc3RlZC9vdmVybGFwcGluZyBwYXRocy5cbiAgICogMi4gKipWZXJiIHJlc29sdXRpb24gcGVyIHBhdGgqKiDigJQgZm9yIGEgcGF0aCB3aXRoIE5PIHN1cnZpdmluZyByZWxhdGl2ZVxuICAgKiAgICAoc2VlIDMpOlxuICAgKiAgICAtIGxhc3Qgb3AgYCdkZWxldGUnYCBBTkQgZmluYWwgdmFsdWUgZ29uZSDihpIgYGRlbGV0ZWAgKHRoZSBwYXRoIHN0YXlzXG4gICAqICAgICAgZW51bWVyYXRlZCBpbiBgb3ZlcndyaXRlYCB3aXRoIGB1bmRlZmluZWRgIGZvciBrZXktc2V0IGNvbnN1bWVycykuXG4gICAqICAgICAgUmVxdWlyZXMgdGhlIHBhcmVudCB0byBiZSBhIHJlYWwgY29udGFpbmVyIGluIHRoZSBiYXNlIOKAlCByZXBsYXkgdXNlc1xuICAgKiAgICAgIGBuYXRpdmVEZWxldGVgLCB3aGljaCBpcyBpbmVydCBvbiBhIHByaW1pdGl2ZS9hYnNlbnQgcGFyZW50LCB3aGVyZWFzXG4gICAqICAgICAgdGhlIGAnZnVsbCdgIGZsYXR0ZW5pbmcgKGBfc2V0YCBvZiBgdW5kZWZpbmVkYCkgQ09FUkNFUyB0aGF0IHBhcmVudFxuICAgKiAgICAgIGludG8gYW4gb2JqZWN0OyB3aGVuIHRoZXkgd291bGQgZGlzYWdyZWUgd2Uga2VlcCB0aGUgZmxhdHRlbmluZztcbiAgICogICAgLSBPTkxZIGAnbWVyZ2UnYCBvcHMg4oaSIGBtZXJnZWAgd2l0aCB0aGUgYWNjdW11bGF0ZWQgYHVwZGF0ZVBhdGNoYFxuICAgKiAgICAgIGRlbHRhO1xuICAgKiAgICAtIG90aGVyd2lzZSAoYHNldGAvbWl4ZWQpOiB0aGUgdmFsdWUgdGhlIHN0YWdlJ3MgJ2Z1bGwnIHJvd3MgZ2l2ZSB0aGVcbiAgICogICAgICBwYXRoICh7QGxpbmsgZnVsbFJvd3NWYWx1ZX0pLiBJZiBiYXNlIGFuZCB0aGF0IHZhbHVlIGFyZSBhcnJheXMgYW5kXG4gICAqICAgICAgYmFzZSBpcyBhIFNUUklDVCBQUkVGSVgg4oaSIGBhcHBlbmRgIHN0b3Jpbmcgb25seSB0aGUgdGFpbDsgZWxzZSBgc2V0YFxuICAgKiAgICAgIHN0b3JpbmcgdGhlIGZ1bGwgdmFsdWUuXG4gICAqIDMuICoqT1ZFUkxBUCBGQU1JTElFUyB0YWtlIHRoZSBmdWxsLXZhbHVlIGZhbGxiYWNrLioqIGBvdmVyd3JpdGVgIC9cbiAgICogICAgYHVwZGF0ZXNgIGFyZSBuZXN0ZWQgcGF0aCBUUkVFUywgc28gdHdvIHN1cnZpdmluZyBwYXRocyB3aGVyZSBvbmUgaXNcbiAgICogICAgYW4gYW5jZXN0b3Igb2YgdGhlIG90aGVyIChgYWAgYW5kIGBhLnBgKSBzaGFyZSBzdG9yYWdlLiBEZWx0YSdzXG4gICAqICAgIHBlci1wYXRoIGVuY29kaW5ncyB3b3VsZCBjbG9iYmVyIGVhY2ggb3RoZXIgdGhlcmUgKGFuIGBhcHBlbmRgXG4gICAqICAgIGFuY2VzdG9yIHN0b3JlcyBvbmx5IGEgVEFJTCwgYSBgZGVsZXRlYCBhbmNlc3RvciBgdW5kZWZpbmVkYCksIHNvIGV2ZXJ5XG4gICAqICAgIHBhdGggdGhhdCBoYXMgYSBzdXJ2aXZpbmcgYW5jZXN0b3IvZGVzY2VuZGFudCBpcyBjb21taXR0ZWQgYXMgYSBwbGFpblxuICAgKiAgICBgc2V0YCBvZiB0aGUgdmFsdWUgdGhlICdmdWxsJyByb3dzIGdpdmUgaXQsIGFuZCB0aGUgZmFtaWx5J3NcbiAgICogICAgc2hhbGxvd2VzdCBwYXRoICh3aG9zZSBzZXQgY292ZXJzIHRoZSB3aG9sZSBzdWJ0cmVlKSBpcyBlbWl0dGVkIExBU1QuXG4gICAqXG4gICAqIFRoZSByZXN1bHQgaXMgQURNSVRURUQgKHtAbGluayBhZG1pdH0pIGxpa2UgdGhlICdmdWxsJyBwYXlsb2FkOiBhIGNvbXBhY3RcbiAgICogcm93IGlzIGtlcHQgb25seSB3aGVyZSB0aGUgYnVuZGxlIHByb3ZhYmx5IGZvbGRzIGJhY2ssIGFuZCBhIGZhbWlseSB0aGF0XG4gICAqIGRvZXMgbm90IGlzIHJlY29yZGVkIGFzIHdoYXQgdGhlIHN0YWdlIHJlYWQuIFNvIGJvdGggZW5jb2RpbmdzIGNvbW1pdCB0aGVcbiAgICogdmFsdWUgdGhlIHN0YWdlIHJlYWQ7IGJlZm9yZSA5LjMwLjAgdGhleSBzaGFyZWQgYSByZXBsYXkgdGhhdCBkaWQgbm90XG4gICAqIChgcmVwbGF5UGF0aFZlcmJzYCAvIGByZXBsYXlGYW1pbHlWZXJic2AsIGRlbGV0ZWQpLlxuICAgKi9cbiAgcHJpdmF0ZSB0b0RlbHRhUGF5bG9hZCgpOiBSb3dzIHtcbiAgICBjb25zdCBmdWxsVmFsdWVBdCA9IHRoaXMuZnVsbFJvd3NWYWx1ZSgpO1xuICAgIHJldHVybiB0aGlzLmFkbWl0KChsb3NzeSkgPT4gdGhpcy5kZWx0YVJvd3MobG9zc3ksIGZ1bGxWYWx1ZUF0KSk7XG4gIH1cblxuICAvKiogVGhlIGRlbHRhIHJvd3M7IGEgZmFtaWx5IGluIGBsb3NzeWAgaXMgd3JpdHRlbiBhcyBpdHMgcmVhZC1iYWNrLCBhdCBpdHMgbGFzdCB0b3VjaCAoe0BsaW5rIGVtaXRSZWFkQmFja30pLiAqL1xuICBwcml2YXRlIGRlbHRhUm93cyhsb3NzeTogTG9zc3kgfCB1bmRlZmluZWQsIGZ1bGxWYWx1ZUF0OiAoc2VnbWVudHM6IHN0cmluZ1tdKSA9PiB1bmtub3duKTogUm93cyB7XG4gICAgY29uc3Qgcm93czogUm93cyA9IHsgb3ZlcndyaXRlOiB7fSwgdXBkYXRlczoge30sIHRyYWNlOiBbXSB9O1xuICAgIGNvbnN0IHsgb3ZlcndyaXRlLCB1cGRhdGVzLCB0cmFjZSB9ID0gcm93cztcbiAgICBjb25zdCBpbkxvc3N5ID0gKHBhdGg6IHN0cmluZykgPT4gbG9zc3k/LmZhbWlsaWVzLmhhcyhsb3NzeS5yb290T2YuZ2V0KHBhdGgpIGFzIHN0cmluZykgPT09IHRydWU7XG4gICAgY29uc3Qgc3Vydml2b3JzID0gdGhpcy5uZXRDaGFuZ2VTdXJ2aXZvcnModGhpcy5vcHNCeVBhdGgoKSkuZmlsdGVyKChzKSA9PiAhaW5Mb3NzeShzLnBhdGgpKTtcbiAgICBjb25zdCB7IHJvb3RPZiwgYnlSb290IH0gPSBncm91cEludG9GYW1pbGllcyhzdXJ2aXZvcnMsIG5ldyBTZXQoc3Vydml2b3JzLm1hcCgocykgPT4gcy5wYXRoKSkpO1xuXG4gICAgLy8gVEhFIFZFUkIgQ0hPSUNFIOKAlCB0aGUgZGVsdGEgZW5jb2RlciBwaWNrcyBhIHZlcmIgcGVyIHBhdGg7IHRoZSBWQUxVRVNcbiAgICAvLyBpdCBlbmNvZGVzIGNvbWUgZnJvbSB0aGUgb25lIHJlcGxheSAoYGZ1bGxWYWx1ZUF0YCksIG5ldmVyIGEgcmVwbGljYSBvZlxuICAgIC8vIHRoZSB2ZXJiIGxhdyAoOS4zMC4wOiBDTEFVREUubWQncyB2ZXJiLXN3aXRjaCByZXBsaWNhcyBsb3N0IHR3byBoZXJlKS5cbiAgICBjb25zdCBlbWl0ID0gKHM6IFN1cnZpdm9yKTogdm9pZCA9PiB7XG4gICAgICBjb25zdCB7IHBhdGgsIHNlZ21lbnRzLCB2ZXJicywgYmVmb3JlIH0gPSBzO1xuICAgICAgY29uc3QgcHJvdiA9IHByb3ZlbmFuY2Uocy5yZWFkS2V5cyk7XG4gICAgICBpZiAoKGJ5Um9vdC5nZXQocm9vdE9mLmdldChwYXRoKSBhcyBzdHJpbmcpIGFzIFN1cnZpdm9yW10pLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgLy8gUnVsZSAzIOKAlCBvbmUgY29oZXJlbnQgdHJlZTogZXZlcnkgbWVtYmVyIGEgc2V0IG9mIGl0cyB2YWx1ZS5cbiAgICAgICAgdHJhY2UucHVzaCh7IHBhdGgsIHZlcmI6ICdzZXQnLCAuLi5wcm92IH0pO1xuICAgICAgICBfc2V0KG92ZXJ3cml0ZSwgc2VnbWVudHMsIHN0cnVjdHVyZWRDbG9uZShmdWxsVmFsdWVBdChzZWdtZW50cykpKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgbGFzdFZlcmIgPSB2ZXJic1t2ZXJicy5sZW5ndGggLSAxXTtcbiAgICAgIGlmIChsYXN0VmVyYiA9PT0gJ2RlbGV0ZScgJiYgcy5hZnRlciA9PT0gdW5kZWZpbmVkICYmIHRoaXMuZGVsZXRlUmVwbGF5c0FzRmxhdHRlbmluZyhzZWdtZW50cykpIHtcbiAgICAgICAgLy8gUmVhbCBkZWxldGlvbiDigJQgcmVwbGF5IHJlbW92ZXMgdGhlIGtleS4gS2VlcCB0aGUgcGF0aCBlbnVtZXJhdGVkXG4gICAgICAgIC8vIGluIGBvdmVyd3JpdGVgICh1bmRlZmluZWQpIHNvIE9iamVjdC5rZXlzIGNvbnN1bWVycyBzZWUgaXQuXG4gICAgICAgIHRyYWNlLnB1c2goeyBwYXRoLCB2ZXJiOiAnZGVsZXRlJywgLi4ucHJvdiB9KTtcbiAgICAgICAgX3NldChvdmVyd3JpdGUsIHNlZ21lbnRzLCB1bmRlZmluZWQpO1xuICAgICAgfSBlbHNlIGlmICh2ZXJicy5ldmVyeSgodikgPT4gdiA9PT0gJ21lcmdlJykpIHtcbiAgICAgICAgdHJhY2UucHVzaCh7IHBhdGgsIHZlcmI6ICdtZXJnZScsIC4uLnByb3YgfSk7XG4gICAgICAgIF9zZXQodXBkYXRlcywgc2VnbWVudHMsIHN0cnVjdHVyZWRDbG9uZShfZ2V0KHRoaXMudXBkYXRlUGF0Y2gsIHNlZ21lbnRzKSkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcHVzaFZhbHVlUm93KHJvd3MsIHBhdGgsIHNlZ21lbnRzLCBiZWZvcmUsIGZ1bGxWYWx1ZUF0KHNlZ21lbnRzKSwgcHJvdiwgdGhpcy5tYXJrZWRCZWxvdyhwYXRoKSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIEEgZmFtaWx5IHRoYXQgZGlkIG5vdCBmb2xkIGJhY2sgdGFrZXMgaXRzIHBsYWNlIGJ5IGl0cyBsYXN0IHRvdWNoLlxuICAgIGNvbnN0IHBlbmRpbmcgPSBsb3NzeSA9PT0gdW5kZWZpbmVkID8gW10gOiBbLi4ubG9zc3kuZmFtaWxpZXMudmFsdWVzKCldLnNvcnQoKGEsIGIpID0+IGEuc2xvdCAtIGIuc2xvdCk7XG4gICAgbGV0IG5leHQgPSAwO1xuICAgIGNvbnN0IGZsdXNoQmVmb3JlID0gKHRvdWNoOiBudW1iZXIpOiB2b2lkID0+IHtcbiAgICAgIHdoaWxlIChuZXh0IDwgcGVuZGluZy5sZW5ndGggJiYgcGVuZGluZ1tuZXh0XS5zbG90IDwgdG91Y2gpIHRoaXMuZW1pdFJlYWRCYWNrKHBlbmRpbmdbbmV4dCsrXSwgcm93cywgJ2RlbHRhJyk7XG4gICAgfTtcbiAgICBlbWl0SW5GYW1pbHlPcmRlcihzdXJ2aXZvcnMsIHJvb3RPZiwgYnlSb290LCBlbWl0LCBmbHVzaEJlZm9yZSk7XG4gICAgZmx1c2hCZWZvcmUoSW5maW5pdHkpO1xuICAgIHJldHVybiByb3dzO1xuICB9XG5cbiAgLy8g4pSA4pSAIFRoZSBhZG1pdHRlZCByZWNvcmQgKDkuMzAuMCkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqXG4gICAqIFRIRSBBRE1JU1NJT04g4oCUIGEgY29tbWl0IGlzIGFkbWl0dGVkIG9ubHkgaWYgaXRzIGJ1bmRsZSBmb2xkcyBiYWNrIHRvIHRoZVxuICAgKiBzdGFnZSdzIHJlYWQteW91ci13cml0ZXMgdmlldyBhdCBldmVyeSBwYXRoIHRoZSBzdGFnZSB0b3VjaGVkLiBgYnVpbGRgXG4gICAqIGxheXMgdGhlIHJvd3Mgb3V0IChvbmUgZW5jb2RlcjogYCdmdWxsJ2Agb3IgYCdkZWx0YSdgKTsgdGhlIGNhbmRpZGF0ZSBpc1xuICAgKiBjaGVja2VkICh7QGxpbmsgbG9zc3lGYW1pbGllc30pLCBhbmQgd2hlbiBzb21lIGZhbWlseSdzIHJvd3MgZG8gbm90IGZvbGRcbiAgICogYmFjayB0aGUgcm93cyBhcmUgbGFpZCBvdXQgYWdhaW4gd2l0aCB0aG9zZSBmYW1pbGllcyB3cml0dGVuIGFzIHdoYXQgdGhlXG4gICAqIHN0YWdlIHJlYWQgKHtAbGluayBlbWl0UmVhZEJhY2t9KSDigJQgZXZlcnkgb3RoZXIgZmFtaWx5J3MgYnl0ZXMgZXhhY3RseSBhc1xuICAgKiB0aGUgZmlyc3QgbGF5b3V0IG1hZGUgdGhlbS5cbiAgICovXG4gIHByaXZhdGUgYWRtaXQoYnVpbGQ6IChsb3NzeTogTG9zc3kgfCB1bmRlZmluZWQpID0+IFJvd3MpOiBSb3dzIHtcbiAgICBjb25zdCBjYW5kaWRhdGUgPSBidWlsZCh1bmRlZmluZWQpO1xuICAgIGNvbnN0IGxvc3N5ID0gdGhpcy5sb3NzeUZhbWlsaWVzKGNhbmRpZGF0ZSk7XG4gICAgcmV0dXJuIGxvc3N5ID09PSB1bmRlZmluZWQgPyBjYW5kaWRhdGUgOiBidWlsZChsb3NzeSk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGZhbWlsaWVzIHdob3NlIHJvd3MgZG8gbm90IGZvbGQgYmFjayB0byB3aGF0IHRoZSBzdGFnZSByZWFkIOKAlFxuICAgKiBgdW5kZWZpbmVkYCB3aGVuIHRoZXJlIGFyZSBub25lIChgYWRtaXNzaW9uLnRzIMK3IGxvc3N5RmFtaWxpZXNgOiB0aGVcbiAgICogY2FuZGlkYXRlIHJlcGxheWVkIG9udG8gdGhlIGRpZmYgYmFzZSBieSBgZHJ5Rm9sZGAsIGV2ZXJ5IGZhbWlseSBvZlxuICAgKiB0b3VjaGVkIHBhdGhzIGNvbXBhcmVkIHdpdGggdGhlIHdvcmtpbmcgY29weSBhdCBpdHMgcm9vdCBhbmQgb24gdGhlIHdheVxuICAgKiBkb3duIHRvIGl0KS5cbiAgICpcbiAgICogV2l0aG91dCBhIGZvbGQsIHdoZW4gdGhlIHN0YWdlIHN0YWdlZCBubyBgbWVyZ2VgIGFuZCBubyBuZXN0ZWQgb3A6IGl0c1xuICAgKiByb3dzIGFyZSBgc2V0YCAvIGBkZWxldGVgIG9mIGtleXMgZGlyZWN0bHkgdW5kZXIgaXRzIGFkZHJlc3MsIGVhY2hcbiAgICogd3JpdGluZyB0aGUgU0FNRSB2YWx1ZSBpbnRvIGB3b3JraW5nQ29weWAgYW5kIGBvdmVyd3JpdGVQYXRjaGAg4oCUIHRoZVxuICAgKiByZWNvcmQgaXMgdGhlIHJlYWQtYmFjayBieSBjb25zdHJ1Y3Rpb24gKHRoZSBwcm9wZXJ0eSdzIFJPT1QtT05MWSBhcm1cbiAgICogcGlucyB0aGlzKS4gVGhhdCBrZWVwcyB0aGUgY29tbWl0IG9mIHRoZSB0eXBlZCBzY29wZSdzIHJvb3Qta2V5IHdyaXRlc1xuICAgKiBleGFjdGx5IGFzIGNoZWFwIGFzIGl0IHdhcy5cbiAgICovXG4gIHByaXZhdGUgbG9zc3lGYW1pbGllcyhjYW5kaWRhdGU6IFJvd3MpOiBMb3NzeSB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHRoaXMuc3RhZ2VkTWVyZ2VzID09PSAwICYmIHRoaXMubmVzdGVkT3BzID09PSAwKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHJldHVybiBsb3NzeUZhbWlsaWVzKGNhbmRpZGF0ZSwgdGhpcy5iYXNlU25hcHNob3QsIHRoaXMud29ya2luZ0NvcHksIHRoaXMub3BUcmFjZSwgdGhpcy5hZGRyZXNzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIGZhbWlseSB3aG9zZSByb3dzIGRpZCBub3QgZm9sZCBiYWNrLCB3cml0dGVuIGFzIHdoYXQgdGhlIHN0YWdlIHJlYWQ6XG4gICAqIG9uZSBgc2V0YCByb3cgcGVyIG1lbWJlciB0aGF0IGNoYW5nZWQgKGRlc2NlbmRhbnRzIGJ5IGxhc3QgdG91Y2gsIGVhY2hcbiAgICogd2l0aCBpdHMgb3duIHJlYWQgcHJlZml4KSwgdGhlIFJPT1QgbGFzdCwgYW5kIHRoZSByb290J3MgcmVhZC1iYWNrIHZhbHVlXG4gICAqIGluIGBvdmVyd3JpdGVgIOKAlCBvbmUgY29oZXJlbnQgdHJlZSwgc28gbm8gcm93IGNhbiBjbG9iYmVyIGFub3RoZXIuIFRoZVxuICAgKiByb290J3Mgcm93IGlzIHdyaXR0ZW4gZXZlbiB3aGVuIHRoZSByb290IGl0c2VsZiBkaWQgbm90IGNoYW5nZTogaXQgaXMgdGhlXG4gICAqIHJvdyB0aGF0IGNhcnJpZXMgdGhlIGZhbWlseSdzIHJlYWQtYmFjayAoYW5kIHRoZSBjb250YWluZXJzIEwtMSdzIGRyb3BwZWRcbiAgICogb3AgbGVmdCkuIEEgbG9uZSByb290IHVuZGVyIGAnZGVsdGEnYCBrZWVwcyB0aGUgY29tcGFjdCBgYXBwZW5kYCB3aGVuIHRoZVxuICAgKiB2YWx1ZSBpdCByZWFkIGlzIGl0cyBiYXNlIHBsdXMgYSB0YWlsLlxuICAgKi9cbiAgcHJpdmF0ZSBlbWl0UmVhZEJhY2soZmFtaWx5OiBGYW1pbHksIHJvd3M6IFJvd3MsIGVuY29kaW5nOiBDb21taXRWYWx1ZXNNb2RlKTogdm9pZCB7XG4gICAgbGV0IHJvb3Q6IE1lbWJlciA9IGZhbWlseS5tZW1iZXJzWzBdO1xuICAgIGxldCBjaGFuZ2VkID0gMDtcbiAgICBmb3IgKGNvbnN0IG0gb2YgZmFtaWx5Lm1lbWJlcnMpIHtcbiAgICAgIGlmIChtLnBhdGggPT09IGZhbWlseS5yb290KSB7XG4gICAgICAgIHJvb3QgPSBtO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmICghdGhpcy5jaGFuZ2VkU2luY2VCYXNlKG0ucGF0aC5zcGxpdChERUxJTSkpKSBjb250aW51ZTtcbiAgICAgIHJvd3MudHJhY2UucHVzaCh7IHBhdGg6IG0ucGF0aCwgdmVyYjogJ3NldCcsIC4uLnByb3ZlbmFuY2UobS5yZWFkS2V5cykgfSk7XG4gICAgICBjaGFuZ2VkKys7XG4gICAgfVxuICAgIGNvbnN0IGFmdGVyID0gX2dldCh0aGlzLndvcmtpbmdDb3B5LCBmYW1pbHkucm9vdFNlZ21lbnRzKTtcbiAgICBpZiAoZW5jb2RpbmcgPT09ICdkZWx0YScgJiYgY2hhbmdlZCA9PT0gMCAmJiBhZnRlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBiZWZvcmUgPSBfZ2V0KHRoaXMuYmFzZVNuYXBzaG90LCBmYW1pbHkucm9vdFNlZ21lbnRzKTtcbiAgICAgIHB1c2hWYWx1ZVJvdyhcbiAgICAgICAgcm93cyxcbiAgICAgICAgZmFtaWx5LnJvb3QsXG4gICAgICAgIGZhbWlseS5yb290U2VnbWVudHMsXG4gICAgICAgIGJlZm9yZSxcbiAgICAgICAgYWZ0ZXIsXG4gICAgICAgIHByb3ZlbmFuY2Uocm9vdC5yZWFkS2V5cyksXG4gICAgICAgIHRoaXMubWFya2VkQmVsb3coZmFtaWx5LnJvb3QpLFxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcm93cy50cmFjZS5wdXNoKHsgcGF0aDogZmFtaWx5LnJvb3QsIHZlcmI6ICdzZXQnLCAuLi5wcm92ZW5hbmNlKHJvb3QucmVhZEtleXMpIH0pO1xuICAgIC8vIFRoZSBjbG9uZSB0aGUgY2hlY2sgdG9vayAoYGFkbWlzc2lvbi50cyDCtyBmb2xkc0JhY2tgKSwgd2hlbiBpdCB0b29rIG9uZS5cbiAgICBfc2V0KHJvd3Mub3ZlcndyaXRlLCBmYW1pbHkucm9vdFNlZ21lbnRzLCBmYW1pbHkuaGVsZCAhPT0gdW5kZWZpbmVkID8gZmFtaWx5LmhlbGQudmFsdWUgOiBzdHJ1Y3R1cmVkQ2xvbmUoYWZ0ZXIpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgdmFsdWUgdGhlIHN0YWdlJ3MgJ2Z1bGwnIHJvd3MgZ2l2ZSBhIHBhdGgg4oCUIHdoYXQgdGhlIGRlbHRhIGVuY29kZXJcbiAgICogY29tbWl0cyBmb3IgYSBmYW1pbHkgbWVtYmVyIG9yIGEgcGF0aCB3aXRoIGEgYHNldGAg4oCUIHJlYWQgZnJvbSBPTkVcbiAgICoge0BsaW5rIGRyeUZvbGR9IG9mIHRob3NlIHJvd3Mgb3ZlciB0aGUgcGF0Y2ggdHJlZXMgdGhlbXNlbHZlcywgdGFrZW4gdGhlXG4gICAqIGZpcnN0IHRpbWUgaXQgaXMgYXNrZWQuIEJ5IHJlZmVyZW5jZSwgYXMgdGhlIHN0YWdlIGhlbGQgdGhlbTogYW4gZWxlbWVudFxuICAgKiBhIGBzZXRgIGFuZCBhIGBtZXJnZWAgb2Ygb25lIHBhdGggc2hhcmUgc3RheXMgb25lIGVsZW1lbnQuIEEgc3RhZ2UgdGhhdFxuICAgKiBzdGFnZWQgbm8gYG1lcmdlYCBhbmQgbm8gbmVzdGVkIG9wIG5lZWRzIG5vIGZvbGQg4oCUIGEgcGF0aCdzIHZhbHVlIGlzIGl0c1xuICAgKiBsYXN0IHN0YWdlZCB2YWx1ZS4gKEJlZm9yZSA5LjMwLjA6IHR3byByZXBsaWNhcyBvZiB0aGUgdmVyYiBsYXcsXG4gICAqIGByZXBsYXlQYXRoVmVyYnNgIGFuZCBgcmVwbGF5RmFtaWx5VmVyYnNgLilcbiAgICovXG4gIHByaXZhdGUgZnVsbFJvd3NWYWx1ZSgpOiAoc2VnbWVudHM6IHN0cmluZ1tdKSA9PiB1bmtub3duIHtcbiAgICBpZiAodGhpcy5zdGFnZWRNZXJnZXMgPT09IDAgJiYgdGhpcy5uZXN0ZWRPcHMgPT09IDApIHJldHVybiAoc2VnbWVudHMpID0+IF9nZXQodGhpcy5vdmVyd3JpdGVQYXRjaCwgc2VnbWVudHMpO1xuICAgIGxldCBmb2xkOiB1bmtub3duO1xuICAgIHJldHVybiAoc2VnbWVudHMpID0+IHtcbiAgICAgIGZvbGQgPz89IGRyeUZvbGQodGhpcy5iYXNlU25hcHNob3QsIHRoaXMudXBkYXRlUGF0Y2gsIHRoaXMub3ZlcndyaXRlUGF0Y2gsIHRoaXMuZnVsbFJvd3MoKSk7XG4gICAgICByZXR1cm4gX2dldChmb2xkLCBzZWdtZW50cyk7XG4gICAgfTtcbiAgfVxuXG4gIC8qKiBUaGUgc3RhZ2UncyAnZnVsbCcgcm93czogZXZlcnkgb3Agb24gYSBwYXRoIHRoZSBuZXQtY2hhbmdlIGZpbHRlciBrZWVwcywgYSBgZGVsZXRlYCBzcGVsbGVkIGBzZXRgLiAqL1xuICBwcml2YXRlIGZ1bGxSb3dzKCk6IFRyYWNlRW50cnlbXSB7XG4gICAgY29uc3Qga2VlcCA9IG5ldyBNYXA8c3RyaW5nLCBib29sZWFuPigpO1xuICAgIGNvbnN0IHJvd3M6IFRyYWNlRW50cnlbXSA9IFtdO1xuICAgIGZvciAoY29uc3Qgb3Agb2YgdGhpcy5vcFRyYWNlKSB7XG4gICAgICBsZXQgayA9IGtlZXAuZ2V0KG9wLnBhdGgpO1xuICAgICAgaWYgKGsgPT09IHVuZGVmaW5lZCkga2VlcC5zZXQob3AucGF0aCwgKGsgPSB0aGlzLmNoYW5nZWRTaW5jZUJhc2Uob3AucGF0aC5zcGxpdChERUxJTSkpKSk7XG4gICAgICBpZiAoaykgcm93cy5wdXNoKHsgcGF0aDogb3AucGF0aCwgdmVyYjogb3AudmVyYiA9PT0gJ21lcmdlJyA/ICdtZXJnZScgOiAnc2V0JyB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHJvd3M7XG4gIH1cblxuICAvKipcbiAgICogRGlkIHRoZSBzdGFnZSBjaGFuZ2UgdGhlIHZhbHVlIGF0IGBzZWdtZW50c2A/IEJhc2UgYW5kIGZpbmFsIHZhbHVlIGFyZVxuICAgKiBmaXhlZCBhdCBjb21taXQsIHNvIHRoaXMgaXMgdGhlIE9ORSBuZXQtY2hhbmdlIHZlcmRpY3QgYm90aCBwYXlsb2FkXG4gICAqIGVuY29kaW5ncyBhcHBseSAoYSBuby1vcCB3cml0ZSBhbmQgYSB3cml0ZS10aGVuLXJldmVydCBib3RoIGZhaWwgaXQpLlxuICAgKi9cbiAgcHJpdmF0ZSBjaGFuZ2VkU2luY2VCYXNlKHNlZ21lbnRzOiBzdHJpbmdbXSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhZGVlcEVxdWFsKF9nZXQodGhpcy5iYXNlU25hcHNob3QsIHNlZ21lbnRzKSwgX2dldCh0aGlzLndvcmtpbmdDb3B5LCBzZWdtZW50cykpO1xuICB9XG5cbiAgLyoqXG4gICAqIFBhdGgg4oaSIGl0cyBvcC12ZXJiIHNlcXVlbmNlLCBvcmRlcmVkIGJ5IExBU1QgdG91Y2ggKGRlbGV0ZSArIHJlLWluc2VydFxuICAgKiBtb3ZlcyBhIHJlLXRvdWNoZWQgcGF0aCB0byB0aGUgZW5kIG9mIHRoZSBNYXAncyBpbnNlcnRpb24gb3JkZXIg4oCUXG4gICAqIHByZXNlcnZpbmcgbGFzdC13cml0ZXItd2lucyBmb3IgbmVzdGVkL292ZXJsYXBwaW5nIHBhdGhzKS4gUGVyLXdyaXRlXG4gICAqIHByb3ZlbmFuY2UgKCNQMSk6IHRoZSBMQVNUIG9wJ3MgcmVhZEtleXMgaXMga2VwdCDigJQgcmVhZCBwcmVmaXhlcyBvbmx5IGdyb3dcbiAgICogd2l0aGluIGEgc3RhZ2UsIHNvIGxhc3QgPT0gdW5pb24gYWNyb3NzIHRoZSBwYXRoLlxuICAgKi9cbiAgcHJpdmF0ZSBvcHNCeVBhdGgoKTogTWFwPHN0cmluZywgeyB2ZXJiczogT3BWZXJiW107IHJlYWRLZXlzPzogc3RyaW5nW107IGxhc3Q6IG51bWJlciB9PiB7XG4gICAgY29uc3QgYnlQYXRoID0gbmV3IE1hcDxzdHJpbmcsIHsgdmVyYnM6IE9wVmVyYltdOyByZWFkS2V5cz86IHN0cmluZ1tdOyBsYXN0OiBudW1iZXIgfT4oKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMub3BUcmFjZS5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3Qgb3AgPSB0aGlzLm9wVHJhY2VbaV07XG4gICAgICBjb25zdCBwcmV2ID0gYnlQYXRoLmdldChvcC5wYXRoKTtcbiAgICAgIGlmIChwcmV2KSB7XG4gICAgICAgIHByZXYudmVyYnMucHVzaChvcC52ZXJiKTtcbiAgICAgICAgcHJldi5sYXN0ID0gaTtcbiAgICAgICAgaWYgKG9wLnJlYWRLZXlzICE9PSB1bmRlZmluZWQpIHByZXYucmVhZEtleXMgPSBvcC5yZWFkS2V5cztcbiAgICAgICAgYnlQYXRoLmRlbGV0ZShvcC5wYXRoKTtcbiAgICAgICAgYnlQYXRoLnNldChvcC5wYXRoLCBwcmV2KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGJ5UGF0aC5zZXQob3AucGF0aCwge1xuICAgICAgICAgIHZlcmJzOiBbb3AudmVyYl0sXG4gICAgICAgICAgbGFzdDogaSxcbiAgICAgICAgICAuLi4ob3AucmVhZEtleXMgIT09IHVuZGVmaW5lZCAmJiB7IHJlYWRLZXlzOiBvcC5yZWFkS2V5cyB9KSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBieVBhdGg7XG4gIH1cblxuICAvKiogVGhlIG5ldC1jaGFuZ2UgZmlsdGVyIOKAlCBpZGVudGljYWwgdG8gJ2Z1bGwnICh7QGxpbmsgY2hhbmdlZFNpbmNlQmFzZX0pLiBTdXJ2aXZvcnMga2VlcCBsYXN0LXRvdWNoIG9yZGVyLiAqL1xuICBwcml2YXRlIG5ldENoYW5nZVN1cnZpdm9ycyhieVBhdGg6IE1hcDxzdHJpbmcsIHsgdmVyYnM6IE9wVmVyYltdOyByZWFkS2V5cz86IHN0cmluZ1tdOyBsYXN0OiBudW1iZXIgfT4pOiBTdXJ2aXZvcltdIHtcbiAgICBjb25zdCBzdXJ2aXZvcnM6IFN1cnZpdm9yW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IFtwYXRoLCB7IHZlcmJzLCByZWFkS2V5cywgbGFzdCB9XSBvZiBieVBhdGgpIHtcbiAgICAgIGNvbnN0IHNlZ21lbnRzID0gcGF0aC5zcGxpdChERUxJTSk7XG4gICAgICBpZiAoIXRoaXMuY2hhbmdlZFNpbmNlQmFzZShzZWdtZW50cykpIGNvbnRpbnVlOyAvLyBuby1vcCBvciB3cml0ZS10aGVuLXJldmVydCDihpIgbm8gbmV0IGNoYW5nZVxuICAgICAgY29uc3QgYmVmb3JlID0gX2dldCh0aGlzLmJhc2VTbmFwc2hvdCwgc2VnbWVudHMpO1xuICAgICAgY29uc3QgYWZ0ZXIgPSBfZ2V0KHRoaXMud29ya2luZ0NvcHksIHNlZ21lbnRzKTtcbiAgICAgIHN1cnZpdm9ycy5wdXNoKHsgcGF0aCwgc2VnbWVudHMsIHZlcmJzLCByZWFkS2V5cywgbGFzdCwgYmVmb3JlLCBhZnRlciB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHN1cnZpdm9ycztcbiAgfVxuXG4gIC8qKlxuICAgKiBNYXkgYSBzdGFnZWQgYGRlbGV0ZWAgYXQgdGhpcyBwYXRoIGNvbW1pdCBhcyB0aGUgYCdkZWxldGUnYCB2ZXJiP1xuICAgKlxuICAgKiBPbmx5IHdoZW4gcmVtb3ZpbmcgdGhlIGtleSBhbmQgdGhlIGAnZnVsbCdgIG1vZGUncyBmbGF0dGVuaW5nIChgX3NldGAgb2ZcbiAgICogYHVuZGVmaW5lZGApIGxhbmQgaW4gdGhlIHNhbWUgcGxhY2UuIFRoZXkgZGl2ZXJnZSB3aGVuIHRoZSBwYXJlbnQgaXMgbm90XG4gICAqIGEgY29udGFpbmVyOiBgbmF0aXZlRGVsZXRlYCB3YWxrcyBhd2F5IHVudG91Y2hlZCwgd2hpbGUgYG5hdGl2ZVNldGBcbiAgICogQ09FUkNFUyB0aGUgcHJpbWl0aXZlIHBhcmVudCBpbnRvIGFuIG9iamVjdCB0byBob2xkIHRoZSBrZXkuIENvbW1pdHRpbmdcbiAgICogYGRlbGV0ZWAgdGhlcmUgd291bGQgc2lsZW50bHkgZHJvcCBhIHN0YXRlIGNoYW5nZSB0aGUgc3RhZ2UgcmVhbGx5IG1hZGUsXG4gICAqIHNvIHRob3NlIChwYXRob2xvZ2ljYWwpIGRlbGV0ZXMga2VlcCB0aGUgaGlzdG9yaWNhbCBmbGF0dGVuaW5nLlxuICAgKi9cbiAgcHJpdmF0ZSBkZWxldGVSZXBsYXlzQXNGbGF0dGVuaW5nKHNlZ21lbnRzOiBzdHJpbmdbXSk6IGJvb2xlYW4ge1xuICAgIGlmIChzZWdtZW50cy5sZW5ndGggPT09IDEpIHJldHVybiB0cnVlOyAvLyBwYXJlbnQgaXMgdGhlIHN0YXRlIHJvb3Qg4oCUIGFsd2F5cyBhIGNvbnRhaW5lclxuICAgIGNvbnN0IHBhcmVudCA9IF9nZXQodGhpcy5iYXNlU25hcHNob3QsIHNlZ21lbnRzLnNsaWNlKDAsIC0xKSk7XG4gICAgcmV0dXJuIHBhcmVudCAhPT0gbnVsbCAmJiB0eXBlb2YgcGFyZW50ID09PSAnb2JqZWN0JztcbiAgfVxufVxuXG4vKipcbiAqIEhpc3RvcmljYWwgZmxhdHRlbmluZyBmb3IgdGhlIGAnZnVsbCdgIHBheWxvYWQ6IGFuIGV4cGxpY2l0IGRlbGV0ZSBjb21taXRzXG4gKiBhcyBzZXQtb2YtdW5kZWZpbmVkLiBQZXItd3JpdGUgcHJvdmVuYW5jZSAoI1AxKSByaWRlcyBlYWNoIHN1cnZpdmluZyBlbnRyeVxuICogdW50b3VjaGVkLlxuICovXG5mdW5jdGlvbiBmbGF0dGVuZWRUcmFjZVJvdyhvcDogeyBwYXRoOiBzdHJpbmc7IHZlcmI6IE9wVmVyYjsgcmVhZEtleXM/OiBzdHJpbmdbXSB9KTogVHJhY2VFbnRyeSB7XG4gIHJldHVybiBvcC52ZXJiID09PSAnZGVsZXRlJ1xuICAgID8geyBwYXRoOiBvcC5wYXRoLCB2ZXJiOiAnc2V0JyBhcyBjb25zdCwgLi4uKG9wLnJlYWRLZXlzICE9PSB1bmRlZmluZWQgJiYgeyByZWFkS2V5czogb3AucmVhZEtleXMgfSkgfVxuICAgIDogb3A7XG59XG5cbi8qKiBBIHJvdydzIGByZWFkS2V5c2AgZnJhZ21lbnQg4oCUIGFic2VudCB1bmxlc3MgdGhlIHByb3ZlbmFuY2UgZGlhbCByZWNvcmRlZCBvbmUgKCNQMSkuICovXG5mdW5jdGlvbiBwcm92ZW5hbmNlKHJlYWRLZXlzOiBzdHJpbmdbXSB8IHVuZGVmaW5lZCk6IHsgcmVhZEtleXM6IHN0cmluZ1tdIH0gfCB1bmRlZmluZWQge1xuICByZXR1cm4gcmVhZEtleXMgIT09IHVuZGVmaW5lZCA/IHsgcmVhZEtleXMgfSA6IHVuZGVmaW5lZDtcbn1cbiJdfQ==
|
|
@@ -10,6 +10,8 @@
|
|
|
10
10
|
* (`merge.ts`) at L0, and the verb law (`verbs.ts`) at L1 — `applySmartMerge`,
|
|
11
11
|
* `nextGeneration`, `applySmartMergeInto`, `dryFold`, `supersededByNextSet`.
|
|
12
12
|
* The log's scrub, `redactPatch`, moved to its owner `redaction.ts` in 9.33.0.
|
|
13
|
+
* The writers take an ADDRESS, a path prefix their caller computed, and never
|
|
14
|
+
* name one (C2: the engine decides where a stage writes, `StageContext · address`).
|
|
13
15
|
* Zero external dependencies.
|
|
14
16
|
*/
|
|
15
17
|
export { deepEqual } from './equality.js';
|
|
@@ -20,24 +22,26 @@ type NestedObject = {
|
|
|
20
22
|
[key: string]: any;
|
|
21
23
|
};
|
|
22
24
|
/**
|
|
23
|
-
*
|
|
24
|
-
*
|
|
25
|
+
* The two places a value at `path` can sit: under `address` (`runPath`, absent
|
|
26
|
+
* for the root address `[]`) and at the root (`globalPath`). `address` is a
|
|
27
|
+
* path prefix the caller computed — for the engine, a frame's run namespace
|
|
28
|
+
* (`StageContext · address`, C2).
|
|
25
29
|
*/
|
|
26
|
-
export declare function getRunAndGlobalPaths(
|
|
30
|
+
export declare function getRunAndGlobalPaths(address?: readonly string[], path?: (string | number)[]): {
|
|
27
31
|
runPath: (string | number)[] | undefined;
|
|
28
32
|
globalPath: (string | number)[];
|
|
29
33
|
};
|
|
30
34
|
/**
|
|
31
|
-
* Sets a value at a nested path
|
|
35
|
+
* Sets a value at a nested path under `address`, creating intermediate objects as needed.
|
|
32
36
|
*/
|
|
33
|
-
export declare function setNestedValue<T>(obj: NestedObject,
|
|
37
|
+
export declare function setNestedValue<T>(obj: NestedObject, address: readonly string[], path: string[], field: string, value: T, defaultValues?: unknown): NestedObject;
|
|
34
38
|
/**
|
|
35
|
-
* Deep-merges a value into the object at
|
|
39
|
+
* Deep-merges a value into the object at a nested path under `address`.
|
|
36
40
|
* - Arrays: concatenate
|
|
37
41
|
* - Objects: shallow merge at each level
|
|
38
42
|
* - Primitives: replace
|
|
39
43
|
*/
|
|
40
|
-
export declare function updateNestedValue<T>(obj: any,
|
|
44
|
+
export declare function updateNestedValue<T>(obj: any, address: readonly string[], path: (string | number)[], field: string | number, value: T, defaultValues?: unknown): any;
|
|
41
45
|
/**
|
|
42
46
|
* In-place value update with merge semantics.
|
|
43
47
|
* - Arrays (non-empty): concatenate onto existing
|