@vendure/admin-ui 1.6.4 → 1.7.1

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 (86) hide show
  1. package/bundles/vendure-admin-ui-catalog.umd.js +196 -20
  2. package/bundles/vendure-admin-ui-catalog.umd.js.map +1 -1
  3. package/bundles/vendure-admin-ui-core.umd.js +292 -323
  4. package/bundles/vendure-admin-ui-core.umd.js.map +1 -1
  5. package/bundles/vendure-admin-ui-customer.umd.js +39 -18
  6. package/bundles/vendure-admin-ui-customer.umd.js.map +1 -1
  7. package/bundles/vendure-admin-ui-order.umd.js +141 -119
  8. package/bundles/vendure-admin-ui-order.umd.js.map +1 -1
  9. package/catalog/components/generate-product-variants/generate-product-variants.component.d.ts +3 -3
  10. package/catalog/components/option-value-input/option-value-input.component.d.ts +20 -8
  11. package/catalog/components/product-variants-editor/product-variants-editor.component.d.ts +10 -3
  12. package/catalog/vendure-admin-ui-catalog.metadata.json +1 -1
  13. package/core/common/generated-types.d.ts +89 -19
  14. package/core/common/utilities/configurable-operation-utils.d.ts +4 -2
  15. package/core/common/version.d.ts +1 -1
  16. package/core/data/definitions/order-definitions.d.ts +2 -0
  17. package/core/data/definitions/product-definitions.d.ts +1 -0
  18. package/core/data/providers/order-data.service.d.ts +1 -0
  19. package/core/data/providers/product-data.service.d.ts +1 -0
  20. package/core/shared/components/custom-field-control/custom-field-control.component.d.ts +6 -2
  21. package/core/shared/components/data-table/data-table.component.d.ts +5 -2
  22. package/core/shared/dynamic-form-inputs/register-dynamic-input-components.d.ts +2 -1
  23. package/core/shared/dynamic-form-inputs/select-form-input/select-form-input.component.d.ts +10 -2
  24. package/core/shared/pipes/custom-field-label.pipe.d.ts +4 -10
  25. package/core/vendure-admin-ui-core.metadata.json +1 -1
  26. package/customer/components/customer-group-list/customer-group-list.component.d.ts +6 -4
  27. package/customer/vendure-admin-ui-customer.metadata.json +1 -1
  28. package/esm2015/catalog/components/generate-product-variants/generate-product-variants.component.js +12 -5
  29. package/esm2015/catalog/components/option-value-input/option-value-input.component.js +62 -12
  30. package/esm2015/catalog/components/product-variants-editor/product-variants-editor.component.js +109 -11
  31. package/esm2015/core/common/generated-types.js +2 -1
  32. package/esm2015/core/common/introspection-result.js +191 -255
  33. package/esm2015/core/common/utilities/configurable-operation-utils.js +11 -8
  34. package/esm2015/core/common/version.js +2 -2
  35. package/esm2015/core/components/app-shell/app-shell.component.js +1 -1
  36. package/esm2015/core/components/main-nav/main-nav.component.js +1 -1
  37. package/esm2015/core/data/definitions/order-definitions.js +39 -25
  38. package/esm2015/core/data/definitions/product-definitions.js +743 -735
  39. package/esm2015/core/data/providers/order-data.service.js +7 -2
  40. package/esm2015/core/data/providers/product-data.service.js +5 -2
  41. package/esm2015/core/shared/components/custom-field-control/custom-field-control.component.js +9 -3
  42. package/esm2015/core/shared/components/data-table/data-table.component.js +9 -2
  43. package/esm2015/core/shared/dynamic-form-inputs/select-form-input/select-form-input.component.js +15 -2
  44. package/esm2015/core/shared/pipes/custom-field-label.pipe.js +4 -19
  45. package/esm2015/customer/components/customer-group-list/customer-group-list.component.js +25 -12
  46. package/esm2015/order/components/fulfill-order-dialog/fulfill-order-dialog.component.js +3 -2
  47. package/esm2015/order/components/fulfillment-detail/fulfillment-detail.component.js +9 -18
  48. package/esm2015/order/components/line-fulfillment/line-fulfillment.component.js +10 -21
  49. package/esm2015/order/components/order-custom-fields-card/order-custom-fields-card.component.js +30 -4
  50. package/esm2015/order/components/order-detail/order-detail.component.js +49 -20
  51. package/esm2015/order/components/order-list/order-list.component.js +22 -15
  52. package/esm2015/order/components/order-payment-card/order-payment-card.component.js +2 -2
  53. package/esm2015/order/components/order-table/order-table.component.js +1 -1
  54. package/fesm2015/vendure-admin-ui-catalog.js +177 -22
  55. package/fesm2015/vendure-admin-ui-catalog.js.map +1 -1
  56. package/fesm2015/vendure-admin-ui-core.js +975 -995
  57. package/fesm2015/vendure-admin-ui-core.js.map +1 -1
  58. package/fesm2015/vendure-admin-ui-customer.js +23 -11
  59. package/fesm2015/vendure-admin-ui-customer.js.map +1 -1
  60. package/fesm2015/vendure-admin-ui-order.js +116 -75
  61. package/fesm2015/vendure-admin-ui-order.js.map +1 -1
  62. package/order/components/line-fulfillment/line-fulfillment.component.d.ts +2 -2
  63. package/order/components/modification-detail/modification-detail.component.d.ts +1 -1
  64. package/order/components/order-custom-fields-card/order-custom-fields-card.component.d.ts +4 -2
  65. package/order/components/order-list/order-list.component.d.ts +1 -0
  66. package/order/vendure-admin-ui-order.metadata.json +1 -1
  67. package/package.json +2 -2
  68. package/static/i18n-messages/cs.json +6 -2
  69. package/static/i18n-messages/de.json +6 -2
  70. package/static/i18n-messages/en.json +8 -3
  71. package/static/i18n-messages/es.json +6 -2
  72. package/static/i18n-messages/fr.json +6 -2
  73. package/static/i18n-messages/it.json +6 -2
  74. package/static/i18n-messages/pl.json +6 -2
  75. package/static/i18n-messages/pt_BR.json +6 -2
  76. package/static/i18n-messages/pt_PT.json +6 -2
  77. package/static/i18n-messages/ru.json +6 -2
  78. package/static/i18n-messages/uk.json +6 -2
  79. package/static/i18n-messages/zh_Hans.json +6 -2
  80. package/static/i18n-messages/zh_Hant.json +6 -2
  81. package/static/styles/_variables.scss +3 -0
  82. package/static/styles/global/_sass-overrides.scss +3 -0
  83. package/static/styles/global/_utilities.scss +1 -0
  84. package/static/styles/styles.scss +1 -0
  85. package/static/styles/ui-extension-theme.scss +1 -0
  86. package/static/theme.min.css +1 -1
@@ -1,4 +1,4 @@
1
- import { ChangeDetectionStrategy, ChangeDetectorRef, Component, forwardRef, Input, ViewChild, } from '@angular/core';
1
+ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, EventEmitter, forwardRef, Input, Output, ViewChild, ViewChildren, } from '@angular/core';
2
2
  import { NG_VALUE_ACCESSOR } from '@angular/forms';
3
3
  import { unique } from '@vendure/common/lib/unique';
