@aws-cdk/toolkit-lib 1.29.1 → 1.31.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 (110) hide show
  1. package/build-info.json +2 -2
  2. package/lib/actions/bootstrap/index.js +35 -2
  3. package/lib/actions/diagnose/index.d.ts +28 -0
  4. package/lib/actions/diagnose/index.js +1 -1
  5. package/lib/actions/diff/private/helpers.js +36 -3
  6. package/lib/actions/validate/index.d.ts +2 -0
  7. package/lib/actions/validate/index.js +1 -1
  8. package/lib/api/aws-auth/account-cache.js +36 -3
  9. package/lib/api/aws-auth/sdk-provider.js +36 -3
  10. package/lib/api/aws-auth/sdk.d.ts +7 -2
  11. package/lib/api/aws-auth/sdk.js +6 -1
  12. package/lib/api/aws-auth/user-agent.js +35 -2
  13. package/lib/api/aws-auth/util.js +35 -2
  14. package/lib/api/bootstrap/bootstrap-environment.js +35 -2
  15. package/lib/api/bootstrap/deploy-bootstrap.js +37 -4
  16. package/lib/api/cloud-assembly/context-store.js +36 -3
  17. package/lib/api/cloud-assembly/environment.js +40 -4
  18. package/lib/api/cloud-assembly/private/context-aware-source.js +35 -2
  19. package/lib/api/cloud-assembly/private/exec.js +35 -2
  20. package/lib/api/cloud-assembly/private/prepare-source.js +39 -6
  21. package/lib/api/cloud-assembly/source-builder.js +37 -4
  22. package/lib/api/cloud-assembly/stack-assembly.js +8 -4
  23. package/lib/api/cloud-assembly/stack-collection.d.ts +2 -0
  24. package/lib/api/cloud-assembly/stack-collection.js +3 -1
  25. package/lib/api/cloudformation/logical-id-map.js +35 -2
  26. package/lib/api/cloudformation/nested-stack-helpers.js +36 -3
  27. package/lib/api/cloudformation/template-body-parameter.js +42 -6
  28. package/lib/api/deployments/asset-manifest-builder.js +35 -2
  29. package/lib/api/deployments/assets.js +42 -6
  30. package/lib/api/deployments/cfn-api.d.ts +4 -2
  31. package/lib/api/deployments/cfn-api.js +47 -6
  32. package/lib/api/deployments/deploy-stack.js +11 -6
  33. package/lib/api/deployments/deployments.js +42 -4
  34. package/lib/api/diagnosing/diagnosis-formatting.js +54 -13
  35. package/lib/api/diagnosing/format-utils.d.ts +32 -0
  36. package/lib/api/diagnosing/format-utils.js +176 -0
  37. package/lib/api/diagnosing/investigate-custom-resource.d.ts +17 -0
  38. package/lib/api/diagnosing/investigate-custom-resource.js +247 -0
  39. package/lib/api/diagnosing/investigate-ecs-service.d.ts +20 -0
  40. package/lib/api/diagnosing/investigate-ecs-service.js +242 -0
  41. package/lib/api/diagnosing/resource-identifiers.d.ts +39 -0
  42. package/lib/api/diagnosing/resource-identifiers.js +90 -0
  43. package/lib/api/diagnosing/resource-investigation.d.ts +13 -0
  44. package/lib/api/diagnosing/resource-investigation.js +22 -0
  45. package/lib/api/diagnosing/stack-diagnoser.d.ts +39 -3
  46. package/lib/api/diagnosing/stack-diagnoser.js +71 -30
  47. package/lib/api/diff/diff-formatter.js +11 -8
  48. package/lib/api/drift/drift-formatter.js +20 -17
  49. package/lib/api/garbage-collection/garbage-collector.js +7 -4
  50. package/lib/api/garbage-collection/progress-printer.js +7 -4
  51. package/lib/api/hotswap/hotswap-deployments.js +46 -10
  52. package/lib/api/hotswap/hotswap-template-cache.js +36 -3
  53. package/lib/api/io/private/io-default-messages.js +35 -2
  54. package/lib/api/io/private/message-maker.d.ts +4 -0
  55. package/lib/api/io/private/message-maker.js +3 -1
  56. package/lib/api/io/private/messages.d.ts +2 -0
  57. package/lib/api/io/private/messages.js +44 -3
  58. package/lib/api/io/private/span.js +35 -2
  59. package/lib/api/logs-monitor/logs-monitor.js +40 -4
  60. package/lib/api/network-detector/network-detector.js +37 -4
  61. package/lib/api/notices/cached-data-source.js +35 -2
  62. package/lib/api/notices/filter.js +35 -2
  63. package/lib/api/notices/notices.js +35 -2
  64. package/lib/api/notices/web-data-source.js +35 -2
  65. package/lib/api/refactoring/digest.js +35 -2
  66. package/lib/api/refactoring/stack-definitions.js +40 -4
  67. package/lib/api/resource-import/importer.js +58 -15
  68. package/lib/api/resource-import/migrator.js +42 -6
  69. package/lib/api/rwlock.js +35 -2
  70. package/lib/api/settings.js +38 -5
  71. package/lib/api/source-tracing/private/stack-source-tracing.js +38 -5
  72. package/lib/api/stack-events/resource-errors.d.ts +12 -0
  73. package/lib/api/stack-events/resource-errors.js +2 -1
  74. package/lib/api/stack-events/stack-activity-monitor.js +35 -2
  75. package/lib/api/stack-events/stack-progress-monitor.js +35 -2
  76. package/lib/api/toolkit-info.js +7 -4
  77. package/lib/api/tree.js +36 -3
  78. package/lib/api/validate/validate-formatting.d.ts +9 -2
  79. package/lib/api/validate/validate-formatting.js +161 -77
  80. package/lib/api/work-graph/build-destroy-work-graph.js +35 -2
  81. package/lib/api/work-graph/work-graph-builder.js +35 -2
  82. package/lib/context-providers/index.js +35 -2
  83. package/lib/private/activity-printer/current.js +52 -16
  84. package/lib/private/activity-printer/history.js +50 -14
  85. package/lib/private/tools.js +64 -25
  86. package/lib/toolkit/non-interactive-io-host.js +11 -8
  87. package/lib/toolkit/private/collect-annotation-report.d.ts +12 -0
  88. package/lib/toolkit/private/collect-annotation-report.js +118 -0
  89. package/lib/toolkit/private/validation-report.d.ts +32 -0
  90. package/lib/toolkit/private/validation-report.js +152 -0
  91. package/lib/toolkit/toolkit-error.d.ts +20 -0
  92. package/lib/toolkit/toolkit-error.js +30 -2
  93. package/lib/toolkit/toolkit.d.ts +12 -7
  94. package/lib/toolkit/toolkit.js +104 -101
  95. package/lib/toolkit/types.d.ts +1 -0
  96. package/lib/toolkit/types.js +1 -1
  97. package/lib/util/content-hash.js +35 -2
  98. package/lib/util/directories.js +38 -5
  99. package/lib/util/glob-matcher.d.ts +19 -7
  100. package/lib/util/glob-matcher.js +63 -14
  101. package/lib/util/guess-language.js +36 -3
  102. package/lib/util/package-info.js +35 -2
  103. package/lib/util/serialize.js +36 -3
  104. package/lib/util/version-range.js +35 -2
  105. package/lib/util/yaml-cfn.js +36 -3
  106. package/package.json +5 -5
  107. package/lib/api/diagnosing/tree-builder.d.ts +0 -13
  108. package/lib/api/diagnosing/tree-builder.js +0 -86
  109. package/lib/api/diagnosing/tree.d.ts +0 -19
  110. package/lib/api/diagnosing/tree.js +0 -72
@@ -4,25 +4,15 @@ exports.CloudFormationStackDiagnoser = void 0;
4
4
  exports.changeSetHasNoChanges = changeSetHasNoChanges;
5
5
  const client_cloudformation_1 = require("@aws-sdk/client-cloudformation");
6
6
  const changeset_error_fetcher_1 = require("./changeset-error-fetcher");
7
+ const resource_investigation_1 = require("./resource-investigation");
7
8
  const stack_events_1 = require("../stack-events");
8
9
  const stack_status_1 = require("../stack-events/stack-status");
