footprintjs 9.44.1 → 9.44.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. package/CLAUDE.md +6 -5
  2. package/dist/esm/lib/capture/freeze.d.ts +51 -7
  3. package/dist/esm/lib/capture/freeze.js +289 -24
  4. package/dist/esm/lib/capture/valueKinds.d.ts +57 -0
  5. package/dist/esm/lib/capture/valueKinds.js +142 -0
  6. package/dist/esm/lib/memory/EventLog.d.ts +25 -7
  7. package/dist/esm/lib/memory/EventLog.js +31 -11
  8. package/dist/esm/lib/memory/StageContext.d.ts +4 -33
  9. package/dist/esm/lib/memory/StageContext.js +18 -81
  10. package/dist/esm/lib/memory/TransactionBuffer.js +2 -2
  11. package/dist/esm/lib/memory/admission.js +4 -3
  12. package/dist/esm/lib/memory/borrowedMutation.js +2 -2
  13. package/dist/esm/lib/memory/equality.d.ts +55 -19
  14. package/dist/esm/lib/memory/equality.js +154 -51
  15. package/dist/esm/lib/memory/logModel.js +11 -4
  16. package/dist/esm/lib/memory/recordCommit.d.ts +43 -0
  17. package/dist/esm/lib/memory/recordCommit.js +59 -0
  18. package/dist/esm/lib/memory/redaction.d.ts +1 -1
  19. package/dist/esm/lib/memory/redaction.js +2 -2
  20. package/dist/esm/lib/runner/ExecutionRuntime.d.ts +6 -3
  21. package/dist/esm/lib/runner/ExecutionRuntime.js +17 -12
  22. package/dist/esm/lib/runner/snapshot.js +17 -3
  23. package/dist/esm/lib/slice/elementProvenance.js +2 -2
  24. package/dist/esm/lib/time-travel/chain.js +28 -26
  25. package/dist/lib/capture/freeze.js +292 -25
  26. package/dist/lib/capture/valueKinds.js +146 -0
  27. package/dist/lib/memory/EventLog.js +30 -10
  28. package/dist/lib/memory/StageContext.js +17 -80
  29. package/dist/lib/memory/TransactionBuffer.js +2 -2
  30. package/dist/lib/memory/admission.js +4 -3
  31. package/dist/lib/memory/borrowedMutation.js +2 -2
  32. package/dist/lib/memory/equality.js +154 -51
  33. package/dist/lib/memory/logModel.js +11 -4
  34. package/dist/lib/memory/recordCommit.js +63 -0
  35. package/dist/lib/memory/redaction.js +2 -2
  36. package/dist/lib/runner/ExecutionRuntime.js +16 -11
  37. package/dist/lib/runner/snapshot.js +16 -2
  38. package/dist/lib/slice/elementProvenance.js +2 -2
  39. package/dist/lib/time-travel/chain.js +27 -25
  40. package/dist/types/lib/capture/freeze.d.ts +51 -7
  41. package/dist/types/lib/capture/valueKinds.d.ts +57 -0
  42. package/dist/types/lib/memory/EventLog.d.ts +25 -7
  43. package/dist/types/lib/memory/StageContext.d.ts +4 -33
  44. package/dist/types/lib/memory/equality.d.ts +55 -19
  45. package/dist/types/lib/memory/recordCommit.d.ts +43 -0
  46. package/dist/types/lib/memory/redaction.d.ts +1 -1
  47. package/dist/types/lib/runner/ExecutionRuntime.d.ts +6 -3
  48. package/package.json +2 -1