4
4
  export const OPTION_VALUE_INPUT_VALUE_ACCESSOR = {
@@ -10,10 +10,18 @@ export class OptionValueInputComponent {
10
10
  constructor(changeDetector) {
11
11
  this.changeDetector = changeDetector;
12
12
  this.groupName = '';
13
+ this.add = new EventEmitter();
14
+ this.remove = new EventEmitter();
15
+ this.edit = new EventEmitter();
13
16
  this.disabled = false;
14
17
  this.input = '';
15
18
  this.isFocussed = false;
16
19
  this.lastSelected = false;
20
+ this.editingIndex = -1;
21
+ }
22
+ get optionValues() {
23
+ var _a, _b;
24
+ return (_b = (_a = this.formValue) !== null && _a !== void 0 ? _a : this.options) !== null && _b !== void 0 ? _b : [];
17
25
  }
18
26
  registerOnChange(fn) {
19
27
  this.onChangeFn = fn;
@@ -26,15 +34,42 @@ export class OptionValueInputComponent {
26
34
  this.changeDetector.markForCheck();
27
35
  }
28
36
  writeValue(obj) {
29
- this.options = obj || [];
37
+ this.formValue = obj || [];
30
38
  }
31
39
  focus() {
32
40
  this.textArea.nativeElement.focus();
33
41
  }
42
+ editName(index, event) {
43
+ var _a;
44
+ const optionValue = this.optionValues[index];
45
+ if (!optionValue.locked && !optionValue.id) {
46
+ event.cancelBubble = true;
47
+ this.editingIndex = index;
48
+ const input = (_a = this.nameInputs.get(index)) === null || _a === void 0 ? void 0 : _a.nativeElement;
49
+ setTimeout(() => input === null || input === void 0 ? void 0 : input.focus());
50
+ }
51
+ }
52
+ updateOption(index, event) {
53
+ const optionValue = this.optionValues[index];
54
+ const newName = event.target.value;
55
+ if (optionValue) {
56
+ if (newName) {
57
+ optionValue.name = newName;
58
+ this.edit.emit({ index, option: optionValue });
59
+ }
60
+ this.editingIndex = -1;
61
+ }
62
+ }
34
63
  removeOption(option) {
64
+ var _a;
35
65
  if (!option.locked) {
36
- this.options = this.options.filter(o => o.name !== option.name);
37
- this.onChangeFn(this.options);
66
+ if (this.formValue) {
67
+ this.formValue = (_a = this.formValue) === null || _a === void 0 ? void 0 : _a.filter(o => o.name !== option.name);
68
+ this.onChangeFn(this.formValue);
69
+ }
70
+ else {
71
+ this.remove.emit(option);
72
+ }
38
73
  }
39
74
  }
40
75
  handleKey(event) {
@@ -62,9 +97,17 @@ export class OptionValueInputComponent {
62
97
  this.addOptionValue();
63
98
  }
64
99
  addOptionValue() {
65
- this.options = unique([...this.options, ...this.parseInputIntoOptions(this.input)]);
100
+ const options = this.parseInputIntoOptions(this.input);
101
+ if (!this.formValue && this.options) {
102
+ for (const option of options) {
103
+ this.add.emit(option);
104
+ }
105
+ }
106
+ else {
107
+ this.formValue = unique([...this.formValue, ...options]);
108
+ this.onChangeFn(this.formValue);
109
+ }
66
110
  this.input = '';
67
- this.onChangeFn(this.options);
68
111
  }
69
112
  parseInputIntoOptions(input) {
70
113
  return input
@@ -74,18 +117,19 @@ export class OptionValueInputComponent {
74
117
  .map(s => ({ name: s, locked: false }));
75
118
  }
76
119
  removeLastOption() {
77
- if (!this.options[this.options.length - 1].locked) {
78
- this.options = this.options.slice(0, this.options.length - 1);
120
+ if (this.optionValues.length) {
121
+ const option = this.optionValues[this.optionValues.length - 1];
122
+ this.removeOption(option);
79
123
  }
80
124
  }
81
125
  }
82
126
  OptionValueInputComponent.decorators = [
83
127
  { type: Component, args: [{
84
128
  selector: 'vdr-option-value-input',
85
- template: "<div class=\"input-wrapper\" [class.focus]=\"isFocussed\" (click)=\"textArea.focus()\">\r\n <div class=\"chips\" *ngIf=\"0 < options.length\">\r\n <vdr-chip\r\n *ngFor=\"let option of options; last as isLast\"\r\n [icon]=\"option.locked ? 'lock' : 'times'\"\r\n [class.selected]=\"isLast && lastSelected\"\r\n [class.locked]=\"option.locked\"\r\n [colorFrom]=\"groupName\"\r\n (iconClick)=\"removeOption(option)\"\r\n >\r\n {{ option.name }}\r\n </vdr-chip>\r\n </div>\r\n <textarea\r\n #textArea\r\n (keyup)=\"handleKey($event)\"\r\n (focus)=\"isFocussed = true\"\r\n (blur)=\"handleBlur()\"\r\n [(ngModel)]=\"input\"\r\n [disabled]=\"disabled\"\r\n ></textarea>\r\n</div>\r\n",
129
+ template: "<div class=\"input-wrapper\" [class.focus]=\"isFocussed\" (click)=\"textArea.focus()\">\r\n <div class=\"chips\" *ngIf=\"0 < optionValues.length\">\r\n <vdr-chip\r\n *ngFor=\"let option of optionValues; last as isLast; index as i\"\r\n [icon]=\"option.locked ? 'lock' : 'times'\"\r\n [class.selected]=\"isLast && lastSelected\"\r\n [class.locked]=\"option.locked\"\r\n [colorFrom]=\"groupName\"\r\n (iconClick)=\"removeOption(option)\"\r\n >\r\n <span [hidden]=\"editingIndex !== i\">\r\n <input\r\n #editNameInput\r\n type=\"text\"\r\n [ngModel]=\"option.name\"\r\n (blur)=\"updateOption(i, $event)\"\r\n (click)=\"$event.cancelBubble = true\"\r\n />\r\n </span>\r\n <span\r\n class=\"option-name\"\r\n [class.editable]=\"!option.locked && !option.id\"\r\n (click)=\"editName(i, $event)\" [hidden]=\"editingIndex === i\">{{ option.name }}</span>\r\n </vdr-chip>\r\n </div>\r\n <textarea\r\n #textArea\r\n (keyup)=\"handleKey($event)\"\r\n (focus)=\"isFocussed = true\"\r\n (blur)=\"handleBlur()\"\r\n [(ngModel)]=\"input\"\r\n [disabled]=\"disabled\"\r\n ></textarea>\r\n</div>\r\n",
86
130
  changeDetection: ChangeDetectionStrategy.Default,
87
131
  providers: [OPTION_VALUE_INPUT_VALUE_ACCESSOR],
88
- styles: [".input-wrapper{background-color:#fff;border-radius:3px!important;border:1px solid var(--color-grey-300)!important;cursor:text}.input-wrapper.focus{border-color:var(--color-primary-500)!important;box-shadow:0 0 1px 1px var(--color-primary-100)}.input-wrapper .chips{padding:5px}.input-wrapper textarea{border:none;width:100%;height:24px;margin-top:3px;padding:0 6px}.input-wrapper textarea:focus{outline:none}.input-wrapper textarea:disabled{background-color:var(--color-component-bg-100)}vdr-chip ::ng-deep .wrapper{margin:0 3px}vdr-chip.locked{opacity:.8}vdr-chip.selected ::ng-deep .wrapper{border-color:var(--color-warning-500)!important;box-shadow:0 0 1px 1px var(--color-warning-400);opacity:.6}\n"]
132
+ styles: [".input-wrapper{background-color:#fff;border-radius:3px!important;border:1px solid var(--color-grey-300)!important;cursor:text}.input-wrapper.focus{border-color:var(--color-primary-500)!important;box-shadow:0 0 1px 1px var(--color-primary-100)}.input-wrapper .chips{padding:5px}.input-wrapper textarea{border:none;width:100%;height:24px;margin-top:3px;padding:0 6px}.input-wrapper textarea:focus{outline:none}.input-wrapper textarea:disabled{background-color:var(--color-component-bg-100)}vdr-chip ::ng-deep .wrapper{margin:0 3px}vdr-chip.locked{opacity:.8}vdr-chip.selected ::ng-deep .wrapper{border-color:var(--color-warning-500)!important;box-shadow:0 0 1px 1px var(--color-warning-400);opacity:.6}vdr-chip .option-name.editable:hover{outline:1px solid var(--color-component-bg-300);outline-offset:1px;border-radius:1px}vdr-chip input{padding:0!important;margin-top:-2px;margin-bottom:-2px}\n"]
89
133
  },] }
90
134
  ];
91
135
  OptionValueInputComponent.ctorParameters = () => [
@@ -93,6 +137,12 @@ OptionValueInputComponent.ctorParameters = () => [
93
137
  ];
94
138
  OptionValueInputComponent.propDecorators = {
95
139
  groupName: [{ type: Input }],
96
- textArea: [{ type: ViewChild, args: ['textArea', { static: true },] }]
140
+ textArea: [{ type: ViewChild, args: ['textArea', { static: true },] }],
141
+ nameInputs: [{ type: ViewChildren, args: ['editNameInput', { read: ElementRef },] }],
142
+ options: [{ type: Input }],
143
+ add: [{ type: Output }],
144
+ remove: [{ type: Output }],
145
+ edit: [{ type: Output }],
146
+ disabled: [{ type: Input }]
97
147
  };
98
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3B0aW9uLXZhbHVlLWlucHV0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY2F0YWxvZy9zcmMvY29tcG9uZW50cy9vcHRpb24tdmFsdWUtaW5wdXQvb3B0aW9uLXZhbHVlLWlucHV0LmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0gsdUJBQXVCLEVBQ3ZCLGlCQUFpQixFQUNqQixTQUFTLEVBRVQsVUFBVSxFQUNWLEtBQUssRUFFTCxTQUFTLEdBQ1osTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUF3QixpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3pFLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUVwRCxNQUFNLENBQUMsTUFBTSxpQ0FBaUMsR0FBYTtJQUN2RCxPQUFPLEVBQUUsaUJBQWlCO0lBQzFCLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMseUJBQXlCLENBQUM7SUFDeEQsS0FBSyxFQUFFLElBQUk7Q0FDZCxDQUFDO0FBU0YsTUFBTSxPQUFPLHlCQUF5QjtJQVdsQyxZQUFvQixjQUFpQztRQUFqQyxtQkFBYyxHQUFkLGNBQWMsQ0FBbUI7UUFWNUMsY0FBUyxHQUFHLEVBQUUsQ0FBQztRQUd4QixhQUFRLEdBQUcsS0FBSyxDQUFDO1FBQ2pCLFVBQUssR0FBRyxFQUFFLENBQUM7UUFDWCxlQUFVLEdBQUcsS0FBSyxDQUFDO1FBQ25CLGlCQUFZLEdBQUcsS0FBSyxDQUFDO0lBSW1DLENBQUM7SUFFekQsZ0JBQWdCLENBQUMsRUFBTztRQUNwQixJQUFJLENBQUMsVUFBVSxHQUFHLEVBQUUsQ0FBQztJQUN6QixDQUFDO0lBRUQsaUJBQWlCLENBQUMsRUFBTztRQUNyQixJQUFJLENBQUMsU0FBUyxHQUFHLEVBQUUsQ0FBQztJQUN4QixDQUFDO0lBRUQsZ0JBQWdCLENBQUMsVUFBbUI7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QXdCO2dCQUNsQyx5MEJBQWtEO2dCQUVsRCxlQUFlLEVBQUUsdUJBQXVCLENBQUMsT0FBTztnQkFDaEQsU0FBUyxFQUFFLENBQUMsaUNBQWlDLENBQUM7O2FBQ2pEOzs7WUF2QkcsaUJBQWlCOzs7d0JBeUJoQixLQUFLO3VCQUNMLFNBQVMsU0FBQyxVQUFVLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICAgIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxyXG4gICAgQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgICBDb21wb25lbnQsXHJcbiAgICBFbGVtZW50UmVmLFxyXG4gICAgZm9yd2FyZFJlZixcclxuICAgIElucHV0LFxyXG4gICAgUHJvdmlkZXIsXHJcbiAgICBWaWV3Q2hpbGQsXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBOR19WQUxVRV9BQ0NFU1NPUiB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgdW5pcXVlIH0gZnJvbSAnQHZlbmR1cmUvY29tbW9uL2xpYi91bmlxdWUnO1xyXG5cclxuZXhwb3J0IGNvbnN0IE9QVElPTl9WQUxVRV9JTlBVVF9WQUxVRV9BQ0NFU1NPUjogUHJvdmlkZXIgPSB7XHJcbiAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcclxuICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IE9wdGlvblZhbHVlSW5wdXRDb21wb25lbnQpLFxyXG4gICAgbXVsdGk6IHRydWUsXHJcbn07XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICAgIHNlbGVjdG9yOiAndmRyLW9wdGlvbi12YWx1ZS1pbnB1dCcsXHJcbiAgICB0ZW1wbGF0ZVVybDogJy4vb3B0aW9uLXZhbHVlLWlucHV0LmNvbXBvbmVudC5odG1sJyxcclxuICAgIHN0eWxlVXJsczogWycuL29wdGlvbi12YWx1ZS1pbnB1dC5jb21wb25lbnQuc2NzcyddLFxyXG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5EZWZhdWx0LFxyXG4gICAgcHJvdmlkZXJzOiBbT1BUSU9OX1ZBTFVFX0lOUFVUX1ZBTFVFX0FDQ0VTU09SXSxcclxufSlcclxuZXhwb3J0IGNsYXNzIE9wdGlvblZhbHVlSW5wdXRDb21wb25lbnQgaW1wbGVtZW50cyBDb250cm9sVmFsdWVBY2Nlc3NvciB7XHJcbiAgICBASW5wdXQoKSBncm91cE5hbWUgPSAnJztcclxuICAgIEBWaWV3Q2hpbGQoJ3RleHRBcmVhJywgeyBzdGF0aWM6IHRydWUgfSkgdGV4dEFyZWE6IEVsZW1lbnRSZWY8SFRNTFRleHRBcmVhRWxlbWVudD47XHJcbiAgICBvcHRpb25zOiBBcnJheTx7IG5hbWU6IHN0cmluZzsgbG9ja2VkOiBib29sZWFuIH0+O1xyXG4gICAgZGlzYWJsZWQgPSBmYWxzZTtcclxuICAgIGlucHV0ID0gJyc7XHJcbiAgICBpc0ZvY3Vzc2VkID0gZmFsc2U7XHJcbiAgICBsYXN0U2VsZWN0ZWQgPSBmYWxzZTtcclxuICAgIG9uQ2hhbmdlRm46ICh2YWx1ZTogYW55KSA9PiB2b2lkO1xyXG4gICAgb25Ub3VjaEZuOiAodmFsdWU6IGFueSkgPT4gdm9pZDtcclxuXHJcbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIGNoYW5nZURldGVjdG9yOiBDaGFuZ2VEZXRlY3RvclJlZikge31cclxuXHJcbiAgICByZWdpc3Rlck9uQ2hhbmdlKGZuOiBhbnkpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLm9uQ2hhbmdlRm4gPSBmbjtcclxuICAgIH1cclxuXHJcbiAgICByZWdpc3Rlck9uVG91Y2hlZChmbjogYW55KTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5vblRvdWNoRm4gPSBmbjtcclxuICAgIH1cclxuXHJcbiAgICBzZXREaXNhYmxlZFN0YXRlKGlzRGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmRpc2FibGVkID0gaXNEaXNhYmxlZDtcclxuICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yLm1hcmtGb3JDaGVjaygpO1xyXG4gICAgfVxyXG5cclxuICAgIHdyaXRlVmFsdWUob2JqOiBhbnkpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLm9wdGlvbnMgPSBvYmogfHwgW107XHJcbiAgICB9XHJcblxyXG4gICAgZm9jdXMoKSB7XHJcbiAgICAgICAgdGhpcy50ZXh0QXJlYS5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmVtb3ZlT3B0aW9uKG9wdGlvbjogeyBuYW1lOiBzdHJpbmc7IGxvY2tlZDogYm9vbGVhbiB9KSB7XHJcbiAgICAgICAgaWYgKCFvcHRpb24ubG9ja2VkKSB7XHJcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucyA9IHRoaXMub3B0aW9ucy5maWx0ZXIobyA9PiBvLm5hbWUgIT09IG9wdGlvbi5uYW1lKTtcclxuICAgICAgICAgICAgdGhpcy5vbkNoYW5nZUZuKHRoaXMub3B0aW9ucyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGhhbmRsZUtleShldmVudDogS2V5Ym9hcmRFdmVudCkge1xyXG4gICAgICAgIHN3aXRjaCAoZXZlbnQua2V5KSB7XHJcbiAgICAgICAgICAgIGNhc2UgJywnOlxyXG4gICAgICAgICAgICBjYXNlICdFbnRlcic6XHJcbiAgICAgICAgICAgICAgICB0aGlzLmFkZE9wdGlvblZhbHVlKCk7XHJcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgJ0JhY2tzcGFjZSc6XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5sYXN0U2VsZWN0ZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZUxhc3RPcHRpb24oKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmxhc3RTZWxlY3RlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmlucHV0ID09PSAnJykge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubGFzdFNlbGVjdGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgdGhpcy5sYXN0U2VsZWN0ZWQgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaGFuZGxlQmx1cigpIHtcclxuICAgICAgICB0aGlzLmlzRm9jdXNzZWQgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmFkZE9wdGlvblZhbHVlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBhZGRPcHRpb25WYWx1ZSgpIHtcclxuICAgICAgICB0aGlzLm9wdGlvbnMgPSB1bmlxdWUoWy4uLnRoaXMub3B0aW9ucywgLi4udGhpcy5wYXJzZUlucHV0SW50b09wdGlvbnModGhpcy5pbnB1dCldKTtcclxuICAgICAgICB0aGlzLmlucHV0ID0gJyc7XHJcbiAgICAgICAgdGhpcy5vbkNoYW5nZUZuKHRoaXMub3B0aW9ucyk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBwYXJzZUlucHV0SW50b09wdGlvbnMoaW5wdXQ6IHN0cmluZyk6IEFycmF5PHsgbmFtZTogc3RyaW5nOyBsb2NrZWQ6IGJvb2xlYW4gfT4ge1xyXG4gICAgICAgIHJldHVybiBpbnB1dFxyXG4gICAgICAgICAgICAuc3BsaXQoL1ssXFxuXS8pXHJcbiAgICAgICAgICAgIC5tYXAocyA9PiBzLnRyaW0oKSlcclxuICAgICAgICAgICAgLmZpbHRlcihzID0+IHMgIT09ICcnKVxyXG4gICAgICAgICAgICAubWFwKHMgPT4gKHsgbmFtZTogcywgbG9ja2VkOiBmYWxzZSB9KSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSByZW1vdmVMYXN0T3B0aW9uKCkge1xyXG4gICAgICAgIGlmICghdGhpcy5vcHRpb25zW3RoaXMub3B0aW9ucy5sZW5ndGggLSAxXS5sb2NrZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5vcHRpb25zID0gdGhpcy5vcHRpb25zLnNsaWNlKDAsIHRoaXMub3B0aW9ucy5sZW5ndGggLSAxKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuIl19
148
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3B0aW9uLXZhbHVlLWlucHV0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY2F0YWxvZy9zcmMvY29tcG9uZW50cy9vcHRpb24tdmFsdWUtaW5wdXQvb3B0aW9uLXZhbHVlLWlucHV0LmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0gsdUJBQXVCLEVBQ3ZCLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsVUFBVSxFQUNWLFlBQVksRUFDWixVQUFVLEVBQ1YsS0FBSyxFQUdMLE1BQU0sRUFJTixTQUFTLEVBQ1QsWUFBWSxHQUNmLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBd0IsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN6RSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFFcEQsTUFBTSxDQUFDLE1BQU0saUNBQWlDLEdBQWE7SUFDdkQsT0FBTyxFQUFFLGlCQUFpQjtJQUMxQixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLHlCQUF5QixDQUFDO0lBQ3hELEtBQUssRUFBRSxJQUFJO0NBQ2QsQ0FBQztBQWVGLE1BQU0sT0FBTyx5QkFBeUI7SUFxQmxDLFlBQW9CLGNBQWlDO1FBQWpDLG1CQUFjLEdBQWQsY0FBYyxDQUFtQjtRQXBCNUMsY0FBUyxHQUFHLEVBQUUsQ0FBQztRQUlkLFFBQUcsR0FBRyxJQUFJLFlBQVksRUFBVSxDQUFDO1FBQ2pDLFdBQU0sR0FBRyxJQUFJLFlBQVksRUFBVSxDQUFDO1FBQ3BDLFNBQUksR0FBRyxJQUFJLFlBQVksRUFBcUMsQ0FBQztRQUM5RCxhQUFRLEdBQUcsS0FBSyxDQUFDO1FBQzFCLFVBQUssR0FBRyxFQUFFLENBQUM7UUFDWCxlQUFVLEdBQUcsS0FBSyxDQUFDO1FBQ25CLGlCQUFZLEdBQUcsS0FBSyxDQUFDO1FBRXJCLGlCQUFZLEdBQUcsQ0FBQyxD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QUFFLENBQUM7YUFDbEIsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQzthQUNyQixHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ2hELENBQUM7SUFFTyxnQkFBZ0I7UUFDcEIsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRTtZQUMxQixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQy9ELElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDN0I7SUFDTCxDQUFDOzs7WUF2SUosU0FBUyxTQUFDO2dCQUNQLFFBQVEsRUFBRSx3QkFBd0I7Z0JBQ2xDLDg1Q0FBa0Q7Z0JBRWxELGVBQWUsRUFBRSx1QkFBdUIsQ0FBQyxPQUFPO2dCQUNoRCxTQUFTLEVBQUUsQ0FBQyxpQ0FBaUMsQ0FBQzs7YUFDakQ7OztZQXBDRyxpQkFBaUI7Ozt3QkFzQ2hCLEtBQUs7dUJBQ0wsU0FBUyxTQUFDLFVBQVUsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7eUJBQ3RDLFlBQVksU0FBQyxlQUFlLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFO3NCQUNsRCxLQUFLO2tCQUNMLE1BQU07cUJBQ04sTUFBTTttQkFDTixNQUFNO3VCQUNOLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICAgIENoYW5nZURldGVjdG9yUmVmLFxuICAgIENvbXBvbmVudCxcbiAgICBFbGVtZW50UmVmLFxuICAgIEV2ZW50RW1pdHRlcixcbiAgICBmb3J3YXJkUmVmLFxuICAgIElucHV0LFxuICAgIE9uQ2hhbmdlcyxcbiAgICBPbkluaXQsXG4gICAgT3V0cHV0LFxuICAgIFByb3ZpZGVyLFxuICAgIFF1ZXJ5TGlzdCxcbiAgICBTaW1wbGVDaGFuZ2VzLFxuICAgIFZpZXdDaGlsZCxcbiAgICBWaWV3Q2hpbGRyZW4sXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgdW5pcXVlIH0gZnJvbSAnQHZlbmR1cmUvY29tbW9uL2xpYi91bmlxdWUnO1xuXG5leHBvcnQgY29uc3QgT1BUSU9OX1ZBTFVFX0lOUFVUX1ZBTFVFX0FDQ0VTU09SOiBQcm92aWRlciA9IHtcbiAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBPcHRpb25WYWx1ZUlucHV0Q29tcG9uZW50KSxcbiAgICBtdWx0aTogdHJ1ZSxcbn07XG5cbmludGVyZmFjZSBPcHRpb24ge1xuICAgIGlkPzogc3RyaW5nO1xuICAgIG5hbWU6IHN0cmluZztcbiAgICBsb2NrZWQ6IGJvb2xlYW47XG59XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAndmRyLW9wdGlvbi12YWx1ZS1pbnB1dCcsXG4gICAgdGVtcGxhdGVVcmw6ICcuL29wdGlvbi12YWx1ZS1pbnB1dC5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJy4vb3B0aW9uLXZhbHVlLWlucHV0LmNvbXBvbmVudC5zY3NzJ10sXG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5EZWZhdWx0LFxuICAgIHByb3ZpZGVyczogW09QVElPTl9WQUxVRV9JTlBVVF9WQUxVRV9BQ0NFU1NPUl0sXG59KVxuZXhwb3J0IGNsYXNzIE9wdGlvblZhbHVlSW5wdXRDb21wb25lbnQgaW1wbGVtZW50cyBDb250cm9sVmFsdWVBY2Nlc3NvciB7XG4gICAgQElucHV0KCkgZ3JvdXBOYW1lID0gJyc7XG4gICAgQFZpZXdDaGlsZCgndGV4dEFyZWEnLCB7IHN0YXRpYzogdHJ1ZSB9KSB0ZXh0QXJlYTogRWxlbWVudFJlZjxIVE1MVGV4dEFyZWFFbGVtZW50PjtcbiAgICBAVmlld0NoaWxkcmVuKCdlZGl0TmFtZUlucHV0JywgeyByZWFkOiBFbGVtZW50UmVmIH0pIG5hbWVJbnB1dHM6IFF1ZXJ5TGlzdDxFbGVtZW50UmVmPjtcbiAgICBASW5wdXQoKSBvcHRpb25zOiBPcHRpb25bXTtcbiAgICBAT3V0cHV0KCkgYWRkID0gbmV3IEV2ZW50RW1pdHRlcjxPcHRpb24+KCk7XG4gICAgQE91dHB1dCgpIHJlbW92ZSA9IG5ldyBFdmVudEVtaXR0ZXI8T3B0aW9uPigpO1xuICAgIEBPdXRwdXQoKSBlZGl0ID0gbmV3IEV2ZW50RW1pdHRlcjx7IGluZGV4OiBudW1iZXI7IG9wdGlvbjogT3B0aW9uIH0+KCk7XG4gICAgQElucHV0KCkgZGlzYWJsZWQgPSBmYWxzZTtcbiAgICBpbnB1dCA9ICcnO1xuICAgIGlzRm9jdXNzZWQgPSBmYWxzZTtcbiAgICBsYXN0U2VsZWN0ZWQgPSBmYWxzZTtcbiAgICBmb3JtVmFsdWU6IE9wdGlvbltdO1xuICAgIGVkaXRpbmdJbmRleCA9IC0xO1xuICAgIG9uQ2hhbmdlRm46ICh2YWx1ZTogYW55KSA9PiB2b2lkO1xuICAgIG9uVG91Y2hGbjogKHZhbHVlOiBhbnkpID0+IHZvaWQ7XG5cbiAgICBnZXQgb3B0aW9uVmFsdWVzKCk6IE9wdGlvbltdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZm9ybVZhbHVlID8/IHRoaXMub3B0aW9ucyA/PyBbXTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIGNoYW5nZURldGVjdG9yOiBDaGFuZ2VEZXRlY3RvclJlZikge31cblxuICAgIHJlZ2lzdGVyT25DaGFuZ2UoZm46IGFueSk6IHZvaWQge1xuICAgICAgICB0aGlzLm9uQ2hhbmdlRm4gPSBmbjtcbiAgICB9XG5cbiAgICByZWdpc3Rlck9uVG91Y2hlZChmbjogYW55KTogdm9pZCB7XG4gICAgICAgIHRoaXMub25Ub3VjaEZuID0gZm47XG4gICAgfVxuXG4gICAgc2V0RGlzYWJsZWRTdGF0ZShpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZGlzYWJsZWQgPSBpc0Rpc2FibGVkO1xuICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cblxuICAgIHdyaXRlVmFsdWUob2JqOiBhbnkpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5mb3JtVmFsdWUgPSBvYmogfHwgW107XG4gICAgfVxuXG4gICAgZm9jdXMoKSB7XG4gICAgICAgIHRoaXMudGV4dEFyZWEubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgIH1cblxuICAgIGVkaXROYW1lKGluZGV4OiBudW1iZXIsIGV2ZW50OiBNb3VzZUV2ZW50KSB7XG4gICAgICAgIGNvbnN0IG9wdGlvblZhbHVlID0gdGhpcy5vcHRpb25WYWx1ZXNbaW5kZXhdO1xuICAgICAgICBpZiAoIW9wdGlvblZhbHVlLmxvY2tlZCAmJiAhb3B0aW9uVmFsdWUuaWQpIHtcbiAgICAgICAgICAgIGV2ZW50LmNhbmNlbEJ1YmJsZSA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLmVkaXRpbmdJbmRleCA9IGluZGV4O1xuICAgICAgICAgICAgY29uc3QgaW5wdXQgPSB0aGlzLm5hbWVJbnB1dHMuZ2V0KGluZGV4KT8ubmF0aXZlRWxlbWVudDtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gaW5wdXQ/LmZvY3VzKCkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdXBkYXRlT3B0aW9uKGluZGV4OiBudW1iZXIsIGV2ZW50OiBJbnB1dEV2ZW50KSB7XG4gICAgICAgIGNvbnN0IG9wdGlvblZhbHVlID0gdGhpcy5vcHRpb25WYWx1ZXNbaW5kZXhdO1xuICAgICAgICBjb25zdCBuZXdOYW1lID0gKGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50KS52YWx1ZTtcbiAgICAgICAgaWYgKG9wdGlvblZhbHVlKSB7XG4gICAgICAgICAgICBpZiAobmV3TmFtZSkge1xuICAgICAgICAgICAgICAgIG9wdGlvblZhbHVlLm5hbWUgPSBuZXdOYW1lO1xuICAgICAgICAgICAgICAgIHRoaXMuZWRpdC5lbWl0KHsgaW5kZXgsIG9wdGlvbjogb3B0aW9uVmFsdWUgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmVkaXRpbmdJbmRleCA9IC0xO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmVtb3ZlT3B0aW9uKG9wdGlvbjogT3B0aW9uKSB7XG4gICAgICAgIGlmICghb3B0aW9uLmxvY2tlZCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuZm9ybVZhbHVlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5mb3JtVmFsdWUgPSB0aGlzLmZvcm1WYWx1ZT8uZmlsdGVyKG8gPT4gby5uYW1lICE9PSBvcHRpb24ubmFtZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5vbkNoYW5nZUZuKHRoaXMuZm9ybVZhbHVlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZW1vdmUuZW1pdChvcHRpb24pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgaGFuZGxlS2V5KGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XG4gICAgICAgIHN3aXRjaCAoZXZlbnQua2V5KSB7XG4gICAgICAgICAgICBjYXNlICcsJzpcbiAgICAgICAgICAgIGNhc2UgJ0VudGVyJzpcbiAgICAgICAgICAgICAgICB0aGlzLmFkZE9wdGlvblZhbHVlKCk7XG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ0JhY2tzcGFjZSc6XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMubGFzdFNlbGVjdGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlTGFzdE9wdGlvbigpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmxhc3RTZWxlY3RlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5pbnB1dCA9PT0gJycpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sYXN0U2VsZWN0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgdGhpcy5sYXN0U2VsZWN0ZWQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGhhbmRsZUJsdXIoKSB7XG4gICAgICAgIHRoaXMuaXNGb2N1c3NlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmFkZE9wdGlvblZhbHVlKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhZGRPcHRpb25WYWx1ZSgpIHtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMucGFyc2VJbnB1dEludG9PcHRpb25zKHRoaXMuaW5wdXQpO1xuICAgICAgICBpZiAoIXRoaXMuZm9ybVZhbHVlICYmIHRoaXMub3B0aW9ucykge1xuICAgICAgICAgICAgZm9yIChjb25zdCBvcHRpb24gb2Ygb3B0aW9ucykge1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkLmVtaXQob3B0aW9uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZm9ybVZhbHVlID0gdW5pcXVlKFsuLi50aGlzLmZvcm1WYWx1ZSwgLi4ub3B0aW9uc10pO1xuICAgICAgICAgICAgdGhpcy5vbkNoYW5nZUZuKHRoaXMuZm9ybVZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmlucHV0ID0gJyc7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBwYXJzZUlucHV0SW50b09wdGlvbnMoaW5wdXQ6IHN0cmluZyk6IE9wdGlvbltdIHtcbiAgICAgICAgcmV0dXJuIGlucHV0XG4gICAgICAgICAgICAuc3BsaXQoL1ssXFxuXS8pXG4gICAgICAgICAgICAubWFwKHMgPT4gcy50cmltKCkpXG4gICAgICAgICAgICAuZmlsdGVyKHMgPT4gcyAhPT0gJycpXG4gICAgICAgICAgICAubWFwKHMgPT4gKHsgbmFtZTogcywgbG9ja2VkOiBmYWxzZSB9KSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZW1vdmVMYXN0T3B0aW9uKCkge1xuICAgICAgICBpZiAodGhpcy5vcHRpb25WYWx1ZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICBjb25zdCBvcHRpb24gPSB0aGlzLm9wdGlvblZhbHVlc1t0aGlzLm9wdGlvblZhbHVlcy5sZW5ndGggLSAxXTtcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlT3B0aW9uKG9wdGlvbik7XG4gICAgICAgIH1cbiAgICB9XG59XG4iXX0=
@@ -1,13 +1,13 @@
1
1
  import { ChangeDetectionStrategy, Component } from '@angular/core';
2
2
  import { ActivatedRoute } from '@angular/router';
3
3
  import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
4
- import { DataService, getDefaultUiLanguage, ModalService, NotificationService, } from '@vendure/admin-ui/core';
4
+ import { DataService, DeletionResult, getDefaultUiLanguage, ModalService, NotificationService, } from '@vendure/admin-ui/core';
5
5
  import { normalizeString } from '@vendure/common/lib/normalize-string';
6
6
  import { pick } from '@vendure/common/lib/pick';
7
7
  import { generateAllCombinations, notNullOrUndefined } from '@vendure/common/lib/shared-utils';
8
8
  import { unique } from '@vendure/common/lib/unique';
9
9
  import { EMPTY, forkJoin, of } from 'rxjs';
10
- import { filter, map, mergeMap, switchMap } from 'rxjs/operators';
10
+ import { defaultIfEmpty, filter, map, mergeMap, switchMap } from 'rxjs/operators';
11
11
  import { ProductDetailService } from '../../providers/product-detail/product-detail.service';
12
12
  import { ConfirmVariantDeletionDialogComponent } from '../confirm-variant-deletion-dialog/confirm-variant-deletion-dialog.component';
13
13
  export class GeneratedVariant {
@@ -25,6 +25,7 @@ export class ProductVariantsEditorComponent {
25
25
  this.notificationService = notificationService;
26
26
  this.modalService = modalService;
27
27
  this.formValueChanged = false;
28
+ this.optionsChanged = false;
28
29
  this.generatedVariants = [];
29
30
  }
30
31
  ngOnInit() {
@@ -50,16 +51,105 @@ export class ProductVariantsEditorComponent {
50
51
  ? _('catalog.default-variant')
51
52
  : variant.options.map(o => o.name).join(' ');
52
53
  }
53
- addOption() {
54
+ addOptionGroup() {
54
55
  this.optionGroups.push({
55
56
  isNew: true,
57
+ locked: false,
56
58
  name: '',
57
59
  values: [],
58
60
  });
61
+ this.optionsChanged = true;
59
62
  }
60
- removeOption(optionGroup) {
61
- this.optionGroups = this.optionGroups.filter(og => og !== optionGroup);
63
+ removeOptionGroup(optionGroup) {
64
+ const id = optionGroup.id;
65
+ if (optionGroup.isNew) {
66
+ this.optionGroups = this.optionGroups.filter(og => og !== optionGroup);
67
+ this.generateVariants();
68
+ this.optionsChanged = true;
69
+ }
70
+ else if (id) {
71
+ this.modalService
72
+ .dialog({
73
+ title: _('catalog.confirm-delete-product-option-group'),
74
+ translationVars: { name: optionGroup.name },
75
+ buttons: [
76
+ { type: 'secondary', label: _('common.cancel') },
77
+ { type: 'danger', label: _('common.delete'), returnValue: true },
78
+ ],
79
+ })
80
+ .pipe(switchMap(val => {
81
+ if (val) {
82
+ return this.dataService.product.removeOptionGroupFromProduct({
83
+ optionGroupId: id,
84
+ productId: this.product.id,
85
+ });
86
+ }
87
+ else {
88
+ return EMPTY;
89
+ }
90
+ }))
91
+ .subscribe(({ removeOptionGroupFromProduct }) => {
92
+ var _a;
93
+ if (removeOptionGroupFromProduct.__typename === 'Product') {
94
+ this.notificationService.success(_('common.notify-delete-success'), {
95
+ entity: 'ProductOptionGroup',
96
+ });
97
+ this.initOptionsAndVariants();
98
+ this.optionsChanged = true;
99
+ }
100
+ else if (removeOptionGroupFromProduct.__typename === 'ProductOptionInUseError') {
101
+ this.notificationService.error((_a = removeOptionGroupFromProduct.message) !== null && _a !== void 0 ? _a : '');
102
+ }
103
+ });
104
+ }
105
+ }
106
+ addOption(groupId, optionName) {
107
+ var _a;
108
+ (_a = this.optionGroups.find(g => g.id === groupId)) === null || _a === void 0 ? void 0 : _a.values.push({ name: optionName, locked: false });
62
109
  this.generateVariants();
110
+ this.optionsChanged = true;
111
+ }
112
+ removeOption(groupId, { id, name }) {
113
+ const optionGroup = this.optionGroups.find(g => g.id === groupId);
114
+ if (optionGroup) {
115
+ if (!id) {
116
+ optionGroup.values = optionGroup.values.filter(v => v.name !== name);
117
+ this.generateVariants();
118
+ }
119
+ else {
120
+ this.modalService
121
+ .dialog({
122
+ title: _('catalog.confirm-delete-product-option'),
123
+ translationVars: { name },
124
+ buttons: [
125
+ { type: 'secondary', label: _('common.cancel') },
126
+ { type: 'danger', label: _('common.delete'), returnValue: true },
127
+ ],
128
+ })
129
+ .pipe(switchMap(val => {
130
+ if (val) {
131
+ return this.dataService.product.deleteProductOption(id);
132
+ }
133
+ else {
134
+ return EMPTY;
135
+ }
136
+ }))
137
+ .subscribe(({ deleteProductOption }) => {
138
+ var _a;
139
+ if (deleteProductOption.result === DeletionResult.DELETED) {
140
+ this.notificationService.success(_('common.notify-delete-success'), {
141
+ entity: 'ProductOption',
142
+ });
143
+ optionGroup.values = optionGroup.values.filter(v => v.id !== id);
144
+ this.generateVariants();
145
+ this.optionsChanged = true;
146
+ }
147
+ else {
148
+ this.notificationService.error((_a = deleteProductOption.message) !== null && _a !== void 0 ? _a : '');
149
+ }
150
+ });
151
+ }
152
+ }
63
153
  }
64
154
  generateVariants() {
65
155
  const groups = this.optionGroups.map(g => g.values);
@@ -101,10 +191,11 @@ export class ProductVariantsEditorComponent {
101
191
  stock: 0,
102
192
  };
103
193
  }
104
- deleteVariant(id) {
194
+ deleteVariant(id, options) {
105
195
  this.modalService
106
196
  .dialog({
107
197
  title: _('catalog.confirm-delete-product-variant'),
198
+ translationVars: { name: options.map(o => o.name).join(' ') },
108
199
  buttons: [
109
200
  { type: 'secondary', label: _('common.cancel') },
110
201
  { type: 'danger', label: _('common.delete'), returnValue: true },
@@ -139,12 +230,14 @@ export class ProductVariantsEditorComponent {
139
230
  count: variants.length,
140
231
  });
141
232
  this.initOptionsAndVariants();
233
+ this.optionsChanged = false;
142
234
  },
143
235
  });
144
236
  }
145
237
  checkUniqueSkus() {
146
238
  const withDuplicateSkus = this.generatedVariants.filter((variant, index) => {
147
- return this.generatedVariants.find(gv => gv.sku.trim() === variant.sku.trim() && gv !== variant);
239
+ return (variant.enabled &&
240
+ this.generatedVariants.find(gv => gv.sku.trim() === variant.sku.trim() && gv !== variant));
148
241
  });
149
242
  if (withDuplicateSkus.length) {
150
243
  return this.modalService
@@ -227,7 +320,7 @@ export class ProductVariantsEditorComponent {
227
320
  return forkJoin(groupsIds.map(id => this.dataService.product
228
321
  .getProductOptionGroup(id)
229
322
  .mapSingle(data => data.productOptionGroup)
230
- .pipe(filter(notNullOrUndefined))));
323
+ .pipe(filter(notNullOrUndefined)))).pipe(defaultIfEmpty([]));
231
324
  }
232
325
  createNewProductVariants(groups) {
233
326
  const options = groups
@@ -275,15 +368,20 @@ export class ProductVariantsEditorComponent {
275
368
  .mapSingle(({ product }) => product)
276
369
  .subscribe(p => {
277
370
  this.product = p;
371
+ const allUsedOptionIds = p.variants.map(v => v.options.map(option => option.id)).flat();
372
+ const allUsedOptionGroupIds = p.variants
373
+ .map(v => v.options.map(option => option.groupId))
374
+ .flat();
278
375
  this.optionGroups = p.optionGroups.map(og => {
279
376
  return {
280
377
  id: og.id,
281
378
  isNew: false,
282
379
  name: og.name,
380
+ locked: allUsedOptionGroupIds.includes(og.id),
283
381
  values: og.options.map(o => ({
284
382
  id: o.id,
285
383
  name: o.name,
286
- locked: true,
384
+ locked: allUsedOptionIds.includes(o.id),
287
385
  })),
288
386
  };
289
387
  });
@@ -306,7 +404,7 @@ export class ProductVariantsEditorComponent {
306
404
  ProductVariantsEditorComponent.decorators = [
307
405
  { type: Component, args: [{
308
406
  selector: 'vdr-product-variants-editor',
309
- template: "<vdr-action-bar>\r\n <vdr-ab-right>\r\n <button\r\n class=\"btn btn-primary\"\r\n (click)=\"save()\"\r\n [disabled]=\"!formValueChanged || getVariantsToAdd().length === 0\"\r\n >\r\n {{ 'common.add-new-variants' | translate: { count: getVariantsToAdd().length } }}\r\n </button>\r\n </vdr-ab-right>\r\n</vdr-action-bar>\r\n\r\n<div *ngFor=\"let group of optionGroups\" class=\"option-groups\">\r\n <div class=\"name\">\r\n <label>{{ 'catalog.option' | translate }}</label>\r\n <input clrInput [(ngModel)]=\"group.name\" name=\"name\" [readonly]=\"!group.isNew\" />\r\n </div>\r\n <div class=\"values\">\r\n <label>{{ 'catalog.option-values' | translate }}</label>\r\n <vdr-option-value-input\r\n #optionValueInputComponent\r\n [(ngModel)]=\"group.values\"\r\n (ngModelChange)=\"generateVariants()\"\r\n [groupName]=\"group.name\"\r\n [disabled]=\"group.name === ''\"\r\n ></vdr-option-value-input>\r\n </div>\r\n <div>\r\n <button *ngIf=\"group.isNew\" class=\"btn btn-icon btn-danger-outline mt5\" (click)=\"removeOption(group)\">\r\n <clr-icon shape=\"trash\"></clr-icon>\r\n </button>\r\n </div>\r\n</div>\r\n<button\r\n class=\"btn btn-primary-outline btn-sm\"\r\n (click)=\"addOption()\"\r\n>\r\n <clr-icon shape=\"plus\"></clr-icon>\r\n {{ 'catalog.add-option' | translate }}\r\n</button>\r\n\r\n<div class=\"variants-preview\">\r\n <table class=\"table\">\r\n <thead>\r\n <tr>\r\n <th>{{ 'common.create' | translate }}</th>\r\n <th>{{ 'catalog.variant' | translate }}</th>\r\n <th>{{ 'catalog.sku' | translate }}</th>\r\n <th>{{ 'catalog.price' | translate }}</th>\r\n <th>{{ 'catalog.stock-on-hand' | translate }}</th>\r\n <th></th>\r\n </tr>\r\n </thead>\r\n <tr *ngFor=\"let variant of generatedVariants\" [class.disabled]=\"!variant.enabled || variant.existing\">\r\n <td>\r\n <input\r\n type=\"checkbox\"\r\n *ngIf=\"!variant.existing\"\r\n [(ngModel)]=\"variant.enabled\"\r\n name=\"enabled\"\r\n clrCheckbox\r\n (ngModelChange)=\"formValueChanged = true\"\r\n />\r\n </td>\r\n <td>\r\n {{ getVariantName(variant) | translate }}\r\n </td>\r\n <td>\r\n <clr-input-container *ngIf=\"!variant.existing\">\r\n <input\r\n clrInput\r\n type=\"text\"\r\n [(ngModel)]=\"variant.sku\"\r\n [placeholder]=\"'catalog.sku' | translate\"\r\n name=\"sku\"\r\n required\r\n (ngModelChange)=\"onFormChanged(variant)\"\r\n />\r\n </clr-input-container>\r\n <span *ngIf=\"variant.existing\">{{ variant.sku }}</span>\r\n </td>\r\n <td>\r\n <clr-input-container *ngIf=\"!variant.existing\">\r\n <vdr-currency-input\r\n clrInput\r\n [(ngModel)]=\"variant.price\"\r\n name=\"price\"\r\n [currencyCode]=\"currencyCode\"\r\n (ngModelChange)=\"onFormChanged(variant)\"\r\n ></vdr-currency-input>\r\n </clr-input-container>\r\n <span *ngIf=\"variant.existing\">{{ variant.price | localeCurrency: currencyCode }}</span>\r\n </td>\r\n <td>\r\n <clr-input-container *ngIf=\"!variant.existing\">\r\n <input\r\n clrInput\r\n type=\"number\"\r\n [(ngModel)]=\"variant.stock\"\r\n name=\"stock\"\r\n min=\"0\"\r\n step=\"1\"\r\n (ngModelChange)=\"onFormChanged(variant)\"\r\n />\r\n </clr-input-container>\r\n <span *ngIf=\"variant.existing\">{{ variant.stock }}</span>\r\n </td>\r\n <td>\r\n <vdr-dropdown *ngIf=\"variant.productVariantId as productVariantId\">\r\n <button class=\"icon-button\" vdrDropdownTrigger>\r\n <clr-icon shape=\"ellipsis-vertical\"></clr-icon>\r\n </button>\r\n <vdr-dropdown-menu vdrPosition=\"bottom-right\">\r\n <button\r\n type=\"button\"\r\n class=\"delete-button\"\r\n (click)=\"deleteVariant(productVariantId)\"\r\n vdrDropdownItem\r\n >\r\n <clr-icon shape=\"trash\" class=\"is-danger\"></clr-icon>\r\n {{ 'common.delete' | translate }}\r\n </button>\r\n </vdr-dropdown-menu>\r\n </vdr-dropdown>\r\n </td>\r\n </tr>\r\n </table>\r\n</div>\r\n",
407
+ template: "<vdr-action-bar>\r\n <vdr-ab-right>\r\n <button\r\n class=\"btn btn-primary\"\r\n (click)=\"save()\"\r\n [disabled]=\"(!formValueChanged && !optionsChanged) || getVariantsToAdd().length === 0\"\r\n >\r\n {{ 'common.add-new-variants' | translate: { count: getVariantsToAdd().length } }}\r\n </button>\r\n </vdr-ab-right>\r\n</vdr-action-bar>\r\n\r\n<div *ngFor=\"let group of optionGroups\" class=\"option-groups\">\r\n <div class=\"name\">\r\n <label>{{ 'catalog.option' | translate }}</label>\r\n <input clrInput [(ngModel)]=\"group.name\" name=\"name\" [readonly]=\"!group.isNew\" />\r\n </div>\r\n <div class=\"values\">\r\n <label>{{ 'catalog.option-values' | translate }}</label>\r\n <vdr-option-value-input\r\n #optionValueInputComponent\r\n [options]=\"group.values\"\r\n [groupName]=\"group.name\"\r\n [disabled]=\"group.name === ''\"\r\n (add)=\"addOption(group.id, $event.name)\"\r\n (remove)=\"removeOption(group.id, $event)\"\r\n ></vdr-option-value-input>\r\n </div>\r\n <div>\r\n <button\r\n [disabled]=\"group.locked\"\r\n class=\"btn btn-icon btn-danger-outline mt5\" (click)=\"removeOptionGroup(group)\">\r\n <clr-icon shape=\"trash\"></clr-icon>\r\n </button>\r\n </div>\r\n</div>\r\n<button class=\"btn btn-primary-outline btn-sm\" (click)=\"addOptionGroup()\">\r\n <clr-icon shape=\"plus\"></clr-icon>\r\n {{ 'catalog.add-option' | translate }}\r\n</button>\r\n\r\n<div class=\"variants-preview\">\r\n <table class=\"table\">\r\n <thead>\r\n <tr>\r\n <th></th>\r\n <th>{{ 'catalog.variant' | translate }}</th>\r\n <th>{{ 'catalog.sku' | translate }}</th>\r\n <th>{{ 'catalog.price' | translate }}</th>\r\n <th>{{ 'catalog.stock-on-hand' | translate }}</th>\r\n <th></th>\r\n </tr>\r\n </thead>\r\n <tr *ngFor=\"let variant of generatedVariants\" [class.disabled]=\"!variant.enabled || variant.existing\">\r\n <td class=\"left\">\r\n <clr-checkbox-wrapper *ngIf=\"!variant.existing\">\r\n <input\r\n type=\"checkbox\"\r\n [(ngModel)]=\"variant.enabled\"\r\n name=\"enabled\"\r\n clrCheckbox\r\n (ngModelChange)=\"formValueChanged = true\"\r\n />\r\n <label>{{ 'common.create' | translate }}</label>\r\n </clr-checkbox-wrapper>\r\n </td>\r\n <td>\r\n {{ getVariantName(variant) | translate }}\r\n </td>\r\n <td>\r\n <div class=\"flex center\">\r\n <clr-input-container *ngIf=\"!variant.existing\">\r\n <input\r\n clrInput\r\n type=\"text\"\r\n [(ngModel)]=\"variant.sku\"\r\n [placeholder]=\"'catalog.sku' | translate\"\r\n name=\"sku\"\r\n required\r\n (ngModelChange)=\"onFormChanged(variant)\"\r\n />\r\n </clr-input-container>\r\n <span *ngIf=\"variant.existing\">{{ variant.sku }}</span>\r\n </div>\r\n </td>\r\n <td>\r\n <div class=\"flex center\">\r\n <clr-input-container *ngIf=\"!variant.existing\">\r\n <vdr-currency-input\r\n clrInput\r\n [(ngModel)]=\"variant.price\"\r\n name=\"price\"\r\n [currencyCode]=\"currencyCode\"\r\n (ngModelChange)=\"onFormChanged(variant)\"\r\n ></vdr-currency-input>\r\n </clr-input-container>\r\n <span *ngIf=\"variant.existing\">{{ variant.price | localeCurrency: currencyCode }}</span>\r\n </div>\r\n </td>\r\n <td>\r\n <div class=\"flex center\">\r\n <clr-input-container *ngIf=\"!variant.existing\">\r\n <input\r\n clrInput\r\n type=\"number\"\r\n [(ngModel)]=\"variant.stock\"\r\n name=\"stock\"\r\n min=\"0\"\r\n step=\"1\"\r\n (ngModelChange)=\"onFormChanged(variant)\"\r\n />\r\n </clr-input-container>\r\n <span *ngIf=\"variant.existing\">{{ variant.stock }}</span>\r\n </div>\r\n </td>\r\n <td>\r\n <vdr-dropdown *ngIf=\"variant.productVariantId as productVariantId\">\r\n <button class=\"icon-button\" vdrDropdownTrigger>\r\n <clr-icon shape=\"ellipsis-vertical\"></clr-icon>\r\n </button>\r\n <vdr-dropdown-menu vdrPosition=\"bottom-right\">\r\n <button\r\n type=\"button\"\r\n class=\"delete-button\"\r\n (click)=\"deleteVariant(productVariantId, variant.options)\"\r\n vdrDropdownItem\r\n >\r\n <clr-icon shape=\"trash\" class=\"is-danger\"></clr-icon>\r\n {{ 'common.delete' | translate }}\r\n </button>\r\n </vdr-dropdown-menu>\r\n </vdr-dropdown>\r\n </td>\r\n </tr>\r\n </table>\r\n</div>\r\n",
310
408
  changeDetection: ChangeDetectionStrategy.Default,
311
409
  styles: [".option-groups{display:flex}.option-groups:first-of-type{margin-top:24px}.values{flex:1;margin:0 6px}.variants-preview tr.disabled td{background-color:var(--color-component-bg-100);color:var(--color-grey-400)}\n"]
312
410
  },] }
@@ -318,4 +416,4 @@ ProductVariantsEditorComponent.ctorParameters = () => [
318
416
  { type: NotificationService },
319
417
  { type: ModalService }
320
418
  ];
321
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZHVjdC12YXJpYW50cy1lZGl0b3IuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9jYXRhbG9nL3NyYy9jb21wb25lbnRzL3Byb2R1Y3QtdmFyaWFudHMtZWRpdG9yL3Byb2R1Y3QtdmFyaWFudHMtZWRpdG9yLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsU0FBUyxFQUFVLE1BQU0sZUFBZSxDQUFDO0FBQzNFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNqRCxPQUFPLEVBQUUsTUFBTSxJQUFJLENBQUMsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBQ3RFLE9BQU8sRUFJSCxXQUFXLEVBRVgsb0JBQW9CLEVBR3BCLFlBQVksRUFDWixtQkFBbUIsR0FFdEIsTUFBTSx3QkFBd0IsQ0FBQztBQUNoQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDdkUsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ2hELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQy9GLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNwRCxPQUFPLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBYyxFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDdkQsT0FBTyxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRWxFLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHVEQUF1RCxDQUFDO0FBQzdGLE9BQU8sRUFBRSxxQ0FBcUMsRUFBRSxNQUFNLDhFQUE4RSxDQUFDO0FBRXJJLE1BQU0sT0FBTyxnQkFBZ0I7SUFVekIsWUFBWSxNQUFpQztRQUN6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Q0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbkUsQ0FBQztJQUVPLGNBQWMsQ0FBQyxDQUEwQjtRQUM3QyxPQUFPLENBQUM7YUFDSCxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO2FBQ2hCLElBQUksRUFBRTthQUNOLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNuQixDQUFDOzs7WUFwWEosU0FBUyxTQUFDO2dCQUNQLFFBQVEsRUFBRSw2QkFBNkI7Z0JBQ3ZDLDIxS0FBdUQ7Z0JBRXZELGVBQWUsRUFBRSx1QkFBdUIsQ0FBQyxPQUFPOzthQUNuRDs7O1lBMURRLGNBQWM7WUFNbkIsV0FBVztZQWdCTixvQkFBb0I7WUFWekIsbUJBQW1CO1lBRG5CLFlBQVkiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xyXG5pbXBvcnQgeyBtYXJrZXIgYXMgXyB9IGZyb20gJ0BiaWVzYmplcmcvbmd4LXRyYW5zbGF0ZS1leHRyYWN0LW1hcmtlcic7XHJcbmltcG9ydCB7XHJcbiAgICBDcmVhdGVQcm9kdWN0T3B0aW9uR3JvdXAsXHJcbiAgICBDcmVhdGVQcm9kdWN0T3B0aW9uSW5wdXQsXHJcbiAgICBDdXJyZW5jeUNvZGUsXHJcbiAgICBEYXRhU2VydmljZSxcclxuICAgIERlYWN0aXZhdGVBd2FyZSxcclxuICAgIGdldERlZmF1bHRVaUxhbmd1YWdlLFxyXG4gICAgR2V0UHJvZHVjdFZhcmlhbnRPcHRpb25zLFxyXG4gICAgTGFuZ3VhZ2VDb2RlLFxyXG4gICAgTW9kYWxTZXJ2aWNlLFxyXG4gICAgTm90aWZpY2F0aW9uU2VydmljZSxcclxuICAgIFByb2R1Y3RPcHRpb25Hcm91cFdpdGhPcHRpb25zRnJhZ21lbnQsXHJcbn0gZnJvbSAnQHZlbmR1cmUvYWRtaW4tdWkvY29yZSc7XHJcbmltcG9ydCB7IG5vcm1hbGl6ZVN0cmluZyB9IGZyb20gJ0B2ZW5kdXJlL2NvbW1vbi9saWIvbm9ybWFsaXplLXN0cmluZyc7XHJcbmltcG9ydCB7IHBpY2sgfSBmcm9tICdAdmVuZHVyZS9jb21tb24vbGliL3BpY2snO1xyXG5pbXBvcnQgeyBnZW5lcmF0ZUFsbENvbWJpbmF0aW9ucywgbm90TnVsbE9yVW5kZWZpbmVkIH0gZnJvbSAnQHZlbmR1cmUvY29tbW9uL2xpYi9zaGFyZWQtdXRpbHMnO1xyXG5pbXBvcnQgeyB1bmlxdWUgfSBmcm9tICdAdmVuZHVyZS9jb21tb24vbGliL3VuaXF1ZSc7XHJcbmltcG9ydCB7IEVNUFRZLCBmb3JrSm9pbiwgT2JzZXJ2YWJsZSwgb2YgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgZmlsdGVyLCBtYXAsIG1lcmdlTWFwLCBzd2l0Y2hNYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcblxyXG5pbXBvcnQgeyBQcm9kdWN0RGV0YWlsU2VydmljZSB9IGZyb20gJy4uLy4uL3Byb3ZpZGVycy9wcm9kdWN0LWRldGFpbC9wcm9kdWN0LWRldGFpbC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQ29uZmlybVZhcmlhbnREZWxldGlvbkRpYWxvZ0NvbXBvbmVudCB9IGZyb20gJy4uL2NvbmZpcm0tdmFyaWFudC1kZWxldGlvbi1kaWFsb2cvY29uZmlybS12YXJpYW50LWRlbGV0aW9uLWRpYWxvZy5jb21wb25lbnQnO1xyXG5cclxuZXhwb3J0IGNsYXNzIEdlbmVyYXRlZFZhcmlhbnQge1xyXG4gICAgaXNEZWZhdWx0OiBib29sZWFuO1xyXG4gICAgb3B0aW9uczogQXJyYXk8eyBuYW1lOiBzdHJpbmc7IGlkPzogc3RyaW5nIH0+O1xyXG4gICAgcHJvZHVjdFZhcmlhbnRJZD86IHN0cmluZztcclxuICAgIGVuYWJsZWQ6IGJvb2xlYW47XHJcbiAgICBleGlzdGluZzogYm9vbGVhbjtcclxuICAgIHNrdTogc3RyaW5nO1xyXG4gICAgcHJpY2U6IG51bWJlcjtcclxuICAgIHN0b2NrOiBudW1iZXI7XHJcblxyXG4gICAgY29uc3RydWN0b3IoY29uZmlnOiBQYXJ0aWFsPEdlbmVyYXRlZFZhcmlhbnQ+KSB7XHJcbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoY29uZmlnKSkge1xyXG4gICAgICAgICAgICB0aGlzW2tleV0gPSBjb25maWdba2V5XTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuXHJcbmludGVyZmFjZSBPcHRpb25Hcm91cFVpTW9kZWwge1xyXG4gICAgaWQ/OiBzdHJpbmc7XHJcbiAgICBpc05ldzogYm9vbGVhbjtcclxuICAgIG5hbWU6IHN0cmluZztcclxuICAgIHZhbHVlczogQXJyYXk8e1xyXG4gICAgICAgIGlkPzogc3RyaW5nO1xyXG4gICAgICAgIG5hbWU6IHN0cmluZztcclxuICAgICAgICBsb2NrZWQ6IGJvb2xlYW47XHJcbiAgICB9PjtcclxufVxyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgICBzZWxlY3RvcjogJ3Zkci1wcm9kdWN0LXZhcmlhbnRzLWVkaXRvcicsXHJcbiAgICB0ZW1wbGF0ZVVybDogJy4vcHJvZHVjdC12YXJpYW50cy1lZGl0b3IuY29tcG9uZW50Lmh0bWwnLFxyXG4gICAgc3R5bGVVcmxzOiBbJy4vcHJvZHVjdC12YXJpYW50cy1lZGl0b3IuY29tcG9uZW50LnNjc3MnXSxcclxuICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuRGVmYXVsdCxcclxufSlcclxuZXhwb3J0IGNsYXNzIFByb2R1Y3RWYXJpYW50c0VkaXRvckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgRGVhY3RpdmF0ZUF3YXJlIHtcclxuICAgIGZvcm1WYWx1ZUNoYW5nZWQgPSBmYWxzZTtcclxuICAgIGdlbmVyYXRlZFZhcmlhbnRzOiBHZW5lcmF0ZWRWYXJpYW50W10gPSBbXTtcclxuICAgIG9wdGlvbkdyb3VwczogT3B0aW9uR3JvdXBVaU1vZGVsW107XHJcbiAgICBwcm9kdWN0OiBHZXRQcm9kdWN0VmFyaWFudE9wdGlvbnMuUHJvZHVjdDtcclxuICAgIGN1cnJlbmN5Q29kZTogQ3VycmVuY3lDb2RlO1xyXG4gICAgcHJpdmF0ZSBsYW5ndWFnZUNvZGU6IExhbmd1YWdlQ29kZTtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihcclxuICAgICAgICBwcml2YXRlIHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcclxuICAgICAgICBwcml2YXRlIGRhdGFTZXJ2aWNlOiBEYXRhU2VydmljZSxcclxuICAgICAgICBwcml2YXRlIHByb2R1Y3REZXRhaWxTZXJ2aWNlOiBQcm9kdWN0RGV0YWlsU2VydmljZSxcclxuICAgICAgICBwcml2YXRlIG5vdGlmaWNhdGlvblNlcnZpY2U6IE5vdGlmaWNhdGlvblNlcnZpY2UsXHJcbiAgICAgICAgcHJpdmF0ZSBtb2RhbFNlcnZpY2U6IE1vZGFsU2VydmljZSxcclxuICAgICkge31cclxuXHJcbiAgICBuZ09uSW5pdCgpIHtcclxuICAgICAgICB0aGlzLmluaXRPcHRpb25zQW5kVmFyaWFudHMoKTtcclxuICAgICAgICB0aGlzLmxhbmd1YWdlQ29kZSA9XHJcbiAgICAgICAgICAgICh0aGlzLnJvdXRlLnNuYXBzaG90LnBhcmFtTWFwLmdldCgnbGFuZycpIGFzIExhbmd1YWdlQ29kZSkgfHwgZ2V0RGVmYXVsdFVpTGFuZ3VhZ2UoKTtcclxuICAgICAgICB0aGlzLmRhdGFTZXJ2aWNlLnNldHRpbmdzLmdldEFjdGl2ZUNoYW5uZWwoKS5zaW5nbGUkLnN1YnNjcmliZShkYXRhID0+IHtcclxuICAgICAgICAgICAgdGhpcy5jdXJyZW5jeUNvZGUgPSBkYXRhLmFjdGl2ZUNoYW5uZWwuY3VycmVuY3lDb2RlO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIG9uRm9ybUNoYW5nZWQodmFyaWFudEluZm86IEdlbmVyYXRlZFZhcmlhbnQpIHtcclxuICAgICAgICB0aGlzLmZvcm1WYWx1ZUNoYW5nZWQgPSB0cnVlO1xyXG4gICAgICAgIHZhcmlhbnRJbmZvLmVuYWJsZWQgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIGNhbkRlYWN0aXZhdGUoKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuICF0aGlzLmZvcm1WYWx1ZUNoYW5nZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0VmFyaWFudHNUb0FkZCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5nZW5lcmF0ZWRWYXJpYW50cy5maWx0ZXIodiA9PiAhdi5leGlzdGluZyAmJiB2LmVuYWJsZWQpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldFZhcmlhbnROYW1lKHZhcmlhbnQ6IEdlbmVyYXRlZFZhcmlhbnQpIHtcclxuICAgICAgICByZXR1cm4gdmFyaWFudC5vcHRpb25zLmxlbmd0aCA9PT0gMFxyXG4gICAgICAgICAgICA/IF8oJ2NhdGFsb2cuZGVmYXVsdC12YXJpYW50JylcclxuICAgICAgICAgICAgOiB2YXJpYW50Lm9wdGlvbnMubWFwKG8gPT4gby5uYW1lKS5qb2luKCcgJyk7XHJcbiAgICB9XHJcblxyXG4gICAgYWRkT3B0aW9uKCkge1xyXG4gICAgICAgIHRoaXMub3B0aW9uR3JvdXBzLnB1c2goe1xyXG4gICAgICAgICAgICBpc05ldzogdHJ1ZSxcclxuICAgICAgICAgICAgbmFtZTogJycsXHJcbiAgICAgICAgICAgIHZhbHVlczogW10sXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmVtb3ZlT3B0aW9uKG9wdGlvbkdyb3VwOiBPcHRpb25Hcm91cFVpTW9kZWwpIHtcclxuICAgICAgICB0aGlzLm9wdGlvbkdyb3VwcyA9IHRoaXMub3B0aW9uR3JvdXBzLmZpbHRlcihvZyA9PiBvZyAhPT0gb3B0aW9uR3JvdXApO1xyXG4gICAgICAgIHRoaXMuZ2VuZXJhdGVWYXJpYW50cygpO1xyXG4gICAgfVxyXG5cclxuICAgIGdlbmVyYXRlVmFyaWFudHMoKSB7XHJcbiAgICAgICAgY29uc3QgZ3JvdXBzID0gdGhpcy5vcHRpb25Hcm91cHMubWFwKGcgPT4gZy52YWx1ZXMpO1xyXG4gICAgICAgIGNvbnN0IHByZXZpb3VzVmFyaWFudHMgPSB0aGlzLmdlbmVyYXRlZFZhcmlhbnRzO1xyXG4gICAgICAgIGNvbnN0IGdlbmVyYXRlZFZhcmlhbnRGYWN0b3J5ID0gKFxyXG4gICAgICAgICAgICBpc0RlZmF1bHQ6IGJvb2xlYW4sXHJcbiAgICAgICAgICAgIG9wdGlvbnM6IEdlbmVyYXRlZFZhcmlhbnRbJ29wdGlvbnMnXSxcclxuICAgICAgICAgICAgZXhpc3RpbmdWYXJpYW50PzogR2V0UHJvZHVjdFZhcmlhbnRPcHRpb25zLlZhcmlhbnRzLFxyXG4gICAgICAgICAgICBwcm90b3R5cGVWYXJpYW50PzogR2V0UHJvZHVjdFZhcmlhbnRPcHRpb25zLlZhcmlhbnRzLFxyXG4gICAgICAgICk6IEdlbmVyYXRlZFZhcmlhbnQgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBwcm90b3R5cGUgPSB0aGlzLmdldFZhcmlhbnRQcm90b3R5cGUob3B0aW9ucywgcHJldmlvdXNWYXJpYW50cyk7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgR2VuZXJhdGVkVmFyaWFudCh7XHJcbiAgICAgICAgICAgICAgICBlbmFibGVkOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgZXhpc3Rpbmc6ICEhZXhpc3RpbmdWYXJpYW50LFxyXG4gICAgICAgICAgICAgICAgcHJvZHVjdFZhcmlhbnRJZDogZXhpc3RpbmdWYXJpYW50Py5pZCxcclxuICAgICAgICAgICAgICAgIGlzRGVmYXVsdCxcclxuICAgICAgICAgICAgICAgIG9wdGlvbnMsXHJcbiAgICAgICAgICAgICAgICBwcmljZTogZXhpc3RpbmdWYXJpYW50Py5wcmljZSA/PyBwcm90b3R5cGVWYXJpYW50Py5wcmljZSA/PyBwcm90b3R5cGUucHJpY2UsXHJcbiAgICAgICAgICAgICAgICBza3U6IGV4aXN0aW5nVmFyaWFudD8uc2t1ID8/IHByb3RvdHlwZVZhcmlhbnQ/LnNrdSA/PyBwcm90b3R5cGUuc2t1LFxyXG4gICAgICAgICAgICAgICAgc3RvY2s6IGV4aXN0aW5nVmFyaWFudD8uc3RvY2tPbkhhbmQgPz8gcHJvdG90eXBlVmFyaWFudD8uc3RvY2tPbkhhbmQgPz8gcHJvdG90eXBlLnN0b2NrLFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIHRoaXMuZ2VuZXJhdGVkVmFyaWFudHMgPSBncm91cHMubGVuZ3RoXHJcbiAgICAgICAgICAgID8gZ2VuZXJhdGVBbGxDb21iaW5hdGlvbnMoZ3JvdXBzKS5tYXAob3B0aW9ucyA9PiB7XHJcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGV4aXN0aW5nVmFyaWFudCA9IHRoaXMucHJvZHVjdC52YXJpYW50cy5maW5kKHYgPT5cclxuICAgICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9uc0FyZUVxdWFsKHYub3B0aW9ucywgb3B0aW9ucyksXHJcbiAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHByb3RvdHlwZVZhcmlhbnQgPSB0aGlzLnByb2R1Y3QudmFyaWFudHMuZmluZCh2ID0+XHJcbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnNBcmVTdWJzZXQodi5vcHRpb25zLCBvcHRpb25zKSxcclxuICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgICAgcmV0dXJuIGdlbmVyYXRlZFZhcmlhbnRGYWN0b3J5KGZhbHNlLCBvcHRpb25zLCBleGlzdGluZ1ZhcmlhbnQsIHByb3RvdHlwZVZhcmlhbnQpO1xyXG4gICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIDogW2dlbmVyYXRlZFZhcmlhbnRGYWN0b3J5KHRydWUsIFtdLCB0aGlzLnByb2R1Y3QudmFyaWFudHNbMF0pXTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgb25lIG9mIHRoZSBleGlzdGluZyB2YXJpYW50cyB0byBiYXNlIHRoZSBuZXdseS1nZW5lcmF0ZWQgdmFyaWFudCdzXHJcbiAgICAgKiBkZXRhaWxzIG9mZi5cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBnZXRWYXJpYW50UHJvdG90eXBlKFxyXG4gICAgICAgIG9wdGlvbnM6IEdlbmVyYXRlZFZhcmlhbnRbJ29wdGlvbnMnXSxcclxuICAgICAgICBwcmV2aW91c1ZhcmlhbnRzOiBHZW5lcmF0ZWRWYXJpYW50W10sXHJcbiAgICApOiBQaWNrPEdlbmVyYXRlZFZhcmlhbnQsICdza3UnIHwgJ3ByaWNlJyB8ICdzdG9jayc+IHtcclxuICAgICAgICBjb25zdCB2YXJpYW50c1dpdGhTaW1pbGFyT3B0aW9ucyA9IHByZXZpb3VzVmFyaWFudHMuZmlsdGVyKHYgPT5cclxuICAgICAgICAgICAgb3B0aW9ucy5tYXAobyA9PiBvLm5hbWUpLmZpbHRlcihuYW1lID0+IHYub3B0aW9ucy5tYXAobyA9PiBvLm5hbWUpLmluY2x1ZGVzKG5hbWUpKSxcclxuICAgICAgICApO1xyXG4gICAgICAgIGlmICh2YXJpYW50c1dpdGhTaW1pbGFyT3B0aW9ucy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHBpY2socHJldmlvdXNWYXJpYW50c1swXSwgWydza3UnLCAncHJpY2UnLCAnc3RvY2snXSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIHNrdTogJycsXHJcbiAgICAgICAgICAgIHByaWNlOiAwLFxyXG4gICAgICAgICAgICBzdG9jazogMCxcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIGRlbGV0ZVZhcmlhbnQoaWQ6IHN0cmluZykge1xyXG4gICAgICAgIHRoaXMubW9kYWxTZXJ2aWNlXHJcbiAgICAgICAgICAgIC5kaWFsb2coe1xyXG4gICAgICAgICAgICAgICAgdGl0bGU6IF8oJ2NhdGFsb2cuY29uZmlybS1kZWxldGUtcHJvZHVjdC12YXJpYW50JyksXHJcbiAgICAgICAgICAgICAgICBidXR0b25zOiBbXHJcbiAgICAgICAgICAgICAgICAgICAgeyB0eXBlOiAnc2Vjb25kYXJ5JywgbGFiZWw6IF8oJ2NvbW1vbi5jYW5jZWwnKSB9LFxyXG4gICAgICAgICAgICAgICAgICAgIHsgdHlwZTogJ2RhbmdlcicsIGxhYmVsOiBfKCdjb21tb24uZGVsZXRlJyksIHJldHVyblZhbHVlOiB0cnVlIH0sXHJcbiAgICAgICAgICAgICAgICBdLFxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAucGlwZShcclxuICAgICAgICAgICAgICAgIHN3aXRjaE1hcChyZXNwb25zZSA9PlxyXG4gICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlID8gdGhpcy5wcm9kdWN0RGV0YWlsU2VydmljZS5kZWxldGVQcm9kdWN0VmFyaWFudChpZCwgdGhpcy5wcm9kdWN0LmlkKSA6IEVNUFRZLFxyXG4gICAgICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgICAgIHN3aXRjaE1hcCgoKSA9PiB0aGlzLnJlRmV0Y2hQcm9kdWN0KG51bGwpKSxcclxuICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAuc3Vic2NyaWJlKFxyXG4gICAgICAgICAgICAgICAgKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm90aWZpY2F0aW9uU2VydmljZS5zdWNjZXNzKF8oJ2NvbW1vbi5ub3RpZnktZGVsZXRlLXN1Y2Nlc3MnKSwge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbnRpdHk6ICdQcm9kdWN0VmFyaWFudCcsXHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbml0T3B0aW9uc0FuZFZhcmlhbnRzKCk7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm5vdGlmaWNhdGlvblNlcnZpY2UuZXJyb3IoXygnY29tbW9uLm5vdGlmeS1kZWxldGUtZXJyb3InKSwge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbnRpdHk6ICdQcm9kdWN0VmFyaWFudCcsXHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIHNhdmUoKSB7XHJcbiAgICAgICAgdGhpcy5vcHRpb25Hcm91cHMgPSB0aGlzLm9wdGlvbkdyb3Vwcy5maWx0ZXIoZyA9PiBnLnZhbHVlcy5sZW5ndGgpO1xyXG4gICAgICAgIGNvbnN0IG5ld09wdGlvbkdyb3VwcyA9IHRoaXMub3B0aW9uR3JvdXBzXHJcbiAgICAgICAgICAgIC5maWx0ZXIob2cgPT4gb2cuaXNOZXcpXHJcbiAgICAgICAgICAgIC5tYXAob2cgPT4gKHtcclxuICAgICAgICAgICAgICAgIG5hbWU6IG9nLm5hbWUsXHJcbiAgICAgICAgICAgICAgICB2YWx1ZXM6IFtdLFxyXG4gICAgICAgICAgICB9KSk7XHJcblxyXG4gICAgICAgIHRoaXMuY2hlY2tVbmlxdWVTa3VzKClcclxuICAgICAgICAgICAgLnBpcGUoXHJcbiAgICAgICAgICAgICAgICBtZXJnZU1hcCgoKSA9PiB0aGlzLmNvbmZpcm1EZWxldGlvbk9mT2Jzb2xldGVWYXJpYW50cygpKSxcclxuICAgICAgICAgICAgICAgIG1lcmdlTWFwKCgpID0+XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9kdWN0RGV0YWlsU2VydmljZS5jcmVhdGVQcm9kdWN0T3B0aW9uR3JvdXBzKG5ld09wdGlvbkdyb3VwcywgdGhpcy5sYW5ndWFnZUNvZGUpLFxyXG4gICAgICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgICAgIG1lcmdlTWFwKGNyZWF0ZWRPcHRpb25Hcm91cHMgPT4gdGhpcy5hZGRPcHRpb25Hcm91cHNUb1Byb2R1Y3QoY3JlYXRlZE9wdGlvbkdyb3VwcykpLFxyXG4gICAgICAgICAgICAgICAgbWVyZ2VNYXAoY3JlYXRlZE9wdGlvbkdyb3VwcyA9PiB0aGlzLmFkZE5ld09wdGlvbnNUb0dyb3VwcyhjcmVhdGVkT3B0aW9uR3JvdXBzKSksXHJcbiAgICAgICAgICAgICAgICBtZXJnZU1hcChncm91cHNJZHMgPT4gdGhpcy5mZXRjaE9wdGlvbkdyb3Vwcyhncm91cHNJZHMpKSxcclxuICAgICAgICAgICAgICAgIG1lcmdlTWFwKGdyb3VwcyA9PiB0aGlzLmNyZWF0ZU5ld1Byb2R1Y3RWYXJpYW50cyhncm91cHMpKSxcclxuICAgICAgICAgICAgICAgIG1lcmdlTWFwKHJlcyA9PiB0aGlzLmRlbGV0ZU9ic29sZXRlVmFyaWFudHMocmVzLmNyZWF0ZVByb2R1Y3RWYXJpYW50cykpLFxyXG4gICAgICAgICAgICAgICAgbWVyZ2VNYXAodmFyaWFudHMgPT4gdGhpcy5yZUZldGNoUHJvZHVjdCh2YXJpYW50cykpLFxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoe1xyXG4gICAgICAgICAgICAgICAgbmV4dDogdmFyaWFudHMgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZm9ybVZhbHVlQ2hhbmdlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm90aWZpY2F0aW9uU2VydmljZS5zdWNjZXNzKF8oJ2NhdGFsb2cuY3JlYXRlZC1uZXctdmFyaWFudHMtc3VjY2VzcycpLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OiB2YXJpYW50cy5sZW5ndGgsXHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbml0T3B0aW9uc0FuZFZhcmlhbnRzKCk7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGNoZWNrVW5pcXVlU2t1cygpIHtcclxuICAgICAgICBjb25zdCB3aXRoRHVwbGljYXRlU2t1cyA9IHRoaXMuZ2VuZXJhdGVkVmFyaWFudHMuZmlsdGVyKCh2YXJpYW50LCBpbmRleCkgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5nZW5lcmF0ZWRWYXJpYW50cy5maW5kKGd2ID0+IGd2LnNrdS50cmltKCkgPT09IHZhcmlhbnQuc2t1LnRyaW0oKSAmJiBndiAhPT0gdmFyaWFudCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgaWYgKHdpdGhEdXBsaWNhdGVTa3VzLmxlbmd0aCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5tb2RhbFNlcnZpY2VcclxuICAgICAgICAgICAgICAgIC5kaWFsb2coe1xyXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiBfKCdjYXRhbG9nLmR1cGxpY2F0ZS1za3Utd2FybmluZycpLFxyXG4gICAgICAgICAgICAgICAgICAgIGJvZHk6IHVuaXF1ZSh3aXRoRHVwbGljYXRlU2t1cy5tYXAodiA9PiBgJHt2LnNrdX1gKSkuam9pbignLCAnKSxcclxuICAgICAgICAgICAgICAgICAgICBidXR0b25zOiBbeyBsYWJlbDogXygnY29tbW9uLmNsb3NlJyksIHJldHVyblZhbHVlOiBmYWxzZSwgdHlwZTogJ3ByaW1hcnknIH1dLFxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIC5waXBlKG1lcmdlTWFwKHJlcyA9PiBFTVBUWSkpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBvZih0cnVlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBjb25maXJtRGVsZXRpb25PZk9ic29sZXRlVmFyaWFudHMoKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XHJcbiAgICAgICAgY29uc3Qgb2Jzb2xldGVWYXJpYW50cyA9IHRoaXMuZ2V0T2Jzb2xldGVWYXJpYW50cygpO1xyXG4gICAgICAgIGlmIChvYnNvbGV0ZVZhcmlhbnRzLmxlbmd0aCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5tb2RhbFNlcnZpY2VcclxuICAgICAgICAgICAgICAgIC5mcm9tQ29tcG9uZW50KENvbmZpcm1WYXJpYW50RGVsZXRpb25EaWFsb2dDb21wb25lbnQsIHtcclxuICAgICAgICAgICAgICAgICAgICBsb2NhbHM6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFudHM6IG9ic29sZXRlVmFyaWFudHMsXHJcbiAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAucGlwZShcclxuICAgICAgICAgICAgICAgICAgICBtZXJnZU1hcChyZXMgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzID09PSB0cnVlID8gb2YodHJ1ZSkgOiBFTVBUWTtcclxuICAgICAgICAgICAgICAgICAgICB9KSxcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIG9mKHRydWUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGdldE9ic29sZXRlVmFyaWFudHMoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucHJvZHVjdC52YXJpYW50cy5maWx0ZXIoXHJcbiAgICAgICAgICAgIHZhcmlhbnQgPT4gIXRoaXMuZ2VuZXJhdGVkVmFyaWFudHMuZmluZChndiA9PiBndi5wcm9kdWN0VmFyaWFudElkID09PSB2YXJpYW50LmlkKSxcclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaGFzT25seURlZmF1bHRWYXJpYW50KHByb2R1Y3Q6IEdldFByb2R1Y3RWYXJpYW50T3B0aW9ucy5Qcm9kdWN0KTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHByb2R1Y3QudmFyaWFudHMubGVuZ3RoID09PSAxICYmIHByb2R1Y3Qub3B0aW9uR3JvdXBzLmxlbmd0aCA9PT0gMDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGFkZE9wdGlvbkdyb3Vwc1RvUHJvZHVjdChcclxuICAgICAgICBjcmVhdGVkT3B0aW9uR3JvdXBzOiBDcmVhdGVQcm9kdWN0T3B0aW9uR3JvdXAuQ3JlYXRlUHJvZHVjdE9wdGlvbkdyb3VwW10sXHJcbiAgICApOiBPYnNlcnZhYmxlPENyZWF0ZVByb2R1Y3RPcHRpb25Hcm91cC5DcmVhdGVQcm9kdWN0T3B0aW9uR3JvdXBbXT4ge1xyXG4gICAgICAgIGlmIChjcmVhdGVkT3B0aW9uR3JvdXBzLmxlbmd0aCkge1xyXG4gICAgICAgICAgICByZXR1cm4gZm9ya0pvaW4oXHJcbiAgICAgICAgICAgICAgICBjcmVhdGVkT3B0aW9uR3JvdXBzLm1hcChvcHRpb25Hcm91cCA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGF0YVNlcnZpY2UucHJvZHVjdC5hZGRPcHRpb25Hcm91cFRvUHJvZHVjdCh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb2R1Y3RJZDogdGhpcy5wcm9kdWN0LmlkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25Hcm91cElkOiBvcHRpb25Hcm91cC5pZCxcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICApLnBpcGUobWFwKCgpID0+IGNyZWF0ZWRPcHRpb25Hcm91cHMpKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gb2YoW10pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGFkZE5ld09wdGlvbnNUb0dyb3VwcyhcclxuICAgICAgICBjcmVhdGVkT3B0aW9uR3JvdXBzOiBDcmVhdGVQcm9kdWN0T3B0aW9uR3JvdXAuQ3JlYXRlUHJvZHVjdE9wdGlvbkdyb3VwW10sXHJcbiAgICApOiBPYnNlcnZhYmxlPHN0cmluZ1tdPiB7XHJcbiAgICAgICAgY29uc3QgbmV3T3B0aW9uczogQ3JlYXRlUHJvZHVjdE9wdGlvbklucHV0W10gPSB0aGlzLm9wdGlvbkdyb3Vwc1xyXG4gICAgICAgICAgICAubWFwKG9nID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNyZWF0ZWRHcm91cCA9IGNyZWF0ZWRPcHRpb25Hcm91cHMuZmluZChjb2cgPT4gY29nLm5hbWUgPT09IG9nLm5hbWUpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcHJvZHVjdE9wdGlvbkdyb3VwSWQgPSBjcmVhdGVkR3JvdXAgPyBjcmVhdGVkR3JvdXAuaWQgOiBvZy5pZDtcclxuICAgICAgICAgICAgICAgIGlmICghcHJvZHVjdE9wdGlvbkdyb3VwSWQpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvdWxkIG5vdCBnZXQgYSBwcm9kdWN0T3B0aW9uR3JvdXBJZCcpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG9nLnZhbHVlc1xyXG4gICAgICAgICAgICAgICAgICAgIC5maWx0ZXIodiA9PiAhdi5sb2NrZWQpXHJcbiAgICAgICAgICAgICAgICAgICAgLm1hcCh2ID0+ICh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb2R1Y3RPcHRpb25Hcm91cElkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiBub3JtYWxpemVTdHJpbmcodi5uYW1lLCAnLScpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2xhdGlvbnM6IFt7IG5hbWU6IHYubmFtZSwgbGFuZ3VhZ2VDb2RlOiB0aGlzLmxhbmd1YWdlQ29kZSB9XSxcclxuICAgICAgICAgICAgICAgICAgICB9KSk7XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIC5yZWR1Y2UoKGZsYXQsIG9wdGlvbnMpID0+IFsuLi5mbGF0LCAuLi5vcHRpb25zXSwgW10pO1xyXG5cclxuICAgICAgICBjb25zdCBhbGxHcm91cElkcyA9IFtcclxuICAgICAgICAgICAgLi4uY3JlYXRlZE9wdGlvbkdyb3Vwcy5tYXAoZyA9PiBnLmlkKSxcclxuICAgICAgICAgICAgLi4udGhpcy5vcHRpb25Hcm91cHMubWFwKGcgPT4gZy5pZCkuZmlsdGVyKG5vdE51bGxPclVuZGVmaW5lZCksXHJcbiAgICAgICAgXTtcclxuXHJcbiAgICAgICAgaWYgKG5ld09wdGlvbnMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmb3JrSm9pbihuZXdPcHRpb25zLm1hcChpbnB1dCA9PiB0aGlzLmRhdGFTZXJ2aWNlLnByb2R1Y3QuYWRkT3B0aW9uVG9Hcm91cChpbnB1dCkpKS5waXBlKFxyXG4gICAgICAgICAgICAgICAgbWFwKCgpID0+IGFsbEdyb3VwSWRzKSxcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gb2YoYWxsR3JvdXBJZHMpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGZldGNoT3B0aW9uR3JvdXBzKGdyb3Vwc0lkczogc3RyaW5nW10pOiBPYnNlcnZhYmxlPFByb2R1Y3RPcHRpb25Hcm91cFdpdGhPcHRpb25zRnJhZ21lbnRbXT4ge1xyXG4gICAgICAgIHJldHVybiBmb3JrSm9pbihcclxuICAgICAgICAgICAgZ3JvdXBzSWRzLm1hcChpZCA9PlxyXG4gICAgICAgICAgICAgICAgdGhpcy5kYXRhU2VydmljZS5wcm9kdWN0XHJcbiAgICAgICAgICAgICAgICAgICAgLmdldFByb2R1Y3RPcHRpb25Hcm91cChpZClcclxuICAgICAgICAgICAgICAgICAgICAubWFwU2luZ2xlKGRhdGEgPT4gZGF0YS5wcm9kdWN0T3B0aW9uR3JvdXApXHJcbiAgICAgICAgICAgICAgICAgICAgLnBpcGUoZmlsdGVyKG5vdE51bGxPclVuZGVmaW5lZCkpLFxyXG4gICAgICAgICAgICApLFxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBjcmVhdGVOZXdQcm9kdWN0VmFyaWFudHMoZ3JvdXBzOiBQcm9kdWN0T3B0aW9uR3JvdXBXaXRoT3B0aW9uc0ZyYWdtZW50W10pIHtcclxuICAgICAgICBjb25zdCBvcHRpb25zID0gZ3JvdXBzXHJcbiAgICAgICAgICAgIC5maWx0ZXIobm90TnVsbE9yVW5kZWZpbmVkKVxyXG4gICAgICAgICAgICAubWFwKG9nID0+IG9nLm9wdGlvbnMpXHJcbiAgICAgICAgICAgIC5yZWR1Y2UoKGZsYXQsIG8pID0+IFsuLi5mbGF0LCAuLi5vXSwgW10pO1xyXG4gICAgICAgIGNvbnN0IHZhcmlhbnRzID0gdGhpcy5nZW5lcmF0ZWRWYXJpYW50c1xyXG4gICAgICAgICAgICAuZmlsdGVyKHYgPT4gdi5lbmFibGVkICYmICF2LmV4aXN0aW5nKVxyXG4gICAgICAgICAgICAubWFwKHYgPT4gKHtcclxuICAgICAgICAgICAgICAgIHByaWNlOiB2LnByaWNlLFxyXG4gICAgICAgICAgICAgICAgc2t1OiB2LnNrdSxcclxuICAgICAgICAgICAgICAgIHN0b2NrOiB2LnN0b2NrLFxyXG4gICAgICAgICAgICAgICAgb3B0aW9uSWRzOiB2Lm9wdGlvbnNcclxuICAgICAgICAgICAgICAgICAgICAubWFwKG5hbWUgPT4gb3B0aW9ucy5maW5kKG8gPT4gby5uYW1lID09PSBuYW1lLm5hbWUpKVxyXG4gICAgICAgICAgICAgICAgICAgIC5maWx0ZXIobm90TnVsbE9yVW5kZWZpbmVkKVxyXG4gICAgICAgICAgICAgICAgICAgIC5tYXAobyA9PiBvLmlkKSxcclxuICAgICAgICAgICAgfSkpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLnByb2R1Y3REZXRhaWxTZXJ2aWNlLmNyZWF0ZVByb2R1Y3RWYXJpYW50cyhcclxuICAgICAgICAgICAgdGhpcy5wcm9kdWN0LFxyXG4gICAgICAgICAgICB2YXJpYW50cyxcclxuICAgICAgICAgICAgb3B0aW9ucyxcclxuICAgICAgICAgICAgdGhpcy5sYW5ndWFnZUNvZGUsXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGRlbGV0ZU9ic29sZXRlVmFyaWFudHM8VD4oaW5wdXQ6IFQpOiBPYnNlcnZhYmxlPFQ+IHtcclxuICAgICAgICBjb25zdCBvYnNvbGV0ZVZhcmlhbnRzID0gdGhpcy5nZXRPYnNvbGV0ZVZhcmlhbnRzKCk7XHJcbiAgICAgICAgaWYgKG9ic29sZXRlVmFyaWFudHMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGRlbGV0ZU9wZXJhdGlvbnMgPSBvYnNvbGV0ZVZhcmlhbnRzLm1hcCh2ID0+XHJcbiAgICAgICAgICAgICAgICB0aGlzLmRhdGFTZXJ2aWNlLnByb2R1Y3QuZGVsZXRlUHJvZHVjdFZhcmlhbnQodi5pZCkucGlwZShtYXAoKCkgPT4gaW5wdXQpKSxcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgcmV0dXJuIGZvcmtKb2luKC4uLmRlbGV0ZU9wZXJhdGlvbnMpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBvZihpbnB1dCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgcmVGZXRjaFByb2R1Y3Q8VD4oaW5wdXQ6IFQpOiBPYnNlcnZhYmxlPFQ+IHtcclxuICAgICAgICAvLyBSZS1mZXRjaCB0aGUgUHJvZHVjdCB0byBmb3JjZSBhbiB1cGRhdGUgdG8gdGhlIHZpZXcuXHJcbiAgICAgICAgY29uc3QgaWQgPSB0aGlzLnJvdXRlLnNuYXBzaG90LnBhcmFtTWFwLmdldCgnaWQnKTtcclxuICAgICAgICBpZiAoaWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGF0YVNlcnZpY2UucHJvZHVjdC5nZXRQcm9kdWN0KGlkKS5zaW5nbGUkLnBpcGUobWFwKCgpID0+IGlucHV0KSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIG9mKGlucHV0KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaW5pdE9wdGlvbnNBbmRWYXJpYW50cygpIHtcclxuICAgICAgICB0aGlzLmRhdGFTZXJ2aWNlLnByb2R1Y3RcclxuICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLW5vbi1udWxsLWFzc2VydGlvblxyXG4gICAgICAgICAgICAuZ2V0UHJvZHVjdFZhcmlhbnRzT3B0aW9ucyh0aGlzLnJvdXRlLnNuYXBzaG90LnBhcmFtTWFwLmdldCgnaWQnKSEpXHJcbiAgICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1ub24tbnVsbC1hc3NlcnRpb25cclxuICAgICAgICAgICAgLm1hcFNpbmdsZSgoeyBwcm9kdWN0IH0pID0+IHByb2R1Y3QhKVxyXG4gICAgICAgICAgICAuc3Vic2NyaWJlKHAgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5wcm9kdWN0ID0gcDtcclxuICAgICAgICAgICAgICAgIHRoaXMub3B0aW9uR3JvdXBzID0gcC5vcHRpb25Hcm91cHMubWFwKG9nID0+IHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZDogb2cuaWQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlzTmV3OiBmYWxzZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogb2cubmFtZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzOiBvZy5vcHRpb25zLm1hcChvID0+ICh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogby5pZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IG8ubmFtZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2tlZDogdHJ1ZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSkpLFxyXG4gICAgICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGVWYXJpYW50cygpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIG9wdGlvbnNBcmVFcXVhbChhOiBBcnJheTx7IG5hbWU6IHN0cmluZyB9PiwgYjogQXJyYXk8eyBuYW1lOiBzdHJpbmcgfT4pOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gdGhpcy50b09wdGlvblN0cmluZyhhKSA9PT0gdGhpcy50b09wdGlvblN0cmluZyhiKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIG9wdGlvbnNBcmVTdWJzZXQoYTogQXJyYXk8eyBuYW1lOiBzdHJpbmcgfT4sIGI6IEFycmF5PHsgbmFtZTogc3RyaW5nIH0+KTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMudG9PcHRpb25TdHJpbmcoYikuaW5jbHVkZXModGhpcy50b09wdGlvblN0cmluZyhhKSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSB0b09wdGlvblN0cmluZyhvOiBBcnJheTx7IG5hbWU6IHN0cmluZyB9Pik6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuIG9cclxuICAgICAgICAgICAgLm1hcCh4ID0+IHgubmFtZSlcclxuICAgICAgICAgICAgLnNvcnQoKVxyXG4gICAgICAgICAgICAuam9pbignfCcpO1xyXG4gICAgfVxyXG59XHJcbiJdfQ==
419
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZHVjdC12YXJpYW50cy1lZGl0b3IuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9jYXRhbG9nL3NyYy9jb21wb25lbnRzL3Byb2R1Y3QtdmFyaWFudHMtZWRpdG9yL3Byb2R1Y3QtdmFyaWFudHMtZWRpdG9yLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsU0FBUyxFQUFVLE1BQU0sZUFBZSxDQUFDO0FBQzNFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNqRCxPQUFPLEVBQUUsTUFBTSxJQUFJLENBQUMsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBQ3RFLE9BQU8sRUFJSCxXQUFXLEVBRVgsY0FBYyxFQUNkLG9CQUFvQixFQUdwQixZQUFZLEVBQ1osbUJBQW1CLEdBRXRCLE1BQU0sd0JBQXdCLENBQUM7QUFDaEMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUNoRCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUMvRixPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDcEQsT0FBTyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQWMsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3ZELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFbEYsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sdURBQXVELENBQUM7QUFDN0YsT0FBTyxFQUFFLHFDQUFxQyxFQUFFLE1BQU0sOEVBQThFLENBQUM7QUFFckksTUFBTSxPQUFPLGdCQUFnQjtJ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QUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNuRSxDQUFDO0lBRU8sY0FBYyxDQUFDLENBQTBCO1FBQzdDLE9BQU8sQ0FBQzthQUNILEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7YUFDaEIsSUFBSSxFQUFFO2FBQ04sSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ25CLENBQUM7OztZQXJkSixTQUFTLFNBQUM7Z0JBQ1AsUUFBUSxFQUFFLDZCQUE2QjtnQkFDdkMsNjhMQUF1RDtnQkFFdkQsZUFBZSxFQUFFLHVCQUF1QixDQUFDLE9BQU87O2FBQ25EOzs7WUE1RFEsY0FBYztZQU1uQixXQUFXO1lBaUJOLG9CQUFvQjtZQVZ6QixtQkFBbUI7WUFEbkIsWUFBWSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XHJcbmltcG9ydCB7IG1hcmtlciBhcyBfIH0gZnJvbSAnQGJpZXNiamVyZy9uZ3gtdHJhbnNsYXRlLWV4dHJhY3QtbWFya2VyJztcclxuaW1wb3J0IHtcclxuICAgIENyZWF0ZVByb2R1Y3RPcHRpb25Hcm91cCxcclxuICAgIENyZWF0ZVByb2R1Y3RPcHRpb25JbnB1dCxcclxuICAgIEN1cnJlbmN5Q29kZSxcclxuICAgIERhdGFTZXJ2aWNlLFxyXG4gICAgRGVhY3RpdmF0ZUF3YXJlLFxyXG4gICAgRGVsZXRpb25SZXN1bHQsXHJcbiAgICBnZXREZWZhdWx0VWlMYW5ndWFnZSxcclxuICAgIEdldFByb2R1Y3RWYXJpYW50T3B0aW9ucyxcclxuICAgIExhbmd1YWdlQ29kZSxcclxuICAgIE1vZGFsU2VydmljZSxcclxuICAgIE5vdGlmaWNhdGlvblNlcnZpY2UsXHJcbiAgICBQcm9kdWN0T3B0aW9uR3JvdXBXaXRoT3B0aW9uc0ZyYWdtZW50LFxyXG59IGZyb20gJ0B2ZW5kdXJlL2FkbWluLXVpL2NvcmUnO1xyXG5pbXBvcnQgeyBub3JtYWxpemVTdHJpbmcgfSBmcm9tICdAdmVuZHVyZS9jb21tb24vbGliL25vcm1hbGl6ZS1zdHJpbmcnO1xyXG5pbXBvcnQgeyBwaWNrIH0gZnJvbSAnQHZlbmR1cmUvY29tbW9uL2xpYi9waWNrJztcclxuaW1wb3J0IHsgZ2VuZXJhdGVBbGxDb21iaW5hdGlvbnMsIG5vdE51bGxPclVuZGVmaW5lZCB9IGZyb20gJ0B2ZW5kdXJlL2NvbW1vbi9saWIvc2hhcmVkLXV0aWxzJztcclxuaW1wb3J0IHsgdW5pcXVlIH0gZnJvbSAnQHZlbmR1cmUvY29tbW9uL2xpYi91bmlxdWUnO1xyXG5pbXBvcnQgeyBFTVBUWSwgZm9ya0pvaW4sIE9ic2VydmFibGUsIG9mIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IGRlZmF1bHRJZkVtcHR5LCBmaWx0ZXIsIG1hcCwgbWVyZ2VNYXAsIHN3aXRjaE1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuXHJcbmltcG9ydCB7IFByb2R1Y3REZXRhaWxTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vcHJvdmlkZXJzL3Byb2R1Y3QtZGV0YWlsL3Byb2R1Y3QtZGV0YWlsLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBDb25maXJtVmFyaWFudERlbGV0aW9uRGlhbG9nQ29tcG9uZW50IH0gZnJvbSAnLi4vY29uZmlybS12YXJpYW50LWRlbGV0aW9uLWRpYWxvZy9jb25maXJtLXZhcmlhbnQtZGVsZXRpb24tZGlhbG9nLmNvbXBvbmVudCc7XHJcblxyXG5leHBvcnQgY2xhc3MgR2VuZXJhdGVkVmFyaWFudCB7XHJcbiAgICBpc0RlZmF1bHQ6IGJvb2xlYW47XHJcbiAgICBvcHRpb25zOiBBcnJheTx7IG5hbWU6IHN0cmluZzsgaWQ/OiBzdHJpbmcgfT47XHJcbiAgICBwcm9kdWN0VmFyaWFudElkPzogc3RyaW5nO1xyXG4gICAgZW5hYmxlZDogYm9vbGVhbjtcclxuICAgIGV4aXN0aW5nOiBib29sZWFuO1xyXG4gICAgc2t1OiBzdHJpbmc7XHJcbiAgICBwcmljZTogbnVtYmVyO1xyXG4gICAgc3RvY2s6IG51bWJlcjtcclxuXHJcbiAgICBjb25zdHJ1Y3Rvcihjb25maWc6IFBhcnRpYWw8R2VuZXJhdGVkVmFyaWFudD4pIHtcclxuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhjb25maWcpKSB7XHJcbiAgICAgICAgICAgIHRoaXNba2V5XSA9IGNvbmZpZ1trZXldO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG5cclxuaW50ZXJmYWNlIE9wdGlvbkdyb3VwVWlNb2RlbCB7XHJcbiAgICBpZD86IHN0cmluZztcclxuICAgIGlzTmV3OiBib29sZWFuO1xyXG4gICAgbmFtZTogc3RyaW5nO1xyXG4gICAgbG9ja2VkOiBib29sZWFuO1xyXG4gICAgdmFsdWVzOiBBcnJheTx7XHJcbiAgICAgICAgaWQ/OiBzdHJpbmc7XHJcbiAgICAgICAgbmFtZTogc3RyaW5nO1xyXG4gICAgICAgIGxvY2tlZDogYm9vbGVhbjtcclxuICAgIH0+O1xyXG59XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICAgIHNlbGVjdG9yOiAndmRyLXByb2R1Y3QtdmFyaWFudHMtZWRpdG9yJyxcclxuICAgIHRlbXBsYXRlVXJsOiAnLi9wcm9kdWN0LXZhcmlhbnRzLWVkaXRvci5jb21wb25lbnQuaHRtbCcsXHJcbiAgICBzdHlsZVVybHM6IFsnLi9wcm9kdWN0LXZhcmlhbnRzLWVkaXRvci5jb21wb25lbnQuc2NzcyddLFxyXG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5EZWZhdWx0LFxyXG59KVxyXG5leHBvcnQgY2xhc3MgUHJvZHVjdFZhcmlhbnRzRWRpdG9yQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBEZWFjdGl2YXRlQXdhcmUge1xyXG4gICAgZm9ybVZhbHVlQ2hhbmdlZCA9IGZhbHNlO1xyXG4gICAgb3B0aW9uc0NoYW5nZWQgPSBmYWxzZTtcclxuICAgIGdlbmVyYXRlZFZhcmlhbnRzOiBHZW5lcmF0ZWRWYXJpYW50W10gPSBbXTtcclxuICAgIG9wdGlvbkdyb3VwczogT3B0aW9uR3JvdXBVaU1vZGVsW107XHJcbiAgICBwcm9kdWN0OiBHZXRQcm9kdWN0VmFyaWFudE9wdGlvbnMuUHJvZHVjdDtcclxuICAgIGN1cnJlbmN5Q29kZTogQ3VycmVuY3lDb2RlO1xyXG4gICAgcHJpdmF0ZSBsYW5ndWFnZUNvZGU6IExhbmd1YWdlQ29kZTtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihcclxuICAgICAgICBwcml2YXRlIHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcclxuICAgICAgICBwcml2YXRlIGRhdGFTZXJ2aWNlOiBEYXRhU2VydmljZSxcclxuICAgICAgICBwcml2YXRlIHByb2R1Y3REZXRhaWxTZXJ2aWNlOiBQcm9kdWN0RGV0YWlsU2VydmljZSxcclxuICAgICAgICBwcml2YXRlIG5vdGlmaWNhdGlvblNlcnZpY2U6IE5vdGlmaWNhdGlvblNlcnZpY2UsXHJcbiAgICAgICAgcHJpdmF0ZSBtb2RhbFNlcnZpY2U6IE1vZGFsU2VydmljZSxcclxuICAgICkge31cclxuXHJcbiAgICBuZ09uSW5pdCgpIHtcclxuICAgICAgICB0aGlzLmluaXRPcHRpb25zQW5kVmFyaWFudHMoKTtcclxuICAgICAgICB0aGlzLmxhbmd1YWdlQ29kZSA9XHJcbiAgICAgICAgICAgICh0aGlzLnJvdXRlLnNuYXBzaG90LnBhcmFtTWFwLmdldCgnbGFuZycpIGFzIExhbmd1YWdlQ29kZSkgfHwgZ2V0RGVmYXVsdFVpTGFuZ3VhZ2UoKTtcclxuICAgICAgICB0aGlzLmRhdGFTZXJ2aWNlLnNldHRpbmdzLmdldEFjdGl2ZUNoYW5uZWwoKS5zaW5nbGUkLnN1YnNjcmliZShkYXRhID0+IHtcclxuICAgICAgICAgICAgdGhpcy5jdXJyZW5jeUNvZGUgPSBkYXRhLmFjdGl2ZUNoYW5uZWwuY3VycmVuY3lDb2RlO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIG9uRm9ybUNoYW5nZWQodmFyaWFudEluZm86IEdlbmVyYXRlZFZhcmlhbnQpIHtcclxuICAgICAgICB0aGlzLmZvcm1WYWx1ZUNoYW5nZWQgPSB0cnVlO1xyXG4gICAgICAgIHZhcmlhbnRJbmZvLmVuYWJsZWQgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIGNhbkRlYWN0aXZhdGUoKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuICF0aGlzLmZvcm1WYWx1ZUNoYW5nZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0VmFyaWFudHNUb0FkZCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5nZW5lcmF0ZWRWYXJpYW50cy5maWx0ZXIodiA9PiAhdi5leGlzdGluZyAmJiB2LmVuYWJsZWQpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldFZhcmlhbnROYW1lKHZhcmlhbnQ6IEdlbmVyYXRlZFZhcmlhbnQpIHtcclxuICAgICAgICByZXR1cm4gdmFyaWFudC5vcHRpb25zLmxlbmd0aCA9PT0gMFxyXG4gICAgICAgICAgICA/IF8oJ2NhdGFsb2cuZGVmYXVsdC12YXJpYW50JylcclxuICAgICAgICAgICAgOiB2YXJpYW50Lm9wdGlvbnMubWFwKG8gPT4gby5uYW1lKS5qb2luKCcgJyk7XHJcbiAgICB9XHJcblxyXG4gICAgYWRkT3B0aW9uR3JvdXAoKSB7XHJcbiAgICAgICAgdGhpcy5vcHRpb25Hcm91cHMucHVzaCh7XHJcbiAgICAgICAgICAgIGlzTmV3OiB0cnVlLFxyXG4gICAgICAgICAgICBsb2NrZWQ6IGZhbHNlLFxyXG4gICAgICAgICAgICBuYW1lOiAnJyxcclxuICAgICAgICAgICAgdmFsdWVzOiBbXSxcclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLm9wdGlvbnNDaGFuZ2VkID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICByZW1vdmVPcHRpb25Hcm91cChvcHRpb25Hcm91cDogT3B0aW9uR3JvdXBVaU1vZGVsKSB7XHJcbiAgICAgICAgY29uc3QgaWQgPSBvcHRpb25Hcm91cC5pZDtcclxuICAgICAgICBpZiAob3B0aW9uR3JvdXAuaXNOZXcpIHtcclxuICAgICAgICAgICAgdGhpcy5vcHRpb25Hcm91cHMgPSB0aGlzLm9wdGlvbkdyb3Vwcy5maWx0ZXIob2cgPT4gb2cgIT09IG9wdGlvbkdyb3VwKTtcclxuICAgICAgICAgICAgdGhpcy5nZW5lcmF0ZVZhcmlhbnRzKCk7XHJcbiAgICAgICAgICAgIHRoaXMub3B0aW9uc0NoYW5nZWQgPSB0cnVlO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoaWQpIHtcclxuICAgICAgICAgICAgdGhpcy5tb2RhbFNlcnZpY2VcclxuICAgICAgICAgICAgICAgIC5kaWFsb2coe1xyXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiBfKCdjYXRhbG9nLmNvbmZpcm0tZGVsZXRlLXByb2R1Y3Qtb3B0aW9uLWdyb3VwJyksXHJcbiAgICAgICAgICAgICAgICAgICAgdHJhbnNsYXRpb25WYXJzOiB7IG5hbWU6IG9wdGlvbkdyb3VwLm5hbWUgfSxcclxuICAgICAgICAgICAgICAgICAgICBidXR0b25zOiBbXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHsgdHlwZTogJ3NlY29uZGFyeScsIGxhYmVsOiBfKCdjb21tb24uY2FuY2VsJykgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgeyB0eXBlOiAnZGFuZ2VyJywgbGFiZWw6IF8oJ2NvbW1vbi5kZWxldGUnKSwgcmV0dXJuVmFsdWU6IHRydWUgfSxcclxuICAgICAgICAgICAgICAgICAgICBdLFxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIC5waXBlKFxyXG4gICAgICAgICAgICAgICAgICAgIHN3aXRjaE1hcCh2YWwgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kYXRhU2VydmljZS5wcm9kdWN0LnJlbW92ZU9wdGlvbkdyb3VwRnJvbVByb2R1Y3Qoe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbkdyb3VwSWQ6IGlkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2R1Y3RJZDogdGhpcy5wcm9kdWN0LmlkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRU1QVFk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9KSxcclxuICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoKHsgcmVtb3ZlT3B0aW9uR3JvdXBGcm9tUHJvZHVjdCB9KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlbW92ZU9wdGlvbkdyb3VwRnJvbVByb2R1Y3QuX190eXBlbmFtZSA9PT0gJ1Byb2R1Y3QnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm90aWZpY2F0aW9uU2VydmljZS5zdWNjZXNzKF8oJ2NvbW1vbi5ub3RpZnktZGVsZXRlLXN1Y2Nlc3MnKSwge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50aXR5OiAnUHJvZHVjdE9wdGlvbkdyb3VwJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaW5pdE9wdGlvbnNBbmRWYXJpYW50cygpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnNDaGFuZ2VkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJlbW92ZU9wdGlvbkdyb3VwRnJvbVByb2R1Y3QuX190eXBlbmFtZSA9PT0gJ1Byb2R1Y3RPcHRpb25JblVzZUVycm9yJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5vdGlmaWNhdGlvblNlcnZpY2UuZXJyb3IocmVtb3ZlT3B0aW9uR3JvdXBGcm9tUHJvZHVjdC5tZXNzYWdlID8/ICcnKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYWRkT3B0aW9uKGdyb3VwSWQ6IHN0cmluZywgb3B0aW9uTmFtZTogc3RyaW5nKSB7XHJcbiAgICAgICAgdGhpcy5vcHRpb25Hcm91cHMuZmluZChnID0+IGcuaWQgPT09IGdyb3VwSWQpPy52YWx1ZXMucHVzaCh7IG5hbWU6IG9wdGlvbk5hbWUsIGxvY2tlZDogZmFsc2UgfSk7XHJcbiAgICAgICAgdGhpcy5nZW5lcmF0ZVZhcmlhbnRzKCk7XHJcbiAgICAgICAgdGhpcy5vcHRpb25zQ2hhbmdlZCA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgcmVtb3ZlT3B0aW9uKGdyb3VwSWQ6IHN0cmluZywgeyBpZCwgbmFtZSB9OiB7IGlkPzogc3RyaW5nOyBuYW1lOiBzdHJpbmcgfSkge1xyXG4gICAgICAgIGNvbnN0IG9wdGlvbkdyb3VwID0gdGhpcy5vcHRpb25Hcm91cHMuZmluZChnID0+IGcuaWQgPT09IGdyb3VwSWQpO1xyXG4gICAgICAgIGlmIChvcHRpb25Hcm91cCkge1xyXG4gICAgICAgICAgICBpZiAoIWlkKSB7XHJcbiAgICAgICAgICAgICAgICBvcHRpb25Hcm91cC52YWx1ZXMgPSBvcHRpb25Hcm91cC52YWx1ZXMuZmlsdGVyKHYgPT4gdi5uYW1lICE9PSBuYW1lKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGVWYXJpYW50cygpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5tb2RhbFNlcnZpY2VcclxuICAgICAgICAgICAgICAgICAgICAuZGlhbG9nKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6IF8oJ2NhdGFsb2cuY29uZmlybS1kZWxldGUtcHJvZHVjdC1vcHRpb24nKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNsYXRpb25WYXJzOiB7IG5hbWUgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnV0dG9uczogW1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeyB0eXBlOiAnc2Vjb25kYXJ5JywgbGFiZWw6IF8oJ2NvbW1vbi5jYW5jZWwnKSB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeyB0eXBlOiAnZGFuZ2VyJywgbGFiZWw6IF8oJ2NvbW1vbi5kZWxldGUnKSwgcmV0dXJuVmFsdWU6IHRydWUgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgXSxcclxuICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgIC5waXBlKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2hNYXAodmFsID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kYXRhU2VydmljZS5wcm9kdWN0LmRlbGV0ZVByb2R1Y3RPcHRpb24oaWQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRU1QVFk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKCh7IGRlbGV0ZVByb2R1Y3RPcHRpb24gfSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVsZXRlUHJvZHVjdE9wdGlvbi5yZXN1bHQgPT09IERlbGV0aW9uUmVzdWx0LkRFTEVURUQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm90aWZpY2F0aW9uU2VydmljZS5zdWNjZXNzKF8oJ2NvbW1vbi5ub3RpZnktZGVsZXRlLXN1Y2Nlc3MnKSwge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudGl0eTogJ1Byb2R1Y3RPcHRpb24nLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25Hcm91cC52YWx1ZXMgPSBvcHRpb25Hcm91cC52YWx1ZXMuZmlsdGVyKHYgPT4gdi5pZCAhPT0gaWQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZW5lcmF0ZVZhcmlhbnRzKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnNDaGFuZ2VkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm90aWZpY2F0aW9uU2VydmljZS5lcnJvcihkZWxldGVQcm9kdWN0T3B0aW9uLm1lc3NhZ2UgPz8gJycpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZ2VuZXJhdGVWYXJpYW50cygpIHtcclxuICAgICAgICBjb25zdCBncm91cHMgPSB0aGlzLm9wdGlvbkdyb3Vwcy5tYXAoZyA9PiBnLnZhbHVlcyk7XHJcbiAgICAgICAgY29uc3QgcHJldmlvdXNWYXJpYW50cyA9IHRoaXMuZ2VuZXJhdGVkVmFyaWFudHM7XHJcbiAgICAgICAgY29uc3QgZ2VuZXJhdGVkVmFyaWFudEZhY3RvcnkgPSAoXHJcbiAgICAgICAgICAgIGlzRGVmYXVsdDogYm9vbGVhbixcclxuICAgICAgICAgICAgb3B0aW9uczogR2VuZXJhdGVkVmFyaWFudFsnb3B0aW9ucyddLFxyXG4gICAgICAgICAgICBleGlzdGluZ1ZhcmlhbnQ/OiBHZXRQcm9kdWN0VmFyaWFudE9wdGlvbnMuVmFyaWFudHMsXHJcbiAgICAgICAgICAgIHByb3RvdHlwZVZhcmlhbnQ/OiBHZXRQcm9kdWN0VmFyaWFudE9wdGlvbnMuVmFyaWFudHMsXHJcbiAgICAgICAgKTogR2VuZXJhdGVkVmFyaWFudCA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IHByb3RvdHlwZSA9IHRoaXMuZ2V0VmFyaWFudFByb3RvdHlwZShvcHRpb25zLCBwcmV2aW91c1ZhcmlhbnRzKTtcclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBHZW5lcmF0ZWRWYXJpYW50KHtcclxuICAgICAgICAgICAgICAgIGVuYWJsZWQ6IHRydWUsXHJcbiAgICAgICAgICAgICAgICBleGlzdGluZzogISFleGlzdGluZ1ZhcmlhbnQsXHJcbiAgICAgICAgICAgICAgICBwcm9kdWN0VmFyaWFudElkOiBleGlzdGluZ1ZhcmlhbnQ/LmlkLFxyXG4gICAgICAgICAgICAgICAgaXNEZWZhdWx0LFxyXG4gICAgICAgICAgICAgICAgb3B0aW9ucyxcclxuICAgICAgICAgICAgICAgIHByaWNlOiBleGlzdGluZ1ZhcmlhbnQ/LnByaWNlID8/IHByb3RvdHlwZVZhcmlhbnQ/LnByaWNlID8/IHByb3RvdHlwZS5wcmljZSxcclxuICAgICAgICAgICAgICAgIHNrdTogZXhpc3RpbmdWYXJpYW50Py5za3UgPz8gcHJvdG90eXBlVmFyaWFudD8uc2t1ID8/IHByb3RvdHlwZS5za3UsXHJcbiAgICAgICAgICAgICAgICBzdG9jazogZXhpc3RpbmdWYXJpYW50Py5zdG9ja09uSGFuZCA/PyBwcm90b3R5cGVWYXJpYW50Py5zdG9ja09uSGFuZCA/PyBwcm90b3R5cGUuc3RvY2ssXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy5nZW5lcmF0ZWRWYXJpYW50cyA9IGdyb3Vwcy5sZW5ndGhcclxuICAgICAgICAgICAgPyBnZW5lcmF0ZUFsbENvbWJpbmF0aW9ucyhncm91cHMpLm1hcChvcHRpb25zID0+IHtcclxuICAgICAgICAgICAgICAgICAgY29uc3QgZXhpc3RpbmdWYXJpYW50ID0gdGhpcy5wcm9kdWN0LnZhcmlhbnRzLmZpbmQodiA9PlxyXG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zQXJlRXF1YWwodi5vcHRpb25zLCBvcHRpb25zKSxcclxuICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgICAgY29uc3QgcHJvdG90eXBlVmFyaWFudCA9IHRoaXMucHJvZHVjdC52YXJpYW50cy5maW5kKHYgPT5cclxuICAgICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9uc0FyZVN1YnNldCh2Lm9wdGlvbnMsIG9wdGlvbnMpLFxyXG4gICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgICByZXR1cm4gZ2VuZXJhdGVkVmFyaWFudEZhY3RvcnkoZmFsc2UsIG9wdGlvbnMsIGV4aXN0aW5nVmFyaWFudCwgcHJvdG90eXBlVmFyaWFudCk7XHJcbiAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgOiBbZ2VuZXJhdGVkVmFyaWFudEZhY3RvcnkodHJ1ZSwgW10sIHRoaXMucHJvZHVjdC52YXJpYW50c1swXSldO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBvbmUgb2YgdGhlIGV4aXN0aW5nIHZhcmlhbnRzIHRvIGJhc2UgdGhlIG5ld2x5LWdlbmVyYXRlZCB2YXJpYW50J3NcclxuICAgICAqIGRldGFpbHMgb2ZmLlxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGdldFZhcmlhbnRQcm90b3R5cGUoXHJcbiAgICAgICAgb3B0aW9uczogR2VuZXJhdGVkVmFyaWFudFsnb3B0aW9ucyddLFxyXG4gICAgICAgIHByZXZpb3VzVmFyaWFudHM6IEdlbmVyYXRlZFZhcmlhbnRbXSxcclxuICAgICk6IFBpY2s8R2VuZXJhdGVkVmFyaWFudCwgJ3NrdScgfCAncHJpY2UnIHwgJ3N0b2NrJz4ge1xyXG4gICAgICAgIGNvbnN0IHZhcmlhbnRzV2l0aFNpbWlsYXJPcHRpb25zID0gcHJldmlvdXNWYXJpYW50cy5maWx0ZXIodiA9PlxyXG4gICAgICAgICAgICBvcHRpb25zLm1hcChvID0+IG8ubmFtZSkuZmlsdGVyKG5hbWUgPT4gdi5vcHRpb25zLm1hcChvID0+IG8ubmFtZSkuaW5jbHVkZXMobmFtZSkpLFxyXG4gICAgICAgICk7XHJcbiAgICAgICAgaWYgKHZhcmlhbnRzV2l0aFNpbWlsYXJPcHRpb25zLmxlbmd0aCkge1xyXG4gICAgICAgICAgICByZXR1cm4gcGljayhwcmV2aW91c1ZhcmlhbnRzWzBdLCBbJ3NrdScsICdwcmljZScsICdzdG9jayddKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgc2t1OiAnJyxcclxuICAgICAgICAgICAgcHJpY2U6IDAsXHJcbiAgICAgICAgICAgIHN0b2NrOiAwLFxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgZGVsZXRlVmFyaWFudChpZDogc3RyaW5nLCBvcHRpb25zOiBHZW5lcmF0ZWRWYXJpYW50WydvcHRpb25zJ10pIHtcclxuICAgICAgICB0aGlzLm1vZGFsU2VydmljZVxyXG4gICAgICAgICAgICAuZGlhbG9nKHtcclxuICAgICAgICAgICAgICAgIHRpdGxlOiBfKCdjYXRhbG9nLmNvbmZpcm0tZGVsZXRlLXByb2R1Y3QtdmFyaWFudCcpLFxyXG4gICAgICAgICAgICAgICAgdHJhbnNsYXRpb25WYXJzOiB7IG5hbWU6IG9wdGlvbnMubWFwKG8gPT4gby5uYW1lKS5qb2luKCcgJykgfSxcclxuICAgICAgICAgICAgICAgIGJ1dHRvbnM6IFtcclxuICAgICAgICAgICAgICAgICAgICB7IHR5cGU6ICdzZWNvbmRhcnknLCBsYWJlbDogXygnY29tbW9uLmNhbmNlbCcpIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgeyB0eXBlOiAnZGFuZ2VyJywgbGFiZWw6IF8oJ2NvbW1vbi5kZWxldGUnKSwgcmV0dXJuVmFsdWU6IHRydWUgfSxcclxuICAgICAgICAgICAgICAgIF0sXHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIC5waXBlKFxyXG4gICAgICAgICAgICAgICAgc3dpdGNoTWFwKHJlc3BvbnNlID0+XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UgPyB0aGlzLnByb2R1Y3REZXRhaWxTZXJ2aWNlLmRlbGV0ZVByb2R1Y3RWYXJpYW50KGlkLCB0aGlzLnByb2R1Y3QuaWQpIDogRU1QVFksXHJcbiAgICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICAgICAgc3dpdGNoTWFwKCgpID0+IHRoaXMucmVGZXRjaFByb2R1Y3QobnVsbCkpLFxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoXHJcbiAgICAgICAgICAgICAgICAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ub3RpZmljYXRpb25TZXJ2aWNlLnN1Y2Nlc3MoXygnY29tbW9uLm5vdGlmeS1kZWxldGUtc3VjY2VzcycpLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVudGl0eTogJ1Byb2R1Y3RWYXJpYW50JyxcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmluaXRPcHRpb25zQW5kVmFyaWFudHMoKTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm90aWZpY2F0aW9uU2VydmljZS5lcnJvcihfKCdjb21tb24ubm90aWZ5LWRlbGV0ZS1lcnJvcicpLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVudGl0eTogJ1Byb2R1Y3RWYXJpYW50JyxcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgc2F2ZSgpIHtcclxuICAgICAgICB0aGlzLm9wdGlvbkdyb3VwcyA9IHRoaXMub3B0aW9uR3JvdXBzLmZpbHRlcihnID0+IGcudmFsdWVzLmxlbmd0aCk7XHJcbiAgICAgICAgY29uc3QgbmV3T3B0aW9uR3JvdXBzID0gdGhpcy5vcHRpb25Hcm91cHNcclxuICAgICAgICAgICAgLmZpbHRlcihvZyA9PiBvZy5pc05ldylcclxuICAgICAgICAgICAgLm1hcChvZyA9PiAoe1xyXG4gICAgICAgICAgICAgICAgbmFtZTogb2cubmFtZSxcclxuICAgICAgICAgICAgICAgIHZhbHVlczogW10sXHJcbiAgICAgICAgICAgIH0pKTtcclxuXHJcbiAgICAgICAgdGhpcy5jaGVja1VuaXF1ZVNrdXMoKVxyXG4gICAgICAgICAgICAucGlwZShcclxuICAgICAgICAgICAgICAgIG1lcmdlTWFwKCgpID0+IHRoaXMuY29uZmlybURlbGV0aW9uT2ZPYnNvbGV0ZVZhcmlhbnRzKCkpLFxyXG4gICAgICAgICAgICAgICAgbWVyZ2VNYXAoKCkgPT5cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2R1Y3REZXRhaWxTZXJ2aWNlLmNyZWF0ZVByb2R1Y3RPcHRpb25Hcm91cHMobmV3T3B0aW9uR3JvdXBzLCB0aGlzLmxhbmd1YWdlQ29kZSksXHJcbiAgICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICAgICAgbWVyZ2VNYXAoY3JlYXRlZE9wdGlvbkdyb3VwcyA9PiB0aGlzLmFkZE9wdGlvbkdyb3Vwc1RvUHJvZHVjdChjcmVhdGVkT3B0aW9uR3JvdXBzKSksXHJcbiAgICAgICAgICAgICAgICBtZXJnZU1hcChjcmVhdGVkT3B0aW9uR3JvdXBzID0+IHRoaXMuYWRkTmV3T3B0aW9uc1RvR3JvdXBzKGNyZWF0ZWRPcHRpb25Hcm91cHMpKSxcclxuICAgICAgICAgICAgICAgIG1lcmdlTWFwKGdyb3Vwc0lkcyA9PiB0aGlzLmZldGNoT3B0aW9uR3JvdXBzKGdyb3Vwc0lkcykpLFxyXG4gICAgICAgICAgICAgICAgbWVyZ2VNYXAoZ3JvdXBzID0+IHRoaXMuY3JlYXRlTmV3UHJvZHVjdFZhcmlhbnRzKGdyb3VwcykpLFxyXG4gICAgICAgICAgICAgICAgbWVyZ2VNYXAocmVzID0+IHRoaXMuZGVsZXRlT2Jzb2xldGVWYXJpYW50cyhyZXMuY3JlYXRlUHJvZHVjdFZhcmlhbnRzKSksXHJcbiAgICAgICAgICAgICAgICBtZXJnZU1hcCh2YXJpYW50cyA9PiB0aGlzLnJlRmV0Y2hQcm9kdWN0KHZhcmlhbnRzKSksXHJcbiAgICAgICAgICAgIClcclxuICAgICAgICAgICAgLnN1YnNjcmliZSh7XHJcbiAgICAgICAgICAgICAgICBuZXh0OiB2YXJpYW50cyA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5mb3JtVmFsdWVDaGFuZ2VkID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ub3RpZmljYXRpb25TZXJ2aWNlLnN1Y2Nlc3MoXygnY2F0YWxvZy5jcmVhdGVkLW5ldy12YXJpYW50cy1zdWNjZXNzJyksIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6IHZhcmlhbnRzLmxlbmd0aCxcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmluaXRPcHRpb25zQW5kVmFyaWFudHMoKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnNDaGFuZ2VkID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGNoZWNrVW5pcXVlU2t1cygpIHtcclxuICAgICAgICBjb25zdCB3aXRoRHVwbGljYXRlU2t1cyA9IHRoaXMuZ2VuZXJhdGVkVmFyaWFudHMuZmlsdGVyKCh2YXJpYW50LCBpbmRleCkgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gKFxyXG4gICAgICAgICAgICAgICAgdmFyaWFudC5lbmFibGVkICYmXHJcbiAgICAgICAgICAgICAgICB0aGlzLmdlbmVyYXRlZFZhcmlhbnRzLmZpbmQoZ3YgPT4gZ3Yuc2t1LnRyaW0oKSA9PT0gdmFyaWFudC5za3UudHJpbSgpICYmIGd2ICE9PSB2YXJpYW50KVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGlmICh3aXRoRHVwbGljYXRlU2t1cy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMubW9kYWxTZXJ2aWNlXHJcbiAgICAgICAgICAgICAgICAuZGlhbG9nKHtcclxuICAgICAgICAgICAgICAgICAgICB0aXRsZTogXygnY2F0YWxvZy5kdXBsaWNhdGUtc2t1LXdhcm5pbmcnKSxcclxuICAgICAgICAgICAgICAgICAgICBib2R5OiB1bmlxdWUod2l0aER1cGxpY2F0ZVNrdXMubWFwKHYgPT4gYCR7di5za3V9YCkpLmpvaW4oJywgJyksXHJcbiAgICAgICAgICAgICAgICAgICAgYnV0dG9uczogW3sgbGFiZWw6IF8oJ2NvbW1vbi5jbG9zZScpLCByZXR1cm5WYWx1ZTogZmFsc2UsIHR5cGU6ICdwcmltYXJ5JyB9XSxcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAucGlwZShtZXJnZU1hcChyZXMgPT4gRU1QVFkpKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gb2YodHJ1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgY29uZmlybURlbGV0aW9uT2ZPYnNvbGV0ZVZhcmlhbnRzKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xyXG4gICAgICAgIGNvbnN0IG9ic29sZXRlVmFyaWFudHMgPSB0aGlzLmdldE9ic29sZXRlVmFyaWFudHMoKTtcclxuICAgICAgICBpZiAob2Jzb2xldGVWYXJpYW50cy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMubW9kYWxTZXJ2aWNlXHJcbiAgICAgICAgICAgICAgICAuZnJvbUNvbXBvbmVudChDb25maXJtVmFyaWFudERlbGV0aW9uRGlhbG9nQ29tcG9uZW50LCB7XHJcbiAgICAgICAgICAgICAgICAgICAgbG9jYWxzOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhbnRzOiBvYnNvbGV0ZVZhcmlhbnRzLFxyXG4gICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgLnBpcGUoXHJcbiAgICAgICAgICAgICAgICAgICAgbWVyZ2VNYXAocmVzID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlcyA9PT0gdHJ1ZSA/IG9mKHRydWUpIDogRU1QVFk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSksXHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBvZih0cnVlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBnZXRPYnNvbGV0ZVZhcmlhbnRzKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnByb2R1Y3QudmFyaWFudHMuZmlsdGVyKFxyXG4gICAgICAgICAgICB2YXJpYW50ID0+ICF0aGlzLmdlbmVyYXRlZFZhcmlhbnRzLmZpbmQoZ3YgPT4gZ3YucHJvZHVjdFZhcmlhbnRJZCA9PT0gdmFyaWFudC5pZCksXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGhhc09ubHlEZWZhdWx0VmFyaWFudChwcm9kdWN0OiBHZXRQcm9kdWN0VmFyaWFudE9wdGlvbnMuUHJvZHVjdCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiBwcm9kdWN0LnZhcmlhbnRzLmxlbmd0aCA9PT0gMSAmJiBwcm9kdWN0Lm9wdGlvbkdyb3Vwcy5sZW5ndGggPT09IDA7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBhZGRPcHRpb25Hcm91cHNUb1Byb2R1Y3QoXHJcbiAgICAgICAgY3JlYXRlZE9wdGlvbkdyb3VwczogQ3JlYXRlUHJvZHVjdE9wdGlvbkdyb3VwLkNyZWF0ZVByb2R1Y3RPcHRpb25Hcm91cFtdLFxyXG4gICAgKTogT2JzZXJ2YWJsZTxDcmVhdGVQcm9kdWN0T3B0aW9uR3JvdXAuQ3JlYXRlUHJvZHVjdE9wdGlvbkdyb3VwW10+IHtcclxuICAgICAgICBpZiAoY3JlYXRlZE9wdGlvbkdyb3Vwcy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZvcmtKb2luKFxyXG4gICAgICAgICAgICAgICAgY3JlYXRlZE9wdGlvbkdyb3Vwcy5tYXAob3B0aW9uR3JvdXAgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmRhdGFTZXJ2aWNlLnByb2R1Y3QuYWRkT3B0aW9uR3JvdXBUb1Byb2R1Y3Qoe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9kdWN0SWQ6IHRoaXMucHJvZHVjdC5pZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uR3JvdXBJZDogb3B0aW9uR3JvdXAuaWQsXHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9KSxcclxuICAgICAgICAgICAgKS5waXBlKG1hcCgoKSA9PiBjcmVhdGVkT3B0aW9uR3JvdXBzKSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIG9mKFtdKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBhZGROZXdPcHRpb25zVG9Hcm91cHMoXHJcbiAgICAgICAgY3JlYXRlZE9wdGlvbkdyb3VwczogQ3JlYXRlUHJvZHVjdE9wdGlvbkdyb3VwLkNyZWF0ZVByb2R1Y3RPcHRpb25Hcm91cFtdLFxyXG4gICAgKTogT2JzZXJ2YWJsZTxzdHJpbmdbXT4ge1xyXG4gICAgICAgIGNvbnN0IG5ld09wdGlvbnM6IENyZWF0ZVByb2R1Y3RPcHRpb25JbnB1dFtdID0gdGhpcy5vcHRpb25Hcm91cHNcclxuICAgICAgICAgICAgLm1hcChvZyA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjcmVhdGVkR3JvdXAgPSBjcmVhdGVkT3B0aW9uR3JvdXBzLmZpbmQoY29nID0+IGNvZy5uYW1lID09PSBvZy5uYW1lKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHByb2R1Y3RPcHRpb25Hcm91cElkID0gY3JlYXRlZEdyb3VwID8gY3JlYXRlZEdyb3VwLmlkIDogb2cuaWQ7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXByb2R1Y3RPcHRpb25Hcm91cElkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb3VsZCBub3QgZ2V0IGEgcHJvZHVjdE9wdGlvbkdyb3VwSWQnKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJldHVybiBvZy52YWx1ZXNcclxuICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKHYgPT4gIXYubG9ja2VkKVxyXG4gICAgICAgICAgICAgICAgICAgIC5tYXAodiA9PiAoe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9kdWN0T3B0aW9uR3JvdXBJZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogbm9ybWFsaXplU3RyaW5nKHYubmFtZSwgJy0nKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNsYXRpb25zOiBbeyBuYW1lOiB2Lm5hbWUsIGxhbmd1YWdlQ29kZTogdGhpcy5sYW5ndWFnZUNvZGUgfV0sXHJcbiAgICAgICAgICAgICAgICAgICAgfSkpO1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAucmVkdWNlKChmbGF0LCBvcHRpb25zKSA9PiBbLi4uZmxhdCwgLi4ub3B0aW9uc10sIFtdKTtcclxuXHJcbiAgICAgICAgY29uc3QgYWxsR3JvdXBJZHMgPSBbXHJcbiAgICAgICAgICAgIC4uLmNyZWF0ZWRPcHRpb25Hcm91cHMubWFwKGcgPT4gZy5pZCksXHJcbiAgICAgICAgICAgIC4uLnRoaXMub3B0aW9uR3JvdXBzLm1hcChnID0+IGcuaWQpLmZpbHRlcihub3ROdWxsT3JVbmRlZmluZWQpLFxyXG4gICAgICAgIF07XHJcblxyXG4gICAgICAgIGlmIChuZXdPcHRpb25zLmxlbmd0aCkge1xyXG4gICAgICAgICAgICByZXR1cm4gZm9ya0pvaW4obmV3T3B0aW9ucy5tYXAoaW5wdXQgPT4gdGhpcy5kYXRhU2VydmljZS5wcm9kdWN0LmFkZE9wdGlvblRvR3JvdXAoaW5wdXQpKSkucGlwZShcclxuICAgICAgICAgICAgICAgIG1hcCgoKSA9PiBhbGxHcm91cElkcyksXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIG9mKGFsbEdyb3VwSWRzKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBmZXRjaE9wdGlvbkdyb3Vwcyhncm91cHNJZHM6IHN0cmluZ1tdKTogT2JzZXJ2YWJsZTxQcm9kdWN0T3B0aW9uR3JvdXBXaXRoT3B0aW9uc0ZyYWdtZW50W10+IHtcclxuICAgICAgICByZXR1cm4gZm9ya0pvaW4oXHJcbiAgICAgICAgICAgIGdyb3Vwc0lkcy5tYXAoaWQgPT5cclxuICAgICAgICAgICAgICAgIHRoaXMuZGF0YVNlcnZpY2UucHJvZHVjdFxyXG4gICAgICAgICAgICAgICAgICAgIC5nZXRQcm9kdWN0T3B0aW9uR3JvdXAoaWQpXHJcbiAgICAgICAgICAgICAgICAgICAgLm1hcFNpbmdsZShkYXRhID0+IGRhdGEucHJvZHVjdE9wdGlvbkdyb3VwKVxyXG4gICAgICAgICAgICAgICAgICAgIC5waXBlKGZpbHRlcihub3ROdWxsT3JVbmRlZmluZWQpKSxcclxuICAgICAgICAgICAgKSxcclxuICAgICAgICApLnBpcGUoZGVmYXVsdElmRW1wdHkoW10gYXMgUHJvZHVjdE9wdGlvbkdyb3VwV2l0aE9wdGlvbnNGcmFnbWVudFtdKSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBjcmVhdGVOZXdQcm9kdWN0VmFyaWFudHMoZ3JvdXBzOiBQcm9kdWN0T3B0aW9uR3JvdXBXaXRoT3B0aW9uc0ZyYWdtZW50W10pIHtcclxuICAgICAgICBjb25zdCBvcHRpb25zID0gZ3JvdXBzXHJcbiAgICAgICAgICAgIC5maWx0ZXIobm90TnVsbE9yVW5kZWZpbmVkKVxyXG4gICAgICAgICAgICAubWFwKG9nID0+IG9nLm9wdGlvbnMpXHJcbiAgICAgICAgICAgIC5yZWR1Y2UoKGZsYXQsIG8pID0+IFsuLi5mbGF0LCAuLi5vXSwgW10pO1xyXG4gICAgICAgIGNvbnN0IHZhcmlhbnRzID0gdGhpcy5nZW5lcmF0ZWRWYXJpYW50c1xyXG4gICAgICAgICAgICAuZmlsdGVyKHYgPT4gdi5lbmFibGVkICYmICF2LmV4aXN0aW5nKVxyXG4gICAgICAgICAgICAubWFwKHYgPT4gKHtcclxuICAgICAgICAgICAgICAgIHByaWNlOiB2LnByaWNlLFxyXG4gICAgICAgICAgICAgICAgc2t1OiB2LnNrdSxcclxuICAgICAgICAgICAgICAgIHN0b2NrOiB2LnN0b2NrLFxyXG4gICAgICAgICAgICAgICAgb3B0aW9uSWRzOiB2Lm9wdGlvbnNcclxuICAgICAgICAgICAgICAgICAgICAubWFwKG5hbWUgPT4gb3B0aW9ucy5maW5kKG8gPT4gby5uYW1lID09PSBuYW1lLm5hbWUpKVxyXG4gICAgICAgICAgICAgICAgICAgIC5maWx0ZXIobm90TnVsbE9yVW5kZWZpbmVkKVxyXG4gICAgICAgICAgICAgICAgICAgIC5tYXAobyA9PiBvLmlkKSxcclxuICAgICAgICAgICAgfSkpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLnByb2R1Y3REZXRhaWxTZXJ2aWNlLmNyZWF0ZVByb2R1Y3RWYXJpYW50cyhcclxuICAgICAgICAgICAgdGhpcy5wcm9kdWN0LFxyXG4gICAgICAgICAgICB2YXJpYW50cyxcclxuICAgICAgICAgICAgb3B0aW9ucyxcclxuICAgICAgICAgICAgdGhpcy5sYW5ndWFnZUNvZGUsXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGRlbGV0ZU9ic29sZXRlVmFyaWFudHM8VD4oaW5wdXQ6IFQpOiBPYnNlcnZhYmxlPFQ+IHtcclxuICAgICAgICBjb25zdCBvYnNvbGV0ZVZhcmlhbnRzID0gdGhpcy5nZXRPYnNvbGV0ZVZhcmlhbnRzKCk7XHJcbiAgICAgICAgaWYgKG9ic29sZXRlVmFyaWFudHMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGRlbGV0ZU9wZXJhdGlvbnMgPSBvYnNvbGV0ZVZhcmlhbnRzLm1hcCh2ID0+XHJcbiAgICAgICAgICAgICAgICB0aGlzLmRhdGFTZXJ2aWNlLnByb2R1Y3QuZGVsZXRlUHJvZHVjdFZhcmlhbnQodi5pZCkucGlwZShtYXAoKCkgPT4gaW5wdXQpKSxcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgcmV0dXJuIGZvcmtKb2luKC4uLmRlbGV0ZU9wZXJhdGlvbnMpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBvZihpbnB1dCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgcmVGZXRjaFByb2R1Y3Q8VD4oaW5wdXQ6IFQpOiBPYnNlcnZhYmxlPFQ+IHtcclxuICAgICAgICAvLyBSZS1mZXRjaCB0aGUgUHJvZHVjdCB0byBmb3JjZSBhbiB1cGRhdGUgdG8gdGhlIHZpZXcuXHJcbiAgICAgICAgY29uc3QgaWQgPSB0aGlzLnJvdXRlLnNuYXBzaG90LnBhcmFtTWFwLmdldCgnaWQnKTtcclxuICAgICAgICBpZiAoaWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGF0YVNlcnZpY2UucHJvZHVjdC5nZXRQcm9kdWN0KGlkKS5zaW5nbGUkLnBpcGUobWFwKCgpID0+IGlucHV0KSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIG9mKGlucHV0KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaW5pdE9wdGlvbnNBbmRWYXJpYW50cygpIHtcclxuICAgICAgICB0aGlzLmRhdGFTZXJ2aWNlLnByb2R1Y3RcclxuICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLW5vbi1udWxsLWFzc2VydGlvblxyXG4gICAgICAgICAgICAuZ2V0UHJvZHVjdFZhcmlhbnRzT3B0aW9ucyh0aGlzLnJvdXRlLnNuYXBzaG90LnBhcmFtTWFwLmdldCgnaWQnKSEpXHJcbiAgICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1ub24tbnVsbC1hc3NlcnRpb25cclxuICAgICAgICAgICAgLm1hcFNpbmdsZSgoeyBwcm9kdWN0IH0pID0+IHByb2R1Y3QhKVxyXG4gICAgICAgICAgICAuc3Vic2NyaWJlKHAgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5wcm9kdWN0ID0gcDtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGFsbFVzZWRPcHRpb25JZHMgPSBwLnZhcmlhbnRzLm1hcCh2ID0+IHYub3B0aW9ucy5tYXAob3B0aW9uID0+IG9wdGlvbi5pZCkpLmZsYXQoKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGFsbFVzZWRPcHRpb25Hcm91cElkcyA9IHAudmFyaWFudHNcclxuICAgICAgICAgICAgICAgICAgICAubWFwKHYgPT4gdi5vcHRpb25zLm1hcChvcHRpb24gPT4gb3B0aW9uLmdyb3VwSWQpKVxyXG4gICAgICAgICAgICAgICAgICAgIC5mbGF0KCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbkdyb3VwcyA9IHAub3B0aW9uR3JvdXBzLm1hcChvZyA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IG9nLmlkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpc05ldzogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IG9nLm5hbWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvY2tlZDogYWxsVXNlZE9wdGlvbkdyb3VwSWRzLmluY2x1ZGVzKG9nLmlkKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzOiBvZy5vcHRpb25zLm1hcChvID0+ICh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogby5pZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IG8ubmFtZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2tlZDogYWxsVXNlZE9wdGlvbklkcy5pbmNsdWRlcyhvLmlkKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSkpLFxyXG4gICAgICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGVWYXJpYW50cygpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIG9wdGlvbnNBcmVFcXVhbChhOiBBcnJheTx7IG5hbWU6IHN0cmluZyB9PiwgYjogQXJyYXk8eyBuYW1lOiBzdHJpbmcgfT4pOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gdGhpcy50b09wdGlvblN0cmluZyhhKSA9PT0gdGhpcy50b09wdGlvblN0cmluZyhiKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIG9wdGlvbnNBcmVTdWJzZXQoYTogQXJyYXk8eyBuYW1lOiBzdHJpbmcgfT4sIGI6IEFycmF5PHsgbmFtZTogc3RyaW5nIH0+KTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMudG9PcHRpb25TdHJpbmcoYikuaW5jbHVkZXModGhpcy50b09wdGlvblN0cmluZyhhKSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSB0b09wdGlvblN0cmluZyhvOiBBcnJheTx7IG5hbWU6IHN0cmluZyB9Pik6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuIG9cclxuICAgICAgICAgICAgLm1hcCh4ID0+IHgubmFtZSlcclxuICAgICAgICAgICAgLnNvcnQoKVxyXG4gICAgICAgICAgICAuam9pbignfCcpO1xyXG4gICAgfVxyXG59XHJcbiJdfQ==