9
- /**
10
- * Diagnose a stack's failed state
11
- *
12
- * - First, determine the stack's state.
13
- * - If it is in a failed state, we started a deployment that failed. Describe the stack
14
- * events, and try to determine the root cause from that.
15
- * - If it is in a normal state, see if there are any failed change sets. Either
16
- * get the failure message from the change set, or get the failure events from
17
- * the change set (early validation).
18
- *
19
- * This class works at the CloudFormation level, and does not deal with tracing
20
- * CloudFormation errors to construct code sources yet.
21
- */
22
10
  class CloudFormationStackDiagnoser {
23
11
  props;
24
12
  cfn;
25
13
  parentStackLogicalIds;
14
+ _additionalExplorationSdkPromise;
15
+ rollbackEnabled = true;
26
16
  constructor(props) {
27
17
  this.props = props;
28
18
  this.cfn = this.props.sdk.cloudFormation();
@@ -48,7 +38,7 @@ class CloudFormationStackDiagnoser {
48
38
  message: `Stack with name ${stackName} is currently being updated (${status.name}). Try again when it's finished.`,
49
39
  };
50
40
  }
51
- if (status.isFailure) {
41
+ if (status.isFailure || status.isRollbackSuccess) {
52
42
  return await this._diagnoseViaStackEvents(stack);
53
43
  }
54
44
  return await this._diagnoseChangeSetFailureFromStackName(stack);
@@ -71,8 +61,19 @@ class CloudFormationStackDiagnoser {
71
61
  /**
72
62
  * Diagnose potential problems with the change set
73
63
  */
74
- async diagnoseFromErrorCollection(errors, stack) {
64
+ async diagnoseFromErrorCollection(errors, stack, allowFallback = true, options = {}) {
65
+ this.rollbackEnabled = options.rollbackEnabled ?? true;
75
66
  if (errors.isEmpty()) {
67
+ if (allowFallback) {
68
+ // The monitor may not have seen failure events yet (race condition).
69
+ // Fall back to polling stack events directly.
70
+ try {
71
+ return await this._diagnoseViaStackEvents(stack);
72
+ }
73
+ catch (e) {
74
+ await this.props.ioHelper.defaults.debug(`Fallback diagnosis failed: ${e.message}`);
75
+ }
76
+ }
76
77
  return { type: 'no-problem' };
77
78
  }
78
79
  return {
@@ -82,7 +83,7 @@ class CloudFormationStackDiagnoser {
82
83
  stackStatus: stack.StackStatus ?? '',
83
84
  statusReason: stack.StackStatusReason ?? '',
84
85
  },
85
- problems: await this.addErrorTraces(errors.all),
86
+ problems: await this.enhanceErrors(errors.all),
86
87
  };
87
88
  }
88
89
  /**
@@ -98,7 +99,7 @@ class CloudFormationStackDiagnoser {
98
99
  // We don't need the resulting events of polling. Polling will automatically update the error collection,
99
100
  // which is the thing we care about.
100
101
  await poller.poll();
101
- return this.diagnoseFromErrorCollection(poller.errors, stack);
102
+ return this.diagnoseFromErrorCollection(poller.errors, stack, false, { rollbackEnabled: this.rollbackEnabled });
102
103
  }
103
104
  async _diagnoseChangeSetFailureFromStackName(stack) {
104
105
  const cs = (await this.cfn.listChangeSets({
@@ -158,7 +159,7 @@ class CloudFormationStackDiagnoser {
158
159
  changeSetName: changeSet.ChangeSetName ?? '',
159
160
  statusReason: changeSet.StatusReason ?? '',
160
161
  },
161
- problems: await this.addErrorTraces(failedAutoErrors),
162
+ problems: await this.enhanceErrors(failedAutoErrors),
162
163
  };
163
164
  }
164
165
  // Otherwise, a generic change set creation error where `DescribeEvents`
@@ -184,7 +185,7 @@ class CloudFormationStackDiagnoser {
184
185
  return {
185
186
  type: 'problem',
186
187
  detectedBy,
187
- problems: await this.addErrorTraces(ev.errors.map((e) => resourceErrorFromEarlyValidationError(changeSet.StackId ?? '', this.parentStackLogicalIds, e))),
188
+ problems: await this.enhanceErrors(ev.errors.map((e) => resourceErrorFromEarlyValidationError(changeSet.StackId ?? '', this.parentStackLogicalIds, e))),
188
189
  };
189
190
  }
190
191
  // Otherwise, we will return a generic changeset error message. If there was a problem
@@ -194,19 +195,42 @@ class CloudFormationStackDiagnoser {
194
195
  }
195
196
  return this._nonSpecificChangeSetError(changeSet, detectedBy);
196
197
  }
197
- async addErrorTraces(errs) {
198
+ async enhanceErrors(errs) {
199
+ // We're not actually limiting this here. But we are making the assumption that the amount of resources
200
+ // that will have errors are always pretty low in number.
201
+ // eslint-disable-next-line @cdklabs/promiseall-no-unbounded-parallelism
202
+ return Promise.all(errs.map((e) => this.enhanceError(e)));
203
+ }
204
+ async enhanceError(err) {
205
+ const sourceTracePromise = err.logicalId
206
+ ? this.props.sourceTracer.traceResource(err.stackArn, err.parentStackLogicalIds, err.logicalId)
207
+ : this.props.sourceTracer.traceStack(err.stackArn, err.parentStackLogicalIds);
198
208
  // eslint-disable-next-line @cdklabs/promiseall-no-unbounded-parallelism
199
- return Promise.all(errs.map((e) => this.addErrorTrace(e)));
209
+ const [sourceTrace, additionalContext] = await Promise.all([
210
+ sourceTracePromise,
211
+ this.investigateResourceBestEffort(err),
212
+ ]);
213
+ return {
214
+ ...err,
215
+ sourceTrace,
216
+ topLevelStackHierarchicalId: this.props.topLevelStackHierarchicalId,
217
+ ...(additionalContext.length > 0 ? { additionalContext } : {}),
218
+ };
200
219
  }
201
- async addErrorTrace(err) {
202
- let sourceTrace;
203
- if (err.logicalId) {
204
- sourceTrace = await this.props.sourceTracer.traceResource(err.stackArn, err.parentStackLogicalIds, err.logicalId);
220
+ async investigateResourceBestEffort(err) {
221
+ const sdk = await this.additionalExplorationSdk();
222
+ if (!sdk) {
223
+ return [];
205
224
  }
206
- else {
207
- sourceTrace = await this.props.sourceTracer.traceStack(err.stackArn, err.parentStackLogicalIds);
225
+ try {
226
+ return await (0, resource_investigation_1.investigateResource)(err, sdk, (msg) => this.props.ioHelper.defaults.debug(msg), {
227
+ rollbackEnabled: this.rollbackEnabled,
228
+ });
229
+ }
230
+ catch (e) {
231
+ await this.props.ioHelper.defaults.debug(`Resource investigation failed: ${e.message}`);
232
+ return [];
208
233
  }
209
- return { ...err, sourceTrace, topLevelStackHierarchicalId: this.props.topLevelStackHierarchicalId };
210
234
  }
211
235
  /**
212
236
  * Build a generic stack error from the given change set information
@@ -218,7 +242,7 @@ class CloudFormationStackDiagnoser {
218
242
  type: 'problem',
219
243
  detectedBy,
220
244
  problems: [
221
- await this.addErrorTrace({
245
+ await this.enhanceError({
222
246
  // It's about a stack
223
247
  logicalId: undefined,
224
248
  message: changeSet.StatusReason ?? '',
@@ -322,6 +346,23 @@ class CloudFormationStackDiagnoser {
322
346
  }
323
347
  return ret;
324
348
  }
349
+ /**
350
+ * Return the additional exploration SDK, if available.
351
+ */
352
+ additionalExplorationSdk() {
353
+ if (!this._additionalExplorationSdkPromise) {
354
+ this._additionalExplorationSdkPromise = (async () => {
355
+ try {
356
+ return await this.props.additionalExplorationSdkProvider?.();
357
+ }
358
+ catch (e) {
359
+ await this.props.ioHelper.defaults.debug(`Additional exploration SDK provider failed: ${e.message}`);
360
+ return undefined;
361
+ }
362
+ })();
363
+ }
364
+ return this._additionalExplorationSdkPromise;
365
+ }
325
366
  }
326
367
  exports.CloudFormationStackDiagnoser = CloudFormationStackDiagnoser;
327
368
  /**
@@ -351,4 +392,4 @@ function resourceErrorFromEarlyValidationError(stackId, parentStackLogicalIds, e
351
392
  stackArn: stackId,
352
393
  };
353
394
  }
354
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhY2stZGlhZ25vc2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsic3RhY2stZGlhZ25vc2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQWtZQSxzREFXQztBQTVZRCwwRUFBNkU7QUFFN0UsdUVBQTBFO0FBTTFFLGtEQUE4RDtBQUU5RCwrREFBMkQ7QUFVM0Q7Ozs7Ozs7Ozs7OztHQVlHO0FBQ0gsTUFBYSw0QkFBNEI7SUFJVjtJQUhaLEdBQUcsQ0FBd0I7SUFDcEMscUJBQXFCLENBQVc7SUFFeEMsWUFBNkIsS0FBd0M7UUFBeEMsVUFBSyxHQUFMLEtBQUssQ0FBbUM7UUFDbkUsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUMzQyxJQUFJLENBQUMscUJBQXFCLEdBQUcsRUFBRSxDQUFDO0lBQ2xDLENBQUM7SUFFRDs7T0FFRztJQUNJLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxTQUFpQjtRQUM5QyxJQUFJLENBQUM7WUFDSCxNQUFNLFFBQVEsR0FBRyxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUM7WUFDekUsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ25DLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztnQkFDWCxPQUFPO29CQUNMLElBQUksRUFBRSxrQkFBa0I7b0JBQ3hCLE9BQU8sRUFBRSxtQkFBbUIsU0FBUyxZQUFZO2lCQUNsRCxDQUFDO1lBQ0osQ0FBQztZQUVELE1BQU0sTUFBTSxHQUFHLDBCQUFXLENBQUMsb0JBQW9CLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDdkQsSUFBSSxNQUFNLENBQUMsWUFBWSxFQUFFLENBQUM7Z0JBQ3hCLE9BQU87b0JBQ0wsSUFBSSxFQUFFLGtCQUFrQjtvQkFDeEIsT0FBTyxFQUFF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Q0FBaUM7S0FDbEMsQ0FBQztJQUVGLE9BQU8sQ0FDTCxXQUFXLENBQUMsTUFBTSxLQUFLLFFBQVEsSUFBSSxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsV0FBVyxDQUFDLFlBQVksSUFBSSxFQUFFLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FDckgsQ0FBQztBQUNKLENBQUM7QUFFRCxTQUFTLHFDQUFxQyxDQUFDLE9BQWUsRUFBRSxxQkFBK0IsRUFBRSxFQUEwQjtJQUN6SCxPQUFPO1FBQ0wsU0FBUyxFQUFFLEVBQUUsQ0FBQyxTQUFTO1FBQ3ZCLFVBQVUsRUFBRSxFQUFFLENBQUMsVUFBVTtRQUN6QixZQUFZLEVBQUUsRUFBRSxDQUFDLFlBQVk7UUFDN0IsT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDLE9BQU8sUUFBUSxFQUFFLENBQUMsWUFBWSxHQUFHO1FBQ2hELFNBQVMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxjQUFjLElBQUksRUFBRSxDQUFDLFNBQVMsRUFBRTtRQUNqRCxxQkFBcUI7UUFDckIsUUFBUSxFQUFFLE9BQU87S0FDbEIsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IENoYW5nZVNldFN1bW1hcnksIFN0YWNrIH0gZnJvbSAnQGF3cy1zZGsvY2xpZW50LWNsb3VkZm9ybWF0aW9uJztcbmltcG9ydCB7IENoYW5nZVNldFN0YXR1cywgQ2hhbmdlVHlwZSB9IGZyb20gJ0Bhd3Mtc2RrL2NsaWVudC1jbG91ZGZvcm1hdGlvbic7XG5pbXBvcnQgdHlwZSB7IENoYW5nZVNldFJlc291cmNlRXJyb3IgfSBmcm9tICcuL2NoYW5nZXNldC1lcnJvci1mZXRjaGVyJztcbmltcG9ydCB7IENoYW5nZVNldFJlc291cmNlRXJyb3JGZXRjaGVyIH0gZnJvbSAnLi9jaGFuZ2VzZXQtZXJyb3ItZmV0Y2hlcic7XG5pbXBvcnQgdHlwZSB7IFN0YWNrRGlhZ25vc2lzLCBTdGFja1Byb2JsZW1Tb3VyY2UsIFRyYWNlZFJlc291cmNlRXJyb3IgfSBmcm9tICcuLi8uLi9hY3Rpb25zL2RpYWdub3NlJztcbmltcG9ydCB0eXBlIHsgSUNsb3VkRm9ybWF0aW9uQ2xpZW50LCBTREsgfSBmcm9tICcuLi9hd3MtYXV0aC9zZGsnO1xuaW1wb3J0IHR5cGUgeyBFbnZpcm9ubWVudFJlc291cmNlcyB9IGZyb20gJy4uL2Vudmlyb25tZW50JztcbmltcG9ydCB0eXBlIHsgSW9IZWxwZXIgfSBmcm9tICcuLi9pby9wcml2YXRlL2lvLWhlbHBlcic7XG5pbXBvcnQgdHlwZSB7IElTb3VyY2VUcmFjZXIgfSBmcm9tICcuLi9zb3VyY2UtdHJhY2luZy9wcml2YXRlL3NvdXJjZS10cmFjaW5nJztcbmltcG9ydCB7IFBvbGxSYW5nZSwgU3RhY2tFdmVudFBvbGxlciB9IGZyb20gJy4uL3N0YWNrLWV2ZW50cyc7XG5pbXBvcnQgdHlwZSB7IFJlc291cmNlRXJyb3IsIFJlc291cmNlRXJyb3JzIH0gZnJvbSAnLi4vc3RhY2stZXZlbnRzL3Jlc291cmNlLWVycm9ycyc7XG5pbXBvcnQgeyBTdGFja1N0YXR1cyB9IGZyb20gJy4uL3N0YWNrLWV2ZW50cy9zdGFjay1zdGF0dXMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIENsb3VkRm9ybWF0aW9uU3RhY2tEaWFnbm9zZXJQcm9wcyB7XG4gIHJlYWRvbmx5IHNkazogU0RLO1xuICByZWFkb25seSBlbnZSZXNvdXJjZXM/OiBFbnZpcm9ubWVudFJlc291cmNlcztcbiAgcmVhZG9ubHkgc291cmNlVHJhY2VyOiBJU291cmNlVHJhY2VyO1xuICByZWFkb25seSBpb0hlbHBlcjogSW9IZWxwZXI7XG4gIHJlYWRvbmx5IHRvcExldmVsU3RhY2tIaWVyYXJjaGljYWxJZDogc3RyaW5nO1xufVxuXG4vKipcbiAqIERpYWdub3NlIGEgc3RhY2sncyBmYWlsZWQgc3RhdGVcbiAqXG4gKiAtIEZpcnN0LCBkZXRlcm1pbmUgdGhlIHN0YWNrJ3Mgc3RhdGUuXG4gKiAtIElmIGl0IGlzIGluIGEgZmFpbGVkIHN0YXRlLCB3ZSBzdGFydGVkIGEgZGVwbG95bWVudCB0aGF0IGZhaWxlZC4gRGVzY3JpYmUgdGhlIHN0YWNrXG4gKiAgIGV2ZW50cywgYW5kIHRyeSB0byBkZXRlcm1pbmUgdGhlIHJvb3QgY2F1c2UgZnJvbSB0aGF0LlxuICogLSBJZiBpdCBpcyBpbiBhIG5vcm1hbCBzdGF0ZSwgc2VlIGlmIHRoZXJlIGFyZSBhbnkgZmFpbGVkIGNoYW5nZSBzZXRzLiBFaXRoZXJcbiAqICAgZ2V0IHRoZSBmYWlsdXJlIG1lc3NhZ2UgZnJvbSB0aGUgY2hhbmdlIHNldCwgb3IgZ2V0IHRoZSBmYWlsdXJlIGV2ZW50cyBmcm9tXG4gKiAgIHRoZSBjaGFuZ2Ugc2V0IChlYXJseSB2YWxpZGF0aW9uKS5cbiAqXG4gKiBUaGlzIGNsYXNzIHdvcmtzIGF0IHRoZSBDbG91ZEZvcm1hdGlvbiBsZXZlbCwgYW5kIGRvZXMgbm90IGRlYWwgd2l0aCB0cmFjaW5nXG4gKiBDbG91ZEZvcm1hdGlvbiBlcnJvcnMgdG8gY29uc3RydWN0IGNvZGUgc291cmNlcyB5ZXQuXG4gKi9cbmV4cG9ydCBjbGFzcyBDbG91ZEZvcm1hdGlvblN0YWNrRGlhZ25vc2VyIHtcbiAgcHJpdmF0ZSByZWFkb25seSBjZm46IElDbG91ZEZvcm1hdGlvbkNsaWVudDtcbiAgcHJpdmF0ZSBwYXJlbnRTdGFja0xvZ2ljYWxJZHM6IHN0cmluZ1tdO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgcHJvcHM6IENsb3VkRm9ybWF0aW9uU3RhY2tEaWFnbm9zZXJQcm9wcykge1xuICAgIHRoaXMuY2ZuID0gdGhpcy5wcm9wcy5zZGsuY2xvdWRGb3JtYXRpb24oKTtcbiAgICB0aGlzLnBhcmVudFN0YWNrTG9naWNhbElkcyA9IFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIERpYWdub3NlIGEgc3RhY2sncyByb290IGNhdXNlIGdpdmVuIG5vIHByZS1leGlzdGluZyBzdGF0ZVxuICAgKi9cbiAgcHVibGljIGFzeW5jIGRpYWdub3NlRnJvbUZyZXNoKHN0YWNrTmFtZTogc3RyaW5nKTogUHJvbWlzZTxTdGFja0RpYWdub3Npcz4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuY2ZuLmRlc2NyaWJlU3RhY2tzKHsgU3RhY2tOYW1lOiBzdGFja05hbWUgfSk7XG4gICAgICBjb25zdCBzdGFjayA9IHJlc3BvbnNlLlN0YWNrcz8uWzBdO1xuICAgICAgaWYgKCFzdGFjaykge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHR5cGU6ICdlcnJvci1kaWFnbm9zaW5nJyxcbiAgICAgICAgICBtZXNzYWdlOiBgU3RhY2sgd2l0aCBuYW1lICR7c3RhY2tOYW1lfSBub3QgZm91bmRgLFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBjb25zdCBzdGF0dXMgPSBTdGFja1N0YXR1cy5mcm9tU3RhY2tEZXNjcmlwdGlvbihzdGFjayk7XG4gICAgICBpZiAoc3RhdHVzLmlzSW5Qcm9ncmVzcykge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHR5cGU6ICdlcnJvci1kaWFnbm9zaW5nJyxcbiAgICAgICAgICBtZXNzYWdlOiBgU3RhY2sgd2l0aCBuYW1lICR7c3RhY2tOYW1lfSBpcyBjdXJyZW50bHkgYmVpbmcgdXBkYXRlZCAoJHtzdGF0dXMubmFtZX0pLiBUcnkgYWdhaW4gd2hlbiBpdCdzIGZpbmlzaGVkLmAsXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGlmIChzdGF0dXMuaXNGYWlsdXJlKSB7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLl9kaWFnbm9zZVZpYVN0YWNrRXZlbnRzKHN0YWNrKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuX2RpYWdub3NlQ2hhbmdlU2V0RmFpbHVyZUZyb21TdGFja05hbWUoc3RhY2spO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgcmV0dXJuIHsgdHlwZTogJ2Vycm9yLWRpYWdub3NpbmcnLCBtZXNzYWdlOiBlLm1lc3NhZ2UgfTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRGlhZ25vc2UgcG90ZW50aWFsIHByb2JsZW1zIHdpdGggdGhlIGNoYW5nZSBzZXRcbiAgICovXG4gIHB1YmxpYyBhc3luYyBkaWFnbm9zZUNoYW5nZVNldChjaGFuZ2VTZXQ6IENoYW5nZVNldFN1bW1hcnkpOiBQcm9taXNlPFN0YWNrRGlhZ25vc2lzPiB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLl9kaWFnbm9zZUNoYW5nZVNldEZhaWx1cmUoY2hhbmdlU2V0KTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHJldHVybiB7IHR5cGU6ICdlcnJvci1kaWFnbm9zaW5nJywgbWVzc2FnZTogZS5tZXNzYWdlIH07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERpYWdub3NlIHBvdGVudGlhbCBwcm9ibGVtcyB3aXRoIHRoZSBjaGFuZ2Ugc2V0XG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZGlhZ25vc2VGcm9tRXJyb3JDb2xsZWN0aW9uKGVycm9yczogUmVzb3VyY2VFcnJvcnMsIHN0YWNrOiBTdGFjayk6IFByb21pc2U8U3RhY2tEaWFnbm9zaXM+IHtcbiAgICBpZiAoZXJyb3JzLmlzRW1wdHkoKSkge1xuICAgICAgcmV0dXJuIHsgdHlwZTogJ25vLXByb2JsZW0nIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6ICdwcm9ibGVtJyxcbiAgICAgIGRldGVjdGVkQnk6IHtcbiAgICAgICAgdHlwZTogJ2RlcGxveW1lbnQnLFxuICAgICAgICBzdGFja1N0YXR1czogc3RhY2suU3RhY2tTdGF0dXMgPz8gJycsXG4gICAgICAgIHN0YXR1c1JlYXNvbjogc3RhY2suU3RhY2tTdGF0dXNSZWFzb24gPz8gJycsXG4gICAgICB9LFxuICAgICAgcHJvYmxlbXM6IGF3YWl0IHRoaXMuYWRkRXJyb3JUcmFjZXMoZXJyb3JzLmFsbCksXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEaWFnbm9zZSBhIGRlcGxveW1lbnQgZmFpbHVyZSB2aWEgc3RhY2sgZXZlbnRzXG4gICAqXG4gICAqIFRoaXMgaXMgdGhlIHNhbWUgbG9naWMgdGhhdCB0aGUgZGVwbG95bWVudCBtb25pdG9yIHVzZXMuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIF9kaWFnbm9zZVZpYVN0YWNrRXZlbnRzKHN0YWNrOiBTdGFjayk6IFByb21pc2U8U3RhY2tEaWFnbm9zaXM+IHtcbiAgICBjb25zdCBwb2xsZXIgPSBuZXcgU3RhY2tFdmVudFBvbGxlcih0aGlzLmNmbiwge1xuICAgICAgc3RhY2tBcm46IHN0YWNrLlN0YWNrSWQhLFxuICAgICAgaW5pdGlhbFBvbGxSYW5nZTogUG9sbFJhbmdlLm1vc3RSZWNlbnRPcGVyYXRpb24oKSxcbiAgICB9KTtcblxuICAgIC8vIFdlIGRvbid0IG5lZWQgdGhlIHJlc3VsdGluZyBldmVudHMgb2YgcG9sbGluZy4gUG9sbGluZyB3aWxsIGF1dG9tYXRpY2FsbHkgdXBkYXRlIHRoZSBlcnJvciBjb2xsZWN0aW9uLFxuICAgIC8vIHdoaWNoIGlzIHRoZSB0aGluZyB3ZSBjYXJlIGFib3V0LlxuICAgIGF3YWl0IHBvbGxlci5wb2xsKCk7XG5cbiAgICByZXR1cm4gdGhpcy5kaWFnbm9zZUZyb21FcnJvckNvbGxlY3Rpb24ocG9sbGVyLmVycm9ycywgc3RhY2spO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBfZGlhZ25vc2VDaGFuZ2VTZXRGYWlsdXJlRnJvbVN0YWNrTmFtZShzdGFjazogU3RhY2spOiBQcm9taXNlPFN0YWNrRGlhZ25vc2lzPiB7XG4gICAgY29uc3QgY3MgPSAoYXdhaXQgdGhpcy5jZm4ubGlzdENoYW5nZVNldHMoe1xuICAgICAgU3RhY2tOYW1lOiBzdGFjay5TdGFja0lkISxcbiAgICB9KSkuU3VtbWFyaWVzID8/IFtdO1xuXG4gICAgY29uc3QgcGVuZGluZyA9IGNzLmZpbHRlcih4ID0+IHguU3RhdHVzID09PSBDaGFuZ2VTZXRTdGF0dXMuQ1JFQVRFX0lOX1BST0dSRVNTIHx8IHguU3RhdHVzID09PSBDaGFuZ2VTZXRTdGF0dXMuQ1JFQVRFX1BFTkRJTkcpO1xuICAgIGlmIChwZW5kaW5nLmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6ICdlcnJvci1kaWFnbm9zaW5nJyxcbiAgICAgICAgbWVzc2FnZTogYFN0YWNrIHdpdGggbmFtZSAke3N0YWNrLlN0YWNrTmFtZX0gaGFzIGNoYW5nZSBzZXRzIGN1cnJlbnRseSBiZWluZyBjcmVhdGVkICgke3BlbmRpbmdbMF0uQ2hhbmdlU2V0TmFtZX0pLiBUcnkgYWdhaW4gd2hlbiBpdCdzIGZpbmlzaGVkLmAsXG4gICAgICB9O1xuICAgIH1cblxuICAgIGNvbnN0IGZhaWxlZCA9IGNzLmZpbHRlcih4ID0+IHguU3RhdHVzID09PSBDaGFuZ2VTZXRTdGF0dXMuRkFJTEVEKTtcbiAgICBpZiAoZmFpbGVkLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHsgdHlwZTogJ25vLXByb2JsZW0nIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX2RpYWdub3NlQ2hhbmdlU2V0RmFpbHVyZShmYWlsZWRbMF0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFRyeSB0byBkaWFnbm9zZSB0aGUgcmVhc29uIHRoYXQgY2F1c2VkIGEgY2hhbmdlc2V0IHRvIGZhaWwgdG8gY3JlYXRlXG4gICAqXG4gICAqIFRoZXJlIGFyZSBhIGNvdXBsZSBvZiBkaWZmZXJlbnQgcmVhc29ucyB0aGlzIGNhbiBoYXBwZW4sIGFuZCB3ZSBnbyB0aHJvdWdoIGVhY2ggb2YgdGhlbSBpbiBvcmRlci5cbiAgICpcbiAgICogVXN1YWxseSB0aGlzIHN0YXJ0cyBmcm9tIHRyeWluZyB0byBkZXRlY3QgYW4gZXJyb3IgbWVzc2FnZSBwYXR0ZXJuIGluIHRoZSBjaGFuZ2Ugc2V0IHN0YXR1cyByZWFzb24sXG4gICAqIGFuZCB0aGVuIHBvdGVudGlhbGx5IGdvaW5nIHRvIGZldGNoIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gdXNpbmcgYWRkaXRpb25hbCBBUEkgY2FsbHMuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIF9kaWFnbm9zZUNoYW5nZVNldEZhaWx1cmUoY2hhbmdlU2V0OiBDaGFuZ2VTZXRTdW1tYXJ5KTogUHJvbWlzZTxTdGFja0RpYWdub3Npcz4ge1xuICAgIGlmIChjaGFuZ2VTZXQuU3RhdHVzICE9PSBDaGFuZ2VTZXRTdGF0dXMuRkFJTEVEKSB7XG4gICAgICByZXR1cm4geyB0eXBlOiAnbm8tcHJvYmxlbScgfTtcbiAgICB9XG5cbiAgICBpZiAoY2hhbmdlU2V0SGFzTm9DaGFuZ2VzKGNoYW5nZVNldCkpIHtcbiAgICAgIC8vIFRoaXMgd2lsbCBsZWFkIHRvIGEgY2hhbmdlIHNldCB0aGF0IGlzIEZBSUxFRCBidXQgaXQncyBub3QgYWN0dWFsbHkgYSBwcm9ibGVtXG4gICAgICByZXR1cm4geyB0eXBlOiAnbm8tcHJvYmxlbScgfTtcbiAgICB9XG5cbiAgICAvLyBXZSByZXBvcnQgZWFybHkgdmFsaWRhdGlvbiBlcnJvcnMgZGlmZmVyZW50bHkgdGhhbiBnZW5lcmljIGNoYW5nZXNldCBlcnJvcnMuIE1vc3RseVxuICAgIC8vIGZvciBoaXN0b3JpY2FsIHJlYXNvbnMuXG4gICAgY29uc3QgaXNFYXJseVZhbGlkYXRpb25FcnJvciA9IGNoYW5nZVNldC5TdGF0dXNSZWFzb24/LmluY2x1ZGVzKCdBV1M6OkVhcmx5VmFsaWRhdGlvbicpO1xuICAgIGlmIChpc0Vhcmx5VmFsaWRhdGlvbkVycm9yKSB7XG4gICAgICByZXR1cm4gdGhpcy5fcmVwb3J0Q2hhbmdlU2V0RmFpbHVyZUZyb21FdmVudHMoY2hhbmdlU2V0LCB7XG4gICAgICAgIHR5cGU6ICdlYXJseS12YWxpZGF0aW9uJyxcbiAgICAgICAgY2hhbmdlU2V0TmFtZTogY2hhbmdlU2V0LkNoYW5nZVNldE5hbWUgPz8gJycsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBXZSB3aWxsIHJlY3Vyc2UgaW50byBuZXN0ZWQgY2hhbmdlIHNldHMgaWYgbmVjZXNzYXJ5LlxuICAgIGlmIChjaGFuZ2VTZXQuU3RhdHVzUmVhc29uPy5pbmNsdWRlcygnTmVzdGVkIGNoYW5nZSBzZXQnKSkge1xuICAgICAgcmV0dXJuIHRoaXMuX2RpYWdub3NlTmVzdGVkQ2hhbmdlU2V0RmFpbHVyZShjaGFuZ2VTZXQpO1xuICAgIH1cblxuICAgIC8vIFdlIHNwZWNpYWwtY2FzZSBmYWlsZWQgYXV0b21hdGljIGltcG9ydHMuIFdlIGtub3cgYWxsIHRoZSBtZWF0IG9mIHRoZSBlcnJvciBkZXRhaWxzIGFyZSBpbiB0aGVcbiAgICAvLyBzdGF0dXMgcmVhc29uLCBhbmQgbm93aGVyZSBlbHNlLiBXZSBwYXJzZSBpdCBzcGVjaWZpY2FsbHkuXG4gICAgY29uc3QgZmFpbGVkQXV0b0Vycm9ycyA9IHRoaXMuX3RyeURldGVjdEZhaWxlZEF1dG9JbXBvcnQoY2hhbmdlU2V0KTtcbiAgICBpZiAoZmFpbGVkQXV0b0Vycm9ycykge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogJ3Byb2JsZW0nLFxuICAgICAgICBkZXRlY3RlZEJ5OiB7XG4gICAgICAgICAgdHlwZTogJ2NoYW5nZS1zZXQnLFxuICAgICAgICAgIGNoYW5nZVNldFN0YXR1czogY2hhbmdlU2V0LlN0YXR1cyA/PyAnJyxcbiAgICAgICAgICBjaGFuZ2VTZXROYW1lOiBjaGFuZ2VTZXQuQ2hhbmdlU2V0TmFtZSA/PyAnJyxcbiAgICAgICAgICBzdGF0dXNSZWFzb246IGNoYW5nZVNldC5TdGF0dXNSZWFzb24gPz8gJycsXG4gICAgICAgIH0sXG4gICAgICAgIHByb2JsZW1zOiBhd2FpdCB0aGlzLmFkZEVycm9yVHJhY2VzKGZhaWxlZEF1dG9FcnJvcnMpLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBPdGhlcndpc2UsIGEgZ2VuZXJpYyBjaGFuZ2Ugc2V0IGNyZWF0aW9uIGVycm9yIHdoZXJlIGBEZXNjcmliZUV2ZW50c2BcbiAgICAvLyBtaWdodCBvciBtaWdodCBub3QgZ2l2ZSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uLlxuICAgIHJldHVybiB0aGlzLl9yZXBvcnRDaGFuZ2VTZXRGYWlsdXJlRnJvbUV2ZW50cyhjaGFuZ2VTZXQsIHtcbiAgICAgIHR5cGU6ICdjaGFuZ2Utc2V0JyxcbiAgICAgIGNoYW5nZVNldFN0YXR1czogY2hhbmdlU2V0LlN0YXR1cyA/PyAnJyxcbiAgICAgIGNoYW5nZVNldE5hbWU6IGNoYW5nZVNldC5DaGFuZ2VTZXROYW1lID8/ICcnLFxuICAgICAgc3RhdHVzUmVhc29uOiBjaGFuZ2VTZXQuU3RhdHVzUmVhc29uID8/ICcnLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFRyeSB0byByZWFkIHRoZSByZXNvdXJjZS1zcGVjaWZpYyByZWFzb25zIGZvciBhIGNoYW5nZXNldCBmYWlsdXJlIGZyb20gYERlc2NyaWJlRXZlbnRzYC5cbiAgICpcbiAgICogSWYgd2UgY291bGRuJ3QgcmVhZCB0aGUgZXZlbnRzIG9yIHRoZXJlIGFyZSAwIGVycm9ycyByZXR1cm5lZCBieSB0aGF0IEFQSSwgcmV0dXJuIGEgZ2VuZXJpY1xuICAgKiBlcnJvci5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgX3JlcG9ydENoYW5nZVNldEZhaWx1cmVGcm9tRXZlbnRzKGNoYW5nZVNldDogQ2hhbmdlU2V0U3VtbWFyeSwgZGV0ZWN0ZWRCeTogU3RhY2tQcm9ibGVtU291cmNlKTogUHJvbWlzZTxTdGFja0RpYWdub3Npcz4ge1xuICAgIGNvbnN0IGV2ID0gYXdhaXQgbmV3IENoYW5nZVNldFJlc291cmNlRXJyb3JGZXRjaGVyKHRoaXMucHJvcHMuc2RrLCB0aGlzLnByb3BzLmVudlJlc291cmNlcylcbiAgICAgIC5mZXRjaERldGFpbHNTdHJ1Y3R1cmVkKGNoYW5nZVNldC5DaGFuZ2VTZXROYW1lISwgY2hhbmdlU2V0LlN0YWNrTmFtZSEpO1xuXG4gICAgLy8gSWYgd2UgaGF2ZSBlcnJvcnMgdG8gcmV0dXJuLCByZXR1cm4gdGhlbVxuICAgIGlmIChldi50eXBlID09PSAncmVzb3VyY2UtZXJyb3JzJyAmJiBldi5lcnJvcnMubGVuZ3RoID4gMCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogJ3Byb2JsZW0nLFxuICAgICAgICBkZXRlY3RlZEJ5LFxuICAgICAgICBwcm9ibGVtczogYXdhaXQgdGhpcy5hZGRFcnJvclRyYWNlcyhldi5lcnJvcnMubWFwKChlKSA9PiByZXNvdXJjZUVycm9yRnJvbUVhcmx5VmFsaWRhdGlvbkVycm9yKGNoYW5nZVNldC5TdGFja0lkID8/ICcnLCB0aGlzLnBhcmVudFN0YWNrTG9naWNhbElkcywgZSkpKSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gT3RoZXJ3aXNlLCB3ZSB3aWxsIHJldHVybiBhIGdlbmVyaWMgY2hhbmdlc2V0IGVycm9yIG1lc3NhZ2UuIElmIHRoZXJlIHdhcyBhIHByb2JsZW1cbiAgICAvLyBjaGVja2luZywgd2UgbG9nIHRoYXQgZm9yIGdvb2QgbWVhc3VyZSBidXQgdGhlIHJlc3VsdCBpcyB0aGUgc2FtZS5cbiAgICBpZiAoZXYudHlwZSA9PT0gJ2NvdWxkLW5vdC1jaGVjaycpIHtcbiAgICAgIGF3YWl0IHRoaXMucHJvcHMuaW9IZWxwZXIuZGVmYXVsdHMud2Fybihldi5tZXNzYWdlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fbm9uU3BlY2lmaWNDaGFuZ2VTZXRFcnJvcihjaGFuZ2VTZXQsIGRldGVjdGVkQnkpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBhZGRFcnJvclRyYWNlcyhlcnJzOiByZWFkb25seSBSZXNvdXJjZUVycm9yW10pOiBQcm9taXNlPFRyYWNlZFJlc291cmNlRXJyb3JbXT4ge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAY2RrbGFicy9wcm9taXNlYWxsLW5vLXVuYm91bmRlZC1wYXJhbGxlbGlzbVxuICAgIHJldHVybiBQcm9taXNlLmFsbChlcnJzLm1hcCgoZSkgPT4gdGhpcy5hZGRFcnJvclRyYWNlKGUpKSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGFkZEVycm9yVHJhY2UoZXJyOiBSZXNvdXJjZUVycm9yKTogUHJvbWlzZTxUcmFjZWRSZXNvdXJjZUVycm9yPiB7XG4gICAgbGV0IHNvdXJjZVRyYWNlO1xuICAgIGlmIChlcnIubG9naWNhbElkKSB7XG4gICAgICBzb3VyY2VUcmFjZSA9IGF3YWl0IHRoaXMucHJvcHMuc291cmNlVHJhY2VyLnRyYWNlUmVzb3VyY2UoZXJyLnN0YWNrQXJuLCBlcnIucGFyZW50U3RhY2tMb2dpY2FsSWRzLCBlcnIubG9naWNhbElkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc291cmNlVHJhY2UgPSBhd2FpdCB0aGlzLnByb3BzLnNvdXJjZVRyYWNlci50cmFjZVN0YWNrKGVyci5zdGFja0FybiwgZXJyLnBhcmVudFN0YWNrTG9naWNhbElkcyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgLi4uZXJyLCBzb3VyY2VUcmFjZSwgdG9wTGV2ZWxTdGFja0hpZXJhcmNoaWNhbElkOiB0aGlzLnByb3BzLnRvcExldmVsU3RhY2tIaWVyYXJjaGljYWxJZCB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIGEgZ2VuZXJpYyBzdGFjayBlcnJvciBmcm9tIHRoZSBnaXZlbiBjaGFuZ2Ugc2V0IGluZm9ybWF0aW9uXG4gICAqXG4gICAqIFdlIGNhbid0IHBvaW50IHRvIGEgc3BlY2lmaWMgcmVzb3VyY2UuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIF9ub25TcGVjaWZpY0NoYW5nZVNldEVycm9yKGNoYW5nZVNldDogQ2hhbmdlU2V0U3VtbWFyeSwgZGV0ZWN0ZWRCeTogU3RhY2tQcm9ibGVtU291cmNlKTogUHJvbWlzZTxTdGFja0RpYWdub3Npcz4ge1xuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiAncHJvYmxlbScsXG4gICAgICBkZXRlY3RlZEJ5LFxuICAgICAgcHJvYmxlbXM6IFtcbiAgICAgICAgYXdhaXQgdGhpcy5hZGRFcnJvclRyYWNlKHtcbiAgICAgICAgICAvLyBJdCdzIGFib3V0IGEgc3RhY2tcbiAgICAgICAgICBsb2dpY2FsSWQ6IHVuZGVmaW5lZCxcbiAgICAgICAgICBtZXNzYWdlOiBjaGFuZ2VTZXQuU3RhdHVzUmVhc29uID8/ICcnLFxuICAgICAgICAgIHBhcmVudFN0YWNrTG9naWNhbElkczogdGhpcy5wYXJlbnRTdGFja0xvZ2ljYWxJZHMsXG4gICAgICAgICAgc3RhY2tBcm46IGNoYW5nZVNldC5TdGFja0lkID8/ICcnLFxuICAgICAgICAgIHBoeXNpY2FsSWQ6IGNoYW5nZVNldC5TdGFja0lkLFxuICAgICAgICAgIHJlc291cmNlVHlwZTogJ0FXUzo6Q2xvdWRGb3JtYXRpb246OlN0YWNrJyxcbiAgICAgICAgfSksXG4gICAgICBdLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogTG9vayBmb3IgbmVzdGVkIGNoYW5nZSBzZXRzIHRoYXQgaGF2ZSBmYWlsZWQsIGFuZCBkaWFnbm9zZSB0aG9zZS5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgX2RpYWdub3NlTmVzdGVkQ2hhbmdlU2V0RmFpbHVyZShjaGFuZ2VTZXQ6IENoYW5nZVNldFN1bW1hcnkpOiBQcm9taXNlPFN0YWNrRGlhZ25vc2lzPiB7XG4gICAgY29uc3QgbmVzdGVkID0gYXdhaXQgdGhpcy5fZmluZEZhaWxlZE5lc3RlZFN0YWNrKGNoYW5nZVNldCk7XG4gICAgaWYgKCFuZXN0ZWQpIHtcbiAgICAgIC8vIFRoYXQncyB3ZWlyZC4gTGV0J3MgcmV0dXJuIHRoZSBjaGFuZ2Ugc2V0J3Mgc3RhdHVzIHJlYXNvbiBhcyBhIG5vbi1zcGVjaWZpYyBlcnJvclxuICAgICAgcmV0dXJuIHRoaXMuX25vblNwZWNpZmljQ2hhbmdlU2V0RXJyb3IoY2hhbmdlU2V0LCB7XG4gICAgICAgIHR5cGU6ICdjaGFuZ2Utc2V0JyxcbiAgICAgICAgY2hhbmdlU2V0TmFtZTogY2hhbmdlU2V0LkNoYW5nZVNldE5hbWUgPz8gJycsXG4gICAgICAgIGNoYW5nZVNldFN0YXR1czogY2hhbmdlU2V0LlN0YXR1cyA/PyAnJyxcbiAgICAgICAgc3RhdHVzUmVhc29uOiBjaGFuZ2VTZXQuU3RhdHVzUmVhc29uID8/ICcnLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgbmVzdGVkQ3MgPSBhd2FpdCB0aGlzLmNmbi5kZXNjcmliZUNoYW5nZVNldCh7XG4gICAgICBDaGFuZ2VTZXROYW1lOiBuZXN0ZWQuY2hhbmdlU2V0QXJuLFxuICAgICAgU3RhY2tOYW1lOiBuZXN0ZWQuc3RhY2tBcm4sXG4gICAgfSk7XG5cbiAgICBjb25zdCBuZXN0ZWREaWFnID0gbmV3IENsb3VkRm9ybWF0aW9uU3RhY2tEaWFnbm9zZXIodGhpcy5wcm9wcyk7XG4gICAgbmVzdGVkRGlhZy5wYXJlbnRTdGFja0xvZ2ljYWxJZHMgPSBbLi4udGhpcy5wYXJlbnRTdGFja0xvZ2ljYWxJZHMsIG5lc3RlZC5sb2dpY2FsSWRdO1xuICAgIHJldHVybiBuZXN0ZWREaWFnLl9kaWFnbm9zZUNoYW5nZVNldEZhaWx1cmUobmVzdGVkQ3MpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBfZmluZEZhaWxlZE5lc3RlZFN0YWNrKGNoYW5nZVNldDogQ2hhbmdlU2V0U3VtbWFyeSk6IFByb21pc2U8e1xuICAgIHN0YWNrQXJuOiBzdHJpbmc7XG4gICAgY2hhbmdlU2V0QXJuOiBzdHJpbmc7XG4gICAgbG9naWNhbElkOiBzdHJpbmc7XG4gIH0gfCB1bmRlZmluZWQ+IHtcbiAgICAvLyBUaGUgc3RhdHVzIHJlYXNvbiBvbmx5IGluY2x1ZGVzIHRoZSBjaGFuZ2Ugc2V0IElELCBidXQgd2UgYWxzbyBuZWVkIHRoZSBzdGFjayBuYW1lLiBUaGUgd2F5IHRvIGdldCB0aGlzIGlzXG4gICAgLy8gZGVzY3JpYmUgdGhlIGN1cnJlbnQgY2hhbmdlIHNldCwgdGhlbiBmcm9tIHRoZSBDaGFuZ2VzIGZpbmQgdGhlIHN0YWNrIHdob3NlIENoYW5nZVNldElkIGlzIG1lbnRpb25lZCBpbiB0aGVcbiAgICAvLyBzdGF0dXMgcmVhc29uLCB0aGVuIGxvb2sgdXAgdGhhdCBjaGFuZ2Ugc2V0IGFuZCByZWN1cnNlIGludG8gYSByZWd1bGFyIGNoYW5nZSBzZXQgZGlhZ25vc2lzLlxuICAgIGxldCBuZXh0VG9rZW4gPSB1bmRlZmluZWQ7XG4gICAgZG8ge1xuICAgICAgLy8gQ2hhbmdlcyBpbiB0aGlzIHJlc3BvbnNlIG1pZ2h0IGJlIHBhZ2luYXRlZFxuICAgICAgY29uc3QgcmVzcCA9IGF3YWl0IHRoaXMuY2ZuLmRlc2NyaWJlQ2hhbmdlU2V0KHtcbiAgICAgICAgU3RhY2tOYW1lOiBjaGFuZ2VTZXQuU3RhY2tJZCxcbiAgICAgICAgQ2hhbmdlU2V0TmFtZTogY2hhbmdlU2V0LkNoYW5nZVNldElkLFxuICAgICAgICAuLi5uZXh0VG9rZW4gPyB7IE5leHRUb2tlbjogbmV4dFRva2VuIH0gOiB7fSxcbiAgICAgIH0pO1xuXG4gICAgICBmb3IgKGNvbnN0IGNoYW5nZSBvZiByZXNwLkNoYW5nZXMgPz8gW10pIHtcbiAgICAgICAgaWYgKGNoYW5nZS5UeXBlID09PSBDaGFuZ2VUeXBlLlJlc291cmNlICYmIGNoYW5nZS5SZXNvdXJjZUNoYW5nZT8uUmVzb3VyY2VUeXBlID09PSAnQVdTOjpDbG91ZEZvcm1hdGlvbjo6U3RhY2snICYmIGNoYW5nZS5SZXNvdXJjZUNoYW5nZT8uQ2hhbmdlU2V0SWQgJiYgY2hhbmdlU2V0LlN0YXR1c1JlYXNvbj8uaW5jbHVkZXMoY2hhbmdlLlJlc291cmNlQ2hhbmdlPy5DaGFuZ2VTZXRJZCkpIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY2hhbmdlU2V0QXJuOiBjaGFuZ2UuUmVzb3VyY2VDaGFuZ2UuQ2hhbmdlU2V0SWQsXG4gICAgICAgICAgICBzdGFja0FybjogY2hhbmdlLlJlc291cmNlQ2hhbmdlLlBoeXNpY2FsUmVzb3VyY2VJZCA/PyAnJyxcbiAgICAgICAgICAgIGxvZ2ljYWxJZDogY2hhbmdlLlJlc291cmNlQ2hhbmdlLkxvZ2ljYWxSZXNvdXJjZUlkID8/ICcnLFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgbmV4dFRva2VuID0gcmVzcC5OZXh0VG9rZW47XG4gICAgfSB3aGlsZSAobmV4dFRva2VuKTtcblxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogVHJ5IHRvIHBhcnNlIGZhaWxlZCBhdXRvLWltcG9ydHMgb3V0IGZyb20gYSBjaGFuZ2Ugc2V0IHN0YXR1c1xuICAgKlxuICAgKiBUaGUgcGF0dGVybiBsb29rcyBsaWtlIHRoaXM6XG4gICAqXG4gICAqIGBgYFxuICAgKiBDbG91ZEZvcm1hdGlvbiBpcyBhdHRlbXB0aW5nIHRvIGltcG9ydCBzb21lIHJlc291cmNlcyBiZWNhdXNlIHRoZXkgYWxyZWFkeSBleGlzdCBpbiB5b3VyIGFjY291bnQuIFRoZSByZXNvdXJjZXMgbXVzdCBoYXZlIHRoZSBEZWxldGlvblBvbGljeSBhdHRyaWJ1dGUgc2V0IHRvICdSZXRhaW4nIG9yICdSZXRhaW5FeGNlcHRPbkNyZWF0ZScgaW4gdGhlIHRlbXBsYXRlIGZvciBzdWNjZXNzZnVsIGltcG9ydC4gVGhlIGFmZmVjdGVkIHJlc291cmNlcyBhcmUgU29tZUJ1Y2tldEQ1QjcwNzA0ICh7QnVja2V0TmFtZT16b21hYXJlZW5idWNrZXR9KVxuICAgKiBgYGBcbiAgICpcbiAgICogRm9sbG93ZWQgYnlcbiAgICpcbiAgICogYGBgXG4gICAqIExvZ2ljYWxJRCAoe1Byb3A9VmFsdWUsUHJvcD1WYWx1ZX0pLCBMb2dpY2FsSUQgKHtQcm9wPVZhbHVlfSksIC4uLlxuICAgKiBgYGBcbiAgICovXG4gIHByaXZhdGUgX3RyeURldGVjdEZhaWxlZEF1dG9JbXBvcnQoY2hhbmdlU2V0OiBDaGFuZ2VTZXRTdW1tYXJ5KTogUmVzb3VyY2VFcnJvcltdIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBtZXNzYWdlID0gY2hhbmdlU2V0LlN0YXR1c1JlYXNvbjtcbiAgICAvLyBPbmx5IGVuaGFuY2UgdGhlIHNwZWNpZmljIENGTiBlcnJvciBhYm91dCBpbXBvcnRpbmcgZXhpc3RpbmcgcmVzb3VyY2VzXG4gICAgaWYgKCFtZXNzYWdlPy5pbmNsdWRlcygnQ2xvdWRGb3JtYXRpb24gaXMgYXR0ZW1wdGluZyB0byBpbXBvcnQgc29tZSByZXNvdXJjZXMgYmVjYXVzZSB0aGV5IGFscmVhZHkgZXhpc3QgaW4geW91ciBhY2NvdW50JykpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgY29uc3QgbWFya2VyID0gJ1RoZSBhZmZlY3RlZCByZXNvdXJjZXMgYXJlICc7XG4gICAgY29uc3QgbWFya2VySW5kZXggPSBtZXNzYWdlLmluZGV4T2YobWFya2VyKTtcbiAgICBpZiAobWFya2VySW5kZXggPT09IC0xKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGNvbnN0IHJldDogUmVzb3VyY2VFcnJvcltdID0gW107XG4gICAgbGV0IHJlbWFpbmluZyA9IG1lc3NhZ2Uuc2xpY2UobWFya2VySW5kZXggKyBtYXJrZXIubGVuZ3RoKTtcbiAgICB3aGlsZSAocmVtYWluaW5nKSB7XG4gICAgICBjb25zdCBlbmRJeCA9IHJlbWFpbmluZy5pbmRleE9mKCcpLCAnKTtcbiAgICAgIGNvbnN0IHRoaXNSZXNvdXJjZSA9IGVuZEl4ID4gLTEgPyByZW1haW5pbmcuc2xpY2UoMCwgZW5kSXggKyAxKSA6IHJlbWFpbmluZztcbiAgICAgIHJlbWFpbmluZyA9IHJlbWFpbmluZy5zbGljZSh0aGlzUmVzb3VyY2UubGVuZ3RoICsgMik7XG5cbiAgICAgIC8vIHRoaXNSZXNvdXJjZSA9IFwiTG9naWNhbElkICh7UHJvcD1WYWx1ZSwgUHJvcD1WYWx1ZX0pXCJcbiAgICAgIGNvbnN0IG9wZW5QYXJlbiA9IHRoaXNSZXNvdXJjZS5pbmRleE9mKCcoJyk7XG4gICAgICBjb25zdCBsb2dpY2FsSWQgPSBvcGVuUGFyZW4gPiAtMSA/IHRoaXNSZXNvdXJjZS5zbGljZSgwLCBvcGVuUGFyZW4pLnRyaW0oKSA6IHVuZGVmaW5lZDtcblxuICAgICAgcmV0LnB1c2goe1xuICAgICAgICBtZXNzYWdlOiBgQXV0b21hdGljIGltcG9ydCBvZiBleGlzdGluZyByZXNvdXJjZSAke3RoaXNSZXNvdXJjZX0gbmVlZHMgYSBEZWxldGlvblBvbGljeSBvZiBcXCdSZXRhaW5cXCcgb3IgXFwnUmV0YWluRXhjZXB0T25DcmVhdGVcXCcuIFNldCB0aGUgcmVtb3ZhbCBwb2xpY3kgdG8gXFwnUmVtb3ZhbFBvbGljeS5SRVRBSU5cXCcgb3IgXFwnUmVtb3ZhbFBvbGljeS5SRVRBSU5fT05fVVBEQVRFX09SX0RFTEVURVxcJyAoU2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9jZGsvdjIvZ3VpZGUvcmVzb3VyY2VzLmh0bWwjcmVzb3VyY2VzLXJlbW92YWwpYCxcbiAgICAgICAgcGFyZW50U3RhY2tMb2dpY2FsSWRzOiB0aGlzLnBhcmVudFN0YWNrTG9naWNhbElkcyxcbiAgICAgICAgc3RhY2tBcm46IGNoYW5nZVNldC5TdGFja0lkID8/ICcnLFxuICAgICAgICBlcnJvckNvZGU6ICdBdXRvbWF0aWNJbXBvcnROZWVkc1JldGFpbicsXG4gICAgICAgIGxvZ2ljYWxJZCxcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gcmV0O1xuICB9XG59XG5cbi8qKlxuICogUmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIGNoYW5nZSBzZXQgaGFzIG5vIGNoYW5nZXNcbiAqXG4gKiBUaGlzIG11c3QgYmUgZGV0ZXJtaW5lZCBmcm9tIHRoZSBzdGF0dXMsIG5vdCB0aGUgJ0NoYW5nZXMnIGFycmF5IG9uIHRoZVxuICogb2JqZWN0OyB0aGUgbGF0dGVyIGNhbiBiZSBlbXB0eSBiZWNhdXNlIG5vIHJlc291cmNlcyB3ZXJlIGNoYW5nZWQsIGJ1dCBpZlxuICogdGhlcmUgYXJlIGNoYW5nZXMgdG8gT3V0cHV0cywgdGhlIGNoYW5nZSBzZXQgY2FuIHN0aWxsIGJlIGV4ZWN1dGVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2hhbmdlU2V0SGFzTm9DaGFuZ2VzKGRlc2NyaXB0aW9uOiBDaGFuZ2VTZXRTdW1tYXJ5KSB7XG4gIGNvbnN0IG5vQ2hhbmdlRXJyb3JQcmVmaXhlcyA9IFtcbiAgICAvLyBFcnJvciBtZXNzYWdlIGZvciBhIHJlZ3VsYXIgdGVtcGxhdGVcbiAgICBcIlRoZSBzdWJtaXR0ZWQgaW5mb3JtYXRpb24gZGlkbid0IGNvbnRhaW4gY2hhbmdlcy5cIixcbiAgICAvLyBFcnJvciBtZXNzYWdlIHdoZW4gYSBUcmFuc2Zvcm0gaXMgaW52b2x2ZWQgKHNlZSAjMTA2NTApXG4gICAgJ05vIHVwZGF0ZXMgYXJlIHRvIGJlIHBlcmZvcm1lZC4nLFxuICBdO1xuXG4gIHJldHVybiAoXG4gICAgZGVzY3JpcHRpb24uU3RhdHVzID09PSAnRkFJTEVEJyAmJiBub0NoYW5nZUVycm9yUHJlZml4ZXMuc29tZSgocCkgPT4gKGRlc2NyaXB0aW9uLlN0YXR1c1JlYXNvbiA/PyAnJykuc3RhcnRzV2l0aChwKSlcbiAgKTtcbn1cblxuZnVuY3Rpb24gcmVzb3VyY2VFcnJvckZyb21FYXJseVZhbGlkYXRpb25FcnJvcihzdGFja0lkOiBzdHJpbmcsIHBhcmVudFN0YWNrTG9naWNhbElkczogc3RyaW5nW10sIGV2OiBDaGFuZ2VTZXRSZXNvdXJjZUVycm9yKTogUmVzb3VyY2VFcnJvciB7XG4gIHJldHVybiB7XG4gICAgbG9naWNhbElkOiBldi5sb2dpY2FsSWQsXG4gICAgcGh5c2ljYWxJZDogZXYucGh5c2ljYWxJZCxcbiAgICByZXNvdXJjZVR5cGU6IGV2LnJlc291cmNlVHlwZSxcbiAgICBtZXNzYWdlOiBgJHtldi5tZXNzYWdlfSAoYXQgJHtldi5kb2N1bWVudFBhdGh9KWAsXG4gICAgZXJyb3JDb2RlOiBgJHtldi52YWxpZGF0aW9uTmFtZX1fJHtldi5ldmVudFR5cGV9YCxcbiAgICBwYXJlbnRTdGFja0xvZ2ljYWxJZHMsXG4gICAgc3RhY2tBcm46IHN0YWNrSWQsXG4gIH07XG59XG4iXX0=
395
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhY2stZGlhZ25vc2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsic3RhY2stZGlhZ25vc2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQThkQSxzREFXQztBQXhlRCwwRUFBNkU7QUFFN0UsdUVBQTBFO0FBQzFFLHFFQUErRDtBQU0vRCxrREFBOEQ7QUFFOUQsK0RBQTJEO0FBdUQzRCxNQUFhLDRCQUE0QjtJQU1WO0lBTFosR0FBRyxDQUF3QjtJQUNwQyxxQkFBcUIsQ0FBVztJQUNoQyxnQ0FBZ0MsQ0FBNEI7SUFDNUQsZUFBZSxHQUFHLElBQUksQ0FBQztJQUUvQixZQUE2QixLQUF3QztRQUF4QyxVQUFLLEdBQUwsS0FBSyxDQUFtQztRQUNuRSxJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQzNDLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxFQUFFLENBQUM7SUFDbEMsQ0FBQztJQUVEOztPQUVHO0lBQ0ksS0FBSyxDQUFDLGlCQUFpQixDQUFDLFNBQWlCO1FBQzlDLElBQUksQ0FBQztZQUNILE1BQU0sUUFBUSxHQUFHLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQztZQUN6RSxNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDbkMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUNYLE9BQU87b0JBQ0wsSUFBSSxFQUFFLGtCQUFrQjtvQkFDeEIsT0FBTyxFQUFFLG1CQUFtQixTQUFTLFlBQVk7aUJBQ2xELENBQUM7WUFDSixDQUFDO1lBRUQsTUFBTSxNQUFNLEdBQUcsMEJBQVcsQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN2RCxJQUFJLE1BQU0sQ0FBQyxZQUFZLEVBQUUsQ0FBQztnQkFDeEIsT0FBTztvQkFDTCxJQUFJLEVBQUUsa0JBQWtCO29CQUN4QixPQUFPLEVBQUUsbUJBQW1CLFNBQVMsZ0NBQWdDLE1BQU0sQ0FBQyxJQUFJLGtDQUFrQztpQkFDbkgsQ0FBQztZQUNKLENBQUM7WUFFRCxJQUFJLE1BQU0sQ0FBQyxTQUFTLElBQUksTUFBTSxDQUFDLGlCQUFpQixFQUFFLENBQUM7Z0JBQ2pELE9BQU8sTUFBTSxJQUFJLENBQUMsdUJBQXVCLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDbkQsQ0FBQztZQUVELE9BQU8sTUFBTSxJQUFJLENBQUMsc0NBQXNDLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDbEUsQ0FBQztRQUFDLE9BQU8sQ0FBTSxFQUFFLENBQUM7WUFDaEIsT0FBTyxFQUFFLElBQUksRUFBRSxrQkFBa0IsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQzFELENBQUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSSxLQUFLLENBQUMsaUJBQWlCLENBQUMsU0FBMkI7UUFDeEQsSUFBSSxDQUFDO1lBQ0gsT0FBTyxNQUFNLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN6RCxDQUFDO1FBQUMsT0FBTyxDQUFNLEVBQUUsQ0FBQztZQUNoQixPQUFPLEVBQUUsSUFBSSxFQUFFLGtCQUFrQixFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDMUQsQ0FBQztJQUNILENBQUM7SUFFRDs7T0FFRztJQUNJLEtBQUssQ0FBQywyQkFBMkIsQ0FDdEMsTUFBc0IsRUFDdEIsS0FBWSxFQUNaLGFBQWEsR0FBRyxJQUFJLEVBQ3BCLFVBQTJCLEVBQUU7UUFFN0IsSUFBSSxDQUFDLGVBQWUsR0FBRyxPQUFPLENBQUMsZUFBZSxJQUFJLElBQUksQ0FBQztRQUN2RCxJQUFJLE1BQU0sQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDO1lBQ3JCLElBQUksYUFBYSxFQUFFLENBQUM7Z0JBQ2xCLHFFQUFxRTtnQkFDckUsOENBQThDO2dCQUM5QyxJQUFJLENBQUM7b0JBQ0gsT0FBTyxNQUFNLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDbkQsQ0FBQztnQkFBQyxPQUFPLENBQU0sRUFBRSxDQUFDO29CQUNoQixNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsOEJBQThCLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO2dCQUN0RixDQUFDO1lBQ0gsQ0FBQztZQUNELE9BQU8sRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLENBQUM7UUFDaEMsQ0FBQztRQUVELE9BQU87WUFDTCxJQUFJLEVBQUUsU0FBUztZQUNmLFVBQVUsRUFBRTtnQkFDVixJQUFJLEVBQUUsWUFBWTtnQkFDbEIsV0FBVyxFQUFFLEtBQUssQ0FBQyxXQUFXLElBQUksRUFBRTtnQkFDcEMsWUFBWSxFQUFFLEtBQUssQ0FBQyxpQkFBaUIsSUFBSSxFQUFFO2FBQzVDO1lBQ0QsUUFBUSxFQUFFLE1BQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDO1NBQy9DLENBQUM7SUFDSixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNLLEtBQUssQ0FBQyx1QkFBdUIsQ0FBQyxLQUFZO1FBQ2hELE1BQU0sTUFBTSxHQUFHLElBQUksK0JBQWdCLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRTtZQUM1QyxRQUFRLEVBQUUsS0FBSyxDQUFDLE9BQVE7WUFDeEIsZ0JBQWdCLEVBQUUsd0JBQVMsQ0FBQyxtQkFBbUIsRUFBRTtTQUNsRCxDQUFDLENBQUM7UUFFSCx5R0FBeUc7UUFDekcsb0NBQW9DO1FBQ3BDLE1BQU0sTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDO1FBRXBCLE9BQU8sSUFBSSxDQUFDLDJCQUEyQixDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxFQUFFLGVBQWUsRUFBRSxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUMsQ0FBQztJQUNsSCxDQUFDO0lBRU8sS0FBSyxDQUFDLHNDQUFzQyxDQUFDLEtBQVk7UUFDL0QsTUFBTSxFQUFFLEdBQUcsQ0FBQyxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDO1lBQ3hDLFNBQVMsRUFBRSxLQUFLLENBQUMsT0FBUTtTQUMxQixDQUFDLENBQUMsQ0FBQyxTQUFTLElBQUksRUFBRSxDQUFDO1FBRXBCLE1BQU0sT0FBTyxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxLQUFLLHVDQUFlLENBQUMsa0JBQWtCLElBQUksQ0FBQyxDQUFDLE1BQU0sS0FBSyx1Q0FBZSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQy9ILElBQUksT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUN2QixPQUFPO2dCQUNMLElBQUksRUFBRSxrQkFBa0I7Z0JBQ3hCLE9BQU8sRUFBRSxtQkFBbUIsS0FBSyxDQUFDLFNBQVMsNkNBQTZDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLGtDQUFrQzthQUNuSixDQUFDO1FBQ0osQ0FBQztRQUVELE1BQU0sTUFBTSxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxLQUFLLHVDQUFlLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDbkUsSUFBSSxNQUFNLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3hCLE9BQU8sRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLENBQUM7UUFDaEMsQ0FBQztRQUVELE9BQU8sSUFBSSxDQUFDLHlCQUF5QixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ25ELENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0ssS0FBSyxDQUFDLHlCQUF5QixDQUFDLFNBQTJCO1FBQ2pFLElBQUksU0FBUyxDQUFDLE1BQU0sS0FBSyx1Q0FBZSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2hELE9BQU8sRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLENBQUM7UUFDaEMsQ0FBQztRQUVELElBQUkscUJBQXFCLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztZQUNyQyxnRkFBZ0Y7WUFDaEYsT0FBTyxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsQ0FBQztRQUNoQyxDQUFDO1FBRUQsc0ZBQXNGO1FBQ3RGLDBCQUEwQjtRQUMxQixNQUFNLHNCQUFzQixHQUFHLFNBQVMsQ0FBQyxZQUFZLEVBQUUsUUFBUSxDQUFDLHNCQUFzQixDQUFDLENBQUM7UUFDeEYsSUFBSSxzQkFBc0IsRUFBRSxDQUFDO1lBQzNCLE9BQU8sSUFBSSxDQUFDLGlDQUFpQyxDQUFDLFNBQVMsRUFBRTtnQkFDdkQsSUFBSSxFQUFFLGtCQUFrQjtnQkFDeEIsYUFBYSxFQUFFLFNBQVMsQ0FBQyxhQUFhLElBQUksRUFBRTthQUM3QyxDQUFDLENBQUM7UUFDTCxDQUFDO1FBRUQsd0RBQXdEO1FBQ3hELElBQUksU0FBUyxDQUFDLFlBQVksRUFBRSxRQUFRLENBQUMsbUJBQW1CLENBQUMsRUFBRSxDQUFDO1lBQzFELE9BQU8sSUFBSSxDQUFDLCtCQUErQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3pELENBQUM7UUFFRCxpR0FBaUc7UUFDakcsNkRBQTZEO1FBQzdELE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLDBCQUEwQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3BFLElBQUksZ0JBQWdCLEVBQUUsQ0FBQztZQUNyQixPQUFPO2dCQUNMLElBQUksRUFBRSxTQUFTO2dCQUNmLFVBQVUsRUFBRTtvQkFDVixJQUFJLEVBQUUsWUFBWTtvQkFDbEIsZUFBZSxFQUFFLFNBQVMsQ0FBQyxNQUFNLElBQUksRUFBRTtvQkFDdkMsYUFBYSxFQUFFLFNBQVMsQ0FBQyxhQUFhLElBQUksRUFBRTtvQkFDNUMsWUFBWSxFQUFFLFNBQVMsQ0FBQyxZQUFZLElBQUksRUFBRTtpQkFDM0M7Z0JBQ0QsUUFBUSxFQUFFLE1BQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQzthQUNyRCxDQUFDO1FBQ0osQ0FBQztRQUVELHdFQUF3RTtRQUN4RSxrREFBa0Q7UUFDbEQsT0FBTyxJQUFJLENBQUMsaUNBQWlDLENBQUMsU0FBUyxFQUFFO1lBQ3ZELElBQUksRUFBRSxZQUFZO1lBQ2xCLGVBQWUsRUFBRSxTQUFTLENBQUMsTUFBTSxJQUFJLEVBQUU7WUFDdkMsYUFBYSxFQUFFLFNBQVMsQ0FBQyxhQUFhLElBQUksRUFBRTtZQUM1QyxZQUFZLEVBQUUsU0FBUyxDQUFDLFlBQVksSUFBSSxFQUFFO1NBQzNDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNLLEtBQUssQ0FBQyxpQ0FBaUMsQ0FBQyxTQUEyQixFQUFFLFVBQThCO1FBQ3pHLE1BQU0sRUFBRSxHQUFHLE1BQU0sSUFBSSx1REFBNkIsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQzthQUN4RixzQkFBc0IsQ0FBQyxTQUFTLENBQUMsYUFBYyxFQUFFLFNBQVMsQ0FBQyxTQUFVLENBQUMsQ0FBQztRQUUxRSwyQ0FBMkM7UUFDM0MsSUFBSSxFQUFFLENBQUMsSUFBSSxLQUFLLGlCQUFpQixJQUFJLEVBQUUsQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQzFELE9BQU87Z0JBQ0wsSUFBSSxFQUFFLFNBQVM7Z0JBQ2YsVUFBVTtnQkFDVixRQUFRLEVBQUUsTUFBTSxJQUFJLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxxQ0FBcUMsQ0FBQyxTQUFTLENBQUMsT0FBTyxJQUFJLEVBQUUsRUFBRSxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUN4SixDQUFDO1FBQ0osQ0FBQztRQUVELHNGQUFzRjtRQUN0RixxRUFBcUU7UUFDckUsSUFBSSxFQUFFLENBQUMsSUFBSSxLQUFLLGlCQUFpQixFQUFFLENBQUM7WUFDbEMsTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN0RCxDQUFDO1FBRUQsT0FBTyxJQUFJLENBQUMsMEJBQTBCLENBQUMsU0FBUyxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQ2hFLENBQUM7SUFFTyxLQUFLLENBQUMsYUFBYSxDQUFDLElBQThCO1FBQ3hELHVHQUF1RztRQUN2Ryx5REFBeUQ7UUFDekQsd0VBQXdFO1FBQ3hFLE9BQU8sT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM1RCxDQUFDO0lBRU8sS0FBSyxDQUFDLFlBQVksQ0FBQyxHQUFrQjtRQUMzQyxNQUFNLGtCQUFrQixHQUFHLEdBQUcsQ0FBQyxTQUFTO1lBQ3RDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMscUJBQXFCLEVBQUUsR0FBRyxDQUFDLFNBQVMsQ0FBQztZQUMvRixDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDLHFCQUFxQixDQUFDLENBQUM7UUFFaEYsd0VBQXdFO1FBQ3hFLE1BQU0sQ0FBQyxXQUFXLEVBQUUsaUJBQWlCLENBQUMsR0FBRyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUM7WUFDekQsa0JBQWtCO1lBQ2xCLElBQUksQ0FBQyw2QkFBNkIsQ0FBQyxHQUFHLENBQUM7U0FDeEMsQ0FBQyxDQUFDO1FBRUgsT0FBTztZQUNMLEdBQUcsR0FBRztZQUNOLFdBQVc7WUFDWCwyQkFBMkIsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLDJCQUEyQjtZQUNuRSxHQUFHLENBQUMsaUJBQWlCLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxpQkFBaUIsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7U0FDL0QsQ0FBQztJQUNKLENBQUM7SUFFTyxLQUFLLENBQUMsNkJBQTZCLENBQUMsR0FBa0I7UUFDNUQsTUFBTSxHQUFHLEdBQUcsTUFBTSxJQUFJLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztRQUNsRCxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDVCxPQUFPLEVBQUUsQ0FBQztRQUNaLENBQUM7UUFDRCxJQUFJLENBQUM7WUFDSCxPQUFPLE1BQU0sSUFBQSw0Q0FBbUIsRUFBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFO2dCQUMzRixlQUFlLEVBQUUsSUFBSSxDQUFDLGVBQWU7YUFDdEMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUFDLE9BQU8sQ0FBTSxFQUFFLENBQUM7WUFDaEIsTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLGtDQUFrQyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztZQUN4RixPQUFPLEVBQUUsQ0FBQztRQUNaLENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNLLEtBQUssQ0FBQywwQkFBMEIsQ0FBQyxTQUEyQixFQUFFLFVBQThCO1FBQ2xHLE9BQU87WUFDTCxJQUFJLEVBQUUsU0FBUztZQUNmLFVBQVU7WUFDVixRQUFRLEVBQUU7Z0JBQ1IsTUFBTSxJQUFJLENBQUMsWUFBWSxDQUFDO29CQUN0QixxQkFBcUI7b0JBQ3JCLFNBQVMsRUFBRSxTQUFTO29CQUNwQixPQUFPLEVBQUUsU0FBUyxDQUFDLFlBQVksSUFBSSxFQUFFO29CQUNyQyxxQkFBcUIsRUFBRSxJQUFJLENBQUMscUJBQXFCO29CQUNqRCxRQUFRLEVBQUUsU0FBUyxDQUFDLE9BQU8sSUFBSSxFQUFFO29CQUNqQyxVQUFVLEVBQUUsU0FBUyxDQUFDLE9BQU87b0JBQzdCLFlBQVksRUFBRSw0QkFBNEI7aUJBQzNDLENBQUM7YUFDSDtTQUNGLENBQUM7SUFDSixDQUFDO0lBRUQ7O09BRUc7SUFDSyxLQUFLLENBQUMsK0JBQStCLENBQUMsU0FBMkI7UUFDdkUsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsc0JBQXNCLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDNUQsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ1osb0ZBQW9GO1lBQ3BGLE9BQU8sSUFBSSxDQUFDLDBCQUEwQixDQUFDLFNBQVMsRUFBRTtnQkFDaEQsSUFBSSxFQUFFLFlBQVk7Z0JBQ2xCLGFBQWEsRUFBRSxTQUFTLENBQUMsYUFBYSxJQUFJLEVBQUU7Z0JBQzVDLGVBQWUsRUFBRSxTQUFTLENBQUMsTUFBTSxJQUFJLEVBQUU7Z0JBQ3ZDLFlBQVksRUFBRSxTQUFTLENBQUMsWUFBWSxJQUFJLEVBQUU7YUFDM0MsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUVELE1BQU0sUUFBUSxHQUFHLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQztZQUNoRCxhQUFhLEVBQUUsTUFBTSxDQUFDLFlBQVk7WUFDbEMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxRQUFRO1NBQzNCLENBQUMsQ0FBQztRQUVILE1BQU0sVUFBVSxHQUFHLElBQUksNEJBQTRCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2hFLFVBQVUsQ0FBQyxxQkFBcUIsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixFQUFFLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNyRixPQUFPLFVBQVUsQ0FBQyx5QkFBeUIsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUN4RCxDQUFDO0lBRU8sS0FBSyxDQUFDLHNCQUFzQixDQUFDLFNBQTJCO1FBSzlELDZHQUE2RztRQUM3Ryw4R0FBOEc7UUFDOUcsK0ZBQStGO1FBQy9GLElBQUksU0FBUyxHQUFHLFNBQVMsQ0FBQztRQUMxQixHQUFHLENBQUM7WUFDRiw4Q0FBOEM7WUFDOUMsTUFBTSxJQUFJLEdBQUcsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLGlCQUFpQixDQUFDO2dCQUM1QyxTQUFTLEVBQUUsU0FBUyxDQUFDLE9BQU87Z0JBQzVCLGFBQWEsRUFBRSxTQUFTLENBQUMsV0FBVztnQkFDcEMsR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFO2FBQzdDLENBQUMsQ0FBQztZQUVILEtBQUssTUFBTSxNQUFNLElBQUksSUFBSSxDQUFDLE9BQU8sSUFBSSxFQUFFLEVBQUUsQ0FBQztnQkFDeEMsSUFBSSxNQUFNLENBQUMsSUFBSSxLQUFLLGtDQUFVLENBQUMsUUFBUSxJQUFJLE1BQU0sQ0FBQyxjQUFjLEVBQUUsWUFBWSxLQUFLLDRCQUE0QixJQUFJLE1BQU0sQ0FBQyxjQUFjLEVBQUUsV0FBVyxJQUFJLFNBQVMsQ0FBQyxZQUFZLEVBQUUsUUFBUSxDQUFDLE1BQU0sQ0FBQyxjQUFjLEVBQUUsV0FBVyxDQUFDLEVBQUUsQ0FBQztvQkFDOU4sT0FBTzt3QkFDTCxZQUFZLEVBQUUsTUFBTSxDQUFDLGNBQWMsQ0FBQyxXQUFXO3dCQUMvQyxRQUFRLEVBQUUsTUFBTSxDQUFDLGNBQWMsQ0FBQyxrQkFBa0IsSUFBSSxFQUFFO3dCQUN4RCxTQUFTLEVBQUUsTUFBTSxDQUFDLGNBQWMsQ0FBQyxpQkFBaUIsSUFBSSxFQUFFO3FCQUN6RCxDQUFDO2dCQUNKLENBQUM7WUFDSCxDQUFDO1lBRUQsU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7UUFDN0IsQ0FBQyxRQUFRLFNBQVMsRUFBRTtRQUVwQixPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBRUQ7Ozs7Ozs7Ozs7Ozs7O09BY0c7SUFDSywwQkFBMEIsQ0FBQyxTQUEyQjtRQUM1RCxNQUFNLE9BQU8sR0FBRyxTQUFTLENBQUMsWUFBWSxDQUFDO1FBQ3ZDLHlFQUF5RTtRQUN6RSxJQUFJLENBQUMsT0FBTyxFQUFFLFFBQVEsQ0FBQyxrR0FBa0csQ0FBQyxFQUFFLENBQUM7WUFDM0gsT0FBTyxTQUFTLENBQUM7UUFDbkIsQ0FBQztRQUVELE1BQU0sTUFBTSxHQUFHLDZCQUE2QixDQUFDO1FBQzdDLE1BQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDNUMsSUFBSSxXQUFXLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUN2QixPQUFPLFNBQVMsQ0FBQztRQUNuQixDQUFDO1FBRUQsTUFBTSxHQUFHLEdBQW9CLEVBQUUsQ0FBQztRQUNoQyxJQUFJLFNBQVMsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLFdBQVcsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDM0QsT0FBTyxTQUFTLEVBQUUsQ0FBQztZQUNqQixNQUFNLEtBQUssR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3ZDLE1BQU0sWUFBWSxHQUFHLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDNUUsU0FBUyxHQUFHLFNBQVMsQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztZQUVyRCx3REFBd0Q7WUFDeEQsTUFBTSxTQUFTLEdBQUcsWUFBWSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUM1QyxNQUFNLFNBQVMsR0FBRyxTQUFTLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFFdkYsR0FBRyxDQUFDLElBQUksQ0FBQztnQkFDUCxPQUFPLEVBQUUseUNBQXlDLFlBQVksdVBBQXVQO2dCQUNyVCxxQkFBcUIsRUFBRSxJQUFJLENBQUMscUJBQXFCO2dCQUNqRCxRQUFRLEVBQUUsU0FBUyxDQUFDLE9BQU8sSUFBSSxFQUFFO2dCQUNqQyxTQUFTLEVBQUUsNEJBQTRCO2dCQUN2QyxTQUFTO2FBQ1YsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUNELE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQztJQUVEOztPQUVHO0lBQ0ssd0JBQXdCO1FBQzlCLElBQUksQ0FBQyxJQUFJLENBQUMsZ0NBQWdDLEVBQUUsQ0FBQztZQUMzQyxJQUFJLENBQUMsZ0NBQWdDLEdBQUcsQ0FBQyxLQUFLLElBQUksRUFBRTtnQkFDbEQsSUFBSSxDQUFDO29CQUNILE9BQU8sTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLGdDQUFnQyxFQUFFLEVBQUUsQ0FBQztnQkFDL0QsQ0FBQztnQkFBQyxPQUFPLENBQU0sRUFBRSxDQUFDO29CQUNoQixNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsK0NBQStDLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO29CQUNyRyxPQUFPLFNBQVMsQ0FBQztnQkFDbkIsQ0FBQztZQUNILENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDUCxDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUMsZ0NBQWdDLENBQUM7SUFDL0MsQ0FBQztDQUNGO0FBbFpELG9FQWtaQztBQUVEOzs7Ozs7R0FNRztBQUNILFNBQWdCLHFCQUFxQixDQUFDLFdBQTZCO0lBQ2pFLE1BQU0scUJBQXFCLEdBQUc7UUFDNUIsdUNBQXVDO1FBQ3ZDLG1EQUFtRDtRQUNuRCwwREFBMEQ7UUFDMUQsaUNBQWlDO0tBQ2xDLENBQUM7SUFFRixPQUFPLENBQ0wsV0FBVyxDQUFDLE1BQU0sS0FBSyxRQUFRLElBQUkscUJBQXFCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxZQUFZLElBQUksRUFBRSxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQ3JILENBQUM7QUFDSixDQUFDO0FBRUQsU0FBUyxxQ0FBcUMsQ0FBQyxPQUFlLEVBQUUscUJBQStCLEVBQUUsRUFBMEI7SUFDekgsT0FBTztRQUNMLFNBQVMsRUFBRSxFQUFFLENBQUMsU0FBUztRQUN2QixVQUFVLEVBQUUsRUFBRSxDQUFDLFVBQVU7UUFDekIsWUFBWSxFQUFFLEVBQUUsQ0FBQyxZQUFZO1FBQzdCLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyxPQUFPLFFBQVEsRUFBRSxDQUFDLFlBQVksR0FBRztRQUNoRCxTQUFTLEVBQUUsR0FBRyxFQUFFLENBQUMsY0FBYyxJQUFJLEVBQUUsQ0FBQyxTQUFTLEVBQUU7UUFDakQscUJBQXFCO1FBQ3JCLFFBQVEsRUFBRSxPQUFPO0tBQ2xCLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBDaGFuZ2VTZXRTdW1tYXJ5LCBTdGFjayB9IGZyb20gJ0Bhd3Mtc2RrL2NsaWVudC1jbG91ZGZvcm1hdGlvbic7XG5pbXBvcnQgeyBDaGFuZ2VTZXRTdGF0dXMsIENoYW5nZVR5cGUgfSBmcm9tICdAYXdzLXNkay9jbGllbnQtY2xvdWRmb3JtYXRpb24nO1xuaW1wb3J0IHR5cGUgeyBDaGFuZ2VTZXRSZXNvdXJjZUVycm9yIH0gZnJvbSAnLi9jaGFuZ2VzZXQtZXJyb3ItZmV0Y2hlcic7XG5pbXBvcnQgeyBDaGFuZ2VTZXRSZXNvdXJjZUVycm9yRmV0Y2hlciB9IGZyb20gJy4vY2hhbmdlc2V0LWVycm9yLWZldGNoZXInO1xuaW1wb3J0IHsgaW52ZXN0aWdhdGVSZXNvdXJjZSB9IGZyb20gJy4vcmVzb3VyY2UtaW52ZXN0aWdhdGlvbic7XG5pbXBvcnQgdHlwZSB7IFN0YWNrRGlhZ25vc2lzLCBTdGFja1Byb2JsZW1Tb3VyY2UsIFRyYWNlZFJlc291cmNlRXJyb3IgfSBmcm9tICcuLi8uLi9hY3Rpb25zL2RpYWdub3NlJztcbmltcG9ydCB0eXBlIHsgSUNsb3VkRm9ybWF0aW9uQ2xpZW50LCBTREsgfSBmcm9tICcuLi9hd3MtYXV0aC9zZGsnO1xuaW1wb3J0IHR5cGUgeyBFbnZpcm9ubWVudFJlc291cmNlcyB9IGZyb20gJy4uL2Vudmlyb25tZW50JztcbmltcG9ydCB0eXBlIHsgSW9IZWxwZXIgfSBmcm9tICcuLi9pby9wcml2YXRlL2lvLWhlbHBlcic7XG5pbXBvcnQgdHlwZSB7IElTb3VyY2VUcmFjZXIgfSBmcm9tICcuLi9zb3VyY2UtdHJhY2luZy9wcml2YXRlL3NvdXJjZS10cmFjaW5nJztcbmltcG9ydCB7IFBvbGxSYW5nZSwgU3RhY2tFdmVudFBvbGxlciB9IGZyb20gJy4uL3N0YWNrLWV2ZW50cyc7XG5pbXBvcnQgdHlwZSB7IFJlc291cmNlRXJyb3IsIFJlc291cmNlRXJyb3JzIH0gZnJvbSAnLi4vc3RhY2stZXZlbnRzL3Jlc291cmNlLWVycm9ycyc7XG5pbXBvcnQgeyBTdGFja1N0YXR1cyB9IGZyb20gJy4uL3N0YWNrLWV2ZW50cy9zdGFjay1zdGF0dXMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIENsb3VkRm9ybWF0aW9uU3RhY2tEaWFnbm9zZXJQcm9wcyB7XG4gIHJlYWRvbmx5IHNkazogU0RLO1xuICByZWFkb25seSBlbnZSZXNvdXJjZXM/OiBFbnZpcm9ubWVudFJlc291cmNlcztcbiAgcmVhZG9ubHkgc291cmNlVHJhY2VyOiBJU291cmNlVHJhY2VyO1xuICByZWFkb25seSBpb0hlbHBlcjogSW9IZWxwZXI7XG4gIHJlYWRvbmx5IHRvcExldmVsU3RhY2tIaWVyYXJjaGljYWxJZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBPcHRpb25hbGx5OiBhIGZ1bmN0aW9uIHRvIHJldHVybiBhbiBTREsgdGhhdCBjYW4gYmUgdXNlZCBmb3IgYWRkaXRpb25hbFxuICAgKiAocmVhZG9ubHkpIGV4cGxvcmF0b3J5IGNhbGxzLlxuICAgKlxuICAgKiBUeXBpY2FsbHksIHRoaXMgc2hvdWxkIGJlIGFuIFNESyB0aGF0IGlzIHByaW1lZCB3aXRoIHRoZSBcImxvb2t1cFwiIHJvbGUsIG9yIHNpbWlsYXIuXG4gICAqXG4gICAqIFRoaXMgaXMgbmVjZXNzYXJ5IGJlY2F1c2UgdGhlIFwiZGVwbG95XCIgcm9sZSB3aWxsIG5vdCB0eXBpY2FsbHkgaGF2ZSBwZXJtaXNzaW9ucyB0b1xuICAgKiBkbyB2ZXJ5IG11Y2guXG4gICAqXG4gICAqIFJlZ2FyZGxlc3MsIGlmIGxvb2t1cHMgb2YgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBmYWlsLCB0aGV5IGFyZSBlbWl0dGVkIGF0IGRlYnVnXG4gICAqIGxldmVsIGFuZCB0aGVpciBpbmZvcm1hdGlvbiBpcyBzaW1wbHkgbm90IGFkZGVkIHRvIHRoZSBvdXRwdXQuXG4gICAqL1xuICByZWFkb25seSBhZGRpdGlvbmFsRXhwbG9yYXRpb25TZGtQcm92aWRlcj86IFNka1Byb3ZpZGVyO1xufVxuXG5leHBvcnQgdHlwZSBTZGtQcm92aWRlciA9ICgpID0+IFByb21pc2U8U0RLPjtcblxuLyoqXG4gKiBEaWFnbm9zZSBhIHN0YWNrJ3MgZmFpbGVkIHN0YXRlXG4gKlxuICogLSBGaXJzdCwgZGV0ZXJtaW5lIHRoZSBzdGFjaydzIHN0YXRlLlxuICogLSBJZiBpdCBpcyBpbiBhIGZhaWxlZCBzdGF0ZSwgd2Ugc3RhcnRlZCBhIGRlcGxveW1lbnQgdGhhdCBmYWlsZWQuIERlc2NyaWJlIHRoZSBzdGFja1xuICogICBldmVudHMsIGFuZCB0cnkgdG8gZGV0ZXJtaW5lIHRoZSByb290IGNhdXNlIGZyb20gdGhhdC5cbiAqIC0gSWYgaXQgaXMgaW4gYSBub3JtYWwgc3RhdGUsIHNlZSBpZiB0aGVyZSBhcmUgYW55IGZhaWxlZCBjaGFuZ2Ugc2V0cy4gRWl0aGVyXG4gKiAgIGdldCB0aGUgZmFpbHVyZSBtZXNzYWdlIGZyb20gdGhlIGNoYW5nZSBzZXQsIG9yIGdldCB0aGUgZmFpbHVyZSBldmVudHMgZnJvbVxuICogICB0aGUgY2hhbmdlIHNldCAoZWFybHkgdmFsaWRhdGlvbikuXG4gKlxuICogVGhpcyBjbGFzcyB3b3JrcyBhdCB0aGUgQ2xvdWRGb3JtYXRpb24gbGV2ZWwsIGFuZCBkb2VzIG5vdCBkZWFsIHdpdGggdHJhY2luZ1xuICogQ2xvdWRGb3JtYXRpb24gZXJyb3JzIHRvIGNvbnN0cnVjdCBjb2RlIHNvdXJjZXMgeWV0LlxuICovXG4vKipcbiAqIE9wdGlvbnMgdGhhdCBhZmZlY3QgaG93IGEgZGlhZ25vc2lzIGlzIHBlcmZvcm1lZC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEaWFnbm9zZU9wdGlvbnMge1xuICAvKipcbiAgICogV2hldGhlciBDbG91ZEZvcm1hdGlvbiByb2xsYmFjayBpcyBlbmFibGVkIGZvciB0aGlzIGRlcGxveW1lbnQuXG4gICAqXG4gICAqIFdoZW4gcm9sbGJhY2sgaXMgZW5hYmxlZCwgZmFpbGVkIHJlc291cmNlcyBhcmUgdG9ybiBkb3duIGJlZm9yZSB3ZSBjYW5cbiAgICogaW5zcGVjdCB0aGVpciBydW50aW1lIHN0YXRlIChlLmcuIEVDUyB0YXNrcyksIHNvIHRoZSBpbnZlc3RpZ2F0aW9uIGRlZ3JhZGVzXG4gICAqIHRvIGR1cmFibGUgc291cmNlcyBhbmQgbWF5IHN1Z2dlc3QgcmUtcnVubmluZyB3aXRoIGAtLW5vLXJvbGxiYWNrYC5cbiAgICpcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgcmVhZG9ubHkgcm9sbGJhY2tFbmFibGVkPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGNsYXNzIENsb3VkRm9ybWF0aW9uU3RhY2tEaWFnbm9zZXIge1xuICBwcml2YXRlIHJlYWRvbmx5IGNmbjogSUNsb3VkRm9ybWF0aW9uQ2xpZW50O1xuICBwcml2YXRlIHBhcmVudFN0YWNrTG9naWNhbElkczogc3RyaW5nW107XG4gIHByaXZhdGUgX2FkZGl0aW9uYWxFeHBsb3JhdGlvblNka1Byb21pc2U/OiBQcm9taXNlPFNESyB8IHVuZGVmaW5lZD47XG4gIHByaXZhdGUgcm9sbGJhY2tFbmFibGVkID0gdHJ1ZTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IHByb3BzOiBDbG91ZEZvcm1hdGlvblN0YWNrRGlhZ25vc2VyUHJvcHMpIHtcbiAgICB0aGlzLmNmbiA9IHRoaXMucHJvcHMuc2RrLmNsb3VkRm9ybWF0aW9uKCk7XG4gICAgdGhpcy5wYXJlbnRTdGFja0xvZ2ljYWxJZHMgPSBbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEaWFnbm9zZSBhIHN0YWNrJ3Mgcm9vdCBjYXVzZSBnaXZlbiBubyBwcmUtZXhpc3Rpbmcgc3RhdGVcbiAgICovXG4gIHB1YmxpYyBhc3luYyBkaWFnbm9zZUZyb21GcmVzaChzdGFja05hbWU6IHN0cmluZyk6IFByb21pc2U8U3RhY2tEaWFnbm9zaXM+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmNmbi5kZXNjcmliZVN0YWNrcyh7IFN0YWNrTmFtZTogc3RhY2tOYW1lIH0pO1xuICAgICAgY29uc3Qgc3RhY2sgPSByZXNwb25zZS5TdGFja3M/LlswXTtcbiAgICAgIGlmICghc3RhY2spIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB0eXBlOiAnZXJyb3ItZGlhZ25vc2luZycsXG4gICAgICAgICAgbWVzc2FnZTogYFN0YWNrIHdpdGggbmFtZSAke3N0YWNrTmFtZX0gbm90IGZvdW5kYCxcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc3RhdHVzID0gU3RhY2tTdGF0dXMuZnJvbVN0YWNrRGVzY3JpcHRpb24oc3RhY2spO1xuICAgICAgaWYgKHN0YXR1cy5pc0luUHJvZ3Jlc3MpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB0eXBlOiAnZXJyb3ItZGlhZ25vc2luZycsXG4gICAgICAgICAgbWVzc2FnZTogYFN0YWNrIHdpdGggbmFtZSAke3N0YWNrTmFtZX0gaXMgY3VycmVudGx5IGJlaW5nIHVwZGF0ZWQgKCR7c3RhdHVzLm5hbWV9KS4gVHJ5IGFnYWluIHdoZW4gaXQncyBmaW5pc2hlZC5gLFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBpZiAoc3RhdHVzLmlzRmFpbHVyZSB8fCBzdGF0dXMuaXNSb2xsYmFja1N1Y2Nlc3MpIHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuX2RpYWdub3NlVmlhU3RhY2tFdmVudHMoc3RhY2spO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5fZGlhZ25vc2VDaGFuZ2VTZXRGYWlsdXJlRnJvbVN0YWNrTmFtZShzdGFjayk7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICByZXR1cm4geyB0eXBlOiAnZXJyb3ItZGlhZ25vc2luZycsIG1lc3NhZ2U6IGUubWVzc2FnZSB9O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEaWFnbm9zZSBwb3RlbnRpYWwgcHJvYmxlbXMgd2l0aCB0aGUgY2hhbmdlIHNldFxuICAgKi9cbiAgcHVibGljIGFzeW5jIGRpYWdub3NlQ2hhbmdlU2V0KGNoYW5nZVNldDogQ2hhbmdlU2V0U3VtbWFyeSk6IFByb21pc2U8U3RhY2tEaWFnbm9zaXM+IHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuX2RpYWdub3NlQ2hhbmdlU2V0RmFpbHVyZShjaGFuZ2VTZXQpO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgcmV0dXJuIHsgdHlwZTogJ2Vycm9yLWRpYWdub3NpbmcnLCBtZXNzYWdlOiBlLm1lc3NhZ2UgfTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRGlhZ25vc2UgcG90ZW50aWFsIHByb2JsZW1zIHdpdGggdGhlIGNoYW5nZSBzZXRcbiAgICovXG4gIHB1YmxpYyBhc3luYyBkaWFnbm9zZUZyb21FcnJvckNvbGxlY3Rpb24oXG4gICAgZXJyb3JzOiBSZXNvdXJjZUVycm9ycyxcbiAgICBzdGFjazogU3RhY2ssXG4gICAgYWxsb3dGYWxsYmFjayA9IHRydWUsXG4gICAgb3B0aW9uczogRGlhZ25vc2VPcHRpb25zID0ge30sXG4gICk6IFByb21pc2U8U3RhY2tEaWFnbm9zaXM+IHtcbiAgICB0aGlzLnJvbGxiYWNrRW5hYmxlZCA9IG9wdGlvbnMucm9sbGJhY2tFbmFibGVkID8/IHRydWU7XG4gICAgaWYgKGVycm9ycy5pc0VtcHR5KCkpIHtcbiAgICAgIGlmIChhbGxvd0ZhbGxiYWNrKSB7XG4gICAgICAgIC8vIFRoZSBtb25pdG9yIG1heSBub3QgaGF2ZSBzZWVuIGZhaWx1cmUgZXZlbnRzIHlldCAocmFjZSBjb25kaXRpb24pLlxuICAgICAgICAvLyBGYWxsIGJhY2sgdG8gcG9sbGluZyBzdGFjayBldmVudHMgZGlyZWN0bHkuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuX2RpYWdub3NlVmlhU3RhY2tFdmVudHMoc3RhY2spO1xuICAgICAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLnByb3BzLmlvSGVscGVyLmRlZmF1bHRzLmRlYnVnKGBGYWxsYmFjayBkaWFnbm9zaXMgZmFpbGVkOiAke2UubWVzc2FnZX1gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHsgdHlwZTogJ25vLXByb2JsZW0nIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6ICdwcm9ibGVtJyxcbiAgICAgIGRldGVjdGVkQnk6IHtcbiAgICAgICAgdHlwZTogJ2RlcGxveW1lbnQnLFxuICAgICAgICBzdGFja1N0YXR1czogc3RhY2suU3RhY2tTdGF0dXMgPz8gJycsXG4gICAgICAgIHN0YXR1c1JlYXNvbjogc3RhY2suU3RhY2tTdGF0dXNSZWFzb24gPz8gJycsXG4gICAgICB9LFxuICAgICAgcHJvYmxlbXM6IGF3YWl0IHRoaXMuZW5oYW5jZUVycm9ycyhlcnJvcnMuYWxsKSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIERpYWdub3NlIGEgZGVwbG95bWVudCBmYWlsdXJlIHZpYSBzdGFjayBldmVudHNcbiAgICpcbiAgICogVGhpcyBpcyB0aGUgc2FtZSBsb2dpYyB0aGF0IHRoZSBkZXBsb3ltZW50IG1vbml0b3IgdXNlcy5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgX2RpYWdub3NlVmlhU3RhY2tFdmVudHMoc3RhY2s6IFN0YWNrKTogUHJvbWlzZTxTdGFja0RpYWdub3Npcz4ge1xuICAgIGNvbnN0IHBvbGxlciA9IG5ldyBTdGFja0V2ZW50UG9sbGVyKHRoaXMuY2ZuLCB7XG4gICAgICBzdGFja0Fybjogc3RhY2suU3RhY2tJZCEsXG4gICAgICBpbml0aWFsUG9sbFJhbmdlOiBQb2xsUmFuZ2UubW9zdFJlY2VudE9wZXJhdGlvbigpLFxuICAgIH0pO1xuXG4gICAgLy8gV2UgZG9uJ3QgbmVlZCB0aGUgcmVzdWx0aW5nIGV2ZW50cyBvZiBwb2xsaW5nLiBQb2xsaW5nIHdpbGwgYXV0b21hdGljYWxseSB1cGRhdGUgdGhlIGVycm9yIGNvbGxlY3Rpb24sXG4gICAgLy8gd2hpY2ggaXMgdGhlIHRoaW5nIHdlIGNhcmUgYWJvdXQuXG4gICAgYXdhaXQgcG9sbGVyLnBvbGwoKTtcblxuICAgIHJldHVybiB0aGlzLmRpYWdub3NlRnJvbUVycm9yQ29sbGVjdGlvbihwb2xsZXIuZXJyb3JzLCBzdGFjaywgZmFsc2UsIHsgcm9sbGJhY2tFbmFibGVkOiB0aGlzLnJvbGxiYWNrRW5hYmxlZCB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgX2RpYWdub3NlQ2hhbmdlU2V0RmFpbHVyZUZyb21TdGFja05hbWUoc3RhY2s6IFN0YWNrKTogUHJvbWlzZTxTdGFja0RpYWdub3Npcz4ge1xuICAgIGNvbnN0IGNzID0gKGF3YWl0IHRoaXMuY2ZuLmxpc3RDaGFuZ2VTZXRzKHtcbiAgICAgIFN0YWNrTmFtZTogc3RhY2suU3RhY2tJZCEsXG4gICAgfSkpLlN1bW1hcmllcyA/PyBbXTtcblxuICAgIGNvbnN0IHBlbmRpbmcgPSBjcy5maWx0ZXIoeCA9PiB4LlN0YXR1cyA9PT0gQ2hhbmdlU2V0U3RhdHVzLkNSRUFURV9JTl9QUk9HUkVTUyB8fCB4LlN0YXR1cyA9PT0gQ2hhbmdlU2V0U3RhdHVzLkNSRUFURV9QRU5ESU5HKTtcbiAgICBpZiAocGVuZGluZy5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiAnZXJyb3ItZGlhZ25vc2luZycsXG4gICAgICAgIG1lc3NhZ2U6IGBTdGFjayB3aXRoIG5hbWUgJHtzdGFjay5TdGFja05hbWV9IGhhcyBjaGFuZ2Ugc2V0cyBjdXJyZW50bHkgYmVpbmcgY3JlYXRlZCAoJHtwZW5kaW5nWzBdLkNoYW5nZVNldE5hbWV9KS4gVHJ5IGFnYWluIHdoZW4gaXQncyBmaW5pc2hlZC5gLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBjb25zdCBmYWlsZWQgPSBjcy5maWx0ZXIoeCA9PiB4LlN0YXR1cyA9PT0gQ2hhbmdlU2V0U3RhdHVzLkZBSUxFRCk7XG4gICAgaWYgKGZhaWxlZC5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB7IHR5cGU6ICduby1wcm9ibGVtJyB9O1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9kaWFnbm9zZUNoYW5nZVNldEZhaWx1cmUoZmFpbGVkWzBdKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUcnkgdG8gZGlhZ25vc2UgdGhlIHJlYXNvbiB0aGF0IGNhdXNlZCBhIGNoYW5nZXNldCB0byBmYWlsIHRvIGNyZWF0ZVxuICAgKlxuICAgKiBUaGVyZSBhcmUgYSBjb3VwbGUgb2YgZGlmZmVyZW50IHJlYXNvbnMgdGhpcyBjYW4gaGFwcGVuLCBhbmQgd2UgZ28gdGhyb3VnaCBlYWNoIG9mIHRoZW0gaW4gb3JkZXIuXG4gICAqXG4gICAqIFVzdWFsbHkgdGhpcyBzdGFydHMgZnJvbSB0cnlpbmcgdG8gZGV0ZWN0IGFuIGVycm9yIG1lc3NhZ2UgcGF0dGVybiBpbiB0aGUgY2hhbmdlIHNldCBzdGF0dXMgcmVhc29uLFxuICAgKiBhbmQgdGhlbiBwb3RlbnRpYWxseSBnb2luZyB0byBmZXRjaCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHVzaW5nIGFkZGl0aW9uYWwgQVBJIGNhbGxzLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBfZGlhZ25vc2VDaGFuZ2VTZXRGYWlsdXJlKGNoYW5nZVNldDogQ2hhbmdlU2V0U3VtbWFyeSk6IFByb21pc2U8U3RhY2tEaWFnbm9zaXM+IHtcbiAgICBpZiAoY2hhbmdlU2V0LlN0YXR1cyAhPT0gQ2hhbmdlU2V0U3RhdHVzLkZBSUxFRCkge1xuICAgICAgcmV0dXJuIHsgdHlwZTogJ25vLXByb2JsZW0nIH07XG4gICAgfVxuXG4gICAgaWYgKGNoYW5nZVNldEhhc05vQ2hhbmdlcyhjaGFuZ2VTZXQpKSB7XG4gICAgICAvLyBUaGlzIHdpbGwgbGVhZCB0byBhIGNoYW5nZSBzZXQgdGhhdCBpcyBGQUlMRUQgYnV0IGl0J3Mgbm90IGFjdHVhbGx5IGEgcHJvYmxlbVxuICAgICAgcmV0dXJuIHsgdHlwZTogJ25vLXByb2JsZW0nIH07XG4gICAgfVxuXG4gICAgLy8gV2UgcmVwb3J0IGVhcmx5IHZhbGlkYXRpb24gZXJyb3JzIGRpZmZlcmVudGx5IHRoYW4gZ2VuZXJpYyBjaGFuZ2VzZXQgZXJyb3JzLiBNb3N0bHlcbiAgICAvLyBmb3IgaGlzdG9yaWNhbCByZWFzb25zLlxuICAgIGNvbnN0IGlzRWFybHlWYWxpZGF0aW9uRXJyb3IgPSBjaGFuZ2VTZXQuU3RhdHVzUmVhc29uPy5pbmNsdWRlcygnQVdTOjpFYXJseVZhbGlkYXRpb24nKTtcbiAgICBpZiAoaXNFYXJseVZhbGlkYXRpb25FcnJvcikge1xuICAgICAgcmV0dXJuIHRoaXMuX3JlcG9ydENoYW5nZVNldEZhaWx1cmVGcm9tRXZlbnRzKGNoYW5nZVNldCwge1xuICAgICAgICB0eXBlOiAnZWFybHktdmFsaWRhdGlvbicsXG4gICAgICAgIGNoYW5nZVNldE5hbWU6IGNoYW5nZVNldC5DaGFuZ2VTZXROYW1lID8/ICcnLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gV2Ugd2lsbCByZWN1cnNlIGludG8gbmVzdGVkIGNoYW5nZSBzZXRzIGlmIG5lY2Vzc2FyeS5cbiAgICBpZiAoY2hhbmdlU2V0LlN0YXR1c1JlYXNvbj8uaW5jbHVkZXMoJ05lc3RlZCBjaGFuZ2Ugc2V0JykpIHtcbiAgICAgIHJldHVybiB0aGlzLl9kaWFnbm9zZU5lc3RlZENoYW5nZVNldEZhaWx1cmUoY2hhbmdlU2V0KTtcbiAgICB9XG5cbiAgICAvLyBXZSBzcGVjaWFsLWNhc2UgZmFpbGVkIGF1dG9tYXRpYyBpbXBvcnRzLiBXZSBrbm93IGFsbCB0aGUgbWVhdCBvZiB0aGUgZXJyb3IgZGV0YWlscyBhcmUgaW4gdGhlXG4gICAgLy8gc3RhdHVzIHJlYXNvbiwgYW5kIG5vd2hlcmUgZWxzZS4gV2UgcGFyc2UgaXQgc3BlY2lmaWNhbGx5LlxuICAgIGNvbnN0IGZhaWxlZEF1dG9FcnJvcnMgPSB0aGlzLl90cnlEZXRlY3RGYWlsZWRBdXRvSW1wb3J0KGNoYW5nZVNldCk7XG4gICAgaWYgKGZhaWxlZEF1dG9FcnJvcnMpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6ICdwcm9ibGVtJyxcbiAgICAgICAgZGV0ZWN0ZWRCeToge1xuICAgICAgICAgIHR5cGU6ICdjaGFuZ2Utc2V0JyxcbiAgICAgICAgICBjaGFuZ2VTZXRTdGF0dXM6IGNoYW5nZVNldC5TdGF0dXMgPz8gJycsXG4gICAgICAgICAgY2hhbmdlU2V0TmFtZTogY2hhbmdlU2V0LkNoYW5nZVNldE5hbWUgPz8gJycsXG4gICAgICAgICAgc3RhdHVzUmVhc29uOiBjaGFuZ2VTZXQuU3RhdHVzUmVhc29uID8/ICcnLFxuICAgICAgICB9LFxuICAgICAgICBwcm9ibGVtczogYXdhaXQgdGhpcy5lbmhhbmNlRXJyb3JzKGZhaWxlZEF1dG9FcnJvcnMpLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBPdGhlcndpc2UsIGEgZ2VuZXJpYyBjaGFuZ2Ugc2V0IGNyZWF0aW9uIGVycm9yIHdoZXJlIGBEZXNjcmliZUV2ZW50c2BcbiAgICAvLyBtaWdodCBvciBtaWdodCBub3QgZ2l2ZSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uLlxuICAgIHJldHVybiB0aGlzLl9yZXBvcnRDaGFuZ2VTZXRGYWlsdXJlRnJvbUV2ZW50cyhjaGFuZ2VTZXQsIHtcbiAgICAgIHR5cGU6ICdjaGFuZ2Utc2V0JyxcbiAgICAgIGNoYW5nZVNldFN0YXR1czogY2hhbmdlU2V0LlN0YXR1cyA/PyAnJyxcbiAgICAgIGNoYW5nZVNldE5hbWU6IGNoYW5nZVNldC5DaGFuZ2VTZXROYW1lID8/ICcnLFxuICAgICAgc3RhdHVzUmVhc29uOiBjaGFuZ2VTZXQuU3RhdHVzUmVhc29uID8/ICcnLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFRyeSB0byByZWFkIHRoZSByZXNvdXJjZS1zcGVjaWZpYyByZWFzb25zIGZvciBhIGNoYW5nZXNldCBmYWlsdXJlIGZyb20gYERlc2NyaWJlRXZlbnRzYC5cbiAgICpcbiAgICogSWYgd2UgY291bGRuJ3QgcmVhZCB0aGUgZXZlbnRzIG9yIHRoZXJlIGFyZSAwIGVycm9ycyByZXR1cm5lZCBieSB0aGF0IEFQSSwgcmV0dXJuIGEgZ2VuZXJpY1xuICAgKiBlcnJvci5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgX3JlcG9ydENoYW5nZVNldEZhaWx1cmVGcm9tRXZlbnRzKGNoYW5nZVNldDogQ2hhbmdlU2V0U3VtbWFyeSwgZGV0ZWN0ZWRCeTogU3RhY2tQcm9ibGVtU291cmNlKTogUHJvbWlzZTxTdGFja0RpYWdub3Npcz4ge1xuICAgIGNvbnN0IGV2ID0gYXdhaXQgbmV3IENoYW5nZVNldFJlc291cmNlRXJyb3JGZXRjaGVyKHRoaXMucHJvcHMuc2RrLCB0aGlzLnByb3BzLmVudlJlc291cmNlcylcbiAgICAgIC5mZXRjaERldGFpbHNTdHJ1Y3R1cmVkKGNoYW5nZVNldC5DaGFuZ2VTZXROYW1lISwgY2hhbmdlU2V0LlN0YWNrTmFtZSEpO1xuXG4gICAgLy8gSWYgd2UgaGF2ZSBlcnJvcnMgdG8gcmV0dXJuLCByZXR1cm4gdGhlbVxuICAgIGlmIChldi50eXBlID09PSAncmVzb3VyY2UtZXJyb3JzJyAmJiBldi5lcnJvcnMubGVuZ3RoID4gMCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogJ3Byb2JsZW0nLFxuICAgICAgICBkZXRlY3RlZEJ5LFxuICAgICAgICBwcm9ibGVtczogYXdhaXQgdGhpcy5lbmhhbmNlRXJyb3JzKGV2LmVycm9ycy5tYXAoKGUpID0+IHJlc291cmNlRXJyb3JGcm9tRWFybHlWYWxpZGF0aW9uRXJyb3IoY2hhbmdlU2V0LlN0YWNrSWQgPz8gJycsIHRoaXMucGFyZW50U3RhY2tMb2dpY2FsSWRzLCBlKSkpLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBPdGhlcndpc2UsIHdlIHdpbGwgcmV0dXJuIGEgZ2VuZXJpYyBjaGFuZ2VzZXQgZXJyb3IgbWVzc2FnZS4gSWYgdGhlcmUgd2FzIGEgcHJvYmxlbVxuICAgIC8vIGNoZWNraW5nLCB3ZSBsb2cgdGhhdCBmb3IgZ29vZCBtZWFzdXJlIGJ1dCB0aGUgcmVzdWx0IGlzIHRoZSBzYW1lLlxuICAgIGlmIChldi50eXBlID09PSAnY291bGQtbm90LWNoZWNrJykge1xuICAgICAgYXdhaXQgdGhpcy5wcm9wcy5pb0hlbHBlci5kZWZhdWx0cy53YXJuKGV2Lm1lc3NhZ2UpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9ub25TcGVjaWZpY0NoYW5nZVNldEVycm9yKGNoYW5nZVNldCwgZGV0ZWN0ZWRCeSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGVuaGFuY2VFcnJvcnMoZXJyczogcmVhZG9ubHkgUmVzb3VyY2VFcnJvcltdKTogUHJvbWlzZTxUcmFjZWRSZXNvdXJjZUVycm9yW10+IHtcbiAgICAvLyBXZSdyZSBub3QgYWN0dWFsbHkgbGltaXRpbmcgdGhpcyBoZXJlLiBCdXQgd2UgYXJlIG1ha2luZyB0aGUgYXNzdW1wdGlvbiB0aGF0IHRoZSBhbW91bnQgb2YgcmVzb3VyY2VzXG4gICAgLy8gdGhhdCB3aWxsIGhhdmUgZXJyb3JzIGFyZSBhbHdheXMgcHJldHR5IGxvdyBpbiBudW1iZXIuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBjZGtsYWJzL3Byb21pc2VhbGwtbm8tdW5ib3VuZGVkLXBhcmFsbGVsaXNtXG4gICAgcmV0dXJuIFByb21pc2UuYWxsKGVycnMubWFwKChlKSA9PiB0aGlzLmVuaGFuY2VFcnJvcihlKSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBlbmhhbmNlRXJyb3IoZXJyOiBSZXNvdXJjZUVycm9yKTogUHJvbWlzZTxUcmFjZWRSZXNvdXJjZUVycm9yPiB7XG4gICAgY29uc3Qgc291cmNlVHJhY2VQcm9taXNlID0gZXJyLmxvZ2ljYWxJZFxuICAgICAgPyB0aGlzLnByb3BzLnNvdXJjZVRyYWNlci50cmFjZVJlc291cmNlKGVyci5zdGFja0FybiwgZXJyLnBhcmVudFN0YWNrTG9naWNhbElkcywgZXJyLmxvZ2ljYWxJZClcbiAgICAgIDogdGhpcy5wcm9wcy5zb3VyY2VUcmFjZXIudHJhY2VTdGFjayhlcnIuc3RhY2tBcm4sIGVyci5wYXJlbnRTdGFja0xvZ2ljYWxJZHMpO1xuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBjZGtsYWJzL3Byb21pc2VhbGwtbm8tdW5ib3VuZGVkLXBhcmFsbGVsaXNtXG4gICAgY29uc3QgW3NvdXJjZVRyYWNlLCBhZGRpdGlvbmFsQ29udGV4dF0gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICBzb3VyY2VUcmFjZVByb21pc2UsXG4gICAgICB0aGlzLmludmVzdGlnYXRlUmVzb3VyY2VCZXN0RWZmb3J0KGVyciksXG4gICAgXSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4uZXJyLFxuICAgICAgc291cmNlVHJhY2UsXG4gICAgICB0b3BMZXZlbFN0YWNrSGllcmFyY2hpY2FsSWQ6IHRoaXMucHJvcHMudG9wTGV2ZWxTdGFja0hpZXJhcmNoaWNhbElkLFxuICAgICAgLi4uKGFkZGl0aW9uYWxDb250ZXh0Lmxlbmd0aCA+IDAgPyB7IGFkZGl0aW9uYWxDb250ZXh0IH0gOiB7fSksXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgaW52ZXN0aWdhdGVSZXNvdXJjZUJlc3RFZmZvcnQoZXJyOiBSZXNvdXJjZUVycm9yKSB7XG4gICAgY29uc3Qgc2RrID0gYXdhaXQgdGhpcy5hZGRpdGlvbmFsRXhwbG9yYXRpb25TZGsoKTtcbiAgICBpZiAoIXNkaykge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IGludmVzdGlnYXRlUmVzb3VyY2UoZXJyLCBzZGssIChtc2cpID0+IHRoaXMucHJvcHMuaW9IZWxwZXIuZGVmYXVsdHMuZGVidWcobXNnKSwge1xuICAgICAgICByb2xsYmFja0VuYWJsZWQ6IHRoaXMucm9sbGJhY2tFbmFibGVkLFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICBhd2FpdCB0aGlzLnByb3BzLmlvSGVscGVyLmRlZmF1bHRzLmRlYnVnKGBSZXNvdXJjZSBpbnZlc3RpZ2F0aW9uIGZhaWxlZDogJHtlLm1lc3NhZ2V9YCk7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIGEgZ2VuZXJpYyBzdGFjayBlcnJvciBmcm9tIHRoZSBnaXZlbiBjaGFuZ2Ugc2V0IGluZm9ybWF0aW9uXG4gICAqXG4gICAqIFdlIGNhbid0IHBvaW50IHRvIGEgc3BlY2lmaWMgcmVzb3VyY2UuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIF9ub25TcGVjaWZpY0NoYW5nZVNldEVycm9yKGNoYW5nZVNldDogQ2hhbmdlU2V0U3VtbWFyeSwgZGV0ZWN0ZWRCeTogU3RhY2tQcm9ibGVtU291cmNlKTogUHJvbWlzZTxTdGFja0RpYWdub3Npcz4ge1xuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiAncHJvYmxlbScsXG4gICAgICBkZXRlY3RlZEJ5LFxuICAgICAgcHJvYmxlbXM6IFtcbiAgICAgICAgYXdhaXQgdGhpcy5lbmhhbmNlRXJyb3Ioe1xuICAgICAgICAgIC8vIEl0J3MgYWJvdXQgYSBzdGFja1xuICAgICAgICAgIGxvZ2ljYWxJZDogdW5kZWZpbmVkLFxuICAgICAgICAgIG1lc3NhZ2U6IGNoYW5nZVNldC5TdGF0dXNSZWFzb24gPz8gJycsXG4gICAgICAgICAgcGFyZW50U3RhY2tMb2dpY2FsSWRzOiB0aGlzLnBhcmVudFN0YWNrTG9naWNhbElkcyxcbiAgICAgICAgICBzdGFja0FybjogY2hhbmdlU2V0LlN0YWNrSWQgPz8gJycsXG4gICAgICAgICAgcGh5c2ljYWxJZDogY2hhbmdlU2V0LlN0YWNrSWQsXG4gICAgICAgICAgcmVzb3VyY2VUeXBlOiAnQVdTOjpDbG91ZEZvcm1hdGlvbjo6U3RhY2snLFxuICAgICAgICB9KSxcbiAgICAgIF0sXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb29rIGZvciBuZXN0ZWQgY2hhbmdlIHNldHMgdGhhdCBoYXZlIGZhaWxlZCwgYW5kIGRpYWdub3NlIHRob3NlLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBfZGlhZ25vc2VOZXN0ZWRDaGFuZ2VTZXRGYWlsdXJlKGNoYW5nZVNldDogQ2hhbmdlU2V0U3VtbWFyeSk6IFByb21pc2U8U3RhY2tEaWFnbm9zaXM+IHtcbiAgICBjb25zdCBuZXN0ZWQgPSBhd2FpdCB0aGlzLl9maW5kRmFpbGVkTmVzdGVkU3RhY2soY2hhbmdlU2V0KTtcbiAgICBpZiAoIW5lc3RlZCkge1xuICAgICAgLy8gVGhhdCdzIHdlaXJkLiBMZXQncyByZXR1cm4gdGhlIGNoYW5nZSBzZXQncyBzdGF0dXMgcmVhc29uIGFzIGEgbm9uLXNwZWNpZmljIGVycm9yXG4gICAgICByZXR1cm4gdGhpcy5fbm9uU3BlY2lmaWNDaGFuZ2VTZXRFcnJvcihjaGFuZ2VTZXQsIHtcbiAgICAgICAgdHlwZTogJ2NoYW5nZS1zZXQnLFxuICAgICAgICBjaGFuZ2VTZXROYW1lOiBjaGFuZ2VTZXQuQ2hhbmdlU2V0TmFtZSA/PyAnJyxcbiAgICAgICAgY2hhbmdlU2V0U3RhdHVzOiBjaGFuZ2VTZXQuU3RhdHVzID8/ICcnLFxuICAgICAgICBzdGF0dXNSZWFzb246IGNoYW5nZVNldC5TdGF0dXNSZWFzb24gPz8gJycsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCBuZXN0ZWRDcyA9IGF3YWl0IHRoaXMuY2ZuLmRlc2NyaWJlQ2hhbmdlU2V0KHtcbiAgICAgIENoYW5nZVNldE5hbWU6IG5lc3RlZC5jaGFuZ2VTZXRBcm4sXG4gICAgICBTdGFja05hbWU6IG5lc3RlZC5zdGFja0FybixcbiAgICB9KTtcblxuICAgIGNvbnN0IG5lc3RlZERpYWcgPSBuZXcgQ2xvdWRGb3JtYXRpb25TdGFja0RpYWdub3Nlcih0aGlzLnByb3BzKTtcbiAgICBuZXN0ZWREaWFnLnBhcmVudFN0YWNrTG9naWNhbElkcyA9IFsuLi50aGlzLnBhcmVudFN0YWNrTG9naWNhbElkcywgbmVzdGVkLmxvZ2ljYWxJZF07XG4gICAgcmV0dXJuIG5lc3RlZERpYWcuX2RpYWdub3NlQ2hhbmdlU2V0RmFpbHVyZShuZXN0ZWRDcyk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIF9maW5kRmFpbGVkTmVzdGVkU3RhY2soY2hhbmdlU2V0OiBDaGFuZ2VTZXRTdW1tYXJ5KTogUHJvbWlzZTx7XG4gICAgc3RhY2tBcm46IHN0cmluZztcbiAgICBjaGFuZ2VTZXRBcm46IHN0cmluZztcbiAgICBsb2dpY2FsSWQ6IHN0cmluZztcbiAgfSB8IHVuZGVmaW5lZD4ge1xuICAgIC8vIFRoZSBzdGF0dXMgcmVhc29uIG9ubHkgaW5jbHVkZXMgdGhlIGNoYW5nZSBzZXQgSUQsIGJ1dCB3ZSBhbHNvIG5lZWQgdGhlIHN0YWNrIG5hbWUuIFRoZSB3YXkgdG8gZ2V0IHRoaXMgaXNcbiAgICAvLyBkZXNjcmliZSB0aGUgY3VycmVudCBjaGFuZ2Ugc2V0LCB0aGVuIGZyb20gdGhlIENoYW5nZXMgZmluZCB0aGUgc3RhY2sgd2hvc2UgQ2hhbmdlU2V0SWQgaXMgbWVudGlvbmVkIGluIHRoZVxuICAgIC8vIHN0YXR1cyByZWFzb24sIHRoZW4gbG9vayB1cCB0aGF0IGNoYW5nZSBzZXQgYW5kIHJlY3Vyc2UgaW50byBhIHJlZ3VsYXIgY2hhbmdlIHNldCBkaWFnbm9zaXMuXG4gICAgbGV0IG5leHRUb2tlbiA9IHVuZGVmaW5lZDtcbiAgICBkbyB7XG4gICAgICAvLyBDaGFuZ2VzIGluIHRoaXMgcmVzcG9uc2UgbWlnaHQgYmUgcGFnaW5hdGVkXG4gICAgICBjb25zdCByZXNwID0gYXdhaXQgdGhpcy5jZm4uZGVzY3JpYmVDaGFuZ2VTZXQoe1xuICAgICAgICBTdGFja05hbWU6IGNoYW5nZVNldC5TdGFja0lkLFxuICAgICAgICBDaGFuZ2VTZXROYW1lOiBjaGFuZ2VTZXQuQ2hhbmdlU2V0SWQsXG4gICAgICAgIC4uLm5leHRUb2tlbiA/IHsgTmV4dFRva2VuOiBuZXh0VG9rZW4gfSA6IHt9LFxuICAgICAgfSk7XG5cbiAgICAgIGZvciAoY29uc3QgY2hhbmdlIG9mIHJlc3AuQ2hhbmdlcyA/PyBbXSkge1xuICAgICAgICBpZiAoY2hhbmdlLlR5cGUgPT09IENoYW5nZVR5cGUuUmVzb3VyY2UgJiYgY2hhbmdlLlJlc291cmNlQ2hhbmdlPy5SZXNvdXJjZVR5cGUgPT09ICdBV1M6OkNsb3VkRm9ybWF0aW9uOjpTdGFjaycgJiYgY2hhbmdlLlJlc291cmNlQ2hhbmdlPy5DaGFuZ2VTZXRJZCAmJiBjaGFuZ2VTZXQuU3RhdHVzUmVhc29uPy5pbmNsdWRlcyhjaGFuZ2UuUmVzb3VyY2VDaGFuZ2U/LkNoYW5nZVNldElkKSkge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjaGFuZ2VTZXRBcm46IGNoYW5nZS5SZXNvdXJjZUNoYW5nZS5DaGFuZ2VTZXRJZCxcbiAgICAgICAgICAgIHN0YWNrQXJuOiBjaGFuZ2UuUmVzb3VyY2VDaGFuZ2UuUGh5c2ljYWxSZXNvdXJjZUlkID8/ICcnLFxuICAgICAgICAgICAgbG9naWNhbElkOiBjaGFuZ2UuUmVzb3VyY2VDaGFuZ2UuTG9naWNhbFJlc291cmNlSWQgPz8gJycsXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBuZXh0VG9rZW4gPSByZXNwLk5leHRUb2tlbjtcbiAgICB9IHdoaWxlIChuZXh0VG9rZW4pO1xuXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUcnkgdG8gcGFyc2UgZmFpbGVkIGF1dG8taW1wb3J0cyBvdXQgZnJvbSBhIGNoYW5nZSBzZXQgc3RhdHVzXG4gICAqXG4gICAqIFRoZSBwYXR0ZXJuIGxvb2tzIGxpa2UgdGhpczpcbiAgICpcbiAgICogYGBgXG4gICAqIENsb3VkRm9ybWF0aW9uIGlzIGF0dGVtcHRpbmcgdG8gaW1wb3J0IHNvbWUgcmVzb3VyY2VzIGJlY2F1c2UgdGhleSBhbHJlYWR5IGV4aXN0IGluIHlvdXIgYWNjb3VudC4gVGhlIHJlc291cmNlcyBtdXN0IGhhdmUgdGhlIERlbGV0aW9uUG9saWN5IGF0dHJpYnV0ZSBzZXQgdG8gJ1JldGFpbicgb3IgJ1JldGFpbkV4Y2VwdE9uQ3JlYXRlJyBpbiB0aGUgdGVtcGxhdGUgZm9yIHN1Y2Nlc3NmdWwgaW1wb3J0LiBUaGUgYWZmZWN0ZWQgcmVzb3VyY2VzIGFyZSBTb21lQnVja2V0RDVCNzA3MDQgKHtCdWNrZXROYW1lPXpvbWFhcmVlbmJ1Y2tldH0pXG4gICAqIGBgYFxuICAgKlxuICAgKiBGb2xsb3dlZCBieVxuICAgKlxuICAgKiBgYGBcbiAgICogTG9naWNhbElEICh7UHJvcD1WYWx1ZSxQcm9wPVZhbHVlfSksIExvZ2ljYWxJRCAoe1Byb3A9VmFsdWV9KSwgLi4uXG4gICAqIGBgYFxuICAgKi9cbiAgcHJpdmF0ZSBfdHJ5RGV0ZWN0RmFpbGVkQXV0b0ltcG9ydChjaGFuZ2VTZXQ6IENoYW5nZVNldFN1bW1hcnkpOiBSZXNvdXJjZUVycm9yW10gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IG1lc3NhZ2UgPSBjaGFuZ2VTZXQuU3RhdHVzUmVhc29uO1xuICAgIC8vIE9ubHkgZW5oYW5jZSB0aGUgc3BlY2lmaWMgQ0ZOIGVycm9yIGFib3V0IGltcG9ydGluZyBleGlzdGluZyByZXNvdXJjZXNcbiAgICBpZiAoIW1lc3NhZ2U/LmluY2x1ZGVzKCdDbG91ZEZvcm1hdGlvbiBpcyBhdHRlbXB0aW5nIHRvIGltcG9ydCBzb21lIHJlc291cmNlcyBiZWNhdXNlIHRoZXkgYWxyZWFkeSBleGlzdCBpbiB5b3VyIGFjY291bnQnKSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBjb25zdCBtYXJrZXIgPSAnVGhlIGFmZmVjdGVkIHJlc291cmNlcyBhcmUgJztcbiAgICBjb25zdCBtYXJrZXJJbmRleCA9IG1lc3NhZ2UuaW5kZXhPZihtYXJrZXIpO1xuICAgIGlmIChtYXJrZXJJbmRleCA9PT0gLTEpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgY29uc3QgcmV0OiBSZXNvdXJjZUVycm9yW10gPSBbXTtcbiAgICBsZXQgcmVtYWluaW5nID0gbWVzc2FnZS5zbGljZShtYXJrZXJJbmRleCArIG1hcmtlci5sZW5ndGgpO1xuICAgIHdoaWxlIChyZW1haW5pbmcpIHtcbiAgICAgIGNvbnN0IGVuZEl4ID0gcmVtYWluaW5nLmluZGV4T2YoJyksICcpO1xuICAgICAgY29uc3QgdGhpc1Jlc291cmNlID0gZW5kSXggPiAtMSA/IHJlbWFpbmluZy5zbGljZSgwLCBlbmRJeCArIDEpIDogcmVtYWluaW5nO1xuICAgICAgcmVtYWluaW5nID0gcmVtYWluaW5nLnNsaWNlKHRoaXNSZXNvdXJjZS5sZW5ndGggKyAyKTtcblxuICAgICAgLy8gdGhpc1Jlc291cmNlID0gXCJMb2dpY2FsSWQgKHtQcm9wPVZhbHVlLCBQcm9wPVZhbHVlfSlcIlxuICAgICAgY29uc3Qgb3BlblBhcmVuID0gdGhpc1Jlc291cmNlLmluZGV4T2YoJygnKTtcbiAgICAgIGNvbnN0IGxvZ2ljYWxJZCA9IG9wZW5QYXJlbiA+IC0xID8gdGhpc1Jlc291cmNlLnNsaWNlKDAsIG9wZW5QYXJlbikudHJpbSgpIDogdW5kZWZpbmVkO1xuXG4gICAgICByZXQucHVzaCh7XG4gICAgICAgIG1lc3NhZ2U6IGBBdXRvbWF0aWMgaW1wb3J0IG9mIGV4aXN0aW5nIHJlc291cmNlICR7dGhpc1Jlc291cmNlfSBuZWVkcyBhIERlbGV0aW9uUG9saWN5IG9mIFxcJ1JldGFpblxcJyBvciBcXCdSZXRhaW5FeGNlcHRPbkNyZWF0ZVxcJy4gU2V0IHRoZSByZW1vdmFsIHBvbGljeSB0byBcXCdSZW1vdmFsUG9saWN5LlJFVEFJTlxcJyBvciBcXCdSZW1vdmFsUG9saWN5LlJFVEFJTl9PTl9VUERBVEVfT1JfREVMRVRFXFwnIChTZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2Nkay92Mi9ndWlkZS9yZXNvdXJjZXMuaHRtbCNyZXNvdXJjZXMtcmVtb3ZhbClgLFxuICAgICAgICBwYXJlbnRTdGFja0xvZ2ljYWxJZHM6IHRoaXMucGFyZW50U3RhY2tMb2dpY2FsSWRzLFxuICAgICAgICBzdGFja0FybjogY2hhbmdlU2V0LlN0YWNrSWQgPz8gJycsXG4gICAgICAgIGVycm9yQ29kZTogJ0F1dG9tYXRpY0ltcG9ydE5lZWRzUmV0YWluJyxcbiAgICAgICAgbG9naWNhbElkLFxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiByZXQ7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHRoZSBhZGRpdGlvbmFsIGV4cGxvcmF0aW9uIFNESywgaWYgYXZhaWxhYmxlLlxuICAgKi9cbiAgcHJpdmF0ZSBhZGRpdGlvbmFsRXhwbG9yYXRpb25TZGsoKTogUHJvbWlzZTxTREsgfCB1bmRlZmluZWQ+IHtcbiAgICBpZiAoIXRoaXMuX2FkZGl0aW9uYWxFeHBsb3JhdGlvblNka1Byb21pc2UpIHtcbiAgICAgIHRoaXMuX2FkZGl0aW9uYWxFeHBsb3JhdGlvblNka1Byb21pc2UgPSAoYXN5bmMgKCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnByb3BzLmFkZGl0aW9uYWxFeHBsb3JhdGlvblNka1Byb3ZpZGVyPy4oKTtcbiAgICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5wcm9wcy5pb0hlbHBlci5kZWZhdWx0cy5kZWJ1ZyhgQWRkaXRpb25hbCBleHBsb3JhdGlvbiBTREsgcHJvdmlkZXIgZmFpbGVkOiAke2UubWVzc2FnZX1gKTtcbiAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICB9KSgpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fYWRkaXRpb25hbEV4cGxvcmF0aW9uU2RrUHJvbWlzZTtcbiAgfVxufVxuXG4vKipcbiAqIFJldHVybiB0cnVlIGlmIHRoZSBnaXZlbiBjaGFuZ2Ugc2V0IGhhcyBubyBjaGFuZ2VzXG4gKlxuICogVGhpcyBtdXN0IGJlIGRldGVybWluZWQgZnJvbSB0aGUgc3RhdHVzLCBub3QgdGhlICdDaGFuZ2VzJyBhcnJheSBvbiB0aGVcbiAqIG9iamVjdDsgdGhlIGxhdHRlciBjYW4gYmUgZW1wdHkgYmVjYXVzZSBubyByZXNvdXJjZXMgd2VyZSBjaGFuZ2VkLCBidXQgaWZcbiAqIHRoZXJlIGFyZSBjaGFuZ2VzIHRvIE91dHB1dHMsIHRoZSBjaGFuZ2Ugc2V0IGNhbiBzdGlsbCBiZSBleGVjdXRlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNoYW5nZVNldEhhc05vQ2hhbmdlcyhkZXNjcmlwdGlvbjogQ2hhbmdlU2V0U3VtbWFyeSkge1xuICBjb25zdCBub0NoYW5nZUVycm9yUHJlZml4ZXMgPSBbXG4gICAgLy8gRXJyb3IgbWVzc2FnZSBmb3IgYSByZWd1bGFyIHRlbXBsYXRlXG4gICAgXCJUaGUgc3VibWl0dGVkIGluZm9ybWF0aW9uIGRpZG4ndCBjb250YWluIGNoYW5nZXMuXCIsXG4gICAgLy8gRXJyb3IgbWVzc2FnZSB3aGVuIGEgVHJhbnNmb3JtIGlzIGludm9sdmVkIChzZWUgIzEwNjUwKVxuICAgICdObyB1cGRhdGVzIGFyZSB0byBiZSBwZXJmb3JtZWQuJyxcbiAgXTtcblxuICByZXR1cm4gKFxuICAgIGRlc2NyaXB0aW9uLlN0YXR1cyA9PT0gJ0ZBSUxFRCcgJiYgbm9DaGFuZ2VFcnJvclByZWZpeGVzLnNvbWUoKHApID0+IChkZXNjcmlwdGlvbi5TdGF0dXNSZWFzb24gPz8gJycpLnN0YXJ0c1dpdGgocCkpXG4gICk7XG59XG5cbmZ1bmN0aW9uIHJlc291cmNlRXJyb3JGcm9tRWFybHlWYWxpZGF0aW9uRXJyb3Ioc3RhY2tJZDogc3RyaW5nLCBwYXJlbnRTdGFja0xvZ2ljYWxJZHM6IHN0cmluZ1tdLCBldjogQ2hhbmdlU2V0UmVzb3VyY2VFcnJvcik6IFJlc291cmNlRXJyb3Ige1xuICByZXR1cm4ge1xuICAgIGxvZ2ljYWxJZDogZXYubG9naWNhbElkLFxuICAgIHBoeXNpY2FsSWQ6IGV2LnBoeXNpY2FsSWQsXG4gICAgcmVzb3VyY2VUeXBlOiBldi5yZXNvdXJjZVR5cGUsXG4gICAgbWVzc2FnZTogYCR7ZXYubWVzc2FnZX0gKGF0ICR7ZXYuZG9jdW1lbnRQYXRofSlgLFxuICAgIGVycm9yQ29kZTogYCR7ZXYudmFsaWRhdGlvbk5hbWV9XyR7ZXYuZXZlbnRUeXBlfWAsXG4gICAgcGFyZW50U3RhY2tMb2dpY2FsSWRzLFxuICAgIHN0YWNrQXJuOiBzdGFja0lkLFxuICB9O1xufVxuIl19
@@ -1,9 +1,12 @@
1
1
  "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
2
5
  Object.defineProperty(exports, "__esModule", { value: true });
3
6
  exports.DiffFormatter = void 0;
4
7
  const node_util_1 = require("node:util");
5
8
  const cloudformation_diff_1 = require("@aws-cdk/cloudformation-diff");
6
- const chalk = require("chalk");
9
+ const chalk_1 = __importDefault(require("chalk"));
7
10
  const payloads_1 = require("../../payloads");
8
11
  const logical_id_map_1 = require("../cloudformation/logical-id-map");
9
12
  const streams_1 = require("../streams");
@@ -87,7 +90,7 @@ class DiffFormatter {
87
90
  try {
88
91
  // must output the stack name if there are differences, even if quiet
89
92
  if (stackName && (!options.quiet || !diff.isEmpty)) {
90
- stream.write((0, node_util_1.format)(`Stack ${chalk.bold(stackName)}\n`));
93
+ stream.write((0, node_util_1.format)(`Stack ${chalk_1.default.bold(stackName)}\n`));
91
94
  }
92
95
  if (!options.quiet && this.isImport) {
93
96
  stream.write('Parameters and rules created during migration do not affect resource configuration.\n');
@@ -118,11 +121,11 @@ class DiffFormatter {
118
121
  }, options.contextLines);
119
122
  }
120
123
  else if (!options.quiet) {
121
- const hint = metadataWasFiltered ? chalk.grey(' (CDK metadata changes were hidden, run cdk diff --strict to show)') : '';
122
- stream.write(`${chalk.green('There were no differences')}${hint}\n`);
124
+ const hint = metadataWasFiltered ? chalk_1.default.grey(' (CDK metadata changes were hidden, run cdk diff --strict to show)') : '';
125
+ stream.write(`${chalk_1.default.green('There were no differences')}${hint}\n`);
123
126
  }
124
127
  if (filteredChangesCount > 0) {
125
- stream.write(chalk.yellow(`Omitted ${filteredChangesCount} changes because they are likely mangled non-ASCII characters. Use --strict to print them.\n`));
128
+ stream.write(chalk_1.default.yellow(`Omitted ${filteredChangesCount} changes because they are likely mangled non-ASCII characters. Use --strict to print them.\n`));
126
129
  }
127
130
  }
128
131
  finally {
@@ -165,7 +168,7 @@ class DiffFormatter {
165
168
  const permissionChangeType = permissionTypeFromDiff(diff);
166
169
  const stream = new streams_1.StringWriteStream();
167
170
  if (!options.quiet || permissionChangeType !== payloads_1.PermissionChangeType.NONE) {
168
- stream.write((0, node_util_1.format)(`Stack ${chalk.bold(stackName)}\n`));
171
+ stream.write((0, node_util_1.format)(`Stack ${chalk_1.default.bold(stackName)}\n`));
169
172
  }
170
173
  try {
171
174
  (0, cloudformation_diff_1.formatSecurityChanges)(stream, diff, {
@@ -178,7 +181,7 @@ class DiffFormatter {
178
181
  }
179
182
  let formattedDiff = stream.toString();
180
183
  if (!options.quiet && permissionChangeType === payloads_1.PermissionChangeType.NONE) {
181
- formattedDiff += chalk.green('There were no security-related changes (limitations: https://github.com/aws/aws-cdk/issues/1299)\n');
184
+ formattedDiff += chalk_1.default.green('There were no security-related changes (limitations: https://github.com/aws/aws-cdk/issues/1299)\n');
182
185
  }
183
186
  let numStacksWithChanges = permissionChangeType !== payloads_1.PermissionChangeType.NONE ? 1 : 0;
184
187
  let escalatedPermissionType = permissionChangeType;
@@ -262,4 +265,4 @@ function obscureDiff(diff) {
262
265
  });
263
266
  }
264
267
  }
265
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlmZi1mb3JtYXR0ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJkaWZmLWZvcm1hdHRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSx5Q0FBbUM7QUFFbkMsc0VBUXNDO0FBQ3RDLCtCQUErQjtBQUMvQiw2Q0FBc0Q7QUFFdEQscUVBQXlFO0FBQ3pFLHdDQUErQztBQTBJL0M7O0dBRUc7QUFDSCxNQUFhLGFBQWE7SUFDUCxZQUFZLENBQWU7SUFDM0IsU0FBUyxDQUFTO0lBQ2xCLFFBQVEsQ0FBVTtJQUNsQixRQUFRLENBQXlCO0lBRWxEOztPQUVHO0lBQ2MsS0FBSyxHQUFHLElBQUksR0FBRyxFQUF3QixDQUFDO0lBRXpELFlBQVksS0FBeUI7UUFDbkMsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUMsWUFBWSxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsV0FBVyxJQUFJLEtBQUssQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQztRQUN4RyxJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQyxZQUFZLENBQUMsUUFBUSxJQUFJLEtBQUssQ0FBQztRQUNyRCxJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQyxZQUFZLENBQUMsUUFBUSxJQUFJLEVBQUUsQ0FBQztJQUNwRCxDQUFDO0lBRUQsSUFBVyxLQUFLO1FBQ2QsT0FBTyxNQUFNLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBRUQ7Ozs7Ozs7O09BUUc7SUFDSyxXQUFXLENBQ2pCLFNBQWlCLEVBQ2pCLFdBQXFCLEVBQ3JCLFdBQXFCLEVBQ3JCLFNBQThDLEVBQzlDLFFBQWdDO1FBRWhDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO1lBQy9CLE1BQU0sWUFBWSxHQUFHLElB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LENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFO1lBQzFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDWixPQUFPLElBQUksQ0FBQztZQUNkLENBQUM7WUFDRCxJQUFJLE1BQU0sQ0FBQyxRQUFRLEVBQUUscUJBQXFCLEVBQUUsQ0FBQztnQkFDM0MsT0FBTyxLQUFLLENBQUM7WUFDZixDQUFDO1lBQ0QsSUFBSSxNQUFNLENBQUMsUUFBUSxFQUFFLHFCQUFxQixFQUFFLENBQUM7Z0JBQzNDLE9BQU8sS0FBSyxDQUFDO1lBQ2YsQ0FBQztZQUNELE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDbkIsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUM5QyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQ1osT0FBTyxJQUFJLENBQUM7WUFDZCxDQUFDO1lBQ0QsSUFBSSxNQUFNLENBQUMsZUFBZSxLQUFLLG9CQUFvQixFQUFFLENBQUM7Z0JBQ3BELE9BQU8sS0FBSyxDQUFDO1lBQ2YsQ0FBQztZQUNELElBQUksTUFBTSxDQUFDLGVBQWUsS0FBSyxvQkFBb0IsRUFBRSxDQUFDO2dCQUNwRCxPQUFPLEtBQUssQ0FBQztZQUNmLENBQUM7WUFDRCxPQUFPLElBQUksQ0FBQztRQUNkLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBmb3JtYXQgfSBmcm9tICdub2RlOnV0aWwnO1xuaW1wb3J0IHR5cGUgKiBhcyBjeGFwaSBmcm9tICdAYXdzLWNkay9jbG91ZC1hc3NlbWJseS1hcGknO1xuaW1wb3J0IHtcbiAgZm9ybWF0RGlmZmVyZW5jZXMsXG4gIGZvcm1hdFNlY3VyaXR5Q2hhbmdlcyxcbiAgZnVsbERpZmYsXG4gIG1hbmdsZUxpa2VDbG91ZEZvcm1hdGlvbixcbiAgdHlwZSBEZXNjcmliZUNoYW5nZVNldE91dHB1dCxcbiAgdHlwZSBSZXNvdXJjZURpZmZlcmVuY2UsXG4gIHR5cGUgVGVtcGxhdGVEaWZmLFxufSBmcm9tICdAYXdzLWNkay9jbG91ZGZvcm1hdGlvbi1kaWZmJztcbmltcG9ydCAqIGFzIGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB7IFBlcm1pc3Npb25DaGFuZ2VUeXBlIH0gZnJvbSAnLi4vLi4vcGF5bG9hZHMnO1xuaW1wb3J0IHR5cGUgeyBOZXN0ZWRTdGFja1RlbXBsYXRlcywgVGVtcGxhdGUgfSBmcm9tICcuLi9jbG91ZGZvcm1hdGlvbic7XG5pbXBvcnQgeyBidWlsZExvZ2ljYWxUb1BhdGhNYXAgfSBmcm9tICcuLi9jbG91ZGZvcm1hdGlvbi9sb2dpY2FsLWlkLW1hcCc7XG5pbXBvcnQgeyBTdHJpbmdXcml0ZVN0cmVhbSB9IGZyb20gJy4uL3N0cmVhbXMnO1xuXG4vKipcbiAqIE91dHB1dCBvZiBmb3JtYXRTZWN1cml0eURpZmZcbiAqL1xuaW50ZXJmYWNlIEZvcm1hdFNlY3VyaXR5RGlmZk91dHB1dCB7XG4gIC8qKlxuICAgKiBDb21wbGV0ZSBmb3JtYXR0ZWQgc2VjdXJpdHkgZGlmZlxuICAgKi9cbiAgcmVhZG9ubHkgZm9ybWF0dGVkRGlmZjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgdHlwZSBvZiBwZXJtaXNzaW9uIGNoYW5nZXMgaW4gdGhlIHNlY3VyaXR5IGRpZmYuXG4gICAqIFRoZSBJb0hvc3Qgd2lsbCB1c2UgdGhpcyB0byBkZWNpZGUgd2hldGhlciBvciBub3QgdG8gcHJpbnQuXG4gICAqL1xuICByZWFkb25seSBwZXJtaXNzaW9uQ2hhbmdlVHlwZTogUGVybWlzc2lvbkNoYW5nZVR5cGU7XG5cbiAgLyoqXG4gICAqIE51bWJlciBvZiBzdGFja3Mgd2l0aCBzZWN1cml0eSBjaGFuZ2VzXG4gICAqL1xuICByZWFkb25seSBudW1TdGFja3NXaXRoQ2hhbmdlczogbnVtYmVyO1xufVxuXG4vKipcbiAqIE91dHB1dCBvZiBmb3JtYXRTdGFja0RpZmZcbiAqL1xuaW50ZXJmYWNlIEZvcm1hdFN0YWNrRGlmZk91dHB1dCB7XG4gIC8qKlxuICAgKiBOdW1iZXIgb2Ygc3RhY2tzIHdpdGggZGlmZiBjaGFuZ2VzXG4gICAqL1xuICByZWFkb25seSBudW1TdGFja3NXaXRoQ2hhbmdlczogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBDb21wbGV0ZSBmb3JtYXR0ZWQgZGlmZlxuICAgKi9cbiAgcmVhZG9ubHkgZm9ybWF0dGVkRGlmZjogc3RyaW5nO1xufVxuXG4vKipcbiAqIFByb3BzIGZvciB0aGUgRGlmZiBGb3JtYXR0ZXJcbiAqL1xuaW50ZXJmYWNlIERpZmZGb3JtYXR0ZXJQcm9wcyB7XG4gIC8qKlxuICAgKiBUaGUgcmVsZXZhbnQgaW5mb3JtYXRpb24gZm9yIHRoZSBUZW1wbGF0ZSB0aGF0IGlzIGJlaW5nIGRpZmZlZC5cbiAgICogSW5jbHVkZXMgdGhlIG9sZC9jdXJyZW50IHN0YXRlIG9mIHRoZSBzdGFjayBhcyB3ZWxsIGFzIHRoZSBuZXcgc3RhdGUuXG4gICAqL1xuICByZWFkb25seSB0ZW1wbGF0ZUluZm86IFRlbXBsYXRlSW5mbztcbn1cblxuLyoqXG4gKiBQcm9wZXJ0aWVzIHNwZWNpZmljIHRvIGZvcm1hdHRpbmcgdGhlIHN0YWNrIGRpZmZcbiAqL1xuaW50ZXJmYWNlIEZvcm1hdFN0YWNrRGlmZk9wdGlvbnMge1xuICAvKipcbiAgICogZG8gbm90IGZpbHRlciBvdXQgQVdTOjpDREs6Ok1ldGFkYXRhIG9yIFJ1bGVzXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBzdHJpY3Q/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBsaW5lcyBvZiBjb250ZXh0IHRvIHVzZSBpbiBhcmJpdHJhcnkgSlNPTiBkaWZmXG4gICAqXG4gICAqIEBkZWZhdWx0IDNcbiAgICovXG4gIHJlYWRvbmx5IGNvbnRleHRMaW5lcz86IG51bWJlcjtcblxuICAvKipcbiAgICogc2lsZW5jZXMgXFwnVGhlcmUgd2VyZSBubyBkaWZmZXJlbmNlc1xcJyBtZXNzYWdlc1xuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgcXVpZXQ/OiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgUmV1c2FibGVTdGFja0RpZmZPcHRpb25zIGV4dGVuZHMgRm9ybWF0U3RhY2tEaWZmT3B0aW9ucyB7XG59XG5cbi8qKlxuICogUHJvcGVydGllcyBzcGVjaWZpYyB0byBmb3JtYXR0aW5nIHRoZSBzZWN1cml0eSBkaWZmXG4gKi9cbmludGVyZmFjZSBGb3JtYXRTZWN1cml0eURpZmZPcHRpb25zIHtcbiAgLyoqXG4gICAqIHNpbGVuY2VzIHN0YWNrIG5hbWVzIGFuZCAnbm8gY2hhbmdlcycgbWVzc2FnZXMgZm9yIHN0YWNrcyB3aXRob3V0IHNlY3VyaXR5IGNoYW5nZXNcbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IHF1aWV0PzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBJbmZvcm1hdGlvbiBvbiBhIHRlbXBsYXRlJ3Mgb2xkL25ldyBzdGF0ZVxuICogdGhhdCBpcyB1c2VkIGZvciBkaWZmLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRlbXBsYXRlSW5mbyB7XG4gIC8qKlxuICAgKiBUaGUgb2xkL2V4aXN0aW5nIHRlbXBsYXRlXG4gICAqL1xuICByZWFkb25seSBvbGRUZW1wbGF0ZTogVGVtcGxhdGU7XG5cbiAgLyoqXG4gICAqIFRoZSBuZXcgdGVtcGxhdGVcbiAgICovXG4gIHJlYWRvbmx5IG5ld1RlbXBsYXRlOiBjeGFwaS5DbG91ZEZvcm1hdGlvblN0YWNrQXJ0aWZhY3Q7XG5cbiAgLyoqXG4gICAqIEEgQ2xvdWRGb3JtYXRpb24gQ2hhbmdlU2V0IHRvIGhlbHAgdGhlIGRpZmYgb3BlcmF0aW9uLlxuICAgKiBQcm9iYWJseSBjcmVhdGVkIHZpYSBgY3JlYXRlRGlmZkNoYW5nZVNldGAuXG4gICAqXG4gICAqIEBkZWZhdWx0IHVuZGVmaW5lZFxuICAgKi9cbiAgcmVhZG9ubHkgY2hhbmdlU2V0PzogRGVzY3JpYmVDaGFuZ2VTZXRPdXRwdXQ7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgb3Igbm90IHRoZXJlIGFyZSBhbnkgaW1wb3J0ZWQgcmVzb3VyY2VzXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBpc0ltcG9ydD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEFueSBuZXN0ZWQgc3RhY2tzIGluY2x1ZGVkIGluIHRoZSB0ZW1wbGF0ZVxuICAgKlxuICAgKiBAZGVmYXVsdCB7fVxuICAgKi9cbiAgcmVhZG9ubHkgbmVzdGVkU3RhY2tzPzoge1xuICAgIFtuZXN0ZWRTdGFja0xvZ2ljYWxJZDogc3RyaW5nXTogTmVzdGVkU3RhY2tUZW1wbGF0ZXM7XG4gIH07XG5cbiAgLyoqXG4gICAqIE1hcHBpbmdzIG9mIG9sZCBsb2NhdGlvbnMgdG8gbmV3IGxvY2F0aW9ucy4gSWYgdGhlc2UgYXJlIHByb3ZpZGVkLFxuICAgKiBmb3IgYWxsIHJlc291cmNlcyB0aGF0IHdlcmUgbW92ZWQsIHRoZWlyIGNvcnJlc3BvbmRpbmcgYWRkaXRpb25cbiAgICogYW5kIHJlbW92YWwgbGluZXMgd2lsbCBiZSBhdWdtZW50ZWQgd2l0aCB0aGUgbG9jYXRpb24gdGhleSB3ZXJlXG4gICAqIG1vdmVkIGZvbSBhbmQgdG8sIHJlc3BlY3RpdmVseS5cbiAgICovXG4gIHJlYWRvbmx5IG1hcHBpbmdzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbn1cblxuLyoqXG4gKiBDbGFzcyBmb3IgZm9ybWF0dGluZyB0aGUgZGlmZiBvdXRwdXRcbiAqL1xuZXhwb3J0IGNsYXNzIERpZmZGb3JtYXR0ZXIge1xuICBwcml2YXRlIHJlYWRvbmx5IHRlbXBsYXRlSW5mbzogVGVtcGxhdGVJbmZvO1xuICBwcml2YXRlIHJlYWRvbmx5IHN0YWNrTmFtZTogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IGlzSW1wb3J0OiBib29sZWFuO1xuICBwcml2YXRlIHJlYWRvbmx5IG1hcHBpbmdzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuXG4gIC8qKlxuICAgKiBDYWNoZSBvZiBjb21wdXRlZCBUZW1wbGF0ZURpZmZzLCBpbmRleGVkIGJ5IHN0YWNrIG5hbWUuXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGNhY2hlID0gbmV3IE1hcDxzdHJpbmcsIFRlbXBsYXRlRGlmZj4oKTtcblxuICBjb25zdHJ1Y3Rvcihwcm9wczogRGlmZkZvcm1hdHRlclByb3BzKSB7XG4gICAgdGhpcy50ZW1wbGF0ZUluZm8gPSBwcm9wcy50ZW1wbGF0ZUluZm87XG4gICAgdGhpcy5zdGFja05hbWUgPSBwcm9wcy50ZW1wbGF0ZUluZm8ubmV3VGVtcGxhdGUuZGlzcGxheU5hbWUgPz8gcHJvcHMudGVtcGxhdGVJbmZvLm5ld1RlbXBsYXRlLnN0YWNrTmFtZTtcbiAgICB0aGlzLmlzSW1wb3J0ID0gcHJvcHMudGVtcGxhdGVJbmZvLmlzSW1wb3J0ID8/IGZhbHNlO1xuICAgIHRoaXMubWFwcGluZ3MgPSBwcm9wcy50ZW1wbGF0ZUluZm8ubWFwcGluZ3MgPz8ge307XG4gIH1cblxuICBwdWJsaWMgZ2V0IGRpZmZzKCkge1xuICAgIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXModGhpcy5jYWNoZSk7XG4gIH1cblxuICAvKipcbiAgICogQ29tcHV0ZSB0aGUgZGlmZiBmb3IgYSBzaW5nbGUgc3RhY2suIFJlc3VsdHMgYXJlIGNhY2hlZCBieSBzdGFjayBuYW1lLlxuICAgKlxuICAgKiBAcGFyYW0gc3RhY2tOYW1lIC0gVGhlIG5hbWUgdG8gY2FjaGUgdGhlIGRpZmYgdW5kZXJcbiAgICogQHBhcmFtIG9sZFRlbXBsYXRlIC0gVGhlIGRlcGxveWVkIHRlbXBsYXRlXG4gICAqIEBwYXJhbSBuZXdUZW1wbGF0ZSAtIFRoZSBuZXcvZ2VuZXJhdGVkIHRlbXBsYXRlIChyZWFkIGZyb20gdGhlIGFydGlmYWN0KVxuICAgKiBAcGFyYW0gY2hhbmdlU2V0IC0gVGhlIENsb3VkRm9ybWF0aW9uIGNoYW5nZXNldCBmb3IgdGhpcyBzcGVjaWZpYyBzdGFjaywgaWYgYXZhaWxhYmxlXG4gICAqIEBwYXJhbSBtYXBwaW5ncyAtIFJlc291cmNlIG1vdmUgbWFwcGluZ3NcbiAgICovXG4gIHByaXZhdGUgY29tcHV0ZURpZmYoXG4gICAgc3RhY2tOYW1lOiBzdHJpbmcsXG4gICAgb2xkVGVtcGxhdGU6IFRlbXBsYXRlLFxuICAgIG5ld1RlbXBsYXRlOiBUZW1wbGF0ZSxcbiAgICBjaGFuZ2VTZXQ6IERlc2NyaWJlQ2hhbmdlU2V0T3V0cHV0IHwgdW5kZWZpbmVkLFxuICAgIG1hcHBpbmdzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LFxuICApOiBUZW1wbGF0ZURpZmYge1xuICAgIGlmICghdGhpcy5jYWNoZS5oYXMoc3RhY2tOYW1lKSkge1xuICAgICAgY29uc3QgdGVtcGxhdGVEaWZmID0gZnVsbERpZmYob2xkVGVtcGxhdGUsIG5ld1RlbXBsYXRlLCBjaGFuZ2VTZXQsIHRoaXMuaXNJbXBvcnQpO1xuXG4gICAgICBjb25zdCBzZXRNb3ZlID0gKGNoYW5nZTogUmVzb3VyY2VEaWZmZXJlbmNlLCBkaXJlY3Rpb246ICdmcm9tJyB8ICd0bycsIGxvY2F0aW9uPzogc3RyaW5nKSA9PiB7XG4gICAgICAgIGlmIChsb2NhdGlvbiAhPSBudWxsKSB7XG4gICAgICAgICAgY29uc3QgW3NvdXJjZVN0YWNrTmFtZSwgc291cmNlTG9naWNhbElkXSA9IGxvY2F0aW9uLnNwbGl0KCcuJyk7XG4gICAgICAgICAgY2hhbmdlLm1vdmUgPSB7XG4gICAgICAgICAgICBkaXJlY3Rpb24sXG4gICAgICAgICAgICBzdGFja05hbWU6IHNvdXJjZVN0YWNrTmFtZSxcbiAgICAgICAgICAgIHJlc291cmNlTG9naWNhbElkOiBzb3VyY2VMb2dpY2FsSWQsXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgdGVtcGxhdGVEaWZmLnJlc291cmNlcy5mb3JFYWNoRGlmZmVyZW5jZSgoaWQsIGNoYW5nZSkgPT4ge1xuICAgICAgICBjb25zdCBsb2NhdGlvbiA9IGAke3N0YWNrTmFtZX0uJHtpZH1gO1xuICAgICAgICBpZiAoY2hhbmdlLmlzQWRkaXRpb24gJiYgT2JqZWN0LnZhbHVlcyhtYXBwaW5ncykuaW5jbHVkZXMobG9jYXRpb24pKSB7XG4gICAgICAgICAgc2V0TW92ZShjaGFuZ2UsICdmcm9tJywgT2JqZWN0LmtleXMobWFwcGluZ3MpLmZpbmQoayA9PiBtYXBwaW5nc1trXSA9PT0gbG9jYXRpb24pKTtcbiAgICAgICAgfSBlbHNlIGlmIChjaGFuZ2UuaXNSZW1vdmFsICYmIE9iamVjdC5rZXlzKG1hcHBpbmdzKS5pbmNsdWRlcyhsb2NhdGlvbikpIHtcbiAgICAgICAgICBzZXRNb3ZlKGNoYW5nZSwgJ3RvJywgbWFwcGluZ3NbbG9jYXRpb25dKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIHRoaXMuY2FjaGUuc2V0KHN0YWNrTmFtZSwgdGVtcGxhdGVEaWZmKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuY2FjaGUuZ2V0KHN0YWNrTmFtZSkhO1xuICB9XG5cbiAgLyoqXG4gICAqIEZvcm1hdCB0aGUgc3RhY2sgZGlmZiwgaW5jbHVkaW5nIGFsbCBuZXN0ZWQgc3RhY2tzLlxuICAgKi9cbiAgcHVibGljIGZvcm1hdFN0YWNrRGlmZihvcHRpb25zOiBGb3JtYXRTdGFja0RpZmZPcHRpb25zID0ge30pOiBGb3JtYXRTdGFja0RpZmZPdXRwdXQge1xuICAgIHJldHVybiB0aGlzLmZvcm1hdFN0YWNrRGlmZkhlbHBlcih7XG4gICAgICBvbGRUZW1wbGF0ZTogdGhpcy50ZW1wbGF0ZUluZm8ub2xkVGVtcGxhdGUsXG4gICAgICBuZXdUZW1wbGF0ZTogdGhpcy50ZW1wbGF0ZUluZm8ubmV3VGVtcGxhdGUudGVtcGxhdGUsXG4gICAgICBzdGFja05hbWU6IHRoaXMuc3RhY2tOYW1lLFxuICAgICAgbmVzdGVkU3RhY2tzOiB0aGlzLnRlbXBsYXRlSW5mby5uZXN0ZWRTdGFja3MsXG4gICAgICBjaGFuZ2VTZXQ6IHRoaXMudGVtcGxhdGVJbmZvLmNoYW5nZVNldCxcbiAgICAgIG1hcHBpbmdzOiB0aGlzLm1hcHBpbmdzLFxuICAgICAgbG9naWNhbElkTWFwOiBidWlsZExvZ2ljYWxUb1BhdGhNYXAodGhpcy50ZW1wbGF0ZUluZm8ubmV3VGVtcGxhdGUpLnRvUGF0aCxcbiAgICB9LCBvcHRpb25zKTtcbiAgfVxuXG4gIHByaXZhdGUgZm9ybWF0U3RhY2tEaWZmSGVscGVyKHBhcmFtczoge1xuICAgIG9sZFRlbXBsYXRlOiBUZW1wbGF0ZTtcbiAgICBuZXdUZW1wbGF0ZTogVGVtcGxhdGU7XG4gICAgc3RhY2tOYW1lOiBzdHJpbmc7XG4gICAgbmVzdGVkU3RhY2tzOiB7IFtuZXN0ZWRTdGFja0xvZ2ljYWxJZDogc3RyaW5nXTogTmVzdGVkU3RhY2tUZW1wbGF0ZXMgfSB8IHVuZGVmaW5lZDtcbiAgICBjaGFuZ2VTZXQ6IERlc2NyaWJlQ2hhbmdlU2V0T3V0cHV0IHwgdW5kZWZpbmVkO1xuICAgIG1hcHBpbmdzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICAgIGxvZ2ljYWxJZE1hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgfSwgb3B0aW9uczogUmV1c2FibGVTdGFja0RpZmZPcHRpb25zID0ge30pOiBGb3JtYXRTdGFja0RpZmZPdXRwdXQge1xuICAgIGNvbnN0IHsgb2xkVGVtcGxhdGUsIG5ld1RlbXBsYXRlLCBzdGFja05hbWUsIG5lc3RlZFN0YWNrcywgY2hhbmdlU2V0LCBtYXBwaW5ncywgbG9naWNhbElkTWFwIH0gPSBwYXJhbXM7XG5cbiAgICBjb25zdCBkaWZmID0gdGhpcy5jb21wdXRlRGlmZihzdGFja05hbWUsIG9sZFRlbXBsYXRlLCBuZXdUZW1wbGF0ZSwgY2hhbmdlU2V0LCBtYXBwaW5ncyk7XG5cbiAgICBjb25zdCBzdHJlYW0gPSBuZXcgU3RyaW5nV3JpdGVTdHJlYW0oKTtcbiAgICBsZXQgbnVtU3RhY2tzV2l0aENoYW5nZXMgPSAwO1xuICAgIGxldCBmb3JtYXR0ZWREaWZmID0gJyc7XG4gICAgbGV0IGZpbHRlcmVkQ2hhbmdlc0NvdW50ID0gMDtcblxuICAgIHRyeSB7XG4gICAgICAvLyBtdXN0IG91dHB1dCB0aGUgc3RhY2sgbmFtZSBpZiB0aGVyZSBhcmUgZGlmZmVyZW5jZXMsIGV2ZW4gaWYgcXVpZXRcbiAgICAgIGlmIChzdGFja05hbWUgJiYgKCFvcHRpb25zLnF1aWV0IHx8ICFkaWZmLmlzRW1wdHkpKSB7XG4gICAgICAgIHN0cmVhbS53cml0ZShmb3JtYXQoYFN0YWNrICR7Y2hhbGsuYm9sZChzdGFja05hbWUpfVxcbmApKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFvcHRpb25zLnF1aWV0ICYmIHRoaXMuaXNJbXBvcnQpIHtcbiAgICAgICAgc3RyZWFtLndyaXRlKCdQYXJhbWV0ZXJzIGFuZCBydWxlcyBjcmVhdGVkIGR1cmluZyBtaWdyYXRpb24gZG8gbm90IGFmZmVjdCByZXNvdXJjZSBjb25maWd1cmF0aW9uLlxcbicpO1xuICAgICAgfVxuXG4gICAgICAvLyBkZXRlY3QgYW5kIGZpbHRlciBvdXQgbWFuZ2xlZCBjaGFyYWN0ZXJzIGZyb20gdGhlIGRpZmZcbiAgICAgIGxldCBhY3RpdmVEaWZmID0gZGlmZjtcbiAgICAgIGlmIChkaWZmLmRpZmZlcmVuY2VDb3VudCAmJiAhb3B0aW9ucy5zdHJpY3QpIHtcbiAgICAgICAgY29uc3QgbWFuZ2xlZE5ld1RlbXBsYXRlID0gSlNPTi5wYXJzZShtYW5nbGVMaWtlQ2xvdWRGb3JtYXRpb24oSlNPTi5zdHJpbmdpZnkobmV3VGVtcGxhdGUpKSk7XG4gICAgICAgIGNvbnN0IG1hbmdsZWREaWZmID0gZnVsbERpZmYob2xkVGVtcGxhdGUsIG1hbmdsZWROZXdUZW1wbGF0ZSwgY2hhbmdlU2V0KTtcbiAgICAgICAgZmlsdGVyZWRDaGFuZ2VzQ291bnQgPSBNYXRoLm1heCgwLCBkaWZmLmRpZmZlcmVuY2VDb3VudCAtIG1hbmdsZWREaWZmLmRpZmZlcmVuY2VDb3VudCk7XG4gICAgICAgIGlmIChmaWx0ZXJlZENoYW5nZXNDb3VudCA+IDApIHtcbiAgICAgICAgICBhY3RpdmVEaWZmID0gbWFuZ2xlZERpZmY7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gZmlsdGVyIG91dCAnQVdTOjpDREs6Ok1ldGFkYXRhJyByZXNvdXJjZXMgZnJvbSB0aGUgdGVtcGxhdGVcbiAgICAgIC8vIGZpbHRlciBvdXQgJ0NoZWNrQm9vdHN0cmFwVmVyc2lvbicgcnVsZXMgZnJvbSB0aGUgdGVtcGxhdGVcbiAgICAgIGNvbnN0IGRpZmZXYXNOb25FbXB0eSA9ICFhY3RpdmVEaWZmLmlzRW1wdHk7XG4gICAgICBpZiAoIW9wdGlvbnMuc3RyaWN0KSB7XG4gICAgICAgIG9ic2N1cmVEaWZmKGFjdGl2ZURpZmYpO1xuICAgICAgfVxuICAgICAgY29uc3QgbWV0YWRhdGFXYXNGaWx0ZXJlZCA9IGRpZmZXYXNOb25FbXB0eSAmJiBhY3RpdmVEaWZmLmlzRW1wdHk7XG5cbiAgICAgIGlmICghYWN0aXZlRGlmZi5pc0VtcHR5KSB7XG4gICAgICAgIG51bVN0YWNrc1dpdGhDaGFuZ2VzKys7XG5cbiAgICAgICAgZm9ybWF0RGlmZmVyZW5jZXMoc3RyZWFtLCBhY3RpdmVEaWZmLCB7XG4gICAgICAgICAgLi4ubG9naWNhbElkTWFwRnJvbVRlbXBsYXRlKG9sZFRlbXBsYXRlKSxcbiAgICAgICAgICAuLi5sb2dpY2FsSWRNYXBGcm9tVGVtcGxhdGUobmV3VGVtcGxhdGUpLFxuICAgICAgICAgIC4uLmxvZ2ljYWxJZE1hcCxcbiAgICAgICAgfSwgb3B0aW9ucy5jb250ZXh0TGluZXMpO1xuICAgICAgfSBlbHNlIGlmICghb3B0aW9ucy5xdWlldCkge1xuICAgICAgICBjb25zdCBoaW50ID0gbWV0YWRhdGFXYXNGaWx0ZXJlZCA/IGNoYWxrLmdyZXkoJyAoQ0RLIG1ldGFkYXRhIGNoYW5nZXMgd2VyZSBoaWRkZW4sIHJ1biBjZGsgZGlmZiAtLXN0cmljdCB0byBzaG93KScpIDogJyc7XG4gICAgICAgIHN0cmVhbS53cml0ZShgJHtjaGFsay5ncmVlbignVGhlcmUgd2VyZSBubyBkaWZmZXJlbmNlcycpfSR7aGludH1cXG5gKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGZpbHRlcmVkQ2hhbmdlc0NvdW50ID4gMCkge1xuICAgICAgICBzdHJlYW0ud3JpdGUoY2hhbGsueWVsbG93KGBPbWl0dGVkICR7ZmlsdGVyZWRDaGFuZ2VzQ291bnR9IGNoYW5nZXMgYmVjYXVzZSB0aGV5IGFyZSBsaWtlbHkgbWFuZ2xlZCBub24tQVNDSUkgY2hhcmFjdGVycy4gVXNlIC0tc3RyaWN0IHRvIHByaW50IHRoZW0uXFxuYCkpO1xuICAgICAgfVxuICAgIH0gZmluYWxseSB7XG4gICAgICBmb3JtYXR0ZWREaWZmID0gc3RyZWFtLnRvU3RyaW5nKCk7XG4gICAgICBzdHJlYW0uZW5kKCk7XG4gICAgfVxuXG4gICAgLy8gUmVjdXJzZSBpbnRvIG5lc3RlZCBzdGFja3NcbiAgICBmb3IgKGNvbnN0IFtsb2dpY2FsSWQsIG5lc3RlZFN0YWNrXSBvZiBPYmplY3QuZW50cmllcyhuZXN0ZWRTdGFja3MgPz8ge30pKSB7XG4gICAgICBjb25zdCBuZXh0RGlmZiA9IHRoaXMuZm9ybWF0U3RhY2tEaWZmSGVscGVyKHtcbiAgICAgICAgb2xkVGVtcGxhdGU6IG5lc3RlZFN0YWNrLmRlcGxveWVkVGVtcGxhdGUsXG4gICAgICAgIG5ld1RlbXBsYXRlOiBuZXN0ZWRTdGFjay5nZW5lcmF0ZWRUZW1wbGF0ZSxcbiAgICAgICAgc3RhY2tOYW1lOiBuZXN0ZWRTdGFjay5waHlzaWNhbE5hbWUgPz8gbG9naWNhbElkLFxuICAgICAgICBuZXN0ZWRTdGFja3M6IG5lc3RlZFN0YWNrLm5lc3RlZFN0YWNrVGVtcGxhdGVzLFxuICAgICAgICBjaGFuZ2VTZXQ6IG5lc3RlZFN0YWNrLmNoYW5nZVNldCxcbiAgICAgICAgbWFwcGluZ3MsXG4gICAgICAgIGxvZ2ljYWxJZE1hcDoge30sXG4gICAgICB9LCBvcHRpb25zKTtcbiAgICAgIG51bVN0YWNrc1dpdGhDaGFuZ2VzICs9IG5leHREaWZmLm51bVN0YWNrc1dpdGhDaGFuZ2VzO1xuICAgICAgZm9ybWF0dGVkRGlmZiArPSBuZXh0RGlmZi5mb3JtYXR0ZWREaWZmO1xuICAgIH1cblxuICAgIHJldHVybiB7IG51bVN0YWNrc1dpdGhDaGFuZ2VzLCBmb3JtYXR0ZWREaWZmIH07XG4gIH1cblxuICAvKipcbiAgICogRm9ybWF0IHRoZSBzZWN1cml0eSBkaWZmLCBpbmNsdWRpbmcgYWxsIG5lc3RlZCBzdGFja3MuXG4gICAqL1xuICBwdWJsaWMgZm9ybWF0U2VjdXJpdHlEaWZmKG9wdGlvbnM6IEZvcm1hdFNlY3VyaXR5RGlmZk9wdGlvbnMgPSB7fSk6IEZvcm1hdFNlY3VyaXR5RGlmZk91dHB1dCB7XG4gICAgY29uc3QgeyBmb3JtYXR0ZWREaWZmLCBwZXJtaXNzaW9uQ2hhbmdlVHlwZSwgbnVtU3RhY2tzV2l0aENoYW5nZXMgfSA9IHRoaXMuZm9ybWF0U2VjdXJpdHlEaWZmSGVscGVyKHtcbiAgICAgIG9sZFRlbXBsYXRlOiB0aGlzLnRlbXBsYXRlSW5mby5vbGRUZW1wbGF0ZSxcbiAgICAgIG5ld1RlbXBsYXRlOiB0aGlzLnRlbXBsYXRlSW5mby5uZXdUZW1wbGF0ZS50ZW1wbGF0ZSxcbiAgICAgIHN0YWNrTmFtZTogdGhpcy5zdGFja05hbWUsXG4gICAgICBuZXN0ZWRTdGFja3M6IHRoaXMudGVtcGxhdGVJbmZvLm5lc3RlZFN0YWNrcyxcbiAgICAgIGNoYW5nZVNldDogdGhpcy50ZW1wbGF0ZUluZm8uY2hhbmdlU2V0LFxuICAgICAgbG9naWNhbElkTWFwOiBidWlsZExvZ2ljYWxUb1BhdGhNYXAodGhpcy50ZW1wbGF0ZUluZm8ubmV3VGVtcGxhdGUpLnRvUGF0aCxcbiAgICB9LCBvcHRpb25zKTtcblxuICAgIHJldHVybiB7IGZvcm1hdHRlZERpZmYsIHBlcm1pc3Npb25DaGFuZ2VUeXBlLCBudW1TdGFja3NXaXRoQ2hhbmdlcyB9O1xuICB9XG5cbiAgcHJpdmF0ZSBmb3JtYXRTZWN1cml0eURpZmZIZWxwZXIocGFyYW1zOiB7XG4gICAgb2xkVGVtcGxhdGU6IFRlbXBsYXRlO1xuICAgIG5ld1RlbXBsYXRlOiBUZW1wbGF0ZTtcbiAgICBzdGFja05hbWU6IHN0cmluZztcbiAgICBuZXN0ZWRTdGFja3M6IHsgW25lc3RlZFN0YWNrTG9naWNhbElkOiBzdHJpbmddOiBOZXN0ZWRTdGFja1RlbXBsYXRlcyB9IHwgdW5kZWZpbmVkO1xuICAgIGNoYW5nZVNldDogRGVzY3JpYmVDaGFuZ2VTZXRPdXRwdXQgfCB1bmRlZmluZWQ7XG4gICAgbG9naWNhbElkTWFwPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgfSwgb3B0aW9uczogRm9ybWF0U2VjdXJpdHlEaWZmT3B0aW9ucyA9IHt9KTogRm9ybWF0U2VjdXJpdHlEaWZmT3V0cHV0IHtcbiAgICBjb25zdCB7IG9sZFRlbXBsYXRlLCBuZXdUZW1wbGF0ZSwgc3RhY2tOYW1lLCBuZXN0ZWRTdGFja3MsIGNoYW5nZVNldCwgbG9naWNhbElkTWFwIH0gPSBwYXJhbXM7XG5cbiAgICBjb25zdCBkaWZmID0gdGhpcy5jb21wdXRlRGlmZihzdGFja05hbWUsIG9sZFRlbXBsYXRlLCBuZXdUZW1wbGF0ZSwgY2hhbmdlU2V0LCB0aGlzLm1hcHBpbmdzKTtcbiAgICBjb25zdCBwZXJtaXNzaW9uQ2hhbmdlVHlwZSA9IHBlcm1pc3Npb25UeXBlRnJvbURpZmYoZGlmZik7XG5cbiAgICBjb25zdCBzdHJlYW0gPSBuZXcgU3RyaW5nV3JpdGVTdHJlYW0oKTtcbiAgICBpZiAoIW9wdGlvbnMucXVpZXQgfHwgcGVybWlzc2lvbkNoYW5nZVR5cGUgIT09IFBlcm1pc3Npb25DaGFuZ2VUeXBlLk5PTkUpIHtcbiAgICAgIHN0cmVhbS53cml0ZShmb3JtYXQoYFN0YWNrICR7Y2hhbGsuYm9sZChzdGFja05hbWUpfVxcbmApKTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgZm9ybWF0U2VjdXJpdHlDaGFuZ2VzKHN0cmVhbSwgZGlmZiwge1xuICAgICAgICAuLi5sb2dpY2FsSWRNYXBGcm9tVGVtcGxhdGUobmV3VGVtcGxhdGUpLFxuICAgICAgICAuLi5sb2dpY2FsSWRNYXAsXG4gICAgICB9KTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgc3RyZWFtLmVuZCgpO1xuICAgIH1cblxuICAgIGxldCBmb3JtYXR0ZWREaWZmID0gc3RyZWFtLnRvU3RyaW5nKCk7XG4gICAgaWYgKCFvcHRpb25zLnF1aWV0ICYmIHBlcm1pc3Npb25DaGFuZ2VUeXBlID09PSBQZXJtaXNzaW9uQ2hhbmdlVHlwZS5OT05FKSB7XG4gICAgICBmb3JtYXR0ZWREaWZmICs9IGNoYWxrLmdyZWVuKCdUaGVyZSB3ZXJlIG5vIHNlY3VyaXR5LXJlbGF0ZWQgY2hhbmdlcyAobGltaXRhdGlvbnM6IGh0dHBzOi8vZ2l0aHViLmNvbS9hd3MvYXdzLWNkay9pc3N1ZXMvMTI5OSlcXG4nKTtcbiAgICB9XG4gICAgbGV0IG51bVN0YWNrc1dpdGhDaGFuZ2VzID0gcGVybWlzc2lvbkNoYW5nZVR5cGUgIT09IFBlcm1pc3Npb25DaGFuZ2VUeXBlLk5PTkUgPyAxIDogMDtcbiAgICBsZXQgZXNjYWxhdGVkUGVybWlzc2lvblR5cGUgPSBwZXJtaXNzaW9uQ2hhbmdlVHlwZTtcblxuICAgIC8vIFJlY3Vyc2UgaW50byBuZXN0ZWQgc3RhY2tzXG4gICAgZm9yIChjb25zdCBbbG9naWNhbElkLCBuZXN0ZWRTdGFja10gb2YgT2JqZWN0LmVudHJpZXMobmVzdGVkU3RhY2tzID8/IHt9KSkge1xuICAgICAgY29uc3QgbmVzdGVkUmVzdWx0ID0gdGhpcy5mb3JtYXRTZWN1cml0eURpZmZIZWxwZXIoe1xuICAgICAgICBvbGRUZW1wbGF0ZTogbmVzdGVkU3RhY2suZGVwbG95ZWRUZW1wbGF0ZSxcbiAgICAgICAgbmV3VGVtcGxhdGU6IG5lc3RlZFN0YWNrLmdlbmVyYXRlZFRlbXBsYXRlLFxuICAgICAgICBzdGFja05hbWU6IG5lc3RlZFN0YWNrLnBoeXNpY2FsTmFtZSA/PyBsb2dpY2FsSWQsXG4gICAgICAgIG5lc3RlZFN0YWNrczogbmVzdGVkU3RhY2submVzdGVkU3RhY2tUZW1wbGF0ZXMsXG4gICAgICAgIGNoYW5nZVNldDogbmVzdGVkU3RhY2suY2hhbmdlU2V0LFxuICAgICAgfSwgb3B0aW9ucyk7XG4gICAgICBmb3JtYXR0ZWREaWZmICs9IG5lc3RlZFJlc3VsdC5mb3JtYXR0ZWREaWZmID8gJ1xcbicgKyBuZXN0ZWRSZXN1bHQuZm9ybWF0dGVkRGlmZiA6ICcnO1xuICAgICAgbnVtU3RhY2tzV2l0aENoYW5nZXMgKz0gbmVzdGVkUmVzdWx0Lm51bVN0YWNrc1dpdGhDaGFuZ2VzO1xuICAgICAgLy8gRXNjYWxhdGU6IGlmIGFueSBuZXN0ZWQgc3RhY2sgYnJvYWRlbnMgcGVybWlzc2lvbnMsIHRoZSB3aG9sZSB0aGluZyBicm9hZGVuc1xuICAgICAgaWYgKG5lc3RlZFJlc3VsdC5wZXJtaXNzaW9uQ2hhbmdlVHlwZSA9PT0gUGVybWlzc2lvbkNoYW5nZVR5cGUuQlJPQURFTklORykge1xuICAgICAgICBlc2NhbGF0ZWRQZXJtaXNzaW9uVHlwZSA9IFBlcm1pc3Npb25DaGFuZ2VUeXBlLkJST0FERU5JTkc7XG4gICAgICB9IGVsc2UgaWYgKG5lc3RlZFJlc3VsdC5wZXJtaXNzaW9uQ2hhbmdlVHlwZSA9PT0gUGVybWlzc2lvbkNoYW5nZVR5cGUuTk9OX0JST0FERU5JTkdcbiAgICAgICAgJiYgZXNjYWxhdGVkUGVybWlzc2lvblR5cGUgPT09IFBlcm1pc3Npb25DaGFuZ2VUeXBlLk5PTkUpIHtcbiAgICAgICAgZXNjYWxhdGVkUGVybWlzc2lvblR5cGUgPSBQZXJtaXNzaW9uQ2hhbmdlVHlwZS5OT05fQlJPQURFTklORztcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4geyBmb3JtYXR0ZWREaWZmLCBwZXJtaXNzaW9uQ2hhbmdlVHlwZTogZXNjYWxhdGVkUGVybWlzc2lvblR5cGUsIG51bVN0YWNrc1dpdGhDaGFuZ2VzIH07XG4gIH1cbn1cblxuZnVuY3Rpb24gcGVybWlzc2lvblR5cGVGcm9tRGlmZihkaWZmOiBUZW1wbGF0ZURpZmYpOiBQZXJtaXNzaW9uQ2hhbmdlVHlwZSB7XG4gIGlmIChkaWZmLnBlcm1pc3Npb25zQnJvYWRlbmVkKSB7XG4gICAgcmV0dXJuIFBlcm1pc3Npb25DaGFuZ2VUeXBlLkJST0FERU5JTkc7XG4gIH0gZWxzZSBpZiAoZGlmZi5wZXJtaXNzaW9uc0FueUNoYW5nZXMpIHtcbiAgICByZXR1cm4gUGVybWlzc2lvbkNoYW5nZVR5cGUuTk9OX0JST0FERU5JTkc7XG4gIH1cbiAgcmV0dXJuIFBlcm1pc3Npb25DaGFuZ2VUeXBlLk5PTkU7XG59XG5cbmZ1bmN0aW9uIGxvZ2ljYWxJZE1hcEZyb21UZW1wbGF0ZSh0ZW1wbGF0ZTogVGVtcGxhdGUpIHtcbiAgY29uc3QgcmV0OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG5cbiAgZm9yIChjb25zdCBbbG9naWNhbElkLCByZXNvdXJjZV0gb2YgT2JqZWN0LmVudHJpZXMoKHRlbXBsYXRlLlJlc291cmNlcyA/PyB7fSkgYXMgUmVjb3JkPHN0cmluZywgYW55PikpIHtcbiAgICBjb25zdCBwYXRoID0gcmVzb3VyY2U/Lk1ldGFkYXRhPy5bJ2F3czpjZGs6cGF0aCddO1xuICAgIGlmIChwYXRoKSB7XG4gICAgICByZXRbbG9naWNhbElkXSA9IHBhdGg7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXQ7XG59XG5cbi8qKlxuICogUmVtb3ZlIGFueSB0ZW1wbGF0ZSBlbGVtZW50cyB0aGF0IHdlIGRvbid0IHdhbnQgdG8gc2hvdyB1c2Vycy5cbiAqIFRoaXMgaXMgY3VycmVudGx5OlxuICogLSBBV1M6OkNESzo6TWV0YWRhdGEgcmVzb3VyY2VcbiAqIC0gQ2hlY2tCb290c3RyYXBWZXJzaW9uIFJ1bGVcbiAqL1xuZnVuY3Rpb24gb2JzY3VyZURpZmYoZGlmZjogVGVtcGxhdGVEaWZmKSB7XG4gIGlmIChkaWZmLnVua25vd24pIHtcbiAgICAvLyBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2F3cy9hd3MtY2RrL2lzc3Vlcy8xNzk0MlxuICAgIGRpZmYudW5rbm93biA9IGRpZmYudW5rbm93bi5maWx0ZXIoY2hhbmdlID0+IHtcbiAgICAgIGlmICghY2hhbmdlKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgaWYgKGNoYW5nZS5uZXdWYWx1ZT8uQ2hlY2tCb290c3RyYXBWZXJzaW9uKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGlmIChjaGFuZ2Uub2xkVmFsdWU/LkNoZWNrQm9vdHN0cmFwVmVyc2lvbikge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9KTtcbiAgfVxuXG4gIGlmIChkaWZmLnJlc291cmNlcykge1xuICAgIGRpZmYucmVzb3VyY2VzID0gZGlmZi5yZXNvdXJjZXMuZmlsdGVyKGNoYW5nZSA9PiB7XG4gICAgICBpZiAoIWNoYW5nZSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGlmIChjaGFuZ2UubmV3UmVzb3VyY2VUeXBlID09PSAnQVdTOjpDREs6Ok1ldGFkYXRhJykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBpZiAoY2hhbmdlLm9sZFJlc291cmNlVHlwZSA9PT0gJ0FXUzo6Q0RLOjpNZXRhZGF0YScpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==
268
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlmZi1mb3JtYXR0ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJkaWZmLWZvcm1hdHRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSx5Q0FBbUM7QUFFbkMsc0VBUXNDO0FBQ3RDLGtEQUEwQjtBQUMxQiw2Q0FBc0Q7QUFFdEQscUVBQXlFO0FBQ3pFLHdDQUErQztBQTBJL0M7O0dBRUc7QUFDSCxNQUFhLGFBQWE7SUFDUCxZQUFZLENBQWU7SUFDM0IsU0FBUyxDQUFTO0lBQ2xCLFFBQVEsQ0FBVTtJQUNsQixRQUFRLENBQXlCO0lBRWxEOztPQUVHO0lBQ2MsS0FBSyxHQUFHLElBQUksR0FBRyxFQUF3QixDQUFDO0lBRXpELFlBQVksS0FBeUI7UUFDbkMsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUMsWUFBWSxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsV0FBVyxJQUFJLEtBQUssQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQztRQUN4RyxJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQyxZQUFZLENBQUMsUUFBUSxJQUFJLEtBQUssQ0FBQztRQUNyRCxJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQyxZQUFZLENBQUMsUUFBUSxJQUFJLEVBQUUsQ0FBQztJQUNwRCxDQUFDO0lBRUQsSUFBVyxLQUFLO1FBQ2QsT0FBTyxNQUFNLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBRUQ7Ozs7Ozs7O09BUUc7SUFDSyxXQUFXLENBQ2pCLFNBQWlCLEVBQ2pCLFdBQXFCLEVBQ3JCLFdBQXFCLEVBQ3JCLFNBQThDLEVBQzlDLFFBQWdDO1FBRWhDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO1lBQy9CLE1BQU0sWUFBWSxHQUFH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QUFPLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFO1lBQzFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDWixPQUFPLElBQUksQ0FBQztZQUNkLENBQUM7WUFDRCxJQUFJLE1BQU0sQ0FBQyxRQUFRLEVBQUUscUJBQXFCLEVBQUUsQ0FBQztnQkFDM0MsT0FBTyxLQUFLLENBQUM7WUFDZixDQUFDO1lBQ0QsSUFBSSxNQUFNLENBQUMsUUFBUSxFQUFFLHFCQUFxQixFQUFFLENBQUM7Z0JBQzNDLE9BQU8sS0FBSyxDQUFDO1lBQ2YsQ0FBQztZQUNELE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDbkIsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUM5QyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQ1osT0FBTyxJQUFJLENBQUM7WUFDZCxDQUFDO1lBQ0QsSUFBSSxNQUFNLENBQUMsZUFBZSxLQUFLLG9CQUFvQixFQUFFLENBQUM7Z0JBQ3BELE9BQU8sS0FBSyxDQUFDO1lBQ2YsQ0FBQztZQUNELElBQUksTUFBTSxDQUFDLGVBQWUsS0FBSyxvQkFBb0IsRUFBRSxDQUFDO2dCQUNwRCxPQUFPLEtBQUssQ0FBQztZQUNmLENBQUM7WUFDRCxPQUFPLElBQUksQ0FBQztRQUNkLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBmb3JtYXQgfSBmcm9tICdub2RlOnV0aWwnO1xuaW1wb3J0IHR5cGUgKiBhcyBjeGFwaSBmcm9tICdAYXdzLWNkay9jbG91ZC1hc3NlbWJseS1hcGknO1xuaW1wb3J0IHtcbiAgZm9ybWF0RGlmZmVyZW5jZXMsXG4gIGZvcm1hdFNlY3VyaXR5Q2hhbmdlcyxcbiAgZnVsbERpZmYsXG4gIG1hbmdsZUxpa2VDbG91ZEZvcm1hdGlvbixcbiAgdHlwZSBEZXNjcmliZUNoYW5nZVNldE91dHB1dCxcbiAgdHlwZSBSZXNvdXJjZURpZmZlcmVuY2UsXG4gIHR5cGUgVGVtcGxhdGVEaWZmLFxufSBmcm9tICdAYXdzLWNkay9jbG91ZGZvcm1hdGlvbi1kaWZmJztcbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgeyBQZXJtaXNzaW9uQ2hhbmdlVHlwZSB9IGZyb20gJy4uLy4uL3BheWxvYWRzJztcbmltcG9ydCB0eXBlIHsgTmVzdGVkU3RhY2tUZW1wbGF0ZXMsIFRlbXBsYXRlIH0gZnJvbSAnLi4vY2xvdWRmb3JtYXRpb24nO1xuaW1wb3J0IHsgYnVpbGRMb2dpY2FsVG9QYXRoTWFwIH0gZnJvbSAnLi4vY2xvdWRmb3JtYXRpb24vbG9naWNhbC1pZC1tYXAnO1xuaW1wb3J0IHsgU3RyaW5nV3JpdGVTdHJlYW0gfSBmcm9tICcuLi9zdHJlYW1zJztcblxuLyoqXG4gKiBPdXRwdXQgb2YgZm9ybWF0U2VjdXJpdHlEaWZmXG4gKi9cbmludGVyZmFjZSBGb3JtYXRTZWN1cml0eURpZmZPdXRwdXQge1xuICAvKipcbiAgICogQ29tcGxldGUgZm9ybWF0dGVkIHNlY3VyaXR5IGRpZmZcbiAgICovXG4gIHJlYWRvbmx5IGZvcm1hdHRlZERpZmY6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHR5cGUgb2YgcGVybWlzc2lvbiBjaGFuZ2VzIGluIHRoZSBzZWN1cml0eSBkaWZmLlxuICAgKiBUaGUgSW9Ib3N0IHdpbGwgdXNlIHRoaXMgdG8gZGVjaWRlIHdoZXRoZXIgb3Igbm90IHRvIHByaW50LlxuICAgKi9cbiAgcmVhZG9ubHkgcGVybWlzc2lvbkNoYW5nZVR5cGU6IFBlcm1pc3Npb25DaGFuZ2VUeXBlO1xuXG4gIC8qKlxuICAgKiBOdW1iZXIgb2Ygc3RhY2tzIHdpdGggc2VjdXJpdHkgY2hhbmdlc1xuICAgKi9cbiAgcmVhZG9ubHkgbnVtU3RhY2tzV2l0aENoYW5nZXM6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBPdXRwdXQgb2YgZm9ybWF0U3RhY2tEaWZmXG4gKi9cbmludGVyZmFjZSBGb3JtYXRTdGFja0RpZmZPdXRwdXQge1xuICAvKipcbiAgICogTnVtYmVyIG9mIHN0YWNrcyB3aXRoIGRpZmYgY2hhbmdlc1xuICAgKi9cbiAgcmVhZG9ubHkgbnVtU3RhY2tzV2l0aENoYW5nZXM6IG51bWJlcjtcblxuICAvKipcbiAgICogQ29tcGxldGUgZm9ybWF0dGVkIGRpZmZcbiAgICovXG4gIHJlYWRvbmx5IGZvcm1hdHRlZERpZmY6IHN0cmluZztcbn1cblxuLyoqXG4gKiBQcm9wcyBmb3IgdGhlIERpZmYgRm9ybWF0dGVyXG4gKi9cbmludGVyZmFjZSBEaWZmRm9ybWF0dGVyUHJvcHMge1xuICAvKipcbiAgICogVGhlIHJlbGV2YW50IGluZm9ybWF0aW9uIGZvciB0aGUgVGVtcGxhdGUgdGhhdCBpcyBiZWluZyBkaWZmZWQuXG4gICAqIEluY2x1ZGVzIHRoZSBvbGQvY3VycmVudCBzdGF0ZSBvZiB0aGUgc3RhY2sgYXMgd2VsbCBhcyB0aGUgbmV3IHN0YXRlLlxuICAgKi9cbiAgcmVhZG9ubHkgdGVtcGxhdGVJbmZvOiBUZW1wbGF0ZUluZm87XG59XG5cbi8qKlxuICogUHJvcGVydGllcyBzcGVjaWZpYyB0byBmb3JtYXR0aW5nIHRoZSBzdGFjayBkaWZmXG4gKi9cbmludGVyZmFjZSBGb3JtYXRTdGFja0RpZmZPcHRpb25zIHtcbiAgLyoqXG4gICAqIGRvIG5vdCBmaWx0ZXIgb3V0IEFXUzo6Q0RLOjpNZXRhZGF0YSBvciBSdWxlc1xuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgc3RyaWN0PzogYm9vbGVhbjtcblxuICAvKipcbiAgICogbGluZXMgb2YgY29udGV4dCB0byB1c2UgaW4gYXJiaXRyYXJ5IEpTT04gZGlmZlxuICAgKlxuICAgKiBAZGVmYXVsdCAzXG4gICAqL1xuICByZWFkb25seSBjb250ZXh0TGluZXM/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIHNpbGVuY2VzIFxcJ1RoZXJlIHdlcmUgbm8gZGlmZmVyZW5jZXNcXCcgbWVzc2FnZXNcbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IHF1aWV0PzogYm9vbGVhbjtcbn1cblxuaW50ZXJmYWNlIFJldXNhYmxlU3RhY2tEaWZmT3B0aW9ucyBleHRlbmRzIEZvcm1hdFN0YWNrRGlmZk9wdGlvbnMge1xufVxuXG4vKipcbiAqIFByb3BlcnRpZXMgc3BlY2lmaWMgdG8gZm9ybWF0dGluZyB0aGUgc2VjdXJpdHkgZGlmZlxuICovXG5pbnRlcmZhY2UgRm9ybWF0U2VjdXJpdHlEaWZmT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBzaWxlbmNlcyBzdGFjayBuYW1lcyBhbmQgJ25vIGNoYW5nZXMnIG1lc3NhZ2VzIGZvciBzdGFja3Mgd2l0aG91dCBzZWN1cml0eSBjaGFuZ2VzXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBxdWlldD86IGJvb2xlYW47XG59XG5cbi8qKlxuICogSW5mb3JtYXRpb24gb24gYSB0ZW1wbGF0ZSdzIG9sZC9uZXcgc3RhdGVcbiAqIHRoYXQgaXMgdXNlZCBmb3IgZGlmZi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUZW1wbGF0ZUluZm8ge1xuICAvKipcbiAgICogVGhlIG9sZC9leGlzdGluZyB0ZW1wbGF0ZVxuICAgKi9cbiAgcmVhZG9ubHkgb2xkVGVtcGxhdGU6IFRlbXBsYXRlO1xuXG4gIC8qKlxuICAgKiBUaGUgbmV3IHRlbXBsYXRlXG4gICAqL1xuICByZWFkb25seSBuZXdUZW1wbGF0ZTogY3hhcGkuQ2xvdWRGb3JtYXRpb25TdGFja0FydGlmYWN0O1xuXG4gIC8qKlxuICAgKiBBIENsb3VkRm9ybWF0aW9uIENoYW5nZVNldCB0byBoZWxwIHRoZSBkaWZmIG9wZXJhdGlvbi5cbiAgICogUHJvYmFibHkgY3JlYXRlZCB2aWEgYGNyZWF0ZURpZmZDaGFuZ2VTZXRgLlxuICAgKlxuICAgKiBAZGVmYXVsdCB1bmRlZmluZWRcbiAgICovXG4gIHJlYWRvbmx5IGNoYW5nZVNldD86IERlc2NyaWJlQ2hhbmdlU2V0T3V0cHV0O1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIG9yIG5vdCB0aGVyZSBhcmUgYW55IGltcG9ydGVkIHJlc291cmNlc1xuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgaXNJbXBvcnQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBBbnkgbmVzdGVkIHN0YWNrcyBpbmNsdWRlZCBpbiB0aGUgdGVtcGxhdGVcbiAgICpcbiAgICogQGRlZmF1bHQge31cbiAgICovXG4gIHJlYWRvbmx5IG5lc3RlZFN0YWNrcz86IHtcbiAgICBbbmVzdGVkU3RhY2tMb2dpY2FsSWQ6IHN0cmluZ106IE5lc3RlZFN0YWNrVGVtcGxhdGVzO1xuICB9O1xuXG4gIC8qKlxuICAgKiBNYXBwaW5ncyBvZiBvbGQgbG9jYXRpb25zIHRvIG5ldyBsb2NhdGlvbnMuIElmIHRoZXNlIGFyZSBwcm92aWRlZCxcbiAgICogZm9yIGFsbCByZXNvdXJjZXMgdGhhdCB3ZXJlIG1vdmVkLCB0aGVpciBjb3JyZXNwb25kaW5nIGFkZGl0aW9uXG4gICAqIGFuZCByZW1vdmFsIGxpbmVzIHdpbGwgYmUgYXVnbWVudGVkIHdpdGggdGhlIGxvY2F0aW9uIHRoZXkgd2VyZVxuICAgKiBtb3ZlZCBmb20gYW5kIHRvLCByZXNwZWN0aXZlbHkuXG4gICAqL1xuICByZWFkb25seSBtYXBwaW5ncz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG59XG5cbi8qKlxuICogQ2xhc3MgZm9yIGZvcm1hdHRpbmcgdGhlIGRpZmYgb3V0cHV0XG4gKi9cbmV4cG9ydCBjbGFzcyBEaWZmRm9ybWF0dGVyIHtcbiAgcHJpdmF0ZSByZWFkb25seSB0ZW1wbGF0ZUluZm86IFRlbXBsYXRlSW5mbztcbiAgcHJpdmF0ZSByZWFkb25seSBzdGFja05hbWU6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBpc0ltcG9ydDogYm9vbGVhbjtcbiAgcHJpdmF0ZSByZWFkb25seSBtYXBwaW5nczogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcblxuICAvKipcbiAgICogQ2FjaGUgb2YgY29tcHV0ZWQgVGVtcGxhdGVEaWZmcywgaW5kZXhlZCBieSBzdGFjayBuYW1lLlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBjYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBUZW1wbGF0ZURpZmY+KCk7XG5cbiAgY29uc3RydWN0b3IocHJvcHM6IERpZmZGb3JtYXR0ZXJQcm9wcykge1xuICAgIHRoaXMudGVtcGxhdGVJbmZvID0gcHJvcHMudGVtcGxhdGVJbmZvO1xuICAgIHRoaXMuc3RhY2tOYW1lID0gcHJvcHMudGVtcGxhdGVJbmZvLm5ld1RlbXBsYXRlLmRpc3BsYXlOYW1lID8/IHByb3BzLnRlbXBsYXRlSW5mby5uZXdUZW1wbGF0ZS5zdGFja05hbWU7XG4gICAgdGhpcy5pc0ltcG9ydCA9IHByb3BzLnRlbXBsYXRlSW5mby5pc0ltcG9ydCA/PyBmYWxzZTtcbiAgICB0aGlzLm1hcHBpbmdzID0gcHJvcHMudGVtcGxhdGVJbmZvLm1hcHBpbmdzID8/IHt9O1xuICB9XG5cbiAgcHVibGljIGdldCBkaWZmcygpIHtcbiAgICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKHRoaXMuY2FjaGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbXB1dGUgdGhlIGRpZmYgZm9yIGEgc2luZ2xlIHN0YWNrLiBSZXN1bHRzIGFyZSBjYWNoZWQgYnkgc3RhY2sgbmFtZS5cbiAgICpcbiAgICogQHBhcmFtIHN0YWNrTmFtZSAtIFRoZSBuYW1lIHRvIGNhY2hlIHRoZSBkaWZmIHVuZGVyXG4gICAqIEBwYXJhbSBvbGRUZW1wbGF0ZSAtIFRoZSBkZXBsb3llZCB0ZW1wbGF0ZVxuICAgKiBAcGFyYW0gbmV3VGVtcGxhdGUgLSBUaGUgbmV3L2dlbmVyYXRlZCB0ZW1wbGF0ZSAocmVhZCBmcm9tIHRoZSBhcnRpZmFjdClcbiAgICogQHBhcmFtIGNoYW5nZVNldCAtIFRoZSBDbG91ZEZvcm1hdGlvbiBjaGFuZ2VzZXQgZm9yIHRoaXMgc3BlY2lmaWMgc3RhY2ssIGlmIGF2YWlsYWJsZVxuICAgKiBAcGFyYW0gbWFwcGluZ3MgLSBSZXNvdXJjZSBtb3ZlIG1hcHBpbmdzXG4gICAqL1xuICBwcml2YXRlIGNvbXB1dGVEaWZmKFxuICAgIHN0YWNrTmFtZTogc3RyaW5nLFxuICAgIG9sZFRlbXBsYXRlOiBUZW1wbGF0ZSxcbiAgICBuZXdUZW1wbGF0ZTogVGVtcGxhdGUsXG4gICAgY2hhbmdlU2V0OiBEZXNjcmliZUNoYW5nZVNldE91dHB1dCB8IHVuZGVmaW5lZCxcbiAgICBtYXBwaW5nczogUmVjb3JkPHN0cmluZywgc3RyaW5nPixcbiAgKTogVGVtcGxhdGVEaWZmIHtcbiAgICBpZiAoIXRoaXMuY2FjaGUuaGFzKHN0YWNrTmFtZSkpIHtcbiAgICAgIGNvbnN0IHRlbXBsYXRlRGlmZiA9IGZ1bGxEaWZmKG9sZFRlbXBsYXRlLCBuZXdUZW1wbGF0ZSwgY2hhbmdlU2V0LCB0aGlzLmlzSW1wb3J0KTtcblxuICAgICAgY29uc3Qgc2V0TW92ZSA9IChjaGFuZ2U6IFJlc291cmNlRGlmZmVyZW5jZSwgZGlyZWN0aW9uOiAnZnJvbScgfCAndG8nLCBsb2NhdGlvbj86IHN0cmluZykgPT4ge1xuICAgICAgICBpZiAobG9jYXRpb24gIT0gbnVsbCkge1xuICAgICAgICAgIGNvbnN0IFtzb3VyY2VTdGFja05hbWUsIHNvdXJjZUxvZ2ljYWxJZF0gPSBsb2NhdGlvbi5zcGxpdCgnLicpO1xuICAgICAgICAgIGNoYW5nZS5tb3ZlID0ge1xuICAgICAgICAgICAgZGlyZWN0aW9uLFxuICAgICAgICAgICAgc3RhY2tOYW1lOiBzb3VyY2VTdGFja05hbWUsXG4gICAgICAgICAgICByZXNvdXJjZUxvZ2ljYWxJZDogc291cmNlTG9naWNhbElkLFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIHRlbXBsYXRlRGlmZi5yZXNvdXJjZXMuZm9yRWFjaERpZmZlcmVuY2UoKGlkLCBjaGFuZ2UpID0+IHtcbiAgICAgICAgY29uc3QgbG9jYXRpb24gPSBgJHtzdGFja05hbWV9LiR7aWR9YDtcbiAgICAgICAgaWYgKGNoYW5nZS5pc0FkZGl0aW9uICYmIE9iamVjdC52YWx1ZXMobWFwcGluZ3MpLmluY2x1ZGVzKGxvY2F0aW9uKSkge1xuICAgICAgICAgIHNldE1vdmUoY2hhbmdlLCAnZnJvbScsIE9iamVjdC5rZXlzKG1hcHBpbmdzKS5maW5kKGsgPT4gbWFwcGluZ3Nba10gPT09IGxvY2F0aW9uKSk7XG4gICAgICAgIH0gZWxzZSBpZiAoY2hhbmdlLmlzUmVtb3ZhbCAmJiBPYmplY3Qua2V5cyhtYXBwaW5ncykuaW5jbHVkZXMobG9jYXRpb24pKSB7XG4gICAgICAgICAgc2V0TW92ZShjaGFuZ2UsICd0bycsIG1hcHBpbmdzW2xvY2F0aW9uXSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLmNhY2hlLnNldChzdGFja05hbWUsIHRlbXBsYXRlRGlmZik7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmNhY2hlLmdldChzdGFja05hbWUpITtcbiAgfVxuXG4gIC8qKlxuICAgKiBGb3JtYXQgdGhlIHN0YWNrIGRpZmYsIGluY2x1ZGluZyBhbGwgbmVzdGVkIHN0YWNrcy5cbiAgICovXG4gIHB1YmxpYyBmb3JtYXRTdGFja0RpZmYob3B0aW9uczogRm9ybWF0U3RhY2tEaWZmT3B0aW9ucyA9IHt9KTogRm9ybWF0U3RhY2tEaWZmT3V0cHV0IHtcbiAgICByZXR1cm4gdGhpcy5mb3JtYXRTdGFja0RpZmZIZWxwZXIoe1xuICAgICAgb2xkVGVtcGxhdGU6IHRoaXMudGVtcGxhdGVJbmZvLm9sZFRlbXBsYXRlLFxuICAgICAgbmV3VGVtcGxhdGU6IHRoaXMudGVtcGxhdGVJbmZvLm5ld1RlbXBsYXRlLnRlbXBsYXRlLFxuICAgICAgc3RhY2tOYW1lOiB0aGlzLnN0YWNrTmFtZSxcbiAgICAgIG5lc3RlZFN0YWNrczogdGhpcy50ZW1wbGF0ZUluZm8ubmVzdGVkU3RhY2tzLFxuICAgICAgY2hhbmdlU2V0OiB0aGlzLnRlbXBsYXRlSW5mby5jaGFuZ2VTZXQsXG4gICAgICBtYXBwaW5nczogdGhpcy5tYXBwaW5ncyxcbiAgICAgIGxvZ2ljYWxJZE1hcDogYnVpbGRMb2dpY2FsVG9QYXRoTWFwKHRoaXMudGVtcGxhdGVJbmZvLm5ld1RlbXBsYXRlKS50b1BhdGgsXG4gICAgfSwgb3B0aW9ucyk7XG4gIH1cblxuICBwcml2YXRlIGZvcm1hdFN0YWNrRGlmZkhlbHBlcihwYXJhbXM6IHtcbiAgICBvbGRUZW1wbGF0ZTogVGVtcGxhdGU7XG4gICAgbmV3VGVtcGxhdGU6IFRlbXBsYXRlO1xuICAgIHN0YWNrTmFtZTogc3RyaW5nO1xuICAgIG5lc3RlZFN0YWNrczogeyBbbmVzdGVkU3RhY2tMb2dpY2FsSWQ6IHN0cmluZ106IE5lc3RlZFN0YWNrVGVtcGxhdGVzIH0gfCB1bmRlZmluZWQ7XG4gICAgY2hhbmdlU2V0OiBEZXNjcmliZUNoYW5nZVNldE91dHB1dCB8IHVuZGVmaW5lZDtcbiAgICBtYXBwaW5nczogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgICBsb2dpY2FsSWRNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIH0sIG9wdGlvbnM6IFJldXNhYmxlU3RhY2tEaWZmT3B0aW9ucyA9IHt9KTogRm9ybWF0U3RhY2tEaWZmT3V0cHV0IHtcbiAgICBjb25zdCB7IG9sZFRlbXBsYXRlLCBuZXdUZW1wbGF0ZSwgc3RhY2tOYW1lLCBuZXN0ZWRTdGFja3MsIGNoYW5nZVNldCwgbWFwcGluZ3MsIGxvZ2ljYWxJZE1hcCB9ID0gcGFyYW1zO1xuXG4gICAgY29uc3QgZGlmZiA9IHRoaXMuY29tcHV0ZURpZmYoc3RhY2tOYW1lLCBvbGRUZW1wbGF0ZSwgbmV3VGVtcGxhdGUsIGNoYW5nZVNldCwgbWFwcGluZ3MpO1xuXG4gICAgY29uc3Qgc3RyZWFtID0gbmV3IFN0cmluZ1dyaXRlU3RyZWFtKCk7XG4gICAgbGV0IG51bVN0YWNrc1dpdGhDaGFuZ2VzID0gMDtcbiAgICBsZXQgZm9ybWF0dGVkRGlmZiA9ICcnO1xuICAgIGxldCBmaWx0ZXJlZENoYW5nZXNDb3VudCA9IDA7XG5cbiAgICB0cnkge1xuICAgICAgLy8gbXVzdCBvdXRwdXQgdGhlIHN0YWNrIG5hbWUgaWYgdGhlcmUgYXJlIGRpZmZlcmVuY2VzLCBldmVuIGlmIHF1aWV0XG4gICAgICBpZiAoc3RhY2tOYW1lICYmICghb3B0aW9ucy5xdWlldCB8fCAhZGlmZi5pc0VtcHR5KSkge1xuICAgICAgICBzdHJlYW0ud3JpdGUoZm9ybWF0KGBTdGFjayAke2NoYWxrLmJvbGQoc3RhY2tOYW1lKX1cXG5gKSk7XG4gICAgICB9XG5cbiAgICAgIGlmICghb3B0aW9ucy5xdWlldCAmJiB0aGlzLmlzSW1wb3J0KSB7XG4gICAgICAgIHN0cmVhbS53cml0ZSgnUGFyYW1ldGVycyBhbmQgcnVsZXMgY3JlYXRlZCBkdXJpbmcgbWlncmF0aW9uIGRvIG5vdCBhZmZlY3QgcmVzb3VyY2UgY29uZmlndXJhdGlvbi5cXG4nKTtcbiAgICAgIH1cblxuICAgICAgLy8gZGV0ZWN0IGFuZCBmaWx0ZXIgb3V0IG1hbmdsZWQgY2hhcmFjdGVycyBmcm9tIHRoZSBkaWZmXG4gICAgICBsZXQgYWN0aXZlRGlmZiA9IGRpZmY7XG4gICAgICBpZiAoZGlmZi5kaWZmZXJlbmNlQ291bnQgJiYgIW9wdGlvbnMuc3RyaWN0KSB7XG4gICAgICAgIGNvbnN0IG1hbmdsZWROZXdUZW1wbGF0ZSA9IEpTT04ucGFyc2UobWFuZ2xlTGlrZUNsb3VkRm9ybWF0aW9uKEpTT04uc3RyaW5naWZ5KG5ld1RlbXBsYXRlKSkpO1xuICAgICAgICBjb25zdCBtYW5nbGVkRGlmZiA9IGZ1bGxEaWZmKG9sZFRlbXBsYXRlLCBtYW5nbGVkTmV3VGVtcGxhdGUsIGNoYW5nZVNldCk7XG4gICAgICAgIGZpbHRlcmVkQ2hhbmdlc0NvdW50ID0gTWF0aC5tYXgoMCwgZGlmZi5kaWZmZXJlbmNlQ291bnQgLSBtYW5nbGVkRGlmZi5kaWZmZXJlbmNlQ291bnQpO1xuICAgICAgICBpZiAoZmlsdGVyZWRDaGFuZ2VzQ291bnQgPiAwKSB7XG4gICAgICAgICAgYWN0aXZlRGlmZiA9IG1hbmdsZWREaWZmO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIGZpbHRlciBvdXQgJ0FXUzo6Q0RLOjpNZXRhZGF0YScgcmVzb3VyY2VzIGZyb20gdGhlIHRlbXBsYXRlXG4gICAgICAvLyBmaWx0ZXIgb3V0ICdDaGVja0Jvb3RzdHJhcFZlcnNpb24nIHJ1bGVzIGZyb20gdGhlIHRlbXBsYXRlXG4gICAgICBjb25zdCBkaWZmV2FzTm9uRW1wdHkgPSAhYWN0aXZlRGlmZi5pc0VtcHR5O1xuICAgICAgaWYgKCFvcHRpb25zLnN0cmljdCkge1xuICAgICAgICBvYnNjdXJlRGlmZihhY3RpdmVEaWZmKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG1ldGFkYXRhV2FzRmlsdGVyZWQgPSBkaWZmV2FzTm9uRW1wdHkgJiYgYWN0aXZlRGlmZi5pc0VtcHR5O1xuXG4gICAgICBpZiAoIWFjdGl2ZURpZmYuaXNFbXB0eSkge1xuICAgICAgICBudW1TdGFja3NXaXRoQ2hhbmdlcysrO1xuXG4gICAgICAgIGZvcm1hdERpZmZlcmVuY2VzKHN0cmVhbSwgYWN0aXZlRGlmZiwge1xuICAgICAgICAgIC4uLmxvZ2ljYWxJZE1hcEZyb21UZW1wbGF0ZShvbGRUZW1wbGF0ZSksXG4gICAgICAgICAgLi4ubG9naWNhbElkTWFwRnJvbVRlbXBsYXRlKG5ld1RlbXBsYXRlKSxcbiAgICAgICAgICAuLi5sb2dpY2FsSWRNYXAsXG4gICAgICAgIH0sIG9wdGlvbnMuY29udGV4dExpbmVzKTtcbiAgICAgIH0gZWxzZSBpZiAoIW9wdGlvbnMucXVpZXQpIHtcbiAgICAgICAgY29uc3QgaGludCA9IG1ldGFkYXRhV2FzRmlsdGVyZWQgPyBjaGFsay5ncmV5KCcgKENESyBtZXRhZGF0YSBjaGFuZ2VzIHdlcmUgaGlkZGVuLCBydW4gY2RrIGRpZmYgLS1zdHJpY3QgdG8gc2hvdyknKSA6ICcnO1xuICAgICAgICBzdHJlYW0ud3JpdGUoYCR7Y2hhbGsuZ3JlZW4oJ1RoZXJlIHdlcmUgbm8gZGlmZmVyZW5jZXMnKX0ke2hpbnR9XFxuYCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChmaWx0ZXJlZENoYW5nZXNDb3VudCA+IDApIHtcbiAgICAgICAgc3RyZWFtLndyaXRlKGNoYWxrLnllbGxvdyhgT21pdHRlZCAke2ZpbHRlcmVkQ2hhbmdlc0NvdW50fSBjaGFuZ2VzIGJlY2F1c2UgdGhleSBhcmUgbGlrZWx5IG1hbmdsZWQgbm9uLUFTQ0lJIGNoYXJhY3RlcnMuIFVzZSAtLXN0cmljdCB0byBwcmludCB0aGVtLlxcbmApKTtcbiAgICAgIH1cbiAgICB9IGZpbmFsbHkge1xuICAgICAgZm9ybWF0dGVkRGlmZiA9IHN0cmVhbS50b1N0cmluZygpO1xuICAgICAgc3RyZWFtLmVuZCgpO1xuICAgIH1cblxuICAgIC8vIFJlY3Vyc2UgaW50byBuZXN0ZWQgc3RhY2tzXG4gICAgZm9yIChjb25zdCBbbG9naWNhbElkLCBuZXN0ZWRTdGFja10gb2YgT2JqZWN0LmVudHJpZXMobmVzdGVkU3RhY2tzID8/IHt9KSkge1xuICAgICAgY29uc3QgbmV4dERpZmYgPSB0aGlzLmZvcm1hdFN0YWNrRGlmZkhlbHBlcih7XG4gICAgICAgIG9sZFRlbXBsYXRlOiBuZXN0ZWRTdGFjay5kZXBsb3llZFRlbXBsYXRlLFxuICAgICAgICBuZXdUZW1wbGF0ZTogbmVzdGVkU3RhY2suZ2VuZXJhdGVkVGVtcGxhdGUsXG4gICAgICAgIHN0YWNrTmFtZTogbmVzdGVkU3RhY2sucGh5c2ljYWxOYW1lID8/IGxvZ2ljYWxJZCxcbiAgICAgICAgbmVzdGVkU3RhY2tzOiBuZXN0ZWRTdGFjay5uZXN0ZWRTdGFja1RlbXBsYXRlcyxcbiAgICAgICAgY2hhbmdlU2V0OiBuZXN0ZWRTdGFjay5jaGFuZ2VTZXQsXG4gICAgICAgIG1hcHBpbmdzLFxuICAgICAgICBsb2dpY2FsSWRNYXA6IHt9LFxuICAgICAgfSwgb3B0aW9ucyk7XG4gICAgICBudW1TdGFja3NXaXRoQ2hhbmdlcyArPSBuZXh0RGlmZi5udW1TdGFja3NXaXRoQ2hhbmdlcztcbiAgICAgIGZvcm1hdHRlZERpZmYgKz0gbmV4dERpZmYuZm9ybWF0dGVkRGlmZjtcbiAgICB9XG5cbiAgICByZXR1cm4geyBudW1TdGFja3NXaXRoQ2hhbmdlcywgZm9ybWF0dGVkRGlmZiB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEZvcm1hdCB0aGUgc2VjdXJpdHkgZGlmZiwgaW5jbHVkaW5nIGFsbCBuZXN0ZWQgc3RhY2tzLlxuICAgKi9cbiAgcHVibGljIGZvcm1hdFNlY3VyaXR5RGlmZihvcHRpb25zOiBGb3JtYXRTZWN1cml0eURpZmZPcHRpb25zID0ge30pOiBGb3JtYXRTZWN1cml0eURpZmZPdXRwdXQge1xuICAgIGNvbnN0IHsgZm9ybWF0dGVkRGlmZiwgcGVybWlzc2lvbkNoYW5nZVR5cGUsIG51bVN0YWNrc1dpdGhDaGFuZ2VzIH0gPSB0aGlzLmZvcm1hdFNlY3VyaXR5RGlmZkhlbHBlcih7XG4gICAgICBvbGRUZW1wbGF0ZTogdGhpcy50ZW1wbGF0ZUluZm8ub2xkVGVtcGxhdGUsXG4gICAgICBuZXdUZW1wbGF0ZTogdGhpcy50ZW1wbGF0ZUluZm8ubmV3VGVtcGxhdGUudGVtcGxhdGUsXG4gICAgICBzdGFja05hbWU6IHRoaXMuc3RhY2tOYW1lLFxuICAgICAgbmVzdGVkU3RhY2tzOiB0aGlzLnRlbXBsYXRlSW5mby5uZXN0ZWRTdGFja3MsXG4gICAgICBjaGFuZ2VTZXQ6IHRoaXMudGVtcGxhdGVJbmZvLmNoYW5nZVNldCxcbiAgICAgIGxvZ2ljYWxJZE1hcDogYnVpbGRMb2dpY2FsVG9QYXRoTWFwKHRoaXMudGVtcGxhdGVJbmZvLm5ld1RlbXBsYXRlKS50b1BhdGgsXG4gICAgfSwgb3B0aW9ucyk7XG5cbiAgICByZXR1cm4geyBmb3JtYXR0ZWREaWZmLCBwZXJtaXNzaW9uQ2hhbmdlVHlwZSwgbnVtU3RhY2tzV2l0aENoYW5nZXMgfTtcbiAgfVxuXG4gIHByaXZhdGUgZm9ybWF0U2VjdXJpdHlEaWZmSGVscGVyKHBhcmFtczoge1xuICAgIG9sZFRlbXBsYXRlOiBUZW1wbGF0ZTtcbiAgICBuZXdUZW1wbGF0ZTogVGVtcGxhdGU7XG4gICAgc3RhY2tOYW1lOiBzdHJpbmc7XG4gICAgbmVzdGVkU3RhY2tzOiB7IFtuZXN0ZWRTdGFja0xvZ2ljYWxJZDogc3RyaW5nXTogTmVzdGVkU3RhY2tUZW1wbGF0ZXMgfSB8IHVuZGVmaW5lZDtcbiAgICBjaGFuZ2VTZXQ6IERlc2NyaWJlQ2hhbmdlU2V0T3V0cHV0IHwgdW5kZWZpbmVkO1xuICAgIGxvZ2ljYWxJZE1hcD86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIH0sIG9wdGlvbnM6IEZvcm1hdFNlY3VyaXR5RGlmZk9wdGlvbnMgPSB7fSk6IEZvcm1hdFNlY3VyaXR5RGlmZk91dHB1dCB7XG4gICAgY29uc3QgeyBvbGRUZW1wbGF0ZSwgbmV3VGVtcGxhdGUsIHN0YWNrTmFtZSwgbmVzdGVkU3RhY2tzLCBjaGFuZ2VTZXQsIGxvZ2ljYWxJZE1hcCB9ID0gcGFyYW1zO1xuXG4gICAgY29uc3QgZGlmZiA9IHRoaXMuY29tcHV0ZURpZmYoc3RhY2tOYW1lLCBvbGRUZW1wbGF0ZSwgbmV3VGVtcGxhdGUsIGNoYW5nZVNldCwgdGhpcy5tYXBwaW5ncyk7XG4gICAgY29uc3QgcGVybWlzc2lvbkNoYW5nZVR5cGUgPSBwZXJtaXNzaW9uVHlwZUZyb21EaWZmKGRpZmYpO1xuXG4gICAgY29uc3Qgc3RyZWFtID0gbmV3IFN0cmluZ1dyaXRlU3RyZWFtKCk7XG4gICAgaWYgKCFvcHRpb25zLnF1aWV0IHx8IHBlcm1pc3Npb25DaGFuZ2VUeXBlICE9PSBQZXJtaXNzaW9uQ2hhbmdlVHlwZS5OT05FKSB7XG4gICAgICBzdHJlYW0ud3JpdGUoZm9ybWF0KGBTdGFjayAke2NoYWxrLmJvbGQoc3RhY2tOYW1lKX1cXG5gKSk7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGZvcm1hdFNlY3VyaXR5Q2hhbmdlcyhzdHJlYW0sIGRpZmYsIHtcbiAgICAgICAgLi4ubG9naWNhbElkTWFwRnJvbVRlbXBsYXRlKG5ld1RlbXBsYXRlKSxcbiAgICAgICAgLi4ubG9naWNhbElkTWFwLFxuICAgICAgfSk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHN0cmVhbS5lbmQoKTtcbiAgICB9XG5cbiAgICBsZXQgZm9ybWF0dGVkRGlmZiA9IHN0cmVhbS50b1N0cmluZygpO1xuICAgIGlmICghb3B0aW9ucy5xdWlldCAmJiBwZXJtaXNzaW9uQ2hhbmdlVHlwZSA9PT0gUGVybWlzc2lvbkNoYW5nZVR5cGUuTk9ORSkge1xuICAgICAgZm9ybWF0dGVkRGlmZiArPSBjaGFsay5ncmVlbignVGhlcmUgd2VyZSBubyBzZWN1cml0eS1yZWxhdGVkIGNoYW5nZXMgKGxpbWl0YXRpb25zOiBodHRwczovL2dpdGh1Yi5jb20vYXdzL2F3cy1jZGsvaXNzdWVzLzEyOTkpXFxuJyk7XG4gICAgfVxuICAgIGxldCBudW1TdGFja3NXaXRoQ2hhbmdlcyA9IHBlcm1pc3Npb25DaGFuZ2VUeXBlICE9PSBQZXJtaXNzaW9uQ2hhbmdlVHlwZS5OT05FID8gMSA6IDA7XG4gICAgbGV0IGVzY2FsYXRlZFBlcm1pc3Npb25UeXBlID0gcGVybWlzc2lvbkNoYW5nZVR5cGU7XG5cbiAgICAvLyBSZWN1cnNlIGludG8gbmVzdGVkIHN0YWNrc1xuICAgIGZvciAoY29uc3QgW2xvZ2ljYWxJZCwgbmVzdGVkU3RhY2tdIG9mIE9iamVjdC5lbnRyaWVzKG5lc3RlZFN0YWNrcyA/PyB7fSkpIHtcbiAgICAgIGNvbnN0IG5lc3RlZFJlc3VsdCA9IHRoaXMuZm9ybWF0U2VjdXJpdHlEaWZmSGVscGVyKHtcbiAgICAgICAgb2xkVGVtcGxhdGU6IG5lc3RlZFN0YWNrLmRlcGxveWVkVGVtcGxhdGUsXG4gICAgICAgIG5ld1RlbXBsYXRlOiBuZXN0ZWRTdGFjay5nZW5lcmF0ZWRUZW1wbGF0ZSxcbiAgICAgICAgc3RhY2tOYW1lOiBuZXN0ZWRTdGFjay5waHlzaWNhbE5hbWUgPz8gbG9naWNhbElkLFxuICAgICAgICBuZXN0ZWRTdGFja3M6IG5lc3RlZFN0YWNrLm5lc3RlZFN0YWNrVGVtcGxhdGVzLFxuICAgICAgICBjaGFuZ2VTZXQ6IG5lc3RlZFN0YWNrLmNoYW5nZVNldCxcbiAgICAgIH0sIG9wdGlvbnMpO1xuICAgICAgZm9ybWF0dGVkRGlmZiArPSBuZXN0ZWRSZXN1bHQuZm9ybWF0dGVkRGlmZiA/ICdcXG4nICsgbmVzdGVkUmVzdWx0LmZvcm1hdHRlZERpZmYgOiAnJztcbiAgICAgIG51bVN0YWNrc1dpdGhDaGFuZ2VzICs9IG5lc3RlZFJlc3VsdC5udW1TdGFja3NXaXRoQ2hhbmdlcztcbiAgICAgIC8vIEVzY2FsYXRlOiBpZiBhbnkgbmVzdGVkIHN0YWNrIGJyb2FkZW5zIHBlcm1pc3Npb25zLCB0aGUgd2hvbGUgdGhpbmcgYnJvYWRlbnNcbiAgICAgIGlmIChuZXN0ZWRSZXN1bHQucGVybWlzc2lvbkNoYW5nZVR5cGUgPT09IFBlcm1pc3Npb25DaGFuZ2VUeXBlLkJST0FERU5JTkcpIHtcbiAgICAgICAgZXNjYWxhdGVkUGVybWlzc2lvblR5cGUgPSBQZXJtaXNzaW9uQ2hhbmdlVHlwZS5CUk9BREVOSU5HO1xuICAgICAgfSBlbHNlIGlmIChuZXN0ZWRSZXN1bHQucGVybWlzc2lvbkNoYW5nZVR5cGUgPT09IFBlcm1pc3Npb25DaGFuZ2VUeXBlLk5PTl9CUk9BREVOSU5HXG4gICAgICAgICYmIGVzY2FsYXRlZFBlcm1pc3Npb25UeXBlID09PSBQZXJtaXNzaW9uQ2hhbmdlVHlwZS5OT05FKSB7XG4gICAgICAgIGVzY2FsYXRlZFBlcm1pc3Npb25UeXBlID0gUGVybWlzc2lvbkNoYW5nZVR5cGUuTk9OX0JST0FERU5JTkc7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgZm9ybWF0dGVkRGlmZiwgcGVybWlzc2lvbkNoYW5nZVR5cGU6IGVzY2FsYXRlZFBlcm1pc3Npb25UeXBlLCBudW1TdGFja3NXaXRoQ2hhbmdlcyB9O1xuICB9XG59XG5cbmZ1bmN0aW9uIHBlcm1pc3Npb25UeXBlRnJvbURpZmYoZGlmZjogVGVtcGxhdGVEaWZmKTogUGVybWlzc2lvbkNoYW5nZVR5cGUge1xuICBpZiAoZGlmZi5wZXJtaXNzaW9uc0Jyb2FkZW5lZCkge1xuICAgIHJldHVybiBQZXJtaXNzaW9uQ2hhbmdlVHlwZS5CUk9BREVOSU5HO1xuICB9IGVsc2UgaWYgKGRpZmYucGVybWlzc2lvbnNBbnlDaGFuZ2VzKSB7XG4gICAgcmV0dXJuIFBlcm1pc3Npb25DaGFuZ2VUeXBlLk5PTl9CUk9BREVOSU5HO1xuICB9XG4gIHJldHVybiBQZXJtaXNzaW9uQ2hhbmdlVHlwZS5OT05FO1xufVxuXG5mdW5jdGlvbiBsb2dpY2FsSWRNYXBGcm9tVGVtcGxhdGUodGVtcGxhdGU6IFRlbXBsYXRlKSB7XG4gIGNvbnN0IHJldDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuXG4gIGZvciAoY29uc3QgW2xvZ2ljYWxJZCwgcmVzb3VyY2VdIG9mIE9iamVjdC5lbnRyaWVzKCh0ZW1wbGF0ZS5SZXNvdXJjZXMgPz8ge30pIGFzIFJlY29yZDxzdHJpbmcsIGFueT4pKSB7XG4gICAgY29uc3QgcGF0aCA9IHJlc291cmNlPy5NZXRhZGF0YT8uWydhd3M6Y2RrOnBhdGgnXTtcbiAgICBpZiAocGF0aCkge1xuICAgICAgcmV0W2xvZ2ljYWxJZF0gPSBwYXRoO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmV0O1xufVxuXG4vKipcbiAqIFJlbW92ZSBhbnkgdGVtcGxhdGUgZWxlbWVudHMgdGhhdCB3ZSBkb24ndCB3YW50IHRvIHNob3cgdXNlcnMuXG4gKiBUaGlzIGlzIGN1cnJlbnRseTpcbiAqIC0gQVdTOjpDREs6Ok1ldGFkYXRhIHJlc291cmNlXG4gKiAtIENoZWNrQm9vdHN0cmFwVmVyc2lvbiBSdWxlXG4gKi9cbmZ1bmN0aW9uIG9ic2N1cmVEaWZmKGRpZmY6IFRlbXBsYXRlRGlmZikge1xuICBpZiAoZGlmZi51bmtub3duKSB7XG4gICAgLy8gc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9hd3MvYXdzLWNkay9pc3N1ZXMvMTc5NDJcbiAgICBkaWZmLnVua25vd24gPSBkaWZmLnVua25vd24uZmlsdGVyKGNoYW5nZSA9PiB7XG4gICAgICBpZiAoIWNoYW5nZSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGlmIChjaGFuZ2UubmV3VmFsdWU/LkNoZWNrQm9vdHN0cmFwVmVyc2lvbikge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBpZiAoY2hhbmdlLm9sZFZhbHVlPy5DaGVja0Jvb3RzdHJhcFZlcnNpb24pIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSk7XG4gIH1cblxuICBpZiAoZGlmZi5yZXNvdXJjZXMpIHtcbiAgICBkaWZmLnJlc291cmNlcyA9IGRpZmYucmVzb3VyY2VzLmZpbHRlcihjaGFuZ2UgPT4ge1xuICAgICAgaWYgKCFjaGFuZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICBpZiAoY2hhbmdlLm5ld1Jlc291cmNlVHlwZSA9PT0gJ0FXUzo6Q0RLOjpNZXRhZGF0YScpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgaWYgKGNoYW5nZS5vbGRSZXNvdXJjZVR5cGUgPT09ICdBV1M6OkNESzo6TWV0YWRhdGEnKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0pO1xuICB9XG59XG4iXX0=