@@ -574,7 +574,7 @@ export class TransactionBuffer {
574
574
  commit() {
575
575
  const rows = this.commitValues === 'delta' ? this.toDeltaPayload() : this.toChangeOnlyPayload();
576
576
  const redactedPaths = this.survivingRedactedPaths(new Set(rows.trace.map((t) => t.path)));
577
- // The key order is part of the bytes a consumer keeps.
577
+ // The bundle's key order is `recordCommit`'s; a direct caller keeps this same order.
578
578
  const payload = { overwrite: rows.overwrite, updates: rows.updates, redactedPaths, trace: rows.trace };
579
579
  this.overwritePatch = {};
580
580
  this.updatePatch = {};
@@ -942,4 +942,4 @@ function flattenedTraceRow(op) {
942
942
  function provenance(readKeys) {
943
943
  return readKeys !== undefined ? { readKeys } : undefined;
944
944
  }
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/IHRoaXMudG9EZWx0YVBheWxvYWQoKSA6IHRoaXMudG9DaGFuZ2VPbmx5UGF5bG9hZCgpO1xuICAgIGNvbnN0IHJlZGFjdGVkUGF0aHMgPSB0aGlzLnN1cnZpdmluZ1JlZGFjdGVkUGF0aHMobmV3IFNldChyb3dzLnRyYWNlLm1hcCgodCkgPT4gdC5wYXRoKSkpO1xuICAgIC8vIFRoZSBrZXkgb3JkZXIgaXMgcGFydCBvZiB0aGUgYnl0ZXMgYSBjb25zdW1lciBrZWVwcy5cbiAgICBjb25zdCBwYXlsb2FkID0geyBvdmVyd3JpdGU6IHJvd3Mub3ZlcndyaXRlLCB1cGRhdGVzOiByb3dzLnVwZGF0ZXMsIHJlZGFjdGVkUGF0aHMsIHRyYWNlOiByb3dzLnRyYWNlIH07XG5cbiAgICB0aGlzLm92ZXJ3cml0ZVBhdGNoID0ge307XG4gICAgdGhpcy51cGRhdGVQYXRjaCA9IHt9O1xuICAgIHRoaXMub3BUcmFjZS5sZW5ndGggPSAwO1xuICAgIHRoaXMucmVkYWN0ZWRQYXRocy5jbGVhcigpO1xuICAgIHRoaXMuaGVsZFJlZnMuY2xlYXIoKTtcbiAgICB0aGlzLndvcmtpbmdDb3B5ID0ge307XG4gICAgdGhpcy5vd25lZCA9IG5ldyBXZWFrU2V0KCk7XG4gICAgdGhpcy5vd25lZC5hZGQodGhpcy53b3JraW5nQ29weSk7XG4gICAgdGhpcy5zdGFnZWQgPSBuZXcgV2Vha1NldCgpO1xuICAgIHRoaXMucHJpdmF0ZVRyZWVzID0gbmV3IFdlYWtTZXQoKTtcbiAgICB0aGlzLnN0YWdlZE1lcmdlcyA9IDA7XG4gICAgdGhpcy5uZXN0ZWRPcHMgPSAwO1xuXG4gICAgcmV0dXJuIHBheWxvYWQ7XG4gIH1cblxuICAvKipcbiAgICogUmVidWlsZCBvdmVyd3JpdGUgLyB1cGRhdGVzIC8gdHJhY2Uga2VlcGluZyBPTkxZIHBhdGhzIHdob3NlIGZpbmFsIHZhbHVlXG4gICAqIGRpZmZlcnMgZnJvbSB0aGUgYmFzZSB2YWx1ZSDigJQgaS5lLiB0aGUgc3RhZ2UncyBuZXQgY2hhbmdlLiBTZWVcbiAgICoge0BsaW5rIFRyYW5zYWN0aW9uQnVmZmVyLmNvbW1pdH0gZm9yIHRoZSByYXRpb25hbGUuXG4gICAqXG4gICAqIFBhdGhzIGFyZSBjb21wYXJlZCBhdCB0aGUgZXhhY3QgZ3JhbnVsYXJpdHkgdGhleSB3ZXJlIHdyaXR0ZW4gKGVhY2ggdHJhY2VcbiAgICogZW50cnkncyBwYXRoKSwgYWdhaW5zdCBgd29ya2luZ0NvcHlgIChmaW5hbCkgdnMgYGJhc2VTbmFwc2hvdGAgKHN0YXJ0KS5cbiAgICogU3Vydml2aW5nIGBzZXRgIHBhdGhzIGNvcHkgdGhlaXIgZmluYWwgdmFsdWUgZnJvbSBgb3ZlcndyaXRlUGF0Y2hgO1xuICAgKiBzdXJ2aXZpbmcgYG1lcmdlYCBwYXRocyBjb3B5IHRoZWlyIGFjY3VtdWxhdGVkIGRlbHRhIGZyb20gYHVwZGF0ZVBhdGNoYCxcbiAgICoga2VlcGluZyB0aGUgc2V0LXZzLW1lcmdlIHZlcmIg4oCUIGFuZCB0aGUgcmVzdWx0IGlzIEFETUlUVEVEICh7QGxpbmsgYWRtaXR9KTpcbiAgICogYSBmYW1pbHkgb2Ygcm93cyB3aG9zZSByZXBsYXkgZG9lcyBub3QgZ2l2ZSBiYWNrIHdoYXQgdGhlIHN0YWdlIHJlYWQgaXNcbiAgICogcmVjb3JkZWQgYXMgYHNldGAgcm93cyBvZiB0aGUgcmVhZC1iYWNrIGluc3RlYWQgKDkuMzAuMCkuXG4gICAqXG4gICAqIFRoaXMgaXMgdGhlIERFRkFVTFQgKGBjb21taXRWYWx1ZXM6ICdmdWxsJ2ApIHBheWxvYWQsIGluY2x1ZGluZyB0aGVcbiAgICogaGlzdG9yaWNhbCBmbGF0dGVuaW5nIG9mIHN0YWdlZCBgZGVsZXRlYCBvcHMgaW50byBgc2V0YC1vZi1gdW5kZWZpbmVkYFxuICAgKiB0cmFjZSBlbnRyaWVzLiBUaGUgZGVsdGEgZW5jb2RpbmcgbGl2ZXMgaW4ge0BsaW5rIHRvRGVsdGFQYXlsb2FkfS5cbiAgICpcbiAgICogV29yaywgbm90IGJ5dGVzICg5LjIyLjEpOiB0aGUgbmV0LWNoYW5nZSB2ZXJkaWN0IGlzIHBhaWQgb25jZSBwZXIgUEFUSFxuICAgKiBhbmQgdGhlIGNsb25lIG9uY2UgcGVyIENPTlNFQ1VUSVZFIHJ1biBvZiBvcHMgb24gYSBwYXRoLCBub3Qgb25jZSBwZXIgb3BcbiAgICog4oCUIHNlZSB0aGUgdHdvIG1lbW9zIGluc2lkZS4gUGlubmVkIGJ5XG4gICAqIHRlc3QvbGliL21lbW9yeS9zY2VuYXJpby9yZXBlYXRlZC1wYXRoLWJ5dGUtaWRlbnRpdHkudGVzdC50cyBhZ2FpbnN0IHRoZVxuICAgKiA5LjIyLjAgYnl0ZXMuIFNpbmNlIDkuMjMuMCB0aGF0IGNsb25lIGlzIFRIRSBjbG9uZTogdGhlIHBhdGNoIHRyZWVzIGhvbGRcbiAgICogdGhlIGNhbGxlcidzIHJlZmVyZW5jZXMgKHNlZSB0aGUgY2xhc3MgaGVhZGVyKSwgc28gdGhpcyBsb29wIGlzIHRoZSBvbmVcbiAgICogcGxhY2UgdGhlIHJlY29yZCBpcyBkZXRhY2hlZCBmcm9tIHRoZW0uXG4gICAqL1xuICBwcml2YXRlIHRvQ2hhbmdlT25seVBheWxvYWQoKTogUm93cyB7XG4gICAgcmV0dXJuIHRoaXMuYWRtaXQoKGxvc3N5KSA9PiB0aGlzLmNoYW5nZU9ubHlSb3dzKGxvc3N5KSk7XG4gIH1cblxuICAvKiogVGhlICdmdWxsJyByb3dzOyBhIGZhbWlseSBpbiBgbG9zc3lgIGlzIHdyaXR0ZW4gYXMgaXRzIHJlYWQtYmFjaywgYXQgaXRzIGxhc3QgdG91Y2ggKHtAbGluayBlbWl0UmVhZEJhY2t9KS4gKi9cbiAgcHJpdmF0ZSBjaGFuZ2VPbmx5Um93cyhsb3NzeTogTG9zc3kgfCB1bmRlZmluZWQpOiBSb3dzIHtcbiAgICBjb25zdCByb3dzOiBSb3dzID0geyBvdmVyd3JpdGU6IHt9LCB1cGRhdGVzOiB7fSwgdHJhY2U6IFtdIH07XG4gICAgY29uc3QgeyBvdmVyd3JpdGUsIHVwZGF0ZXMsIHRyYWNlIH0gPSByb3dzO1xuICAgIC8vIFBlciBQQVRILCBkZWNpZGVkIG9uY2UgKDkuMjIuMSk6IGJhc2UgYW5kIGZpbmFsIHZhbHVlIGFyZSBmaXhlZCBhdFxuICAgIC8vIGNvbW1pdCwgc28gZXZlcnkgbGF0ZXIgb3Agb24gYSBwYXRoIGdldHMgdGhlIHZlcmRpY3QgaXRzIGZpcnN0IG9wIGdvdC5cbiAgICAvLyBgdW5kZWZpbmVkYCA9IG5vdCB5ZXQgZGVjaWRlZDsgdGhlIHN1cnZpdmluZyBwYXRocyBhcmUgdGhlIGB0cnVlYCBrZXlzLlxuICAgIGNvbnN0IHN1cnZpdmVzID0gbmV3IE1hcDxzdHJpbmcsIGJvb2xlYW4+KCk7XG4gICAgLy8gVGhlIHBhdGggdGhlIExBU1Qgc3Vydml2aW5nIG9wIGNvcGllZCBpbnRvIGVhY2ggcGF0Y2ggdHJlZSAoOS4yMi4xKS5cbiAgICAvLyBUaGUgdmFsdWUgYXQgYSBwYXRoIGlzIGZpeGVkIGF0IGNvbW1pdCwgc28gYW4gb3Agd2hvc2UgcHJlZGVjZXNzb3Igb25cbiAgICAvLyB0aGUgU0FNRSB0cmVlIGFscmVhZHkgY29waWVkIHRoYXQgcGF0aCB3b3VsZCB3cml0ZSB0aGUgc2FtZSBieXRlcyBvdmVyXG4gICAgLy8gdGhlIHNhbWUga2V5IOKAlCBpdCBrZWVwcyBpdHMgdHJhY2Ugcm93ICh0aGUgbG9nIGlzIGJ5dGUtaWRlbnRpY2FsKSBhbmRcbiAgICAvLyBwYXlzIG5vIHNlY29uZCBjbG9uZS4gVGhlIDkuMjIuMCBlbGVtZW50LXdyaXRlIGZ1bm5lbCBzdGFnZXMgTlxuICAgIC8vIHdob2xlLWFycmF5IHNldHMgb24gT05FIHBhdGg7IHRoaXMgaXMgd2hhdCBtYWtlcyB0aGF0IGNvbW1pdCBPKE4pXG4gICAgLy8gaW5zdGVhZCBvZiBPKE4gw5cgb3BzKS4gQ09OU0VDVVRJVkUgb25seSDigJQgYW4gb3Agb24gYW5vdGhlciBwYXRoIGluXG4gICAgLy8gYmV0d2VlbiBtYXkgaGF2ZSBjb2VyY2VkIG9yIGdyb3duIHRoaXMgb25lJ3MgY29udGFpbmVyIChhIGRlc2NlbmRhbnRcbiAgICAvLyBgbmF0aXZlU2V0YCB0aHJvdWdoIGEgcHJpbWl0aXZlLCBhIGBrZXk6IHVuZGVmaW5lZGAgc2hlbGwpIGFuZCB0aGVcbiAgICAvLyByZS1jb3B5IGlzIHdoYXQgcmVwYWlycyBpdDsgYSBgbWVyZ2VgIGJldHdlZW4gdHdvIHNldHMgdG91Y2hlcyB0aGVcbiAgICAvLyBvdGhlciB0cmVlIGFuZCBkb2VzIG5vdCBjb3VudC4gU2FtZSBsYXcgYXMgYHN1cGVyc2VkZWRCeU5leHRTZXRgLlxuICAgIGxldCBsYXN0U2V0UGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIGxldCBsYXN0TWVyZ2VQYXRoOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMub3BUcmFjZS5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3Qgb3AgPSB0aGlzLm9wVHJhY2VbaV07XG4gICAgICBjb25zdCBmYW1pbHkgPSBsb3NzeT8uZmFtaWxpZXMuZ2V0KGxvc3N5LnJvb3RPZi5nZXQob3AucGF0aCkgYXMgc3RyaW5nKTtcbiAgICAgIGlmIChmYW1pbHkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAoaSA9PT0gZmFtaWx5LnNsb3QpIHtcbiAgICAgICAgICB0aGlzLmVtaXRSZWFkQmFjayhmYW1pbHksIHJvd3MsICdmdWxsJyk7XG4gICAgICAgICAgbGFzdFNldFBhdGggPSBsYXN0TWVyZ2VQYXRoID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgbGV0IGtlZXAgPSBzdXJ2aXZlcy5nZXQob3AucGF0aCk7XG4gICAgICBpZiAoa2VlcCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGtlZXAgPSB0aGlzLmNoYW5nZWRTaW5jZUJhc2Uob3AucGF0aC5zcGxpdChERUxJTSkpO1xuICAgICAgICBzdXJ2aXZlcy5zZXQob3AucGF0aCwga2VlcCk7XG4gICAgICB9XG4gICAgICBpZiAoIWtlZXApIGNvbnRpbnVlOyAvLyBuby1vcCBvciB3cml0ZS10aGVuLXJldmVydCDihpIgbm8gbmV0IGNoYW5nZVxuXG4gICAgICB0cmFjZS5wdXNoKGZsYXR0ZW5lZFRyYWNlUm93KG9wKSk7XG4gICAgICBpZiAob3AudmVyYiA9PT0gJ21lcmdlJykge1xuICAgICAgICBpZiAobGFzdE1lcmdlUGF0aCA9PT0gb3AucGF0aCkgY29udGludWU7XG4gICAgICAgIGxhc3RNZXJnZVBhdGggPSBvcC5wYXRoO1xuICAgICAgICBjb25zdCBzZWdtZW50cyA9IG9wLnBhdGguc3BsaXQoREVMSU0pO1xuICAgICAgICBfc2V0KHVwZGF0ZXMsIHNlZ21lbnRzLCBzdHJ1Y3R1cmVkQ2xvbmUoX2dldCh0aGlzLnVwZGF0ZVBhdGNoLCBzZWdtZW50cykpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChsYXN0U2V0UGF0aCA9PT0gb3AucGF0aCkgY29udGludWU7XG4gICAgICAgIGxhc3RTZXRQYXRoID0gb3AucGF0aDtcbiAgICAgICAgY29uc3Qgc2VnbWVudHMgPSBvcC5wYXRoLnNwbGl0KERFTElNKTtcbiAgICAgICAgX3NldChvdmVyd3JpdGUsIHNlZ21lbnRzLCBzdHJ1Y3R1cmVkQ2xvbmUoX2dldCh0aGlzLm92ZXJ3cml0ZVBhdGNoLCBzZWdtZW50cykpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJvd3M7XG4gIH1cblxuICAvKipcbiAgICogRGVsdGEtZW5jb2RlZCBwYXlsb2FkIChgY29tbWl0VmFsdWVzOiAnZGVsdGEnYCwgIzEzYy1CKSDigJQgc2FtZSBuZXQtY2hhbmdlXG4gICAqIGZpbHRlciBhcyB7QGxpbmsgdG9DaGFuZ2VPbmx5UGF5bG9hZH0sIHRocmVlIGVuY29kaW5nIGRpZmZlcmVuY2VzOlxuICAgKlxuICAgKiAxLiAqKk9uZSB0cmFjZSBlbnRyeSBwZXIgc3Vydml2aW5nIHBhdGgqKiAodGhlIMKnMi41IGRlZHVwIHJ1bGUg4oCUIGBhcHBlbmRgXG4gICAqICAgIGlzIE5PVCBpZGVtcG90ZW50IG9uIHJlcGxheSwgc28gZHVwbGljYXRlIGVudHJpZXMgd291bGQgbXVsdGlwbHlcbiAgICogICAgdGFpbHMpLiBUaGUgdmVyYiBpcyByZXNvbHZlZCBmcm9tIHRoZSBwYXRoJ3Mgb3AgbWl4ICsgYmFzZeKGkmZpbmFsXG4gICAqICAgIHJlbGF0aW9uc2hpcDsgZW50cmllcyBhcmUgb3JkZXJlZCBieSBlYWNoIHBhdGgncyBMQVNUIHRvdWNoLFxuICAgKiAgICBwcmVzZXJ2aW5nIGxhc3Qtd3JpdGVyLXdpbnMgZm9yIG5lc3RlZC9vdmVybGFwcGluZyBwYXRocy5cbiAgICogMi4gKipWZXJiIHJlc29sdXRpb24gcGVyIHBhdGgqKiDigJQgZm9yIGEgcGF0aCB3aXRoIE5PIHN1cnZpdmluZyByZWxhdGl2ZVxuICAgKiAgICAoc2VlIDMpOlxuICAgKiAgICAtIGxhc3Qgb3AgYCdkZWxldGUnYCBBTkQgZmluYWwgdmFsdWUgZ29uZSDihpIgYGRlbGV0ZWAgKHRoZSBwYXRoIHN0YXlzXG4gICAqICAgICAgZW51bWVyYXRlZCBpbiBgb3ZlcndyaXRlYCB3aXRoIGB1bmRlZmluZWRgIGZvciBrZXktc2V0IGNvbnN1bWVycykuXG4gICAqICAgICAgUmVxdWlyZXMgdGhlIHBhcmVudCB0byBiZSBhIHJlYWwgY29udGFpbmVyIGluIHRoZSBiYXNlIOKAlCByZXBsYXkgdXNlc1xuICAgKiAgICAgIGBuYXRpdmVEZWxldGVgLCB3aGljaCBpcyBpbmVydCBvbiBhIHByaW1pdGl2ZS9hYnNlbnQgcGFyZW50LCB3aGVyZWFzXG4gICAqICAgICAgdGhlIGAnZnVsbCdgIGZsYXR0ZW5pbmcgKGBfc2V0YCBvZiBgdW5kZWZpbmVkYCkgQ09FUkNFUyB0aGF0IHBhcmVudFxuICAgKiAgICAgIGludG8gYW4gb2JqZWN0OyB3aGVuIHRoZXkgd291bGQgZGlzYWdyZWUgd2Uga2VlcCB0aGUgZmxhdHRlbmluZztcbiAgICogICAgLSBPTkxZIGAnbWVyZ2UnYCBvcHMg4oaSIGBtZXJnZWAgd2l0aCB0aGUgYWNjdW11bGF0ZWQgYHVwZGF0ZVBhdGNoYFxuICAgKiAgICAgIGRlbHRhO1xuICAgKiAgICAtIG90aGVyd2lzZSAoYHNldGAvbWl4ZWQpOiB0aGUgdmFsdWUgdGhlIHN0YWdlJ3MgJ2Z1bGwnIHJvd3MgZ2l2ZSB0aGVcbiAgICogICAgICBwYXRoICh7QGxpbmsgZnVsbFJvd3NWYWx1ZX0pLiBJZiBiYXNlIGFuZCB0aGF0IHZhbHVlIGFyZSBhcnJheXMgYW5kXG4gICAqICAgICAgYmFzZSBpcyBhIFNUUklDVCBQUkVGSVgg4oaSIGBhcHBlbmRgIHN0b3Jpbmcgb25seSB0aGUgdGFpbDsgZWxzZSBgc2V0YFxuICAgKiAgICAgIHN0b3JpbmcgdGhlIGZ1bGwgdmFsdWUuXG4gICAqIDMuICoqT1ZFUkxBUCBGQU1JTElFUyB0YWtlIHRoZSBmdWxsLXZhbHVlIGZhbGxiYWNrLioqIGBvdmVyd3JpdGVgIC9cbiAgICogICAgYHVwZGF0ZXNgIGFyZSBuZXN0ZWQgcGF0aCBUUkVFUywgc28gdHdvIHN1cnZpdmluZyBwYXRocyB3aGVyZSBvbmUgaXNcbiAgICogICAgYW4gYW5jZXN0b3Igb2YgdGhlIG90aGVyIChgYWAgYW5kIGBhLnBgKSBzaGFyZSBzdG9yYWdlLiBEZWx0YSdzXG4gICAqICAgIHBlci1wYXRoIGVuY29kaW5ncyB3b3VsZCBjbG9iYmVyIGVhY2ggb3RoZXIgdGhlcmUgKGFuIGBhcHBlbmRgXG4gICAqICAgIGFuY2VzdG9yIHN0b3JlcyBvbmx5IGEgVEFJTCwgYSBgZGVsZXRlYCBhbmNlc3RvciBgdW5kZWZpbmVkYCksIHNvIGV2ZXJ5XG4gICAqICAgIHBhdGggdGhhdCBoYXMgYSBzdXJ2aXZpbmcgYW5jZXN0b3IvZGVzY2VuZGFudCBpcyBjb21taXR0ZWQgYXMgYSBwbGFpblxuICAgKiAgICBgc2V0YCBvZiB0aGUgdmFsdWUgdGhlICdmdWxsJyByb3dzIGdpdmUgaXQsIGFuZCB0aGUgZmFtaWx5J3NcbiAgICogICAgc2hhbGxvd2VzdCBwYXRoICh3aG9zZSBzZXQgY292ZXJzIHRoZSB3aG9sZSBzdWJ0cmVlKSBpcyBlbWl0dGVkIExBU1QuXG4gICAqXG4gICAqIFRoZSByZXN1bHQgaXMgQURNSVRURUQgKHtAbGluayBhZG1pdH0pIGxpa2UgdGhlICdmdWxsJyBwYXlsb2FkOiBhIGNvbXBhY3RcbiAgICogcm93IGlzIGtlcHQgb25seSB3aGVyZSB0aGUgYnVuZGxlIHByb3ZhYmx5IGZvbGRzIGJhY2ssIGFuZCBhIGZhbWlseSB0aGF0XG4gICAqIGRvZXMgbm90IGlzIHJlY29yZGVkIGFzIHdoYXQgdGhlIHN0YWdlIHJlYWQuIFNvIGJvdGggZW5jb2RpbmdzIGNvbW1pdCB0aGVcbiAgICogdmFsdWUgdGhlIHN0YWdlIHJlYWQ7IGJlZm9yZSA5LjMwLjAgdGhleSBzaGFyZWQgYSByZXBsYXkgdGhhdCBkaWQgbm90XG4gICAqIChgcmVwbGF5UGF0aFZlcmJzYCAvIGByZXBsYXlGYW1pbHlWZXJic2AsIGRlbGV0ZWQpLlxuICAgKi9cbiAgcHJpdmF0ZSB0b0RlbHRhUGF5bG9hZCgpOiBSb3dzIHtcbiAgICBjb25zdCBmdWxsVmFsdWVBdCA9IHRoaXMuZnVsbFJvd3NWYWx1ZSgpO1xuICAgIHJldHVybiB0aGlzLmFkbWl0KChsb3NzeSkgPT4gdGhpcy5kZWx0YVJvd3MobG9zc3ksIGZ1bGxWYWx1ZUF0KSk7XG4gIH1cblxuICAvKiogVGhlIGRlbHRhIHJvd3M7IGEgZmFtaWx5IGluIGBsb3NzeWAgaXMgd3JpdHRlbiBhcyBpdHMgcmVhZC1iYWNrLCBhdCBpdHMgbGFzdCB0b3VjaCAoe0BsaW5rIGVtaXRSZWFkQmFja30pLiAqL1xuICBwcml2YXRlIGRlbHRhUm93cyhsb3NzeTogTG9zc3kgfCB1bmRlZmluZWQsIGZ1bGxWYWx1ZUF0OiAoc2VnbWVudHM6IHN0cmluZ1tdKSA9PiB1bmtub3duKTogUm93cyB7XG4gICAgY29uc3Qgcm93czogUm93cyA9IHsgb3ZlcndyaXRlOiB7fSwgdXBkYXRlczoge30sIHRyYWNlOiBbXSB9O1xuICAgIGNvbnN0IHsgb3ZlcndyaXRlLCB1cGRhdGVzLCB0cmFjZSB9ID0gcm93cztcbiAgICBjb25zdCBpbkxvc3N5ID0gKHBhdGg6IHN0cmluZykgPT4gbG9zc3k/LmZhbWlsaWVzLmhhcyhsb3NzeS5yb290T2YuZ2V0KHBhdGgpIGFzIHN0cmluZykgPT09IHRydWU7XG4gICAgY29uc3Qgc3Vydml2b3JzID0gdGhpcy5uZXRDaGFuZ2VTdXJ2aXZvcnModGhpcy5vcHNCeVBhdGgoKSkuZmlsdGVyKChzKSA9PiAhaW5Mb3NzeShzLnBhdGgpKTtcbiAgICBjb25zdCB7IHJvb3RPZiwgYnlSb290IH0gPSBncm91cEludG9GYW1pbGllcyhzdXJ2aXZvcnMsIG5ldyBTZXQoc3Vydml2b3JzLm1hcCgocykgPT4gcy5wYXRoKSkpO1xuXG4gICAgLy8gVEhFIFZFUkIgQ0hPSUNFIOKAlCB0aGUgZGVsdGEgZW5jb2RlciBwaWNrcyBhIHZlcmIgcGVyIHBhdGg7IHRoZSBWQUxVRVNcbiAgICAvLyBpdCBlbmNvZGVzIGNvbWUgZnJvbSB0aGUgb25lIHJlcGxheSAoYGZ1bGxWYWx1ZUF0YCksIG5ldmVyIGEgcmVwbGljYSBvZlxuICAgIC8vIHRoZSB2ZXJiIGxhdyAoOS4zMC4wOiBDTEFVREUubWQncyB2ZXJiLXN3aXRjaCByZXBsaWNhcyBsb3N0IHR3byBoZXJlKS5cbiAgICBjb25zdCBlbWl0ID0gKHM6IFN1cnZpdm9yKTogdm9pZCA9PiB7XG4gICAgICBjb25zdCB7IHBhdGgsIHNlZ21lbnRzLCB2ZXJicywgYmVmb3JlIH0gPSBzO1xuICAgICAgY29uc3QgcHJvdiA9IHByb3ZlbmFuY2Uocy5yZWFkS2V5cyk7XG4gICAgICBpZiAoKGJ5Um9vdC5nZXQocm9vdE9mLmdldChwYXRoKSBhcyBzdHJpbmcpIGFzIFN1cnZpdm9yW10pLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgLy8gUnVsZSAzIOKAlCBvbmUgY29oZXJlbnQgdHJlZTogZXZlcnkgbWVtYmVyIGEgc2V0IG9mIGl0cyB2YWx1ZS5cbiAgICAgICAgdHJhY2UucHVzaCh7IHBhdGgsIHZlcmI6ICdzZXQnLCAuLi5wcm92IH0pO1xuICAgICAgICBfc2V0KG92ZXJ3cml0ZSwgc2VnbWVudHMsIHN0cnVjdHVyZWRDbG9uZShmdWxsVmFsdWVBdChzZWdtZW50cykpKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgbGFzdFZlcmIgPSB2ZXJic1t2ZXJicy5sZW5ndGggLSAxXTtcbiAgICAgIGlmIChsYXN0VmVyYiA9PT0gJ2RlbGV0ZScgJiYgcy5hZnRlciA9PT0gdW5kZWZpbmVkICYmIHRoaXMuZGVsZXRlUmVwbGF5c0FzRmxhdHRlbmluZyhzZWdtZW50cykpIHtcbiAgICAgICAgLy8gUmVhbCBkZWxldGlvbiDigJQgcmVwbGF5IHJlbW92ZXMgdGhlIGtleS4gS2VlcCB0aGUgcGF0aCBlbnVtZXJhdGVkXG4gICAgICAgIC8vIGluIGBvdmVyd3JpdGVgICh1bmRlZmluZWQpIHNvIE9iamVjdC5rZXlzIGNvbnN1bWVycyBzZWUgaXQuXG4gICAgICAgIHRyYWNlLnB1c2goeyBwYXRoLCB2ZXJiOiAnZGVsZXRlJywgLi4ucHJvdiB9KTtcbiAgICAgICAgX3NldChvdmVyd3JpdGUsIHNlZ21lbnRzLCB1bmRlZmluZWQpO1xuICAgICAgfSBlbHNlIGlmICh2ZXJicy5ldmVyeSgodikgPT4gdiA9PT0gJ21lcmdlJykpIHtcbiAgICAgICAgdHJhY2UucHVzaCh7IHBhdGgsIHZlcmI6ICdtZXJnZScsIC4uLnByb3YgfSk7XG4gICAgICAgIF9zZXQodXBkYXRlcywgc2VnbWVudHMsIHN0cnVjdHVyZWRDbG9uZShfZ2V0KHRoaXMudXBkYXRlUGF0Y2gsIHNlZ21lbnRzKSkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcHVzaFZhbHVlUm93KHJvd3MsIHBhdGgsIHNlZ21lbnRzLCBiZWZvcmUsIGZ1bGxWYWx1ZUF0KHNlZ21lbnRzKSwgcHJvdiwgdGhpcy5tYXJrZWRCZWxvdyhwYXRoKSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIEEgZmFtaWx5IHRoYXQgZGlkIG5vdCBmb2xkIGJhY2sgdGFrZXMgaXRzIHBsYWNlIGJ5IGl0cyBsYXN0IHRvdWNoLlxuICAgIGNvbnN0IHBlbmRpbmcgPSBsb3NzeSA9PT0gdW5kZWZpbmVkID8gW10gOiBbLi4ubG9zc3kuZmFtaWxpZXMudmFsdWVzKCldLnNvcnQoKGEsIGIpID0+IGEuc2xvdCAtIGIuc2xvdCk7XG4gICAgbGV0IG5leHQgPSAwO1xuICAgIGNvbnN0IGZsdXNoQmVmb3JlID0gKHRvdWNoOiBudW1iZXIpOiB2b2lkID0+IHtcbiAgICAgIHdoaWxlIChuZXh0IDwgcGVuZGluZy5sZW5ndGggJiYgcGVuZGluZ1tuZXh0XS5zbG90IDwgdG91Y2gpIHRoaXMuZW1pdFJlYWRCYWNrKHBlbmRpbmdbbmV4dCsrXSwgcm93cywgJ2RlbHRhJyk7XG4gICAgfTtcbiAgICBlbWl0SW5GYW1pbHlPcmRlcihzdXJ2aXZvcnMsIHJvb3RPZiwgYnlSb290LCBlbWl0LCBmbHVzaEJlZm9yZSk7XG4gICAgZmx1c2hCZWZvcmUoSW5maW5pdHkpO1xuICAgIHJldHVybiByb3dzO1xuICB9XG5cbiAgLy8g4pSA4pSAIFRoZSBhZG1pdHRlZCByZWNvcmQgKDkuMzAuMCkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqXG4gICAqIFRIRSBBRE1JU1NJT04g4oCUIGEgY29tbWl0IGlzIGFkbWl0dGVkIG9ubHkgaWYgaXRzIGJ1bmRsZSBmb2xkcyBiYWNrIHRvIHRoZVxuICAgKiBzdGFnZSdzIHJlYWQteW91ci13cml0ZXMgdmlldyBhdCBldmVyeSBwYXRoIHRoZSBzdGFnZSB0b3VjaGVkLiBgYnVpbGRgXG4gICAqIGxheXMgdGhlIHJvd3Mgb3V0IChvbmUgZW5jb2RlcjogYCdmdWxsJ2Agb3IgYCdkZWx0YSdgKTsgdGhlIGNhbmRpZGF0ZSBpc1xuICAgKiBjaGVja2VkICh7QGxpbmsgbG9zc3lGYW1pbGllc30pLCBhbmQgd2hlbiBzb21lIGZhbWlseSdzIHJvd3MgZG8gbm90IGZvbGRcbiAgICogYmFjayB0aGUgcm93cyBhcmUgbGFpZCBvdXQgYWdhaW4gd2l0aCB0aG9zZSBmYW1pbGllcyB3cml0dGVuIGFzIHdoYXQgdGhlXG4gICAqIHN0YWdlIHJlYWQgKHtAbGluayBlbWl0UmVhZEJhY2t9KSDigJQgZXZlcnkgb3RoZXIgZmFtaWx5J3MgYnl0ZXMgZXhhY3RseSBhc1xuICAgKiB0aGUgZmlyc3QgbGF5b3V0IG1hZGUgdGhlbS5cbiAgICovXG4gIHByaXZhdGUgYWRtaXQoYnVpbGQ6IChsb3NzeTogTG9zc3kgfCB1bmRlZmluZWQpID0+IFJvd3MpOiBSb3dzIHtcbiAgICBjb25zdCBjYW5kaWRhdGUgPSBidWlsZCh1bmRlZmluZWQpO1xuICAgIGNvbnN0IGxvc3N5ID0gdGhpcy5sb3NzeUZhbWlsaWVzKGNhbmRpZGF0ZSk7XG4gICAgcmV0dXJuIGxvc3N5ID09PSB1bmRlZmluZWQgPyBjYW5kaWRhdGUgOiBidWlsZChsb3NzeSk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGZhbWlsaWVzIHdob3NlIHJvd3MgZG8gbm90IGZvbGQgYmFjayB0byB3aGF0IHRoZSBzdGFnZSByZWFkIOKAlFxuICAgKiBgdW5kZWZpbmVkYCB3aGVuIHRoZXJlIGFyZSBub25lIChgYWRtaXNzaW9uLnRzIMK3IGxvc3N5RmFtaWxpZXNgOiB0aGVcbiAgICogY2FuZGlkYXRlIHJlcGxheWVkIG9udG8gdGhlIGRpZmYgYmFzZSBieSBgZHJ5Rm9sZGAsIGV2ZXJ5IGZhbWlseSBvZlxuICAgKiB0b3VjaGVkIHBhdGhzIGNvbXBhcmVkIHdpdGggdGhlIHdvcmtpbmcgY29weSBhdCBpdHMgcm9vdCBhbmQgb24gdGhlIHdheVxuICAgKiBkb3duIHRvIGl0KS5cbiAgICpcbiAgICogV2l0aG91dCBhIGZvbGQsIHdoZW4gdGhlIHN0YWdlIHN0YWdlZCBubyBgbWVyZ2VgIGFuZCBubyBuZXN0ZWQgb3A6IGl0c1xuICAgKiByb3dzIGFyZSBgc2V0YCAvIGBkZWxldGVgIG9mIGtleXMgZGlyZWN0bHkgdW5kZXIgaXRzIGFkZHJlc3MsIGVhY2hcbiAgICogd3JpdGluZyB0aGUgU0FNRSB2YWx1ZSBpbnRvIGB3b3JraW5nQ29weWAgYW5kIGBvdmVyd3JpdGVQYXRjaGAg4oCUIHRoZVxuICAgKiByZWNvcmQgaXMgdGhlIHJlYWQtYmFjayBieSBjb25zdHJ1Y3Rpb24gKHRoZSBwcm9wZXJ0eSdzIFJPT1QtT05MWSBhcm1cbiAgICogcGlucyB0aGlzKS4gVGhhdCBrZWVwcyB0aGUgY29tbWl0IG9mIHRoZSB0eXBlZCBzY29wZSdzIHJvb3Qta2V5IHdyaXRlc1xuICAgKiBleGFjdGx5IGFzIGNoZWFwIGFzIGl0IHdhcy5cbiAgICovXG4gIHByaXZhdGUgbG9zc3lGYW1pbGllcyhjYW5kaWRhdGU6IFJvd3MpOiBMb3NzeSB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHRoaXMuc3RhZ2VkTWVyZ2VzID09PSAwICYmIHRoaXMubmVzdGVkT3BzID09PSAwKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHJldHVybiBsb3NzeUZhbWlsaWVzKGNhbmRpZGF0ZSwgdGhpcy5iYXNlU25hcHNob3QsIHRoaXMud29ya2luZ0NvcHksIHRoaXMub3BUcmFjZSwgdGhpcy5hZGRyZXNzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIGZhbWlseSB3aG9zZSByb3dzIGRpZCBub3QgZm9sZCBiYWNrLCB3cml0dGVuIGFzIHdoYXQgdGhlIHN0YWdlIHJlYWQ6XG4gICAqIG9uZSBgc2V0YCByb3cgcGVyIG1lbWJlciB0aGF0IGNoYW5nZWQgKGRlc2NlbmRhbnRzIGJ5IGxhc3QgdG91Y2gsIGVhY2hcbiAgICogd2l0aCBpdHMgb3duIHJlYWQgcHJlZml4KSwgdGhlIFJPT1QgbGFzdCwgYW5kIHRoZSByb290J3MgcmVhZC1iYWNrIHZhbHVlXG4gICAqIGluIGBvdmVyd3JpdGVgIOKAlCBvbmUgY29oZXJlbnQgdHJlZSwgc28gbm8gcm93IGNhbiBjbG9iYmVyIGFub3RoZXIuIFRoZVxuICAgKiByb290J3Mgcm93IGlzIHdyaXR0ZW4gZXZlbiB3aGVuIHRoZSByb290IGl0c2VsZiBkaWQgbm90IGNoYW5nZTogaXQgaXMgdGhlXG4gICAqIHJvdyB0aGF0IGNhcnJpZXMgdGhlIGZhbWlseSdzIHJlYWQtYmFjayAoYW5kIHRoZSBjb250YWluZXJzIEwtMSdzIGRyb3BwZWRcbiAgICogb3AgbGVmdCkuIEEgbG9uZSByb290IHVuZGVyIGAnZGVsdGEnYCBrZWVwcyB0aGUgY29tcGFjdCBgYXBwZW5kYCB3aGVuIHRoZVxuICAgKiB2YWx1ZSBpdCByZWFkIGlzIGl0cyBiYXNlIHBsdXMgYSB0YWlsLlxuICAgKi9cbiAgcHJpdmF0ZSBlbWl0UmVhZEJhY2soZmFtaWx5OiBGYW1pbHksIHJvd3M6IFJvd3MsIGVuY29kaW5nOiBDb21taXRWYWx1ZXNNb2RlKTogdm9pZCB7XG4gICAgbGV0IHJvb3Q6IE1lbWJlciA9IGZhbWlseS5tZW1iZXJzWzBdO1xuICAgIGxldCBjaGFuZ2VkID0gMDtcbiAgICBmb3IgKGNvbnN0IG0gb2YgZmFtaWx5Lm1lbWJlcnMpIHtcbiAgICAgIGlmIChtLnBhdGggPT09IGZhbWlseS5yb290KSB7XG4gICAgICAgIHJvb3QgPSBtO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmICghdGhpcy5jaGFuZ2VkU2luY2VCYXNlKG0ucGF0aC5zcGxpdChERUxJTSkpKSBjb250aW51ZTtcbiAgICAgIHJvd3MudHJhY2UucHVzaCh7IHBhdGg6IG0ucGF0aCwgdmVyYjogJ3NldCcsIC4uLnByb3ZlbmFuY2UobS5yZWFkS2V5cykgfSk7XG4gICAgICBjaGFuZ2VkKys7XG4gICAgfVxuICAgIGNvbnN0IGFmdGVyID0gX2dldCh0aGlzLndvcmtpbmdDb3B5LCBmYW1pbHkucm9vdFNlZ21lbnRzKTtcbiAgICBpZiAoZW5jb2RpbmcgPT09ICdkZWx0YScgJiYgY2hhbmdlZCA9PT0gMCAmJiBhZnRlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBiZWZvcmUgPSBfZ2V0KHRoaXMuYmFzZVNuYXBzaG90LCBmYW1pbHkucm9vdFNlZ21lbnRzKTtcbiAgICAgIHB1c2hWYWx1ZVJvdyhcbiAgICAgICAgcm93cyxcbiAgICAgICAgZmFtaWx5LnJvb3QsXG4gICAgICAgIGZhbWlseS5yb290U2VnbWVudHMsXG4gICAgICAgIGJlZm9yZSxcbiAgICAgICAgYWZ0ZXIsXG4gICAgICAgIHByb3ZlbmFuY2Uocm9vdC5yZWFkS2V5cyksXG4gICAgICAgIHRoaXMubWFya2VkQmVsb3coZmFtaWx5LnJvb3QpLFxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcm93cy50cmFjZS5wdXNoKHsgcGF0aDogZmFtaWx5LnJvb3QsIHZlcmI6ICdzZXQnLCAuLi5wcm92ZW5hbmNlKHJvb3QucmVhZEtleXMpIH0pO1xuICAgIC8vIFRoZSBjbG9uZSB0aGUgY2hlY2sgdG9vayAoYGFkbWlzc2lvbi50cyDCtyBmb2xkc0JhY2tgKSwgd2hlbiBpdCB0b29rIG9uZS5cbiAgICBfc2V0KHJvd3Mub3ZlcndyaXRlLCBmYW1pbHkucm9vdFNlZ21lbnRzLCBmYW1pbHkuaGVsZCAhPT0gdW5kZWZpbmVkID8gZmFtaWx5LmhlbGQudmFsdWUgOiBzdHJ1Y3R1cmVkQ2xvbmUoYWZ0ZXIpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgdmFsdWUgdGhlIHN0YWdlJ3MgJ2Z1bGwnIHJvd3MgZ2l2ZSBhIHBhdGgg4oCUIHdoYXQgdGhlIGRlbHRhIGVuY29kZXJcbiAgICogY29tbWl0cyBmb3IgYSBmYW1pbHkgbWVtYmVyIG9yIGEgcGF0aCB3aXRoIGEgYHNldGAg4oCUIHJlYWQgZnJvbSBPTkVcbiAgICoge0BsaW5rIGRyeUZvbGR9IG9mIHRob3NlIHJvd3Mgb3ZlciB0aGUgcGF0Y2ggdHJlZXMgdGhlbXNlbHZlcywgdGFrZW4gdGhlXG4gICAqIGZpcnN0IHRpbWUgaXQgaXMgYXNrZWQuIEJ5IHJlZmVyZW5jZSwgYXMgdGhlIHN0YWdlIGhlbGQgdGhlbTogYW4gZWxlbWVudFxuICAgKiBhIGBzZXRgIGFuZCBhIGBtZXJnZWAgb2Ygb25lIHBhdGggc2hhcmUgc3RheXMgb25lIGVsZW1lbnQuIEEgc3RhZ2UgdGhhdFxuICAgKiBzdGFnZWQgbm8gYG1lcmdlYCBhbmQgbm8gbmVzdGVkIG9wIG5lZWRzIG5vIGZvbGQg4oCUIGEgcGF0aCdzIHZhbHVlIGlzIGl0c1xuICAgKiBsYXN0IHN0YWdlZCB2YWx1ZS4gKEJlZm9yZSA5LjMwLjA6IHR3byByZXBsaWNhcyBvZiB0aGUgdmVyYiBsYXcsXG4gICAqIGByZXBsYXlQYXRoVmVyYnNgIGFuZCBgcmVwbGF5RmFtaWx5VmVyYnNgLilcbiAgICovXG4gIHByaXZhdGUgZnVsbFJvd3NWYWx1ZSgpOiAoc2VnbWVudHM6IHN0cmluZ1tdKSA9PiB1bmtub3duIHtcbiAgICBpZiAodGhpcy5zdGFnZWRNZXJnZXMgPT09IDAgJiYgdGhpcy5uZXN0ZWRPcHMgPT09IDApIHJldHVybiAoc2VnbWVudHMpID0+IF9nZXQodGhpcy5vdmVyd3JpdGVQYXRjaCwgc2VnbWVudHMpO1xuICAgIGxldCBmb2xkOiB1bmtub3duO1xuICAgIHJldHVybiAoc2VnbWVudHMpID0+IHtcbiAgICAgIGZvbGQgPz89IGRyeUZvbGQodGhpcy5iYXNlU25hcHNob3QsIHRoaXMudXBkYXRlUGF0Y2gsIHRoaXMub3ZlcndyaXRlUGF0Y2gsIHRoaXMuZnVsbFJvd3MoKSk7XG4gICAgICByZXR1cm4gX2dldChmb2xkLCBzZWdtZW50cyk7XG4gICAgfTtcbiAgfVxuXG4gIC8qKiBUaGUgc3RhZ2UncyAnZnVsbCcgcm93czogZXZlcnkgb3Agb24gYSBwYXRoIHRoZSBuZXQtY2hhbmdlIGZpbHRlciBrZWVwcywgYSBgZGVsZXRlYCBzcGVsbGVkIGBzZXRgLiAqL1xuICBwcml2YXRlIGZ1bGxSb3dzKCk6IFRyYWNlRW50cnlbXSB7XG4gICAgY29uc3Qga2VlcCA9IG5ldyBNYXA8c3RyaW5nLCBib29sZWFuPigpO1xuICAgIGNvbnN0IHJvd3M6IFRyYWNlRW50cnlbXSA9IFtdO1xuICAgIGZvciAoY29uc3Qgb3Agb2YgdGhpcy5vcFRyYWNlKSB7XG4gICAgICBsZXQgayA9IGtlZXAuZ2V0KG9wLnBhdGgpO1xuICAgICAgaWYgKGsgPT09IHVuZGVmaW5lZCkga2VlcC5zZXQob3AucGF0aCwgKGsgPSB0aGlzLmNoYW5nZWRTaW5jZUJhc2Uob3AucGF0aC5zcGxpdChERUxJTSkpKSk7XG4gICAgICBpZiAoaykgcm93cy5wdXNoKHsgcGF0aDogb3AucGF0aCwgdmVyYjogb3AudmVyYiA9PT0gJ21lcmdlJyA/ICdtZXJnZScgOiAnc2V0JyB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHJvd3M7XG4gIH1cblxuICAvKipcbiAgICogRGlkIHRoZSBzdGFnZSBjaGFuZ2UgdGhlIHZhbHVlIGF0IGBzZWdtZW50c2A/IEJhc2UgYW5kIGZpbmFsIHZhbHVlIGFyZVxuICAgKiBmaXhlZCBhdCBjb21taXQsIHNvIHRoaXMgaXMgdGhlIE9ORSBuZXQtY2hhbmdlIHZlcmRpY3QgYm90aCBwYXlsb2FkXG4gICAqIGVuY29kaW5ncyBhcHBseSAoYSBuby1vcCB3cml0ZSBhbmQgYSB3cml0ZS10aGVuLXJldmVydCBib3RoIGZhaWwgaXQpLlxuICAgKi9cbiAgcHJpdmF0ZSBjaGFuZ2VkU2luY2VCYXNlKHNlZ21lbnRzOiBzdHJpbmdbXSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhZGVlcEVxdWFsKF9nZXQodGhpcy5iYXNlU25hcHNob3QsIHNlZ21lbnRzKSwgX2dldCh0aGlzLndvcmtpbmdDb3B5LCBzZWdtZW50cykpO1xuICB9XG5cbiAgLyoqXG4gICAqIFBhdGgg4oaSIGl0cyBvcC12ZXJiIHNlcXVlbmNlLCBvcmRlcmVkIGJ5IExBU1QgdG91Y2ggKGRlbGV0ZSArIHJlLWluc2VydFxuICAgKiBtb3ZlcyBhIHJlLXRvdWNoZWQgcGF0aCB0byB0aGUgZW5kIG9mIHRoZSBNYXAncyBpbnNlcnRpb24gb3JkZXIg4oCUXG4gICAqIHByZXNlcnZpbmcgbGFzdC13cml0ZXItd2lucyBmb3IgbmVzdGVkL292ZXJsYXBwaW5nIHBhdGhzKS4gUGVyLXdyaXRlXG4gICAqIHByb3ZlbmFuY2UgKCNQMSk6IHRoZSBMQVNUIG9wJ3MgcmVhZEtleXMgaXMga2VwdCDigJQgcmVhZCBwcmVmaXhlcyBvbmx5IGdyb3dcbiAgICogd2l0aGluIGEgc3RhZ2UsIHNvIGxhc3QgPT0gdW5pb24gYWNyb3NzIHRoZSBwYXRoLlxuICAgKi9cbiAgcHJpdmF0ZSBvcHNCeVBhdGgoKTogTWFwPHN0cmluZywgeyB2ZXJiczogT3BWZXJiW107IHJlYWRLZXlzPzogc3RyaW5nW107IGxhc3Q6IG51bWJlciB9PiB7XG4gICAgY29uc3QgYnlQYXRoID0gbmV3IE1hcDxzdHJpbmcsIHsgdmVyYnM6IE9wVmVyYltdOyByZWFkS2V5cz86IHN0cmluZ1tdOyBsYXN0OiBudW1iZXIgfT4oKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMub3BUcmFjZS5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3Qgb3AgPSB0aGlzLm9wVHJhY2VbaV07XG4gICAgICBjb25zdCBwcmV2ID0gYnlQYXRoLmdldChvcC5wYXRoKTtcbiAgICAgIGlmIChwcmV2KSB7XG4gICAgICAgIHByZXYudmVyYnMucHVzaChvcC52ZXJiKTtcbiAgICAgICAgcHJldi5sYXN0ID0gaTtcbiAgICAgICAgaWYgKG9wLnJlYWRLZXlzICE9PSB1bmRlZmluZWQpIHByZXYucmVhZEtleXMgPSBvcC5yZWFkS2V5cztcbiAgICAgICAgYnlQYXRoLmRlbGV0ZShvcC5wYXRoKTtcbiAgICAgICAgYnlQYXRoLnNldChvcC5wYXRoLCBwcmV2KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGJ5UGF0aC5zZXQob3AucGF0aCwge1xuICAgICAgICAgIHZlcmJzOiBbb3AudmVyYl0sXG4gICAgICAgICAgbGFzdDogaSxcbiAgICAgICAgICAuLi4ob3AucmVhZEtleXMgIT09IHVuZGVmaW5lZCAmJiB7IHJlYWRLZXlzOiBvcC5yZWFkS2V5cyB9KSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBieVBhdGg7XG4gIH1cblxuICAvKiogVGhlIG5ldC1jaGFuZ2UgZmlsdGVyIOKAlCBpZGVudGljYWwgdG8gJ2Z1bGwnICh7QGxpbmsgY2hhbmdlZFNpbmNlQmFzZX0pLiBTdXJ2aXZvcnMga2VlcCBsYXN0LXRvdWNoIG9yZGVyLiAqL1xuICBwcml2YXRlIG5ldENoYW5nZVN1cnZpdm9ycyhieVBhdGg6IE1hcDxzdHJpbmcsIHsgdmVyYnM6IE9wVmVyYltdOyByZWFkS2V5cz86IHN0cmluZ1tdOyBsYXN0OiBudW1iZXIgfT4pOiBTdXJ2aXZvcltdIHtcbiAgICBjb25zdCBzdXJ2aXZvcnM6IFN1cnZpdm9yW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IFtwYXRoLCB7IHZlcmJzLCByZWFkS2V5cywgbGFzdCB9XSBvZiBieVBhdGgpIHtcbiAgICAgIGNvbnN0IHNlZ21lbnRzID0gcGF0aC5zcGxpdChERUxJTSk7XG4gICAgICBpZiAoIXRoaXMuY2hhbmdlZFNpbmNlQmFzZShzZWdtZW50cykpIGNvbnRpbnVlOyAvLyBuby1vcCBvciB3cml0ZS10aGVuLXJldmVydCDihpIgbm8gbmV0IGNoYW5nZVxuICAgICAgY29uc3QgYmVmb3JlID0gX2dldCh0aGlzLmJhc2VTbmFwc2hvdCwgc2VnbWVudHMpO1xuICAgICAgY29uc3QgYWZ0ZXIgPSBfZ2V0KHRoaXMud29ya2luZ0NvcHksIHNlZ21lbnRzKTtcbiAgICAgIHN1cnZpdm9ycy5wdXNoKHsgcGF0aCwgc2VnbWVudHMsIHZlcmJzLCByZWFkS2V5cywgbGFzdCwgYmVmb3JlLCBhZnRlciB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHN1cnZpdm9ycztcbiAgfVxuXG4gIC8qKlxuICAgKiBNYXkgYSBzdGFnZWQgYGRlbGV0ZWAgYXQgdGhpcyBwYXRoIGNvbW1pdCBhcyB0aGUgYCdkZWxldGUnYCB2ZXJiP1xuICAgKlxuICAgKiBPbmx5IHdoZW4gcmVtb3ZpbmcgdGhlIGtleSBhbmQgdGhlIGAnZnVsbCdgIG1vZGUncyBmbGF0dGVuaW5nIChgX3NldGAgb2ZcbiAgICogYHVuZGVmaW5lZGApIGxhbmQgaW4gdGhlIHNhbWUgcGxhY2UuIFRoZXkgZGl2ZXJnZSB3aGVuIHRoZSBwYXJlbnQgaXMgbm90XG4gICAqIGEgY29udGFpbmVyOiBgbmF0aXZlRGVsZXRlYCB3YWxrcyBhd2F5IHVudG91Y2hlZCwgd2hpbGUgYG5hdGl2ZVNldGBcbiAgICogQ09FUkNFUyB0aGUgcHJpbWl0aXZlIHBhcmVudCBpbnRvIGFuIG9iamVjdCB0byBob2xkIHRoZSBrZXkuIENvbW1pdHRpbmdcbiAgICogYGRlbGV0ZWAgdGhlcmUgd291bGQgc2lsZW50bHkgZHJvcCBhIHN0YXRlIGNoYW5nZSB0aGUgc3RhZ2UgcmVhbGx5IG1hZGUsXG4gICAqIHNvIHRob3NlIChwYXRob2xvZ2ljYWwpIGRlbGV0ZXMga2VlcCB0aGUgaGlzdG9yaWNhbCBmbGF0dGVuaW5nLlxuICAgKi9cbiAgcHJpdmF0ZSBkZWxldGVSZXBsYXlzQXNGbGF0dGVuaW5nKHNlZ21lbnRzOiBzdHJpbmdbXSk6IGJvb2xlYW4ge1xuICAgIGlmIChzZWdtZW50cy5sZW5ndGggPT09IDEpIHJldHVybiB0cnVlOyAvLyBwYXJlbnQgaXMgdGhlIHN0YXRlIHJvb3Qg4oCUIGFsd2F5cyBhIGNvbnRhaW5lclxuICAgIGNvbnN0IHBhcmVudCA9IF9nZXQodGhpcy5iYXNlU25hcHNob3QsIHNlZ21lbnRzLnNsaWNlKDAsIC0xKSk7XG4gICAgcmV0dXJuIHBhcmVudCAhPT0gbnVsbCAmJiB0eXBlb2YgcGFyZW50ID09PSAnb2JqZWN0JztcbiAgfVxufVxuXG4vKipcbiAqIEhpc3RvcmljYWwgZmxhdHRlbmluZyBmb3IgdGhlIGAnZnVsbCdgIHBheWxvYWQ6IGFuIGV4cGxpY2l0IGRlbGV0ZSBjb21taXRzXG4gKiBhcyBzZXQtb2YtdW5kZWZpbmVkLiBQZXItd3JpdGUgcHJvdmVuYW5jZSAoI1AxKSByaWRlcyBlYWNoIHN1cnZpdmluZyBlbnRyeVxuICogdW50b3VjaGVkLlxuICovXG5mdW5jdGlvbiBmbGF0dGVuZWRUcmFjZVJvdyhvcDogeyBwYXRoOiBzdHJpbmc7IHZlcmI6IE9wVmVyYjsgcmVhZEtleXM/OiBzdHJpbmdbXSB9KTogVHJhY2VFbnRyeSB7XG4gIHJldHVybiBvcC52ZXJiID09PSAnZGVsZXRlJ1xuICAgID8geyBwYXRoOiBvcC5wYXRoLCB2ZXJiOiAnc2V0JyBhcyBjb25zdCwgLi4uKG9wLnJlYWRLZXlzICE9PSB1bmRlZmluZWQgJiYgeyByZWFkS2V5czogb3AucmVhZEtleXMgfSkgfVxuICAgIDogb3A7XG59XG5cbi8qKiBBIHJvdydzIGByZWFkS2V5c2AgZnJhZ21lbnQg4oCUIGFic2VudCB1bmxlc3MgdGhlIHByb3ZlbmFuY2UgZGlhbCByZWNvcmRlZCBvbmUgKCNQMSkuICovXG5mdW5jdGlvbiBwcm92ZW5hbmNlKHJlYWRLZXlzOiBzdHJpbmdbXSB8IHVuZGVmaW5lZCk6IHsgcmVhZEtleXM6IHN0cmluZ1tdIH0gfCB1bmRlZmluZWQge1xuICByZXR1cm4gcmVhZEtleXMgIT09IHVuZGVmaW5lZCA/IHsgcmVhZEtleXMgfSA6IHVuZGVmaW5lZDtcbn1cbiJdfQ==
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==
@@ -48,10 +48,11 @@ function foldsBack(fold, workingCopy, family, address) {
48
48
  return false;
49
49
  const folded = _get(fold, segments);
50
50
  const read = _get(workingCopy, segments);
51
- if (deepEqual(folded, read))
51
+ // Both sides are the same values as a record holds them: an opaque one (a Blob) is never the same object.
52
+ if (deepEqual(folded, read, 'copies'))
52
53
  return true;
53
54
  family.held = { value: structuredClone(read) };
54
- return deepEqual(folded, family.held.value);
55
+ return deepEqual(folded, family.held.value, 'copies');
55
56
  }
56
57
  /**
57
58
  * Every staged path grouped under its SHALLOWEST staged ancestor-or-self —
@@ -149,4 +150,4 @@ function shallowestIn(path, touched) {
149
150
  }
150
151
  return path;
151
152
  }
152
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRtaXNzaW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9tZW1vcnkvYWRtaXNzaW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBRSxXQUFXLEVBQUUsU0FBUyxJQUFJLElBQUksRUFBRSxRQUFRLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFFeEUsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBa0N2RDs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLGFBQWEsQ0FDM0IsU0FBZSxFQUNmLElBQWEsRUFDYixXQUFvQixFQUNwQixHQUF3QixFQUN4QixPQUEwQjtJQUUxQixNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLFNBQVMsRUFBRSxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDcEYsTUFBTSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsR0FBRyxlQUFlLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDbEQsSUFBSSxLQUFzQyxDQUFDO0lBQzNDLEtBQUssTUFBTSxNQUFNLElBQUksUUFBUSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUM7UUFDdkMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRSxPQUFPLENBQUM7WUFBRSxDQUFDLEtBQUssS0FBSyxJQUFJLEdBQUcsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDckcsQ0FBQztJQUNELE9BQU8sS0FBSyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLENBQUM7QUFDdkUsQ0FB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LEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2xELElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUM7WUFBRSxPQUFPLFFBQVEsQ0FBQztJQUM3QyxDQUFDO0lBQ0QsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBhZG1pc3Npb24udHMg4oCUIHRoZSBhZG1pdHRlZCByZWNvcmQncyBjaGVjayAoOS4zMC4wKTogZG9lcyBhIGNvbW1pdCdzIGJ1bmRsZVxuICogZm9sZCBiYWNrIHRvIHdoYXQgaXRzIHN0YWdlIHJlYWQ/IChkb2NzL2Rlc2lnbi8yMDI2LTEwLWFkbWl0dGVkLXJlY29yZC5tZClcbiAqXG4gKiBUSEUgTEFXOiBhIGNvbW1pdCBpcyBhZG1pdHRlZCBvbmx5IGlmIGl0cyBidW5kbGUsIHJlcGxheWVkIG9udG8gdGhlIHN0YXRlXG4gKiB0aGUgc3RhZ2UgYmVnYW4gZnJvbSwgZ2l2ZXMgYmFjayB0aGUgc3RhZ2UncyByZWFkLXlvdXItd3JpdGVzIHZpZXcgYXQgZXZlcnlcbiAqIHBhdGggdGhlIHN0YWdlIHRvdWNoZWQg4oCUIGFuZCBhdCBldmVyeSBjb250YWluZXIgYW5kIGFycmF5IHNsb3QgaXRzIHdyaXRlc1xuICogbWFkZSBvbiB0aGUgd2F5IHRoZXJlLCBiZWxvdyB0aGUgc3RhZ2UncyBhZGRyZXNzLlxuICpcbiAqIFB1cmU6IGhhbmRlZCB0aGUgY2FuZGlkYXRlIHJvd3MsIHRoZSBzdGFnZSdzIGRpZmYgYmFzZSwgaXRzIHdvcmtpbmcgY29weSxcbiAqIGl0cyBvcCB0cmFjZSBhbmQgaXRzIGFkZHJlc3MsIHtAbGluayBsb3NzeUZhbWlsaWVzfSBhbnN3ZXJzIHdoaWNoIGZhbWlsaWVzXG4gKiBvZiB0b3VjaGVkIHBhdGhzIGRvIG5vdCBmb2xkIGJhY2suIGBUcmFuc2FjdGlvbkJ1ZmZlciDCtyBhZG1pdGAgYXNrcyBvbmNlIHBlclxuICogY29tbWl0IHRoYXQgc3RhZ2VkIGEgYG1lcmdlYCBvciBhIG5lc3RlZCBvcCwgYW5kIGxheXMgdGhlIHJvd3Mgb3V0IGFnYWluXG4gKiB3aXRoIHRob3NlIGZhbWlsaWVzIHdyaXR0ZW4gYXMgd2hhdCB0aGUgc3RhZ2UgcmVhZC4gVGhlIGZvbGQgaXMgdGhlIG9uZVxuICogdmVyYiBsYXcgKHtAbGluayBkcnlGb2xkfSwgbm8gY2xvbmUpOyB0aGUgY29tcGFyZSBpcyB7QGxpbmsgZGVlcEVxdWFsfS5cbiAqL1xuXG5pbXBvcnQgeyBpc0NvbnRhaW5lciwgbmF0aXZlR2V0IGFzIF9nZXQsIG93bkNoaWxkIH0gZnJvbSAnLi9wYXRoT3BzLmpzJztcbmltcG9ydCB0eXBlIHsgTWVtb3J5UGF0Y2gsIFRyYWNlRW50cnkgfSBmcm9tICcuL3R5cGVzLmpzJztcbmltcG9ydCB7IGRlZXBFcXVhbCwgREVMSU0sIGRyeUZvbGQgfSBmcm9tICcuL3V0aWxzLmpzJztcblxuLyoqIFRoZSByb3dzIGEgcGF5bG9hZCBpcyBidWlsdCBmcm9tLCBiZWZvcmUgdGhlIGNvbW1pdCBuYW1lcyBpdHMgcmVkYWN0ZWQgcGF0aHMuICovXG5leHBvcnQgdHlwZSBSb3dzID0geyBvdmVyd3JpdGU6IE1lbW9yeVBhdGNoOyB1cGRhdGVzOiBNZW1vcnlQYXRjaDsgdHJhY2U6IFRyYWNlRW50cnlbXSB9O1xuXG4vKiogT25lIHN0YWdlZCBvcCwgYXMgYFRyYW5zYWN0aW9uQnVmZmVyYCByZWNvcmRzIGl0LiAqL1xuZXhwb3J0IHR5cGUgU3RhZ2VkT3AgPSB7IHBhdGg6IHN0cmluZzsgdmVyYjogc3RyaW5nOyByZWFkS2V5cz86IHN0cmluZ1tdIH07XG5cbi8qKiBBIHN0YWdlZCBwYXRoIGluIGEge0BsaW5rIEZhbWlseX0sIHdpdGggaXRzIGxhc3Qgb3AncyByZWFkIHByZWZpeC4gKi9cbmV4cG9ydCB0eXBlIE1lbWJlciA9IHsgcGF0aDogc3RyaW5nOyByZWFkS2V5cz86IHN0cmluZ1tdIH07XG5cbi8qKlxuICogQSBmYW1pbHkgb2YgVE9VQ0hFRCBwYXRoczogZXZlcnkgc3RhZ2VkIHBhdGggdW5kZXIgaXRzIHNoYWxsb3dlc3Qgc3RhZ2VkXG4gKiBhbmNlc3Rvci1vci1zZWxmIOKAlCB0aGUgdW5pdCB0aGUgY2hlY2sgdmVyaWZpZXMgYW5kLCB3aGVuIGl0IGRvZXMgbm90IGZvbGRcbiAqIGJhY2ssIHRoZSB1bml0IHJlLWVuY29kZWQuIFR3byBmYW1pbGllcyBuZXZlciBvdmVybGFwLlxuICovXG5leHBvcnQgdHlwZSBGYW1pbHkgPSB7XG4gIHJvb3Q6IHN0cmluZztcbiAgcm9vdFNlZ21lbnRzOiBzdHJpbmdbXTtcbiAgLyoqIEl0cyBzdGFnZWQgcGF0aHMsIGJ5IGxhc3QgdG91Y2guICovXG4gIG1lbWJlcnM6IE1lbWJlcltdO1xuICAvKiogSW5kZXggaW4gdGhlIG9wIHRyYWNlIG9mIHRoZSBmYW1pbHkncyBsYXN0IG9wOiB3aGVyZSBpdHMgcmUtZW5jb2RlZCByb3dzIGdvLiAqL1xuICBzbG90OiBudW1iZXI7XG4gIC8qKlxuICAgKiBUaGUgcm9vdCdzIHJlYWQtYmFjayBhcyBhIHJlY29yZCBjYW4gaG9sZCBpdCDigJQgaXRzIGBzdHJ1Y3R1cmVkQ2xvbmVgLFxuICAgKiBib3hlZCDigJQgd2hlbiB0aGUgY2hlY2sgdG9vayBvbmUgKHtAbGluayBmb2xkc0JhY2t9KTsgdGhlIHJlLWVuY29kaW5nXG4gICAqIHJldXNlcyBpdC5cbiAgICovXG4gIGhlbGQ/OiB7IHZhbHVlOiB1bmtub3duIH07XG59O1xuXG4vKiogVGhlIGZhbWlsaWVzIHdob3NlIHJvd3MgZGlkIG5vdCBmb2xkIGJhY2ssIGFuZCB3aGljaCBmYW1pbHkgZXZlcnkgc3RhZ2VkIHBhdGggaXMgaW4uICovXG5leHBvcnQgdHlwZSBMb3NzeSA9IHsgcm9vdE9mOiBNYXA8c3RyaW5nLCBzdHJpbmc+OyBmYW1pbGllczogTWFwPHN0cmluZywgRmFtaWx5PiB9O1xuXG4vKipcbiAqIFRoZSBmYW1pbGllcyBvZiBgb3BzYCB3aG9zZSBjYW5kaWRhdGUgcm93cyBkbyBub3QgZm9sZCBiYWNrIHRvIHdoYXQgdGhlXG4gKiBzdGFnZSByZWFkIOKAlCBgdW5kZWZpbmVkYCB3aGVuIGV2ZXJ5IGZhbWlseSBkb2VzLiBFYWNoIGZhbWlseSBST09UIGlzXG4gKiBjb21wYXJlZCAoe0BsaW5rIGZvbGRzQmFja30pOiBpdHMgdmFsdWUgYW5kIHRoZSB3YXkgZG93biB0byBpdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxvc3N5RmFtaWxpZXMoXG4gIGNhbmRpZGF0ZTogUm93cyxcbiAgYmFzZTogdW5rbm93bixcbiAgd29ya2luZ0NvcHk6IHVua25vd24sXG4gIG9wczogcmVhZG9ubHkgU3RhZ2VkT3BbXSxcbiAgYWRkcmVzczogcmVhZG9ubHkgc3RyaW5nW10sXG4pOiBMb3NzeSB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGZvbGQgPSBkcnlGb2xkKGJhc2UsIGNhbmRpZGF0ZS51cGRhdGVzLCBjYW5kaWRhdGUub3ZlcndyaXRlLCBjYW5kaWRhdGUudHJhY2UpO1xuICBjb25zdCB7IHJvb3RPZiwgZmFtaWxpZXMgfSA9IHRvdWNoZWRGYW1pbGllcyhvcHMpO1xuICBsZXQgbG9zc3k6IE1hcDxzdHJpbmcsIEZhbWlseT4gfCB1bmRlZmluZWQ7XG4gIGZvciAoY29uc3QgZmFtaWx5IG9mIGZhbWlsaWVzLnZhbHVlcygpKSB7XG4gICAgaWYgKCFmb2xkc0JhY2soZm9sZCwgd29ya2luZ0NvcHksIGZhbWlseSwgYWRkcmVzcykpIChsb3NzeSA/Pz0gbmV3IE1hcCgpKS5zZXQoZmFtaWx5LnJvb3QsIGZhbWlseSk7XG4gIH1cbiAgcmV0dXJuIGxvc3N5ID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiB7IHJvb3RPZiwgZmFtaWxpZXM6IGxvc3N5IH07XG59XG5cbi8qKlxuICogRG9lcyB0aGUgZm9sZCBnaXZlIGJhY2sgd2hhdCB0aGUgc3RhZ2UgcmVhZCBhdCBhIGZhbWlseSByb290PyBUaGUgd2F5IGRvd25cbiAqICh7QGxpbmsgc3BpbmVIZWxkfSksIHRoZW4gdGhlIHZhbHVlIGJ5IHtAbGluayBkZWVwRXF1YWx9IChhIHJvb3QgY292ZXJzIGV2ZXJ5XG4gKiBkZXNjZW5kYW50OyBhbiBvd24gYHVuZGVmaW5lZGAgaXMgYSBkZWxldGVkIGtleSkg4oCUIGFnYWluc3QgdGhlIHJlYWQtYmFjayBhc1xuICogYSByZWNvcmQgY2FuIGhvbGQgaXQuIEEgcmVjb3JkIGhvbGRzIGBzdHJ1Y3R1cmVkQ2xvbmVgcyBvZiB3aGF0IGEgc3RhZ2VcbiAqIHdyb3RlIChzdGF0ZSB2YWx1ZXMgbXVzdCBzdXJ2aXZlIG9uZSksIGFuZCBhIGZldyB2YWx1ZXMgZG8gbm90IHN1cnZpdmUgb25lXG4gKiB3aG9sZTogYW4gYEVycm9yYCdzIG93biBmaWVsZHMgYXJlIGRyb3BwZWQuIFdoZW4gdGhlIGZvbGQgZXF1YWxzIHRoZVxuICogcmVhZC1iYWNrJ3MgY2xvbmUsIG5vIHJvdyBjb3VsZCBob2xkIG1vcmUsIGFuZCB0aGUgZmFtaWx5IGlzIGFkbWl0dGVkIGFzIGl0XG4gKiBpczsgdGhlIGNsb25lLCB0YWtlbiBvbmx5IGZvciBhIHJvb3QgdGhlIGNoZWFwIGNvbXBhcmUgcmVmdXNlZCwgaXMga2VwdCBmb3JcbiAqIHRoZSByZS1lbmNvZGluZy5cbiAqL1xuZnVuY3Rpb24gZm9sZHNCYWNrKGZvbGQ6IHVua25vd24sIHdvcmtpbmdDb3B5OiB1bmtub3duLCBmYW1pbHk6IEZhbWlseSwgYWRkcmVzczogcmVhZG9ubHkgc3RyaW5nW10pOiBib29sZWFuIHtcbiAgY29uc3Qgc2VnbWVudHMgPSBmYW1pbHkucm9vdFNlZ21lbnRzO1xuICBpZiAoIXNwaW5lSGVsZChmb2xkLCB3b3JraW5nQ29weSwgc2VnbWVudHMsIGFkZHJlc3MpKSByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IGZvbGRlZCA9IF9nZXQoZm9sZCwgc2VnbWVudHMpO1xuICBjb25zdCByZWFkID0gX2dldCh3b3JraW5nQ29weSwgc2VnbWVudHMpO1xuICBpZiAoZGVlcEVxdWFsKGZvbGRlZCwgcmVhZCkpIHJldHVybiB0cnVlO1xuICBmYW1pbHkuaGVsZCA9IHsgdmFsdWU6IHN0cnVjdHVyZWRDbG9uZShyZWFkKSB9O1xuICByZXR1cm4gZGVlcEVxdWFsKGZvbGRlZCwgZmFtaWx5LmhlbGQudmFsdWUpO1xufVxuXG4vKipcbiAqIEV2ZXJ5IHN0YWdlZCBwYXRoIGdyb3VwZWQgdW5kZXIgaXRzIFNIQUxMT1dFU1Qgc3RhZ2VkIGFuY2VzdG9yLW9yLXNlbGYg4oCUXG4gKiBvdmVyIFRPVUNIRUQgcGF0aHMsIG5vdCBzdXJ2aXZpbmcgb25lczogYW4gb3AgdGhlIG5ldC1jaGFuZ2UgZmlsdGVyIGRyb3BzXG4gKiBjYW4gc3RpbGwgaGF2ZSBjaGFuZ2VkIHdoYXQgdGhlIHN0YWdlIHJlYWRzIChMLTEpLiBNZW1iZXJzIGFyZSBsaXN0ZWQgYnlcbiAqIGxhc3QgdG91Y2g7IGEgZmFtaWx5J3Mgc2xvdCBpcyBpdHMgbGFzdCBvcC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvdWNoZWRGYW1pbGllcyhvcHM6IHJlYWRvbmx5IFN0YWdlZE9wW10pOiB7XG4gIHJvb3RPZjogTWFwPHN0cmluZywgc3RyaW5nPjtcbiAgZmFtaWxpZXM6IE1hcDxzdHJpbmcsIEZhbWlseT47XG59IHtcbiAgY29uc3QgdG91Y2hlcyA9IG5ldyBNYXA8c3RyaW5nLCB7IGxhc3Q6IG51bWJlcjsgcmVhZEtleXM/OiBzdHJpbmdbXSB9PigpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IG9wcy5sZW5ndGg7IGkrKykge1xuICAgIHRvdWNoZXMuZGVsZXRlKG9wc1tpXS5wYXRoKTsgLy8gcmUtaW5zZXJ0OiB0aGUgTWFwJ3Mgb3JkZXIgaXMgbGFzdC10b3VjaCBvcmRlclxuICAgIHRvdWNoZXMuc2V0KG9wc1tpXS5wYXRoLCB7IGxhc3Q6IGksIHJlYWRLZXlzOiBvcHNbaV0ucmVhZEtleXMgfSk7XG4gIH1cbiAgY29uc3Qgcm9vdE9mID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcbiAgY29uc3QgZmFtaWxpZXMgPSBuZXcgTWFwPHN0cmluZywgRmFtaWx5PigpO1xuICBmb3IgKGNvbnN0IFtwYXRoLCB0b3VjaF0gb2YgdG91Y2hlcykge1xuICAgIGNvbnN0IHJvb3QgPSBzaGFsbG93ZXN0SW4ocGF0aCwgdG91Y2hlcyk7XG4gICAgcm9vdE9mLnNldChwYXRoLCByb290KTtcbiAgICBsZXQgZmFtaWx5ID0gZmFtaWxpZXMuZ2V0KHJvb3QpO1xuICAgIGlmIChmYW1pbHkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgZmFtaWx5ID0geyByb290LCByb290U2VnbWVudHM6IHJvb3Quc3BsaXQoREVMSU0pLCBtZW1iZXJzOiBbXSwgc2xvdDogdG91Y2gubGFzdCB9O1xuICAgICAgZmFtaWxpZXMuc2V0KHJvb3QsIGZhbWlseSk7XG4gICAgfVxuICAgIGZhbWlseS5tZW1iZXJzLnB1c2goeyBwYXRoLCByZWFkS2V5czogdG91Y2gucmVhZEtleXMgfSk7XG4gICAgaWYgKHRvdWNoLmxhc3QgPiBmYW1pbHkuc2xvdCkgZmFtaWx5LnNsb3QgPSB0b3VjaC5sYXN0O1xuICB9XG4gIHJldHVybiB7IHJvb3RPZiwgZmFtaWxpZXMgfTtcbn1cblxuLyoqXG4gKiBIb3cgbWFueSBsZWFkaW5nIHNlZ21lbnRzIG9mIGBwYXRoYCBhcmUgdGhlIHN0YWdlJ3MgYGFkZHJlc3NgIOKAlCBpdHMgbGVuZ3RoXG4gKiB3aGVuIGBwYXRoYCBsaWVzIHN0cmljdGx5IGJlbG93IGl0LCBlbHNlIDAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhZGRyZXNzRGVwdGhPZihwYXRoOiByZWFkb25seSAoc3RyaW5nIHwgbnVtYmVyKVtdLCBhZGRyZXNzOiByZWFkb25seSBzdHJpbmdbXSk6IG51bWJlciB7XG4gIGNvbnN0IGRlcHRoID0gYWRkcmVzcy5sZW5ndGg7XG4gIGlmIChkZXB0aCA9PT0gMCB8fCBwYXRoLmxlbmd0aCA8PSBkZXB0aCkgcmV0dXJuIDA7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgZGVwdGg7IGkrKykgaWYgKFN0cmluZyhwYXRoW2ldKSAhPT0gYWRkcmVzc1tpXSkgcmV0dXJuIDA7XG4gIHJldHVybiBkZXB0aDtcbn1cblxuLyoqXG4gKiBMLTE6IGEgbmVzdGVkIG9wIHRocm91Z2ggYW4gYWJzZW50IG9yIHByaW1pdGl2ZSBwYXJlbnQgbWFrZXMgdGhhdCBwYXJlbnQgYVxuICogY29udGFpbmVyIGluIHRoZSB3b3JraW5nIGNvcHkg4oCUIGFuZCB3aGVuIHRoZSBvcCBpdHNlbGYgY2hhbmdlcyBub3RoaW5nIChhXG4gKiBkZWxldGUgb2YgYSBrZXkgdGhhdCB3YXMgbmV2ZXIgdGhlcmUpIG5vIHJvdyBpcyBsZWZ0IHRvIG1ha2UgaXQgaW4gdGhlXG4gKiBmb2xkLCBzbyB0aGUgc3RhZ2UgcmVhZHMgYmFjayBhIGNvbnRhaW5lciB0aGUgcmVjb3JkIG5ldmVyIG1lbnRpb25zLiBUaGVcbiAqIHNhbWUgb3Agb24gYW4gQVJSQVkgcGFyZW50IHBhc3QgaXRzIGVuZCBncm93cyBpdCAoYGRlbGV0ZSBhLjBgIG9uIGBbXWBcbiAqIHJlYWRzIGJhY2sgYFt1bmRlZmluZWRdYCkuIEV2ZXJ5IGNvbnRhaW5lciB0aGUgd29ya2luZyBjb3B5IGhvbGRzIG9uIHRoZVxuICogd2F5IHRvIGBzZWdtZW50c2AsIGFuZCBldmVyeSBhcnJheSBzbG90IGVhY2ggc3RlcCBsYW5kcyBpbiwgbXVzdCBiZSBvbmUgdGhlXG4gKiBmb2xkIGhvbGRzIHRvbyDigJQgYmVsb3cgdGhlIHN0YWdlJ3MgYWRkcmVzcywgd2hvc2UgY29udGFpbmVycyBhcmUgd2hlcmUgaXRcbiAqIHdyaXRlcywgbm90IGEgdmFsdWUgaXQgcmVhZHMuXG4gKi9cbmZ1bmN0aW9uIHNwaW5lSGVsZChmb2xkOiB1bmtub3duLCB3b3JraW5nQ29weTogdW5rbm93biwgc2VnbWVudHM6IHN0cmluZ1tdLCBhZGRyZXNzOiByZWFkb25seSBzdHJpbmdbXSk6IGJvb2xlYW4ge1xuICBjb25zdCBmcm9tID0gYWRkcmVzc0RlcHRoT2Yoc2VnbWVudHMsIGFkZHJlc3MpO1xuICBsZXQgZjogdW5rbm93biA9IGZvbGQ7XG4gIGxldCB3OiB1bmtub3duID0gd29ya2luZ0NvcHk7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc2VnbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoaSA+PSBmcm9tICYmICFzbG90SGVsZChmLCB3LCBzZWdtZW50c1tpXSkpIHJldHVybiBmYWxzZTtcbiAgICBpZiAoaSA9PT0gc2VnbWVudHMubGVuZ3RoIC0gMSkgcmV0dXJuIHRydWU7XG4gICAgZiA9IG93bkNoaWxkKGYsIHNlZ21lbnRzW2ldKTtcbiAgICB3ID0gb3duQ2hpbGQodywgc2VnbWVudHNbaV0pO1xuICAgIGlmICghaXNDb250YWluZXIodykpIHJldHVybiB0cnVlO1xuICAgIGlmIChpID49IGZyb20gJiYgKCFpc0NvbnRhaW5lcihmKSB8fCBBcnJheS5pc0FycmF5KGYpICE9PSBBcnJheS5pc0FycmF5KHcpKSkgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG4vKipcbiAqIERvZXMgdGhlIGZvbGQgaG9sZCBldmVyeSBhcnJheSBzbG90IHRoZSB3b3JraW5nIGNvcHkncyBjb250YWluZXIgYHdgIGhvbGRzXG4gKiBhdCBga2V5YD8gT25seSBhbiBhcnJheSBjYW4gYmUgZ3Jvd24gYnkgYSB3cml0ZSB0aGF0IGNoYW5nZXMgbm90aGluZyBlbHNlXG4gKiAoYW4gaW5kZXggcGFzdCBpdHMgZW5kLCBzZXQgdG8gYHVuZGVmaW5lZGApOyBhbiBvYmplY3QncyBvd24gYHVuZGVmaW5lZGBcbiAqIGtleSBpcyBhIGRlbGV0ZWQga2V5IHRvIGV2ZXJ5IHJlYWRlciwgc28gb2JqZWN0cyBhbHdheXMgcGFzcy5cbiAqL1xuZnVuY3Rpb24gc2xvdEhlbGQoZjogdW5rbm93biwgdzogdW5rbm93biwga2V5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgaWYgKCFBcnJheS5pc0FycmF5KHcpKSByZXR1cm4gdHJ1ZTtcbiAgY29uc3QgaW5kZXggPSBOdW1iZXIoa2V5KTtcbiAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKGluZGV4KSB8fCBpbmRleCA8IDAgfHwgU3RyaW5nKGluZGV4KSAhPT0ga2V5IHx8IGluZGV4ID49IHcubGVuZ3RoKSByZXR1cm4gdHJ1ZTtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkoZikgJiYgaW5kZXggPCBmLmxlbmd0aDtcbn1cblxuLyoqIFRoZSBzaGFsbG93ZXN0IG9mIGBwYXRoYCBhbmQgaXRzIGFuY2VzdG9ycyB0aGF0IGB0b3VjaGVkYCBob2xkcyDigJQgaXRzIGZhbWlseSdzIHJvb3QuICovXG5mdW5jdGlvbiBzaGFsbG93ZXN0SW4ocGF0aDogc3RyaW5nLCB0b3VjaGVkOiBSZWFkb25seU1hcDxzdHJpbmcsIHVua25vd24+KTogc3RyaW5nIHtcbiAgaWYgKHBhdGguaW5kZXhPZihERUxJTSkgPT09IC0xKSByZXR1cm4gcGF0aDtcbiAgY29uc3Qgc2VnbWVudHMgPSBwYXRoLnNwbGl0KERFTElNKTtcbiAgZm9yIChsZXQgaSA9IDE7IGkgPCBzZWdtZW50cy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGFuY2VzdG9yID0gc2VnbWVudHMuc2xpY2UoMCwgaSkuam9pbihERUxJTSk7XG4gICAgaWYgKHRvdWNoZWQuaGFzKGFuY2VzdG9yKSkgcmV0dXJuIGFuY2VzdG9yO1xuICB9XG4gIHJldHVybiBwYXRoO1xufVxuIl19
153
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRtaXNzaW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9tZW1vcnkvYWRtaXNzaW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBRSxXQUFXLEVBQUUsU0FBUyxJQUFJLElBQUksRUFBRSxRQUFRLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFFeEUsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBa0N2RDs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLGFBQWEsQ0FDM0IsU0FBZSxFQUNmLElBQWEsRUFDYixXQUFvQixFQUNwQixHQUF3QixFQUN4QixPQUEwQjtJQUUxQixNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLFNBQVMsRUFBRSxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDcEYsTUFBTSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsR0FBRyxlQUFlLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDbEQsSUFBSSxLQUFzQyxDQUFDO0lBQzNDLEtBQUssTUFBTSxNQUFNLElBQUksUUFBUSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUM7UUFDdkMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRSxPQUFPLENBQUM7WUFBRSxDQUFDLEtBQUssS0FBSyxJQUFJLEdBQUcsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDckcsQ0FBQztJQUNELE9BQU8sS0FBSyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLENBQUM7QUFDdkUsQ0FB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QUMsRUFBRSxFQUFFLENBQUM7UUFDekMsTUFBTSxRQUFRLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2xELElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUM7WUFBRSxPQUFPLFFBQVEsQ0FBQztJQUM3QyxDQUFDO0lBQ0QsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBhZG1pc3Npb24udHMg4oCUIHRoZSBhZG1pdHRlZCByZWNvcmQncyBjaGVjayAoOS4zMC4wKTogZG9lcyBhIGNvbW1pdCdzIGJ1bmRsZVxuICogZm9sZCBiYWNrIHRvIHdoYXQgaXRzIHN0YWdlIHJlYWQ/IChkb2NzL2Rlc2lnbi8yMDI2LTEwLWFkbWl0dGVkLXJlY29yZC5tZClcbiAqXG4gKiBUSEUgTEFXOiBhIGNvbW1pdCBpcyBhZG1pdHRlZCBvbmx5IGlmIGl0cyBidW5kbGUsIHJlcGxheWVkIG9udG8gdGhlIHN0YXRlXG4gKiB0aGUgc3RhZ2UgYmVnYW4gZnJvbSwgZ2l2ZXMgYmFjayB0aGUgc3RhZ2UncyByZWFkLXlvdXItd3JpdGVzIHZpZXcgYXQgZXZlcnlcbiAqIHBhdGggdGhlIHN0YWdlIHRvdWNoZWQg4oCUIGFuZCBhdCBldmVyeSBjb250YWluZXIgYW5kIGFycmF5IHNsb3QgaXRzIHdyaXRlc1xuICogbWFkZSBvbiB0aGUgd2F5IHRoZXJlLCBiZWxvdyB0aGUgc3RhZ2UncyBhZGRyZXNzLlxuICpcbiAqIFB1cmU6IGhhbmRlZCB0aGUgY2FuZGlkYXRlIHJvd3MsIHRoZSBzdGFnZSdzIGRpZmYgYmFzZSwgaXRzIHdvcmtpbmcgY29weSxcbiAqIGl0cyBvcCB0cmFjZSBhbmQgaXRzIGFkZHJlc3MsIHtAbGluayBsb3NzeUZhbWlsaWVzfSBhbnN3ZXJzIHdoaWNoIGZhbWlsaWVzXG4gKiBvZiB0b3VjaGVkIHBhdGhzIGRvIG5vdCBmb2xkIGJhY2suIGBUcmFuc2FjdGlvbkJ1ZmZlciDCtyBhZG1pdGAgYXNrcyBvbmNlIHBlclxuICogY29tbWl0IHRoYXQgc3RhZ2VkIGEgYG1lcmdlYCBvciBhIG5lc3RlZCBvcCwgYW5kIGxheXMgdGhlIHJvd3Mgb3V0IGFnYWluXG4gKiB3aXRoIHRob3NlIGZhbWlsaWVzIHdyaXR0ZW4gYXMgd2hhdCB0aGUgc3RhZ2UgcmVhZC4gVGhlIGZvbGQgaXMgdGhlIG9uZVxuICogdmVyYiBsYXcgKHtAbGluayBkcnlGb2xkfSwgbm8gY2xvbmUpOyB0aGUgY29tcGFyZSBpcyB7QGxpbmsgZGVlcEVxdWFsfS5cbiAqL1xuXG5pbXBvcnQgeyBpc0NvbnRhaW5lciwgbmF0aXZlR2V0IGFzIF9nZXQsIG93bkNoaWxkIH0gZnJvbSAnLi9wYXRoT3BzLmpzJztcbmltcG9ydCB0eXBlIHsgTWVtb3J5UGF0Y2gsIFRyYWNlRW50cnkgfSBmcm9tICcuL3R5cGVzLmpzJztcbmltcG9ydCB7IGRlZXBFcXVhbCwgREVMSU0sIGRyeUZvbGQgfSBmcm9tICcuL3V0aWxzLmpzJztcblxuLyoqIFRoZSByb3dzIGEgcGF5bG9hZCBpcyBidWlsdCBmcm9tLCBiZWZvcmUgdGhlIGNvbW1pdCBuYW1lcyBpdHMgcmVkYWN0ZWQgcGF0aHMuICovXG5leHBvcnQgdHlwZSBSb3dzID0geyBvdmVyd3JpdGU6IE1lbW9yeVBhdGNoOyB1cGRhdGVzOiBNZW1vcnlQYXRjaDsgdHJhY2U6IFRyYWNlRW50cnlbXSB9O1xuXG4vKiogT25lIHN0YWdlZCBvcCwgYXMgYFRyYW5zYWN0aW9uQnVmZmVyYCByZWNvcmRzIGl0LiAqL1xuZXhwb3J0IHR5cGUgU3RhZ2VkT3AgPSB7IHBhdGg6IHN0cmluZzsgdmVyYjogc3RyaW5nOyByZWFkS2V5cz86IHN0cmluZ1tdIH07XG5cbi8qKiBBIHN0YWdlZCBwYXRoIGluIGEge0BsaW5rIEZhbWlseX0sIHdpdGggaXRzIGxhc3Qgb3AncyByZWFkIHByZWZpeC4gKi9cbmV4cG9ydCB0eXBlIE1lbWJlciA9IHsgcGF0aDogc3RyaW5nOyByZWFkS2V5cz86IHN0cmluZ1tdIH07XG5cbi8qKlxuICogQSBmYW1pbHkgb2YgVE9VQ0hFRCBwYXRoczogZXZlcnkgc3RhZ2VkIHBhdGggdW5kZXIgaXRzIHNoYWxsb3dlc3Qgc3RhZ2VkXG4gKiBhbmNlc3Rvci1vci1zZWxmIOKAlCB0aGUgdW5pdCB0aGUgY2hlY2sgdmVyaWZpZXMgYW5kLCB3aGVuIGl0IGRvZXMgbm90IGZvbGRcbiAqIGJhY2ssIHRoZSB1bml0IHJlLWVuY29kZWQuIFR3byBmYW1pbGllcyBuZXZlciBvdmVybGFwLlxuICovXG5leHBvcnQgdHlwZSBGYW1pbHkgPSB7XG4gIHJvb3Q6IHN0cmluZztcbiAgcm9vdFNlZ21lbnRzOiBzdHJpbmdbXTtcbiAgLyoqIEl0cyBzdGFnZWQgcGF0aHMsIGJ5IGxhc3QgdG91Y2guICovXG4gIG1lbWJlcnM6IE1lbWJlcltdO1xuICAvKiogSW5kZXggaW4gdGhlIG9wIHRyYWNlIG9mIHRoZSBmYW1pbHkncyBsYXN0IG9wOiB3aGVyZSBpdHMgcmUtZW5jb2RlZCByb3dzIGdvLiAqL1xuICBzbG90OiBudW1iZXI7XG4gIC8qKlxuICAgKiBUaGUgcm9vdCdzIHJlYWQtYmFjayBhcyBhIHJlY29yZCBjYW4gaG9sZCBpdCDigJQgaXRzIGBzdHJ1Y3R1cmVkQ2xvbmVgLFxuICAgKiBib3hlZCDigJQgd2hlbiB0aGUgY2hlY2sgdG9vayBvbmUgKHtAbGluayBmb2xkc0JhY2t9KTsgdGhlIHJlLWVuY29kaW5nXG4gICAqIHJldXNlcyBpdC5cbiAgICovXG4gIGhlbGQ/OiB7IHZhbHVlOiB1bmtub3duIH07XG59O1xuXG4vKiogVGhlIGZhbWlsaWVzIHdob3NlIHJvd3MgZGlkIG5vdCBmb2xkIGJhY2ssIGFuZCB3aGljaCBmYW1pbHkgZXZlcnkgc3RhZ2VkIHBhdGggaXMgaW4uICovXG5leHBvcnQgdHlwZSBMb3NzeSA9IHsgcm9vdE9mOiBNYXA8c3RyaW5nLCBzdHJpbmc+OyBmYW1pbGllczogTWFwPHN0cmluZywgRmFtaWx5PiB9O1xuXG4vKipcbiAqIFRoZSBmYW1pbGllcyBvZiBgb3BzYCB3aG9zZSBjYW5kaWRhdGUgcm93cyBkbyBub3QgZm9sZCBiYWNrIHRvIHdoYXQgdGhlXG4gKiBzdGFnZSByZWFkIOKAlCBgdW5kZWZpbmVkYCB3aGVuIGV2ZXJ5IGZhbWlseSBkb2VzLiBFYWNoIGZhbWlseSBST09UIGlzXG4gKiBjb21wYXJlZCAoe0BsaW5rIGZvbGRzQmFja30pOiBpdHMgdmFsdWUgYW5kIHRoZSB3YXkgZG93biB0byBpdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxvc3N5RmFtaWxpZXMoXG4gIGNhbmRpZGF0ZTogUm93cyxcbiAgYmFzZTogdW5rbm93bixcbiAgd29ya2luZ0NvcHk6IHVua25vd24sXG4gIG9wczogcmVhZG9ubHkgU3RhZ2VkT3BbXSxcbiAgYWRkcmVzczogcmVhZG9ubHkgc3RyaW5nW10sXG4pOiBMb3NzeSB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGZvbGQgPSBkcnlGb2xkKGJhc2UsIGNhbmRpZGF0ZS51cGRhdGVzLCBjYW5kaWRhdGUub3ZlcndyaXRlLCBjYW5kaWRhdGUudHJhY2UpO1xuICBjb25zdCB7IHJvb3RPZiwgZmFtaWxpZXMgfSA9IHRvdWNoZWRGYW1pbGllcyhvcHMpO1xuICBsZXQgbG9zc3k6IE1hcDxzdHJpbmcsIEZhbWlseT4gfCB1bmRlZmluZWQ7XG4gIGZvciAoY29uc3QgZmFtaWx5IG9mIGZhbWlsaWVzLnZhbHVlcygpKSB7XG4gICAgaWYgKCFmb2xkc0JhY2soZm9sZCwgd29ya2luZ0NvcHksIGZhbWlseSwgYWRkcmVzcykpIChsb3NzeSA/Pz0gbmV3IE1hcCgpKS5zZXQoZmFtaWx5LnJvb3QsIGZhbWlseSk7XG4gIH1cbiAgcmV0dXJuIGxvc3N5ID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiB7IHJvb3RPZiwgZmFtaWxpZXM6IGxvc3N5IH07XG59XG5cbi8qKlxuICogRG9lcyB0aGUgZm9sZCBnaXZlIGJhY2sgd2hhdCB0aGUgc3RhZ2UgcmVhZCBhdCBhIGZhbWlseSByb290PyBUaGUgd2F5IGRvd25cbiAqICh7QGxpbmsgc3BpbmVIZWxkfSksIHRoZW4gdGhlIHZhbHVlIGJ5IHtAbGluayBkZWVwRXF1YWx9IChhIHJvb3QgY292ZXJzIGV2ZXJ5XG4gKiBkZXNjZW5kYW50OyBhbiBvd24gYHVuZGVmaW5lZGAgaXMgYSBkZWxldGVkIGtleSkg4oCUIGFnYWluc3QgdGhlIHJlYWQtYmFjayBhc1xuICogYSByZWNvcmQgY2FuIGhvbGQgaXQuIEEgcmVjb3JkIGhvbGRzIGBzdHJ1Y3R1cmVkQ2xvbmVgcyBvZiB3aGF0IGEgc3RhZ2VcbiAqIHdyb3RlIChzdGF0ZSB2YWx1ZXMgbXVzdCBzdXJ2aXZlIG9uZSksIGFuZCBhIGZldyB2YWx1ZXMgZG8gbm90IHN1cnZpdmUgb25lXG4gKiB3aG9sZTogYW4gYEVycm9yYCdzIG93biBmaWVsZHMgYXJlIGRyb3BwZWQuIFdoZW4gdGhlIGZvbGQgZXF1YWxzIHRoZVxuICogcmVhZC1iYWNrJ3MgY2xvbmUsIG5vIHJvdyBjb3VsZCBob2xkIG1vcmUsIGFuZCB0aGUgZmFtaWx5IGlzIGFkbWl0dGVkIGFzIGl0XG4gKiBpczsgdGhlIGNsb25lLCB0YWtlbiBvbmx5IGZvciBhIHJvb3QgdGhlIGNoZWFwIGNvbXBhcmUgcmVmdXNlZCwgaXMga2VwdCBmb3JcbiAqIHRoZSByZS1lbmNvZGluZy5cbiAqL1xuZnVuY3Rpb24gZm9sZHNCYWNrKGZvbGQ6IHVua25vd24sIHdvcmtpbmdDb3B5OiB1bmtub3duLCBmYW1pbHk6IEZhbWlseSwgYWRkcmVzczogcmVhZG9ubHkgc3RyaW5nW10pOiBib29sZWFuIHtcbiAgY29uc3Qgc2VnbWVudHMgPSBmYW1pbHkucm9vdFNlZ21lbnRzO1xuICBpZiAoIXNwaW5lSGVsZChmb2xkLCB3b3JraW5nQ29weSwgc2VnbWVudHMsIGFkZHJlc3MpKSByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IGZvbGRlZCA9IF9nZXQoZm9sZCwgc2VnbWVudHMpO1xuICBjb25zdCByZWFkID0gX2dldCh3b3JraW5nQ29weSwgc2VnbWVudHMpO1xuICAvLyBCb3RoIHNpZGVzIGFyZSB0aGUgc2FtZSB2YWx1ZXMgYXMgYSByZWNvcmQgaG9sZHMgdGhlbTogYW4gb3BhcXVlIG9uZSAoYSBCbG9iKSBpcyBuZXZlciB0aGUgc2FtZSBvYmplY3QuXG4gIGlmIChkZWVwRXF1YWwoZm9sZGVkLCByZWFkLCAnY29waWVzJykpIHJldHVybiB0cnVlO1xuICBmYW1pbHkuaGVsZCA9IHsgdmFsdWU6IHN0cnVjdHVyZWRDbG9uZShyZWFkKSB9O1xuICByZXR1cm4gZGVlcEVxdWFsKGZvbGRlZCwgZmFtaWx5LmhlbGQudmFsdWUsICdjb3BpZXMnKTtcbn1cblxuLyoqXG4gKiBFdmVyeSBzdGFnZWQgcGF0aCBncm91cGVkIHVuZGVyIGl0cyBTSEFMTE9XRVNUIHN0YWdlZCBhbmNlc3Rvci1vci1zZWxmIOKAlFxuICogb3ZlciBUT1VDSEVEIHBhdGhzLCBub3Qgc3Vydml2aW5nIG9uZXM6IGFuIG9wIHRoZSBuZXQtY2hhbmdlIGZpbHRlciBkcm9wc1xuICogY2FuIHN0aWxsIGhhdmUgY2hhbmdlZCB3aGF0IHRoZSBzdGFnZSByZWFkcyAoTC0xKS4gTWVtYmVycyBhcmUgbGlzdGVkIGJ5XG4gKiBsYXN0IHRvdWNoOyBhIGZhbWlseSdzIHNsb3QgaXMgaXRzIGxhc3Qgb3AuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b3VjaGVkRmFtaWxpZXMob3BzOiByZWFkb25seSBTdGFnZWRPcFtdKToge1xuICByb290T2Y6IE1hcDxzdHJpbmcsIHN0cmluZz47XG4gIGZhbWlsaWVzOiBNYXA8c3RyaW5nLCBGYW1pbHk+O1xufSB7XG4gIGNvbnN0IHRvdWNoZXMgPSBuZXcgTWFwPHN0cmluZywgeyBsYXN0OiBudW1iZXI7IHJlYWRLZXlzPzogc3RyaW5nW10gfT4oKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBvcHMubGVuZ3RoOyBpKyspIHtcbiAgICB0b3VjaGVzLmRlbGV0ZShvcHNbaV0ucGF0aCk7IC8vIHJlLWluc2VydDogdGhlIE1hcCdzIG9yZGVyIGlzIGxhc3QtdG91Y2ggb3JkZXJcbiAgICB0b3VjaGVzLnNldChvcHNbaV0ucGF0aCwgeyBsYXN0OiBpLCByZWFkS2V5czogb3BzW2ldLnJlYWRLZXlzIH0pO1xuICB9XG4gIGNvbnN0IHJvb3RPZiA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG4gIGNvbnN0IGZhbWlsaWVzID0gbmV3IE1hcDxzdHJpbmcsIEZhbWlseT4oKTtcbiAgZm9yIChjb25zdCBbcGF0aCwgdG91Y2hdIG9mIHRvdWNoZXMpIHtcbiAgICBjb25zdCByb290ID0gc2hhbGxvd2VzdEluKHBhdGgsIHRvdWNoZXMpO1xuICAgIHJvb3RPZi5zZXQocGF0aCwgcm9vdCk7XG4gICAgbGV0IGZhbWlseSA9IGZhbWlsaWVzLmdldChyb290KTtcbiAgICBpZiAoZmFtaWx5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGZhbWlseSA9IHsgcm9vdCwgcm9vdFNlZ21lbnRzOiByb290LnNwbGl0KERFTElNKSwgbWVtYmVyczogW10sIHNsb3Q6IHRvdWNoLmxhc3QgfTtcbiAgICAgIGZhbWlsaWVzLnNldChyb290LCBmYW1pbHkpO1xuICAgIH1cbiAgICBmYW1pbHkubWVtYmVycy5wdXNoKHsgcGF0aCwgcmVhZEtleXM6IHRvdWNoLnJlYWRLZXlzIH0pO1xuICAgIGlmICh0b3VjaC5sYXN0ID4gZmFtaWx5LnNsb3QpIGZhbWlseS5zbG90ID0gdG91Y2gubGFzdDtcbiAgfVxuICByZXR1cm4geyByb290T2YsIGZhbWlsaWVzIH07XG59XG5cbi8qKlxuICogSG93IG1hbnkgbGVhZGluZyBzZWdtZW50cyBvZiBgcGF0aGAgYXJlIHRoZSBzdGFnZSdzIGBhZGRyZXNzYCDigJQgaXRzIGxlbmd0aFxuICogd2hlbiBgcGF0aGAgbGllcyBzdHJpY3RseSBiZWxvdyBpdCwgZWxzZSAwLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYWRkcmVzc0RlcHRoT2YocGF0aDogcmVhZG9ubHkgKHN0cmluZyB8IG51bWJlcilbXSwgYWRkcmVzczogcmVhZG9ubHkgc3RyaW5nW10pOiBudW1iZXIge1xuICBjb25zdCBkZXB0aCA9IGFkZHJlc3MubGVuZ3RoO1xuICBpZiAoZGVwdGggPT09IDAgfHwgcGF0aC5sZW5ndGggPD0gZGVwdGgpIHJldHVybiAwO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGRlcHRoOyBpKyspIGlmIChTdHJpbmcocGF0aFtpXSkgIT09IGFkZHJlc3NbaV0pIHJldHVybiAwO1xuICByZXR1cm4gZGVwdGg7XG59XG5cbi8qKlxuICogTC0xOiBhIG5lc3RlZCBvcCB0aHJvdWdoIGFuIGFic2VudCBvciBwcmltaXRpdmUgcGFyZW50IG1ha2VzIHRoYXQgcGFyZW50IGFcbiAqIGNvbnRhaW5lciBpbiB0aGUgd29ya2luZyBjb3B5IOKAlCBhbmQgd2hlbiB0aGUgb3AgaXRzZWxmIGNoYW5nZXMgbm90aGluZyAoYVxuICogZGVsZXRlIG9mIGEga2V5IHRoYXQgd2FzIG5ldmVyIHRoZXJlKSBubyByb3cgaXMgbGVmdCB0byBtYWtlIGl0IGluIHRoZVxuICogZm9sZCwgc28gdGhlIHN0YWdlIHJlYWRzIGJhY2sgYSBjb250YWluZXIgdGhlIHJlY29yZCBuZXZlciBtZW50aW9ucy4gVGhlXG4gKiBzYW1lIG9wIG9uIGFuIEFSUkFZIHBhcmVudCBwYXN0IGl0cyBlbmQgZ3Jvd3MgaXQgKGBkZWxldGUgYS4wYCBvbiBgW11gXG4gKiByZWFkcyBiYWNrIGBbdW5kZWZpbmVkXWApLiBFdmVyeSBjb250YWluZXIgdGhlIHdvcmtpbmcgY29weSBob2xkcyBvbiB0aGVcbiAqIHdheSB0byBgc2VnbWVudHNgLCBhbmQgZXZlcnkgYXJyYXkgc2xvdCBlYWNoIHN0ZXAgbGFuZHMgaW4sIG11c3QgYmUgb25lIHRoZVxuICogZm9sZCBob2xkcyB0b28g4oCUIGJlbG93IHRoZSBzdGFnZSdzIGFkZHJlc3MsIHdob3NlIGNvbnRhaW5lcnMgYXJlIHdoZXJlIGl0XG4gKiB3cml0ZXMsIG5vdCBhIHZhbHVlIGl0IHJlYWRzLlxuICovXG5mdW5jdGlvbiBzcGluZUhlbGQoZm9sZDogdW5rbm93biwgd29ya2luZ0NvcHk6IHVua25vd24sIHNlZ21lbnRzOiBzdHJpbmdbXSwgYWRkcmVzczogcmVhZG9ubHkgc3RyaW5nW10pOiBib29sZWFuIHtcbiAgY29uc3QgZnJvbSA9IGFkZHJlc3NEZXB0aE9mKHNlZ21lbnRzLCBhZGRyZXNzKTtcbiAgbGV0IGY6IHVua25vd24gPSBmb2xkO1xuICBsZXQgdzogdW5rbm93biA9IHdvcmtpbmdDb3B5O1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHNlZ21lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGkgPj0gZnJvbSAmJiAhc2xvdEhlbGQoZiwgdywgc2VnbWVudHNbaV0pKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKGkgPT09IHNlZ21lbnRzLmxlbmd0aCAtIDEpIHJldHVybiB0cnVlO1xuICAgIGYgPSBvd25DaGlsZChmLCBzZWdtZW50c1tpXSk7XG4gICAgdyA9IG93bkNoaWxkKHcsIHNlZ21lbnRzW2ldKTtcbiAgICBpZiAoIWlzQ29udGFpbmVyKHcpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoaSA+PSBmcm9tICYmICghaXNDb250YWluZXIoZikgfHwgQXJyYXkuaXNBcnJheShmKSAhPT0gQXJyYXkuaXNBcnJheSh3KSkpIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqXG4gKiBEb2VzIHRoZSBmb2xkIGhvbGQgZXZlcnkgYXJyYXkgc2xvdCB0aGUgd29ya2luZyBjb3B5J3MgY29udGFpbmVyIGB3YCBob2xkc1xuICogYXQgYGtleWA/IE9ubHkgYW4gYXJyYXkgY2FuIGJlIGdyb3duIGJ5IGEgd3JpdGUgdGhhdCBjaGFuZ2VzIG5vdGhpbmcgZWxzZVxuICogKGFuIGluZGV4IHBhc3QgaXRzIGVuZCwgc2V0IHRvIGB1bmRlZmluZWRgKTsgYW4gb2JqZWN0J3Mgb3duIGB1bmRlZmluZWRgXG4gKiBrZXkgaXMgYSBkZWxldGVkIGtleSB0byBldmVyeSByZWFkZXIsIHNvIG9iamVjdHMgYWx3YXlzIHBhc3MuXG4gKi9cbmZ1bmN0aW9uIHNsb3RIZWxkKGY6IHVua25vd24sIHc6IHVua25vd24sIGtleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGlmICghQXJyYXkuaXNBcnJheSh3KSkgcmV0dXJuIHRydWU7XG4gIGNvbnN0IGluZGV4ID0gTnVtYmVyKGtleSk7XG4gIGlmICghTnVtYmVyLmlzSW50ZWdlcihpbmRleCkgfHwgaW5kZXggPCAwIHx8IFN0cmluZyhpbmRleCkgIT09IGtleSB8fCBpbmRleCA+PSB3Lmxlbmd0aCkgcmV0dXJuIHRydWU7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KGYpICYmIGluZGV4IDwgZi5sZW5ndGg7XG59XG5cbi8qKiBUaGUgc2hhbGxvd2VzdCBvZiBgcGF0aGAgYW5kIGl0cyBhbmNlc3RvcnMgdGhhdCBgdG91Y2hlZGAgaG9sZHMg4oCUIGl0cyBmYW1pbHkncyByb290LiAqL1xuZnVuY3Rpb24gc2hhbGxvd2VzdEluKHBhdGg6IHN0cmluZywgdG91Y2hlZDogUmVhZG9ubHlNYXA8c3RyaW5nLCB1bmtub3duPik6IHN0cmluZyB7XG4gIGlmIChwYXRoLmluZGV4T2YoREVMSU0pID09PSAtMSkgcmV0dXJuIHBhdGg7XG4gIGNvbnN0IHNlZ21lbnRzID0gcGF0aC5zcGxpdChERUxJTSk7XG4gIGZvciAobGV0IGkgPSAxOyBpIDwgc2VnbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBhbmNlc3RvciA9IHNlZ21lbnRzLnNsaWNlKDAsIGkpLmpvaW4oREVMSU0pO1xuICAgIGlmICh0b3VjaGVkLmhhcyhhbmNlc3RvcikpIHJldHVybiBhbmNlc3RvcjtcbiAgfVxuICByZXR1cm4gcGF0aDtcbn1cbiJdfQ==