cdk-cost-analyzer 0.1.39 → 0.1.40

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.
@@ -1,4 +1,5 @@
1
1
  export { Reporter } from './Reporter';
2
2
  export { SingleTemplateReporter } from './SingleTemplateReporter';
3
3
  export { GitHubActionReporter } from './GitHubActionReporter';
4
+ export { ServiceBreakdown, getTrendIndicator, getPercentageChange, extractServiceName, groupCostsByService, calculateTotalCosts, } from './markdownUtils';
4
5
  export * from './types';
@@ -0,0 +1,30 @@
1
+ import { CostDelta } from '../pricing/types';
2
+ /** Service breakdown entry for cost grouping */
3
+ export interface ServiceBreakdown {
4
+ service: string;
5
+ totalCost: number;
6
+ resourceCount: number;
7
+ }
8
+ /**
9
+ * Get trend indicator emoji based on cost change direction
10
+ */
11
+ export declare function getTrendIndicator(amount: number): string;
12
+ /**
13
+ * Calculate percentage change between old and new amounts
14
+ */
15
+ export declare function getPercentageChange(oldAmount: number, newAmount: number): string;
16
+ /**
17
+ * Extract AWS service name from resource type (e.g., AWS::EC2::Instance -> EC2)
18
+ */
19
+ export declare function extractServiceName(resourceType: string): string;
20
+ /**
21
+ * Group costs by AWS service (e.g., EC2, S3, Lambda)
22
+ */
23
+ export declare function groupCostsByService(costDelta: CostDelta): ServiceBreakdown[];
24
+ /**
25
+ * Calculate total costs before and after changes
26
+ */
27
+ export declare function calculateTotalCosts(costDelta: CostDelta): {
28
+ before: number;
29
+ after: number;
30
+ };
@@ -1 +1 @@
1
- v0.1.39
1
+ v0.1.40
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.Reporter = void 0;
4
+ const markdownUtils_1 = require("./markdownUtils");
4
5
  class Reporter {
5
6
  generateReport(costDelta, format, options) {
6
7
  switch (format) {
@@ -85,29 +86,21 @@ class Reporter {
85
86
  }
86
87
  generateMarkdownReport(costDelta, options) {
87
88
  const lines = [];
88
- lines.push('# CDK Cost Analysis Report');
89
+ const totalCosts = (0, markdownUtils_1.calculateTotalCosts)(costDelta);
90
+ const trendIndicator = (0, markdownUtils_1.getTrendIndicator)(costDelta.totalDelta);
91
+ lines.push('# 💰 Cost Impact Analysis');
89
92
  lines.push('');
90
- // Add configuration summary if provided
91
- if (options?.configSummary) {
92
- lines.push(...this.formatConfigSummaryMarkdown(options.configSummary));
93
- lines.push('');
94
- }
95
- // Add threshold status if provided
96
- if (options?.thresholdStatus) {
97
- lines.push(...this.formatThresholdStatusMarkdown(options.thresholdStatus, costDelta));
98
- lines.push('');
99
- }
100
- // Show total cost delta
101
- lines.push(`**Total Cost Delta:** ${this.formatDelta(costDelta.totalDelta, costDelta.currency)}`);
93
+ lines.push(`**Monthly Cost Change:** ${this.formatDelta(costDelta.totalDelta, costDelta.currency)} ${trendIndicator}`);
102
94
  lines.push('');
103
95
  // If multi-stack, show per-stack breakdowns
104
96
  if (options?.multiStack && options?.stacks && options.stacks.length > 1) {
105
97
  lines.push('## Per-Stack Cost Breakdown');
106
98
  lines.push('');
107
- lines.push('| Stack | Cost Delta |');
108
- lines.push('|-------|------------|');
99
+ lines.push('| Stack | Cost Delta | Trend |');
100
+ lines.push('|-------|------------|-------|');
109
101
  for (const stack of options.stacks) {
110
- lines.push(`| ${stack.stackName} | ${this.formatDelta(stack.costDelta.totalDelta, stack.costDelta.currency)} |`);
102
+ const stackTrend = (0, markdownUtils_1.getTrendIndicator)(stack.costDelta.totalDelta);
103
+ lines.push(`| ${stack.stackName} | ${this.formatDelta(stack.costDelta.totalDelta, stack.costDelta.currency)} | ${stackTrend} |`);
111
104
  }
112
105
  lines.push('');
113
106
  lines.push('<details>');
@@ -122,42 +115,83 @@ class Reporter {
122
115
  lines.push('</details>');
123
116
  lines.push('');
124
117
  }
118
+ // Add threshold status if provided
119
+ if (options?.thresholdStatus) {
120
+ lines.push(...this.formatThresholdStatusMarkdown(options.thresholdStatus, costDelta));
121
+ lines.push('');
122
+ }
123
+ // Added Resources
125
124
  if (costDelta.addedCosts.length > 0) {
126
- lines.push('## Added Resources');
125
+ lines.push('## 📈 Added Resources');
127
126
  lines.push('');
128
- lines.push('| Logical ID | Type | Monthly Cost |');
129
- lines.push('|------------|------|--------------|');
127
+ lines.push('| Resource | Type | Monthly Cost |');
128
+ lines.push('|----------|------|--------------|');
130
129
  const sortedAdded = [...costDelta.addedCosts].sort((a, b) => b.monthlyCost.amount - a.monthlyCost.amount);
131
130
  for (const resource of sortedAdded) {
132
- lines.push(`| ${resource.logicalId} | ${resource.type} | ${this.formatCurrency(resource.monthlyCost.amount, costDelta.currency)} |`);
131
+ lines.push(`| ${resource.logicalId} | \`${resource.type}\` | ${this.formatCurrency(resource.monthlyCost.amount, costDelta.currency)} |`);
132
+ }
133
+ lines.push('');
134
+ }
135
+ // Modified Resources
136
+ if (costDelta.modifiedCosts.length > 0) {
137
+ lines.push('## 🔄 Modified Resources');
138
+ lines.push('');
139
+ lines.push('| Resource | Type | Before | After | Change |');
140
+ lines.push('|----------|------|--------|-------|--------|');
141
+ const sortedModified = [...costDelta.modifiedCosts].sort((a, b) => Math.abs(b.costDelta) - Math.abs(a.costDelta));
142
+ for (const resource of sortedModified) {
143
+ const trend = (0, markdownUtils_1.getTrendIndicator)(resource.costDelta);
144
+ const percentChange = (0, markdownUtils_1.getPercentageChange)(resource.oldMonthlyCost.amount, resource.newMonthlyCost.amount);
145
+ lines.push(`| ${resource.logicalId} | \`${resource.type}\` | ` +
146
+ `${this.formatCurrency(resource.oldMonthlyCost.amount, costDelta.currency)} | ` +
147
+ `${this.formatCurrency(resource.newMonthlyCost.amount, costDelta.currency)} | ` +
148
+ `${this.formatDelta(resource.costDelta, costDelta.currency)} (${percentChange}) ${trend} |`);
133
149
  }
134
150
  lines.push('');
135
151
  }
152
+ // Removed Resources
136
153
  if (costDelta.removedCosts.length > 0) {
137
- lines.push('## Removed Resources');
154
+ lines.push('## 📉 Removed Resources');
138
155
  lines.push('');
139
- lines.push('| Logical ID | Type | Monthly Cost |');
140
- lines.push('|------------|------|--------------|');
156
+ lines.push('| Resource | Type | Monthly Savings |');
157
+ lines.push('|----------|------|-----------------|');
141
158
  const sortedRemoved = [...costDelta.removedCosts].sort((a, b) => b.monthlyCost.amount - a.monthlyCost.amount);
142
159
  for (const resource of sortedRemoved) {
143
- lines.push(`| ${resource.logicalId} | ${resource.type} | ${this.formatCurrency(resource.monthlyCost.amount, costDelta.currency)} |`);
160
+ lines.push(`| ${resource.logicalId} | \`${resource.type}\` | ${this.formatCurrency(resource.monthlyCost.amount, costDelta.currency)} |`);
144
161
  }
145
162
  lines.push('');
146
163
  }
147
- if (costDelta.modifiedCosts.length > 0) {
148
- lines.push('## Modified Resources');
164
+ // Total Monthly Cost
165
+ lines.push('## 💵 Total Monthly Cost');
166
+ lines.push('');
167
+ lines.push('| Metric | Value |');
168
+ lines.push('|--------|-------|');
169
+ lines.push(`| Before | ${this.formatCurrency(totalCosts.before, costDelta.currency)} |`);
170
+ lines.push(`| After | ${this.formatCurrency(totalCosts.after, costDelta.currency)} |`);
171
+ lines.push(`| Change | ${this.formatDelta(costDelta.totalDelta, costDelta.currency)} ${trendIndicator} |`);
172
+ lines.push('');
173
+ // Cost Breakdown by Service
174
+ const serviceBreakdown = (0, markdownUtils_1.groupCostsByService)(costDelta);
175
+ if (serviceBreakdown.length > 0) {
176
+ lines.push('## 📊 Cost Breakdown by Service');
149
177
  lines.push('');
150
- lines.push('| Logical ID | Type | Old Cost | New Cost | Delta |');
151
- lines.push('|------------|------|----------|----------|-------|');
152
- const sortedModified = [...costDelta.modifiedCosts].sort((a, b) => Math.abs(b.costDelta) - Math.abs(a.costDelta));
153
- for (const resource of sortedModified) {
154
- lines.push(`| ${resource.logicalId} | ${resource.type} | ` +
155
- `${this.formatCurrency(resource.oldMonthlyCost.amount, costDelta.currency)} | ` +
156
- `${this.formatCurrency(resource.newMonthlyCost.amount, costDelta.currency)} | ` +
157
- `${this.formatDelta(resource.costDelta, costDelta.currency)} |`);
178
+ lines.push('| Service | Resources | Cost Impact | Trend |');
179
+ lines.push('|---------|-----------|-------------|-------|');
180
+ for (const service of serviceBreakdown) {
181
+ const serviceTrend = (0, markdownUtils_1.getTrendIndicator)(service.totalCost);
182
+ lines.push(`| ${service.service} | ${service.resourceCount} | ${this.formatDelta(service.totalCost, costDelta.currency)} | ${serviceTrend} |`);
158
183
  }
159
184
  lines.push('');
160
185
  }
186
+ // Configuration & Assumptions (collapsible)
187
+ if (options?.configSummary) {
188
+ lines.push(...this.formatConfigSummaryMarkdown(options.configSummary));
189
+ lines.push('');
190
+ }
191
+ // Footer
192
+ lines.push('---');
193
+ lines.push('');
194
+ lines.push('*Powered by [cdk-cost-analyzer](https://github.com/buildinginthecloud/cdk-cost-analyzer) | [Configuration Reference](https://github.com/buildinginthecloud/cdk-cost-analyzer/blob/main/docs/CONFIGURATION.md)*');
161
195
  return lines.join('\n');
162
196
  }
163
197
  formatResourceLine(resource) {
@@ -243,7 +277,7 @@ class Reporter {
243
277
  formatConfigSummaryMarkdown(config) {
244
278
  const lines = [];
245
279
  lines.push('<details>');
246
- lines.push('<summary><strong>Configuration Summary</strong></summary>');
280
+ lines.push('<summary><strong>📋 Configuration & Assumptions</strong></summary>');
247
281
  lines.push('');
248
282
  if (config.configPath) {
249
283
  lines.push(`**Configuration File:** \`${config.configPath}\``);
@@ -295,8 +329,9 @@ class Reporter {
295
329
  return lines;
296
330
  }
297
331
  const passed = threshold.passed;
332
+ const statusEmoji = passed ? '✅' : '🚨';
298
333
  const status = passed ? 'PASSED' : 'EXCEEDED';
299
- lines.push(`## Threshold Status: ${status}`);
334
+ lines.push(`## ${statusEmoji} Threshold Status: ${status}`);
300
335
  lines.push('');
301
336
  if (threshold.threshold !== undefined) {
302
337
  lines.push(`**Threshold:** $${threshold.threshold.toFixed(2)}/month (${threshold.level})`);
@@ -304,12 +339,12 @@ class Reporter {
304
339
  lines.push(`**Actual Delta:** ${this.formatDelta(threshold.delta, costDelta.currency)}/month`);
305
340
  lines.push('');
306
341
  if (!passed) {
307
- lines.push('### Action Required');
342
+ lines.push('### ⚠️ Action Required');
308
343
  lines.push('');
309
344
  lines.push(threshold.message);
310
345
  lines.push('');
311
346
  if (threshold.recommendations && threshold.recommendations.length > 0) {
312
- lines.push('### Recommendations');
347
+ lines.push('### 💡 Recommendations');
313
348
  lines.push('');
314
349
  for (const rec of threshold.recommendations) {
315
350
  lines.push(`- ${rec}`);
@@ -319,12 +354,13 @@ class Reporter {
319
354
  // Show top cost contributors
320
355
  const topContributors = this.getTopCostContributors(costDelta, 5);
321
356
  if (topContributors.length > 0) {
322
- lines.push('### Top Cost Contributors');
357
+ lines.push('### 🔝 Top Cost Contributors');
323
358
  lines.push('');
324
- lines.push('| Resource | Type | Impact |');
325
- lines.push('|----------|------|--------|');
359
+ lines.push('| Resource | Type | Impact | Trend |');
360
+ lines.push('|----------|------|--------|-------|');
326
361
  for (const contributor of topContributors) {
327
- lines.push(`| ${contributor.logicalId} | ${contributor.type} | ${this.formatDelta(contributor.impact, costDelta.currency)} |`);
362
+ const trend = (0, markdownUtils_1.getTrendIndicator)(contributor.impact);
363
+ lines.push(`| ${contributor.logicalId} | \`${contributor.type}\` | ${this.formatDelta(contributor.impact, costDelta.currency)} | ${trend} |`);
328
364
  }
329
365
  lines.push('');
330
366
  }
@@ -364,38 +400,40 @@ class Reporter {
364
400
  formatStackDetailsMarkdown(costDelta) {
365
401
  const lines = [];
366
402
  if (costDelta.addedCosts.length > 0) {
367
- lines.push('**Added Resources:**');
403
+ lines.push('**📈 Added Resources:**');
368
404
  lines.push('');
369
- lines.push('| Logical ID | Type | Monthly Cost |');
370
- lines.push('|------------|------|--------------|');
405
+ lines.push('| Resource | Type | Monthly Cost |');
406
+ lines.push('|----------|------|--------------|');
371
407
  const sortedAdded = [...costDelta.addedCosts].sort((a, b) => b.monthlyCost.amount - a.monthlyCost.amount);
372
408
  for (const resource of sortedAdded) {
373
- lines.push(`| ${resource.logicalId} | ${resource.type} | ${this.formatCurrency(resource.monthlyCost.amount, costDelta.currency)} |`);
409
+ lines.push(`| ${resource.logicalId} | \`${resource.type}\` | ${this.formatCurrency(resource.monthlyCost.amount, costDelta.currency)} |`);
374
410
  }
375
411
  lines.push('');
376
412
  }
377
413
  if (costDelta.removedCosts.length > 0) {
378
- lines.push('**Removed Resources:**');
414
+ lines.push('**📉 Removed Resources:**');
379
415
  lines.push('');
380
- lines.push('| Logical ID | Type | Monthly Cost |');
381
- lines.push('|------------|------|--------------|');
416
+ lines.push('| Resource | Type | Monthly Savings |');
417
+ lines.push('|----------|------|-----------------|');
382
418
  const sortedRemoved = [...costDelta.removedCosts].sort((a, b) => b.monthlyCost.amount - a.monthlyCost.amount);
383
419
  for (const resource of sortedRemoved) {
384
- lines.push(`| ${resource.logicalId} | ${resource.type} | ${this.formatCurrency(resource.monthlyCost.amount, costDelta.currency)} |`);
420
+ lines.push(`| ${resource.logicalId} | \`${resource.type}\` | ${this.formatCurrency(resource.monthlyCost.amount, costDelta.currency)} |`);
385
421
  }
386
422
  lines.push('');
387
423
  }
388
424
  if (costDelta.modifiedCosts.length > 0) {
389
- lines.push('**Modified Resources:**');
425
+ lines.push('**🔄 Modified Resources:**');
390
426
  lines.push('');
391
- lines.push('| Logical ID | Type | Old Cost | New Cost | Delta |');
392
- lines.push('|------------|------|----------|----------|-------|');
427
+ lines.push('| Resource | Type | Before | After | Change |');
428
+ lines.push('|----------|------|--------|-------|--------|');
393
429
  const sortedModified = [...costDelta.modifiedCosts].sort((a, b) => Math.abs(b.costDelta) - Math.abs(a.costDelta));
394
430
  for (const resource of sortedModified) {
395
- lines.push(`| ${resource.logicalId} | ${resource.type} | ` +
431
+ const trend = (0, markdownUtils_1.getTrendIndicator)(resource.costDelta);
432
+ const percentChange = (0, markdownUtils_1.getPercentageChange)(resource.oldMonthlyCost.amount, resource.newMonthlyCost.amount);
433
+ lines.push(`| ${resource.logicalId} | \`${resource.type}\` | ` +
396
434
  `${this.formatCurrency(resource.oldMonthlyCost.amount, costDelta.currency)} | ` +
397
435
  `${this.formatCurrency(resource.newMonthlyCost.amount, costDelta.currency)} | ` +
398
- `${this.formatDelta(resource.costDelta, costDelta.currency)} |`);
436
+ `${this.formatDelta(resource.costDelta, costDelta.currency)} (${percentChange}) ${trend} |`);
399
437
  }
400
438
  lines.push('');
401
439
  }
@@ -409,4 +447,4 @@ class Reporter {
409
447
  }
410
448
  }
411
449
  exports.Reporter = Reporter;
412
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmVwb3J0ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcmVwb3J0ZXIvUmVwb3J0ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBT0EsTUFBYSxRQUFRO0lBQ25CLGNBQWMsQ0FDWixTQUFvQixFQUNwQixNQUFvQixFQUNwQixPQUF1QjtRQUV2QixRQUFRLE1BQU0sRUFBRSxDQUFDO1lBQ2YsS0FBSyxNQUFNO2dCQUNULE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQztZQUNyRCxLQUFLLE1BQU07Z0JBQ1QsT0FBTyxJQUFJLENBQUMsa0JBQWtCLENBQUMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQ3JELEtBQUssVUFBVTtnQkFDYixPQUFPLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxTQUFTLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDekQ7Z0JBQ0UsTUFBTSxJQUFJLEtBQUssQ0FBQyw4QkFBOEIsTUFBTSxFQUFFLENBQUMsQ0FBQztRQUM1RCxDQUFDO0lBQ0gsQ0FBQztJQUVPLGtCQUFrQixDQUN4QixTQUFvQixFQUNwQixPQUF1QjtRQUV2QixNQUFNLEtBQUssR0FBYSxFQUFFLENBQUM7UUFFM0IsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDM0IsS0FBSyxDQUFDLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO1FBQ3ZDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQzNCLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7UUFFZix3Q0FBd0M7UUFDeEMsSUFBSSxPQUFPLEVBQUUsYUFBYSxFQUFFLENBQUM7WUFDM0IsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxPQUFPLENB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Q0osQ0FBQztZQUNELEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDakIsQ0FBQztRQUVELElBQ0UsU0FBUyxDQUFDLFVBQVUsQ0FBQyxNQUFNLEtBQUssQ0FBQztZQUNqQyxTQUFTLENBQUMsWUFBWSxDQUFDLE1BQU0sS0FBSyxDQUFDO1lBQ25DLFNBQVMsQ0FBQyxhQUFhLENBQUMsTUFBTSxLQUFLLENBQUMsRUFDcEMsQ0FBQztZQUNELEtBQUssQ0FBQyxJQUFJLENBQUMsK0JBQStCLENBQUMsQ0FBQztZQUM1QyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ2pCLENBQUM7UUFFRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7Q0FDRjtBQTlrQkQsNEJBOGtCQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFJlcG9ydGVyIGFzIElSZXBvcnRlciwgUmVwb3J0Rm9ybWF0LCBSZXBvcnRPcHRpb25zIH0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQge1xuICBDb3N0RGVsdGEsXG4gIFJlc291cmNlQ29zdCxcbiAgTW9kaWZpZWRSZXNvdXJjZUNvc3QsXG59IGZyb20gJy4uL3ByaWNpbmcvdHlwZXMnO1xuXG5leHBvcnQgY2xhc3MgUmVwb3J0ZXIgaW1wbGVtZW50cyBJUmVwb3J0ZXIge1xuICBnZW5lcmF0ZVJlcG9ydChcbiAgICBjb3N0RGVsdGE6IENvc3REZWx0YSxcbiAgICBmb3JtYXQ6IFJlcG9ydEZvcm1hdCxcbiAgICBvcHRpb25zPzogUmVwb3J0T3B0aW9ucyxcbiAgKTogc3RyaW5nIHtcbiAgICBzd2l0Y2ggKGZvcm1hdCkge1xuICAgICAgY2FzZSAndGV4dCc6XG4gICAgICAgIHJldHVybiB0aGlzLmdlbmVyYXRlVGV4dFJlcG9ydChjb3N0RGVsdGEsIG9wdGlvbnMpO1xuICAgICAgY2FzZSAnanNvbic6XG4gICAgICAgIHJldHVybiB0aGlzLmdlbmVyYXRlSnNvblJlcG9ydChjb3N0RGVsdGEsIG9wdGlvbnMpO1xuICAgICAgY2FzZSAnbWFya2Rvd24nOlxuICAgICAgICByZXR1cm4gdGhpcy5nZW5lcmF0ZU1hcmtkb3duUmVwb3J0KGNvc3REZWx0YSwgb3B0aW9ucyk7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIHJlcG9ydCBmb3JtYXQ6ICR7Zm9ybWF0fWApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2VuZXJhdGVUZXh0UmVwb3J0KFxuICAgIGNvc3REZWx0YTogQ29zdERlbHRhLFxuICAgIG9wdGlvbnM/OiBSZXBvcnRPcHRpb25zLFxuICApOiBzdHJpbmcge1xuICAgIGNvbnN0IGxpbmVzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgbGluZXMucHVzaCgnPScucmVwZWF0KDYwKSk7XG4gICAgbGluZXMucHVzaCgnQ0RLIENvc3QgQW5hbHlzaXMgUmVwb3J0Jyk7XG4gICAgbGluZXMucHVzaCgnPScucmVwZWF0KDYwKSk7XG4gICAgbGluZXMucHVzaCgnJyk7XG5cbiAgICAvLyBBZGQgY29uZmlndXJhdGlvbiBzdW1tYXJ5IGlmIHByb3ZpZGVkXG4gICAgaWYgKG9wdGlvbnM/LmNvbmZpZ1N1bW1hcnkpIHtcbiAgICAgIGxpbmVzLnB1c2goLi4udGhpcy5mb3JtYXRDb25maWdTdW1tYXJ5VGV4dChvcHRpb25zLmNvbmZpZ1N1bW1hcnkpKTtcbiAgICAgIGxpbmVzLnB1c2goJycpO1xuICAgIH1cblxuICAgIC8vIEFkZCB0aHJlc2hvbGQgc3RhdHVzIGlmIHByb3ZpZGVkXG4gICAgaWYgKG9wdGlvbnM/LnRocmVzaG9sZFN0YXR1cykge1xuICAgICAgbGluZXMucHVzaCguLi50aGlzLmZvcm1hdFRocmVzaG9sZFN0YXR1c1RleHQob3B0aW9ucy50aHJlc2hvbGRTdGF0dXMpKTtcbiAgICAgIGxpbmVzLnB1c2goJycpO1xuICAgIH1cblxuICAgIGxpbmVzLnB1c2goXG4gICAgICBgVG90YWwgQ29zdCBEZWx0YTogJHt0aGlzLmZvcm1hdERlbHRhKGNvc3REZWx0YS50b3RhbERlbHRhLCBjb3N0RGVsdGEuY3VycmVuY3kpfWAsXG4gICAgKTtcbiAgICBsaW5lcy5wdXNoKCcnKTtcblxuICAgIGlmIChjb3N0RGVsdGEuYWRkZWRDb3N0cy5sZW5ndGggPiAwKSB7XG4gICAgICBsaW5lcy5wdXNoKCdBRERFRCBSRVNPVVJDRVM6Jyk7XG4gICAgICBsaW5lcy5wdXNoKCctJy5yZXBlYXQoNjApKTtcblxuICAgICAgY29uc3Qgc29ydGVkQWRkZWQgPSBbLi4uY29zdERlbHRhLmFkZGVkQ29zdHNdLnNvcnQoXG4gICAgICAgIChhLCBiKSA9PiBiLm1vbnRobHlDb3N0LmFtb3VudCAtIGEubW9udGhseUNvc3QuYW1vdW50LFxuICAgICAgKTtcblxuICAgICAgZm9yIChjb25zdCByZXNvdXJjZSBvZiBzb3J0ZWRBZGRlZCkge1xuICAgICAgICBsaW5lcy5wdXNoKHRoaXMuZm9ybWF0UmVzb3VyY2VMaW5lKHJlc291cmNlKSk7XG4gICAgICB9XG4gICAgICBsaW5lcy5wdXNoKCcnKTtcbiAgICB9XG5cbiAgICBpZiAoY29zdERlbHRhLnJlbW92ZWRDb3N0cy5sZW5ndGggPiAwKSB7XG4gICAgICBsaW5lcy5wdXNoKCdSRU1PVkVEIFJFU09VUkNFUzonKTtcbiAgICAgIGxpbmVzLnB1c2goJy0nLnJlcGVhdCg2MCkpO1xuXG4gICAgICBjb25zdCBzb3J0ZWRSZW1vdmVkID0gWy4uLmNvc3REZWx0YS5yZW1vdmVkQ29zdHNdLnNvcnQoXG4gICAgICAgIChhLCBiKSA9PiBiLm1vbnRobHlDb3N0LmFtb3VudCAtIGEubW9udGhseUNvc3QuYW1vdW50LFxuICAgICAgKTtcblxuICAgICAgZm9yIChjb25zdCByZXNvdXJjZSBvZiBzb3J0ZWRSZW1vdmVkKSB7XG4gICAgICAgIGxpbmVzLnB1c2godGhpcy5mb3JtYXRSZXNvdXJjZUxpbmUocmVzb3VyY2UpKTtcbiAgICAgIH1cbiAgICAgIGxpbmVzLnB1c2goJycpO1xuICAgIH1cblxuICAgIGlmIChjb3N0RGVsdGEubW9kaWZpZWRDb3N0cy5sZW5ndGggPiAwKSB7XG4gICAgICBsaW5lcy5wdXNoKCdNT0RJRklFRCBSRVNPVVJDRVM6Jyk7XG4gICAgICBsaW5lcy5wdXNoKCctJy5yZXBlYXQoNjApKTtcblxuICAgICAgY29uc3Qgc29ydGVkTW9kaWZpZWQgPSBbLi4uY29zdERlbHRhLm1vZGlmaWVkQ29zdHNdLnNvcnQoXG4gICAgICAgIChhLCBiKSA9PiBNYXRoLmFicyhiLmNvc3REZWx0YSkgLSBNYXRoLmFicyhhLmNvc3REZWx0YSksXG4gICAgICApO1xuXG4gICAgICBmb3IgKGNvbnN0IHJlc291cmNlIG9mIHNvcnRlZE1vZGlmaWVkKSB7XG4gICAgICAgIGxpbmVzLnB1c2godGhpcy5mb3JtYXRNb2RpZmllZFJlc291cmNlTGluZShyZXNvdXJjZSkpO1xuICAgICAgfVxuICAgICAgbGluZXMucHVzaCgnJyk7XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgY29zdERlbHRhLmFkZGVkQ29zdHMubGVuZ3RoID09PSAwICYmXG4gICAgICBjb3N0RGVsdGEucmVtb3ZlZENvc3RzLmxlbmd0aCA9PT0gMCAmJlxuICAgICAgY29zdERlbHRhLm1vZGlmaWVkQ29zdHMubGVuZ3RoID09PSAwXG4gICAgKSB7XG4gICAgICBsaW5lcy5wdXNoKCdObyByZXNvdXJjZSBjaGFuZ2VzIGRldGVjdGVkLicpO1xuICAgICAgbGluZXMucHVzaCgnJyk7XG4gICAgfVxuXG4gICAgbGluZXMucHVzaCgnPScucmVwZWF0KDYwKSk7XG5cbiAgICByZXR1cm4gbGluZXMuam9pbignXFxuJyk7XG4gIH1cblxuICBwcml2YXRlIGdlbmVyYXRlSnNvblJlcG9ydChcbiAgICBjb3N0RGVsdGE6IENvc3REZWx0YSxcbiAgICBvcHRpb25zPzogUmVwb3J0T3B0aW9ucyxcbiAgKTogc3RyaW5nIHtcbiAgICBjb25zdCByZXBvcnQ6IGFueSA9IHtcbiAgICAgIC4uLmNvc3REZWx0YSxcbiAgICB9O1xuXG4gICAgaWYgKG9wdGlvbnM/LmNvbmZpZ1N1bW1hcnkpIHtcbiAgICAgIHJlcG9ydC5jb25maWdTdW1tYXJ5ID0gb3B0aW9ucy5jb25maWdTdW1tYXJ5O1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zPy50aHJlc2hvbGRTdGF0dXMpIHtcbiAgICAgIHJlcG9ydC50aHJlc2hvbGRTdGF0dXMgPSBvcHRpb25zLnRocmVzaG9sZFN0YXR1cztcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucz8uc3RhY2tOYW1lKSB7XG4gICAgICByZXBvcnQuc3RhY2tOYW1lID0gb3B0aW9ucy5zdGFja05hbWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHJlcG9ydCwgbnVsbCwgMik7XG4gIH1cblxuICBwcml2YXRlIGdlbmVyYXRlTWFya2Rvd25SZXBvcnQoXG4gICAgY29zdERlbHRhOiBDb3N0RGVsdGEsXG4gICAgb3B0aW9ucz86IFJlcG9ydE9wdGlvbnMsXG4gICk6IHN0cmluZyB7XG4gICAgY29uc3QgbGluZXM6IHN0cmluZ1tdID0gW107XG5cbiAgICBsaW5lcy5wdXNoKCcjIENESyBDb3N0IEFuYWx5c2lzIFJlcG9ydCcpO1xuICAgIGxpbmVzLnB1c2goJycpO1xuXG4gICAgLy8gQWRkIGNvbmZpZ3VyYXRpb24gc3VtbWFyeSBpZiBwcm92aWRlZFxuICAgIGlmIChvcHRpb25zPy5jb25maWdTdW1tYXJ5KSB7XG4gICAgICBsaW5lcy5wdXNoKC4uLnRoaXMuZm9ybWF0Q29uZmlnU3VtbWFyeU1hcmtkb3duKG9wdGlvbnMuY29uZmlnU3VtbWFyeSkpO1xuICAgICAgbGluZXMucHVzaCgnJyk7XG4gICAgfVxuXG4gICAgLy8gQWRkIHRocmVzaG9sZCBzdGF0dXMgaWYgcHJvdmlkZWRcbiAgICBpZiAob3B0aW9ucz8udGhyZXNob2xkU3RhdHVzKSB7XG4gICAgICBsaW5lcy5wdXNoKFxuICAgICAgICAuLi50aGlzLmZvcm1hdFRocmVzaG9sZFN0YXR1c01hcmtkb3duKFxuICAgICAgICAgIG9wdGlvbnMudGhyZXNob2xkU3RhdHVzLFxuICAgICAgICAgIGNvc3REZWx0YSxcbiAgICAgICAgKSxcbiAgICAgICk7XG4gICAgICBsaW5lcy5wdXNoKCcnKTtcbiAgICB9XG5cbiAgICAvLyBTaG93IHRvdGFsIGNvc3QgZGVsdGFcbiAgICBsaW5lcy5wdXNoKFxuICAgICAgYCoqVG90YWwgQ29zdCBEZWx0YToqKiAke3RoaXMuZm9ybWF0RGVsdGEoY29zdERlbHRhLnRvdGFsRGVsdGEsIGNvc3REZWx0YS5jdXJyZW5jeSl9YCxcbiAgICApO1xuICAgIGxpbmVzLnB1c2goJycpO1xuXG4gICAgLy8gSWYgbXVsdGktc3RhY2ssIHNob3cgcGVyLXN0YWNrIGJyZWFrZG93bnNcbiAgICBpZiAob3B0aW9ucz8ubXVsdGlTdGFjayAmJiBvcHRpb25zPy5zdGFja3MgJiYgb3B0aW9ucy5zdGFja3MubGVuZ3RoID4gMSkge1xuICAgICAgbGluZXMucHVzaCgnIyMgUGVyLVN0YWNrIENvc3QgQnJlYWtkb3duJyk7XG4gICAgICBsaW5lcy5wdXNoKCcnKTtcbiAgICAgIGxpbmVzLnB1c2goJ3wgU3RhY2sgfCBDb3N0IERlbHRhIHwnKTtcbiAgICAgIGxpbmVzLnB1c2goJ3wtLS0tLS0tfC0tLS0tLS0tLS0tLXwnKTtcbiAgICAgIGZvciAoY29uc3Qgc3RhY2sgb2Ygb3B0aW9ucy5zdGFja3MpIHtcbiAgICAgICAgbGluZXMucHVzaChcbiAgICAgICAgICBgfCAke3N0YWNrLnN0YWNrTmFtZX0gfCAke3RoaXMuZm9ybWF0RGVsdGEoc3RhY2suY29zdERlbHRhLnRvdGFsRGVsdGEsIHN0YWNrLmNvc3REZWx0YS5jdXJyZW5jeSl9IHxgLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgbGluZXMucHVzaCgnJyk7XG4gICAgICBsaW5lcy5wdXNoKCc8ZGV0YWlscz4nKTtcbiAgICAgIGxpbmVzLnB1c2goXG4gICAgICAgICc8c3VtbWFyeT48c3Ryb25nPlZpZXcgRGV0YWlsZWQgU3RhY2sgQnJlYWtkb3duczwvc3Ryb25nPjwvc3VtbWFyeT4nLFxuICAgICAgKTtcbiAgICAgIGxpbmVzLnB1c2goJycpO1xuICAgICAgZm9yIChjb25zdCBzdGFjayBvZiBvcHRpb25zLnN0YWNrcykge1xuICAgICAgICBsaW5lcy5wdXNoKGAjIyMgJHtzdGFjay5zdGFja05hbWV9YCk7XG4gICAgICAgIGxpbmVzLnB1c2goJycpO1xuICAgICAgICBsaW5lcy5wdXNoKC4uLnRoaXMuZm9ybWF0U3RhY2tEZXRhaWxzTWFya2Rvd24oc3RhY2suY29zdERlbHRhKSk7XG4gICAgICAgIGxpbmVzLnB1c2goJycpO1xuICAgICAgfVxuICAgICAgbGluZXMucHVzaCgnPC9kZXRhaWxzPicpO1xuICAgICAgbGluZXMucHVzaCgnJyk7XG4gICAgfVxuXG4gICAgaWYgKGNvc3REZWx0YS5hZGRlZENvc3RzLmxlbmd0aCA+IDApIHtcbiAgICAgIGxpbmVzLnB1c2goJyMjIEFkZGVkIFJlc291cmNlcycpO1xuICAgICAgbGluZXMucHVzaCgnJyk7XG4gICAgICBsaW5lcy5wdXNoKCd8IExvZ2ljYWwgSUQgfCBUeXBlIHwgTW9udGhseSBDb3N0IHwnKTtcbiAgICAgIGxpbmVzLnB1c2goJ3wtLS0tLS0tLS0tLS18LS0tLS0tfC0tLS0tLS0tLS0tLS0tfCcpO1xuXG4gICAgICBjb25zdCBzb3J0ZWRBZGRlZCA9IFsuLi5jb3N0RGVsdGEuYWRkZWRDb3N0c10uc29ydChcbiAgICAgICAgKGEsIGIpID0+IGIubW9udGhseUNvc3QuYW1vdW50IC0gYS5tb250aGx5Q29zdC5hbW91bnQsXG4gICAgICApO1xuXG4gICAgICBmb3IgKGNvbnN0IHJlc291cmNlIG9mIHNvcnRlZEFkZGVkKSB7XG4gICAgICAgIGxpbmVzLnB1c2goXG4gICAgICAgICAgYHwgJHtyZXNvdXJjZS5sb2dpY2FsSWR9IHwgJHtyZXNvdXJjZS50eXBlfSB8ICR7dGhpcy5mb3JtYXRDdXJyZW5jeShyZXNvdXJjZS5tb250aGx5Q29zdC5hbW91bnQsIGNvc3REZWx0YS5jdXJyZW5jeSl9IHxgLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgbGluZXMucHVzaCgnJyk7XG4gICAgfVxuXG4gICAgaWYgKGNvc3REZWx0YS5yZW1vdmVkQ29zdHMubGVuZ3RoID4gMCkge1xuICAgICAgbGluZXMucHVzaCgnIyMgUmVtb3ZlZCBSZXNvdXJjZXMnKTtcbiAgICAgIGxpbmVzLnB1c2goJycpO1xuICAgICAgbGluZXMucHVzaCgnfCBMb2dpY2FsIElEIHwgVHlwZSB8IE1vbnRobHkgQ29zdCB8Jyk7XG4gICAgICBsaW5lcy5wdXNoKCd8LS0tLS0tLS0tLS0tfC0tLS0tLXwtLS0tLS0tLS0tLS0tLXwnKTtcblxuICAgICAgY29uc3Qgc29ydGVkUmVtb3ZlZCA9IFsuLi5jb3N0RGVsdGEucmVtb3ZlZENvc3RzXS5zb3J0KFxuICAgICAgICAoYSwgYikgPT4gYi5tb250aGx5Q29zdC5hbW91bnQgLSBhLm1vbnRobHlDb3N0LmFtb3VudCxcbiAgICAgICk7XG5cbiAgICAgIGZvciAoY29uc3QgcmVzb3VyY2Ugb2Ygc29ydGVkUmVtb3ZlZCkge1xuICAgICAgICBsaW5lcy5wdXNoKFxuICAgICAgICAgIGB8ICR7cmVzb3VyY2UubG9naWNhbElkfSB8ICR7cmVzb3VyY2UudHlwZX0gfCAke3RoaXMuZm9ybWF0Q3VycmVuY3kocmVzb3VyY2UubW9udGhseUNvc3QuYW1vdW50LCBjb3N0RGVsdGEuY3VycmVuY3kpfSB8YCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGxpbmVzLnB1c2goJycpO1xuICAgIH1cblxuICAgIGlmIChjb3N0RGVsdGEubW9kaWZpZWRDb3N0cy5sZW5ndGggPiAwKSB7XG4gICAgICBsaW5lcy5wdXNoKCcjIyBNb2RpZmllZCBSZXNvdXJjZXMnKTtcbiAgICAgIGxpbmVzLnB1c2goJycpO1xuICAgICAgbGluZXMucHVzaCgnfCBMb2dpY2FsIElEIHwgVHlwZSB8IE9sZCBDb3N0IHwgTmV3IENvc3QgfCBEZWx0YSB8Jyk7XG4gICAgICBsaW5lcy5wdXNoKCd8LS0tLS0tLS0tLS0tfC0tLS0tLXwtLS0tLS0tLS0tfC0tLS0tLS0tLS18LS0tLS0tLXwnKTtcblxuICAgICAgY29uc3Qgc29ydGVkTW9kaWZpZWQgPSBbLi4uY29zdERlbHRhLm1vZGlmaWVkQ29zdHNdLnNvcnQoXG4gICAgICAgIChhLCBiKSA9PiBNYXRoLmFicyhiLmNvc3REZWx0YSkgLSBNYXRoLmFicyhhLmNvc3REZWx0YSksXG4gICAgICApO1xuXG4gICAgICBmb3IgKGNvbnN0IHJlc291cmNlIG9mIHNvcnRlZE1vZGlmaWVkKSB7XG4gICAgICAgIGxpbmVzLnB1c2goXG4gICAgICAgICAgYHwgJHtyZXNvdXJjZS5sb2dpY2FsSWR9IHwgJHtyZXNvdXJjZS50eXBlfSB8IGAgK1xuICAgICAgICAgICAgYCR7dGhpcy5mb3JtYXRDdXJyZW5jeShyZXNvdXJjZS5vbGRNb250aGx5Q29zdC5hbW91bnQsIGNvc3REZWx0YS5jdXJyZW5jeSl9IHwgYCArXG4gICAgICAgICAgICBgJHt0aGlzLmZvcm1hdEN1cnJlbmN5KHJlc291cmNlLm5ld01vbnRobHlDb3N0LmFtb3VudCwgY29zdERlbHRhLmN1cnJlbmN5KX0gfCBgICtcbiAgICAgICAgICAgIGAke3RoaXMuZm9ybWF0RGVsdGEocmVzb3VyY2UuY29zdERlbHRhLCBjb3N0RGVsdGEuY3VycmVuY3kpfSB8YCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGxpbmVzLnB1c2goJycpO1xuICAgIH1cblxuICAgIHJldHVybiBsaW5lcy5qb2luKCdcXG4nKTtcbiAgfVxuXG4gIHByaXZhdGUgZm9ybWF0UmVzb3VyY2VMaW5lKHJlc291cmNlOiBSZXNvdXJjZUNvc3QpOiBzdHJpbmcge1xuICAgIGNvbnN0IGNvc3QgPSB0aGlzLmZvcm1hdEN1cnJlbmN5KHJlc291cmNlLm1vbnRobHlDb3N0LmFtb3VudCwgJ1VTRCcpO1xuICAgIGNvbnN0IGNvbmZpZGVuY2UgPSByZXNvdXJjZS5tb250aGx5Q29zdC5jb25maWRlbmNlO1xuICAgIHJldHVybiBgICDigKIgJHtyZXNvdXJjZS5sb2dpY2FsSWR9ICgke3Jlc291cmNlLnR5cGV9KTogJHtjb3N0fSBbJHtjb25maWRlbmNlfV1gO1xuICB9XG5cbiAgcHJpdmF0ZSBmb3JtYXRNb2RpZmllZFJlc291cmNlTGluZShyZXNvdXJjZTogTW9kaWZpZWRSZXNvdXJjZUNvc3QpOiBzdHJpbmcge1xuICAgIGNvbnN0IG9sZENvc3QgPSB0aGlzLmZvcm1hdEN1cnJlbmN5KHJlc291cmNlLm9sZE1vbnRobHlDb3N0LmFtb3VudCwgJ1VTRCcpO1xuICAgIGNvbnN0IG5ld0Nvc3QgPSB0aGlzLmZvcm1hdEN1cnJlbmN5KHJlc291cmNlLm5ld01vbnRobHlDb3N0LmFtb3VudCwgJ1VTRCcpO1xuICAgIGNvbnN0IGRlbHRhID0gdGhpcy5mb3JtYXREZWx0YShyZXNvdXJjZS5jb3N0RGVsdGEsICdVU0QnKTtcbiAgICByZXR1cm4gYCAg4oCiICR7cmVzb3VyY2UubG9naWNhbElkfSAoJHtyZXNvdXJjZS50eXBlfSk6ICR7b2xkQ29zdH0g4oaSICR7bmV3Q29zdH0gKCR7ZGVsdGF9KWA7XG4gIH1cblxuICBwcml2YXRlIGZvcm1hdEN1cnJlbmN5KGFtb3VudDogbnVtYmVyLCBjdXJyZW5jeTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBzeW1ib2wgPSBjdXJyZW5jeSA9PT0gJ1VTRCcgPyAnJCcgOiBjdXJyZW5jeTtcbiAgICByZXR1cm4gYCR7c3ltYm9sfSR7YW1vdW50LnRvRml4ZWQoMil9YDtcbiAgfVxuXG4gIHByaXZhdGUgZm9ybWF0RGVsdGEoYW1vdW50OiBudW1iZXIsIGN1cnJlbmN5OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IHNpZ24gPSBhbW91bnQgPiAwID8gJysnIDogYW1vdW50IDwgMCA/ICctJyA6ICcnO1xuICAgIGNvbnN0IGFic0Ftb3VudCA9IE1hdGguYWJzKGFtb3VudCk7XG4gICAgY29uc3QgZm9ybWF0dGVkID0gdGhpcy5mb3JtYXRDdXJyZW5jeShhYnNBbW91bnQsIGN1cnJlbmN5KTtcbiAgICByZXR1cm4gYW1vdW50ID09PSAwID8gZm9ybWF0dGVkIDogYCR7c2lnbn0ke2Zvcm1hdHRlZH1gO1xuICB9XG5cbiAgcHJpdmF0ZSBmb3JtYXRDb25maWdTdW1tYXJ5VGV4dChjb25maWc6IGFueSk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBbXTtcbiAgICBsaW5lcy5wdXNoKCdDT05GSUdVUkFUSU9OOicpO1xuICAgIGxpbmVzLnB1c2goJy0nLnJlcGVhdCg2MCkpO1xuXG4gICAgaWYgKGNvbmZpZy5jb25maWdQYXRoKSB7XG4gICAgICBsaW5lcy5wdXNoKGAgIENvbmZpZ3VyYXRpb24gRmlsZTogJHtjb25maWcuY29uZmlnUGF0aH1gKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGluZXMucHVzaCgnICBDb25maWd1cmF0aW9uIEZpbGU6IFVzaW5nIGRlZmF1bHRzJyk7XG4gICAgfVxuXG4gICAgaWYgKGNvbmZpZy50aHJlc2hvbGRzKSB7XG4gICAgICBpZiAoY29uZmlnLnRocmVzaG9sZHMuZW52aXJvbm1lbnQpIHtcbiAgICAgICAgbGluZXMucHVzaChgICBFbnZpcm9ubWVudDogJHtjb25maWcudGhyZXNob2xkcy5lbnZpcm9ubWVudH1gKTtcbiAgICAgIH1cbiAgICAgIGlmIChjb25maWcudGhyZXNob2xkcy53YXJuaW5nICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgbGluZXMucHVzaChcbiAgICAgICAgICBgICBXYXJuaW5nIFRocmVzaG9sZDogJCR7Y29uZmlnLnRocmVzaG9sZHMud2FybmluZy50b0ZpeGVkKDIpfS9tb250aGAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLnRocmVzaG9sZHMuZXJyb3IgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBsaW5lcy5wdXNoKFxuICAgICAgICAgIGAgIEVycm9yIFRocmVzaG9sZDogJCR7Y29uZmlnLnRocmVzaG9sZHMuZXJyb3IudG9GaXhlZCgyKX0vbW9udGhgLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChcbiAgICAgIGNvbmZpZy5leGNsdWRlZFJlc291cmNlVHlwZXMgJiZcbiAgICAgIGNvbmZpZy5leGNsdWRlZFJlc291cmNlVHlwZXMubGVuZ3RoID4gMFxuICAgICkge1xuICAgICAgbGluZXMucHVzaChcbiAgICAgICAgYCAgRXhjbHVkZWQgUmVzb3VyY2UgVHlwZXM6ICR7Y29uZmlnLmV4Y2x1ZGVkUmVzb3VyY2VUeXBlcy5qb2luKCcsICcpfWAsXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIGNvbmZpZy51c2FnZUFzc3VtcHRpb25zICYmXG4gICAgICBPYmplY3Qua2V5cyhjb25maWcudXNhZ2VBc3N1bXB0aW9ucykubGVuZ3RoID4gMFxuICAgICkge1xuICAgICAgbGluZXMucHVzaCgnICBDdXN0b20gVXNhZ2UgQXNzdW1wdGlvbnM6Jyk7XG4gICAgICBmb3IgKGNvbnN0IFtyZXNvdXJjZVR5cGUsIGFzc3VtcHRpb25zXSBvZiBPYmplY3QuZW50cmllcyhcbiAgICAgICAgY29uZmlnLnVzYWdlQXNzdW1wdGlvbnMsXG4gICAgICApKSB7XG4gICAgICAgIGxpbmVzLnB1c2goYCAgICAtICR7cmVzb3VyY2VUeXBlfTogJHtKU09OLnN0cmluZ2lmeShhc3N1bXB0aW9ucyl9YCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGxpbmVzO1xuICB9XG5cbiAgcHJpdmF0ZSBmb3JtYXRUaHJlc2hvbGRTdGF0dXNUZXh0KHRocmVzaG9sZDogYW55KTogc3RyaW5nW10ge1xuICAgIGNvbnN0IGxpbmVzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGxpbmVzLnB1c2goJ1RIUkVTSE9MRCBTVEFUVVM6Jyk7XG4gICAgbGluZXMucHVzaCgnLScucmVwZWF0KDYwKSk7XG5cbiAgICBpZiAodGhyZXNob2xkLmxldmVsID09PSAnbm9uZScpIHtcbiAgICAgIGxpbmVzLnB1c2goJyAgTm8gdGhyZXNob2xkcyBjb25maWd1cmVkJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHN0YXR1cyA9IHRocmVzaG9sZC5wYXNzZWQgPyAnUEFTU0VEJyA6ICdFWENFRURFRCc7XG4gICAgICBsaW5lcy5wdXNoKGAgIFN0YXR1czogJHtzdGF0dXN9YCk7XG5cbiAgICAgIGlmICh0aHJlc2hvbGQudGhyZXNob2xkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgbGluZXMucHVzaChcbiAgICAgICAgICBgICBUaHJlc2hvbGQ6ICQke3RocmVzaG9sZC50aHJlc2hvbGQudG9GaXhlZCgyKX0vbW9udGggKCR7dGhyZXNob2xkLmxldmVsfSlgLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgbGluZXMucHVzaChcbiAgICAgICAgYCAgQWN0dWFsIERlbHRhOiAkJHtNYXRoLmFicyh0aHJlc2hvbGQuZGVsdGEpLnRvRml4ZWQoMil9L21vbnRoYCxcbiAgICAgICk7XG5cbiAgICAgIGlmIChcbiAgICAgICAgIXRocmVzaG9sZC5wYXNzZWQgJiZcbiAgICAgICAgdGhyZXNob2xkLnJlY29tbWVuZGF0aW9ucyAmJlxuICAgICAgICB0aHJlc2hvbGQucmVjb21tZW5kYXRpb25zLmxlbmd0aCA+IDBcbiAgICAgICkge1xuICAgICAgICBsaW5lcy5wdXNoKCcgIFJlY29tbWVuZGF0aW9uczonKTtcbiAgICAgICAgZm9yIChjb25zdCByZWMgb2YgdGhyZXNob2xkLnJlY29tbWVuZGF0aW9ucykge1xuICAgICAgICAgIGxpbmVzLnB1c2goYCAgICAtICR7cmVjfWApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGxpbmVzO1xuICB9XG5cbiAgcHJpdmF0ZSBmb3JtYXRDb25maWdTdW1tYXJ5TWFya2Rvd24oY29uZmlnOiBhbnkpOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgbGluZXM6IHN0cmluZ1tdID0gW107XG4gICAgbGluZXMucHVzaCgnPGRldGFpbHM+Jyk7XG4gICAgbGluZXMucHVzaCgnPHN1bW1hcnk+PHN0cm9uZz5Db25maWd1cmF0aW9uIFN1bW1hcnk8L3N0cm9uZz48L3N1bW1hcnk+Jyk7XG4gICAgbGluZXMucHVzaCgnJyk7XG5cbiAgICBpZiAoY29uZmlnLmNvbmZpZ1BhdGgpIHtcbiAgICAgIGxpbmVzLnB1c2goYCoqQ29uZmlndXJhdGlvbiBGaWxlOioqIFxcYCR7Y29uZmlnLmNvbmZpZ1BhdGh9XFxgYCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxpbmVzLnB1c2goJyoqQ29uZmlndXJhdGlvbiBGaWxlOioqIFVzaW5nIGRlZmF1bHRzJyk7XG4gICAgfVxuICAgIGxpbmVzLnB1c2goJycpO1xuXG4gICAgaWYgKGNvbmZpZy50aHJlc2hvbGRzKSB7XG4gICAgICBsaW5lcy5wdXNoKCcqKlRocmVzaG9sZHM6KionKTtcbiAgICAgIGlmIChjb25maWcudGhyZXNob2xkcy5lbnZpcm9ubWVudCkge1xuICAgICAgICBsaW5lcy5wdXNoKGAtIEVudmlyb25tZW50OiAke2NvbmZpZy50aHJlc2hvbGRzLmVudmlyb25tZW50fWApO1xuICAgICAgfVxuICAgICAgaWYgKGNvbmZpZy50aHJlc2hvbGRzLndhcm5pbmcgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBsaW5lcy5wdXNoKGAtIFdhcm5pbmc6ICQke2NvbmZpZy50aHJlc2hvbGRzLndhcm5pbmcudG9GaXhlZCgyKX0vbW9udGhgKTtcbiAgICAgIH1cbiAgICAgIGlmIChjb25maWcudGhyZXNob2xkcy5lcnJvciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGxpbmVzLnB1c2goYC0gRXJyb3I6ICQke2NvbmZpZy50aHJlc2hvbGRzLmVycm9yLnRvRml4ZWQoMil9L21vbnRoYCk7XG4gICAgICB9XG4gICAgICBsaW5lcy5wdXNoKCcnKTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICBjb25maWcuZXhjbHVkZWRSZXNvdXJjZVR5cGVzICYmXG4gICAgICBjb25maWcuZXhjbHVkZWRSZXNvdXJjZVR5cGVzLmxlbmd0aCA+IDBcbiAgICApIHtcbiAgICAgIGxpbmVzLnB1c2goJyoqRXhjbHVkZWQgUmVzb3VyY2UgVHlwZXM6KionKTtcbiAgICAgIGZvciAoY29uc3QgdHlwZSBvZiBjb25maWcuZXhjbHVkZWRSZXNvdXJjZVR5cGVzKSB7XG4gICAgICAgIGxpbmVzLnB1c2goYC0gXFxgJHt0eXBlfVxcYGApO1xuICAgICAgfVxuICAgICAgbGluZXMucHVzaCgnJyk7XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgY29uZmlnLnVzYWdlQXNzdW1wdGlvbnMgJiZcbiAgICAgIE9iamVjdC5rZXlzKGNvbmZpZy51c2FnZUFzc3VtcHRpb25zKS5sZW5ndGggPiAwXG4gICAgKSB7XG4gICAgICBsaW5lcy5wdXNoKCcqKkN1c3RvbSBVc2FnZSBBc3N1bXB0aW9uczoqKicpO1xuICAgICAgZm9yIChjb25zdCBbcmVzb3VyY2VUeXBlLCBhc3N1bXB0aW9uc10gb2YgT2JqZWN0LmVudHJpZXMoXG4gICAgICAgIGNvbmZpZy51c2FnZUFzc3VtcHRpb25zLFxuICAgICAgKSkge1xuICAgICAgICBsaW5lcy5wdXNoKGAtICoqJHtyZXNvdXJjZVR5cGV9OioqYCk7XG4gICAgICAgIGNvbnN0IGFzc3VtcHRpb25PYmogPSBhc3N1bXB0aW9ucyBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhhc3N1bXB0aW9uT2JqKSkge1xuICAgICAgICAgIGxpbmVzLnB1c2goYCAgLSAke2tleX06ICR7dmFsdWV9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGxpbmVzLnB1c2goJycpO1xuICAgIH1cblxuICAgIGxpbmVzLnB1c2goJzwvZGV0YWlscz4nKTtcbiAgICBsaW5lcy5wdXNoKCcnKTtcblxuICAgIHJldHVybiBsaW5lcztcbiAgfVxuXG4gIHByaXZhdGUgZm9ybWF0VGhyZXNob2xkU3RhdHVzTWFya2Rvd24oXG4gICAgdGhyZXNob2xkOiBhbnksXG4gICAgY29zdERlbHRhOiBDb3N0RGVsdGEsXG4gICk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBbXTtcblxuICAgIGlmICh0aHJlc2hvbGQubGV2ZWwgPT09ICdub25lJykge1xuICAgICAgcmV0dXJuIGxpbmVzO1xuICAgIH1cblxuICAgIGNvbnN0IHBhc3NlZCA9IHRocmVzaG9sZC5wYXNzZWQ7XG4gICAgY29uc3Qgc3RhdHVzID0gcGFzc2VkID8gJ1BBU1NFRCcgOiAnRVhDRUVERUQnO1xuXG4gICAgbGluZXMucHVzaChgIyMgVGhyZXNob2xkIFN0YXR1czogJHtzdGF0dXN9YCk7XG4gICAgbGluZXMucHVzaCgnJyk7XG5cbiAgICBpZiAodGhyZXNob2xkLnRocmVzaG9sZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBsaW5lcy5wdXNoKFxuICAgICAgICBgKipUaHJlc2hvbGQ6KiogJCR7dGhyZXNob2xkLnRocmVzaG9sZC50b0ZpeGVkKDIpfS9tb250aCAoJHt0aHJlc2hvbGQubGV2ZWx9KWAsXG4gICAgICApO1xuICAgIH1cbiAgICBsaW5lcy5wdXNoKFxuICAgICAgYCoqQWN0dWFsIERlbHRhOioqICR7dGhpcy5mb3JtYXREZWx0YSh0aHJlc2hvbGQuZGVsdGEsIGNvc3REZWx0YS5jdXJyZW5jeSl9L21vbnRoYCxcbiAgICApO1xuICAgIGxpbmVzLnB1c2goJycpO1xuXG4gICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgIGxpbmVzLnB1c2goJyMjIyBBY3Rpb24gUmVxdWlyZWQnKTtcbiAgICAgIGxpbmVzLnB1c2goJycpO1xuICAgICAgbGluZXMucHVzaCh0aHJlc2hvbGQubWVzc2FnZSk7XG4gICAgICBsaW5lcy5wdXNoKCcnKTtcblxuICAgICAgaWYgKHRocmVzaG9sZC5yZWNvbW1lbmRhdGlvbnMgJiYgdGhyZXNob2xkLnJlY29tbWVuZGF0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGxpbmVzLnB1c2goJyMjIyBSZWNvbW1lbmRhdGlvbnMnKTtcbiAgICAgICAgbGluZXMucHVzaCgnJyk7XG4gICAgICAgIGZvciAoY29uc3QgcmVjIG9mIHRocmVzaG9sZC5yZWNvbW1lbmRhdGlvbnMpIHtcbiAgICAgICAgICBsaW5lcy5wdXNoKGAtICR7cmVjfWApO1xuICAgICAgICB9XG4gICAgICAgIGxpbmVzLnB1c2goJycpO1xuICAgICAgfVxuXG4gICAgICAvLyBTaG93IHRvcCBjb3N0IGNvbnRyaWJ1dG9yc1xuICAgICAgY29uc3QgdG9wQ29udHJpYnV0b3JzID0gdGhpcy5nZXRUb3BDb3N0Q29udHJpYnV0b3JzKGNvc3REZWx0YSwgNSk7XG4gICAgICBpZiAodG9wQ29udHJpYnV0b3JzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgbGluZXMucHVzaCgnIyMjIFRvcCBDb3N0IENvbnRyaWJ1dG9ycycpO1xuICAgICAgICBsaW5lcy5wdXNoKCcnKTtcbiAgICAgICAgbGluZXMucHVzaCgnfCBSZXNvdXJjZSB8IFR5cGUgfCBJbXBhY3QgfCcpO1xuICAgICAgICBsaW5lcy5wdXNoKCd8LS0tLS0tLS0tLXwtLS0tLS18LS0tLS0tLS18Jyk7XG4gICAgICAgIGZvciAoY29uc3QgY29udHJpYnV0b3Igb2YgdG9wQ29udHJpYnV0b3JzKSB7XG4gICAgICAgICAgbGluZXMucHVzaChcbiAgICAgICAgICAgIGB8ICR7Y29udHJpYnV0b3IubG9naWNhbElkfSB8ICR7Y29udHJpYnV0b3IudHlwZX0gfCAke3RoaXMuZm9ybWF0RGVsdGEoY29udHJpYnV0b3IuaW1wYWN0LCBjb3N0RGVsdGEuY3VycmVuY3kpfSB8YCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGxpbmVzLnB1c2goJycpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBsaW5lcztcbiAgfVxuXG4gIHByaXZhdGUgZ2V0VG9wQ29zdENvbnRyaWJ1dG9ycyhcbiAgICBjb3N0RGVsdGE6IENvc3REZWx0YSxcbiAgICBsaW1pdDogbnVtYmVyLFxuICApOiBBcnJheTx7IGxvZ2ljYWxJZDogc3RyaW5nOyB0eXBlOiBzdHJpbmc7IGltcGFjdDogbnVtYmVyIH0+IHtcbiAgICBjb25zdCBjb250cmlidXRvcnM6IEFycmF5PHtcbiAgICAgIGxvZ2ljYWxJZDogc3RyaW5nO1xuICAgICAgdHlwZTogc3RyaW5nO1xuICAgICAgaW1wYWN0OiBudW1iZXI7XG4gICAgfT4gPSBbXTtcblxuICAgIC8vIEFkZCBhZGRlZCByZXNvdXJjZXNcbiAgICBmb3IgKGNvbnN0IHJlc291cmNlIG9mIGNvc3REZWx0YS5hZGRlZENvc3RzKSB7XG4gICAgICBjb250cmlidXRvcnMucHVzaCh7XG4gICAgICAgIGxvZ2ljYWxJZDogcmVzb3VyY2UubG9naWNhbElkLFxuICAgICAgICB0eXBlOiByZXNvdXJjZS50eXBlLFxuICAgICAgICBpbXBhY3Q6IHJlc291cmNlLm1vbnRobHlDb3N0LmFtb3VudCxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIEFkZCByZW1vdmVkIHJlc291cmNlcyAobmVnYXRpdmUgaW1wYWN0KVxuICAgIGZvciAoY29uc3QgcmVzb3VyY2Ugb2YgY29zdERlbHRhLnJlbW92ZWRDb3N0cykge1xuICAgICAgY29udHJpYnV0b3JzLnB1c2goe1xuICAgICAgICBsb2dpY2FsSWQ6IHJlc291cmNlLmxvZ2ljYWxJZCxcbiAgICAgICAgdHlwZTogcmVzb3VyY2UudHlwZSxcbiAgICAgICAgaW1wYWN0OiAtcmVzb3VyY2UubW9udGhseUNvc3QuYW1vdW50LFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gQWRkIG1vZGlmaWVkIHJlc291cmNlc1xuICAgIGZvciAoY29uc3QgcmVzb3VyY2Ugb2YgY29zdERlbHRhLm1vZGlmaWVkQ29zdHMpIHtcbiAgICAgIGNvbnRyaWJ1dG9ycy5wdXNoKHtcbiAgICAgICAgbG9naWNhbElkOiByZXNvdXJjZS5sb2dpY2FsSWQsXG4gICAgICAgIHR5cGU6IHJlc291cmNlLnR5cGUsXG4gICAgICAgIGltcGFjdDogcmVzb3VyY2UuY29zdERlbHRhLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gU29ydCBieSBhYnNvbHV0ZSBpbXBhY3QgKGRlc2NlbmRpbmcpXG4gICAgY29udHJpYnV0b3JzLnNvcnQoKGEsIGIpID0+IE1hdGguYWJzKGIuaW1wYWN0KSAtIE1hdGguYWJzKGEuaW1wYWN0KSk7XG5cbiAgICByZXR1cm4gY29udHJpYnV0b3JzLnNsaWNlKDAsIGxpbWl0KTtcbiAgfVxuXG4gIHByaXZhdGUgZm9ybWF0U3RhY2tEZXRhaWxzTWFya2Rvd24oY29zdERlbHRhOiBDb3N0RGVsdGEpOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgbGluZXM6IHN0cmluZ1tdID0gW107XG5cbiAgICBpZiAoY29zdERlbHRhLmFkZGVkQ29zdHMubGVuZ3RoID4gMCkge1xuICAgICAgbGluZXMucHVzaCgnKipBZGRlZCBSZXNvdXJjZXM6KionKTtcbiAgICAgIGxpbmVzLnB1c2goJycpO1xuICAgICAgbGluZXMucHVzaCgnfCBMb2dpY2FsIElEIHwgVHlwZSB8IE1vbnRobHkgQ29zdCB8Jyk7XG4gICAgICBsaW5lcy5wdXNoKCd8LS0tLS0tLS0tLS0tfC0tLS0tLXwtLS0tLS0tLS0tLS0tLXwnKTtcblxuICAgICAgY29uc3Qgc29ydGVkQWRkZWQgPSBbLi4uY29zdERlbHRhLmFkZGVkQ29zdHNdLnNvcnQoXG4gICAgICAgIChhLCBiKSA9PiBiLm1vbnRobHlDb3N0LmFtb3VudCAtIGEubW9udGhseUNvc3QuYW1vdW50LFxuICAgICAgKTtcblxuICAgICAgZm9yIChjb25zdCByZXNvdXJjZSBvZiBzb3J0ZWRBZGRlZCkge1xuICAgICAgICBsaW5lcy5wdXNoKFxuICAgICAgICAgIGB8ICR7cmVzb3VyY2UubG9naWNhbElkfSB8ICR7cmVzb3VyY2UudHlwZX0gfCAke3RoaXMuZm9ybWF0Q3VycmVuY3kocmVzb3VyY2UubW9udGhseUNvc3QuYW1vdW50LCBjb3N0RGVsdGEuY3VycmVuY3kpfSB8YCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGxpbmVzLnB1c2goJycpO1xuICAgIH1cblxuICAgIGlmIChjb3N0RGVsdGEucmVtb3ZlZENvc3RzLmxlbmd0aCA+IDApIHtcbiAgICAgIGxpbmVzLnB1c2goJyoqUmVtb3ZlZCBSZXNvdXJjZXM6KionKTtcbiAgICAgIGxpbmVzLnB1c2goJycpO1xuICAgICAgbGluZXMucHVzaCgnfCBMb2dpY2FsIElEIHwgVHlwZSB8IE1vbnRobHkgQ29zdCB8Jyk7XG4gICAgICBsaW5lcy5wdXNoKCd8LS0tLS0tLS0tLS0tfC0tLS0tLXwtLS0tLS0tLS0tLS0tLXwnKTtcblxuICAgICAgY29uc3Qgc29ydGVkUmVtb3ZlZCA9IFsuLi5jb3N0RGVsdGEucmVtb3ZlZENvc3RzXS5zb3J0KFxuICAgICAgICAoYSwgYikgPT4gYi5tb250aGx5Q29zdC5hbW91bnQgLSBhLm1vbnRobHlDb3N0LmFtb3VudCxcbiAgICAgICk7XG5cbiAgICAgIGZvciAoY29uc3QgcmVzb3VyY2Ugb2Ygc29ydGVkUmVtb3ZlZCkge1xuICAgICAgICBsaW5lcy5wdXNoKFxuICAgICAgICAgIGB8ICR7cmVzb3VyY2UubG9naWNhbElkfSB8ICR7cmVzb3VyY2UudHlwZX0gfCAke3RoaXMuZm9ybWF0Q3VycmVuY3kocmVzb3VyY2UubW9udGhseUNvc3QuYW1vdW50LCBjb3N0RGVsdGEuY3VycmVuY3kpfSB8YCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGxpbmVzLnB1c2goJycpO1xuICAgIH1cblxuICAgIGlmIChjb3N0RGVsdGEubW9kaWZpZWRDb3N0cy5sZW5ndGggPiAwKSB7XG4gICAgICBsaW5lcy5wdXNoKCcqKk1vZGlmaWVkIFJlc291cmNlczoqKicpO1xuICAgICAgbGluZXMucHVzaCgnJyk7XG4gICAgICBsaW5lcy5wdXNoKCd8IExvZ2ljYWwgSUQgfCBUeXBlIHwgT2xkIENvc3QgfCBOZXcgQ29zdCB8IERlbHRhIHwnKTtcbiAgICAgIGxpbmVzLnB1c2goJ3wtLS0tLS0tLS0tLS18LS0tLS0tfC0tLS0tLS0tLS18LS0tLS0tLS0tLXwtLS0tLS0tfCcpO1xuXG4gICAgICBjb25zdCBzb3J0ZWRNb2RpZmllZCA9IFsuLi5jb3N0RGVsdGEubW9kaWZpZWRDb3N0c10uc29ydChcbiAgICAgICAgKGEsIGIpID0+IE1hdGguYWJzKGIuY29zdERlbHRhKSAtIE1hdGguYWJzKGEuY29zdERlbHRhKSxcbiAgICAgICk7XG5cbiAgICAgIGZvciAoY29uc3QgcmVzb3VyY2Ugb2Ygc29ydGVkTW9kaWZpZWQpIHtcbiAgICAgICAgbGluZXMucHVzaChcbiAgICAgICAgICBgfCAke3Jlc291cmNlLmxvZ2ljYWxJZH0gfCAke3Jlc291cmNlLnR5cGV9IHwgYCArXG4gICAgICAgICAgICBgJHt0aGlzLmZvcm1hdEN1cnJlbmN5KHJlc291cmNlLm9sZE1vbnRobHlDb3N0LmFtb3VudCwgY29zdERlbHRhLmN1cnJlbmN5KX0gfCBgICtcbiAgICAgICAgICAgIGAke3RoaXMuZm9ybWF0Q3VycmVuY3kocmVzb3VyY2UubmV3TW9udGhseUNvc3QuYW1vdW50LCBjb3N0RGVsdGEuY3VycmVuY3kpfSB8IGAgK1xuICAgICAgICAgICAgYCR7dGhpcy5mb3JtYXREZWx0YShyZXNvdXJjZS5jb3N0RGVsdGEsIGNvc3REZWx0YS5jdXJyZW5jeSl9IHxgLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgbGluZXMucHVzaCgnJyk7XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgY29zdERlbHRhLmFkZGVkQ29zdHMubGVuZ3RoID09PSAwICYmXG4gICAgICBjb3N0RGVsdGEucmVtb3ZlZENvc3RzLmxlbmd0aCA9PT0gMCAmJlxuICAgICAgY29zdERlbHRhLm1vZGlmaWVkQ29zdHMubGVuZ3RoID09PSAwXG4gICAgKSB7XG4gICAgICBsaW5lcy5wdXNoKCdObyByZXNvdXJjZSBjaGFuZ2VzIGRldGVjdGVkLicpO1xuICAgICAgbGluZXMucHVzaCgnJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGxpbmVzO1xuICB9XG59XG4iXX0=
450
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmVwb3J0ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcmVwb3J0ZXIvUmVwb3J0ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBT0EsbURBS3lCO0FBRXpCLE1BQWEsUUFBUTtJQUNuQixjQUFjLENBQ1osU0FBb0IsRUFDcEIsTUFBb0IsRUFDcEIsT0FBdUI7UUFFdkIsUUFBUSxNQUFNLEVBQUUsQ0FBQztZQUNmLEtBQUssTUFBTTtnQkFDVCxPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDckQsS0FBSyxNQUFNO2dCQUNULE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQztZQUNyRCxLQUFLLFVBQVU7Z0JBQ2IsT0FBTyxJQUFJLENBQUMsc0JBQXNCLENBQUMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQ3pEO2dCQUNFLE1BQU0sSUFBSSxLQUFLLENBQUMsOEJBQThCLE1BQU0sRUFBRSxDQUFDLENBQUM7UUFDNUQsQ0FBQztJQUNILENBQUM7SUFFTyxrQkFBa0IsQ0FDeEIsU0FBb0IsRUFDcEIsT0FBdUI7UUFFdkIsTUFBTSxLQUFLLEdBQWEsRUFBRSxDQUFDO1FBRTNCLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQzNCLEtBQUssQ0FBQyxJQUFJLENBQUMsMEJBQTBCLENBQUMsQ0FBQztRQUN2QyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUMzQixLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBRWYsd0NBQXdDO1FBQ3hDLElBQUksT0FBTyxFQUFFLGFBQWEsRUFBRSxDQUFDO1lBQzNCLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsdUJBQXVC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RCxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsU0FBUyxDQUFDLFFBQVEsQ0FBQyxLQUFLO29CQUMvRSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsU0FBUyxDQUFDLFFBQVEsQ0FBQyxLQUFLO29CQUMvRSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxTQUFTLENBQUMsUUFBUSxDQUFDLEtBQUssYUFBYSxLQUFLLEtBQUssSUFBSSxDQUM5RixDQUFDO1lBQ0osQ0FBQztZQUNELEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDakIsQ0FBQztRQUVELElBQ0UsU0FBUyxDQUFDLFVBQVUsQ0FBQyxNQUFNLEtBQUssQ0FBQztZQUNqQyxTQUFTLENBQUMsWUFBWSxDQUFDLE1BQU0sS0FBSyxDQUFDO1lBQ25DLFNBQVMsQ0FBQyxhQUFhLENBQUMsTUFBTSxLQUFLLENBQUMsRUFDcEMsQ0FBQztZQUNELEtBQUssQ0FBQyxJQUFJLENBQUMsK0JBQStCLENBQUMsQ0FBQztZQUM1QyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ2pCLENBQUM7UUFFRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7Q0FDRjtBQTduQkQsNEJBNm5CQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFJlcG9ydGVyIGFzIElSZXBvcnRlciwgUmVwb3J0Rm9ybWF0LCBSZXBvcnRPcHRpb25zIH0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQge1xuICBDb3N0RGVsdGEsXG4gIFJlc291cmNlQ29zdCxcbiAgTW9kaWZpZWRSZXNvdXJjZUNvc3QsXG59IGZyb20gJy4uL3ByaWNpbmcvdHlwZXMnO1xuaW1wb3J0IHsgQ29uZmlnU3VtbWFyeSB9IGZyb20gJy4uL3BpcGVsaW5lL3R5cGVzJztcbmltcG9ydCB7XG4gIGdldFRyZW5kSW5kaWNhdG9yLFxuICBnZXRQZXJjZW50YWdlQ2hhbmdlLFxuICBncm91cENvc3RzQnlTZXJ2aWNlLFxuICBjYWxjdWxhdGVUb3RhbENvc3RzLFxufSBmcm9tICcuL21hcmtkb3duVXRpbHMnO1xuXG5leHBvcnQgY2xhc3MgUmVwb3J0ZXIgaW1wbGVtZW50cyBJUmVwb3J0ZXIge1xuICBnZW5lcmF0ZVJlcG9ydChcbiAgICBjb3N0RGVsdGE6IENvc3REZWx0YSxcbiAgICBmb3JtYXQ6IFJlcG9ydEZvcm1hdCxcbiAgICBvcHRpb25zPzogUmVwb3J0T3B0aW9ucyxcbiAgKTogc3RyaW5nIHtcbiAgICBzd2l0Y2ggKGZvcm1hdCkge1xuICAgICAgY2FzZSAndGV4dCc6XG4gICAgICAgIHJldHVybiB0aGlzLmdlbmVyYXRlVGV4dFJlcG9ydChjb3N0RGVsdGEsIG9wdGlvbnMpO1xuICAgICAgY2FzZSAnanNvbic6XG4gICAgICAgIHJldHVybiB0aGlzLmdlbmVyYXRlSnNvblJlcG9ydChjb3N0RGVsdGEsIG9wdGlvbnMpO1xuICAgICAgY2FzZSAnbWFya2Rvd24nOlxuICAgICAgICByZXR1cm4gdGhpcy5nZW5lcmF0ZU1hcmtkb3duUmVwb3J0KGNvc3REZWx0YSwgb3B0aW9ucyk7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIHJlcG9ydCBmb3JtYXQ6ICR7Zm9ybWF0fWApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2VuZXJhdGVUZXh0UmVwb3J0KFxuICAgIGNvc3REZWx0YTogQ29zdERlbHRhLFxuICAgIG9wdGlvbnM/OiBSZXBvcnRPcHRpb25zLFxuICApOiBzdHJpbmcge1xuICAgIGNvbnN0IGxpbmVzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgbGluZXMucHVzaCgnPScucmVwZWF0KDYwKSk7XG4gICAgbGluZXMucHVzaCgnQ0RLIENvc3QgQW5hbHlzaXMgUmVwb3J0Jyk7XG4gICAgbGluZXMucHVzaCgnPScucmVwZWF0KDYwKSk7XG4gICAgbGluZXMucHVzaCgnJyk7XG5cbiAgICAvLyBBZGQgY29uZmlndXJhdGlvbiBzdW1tYXJ5IGlmIHByb3ZpZGVkXG4gICAgaWYgKG9wdGlvbnM/LmNvbmZpZ1N1bW1hcnkpIHtcbiAgICAgIGxpbmVzLnB1c2goLi4udGhpcy5mb3JtYXRDb25maWdTdW1tYXJ5VGV4dChvcHRpb25zLmNvbmZpZ1N1bW1hcnkpKTtcbiAgICAgIGxpbmVzLnB1c2goJycpO1xuICAgIH1cblxuICAgIC8vIEFkZCB0aHJlc2hvbGQgc3RhdHVzIGlmIHByb3ZpZGVkXG4gICAgaWYgKG9wdGlvbnM/LnRocmVzaG9sZFN0YXR1cykge1xuICAgICAgbGluZXMucHVzaCguLi50aGlzLmZvcm1hdFRocmVzaG9sZFN0YXR1c1RleHQob3B0aW9ucy50aHJlc2hvbGRTdGF0dXMpKTtcbiAgICAgIGxpbmVzLnB1c2goJycpO1xuICAgIH1cblxuICAgIGxpbmVzLnB1c2goXG4gICAgICBgVG90YWwgQ29zdCBEZWx0YTogJHt0aGlzLmZvcm1hdERlbHRhKGNvc3REZWx0YS50b3RhbERlbHRhLCBjb3N0RGVsdGEuY3VycmVuY3kpfWAsXG4gICAgKTtcbiAgICBsaW5lcy5wdXNoKCcnKTtcblxuICAgIGlmIChjb3N0RGVsdGEuYWRkZWRDb3N0cy5sZW5ndGggPiAwKSB7XG4gICAgICBsaW5lcy5wdXNoKCdBRERFRCBSRVNPVVJDRVM6Jyk7XG4gICAgICBsaW5lcy5wdXNoKCctJy5yZXBlYXQoNjApKTtcblxuICAgICAgY29uc3Qgc29ydGVkQWRkZWQgPSBbLi4uY29zdERlbHRhLmFkZGVkQ29zdHNdLnNvcnQoXG4gICAgICAgIChhLCBiKSA9PiBiLm1vbnRobHlDb3N0LmFtb3VudCAtIGEubW9udGhseUNvc3QuYW1vdW50LFxuICAgICAgKTtcblxuICAgICAgZm9yIChjb25zdCByZXNvdXJjZSBvZiBzb3J0ZWRBZGRlZCkge1xuICAgICAgICBsaW5lcy5wdXNoKHRoaXMuZm9ybWF0UmVzb3VyY2VMaW5lKHJlc291cmNlKSk7XG4gICAgICB9XG4gICAgICBsaW5lcy5wdXNoKCcnKTtcbiAgICB9XG5cbiAgICBpZiAoY29zdERlbHRhLnJlbW92ZWRDb3N0cy5sZW5ndGggPiAwKSB7XG4gICAgICBsaW5lcy5wdXNoKCdSRU1PVkVEIFJFU09VUkNFUzonKTtcbiAgICAgIGxpbmVzLnB1c2goJy0nLnJlcGVhdCg2MCkpO1xuXG4gICAgICBjb25zdCBzb3J0ZWRSZW1vdmVkID0gWy4uLmNvc3REZWx0YS5yZW1vdmVkQ29zdHNdLnNvcnQoXG4gICAgICAgIChhLCBiKSA9PiBiLm1vbnRobHlDb3N0LmFtb3VudCAtIGEubW9udGhseUNvc3QuYW1vdW50LFxuICAgICAgKTtcblxuICAgICAgZm9yIChjb25zdCByZXNvdXJjZSBvZiBzb3J0ZWRSZW1vdmVkKSB7XG4gICAgICAgIGxpbmVzLnB1c2godGhpcy5mb3JtYXRSZXNvdXJjZUxpbmUocmVzb3VyY2UpKTtcbiAgICAgIH1cbiAgICAgIGxpbmVzLnB1c2goJycpO1xuICAgIH1cblxuICAgIGlmIChjb3N0RGVsdGEubW9kaWZpZWRDb3N0cy5sZW5ndGggPiAwKSB7XG4gICAgICBsaW5lcy5wdXNoKCdNT0RJRklFRCBSRVNPVVJDRVM6Jyk7XG4gICAgICBsaW5lcy5wdXNoKCctJy5yZXBlYXQoNjApKTtcblxuICAgICAgY29uc3Qgc29ydGVkTW9kaWZpZWQgPSBbLi4uY29zdERlbHRhLm1vZGlmaWVkQ29zdHNdLnNvcnQoXG4gICAgICAgIChhLCBiKSA9PiBNYXRoLmFicyhiLmNvc3REZWx0YSkgLSBNYXRoLmFicyhhLmNvc3REZWx0YSksXG4gICAgICApO1xuXG4gICAgICBmb3IgKGNvbnN0IHJlc291cmNlIG9mIHNvcnRlZE1vZGlmaWVkKSB7XG4gICAgICAgIGxpbmVzLnB1c2godGhpcy5mb3JtYXRNb2RpZmllZFJlc291cmNlTGluZShyZXNvdXJjZSkpO1xuICAgICAgfVxuICAgICAgbGluZXMucHVzaCgnJyk7XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgY29zdERlbHRhLmFkZGVkQ29zdHMubGVuZ3RoID09PSAwICYmXG4gICAgICBjb3N0RGVsdGEucmVtb3ZlZENvc3RzLmxlbmd0aCA9PT0gMCAmJlxuICAgICAgY29zdERlbHRhLm1vZGlmaWVkQ29zdHMubGVuZ3RoID09PSAwXG4gICAgKSB7XG4gICAgICBsaW5lcy5wdXNoKCdObyByZXNvdXJjZSBjaGFuZ2VzIGRldGVjdGVkLicpO1xuICAgICAgbGluZXMucHVzaCgnJyk7XG4gICAgfVxuXG4gICAgbGluZXMucHVzaCgnPScucmVwZWF0KDYwKSk7XG5cbiAgICByZXR1cm4gbGluZXMuam9pbignXFxuJyk7XG4gIH1cblxuICBwcml2YXRlIGdlbmVyYXRlSnNvblJlcG9ydChcbiAgICBjb3N0RGVsdGE6IENvc3REZWx0YSxcbiAgICBvcHRpb25zPzogUmVwb3J0T3B0aW9ucyxcbiAgKTogc3RyaW5nIHtcbiAgICBjb25zdCByZXBvcnQ6IGFueSA9IHtcbiAgICAgIC4uLmNvc3REZWx0YSxcbiAgICB9O1xuXG4gICAgaWYgKG9wdGlvbnM/LmNvbmZpZ1N1bW1hcnkpIHtcbiAgICAgIHJlcG9ydC5jb25maWdTdW1tYXJ5ID0gb3B0aW9ucy5jb25maWdTdW1tYXJ5O1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zPy50aHJlc2hvbGRTdGF0dXMpIHtcbiAgICAgIHJlcG9ydC50aHJlc2hvbGRTdGF0dXMgPSBvcHRpb25zLnRocmVzaG9sZFN0YXR1cztcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucz8uc3RhY2tOYW1lKSB7XG4gICAgICByZXBvcnQuc3RhY2tOYW1lID0gb3B0aW9ucy5zdGFja05hbWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHJlcG9ydCwgbnVsbCwgMik7XG4gIH1cblxuICBwcml2YXRlIGdlbmVyYXRlTWFya2Rvd25SZXBvcnQoXG4gICAgY29zdERlbHRhOiBDb3N0RGVsdGEsXG4gICAgb3B0aW9ucz86IFJlcG9ydE9wdGlvbnMsXG4gICk6IHN0cmluZyB7XG4gICAgY29uc3QgbGluZXM6IHN0cmluZ1tdID0gW107XG5cbiAgICBjb25zdCB0b3RhbENvc3RzID0gY2FsY3VsYXRlVG90YWxDb3N0cyhjb3N0RGVsdGEpO1xuICAgIGNvbnN0IHRyZW5kSW5kaWNhdG9yID0gZ2V0VHJlbmRJbmRpY2F0b3IoY29zdERlbHRhLnRvdGFsRGVsdGEpO1xuXG4gICAgbGluZXMucHVzaCgnIyDwn5KwIENvc3QgSW1wYWN0IEFuYWx5c2lzJyk7XG4gICAgbGluZXMucHVzaCgnJyk7XG4gICAgbGluZXMucHVzaChgKipNb250aGx5IENvc3QgQ2hhbmdlOioqICR7dGhpcy5mb3JtYXREZWx0YShjb3N0RGVsdGEudG90YWxEZWx0YSwgY29zdERlbHRhLmN1cnJlbmN5KX0gJHt0cmVuZEluZGljYXRvcn1gKTtcbiAgICBsaW5lcy5wdXNoKCcnKTtcblxuICAgIC8vIElmIG11bHRpLXN0YWNrLCBzaG93IHBlci1zdGFjayBicmVha2Rvd25zXG4gICAgaWYgKG9wdGlvbnM/Lm11bHRpU3RhY2sgJiYgb3B0aW9ucz8uc3RhY2tzICYmIG9wdGlvbnMuc3RhY2tzLmxlbmd0aCA+IDEpIHtcbiAgICAgIGxpbmVzLnB1c2goJyMjIFBlci1TdGFjayBDb3N0IEJyZWFrZG93bicpO1xuICAgICAgbGluZXMucHVzaCgnJyk7XG4gICAgICBsaW5lcy5wdXNoKCd8IFN0YWNrIHwgQ29zdCBEZWx0YSB8IFRyZW5kIHwnKTtcbiAgICAgIGxpbmVzLnB1c2goJ3wtLS0tLS0tfC0tLS0tLS0tLS0tLXwtLS0tLS0tfCcpO1xuICAgICAgZm9yIChjb25zdCBzdGFjayBvZiBvcHRpb25zLnN0YWNrcykge1xuICAgICAgICBjb25zdCBzdGFja1RyZW5kID0gZ2V0VHJlbmRJbmRpY2F0b3Ioc3RhY2suY29zdERlbHRhLnRvdGFsRGVsdGEpO1xuICAgICAgICBsaW5lcy5wdXNoKFxuICAgICAgICAgIGB8ICR7c3RhY2suc3RhY2tOYW1lfSB8ICR7dGhpcy5mb3JtYXREZWx0YShzdGFjay5jb3N0RGVsdGEudG90YWxEZWx0YSwgc3RhY2suY29zdERlbHRhLmN1cnJlbmN5KX0gfCAke3N0YWNrVHJlbmR9IHxgLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgbGluZXMucHVzaCgnJyk7XG4gICAgICBsaW5lcy5wdXNoKCc8ZGV0YWlscz4nKTtcbiAgICAgIGxpbmVzLnB1c2goXG4gICAgICAgICc8c3VtbWFyeT48c3Ryb25nPlZpZXcgRGV0YWlsZWQgU3RhY2sgQnJlYWtkb3duczwvc3Ryb25nPjwvc3VtbWFyeT4nLFxuICAgICAgKTtcbiAgICAgIGxpbmVzLnB1c2goJycpO1xuICAgICAgZm9yIChjb25zdCBzdGFjayBvZiBvcHRpb25zLnN0YWNrcykge1xuICAgICAgICBsaW5lcy5wdXNoKGAjIyMgJHtzdGFjay5zdGFja05hbWV9YCk7XG4gICAgICAgIGxpbmVzLnB1c2goJycpO1xuICAgICAgICBsaW5lcy5wdXNoKC4uLnRoaXMuZm9ybWF0U3RhY2tEZXRhaWxzTWFya2Rvd24oc3RhY2suY29zdERlbHRhKSk7XG4gICAgICAgIGxpbmVzLnB1c2goJycpO1xuICAgICAgfVxuICAgICAgbGluZXMucHVzaCgnPC9kZXRhaWxzPicpO1xuICAgICAgbGluZXMucHVzaCgnJyk7XG4gICAgfVxuXG4gICAgLy8gQWRkIHRocmVzaG9sZCBzdGF0dXMgaWYgcHJvdmlkZWRcbiAgICBpZiAob3B0aW9ucz8udGhyZXNob2xkU3RhdHVzKSB7XG4gICAgICBsaW5lcy5wdXNoKFxuICAgICAgICAuLi50aGlzLmZvcm1hdFRocmVzaG9sZFN0YXR1c01hcmtkb3duKFxuICAgICAgICAgIG9wdGlvbnMudGhyZXNob2xkU3RhdHVzLFxuICAgICAgICAgIGNvc3REZWx0YSxcbiAgICAgICAgKSxcbiAgICAgICk7XG4gICAgICBsaW5lcy5wdXNoKCcnKTtcbiAgICB9XG5cbiAgICAvLyBBZGRlZCBSZXNvdXJjZXNcbiAgICBpZiAoY29zdERlbHRhLmFkZGVkQ29zdHMubGVuZ3RoID4gMCkge1xuICAgICAgbGluZXMucHVzaCgnIyMg8J+TiCBBZGRlZCBSZXNvdXJjZXMnKTtcbiAgICAgIGxpbmVzLnB1c2goJycpO1xuICAgICAgbGluZXMucHVzaCgnfCBSZXNvdXJjZSB8IFR5cGUgfCBNb250aGx5IENvc3QgfCcpO1xuICAgICAgbGluZXMucHVzaCgnfC0tLS0tLS0tLS18LS0tLS0tfC0tLS0tLS0tLS0tLS0tfCcpO1xuXG4gICAgICBjb25zdCBzb3J0ZWRBZGRlZCA9IFsuLi5jb3N0RGVsdGEuYWRkZWRDb3N0c10uc29ydChcbiAgICAgICAgKGEsIGIpID0+IGIubW9udGhseUNvc3QuYW1vdW50IC0gYS5tb250aGx5Q29zdC5hbW91bnQsXG4gICAgICApO1xuXG4gICAgICBmb3IgKGNvbnN0IHJlc291cmNlIG9mIHNvcnRlZEFkZGVkKSB7XG4gICAgICAgIGxpbmVzLnB1c2goXG4gICAgICAgICAgYHwgJHtyZXNvdXJjZS5sb2dpY2FsSWR9IHwgXFxgJHtyZXNvdXJjZS50eXBlfVxcYCB8ICR7dGhpcy5mb3JtYXRDdXJyZW5jeShyZXNvdXJjZS5tb250aGx5Q29zdC5hbW91bnQsIGNvc3REZWx0YS5jdXJyZW5jeSl9IHxgLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgbGluZXMucHVzaCgnJyk7XG4gICAgfVxuXG4gICAgLy8gTW9kaWZpZWQgUmVzb3VyY2VzXG4gICAgaWYgKGNvc3REZWx0YS5tb2RpZmllZENvc3RzLmxlbmd0aCA+IDApIHtcbiAgICAgIGxpbmVzLnB1c2goJyMjIPCflIQgTW9kaWZpZWQgUmVzb3VyY2VzJyk7XG4gICAgICBsaW5lcy5wdXNoKCcnKTtcbiAgICAgIGxpbmVzLnB1c2goJ3wgUmVzb3VyY2UgfCBUeXBlIHwgQmVmb3JlIHwgQWZ0ZXIgfCBDaGFuZ2UgfCcpO1xuICAgICAgbGluZXMucHVzaCgnfC0tLS0tLS0tLS18LS0tLS0tfC0tLS0tLS0tfC0tLS0tLS18LS0tLS0tLS18Jyk7XG5cbiAgICAgIGNvbnN0IHNvcnRlZE1vZGlmaWVkID0gWy4uLmNvc3REZWx0YS5tb2RpZmllZENvc3RzXS5zb3J0KFxuICAgICAgICAoYSwgYikgPT4gTWF0aC5hYnMoYi5jb3N0RGVsdGEpIC0gTWF0aC5hYnMoYS5jb3N0RGVsdGEpLFxuICAgICAgKTtcblxuICAgICAgZm9yIChjb25zdCByZXNvdXJjZSBvZiBzb3J0ZWRNb2RpZmllZCkge1xuICAgICAgICBjb25zdCB0cmVuZCA9IGdldFRyZW5kSW5kaWNhdG9yKHJlc291cmNlLmNvc3REZWx0YSk7XG4gICAgICAgIGNvbnN0IHBlcmNlbnRDaGFuZ2UgPSBnZXRQZXJjZW50YWdlQ2hhbmdlKFxuICAgICAgICAgIHJlc291cmNlLm9sZE1vbnRobHlDb3N0LmFtb3VudCxcbiAgICAgICAgICByZXNvdXJjZS5uZXdNb250aGx5Q29zdC5hbW91bnQsXG4gICAgICAgICk7XG4gICAgICAgIGxpbmVzLnB1c2goXG4gICAgICAgICAgYHwgJHtyZXNvdXJjZS5sb2dpY2FsSWR9IHwgXFxgJHtyZXNvdXJjZS50eXBlfVxcYCB8IGAgK1xuICAgICAgICAgICAgYCR7dGhpcy5mb3JtYXRDdXJyZW5jeShyZXNvdXJjZS5vbGRNb250aGx5Q29zdC5hbW91bnQsIGNvc3REZWx0YS5jdXJyZW5jeSl9IHwgYCArXG4gICAgICAgICAgICBgJHt0aGlzLmZvcm1hdEN1cnJlbmN5KHJlc291cmNlLm5ld01vbnRobHlDb3N0LmFtb3VudCwgY29zdERlbHRhLmN1cnJlbmN5KX0gfCBgICtcbiAgICAgICAgICAgIGAke3RoaXMuZm9ybWF0RGVsdGEocmVzb3VyY2UuY29zdERlbHRhLCBjb3N0RGVsdGEuY3VycmVuY3kpfSAoJHtwZXJjZW50Q2hhbmdlfSkgJHt0cmVuZH0gfGAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBsaW5lcy5wdXNoKCcnKTtcbiAgICB9XG5cbiAgICAvLyBSZW1vdmVkIFJlc291cmNlc1xuICAgIGlmIChjb3N0RGVsdGEucmVtb3ZlZENvc3RzLmxlbmd0aCA+IDApIHtcbiAgICAgIGxpbmVzLnB1c2goJyMjIPCfk4kgUmVtb3ZlZCBSZXNvdXJjZXMnKTtcbiAgICAgIGxpbmVzLnB1c2goJycpO1xuICAgICAgbGluZXMucHVzaCgnfCBSZXNvdXJjZSB8IFR5cGUgfCBNb250aGx5IFNhdmluZ3MgfCcpO1xuICAgICAgbGluZXMucHVzaCgnfC0tLS0tLS0tLS18LS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tfCcpO1xuXG4gICAgICBjb25zdCBzb3J0ZWRSZW1vdmVkID0gWy4uLmNvc3REZWx0YS5yZW1vdmVkQ29zdHNdLnNvcnQoXG4gICAgICAgIChhLCBiKSA9PiBiLm1vbnRobHlDb3N0LmFtb3VudCAtIGEubW9udGhseUNvc3QuYW1vdW50LFxuICAgICAgKTtcblxuICAgICAgZm9yIChjb25zdCByZXNvdXJjZSBvZiBzb3J0ZWRSZW1vdmVkKSB7XG4gICAgICAgIGxpbmVzLnB1c2goXG4gICAgICAgICAgYHwgJHtyZXNvdXJjZS5sb2dpY2FsSWR9IHwgXFxgJHtyZXNvdXJjZS50eXBlfVxcYCB8ICR7dGhpcy5mb3JtYXRDdXJyZW5jeShyZXNvdXJjZS5tb250aGx5Q29zdC5hbW91bnQsIGNvc3REZWx0YS5jdXJyZW5jeSl9IHxgLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgbGluZXMucHVzaCgnJyk7XG4gICAgfVxuXG4gICAgLy8gVG90YWwgTW9udGhseSBDb3N0XG4gICAgbGluZXMucHVzaCgnIyMg8J+StSBUb3RhbCBNb250aGx5IENvc3QnKTtcbiAgICBsaW5lcy5wdXNoKCcnKTtcbiAgICBsaW5lcy5wdXNoKCd8IE1ldHJpYyB8IFZhbHVlIHwnKTtcbiAgICBsaW5lcy5wdXNoKCd8LS0tLS0tLS18LS0tLS0tLXwnKTtcbiAgICBsaW5lcy5wdXNoKGB8IEJlZm9yZSB8ICR7dGhpcy5mb3JtYXRDdXJyZW5jeSh0b3RhbENvc3RzLmJlZm9yZSwgY29zdERlbHRhLmN1cnJlbmN5KX0gfGApO1xuICAgIGxpbmVzLnB1c2goYHwgQWZ0ZXIgfCAke3RoaXMuZm9ybWF0Q3VycmVuY3kodG90YWxDb3N0cy5hZnRlciwgY29zdERlbHRhLmN1cnJlbmN5KX0gfGApO1xuICAgIGxpbmVzLnB1c2goYHwgQ2hhbmdlIHwgJHt0aGlzLmZvcm1hdERlbHRhKGNvc3REZWx0YS50b3RhbERlbHRhLCBjb3N0RGVsdGEuY3VycmVuY3kpfSAke3RyZW5kSW5kaWNhdG9yfSB8YCk7XG4gICAgbGluZXMucHVzaCgnJyk7XG5cbiAgICAvLyBDb3N0IEJyZWFrZG93biBieSBTZXJ2aWNlXG4gICAgY29uc3Qgc2VydmljZUJyZWFrZG93biA9IGdyb3VwQ29zdHNCeVNlcnZpY2UoY29zdERlbHRhKTtcbiAgICBpZiAoc2VydmljZUJyZWFrZG93bi5sZW5ndGggPiAwKSB7XG4gICAgICBsaW5lcy5wdXNoKCcjIyDwn5OKIENvc3QgQnJlYWtkb3duIGJ5IFNlcnZpY2UnKTtcbiAgICAgIGxpbmVzLnB1c2goJycpO1xuICAgICAgbGluZXMucHVzaCgnfCBTZXJ2aWNlIHwgUmVzb3VyY2VzIHwgQ29zdCBJbXBhY3QgfCBUcmVuZCB8Jyk7XG4gICAgICBsaW5lcy5wdXNoKCd8LS0tLS0tLS0tfC0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS18LS0tLS0tLXwnKTtcblxuICAgICAgZm9yIChjb25zdCBzZXJ2aWNlIG9mIHNlcnZpY2VCcmVha2Rvd24pIHtcbiAgICAgICAgY29uc3Qgc2VydmljZVRyZW5kID0gZ2V0VHJlbmRJbmRpY2F0b3Ioc2VydmljZS50b3RhbENvc3QpO1xuICAgICAgICBsaW5lcy5wdXNoKFxuICAgICAgICAgIGB8ICR7c2VydmljZS5zZXJ2aWNlfSB8ICR7c2VydmljZS5yZXNvdXJjZUNvdW50fSB8ICR7dGhpcy5mb3JtYXREZWx0YShzZXJ2aWNlLnRvdGFsQ29zdCwgY29zdERlbHRhLmN1cnJlbmN5KX0gfCAke3NlcnZpY2VUcmVuZH0gfGAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBsaW5lcy5wdXNoKCcnKTtcbiAgICB9XG5cbiAgICAvLyBDb25maWd1cmF0aW9uICYgQXNzdW1wdGlvbnMgKGNvbGxhcHNpYmxlKVxuICAgIGlmIChvcHRpb25zPy5jb25maWdTdW1tYXJ5KSB7XG4gICAgICBsaW5lcy5wdXNoKC4uLnRoaXMuZm9ybWF0Q29uZmlnU3VtbWFyeU1hcmtkb3duKG9wdGlvbnMuY29uZmlnU3VtbWFyeSkpO1xuICAgICAgbGluZXMucHVzaCgnJyk7XG4gICAgfVxuXG4gICAgLy8gRm9vdGVyXG4gICAgbGluZXMucHVzaCgnLS0tJyk7XG4gICAgbGluZXMucHVzaCgnJyk7XG4gICAgbGluZXMucHVzaCgnKlBvd2VyZWQgYnkgW2Nkay1jb3N0LWFuYWx5emVyXShodHRwczovL2dpdGh1Yi5jb20vYnVpbGRpbmdpbnRoZWNsb3VkL2Nkay1jb3N0LWFuYWx5emVyKSB8IFtDb25maWd1cmF0aW9uIFJlZmVyZW5jZV0oaHR0cHM6Ly9naXRodWIuY29tL2J1aWxkaW5naW50aGVjbG91ZC9jZGstY29zdC1hbmFseXplci9ibG9iL21haW4vZG9jcy9DT05GSUdVUkFUSU9OLm1kKSonKTtcblxuICAgIHJldHVybiBsaW5lcy5qb2luKCdcXG4nKTtcbiAgfVxuXG4gIHByaXZhdGUgZm9ybWF0UmVzb3VyY2VMaW5lKHJlc291cmNlOiBSZXNvdXJjZUNvc3QpOiBzdHJpbmcge1xuICAgIGNvbnN0IGNvc3QgPSB0aGlzLmZvcm1hdEN1cnJlbmN5KHJlc291cmNlLm1vbnRobHlDb3N0LmFtb3VudCwgJ1VTRCcpO1xuICAgIGNvbnN0IGNvbmZpZGVuY2UgPSByZXNvdXJjZS5tb250aGx5Q29zdC5jb25maWRlbmNlO1xuICAgIHJldHVybiBgICDigKIgJHtyZXNvdXJjZS5sb2dpY2FsSWR9ICgke3Jlc291cmNlLnR5cGV9KTogJHtjb3N0fSBbJHtjb25maWRlbmNlfV1gO1xuICB9XG5cbiAgcHJpdmF0ZSBmb3JtYXRNb2RpZmllZFJlc291cmNlTGluZShyZXNvdXJjZTogTW9kaWZpZWRSZXNvdXJjZUNvc3QpOiBzdHJpbmcge1xuICAgIGNvbnN0IG9sZENvc3QgPSB0aGlzLmZvcm1hdEN1cnJlbmN5KHJlc291cmNlLm9sZE1vbnRobHlDb3N0LmFtb3VudCwgJ1VTRCcpO1xuICAgIGNvbnN0IG5ld0Nvc3QgPSB0aGlzLmZvcm1hdEN1cnJlbmN5KHJlc291cmNlLm5ld01vbnRobHlDb3N0LmFtb3VudCwgJ1VTRCcpO1xuICAgIGNvbnN0IGRlbHRhID0gdGhpcy5mb3JtYXREZWx0YShyZXNvdXJjZS5jb3N0RGVsdGEsICdVU0QnKTtcbiAgICByZXR1cm4gYCAg4oCiICR7cmVzb3VyY2UubG9naWNhbElkfSAoJHtyZXNvdXJjZS50eXBlfSk6ICR7b2xkQ29zdH0g4oaSICR7bmV3Q29zdH0gKCR7ZGVsdGF9KWA7XG4gIH1cblxuICBwcml2YXRlIGZvcm1hdEN1cnJlbmN5KGFtb3VudDogbnVtYmVyLCBjdXJyZW5jeTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBzeW1ib2wgPSBjdXJyZW5jeSA9PT0gJ1VTRCcgPyAnJCcgOiBjdXJyZW5jeTtcbiAgICByZXR1cm4gYCR7c3ltYm9sfSR7YW1vdW50LnRvRml4ZWQoMil9YDtcbiAgfVxuXG4gIHByaXZhdGUgZm9ybWF0RGVsdGEoYW1vdW50OiBudW1iZXIsIGN1cnJlbmN5OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IHNpZ24gPSBhbW91bnQgPiAwID8gJysnIDogYW1vdW50IDwgMCA/ICctJyA6ICcnO1xuICAgIGNvbnN0IGFic0Ftb3VudCA9IE1hdGguYWJzKGFtb3VudCk7XG4gICAgY29uc3QgZm9ybWF0dGVkID0gdGhpcy5mb3JtYXRDdXJyZW5jeShhYnNBbW91bnQsIGN1cnJlbmN5KTtcbiAgICByZXR1cm4gYW1vdW50ID09PSAwID8gZm9ybWF0dGVkIDogYCR7c2lnbn0ke2Zvcm1hdHRlZH1gO1xuICB9XG5cbiAgcHJpdmF0ZSBmb3JtYXRDb25maWdTdW1tYXJ5VGV4dChjb25maWc6IGFueSk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBbXTtcbiAgICBsaW5lcy5wdXNoKCdDT05GSUdVUkFUSU9OOicpO1xuICAgIGxpbmVzLnB1c2goJy0nLnJlcGVhdCg2MCkpO1xuXG4gICAgaWYgKGNvbmZpZy5jb25maWdQYXRoKSB7XG4gICAgICBsaW5lcy5wdXNoKGAgIENvbmZpZ3VyYXRpb24gRmlsZTogJHtjb25maWcuY29uZmlnUGF0aH1gKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGluZXMucHVzaCgnICBDb25maWd1cmF0aW9uIEZpbGU6IFVzaW5nIGRlZmF1bHRzJyk7XG4gICAgfVxuXG4gICAgaWYgKGNvbmZpZy50aHJlc2hvbGRzKSB7XG4gICAgICBpZiAoY29uZmlnLnRocmVzaG9sZHMuZW52aXJvbm1lbnQpIHtcbiAgICAgICAgbGluZXMucHVzaChgICBFbnZpcm9ubWVudDogJHtjb25maWcudGhyZXNob2xkcy5lbnZpcm9ubWVudH1gKTtcbiAgICAgIH1cbiAgICAgIGlmIChjb25maWcudGhyZXNob2xkcy53YXJuaW5nICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgbGluZXMucHVzaChcbiAgICAgICAgICBgICBXYXJuaW5nIFRocmVzaG9sZDogJCR7Y29uZmlnLnRocmVzaG9sZHMud2FybmluZy50b0ZpeGVkKDIpfS9tb250aGAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLnRocmVzaG9sZHMuZXJyb3IgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBsaW5lcy5wdXNoKFxuICAgICAgICAgIGAgIEVycm9yIFRocmVzaG9sZDogJCR7Y29uZmlnLnRocmVzaG9sZHMuZXJyb3IudG9GaXhlZCgyKX0vbW9udGhgLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChcbiAgICAgIGNvbmZpZy5leGNsdWRlZFJlc291cmNlVHlwZXMgJiZcbiAgICAgIGNvbmZpZy5leGNsdWRlZFJlc291cmNlVHlwZXMubGVuZ3RoID4gMFxuICAgICkge1xuICAgICAgbGluZXMucHVzaChcbiAgICAgICAgYCAgRXhjbHVkZWQgUmVzb3VyY2UgVHlwZXM6ICR7Y29uZmlnLmV4Y2x1ZGVkUmVzb3VyY2VUeXBlcy5qb2luKCcsICcpfWAsXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIGNvbmZpZy51c2FnZUFzc3VtcHRpb25zICYmXG4gICAgICBPYmplY3Qua2V5cyhjb25maWcudXNhZ2VBc3N1bXB0aW9ucykubGVuZ3RoID4gMFxuICAgICkge1xuICAgICAgbGluZXMucHVzaCgnICBDdXN0b20gVXNhZ2UgQXNzdW1wdGlvbnM6Jyk7XG4gICAgICBmb3IgKGNvbnN0IFtyZXNvdXJjZVR5cGUsIGFzc3VtcHRpb25zXSBvZiBPYmplY3QuZW50cmllcyhcbiAgICAgICAgY29uZmlnLnVzYWdlQXNzdW1wdGlvbnMsXG4gICAgICApKSB7XG4gICAgICAgIGxpbmVzLnB1c2goYCAgICAtICR7cmVzb3VyY2VUeXBlfTogJHtKU09OLnN0cmluZ2lmeShhc3N1bXB0aW9ucyl9YCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGxpbmVzO1xuICB9XG5cbiAgcHJpdmF0ZSBmb3JtYXRUaHJlc2hvbGRTdGF0dXNUZXh0KHRocmVzaG9sZDogYW55KTogc3RyaW5nW10ge1xuICAgIGNvbnN0IGxpbmVzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGxpbmVzLnB1c2goJ1RIUkVTSE9MRCBTVEFUVVM6Jyk7XG4gICAgbGluZXMucHVzaCgnLScucmVwZWF0KDYwKSk7XG5cbiAgICBpZiAodGhyZXNob2xkLmxldmVsID09PSAnbm9uZScpIHtcbiAgICAgIGxpbmVzLnB1c2goJyAgTm8gdGhyZXNob2xkcyBjb25maWd1cmVkJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHN0YXR1cyA9IHRocmVzaG9sZC5wYXNzZWQgPyAnUEFTU0VEJyA6ICdFWENFRURFRCc7XG4gICAgICBsaW5lcy5wdXNoKGAgIFN0YXR1czogJHtzdGF0dXN9YCk7XG5cbiAgICAgIGlmICh0aHJlc2hvbGQudGhyZXNob2xkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgbGluZXMucHVzaChcbiAgICAgICAgICBgICBUaHJlc2hvbGQ6ICQke3RocmVzaG9sZC50aHJlc2hvbGQudG9GaXhlZCgyKX0vbW9udGggKCR7dGhyZXNob2xkLmxldmVsfSlgLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgbGluZXMucHVzaChcbiAgICAgICAgYCAgQWN0dWFsIERlbHRhOiAkJHtNYXRoLmFicyh0aHJlc2hvbGQuZGVsdGEpLnRvRml4ZWQoMil9L21vbnRoYCxcbiAgICAgICk7XG5cbiAgICAgIGlmIChcbiAgICAgICAgIXRocmVzaG9sZC5wYXNzZWQgJiZcbiAgICAgICAgdGhyZXNob2xkLnJlY29tbWVuZGF0aW9ucyAmJlxuICAgICAgICB0aHJlc2hvbGQucmVjb21tZW5kYXRpb25zLmxlbmd0aCA+IDBcbiAgICAgICkge1xuICAgICAgICBsaW5lcy5wdXNoKCcgIFJlY29tbWVuZGF0aW9uczonKTtcbiAgICAgICAgZm9yIChjb25zdCByZWMgb2YgdGhyZXNob2xkLnJlY29tbWVuZGF0aW9ucykge1xuICAgICAgICAgIGxpbmVzLnB1c2goYCAgICAtICR7cmVjfWApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGxpbmVzO1xuICB9XG5cbiAgcHJpdmF0ZSBmb3JtYXRDb25maWdTdW1tYXJ5TWFya2Rvd24oY29uZmlnOiBDb25maWdTdW1tYXJ5KTogc3RyaW5nW10ge1xuICAgIGNvbnN0IGxpbmVzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGxpbmVzLnB1c2goJzxkZXRhaWxzPicpO1xuICAgIGxpbmVzLnB1c2goJzxzdW1tYXJ5PjxzdHJvbmc+8J+TiyBDb25maWd1cmF0aW9uICYgQXNzdW1wdGlvbnM8L3N0cm9uZz48L3N1bW1hcnk+Jyk7XG4gICAgbGluZXMucHVzaCgnJyk7XG5cbiAgICBpZiAoY29uZmlnLmNvbmZpZ1BhdGgpIHtcbiAgICAgIGxpbmVzLnB1c2goYCoqQ29uZmlndXJhdGlvbiBGaWxlOioqIFxcYCR7Y29uZmlnLmNvbmZpZ1BhdGh9XFxgYCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxpbmVzLnB1c2goJyoqQ29uZmlndXJhdGlvbiBGaWxlOioqIFVzaW5nIGRlZmF1bHRzJyk7XG4gICAgfVxuICAgIGxpbmVzLnB1c2goJycpO1xuXG4gICAgaWYgKGNvbmZpZy50aHJlc2hvbGRzKSB7XG4gICAgICBsaW5lcy5wdXNoKCcqKlRocmVzaG9sZHM6KionKTtcbiAgICAgIGlmIChjb25maWcudGhyZXNob2xkcy5lbnZpcm9ubWVudCkge1xuICAgICAgICBsaW5lcy5wdXNoKGAtIEVudmlyb25tZW50OiAke2NvbmZpZy50aHJlc2hvbGRzLmVudmlyb25tZW50fWApO1xuICAgICAgfVxuICAgICAgaWYgKGNvbmZpZy50aHJlc2hvbGRzLndhcm5pbmcgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBsaW5lcy5wdXNoKGAtIFdhcm5pbmc6ICQke2NvbmZpZy50aHJlc2hvbGRzLndhcm5pbmcudG9GaXhlZCgyKX0vbW9udGhgKTtcbiAgICAgIH1cbiAgICAgIGlmIChjb25maWcudGhyZXNob2xkcy5lcnJvciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGxpbmVzLnB1c2goYC0gRXJyb3I6ICQke2NvbmZpZy50aHJlc2hvbGRzLmVycm9yLnRvRml4ZWQoMil9L21vbnRoYCk7XG4gICAgICB9XG4gICAgICBsaW5lcy5wdXNoKCcnKTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICBjb25maWcuZXhjbHVkZWRSZXNvdXJjZVR5cGVzICYmXG4gICAgICBjb25maWcuZXhjbHVkZWRSZXNvdXJjZVR5cGVzLmxlbmd0aCA+IDBcbiAgICApIHtcbiAgICAgIGxpbmVzLnB1c2goJyoqRXhjbHVkZWQgUmVzb3VyY2UgVHlwZXM6KionKTtcbiAgICAgIGZvciAoY29uc3QgdHlwZSBvZiBjb25maWcuZXhjbHVkZWRSZXNvdXJjZVR5cGVzKSB7XG4gICAgICAgIGxpbmVzLnB1c2goYC0gXFxgJHt0eXBlfVxcYGApO1xuICAgICAgfVxuICAgICAgbGluZXMucHVzaCgnJyk7XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgY29uZmlnLnVzYWdlQXNzdW1wdGlvbnMgJiZcbiAgICAgIE9iamVjdC5rZXlzKGNvbmZpZy51c2FnZUFzc3VtcHRpb25zKS5sZW5ndGggPiAwXG4gICAgKSB7XG4gICAgICBsaW5lcy5wdXNoKCcqKkN1c3RvbSBVc2FnZSBBc3N1bXB0aW9uczoqKicpO1xuICAgICAgZm9yIChjb25zdCBbcmVzb3VyY2VUeXBlLCBhc3N1bXB0aW9uc10gb2YgT2JqZWN0LmVudHJpZXMoXG4gICAgICAgIGNvbmZpZy51c2FnZUFzc3VtcHRpb25zLFxuICAgICAgKSkge1xuICAgICAgICBsaW5lcy5wdXNoKGAtICoqJHtyZXNvdXJjZVR5cGV9OioqYCk7XG4gICAgICAgIGNvbnN0IGFzc3VtcHRpb25PYmogPSBhc3N1bXB0aW9ucyBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhhc3N1bXB0aW9uT2JqKSkge1xuICAgICAgICAgIGxpbmVzLnB1c2goYCAgLSAke2tleX06ICR7dmFsdWV9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGxpbmVzLnB1c2goJycpO1xuICAgIH1cblxuICAgIGxpbmVzLnB1c2goJzwvZGV0YWlscz4nKTtcbiAgICBsaW5lcy5wdXNoKCcnKTtcblxuICAgIHJldHVybiBsaW5lcztcbiAgfVxuXG4gIHByaXZhdGUgZm9ybWF0VGhyZXNob2xkU3RhdHVzTWFya2Rvd24oXG4gICAgdGhyZXNob2xkOiBhbnksXG4gICAgY29zdERlbHRhOiBDb3N0RGVsdGEsXG4gICk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBbXTtcblxuICAgIGlmICh0aHJlc2hvbGQubGV2ZWwgPT09ICdub25lJykge1xuICAgICAgcmV0dXJuIGxpbmVzO1xuICAgIH1cblxuICAgIGNvbnN0IHBhc3NlZCA9IHRocmVzaG9sZC5wYXNzZWQ7XG4gICAgY29uc3Qgc3RhdHVzRW1vamkgPSBwYXNzZWQgPyAn4pyFJyA6ICfwn5qoJztcbiAgICBjb25zdCBzdGF0dXMgPSBwYXNzZWQgPyAnUEFTU0VEJyA6ICdFWENFRURFRCc7XG5cbiAgICBsaW5lcy5wdXNoKGAjIyAke3N0YXR1c0Vtb2ppfSBUaHJlc2hvbGQgU3RhdHVzOiAke3N0YXR1c31gKTtcbiAgICBsaW5lcy5wdXNoKCcnKTtcblxuICAgIGlmICh0aHJlc2hvbGQudGhyZXNob2xkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGxpbmVzLnB1c2goXG4gICAgICAgIGAqKlRocmVzaG9sZDoqKiAkJHt0aHJlc2hvbGQudGhyZXNob2xkLnRvRml4ZWQoMil9L21vbnRoICgke3RocmVzaG9sZC5sZXZlbH0pYCxcbiAgICAgICk7XG4gICAgfVxuICAgIGxpbmVzLnB1c2goXG4gICAgICBgKipBY3R1YWwgRGVsdGE6KiogJHt0aGlzLmZvcm1hdERlbHRhKHRocmVzaG9sZC5kZWx0YSwgY29zdERlbHRhLmN1cnJlbmN5KX0vbW9udGhgLFxuICAgICk7XG4gICAgbGluZXMucHVzaCgnJyk7XG5cbiAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgbGluZXMucHVzaCgnIyMjIOKaoO+4jyBBY3Rpb24gUmVxdWlyZWQnKTtcbiAgICAgIGxpbmVzLnB1c2goJycpO1xuICAgICAgbGluZXMucHVzaCh0aHJlc2hvbGQubWVzc2FnZSk7XG4gICAgICBsaW5lcy5wdXNoKCcnKTtcblxuICAgICAgaWYgKHRocmVzaG9sZC5yZWNvbW1lbmRhdGlvbnMgJiYgdGhyZXNob2xkLnJlY29tbWVuZGF0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGxpbmVzLnB1c2goJyMjIyDwn5KhIFJlY29tbWVuZGF0aW9ucycpO1xuICAgICAgICBsaW5lcy5wdXNoKCcnKTtcbiAgICAgICAgZm9yIChjb25zdCByZWMgb2YgdGhyZXNob2xkLnJlY29tbWVuZGF0aW9ucykge1xuICAgICAgICAgIGxpbmVzLnB1c2goYC0gJHtyZWN9YCk7XG4gICAgICAgIH1cbiAgICAgICAgbGluZXMucHVzaCgnJyk7XG4gICAgICB9XG5cbiAgICAgIC8vIFNob3cgdG9wIGNvc3QgY29udHJpYnV0b3JzXG4gICAgICBjb25zdCB0b3BDb250cmlidXRvcnMgPSB0aGlzLmdldFRvcENvc3RDb250cmlidXRvcnMoY29zdERlbHRhLCA1KTtcbiAgICAgIGlmICh0b3BDb250cmlidXRvcnMubGVuZ3RoID4gMCkge1xuICAgICAgICBsaW5lcy5wdXNoKCcjIyMg8J+UnSBUb3AgQ29zdCBDb250cmlidXRvcnMnKTtcbiAgICAgICAgbGluZXMucHVzaCgnJyk7XG4gICAgICAgIGxpbmVzLnB1c2goJ3wgUmVzb3VyY2UgfCBUeXBlIHwgSW1wYWN0IHwgVHJlbmQgfCcpO1xuICAgICAgICBsaW5lcy5wdXNoKCd8LS0tLS0tLS0tLXwtLS0tLS18LS0tLS0tLS18LS0tLS0tLXwnKTtcbiAgICAgICAgZm9yIChjb25zdCBjb250cmlidXRvciBvZiB0b3BDb250cmlidXRvcnMpIHtcbiAgICAgICAgICBjb25zdCB0cmVuZCA9IGdldFRyZW5kSW5kaWNhdG9yKGNvbnRyaWJ1dG9yLmltcGFjdCk7XG4gICAgICAgICAgbGluZXMucHVzaChcbiAgICAgICAgICAgIGB8ICR7Y29udHJpYnV0b3IubG9naWNhbElkfSB8IFxcYCR7Y29udHJpYnV0b3IudHlwZX1cXGAgfCAke3RoaXMuZm9ybWF0RGVsdGEoY29udHJpYnV0b3IuaW1wYWN0LCBjb3N0RGVsdGEuY3VycmVuY3kpfSB8ICR7dHJlbmR9IHxgLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgbGluZXMucHVzaCgnJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGxpbmVzO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRUb3BDb3N0Q29udHJpYnV0b3JzKFxuICAgIGNvc3REZWx0YTogQ29zdERlbHRhLFxuICAgIGxpbWl0OiBudW1iZXIsXG4gICk6IEFycmF5PHsgbG9naWNhbElkOiBzdHJpbmc7IHR5cGU6IHN0cmluZzsgaW1wYWN0OiBudW1iZXIgfT4ge1xuICAgIGNvbnN0IGNvbnRyaWJ1dG9yczogQXJyYXk8e1xuICAgICAgbG9naWNhbElkOiBzdHJpbmc7XG4gICAgICB0eXBlOiBzdHJpbmc7XG4gICAgICBpbXBhY3Q6IG51bWJlcjtcbiAgICB9PiA9IFtdO1xuXG4gICAgLy8gQWRkIGFkZGVkIHJlc291cmNlc1xuICAgIGZvciAoY29uc3QgcmVzb3VyY2Ugb2YgY29zdERlbHRhLmFkZGVkQ29zdHMpIHtcbiAgICAgIGNvbnRyaWJ1dG9ycy5wdXNoKHtcbiAgICAgICAgbG9naWNhbElkOiByZXNvdXJjZS5sb2dpY2FsSWQsXG4gICAgICAgIHR5cGU6IHJlc291cmNlLnR5cGUsXG4gICAgICAgIGltcGFjdDogcmVzb3VyY2UubW9udGhseUNvc3QuYW1vdW50LFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gQWRkIHJlbW92ZWQgcmVzb3VyY2VzIChuZWdhdGl2ZSBpbXBhY3QpXG4gICAgZm9yIChjb25zdCByZXNvdXJjZSBvZiBjb3N0RGVsdGEucmVtb3ZlZENvc3RzKSB7XG4gICAgICBjb250cmlidXRvcnMucHVzaCh7XG4gICAgICAgIGxvZ2ljYWxJZDogcmVzb3VyY2UubG9naWNhbElkLFxuICAgICAgICB0eXBlOiByZXNvdXJjZS50eXBlLFxuICAgICAgICBpbXBhY3Q6IC1yZXNvdXJjZS5tb250aGx5Q29zdC5hbW91bnQsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBBZGQgbW9kaWZpZWQgcmVzb3VyY2VzXG4gICAgZm9yIChjb25zdCByZXNvdXJjZSBvZiBjb3N0RGVsdGEubW9kaWZpZWRDb3N0cykge1xuICAgICAgY29udHJpYnV0b3JzLnB1c2goe1xuICAgICAgICBsb2dpY2FsSWQ6IHJlc291cmNlLmxvZ2ljYWxJZCxcbiAgICAgICAgdHlwZTogcmVzb3VyY2UudHlwZSxcbiAgICAgICAgaW1wYWN0OiByZXNvdXJjZS5jb3N0RGVsdGEsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBTb3J0IGJ5IGFic29sdXRlIGltcGFjdCAoZGVzY2VuZGluZylcbiAgICBjb250cmlidXRvcnMuc29ydCgoYSwgYikgPT4gTWF0aC5hYnMoYi5pbXBhY3QpIC0gTWF0aC5hYnMoYS5pbXBhY3QpKTtcblxuICAgIHJldHVybiBjb250cmlidXRvcnMuc2xpY2UoMCwgbGltaXQpO1xuICB9XG5cbiAgcHJpdmF0ZSBmb3JtYXRTdGFja0RldGFpbHNNYXJrZG93bihjb3N0RGVsdGE6IENvc3REZWx0YSk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBbXTtcblxuICAgIGlmIChjb3N0RGVsdGEuYWRkZWRDb3N0cy5sZW5ndGggPiAwKSB7XG4gICAgICBsaW5lcy5wdXNoKCcqKvCfk4ggQWRkZWQgUmVzb3VyY2VzOioqJyk7XG4gICAgICBsaW5lcy5wdXNoKCcnKTtcbiAgICAgIGxpbmVzLnB1c2goJ3wgUmVzb3VyY2UgfCBUeXBlIHwgTW9udGhseSBDb3N0IHwnKTtcbiAgICAgIGxpbmVzLnB1c2goJ3wtLS0tLS0tLS0tfC0tLS0tLXwtLS0tLS0tLS0tLS0tLXwnKTtcblxuICAgICAgY29uc3Qgc29ydGVkQWRkZWQgPSBbLi4uY29zdERlbHRhLmFkZGVkQ29zdHNdLnNvcnQoXG4gICAgICAgIChhLCBiKSA9PiBiLm1vbnRobHlDb3N0LmFtb3VudCAtIGEubW9udGhseUNvc3QuYW1vdW50LFxuICAgICAgKTtcblxuICAgICAgZm9yIChjb25zdCByZXNvdXJjZSBvZiBzb3J0ZWRBZGRlZCkge1xuICAgICAgICBsaW5lcy5wdXNoKFxuICAgICAgICAgIGB8ICR7cmVzb3VyY2UubG9naWNhbElkfSB8IFxcYCR7cmVzb3VyY2UudHlwZX1cXGAgfCAke3RoaXMuZm9ybWF0Q3VycmVuY3kocmVzb3VyY2UubW9udGhseUNvc3QuYW1vdW50LCBjb3N0RGVsdGEuY3VycmVuY3kpfSB8YCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGxpbmVzLnB1c2goJycpO1xuICAgIH1cblxuICAgIGlmIChjb3N0RGVsdGEucmVtb3ZlZENvc3RzLmxlbmd0aCA+IDApIHtcbiAgICAgIGxpbmVzLnB1c2goJyoq8J+TiSBSZW1vdmVkIFJlc291cmNlczoqKicpO1xuICAgICAgbGluZXMucHVzaCgnJyk7XG4gICAgICBsaW5lcy5wdXNoKCd8IFJlc291cmNlIHwgVHlwZSB8IE1vbnRobHkgU2F2aW5ncyB8Jyk7XG4gICAgICBsaW5lcy5wdXNoKCd8LS0tLS0tLS0tLXwtLS0tLS18LS0tLS0tLS0tLS0tLS0tLS18Jyk7XG5cbiAgICAgIGNvbnN0IHNvcnRlZFJlbW92ZWQgPSBbLi4uY29zdERlbHRhLnJlbW92ZWRDb3N0c10uc29ydChcbiAgICAgICAgKGEsIGIpID0+IGIubW9udGhseUNvc3QuYW1vdW50IC0gYS5tb250aGx5Q29zdC5hbW91bnQsXG4gICAgICApO1xuXG4gICAgICBmb3IgKGNvbnN0IHJlc291cmNlIG9mIHNvcnRlZFJlbW92ZWQpIHtcbiAgICAgICAgbGluZXMucHVzaChcbiAgICAgICAgICBgfCAke3Jlc291cmNlLmxvZ2ljYWxJZH0gfCBcXGAke3Jlc291cmNlLnR5cGV9XFxgIHwgJHt0aGlzLmZvcm1hdEN1cnJlbmN5KHJlc291cmNlLm1vbnRobHlDb3N0LmFtb3VudCwgY29zdERlbHRhLmN1cnJlbmN5KX0gfGAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBsaW5lcy5wdXNoKCcnKTtcbiAgICB9XG5cbiAgICBpZiAoY29zdERlbHRhLm1vZGlmaWVkQ29zdHMubGVuZ3RoID4gMCkge1xuICAgICAgbGluZXMucHVzaCgnKirwn5SEIE1vZGlmaWVkIFJlc291cmNlczoqKicpO1xuICAgICAgbGluZXMucHVzaCgnJyk7XG4gICAgICBsaW5lcy5wdXNoKCd8IFJlc291cmNlIHwgVHlwZSB8IEJlZm9yZSB8IEFmdGVyIHwgQ2hhbmdlIHwnKTtcbiAgICAgIGxpbmVzLnB1c2goJ3wtLS0tLS0tLS0tfC0tLS0tLXwtLS0tLS0tLXwtLS0tLS0tfC0tLS0tLS0tfCcpO1xuXG4gICAgICBjb25zdCBzb3J0ZWRNb2RpZmllZCA9IFsuLi5jb3N0RGVsdGEubW9kaWZpZWRDb3N0c10uc29ydChcbiAgICAgICAgKGEsIGIpID0+IE1hdGguYWJzKGIuY29zdERlbHRhKSAtIE1hdGguYWJzKGEuY29zdERlbHRhKSxcbiAgICAgICk7XG5cbiAgICAgIGZvciAoY29uc3QgcmVzb3VyY2Ugb2Ygc29ydGVkTW9kaWZpZWQpIHtcbiAgICAgICAgY29uc3QgdHJlbmQgPSBnZXRUcmVuZEluZGljYXRvcihyZXNvdXJjZS5jb3N0RGVsdGEpO1xuICAgICAgICBjb25zdCBwZXJjZW50Q2hhbmdlID0gZ2V0UGVyY2VudGFnZUNoYW5nZShcbiAgICAgICAgICByZXNvdXJjZS5vbGRNb250aGx5Q29zdC5hbW91bnQsXG4gICAgICAgICAgcmVzb3VyY2UubmV3TW9udGhseUNvc3QuYW1vdW50LFxuICAgICAgICApO1xuICAgICAgICBsaW5lcy5wdXNoKFxuICAgICAgICAgIGB8ICR7cmVzb3VyY2UubG9naWNhbElkfSB8IFxcYCR7cmVzb3VyY2UudHlwZX1cXGAgfCBgICtcbiAgICAgICAgICAgIGAke3RoaXMuZm9ybWF0Q3VycmVuY3kocmVzb3VyY2Uub2xkTW9udGhseUNvc3QuYW1vdW50LCBjb3N0RGVsdGEuY3VycmVuY3kpfSB8IGAgK1xuICAgICAgICAgICAgYCR7dGhpcy5mb3JtYXRDdXJyZW5jeShyZXNvdXJjZS5uZXdNb250aGx5Q29zdC5hbW91bnQsIGNvc3REZWx0YS5jdXJyZW5jeSl9IHwgYCArXG4gICAgICAgICAgICBgJHt0aGlzLmZvcm1hdERlbHRhKHJlc291cmNlLmNvc3REZWx0YSwgY29zdERlbHRhLmN1cnJlbmN5KX0gKCR7cGVyY2VudENoYW5nZX0pICR7dHJlbmR9IHxgLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgbGluZXMucHVzaCgnJyk7XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgY29zdERlbHRhLmFkZGVkQ29zdHMubGVuZ3RoID09PSAwICYmXG4gICAgICBjb3N0RGVsdGEucmVtb3ZlZENvc3RzLmxlbmd0aCA9PT0gMCAmJlxuICAgICAgY29zdERlbHRhLm1vZGlmaWVkQ29zdHMubGVuZ3RoID09PSAwXG4gICAgKSB7XG4gICAgICBsaW5lcy5wdXNoKCdObyByZXNvdXJjZSBjaGFuZ2VzIGRldGVjdGVkLicpO1xuICAgICAgbGluZXMucHVzaCgnJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGxpbmVzO1xuICB9XG59XG4iXX0=