testcafe 2.3.1 → 2.6.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 (176) hide show
  1. package/CHANGELOG.md +129 -0
  2. package/LICENSE +1 -1
  3. package/README.md +40 -46
  4. package/bin/testcafe-with-v8-flag-filter.js +2 -2
  5. package/lib/api/test-controller/execution-context.js +4 -2
  6. package/lib/api/test-controller/index.js +6 -1
  7. package/lib/api/test-run-tracker.js +1 -1
  8. package/lib/browser/connection/gateway/index.js +273 -0
  9. package/lib/browser/connection/gateway/status.js +10 -0
  10. package/lib/browser/connection/index.js +60 -47
  11. package/lib/browser/connection/service-routes.js +4 -2
  12. package/lib/browser/provider/built-in/dedicated/chrome/cdp-client/index.js +3 -2
  13. package/lib/browser/provider/built-in/dedicated/chrome/index.js +48 -23
  14. package/lib/browser/provider/built-in/dedicated/edge/index.js +4 -1
  15. package/lib/browser/provider/index.js +13 -4
  16. package/lib/browser/provider/plugin-host.js +7 -1
  17. package/lib/cli/argument-parser/index.js +10 -14
  18. package/lib/cli/cli.js +3 -4
  19. package/lib/cli/remotes-wizard.js +2 -1
  20. package/lib/cli/utils/should-move-option-to-end.js +17 -0
  21. package/lib/client/automation/deps/hammerhead.js +24 -0
  22. package/lib/client/automation/deps/testcafe-core.js +24 -0
  23. package/lib/client/automation/index.js +528 -161
  24. package/lib/client/automation/index.min.js +1 -1
  25. package/lib/client/automation/playback/press/get-key-info.js +44 -0
  26. package/lib/client/automation/playback/press/utils.js +142 -0
  27. package/lib/client/automation/utils/get-key-code.js +15 -0
  28. package/lib/client/automation/utils/get-key-identifier.js +14 -0
  29. package/lib/client/automation/utils/is-letter.js +7 -0
  30. package/lib/client/automation/utils/key-identifier-maps.js +93 -0
  31. package/lib/client/browser/idle-page/index.html.mustache +2 -2
  32. package/lib/client/browser/idle-page/index.js +13 -8
  33. package/lib/client/core/index.js +58 -10
  34. package/lib/client/core/index.min.js +1 -1
  35. package/lib/client/core/utils/array.js +77 -0
  36. package/lib/client/core/utils/dom.js +459 -0
  37. package/lib/client/core/utils/send-request-to-frame.js +22 -0
  38. package/lib/client/core/utils/style.js +102 -0
  39. package/lib/client/core/utils/values/boundary-values.js +41 -0
  40. package/lib/client/driver/index.js +253 -224
  41. package/lib/client/driver/index.min.js +1 -1
  42. package/lib/client/test-run/iframe.js.mustache +6 -6
  43. package/lib/client/test-run/index.js.mustache +37 -33
  44. package/lib/client/ui/index.js +3238 -54
  45. package/lib/client/ui/index.min.js +1 -1
  46. package/lib/client/ui/sprite.svg +15 -0
  47. package/lib/client/ui/styles.css +184 -41
  48. package/lib/compiler/babel/load-libs.js +6 -6
  49. package/lib/compiler/compilers.js +7 -7
  50. package/lib/compiler/index.js +6 -6
  51. package/lib/compiler/interfaces.js +1 -1
  52. package/lib/compiler/test-file/api-based.js +5 -5
  53. package/lib/compiler/test-file/formats/es-next/compiler.js +5 -5
  54. package/lib/compiler/test-file/formats/typescript/compiler.js +9 -9
  55. package/lib/compiler/test-file/get-exportable-lib-path.js +3 -3
  56. package/lib/configuration/configuration-base.js +9 -6
  57. package/lib/configuration/default-values.js +3 -3
  58. package/lib/configuration/formats.js +9 -5
  59. package/lib/configuration/interfaces.js +1 -1
  60. package/lib/configuration/option-names.js +3 -3
  61. package/lib/configuration/run-option-names.js +2 -2
  62. package/lib/configuration/testcafe-configuration.js +41 -24
  63. package/lib/configuration/types.js +1 -1
  64. package/lib/configuration/utils.js +32 -0
  65. package/lib/custom-client-scripts/client-script.js +2 -2
  66. package/lib/custom-client-scripts/get-code.js +3 -3
  67. package/lib/custom-client-scripts/routing.js +10 -12
  68. package/lib/errors/runtime/templates.js +4 -2
  69. package/lib/errors/test-run/templates.js +4 -1
  70. package/lib/errors/types.js +4 -1
  71. package/lib/index.js +6 -29
  72. package/lib/live/test-runner.js +5 -3
  73. package/lib/native-automation/add-custom-debug-formatters.js +22 -0
  74. package/lib/native-automation/api-base.js +27 -0
  75. package/lib/native-automation/client/event-descriptor.js +112 -0
  76. package/lib/native-automation/client/input.js +50 -0
  77. package/lib/native-automation/client/key-press/utils.js +31 -0
  78. package/lib/native-automation/client/types.js +11 -0
  79. package/lib/native-automation/client/utils.js +54 -0
  80. package/lib/native-automation/cookie-provider.js +115 -0
  81. package/lib/native-automation/empty-page-markup.js +11 -0
  82. package/lib/native-automation/error-route.js +7 -0
  83. package/lib/native-automation/errors.js +20 -0
  84. package/lib/native-automation/index.js +53 -0
  85. package/lib/native-automation/request-hooks/event-factory/frame-navigated-event-based.js +40 -0
  86. package/lib/native-automation/request-hooks/event-factory/request-paused-event-based.js +94 -0
  87. package/lib/native-automation/request-hooks/event-provider.js +52 -0
  88. package/lib/native-automation/request-hooks/pipeline-context.js +11 -0
  89. package/lib/{proxyless → native-automation}/request-pipeline/constants.js +1 -1
  90. package/lib/native-automation/request-pipeline/context-info.js +55 -0
  91. package/lib/native-automation/request-pipeline/index.js +309 -0
  92. package/lib/native-automation/request-pipeline/resendAuthRequest.js +23 -0
  93. package/lib/native-automation/request-pipeline/safe-api.js +63 -0
  94. package/lib/native-automation/request-pipeline/special-handlers.js +73 -0
  95. package/lib/native-automation/request-pipeline/test-run-bridge.js +45 -0
  96. package/lib/native-automation/resource-injector.js +175 -0
  97. package/lib/native-automation/session-storage/index.js +43 -0
  98. package/lib/native-automation/storages-provider.js +17 -0
  99. package/lib/native-automation/types.js +12 -0
  100. package/lib/native-automation/utils/cdp.js +70 -0
  101. package/lib/native-automation/utils/convert.js +11 -0
  102. package/lib/native-automation/utils/get-active-client.js +8 -0
  103. package/lib/native-automation/utils/headers.js +30 -0
  104. package/lib/native-automation/utils/string.js +32 -0
  105. package/lib/reporter/index.js +52 -4
  106. package/lib/reporter/interfaces.js +1 -1
  107. package/lib/reporter/plugin-host.js +44 -4
  108. package/lib/reporter/plugin-methods.js +2 -1
  109. package/lib/reporter/report-data-log.js +25 -0
  110. package/lib/runner/bootstrapper.js +38 -6
  111. package/lib/runner/index.js +87 -47
  112. package/lib/runner/interfaces.js +1 -1
  113. package/lib/runner/task/index.js +1 -29
  114. package/lib/runner/test-run-controller.js +45 -1
  115. package/lib/services/compiler/host.js +3 -3
  116. package/lib/services/compiler/interfaces.js +1 -1
  117. package/lib/services/compiler/service.js +6 -5
  118. package/lib/services/compiler/test-run-proxy.js +3 -2
  119. package/lib/services/interfaces.js +1 -1
  120. package/lib/services/serialization/replicator/transforms/command-base-trasform/command-constructors.js +2 -1
  121. package/lib/shared/errors/index.js +8 -2
  122. package/lib/shared/utils/is-file-protocol.js +2 -2
  123. package/lib/test-run/commands/actions.js +16 -4
  124. package/lib/test-run/commands/type.js +2 -1
  125. package/lib/test-run/cookies/base.js +4 -1
  126. package/lib/test-run/cookies/factory.js +4 -4
  127. package/lib/test-run/cookies/provider.js +9 -2
  128. package/lib/test-run/execute-js-expression/index.js +4 -2
  129. package/lib/test-run/index.js +29 -22
  130. package/lib/test-run/request/create-request-options.js +37 -24
  131. package/lib/test-run/request/send.js +2 -3
  132. package/lib/test-run/role-provider.js +5 -5
  133. package/lib/test-run/session-controller.js +5 -5
  134. package/lib/test-run/storages/factory.js +4 -4
  135. package/lib/testcafe.js +17 -10
  136. package/lib/utils/check-is-vm.js +58 -0
  137. package/lib/utils/debug-loggers.js +7 -7
  138. package/lib/utils/get-browser.js +5 -2
  139. package/lib/utils/get-options/boolean-or-object-option.js +18 -0
  140. package/lib/utils/get-options/quarantine.js +10 -13
  141. package/lib/utils/get-options/skip-js-errors.js +12 -16
  142. package/lib/utils/parse-user-agent.js +4 -12
  143. package/lib/utils/string.js +1 -1
  144. package/package.json +13 -9
  145. package/ts-defs/index.d.ts +12 -2
  146. package/ts-defs/selectors.d.ts +8 -1
  147. package/ts-defs/testcafe-scripts.d.ts +8 -1
  148. package/lib/browser/connection/gateway.js +0 -205
  149. package/lib/proxyless/add-custom-debug-formatters.js +0 -22
  150. package/lib/proxyless/api-base.js +0 -25
  151. package/lib/proxyless/client/event-simulator.js +0 -40
  152. package/lib/proxyless/client/types.js +0 -11
  153. package/lib/proxyless/client/utils.js +0 -24
  154. package/lib/proxyless/cookie-provider.js +0 -87
  155. package/lib/proxyless/default-setup-options.js +0 -9
  156. package/lib/proxyless/empty-page-markup.js +0 -11
  157. package/lib/proxyless/error-route.js +0 -7
  158. package/lib/proxyless/index.js +0 -53
  159. package/lib/proxyless/request-hooks/event-factory/frame-navigated-event-based.js +0 -40
  160. package/lib/proxyless/request-hooks/event-factory/request-paused-event-based.js +0 -95
  161. package/lib/proxyless/request-hooks/event-provider.js +0 -52
  162. package/lib/proxyless/request-hooks/pipeline-context.js +0 -11
  163. package/lib/proxyless/request-pipeline/context-info.js +0 -55
  164. package/lib/proxyless/request-pipeline/index.js +0 -230
  165. package/lib/proxyless/request-pipeline/resendAuthRequest.js +0 -23
  166. package/lib/proxyless/request-pipeline/safe-api.js +0 -62
  167. package/lib/proxyless/request-pipeline/special-handlers.js +0 -73
  168. package/lib/proxyless/request-pipeline/test-run-bridge.js +0 -45
  169. package/lib/proxyless/resource-injector.js +0 -162
  170. package/lib/proxyless/session-storage/index.js +0 -39
  171. package/lib/proxyless/storages-provider.js +0 -17
  172. package/lib/proxyless/types.js +0 -10
  173. package/lib/proxyless/utils/cdp.js +0 -66
  174. package/lib/proxyless/utils/get-active-client.js +0 -8
  175. package/lib/proxyless/utils/headers.js +0 -30
  176. package/lib/proxyless/utils/string.js +0 -32
@@ -28,8 +28,8 @@ const fs_1 = __importDefault(require("fs"));
28
28
  const debug_1 = __importDefault(require("debug"));
29
29
  const debugLog = (0, debug_1.default)('testcafe:reporter');
