footprintjs 10.2.1 → 10.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. package/dist/esm/index.d.ts +1 -0
  2. package/dist/esm/index.js +1 -1
  3. package/dist/esm/lib/capture/nativeCoverage.d.ts +56 -0
  4. package/dist/esm/lib/capture/nativeCoverage.js +102 -0
  5. package/dist/esm/lib/memory/StageContext.d.ts +5 -0
  6. package/dist/esm/lib/memory/StageContext.js +27 -6
  7. package/dist/esm/lib/memory/attention.d.ts +2 -0
  8. package/dist/esm/lib/memory/attention.js +12 -5
  9. package/dist/esm/lib/recorder/ControlDepRecorder.d.ts +12 -1
  10. package/dist/esm/lib/recorder/ControlDepRecorder.js +23 -1
  11. package/dist/esm/lib/recorder/snapshot.d.ts +1 -1
  12. package/dist/esm/lib/recorder/snapshot.js +7 -2
  13. package/dist/esm/lib/runner/ExecutionRuntime.d.ts +9 -0
  14. package/dist/esm/lib/runner/ExecutionRuntime.js +13 -1
  15. package/dist/esm/lib/runner/FlowChartExecutor.d.ts +2 -0
  16. package/dist/esm/lib/runner/FlowChartExecutor.js +31 -2
  17. package/dist/esm/lib/runner/attach.js +4 -2
  18. package/dist/esm/lib/runner/options.d.ts +3 -0
  19. package/dist/esm/lib/runner/options.js +5 -1
  20. package/dist/esm/lib/runner/snapshot.d.ts +3 -1
  21. package/dist/esm/lib/runner/snapshot.js +35 -4
  22. package/dist/esm/lib/scope/ScopeFacade.js +4 -2
  23. package/dist/esm/lib/scope/runtime.d.ts +2 -0
  24. package/dist/esm/lib/scope/runtime.js +9 -1
  25. package/dist/index.js +1 -1
  26. package/dist/lib/capture/nativeCoverage.js +107 -0
  27. package/dist/lib/memory/StageContext.js +27 -6
  28. package/dist/lib/memory/attention.js +12 -5
  29. package/dist/lib/recorder/ControlDepRecorder.js +23 -1
  30. package/dist/lib/recorder/snapshot.js +7 -2
  31. package/dist/lib/runner/ExecutionRuntime.js +13 -1
  32. package/dist/lib/runner/FlowChartExecutor.js +34 -5
  33. package/dist/lib/runner/attach.js +3 -1
  34. package/dist/lib/runner/options.js +5 -1
  35. package/dist/lib/runner/snapshot.js +35 -4
  36. package/dist/lib/scope/ScopeFacade.js +3 -1
  37. package/dist/lib/scope/runtime.js +12 -2
  38. package/dist/types/index.d.ts +1 -0
  39. package/dist/types/lib/capture/nativeCoverage.d.ts +56 -0
  40. package/dist/types/lib/memory/StageContext.d.ts +5 -0
  41. package/dist/types/lib/memory/attention.d.ts +2 -0
  42. package/dist/types/lib/recorder/ControlDepRecorder.d.ts +12 -1
  43. package/dist/types/lib/recorder/snapshot.d.ts +1 -1
  44. package/dist/types/lib/runner/ExecutionRuntime.d.ts +9 -0
  45. package/dist/types/lib/runner/FlowChartExecutor.d.ts +2 -0
  46. package/dist/types/lib/runner/options.d.ts +3 -0
  47. package/dist/types/lib/runner/snapshot.d.ts +3 -1
  48. package/dist/types/lib/scope/runtime.d.ts +2 -0
  49. package/package.json +1 -1
@@ -122,6 +122,8 @@ class ScopeFacade {
122
122
  this._onCommitFired(mutations);
123
123
  });
124
124
  (0, runtime_js_1.registerScopeRuntime)(this, { target: this, handlesAssignments: false });
125
+ if (context.capture)
126
+ (0, runtime_js_1.registerNativeCaptureTarget)(this, context);
125
127
  }
126
128
  /**
127
129
  * The redaction rule this facade decides with — the SAME object its
@@ -925,4 +927,4 @@ function detachKey(child) {
925
927
  const id = child?.root?.id;
926
928
  return typeof id === 'string' ? `detach:${id}` : 'detach';
927
929
  }
928
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2NvcGVGYWNhZGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3Njb3BlL1Njb3BlRmFjYWRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7Ozs7Ozs7R0FjRzs7O0FBRUgseUNBQThDO0FBRTlDLGdEQUF5RDtBQUN6RCxvREFBbUQ7QUFDbkQsZ0RBQXNEO0FBQ3RELHdEQUFnRztBQUNoRyxvREFBdUU7QUFDdkUsd0VBQW1FO0FBQ25FLG9EQUFxRDtBQVdyRCx3REFBOEQ7QUFDOUQsaURBRzRCO0FBRTVCLDhDQUEwQztBQUUxQyx1RUFBcUY7QUFDckYseURBQThEO0FBRzlELG1EQUFrRTtBQUNsRSxvRUFBb0Y7QUFDcEYsNkNBQW9EO0FBR3BELE1BQWEsV0FBVztJQUNmLE1BQU0sQ0FBVSxLQUFLLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0lBRTVEOzs7O09BSUc7SUFDSyxNQUFNLENBQVUsbUJBQW1CLEdBQXNCLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7SUFFekUsYUFBYSxDQUFlO0lBQzVCLFVBQVUsQ0FBUztJQUNWLGVBQWUsQ0FBVztJQUU3QywrRUFBK0U7SUFDOUQsV0FBVyxDQUEwQjtJQUV0RCx5RUFBeUU7SUFDeEQsYUFBYSxDQUF5QjtJQUV2RDtvRUFDZ0U7SUFDL0MsUUFBUSxDQUFVO0lBRW5DLCtEQUErRDtJQUM5QyxPQUFPLENBQVU7SUFFbEM7Ozs7OztPQU1HO0lBQ2MsZ0JBQWdCLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztJQUU5QyxVQUFVLEdBQW9CLEVBQUUsQ0FBQztJQUV6Qzs7Ozs7Ozs7OztPQVVHO0lBQ0ssVUFBVSxHQUFHLEtBQUssQ0FBQztJQUUzQjs7OztPQUlHO0lBQ0ssVUFBVSxDQUFpQjtJQUVuQzs7OztPQUlHO0lBQ0ssWUFBWSxDQUFrQjtJQUV0Qzs7Ozs7Ozs7T0FRRztJQUNjLFFBQVEsQ0FBa0I7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QUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQztBQUM1RCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBTY29wZUZhY2FkZSDigJQgQmFzZSBjbGFzcyB0aGF0IGxpYnJhcnkgY29uc3VtZXJzIGV4dGVuZCB0byBjcmVhdGUgY3VzdG9tIHNjb3BlIGNsYXNzZXNcbiAqXG4gKiBXcmFwcyBTdGFnZUNvbnRleHQgKGZyb20gbWVtb3J5LykgdG8gcHJvdmlkZSBhIGNvbnN1bWVyLWZyaWVuZGx5IEFQSSBmb3JcbiAqIHN0YXRlIGFjY2VzcywgZGVidWcgbG9nZ2luZywgbWV0cmljcywgYW5kIHJlY29yZGVyIGhvb2tzLlxuICpcbiAqIENvbnN1bWVycyBleHRlbmQgdGhpcyBjbGFzcyB0byBhZGQgZG9tYWluLXNwZWNpZmljIHByb3BlcnRpZXM6XG4gKlxuICogYGBgdHlwZXNjcmlwdFxuICogY2xhc3MgTXlTY29wZSBleHRlbmRzIFNjb3BlRmFjYWRlIHtcbiAqICAgZ2V0IHVzZXJOYW1lKCk6IHN0cmluZyB7IHJldHVybiB0aGlzLmdldFZhbHVlKCduYW1lJykgYXMgc3RyaW5nOyB9XG4gKiAgIHNldCB1c2VyTmFtZSh2YWx1ZTogc3RyaW5nKSB7IHRoaXMuc2V0VmFsdWUoJ25hbWUnLCB2YWx1ZSk7IH1cbiAqIH1cbiAqIGBgYFxuICovXG5cbmltcG9ydCB7IHN1YmZsb3dTZWdtZW50c09mIH0gZnJvbSAnZm9vdHRyYWNlJztcblxuaW1wb3J0IHsgY2FsbFNlcmllcywgcnVuQ2FsbCB9IGZyb20gJy4uL2F0dGVtcHQvY2FsbC5qcyc7XG5pbXBvcnQgeyBjYWxsVG91Y2hlcyB9IGZyb20gJy4uL2F0dGVtcHQvZWZmZWN0LmpzJztcbmltcG9ydCB7IGFkbWl0QXR0ZW1wdE5hbWUgfSBmcm9tICcuLi9hdHRlbXB0L25hbWUuanMnO1xuaW1wb3J0IHsgb2JzZXJ2ZWRSZWNvcmQsIE9ic2VydmVkU2VyaWVzQm9vaywgcmVhZE9ic2VydmVkUmVwb3J0IH0gZnJvbSAnLi4vYXR0ZW1wdC9vYnNlcnZlZC5qcyc7XG5pbXBvcnQgeyBhZG1pdENhbGxQb2xpY3ksIGF0dGVtcHRDZWlsaW5nIH0gZnJvbSAnLi4vYXR0ZW1wdC9wb2xpY3kuanMnO1xuaW1wb3J0IHsgdGFrZVJldHJ5TG9vcENhbGwgfSBmcm9tICcuLi9hdHRlbXB0L3JldHJ5TG9vcENvbnRleHQuanMnO1xuaW1wb3J0IHsgYXR0ZW1wdEVuZHNBdCB9IGZyb20gJy4uL2F0dGVtcHQvcnVubmVyLmpzJztcbmltcG9ydCB0eXBlIHtcbiAgQXR0ZW1wdENvbnRleHQsXG4gIEF0dGVtcHRFcnJvcixcbiAgQ2FsbE9wdGlvbnMsXG4gIExhdGVXcml0ZSxcbiAgT2JzZXJ2ZWRBdHRlbXB0LFxuICBSZXRyeVBvbGljeSxcbiAgUnVuQ29ycmVsYXRpb24sXG59IGZyb20gJy4uL2F0dGVtcHQvdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBGbG93Q2hhcnQgfSBmcm9tICcuLi9idWlsZGVyL3R5cGVzLmpzJztcbmltcG9ydCB7IGhhc0NpcmN1bGFyUmVmZXJlbmNlIH0gZnJvbSAnLi4vY2FwdHVyZS9jaXJjdWxhci5qcyc7XG5pbXBvcnQge1xuICBkZXRhY2hBbmRGb3JnZXQgYXMgZGV0YWNoQW5kRm9yZ2V0U3Bhd24sXG4gIGRldGFjaEFuZEpvaW5MYXRlciBhcyBkZXRhY2hBbmRKb2luTGF0ZXJTcGF3bixcbn0gZnJvbSAnLi4vZGV0YWNoL3NwYXduLmpzJztcbmltcG9ydCB0eXBlIHsgRGV0YWNoRHJpdmVyLCBEZXRhY2hIYW5kbGUgfSBmcm9tICcuLi9kZXRhY2gvdHlwZXMuanMnO1xuaW1wb3J0IHsgaXNEZXZNb2RlIH0gZnJvbSAnLi4vZGV2TW9kZS5qcyc7XG5pbXBvcnQgdHlwZSB7IEV4ZWN1dGlvbkVudiB9IGZyb20gJy4uL2VuZ2luZS90eXBlcy5qcyc7XG5pbXBvcnQgeyBkZWFkRnJhbWVNZXNzYWdlLCBsYXRlQXR0ZW1wdE1lc3NhZ2UgfSBmcm9tICcuLi9tZW1vcnkvYm9ycm93ZWRNdXRhdGlvbi5qcyc7XG5pbXBvcnQgeyBDTEVBUiwgUmVkYWN0aW9uUnVsZSB9IGZyb20gJy4uL21lbW9yeS9yZWRhY3Rpb24uanMnO1xuaW1wb3J0IHsgU3RhZ2VDb250ZXh0IH0gZnJvbSAnLi4vbWVtb3J5L1N0YWdlQ29udGV4dC5qcyc7XG5pbXBvcnQgdHlwZSB7IEhvb2tGYWlsdXJlLCBIb29rUGF5bG9hZCwgU2NvcGVIb29rTmFtZSB9IGZyb20gJy4uL3JlY29yZGVyL2hvb2tzLmpzJztcbmltcG9ydCB7IGZpcmUsIHJlY29yZGVyRmFpbHVyZUV2ZW50IH0gZnJvbSAnLi4vcmVjb3JkZXIvaG9va3MuanMnO1xuaW1wb3J0IHsgYXNzZXJ0Tm90UmVhZG9ubHksIGNyZWF0ZUZyb3plbkFyZ3MgfSBmcm9tICcuL3Byb3RlY3Rpb24vcmVhZG9ubHlJbnB1dC5qcyc7XG5pbXBvcnQgeyByZWdpc3RlclNjb3BlUnVudGltZSB9IGZyb20gJy4vcnVudGltZS5qcyc7XG5pbXBvcnQgdHlwZSB7IENvbW1pdEV2ZW50LCBSZWRhY3Rpb25Qb2xpY3ksIFJlZGFjdGlvblJlcG9ydCwgU2NvcGVSZWNvcmRlciB9IGZyb20gJy4vdHlwZXMuanMnO1xuXG5leHBvcnQgY2xhc3MgU2NvcGVGYWNhZGUge1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEJSQU5EID0gU3ltYm9sLmZvcignU2NvcGVGYWNhZGVAdjEnKTtcblxuICAvKipcbiAgICogU2hhcmVkIHNlbnRpbmVsIHJldHVybmVkIGJ5IGBfZ2V0U3ViZmxvd1BhdGgoKWAgZm9yIHJvb3QtbGV2ZWwgc3RhZ2VzXG4gICAqIChubyBzdWJmbG93IG5lc3RpbmcpLiBBdm9pZHMgcGVyLWNhbGwgYWxsb2NhdGlvbiBvZiBhIGZyZXNoXG4gICAqIGBPYmplY3QuZnJlZXplKFtdKWAgb24gZXZlcnkgYGVtaXRFdmVudGAgaW4gdGhlIGNvbW1vbiBuby1zdWJmbG93IGNhc2UuXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBfRU1QVFlfU1VCRkxPV19QQVRIOiByZWFkb25seSBzdHJpbmdbXSA9IE9iamVjdC5mcmVlemUoW10pO1xuXG4gIHByb3RlY3RlZCBfc3RhZ2VDb250ZXh0OiBTdGFnZUNvbnRleHQ7XG4gIHByb3RlY3RlZCBfc3RhZ2VOYW1lOiBzdHJpbmc7XG4gIHByb3RlY3RlZCByZWFkb25seSBfcmVhZE9ubHlWYWx1ZXM/OiB1bmtub3duO1xuXG4gIC8qKiBDYWNoZWQgZGVlcGx5LWZyb3plbiBjb3B5IG9mIHJlYWRPbmx5VmFsdWVzIGZvciBnZXRBcmdzKCkuIENyZWF0ZWQgb25jZS4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBfZnJvemVuQXJnczogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cbiAgLyoqIEV4ZWN1dGlvbiBlbnZpcm9ubWVudCDigJQgcmVhZC1vbmx5LCBpbmhlcml0ZWQgZnJvbSBwYXJlbnQgZXhlY3V0b3IuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgX2V4ZWN1dGlvbkVudjogUmVhZG9ubHk8RXhlY3V0aW9uRW52PjtcblxuICAvKiogUkZDLTAwMyBEMjogdHJ1ZSB3aGVuIGBnZXRBcmdzKClgIGNhbiByZXR1cm4gYWN0dWFsIGRhdGEg4oCUIGFuIGVtcHR5XG4gICAqICBge31gIHJlYWQgY2FycmllcyBubyBpbmZvcm1hdGlvbiwgc28gaXQgaXMgbmV2ZXIgZmxhZ2dlZC4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBfaGFzQXJnczogYm9vbGVhbjtcblxuICAvKiogUkZDLTAwMyBEMjogdHJ1ZSB3aGVuIGBnZXRFbnYoKWAgY2FuIHJldHVybiBhY3R1YWwgZGF0YS4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBfaGFzRW52OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBSRkMtMDAzIEQyOiBrZXlzIHRoaXMgc3RhZ2UgaGFzIFRSQUNLRUQtcmVhZCAodmlhIGBnZXRWYWx1ZShrZXkpYCkuXG4gICAqIEEgc2lsZW50IHJlYWQgb2YgYSBrZXkgaW4gdGhpcyBzZXQgaXMgU0hBRE9XRUQg4oCUIGl0cyByZWFk4oaSd3JpdGUgZWRnZSBpc1xuICAgKiBhbHJlYWR5IGNhcHR1cmVkLCBzbyBpdCBpcyBub3QgZmxhZ2dlZCBhcyBhbiB1bnRyYWNrZWQgc291cmNlLiBUaGlzIGlzXG4gICAqIHdoYXQga2VlcHMgVHlwZWRTY29wZSBhcnJheS1wcm94eSBpbnRlcm5hbHMgKHdoaWNoIGFsd2F5cyBmb2xsb3cgYVxuICAgKiB0cmFja2VkIHByb3BlcnR5IHJlYWQpIGFuZCBgJGJhdGNoQXJyYXlgIGhvbmVzdC1idXQtcXVpZXQuXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IF90cmFja2VkUmVhZEtleXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICBwcml2YXRlIF9yZWNvcmRlcnM6IFNjb3BlUmVjb3JkZXJbXSA9IFtdO1xuXG4gIC8qKlxuICAgKiBTZXQgYnkgdGhlIGNvbW1pdCBvYnNlcnZlcjogdGhpcyBzdGFnZSdzIGZyYW1lIGhhcyBmbHVzaGVkLiBBIGZhY2FkZSBpc1xuICAgKiBPTkUgc3RhZ2UgZXhlY3V0aW9uJ3MgaGFuZGxlIOKAlCB0aGUgZW5naW5lIGJ1aWxkcyBhIGZyZXNoIG9uZSBwZXIgc3RhZ2Ug4oCUXG4gICAqIGFuZCBldmVyeSBwcm94eSB0aGUgdHlwZWQgc2NvcGUgaGFuZHMgb3V0IGlzIGJvdW5kIHRvIGl0LiBBIHdyaXRlIGFycml2aW5nXG4gICAqIGFmdGVyIHRoZSBjb21taXQgY29tZXMgZnJvbSBhIGhhbmRsZSBoZWxkIHBhc3QgaXRzIHN0YWdlIChhIGNsb3N1cmUsIGFcbiAgICogbW9kdWxlLWxldmVsIGBsZXRgKSBhbmQgd291bGQgbGFuZCBpbiBhIGJ1ZmZlciBub3RoaW5nIGV2ZXIgY29tbWl0czogbm9cbiAgICogdHJhY2Ugcm93LCBzdGF0ZSB1bmNoYW5nZWQuIFNvIGl0IGlzIHJlZnVzZWQgKHtAbGluayBhc3NlcnRMaXZlfSkgaW5zdGVhZFxuICAgKiBvZiBsb3N0LiBTZWFsaW5nIGhlcmUgYW5kIG5vdCBvbiBgU3RhZ2VDb250ZXh0YCBpcyBkZWxpYmVyYXRlOiB0aGUgZnJhbWVcbiAgICogc3RheXMgcmUtdXNhYmxlIGFmdGVyIGNvbW1pdCBieSBkZXNpZ24gKCMxM2Ig4oCUIHRoZSBlbmdpbmUncyBkb3VibGUtY29tbWl0XG4gICAqIHBhdGhzIGFuZCB0aGUgc3ViZmxvdyBtZXJnZS1iYWNrIGludG8gYSBicmFuY2ggcGFyZW50IG5lZWQgaXQpLlxuICAgKi9cbiAgcHJpdmF0ZSBfY29tbWl0dGVkID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIEEgcnVsZSBvZiB0aGlzIGZhY2FkZSdzIG93biDigJQgT05MWSB3aGVuIGl0cyBjb250ZXh0IGNhcnJpZXMgbm9uZSAoYmFyZVxuICAgKiBjb250ZXh0cyBpbiB1bml0IHRlc3RzKS4gVW5kZXIgYW4gZXhlY3V0b3IgdGhlIHJ1bGUgbGl2ZXMgb24gdGhlIGNvbnRleHRcbiAgICogdHJlZSBhbmQgdGhpcyBzdGF5cyB1bnNldDsgc2VlIHtAbGluayBydWxlfS5cbiAgICovXG4gIHByaXZhdGUgX2xvY2FsUnVsZT86IFJlZGFjdGlvblJ1bGU7XG5cbiAgLyoqXG4gICAqIFRoZSBydW4ncyBjb3JyZWxhdGlvbiAoMTAuMSksIGluc3RhbGxlZCBieSB0aGUgZXhlY3V0b3IncyBjb21wb3NlZCBzY29wZSBmYWN0b3J5XG4gICAqIChgUnVuT2JzZXJ2ZXJzIMK3IGNvbXBvc2VTY29wZUZhY3RvcnlgKSDigJQgc3RhbXBlZCBMQVNUIG9uIGV2ZXJ5IHNjb3BlIGFuZCBlbWl0IGV2ZW50IHRoaXMgZmFjYWRlIGZpcmVzLFxuICAgKiBvbmx5IHdoZW4gcHJlc2VudCwgc28gYSBydW4gd2l0aG91dCBvbmUgZmlyZXMgYnl0ZS1pZGVudGljYWwgZXZlbnRzLlxuICAgKi9cbiAgcHJpdmF0ZSBfY29ycmVsYXRpb24/OiBSdW5Db3JyZWxhdGlvbjtcblxuICAvKipcbiAgICogVGhlIGF0dGVtcHQgdGhpcyBmYWNhZGUgd2FzIGJ1aWx0IGZvciAoUDFiKSDigJQgdGhlIHJ1bm5lcidzLCByZWFkIG9mZiB0aGVcbiAgICogY29udGV4dCBhdCBjb25zdHJ1Y3Rpb24uIEEgZmFjYWRlIGlzIE9ORSBhdHRlbXB0J3MgaGFuZGxlOiBvbmNlIHRoYXRcbiAgICogYXR0ZW1wdCBlbmRzIHdpdGhvdXQgYW4gYW5zd2VyIChpdHMgY2FwLCB0aGUgZGVhZGxpbmUsIGEgY2FuY2VsbGF0aW9uLCBhXG4gICAqIHRocm93KSwgdGhlIGZ1bmN0aW9uIGJlaGluZCBpdCBtYXkgc3RpbGwgYmUgcnVubmluZywgYW5kIGFueXRoaW5nIGl0XG4gICAqIHRvdWNoZXMgdGhyb3VnaCB0aGlzIGZhY2FkZSBpcyByZWZ1c2VkICh7QGxpbmsgcmVmdXNlSWZBdHRlbXB0RW5kZWR9KSDigJRcbiAgICogYSB3cml0ZSBvciBhbiBlbWl0IGlzIGFsc28gcmVjb3JkZWQgb24gdGhlIHN0YWdlLiBBYnNlbnQgZm9yIGEgc3RhZ2UgdGhlXG4gICAqIHJ1bm5lciBkb2VzIG5vdCBydW46IG5vdGhpbmcgaXMgZmVuY2VkLCBhcyBiZWZvcmUuXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IF9hdHRlbXB0PzogQXR0ZW1wdENvbnRleHQ7XG5cbiAgLyoqIFRoZSBydW4ncyBzaWduYWwsIGZvciBgJGF0dGVtcHQoKWAgb2YgYSBzdGFnZSB0aGUgcnVubmVyIGRvZXMgbm90IHJ1bi4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBfcnVuU2lnbmFsPzogQWJvcnRTaWduYWw7XG5cbiAgLyoqIGAkY2FsbGBzIHdpdGggYG9mID4gMWAgaW4gZmxpZ2h0IHRocm91Z2ggdGhpcyBmYWNhZGUg4oCUIGEga2V5bGVzcyB0b3VjaGluZyBjYWxsIGluc2lkZSBvbmUgaXMgcmVmdXNlZCAoUDMpLiAqL1xuICBwcml2YXRlIF9yZXRyeWluZ0NhbGxzID0gMDtcblxuICAvKiogVGhpcyBhdHRlbXB0J3Mgb2JzZXJ2ZWQgcmVwb3J0cywgZ3JvdXBlZCBpbnRvIHNlcmllcyAoUDIpIOKAlCBtYWRlIG9uIHRoZSBmaXJzdCByZXBvcnQuICovXG4gIHByaXZhdGUgX29ic2VydmVkQm9vaz86IE9ic2VydmVkU2VyaWVzQm9vaztcblxuICBjb25zdHJ1Y3Rvcihjb250ZXh0OiBTdGFnZUNvbnRleHQsIHN0YWdlTmFtZTogc3RyaW5nLCByZWFkT25seVZhbHVlcz86IHVua25vd24sIGV4ZWN1dGlvbkVudj86IEV4ZWN1dGlvbkVudikge1xuICAgIHRoaXMuX3N0YWdlQ29udGV4dCA9IGNvbnRleHQ7XG4gICAgdGhpcy5fc3RhZ2VOYW1lID0gc3RhZ2VOYW1lO1xuICAgIHRoaXMuX3JlYWRPbmx5VmFsdWVzID0gcmVhZE9ubHlWYWx1ZXM7XG4gICAgdGhpcy5fZnJvemVuQXJncyA9IGNyZWF0ZUZyb3plbkFyZ3MocmVhZE9ubHlWYWx1ZXMpO1xuICAgIHRoaXMuX2V4ZWN1dGlvbkVudiA9IE9iamVjdC5mcmVlemUoeyAuLi5leGVjdXRpb25FbnYgfSk7XG4gICAgdGhpcy5faGFzQXJncyA9IE9iamVjdC5rZXlzKHRoaXMuX2Zyb3plbkFyZ3MpLmxlbmd0aCA+IDA7XG4gICAgdGhpcy5faGFzRW52ID0gT2JqZWN0LmtleXModGhpcy5fZXhlY3V0aW9uRW52KS5sZW5ndGggPiAwO1xuICAgIHRoaXMuX2F0dGVtcHQgPSBjb250ZXh0LmF0dGVtcHQ7XG4gICAgdGhpcy5fcnVuU2lnbmFsID0gY29udGV4dC5ydW5TaWduYWw7XG4gICAgLy8gVGhlIGNvbnRleHQgbXVzdCBjYXJyeSB0aGUgcnVsZSBCRUZPUkUgdGhlIGZpcnN0IHdyaXRlLCBzaW5jZSB0aGVcbiAgICAvLyBjb250ZXh0J3Mgd3JpdGUgZnVubmVsIGlzIHdoYXQgbWFya3MgYSBwZXItY2FsbCByZWRhY3RlZCBrZXkgb24gaXQuXG4gICAgLy8gVW5kZXIgYW4gZXhlY3V0b3IgdGhlIGNvbnRleHQgYWxyZWFkeSBoYXMgdGhlIHJ1bidzIHJ1bGUgKGluc3RhbGxlZCBvblxuICAgIC8vIHRoZSByb290LCBpbmhlcml0ZWQgZG93bikgYW5kIHRoaXMgcmUtaW5zdGFsbHMgdGhlIHNhbWUgb2JqZWN0OyBvbiBhXG4gICAgLy8gYmFyZSBjb250ZXh0IGl0IGluc3RhbGxzIGEgZnJlc2ggb25lLlxuICAgIHRoaXMuX3N0YWdlQ29udGV4dC51c2VSZWRhY3Rpb25SdWxlKHRoaXMucnVsZSk7XG5cbiAgICAvLyBSZWdpc3RlciBhcyBjb21taXQgb2JzZXJ2ZXIgc28gU2NvcGVSZWNvcmRlci5vbkNvbW1pdCBmaXJlcyB3aGVuIFN0YWdlQ29udGV4dC5jb21taXQoKSBpcyBjYWxsZWRcbiAgICB0aGlzLl9zdGFnZUNvbnRleHQuc2V0Q29tbWl0T2JzZXJ2ZXIoKG11dGF0aW9ucykgPT4ge1xuICAgICAgdGhpcy5fb25Db21taXRGaXJlZChtdXRhdGlvbnMpO1xuICAgIH0pO1xuICAgIHJlZ2lzdGVyU2NvcGVSdW50aW1lKHRoaXMsIHsgdGFyZ2V0OiB0aGlzLCBoYW5kbGVzQXNzaWdubWVudHM6IGZhbHNlIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSByZWRhY3Rpb24gcnVsZSB0aGlzIGZhY2FkZSBkZWNpZGVzIHdpdGgg4oCUIHRoZSBTQU1FIG9iamVjdCBpdHNcbiAgICogYFN0YWdlQ29udGV4dGAgcmV0YWlucyB3aXRoIChgbWVtb3J5L3JlZGFjdGlvbi50c2AsIHRoZSBvbmUgb3duZXIpLiBVbmRlclxuICAgKiBhbiBleGVjdXRvciB0aGUgcnVsZSBpcyBpbnN0YWxsZWQgb24gdGhlIHJ1bnRpbWUgcm9vdCBhbmQgaW5oZXJpdGVkIGJ5XG4gICAqIGV2ZXJ5IGNvbnRleHQsIHNvIHRoZSBmYWNhZGUgc2ltcGx5IHJlYWRzIGl0LiBPbiBhIGJhcmUgY29udGV4dCAodW5pdFxuICAgKiB0ZXN0cywgaGFuZC1idWlsdCBzY29wZXMpIHRoZSBmYWNhZGUgY3JlYXRlcyBvbmUgYW5kIGluc3RhbGxzIGl0IG9uIHRoZVxuICAgKiBjb250ZXh0LCBzbyB0aGUgY29udGV4dCdzIHJldGVudGlvbiBhbmQgdGhlIGZhY2FkZSdzIHJlY29yZGVyIHZpZXdzXG4gICAqIHN0aWxsIHNoYXJlIGEgc2luZ2xlIHZlcmRpY3QuXG4gICAqL1xuICBwcml2YXRlIGdldCBydWxlKCk6IFJlZGFjdGlvblJ1bGUge1xuICAgIGNvbnN0IHNoYXJlZCA9IHRoaXMuX3N0YWdlQ29udGV4dC5nZXRSZWRhY3Rpb25SdWxlKCk7XG4gICAgaWYgKHNoYXJlZCkgcmV0dXJuIHNoYXJlZDtcbiAgICBpZiAoIXRoaXMuX2xvY2FsUnVsZSkge1xuICAgICAgdGhpcy5fbG9jYWxSdWxlID0gbmV3IFJlZGFjdGlvblJ1bGUoKTtcbiAgICAgIHRoaXMuX3N0YWdlQ29udGV4dC51c2VSZWRhY3Rpb25SdWxlKHRoaXMuX2xvY2FsUnVsZSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9sb2NhbFJ1bGU7XG4gIH1cblxuICAvKipcbiAgICogU2hhcmUgYSByZWRhY3RlZC1rZXlzIHNldCBhY3Jvc3MgbXVsdGlwbGUgU2NvcGVGYWNhZGUgaW5zdGFuY2VzLlxuICAgKiBDYWxsIHRoaXMgdG8gbWFrZSByZWRhY3Rpb24gcGVyc2lzdCBhY3Jvc3Mgc3RhZ2VzIGluIHRoZSBzYW1lIHBpcGVsaW5lLlxuICAgKiAoVW5kZXIgYW4gZXhlY3V0b3IgdGhlIHJ1bidzIHJ1bGUgYWxyZWFkeSBzaGFyZXMgb25lIHNldDsgdGhpcyBjYWxsIGlzXG4gICAqIHRoZW4gYSBuby1vcC4pXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgdXNlU2hhcmVkUmVkYWN0ZWRLZXlzKHNoYXJlZFNldDogU2V0PHN0cmluZz4pOiB2b2lkIHtcbiAgICB0aGlzLnJ1bGUudXNlTWFya2VkS2V5cyhzaGFyZWRTZXQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGN1cnJlbnQgcmVkYWN0ZWQta2V5cyBzZXQgKGZvciBzaGFyaW5nIHdpdGggb3RoZXIgc2NvcGVzKS5cbiAgICogQGludGVybmFsXG4gICAqL1xuICBnZXRSZWRhY3RlZEtleXMoKTogU2V0PHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLnJ1bGUubWFya2VkS2V5cygpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFwcGx5IGEgZGVjbGFyYXRpdmUgcmVkYWN0aW9uIHBvbGljeS4gVGhlIHBvbGljeSBpcyBhZGRpdGl2ZSDigJRcbiAgICogaXQgd29ya3MgYWxvbmdzaWRlIG1hbnVhbCBgc2V0VmFsdWUoLi4uLCB0cnVlKWAgY2FsbHMuXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgdXNlUmVkYWN0aW9uUG9saWN5KHBvbGljeTogUmVkYWN0aW9uUG9saWN5KTogdm9pZCB7XG4gICAgdGhpcy5ydWxlLnNldFBvbGljeShwb2xpY3kpO1xuICB9XG5cbiAgLyoqXG4gICAqIEluc3RhbGwgdGhlIHJ1bidzIGNvcnJlbGF0aW9uIOKAlCBldmVyeSBzY29wZSBhbmQgZW1pdCBldmVudCB0aGlzIGZhY2FkZSBmaXJlcyBjYXJyaWVzIGl0OyBgdW5kZWZpbmVkYCBjbGVhcnNcbiAgICogaXQuIEVuZ2luZS1vbmx5ICh0aGUgY29tcG9zZWQgc2NvcGUgZmFjdG9yeSBjYWxscyBpdCBvbmNlIHBlciBzdGFnZSksIGxpa2UgYHVzZVJlZGFjdGlvblBvbGljeWAuXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgdXNlQ29ycmVsYXRpb24oY29ycmVsYXRpb246IFJ1bkNvcnJlbGF0aW9uIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gICAgdGhpcy5fY29ycmVsYXRpb24gPSBjb3JyZWxhdGlvbjtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgZ2V0UmVkYWN0aW9uUG9saWN5KCk6IFJlZGFjdGlvblBvbGljeSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMucnVsZS5nZXRQb2xpY3koKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgY29tcGxpYW5jZS1mcmllbmRseSByZXBvcnQgb2YgYWxsIHJlZGFjdGlvbiBhY3Rpdml0eS5cbiAgICogTmV2ZXIgaW5jbHVkZXMgYWN0dWFsIHZhbHVlcyDigJQgb25seSBrZXkgbmFtZXMsIGZpZWxkIG5hbWVzLCBhbmQgcGF0dGVybnMuXG4gICAqL1xuICBnZXRSZWRhY3Rpb25SZXBvcnQoKTogUmVkYWN0aW9uUmVwb3J0IHtcbiAgICByZXR1cm4gdGhpcy5ydWxlLnJlcG9ydCgpO1xuICB9XG5cbiAgLy8g4pSA4pSAIFNjb3BlUmVjb3JkZXIgTWFuYWdlbWVudCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICBhdHRhY2hTY29wZVJlY29yZGVyKHJlY29yZGVyOiBTY29wZVJlY29yZGVyKTogdm9pZCB7XG4gICAgLy8gUmVwbGFjZSBleGlzdGluZyByZWNvcmRlciB3aXRoIHNhbWUgSUQgKGlkZW1wb3RlbnQg4oCUIHByZXZlbnRzIGRvdWJsZS1jb3VudGluZylcbiAgICB0aGlzLl9yZWNvcmRlcnMgPSB0aGlzLl9yZWNvcmRlcnMuZmlsdGVyKChyKSA9PiByLmlkICE9PSByZWNvcmRlci5pZCk7XG4gICAgdGhpcy5fcmVjb3JkZXJzLnB1c2gocmVjb3JkZXIpO1xuICB9XG5cbiAgZGV0YWNoU2NvcGVSZWNvcmRlcihyZWNvcmRlcklkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLl9yZWNvcmRlcnMgPSB0aGlzLl9yZWNvcmRlcnMuZmlsdGVyKChyKSA9PiByLmlkICE9PSByZWNvcmRlcklkKTtcbiAgfVxuXG4gIGdldFNjb3BlUmVjb3JkZXJzKCk6IFNjb3BlUmVjb3JkZXJbXSB7XG4gICAgcmV0dXJuIFsuLi50aGlzLl9yZWNvcmRlcnNdO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBub3RpZnlTdGFnZVN0YXJ0KCk6IHZvaWQge1xuICAgIHRoaXMuX2ludm9rZUhvb2soJ29uU3RhZ2VTdGFydCcsIHtcbiAgICAgIHN0YWdlTmFtZTogdGhpcy5fc3RhZ2VOYW1lLFxuICAgICAgc3RhZ2VJZDogdGhpcy5fc3RhZ2VDb250ZXh0LnN0YWdlSWQsXG4gICAgICBydW50aW1lU3RhZ2VJZDogdGhpcy5fc3RhZ2VDb250ZXh0LnJ1bnRpbWVTdGFnZUlkLFxuICAgICAgcGlwZWxpbmVJZDogdGhpcy5fc3RhZ2VDb250ZXh0LnJ1bklkLFxuICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBub3RpZnlTdGFnZUVuZChkdXJhdGlvbj86IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuX2ludm9rZUhvb2soJ29uU3RhZ2VFbmQnLCB7XG4gICAgICBzdGFnZU5hbWU6IHRoaXMuX3N0YWdlTmFtZSxcbiAgICAgIHN0YWdlSWQ6IHRoaXMuX3N0YWdlQ29udGV4dC5zdGFnZUlkLFxuICAgICAgcnVudGltZVN0YWdlSWQ6IHRoaXMuX3N0YWdlQ29udGV4dC5ydW50aW1lU3RhZ2VJZCxcbiAgICAgIHBpcGVsaW5lSWQ6IHRoaXMuX3N0YWdlQ29udGV4dC5ydW5JZCxcbiAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgIGR1cmF0aW9uLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBub3RpZnlQYXVzZShwYXVzZURhdGE/OiB1bmtub3duKTogdm9pZCB7XG4gICAgdGhpcy5faW52b2tlSG9vaygnb25QYXVzZScsIHtcbiAgICAgIHN0YWdlTmFtZTogdGhpcy5fc3RhZ2VOYW1lLFxuICAgICAgc3RhZ2VJZDogdGhpcy5fc3RhZ2VDb250ZXh0LnN0YWdlSWQsXG4gICAgICBydW50aW1lU3RhZ2VJZDogdGhpcy5fc3RhZ2VDb250ZXh0LnJ1bnRpbWVTdGFnZUlkLFxuICAgICAgcGlwZWxpbmVJZDogdGhpcy5fc3RhZ2VDb250ZXh0LnJ1bklkLFxuICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxuICAgICAgcGF1c2VEYXRhLFxuICAgICAgY2hhbm5lbDogJ3Njb3BlJyBhcyBjb25zdCxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgbm90aWZ5UmVzdW1lKGhhc0lucHV0OiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5faW52b2tlSG9vaygnb25SZXN1bWUnLCB7XG4gICAgICBzdGFnZU5hbWU6IHRoaXMuX3N0YWdlTmFtZSxcbiAgICAgIHN0YWdlSWQ6IHRoaXMuX3N0YWdlQ29udGV4dC5zdGFnZUlkLFxuICAgICAgcnVudGltZVN0YWdlSWQ6IHRoaXMuX3N0YWdlQ29udGV4dC5ydW50aW1lU3RhZ2VJZCxcbiAgICAgIHBpcGVsaW5lSWQ6IHRoaXMuX3N0YWdlQ29udGV4dC5ydW5JZCxcbiAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgIGhhc0lucHV0LFxuICAgICAgY2hhbm5lbDogJ3Njb3BlJyBhcyBjb25zdCxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgbm90aWZ5Q29tbWl0KG11dGF0aW9uczogQ29tbWl0RXZlbnRbJ211dGF0aW9ucyddKTogdm9pZCB7XG4gICAgdGhpcy5faW52b2tlSG9vaygnb25Db21taXQnLCB7XG4gICAgICBzdGFnZU5hbWU6IHRoaXMuX3N0YWdlTmFtZSxcbiAgICAgIHN0YWdlSWQ6IHRoaXMuX3N0YWdlQ29udGV4dC5zdGFnZUlkLFxuICAgICAgcnVudGltZVN0YWdlSWQ6IHRoaXMuX3N0YWdlQ29udGV4dC5ydW50aW1lU3RhZ2VJZCxcbiAgICAgIHBpcGVsaW5lSWQ6IHRoaXMuX3N0YWdlQ29udGV4dC5ydW5JZCxcbiAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgIG11dGF0aW9ucyxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWZ1c2UgYSB3cml0ZSBmcm9tIGEgaGFuZGxlIGhlbGQgcGFzdCBpdHMgc3RhZ2UgKDkuMjIuMCkuIFRocm93cyB3aXRoIHRoZVxuICAgKiBzdGFnZSB0aGUgaGFuZGxlIGNhbWUgZnJvbTsgdGhlIGVuZ2luZSdzIGVycm9yIHBhdGggYXR0cmlidXRlcyB0aGUgdGhyb3dcbiAgICogdG8gdGhlIHN0YWdlIHRoYXQgbWFkZSB0aGUgd3JpdGUuXG4gICAqL1xuICBwcml2YXRlIGFzc2VydExpdmUoa2V5OiBzdHJpbmcsIGNoYW5uZWw6IExhdGVXcml0ZVsnY2hhbm5lbCddID0gJ3N0YXRlJyk6IHZvaWQge1xuICAgIHRoaXMucmVmdXNlSWZBdHRlbXB0RW5kZWQoa2V5LCBjaGFubmVsKTtcbiAgICBpZiAodGhpcy5fY29tbWl0dGVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoZGVhZEZyYW1lTWVzc2FnZSh0aGlzLl9zdGFnZU5hbWUsIHRoaXMuX3N0YWdlQ29udGV4dC5ydW50aW1lU3RhZ2VJZCwga2V5KSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBhdHRlbXB0IGZlbmNlIChQMWIpOiB0aGlzIGZhY2FkZSdzIGF0dGVtcHQgaGFzIGVuZGVkLCBzbyB3aGF0ZXZlciB0aGVcbiAgICogYWJhbmRvbmVkIGZ1bmN0aW9uIGRvZXMgbm93IG11c3Qgbm90IHJlYWNoIHRoZSBzdGFnZSDigJQgbm90IGl0cyBidWZmZXIsIGl0c1xuICAgKiByZWFkcywgaXRzIHVudHJhY2tlZCBzb3VyY2VzIG9yIGEgcmVjb3JkZXIuIFJlZnVzZWQ7IGEgd3JpdGUgb3IgYW4gZW1pdCBpc1xuICAgKiByZWNvcmRlZCBvbiB0aGUgc3RhZ2UgZmlyc3QgKGBTdGFnZVNuYXBzaG90LmxhdGVXcml0ZXNgLCB0aGUgbmFtZSBvbmx5KSxcbiAgICogYSByZWFkIChgY2hhbm5lbGAgdW5kZWZpbmVkKSBpcyBub3QuXG4gICAqL1xuICBwcml2YXRlIHJlZnVzZUlmQXR0ZW1wdEVuZGVkKGtleTogc3RyaW5nLCBjaGFubmVsPzogTGF0ZVdyaXRlWydjaGFubmVsJ10pOiB2b2lkIHtcbiAgICBjb25zdCBhdHRlbXB0ID0gdGhpcy5fYXR0ZW1wdDtcbiAgICBpZiAoYXR0ZW1wdCA9PT0gdW5kZWZpbmVkIHx8ICF0aGlzLl9zdGFnZUNvbnRleHQuaGFzQXR0ZW1wdEVuZGVkKGF0dGVtcHQuYXR0ZW1wdCkpIHJldHVybjtcbiAgICBpZiAoY2hhbm5lbCAhPT0gdW5kZWZpbmVkKSB0aGlzLl9zdGFnZUNvbnRleHQucmVjb3JkTGF0ZVdyaXRlKHsgYXR0ZW1wdDogYXR0ZW1wdC5hdHRlbXB0LCBrZXksIGNoYW5uZWwgfSk7XG4gICAgdGhyb3cgbmV3IEVycm9yKGxhdGVBdHRlbXB0TWVzc2FnZSh0aGlzLl9zdGFnZU5hbWUsIGF0dGVtcHQuc2VyaWVzLCBhdHRlbXB0LmF0dGVtcHQsIGtleSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBhdHRlbXB0IHRoaXMgc3RhZ2UgZnVuY3Rpb24gcnVucyBpbiDigJQgYHNjb3BlLiRhdHRlbXB0KClgIChkZXNpZ25cbiAgICogwqczLjEpLiBJdHMgYHNpZ25hbGAgYWJvcnRzIHdoZW4gdGhlIGF0dGVtcHQgbXVzdCBzdG9wIChpdHMgY2FwLCB0aGUgcnVuJ3NcbiAgICogZGVhZGxpbmUsIGEgY2FuY2VsbGF0aW9uKTogcGFzcyBpdCB0byBgZmV0Y2hgIGFuZCBTREsgY2FsbHMuIEl0c1xuICAgKiBgdGltZUxlZnRNcygpYCByZWFkcyB0aGUgcnVuJ3MgZGVhZGxpbmUg4oCUIHRpbWUgaXMgYW4gaW5wdXQgdGhlIHJlY29yZFxuICAgKiBjYW5ub3QgcmVwbGF5LCBzbyB3aXRoIGEgZGVhZGxpbmUgdGhlIHJlYWQgbWFya3MgdGhlIHN0YWdlJ3MgY29tbWl0XG4gICAqIGB1bnRyYWNrZWRTb3VyY2VzOiBbJ2VudiddYCwgYXMgYGdldEVudigpYCBkb2VzLlxuICAgKlxuICAgKiBBIHN0YWdlIHRoZSBhdHRlbXB0IHJ1bm5lciBkb2VzIG5vdCBydW4gKG5vIHJldHJ5IHBvbGljeSwgbm8gYHRpbWVvdXRNc2AsXG4gICAqIG5vIGRlYWRsaW5lKSBpcyBhdHRlbXB0IDEgb2YgMSwgd2l0aCB0aGUgcnVuJ3Mgc2lnbmFsIGFuZCBgSW5maW5pdHlgIGxlZnQuXG4gICAqXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgdCA9IHNjb3BlLiRhdHRlbXB0KCk7XG4gICAqIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKHVybCwgeyBzaWduYWw6IHQuc2lnbmFsIH0pO1xuICAgKiBpZiAodC50aW1lTGVmdE1zKCkgPCAxXzAwMCkgc2NvcGUuc3VtbWFyeSA9ICdwYXJ0aWFsJztcbiAgICogYGBgXG4gICAqL1xuICBnZXRBdHRlbXB0KCk6IEF0dGVtcHRDb250ZXh0IHtcbiAgICBjb25zdCBhdHRlbXB0ID0gdGhpcy5fYXR0ZW1wdDtcbiAgICBjb25zdCBvYnNlcnZlZCA9IChyZXBvcnQ6IE9ic2VydmVkQXR0ZW1wdCkgPT4gdGhpcy5yZWNvcmRPYnNlcnZlZChyZXBvcnQpO1xuICAgIGlmIChhdHRlbXB0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBPYmplY3QuZnJlZXplKHtcbiAgICAgICAgc2VyaWVzOiB0aGlzLl9zdGFnZUNvbnRleHQucnVudGltZVN0YWdlSWQsXG4gICAgICAgIGF0dGVtcHQ6IDEsXG4gICAgICAgIG9mOiAxLFxuICAgICAgICBzaWduYWw6IHRoaXMuX3J1blNpZ25hbCA/PyBORVZFUl9BQk9SVEVELFxuICAgICAgICB0aW1lTGVmdE1zOiAoKSA9PiBJbmZpbml0eSxcbiAgICAgICAgb2JzZXJ2ZWQsXG4gICAgICB9KTtcbiAgICB9XG4gICAgdGhpcy5yZWZ1c2VJZkF0dGVtcHRFbmRlZCgnJGF0dGVtcHQnKTtcbiAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5fc3RhZ2VDb250ZXh0O1xuICAgIHJldHVybiBPYmplY3QuZnJlZXplKHtcbiAgICAgIC4uLmF0dGVtcHQsXG4gICAgICB0aW1lTGVmdE1zOiAoKSA9PiB7XG4gICAgICAgIC8vIFJlYWQgdGhyb3VnaCBhIGhhbmRsZSBoZWxkIHBhc3QgaXRzIGF0dGVtcHQsIGl0IG11c3Qgbm90IG1hcmsgYSBMQVRFUiBhdHRlbXB0J3MgY29tbWl0LlxuICAgICAgICB0aGlzLnJlZnVzZUlmQXR0ZW1wdEVuZGVkKCckYXR0ZW1wdCcpO1xuICAgICAgICBpZiAoYXR0ZW1wdC5kZWFkbGluZSAhPT0gdW5kZWZpbmVkKSBjb250ZXh0Lm1hcmtVbnRyYWNrZWRTb3VyY2UoJ2VudicpO1xuICAgICAgICByZXR1cm4gYXR0ZW1wdC50aW1lTGVmdE1zKCk7XG4gICAgICB9LFxuICAgICAgb2JzZXJ2ZWQsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQSBjYWxsIHRvIGFuIG91dHNpZGUgc3lzdGVtLCBtYWRlIGluc2lkZSB0aGlzIHN0YWdlIOKAlCBgc2NvcGUuJGNhbGwodGFyZ2V0LCBmbiwgcG9saWN5PylgIChkZXNpZ24gwqczLjYsIFAyKS5cbiAgICogYGZuYCBydW5zIG9uIHRoZSBhdHRlbXB0IHJ1bm5lciB1bmRlciBgcG9saWN5YCAobm9uZSA9IE9ORSBhdHRlbXB0LCBzdGlsbCByZWNvcmRlZDogYSBzaW5nbGUgY2FsbCBpcyBldmlkZW5jZVxuICAgKiB0b28pLCBhbmQgZXZlcnkgYXR0ZW1wdCBpcyBhbiBgQXR0ZW1wdFJlY29yZGAgb2Yga2luZCBgJ2NhbGwnYCBvbiB0aGlzIHN0YWdlJ3MgZXhlY3V0aW9uLXRyZWUgbm9kZSBhbmQgb25cbiAgICogYG9uQXR0ZW1wdGAg4oCUIGl0cyB0aW1pbmcsIG91dGNvbWUsIGZhaWx1cmUgY2F0ZWdvcnkgYW5kIHRoZSByZXRyeS1vci1zdG9wIGRlY2lzaW9uLCBpdHMgZXJyb3Igc2VydmVkIHVuZGVyIHRoZVxuICAgKiBydW4ncyByZWRhY3Rpb24gcnVsZS5cbiAgICpcbiAgICogVGhlIGNhbGwgbGl2ZXMgd2l0aGluIHRoaXMgc3RhZ2UgYXR0ZW1wdDogaXQgaXMgY2FwcGVkIGJ5IHRoZSB0aW1lIHRoZSBhdHRlbXB0IGhhcyBsZWZ0IChpdHMgY2FwLCB0aGUgcnVuJ3NcbiAgICogZGVhZGxpbmUpIGFuZCBgZm5gJ3MgYHNpZ25hbGAgYWJvcnRzIHdoZW4gdGhlIGF0dGVtcHQgZG9lczsgb25jZSB0aGUgYXR0ZW1wdCBpcyBvdmVyIG5vdGhpbmcgb2YgdGhlIGNhbGwgbGFuZHNcbiAgICogYW5kIG5vIGZ1cnRoZXIgYXR0ZW1wdCBvZiBpdCBzdGFydHMgKGBhdHRlbXB0L2NhbGwudHNgKS4gYHRhcmdldGAgaXMgYSBOQU1FIGZyb20gY29kZSDigJQgbmV2ZXIgYSB2YWx1ZS5cbiAgICpcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCBxdW90ZSA9IGF3YWl0IHNjb3BlLiRjYWxsKCdzdHJpcGUucXVvdGVzLmNyZWF0ZScsICh0KSA9PiBzdHJpcGUucXVvdGVzLmNyZWF0ZShib2R5LCB7IHNpZ25hbDogdC5zaWduYWwgfSksXG4gICAqICAgeyBhdHRlbXB0czogMywgdGltZW91dE1zOiAxMF8wMDAsIGJhY2tvZmZNczogKG4pID0+IDUwMCAqIG4gfSk7XG4gICAqIGBgYFxuICAgKlxuICAgKiBBIGNhbGwgdGhhdCBDSEFOR0VTIGFuIG91dHNpZGUgc3lzdGVtIGRlY2xhcmVzIGl0IChQMyk6IGBvcHRpb25zLnRvdWNoZXNgIG5hbWVzIHRoZSBzeXN0ZW0gYW5kXG4gICAqIGBvcHRpb25zLmlkZW1wb3RlbmN5S2V5YCB0aGUga2V5IGV2ZXJ5IGF0dGVtcHQgaXMgbWFkZSB1bmRlciAoYHQuaWRlbXBvdGVuY3lLZXlgKSDigJQgYSB2YWx1ZSBmcm9tIHRoZSBzdGFnZSdzXG4gICAqIGlucHV0IG9yIHN0YXRlLCBuZXZlciBmcm9tIG1vZGVsIG91dHB1dC4gQSB0b3VjaGluZyBjYWxsIHRoYXQgbWF5IHJldHJ5IHdpdGhvdXQgYSBrZXkgaXMgcmVmdXNlZCBoZXJlLFxuICAgKiBiZWZvcmUgYW55dGhpbmcgaXMgc2VudDsgZWFjaCByZWNvcmQgc2F5cyB3aGF0IGl0cyBhdHRlbXB0IGRpZCAoYGVmZmVjdGApLCBhbmQgYSBjYWxsIHRoYXQgZW5kcyB3aXRob3V0IGFuIGFuc3dlciBhZnRlciBhbnkgYXR0ZW1wdCBsZWZ0IHRoZVxuICAgKiBlZmZlY3QgdW5rbm93biByZWplY3RzIHdpdGggYFVua25vd25FZmZlY3RFcnJvcmAg4oCUIHJlY29uY2lsZSBieSB0aGUga2V5LCBkbyBub3QgcmV0cnkgYmxpbmRseS5cbiAgICovXG4gIGNhbGw8VD4oXG4gICAgdGFyZ2V0OiBzdHJpbmcsXG4gICAgZm46IChhdHRlbXB0OiBBdHRlbXB0Q29udGV4dCkgPT4gUHJvbWlzZTxUPiB8IFQsXG4gICAgcG9saWN5PzogUmV0cnlQb2xpY3ksXG4gICAgb3B0aW9ucz86IENhbGxPcHRpb25zLFxuICApOiBQcm9taXNlPFQ+IHtcbiAgICBjb25zdCBuYW1lID0gYWRtaXRBdHRlbXB0TmFtZSgnJGNhbGwnLCAndGFyZ2V0JywgdGFyZ2V0KTtcbiAgICBjb25zdCB3aGVyZSA9IGAkY2FsbCgnJHtuYW1lfScpYDtcbiAgICBpZiAodHlwZW9mIGZuICE9PSAnZnVuY3Rpb24nKSB0aHJvdyBuZXcgVHlwZUVycm9yKGAke3doZXJlfTogZm4gbXVzdCBiZSBhIGZ1bmN0aW9uYCk7XG4gICAgY29uc3QgYWRtaXR0ZWQgPSBhZG1pdENhbGxQb2xpY3kod2hlcmUsIHBvbGljeSk7XG4gICAgY29uc3QgdG91Y2hlcyA9IGNhbGxUb3VjaGVzKHdoZXJlLCBvcHRpb25zLCBhZG1pdHRlZCk7XG4gICAgLy8gQSBrZXlsZXNzIHRvdWNoaW5nIGNhbGwgaXMgc2VudCBvbmNlIG9ubHkgaWYgdGhlIHN0YWdlIGF0dGVtcHQgdGhhdCBtYWtlcyBpdCBuZXZlciBydW5zIGFnYWluIChQMyk6IGEgc3RhZ2VcbiAgICAvLyB0aGF0IG1heSByZXRyeSB3b3VsZCByZS1zZW5kIGl0IHdpdGhvdXQgYSBrZXkg4oCUIHJlZnVzZWQgaGVyZSwgYmVmb3JlIGFueXRoaW5nIGlzIHNlbnQuXG4gICAgLy8gU28gaXMgb25lIGluc2lkZSBhbiBlbmNsb3NpbmcgYCRjYWxsYCB0aGF0IG1heSByZXRyeSAoaXRzIGZ1bmN0aW9uIHJ1bnMgb25jZSBwZXIgb3V0ZXIgYXR0ZW1wdCkuXG4gICAgaWYgKHRvdWNoZXMgIT09IHVuZGVmaW5lZCAmJiB0b3VjaGVzLmlkZW1wb3RlbmN5S2V5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IGVuY2xvc2luZyA9ICh0aGlzLl9hdHRlbXB0Py5vZiA/PyAxKSA+IDEgPyAnYSBzdGFnZScgOiB0aGlzLl9yZXRyeWluZ0NhbGxzID4gMCA/ICdhICRjYWxsJyA6IHVuZGVmaW5lZDtcbiAgICAgIGlmIChlbmNsb3NpbmcgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAgIGAke3doZXJlfTogdG91Y2hlcyBcIiR7dG91Y2hlcy5zeXN0ZW19XCIgd2l0aCBubyBpZGVtcG90ZW5jeUtleSwgaW5zaWRlICR7ZW5jbG9zaW5nfSB0aGF0IG1heSByZXRyeSDigJQgYSBgICtcbiAgICAgICAgICAgICdyZXRyeSB3b3VsZCBzZW5kIGl0IGFnYWluIHdpdGhvdXQgYSBrZXkuIEdpdmUgdGhlIGNhbGwgYSBrZXkuJyxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX3N0YWdlQ29udGV4dC5tYXJrS2V5bGVzc0VmZmVjdCgpO1xuICAgIH1cbiAgICAvLyBGcm9tIGFuIGVuZGVkIGF0dGVtcHQgb3IgYSBjb21taXR0ZWQgZnJhbWU6IHJlZnVzZWQgKGFuZCByZWNvcmRlZCBieSBuYW1lKSBiZWZvcmUgYW55dGhpbmcgcmVhY2hlcyBvdXRzaWRlLlxuICAgIHRoaXMucmVmdXNlTGF0ZUNhbGwoYGNhbGw6JHtuYW1lfWApO1xuICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLl9zdGFnZUNvbnRleHQ7XG4gICAgY29uc3Qgc3RhZ2VBdHRlbXB0ID0gdGhpcy5fYXR0ZW1wdD8uYXR0ZW1wdCA/PyAxO1xuICAgIGNvbnN0IHNpZ25hbCA9IHRoaXMuX2F0dGVtcHQ/LnNpZ25hbCA/PyB0aGlzLl9ydW5TaWduYWw7XG4gICAgY29uc3QgZGVhZGxpbmUgPSBhdHRlbXB0RW5kc0F0KHRoaXMuX2F0dGVtcHQpO1xuICAgIGNvbnN0IGVuZGVkID0gY29udGV4dC5jYWxsc0VuZGVkU2lnbmFsKHN0YWdlQXR0ZW1wdCk7XG4gICAgLy8gV2hpbGUgYSBjYWxsIHRoYXQgbWF5IHJldHJ5IGlzIGluIGZsaWdodCwgYSBrZXlsZXNzIHRvdWNoaW5nIGNhbGwgbWFkZSBpbnNpZGUgaXQgaXMgcmVmdXNlZCAoYWJvdmUpLlxuICAgIGNvbnN0IHJldHJ5aW5nID0gYXR0ZW1wdENlaWxpbmcoYWRtaXR0ZWQuYXR0ZW1wdHMpID4gMTtcbiAgICBpZiAocmV0cnlpbmcpIHRoaXMuX3JldHJ5aW5nQ2FsbHMgKz0gMTtcbiAgICBsZXQgcmVzdWx0OiBQcm9taXNlPFQ+O1xuICAgIHRyeSB7XG4gICAgICByZXN1bHQgPSB0aGlzLnN0YXJ0Q2FsbChuYW1lLCBmbiwgYWRtaXR0ZWQsIHRvdWNoZXMsIHN0YWdlQXR0ZW1wdCwgc2lnbmFsLCBkZWFkbGluZSwgZW5kZWQpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAocmV0cnlpbmcpIHRoaXMuX3JldHJ5aW5nQ2FsbHMgLT0gMTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgICBpZiAoIXJldHJ5aW5nKSByZXR1cm4gcmVzdWx0O1xuICAgIGNvbnN0IHJlbGVhc2UgPSAoKSA9PiB7XG4gICAgICB0aGlzLl9yZXRyeWluZ0NhbGxzIC09IDE7XG4gICAgfTtcbiAgICByZXN1bHQudGhlbihyZWxlYXNlLCByZWxlYXNlKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqIGBydW5DYWxsYCB3aXRoIHRoaXMgc3RhZ2UgYXR0ZW1wdCBhcyBpdHMgaG9zdCAoYGNhbGxgKS4gKi9cbiAgcHJpdmF0ZSBzdGFydENhbGw8VD4oXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGZuOiAoYXR0ZW1wdDogQXR0ZW1wdENvbnRleHQpID0+IFByb21pc2U8VD4gfCBULFxuICAgIGFkbWl0dGVkOiBSZXRyeVBvbGljeSxcbiAgICB0b3VjaGVzOiB7IHJlYWRvbmx5IHN5c3RlbTogc3RyaW5nOyByZWFkb25seSBpZGVtcG90ZW5jeUtleT86IHN0cmluZyB9IHwgdW5kZWZpbmVkLFxuICAgIHN0YWdlQXR0ZW1wdDogbnVtYmVyLFxuICAgIHNpZ25hbDogQWJvcnRTaWduYWwgfCB1bmRlZmluZWQsXG4gICAgZGVhZGxpbmU6IG51bWJlciB8IHVuZGVmaW5lZCxcbiAgICBlbmRlZDogQWJvcnRTaWduYWwsXG4gICk6IFByb21pc2U8VD4ge1xuICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLl9zdGFnZUNvbnRleHQ7XG4gICAgY29uc3QgbG9vcCA9IHRha2VSZXRyeUxvb3BDYWxsKHRoaXMpO1xuICAgIHJldHVybiBydW5DYWxsKG5hbWUsIGZuLCBhZG1pdHRlZCwge1xuICAgICAgb3BlblNlcmllczogKCkgPT4gY2FsbFNlcmllcyhjb250ZXh0LnJ1bnRpbWVTdGFnZUlkLCBzdGFnZUF0dGVtcHQsIGNvbnRleHQubmV4dENhbGxPcmRpbmFsKHN0YWdlQXR0ZW1wdCkpLFxuICAgICAgLi4uKHNpZ25hbCAhPT0gdW5kZWZpbmVkICYmIHsgc2lnbmFsIH0pLFxuICAgICAgLi4uKGRlYWRsaW5lICE9PSB1bmRlZmluZWQgJiYgeyBkZWFkbGluZSB9KSxcbiAgICAgIGVuZGVkLFxuICAgICAgLi4uKHRvdWNoZXMgIT09IHVuZGVmaW5lZCAmJiB7IGVmZmVjdDogdGhpcy5jYWxsRWZmZWN0KHRvdWNoZXMpIH0pLFxuICAgICAgLy8gVGhlIGZyYW1lJ3Mgb3duIGNvbW1pdCBzdGF0ZSAoZXZlcnkgYXR0ZW1wdCdzIGZhY2FkZSByZWFkcyB0aGUgc2FtZSksIG5ldmVyIGEgZmFjYWRlIGZsYWcuXG4gICAgICBhZG1pdHM6IChjdXQpID0+ICFjb250ZXh0LmNvbW1pdHRlZCAmJiAoY3V0IHx8ICEoZW5kZWQuYWJvcnRlZCB8fCB0aGlzLmF0dGVtcHRIYXNFbmRlZCgpKSksXG4gICAgICBzZXJ2ZTogKGVycm9yKSA9PiB0aGlzLnJ1bGUuc2VydmVkRXJyb3IoZXJyb3IpLFxuICAgICAgcmVwb3J0OiAocmVjb3JkLCBzdHJ1Y3R1cmVkRXJyb3IpID0+IHtcbiAgICAgICAgY29uc3Qgc2VydmVkID0gbG9vcCA/IE9iamVjdC5mcmVlemUoeyAuLi5yZWNvcmQsIHJldHJ5TG9vcDogbG9vcC5pZGVudGl0eSB9KSA6IHJlY29yZDtcbiAgICAgICAgY29udGV4dC5yZXBvcnRDYWxsQXR0ZW1wdChzZXJ2ZWQsIHN0cnVjdHVyZWRFcnJvcik7XG4gICAgICAgIGxvb3A/LnJlY29yZChzZXJ2ZWQpO1xuICAgICAgfSxcbiAgICAgIHJlZnVzZWQ6ICgpID0+IGNvbnRleHQucmVjb3JkTGF0ZVdyaXRlKHsgYXR0ZW1wdDogc3RhZ2VBdHRlbXB0LCBrZXk6IGBjYWxsOiR7bmFtZX1gLCBjaGFubmVsOiAnYXR0ZW1wdCcgfSksXG4gICAgICBvYnNlcnZlOiAocmVwb3J0LCBhdCkgPT4gdGhpcy5yZWNvcmRPYnNlcnZlZChyZXBvcnQsIGF0LmVuZGVkKSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgVGhlIGV4cGxpY2l0IHJldHJ5IGhlbHBlciBvd25zIHRoaXMgc3RhdGU7IHRoZSBub3JtYWwgd3JpdGUgcGF0aCBzdGlsbCBvd25zIHJldGVudGlvbi9jb21taXQuICovXG4gIHdyaXRlUmV0cnlMb29wU3RhdGUoa2V5OiBzdHJpbmcsIHN0YXRlOiB7IHJlYWRvbmx5IGlkZW1wb3RlbmN5S2V5OiBzdHJpbmcgfSk6IHZvaWQge1xuICAgIGNvbnN0IGtlcHQgPSB0aGlzLnNlcnZlUmV0cnlMb29wS2V5KHN0YXRlLmlkZW1wb3RlbmN5S2V5KTtcbiAgICBpZiAoa2VwdCAhPT0gc3RhdGUuaWRlbXBvdGVuY3lLZXkpIHRoaXMucnVsZS5pbmhlcml0RmllbGRzKGtleSwgWydpZGVtcG90ZW5jeUtleSddKTtcbiAgICB0aGlzLnNldFZhbHVlKGtleSwgc3RhdGUpO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCBFeGFjdGx5IHRoZSBleGlzdGluZyBQMyBrZXktcmV0ZW50aW9uIGxhdzsgb3BlcmF0aW9uYWwgc3RhdGUga2VlcHMgdGhlIHJlYWwga2V5LiAqL1xuICBzZXJ2ZVJldHJ5TG9vcEtleShrZXk6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucnVsZS5yZXRhaW5JZGVtcG90ZW5jeUtleShrZXksIHtcbiAgICAgIGlucHV0OiB0aGlzLl9yZWFkT25seVZhbHVlcyxcbiAgICAgIHNlbGVjdGVkUmVhZHM6IHRoaXMuX3N0YWdlQ29udGV4dC5zZWxlY3RlZFJlYWRzICsgKHRoaXMuX3N0YWdlQ29udGV4dC5lZmZlY3RLZXlUYWludGVkID8gMSA6IDApLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCBMb29wIHN0YXRlIGlzIGR1cmFibGUgZGF0YTogbmV2ZXIgcGVyc2lzdCB0aGUgdGhyb3duIHZhbHVlLCBzdGFjaywgY2F1c2Ugb3IgcGF5bG9hZC4gKi9cbiAgc2VydmVSZXRyeUxvb3BFcnJvcihlcnJvcjogdW5rbm93bik6IEF0dGVtcHRFcnJvciB7XG4gICAgY29uc3Qgc2VydmVkID0gdGhpcy5ydWxlLnNlcnZlZEVycm9yKGVycm9yKTtcbiAgICByZXR1cm4ge1xuICAgICAgbWVzc2FnZTogc2VydmVkLm1lc3NhZ2UsXG4gICAgICAuLi4oc2VydmVkLm5hbWUgIT09IHVuZGVmaW5lZCA/IHsgbmFtZTogc2VydmVkLm5hbWUgfSA6IHt9KSxcbiAgICAgIC4uLihzZXJ2ZWQuY29kZSAhPT0gdW5kZWZpbmVkID8geyBjb2RlOiBzZXJ2ZWQuY29kZSB9IDoge30pLFxuICAgIH07XG4gIH1cblxuICAvKiogQSB0b3VjaGluZyBjYWxsJ3MgdGFyZ2V0LCBpdHMga2V5IHNlcnZlZCBmb3IgdGhlIHJlY29yZHMgKGBSZWRhY3Rpb25SdWxlIMK3IHJldGFpbklkZW1wb3RlbmN5S2V5YDogYnkgbmFtZSBhbmQgYnkgaXRzIHNvdXJjZXMpLiAqL1xuICBwcml2YXRlIGNhbGxFZmZlY3QodG91Y2hlczogeyByZWFkb25seSBzeXN0ZW06IHN0cmluZzsgcmVhZG9ubHkgaWRlbXBvdGVuY3lLZXk/OiBzdHJpbmcgfSk6IHtcbiAgICByZWFkb25seSBzeXN0ZW06IHN0cmluZztcbiAgICByZWFkb25seSBpZGVtcG90ZW5jeUtleT86IHN0cmluZztcbiAgICByZWFkb25seSByZWNvcmRlZEtleT86IHN0cmluZztcbiAgfSB7XG4gICAgY29uc3Qga2V5ID0gdG91Y2hlcy5pZGVtcG90ZW5jeUtleTtcbiAgICBpZiAoa2V5ID09PSB1bmRlZmluZWQpIHJldHVybiB0b3VjaGVzO1xuICAgIC8vIEEga2V5IHRoZSBzdGFnZSBidWlsdCBhZnRlciByZWFkaW5nIGEgc2VsZWN0ZWQgdmFsdWUg4oCUIG9yIGZyb20gYW4gaW5wdXQgaG9sZGluZyBvbmUg4oCUIGlzIHNlcnZlZCB3aG9sZS5cbiAgICBjb25zdCByZWNvcmRlZEtleSA9IHRoaXMucnVsZS5yZXRhaW5JZGVtcG90ZW5jeUtleShrZXksIHtcbiAgICAgIGlucHV0OiB0aGlzLl9yZWFkT25seVZhbHVlcyxcbiAgICAgIC8vIFRoZSBzdGFnZSdzIG93biBrZXkgbWF5IGJlIG1hZGUgb2YgYSBzZWxlY3RlZCB2YWx1ZTogYSBrZXkgcGFzc2VkIG9uIGZyb20gaXQgaXMgc2VydmVkIHRoZSBzYW1lIHdheS5cbiAgICAgIHNlbGVjdGVkUmVhZHM6IHRoaXMuX3N0YWdlQ29udGV4dC5zZWxlY3RlZFJlYWRzICsgKHRoaXMuX3N0YWdlQ29udGV4dC5lZmZlY3RLZXlUYWludGVkID8gMSA6IDApLFxuICAgIH0pO1xuICAgIHJldHVybiB7IC4uLnRvdWNoZXMsIHJlY29yZGVkS2V5IH07XG4gIH1cblxuICAvKipcbiAgICogQSBgJGNhbGxgIGZyb20gYW4gZW5kZWQgYXR0ZW1wdCwgb3IgZnJvbSBhIGZyYW1lIHRoYXQgaGFzIGNvbW1pdHRlZDogcmVjb3JkZWQgYnkgbmFtZSAoYGxhdGVXcml0ZXNgLCBjaGFubmVsXG4gICAqIGAnYXR0ZW1wdCdgKSBhbmQgcmVmdXNlZCDigJQgYmVmb3JlIGFueXRoaW5nIHJlYWNoZXMgb3V0c2lkZS4gVGhlIFAxYiBmZW5jZSBmaXJzdCwgc28gaXRzIG1lc3NhZ2UgYW5kIHJlY29yZCBhcmVcbiAgICogdGhlIHNhbWUuXG4gICAqL1xuICBwcml2YXRlIHJlZnVzZUxhdGVDYWxsKGtleTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5yZWZ1c2VJZkF0dGVtcHRFbmRlZChrZXksICdhdHRlbXB0Jyk7XG4gICAgaWYgKCF0aGlzLl9zdGFnZUNvbnRleHQuY29tbWl0dGVkICYmICF0aGlzLl9jb21taXR0ZWQpIHJldHVybjtcbiAgICB0aGlzLl9zdGFnZUNvbnRleHQucmVjb3JkTGF0ZVdyaXRlKHsgYXR0ZW1wdDogdGhpcy5fYXR0ZW1wdD8uYXR0ZW1wdCA/PyAxLCBrZXksIGNoYW5uZWw6ICdhdHRlbXB0JyB9KTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoZGVhZEZyYW1lTWVzc2FnZSh0aGlzLl9zdGFnZU5hbWUsIHRoaXMuX3N0YWdlQ29udGV4dC5ydW50aW1lU3RhZ2VJZCwga2V5KSk7XG4gIH1cblxuICAvKipcbiAgICogQW4gb3V0c2lkZSBhdHRlbXB0IGFuIGFkYXB0ZXIgcmVwb3J0ZWQg4oCUIGBBdHRlbXB0Q29udGV4dC5vYnNlcnZlZGAgb24gdGhpcyBzdGFnZSdzIGF0dGVtcHQgb3Igb24gb25lIG9mIGl0c1xuICAgKiBjYWxscycgKFAyKS4gUmVhZCBhbmQgdmFsaWRhdGVkIGZpcnN0IChhIG1hbGZvcm1lZCByZXBvcnQgaXMgdGhlIGFkYXB0ZXIncyBidWc6IGEgYFR5cGVFcnJvcmAsIGFuZCBpdCBuZXZlclxuICAgKiByZWFjaGVzIHRoZSByZWNvcmQpLiBBIHJlcG9ydCB0aGF0IGNvbWVzIGFmdGVyIGl0cyBhdHRlbXB0IGVuZGVkIOKAlCB0aGUgY2FsbCBhdHRlbXB0IGl0IHdhcyBtYWRlIHRocm91Z2gsIHRoaXNcbiAgICogc3RhZ2UgYXR0ZW1wdCwgb3IgdGhlIGZyYW1lJ3MgY29tbWl0IOKAlCBpcyByZWNvcmRlZCBieSBuYW1lIChgbGF0ZVdyaXRlc2AsIGNoYW5uZWwgYCdhdHRlbXB0J2ApIGFuZCBEUk9QUEVELFxuICAgKiBuZXZlciB0aHJvd246IGFkYXB0ZXJzIHJlcG9ydCBmcm9tIGFuIFNESydzIG93biBjYWxsYmFja3MsIHdoaWNoIG1heSBmaXJlIGFmdGVyIHRoZSBzdGFnZSBtb3ZlZCBvbiwgYW5kIGFuXG4gICAqIG9ic2VydmVkIGF0dGVtcHQgbmV2ZXIgY2hhbmdlcyBjb250cm9sIGZsb3cg4oCUIGluIGVpdGhlciBkaXJlY3Rpb24uIEl0cyBzZXJpZXMgb3BlbnMgYXQgdGhpcyBzdGFnZSBhdHRlbXB0J3MgY2FsbFxuICAgKiBsZXZlbDogYW4gU0RLJ3MgY2FsbCBpcyBhIGNhbGwgdGhlIHN0YWdlIGF0dGVtcHQgbWFkZSwgc28gYSByZXBvcnQgbWFkZSB0aHJvdWdoIGEgYCRjYWxsYCBpcyB0aGF0IGNhbGwncyBzaWJsaW5nLlxuICAgKi9cbiAgcHJpdmF0ZSByZWNvcmRPYnNlcnZlZChyZXBvcnQ6IE9ic2VydmVkQXR0ZW1wdCwgY2FsbEF0dGVtcHRFbmRlZCA9IGZhbHNlKTogdm9pZCB7XG4gICAgY29uc3QgcmVhZCA9IHJlYWRPYnNlcnZlZFJlcG9ydChyZXBvcnQpO1xuICAgIGNvbnN0IGtleSA9IGBvYnNlcnZlZDoke3JlYWQudGFyZ2V0fWA7XG4gICAgY29uc3QgY29udGV4dCA9IHRoaXMuX3N0YWdlQ29udGV4dDtcbiAgICBjb25zdCBzdGFnZUF0dGVtcHQgPSB0aGlzLl9hdHRlbXB0Py5hdHRlbXB0ID8/IDE7XG4gICAgaWYgKGNhbGxBdHRlbXB0RW5kZWQgfHwgdGhpcy5hdHRlbXB0SGFzRW5kZWQoKSB8fCBjb250ZXh0LmNvbW1pdHRlZCB8fCB0aGlzLl9jb21taXR0ZWQpIHtcbiAgICAgIGNvbnRleHQucmVjb3JkTGF0ZVdyaXRlKHsgYXR0ZW1wdDogc3RhZ2VBdHRlbXB0LCBrZXksIGNoYW5uZWw6ICdhdHRlbXB0JyB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgYm9vayA9ICh0aGlzLl9vYnNlcnZlZEJvb2sgPz89IG5ldyBPYnNlcnZlZFNlcmllc0Jvb2soKCkgPT5cbiAgICAgIGNhbGxTZXJpZXMoY29udGV4dC5ydW50aW1lU3RhZ2VJZCwgc3RhZ2VBdHRlbXB0LCBjb250ZXh0Lm5leHRDYWxsT3JkaW5hbChzdGFnZUF0dGVtcHQpKSxcbiAgICApKTtcbiAgICBjb25zdCB7IHJlY29yZCwgc3RydWN0dXJlZEVycm9yIH0gPSBvYnNlcnZlZFJlY29yZChyZWFkLCB7XG4gICAgICBzZXJpZXM6IGJvb2suc2VyaWVzRm9yKHJlYWQpLFxuICAgICAgbm93OiBEYXRlLm5vdyxcbiAgICAgIHNlcnZlOiAoZXJyb3IpID0+IHRoaXMucnVsZS5zZXJ2ZWRFcnJvcihlcnJvciksXG4gICAgfSk7XG4gICAgY29udGV4dC5yZXBvcnRDYWxsQXR0ZW1wdChyZWNvcmQsIHN0cnVjdHVyZWRFcnJvcik7XG4gIH1cblxuICAvKiogVGhpcyBmYWNhZGUncyBhdHRlbXB0IGhhcyBlbmRlZCDigJQgdGhlIFAxYiBmZW5jZSBpcyBjbG9zZWQuICovXG4gIHByaXZhdGUgYXR0ZW1wdEhhc0VuZGVkKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGF0dGVtcHQgPSB0aGlzLl9hdHRlbXB0O1xuICAgIHJldHVybiBhdHRlbXB0ICE9PSB1bmRlZmluZWQgJiYgdGhpcy5fc3RhZ2VDb250ZXh0Lmhhc0F0dGVtcHRFbmRlZChhdHRlbXB0LmF0dGVtcHQpO1xuICB9XG5cbiAgLyoqIENhbGxlZCBieSBTdGFnZUNvbnRleHQuY29tbWl0KCkgb2JzZXJ2ZXIuIENvbnZlcnRzIHRyYWNrZWQgd3JpdGVzIHRvIENvbW1pdEV2ZW50IGZvcm1hdC5cbiAgICogIEVycm9ycyBhcmUgY2F1Z2h0IHRvIHByZXZlbnQgcmVjb3JkZXIgaXNzdWVzIGZyb20gYWJvcnRpbmcgdGhlIHRyYXZlcnNhbC4gKi9cbiAgcHJpdmF0ZSBfb25Db21taXRGaXJlZChtdXRhdGlvbnM6IFJlY29yZDxzdHJpbmcsIHsgdmFsdWU6IHVua25vd247IG9wZXJhdGlvbjogJ3NldCcgfCAndXBkYXRlJyB8ICdkZWxldGUnIH0+KTogdm9pZCB7XG4gICAgdGhpcy5fY29tbWl0dGVkID0gdHJ1ZTtcbiAgICBpZiAodGhpcy5fcmVjb3JkZXJzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgdHJ5IHtcbiAgICAgIC8vIGBfc3RhZ2VXcml0ZXNgIGFscmVhZHkgaG9sZHMgdGhlIHJldGFpbmVkIGZvcm0gKHRoZSBjb250ZXh0IHJldGFpbnNcbiAgICAgIC8vIHVuZGVyIHRoZSBzYW1lIHJ1bGUpOyBhcHBseWluZyB0aGUgdmVyZGljdCBhZ2FpbiBoZXJlIGlzIGlkZW1wb3RlbnRcbiAgICAgIC8vIGFuZCBrZWVwcyBhIGtleSBtYXJrZWQgQUZURVIgaXRzIHdyaXRlIHNjcnViYmVkIGF0IGNvbW1pdCB0aW1lLlxuICAgICAgY29uc3QgY29tbWl0TXV0YXRpb25zOiBDb21taXRFdmVudFsnbXV0YXRpb25zJ10gPSBPYmplY3QuZW50cmllcyhtdXRhdGlvbnMpLm1hcCgoW2tleSwgZW50cnldKSA9PiAoe1xuICAgICAgICBrZXksXG4gICAgICAgIHZhbHVlOiB0aGlzLnJ1bGUucmV0YWluKFtrZXldLCBlbnRyeS52YWx1ZSksXG4gICAgICAgIG9wZXJhdGlvbjogZW50cnkub3BlcmF0aW9uLFxuICAgICAgfSkpO1xuXG4gICAgICB0aGlzLm5vdGlmeUNvbW1pdChjb21taXRNdXRhdGlvbnMpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gU3dhbGxvdyDigJQgcmVjb3JkZXIgZXJyb3JzIG11c3Qgbm90IGFib3J0IHRoZSB0cmF2ZXJzYWwuXG4gICAgICAvLyBJbmRpdmlkdWFsIHJlY29yZGVyIGVycm9ycyBhcmUgYWxyZWFkeSBpc29sYXRlZCBieSBfaW52b2tlSG9vay5cbiAgICB9XG4gIH1cblxuICAvLyDilIDilIAgRGVidWcgLyBEaWFnbm9zdGljcyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgLy9cbiAgLy8gVGhlc2UgbGVnYWN5IG1ldGhvZHMgc3RpbGwgd3JpdGUgdG8gdGhlIGBTdGFnZUNvbnRleHRgIGRpYWdub3N0aWNcbiAgLy8gc2lkZSBiYWdzIChsb2dDb250ZXh0IC8gZXJyb3JDb250ZXh0IC8gbWV0cmljQ29udGV4dCAvIGV2YWxDb250ZXh0KSBmb3JcbiAgLy8gc25hcHNob3QgaW5jbHVzaW9uLiBUaGV5IEFMU08gZmlyZSB0aHJvdWdoIHRoZSBFbWl0IGNoYW5uZWwgc28gYW55XG4gIC8vIGF0dGFjaGVkIGBFbWl0UmVjb3JkZXJgIHNlZXMgdGhlbSBpbiByZWFsIHRpbWUg4oCUIGNsb3NpbmcgdGhlXG4gIC8vIGxvbmctc3RhbmRpbmcgZ2FwIHdoZXJlIGAkZGVidWdgL2AkbWV0cmljYCB3ZW50IHRvIHVub2JzZXJ2ZWQgYmFncy5cblxuICBhZGREZWJ1Z0luZm8oa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKSB7XG4gICAgdGhpcy5yZWZ1c2VJZkF0dGVtcHRFbmRlZChgbG9nLmRlYnVnLiR7a2V5fWAsICdlbWl0Jyk7XG4gICAgY29uc3Qga2VwdCA9IHRoaXMuX3N0YWdlQ29udGV4dC5hZGREaWFnbm9zdGljKCdsb2dzJywga2V5LCB2YWx1ZSk7XG4gICAgdGhpcy5lbWl0RXZlbnQoYGxvZy5kZWJ1Zy4ke2tleX1gLCB7IGtleSwgdmFsdWU6IGtlcHQsIGxldmVsOiAnZGVidWcnIH0pO1xuICB9XG5cbiAgYWRkRGVidWdNZXNzYWdlKHZhbHVlOiB1bmtub3duKSB7XG4gICAgdGhpcy5yZWZ1c2VJZkF0dGVtcHRFbmRlZCgnbG9nLmRlYnVnLm1lc3NhZ2VzJywgJ2VtaXQnKTtcbiAgICBjb25zdCBrZXB0ID0gdGhpcy5fc3RhZ2VDb250ZXh0LmFkZERpYWdub3N0aWMoJ2xvZ3MnLCAnbWVzc2FnZXMnLCBbdmFsdWVdKTtcbiAgICB0aGlzLmVtaXRFdmVudCgnbG9nLmRlYnVnLm1lc3NhZ2VzJywgeyB2YWx1ZTogQXJyYXkuaXNBcnJheShrZXB0KSA/IGtlcHRbMF0gOiBrZXB0LCBsZXZlbDogJ2RlYnVnJyB9KTtcbiAgfVxuXG4gIGFkZEVycm9ySW5mbyhrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24pIHtcbiAgICB0aGlzLnJlZnVzZUlmQXR0ZW1wdEVuZGVkKGBsb2cuZXJyb3IuJHtrZXl9YCwgJ2VtaXQnKTtcbiAgICBjb25zdCBrZXB0ID0gdGhpcy5fc3RhZ2VDb250ZXh0LmFkZERpYWdub3N0aWMoJ2Vycm9ycycsIGtleSwgdmFsdWUpO1xuICAgIHRoaXMuZW1pdEV2ZW50KGBsb2cuZXJyb3IuJHtrZXl9YCwgeyBrZXksIHZhbHVlOiBrZXB0LCBsZXZlbDogJ2Vycm9yJyB9KTtcbiAgfVxuXG4gIGFkZE1ldHJpYyhtZXRyaWNOYW1lOiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKSB7XG4gICAgdGhpcy5yZWZ1c2VJZkF0dGVtcHRFbmRlZChgbWV0cmljLiR7bWV0cmljTmFtZX1gLCAnZW1pdCcpO1xuICAgIGNvbnN0IGtlcHQgPSB0aGlzLl9zdGFnZUNvbnRleHQuYWRkRGlhZ25vc3RpYygnbWV0cmljcycsIG1ldHJpY05hbWUsIHZhbHVlKTtcbiAgICB0aGlzLmVtaXRFdmVudChgbWV0cmljLiR7bWV0cmljTmFtZX1gLCB7IG5hbWU6IG1ldHJpY05hbWUsIHZhbHVlOiBrZXB0IH0pO1xuICB9XG5cbiAgYWRkRXZhbChtZXRyaWNOYW1lOiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKSB7XG4gICAgdGhpcy5yZWZ1c2VJZkF0dGVtcHRFbmRlZChgZXZhbC4ke21ldHJpY05hbWV9YCwgJ2VtaXQnKTtcbiAgICBjb25zdCBrZXB0ID0gdGhpcy5fc3RhZ2VDb250ZXh0LmFkZERpYWdub3N0aWMoJ2V2YWxzJywgbWV0cmljTmFtZSwgdmFsdWUpO1xuICAgIHRoaXMuZW1pdEV2ZW50KGBldmFsLiR7bWV0cmljTmFtZX1gLCB7IG5hbWU6IG1ldHJpY05hbWUsIHZhbHVlOiBrZXB0IH0pO1xuICB9XG5cbiAgLy8g4pSA4pSAIEVtaXQg4oCUIFBoYXNlIDMgcHJpbWFyeSBwcmltaXRpdmUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqXG4gICAqIEZpcmUgYSBzdHJ1Y3R1cmVkIGV2ZW50IHRvIGV2ZXJ5IGF0dGFjaGVkIHJlY29yZGVyIGltcGxlbWVudGluZ1xuICAgKiBgb25FbWl0YC4gU3luY2hyb25vdXMsIGluLW9yZGVyLCBwYXNzLXRocm91Z2gg4oCUIG5vIGJ1ZmZlcmluZy5cbiAgICpcbiAgICogLSAqKkZhc3QtcGF0aCoqOiB6ZXJvIGFsbG9jYXRpb24gKyB6ZXJvIGNvc3Qgd2hlbiBubyByZWNvcmRlcnMgYXJlXG4gICAqICAgYXR0YWNoZWQgKGVhcmx5IHJldHVybiBvbiBlbXB0eSBsaXN0KS5cbiAgICogLSAqKkVucmljaG1lbnQqKjogbGlicmFyeSBhdXRvLWFkZHMgYHN0YWdlTmFtZWAsIGBydW50aW1lU3RhZ2VJZGAsXG4gICAqICAgYHN1YmZsb3dQYXRoYCwgYHBpcGVsaW5lSWRgLCBgdGltZXN0YW1wYCB0byB0aGUgZXZlbnQuXG4gICAqIC0gKipSZWRhY3Rpb24qKjogYFJlZGFjdGlvblBvbGljeS5lbWl0UGF0dGVybnNgIHJlZ2V4ZXMgYXJlIG1hdGNoZWRcbiAgICogICBhZ2FpbnN0IGBuYW1lYCDigJQgbWF0Y2hlZCBldmVudHMgaGF2ZSB0aGVpciBwYXlsb2FkIHJlcGxhY2VkIHdpdGhcbiAgICogICBgJ1tSRURBQ1RFRF0nYCBiZWZvcmUgZGlzcGF0Y2guXG4gICAqIC0gKipFcnJvciBpc29sYXRpb24qKjogYSB0aHJvd2luZyBgb25FbWl0YCBkb2VzIG5vdCBwcm9wYWdhdGUg4oCUIGl0IGlzXG4gICAqICAgY2F1Z2h0IGFuZCByb3V0ZWQgdG8gYG9uRXJyb3JgIG9uIHJlbWFpbmluZyByZWNvcmRlcnMsIG1hdGNoaW5nIHRoZVxuICAgKiAgIHBhdHRlcm4gdXNlZCBieSBvdGhlciBzY29wZSBldmVudHMuXG4gICAqXG4gICAqIENvbnN1bWVycyBjYWxsIHRoaXMgdmlhIHRoZSBgc2NvcGUuJGVtaXQobmFtZSwgcGF5bG9hZClgIHNjb3BlIG1ldGhvZDtcbiAgICogdGhlIG1ldGhvZCByb3V0ZXMgaGVyZSB2aWEgYGNyZWF0ZVR5cGVkU2NvcGVgLlxuICAgKi9cbiAgZW1pdEV2ZW50KG5hbWU6IHN0cmluZywgcGF5bG9hZDogdW5rbm93bik6IHZvaWQge1xuICAgIC8vIEFuIGVuZGVkIGF0dGVtcHQgZW1pdHMgbm90aGluZyDigJQgcmVmdXNlZCAoYW5kIHJlY29yZGVkKSBiZWZvcmUgdGhlIGZhc3QgcGF0aCwgc28gdGhlIHJlY29yZCBkb2VzIG5vdCBkZXBlbmRcbiAgICAvLyBvbiB3aGV0aGVyIGEgcmVjb3JkZXIgaGFwcGVuZWQgdG8gYmUgYXR0YWNoZWQuXG4gICAgdGhpcy5yZWZ1c2VJZkF0dGVtcHRFbmRlZChuYW1lLCAnZW1pdCcpO1xuICAgIC8vIEZhc3QtcGF0aDogemVybyB3b3JrIHdoZW4gbm8gcmVjb3JkZXJzIGFyZSBhdHRhY2hlZC5cbiAgICBpZiAodGhpcy5fcmVjb3JkZXJzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgLy8gUmVkYWN0aW9uOiBpZiB0aGUgZXZlbnQgbmFtZSBtYXRjaGVzIGFueSBlbWl0UGF0dGVybiwgcmVwbGFjZSBwYXlsb2FkXG4gICAgLy8gd2l0aCAnW1JFREFDVEVEXScgQkVGT1JFIGNvbnN0cnVjdGluZyB0aGUgZXZlbnQgKG5vIGxlYWsgdGhyb3VnaFxuICAgIC8vIGNvcHktb24td3JpdGUsIG5vIHdheSBmb3IgcmVjb3JkZXJzIHRvIHNlZSB0aGUgcmF3IHZhbHVlKS5cbiAgICBjb25zdCBmaW5hbFBheWxvYWQgPSB0aGlzLnJ1bGUucmV0YWluRW1pdChuYW1lLCBwYXlsb2FkKTtcbiAgICBjb25zdCBzb3VyY2VQb3NpdGlvbiA9IHRoaXMuX3N0YWdlQ29udGV4dC5jYXB0dXJlRW1pdFBvc2l0aW9uKCk7XG5cbiAgICAvLyBCdWlsZCB0aGUgZW5yaWNoZWQgZXZlbnQgb25jZTsgcGFzcyB0aGUgc2FtZSByZWZlcmVuY2UgdG8gYWxsXG4gICAgLy8gcmVjb3JkZXJzIHVuZGVyIHRoZWlyIHJlYWQtb25seSBjb250cmFjdC4gU291cmNlIGNvb3JkaW5hdGVzIGFyZVxuICAgIC8vIGNhcHR1cmVkIGJlZm9yZSBhbnkgaW5saW5lIGhvb2sgb3IgZGVmZXJyZWQgdGFwIG9ic2VydmVzIHRoZSBldmVudC5cbiAgICBjb25zdCBldmVudCA9IHtcbiAgICAgIG5hbWUsXG4gICAgICBwYXlsb2FkOiBmaW5hbFBheWxvYWQsXG4gICAgICBzdGFnZU5hbWU6IHRoaXMuX3N0YWdlTmFtZSxcbiAgICAgIHJ1bnRpbWVTdGFnZUlkOiB0aGlzLl9zdGFnZUNvbnRleHQucnVudGltZVN0YWdlSWQsXG4gICAgICBzdWJmbG93UGF0aDogdGhpcy5fZ2V0U3ViZmxvd1BhdGgoKSxcbiAgICAgIHBpcGVsaW5lSWQ6IHRoaXMuX3N0YWdlQ29udGV4dC5ydW5JZCxcbiAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgIC4uLihzb3VyY2VQb3NpdGlvbiA9PT0gdW5kZWZpbmVkID8ge30gOiB7IHNvdXJjZVBvc2l0aW9uIH0pLFxuICAgIH0gYXMgY29uc3Q7XG5cbiAgICAvLyBEaXNwYXRjaCB3aXRoIGVycm9yIGlzb2xhdGlvbiDigJQgdGhlIHNhbWUgYGZpcmVgIGxvb3AgYW5kIHRoZSBzYW1lIGZhaWx1cmUgcm91dGluZyBhc1xuICAgIC8vIGV2ZXJ5IG90aGVyIHNjb3BlIGV2ZW50OiBhIHRocm93aW5nIHJlY29yZGVyJ3MgZXJyb3IgcmVhY2hlcyBvbkVycm9yIG9uIHRoZSByZWNvcmRlcnM7XG4gICAgLy8gdGhlIGVtaXQgbG9vcCBjb250aW51ZXMgdW5hZmZlY3RlZC5cbiAgICBmaXJlKHRoaXMuX3JlY29yZGVycywgJ29uRW1pdCcsIHRoaXMuX2NvcnJlbGF0ZWQoZXZlbnQpLCB0aGlzLl9yb3V0ZUZhaWx1cmUpO1xuICB9XG5cbiAgLy8g4pSA4pSAIERldGFjaCDigJQgZmlyZS1hbmQtZm9yZ2V0IGNoaWxkIGZsb3djaGFydCBleGVjdXRpb24g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIC8vXG4gIC8vIERlbGVnYXRlcyB0byB0aGUgc2hhcmVkIGBkZXRhY2gvc3Bhd25gIGhlbHBlciwgd2hpY2ggbWludHMgYSByZWZJZFxuICAvLyBmcm9tIHRoaXMgc3RhZ2UncyBgcnVudGltZVN0YWdlSWRgIGFuZCBjYWxscyBgZHJpdmVyLnNjaGVkdWxlKClgLlxuICAvLyBSb3V0ZWQgdGhyb3VnaCBgY3JlYXRlVHlwZWRTY29wZWAgYXMgYHNjb3BlLiRkZXRhY2hBbmRKb2luTGF0ZXIoLi4uKWBcbiAgLy8gYW5kIGBzY29wZS4kZGV0YWNoQW5kRm9yZ2V0KC4uLilgLlxuXG4gIC8qKiBTZWUgYFNjb3BlTWV0aG9kcy4kZGV0YWNoQW5kSm9pbkxhdGVyYC4gKi9cbiAgZGV0YWNoQW5kSm9pbkxhdGVyKGRyaXZlcjogRGV0YWNoRHJpdmVyLCBjaGlsZDogRmxvd0NoYXJ0LCBpbnB1dD86IHVua25vd24pOiBEZXRhY2hIYW5kbGUge1xuICAgIHRoaXMucmVmdXNlSWZBdHRlbXB0RW5kZWQoZGV0YWNoS2V5KGNoaWxkKSwgJ2RldGFjaCcpO1xuICAgIHJldHVybiBkZXRhY2hBbmRKb2luTGF0ZXJTcGF3bihkcml2ZXIsIGNoaWxkLCBpbnB1dCwgdGhpcy5fc3RhZ2VDb250ZXh0LnJ1bnRpbWVTdGFnZUlkKTtcbiAgfVxuXG4gIC8qKiBTZWUgYFNjb3BlTWV0aG9kcy4kZGV0YWNoQW5kRm9yZ2V0YC4gKi9cbiAgZGV0YWNoQW5kRm9yZ2V0KGRyaXZlcjogRGV0YWNoRHJpdmVyLCBjaGlsZDogRmxvd0NoYXJ0LCBpbnB1dD86IHVua25vd24pOiB2b2lkIHtcbiAgICB0aGlzLnJlZnVzZUlmQXR0ZW1wdEVuZGVkKGRldGFjaEtleShjaGlsZCksICdkZXRhY2gnKTtcbiAgICBkZXRhY2hBbmRGb3JnZXRTcGF3bihkcml2ZXIsIGNoaWxkLCBpbnB1dCwgdGhpcy5fc3RhZ2VDb250ZXh0LnJ1bnRpbWVTdGFnZUlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZCB0aGUgc3ViZmxvd1BhdGggKG91dGVyIOKGkiBpbm5lcikgZm9yIGV2ZW50IGVucmljaG1lbnQuXG4gICAqXG4gICAqIFBhcnNlcyBmcm9tIGBydW50aW1lU3RhZ2VJZGAgd2hpY2ggaGFzIHRoZSBmb3JtYXRcbiAgICogYFtzdWJmbG93UGF0aC9dc3RhZ2VJZCNleGVjdXRpb25JbmRleGAgKHNlZSBgbGliL2lkcy9ydW50aW1lU3RhZ2VJZC50c2ApLlxuICAgKiBTdWJmbG93IGlzb2xhdGlvbiBwcmV2ZW50cyB3YWxraW5nIHRoZSBwYXJlbnQtY2hhaW4gYWNyb3NzIGJvdW5kYXJpZXMsXG4gICAqIHNvIHRoZSBydW50aW1lU3RhZ2VJZCDigJQgZ2xvYmFsbHkgdW5pcXVlLCBpbmNsdWRlcyBmdWxsIHBhdGgg4oCUIGlzIHRoZVxuICAgKiBjYW5vbmljYWwgc291cmNlIG9mIHRydXRoIGZvciB0aGUgc3ViZmxvdyBoaWVyYXJjaHkgYXQgZW1pdCB0aW1lLlxuICAgKlxuICAgKiBFeGFtcGxlczpcbiAgICogICAnc2VlZCMwJyAgICAgICAgICAgICAgICAg4oaSIFtdICAgICAgICAgICAgICAgICAgICAocm9vdClcbiAgICogICAnc2YtaW5uZXIvaW5uZXIjNScgICAgICAg4oaSIFsnc2YtaW5uZXInXVxuICAgKiAgICdzZi1hL3NmLWIvc3RhZ2UjMycgICAgICDihpIgWydzZi1hJywgJ3NmLWInXSAgICAgIChuZXN0ZWQpXG4gICAqL1xuICBwcml2YXRlIF9nZXRTdWJmbG93UGF0aCgpOiByZWFkb25seSBzdHJpbmdbXSB7XG4gICAgY29uc3QgcnRpZCA9IHRoaXMuX3N0YWdlQ29udGV4dC5ydW50aW1lU3RhZ2VJZDtcbiAgICBpZiAoIXJ0aWQpIHJldHVybiBTY29wZUZhY2FkZS5fRU1QVFlfU1VCRkxPV19QQVRIO1xuICAgIC8vIFRoZSBncmFtbWFyJ3Mgb25lIG93bmVyIHJlYWRzIHRoZSBwYXRoIHBvcnRpb24gKGBpZHMvcnVudGltZVN0YWdlSWQudHNgKS5cbiAgICBjb25zdCBzZWdtZW50cyA9IHN1YmZsb3dTZWdtZW50c09mKHJ0aWQpO1xuICAgIGlmIChzZWdtZW50cy5sZW5ndGggPT09IDApIHJldHVybiBTY29wZUZhY2FkZS5fRU1QVFlfU1VCRkxPV19QQVRIO1xuICAgIHJldHVybiBPYmplY3QuZnJlZXplKHNlZ21lbnRzKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBOb24tVHJhY2tpbmcgU3RhdGUgSW5zcGVjdGlvbiAoZm9yIFR5cGVkU2NvcGUgcHJveHkgaW50ZXJuYWxzKSDilIDilIDilIDilIDilIDilIBcblxuICAvKiogUmV0dXJucyBhbGwgc3RhdGUga2V5cyB3aXRob3V0IGZpcmluZyBvblJlYWQuIFVzZWQgYnkgVHlwZWRTY29wZSBvd25LZXlzL2hhcyB0cmFwcy4gKi9cbiAgZ2V0U3RhdGVLZXlzKCk6IHN0cmluZ1tdIHtcbiAgICB0aGlzLnJlZnVzZUlmQXR0ZW1wdEVuZGVkKCcqJyk7XG4gICAgY29uc3Qgc25hcHNob3QgPSB0aGlzLl9zdGFnZUNvbnRleHQuZ2V0VmFsdWUoW10sIHVuZGVmaW5lZCk7XG4gICAgaWYgKCFzbmFwc2hvdCB8fCB0eXBlb2Ygc25hcHNob3QgIT09ICdvYmplY3QnKSByZXR1cm4gW107XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHNuYXBzaG90IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KTtcbiAgfVxuXG4gIC8qKiBDaGVjayBrZXkgZXhpc3RlbmNlIHdpdGhvdXQgZmlyaW5nIG9uUmVhZC4gVXNlZCBieSBUeXBlZFNjb3BlIGhhcyB0cmFwLlxuICAgKiAgQ29udHJhY3Q6IHJldHVybnMgZmFsc2UgZm9yIGtleXMgbmV2ZXIgc2V0IE9SIGtleXMgc2V0IHRvIHVuZGVmaW5lZC5cbiAgICogIFRoaXMgbWF0Y2hlcyBkZWxldGVWYWx1ZSgpIHNlbWFudGljcyAoc2V0cyB0byB1bmRlZmluZWQgPSBkZWxldGVkKS4gKi9cbiAgaGFzS2V5KGtleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgdGhpcy5yZWZ1c2VJZkF0dGVtcHRFbmRlZChrZXkpO1xuICAgIHJldHVybiB0aGlzLl9zdGFnZUNvbnRleHQuZ2V0VmFsdWUoW10sIGtleSkgIT09IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKiBSZWFkIHN0YXRlIHdpdGhvdXQgZmlyaW5nIG9uUmVhZC4gVXNlZCBieSBhcnJheSBwcm94eSBnZXRDdXJyZW50KCkgdG8gYXZvaWRcbiAgICogIHBoYW50b20gcmVhZHMgb24gaW50ZXJuYWwgYXJyYXkgb3BlcmF0aW9ucyAoLmxlbmd0aCwgLmhhcywgaXRlcmF0aW9uLCBldGMuKS5cbiAgICogIFRoZSBpbml0aWFsIHByb3BlcnR5IGFjY2VzcyBmaXJlcyBvbmUgdHJhY2tlZCBvblJlYWQgdmlhIGdldFZhbHVlKCk7IHN1YnNlcXVlbnRcbiAgICogIGludGVybmFsIGFycmF5IG9wZXJhdGlvbnMgdXNlIHRoaXMgbWV0aG9kIHRvIHN0YXkgc2lsZW50LlxuICAgKiAgTk9URTogTGlrZSBnZXRWYWx1ZSgpLCByZXR1cm5zIHRoZSByYXcgdmFsdWUgdG8gdGhlIGNhbGxlci4gUmVkYWN0aW9uIGFwcGxpZXNcbiAgICogIG9ubHkgdG8gcmVjb3JkZXIgZGlzcGF0Y2gg4oCUIGl0IGRvZXMgbm90IGZpbHRlciB0aGUgcmV0dXJuZWQgdmFsdWUuIFRoaXMgbWF0Y2hlc1xuICAgKiAgdGhlIGV4aXN0aW5nIGdldFZhbHVlKCkgY29udHJhY3Qgd2hlcmUgdXNlciBjb2RlIGFsd2F5cyByZWNlaXZlcyByYXcgZGF0YS5cbiAgICpcbiAgICogIFJGQy0wMDMgRDI6IGEgc2lsZW50IHJlYWQgb2YgYSBrZXkgdGhpcyBzdGFnZSBuZXZlciBUUkFDS0VELXJlYWQgbWFya3NcbiAgICogIHRoZSBzdGFnZSdzIGNvbW1pdCB3aXRoIGB1bnRyYWNrZWRTb3VyY2VzOiBbJ3NpbGVudCddYCDigJQgYSBjYXVzYWwgc2xpY2VcbiAgICogIGJ1aWx0IGZyb20gb25SZWFkIGV2ZW50cyB3b3VsZCBtaXNzIHRoaXMgZGVwZW5kZW5jeSwgYW5kIGNvbnN1bWVycyBtdXN0XG4gICAqICBiZSB0b2xkLiBTaWxlbnQgcmVhZHMgc2hhZG93ZWQgYnkgYSB0cmFja2VkIHJlYWQgb2YgdGhlIHNhbWUga2V5ICh0aGVcbiAgICogIGFycmF5LXByb3h5IHBhdHRlcm4gYWJvdmUpIGFyZSBub3QgZmxhZ2dlZDogdGhlaXIgZWRnZSBpcyBjYXB0dXJlZC4gQVxuICAgKiAgd2hvbGUtc3RhdGUgc2lsZW50IHJlYWQgKG5vIGtleSkgaXMgYWx3YXlzIGZsYWdnZWQuICovXG4gIGdldFZhbHVlU2lsZW50KGtleT86IHN0cmluZyk6IHVua25vd24ge1xuICAgIHRoaXMucmVmdXNlSWZBdHRlbXB0RW5kZWQoa2V5ID8/ICcqJyk7XG4gICAgaWYgKGtleSA9PT0gdW5kZWZpbmVkIHx8ICF0aGlzLl90cmFja2VkUmVhZEtleXMuaGFzKGtleSkpIHtcbiAgICAgIHRoaXMuX3N0YWdlQ29udGV4dC5tYXJrVW50cmFja2VkU291cmNlKCdzaWxlbnQnKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3N0YWdlQ29udGV4dC5nZXRWYWx1ZURpcmVjdChbXSwga2V5KTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBTdGF0ZSBBY2Nlc3Mg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgZ2V0SW5pdGlhbFZhbHVlRm9yKGtleTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuX3N0YWdlQ29udGV4dC5nZXRHbG9iYWw/LihrZXkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRyYWNrZWQgcmVhZCBvZiBzaGFyZWQgc3RhdGUuXG4gICAqXG4gICAqICoqUmVhZCB2YWx1ZXMgYXJlIEJPUlJPV0VEIOKAlCBkbyBub3QgbXV0YXRlIHRoZW0uKiogU2luY2UgdGhlIGxhenkgYnVmZmVyXG4gICAqICgjMTMpLCByZWFkcyBiZWZvcmUgdGhlIHN0YWdlJ3MgZmlyc3Qgd3JpdGUgcmV0dXJuIHJlZmVyZW5jZXMgSU5UT1xuICAgKiBDT01NSVRURUQgU0hBUkVEIFNUQVRFLCBhbmQgcmVhZHMgYWZ0ZXIgYSB3cml0ZSByZXR1cm4gcmVmZXJlbmNlcyBpbnRvXG4gICAqIHRoZSBzdGFnZSdzIHByaXZhdGUgdHJhbnNhY3Rpb24tYnVmZmVyIHdvcmtpbmcgY29weSAodGhlIGVhZ2VyIGVuZ2luZVxuICAgKiByZXR1cm5lZCByZWZlcmVuY2VzIGludG8gdGhhdCB3b3JraW5nIGNvcHkgZm9yIEFMTCByZWFkcykuIE11dGF0aW5nIGFcbiAgICogcmV0dXJuZWQgdmFsdWUgaW4gcGxhY2Ugd291bGQgY29ycnVwdCBzdGF0ZSB3aXRob3V0IGEgY29tbWl0IHJlY29yZCDigJRcbiAgICogd3JpdGUgY2hhbmdlcyBiYWNrIHZpYSBgc2V0VmFsdWVgL2B1cGRhdGVWYWx1ZWAgaW5zdGVhZC4gVHlwZWRTY29wZVxuICAgKiBjb25zdW1lcnMgYXJlIHNhZmUgYXV0b21hdGljYWxseTogdGhlIHByb3h5IHJvdXRlcyBldmVyeSBtdXRhdGlvblxuICAgKiB0aHJvdWdoIGBzZXRWYWx1ZWAvYHVwZGF0ZVZhbHVlYC9jb3B5LW9uLXdyaXRlIGFycmF5IG9wcy5cbiAgICpcbiAgICogVGhlcmUgaXMgZGVsaWJlcmF0ZWx5IE5PIGRldi1tb2RlIGZyZWV6ZSBndWFyZCBoZXJlOiBkZWVwLWZyZWV6aW5nIGFcbiAgICogYnVmZmVyLXNlcnZlZCByZWFkIHdvdWxkIGZyZWV6ZSB0aGUgc3RhZ2UncyBvd24gd29ya2luZyBjb3B5IGFuZCBtYWtlIGFcbiAgICogbGVnaXRpbWF0ZSByZWFkLXRoZW4tZGVlcC13cml0ZSB0aHJvdywgYW5kIGZyZWV6aW5nIGEgY29tbWl0dGVkLXN0YXRlXG4gICAqIHJlYWQgbXV0YXRlcyBhbiBvYmplY3Qgc2hhcmVkIHdpdGggZXZlcnkgb3RoZXIgY29uc3VtZXIgb2YgdGhlIGxpdmVcbiAgICogc3RhdGUuIFNlZSBgc3JjL2xpYi9tZW1vcnkvUkVBRE1FLm1kYCAoXCJSZWFkIHZhbHVlcyBhcmUgYm9ycm93ZWRcIikuXG4gICAqXG4gICAqIFJlY29yZGVyIG5vdGU6IHRoZSBgb25SZWFkYCBldmVudCBiZWxvdyBwYXNzZXMgdGhlIFNBTUUgbGl2ZSByZWZlcmVuY2VcbiAgICogKG5vIGNsb25lKSB1bmxlc3MgZmllbGQtbGV2ZWwgcmVkYWN0aW9uIHNjcnVicyBhIGNvcHkg4oCUIHJlY29yZGVycyBtdXN0XG4gICAqIHRyZWF0IGV2ZW50IHZhbHVlcyBhcyByZWFkLW9ubHkgdG9vLlxuICAgKi9cbiAgZ2V0VmFsdWUoa2V5Pzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0VmFsdWVBdChbXSwga2V5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXRoLWF3YXJlIGFkYXB0ZXIgYWNjZXNzLiBTZWdtZW50cyBzdGF5IHNlcGFyYXRlIGZyb20gbGl0ZXJhbCBkb3R0ZWQga2V5cyBpbiBTVEFURTtcbiAgICogdGhlIHJlY29yZGVyIGV2ZW50J3MgYGtleWAgaXMgb25seSBhIGRvdC1qb2luZWQgZGlzcGxheSBsYWJlbCwgc28gYFsndXNlcicsJ3NzbiddYCBhbmRcbiAgICogYSBsaXRlcmFsIHRvcC1sZXZlbCBgJ3VzZXIuc3NuJ2AgcHJvZHVjZSB0aGUgc2FtZSBldmVudCBrZXkgKHNhbWUgZm9yIHRoZSB3cml0ZXMgYmVsb3cpLlxuICAgKi9cbiAgZ2V0VmFsdWVBdChwYXRoOiBzdHJpbmdbXSwga2V5Pzogc3RyaW5nKSB7XG4gICAgdGhpcy5yZWZ1c2VJZkF0dGVtcHRFbmRlZChrZXkgPT09IHVuZGVmaW5lZCA/IHBhdGguam9pbignLicpIHx8ICcqJyA6IFsuLi5wYXRoLCBrZXldLmpvaW4oJy4nKSk7XG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLl9zdGFnZUNvbnRleHQuZ2V0VmFsdWUocGF0aCwga2V5KTtcblxuICAgIC8vIFJGQy0wMDMgRDI6IHJlbWVtYmVyIHRyYWNrZWQga2V5cyBzbyBsYXRlciBTSUxFTlQgcmVhZHMgb2YgdGhlIHNhbWVcbiAgICAvLyBrZXkgY291bnQgYXMgc2hhZG93ZWQgKGVkZ2UgYWxyZWFkeSBjYXB0dXJlZCkgaW5zdGVhZCBvZiB1bnRyYWNrZWQuXG4gICAgLy8gT25seSBhIHdob2xlIHRvcC1sZXZlbCB2YWx1ZSBzaGFkb3dzIGEgbGF0ZXIgc2lsZW50IHJlYWQgb2YgdGhhdCB2YWx1ZS5cbiAgICAvLyBSZWFkaW5nIG9uZSBuZXN0ZWQgZmllbGQgbXVzdCBub3QgY2xhaW0gdG8gaGF2ZSBvYnNlcnZlZCBpdHMgc2libGluZ3MuXG4gICAgaWYgKHBhdGgubGVuZ3RoID09PSAwICYmIGtleSAhPT0gdW5kZWZpbmVkKSB0aGlzLl90cmFja2VkUmVhZEtleXMuYWRkKGtleSk7XG4gICAgZWxzZSBpZiAocGF0aC5sZW5ndGggPT09IDEgJiYga2V5ID09PSB1bmRlZmluZWQpIHRoaXMuX3RyYWNrZWRSZWFkS2V5cy5hZGQocGF0aFswXSEpO1xuXG4gICAgaWYgKHRoaXMuX3JlY29yZGVycy5sZW5ndGggPiAwKSB7XG4gICAgICAvLyBBIHdob2xlLXN0YXRlIHJlYWQgKG5vIGtleSkgaXMgc2VydmVkIHdpdGggZXZlcnkgcmVkYWN0ZWQga2V5IGluc2lkZVxuICAgICAgLy8gaXQgc2NydWJiZWQ7IGEga2V5ZWQgcmVhZCBpcyBzZXJ2ZWQgdW5kZXIgdGhlIGtleSdzIHZlcmRpY3QuXG4gICAgICBjb25zdCB3aG9sZVN0YXRlID0gcGF0aC5sZW5ndGggPT09IDAgJiYga2V5ID09PSB1bmRlZmluZWQ7XG4gICAgICBjb25zdCB2ZXJkaWN0ID0gd2hvbGVTdGF0ZSA/IENMRUFSIDoga2V5ID09PSB1bmRlZmluZWQgPyB0aGlzLnJ1bGUudmVyZGljdChwYXRoKSA6IHRoaXMucnVsZS52ZXJkaWN0QXQocGF0aCwga2V5KTtcbiAgICAgIGNvbnN0IHJlY29yZGVyVmFsdWUgPSB3aG9sZVN0YXRlID8gdGhpcy5ydWxlLnJldGFpblJlY29yZCh2YWx1ZSkgOiBSZWRhY3Rpb25SdWxlLmFwcGx5KHZlcmRpY3QsIHZhbHVlKTtcbiAgICAgIGNvbnN0IGV2ZW50S2V5ID0gcGF0aC5sZW5ndGggPT09IDAgPyBrZXkgOiAoa2V5ID09PSB1bmRlZmluZWQgPyBwYXRoIDogWy4uLnBhdGgsIGtleV0pLmpvaW4oJy4nKTtcblxuICAgICAgdGhpcy5faW52b2tlSG9vaygnb25SZWFkJywge1xuICAgICAgICBzdGFnZU5hbWU6IHRoaXMuX3N0YWdlTmFtZSxcbiAgICAgICAgc3RhZ2VJZDogdGhpcy5fc3RhZ2VDb250ZXh0LnN0YWdlSWQsXG4gICAgICAgIHJ1bnRpbWVTdGFnZUlkOiB0aGlzLl9zdGFnZUNvbnRleHQucnVudGltZVN0YWdlSWQsXG4gICAgICAgIHBpcGVsaW5lSWQ6IHRoaXMuX3N0YWdlQ29udGV4dC5ydW5JZCxcbiAgICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxuICAgICAgICBrZXk6IGV2ZW50S2V5LFxuICAgICAgICB2YWx1ZTogcmVjb3JkZXJWYWx1ZSxcbiAgICAgICAgcmVkYWN0ZWQ6IHZlcmRpY3Qua2luZCAhPT0gJ2NsZWFyJyB8fCB1bmRlZmluZWQsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICBzZXRWYWx1ZShrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24sIHNob3VsZFJlZGFjdD86IGJvb2xlYW4sIGRlc2NyaXB0aW9uPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuc2V0VmFsdWVBdChbXSwga2V5LCB2YWx1ZSwgc2hvdWxkUmVkYWN0LCBkZXNjcmlwdGlvbik7XG4gIH1cblxuICAvKiogUGF0aC1hd2FyZSB3cml0ZXMgc2hhcmUgcmVjb3JkaW5nLCByZWRhY3Rpb24gYW5kIGxpZmV0aW1lIHBvbGljeSB3aXRoIGZsYXQgd3JpdGVzLiAqL1xuICBzZXRWYWx1ZUF0KHBhdGg6IHN0cmluZ1tdLCBrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24sIHNob3VsZFJlZGFjdD86IGJvb2xlYW4sIGRlc2NyaXB0aW9uPzogc3RyaW5nKSB7XG4gICAgY29uc3QgZXZlbnRLZXkgPSBwYXRoLmxlbmd0aCA9PT0gMCA/IGtleSA6IFsuLi5wYXRoLCBrZXldLmpvaW4oJy4nKTtcbiAgICBhc3NlcnROb3RSZWFkb25seSh0aGlzLl9yZWFkT25seVZhbHVlcywgcGF0aFswXSA/PyBrZXksICd3cml0ZScpO1xuICAgIHRoaXMuYXNzZXJ0TGl2ZShldmVudEtleSk7XG5cbiAgICAvLyBEZXYtbW9kZTogd2FybiBpZiB0aGUgdmFsdWUgY29udGFpbnMgY2lyY3VsYXIgcmVmZXJlbmNlcy5cbiAgICAvLyBDaGVjayBBRlRFUiBhc3NlcnROb3RSZWFkb25seSDigJQgZG9uJ3Qgd2FybiBmb3Igd3JpdGVzIHRoYXQgd2lsbCBiZSBibG9ja2VkLlxuICAgIC8vIENpcmN1bGFyIHZhbHVlcyB3b3JrICh0ZXJtaW5hbCBwcm94eSBoYW5kbGVzIHRoZW0pIGJ1dCBjYW4gcHJvZHVjZVxuICAgIC8vIHN1cnByaXNpbmcgYmVoYXZpb3IgaW4gbmFycmF0aXZlLCBKU09OIHNlcmlhbGl6YXRpb24sIGFuZCBzbmFwc2hvdHMuXG4gICAgaWYgKGlzRGV2TW9kZSgpICYmIHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGlmIChoYXNDaXJjdWxhclJlZmVyZW5jZSh2YWx1ZSkpIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgIGBbZm9vdHByaW50XSBDaXJjdWxhciByZWZlcmVuY2UgZGV0ZWN0ZWQgaW4gc2V0VmFsdWUoJyR7ZXZlbnRLZXl9JykuIGAgK1xuICAgICAgICAgICAgJ1dyaXRlcyBwYXN0IHRoZSBjeWNsZSBkZXB0aCB3aWxsIHVzZSB0ZXJtaW5hbCBwcm94eSB0cmFja2luZy4gJyArXG4gICAgICAgICAgICAnQ29uc2lkZXIgZmxhdHRlbmluZyB0aGUgZGF0YSBzdHJ1Y3R1cmUuJyxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBUaGUgY29udGV4dCBpcyB0aGUgT05FIGZ1bm5lbDogaXQgZGVjaWRlcyB0aGUgdmVyZGljdCAoZXhwbGljaXQgZmxhZyxcbiAgICAvLyBwb2xpY3kga2V5L3BhdHRlcm4sIHBlci1ydW4gbWFyaywgb3IgZmllbGQtbGV2ZWwgc2NydWIpLCBzdGFnZXMgdGhlXG4gICAgLy8gd3JpdGUgd2l0aCB0aGUgcGF0aHMgdGhlIGxvZyB3aWxsIHNjcnViLCBhbmQgaGFuZHMgdGhlIHZlcmRpY3QgYmFjayBzb1xuICAgIC8vIHJlY29yZGVycyBzZWUgdGhlIHNhbWUgZGVjaXNpb24gdGhlIHJldGFpbmVkIHJlY29yZCBob2xkcy5cbiAgICBjb25zdCB2ZXJkaWN0ID0gdGhpcy5fc3RhZ2VDb250ZXh0LnNldE9iamVjdChwYXRoLCBrZXksIHZhbHVlLCBzaG91bGRSZWRhY3QsIGRlc2NyaXB0aW9uKTtcblxuICAgIGlmICh0aGlzLl9yZWNvcmRlcnMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5faW52b2tlSG9vaygnb25Xcml0ZScsIHtcbiAgICAgICAgc3RhZ2VOYW1lOiB0aGlzLl9zdGFnZU5hbWUsXG4gICAgICAgIHN0YWdlSWQ6IHRoaXMuX3N0YWdlQ29udGV4dC5zdGFnZUlkLFxuICAgICAgICBydW50aW1lU3RhZ2VJZDogdGhpcy5fc3RhZ2VDb250ZXh0LnJ1bnRpbWVTdGFnZUlkLFxuICAgICAgICBwaXBlbGluZUlkOiB0aGlzLl9zdGFnZUNvbnRleHQucnVuSWQsXG4gICAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgICAga2V5OiBldmVudEtleSxcbiAgICAgICAgdmFsdWU6IFJlZGFjdGlvblJ1bGUuYXBwbHkodmVyZGljdCwgdmFsdWUpLFxuICAgICAgICBvcGVyYXRpb246ICdzZXQnLFxuICAgICAgICByZWRhY3RlZDogdmVyZGljdC5raW5kICE9PSAnY2xlYXInIHx8IHVuZGVmaW5lZCxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHVwZGF0ZVZhbHVlKGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93biwgZGVzY3JpcHRpb24/OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy51cGRhdGVWYWx1ZUF0KFtdLCBrZXksIHZhbHVlLCBkZXNjcmlwdGlvbik7XG4gIH1cblxuICAvKiogUGF0aC1hd2FyZSBtZXJnZXMgdXNlIHRoZSBzYW1lIHdyaXRlIGZ1bm5lbCBhcyByZXBsYWNlbWVudHMuICovXG4gIHVwZGF0ZVZhbHVlQXQocGF0aDogc3RyaW5nW10sIGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93biwgZGVzY3JpcHRpb24/OiBzdHJpbmcpIHtcbiAgICBjb25zdCBldmVudEtleSA9IHBhdGgubGVuZ3RoID09PSAwID8ga2V5IDogWy4uLnBhdGgsIGtleV0uam9pbignLicpO1xuICAgIGFzc2VydE5vdFJlYWRvbmx5KHRoaXMuX3JlYWRPbmx5VmFsdWVzLCBwYXRoWzBdID8/IGtleSwgJ3dyaXRlJyk7XG4gICAgdGhpcy5hc3NlcnRMaXZlKGV2ZW50S2V5KTtcblxuICAgIC8vIERldi1tb2RlOiBzYW1lIGNpcmN1bGFyIGNoZWNrIGFzIHNldFZhbHVlIChtZXJnZSB0YXJnZXRzIGNhbiBiZSBjaXJjdWxhciB0b28pXG4gICAgaWYgKGlzRGV2TW9kZSgpICYmIHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGlmIChoYXNDaXJjdWxhclJlZmVyZW5jZSh2YWx1ZSkpIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgIGBbZm9vdHByaW50XSBDaXJjdWxhciByZWZlcmVuY2UgZGV0ZWN0ZWQgaW4gdXBkYXRlVmFsdWUoJyR7ZXZlbnRLZXl9JykuIGAgK1xuICAgICAgICAgICAgJ0NvbnNpZGVyIGZsYXR0ZW5pbmcgdGhlIGRhdGEgc3RydWN0dXJlLicsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgdmVyZGljdCA9IHRoaXMuX3N0YWdlQ29udGV4dC51cGRhdGVPYmplY3QocGF0aCwga2V5LCB2YWx1ZSwgZGVzY3JpcHRpb24pO1xuXG4gICAgaWYgKHRoaXMuX3JlY29yZGVycy5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLl9pbnZva2VIb29rKCdvbldyaXRlJywge1xuICAgICAgICBzdGFnZU5hbWU6IHRoaXMuX3N0YWdlTmFtZSxcbiAgICAgICAgc3RhZ2VJZDogdGhpcy5fc3RhZ2VDb250ZXh0LnN0YWdlSWQsXG4gICAgICAgIHJ1bnRpbWVTdGFnZUlkOiB0aGlzLl9zdGFnZUNvbnRleHQucnVudGltZVN0YWdlSWQsXG4gICAgICAgIHBpcGVsaW5lSWQ6IHRoaXMuX3N0YWdlQ29udGV4dC5ydW5JZCxcbiAgICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxuICAgICAgICBrZXk6IGV2ZW50S2V5LFxuICAgICAgICB2YWx1ZTogUmVkYWN0aW9uUnVsZS5hcHBseSh2ZXJkaWN0LCB2YWx1ZSksXG4gICAgICAgIG9wZXJhdGlvbjogJ3VwZGF0ZScsXG4gICAgICAgIHJlZGFjdGVkOiB2ZXJkaWN0LmtpbmQgIT09ICdjbGVhcicgfHwgdW5kZWZpbmVkLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgZGVsZXRlVmFsdWUoa2V5OiBzdHJpbmcsIGRlc2NyaXB0aW9uPzogc3RyaW5nKSB7XG4gICAgYXNzZXJ0Tm90UmVhZG9ubHkodGhpcy5fcmVhZE9ubHlWYWx1ZXMsIGtleSwgJ2RlbGV0ZScpO1xuICAgIHRoaXMuYXNzZXJ0TGl2ZShrZXkpO1xuXG4gICAgLy8gRGVsZXRpbmcgYSBrZXkgY2xlYXJzIGl0cyBwZXItY2FsbCByZWRhY3Rpb24gbWFyayAodGhlIGNvbnRleHQnc1xuICAgIC8vIGZ1bm5lbCBkb2VzIHRoYXQpOyBhIHBvbGljeSB2ZXJkaWN0IG9uIHRoZSBrZXkgc3Vydml2ZXMuXG4gICAgdGhpcy5fc3RhZ2VDb250ZXh0LnNldE9iamVjdChbXSwga2V5LCB1bmRlZmluZWQsIGZhbHNlLCBkZXNjcmlwdGlvbiA/PyBgZGVsZXRlZCAke2tleX1gLCAnZGVsZXRlJyk7XG5cbiAgICBpZiAodGhpcy5fcmVjb3JkZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuX2ludm9rZUhvb2soJ29uV3JpdGUnLCB7XG4gICAgICAgIHN0YWdlTmFtZTogdGhpcy5fc3RhZ2VOYW1lLFxuICAgICAgICBzdGFnZUlkOiB0aGlzLl9zdGFnZUNvbnRleHQuc3RhZ2VJZCxcbiAgICAgICAgcnVudGltZVN0YWdlSWQ6IHRoaXMuX3N0YWdlQ29udGV4dC5ydW50aW1lU3RhZ2VJZCxcbiAgICAgICAgcGlwZWxpbmVJZDogdGhpcy5fc3RhZ2VDb250ZXh0LnJ1bklkLFxuICAgICAgICB0aW1lc3RhbXA6IERhdGUubm93KCksXG4gICAgICAgIGtleSxcbiAgICAgICAgdmFsdWU6IHVuZGVmaW5lZCxcbiAgICAgICAgb3BlcmF0aW9uOiAnZGVsZXRlJyxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgc2V0R2xvYmFsKGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93biwgZGVzY3JpcHRpb24/OiBzdHJpbmcpIHtcbiAgICB0aGlzLmFzc2VydExpdmUoa2V5KTtcbiAgICByZXR1cm4gdGhpcy5fc3RhZ2VDb250ZXh0LnNldEdsb2JhbD8uKGtleSwgdmFsdWUsIGRlc2NyaXB0aW9uKTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgZ2V0R2xvYmFsKGtleTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuX3N0YWdlQ29udGV4dC5nZXRHbG9iYWw/LihrZXkpO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBzZXRPYmplY3RJblJvb3Qoa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKSB7XG4gICAgdGhpcy5hc3NlcnRMaXZlKGtleSk7XG4gICAgcmV0dXJuIHRoaXMuX3N0YWdlQ29udGV4dC5zZXRSb290Py4oa2V5LCB2YWx1ZSk7XG4gIH1cblxuICAvLyDilIDilIAgUmVhZC1vbmx5ICsgbWlzYyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgcmVhZG9ubHkgaW5wdXQgdmFsdWVzIHBhc3NlZCB0byB0aGlzIHBpcGVsaW5lLCBjYXN0IHRvIGBUYC5cbiAgICogT3JkaW5hcnkgbXV0YWJsZSByZWNvcmRzL2FycmF5cyBhcmUgY29waWVkIGFuZCBmcm96ZW4sIG5vdCBmcm96ZW4gaW4gcGxhY2UuXG4gICAqIE9wYXF1ZSBjYXBhYmlsaXRpZXMgYW5kIGV4cGxpY2l0bHkgZnJvemVuIHdyYXBwZXJzIHJlbWFpbiBib3Jyb3dlZC9saXZlO1xuICAgKiBzZWUgYHByb3RlY3Rpb24vcmVhZG9ubHlJbnB1dC50cyDCtyBjcmVhdGVGcm96ZW5BcmdzYCBmb3IgdGhlIG93bmVyc2hpcCBydWxlLlxuICAgKiBDYWNoZWQgYXQgY29uc3RydWN0aW9uIHRpbWUgZm9yIHplcm8tYWxsb2NhdGlvbiByZXBlYXRlZCBhY2Nlc3MuXG4gICAqXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgeyBhcHBsaWNhbnROYW1lLCBpbmNvbWUgfSA9IHNjb3BlLmdldEFyZ3M8eyBhcHBsaWNhbnROYW1lOiBzdHJpbmc7IGluY29tZTogbnVtYmVyIH0+KCk7XG4gICAqIGBgYFxuICAgKlxuICAgKiBSRkMtMDAzIEQyOiBhcmdzIGFyZSB1bnRyYWNrZWQgQlkgREVTSUdOLCBzbyBjYWxsaW5nIHRoaXMgKHdpdGggYWN0dWFsXG4gICAqIGlucHV0IHByZXNlbnQpIG1hcmtzIHRoZSBzdGFnZSdzIGNvbW1pdCB3aXRoIGB1bnRyYWNrZWRTb3VyY2VzOiBbJ2FyZ3MnXWBcbiAgICog4oCUIHRlbGxpbmcgY2F1c2FsLXNsaWNlIGNvbnN1bWVycyB0aGUgYmFja3dhcmQgc2xpY2UgbWF5IGJlIGluY29tcGxldGVcbiAgICogaGVyZS4gQW4gZW1wdHktYXJncyByZWFkIGNhcnJpZXMgbm8gaW5mb3JtYXRpb24gYW5kIGlzIG5vdCBmbGFnZ2VkLlxuICAgKi9cbiAgZ2V0QXJnczxUID0gUmVjb3JkPHN0cmluZywgdW5rbm93bj4+KCk6IFQge1xuICAgIHRoaXMucmVmdXNlSWZBdHRlbXB0RW5kZWQoJyRhcmdzJyk7XG4gICAgaWYgKHRoaXMuX2hhc0FyZ3MpIHRoaXMuX3N0YWdlQ29udGV4dC5tYXJrVW50cmFja2VkU291cmNlKCdhcmdzJyk7XG4gICAgcmV0dXJuIHRoaXMuX2Zyb3plbkFyZ3MgYXMgVDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBleGVjdXRpb24gZW52aXJvbm1lbnQg4oCUIHJlYWQtb25seSBpbmZyYXN0cnVjdHVyZSB2YWx1ZXNcbiAgICogdGhhdCBwcm9wYWdhdGUgdGhyb3VnaCBuZXN0ZWQgZXhlY3V0b3JzIChsaWtlIGBwcm9jZXNzLmVudmAgZm9yIGZsb3djaGFydHMpLlxuICAgKlxuICAgKiBDb250YWluczogc2lnbmFsIChhYm9ydCDigJQgdGhlIHJ1bidzIG9uZSBlZmZlY3RpdmUgc2lnbmFsKSwgdGltZW91dE1zLCB0cmFjZUlkLCBvcGVyYXRpb25JZCwgdHJhY2VwYXJlbnQsXG4gICAqIGRlYWRsaW5lIChlcG9jaCBtcykg4oCUIHRoZSBydW4ncyBlbnYgYXMgYWRtaXR0ZWQgKGBhdHRlbXB0L2NvcnJlbGF0aW9uLnRzIMK3IGFkbWl0UnVuRW52YDogb25lIG93bi1maWVsZFxuICAgKiBzbmFwc2hvdDsgYHRyYWNlcGFyZW50YCBpcyB0aGUgY2Fub25pY2FsIGhlYWRlciB0aGUgcnVuJ3MgY29ycmVsYXRpb24gY2FycmllcywgbmV2ZXIgdGhlIHJlY2VpdmVkIGJ5dGVzKSwgdGhlblxuICAgKiBhcm1lZCAoYHJ1bm5lci9kZWFkbGluZS50cyDCtyBhcm1SdW5gKS4gRnJvemVuIGF0IGNvbnN0cnVjdGlvbiB0aW1lLiBJbmhlcml0ZWQgYnkgc3ViZmxvd3MgYXV0b21hdGljYWxseS5cbiAgICpcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCB7IHNpZ25hbCwgdHJhY2VJZCB9ID0gc2NvcGUuZ2V0RW52KCk7XG4gICAqIGBgYFxuICAgKlxuICAgKiBSRkMtMDAzIEQyOiBlbnYgaXMgdW50cmFja2VkIEJZIERFU0lHTiwgc28gY2FsbGluZyB0aGlzICh3aXRoIGFcbiAgICogbm9uLWVtcHR5IGVudmlyb25tZW50KSBtYXJrcyB0aGUgc3RhZ2UncyBjb21taXQgd2l0aFxuICAgKiBgdW50cmFja2VkU291cmNlczogWydlbnYnXWAg4oCUIHNlZSB7QGxpbmsgZ2V0QXJnc30uXG4gICAqL1xuICBnZXRFbnYoKTogUmVhZG9ubHk8RXhlY3V0aW9uRW52PiB7XG4gICAgdGhpcy5yZWZ1c2VJZkF0dGVtcHRFbmRlZCgnJGVudicpO1xuICAgIGlmICh0aGlzLl9oYXNFbnYpIHRoaXMuX3N0YWdlQ29udGV4dC5tYXJrVW50cmFja2VkU291cmNlKCdlbnYnKTtcbiAgICByZXR1cm4gdGhpcy5fZXhlY3V0aW9uRW52O1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBnZXRQaXBlbGluZUlkKCkge1xuICAgIHJldHVybiB0aGlzLl9zdGFnZUNvbnRleHQucnVuSWQ7XG4gIH1cblxuICAvLyDilIDilIAgSW50ZXJuYWwg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgcHJpdmF0ZSBfaW52b2tlSG9vazxLIGV4dGVuZHMgU2NvcGVIb29rTmFtZT4oaG9vazogSywgZXZlbnQ6IEhvb2tQYXlsb2FkPEs+KTogdm9pZCB7XG4gICAgLy8gVGhlIG9uZSBwZXItcmVjb3JkZXIgbG9vcCAoYHJlY29yZGVyL2hvb2tzLnRzIMK3IGZpcmVgKSDigJQgdGhlIFNBTUUgaW52b2tlIHByaW1pdGl2ZSB0aGVcbiAgICAvLyBkZWZlcnJlZCB0aWVyIHVzZXMgYXQgZGVsaXZlcnkgdGltZSwgc28gdGhlIGlubGluZSBhbmQgZGVmZXJyZWQgcGF0aHMgY2Fubm90IGRyaWZ0LlxuICAgIGZpcmUodGhpcy5fcmVjb3JkZXJzLCBob29rLCB0aGlzLl9jb3JyZWxhdGVkKGV2ZW50IGFzIG9iamVjdCkgYXMgSG9va1BheWxvYWQ8Sz4sIHRoaXMuX3JvdXRlRmFpbHVyZSk7XG4gIH1cblxuICAvKiogVGhlIGV2ZW50IGFzIGZpcmVkOiB1bmNoYW5nZWQgd2l0aG91dCBhIGNvcnJlbGF0aW9uLCBlbHNlIHdpdGggdGhlIHJ1bidzIGNvcnJlbGF0aW9uIGFzIGl0cyBsYXN0IGtleS4gKi9cbiAgcHJpdmF0ZSBfY29ycmVsYXRlZDxFIGV4dGVuZHMgb2JqZWN0PihldmVudDogRSk6IEUge1xuICAgIHJldHVybiB0aGlzLl9jb3JyZWxhdGlvbiA9PT0gdW5kZWZpbmVkID8gZXZlbnQgOiB7IC4uLmV2ZW50LCBjb3JyZWxhdGlvbjogdGhpcy5fY29ycmVsYXRpb24gfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgc2NvcGUgY2hhbm5lbCdzIGlzb2xhdGlvbjogYSByZWNvcmRlcidzIHRocm93IGJlY29tZXMgYW4gYG9uRXJyb3JgIG9uIGV2ZXJ5IHJlY29yZGVyXG4gICAqIChzdGFtcGVkIHdpdGggdGhpcyBzdGFnZSksIGFuZCBhIHRocm93IGZyb20gYG9uRXJyb3JgIGl0c2VsZiBpcyBkcm9wcGVkLlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBfcm91dGVGYWlsdXJlOiBIb29rRmFpbHVyZSA9IChlcnJvciwgX3JlY29yZGVyLCBob29rKSA9PiB7XG4gICAgaWYgKGhvb2sgPT09ICdvbkVycm9yJykgcmV0dXJuO1xuICAgIHRoaXMuX2ludm9rZUhvb2soXG4gICAgICAnb25FcnJvcicsXG4gICAgICByZWNvcmRlckZhaWx1cmVFdmVudChcbiAgICAgICAge1xuICAgICAgICAgIHN0YWdlTmFtZTogdGhpcy5fc3RhZ2VOYW1lLFxuICAgICAgICAgIHN0YWdlSWQ6IHRoaXMuX3N0YWdlQ29udGV4dC5zdGFnZUlkLFxuICAgICAgICAgIHJ1bnRpbWVTdGFnZUlkOiB0aGlzLl9zdGFnZUNvbnRleHQucnVudGltZVN0YWdlSWQsXG4gICAgICAgICAgcGlwZWxpbmVJZDogdGhpcy5fc3RhZ2VDb250ZXh0LnJ1bklkLFxuICAgICAgICB9LFxuICAgICAgICBlcnJvcixcbiAgICAgICAgaG9vayxcbiAgICAgICksXG4gICAgKTtcbiAgfTtcbn1cblxuLyoqIFRoZSBzaWduYWwgb2YgYSBzdGFnZSBvdXRzaWRlIHRoZSBydW5uZXIgaW4gYSBydW4gd2l0aCBubyBzaWduYWw6IG9uZSB0aGF0IG5ldmVyIGFib3J0cywgc2hhcmVkLiAqL1xuY29uc3QgTkVWRVJfQUJPUlRFRDogQWJvcnRTaWduYWwgPSBuZXcgQWJvcnRDb250cm9sbGVyKCkuc2lnbmFsO1xuXG4vKiogVGhlIG5hbWUgYSBsYXRlIGRldGFjaCBpcyByZWNvcmRlZCB1bmRlcjogdGhlIGNoaWxkIGNoYXJ0J3Mgcm9vdCBpZCDigJQgYSBuYW1lLCBuZXZlciBpdHMgaW5wdXQuICovXG5mdW5jdGlvbiBkZXRhY2hLZXkoY2hpbGQ6IEZsb3dDaGFydCk6IHN0cmluZyB7XG4gIGNvbnN0IGlkID0gKGNoaWxkIGFzIHsgcm9vdD86IHsgaWQ/OiB1bmtub3duIH0gfSB8IHVuZGVmaW5lZCk/LnJvb3Q/LmlkO1xuICByZXR1cm4gdHlwZW9mIGlkID09PSAnc3RyaW5nJyA/IGBkZXRhY2g6JHtpZH1gIDogJ2RldGFjaCc7XG59XG4iXX0=
930
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2NvcGVGYWNhZGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3Njb3BlL1Njb3BlRmFjYWRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7Ozs7Ozs7R0FjRzs7O0FBRUgseUNBQThDO0FBRTlDLGdEQUF5RDtBQUN6RCxvREFBbUQ7QUFDbkQsZ0RBQXNEO0FBQ3RELHdEQUFnRztBQUNoRyxvREFBdUU7QUFDdkUsd0VBQW1FO0FBQ25FLG9EQUFxRDtBQVdyRCx3REFBOEQ7QUFDOUQsaURBRzRCO0FBRTVCLDhDQUEwQztBQUUxQyx1RUFBcUY7QUFDckYseURBQThEO0FBRzlELG1EQUFrRTtBQUNsRSxvRUFBb0Y7QUFDcEYsNkNBQWlGO0FBR2pGLE1BQWEsV0FBVztJQUNmLE1BQU0sQ0FBVSxLQUFLLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0lBRTVEOzs7O09BSUc7SUFDSyxNQUFNLENBQVUsbUJBQW1CLEdBQXNCLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7SUFFekUsYUFBYSxDQUFlO0lBQzVCLFVBQVUsQ0FBUztJQUNWLGVBQWUsQ0FBVztJQUU3QywrRUFBK0U7SUFDOUQsV0FBVyxDQUEwQjtJQUV0RCx5RUFBeUU7SUFDeEQsYUFBYSxDQUF5QjtJQUV2RDtvRUFDZ0U7SUFDL0MsUUFBUSxDQUFVO0lBRW5DLCtEQUErRDtJQUM5QyxPQUFPLENBQVU7SUFFbEM7Ozs7OztPQU1HO0lBQ2MsZ0JBQWdCLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztJQUU5QyxVQUFVLEdBQW9CLEVBQUUsQ0FBQztJQUV6Qzs7Ozs7Ozs7OztPQVVHO0lBQ0ssVUFBVSxHQUFHLEtBQUssQ0FBQztJQUUzQjs7OztPQUlHO0lBQ0ssVUFBVSxDQUFpQjtJQUVuQzs7OztPQUlHO0lBQ0ssWUFBWSxDQUFrQjtJQUV0Qzs7Ozs7Ozs7T0FRRztJQUNjLFFBQVEsQ0FBa0I7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S0FBaUQsRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDO0lBQ3hFLE9BQU8sT0FBTyxFQUFFLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUM7QUFDNUQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogU2NvcGVGYWNhZGUg4oCUIEJhc2UgY2xhc3MgdGhhdCBsaWJyYXJ5IGNvbnN1bWVycyBleHRlbmQgdG8gY3JlYXRlIGN1c3RvbSBzY29wZSBjbGFzc2VzXG4gKlxuICogV3JhcHMgU3RhZ2VDb250ZXh0IChmcm9tIG1lbW9yeS8pIHRvIHByb3ZpZGUgYSBjb25zdW1lci1mcmllbmRseSBBUEkgZm9yXG4gKiBzdGF0ZSBhY2Nlc3MsIGRlYnVnIGxvZ2dpbmcsIG1ldHJpY3MsIGFuZCByZWNvcmRlciBob29rcy5cbiAqXG4gKiBDb25zdW1lcnMgZXh0ZW5kIHRoaXMgY2xhc3MgdG8gYWRkIGRvbWFpbi1zcGVjaWZpYyBwcm9wZXJ0aWVzOlxuICpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNsYXNzIE15U2NvcGUgZXh0ZW5kcyBTY29wZUZhY2FkZSB7XG4gKiAgIGdldCB1c2VyTmFtZSgpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5nZXRWYWx1ZSgnbmFtZScpIGFzIHN0cmluZzsgfVxuICogICBzZXQgdXNlck5hbWUodmFsdWU6IHN0cmluZykgeyB0aGlzLnNldFZhbHVlKCduYW1lJywgdmFsdWUpOyB9XG4gKiB9XG4gKiBgYGBcbiAqL1xuXG5pbXBvcnQgeyBzdWJmbG93U2VnbWVudHNPZiB9IGZyb20gJ2Zvb3R0cmFjZSc7XG5cbmltcG9ydCB7IGNhbGxTZXJpZXMsIHJ1bkNhbGwgfSBmcm9tICcuLi9hdHRlbXB0L2NhbGwuanMnO1xuaW1wb3J0IHsgY2FsbFRvdWNoZXMgfSBmcm9tICcuLi9hdHRlbXB0L2VmZmVjdC5qcyc7XG5pbXBvcnQgeyBhZG1pdEF0dGVtcHROYW1lIH0gZnJvbSAnLi4vYXR0ZW1wdC9uYW1lLmpzJztcbmltcG9ydCB7IG9ic2VydmVkUmVjb3JkLCBPYnNlcnZlZFNlcmllc0Jvb2ssIHJlYWRPYnNlcnZlZFJlcG9ydCB9IGZyb20gJy4uL2F0dGVtcHQvb2JzZXJ2ZWQuanMnO1xuaW1wb3J0IHsgYWRtaXRDYWxsUG9saWN5LCBhdHRlbXB0Q2VpbGluZyB9IGZyb20gJy4uL2F0dGVtcHQvcG9saWN5LmpzJztcbmltcG9ydCB7IHRha2VSZXRyeUxvb3BDYWxsIH0gZnJvbSAnLi4vYXR0ZW1wdC9yZXRyeUxvb3BDb250ZXh0LmpzJztcbmltcG9ydCB7IGF0dGVtcHRFbmRzQXQgfSBmcm9tICcuLi9hdHRlbXB0L3J1bm5lci5qcyc7XG5pbXBvcnQgdHlwZSB7XG4gIEF0dGVtcHRDb250ZXh0LFxuICBBdHRlbXB0RXJyb3IsXG4gIENhbGxPcHRpb25zLFxuICBMYXRlV3JpdGUsXG4gIE9ic2VydmVkQXR0ZW1wdCxcbiAgUmV0cnlQb2xpY3ksXG4gIFJ1bkNvcnJlbGF0aW9uLFxufSBmcm9tICcuLi9hdHRlbXB0L3R5cGVzLmpzJztcbmltcG9ydCB0eXBlIHsgRmxvd0NoYXJ0IH0gZnJvbSAnLi4vYnVpbGRlci90eXBlcy5qcyc7XG5pbXBvcnQgeyBoYXNDaXJjdWxhclJlZmVyZW5jZSB9IGZyb20gJy4uL2NhcHR1cmUvY2lyY3VsYXIuanMnO1xuaW1wb3J0IHtcbiAgZGV0YWNoQW5kRm9yZ2V0IGFzIGRldGFjaEFuZEZvcmdldFNwYXduLFxuICBkZXRhY2hBbmRKb2luTGF0ZXIgYXMgZGV0YWNoQW5kSm9pbkxhdGVyU3Bhd24sXG59IGZyb20gJy4uL2RldGFjaC9zcGF3bi5qcyc7XG5pbXBvcnQgdHlwZSB7IERldGFjaERyaXZlciwgRGV0YWNoSGFuZGxlIH0gZnJvbSAnLi4vZGV0YWNoL3R5cGVzLmpzJztcbmltcG9ydCB7IGlzRGV2TW9kZSB9IGZyb20gJy4uL2Rldk1vZGUuanMnO1xuaW1wb3J0IHR5cGUgeyBFeGVjdXRpb25FbnYgfSBmcm9tICcuLi9lbmdpbmUvdHlwZXMuanMnO1xuaW1wb3J0IHsgZGVhZEZyYW1lTWVzc2FnZSwgbGF0ZUF0dGVtcHRNZXNzYWdlIH0gZnJvbSAnLi4vbWVtb3J5L2JvcnJvd2VkTXV0YXRpb24uanMnO1xuaW1wb3J0IHsgQ0xFQVIsIFJlZGFjdGlvblJ1bGUgfSBmcm9tICcuLi9tZW1vcnkvcmVkYWN0aW9uLmpzJztcbmltcG9ydCB7IFN0YWdlQ29udGV4dCB9IGZyb20gJy4uL21lbW9yeS9TdGFnZUNvbnRleHQuanMnO1xuaW1wb3J0IHR5cGUgeyBIb29rRmFpbHVyZSwgSG9va1BheWxvYWQsIFNjb3BlSG9va05hbWUgfSBmcm9tICcuLi9yZWNvcmRlci9ob29rcy5qcyc7XG5pbXBvcnQgeyBmaXJlLCByZWNvcmRlckZhaWx1cmVFdmVudCB9IGZyb20gJy4uL3JlY29yZGVyL2hvb2tzLmpzJztcbmltcG9ydCB7IGFzc2VydE5vdFJlYWRvbmx5LCBjcmVhdGVGcm96ZW5BcmdzIH0gZnJvbSAnLi9wcm90ZWN0aW9uL3JlYWRvbmx5SW5wdXQuanMnO1xuaW1wb3J0IHsgcmVnaXN0ZXJOYXRpdmVDYXB0dXJlVGFyZ2V0LCByZWdpc3RlclNjb3BlUnVudGltZSB9IGZyb20gJy4vcnVudGltZS5qcyc7XG5pbXBvcnQgdHlwZSB7IENvbW1pdEV2ZW50LCBSZWRhY3Rpb25Qb2xpY3ksIFJlZGFjdGlvblJlcG9ydCwgU2NvcGVSZWNvcmRlciB9IGZyb20gJy4vdHlwZXMuanMnO1xuXG5leHBvcnQgY2xhc3MgU2NvcGVGYWNhZGUge1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEJSQU5EID0gU3ltYm9sLmZvcignU2NvcGVGYWNhZGVAdjEnKTtcblxuICAvKipcbiAgICogU2hhcmVkIHNlbnRpbmVsIHJldHVybmVkIGJ5IGBfZ2V0U3ViZmxvd1BhdGgoKWAgZm9yIHJvb3QtbGV2ZWwgc3RhZ2VzXG4gICAqIChubyBzdWJmbG93IG5lc3RpbmcpLiBBdm9pZHMgcGVyLWNhbGwgYWxsb2NhdGlvbiBvZiBhIGZyZXNoXG4gICAqIGBPYmplY3QuZnJlZXplKFtdKWAgb24gZXZlcnkgYGVtaXRFdmVudGAgaW4gdGhlIGNvbW1vbiBuby1zdWJmbG93IGNhc2UuXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBfRU1QVFlfU1VCRkxPV19QQVRIOiByZWFkb25seSBzdHJpbmdbXSA9IE9iamVjdC5mcmVlemUoW10pO1xuXG4gIHByb3RlY3RlZCBfc3RhZ2VDb250ZXh0OiBTdGFnZUNvbnRleHQ7XG4gIHByb3RlY3RlZCBfc3RhZ2VOYW1lOiBzdHJpbmc7XG4gIHByb3RlY3RlZCByZWFkb25seSBfcmVhZE9ubHlWYWx1ZXM/OiB1bmtub3duO1xuXG4gIC8qKiBDYWNoZWQgZGVlcGx5LWZyb3plbiBjb3B5IG9mIHJlYWRPbmx5VmFsdWVzIGZvciBnZXRBcmdzKCkuIENyZWF0ZWQgb25jZS4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBfZnJvemVuQXJnczogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cbiAgLyoqIEV4ZWN1dGlvbiBlbnZpcm9ubWVudCDigJQgcmVhZC1vbmx5LCBpbmhlcml0ZWQgZnJvbSBwYXJlbnQgZXhlY3V0b3IuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgX2V4ZWN1dGlvbkVudjogUmVhZG9ubHk8RXhlY3V0aW9uRW52PjtcblxuICAvKiogUkZDLTAwMyBEMjogdHJ1ZSB3aGVuIGBnZXRBcmdzKClgIGNhbiByZXR1cm4gYWN0dWFsIGRhdGEg4oCUIGFuIGVtcHR5XG4gICAqICBge31gIHJlYWQgY2FycmllcyBubyBpbmZvcm1hdGlvbiwgc28gaXQgaXMgbmV2ZXIgZmxhZ2dlZC4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBfaGFzQXJnczogYm9vbGVhbjtcblxuICAvKiogUkZDLTAwMyBEMjogdHJ1ZSB3aGVuIGBnZXRFbnYoKWAgY2FuIHJldHVybiBhY3R1YWwgZGF0YS4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBfaGFzRW52OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBSRkMtMDAzIEQyOiBrZXlzIHRoaXMgc3RhZ2UgaGFzIFRSQUNLRUQtcmVhZCAodmlhIGBnZXRWYWx1ZShrZXkpYCkuXG4gICAqIEEgc2lsZW50IHJlYWQgb2YgYSBrZXkgaW4gdGhpcyBzZXQgaXMgU0hBRE9XRUQg4oCUIGl0cyByZWFk4oaSd3JpdGUgZWRnZSBpc1xuICAgKiBhbHJlYWR5IGNhcHR1cmVkLCBzbyBpdCBpcyBub3QgZmxhZ2dlZCBhcyBhbiB1bnRyYWNrZWQgc291cmNlLiBUaGlzIGlzXG4gICAqIHdoYXQga2VlcHMgVHlwZWRTY29wZSBhcnJheS1wcm94eSBpbnRlcm5hbHMgKHdoaWNoIGFsd2F5cyBmb2xsb3cgYVxuICAgKiB0cmFja2VkIHByb3BlcnR5IHJlYWQpIGFuZCBgJGJhdGNoQXJyYXlgIGhvbmVzdC1idXQtcXVpZXQuXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IF90cmFja2VkUmVhZEtleXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICBwcml2YXRlIF9yZWNvcmRlcnM6IFNjb3BlUmVjb3JkZXJbXSA9IFtdO1xuXG4gIC8qKlxuICAgKiBTZXQgYnkgdGhlIGNvbW1pdCBvYnNlcnZlcjogdGhpcyBzdGFnZSdzIGZyYW1lIGhhcyBmbHVzaGVkLiBBIGZhY2FkZSBpc1xuICAgKiBPTkUgc3RhZ2UgZXhlY3V0aW9uJ3MgaGFuZGxlIOKAlCB0aGUgZW5naW5lIGJ1aWxkcyBhIGZyZXNoIG9uZSBwZXIgc3RhZ2Ug4oCUXG4gICAqIGFuZCBldmVyeSBwcm94eSB0aGUgdHlwZWQgc2NvcGUgaGFuZHMgb3V0IGlzIGJvdW5kIHRvIGl0LiBBIHdyaXRlIGFycml2aW5nXG4gICAqIGFmdGVyIHRoZSBjb21taXQgY29tZXMgZnJvbSBhIGhhbmRsZSBoZWxkIHBhc3QgaXRzIHN0YWdlIChhIGNsb3N1cmUsIGFcbiAgICogbW9kdWxlLWxldmVsIGBsZXRgKSBhbmQgd291bGQgbGFuZCBpbiBhIGJ1ZmZlciBub3RoaW5nIGV2ZXIgY29tbWl0czogbm9cbiAgICogdHJhY2Ugcm93LCBzdGF0ZSB1bmNoYW5nZWQuIFNvIGl0IGlzIHJlZnVzZWQgKHtAbGluayBhc3NlcnRMaXZlfSkgaW5zdGVhZFxuICAgKiBvZiBsb3N0LiBTZWFsaW5nIGhlcmUgYW5kIG5vdCBvbiBgU3RhZ2VDb250ZXh0YCBpcyBkZWxpYmVyYXRlOiB0aGUgZnJhbWVcbiAgICogc3RheXMgcmUtdXNhYmxlIGFmdGVyIGNvbW1pdCBieSBkZXNpZ24gKCMxM2Ig4oCUIHRoZSBlbmdpbmUncyBkb3VibGUtY29tbWl0XG4gICAqIHBhdGhzIGFuZCB0aGUgc3ViZmxvdyBtZXJnZS1iYWNrIGludG8gYSBicmFuY2ggcGFyZW50IG5lZWQgaXQpLlxuICAgKi9cbiAgcHJpdmF0ZSBfY29tbWl0dGVkID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIEEgcnVsZSBvZiB0aGlzIGZhY2FkZSdzIG93biDigJQgT05MWSB3aGVuIGl0cyBjb250ZXh0IGNhcnJpZXMgbm9uZSAoYmFyZVxuICAgKiBjb250ZXh0cyBpbiB1bml0IHRlc3RzKS4gVW5kZXIgYW4gZXhlY3V0b3IgdGhlIHJ1bGUgbGl2ZXMgb24gdGhlIGNvbnRleHRcbiAgICogdHJlZSBhbmQgdGhpcyBzdGF5cyB1bnNldDsgc2VlIHtAbGluayBydWxlfS5cbiAgICovXG4gIHByaXZhdGUgX2xvY2FsUnVsZT86IFJlZGFjdGlvblJ1bGU7XG5cbiAgLyoqXG4gICAqIFRoZSBydW4ncyBjb3JyZWxhdGlvbiAoMTAuMSksIGluc3RhbGxlZCBieSB0aGUgZXhlY3V0b3IncyBjb21wb3NlZCBzY29wZSBmYWN0b3J5XG4gICAqIChgUnVuT2JzZXJ2ZXJzIMK3IGNvbXBvc2VTY29wZUZhY3RvcnlgKSDigJQgc3RhbXBlZCBMQVNUIG9uIGV2ZXJ5IHNjb3BlIGFuZCBlbWl0IGV2ZW50IHRoaXMgZmFjYWRlIGZpcmVzLFxuICAgKiBvbmx5IHdoZW4gcHJlc2VudCwgc28gYSBydW4gd2l0aG91dCBvbmUgZmlyZXMgYnl0ZS1pZGVudGljYWwgZXZlbnRzLlxuICAgKi9cbiAgcHJpdmF0ZSBfY29ycmVsYXRpb24/OiBSdW5Db3JyZWxhdGlvbjtcblxuICAvKipcbiAgICogVGhlIGF0dGVtcHQgdGhpcyBmYWNhZGUgd2FzIGJ1aWx0IGZvciAoUDFiKSDigJQgdGhlIHJ1bm5lcidzLCByZWFkIG9mZiB0aGVcbiAgICogY29udGV4dCBhdCBjb25zdHJ1Y3Rpb24uIEEgZmFjYWRlIGlzIE9ORSBhdHRlbXB0J3MgaGFuZGxlOiBvbmNlIHRoYXRcbiAgICogYXR0ZW1wdCBlbmRzIHdpdGhvdXQgYW4gYW5zd2VyIChpdHMgY2FwLCB0aGUgZGVhZGxpbmUsIGEgY2FuY2VsbGF0aW9uLCBhXG4gICAqIHRocm93KSwgdGhlIGZ1bmN0aW9uIGJlaGluZCBpdCBtYXkgc3RpbGwgYmUgcnVubmluZywgYW5kIGFueXRoaW5nIGl0XG4gICAqIHRvdWNoZXMgdGhyb3VnaCB0aGlzIGZhY2FkZSBpcyByZWZ1c2VkICh7QGxpbmsgcmVmdXNlSWZBdHRlbXB0RW5kZWR9KSDigJRcbiAgICogYSB3cml0ZSBvciBhbiBlbWl0IGlzIGFsc28gcmVjb3JkZWQgb24gdGhlIHN0YWdlLiBBYnNlbnQgZm9yIGEgc3RhZ2UgdGhlXG4gICAqIHJ1bm5lciBkb2VzIG5vdCBydW46IG5vdGhpbmcgaXMgZmVuY2VkLCBhcyBiZWZvcmUuXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IF9hdHRlbXB0PzogQXR0ZW1wdENvbnRleHQ7XG5cbiAgLyoqIFRoZSBydW4ncyBzaWduYWwsIGZvciBgJGF0dGVtcHQoKWAgb2YgYSBzdGFnZSB0aGUgcnVubmVyIGRvZXMgbm90IHJ1bi4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBfcnVuU2lnbmFsPzogQWJvcnRTaWduYWw7XG5cbiAgLyoqIGAkY2FsbGBzIHdpdGggYG9mID4gMWAgaW4gZmxpZ2h0IHRocm91Z2ggdGhpcyBmYWNhZGUg4oCUIGEga2V5bGVzcyB0b3VjaGluZyBjYWxsIGluc2lkZSBvbmUgaXMgcmVmdXNlZCAoUDMpLiAqL1xuICBwcml2YXRlIF9yZXRyeWluZ0NhbGxzID0gMDtcblxuICAvKiogVGhpcyBhdHRlbXB0J3Mgb2JzZXJ2ZWQgcmVwb3J0cywgZ3JvdXBlZCBpbnRvIHNlcmllcyAoUDIpIOKAlCBtYWRlIG9uIHRoZSBmaXJzdCByZXBvcnQuICovXG4gIHByaXZhdGUgX29ic2VydmVkQm9vaz86IE9ic2VydmVkU2VyaWVzQm9vaztcblxuICBjb25zdHJ1Y3Rvcihjb250ZXh0OiBTdGFnZUNvbnRleHQsIHN0YWdlTmFtZTogc3RyaW5nLCByZWFkT25seVZhbHVlcz86IHVua25vd24sIGV4ZWN1dGlvbkVudj86IEV4ZWN1dGlvbkVudikge1xuICAgIHRoaXMuX3N0YWdlQ29udGV4dCA9IGNvbnRleHQ7XG4gICAgdGhpcy5fc3RhZ2VOYW1lID0gc3RhZ2VOYW1lO1xuICAgIHRoaXMuX3JlYWRPbmx5VmFsdWVzID0gcmVhZE9ubHlWYWx1ZXM7XG4gICAgdGhpcy5fZnJvemVuQXJncyA9IGNyZWF0ZUZyb3plbkFyZ3MocmVhZE9ubHlWYWx1ZXMpO1xuICAgIHRoaXMuX2V4ZWN1dGlvbkVudiA9IE9iamVjdC5mcmVlemUoeyAuLi5leGVjdXRpb25FbnYgfSk7XG4gICAgdGhpcy5faGFzQXJncyA9IE9iamVjdC5rZXlzKHRoaXMuX2Zyb3plbkFyZ3MpLmxlbmd0aCA+IDA7XG4gICAgdGhpcy5faGFzRW52ID0gT2JqZWN0LmtleXModGhpcy5fZXhlY3V0aW9uRW52KS5sZW5ndGggPiAwO1xuICAgIHRoaXMuX2F0dGVtcHQgPSBjb250ZXh0LmF0dGVtcHQ7XG4gICAgdGhpcy5fcnVuU2lnbmFsID0gY29udGV4dC5ydW5TaWduYWw7XG4gICAgLy8gVGhlIGNvbnRleHQgbXVzdCBjYXJyeSB0aGUgcnVsZSBCRUZPUkUgdGhlIGZpcnN0IHdyaXRlLCBzaW5jZSB0aGVcbiAgICAvLyBjb250ZXh0J3Mgd3JpdGUgZnVubmVsIGlzIHdoYXQgbWFya3MgYSBwZXItY2FsbCByZWRhY3RlZCBrZXkgb24gaXQuXG4gICAgLy8gVW5kZXIgYW4gZXhlY3V0b3IgdGhlIGNvbnRleHQgYWxyZWFkeSBoYXMgdGhlIHJ1bidzIHJ1bGUgKGluc3RhbGxlZCBvblxuICAgIC8vIHRoZSByb290LCBpbmhlcml0ZWQgZG93bikgYW5kIHRoaXMgcmUtaW5zdGFsbHMgdGhlIHNhbWUgb2JqZWN0OyBvbiBhXG4gICAgLy8gYmFyZSBjb250ZXh0IGl0IGluc3RhbGxzIGEgZnJlc2ggb25lLlxuICAgIHRoaXMuX3N0YWdlQ29udGV4dC51c2VSZWRhY3Rpb25SdWxlKHRoaXMucnVsZSk7XG5cbiAgICAvLyBSZWdpc3RlciBhcyBjb21taXQgb2JzZXJ2ZXIgc28gU2NvcGVSZWNvcmRlci5vbkNvbW1pdCBmaXJlcyB3aGVuIFN0YWdlQ29udGV4dC5jb21taXQoKSBpcyBjYWxsZWRcbiAgICB0aGlzLl9zdGFnZUNvbnRleHQuc2V0Q29tbWl0T2JzZXJ2ZXIoKG11dGF0aW9ucykgPT4ge1xuICAgICAgdGhpcy5fb25Db21taXRGaXJlZChtdXRhdGlvbnMpO1xuICAgIH0pO1xuICAgIHJlZ2lzdGVyU2NvcGVSdW50aW1lKHRoaXMsIHsgdGFyZ2V0OiB0aGlzLCBoYW5kbGVzQXNzaWdubWVudHM6IGZhbHNlIH0pO1xuICAgIGlmIChjb250ZXh0LmNhcHR1cmUpIHJlZ2lzdGVyTmF0aXZlQ2FwdHVyZVRhcmdldCh0aGlzLCBjb250ZXh0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgcmVkYWN0aW9uIHJ1bGUgdGhpcyBmYWNhZGUgZGVjaWRlcyB3aXRoIOKAlCB0aGUgU0FNRSBvYmplY3QgaXRzXG4gICAqIGBTdGFnZUNvbnRleHRgIHJldGFpbnMgd2l0aCAoYG1lbW9yeS9yZWRhY3Rpb24udHNgLCB0aGUgb25lIG93bmVyKS4gVW5kZXJcbiAgICogYW4gZXhlY3V0b3IgdGhlIHJ1bGUgaXMgaW5zdGFsbGVkIG9uIHRoZSBydW50aW1lIHJvb3QgYW5kIGluaGVyaXRlZCBieVxuICAgKiBldmVyeSBjb250ZXh0LCBzbyB0aGUgZmFjYWRlIHNpbXBseSByZWFkcyBpdC4gT24gYSBiYXJlIGNvbnRleHQgKHVuaXRcbiAgICogdGVzdHMsIGhhbmQtYnVpbHQgc2NvcGVzKSB0aGUgZmFjYWRlIGNyZWF0ZXMgb25lIGFuZCBpbnN0YWxscyBpdCBvbiB0aGVcbiAgICogY29udGV4dCwgc28gdGhlIGNvbnRleHQncyByZXRlbnRpb24gYW5kIHRoZSBmYWNhZGUncyByZWNvcmRlciB2aWV3c1xuICAgKiBzdGlsbCBzaGFyZSBhIHNpbmdsZSB2ZXJkaWN0LlxuICAgKi9cbiAgcHJpdmF0ZSBnZXQgcnVsZSgpOiBSZWRhY3Rpb25SdWxlIHtcbiAgICBjb25zdCBzaGFyZWQgPSB0aGlzLl9zdGFnZUNvbnRleHQuZ2V0UmVkYWN0aW9uUnVsZSgpO1xuICAgIGlmIChzaGFyZWQpIHJldHVybiBzaGFyZWQ7XG4gICAgaWYgKCF0aGlzLl9sb2NhbFJ1bGUpIHtcbiAgICAgIHRoaXMuX2xvY2FsUnVsZSA9IG5ldyBSZWRhY3Rpb25SdWxlKCk7XG4gICAgICB0aGlzLl9zdGFnZUNvbnRleHQudXNlUmVkYWN0aW9uUnVsZSh0aGlzLl9sb2NhbFJ1bGUpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fbG9jYWxSdWxlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNoYXJlIGEgcmVkYWN0ZWQta2V5cyBzZXQgYWNyb3NzIG11bHRpcGxlIFNjb3BlRmFjYWRlIGluc3RhbmNlcy5cbiAgICogQ2FsbCB0aGlzIHRvIG1ha2UgcmVkYWN0aW9uIHBlcnNpc3QgYWNyb3NzIHN0YWdlcyBpbiB0aGUgc2FtZSBwaXBlbGluZS5cbiAgICogKFVuZGVyIGFuIGV4ZWN1dG9yIHRoZSBydW4ncyBydWxlIGFscmVhZHkgc2hhcmVzIG9uZSBzZXQ7IHRoaXMgY2FsbCBpc1xuICAgKiB0aGVuIGEgbm8tb3AuKVxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHVzZVNoYXJlZFJlZGFjdGVkS2V5cyhzaGFyZWRTZXQ6IFNldDxzdHJpbmc+KTogdm9pZCB7XG4gICAgdGhpcy5ydWxlLnVzZU1hcmtlZEtleXMoc2hhcmVkU2V0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHJlZGFjdGVkLWtleXMgc2V0IChmb3Igc2hhcmluZyB3aXRoIG90aGVyIHNjb3BlcykuXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgZ2V0UmVkYWN0ZWRLZXlzKCk6IFNldDxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5ydWxlLm1hcmtlZEtleXMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBseSBhIGRlY2xhcmF0aXZlIHJlZGFjdGlvbiBwb2xpY3kuIFRoZSBwb2xpY3kgaXMgYWRkaXRpdmUg4oCUXG4gICAqIGl0IHdvcmtzIGFsb25nc2lkZSBtYW51YWwgYHNldFZhbHVlKC4uLiwgdHJ1ZSlgIGNhbGxzLlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHVzZVJlZGFjdGlvblBvbGljeShwb2xpY3k6IFJlZGFjdGlvblBvbGljeSk6IHZvaWQge1xuICAgIHRoaXMucnVsZS5zZXRQb2xpY3kocG9saWN5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnN0YWxsIHRoZSBydW4ncyBjb3JyZWxhdGlvbiDigJQgZXZlcnkgc2NvcGUgYW5kIGVtaXQgZXZlbnQgdGhpcyBmYWNhZGUgZmlyZXMgY2FycmllcyBpdDsgYHVuZGVmaW5lZGAgY2xlYXJzXG4gICAqIGl0LiBFbmdpbmUtb25seSAodGhlIGNvbXBvc2VkIHNjb3BlIGZhY3RvcnkgY2FsbHMgaXQgb25jZSBwZXIgc3RhZ2UpLCBsaWtlIGB1c2VSZWRhY3Rpb25Qb2xpY3lgLlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHVzZUNvcnJlbGF0aW9uKGNvcnJlbGF0aW9uOiBSdW5Db3JyZWxhdGlvbiB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICAgIHRoaXMuX2NvcnJlbGF0aW9uID0gY29ycmVsYXRpb247XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIGdldFJlZGFjdGlvblBvbGljeSgpOiBSZWRhY3Rpb25Qb2xpY3kgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnJ1bGUuZ2V0UG9saWN5KCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIGNvbXBsaWFuY2UtZnJpZW5kbHkgcmVwb3J0IG9mIGFsbCByZWRhY3Rpb24gYWN0aXZpdHkuXG4gICAqIE5ldmVyIGluY2x1ZGVzIGFjdHVhbCB2YWx1ZXMg4oCUIG9ubHkga2V5IG5hbWVzLCBmaWVsZCBuYW1lcywgYW5kIHBhdHRlcm5zLlxuICAgKi9cbiAgZ2V0UmVkYWN0aW9uUmVwb3J0KCk6IFJlZGFjdGlvblJlcG9ydCB7XG4gICAgcmV0dXJuIHRoaXMucnVsZS5yZXBvcnQoKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBTY29wZVJlY29yZGVyIE1hbmFnZW1lbnQg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgYXR0YWNoU2NvcGVSZWNvcmRlcihyZWNvcmRlcjogU2NvcGVSZWNvcmRlcik6IHZvaWQge1xuICAgIC8vIFJlcGxhY2UgZXhpc3RpbmcgcmVjb3JkZXIgd2l0aCBzYW1lIElEIChpZGVtcG90ZW50IOKAlCBwcmV2ZW50cyBkb3VibGUtY291bnRpbmcpXG4gICAgdGhpcy5fcmVjb3JkZXJzID0gdGhpcy5fcmVjb3JkZXJzLmZpbHRlcigocikgPT4gci5pZCAhPT0gcmVjb3JkZXIuaWQpO1xuICAgIHRoaXMuX3JlY29yZGVycy5wdXNoKHJlY29yZGVyKTtcbiAgfVxuXG4gIGRldGFjaFNjb3BlUmVjb3JkZXIocmVjb3JkZXJJZDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5fcmVjb3JkZXJzID0gdGhpcy5fcmVjb3JkZXJzLmZpbHRlcigocikgPT4gci5pZCAhPT0gcmVjb3JkZXJJZCk7XG4gIH1cblxuICBnZXRTY29wZVJlY29yZGVycygpOiBTY29wZVJlY29yZGVyW10ge1xuICAgIHJldHVybiBbLi4udGhpcy5fcmVjb3JkZXJzXTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgbm90aWZ5U3RhZ2VTdGFydCgpOiB2b2lkIHtcbiAgICB0aGlzLl9pbnZva2VIb29rKCdvblN0YWdlU3RhcnQnLCB7XG4gICAgICBzdGFnZU5hbWU6IHRoaXMuX3N0YWdlTmFtZSxcbiAgICAgIHN0YWdlSWQ6IHRoaXMuX3N0YWdlQ29udGV4dC5zdGFnZUlkLFxuICAgICAgcnVudGltZVN0YWdlSWQ6IHRoaXMuX3N0YWdlQ29udGV4dC5ydW50aW1lU3RhZ2VJZCxcbiAgICAgIHBpcGVsaW5lSWQ6IHRoaXMuX3N0YWdlQ29udGV4dC5ydW5JZCxcbiAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgbm90aWZ5U3RhZ2VFbmQoZHVyYXRpb24/OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLl9pbnZva2VIb29rKCdvblN0YWdlRW5kJywge1xuICAgICAgc3RhZ2VOYW1lOiB0aGlzLl9zdGFnZU5hbWUsXG4gICAgICBzdGFnZUlkOiB0aGlzLl9zdGFnZUNvbnRleHQuc3RhZ2VJZCxcbiAgICAgIHJ1bnRpbWVTdGFnZUlkOiB0aGlzLl9zdGFnZUNvbnRleHQucnVudGltZVN0YWdlSWQsXG4gICAgICBwaXBlbGluZUlkOiB0aGlzLl9zdGFnZUNvbnRleHQucnVuSWQsXG4gICAgICB0aW1lc3RhbXA6IERhdGUubm93KCksXG4gICAgICBkdXJhdGlvbixcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgbm90aWZ5UGF1c2UocGF1c2VEYXRhPzogdW5rbm93bik6IHZvaWQge1xuICAgIHRoaXMuX2ludm9rZUhvb2soJ29uUGF1c2UnLCB7XG4gICAgICBzdGFnZU5hbWU6IHRoaXMuX3N0YWdlTmFtZSxcbiAgICAgIHN0YWdlSWQ6IHRoaXMuX3N0YWdlQ29udGV4dC5zdGFnZUlkLFxuICAgICAgcnVudGltZVN0YWdlSWQ6IHRoaXMuX3N0YWdlQ29udGV4dC5ydW50aW1lU3RhZ2VJZCxcbiAgICAgIHBpcGVsaW5lSWQ6IHRoaXMuX3N0YWdlQ29udGV4dC5ydW5JZCxcbiAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgIHBhdXNlRGF0YSxcbiAgICAgIGNoYW5uZWw6ICdzY29wZScgYXMgY29uc3QsXG4gICAgfSk7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIG5vdGlmeVJlc3VtZShoYXNJbnB1dDogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuX2ludm9rZUhvb2soJ29uUmVzdW1lJywge1xuICAgICAgc3RhZ2VOYW1lOiB0aGlzLl9zdGFnZU5hbWUsXG4gICAgICBzdGFnZUlkOiB0aGlzLl9zdGFnZUNvbnRleHQuc3RhZ2VJZCxcbiAgICAgIHJ1bnRpbWVTdGFnZUlkOiB0aGlzLl9zdGFnZUNvbnRleHQucnVudGltZVN0YWdlSWQsXG4gICAgICBwaXBlbGluZUlkOiB0aGlzLl9zdGFnZUNvbnRleHQucnVuSWQsXG4gICAgICB0aW1lc3RhbXA6IERhdGUubm93KCksXG4gICAgICBoYXNJbnB1dCxcbiAgICAgIGNoYW5uZWw6ICdzY29wZScgYXMgY29uc3QsXG4gICAgfSk7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIG5vdGlmeUNvbW1pdChtdXRhdGlvbnM6IENvbW1pdEV2ZW50WydtdXRhdGlvbnMnXSk6IHZvaWQge1xuICAgIHRoaXMuX2ludm9rZUhvb2soJ29uQ29tbWl0Jywge1xuICAgICAgc3RhZ2VOYW1lOiB0aGlzLl9zdGFnZU5hbWUsXG4gICAgICBzdGFnZUlkOiB0aGlzLl9zdGFnZUNvbnRleHQuc3RhZ2VJZCxcbiAgICAgIHJ1bnRpbWVTdGFnZUlkOiB0aGlzLl9zdGFnZUNvbnRleHQucnVudGltZVN0YWdlSWQsXG4gICAgICBwaXBlbGluZUlkOiB0aGlzLl9zdGFnZUNvbnRleHQucnVuSWQsXG4gICAgICB0aW1lc3RhbXA6IERhdGUubm93KCksXG4gICAgICBtdXRhdGlvbnMsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmVmdXNlIGEgd3JpdGUgZnJvbSBhIGhhbmRsZSBoZWxkIHBhc3QgaXRzIHN0YWdlICg5LjIyLjApLiBUaHJvd3Mgd2l0aCB0aGVcbiAgICogc3RhZ2UgdGhlIGhhbmRsZSBjYW1lIGZyb207IHRoZSBlbmdpbmUncyBlcnJvciBwYXRoIGF0dHJpYnV0ZXMgdGhlIHRocm93XG4gICAqIHRvIHRoZSBzdGFnZSB0aGF0IG1hZGUgdGhlIHdyaXRlLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3NlcnRMaXZlKGtleTogc3RyaW5nLCBjaGFubmVsOiBMYXRlV3JpdGVbJ2NoYW5uZWwnXSA9ICdzdGF0ZScpOiB2b2lkIHtcbiAgICB0aGlzLnJlZnVzZUlmQXR0ZW1wdEVuZGVkKGtleSwgY2hhbm5lbCk7XG4gICAgaWYgKHRoaXMuX2NvbW1pdHRlZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGRlYWRGcmFtZU1lc3NhZ2UodGhpcy5fc3RhZ2VOYW1lLCB0aGlzLl9zdGFnZUNvbnRleHQucnVudGltZVN0YWdlSWQsIGtleSkpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgYXR0ZW1wdCBmZW5jZSAoUDFiKTogdGhpcyBmYWNhZGUncyBhdHRlbXB0IGhhcyBlbmRlZCwgc28gd2hhdGV2ZXIgdGhlXG4gICAqIGFiYW5kb25lZCBmdW5jdGlvbiBkb2VzIG5vdyBtdXN0IG5vdCByZWFjaCB0aGUgc3RhZ2Ug4oCUIG5vdCBpdHMgYnVmZmVyLCBpdHNcbiAgICogcmVhZHMsIGl0cyB1bnRyYWNrZWQgc291cmNlcyBvciBhIHJlY29yZGVyLiBSZWZ1c2VkOyBhIHdyaXRlIG9yIGFuIGVtaXQgaXNcbiAgICogcmVjb3JkZWQgb24gdGhlIHN0YWdlIGZpcnN0IChgU3RhZ2VTbmFwc2hvdC5sYXRlV3JpdGVzYCwgdGhlIG5hbWUgb25seSksXG4gICAqIGEgcmVhZCAoYGNoYW5uZWxgIHVuZGVmaW5lZCkgaXMgbm90LlxuICAgKi9cbiAgcHJpdmF0ZSByZWZ1c2VJZkF0dGVtcHRFbmRlZChrZXk6IHN0cmluZywgY2hhbm5lbD86IExhdGVXcml0ZVsnY2hhbm5lbCddKTogdm9pZCB7XG4gICAgY29uc3QgYXR0ZW1wdCA9IHRoaXMuX2F0dGVtcHQ7XG4gICAgaWYgKGF0dGVtcHQgPT09IHVuZGVmaW5lZCB8fCAhdGhpcy5fc3RhZ2VDb250ZXh0Lmhhc0F0dGVtcHRFbmRlZChhdHRlbXB0LmF0dGVtcHQpKSByZXR1cm47XG4gICAgaWYgKGNoYW5uZWwgIT09IHVuZGVmaW5lZCkgdGhpcy5fc3RhZ2VDb250ZXh0LnJlY29yZExhdGVXcml0ZSh7IGF0dGVtcHQ6IGF0dGVtcHQuYXR0ZW1wdCwga2V5LCBjaGFubmVsIH0pO1xuICAgIHRocm93IG5ldyBFcnJvcihsYXRlQXR0ZW1wdE1lc3NhZ2UodGhpcy5fc3RhZ2VOYW1lLCBhdHRlbXB0LnNlcmllcywgYXR0ZW1wdC5hdHRlbXB0LCBrZXkpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgYXR0ZW1wdCB0aGlzIHN0YWdlIGZ1bmN0aW9uIHJ1bnMgaW4g4oCUIGBzY29wZS4kYXR0ZW1wdCgpYCAoZGVzaWduXG4gICAqIMKnMy4xKS4gSXRzIGBzaWduYWxgIGFib3J0cyB3aGVuIHRoZSBhdHRlbXB0IG11c3Qgc3RvcCAoaXRzIGNhcCwgdGhlIHJ1bidzXG4gICAqIGRlYWRsaW5lLCBhIGNhbmNlbGxhdGlvbik6IHBhc3MgaXQgdG8gYGZldGNoYCBhbmQgU0RLIGNhbGxzLiBJdHNcbiAgICogYHRpbWVMZWZ0TXMoKWAgcmVhZHMgdGhlIHJ1bidzIGRlYWRsaW5lIOKAlCB0aW1lIGlzIGFuIGlucHV0IHRoZSByZWNvcmRcbiAgICogY2Fubm90IHJlcGxheSwgc28gd2l0aCBhIGRlYWRsaW5lIHRoZSByZWFkIG1hcmtzIHRoZSBzdGFnZSdzIGNvbW1pdFxuICAgKiBgdW50cmFja2VkU291cmNlczogWydlbnYnXWAsIGFzIGBnZXRFbnYoKWAgZG9lcy5cbiAgICpcbiAgICogQSBzdGFnZSB0aGUgYXR0ZW1wdCBydW5uZXIgZG9lcyBub3QgcnVuIChubyByZXRyeSBwb2xpY3ksIG5vIGB0aW1lb3V0TXNgLFxuICAgKiBubyBkZWFkbGluZSkgaXMgYXR0ZW1wdCAxIG9mIDEsIHdpdGggdGhlIHJ1bidzIHNpZ25hbCBhbmQgYEluZmluaXR5YCBsZWZ0LlxuICAgKlxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHQgPSBzY29wZS4kYXR0ZW1wdCgpO1xuICAgKiBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCh1cmwsIHsgc2lnbmFsOiB0LnNpZ25hbCB9KTtcbiAgICogaWYgKHQudGltZUxlZnRNcygpIDwgMV8wMDApIHNjb3BlLnN1bW1hcnkgPSAncGFydGlhbCc7XG4gICAqIGBgYFxuICAgKi9cbiAgZ2V0QXR0ZW1wdCgpOiBBdHRlbXB0Q29udGV4dCB7XG4gICAgY29uc3QgYXR0ZW1wdCA9IHRoaXMuX2F0dGVtcHQ7XG4gICAgY29uc3Qgb2JzZXJ2ZWQgPSAocmVwb3J0OiBPYnNlcnZlZEF0dGVtcHQpID0+IHRoaXMucmVjb3JkT2JzZXJ2ZWQocmVwb3J0KTtcbiAgICBpZiAoYXR0ZW1wdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gT2JqZWN0LmZyZWV6ZSh7XG4gICAgICAgIHNlcmllczogdGhpcy5fc3RhZ2VDb250ZXh0LnJ1bnRpbWVTdGFnZUlkLFxuICAgICAgICBhdHRlbXB0OiAxLFxuICAgICAgICBvZjogMSxcbiAgICAgICAgc2lnbmFsOiB0aGlzLl9ydW5TaWduYWwgPz8gTkVWRVJfQUJPUlRFRCxcbiAgICAgICAgdGltZUxlZnRNczogKCkgPT4gSW5maW5pdHksXG4gICAgICAgIG9ic2VydmVkLFxuICAgICAgfSk7XG4gICAgfVxuICAgIHRoaXMucmVmdXNlSWZBdHRlbXB0RW5kZWQoJyRhdHRlbXB0Jyk7XG4gICAgY29uc3QgY29udGV4dCA9IHRoaXMuX3N0YWdlQ29udGV4dDtcbiAgICByZXR1cm4gT2JqZWN0LmZyZWV6ZSh7XG4gICAgICAuLi5hdHRlbXB0LFxuICAgICAgdGltZUxlZnRNczogKCkgPT4ge1xuICAgICAgICAvLyBSZWFkIHRocm91Z2ggYSBoYW5kbGUgaGVsZCBwYXN0IGl0cyBhdHRlbXB0LCBpdCBtdXN0IG5vdCBtYXJrIGEgTEFURVIgYXR0ZW1wdCdzIGNvbW1pdC5cbiAgICAgICAgdGhpcy5yZWZ1c2VJZkF0dGVtcHRFbmRlZCgnJGF0dGVtcHQnKTtcbiAgICAgICAgaWYgKGF0dGVtcHQuZGVhZGxpbmUgIT09IHVuZGVmaW5lZCkgY29udGV4dC5tYXJrVW50cmFja2VkU291cmNlKCdlbnYnKTtcbiAgICAgICAgcmV0dXJuIGF0dGVtcHQudGltZUxlZnRNcygpO1xuICAgICAgfSxcbiAgICAgIG9ic2VydmVkLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEEgY2FsbCB0byBhbiBvdXRzaWRlIHN5c3RlbSwgbWFkZSBpbnNpZGUgdGhpcyBzdGFnZSDigJQgYHNjb3BlLiRjYWxsKHRhcmdldCwgZm4sIHBvbGljeT8pYCAoZGVzaWduIMKnMy42LCBQMikuXG4gICAqIGBmbmAgcnVucyBvbiB0aGUgYXR0ZW1wdCBydW5uZXIgdW5kZXIgYHBvbGljeWAgKG5vbmUgPSBPTkUgYXR0ZW1wdCwgc3RpbGwgcmVjb3JkZWQ6IGEgc2luZ2xlIGNhbGwgaXMgZXZpZGVuY2VcbiAgICogdG9vKSwgYW5kIGV2ZXJ5IGF0dGVtcHQgaXMgYW4gYEF0dGVtcHRSZWNvcmRgIG9mIGtpbmQgYCdjYWxsJ2Agb24gdGhpcyBzdGFnZSdzIGV4ZWN1dGlvbi10cmVlIG5vZGUgYW5kIG9uXG4gICAqIGBvbkF0dGVtcHRgIOKAlCBpdHMgdGltaW5nLCBvdXRjb21lLCBmYWlsdXJlIGNhdGVnb3J5IGFuZCB0aGUgcmV0cnktb3Itc3RvcCBkZWNpc2lvbiwgaXRzIGVycm9yIHNlcnZlZCB1bmRlciB0aGVcbiAgICogcnVuJ3MgcmVkYWN0aW9uIHJ1bGUuXG4gICAqXG4gICAqIFRoZSBjYWxsIGxpdmVzIHdpdGhpbiB0aGlzIHN0YWdlIGF0dGVtcHQ6IGl0IGlzIGNhcHBlZCBieSB0aGUgdGltZSB0aGUgYXR0ZW1wdCBoYXMgbGVmdCAoaXRzIGNhcCwgdGhlIHJ1bidzXG4gICAqIGRlYWRsaW5lKSBhbmQgYGZuYCdzIGBzaWduYWxgIGFib3J0cyB3aGVuIHRoZSBhdHRlbXB0IGRvZXM7IG9uY2UgdGhlIGF0dGVtcHQgaXMgb3ZlciBub3RoaW5nIG9mIHRoZSBjYWxsIGxhbmRzXG4gICAqIGFuZCBubyBmdXJ0aGVyIGF0dGVtcHQgb2YgaXQgc3RhcnRzIChgYXR0ZW1wdC9jYWxsLnRzYCkuIGB0YXJnZXRgIGlzIGEgTkFNRSBmcm9tIGNvZGUg4oCUIG5ldmVyIGEgdmFsdWUuXG4gICAqXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgcXVvdGUgPSBhd2FpdCBzY29wZS4kY2FsbCgnc3RyaXBlLnF1b3Rlcy5jcmVhdGUnLCAodCkgPT4gc3RyaXBlLnF1b3Rlcy5jcmVhdGUoYm9keSwgeyBzaWduYWw6IHQuc2lnbmFsIH0pLFxuICAgKiAgIHsgYXR0ZW1wdHM6IDMsIHRpbWVvdXRNczogMTBfMDAwLCBiYWNrb2ZmTXM6IChuKSA9PiA1MDAgKiBuIH0pO1xuICAgKiBgYGBcbiAgICpcbiAgICogQSBjYWxsIHRoYXQgQ0hBTkdFUyBhbiBvdXRzaWRlIHN5c3RlbSBkZWNsYXJlcyBpdCAoUDMpOiBgb3B0aW9ucy50b3VjaGVzYCBuYW1lcyB0aGUgc3lzdGVtIGFuZFxuICAgKiBgb3B0aW9ucy5pZGVtcG90ZW5jeUtleWAgdGhlIGtleSBldmVyeSBhdHRlbXB0IGlzIG1hZGUgdW5kZXIgKGB0LmlkZW1wb3RlbmN5S2V5YCkg4oCUIGEgdmFsdWUgZnJvbSB0aGUgc3RhZ2Unc1xuICAgKiBpbnB1dCBvciBzdGF0ZSwgbmV2ZXIgZnJvbSBtb2RlbCBvdXRwdXQuIEEgdG91Y2hpbmcgY2FsbCB0aGF0IG1heSByZXRyeSB3aXRob3V0IGEga2V5IGlzIHJlZnVzZWQgaGVyZSxcbiAgICogYmVmb3JlIGFueXRoaW5nIGlzIHNlbnQ7IGVhY2ggcmVjb3JkIHNheXMgd2hhdCBpdHMgYXR0ZW1wdCBkaWQgKGBlZmZlY3RgKSwgYW5kIGEgY2FsbCB0aGF0IGVuZHMgd2l0aG91dCBhbiBhbnN3ZXIgYWZ0ZXIgYW55IGF0dGVtcHQgbGVmdCB0aGVcbiAgICogZWZmZWN0IHVua25vd24gcmVqZWN0cyB3aXRoIGBVbmtub3duRWZmZWN0RXJyb3JgIOKAlCByZWNvbmNpbGUgYnkgdGhlIGtleSwgZG8gbm90IHJldHJ5IGJsaW5kbHkuXG4gICAqL1xuICBjYWxsPFQ+KFxuICAgIHRhcmdldDogc3RyaW5nLFxuICAgIGZuOiAoYXR0ZW1wdDogQXR0ZW1wdENvbnRleHQpID0+IFByb21pc2U8VD4gfCBULFxuICAgIHBvbGljeT86IFJldHJ5UG9saWN5LFxuICAgIG9wdGlvbnM/OiBDYWxsT3B0aW9ucyxcbiAgKTogUHJvbWlzZTxUPiB7XG4gICAgY29uc3QgbmFtZSA9IGFkbWl0QXR0ZW1wdE5hbWUoJyRjYWxsJywgJ3RhcmdldCcsIHRhcmdldCk7XG4gICAgY29uc3Qgd2hlcmUgPSBgJGNhbGwoJyR7bmFtZX0nKWA7XG4gICAgaWYgKHR5cGVvZiBmbiAhPT0gJ2Z1bmN0aW9uJykgdGhyb3cgbmV3IFR5cGVFcnJvcihgJHt3aGVyZX06IGZuIG11c3QgYmUgYSBmdW5jdGlvbmApO1xuICAgIGNvbnN0IGFkbWl0dGVkID0gYWRtaXRDYWxsUG9saWN5KHdoZXJlLCBwb2xpY3kpO1xuICAgIGNvbnN0IHRvdWNoZXMgPSBjYWxsVG91Y2hlcyh3aGVyZSwgb3B0aW9ucywgYWRtaXR0ZWQpO1xuICAgIC8vIEEga2V5bGVzcyB0b3VjaGluZyBjYWxsIGlzIHNlbnQgb25jZSBvbmx5IGlmIHRoZSBzdGFnZSBhdHRlbXB0IHRoYXQgbWFrZXMgaXQgbmV2ZXIgcnVucyBhZ2FpbiAoUDMpOiBhIHN0YWdlXG4gICAgLy8gdGhhdCBtYXkgcmV0cnkgd291bGQgcmUtc2VuZCBpdCB3aXRob3V0IGEga2V5IOKAlCByZWZ1c2VkIGhlcmUsIGJlZm9yZSBhbnl0aGluZyBpcyBzZW50LlxuICAgIC8vIFNvIGlzIG9uZSBpbnNpZGUgYW4gZW5jbG9zaW5nIGAkY2FsbGAgdGhhdCBtYXkgcmV0cnkgKGl0cyBmdW5jdGlvbiBydW5zIG9uY2UgcGVyIG91dGVyIGF0dGVtcHQpLlxuICAgIGlmICh0b3VjaGVzICE9PSB1bmRlZmluZWQgJiYgdG91Y2hlcy5pZGVtcG90ZW5jeUtleSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBlbmNsb3NpbmcgPSAodGhpcy5fYXR0ZW1wdD8ub2YgPz8gMSkgPiAxID8gJ2Egc3RhZ2UnIDogdGhpcy5fcmV0cnlpbmdDYWxscyA+IDAgPyAnYSAkY2FsbCcgOiB1bmRlZmluZWQ7XG4gICAgICBpZiAoZW5jbG9zaW5nICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgICBgJHt3aGVyZX06IHRvdWNoZXMgXCIke3RvdWNoZXMuc3lzdGVtfVwiIHdpdGggbm8gaWRlbXBvdGVuY3lLZXksIGluc2lkZSAke2VuY2xvc2luZ30gdGhhdCBtYXkgcmV0cnkg4oCUIGEgYCArXG4gICAgICAgICAgICAncmV0cnkgd291bGQgc2VuZCBpdCBhZ2FpbiB3aXRob3V0IGEga2V5LiBHaXZlIHRoZSBjYWxsIGEga2V5LicsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICB0aGlzLl9zdGFnZUNvbnRleHQubWFya0tleWxlc3NFZmZlY3QoKTtcbiAgICB9XG4gICAgLy8gRnJvbSBhbiBlbmRlZCBhdHRlbXB0IG9yIGEgY29tbWl0dGVkIGZyYW1lOiByZWZ1c2VkIChhbmQgcmVjb3JkZWQgYnkgbmFtZSkgYmVmb3JlIGFueXRoaW5nIHJlYWNoZXMgb3V0c2lkZS5cbiAgICB0aGlzLnJlZnVzZUxhdGVDYWxsKGBjYWxsOiR7bmFtZX1gKTtcbiAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5fc3RhZ2VDb250ZXh0O1xuICAgIGNvbnN0IHN0YWdlQXR0ZW1wdCA9IHRoaXMuX2F0dGVtcHQ/LmF0dGVtcHQgPz8gMTtcbiAgICBjb25zdCBzaWduYWwgPSB0aGlzLl9hdHRlbXB0Py5zaWduYWwgPz8gdGhpcy5fcnVuU2lnbmFsO1xuICAgIGNvbnN0IGRlYWRsaW5lID0gYXR0ZW1wdEVuZHNBdCh0aGlzLl9hdHRlbXB0KTtcbiAgICBjb25zdCBlbmRlZCA9IGNvbnRleHQuY2FsbHNFbmRlZFNpZ25hbChzdGFnZUF0dGVtcHQpO1xuICAgIC8vIFdoaWxlIGEgY2FsbCB0aGF0IG1heSByZXRyeSBpcyBpbiBmbGlnaHQsIGEga2V5bGVzcyB0b3VjaGluZyBjYWxsIG1hZGUgaW5zaWRlIGl0IGlzIHJlZnVzZWQgKGFib3ZlKS5cbiAgICBjb25zdCByZXRyeWluZyA9IGF0dGVtcHRDZWlsaW5nKGFkbWl0dGVkLmF0dGVtcHRzKSA+IDE7XG4gICAgaWYgKHJldHJ5aW5nKSB0aGlzLl9yZXRyeWluZ0NhbGxzICs9IDE7XG4gICAgbGV0IHJlc3VsdDogUHJvbWlzZTxUPjtcbiAgICB0cnkge1xuICAgICAgcmVzdWx0ID0gdGhpcy5zdGFydENhbGwobmFtZSwgZm4sIGFkbWl0dGVkLCB0b3VjaGVzLCBzdGFnZUF0dGVtcHQsIHNpZ25hbCwgZGVhZGxpbmUsIGVuZGVkKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKHJldHJ5aW5nKSB0aGlzLl9yZXRyeWluZ0NhbGxzIC09IDE7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gICAgaWYgKCFyZXRyeWluZykgcmV0dXJuIHJlc3VsdDtcbiAgICBjb25zdCByZWxlYXNlID0gKCkgPT4ge1xuICAgICAgdGhpcy5fcmV0cnlpbmdDYWxscyAtPSAxO1xuICAgIH07XG4gICAgcmVzdWx0LnRoZW4ocmVsZWFzZSwgcmVsZWFzZSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKiBgcnVuQ2FsbGAgd2l0aCB0aGlzIHN0YWdlIGF0dGVtcHQgYXMgaXRzIGhvc3QgKGBjYWxsYCkuICovXG4gIHByaXZhdGUgc3RhcnRDYWxsPFQ+KFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBmbjogKGF0dGVtcHQ6IEF0dGVtcHRDb250ZXh0KSA9PiBQcm9taXNlPFQ+IHwgVCxcbiAgICBhZG1pdHRlZDogUmV0cnlQb2xpY3ksXG4gICAgdG91Y2hlczogeyByZWFkb25seSBzeXN0ZW06IHN0cmluZzsgcmVhZG9ubHkgaWRlbXBvdGVuY3lLZXk/OiBzdHJpbmcgfSB8IHVuZGVmaW5lZCxcbiAgICBzdGFnZUF0dGVtcHQ6IG51bWJlcixcbiAgICBzaWduYWw6IEFib3J0U2lnbmFsIHwgdW5kZWZpbmVkLFxuICAgIGRlYWRsaW5lOiBudW1iZXIgfCB1bmRlZmluZWQsXG4gICAgZW5kZWQ6IEFib3J0U2lnbmFsLFxuICApOiBQcm9taXNlPFQ+IHtcbiAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5fc3RhZ2VDb250ZXh0O1xuICAgIGNvbnN0IGxvb3AgPSB0YWtlUmV0cnlMb29wQ2FsbCh0aGlzKTtcbiAgICByZXR1cm4gcnVuQ2FsbChuYW1lLCBmbiwgYWRtaXR0ZWQsIHtcbiAgICAgIG9wZW5TZXJpZXM6ICgpID0+IGNhbGxTZXJpZXMoY29udGV4dC5ydW50aW1lU3RhZ2VJZCwgc3RhZ2VBdHRlbXB0LCBjb250ZXh0Lm5leHRDYWxsT3JkaW5hbChzdGFnZUF0dGVtcHQpKSxcbiAgICAgIC4uLihzaWduYWwgIT09IHVuZGVmaW5lZCAmJiB7IHNpZ25hbCB9KSxcbiAgICAgIC4uLihkZWFkbGluZSAhPT0gdW5kZWZpbmVkICYmIHsgZGVhZGxpbmUgfSksXG4gICAgICBlbmRlZCxcbiAgICAgIC4uLih0b3VjaGVzICE9PSB1bmRlZmluZWQgJiYgeyBlZmZlY3Q6IHRoaXMuY2FsbEVmZmVjdCh0b3VjaGVzKSB9KSxcbiAgICAgIC8vIFRoZSBmcmFtZSdzIG93biBjb21taXQgc3RhdGUgKGV2ZXJ5IGF0dGVtcHQncyBmYWNhZGUgcmVhZHMgdGhlIHNhbWUpLCBuZXZlciBhIGZhY2FkZSBmbGFnLlxuICAgICAgYWRtaXRzOiAoY3V0KSA9PiAhY29udGV4dC5jb21taXR0ZWQgJiYgKGN1dCB8fCAhKGVuZGVkLmFib3J0ZWQgfHwgdGhpcy5hdHRlbXB0SGFzRW5kZWQoKSkpLFxuICAgICAgc2VydmU6IChlcnJvcikgPT4gdGhpcy5ydWxlLnNlcnZlZEVycm9yKGVycm9yKSxcbiAgICAgIHJlcG9ydDogKHJlY29yZCwgc3RydWN0dXJlZEVycm9yKSA9PiB7XG4gICAgICAgIGNvbnN0IHNlcnZlZCA9IGxvb3AgPyBPYmplY3QuZnJlZXplKHsgLi4ucmVjb3JkLCByZXRyeUxvb3A6IGxvb3AuaWRlbnRpdHkgfSkgOiByZWNvcmQ7XG4gICAgICAgIGNvbnRleHQucmVwb3J0Q2FsbEF0dGVtcHQoc2VydmVkLCBzdHJ1Y3R1cmVkRXJyb3IpO1xuICAgICAgICBsb29wPy5yZWNvcmQoc2VydmVkKTtcbiAgICAgIH0sXG4gICAgICByZWZ1c2VkOiAoKSA9PiBjb250ZXh0LnJlY29yZExhdGVXcml0ZSh7IGF0dGVtcHQ6IHN0YWdlQXR0ZW1wdCwga2V5OiBgY2FsbDoke25hbWV9YCwgY2hhbm5lbDogJ2F0dGVtcHQnIH0pLFxuICAgICAgb2JzZXJ2ZTogKHJlcG9ydCwgYXQpID0+IHRoaXMucmVjb3JkT2JzZXJ2ZWQocmVwb3J0LCBhdC5lbmRlZCksXG4gICAgfSk7XG4gIH1cblxuICAvKiogQGludGVybmFsIFRoZSBleHBsaWNpdCByZXRyeSBoZWxwZXIgb3ducyB0aGlzIHN0YXRlOyB0aGUgbm9ybWFsIHdyaXRlIHBhdGggc3RpbGwgb3ducyByZXRlbnRpb24vY29tbWl0LiAqL1xuICB3cml0ZVJldHJ5TG9vcFN0YXRlKGtleTogc3RyaW5nLCBzdGF0ZTogeyByZWFkb25seSBpZGVtcG90ZW5jeUtleTogc3RyaW5nIH0pOiB2b2lkIHtcbiAgICBjb25zdCBrZXB0ID0gdGhpcy5zZXJ2ZVJldHJ5TG9vcEtleShzdGF0ZS5pZGVtcG90ZW5jeUtleSk7XG4gICAgaWYgKGtlcHQgIT09IHN0YXRlLmlkZW1wb3RlbmN5S2V5KSB0aGlzLnJ1bGUuaW5oZXJpdEZpZWxkcyhrZXksIFsnaWRlbXBvdGVuY3lLZXknXSk7XG4gICAgdGhpcy5zZXRWYWx1ZShrZXksIHN0YXRlKTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgRXhhY3RseSB0aGUgZXhpc3RpbmcgUDMga2V5LXJldGVudGlvbiBsYXc7IG9wZXJhdGlvbmFsIHN0YXRlIGtlZXBzIHRoZSByZWFsIGtleS4gKi9cbiAgc2VydmVSZXRyeUxvb3BLZXkoa2V5OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnJ1bGUucmV0YWluSWRlbXBvdGVuY3lLZXkoa2V5LCB7XG4gICAgICBpbnB1dDogdGhpcy5fcmVhZE9ubHlWYWx1ZXMsXG4gICAgICBzZWxlY3RlZFJlYWRzOiB0aGlzLl9zdGFnZUNvbnRleHQuc2VsZWN0ZWRSZWFkcyArICh0aGlzLl9zdGFnZUNvbnRleHQuZWZmZWN0S2V5VGFpbnRlZCA/IDEgOiAwKSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgTG9vcCBzdGF0ZSBpcyBkdXJhYmxlIGRhdGE6IG5ldmVyIHBlcnNpc3QgdGhlIHRocm93biB2YWx1ZSwgc3RhY2ssIGNhdXNlIG9yIHBheWxvYWQuICovXG4gIHNlcnZlUmV0cnlMb29wRXJyb3IoZXJyb3I6IHVua25vd24pOiBBdHRlbXB0RXJyb3Ige1xuICAgIGNvbnN0IHNlcnZlZCA9IHRoaXMucnVsZS5zZXJ2ZWRFcnJvcihlcnJvcik7XG4gICAgcmV0dXJuIHtcbiAgICAgIG1lc3NhZ2U6IHNlcnZlZC5tZXNzYWdlLFxuICAgICAgLi4uKHNlcnZlZC5uYW1lICE9PSB1bmRlZmluZWQgPyB7IG5hbWU6IHNlcnZlZC5uYW1lIH0gOiB7fSksXG4gICAgICAuLi4oc2VydmVkLmNvZGUgIT09IHVuZGVmaW5lZCA/IHsgY29kZTogc2VydmVkLmNvZGUgfSA6IHt9KSxcbiAgICB9O1xuICB9XG5cbiAgLyoqIEEgdG91Y2hpbmcgY2FsbCdzIHRhcmdldCwgaXRzIGtleSBzZXJ2ZWQgZm9yIHRoZSByZWNvcmRzIChgUmVkYWN0aW9uUnVsZSDCtyByZXRhaW5JZGVtcG90ZW5jeUtleWA6IGJ5IG5hbWUgYW5kIGJ5IGl0cyBzb3VyY2VzKS4gKi9cbiAgcHJpdmF0ZSBjYWxsRWZmZWN0KHRvdWNoZXM6IHsgcmVhZG9ubHkgc3lzdGVtOiBzdHJpbmc7IHJlYWRvbmx5IGlkZW1wb3RlbmN5S2V5Pzogc3RyaW5nIH0pOiB7XG4gICAgcmVhZG9ubHkgc3lzdGVtOiBzdHJpbmc7XG4gICAgcmVhZG9ubHkgaWRlbXBvdGVuY3lLZXk/OiBzdHJpbmc7XG4gICAgcmVhZG9ubHkgcmVjb3JkZWRLZXk/OiBzdHJpbmc7XG4gIH0ge1xuICAgIGNvbnN0IGtleSA9IHRvdWNoZXMuaWRlbXBvdGVuY3lLZXk7XG4gICAgaWYgKGtleSA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdG91Y2hlcztcbiAgICAvLyBBIGtleSB0aGUgc3RhZ2UgYnVpbHQgYWZ0ZXIgcmVhZGluZyBhIHNlbGVjdGVkIHZhbHVlIOKAlCBvciBmcm9tIGFuIGlucHV0IGhvbGRpbmcgb25lIOKAlCBpcyBzZXJ2ZWQgd2hvbGUuXG4gICAgY29uc3QgcmVjb3JkZWRLZXkgPSB0aGlzLnJ1bGUucmV0YWluSWRlbXBvdGVuY3lLZXkoa2V5LCB7XG4gICAgICBpbnB1dDogdGhpcy5fcmVhZE9ubHlWYWx1ZXMsXG4gICAgICAvLyBUaGUgc3RhZ2UncyBvd24ga2V5IG1heSBiZSBtYWRlIG9mIGEgc2VsZWN0ZWQgdmFsdWU6IGEga2V5IHBhc3NlZCBvbiBmcm9tIGl0IGlzIHNlcnZlZCB0aGUgc2FtZSB3YXkuXG4gICAgICBzZWxlY3RlZFJlYWRzOiB0aGlzLl9zdGFnZUNvbnRleHQuc2VsZWN0ZWRSZWFkcyArICh0aGlzLl9zdGFnZUNvbnRleHQuZWZmZWN0S2V5VGFpbnRlZCA/IDEgOiAwKSxcbiAgICB9KTtcbiAgICByZXR1cm4geyAuLi50b3VjaGVzLCByZWNvcmRlZEtleSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEEgYCRjYWxsYCBmcm9tIGFuIGVuZGVkIGF0dGVtcHQsIG9yIGZyb20gYSBmcmFtZSB0aGF0IGhhcyBjb21taXR0ZWQ6IHJlY29yZGVkIGJ5IG5hbWUgKGBsYXRlV3JpdGVzYCwgY2hhbm5lbFxuICAgKiBgJ2F0dGVtcHQnYCkgYW5kIHJlZnVzZWQg4oCUIGJlZm9yZSBhbnl0aGluZyByZWFjaGVzIG91dHNpZGUuIFRoZSBQMWIgZmVuY2UgZmlyc3QsIHNvIGl0cyBtZXNzYWdlIGFuZCByZWNvcmQgYXJlXG4gICAqIHRoZSBzYW1lLlxuICAgKi9cbiAgcHJpdmF0ZSByZWZ1c2VMYXRlQ2FsbChrZXk6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMucmVmdXNlSWZBdHRlbXB0RW5kZWQoa2V5LCAnYXR0ZW1wdCcpO1xuICAgIGlmICghdGhpcy5fc3RhZ2VDb250ZXh0LmNvbW1pdHRlZCAmJiAhdGhpcy5fY29tbWl0dGVkKSByZXR1cm47XG4gICAgdGhpcy5fc3RhZ2VDb250ZXh0LnJlY29yZExhdGVXcml0ZSh7IGF0dGVtcHQ6IHRoaXMuX2F0dGVtcHQ/LmF0dGVtcHQgPz8gMSwga2V5LCBjaGFubmVsOiAnYXR0ZW1wdCcgfSk7XG4gICAgdGhyb3cgbmV3IEVycm9yKGRlYWRGcmFtZU1lc3NhZ2UodGhpcy5fc3RhZ2VOYW1lLCB0aGlzLl9zdGFnZUNvbnRleHQucnVudGltZVN0YWdlSWQsIGtleSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFuIG91dHNpZGUgYXR0ZW1wdCBhbiBhZGFwdGVyIHJlcG9ydGVkIOKAlCBgQXR0ZW1wdENvbnRleHQub2JzZXJ2ZWRgIG9uIHRoaXMgc3RhZ2UncyBhdHRlbXB0IG9yIG9uIG9uZSBvZiBpdHNcbiAgICogY2FsbHMnIChQMikuIFJlYWQgYW5kIHZhbGlkYXRlZCBmaXJzdCAoYSBtYWxmb3JtZWQgcmVwb3J0IGlzIHRoZSBhZGFwdGVyJ3MgYnVnOiBhIGBUeXBlRXJyb3JgLCBhbmQgaXQgbmV2ZXJcbiAgICogcmVhY2hlcyB0aGUgcmVjb3JkKS4gQSByZXBvcnQgdGhhdCBjb21lcyBhZnRlciBpdHMgYXR0ZW1wdCBlbmRlZCDigJQgdGhlIGNhbGwgYXR0ZW1wdCBpdCB3YXMgbWFkZSB0aHJvdWdoLCB0aGlzXG4gICAqIHN0YWdlIGF0dGVtcHQsIG9yIHRoZSBmcmFtZSdzIGNvbW1pdCDigJQgaXMgcmVjb3JkZWQgYnkgbmFtZSAoYGxhdGVXcml0ZXNgLCBjaGFubmVsIGAnYXR0ZW1wdCdgKSBhbmQgRFJPUFBFRCxcbiAgICogbmV2ZXIgdGhyb3duOiBhZGFwdGVycyByZXBvcnQgZnJvbSBhbiBTREsncyBvd24gY2FsbGJhY2tzLCB3aGljaCBtYXkgZmlyZSBhZnRlciB0aGUgc3RhZ2UgbW92ZWQgb24sIGFuZCBhblxuICAgKiBvYnNlcnZlZCBhdHRlbXB0IG5ldmVyIGNoYW5nZXMgY29udHJvbCBmbG93IOKAlCBpbiBlaXRoZXIgZGlyZWN0aW9uLiBJdHMgc2VyaWVzIG9wZW5zIGF0IHRoaXMgc3RhZ2UgYXR0ZW1wdCdzIGNhbGxcbiAgICogbGV2ZWw6IGFuIFNESydzIGNhbGwgaXMgYSBjYWxsIHRoZSBzdGFnZSBhdHRlbXB0IG1hZGUsIHNvIGEgcmVwb3J0IG1hZGUgdGhyb3VnaCBhIGAkY2FsbGAgaXMgdGhhdCBjYWxsJ3Mgc2libGluZy5cbiAgICovXG4gIHByaXZhdGUgcmVjb3JkT2JzZXJ2ZWQocmVwb3J0OiBPYnNlcnZlZEF0dGVtcHQsIGNhbGxBdHRlbXB0RW5kZWQgPSBmYWxzZSk6IHZvaWQge1xuICAgIGNvbnN0IHJlYWQgPSByZWFkT2JzZXJ2ZWRSZXBvcnQocmVwb3J0KTtcbiAgICBjb25zdCBrZXkgPSBgb2JzZXJ2ZWQ6JHtyZWFkLnRhcmdldH1gO1xuICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLl9zdGFnZUNvbnRleHQ7XG4gICAgY29uc3Qgc3RhZ2VBdHRlbXB0ID0gdGhpcy5fYXR0ZW1wdD8uYXR0ZW1wdCA/PyAxO1xuICAgIGlmIChjYWxsQXR0ZW1wdEVuZGVkIHx8IHRoaXMuYXR0ZW1wdEhhc0VuZGVkKCkgfHwgY29udGV4dC5jb21taXR0ZWQgfHwgdGhpcy5fY29tbWl0dGVkKSB7XG4gICAgICBjb250ZXh0LnJlY29yZExhdGVXcml0ZSh7IGF0dGVtcHQ6IHN0YWdlQXR0ZW1wdCwga2V5LCBjaGFubmVsOiAnYXR0ZW1wdCcgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGJvb2sgPSAodGhpcy5fb2JzZXJ2ZWRCb29rID8/PSBuZXcgT2JzZXJ2ZWRTZXJpZXNCb29rKCgpID0+XG4gICAgICBjYWxsU2VyaWVzKGNvbnRleHQucnVudGltZVN0YWdlSWQsIHN0YWdlQXR0ZW1wdCwgY29udGV4dC5uZXh0Q2FsbE9yZGluYWwoc3RhZ2VBdHRlbXB0KSksXG4gICAgKSk7XG4gICAgY29uc3QgeyByZWNvcmQsIHN0cnVjdHVyZWRFcnJvciB9ID0gb2JzZXJ2ZWRSZWNvcmQocmVhZCwge1xuICAgICAgc2VyaWVzOiBib29rLnNlcmllc0ZvcihyZWFkKSxcbiAgICAgIG5vdzogRGF0ZS5ub3csXG4gICAgICBzZXJ2ZTogKGVycm9yKSA9PiB0aGlzLnJ1bGUuc2VydmVkRXJyb3IoZXJyb3IpLFxuICAgIH0pO1xuICAgIGNvbnRleHQucmVwb3J0Q2FsbEF0dGVtcHQocmVjb3JkLCBzdHJ1Y3R1cmVkRXJyb3IpO1xuICB9XG5cbiAgLyoqIFRoaXMgZmFjYWRlJ3MgYXR0ZW1wdCBoYXMgZW5kZWQg4oCUIHRoZSBQMWIgZmVuY2UgaXMgY2xvc2VkLiAqL1xuICBwcml2YXRlIGF0dGVtcHRIYXNFbmRlZCgpOiBib29sZWFuIHtcbiAgICBjb25zdCBhdHRlbXB0ID0gdGhpcy5fYXR0ZW1wdDtcbiAgICByZXR1cm4gYXR0ZW1wdCAhPT0gdW5kZWZpbmVkICYmIHRoaXMuX3N0YWdlQ29udGV4dC5oYXNBdHRlbXB0RW5kZWQoYXR0ZW1wdC5hdHRlbXB0KTtcbiAgfVxuXG4gIC8qKiBDYWxsZWQgYnkgU3RhZ2VDb250ZXh0LmNvbW1pdCgpIG9ic2VydmVyLiBDb252ZXJ0cyB0cmFja2VkIHdyaXRlcyB0byBDb21taXRFdmVudCBmb3JtYXQuXG4gICAqICBFcnJvcnMgYXJlIGNhdWdodCB0byBwcmV2ZW50IHJlY29yZGVyIGlzc3VlcyBmcm9tIGFib3J0aW5nIHRoZSB0cmF2ZXJzYWwuICovXG4gIHByaXZhdGUgX29uQ29tbWl0RmlyZWQobXV0YXRpb25zOiBSZWNvcmQ8c3RyaW5nLCB7IHZhbHVlOiB1bmtub3duOyBvcGVyYXRpb246ICdzZXQnIHwgJ3VwZGF0ZScgfCAnZGVsZXRlJyB9Pik6IHZvaWQge1xuICAgIHRoaXMuX2NvbW1pdHRlZCA9IHRydWU7XG4gICAgaWYgKHRoaXMuX3JlY29yZGVycy5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgIHRyeSB7XG4gICAgICAvLyBgX3N0YWdlV3JpdGVzYCBhbHJlYWR5IGhvbGRzIHRoZSByZXRhaW5lZCBmb3JtICh0aGUgY29udGV4dCByZXRhaW5zXG4gICAgICAvLyB1bmRlciB0aGUgc2FtZSBydWxlKTsgYXBwbHlpbmcgdGhlIHZlcmRpY3QgYWdhaW4gaGVyZSBpcyBpZGVtcG90ZW50XG4gICAgICAvLyBhbmQga2VlcHMgYSBrZXkgbWFya2VkIEFGVEVSIGl0cyB3cml0ZSBzY3J1YmJlZCBhdCBjb21taXQgdGltZS5cbiAgICAgIGNvbnN0IGNvbW1pdE11dGF0aW9uczogQ29tbWl0RXZlbnRbJ211dGF0aW9ucyddID0gT2JqZWN0LmVudHJpZXMobXV0YXRpb25zKS5tYXAoKFtrZXksIGVudHJ5XSkgPT4gKHtcbiAgICAgICAga2V5LFxuICAgICAgICB2YWx1ZTogdGhpcy5ydWxlLnJldGFpbihba2V5XSwgZW50cnkudmFsdWUpLFxuICAgICAgICBvcGVyYXRpb246IGVudHJ5Lm9wZXJhdGlvbixcbiAgICAgIH0pKTtcblxuICAgICAgdGhpcy5ub3RpZnlDb21taXQoY29tbWl0TXV0YXRpb25zKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIFN3YWxsb3cg4oCUIHJlY29yZGVyIGVycm9ycyBtdXN0IG5vdCBhYm9ydCB0aGUgdHJhdmVyc2FsLlxuICAgICAgLy8gSW5kaXZpZHVhbCByZWNvcmRlciBlcnJvcnMgYXJlIGFscmVhZHkgaXNvbGF0ZWQgYnkgX2ludm9rZUhvb2suXG4gICAgfVxuICB9XG5cbiAgLy8g4pSA4pSAIERlYnVnIC8gRGlhZ25vc3RpY3Mg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIC8vXG4gIC8vIFRoZXNlIGxlZ2FjeSBtZXRob2RzIHN0aWxsIHdyaXRlIHRvIHRoZSBgU3RhZ2VDb250ZXh0YCBkaWFnbm9zdGljXG4gIC8vIHNpZGUgYmFncyAobG9nQ29udGV4dCAvIGVycm9yQ29udGV4dCAvIG1ldHJpY0NvbnRleHQgLyBldmFsQ29udGV4dCkgZm9yXG4gIC8vIHNuYXBzaG90IGluY2x1c2lvbi4gVGhleSBBTFNPIGZpcmUgdGhyb3VnaCB0aGUgRW1pdCBjaGFubmVsIHNvIGFueVxuICAvLyBhdHRhY2hlZCBgRW1pdFJlY29yZGVyYCBzZWVzIHRoZW0gaW4gcmVhbCB0aW1lIOKAlCBjbG9zaW5nIHRoZVxuICAvLyBsb25nLXN0YW5kaW5nIGdhcCB3aGVyZSBgJGRlYnVnYC9gJG1ldHJpY2Agd2VudCB0byB1bm9ic2VydmVkIGJhZ3MuXG5cbiAgYWRkRGVidWdJbmZvKGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bikge1xuICAgIHRoaXMucmVmdXNlSWZBdHRlbXB0RW5kZWQoYGxvZy5kZWJ1Zy4ke2tleX1gLCAnZW1pdCcpO1xuICAgIGNvbnN0IGtlcHQgPSB0aGlzLl9zdGFnZUNvbnRleHQuYWRkRGlhZ25vc3RpYygnbG9ncycsIGtleSwgdmFsdWUpO1xuICAgIHRoaXMuZW1pdEV2ZW50KGBsb2cuZGVidWcuJHtrZXl9YCwgeyBrZXksIHZhbHVlOiBrZXB0LCBsZXZlbDogJ2RlYnVnJyB9KTtcbiAgfVxuXG4gIGFkZERlYnVnTWVzc2FnZSh2YWx1ZTogdW5rbm93bikge1xuICAgIHRoaXMucmVmdXNlSWZBdHRlbXB0RW5kZWQoJ2xvZy5kZWJ1Zy5tZXNzYWdlcycsICdlbWl0Jyk7XG4gICAgY29uc3Qga2VwdCA9IHRoaXMuX3N0YWdlQ29udGV4dC5hZGREaWFnbm9zdGljKCdsb2dzJywgJ21lc3NhZ2VzJywgW3ZhbHVlXSk7XG4gICAgdGhpcy5lbWl0RXZlbnQoJ2xvZy5kZWJ1Zy5tZXNzYWdlcycsIHsgdmFsdWU6IEFycmF5LmlzQXJyYXkoa2VwdCkgPyBrZXB0WzBdIDoga2VwdCwgbGV2ZWw6ICdkZWJ1ZycgfSk7XG4gIH1cblxuICBhZGRFcnJvckluZm8oa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKSB7XG4gICAgdGhpcy5yZWZ1c2VJZkF0dGVtcHRFbmRlZChgbG9nLmVycm9yLiR7a2V5fWAsICdlbWl0Jyk7XG4gICAgY29uc3Qga2VwdCA9IHRoaXMuX3N0YWdlQ29udGV4dC5hZGREaWFnbm9zdGljKCdlcnJvcnMnLCBrZXksIHZhbHVlKTtcbiAgICB0aGlzLmVtaXRFdmVudChgbG9nLmVycm9yLiR7a2V5fWAsIHsga2V5LCB2YWx1ZToga2VwdCwgbGV2ZWw6ICdlcnJvcicgfSk7XG4gIH1cblxuICBhZGRNZXRyaWMobWV0cmljTmFtZTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bikge1xuICAgIHRoaXMucmVmdXNlSWZBdHRlbXB0RW5kZWQoYG1ldHJpYy4ke21ldHJpY05hbWV9YCwgJ2VtaXQnKTtcbiAgICBjb25zdCBrZXB0ID0gdGhpcy5fc3RhZ2VDb250ZXh0LmFkZERpYWdub3N0aWMoJ21ldHJpY3MnLCBtZXRyaWNOYW1lLCB2YWx1ZSk7XG4gICAgdGhpcy5lbWl0RXZlbnQoYG1ldHJpYy4ke21ldHJpY05hbWV9YCwgeyBuYW1lOiBtZXRyaWNOYW1lLCB2YWx1ZToga2VwdCB9KTtcbiAgfVxuXG4gIGFkZEV2YWwobWV0cmljTmFtZTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bikge1xuICAgIHRoaXMucmVmdXNlSWZBdHRlbXB0RW5kZWQoYGV2YWwuJHttZXRyaWNOYW1lfWAsICdlbWl0Jyk7XG4gICAgY29uc3Qga2VwdCA9IHRoaXMuX3N0YWdlQ29udGV4dC5hZGREaWFnbm9zdGljKCdldmFscycsIG1ldHJpY05hbWUsIHZhbHVlKTtcbiAgICB0aGlzLmVtaXRFdmVudChgZXZhbC4ke21ldHJpY05hbWV9YCwgeyBuYW1lOiBtZXRyaWNOYW1lLCB2YWx1ZToga2VwdCB9KTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBFbWl0IOKAlCBQaGFzZSAzIHByaW1hcnkgcHJpbWl0aXZlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKlxuICAgKiBGaXJlIGEgc3RydWN0dXJlZCBldmVudCB0byBldmVyeSBhdHRhY2hlZCByZWNvcmRlciBpbXBsZW1lbnRpbmdcbiAgICogYG9uRW1pdGAuIFN5bmNocm9ub3VzLCBpbi1vcmRlciwgcGFzcy10aHJvdWdoIOKAlCBubyBidWZmZXJpbmcuXG4gICAqXG4gICAqIC0gKipGYXN0LXBhdGgqKjogemVybyBhbGxvY2F0aW9uICsgemVybyBjb3N0IHdoZW4gbm8gcmVjb3JkZXJzIGFyZVxuICAgKiAgIGF0dGFjaGVkIChlYXJseSByZXR1cm4gb24gZW1wdHkgbGlzdCkuXG4gICAqIC0gKipFbnJpY2htZW50Kio6IGxpYnJhcnkgYXV0by1hZGRzIGBzdGFnZU5hbWVgLCBgcnVudGltZVN0YWdlSWRgLFxuICAgKiAgIGBzdWJmbG93UGF0aGAsIGBwaXBlbGluZUlkYCwgYHRpbWVzdGFtcGAgdG8gdGhlIGV2ZW50LlxuICAgKiAtICoqUmVkYWN0aW9uKio6IGBSZWRhY3Rpb25Qb2xpY3kuZW1pdFBhdHRlcm5zYCByZWdleGVzIGFyZSBtYXRjaGVkXG4gICAqICAgYWdhaW5zdCBgbmFtZWAg4oCUIG1hdGNoZWQgZXZlbnRzIGhhdmUgdGhlaXIgcGF5bG9hZCByZXBsYWNlZCB3aXRoXG4gICAqICAgYCdbUkVEQUNURURdJ2AgYmVmb3JlIGRpc3BhdGNoLlxuICAgKiAtICoqRXJyb3IgaXNvbGF0aW9uKio6IGEgdGhyb3dpbmcgYG9uRW1pdGAgZG9lcyBub3QgcHJvcGFnYXRlIOKAlCBpdCBpc1xuICAgKiAgIGNhdWdodCBhbmQgcm91dGVkIHRvIGBvbkVycm9yYCBvbiByZW1haW5pbmcgcmVjb3JkZXJzLCBtYXRjaGluZyB0aGVcbiAgICogICBwYXR0ZXJuIHVzZWQgYnkgb3RoZXIgc2NvcGUgZXZlbnRzLlxuICAgKlxuICAgKiBDb25zdW1lcnMgY2FsbCB0aGlzIHZpYSB0aGUgYHNjb3BlLiRlbWl0KG5hbWUsIHBheWxvYWQpYCBzY29wZSBtZXRob2Q7XG4gICAqIHRoZSBtZXRob2Qgcm91dGVzIGhlcmUgdmlhIGBjcmVhdGVUeXBlZFNjb3BlYC5cbiAgICovXG4gIGVtaXRFdmVudChuYW1lOiBzdHJpbmcsIHBheWxvYWQ6IHVua25vd24pOiB2b2lkIHtcbiAgICAvLyBBbiBlbmRlZCBhdHRlbXB0IGVtaXRzIG5vdGhpbmcg4oCUIHJlZnVzZWQgKGFuZCByZWNvcmRlZCkgYmVmb3JlIHRoZSBmYXN0IHBhdGgsIHNvIHRoZSByZWNvcmQgZG9lcyBub3QgZGVwZW5kXG4gICAgLy8gb24gd2hldGhlciBhIHJlY29yZGVyIGhhcHBlbmVkIHRvIGJlIGF0dGFjaGVkLlxuICAgIHRoaXMucmVmdXNlSWZBdHRlbXB0RW5kZWQobmFtZSwgJ2VtaXQnKTtcbiAgICAvLyBGYXN0LXBhdGg6IHplcm8gd29yayB3aGVuIG5vIHJlY29yZGVycyBhcmUgYXR0YWNoZWQuXG4gICAgaWYgKHRoaXMuX3JlY29yZGVycy5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgIC8vIFJlZGFjdGlvbjogaWYgdGhlIGV2ZW50IG5hbWUgbWF0Y2hlcyBhbnkgZW1pdFBhdHRlcm4sIHJlcGxhY2UgcGF5bG9hZFxuICAgIC8vIHdpdGggJ1tSRURBQ1RFRF0nIEJFRk9SRSBjb25zdHJ1Y3RpbmcgdGhlIGV2ZW50IChubyBsZWFrIHRocm91Z2hcbiAgICAvLyBjb3B5LW9uLXdyaXRlLCBubyB3YXkgZm9yIHJlY29yZGVycyB0byBzZWUgdGhlIHJhdyB2YWx1ZSkuXG4gICAgY29uc3QgZmluYWxQYXlsb2FkID0gdGhpcy5ydWxlLnJldGFpbkVtaXQobmFtZSwgcGF5bG9hZCk7XG4gICAgY29uc3Qgc291cmNlUG9zaXRpb24gPSB0aGlzLl9zdGFnZUNvbnRleHQuY2FwdHVyZUVtaXRQb3NpdGlvbigpO1xuXG4gICAgLy8gQnVpbGQgdGhlIGVucmljaGVkIGV2ZW50IG9uY2U7IHBhc3MgdGhlIHNhbWUgcmVmZXJlbmNlIHRvIGFsbFxuICAgIC8vIHJlY29yZGVycyB1bmRlciB0aGVpciByZWFkLW9ubHkgY29udHJhY3QuIFNvdXJjZSBjb29yZGluYXRlcyBhcmVcbiAgICAvLyBjYXB0dXJlZCBiZWZvcmUgYW55IGlubGluZSBob29rIG9yIGRlZmVycmVkIHRhcCBvYnNlcnZlcyB0aGUgZXZlbnQuXG4gICAgY29uc3QgZXZlbnQgPSB7XG4gICAgICBuYW1lLFxuICAgICAgcGF5bG9hZDogZmluYWxQYXlsb2FkLFxuICAgICAgc3RhZ2VOYW1lOiB0aGlzLl9zdGFnZU5hbWUsXG4gICAgICBydW50aW1lU3RhZ2VJZDogdGhpcy5fc3RhZ2VDb250ZXh0LnJ1bnRpbWVTdGFnZUlkLFxuICAgICAgc3ViZmxvd1BhdGg6IHRoaXMuX2dldFN1YmZsb3dQYXRoKCksXG4gICAgICBwaXBlbGluZUlkOiB0aGlzLl9zdGFnZUNvbnRleHQucnVuSWQsXG4gICAgICB0aW1lc3RhbXA6IERhdGUubm93KCksXG4gICAgICAuLi4oc291cmNlUG9zaXRpb24gPT09IHVuZGVmaW5lZCA/IHt9IDogeyBzb3VyY2VQb3NpdGlvbiB9KSxcbiAgICB9IGFzIGNvbnN0O1xuXG4gICAgLy8gRGlzcGF0Y2ggd2l0aCBlcnJvciBpc29sYXRpb24g4oCUIHRoZSBzYW1lIGBmaXJlYCBsb29wIGFuZCB0aGUgc2FtZSBmYWlsdXJlIHJvdXRpbmcgYXNcbiAgICAvLyBldmVyeSBvdGhlciBzY29wZSBldmVudDogYSB0aHJvd2luZyByZWNvcmRlcidzIGVycm9yIHJlYWNoZXMgb25FcnJvciBvbiB0aGUgcmVjb3JkZXJzO1xuICAgIC8vIHRoZSBlbWl0IGxvb3AgY29udGludWVzIHVuYWZmZWN0ZWQuXG4gICAgZmlyZSh0aGlzLl9yZWNvcmRlcnMsICdvbkVtaXQnLCB0aGlzLl9jb3JyZWxhdGVkKGV2ZW50KSwgdGhpcy5fcm91dGVGYWlsdXJlKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBEZXRhY2gg4oCUIGZpcmUtYW5kLWZvcmdldCBjaGlsZCBmbG93Y2hhcnQgZXhlY3V0aW9uIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAvL1xuICAvLyBEZWxlZ2F0ZXMgdG8gdGhlIHNoYXJlZCBgZGV0YWNoL3NwYXduYCBoZWxwZXIsIHdoaWNoIG1pbnRzIGEgcmVmSWRcbiAgLy8gZnJvbSB0aGlzIHN0YWdlJ3MgYHJ1bnRpbWVTdGFnZUlkYCBhbmQgY2FsbHMgYGRyaXZlci5zY2hlZHVsZSgpYC5cbiAgLy8gUm91dGVkIHRocm91Z2ggYGNyZWF0ZVR5cGVkU2NvcGVgIGFzIGBzY29wZS4kZGV0YWNoQW5kSm9pbkxhdGVyKC4uLilgXG4gIC8vIGFuZCBgc2NvcGUuJGRldGFjaEFuZEZvcmdldCguLi4pYC5cblxuICAvKiogU2VlIGBTY29wZU1ldGhvZHMuJGRldGFjaEFuZEpvaW5MYXRlcmAuICovXG4gIGRldGFjaEFuZEpvaW5MYXRlcihkcml2ZXI6IERldGFjaERyaXZlciwgY2hpbGQ6IEZsb3dDaGFydCwgaW5wdXQ/OiB1bmtub3duKTogRGV0YWNoSGFuZGxlIHtcbiAgICB0aGlzLnJlZnVzZUlmQXR0ZW1wdEVuZGVkKGRldGFjaEtleShjaGlsZCksICdkZXRhY2gnKTtcbiAgICByZXR1cm4gZGV0YWNoQW5kSm9pbkxhdGVyU3Bhd24oZHJpdmVyLCBjaGlsZCwgaW5wdXQsIHRoaXMuX3N0YWdlQ29udGV4dC5ydW50aW1lU3RhZ2VJZCk7XG4gIH1cblxuICAvKiogU2VlIGBTY29wZU1ldGhvZHMuJGRldGFjaEFuZEZvcmdldGAuICovXG4gIGRldGFjaEFuZEZvcmdldChkcml2ZXI6IERldGFjaERyaXZlciwgY2hpbGQ6IEZsb3dDaGFydCwgaW5wdXQ/OiB1bmtub3duKTogdm9pZCB7XG4gICAgdGhpcy5yZWZ1c2VJZkF0dGVtcHRFbmRlZChkZXRhY2hLZXkoY2hpbGQpLCAnZGV0YWNoJyk7XG4gICAgZGV0YWNoQW5kRm9yZ2V0U3Bhd24oZHJpdmVyLCBjaGlsZCwgaW5wdXQsIHRoaXMuX3N0YWdlQ29udGV4dC5ydW50aW1lU3RhZ2VJZCk7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGQgdGhlIHN1YmZsb3dQYXRoIChvdXRlciDihpIgaW5uZXIpIGZvciBldmVudCBlbnJpY2htZW50LlxuICAgKlxuICAgKiBQYXJzZXMgZnJvbSBgcnVudGltZVN0YWdlSWRgIHdoaWNoIGhhcyB0aGUgZm9ybWF0XG4gICAqIGBbc3ViZmxvd1BhdGgvXXN0YWdlSWQjZXhlY3V0aW9uSW5kZXhgIChzZWUgYGxpYi9pZHMvcnVudGltZVN0YWdlSWQudHNgKS5cbiAgICogU3ViZmxvdyBpc29sYXRpb24gcHJldmVudHMgd2Fsa2luZyB0aGUgcGFyZW50LWNoYWluIGFjcm9zcyBib3VuZGFyaWVzLFxuICAgKiBzbyB0aGUgcnVudGltZVN0YWdlSWQg4oCUIGdsb2JhbGx5IHVuaXF1ZSwgaW5jbHVkZXMgZnVsbCBwYXRoIOKAlCBpcyB0aGVcbiAgICogY2Fub25pY2FsIHNvdXJjZSBvZiB0cnV0aCBmb3IgdGhlIHN1YmZsb3cgaGllcmFyY2h5IGF0IGVtaXQgdGltZS5cbiAgICpcbiAgICogRXhhbXBsZXM6XG4gICAqICAgJ3NlZWQjMCcgICAgICAgICAgICAgICAgIOKGkiBbXSAgICAgICAgICAgICAgICAgICAgKHJvb3QpXG4gICAqICAgJ3NmLWlubmVyL2lubmVyIzUnICAgICAgIOKGkiBbJ3NmLWlubmVyJ11cbiAgICogICAnc2YtYS9zZi1iL3N0YWdlIzMnICAgICAg4oaSIFsnc2YtYScsICdzZi1iJ10gICAgICAobmVzdGVkKVxuICAgKi9cbiAgcHJpdmF0ZSBfZ2V0U3ViZmxvd1BhdGgoKTogcmVhZG9ubHkgc3RyaW5nW10ge1xuICAgIGNvbnN0IHJ0aWQgPSB0aGlzLl9zdGFnZUNvbnRleHQucnVudGltZVN0YWdlSWQ7XG4gICAgaWYgKCFydGlkKSByZXR1cm4gU2NvcGVGYWNhZGUuX0VNUFRZX1NVQkZMT1dfUEFUSDtcbiAgICAvLyBUaGUgZ3JhbW1hcidzIG9uZSBvd25lciByZWFkcyB0aGUgcGF0aCBwb3J0aW9uIChgaWRzL3J1bnRpbWVTdGFnZUlkLnRzYCkuXG4gICAgY29uc3Qgc2VnbWVudHMgPSBzdWJmbG93U2VnbWVudHNPZihydGlkKTtcbiAgICBpZiAoc2VnbWVudHMubGVuZ3RoID09PSAwKSByZXR1cm4gU2NvcGVGYWNhZGUuX0VNUFRZX1NVQkZMT1dfUEFUSDtcbiAgICByZXR1cm4gT2JqZWN0LmZyZWV6ZShzZWdtZW50cyk7XG4gIH1cblxuICAvLyDilIDilIAgTm9uLVRyYWNraW5nIFN0YXRlIEluc3BlY3Rpb24gKGZvciBUeXBlZFNjb3BlIHByb3h5IGludGVybmFscykg4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqIFJldHVybnMgYWxsIHN0YXRlIGtleXMgd2l0aG91dCBmaXJpbmcgb25SZWFkLiBVc2VkIGJ5IFR5cGVkU2NvcGUgb3duS2V5cy9oYXMgdHJhcHMuICovXG4gIGdldFN0YXRlS2V5cygpOiBzdHJpbmdbXSB7XG4gICAgdGhpcy5yZWZ1c2VJZkF0dGVtcHRFbmRlZCgnKicpO1xuICAgIGNvbnN0IHNuYXBzaG90ID0gdGhpcy5fc3RhZ2VDb250ZXh0LmdldFZhbHVlKFtdLCB1bmRlZmluZWQpO1xuICAgIGlmICghc25hcHNob3QgfHwgdHlwZW9mIHNuYXBzaG90ICE9PSAnb2JqZWN0JykgcmV0dXJuIFtdO1xuICAgIHJldHVybiBPYmplY3Qua2V5cyhzbmFwc2hvdCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik7XG4gIH1cblxuICAvKiogQ2hlY2sga2V5IGV4aXN0ZW5jZSB3aXRob3V0IGZpcmluZyBvblJlYWQuIFVzZWQgYnkgVHlwZWRTY29wZSBoYXMgdHJhcC5cbiAgICogIENvbnRyYWN0OiByZXR1cm5zIGZhbHNlIGZvciBrZXlzIG5ldmVyIHNldCBPUiBrZXlzIHNldCB0byB1bmRlZmluZWQuXG4gICAqICBUaGlzIG1hdGNoZXMgZGVsZXRlVmFsdWUoKSBzZW1hbnRpY3MgKHNldHMgdG8gdW5kZWZpbmVkID0gZGVsZXRlZCkuICovXG4gIGhhc0tleShrZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHRoaXMucmVmdXNlSWZBdHRlbXB0RW5kZWQoa2V5KTtcbiAgICByZXR1cm4gdGhpcy5fc3RhZ2VDb250ZXh0LmdldFZhbHVlKFtdLCBrZXkpICE9PSB1bmRlZmluZWQ7XG4gIH1cblxuICAvKiogUmVhZCBzdGF0ZSB3aXRob3V0IGZpcmluZyBvblJlYWQuIFVzZWQgYnkgYXJyYXkgcHJveHkgZ2V0Q3VycmVudCgpIHRvIGF2b2lkXG4gICAqICBwaGFudG9tIHJlYWRzIG9uIGludGVybmFsIGFycmF5IG9wZXJhdGlvbnMgKC5sZW5ndGgsIC5oYXMsIGl0ZXJhdGlvbiwgZXRjLikuXG4gICAqICBUaGUgaW5pdGlhbCBwcm9wZXJ0eSBhY2Nlc3MgZmlyZXMgb25lIHRyYWNrZWQgb25SZWFkIHZpYSBnZXRWYWx1ZSgpOyBzdWJzZXF1ZW50XG4gICAqICBpbnRlcm5hbCBhcnJheSBvcGVyYXRpb25zIHVzZSB0aGlzIG1ldGhvZCB0byBzdGF5IHNpbGVudC5cbiAgICogIE5PVEU6IExpa2UgZ2V0VmFsdWUoKSwgcmV0dXJucyB0aGUgcmF3IHZhbHVlIHRvIHRoZSBjYWxsZXIuIFJlZGFjdGlvbiBhcHBsaWVzXG4gICAqICBvbmx5IHRvIHJlY29yZGVyIGRpc3BhdGNoIOKAlCBpdCBkb2VzIG5vdCBmaWx0ZXIgdGhlIHJldHVybmVkIHZhbHVlLiBUaGlzIG1hdGNoZXNcbiAgICogIHRoZSBleGlzdGluZyBnZXRWYWx1ZSgpIGNvbnRyYWN0IHdoZXJlIHVzZXIgY29kZSBhbHdheXMgcmVjZWl2ZXMgcmF3IGRhdGEuXG4gICAqXG4gICAqICBSRkMtMDAzIEQyOiBhIHNpbGVudCByZWFkIG9mIGEga2V5IHRoaXMgc3RhZ2UgbmV2ZXIgVFJBQ0tFRC1yZWFkIG1hcmtzXG4gICAqICB0aGUgc3RhZ2UncyBjb21taXQgd2l0aCBgdW50cmFja2VkU291cmNlczogWydzaWxlbnQnXWAg4oCUIGEgY2F1c2FsIHNsaWNlXG4gICAqICBidWlsdCBmcm9tIG9uUmVhZCBldmVudHMgd291bGQgbWlzcyB0aGlzIGRlcGVuZGVuY3ksIGFuZCBjb25zdW1lcnMgbXVzdFxuICAgKiAgYmUgdG9sZC4gU2lsZW50IHJlYWRzIHNoYWRvd2VkIGJ5IGEgdHJhY2tlZCByZWFkIG9mIHRoZSBzYW1lIGtleSAodGhlXG4gICAqICBhcnJheS1wcm94eSBwYXR0ZXJuIGFib3ZlKSBhcmUgbm90IGZsYWdnZWQ6IHRoZWlyIGVkZ2UgaXMgY2FwdHVyZWQuIEFcbiAgICogIHdob2xlLXN0YXRlIHNpbGVudCByZWFkIChubyBrZXkpIGlzIGFsd2F5cyBmbGFnZ2VkLiAqL1xuICBnZXRWYWx1ZVNpbGVudChrZXk/OiBzdHJpbmcpOiB1bmtub3duIHtcbiAgICB0aGlzLnJlZnVzZUlmQXR0ZW1wdEVuZGVkKGtleSA/PyAnKicpO1xuICAgIGlmIChrZXkgPT09IHVuZGVmaW5lZCB8fCAhdGhpcy5fdHJhY2tlZFJlYWRLZXlzLmhhcyhrZXkpKSB7XG4gICAgICB0aGlzLl9zdGFnZUNvbnRleHQubWFya1VudHJhY2tlZFNvdXJjZSgnc2lsZW50Jyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9zdGFnZUNvbnRleHQuZ2V0VmFsdWVEaXJlY3QoW10sIGtleSk7XG4gIH1cblxuICAvLyDilIDilIAgU3RhdGUgQWNjZXNzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIGdldEluaXRpYWxWYWx1ZUZvcihrZXk6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLl9zdGFnZUNvbnRleHQuZ2V0R2xvYmFsPy4oa2V5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUcmFja2VkIHJlYWQgb2Ygc2hhcmVkIHN0YXRlLlxuICAgKlxuICAgKiAqKlJlYWQgdmFsdWVzIGFyZSBCT1JST1dFRCDigJQgZG8gbm90IG11dGF0ZSB0aGVtLioqIFNpbmNlIHRoZSBsYXp5IGJ1ZmZlclxuICAgKiAoIzEzKSwgcmVhZHMgYmVmb3JlIHRoZSBzdGFnZSdzIGZpcnN0IHdyaXRlIHJldHVybiByZWZlcmVuY2VzIElOVE9cbiAgICogQ09NTUlUVEVEIFNIQVJFRCBTVEFURSwgYW5kIHJlYWRzIGFmdGVyIGEgd3JpdGUgcmV0dXJuIHJlZmVyZW5jZXMgaW50b1xuICAgKiB0aGUgc3RhZ2UncyBwcml2YXRlIHRyYW5zYWN0aW9uLWJ1ZmZlciB3b3JraW5nIGNvcHkgKHRoZSBlYWdlciBlbmdpbmVcbiAgICogcmV0dXJuZWQgcmVmZXJlbmNlcyBpbnRvIHRoYXQgd29ya2luZyBjb3B5IGZvciBBTEwgcmVhZHMpLiBNdXRhdGluZyBhXG4gICAqIHJldHVybmVkIHZhbHVlIGluIHBsYWNlIHdvdWxkIGNvcnJ1cHQgc3RhdGUgd2l0aG91dCBhIGNvbW1pdCByZWNvcmQg4oCUXG4gICAqIHdyaXRlIGNoYW5nZXMgYmFjayB2aWEgYHNldFZhbHVlYC9gdXBkYXRlVmFsdWVgIGluc3RlYWQuIFR5cGVkU2NvcGVcbiAgICogY29uc3VtZXJzIGFyZSBzYWZlIGF1dG9tYXRpY2FsbHk6IHRoZSBwcm94eSByb3V0ZXMgZXZlcnkgbXV0YXRpb25cbiAgICogdGhyb3VnaCBgc2V0VmFsdWVgL2B1cGRhdGVWYWx1ZWAvY29weS1vbi13cml0ZSBhcnJheSBvcHMuXG4gICAqXG4gICAqIFRoZXJlIGlzIGRlbGliZXJhdGVseSBOTyBkZXYtbW9kZSBmcmVlemUgZ3VhcmQgaGVyZTogZGVlcC1mcmVlemluZyBhXG4gICAqIGJ1ZmZlci1zZXJ2ZWQgcmVhZCB3b3VsZCBmcmVlemUgdGhlIHN0YWdlJ3Mgb3duIHdvcmtpbmcgY29weSBhbmQgbWFrZSBhXG4gICAqIGxlZ2l0aW1hdGUgcmVhZC10aGVuLWRlZXAtd3JpdGUgdGhyb3csIGFuZCBmcmVlemluZyBhIGNvbW1pdHRlZC1zdGF0ZVxuICAgKiByZWFkIG11dGF0ZXMgYW4gb2JqZWN0IHNoYXJlZCB3aXRoIGV2ZXJ5IG90aGVyIGNvbnN1bWVyIG9mIHRoZSBsaXZlXG4gICAqIHN0YXRlLiBTZWUgYHNyYy9saWIvbWVtb3J5L1JFQURNRS5tZGAgKFwiUmVhZCB2YWx1ZXMgYXJlIGJvcnJvd2VkXCIpLlxuICAgKlxuICAgKiBSZWNvcmRlciBub3RlOiB0aGUgYG9uUmVhZGAgZXZlbnQgYmVsb3cgcGFzc2VzIHRoZSBTQU1FIGxpdmUgcmVmZXJlbmNlXG4gICAqIChubyBjbG9uZSkgdW5sZXNzIGZpZWxkLWxldmVsIHJlZGFjdGlvbiBzY3J1YnMgYSBjb3B5IOKAlCByZWNvcmRlcnMgbXVzdFxuICAgKiB0cmVhdCBldmVudCB2YWx1ZXMgYXMgcmVhZC1vbmx5IHRvby5cbiAgICovXG4gIGdldFZhbHVlKGtleT86IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmdldFZhbHVlQXQoW10sIGtleSk7XG4gIH1cblxuICAvKipcbiAgICogUGF0aC1hd2FyZSBhZGFwdGVyIGFjY2Vzcy4gU2VnbWVudHMgc3RheSBzZXBhcmF0ZSBmcm9tIGxpdGVyYWwgZG90dGVkIGtleXMgaW4gU1RBVEU7XG4gICAqIHRoZSByZWNvcmRlciBldmVudCdzIGBrZXlgIGlzIG9ubHkgYSBkb3Qtam9pbmVkIGRpc3BsYXkgbGFiZWwsIHNvIGBbJ3VzZXInLCdzc24nXWAgYW5kXG4gICAqIGEgbGl0ZXJhbCB0b3AtbGV2ZWwgYCd1c2VyLnNzbidgIHByb2R1Y2UgdGhlIHNhbWUgZXZlbnQga2V5IChzYW1lIGZvciB0aGUgd3JpdGVzIGJlbG93KS5cbiAgICovXG4gIGdldFZhbHVlQXQocGF0aDogc3RyaW5nW10sIGtleT86IHN0cmluZykge1xuICAgIHRoaXMucmVmdXNlSWZBdHRlbXB0RW5kZWQoa2V5ID09PSB1bmRlZmluZWQgPyBwYXRoLmpvaW4oJy4nKSB8fCAnKicgOiBbLi4ucGF0aCwga2V5XS5qb2luKCcuJykpO1xuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5fc3RhZ2VDb250ZXh0LmdldFZhbHVlKHBhdGgsIGtleSk7XG5cbiAgICAvLyBSRkMtMDAzIEQyOiByZW1lbWJlciB0cmFja2VkIGtleXMgc28gbGF0ZXIgU0lMRU5UIHJlYWRzIG9mIHRoZSBzYW1lXG4gICAgLy8ga2V5IGNvdW50IGFzIHNoYWRvd2VkIChlZGdlIGFscmVhZHkgY2FwdHVyZWQpIGluc3RlYWQgb2YgdW50cmFja2VkLlxuICAgIC8vIE9ubHkgYSB3aG9sZSB0b3AtbGV2ZWwgdmFsdWUgc2hhZG93cyBhIGxhdGVyIHNpbGVudCByZWFkIG9mIHRoYXQgdmFsdWUuXG4gICAgLy8gUmVhZGluZyBvbmUgbmVzdGVkIGZpZWxkIG11c3Qgbm90IGNsYWltIHRvIGhhdmUgb2JzZXJ2ZWQgaXRzIHNpYmxpbmdzLlxuICAgIGlmIChwYXRoLmxlbmd0aCA9PT0gMCAmJiBrZXkgIT09IHVuZGVmaW5lZCkgdGhpcy5fdHJhY2tlZFJlYWRLZXlzLmFkZChrZXkpO1xuICAgIGVsc2UgaWYgKHBhdGgubGVuZ3RoID09PSAxICYmIGtleSA9PT0gdW5kZWZpbmVkKSB0aGlzLl90cmFja2VkUmVhZEtleXMuYWRkKHBhdGhbMF0hKTtcblxuICAgIGlmICh0aGlzLl9yZWNvcmRlcnMubGVuZ3RoID4gMCkge1xuICAgICAgLy8gQSB3aG9sZS1zdGF0ZSByZWFkIChubyBrZXkpIGlzIHNlcnZlZCB3aXRoIGV2ZXJ5IHJlZGFjdGVkIGtleSBpbnNpZGVcbiAgICAgIC8vIGl0IHNjcnViYmVkOyBhIGtleWVkIHJlYWQgaXMgc2VydmVkIHVuZGVyIHRoZSBrZXkncyB2ZXJkaWN0LlxuICAgICAgY29uc3Qgd2hvbGVTdGF0ZSA9IHBhdGgubGVuZ3RoID09PSAwICYmIGtleSA9PT0gdW5kZWZpbmVkO1xuICAgICAgY29uc3QgdmVyZGljdCA9IHdob2xlU3RhdGUgPyBDTEVBUiA6IGtleSA9PT0gdW5kZWZpbmVkID8gdGhpcy5ydWxlLnZlcmRpY3QocGF0aCkgOiB0aGlzLnJ1bGUudmVyZGljdEF0KHBhdGgsIGtleSk7XG4gICAgICBjb25zdCByZWNvcmRlclZhbHVlID0gd2hvbGVTdGF0ZSA/IHRoaXMucnVsZS5yZXRhaW5SZWNvcmQodmFsdWUpIDogUmVkYWN0aW9uUnVsZS5hcHBseSh2ZXJkaWN0LCB2YWx1ZSk7XG4gICAgICBjb25zdCBldmVudEtleSA9IHBhdGgubGVuZ3RoID09PSAwID8ga2V5IDogKGtleSA9PT0gdW5kZWZpbmVkID8gcGF0aCA6IFsuLi5wYXRoLCBrZXldKS5qb2luKCcuJyk7XG5cbiAgICAgIHRoaXMuX2ludm9rZUhvb2soJ29uUmVhZCcsIHtcbiAgICAgICAgc3RhZ2VOYW1lOiB0aGlzLl9zdGFnZU5hbWUsXG4gICAgICAgIHN0YWdlSWQ6IHRoaXMuX3N0YWdlQ29udGV4dC5zdGFnZUlkLFxuICAgICAgICBydW50aW1lU3RhZ2VJZDogdGhpcy5fc3RhZ2VDb250ZXh0LnJ1bnRpbWVTdGFnZUlkLFxuICAgICAgICBwaXBlbGluZUlkOiB0aGlzLl9zdGFnZUNvbnRleHQucnVuSWQsXG4gICAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgICAga2V5OiBldmVudEtleSxcbiAgICAgICAgdmFsdWU6IHJlY29yZGVyVmFsdWUsXG4gICAgICAgIHJlZGFjdGVkOiB2ZXJkaWN0LmtpbmQgIT09ICdjbGVhcicgfHwgdW5kZWZpbmVkLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgc2V0VmFsdWUoa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duLCBzaG91bGRSZWRhY3Q/OiBib29sZWFuLCBkZXNjcmlwdGlvbj86IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLnNldFZhbHVlQXQoW10sIGtleSwgdmFsdWUsIHNob3VsZFJlZGFjdCwgZGVzY3JpcHRpb24pO1xuICB9XG5cbiAgLyoqIFBhdGgtYXdhcmUgd3JpdGVzIHNoYXJlIHJlY29yZGluZywgcmVkYWN0aW9uIGFuZCBsaWZldGltZSBwb2xpY3kgd2l0aCBmbGF0IHdyaXRlcy4gKi9cbiAgc2V0VmFsdWVBdChwYXRoOiBzdHJpbmdbXSwga2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duLCBzaG91bGRSZWRhY3Q/OiBib29sZWFuLCBkZXNjcmlwdGlvbj86IHN0cmluZykge1xuICAgIGNvbnN0IGV2ZW50S2V5ID0gcGF0aC5sZW5ndGggPT09IDAgPyBrZXkgOiBbLi4ucGF0aCwga2V5XS5qb2luKCcuJyk7XG4gICAgYXNzZXJ0Tm90UmVhZG9ubHkodGhpcy5fcmVhZE9ubHlWYWx1ZXMsIHBhdGhbMF0gPz8ga2V5LCAnd3JpdGUnKTtcbiAgICB0aGlzLmFzc2VydExpdmUoZXZlbnRLZXkpO1xuXG4gICAgLy8gRGV2LW1vZGU6IHdhcm4gaWYgdGhlIHZhbHVlIGNvbnRhaW5zIGNpcmN1bGFyIHJlZmVyZW5jZXMuXG4gICAgLy8gQ2hlY2sgQUZURVIgYXNzZXJ0Tm90UmVhZG9ubHkg4oCUIGRvbid0IHdhcm4gZm9yIHdyaXRlcyB0aGF0IHdpbGwgYmUgYmxvY2tlZC5cbiAgICAvLyBDaXJjdWxhciB2YWx1ZXMgd29yayAodGVybWluYWwgcHJveHkgaGFuZGxlcyB0aGVtKSBidXQgY2FuIHByb2R1Y2VcbiAgICAvLyBzdXJwcmlzaW5nIGJlaGF2aW9yIGluIG5hcnJhdGl2ZSwgSlNPTiBzZXJpYWxpemF0aW9uLCBhbmQgc25hcHNob3RzLlxuICAgIGlmIChpc0Rldk1vZGUoKSAmJiB2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgICBpZiAoaGFzQ2lyY3VsYXJSZWZlcmVuY2UodmFsdWUpKSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICBgW2Zvb3RwcmludF0gQ2lyY3VsYXIgcmVmZXJlbmNlIGRldGVjdGVkIGluIHNldFZhbHVlKCcke2V2ZW50S2V5fScpLiBgICtcbiAgICAgICAgICAgICdXcml0ZXMgcGFzdCB0aGUgY3ljbGUgZGVwdGggd2lsbCB1c2UgdGVybWluYWwgcHJveHkgdHJhY2tpbmcuICcgK1xuICAgICAgICAgICAgJ0NvbnNpZGVyIGZsYXR0ZW5pbmcgdGhlIGRhdGEgc3RydWN0dXJlLicsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVGhlIGNvbnRleHQgaXMgdGhlIE9ORSBmdW5uZWw6IGl0IGRlY2lkZXMgdGhlIHZlcmRpY3QgKGV4cGxpY2l0IGZsYWcsXG4gICAgLy8gcG9saWN5IGtleS9wYXR0ZXJuLCBwZXItcnVuIG1hcmssIG9yIGZpZWxkLWxldmVsIHNjcnViKSwgc3RhZ2VzIHRoZVxuICAgIC8vIHdyaXRlIHdpdGggdGhlIHBhdGhzIHRoZSBsb2cgd2lsbCBzY3J1YiwgYW5kIGhhbmRzIHRoZSB2ZXJkaWN0IGJhY2sgc29cbiAgICAvLyByZWNvcmRlcnMgc2VlIHRoZSBzYW1lIGRlY2lzaW9uIHRoZSByZXRhaW5lZCByZWNvcmQgaG9sZHMuXG4gICAgY29uc3QgdmVyZGljdCA9IHRoaXMuX3N0YWdlQ29udGV4dC5zZXRPYmplY3QocGF0aCwga2V5LCB2YWx1ZSwgc2hvdWxkUmVkYWN0LCBkZXNjcmlwdGlvbik7XG5cbiAgICBpZiAodGhpcy5fcmVjb3JkZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuX2ludm9rZUhvb2soJ29uV3JpdGUnLCB7XG4gICAgICAgIHN0YWdlTmFtZTogdGhpcy5fc3RhZ2VOYW1lLFxuICAgICAgICBzdGFnZUlkOiB0aGlzLl9zdGFnZUNvbnRleHQuc3RhZ2VJZCxcbiAgICAgICAgcnVudGltZVN0YWdlSWQ6IHRoaXMuX3N0YWdlQ29udGV4dC5ydW50aW1lU3RhZ2VJZCxcbiAgICAgICAgcGlwZWxpbmVJZDogdGhpcy5fc3RhZ2VDb250ZXh0LnJ1bklkLFxuICAgICAgICB0aW1lc3RhbXA6IERhdGUubm93KCksXG4gICAgICAgIGtleTogZXZlbnRLZXksXG4gICAgICAgIHZhbHVlOiBSZWRhY3Rpb25SdWxlLmFwcGx5KHZlcmRpY3QsIHZhbHVlKSxcbiAgICAgICAgb3BlcmF0aW9uOiAnc2V0JyxcbiAgICAgICAgcmVkYWN0ZWQ6IHZlcmRpY3Qua2luZCAhPT0gJ2NsZWFyJyB8fCB1bmRlZmluZWQsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICB1cGRhdGVWYWx1ZShrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24sIGRlc2NyaXB0aW9uPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMudXBkYXRlVmFsdWVBdChbXSwga2V5LCB2YWx1ZSwgZGVzY3JpcHRpb24pO1xuICB9XG5cbiAgLyoqIFBhdGgtYXdhcmUgbWVyZ2VzIHVzZSB0aGUgc2FtZSB3cml0ZSBmdW5uZWwgYXMgcmVwbGFjZW1lbnRzLiAqL1xuICB1cGRhdGVWYWx1ZUF0KHBhdGg6IHN0cmluZ1tdLCBrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24sIGRlc2NyaXB0aW9uPzogc3RyaW5nKSB7XG4gICAgY29uc3QgZXZlbnRLZXkgPSBwYXRoLmxlbmd0aCA9PT0gMCA/IGtleSA6IFsuLi5wYXRoLCBrZXldLmpvaW4oJy4nKTtcbiAgICBhc3NlcnROb3RSZWFkb25seSh0aGlzLl9yZWFkT25seVZhbHVlcywgcGF0aFswXSA/PyBrZXksICd3cml0ZScpO1xuICAgIHRoaXMuYXNzZXJ0TGl2ZShldmVudEtleSk7XG5cbiAgICAvLyBEZXYtbW9kZTogc2FtZSBjaXJjdWxhciBjaGVjayBhcyBzZXRWYWx1ZSAobWVyZ2UgdGFyZ2V0cyBjYW4gYmUgY2lyY3VsYXIgdG9vKVxuICAgIGlmIChpc0Rldk1vZGUoKSAmJiB2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgICBpZiAoaGFzQ2lyY3VsYXJSZWZlcmVuY2UodmFsdWUpKSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICBgW2Zvb3RwcmludF0gQ2lyY3VsYXIgcmVmZXJlbmNlIGRldGVjdGVkIGluIHVwZGF0ZVZhbHVlKCcke2V2ZW50S2V5fScpLiBgICtcbiAgICAgICAgICAgICdDb25zaWRlciBmbGF0dGVuaW5nIHRoZSBkYXRhIHN0cnVjdHVyZS4nLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHZlcmRpY3QgPSB0aGlzLl9zdGFnZUNvbnRleHQudXBkYXRlT2JqZWN0KHBhdGgsIGtleSwgdmFsdWUsIGRlc2NyaXB0aW9uKTtcblxuICAgIGlmICh0aGlzLl9yZWNvcmRlcnMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5faW52b2tlSG9vaygnb25Xcml0ZScsIHtcbiAgICAgICAgc3RhZ2VOYW1lOiB0aGlzLl9zdGFnZU5hbWUsXG4gICAgICAgIHN0YWdlSWQ6IHRoaXMuX3N0YWdlQ29udGV4dC5zdGFnZUlkLFxuICAgICAgICBydW50aW1lU3RhZ2VJZDogdGhpcy5fc3RhZ2VDb250ZXh0LnJ1bnRpbWVTdGFnZUlkLFxuICAgICAgICBwaXBlbGluZUlkOiB0aGlzLl9zdGFnZUNvbnRleHQucnVuSWQsXG4gICAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgICAga2V5OiBldmVudEtleSxcbiAgICAgICAgdmFsdWU6IFJlZGFjdGlvblJ1bGUuYXBwbHkodmVyZGljdCwgdmFsdWUpLFxuICAgICAgICBvcGVyYXRpb246ICd1cGRhdGUnLFxuICAgICAgICByZWRhY3RlZDogdmVyZGljdC5raW5kICE9PSAnY2xlYXInIHx8IHVuZGVmaW5lZCxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGRlbGV0ZVZhbHVlKGtleTogc3RyaW5nLCBkZXNjcmlwdGlvbj86IHN0cmluZykge1xuICAgIGFzc2VydE5vdFJlYWRvbmx5KHRoaXMuX3JlYWRPbmx5VmFsdWVzLCBrZXksICdkZWxldGUnKTtcbiAgICB0aGlzLmFzc2VydExpdmUoa2V5KTtcblxuICAgIC8vIERlbGV0aW5nIGEga2V5IGNsZWFycyBpdHMgcGVyLWNhbGwgcmVkYWN0aW9uIG1hcmsgKHRoZSBjb250ZXh0J3NcbiAgICAvLyBmdW5uZWwgZG9lcyB0aGF0KTsgYSBwb2xpY3kgdmVyZGljdCBvbiB0aGUga2V5IHN1cnZpdmVzLlxuICAgIHRoaXMuX3N0YWdlQ29udGV4dC5zZXRPYmplY3QoW10sIGtleSwgdW5kZWZpbmVkLCBmYWxzZSwgZGVzY3JpcHRpb24gPz8gYGRlbGV0ZWQgJHtrZXl9YCwgJ2RlbGV0ZScpO1xuXG4gICAgaWYgKHRoaXMuX3JlY29yZGVycy5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLl9pbnZva2VIb29rKCdvbldyaXRlJywge1xuICAgICAgICBzdGFnZU5hbWU6IHRoaXMuX3N0YWdlTmFtZSxcbiAgICAgICAgc3RhZ2VJZDogdGhpcy5fc3RhZ2VDb250ZXh0LnN0YWdlSWQsXG4gICAgICAgIHJ1bnRpbWVTdGFnZUlkOiB0aGlzLl9zdGFnZUNvbnRleHQucnVudGltZVN0YWdlSWQsXG4gICAgICAgIHBpcGVsaW5lSWQ6IHRoaXMuX3N0YWdlQ29udGV4dC5ydW5JZCxcbiAgICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxuICAgICAgICBrZXksXG4gICAgICAgIHZhbHVlOiB1bmRlZmluZWQsXG4gICAgICAgIG9wZXJhdGlvbjogJ2RlbGV0ZScsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIHNldEdsb2JhbChrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24sIGRlc2NyaXB0aW9uPzogc3RyaW5nKSB7XG4gICAgdGhpcy5hc3NlcnRMaXZlKGtleSk7XG4gICAgcmV0dXJuIHRoaXMuX3N0YWdlQ29udGV4dC5zZXRHbG9iYWw/LihrZXksIHZhbHVlLCBkZXNjcmlwdGlvbik7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIGdldEdsb2JhbChrZXk6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLl9zdGFnZUNvbnRleHQuZ2V0R2xvYmFsPy4oa2V5KTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgc2V0T2JqZWN0SW5Sb290KGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bikge1xuICAgIHRoaXMuYXNzZXJ0TGl2ZShrZXkpO1xuICAgIHJldHVybiB0aGlzLl9zdGFnZUNvbnRleHQuc2V0Um9vdD8uKGtleSwgdmFsdWUpO1xuICB9XG5cbiAgLy8g4pSA4pSAIFJlYWQtb25seSArIG1pc2Mg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHJlYWRvbmx5IGlucHV0IHZhbHVlcyBwYXNzZWQgdG8gdGhpcyBwaXBlbGluZSwgY2FzdCB0byBgVGAuXG4gICAqIE9yZGluYXJ5IG11dGFibGUgcmVjb3Jkcy9hcnJheXMgYXJlIGNvcGllZCBhbmQgZnJvemVuLCBub3QgZnJvemVuIGluIHBsYWNlLlxuICAgKiBPcGFxdWUgY2FwYWJpbGl0aWVzIGFuZCBleHBsaWNpdGx5IGZyb3plbiB3cmFwcGVycyByZW1haW4gYm9ycm93ZWQvbGl2ZTtcbiAgICogc2VlIGBwcm90ZWN0aW9uL3JlYWRvbmx5SW5wdXQudHMgwrcgY3JlYXRlRnJvemVuQXJnc2AgZm9yIHRoZSBvd25lcnNoaXAgcnVsZS5cbiAgICogQ2FjaGVkIGF0IGNvbnN0cnVjdGlvbiB0aW1lIGZvciB6ZXJvLWFsbG9jYXRpb24gcmVwZWF0ZWQgYWNjZXNzLlxuICAgKlxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHsgYXBwbGljYW50TmFtZSwgaW5jb21lIH0gPSBzY29wZS5nZXRBcmdzPHsgYXBwbGljYW50TmFtZTogc3RyaW5nOyBpbmNvbWU6IG51bWJlciB9PigpO1xuICAgKiBgYGBcbiAgICpcbiAgICogUkZDLTAwMyBEMjogYXJncyBhcmUgdW50cmFja2VkIEJZIERFU0lHTiwgc28gY2FsbGluZyB0aGlzICh3aXRoIGFjdHVhbFxuICAgKiBpbnB1dCBwcmVzZW50KSBtYXJrcyB0aGUgc3RhZ2UncyBjb21taXQgd2l0aCBgdW50cmFja2VkU291cmNlczogWydhcmdzJ11gXG4gICAqIOKAlCB0ZWxsaW5nIGNhdXNhbC1zbGljZSBjb25zdW1lcnMgdGhlIGJhY2t3YXJkIHNsaWNlIG1heSBiZSBpbmNvbXBsZXRlXG4gICAqIGhlcmUuIEFuIGVtcHR5LWFyZ3MgcmVhZCBjYXJyaWVzIG5vIGluZm9ybWF0aW9uIGFuZCBpcyBub3QgZmxhZ2dlZC5cbiAgICovXG4gIGdldEFyZ3M8VCA9IFJlY29yZDxzdHJpbmcsIHVua25vd24+PigpOiBUIHtcbiAgICB0aGlzLnJlZnVzZUlmQXR0ZW1wdEVuZGVkKCckYXJncycpO1xuICAgIGlmICh0aGlzLl9oYXNBcmdzKSB0aGlzLl9zdGFnZUNvbnRleHQubWFya1VudHJhY2tlZFNvdXJjZSgnYXJncycpO1xuICAgIHJldHVybiB0aGlzLl9mcm96ZW5BcmdzIGFzIFQ7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgZXhlY3V0aW9uIGVudmlyb25tZW50IOKAlCByZWFkLW9ubHkgaW5mcmFzdHJ1Y3R1cmUgdmFsdWVzXG4gICAqIHRoYXQgcHJvcGFnYXRlIHRocm91Z2ggbmVzdGVkIGV4ZWN1dG9ycyAobGlrZSBgcHJvY2Vzcy5lbnZgIGZvciBmbG93Y2hhcnRzKS5cbiAgICpcbiAgICogQ29udGFpbnM6IHNpZ25hbCAoYWJvcnQg4oCUIHRoZSBydW4ncyBvbmUgZWZmZWN0aXZlIHNpZ25hbCksIHRpbWVvdXRNcywgdHJhY2VJZCwgb3BlcmF0aW9uSWQsIHRyYWNlcGFyZW50LFxuICAgKiBkZWFkbGluZSAoZXBvY2ggbXMpIOKAlCB0aGUgcnVuJ3MgZW52IGFzIGFkbWl0dGVkIChgYXR0ZW1wdC9jb3JyZWxhdGlvbi50cyDCtyBhZG1pdFJ1bkVudmA6IG9uZSBvd24tZmllbGRcbiAgICogc25hcHNob3Q7IGB0cmFjZXBhcmVudGAgaXMgdGhlIGNhbm9uaWNhbCBoZWFkZXIgdGhlIHJ1bidzIGNvcnJlbGF0aW9uIGNhcnJpZXMsIG5ldmVyIHRoZSByZWNlaXZlZCBieXRlcyksIHRoZW5cbiAgICogYXJtZWQgKGBydW5uZXIvZGVhZGxpbmUudHMgwrcgYXJtUnVuYCkuIEZyb3plbiBhdCBjb25zdHJ1Y3Rpb24gdGltZS4gSW5oZXJpdGVkIGJ5IHN1YmZsb3dzIGF1dG9tYXRpY2FsbHkuXG4gICAqXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgeyBzaWduYWwsIHRyYWNlSWQgfSA9IHNjb3BlLmdldEVudigpO1xuICAgKiBgYGBcbiAgICpcbiAgICogUkZDLTAwMyBEMjogZW52IGlzIHVudHJhY2tlZCBCWSBERVNJR04sIHNvIGNhbGxpbmcgdGhpcyAod2l0aCBhXG4gICAqIG5vbi1lbXB0eSBlbnZpcm9ubWVudCkgbWFya3MgdGhlIHN0YWdlJ3MgY29tbWl0IHdpdGhcbiAgICogYHVudHJhY2tlZFNvdXJjZXM6IFsnZW52J11gIOKAlCBzZWUge0BsaW5rIGdldEFyZ3N9LlxuICAgKi9cbiAgZ2V0RW52KCk6IFJlYWRvbmx5PEV4ZWN1dGlvbkVudj4ge1xuICAgIHRoaXMucmVmdXNlSWZBdHRlbXB0RW5kZWQoJyRlbnYnKTtcbiAgICBpZiAodGhpcy5faGFzRW52KSB0aGlzLl9zdGFnZUNvbnRleHQubWFya1VudHJhY2tlZFNvdXJjZSgnZW52Jyk7XG4gICAgcmV0dXJuIHRoaXMuX2V4ZWN1dGlvbkVudjtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgZ2V0UGlwZWxpbmVJZCgpIHtcbiAgICByZXR1cm4gdGhpcy5fc3RhZ2VDb250ZXh0LnJ1bklkO1xuICB9XG5cbiAgLy8g4pSA4pSAIEludGVybmFsIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIHByaXZhdGUgX2ludm9rZUhvb2s8SyBleHRlbmRzIFNjb3BlSG9va05hbWU+KGhvb2s6IEssIGV2ZW50OiBIb29rUGF5bG9hZDxLPik6IHZvaWQge1xuICAgIC8vIFRoZSBvbmUgcGVyLXJlY29yZGVyIGxvb3AgKGByZWNvcmRlci9ob29rcy50cyDCtyBmaXJlYCkg4oCUIHRoZSBTQU1FIGludm9rZSBwcmltaXRpdmUgdGhlXG4gICAgLy8gZGVmZXJyZWQgdGllciB1c2VzIGF0IGRlbGl2ZXJ5IHRpbWUsIHNvIHRoZSBpbmxpbmUgYW5kIGRlZmVycmVkIHBhdGhzIGNhbm5vdCBkcmlmdC5cbiAgICBmaXJlKHRoaXMuX3JlY29yZGVycywgaG9vaywgdGhpcy5fY29ycmVsYXRlZChldmVudCBhcyBvYmplY3QpIGFzIEhvb2tQYXlsb2FkPEs+LCB0aGlzLl9yb3V0ZUZhaWx1cmUpO1xuICB9XG5cbiAgLyoqIFRoZSBldmVudCBhcyBmaXJlZDogdW5jaGFuZ2VkIHdpdGhvdXQgYSBjb3JyZWxhdGlvbiwgZWxzZSB3aXRoIHRoZSBydW4ncyBjb3JyZWxhdGlvbiBhcyBpdHMgbGFzdCBrZXkuICovXG4gIHByaXZhdGUgX2NvcnJlbGF0ZWQ8RSBleHRlbmRzIG9iamVjdD4oZXZlbnQ6IEUpOiBFIHtcbiAgICByZXR1cm4gdGhpcy5fY29ycmVsYXRpb24gPT09IHVuZGVmaW5lZCA/IGV2ZW50IDogeyAuLi5ldmVudCwgY29ycmVsYXRpb246IHRoaXMuX2NvcnJlbGF0aW9uIH07XG4gIH1cblxuICAvKipcbiAgICogVGhlIHNjb3BlIGNoYW5uZWwncyBpc29sYXRpb246IGEgcmVjb3JkZXIncyB0aHJvdyBiZWNvbWVzIGFuIGBvbkVycm9yYCBvbiBldmVyeSByZWNvcmRlclxuICAgKiAoc3RhbXBlZCB3aXRoIHRoaXMgc3RhZ2UpLCBhbmQgYSB0aHJvdyBmcm9tIGBvbkVycm9yYCBpdHNlbGYgaXMgZHJvcHBlZC5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgX3JvdXRlRmFpbHVyZTogSG9va0ZhaWx1cmUgPSAoZXJyb3IsIF9yZWNvcmRlciwgaG9vaykgPT4ge1xuICAgIGlmIChob29rID09PSAnb25FcnJvcicpIHJldHVybjtcbiAgICB0aGlzLl9pbnZva2VIb29rKFxuICAgICAgJ29uRXJyb3InLFxuICAgICAgcmVjb3JkZXJGYWlsdXJlRXZlbnQoXG4gICAgICAgIHtcbiAgICAgICAgICBzdGFnZU5hbWU6IHRoaXMuX3N0YWdlTmFtZSxcbiAgICAgICAgICBzdGFnZUlkOiB0aGlzLl9zdGFnZUNvbnRleHQuc3RhZ2VJZCxcbiAgICAgICAgICBydW50aW1lU3RhZ2VJZDogdGhpcy5fc3RhZ2VDb250ZXh0LnJ1bnRpbWVTdGFnZUlkLFxuICAgICAgICAgIHBpcGVsaW5lSWQ6IHRoaXMuX3N0YWdlQ29udGV4dC5ydW5JZCxcbiAgICAgICAgfSxcbiAgICAgICAgZXJyb3IsXG4gICAgICAgIGhvb2ssXG4gICAgICApLFxuICAgICk7XG4gIH07XG59XG5cbi8qKiBUaGUgc2lnbmFsIG9mIGEgc3RhZ2Ugb3V0c2lkZSB0aGUgcnVubmVyIGluIGEgcnVuIHdpdGggbm8gc2lnbmFsOiBvbmUgdGhhdCBuZXZlciBhYm9ydHMsIHNoYXJlZC4gKi9cbmNvbnN0IE5FVkVSX0FCT1JURUQ6IEFib3J0U2lnbmFsID0gbmV3IEFib3J0Q29udHJvbGxlcigpLnNpZ25hbDtcblxuLyoqIFRoZSBuYW1lIGEgbGF0ZSBkZXRhY2ggaXMgcmVjb3JkZWQgdW5kZXI6IHRoZSBjaGlsZCBjaGFydCdzIHJvb3QgaWQg4oCUIGEgbmFtZSwgbmV2ZXIgaXRzIGlucHV0LiAqL1xuZnVuY3Rpb24gZGV0YWNoS2V5KGNoaWxkOiBGbG93Q2hhcnQpOiBzdHJpbmcge1xuICBjb25zdCBpZCA9IChjaGlsZCBhcyB7IHJvb3Q/OiB7IGlkPzogdW5rbm93biB9IH0gfCB1bmRlZmluZWQpPy5yb290Py5pZDtcbiAgcmV0dXJuIHR5cGVvZiBpZCA9PT0gJ3N0cmluZycgPyBgZGV0YWNoOiR7aWR9YCA6ICdkZXRhY2gnO1xufVxuIl19
@@ -9,7 +9,7 @@
9
9
  * explicitly supply a smaller port (including `{}` for data-only scopes).
10
10
  */
11
11
  Object.defineProperty(exports, "__esModule", { value: true });
12
- exports.requireDecisionScopeRuntime = exports.requireScopeRuntime = exports.scopeRuntimeFor = exports.registerScopeRuntime = void 0;
12
+ exports.hasNativeCaptureTarget = exports.registerNativeCaptureTarget = exports.requireDecisionScopeRuntime = exports.requireScopeRuntime = exports.scopeRuntimeFor = exports.registerScopeRuntime = void 0;
13
13
  const runtimes = new WeakMap();
14
14
  function isObject(value) {
15
15
  return (typeof value === 'object' && value !== null) || typeof value === 'function';
@@ -64,4 +64,14 @@ function requireDecisionScopeRuntime(scope) {
64
64
  return requireScopeRuntime(scope, UNREGISTERED_DECISION);
65
65
  }
66
66
  exports.requireDecisionScopeRuntime = requireDecisionScopeRuntime;
67
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVudGltZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvc2NvcGUvcnVudGltZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7O0dBUUc7OztBQThCSCxNQUFNLFFBQVEsR0FBRyxJQUFJLE9BQU8sRUFBa0MsQ0FBQztBQUUvRCxTQUFTLFFBQVEsQ0FBQyxLQUFjO0lBQzlCLE9BQU8sQ0FBQyxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksS0FBSyxLQUFLLElBQUksQ0FBQyxJQUFJLE9BQU8sS0FBSyxLQUFLLFVBQVUsQ0FBQztBQUN0RixDQUFDO0FBRUQ7Ozs7Ozs7OztHQVNHO0FBQ0gsU0FBZ0Isb0JBQW9CLENBQW1CLEtBQVEsRUFBRSxPQUFxQjtJQUNwRixJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztRQUFFLE1BQU0sSUFBSSxTQUFTLENBQUMsK0NBQStDLENBQUMsQ0FBQztJQUMzRixJQUFJLENBQUMsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxPQUFPLE9BQU8sQ0FBQyxrQkFBa0IsS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUM3RixNQUFNLElBQUksU0FBUyxDQUFDLDRFQUE0RSxDQUFDLENBQUM7SUFDcEcsQ0FBQztJQUNELElBQUksT0FBTyxDQUFDLFFBQVEsS0FBSyxTQUFTLElBQUksT0FBTyxPQUFPLENBQUMsUUFBUSxLQUFLLFVBQVUsRUFBRSxDQUFDO1FBQzdFLE1BQU0sSUFBSSxTQUFTLENBQUMsaUVBQWlFLENBQUMsQ0FBQztJQUN6RixDQUFDO0lBQ0QsUUFBUSxDQUFDLEdBQUcsQ0FDVixLQUFLLEVBQ0wsTUFBTSxDQUFDLE1BQU0sQ0FBQztRQUNaLE1BQU0sRUFBRSxPQUFPLENBQUMsTUFBTTtRQUN0QixrQkFBa0IsRUFBRSxPQUFPLENBQUMsa0JBQWtCO1FBQzlDLFFBQVEsRUFBRSxPQUFPLENBQUMsUUFBUTtLQUMzQixDQUFDLENBQ0gsQ0FBQztJQUNGLE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQztBQWpCRCxvREFpQkM7QUFFRCw4RUFBOEU7QUFDOUUsU0FBZ0IsZUFBZSxDQUFDLEtBQWM7SUFDNUMsT0FBTyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztBQUMzRCxDQUFDO0FBRkQsMENBRUM7QUFFRCxNQUFNLFlBQVksR0FDaEIsK0ZBQStGO0lBQy9GLDZIQUE2SCxDQUFDO0FBRWhJLE1BQU0scUJBQXFCLEdBQ3pCLG1HQUFtRztJQUNuRyw2RkFBNkY7SUFDN0YsNERBQTRELENBQUM7QUFFL0QsZ0dBQWdHO0FBQ2hHLFNBQWdCLG1CQUFtQixDQUFDLEtBQWMsRUFBRSxVQUFrQixZQUFZO0lBQ2hGLE1BQU0sT0FBTyxHQUFHLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN2QyxJQUFJLE9BQU87UUFBRSxPQUFPLE9BQU8sQ0FBQztJQUM1QixNQUFNLElBQUksU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQy9CLENBQUM7QUFKRCxrREFJQztBQUVELHNHQUFzRztBQUN0RyxTQUFnQiwyQkFBMkIsQ0FBQyxLQUFjO0lBQ3hELE9BQU8sbUJBQW1CLENBQUMsS0FBSyxFQUFFLHFCQUFxQixDQUFDLENBQUM7QUFDM0QsQ0FBQztBQUZELGtFQUVDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBUaGUgc2NvcGUg4oaUIGVuZ2luZSBwcm90b2NvbC4gQSB1c2VyLWZhY2luZyBzY29wZSBtYXkgYmUgYSBzdHJpY3Qgc2NoZW1hXG4gKiBwcm94eTogYXNraW5nIGl0IGZvciBhbiBpbmZyYXN0cnVjdHVyZSBtZW1iZXIgaXMgYSBzdGF0ZSBhY2Nlc3MsIG5vdCBhXG4gKiBjYXBhYmlsaXR5IGNoZWNrLiBSZWdpc3RyYXRpb24ga2VlcHMgdGhhdCBib3VuZGFyeSBlbnRpcmVseSBvdXQgb2YgYmFuZC5cbiAqXG4gKiBUaGlzIG1vZHVsZSBvd25zIGlkZW50aXR5IGFuZCBjYXBhYmlsaXRpZXMsIG5vdCB0aGVpciBpbXBsZW1lbnRhdGlvbi5cbiAqIFNjb3BlRmFjYWRlIG93bnMgcmVjb3JkaW5nLCByZWRhY3Rpb24gYW5kIHN0YXRlIGFjY2VzczsgY3VzdG9tIHNjb3BlcyBtYXlcbiAqIGV4cGxpY2l0bHkgc3VwcGx5IGEgc21hbGxlciBwb3J0IChpbmNsdWRpbmcgYHt9YCBmb3IgZGF0YS1vbmx5IHNjb3BlcykuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBSdW5Db3JyZWxhdGlvbiB9IGZyb20gJy4uL2F0dGVtcHQvdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBSZWRhY3Rpb25Qb2xpY3ksIFNjb3BlUmVjb3JkZXIgfSBmcm9tICcuL3R5cGVzLmpzJztcblxuLyoqIEVuZ2luZS1mYWNpbmcgY2FwYWJpbGl0aWVzLiBOZXZlciB1c2UgYSBzdHJpY3QgdXNlci1maWVsZCBwcm94eSBhcyB0aGlzIHBvcnQuICovXG5leHBvcnQgaW50ZXJmYWNlIFNjb3BlUnVudGltZVRhcmdldCB7XG4gIGF0dGFjaFNjb3BlUmVjb3JkZXI/KHJlY29yZGVyOiBTY29wZVJlY29yZGVyKTogdm9pZDtcbiAgZGV0YWNoU2NvcGVSZWNvcmRlcj8ocmVjb3JkZXJJZDogc3RyaW5nKTogdm9pZDtcbiAgZ2V0U2NvcGVSZWNvcmRlcnM/KCk6IFNjb3BlUmVjb3JkZXJbXTtcbiAgdXNlU2hhcmVkUmVkYWN0ZWRLZXlzPyhrZXlzOiBTZXQ8c3RyaW5nPik6IHZvaWQ7XG4gIHVzZVJlZGFjdGlvblBvbGljeT8ocG9saWN5OiBSZWRhY3Rpb25Qb2xpY3kpOiB2b2lkO1xuICAvKiogVGhlIHJ1bidzIGNvcnJlbGF0aW9uLCBzdGFtcGVkIG9uIGV2ZXJ5IHNjb3BlIGFuZCBlbWl0IGV2ZW50IHRoaXMgc2NvcGUgZmlyZXMgKDEwLjEpLiAqL1xuICB1c2VDb3JyZWxhdGlvbj8oY29ycmVsYXRpb246IFJ1bkNvcnJlbGF0aW9uIHwgdW5kZWZpbmVkKTogdm9pZDtcbiAgZ2V0UmVkYWN0ZWRLZXlzPygpOiBTZXQ8c3RyaW5nPjtcbiAgbm90aWZ5U3RhZ2VTdGFydD8oKTogdm9pZDtcbiAgbm90aWZ5U3RhZ2VFbmQ/KGR1cmF0aW9uPzogbnVtYmVyKTogdm9pZDtcbiAgbm90aWZ5UGF1c2U/KGRhdGE/OiB1bmtub3duKTogdm9pZDtcbiAgZ2V0VmFsdWU/KGtleT86IHN0cmluZyk6IHVua25vd247XG4gIHNldFZhbHVlPyhrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24sIHNob3VsZFJlZGFjdD86IGJvb2xlYW4sIGRlc2NyaXB0aW9uPzogc3RyaW5nKTogdm9pZDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTY29wZVJ1bnRpbWUge1xuICByZWFkb25seSB0YXJnZXQ6IFNjb3BlUnVudGltZVRhcmdldDtcbiAgLyoqIFRoZSBzY29wZSBhbHJlYWR5IHJvdXRlcyBwcm9wZXJ0eSBhc3NpZ25tZW50cyBpbnRvIG1hbmFnZWQgc3RhdGUuICovXG4gIHJlYWRvbmx5IGhhbmRsZXNBc3NpZ25tZW50czogYm9vbGVhbjtcbiAgLyoqIEluc3RhbGwgdGhpcyBleGVjdXRpb24ncyBicmVhayBjYWxsYmFjaywgaWYgdGhlIHNjb3BlIGV4cG9zZXMgb25lLiAqL1xuICByZWFkb25seSBzZXRCcmVhaz86IChicmVha1BpcGVsaW5lOiAocmVhc29uPzogc3RyaW5nKSA9PiB2b2lkKSA9PiB2b2lkO1xufVxuXG5jb25zdCBydW50aW1lcyA9IG5ldyBXZWFrTWFwPG9iamVjdCwgUmVhZG9ubHk8U2NvcGVSdW50aW1lPj4oKTtcblxuZnVuY3Rpb24gaXNPYmplY3QodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBvYmplY3Qge1xuICByZXR1cm4gKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgIT09IG51bGwpIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJztcbn1cblxuLyoqXG4gKiBSZWdpc3RlciBhIGN1c3RvbSBzY29wZSdzIGVuZ2luZS1mYWNpbmcgcG9ydCBhbmQgcmV0dXJuIHRoZSBTQU1FIHNjb3BlLlxuICogUmVnaXN0cmF0aW9uIG5ldmVyIHJlYWRzLCB3cml0ZXMgb3IgZW51bWVyYXRlcyBwcm9wZXJ0aWVzIG9uIGBzY29wZWAuXG4gKiBSZS1yZWdpc3RlcmluZyBleHBsaWNpdGx5IHJlcGxhY2VzIGl0cyBiaW5kaW5nLiBUaGUgZGVzY3JpcHRvciBpcyBjb3BpZWRcbiAqIGFuZCBmcm96ZW47IHRoZSB0YXJnZXQgaXRzZWxmIHJlbWFpbnMgbGl2ZSBhbmQgYmVsb25ncyB0byBpdHMgcHJvdmlkZXIuXG4gKlxuICogQGV4YW1wbGVcbiAqIGNvbnN0IGZhY2FkZSA9IG5ldyBTY29wZUZhY2FkZShjb250ZXh0LCBzdGFnZU5hbWUsIGlucHV0LCBlbnYpO1xuICogcmV0dXJuIHJlZ2lzdGVyU2NvcGVSdW50aW1lKG15UHJveHksIHsgdGFyZ2V0OiBmYWNhZGUsIGhhbmRsZXNBc3NpZ25tZW50czogdHJ1ZSB9KTtcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyU2NvcGVSdW50aW1lPFQgZXh0ZW5kcyBvYmplY3Q+KHNjb3BlOiBULCBydW50aW1lOiBTY29wZVJ1bnRpbWUpOiBUIHtcbiAgaWYgKCFpc09iamVjdChzY29wZSkpIHRocm93IG5ldyBUeXBlRXJyb3IoJ3JlZ2lzdGVyU2NvcGVSdW50aW1lOiBzY29wZSBtdXN0IGJlIGFuIG9iamVjdCcpO1xuICBpZiAoIXJ1bnRpbWUgfHwgIWlzT2JqZWN0KHJ1bnRpbWUudGFyZ2V0KSB8fCB0eXBlb2YgcnVudGltZS5oYW5kbGVzQXNzaWdubWVudHMgIT09ICdib29sZWFuJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3JlZ2lzdGVyU2NvcGVSdW50aW1lOiBwcm92aWRlIGEgdGFyZ2V0IHBvcnQgYW5kIGJvb2xlYW4gaGFuZGxlc0Fzc2lnbm1lbnRzJyk7XG4gIH1cbiAgaWYgKHJ1bnRpbWUuc2V0QnJlYWsgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgcnVudGltZS5zZXRCcmVhayAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3JlZ2lzdGVyU2NvcGVSdW50aW1lOiBzZXRCcmVhayBtdXN0IGJlIGEgZnVuY3Rpb24gd2hlbiBzdXBwbGllZCcpO1xuICB9XG4gIHJ1bnRpbWVzLnNldChcbiAgICBzY29wZSxcbiAgICBPYmplY3QuZnJlZXplKHtcbiAgICAgIHRhcmdldDogcnVudGltZS50YXJnZXQsXG4gICAgICBoYW5kbGVzQXNzaWdubWVudHM6IHJ1bnRpbWUuaGFuZGxlc0Fzc2lnbm1lbnRzLFxuICAgICAgc2V0QnJlYWs6IHJ1bnRpbWUuc2V0QnJlYWssXG4gICAgfSksXG4gICk7XG4gIHJldHVybiBzY29wZTtcbn1cblxuLyoqIEBpbnRlcm5hbCBPcHRpb25hbCBvbmx5IGZvciB3cmFwcGVycyB0aGF0IGFsc28gd29yayBvdXRzaWRlIHRoZSBlbmdpbmUuICovXG5leHBvcnQgZnVuY3Rpb24gc2NvcGVSdW50aW1lRm9yKHNjb3BlOiB1bmtub3duKTogUmVhZG9ubHk8U2NvcGVSdW50aW1lPiB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBpc09iamVjdChzY29wZSkgPyBydW50aW1lcy5nZXQoc2NvcGUpIDogdW5kZWZpbmVkO1xufVxuXG5jb25zdCBVTlJFR0lTVEVSRUQgPVxuICAnW2Zvb3RwcmludF0gVW5yZWdpc3RlcmVkIHNjb3BlLiBDdXN0b20gc2NvcGUgZmFjdG9yaWVzIG11c3QgY2FsbCByZWdpc3RlclNjb3BlUnVudGltZShzY29wZSwgJyArXG4gICd7IHRhcmdldCwgaGFuZGxlc0Fzc2lnbm1lbnRzIH0pIGZyb20gZm9vdHByaW50anMvYWR2YW5jZWQuIFNjb3BlRmFjYWRlIGFuZCBidWlsdC1pbiBzY29wZSBmYWN0b3JpZXMgcmVnaXN0ZXIgYXV0b21hdGljYWxseS4nO1xuXG5jb25zdCBVTlJFR0lTVEVSRURfREVDSVNJT04gPVxuICBcIltmb290cHJpbnRdIGRlY2lkZSgpL3NlbGVjdCgpIG5lZWRzIHRoZSBzdGFnZSdzIHNjb3BlICh0aGUgb2JqZWN0IHlvdXIgc3RhZ2UgZnVuY3Rpb24gcmVjZWl2ZXMpLCBcIiArXG4gICdub3QgYSBwbGFpbiBvYmplY3QuIEEgaGFuZC1idWlsdCBzY29wZSBtdXN0IGJlIHJlZ2lzdGVyZWQgd2l0aCByZWdpc3RlclNjb3BlUnVudGltZShzY29wZSwgJyArXG4gICd7IHRhcmdldCwgaGFuZGxlc0Fzc2lnbm1lbnRzIH0pIGZyb20gZm9vdHByaW50anMvYWR2YW5jZWQuJztcblxuLyoqIEBpbnRlcm5hbCBObyBtZXRob2QtbmFtZSBndWVzc2luZzogYSBtaXNzaW5nIHJlZ2lzdHJhdGlvbiBpcyBhbiBleHBsaWNpdCBtaWdyYXRpb24gZXJyb3IuICovXG5leHBvcnQgZnVuY3Rpb24gcmVxdWlyZVNjb3BlUnVudGltZShzY29wZTogdW5rbm93biwgbWVzc2FnZTogc3RyaW5nID0gVU5SRUdJU1RFUkVEKTogUmVhZG9ubHk8U2NvcGVSdW50aW1lPiB7XG4gIGNvbnN0IHJ1bnRpbWUgPSBzY29wZVJ1bnRpbWVGb3Ioc2NvcGUpO1xuICBpZiAocnVudGltZSkgcmV0dXJuIHJ1bnRpbWU7XG4gIHRocm93IG5ldyBUeXBlRXJyb3IobWVzc2FnZSk7XG59XG5cbi8qKiBAaW50ZXJuYWwgZGVjaWRlKCkvc2VsZWN0KCkgYXNrZWQgb3V0c2lkZSBhIHN0YWdlOiBuYW1lIFRIRU0sIG5vdCB0aGUgY3VzdG9tLWZhY3RvcnkgbWlncmF0aW9uLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlcXVpcmVEZWNpc2lvblNjb3BlUnVudGltZShzY29wZTogdW5rbm93bik6IFJlYWRvbmx5PFNjb3BlUnVudGltZT4ge1xuICByZXR1cm4gcmVxdWlyZVNjb3BlUnVudGltZShzY29wZSwgVU5SRUdJU1RFUkVEX0RFQ0lTSU9OKTtcbn1cbiJdfQ==
67
+ /** @internal Explicit native target registration; no class tests or probing user proxies. */
68
+ const nativeTargets = new WeakMap();
69
+ function registerNativeCaptureTarget(target, context) {
70
+ nativeTargets.set(target, context);
71
+ }
72
+ exports.registerNativeCaptureTarget = registerNativeCaptureTarget;
73
+ function hasNativeCaptureTarget(target, context) {
74
+ return nativeTargets.get(target) === context;
75
+ }
76
+ exports.hasNativeCaptureTarget = hasNativeCaptureTarget;
77
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVudGltZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvc2NvcGUvcnVudGltZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7O0dBUUc7OztBQThCSCxNQUFNLFFBQVEsR0FBRyxJQUFJLE9BQU8sRUFBa0MsQ0FBQztBQUUvRCxTQUFTLFFBQVEsQ0FBQyxLQUFjO0lBQzlCLE9BQU8sQ0FBQyxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksS0FBSyxLQUFLLElBQUksQ0FBQyxJQUFJLE9BQU8sS0FBSyxLQUFLLFVBQVUsQ0FBQztBQUN0RixDQUFDO0FBRUQ7Ozs7Ozs7OztHQVNHO0FBQ0gsU0FBZ0Isb0JBQW9CLENBQW1CLEtBQVEsRUFBRSxPQUFxQjtJQUNwRixJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztRQUFFLE1BQU0sSUFBSSxTQUFTLENBQUMsK0NBQStDLENBQUMsQ0FBQztJQUMzRixJQUFJLENBQUMsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxPQUFPLE9BQU8sQ0FBQyxrQkFBa0IsS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUM3RixNQUFNLElBQUksU0FBUyxDQUFDLDRFQUE0RSxDQUFDLENBQUM7SUFDcEcsQ0FBQztJQUNELElBQUksT0FBTyxDQUFDLFFBQVEsS0FBSyxTQUFTLElBQUksT0FBTyxPQUFPLENBQUMsUUFBUSxLQUFLLFVBQVUsRUFBRSxDQUFDO1FBQzdFLE1BQU0sSUFBSSxTQUFTLENBQUMsaUVBQWlFLENBQUMsQ0FBQztJQUN6RixDQUFDO0lBQ0QsUUFBUSxDQUFDLEdBQUcsQ0FDVixLQUFLLEVBQ0wsTUFBTSxDQUFDLE1BQU0sQ0FBQztRQUNaLE1BQU0sRUFBRSxPQUFPLENBQUMsTUFBTTtRQUN0QixrQkFBa0IsRUFBRSxPQUFPLENBQUMsa0JBQWtCO1FBQzlDLFFBQVEsRUFBRSxPQUFPLENBQUMsUUFBUTtLQUMzQixDQUFDLENBQ0gsQ0FBQztJQUNGLE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQztBQWpCRCxvREFpQkM7QUFFRCw4RUFBOEU7QUFDOUUsU0FBZ0IsZUFBZSxDQUFDLEtBQWM7SUFDNUMsT0FBTyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztBQUMzRCxDQUFDO0FBRkQsMENBRUM7QUFFRCxNQUFNLFlBQVksR0FDaEIsK0ZBQStGO0lBQy9GLDZIQUE2SCxDQUFDO0FBRWhJLE1BQU0scUJBQXFCLEdBQ3pCLG1HQUFtRztJQUNuRyw2RkFBNkY7SUFDN0YsNERBQTRELENBQUM7QUFFL0QsZ0dBQWdHO0FBQ2hHLFNBQWdCLG1CQUFtQixDQUFDLEtBQWMsRUFBRSxVQUFrQixZQUFZO0lBQ2hGLE1BQU0sT0FBTyxHQUFHLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN2QyxJQUFJLE9BQU87UUFBRSxPQUFPLE9BQU8sQ0FBQztJQUM1QixNQUFNLElBQUksU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQy9CLENBQUM7QUFKRCxrREFJQztBQUVELHNHQUFzRztBQUN0RyxTQUFnQiwyQkFBMkIsQ0FBQyxLQUFjO0lBQ3hELE9BQU8sbUJBQW1CLENBQUMsS0FBSyxFQUFFLHFCQUFxQixDQUFDLENBQUM7QUFDM0QsQ0FBQztBQUZELGtFQUVDO0FBRUQsNkZBQTZGO0FBQzdGLE1BQU0sYUFBYSxHQUFHLElBQUksT0FBTyxFQUFrQixDQUFDO0FBQ3BELFNBQWdCLDJCQUEyQixDQUFDLE1BQWMsRUFBRSxPQUFlO0lBQ3pFLGFBQWEsQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQ3JDLENBQUM7QUFGRCxrRUFFQztBQUNELFNBQWdCLHNCQUFzQixDQUFDLE1BQWMsRUFBRSxPQUFlO0lBQ3BFLE9BQU8sYUFBYSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxPQUFPLENBQUM7QUFDL0MsQ0FBQztBQUZELHdEQUVDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBUaGUgc2NvcGUg4oaUIGVuZ2luZSBwcm90b2NvbC4gQSB1c2VyLWZhY2luZyBzY29wZSBtYXkgYmUgYSBzdHJpY3Qgc2NoZW1hXG4gKiBwcm94eTogYXNraW5nIGl0IGZvciBhbiBpbmZyYXN0cnVjdHVyZSBtZW1iZXIgaXMgYSBzdGF0ZSBhY2Nlc3MsIG5vdCBhXG4gKiBjYXBhYmlsaXR5IGNoZWNrLiBSZWdpc3RyYXRpb24ga2VlcHMgdGhhdCBib3VuZGFyeSBlbnRpcmVseSBvdXQgb2YgYmFuZC5cbiAqXG4gKiBUaGlzIG1vZHVsZSBvd25zIGlkZW50aXR5IGFuZCBjYXBhYmlsaXRpZXMsIG5vdCB0aGVpciBpbXBsZW1lbnRhdGlvbi5cbiAqIFNjb3BlRmFjYWRlIG93bnMgcmVjb3JkaW5nLCByZWRhY3Rpb24gYW5kIHN0YXRlIGFjY2VzczsgY3VzdG9tIHNjb3BlcyBtYXlcbiAqIGV4cGxpY2l0bHkgc3VwcGx5IGEgc21hbGxlciBwb3J0IChpbmNsdWRpbmcgYHt9YCBmb3IgZGF0YS1vbmx5IHNjb3BlcykuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBSdW5Db3JyZWxhdGlvbiB9IGZyb20gJy4uL2F0dGVtcHQvdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBSZWRhY3Rpb25Qb2xpY3ksIFNjb3BlUmVjb3JkZXIgfSBmcm9tICcuL3R5cGVzLmpzJztcblxuLyoqIEVuZ2luZS1mYWNpbmcgY2FwYWJpbGl0aWVzLiBOZXZlciB1c2UgYSBzdHJpY3QgdXNlci1maWVsZCBwcm94eSBhcyB0aGlzIHBvcnQuICovXG5leHBvcnQgaW50ZXJmYWNlIFNjb3BlUnVudGltZVRhcmdldCB7XG4gIGF0dGFjaFNjb3BlUmVjb3JkZXI/KHJlY29yZGVyOiBTY29wZVJlY29yZGVyKTogdm9pZDtcbiAgZGV0YWNoU2NvcGVSZWNvcmRlcj8ocmVjb3JkZXJJZDogc3RyaW5nKTogdm9pZDtcbiAgZ2V0U2NvcGVSZWNvcmRlcnM/KCk6IFNjb3BlUmVjb3JkZXJbXTtcbiAgdXNlU2hhcmVkUmVkYWN0ZWRLZXlzPyhrZXlzOiBTZXQ8c3RyaW5nPik6IHZvaWQ7XG4gIHVzZVJlZGFjdGlvblBvbGljeT8ocG9saWN5OiBSZWRhY3Rpb25Qb2xpY3kpOiB2b2lkO1xuICAvKiogVGhlIHJ1bidzIGNvcnJlbGF0aW9uLCBzdGFtcGVkIG9uIGV2ZXJ5IHNjb3BlIGFuZCBlbWl0IGV2ZW50IHRoaXMgc2NvcGUgZmlyZXMgKDEwLjEpLiAqL1xuICB1c2VDb3JyZWxhdGlvbj8oY29ycmVsYXRpb246IFJ1bkNvcnJlbGF0aW9uIHwgdW5kZWZpbmVkKTogdm9pZDtcbiAgZ2V0UmVkYWN0ZWRLZXlzPygpOiBTZXQ8c3RyaW5nPjtcbiAgbm90aWZ5U3RhZ2VTdGFydD8oKTogdm9pZDtcbiAgbm90aWZ5U3RhZ2VFbmQ/KGR1cmF0aW9uPzogbnVtYmVyKTogdm9pZDtcbiAgbm90aWZ5UGF1c2U/KGRhdGE/OiB1bmtub3duKTogdm9pZDtcbiAgZ2V0VmFsdWU/KGtleT86IHN0cmluZyk6IHVua25vd247XG4gIHNldFZhbHVlPyhrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24sIHNob3VsZFJlZGFjdD86IGJvb2xlYW4sIGRlc2NyaXB0aW9uPzogc3RyaW5nKTogdm9pZDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTY29wZVJ1bnRpbWUge1xuICByZWFkb25seSB0YXJnZXQ6IFNjb3BlUnVudGltZVRhcmdldDtcbiAgLyoqIFRoZSBzY29wZSBhbHJlYWR5IHJvdXRlcyBwcm9wZXJ0eSBhc3NpZ25tZW50cyBpbnRvIG1hbmFnZWQgc3RhdGUuICovXG4gIHJlYWRvbmx5IGhhbmRsZXNBc3NpZ25tZW50czogYm9vbGVhbjtcbiAgLyoqIEluc3RhbGwgdGhpcyBleGVjdXRpb24ncyBicmVhayBjYWxsYmFjaywgaWYgdGhlIHNjb3BlIGV4cG9zZXMgb25lLiAqL1xuICByZWFkb25seSBzZXRCcmVhaz86IChicmVha1BpcGVsaW5lOiAocmVhc29uPzogc3RyaW5nKSA9PiB2b2lkKSA9PiB2b2lkO1xufVxuXG5jb25zdCBydW50aW1lcyA9IG5ldyBXZWFrTWFwPG9iamVjdCwgUmVhZG9ubHk8U2NvcGVSdW50aW1lPj4oKTtcblxuZnVuY3Rpb24gaXNPYmplY3QodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBvYmplY3Qge1xuICByZXR1cm4gKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgIT09IG51bGwpIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJztcbn1cblxuLyoqXG4gKiBSZWdpc3RlciBhIGN1c3RvbSBzY29wZSdzIGVuZ2luZS1mYWNpbmcgcG9ydCBhbmQgcmV0dXJuIHRoZSBTQU1FIHNjb3BlLlxuICogUmVnaXN0cmF0aW9uIG5ldmVyIHJlYWRzLCB3cml0ZXMgb3IgZW51bWVyYXRlcyBwcm9wZXJ0aWVzIG9uIGBzY29wZWAuXG4gKiBSZS1yZWdpc3RlcmluZyBleHBsaWNpdGx5IHJlcGxhY2VzIGl0cyBiaW5kaW5nLiBUaGUgZGVzY3JpcHRvciBpcyBjb3BpZWRcbiAqIGFuZCBmcm96ZW47IHRoZSB0YXJnZXQgaXRzZWxmIHJlbWFpbnMgbGl2ZSBhbmQgYmVsb25ncyB0byBpdHMgcHJvdmlkZXIuXG4gKlxuICogQGV4YW1wbGVcbiAqIGNvbnN0IGZhY2FkZSA9IG5ldyBTY29wZUZhY2FkZShjb250ZXh0LCBzdGFnZU5hbWUsIGlucHV0LCBlbnYpO1xuICogcmV0dXJuIHJlZ2lzdGVyU2NvcGVSdW50aW1lKG15UHJveHksIHsgdGFyZ2V0OiBmYWNhZGUsIGhhbmRsZXNBc3NpZ25tZW50czogdHJ1ZSB9KTtcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyU2NvcGVSdW50aW1lPFQgZXh0ZW5kcyBvYmplY3Q+KHNjb3BlOiBULCBydW50aW1lOiBTY29wZVJ1bnRpbWUpOiBUIHtcbiAgaWYgKCFpc09iamVjdChzY29wZSkpIHRocm93IG5ldyBUeXBlRXJyb3IoJ3JlZ2lzdGVyU2NvcGVSdW50aW1lOiBzY29wZSBtdXN0IGJlIGFuIG9iamVjdCcpO1xuICBpZiAoIXJ1bnRpbWUgfHwgIWlzT2JqZWN0KHJ1bnRpbWUudGFyZ2V0KSB8fCB0eXBlb2YgcnVudGltZS5oYW5kbGVzQXNzaWdubWVudHMgIT09ICdib29sZWFuJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3JlZ2lzdGVyU2NvcGVSdW50aW1lOiBwcm92aWRlIGEgdGFyZ2V0IHBvcnQgYW5kIGJvb2xlYW4gaGFuZGxlc0Fzc2lnbm1lbnRzJyk7XG4gIH1cbiAgaWYgKHJ1bnRpbWUuc2V0QnJlYWsgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgcnVudGltZS5zZXRCcmVhayAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3JlZ2lzdGVyU2NvcGVSdW50aW1lOiBzZXRCcmVhayBtdXN0IGJlIGEgZnVuY3Rpb24gd2hlbiBzdXBwbGllZCcpO1xuICB9XG4gIHJ1bnRpbWVzLnNldChcbiAgICBzY29wZSxcbiAgICBPYmplY3QuZnJlZXplKHtcbiAgICAgIHRhcmdldDogcnVudGltZS50YXJnZXQsXG4gICAgICBoYW5kbGVzQXNzaWdubWVudHM6IHJ1bnRpbWUuaGFuZGxlc0Fzc2lnbm1lbnRzLFxuICAgICAgc2V0QnJlYWs6IHJ1bnRpbWUuc2V0QnJlYWssXG4gICAgfSksXG4gICk7XG4gIHJldHVybiBzY29wZTtcbn1cblxuLyoqIEBpbnRlcm5hbCBPcHRpb25hbCBvbmx5IGZvciB3cmFwcGVycyB0aGF0IGFsc28gd29yayBvdXRzaWRlIHRoZSBlbmdpbmUuICovXG5leHBvcnQgZnVuY3Rpb24gc2NvcGVSdW50aW1lRm9yKHNjb3BlOiB1bmtub3duKTogUmVhZG9ubHk8U2NvcGVSdW50aW1lPiB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBpc09iamVjdChzY29wZSkgPyBydW50aW1lcy5nZXQoc2NvcGUpIDogdW5kZWZpbmVkO1xufVxuXG5jb25zdCBVTlJFR0lTVEVSRUQgPVxuICAnW2Zvb3RwcmludF0gVW5yZWdpc3RlcmVkIHNjb3BlLiBDdXN0b20gc2NvcGUgZmFjdG9yaWVzIG11c3QgY2FsbCByZWdpc3RlclNjb3BlUnVudGltZShzY29wZSwgJyArXG4gICd7IHRhcmdldCwgaGFuZGxlc0Fzc2lnbm1lbnRzIH0pIGZyb20gZm9vdHByaW50anMvYWR2YW5jZWQuIFNjb3BlRmFjYWRlIGFuZCBidWlsdC1pbiBzY29wZSBmYWN0b3JpZXMgcmVnaXN0ZXIgYXV0b21hdGljYWxseS4nO1xuXG5jb25zdCBVTlJFR0lTVEVSRURfREVDSVNJT04gPVxuICBcIltmb290cHJpbnRdIGRlY2lkZSgpL3NlbGVjdCgpIG5lZWRzIHRoZSBzdGFnZSdzIHNjb3BlICh0aGUgb2JqZWN0IHlvdXIgc3RhZ2UgZnVuY3Rpb24gcmVjZWl2ZXMpLCBcIiArXG4gICdub3QgYSBwbGFpbiBvYmplY3QuIEEgaGFuZC1idWlsdCBzY29wZSBtdXN0IGJlIHJlZ2lzdGVyZWQgd2l0aCByZWdpc3RlclNjb3BlUnVudGltZShzY29wZSwgJyArXG4gICd7IHRhcmdldCwgaGFuZGxlc0Fzc2lnbm1lbnRzIH0pIGZyb20gZm9vdHByaW50anMvYWR2YW5jZWQuJztcblxuLyoqIEBpbnRlcm5hbCBObyBtZXRob2QtbmFtZSBndWVzc2luZzogYSBtaXNzaW5nIHJlZ2lzdHJhdGlvbiBpcyBhbiBleHBsaWNpdCBtaWdyYXRpb24gZXJyb3IuICovXG5leHBvcnQgZnVuY3Rpb24gcmVxdWlyZVNjb3BlUnVudGltZShzY29wZTogdW5rbm93biwgbWVzc2FnZTogc3RyaW5nID0gVU5SRUdJU1RFUkVEKTogUmVhZG9ubHk8U2NvcGVSdW50aW1lPiB7XG4gIGNvbnN0IHJ1bnRpbWUgPSBzY29wZVJ1bnRpbWVGb3Ioc2NvcGUpO1xuICBpZiAocnVudGltZSkgcmV0dXJuIHJ1bnRpbWU7XG4gIHRocm93IG5ldyBUeXBlRXJyb3IobWVzc2FnZSk7XG59XG5cbi8qKiBAaW50ZXJuYWwgZGVjaWRlKCkvc2VsZWN0KCkgYXNrZWQgb3V0c2lkZSBhIHN0YWdlOiBuYW1lIFRIRU0sIG5vdCB0aGUgY3VzdG9tLWZhY3RvcnkgbWlncmF0aW9uLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlcXVpcmVEZWNpc2lvblNjb3BlUnVudGltZShzY29wZTogdW5rbm93bik6IFJlYWRvbmx5PFNjb3BlUnVudGltZT4ge1xuICByZXR1cm4gcmVxdWlyZVNjb3BlUnVudGltZShzY29wZSwgVU5SRUdJU1RFUkVEX0RFQ0lTSU9OKTtcbn1cblxuLyoqIEBpbnRlcm5hbCBFeHBsaWNpdCBuYXRpdmUgdGFyZ2V0IHJlZ2lzdHJhdGlvbjsgbm8gY2xhc3MgdGVzdHMgb3IgcHJvYmluZyB1c2VyIHByb3hpZXMuICovXG5jb25zdCBuYXRpdmVUYXJnZXRzID0gbmV3IFdlYWtNYXA8b2JqZWN0LCBvYmplY3Q+KCk7XG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJOYXRpdmVDYXB0dXJlVGFyZ2V0KHRhcmdldDogb2JqZWN0LCBjb250ZXh0OiBvYmplY3QpOiB2b2lkIHtcbiAgbmF0aXZlVGFyZ2V0cy5zZXQodGFyZ2V0LCBjb250ZXh0KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBoYXNOYXRpdmVDYXB0dXJlVGFyZ2V0KHRhcmdldDogb2JqZWN0LCBjb250ZXh0OiBvYmplY3QpOiBib29sZWFuIHtcbiAgcmV0dXJuIG5hdGl2ZVRhcmdldHMuZ2V0KHRhcmdldCkgPT09IGNvbnRleHQ7XG59XG4iXX0=
@@ -283,4 +283,5 @@ export { extractErrorInfo, formatErrorInfo } from './lib/engine/index.js';
283
283
  export { disableDevMode, enableDevMode, isDevMode } from './lib/devMode.js';
284
284
  export type { RetryLoopCall, RetryLoopDecision, RetryLoopIdentity } from './lib/attempt/retryLoopTypes.js';
285
285
  export type { RetryLoopContext, RetryLoopOptions, RetryLoopState } from './lib/builder/retryLoop.js';
286
+ export type { CaptureChannelStatus, CaptureLimitation, NativeCaptureNote, RecorderCaptureAcknowledgement, } from './lib/capture/nativeCoverage.js';
286
287
  export { stringifySnapshot } from './lib/runner/stringifySnapshot.js';
@@ -0,0 +1,56 @@
1
+ import type { LogAddress } from 'foottrace';
2
+ import type { TerminalFailureContext } from '../errors/terminalFailure.js';
3
+ export type CaptureChannelStatus = 'captured' | 'disabled' | 'partial' | 'failed' | 'unknown';
4
+ export type CaptureLimitation = 'tracked-state-only' | 'final-attempt-views' | 'read-sources-not-collected' | 'child-scopes-not-attested' | 'storage-not-attested' | 'resumed-segment' | 'redacted-export' | 'redaction-active' | 'custom-scope' | 'read-retention-failed' | 'commit-retention-failed' | 'attention-omitted' | 'recorder-snapshot-failed' | 'identity-omitted' | 'execution-broken' | 'modes-unavailable';
5
+ /** A producer acknowledgement, not engine inspection of a recorder's implementation. */
6
+ export interface RecorderCaptureAcknowledgement {
7
+ readonly version: 1;
8
+ readonly runId: string;
9
+ readonly control: 'captured' | 'partial' | 'unknown';
10
+ }
11
+ /** Engine observation of ONE root-log segment. Never a durable or whole-workflow completeness claim. */
12
+ export interface NativeCaptureNote {
13
+ readonly version: 1;
14
+ readonly runId: string;
15
+ readonly scope: 'root-log';
16
+ readonly logAddress: LogAddress;
17
+ /** Half-open offsets in this log. A same-executor resume starts at the previous end. */
18
+ readonly commits: {
19
+ readonly from: number;
20
+ readonly to: number;
21
+ };
22
+ readonly boundary: {
23
+ readonly status: 'running' | 'completed' | 'paused' | 'failed' | 'cancelled';
24
+ readonly failure?: TerminalFailureContext;
25
+ };
26
+ readonly modes: {
27
+ readonly readTracking: 'full' | 'summary' | 'off' | 'unknown';
28
+ readonly writeTracking: 'full' | 'summary' | 'off' | 'unknown';
29
+ readonly commitValues: 'full' | 'delta' | 'unknown';
30
+ readonly writeProvenance: 'off' | 'reads-prefix' | 'unknown';
31
+ };
32
+ readonly channels: {
33
+ readonly reads: CaptureChannelStatus;
34
+ readonly writes: CaptureChannelStatus;
35
+ readonly attention: CaptureChannelStatus;
36
+ readonly control: CaptureChannelStatus;
37
+ readonly readSources: 'not-collected';
38
+ };
39
+ readonly persistence: 'memory-only';
40
+ readonly limitations: readonly CaptureLimitation[];
41
+ }
42
+ /** @internal Bounded facts collected at native funnels; no values, key names, recorder discovery or tree walk. */
43
+ export declare class NativeCapture {
44
+ readonly runId: string;
45
+ readonly logAddress: LogAddress;
46
+ readonly from: number;
47
+ private readonly gaps;
48
+ private boundary;
49
+ private readonly modes;
50
+ constructor(runId: string, logAddress: LogAddress, from: number, modes: NativeCaptureNote['modes']);
51
+ limit(gap: CaptureLimitation): void;
52
+ end(status: NativeCaptureNote['boundary']['status'], failure?: TerminalFailureContext): void;
53
+ snapshot(to: number, control?: CaptureChannelStatus, redacted?: boolean): NativeCaptureNote;
54
+ }
55
+ /** Stored/recorder metadata is untrusted. Read data properties only, never getters or arbitrary strings. */
56
+ export declare function copyCaptureAcknowledgement(value: unknown): RecorderCaptureAcknowledgement | undefined;