footprintjs 10.1.0 → 10.2.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 (64) hide show
  1. package/CLAUDE.md +18 -0
  2. package/dist/esm/index.d.ts +2 -0
  3. package/dist/esm/index.js +1 -1
  4. package/dist/esm/lib/attempt/category.d.ts +6 -0
  5. package/dist/esm/lib/attempt/category.js +26 -2
  6. package/dist/esm/lib/attempt/runner.d.ts +3 -1
  7. package/dist/esm/lib/attempt/runner.js +26 -6
  8. package/dist/esm/lib/engine/handlers/ChildrenExecutor.js +36 -6
  9. package/dist/esm/lib/engine/handlers/DeciderHandler.js +9 -5
  10. package/dist/esm/lib/engine/handlers/SelectorHandler.js +6 -5
  11. package/dist/esm/lib/engine/handlers/SubflowExecutor.js +5 -2
  12. package/dist/esm/lib/engine/handlers/commitStage.d.ts +7 -0
  13. package/dist/esm/lib/engine/handlers/commitStage.js +22 -4
  14. package/dist/esm/lib/engine/handlers/stageError.d.ts +2 -0
  15. package/dist/esm/lib/engine/handlers/stageError.js +13 -1
  16. package/dist/esm/lib/engine/narrative/FlowRecorderDispatcher.d.ts +2 -1
  17. package/dist/esm/lib/engine/narrative/FlowRecorderDispatcher.js +6 -2
  18. package/dist/esm/lib/engine/narrative/types.d.ts +4 -1
  19. package/dist/esm/lib/engine/narrative/types.js +1 -1
  20. package/dist/esm/lib/engine/traversal/FlowchartTraverser.js +14 -6
  21. package/dist/esm/lib/errors/terminalFailure.d.ts +29 -0
  22. package/dist/esm/lib/errors/terminalFailure.js +60 -0
  23. package/dist/esm/lib/memory/StageContext.d.ts +14 -0
  24. package/dist/esm/lib/memory/StageContext.js +32 -1
  25. package/dist/esm/lib/memory/attention.d.ts +26 -0
  26. package/dist/esm/lib/memory/attention.js +171 -0
  27. package/dist/esm/lib/memory/frameTypes.d.ts +8 -0
  28. package/dist/esm/lib/memory/frameTypes.js +1 -1
  29. package/dist/esm/lib/recorder/ControlDepRecorder.d.ts +14 -0
  30. package/dist/esm/lib/recorder/ControlDepRecorder.js +18 -1
  31. package/dist/esm/lib/runner/FlowChartExecutor.d.ts +4 -0
  32. package/dist/esm/lib/runner/FlowChartExecutor.js +163 -127
  33. package/dist/index.js +1 -1
  34. package/dist/lib/attempt/category.js +27 -2
  35. package/dist/lib/attempt/runner.js +25 -5
  36. package/dist/lib/engine/handlers/ChildrenExecutor.js +36 -6
  37. package/dist/lib/engine/handlers/DeciderHandler.js +7 -3
  38. package/dist/lib/engine/handlers/SelectorHandler.js +4 -3
  39. package/dist/lib/engine/handlers/SubflowExecutor.js +5 -2
  40. package/dist/lib/engine/handlers/commitStage.js +24 -5
  41. package/dist/lib/engine/handlers/stageError.js +15 -2
  42. package/dist/lib/engine/narrative/FlowRecorderDispatcher.js +6 -2
  43. package/dist/lib/engine/narrative/types.js +1 -1
  44. package/dist/lib/engine/traversal/FlowchartTraverser.js +12 -4
  45. package/dist/lib/errors/terminalFailure.js +64 -0
  46. package/dist/lib/memory/StageContext.js +32 -1
  47. package/dist/lib/memory/attention.js +175 -0
  48. package/dist/lib/memory/frameTypes.js +1 -1
  49. package/dist/lib/recorder/ControlDepRecorder.js +18 -1
  50. package/dist/lib/runner/FlowChartExecutor.js +163 -127
  51. package/dist/types/index.d.ts +2 -0
  52. package/dist/types/lib/attempt/category.d.ts +6 -0
  53. package/dist/types/lib/attempt/runner.d.ts +3 -1
  54. package/dist/types/lib/engine/handlers/commitStage.d.ts +7 -0
  55. package/dist/types/lib/engine/handlers/stageError.d.ts +2 -0
  56. package/dist/types/lib/engine/narrative/FlowRecorderDispatcher.d.ts +2 -1
  57. package/dist/types/lib/engine/narrative/types.d.ts +4 -1
  58. package/dist/types/lib/errors/terminalFailure.d.ts +29 -0
  59. package/dist/types/lib/memory/StageContext.d.ts +14 -0
  60. package/dist/types/lib/memory/attention.d.ts +26 -0
  61. package/dist/types/lib/memory/frameTypes.d.ts +8 -0
  62. package/dist/types/lib/recorder/ControlDepRecorder.d.ts +14 -0
  63. package/dist/types/lib/runner/FlowChartExecutor.d.ts +4 -0
  64. package/package.json +6 -6
package/dist/index.js CHANGED
@@ -148,4 +148,4 @@ Object.defineProperty(exports, "enableDevMode", { enumerable: true, get: functio
148
148
  Object.defineProperty(exports, "isDevMode", { enumerable: true, get: function () { return devMode_js_1.isDevMode; } });
149
149
  var stringifySnapshot_js_1 = require("./lib/runner/stringifySnapshot.js");
150
150
  Object.defineProperty(exports, "stringifySnapshot", { enumerable: true, get: function () { return stringifySnapshot_js_1.stringifySnapshot; } });
151
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7O0dBZ0JHOzs7QUFTSCw0QkFBNEI7QUFDNUIsbURBQXdGO0FBQS9FLHFHQUFBLFNBQVMsT0FBQTtBQUFFLDRHQUFBLGdCQUFnQixPQUFBO0FBQUUsNkdBQUEsaUJBQWlCLE9BQUE7QUFzQ3ZELGtEQUFtRDtBQUExQyxzR0FBQSxVQUFVLE9BQUE7QUFRbkIsNEJBQTRCO0FBQzVCLCtDQUEyQztBQUFsQyx5R0FBQSxTQUFTLE9BQUE7QUFvQmxCLG1DQUFtQztBQUNuQyxrREFBdUQ7QUFBOUMsa0dBQUEsTUFBTSxPQUFBO0FBQUUsa0dBQUEsTUFBTSxPQUFBO0FBOEN2Qjs7Ozs7O0dBTUc7QUFDSCxtREFBcUg7QUFBNUcsbUdBQUEsT0FBTyxPQUFBO0FBQUUsK0dBQUEsbUJBQW1CLE9BQUE7QUFBRSx5R0FBQSxhQUFhLE9BQUE7QUFBRSxzR0FBQSxVQUFVLE9BQUE7QUFBRSw4R0FBQSxrQkFBa0IsT0FBQTtBQVdwRixtREFBK0Y7QUFBdEYsNkdBQUEsaUJBQWlCLE9BQUE7QUFBRSw0R0FBQSxnQkFBZ0IsT0FBQTtBQUFFLDRHQUFBLGdCQUFnQixPQUFBO0FBMEI5RCxvQkFBb0I7QUFDcEIsa0RBQXdEO0FBQS9DLDJHQUFBLGVBQWUsT0FBQTtBQVF4QixvQkFBb0I7QUFDcEIsa0RBQTBEO0FBQWpELDZHQUFBLGlCQUFpQixPQUFBO0FBRTFCLG9CQUFvQjtBQUNwQixrREFBbUQ7QUFBMUMsc0dBQUEsVUFBVSxPQUFBO0FBcUJuQiwrQkFBK0I7QUFDL0IsaURBQXNEO0FBQTdDLDBHQUFBLGNBQWMsT0FBQTtBQUV2QiwrQkFBK0I7QUFDL0Isa0RBQXFEO0FBQTVDLDBHQUFBLGFBQWEsT0FBQTtBQUV0QixvQ0FBb0M7QUFDcEMscURBQTREO0FBQW5ELDhHQUFBLGlCQUFpQixPQUFBO0FBbUMxQixxRUFBcUU7QUFDckUscURBS2lDO0FBSi9CLG1IQUFBLHNCQUFzQixPQUFBO0FBQ3RCLG1IQUFBLHNCQUFzQixPQUFBO0FBQ3RCLCtHQUFBLGtCQUFrQixPQUFBO0FBQ2xCLHdHQUFBLFdBQVcsT0FBQTtBQW1EYiwrQkFBK0I7QUFDL0IsbURBQThEO0FBQXJELGtIQUFBLHFCQUFxQixPQUFBO0FBSzlCLCtCQUErQjtBQUMvQixtREFBNkQ7QUFBcEQsaUhBQUEsb0JBQW9CLE9BQUE7QUFFN0IsK0JBQStCO0FBQy9CLG1EQUFzRTtBQUE3RCwwSEFBQSw2QkFBNkIsT0FBQTtBQUV0QywrQkFBK0I7QUFDL0IsbURBQXVFO0FBQTlELDJIQUFBLDhCQUE4QixPQUFBO0FBRXZDLCtCQUErQjtBQUMvQixtREFBeUU7QUFBaEUsNkhBQUEsZ0NBQWdDLE9BQUE7QUFFekMsK0JBQStCO0FBQy9CLG1EQUFpRTtBQUF4RCxxSEFBQSx3QkFBd0IsT0FBQTtBQUVqQywrQkFBK0I7QUFDL0IsbURBQXNFO0FBQTdELDBIQUFBLDZCQUE2QixPQUFBO0FBRXRDLCtCQUErQjtBQUMvQixtREFBb0U7QUFBM0Qsd0hBQUEsMkJBQTJCLE9BQUE7QUFFcEMsK0JBQStCO0FBQy9CLG1EQUFzRTtBQUE3RCwwSEFBQSw2QkFBNkIsT0FBQTtBQW1CdEMsdUNBQXVDO0FBQ3ZDLG1EQUE2RTtBQUFwRSwrR0FBQSxrQkFBa0IsT0FBQTtBQUFFLDZHQUFBLGdCQUFnQixPQUFBO0FBRTdDLCtFQUErRTtBQUMvRSw0RUFBNEU7QUFDNUUsK0VBQStFO0FBRS9FLDhCQUE4QjtBQUM5QixxREFBNEQ7QUFBbkQsOEdBQUEsaUJBQWlCLE9BQUE7QUEwQjFCLDZCQUE2QjtBQUM3QixrREFBaUQ7QUFBeEMsc0dBQUEsU0FBUyxPQUFBO0FBZ0VsQixzQ0FBc0M7QUFDdEMsbURBQTJFO0FBQWxFLHlHQUFBLFlBQVksT0FBQTtBQUFFLDBHQUFBLGFBQWEsT0FBQTtBQUFFLGtHQUFBLEtBQUssT0FBQTtBQUUzQyxzQ0FBc0M7QUFDdEMsbURBQXFHO0FBQTVGLGlIQUFBLG9CQUFvQixPQUFBO0FBQUUsa0hBQUEscUJBQXFCLE9BQUE7QUFBRSw0R0FBQSxlQUFlLE9BQUE7QUFTckUsZ0NBQWdDO0FBQ2hDLG1EQUEwRTtBQUFqRSw2R0FBQSxnQkFBZ0IsT0FBQTtBQUFFLDRHQUFBLGVBQWUsT0FBQTtBQUUxQywrRUFBK0U7QUFDL0UsaURBQWlEO0FBQ2pELCtFQUErRTtBQUUvRTs7Ozs7Ozs7Ozs7R0FXRztBQUNILCtDQUE0RTtBQUFuRSw0R0FBQSxjQUFjLE9BQUE7QUFBRSwyR0FBQSxhQUFhLE9BQUE7QUFBRSx1R0FBQSxTQUFTLE9BQUE7QUFTakQsMEVBQXNFO0FBQTdELHlIQUFBLGlCQUFpQixPQUFBIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBGb290UHJpbnQg4oCUIFB1YmxpYyBBUEkgKHYzKVxuICpcbiAqIFRoZSBmbG93Y2hhcnQgcGF0dGVybiBmb3IgYmFja2VuZCBjb2RlLlxuICogQnVpbGQg4oaSIFJ1biDihpIgT2JzZXJ2ZS5cbiAqXG4gKiAqKlRoZSBjb21tb24gaW1wb3J0IHBhdGhzOioqXG4gKiBgYGB0c1xuICogaW1wb3J0IHsgZmxvd0NoYXJ0LCBkZWNpZGUsIG5hcnJhdGl2ZSB9IGZyb20gJ2Zvb3RwcmludGpzJzsgICAgICAgICAgIC8vIG1haW4g4oCUIHN0YXJ0IGhlcmVcbiAqIGltcG9ydCB7IG1ldHJpY3MsIGRlYnVnLCBtYW5pZmVzdCB9ICAgICBmcm9tICdmb290cHJpbnRqcy9yZWNvcmRlcnMnOyAvLyByZWNvcmRlciBmYWN0b3JpZXNcbiAqIGltcG9ydCB7IHN0YXRlQXQsIGNhdXNhbENoYWluIH0gZnJvbSAnZm9vdHRyYWNlJzsgICAgIC8vIHJlYWQgYSBmaW5pc2hlZCBydW5cbiAqIGltcG9ydCB7IFJlY29yZEZyYW1lLCBFdmVudExvZyB9IGZyb20gJ2Zvb3R0cmFjZS93cml0ZSc7ICAgICAvLyB3cml0ZSBhIHJlY29yZCB5b3Vyc2VsZlxuICogaW1wb3J0IHsgU3RhZ2VDb250ZXh0IH0gICAgICAgICAgICAgICAgIGZyb20gJ2Zvb3RwcmludGpzL2FkdmFuY2VkJzsgIC8vIGVuZ2luZSBpbnRlcm5hbHNcbiAqIGBgYFxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBRdWljayBTdGFydCDigJQgRXZlcnl0aGluZyB5b3UgbmVlZCBmb3IgOTAlIG9mIHVzZSBjYXNlc1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKiogQGNhdGVnb3J5IFF1aWNrIFN0YXJ0ICovXG5leHBvcnQgdHlwZSB7IEZsb3dDaGFydCwgU3RhZ2VGdW5jdGlvbiBhcyBTdGFnZUhhbmRsZXIsIFN0cmVhbUhhbmRsZXJzIH0gZnJvbSAnLi9saWIvYnVpbGRlci9pbmRleC5qcyc7XG5cbi8qKiBAY2F0ZWdvcnkgUXVpY2sgU3RhcnQgKi9cbmV4cG9ydCB7IGZsb3dDaGFydCwgRmxvd0NoYXJ0QnVpbGRlciwgZmxvd0NoYXJ0U2VsZWN0b3IgfSBmcm9tICcuL2xpYi9idWlsZGVyL2luZGV4LmpzJztcblxuLyoqXG4gKiBAY2F0ZWdvcnkgUXVpY2sgU3RhcnRcbiAqXG4gKiBDb25maWcgZm9yIGAuYWRkUGFyYWxsZWxGb3JFYWNoKClgIOKAlCBvbmUgYnJhbmNoIHBlciBpdGVtLCBicmFuY2ggY291bnRcbiAqIGRlY2lkZWQgYXQgcnVuIHRpbWUgZnJvbSB0aGUgcGF5bG9hZC4gYG1heEJyYW5jaGVzYCBhbmQgYGludG9gIGFyZSByZXF1aXJlZFxuICogb24gcHVycG9zZSAoc2VlIGRvY3MvZGVzaWduL2V4ZWN1dGlvbi1jb250cm9sLm1kKS5cbiAqL1xuZXhwb3J0IHR5cGUgeyBCcmFuY2hDaGFydCwgUGFyYWxsZWxGb3JFYWNoQ29uZmlnLCBSZXRyeVBvbGljeSB9IGZyb20gJy4vbGliL2J1aWxkZXIvaW5kZXguanMnO1xuXG4vKiogQGNhdGVnb3J5IFF1aWNrIFN0YXJ0IOKAlCBidWlsZC10aW1lIG9ic2VydmVyICh0d2luIG9mIEZsb3dSZWNvcmRlcikgKi9cbmV4cG9ydCB0eXBlIHtcbiAgU3RydWN0dXJlRGVjaWRlckNvbXBsZXRlRXZlbnQsXG4gIFN0cnVjdHVyZUVkZ2VBZGRlZEV2ZW50LFxuICBTdHJ1Y3R1cmVFZGdlS2luZCxcbiAgU3RydWN0dXJlTG9vcEVkZ2VBZGRlZEV2ZW50LFxuICBTdHJ1Y3R1cmVSZWNvcmRlcixcbiAgU3RydWN0dXJlU3RhZ2VBZGRlZEV2ZW50LFxuICBTdHJ1Y3R1cmVTdGFnZVRhZ2dlZEV2ZW50LFxuICBTdHJ1Y3R1cmVTdWJmbG93TW91bnRlZEV2ZW50LFxufSBmcm9tICcuL2xpYi9idWlsZGVyL2luZGV4LmpzJztcblxuLyoqXG4gKiBAY2F0ZWdvcnkgVGltZSBCdWRnZXRcbiAqXG4gKiBgdGltZUJ1ZGdldChjaGFydClgIOKAlCB0aGUgc2xvd2VzdCBhIGNoYXJ0IGNhbiB0YWtlLCBmcm9tIGl0cyBkZWNsYXJlZCByZXRyeSBwb2xpY2llcyAoYGF0dGVtcHRzIMOXIHRpbWVvdXRNc2AgcGx1c1xuICogdGhlIHdhaXRzLCBzdW1tZWQgYWxvbmcgdGhlIHNsb3dlc3QgcGF0aCksIGFuZCBldmVyeSBzdGFnZSB0aGF0IG1ha2VzIGEgcGF0aCB1bmJvdW5kZWQsIGJ5IG5hbWUuIGAuYnVkZ2V0KG1zKWBcbiAqIGRlY2xhcmVzIHRoZSBjYWxsZXIncyBjb250cmFjdDsgYGJ1aWxkKClgIHJlZnVzZXMgYSBjaGFydCB0aGF0IGNhbm5vdCBrZWVwIGl0LiBBbHNvIGBjaGFydC50aW1lQnVkZ2V0KClgLlxuICovXG5leHBvcnQgdHlwZSB7XG4gIEJ1ZGdldEFzc3VtcHRpb25zLFxuICBCdWRnZXRTdGVwLFxuICBUaW1lQnVkZ2V0T3B0aW9ucyxcbiAgVGltZUJ1ZGdldFJlcG9ydCxcbiAgVW5ib3VuZGVkUmVhc29uLFxuICBVbmJvdW5kZWRTdGFnZSxcbn0gZnJvbSAnLi9saWIvYnVkZ2V0L2luZGV4LmpzJztcbmV4cG9ydCB7IHRpbWVCdWRnZXQgfSBmcm9tICcuL2xpYi9idWRnZXQvaW5kZXguanMnO1xuXG4vKiogQGNhdGVnb3J5IFF1aWNrIFN0YXJ0ICovXG5leHBvcnQgdHlwZSB7IFR5cGVkU3RhZ2VGdW5jdGlvbiB9IGZyb20gJy4vbGliL2J1aWxkZXIvdHlwZWRGbG93Q2hhcnQuanMnO1xuXG4vKiogQGNhdGVnb3J5IFF1aWNrIFN0YXJ0ICovXG5leHBvcnQgdHlwZSB7IFNjb3BlTWV0aG9kcywgVHlwZWRTY29wZSB9IGZyb20gJy4vbGliL3JlYWN0aXZlL2luZGV4LmpzJztcblxuLyoqIEBjYXRlZ29yeSBRdWljayBTdGFydCAqL1xuZXhwb3J0IHsgbmFycmF0aXZlIH0gZnJvbSAnLi9yZWNvcmRlcnMuanMnO1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBEZWNpc2lvbiBCcmFuY2hpbmcg4oCUIGRlY2lkZSgpIC8gc2VsZWN0KCkgd2l0aCBldmlkZW5jZSBjYXB0dXJlXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKiBAY2F0ZWdvcnkgRGVjaXNpb24gQnJhbmNoaW5nICovXG5leHBvcnQgdHlwZSB7XG4gIERlY2lkZVJ1bGUsXG4gIERlY2lzaW9uRXZpZGVuY2UsXG4gIERlY2lzaW9uUmVzdWx0LFxuICBEZWZhdWx0QnJhbmNoLFxuICBGaWx0ZXJPcHMsXG4gIFJ1bGVFdmlkZW5jZSxcbiAgU2VsZWN0aW9uRXZpZGVuY2UsXG4gIFNlbGVjdGlvblJlc3VsdCxcbiAgV2hlbkNsYXVzZSxcbiAgV2hlcmVGaWx0ZXIsXG59IGZyb20gJy4vbGliL2RlY2lkZS9pbmRleC5qcyc7XG5cbi8qKiBAY2F0ZWdvcnkgRGVjaXNpb24gQnJhbmNoaW5nICovXG5leHBvcnQgeyBkZWNpZGUsIHNlbGVjdCB9IGZyb20gJy4vbGliL2RlY2lkZS9pbmRleC5qcyc7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIEF0dGVtcHRzIOKAlCBldmVyeSB0cnkgb2YgYSByZXRyaWVkIHN0YWdlLCBhbmQgdGhlIGRlY2lzaW9uIHRoYXQgZm9sbG93ZWQgaXRcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBAY2F0ZWdvcnkgQXR0ZW1wdHNcbiAqXG4gKiBPbmUgYEF0dGVtcHRSZWNvcmRgIHBlciBhdHRlbXB0IG9mIGEgc3RhZ2Ugd2l0aCBhIGRlY2xhcmVkIGByZXRyeWAgcG9saWN5LCBhIGB0aW1lb3V0TXNgLCBvciBhIHJ1biBkZWFkbGluZSDigJRcbiAqIHRpbWluZywgb3V0Y29tZSwgZmFpbHVyZSBjYXRlZ29yeSwgYW5kIHRoZSByZXRyeS1vci1zdG9wIGRlY2lzaW9uIGFzIGBEZWNpc2lvbkV2aWRlbmNlYCDigJQgb24gdGhlIHN0YWdlJ3NcbiAqIGV4ZWN1dGlvbi10cmVlIG5vZGUgKGBTdGFnZVNuYXBzaG90LmF0dGVtcHRzYCAvIGBhdHRlbXB0U3VtbWFyeWApIGFuZCBvbiBgRmxvd1JlY29yZGVyLm9uQXR0ZW1wdGAuXG4gKiBBIGNhbGwgYSBzdGFnZSBtYWtlcyB0aHJvdWdoIGBzY29wZS4kY2FsbGAgaXMgcmVjb3JkZWQgdGhlIHNhbWUgd2F5IChraW5kIGAnY2FsbCdgKSwgYW5kIHNvIGlzIGFuIFNESydzIG93biByZXRyeVxuICogYW4gYWRhcHRlciByZXBvcnRzIHRocm91Z2ggYG9ic2VydmVkKClgIChgT2JzZXJ2ZWRBdHRlbXB0YCwga2luZCBgJ29ic2VydmVkJ2ApLiBgQXR0ZW1wdENvbnRleHRgIGlzIHdoYXRcbiAqIGBzY29wZS4kYXR0ZW1wdCgpYCByZXR1cm5zLCBhbmQgd2hhdCBhIGNhbGwncyBmdW5jdGlvbiBnZXRzICh0aGUgYXR0ZW1wdCdzIHNpZ25hbCwgdGhlIHRpbWUgbGVmdCwgYG9ic2VydmVkYCk7XG4gKiBgTGF0ZVdyaXRlYCBpcyBhIHdyaXRlIChvciBjYWxsKSBhbiBlbmRlZCBhdHRlbXB0IHRyaWVkIChgU3RhZ2VTbmFwc2hvdC5sYXRlV3JpdGVzYCkuIEEgc3RhZ2UgdGhhdCBjaGFuZ2VzIGFuXG4gKiBvdXRzaWRlIHN5c3RlbSBkZWNsYXJlcyBpdCAoYFN0YWdlVG91Y2hlc2AsIGAudG91Y2hlcygpYCksIGFuZCBhIGNhbGwgZG9lcyAoYENhbGxPcHRpb25zYCk6IGV2ZXJ5IGF0dGVtcHQgdGhlblxuICogY2FycmllcyBpdHMgYEF0dGVtcHRFZmZlY3RgLCBhbmQgdGhlIGtleSBydWxlIGlzIGhhbmRlZCBhbiBgSWRlbXBvdGVuY3lLZXlDb250ZXh0YCBvbmNlIHBlciBleGVjdXRpb24uXG4gKi9cbmV4cG9ydCB0eXBlIHtcbiAgQXR0ZW1wdENhdGVnb3J5LFxuICBBdHRlbXB0Q29udGV4dCxcbiAgQXR0ZW1wdEVmZmVjdCxcbiAgQXR0ZW1wdEVycm9yLFxuICBBdHRlbXB0SW5wdXRzLFxuICBBdHRlbXB0S2luZCxcbiAgQXR0ZW1wdE5leHQsXG4gIEF0dGVtcHRPcHRpb25zLFxuICBBdHRlbXB0T3V0Y29tZSxcbiAgQXR0ZW1wdFJlYXNvbixcbiAgQXR0ZW1wdFJlY29yZCxcbiAgQXR0ZW1wdFN1bW1hcnksXG4gIENhbGxPcHRpb25zLFxuICBJZGVtcG90ZW5jeUtleUNvbnRleHQsXG4gIExhdGVXcml0ZSxcbiAgT2JzZXJ2ZWRBdHRlbXB0LFxuICBTdGFnZVRvdWNoZXMsXG4gIFVua25vd25FZmZlY3RJbml0LFxufSBmcm9tICcuL2xpYi9hdHRlbXB0L2luZGV4LmpzJztcbi8qKlxuICogQGNhdGVnb3J5IEF0dGVtcHRzXG4gKlxuICogQW4gYXR0ZW1wdCBieSBuYW1lIChgc2VyaWVzYCArIGBhdHRlbXB0YCkgYW5kIHBlci1vdXRjb21lIGNvdW50cyDigJQgd2hhdCByZWNvcmRlciByb3dzIGhvbGQgb2YgYXR0ZW1wdHMuXG4gKi9cbmV4cG9ydCB0eXBlIHsgQXR0ZW1wdE91dGNvbWVDb3VudHMsIEF0dGVtcHRSZWYgfSBmcm9tICcuL2xpYi9yZWNvcmRlci9hdHRlbXB0U2VyaWVzLmpzJztcblxuLyoqXG4gKiBAY2F0ZWdvcnkgQXR0ZW1wdHNcbiAqXG4gKiBgYXR0ZW1wdCgpYCDigJQgdGhlIGF0dGVtcHQgcnVubmVyIGZvciBjb2RlIHRoYXQgaXMgbm90IGEgc3RhZ2UgKHJlY29yZHMgZ28gdG8gaXRzIGBvbkF0dGVtcHRgKTsgYGVycm9yQ2F0ZWdvcnlgXG4gKiDigJQgdGhlIG9uZSBmYWlsdXJlIGNsYXNzaWZpZXIgKHNldmVuIGZpeGVkIGNhdGVnb3JpZXMpOyBgcmV0cnlSdWxlc2Ag4oCUIHRoZSBvbmUgcmV0cnkgcnVsZSB0YWJsZSwgYXMgYGRlY2lkZSgpYFxuICogcnVsZXM7IHRoZSBhdHRlbXB0IGNvbnRyYWN0J3MgdHdvIGVycm9ycy5cbiAqL1xuZXhwb3J0IHsgYXR0ZW1wdCwgQXR0ZW1wdFRpbWVvdXRFcnJvciwgZXJyb3JDYXRlZ29yeSwgcmV0cnlSdWxlcywgVW5rbm93bkVmZmVjdEVycm9yIH0gZnJvbSAnLi9saWIvYXR0ZW1wdC9pbmRleC5qcyc7XG5cbi8qKlxuICogQGNhdGVnb3J5IENvcnJlbGF0aW9uXG4gKlxuICogVGhlIHJ1bidzIGNvcnJlbGF0aW9uICgxMC4xKTogYGVudi50cmFjZXBhcmVudGAgKFczQywgcGFyc2VkIHN0cmljdGx5KSBvciBgZW52LnRyYWNlSWRgICsgYGVudi5vcGVyYXRpb25JZGBcbiAqIGJlY29tZSBPTkUgZnJvemVuIGBSdW5Db3JyZWxhdGlvbmAgcGVyIHJ1biDigJQgb24gYGdldFNuYXBzaG90KCkuY29ycmVsYXRpb25gLCBldmVyeSBmbG93IGV2ZW50J3NcbiAqIGB0cmF2ZXJzYWxDb250ZXh0LmNvcnJlbGF0aW9uYCBhbmQgZXZlcnkgc2NvcGUgYW5kIGVtaXQgZXZlbnQncyBgY29ycmVsYXRpb25gLiBgcGFyc2VUcmFjZXBhcmVudGAgL1xuICogYGZvcm1hdFRyYWNlcGFyZW50YCBhcmUgdGhlIFczQyBjb2RlYzsgYSByZWZ1c2VkIGhlYWRlciB0aHJvd3MgYFRyYWNlcGFyZW50RXJyb3JgIHdpdGggYSBuYW1lZCBgcmVhc29uYC5cbiAqL1xuZXhwb3J0IHR5cGUgeyBQYXJzZWRUcmFjZXBhcmVudCwgUnVuQ29ycmVsYXRpb24sIFRyYWNlcGFyZW50RmllbGRzLCBUcmFjZXBhcmVudFJlZnVzYWwgfSBmcm9tICcuL2xpYi9hdHRlbXB0L2luZGV4LmpzJztcbmV4cG9ydCB7IGZvcm1hdFRyYWNlcGFyZW50LCBwYXJzZVRyYWNlcGFyZW50LCBUcmFjZXBhcmVudEVycm9yIH0gZnJvbSAnLi9saWIvYXR0ZW1wdC9pbmRleC5qcyc7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFJ1biDigJQgRXhlY3V0ZSBjaGFydHMgYW5kIGNvbGxlY3QgcmVzdWx0c1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKiogQGNhdGVnb3J5IFJ1biAqL1xuZXhwb3J0IHR5cGUgeyBSdW5SZXN1bHQgfSBmcm9tICcuL2xpYi9ydW5uZXIvaW5kZXguanMnO1xuXG4vKiogQGNhdGVnb3J5IFJ1biAqL1xuZXhwb3J0IHR5cGUgeyBGbG93Q2hhcnRFeGVjdXRvck9wdGlvbnMgfSBmcm9tICcuL2xpYi9ydW5uZXIvaW5kZXguanMnO1xuXG4vKipcbiAqIFRoZSBjcmFzaC1zYWZlIHJlY29yZCAoMTAuMSk6IHRoZSBleGVjdXRvcidzIGBzaW5rYCBvcHRpb24sIGl0cyBhY2NvdW50aW5nIG9uIGBnZXRTbmFwc2hvdCgpLnNpbmtgLFxuICogYGV4ZWN1dG9yLmZsdXNoUmVjb3JkKClgJ3MgcmVzdWx0LCBhbmQgdGhlIGVycm9yIGEgcnVuIHdpdGggYG9uRmFpbHVyZTogJ2ZhaWwnYCByZWplY3RzIHdpdGguIFRoZSBwb3J0XG4gKiAoYFJlY29yZFNpbmtgLCBgbWVtb3J5U2lua2ApIGlzIGBmb290dHJhY2Uvd3JpdGVgJ3M7IHRoZSBmaWxlIGFkYXB0ZXIgaXMgYGZvb3RwcmludGpzL3NpbmtzYC5cbiAqIEBjYXRlZ29yeSBSdW5cbiAqL1xuZXhwb3J0IHR5cGUge1xuICBSZWNvcmRGbHVzaFJlc3VsdCxcbiAgUmVjb3JkU2lua0ZhaWx1cmVNb2RlLFxuICBSZWNvcmRTaW5rRmx1c2hNb2RlLFxuICBSZWNvcmRTaW5rT3B0aW9uLFxuICBSZWNvcmRTaW5rT3B0aW9ucyxcbiAgUmVjb3JkU2lua1N0YXRzLFxufSBmcm9tICcuL2xpYi9ydW5uZXIvaW5kZXguanMnO1xuLyoqIEBjYXRlZ29yeSBSdW4gKi9cbmV4cG9ydCB7IFJlY29yZFNpbmtFcnJvciB9IGZyb20gJy4vbGliL3J1bm5lci9pbmRleC5qcyc7XG5cbi8qKlxuICogVGhlIGZvdXIgb2JzZXJ2YWJpbGl0eSBkaWFscyBgRmxvd0NoYXJ0RXhlY3V0b3JPcHRpb25zYCBpbmhlcml0cy5cbiAqIEBjYXRlZ29yeSBSdW5cbiAqL1xuZXhwb3J0IHR5cGUgeyBSdW5EaWFscyB9IGZyb20gJy4vbGliL21lbW9yeS9pbmRleC5qcyc7XG5cbi8qKiBAY2F0ZWdvcnkgUnVuICovXG5leHBvcnQgeyBGbG93Q2hhcnRFeGVjdXRvciB9IGZyb20gJy4vbGliL3J1bm5lci9pbmRleC5qcyc7XG5cbi8qKiBAY2F0ZWdvcnkgUnVuICovXG5leHBvcnQgeyBSdW5Db250ZXh0IH0gZnJvbSAnLi9saWIvcnVubmVyL2luZGV4LmpzJztcblxuLyoqIEBjYXRlZ29yeSBSdW4gKi9cbmV4cG9ydCB0eXBlIHsgQ2hhcnRPcGVuQVBJT3B0aW9ucywgTUNQVG9vbERlc2NyaXB0aW9uLCBSdW5uYWJsZUZsb3dDaGFydCB9IGZyb20gJy4vbGliL3J1bm5lci9SdW5uYWJsZUNoYXJ0LmpzJztcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gT2JzZXJ2ZSDigJQgRGF0YSAoc2NvcGUgcmVjb3JkZXJzLCBmaXJlIGR1cmluZyBzdGFnZSBleGVjdXRpb24pXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKiBAY2F0ZWdvcnkgT2JzZXJ2ZSDigJQgRGF0YSAqL1xuZXhwb3J0IHR5cGUge1xuICBDb21taXRFdmVudCxcbiAgRXJyb3JFdmVudCxcbiAgUmVhZEV2ZW50LFxuICBSZWRhY3Rpb25Qb2xpY3ksXG4gIFJlZGFjdGlvblJlcG9ydCxcbiAgU2NvcGVSZWNvcmRlcixcbiAgU3RhZ2VFdmVudCxcbiAgV3JpdGVFdmVudCxcbn0gZnJvbSAnLi9saWIvc2NvcGUvaW5kZXguanMnO1xuXG4vKiogQGNhdGVnb3J5IE9ic2VydmUg4oCUIERhdGEgKi9cbmV4cG9ydCB7IE1ldHJpY1JlY29yZGVyIH0gZnJvbSAnLi9saWIvc2NvcGUvaW5kZXguanMnO1xuXG4vKiogQGNhdGVnb3J5IE9ic2VydmUg4oCUIERhdGEgKi9cbmV4cG9ydCB7IERlYnVnUmVjb3JkZXIgfSBmcm9tICcuL2xpYi9zY29wZS9pbmRleC5qcyc7XG5cbi8qKiBAY2F0ZWdvcnkgT2JzZXJ2ZSDigJQgT3BlcmF0aW9uICovXG5leHBvcnQgeyBSZWNvcmRlck9wZXJhdGlvbiB9IGZyb20gJy4vbGliL3JlY29yZGVyL2luZGV4LmpzJztcblxuLyoqXG4gKiBAY2F0ZWdvcnkgT2JzZXJ2ZSDigJQgRGVsaXZlcnkgdGllciAoUkZDLTAwMSBkZWZlcnJlZCBvYnNlcnZlcnMpXG4gKlxuICogRXZlcnkgYGF0dGFjaCpSZWNvcmRlcmAgY2FsbCBhY2NlcHRzIGFuIG9wdGlvbnMgYmFnOlxuICogYGV4ZWN1dG9yLmF0dGFjaFNjb3BlUmVjb3JkZXIocmVjLCB7IGRlbGl2ZXJ5OiAnZGVmZXJyZWQnIH0pYCB0YWtlcyB0aGVcbiAqIHJlY29yZGVyIE9VVCBvZiB0aGUgZW5naW5lJ3MgaG90IHBhdGgg4oCUIGV2ZW50cyBhcmUgY2FwdHVyZWQgaW50byBvbmVcbiAqIGJvdW5kZWQsIHRvdGFsbHktb3JkZXJlZCBxdWV1ZSBhbmQgZGVsaXZlcmVkIGF0IHRoZSBuZXh0IG1pY3JvdGFza1xuICogY2hlY2twb2ludCAoXCJvbmUgYmVhdCBiZWhpbmRcIikuIE9taXQgYGRlbGl2ZXJ5YCBmb3IgdGhlIGhpc3RvcmljYWxcbiAqIHN5bmNocm9ub3VzIGNhbGwgKGJ5dGUtaWRlbnRpY2FsIHRvIHByZXZpb3VzIHJlbGVhc2VzKS4gQWNjb3VudGluZ1xuICogc3VyZmFjZXMgb24gYHNuYXBzaG90Lm9ic2VydmVyU3RhdHNgOyBgZXhlY3V0b3IuZHJhaW5PYnNlcnZlcnMoKWAgc2V0dGxlc1xuICogYXN5bmMgbGlzdGVuZXJzIGJlZm9yZSBzaHV0ZG93bi4gU2VlIGBkb2NzL2d1aWRlcy9vYnNlcnZlcnMtZGVmZXJyZWQubWRgLlxuICovXG5leHBvcnQgdHlwZSB7XG4gIEF0dGFjaFJlY29yZGVyT3B0aW9ucyxcbiAgT2JzZXJ2ZXJEZWxpdmVyeSxcbiAgT2JzZXJ2ZXJEcmFpblJlc3VsdCxcbiAgT2JzZXJ2ZXJTdGF0cyxcbn0gZnJvbSAnLi9saWIvcnVubmVyL2luZGV4LmpzJztcblxuLyoqXG4gKiBAY2F0ZWdvcnkgT2JzZXJ2ZSDigJQgRGVsaXZlcnkgdGllciAoUkZDLTAwMSBkZWZlcnJlZCBvYnNlcnZlcnMpXG4gKlxuICogYENhcHR1cmVQb2xpY3lgIOKAlCBob3cgYSBkZWZlcnJlZCBldmVudCdzIHBheWxvYWQgaXMgbWF0ZXJpYWxpemVkIGF0XG4gKiBjYXB0dXJlIHRpbWUgKGAnY2xvbmUnYCBieSBkZWZhdWx0IGZvciBhdHRhY2ggb3B0aW9ucyAvIGAnc3VtbWFyeSdgIC8gYCdyZWYnYCkuIGBPdmVyZmxvd1BvbGljeWBcbiAqIOKAlCB3aGF0IGEgc2F0dXJhdGVkIHF1ZXVlIGRvZXMgKGAnZHJvcC1vbGRlc3QnYCBkZWZhdWx0IC8gYCdzYW1wbGUnYCAvXG4gKiBgJ2Jsb2NrJ2ApLiBgRGlzcGF0Y2hlclN0YXRzYCAvIGBMaXN0ZW5lclN0YXRzYCDigJQgdGhlIGFjY291bnRpbmcgc2hhcGVzXG4gKiBlbWJlZGRlZCBpbiBgT2JzZXJ2ZXJTdGF0c2AuIFR5cGVzIG9ubHkg4oCUIHRoZSBvYnNlcnZlci1xdWV1ZSBtb2R1bGVcbiAqIGl0c2VsZiBpcyBpbnRlcm5hbDsgY29uc3VtZXJzIHVzZSB0aGUgYXR0YWNoIG9wdGlvbnMuXG4gKi9cbmV4cG9ydCB0eXBlIHsgQ2FwdHVyZVBvbGljeSwgRGlzcGF0Y2hlclN0YXRzLCBMaXN0ZW5lclN0YXRzLCBPdmVyZmxvd1BvbGljeSB9IGZyb20gJy4vbGliL29ic2VydmVyLXF1ZXVlL2luZGV4LmpzJztcblxuLyoqIEBjYXRlZ29yeSBPYnNlcnZlIOKAlCBDb21iaW5lZCAoYm90aCBkYXRhLWZsb3cgYW5kIGNvbnRyb2wtZmxvdykgKi9cbmV4cG9ydCB0eXBlIHsgQ29tYmluZWRSZWNvcmRlciB9IGZyb20gJy4vbGliL3JlY29yZGVyL2luZGV4LmpzJztcbi8qKiBAY2F0ZWdvcnkgT2JzZXJ2ZSDigJQgQ29tYmluZWQgKGJvdGggZGF0YS1mbG93IGFuZCBjb250cm9sLWZsb3cpICovXG5leHBvcnQge1xuICBoYXNFbWl0UmVjb3JkZXJNZXRob2RzLFxuICBoYXNGbG93UmVjb3JkZXJNZXRob2RzLFxuICBoYXNSZWNvcmRlck1ldGhvZHMsXG4gIGlzRmxvd0V2ZW50LFxufSBmcm9tICcuL2xpYi9yZWNvcmRlci9pbmRleC5qcyc7XG5cbi8qKlxuICogQGNhdGVnb3J5IE9ic2VydmUg4oCUIEVtaXQgKHVzZXItYXV0aG9yZWQgc3RydWN0dXJlZCBldmVudHMpXG4gKlxuICogVGhpcmQgb2JzZXJ2ZXIgY2hhbm5lbCAoYWxvbmdzaWRlIGBTY29wZVJlY29yZGVyYCBhbmQgYEZsb3dSZWNvcmRlcmApLiBDb25zdW1lclxuICogY29kZSBjYWxscyBgc2NvcGUuJGVtaXQobmFtZSwgcGF5bG9hZClgIGZyb20gaW5zaWRlIGEgc3RhZ2U7IGV2ZXJ5IGF0dGFjaGVkXG4gKiBgRW1pdFJlY29yZGVyLm9uRW1pdChldmVudClgIGZpcmVzIHN5bmNocm9ub3VzbHkgd2l0aCBzdGFnZS1jb250ZXh0XG4gKiBlbnJpY2htZW50LiBQYXNzLXRocm91Z2gg4oCUIG5vIGJ1ZmZlcmluZywgemVybyBhbGxvY2F0aW9uIHdoZW4gbm8gcmVjb3JkZXJcbiAqIGlzIGF0dGFjaGVkLlxuICovXG5leHBvcnQgdHlwZSB7IEVtaXRFdmVudCwgRW1pdFJlY29yZGVyIH0gZnJvbSAnLi9saWIvcmVjb3JkZXIvaW5kZXguanMnO1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBPYnNlcnZlIOKAlCBGbG93IChGbG93UmVjb3JkZXIsIGZpcmVzIGFmdGVyIHN0YWdlIGV4ZWN1dGlvbilcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqIEBjYXRlZ29yeSBPYnNlcnZlIOKAlCBGbG93ICovXG5leHBvcnQgdHlwZSB7XG4gIEZsb3dBdHRlbXB0RXZlbnQsXG4gIEZsb3dCcmVha0V2ZW50LFxuICBGbG93RGVjaXNpb25FdmVudCxcbiAgRmxvd0Vycm9yRXZlbnQsXG4gIEZsb3dGb3JrRXZlbnQsXG4gIEZsb3dMb29wRXZlbnQsXG4gIEZsb3dOZXh0RXZlbnQsXG4gIEZsb3dSZWNvcmRlcixcbiAgRmxvd1J1bkV2ZW50LFxuICBGbG93UnVuRmFpbGVkRXZlbnQsXG4gIEZsb3dTZWxlY3RlZEV2ZW50LFxuICBGbG93U3RhZ2VFdmVudCxcbiAgRmxvd1N0YWdlUmV0cnlFdmVudCxcbiAgRmxvd1N1YmZsb3dFdmVudCxcbiAgRmxvd1N1YmZsb3dSZWdpc3RlcmVkRXZlbnQsXG4gIEZsb3dUaHJvdHRsZWRFdmVudCxcbiAgUmVzdW1lTGluayxcbiAgVHJhdmVyc2FsQ29udGV4dCxcbn0gZnJvbSAnLi9saWIvZW5naW5lL2luZGV4LmpzJztcblxuLyoqIEBjYXRlZ29yeSBPYnNlcnZlIOKAlCBGbG93ICovXG5leHBvcnQgdHlwZSB7IENvbWJpbmVkTmFycmF0aXZlRW50cnkgfSBmcm9tICcuL2xpYi9lbmdpbmUvaW5kZXguanMnO1xuXG4vKipcbiAqIEBjYXRlZ29yeSBPYnNlcnZlIOKAlCBGbG93XG4gKlxuICogYE5hcnJhdGl2ZUZvcm1hdHRlcmAg4oCUIHBsdWdnYWJsZSBmb3JtYXR0ZXIgdGhhdCBjb252ZXJ0cyBldmVudCBjb250ZXh0XG4gKiBvYmplY3RzIGludG8gdGhlIHRleHQgbGluZXMgb2YgdGhlIG5hcnJhdGl2ZS5cbiAqL1xuZXhwb3J0IHR5cGUgeyBOYXJyYXRpdmVGb3JtYXR0ZXIgfSBmcm9tICcuL2xpYi9lbmdpbmUvaW5kZXguanMnO1xuXG4vKiogQGNhdGVnb3J5IE9ic2VydmUg4oCUIEZsb3cgKi9cbmV4cG9ydCB7IE5hcnJhdGl2ZUZsb3dSZWNvcmRlciB9IGZyb20gJy4vbGliL2VuZ2luZS9pbmRleC5qcyc7XG5cbi8qKiBAY2F0ZWdvcnkgT2JzZXJ2ZSDigJQgRmxvdyAqL1xuZXhwb3J0IHR5cGUgeyBNYW5pZmVzdEF0dGVtcHRSb3csIE1hbmlmZXN0RW50cnkgfSBmcm9tICcuL2xpYi9lbmdpbmUvaW5kZXguanMnO1xuXG4vKiogQGNhdGVnb3J5IE9ic2VydmUg4oCUIEZsb3cgKi9cbmV4cG9ydCB7IE1hbmlmZXN0Rmxvd1JlY29yZGVyIH0gZnJvbSAnLi9saWIvZW5naW5lL2luZGV4LmpzJztcblxuLyoqIEBjYXRlZ29yeSBPYnNlcnZlIOKAlCBGbG93ICovXG5leHBvcnQgeyBBZGFwdGl2ZU5hcnJhdGl2ZUZsb3dSZWNvcmRlciB9IGZyb20gJy4vbGliL2VuZ2luZS9pbmRleC5qcyc7XG5cbi8qKiBAY2F0ZWdvcnkgT2JzZXJ2ZSDigJQgRmxvdyAqL1xuZXhwb3J0IHsgTWlsZXN0b25lTmFycmF0aXZlRmxvd1JlY29yZGVyIH0gZnJvbSAnLi9saWIvZW5naW5lL2luZGV4LmpzJztcblxuLyoqIEBjYXRlZ29yeSBPYnNlcnZlIOKAlCBGbG93ICovXG5leHBvcnQgeyBQcm9ncmVzc2l2ZU5hcnJhdGl2ZUZsb3dSZWNvcmRlciB9IGZyb20gJy4vbGliL2VuZ2luZS9pbmRleC5qcyc7XG5cbi8qKiBAY2F0ZWdvcnkgT2JzZXJ2ZSDigJQgRmxvdyAqL1xuZXhwb3J0IHsgUkxFTmFycmF0aXZlRmxvd1JlY29yZGVyIH0gZnJvbSAnLi9saWIvZW5naW5lL2luZGV4LmpzJztcblxuLyoqIEBjYXRlZ29yeSBPYnNlcnZlIOKAlCBGbG93ICovXG5leHBvcnQgeyBTZXBhcmF0ZU5hcnJhdGl2ZUZsb3dSZWNvcmRlciB9IGZyb20gJy4vbGliL2VuZ2luZS9pbmRleC5qcyc7XG5cbi8qKiBAY2F0ZWdvcnkgT2JzZXJ2ZSDigJQgRmxvdyAqL1xuZXhwb3J0IHsgU2lsZW50TmFycmF0aXZlRmxvd1JlY29yZGVyIH0gZnJvbSAnLi9saWIvZW5naW5lL2luZGV4LmpzJztcblxuLyoqIEBjYXRlZ29yeSBPYnNlcnZlIOKAlCBGbG93ICovXG5leHBvcnQgeyBXaW5kb3dlZE5hcnJhdGl2ZUZsb3dSZWNvcmRlciB9IGZyb20gJy4vbGliL2VuZ2luZS9pbmRleC5qcyc7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFNlbGYtRGVzY3JpYmluZyDigJQgLmNvbnRyYWN0KCksIHRvT3BlbkFQSSgpLCB0b01DUFRvb2woKVxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKiogQGNhdGVnb3J5IFNlbGYtRGVzY3JpYmluZyAqL1xuZXhwb3J0IHR5cGUgeyBKc29uU2NoZW1hIH0gZnJvbSAnLi9saWIvY29udHJhY3QvaW5kZXguanMnO1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBTbmFwc2hvdCAmIENvbXBvc2l0aW9uIOKAlCBTdWJmbG93IG5hdmlnYXRpb24gYW5kIENvbXBvc2FibGVSdW5uZXJcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqIEBjYXRlZ29yeSBTbmFwc2hvdCAmIENvbXBvc2l0aW9uICovXG5leHBvcnQgdHlwZSB7IENvbXBvc2FibGVSdW5uZXIgfSBmcm9tICcuL2xpYi9ydW5uZXIvaW5kZXguanMnO1xuXG4vKiogQGNhdGVnb3J5IFNuYXBzaG90ICYgQ29tcG9zaXRpb24gKi9cbmV4cG9ydCB0eXBlIHsgUmVjb3JkZXJTbmFwc2hvdCwgUnVudGltZVNuYXBzaG90LCBTdWJ0cmVlU25hcHNob3QgfSBmcm9tICcuL2xpYi9ydW5uZXIvaW5kZXguanMnO1xuXG4vKiogQGNhdGVnb3J5IFNuYXBzaG90ICYgQ29tcG9zaXRpb24gKi9cbmV4cG9ydCB7IGdldFN1YnRyZWVTbmFwc2hvdCwgbGlzdFN1YmZsb3dQYXRocyB9IGZyb20gJy4vbGliL3J1bm5lci9pbmRleC5qcyc7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFNjb3BlUmVjb3JkZXIgQ29tcG9zaXRpb24g4oCUIEJ1bmRsZSBtdWx0aXBsZSByZWNvcmRlcnMgaW50byBkb21haW4gcHJlc2V0c1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKiogQGNhdGVnb3J5IFNjb3BlUmVjb3JkZXIgKi9cbmV4cG9ydCB7IENvbXBvc2l0ZVJlY29yZGVyIH0gZnJvbSAnLi9saWIvcmVjb3JkZXIvaW5kZXguanMnO1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBQYXVzZS9SZXN1bWUg4oCUIFNlcmlhbGl6YWJsZSBjaGVja3BvaW50cyBmb3IgbG9uZy1ydW5uaW5nIG9yIGh1bWFuLWluLXRoZS1sb29wIGZsb3dzXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKiBAY2F0ZWdvcnkgUGF1c2UvUmVzdW1lICovXG4vKiogQGNhdGVnb3J5IFBhdXNlL1Jlc3VtZSAqL1xuZXhwb3J0IHR5cGUge1xuICBGbG93Y2hhcnRDaGVja3BvaW50LFxuICBQYXVzYWJsZUhhbmRsZXIsXG4gIFBhdXNlZEV4ZWN1dGlvbixcbiAgUGVuZGluZ1BhdXNlLFxuICBSZWRhY3Rpb25NYXJrcyxcbn0gZnJvbSAnLi9saWIvcGF1c2UvaW5kZXguanMnO1xuXG4vKipcbiAqIEBjYXRlZ29yeSBQYXVzZS9SZXN1bWVcbiAqXG4gKiBgaW50ZXJydXB0KHNjb3BlLCB7IHJlYXNvbiwgZXhwZWN0cz8gfSlgIOKAlCBzdG9wIG1pZC1zdGFnZSB0byBhc2sgYSBxdWVzdGlvbixcbiAqIGFuZCBnZXQgdGhlIGFuc3dlciBiYWNrIGF0IHRoZSBzYW1lIGNhbGwgc2l0ZSB3aGVuIHRoZSBydW4gcmVzdW1lcy4gUmVzdW1lXG4gKiByZS1lbnRlcnMgdGhlIHN0YWdlIGZyb20gaXRzIFRPUCAoc3RhZ2VzIGFyZSBhdG9taWMpLCBzbyBrZWVwIHRoZSBoYWxmXG4gKiBiZWZvcmUgdGhlIGNhbGwgaWRlbXBvdGVudC5cbiAqL1xuZXhwb3J0IHR5cGUgeyBJbnRlcnJ1cHRQYXlsb2FkIH0gZnJvbSAnLi9saWIvcGF1c2UvaW5kZXguanMnO1xuXG4vKiogQGNhdGVnb3J5IFBhdXNlL1Jlc3VtZSAqL1xuZXhwb3J0IHsgaW50ZXJydXB0IH0gZnJvbSAnLi9saWIvcGF1c2UvaW5kZXguanMnO1xuXG4vKiogQGNhdGVnb3J5IFNjb3BlUmVjb3JkZXIgKi9cbmV4cG9ydCB0eXBlIHsgQ29tcG9zaXRlU25hcHNob3QgfSBmcm9tICcuL2xpYi9yZWNvcmRlci9pbmRleC5qcyc7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIENvbmZpZ3VyYXRpb24g4oCUIFR5cGVzIHBhc3NlZCB0byBGbG93Q2hhcnRFeGVjdXRvciBhbmQgcnVuKClcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqIEBjYXRlZ29yeSBDb25maWd1cmF0aW9uICovXG5leHBvcnQgdHlwZSB7IEV4ZWN1dGlvbkVudiwgRXhlY3V0b3JSZXN1bHQsIFBhdXNlZFJlc3VsdCwgUnVuT3B0aW9ucyB9IGZyb20gJy4vbGliL2VuZ2luZS9pbmRleC5qcyc7XG5cbi8qKiBAY2F0ZWdvcnkgQ29uZmlndXJhdGlvbiAqL1xuZXhwb3J0IHR5cGUgeyBTY29wZUZhY3RvcnkgfSBmcm9tICcuL2xpYi9lbmdpbmUvaW5kZXguanMnO1xuXG4vKipcbiAqIEBjYXRlZ29yeSBDb25maWd1cmF0aW9uXG4gKlxuICogUmVhZC10cmFja2luZyBwb2xpY3kgZm9yIGBTdGFnZVNuYXBzaG90LnN0YWdlUmVhZHNgICgjMTQpOlxuICogYCdmdWxsJ2AgKGRlZmF1bHQg4oCUIHBlci1yZWFkIHZhbHVlIGNsb25lLCBoaXN0b3JpY2FsIGJlaGF2aW9yKSAvXG4gKiBgJ3N1bW1hcnknYCAoY2hlYXAgYFJlYWRTdW1tYXJ5TWFya2VyYCBwZXIgcmVhZCkgLyBgJ29mZidgIChubyB0cmFja2luZyxcbiAqIHplcm8gcGVyLXJlYWQgY2xvbmUpLiBQYXNzIGFzIGBuZXcgRmxvd0NoYXJ0RXhlY3V0b3IoY2hhcnQsIHsgcmVhZFRyYWNraW5nIH0pYFxuICogb3IgY2FsbCBgZXhlY3V0b3Iuc2V0UmVhZFRyYWNraW5nKG1vZGUpYCBiZWZvcmUgYHJ1bigpYC5cbiAqL1xuZXhwb3J0IHR5cGUgeyBSZWFkU3VtbWFyeU1hcmtlciwgUmVhZFRyYWNraW5nTW9kZSB9IGZyb20gJy4vbGliL21lbW9yeS9pbmRleC5qcyc7XG5cbi8qKlxuICogQGNhdGVnb3J5IENvbmZpZ3VyYXRpb25cbiAqXG4gKiBXcml0ZS10cmFja2luZyBwb2xpY3kgZm9yIGBTdGFnZVNuYXBzaG90LnN0YWdlV3JpdGVzYCAoIzEzYy1BKSDigJQgdGhlXG4gKiBzaWJsaW5nIG9mIGBSZWFkVHJhY2tpbmdNb2RlYDsgYm90aCBhbGlhcyB0aGUgc2hhcmVkIGBSZXRlbnRpb25Qb2xpY3lgXG4gKiBmYW1pbHkgZnJvbSBgbGliL2NhcHR1cmVgLiBgJ2Z1bGwnYCAoZGVmYXVsdCDigJQgcGVyLXdyaXRlIHZhbHVlIGNsb25lLFxuICogaGlzdG9yaWNhbCBiZWhhdmlvcikgLyBgJ3N1bW1hcnknYCAoY2hlYXAgYFdyaXRlU3VtbWFyeU1hcmtlcmAgcGVyIHdyaXRlKVxuICogLyBgJ29mZidgIChubyB0cmFja2luZzsgYHN0YWdlV3JpdGVzYCBhYnNlbnQgYW5kIHRoZSBgb25Db21taXRgIG11dGF0aW9uc1xuICogcGF5bG9hZCBpcyBlbXB0eSDigJQgd3JpdGVzIHRoZW1zZWx2ZXMgc3RpbGwgY29tbWl0LCBhbmQgdGhlIGNvbW1pdCBsb2cgaXNcbiAqIHVuYWZmZWN0ZWQpLiBQYXNzIGFzIGBuZXcgRmxvd0NoYXJ0RXhlY3V0b3IoY2hhcnQsIHsgd3JpdGVUcmFja2luZyB9KWAgb3JcbiAqIGNhbGwgYGV4ZWN1dG9yLnNldFdyaXRlVHJhY2tpbmcobW9kZSlgIGJlZm9yZSBgcnVuKClgLlxuICovXG5leHBvcnQgdHlwZSB7IFJldGVudGlvblBvbGljeSwgV3JpdGVTdW1tYXJ5TWFya2VyLCBXcml0ZVRyYWNraW5nTW9kZSB9IGZyb20gJy4vbGliL21lbW9yeS9pbmRleC5qcyc7XG5cbi8qKlxuICogQGNhdGVnb3J5IENvbmZpZ3VyYXRpb25cbiAqXG4gKiBDb21taXQtdmFsdWVzIGVuY29kaW5nIGZvciB0aGUgQ09NTUlUIExPRyAoIzEzYy1CKSDigJQgdGhlIHRoaXJkIGRpYWwgb2ZcbiAqIHRoZSBmYW1pbHksIGFuZCB0aGUgb25seSBMT1NTTEVTUyBvbmUgKGl0IGNoYW5nZXMgdGhlIGxvZydzIGVuY29kaW5nLFxuICogbmV2ZXIgaXRzIGluZm9ybWF0aW9uKS4gYCdmdWxsJ2AgKGRlZmF1bHQg4oCUIGV2ZXJ5IHN1cnZpdmluZyBgc2V0YCBzdG9yZXNcbiAqIHRoZSBmdWxsIGZpbmFsIHZhbHVlLCBieXRlLWlkZW50aWNhbCB0byBoaXN0b3J5KSAvIGAnZGVsdGEnYCAoYXJyYXlcbiAqIG5ldC1jaGFuZ2VzIHRoYXQgYXJlIFwiYmFzZSBwbHVzIGEgdGFpbFwiIGNvbW1pdCBhcyBhbiBgYXBwZW5kYCB2ZXJiXG4gKiBzdG9yaW5nIG9ubHkgdGhlIHRhaWw7IGBkZWxldGVWYWx1ZSgpYCBjb21taXRzIGFzIGEgcmVhbCBgZGVsZXRlYCB2ZXJiO1xuICogb25lIHRyYWNlIGVudHJ5IHBlciBzdXJ2aXZpbmcgcGF0aCkuIFJlcGxheSByZWNvbnN0cnVjdHMgZXZlcnkgc3RlcCdzXG4gKiBmdWxsIHN0YXRlIGV4YWN0bHkuIENvbnN1bWVycyByZWFkaW5nIGBidW5kbGUub3ZlcndyaXRlW2tleV1gIGFzIHRoZSBmdWxsXG4gKiB2YWx1ZSBtdXN0IHVzZSBgY29tbWl0VmFsdWVBdGAgZnJvbSBgZm9vdHRyYWNlYC4gUGFzcyBhc1xuICogYG5ldyBGbG93Q2hhcnRFeGVjdXRvcihjaGFydCwgeyBjb21taXRWYWx1ZXMgfSlgIG9yIGNhbGxcbiAqIGBleGVjdXRvci5zZXRDb21taXRWYWx1ZXMobW9kZSlgIGJlZm9yZSBgcnVuKClgOyB0aGUgYWN0aXZlIG1vZGUgaXMgdGhlXG4gKiBzbmFwc2hvdCBkaXNjcmltaW5hbnQgYGdldFNuYXBzaG90KCkuY29tbWl0VmFsdWVzYC5cbiAqL1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBDb250cmFjdCAmIFZhbGlkYXRpb25cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqIEBjYXRlZ29yeSBDb250cmFjdCAmIFZhbGlkYXRpb24gKi9cbmV4cG9ydCB0eXBlIHsgU2NoZW1hS2luZCwgVmFsaWRhdGlvbklzc3VlLCBWYWxpZGF0aW9uUmVzdWx0IH0gZnJvbSAnLi9saWIvc2NoZW1hL2luZGV4LmpzJztcblxuLyoqIEBjYXRlZ29yeSBDb250cmFjdCAmIFZhbGlkYXRpb24gKi9cbmV4cG9ydCB7IGRldGVjdFNjaGVtYSwgaXNWYWxpZGF0YWJsZSwgaXNab2QgfSBmcm9tICcuL2xpYi9zY2hlbWEvaW5kZXguanMnO1xuXG4vKiogQGNhdGVnb3J5IENvbnRyYWN0ICYgVmFsaWRhdGlvbiAqL1xuZXhwb3J0IHsgSW5wdXRWYWxpZGF0aW9uRXJyb3IsIHZhbGlkYXRlQWdhaW5zdFNjaGVtYSwgdmFsaWRhdGVPclRocm93IH0gZnJvbSAnLi9saWIvc2NoZW1hL2luZGV4LmpzJztcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gRXJyb3IgVXRpbGl0aWVzXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKiBAY2F0ZWdvcnkgRXJyb3IgVXRpbGl0aWVzICovXG5leHBvcnQgdHlwZSB7IFN0cnVjdHVyZWRFcnJvckluZm8gfSBmcm9tICcuL2xpYi9lbmdpbmUvaW5kZXguanMnO1xuXG4vKiogQGNhdGVnb3J5IEVycm9yIFV0aWxpdGllcyAqL1xuZXhwb3J0IHsgZXh0cmFjdEVycm9ySW5mbywgZm9ybWF0RXJyb3JJbmZvIH0gZnJvbSAnLi9saWIvZW5naW5lL2luZGV4LmpzJztcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gRGV2IFRvb2xzIOKAlCBNb2RlIGZsYWdzIGFuZCBab2Qgc2NvcGUgdXRpbGl0aWVzXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogQGNhdGVnb3J5IERldiBUb29sc1xuICpcbiAqIEdsb2JhbCBkZXYtbW9kZSBmbGFnLiBDYWxsIGBlbmFibGVEZXZNb2RlKClgIGF0IGFwcGxpY2F0aW9uIHN0YXJ0dXAgdG9cbiAqIHR1cm4gb24gZGV2ZWxvcGVyLW9ubHkgZGlhZ25vc3RpY3MgYWNyb3NzIHRoZSBsaWJyYXJ5IOKAlCBjaXJjdWxhci1yZWZlcmVuY2VcbiAqIGRldGVjdGlvbiBpbiBzY29wZSB3cml0ZXMsIHdhcm5pbmdzIHdoZW4gYSByZWNvcmRlciBoYXMgbm8gb2JzZXJ2ZXJcbiAqIG1ldGhvZHMsIHN1c3BpY2lvdXMtcHJlZGljYXRlIHdhcm5pbmdzIGluIGRlY2lkZS9zZWxlY3QsIHN0cnVjdHVyYWxcbiAqIGNoZWNrcyBpbiBgZ2V0U3VidHJlZVNuYXBzaG90YCwgYW5kIGFueSBmdXR1cmUgZGV2LW9ubHkgZGlhZ25vc3RpYy5cbiAqXG4gKiBQcm9kdWN0aW9uIGxlYXZlcyBpdCBPRkYgYnkgZGVmYXVsdCAoemVybyBvdmVyaGVhZCkuIFNlZSB0aGUgSlNEb2Mgb25cbiAqIGBlbmFibGVEZXZNb2RlYCBmb3IgdGhlIGZ1bGwgbGlzdCBhbmQgdXNhZ2UgZXhhbXBsZS5cbiAqL1xuZXhwb3J0IHsgZGlzYWJsZURldk1vZGUsIGVuYWJsZURldk1vZGUsIGlzRGV2TW9kZSB9IGZyb20gJy4vbGliL2Rldk1vZGUuanMnO1xuXG4vLyBgZGVmaW5lU2NvcGVGcm9tWm9kYCBhbmQgdGhlIG90aGVyIHpvZC1iYXNlZCBzY29wZSBoZWxwZXJzIG1vdmVkIHRvIHRoZSBvcHQtaW5cbi8vIGBmb290cHJpbnRqcy96b2RgIGVudHJ5IOKAlCBrZWVwaW5nIHpvZCBvdXQgb2YgdGhlIGNvcmUgbG9hZCBwYXRoIChpdCBpcyBhblxuLy8gb3B0aW9uYWwgcGVlcikuIEltcG9ydCB0aGVtIGZyb20gJ2Zvb3RwcmludGpzL3pvZCcuXG4vLyBBIHJ1bidzIHJlY29yZCBhcyBKU09OIHdpdGhvdXQgdGhlIGVuZ2luZSdzIHJlY3Vyc2lvbiBsaW1pdCAoOS4yNi4wKTogdGhlXG4vLyBzYW1lIGJ5dGVzIEpTT04uc3RyaW5naWZ5IGVtaXRzLCBmb3IgYSBkZWVwIGBuZXh0YCBjaGFpbiBpdCBjYW5ub3QgZW5jb2RlLlxuZXhwb3J0IHR5cGUgeyBSZXRyeUxvb3BDYWxsLCBSZXRyeUxvb3BEZWNpc2lvbiwgUmV0cnlMb29wSWRlbnRpdHkgfSBmcm9tICcuL2xpYi9hdHRlbXB0L3JldHJ5TG9vcFR5cGVzLmpzJztcbmV4cG9ydCB0eXBlIHsgUmV0cnlMb29wQ29udGV4dCwgUmV0cnlMb29wT3B0aW9ucywgUmV0cnlMb29wU3RhdGUgfSBmcm9tICcuL2xpYi9idWlsZGVyL3JldHJ5TG9vcC5qcyc7XG5leHBvcnQgeyBzdHJpbmdpZnlTbmFwc2hvdCB9IGZyb20gJy4vbGliL3J1bm5lci9zdHJpbmdpZnlTbmFwc2hvdC5qcyc7XG4iXX0=
151
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7O0dBZ0JHOzs7QUFTSCw0QkFBNEI7QUFDNUIsbURBQXdGO0FBQS9FLHFHQUFBLFNBQVMsT0FBQTtBQUFFLDRHQUFBLGdCQUFnQixPQUFBO0FBQUUsNkdBQUEsaUJBQWlCLE9BQUE7QUFzQ3ZELGtEQUFtRDtBQUExQyxzR0FBQSxVQUFVLE9BQUE7QUFRbkIsNEJBQTRCO0FBQzVCLCtDQUEyQztBQUFsQyx5R0FBQSxTQUFTLE9BQUE7QUFvQmxCLG1DQUFtQztBQUNuQyxrREFBdUQ7QUFBOUMsa0dBQUEsTUFBTSxPQUFBO0FBQUUsa0dBQUEsTUFBTSxPQUFBO0FBaUR2Qjs7Ozs7O0dBTUc7QUFDSCxtREFBcUg7QUFBNUcsbUdBQUEsT0FBTyxPQUFBO0FBQUUsK0dBQUEsbUJBQW1CLE9BQUE7QUFBRSx5R0FBQSxhQUFhLE9BQUE7QUFBRSxzR0FBQSxVQUFVLE9BQUE7QUFBRSw4R0FBQSxrQkFBa0IsT0FBQTtBQVdwRixtREFBK0Y7QUFBdEYsNkdBQUEsaUJBQWlCLE9BQUE7QUFBRSw0R0FBQSxnQkFBZ0IsT0FBQTtBQUFFLDRHQUFBLGdCQUFnQixPQUFBO0FBMEI5RCxvQkFBb0I7QUFDcEIsa0RBQXdEO0FBQS9DLDJHQUFBLGVBQWUsT0FBQTtBQVF4QixvQkFBb0I7QUFDcEIsa0RBQTBEO0FBQWpELDZHQUFBLGlCQUFpQixPQUFBO0FBRTFCLG9CQUFvQjtBQUNwQixrREFBbUQ7QUFBMUMsc0dBQUEsVUFBVSxPQUFBO0FBcUJuQiwrQkFBK0I7QUFDL0IsaURBQXNEO0FBQTdDLDBHQUFBLGNBQWMsT0FBQTtBQUV2QiwrQkFBK0I7QUFDL0Isa0RBQXFEO0FBQTVDLDBHQUFBLGFBQWEsT0FBQTtBQUV0QixvQ0FBb0M7QUFDcEMscURBQTREO0FBQW5ELDhHQUFBLGlCQUFpQixPQUFBO0FBbUMxQixxRUFBcUU7QUFDckUscURBS2lDO0FBSi9CLG1IQUFBLHNCQUFzQixPQUFBO0FBQ3RCLG1IQUFBLHNCQUFzQixPQUFBO0FBQ3RCLCtHQUFBLGtCQUFrQixPQUFBO0FBQ2xCLHdHQUFBLFdBQVcsT0FBQTtBQW1EYiwrQkFBK0I7QUFDL0IsbURBQThEO0FBQXJELGtIQUFBLHFCQUFxQixPQUFBO0FBSzlCLCtCQUErQjtBQUMvQixtREFBNkQ7QUFBcEQsaUhBQUEsb0JBQW9CLE9BQUE7QUFFN0IsK0JBQStCO0FBQy9CLG1EQUFzRTtBQUE3RCwwSEFBQSw2QkFBNkIsT0FBQTtBQUV0QywrQkFBK0I7QUFDL0IsbURBQXVFO0FBQTlELDJIQUFBLDhCQUE4QixPQUFBO0FBRXZDLCtCQUErQjtBQUMvQixtREFBeUU7QUFBaEUsNkhBQUEsZ0NBQWdDLE9BQUE7QUFFekMsK0JBQStCO0FBQy9CLG1EQUFpRTtBQUF4RCxxSEFBQSx3QkFBd0IsT0FBQTtBQUVqQywrQkFBK0I7QUFDL0IsbURBQXNFO0FBQTdELDBIQUFBLDZCQUE2QixPQUFBO0FBRXRDLCtCQUErQjtBQUMvQixtREFBb0U7QUFBM0Qsd0hBQUEsMkJBQTJCLE9BQUE7QUFFcEMsK0JBQStCO0FBQy9CLG1EQUFzRTtBQUE3RCwwSEFBQSw2QkFBNkIsT0FBQTtBQW1CdEMsdUNBQXVDO0FBQ3ZDLG1EQUE2RTtBQUFwRSwrR0FBQSxrQkFBa0IsT0FBQTtBQUFFLDZHQUFBLGdCQUFnQixPQUFBO0FBRTdDLCtFQUErRTtBQUMvRSw0RUFBNEU7QUFDNUUsK0VBQStFO0FBRS9FLDhCQUE4QjtBQUM5QixxREFBNEQ7QUFBbkQsOEdBQUEsaUJBQWlCLE9BQUE7QUEwQjFCLDZCQUE2QjtBQUM3QixrREFBaUQ7QUFBeEMsc0dBQUEsU0FBUyxPQUFBO0FBZ0VsQixzQ0FBc0M7QUFDdEMsbURBQTJFO0FBQWxFLHlHQUFBLFlBQVksT0FBQTtBQUFFLDBHQUFBLGFBQWEsT0FBQTtBQUFFLGtHQUFBLEtBQUssT0FBQTtBQUUzQyxzQ0FBc0M7QUFDdEMsbURBQXFHO0FBQTVGLGlIQUFBLG9CQUFvQixPQUFBO0FBQUUsa0hBQUEscUJBQXFCLE9BQUE7QUFBRSw0R0FBQSxlQUFlLE9BQUE7QUFTckUsZ0NBQWdDO0FBQ2hDLG1EQUEwRTtBQUFqRSw2R0FBQSxnQkFBZ0IsT0FBQTtBQUFFLDRHQUFBLGVBQWUsT0FBQTtBQUUxQywrRUFBK0U7QUFDL0UsaURBQWlEO0FBQ2pELCtFQUErRTtBQUUvRTs7Ozs7Ozs7Ozs7R0FXRztBQUNILCtDQUE0RTtBQUFuRSw0R0FBQSxjQUFjLE9BQUE7QUFBRSwyR0FBQSxhQUFhLE9BQUE7QUFBRSx1R0FBQSxTQUFTLE9BQUE7QUFTakQsMEVBQXNFO0FBQTdELHlIQUFBLGlCQUFpQixPQUFBIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBGb290UHJpbnQg4oCUIFB1YmxpYyBBUEkgKHYzKVxuICpcbiAqIFRoZSBmbG93Y2hhcnQgcGF0dGVybiBmb3IgYmFja2VuZCBjb2RlLlxuICogQnVpbGQg4oaSIFJ1biDihpIgT2JzZXJ2ZS5cbiAqXG4gKiAqKlRoZSBjb21tb24gaW1wb3J0IHBhdGhzOioqXG4gKiBgYGB0c1xuICogaW1wb3J0IHsgZmxvd0NoYXJ0LCBkZWNpZGUsIG5hcnJhdGl2ZSB9IGZyb20gJ2Zvb3RwcmludGpzJzsgICAgICAgICAgIC8vIG1haW4g4oCUIHN0YXJ0IGhlcmVcbiAqIGltcG9ydCB7IG1ldHJpY3MsIGRlYnVnLCBtYW5pZmVzdCB9ICAgICBmcm9tICdmb290cHJpbnRqcy9yZWNvcmRlcnMnOyAvLyByZWNvcmRlciBmYWN0b3JpZXNcbiAqIGltcG9ydCB7IHN0YXRlQXQsIGNhdXNhbENoYWluIH0gZnJvbSAnZm9vdHRyYWNlJzsgICAgIC8vIHJlYWQgYSBmaW5pc2hlZCBydW5cbiAqIGltcG9ydCB7IFJlY29yZEZyYW1lLCBFdmVudExvZyB9IGZyb20gJ2Zvb3R0cmFjZS93cml0ZSc7ICAgICAvLyB3cml0ZSBhIHJlY29yZCB5b3Vyc2VsZlxuICogaW1wb3J0IHsgU3RhZ2VDb250ZXh0IH0gICAgICAgICAgICAgICAgIGZyb20gJ2Zvb3RwcmludGpzL2FkdmFuY2VkJzsgIC8vIGVuZ2luZSBpbnRlcm5hbHNcbiAqIGBgYFxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBRdWljayBTdGFydCDigJQgRXZlcnl0aGluZyB5b3UgbmVlZCBmb3IgOTAlIG9mIHVzZSBjYXNlc1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKiogQGNhdGVnb3J5IFF1aWNrIFN0YXJ0ICovXG5leHBvcnQgdHlwZSB7IEZsb3dDaGFydCwgU3RhZ2VGdW5jdGlvbiBhcyBTdGFnZUhhbmRsZXIsIFN0cmVhbUhhbmRsZXJzIH0gZnJvbSAnLi9saWIvYnVpbGRlci9pbmRleC5qcyc7XG5cbi8qKiBAY2F0ZWdvcnkgUXVpY2sgU3RhcnQgKi9cbmV4cG9ydCB7IGZsb3dDaGFydCwgRmxvd0NoYXJ0QnVpbGRlciwgZmxvd0NoYXJ0U2VsZWN0b3IgfSBmcm9tICcuL2xpYi9idWlsZGVyL2luZGV4LmpzJztcblxuLyoqXG4gKiBAY2F0ZWdvcnkgUXVpY2sgU3RhcnRcbiAqXG4gKiBDb25maWcgZm9yIGAuYWRkUGFyYWxsZWxGb3JFYWNoKClgIOKAlCBvbmUgYnJhbmNoIHBlciBpdGVtLCBicmFuY2ggY291bnRcbiAqIGRlY2lkZWQgYXQgcnVuIHRpbWUgZnJvbSB0aGUgcGF5bG9hZC4gYG1heEJyYW5jaGVzYCBhbmQgYGludG9gIGFyZSByZXF1aXJlZFxuICogb24gcHVycG9zZSAoc2VlIGRvY3MvZGVzaWduL2V4ZWN1dGlvbi1jb250cm9sLm1kKS5cbiAqL1xuZXhwb3J0IHR5cGUgeyBCcmFuY2hDaGFydCwgUGFyYWxsZWxGb3JFYWNoQ29uZmlnLCBSZXRyeVBvbGljeSB9IGZyb20gJy4vbGliL2J1aWxkZXIvaW5kZXguanMnO1xuXG4vKiogQGNhdGVnb3J5IFF1aWNrIFN0YXJ0IOKAlCBidWlsZC10aW1lIG9ic2VydmVyICh0d2luIG9mIEZsb3dSZWNvcmRlcikgKi9cbmV4cG9ydCB0eXBlIHtcbiAgU3RydWN0dXJlRGVjaWRlckNvbXBsZXRlRXZlbnQsXG4gIFN0cnVjdHVyZUVkZ2VBZGRlZEV2ZW50LFxuICBTdHJ1Y3R1cmVFZGdlS2luZCxcbiAgU3RydWN0dXJlTG9vcEVkZ2VBZGRlZEV2ZW50LFxuICBTdHJ1Y3R1cmVSZWNvcmRlcixcbiAgU3RydWN0dXJlU3RhZ2VBZGRlZEV2ZW50LFxuICBTdHJ1Y3R1cmVTdGFnZVRhZ2dlZEV2ZW50LFxuICBTdHJ1Y3R1cmVTdWJmbG93TW91bnRlZEV2ZW50LFxufSBmcm9tICcuL2xpYi9idWlsZGVyL2luZGV4LmpzJztcblxuLyoqXG4gKiBAY2F0ZWdvcnkgVGltZSBCdWRnZXRcbiAqXG4gKiBgdGltZUJ1ZGdldChjaGFydClgIOKAlCB0aGUgc2xvd2VzdCBhIGNoYXJ0IGNhbiB0YWtlLCBmcm9tIGl0cyBkZWNsYXJlZCByZXRyeSBwb2xpY2llcyAoYGF0dGVtcHRzIMOXIHRpbWVvdXRNc2AgcGx1c1xuICogdGhlIHdhaXRzLCBzdW1tZWQgYWxvbmcgdGhlIHNsb3dlc3QgcGF0aCksIGFuZCBldmVyeSBzdGFnZSB0aGF0IG1ha2VzIGEgcGF0aCB1bmJvdW5kZWQsIGJ5IG5hbWUuIGAuYnVkZ2V0KG1zKWBcbiAqIGRlY2xhcmVzIHRoZSBjYWxsZXIncyBjb250cmFjdDsgYGJ1aWxkKClgIHJlZnVzZXMgYSBjaGFydCB0aGF0IGNhbm5vdCBrZWVwIGl0LiBBbHNvIGBjaGFydC50aW1lQnVkZ2V0KClgLlxuICovXG5leHBvcnQgdHlwZSB7XG4gIEJ1ZGdldEFzc3VtcHRpb25zLFxuICBCdWRnZXRTdGVwLFxuICBUaW1lQnVkZ2V0T3B0aW9ucyxcbiAgVGltZUJ1ZGdldFJlcG9ydCxcbiAgVW5ib3VuZGVkUmVhc29uLFxuICBVbmJvdW5kZWRTdGFnZSxcbn0gZnJvbSAnLi9saWIvYnVkZ2V0L2luZGV4LmpzJztcbmV4cG9ydCB7IHRpbWVCdWRnZXQgfSBmcm9tICcuL2xpYi9idWRnZXQvaW5kZXguanMnO1xuXG4vKiogQGNhdGVnb3J5IFF1aWNrIFN0YXJ0ICovXG5leHBvcnQgdHlwZSB7IFR5cGVkU3RhZ2VGdW5jdGlvbiB9IGZyb20gJy4vbGliL2J1aWxkZXIvdHlwZWRGbG93Q2hhcnQuanMnO1xuXG4vKiogQGNhdGVnb3J5IFF1aWNrIFN0YXJ0ICovXG5leHBvcnQgdHlwZSB7IFNjb3BlTWV0aG9kcywgVHlwZWRTY29wZSB9IGZyb20gJy4vbGliL3JlYWN0aXZlL2luZGV4LmpzJztcblxuLyoqIEBjYXRlZ29yeSBRdWljayBTdGFydCAqL1xuZXhwb3J0IHsgbmFycmF0aXZlIH0gZnJvbSAnLi9yZWNvcmRlcnMuanMnO1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBEZWNpc2lvbiBCcmFuY2hpbmcg4oCUIGRlY2lkZSgpIC8gc2VsZWN0KCkgd2l0aCBldmlkZW5jZSBjYXB0dXJlXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKiBAY2F0ZWdvcnkgRGVjaXNpb24gQnJhbmNoaW5nICovXG5leHBvcnQgdHlwZSB7XG4gIERlY2lkZVJ1bGUsXG4gIERlY2lzaW9uRXZpZGVuY2UsXG4gIERlY2lzaW9uUmVzdWx0LFxuICBEZWZhdWx0QnJhbmNoLFxuICBGaWx0ZXJPcHMsXG4gIFJ1bGVFdmlkZW5jZSxcbiAgU2VsZWN0aW9uRXZpZGVuY2UsXG4gIFNlbGVjdGlvblJlc3VsdCxcbiAgV2hlbkNsYXVzZSxcbiAgV2hlcmVGaWx0ZXIsXG59IGZyb20gJy4vbGliL2RlY2lkZS9pbmRleC5qcyc7XG5cbi8qKiBAY2F0ZWdvcnkgRGVjaXNpb24gQnJhbmNoaW5nICovXG5leHBvcnQgeyBkZWNpZGUsIHNlbGVjdCB9IGZyb20gJy4vbGliL2RlY2lkZS9pbmRleC5qcyc7XG5cbi8qKiBAY2F0ZWdvcnkgRXJyb3JzICovXG5leHBvcnQgdHlwZSB7IFRlcm1pbmFsRmFpbHVyZUNvbnRleHQgfSBmcm9tICcuL2xpYi9lcnJvcnMvdGVybWluYWxGYWlsdXJlLmpzJztcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gQXR0ZW1wdHMg4oCUIGV2ZXJ5IHRyeSBvZiBhIHJldHJpZWQgc3RhZ2UsIGFuZCB0aGUgZGVjaXNpb24gdGhhdCBmb2xsb3dlZCBpdFxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIEBjYXRlZ29yeSBBdHRlbXB0c1xuICpcbiAqIE9uZSBgQXR0ZW1wdFJlY29yZGAgcGVyIGF0dGVtcHQgb2YgYSBzdGFnZSB3aXRoIGEgZGVjbGFyZWQgYHJldHJ5YCBwb2xpY3ksIGEgYHRpbWVvdXRNc2AsIG9yIGEgcnVuIGRlYWRsaW5lIOKAlFxuICogdGltaW5nLCBvdXRjb21lLCBmYWlsdXJlIGNhdGVnb3J5LCBhbmQgdGhlIHJldHJ5LW9yLXN0b3AgZGVjaXNpb24gYXMgYERlY2lzaW9uRXZpZGVuY2VgIOKAlCBvbiB0aGUgc3RhZ2Unc1xuICogZXhlY3V0aW9uLXRyZWUgbm9kZSAoYFN0YWdlU25hcHNob3QuYXR0ZW1wdHNgIC8gYGF0dGVtcHRTdW1tYXJ5YCkgYW5kIG9uIGBGbG93UmVjb3JkZXIub25BdHRlbXB0YC5cbiAqIEEgY2FsbCBhIHN0YWdlIG1ha2VzIHRocm91Z2ggYHNjb3BlLiRjYWxsYCBpcyByZWNvcmRlZCB0aGUgc2FtZSB3YXkgKGtpbmQgYCdjYWxsJ2ApLCBhbmQgc28gaXMgYW4gU0RLJ3Mgb3duIHJldHJ5XG4gKiBhbiBhZGFwdGVyIHJlcG9ydHMgdGhyb3VnaCBgb2JzZXJ2ZWQoKWAgKGBPYnNlcnZlZEF0dGVtcHRgLCBraW5kIGAnb2JzZXJ2ZWQnYCkuIGBBdHRlbXB0Q29udGV4dGAgaXMgd2hhdFxuICogYHNjb3BlLiRhdHRlbXB0KClgIHJldHVybnMsIGFuZCB3aGF0IGEgY2FsbCdzIGZ1bmN0aW9uIGdldHMgKHRoZSBhdHRlbXB0J3Mgc2lnbmFsLCB0aGUgdGltZSBsZWZ0LCBgb2JzZXJ2ZWRgKTtcbiAqIGBMYXRlV3JpdGVgIGlzIGEgd3JpdGUgKG9yIGNhbGwpIGFuIGVuZGVkIGF0dGVtcHQgdHJpZWQgKGBTdGFnZVNuYXBzaG90LmxhdGVXcml0ZXNgKS4gQSBzdGFnZSB0aGF0IGNoYW5nZXMgYW5cbiAqIG91dHNpZGUgc3lzdGVtIGRlY2xhcmVzIGl0IChgU3RhZ2VUb3VjaGVzYCwgYC50b3VjaGVzKClgKSwgYW5kIGEgY2FsbCBkb2VzIChgQ2FsbE9wdGlvbnNgKTogZXZlcnkgYXR0ZW1wdCB0aGVuXG4gKiBjYXJyaWVzIGl0cyBgQXR0ZW1wdEVmZmVjdGAsIGFuZCB0aGUga2V5IHJ1bGUgaXMgaGFuZGVkIGFuIGBJZGVtcG90ZW5jeUtleUNvbnRleHRgIG9uY2UgcGVyIGV4ZWN1dGlvbi5cbiAqL1xuZXhwb3J0IHR5cGUge1xuICBBdHRlbXB0Q2F0ZWdvcnksXG4gIEF0dGVtcHRDb250ZXh0LFxuICBBdHRlbXB0RWZmZWN0LFxuICBBdHRlbXB0RXJyb3IsXG4gIEF0dGVtcHRJbnB1dHMsXG4gIEF0dGVtcHRLaW5kLFxuICBBdHRlbXB0TmV4dCxcbiAgQXR0ZW1wdE9wdGlvbnMsXG4gIEF0dGVtcHRPdXRjb21lLFxuICBBdHRlbXB0UmVhc29uLFxuICBBdHRlbXB0UmVjb3JkLFxuICBBdHRlbXB0U3VtbWFyeSxcbiAgQ2FsbE9wdGlvbnMsXG4gIElkZW1wb3RlbmN5S2V5Q29udGV4dCxcbiAgTGF0ZVdyaXRlLFxuICBPYnNlcnZlZEF0dGVtcHQsXG4gIFN0YWdlVG91Y2hlcyxcbiAgVW5rbm93bkVmZmVjdEluaXQsXG59IGZyb20gJy4vbGliL2F0dGVtcHQvaW5kZXguanMnO1xuLyoqXG4gKiBAY2F0ZWdvcnkgQXR0ZW1wdHNcbiAqXG4gKiBBbiBhdHRlbXB0IGJ5IG5hbWUgKGBzZXJpZXNgICsgYGF0dGVtcHRgKSBhbmQgcGVyLW91dGNvbWUgY291bnRzIOKAlCB3aGF0IHJlY29yZGVyIHJvd3MgaG9sZCBvZiBhdHRlbXB0cy5cbiAqL1xuZXhwb3J0IHR5cGUgeyBBdHRlbXB0T3V0Y29tZUNvdW50cywgQXR0ZW1wdFJlZiB9IGZyb20gJy4vbGliL3JlY29yZGVyL2F0dGVtcHRTZXJpZXMuanMnO1xuXG4vKipcbiAqIEBjYXRlZ29yeSBBdHRlbXB0c1xuICpcbiAqIGBhdHRlbXB0KClgIOKAlCB0aGUgYXR0ZW1wdCBydW5uZXIgZm9yIGNvZGUgdGhhdCBpcyBub3QgYSBzdGFnZSAocmVjb3JkcyBnbyB0byBpdHMgYG9uQXR0ZW1wdGApOyBgZXJyb3JDYXRlZ29yeWBcbiAqIOKAlCB0aGUgb25lIGZhaWx1cmUgY2xhc3NpZmllciAoc2V2ZW4gZml4ZWQgY2F0ZWdvcmllcyk7IGByZXRyeVJ1bGVzYCDigJQgdGhlIG9uZSByZXRyeSBydWxlIHRhYmxlLCBhcyBgZGVjaWRlKClgXG4gKiBydWxlczsgdGhlIGF0dGVtcHQgY29udHJhY3QncyB0d28gZXJyb3JzLlxuICovXG5leHBvcnQgeyBhdHRlbXB0LCBBdHRlbXB0VGltZW91dEVycm9yLCBlcnJvckNhdGVnb3J5LCByZXRyeVJ1bGVzLCBVbmtub3duRWZmZWN0RXJyb3IgfSBmcm9tICcuL2xpYi9hdHRlbXB0L2luZGV4LmpzJztcblxuLyoqXG4gKiBAY2F0ZWdvcnkgQ29ycmVsYXRpb25cbiAqXG4gKiBUaGUgcnVuJ3MgY29ycmVsYXRpb24gKDEwLjEpOiBgZW52LnRyYWNlcGFyZW50YCAoVzNDLCBwYXJzZWQgc3RyaWN0bHkpIG9yIGBlbnYudHJhY2VJZGAgKyBgZW52Lm9wZXJhdGlvbklkYFxuICogYmVjb21lIE9ORSBmcm96ZW4gYFJ1bkNvcnJlbGF0aW9uYCBwZXIgcnVuIOKAlCBvbiBgZ2V0U25hcHNob3QoKS5jb3JyZWxhdGlvbmAsIGV2ZXJ5IGZsb3cgZXZlbnQnc1xuICogYHRyYXZlcnNhbENvbnRleHQuY29ycmVsYXRpb25gIGFuZCBldmVyeSBzY29wZSBhbmQgZW1pdCBldmVudCdzIGBjb3JyZWxhdGlvbmAuIGBwYXJzZVRyYWNlcGFyZW50YCAvXG4gKiBgZm9ybWF0VHJhY2VwYXJlbnRgIGFyZSB0aGUgVzNDIGNvZGVjOyBhIHJlZnVzZWQgaGVhZGVyIHRocm93cyBgVHJhY2VwYXJlbnRFcnJvcmAgd2l0aCBhIG5hbWVkIGByZWFzb25gLlxuICovXG5leHBvcnQgdHlwZSB7IFBhcnNlZFRyYWNlcGFyZW50LCBSdW5Db3JyZWxhdGlvbiwgVHJhY2VwYXJlbnRGaWVsZHMsIFRyYWNlcGFyZW50UmVmdXNhbCB9IGZyb20gJy4vbGliL2F0dGVtcHQvaW5kZXguanMnO1xuZXhwb3J0IHsgZm9ybWF0VHJhY2VwYXJlbnQsIHBhcnNlVHJhY2VwYXJlbnQsIFRyYWNlcGFyZW50RXJyb3IgfSBmcm9tICcuL2xpYi9hdHRlbXB0L2luZGV4LmpzJztcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gUnVuIOKAlCBFeGVjdXRlIGNoYXJ0cyBhbmQgY29sbGVjdCByZXN1bHRzXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKiBAY2F0ZWdvcnkgUnVuICovXG5leHBvcnQgdHlwZSB7IFJ1blJlc3VsdCB9IGZyb20gJy4vbGliL3J1bm5lci9pbmRleC5qcyc7XG5cbi8qKiBAY2F0ZWdvcnkgUnVuICovXG5leHBvcnQgdHlwZSB7IEZsb3dDaGFydEV4ZWN1dG9yT3B0aW9ucyB9IGZyb20gJy4vbGliL3J1bm5lci9pbmRleC5qcyc7XG5cbi8qKlxuICogVGhlIGNyYXNoLXNhZmUgcmVjb3JkICgxMC4xKTogdGhlIGV4ZWN1dG9yJ3MgYHNpbmtgIG9wdGlvbiwgaXRzIGFjY291bnRpbmcgb24gYGdldFNuYXBzaG90KCkuc2lua2AsXG4gKiBgZXhlY3V0b3IuZmx1c2hSZWNvcmQoKWAncyByZXN1bHQsIGFuZCB0aGUgZXJyb3IgYSBydW4gd2l0aCBgb25GYWlsdXJlOiAnZmFpbCdgIHJlamVjdHMgd2l0aC4gVGhlIHBvcnRcbiAqIChgUmVjb3JkU2lua2AsIGBtZW1vcnlTaW5rYCkgaXMgYGZvb3R0cmFjZS93cml0ZWAnczsgdGhlIGZpbGUgYWRhcHRlciBpcyBgZm9vdHByaW50anMvc2lua3NgLlxuICogQGNhdGVnb3J5IFJ1blxuICovXG5leHBvcnQgdHlwZSB7XG4gIFJlY29yZEZsdXNoUmVzdWx0LFxuICBSZWNvcmRTaW5rRmFpbHVyZU1vZGUsXG4gIFJlY29yZFNpbmtGbHVzaE1vZGUsXG4gIFJlY29yZFNpbmtPcHRpb24sXG4gIFJlY29yZFNpbmtPcHRpb25zLFxuICBSZWNvcmRTaW5rU3RhdHMsXG59IGZyb20gJy4vbGliL3J1bm5lci9pbmRleC5qcyc7XG4vKiogQGNhdGVnb3J5IFJ1biAqL1xuZXhwb3J0IHsgUmVjb3JkU2lua0Vycm9yIH0gZnJvbSAnLi9saWIvcnVubmVyL2luZGV4LmpzJztcblxuLyoqXG4gKiBUaGUgZm91ciBvYnNlcnZhYmlsaXR5IGRpYWxzIGBGbG93Q2hhcnRFeGVjdXRvck9wdGlvbnNgIGluaGVyaXRzLlxuICogQGNhdGVnb3J5IFJ1blxuICovXG5leHBvcnQgdHlwZSB7IFJ1bkRpYWxzIH0gZnJvbSAnLi9saWIvbWVtb3J5L2luZGV4LmpzJztcblxuLyoqIEBjYXRlZ29yeSBSdW4gKi9cbmV4cG9ydCB7IEZsb3dDaGFydEV4ZWN1dG9yIH0gZnJvbSAnLi9saWIvcnVubmVyL2luZGV4LmpzJztcblxuLyoqIEBjYXRlZ29yeSBSdW4gKi9cbmV4cG9ydCB7IFJ1bkNvbnRleHQgfSBmcm9tICcuL2xpYi9ydW5uZXIvaW5kZXguanMnO1xuXG4vKiogQGNhdGVnb3J5IFJ1biAqL1xuZXhwb3J0IHR5cGUgeyBDaGFydE9wZW5BUElPcHRpb25zLCBNQ1BUb29sRGVzY3JpcHRpb24sIFJ1bm5hYmxlRmxvd0NoYXJ0IH0gZnJvbSAnLi9saWIvcnVubmVyL1J1bm5hYmxlQ2hhcnQuanMnO1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBPYnNlcnZlIOKAlCBEYXRhIChzY29wZSByZWNvcmRlcnMsIGZpcmUgZHVyaW5nIHN0YWdlIGV4ZWN1dGlvbilcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqIEBjYXRlZ29yeSBPYnNlcnZlIOKAlCBEYXRhICovXG5leHBvcnQgdHlwZSB7XG4gIENvbW1pdEV2ZW50LFxuICBFcnJvckV2ZW50LFxuICBSZWFkRXZlbnQsXG4gIFJlZGFjdGlvblBvbGljeSxcbiAgUmVkYWN0aW9uUmVwb3J0LFxuICBTY29wZVJlY29yZGVyLFxuICBTdGFnZUV2ZW50LFxuICBXcml0ZUV2ZW50LFxufSBmcm9tICcuL2xpYi9zY29wZS9pbmRleC5qcyc7XG5cbi8qKiBAY2F0ZWdvcnkgT2JzZXJ2ZSDigJQgRGF0YSAqL1xuZXhwb3J0IHsgTWV0cmljUmVjb3JkZXIgfSBmcm9tICcuL2xpYi9zY29wZS9pbmRleC5qcyc7XG5cbi8qKiBAY2F0ZWdvcnkgT2JzZXJ2ZSDigJQgRGF0YSAqL1xuZXhwb3J0IHsgRGVidWdSZWNvcmRlciB9IGZyb20gJy4vbGliL3Njb3BlL2luZGV4LmpzJztcblxuLyoqIEBjYXRlZ29yeSBPYnNlcnZlIOKAlCBPcGVyYXRpb24gKi9cbmV4cG9ydCB7IFJlY29yZGVyT3BlcmF0aW9uIH0gZnJvbSAnLi9saWIvcmVjb3JkZXIvaW5kZXguanMnO1xuXG4vKipcbiAqIEBjYXRlZ29yeSBPYnNlcnZlIOKAlCBEZWxpdmVyeSB0aWVyIChSRkMtMDAxIGRlZmVycmVkIG9ic2VydmVycylcbiAqXG4gKiBFdmVyeSBgYXR0YWNoKlJlY29yZGVyYCBjYWxsIGFjY2VwdHMgYW4gb3B0aW9ucyBiYWc6XG4gKiBgZXhlY3V0b3IuYXR0YWNoU2NvcGVSZWNvcmRlcihyZWMsIHsgZGVsaXZlcnk6ICdkZWZlcnJlZCcgfSlgIHRha2VzIHRoZVxuICogcmVjb3JkZXIgT1VUIG9mIHRoZSBlbmdpbmUncyBob3QgcGF0aCDigJQgZXZlbnRzIGFyZSBjYXB0dXJlZCBpbnRvIG9uZVxuICogYm91bmRlZCwgdG90YWxseS1vcmRlcmVkIHF1ZXVlIGFuZCBkZWxpdmVyZWQgYXQgdGhlIG5leHQgbWljcm90YXNrXG4gKiBjaGVja3BvaW50IChcIm9uZSBiZWF0IGJlaGluZFwiKS4gT21pdCBgZGVsaXZlcnlgIGZvciB0aGUgaGlzdG9yaWNhbFxuICogc3luY2hyb25vdXMgY2FsbCAoYnl0ZS1pZGVudGljYWwgdG8gcHJldmlvdXMgcmVsZWFzZXMpLiBBY2NvdW50aW5nXG4gKiBzdXJmYWNlcyBvbiBgc25hcHNob3Qub2JzZXJ2ZXJTdGF0c2A7IGBleGVjdXRvci5kcmFpbk9ic2VydmVycygpYCBzZXR0bGVzXG4gKiBhc3luYyBsaXN0ZW5lcnMgYmVmb3JlIHNodXRkb3duLiBTZWUgYGRvY3MvZ3VpZGVzL29ic2VydmVycy1kZWZlcnJlZC5tZGAuXG4gKi9cbmV4cG9ydCB0eXBlIHtcbiAgQXR0YWNoUmVjb3JkZXJPcHRpb25zLFxuICBPYnNlcnZlckRlbGl2ZXJ5LFxuICBPYnNlcnZlckRyYWluUmVzdWx0LFxuICBPYnNlcnZlclN0YXRzLFxufSBmcm9tICcuL2xpYi9ydW5uZXIvaW5kZXguanMnO1xuXG4vKipcbiAqIEBjYXRlZ29yeSBPYnNlcnZlIOKAlCBEZWxpdmVyeSB0aWVyIChSRkMtMDAxIGRlZmVycmVkIG9ic2VydmVycylcbiAqXG4gKiBgQ2FwdHVyZVBvbGljeWAg4oCUIGhvdyBhIGRlZmVycmVkIGV2ZW50J3MgcGF5bG9hZCBpcyBtYXRlcmlhbGl6ZWQgYXRcbiAqIGNhcHR1cmUgdGltZSAoYCdjbG9uZSdgIGJ5IGRlZmF1bHQgZm9yIGF0dGFjaCBvcHRpb25zIC8gYCdzdW1tYXJ5J2AgLyBgJ3JlZidgKS4gYE92ZXJmbG93UG9saWN5YFxuICog4oCUIHdoYXQgYSBzYXR1cmF0ZWQgcXVldWUgZG9lcyAoYCdkcm9wLW9sZGVzdCdgIGRlZmF1bHQgLyBgJ3NhbXBsZSdgIC9cbiAqIGAnYmxvY2snYCkuIGBEaXNwYXRjaGVyU3RhdHNgIC8gYExpc3RlbmVyU3RhdHNgIOKAlCB0aGUgYWNjb3VudGluZyBzaGFwZXNcbiAqIGVtYmVkZGVkIGluIGBPYnNlcnZlclN0YXRzYC4gVHlwZXMgb25seSDigJQgdGhlIG9ic2VydmVyLXF1ZXVlIG1vZHVsZVxuICogaXRzZWxmIGlzIGludGVybmFsOyBjb25zdW1lcnMgdXNlIHRoZSBhdHRhY2ggb3B0aW9ucy5cbiAqL1xuZXhwb3J0IHR5cGUgeyBDYXB0dXJlUG9saWN5LCBEaXNwYXRjaGVyU3RhdHMsIExpc3RlbmVyU3RhdHMsIE92ZXJmbG93UG9saWN5IH0gZnJvbSAnLi9saWIvb2JzZXJ2ZXItcXVldWUvaW5kZXguanMnO1xuXG4vKiogQGNhdGVnb3J5IE9ic2VydmUg4oCUIENvbWJpbmVkIChib3RoIGRhdGEtZmxvdyBhbmQgY29udHJvbC1mbG93KSAqL1xuZXhwb3J0IHR5cGUgeyBDb21iaW5lZFJlY29yZGVyIH0gZnJvbSAnLi9saWIvcmVjb3JkZXIvaW5kZXguanMnO1xuLyoqIEBjYXRlZ29yeSBPYnNlcnZlIOKAlCBDb21iaW5lZCAoYm90aCBkYXRhLWZsb3cgYW5kIGNvbnRyb2wtZmxvdykgKi9cbmV4cG9ydCB7XG4gIGhhc0VtaXRSZWNvcmRlck1ldGhvZHMsXG4gIGhhc0Zsb3dSZWNvcmRlck1ldGhvZHMsXG4gIGhhc1JlY29yZGVyTWV0aG9kcyxcbiAgaXNGbG93RXZlbnQsXG59IGZyb20gJy4vbGliL3JlY29yZGVyL2luZGV4LmpzJztcblxuLyoqXG4gKiBAY2F0ZWdvcnkgT2JzZXJ2ZSDigJQgRW1pdCAodXNlci1hdXRob3JlZCBzdHJ1Y3R1cmVkIGV2ZW50cylcbiAqXG4gKiBUaGlyZCBvYnNlcnZlciBjaGFubmVsIChhbG9uZ3NpZGUgYFNjb3BlUmVjb3JkZXJgIGFuZCBgRmxvd1JlY29yZGVyYCkuIENvbnN1bWVyXG4gKiBjb2RlIGNhbGxzIGBzY29wZS4kZW1pdChuYW1lLCBwYXlsb2FkKWAgZnJvbSBpbnNpZGUgYSBzdGFnZTsgZXZlcnkgYXR0YWNoZWRcbiAqIGBFbWl0UmVjb3JkZXIub25FbWl0KGV2ZW50KWAgZmlyZXMgc3luY2hyb25vdXNseSB3aXRoIHN0YWdlLWNvbnRleHRcbiAqIGVucmljaG1lbnQuIFBhc3MtdGhyb3VnaCDigJQgbm8gYnVmZmVyaW5nLCB6ZXJvIGFsbG9jYXRpb24gd2hlbiBubyByZWNvcmRlclxuICogaXMgYXR0YWNoZWQuXG4gKi9cbmV4cG9ydCB0eXBlIHsgRW1pdEV2ZW50LCBFbWl0UmVjb3JkZXIgfSBmcm9tICcuL2xpYi9yZWNvcmRlci9pbmRleC5qcyc7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIE9ic2VydmUg4oCUIEZsb3cgKEZsb3dSZWNvcmRlciwgZmlyZXMgYWZ0ZXIgc3RhZ2UgZXhlY3V0aW9uKVxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKiogQGNhdGVnb3J5IE9ic2VydmUg4oCUIEZsb3cgKi9cbmV4cG9ydCB0eXBlIHtcbiAgRmxvd0F0dGVtcHRFdmVudCxcbiAgRmxvd0JyZWFrRXZlbnQsXG4gIEZsb3dEZWNpc2lvbkV2ZW50LFxuICBGbG93RXJyb3JFdmVudCxcbiAgRmxvd0ZvcmtFdmVudCxcbiAgRmxvd0xvb3BFdmVudCxcbiAgRmxvd05leHRFdmVudCxcbiAgRmxvd1JlY29yZGVyLFxuICBGbG93UnVuRXZlbnQsXG4gIEZsb3dSdW5GYWlsZWRFdmVudCxcbiAgRmxvd1NlbGVjdGVkRXZlbnQsXG4gIEZsb3dTdGFnZUV2ZW50LFxuICBGbG93U3RhZ2VSZXRyeUV2ZW50LFxuICBGbG93U3ViZmxvd0V2ZW50LFxuICBGbG93U3ViZmxvd1JlZ2lzdGVyZWRFdmVudCxcbiAgRmxvd1Rocm90dGxlZEV2ZW50LFxuICBSZXN1bWVMaW5rLFxuICBUcmF2ZXJzYWxDb250ZXh0LFxufSBmcm9tICcuL2xpYi9lbmdpbmUvaW5kZXguanMnO1xuXG4vKiogQGNhdGVnb3J5IE9ic2VydmUg4oCUIEZsb3cgKi9cbmV4cG9ydCB0eXBlIHsgQ29tYmluZWROYXJyYXRpdmVFbnRyeSB9IGZyb20gJy4vbGliL2VuZ2luZS9pbmRleC5qcyc7XG5cbi8qKlxuICogQGNhdGVnb3J5IE9ic2VydmUg4oCUIEZsb3dcbiAqXG4gKiBgTmFycmF0aXZlRm9ybWF0dGVyYCDigJQgcGx1Z2dhYmxlIGZvcm1hdHRlciB0aGF0IGNvbnZlcnRzIGV2ZW50IGNvbnRleHRcbiAqIG9iamVjdHMgaW50byB0aGUgdGV4dCBsaW5lcyBvZiB0aGUgbmFycmF0aXZlLlxuICovXG5leHBvcnQgdHlwZSB7IE5hcnJhdGl2ZUZvcm1hdHRlciB9IGZyb20gJy4vbGliL2VuZ2luZS9pbmRleC5qcyc7XG5cbi8qKiBAY2F0ZWdvcnkgT2JzZXJ2ZSDigJQgRmxvdyAqL1xuZXhwb3J0IHsgTmFycmF0aXZlRmxvd1JlY29yZGVyIH0gZnJvbSAnLi9saWIvZW5naW5lL2luZGV4LmpzJztcblxuLyoqIEBjYXRlZ29yeSBPYnNlcnZlIOKAlCBGbG93ICovXG5leHBvcnQgdHlwZSB7IE1hbmlmZXN0QXR0ZW1wdFJvdywgTWFuaWZlc3RFbnRyeSB9IGZyb20gJy4vbGliL2VuZ2luZS9pbmRleC5qcyc7XG5cbi8qKiBAY2F0ZWdvcnkgT2JzZXJ2ZSDigJQgRmxvdyAqL1xuZXhwb3J0IHsgTWFuaWZlc3RGbG93UmVjb3JkZXIgfSBmcm9tICcuL2xpYi9lbmdpbmUvaW5kZXguanMnO1xuXG4vKiogQGNhdGVnb3J5IE9ic2VydmUg4oCUIEZsb3cgKi9cbmV4cG9ydCB7IEFkYXB0aXZlTmFycmF0aXZlRmxvd1JlY29yZGVyIH0gZnJvbSAnLi9saWIvZW5naW5lL2luZGV4LmpzJztcblxuLyoqIEBjYXRlZ29yeSBPYnNlcnZlIOKAlCBGbG93ICovXG5leHBvcnQgeyBNaWxlc3RvbmVOYXJyYXRpdmVGbG93UmVjb3JkZXIgfSBmcm9tICcuL2xpYi9lbmdpbmUvaW5kZXguanMnO1xuXG4vKiogQGNhdGVnb3J5IE9ic2VydmUg4oCUIEZsb3cgKi9cbmV4cG9ydCB7IFByb2dyZXNzaXZlTmFycmF0aXZlRmxvd1JlY29yZGVyIH0gZnJvbSAnLi9saWIvZW5naW5lL2luZGV4LmpzJztcblxuLyoqIEBjYXRlZ29yeSBPYnNlcnZlIOKAlCBGbG93ICovXG5leHBvcnQgeyBSTEVOYXJyYXRpdmVGbG93UmVjb3JkZXIgfSBmcm9tICcuL2xpYi9lbmdpbmUvaW5kZXguanMnO1xuXG4vKiogQGNhdGVnb3J5IE9ic2VydmUg4oCUIEZsb3cgKi9cbmV4cG9ydCB7IFNlcGFyYXRlTmFycmF0aXZlRmxvd1JlY29yZGVyIH0gZnJvbSAnLi9saWIvZW5naW5lL2luZGV4LmpzJztcblxuLyoqIEBjYXRlZ29yeSBPYnNlcnZlIOKAlCBGbG93ICovXG5leHBvcnQgeyBTaWxlbnROYXJyYXRpdmVGbG93UmVjb3JkZXIgfSBmcm9tICcuL2xpYi9lbmdpbmUvaW5kZXguanMnO1xuXG4vKiogQGNhdGVnb3J5IE9ic2VydmUg4oCUIEZsb3cgKi9cbmV4cG9ydCB7IFdpbmRvd2VkTmFycmF0aXZlRmxvd1JlY29yZGVyIH0gZnJvbSAnLi9saWIvZW5naW5lL2luZGV4LmpzJztcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gU2VsZi1EZXNjcmliaW5nIOKAlCAuY29udHJhY3QoKSwgdG9PcGVuQVBJKCksIHRvTUNQVG9vbCgpXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKiBAY2F0ZWdvcnkgU2VsZi1EZXNjcmliaW5nICovXG5leHBvcnQgdHlwZSB7IEpzb25TY2hlbWEgfSBmcm9tICcuL2xpYi9jb250cmFjdC9pbmRleC5qcyc7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFNuYXBzaG90ICYgQ29tcG9zaXRpb24g4oCUIFN1YmZsb3cgbmF2aWdhdGlvbiBhbmQgQ29tcG9zYWJsZVJ1bm5lclxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKiogQGNhdGVnb3J5IFNuYXBzaG90ICYgQ29tcG9zaXRpb24gKi9cbmV4cG9ydCB0eXBlIHsgQ29tcG9zYWJsZVJ1bm5lciB9IGZyb20gJy4vbGliL3J1bm5lci9pbmRleC5qcyc7XG5cbi8qKiBAY2F0ZWdvcnkgU25hcHNob3QgJiBDb21wb3NpdGlvbiAqL1xuZXhwb3J0IHR5cGUgeyBSZWNvcmRlclNuYXBzaG90LCBSdW50aW1lU25hcHNob3QsIFN1YnRyZWVTbmFwc2hvdCB9IGZyb20gJy4vbGliL3J1bm5lci9pbmRleC5qcyc7XG5cbi8qKiBAY2F0ZWdvcnkgU25hcHNob3QgJiBDb21wb3NpdGlvbiAqL1xuZXhwb3J0IHsgZ2V0U3VidHJlZVNuYXBzaG90LCBsaXN0U3ViZmxvd1BhdGhzIH0gZnJvbSAnLi9saWIvcnVubmVyL2luZGV4LmpzJztcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gU2NvcGVSZWNvcmRlciBDb21wb3NpdGlvbiDigJQgQnVuZGxlIG11bHRpcGxlIHJlY29yZGVycyBpbnRvIGRvbWFpbiBwcmVzZXRzXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKiBAY2F0ZWdvcnkgU2NvcGVSZWNvcmRlciAqL1xuZXhwb3J0IHsgQ29tcG9zaXRlUmVjb3JkZXIgfSBmcm9tICcuL2xpYi9yZWNvcmRlci9pbmRleC5qcyc7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFBhdXNlL1Jlc3VtZSDigJQgU2VyaWFsaXphYmxlIGNoZWNrcG9pbnRzIGZvciBsb25nLXJ1bm5pbmcgb3IgaHVtYW4taW4tdGhlLWxvb3AgZmxvd3Ncbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqIEBjYXRlZ29yeSBQYXVzZS9SZXN1bWUgKi9cbi8qKiBAY2F0ZWdvcnkgUGF1c2UvUmVzdW1lICovXG5leHBvcnQgdHlwZSB7XG4gIEZsb3djaGFydENoZWNrcG9pbnQsXG4gIFBhdXNhYmxlSGFuZGxlcixcbiAgUGF1c2VkRXhlY3V0aW9uLFxuICBQZW5kaW5nUGF1c2UsXG4gIFJlZGFjdGlvbk1hcmtzLFxufSBmcm9tICcuL2xpYi9wYXVzZS9pbmRleC5qcyc7XG5cbi8qKlxuICogQGNhdGVnb3J5IFBhdXNlL1Jlc3VtZVxuICpcbiAqIGBpbnRlcnJ1cHQoc2NvcGUsIHsgcmVhc29uLCBleHBlY3RzPyB9KWAg4oCUIHN0b3AgbWlkLXN0YWdlIHRvIGFzayBhIHF1ZXN0aW9uLFxuICogYW5kIGdldCB0aGUgYW5zd2VyIGJhY2sgYXQgdGhlIHNhbWUgY2FsbCBzaXRlIHdoZW4gdGhlIHJ1biByZXN1bWVzLiBSZXN1bWVcbiAqIHJlLWVudGVycyB0aGUgc3RhZ2UgZnJvbSBpdHMgVE9QIChzdGFnZXMgYXJlIGF0b21pYyksIHNvIGtlZXAgdGhlIGhhbGZcbiAqIGJlZm9yZSB0aGUgY2FsbCBpZGVtcG90ZW50LlxuICovXG5leHBvcnQgdHlwZSB7IEludGVycnVwdFBheWxvYWQgfSBmcm9tICcuL2xpYi9wYXVzZS9pbmRleC5qcyc7XG5cbi8qKiBAY2F0ZWdvcnkgUGF1c2UvUmVzdW1lICovXG5leHBvcnQgeyBpbnRlcnJ1cHQgfSBmcm9tICcuL2xpYi9wYXVzZS9pbmRleC5qcyc7XG5cbi8qKiBAY2F0ZWdvcnkgU2NvcGVSZWNvcmRlciAqL1xuZXhwb3J0IHR5cGUgeyBDb21wb3NpdGVTbmFwc2hvdCB9IGZyb20gJy4vbGliL3JlY29yZGVyL2luZGV4LmpzJztcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gQ29uZmlndXJhdGlvbiDigJQgVHlwZXMgcGFzc2VkIHRvIEZsb3dDaGFydEV4ZWN1dG9yIGFuZCBydW4oKVxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKiogQGNhdGVnb3J5IENvbmZpZ3VyYXRpb24gKi9cbmV4cG9ydCB0eXBlIHsgRXhlY3V0aW9uRW52LCBFeGVjdXRvclJlc3VsdCwgUGF1c2VkUmVzdWx0LCBSdW5PcHRpb25zIH0gZnJvbSAnLi9saWIvZW5naW5lL2luZGV4LmpzJztcblxuLyoqIEBjYXRlZ29yeSBDb25maWd1cmF0aW9uICovXG5leHBvcnQgdHlwZSB7IFNjb3BlRmFjdG9yeSB9IGZyb20gJy4vbGliL2VuZ2luZS9pbmRleC5qcyc7XG5cbi8qKlxuICogQGNhdGVnb3J5IENvbmZpZ3VyYXRpb25cbiAqXG4gKiBSZWFkLXRyYWNraW5nIHBvbGljeSBmb3IgYFN0YWdlU25hcHNob3Quc3RhZ2VSZWFkc2AgKCMxNCk6XG4gKiBgJ2Z1bGwnYCAoZGVmYXVsdCDigJQgcGVyLXJlYWQgdmFsdWUgY2xvbmUsIGhpc3RvcmljYWwgYmVoYXZpb3IpIC9cbiAqIGAnc3VtbWFyeSdgIChjaGVhcCBgUmVhZFN1bW1hcnlNYXJrZXJgIHBlciByZWFkKSAvIGAnb2ZmJ2AgKG5vIHRyYWNraW5nLFxuICogemVybyBwZXItcmVhZCBjbG9uZSkuIFBhc3MgYXMgYG5ldyBGbG93Q2hhcnRFeGVjdXRvcihjaGFydCwgeyByZWFkVHJhY2tpbmcgfSlgXG4gKiBvciBjYWxsIGBleGVjdXRvci5zZXRSZWFkVHJhY2tpbmcobW9kZSlgIGJlZm9yZSBgcnVuKClgLlxuICovXG5leHBvcnQgdHlwZSB7IFJlYWRTdW1tYXJ5TWFya2VyLCBSZWFkVHJhY2tpbmdNb2RlIH0gZnJvbSAnLi9saWIvbWVtb3J5L2luZGV4LmpzJztcblxuLyoqXG4gKiBAY2F0ZWdvcnkgQ29uZmlndXJhdGlvblxuICpcbiAqIFdyaXRlLXRyYWNraW5nIHBvbGljeSBmb3IgYFN0YWdlU25hcHNob3Quc3RhZ2VXcml0ZXNgICgjMTNjLUEpIOKAlCB0aGVcbiAqIHNpYmxpbmcgb2YgYFJlYWRUcmFja2luZ01vZGVgOyBib3RoIGFsaWFzIHRoZSBzaGFyZWQgYFJldGVudGlvblBvbGljeWBcbiAqIGZhbWlseSBmcm9tIGBsaWIvY2FwdHVyZWAuIGAnZnVsbCdgIChkZWZhdWx0IOKAlCBwZXItd3JpdGUgdmFsdWUgY2xvbmUsXG4gKiBoaXN0b3JpY2FsIGJlaGF2aW9yKSAvIGAnc3VtbWFyeSdgIChjaGVhcCBgV3JpdGVTdW1tYXJ5TWFya2VyYCBwZXIgd3JpdGUpXG4gKiAvIGAnb2ZmJ2AgKG5vIHRyYWNraW5nOyBgc3RhZ2VXcml0ZXNgIGFic2VudCBhbmQgdGhlIGBvbkNvbW1pdGAgbXV0YXRpb25zXG4gKiBwYXlsb2FkIGlzIGVtcHR5IOKAlCB3cml0ZXMgdGhlbXNlbHZlcyBzdGlsbCBjb21taXQsIGFuZCB0aGUgY29tbWl0IGxvZyBpc1xuICogdW5hZmZlY3RlZCkuIFBhc3MgYXMgYG5ldyBGbG93Q2hhcnRFeGVjdXRvcihjaGFydCwgeyB3cml0ZVRyYWNraW5nIH0pYCBvclxuICogY2FsbCBgZXhlY3V0b3Iuc2V0V3JpdGVUcmFja2luZyhtb2RlKWAgYmVmb3JlIGBydW4oKWAuXG4gKi9cbmV4cG9ydCB0eXBlIHsgUmV0ZW50aW9uUG9saWN5LCBXcml0ZVN1bW1hcnlNYXJrZXIsIFdyaXRlVHJhY2tpbmdNb2RlIH0gZnJvbSAnLi9saWIvbWVtb3J5L2luZGV4LmpzJztcblxuLyoqXG4gKiBAY2F0ZWdvcnkgQ29uZmlndXJhdGlvblxuICpcbiAqIENvbW1pdC12YWx1ZXMgZW5jb2RpbmcgZm9yIHRoZSBDT01NSVQgTE9HICgjMTNjLUIpIOKAlCB0aGUgdGhpcmQgZGlhbCBvZlxuICogdGhlIGZhbWlseSwgYW5kIHRoZSBvbmx5IExPU1NMRVNTIG9uZSAoaXQgY2hhbmdlcyB0aGUgbG9nJ3MgZW5jb2RpbmcsXG4gKiBuZXZlciBpdHMgaW5mb3JtYXRpb24pLiBgJ2Z1bGwnYCAoZGVmYXVsdCDigJQgZXZlcnkgc3Vydml2aW5nIGBzZXRgIHN0b3Jlc1xuICogdGhlIGZ1bGwgZmluYWwgdmFsdWUsIGJ5dGUtaWRlbnRpY2FsIHRvIGhpc3RvcnkpIC8gYCdkZWx0YSdgIChhcnJheVxuICogbmV0LWNoYW5nZXMgdGhhdCBhcmUgXCJiYXNlIHBsdXMgYSB0YWlsXCIgY29tbWl0IGFzIGFuIGBhcHBlbmRgIHZlcmJcbiAqIHN0b3Jpbmcgb25seSB0aGUgdGFpbDsgYGRlbGV0ZVZhbHVlKClgIGNvbW1pdHMgYXMgYSByZWFsIGBkZWxldGVgIHZlcmI7XG4gKiBvbmUgdHJhY2UgZW50cnkgcGVyIHN1cnZpdmluZyBwYXRoKS4gUmVwbGF5IHJlY29uc3RydWN0cyBldmVyeSBzdGVwJ3NcbiAqIGZ1bGwgc3RhdGUgZXhhY3RseS4gQ29uc3VtZXJzIHJlYWRpbmcgYGJ1bmRsZS5vdmVyd3JpdGVba2V5XWAgYXMgdGhlIGZ1bGxcbiAqIHZhbHVlIG11c3QgdXNlIGBjb21taXRWYWx1ZUF0YCBmcm9tIGBmb290dHJhY2VgLiBQYXNzIGFzXG4gKiBgbmV3IEZsb3dDaGFydEV4ZWN1dG9yKGNoYXJ0LCB7IGNvbW1pdFZhbHVlcyB9KWAgb3IgY2FsbFxuICogYGV4ZWN1dG9yLnNldENvbW1pdFZhbHVlcyhtb2RlKWAgYmVmb3JlIGBydW4oKWA7IHRoZSBhY3RpdmUgbW9kZSBpcyB0aGVcbiAqIHNuYXBzaG90IGRpc2NyaW1pbmFudCBgZ2V0U25hcHNob3QoKS5jb21taXRWYWx1ZXNgLlxuICovXG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIENvbnRyYWN0ICYgVmFsaWRhdGlvblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKiogQGNhdGVnb3J5IENvbnRyYWN0ICYgVmFsaWRhdGlvbiAqL1xuZXhwb3J0IHR5cGUgeyBTY2hlbWFLaW5kLCBWYWxpZGF0aW9uSXNzdWUsIFZhbGlkYXRpb25SZXN1bHQgfSBmcm9tICcuL2xpYi9zY2hlbWEvaW5kZXguanMnO1xuXG4vKiogQGNhdGVnb3J5IENvbnRyYWN0ICYgVmFsaWRhdGlvbiAqL1xuZXhwb3J0IHsgZGV0ZWN0U2NoZW1hLCBpc1ZhbGlkYXRhYmxlLCBpc1pvZCB9IGZyb20gJy4vbGliL3NjaGVtYS9pbmRleC5qcyc7XG5cbi8qKiBAY2F0ZWdvcnkgQ29udHJhY3QgJiBWYWxpZGF0aW9uICovXG5leHBvcnQgeyBJbnB1dFZhbGlkYXRpb25FcnJvciwgdmFsaWRhdGVBZ2FpbnN0U2NoZW1hLCB2YWxpZGF0ZU9yVGhyb3cgfSBmcm9tICcuL2xpYi9zY2hlbWEvaW5kZXguanMnO1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBFcnJvciBVdGlsaXRpZXNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqIEBjYXRlZ29yeSBFcnJvciBVdGlsaXRpZXMgKi9cbmV4cG9ydCB0eXBlIHsgU3RydWN0dXJlZEVycm9ySW5mbyB9IGZyb20gJy4vbGliL2VuZ2luZS9pbmRleC5qcyc7XG5cbi8qKiBAY2F0ZWdvcnkgRXJyb3IgVXRpbGl0aWVzICovXG5leHBvcnQgeyBleHRyYWN0RXJyb3JJbmZvLCBmb3JtYXRFcnJvckluZm8gfSBmcm9tICcuL2xpYi9lbmdpbmUvaW5kZXguanMnO1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBEZXYgVG9vbHMg4oCUIE1vZGUgZmxhZ3MgYW5kIFpvZCBzY29wZSB1dGlsaXRpZXNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBAY2F0ZWdvcnkgRGV2IFRvb2xzXG4gKlxuICogR2xvYmFsIGRldi1tb2RlIGZsYWcuIENhbGwgYGVuYWJsZURldk1vZGUoKWAgYXQgYXBwbGljYXRpb24gc3RhcnR1cCB0b1xuICogdHVybiBvbiBkZXZlbG9wZXItb25seSBkaWFnbm9zdGljcyBhY3Jvc3MgdGhlIGxpYnJhcnkg4oCUIGNpcmN1bGFyLXJlZmVyZW5jZVxuICogZGV0ZWN0aW9uIGluIHNjb3BlIHdyaXRlcywgd2FybmluZ3Mgd2hlbiBhIHJlY29yZGVyIGhhcyBubyBvYnNlcnZlclxuICogbWV0aG9kcywgc3VzcGljaW91cy1wcmVkaWNhdGUgd2FybmluZ3MgaW4gZGVjaWRlL3NlbGVjdCwgc3RydWN0dXJhbFxuICogY2hlY2tzIGluIGBnZXRTdWJ0cmVlU25hcHNob3RgLCBhbmQgYW55IGZ1dHVyZSBkZXYtb25seSBkaWFnbm9zdGljLlxuICpcbiAqIFByb2R1Y3Rpb24gbGVhdmVzIGl0IE9GRiBieSBkZWZhdWx0ICh6ZXJvIG92ZXJoZWFkKS4gU2VlIHRoZSBKU0RvYyBvblxuICogYGVuYWJsZURldk1vZGVgIGZvciB0aGUgZnVsbCBsaXN0IGFuZCB1c2FnZSBleGFtcGxlLlxuICovXG5leHBvcnQgeyBkaXNhYmxlRGV2TW9kZSwgZW5hYmxlRGV2TW9kZSwgaXNEZXZNb2RlIH0gZnJvbSAnLi9saWIvZGV2TW9kZS5qcyc7XG5cbi8vIGBkZWZpbmVTY29wZUZyb21ab2RgIGFuZCB0aGUgb3RoZXIgem9kLWJhc2VkIHNjb3BlIGhlbHBlcnMgbW92ZWQgdG8gdGhlIG9wdC1pblxuLy8gYGZvb3RwcmludGpzL3pvZGAgZW50cnkg4oCUIGtlZXBpbmcgem9kIG91dCBvZiB0aGUgY29yZSBsb2FkIHBhdGggKGl0IGlzIGFuXG4vLyBvcHRpb25hbCBwZWVyKS4gSW1wb3J0IHRoZW0gZnJvbSAnZm9vdHByaW50anMvem9kJy5cbi8vIEEgcnVuJ3MgcmVjb3JkIGFzIEpTT04gd2l0aG91dCB0aGUgZW5naW5lJ3MgcmVjdXJzaW9uIGxpbWl0ICg5LjI2LjApOiB0aGVcbi8vIHNhbWUgYnl0ZXMgSlNPTi5zdHJpbmdpZnkgZW1pdHMsIGZvciBhIGRlZXAgYG5leHRgIGNoYWluIGl0IGNhbm5vdCBlbmNvZGUuXG5leHBvcnQgdHlwZSB7IFJldHJ5TG9vcENhbGwsIFJldHJ5TG9vcERlY2lzaW9uLCBSZXRyeUxvb3BJZGVudGl0eSB9IGZyb20gJy4vbGliL2F0dGVtcHQvcmV0cnlMb29wVHlwZXMuanMnO1xuZXhwb3J0IHR5cGUgeyBSZXRyeUxvb3BDb250ZXh0LCBSZXRyeUxvb3BPcHRpb25zLCBSZXRyeUxvb3BTdGF0ZSB9IGZyb20gJy4vbGliL2J1aWxkZXIvcmV0cnlMb29wLmpzJztcbmV4cG9ydCB7IHN0cmluZ2lmeVNuYXBzaG90IH0gZnJvbSAnLi9saWIvcnVubmVyL3N0cmluZ2lmeVNuYXBzaG90LmpzJztcbiJdfQ==
@@ -25,7 +25,7 @@
25
25
  * reads throw (a hostile Proxy) is `'unknown'`, never a second throw from an error path.
26
26
  */
27
27
  Object.defineProperty(exports, "__esModule", { value: true });
28
- exports.errorCategory = void 0;
28
+ exports.terminalCategory = exports.errorCategory = void 0;
29
29
  const errors_js_1 = require("../schema/errors.js");
30
30
  const errors_js_2 = require("./errors.js");
31
31
  /** Socket-level codes a transport failure carries (Node's `errno` names). */
@@ -60,6 +60,31 @@ function errorCategory(error, outcome = 'failed') {
60
60
  }
61
61
  }
62
62
  exports.errorCategory = errorCategory;
63
+ /**
64
+ * @internal Terminal ownership preserves a producer's known category. An
65
+ * unresolved effect is unknown, never the category of its physical cause.
66
+ * This does not rewrite historical attempt categories or re-read a known one.
67
+ */
68
+ function terminalCategory(error, known) {
69
+ try {
70
+ if (error instanceof errors_js_2.UnknownEffectError)
71
+ return 'unknown';
72
+ // CJS and ESM have distinct constructors. A declared own DATA name may
73
+ // only reduce certainty to unknown; never execute an error's name getter
74
+ // or promote its physical cause to a known outcome across module copies.
75
+ if (error !== null && (typeof error === 'object' || typeof error === 'function')) {
76
+ const name = Object.getOwnPropertyDescriptor(error, 'name');
77
+ if (name && Object.prototype.hasOwnProperty.call(name, 'value') && name.value === 'UnknownEffectError') {
78
+ return 'unknown';
79
+ }
80
+ }
81
+ }
82
+ catch {
83
+ return known ?? 'unknown';
84
+ }
85
+ return known ?? errorCategory(error);
86
+ }
87
+ exports.terminalCategory = terminalCategory;
63
88
  function categoryOf(error) {
64
89
  if (error instanceof errors_js_2.AttemptTimeoutError)
65
90
  return 'timeout';
@@ -108,4 +133,4 @@ function numberField(fields, key) {
108
133
  function isWait(value) {
109
134
  return typeof value === 'number' && Number.isFinite(value) && value >= 0;
110
135
  }
111
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2F0ZWdvcnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL2F0dGVtcHQvY2F0ZWdvcnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F3Qkc7OztBQUVILG1EQUEyRDtBQUMzRCwyQ0FBa0Q7QUFHbEQsNkVBQTZFO0FBQzdFLE1BQU0sYUFBYSxHQUF3QixJQUFJLEdBQUcsQ0FBQztJQUNqRCxZQUFZO0lBQ1osY0FBYztJQUNkLFdBQVc7SUFDWCxXQUFXO0lBQ1gsV0FBVztJQUNYLE9BQU87Q0FDUixDQUFDLENBQUM7QUFFSCw0R0FBNEc7QUFDNUcsTUFBTSxhQUFhLEdBQUcsaUdBQWlHLENBQUM7QUFFeEgseUZBQXlGO0FBQ3pGLE1BQU0sZ0JBQWdCLEdBQXdCLElBQUksR0FBRyxDQUFDLENBQUMsaUJBQWlCLEVBQUUsVUFBVSxFQUFFLHNCQUFzQixDQUFDLENBQUMsQ0FBQztBQUUvRyxzSEFBc0g7QUFDdEgsTUFBTSxxQkFBcUIsR0FBd0IsSUFBSSxHQUFHLENBQUMsQ0FBQyxZQUFZLEVBQUUsY0FBYyxDQUFDLENBQUMsQ0FBQztBQUUzRjs7O0dBR0c7QUFDSCxTQUFnQixhQUFhLENBQUMsS0FBYyxFQUFFLFVBQTBCLFFBQVE7SUFDOUUsSUFBSSxPQUFPLEtBQUssU0FBUztRQUFFLE9BQU8sU0FBUyxDQUFDO0lBQzVDLElBQUksT0FBTyxLQUFLLFNBQVM7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUM1QyxJQUFJLENBQUM7UUFDSCxPQUFPLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMzQixDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1AsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztBQUNILENBQUM7QUFSRCxzQ0FRQztBQUVELFNBQVMsVUFBVSxDQUFDLEtBQWM7SUFDaEMsSUFBSSxLQUFLLFlBQVksK0JBQW1CO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFDM0Qs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RixDQUFDO0FBRUQsU0FBUyxNQUFNLENBQUMsS0FBYztJQUM1QixPQUFPLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUFDLENBQUM7QUFDM0UsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogYXR0ZW1wdC9jYXRlZ29yeS50cyDigJQgYGVycm9yQ2F0ZWdvcnlgLCB0aGUgT05FIGZhaWx1cmUgY2xhc3NpZmllciAoZGVzaWduIMKnMy45KS5cbiAqXG4gKiBTZXZlbiBmaXhlZCB2YWx1ZXMsIHNvIGV2ZXJ5IHJlY29yZGVyIOKAlCB0aGUgbmFycmF0aXZlLCB0aGUgbWV0cmljIGxheWVyLCBhbiBhZ2VudCdzIG93biDigJQgYnJlYWtzIGZhaWx1cmVzIGRvd25cbiAqIHRoZSBzYW1lIHdheTsgYSByZWNvcmRlciBuZXZlciBpbnZlbnRzIGEgY2F0ZWdvcnkgb2YgaXRzIG93bi4gQm9ycm93ZWQgZnJvbSBhZ2VudGZvb3RwcmludCdzXG4gKiBgY2xhc3NpZnlSZXRyeVJlYXNvbmAgYW5kIHdpZGVuZWQsIHNvIGl0cyBkZWNvcmF0b3JzIGFkb3B0IHRoaXMgb25lIHJhdGhlciB0aGFuIGtlZXAgdGhlaXJzLlxuICpcbiAqIENhdGVnb3J5IGlzIEVWSURFTkNFLCBuZXZlciBwb2xpY3k6IHRoZSBkZWZhdWx0IGByZXRyeU9uYCByZXRyaWVzIGV2ZXJ5IGNhdGVnb3J5LiBBIGNoYXJ0IHRoYXQgd2FudHMgXCJuZXZlclxuICogcmV0cnkgYSBwZXJtYW5lbnQgZmFpbHVyZVwiIHNheXMgc286IGByZXRyeU9uOiAoZSkgPT4gZXJyb3JDYXRlZ29yeShlKSAhPT0gJ3Blcm1hbmVudCdgLlxuICpcbiAqIFByZWNlZGVuY2Ug4oCUIHdoYXQgdGhlIGZhaWx1cmUgTE9PS0VEIGxpa2Ugd2lucyBvdmVyIHdoYXQgaXQgZGVjbGFyZXM6XG4gKiAgIDEuIHRoZSBhdHRlbXB0J3Mgb3duIHRpbWVyIChvdXRjb21lIGAndGltZW91dCdgLCBvciBvdXIgYEF0dGVtcHRUaW1lb3V0RXJyb3JgKSAg4oaSIHRpbWVvdXRcbiAqICAgMi4gdGhlIHJ1bidzIHNpZ25hbCBlbmRlZCBpdCAob3V0Y29tZSBgJ2Fib3J0ZWQnYCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDihpIgdW5rbm93blxuICogICAzLiBzdGF0dXMgNDI5LCBvciBhIGRlY2xhcmVkIGByZXRyeUFmdGVyTXNgIC8gYHJldHJ5QWZ0ZXJTZWNvbmRzYCAgICAgICAgICAgICAgIOKGkiByYXRlLWxpbWl0ZWRcbiAqICAgNC4gc3RhdHVzIDV4eCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDihpIgc2VydmVyXG4gKiAgIDUuIHN0YXR1cyA0MDEgLyA0MDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg4oaSIGF1dGhcbiAqICAgNi4gYW55IG90aGVyIDR4eCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDihpIgcGVybWFuZW50XG4gKiAgIDcuIGByZXRyeWFibGU6IGZhbHNlYCwgb3IgYSB2YWxpZGF0aW9uIGVycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg4oaSIHBlcm1hbmVudFxuICogICA4LiBhIHRyYW5zcG9ydCBmYWlsdXJlIChhIHNvY2tldCBjb2RlIG9uIHRoZSBlcnJvciBvciBpdHMgY2F1c2UsIGEgZmV0Y2hcbiAqICAgICAgYFR5cGVFcnJvcmAsIGFuIGBBYm9ydEVycm9yYCAvIGBUaW1lb3V0RXJyb3JgIHRoYXQgd2FzIG5vdCB0aGUgcnVuJ3MpICAgICAgICDihpIgbmV0d29ya1xuICogICA5LiBhbnl0aGluZyBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIOKGkiB1bmtub3duXG4gKlxuICogQSBzdGF0dXMgaXMgYSBOVU1CRVIgKGBzdGF0dXNgIG9yIGBzdGF0dXNDb2RlYCk7IGEgbnVtZXJpYyBzdHJpbmcgaXMgbm90IHJlYWQgYXMgb25lLiBUb3RhbDogYSB2YWx1ZSB3aG9zZVxuICogcmVhZHMgdGhyb3cgKGEgaG9zdGlsZSBQcm94eSkgaXMgYCd1bmtub3duJ2AsIG5ldmVyIGEgc2Vjb25kIHRocm93IGZyb20gYW4gZXJyb3IgcGF0aC5cbiAqL1xuXG5pbXBvcnQgeyBJbnB1dFZhbGlkYXRpb25FcnJvciB9IGZyb20gJy4uL3NjaGVtYS9lcnJvcnMuanMnO1xuaW1wb3J0IHsgQXR0ZW1wdFRpbWVvdXRFcnJvciB9IGZyb20gJy4vZXJyb3JzLmpzJztcbmltcG9ydCB0eXBlIHsgQXR0ZW1wdENhdGVnb3J5LCBBdHRlbXB0T3V0Y29tZSB9IGZyb20gJy4vdHlwZXMuanMnO1xuXG4vKiogU29ja2V0LWxldmVsIGNvZGVzIGEgdHJhbnNwb3J0IGZhaWx1cmUgY2FycmllcyAoTm9kZSdzIGBlcnJub2AgbmFtZXMpLiAqL1xuY29uc3QgTkVUV09SS19DT0RFUzogUmVhZG9ubHlTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoW1xuICAnRUNPTk5SRVNFVCcsXG4gICdFQ09OTlJFRlVTRUQnLFxuICAnRU5PVEZPVU5EJyxcbiAgJ0VUSU1FRE9VVCcsXG4gICdFQUlfQUdBSU4nLFxuICAnRVBJUEUnLFxuXSk7XG5cbi8qKiBUaGUgbWVzc2FnZXMgcnVudGltZXMgZ2l2ZSBhIGBmZXRjaGAgdGhhdCBuZXZlciByZWFjaGVkIHRoZSBzZXJ2ZXIgKE5vZGUsIENocm9taXVtLCBGaXJlZm94LCBTYWZhcmkpLiAqL1xuY29uc3QgRkVUQ0hfRkFJTFVSRSA9IC9eKGZldGNoIGZhaWxlZHxmYWlsZWQgdG8gZmV0Y2h8bmV0d29ya2Vycm9yIHdoZW4gYXR0ZW1wdGluZyB0byBmZXRjaCByZXNvdXJjZVxcLj98bG9hZCBmYWlsZWQpJC9pO1xuXG4vKiogRXJyb3IgbmFtZXMgdGhhdCBzYXkgYSB2YWxpZGF0aW9uIGZhaWxlZCDigJQgcmV0cnlpbmcgdGhlIHNhbWUgaW5wdXQgY2Fubm90IHN1Y2NlZWQuICovXG5jb25zdCBWQUxJREFUSU9OX05BTUVTOiBSZWFkb25seVNldDxzdHJpbmc+ID0gbmV3IFNldChbJ1ZhbGlkYXRpb25FcnJvcicsICdab2RFcnJvcicsICdJbnB1dFZhbGlkYXRpb25FcnJvciddKTtcblxuLyoqIEVycm9yIG5hbWVzIG9mIGFuIGFib3J0IG9yIGEgdGltZW91dCB0aGF0IHNvbWUgT1RIRVIgc2lnbmFsIHJhaXNlZCAodGhlIHJ1bidzIG93biBlbmRzIGFzIG91dGNvbWUgYCdhYm9ydGVkJ2ApLiAqL1xuY29uc3QgVFJBTlNQT1JUX0FCT1JUX05BTUVTOiBSZWFkb25seVNldDxzdHJpbmc+ID0gbmV3IFNldChbJ0Fib3J0RXJyb3InLCAnVGltZW91dEVycm9yJ10pO1xuXG4vKipcbiAqIFRoZSBjYXRlZ29yeSBvZiBhbiBhdHRlbXB0J3MgZmFpbHVyZS4gYG91dGNvbWVgIGlzIGhvdyB0aGUgYXR0ZW1wdCBlbmRlZCAoZGVmYXVsdCBgJ2ZhaWxlZCdgKTogaXQgZGVjaWRlc1xuICogYCd0aW1lb3V0J2AgKHRoZSBhdHRlbXB0J3Mgb3duIHRpbWVyKSBhbmQgYCd1bmtub3duJ2AgKHRoZSBydW4ncyBzaWduYWwpIGJlZm9yZSB0aGUgZXJyb3IgaXMgcmVhZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVycm9yQ2F0ZWdvcnkoZXJyb3I6IHVua25vd24sIG91dGNvbWU6IEF0dGVtcHRPdXRjb21lID0gJ2ZhaWxlZCcpOiBBdHRlbXB0Q2F0ZWdvcnkge1xuICBpZiAob3V0Y29tZSA9PT0gJ3RpbWVvdXQnKSByZXR1cm4gJ3RpbWVvdXQnO1xuICBpZiAob3V0Y29tZSA9PT0gJ2Fib3J0ZWQnKSByZXR1cm4gJ3Vua25vd24nO1xuICB0cnkge1xuICAgIHJldHVybiBjYXRlZ29yeU9mKGVycm9yKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuICd1bmtub3duJztcbiAgfVxufVxuXG5mdW5jdGlvbiBjYXRlZ29yeU9mKGVycm9yOiB1bmtub3duKTogQXR0ZW1wdENhdGVnb3J5IHtcbiAgaWYgKGVycm9yIGluc3RhbmNlb2YgQXR0ZW1wdFRpbWVvdXRFcnJvcikgcmV0dXJuICd0aW1lb3V0JztcbiAgaWYgKGVycm9yID09PSBudWxsIHx8ICh0eXBlb2YgZXJyb3IgIT09ICdvYmplY3QnICYmIHR5cGVvZiBlcnJvciAhPT0gJ2Z1bmN0aW9uJykpIHJldHVybiAndW5rbm93bic7XG4gIGNvbnN0IGZpZWxkcyA9IGVycm9yIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXG4gIGNvbnN0IHN0YXR1cyA9IG51bWJlckZpZWxkKGZpZWxkcywgJ3N0YXR1cycpID8/IG51bWJlckZpZWxkKGZpZWxkcywgJ3N0YXR1c0NvZGUnKTtcbiAgY29uc3QgZGVjbGFyZXNSZXRyeUFmdGVyID0gaXNXYWl0KGZpZWxkcy5yZXRyeUFmdGVyTXMpIHx8IGlzV2FpdChmaWVsZHMucmV0cnlBZnRlclNlY29uZHMpO1xuICBpZiAoc3RhdHVzID09PSA0MjkgfHwgZGVjbGFyZXNSZXRyeUFmdGVyKSByZXR1cm4gJ3JhdGUtbGltaXRlZCc7XG4gIGlmIChzdGF0dXMgIT09IHVuZGVmaW5lZCAmJiBzdGF0dXMgPj0gNTAwICYmIHN0YXR1cyA8PSA1OTkpIHJldHVybiAnc2VydmVyJztcbiAgaWYgKHN0YXR1cyA9PT0gNDAxIHx8IHN0YXR1cyA9PT0gNDAzKSByZXR1cm4gJ2F1dGgnO1xuICBpZiAoc3RhdHVzICE9PSB1bmRlZmluZWQgJiYgc3RhdHVzID49IDQwMCAmJiBzdGF0dXMgPD0gNDk5KSByZXR1cm4gJ3Blcm1hbmVudCc7XG5cbiAgaWYgKGZpZWxkcy5yZXRyeWFibGUgPT09IGZhbHNlKSByZXR1cm4gJ3Blcm1hbmVudCc7XG4gIGlmIChlcnJvciBpbnN0YW5jZW9mIElucHV0VmFsaWRhdGlvbkVycm9yKSByZXR1cm4gJ3Blcm1hbmVudCc7XG4gIGNvbnN0IG5hbWUgPSB0eXBlb2YgZmllbGRzLm5hbWUgPT09ICdzdHJpbmcnID8gZmllbGRzLm5hbWUgOiB1bmRlZmluZWQ7XG4gIGlmIChuYW1lICE9PSB1bmRlZmluZWQgJiYgVkFMSURBVElPTl9OQU1FUy5oYXMobmFtZSkpIHJldHVybiAncGVybWFuZW50JztcblxuICBpZiAoc3RhdHVzID09PSB1bmRlZmluZWQgJiYgaXNUcmFuc3BvcnRGYWlsdXJlKGZpZWxkcywgbmFtZSkpIHJldHVybiAnbmV0d29yayc7XG4gIHJldHVybiAndW5rbm93bic7XG59XG5cbmZ1bmN0aW9uIGlzVHJhbnNwb3J0RmFpbHVyZShmaWVsZHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LCBuYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgaWYgKGhhc05ldHdvcmtDb2RlKGZpZWxkcy5jb2RlKSkgcmV0dXJuIHRydWU7XG4gIGNvbnN0IGNhdXNlID0gZmllbGRzLmNhdXNlO1xuICBpZiAoY2F1c2UgIT09IG51bGwgJiYgdHlwZW9mIGNhdXNlID09PSAnb2JqZWN0JyAmJiBoYXNOZXR3b3JrQ29kZSgoY2F1c2UgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pLmNvZGUpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgaWYgKG5hbWUgIT09IHVuZGVmaW5lZCAmJiBUUkFOU1BPUlRfQUJPUlRfTkFNRVMuaGFzKG5hbWUpKSByZXR1cm4gdHJ1ZTtcbiAgcmV0dXJuIGZpZWxkcyBpbnN0YW5jZW9mIFR5cGVFcnJvciAmJiB0eXBlb2YgZmllbGRzLm1lc3NhZ2UgPT09ICdzdHJpbmcnICYmIEZFVENIX0ZBSUxVUkUudGVzdChmaWVsZHMubWVzc2FnZSk7XG59XG5cbmZ1bmN0aW9uIGhhc05ldHdvcmtDb2RlKGNvZGU6IHVua25vd24pOiBib29sZWFuIHtcbiAgcmV0dXJuIHR5cGVvZiBjb2RlID09PSAnc3RyaW5nJyAmJiBORVRXT1JLX0NPREVTLmhhcyhjb2RlKTtcbn1cblxuZnVuY3Rpb24gbnVtYmVyRmllbGQoZmllbGRzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwga2V5OiAnc3RhdHVzJyB8ICdzdGF0dXNDb2RlJyk6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHZhbHVlID0gZmllbGRzW2tleV07XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInICYmIE51bWJlci5pc0Zpbml0ZSh2YWx1ZSkgPyB2YWx1ZSA6IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gaXNXYWl0KHZhbHVlOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInICYmIE51bWJlci5pc0Zpbml0ZSh2YWx1ZSkgJiYgdmFsdWUgPj0gMDtcbn1cbiJdfQ==
136
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2F0ZWdvcnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL2F0dGVtcHQvY2F0ZWdvcnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F3Qkc7OztBQUVILG1EQUEyRDtBQUMzRCwyQ0FBc0U7QUFHdEUsNkVBQTZFO0FBQzdFLE1BQU0sYUFBYSxHQUF3QixJQUFJLEdBQUcsQ0FBQztJQUNqRCxZQUFZO0lBQ1osY0FBYztJQUNkLFdBQVc7SUFDWCxXQUFXO0lBQ1gsV0FBVztJQUNYLE9BQU87Q0FDUixDQUFDLENBQUM7QUFFSCw0R0FBNEc7QUFDNUcsTUFBTSxhQUFhLEdBQUcsaUdBQWlHLENBQUM7QUFFeEgseUZBQXlGO0FBQ3pGLE1BQU0sZ0JBQWdCLEdBQXdCLElBQUksR0FBRyxDQUFDLENBQUMsaUJBQWlCLEVBQUUsVUFBVSxFQUFFLHNCQUFzQixDQUFDLENBQUMsQ0FBQztBQUUvRyxzSEFBc0g7QUFDdEgsTUFBTSxxQkFBcUIsR0FBd0IsSUFBSSxHQUFHLENBQUMsQ0FBQyxZQUFZLEVBQUUsY0FBYyxDQUFDLENBQUMsQ0FBQztBQUUzRjs7O0dBR0c7QUFDSCxTQUFnQixhQUFhLENBQUMsS0FBYyxFQUFFLFVBQTBCLFFBQVE7SUFDOUUsSUFBSSxPQUFPLEtBQUssU0FBUztRQUFFLE9BQU8sU0FBUyxDQUFDO0lBQzVDLElBQUksT0FBTyxLQUFLLFNBQVM7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUM1QyxJQUFJLENBQUM7UUFDSCxPQUFPLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMzQixDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1AsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztBQUNILENBQUM7QUFSRCxzQ0FRQztBQUVEOzs7O0dBSUc7QUFDSCxTQUFnQixnQkFBZ0IsQ0FBQyxLQUFjLEVBQUUsS0FBdUI7SUFDdEUsSUFBSSxDQUFDO1FBQ0gsSUFBSSxL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QUssSUFBSSxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxjQUFjLENBQUUsS0FBaUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQzNHLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUNELElBQUksSUFBSSxLQUFLLFNBQVMsSUFBSSxxQkFBcUIsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDdkUsT0FBTyxNQUFNLFlBQVksU0FBUyxJQUFJLE9BQU8sTUFBTSxDQUFDLE9BQU8sS0FBSyxRQUFRLElBQUksYUFBYSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDakgsQ0FBQztBQUVELFNBQVMsY0FBYyxDQUFDLElBQWE7SUFDbkMsT0FBTyxPQUFPLElBQUksS0FBSyxRQUFRLElBQUksYUFBYSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUM3RCxDQUFDO0FBRUQsU0FBUyxXQUFXLENBQUMsTUFBK0IsRUFBRSxHQUE0QjtJQUNoRixNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDMUIsT0FBTyxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7QUFDakYsQ0FBQztBQUVELFNBQVMsTUFBTSxDQUFDLEtBQWM7SUFDNUIsT0FBTyxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLElBQUksQ0FBQyxDQUFDO0FBQzNFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIGF0dGVtcHQvY2F0ZWdvcnkudHMg4oCUIGBlcnJvckNhdGVnb3J5YCwgdGhlIE9ORSBmYWlsdXJlIGNsYXNzaWZpZXIgKGRlc2lnbiDCpzMuOSkuXG4gKlxuICogU2V2ZW4gZml4ZWQgdmFsdWVzLCBzbyBldmVyeSByZWNvcmRlciDigJQgdGhlIG5hcnJhdGl2ZSwgdGhlIG1ldHJpYyBsYXllciwgYW4gYWdlbnQncyBvd24g4oCUIGJyZWFrcyBmYWlsdXJlcyBkb3duXG4gKiB0aGUgc2FtZSB3YXk7IGEgcmVjb3JkZXIgbmV2ZXIgaW52ZW50cyBhIGNhdGVnb3J5IG9mIGl0cyBvd24uIEJvcnJvd2VkIGZyb20gYWdlbnRmb290cHJpbnQnc1xuICogYGNsYXNzaWZ5UmV0cnlSZWFzb25gIGFuZCB3aWRlbmVkLCBzbyBpdHMgZGVjb3JhdG9ycyBhZG9wdCB0aGlzIG9uZSByYXRoZXIgdGhhbiBrZWVwIHRoZWlycy5cbiAqXG4gKiBDYXRlZ29yeSBpcyBFVklERU5DRSwgbmV2ZXIgcG9saWN5OiB0aGUgZGVmYXVsdCBgcmV0cnlPbmAgcmV0cmllcyBldmVyeSBjYXRlZ29yeS4gQSBjaGFydCB0aGF0IHdhbnRzIFwibmV2ZXJcbiAqIHJldHJ5IGEgcGVybWFuZW50IGZhaWx1cmVcIiBzYXlzIHNvOiBgcmV0cnlPbjogKGUpID0+IGVycm9yQ2F0ZWdvcnkoZSkgIT09ICdwZXJtYW5lbnQnYC5cbiAqXG4gKiBQcmVjZWRlbmNlIOKAlCB3aGF0IHRoZSBmYWlsdXJlIExPT0tFRCBsaWtlIHdpbnMgb3ZlciB3aGF0IGl0IGRlY2xhcmVzOlxuICogICAxLiB0aGUgYXR0ZW1wdCdzIG93biB0aW1lciAob3V0Y29tZSBgJ3RpbWVvdXQnYCwgb3Igb3VyIGBBdHRlbXB0VGltZW91dEVycm9yYCkgIOKGkiB0aW1lb3V0XG4gKiAgIDIuIHRoZSBydW4ncyBzaWduYWwgZW5kZWQgaXQgKG91dGNvbWUgYCdhYm9ydGVkJ2ApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg4oaSIHVua25vd25cbiAqICAgMy4gc3RhdHVzIDQyOSwgb3IgYSBkZWNsYXJlZCBgcmV0cnlBZnRlck1zYCAvIGByZXRyeUFmdGVyU2Vjb25kc2AgICAgICAgICAgICAgICDihpIgcmF0ZS1saW1pdGVkXG4gKiAgIDQuIHN0YXR1cyA1eHggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg4oaSIHNlcnZlclxuICogICA1LiBzdGF0dXMgNDAxIC8gNDAzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIOKGkiBhdXRoXG4gKiAgIDYuIGFueSBvdGhlciA0eHggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg4oaSIHBlcm1hbmVudFxuICogICA3LiBgcmV0cnlhYmxlOiBmYWxzZWAsIG9yIGEgdmFsaWRhdGlvbiBlcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIOKGkiBwZXJtYW5lbnRcbiAqICAgOC4gYSB0cmFuc3BvcnQgZmFpbHVyZSAoYSBzb2NrZXQgY29kZSBvbiB0aGUgZXJyb3Igb3IgaXRzIGNhdXNlLCBhIGZldGNoXG4gKiAgICAgIGBUeXBlRXJyb3JgLCBhbiBgQWJvcnRFcnJvcmAgLyBgVGltZW91dEVycm9yYCB0aGF0IHdhcyBub3QgdGhlIHJ1bidzKSAgICAgICAg4oaSIG5ldHdvcmtcbiAqICAgOS4gYW55dGhpbmcgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDihpIgdW5rbm93blxuICpcbiAqIEEgc3RhdHVzIGlzIGEgTlVNQkVSIChgc3RhdHVzYCBvciBgc3RhdHVzQ29kZWApOyBhIG51bWVyaWMgc3RyaW5nIGlzIG5vdCByZWFkIGFzIG9uZS4gVG90YWw6IGEgdmFsdWUgd2hvc2VcbiAqIHJlYWRzIHRocm93IChhIGhvc3RpbGUgUHJveHkpIGlzIGAndW5rbm93bidgLCBuZXZlciBhIHNlY29uZCB0aHJvdyBmcm9tIGFuIGVycm9yIHBhdGguXG4gKi9cblxuaW1wb3J0IHsgSW5wdXRWYWxpZGF0aW9uRXJyb3IgfSBmcm9tICcuLi9zY2hlbWEvZXJyb3JzLmpzJztcbmltcG9ydCB7IEF0dGVtcHRUaW1lb3V0RXJyb3IsIFVua25vd25FZmZlY3RFcnJvciB9IGZyb20gJy4vZXJyb3JzLmpzJztcbmltcG9ydCB0eXBlIHsgQXR0ZW1wdENhdGVnb3J5LCBBdHRlbXB0T3V0Y29tZSB9IGZyb20gJy4vdHlwZXMuanMnO1xuXG4vKiogU29ja2V0LWxldmVsIGNvZGVzIGEgdHJhbnNwb3J0IGZhaWx1cmUgY2FycmllcyAoTm9kZSdzIGBlcnJub2AgbmFtZXMpLiAqL1xuY29uc3QgTkVUV09SS19DT0RFUzogUmVhZG9ubHlTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoW1xuICAnRUNPTk5SRVNFVCcsXG4gICdFQ09OTlJFRlVTRUQnLFxuICAnRU5PVEZPVU5EJyxcbiAgJ0VUSU1FRE9VVCcsXG4gICdFQUlfQUdBSU4nLFxuICAnRVBJUEUnLFxuXSk7XG5cbi8qKiBUaGUgbWVzc2FnZXMgcnVudGltZXMgZ2l2ZSBhIGBmZXRjaGAgdGhhdCBuZXZlciByZWFjaGVkIHRoZSBzZXJ2ZXIgKE5vZGUsIENocm9taXVtLCBGaXJlZm94LCBTYWZhcmkpLiAqL1xuY29uc3QgRkVUQ0hfRkFJTFVSRSA9IC9eKGZldGNoIGZhaWxlZHxmYWlsZWQgdG8gZmV0Y2h8bmV0d29ya2Vycm9yIHdoZW4gYXR0ZW1wdGluZyB0byBmZXRjaCByZXNvdXJjZVxcLj98bG9hZCBmYWlsZWQpJC9pO1xuXG4vKiogRXJyb3IgbmFtZXMgdGhhdCBzYXkgYSB2YWxpZGF0aW9uIGZhaWxlZCDigJQgcmV0cnlpbmcgdGhlIHNhbWUgaW5wdXQgY2Fubm90IHN1Y2NlZWQuICovXG5jb25zdCBWQUxJREFUSU9OX05BTUVTOiBSZWFkb25seVNldDxzdHJpbmc+ID0gbmV3IFNldChbJ1ZhbGlkYXRpb25FcnJvcicsICdab2RFcnJvcicsICdJbnB1dFZhbGlkYXRpb25FcnJvciddKTtcblxuLyoqIEVycm9yIG5hbWVzIG9mIGFuIGFib3J0IG9yIGEgdGltZW91dCB0aGF0IHNvbWUgT1RIRVIgc2lnbmFsIHJhaXNlZCAodGhlIHJ1bidzIG93biBlbmRzIGFzIG91dGNvbWUgYCdhYm9ydGVkJ2ApLiAqL1xuY29uc3QgVFJBTlNQT1JUX0FCT1JUX05BTUVTOiBSZWFkb25seVNldDxzdHJpbmc+ID0gbmV3IFNldChbJ0Fib3J0RXJyb3InLCAnVGltZW91dEVycm9yJ10pO1xuXG4vKipcbiAqIFRoZSBjYXRlZ29yeSBvZiBhbiBhdHRlbXB0J3MgZmFpbHVyZS4gYG91dGNvbWVgIGlzIGhvdyB0aGUgYXR0ZW1wdCBlbmRlZCAoZGVmYXVsdCBgJ2ZhaWxlZCdgKTogaXQgZGVjaWRlc1xuICogYCd0aW1lb3V0J2AgKHRoZSBhdHRlbXB0J3Mgb3duIHRpbWVyKSBhbmQgYCd1bmtub3duJ2AgKHRoZSBydW4ncyBzaWduYWwpIGJlZm9yZSB0aGUgZXJyb3IgaXMgcmVhZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVycm9yQ2F0ZWdvcnkoZXJyb3I6IHVua25vd24sIG91dGNvbWU6IEF0dGVtcHRPdXRjb21lID0gJ2ZhaWxlZCcpOiBBdHRlbXB0Q2F0ZWdvcnkge1xuICBpZiAob3V0Y29tZSA9PT0gJ3RpbWVvdXQnKSByZXR1cm4gJ3RpbWVvdXQnO1xuICBpZiAob3V0Y29tZSA9PT0gJ2Fib3J0ZWQnKSByZXR1cm4gJ3Vua25vd24nO1xuICB0cnkge1xuICAgIHJldHVybiBjYXRlZ29yeU9mKGVycm9yKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuICd1bmtub3duJztcbiAgfVxufVxuXG4vKipcbiAqIEBpbnRlcm5hbCBUZXJtaW5hbCBvd25lcnNoaXAgcHJlc2VydmVzIGEgcHJvZHVjZXIncyBrbm93biBjYXRlZ29yeS4gQW5cbiAqIHVucmVzb2x2ZWQgZWZmZWN0IGlzIHVua25vd24sIG5ldmVyIHRoZSBjYXRlZ29yeSBvZiBpdHMgcGh5c2ljYWwgY2F1c2UuXG4gKiBUaGlzIGRvZXMgbm90IHJld3JpdGUgaGlzdG9yaWNhbCBhdHRlbXB0IGNhdGVnb3JpZXMgb3IgcmUtcmVhZCBhIGtub3duIG9uZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRlcm1pbmFsQ2F0ZWdvcnkoZXJyb3I6IHVua25vd24sIGtub3duPzogQXR0ZW1wdENhdGVnb3J5KTogQXR0ZW1wdENhdGVnb3J5IHtcbiAgdHJ5IHtcbiAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBVbmtub3duRWZmZWN0RXJyb3IpIHJldHVybiAndW5rbm93bic7XG4gICAgLy8gQ0pTIGFuZCBFU00gaGF2ZSBkaXN0aW5jdCBjb25zdHJ1Y3RvcnMuIEEgZGVjbGFyZWQgb3duIERBVEEgbmFtZSBtYXlcbiAgICAvLyBvbmx5IHJlZHVjZSBjZXJ0YWludHkgdG8gdW5rbm93bjsgbmV2ZXIgZXhlY3V0ZSBhbiBlcnJvcidzIG5hbWUgZ2V0dGVyXG4gICAgLy8gb3IgcHJvbW90ZSBpdHMgcGh5c2ljYWwgY2F1c2UgdG8gYSBrbm93biBvdXRjb21lIGFjcm9zcyBtb2R1bGUgY29waWVzLlxuICAgIGlmIChlcnJvciAhPT0gbnVsbCAmJiAodHlwZW9mIGVycm9yID09PSAnb2JqZWN0JyB8fCB0eXBlb2YgZXJyb3IgPT09ICdmdW5jdGlvbicpKSB7XG4gICAgICBjb25zdCBuYW1lID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihlcnJvciwgJ25hbWUnKTtcbiAgICAgIGlmIChuYW1lICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChuYW1lLCAndmFsdWUnKSAmJiBuYW1lLnZhbHVlID09PSAnVW5rbm93bkVmZmVjdEVycm9yJykge1xuICAgICAgICByZXR1cm4gJ3Vua25vd24nO1xuICAgICAgfVxuICAgIH1cbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGtub3duID8/ICd1bmtub3duJztcbiAgfVxuICByZXR1cm4ga25vd24gPz8gZXJyb3JDYXRlZ29yeShlcnJvcik7XG59XG5cbmZ1bmN0aW9uIGNhdGVnb3J5T2YoZXJyb3I6IHVua25vd24pOiBBdHRlbXB0Q2F0ZWdvcnkge1xuICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBBdHRlbXB0VGltZW91dEVycm9yKSByZXR1cm4gJ3RpbWVvdXQnO1xuICBpZiAoZXJyb3IgPT09IG51bGwgfHwgKHR5cGVvZiBlcnJvciAhPT0gJ29iamVjdCcgJiYgdHlwZW9mIGVycm9yICE9PSAnZnVuY3Rpb24nKSkgcmV0dXJuICd1bmtub3duJztcbiAgY29uc3QgZmllbGRzID0gZXJyb3IgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cbiAgY29uc3Qgc3RhdHVzID0gbnVtYmVyRmllbGQoZmllbGRzLCAnc3RhdHVzJykgPz8gbnVtYmVyRmllbGQoZmllbGRzLCAnc3RhdHVzQ29kZScpO1xuICBjb25zdCBkZWNsYXJlc1JldHJ5QWZ0ZXIgPSBpc1dhaXQoZmllbGRzLnJldHJ5QWZ0ZXJNcykgfHwgaXNXYWl0KGZpZWxkcy5yZXRyeUFmdGVyU2Vjb25kcyk7XG4gIGlmIChzdGF0dXMgPT09IDQyOSB8fCBkZWNsYXJlc1JldHJ5QWZ0ZXIpIHJldHVybiAncmF0ZS1saW1pdGVkJztcbiAgaWYgKHN0YXR1cyAhPT0gdW5kZWZpbmVkICYmIHN0YXR1cyA+PSA1MDAgJiYgc3RhdHVzIDw9IDU5OSkgcmV0dXJuICdzZXJ2ZXInO1xuICBpZiAoc3RhdHVzID09PSA0MDEgfHwgc3RhdHVzID09PSA0MDMpIHJldHVybiAnYXV0aCc7XG4gIGlmIChzdGF0dXMgIT09IHVuZGVmaW5lZCAmJiBzdGF0dXMgPj0gNDAwICYmIHN0YXR1cyA8PSA0OTkpIHJldHVybiAncGVybWFuZW50JztcblxuICBpZiAoZmllbGRzLnJldHJ5YWJsZSA9PT0gZmFsc2UpIHJldHVybiAncGVybWFuZW50JztcbiAgaWYgKGVycm9yIGluc3RhbmNlb2YgSW5wdXRWYWxpZGF0aW9uRXJyb3IpIHJldHVybiAncGVybWFuZW50JztcbiAgY29uc3QgbmFtZSA9IHR5cGVvZiBmaWVsZHMubmFtZSA9PT0gJ3N0cmluZycgPyBmaWVsZHMubmFtZSA6IHVuZGVmaW5lZDtcbiAgaWYgKG5hbWUgIT09IHVuZGVmaW5lZCAmJiBWQUxJREFUSU9OX05BTUVTLmhhcyhuYW1lKSkgcmV0dXJuICdwZXJtYW5lbnQnO1xuXG4gIGlmIChzdGF0dXMgPT09IHVuZGVmaW5lZCAmJiBpc1RyYW5zcG9ydEZhaWx1cmUoZmllbGRzLCBuYW1lKSkgcmV0dXJuICduZXR3b3JrJztcbiAgcmV0dXJuICd1bmtub3duJztcbn1cblxuZnVuY3Rpb24gaXNUcmFuc3BvcnRGYWlsdXJlKGZpZWxkczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIG5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICBpZiAoaGFzTmV0d29ya0NvZGUoZmllbGRzLmNvZGUpKSByZXR1cm4gdHJ1ZTtcbiAgY29uc3QgY2F1c2UgPSBmaWVsZHMuY2F1c2U7XG4gIGlmIChjYXVzZSAhPT0gbnVsbCAmJiB0eXBlb2YgY2F1c2UgPT09ICdvYmplY3QnICYmIGhhc05ldHdvcmtDb2RlKChjYXVzZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikuY29kZSkpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBpZiAobmFtZSAhPT0gdW5kZWZpbmVkICYmIFRSQU5TUE9SVF9BQk9SVF9OQU1FUy5oYXMobmFtZSkpIHJldHVybiB0cnVlO1xuICByZXR1cm4gZmllbGRzIGluc3RhbmNlb2YgVHlwZUVycm9yICYmIHR5cGVvZiBmaWVsZHMubWVzc2FnZSA9PT0gJ3N0cmluZycgJiYgRkVUQ0hfRkFJTFVSRS50ZXN0KGZpZWxkcy5tZXNzYWdlKTtcbn1cblxuZnVuY3Rpb24gaGFzTmV0d29ya0NvZGUoY29kZTogdW5rbm93bik6IGJvb2xlYW4ge1xuICByZXR1cm4gdHlwZW9mIGNvZGUgPT09ICdzdHJpbmcnICYmIE5FVFdPUktfQ09ERVMuaGFzKGNvZGUpO1xufVxuXG5mdW5jdGlvbiBudW1iZXJGaWVsZChmaWVsZHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LCBrZXk6ICdzdGF0dXMnIHwgJ3N0YXR1c0NvZGUnKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgdmFsdWUgPSBmaWVsZHNba2V5XTtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgJiYgTnVtYmVyLmlzRmluaXRlKHZhbHVlKSA/IHZhbHVlIDogdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBpc1dhaXQodmFsdWU6IHVua25vd24pOiBib29sZWFuIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgJiYgTnVtYmVyLmlzRmluaXRlKHZhbHVlKSAmJiB2YWx1ZSA+PSAwO1xufVxuIl19
@@ -133,6 +133,10 @@ async function runAttempts(run, policy, options) {
133
133
  const delayMs = decision.next === 'retry' ? inputs.delayMs() : inputs.delayIfAsked();
134
134
  const timeLeftMs = deadline === undefined ? undefined : inputs.timeLeft();
135
135
  const category = inputs.category();
136
+ // Private terminal semantics are fixed before serving or observer fan-out.
137
+ // An already-unresolved call wrapper must not become its physical cause
138
+ // if a consumer later changes the raw error's properties or prototype.
139
+ const terminal = options.onFailure && failure ? (0, category_js_1.terminalCategory)(failure.error, category) : category ?? 'unknown';
136
140
  const served = inputs.failed ? (options.serve ?? errorInfo_js_1.extractErrorInfo)(inputs.failed.error) : undefined;
137
141
  const effect = options.effect ? (0, effect_js_1.effectOf)(inputs.outcome, failure?.error) : undefined;
138
142
  const recordedKey = options.effect ? (0, effect_js_1.recordedKeyOf)(options.effect) : undefined;
@@ -167,10 +171,17 @@ async function runAttempts(run, policy, options) {
167
171
  if (record.next === 'done')
168
172
  return value;
169
173
  if (record.next === 'stop')
170
- throw stopError(options.effect, record, failure, unknownSoFar);
174
+ throw stoppedFailure(options, record, failure, unknownSoFar, terminal);
171
175
  options.onRetry?.(attempt, of, delayMs ?? 0, served);
172
- if (delayMs !== undefined && delayMs > 0)
173
- await sleep(delayMs, options.signal);
176
+ if (delayMs !== undefined && delayMs > 0) {
177
+ try {
178
+ await sleep(delayMs, options.signal);
179
+ }
180
+ catch (error) {
181
+ options.onFailure?.(error, 'unknown');
182
+ throw error;
183
+ }
184
+ }
174
185
  // No attempt follows a cut wait, so none is recorded: the summary says how the series ended. No attempt
175
186
  // STARTS at or past the deadline either — rule 6 decided with the clock, and the clock may have moved on.
176
187
  const cut = (0, deadline_js_1.isCancelled)(options.signal)
@@ -180,11 +191,20 @@ async function runAttempts(run, policy, options) {
180
191
  : undefined;
181
192
  if (cut !== undefined) {
182
193
  options.onEnd?.(tally.summary({ ...lastOf(record, unknownSoFar), next: 'stop', reason: cut }));
183
- throw stopError(options.effect, record, failure, unknownSoFar);
194
+ throw stoppedFailure(options, record, failure, unknownSoFar, terminal);
184
195
  }
185
196
  }
186
197
  }
187
198
  exports.runAttempts = runAttempts;
199
+ /** The final physical attempt owns its category; a wrapper or cut wait has no such category. */
200
+ function stoppedFailure(options, record, failure, unknownSoFar, terminal) {
201
+ const error = stopError(options.effect, record, failure, unknownSoFar);
202
+ if (record.outcome !== 'paused') {
203
+ const category = record.next === 'stop' && Object.is(error, failure?.error) ? terminal : 'unknown';
204
+ options.onFailure?.(error, category);
205
+ }
206
+ return error;
207
+ }
188
208
  /**
189
209
  * What a stopped series throws: the last attempt's own error — or, on a touching target where ANY attempt left the
190
210
  * effect unknown, `UnknownEffectError` with the last attempt's error as its cause. An earlier timeout may have
@@ -507,4 +527,4 @@ class SeriesTally {
507
527
  return (0, record_js_1.freezeDeep)({ ...this.counts, last });
508
528
  }
509
529
  }
510
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVubmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9hdHRlbXB0L3J1bm5lci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBOERHOzs7QUFHSCx5REFBMEQ7QUFDMUQsd0RBQTBEO0FBQzFELGdEQUFrRDtBQUNsRCxpREFBMkM7QUFDM0MsK0NBQThDO0FBQzlDLCtDQUEyRztBQUMzRywrQ0FBMEQ7QUFFMUQsMkNBQThGO0FBQzlGLDJDQUFrRDtBQUNsRCwyQ0FBNkU7QUFDN0UsMkNBQXdEO0FBMkV4RCxzSEFBc0g7QUFDdEgsTUFBTSxZQUFZLEdBQUcsSUFBSSxPQUFPLEVBQTBCLENBQUM7QUFFM0Q7Ozs7R0FJRztBQUNILFNBQWdCLGFBQWEsQ0FBQyxPQUFtQztJQUMvRCxPQUFPLE9BQU8sS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUN2RSxDQUFDO0FBRkQsc0NBRUM7QUFPRDs7O0dBR0c7QUFDSSxLQUFLLFVBQVUsV0FBVyxDQUMvQixHQUFpRSxFQUNqRSxNQUFtQixFQUNuQixPQUEwQjtJQUUxQixNQUFNLEVBQUUsR0FBRyxJQUFBLDBCQUFjLEVBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQzNDLE1BQU0sS0FBSyxHQUFHLElBQUEsd0JBQVUsRUFBQyxFQUFFLFFBQVEsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQzNDLE1BQU0sR0FBRyxHQUFHLE9BQU8sQ0FBQyxHQUFHLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQztJQUNwQyxNQUFNLFFBQVEsR0FBRyxJQUFBLDBCQUFZLEVBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ2hELE1BQU0sTUFBTSxHQUFHLElB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LEVBQUUsUUFBUSxFQUFFLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNuRSxHQUFHLENBQUMsTUFBTSxDQUFDLFlBQVksSUFBSSxFQUFFLFlBQVksRUFBRSxJQUFhLEVBQUUsQ0FBQztRQUMzRCxHQUFHLENBQUMsTUFBTSxLQUFLLFNBQVMsSUFBSSxFQUFFLE1BQU0sRUFBRSxDQUFDO0tBQ3hDLENBQUM7QUFDSixDQUFDO0FBRUQsdURBQXVEO0FBQ3ZELE1BQU0sV0FBVztJQUNFLE1BQU0sR0FBRyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFFNUYsR0FBRyxDQUFDLE1BQXFCO1FBQ3ZCLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQztRQUN2QixJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDbkMsQ0FBQztJQUVELE9BQU8sQ0FBQyxJQUE0QjtRQUNsQyxPQUFPLElBQUEsc0JBQVUsRUFBaUIsRUFBRSxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUM5RCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIGF0dGVtcHQvcnVubmVyLnRzIOKAlCBgcnVuQXR0ZW1wdHNgLCBUSEUgcmV0cnkgbG9vcCAoZGVzaWduIMKnMy4xLCBsYXcgMTogb25lIHJ1bm5lciwgb25lIHJlY29yZCkuXG4gKlxuICogUnVucyBhIGZ1bmN0aW9uIHVuZGVyIGEgcG9saWN5IGFuZCByZWNvcmRzIGV2ZXJ5IHRyeTogb25lIGZyb3plbiBgQXR0ZW1wdFJlY29yZGAgcGVyIGF0dGVtcHQsIGNhcnJ5aW5nIGl0c1xuICogdGltaW5nLCBvdXRjb21lLCBmYWlsdXJlIGNhdGVnb3J5IGFuZCB0aGUgcmV0cnktb3Itc3RvcCBkZWNpc2lvbiAoYGF0dGVtcHQvZGVjaXNpb24udHNgKSwgYW5kIG9uZVxuICogYEF0dGVtcHRTdW1tYXJ5YCB3aGVuIHRoZSBzZXJpZXMgZW5kcy4gVGhlIGVuZ2luZSdzIHN0YWdlIHJldHJ5IChgRmxvd2NoYXJ0VHJhdmVyc2VyIMK3IGV4ZWN1dGVTdGFnZWApIHJ1bnMgb25cbiAqIGl0OyBsYXRlciBwYWNrZXRzIHJ1biBpbi1zdGFnZSBjYWxscyBhbmQgc3RhbmRhbG9uZSBgYXR0ZW1wdCgpYCBvbiBpdCB0b28uXG4gKlxuICogVGhlIGxvb3AsIHBlciBhdHRlbXB0IG4g4oCUIGZvciBhIGZhaWxlZCBhdHRlbXB0LCB0aGUgOS4xNSBsb29wJ3Mgb3JkZXIsIHN0ZXAgZm9yIHN0ZXA6XG4gKlxuICogICBzdGFydCDihpIgcnVuKG4pIOKGkiBvdXRjb21lIChvayB8IGZhaWxlZCB8IGFib3J0ZWQgW2l0IHRocmV3IHRoZSBydW4ncyBhYm9ydCByZWFzb25dIHwgcGF1c2VkIFthIFBhdXNlU2lnbmFsXSlcbiAqICAgICAgICAg4oaSIGRlY2lkZSBvdmVyIHRoZSBpbnB1dHMsIGZpcnN0IG1hdGNoIHdpbnMgKGByZXRyeVJ1bGVzYCkg4oCUIHJldHJ5T24gaXMgYXNrZWQgaGVyZSAocnVsZSA1KVxuICogICAgICAgICDihpIgdGhlIHJ1bidzIHNpZ25hbCBhYm9ydGVkIGluc2lkZSByZXRyeU9uPyBkZWNpZGUgYWdhaW46IHJ1bGUgMyBzdG9wcyB0aGUgc2VyaWVzIGhlcmUsIGJlZm9yZSB0aGVcbiAqICAgICAgICAgICBkaXNjYXJkIGFuZCBiZWZvcmUgYmFja29mZk1zLCBhcyB0aGUgOS4xNSBhYm9ydCBjaGVjayBkaWRcbiAqICAgICAgICAg4oaSIHJldHJ5OiBiZXR3ZWVuKG4pIOKAlCB0aGUgZGlzY2FyZCDigJQgYW5kIFRIRU4gYmFja29mZk1zKG4pLCB0aGUgd2FpdCdzIGxlbmd0aFxuICogICAgICAgICDihpIgdGhlIGVycm9yJ3Mgc2VydmVkIGZvcm0gYW5kIGNhdGVnb3J5LCByZWFkIGFmdGVyIHJldHJ5T24gYW5kIGJhY2tvZmZNcyByYW4g4oaSIHRoZSByZWNvcmRcbiAqICAgICAgICAg4oaSIG9uRW5kKHN1bW1hcnkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmx5IHdoZW4gdGhlIHNlcmllcyBlbmRzIGhlcmVcbiAqICAgICAgICAg4oaSIG9uQXR0ZW1wdChyZWNvcmQsIHNlcnZlZCBlcnJvcilcbiAqICAgICAgICAg4oaSIGRvbmU6IHJldHVybiB0aGUgdmFsdWUgwrcgc3RvcDogcmV0aHJvdyB0aGUgYXR0ZW1wdCdzIE9XTiBlcnJvclxuICogICAgICAgICDihpIgcmV0cnk6IG9uUmV0cnkobiwgb2YsIGRlbGF5LCBzZXJ2ZWQgZXJyb3IpIOKGkiB3YWl0IChjdXQgc2hvcnQgYnkgdGhlIHNpZ25hbCkg4oaSIGFib3J0ZWQ/IHN0b3BcbiAqXG4gKiBXSEFUIElUIFBSRVNFUlZFUyAodGhlIDkuMTUgbG9vcCdzIGJlaGF2aW91ciwgbW92ZWQgaGVyZSB1bmNoYW5nZWQpOiB0aGUgZnVuY3Rpb24gcnVucyB0aGUgc2FtZSBudW1iZXIgb2ZcbiAqIHRpbWVzOyBgcmV0cnlPbmAgaXMgYXNrZWQgb25seSBmb3IgYSBmYWlsZWQsIG5vbi1maW5hbCBhdHRlbXB0OyBgYmFja29mZk1zYCBvbmx5IHdoZW4gYSByZXRyeSBmb2xsb3dzLCBhZnRlclxuICogdGhlIGRpc2NhcmQ7IGEgdGhyb3dpbmcgcHJlZGljYXRlIGlzIFwiZG8gbm90IHJldHJ5XCIsIGEgdGhyb3dpbmcgb3Igbm9uLWZpbml0ZSBiYWNrb2ZmIGlzIFwibm8gd2FpdFwiOyBhIHBhdXNlIGlzXG4gKiBuZXZlciByZXRyaWVkOyB0aGUgYXR0ZW1wdCdzIG93biBlcnJvciBpcyByZXRocm93biwgbmV2ZXIgYSB3cmFwcGVyOyBhbmQgYSBmYWlsZWQgYXR0ZW1wdCdzIG9yZGVyIOKAlFxuICogYHJldHJ5T25gIOKGkiB0aGUgYWJvcnQgY2hlY2sg4oaSIHRoZSBkaXNjYXJkIChgYmV0d2VlbmApIOKGkiBgYmFja29mZk1zYCDihpIgdGhlIHNlcnZlZCBlcnJvciDihpIgdGhlIHJldHJ5IGV2ZW50IOKGklxuICogdGhlIHdhaXQg4oaSIHRoZSBhYm9ydCBjaGVjay4gU28gYW4gYWJvcnQgaW5zaWRlIGByZXRyeU9uYCBzdG9wcyBiZWZvcmUgdGhlIGRpc2NhcmQgYW5kIG5ldmVyIGFza3MgYGJhY2tvZmZNc2A7XG4gKiBhbiBhYm9ydCBpbnNpZGUgYGJhY2tvZmZNc2AgY29tZXMgYWZ0ZXIgdGhlIGRpc2NhcmQsIHN0aWxsIGZpcmVzIHRoZSByZXRyeSBldmVudCwgdGhlbiBlbmRzIGF0IHRoZSB3YWl0OyBhbmRcbiAqIHRoZSBzZXJ2ZWQgZXJyb3Igc2hvd3Mgd2hhdCBgcmV0cnlPbmAgZGlkIHRvIHRoZSB0aHJvd24gdmFsdWUuIFRoZSBvbmUgZGlmZmVyZW5jZTogd2hlbiB0aGUgcnVuJ3Mgc2lnbmFsIGhhc1xuICogQUxSRUFEWSBhYm9ydGVkIGFzIHRoZSBhdHRlbXB0IGZhaWxzLCB0aGUgc2VyaWVzIHN0b3BzIHdpdGhvdXQgYXNraW5nIGByZXRyeU9uYCAodGhlIGFib3J0IGRlY2lkZXMgZmlyc3Qg4oCUXG4gKiBydWxlIDMgYmVmb3JlIHJ1bGUgNSkuXG4gKlxuICogV0hBVCBJVCBBRERTOiB0aGUgcmVjb3JkIGFuZCB0aGUgc3VtbWFyeS4gQSByZWNvcmQgaXMgZnJvemVuIHRvIGl0cyBsZWF2ZXMgYW5kIGhvbGRzIG9ubHkgY2xvbmUtc2FmZSBkYXRhIOKAlFxuICogdGhlIGVycm9yIGFzIHRoZSBydW4gU0VSVkVTIGl0IChgc2VydmVgLCB0aGUgcmVkYWN0aW9uIHJ1bGUncyBmb3JtKSB3aXRob3V0IGByYXdgLiBUaGUgaG9vayBnZXRzIHRoZSBzZXJ2ZWRcbiAqIGBTdHJ1Y3R1cmVkRXJyb3JJbmZvYCB3aG9sZSwgYHJhd2AgaW5jbHVkZWQsIGFzIGBvblN0YWdlUmV0cnlgIGFsd2F5cyBoYXMuIEEgcmVjb3JkIG5ldmVyIHJld3JpdGVzIHdoYXQgdGhlXG4gKiBhdHRlbXB0IGRpZDogYW4gYXR0ZW1wdCB0aGF0IHRocmV3IGl0cyBvd24gZXJyb3IgaXMgYGZhaWxlZGAsIHdpdGggaXRzIGNhdGVnb3J5LCBldmVuIHdoZW4gdGhlIHJ1biBhYm9ydGVkXG4gKiBhcm91bmQgaXQg4oCUIHRoZSBhYm9ydCBpcyB0aGUgc2VyaWVzJyBzdG9wIHJlYXNvbiAoYHJlYXNvbjogJ2Fib3J0ZWQnYCk7IGEgdGhyb3dpbmcgYHJldHJ5T25gIGlzIGBkZWNsaW5lZGBcbiAqIHdpdGggYHJldHJ5T25UaHJldzogdHJ1ZWAsIGFwYXJ0IGZyb20gYSByZWFsIGBmYWxzZWAuXG4gKlxuICogVElNRSAoUDFiKS4gRWFjaCBhdHRlbXB0IHJ1bnMgdW5kZXIgYG1pbihwb2xpY3kudGltZW91dE1zLCB0aW1lIGxlZnQgYmVmb3JlIG9wdGlvbnMuZGVhZGxpbmUpYCBhbmQgZ2V0cyBhblxuICogYEF0dGVtcHRDb250ZXh0YCDigJQgaXRzIHNpZ25hbCwgY29tcG9zZWQgZnJvbSB0aGUgcnVuJ3MgYW5kIGl0cyBvd24gY2FwJ3MgdGltZXIgKGBMaXZlQXR0ZW1wdGApLiBUaGUgY2FwJ3MgdGltZXJcbiAqIGFib3J0cyB3aXRoIGFuIGBBdHRlbXB0VGltZW91dEVycm9yYDsgdGhlIHJ1bidzIGRlYWRsaW5lIGFib3J0cyB0aGUgcnVuJ3Mgc2lnbmFsIHdpdGggYSBicmFuZGVkIHJlYXNvblxuICogKGBhdHRlbXB0L2RlYWRsaW5lLnRzYCkuIEVpdGhlciB3YXkgdGhlIGF0dGVtcHQgaXMgYCd0aW1lb3V0J2AsIG5ldmVyIGAnYWJvcnRlZCdgOiB0aGUgZGVhZGxpbmUgaXMgbm90IGFcbiAqIGNhbmNlbGxhdGlvbiwgc28gcnVsZSAzIGRvZXMgbm90IG1hdGNoIGFuZCBydWxlIDYgKGB0aW1lTGVmdEFmdGVyV2FpdE1zIOKJpCAwYCkgc3RvcHMgYSBzZXJpZXMgd2hvc2UgbmV4dCB3YWl0XG4gKiB3b3VsZCBvdXRsYXN0IGl0LiBVbmRlciBhIGRlYWRsaW5lIHJ1bGUgNiBuZWVkcyB0aGUgd2FpdCdzIGxlbmd0aCwgc28gYGJhY2tvZmZNcyhuLCBlcnJvcilgIGlzIGFza2VkIERVUklORyB0aGVcbiAqIGRlY2lzaW9uIOKAlCBiZWZvcmUgdGhlIGRpc2NhcmQ7IHdpdGhvdXQgb25lIHRoZSA5LjE1IG9yZGVyIGFib3ZlIGhvbGRzIHVuY2hhbmdlZC4gTm8gYXR0ZW1wdCBzdGFydHMgYXQgb3IgcGFzdFxuICogdGhlIGRlYWRsaW5lOiBhIHdhaXQgdGhlIGRlYWRsaW5lIGN1dCBlbmRzIHRoZSBzZXJpZXMgYG5vLXRpbWUtbGVmdGAsIHJlY29yZGluZyBubyBmdXJ0aGVyIGF0dGVtcHQuXG4gKlxuICogVEhFIEZFTkNFLiBUaGUgbW9tZW50IGFuIGF0dGVtcHQgZW5kcyB3aXRob3V0IGFuIGFuc3dlciDigJQgaXRzIHNpZ25hbCBhYm9ydHMgKHN5bmNocm9ub3VzbHksIGJlZm9yZSBhbnkgbGlzdGVuZXJcbiAqIHRoZSBmdW5jdGlvbiBhZGRlZCkgb3IgaXQgdGhyb3dzIOKAlCBgb25BYmFuZG9uKG4pYCBmaXJlcyBvbmNlLCBhbmQgdGhlIGVuZ2luZSBjbG9zZXMgdGhhdCBhdHRlbXB0J3Mgc2NvcGU6IHRoZVxuICogZnVuY3Rpb24gbWF5IHN0aWxsIGJlIHJ1bm5pbmcsIGFuZCBub3RoaW5nIGl0IGRvZXMgYWZ0ZXJ3YXJkcyBtYXkgbGFuZCBiZXNpZGUgYSBsYXRlciBhdHRlbXB0LlxuICpcbiAqIE9ORSBhc3luYyBmcmFtZSB3aXRoIE9ORSBhd2FpdCBwZXIgYXR0ZW1wdDogdGhlIGVuZ2luZSByZWxpZXMgb24gdGhhdCB0byBrZWVwIGEgcmV0cmllZCBzdGFnZSdzIG1pY3JvdGFza1xuICogc2hhcGUsIHNvIHBhcmFsbGVsIHNpYmxpbmdzIHNldHRsZSBpbiB0aGUgb3JkZXIgdGhleSBhbHdheXMgZGlkLiBUaGUgZW5naW5lIHJhY2VzIHRoZSBhdHRlbXB0J3Mgc2lnbmFsIGl0c2VsZixcbiAqIGF0IHRoZSBzdGFnZSBib3VuZGFyeSAoYHJhY2VkOiB0cnVlYCk7IGFueSBvdGhlciBjYWxsZXIgZ2V0cyB0aGUgcmFjZSBoZXJlLCBzbyB0aGUgc2VyaWVzIG5ldmVyIHdhaXRzIG9uIGFuXG4gKiBhdHRlbXB0IHBhc3QgaXRzIGNhcC5cbiAqXG4gKiBDQUxMUyAoUDIpLiBUaGUgc2FtZSBsb29wIHJ1bnMgYSBjYWxsIGEgc3RhZ2UgbWFrZXMgKGBhdHRlbXB0L2NhbGwudHMgwrcgcnVuQ2FsbGAsIGtpbmQgYCdjYWxsJ2AsIGl0cyBgdGFyZ2V0YCBvblxuICogZXZlcnkgcmVjb3JkKSBhbmQgdGhlIHN0YW5kYWxvbmUgYGF0dGVtcHQoKWAuIEFuIGF0dGVtcHQncyBjYXAgaXMgdGhlIERFQURMSU5FIG9mIGV2ZXJ5IGNhbGwgbWFkZSBpbnNpZGUgaXQsIHNvXG4gKiB0aGUgY2FwJ3MgcmVhc29uIGlzIGJyYW5kZWQgYSB0aW1lIGxpbWl0IChgYXR0ZW1wdC9kZWFkbGluZS50cyDCtyBtYXJrVGltZUxpbWl0YCk6IGEgY2FsbCBjdXQgYnkgaXRzIHN0YWdlXG4gKiBhdHRlbXB0J3MgY2FwIHRpbWVkIG91dCwgaXQgd2FzIG5vdCBjYW5jZWxsZWQuIGBhdHRlbXB0RW5kc0F0YCBzYXlzIHdoZW4gYW4gYXR0ZW1wdCBtdXN0IGVuZDsgYW4gYGludGVycnVwdCgpYFxuICogdGhyb3duIGluc2lkZSBhIGNhbGwgaXMgYSBwYXVzZSwgbGlrZSBhIGBQYXVzZVNpZ25hbGAg4oCUIG5ldmVyIHJldHJpZWQuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBTdHJ1Y3R1cmVkRXJyb3JJbmZvIH0gZnJvbSAnLi4vZXJyb3JzL2Vycm9ySW5mby5qcyc7XG5pbXBvcnQgeyBleHRyYWN0RXJyb3JJbmZvIH0gZnJvbSAnLi4vZXJyb3JzL2Vycm9ySW5mby5qcyc7XG5pbXBvcnQgeyBpc0ludGVycnVwdFNpZ25hbCB9IGZyb20gJy4uL3BhdXNlL2ludGVycnVwdC5qcyc7XG5pbXBvcnQgeyBpc1BhdXNlU2lnbmFsIH0gZnJvbSAnLi4vcGF1c2UvdHlwZXMuanMnO1xuaW1wb3J0IHsgYW55U2lnbmFsIH0gZnJvbSAnLi9hbnlTaWduYWwuanMnO1xuaW1wb3J0IHsgZXJyb3JDYXRlZ29yeSB9IGZyb20gJy4vY2F0ZWdvcnkuanMnO1xuaW1wb3J0IHsgaXNDYW5jZWxsZWQsIGlzRGVhZGxpbmVSZWFzb24sIG1hcmtUaW1lTGltaXQsIHJlYWREZWFkbGluZSwgc2V0TG9uZ1RpbWVvdXQgfSBmcm9tICcuL2RlYWRsaW5lLmpzJztcbmltcG9ydCB7IGRlY2lkZUF0dGVtcHQsIHJldHJ5UnVsZXMgfSBmcm9tICcuL2RlY2lzaW9uLmpzJztcbmltcG9ydCB0eXBlIHsgRWZmZWN0VGFyZ2V0IH0gZnJvbSAnLi9lZmZlY3QuanMnO1xuaW1wb3J0IHsgZWZmZWN0T2YsIHJlY29yZGVkS2V5T2YsIHJlZnVzZUtleWxlc3NSZXRyeSwgdW5rbm93bkVmZmVjdEVycm9yIH0gZnJvbSAnLi9lZmZlY3QuanMnO1xuaW1wb3J0IHsgQXR0ZW1wdFRpbWVvdXRFcnJvciB9IGZyb20gJy4vZXJyb3JzLmpzJztcbmltcG9ydCB7IGF0dGVtcHRDZWlsaW5nLCBhdHRlbXB0VGltZW91dE1zLCBjYXBwZWRXYWl0TXMgfSBmcm9tICcuL3BvbGljeS5qcyc7XG5pbXBvcnQgeyBmcmVlemVEZWVwLCByZWNvcmRlZEVycm9yIH0gZnJvbSAnLi9yZWNvcmQuanMnO1xuaW1wb3J0IHR5cGUge1xuICBBdHRlbXB0Q2F0ZWdvcnksXG4gIEF0dGVtcHRDb250ZXh0LFxuICBBdHRlbXB0S2luZCxcbiAgQXR0ZW1wdE91dGNvbWUsXG4gIEF0dGVtcHRSZWNvcmQsXG4gIEF0dGVtcHRTdW1tYXJ5LFxuICBPYnNlcnZlZEF0dGVtcHQsXG4gIFJldHJ5UG9saWN5LFxufSBmcm9tICcuL3R5cGVzLmpzJztcblxuLyoqIFdoYXQgYSBzZXJpZXMgcmVwb3J0cywgYW5kIHRoZSBlbmdpbmUncyBiZXR3ZWVuLWF0dGVtcHQgc3RlcC4gRXZlcnkgbWVtYmVyIGlzIG9wdGlvbmFsLiAqL1xuZXhwb3J0IGludGVyZmFjZSBBdHRlbXB0UnVuT3B0aW9ucyB7XG4gIC8qKiBUaGUgc2VyaWVzIGV2ZXJ5IHJlY29yZCBuYW1lcyDigJQgZm9yIGEgc3RhZ2UgYXR0ZW1wdCwgaXRzIGV4ZWN1dGlvbidzIGBydW50aW1lU3RhZ2VJZGAuICovXG4gIHJlYWRvbmx5IHNlcmllczogc3RyaW5nO1xuICAvKiogRGVmYXVsdCBgJ3N0YWdlJ2AuICovXG4gIHJlYWRvbmx5IGtpbmQ/OiBBdHRlbXB0S2luZDtcbiAgLyoqIFRoZSBvdXRzaWRlIHRhcmdldCBldmVyeSByZWNvcmQgbmFtZXMg4oCUIGEgY2FsbCdzIChgJGNhbGxgLCBgYXR0ZW1wdCgpYCk7IGFic2VudCBmb3IgYSBzdGFnZSBhdHRlbXB0LiAqL1xuICByZWFkb25seSB0YXJnZXQ/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgcnVuJ3Mgc2lnbmFsLiBPbmNlIGl0IGhhcyBhYm9ydGVkIChvdGhlciB0aGFuIGF0IHRoZSBkZWFkbGluZSksIHJ1bGUgMyBzdG9wcyB0aGUgc2VyaWVzXG4gICAqIChgcmVhc29uOiAnYWJvcnRlZCdgKTsgaXQgY3V0cyBhIHdhaXQgc2hvcnQuIEFuIGF0dGVtcHQgdGhhdCB0aHJldyBpdHMgcmVhc29uIGlzIHJlY29yZGVkIGAnYWJvcnRlZCdgIOKAlCBvclxuICAgKiBgJ3RpbWVvdXQnYCB3aGVuIHRoZSByZWFzb24gaXMgdGhlIGRlYWRsaW5lJ3MgKGBhdHRlbXB0L2RlYWRsaW5lLnRzYCkuXG4gICAqL1xuICByZWFkb25seSBzaWduYWw/OiBBYm9ydFNpZ25hbDtcbiAgLyoqXG4gICAqIFRoZSBydW4ncyBkZWFkbGluZSwgZXBvY2ggbWlsbGlzZWNvbmRzLiBFdmVyeSBhdHRlbXB0IGlzIGNhcHBlZCBieSB0aGUgdGltZSBsZWZ0OyBydWxlIDYgc3RvcHMgYSBzZXJpZXMgd2hvc2VcbiAgICogbmV4dCB3YWl0IHdvdWxkIG91dGxhc3QgaXQgKGBuby10aW1lLWxlZnRgKS4gQWJzZW50IChvciBub3QgZmluaXRlKSA9IG5vIGRlYWRsaW5lOiB0aGUgdGltZSBsZWZ0IGlzIGBJbmZpbml0eWAuXG4gICAqL1xuICByZWFkb25seSBkZWFkbGluZT86IG51bWJlcjtcbiAgLyoqIFRoZSBjbG9jaywgZXBvY2ggbWlsbGlzZWNvbmRzLiBEZWZhdWx0IGBEYXRlLm5vd2AuICovXG4gIHJlYWRvbmx5IG5vdz86ICgpID0+IG51bWJlcjtcbiAgLyoqIFRoZSBzZXJ2ZWQgZm9ybSBvZiBhIGZhaWxlZCBhdHRlbXB0J3MgZXJyb3IuIERlZmF1bHQgYGV4dHJhY3RFcnJvckluZm9gIChubyByZWRhY3Rpb24gcnVsZSkuICovXG4gIHJlYWRvbmx5IHNlcnZlPzogKGVycm9yOiB1bmtub3duKSA9PiBTdHJ1Y3R1cmVkRXJyb3JJbmZvO1xuICAvKiogQmV0d2VlbiBhIGZhaWxlZCBhdHRlbXB0IGFuZCB0aGUgbmV4dCwgYmVmb3JlIGBiYWNrb2ZmTXNgOiB0aGUgZW5naW5lIGRpc2NhcmRzIHRoZSBhdHRlbXB0J3Mgc3RhZ2VkIHdyaXRlcy4gKi9cbiAgcmVhZG9ubHkgYmV0d2Vlbj86IChhdHRlbXB0OiBudW1iZXIpID0+IHZvaWQ7XG4gIC8qKiBFdmVyeSBhdHRlbXB0LCBhdCBpdHMgZW5kLCB3aXRoIGl0cyBzZXJ2ZWQgZXJyb3IgKGB1bmRlZmluZWRgIGZvciBgJ29rJ2AgYW5kIGAncGF1c2VkJ2ApLiAqL1xuICByZWFkb25seSBvbkF0dGVtcHQ/OiAocmVjb3JkOiBBdHRlbXB0UmVjb3JkLCBzdHJ1Y3R1cmVkRXJyb3I6IFN0cnVjdHVyZWRFcnJvckluZm8gfCB1bmRlZmluZWQpID0+IHZvaWQ7XG4gIC8qKiBBIGZhaWxlZCBhdHRlbXB0IHRoYXQgV0lMTCBiZSByZXRyaWVkIOKAlCBhZnRlciBgYmV0d2VlbmAgYW5kIGBvbkF0dGVtcHRgLCBiZWZvcmUgdGhlIHdhaXQuICovXG4gIHJlYWRvbmx5IG9uUmV0cnk/OiAoYXR0ZW1wdDogbnVtYmVyLCBvZjogbnVtYmVyLCBkZWxheU1zOiBudW1iZXIsIHN0cnVjdHVyZWRFcnJvcjogU3RydWN0dXJlZEVycm9ySW5mbykgPT4gdm9pZDtcbiAgLyoqIFRoZSBzZXJpZXMgZW5kZWQ6IGNhbGxlZCBvbmNlLCBiZWZvcmUgdGhlIGxhc3QgYG9uQXR0ZW1wdGAgKG9yIGFmdGVyIGEgd2FpdCB0aGUgcnVuJ3Mgc2lnbmFsIGN1dCkuICovXG4gIHJlYWRvbmx5IG9uRW5kPzogKHN1bW1hcnk6IEF0dGVtcHRTdW1tYXJ5KSA9PiB2b2lkO1xuICAvKiogYHJldHJ5T25gIHRocmV3IOKAlCB0aGUgYXR0ZW1wdCBpcyB0cmVhdGVkIGFzIGRlY2xpbmVkOyB0aGUgZW5naW5lIGxvZ3MgdGhlIHRocm93IGhlcmUuICovXG4gIHJlYWRvbmx5IG9uUmV0cnlPblRocmV3PzogKHRocm93bjogdW5rbm93bikgPT4gdm9pZDtcbiAgLyoqXG4gICAqIFRoZSBhdHRlbXB0IGVuZGVkIHdpdGhvdXQgYW4gYW5zd2VyIOKAlCBjYWxsZWQgU1lOQ0hST05PVVNMWSB0aGUgbW9tZW50IGl0cyBzaWduYWwgYWJvcnRzIChpdHMgY2FwLCB0aGUgZGVhZGxpbmUsXG4gICAqIGEgY2FuY2VsbGF0aW9uKSwgZWxzZSBhcyBzb29uIGFzIGl0IGZhaWxlZC4gV2hhdGV2ZXIgdGhlIGFiYW5kb25lZCBmdW5jdGlvbiBkb2VzIGFmdGVyd2FyZHMgaXMgbm90IHRoaXNcbiAgICogc2VyaWVzJzogdGhlIGVuZ2luZSBmZW5jZXMgaXRzIHNjb3BlIGhlcmUuIE9uY2UgcGVyIGF0dGVtcHQ7IG5ldmVyIGZvciBgJ29rJ2Agb3IgYCdwYXVzZWQnYCDigJQgZXhjZXB0IGFuIGF0dGVtcHRcbiAgICogdGhhdCBTVEFSVEVEIHVuZGVyIGFuIGFscmVhZHktYWJvcnRlZCBzaWduYWwsIGZlbmNlZCBvbmNlIGl0cyBzeW5jaHJvbm91cyBwYXJ0IGhhcyBydW4gKG5vYm9keSB3YWl0cyBmb3IgaXQpLlxuICAgKi9cbiAgcmVhZG9ubHkgb25BYmFuZG9uPzogKGF0dGVtcHQ6IG51bWJlcikgPT4gdm9pZDtcbiAgLyoqXG4gICAqIFRoZSBjYWxsZXIgcmFjZXMgYHJ1bmAncyBwcm9taXNlIGFnYWluc3QgdGhlIGF0dGVtcHQncyBzaWduYWwgaXRzZWxmIOKAlCB0aGUgZW5naW5lIGRvZXMsIGF0IHRoZSBzdGFnZSBib3VuZGFyeVxuICAgKiAoYFN0YWdlUnVubmVyYCksIHNvIGEgc3RhZ2Uga2VlcHMgaXRzIG9uZSBhd2FpdCBwZXIgYXR0ZW1wdC4gT3RoZXJ3aXNlIHRoZSBydW5uZXIgcmFjZXMgaXQ6IHRoZSBzZXJpZXMgbmV2ZXJcbiAgICogd2FpdHMgb24gYW4gYXR0ZW1wdCBwYXN0IGl0cyBjYXAuXG4gICAqL1xuICByZWFkb25seSByYWNlZD86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBXaGF0IGFuIGF0dGVtcHQncyBgb2JzZXJ2ZWQocmVwb3J0KWAgZG9lcyAoUDIpIOKAlCB0aGUgb3duZXIgb2YgdGhlIGF0dGVtcHQgcmVjb3JkcyB0aGUgcmVwb3J0OiBgcnVuQ2FsbGAgaGFuZHNcbiAgICogYSBjYWxsJ3MgcmVwb3J0cyB0byB0aGUgc2NvcGUsIGBhdHRlbXB0KClgIGtlZXBzIGl0cyBvd24uIGBlbmRlZGAgc2F5cyB0aGUgYXR0ZW1wdCBoYWQgYWxyZWFkeSBlbmRlZCB3aGVuIHRoZVxuICAgKiByZXBvcnQgY2FtZSAodGhlIG93bmVyIGRyb3BzIGl0KS4gQWJzZW50IOKAlCBhIHN0YWdlIGF0dGVtcHQncyBjb250ZXh0LCB3aG9zZSBgb2JzZXJ2ZWRgIHRoZSBzY29wZSdzXG4gICAqIGAkYXR0ZW1wdCgpYCByZXBsYWNlcyDigJQgYG9ic2VydmVkYCBpcyByZWZ1c2VkIHdpdGggYSBgVHlwZUVycm9yYC5cbiAgICovXG4gIHJlYWRvbmx5IG9ic2VydmU/OiAocmVwb3J0OiBPYnNlcnZlZEF0dGVtcHQsIGF0OiB7IHJlYWRvbmx5IGF0dGVtcHQ6IG51bWJlcjsgcmVhZG9ubHkgZW5kZWQ6IGJvb2xlYW4gfSkgPT4gdm9pZDtcbiAgLyoqXG4gICAqIFRoZSBvdXRzaWRlIHN5c3RlbSB0aGUgdGFyZ2V0IHRvdWNoZXMgKFAzLCBkZXNpZ24gwqczLjMpLiBFdmVyeSByZWNvcmQgdGhlbiBzYXlzIHdoYXQgaXRzIGF0dGVtcHQgZGlkIHRvIGl0XG4gICAqIChgZWZmZWN0YCkgYW5kIG5hbWVzIHRoZSBzeXN0ZW0gYW5kIHRoZSBSRUNPUkRFRCBrZXk7IGV2ZXJ5IGF0dGVtcHQncyBjb250ZXh0IGNhcnJpZXMgdGhlIFJFQUwga2V5LiBBIHNlcmllc1xuICAgKiB0aGF0IGVuZHMgd2l0aG91dCBhbiBhbnN3ZXIgYWZ0ZXIgYW55IGF0dGVtcHQgb2YgdW5rbm93biBlZmZlY3QgZmFpbHMgd2l0aCBgVW5rbm93bkVmZmVjdEVycm9yYCAoaXRzIGBjYXVzZWAgdGhlIGF0dGVtcHQncyBvd24gZXJyb3IpIOKAlFxuICAgKiBleGNlcHQgYSBwYXVzZSwgd2hpY2ggc3RheXMgYSBwYXVzZS4gQSB0b3VjaGluZyBzZXJpZXMgdGhhdCBtYXkgcmV0cnkgd2l0aG91dCBhIGtleSBpcyByZWZ1c2VkIGJlZm9yZSBhbnl0aGluZ1xuICAgKiBydW5zOiB0aGUgbGF3J3MgbGFzdCBkb29yLlxuICAgKi9cbiAgcmVhZG9ubHkgZWZmZWN0PzogRWZmZWN0VGFyZ2V0O1xufVxuXG4vKiogV2hlbiBlYWNoIGxpdmUgYXR0ZW1wdCBtdXN0IGVuZCwgZXBvY2ggbXMg4oCUIGBzdGFydGVkQXQgKyBjYXBgLCBmb3IgYW4gYXR0ZW1wdCB0aGF0IGhhcyBhIGNhcCAoYGF0dGVtcHRFbmRzQXRgKS4gKi9cbmNvbnN0IEFUVEVNUFRfRU5EUyA9IG5ldyBXZWFrTWFwPEF0dGVtcHRDb250ZXh0LCBudW1iZXI+KCk7XG5cbi8qKlxuICogV2hlbiB0aGUgYXR0ZW1wdCBiZWhpbmQgYGNvbnRleHRgIG11c3QgZW5kLCBlcG9jaCBtaWxsaXNlY29uZHMg4oCUIGl0cyBzdGFydCBwbHVzIGl0cyBjYXAgKGBtaW4odGltZW91dE1zLCB0aW1lXG4gKiBsZWZ0KWAsIHNvIG5ldmVyIHBhc3QgdGhlIHJ1bidzIGRlYWRsaW5lKSDigJQgb3IgYHVuZGVmaW5lZGAgZm9yIGFuIHVuY2FwcGVkIGF0dGVtcHQuIEEgY2FsbCBtYWRlIGluc2lkZSB0aGVcbiAqIGF0dGVtcHQgcnVucyB1bmRlciBpdCBhcyBpdHMgZGVhZGxpbmUgKGBhdHRlbXB0L2NhbGwudHNgKS4gT25seSB0aGUgcnVubmVyJ3Mgb3duIGNvbnRleHRzIGFyZSBrbm93bi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGF0dGVtcHRFbmRzQXQoY29udGV4dDogQXR0ZW1wdENvbnRleHQgfCB1bmRlZmluZWQpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICByZXR1cm4gY29udGV4dCA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogQVRURU1QVF9FTkRTLmdldChjb250ZXh0KTtcbn1cblxuLyoqIEEgZmFpbGVkIGF0dGVtcHQncyB0aHJvd24gdmFsdWUsIGJveGVkOiBgdW5kZWZpbmVkYCBpcyBhIHZhbHVlIGEgc3RhZ2UgbWF5IHRocm93LiAqL1xuaW50ZXJmYWNlIEZhaWx1cmUge1xuICByZWFkb25seSBlcnJvcjogdW5rbm93bjtcbn1cblxuLyoqXG4gKiBSdW4gYHJ1bmAgdW50aWwgaXQgc3VjY2VlZHMgb3IgdGhlIHBvbGljeSBzdG9wcyBpdDsgcmVzb2x2ZSB3aXRoIGl0cyB2YWx1ZSBvciByZWplY3Qgd2l0aCB0aGUgTEFTVCBhdHRlbXB0J3NcbiAqIG93biBlcnJvci4gYHJ1bihuKWAgaXMgY2FsbGVkIHdpdGggdGhlIGF0dGVtcHQgbnVtYmVyLCAxLWJhc2VkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcnVuQXR0ZW1wdHM8VD4oXG4gIHJ1bjogKGF0dGVtcHQ6IG51bWJlciwgY29udGV4dDogQXR0ZW1wdENvbnRleHQpID0+IFByb21pc2U8VD4gfCBULFxuICBwb2xpY3k6IFJldHJ5UG9saWN5LFxuICBvcHRpb25zOiBBdHRlbXB0UnVuT3B0aW9ucyxcbik6IFByb21pc2U8VD4ge1xuICBjb25zdCBvZiA9IGF0dGVtcHRDZWlsaW5nKHBvbGljeS5hdHRlbXB0cyk7XG4gIGNvbnN0IHJ1bGVzID0gcmV0cnlSdWxlcyh7IGF0dGVtcHRzOiBvZiB9KTtcbiAgY29uc3Qgbm93ID0gb3B0aW9ucy5ub3cgPz8gRGF0ZS5ub3c7XG4gIGNvbnN0IGRlYWRsaW5lID0gcmVhZERlYWRsaW5lKG9wdGlvbnMuZGVhZGxpbmUpO1xuICBjb25zdCBvd25DYXAgPSBhdHRlbXB0VGltZW91dE1zKHBvbGljeS50aW1lb3V0TXMpO1xuICBjb25zdCB0YWxseSA9IG5ldyBTZXJpZXNUYWxseSgpO1xuICBpZiAob3B0aW9ucy5lZmZlY3QpIHJlZnVzZUtleWxlc3NSZXRyeShvcHRpb25zLmVmZmVjdCwgb2YpO1xuICAvKiogQW4gZWFybGllciBhdHRlbXB0IG9mIHRoaXMgdG91Y2hpbmcgc2VyaWVzIGxlZnQgdGhlIGVmZmVjdCB1bmtub3duIOKAlCBhIGxhdGVyIGFuc3dlciBvZiBgbm9uZWAgY2Fubm90IGNsZWFyIGl0LiAqL1xuICBsZXQgdW5rbm93blNvRmFyID0gZmFsc2U7XG5cbiAgZm9yIChsZXQgYXR0ZW1wdCA9IDE7IDsgYXR0ZW1wdCsrKSB7XG4gICAgY29uc3Qgc3RhcnRlZEF0ID0gbm93KCk7XG4gICAgY29uc3QgbGl2ZSA9IG5ldyBMaXZlQXR0ZW1wdChvcHRpb25zLCBhdHRlbXB0LCBvZiwgc3RhcnRlZEF0LCBkZWFkbGluZSwgb3duQ2FwLCBub3cpO1xuICAgIGxldCB2YWx1ZTogVCB8IHVuZGVmaW5lZDtcbiAgICBsZXQgZmFpbHVyZTogRmFpbHVyZSB8IHVuZGVmaW5lZDtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcGVuZGluZyA9IHJ1bihhdHRlbXB0LCBsaXZlLmNvbnRleHQpO1xuICAgICAgLy8gU3RhcnRlZCB1bmRlciBhIHNpZ25hbCB0aGF0IGhhZCBBTFJFQURZIGFib3J0ZWQgKGEgZGVjaWRlciBlbnRlcmVkIGFmdGVyIGEgY2FuY2VsKTogaXRzIHN5bmNocm9ub3VzIHBhcnRcbiAgICAgIC8vIHJhbiBhcyBpdCBhbHdheXMgZGlkOyBmcm9tIGhlcmUgb24gbm9ib2R5IHdhaXRzIGZvciBpdCwgc28gbm90aGluZyBpdCBkb2VzIGFmdGVyIGl0cyBmaXJzdCBhd2FpdCBsYW5kcy5cbiAgICAgIGlmIChsaXZlLmNvbnRleHQuc2lnbmFsLmFib3J0ZWQpIGxpdmUuYWJhbmRvblN0YXJ0ZWQoKTtcbiAgICAgIHZhbHVlID0gYXdhaXQgKG9wdGlvbnMucmFjZWQgPyBwZW5kaW5nIDogbGl2ZS5yYWNlKHBlbmRpbmcpKTtcbiAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgZmFpbHVyZSA9IHsgZXJyb3IgfTtcbiAgICB9XG4gICAgY29uc3QgZHVyYXRpb25NcyA9IE1hdGgubWF4KDAsIG5vdygpIC0gc3RhcnRlZEF0KTtcbiAgICBjb25zdCBvdXRjb21lID0gb3V0Y29tZU9mKGZhaWx1cmUsIG9wdGlvbnMuc2lnbmFsLCBsaXZlLnRpbWVvdXRSZWFzb24pO1xuICAgIGxpdmUuZW5kKG91dGNvbWUpO1xuICAgIGNvbnN0IGlucHV0cyA9IG5ldyBBdHRlbXB0SW5wdXRSZWFkZXIocG9saWN5LCBvcHRpb25zLCBhdHRlbXB0LCBvZiwgb3V0Y29tZSwgZmFpbHVyZSwgZGVhZGxpbmUsIG5vdyk7XG5cbiAgICBsZXQgZGVjaXNpb24gPSBkZWNpZGVBdHRlbXB0KHJ1bGVzLCBpbnB1dHMucmVhZCk7XG4gICAgLy8gOS4xNSBhc2tlZCByZXRyeU9uLCBUSEVOIGNoZWNrZWQgdGhlIHNpZ25hbC4gRGVjaWRpbmcgYWdhaW4gcmVhZHMgdGhlIHNpZ25hbCBhZnJlc2g6IHJ1bGUgMyBub3cgbWF0Y2hlcyxcbiAgICAvLyBhaGVhZCBvZiBldmVyeSB1c2VyIGZ1bmN0aW9uLCBzbyBub25lIGlzIGFza2VkIHR3aWNlIOKAlCBhbmQgbm90aGluZyBpcyBkaXNjYXJkZWQsIG5vdGhpbmcgd2FpdGVkIGZvci5cbiAgICBpZiAoZGVjaXNpb24ubmV4dCA9PT0gJ3JldHJ5JyAmJiBpc0NhbmNlbGxlZChvcHRpb25zLnNpZ25hbCkpIGRlY2lzaW9uID0gZGVjaWRlQXR0ZW1wdChydWxlcywgaW5wdXRzLnJlYWQpO1xuXG4gICAgLy8gVGhlIGRpc2NhcmQgY29tZXMgQkVGT1JFIHRoZSB3YWl0J3MgbGVuZ3RoIGlzIGFza2VkIGZvciwgYXMgaXQgZGlkIGluIDkuMTUg4oCUIHdpdGhvdXQgYSBkZWFkbGluZS4gVW5kZXIgb25lLFxuICAgIC8vIHJ1bGUgNiBuZWVkcyB0aGUgd2FpdCdzIGxlbmd0aCB0byBkZWNpZGUsIHNvIGBiYWNrb2ZmTXNgIHdhcyBhc2tlZCBkdXJpbmcgdGhlIGRlY2lzaW9uLCBiZWZvcmUgdGhlIGRpc2NhcmQuXG4gICAgaWYgKGRlY2lzaW9uLm5leHQgPT09ICdyZXRyeScpIG9wdGlvbnMuYmV0d2Vlbj8uKGF0dGVtcHQpO1xuICAgIGNvbnN0IGRlbGF5TXMgPSBkZWNpc2lvbi5uZXh0ID09PSAncmV0cnknID8gaW5wdXRzLmRlbGF5TXMoKSA6IGlucHV0cy5kZWxheUlmQXNrZWQoKTtcbiAgICBjb25zdCB0aW1lTGVmdE1zID0gZGVhZGxpbmUgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IGlucHV0cy50aW1lTGVmdCgpO1xuXG4gICAgY29uc3QgY2F0ZWdvcnkgPSBpbnB1dHMuY2F0ZWdvcnkoKTtcbiAgICBjb25zdCBzZXJ2ZWQgPSBpbnB1dHMuZmFpbGVkID8gKG9wdGlvbnMuc2VydmUgPz8gZXh0cmFjdEVycm9ySW5mbykoaW5wdXRzLmZhaWxlZC5lcnJvcikgOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgZWZmZWN0ID0gb3B0aW9ucy5lZmZlY3QgPyBlZmZlY3RPZihpbnB1dHMub3V0Y29tZSwgZmFpbHVyZT8uZXJyb3IpIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IHJlY29yZGVkS2V5ID0gb3B0aW9ucy5lZmZlY3QgPyByZWNvcmRlZEtleU9mKG9wdGlvbnMuZWZmZWN0KSA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCByZWNvcmQgPSBmcmVlemVEZWVwPEF0dGVtcHRSZWNvcmQ+KHtcbiAgICAgIHNlcmllczogb3B0aW9ucy5zZXJpZXMsXG4gICAgICBraW5kOiBvcHRpb25zLmtpbmQgPz8gJ3N0YWdlJyxcbiAgICAgIC4uLihvcHRpb25zLnRhcmdldCAhPT0gdW5kZWZpbmVkICYmIHsgdGFyZ2V0OiBvcHRpb25zLnRhcmdldCB9KSxcbiAgICAgIGF0dGVtcHQsXG4gICAgICBvZixcbiAgICAgIHN0YXJ0ZWRBdCxcbiAgICAgIGR1cmF0aW9uTXMsXG4gICAgICBvdXRjb21lOiBpbnB1dHMub3V0Y29tZSxcbiAgICAgIC4uLihjYXRlZ29yeSAhPT0gdW5kZWZpbmVkICYmIHsgY2F0ZWdvcnkgfSksXG4gICAgICBkZWNpc2lvbjogZGVjaXNpb24uZXZpZGVuY2UsXG4gICAgICBuZXh0OiBkZWNpc2lvbi5uZXh0LFxuICAgICAgcmVhc29uOiBkZWNpc2lvbi5yZWFzb24sXG4gICAgICAuLi4oaW5wdXRzLnJldHJ5T25UaHJldyAmJiB7IHJldHJ5T25UaHJldzogdHJ1ZSBhcyBjb25zdCB9KSxcbiAgICAgIC4uLihkZWxheU1zICE9PSB1bmRlZmluZWQgJiYgeyBkZWxheU1zIH0pLFxuICAgICAgLi4uKGxpdmUuY2FwTXMgIT09IHVuZGVmaW5lZCAmJiB7IHRpbWVvdXRNczogbGl2ZS5jYXBNcyB9KSxcbiAgICAgIC4uLih0aW1lTGVmdE1zICE9PSB1bmRlZmluZWQgJiYgeyB0aW1lTGVmdE1zIH0pLFxuICAgICAgLi4uKHNlcnZlZCAhPT0gdW5kZWZpbmVkICYmIHsgZXJyb3I6IHJlY29yZGVkRXJyb3Ioc2VydmVkKSB9KSxcbiAgICAgIC4uLihvcHRpb25zLmVmZmVjdCAhPT0gdW5kZWZpbmVkICYmIHsgc3lzdGVtOiBvcHRpb25zLmVmZmVjdC5zeXN0ZW0gfSksXG4gICAgICAuLi4ocmVjb3JkZWRLZXkgIT09IHVuZGVmaW5lZCAmJiB7IGlkZW1wb3RlbmN5S2V5OiByZWNvcmRlZEtleSB9KSxcbiAgICAgIC4uLihlZmZlY3QgIT09IHVuZGVmaW5lZCAmJiB7IGVmZmVjdCB9KSxcbiAgICB9KTtcbiAgICB0YWxseS5hZGQocmVjb3JkKTtcbiAgICBpZiAocmVjb3JkLmVmZmVjdCA9PT0gJ3Vua25vd24nKSB1bmtub3duU29GYXIgPSB0cnVlO1xuICAgIGlmIChyZWNvcmQubmV4dCAhPT0gJ3JldHJ5Jykgb3B0aW9ucy5vbkVuZD8uKHRhbGx5LnN1bW1hcnkobGFzdE9mKHJlY29yZCwgdW5rbm93blNvRmFyKSkpO1xuICAgIG9wdGlvbnMub25BdHRlbXB0Py4ocmVjb3JkLCBzZXJ2ZWQpO1xuXG4gICAgaWYgKHJlY29yZC5uZXh0ID09PSAnZG9uZScpIHJldHVybiB2YWx1ZSBhcyBUO1xuICAgIGlmIChyZWNvcmQubmV4dCA9PT0gJ3N0b3AnKSB0aHJvdyBzdG9wRXJyb3Iob3B0aW9ucy5lZmZlY3QsIHJlY29yZCwgZmFpbHVyZSwgdW5rbm93blNvRmFyKTtcblxuICAgIG9wdGlvbnMub25SZXRyeT8uKGF0dGVtcHQsIG9mLCBkZWxheU1zID8/IDAsIHNlcnZlZCBhcyBTdHJ1Y3R1cmVkRXJyb3JJbmZvKTtcbiAgICBpZiAoZGVsYXlNcyAhPT0gdW5kZWZpbmVkICYmIGRlbGF5TXMgPiAwKSBhd2FpdCBzbGVlcChkZWxheU1zLCBvcHRpb25zLnNpZ25hbCk7XG4gICAgLy8gTm8gYXR0ZW1wdCBmb2xsb3dzIGEgY3V0IHdhaXQsIHNvIG5vbmUgaXMgcmVjb3JkZWQ6IHRoZSBzdW1tYXJ5IHNheXMgaG93IHRoZSBzZXJpZXMgZW5kZWQuIE5vIGF0dGVtcHRcbiAgICAvLyBTVEFSVFMgYXQgb3IgcGFzdCB0aGUgZGVhZGxpbmUgZWl0aGVyIOKAlCBydWxlIDYgZGVjaWRlZCB3aXRoIHRoZSBjbG9jaywgYW5kIHRoZSBjbG9jayBtYXkgaGF2ZSBtb3ZlZCBvbi5cbiAgICBjb25zdCBjdXQgPSBpc0NhbmNlbGxlZChvcHRpb25zLnNpZ25hbClcbiAgICAgID8gJ2Fib3J0ZWQnXG4gICAgICA6IG9wdGlvbnMuc2lnbmFsPy5hYm9ydGVkIHx8IChkZWFkbGluZSAhPT0gdW5kZWZpbmVkICYmIG5vdygpID49IGRlYWRsaW5lKVxuICAgICAgPyAnbm8tdGltZS1sZWZ0J1xuICAgICAgOiB1bmRlZmluZWQ7XG4gICAgaWYgKGN1dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBvcHRpb25zLm9uRW5kPy4odGFsbHkuc3VtbWFyeSh7IC4uLmxhc3RPZihyZWNvcmQsIHVua25vd25Tb0ZhciksIG5leHQ6ICdzdG9wJywgcmVhc29uOiBjdXQgfSkpO1xuICAgICAgdGhyb3cgc3RvcEVycm9yKG9wdGlvbnMuZWZmZWN0LCByZWNvcmQsIGZhaWx1cmUsIHVua25vd25Tb0Zhcik7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogV2hhdCBhIHN0b3BwZWQgc2VyaWVzIHRocm93czogdGhlIGxhc3QgYXR0ZW1wdCdzIG93biBlcnJvciDigJQgb3IsIG9uIGEgdG91Y2hpbmcgdGFyZ2V0IHdoZXJlIEFOWSBhdHRlbXB0IGxlZnQgdGhlXG4gKiBlZmZlY3QgdW5rbm93biwgYFVua25vd25FZmZlY3RFcnJvcmAgd2l0aCB0aGUgbGFzdCBhdHRlbXB0J3MgZXJyb3IgYXMgaXRzIGNhdXNlLiBBbiBlYXJsaWVyIHRpbWVvdXQgbWF5IGhhdmVcbiAqIGFwcGxpZWQgdGhlIGVmZmVjdDsgYSBsYXRlciBhdHRlbXB0IHRoYXQgc2F5cyBcIm5vdGhpbmcgd2FzIHNlbnRcIiBzcGVha3MgZm9yIGl0c2VsZiBvbmx5LCBzbyBpdCBjYW5ub3QgdHVybiB0aGVcbiAqIHNlcmllcyBpbnRvIGEgcGxhaW4gZmFpbHVyZS4gQSBwYXVzZSBpcyBuZXZlciBjb252ZXJ0ZWQ6IGl0IGlzIGNvbnRyb2wgZmxvdy5cbiAqL1xuZnVuY3Rpb24gc3RvcEVycm9yKFxuICBlZmZlY3Q6IEVmZmVjdFRhcmdldCB8IHVuZGVmaW5lZCxcbiAgcmVjb3JkOiBBdHRlbXB0UmVjb3JkLFxuICBmYWlsdXJlOiBGYWlsdXJlIHwgdW5kZWZpbmVkLFxuICB1bmtub3duU29GYXI6IGJvb2xlYW4sXG4pOiB1bmtub3duIHtcbiAgaWYgKGVmZmVjdCA9PT0gdW5kZWZpbmVkIHx8ICF1bmtub3duU29GYXIgfHwgcmVjb3JkLm91dGNvbWUgPT09ICdwYXVzZWQnKSByZXR1cm4gZmFpbHVyZT8uZXJyb3I7XG4gIHJldHVybiB1bmtub3duRWZmZWN0RXJyb3IoZWZmZWN0LCByZWNvcmQsIGZhaWx1cmU/LmVycm9yKTtcbn1cblxuLyoqXG4gKiBPbmUgYXR0ZW1wdCBpbiBmbGlnaHQ6IGl0cyBjYXAsIGl0cyBzaWduYWwgKHRoZSBydW4ncywgY29tcG9zZWQgd2l0aCBpdHMgb3duIHRpbWVyKSwgYW5kIHRoZSBmZW5jZS4gSXRzIG93blxuICogdGltZXIgaXMgYXJtZWQgd2hlbiB0aGUgcG9saWN5J3MgY2FwIGlzIFNIT1JURVIgdGhhbiB0aGUgdGltZSBsZWZ0OyBhdCB0aGUgZGVhZGxpbmUgdGhlIHJ1bidzIG93biBzaWduYWwgYWJvcnRzLFxuICogd2l0aCB0aGUgZGVhZGxpbmUncyByZWFzb24gKHNvIGEgcnVuIHJlamVjdHMgd2l0aCB0aGUgcmVhc29uIGl0IGFsd2F5cyBkaWQpLiBFdmVyeXRoaW5nIGl0IGFybXMgaXMgcmVsZWFzZWRcbiAqIHdoZW4gdGhlIGF0dGVtcHQgZW5kcy5cbiAqL1xuY2xhc3MgTGl2ZUF0dGVtcHQge1xuICByZWFkb25seSBjb250ZXh0OiBBdHRlbXB0Q29udGV4dDtcbiAgLyoqIFRoZSBjYXAgdGhpcyBhdHRlbXB0IHJ1bnMgdW5kZXIg4oCUIGBtaW4odGltZW91dE1zLCB0aW1lIGxlZnQpYCwgbmV2ZXIgbmVnYXRpdmU7IGFic2VudCB3aGVuIHVuY2FwcGVkLiAqL1xuICByZWFkb25seSBjYXBNczogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICAvKiogVGhlIHJlYXNvbiB0aGUgYXR0ZW1wdCdzIE9XTiB0aW1lciBhYm9ydGVkIHdpdGgg4oCUIHNldCBvbmx5IGlmIGl0IGZpcmVkLiAqL1xuICB0aW1lb3V0UmVhc29uOiBBdHRlbXB0VGltZW91dEVycm9yIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIHJlYWRvbmx5IGNhbmNlbFRpbWVyOiAoKCkgPT4gdm9pZCkgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgY29tcG9zZWQ6IHsgcmVhZG9ubHkgc2lnbmFsOiBBYm9ydFNpZ25hbDsgZGlzcG9zZSgpOiB2b2lkIH07XG4gIHByaXZhdGUgYWJhbmRvbmVkID0gZmFsc2U7XG4gIC8qKiBUaGUgYXR0ZW1wdCBpcyBvdmVyLCBob3dldmVyIGl0IGVuZGVkIOKAlCBhbiBgb2JzZXJ2ZWRgIHJlcG9ydCBhZnRlciB0aGlzIGlzIHRoZSBvd25lcidzIHRvIHJlZnVzZS4gKi9cbiAgcHJpdmF0ZSBlbmRlZCA9IGZhbHNlO1xuICBwcml2YXRlIHJlYWRvbmx5IG9uQWJvcnQgPSAoKSA9PiB0aGlzLmFiYW5kb24oKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IG9wdGlvbnM6IEF0dGVtcHRSdW5PcHRpb25zLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgYXR0ZW1wdDogbnVtYmVyLFxuICAgIG9mOiBudW1iZXIsXG4gICAgc3RhcnRlZEF0OiBudW1iZXIsXG4gICAgZGVhZGxpbmU6IG51bWJlciB8IHVuZGVmaW5lZCxcbiAgICBvd25DYXA6IG51bWJlciB8IHVuZGVmaW5lZCxcbiAgICBub3c6ICgpID0+IG51bWJlcixcbiAgKSB7XG4gICAgY29uc3QgbGVmdCA9IGRlYWRsaW5lID09PSB1bmRlZmluZWQgPyBJbmZpbml0eSA6IE1hdGgubWF4KDAsIGRlYWRsaW5lIC0gc3RhcnRlZEF0KTtcbiAgICBjb25zdCBjYXAgPSBNYXRoLm1pbihvd25DYXAgPz8gSW5maW5pdHksIGxlZnQpO1xuICAgIHRoaXMuY2FwTXMgPSBOdW1iZXIuaXNGaW5pdGUoY2FwKSA/IGNhcCA6IHVuZGVmaW5lZDtcbiAgICAvLyBJdHMgb3duIHRpbWVyIHdoZW4gaXRzIG93biBjYXAgaXMgdGhlIHNob3J0ZXIsIG9yIHdoZW4gbm8gcnVuIHNpZ25hbCB3aWxsIGFib3J0IGF0IHRoZSBkZWFkbGluZSAoYSBjYWxsZXJcbiAgICAvLyB3aXRoIGEgZGVhZGxpbmUgYW5kIG5vIHNpZ25hbCkuIE90aGVyd2lzZSB0aGUgcnVuJ3Mgc2lnbmFsIGVuZHMgaXQgYXQgdGhlIGRlYWRsaW5lLCB3aXRoIHRoZSBkZWFkbGluZSdzIHJlYXNvbi5cbiAgICBjb25zdCBvd25UaW1lciA9IHRoaXMuY2FwTXMgIT09IHVuZGVmaW5lZCAmJiAoKG93bkNhcCAhPT0gdW5kZWZpbmVkICYmIG93bkNhcCA8IGxlZnQpIHx8ICFvcHRpb25zLnNpZ25hbCk7XG4gICAgY29uc3Qgb3duID0gb3duVGltZXIgPyBuZXcgQWJvcnRDb250cm9sbGVyKCkgOiB1bmRlZmluZWQ7XG4gICAgaWYgKG93bikge1xuICAgICAgY29uc3QgY2FwTXMgPSB0aGlzLmNhcE1zIGFzIG51bWJlcjtcbiAgICAgIHRoaXMuY2FuY2VsVGltZXIgPSBzZXRMb25nVGltZW91dCgoKSA9PiB7XG4gICAgICAgIC8vIEEgdGltZSBsaW1pdCwgYnJhbmRlZCBsaWtlIHRoZSBydW4ncyBkZWFkbGluZTogYSBjYWxsIG1hZGUgaW5zaWRlIHRoaXMgYXR0ZW1wdCB0aGF0IGl0IGN1dHMgdGltZWQgb3V0LlxuICAgICAgICB0aGlzLnRpbWVvdXRSZWFzb24gPSBtYXJrVGltZUxpbWl0KG5ldyBBdHRlbXB0VGltZW91dEVycm9yKGF0dGVtcHQsIGNhcE1zKSk7XG4gICAgICAgIG93bi5hYm9ydCh0aGlzLnRpbWVvdXRSZWFzb24pO1xuICAgICAgfSwgY2FwTXMpO1xuICAgIH1cbiAgICB0aGlzLmNvbXBvc2VkID0gYW55U2lnbmFsKFtvcHRpb25zLnNpZ25hbCwgb3duPy5zaWduYWxdKTtcbiAgICAvLyBSZWdpc3RlcmVkIEJFRk9SRSB0aGUgZnVuY3Rpb24gcnVucywgc28gdGhlIGZlbmNlIGNsb3NlcyBiZWZvcmUgYW55IGxpc3RlbmVyIHRoZSBmdW5jdGlvbiBhZGRzLiBBIHNpZ25hbFxuICAgIC8vIEFMUkVBRFkgYWJvcnRlZCAoYSBkZWNpZGVyIGVudGVyZWQgYWZ0ZXIgYSBjYW5jZWwg4oCUIG5vIGFib3J0IGNoZWNrIHByZWNlZGVzIGl0KSBkb2VzIG5vdCBmZW5jZSB0aGUgYXR0ZW1wdFxuICAgIC8vIGJlZm9yZSBpdCBydW5zOiBpdCBydW5zIGFzIGl0IGRpZCBiZWZvcmUgdGhlIGZlbmNlIGV4aXN0ZWQsIGFuZCBpcyBmZW5jZWQgd2hlbiBpdCBlbmRzIHdpdGhvdXQgYW4gYW5zd2VyLlxuICAgIHRoaXMuY29tcG9zZWQuc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgdGhpcy5vbkFib3J0LCB7IG9uY2U6IHRydWUgfSk7XG4gICAgY29uc3Qgc2lnbmFsID0gdGhpcy5jb21wb3NlZC5zaWduYWw7XG4gICAgY29uc3QgY2FwTXMgPSB0aGlzLmNhcE1zO1xuICAgIHRoaXMuY29udGV4dCA9IE9iamVjdC5mcmVlemUoe1xuICAgICAgc2VyaWVzOiBvcHRpb25zLnNlcmllcyxcbiAgICAgIGF0dGVtcHQsXG4gICAgICBvZixcbiAgICAgIHNpZ25hbCxcbiAgICAgIC4uLihkZWFkbGluZSAhPT0gdW5kZWZpbmVkICYmIHsgZGVhZGxpbmUgfSksXG4gICAgICAuLi4oY2FwTXMgIT09IHVuZGVmaW5lZCAmJiB7IHRpbWVvdXRNczogY2FwTXMgfSksXG4gICAgICAuLi4ob3B0aW9ucy5lZmZlY3QgIT09IHVuZGVmaW5lZCAmJiB7IHN5c3RlbTogb3B0aW9ucy5lZmZlY3Quc3lzdGVtIH0pLFxuICAgICAgLi4uKG9wdGlvbnMuZWZmZWN0Py5pZGVtcG90ZW5jeUtleSAhPT0gdW5kZWZpbmVkICYmIHsgaWRlbXBvdGVuY3lLZXk6IG9wdGlvbnMuZWZmZWN0LmlkZW1wb3RlbmN5S2V5IH0pLFxuICAgICAgdGltZUxlZnRNczogKCkgPT4gKGRlYWRsaW5lID09PSB1bmRlZmluZWQgPyBJbmZpbml0eSA6IGRlYWRsaW5lIC0gbm93KCkpLFxuICAgICAgb2JzZXJ2ZWQ6IChyZXBvcnQ6IE9ic2VydmVkQXR0ZW1wdCkgPT4ge1xuICAgICAgICBpZiAoIW9wdGlvbnMub2JzZXJ2ZSkge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ29ic2VydmVkKCk6IHJlcG9ydCBhbiBvdXRzaWRlIGF0dGVtcHQgdGhyb3VnaCBgc2NvcGUuJGF0dGVtcHQoKS5vYnNlcnZlZCguLi4pYCcpO1xuICAgICAgICB9XG4gICAgICAgIG9wdGlvbnMub2JzZXJ2ZShyZXBvcnQsIHsgYXR0ZW1wdCwgZW5kZWQ6IHRoaXMuZW5kZWQgfSk7XG4gICAgICB9LFxuICAgIH0pO1xuICAgIGlmIChjYXBNcyAhPT0gdW5kZWZpbmVkKSBBVFRFTVBUX0VORFMuc2V0KHRoaXMuY29udGV4dCwgc3RhcnRlZEF0ICsgY2FwTXMpO1xuICB9XG5cbiAgLyoqIGB2YWx1ZWAsIG9yIHRoZSBhdHRlbXB0IHNpZ25hbCdzIHJlYXNvbiB0aGUgbW9tZW50IGl0IGFib3J0cyBmaXJzdCDigJQgdGhlIGVuZ2luZSBzdG9wcyB3YWl0aW5nIGF0IHRoZSBjYXAuICovXG4gIHJhY2U8VD4odmFsdWU6IFByb21pc2U8VD4gfCBUKTogUHJvbWlzZTxUPiB8IFQge1xuICAgIGlmICghKHZhbHVlIGluc3RhbmNlb2YgUHJvbWlzZSkpIHJldHVybiB2YWx1ZTtcbiAgICBjb25zdCBzaWduYWwgPSB0aGlzLmNvbXBvc2VkLnNpZ25hbDtcbiAgICByZXR1cm4gbmV3IFByb21pc2U8VD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgY29uc3Qgb25BYm9ydCA9ICgpID0+IHJlamVjdChzaWduYWwucmVhc29uKTtcbiAgICAgIHZhbHVlLnRoZW4oXG4gICAgICAgICh2KSA9PiB7XG4gICAgICAgICAgc2lnbmFsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Fib3J0Jywgb25BYm9ydCk7XG4gICAgICAgICAgcmVzb2x2ZSh2KTtcbiAgICAgICAgfSxcbiAgICAgICAgKGU6IHVua25vd24pID0+IHtcbiAgICAgICAgICBzaWduYWwucmVtb3ZlRXZlbnRMaXN0ZW5lcignYWJvcnQnLCBvbkFib3J0KTtcbiAgICAgICAgICByZWplY3QoZSk7XG4gICAgICAgIH0sXG4gICAgICApO1xuICAgICAgLy8gQWxyZWFkeSBhYm9ydGVkICh0aGUgZnVuY3Rpb24gYWJvcnRlZCBpdCBhcyBpdCByYW4pOiBhIHZhbHVlIHRoYXQgYWxyZWFkeSBzZXR0bGVkIHN0aWxsIHdpbnMg4oCUIGl0c1xuICAgICAgLy8gcmVhY3Rpb24gd2FzIHF1ZXVlZCBhYm92ZSwgZmlyc3Qg4oCUIGFuZCBhIHBlbmRpbmcgb25lIGlzIGN1dCBvbiB0aGUgbmV4dCBtaWNyb3Rhc2suXG4gICAgICBpZiAoc2lnbmFsLmFib3J0ZWQpIHF1ZXVlTWljcm90YXNrKG9uQWJvcnQpO1xuICAgICAgZWxzZSBzaWduYWwuYWRkRXZlbnRMaXN0ZW5lcignYWJvcnQnLCBvbkFib3J0LCB7IG9uY2U6IHRydWUgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKiogVGhlIGF0dGVtcHQgaXMgb3ZlcjogcmVsZWFzZSB0aGUgdGltZXIgYW5kIHRoZSBsaXN0ZW5lcnM7IGZlbmNlIGl0IGlmIGl0IGVuZGVkIHdpdGhvdXQgYW4gYW5zd2VyLiAqL1xuICBlbmQob3V0Y29tZTogQXR0ZW1wdE91dGNvbWUpOiB2b2lkIHtcbiAgICB0aGlzLmVuZGVkID0gdHJ1ZTtcbiAgICB0aGlzLmNhbmNlbFRpbWVyPy4oKTtcbiAgICB0aGlzLmNvbXBvc2VkLnNpZ25hbC5yZW1vdmVFdmVudExpc3RlbmVyKCdhYm9ydCcsIHRoaXMub25BYm9ydCk7XG4gICAgdGhpcy5jb21wb3NlZC5kaXNwb3NlKCk7XG4gICAgaWYgKG91dGNvbWUgIT09ICdvaycgJiYgb3V0Y29tZSAhPT0gJ3BhdXNlZCcpIHRoaXMuYWJhbmRvbigpO1xuICB9XG5cbiAgLyoqIEZlbmNlIGFuIGF0dGVtcHQgdGhhdCBzdGFydGVkIHVuZGVyIGFuIGFscmVhZHktYWJvcnRlZCBzaWduYWwsIG9uY2UgaXRzIHN5bmNocm9ub3VzIHBhcnQgaGFzIHJ1bi4gKi9cbiAgYWJhbmRvblN0YXJ0ZWQoKTogdm9pZCB7XG4gICAgdGhpcy5hYmFuZG9uKCk7XG4gIH1cblxuICBwcml2YXRlIGFiYW5kb24oKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuYWJhbmRvbmVkKSByZXR1cm47XG4gICAgdGhpcy5hYmFuZG9uZWQgPSB0cnVlO1xuICAgIHRoaXMub3B0aW9ucy5vbkFiYW5kb24/Lih0aGlzLmF0dGVtcHQpO1xuICB9XG59XG5cbi8qKiBUaGUgc2lnbmFsIGFib3J0ZWQgYXQgYSB0aW1lIGxpbWl0IOKAlCB0aGUgcnVuJ3MgZGVhZGxpbmUsIG9yIGEgY2FsbCdzIGF0dGVtcHQgY2FwIOKAlCBub3QgYnkgYSBjYW5jZWxsYXRpb24uICovXG5mdW5jdGlvbiB0aW1lZE91dChzaWduYWw6IEFib3J0U2lnbmFsIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gIHJldHVybiBzaWduYWw/LmFib3J0ZWQgPT09IHRydWUgJiYgaXNEZWFkbGluZVJlYXNvbihzaWduYWwucmVhc29uKTtcbn1cblxuLyoqXG4gKiBIb3cgdGhlIGF0dGVtcHQgaXRzZWxmIGVuZGVkLiBBIHRocm93biB2YWx1ZSBpcyB0aGUgYXR0ZW1wdCdzIG93biBmYWlsdXJlIHVubGVzcyBpdCBJUyB3aGF0IGEgc2lnbmFsIGFib3J0ZWRcbiAqIHdpdGggKFN0YWdlUnVubmVyJ3MgcmFjZSByZWplY3RzIHdpdGggaXQ7IGEgc3RhZ2UgbWF5IHJldGhyb3cgaXQpOiBpdHMgb3duIGNhcCdzIGBBdHRlbXB0VGltZW91dEVycm9yYCBvciB0aGVcbiAqIHJ1bidzIGRlYWRsaW5lIOKGkiBgJ3RpbWVvdXQnYDsgdGhlIHJ1bidzIGNhbmNlbGxhdGlvbiDihpIgYCdhYm9ydGVkJ2AuXG4gKi9cbmZ1bmN0aW9uIG91dGNvbWVPZihcbiAgZmFpbHVyZTogRmFpbHVyZSB8IHVuZGVmaW5lZCxcbiAgc2lnbmFsOiBBYm9ydFNpZ25hbCB8IHVuZGVmaW5lZCxcbiAgdGltZW91dFJlYXNvbjogQXR0ZW1wdFRpbWVvdXRFcnJvciB8IHVuZGVmaW5lZCxcbik6IEF0dGVtcHRPdXRjb21lIHtcbiAgaWYgKCFmYWlsdXJlKSByZXR1cm4gJ29rJztcbiAgLy8gQW4gYGludGVycnVwdCgpYCB0aHJvd24gaW5zaWRlIGEgY2FsbCBpcyBjb252ZXJ0ZWQgdG8gYSBwYXVzZSBhdCB0aGUgc3RhZ2UgYm91bmRhcnksIHBhc3QgdGhpcyBydW5uZXIuXG4gIGlmIChpc1BhdXNlU2lnbmFsKGZhaWx1cmUuZXJyb3IpIHx8IGlzSW50ZXJydXB0U2lnbmFsKGZhaWx1cmUuZXJyb3IpKSByZXR1cm4gJ3BhdXNlZCc7XG4gIC8vIEl0cyBvd24gY2FwIHJhbiBvdXQg4oCUIHRoZSBhdHRlbXB0J3MgdGltZXIgaXMgdGhlIG9uZSB0aGF0IGZpcmVkLCBhbmQgdGhlIGF0dGVtcHQgdGhyZXcgd2hhdCBpdCBhYm9ydGVkIHdpdGguXG4gIGlmICh0aW1lb3V0UmVhc29uICE9PSB1bmRlZmluZWQgJiYgZmFpbHVyZS5lcnJvciA9PT0gdGltZW91dFJlYXNvbikgcmV0dXJuICd0aW1lb3V0JztcbiAgaWYgKHNpZ25hbD8uYWJvcnRlZCAhPT0gdHJ1ZSB8fCBmYWlsdXJlLmVycm9yICE9PSBzaWduYWwucmVhc29uKSByZXR1cm4gJ2ZhaWxlZCc7XG4gIC8vIFRoZSBydW4ncyBzaWduYWwgZW5kZWQgaXQ6IGF0IHRoZSBkZWFkbGluZSB0aGUgYXR0ZW1wdCByYW4gb3V0IG9mIHRpbWUgKGxhdyA0KTsgb3RoZXJ3aXNlIGl0IHdhcyBjYW5jZWxsZWQuXG4gIHJldHVybiBpc0RlYWRsaW5lUmVhc29uKHNpZ25hbC5yZWFzb24pID8gJ3RpbWVvdXQnIDogJ2Fib3J0ZWQnO1xufVxuXG4vKipcbiAqIE9uZSBhdHRlbXB0J3MgZGVjaXNpb24gaW5wdXRzLCBlYWNoIHJlYWQgb25seSB3aGVuIGEgcnVsZSByZWFjaGVzIGl0IChgZGVjaWRlQXR0ZW1wdGAncyByZWFkZXIpOiB0aGUgdXNlcidzXG4gKiBgcmV0cnlPbmAgYW5kIGBiYWNrb2ZmTXNgIHJ1biBhdCBtb3N0IG9uY2UgZWFjaCwgYW5kIG9ubHkgd2hlbiB0aGUgOS4xNSBsb29wIHdvdWxkIGhhdmUgcnVuIHRoZW0uXG4gKi9cbmNsYXNzIEF0dGVtcHRJbnB1dFJlYWRlciB7XG4gIC8qKiBUaGUgZmFpbHVyZSBhIGNhdGVnb3J5IGFuZCBhIHNlcnZlZCBlcnJvciBhcmUgcmVhZCBmcm9tIOKAlCBub25lIGZvciBgJ29rJ2AgYW5kIGAncGF1c2VkJ2AuICovXG4gIHJlYWRvbmx5IGZhaWxlZDogRmFpbHVyZSB8IHVuZGVmaW5lZDtcbiAgLyoqIGB0cnVlYCBvbmNlIGByZXRyeU9uYCB0aHJldyAoaXRzIHZlcmRpY3QgaXMgdGhlbiBgZmFsc2VgKS4gKi9cbiAgcmV0cnlPblRocmV3ID0gZmFsc2U7XG4gIHByaXZhdGUgcmV0cnlPblZlcmRpY3Q6IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgd2FpdDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIGZhaWx1cmVDYXRlZ29yeTogQXR0ZW1wdENhdGVnb3J5IHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIGNhdGVnb3J5UmVhZCA9IGZhbHNlO1xuXG4gIHByaXZhdGUgbGVmdDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgcG9saWN5OiBSZXRyeVBvbGljeSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IG9wdGlvbnM6IEF0dGVtcHRSdW5PcHRpb25zLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgYXR0ZW1wdDogbnVtYmVyLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgb2Y6IG51bWJlcixcbiAgICByZWFkb25seSBvdXRjb21lOiBBdHRlbXB0T3V0Y29tZSxcbiAgICBmYWlsdXJlOiBGYWlsdXJlIHwgdW5kZWZpbmVkLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgZGVhZGxpbmU6IG51bWJlciB8IHVuZGVmaW5lZCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IG5vdzogKCkgPT4gbnVtYmVyLFxuICApIHtcbiAgICB0aGlzLmZhaWxlZCA9IGZhaWx1cmUgJiYgb3V0Y29tZSAhPT0gJ3BhdXNlZCcgPyBmYWlsdXJlIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqIE9uZSBpbnB1dCBieSBpdHMgYEF0dGVtcHRJbnB1dHNgIGtleS4gKi9cbiAgcmVhZG9ubHkgcmVhZCA9IChrZXk6IHN0cmluZyk6IHVua25vd24gPT4ge1xuICAgIHN3aXRjaCAoa2V5KSB7XG4gICAgICBjYXNlICdvdXRjb21lJzpcbiAgICAgICAgcmV0dXJuIHRoaXMub3V0Y29tZTtcbiAgICAgIGNhc2UgJ2NhdGVnb3J5JzpcbiAgICAgICAgcmV0dXJuIHRoaXMuY2F0ZWdvcnkoKTtcbiAgICAgIGNhc2UgJ2Fib3J0ZWQnOlxuICAgICAgICAvLyBMaXZlOiBhIGRlY2lzaW9uIHRha2VuIGFnYWluIGFmdGVyIGByZXRyeU9uYCBzZWVzIGFuIGFib3J0IHJhaXNlZCBpbnNpZGUgaXQuIFRoZSBkZWFkbGluZSBpcyBub3QgYVxuICAgICAgICAvLyBjYW5jZWxsYXRpb24g4oCUIHJ1bGUgNiBvd25zIGl0LlxuICAgICAgICByZXR1cm4gaXNDYW5jZWxsZWQodGhpcy5vcHRpb25zLnNpZ25hbCk7XG4gICAgICBjYXNlICdhdHRlbXB0JzpcbiAgICAgICAgcmV0dXJuIHRoaXMuYXR0ZW1wdDtcbiAgICAgIGNhc2UgJ29mJzpcbiAgICAgICAgcmV0dXJuIHRoaXMub2Y7XG4gICAgICBjYXNlICd0aW1lTGVmdE1zJzpcbiAgICAgICAgcmV0dXJuIHRoaXMudGltZUxlZnQoKTtcbiAgICAgIGNhc2UgJ3RpbWVMZWZ0QWZ0ZXJXYWl0TXMnOlxuICAgICAgICAvLyBXaXRob3V0IGEgZGVhZGxpbmUgdGhlIHRpbWUgbGVmdCBpcyB1bmJvdW5kZWQsIGJlZm9yZSBhbnkgd2FpdCBhbmQgYWZ0ZXIgaXQg4oCUIHNvIGRlY2lkaW5nIG5lZWRzIG5vXG4gICAgICAgIC8vIHdhaXQsIGFuZCBgYmFja29mZk1zYCBpcyBhc2tlZCBhZnRlciB0aGUgZGlzY2FyZCwgYXMgaW4gOS4xNS4gVW5kZXIgb25lLCB0aGUgd2FpdCdzIGxlbmd0aCBkZWNpZGVzLlxuICAgICAgICByZXR1cm4gdGhpcy51bmJvdW5kZWQoKSA/IEluZmluaXR5IDogdGhpcy50aW1lTGVmdCgpIC0gdGhpcy5kZWxheU1zKCk7XG4gICAgICBjYXNlICdkZWxheU1zJzpcbiAgICAgICAgcmV0dXJuIHRoaXMuZGVsYXlNcygpO1xuICAgICAgY2FzZSAncmV0cnlPbic6XG4gICAgICAgIHJldHVybiB0aGlzLnJldHJ5T24oKTtcbiAgICAgIGNhc2UgJ2tleVByZXNlbnQnOlxuICAgICAgICByZXR1cm4gdGhpcy5vcHRpb25zLmVmZmVjdD8uaWRlbXBvdGVuY3lLZXkgIT09IHVuZGVmaW5lZDtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICB9O1xuXG4gIC8qKiBUaGUgZmFpbHVyZSdzIGNhdGVnb3J5LCByZWFkIG9uY2Ug4oCUIGF0IHRoZSBmaXJzdCBydWxlIHRoYXQgYXNrcywgb3IgYWZ0ZXIgdGhlIGRlY2lzaW9uLiAqL1xuICBjYXRlZ29yeSgpOiBBdHRlbXB0Q2F0ZWdvcnkgfCB1bmRlZmluZWQge1xuICAgIGlmICghdGhpcy5jYXRlZ29yeVJlYWQpIHtcbiAgICAgIHRoaXMuY2F0ZWdvcnlSZWFkID0gdHJ1ZTtcbiAgICAgIHRoaXMuZmFpbHVyZUNhdGVnb3J5ID0gdGhpcy5mYWlsZWQgPyBlcnJvckNhdGVnb3J5KHRoaXMuZmFpbGVkLmVycm9yLCB0aGlzLm91dGNvbWUpIDogdW5kZWZpbmVkO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5mYWlsdXJlQ2F0ZWdvcnk7XG4gIH1cblxuICAvKiogVGhlIHBvbGljeSdzIHdhaXQgYWZ0ZXIgdGhpcyBhdHRlbXB0IChgcmVzb2x2ZUJhY2tvZmZNc2ApLCBhc2tlZCBvbmNlIOKAlCBjYXBwZWQgYXQgaXRzIGBtYXhCYWNrb2ZmTXNgLiAqL1xuICBkZWxheU1zKCk6IG51bWJlciB7XG4gICAgcmV0dXJuICh0aGlzLndhaXQgPz89IGNhcHBlZFdhaXRNcyhcbiAgICAgIHJlc29sdmVCYWNrb2ZmTXModGhpcy5wb2xpY3kuYmFja29mZk1zLCB0aGlzLmF0dGVtcHQsIHRoaXMuZmFpbGVkPy5lcnJvciksXG4gICAgICB0aGlzLnBvbGljeS5tYXhCYWNrb2ZmTXMsXG4gICAgKSk7XG4gIH1cblxuICAvKiogVGhlIHdhaXQsIGlmIHRoZSBkZWNpc2lvbiBhbHJlYWR5IGFza2VkIGZvciBpdCAocnVsZSA2IHVuZGVyIGEgZGVhZGxpbmUpOyBuZXZlciBhc2tzIGBiYWNrb2ZmTXNgIGl0c2VsZi4gKi9cbiAgZGVsYXlJZkFza2VkKCk6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMud2FpdDtcbiAgfVxuXG4gIC8qKiBNaWxsaXNlY29uZHMgYmVmb3JlIHRoZSBkZWFkbGluZSBhdCB0aGUgZGVjaXNpb24sIHJlYWQgb25jZSAoYEluZmluaXR5YCB3aXRob3V0IG9uZSkuICovXG4gIHRpbWVMZWZ0KCk6IG51bWJlciB7XG4gICAgaWYgKHRoaXMudW5ib3VuZGVkKCkpIHJldHVybiBJbmZpbml0eTtcbiAgICBpZiAodGhpcy5sZWZ0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IGNsb2NrID0gdGhpcy5kZWFkbGluZSA9PT0gdW5kZWZpbmVkID8gSW5maW5pdHkgOiB0aGlzLmRlYWRsaW5lIC0gdGhpcy5ub3coKTtcbiAgICAgIC8vIEEgdGltZSBsaW1pdCBhbHJlYWR5IHJlYWNoZWQg4oCUIHRoZSBzaWduYWwgYWJvcnRlZCBhdCB0aGUgZGVhZGxpbmUgKG9yLCBmb3IgYSBjYWxsLCBhdCBpdHMgYXR0ZW1wdCdzIGNhcCkg4oCUXG4gICAgICAvLyBsZWF2ZXMgbm8gdGltZSwgd2hhdGV2ZXIgdGhlIGNsb2NrIHNheXM6IGEgaG9zdCB0aW1lciBtYXkgZmlyZSBhIG1pbGxpc2Vjb25kIGJlZm9yZSB0aGUgY2xvY2sgZ2V0cyB0aGVyZS5cbiAgICAgIHRoaXMubGVmdCA9IHRpbWVkT3V0KHRoaXMub3B0aW9ucy5zaWduYWwpID8gTWF0aC5taW4oY2xvY2ssIDApIDogY2xvY2s7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmxlZnQ7XG4gIH1cblxuICAvKiogTm8gZGVhZGxpbmUgYW5kIG5vIHRpbWUgbGltaXQgcmVhY2hlZDogdGhlIHRpbWUgbGVmdCBpcyBgSW5maW5pdHlgLCBhbmQgbm8gd2FpdCBuZWVkIGJlIGFza2VkIGZvci4gKi9cbiAgcHJpdmF0ZSB1bmJvdW5kZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZGVhZGxpbmUgPT09IHVuZGVmaW5lZCAmJiAhdGltZWRPdXQodGhpcy5vcHRpb25zLnNpZ25hbCk7XG4gIH1cblxuICAvKiogVGhlIGByZXRyeU9uYCBnYXRlLCBhc2tlZCBvbmNlLiBBIHRocm93aW5nIHByZWRpY2F0ZSBpcyBcImRvIG5vdCByZXRyeVwiIOKAlCBhIGJyb2tlbiBvbmUgbmV2ZXIgbG9vcHMuICovXG4gIHByaXZhdGUgcmV0cnlPbigpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5yZXRyeU9uVmVyZGljdCA9PT0gdW5kZWZpbmVkKSB0aGlzLnJldHJ5T25WZXJkaWN0ID0gdGhpcy5hc2tSZXRyeU9uKCk7XG4gICAgcmV0dXJuIHRoaXMucmV0cnlPblZlcmRpY3Q7XG4gIH1cblxuICBwcml2YXRlIGFza1JldHJ5T24oKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLnBvbGljeS5yZXRyeU9uKSByZXR1cm4gdHJ1ZTtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHRoaXMucG9saWN5LnJldHJ5T24odGhpcy5mYWlsZWQ/LmVycm9yKSA9PT0gdHJ1ZTtcbiAgICB9IGNhdGNoICh0aHJvd24pIHtcbiAgICAgIHRoaXMucmV0cnlPblRocmV3ID0gdHJ1ZTtcbiAgICAgIHRoaXMub3B0aW9ucy5vblJldHJ5T25UaHJldz8uKHRocm93bik7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogUmVzb2x2ZSBhIHBvbGljeSdzIGBiYWNrb2ZmTXNgIGZvciB0aGUgYXR0ZW1wdCB0aGF0IGp1c3QgZmFpbGVkICgxLWJhc2VkKSBhbmQgaXRzIGVycm9yLiBBbnl0aGluZyB0aGF0IGlzIG5vdCBhIGZpbml0ZSxcbiAqIHBvc2l0aXZlIG51bWJlciDigJQgYSBtaXNzaW5nIGRpYWwsIGEgbmVnYXRpdmUgdmFsdWUsIGEgYE5hTmAgZnJvbSBhIGNvbnN1bWVyJ3MgYXJpdGhtZXRpYywgb3IgYSB0aHJvd2luZ1xuICogZnVuY3Rpb24g4oCUIGJlY29tZXMgYDBgLCBpLmUuIHJldHJ5IGltbWVkaWF0ZWx5LiBBIGJhY2tvZmYgZGlhbCBtdXN0IG5ldmVyIGJlIGFibGUgdG8gY3Jhc2ggYSBydW4gb3IgcGFyayBpdFxuICogZm9yZXZlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVCYWNrb2ZmTXMoYmFja29mZk1zOiBSZXRyeVBvbGljeVsnYmFja29mZk1zJ10sIGF0dGVtcHQ6IG51bWJlciwgZXJyb3I/OiB1bmtub3duKTogbnVtYmVyIHtcbiAgaWYgKGJhY2tvZmZNcyA9PT0gdW5kZWZpbmVkKSByZXR1cm4gMDtcbiAgbGV0IHZhbHVlOiB1bmtub3duO1xuICBpZiAodHlwZW9mIGJhY2tvZmZNcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHRyeSB7XG4gICAgICB2YWx1ZSA9IGJhY2tvZmZNcyhhdHRlbXB0LCBlcnJvcik7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdmFsdWUgPSBiYWNrb2ZmTXM7XG4gIH1cbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgJiYgTnVtYmVyLmlzRmluaXRlKHZhbHVlKSAmJiB2YWx1ZSA+IDAgPyB2YWx1ZSA6IDA7XG59XG5cbi8qKlxuICogQXdhaXQgYG1zYCwgY3V0IHNob3J0IGJ5IGFuIGFib3J0LiBSZXNvbHZlcyBlaXRoZXIgd2F5IOKAlCB0aGUgY2FsbGVyIHJlLWNoZWNrcyBgc2lnbmFsLmFib3J0ZWRgIGFuZCByZXRocm93c1xuICogdGhlIGF0dGVtcHQncyBvd24gZXJyb3IsIHNvIGEgY2FuY2VsbGVkIHJ1biBuZXZlciBzaXRzIG91dCBhIGxvbmcgYmFja29mZiBhbmQgbmV2ZXIgbG9zZXMgdGhlIGZhaWx1cmUgdGhhdFxuICogY2F1c2VkIGl0LiBUaGUgdGltZXIgYW5kIHRoZSBsaXN0ZW5lciBhcmUgYWx3YXlzIGNsZWFuZWQgdXAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzbGVlcChtczogbnVtYmVyLCBzaWduYWw/OiBBYm9ydFNpZ25hbCk6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoc2lnbmFsPy5hYm9ydGVkKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gIHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xuICAgIGNvbnN0IGRvbmUgPSAoKSA9PiB7XG4gICAgICBjYW5jZWwoKTtcbiAgICAgIHNpZ25hbD8ucmVtb3ZlRXZlbnRMaXN0ZW5lcignYWJvcnQnLCBkb25lKTtcbiAgICAgIHJlc29sdmUoKTtcbiAgICB9O1xuICAgIGNvbnN0IGNhbmNlbCA9IHNldExvbmdUaW1lb3V0KGRvbmUsIG1zKTtcbiAgICBzaWduYWw/LmFkZEV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgZG9uZSwgeyBvbmNlOiB0cnVlIH0pO1xuICB9KTtcbn1cblxuLyoqXG4gKiBIb3cgYSByZWNvcmQgZW5kZWQgaXRzIHNlcmllcywgYXMgdGhlIHN1bW1hcnkncyBgbGFzdGAgc2F5cyBpdC4gT24gYSB0b3VjaGluZyB0YXJnZXQgdGhlIGVmZmVjdCBpcyB0aGUgU0VSSUVTJ1xuICogKGB1bmtub3duU29GYXJgKTogdW5rbm93biBvbmNlIGFueSBhdHRlbXB0IGxlZnQgaXQgdW5rbm93biwgdW5sZXNzIHRoZSBzZXJpZXMgZW5kZWQgd2l0aCBhbiBhbnN3ZXIuXG4gKi9cbmZ1bmN0aW9uIGxhc3RPZihyZWNvcmQ6IEF0dGVtcHRSZWNvcmQsIHVua25vd25Tb0ZhciA9IGZhbHNlKTogQXR0ZW1wdFN1bW1hcnlbJ2xhc3QnXSB7XG4gIGNvbnN0IGVmZmVjdCA9IHJlY29yZC5lZmZlY3QgIT09IHVuZGVmaW5lZCAmJiB1bmtub3duU29GYXIgJiYgcmVjb3JkLm91dGNvbWUgIT09ICdvaycgPyAndW5rbm93bicgOiByZWNvcmQuZWZmZWN0O1xuICByZXR1cm4ge1xuICAgIG5leHQ6IHJlY29yZC5uZXh0IGFzIEF0dGVtcHRTdW1tYXJ5WydsYXN0J11bJ25leHQnXSxcbiAgICByZWFzb246IHJlY29yZC5yZWFzb24sXG4gICAgLi4uKHJlY29yZC5jYXRlZ29yeSAhPT0gdW5kZWZpbmVkICYmIHsgY2F0ZWdvcnk6IHJlY29yZC5jYXRlZ29yeSB9KSxcbiAgICAuLi4ocmVjb3JkLnJldHJ5T25UaHJldyAmJiB7IHJldHJ5T25UaHJldzogdHJ1ZSBhcyBjb25zdCB9KSxcbiAgICAuLi4oZWZmZWN0ICE9PSB1bmRlZmluZWQgJiYgeyBlZmZlY3QgfSksXG4gIH07XG59XG5cbi8qKiBQZXItb3V0Y29tZSBjb3VudHMgb2YgYSBzZXJpZXMsIGZvciBpdHMgc3VtbWFyeS4gKi9cbmNsYXNzIFNlcmllc1RhbGx5IHtcbiAgcHJpdmF0ZSByZWFkb25seSBjb3VudHMgPSB7IGNvdW50OiAwLCBvazogMCwgZmFpbGVkOiAwLCB0aW1lb3V0OiAwLCBhYm9ydGVkOiAwLCBwYXVzZWQ6IDAgfTtcblxuICBhZGQocmVjb3JkOiBBdHRlbXB0UmVjb3JkKTogdm9pZCB7XG4gICAgdGhpcy5jb3VudHMuY291bnQgKz0gMTtcbiAgICB0aGlzLmNvdW50c1tyZWNvcmQub3V0Y29tZV0gKz0gMTtcbiAgfVxuXG4gIHN1bW1hcnkobGFzdDogQXR0ZW1wdFN1bW1hcnlbJ2xhc3QnXSk6IEF0dGVtcHRTdW1tYXJ5IHtcbiAgICByZXR1cm4gZnJlZXplRGVlcDxBdHRlbXB0U3VtbWFyeT4oeyAuLi50aGlzLmNvdW50cywgbGFzdCB9KTtcbiAgfVxufVxuIl19
530
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVubmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9hdHRlbXB0L3J1bm5lci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBOERHOzs7QUFHSCx5REFBMEQ7QUFDMUQsd0RBQTBEO0FBQzFELGdEQUFrRDtBQUNsRCxpREFBMkM7QUFDM0MsK0NBQWdFO0FBQ2hFLCtDQUEyRztBQUMzRywrQ0FBMEQ7QUFFMUQsMkNBQThGO0FBQzlGLDJDQUFrRDtBQUNsRCwyQ0FBNkU7QUFDN0UsMkNBQXdEO0FBNkV4RCxzSEFBc0g7QUFDdEgsTUFBTSxZQUFZLEdBQUcsSUFBSSxPQUFPLEVBQTBCLENBQUM7QUFFM0Q7Ozs7R0FJRztBQUNILFNBQWdCLGFBQWEsQ0FBQyxPQUFtQztJQUMvRCxPQUFPLE9BQU8sS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUN2RSxDQUFDO0FBRkQsc0NBRUM7QUFPRDs7O0dBR0c7QUFDSSxLQUFLLFVBQVUsV0FBVyxDQUMvQixHQUFpRSxFQUNqRSxNQUFtQixFQUNuQixPQUEwQjtJQUUxQixNQUFNLEVBQUUsR0FBRyxJQUFBLDBCQUFjLEVBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQzNDLE1BQU0sS0FBSyxHQUFHLElBQUEsd0JBQVUsRUFBQyxFQUFFLFFBQVEsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQzNDLE1BQU0sR0FBRyxHQUFHLE9BQU8sQ0FBQyxHQUFHLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQztJQUNwQyxNQUFNLFFBQVEsR0FBRyxJQUFBLDBCQUFZLEVBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ2hELE1BQU0sTUFBTSxHQUFHLElB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QWEsRUFBRSxDQUFDO1FBQzNELEdBQUcsQ0FBQyxNQUFNLEtBQUssU0FBUyxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUM7S0FDeEMsQ0FBQztBQUNKLENBQUM7QUFFRCx1REFBdUQ7QUFDdkQsTUFBTSxXQUFXO0lBQ0UsTUFBTSxHQUFHLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUU1RixHQUFHLENBQUMsTUFBcUI7UUFDdkIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBRUQsT0FBTyxDQUFDLElBQTRCO1FBQ2xDLE9BQU8sSUFBQSxzQkFBVSxFQUFpQixFQUFFLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQzlELENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogYXR0ZW1wdC9ydW5uZXIudHMg4oCUIGBydW5BdHRlbXB0c2AsIFRIRSByZXRyeSBsb29wIChkZXNpZ24gwqczLjEsIGxhdyAxOiBvbmUgcnVubmVyLCBvbmUgcmVjb3JkKS5cbiAqXG4gKiBSdW5zIGEgZnVuY3Rpb24gdW5kZXIgYSBwb2xpY3kgYW5kIHJlY29yZHMgZXZlcnkgdHJ5OiBvbmUgZnJvemVuIGBBdHRlbXB0UmVjb3JkYCBwZXIgYXR0ZW1wdCwgY2FycnlpbmcgaXRzXG4gKiB0aW1pbmcsIG91dGNvbWUsIGZhaWx1cmUgY2F0ZWdvcnkgYW5kIHRoZSByZXRyeS1vci1zdG9wIGRlY2lzaW9uIChgYXR0ZW1wdC9kZWNpc2lvbi50c2ApLCBhbmQgb25lXG4gKiBgQXR0ZW1wdFN1bW1hcnlgIHdoZW4gdGhlIHNlcmllcyBlbmRzLiBUaGUgZW5naW5lJ3Mgc3RhZ2UgcmV0cnkgKGBGbG93Y2hhcnRUcmF2ZXJzZXIgwrcgZXhlY3V0ZVN0YWdlYCkgcnVucyBvblxuICogaXQ7IGxhdGVyIHBhY2tldHMgcnVuIGluLXN0YWdlIGNhbGxzIGFuZCBzdGFuZGFsb25lIGBhdHRlbXB0KClgIG9uIGl0IHRvby5cbiAqXG4gKiBUaGUgbG9vcCwgcGVyIGF0dGVtcHQgbiDigJQgZm9yIGEgZmFpbGVkIGF0dGVtcHQsIHRoZSA5LjE1IGxvb3AncyBvcmRlciwgc3RlcCBmb3Igc3RlcDpcbiAqXG4gKiAgIHN0YXJ0IOKGkiBydW4obikg4oaSIG91dGNvbWUgKG9rIHwgZmFpbGVkIHwgYWJvcnRlZCBbaXQgdGhyZXcgdGhlIHJ1bidzIGFib3J0IHJlYXNvbl0gfCBwYXVzZWQgW2EgUGF1c2VTaWduYWxdKVxuICogICAgICAgICDihpIgZGVjaWRlIG92ZXIgdGhlIGlucHV0cywgZmlyc3QgbWF0Y2ggd2lucyAoYHJldHJ5UnVsZXNgKSDigJQgcmV0cnlPbiBpcyBhc2tlZCBoZXJlIChydWxlIDUpXG4gKiAgICAgICAgIOKGkiB0aGUgcnVuJ3Mgc2lnbmFsIGFib3J0ZWQgaW5zaWRlIHJldHJ5T24/IGRlY2lkZSBhZ2FpbjogcnVsZSAzIHN0b3BzIHRoZSBzZXJpZXMgaGVyZSwgYmVmb3JlIHRoZVxuICogICAgICAgICAgIGRpc2NhcmQgYW5kIGJlZm9yZSBiYWNrb2ZmTXMsIGFzIHRoZSA5LjE1IGFib3J0IGNoZWNrIGRpZFxuICogICAgICAgICDihpIgcmV0cnk6IGJldHdlZW4obikg4oCUIHRoZSBkaXNjYXJkIOKAlCBhbmQgVEhFTiBiYWNrb2ZmTXMobiksIHRoZSB3YWl0J3MgbGVuZ3RoXG4gKiAgICAgICAgIOKGkiB0aGUgZXJyb3IncyBzZXJ2ZWQgZm9ybSBhbmQgY2F0ZWdvcnksIHJlYWQgYWZ0ZXIgcmV0cnlPbiBhbmQgYmFja29mZk1zIHJhbiDihpIgdGhlIHJlY29yZFxuICogICAgICAgICDihpIgb25FbmQoc3VtbWFyeSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9ubHkgd2hlbiB0aGUgc2VyaWVzIGVuZHMgaGVyZVxuICogICAgICAgICDihpIgb25BdHRlbXB0KHJlY29yZCwgc2VydmVkIGVycm9yKVxuICogICAgICAgICDihpIgZG9uZTogcmV0dXJuIHRoZSB2YWx1ZSDCtyBzdG9wOiByZXRocm93IHRoZSBhdHRlbXB0J3MgT1dOIGVycm9yXG4gKiAgICAgICAgIOKGkiByZXRyeTogb25SZXRyeShuLCBvZiwgZGVsYXksIHNlcnZlZCBlcnJvcikg4oaSIHdhaXQgKGN1dCBzaG9ydCBieSB0aGUgc2lnbmFsKSDihpIgYWJvcnRlZD8gc3RvcFxuICpcbiAqIFdIQVQgSVQgUFJFU0VSVkVTICh0aGUgOS4xNSBsb29wJ3MgYmVoYXZpb3VyLCBtb3ZlZCBoZXJlIHVuY2hhbmdlZCk6IHRoZSBmdW5jdGlvbiBydW5zIHRoZSBzYW1lIG51bWJlciBvZlxuICogdGltZXM7IGByZXRyeU9uYCBpcyBhc2tlZCBvbmx5IGZvciBhIGZhaWxlZCwgbm9uLWZpbmFsIGF0dGVtcHQ7IGBiYWNrb2ZmTXNgIG9ubHkgd2hlbiBhIHJldHJ5IGZvbGxvd3MsIGFmdGVyXG4gKiB0aGUgZGlzY2FyZDsgYSB0aHJvd2luZyBwcmVkaWNhdGUgaXMgXCJkbyBub3QgcmV0cnlcIiwgYSB0aHJvd2luZyBvciBub24tZmluaXRlIGJhY2tvZmYgaXMgXCJubyB3YWl0XCI7IGEgcGF1c2UgaXNcbiAqIG5ldmVyIHJldHJpZWQ7IHRoZSBhdHRlbXB0J3Mgb3duIGVycm9yIGlzIHJldGhyb3duLCBuZXZlciBhIHdyYXBwZXI7IGFuZCBhIGZhaWxlZCBhdHRlbXB0J3Mgb3JkZXIg4oCUXG4gKiBgcmV0cnlPbmAg4oaSIHRoZSBhYm9ydCBjaGVjayDihpIgdGhlIGRpc2NhcmQgKGBiZXR3ZWVuYCkg4oaSIGBiYWNrb2ZmTXNgIOKGkiB0aGUgc2VydmVkIGVycm9yIOKGkiB0aGUgcmV0cnkgZXZlbnQg4oaSXG4gKiB0aGUgd2FpdCDihpIgdGhlIGFib3J0IGNoZWNrLiBTbyBhbiBhYm9ydCBpbnNpZGUgYHJldHJ5T25gIHN0b3BzIGJlZm9yZSB0aGUgZGlzY2FyZCBhbmQgbmV2ZXIgYXNrcyBgYmFja29mZk1zYDtcbiAqIGFuIGFib3J0IGluc2lkZSBgYmFja29mZk1zYCBjb21lcyBhZnRlciB0aGUgZGlzY2FyZCwgc3RpbGwgZmlyZXMgdGhlIHJldHJ5IGV2ZW50LCB0aGVuIGVuZHMgYXQgdGhlIHdhaXQ7IGFuZFxuICogdGhlIHNlcnZlZCBlcnJvciBzaG93cyB3aGF0IGByZXRyeU9uYCBkaWQgdG8gdGhlIHRocm93biB2YWx1ZS4gVGhlIG9uZSBkaWZmZXJlbmNlOiB3aGVuIHRoZSBydW4ncyBzaWduYWwgaGFzXG4gKiBBTFJFQURZIGFib3J0ZWQgYXMgdGhlIGF0dGVtcHQgZmFpbHMsIHRoZSBzZXJpZXMgc3RvcHMgd2l0aG91dCBhc2tpbmcgYHJldHJ5T25gICh0aGUgYWJvcnQgZGVjaWRlcyBmaXJzdCDigJRcbiAqIHJ1bGUgMyBiZWZvcmUgcnVsZSA1KS5cbiAqXG4gKiBXSEFUIElUIEFERFM6IHRoZSByZWNvcmQgYW5kIHRoZSBzdW1tYXJ5LiBBIHJlY29yZCBpcyBmcm96ZW4gdG8gaXRzIGxlYXZlcyBhbmQgaG9sZHMgb25seSBjbG9uZS1zYWZlIGRhdGEg4oCUXG4gKiB0aGUgZXJyb3IgYXMgdGhlIHJ1biBTRVJWRVMgaXQgKGBzZXJ2ZWAsIHRoZSByZWRhY3Rpb24gcnVsZSdzIGZvcm0pIHdpdGhvdXQgYHJhd2AuIFRoZSBob29rIGdldHMgdGhlIHNlcnZlZFxuICogYFN0cnVjdHVyZWRFcnJvckluZm9gIHdob2xlLCBgcmF3YCBpbmNsdWRlZCwgYXMgYG9uU3RhZ2VSZXRyeWAgYWx3YXlzIGhhcy4gQSByZWNvcmQgbmV2ZXIgcmV3cml0ZXMgd2hhdCB0aGVcbiAqIGF0dGVtcHQgZGlkOiBhbiBhdHRlbXB0IHRoYXQgdGhyZXcgaXRzIG93biBlcnJvciBpcyBgZmFpbGVkYCwgd2l0aCBpdHMgY2F0ZWdvcnksIGV2ZW4gd2hlbiB0aGUgcnVuIGFib3J0ZWRcbiAqIGFyb3VuZCBpdCDigJQgdGhlIGFib3J0IGlzIHRoZSBzZXJpZXMnIHN0b3AgcmVhc29uIChgcmVhc29uOiAnYWJvcnRlZCdgKTsgYSB0aHJvd2luZyBgcmV0cnlPbmAgaXMgYGRlY2xpbmVkYFxuICogd2l0aCBgcmV0cnlPblRocmV3OiB0cnVlYCwgYXBhcnQgZnJvbSBhIHJlYWwgYGZhbHNlYC5cbiAqXG4gKiBUSU1FIChQMWIpLiBFYWNoIGF0dGVtcHQgcnVucyB1bmRlciBgbWluKHBvbGljeS50aW1lb3V0TXMsIHRpbWUgbGVmdCBiZWZvcmUgb3B0aW9ucy5kZWFkbGluZSlgIGFuZCBnZXRzIGFuXG4gKiBgQXR0ZW1wdENvbnRleHRgIOKAlCBpdHMgc2lnbmFsLCBjb21wb3NlZCBmcm9tIHRoZSBydW4ncyBhbmQgaXRzIG93biBjYXAncyB0aW1lciAoYExpdmVBdHRlbXB0YCkuIFRoZSBjYXAncyB0aW1lclxuICogYWJvcnRzIHdpdGggYW4gYEF0dGVtcHRUaW1lb3V0RXJyb3JgOyB0aGUgcnVuJ3MgZGVhZGxpbmUgYWJvcnRzIHRoZSBydW4ncyBzaWduYWwgd2l0aCBhIGJyYW5kZWQgcmVhc29uXG4gKiAoYGF0dGVtcHQvZGVhZGxpbmUudHNgKS4gRWl0aGVyIHdheSB0aGUgYXR0ZW1wdCBpcyBgJ3RpbWVvdXQnYCwgbmV2ZXIgYCdhYm9ydGVkJ2A6IHRoZSBkZWFkbGluZSBpcyBub3QgYVxuICogY2FuY2VsbGF0aW9uLCBzbyBydWxlIDMgZG9lcyBub3QgbWF0Y2ggYW5kIHJ1bGUgNiAoYHRpbWVMZWZ0QWZ0ZXJXYWl0TXMg4omkIDBgKSBzdG9wcyBhIHNlcmllcyB3aG9zZSBuZXh0IHdhaXRcbiAqIHdvdWxkIG91dGxhc3QgaXQuIFVuZGVyIGEgZGVhZGxpbmUgcnVsZSA2IG5lZWRzIHRoZSB3YWl0J3MgbGVuZ3RoLCBzbyBgYmFja29mZk1zKG4sIGVycm9yKWAgaXMgYXNrZWQgRFVSSU5HIHRoZVxuICogZGVjaXNpb24g4oCUIGJlZm9yZSB0aGUgZGlzY2FyZDsgd2l0aG91dCBvbmUgdGhlIDkuMTUgb3JkZXIgYWJvdmUgaG9sZHMgdW5jaGFuZ2VkLiBObyBhdHRlbXB0IHN0YXJ0cyBhdCBvciBwYXN0XG4gKiB0aGUgZGVhZGxpbmU6IGEgd2FpdCB0aGUgZGVhZGxpbmUgY3V0IGVuZHMgdGhlIHNlcmllcyBgbm8tdGltZS1sZWZ0YCwgcmVjb3JkaW5nIG5vIGZ1cnRoZXIgYXR0ZW1wdC5cbiAqXG4gKiBUSEUgRkVOQ0UuIFRoZSBtb21lbnQgYW4gYXR0ZW1wdCBlbmRzIHdpdGhvdXQgYW4gYW5zd2VyIOKAlCBpdHMgc2lnbmFsIGFib3J0cyAoc3luY2hyb25vdXNseSwgYmVmb3JlIGFueSBsaXN0ZW5lclxuICogdGhlIGZ1bmN0aW9uIGFkZGVkKSBvciBpdCB0aHJvd3Mg4oCUIGBvbkFiYW5kb24obilgIGZpcmVzIG9uY2UsIGFuZCB0aGUgZW5naW5lIGNsb3NlcyB0aGF0IGF0dGVtcHQncyBzY29wZTogdGhlXG4gKiBmdW5jdGlvbiBtYXkgc3RpbGwgYmUgcnVubmluZywgYW5kIG5vdGhpbmcgaXQgZG9lcyBhZnRlcndhcmRzIG1heSBsYW5kIGJlc2lkZSBhIGxhdGVyIGF0dGVtcHQuXG4gKlxuICogT05FIGFzeW5jIGZyYW1lIHdpdGggT05FIGF3YWl0IHBlciBhdHRlbXB0OiB0aGUgZW5naW5lIHJlbGllcyBvbiB0aGF0IHRvIGtlZXAgYSByZXRyaWVkIHN0YWdlJ3MgbWljcm90YXNrXG4gKiBzaGFwZSwgc28gcGFyYWxsZWwgc2libGluZ3Mgc2V0dGxlIGluIHRoZSBvcmRlciB0aGV5IGFsd2F5cyBkaWQuIFRoZSBlbmdpbmUgcmFjZXMgdGhlIGF0dGVtcHQncyBzaWduYWwgaXRzZWxmLFxuICogYXQgdGhlIHN0YWdlIGJvdW5kYXJ5IChgcmFjZWQ6IHRydWVgKTsgYW55IG90aGVyIGNhbGxlciBnZXRzIHRoZSByYWNlIGhlcmUsIHNvIHRoZSBzZXJpZXMgbmV2ZXIgd2FpdHMgb24gYW5cbiAqIGF0dGVtcHQgcGFzdCBpdHMgY2FwLlxuICpcbiAqIENBTExTIChQMikuIFRoZSBzYW1lIGxvb3AgcnVucyBhIGNhbGwgYSBzdGFnZSBtYWtlcyAoYGF0dGVtcHQvY2FsbC50cyDCtyBydW5DYWxsYCwga2luZCBgJ2NhbGwnYCwgaXRzIGB0YXJnZXRgIG9uXG4gKiBldmVyeSByZWNvcmQpIGFuZCB0aGUgc3RhbmRhbG9uZSBgYXR0ZW1wdCgpYC4gQW4gYXR0ZW1wdCdzIGNhcCBpcyB0aGUgREVBRExJTkUgb2YgZXZlcnkgY2FsbCBtYWRlIGluc2lkZSBpdCwgc29cbiAqIHRoZSBjYXAncyByZWFzb24gaXMgYnJhbmRlZCBhIHRpbWUgbGltaXQgKGBhdHRlbXB0L2RlYWRsaW5lLnRzIMK3IG1hcmtUaW1lTGltaXRgKTogYSBjYWxsIGN1dCBieSBpdHMgc3RhZ2VcbiAqIGF0dGVtcHQncyBjYXAgdGltZWQgb3V0LCBpdCB3YXMgbm90IGNhbmNlbGxlZC4gYGF0dGVtcHRFbmRzQXRgIHNheXMgd2hlbiBhbiBhdHRlbXB0IG11c3QgZW5kOyBhbiBgaW50ZXJydXB0KClgXG4gKiB0aHJvd24gaW5zaWRlIGEgY2FsbCBpcyBhIHBhdXNlLCBsaWtlIGEgYFBhdXNlU2lnbmFsYCDigJQgbmV2ZXIgcmV0cmllZC5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFN0cnVjdHVyZWRFcnJvckluZm8gfSBmcm9tICcuLi9lcnJvcnMvZXJyb3JJbmZvLmpzJztcbmltcG9ydCB7IGV4dHJhY3RFcnJvckluZm8gfSBmcm9tICcuLi9lcnJvcnMvZXJyb3JJbmZvLmpzJztcbmltcG9ydCB7IGlzSW50ZXJydXB0U2lnbmFsIH0gZnJvbSAnLi4vcGF1c2UvaW50ZXJydXB0LmpzJztcbmltcG9ydCB7IGlzUGF1c2VTaWduYWwgfSBmcm9tICcuLi9wYXVzZS90eXBlcy5qcyc7XG5pbXBvcnQgeyBhbnlTaWduYWwgfSBmcm9tICcuL2FueVNpZ25hbC5qcyc7XG5pbXBvcnQgeyBlcnJvckNhdGVnb3J5LCB0ZXJtaW5hbENhdGVnb3J5IH0gZnJvbSAnLi9jYXRlZ29yeS5qcyc7XG5pbXBvcnQgeyBpc0NhbmNlbGxlZCwgaXNEZWFkbGluZVJlYXNvbiwgbWFya1RpbWVMaW1pdCwgcmVhZERlYWRsaW5lLCBzZXRMb25nVGltZW91dCB9IGZyb20gJy4vZGVhZGxpbmUuanMnO1xuaW1wb3J0IHsgZGVjaWRlQXR0ZW1wdCwgcmV0cnlSdWxlcyB9IGZyb20gJy4vZGVjaXNpb24uanMnO1xuaW1wb3J0IHR5cGUgeyBFZmZlY3RUYXJnZXQgfSBmcm9tICcuL2VmZmVjdC5qcyc7XG5pbXBvcnQgeyBlZmZlY3RPZiwgcmVjb3JkZWRLZXlPZiwgcmVmdXNlS2V5bGVzc1JldHJ5LCB1bmtub3duRWZmZWN0RXJyb3IgfSBmcm9tICcuL2VmZmVjdC5qcyc7XG5pbXBvcnQgeyBBdHRlbXB0VGltZW91dEVycm9yIH0gZnJvbSAnLi9lcnJvcnMuanMnO1xuaW1wb3J0IHsgYXR0ZW1wdENlaWxpbmcsIGF0dGVtcHRUaW1lb3V0TXMsIGNhcHBlZFdhaXRNcyB9IGZyb20gJy4vcG9saWN5LmpzJztcbmltcG9ydCB7IGZyZWV6ZURlZXAsIHJlY29yZGVkRXJyb3IgfSBmcm9tICcuL3JlY29yZC5qcyc7XG5pbXBvcnQgdHlwZSB7XG4gIEF0dGVtcHRDYXRlZ29yeSxcbiAgQXR0ZW1wdENvbnRleHQsXG4gIEF0dGVtcHRLaW5kLFxuICBBdHRlbXB0T3V0Y29tZSxcbiAgQXR0ZW1wdFJlY29yZCxcbiAgQXR0ZW1wdFN1bW1hcnksXG4gIE9ic2VydmVkQXR0ZW1wdCxcbiAgUmV0cnlQb2xpY3ksXG59IGZyb20gJy4vdHlwZXMuanMnO1xuXG4vKiogV2hhdCBhIHNlcmllcyByZXBvcnRzLCBhbmQgdGhlIGVuZ2luZSdzIGJldHdlZW4tYXR0ZW1wdCBzdGVwLiBFdmVyeSBtZW1iZXIgaXMgb3B0aW9uYWwuICovXG5leHBvcnQgaW50ZXJmYWNlIEF0dGVtcHRSdW5PcHRpb25zIHtcbiAgLyoqIFRoZSBzZXJpZXMgZXZlcnkgcmVjb3JkIG5hbWVzIOKAlCBmb3IgYSBzdGFnZSBhdHRlbXB0LCBpdHMgZXhlY3V0aW9uJ3MgYHJ1bnRpbWVTdGFnZUlkYC4gKi9cbiAgcmVhZG9ubHkgc2VyaWVzOiBzdHJpbmc7XG4gIC8qKiBEZWZhdWx0IGAnc3RhZ2UnYC4gKi9cbiAgcmVhZG9ubHkga2luZD86IEF0dGVtcHRLaW5kO1xuICAvKiogVGhlIG91dHNpZGUgdGFyZ2V0IGV2ZXJ5IHJlY29yZCBuYW1lcyDigJQgYSBjYWxsJ3MgKGAkY2FsbGAsIGBhdHRlbXB0KClgKTsgYWJzZW50IGZvciBhIHN0YWdlIGF0dGVtcHQuICovXG4gIHJlYWRvbmx5IHRhcmdldD86IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBydW4ncyBzaWduYWwuIE9uY2UgaXQgaGFzIGFib3J0ZWQgKG90aGVyIHRoYW4gYXQgdGhlIGRlYWRsaW5lKSwgcnVsZSAzIHN0b3BzIHRoZSBzZXJpZXNcbiAgICogKGByZWFzb246ICdhYm9ydGVkJ2ApOyBpdCBjdXRzIGEgd2FpdCBzaG9ydC4gQW4gYXR0ZW1wdCB0aGF0IHRocmV3IGl0cyByZWFzb24gaXMgcmVjb3JkZWQgYCdhYm9ydGVkJ2Ag4oCUIG9yXG4gICAqIGAndGltZW91dCdgIHdoZW4gdGhlIHJlYXNvbiBpcyB0aGUgZGVhZGxpbmUncyAoYGF0dGVtcHQvZGVhZGxpbmUudHNgKS5cbiAgICovXG4gIHJlYWRvbmx5IHNpZ25hbD86IEFib3J0U2lnbmFsO1xuICAvKipcbiAgICogVGhlIHJ1bidzIGRlYWRsaW5lLCBlcG9jaCBtaWxsaXNlY29uZHMuIEV2ZXJ5IGF0dGVtcHQgaXMgY2FwcGVkIGJ5IHRoZSB0aW1lIGxlZnQ7IHJ1bGUgNiBzdG9wcyBhIHNlcmllcyB3aG9zZVxuICAgKiBuZXh0IHdhaXQgd291bGQgb3V0bGFzdCBpdCAoYG5vLXRpbWUtbGVmdGApLiBBYnNlbnQgKG9yIG5vdCBmaW5pdGUpID0gbm8gZGVhZGxpbmU6IHRoZSB0aW1lIGxlZnQgaXMgYEluZmluaXR5YC5cbiAgICovXG4gIHJlYWRvbmx5IGRlYWRsaW5lPzogbnVtYmVyO1xuICAvKiogVGhlIGNsb2NrLCBlcG9jaCBtaWxsaXNlY29uZHMuIERlZmF1bHQgYERhdGUubm93YC4gKi9cbiAgcmVhZG9ubHkgbm93PzogKCkgPT4gbnVtYmVyO1xuICAvKiogVGhlIHNlcnZlZCBmb3JtIG9mIGEgZmFpbGVkIGF0dGVtcHQncyBlcnJvci4gRGVmYXVsdCBgZXh0cmFjdEVycm9ySW5mb2AgKG5vIHJlZGFjdGlvbiBydWxlKS4gKi9cbiAgcmVhZG9ubHkgc2VydmU/OiAoZXJyb3I6IHVua25vd24pID0+IFN0cnVjdHVyZWRFcnJvckluZm87XG4gIC8qKiBCZXR3ZWVuIGEgZmFpbGVkIGF0dGVtcHQgYW5kIHRoZSBuZXh0LCBiZWZvcmUgYGJhY2tvZmZNc2A6IHRoZSBlbmdpbmUgZGlzY2FyZHMgdGhlIGF0dGVtcHQncyBzdGFnZWQgd3JpdGVzLiAqL1xuICByZWFkb25seSBiZXR3ZWVuPzogKGF0dGVtcHQ6IG51bWJlcikgPT4gdm9pZDtcbiAgLyoqIEV2ZXJ5IGF0dGVtcHQsIGF0IGl0cyBlbmQsIHdpdGggaXRzIHNlcnZlZCBlcnJvciAoYHVuZGVmaW5lZGAgZm9yIGAnb2snYCBhbmQgYCdwYXVzZWQnYCkuICovXG4gIHJlYWRvbmx5IG9uQXR0ZW1wdD86IChyZWNvcmQ6IEF0dGVtcHRSZWNvcmQsIHN0cnVjdHVyZWRFcnJvcjogU3RydWN0dXJlZEVycm9ySW5mbyB8IHVuZGVmaW5lZCkgPT4gdm9pZDtcbiAgLyoqIEEgZmFpbGVkIGF0dGVtcHQgdGhhdCBXSUxMIGJlIHJldHJpZWQg4oCUIGFmdGVyIGBiZXR3ZWVuYCBhbmQgYG9uQXR0ZW1wdGAsIGJlZm9yZSB0aGUgd2FpdC4gKi9cbiAgcmVhZG9ubHkgb25SZXRyeT86IChhdHRlbXB0OiBudW1iZXIsIG9mOiBudW1iZXIsIGRlbGF5TXM6IG51bWJlciwgc3RydWN0dXJlZEVycm9yOiBTdHJ1Y3R1cmVkRXJyb3JJbmZvKSA9PiB2b2lkO1xuICAvKiogVGhlIHNlcmllcyBlbmRlZDogY2FsbGVkIG9uY2UsIGJlZm9yZSB0aGUgbGFzdCBgb25BdHRlbXB0YCAob3IgYWZ0ZXIgYSB3YWl0IHRoZSBydW4ncyBzaWduYWwgY3V0KS4gKi9cbiAgcmVhZG9ubHkgb25FbmQ/OiAoc3VtbWFyeTogQXR0ZW1wdFN1bW1hcnkpID0+IHZvaWQ7XG4gIC8qKiBAaW50ZXJuYWwgTmF0aXZlIG93bmVyIG9ubHk6IHRoZSBleGFjdCBlc2NhcGluZyB2YWx1ZSBhbmQgY2F0ZWdvcnksIGJlZm9yZSBpdHMgc3RhZ2Ugc2VydmVzIHRoZSBlcnJvci4gKi9cbiAgcmVhZG9ubHkgb25GYWlsdXJlPzogKGVycm9yOiB1bmtub3duLCBjYXRlZ29yeTogQXR0ZW1wdENhdGVnb3J5KSA9PiB2b2lkO1xuICAvKiogYHJldHJ5T25gIHRocmV3IOKAlCB0aGUgYXR0ZW1wdCBpcyB0cmVhdGVkIGFzIGRlY2xpbmVkOyB0aGUgZW5naW5lIGxvZ3MgdGhlIHRocm93IGhlcmUuICovXG4gIHJlYWRvbmx5IG9uUmV0cnlPblRocmV3PzogKHRocm93bjogdW5rbm93bikgPT4gdm9pZDtcbiAgLyoqXG4gICAqIFRoZSBhdHRlbXB0IGVuZGVkIHdpdGhvdXQgYW4gYW5zd2VyIOKAlCBjYWxsZWQgU1lOQ0hST05PVVNMWSB0aGUgbW9tZW50IGl0cyBzaWduYWwgYWJvcnRzIChpdHMgY2FwLCB0aGUgZGVhZGxpbmUsXG4gICAqIGEgY2FuY2VsbGF0aW9uKSwgZWxzZSBhcyBzb29uIGFzIGl0IGZhaWxlZC4gV2hhdGV2ZXIgdGhlIGFiYW5kb25lZCBmdW5jdGlvbiBkb2VzIGFmdGVyd2FyZHMgaXMgbm90IHRoaXNcbiAgICogc2VyaWVzJzogdGhlIGVuZ2luZSBmZW5jZXMgaXRzIHNjb3BlIGhlcmUuIE9uY2UgcGVyIGF0dGVtcHQ7IG5ldmVyIGZvciBgJ29rJ2Agb3IgYCdwYXVzZWQnYCDigJQgZXhjZXB0IGFuIGF0dGVtcHRcbiAgICogdGhhdCBTVEFSVEVEIHVuZGVyIGFuIGFscmVhZHktYWJvcnRlZCBzaWduYWwsIGZlbmNlZCBvbmNlIGl0cyBzeW5jaHJvbm91cyBwYXJ0IGhhcyBydW4gKG5vYm9keSB3YWl0cyBmb3IgaXQpLlxuICAgKi9cbiAgcmVhZG9ubHkgb25BYmFuZG9uPzogKGF0dGVtcHQ6IG51bWJlcikgPT4gdm9pZDtcbiAgLyoqXG4gICAqIFRoZSBjYWxsZXIgcmFjZXMgYHJ1bmAncyBwcm9taXNlIGFnYWluc3QgdGhlIGF0dGVtcHQncyBzaWduYWwgaXRzZWxmIOKAlCB0aGUgZW5naW5lIGRvZXMsIGF0IHRoZSBzdGFnZSBib3VuZGFyeVxuICAgKiAoYFN0YWdlUnVubmVyYCksIHNvIGEgc3RhZ2Uga2VlcHMgaXRzIG9uZSBhd2FpdCBwZXIgYXR0ZW1wdC4gT3RoZXJ3aXNlIHRoZSBydW5uZXIgcmFjZXMgaXQ6IHRoZSBzZXJpZXMgbmV2ZXJcbiAgICogd2FpdHMgb24gYW4gYXR0ZW1wdCBwYXN0IGl0cyBjYXAuXG4gICAqL1xuICByZWFkb25seSByYWNlZD86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBXaGF0IGFuIGF0dGVtcHQncyBgb2JzZXJ2ZWQocmVwb3J0KWAgZG9lcyAoUDIpIOKAlCB0aGUgb3duZXIgb2YgdGhlIGF0dGVtcHQgcmVjb3JkcyB0aGUgcmVwb3J0OiBgcnVuQ2FsbGAgaGFuZHNcbiAgICogYSBjYWxsJ3MgcmVwb3J0cyB0byB0aGUgc2NvcGUsIGBhdHRlbXB0KClgIGtlZXBzIGl0cyBvd24uIGBlbmRlZGAgc2F5cyB0aGUgYXR0ZW1wdCBoYWQgYWxyZWFkeSBlbmRlZCB3aGVuIHRoZVxuICAgKiByZXBvcnQgY2FtZSAodGhlIG93bmVyIGRyb3BzIGl0KS4gQWJzZW50IOKAlCBhIHN0YWdlIGF0dGVtcHQncyBjb250ZXh0LCB3aG9zZSBgb2JzZXJ2ZWRgIHRoZSBzY29wZSdzXG4gICAqIGAkYXR0ZW1wdCgpYCByZXBsYWNlcyDigJQgYG9ic2VydmVkYCBpcyByZWZ1c2VkIHdpdGggYSBgVHlwZUVycm9yYC5cbiAgICovXG4gIHJlYWRvbmx5IG9ic2VydmU/OiAocmVwb3J0OiBPYnNlcnZlZEF0dGVtcHQsIGF0OiB7IHJlYWRvbmx5IGF0dGVtcHQ6IG51bWJlcjsgcmVhZG9ubHkgZW5kZWQ6IGJvb2xlYW4gfSkgPT4gdm9pZDtcbiAgLyoqXG4gICAqIFRoZSBvdXRzaWRlIHN5c3RlbSB0aGUgdGFyZ2V0IHRvdWNoZXMgKFAzLCBkZXNpZ24gwqczLjMpLiBFdmVyeSByZWNvcmQgdGhlbiBzYXlzIHdoYXQgaXRzIGF0dGVtcHQgZGlkIHRvIGl0XG4gICAqIChgZWZmZWN0YCkgYW5kIG5hbWVzIHRoZSBzeXN0ZW0gYW5kIHRoZSBSRUNPUkRFRCBrZXk7IGV2ZXJ5IGF0dGVtcHQncyBjb250ZXh0IGNhcnJpZXMgdGhlIFJFQUwga2V5LiBBIHNlcmllc1xuICAgKiB0aGF0IGVuZHMgd2l0aG91dCBhbiBhbnN3ZXIgYWZ0ZXIgYW55IGF0dGVtcHQgb2YgdW5rbm93biBlZmZlY3QgZmFpbHMgd2l0aCBgVW5rbm93bkVmZmVjdEVycm9yYCAoaXRzIGBjYXVzZWAgdGhlIGF0dGVtcHQncyBvd24gZXJyb3IpIOKAlFxuICAgKiBleGNlcHQgYSBwYXVzZSwgd2hpY2ggc3RheXMgYSBwYXVzZS4gQSB0b3VjaGluZyBzZXJpZXMgdGhhdCBtYXkgcmV0cnkgd2l0aG91dCBhIGtleSBpcyByZWZ1c2VkIGJlZm9yZSBhbnl0aGluZ1xuICAgKiBydW5zOiB0aGUgbGF3J3MgbGFzdCBkb29yLlxuICAgKi9cbiAgcmVhZG9ubHkgZWZmZWN0PzogRWZmZWN0VGFyZ2V0O1xufVxuXG4vKiogV2hlbiBlYWNoIGxpdmUgYXR0ZW1wdCBtdXN0IGVuZCwgZXBvY2ggbXMg4oCUIGBzdGFydGVkQXQgKyBjYXBgLCBmb3IgYW4gYXR0ZW1wdCB0aGF0IGhhcyBhIGNhcCAoYGF0dGVtcHRFbmRzQXRgKS4gKi9cbmNvbnN0IEFUVEVNUFRfRU5EUyA9IG5ldyBXZWFrTWFwPEF0dGVtcHRDb250ZXh0LCBudW1iZXI+KCk7XG5cbi8qKlxuICogV2hlbiB0aGUgYXR0ZW1wdCBiZWhpbmQgYGNvbnRleHRgIG11c3QgZW5kLCBlcG9jaCBtaWxsaXNlY29uZHMg4oCUIGl0cyBzdGFydCBwbHVzIGl0cyBjYXAgKGBtaW4odGltZW91dE1zLCB0aW1lXG4gKiBsZWZ0KWAsIHNvIG5ldmVyIHBhc3QgdGhlIHJ1bidzIGRlYWRsaW5lKSDigJQgb3IgYHVuZGVmaW5lZGAgZm9yIGFuIHVuY2FwcGVkIGF0dGVtcHQuIEEgY2FsbCBtYWRlIGluc2lkZSB0aGVcbiAqIGF0dGVtcHQgcnVucyB1bmRlciBpdCBhcyBpdHMgZGVhZGxpbmUgKGBhdHRlbXB0L2NhbGwudHNgKS4gT25seSB0aGUgcnVubmVyJ3Mgb3duIGNvbnRleHRzIGFyZSBrbm93bi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGF0dGVtcHRFbmRzQXQoY29udGV4dDogQXR0ZW1wdENvbnRleHQgfCB1bmRlZmluZWQpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICByZXR1cm4gY29udGV4dCA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogQVRURU1QVF9FTkRTLmdldChjb250ZXh0KTtcbn1cblxuLyoqIEEgZmFpbGVkIGF0dGVtcHQncyB0aHJvd24gdmFsdWUsIGJveGVkOiBgdW5kZWZpbmVkYCBpcyBhIHZhbHVlIGEgc3RhZ2UgbWF5IHRocm93LiAqL1xuaW50ZXJmYWNlIEZhaWx1cmUge1xuICByZWFkb25seSBlcnJvcjogdW5rbm93bjtcbn1cblxuLyoqXG4gKiBSdW4gYHJ1bmAgdW50aWwgaXQgc3VjY2VlZHMgb3IgdGhlIHBvbGljeSBzdG9wcyBpdDsgcmVzb2x2ZSB3aXRoIGl0cyB2YWx1ZSBvciByZWplY3Qgd2l0aCB0aGUgTEFTVCBhdHRlbXB0J3NcbiAqIG93biBlcnJvci4gYHJ1bihuKWAgaXMgY2FsbGVkIHdpdGggdGhlIGF0dGVtcHQgbnVtYmVyLCAxLWJhc2VkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcnVuQXR0ZW1wdHM8VD4oXG4gIHJ1bjogKGF0dGVtcHQ6IG51bWJlciwgY29udGV4dDogQXR0ZW1wdENvbnRleHQpID0+IFByb21pc2U8VD4gfCBULFxuICBwb2xpY3k6IFJldHJ5UG9saWN5LFxuICBvcHRpb25zOiBBdHRlbXB0UnVuT3B0aW9ucyxcbik6IFByb21pc2U8VD4ge1xuICBjb25zdCBvZiA9IGF0dGVtcHRDZWlsaW5nKHBvbGljeS5hdHRlbXB0cyk7XG4gIGNvbnN0IHJ1bGVzID0gcmV0cnlSdWxlcyh7IGF0dGVtcHRzOiBvZiB9KTtcbiAgY29uc3Qgbm93ID0gb3B0aW9ucy5ub3cgPz8gRGF0ZS5ub3c7XG4gIGNvbnN0IGRlYWRsaW5lID0gcmVhZERlYWRsaW5lKG9wdGlvbnMuZGVhZGxpbmUpO1xuICBjb25zdCBvd25DYXAgPSBhdHRlbXB0VGltZW91dE1zKHBvbGljeS50aW1lb3V0TXMpO1xuICBjb25zdCB0YWxseSA9IG5ldyBTZXJpZXNUYWxseSgpO1xuICBpZiAob3B0aW9ucy5lZmZlY3QpIHJlZnVzZUtleWxlc3NSZXRyeShvcHRpb25zLmVmZmVjdCwgb2YpO1xuICAvKiogQW4gZWFybGllciBhdHRlbXB0IG9mIHRoaXMgdG91Y2hpbmcgc2VyaWVzIGxlZnQgdGhlIGVmZmVjdCB1bmtub3duIOKAlCBhIGxhdGVyIGFuc3dlciBvZiBgbm9uZWAgY2Fubm90IGNsZWFyIGl0LiAqL1xuICBsZXQgdW5rbm93blNvRmFyID0gZmFsc2U7XG5cbiAgZm9yIChsZXQgYXR0ZW1wdCA9IDE7IDsgYXR0ZW1wdCsrKSB7XG4gICAgY29uc3Qgc3RhcnRlZEF0ID0gbm93KCk7XG4gICAgY29uc3QgbGl2ZSA9IG5ldyBMaXZlQXR0ZW1wdChvcHRpb25zLCBhdHRlbXB0LCBvZiwgc3RhcnRlZEF0LCBkZWFkbGluZSwgb3duQ2FwLCBub3cpO1xuICAgIGxldCB2YWx1ZTogVCB8IHVuZGVmaW5lZDtcbiAgICBsZXQgZmFpbHVyZTogRmFpbHVyZSB8IHVuZGVmaW5lZDtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcGVuZGluZyA9IHJ1bihhdHRlbXB0LCBsaXZlLmNvbnRleHQpO1xuICAgICAgLy8gU3RhcnRlZCB1bmRlciBhIHNpZ25hbCB0aGF0IGhhZCBBTFJFQURZIGFib3J0ZWQgKGEgZGVjaWRlciBlbnRlcmVkIGFmdGVyIGEgY2FuY2VsKTogaXRzIHN5bmNocm9ub3VzIHBhcnRcbiAgICAgIC8vIHJhbiBhcyBpdCBhbHdheXMgZGlkOyBmcm9tIGhlcmUgb24gbm9ib2R5IHdhaXRzIGZvciBpdCwgc28gbm90aGluZyBpdCBkb2VzIGFmdGVyIGl0cyBmaXJzdCBhd2FpdCBsYW5kcy5cbiAgICAgIGlmIChsaXZlLmNvbnRleHQuc2lnbmFsLmFib3J0ZWQpIGxpdmUuYWJhbmRvblN0YXJ0ZWQoKTtcbiAgICAgIHZhbHVlID0gYXdhaXQgKG9wdGlvbnMucmFjZWQgPyBwZW5kaW5nIDogbGl2ZS5yYWNlKHBlbmRpbmcpKTtcbiAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgZmFpbHVyZSA9IHsgZXJyb3IgfTtcbiAgICB9XG4gICAgY29uc3QgZHVyYXRpb25NcyA9IE1hdGgubWF4KDAsIG5vdygpIC0gc3RhcnRlZEF0KTtcbiAgICBjb25zdCBvdXRjb21lID0gb3V0Y29tZU9mKGZhaWx1cmUsIG9wdGlvbnMuc2lnbmFsLCBsaXZlLnRpbWVvdXRSZWFzb24pO1xuICAgIGxpdmUuZW5kKG91dGNvbWUpO1xuICAgIGNvbnN0IGlucHV0cyA9IG5ldyBBdHRlbXB0SW5wdXRSZWFkZXIocG9saWN5LCBvcHRpb25zLCBhdHRlbXB0LCBvZiwgb3V0Y29tZSwgZmFpbHVyZSwgZGVhZGxpbmUsIG5vdyk7XG5cbiAgICBsZXQgZGVjaXNpb24gPSBkZWNpZGVBdHRlbXB0KHJ1bGVzLCBpbnB1dHMucmVhZCk7XG4gICAgLy8gOS4xNSBhc2tlZCByZXRyeU9uLCBUSEVOIGNoZWNrZWQgdGhlIHNpZ25hbC4gRGVjaWRpbmcgYWdhaW4gcmVhZHMgdGhlIHNpZ25hbCBhZnJlc2g6IHJ1bGUgMyBub3cgbWF0Y2hlcyxcbiAgICAvLyBhaGVhZCBvZiBldmVyeSB1c2VyIGZ1bmN0aW9uLCBzbyBub25lIGlzIGFza2VkIHR3aWNlIOKAlCBhbmQgbm90aGluZyBpcyBkaXNjYXJkZWQsIG5vdGhpbmcgd2FpdGVkIGZvci5cbiAgICBpZiAoZGVjaXNpb24ubmV4dCA9PT0gJ3JldHJ5JyAmJiBpc0NhbmNlbGxlZChvcHRpb25zLnNpZ25hbCkpIGRlY2lzaW9uID0gZGVjaWRlQXR0ZW1wdChydWxlcywgaW5wdXRzLnJlYWQpO1xuXG4gICAgLy8gVGhlIGRpc2NhcmQgY29tZXMgQkVGT1JFIHRoZSB3YWl0J3MgbGVuZ3RoIGlzIGFza2VkIGZvciwgYXMgaXQgZGlkIGluIDkuMTUg4oCUIHdpdGhvdXQgYSBkZWFkbGluZS4gVW5kZXIgb25lLFxuICAgIC8vIHJ1bGUgNiBuZWVkcyB0aGUgd2FpdCdzIGxlbmd0aCB0byBkZWNpZGUsIHNvIGBiYWNrb2ZmTXNgIHdhcyBhc2tlZCBkdXJpbmcgdGhlIGRlY2lzaW9uLCBiZWZvcmUgdGhlIGRpc2NhcmQuXG4gICAgaWYgKGRlY2lzaW9uLm5leHQgPT09ICdyZXRyeScpIG9wdGlvbnMuYmV0d2Vlbj8uKGF0dGVtcHQpO1xuICAgIGNvbnN0IGRlbGF5TXMgPSBkZWNpc2lvbi5uZXh0ID09PSAncmV0cnknID8gaW5wdXRzLmRlbGF5TXMoKSA6IGlucHV0cy5kZWxheUlmQXNrZWQoKTtcbiAgICBjb25zdCB0aW1lTGVmdE1zID0gZGVhZGxpbmUgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IGlucHV0cy50aW1lTGVmdCgpO1xuXG4gICAgY29uc3QgY2F0ZWdvcnkgPSBpbnB1dHMuY2F0ZWdvcnkoKTtcbiAgICAvLyBQcml2YXRlIHRlcm1pbmFsIHNlbWFudGljcyBhcmUgZml4ZWQgYmVmb3JlIHNlcnZpbmcgb3Igb2JzZXJ2ZXIgZmFuLW91dC5cbiAgICAvLyBBbiBhbHJlYWR5LXVucmVzb2x2ZWQgY2FsbCB3cmFwcGVyIG11c3Qgbm90IGJlY29tZSBpdHMgcGh5c2ljYWwgY2F1c2VcbiAgICAvLyBpZiBhIGNvbnN1bWVyIGxhdGVyIGNoYW5nZXMgdGhlIHJhdyBlcnJvcidzIHByb3BlcnRpZXMgb3IgcHJvdG90eXBlLlxuICAgIGNvbnN0IHRlcm1pbmFsID0gb3B0aW9ucy5vbkZhaWx1cmUgJiYgZmFpbHVyZSA/IHRlcm1pbmFsQ2F0ZWdvcnkoZmFpbHVyZS5lcnJvciwgY2F0ZWdvcnkpIDogY2F0ZWdvcnkgPz8gJ3Vua25vd24nO1xuICAgIGNvbnN0IHNlcnZlZCA9IGlucHV0cy5mYWlsZWQgPyAob3B0aW9ucy5zZXJ2ZSA/PyBleHRyYWN0RXJyb3JJbmZvKShpbnB1dHMuZmFpbGVkLmVycm9yKSA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCBlZmZlY3QgPSBvcHRpb25zLmVmZmVjdCA/IGVmZmVjdE9mKGlucHV0cy5vdXRjb21lLCBmYWlsdXJlPy5lcnJvcikgOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgcmVjb3JkZWRLZXkgPSBvcHRpb25zLmVmZmVjdCA/IHJlY29yZGVkS2V5T2Yob3B0aW9ucy5lZmZlY3QpIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IHJlY29yZCA9IGZyZWV6ZURlZXA8QXR0ZW1wdFJlY29yZD4oe1xuICAgICAgc2VyaWVzOiBvcHRpb25zLnNlcmllcyxcbiAgICAgIGtpbmQ6IG9wdGlvbnMua2luZCA/PyAnc3RhZ2UnLFxuICAgICAgLi4uKG9wdGlvbnMudGFyZ2V0ICE9PSB1bmRlZmluZWQgJiYgeyB0YXJnZXQ6IG9wdGlvbnMudGFyZ2V0IH0pLFxuICAgICAgYXR0ZW1wdCxcbiAgICAgIG9mLFxuICAgICAgc3RhcnRlZEF0LFxuICAgICAgZHVyYXRpb25NcyxcbiAgICAgIG91dGNvbWU6IGlucHV0cy5vdXRjb21lLFxuICAgICAgLi4uKGNhdGVnb3J5ICE9PSB1bmRlZmluZWQgJiYgeyBjYXRlZ29yeSB9KSxcbiAgICAgIGRlY2lzaW9uOiBkZWNpc2lvbi5ldmlkZW5jZSxcbiAgICAgIG5leHQ6IGRlY2lzaW9uLm5leHQsXG4gICAgICByZWFzb246IGRlY2lzaW9uLnJlYXNvbixcbiAgICAgIC4uLihpbnB1dHMucmV0cnlPblRocmV3ICYmIHsgcmV0cnlPblRocmV3OiB0cnVlIGFzIGNvbnN0IH0pLFxuICAgICAgLi4uKGRlbGF5TXMgIT09IHVuZGVmaW5lZCAmJiB7IGRlbGF5TXMgfSksXG4gICAgICAuLi4obGl2ZS5jYXBNcyAhPT0gdW5kZWZpbmVkICYmIHsgdGltZW91dE1zOiBsaXZlLmNhcE1zIH0pLFxuICAgICAgLi4uKHRpbWVMZWZ0TXMgIT09IHVuZGVmaW5lZCAmJiB7IHRpbWVMZWZ0TXMgfSksXG4gICAgICAuLi4oc2VydmVkICE9PSB1bmRlZmluZWQgJiYgeyBlcnJvcjogcmVjb3JkZWRFcnJvcihzZXJ2ZWQpIH0pLFxuICAgICAgLi4uKG9wdGlvbnMuZWZmZWN0ICE9PSB1bmRlZmluZWQgJiYgeyBzeXN0ZW06IG9wdGlvbnMuZWZmZWN0LnN5c3RlbSB9KSxcbiAgICAgIC4uLihyZWNvcmRlZEtleSAhPT0gdW5kZWZpbmVkICYmIHsgaWRlbXBvdGVuY3lLZXk6IHJlY29yZGVkS2V5IH0pLFxuICAgICAgLi4uKGVmZmVjdCAhPT0gdW5kZWZpbmVkICYmIHsgZWZmZWN0IH0pLFxuICAgIH0pO1xuICAgIHRhbGx5LmFkZChyZWNvcmQpO1xuICAgIGlmIChyZWNvcmQuZWZmZWN0ID09PSAndW5rbm93bicpIHVua25vd25Tb0ZhciA9IHRydWU7XG4gICAgaWYgKHJlY29yZC5uZXh0ICE9PSAncmV0cnknKSBvcHRpb25zLm9uRW5kPy4odGFsbHkuc3VtbWFyeShsYXN0T2YocmVjb3JkLCB1bmtub3duU29GYXIpKSk7XG4gICAgb3B0aW9ucy5vbkF0dGVtcHQ/LihyZWNvcmQsIHNlcnZlZCk7XG5cbiAgICBpZiAocmVjb3JkLm5leHQgPT09ICdkb25lJykgcmV0dXJuIHZhbHVlIGFzIFQ7XG4gICAgaWYgKHJlY29yZC5uZXh0ID09PSAnc3RvcCcpIHRocm93IHN0b3BwZWRGYWlsdXJlKG9wdGlvbnMsIHJlY29yZCwgZmFpbHVyZSwgdW5rbm93blNvRmFyLCB0ZXJtaW5hbCk7XG5cbiAgICBvcHRpb25zLm9uUmV0cnk/LihhdHRlbXB0LCBvZiwgZGVsYXlNcyA/PyAwLCBzZXJ2ZWQgYXMgU3RydWN0dXJlZEVycm9ySW5mbyk7XG4gICAgaWYgKGRlbGF5TXMgIT09IHVuZGVmaW5lZCAmJiBkZWxheU1zID4gMCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgc2xlZXAoZGVsYXlNcywgb3B0aW9ucy5zaWduYWwpO1xuICAgICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgICAgb3B0aW9ucy5vbkZhaWx1cmU/LihlcnJvciwgJ3Vua25vd24nKTtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIE5vIGF0dGVtcHQgZm9sbG93cyBhIGN1dCB3YWl0LCBzbyBub25lIGlzIHJlY29yZGVkOiB0aGUgc3VtbWFyeSBzYXlzIGhvdyB0aGUgc2VyaWVzIGVuZGVkLiBObyBhdHRlbXB0XG4gICAgLy8gU1RBUlRTIGF0IG9yIHBhc3QgdGhlIGRlYWRsaW5lIGVpdGhlciDigJQgcnVsZSA2IGRlY2lkZWQgd2l0aCB0aGUgY2xvY2ssIGFuZCB0aGUgY2xvY2sgbWF5IGhhdmUgbW92ZWQgb24uXG4gICAgY29uc3QgY3V0ID0gaXNDYW5jZWxsZWQob3B0aW9ucy5zaWduYWwpXG4gICAgICA/ICdhYm9ydGVkJ1xuICAgICAgOiBvcHRpb25zLnNpZ25hbD8uYWJvcnRlZCB8fCAoZGVhZGxpbmUgIT09IHVuZGVmaW5lZCAmJiBub3coKSA+PSBkZWFkbGluZSlcbiAgICAgID8gJ25vLXRpbWUtbGVmdCdcbiAgICAgIDogdW5kZWZpbmVkO1xuICAgIGlmIChjdXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgb3B0aW9ucy5vbkVuZD8uKHRhbGx5LnN1bW1hcnkoeyAuLi5sYXN0T2YocmVjb3JkLCB1bmtub3duU29GYXIpLCBuZXh0OiAnc3RvcCcsIHJlYXNvbjogY3V0IH0pKTtcbiAgICAgIHRocm93IHN0b3BwZWRGYWlsdXJlKG9wdGlvbnMsIHJlY29yZCwgZmFpbHVyZSwgdW5rbm93blNvRmFyLCB0ZXJtaW5hbCk7XG4gICAgfVxuICB9XG59XG5cbi8qKiBUaGUgZmluYWwgcGh5c2ljYWwgYXR0ZW1wdCBvd25zIGl0cyBjYXRlZ29yeTsgYSB3cmFwcGVyIG9yIGN1dCB3YWl0IGhhcyBubyBzdWNoIGNhdGVnb3J5LiAqL1xuZnVuY3Rpb24gc3RvcHBlZEZhaWx1cmUoXG4gIG9wdGlvbnM6IEF0dGVtcHRSdW5PcHRpb25zLFxuICByZWNvcmQ6IEF0dGVtcHRSZWNvcmQsXG4gIGZhaWx1cmU6IEZhaWx1cmUgfCB1bmRlZmluZWQsXG4gIHVua25vd25Tb0ZhcjogYm9vbGVhbixcbiAgdGVybWluYWw6IEF0dGVtcHRDYXRlZ29yeSxcbik6IHVua25vd24ge1xuICBjb25zdCBlcnJvciA9IHN0b3BFcnJvcihvcHRpb25zLmVmZmVjdCwgcmVjb3JkLCBmYWlsdXJlLCB1bmtub3duU29GYXIpO1xuICBpZiAocmVjb3JkLm91dGNvbWUgIT09ICdwYXVzZWQnKSB7XG4gICAgY29uc3QgY2F0ZWdvcnkgPSByZWNvcmQubmV4dCA9PT0gJ3N0b3AnICYmIE9iamVjdC5pcyhlcnJvciwgZmFpbHVyZT8uZXJyb3IpID8gdGVybWluYWwgOiAndW5rbm93bic7XG4gICAgb3B0aW9ucy5vbkZhaWx1cmU/LihlcnJvciwgY2F0ZWdvcnkpO1xuICB9XG4gIHJldHVybiBlcnJvcjtcbn1cblxuLyoqXG4gKiBXaGF0IGEgc3RvcHBlZCBzZXJpZXMgdGhyb3dzOiB0aGUgbGFzdCBhdHRlbXB0J3Mgb3duIGVycm9yIOKAlCBvciwgb24gYSB0b3VjaGluZyB0YXJnZXQgd2hlcmUgQU5ZIGF0dGVtcHQgbGVmdCB0aGVcbiAqIGVmZmVjdCB1bmtub3duLCBgVW5rbm93bkVmZmVjdEVycm9yYCB3aXRoIHRoZSBsYXN0IGF0dGVtcHQncyBlcnJvciBhcyBpdHMgY2F1c2UuIEFuIGVhcmxpZXIgdGltZW91dCBtYXkgaGF2ZVxuICogYXBwbGllZCB0aGUgZWZmZWN0OyBhIGxhdGVyIGF0dGVtcHQgdGhhdCBzYXlzIFwibm90aGluZyB3YXMgc2VudFwiIHNwZWFrcyBmb3IgaXRzZWxmIG9ubHksIHNvIGl0IGNhbm5vdCB0dXJuIHRoZVxuICogc2VyaWVzIGludG8gYSBwbGFpbiBmYWlsdXJlLiBBIHBhdXNlIGlzIG5ldmVyIGNvbnZlcnRlZDogaXQgaXMgY29udHJvbCBmbG93LlxuICovXG5mdW5jdGlvbiBzdG9wRXJyb3IoXG4gIGVmZmVjdDogRWZmZWN0VGFyZ2V0IHwgdW5kZWZpbmVkLFxuICByZWNvcmQ6IEF0dGVtcHRSZWNvcmQsXG4gIGZhaWx1cmU6IEZhaWx1cmUgfCB1bmRlZmluZWQsXG4gIHVua25vd25Tb0ZhcjogYm9vbGVhbixcbik6IHVua25vd24ge1xuICBpZiAoZWZmZWN0ID09PSB1bmRlZmluZWQgfHwgIXVua25vd25Tb0ZhciB8fCByZWNvcmQub3V0Y29tZSA9PT0gJ3BhdXNlZCcpIHJldHVybiBmYWlsdXJlPy5lcnJvcjtcbiAgcmV0dXJuIHVua25vd25FZmZlY3RFcnJvcihlZmZlY3QsIHJlY29yZCwgZmFpbHVyZT8uZXJyb3IpO1xufVxuXG4vKipcbiAqIE9uZSBhdHRlbXB0IGluIGZsaWdodDogaXRzIGNhcCwgaXRzIHNpZ25hbCAodGhlIHJ1bidzLCBjb21wb3NlZCB3aXRoIGl0cyBvd24gdGltZXIpLCBhbmQgdGhlIGZlbmNlLiBJdHMgb3duXG4gKiB0aW1lciBpcyBhcm1lZCB3aGVuIHRoZSBwb2xpY3kncyBjYXAgaXMgU0hPUlRFUiB0aGFuIHRoZSB0aW1lIGxlZnQ7IGF0IHRoZSBkZWFkbGluZSB0aGUgcnVuJ3Mgb3duIHNpZ25hbCBhYm9ydHMsXG4gKiB3aXRoIHRoZSBkZWFkbGluZSdzIHJlYXNvbiAoc28gYSBydW4gcmVqZWN0cyB3aXRoIHRoZSByZWFzb24gaXQgYWx3YXlzIGRpZCkuIEV2ZXJ5dGhpbmcgaXQgYXJtcyBpcyByZWxlYXNlZFxuICogd2hlbiB0aGUgYXR0ZW1wdCBlbmRzLlxuICovXG5jbGFzcyBMaXZlQXR0ZW1wdCB7XG4gIHJlYWRvbmx5IGNvbnRleHQ6IEF0dGVtcHRDb250ZXh0O1xuICAvKiogVGhlIGNhcCB0aGlzIGF0dGVtcHQgcnVucyB1bmRlciDigJQgYG1pbih0aW1lb3V0TXMsIHRpbWUgbGVmdClgLCBuZXZlciBuZWdhdGl2ZTsgYWJzZW50IHdoZW4gdW5jYXBwZWQuICovXG4gIHJlYWRvbmx5IGNhcE1zOiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gIC8qKiBUaGUgcmVhc29uIHRoZSBhdHRlbXB0J3MgT1dOIHRpbWVyIGFib3J0ZWQgd2l0aCDigJQgc2V0IG9ubHkgaWYgaXQgZmlyZWQuICovXG4gIHRpbWVvdXRSZWFzb246IEF0dGVtcHRUaW1lb3V0RXJyb3IgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgY2FuY2VsVGltZXI6ICgoKSA9PiB2b2lkKSB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSByZWFkb25seSBjb21wb3NlZDogeyByZWFkb25seSBzaWduYWw6IEFib3J0U2lnbmFsOyBkaXNwb3NlKCk6IHZvaWQgfTtcbiAgcHJpdmF0ZSBhYmFuZG9uZWQgPSBmYWxzZTtcbiAgLyoqIFRoZSBhdHRlbXB0IGlzIG92ZXIsIGhvd2V2ZXIgaXQgZW5kZWQg4oCUIGFuIGBvYnNlcnZlZGAgcmVwb3J0IGFmdGVyIHRoaXMgaXMgdGhlIG93bmVyJ3MgdG8gcmVmdXNlLiAqL1xuICBwcml2YXRlIGVuZGVkID0gZmFsc2U7XG4gIHByaXZhdGUgcmVhZG9ubHkgb25BYm9ydCA9ICgpID0+IHRoaXMuYWJhbmRvbigpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgb3B0aW9uczogQXR0ZW1wdFJ1bk9wdGlvbnMsXG4gICAgcHJpdmF0ZSByZWFkb25seSBhdHRlbXB0OiBudW1iZXIsXG4gICAgb2Y6IG51bWJlcixcbiAgICBzdGFydGVkQXQ6IG51bWJlcixcbiAgICBkZWFkbGluZTogbnVtYmVyIHwgdW5kZWZpbmVkLFxuICAgIG93bkNhcDogbnVtYmVyIHwgdW5kZWZpbmVkLFxuICAgIG5vdzogKCkgPT4gbnVtYmVyLFxuICApIHtcbiAgICBjb25zdCBsZWZ0ID0gZGVhZGxpbmUgPT09IHVuZGVmaW5lZCA/IEluZmluaXR5IDogTWF0aC5tYXgoMCwgZGVhZGxpbmUgLSBzdGFydGVkQXQpO1xuICAgIGNvbnN0IGNhcCA9IE1hdGgubWluKG93bkNhcCA/PyBJbmZpbml0eSwgbGVmdCk7XG4gICAgdGhpcy5jYXBNcyA9IE51bWJlci5pc0Zpbml0ZShjYXApID8gY2FwIDogdW5kZWZpbmVkO1xuICAgIC8vIEl0cyBvd24gdGltZXIgd2hlbiBpdHMgb3duIGNhcCBpcyB0aGUgc2hvcnRlciwgb3Igd2hlbiBubyBydW4gc2lnbmFsIHdpbGwgYWJvcnQgYXQgdGhlIGRlYWRsaW5lIChhIGNhbGxlclxuICAgIC8vIHdpdGggYSBkZWFkbGluZSBhbmQgbm8gc2lnbmFsKS4gT3RoZXJ3aXNlIHRoZSBydW4ncyBzaWduYWwgZW5kcyBpdCBhdCB0aGUgZGVhZGxpbmUsIHdpdGggdGhlIGRlYWRsaW5lJ3MgcmVhc29uLlxuICAgIGNvbnN0IG93blRpbWVyID0gdGhpcy5jYXBNcyAhPT0gdW5kZWZpbmVkICYmICgob3duQ2FwICE9PSB1bmRlZmluZWQgJiYgb3duQ2FwIDwgbGVmdCkgfHwgIW9wdGlvbnMuc2lnbmFsKTtcbiAgICBjb25zdCBvd24gPSBvd25UaW1lciA/IG5ldyBBYm9ydENvbnRyb2xsZXIoKSA6IHVuZGVmaW5lZDtcbiAgICBpZiAob3duKSB7XG4gICAgICBjb25zdCBjYXBNcyA9IHRoaXMuY2FwTXMgYXMgbnVtYmVyO1xuICAgICAgdGhpcy5jYW5jZWxUaW1lciA9IHNldExvbmdUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgLy8gQSB0aW1lIGxpbWl0LCBicmFuZGVkIGxpa2UgdGhlIHJ1bidzIGRlYWRsaW5lOiBhIGNhbGwgbWFkZSBpbnNpZGUgdGhpcyBhdHRlbXB0IHRoYXQgaXQgY3V0cyB0aW1lZCBvdXQuXG4gICAgICAgIHRoaXMudGltZW91dFJlYXNvbiA9IG1hcmtUaW1lTGltaXQobmV3IEF0dGVtcHRUaW1lb3V0RXJyb3IoYXR0ZW1wdCwgY2FwTXMpKTtcbiAgICAgICAgb3duLmFib3J0KHRoaXMudGltZW91dFJlYXNvbik7XG4gICAgICB9LCBjYXBNcyk7XG4gICAgfVxuICAgIHRoaXMuY29tcG9zZWQgPSBhbnlTaWduYWwoW29wdGlvbnMuc2lnbmFsLCBvd24/LnNpZ25hbF0pO1xuICAgIC8vIFJlZ2lzdGVyZWQgQkVGT1JFIHRoZSBmdW5jdGlvbiBydW5zLCBzbyB0aGUgZmVuY2UgY2xvc2VzIGJlZm9yZSBhbnkgbGlzdGVuZXIgdGhlIGZ1bmN0aW9uIGFkZHMuIEEgc2lnbmFsXG4gICAgLy8gQUxSRUFEWSBhYm9ydGVkIChhIGRlY2lkZXIgZW50ZXJlZCBhZnRlciBhIGNhbmNlbCDigJQgbm8gYWJvcnQgY2hlY2sgcHJlY2VkZXMgaXQpIGRvZXMgbm90IGZlbmNlIHRoZSBhdHRlbXB0XG4gICAgLy8gYmVmb3JlIGl0IHJ1bnM6IGl0IHJ1bnMgYXMgaXQgZGlkIGJlZm9yZSB0aGUgZmVuY2UgZXhpc3RlZCwgYW5kIGlzIGZlbmNlZCB3aGVuIGl0IGVuZHMgd2l0aG91dCBhbiBhbnN3ZXIuXG4gICAgdGhpcy5jb21wb3NlZC5zaWduYWwuYWRkRXZlbnRMaXN0ZW5lcignYWJvcnQnLCB0aGlzLm9uQWJvcnQsIHsgb25jZTogdHJ1ZSB9KTtcbiAgICBjb25zdCBzaWduYWwgPSB0aGlzLmNvbXBvc2VkLnNpZ25hbDtcbiAgICBjb25zdCBjYXBNcyA9IHRoaXMuY2FwTXM7XG4gICAgdGhpcy5jb250ZXh0ID0gT2JqZWN0LmZyZWV6ZSh7XG4gICAgICBzZXJpZXM6IG9wdGlvbnMuc2VyaWVzLFxuICAgICAgYXR0ZW1wdCxcbiAgICAgIG9mLFxuICAgICAgc2lnbmFsLFxuICAgICAgLi4uKGRlYWRsaW5lICE9PSB1bmRlZmluZWQgJiYgeyBkZWFkbGluZSB9KSxcbiAgICAgIC4uLihjYXBNcyAhPT0gdW5kZWZpbmVkICYmIHsgdGltZW91dE1zOiBjYXBNcyB9KSxcbiAgICAgIC4uLihvcHRpb25zLmVmZmVjdCAhPT0gdW5kZWZpbmVkICYmIHsgc3lzdGVtOiBvcHRpb25zLmVmZmVjdC5zeXN0ZW0gfSksXG4gICAgICAuLi4ob3B0aW9ucy5lZmZlY3Q/LmlkZW1wb3RlbmN5S2V5ICE9PSB1bmRlZmluZWQgJiYgeyBpZGVtcG90ZW5jeUtleTogb3B0aW9ucy5lZmZlY3QuaWRlbXBvdGVuY3lLZXkgfSksXG4gICAgICB0aW1lTGVmdE1zOiAoKSA9PiAoZGVhZGxpbmUgPT09IHVuZGVmaW5lZCA/IEluZmluaXR5IDogZGVhZGxpbmUgLSBub3coKSksXG4gICAgICBvYnNlcnZlZDogKHJlcG9ydDogT2JzZXJ2ZWRBdHRlbXB0KSA9PiB7XG4gICAgICAgIGlmICghb3B0aW9ucy5vYnNlcnZlKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignb2JzZXJ2ZWQoKTogcmVwb3J0IGFuIG91dHNpZGUgYXR0ZW1wdCB0aHJvdWdoIGBzY29wZS4kYXR0ZW1wdCgpLm9ic2VydmVkKC4uLilgJyk7XG4gICAgICAgIH1cbiAgICAgICAgb3B0aW9ucy5vYnNlcnZlKHJlcG9ydCwgeyBhdHRlbXB0LCBlbmRlZDogdGhpcy5lbmRlZCB9KTtcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgaWYgKGNhcE1zICE9PSB1bmRlZmluZWQpIEFUVEVNUFRfRU5EUy5zZXQodGhpcy5jb250ZXh0LCBzdGFydGVkQXQgKyBjYXBNcyk7XG4gIH1cblxuICAvKiogYHZhbHVlYCwgb3IgdGhlIGF0dGVtcHQgc2lnbmFsJ3MgcmVhc29uIHRoZSBtb21lbnQgaXQgYWJvcnRzIGZpcnN0IOKAlCB0aGUgZW5naW5lIHN0b3BzIHdhaXRpbmcgYXQgdGhlIGNhcC4gKi9cbiAgcmFjZTxUPih2YWx1ZTogUHJvbWlzZTxUPiB8IFQpOiBQcm9taXNlPFQ+IHwgVCB7XG4gICAgaWYgKCEodmFsdWUgaW5zdGFuY2VvZiBQcm9taXNlKSkgcmV0dXJuIHZhbHVlO1xuICAgIGNvbnN0IHNpZ25hbCA9IHRoaXMuY29tcG9zZWQuc2lnbmFsO1xuICAgIHJldHVybiBuZXcgUHJvbWlzZTxUPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCBvbkFib3J0ID0gKCkgPT4gcmVqZWN0KHNpZ25hbC5yZWFzb24pO1xuICAgICAgdmFsdWUudGhlbihcbiAgICAgICAgKHYpID0+IHtcbiAgICAgICAgICBzaWduYWwucmVtb3ZlRXZlbnRMaXN0ZW5lcignYWJvcnQnLCBvbkFib3J0KTtcbiAgICAgICAgICByZXNvbHZlKHYpO1xuICAgICAgICB9LFxuICAgICAgICAoZTogdW5rbm93bikgPT4ge1xuICAgICAgICAgIHNpZ25hbC5yZW1vdmVFdmVudExpc3RlbmVyKCdhYm9ydCcsIG9uQWJvcnQpO1xuICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgfSxcbiAgICAgICk7XG4gICAgICAvLyBBbHJlYWR5IGFib3J0ZWQgKHRoZSBmdW5jdGlvbiBhYm9ydGVkIGl0IGFzIGl0IHJhbik6IGEgdmFsdWUgdGhhdCBhbHJlYWR5IHNldHRsZWQgc3RpbGwgd2lucyDigJQgaXRzXG4gICAgICAvLyByZWFjdGlvbiB3YXMgcXVldWVkIGFib3ZlLCBmaXJzdCDigJQgYW5kIGEgcGVuZGluZyBvbmUgaXMgY3V0IG9uIHRoZSBuZXh0IG1pY3JvdGFzay5cbiAgICAgIGlmIChzaWduYWwuYWJvcnRlZCkgcXVldWVNaWNyb3Rhc2sob25BYm9ydCk7XG4gICAgICBlbHNlIHNpZ25hbC5hZGRFdmVudExpc3RlbmVyKCdhYm9ydCcsIG9uQWJvcnQsIHsgb25jZTogdHJ1ZSB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBUaGUgYXR0ZW1wdCBpcyBvdmVyOiByZWxlYXNlIHRoZSB0aW1lciBhbmQgdGhlIGxpc3RlbmVyczsgZmVuY2UgaXQgaWYgaXQgZW5kZWQgd2l0aG91dCBhbiBhbnN3ZXIuICovXG4gIGVuZChvdXRjb21lOiBBdHRlbXB0T3V0Y29tZSk6IHZvaWQge1xuICAgIHRoaXMuZW5kZWQgPSB0cnVlO1xuICAgIHRoaXMuY2FuY2VsVGltZXI/LigpO1xuICAgIHRoaXMuY29tcG9zZWQuc2lnbmFsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgdGhpcy5vbkFib3J0KTtcbiAgICB0aGlzLmNvbXBvc2VkLmRpc3Bvc2UoKTtcbiAgICBpZiAob3V0Y29tZSAhPT0gJ29rJyAmJiBvdXRjb21lICE9PSAncGF1c2VkJykgdGhpcy5hYmFuZG9uKCk7XG4gIH1cblxuICAvKiogRmVuY2UgYW4gYXR0ZW1wdCB0aGF0IHN0YXJ0ZWQgdW5kZXIgYW4gYWxyZWFkeS1hYm9ydGVkIHNpZ25hbCwgb25jZSBpdHMgc3luY2hyb25vdXMgcGFydCBoYXMgcnVuLiAqL1xuICBhYmFuZG9uU3RhcnRlZCgpOiB2b2lkIHtcbiAgICB0aGlzLmFiYW5kb24oKTtcbiAgfVxuXG4gIHByaXZhdGUgYWJhbmRvbigpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5hYmFuZG9uZWQpIHJldHVybjtcbiAgICB0aGlzLmFiYW5kb25lZCA9IHRydWU7XG4gICAgdGhpcy5vcHRpb25zLm9uQWJhbmRvbj8uKHRoaXMuYXR0ZW1wdCk7XG4gIH1cbn1cblxuLyoqIFRoZSBzaWduYWwgYWJvcnRlZCBhdCBhIHRpbWUgbGltaXQg4oCUIHRoZSBydW4ncyBkZWFkbGluZSwgb3IgYSBjYWxsJ3MgYXR0ZW1wdCBjYXAg4oCUIG5vdCBieSBhIGNhbmNlbGxhdGlvbi4gKi9cbmZ1bmN0aW9uIHRpbWVkT3V0KHNpZ25hbDogQWJvcnRTaWduYWwgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgcmV0dXJuIHNpZ25hbD8uYWJvcnRlZCA9PT0gdHJ1ZSAmJiBpc0RlYWRsaW5lUmVhc29uKHNpZ25hbC5yZWFzb24pO1xufVxuXG4vKipcbiAqIEhvdyB0aGUgYXR0ZW1wdCBpdHNlbGYgZW5kZWQuIEEgdGhyb3duIHZhbHVlIGlzIHRoZSBhdHRlbXB0J3Mgb3duIGZhaWx1cmUgdW5sZXNzIGl0IElTIHdoYXQgYSBzaWduYWwgYWJvcnRlZFxuICogd2l0aCAoU3RhZ2VSdW5uZXIncyByYWNlIHJlamVjdHMgd2l0aCBpdDsgYSBzdGFnZSBtYXkgcmV0aHJvdyBpdCk6IGl0cyBvd24gY2FwJ3MgYEF0dGVtcHRUaW1lb3V0RXJyb3JgIG9yIHRoZVxuICogcnVuJ3MgZGVhZGxpbmUg4oaSIGAndGltZW91dCdgOyB0aGUgcnVuJ3MgY2FuY2VsbGF0aW9uIOKGkiBgJ2Fib3J0ZWQnYC5cbiAqL1xuZnVuY3Rpb24gb3V0Y29tZU9mKFxuICBmYWlsdXJlOiBGYWlsdXJlIHwgdW5kZWZpbmVkLFxuICBzaWduYWw6IEFib3J0U2lnbmFsIHwgdW5kZWZpbmVkLFxuICB0aW1lb3V0UmVhc29uOiBBdHRlbXB0VGltZW91dEVycm9yIHwgdW5kZWZpbmVkLFxuKTogQXR0ZW1wdE91dGNvbWUge1xuICBpZiAoIWZhaWx1cmUpIHJldHVybiAnb2snO1xuICAvLyBBbiBgaW50ZXJydXB0KClgIHRocm93biBpbnNpZGUgYSBjYWxsIGlzIGNvbnZlcnRlZCB0byBhIHBhdXNlIGF0IHRoZSBzdGFnZSBib3VuZGFyeSwgcGFzdCB0aGlzIHJ1bm5lci5cbiAgaWYgKGlzUGF1c2VTaWduYWwoZmFpbHVyZS5lcnJvcikgfHwgaXNJbnRlcnJ1cHRTaWduYWwoZmFpbHVyZS5lcnJvcikpIHJldHVybiAncGF1c2VkJztcbiAgLy8gSXRzIG93biBjYXAgcmFuIG91dCDigJQgdGhlIGF0dGVtcHQncyB0aW1lciBpcyB0aGUgb25lIHRoYXQgZmlyZWQsIGFuZCB0aGUgYXR0ZW1wdCB0aHJldyB3aGF0IGl0IGFib3J0ZWQgd2l0aC5cbiAgaWYgKHRpbWVvdXRSZWFzb24gIT09IHVuZGVmaW5lZCAmJiBmYWlsdXJlLmVycm9yID09PSB0aW1lb3V0UmVhc29uKSByZXR1cm4gJ3RpbWVvdXQnO1xuICBpZiAoc2lnbmFsPy5hYm9ydGVkICE9PSB0cnVlIHx8IGZhaWx1cmUuZXJyb3IgIT09IHNpZ25hbC5yZWFzb24pIHJldHVybiAnZmFpbGVkJztcbiAgLy8gVGhlIHJ1bidzIHNpZ25hbCBlbmRlZCBpdDogYXQgdGhlIGRlYWRsaW5lIHRoZSBhdHRlbXB0IHJhbiBvdXQgb2YgdGltZSAobGF3IDQpOyBvdGhlcndpc2UgaXQgd2FzIGNhbmNlbGxlZC5cbiAgcmV0dXJuIGlzRGVhZGxpbmVSZWFzb24oc2lnbmFsLnJlYXNvbikgPyAndGltZW91dCcgOiAnYWJvcnRlZCc7XG59XG5cbi8qKlxuICogT25lIGF0dGVtcHQncyBkZWNpc2lvbiBpbnB1dHMsIGVhY2ggcmVhZCBvbmx5IHdoZW4gYSBydWxlIHJlYWNoZXMgaXQgKGBkZWNpZGVBdHRlbXB0YCdzIHJlYWRlcik6IHRoZSB1c2VyJ3NcbiAqIGByZXRyeU9uYCBhbmQgYGJhY2tvZmZNc2AgcnVuIGF0IG1vc3Qgb25jZSBlYWNoLCBhbmQgb25seSB3aGVuIHRoZSA5LjE1IGxvb3Agd291bGQgaGF2ZSBydW4gdGhlbS5cbiAqL1xuY2xhc3MgQXR0ZW1wdElucHV0UmVhZGVyIHtcbiAgLyoqIFRoZSBmYWlsdXJlIGEgY2F0ZWdvcnkgYW5kIGEgc2VydmVkIGVycm9yIGFyZSByZWFkIGZyb20g4oCUIG5vbmUgZm9yIGAnb2snYCBhbmQgYCdwYXVzZWQnYC4gKi9cbiAgcmVhZG9ubHkgZmFpbGVkOiBGYWlsdXJlIHwgdW5kZWZpbmVkO1xuICAvKiogYHRydWVgIG9uY2UgYHJldHJ5T25gIHRocmV3IChpdHMgdmVyZGljdCBpcyB0aGVuIGBmYWxzZWApLiAqL1xuICByZXRyeU9uVGhyZXcgPSBmYWxzZTtcbiAgcHJpdmF0ZSByZXRyeU9uVmVyZGljdDogYm9vbGVhbiB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSB3YWl0OiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgZmFpbHVyZUNhdGVnb3J5OiBBdHRlbXB0Q2F0ZWdvcnkgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgY2F0ZWdvcnlSZWFkID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSBsZWZ0OiBudW1iZXIgfCB1bmRlZmluZWQ7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBwb2xpY3k6IFJldHJ5UG9saWN5LFxuICAgIHByaXZhdGUgcmVhZG9ubHkgb3B0aW9uczogQXR0ZW1wdFJ1bk9wdGlvbnMsXG4gICAgcHJpdmF0ZSByZWFkb25seSBhdHRlbXB0OiBudW1iZXIsXG4gICAgcHJpdmF0ZSByZWFkb25seSBvZjogbnVtYmVyLFxuICAgIHJlYWRvbmx5IG91dGNvbWU6IEF0dGVtcHRPdXRjb21lLFxuICAgIGZhaWx1cmU6IEZhaWx1cmUgfCB1bmRlZmluZWQsXG4gICAgcHJpdmF0ZSByZWFkb25seSBkZWFkbGluZTogbnVtYmVyIHwgdW5kZWZpbmVkLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgbm93OiAoKSA9PiBudW1iZXIsXG4gICkge1xuICAgIHRoaXMuZmFpbGVkID0gZmFpbHVyZSAmJiBvdXRjb21lICE9PSAncGF1c2VkJyA/IGZhaWx1cmUgOiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKiogT25lIGlucHV0IGJ5IGl0cyBgQXR0ZW1wdElucHV0c2Aga2V5LiAqL1xuICByZWFkb25seSByZWFkID0gKGtleTogc3RyaW5nKTogdW5rbm93biA9PiB7XG4gICAgc3dpdGNoIChrZXkpIHtcbiAgICAgIGNhc2UgJ291dGNvbWUnOlxuICAgICAgICByZXR1cm4gdGhpcy5vdXRjb21lO1xuICAgICAgY2FzZSAnY2F0ZWdvcnknOlxuICAgICAgICByZXR1cm4gdGhpcy5jYXRlZ29yeSgpO1xuICAgICAgY2FzZSAnYWJvcnRlZCc6XG4gICAgICAgIC8vIExpdmU6IGEgZGVjaXNpb24gdGFrZW4gYWdhaW4gYWZ0ZXIgYHJldHJ5T25gIHNlZXMgYW4gYWJvcnQgcmFpc2VkIGluc2lkZSBpdC4gVGhlIGRlYWRsaW5lIGlzIG5vdCBhXG4gICAgICAgIC8vIGNhbmNlbGxhdGlvbiDigJQgcnVsZSA2IG93bnMgaXQuXG4gICAgICAgIHJldHVybiBpc0NhbmNlbGxlZCh0aGlzLm9wdGlvbnMuc2lnbmFsKTtcbiAgICAgIGNhc2UgJ2F0dGVtcHQnOlxuICAgICAgICByZXR1cm4gdGhpcy5hdHRlbXB0O1xuICAgICAgY2FzZSAnb2YnOlxuICAgICAgICByZXR1cm4gdGhpcy5vZjtcbiAgICAgIGNhc2UgJ3RpbWVMZWZ0TXMnOlxuICAgICAgICByZXR1cm4gdGhpcy50aW1lTGVmdCgpO1xuICAgICAgY2FzZSAndGltZUxlZnRBZnRlcldhaXRNcyc6XG4gICAgICAgIC8vIFdpdGhvdXQgYSBkZWFkbGluZSB0aGUgdGltZSBsZWZ0IGlzIHVuYm91bmRlZCwgYmVmb3JlIGFueSB3YWl0IGFuZCBhZnRlciBpdCDigJQgc28gZGVjaWRpbmcgbmVlZHMgbm9cbiAgICAgICAgLy8gd2FpdCwgYW5kIGBiYWNrb2ZmTXNgIGlzIGFza2VkIGFmdGVyIHRoZSBkaXNjYXJkLCBhcyBpbiA5LjE1LiBVbmRlciBvbmUsIHRoZSB3YWl0J3MgbGVuZ3RoIGRlY2lkZXMuXG4gICAgICAgIHJldHVybiB0aGlzLnVuYm91bmRlZCgpID8gSW5maW5pdHkgOiB0aGlzLnRpbWVMZWZ0KCkgLSB0aGlzLmRlbGF5TXMoKTtcbiAgICAgIGNhc2UgJ2RlbGF5TXMnOlxuICAgICAgICByZXR1cm4gdGhpcy5kZWxheU1zKCk7XG4gICAgICBjYXNlICdyZXRyeU9uJzpcbiAgICAgICAgcmV0dXJuIHRoaXMucmV0cnlPbigpO1xuICAgICAgY2FzZSAna2V5UHJlc2VudCc6XG4gICAgICAgIHJldHVybiB0aGlzLm9wdGlvbnMuZWZmZWN0Py5pZGVtcG90ZW5jeUtleSAhPT0gdW5kZWZpbmVkO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gIH07XG5cbiAgLyoqIFRoZSBmYWlsdXJlJ3MgY2F0ZWdvcnksIHJlYWQgb25jZSDigJQgYXQgdGhlIGZpcnN0IHJ1bGUgdGhhdCBhc2tzLCBvciBhZnRlciB0aGUgZGVjaXNpb24uICovXG4gIGNhdGVnb3J5KCk6IEF0dGVtcHRDYXRlZ29yeSB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCF0aGlzLmNhdGVnb3J5UmVhZCkge1xuICAgICAgdGhpcy5jYXRlZ29yeVJlYWQgPSB0cnVlO1xuICAgICAgdGhpcy5mYWlsdXJlQ2F0ZWdvcnkgPSB0aGlzLmZhaWxlZCA/IGVycm9yQ2F0ZWdvcnkodGhpcy5mYWlsZWQuZXJyb3IsIHRoaXMub3V0Y29tZSkgOiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmZhaWx1cmVDYXRlZ29yeTtcbiAgfVxuXG4gIC8qKiBUaGUgcG9saWN5J3Mgd2FpdCBhZnRlciB0aGlzIGF0dGVtcHQgKGByZXNvbHZlQmFja29mZk1zYCksIGFza2VkIG9uY2Ug4oCUIGNhcHBlZCBhdCBpdHMgYG1heEJhY2tvZmZNc2AuICovXG4gIGRlbGF5TXMoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gKHRoaXMud2FpdCA/Pz0gY2FwcGVkV2FpdE1zKFxuICAgICAgcmVzb2x2ZUJhY2tvZmZNcyh0aGlzLnBvbGljeS5iYWNrb2ZmTXMsIHRoaXMuYXR0ZW1wdCwgdGhpcy5mYWlsZWQ/LmVycm9yKSxcbiAgICAgIHRoaXMucG9saWN5Lm1heEJhY2tvZmZNcyxcbiAgICApKTtcbiAgfVxuXG4gIC8qKiBUaGUgd2FpdCwgaWYgdGhlIGRlY2lzaW9uIGFscmVhZHkgYXNrZWQgZm9yIGl0IChydWxlIDYgdW5kZXIgYSBkZWFkbGluZSk7IG5ldmVyIGFza3MgYGJhY2tvZmZNc2AgaXRzZWxmLiAqL1xuICBkZWxheUlmQXNrZWQoKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy53YWl0O1xuICB9XG5cbiAgLyoqIE1pbGxpc2Vjb25kcyBiZWZvcmUgdGhlIGRlYWRsaW5lIGF0IHRoZSBkZWNpc2lvbiwgcmVhZCBvbmNlIChgSW5maW5pdHlgIHdpdGhvdXQgb25lKS4gKi9cbiAgdGltZUxlZnQoKTogbnVtYmVyIHtcbiAgICBpZiAodGhpcy51bmJvdW5kZWQoKSkgcmV0dXJuIEluZmluaXR5O1xuICAgIGlmICh0aGlzLmxlZnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgY2xvY2sgPSB0aGlzLmRlYWRsaW5lID09PSB1bmRlZmluZWQgPyBJbmZpbml0eSA6IHRoaXMuZGVhZGxpbmUgLSB0aGlzLm5vdygpO1xuICAgICAgLy8gQSB0aW1lIGxpbWl0IGFscmVhZHkgcmVhY2hlZCDigJQgdGhlIHNpZ25hbCBhYm9ydGVkIGF0IHRoZSBkZWFkbGluZSAob3IsIGZvciBhIGNhbGwsIGF0IGl0cyBhdHRlbXB0J3MgY2FwKSDigJRcbiAgICAgIC8vIGxlYXZlcyBubyB0aW1lLCB3aGF0ZXZlciB0aGUgY2xvY2sgc2F5czogYSBob3N0IHRpbWVyIG1heSBmaXJlIGEgbWlsbGlzZWNvbmQgYmVmb3JlIHRoZSBjbG9jayBnZXRzIHRoZXJlLlxuICAgICAgdGhpcy5sZWZ0ID0gdGltZWRPdXQodGhpcy5vcHRpb25zLnNpZ25hbCkgPyBNYXRoLm1pbihjbG9jaywgMCkgOiBjbG9jaztcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMubGVmdDtcbiAgfVxuXG4gIC8qKiBObyBkZWFkbGluZSBhbmQgbm8gdGltZSBsaW1pdCByZWFjaGVkOiB0aGUgdGltZSBsZWZ0IGlzIGBJbmZpbml0eWAsIGFuZCBubyB3YWl0IG5lZWQgYmUgYXNrZWQgZm9yLiAqL1xuICBwcml2YXRlIHVuYm91bmRlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5kZWFkbGluZSA9PT0gdW5kZWZpbmVkICYmICF0aW1lZE91dCh0aGlzLm9wdGlvbnMuc2lnbmFsKTtcbiAgfVxuXG4gIC8qKiBUaGUgYHJldHJ5T25gIGdhdGUsIGFza2VkIG9uY2UuIEEgdGhyb3dpbmcgcHJlZGljYXRlIGlzIFwiZG8gbm90IHJldHJ5XCIg4oCUIGEgYnJva2VuIG9uZSBuZXZlciBsb29wcy4gKi9cbiAgcHJpdmF0ZSByZXRyeU9uKCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLnJldHJ5T25WZXJkaWN0ID09PSB1bmRlZmluZWQpIHRoaXMucmV0cnlPblZlcmRpY3QgPSB0aGlzLmFza1JldHJ5T24oKTtcbiAgICByZXR1cm4gdGhpcy5yZXRyeU9uVmVyZGljdDtcbiAgfVxuXG4gIHByaXZhdGUgYXNrUmV0cnlPbigpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMucG9saWN5LnJldHJ5T24pIHJldHVybiB0cnVlO1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gdGhpcy5wb2xpY3kucmV0cnlPbih0aGlzLmZhaWxlZD8uZXJyb3IpID09PSB0cnVlO1xuICAgIH0gY2F0Y2ggKHRocm93bikge1xuICAgICAgdGhpcy5yZXRyeU9uVGhyZXcgPSB0cnVlO1xuICAgICAgdGhpcy5vcHRpb25zLm9uUmV0cnlPblRocmV3Py4odGhyb3duKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBSZXNvbHZlIGEgcG9saWN5J3MgYGJhY2tvZmZNc2AgZm9yIHRoZSBhdHRlbXB0IHRoYXQganVzdCBmYWlsZWQgKDEtYmFzZWQpIGFuZCBpdHMgZXJyb3IuIEFueXRoaW5nIHRoYXQgaXMgbm90IGEgZmluaXRlLFxuICogcG9zaXRpdmUgbnVtYmVyIOKAlCBhIG1pc3NpbmcgZGlhbCwgYSBuZWdhdGl2ZSB2YWx1ZSwgYSBgTmFOYCBmcm9tIGEgY29uc3VtZXIncyBhcml0aG1ldGljLCBvciBhIHRocm93aW5nXG4gKiBmdW5jdGlvbiDigJQgYmVjb21lcyBgMGAsIGkuZS4gcmV0cnkgaW1tZWRpYXRlbHkuIEEgYmFja29mZiBkaWFsIG11c3QgbmV2ZXIgYmUgYWJsZSB0byBjcmFzaCBhIHJ1biBvciBwYXJrIGl0XG4gKiBmb3JldmVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUJhY2tvZmZNcyhiYWNrb2ZmTXM6IFJldHJ5UG9saWN5WydiYWNrb2ZmTXMnXSwgYXR0ZW1wdDogbnVtYmVyLCBlcnJvcj86IHVua25vd24pOiBudW1iZXIge1xuICBpZiAoYmFja29mZk1zID09PSB1bmRlZmluZWQpIHJldHVybiAwO1xuICBsZXQgdmFsdWU6IHVua25vd247XG4gIGlmICh0eXBlb2YgYmFja29mZk1zID09PSAnZnVuY3Rpb24nKSB7XG4gICAgdHJ5IHtcbiAgICAgIHZhbHVlID0gYmFja29mZk1zKGF0dGVtcHQsIGVycm9yKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB2YWx1ZSA9IGJhY2tvZmZNcztcbiAgfVxuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyAmJiBOdW1iZXIuaXNGaW5pdGUodmFsdWUpICYmIHZhbHVlID4gMCA/IHZhbHVlIDogMDtcbn1cblxuLyoqXG4gKiBBd2FpdCBgbXNgLCBjdXQgc2hvcnQgYnkgYW4gYWJvcnQuIFJlc29sdmVzIGVpdGhlciB3YXkg4oCUIHRoZSBjYWxsZXIgcmUtY2hlY2tzIGBzaWduYWwuYWJvcnRlZGAgYW5kIHJldGhyb3dzXG4gKiB0aGUgYXR0ZW1wdCdzIG93biBlcnJvciwgc28gYSBjYW5jZWxsZWQgcnVuIG5ldmVyIHNpdHMgb3V0IGEgbG9uZyBiYWNrb2ZmIGFuZCBuZXZlciBsb3NlcyB0aGUgZmFpbHVyZSB0aGF0XG4gKiBjYXVzZWQgaXQuIFRoZSB0aW1lciBhbmQgdGhlIGxpc3RlbmVyIGFyZSBhbHdheXMgY2xlYW5lZCB1cC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNsZWVwKG1zOiBudW1iZXIsIHNpZ25hbD86IEFib3J0U2lnbmFsKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmIChzaWduYWw/LmFib3J0ZWQpIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgcmV0dXJuIG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiB7XG4gICAgY29uc3QgZG9uZSA9ICgpID0+IHtcbiAgICAgIGNhbmNlbCgpO1xuICAgICAgc2lnbmFsPy5yZW1vdmVFdmVudExpc3RlbmVyKCdhYm9ydCcsIGRvbmUpO1xuICAgICAgcmVzb2x2ZSgpO1xuICAgIH07XG4gICAgY29uc3QgY2FuY2VsID0gc2V0TG9uZ1RpbWVvdXQoZG9uZSwgbXMpO1xuICAgIHNpZ25hbD8uYWRkRXZlbnRMaXN0ZW5lcignYWJvcnQnLCBkb25lLCB7IG9uY2U6IHRydWUgfSk7XG4gIH0pO1xufVxuXG4vKipcbiAqIEhvdyBhIHJlY29yZCBlbmRlZCBpdHMgc2VyaWVzLCBhcyB0aGUgc3VtbWFyeSdzIGBsYXN0YCBzYXlzIGl0LiBPbiBhIHRvdWNoaW5nIHRhcmdldCB0aGUgZWZmZWN0IGlzIHRoZSBTRVJJRVMnXG4gKiAoYHVua25vd25Tb0ZhcmApOiB1bmtub3duIG9uY2UgYW55IGF0dGVtcHQgbGVmdCBpdCB1bmtub3duLCB1bmxlc3MgdGhlIHNlcmllcyBlbmRlZCB3aXRoIGFuIGFuc3dlci5cbiAqL1xuZnVuY3Rpb24gbGFzdE9mKHJlY29yZDogQXR0ZW1wdFJlY29yZCwgdW5rbm93blNvRmFyID0gZmFsc2UpOiBBdHRlbXB0U3VtbWFyeVsnbGFzdCddIHtcbiAgY29uc3QgZWZmZWN0ID0gcmVjb3JkLmVmZmVjdCAhPT0gdW5kZWZpbmVkICYmIHVua25vd25Tb0ZhciAmJiByZWNvcmQub3V0Y29tZSAhPT0gJ29rJyA/ICd1bmtub3duJyA6IHJlY29yZC5lZmZlY3Q7XG4gIHJldHVybiB7XG4gICAgbmV4dDogcmVjb3JkLm5leHQgYXMgQXR0ZW1wdFN1bW1hcnlbJ2xhc3QnXVsnbmV4dCddLFxuICAgIHJlYXNvbjogcmVjb3JkLnJlYXNvbixcbiAgICAuLi4ocmVjb3JkLmNhdGVnb3J5ICE9PSB1bmRlZmluZWQgJiYgeyBjYXRlZ29yeTogcmVjb3JkLmNhdGVnb3J5IH0pLFxuICAgIC4uLihyZWNvcmQucmV0cnlPblRocmV3ICYmIHsgcmV0cnlPblRocmV3OiB0cnVlIGFzIGNvbnN0IH0pLFxuICAgIC4uLihlZmZlY3QgIT09IHVuZGVmaW5lZCAmJiB7IGVmZmVjdCB9KSxcbiAgfTtcbn1cblxuLyoqIFBlci1vdXRjb21lIGNvdW50cyBvZiBhIHNlcmllcywgZm9yIGl0cyBzdW1tYXJ5LiAqL1xuY2xhc3MgU2VyaWVzVGFsbHkge1xuICBwcml2YXRlIHJlYWRvbmx5IGNvdW50cyA9IHsgY291bnQ6IDAsIG9rOiAwLCBmYWlsZWQ6IDAsIHRpbWVvdXQ6IDAsIGFib3J0ZWQ6IDAsIHBhdXNlZDogMCB9O1xuXG4gIGFkZChyZWNvcmQ6IEF0dGVtcHRSZWNvcmQpOiB2b2lkIHtcbiAgICB0aGlzLmNvdW50cy5jb3VudCArPSAxO1xuICAgIHRoaXMuY291bnRzW3JlY29yZC5vdXRjb21lXSArPSAxO1xuICB9XG5cbiAgc3VtbWFyeShsYXN0OiBBdHRlbXB0U3VtbWFyeVsnbGFzdCddKTogQXR0ZW1wdFN1bW1hcnkge1xuICAgIHJldHVybiBmcmVlemVEZWVwPEF0dGVtcHRTdW1tYXJ5Pih7IC4uLnRoaXMuY291bnRzLCBsYXN0IH0pO1xuICB9XG59XG4iXX0=