30
30
  class Reporter {
31
- constructor(plugin, messageBus, outStream, name) {
32
- this.plugin = new plugin_host_1.default(plugin, outStream, name);
31
+ constructor({ name, plugin, outStream, messageBus, reporterPluginHooks }) {
32
+ this.plugin = new plugin_host_1.default(plugin, outStream, name, reporterPluginHooks);
33
33
  this.messageBus = messageBus;
34
34
  this.disposed = false;
35
35
  this.taskInfo = null;
@@ -76,12 +76,14 @@ class Reporter {
76
76
  _assignMessageBusEventHandlers() {
77
77
  const messageBus = this.messageBus;
78
78
  messageBus.on('warning-add', async (e) => await this._onWarningAddHandler(e));
79
+ messageBus.on('report-data', async (e) => await this._onReportDataHandler(e));
79
80
  messageBus.once('start', async (task) => await this._onceTaskStartHandler(task));
80
81
  messageBus.on('test-run-start', async (testRun) => await this._onTaskTestRunStartHandler(testRun));
81
82
  messageBus.on('test-run-done', async (testRun) => await this._onTaskTestRunDoneHandler(testRun));
82
83
  messageBus.on('test-action-start', async (e) => await this._onTaskTestActionStart(e));
83
84
  messageBus.on('test-action-done', async (e) => await this._onTaskTestActionDone(e));
84
85
  messageBus.once('done', async () => await this._onceTaskDoneHandler());
86
+ messageBus.once('unhandled-rejection', async () => await this._onceTaskDoneHandler());
85
87
  }
86
88
  async dispose() {
87
89
  var _a;
@@ -159,6 +161,7 @@ class Reporter {
159
161
  pendingTestRunDonePromise: Reporter._createPendingPromise(),
160
162
  pendingTestRunStartPromise: Reporter._createPendingPromise(),
161
163
  browsers: [],
164
+ reportData: {},
162
165
  };
163
166
  }
164
167
  static _createTestQueue(task) {
@@ -169,6 +172,7 @@ class Reporter {
169
172
  return {
170
173
  errs: (0, lodash_1.sortBy)(reportItem.errs, ['userAgent', 'code']),
171
174
  warnings: reportItem.warnings,
175
+ reportData: reportItem.reportData,
172
176
  durationMs: +new Date() - reportItem.startTime,
173
177
  unstable: reportItem.unstable,
174
178
  screenshotPath: reportItem.screenshotPath,
@@ -291,7 +295,7 @@ class Reporter {
291
295
  const startTime = task.startTime;
292
296
  const browserConnectionsInfo = []
293
297
  .concat(...task.browserConnectionGroups)
294
- .map(connection => connection.connectionInfo);
298
+ .map(connection => connection.userAgent);
295
299
  const first = this.taskInfo.testQueue[0];
296
300
  const taskProperties = {
297
301
  configuration: task.opts,
@@ -362,6 +366,8 @@ class Reporter {
362
366
  reportItem.unstable = reportItem.unstable || testRun.unstable;
363
367
  reportItem.errs = reportItem.errs.concat(testRun.errs);
364
368
  reportItem.warnings = testRun.warningLog ? (0, lodash_1.union)(reportItem.warnings, testRun.warningLog.messages) : [];
369
+ reportItem.reportData = reportItem.reportData || {};
370
+ reportItem.reportData[testRun.id] = testRun.reportDataLog ? testRun.reportDataLog.data : [];
365
371
  if (testRun.quarantine) {
366
372
  reportItem.quarantine = reportItem.quarantine || {};
367
373
  const reportItemQuarantine = testRun.quarantine.attempts.reduce((result, { errors, testRunId }) => {
@@ -433,7 +439,49 @@ class Reporter {
433
439
  });
434
440
  this.taskInfo.pendingTaskDonePromise.resolve();
435
441
  }
442
+ _prepareReportDataEventArgs(testRun) {
443
+ const { test, browser, id } = testRun;
444
+ const fixture = test.fixture;
445
+ const testInfo = {
446
+ name: test.name,
447
+ id: test.id,
448
+ meta: test.meta,
449
+ };
450
+ const fixtureInfo = {
451
+ name: fixture === null || fixture === void 0 ? void 0 : fixture.name,
452
+ id: fixture === null || fixture === void 0 ? void 0 : fixture.id,
453
+ meta: fixture === null || fixture === void 0 ? void 0 : fixture.meta,
454
+ path: fixture === null || fixture === void 0 ? void 0 : fixture.path,
455
+ };
456
+ return {
457
+ test: testInfo,
458
+ fixture: fixtureInfo,
459
+ testRunId: id,
460
+ browser,
461
+ };
462
+ }
463
+ async _onReportDataHandler({ testRun, data }) {
464
+ if (!this.taskInfo)
465
+ return;
466
+ const testRunInfo = this._prepareReportDataEventArgs(testRun);
467
+ await this.dispatchToPlugin({
468
+ method: plugin_methods_1.default.reportData,
469
+ initialObject: this.taskInfo.task,
470
+ args: [
471
+ testRunInfo,
472
+ ...data,
473
+ ],
474
+ });
475
+ }
476
+ _resolvePluginHooks(reporterHooks, name) {
477
+ if (!reporterHooks)
478
+ return void 0;
479
+ const resultHooks = {};
480
+ if (reporterHooks.onBeforeWrite && reporterHooks.onBeforeWrite[name])
481
+ resultHooks.onBeforeWrite = reporterHooks.onBeforeWrite[name];
482
+ return resultHooks;
483
+ }
436
484
  }
437
485
  exports.default = Reporter;
438
486
  module.exports = exports.default;
439
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcmVwb3J0ZXIvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLG1DQUtnQjtBQUVoQix5Q0FBeUQ7QUFDekQsZ0VBQStDO0FBQy9DLHNFQUFvRDtBQUNwRCw4RUFBcUQ7QUFDckQsK0NBQXdEO0FBZ0J4RCxnREFBMEU7QUFDMUUsdUdBQTRFO0FBQzVFLHdEQUErQjtBQUMvQixnREFBd0I7QUFDeEIsNENBQW9CO0FBSXBCLGtEQUEwQjtBQTBGMUIsTUFBTSxRQUFRLEdBQUcsSUFBQSxlQUFLLEVBQUMsbUJBQW1CLENBQUMsQ0FBQztBQUU1QyxNQUFxQixRQUFRO0lBT3pCLFlBQW9CLE1BQXNCLEVBQUUsVUFBc0IsRUFBRSxTQUFtQixFQUFFLElBQVk7UUFDakcsSUFBSSxDQUFDLE1BQU0sR0FBTyxJQUFJLHFCQUFrQixDQUFDLE1BQU0sRUFBRSxTQUFTLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDbEUsSUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUM7UUFFN0IsSUFBSSxDQUFDLFFBQVEsR0FBSSxLQUFLLENBQUM7UUFDdkIsSUFBSSxDQUFDLFFBQVEsR0FBSSxJQUFJLENBQUM7UUFDdEIsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7UUFFM0IsSUFBSSxDQUFDLDhCQUE4QixFQUFFLENBQUM7SUFDMUMsQ0FBQztJQUVPLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBRSxNQUFnQjtRQUM3QyxPQUFRLE1BQXNCLENBQUMsS0FBSyxJQUFJLE1BQU0sS0FBSyxPQUFPLENBQUMsTUFBTSxJQUFJLE1BQU0sS0FBSyxPQUFPLENBQUMsTUFBTSxDQUFDO0lBQ25HLENBQUM7SUFFTyxNQUFNLENBQUMscUJBQXFCO1FBQ2hDLElBQUksUUFBUSxHQUFHLElBQUksQ0FBQztRQUVwQixNQUFNLE9BQU8sR0FBRyxJQUFJLE9BQU8sQ0FBQyxPQUFP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QU0sR0FBRztZQUNYLFdBQVcsRUFBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU07WUFDbEMsV0FBVyxFQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTTtZQUNsQyxZQUFZLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPO1NBQ3RDLENBQUM7UUFFRixNQUFNLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztZQUN4QixNQUFNLEVBQVMsd0JBQW9CLENBQUMsY0FBYztZQUNsRCxhQUFhLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJO1lBQ2pDLElBQUksRUFBVztnQkFDWCxPQUFPO2dCQUNQLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTTtnQkFDcEIsTUFBQSxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksMENBQUUsVUFBVSxDQUFDLFFBQVE7Z0JBQ3ZDLE1BQU07YUFDVDtTQUNKLENBQUMsQ0FBQztRQUVGLElBQUksQ0FBQyxRQUFRLENBQUMsc0JBQXNCLENBQUMsT0FBb0IsRUFBRSxDQUFDO0lBQ2pFLENBQUM7Q0FDSjtBQTVmRCwyQkE0ZkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIGZpbmQsXG4gICAgc29ydEJ5LFxuICAgIHVuaW9uLFxuICAgIGlzRnVuY3Rpb24sXG59IGZyb20gJ2xvZGFzaCc7XG5cbmltcG9ydCB7IHdyaXRhYmxlIGFzIGlzV3JpdGFibGVTdHJlYW0gfSBmcm9tICdpcy1zdHJlYW0nO1xuaW1wb3J0IFJlcG9ydGVyUGx1Z2luSG9zdCBmcm9tICcuL3BsdWdpbi1ob3N0JztcbmltcG9ydCBSZXBvcnRlclBsdWdpbk1ldGhvZCBmcm9tICcuL3BsdWdpbi1tZXRob2RzJztcbmltcG9ydCBmb3JtYXRDb21tYW5kIGZyb20gJy4vY29tbWFuZC9mb3JtYXQtY29tbWFuZCc7XG5pbXBvcnQgeyBSZXBvcnRlclBsdWdpbkVycm9yIH0gZnJvbSAnLi4vZXJyb3JzL3J1bnRpbWUnO1xuaW1wb3J0IFRhc2sgZnJvbSAnLi4vcnVubmVyL3Rhc2snO1xuaW1wb3J0IHsgV3JpdGFibGUgYXMgV3JpdGFibGVTdHJlYW0sIFdyaXRhYmxlIH0gZnJvbSAnc3RyZWFtJztcbmltcG9ydCB7IFdyaXRlU3RyZWFtIH0gZnJvbSAndHR5JztcbmltcG9ydCBUZXN0UnVuIGZyb20gJy4uL3Rlc3QtcnVuJztcbmltcG9ydCBUZXN0IGZyb20gJy4uL2FwaS9zdHJ1Y3R1cmUvdGVzdCc7XG5pbXBvcnQgRml4dHVyZSBmcm9tICcuLi9hcGkvc3RydWN0dXJlL2ZpeHR1cmUnO1xuaW1wb3J0IFRlc3RSdW5FcnJvckZvcm1hdHRhYmxlQWRhcHRlciBmcm9tICcuLi9lcnJvcnMvdGVzdC1ydW4vZm9ybWF0dGFibGUtYWRhcHRlcic7XG5pbXBvcnQgeyBDb21tYW5kQmFzZSB9IGZyb20gJy4uL3Rlc3QtcnVuL2NvbW1hbmRzL2Jhc2UnO1xuXG5pbXBvcnQge1xuICAgIFJlcG9ydGVyUGx1Z2luLFxuICAgIFJlcG9ydGVyUGx1Z2luU291cmNlLFxuICAgIFJlcG9ydGVyU291cmNlLFxufSBmcm9tICcuL2ludGVyZmFjZXMnO1xuXG5pbXBvcnQgeyBnZXRQbHVnaW5GYWN0b3J5LCBwcm9jZXNzUmVwb3J0ZXJOYW1lIH0gZnJvbSAnLi4vdXRpbHMvcmVwb3J0ZXInO1xuaW1wb3J0IHJlc29sdmVQYXRoUmVsYXRpdmVseUN3ZCBmcm9tICcuLi91dGlscy9yZXNvbHZlLXBhdGgtcmVsYXRpdmVseS1jd2QnO1xuaW1wb3J0IG1ha2VEaXIgZnJvbSAnbWFrZS1kaXInO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgZnMgZnJvbSAnZnMnO1xuaW1wb3J0IE1lc3NhZ2VCdXMgZnJvbSAnLi4vdXRpbHMvbWVzc2FnZS1idXMnO1xuaW1wb3J0IEJyb3dzZXJDb25uZWN0aW9uIGZyb20gJy4uL2Jyb3dzZXIvY29ubmVjdGlvbic7XG5pbXBvcnQgeyBEaWN0aW9uYXJ5IH0gZnJvbSAnLi4vY29uZmlndXJhdGlvbi9pbnRlcmZhY2VzJztcbmltcG9ydCBkZWJ1ZyBmcm9tICdkZWJ1Zyc7XG5cbmludGVyZmFjZSBQZW5kaW5nUHJvbWlzZSB7XG4gICAgcmVzb2x2ZTogRnVuY3Rpb24gfCBudWxsO1xuICAgIHRoZW46IEZ1bmN0aW9uO1xufVxuXG5pbnRlcmZhY2UgVGFza0luZm8ge1xuICAgIHRhc2s6IFRhc2sgfCBudWxsO1xuICAgIHBhc3NlZDogbnVtYmVyO1xuICAgIGZhaWxlZDogbnVtYmVyO1xuICAgIHNraXBwZWQ6IG51bWJlcjtcbiAgICB0ZXN0Q291bnQ6IG51bWJlcjtcbiAgICB0ZXN0UXVldWU6IFRlc3RJbmZvW107XG4gICAgcmVhZG9ubHkgc3RvcE9uRmlyc3RGYWlsOiBib29sZWFuO1xuICAgIHJlYWRvbmx5IHBlbmRpbmdUYXNrRG9uZVByb21pc2U6IFBlbmRpbmdQcm9taXNlO1xufVxuXG5pbnRlcmZhY2UgVGVzdEluZm8ge1xuICAgIGZpeHR1cmU6IEZpeHR1cmU7XG4gICAgdGVzdDogVGVzdDtcbiAgICB0ZXN0UnVuSWRzOiBzdHJpbmdbXTtcbiAgICBzY3JlZW5zaG90UGF0aDogbnVsbCB8IHN0cmluZztcbiAgICBzY3JlZW5zaG90czogdW5rbm93bltdO1xuICAgIHZpZGVvczogdW5rbm93bltdO1xuICAgIHF1YXJhbnRpbmU6IG51bGwgfCBSZWNvcmQ8c3RyaW5nLCBvYmplY3Q+O1xuICAgIGVycnM6IFRlc3RSdW5FcnJvckZvcm1hdHRhYmxlQWRhcHRlcltdO1xuICAgIHdhcm5pbmdzOiBzdHJpbmdbXTtcbiAgICB1bnN0YWJsZTogYm9vbGVhbjtcbiAgICBzdGFydFRpbWU6IG51bGwgfCBudW1iZXI7XG4gICAgdGVzdFJ1bkluZm86IG51bGwgfCBUZXN0UnVuSW5mbztcbiAgICBwZW5kaW5nUnVuczogbnVtYmVyO1xuICAgIHBlbmRpbmdTdGFydHM6IG51bWJlcjtcbiAgICBwZW5kaW5nVGVzdFJ1bkRvbmVQcm9taXNlOiBQZW5kaW5nUHJvbWlzZTtcbiAgICBwZW5kaW5nVGVzdFJ1blN0YXJ0UHJvbWlzZTogUGVuZGluZ1Byb21pc2U7XG4gICAgYnJvd3NlcnM6IEJyb3dzZXJSdW5JbmZvW107XG59XG5cbmludGVyZmFjZSBGaXh0dXJlSW5mbyB7XG4gICAgaWQ6IHN0cmluZztcbiAgICBuYW1lOiBzdHJpbmcgfCBudWxsO1xuICAgIHBhdGg6IHN0cmluZztcbiAgICBtZXRhOiBEaWN0aW9uYXJ5PHN0cmluZz47XG59XG5cbmludGVyZmFjZSBCcm93c2VyUnVuSW5mbyBleHRlbmRzIEJyb3dzZXIge1xuICAgIHRlc3RSdW5JZDogc3RyaW5nO1xuICAgIHF1YXJhbnRpbmVBdHRlbXB0c1Rlc3RSdW5JZHM/OiBzdHJpbmdbXTtcbn1cblxuaW50ZXJmYWNlIFRlc3RSdW5JbmZvIHtcbiAgICBlcnJzOiBUZXN0UnVuRXJyb3JGb3JtYXR0YWJsZUFkYXB0ZXJbXTtcbiAgICB3YXJuaW5nczogc3RyaW5nW107XG4gICAgZHVyYXRpb25NczogbnVtYmVyO1xuICAgIHVuc3RhYmxlOiBib29sZWFuO1xuICAgIHNjcmVlbnNob3RQYXRoOiBzdHJpbmc7XG4gICAgc2NyZWVuc2hvdHM6IHVua25vd247XG4gICAgdmlkZW9zOiB1bmtub3duO1xuICAgIHF1YXJhbnRpbmU6IHVua25vd247XG4gICAgc2tpcHBlZDogYm9vbGVhbjtcbiAgICBicm93c2VyczogdW5rbm93bltdO1xuICAgIHRlc3RJZDogc3RyaW5nO1xuICAgIGZpeHR1cmU6IEZpeHR1cmVJbmZvO1xufVxuXG5pbnRlcmZhY2UgUGx1Z2luTWV0aG9kQXJndW1lbnRzIHtcbiAgICBpbml0aWFsT2JqZWN0OiBUYXNrIHwgTWVzc2FnZUJ1cyB8IG51bGw7XG4gICAgbWV0aG9kOiBzdHJpbmc7XG4gICAgYXJnczogdW5rbm93bltdO1xufVxuXG5pbnRlcmZhY2UgUmVwb3J0VGVzdEFjdGlvbkV2ZW50QXJndW1lbnRzIHtcbiAgICBjb21tYW5kOiBDb21tYW5kQmFzZTtcbiAgICBkdXJhdGlvbjogbnVtYmVyO1xuICAgIHJlc3VsdDogdW5rbm93bjtcbiAgICB0ZXN0UnVuOiBUZXN0UnVuO1xuICAgIGVycjogVGVzdFJ1bkVycm9yRm9ybWF0dGFibGVBZGFwdGVyO1xufVxuXG5pbnRlcmZhY2UgUmVwb3J0VGFza0FjdGlvbkV2ZW50QXJndW1lbnRzIHtcbiAgICBhcGlBY3Rpb25OYW1lOiBzdHJpbmc7XG4gICAgcmVzdEFyZ3M6IG9iamVjdDtcbn1cblxuaW50ZXJmYWNlIFJlcG9ydFdhcm5pbmdFdmVudEFyZ3VtZW50cyB7XG4gICAgbWVzc2FnZTogc3RyaW5nO1xuICAgIHRlc3RSdW4/OiBUZXN0UnVuO1xuICAgIGFjdGlvbklkPzogc3RyaW5nO1xufVxuXG5jb25zdCBkZWJ1Z0xvZyA9IGRlYnVnKCd0ZXN0Y2FmZTpyZXBvcnRlcicpO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBSZXBvcnRlciB7XG4gICAgcHVibGljIHJlYWRvbmx5IHBsdWdpbjogUmVwb3J0ZXJQbHVnaW5Ib3N0O1xuICAgIHB1YmxpYyByZWFkb25seSBtZXNzYWdlQnVzOiBNZXNzYWdlQnVzO1xuICAgIHB1YmxpYyBkaXNwb3NlZDogYm9vbGVhbjtcbiAgICBwdWJsaWMgdGFza0luZm86IFRhc2tJbmZvIHwgbnVsbDtcbiAgICBwdWJsaWMgcmVhZG9ubHkgb3V0U3RyZWFtOiBXcml0YWJsZTtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvciAocGx1Z2luOiBSZXBvcnRlclBsdWdpbiwgbWVzc2FnZUJ1czogTWVzc2FnZUJ1cywgb3V0U3RyZWFtOiBXcml0YWJsZSwgbmFtZTogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMucGx1Z2luICAgICA9IG5ldyBSZXBvcnRlclBsdWdpbkhvc3QocGx1Z2luLCBvdXRTdHJlYW0sIG5hbWUpO1xuICAgICAgICB0aGlzLm1lc3NhZ2VCdXMgPSBtZXNzYWdlQnVzO1xuXG4gICAgICAgIHRoaXMuZGlzcG9zZWQgID0gZmFsc2U7XG4gICAgICAgIHRoaXMudGFza0luZm8gID0gbnVsbDtcbiAgICAgICAgdGhpcy5vdXRTdHJlYW0gPSBvdXRTdHJlYW07XG5cbiAgICAgICAgdGhpcy5fYXNzaWduTWVzc2FnZUJ1c0V2ZW50SGFuZGxlcnMoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBfaXNTcGVjaWFsU3RyZWFtIChzdHJlYW06IFdyaXRhYmxlKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAoc3RyZWFtIGFzIFdyaXRlU3RyZWFtKS5pc1RUWSB8fCBzdHJlYW0gPT09IHByb2Nlc3Muc3Rkb3V0IHx8IHN0cmVhbSA9PT0gcHJvY2Vzcy5zdGRlcnI7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgX2NyZWF0ZVBlbmRpbmdQcm9taXNlICgpOiBQZW5kaW5nUHJvbWlzZSB7XG4gICAgICAgIGxldCByZXNvbHZlciA9IG51bGw7XG5cbiAgICAgICAgY29uc3QgcHJvbWlzZSA9IG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgICAgICAgICAgcmVzb2x2ZXIgPSByZXNvbHZlO1xuICAgICAgICB9KSBhcyB1bmtub3duIGFzIFBlbmRpbmdQcm9taXNlO1xuXG4gICAgICAgIHByb21pc2UucmVzb2x2ZSA9IHJlc29sdmVyO1xuXG4gICAgICAgIHJldHVybiBwcm9taXNlO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBpbml0ICgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5kaXNwYXRjaFRvUGx1Z2luKHtcbiAgICAgICAgICAgIG1ldGhvZDogICAgICAgIFJlcG9ydGVyUGx1Z2luTWV0aG9kLmluaXQsXG4gICAgICAgICAgICBpbml0aWFsT2JqZWN0OiBudWxsLFxuICAgICAgICAgICAgYXJnczogICAgICAgICAgW3t9XSxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGRpc3BhdGNoVG9QbHVnaW4gKHsgbWV0aG9kLCBpbml0aWFsT2JqZWN0LCBhcmdzID0gW10gfTogUGx1Z2luTWV0aG9kQXJndW1lbnRzKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBhd2FpdCB0aGlzLnBsdWdpblttZXRob2RdKC4uLmFyZ3MpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChvcmlnaW5hbEVycm9yKSB7XG4gICAgICAgICAgICBjb25zdCB1bmNhdWdodEVycm9yID0gbmV3IFJlcG9ydGVyUGx1Z2luRXJyb3Ioe1xuICAgICAgICAgICAgICAgIG5hbWU6IHRoaXMucGx1Z2luLm5hbWUsXG4gICAgICAgICAgICAgICAgbWV0aG9kLFxuICAgICAgICAgICAgICAgIG9yaWdpbmFsRXJyb3IsXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgZGVidWdMb2coJ1BsdWdpbiBlcnJvcjogJU8nLCB1bmNhdWdodEVycm9yKTtcbiAgICAgICAgICAgIGRlYnVnTG9nKCdQbHVnaW4gZXJyb3I6IGluaXRpYWxPYmplY3Q6ICVPJywgaW5pdGlhbE9iamVjdCk7XG5cbiAgICAgICAgICAgIGlmIChpbml0aWFsT2JqZWN0KVxuICAgICAgICAgICAgICAgIGF3YWl0IGluaXRpYWxPYmplY3QuZW1pdCgnZXJyb3InLCB1bmNhdWdodEVycm9yKTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICB0aHJvdyB1bmNhdWdodEVycm9yO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfYXNzaWduTWVzc2FnZUJ1c0V2ZW50SGFuZGxlcnMgKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBtZXNzYWdlQnVzID0gdGhpcy5tZXNzYWdlQnVzO1xuXG4gICAgICAgIG1lc3NhZ2VCdXMub24oJ3dhcm5pbmctYWRkJywgYXN5bmMgZSA9PiBhd2FpdCB0aGlzLl9vbldhcm5pbmdBZGRIYW5kbGVyKGUpKTtcblxuICAgICAgICBtZXNzYWdlQnVzLm9uY2UoJ3N0YXJ0JywgYXN5bmMgKHRhc2s6IFRhc2spID0+IGF3YWl0IHRoaXMuX29uY2VUYXNrU3RhcnRIYW5kbGVyKHRhc2spKTtcblxuICAgICAgICBtZXNzYWdlQnVzLm9uKCd0ZXN0LXJ1bi1zdGFydCcsIGFzeW5jIHRlc3RSdW4gPT4gYXdhaXQgdGhpcy5fb25UYXNrVGVzdFJ1blN0YXJ0SGFuZGxlcih0ZXN0UnVuKSk7XG5cbiAgICAgICAgbWVzc2FnZUJ1cy5vbigndGVzdC1ydW4tZG9uZScsIGFzeW5jIHRlc3RSdW4gPT4gYXdhaXQgdGhpcy5fb25UYXNrVGVzdFJ1bkRvbmVIYW5kbGVyKHRlc3RSdW4pKTtcblxuICAgICAgICBtZXNzYWdlQnVzLm9uKCd0ZXN0LWFjdGlvbi1zdGFydCcsIGFzeW5jIGUgPT4gYXdhaXQgdGhpcy5fb25UYXNrVGVzdEFjdGlvblN0YXJ0KGUpKTtcblxuICAgICAgICBtZXNzYWdlQnVzLm9uKCd0ZXN0LWFjdGlvbi1kb25lJywgYXN5bmMgZSA9PiBhd2FpdCB0aGlzLl9vblRhc2tUZXN0QWN0aW9uRG9uZShlKSk7XG5cbiAgICAgICAgbWVzc2FnZUJ1cy5vbmNlKCdkb25lJywgYXN5bmMgKCkgPT4gYXdhaXQgdGhpcy5fb25jZVRhc2tEb25lSGFuZGxlcigpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZGlzcG9zZSAoKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgICAgIGlmICh0aGlzLmRpc3Bvc2VkKVxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXG4gICAgICAgIHRoaXMuZGlzcG9zZWQgPSB0cnVlO1xuXG4gICAgICAgIGlmICghaXNGdW5jdGlvbih0aGlzPy5vdXRTdHJlYW0/Lm9uY2UpXG4gICAgICAgICAgICB8fCBSZXBvcnRlci5faXNTcGVjaWFsU3RyZWFtKHRoaXMub3V0U3RyZWFtKVxuICAgICAgICAgICAgfHwgIWlzV3JpdGFibGVTdHJlYW0odGhpcy5vdXRTdHJlYW0pKVxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXG4gICAgICAgIGNvbnN0IHN0cmVhbUZpbmlzaGVkUHJvbWlzZSA9IG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgICAgICAgICAgdGhpcy5vdXRTdHJlYW0ub25jZSgnZmluaXNoJywgcmVzb2x2ZSk7XG4gICAgICAgICAgICB0aGlzLm91dFN0cmVhbS5vbmNlKCdlcnJvcicsIHJlc29sdmUpO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLm91dFN0cmVhbS5lbmQoKTtcblxuICAgICAgICByZXR1cm4gc3RyZWFtRmluaXNoZWRQcm9taXNlO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIGFzeW5jIF9lbnN1cmVPdXRTdHJlYW0gKG91dFN0cmVhbTogc3RyaW5nIHwgV3JpdGFibGVTdHJlYW0pOiBQcm9taXNlPFdyaXRhYmxlU3RyZWFtPiB7XG4gICAgICAgIGlmICh0eXBlb2Ygb3V0U3RyZWFtICE9PSAnc3RyaW5nJylcbiAgICAgICAgICAgIHJldHVybiBvdXRTdHJlYW07XG5cbiAgICAgICAgY29uc3QgZnVsbFJlcG9ydGVyT3V0cHV0UGF0aCA9IHJlc29sdmVQYXRoUmVsYXRpdmVseUN3ZChvdXRTdHJlYW0pO1xuXG4gICAgICAgIGF3YWl0IG1ha2VEaXIocGF0aC5kaXJuYW1lKGZ1bGxSZXBvcnRlck91dHB1dFBhdGgpKTtcblxuICAgICAgICByZXR1cm4gZnMuY3JlYXRlV3JpdGVTdHJlYW0oZnVsbFJlcG9ydGVyT3V0cHV0UGF0aCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgX2FkZERlZmF1bHRSZXBvcnRlciAocmVwb3J0ZXJzOiBSZXBvcnRlclNvdXJjZVtdKTogdm9pZCB7XG4gICAgICAgIHJlcG9ydGVycy5wdXNoKHtcbiAgICAgICAgICAgIG5hbWU6ICAgJ3NwZWMnLFxuICAgICAgICAgICAgb3V0cHV0OiBwcm9jZXNzLnN0ZG91dCxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBhc3luYyBnZXRSZXBvcnRlclBsdWdpbnMgKHJlcG9ydGVyczogUmVwb3J0ZXJTb3VyY2VbXSA9IFtdKTogUHJvbWlzZTxSZXBvcnRlclBsdWdpblNvdXJjZVtdPiB7XG4gICAgICAgIGlmICghcmVwb3J0ZXJzLmxlbmd0aClcbiAgICAgICAgICAgIFJlcG9ydGVyLl9hZGREZWZhdWx0UmVwb3J0ZXIocmVwb3J0ZXJzKTtcblxuICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwocmVwb3J0ZXJzLm1hcChhc3luYyAoeyBuYW1lLCBvdXRwdXQsIG9wdGlvbnMgfSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcGx1Z2luRmFjdG9yeSA9IGdldFBsdWdpbkZhY3RvcnkobmFtZSk7XG4gICAgICAgICAgICBjb25zdCBwcm9jZXNzZWROYW1lID0gcHJvY2Vzc1JlcG9ydGVyTmFtZShuYW1lKTtcbiAgICAgICAgICAgIGNvbnN0IG91dFN0cmVhbSAgICAgPSBvdXRwdXQgPyBhd2FpdCBSZXBvcnRlci5fZW5zdXJlT3V0U3RyZWFtKG91dHB1dCkgOiB2b2lkIDA7XG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgcGx1Z2luOiBwbHVnaW5GYWN0b3J5KG9wdGlvbnMpLFxuICAgICAgICAgICAgICAgIG5hbWU6ICAgcHJvY2Vzc2VkTmFtZSxcbiAgICAgICAgICAgICAgICBvdXRTdHJlYW0sXG4gICAgICAgICAgICB9O1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBfb25XYXJuaW5nQWRkSGFuZGxlciAoeyBtZXNzYWdlLCB0ZXN0UnVuLCBhY3Rpb25JZCB9OiBSZXBvcnRXYXJuaW5nRXZlbnRBcmd1bWVudHMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5kaXNwYXRjaFRvUGx1Z2luKHtcbiAgICAgICAgICAgIG1ldGhvZDogICAgICAgIFJlcG9ydGVyUGx1Z2luTWV0aG9kLnJlcG9ydFdhcm5pbmdzIGFzIHN0cmluZyxcbiAgICAgICAgICAgIGluaXRpYWxPYmplY3Q6IHRoaXMubWVzc2FnZUJ1cyxcbiAgICAgICAgICAgIGFyZ3M6ICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgIHRlc3RSdW5JZDogdGVzdFJ1bj8uaWQsXG4gICAgICAgICAgICAgICAgICAgIGFjdGlvbklkLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvL1Rhc2tcbiAgICBwcml2YXRlIHN0YXRpYyBfY3JlYXRlVGVzdEl0ZW0gKHRlc3Q6IFRlc3QsIHJ1bnNQZXJUZXN0OiBudW1iZXIpOiBUZXN0SW5mbyB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBmaXh0dXJlOiAgICAgICAgICAgICAgICAgICAgdGVzdC5maXh0dXJlIGFzIEZpeHR1cmUsXG4gICAgICAgICAgICB0ZXN0OiAgICAgICAgICAgICAgICAgICAgICAgdGVzdCxcbiAgICAgICAgICAgIHRlc3RSdW5JZHM6ICAgICAgICAgICAgICAgICBbXSxcbiAgICAgICAgICAgIHNjcmVlbnNob3RQYXRoOiAgICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgc2NyZWVuc2hvdHM6ICAgICAgICAgICAgICAgIFtdLFxuICAgICAgICAgICAgdmlkZW9zOiAgICAgICAgICAgICAgICAgICAgIFtdLFxuICAgICAgICAgICAgcXVhcmFudGluZTogICAgICAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICBlcnJzOiAgICAgICAgICAgICAgICAgICAgICAgW10sXG4gICAgICAgICAgICB3YXJuaW5nczogICAgICAgICAgICAgICAgICAgW10sXG4gICAgICAgICAgICB1bnN0YWJsZTogICAgICAgICAgICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgICBzdGFydFRpbWU6ICAgICAgICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgIHRlc3RSdW5JbmZvOiAgICAgICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgcGVuZGluZ1J1bnM6ICAgICAgICAgICAgICAgIHJ1bnNQZXJUZXN0LFxuICAgICAgICAgICAgcGVuZGluZ1N0YXJ0czogICAgICAgICAgICAgIHJ1bnNQZXJUZXN0LFxuICAgICAgICAgICAgcGVuZGluZ1Rlc3RSdW5Eb25lUHJvbWlzZTogIFJlcG9ydGVyLl9jcmVhdGVQZW5kaW5nUHJvbWlzZSgpLFxuICAgICAgICAgICAgcGVuZGluZ1Rlc3RSdW5TdGFydFByb21pc2U6IFJlcG9ydGVyLl9jcmVhdGVQZW5kaW5nUHJvbWlzZSgpLFxuICAgICAgICAgICAgYnJvd3NlcnM6ICAgICAgICAgICAgICAgICAgIFtdLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIF9jcmVhdGVUZXN0UXVldWUgKHRhc2s6IFRhc2spOiBUZXN0SW5mb1tdIHtcbiAgICAgICAgY29uc3QgcnVuc1BlclRlc3QgPSB0YXNrLmJyb3dzZXJDb25uZWN0aW9uR3JvdXBzLmxlbmd0aDtcblxuICAgICAgICByZXR1cm4gdGFzay50ZXN0cy5tYXAodGVzdCA9PiBSZXBvcnRlci5fY3JlYXRlVGVzdEl0ZW0odGVzdCwgcnVuc1BlclRlc3QpKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBfY3JlYXRlVGVzdFJ1bkluZm8gKHJlcG9ydEl0ZW06IFRlc3RJbmZvKTogVGVzdFJ1bkluZm8ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZXJyczogICAgICAgICAgIHNvcnRCeShyZXBvcnRJdGVtLmVycnMsIFsndXNlckFnZW50JywgJ2NvZGUnXSksXG4gICAgICAgICAgICB3YXJuaW5nczogICAgICAgcmVwb3J0SXRlbS53YXJuaW5ncyxcbiAgICAgICAgICAgIGR1cmF0aW9uTXM6ICAgICArbmV3IERhdGUoKSAtIChyZXBvcnRJdGVtLnN0YXJ0VGltZSBhcyBudW1iZXIpLCAvL2VzbGludC1kaXNhYmxlLWxpbmUgIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHRyYS1wYXJlbnNcbiAgICAgICAgICAgIHVuc3RhYmxlOiAgICAgICByZXBvcnRJdGVtLnVuc3RhYmxlLFxuICAgICAgICAgICAgc2NyZWVuc2hvdFBhdGg6IHJlcG9ydEl0ZW0uc2NyZWVuc2hvdFBhdGggYXMgc3RyaW5nLFxuICAgICAgICAgICAgc2NyZWVuc2hvdHM6ICAgIHJlcG9ydEl0ZW0uc2NyZWVuc2hvdHMsXG4gICAgICAgICAgICB2aWRlb3M6ICAgICAgICAgcmVwb3J0SXRlbS52aWRlb3MsXG4gICAgICAgICAgICBxdWFyYW50aW5lOiAgICAgcmVwb3J0SXRlbS5xdWFyYW50aW5lLFxuICAgICAgICAgICAgc2tpcHBlZDogICAgICAgIHJlcG9ydEl0ZW0udGVzdC5za2lwLFxuICAgICAgICAgICAgYnJvd3NlcnM6ICAgICAgIHJlcG9ydEl0ZW0uYnJvd3NlcnMsXG4gICAgICAgICAgICB0ZXN0SWQ6ICAgICAgICAgcmVwb3J0SXRlbS50ZXN0LmlkLFxuICAgICAgICAgICAgZml4dHVyZTogICAgICAgIHtcbiAgICAgICAgICAgICAgICBpZDogICByZXBvcnRJdGVtLmZpeHR1cmUuaWQsXG4gICAgICAgICAgICAgICAgbmFtZTogcmVwb3J0SXRlbS5maXh0dXJlLm5hbWUsXG4gICAgICAgICAgICAgICAgcGF0aDogcmVwb3J0SXRlbS5maXh0dXJlLnBhdGgsXG4gICAgICAgICAgICAgICAgbWV0YTogcmVwb3J0SXRlbS5maXh0dXJlLm1ldGEsXG4gICAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHByaXZhdGUgX2dldFRlc3RJdGVtRm9yVGVzdFJ1biAodGFza0luZm86IFRhc2tJbmZvLCB0ZXN0UnVuOiBUZXN0UnVuKTogVGVzdEluZm8gfCB1bmRlZmluZWQge1xuICAgICAgICByZXR1cm4gZmluZCh0YXNrSW5mby50ZXN0UXVldWUsIGkgPT4gaS50ZXN0ID09PSB0ZXN0UnVuLnRlc3QpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgX3NoaWZ0VGVzdFF1ZXVlICgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKCF0aGlzLnRhc2tJbmZvKVxuICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIGxldCBjdXJyZW50Rml4dHVyZSA9IG51bGw7XG4gICAgICAgIGxldCBuZXh0UmVwb3J0SXRlbSA9IG51bGw7XG4gICAgICAgIGxldCB0ZXN0SXRlbSAgICAgICA9IG51bGw7XG4gICAgICAgIGNvbnN0IHRlc3RRdWV1ZSAgICA9IHRoaXMudGFza0luZm8udGVzdFF1ZXVlO1xuXG4gICAgICAgIHdoaWxlICh0ZXN0UXVldWUubGVuZ3RoICYmIHRlc3RRdWV1ZVswXS50ZXN0UnVuSW5mbykge1xuICAgICAgICAgICAgdGVzdEl0ZW0gICAgICAgPSB0ZXN0UXVldWUuc2hpZnQoKSBhcyBUZXN0SW5mbztcbiAgICAgICAgICAgIGN1cnJlbnRGaXh0dXJlID0gdGVzdEl0ZW0uZml4dHVyZTtcblxuICAgICAgICAgICAgLy8gTk9URTogaGVyZSB3ZSBhc3N1bWUgdGhhdCB0ZXN0cyBhcmUgc29ydGVkIGJ5IGZpeHR1cmUuXG4gICAgICAgICAgICAvLyBUaGVyZWZvcmUsIGlmIHRoZSBuZXh0IHJlcG9ydCBpdGVtIGhhcyBhIGRpZmZlcmVudFxuICAgICAgICAgICAgLy8gZml4dHVyZSwgd2UgY2FuIHJlcG9ydCB0aGlzIGZpeHR1cmUgc3RhcnQuXG4gICAgICAgICAgICBuZXh0UmVwb3J0SXRlbSA9IHRlc3RRdWV1ZVswXTtcblxuICAgICAgICAgICAgYXdhaXQgdGhpcy5kaXNwYXRjaFRvUGx1Z2luKHtcbiAgICAgICAgICAgICAgICBtZXRob2Q6ICAgICAgICBSZXBvcnRlclBsdWdpbk1ldGhvZC5yZXBvcnRUZXN0RG9uZSxcbiAgICAgICAgICAgICAgICBpbml0aWFsT2JqZWN0OiB0aGlzLnRhc2tJbmZvLnRhc2ssXG4gICAgICAgICAgICAgICAgYXJnczogICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAgICB0ZXN0SXRlbS50ZXN0Lm5hbWUsXG4gICAgICAgICAgICAgICAgICAgIHRlc3RJdGVtLnRlc3RSdW5JbmZvLFxuICAgICAgICAgICAgICAgICAgICB0ZXN0SXRlbS50ZXN0Lm1ldGEsXG4gICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpZiAoIW5leHRSZXBvcnRJdGVtIHx8IG5leHRSZXBvcnRJdGVtLmZpeHR1cmUgPT09IGN1cnJlbnRGaXh0dXJlKVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICBhd2FpdCB0aGlzLmRpc3BhdGNoVG9QbHVnaW4oe1xuICAgICAgICAgICAgICAgIG1ldGhvZDogICAgICAgIFJlcG9ydGVyUGx1Z2luTWV0aG9kLnJlcG9ydEZpeHR1cmVTdGFydCxcbiAgICAgICAgICAgICAgICBpbml0aWFsT2JqZWN0OiB0aGlzLnRhc2tJbmZvLnRhc2ssXG4gICAgICAgICAgICAgICAgYXJnczogICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAgICBuZXh0UmVwb3J0SXRlbS5maXh0dXJlLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgIG5leHRSZXBvcnRJdGVtLmZpeHR1cmUucGF0aCxcbiAgICAgICAgICAgICAgICAgICAgbmV4dFJlcG9ydEl0ZW0uZml4dHVyZS5tZXRhLFxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgX3Jlc29sdmVUZXN0SXRlbSAodGFza0luZm86IFRhc2tJbmZvLCB0ZXN0SXRlbTogVGVzdEluZm8sIHRlc3RSdW46IFRlc3RSdW4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKCF0YXNrSW5mby50YXNrKVxuICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIGlmICh0YXNrSW5mby50YXNrLnNjcmVlbnNob3RzLmhhc0NhcHR1cmVkRm9yKHRlc3RSdW4udGVzdCkpIHtcbiAgICAgICAgICAgIHRlc3RJdGVtLnNjcmVlbnNob3RQYXRoID0gdGFza0luZm8udGFzay5zY3JlZW5zaG90cy5nZXRQYXRoRm9yKHRlc3RSdW4udGVzdCk7XG4gICAgICAgICAgICB0ZXN0SXRlbS5zY3JlZW5zaG90cyAgICA9IHRhc2tJbmZvLnRhc2suc2NyZWVuc2hvdHMuZ2V0U2NyZWVuc2hvdHNJbmZvKHRlc3RSdW4udGVzdCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGFza0luZm8udGFzay52aWRlb3MpXG4gICAgICAgICAgICB0ZXN0SXRlbS52aWRlb3MgPSB0YXNrSW5mby50YXNrLnZpZGVvcy5nZXRUZXN0VmlkZW9zKHRlc3RJdGVtLnRlc3QuaWQpO1xuXG4gICAgICAgIGlmICh0ZXN0UnVuLnF1YXJhbnRpbmUpIHtcbiAgICAgICAgICAgIGNvbnN0IHRlc3RJdGVtUXVhcmFudGluZSA9IHRlc3RSdW4ucXVhcmFudGluZS5hdHRlbXB0cy5yZWR1Y2UoKHJlc3VsdDogUmVjb3JkPHN0cmluZywgb2JqZWN0PiwgeyBlcnJvcnMgfSwgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhc3NlZCAgICAgICAgICAgID0gIWVycm9ycy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgY29uc3QgcXVhcmFudGluZUF0dGVtcHQgPSBpbmRleCArIDE7XG5cbiAgICAgICAgICAgICAgICByZXN1bHRbcXVhcmFudGluZUF0dGVtcHRdID0geyBwYXNzZWQgfTtcblxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICB9LCB7IH0pO1xuXG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKHRlc3RJdGVtLnF1YXJhbnRpbmUgYXMgb2JqZWN0LCB0ZXN0SXRlbVF1YXJhbnRpbmUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0ZXN0SXRlbS50ZXN0UnVuSW5mbykge1xuICAgICAgICAgICAgdGVzdEl0ZW0udGVzdFJ1bkluZm8gPSBSZXBvcnRlci5fY3JlYXRlVGVzdFJ1bkluZm8odGVzdEl0ZW0pO1xuXG4gICAgICAgICAgICBpZiAodGVzdEl0ZW0udGVzdC5za2lwKVxuICAgICAgICAgICAgICAgIHRhc2tJbmZvLnNraXBwZWQrKztcbiAgICAgICAgICAgIGVsc2UgaWYgKHRlc3RJdGVtLmVycnMubGVuZ3RoKVxuICAgICAgICAgICAgICAgIHRhc2tJbmZvLmZhaWxlZCsrO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHRhc2tJbmZvLnBhc3NlZCsrO1xuICAgICAgICB9XG5cbiAgICAgICAgYXdhaXQgdGhpcy5fc2hpZnRUZXN0UXVldWUoKTtcblxuICAgICAgICAodGVzdEl0ZW0ucGVuZGluZ1Rlc3RSdW5Eb25lUHJvbWlzZS5yZXNvbHZlIGFzIEZ1bmN0aW9uKSgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX3ByZXBhcmVSZXBvcnRUZXN0QWN0aW9uRXZlbnRBcmdzICh7IGNvbW1hbmQsIGR1cmF0aW9uLCByZXN1bHQsIHRlc3RSdW4sIGVyciB9OiBSZXBvcnRUZXN0QWN0aW9uRXZlbnRBcmd1bWVudHMpOiBhbnkge1xuICAgICAgICBjb25zdCBhcmdzOiBhbnkgPSB7fTtcblxuICAgICAgICBpZiAoZXJyKVxuICAgICAgICAgICAgYXJncy5lcnIgPSBlcnI7XG5cbiAgICAgICAgaWYgKHR5cGVvZiBkdXJhdGlvbiA9PT0gJ251bWJlcicpXG4gICAgICAgICAgICBhcmdzLmR1cmF0aW9uID0gZHVyYXRpb247XG5cbiAgICAgICAgY29uc3QgdGVzdEZpeHR1cmUgPSB0ZXN0UnVuLnRlc3QuZml4dHVyZSBhcyBGaXh0dXJlO1xuXG4gICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKGFyZ3MsIHtcbiAgICAgICAgICAgIHRlc3RSdW5JZDogdGVzdFJ1bi5pZCxcbiAgICAgICAgICAgIHRlc3Q6ICAgICAge1xuICAgICAgICAgICAgICAgIGlkOiAgICB0ZXN0UnVuLnRlc3QuaWQsXG4gICAgICAgICAgICAgICAgbmFtZTogIHRlc3RSdW4udGVzdC5uYW1lLFxuICAgICAgICAgICAgICAgIHBoYXNlOiB0ZXN0UnVuLnBoYXNlLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGZpeHR1cmU6IHtcbiAgICAgICAgICAgICAgICBuYW1lOiB0ZXN0Rml4dHVyZS5uYW1lLFxuICAgICAgICAgICAgICAgIGlkOiAgIHRlc3RGaXh0dXJlLmlkLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvbW1hbmQ6IGZvcm1hdENvbW1hbmQoY29tbWFuZCwgcmVzdWx0KSxcbiAgICAgICAgICAgIGJyb3dzZXI6IHRlc3RSdW4uYnJvd3NlcixcbiAgICAgICAgfSk7XG4gICAgfVxuXG5cbiAgICBwcml2YXRlIGFzeW5jIF9vbmNlVGFza1N0YXJ0SGFuZGxlciAodGFzazogVGFzayk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICB0aGlzLnRhc2tJbmZvID0ge1xuICAgICAgICAgICAgdGFzazogICAgICAgICAgICAgICAgICAgdGFzayxcbiAgICAgICAgICAgIHBhc3NlZDogICAgICAgICAgICAgICAgIDAsXG4gICAgICAgICAgICBmYWlsZWQ6ICAgICAgICAgICAgICAgICAwLFxuICAgICAgICAgICAgc2tpcHBlZDogICAgICAgICAgICAgICAgMCxcbiAgICAgICAgICAgIHRlc3RDb3VudDogICAgICAgICAgICAgIHRhc2sudGVzdHMuZmlsdGVyKHRlc3QgPT4gIXRlc3Quc2tpcCkubGVuZ3RoLFxuICAgICAgICAgICAgdGVzdFF1ZXVlOiAgICAgICAgICAgICAgUmVwb3J0ZXIuX2NyZWF0ZVRlc3RRdWV1ZSh0YXNrKSxcbiAgICAgICAgICAgIHN0b3BPbkZpcnN0RmFpbDogICAgICAgIHRhc2sub3B0cy5zdG9wT25GaXJzdEZhaWwgYXMgYm9vbGVhbixcbiAgICAgICAgICAgIHBlbmRpbmdUYXNrRG9uZVByb21pc2U6IFJlcG9ydGVyLl9jcmVhdGVQZW5kaW5nUHJvbWlzZSgpLFxuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IHN0YXJ0VGltZSAgICAgICAgICAgICAgPSB0YXNrLnN0YXJ0VGltZTtcbiAgICAgICAgY29uc3QgYnJvd3NlckNvbm5lY3Rpb25zSW5mbyA9IChbXSBhcyBCcm93c2VyQ29ubmVjdGlvbltdKVxuICAgICAgICAgICAgLmNvbmNhdCguLi50YXNrLmJyb3dzZXJDb25uZWN0aW9uR3JvdXBzKVxuICAgICAgICAgICAgLm1hcChjb25uZWN0aW9uID0+IGNvbm5lY3Rpb24uY29ubmVjdGlvbkluZm8pO1xuICAgICAgICBjb25zdCBmaXJzdCAgICAgICAgICAgICAgICAgID0gdGhpcy50YXNrSW5mby50ZXN0UXVldWVbMF07XG5cbiAgICAgICAgY29uc3QgdGFza1Byb3BlcnRpZXMgPSB7XG4gICAgICAgICAgICBjb25maWd1cmF0aW9uOiB0YXNrLm9wdHMsXG4gICAgICAgICAgICBkYXNoYm9hcmRVcmw6ICB0YXNrLm9wdHMuZGFzaGJvYXJkVXJsLFxuICAgICAgICB9O1xuXG4gICAgICAgIGF3YWl0IHRoaXMuZGlzcGF0Y2hUb1BsdWdpbih7XG4gICAgICAgICAgICBtZXRob2Q6ICAgICAgICBSZXBvcnRlclBsdWdpbk1ldGhvZC5yZXBvcnRUYXNrU3RhcnQsXG4gICAgICAgICAgICBpbml0aWFsT2JqZWN0OiB0YXNrLFxuICAgICAgICAgICAgYXJnczogICAgICAgICAgW1xuICAgICAgICAgICAgICAgIHN0YXJ0VGltZSxcbiAgICAgICAgICAgICAgICBicm93c2VyQ29ubmVjdGlvbnNJbmZvLFxuICAgICAgICAgICAgICAgIHRoaXMudGFza0luZm8udGVzdENvdW50LFxuICAgICAgICAgICAgICAgIHRhc2sudGVzdFN0cnVjdHVyZSxcbiAgICAgICAgICAgICAgICB0YXNrUHJvcGVydGllcyxcbiAgICAgICAgICAgIF0sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChmaXJzdCkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5kaXNwYXRjaFRvUGx1Z2luKHtcbiAgICAgICAgICAgICAgICBtZXRob2Q6ICAgICAgICBSZXBvcnRlclBsdWdpbk1ldGhvZC5yZXBvcnRGaXh0dXJlU3RhcnQsXG4gICAgICAgICAgICAgICAgaW5pdGlhbE9iamVjdDogdGFzayxcbiAgICAgICAgICAgICAgICBhcmdzOiAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICAgIGZpcnN0LmZpeHR1cmUubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgZmlyc3QuZml4dHVyZS5wYXRoLFxuICAgICAgICAgICAgICAgICAgICBmaXJzdC5maXh0dXJlLm1ldGEsXG4gICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBfb25UYXNrVGVzdFJ1blN0YXJ0SGFuZGxlciAodGVzdFJ1bjogVGVzdFJ1bik6IFByb21pc2U8dW5rbm93bj4ge1xuICAgICAgICBpZiAoIXRoaXMudGFza0luZm8pXG4gICAgICAgICAgICByZXR1cm4gdm9pZCAwO1xuXG4gICAgICAgIGNvbnN0IHRlc3RJdGVtID0gdGhpcy5fZ2V0VGVzdEl0ZW1Gb3JUZXN0UnVuKHRoaXMudGFza0luZm8sIHRlc3RSdW4pIGFzIFRlc3RJbmZvO1xuXG4gICAgICAgIHRlc3RJdGVtLnRlc3RSdW5JZHMucHVzaCh0ZXN0UnVuLmlkKTtcblxuICAgICAgICBpZiAoIXRlc3RJdGVtLnN0YXJ0VGltZSlcbiAgICAgICAgICAgIHRlc3RJdGVtLnN0YXJ0VGltZSA9ICtuZXcgRGF0ZSgpO1xuXG4gICAgICAgIHRlc3RJdGVtLnBlbmRpbmdTdGFydHMtLTtcblxuICAgICAgICBpZiAoIXRlc3RJdGVtLnBlbmRpbmdTdGFydHMpIHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGlmICh0aGlzLnBsdWdpbi5yZXBvcnRUZXN0U3RhcnQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0ZXN0U3RhcnRJbmZvID0ge1xuICAgICAgICAgICAgICAgICAgICB0ZXN0UnVuSWRzOiB0ZXN0SXRlbS50ZXN0UnVuSWRzLFxuICAgICAgICAgICAgICAgICAgICB0ZXN0SWQ6ICAgICB0ZXN0SXRlbS50ZXN0LmlkLFxuICAgICAgICAgICAgICAgICAgICBzdGFydFRpbWU6ICBuZXcgRGF0ZSh0ZXN0SXRlbS5zdGFydFRpbWUpLFxuICAgICAgICAgICAgICAgICAgICBza2lwcGVkOiAgICB0ZXN0SXRlbS50ZXN0LnNraXAsXG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuZGlzcGF0Y2hUb1BsdWdpbih7XG4gICAgICAgICAgICAgICAgICAgIG1ldGhvZDogICAgICAgIFJlcG9ydGVyUGx1Z2luTWV0aG9kLnJlcG9ydFRlc3RTdGFydCBhcyBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgIGluaXRpYWxPYmplY3Q6IHRoaXMudGFza0luZm8udGFzayxcbiAgICAgICAgICAgICAgICAgICAgYXJnczogICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAgICAgICAgdGVzdEl0ZW0udGVzdC5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGVzdEl0ZW0udGVzdC5tZXRhLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGVzdFN0YXJ0SW5mbyxcbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgKHRlc3RJdGVtLnBlbmRpbmdUZXN0UnVuU3RhcnRQcm9taXNlLnJlc29sdmUgYXMgRnVuY3Rpb24pKCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGVzdEl0ZW0ucGVuZGluZ1Rlc3RSdW5TdGFydFByb21pc2U7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBfb25UYXNrVGVzdFJ1bkRvbmVIYW5kbGVyICh0ZXN0UnVuOiBUZXN0UnVuKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICghdGhpcy50YXNrSW5mbylcbiAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICBjb25zdCByZXBvcnRJdGVtICAgICAgICAgICAgICAgICAgICA9IHRoaXMuX2dldFRlc3RJdGVtRm9yVGVzdFJ1bih0aGlzLnRhc2tJbmZvLCB0ZXN0UnVuKSBhcyBUZXN0SW5mbztcbiAgICAgICAgY29uc3QgaXNUZXN0UnVuU3RvcHBlZFRhc2tFeGVjdXRpb24gPSAhIXRlc3RSdW4uZXJycy5sZW5ndGggJiYgdGhpcy50YXNrSW5mby5zdG9wT25GaXJzdEZhaWw7XG4gICAgICAgIGNvbnN0IGJyb3dzZXI6IEJyb3dzZXJSdW5JbmZvICAgICAgID0gT2JqZWN0LmFzc2lnbih7IHRlc3RSdW5JZDogdGVzdFJ1bi5pZCB9LCB0ZXN0UnVuLmJyb3dzZXIpO1xuXG4gICAgICAgIHJlcG9ydEl0ZW0uYnJvd3NlcnMucHVzaChicm93c2VyKTtcblxuICAgICAgICByZXBvcnRJdGVtLnBlbmRpbmdSdW5zID0gaXNUZXN0UnVuU3RvcHBlZFRhc2tFeGVjdXRpb24gPyAwIDogcmVwb3J0SXRlbS5wZW5kaW5nUnVucyAtIDE7XG4gICAgICAgIHJlcG9ydEl0ZW0udW5zdGFibGUgICAgPSByZXBvcnRJdGVtLnVuc3RhYmxlIHx8IHRlc3RSdW4udW5zdGFibGU7XG4gICAgICAgIHJlcG9ydEl0ZW0uZXJycyAgICAgICAgPSByZXBvcnRJdGVtLmVycnMuY29uY2F0KHRlc3RSdW4uZXJycyk7XG4gICAgICAgIHJlcG9ydEl0ZW0ud2FybmluZ3MgICAgPSB0ZXN0UnVuLndhcm5pbmdMb2cgPyB1bmlvbihyZXBvcnRJdGVtLndhcm5pbmdzLCB0ZXN0UnVuLndhcm5pbmdMb2cubWVzc2FnZXMpIDogW107XG5cbiAgICAgICAgaWYgKHRlc3RSdW4ucXVhcmFudGluZSkge1xuICAgICAgICAgICAgcmVwb3J0SXRlbS5xdWFyYW50aW5lID0gcmVwb3J0SXRlbS5xdWFyYW50aW5lIHx8IHt9O1xuXG4gICAgICAgICAgICBjb25zdCByZXBvcnRJdGVtUXVhcmFudGluZSA9IHRlc3RSdW4ucXVhcmFudGluZS5hdHRlbXB0cy5yZWR1Y2UoKHJlc3VsdDogUmVjb3JkPHN0cmluZywgb2JqZWN0PiwgeyBlcnJvcnMsIHRlc3RSdW5JZCB9KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFzc2VkID0gIWVycm9ycy5sZW5ndGg7XG5cbiAgICAgICAgICAgICAgICByZXN1bHRbdGVzdFJ1bklkXSAgICAgICAgICAgICAgICAgICAgPSB7IHBhc3NlZCwgZXJyb3JzIH07XG4gICAgICAgICAgICAgICAgYnJvd3Nlci5xdWFyYW50aW5lQXR0ZW1wdHNUZXN0UnVuSWRzID0gYnJvd3Nlci5xdWFyYW50aW5lQXR0ZW1wdHNUZXN0UnVuSWRzIHx8IFtdO1xuXG4gICAgICAgICAgICAgICAgYnJvd3Nlci5xdWFyYW50aW5lQXR0ZW1wdHNUZXN0UnVuSWRzLnB1c2godGVzdFJ1bklkKTtcblxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICB9LCB7fSk7XG5cbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24ocmVwb3J0SXRlbS5xdWFyYW50aW5lLCByZXBvcnRJdGVtUXVhcmFudGluZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXJlcG9ydEl0ZW0ucGVuZGluZ1J1bnMpXG4gICAgICAgICAgICBhd2FpdCB0aGlzLl9yZXNvbHZlVGVzdEl0ZW0odGhpcy50YXNrSW5mbywgcmVwb3J0SXRlbSwgdGVzdFJ1bik7XG5cbiAgICAgICAgYXdhaXQgcmVwb3J0SXRlbS5wZW5kaW5nVGVzdFJ1bkRvbmVQcm9taXNlO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgX29uVGFza1Rlc3RBY3Rpb25TdGFydCAoeyBhcGlBY3Rpb25OYW1lLCAuLi5yZXN0QXJncyB9OiBSZXBvcnRUYXNrQWN0aW9uRXZlbnRBcmd1bWVudHMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKCF0aGlzLnRhc2tJbmZvKVxuICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgaWYgKHRoaXMucGx1Z2luLnJlcG9ydFRlc3RBY3Rpb25TdGFydCkge1xuICAgICAgICAgICAgcmVzdEFyZ3MgPSB0aGlzLl9wcmVwYXJlUmVwb3J0VGVzdEFjdGlvbkV2ZW50QXJncyhyZXN0QXJncyBhcyB1bmtub3duIGFzIFJlcG9ydFRlc3RBY3Rpb25FdmVudEFyZ3VtZW50cyk7XG5cbiAgICAgICAgICAgIGF3YWl0IHRoaXMuZGlzcGF0Y2hUb1BsdWdpbih7XG4gICAgICAgICAgICAgICAgbWV0aG9kOiAgICAgICAgUmVwb3J0ZXJQbHVnaW5NZXRob2QucmVwb3J0VGVzdEFjdGlvblN0YXJ0IGFzIHN0cmluZyxcbiAgICAgICAgICAgICAgICBpbml0aWFsT2JqZWN0OiB0aGlzLnRhc2tJbmZvLnRhc2ssXG4gICAgICAgICAgICAgICAgYXJnczogICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAgICBhcGlBY3Rpb25OYW1lLFxuICAgICAgICAgICAgICAgICAgICByZXN0QXJncyxcbiAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIF9vblRhc2tUZXN0QWN0aW9uRG9uZSAoeyBhcGlBY3Rpb25OYW1lLCAuLi5yZXN0QXJncyB9OiBSZXBvcnRUYXNrQWN0aW9uRXZlbnRBcmd1bWVudHMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKCF0aGlzLnRhc2tJbmZvKVxuICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgaWYgKHRoaXMucGx1Z2luLnJlcG9ydFRlc3RBY3Rpb25Eb25lKSB7XG4gICAgICAgICAgICByZXN0QXJncyA9IHRoaXMuX3ByZXBhcmVSZXBvcnRUZXN0QWN0aW9uRXZlbnRBcmdzKHJlc3RBcmdzIGFzIHVua25vd24gYXMgUmVwb3J0VGVzdEFjdGlvbkV2ZW50QXJndW1lbnRzKTtcblxuICAgICAgICAgICAgYXdhaXQgdGhpcy5kaXNwYXRjaFRvUGx1Z2luKHtcbiAgICAgICAgICAgICAgICBtZXRob2Q6ICAgICAgICBSZXBvcnRlclBsdWdpbk1ldGhvZC5yZXBvcnRUZXN0QWN0aW9uRG9uZSBhcyBzdHJpbmcsXG4gICAgICAgICAgICAgICAgaW5pdGlhbE9iamVjdDogdGhpcy50YXNrSW5mby50YXNrLFxuICAgICAgICAgICAgICAgIGFyZ3M6ICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgYXBpQWN0aW9uTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgcmVzdEFyZ3MsXG4gICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBfb25jZVRhc2tEb25lSGFuZGxlciAoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICghdGhpcy50YXNrSW5mbylcbiAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICBjb25zdCBlbmRUaW1lID0gbmV3IERhdGUoKTtcblxuICAgICAgICBjb25zdCByZXN1bHQgPSB7XG4gICAgICAgICAgICBwYXNzZWRDb3VudDogIHRoaXMudGFza0luZm8ucGFzc2VkLFxuICAgICAgICAgICAgZmFpbGVkQ291bnQ6ICB0aGlzLnRhc2tJbmZvLmZhaWxlZCxcbiAgICAgICAgICAgIHNraXBwZWRDb3VudDogdGhpcy50YXNrSW5mby5za2lwcGVkLFxuICAgICAgICB9O1xuXG4gICAgICAgIGF3YWl0IHRoaXMuZGlzcGF0Y2hUb1BsdWdpbih7XG4gICAgICAgICAgICBtZXRob2Q6ICAgICAgICBSZXBvcnRlclBsdWdpbk1ldGhvZC5yZXBvcnRUYXNrRG9uZSxcbiAgICAgICAgICAgIGluaXRpYWxPYmplY3Q6IHRoaXMudGFza0luZm8udGFzayxcbiAgICAgICAgICAgIGFyZ3M6ICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICBlbmRUaW1lLFxuICAgICAgICAgICAgICAgIHRoaXMudGFza0luZm8ucGFzc2VkLFxuICAgICAgICAgICAgICAgIHRoaXMudGFza0luZm8udGFzaz8ud2FybmluZ0xvZy5tZXNzYWdlcyxcbiAgICAgICAgICAgICAgICByZXN1bHQsXG4gICAgICAgICAgICBdLFxuICAgICAgICB9KTtcblxuICAgICAgICAodGhpcy50YXNrSW5mby5wZW5kaW5nVGFza0RvbmVQcm9taXNlLnJlc29sdmUgYXMgRnVuY3Rpb24pKCk7XG4gICAgfVxufVxuIl19
487
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcmVwb3J0ZXIvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLG1DQUtnQjtBQUVoQix5Q0FBeUQ7QUFDekQsZ0VBQStDO0FBQy9DLHNFQUFvRDtBQUNwRCw4RUFBcUQ7QUFDckQsK0NBQXdEO0FBZ0J4RCxnREFBMEU7QUFDMUUsdUdBQTRFO0FBQzVFLHdEQUErQjtBQUMvQixnREFBd0I7QUFDeEIsNENBQW9CO0FBSXBCLGtEQUEwQjtBQXVIMUIsTUFBTSxRQUFRLEdBQUcsSUFBQSxlQUFLLEVBQUMsbUJBQW1CLENBQUMsQ0FBQztBQUU1QyxNQUFxQixRQUFRO0lBT3pCLFlBQW9CLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLG1CQUFtQixFQUFtQjtRQUM3RixJQUFJLENBQUMsTUFBTSxHQUFPLElBQUkscUJBQWtCLENBQUMsTUFBTSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsbUJBQW1CLENBQUMsQ0FBQztRQUN2RixJQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQztRQUM3QixJQUFJLENBQUMsUUFBUSxHQUFLLEtBQUssQ0FBQztRQUN4QixJQUFJLENBQUMsUUFBUSxHQUFLLElBQUksQ0FBQztRQUN2QixJQUFJLENBQUMsU0FBUyxHQUFJLFNBQVMsQ0FBQztRQUU1QixJQUFJLENBQUMsOEJBQThCLEVBQUUsQ0FBQztJQUMxQyxDQUFDO0lBRU8sTUFBTSxDQUFDLGdCQUFnQixDQUFFLE1BQWdCO1FBQzdDLE9BQVEsTUFBc0IsQ0FBQyxLQUFLLElBQUksTUFBTSxLQUFLLE9BQU8sQ0FBQyxNQUFNLElBQUksTUFBTSxLQUFLLE9BQU8sQ0FBQyxNQUFNLENBQUM7SUFDbkcsQ0FBQztJQUVPLE1BQU0sQ0FBQyxxQkFBcUI7UUFDaEMsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDO1FBRXBCLE1B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LEVBQVc7Z0JBQ1gsV0FBVztnQkFDWCxHQUFHLElBQUk7YUFDVjtTQUNKLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFTyxtQkFBbUIsQ0FBRSxhQUFzQyxFQUFFLElBQVk7UUFDN0UsSUFBSSxDQUFDLGFBQWE7WUFDZCxPQUFPLEtBQUssQ0FBQyxDQUFDO1FBRWxCLE1BQU0sV0FBVyxHQUF3QixFQUFFLENBQUM7UUFFNUMsSUFBSSxhQUFhLENBQUMsYUFBYSxJQUFJLGFBQWEsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDO1lBQ2hFLFdBQVcsQ0FBQyxhQUFhLEdBQUcsYUFBYSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUVsRSxPQUFPLFdBQVcsQ0FBQztJQUN2QixDQUFDO0NBQ0o7QUF4akJELDJCQXdqQkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIGZpbmQsXG4gICAgc29ydEJ5LFxuICAgIHVuaW9uLFxuICAgIGlzRnVuY3Rpb24sXG59IGZyb20gJ2xvZGFzaCc7XG5cbmltcG9ydCB7IHdyaXRhYmxlIGFzIGlzV3JpdGFibGVTdHJlYW0gfSBmcm9tICdpcy1zdHJlYW0nO1xuaW1wb3J0IFJlcG9ydGVyUGx1Z2luSG9zdCBmcm9tICcuL3BsdWdpbi1ob3N0JztcbmltcG9ydCBSZXBvcnRlclBsdWdpbk1ldGhvZCBmcm9tICcuL3BsdWdpbi1tZXRob2RzJztcbmltcG9ydCBmb3JtYXRDb21tYW5kIGZyb20gJy4vY29tbWFuZC9mb3JtYXQtY29tbWFuZCc7XG5pbXBvcnQgeyBSZXBvcnRlclBsdWdpbkVycm9yIH0gZnJvbSAnLi4vZXJyb3JzL3J1bnRpbWUnO1xuaW1wb3J0IFRhc2sgZnJvbSAnLi4vcnVubmVyL3Rhc2snO1xuaW1wb3J0IHsgV3JpdGFibGUgYXMgV3JpdGFibGVTdHJlYW0sIFdyaXRhYmxlIH0gZnJvbSAnc3RyZWFtJztcbmltcG9ydCB7IFdyaXRlU3RyZWFtIH0gZnJvbSAndHR5JztcbmltcG9ydCBUZXN0UnVuIGZyb20gJy4uL3Rlc3QtcnVuJztcbmltcG9ydCBUZXN0IGZyb20gJy4uL2FwaS9zdHJ1Y3R1cmUvdGVzdCc7XG5pbXBvcnQgRml4dHVyZSBmcm9tICcuLi9hcGkvc3RydWN0dXJlL2ZpeHR1cmUnO1xuaW1wb3J0IFRlc3RSdW5FcnJvckZvcm1hdHRhYmxlQWRhcHRlciBmcm9tICcuLi9lcnJvcnMvdGVzdC1ydW4vZm9ybWF0dGFibGUtYWRhcHRlcic7XG5pbXBvcnQgeyBDb21tYW5kQmFzZSB9IGZyb20gJy4uL3Rlc3QtcnVuL2NvbW1hbmRzL2Jhc2UnO1xuXG5pbXBvcnQge1xuICAgIFJlcG9ydGVyUGx1Z2luLFxuICAgIFJlcG9ydGVyUGx1Z2luU291cmNlLFxuICAgIFJlcG9ydGVyU291cmNlLFxufSBmcm9tICcuL2ludGVyZmFjZXMnO1xuXG5pbXBvcnQgeyBnZXRQbHVnaW5GYWN0b3J5LCBwcm9jZXNzUmVwb3J0ZXJOYW1lIH0gZnJvbSAnLi4vdXRpbHMvcmVwb3J0ZXInO1xuaW1wb3J0IHJlc29sdmVQYXRoUmVsYXRpdmVseUN3ZCBmcm9tICcuLi91dGlscy9yZXNvbHZlLXBhdGgtcmVsYXRpdmVseS1jd2QnO1xuaW1wb3J0IG1ha2VEaXIgZnJvbSAnbWFrZS1kaXInO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgZnMgZnJvbSAnZnMnO1xuaW1wb3J0IE1lc3NhZ2VCdXMgZnJvbSAnLi4vdXRpbHMvbWVzc2FnZS1idXMnO1xuaW1wb3J0IEJyb3dzZXJDb25uZWN0aW9uIGZyb20gJy4uL2Jyb3dzZXIvY29ubmVjdGlvbic7XG5pbXBvcnQgeyBEaWN0aW9uYXJ5IH0gZnJvbSAnLi4vY29uZmlndXJhdGlvbi9pbnRlcmZhY2VzJztcbmltcG9ydCBkZWJ1ZyBmcm9tICdkZWJ1Zyc7XG5cbmludGVyZmFjZSBQZW5kaW5nUHJvbWlzZSB7XG4gICAgcmVzb2x2ZTogRnVuY3Rpb24gfCBudWxsO1xuICAgIHRoZW46IEZ1bmN0aW9uO1xufVxuXG5pbnRlcmZhY2UgVGFza0luZm8ge1xuICAgIHRhc2s6IFRhc2sgfCBudWxsO1xuICAgIHBhc3NlZDogbnVtYmVyO1xuICAgIGZhaWxlZDogbnVtYmVyO1xuICAgIHNraXBwZWQ6IG51bWJlcjtcbiAgICB0ZXN0Q291bnQ6IG51bWJlcjtcbiAgICB0ZXN0UXVldWU6IFRlc3RJbmZvW107XG4gICAgcmVhZG9ubHkgc3RvcE9uRmlyc3RGYWlsOiBib29sZWFuO1xuICAgIHJlYWRvbmx5IHBlbmRpbmdUYXNrRG9uZVByb21pc2U6IFBlbmRpbmdQcm9taXNlO1xufVxuXG5pbnRlcmZhY2UgVGVzdEluZm8ge1xuICAgIHJlcG9ydERhdGE6IERpY3Rpb25hcnk8YW55W10+O1xuICAgIGZpeHR1cmU6IEZpeHR1cmU7XG4gICAgdGVzdDogVGVzdDtcbiAgICB0ZXN0UnVuSWRzOiBzdHJpbmdbXTtcbiAgICBzY3JlZW5zaG90UGF0aDogbnVsbCB8IHN0cmluZztcbiAgICBzY3JlZW5zaG90czogdW5rbm93bltdO1xuICAgIHZpZGVvczogdW5rbm93bltdO1xuICAgIHF1YXJhbnRpbmU6IG51bGwgfCBSZWNvcmQ8c3RyaW5nLCBvYmplY3Q+O1xuICAgIGVycnM6IFRlc3RSdW5FcnJvckZvcm1hdHRhYmxlQWRhcHRlcltdO1xuICAgIHdhcm5pbmdzOiBzdHJpbmdbXTtcbiAgICB1bnN0YWJsZTogYm9vbGVhbjtcbiAgICBzdGFydFRpbWU6IG51bGwgfCBudW1iZXI7XG4gICAgdGVzdFJ1bkluZm86IG51bGwgfCBUZXN0UnVuSW5mbztcbiAgICBwZW5kaW5nUnVuczogbnVtYmVyO1xuICAgIHBlbmRpbmdTdGFydHM6IG51bWJlcjtcbiAgICBwZW5kaW5nVGVzdFJ1bkRvbmVQcm9taXNlOiBQZW5kaW5nUHJvbWlzZTtcbiAgICBwZW5kaW5nVGVzdFJ1blN0YXJ0UHJvbWlzZTogUGVuZGluZ1Byb21pc2U7XG4gICAgYnJvd3NlcnM6IEJyb3dzZXJSdW5JbmZvW107XG59XG5cbmludGVyZmFjZSBGaXh0dXJlSW5mbyB7XG4gICAgaWQ6IHN0cmluZztcbiAgICBuYW1lOiBzdHJpbmcgfCBudWxsO1xuICAgIHBhdGg6IHN0cmluZztcbiAgICBtZXRhOiBEaWN0aW9uYXJ5PHN0cmluZz47XG59XG5cbmludGVyZmFjZSBCcm93c2VyUnVuSW5mbyBleHRlbmRzIEJyb3dzZXIge1xuICAgIHRlc3RSdW5JZDogc3RyaW5nO1xuICAgIHF1YXJhbnRpbmVBdHRlbXB0c1Rlc3RSdW5JZHM/OiBzdHJpbmdbXTtcbn1cblxuaW50ZXJmYWNlIFRlc3RSdW5JbmZvIHtcbiAgICBlcnJzOiBUZXN0UnVuRXJyb3JGb3JtYXR0YWJsZUFkYXB0ZXJbXTtcbiAgICB3YXJuaW5nczogc3RyaW5nW107XG4gICAgcmVwb3J0RGF0YTogRGljdGlvbmFyeTxhbnlbXT47XG4gICAgZHVyYXRpb25NczogbnVtYmVyO1xuICAgIHVuc3RhYmxlOiBib29sZWFuO1xuICAgIHNjcmVlbnNob3RQYXRoOiBzdHJpbmc7XG4gICAgc2NyZWVuc2hvdHM6IHVua25vd247XG4gICAgdmlkZW9zOiB1bmtub3duO1xuICAgIHF1YXJhbnRpbmU6IHVua25vd247XG4gICAgc2tpcHBlZDogYm9vbGVhbjtcbiAgICBicm93c2VyczogdW5rbm93bltdO1xuICAgIHRlc3RJZDogc3RyaW5nO1xuICAgIGZpeHR1cmU6IEZpeHR1cmVJbmZvO1xufVxuXG5pbnRlcmZhY2UgUGx1Z2luTWV0aG9kQXJndW1lbnRzIHtcbiAgICBpbml0aWFsT2JqZWN0OiBUYXNrIHwgTWVzc2FnZUJ1cyB8IG51bGw7XG4gICAgbWV0aG9kOiBzdHJpbmc7XG4gICAgYXJnczogdW5rbm93bltdO1xufVxuXG5pbnRlcmZhY2UgUmVwb3J0VGVzdEFjdGlvbkV2ZW50QXJndW1lbnRzIHtcbiAgICBjb21tYW5kOiBDb21tYW5kQmFzZTtcbiAgICBkdXJhdGlvbjogbnVtYmVyO1xuICAgIHJlc3VsdDogdW5rbm93bjtcbiAgICB0ZXN0UnVuOiBUZXN0UnVuO1xuICAgIGVycjogVGVzdFJ1bkVycm9yRm9ybWF0dGFibGVBZGFwdGVyO1xufVxuXG5pbnRlcmZhY2UgUmVwb3J0VGFza0FjdGlvbkV2ZW50QXJndW1lbnRzIHtcbiAgICBhcGlBY3Rpb25OYW1lOiBzdHJpbmc7XG4gICAgcmVzdEFyZ3M6IG9iamVjdDtcbn1cblxuaW50ZXJmYWNlIFJlcG9ydFdhcm5pbmdFdmVudEFyZ3VtZW50cyB7XG4gICAgbWVzc2FnZTogc3RyaW5nO1xuICAgIHRlc3RSdW4/OiBUZXN0UnVuO1xuICAgIGFjdGlvbklkPzogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgUmVwb3J0RGF0YUV2ZW50QXJncyB7XG4gICAgZGF0YTogYW55W107XG4gICAgdGVzdFJ1bjogVGVzdFJ1blxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFdyaXRlSW5mbyB7XG4gICAgaW5pdGlhdG9yOiBzdHJpbmc7XG4gICAgZm9ybWF0dGVkVGV4dDogc3RyaW5nO1xuICAgIGZvcm1hdE9wdGlvbnM6IHtcbiAgICAgICAgdXNlV29yZFdyYXA6IGJvb2xlYW47XG4gICAgICAgIGluZGVudDogbnVtYmVyO1xuICAgIH1cbiAgICBkYXRhOiB1bmRlZmluZWQgfCBvYmplY3Q7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVwb3J0ZXJQbHVnaW5Ib29rcyB7XG4gICAgb25CZWZvcmVXcml0ZT86IEZ1bmN0aW9uO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlcG9ydGVyT3B0aW9ucyB7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIHBsdWdpbjogUmVwb3J0ZXJQbHVnaW47XG4gICAgbWVzc2FnZUJ1czogTWVzc2FnZUJ1cztcbiAgICBvdXRTdHJlYW06IFdyaXRhYmxlO1xuICAgIHJlcG9ydGVyUGx1Z2luSG9va3M/OiBSZXBvcnRlclBsdWdpbkhvb2tzXG59XG5cbmNvbnN0IGRlYnVnTG9nID0gZGVidWcoJ3Rlc3RjYWZlOnJlcG9ydGVyJyk7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFJlcG9ydGVyIHtcbiAgICBwdWJsaWMgcmVhZG9ubHkgcGx1Z2luOiBSZXBvcnRlclBsdWdpbkhvc3Q7XG4gICAgcHVibGljIHJlYWRvbmx5IG1lc3NhZ2VCdXM6IE1lc3NhZ2VCdXM7XG4gICAgcHVibGljIGRpc3Bvc2VkOiBib29sZWFuO1xuICAgIHB1YmxpYyB0YXNrSW5mbzogVGFza0luZm8gfCBudWxsO1xuICAgIHB1YmxpYyByZWFkb25seSBvdXRTdHJlYW06IFdyaXRhYmxlO1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yICh7IG5hbWUsIHBsdWdpbiwgb3V0U3RyZWFtLCBtZXNzYWdlQnVzLCByZXBvcnRlclBsdWdpbkhvb2tzIH06IFJlcG9ydGVyT3B0aW9ucykge1xuICAgICAgICB0aGlzLnBsdWdpbiAgICAgPSBuZXcgUmVwb3J0ZXJQbHVnaW5Ib3N0KHBsdWdpbiwgb3V0U3RyZWFtLCBuYW1lLCByZXBvcnRlclBsdWdpbkhvb2tzKTtcbiAgICAgICAgdGhpcy5tZXNzYWdlQnVzID0gbWVzc2FnZUJ1cztcbiAgICAgICAgdGhpcy5kaXNwb3NlZCAgID0gZmFsc2U7XG4gICAgICAgIHRoaXMudGFza0luZm8gICA9IG51bGw7XG4gICAgICAgIHRoaXMub3V0U3RyZWFtICA9IG91dFN0cmVhbTtcblxuICAgICAgICB0aGlzLl9hc3NpZ25NZXNzYWdlQnVzRXZlbnRIYW5kbGVycygpO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIF9pc1NwZWNpYWxTdHJlYW0gKHN0cmVhbTogV3JpdGFibGUpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIChzdHJlYW0gYXMgV3JpdGVTdHJlYW0pLmlzVFRZIHx8IHN0cmVhbSA9PT0gcHJvY2Vzcy5zdGRvdXQgfHwgc3RyZWFtID09PSBwcm9jZXNzLnN0ZGVycjtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBfY3JlYXRlUGVuZGluZ1Byb21pc2UgKCk6IFBlbmRpbmdQcm9taXNlIHtcbiAgICAgICAgbGV0IHJlc29sdmVyID0gbnVsbDtcblxuICAgICAgICBjb25zdCBwcm9taXNlID0gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgICAgICAgICByZXNvbHZlciA9IHJlc29sdmU7XG4gICAgICAgIH0pIGFzIHVua25vd24gYXMgUGVuZGluZ1Byb21pc2U7XG5cbiAgICAgICAgcHJvbWlzZS5yZXNvbHZlID0gcmVzb2x2ZXI7XG5cbiAgICAgICAgcmV0dXJuIHByb21pc2U7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGluaXQgKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCB0aGlzLmRpc3BhdGNoVG9QbHVnaW4oe1xuICAgICAgICAgICAgbWV0aG9kOiAgICAgICAgUmVwb3J0ZXJQbHVnaW5NZXRob2QuaW5pdCxcbiAgICAgICAgICAgIGluaXRpYWxPYmplY3Q6IG51bGwsXG4gICAgICAgICAgICBhcmdzOiAgICAgICAgICBbe31dLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZGlzcGF0Y2hUb1BsdWdpbiAoeyBtZXRob2QsIGluaXRpYWxPYmplY3QsIGFyZ3MgPSBbXSB9OiBQbHVnaW5NZXRob2RBcmd1bWVudHMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGF3YWl0IHRoaXMucGx1Z2luW21ldGhvZF0oLi4uYXJncyk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKG9yaWdpbmFsRXJyb3IpIHtcbiAgICAgICAgICAgIGNvbnN0IHVuY2F1Z2h0RXJyb3IgPSBuZXcgUmVwb3J0ZXJQbHVnaW5FcnJvcih7XG4gICAgICAgICAgICAgICAgbmFtZTogdGhpcy5wbHVnaW4ubmFtZSxcbiAgICAgICAgICAgICAgICBtZXRob2QsXG4gICAgICAgICAgICAgICAgb3JpZ2luYWxFcnJvcixcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBkZWJ1Z0xvZygnUGx1Z2luIGVycm9yOiAlTycsIHVuY2F1Z2h0RXJyb3IpO1xuICAgICAgICAgICAgZGVidWdMb2coJ1BsdWdpbiBlcnJvcjogaW5pdGlhbE9iamVjdDogJU8nLCBpbml0aWFsT2JqZWN0KTtcblxuICAgICAgICAgICAgaWYgKGluaXRpYWxPYmplY3QpXG4gICAgICAgICAgICAgICAgYXdhaXQgaW5pdGlhbE9iamVjdC5lbWl0KCdlcnJvcicsIHVuY2F1Z2h0RXJyb3IpO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHRocm93IHVuY2F1Z2h0RXJyb3I7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIF9hc3NpZ25NZXNzYWdlQnVzRXZlbnRIYW5kbGVycyAoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2VCdXMgPSB0aGlzLm1lc3NhZ2VCdXM7XG5cbiAgICAgICAgbWVzc2FnZUJ1cy5vbignd2FybmluZy1hZGQnLCBhc3luYyBlID0+IGF3YWl0IHRoaXMuX29uV2FybmluZ0FkZEhhbmRsZXIoZSkpO1xuXG4gICAgICAgIG1lc3NhZ2VCdXMub24oJ3JlcG9ydC1kYXRhJywgYXN5bmMgZSA9PiBhd2FpdCB0aGlzLl9vblJlcG9ydERhdGFIYW5kbGVyKGUpKTtcblxuICAgICAgICBtZXNzYWdlQnVzLm9uY2UoJ3N0YXJ0JywgYXN5bmMgKHRhc2s6IFRhc2spID0+IGF3YWl0IHRoaXMuX29uY2VUYXNrU3RhcnRIYW5kbGVyKHRhc2spKTtcblxuICAgICAgICBtZXNzYWdlQnVzLm9uKCd0ZXN0LXJ1bi1zdGFydCcsIGFzeW5jIHRlc3RSdW4gPT4gYXdhaXQgdGhpcy5fb25UYXNrVGVzdFJ1blN0YXJ0SGFuZGxlcih0ZXN0UnVuKSk7XG5cbiAgICAgICAgbWVzc2FnZUJ1cy5vbigndGVzdC1ydW4tZG9uZScsIGFzeW5jIHRlc3RSdW4gPT4gYXdhaXQgdGhpcy5fb25UYXNrVGVzdFJ1bkRvbmVIYW5kbGVyKHRlc3RSdW4pKTtcblxuICAgICAgICBtZXNzYWdlQnVzLm9uKCd0ZXN0LWFjdGlvbi1zdGFydCcsIGFzeW5jIGUgPT4gYXdhaXQgdGhpcy5fb25UYXNrVGVzdEFjdGlvblN0YXJ0KGUpKTtcblxuICAgICAgICBtZXNzYWdlQnVzLm9uKCd0ZXN0LWFjdGlvbi1kb25lJywgYXN5bmMgZSA9PiBhd2FpdCB0aGlzLl9vblRhc2tUZXN0QWN0aW9uRG9uZShlKSk7XG5cbiAgICAgICAgbWVzc2FnZUJ1cy5vbmNlKCdkb25lJywgYXN5bmMgKCkgPT4gYXdhaXQgdGhpcy5fb25jZVRhc2tEb25lSGFuZGxlcigpKTtcblxuICAgICAgICBtZXNzYWdlQnVzLm9uY2UoJ3VuaGFuZGxlZC1yZWplY3Rpb24nLCBhc3luYyAoKSA9PiBhd2FpdCB0aGlzLl9vbmNlVGFza0RvbmVIYW5kbGVyKCkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBkaXNwb3NlICgpOiBQcm9taXNlPHVua25vd24+IHtcbiAgICAgICAgaWYgKHRoaXMuZGlzcG9zZWQpXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cbiAgICAgICAgdGhpcy5kaXNwb3NlZCA9IHRydWU7XG5cbiAgICAgICAgaWYgKCFpc0Z1bmN0aW9uKHRoaXM/Lm91dFN0cmVhbT8ub25jZSlcbiAgICAgICAgICAgIHx8IFJlcG9ydGVyLl9pc1NwZWNpYWxTdHJlYW0odGhpcy5vdXRTdHJlYW0pXG4gICAgICAgICAgICB8fCAhaXNXcml0YWJsZVN0cmVhbSh0aGlzLm91dFN0cmVhbSkpXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cbiAgICAgICAgY29uc3Qgc3RyZWFtRmluaXNoZWRQcm9taXNlID0gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgICAgICAgICB0aGlzLm91dFN0cmVhbS5vbmNlKCdmaW5pc2gnLCByZXNvbHZlKTtcbiAgICAgICAgICAgIHRoaXMub3V0U3RyZWFtLm9uY2UoJ2Vycm9yJywgcmVzb2x2ZSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMub3V0U3RyZWFtLmVuZCgpO1xuXG4gICAgICAgIHJldHVybiBzdHJlYW1GaW5pc2hlZFByb21pc2U7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgYXN5bmMgX2Vuc3VyZU91dFN0cmVhbSAob3V0U3RyZWFtOiBzdHJpbmcgfCBXcml0YWJsZVN0cmVhbSk6IFByb21pc2U8V3JpdGFibGVTdHJlYW0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBvdXRTdHJlYW0gIT09ICdzdHJpbmcnKVxuICAgICAgICAgICAgcmV0dXJuIG91dFN0cmVhbTtcblxuICAgICAgICBjb25zdCBmdWxsUmVwb3J0ZXJPdXRwdXRQYXRoID0gcmVzb2x2ZVBhdGhSZWxhdGl2ZWx5Q3dkKG91dFN0cmVhbSk7XG5cbiAgICAgICAgYXdhaXQgbWFrZURpcihwYXRoLmRpcm5hbWUoZnVsbFJlcG9ydGVyT3V0cHV0UGF0aCkpO1xuXG4gICAgICAgIHJldHVybiBmcy5jcmVhdGVXcml0ZVN0cmVhbShmdWxsUmVwb3J0ZXJPdXRwdXRQYXRoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBfYWRkRGVmYXVsdFJlcG9ydGVyIChyZXBvcnRlcnM6IFJlcG9ydGVyU291cmNlW10pOiB2b2lkIHtcbiAgICAgICAgcmVwb3J0ZXJzLnB1c2goe1xuICAgICAgICAgICAgbmFtZTogICAnc3BlYycsXG4gICAgICAgICAgICBvdXRwdXQ6IHByb2Nlc3Muc3Rkb3V0LFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGFzeW5jIGdldFJlcG9ydGVyUGx1Z2lucyAocmVwb3J0ZXJzOiBSZXBvcnRlclNvdXJjZVtdID0gW10pOiBQcm9taXNlPFJlcG9ydGVyUGx1Z2luU291cmNlW10+IHtcbiAgICAgICAgaWYgKCFyZXBvcnRlcnMubGVuZ3RoKVxuICAgICAgICAgICAgUmVwb3J0ZXIuX2FkZERlZmF1bHRSZXBvcnRlcihyZXBvcnRlcnMpO1xuXG4gICAgICAgIHJldHVybiBQcm9taXNlLmFsbChyZXBvcnRlcnMubWFwKGFzeW5jICh7IG5hbWUsIG91dHB1dCwgb3B0aW9ucyB9KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBwbHVnaW5GYWN0b3J5ID0gZ2V0UGx1Z2luRmFjdG9yeShuYW1lKTtcbiAgICAgICAgICAgIGNvbnN0IHByb2Nlc3NlZE5hbWUgPSBwcm9jZXNzUmVwb3J0ZXJOYW1lKG5hbWUpO1xuICAgICAgICAgICAgY29uc3Qgb3V0U3RyZWFtICAgICA9IG91dHB1dCA/IGF3YWl0IFJlcG9ydGVyLl9lbnN1cmVPdXRTdHJlYW0ob3V0cHV0KSA6IHZvaWQgMDtcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBwbHVnaW46IHBsdWdpbkZhY3Rvcnkob3B0aW9ucyksXG4gICAgICAgICAgICAgICAgbmFtZTogICBwcm9jZXNzZWROYW1lLFxuICAgICAgICAgICAgICAgIG91dFN0cmVhbSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIF9vbldhcm5pbmdBZGRIYW5kbGVyICh7IG1lc3NhZ2UsIHRlc3RSdW4sIGFjdGlvbklkIH06IFJlcG9ydFdhcm5pbmdFdmVudEFyZ3VtZW50cyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCB0aGlzLmRpc3BhdGNoVG9QbHVnaW4oe1xuICAgICAgICAgICAgbWV0aG9kOiAgICAgICAgUmVwb3J0ZXJQbHVnaW5NZXRob2QucmVwb3J0V2FybmluZ3MgYXMgc3RyaW5nLFxuICAgICAgICAgICAgaW5pdGlhbE9iamVjdDogdGhpcy5tZXNzYWdlQnVzLFxuICAgICAgICAgICAgYXJnczogICAgICAgICAgW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgdGVzdFJ1bklkOiB0ZXN0UnVuPy5pZCxcbiAgICAgICAgICAgICAgICAgICAgYWN0aW9uSWQsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vVGFza1xuICAgIHByaXZhdGUgc3RhdGljIF9jcmVhdGVUZXN0SXRlbSAodGVzdDogVGVzdCwgcnVuc1BlclRlc3Q6IG51bWJlcik6IFRlc3RJbmZvIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGZpeHR1cmU6ICAgICAgICAgICAgICAgICAgICB0ZXN0LmZpeHR1cmUgYXMgRml4dHVyZSxcbiAgICAgICAgICAgIHRlc3Q6ICAgICAgICAgICAgICAgICAgICAgICB0ZXN0LFxuICAgICAgICAgICAgdGVzdFJ1bklkczogICAgICAgICAgICAgICAgIFtdLFxuICAgICAgICAgICAgc2NyZWVuc2hvdFBhdGg6ICAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICBzY3JlZW5zaG90czogICAgICAgICAgICAgICAgW10sXG4gICAgICAgICAgICB2aWRlb3M6ICAgICAgICAgICAgICAgICAgICAgW10sXG4gICAgICAgICAgICBxdWFyYW50aW5lOiAgICAgICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgIGVycnM6ICAgICAgICAgICAgICAgICAgICAgICBbXSxcbiAgICAgICAgICAgIHdhcm5pbmdzOiAgICAgICAgICAgICAgICAgICBbXSxcbiAgICAgICAgICAgIHVuc3RhYmxlOiAgICAgICAgICAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICAgIHN0YXJ0VGltZTogICAgICAgICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgdGVzdFJ1bkluZm86ICAgICAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICBwZW5kaW5nUnVuczogICAgICAgICAgICAgICAgcnVuc1BlclRlc3QsXG4gICAgICAgICAgICBwZW5kaW5nU3RhcnRzOiAgICAgICAgICAgICAgcnVuc1BlclRlc3QsXG4gICAgICAgICAgICBwZW5kaW5nVGVzdFJ1bkRvbmVQcm9taXNlOiAgUmVwb3J0ZXIuX2NyZWF0ZVBlbmRpbmdQcm9taXNlKCksXG4gICAgICAgICAgICBwZW5kaW5nVGVzdFJ1blN0YXJ0UHJvbWlzZTogUmVwb3J0ZXIuX2NyZWF0ZVBlbmRpbmdQcm9taXNlKCksXG4gICAgICAgICAgICBicm93c2VyczogICAgICAgICAgICAgICAgICAgW10sXG4gICAgICAgICAgICByZXBvcnREYXRhOiAgICAgICAgICAgICAgICAge30sXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgX2NyZWF0ZVRlc3RRdWV1ZSAodGFzazogVGFzayk6IFRlc3RJbmZvW10ge1xuICAgICAgICBjb25zdCBydW5zUGVyVGVzdCA9IHRhc2suYnJvd3NlckNvbm5lY3Rpb25Hcm91cHMubGVuZ3RoO1xuXG4gICAgICAgIHJldHVybiB0YXNrLnRlc3RzLm1hcCh0ZXN0ID0+IFJlcG9ydGVyLl9jcmVhdGVUZXN0SXRlbSh0ZXN0LCBydW5zUGVyVGVzdCkpO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIF9jcmVhdGVUZXN0UnVuSW5mbyAocmVwb3J0SXRlbTogVGVzdEluZm8pOiBUZXN0UnVuSW5mbyB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBlcnJzOiAgICAgICAgICAgc29ydEJ5KHJlcG9ydEl0ZW0uZXJycywgWyd1c2VyQWdlbnQnLCAnY29kZSddKSxcbiAgICAgICAgICAgIHdhcm5pbmdzOiAgICAgICByZXBvcnRJdGVtLndhcm5pbmdzLFxuICAgICAgICAgICAgcmVwb3J0RGF0YTogICAgIHJlcG9ydEl0ZW0ucmVwb3J0RGF0YSxcbiAgICAgICAgICAgIGR1cmF0aW9uTXM6ICAgICArbmV3IERhdGUoKSAtIChyZXBvcnRJdGVtLnN0YXJ0VGltZSBhcyBudW1iZXIpLCAvL2VzbGludC1kaXNhYmxlLWxpbmUgIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHRyYS1wYXJlbnNcbiAgICAgICAgICAgIHVuc3RhYmxlOiAgICAgICByZXBvcnRJdGVtLnVuc3RhYmxlLFxuICAgICAgICAgICAgc2NyZWVuc2hvdFBhdGg6IHJlcG9ydEl0ZW0uc2NyZWVuc2hvdFBhdGggYXMgc3RyaW5nLFxuICAgICAgICAgICAgc2NyZWVuc2hvdHM6ICAgIHJlcG9ydEl0ZW0uc2NyZWVuc2hvdHMsXG4gICAgICAgICAgICB2aWRlb3M6ICAgICAgICAgcmVwb3J0SXRlbS52aWRlb3MsXG4gICAgICAgICAgICBxdWFyYW50aW5lOiAgICAgcmVwb3J0SXRlbS5xdWFyYW50aW5lLFxuICAgICAgICAgICAgc2tpcHBlZDogICAgICAgIHJlcG9ydEl0ZW0udGVzdC5za2lwLFxuICAgICAgICAgICAgYnJvd3NlcnM6ICAgICAgIHJlcG9ydEl0ZW0uYnJvd3NlcnMsXG4gICAgICAgICAgICB0ZXN0SWQ6ICAgICAgICAgcmVwb3J0SXRlbS50ZXN0LmlkLFxuICAgICAgICAgICAgZml4dHVyZTogICAgICAgIHtcbiAgICAgICAgICAgICAgICBpZDogICByZXBvcnRJdGVtLmZpeHR1cmUuaWQsXG4gICAgICAgICAgICAgICAgbmFtZTogcmVwb3J0SXRlbS5maXh0dXJlLm5hbWUsXG4gICAgICAgICAgICAgICAgcGF0aDogcmVwb3J0SXRlbS5maXh0dXJlLnBhdGgsXG4gICAgICAgICAgICAgICAgbWV0YTogcmVwb3J0SXRlbS5maXh0dXJlLm1ldGEsXG4gICAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHByaXZhdGUgX2dldFRlc3RJdGVtRm9yVGVzdFJ1biAodGFza0luZm86IFRhc2tJbmZvLCB0ZXN0UnVuOiBUZXN0UnVuKTogVGVzdEluZm8gfCB1bmRlZmluZWQge1xuICAgICAgICByZXR1cm4gZmluZCh0YXNrSW5mby50ZXN0UXVldWUsIGkgPT4gaS50ZXN0ID09PSB0ZXN0UnVuLnRlc3QpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgX3NoaWZ0VGVzdFF1ZXVlICgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKCF0aGlzLnRhc2tJbmZvKVxuICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIGxldCBjdXJyZW50Rml4dHVyZSA9IG51bGw7XG4gICAgICAgIGxldCBuZXh0UmVwb3J0SXRlbSA9IG51bGw7XG4gICAgICAgIGxldCB0ZXN0SXRlbSAgICAgICA9IG51bGw7XG4gICAgICAgIGNvbnN0IHRlc3RRdWV1ZSAgICA9IHRoaXMudGFza0luZm8udGVzdFF1ZXVlO1xuXG4gICAgICAgIHdoaWxlICh0ZXN0UXVldWUubGVuZ3RoICYmIHRlc3RRdWV1ZVswXS50ZXN0UnVuSW5mbykge1xuICAgICAgICAgICAgdGVzdEl0ZW0gICAgICAgPSB0ZXN0UXVldWUuc2hpZnQoKSBhcyBUZXN0SW5mbztcbiAgICAgICAgICAgIGN1cnJlbnRGaXh0dXJlID0gdGVzdEl0ZW0uZml4dHVyZTtcblxuICAgICAgICAgICAgLy8gTk9URTogaGVyZSB3ZSBhc3N1bWUgdGhhdCB0ZXN0cyBhcmUgc29ydGVkIGJ5IGZpeHR1cmUuXG4gICAgICAgICAgICAvLyBUaGVyZWZvcmUsIGlmIHRoZSBuZXh0IHJlcG9ydCBpdGVtIGhhcyBhIGRpZmZlcmVudFxuICAgICAgICAgICAgLy8gZml4dHVyZSwgd2UgY2FuIHJlcG9ydCB0aGlzIGZpeHR1cmUgc3RhcnQuXG4gICAgICAgICAgICBuZXh0UmVwb3J0SXRlbSA9IHRlc3RRdWV1ZVswXTtcblxuICAgICAgICAgICAgYXdhaXQgdGhpcy5kaXNwYXRjaFRvUGx1Z2luKHtcbiAgICAgICAgICAgICAgICBtZXRob2Q6ICAgICAgICBSZXBvcnRlclBsdWdpbk1ldGhvZC5yZXBvcnRUZXN0RG9uZSxcbiAgICAgICAgICAgICAgICBpbml0aWFsT2JqZWN0OiB0aGlzLnRhc2tJbmZvLnRhc2ssXG4gICAgICAgICAgICAgICAgYXJnczogICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAgICB0ZXN0SXRlbS50ZXN0Lm5hbWUsXG4gICAgICAgICAgICAgICAgICAgIHRlc3RJdGVtLnRlc3RSdW5JbmZvLFxuICAgICAgICAgICAgICAgICAgICB0ZXN0SXRlbS50ZXN0Lm1ldGEsXG4gICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpZiAoIW5leHRSZXBvcnRJdGVtIHx8IG5leHRSZXBvcnRJdGVtLmZpeHR1cmUgPT09IGN1cnJlbnRGaXh0dXJlKVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICBhd2FpdCB0aGlzLmRpc3BhdGNoVG9QbHVnaW4oe1xuICAgICAgICAgICAgICAgIG1ldGhvZDogICAgICAgIFJlcG9ydGVyUGx1Z2luTWV0aG9kLnJlcG9ydEZpeHR1cmVTdGFydCxcbiAgICAgICAgICAgICAgICBpbml0aWFsT2JqZWN0OiB0aGlzLnRhc2tJbmZvLnRhc2ssXG4gICAgICAgICAgICAgICAgYXJnczogICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAgICBuZXh0UmVwb3J0SXRlbS5maXh0dXJlLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgIG5leHRSZXBvcnRJdGVtLmZpeHR1cmUucGF0aCxcbiAgICAgICAgICAgICAgICAgICAgbmV4dFJlcG9ydEl0ZW0uZml4dHVyZS5tZXRhLFxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgX3Jlc29sdmVUZXN0SXRlbSAodGFza0luZm86IFRhc2tJbmZvLCB0ZXN0SXRlbTogVGVzdEluZm8sIHRlc3RSdW46IFRlc3RSdW4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKCF0YXNrSW5mby50YXNrKVxuICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIGlmICh0YXNrSW5mby50YXNrLnNjcmVlbnNob3RzLmhhc0NhcHR1cmVkRm9yKHRlc3RSdW4udGVzdCkpIHtcbiAgICAgICAgICAgIHRlc3RJdGVtLnNjcmVlbnNob3RQYXRoID0gdGFza0luZm8udGFzay5zY3JlZW5zaG90cy5nZXRQYXRoRm9yKHRlc3RSdW4udGVzdCk7XG4gICAgICAgICAgICB0ZXN0SXRlbS5zY3JlZW5zaG90cyAgICA9IHRhc2tJbmZvLnRhc2suc2NyZWVuc2hvdHMuZ2V0U2NyZWVuc2hvdHNJbmZvKHRlc3RSdW4udGVzdCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGFza0luZm8udGFzay52aWRlb3MpXG4gICAgICAgICAgICB0ZXN0SXRlbS52aWRlb3MgPSB0YXNrSW5mby50YXNrLnZpZGVvcy5nZXRUZXN0VmlkZW9zKHRlc3RJdGVtLnRlc3QuaWQpO1xuXG4gICAgICAgIGlmICh0ZXN0UnVuLnF1YXJhbnRpbmUpIHtcbiAgICAgICAgICAgIGNvbnN0IHRlc3RJdGVtUXVhcmFudGluZSA9IHRlc3RSdW4ucXVhcmFudGluZS5hdHRlbXB0cy5yZWR1Y2UoKHJlc3VsdDogUmVjb3JkPHN0cmluZywgb2JqZWN0PiwgeyBlcnJvcnMgfSwgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhc3NlZCAgICAgICAgICAgID0gIWVycm9ycy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgY29uc3QgcXVhcmFudGluZUF0dGVtcHQgPSBpbmRleCArIDE7XG5cbiAgICAgICAgICAgICAgICByZXN1bHRbcXVhcmFudGluZUF0dGVtcHRdID0geyBwYXNzZWQgfTtcblxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICB9LCB7IH0pO1xuXG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKHRlc3RJdGVtLnF1YXJhbnRpbmUgYXMgb2JqZWN0LCB0ZXN0SXRlbVF1YXJhbnRpbmUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0ZXN0SXRlbS50ZXN0UnVuSW5mbykge1xuICAgICAgICAgICAgdGVzdEl0ZW0udGVzdFJ1bkluZm8gPSBSZXBvcnRlci5fY3JlYXRlVGVzdFJ1bkluZm8odGVzdEl0ZW0pO1xuXG4gICAgICAgICAgICBpZiAodGVzdEl0ZW0udGVzdC5za2lwKVxuICAgICAgICAgICAgICAgIHRhc2tJbmZvLnNraXBwZWQrKztcbiAgICAgICAgICAgIGVsc2UgaWYgKHRlc3RJdGVtLmVycnMubGVuZ3RoKVxuICAgICAgICAgICAgICAgIHRhc2tJbmZvLmZhaWxlZCsrO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHRhc2tJbmZvLnBhc3NlZCsrO1xuICAgICAgICB9XG5cbiAgICAgICAgYXdhaXQgdGhpcy5fc2hpZnRUZXN0UXVldWUoKTtcblxuICAgICAgICAodGVzdEl0ZW0ucGVuZGluZ1Rlc3RSdW5Eb25lUHJvbWlzZS5yZXNvbHZlIGFzIEZ1bmN0aW9uKSgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX3ByZXBhcmVSZXBvcnRUZXN0QWN0aW9uRXZlbnRBcmdzICh7IGNvbW1hbmQsIGR1cmF0aW9uLCByZXN1bHQsIHRlc3RSdW4sIGVyciB9OiBSZXBvcnRUZXN0QWN0aW9uRXZlbnRBcmd1bWVudHMpOiBhbnkge1xuICAgICAgICBjb25zdCBhcmdzOiBhbnkgPSB7fTtcblxuICAgICAgICBpZiAoZXJyKVxuICAgICAgICAgICAgYXJncy5lcnIgPSBlcnI7XG5cbiAgICAgICAgaWYgKHR5cGVvZiBkdXJhdGlvbiA9PT0gJ251bWJlcicpXG4gICAgICAgICAgICBhcmdzLmR1cmF0aW9uID0gZHVyYXRpb247XG5cbiAgICAgICAgY29uc3QgdGVzdEZpeHR1cmUgPSB0ZXN0UnVuLnRlc3QuZml4dHVyZSBhcyBGaXh0dXJlO1xuXG4gICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKGFyZ3MsIHtcbiAgICAgICAgICAgIHRlc3RSdW5JZDogdGVzdFJ1bi5pZCxcbiAgICAgICAgICAgIHRlc3Q6ICAgICAge1xuICAgICAgICAgICAgICAgIGlkOiAgICB0ZXN0UnVuLnRlc3QuaWQsXG4gICAgICAgICAgICAgICAgbmFtZTogIHRlc3RSdW4udGVzdC5uYW1lLFxuICAgICAgICAgICAgICAgIHBoYXNlOiB0ZXN0UnVuLnBoYXNlLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGZpeHR1cmU6IHtcbiAgICAgICAgICAgICAgICBuYW1lOiB0ZXN0Rml4dHVyZS5uYW1lLFxuICAgICAgICAgICAgICAgIGlkOiAgIHRlc3RGaXh0dXJlLmlkLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvbW1hbmQ6IGZvcm1hdENvbW1hbmQoY29tbWFuZCwgcmVzdWx0KSxcbiAgICAgICAgICAgIGJyb3dzZXI6IHRlc3RSdW4uYnJvd3NlcixcbiAgICAgICAgfSk7XG4gICAgfVxuXG5cbiAgICBwcml2YXRlIGFzeW5jIF9vbmNlVGFza1N0YXJ0SGFuZGxlciAodGFzazogVGFzayk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICB0aGlzLnRhc2tJbmZvID0ge1xuICAgICAgICAgICAgdGFzazogICAgICAgICAgICAgICAgICAgdGFzayxcbiAgICAgICAgICAgIHBhc3NlZDogICAgICAgICAgICAgICAgIDAsXG4gICAgICAgICAgICBmYWlsZWQ6ICAgICAgICAgICAgICAgICAwLFxuICAgICAgICAgICAgc2tpcHBlZDogICAgICAgICAgICAgICAgMCxcbiAgICAgICAgICAgIHRlc3RDb3VudDogICAgICAgICAgICAgIHRhc2sudGVzdHMuZmlsdGVyKHRlc3QgPT4gIXRlc3Quc2tpcCkubGVuZ3RoLFxuICAgICAgICAgICAgdGVzdFF1ZXVlOiAgICAgICAgICAgICAgUmVwb3J0ZXIuX2NyZWF0ZVRlc3RRdWV1ZSh0YXNrKSxcbiAgICAgICAgICAgIHN0b3BPbkZpcnN0RmFpbDogICAgICAgIHRhc2sub3B0cy5zdG9wT25GaXJzdEZhaWwgYXMgYm9vbGVhbixcbiAgICAgICAgICAgIHBlbmRpbmdUYXNrRG9uZVByb21pc2U6IFJlcG9ydGVyLl9jcmVhdGVQZW5kaW5nUHJvbWlzZSgpLFxuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IHN0YXJ0VGltZSAgICAgICAgICAgICAgPSB0YXNrLnN0YXJ0VGltZTtcbiAgICAgICAgY29uc3QgYnJvd3NlckNvbm5lY3Rpb25zSW5mbyA9IChbXSBhcyBCcm93c2VyQ29ubmVjdGlvbltdKVxuICAgICAgICAgICAgLmNvbmNhdCguLi50YXNrLmJyb3dzZXJDb25uZWN0aW9uR3JvdXBzKVxuICAgICAgICAgICAgLm1hcChjb25uZWN0aW9uID0+IGNvbm5lY3Rpb24udXNlckFnZW50KTtcbiAgICAgICAgY29uc3QgZmlyc3QgICAgICAgICAgICAgICAgICA9IHRoaXMudGFza0luZm8udGVzdFF1ZXVlWzBdO1xuXG4gICAgICAgIGNvbnN0IHRhc2tQcm9wZXJ0aWVzID0ge1xuICAgICAgICAgICAgY29uZmlndXJhdGlvbjogdGFzay5vcHRzLFxuICAgICAgICAgICAgZGFzaGJvYXJkVXJsOiAgdGFzay5vcHRzLmRhc2hib2FyZFVybCxcbiAgICAgICAgfTtcblxuICAgICAgICBhd2FpdCB0aGlzLmRpc3BhdGNoVG9QbHVnaW4oe1xuICAgICAgICAgICAgbWV0aG9kOiAgICAgICAgUmVwb3J0ZXJQbHVnaW5NZXRob2QucmVwb3J0VGFza1N0YXJ0LFxuICAgICAgICAgICAgaW5pdGlhbE9iamVjdDogdGFzayxcbiAgICAgICAgICAgIGFyZ3M6ICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICBzdGFydFRpbWUsXG4gICAgICAgICAgICAgICAgYnJvd3NlckNvbm5lY3Rpb25zSW5mbyxcbiAgICAgICAgICAgICAgICB0aGlzLnRhc2tJbmZvLnRlc3RDb3VudCxcbiAgICAgICAgICAgICAgICB0YXNrLnRlc3RTdHJ1Y3R1cmUsXG4gICAgICAgICAgICAgICAgdGFza1Byb3BlcnRpZXMsXG4gICAgICAgICAgICBdLFxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoZmlyc3QpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuZGlzcGF0Y2hUb1BsdWdpbih7XG4gICAgICAgICAgICAgICAgbWV0aG9kOiAgICAgICAgUmVwb3J0ZXJQbHVnaW5NZXRob2QucmVwb3J0Rml4dHVyZVN0YXJ0LFxuICAgICAgICAgICAgICAgIGluaXRpYWxPYmplY3Q6IHRhc2ssXG4gICAgICAgICAgICAgICAgYXJnczogICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAgICBmaXJzdC5maXh0dXJlLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgIGZpcnN0LmZpeHR1cmUucGF0aCxcbiAgICAgICAgICAgICAgICAgICAgZmlyc3QuZml4dHVyZS5tZXRhLFxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgX29uVGFza1Rlc3RSdW5TdGFydEhhbmRsZXIgKHRlc3RSdW46IFRlc3RSdW4pOiBQcm9taXNlPHVua25vd24+IHtcbiAgICAgICAgaWYgKCF0aGlzLnRhc2tJbmZvKVxuICAgICAgICAgICAgcmV0dXJuIHZvaWQgMDtcblxuICAgICAgICBjb25zdCB0ZXN0SXRlbSA9IHRoaXMuX2dldFRlc3RJdGVtRm9yVGVzdFJ1bih0aGlzLnRhc2tJbmZvLCB0ZXN0UnVuKSBhcyBUZXN0SW5mbztcblxuICAgICAgICB0ZXN0SXRlbS50ZXN0UnVuSWRzLnB1c2godGVzdFJ1bi5pZCk7XG5cbiAgICAgICAgaWYgKCF0ZXN0SXRlbS5zdGFydFRpbWUpXG4gICAgICAgICAgICB0ZXN0SXRlbS5zdGFydFRpbWUgPSArbmV3IERhdGUoKTtcblxuICAgICAgICB0ZXN0SXRlbS5wZW5kaW5nU3RhcnRzLS07XG5cbiAgICAgICAgaWYgKCF0ZXN0SXRlbS5wZW5kaW5nU3RhcnRzKSB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBpZiAodGhpcy5wbHVnaW4ucmVwb3J0VGVzdFN0YXJ0KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdGVzdFN0YXJ0SW5mbyA9IHtcbiAgICAgICAgICAgICAgICAgICAgdGVzdFJ1bklkczogdGVzdEl0ZW0udGVzdFJ1bklkcyxcbiAgICAgICAgICAgICAgICAgICAgdGVzdElkOiAgICAgdGVzdEl0ZW0udGVzdC5pZCxcbiAgICAgICAgICAgICAgICAgICAgc3RhcnRUaW1lOiAgbmV3IERhdGUodGVzdEl0ZW0uc3RhcnRUaW1lKSxcbiAgICAgICAgICAgICAgICAgICAgc2tpcHBlZDogICAgdGVzdEl0ZW0udGVzdC5za2lwLFxuICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmRpc3BhdGNoVG9QbHVnaW4oe1xuICAgICAgICAgICAgICAgICAgICBtZXRob2Q6ICAgICAgICBSZXBvcnRlclBsdWdpbk1ldGhvZC5yZXBvcnRUZXN0U3RhcnQgYXMgc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICBpbml0aWFsT2JqZWN0OiB0aGlzLnRhc2tJbmZvLnRhc2ssXG4gICAgICAgICAgICAgICAgICAgIGFyZ3M6ICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RJdGVtLnRlc3QubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RJdGVtLnRlc3QubWV0YSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RTdGFydEluZm8sXG4gICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICh0ZXN0SXRlbS5wZW5kaW5nVGVzdFJ1blN0YXJ0UHJvbWlzZS5yZXNvbHZlIGFzIEZ1bmN0aW9uKSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRlc3RJdGVtLnBlbmRpbmdUZXN0UnVuU3RhcnRQcm9taXNlO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgX29uVGFza1Rlc3RSdW5Eb25lSGFuZGxlciAodGVzdFJ1bjogVGVzdFJ1bik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAoIXRoaXMudGFza0luZm8pXG4gICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgY29uc3QgcmVwb3J0SXRlbSAgICAgICAgICAgICAgICAgICAgPSB0aGlzLl9nZXRUZXN0SXRlbUZvclRlc3RSdW4odGhpcy50YXNrSW5mbywgdGVzdFJ1bikgYXMgVGVzdEluZm87XG4gICAgICAgIGNvbnN0IGlzVGVzdFJ1blN0b3BwZWRUYXNrRXhlY3V0aW9uID0gISF0ZXN0UnVuLmVycnMubGVuZ3RoICYmIHRoaXMudGFza0luZm8uc3RvcE9uRmlyc3RGYWlsO1xuICAgICAgICBjb25zdCBicm93c2VyOiBCcm93c2VyUnVuSW5mbyAgICAgICA9IE9iamVjdC5hc3NpZ24oeyB0ZXN0UnVuSWQ6IHRlc3RSdW4uaWQgfSwgdGVzdFJ1bi5icm93c2VyKTtcblxuICAgICAgICByZXBvcnRJdGVtLmJyb3dzZXJzLnB1c2goYnJvd3Nlcik7XG5cbiAgICAgICAgcmVwb3J0SXRlbS5wZW5kaW5nUnVucyAgICAgICAgICAgID0gaXNUZXN0UnVuU3RvcHBlZFRhc2tFeGVjdXRpb24gPyAwIDogcmVwb3J0SXRlbS5wZW5kaW5nUnVucyAtIDE7XG4gICAgICAgIHJlcG9ydEl0ZW0udW5zdGFibGUgICAgICAgICAgICAgICA9IHJlcG9ydEl0ZW0udW5zdGFibGUgfHwgdGVzdFJ1bi51bnN0YWJsZTtcbiAgICAgICAgcmVwb3J0SXRlbS5lcnJzICAgICAgICAgICAgICAgICAgID0gcmVwb3J0SXRlbS5lcnJzLmNvbmNhdCh0ZXN0UnVuLmVycnMpO1xuICAgICAgICByZXBvcnRJdGVtLndhcm5pbmdzICAgICAgICAgICAgICAgPSB0ZXN0UnVuLndhcm5pbmdMb2cgPyB1bmlvbihyZXBvcnRJdGVtLndhcm5pbmdzLCB0ZXN0UnVuLndhcm5pbmdMb2cubWVzc2FnZXMpIDogW107XG4gICAgICAgIHJlcG9ydEl0ZW0ucmVwb3J0RGF0YSAgICAgICAgICAgICA9IHJlcG9ydEl0ZW0ucmVwb3J0RGF0YSB8fCB7fTtcbiAgICAgICAgcmVwb3J0SXRlbS5yZXBvcnREYXRhW3Rlc3RSdW4uaWRdID0gdGVzdFJ1bi5yZXBvcnREYXRhTG9nID8gdGVzdFJ1bi5yZXBvcnREYXRhTG9nLmRhdGEgOiBbXTtcblxuICAgICAgICBpZiAodGVzdFJ1bi5xdWFyYW50aW5lKSB7XG4gICAgICAgICAgICByZXBvcnRJdGVtLnF1YXJhbnRpbmUgPSByZXBvcnRJdGVtLnF1YXJhbnRpbmUgfHwge307XG5cbiAgICAgICAgICAgIGNvbnN0IHJlcG9ydEl0ZW1RdWFyYW50aW5lID0gdGVzdFJ1bi5xdWFyYW50aW5lLmF0dGVtcHRzLnJlZHVjZSgocmVzdWx0OiBSZWNvcmQ8c3RyaW5nLCBvYmplY3Q+LCB7IGVycm9ycywgdGVzdFJ1bklkIH0pID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXNzZWQgPSAhZXJyb3JzLmxlbmd0aDtcblxuICAgICAgICAgICAgICAgIHJlc3VsdFt0ZXN0UnVuSWRdICAgICAgICAgICAgICAgICAgICA9IHsgcGFzc2VkLCBlcnJvcnMgfTtcbiAgICAgICAgICAgICAgICBicm93c2VyLnF1YXJhbnRpbmVBdHRlbXB0c1Rlc3RSdW5JZHMgPSBicm93c2VyLnF1YXJhbnRpbmVBdHRlbXB0c1Rlc3RSdW5JZHMgfHwgW107XG5cbiAgICAgICAgICAgICAgICBicm93c2VyLnF1YXJhbnRpbmVBdHRlbXB0c1Rlc3RSdW5JZHMucHVzaCh0ZXN0UnVuSWQpO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIH0sIHt9KTtcblxuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihyZXBvcnRJdGVtLnF1YXJhbnRpbmUsIHJlcG9ydEl0ZW1RdWFyYW50aW5lKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghcmVwb3J0SXRlbS5wZW5kaW5nUnVucylcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuX3Jlc29sdmVUZXN0SXRlbSh0aGlzLnRhc2tJbmZvLCByZXBvcnRJdGVtLCB0ZXN0UnVuKTtcblxuICAgICAgICBhd2FpdCByZXBvcnRJdGVtLnBlbmRpbmdUZXN0UnVuRG9uZVByb21pc2U7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBfb25UYXNrVGVzdEFjdGlvblN0YXJ0ICh7IGFwaUFjdGlvbk5hbWUsIC4uLnJlc3RBcmdzIH06IFJlcG9ydFRhc2tBY3Rpb25FdmVudEFyZ3VtZW50cyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAoIXRoaXMudGFza0luZm8pXG4gICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBpZiAodGhpcy5wbHVnaW4ucmVwb3J0VGVzdEFjdGlvblN0YXJ0KSB7XG4gICAgICAgICAgICByZXN0QXJncyA9IHRoaXMuX3ByZXBhcmVSZXBvcnRUZXN0QWN0aW9uRXZlbnRBcmdzKHJlc3RBcmdzIGFzIHVua25vd24gYXMgUmVwb3J0VGVzdEFjdGlvbkV2ZW50QXJndW1lbnRzKTtcblxuICAgICAgICAgICAgYXdhaXQgdGhpcy5kaXNwYXRjaFRvUGx1Z2luKHtcbiAgICAgICAgICAgICAgICBtZXRob2Q6ICAgICAgICBSZXBvcnRlclBsdWdpbk1ldGhvZC5yZXBvcnRUZXN0QWN0aW9uU3RhcnQgYXMgc3RyaW5nLFxuICAgICAgICAgICAgICAgIGluaXRpYWxPYmplY3Q6IHRoaXMudGFza0luZm8udGFzayxcbiAgICAgICAgICAgICAgICBhcmdzOiAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICAgIGFwaUFjdGlvbk5hbWUsXG4gICAgICAgICAgICAgICAgICAgIHJlc3RBcmdzLFxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgX29uVGFza1Rlc3RBY3Rpb25Eb25lICh7IGFwaUFjdGlvbk5hbWUsIC4uLnJlc3RBcmdzIH06IFJlcG9ydFRhc2tBY3Rpb25FdmVudEFyZ3VtZW50cyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAoIXRoaXMudGFza0luZm8pXG4gICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBpZiAodGhpcy5wbHVnaW4ucmVwb3J0VGVzdEFjdGlvbkRvbmUpIHtcbiAgICAgICAgICAgIHJlc3RBcmdzID0gdGhpcy5fcHJlcGFyZVJlcG9ydFRlc3RBY3Rpb25FdmVudEFyZ3MocmVzdEFyZ3MgYXMgdW5rbm93biBhcyBSZXBvcnRUZXN0QWN0aW9uRXZlbnRBcmd1bWVudHMpO1xuXG4gICAgICAgICAgICBhd2FpdCB0aGlzLmRpc3BhdGNoVG9QbHVnaW4oe1xuICAgICAgICAgICAgICAgIG1ldGhvZDogICAgICAgIFJlcG9ydGVyUGx1Z2luTWV0aG9kLnJlcG9ydFRlc3RBY3Rpb25Eb25lIGFzIHN0cmluZyxcbiAgICAgICAgICAgICAgICBpbml0aWFsT2JqZWN0OiB0aGlzLnRhc2tJbmZvLnRhc2ssXG4gICAgICAgICAgICAgICAgYXJnczogICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAgICBhcGlBY3Rpb25OYW1lLFxuICAgICAgICAgICAgICAgICAgICByZXN0QXJncyxcbiAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIF9vbmNlVGFza0RvbmVIYW5kbGVyICgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKCF0aGlzLnRhc2tJbmZvKVxuICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIGNvbnN0IGVuZFRpbWUgPSBuZXcgRGF0ZSgpO1xuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAgICAgICAgIHBhc3NlZENvdW50OiAgdGhpcy50YXNrSW5mby5wYXNzZWQsXG4gICAgICAgICAgICBmYWlsZWRDb3VudDogIHRoaXMudGFza0luZm8uZmFpbGVkLFxuICAgICAgICAgICAgc2tpcHBlZENvdW50OiB0aGlzLnRhc2tJbmZvLnNraXBwZWQsXG4gICAgICAgIH07XG5cbiAgICAgICAgYXdhaXQgdGhpcy5kaXNwYXRjaFRvUGx1Z2luKHtcbiAgICAgICAgICAgIG1ldGhvZDogICAgICAgIFJlcG9ydGVyUGx1Z2luTWV0aG9kLnJlcG9ydFRhc2tEb25lLFxuICAgICAgICAgICAgaW5pdGlhbE9iamVjdDogdGhpcy50YXNrSW5mby50YXNrLFxuICAgICAgICAgICAgYXJnczogICAgICAgICAgW1xuICAgICAgICAgICAgICAgIGVuZFRpbWUsXG4gICAgICAgICAgICAgICAgdGhpcy50YXNrSW5mby5wYXNzZWQsXG4gICAgICAgICAgICAgICAgdGhpcy50YXNrSW5mby50YXNrPy53YXJuaW5nTG9nLm1lc3NhZ2VzLFxuICAgICAgICAgICAgICAgIHJlc3VsdCxcbiAgICAgICAgICAgIF0sXG4gICAgICAgIH0pO1xuXG4gICAgICAgICh0aGlzLnRhc2tJbmZvLnBlbmRpbmdUYXNrRG9uZVByb21pc2UucmVzb2x2ZSBhcyBGdW5jdGlvbikoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9wcmVwYXJlUmVwb3J0RGF0YUV2ZW50QXJncyAodGVzdFJ1bjogVGVzdFJ1bik6IGFueSB7XG4gICAgICAgIGNvbnN0IHsgdGVzdCwgYnJvd3NlciwgaWQgfSA9IHRlc3RSdW47XG4gICAgICAgIGNvbnN0IGZpeHR1cmUgICAgICAgICAgICAgICA9IHRlc3QuZml4dHVyZTtcblxuICAgICAgICBjb25zdCB0ZXN0SW5mbyA9IHtcbiAgICAgICAgICAgIG5hbWU6IHRlc3QubmFtZSxcbiAgICAgICAgICAgIGlkOiAgIHRlc3QuaWQsXG4gICAgICAgICAgICBtZXRhOiB0ZXN0Lm1ldGEsXG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgZml4dHVyZUluZm8gPSB7XG4gICAgICAgICAgICBuYW1lOiBmaXh0dXJlPy5uYW1lLFxuICAgICAgICAgICAgaWQ6ICAgZml4dHVyZT8uaWQsXG4gICAgICAgICAgICBtZXRhOiBmaXh0dXJlPy5tZXRhLFxuICAgICAgICAgICAgcGF0aDogZml4dHVyZT8ucGF0aCxcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdGVzdDogICAgICB0ZXN0SW5mbyxcbiAgICAgICAgICAgIGZpeHR1cmU6ICAgZml4dHVyZUluZm8sXG4gICAgICAgICAgICB0ZXN0UnVuSWQ6IGlkLFxuICAgICAgICAgICAgYnJvd3NlcixcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIF9vblJlcG9ydERhdGFIYW5kbGVyICh7IHRlc3RSdW4sIGRhdGEgfTogUmVwb3J0RGF0YUV2ZW50QXJncyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAoIXRoaXMudGFza0luZm8pXG4gICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgY29uc3QgdGVzdFJ1bkluZm8gPSB0aGlzLl9wcmVwYXJlUmVwb3J0RGF0YUV2ZW50QXJncyh0ZXN0UnVuKTtcblxuICAgICAgICBhd2FpdCB0aGlzLmRpc3BhdGNoVG9QbHVnaW4oe1xuICAgICAgICAgICAgbWV0aG9kOiAgICAgICAgUmVwb3J0ZXJQbHVnaW5NZXRob2QucmVwb3J0RGF0YSBhcyBzdHJpbmcsXG4gICAgICAgICAgICBpbml0aWFsT2JqZWN0OiB0aGlzLnRhc2tJbmZvLnRhc2ssXG4gICAgICAgICAgICBhcmdzOiAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgdGVzdFJ1bkluZm8sXG4gICAgICAgICAgICAgICAgLi4uZGF0YSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgX3Jlc29sdmVQbHVnaW5Ib29rcyAocmVwb3J0ZXJIb29rczogUmVwb3J0ZXJIb29rc3x1bmRlZmluZWQsIG5hbWU6IHN0cmluZyk6IFJlcG9ydGVyUGx1Z2luSG9va3MgfCB1bmRlZmluZWQge1xuICAgICAgICBpZiAoIXJlcG9ydGVySG9va3MpXG4gICAgICAgICAgICByZXR1cm4gdm9pZCAwO1xuXG4gICAgICAgIGNvbnN0IHJlc3VsdEhvb2tzOiBSZXBvcnRlclBsdWdpbkhvb2tzID0ge307XG5cbiAgICAgICAgaWYgKHJlcG9ydGVySG9va3Mub25CZWZvcmVXcml0ZSAmJiByZXBvcnRlckhvb2tzLm9uQmVmb3JlV3JpdGVbbmFtZV0pXG4gICAgICAgICAgICByZXN1bHRIb29rcy5vbkJlZm9yZVdyaXRlID0gcmVwb3J0ZXJIb29rcy5vbkJlZm9yZVdyaXRlW25hbWVdO1xuXG4gICAgICAgIHJldHVybiByZXN1bHRIb29rcztcbiAgICB9XG59XG4iXX0=
@@ -1,3 +1,3 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZXJmYWNlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9yZXBvcnRlci9pbnRlcmZhY2VzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBXcml0YWJsZSBhcyBXcml0YWJsZVN0cmVhbSB9IGZyb20gJ3N0cmVhbSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVwb3J0ZXJQbHVnaW4ge1xuICAgIGluaXQoKTogdm9pZDtcbiAgICByZXBvcnRUYXNrU3RhcnQoKTogdm9pZDtcbiAgICByZXBvcnRGaXh0dXJlU3RhcnQoKTogdm9pZDtcbiAgICByZXBvcnRUZXN0U3RhcnQ/KCk6IHZvaWQ7XG4gICAgcmVwb3J0VGVzdEFjdGlvblN0YXJ0PygpOiB2b2lkO1xuICAgIHJlcG9ydFRlc3RBY3Rpb25Eb25lPygpOiB2b2lkO1xuICAgIHJlcG9ydFRlc3REb25lKCk6IHZvaWQ7XG4gICAgcmVwb3J0VGFza0RvbmUoKTogdm9pZDtcbiAgICByZXBvcnRXYXJuaW5ncz8oKTogdm9pZDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZXBvcnRlclNvdXJjZSB7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIG91dHB1dD86IHN0cmluZyB8IFdyaXRhYmxlU3RyZWFtO1xuICAgIG9wdGlvbnM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlcG9ydGVyUGx1Z2luU291cmNlIHtcbiAgICBwbHVnaW46IFJlcG9ydGVyUGx1Z2luO1xuICAgIG5hbWU6IHN0cmluZztcbiAgICBvdXRTdHJlYW0/OiBXcml0YWJsZVN0cmVhbTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZXBvcnRlclBsdWdpbkZhY3Rvcnkge1xuICAgIChvcHRpb25zPzogUmVjb3JkPHN0cmluZywgYW55Pik6IFJlcG9ydGVyUGx1Z2luO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlcG9ydGVyU3ltYm9scyB7XG4gICAgb2s6IHN0cmluZztcbiAgICBlcnI6IHN0cmluZztcbn1cblxuIl19
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZXJmYWNlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9yZXBvcnRlci9pbnRlcmZhY2VzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBXcml0YWJsZSBhcyBXcml0YWJsZVN0cmVhbSB9IGZyb20gJ3N0cmVhbSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVwb3J0ZXJQbHVnaW4ge1xuICAgIGluaXQoKTogdm9pZDtcbiAgICByZXBvcnRUYXNrU3RhcnQoKTogdm9pZDtcbiAgICByZXBvcnRGaXh0dXJlU3RhcnQoKTogdm9pZDtcbiAgICByZXBvcnRUZXN0U3RhcnQ/KCk6IHZvaWQ7XG4gICAgcmVwb3J0VGVzdEFjdGlvblN0YXJ0PygpOiB2b2lkO1xuICAgIHJlcG9ydFRlc3RBY3Rpb25Eb25lPygpOiB2b2lkO1xuICAgIHJlcG9ydFRlc3REb25lKCk6IHZvaWQ7XG4gICAgcmVwb3J0VGFza0RvbmUoKTogdm9pZDtcbiAgICByZXBvcnRXYXJuaW5ncz8oKTogdm9pZDtcbiAgICByZXBvcnREYXRhPyAoKTogdm9pZFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlcG9ydGVyU291cmNlIHtcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgb3V0cHV0Pzogc3RyaW5nIHwgV3JpdGFibGVTdHJlYW07XG4gICAgb3B0aW9ucz86IFJlY29yZDxzdHJpbmcsIGFueT47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVwb3J0ZXJQbHVnaW5Tb3VyY2Uge1xuICAgIHBsdWdpbjogUmVwb3J0ZXJQbHVnaW47XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIG91dFN0cmVhbT86IFdyaXRhYmxlU3RyZWFtO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlcG9ydGVyUGx1Z2luRmFjdG9yeSB7XG4gICAgKG9wdGlvbnM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KTogUmVwb3J0ZXJQbHVnaW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVwb3J0ZXJTeW1ib2xzIHtcbiAgICBvazogc3RyaW5nO1xuICAgIGVycjogc3RyaW5nO1xufVxuXG4iXX0=
@@ -5,12 +5,14 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  const chalk_1 = __importDefault(require("chalk"));
7
7
  const indent_string_1 = __importDefault(require("indent-string"));
8
+ const callsite_1 = __importDefault(require("callsite"));
8
9
  const lodash_1 = require("lodash");
9
10
  const moment_loader_1 = __importDefault(require("../utils/moment-loader"));
10
11
  const string_1 = require("../utils/string");
11
12
  const get_viewport_width_1 = __importDefault(require("../utils/get-viewport-width"));
12
13
  const colors_1 = require("../utils/diff/colors");
13
14
  const symbols_1 = __importDefault(require("../reporter/symbols"));
15
+ const plugin_methods_1 = __importDefault(require("./plugin-methods"));
14
16
  // NOTE: we should not expose internal state to
15
17
  // the plugin, to avoid accidental rewrites.
16
18
  // Therefore we use symbols to store them.
@@ -19,7 +21,7 @@ const wordWrapEnabled = Symbol();
19
21
  const indent = Symbol();
20
22
  const errorDecorator = Symbol();
21
23
  class ReporterPluginHost {
22
- constructor(plugin, outStream, name) {
24
+ constructor(plugin, outStream, name, pluginHooks) {
23
25
  this.name = name;
24
26
  this.streamController = null;
25
27
  this[stream] = outStream || process.stdout;
@@ -31,6 +33,7 @@ class ReporterPluginHost {
31
33
  this.viewportWidth = (0, get_viewport_width_1.default)(this[stream]);
32
34
  this.symbols = Object.assign({}, symbols_1.default);
33
35
  (0, lodash_1.assignIn)(this, plugin);
36
+ this._initPluginHooks(pluginHooks);
34
37
  this[errorDecorator] = this.createErrorDecorator();
35
38
  }
36
39
  // Error decorator
@@ -92,12 +95,19 @@ class ReporterPluginHost {
92
95
  this._writeToUniqueStream('\n');
93
96
  return this;
94
97
  }
95
- write(text) {
98
+ write(text, data) {
99
+ var _a;
96
100
  if (this[wordWrapEnabled])
97
101
  text = this.wordWrap(text, this[indent], this.viewportWidth);
98
102
  else
99
103
  text = this.indentString(text, this[indent]);
100
- this._writeToUniqueStream(text);
104
+ if ((_a = this._hooks) === null || _a === void 0 ? void 0 : _a.onBeforeWrite) {
105
+ const writeInfo = this._createBeforeWriteInfo(text, data);
106
+ this._hooks.onBeforeWrite(writeInfo);
107
+ this._writeToUniqueStream(writeInfo.formattedText);
108
+ }
109
+ else
110
+ this._writeToUniqueStream(text);
101
111
  return this;
102
112
  }
103
113
  useWordWrap(use) {
@@ -108,6 +118,24 @@ class ReporterPluginHost {
108
118
  this[indent] = val;
109
119
  return this;
110
120
  }
121
+ _createBeforeWriteInfo(formattedText, data = {}) {
122
+ const initiator = data.initiator || this._getWriteInitiatorEvent();
123
+ return {
124
+ formatOptions: {
125
+ indent: this[indent],
126
+ useWordWrap: this[wordWrapEnabled],
127
+ },
128
+ formattedText,
129
+ initiator,
130
+ data,
131
+ };
132
+ }
133
+ _getWriteInitiatorEvent() {
134
+ const pluginMethods = Object.keys(plugin_methods_1.default);
135
+ const funcNames = (0, callsite_1.default)().map(site => site.getFunctionName());
136
+ const initiator = funcNames.find(funcName => pluginMethods.some(methodName => methodName === funcName));
137
+ return initiator || '';
138
+ }
111
139
  _writeToUniqueStream(text) {
112
140
  if (!this.streamController || this.streamController.ensureUniqueStream(this[stream], this))
113
141
  this[stream].write(text);
@@ -136,7 +164,19 @@ class ReporterPluginHost {
136
164
  // NOTE: It's an optional method
137
165
  async reportWarnings( /* warnings */) {
138
166
  }
167
+ _initPluginHooks(reporterHooks) {
168
+ if (!reporterHooks)
169
+ return;
170
+ this._hooks = Object.entries(reporterHooks).reduce((previousValue, [hookName, hook]) => {
171
+ if (hook)
172
+ previousValue[hookName] = hook.bind(this);
173
+ return previousValue;
174
+ }, {});
175
+ }
176
+ // NOTE: It's an optional method
177
+ async reportData( /* testRun, ...data */) {
178
+ }
139
179
  }
140
180
  exports.default = ReporterPluginHost;
141
181
  module.exports = exports.default;
142
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLWhvc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcmVwb3J0ZXIvcGx1Z2luLWhvc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxrREFBcUM7QUFDckMsa0VBQXlDO0FBRXpDLG1DQUlnQjtBQUVoQiwyRUFBNEM7QUFDNUMsNENBQTREO0FBQzVELHFGQUEyRDtBQUMzRCxpREFBbUQ7QUFLbkQsa0VBQW1EO0FBR25ELCtDQUErQztBQUMvQyw0Q0FBNEM7QUFDNUMsMENBQTBDO0FBQzFDLE1BQU0sTUFBTSxHQUFZLE1BQU0sRUFBRSxDQUFDO0FBQ2pDLE1BQU0sZUFBZSxHQUFHLE1BQU0sRUFBRSxDQUFDO0FBQ2pDLE1BQU0sTUFBTSxHQUFZLE1BQU0sRUFBRSxDQUFDO0FBQ2pDLE1BQU0sY0FBYyxHQUFJLE1BQU0sRUFBRSxDQUFDO0FBRWpDLE1BQXFCLGtCQUFrQjtJQVluQyxZQUFvQixNQUFXLEVBQUUsU0FBb0IsRUFBRSxJQUFhO1FBQ2hFLElBQUksQ0FBQyxJQUFJLEdBQWUsSUFBSSxDQUFDO1FBQzdCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUM7UUFDN0IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFZLFNBQVMsSUFBSSxPQUFPLENBQUMsTUFBTSxDQUFDO1FBQ3BELElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxLQUFLLENBQUM7UUFDOUIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFZLENBQUMsQ0FBQztRQUUxQixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssT0FBTyxDQUFDLE1BQU0sSUFBSSxlQUFLLENBQUMsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQztRQUV2RixJQUFJLENBQUMsS0FBSyxHQUFXLElBQUksZUFBSyxDQUFDLFdBQVcsQ0FBQyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDO1FBQ25FLElBQUksQ0FB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O1FBQ2IsV0FBVztJQUNmLENBQUM7SUFFRCxnQ0FBZ0M7SUFDekIsS0FBSyxDQUFDLGNBQWMsRUFBRSxjQUFjO0lBQzNDLENBQUM7Q0FDSjtBQXhLRCxxQ0F3S0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgY2hhbGssIHsgQ2hhbGsgfSBmcm9tICdjaGFsayc7XG5pbXBvcnQgaW5kZW50U3RyaW5nIGZyb20gJ2luZGVudC1zdHJpbmcnO1xuXG5pbXBvcnQge1xuICAgIGlkZW50aXR5LFxuICAgIGVzY2FwZSBhcyBlc2NhcGVIdG1sLFxuICAgIGFzc2lnbkluLFxufSBmcm9tICdsb2Rhc2gnO1xuXG5pbXBvcnQgbW9tZW50IGZyb20gJy4uL3V0aWxzL21vbWVudC1sb2FkZXInO1xuaW1wb3J0IHsgd29yZFdyYXAsIHJlbW92ZVRUWUNvbG9ycyB9IGZyb20gJy4uL3V0aWxzL3N0cmluZyc7XG5pbXBvcnQgZ2V0Vmlld3BvcnRXaWR0aCBmcm9tICcuLi91dGlscy9nZXQtdmlld3BvcnQtd2lkdGgnO1xuaW1wb3J0IHsgRElGRl9DT0xPUlMgfSBmcm9tICcuLi91dGlscy9kaWZmL2NvbG9ycyc7XG5pbXBvcnQgeyBNb21lbnQgfSBmcm9tICdtb21lbnQnO1xuaW1wb3J0IFJlcG9ydGVyU3RyZWFtQ29udHJvbGxlciBmcm9tICcuLi9ydW5uZXIvcmVwb3J0ZXItc3RyZWFtLWNvbnRyb2xsZXInO1xuaW1wb3J0IHsgV3JpdGFibGUgfSBmcm9tICdzdHJlYW0nO1xuaW1wb3J0IFRlc3RSdW5FcnJvckZvcm1hdHRhYmxlQWRhcHRlciBmcm9tICcuLi9lcnJvcnMvdGVzdC1ydW4vZm9ybWF0dGFibGUtYWRhcHRlcic7XG5pbXBvcnQgUkVQT1JURVJfU1lNQk9MUyBmcm9tICcuLi9yZXBvcnRlci9zeW1ib2xzJztcbmltcG9ydCB7IFJlcG9ydGVyU3ltYm9scyB9IGZyb20gJy4vaW50ZXJmYWNlcyc7XG5cbi8vIE5PVEU6IHdlIHNob3VsZCBub3QgZXhwb3NlIGludGVybmFsIHN0YXRlIHRvXG4vLyB0aGUgcGx1Z2luLCB0byBhdm9pZCBhY2NpZGVudGFsIHJld3JpdGVzLlxuLy8gVGhlcmVmb3JlIHdlIHVzZSBzeW1ib2xzIHRvIHN0b3JlIHRoZW0uXG5jb25zdCBzdHJlYW0gICAgICAgICAgPSBTeW1ib2woKTtcbmNvbnN0IHdvcmRXcmFwRW5hYmxlZCA9IFN5bWJvbCgpO1xuY29uc3QgaW5kZW50ICAgICAgICAgID0gU3ltYm9sKCk7XG5jb25zdCBlcnJvckRlY29yYXRvciAgPSBTeW1ib2woKTtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUmVwb3J0ZXJQbHVnaW5Ib3N0IHtcbiAgICBwdWJsaWMgbmFtZT86IHN0cmluZztcbiAgICBwdWJsaWMgc3RyZWFtQ29udHJvbGxlcjogUmVwb3J0ZXJTdHJlYW1Db250cm9sbGVyIHwgbnVsbDtcbiAgICBwdWJsaWMgY2hhbGs6IENoYWxrO1xuICAgIHB1YmxpYyBtb21lbnQ6IE1vbWVudDtcbiAgICBwdWJsaWMgdmlld3BvcnRXaWR0aDogbnVtYmVyO1xuICAgIHB1YmxpYyBzeW1ib2xzOiBSZXBvcnRlclN5bWJvbHM7XG4gICAgcHJpdmF0ZSBbc3RyZWFtXTogV3JpdGFibGU7XG4gICAgcHJpdmF0ZSBbd29yZFdyYXBFbmFibGVkXTogYm9vbGVhbjtcbiAgICBwcml2YXRlIFtpbmRlbnRdOiBudW1iZXI7XG4gICAgcHJpdmF0ZSBbZXJyb3JEZWNvcmF0b3JdOiBSZWNvcmQ8c3RyaW5nLCBGdW5jdGlvbj47XG5cbiAgICBwdWJsaWMgY29uc3RydWN0b3IgKHBsdWdpbjogYW55LCBvdXRTdHJlYW0/OiBXcml0YWJsZSwgbmFtZT86IHN0cmluZykge1xuICAgICAgICB0aGlzLm5hbWUgICAgICAgICAgICAgPSBuYW1lO1xuICAgICAgICB0aGlzLnN0cmVhbUNvbnRyb2xsZXIgPSBudWxsO1xuICAgICAgICB0aGlzW3N0cmVhbV0gICAgICAgICAgPSBvdXRTdHJlYW0gfHwgcHJvY2Vzcy5zdGRvdXQ7XG4gICAgICAgIHRoaXNbd29yZFdyYXBFbmFibGVkXSA9IGZhbHNlO1xuICAgICAgICB0aGlzW2luZGVudF0gICAgICAgICAgPSAwO1xuXG4gICAgICAgIGNvbnN0IHVzZUNvbG9ycyA9IHRoaXNbc3RyZWFtXSA9PT0gcHJvY2Vzcy5zdGRvdXQgJiYgY2hhbGsuZW5hYmxlZCAmJiAhcGx1Z2luLm5vQ29sb3JzO1xuXG4gICAgICAgIHRoaXMuY2hhbGsgICAgICAgICA9IG5ldyBjaGFsay5jb25zdHJ1Y3Rvcih7IGVuYWJsZWQ6IHVzZUNvbG9ycyB9KTtcbiAgICAgICAgdGhpcy5tb21lbnQgICAgICAgID0gbW9tZW50O1xuICAgICAgICB0aGlzLnZpZXdwb3J0V2lkdGggPSBnZXRWaWV3cG9ydFdpZHRoKHRoaXNbc3RyZWFtXSk7XG4gICAgICAgIHRoaXMuc3ltYm9scyAgICAgICA9IE9iamVjdC5hc3NpZ24oe30sIFJFUE9SVEVSX1NZTUJPTFMpO1xuXG4gICAgICAgIGFzc2lnbkluKHRoaXMsIHBsdWdpbik7XG5cbiAgICAgICAgdGhpc1tlcnJvckRlY29yYXRvcl0gPSB0aGlzLmNyZWF0ZUVycm9yRGVjb3JhdG9yKCk7XG4gICAgfVxuXG4gICAgLy8gRXJyb3IgZGVjb3JhdG9yXG4gICAgcHVibGljIGNyZWF0ZUVycm9yRGVjb3JhdG9yICgpOiBSZWNvcmQ8c3RyaW5nLCBGdW5jdGlvbj4ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgJ3NwYW4gdXNlci1hZ2VudCc6IChzdHI6IHN0cmluZykgPT4gdGhpcy5jaGFsay5ncmV5KHN0ciksXG5cbiAgICAgICAgICAgICdzcGFuIHN1YnRpdGxlJzogKHN0cjogc3RyaW5nKSA9PiBgLSAke3RoaXMuY2hhbGsuYm9sZC5yZWQoc3RyKX0gLWAsXG4gICAgICAgICAgICAnZGl2IG1lc3NhZ2UnOiAgIChzdHI6IHN0cmluZykgPT4gdGhpcy5jaGFsay5ib2xkLnJlZChzdHIpLFxuXG4gICAgICAgICAgICAnZGl2IHNjcmVlbnNob3QtaW5mbyc6IGlkZW50aXR5LFxuICAgICAgICAgICAgJ2Egc2NyZWVuc2hvdC1wYXRoJzogICAoc3RyOiBzdHJpbmcpID0+IHRoaXMuY2hhbGsuZ3JleS51bmRlcmxpbmUoc3RyKSxcblxuICAgICAgICAgICAgJ2NvZGUnOiBpZGVudGl0eSxcblxuICAgICAgICAgICAgJ3NwYW4gc3ludGF4LXN0cmluZyc6ICAgICAoc3RyOiBzdHJpbmcpID0+IHRoaXMuY2hhbGsuZ3JlZW4oc3RyKSxcbiAgICAgICAgICAgICdzcGFuIHN5bnRheC1wdW5jdHVhdG9yJzogKHN0cjogc3RyaW5nKSA9PiB0aGlzLmNoYWxrLmdyZXkoc3RyKSxcbiAgICAgICAgICAgICdzcGFuIHN5bnRheC1rZXl3b3JkJzogICAgKHN0cjogc3RyaW5nKSA9PiB0aGlzLmNoYWxrLmN5YW4oc3RyKSxcbiAgICAgICAgICAgICdzcGFuIHN5bnRheC1udW1iZXInOiAgICAgKHN0cjogc3RyaW5nKSA9PiB0aGlzLmNoYWxrLm1hZ2VudGEoc3RyKSxcbiAgICAgICAgICAgICdzcGFuIHN5bnRheC1yZWdleCc6ICAgICAgKHN0cjogc3RyaW5nKSA9PiB0aGlzLmNoYWxrLm1hZ2VudGEoc3RyKSxcbiAgICAgICAgICAgICdzcGFuIHN5bnRheC1jb21tZW50JzogICAgKHN0cjogc3RyaW5nKSA9PiB0aGlzLmNoYWxrLmdyZXkuYm9sZChzdHIpLFxuICAgICAgICAgICAgJ3NwYW4gc3ludGF4LWludmFsaWQnOiAgICAoc3RyOiBzdHJpbmcpID0+IHRoaXMuY2hhbGsuaW52ZXJzZShzdHIpLFxuXG4gICAgICAgICAgICBbYHNwYW4gJHtESUZGX0NPTE9SUy5ESUZGX05PVF9NT0RJRklFRH1gXTogKHN0cjogc3RyaW5nKSA9PiB0aGlzLmNoYWxrLmdyYXkoc3RyKSxcbiAgICAgICAgICAgIFtgc3BhbiAke0RJRkZfQ09MT1JTLkRJRkZfQURERUR9YF06ICAgICAgICAoc3RyOiBzdHJpbmcpID0+IHRoaXMuY2hhbGsuZ3JlZW4oc3RyKSxcbiAgICAgICAgICAgIFtgc3BhbiAke0RJRkZfQ09MT1JTLkRJRkZfUkVNT1ZFRH1gXTogICAgICAoc3RyOiBzdHJpbmcpID0+IHRoaXMuY2hhbGsucmVkKHN0ciksXG5cbiAgICAgICAgICAgICdkaXYgY29kZS1mcmFtZSc6ICAgICAgICAgaWRlbnRpdHksXG4gICAgICAgICAgICAnZGl2IGNvZGUtbGluZSc6ICAgICAgICAgIChzdHI6IHN0cmluZykgPT4gc3RyICsgJ1xcbicsXG4gICAgICAgICAgICAnZGl2IGNvZGUtbGluZS1sYXN0JzogICAgIGlkZW50aXR5LFxuICAgICAgICAgICAgJ2RpdiBjb2RlLWxpbmUtbnVtJzogICAgICAoc3RyOiBzdHJpbmcpID0+IGAgICAke3N0cn0gfGAsXG4gICAgICAgICAgICAnZGl2IGNvZGUtbGluZS1udW0tYmFzZSc6IChzdHI6IHN0cmluZykgPT4gdGhpcy5jaGFsay5iZ1JlZChgID4gJHtzdHJ9IGApICsgJ3wnLFxuICAgICAgICAgICAgJ2RpdiBjb2RlLWxpbmUtc3JjJzogICAgICBpZGVudGl0eSxcblxuICAgICAgICAgICAgJ2RpdiBzdGFjayc6ICAgICAgICAgICAgICAgKHN0cjogc3RyaW5nKSA9PiAnXFxuXFxuJyArIHN0cixcbiAgICAgICAgICAgICdkaXYgc3RhY2stbGluZSc6ICAgICAgICAgIChzdHI6IHN0cmluZykgPT4gc3RyICsgJ1xcbicsXG4gICAgICAgICAgICAnZGl2IHN0YWNrLWxpbmUtbGFzdCc6ICAgICBpZGVudGl0eSxcbiAgICAgICAgICAgICdkaXYgc3RhY2stbGluZS1uYW1lJzogICAgIChzdHI6IHN0cmluZykgPT4gYCAgIGF0ICR7dGhpcy5jaGFsay5ib2xkKHN0cil9YCxcbiAgICAgICAgICAgICdkaXYgc3RhY2stbGluZS1sb2NhdGlvbic6IChzdHI6IHN0cmluZykgPT4gYCAoJHt0aGlzLmNoYWxrLmdyZXkudW5kZXJsaW5lKHN0cil9KWAsXG5cbiAgICAgICAgICAgICdzdHJvbmcnOiAoc3RyOiBzdHJpbmcpID0+IHRoaXMuY2hhbGsuYm9sZChzdHIpLFxuICAgICAgICAgICAgJ2EnOiAgICAgIChzdHI6IHN0cmluZykgPT4gYFwiJHt0aGlzLmNoYWxrLnVuZGVybGluZShzdHIpfVwiYCxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBTdHJpbmcgaGVscGVyc1xuICAgIHB1YmxpYyBpbmRlbnRTdHJpbmcgKHN0cjogc3RyaW5nLCBpbmRlbnRWYWw6IG51bWJlcik6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBpbmRlbnRTdHJpbmcoc3RyLCAnICcsIGluZGVudFZhbCk7XG4gICAgfVxuXG4gICAgcHVibGljIHdvcmRXcmFwIChzdHI6IHN0cmluZywgaW5kZW50VmFsOiBudW1iZXIsIHdpZHRoOiBudW1iZXIpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gd29yZFdyYXAoc3RyLCBpbmRlbnRWYWwsIHdpZHRoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZXNjYXBlSHRtbCAoc3RyOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gZXNjYXBlSHRtbChzdHIpO1xuICAgIH1cblxuICAgIHB1YmxpYyBmb3JtYXRFcnJvciAoZXJyOiBUZXN0UnVuRXJyb3JGb3JtYXR0YWJsZUFkYXB0ZXIsIHByZWZpeCA9ICcnKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgcHJlZml4TGVuZ3RoV2l0aG91dENvbG9ycyA9IHJlbW92ZVRUWUNvbG9ycyhwcmVmaXgpLmxlbmd0aDtcbiAgICAgICAgY29uc3QgbWF4TXNnTGVuZ3RoICAgICAgICAgICAgICA9IHRoaXMudmlld3BvcnRXaWR0aCAtIHRoaXNbaW5kZW50XSAtIHByZWZpeExlbmd0aFdpdGhvdXRDb2xvcnM7XG5cbiAgICAgICAgbGV0IG1zZyA9IGVyci5mb3JtYXRNZXNzYWdlKHRoaXNbZXJyb3JEZWNvcmF0b3JdLCBtYXhNc2dMZW5ndGgpO1xuXG4gICAgICAgIGlmICh0aGlzW3dvcmRXcmFwRW5hYmxlZF0pXG4gICAgICAgICAgICBtc2cgPSB0aGlzLndvcmRXcmFwKG1zZywgcHJlZml4TGVuZ3RoV2l0aG91dENvbG9ycywgbWF4TXNnTGVuZ3RoKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgbXNnID0gdGhpcy5pbmRlbnRTdHJpbmcobXNnLCBwcmVmaXhMZW5ndGhXaXRob3V0Q29sb3JzKTtcblxuICAgICAgICByZXR1cm4gcHJlZml4ICsgbXNnLnN1YnN0cihwcmVmaXhMZW5ndGhXaXRob3V0Q29sb3JzKTtcbiAgICB9XG5cblxuICAgIC8vIFdyaXRpbmcgaGVscGVyc1xuICAgIHB1YmxpYyBuZXdsaW5lICgpOiBSZXBvcnRlclBsdWdpbkhvc3Qge1xuICAgICAgICB0aGlzLl93cml0ZVRvVW5pcXVlU3RyZWFtKCdcXG4nKTtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd3JpdGUgKHRleHQ6IHN0cmluZyk6IFJlcG9ydGVyUGx1Z2luSG9zdCB7XG4gICAgICAgIGlmICh0aGlzW3dvcmRXcmFwRW5hYmxlZF0pXG4gICAgICAgICAgICB0ZXh0ID0gdGhpcy53b3JkV3JhcCh0ZXh0LCB0aGlzW2luZGVudF0sIHRoaXMudmlld3BvcnRXaWR0aCk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHRleHQgPSB0aGlzLmluZGVudFN0cmluZyh0ZXh0LCB0aGlzW2luZGVudF0pO1xuXG4gICAgICAgIHRoaXMuX3dyaXRlVG9VbmlxdWVTdHJlYW0odGV4dCk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHVzZVdvcmRXcmFwICh1c2U6IGJvb2xlYW4pOiBSZXBvcnRlclBsdWdpbkhvc3Qge1xuICAgICAgICB0aGlzW3dvcmRXcmFwRW5hYmxlZF0gPSB1c2U7XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHNldEluZGVudCAodmFsOiBudW1iZXIpOiBSZXBvcnRlclBsdWdpbkhvc3Qge1xuICAgICAgICB0aGlzW2luZGVudF0gPSB2YWw7XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfd3JpdGVUb1VuaXF1ZVN0cmVhbSAodGV4dDogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5zdHJlYW1Db250cm9sbGVyIHx8IHRoaXMuc3RyZWFtQ29udHJvbGxlci5lbnN1cmVVbmlxdWVTdHJlYW0odGhpc1tzdHJlYW1dLCB0aGlzKSlcbiAgICAgICAgICAgIHRoaXNbc3RyZWFtXS53cml0ZSh0ZXh0KTtcbiAgICB9XG5cblxuICAgIC8vIEFic3RyYWN0IG1ldGhvZHMgaW1wbGVtZW50ZWQgaW4gcGx1Z2luXG4gICAgcHVibGljIGFzeW5jIHJlcG9ydFRhc2tTdGFydCAoLyogc3RhcnRUaW1lLCB1c2VyQWdlbnRzLCB0ZXN0Q291bnQsIHRlc3RTdHJ1Y3R1cmUsIHRhc2tQcm9wZXJ0aWVzICovKTogUHJvbWlzZTxuZXZlcj4ge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vdCBpbXBsZW1lbnRlZCcpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyByZXBvcnRGaXh0dXJlU3RhcnQgKC8qIG5hbWUsIHBhdGggKi8pOiBQcm9taXNlPG5ldmVyPiB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignTm90IGltcGxlbWVudGVkJyk7XG4gICAgfVxuXG4gICAgLy8gTk9URTogSXQncyBhbiBvcHRpb25hbCBtZXRob2RcbiAgICAvLyBhc3luYyByZXBvcnRUZXN0U3RhcnQgKC8qIG5hbWUsIHRlc3RNZXRhICovKSB7XG4gICAgLy8gICAgIHRocm93IG5ldyBFcnJvcignTm90IGltcGxlbWVudGVkJyk7XG4gICAgLy8gfVxuXG4gICAgcHVibGljIGFzeW5jIHJlcG9ydFRlc3REb25lICgvKiBuYW1lLCB0ZXN0UnVuSW5mbyAqLyk6IFByb21pc2U8bmV2ZXI+IHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdOb3QgaW1wbGVtZW50ZWQnKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgcmVwb3J0VGFza0RvbmUgKC8qIGVuZFRpbWUsIHBhc3NlZCwgd2FybmluZ3MgKi8pOiBQcm9taXNlPG5ldmVyPiB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignTm90IGltcGxlbWVudGVkJyk7XG4gICAgfVxuXG4gICAgLy8gTk9URTogSXQncyBhbiBvcHRpb25hbCBtZXRob2RcbiAgICBwdWJsaWMgYXN5bmMgaW5pdCAoKTogUHJvbWlzZTx2b2lkPiB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LWZ1bmN0aW9uXG4gICAgICAgIC8vIE9wdGlvbmFsXG4gICAgfVxuXG4gICAgLy8gTk9URTogSXQncyBhbiBvcHRpb25hbCBtZXRob2RcbiAgICBwdWJsaWMgYXN5bmMgcmVwb3J0V2FybmluZ3MgKC8qIHdhcm5pbmdzICovKTogUHJvbWlzZTx2b2lkPiB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LWZ1bmN0aW9uXG4gICAgfVxufVxuIl19
182
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLWhvc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcmVwb3J0ZXIvcGx1Z2luLWhvc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxrREFBcUM7QUFDckMsa0VBQXlDO0FBQ3pDLHdEQUFnQztBQUVoQyxtQ0FJZ0I7QUFFaEIsMkVBQTRDO0FBQzVDLDRDQUE0RDtBQUM1RCxxRkFBMkQ7QUFDM0QsaURBQW1EO0FBS25ELGtFQUFtRDtBQUduRCxzRUFBb0Q7QUFFcEQsK0NBQStDO0FBQy9DLDRDQUE0QztBQUM1QywwQ0FBMEM7QUFDMUMsTUFBTSxNQUFNLEdBQVksTUFBTSxFQUFFLENBQUM7QUFDakMsTUFBTSxlQUFlLEdBQUcsTUFBTSxFQUFFLENBQUM7QUFDakMsTUFBTSxNQUFNLEdBQVksTUFBTSxFQUFFLENBQUM7QUFDakMsTUFBTSxjQUFjLEdBQUksTUFBTSxFQUFFLENBQUM7QUFFakMsTUFBcUIsa0JBQWtCO0lBYW5DLFlBQW9CLE1BQVcsRUFBRSxTQUFvQixFQUFFLElBQWEsRUFBRSxXQUFpQztRQUNuRyxJQUFJLENBQUMsSUFBSSxHQUFlLElBQUksQ0FBQztRQUM3QixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDO1FBQzdCLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBWSxTQUFTLElBQUksT0FBTyxDQUFDLE1BQU0sQ0FBQztRQUNwRCxJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsS0FBSyxDQUFDO1FBQzlCLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBWSxDQUFDLENBQUM7UUFFMUIsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLE9BQU8sQ0FBQyxNQUFNLElBQUksZUFBSyxDQUFDLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUM7UUFFdkYsSUFBSSxDQUFDLEtBQUssR0FBVyxJQUFJLGVBQUssQ0FBQyxXQUFXLENBQUMsRUFBRSxPQUFPLEVB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QztJQUN6QixLQUFLLENBQUMsSUFBSTtRQUNiLFdBQVc7SUFDZixDQUFDO0lBRUQsZ0NBQWdDO0lBQ3pCLEtBQUssQ0FBQyxjQUFjLEVBQUUsY0FBYztJQUMzQyxDQUFDO0lBRU8sZ0JBQWdCLENBQUUsYUFBOEM7UUFDcEUsSUFBSSxDQUFDLGFBQWE7WUFDZCxPQUFPO1FBRVgsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLGFBQWEsRUFBRSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFO1lBQ25GLElBQUksSUFBSTtnQkFDSixhQUFhLENBQUMsUUFBcUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7WUFFM0UsT0FBTyxhQUFhLENBQUM7UUFDekIsQ0FBQyxFQUFFLEVBQXlCLENBQUMsQ0FBQztJQUNsQyxDQUFDO0lBRUQsZ0NBQWdDO0lBQ3pCLEtBQUssQ0FBQyxVQUFVLEVBQUUsc0JBQXNCO0lBQy9DLENBQUM7Q0FDSjtBQXhORCxxQ0F3TkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgY2hhbGssIHsgQ2hhbGsgfSBmcm9tICdjaGFsayc7XG5pbXBvcnQgaW5kZW50U3RyaW5nIGZyb20gJ2luZGVudC1zdHJpbmcnO1xuaW1wb3J0IGNhbGxzaXRlIGZyb20gJ2NhbGxzaXRlJztcblxuaW1wb3J0IHtcbiAgICBpZGVudGl0eSxcbiAgICBlc2NhcGUgYXMgZXNjYXBlSHRtbCxcbiAgICBhc3NpZ25Jbixcbn0gZnJvbSAnbG9kYXNoJztcblxuaW1wb3J0IG1vbWVudCBmcm9tICcuLi91dGlscy9tb21lbnQtbG9hZGVyJztcbmltcG9ydCB7IHdvcmRXcmFwLCByZW1vdmVUVFlDb2xvcnMgfSBmcm9tICcuLi91dGlscy9zdHJpbmcnO1xuaW1wb3J0IGdldFZpZXdwb3J0V2lkdGggZnJvbSAnLi4vdXRpbHMvZ2V0LXZpZXdwb3J0LXdpZHRoJztcbmltcG9ydCB7IERJRkZfQ09MT1JTIH0gZnJvbSAnLi4vdXRpbHMvZGlmZi9jb2xvcnMnO1xuaW1wb3J0IHsgTW9tZW50IH0gZnJvbSAnbW9tZW50JztcbmltcG9ydCBSZXBvcnRlclN0cmVhbUNvbnRyb2xsZXIgZnJvbSAnLi4vcnVubmVyL3JlcG9ydGVyLXN0cmVhbS1jb250cm9sbGVyJztcbmltcG9ydCB7IFdyaXRhYmxlIH0gZnJvbSAnc3RyZWFtJztcbmltcG9ydCBUZXN0UnVuRXJyb3JGb3JtYXR0YWJsZUFkYXB0ZXIgZnJvbSAnLi4vZXJyb3JzL3Rlc3QtcnVuL2Zvcm1hdHRhYmxlLWFkYXB0ZXInO1xuaW1wb3J0IFJFUE9SVEVSX1NZTUJPTFMgZnJvbSAnLi4vcmVwb3J0ZXIvc3ltYm9scyc7XG5pbXBvcnQgeyBSZXBvcnRlclN5bWJvbHMgfSBmcm9tICcuL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgUmVwb3J0ZXJQbHVnaW5Ib29rcywgV3JpdGVJbmZvIH0gZnJvbSAnLi9pbmRleCc7XG5pbXBvcnQgUmVwb3J0ZXJQbHVnaW5NZXRob2QgZnJvbSAnLi9wbHVnaW4tbWV0aG9kcyc7XG5cbi8vIE5PVEU6IHdlIHNob3VsZCBub3QgZXhwb3NlIGludGVybmFsIHN0YXRlIHRvXG4vLyB0aGUgcGx1Z2luLCB0byBhdm9pZCBhY2NpZGVudGFsIHJld3JpdGVzLlxuLy8gVGhlcmVmb3JlIHdlIHVzZSBzeW1ib2xzIHRvIHN0b3JlIHRoZW0uXG5jb25zdCBzdHJlYW0gICAgICAgICAgPSBTeW1ib2woKTtcbmNvbnN0IHdvcmRXcmFwRW5hYmxlZCA9IFN5bWJvbCgpO1xuY29uc3QgaW5kZW50ICAgICAgICAgID0gU3ltYm9sKCk7XG5jb25zdCBlcnJvckRlY29yYXRvciAgPSBTeW1ib2woKTtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUmVwb3J0ZXJQbHVnaW5Ib3N0IHtcbiAgICBwdWJsaWMgbmFtZT86IHN0cmluZztcbiAgICBwdWJsaWMgc3RyZWFtQ29udHJvbGxlcjogUmVwb3J0ZXJTdHJlYW1Db250cm9sbGVyIHwgbnVsbDtcbiAgICBwdWJsaWMgY2hhbGs6IENoYWxrO1xuICAgIHB1YmxpYyBtb21lbnQ6IE1vbWVudDtcbiAgICBwdWJsaWMgdmlld3BvcnRXaWR0aDogbnVtYmVyO1xuICAgIHB1YmxpYyBzeW1ib2xzOiBSZXBvcnRlclN5bWJvbHM7XG4gICAgcHJpdmF0ZSBbc3RyZWFtXTogV3JpdGFibGU7XG4gICAgcHJpdmF0ZSBbd29yZFdyYXBFbmFibGVkXTogYm9vbGVhbjtcbiAgICBwcml2YXRlIFtpbmRlbnRdOiBudW1iZXI7XG4gICAgcHJpdmF0ZSBbZXJyb3JEZWNvcmF0b3JdOiBSZWNvcmQ8c3RyaW5nLCBGdW5jdGlvbj47XG4gICAgcHJpdmF0ZSBfaG9va3M6IFJlcG9ydGVyUGx1Z2luSG9va3MgfCB1bmRlZmluZWQ7XG5cbiAgICBwdWJsaWMgY29uc3RydWN0b3IgKHBsdWdpbjogYW55LCBvdXRTdHJlYW0/OiBXcml0YWJsZSwgbmFtZT86IHN0cmluZywgcGx1Z2luSG9va3M/OiBSZXBvcnRlclBsdWdpbkhvb2tzKSB7XG4gICAgICAgIHRoaXMubmFtZSAgICAgICAgICAgICA9IG5hbWU7XG4gICAgICAgIHRoaXMuc3RyZWFtQ29udHJvbGxlciA9IG51bGw7XG4gICAgICAgIHRoaXNbc3RyZWFtXSAgICAgICAgICA9IG91dFN0cmVhbSB8fCBwcm9jZXNzLnN0ZG91dDtcbiAgICAgICAgdGhpc1t3b3JkV3JhcEVuYWJsZWRdID0gZmFsc2U7XG4gICAgICAgIHRoaXNbaW5kZW50XSAgICAgICAgICA9IDA7XG5cbiAgICAgICAgY29uc3QgdXNlQ29sb3JzID0gdGhpc1tzdHJlYW1dID09PSBwcm9jZXNzLnN0ZG91dCAmJiBjaGFsay5lbmFibGVkICYmICFwbHVnaW4ubm9Db2xvcnM7XG5cbiAgICAgICAgdGhpcy5jaGFsayAgICAgICAgID0gbmV3IGNoYWxrLmNvbnN0cnVjdG9yKHsgZW5hYmxlZDogdXNlQ29sb3JzIH0pO1xuICAgICAgICB0aGlzLm1vbWVudCAgICAgICAgPSBtb21lbnQ7XG4gICAgICAgIHRoaXMudmlld3BvcnRXaWR0aCA9IGdldFZpZXdwb3J0V2lkdGgodGhpc1tzdHJlYW1dKTtcbiAgICAgICAgdGhpcy5zeW1ib2xzICAgICAgID0gT2JqZWN0LmFzc2lnbih7fSwgUkVQT1JURVJfU1lNQk9MUyk7XG5cbiAgICAgICAgYXNzaWduSW4odGhpcywgcGx1Z2luKTtcblxuICAgICAgICB0aGlzLl9pbml0UGx1Z2luSG9va3MocGx1Z2luSG9va3MpO1xuXG4gICAgICAgIHRoaXNbZXJyb3JEZWNvcmF0b3JdID0gdGhpcy5jcmVhdGVFcnJvckRlY29yYXRvcigpO1xuICAgIH1cblxuICAgIC8vIEVycm9yIGRlY29yYXRvclxuICAgIHB1YmxpYyBjcmVhdGVFcnJvckRlY29yYXRvciAoKTogUmVjb3JkPHN0cmluZywgRnVuY3Rpb24+IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICdzcGFuIHVzZXItYWdlbnQnOiAoc3RyOiBzdHJpbmcpID0+IHRoaXMuY2hhbGsuZ3JleShzdHIpLFxuXG4gICAgICAgICAgICAnc3BhbiBzdWJ0aXRsZSc6IChzdHI6IHN0cmluZykgPT4gYC0gJHt0aGlzLmNoYWxrLmJvbGQucmVkKHN0cil9IC1gLFxuICAgICAgICAgICAgJ2RpdiBtZXNzYWdlJzogICAoc3RyOiBzdHJpbmcpID0+IHRoaXMuY2hhbGsuYm9sZC5yZWQoc3RyKSxcblxuICAgICAgICAgICAgJ2RpdiBzY3JlZW5zaG90LWluZm8nOiBpZGVudGl0eSxcbiAgICAgICAgICAgICdhIHNjcmVlbnNob3QtcGF0aCc6ICAgKHN0cjogc3RyaW5nKSA9PiB0aGlzLmNoYWxrLmdyZXkudW5kZXJsaW5lKHN0ciksXG5cbiAgICAgICAgICAgICdjb2RlJzogaWRlbnRpdHksXG5cbiAgICAgICAgICAgICdzcGFuIHN5bnRheC1zdHJpbmcnOiAgICAgKHN0cjogc3RyaW5nKSA9PiB0aGlzLmNoYWxrLmdyZWVuKHN0ciksXG4gICAgICAgICAgICAnc3BhbiBzeW50YXgtcHVuY3R1YXRvcic6IChzdHI6IHN0cmluZykgPT4gdGhpcy5jaGFsay5ncmV5KHN0ciksXG4gICAgICAgICAgICAnc3BhbiBzeW50YXgta2V5d29yZCc6ICAgIChzdHI6IHN0cmluZykgPT4gdGhpcy5jaGFsay5jeWFuKHN0ciksXG4gICAgICAgICAgICAnc3BhbiBzeW50YXgtbnVtYmVyJzogICAgIChzdHI6IHN0cmluZykgPT4gdGhpcy5jaGFsay5tYWdlbnRhKHN0ciksXG4gICAgICAgICAgICAnc3BhbiBzeW50YXgtcmVnZXgnOiAgICAgIChzdHI6IHN0cmluZykgPT4gdGhpcy5jaGFsay5tYWdlbnRhKHN0ciksXG4gICAgICAgICAgICAnc3BhbiBzeW50YXgtY29tbWVudCc6ICAgIChzdHI6IHN0cmluZykgPT4gdGhpcy5jaGFsay5ncmV5LmJvbGQoc3RyKSxcbiAgICAgICAgICAgICdzcGFuIHN5bnRheC1pbnZhbGlkJzogICAgKHN0cjogc3RyaW5nKSA9PiB0aGlzLmNoYWxrLmludmVyc2Uoc3RyKSxcblxuICAgICAgICAgICAgW2BzcGFuICR7RElGRl9DT0xPUlMuRElGRl9OT1RfTU9ESUZJRUR9YF06IChzdHI6IHN0cmluZykgPT4gdGhpcy5jaGFsay5ncmF5KHN0ciksXG4gICAgICAgICAgICBbYHNwYW4gJHtESUZGX0NPTE9SUy5ESUZGX0FEREVEfWBdOiAgICAgICAgKHN0cjogc3RyaW5nKSA9PiB0aGlzLmNoYWxrLmdyZWVuKHN0ciksXG4gICAgICAgICAgICBbYHNwYW4gJHtESUZGX0NPTE9SUy5ESUZGX1JFTU9WRUR9YF06ICAgICAgKHN0cjogc3RyaW5nKSA9PiB0aGlzLmNoYWxrLnJlZChzdHIpLFxuXG4gICAgICAgICAgICAnZGl2IGNvZGUtZnJhbWUnOiAgICAgICAgIGlkZW50aXR5LFxuICAgICAgICAgICAgJ2RpdiBjb2RlLWxpbmUnOiAgICAgICAgICAoc3RyOiBzdHJpbmcpID0+IHN0ciArICdcXG4nLFxuICAgICAgICAgICAgJ2RpdiBjb2RlLWxpbmUtbGFzdCc6ICAgICBpZGVudGl0eSxcbiAgICAgICAgICAgICdkaXYgY29kZS1saW5lLW51bSc6ICAgICAgKHN0cjogc3RyaW5nKSA9PiBgICAgJHtzdHJ9IHxgLFxuICAgICAgICAgICAgJ2RpdiBjb2RlLWxpbmUtbnVtLWJhc2UnOiAoc3RyOiBzdHJpbmcpID0+IHRoaXMuY2hhbGsuYmdSZWQoYCA+ICR7c3RyfSBgKSArICd8JyxcbiAgICAgICAgICAgICdkaXYgY29kZS1saW5lLXNyYyc6ICAgICAgaWRlbnRpdHksXG5cbiAgICAgICAgICAgICdkaXYgc3RhY2snOiAgICAgICAgICAgICAgIChzdHI6IHN0cmluZykgPT4gJ1xcblxcbicgKyBzdHIsXG4gICAgICAgICAgICAnZGl2IHN0YWNrLWxpbmUnOiAgICAgICAgICAoc3RyOiBzdHJpbmcpID0+IHN0ciArICdcXG4nLFxuICAgICAgICAgICAgJ2RpdiBzdGFjay1saW5lLWxhc3QnOiAgICAgaWRlbnRpdHksXG4gICAgICAgICAgICAnZGl2IHN0YWNrLWxpbmUtbmFtZSc6ICAgICAoc3RyOiBzdHJpbmcpID0+IGAgICBhdCAke3RoaXMuY2hhbGsuYm9sZChzdHIpfWAsXG4gICAgICAgICAgICAnZGl2IHN0YWNrLWxpbmUtbG9jYXRpb24nOiAoc3RyOiBzdHJpbmcpID0+IGAgKCR7dGhpcy5jaGFsay5ncmV5LnVuZGVybGluZShzdHIpfSlgLFxuXG4gICAgICAgICAgICAnc3Ryb25nJzogKHN0cjogc3RyaW5nKSA9PiB0aGlzLmNoYWxrLmJvbGQoc3RyKSxcbiAgICAgICAgICAgICdhJzogICAgICAoc3RyOiBzdHJpbmcpID0+IGBcIiR7dGhpcy5jaGFsay51bmRlcmxpbmUoc3RyKX1cImAsXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gU3RyaW5nIGhlbHBlcnNcbiAgICBwdWJsaWMgaW5kZW50U3RyaW5nIChzdHI6IHN0cmluZywgaW5kZW50VmFsOiBudW1iZXIpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gaW5kZW50U3RyaW5nKHN0ciwgJyAnLCBpbmRlbnRWYWwpO1xuICAgIH1cblxuICAgIHB1YmxpYyB3b3JkV3JhcCAoc3RyOiBzdHJpbmcsIGluZGVudFZhbDogbnVtYmVyLCB3aWR0aDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHdvcmRXcmFwKHN0ciwgaW5kZW50VmFsLCB3aWR0aCk7XG4gICAgfVxuXG4gICAgcHVibGljIGVzY2FwZUh0bWwgKHN0cjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIGVzY2FwZUh0bWwoc3RyKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZm9ybWF0RXJyb3IgKGVycjogVGVzdFJ1bkVycm9yRm9ybWF0dGFibGVBZGFwdGVyLCBwcmVmaXggPSAnJyk6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IHByZWZpeExlbmd0aFdpdGhvdXRDb2xvcnMgPSByZW1vdmVUVFlDb2xvcnMocHJlZml4KS5sZW5ndGg7XG4gICAgICAgIGNvbnN0IG1heE1zZ0xlbmd0aCAgICAgICAgICAgICAgPSB0aGlzLnZpZXdwb3J0V2lkdGggLSB0aGlzW2luZGVudF0gLSBwcmVmaXhMZW5ndGhXaXRob3V0Q29sb3JzO1xuXG4gICAgICAgIGxldCBtc2cgPSBlcnIuZm9ybWF0TWVzc2FnZSh0aGlzW2Vycm9yRGVjb3JhdG9yXSwgbWF4TXNnTGVuZ3RoKTtcblxuICAgICAgICBpZiAodGhpc1t3b3JkV3JhcEVuYWJsZWRdKVxuICAgICAgICAgICAgbXNnID0gdGhpcy53b3JkV3JhcChtc2csIHByZWZpeExlbmd0aFdpdGhvdXRDb2xvcnMsIG1heE1zZ0xlbmd0aCk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIG1zZyA9IHRoaXMuaW5kZW50U3RyaW5nKG1zZywgcHJlZml4TGVuZ3RoV2l0aG91dENvbG9ycyk7XG5cbiAgICAgICAgcmV0dXJuIHByZWZpeCArIG1zZy5zdWJzdHIocHJlZml4TGVuZ3RoV2l0aG91dENvbG9ycyk7XG4gICAgfVxuXG5cbiAgICAvLyBXcml0aW5nIGhlbHBlcnNcbiAgICBwdWJsaWMgbmV3bGluZSAoKTogUmVwb3J0ZXJQbHVnaW5Ib3N0IHtcbiAgICAgICAgdGhpcy5fd3JpdGVUb1VuaXF1ZVN0cmVhbSgnXFxuJyk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdyaXRlICh0ZXh0OiBzdHJpbmcsIGRhdGE/OiBhbnkpOiBSZXBvcnRlclBsdWdpbkhvc3Qge1xuICAgICAgICBpZiAodGhpc1t3b3JkV3JhcEVuYWJsZWRdKVxuICAgICAgICAgICAgdGV4dCA9IHRoaXMud29yZFdyYXAodGV4dCwgdGhpc1tpbmRlbnRdLCB0aGlzLnZpZXdwb3J0V2lkdGgpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICB0ZXh0ID0gdGhpcy5pbmRlbnRTdHJpbmcodGV4dCwgdGhpc1tpbmRlbnRdKTtcblxuICAgICAgICBpZiAodGhpcy5faG9va3M/Lm9uQmVmb3JlV3JpdGUpIHtcbiAgICAgICAgICAgIGNvbnN0IHdyaXRlSW5mbyA9IHRoaXMuX2NyZWF0ZUJlZm9yZVdyaXRlSW5mbyh0ZXh0LCBkYXRhKTtcblxuICAgICAgICAgICAgdGhpcy5faG9va3Mub25CZWZvcmVXcml0ZSh3cml0ZUluZm8pO1xuICAgICAgICAgICAgdGhpcy5fd3JpdGVUb1VuaXF1ZVN0cmVhbSh3cml0ZUluZm8uZm9ybWF0dGVkVGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgdGhpcy5fd3JpdGVUb1VuaXF1ZVN0cmVhbSh0ZXh0KTtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgdXNlV29yZFdyYXAgKHVzZTogYm9vbGVhbik6IFJlcG9ydGVyUGx1Z2luSG9zdCB7XG4gICAgICAgIHRoaXNbd29yZFdyYXBFbmFibGVkXSA9IHVzZTtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0SW5kZW50ICh2YWw6IG51bWJlcik6IFJlcG9ydGVyUGx1Z2luSG9zdCB7XG4gICAgICAgIHRoaXNbaW5kZW50XSA9IHZhbDtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwcml2YXRlIF9jcmVhdGVCZWZvcmVXcml0ZUluZm8gKGZvcm1hdHRlZFRleHQ6IHN0cmluZywgZGF0YTogYW55ID0ge30pOiBXcml0ZUluZm8ge1xuICAgICAgICBjb25zdCBpbml0aWF0b3IgPSBkYXRhLmluaXRpYXRvciB8fCB0aGlzLl9nZXRXcml0ZUluaXRpYXRvckV2ZW50KCk7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGZvcm1hdE9wdGlvbnM6IHtcbiAgICAgICAgICAgICAgICBpbmRlbnQ6ICAgICAgdGhpc1tpbmRlbnRdLFxuICAgICAgICAgICAgICAgIHVzZVdvcmRXcmFwOiB0aGlzW3dvcmRXcmFwRW5hYmxlZF0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZm9ybWF0dGVkVGV4dCxcbiAgICAgICAgICAgIGluaXRpYXRvcixcbiAgICAgICAgICAgIGRhdGEsXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfZ2V0V3JpdGVJbml0aWF0b3JFdmVudCAoKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgcGx1Z2luTWV0aG9kcyA9IE9iamVjdC5rZXlzKFJlcG9ydGVyUGx1Z2luTWV0aG9kKTtcbiAgICAgICAgY29uc3QgZnVuY05hbWVzID0gY2FsbHNpdGUoKS5tYXAoc2l0ZSA9PiBzaXRlLmdldEZ1bmN0aW9uTmFtZSgpKTtcbiAgICAgICAgY29uc3QgaW5pdGlhdG9yID0gZnVuY05hbWVzLmZpbmQoZnVuY05hbWUgPT4gcGx1Z2luTWV0aG9kcy5zb21lKG1ldGhvZE5hbWUgPT4gbWV0aG9kTmFtZSA9PT0gZnVuY05hbWUpKTtcblxuICAgICAgICByZXR1cm4gaW5pdGlhdG9yIHx8ICcnO1xuICAgIH1cblxuICAgIHByaXZhdGUgX3dyaXRlVG9VbmlxdWVTdHJlYW0gKHRleHQ6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuc3RyZWFtQ29udHJvbGxlciB8fCB0aGlzLnN0cmVhbUNvbnRyb2xsZXIuZW5zdXJlVW5pcXVlU3RyZWFtKHRoaXNbc3RyZWFtXSwgdGhpcykpXG4gICAgICAgICAgICB0aGlzW3N0cmVhbV0ud3JpdGUodGV4dCk7XG4gICAgfVxuXG5cbiAgICAvLyBBYnN0cmFjdCBtZXRob2RzIGltcGxlbWVudGVkIGluIHBsdWdpblxuICAgIHB1YmxpYyBhc3luYyByZXBvcnRUYXNrU3RhcnQgKC8qIHN0YXJ0VGltZSwgdXNlckFnZW50cywgdGVzdENvdW50LCB0ZXN0U3RydWN0dXJlLCB0YXNrUHJvcGVydGllcyAqLyk6IFByb21pc2U8bmV2ZXI+IHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdOb3QgaW1wbGVtZW50ZWQnKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgcmVwb3J0Rml4dHVyZVN0YXJ0ICgvKiBuYW1lLCBwYXRoICovKTogUHJvbWlzZTxuZXZlcj4ge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vdCBpbXBsZW1lbnRlZCcpO1xuICAgIH1cblxuICAgIC8vIE5PVEU6IEl0J3MgYW4gb3B0aW9uYWwgbWV0aG9kXG4gICAgLy8gYXN5bmMgcmVwb3J0VGVzdFN0YXJ0ICgvKiBuYW1lLCB0ZXN0TWV0YSAqLykge1xuICAgIC8vICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vdCBpbXBsZW1lbnRlZCcpO1xuICAgIC8vIH1cblxuICAgIHB1YmxpYyBhc3luYyByZXBvcnRUZXN0RG9uZSAoLyogbmFtZSwgdGVzdFJ1bkluZm8gKi8pOiBQcm9taXNlPG5ldmVyPiB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignTm90IGltcGxlbWVudGVkJyk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHJlcG9ydFRhc2tEb25lICgvKiBlbmRUaW1lLCBwYXNzZWQsIHdhcm5pbmdzICovKTogUHJvbWlzZTxuZXZlcj4ge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vdCBpbXBsZW1lbnRlZCcpO1xuICAgIH1cblxuICAgIC8vIE5PVEU6IEl0J3MgYW4gb3B0aW9uYWwgbWV0aG9kXG4gICAgcHVibGljIGFzeW5jIGluaXQgKCk6IFByb21pc2U8dm9pZD4geyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1lbXB0eS1mdW5jdGlvblxuICAgICAgICAvLyBPcHRpb25hbFxuICAgIH1cblxuICAgIC8vIE5PVEU6IEl0J3MgYW4gb3B0aW9uYWwgbWV0aG9kXG4gICAgcHVibGljIGFzeW5jIHJlcG9ydFdhcm5pbmdzICgvKiB3YXJuaW5ncyAqLyk6IFByb21pc2U8dm9pZD4geyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1lbXB0eS1mdW5jdGlvblxuICAgIH1cblxuICAgIHByaXZhdGUgX2luaXRQbHVnaW5Ib29rcyAocmVwb3J0ZXJIb29rczogUmVwb3J0ZXJQbHVnaW5Ib29rcyB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICAgICAgICBpZiAoIXJlcG9ydGVySG9va3MpXG4gICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgdGhpcy5faG9va3MgPSBPYmplY3QuZW50cmllcyhyZXBvcnRlckhvb2tzKS5yZWR1Y2UoKHByZXZpb3VzVmFsdWUsIFtob29rTmFtZSwgaG9va10pID0+IHtcbiAgICAgICAgICAgIGlmIChob29rKVxuICAgICAgICAgICAgICAgIHByZXZpb3VzVmFsdWVbaG9va05hbWUgYXMga2V5b2YgUmVwb3J0ZXJQbHVnaW5Ib29rc10gPSBob29rLmJpbmQodGhpcyk7XG5cbiAgICAgICAgICAgIHJldHVybiBwcmV2aW91c1ZhbHVlO1xuICAgICAgICB9LCB7fSBhcyBSZXBvcnRlclBsdWdpbkhvb2tzKTtcbiAgICB9XG5cbiAgICAvLyBOT1RFOiBJdCdzIGFuIG9wdGlvbmFsIG1ldGhvZFxuICAgIHB1YmxpYyBhc3luYyByZXBvcnREYXRhICgvKiB0ZXN0UnVuLCAuLi5kYXRhICovKTogUHJvbWlzZTx2b2lkPiB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LWZ1bmN0aW9uXG4gICAgfVxufVxuIl19
@@ -10,7 +10,8 @@ const ReporterPluginMethod = {
10
10
  reportTestDone: 'reportTestDone',
11
11
  reportTaskDone: 'reportTaskDone',
12
12
  reportWarnings: 'reportWarnings',
13
+ reportData: 'reportData',
13
14
  };
14
15
  exports.default = ReporterPluginMethod;
15
16
  module.exports = exports.default;
16
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLW1ldGhvZHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcmVwb3J0ZXIvcGx1Z2luLW1ldGhvZHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFHQSxNQUFNLG9CQUFvQixHQUF5QztJQUMvRCxJQUFJLEVBQW1CLE1BQU07SUFDN0IsZUFBZSxFQUFRLGlCQUFpQjtJQUN4QyxrQkFBa0IsRUFBSyxvQkFBb0I7SUFDM0MsZUFBZSxFQUFRLGlCQUFpQjtJQUN4QyxxQkFBcUIsRUFBRSx1QkFBdUI7SUFDOUMsb0JBQW9CLEVBQUcsc0JBQXNCO0lBQzdDLGNBQWMsRUFBUyxnQkFBZ0I7SUFDdkMsY0FBYyxFQUFTLGdCQUFnQjtJQUN2QyxjQUFjLEVBQVMsZ0JBQWdCO0NBQzFDLENBQUM7QUFFRixrQkFBZSxvQkFBb0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFJlcG9ydGVyUGx1Z2luIH0gZnJvbSAnLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IEVudW1Gcm9tUHJvcGVydGllc09mIH0gZnJvbSAnLi4vdXRpbHMvdHlwZXMnO1xuXG5jb25zdCBSZXBvcnRlclBsdWdpbk1ldGhvZDogRW51bUZyb21Qcm9wZXJ0aWVzT2Y8UmVwb3J0ZXJQbHVnaW4+ID0ge1xuICAgIGluaXQ6ICAgICAgICAgICAgICAgICAgJ2luaXQnLFxuICAgIHJlcG9ydFRhc2tTdGFydDogICAgICAgJ3JlcG9ydFRhc2tTdGFydCcsXG4gICAgcmVwb3J0Rml4dHVyZVN0YXJ0OiAgICAncmVwb3J0Rml4dHVyZVN0YXJ0JyxcbiAgICByZXBvcnRUZXN0U3RhcnQ6ICAgICAgICdyZXBvcnRUZXN0U3RhcnQnLFxuICAgIHJlcG9ydFRlc3RBY3Rpb25TdGFydDogJ3JlcG9ydFRlc3RBY3Rpb25TdGFydCcsXG4gICAgcmVwb3J0VGVzdEFjdGlvbkRvbmU6ICAncmVwb3J0VGVzdEFjdGlvbkRvbmUnLFxuICAgIHJlcG9ydFRlc3REb25lOiAgICAgICAgJ3JlcG9ydFRlc3REb25lJyxcbiAgICByZXBvcnRUYXNrRG9uZTogICAgICAgICdyZXBvcnRUYXNrRG9uZScsXG4gICAgcmVwb3J0V2FybmluZ3M6ICAgICAgICAncmVwb3J0V2FybmluZ3MnLFxufTtcblxuZXhwb3J0IGRlZmF1bHQgUmVwb3J0ZXJQbHVnaW5NZXRob2Q7XG4iXX0=
17
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLW1ldGhvZHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcmVwb3J0ZXIvcGx1Z2luLW1ldGhvZHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFHQSxNQUFNLG9CQUFvQixHQUF5QztJQUMvRCxJQUFJLEVBQW1CLE1BQU07SUFDN0IsZUFBZSxFQUFRLGlCQUFpQjtJQUN4QyxrQkFBa0IsRUFBSyxvQkFBb0I7SUFDM0MsZUFBZSxFQUFRLGlCQUFpQjtJQUN4QyxxQkFBcUIsRUFBRSx1QkFBdUI7SUFDOUMsb0JBQW9CLEVBQUcsc0JBQXNCO0lBQzdDLGNBQWMsRUFBUyxnQkFBZ0I7SUFDdkMsY0FBYyxFQUFTLGdCQUFnQjtJQUN2QyxjQUFjLEVBQVMsZ0JBQWdCO0lBQ3ZDLFVBQVUsRUFBYSxZQUFZO0NBQ3RDLENBQUM7QUFFRixrQkFBZSxvQkFBb0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFJlcG9ydGVyUGx1Z2luIH0gZnJvbSAnLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IEVudW1Gcm9tUHJvcGVydGllc09mIH0gZnJvbSAnLi4vdXRpbHMvdHlwZXMnO1xuXG5jb25zdCBSZXBvcnRlclBsdWdpbk1ldGhvZDogRW51bUZyb21Qcm9wZXJ0aWVzT2Y8UmVwb3J0ZXJQbHVnaW4+ID0ge1xuICAgIGluaXQ6ICAgICAgICAgICAgICAgICAgJ2luaXQnLFxuICAgIHJlcG9ydFRhc2tTdGFydDogICAgICAgJ3JlcG9ydFRhc2tTdGFydCcsXG4gICAgcmVwb3J0Rml4dHVyZVN0YXJ0OiAgICAncmVwb3J0Rml4dHVyZVN0YXJ0JyxcbiAgICByZXBvcnRUZXN0U3RhcnQ6ICAgICAgICdyZXBvcnRUZXN0U3RhcnQnLFxuICAgIHJlcG9ydFRlc3RBY3Rpb25TdGFydDogJ3JlcG9ydFRlc3RBY3Rpb25TdGFydCcsXG4gICAgcmVwb3J0VGVzdEFjdGlvbkRvbmU6ICAncmVwb3J0VGVzdEFjdGlvbkRvbmUnLFxuICAgIHJlcG9ydFRlc3REb25lOiAgICAgICAgJ3JlcG9ydFRlc3REb25lJyxcbiAgICByZXBvcnRUYXNrRG9uZTogICAgICAgICdyZXBvcnRUYXNrRG9uZScsXG4gICAgcmVwb3J0V2FybmluZ3M6ICAgICAgICAncmVwb3J0V2FybmluZ3MnLFxuICAgIHJlcG9ydERhdGE6ICAgICAgICAgICAgJ3JlcG9ydERhdGEnLFxufTtcblxuZXhwb3J0IGRlZmF1bHQgUmVwb3J0ZXJQbHVnaW5NZXRob2Q7XG4iXX0=
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ class ReportDataLog {
4
+ constructor(callback) {
5
+ this._data = [];
6
+ this.callback = callback;
7
+ }
8
+ get data() {
9
+ return this._data;
10
+ }
11
+ async addData(data) {
12
+ if (this.callback)
13
+ await this.callback(data);
14
+ this._data.push(...data);
15
+ }
16
+ static createAddDataCallback(messageBus, testRun) {
17
+ return async (data) => {
18
+ if (messageBus)
19
+ await messageBus.emit('report-data', { data, testRun });
20
+ };
21
+ }
22
+ }
23
+ exports.default = ReportDataLog;
24
+ module.exports = exports.default;
25
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LWRhdGEtbG9nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3JlcG9ydGVyL3JlcG9ydC1kYXRhLWxvZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUtBLE1BQXFCLGFBQWE7SUFJOUIsWUFBb0IsUUFBZ0M7UUFDaEQsSUFBSSxDQUFDLEtBQUssR0FBTSxFQUFFLENBQUM7UUFDbkIsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7SUFDN0IsQ0FBQztJQUVELElBQVcsSUFBSTtRQUNYLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQztJQUN0QixDQUFDO0lBRU0sS0FBSyxDQUFDLE9BQU8sQ0FBRSxJQUFXO1FBQzdCLElBQUksSUFBSSxDQUFDLFFBQVE7WUFDYixNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFOUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQztJQUM3QixDQUFDO0lBRU0sTUFBTSxDQUFDLHFCQUFxQixDQUFFLFVBQWtDLEVBQUUsT0FBZ0I7UUFDckYsT0FBTyxLQUFLLEVBQUUsSUFBVyxFQUFFLEVBQUU7WUFDekIsSUFBSSxVQUFVO2dCQUNWLE1BQU0sVUFBVSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUNoRSxDQUFDLENBQUM7SUFDTixDQUFDO0NBQ0o7QUExQkQsZ0NBMEJDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IE1lc3NhZ2VCdXMgZnJvbSAnLi4vdXRpbHMvbWVzc2FnZS1idXMnO1xuaW1wb3J0IFRlc3RSdW4gZnJvbSAnLi4vdGVzdC1ydW4nO1xuXG50eXBlIFJlcG9ydERhdGFMb2dDYWxsYmFjayA9IChkYXRhOiBhbnlbXSkgPT4gUHJvbWlzZTx2b2lkPjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUmVwb3J0RGF0YUxvZyB7XG4gICAgcHJpdmF0ZSByZWFkb25seSBfZGF0YTogYW55W107XG4gICAgcHVibGljIGNhbGxiYWNrPzogUmVwb3J0RGF0YUxvZ0NhbGxiYWNrO1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yIChjYWxsYmFjaz86IFJlcG9ydERhdGFMb2dDYWxsYmFjaykge1xuICAgICAgICB0aGlzLl9kYXRhICAgID0gW107XG4gICAgICAgIHRoaXMuY2FsbGJhY2sgPSBjYWxsYmFjaztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGRhdGEgKCk6IGFueVtdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RhdGE7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGFkZERhdGEgKGRhdGE6IGFueVtdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICh0aGlzLmNhbGxiYWNrKVxuICAgICAgICAgICAgYXdhaXQgdGhpcy5jYWxsYmFjayhkYXRhKTtcblxuICAgICAgICB0aGlzLl9kYXRhLnB1c2goLi4uZGF0YSk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBjcmVhdGVBZGREYXRhQ2FsbGJhY2sgKG1lc3NhZ2VCdXM6IE1lc3NhZ2VCdXMgfCB1bmRlZmluZWQsIHRlc3RSdW46IFRlc3RSdW4pOiBSZXBvcnREYXRhTG9nQ2FsbGJhY2sge1xuICAgICAgICByZXR1cm4gYXN5bmMgKGRhdGE6IGFueVtdKSA9PiB7XG4gICAgICAgICAgICBpZiAobWVzc2FnZUJ1cylcbiAgICAgICAgICAgICAgICBhd2FpdCBtZXNzYWdlQnVzLmVtaXQoJ3JlcG9ydC1kYXRhJywgeyBkYXRhLCB0ZXN0UnVuIH0pO1xuICAgICAgICB9O1xuICAgIH1cbn1cbiJdfQ==