mmhglobal-dynamicform 2.0.0-beta.75 → 2.0.0-beta.77

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.
package/README.md CHANGED
@@ -3,6 +3,16 @@
3
3
  This library was generated with [Angular CLI](https://github.com/angular/angular-cli) version 11.2.13.
4
4
 
5
5
  ## Changelog
6
+ `2.77beta`<br/>
7
+ [debugger] - handle extra watch list item.<br/>
8
+ [zudf] - add zudf zmodel to the console watch list dropdown.<br/>
9
+ [zudf] - added clearZModel function and also trigger clearZModel when render field element.<br/>
10
+ [zudf] - reset validator for component after added data to grid for multivaluegroup.<br/>
11
+ [inputfieldbase] - zudf field handle nested cascading dropdown and also auto select for required field.
12
+
13
+ `2.76beta`<br/>
14
+ [zudf] - remove underscore for zudf scope prefix.
15
+
6
16
  `2.75beta`<br/>
7
17
  [zudf] - minor enhancement and fixes.
8
18
 
@@ -72,50 +72,14 @@ export class InputFieldBase extends FieldBase {
72
72
  }
73
73
  handleZudfChange(event, fieldValue) {
74
74
  const zudfFieldValue = this.getFieldValue(event, fieldValue);
75
- const getZudfScope = ZComponentHelper.getZudfScope(this.group, this.data.Value);
76
- if (!getZudfScope) {
75
+ const zudfScope = ZComponentHelper.getZudfScope(this.group, this.data.Value);
76
+ if (!zudfScope) {
77
77
  console.log('zudf scope is null for field onchange.');
78
78
  }
79
- getZudfScope.zModel[this.data.Value] = zudfFieldValue;
79
+ zudfScope.zModel[this.data.Value] = zudfFieldValue;
80
80
  of({}).pipe(tap(res => {
81
- if (getZudfScope.linkedComponent) {
82
- const linkedComponentScope = getZudfScope.linkedComponent;
83
- // #1 check is the onchange component linked to other component.
84
- // #2 if linked to other component(lets call it child component),
85
- // base on the linkedComponentScope value, find the child component.
86
- // #3 keep the original SelectOptions in the component.
87
- // #4 clear the child zmodel and filter the child component options.
88
- linkedComponentScope.forEach(item => {
89
- const dataValueSegments = this.data.Value.split('_');
90
- const linkedComponentSegments = item.linkedComponent.split('_');
91
- let isLinkedComponent = false;
92
- // check is it linkedcomponent
93
- if (linkedComponentSegments.length > 1 && dataValueSegments.length > 3) {
94
- const lastTwoSegments = dataValueSegments.slice(-2).join('_');
95
- if (linkedComponentSegments.join('_') === lastTwoSegments) {
96
- isLinkedComponent = true;
97
- }
98
- }
99
- else if (linkedComponentSegments.length === 1) {
100
- const lastSegment = dataValueSegments[dataValueSegments.length - 1];
101
- if (linkedComponentSegments[0] === lastSegment) {
102
- isLinkedComponent = true;
103
- }
104
- }
105
- if (isLinkedComponent) {
106
- const childComponent = ZComponentHelper.getComponentByValue(this.group, item.value);
107
- const originalSelectOptions = childComponent.data['originalSelectOptions'] ?? Object.assign([], childComponent.data.SelectOptions);
108
- const filteredSelectionOptions = originalSelectOptions.filter(option => option.parentExpression == fieldValue);
109
- //childComponent.clearData(); //unable to use clearData. not handled for zudf type
110
- // manuall patch the component formcontrol value
111
- getZudfScope.zModel[item.value] = null;
112
- const zudfForm = getZudfScope.form;
113
- const componentFormControl = zudfForm.controls[item.value];
114
- componentFormControl.patchValue(getZudfScope.zModel[item.value]);
115
- childComponent.data['originalSelectOptions'] = originalSelectOptions;
116
- childComponent.setSelectOption(filteredSelectionOptions);
117
- }
118
- });
81
+ if (zudfScope.linkedComponent) {
82
+ this.cascadingHandling(zudfScope, this.data.Value, fieldValue);
119
83
  }
120
84
  }), tap(res => {
121
85
  if (this.data['AutoPopulateChildFieldValue']) {
@@ -136,12 +100,12 @@ export class InputFieldBase extends FieldBase {
136
100
  }
137
101
  }
138
102
  // set to all related zMode of the dropdown
139
- let fg = getZudfScope.form;
103
+ let fg = zudfScope.form;
140
104
  childFields.forEach(childField => {
141
105
  // remove symbol.
142
106
  let childFieldName = encodeURI(childField.replace(/[^a-z0-9]/gi, ""));
143
107
  const fieldModelName = this.data.Name + childFieldName;
144
- const zModels = getZudfScope.zModel;
108
+ const zModels = zudfScope.zModel;
145
109
  const childComponent = ZComponentHelper.getComponent(this.group, 'text_' + fieldModelName);
146
110
  if (childComponent['data']['ReadOnly'] && !fieldValue) {
147
111
  // clear child field if only readonly is true.
@@ -168,6 +132,56 @@ export class InputFieldBase extends FieldBase {
168
132
  this.triggerEvent("inputfield-onChange", this.data.OnChange, event, fieldValue);
169
133
  });
170
134
  }
135
+ cascadingHandling(zudfScope, fieldName, fieldValue) {
136
+ const linkedComponentScope = zudfScope.linkedComponent;
137
+ // #1 check is the onchange component linked to other component.
138
+ // #2 if linked to other component(lets call it child component),
139
+ // base on the linkedComponentScope value, find the child component.
140
+ // #3 keep the original SelectOptions in the component.
141
+ // #4 clear the child zmodel and filter the child component options.
142
+ // #5 auto select default zmodel if only have 1 option and is required.
143
+ // #6 handle child nested linked component.
144
+ linkedComponentScope.forEach(item => {
145
+ const dataValueSegments = fieldName.split('_');
146
+ const linkedComponentSegments = item.linkedComponent.split('_');
147
+ let isLinkedComponent = false;
148
+ // check is it linkedcomponent
149
+ if (linkedComponentSegments.length > 1 && dataValueSegments.length > 3) {
150
+ const lastTwoSegments = dataValueSegments.slice(-2).join('_');
151
+ if (linkedComponentSegments.join('_') === lastTwoSegments) {
152
+ isLinkedComponent = true;
153
+ }
154
+ }
155
+ else if (linkedComponentSegments.length === 1) {
156
+ const lastSegment = dataValueSegments[dataValueSegments.length - 1];
157
+ if (linkedComponentSegments[0] === lastSegment) {
158
+ isLinkedComponent = true;
159
+ }
160
+ }
161
+ if (isLinkedComponent) {
162
+ const childComponent = ZComponentHelper.getComponentByValue(this.group, item.value);
163
+ const originalSelectOptions = childComponent.data['originalSelectOptions'] ?? Object.assign([], childComponent.data.SelectOptions);
164
+ const filteredSelectionOptions = originalSelectOptions.filter(option => option.parentExpression == fieldValue);
165
+ //childComponent.clearData(); //unable to use clearData. not handled for zudf type
166
+ // manuall patch the component formcontrol value
167
+ const zudfForm = zudfScope.form;
168
+ const componentFormControl = zudfForm.controls[item.value];
169
+ zudfScope.zModel[item.value] = null;
170
+ componentFormControl.patchValue(zudfScope.zModel[item.value]);
171
+ childComponent.data['originalSelectOptions'] = originalSelectOptions;
172
+ childComponent.setSelectOption(filteredSelectionOptions);
173
+ // set dropdown selected value if only 1 option.
174
+ const childComponentType = childComponent.data.Type;
175
+ if (filteredSelectionOptions.length === 1 && childComponent.data.IsRequired && (childComponentType === 'zuiselectmultiple' || childComponentType === 'zselectmultiple')) {
176
+ zudfScope.zModel[item.value] = filteredSelectionOptions[0][childComponent.itemValueField];
177
+ componentFormControl.patchValue(zudfScope.zModel[item.value]);
178
+ }
179
+ // loop children incase of nested child.
180
+ const childComponentValueSegments = childComponent.data.Value.split('_');
181
+ this.cascadingHandling(zudfScope, childComponentValueSegments[childComponentValueSegments.length - 1], zudfScope.zModel[item.value]);
182
+ }
183
+ });
184
+ }
171
185
  }
172
186
  InputFieldBase.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: InputFieldBase, deps: [{ token: i1.ZComponentService }], target: i0.ɵɵFactoryTarget.Component });
173
187
  InputFieldBase.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.12", type: InputFieldBase, selector: "ng-component", outputs: { triggerContainerEvent: "triggerContainerEvent" }, usesInheritance: true, ngImport: i0, template: ``, isInline: true });
@@ -180,4 +194,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImpo
180
194
  type: Output,
181
195
  args: ['triggerContainerEvent']
182
196
  }] } });
183
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5wdXRmaWVsZGJhc2UuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbW1oZ2xvYmFsLWR5bmFtaWNmb3JtL3NyYy9saWIvY29tcG9uZW50cy9pbnB1dGZpZWxkYmFzZS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2hFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBeUIsTUFBTSxpQkFBaUIsQ0FBQztBQUMxRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFbEQsT0FBTyxFQUFFLEVBQUUsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLE1BQU0sTUFBTSxDQUFDOzs7QUFPMUMsMklBQTJJO0FBQzNJLE1BQU0sT0FBTyxjQUFlLFNBQVEsU0FBUztJQUUzQyxZQUFZLFdBQThCO1FBQ3hDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUZZLDBCQUFxQixHQUFzQixJQUFJLFlBQVksRUFBRSxDQUFDO0lBRy9GLENBQUM7SUFFTSxPQUFPLENBQUMsS0FBVSxFQUFFLFVBQWdCO1FBQ3pDLElBQUksQ0FBQyxZQUFZLENBQUMsb0JBQW9CLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLFVBQVUsSUFBSSxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztJQUNwRyxDQUFDO0lBRU0sVUFBVSxDQUFDLEtBQVUsRUFBRSxVQUFnQjtRQUM1QyxnQkFBZ0IsQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFLFVBQVUsQ0FBQyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN0RyxJQUFJLENBQUMsWUFBWSxDQUFDLHVCQUF1QixFQUFFLElB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a0IsQ0FBQyxjQUFjLENBQUMsQ0FBQzs2QkFDOUQ7eUJBQ0Y7d0JBQ0QsRUFBRSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQztvQkFDekIsQ0FBQyxDQUFDLENBQUM7aUJBQ0o7YUFDRjtRQUNILENBQUMsQ0FBQyxFQUNGLFNBQVMsQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUNkLE1BQU0sU0FBUyxHQUFHLG1CQUFtQixDQUFDO1lBQ3RDLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRTtnQkFDZCxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLEVBQUU7b0JBQ3pCLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxVQUFVLENBQUMsQ0FBQztpQkFDN0Q7YUFDRjtZQUNELE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ2hCLENBQUMsQ0FBQyxDQUNILENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQ2hCLElBQUksQ0FBQyxZQUFZLENBQUMscUJBQXFCLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsS0FBSyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQ2xGLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs7NEdBM0xVLGNBQWM7Z0dBQWQsY0FBYyx3SUFKZixFQUFFOzRGQUlELGNBQWM7a0JBTDFCLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLEVBQUU7aUJBQ2I7d0dBSWtDLHFCQUFxQjtzQkFBckQsTUFBTTt1QkFBQyx1QkFBdUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgT3V0cHV0IH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IHsgWkNvbXBvbmVudEhlbHBlciwgWkNvbXBvbmVudE91dHB1dEV2ZW50IH0gZnJvbSBcIm1taGdsb2JhbC16Y29yZVwiO1xyXG5pbXBvcnQgeyBGaWVsZEJhc2UgfSBmcm9tIFwiLi9maWVsZGJhc2UuY29tcG9uZW50XCI7XHJcbmltcG9ydCB7IFpDb21wb25lbnRTZXJ2aWNlIH0gZnJvbSBcIi4uL3NlcnZpY2VzL3pjb21wb25lbnQuc2VydmljZVwiO1xyXG5pbXBvcnQgeyBvZiwgc3dpdGNoTWFwLCB0YXAgfSBmcm9tIFwicnhqc1wiO1xyXG5pbXBvcnQgeyBGb3JtQ29udHJvbCwgRm9ybUdyb3VwIH0gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICB0ZW1wbGF0ZTogYGAsXHJcbn0pXHJcblxyXG4vLyBGb3I6IHpjaGVja2JveCwgemNoaXAsIHpkYXRldGltZSwgemltZywgemlucHV0LWNvbnRhaW5lciwgemxhYmVsLCB6bnVtZXJpYywgenBvc3RzZWxlY3RpbnB1dCwgenNlbGVjdG11bHRpcGxlLCB6dGV4dCwgenRleHRhcmVhLCB6dXBsb2FkXHJcbmV4cG9ydCBjbGFzcyBJbnB1dEZpZWxkQmFzZSBleHRlbmRzIEZpZWxkQmFzZSB7XHJcbiAgQE91dHB1dCgndHJpZ2dlckNvbnRhaW5lckV2ZW50JykgdHJpZ2dlckNvbnRhaW5lckV2ZW50OiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICBjb25zdHJ1Y3Rvcihjb21wU2VydmljZTogWkNvbXBvbmVudFNlcnZpY2UpIHtcclxuICAgIHN1cGVyKGNvbXBTZXJ2aWNlKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBvbkNsaWNrKGV2ZW50OiBhbnksIGZpZWxkVmFsdWU/OiBhbnkpIHtcclxuICAgIHRoaXMudHJpZ2dlckV2ZW50KFwiaW5wdXRmaWVsZC1vbkNsaWNrXCIsIHRoaXMuZGF0YS5PbkNsaWNrLCBldmVudCwgZmllbGRWYWx1ZSB8fCBldmVudFsnT25DbGljayddKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBvbkNoYW5nZUNDKGV2ZW50OiBhbnksIGZpZWxkVmFsdWU/OiBhbnkpIHtcclxuICAgIFpDb21wb25lbnRIZWxwZXIuc2V0Q29tcG9uZW50TW9kZWxWYWx1ZSh0aGlzLmRhdGEsIHRoaXMuZ2V0RmllbGRWYWx1ZShldmVudCwgZmllbGRWYWx1ZSksIHRoaXMuZ3JvdXApO1xyXG4gICAgdGhpcy50cmlnZ2VyRXZlbnQoXCJpbnB1dGZpZWxkLW9uQ2hhbmdlQ0NcIiwgdGhpcy5kYXRhLkNDT25DaGFuZ2UsIGV2ZW50LCBmaWVsZFZhbHVlKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBvbkNoYW5nZShldmVudDogYW55LCBmaWVsZFZhbHVlPzogYW55KSB7XHJcbiAgICBpZiAodGhpcy5kYXRhLlN1YlR5cGUgJiYgdGhpcy5kYXRhLlN1YlR5cGUgPT09ICd6dWRmJykge1xyXG4gICAgICB0aGlzLmhhbmRsZVp1ZGZDaGFuZ2UoZXZlbnQsIGZpZWxkVmFsdWUpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgWkNvbXBvbmVudEhlbHBlci5zZXRDb21wb25lbnRNb2RlbFZhbHVlKHRoaXMuZGF0YSwgdGhpcy5nZXRGaWVsZFZhbHVlKGV2ZW50LCBmaWVsZFZhbHVlKSwgdGhpcy5ncm91cCk7XHJcbiAgICAgIHRoaXMudHJpZ2dlckV2ZW50KFwiaW5wdXRmaWVsZC1vbkNoYW5nZVwiLCB0aGlzLmRhdGEuT25DaGFuZ2UsIGV2ZW50LCBmaWVsZFZhbHVlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBvbkl0ZW1DbGljayhldmVudDogYW55LCBmaWVsZFZhbHVlPzogYW55KSB7XHJcbiAgICB0aGlzLnRyaWdnZXJFdmVudChcImlucHV0ZmllbGQtb25JdGVtQ2xpY2tcIiwgdGhpcy5kYXRhLk9uSXRlbUNsaWNrLCBldmVudCwgZmllbGRWYWx1ZSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb25JY29uQ2xpY2soY2xpY2tBY3Rpb25FeHByOiBzdHJpbmcpIHtcclxuICAgIHRoaXMudHJpZ2dlckV2ZW50KFwiaW5wdXRmaWVsZC1vbkljb25DbGlja1wiLCBjbGlja0FjdGlvbkV4cHIsIG51bGwsIHRoaXMuZ3JvdXAuek1vZGVsW3RoaXMuZGF0YS5WYWx1ZV0pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldFJlYWRPbmx5VmFsdWUoKSB7XHJcbiAgICBjb25zdCByZWFkT25seVZhbHVlID0gWkNvbXBvbmVudEhlbHBlci5nZXRHcm91cEV2YWxWYWx1ZS5jYWxsKHRoaXMsIHRoaXMuZGF0YS5SZWFkT25seSk7XHJcbiAgICBpZiAodHlwZW9mIHJlYWRPbmx5VmFsdWUgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgY29uc3QgY2FsbEZ1bmMgPSByZWFkT25seVZhbHVlLmJpbmQodGhpcy5ncm91cC5jdHJsU2NvcGUpO1xyXG4gICAgICByZXR1cm4gY2FsbEZ1bmModGhpcy5ncm91cCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVhZE9ubHlWYWx1ZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRJc1JlcXVpcmVkVmFsdWUoKSB7XHJcbiAgICBjb25zdCBJc1JlcXVpcmVkVmFsdWUgPSBaQ29tcG9uZW50SGVscGVyLmdldEdyb3VwRXZhbFZhbHVlLmNhbGwodGhpcywgdGhpcy5kYXRhLklzUmVxdWlyZWQpO1xyXG4gICAgaWYgKHR5cGVvZiBJc1JlcXVpcmVkVmFsdWUgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgY29uc3QgY2FsbEZ1bmMgPSBJc1JlcXVpcmVkVmFsdWUuYmluZCh0aGlzLmdyb3VwLmN0cmxTY29wZSk7XHJcbiAgICAgIHJldHVybiBjYWxsRnVuYyh0aGlzLmdyb3VwKTtcclxuXHJcbiAgICB9XHJcbiAgICByZXR1cm4gSXNSZXF1aXJlZFZhbHVlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldFZhbHVlKHZhbHVlOiBzdHJpbmcpIHtcclxuICAgIFpDb21wb25lbnRIZWxwZXIuc2V0Q29tcG9uZW50TW9kZWxWYWx1ZSh0aGlzLmRhdGEsIHZhbHVlLCB0aGlzLmdyb3VwKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXRBZGRPblZhbHVlKGFkZE9ucz86IGFueSkge1xyXG4gICAgdGhpcy50cmlnZ2VyQ29udGFpbmVyRXZlbnQuZW1pdCh7IHR5cGU6ICdzZXRBZGRPblZhbHVlJywgZGF0YTogYWRkT25zIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIHRyaWdnZXJFdmVudCh0eXBlOiBzdHJpbmcsIHRhcmdldDogYW55LCBldmVudDogYW55LCBmaWVsZFZhbHVlPzogYW55KSB7XHJcbiAgICBpZiAodGFyZ2V0KSB7XHJcbiAgICAgIHRoaXMuZ3JvdXAuc3ViamVjdC5uZXh0KHtcclxuICAgICAgICB0eXBlOiB0eXBlLFxyXG4gICAgICAgIHRhcmdldDogdGFyZ2V0LFxyXG4gICAgICAgIGV2ZW50LFxyXG4gICAgICAgIGRhdGE6IHsgdmFsdWU6IHRoaXMuZ2V0RmllbGRWYWx1ZShldmVudCwgZmllbGRWYWx1ZSksIGZpZWxkOiB0aGlzLmRhdGEsIGNvbXA6IHRoaXMgfVxyXG4gICAgICB9IGFzIFpDb21wb25lbnRPdXRwdXRFdmVudCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldEZpZWxkVmFsdWUoZXZlbnQ6IGFueSwgZmllbGRWYWx1ZT86IGFueSkge1xyXG4gICAgaWYgKGZpZWxkVmFsdWUgPT0gbnVsbCB8fCBmaWVsZFZhbHVlID09IHVuZGVmaW5lZCkge1xyXG4gICAgICByZXR1cm4gZXZlbnQ/LnZhbHVlIHx8IGV2ZW50Py50YXJnZXQ/LnZhbHVlXHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmllbGRWYWx1ZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaGFuZGxlWnVkZkNoYW5nZShldmVudDogYW55LCBmaWVsZFZhbHVlPzogYW55KSB7XHJcbiAgICBjb25zdCB6dWRmRmllbGRWYWx1ZSA9IHRoaXMuZ2V0RmllbGRWYWx1ZShldmVudCwgZmllbGRWYWx1ZSk7XHJcbiAgICBjb25zdCBnZXRadWRmU2NvcGUgPSBaQ29tcG9uZW50SGVscGVyLmdldFp1ZGZTY29wZSh0aGlzLmdyb3VwLCB0aGlzLmRhdGEuVmFsdWUpO1xyXG5cclxuICAgIGlmICghZ2V0WnVkZlNjb3BlKSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKCd6dWRmIHNjb3BlIGlzIG51bGwgZm9yIGZpZWxkIG9uY2hhbmdlLicpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldFp1ZGZTY29wZS56TW9kZWxbdGhpcy5kYXRhLlZhbHVlXSA9IHp1ZGZGaWVsZFZhbHVlO1xyXG4gICAgb2Yoe30pLnBpcGUoXHJcbiAgICAgIHRhcChyZXMgPT4ge1xyXG4gICAgICAgIGlmIChnZXRadWRmU2NvcGUubGlua2VkQ29tcG9uZW50KSB7XHJcbiAgICAgICAgICBjb25zdCBsaW5rZWRDb21wb25lbnRTY29wZSA9IGdldFp1ZGZTY29wZS5saW5rZWRDb21wb25lbnQ7XHJcbiAgICAgICAgICAvLyAjMSBjaGVjayBpcyB0aGUgb25jaGFuZ2UgY29tcG9uZW50IGxpbmtlZCB0byBvdGhlciBjb21wb25lbnQuXHJcbiAgICAgICAgICAvLyAjMiBpZiBsaW5rZWQgdG8gb3RoZXIgY29tcG9uZW50KGxldHMgY2FsbCBpdCBjaGlsZCBjb21wb25lbnQpLFxyXG4gICAgICAgICAgLy8gICAgYmFzZSBvbiB0aGUgbGlua2VkQ29tcG9uZW50U2NvcGUgdmFsdWUsIGZpbmQgdGhlIGNoaWxkIGNvbXBvbmVudC5cclxuICAgICAgICAgIC8vICMzIGtlZXAgdGhlIG9yaWdpbmFsIFNlbGVjdE9wdGlvbnMgaW4gdGhlIGNvbXBvbmVudC5cclxuICAgICAgICAgIC8vICM0IGNsZWFyIHRoZSBjaGlsZCB6bW9kZWwgYW5kIGZpbHRlciB0aGUgY2hpbGQgY29tcG9uZW50IG9wdGlvbnMuXHJcbiAgICAgICAgICBsaW5rZWRDb21wb25lbnRTY29wZS5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBkYXRhVmFsdWVTZWdtZW50cyA9IHRoaXMuZGF0YS5WYWx1ZS5zcGxpdCgnXycpO1xyXG4gICAgICAgICAgICBjb25zdCBsaW5rZWRDb21wb25lbnRTZWdtZW50cyA9IGl0ZW0ubGlua2VkQ29tcG9uZW50LnNwbGl0KCdfJyk7XHJcbiAgICAgICAgICAgIGxldCBpc0xpbmtlZENvbXBvbmVudCA9IGZhbHNlO1xyXG5cclxuICAgICAgICAgICAgLy8gY2hlY2sgaXMgaXQgbGlua2VkY29tcG9uZW50XHJcbiAgICAgICAgICAgIGlmIChsaW5rZWRDb21wb25lbnRTZWdtZW50cy5sZW5ndGggPiAxICYmIGRhdGFWYWx1ZVNlZ21lbnRzLmxlbmd0aCA+IDMpIHtcclxuICAgICAgICAgICAgICBjb25zdCBsYXN0VHdvU2VnbWVudHMgPSBkYXRhVmFsdWVTZWdtZW50cy5zbGljZSgtMikuam9pbignXycpO1xyXG4gICAgICAgICAgICAgIGlmIChsaW5rZWRDb21wb25lbnRTZWdtZW50cy5qb2luKCdfJykgPT09IGxhc3RUd29TZWdtZW50cykge1xyXG4gICAgICAgICAgICAgICAgaXNMaW5rZWRDb21wb25lbnQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmIChsaW5rZWRDb21wb25lbnRTZWdtZW50cy5sZW5ndGggPT09IDEpIHtcclxuICAgICAgICAgICAgICBjb25zdCBsYXN0U2VnbWVudCA9IGRhdGFWYWx1ZVNlZ21lbnRzW2RhdGFWYWx1ZVNlZ21lbnRzLmxlbmd0aCAtIDFdO1xyXG4gICAgICAgICAgICAgIGlmIChsaW5rZWRDb21wb25lbnRTZWdtZW50c1swXSA9PT0gbGFzdFNlZ21lbnQpIHtcclxuICAgICAgICAgICAgICAgIGlzTGlua2VkQ29tcG9uZW50ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChpc0xpbmtlZENvbXBvbmVudCkge1xyXG4gICAgICAgICAgICAgIGNvbnN0IGNoaWxkQ29tcG9uZW50ID0gWkNvbXBvbmVudEhlbHBlci5nZXRDb21wb25lbnRCeVZhbHVlKHRoaXMuZ3JvdXAsIGl0ZW0udmFsdWUpO1xyXG4gICAgICAgICAgICAgIGNvbnN0IG9yaWdpbmFsU2VsZWN0T3B0aW9ucyA9IGNoaWxkQ29tcG9uZW50LmRhdGFbJ29yaWdpbmFsU2VsZWN0T3B0aW9ucyddID8/IE9iamVjdC5hc3NpZ24oW10sIGNoaWxkQ29tcG9uZW50LmRhdGEuU2VsZWN0T3B0aW9ucyk7XHJcbiAgICAgICAgICAgICAgY29uc3QgZmlsdGVyZWRTZWxlY3Rpb25PcHRpb25zID0gb3JpZ2luYWxTZWxlY3RPcHRpb25zLmZpbHRlcihvcHRpb24gPT4gb3B0aW9uLnBhcmVudEV4cHJlc3Npb24gPT0gZmllbGRWYWx1ZSk7XHJcblxyXG4gICAgICAgICAgICAgIC8vY2hpbGRDb21wb25lbnQuY2xlYXJEYXRhKCk7IC8vdW5hYmxlIHRvIHVzZSBjbGVhckRhdGEuIG5vdCBoYW5kbGVkIGZvciB6dWRmIHR5cGVcclxuICAgICAgICAgICAgICAvLyBtYW51YWxsIHBhdGNoIHRoZSBjb21wb25lbnQgZm9ybWNvbnRyb2wgdmFsdWVcclxuICAgICAgICAgICAgICBnZXRadWRmU2NvcGUuek1vZGVsW2l0ZW0udmFsdWVdID0gbnVsbDtcclxuICAgICAgICAgICAgICBjb25zdCB6dWRmRm9ybSA9IGdldFp1ZGZTY29wZS5mb3JtIGFzIEZvcm1Hcm91cDtcclxuICAgICAgICAgICAgICBjb25zdCBjb21wb25lbnRGb3JtQ29udHJvbCA9IHp1ZGZGb3JtLmNvbnRyb2xzW2l0ZW0udmFsdWVdIGFzIEZvcm1Db250cm9sO1xyXG4gICAgICAgICAgICAgIGNvbXBvbmVudEZvcm1Db250cm9sLnBhdGNoVmFsdWUoZ2V0WnVkZlNjb3BlLnpNb2RlbFtpdGVtLnZhbHVlXSk7XHJcblxyXG4gICAgICAgICAgICAgIGNoaWxkQ29tcG9uZW50LmRhdGFbJ29yaWdpbmFsU2VsZWN0T3B0aW9ucyddID0gb3JpZ2luYWxTZWxlY3RPcHRpb25zO1xyXG4gICAgICAgICAgICAgIGNoaWxkQ29tcG9uZW50LnNldFNlbGVjdE9wdGlvbihmaWx0ZXJlZFNlbGVjdGlvbk9wdGlvbnMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgIH1cclxuICAgICAgfSksXHJcbiAgICAgIHRhcChyZXMgPT4ge1xyXG4gICAgICAgIGlmICh0aGlzLmRhdGFbJ0F1dG9Qb3B1bGF0ZUNoaWxkRmllbGRWYWx1ZSddKSB7XHJcbiAgICAgICAgICAvLyBaVURGLiBBdXRvIFBvcHVsYXRlIGNoaWxkIGZpZWxkIHZhbHVlXHJcbiAgICAgICAgICBjb25zdCBjaGlsZEZpZWxkcyA9IHRoaXMuZGF0YVsnQ2hpbGRGaWVsZHMnXTtcclxuICAgICAgICAgIGlmIChjaGlsZEZpZWxkcykge1xyXG4gICAgICAgICAgICBsZXQgc2VsZWN0ZWREYXRhT3B0aW9uID0gbnVsbDtcclxuICAgICAgICAgICAgaWYgKGZpZWxkVmFsdWUpIHtcclxuICAgICAgICAgICAgICAvLyBnZXQgdGhlIHNlbGVjdGVkIGRhdGEgZnVsbCBpbmZvIFxyXG4gICAgICAgICAgICAgIGNvbnN0IGRhdGFPcHRpb24gPSB0aGlzLmdyb3VwLnpEYXRhW3RoaXMuZGF0YVsnWkRhdGFPcHRpb25OYW1lJ11dO1xyXG5cclxuICAgICAgICAgICAgICBpZiAoZGF0YU9wdGlvbikge1xyXG4gICAgICAgICAgICAgICAgZGF0YU9wdGlvbi5mb3JFYWNoKG9wdGlvbiA9PiB7XHJcbiAgICAgICAgICAgICAgICAgIGlmIChvcHRpb24uSWQgPT09IGZpZWxkVmFsdWUpIHtcclxuICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZERhdGFPcHRpb24gPSBPYmplY3QuYXNzaWduKHt9LCBvcHRpb24pO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBzZXQgdG8gYWxsIHJlbGF0ZWQgek1vZGUgb2YgdGhlIGRyb3Bkb3duXHJcbiAgICAgICAgICAgIGxldCBmZzogRm9ybUdyb3VwID0gZ2V0WnVkZlNjb3BlLmZvcm0gYXMgRm9ybUdyb3VwO1xyXG4gICAgICAgICAgICBjaGlsZEZpZWxkcy5mb3JFYWNoKGNoaWxkRmllbGQgPT4ge1xyXG4gICAgICAgICAgICAgIC8vIHJlbW92ZSBzeW1ib2wuIFxyXG4gICAgICAgICAgICAgIGxldCBjaGlsZEZpZWxkTmFtZSA9IGVuY29kZVVSSShjaGlsZEZpZWxkLnJlcGxhY2UoL1teYS16MC05XS9naSwgXCJcIikpO1xyXG4gICAgICAgICAgICAgIGNvbnN0IGZpZWxkTW9kZWxOYW1lID0gdGhpcy5kYXRhLk5hbWUgKyBjaGlsZEZpZWxkTmFtZTtcclxuICAgICAgICAgICAgICBjb25zdCB6TW9kZWxzID0gZ2V0WnVkZlNjb3BlLnpNb2RlbDtcclxuXHJcbiAgICAgICAgICAgICAgY29uc3QgY2hpbGRDb21wb25lbnQgPSBaQ29tcG9uZW50SGVscGVyLmdldENvbXBvbmVudCh0aGlzLmdyb3VwLCAndGV4dF8nICsgZmllbGRNb2RlbE5hbWUpO1xyXG4gICAgICAgICAgICAgIGlmIChjaGlsZENvbXBvbmVudFsnZGF0YSddWydSZWFkT25seSddICYmICFmaWVsZFZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBjbGVhciBjaGlsZCBmaWVsZCBpZiBvbmx5IHJlYWRvbmx5IGlzIHRydWUuIFxyXG4gICAgICAgICAgICAgICAgek1vZGVsc1tmaWVsZE1vZGVsTmFtZV0gPSAhZmllbGRWYWx1ZSA/IG51bGwgOiBzZWxlY3RlZERhdGFPcHRpb24gPyBzZWxlY3RlZERhdGFPcHRpb25bY2hpbGRGaWVsZE5hbWVdIDogbnVsbDtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoc2VsZWN0ZWREYXRhT3B0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgIHpNb2RlbHNbZmllbGRNb2RlbE5hbWVdID0gc2VsZWN0ZWREYXRhT3B0aW9uW2NoaWxkRmllbGROYW1lXTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgZmcucGF0Y2hWYWx1ZSh6TW9kZWxzKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9KSxcclxuICAgICAgc3dpdGNoTWFwKHJlcyA9PiB7XHJcbiAgICAgICAgY29uc3QgZXZlbnROYW1lID0gJ3RyaWdnZXJWYWxpZGF0aW9uJztcclxuICAgICAgICBpZiAodGhpcy5ncm91cCkge1xyXG4gICAgICAgICAgaWYgKHRoaXMuZ3JvdXBbZXZlbnROYW1lXSkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5ncm91cFtldmVudE5hbWVdKHRoaXMuZ3JvdXAsIGV2ZW50LCBmaWVsZFZhbHVlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG9mKHt9KTtcclxuICAgICAgfSlcclxuICAgICkuc3Vic2NyaWJlKHJlcyA9PiB7XHJcbiAgICAgIHRoaXMudHJpZ2dlckV2ZW50KFwiaW5wdXRmaWVsZC1vbkNoYW5nZVwiLCB0aGlzLmRhdGEuT25DaGFuZ2UsIGV2ZW50LCBmaWVsZFZhbHVlKTtcclxuICAgIH0pO1xyXG4gIH1cclxufVxyXG4iXX0=
197
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5wdXRmaWVsZGJhc2UuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbW1oZ2xvYmFsLWR5bmFtaWNmb3JtL3NyYy9saWIvY29tcG9uZW50cy9pbnB1dGZpZWxkYmFzZS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2hFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBeUIsTUFBTSxpQkFBaUIsQ0FBQztBQUMxRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFbEQsT0FBTyxFQUFFLEVBQUUsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLE1BQU0sTUFBTSxDQUFDOzs7QUFPMUMsMklBQTJJO0FBQzNJLE1BQU0sT0FBTyxjQUFlLFNBQVEsU0FBUztJQUUzQyxZQUFZLFdBQThCO1FBQ3hDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUZZLDBCQUFxQixHQUFzQixJQUFJLFlBQVksRUFBRSxDQUFDO0lBRy9GLENBQUM7SUFFTSxPQUFPLENBQUMsS0FBVSxFQUFFLFVBQWdCO1FBQ3pDLElBQUksQ0FBQyxZQUFZLENBQUMsb0JBQW9CLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLFVBQVUsSUFBSSxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztJQUNwRyxDQUFDO0lBRU0sVUFBVSxDQUFDLEtBQVUsRUFBRSxVQUFnQjtRQUM1QyxnQkFBZ0IsQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFLFVBQVUsQ0FBQyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN0RyxJQUFJLENBQUMsWUFBWSxDQUFDLHVCQUF1QixFQUFFLElB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Q0FBQyxLQUFLLENBQUMsR0FBRyx3QkFBd0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsY0FBYyxDQUFDLENBQUM7b0JBQzFGLG9CQUFvQixDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO2lCQUMvRDtnQkFFRCx3Q0FBd0M7Z0JBQ3hDLE1BQU0sMkJBQTJCLEdBQUcsY0FBYyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUN6RSxJQUFJLENBQUMsaUJBQWlCLENBQUMsU0FBUyxFQUFFLDJCQUEyQixDQUFDLDJCQUEyQixDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO2FBQ3RJO1FBQ0gsQ0FBQyxDQUFDLENBQUE7SUFDSixDQUFDOzs0R0E1TVUsY0FBYztnR0FBZCxjQUFjLHdJQUpmLEVBQUU7NEZBSUQsY0FBYztrQkFMMUIsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsRUFBRTtpQkFDYjt3R0FJa0MscUJBQXFCO3NCQUFyRCxNQUFNO3VCQUFDLHVCQUF1QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBPdXRwdXQgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQgeyBaQ29tcG9uZW50SGVscGVyLCBaQ29tcG9uZW50T3V0cHV0RXZlbnQgfSBmcm9tIFwibW1oZ2xvYmFsLXpjb3JlXCI7XHJcbmltcG9ydCB7IEZpZWxkQmFzZSB9IGZyb20gXCIuL2ZpZWxkYmFzZS5jb21wb25lbnRcIjtcclxuaW1wb3J0IHsgWkNvbXBvbmVudFNlcnZpY2UgfSBmcm9tIFwiLi4vc2VydmljZXMvemNvbXBvbmVudC5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IG9mLCBzd2l0Y2hNYXAsIHRhcCB9IGZyb20gXCJyeGpzXCI7XHJcbmltcG9ydCB7IEZvcm1Db250cm9sLCBGb3JtR3JvdXAgfSBmcm9tIFwiQGFuZ3VsYXIvZm9ybXNcIjtcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHRlbXBsYXRlOiBgYCxcclxufSlcclxuXHJcbi8vIEZvcjogemNoZWNrYm94LCB6Y2hpcCwgemRhdGV0aW1lLCB6aW1nLCB6aW5wdXQtY29udGFpbmVyLCB6bGFiZWwsIHpudW1lcmljLCB6cG9zdHNlbGVjdGlucHV0LCB6c2VsZWN0bXVsdGlwbGUsIHp0ZXh0LCB6dGV4dGFyZWEsIHp1cGxvYWRcclxuZXhwb3J0IGNsYXNzIElucHV0RmllbGRCYXNlIGV4dGVuZHMgRmllbGRCYXNlIHtcclxuICBAT3V0cHV0KCd0cmlnZ2VyQ29udGFpbmVyRXZlbnQnKSB0cmlnZ2VyQ29udGFpbmVyRXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gIGNvbnN0cnVjdG9yKGNvbXBTZXJ2aWNlOiBaQ29tcG9uZW50U2VydmljZSkge1xyXG4gICAgc3VwZXIoY29tcFNlcnZpY2UpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG9uQ2xpY2soZXZlbnQ6IGFueSwgZmllbGRWYWx1ZT86IGFueSkge1xyXG4gICAgdGhpcy50cmlnZ2VyRXZlbnQoXCJpbnB1dGZpZWxkLW9uQ2xpY2tcIiwgdGhpcy5kYXRhLk9uQ2xpY2ssIGV2ZW50LCBmaWVsZFZhbHVlIHx8IGV2ZW50WydPbkNsaWNrJ10pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG9uQ2hhbmdlQ0MoZXZlbnQ6IGFueSwgZmllbGRWYWx1ZT86IGFueSkge1xyXG4gICAgWkNvbXBvbmVudEhlbHBlci5zZXRDb21wb25lbnRNb2RlbFZhbHVlKHRoaXMuZGF0YSwgdGhpcy5nZXRGaWVsZFZhbHVlKGV2ZW50LCBmaWVsZFZhbHVlKSwgdGhpcy5ncm91cCk7XHJcbiAgICB0aGlzLnRyaWdnZXJFdmVudChcImlucHV0ZmllbGQtb25DaGFuZ2VDQ1wiLCB0aGlzLmRhdGEuQ0NPbkNoYW5nZSwgZXZlbnQsIGZpZWxkVmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG9uQ2hhbmdlKGV2ZW50OiBhbnksIGZpZWxkVmFsdWU/OiBhbnkpIHtcclxuICAgIGlmICh0aGlzLmRhdGEuU3ViVHlwZSAmJiB0aGlzLmRhdGEuU3ViVHlwZSA9PT0gJ3p1ZGYnKSB7XHJcbiAgICAgIHRoaXMuaGFuZGxlWnVkZkNoYW5nZShldmVudCwgZmllbGRWYWx1ZSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBaQ29tcG9uZW50SGVscGVyLnNldENvbXBvbmVudE1vZGVsVmFsdWUodGhpcy5kYXRhLCB0aGlzLmdldEZpZWxkVmFsdWUoZXZlbnQsIGZpZWxkVmFsdWUpLCB0aGlzLmdyb3VwKTtcclxuICAgICAgdGhpcy50cmlnZ2VyRXZlbnQoXCJpbnB1dGZpZWxkLW9uQ2hhbmdlXCIsIHRoaXMuZGF0YS5PbkNoYW5nZSwgZXZlbnQsIGZpZWxkVmFsdWUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIG9uSXRlbUNsaWNrKGV2ZW50OiBhbnksIGZpZWxkVmFsdWU/OiBhbnkpIHtcclxuICAgIHRoaXMudHJpZ2dlckV2ZW50KFwiaW5wdXRmaWVsZC1vbkl0ZW1DbGlja1wiLCB0aGlzLmRhdGEuT25JdGVtQ2xpY2ssIGV2ZW50LCBmaWVsZFZhbHVlKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBvbkljb25DbGljayhjbGlja0FjdGlvbkV4cHI6IHN0cmluZykge1xyXG4gICAgdGhpcy50cmlnZ2VyRXZlbnQoXCJpbnB1dGZpZWxkLW9uSWNvbkNsaWNrXCIsIGNsaWNrQWN0aW9uRXhwciwgbnVsbCwgdGhpcy5ncm91cC56TW9kZWxbdGhpcy5kYXRhLlZhbHVlXSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0UmVhZE9ubHlWYWx1ZSgpIHtcclxuICAgIGNvbnN0IHJlYWRPbmx5VmFsdWUgPSBaQ29tcG9uZW50SGVscGVyLmdldEdyb3VwRXZhbFZhbHVlLmNhbGwodGhpcywgdGhpcy5kYXRhLlJlYWRPbmx5KTtcclxuICAgIGlmICh0eXBlb2YgcmVhZE9ubHlWYWx1ZSA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICBjb25zdCBjYWxsRnVuYyA9IHJlYWRPbmx5VmFsdWUuYmluZCh0aGlzLmdyb3VwLmN0cmxTY29wZSk7XHJcbiAgICAgIHJldHVybiBjYWxsRnVuYyh0aGlzLmdyb3VwKTtcclxuICAgIH1cclxuICAgIHJldHVybiByZWFkT25seVZhbHVlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldElzUmVxdWlyZWRWYWx1ZSgpIHtcclxuICAgIGNvbnN0IElzUmVxdWlyZWRWYWx1ZSA9IFpDb21wb25lbnRIZWxwZXIuZ2V0R3JvdXBFdmFsVmFsdWUuY2FsbCh0aGlzLCB0aGlzLmRhdGEuSXNSZXF1aXJlZCk7XHJcbiAgICBpZiAodHlwZW9mIElzUmVxdWlyZWRWYWx1ZSA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICBjb25zdCBjYWxsRnVuYyA9IElzUmVxdWlyZWRWYWx1ZS5iaW5kKHRoaXMuZ3JvdXAuY3RybFNjb3BlKTtcclxuICAgICAgcmV0dXJuIGNhbGxGdW5jKHRoaXMuZ3JvdXApO1xyXG5cclxuICAgIH1cclxuICAgIHJldHVybiBJc1JlcXVpcmVkVmFsdWU7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0VmFsdWUodmFsdWU6IHN0cmluZykge1xyXG4gICAgWkNvbXBvbmVudEhlbHBlci5zZXRDb21wb25lbnRNb2RlbFZhbHVlKHRoaXMuZGF0YSwgdmFsdWUsIHRoaXMuZ3JvdXApO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldEFkZE9uVmFsdWUoYWRkT25zPzogYW55KSB7XHJcbiAgICB0aGlzLnRyaWdnZXJDb250YWluZXJFdmVudC5lbWl0KHsgdHlwZTogJ3NldEFkZE9uVmFsdWUnLCBkYXRhOiBhZGRPbnMgfSk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgdHJpZ2dlckV2ZW50KHR5cGU6IHN0cmluZywgdGFyZ2V0OiBhbnksIGV2ZW50OiBhbnksIGZpZWxkVmFsdWU/OiBhbnkpIHtcclxuICAgIGlmICh0YXJnZXQpIHtcclxuICAgICAgdGhpcy5ncm91cC5zdWJqZWN0Lm5leHQoe1xyXG4gICAgICAgIHR5cGU6IHR5cGUsXHJcbiAgICAgICAgdGFyZ2V0OiB0YXJnZXQsXHJcbiAgICAgICAgZXZlbnQsXHJcbiAgICAgICAgZGF0YTogeyB2YWx1ZTogdGhpcy5nZXRGaWVsZFZhbHVlKGV2ZW50LCBmaWVsZFZhbHVlKSwgZmllbGQ6IHRoaXMuZGF0YSwgY29tcDogdGhpcyB9XHJcbiAgICAgIH0gYXMgWkNvbXBvbmVudE91dHB1dEV2ZW50KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0RmllbGRWYWx1ZShldmVudDogYW55LCBmaWVsZFZhbHVlPzogYW55KSB7XHJcbiAgICBpZiAoZmllbGRWYWx1ZSA9PSBudWxsIHx8IGZpZWxkVmFsdWUgPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHJldHVybiBldmVudD8udmFsdWUgfHwgZXZlbnQ/LnRhcmdldD8udmFsdWVcclxuICAgIH1cclxuICAgIHJldHVybiBmaWVsZFZhbHVlO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBoYW5kbGVadWRmQ2hhbmdlKGV2ZW50OiBhbnksIGZpZWxkVmFsdWU/OiBhbnkpIHtcclxuICAgIGNvbnN0IHp1ZGZGaWVsZFZhbHVlID0gdGhpcy5nZXRGaWVsZFZhbHVlKGV2ZW50LCBmaWVsZFZhbHVlKTtcclxuICAgIGNvbnN0IHp1ZGZTY29wZSA9IFpDb21wb25lbnRIZWxwZXIuZ2V0WnVkZlNjb3BlKHRoaXMuZ3JvdXAsIHRoaXMuZGF0YS5WYWx1ZSk7XHJcblxyXG4gICAgaWYgKCF6dWRmU2NvcGUpIHtcclxuICAgICAgY29uc29sZS5sb2coJ3p1ZGYgc2NvcGUgaXMgbnVsbCBmb3IgZmllbGQgb25jaGFuZ2UuJyk7XHJcbiAgICB9XHJcblxyXG4gICAgenVkZlNjb3BlLnpNb2RlbFt0aGlzLmRhdGEuVmFsdWVdID0genVkZkZpZWxkVmFsdWU7XHJcbiAgICBvZih7fSkucGlwZShcclxuICAgICAgdGFwKHJlcyA9PiB7XHJcbiAgICAgICAgaWYgKHp1ZGZTY29wZS5saW5rZWRDb21wb25lbnQpIHtcclxuICAgICAgICAgIHRoaXMuY2FzY2FkaW5nSGFuZGxpbmcoenVkZlNjb3BlLCB0aGlzLmRhdGEuVmFsdWUsIGZpZWxkVmFsdWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSksXHJcbiAgICAgIHRhcChyZXMgPT4ge1xyXG4gICAgICAgIGlmICh0aGlzLmRhdGFbJ0F1dG9Qb3B1bGF0ZUNoaWxkRmllbGRWYWx1ZSddKSB7XHJcbiAgICAgICAgICAvLyBaVURGLiBBdXRvIFBvcHVsYXRlIGNoaWxkIGZpZWxkIHZhbHVlXHJcbiAgICAgICAgICBjb25zdCBjaGlsZEZpZWxkcyA9IHRoaXMuZGF0YVsnQ2hpbGRGaWVsZHMnXTtcclxuICAgICAgICAgIGlmIChjaGlsZEZpZWxkcykge1xyXG4gICAgICAgICAgICBsZXQgc2VsZWN0ZWREYXRhT3B0aW9uID0gbnVsbDtcclxuICAgICAgICAgICAgaWYgKGZpZWxkVmFsdWUpIHtcclxuICAgICAgICAgICAgICAvLyBnZXQgdGhlIHNlbGVjdGVkIGRhdGEgZnVsbCBpbmZvIFxyXG4gICAgICAgICAgICAgIGNvbnN0IGRhdGFPcHRpb24gPSB0aGlzLmdyb3VwLnpEYXRhW3RoaXMuZGF0YVsnWkRhdGFPcHRpb25OYW1lJ11dO1xyXG5cclxuICAgICAgICAgICAgICBpZiAoZGF0YU9wdGlvbikge1xyXG4gICAgICAgICAgICAgICAgZGF0YU9wdGlvbi5mb3JFYWNoKG9wdGlvbiA9PiB7XHJcbiAgICAgICAgICAgICAgICAgIGlmIChvcHRpb24uSWQgPT09IGZpZWxkVmFsdWUpIHtcclxuICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZERhdGFPcHRpb24gPSBPYmplY3QuYXNzaWduKHt9LCBvcHRpb24pO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBzZXQgdG8gYWxsIHJlbGF0ZWQgek1vZGUgb2YgdGhlIGRyb3Bkb3duXHJcbiAgICAgICAgICAgIGxldCBmZzogRm9ybUdyb3VwID0genVkZlNjb3BlLmZvcm0gYXMgRm9ybUdyb3VwO1xyXG4gICAgICAgICAgICBjaGlsZEZpZWxkcy5mb3JFYWNoKGNoaWxkRmllbGQgPT4ge1xyXG4gICAgICAgICAgICAgIC8vIHJlbW92ZSBzeW1ib2wuIFxyXG4gICAgICAgICAgICAgIGxldCBjaGlsZEZpZWxkTmFtZSA9IGVuY29kZVVSSShjaGlsZEZpZWxkLnJlcGxhY2UoL1teYS16MC05XS9naSwgXCJcIikpO1xyXG4gICAgICAgICAgICAgIGNvbnN0IGZpZWxkTW9kZWxOYW1lID0gdGhpcy5kYXRhLk5hbWUgKyBjaGlsZEZpZWxkTmFtZTtcclxuICAgICAgICAgICAgICBjb25zdCB6TW9kZWxzID0genVkZlNjb3BlLnpNb2RlbDtcclxuXHJcbiAgICAgICAgICAgICAgY29uc3QgY2hpbGRDb21wb25lbnQgPSBaQ29tcG9uZW50SGVscGVyLmdldENvbXBvbmVudCh0aGlzLmdyb3VwLCAndGV4dF8nICsgZmllbGRNb2RlbE5hbWUpO1xyXG4gICAgICAgICAgICAgIGlmIChjaGlsZENvbXBvbmVudFsnZGF0YSddWydSZWFkT25seSddICYmICFmaWVsZFZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBjbGVhciBjaGlsZCBmaWVsZCBpZiBvbmx5IHJlYWRvbmx5IGlzIHRydWUuIFxyXG4gICAgICAgICAgICAgICAgek1vZGVsc1tmaWVsZE1vZGVsTmFtZV0gPSAhZmllbGRWYWx1ZSA/IG51bGwgOiBzZWxlY3RlZERhdGFPcHRpb24gPyBzZWxlY3RlZERhdGFPcHRpb25bY2hpbGRGaWVsZE5hbWVdIDogbnVsbDtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoc2VsZWN0ZWREYXRhT3B0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgIHpNb2RlbHNbZmllbGRNb2RlbE5hbWVdID0gc2VsZWN0ZWREYXRhT3B0aW9uW2NoaWxkRmllbGROYW1lXTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgZmcucGF0Y2hWYWx1ZSh6TW9kZWxzKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9KSxcclxuICAgICAgc3dpdGNoTWFwKHJlcyA9PiB7XHJcbiAgICAgICAgY29uc3QgZXZlbnROYW1lID0gJ3RyaWdnZXJWYWxpZGF0aW9uJztcclxuICAgICAgICBpZiAodGhpcy5ncm91cCkge1xyXG4gICAgICAgICAgaWYgKHRoaXMuZ3JvdXBbZXZlbnROYW1lXSkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5ncm91cFtldmVudE5hbWVdKHRoaXMuZ3JvdXAsIGV2ZW50LCBmaWVsZFZhbHVlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG9mKHt9KTtcclxuICAgICAgfSlcclxuICAgICkuc3Vic2NyaWJlKHJlcyA9PiB7XHJcbiAgICAgIHRoaXMudHJpZ2dlckV2ZW50KFwiaW5wdXRmaWVsZC1vbkNoYW5nZVwiLCB0aGlzLmRhdGEuT25DaGFuZ2UsIGV2ZW50LCBmaWVsZFZhbHVlKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjYXNjYWRpbmdIYW5kbGluZyh6dWRmU2NvcGU6IGFueSwgZmllbGROYW1lOiBhbnksIGZpZWxkVmFsdWU/OiBhbnkpIHtcclxuICAgIGNvbnN0IGxpbmtlZENvbXBvbmVudFNjb3BlID0genVkZlNjb3BlLmxpbmtlZENvbXBvbmVudDtcclxuICAgIC8vICMxIGNoZWNrIGlzIHRoZSBvbmNoYW5nZSBjb21wb25lbnQgbGlua2VkIHRvIG90aGVyIGNvbXBvbmVudC5cclxuICAgIC8vICMyIGlmIGxpbmtlZCB0byBvdGhlciBjb21wb25lbnQobGV0cyBjYWxsIGl0IGNoaWxkIGNvbXBvbmVudCksXHJcbiAgICAvLyAgICBiYXNlIG9uIHRoZSBsaW5rZWRDb21wb25lbnRTY29wZSB2YWx1ZSwgZmluZCB0aGUgY2hpbGQgY29tcG9uZW50LlxyXG4gICAgLy8gIzMga2VlcCB0aGUgb3JpZ2luYWwgU2VsZWN0T3B0aW9ucyBpbiB0aGUgY29tcG9uZW50LlxyXG4gICAgLy8gIzQgY2xlYXIgdGhlIGNoaWxkIHptb2RlbCBhbmQgZmlsdGVyIHRoZSBjaGlsZCBjb21wb25lbnQgb3B0aW9ucy5cclxuICAgIC8vICM1IGF1dG8gc2VsZWN0IGRlZmF1bHQgem1vZGVsIGlmIG9ubHkgaGF2ZSAxIG9wdGlvbiBhbmQgaXMgcmVxdWlyZWQuXHJcbiAgICAvLyAjNiBoYW5kbGUgY2hpbGQgbmVzdGVkIGxpbmtlZCBjb21wb25lbnQuXHJcbiAgICBsaW5rZWRDb21wb25lbnRTY29wZS5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICBjb25zdCBkYXRhVmFsdWVTZWdtZW50cyA9IGZpZWxkTmFtZS5zcGxpdCgnXycpO1xyXG4gICAgICBjb25zdCBsaW5rZWRDb21wb25lbnRTZWdtZW50cyA9IGl0ZW0ubGlua2VkQ29tcG9uZW50LnNwbGl0KCdfJyk7XHJcbiAgICAgIGxldCBpc0xpbmtlZENvbXBvbmVudCA9IGZhbHNlO1xyXG5cclxuICAgICAgLy8gY2hlY2sgaXMgaXQgbGlua2VkY29tcG9uZW50XHJcbiAgICAgIGlmIChsaW5rZWRDb21wb25lbnRTZWdtZW50cy5sZW5ndGggPiAxICYmIGRhdGFWYWx1ZVNlZ21lbnRzLmxlbmd0aCA+IDMpIHtcclxuICAgICAgICBjb25zdCBsYXN0VHdvU2VnbWVudHMgPSBkYXRhVmFsdWVTZWdtZW50cy5zbGljZSgtMikuam9pbignXycpO1xyXG4gICAgICAgIGlmIChsaW5rZWRDb21wb25lbnRTZWdtZW50cy5qb2luKCdfJykgPT09IGxhc3RUd29TZWdtZW50cykge1xyXG4gICAgICAgICAgaXNMaW5rZWRDb21wb25lbnQgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBlbHNlIGlmIChsaW5rZWRDb21wb25lbnRTZWdtZW50cy5sZW5ndGggPT09IDEpIHtcclxuICAgICAgICBjb25zdCBsYXN0U2VnbWVudCA9IGRhdGFWYWx1ZVNlZ21lbnRzW2RhdGFWYWx1ZVNlZ21lbnRzLmxlbmd0aCAtIDFdO1xyXG4gICAgICAgIGlmIChsaW5rZWRDb21wb25lbnRTZWdtZW50c1swXSA9PT0gbGFzdFNlZ21lbnQpIHtcclxuICAgICAgICAgIGlzTGlua2VkQ29tcG9uZW50ID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChpc0xpbmtlZENvbXBvbmVudCkge1xyXG4gICAgICAgIGNvbnN0IGNoaWxkQ29tcG9uZW50ID0gWkNvbXBvbmVudEhlbHBlci5nZXRDb21wb25lbnRCeVZhbHVlKHRoaXMuZ3JvdXAsIGl0ZW0udmFsdWUpO1xyXG4gICAgICAgIGNvbnN0IG9yaWdpbmFsU2VsZWN0T3B0aW9ucyA9IGNoaWxkQ29tcG9uZW50LmRhdGFbJ29yaWdpbmFsU2VsZWN0T3B0aW9ucyddID8/IE9iamVjdC5hc3NpZ24oW10sIGNoaWxkQ29tcG9uZW50LmRhdGEuU2VsZWN0T3B0aW9ucyk7XHJcbiAgICAgICAgY29uc3QgZmlsdGVyZWRTZWxlY3Rpb25PcHRpb25zID0gb3JpZ2luYWxTZWxlY3RPcHRpb25zLmZpbHRlcihvcHRpb24gPT4gb3B0aW9uLnBhcmVudEV4cHJlc3Npb24gPT0gZmllbGRWYWx1ZSk7XHJcblxyXG4gICAgICAgIC8vY2hpbGRDb21wb25lbnQuY2xlYXJEYXRhKCk7IC8vdW5hYmxlIHRvIHVzZSBjbGVhckRhdGEuIG5vdCBoYW5kbGVkIGZvciB6dWRmIHR5cGVcclxuICAgICAgICAvLyBtYW51YWxsIHBhdGNoIHRoZSBjb21wb25lbnQgZm9ybWNvbnRyb2wgdmFsdWVcclxuICAgICAgICBjb25zdCB6dWRmRm9ybSA9IHp1ZGZTY29wZS5mb3JtIGFzIEZvcm1Hcm91cDtcclxuICAgICAgICBjb25zdCBjb21wb25lbnRGb3JtQ29udHJvbCA9IHp1ZGZGb3JtLmNvbnRyb2xzW2l0ZW0udmFsdWVdIGFzIEZvcm1Db250cm9sO1xyXG4gICAgICAgIHp1ZGZTY29wZS56TW9kZWxbaXRlbS52YWx1ZV0gPSBudWxsO1xyXG4gICAgICAgIGNvbXBvbmVudEZvcm1Db250cm9sLnBhdGNoVmFsdWUoenVkZlNjb3BlLnpNb2RlbFtpdGVtLnZhbHVlXSk7XHJcblxyXG4gICAgICAgIGNoaWxkQ29tcG9uZW50LmRhdGFbJ29yaWdpbmFsU2VsZWN0T3B0aW9ucyddID0gb3JpZ2luYWxTZWxlY3RPcHRpb25zO1xyXG4gICAgICAgIGNoaWxkQ29tcG9uZW50LnNldFNlbGVjdE9wdGlvbihmaWx0ZXJlZFNlbGVjdGlvbk9wdGlvbnMpO1xyXG5cclxuICAgICAgICAvLyBzZXQgZHJvcGRvd24gc2VsZWN0ZWQgdmFsdWUgaWYgb25seSAxIG9wdGlvbi5cclxuICAgICAgICBjb25zdCBjaGlsZENvbXBvbmVudFR5cGUgPSBjaGlsZENvbXBvbmVudC5kYXRhLlR5cGU7XHJcbiAgICAgICAgaWYgKGZpbHRlcmVkU2VsZWN0aW9uT3B0aW9ucy5sZW5ndGggPT09IDEgJiYgY2hpbGRDb21wb25lbnQuZGF0YS5Jc1JlcXVpcmVkICYmIChjaGlsZENvbXBvbmVudFR5cGUgPT09ICd6dWlzZWxlY3RtdWx0aXBsZScgfHwgY2hpbGRDb21wb25lbnRUeXBlID09PSAnenNlbGVjdG11bHRpcGxlJykpIHtcclxuICAgICAgICAgIHp1ZGZTY29wZS56TW9kZWxbaXRlbS52YWx1ZV0gPSBmaWx0ZXJlZFNlbGVjdGlvbk9wdGlvbnNbMF1bY2hpbGRDb21wb25lbnQuaXRlbVZhbHVlRmllbGRdO1xyXG4gICAgICAgICAgY29tcG9uZW50Rm9ybUNvbnRyb2wucGF0Y2hWYWx1ZSh6dWRmU2NvcGUuek1vZGVsW2l0ZW0udmFsdWVdKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIGxvb3AgY2hpbGRyZW4gaW5jYXNlIG9mIG5lc3RlZCBjaGlsZC5cclxuICAgICAgICBjb25zdCBjaGlsZENvbXBvbmVudFZhbHVlU2VnbWVudHMgPSBjaGlsZENvbXBvbmVudC5kYXRhLlZhbHVlLnNwbGl0KCdfJyk7XHJcbiAgICAgICAgdGhpcy5jYXNjYWRpbmdIYW5kbGluZyh6dWRmU2NvcGUsIGNoaWxkQ29tcG9uZW50VmFsdWVTZWdtZW50c1tjaGlsZENvbXBvbmVudFZhbHVlU2VnbWVudHMubGVuZ3RoIC0gMV0sIHp1ZGZTY29wZS56TW9kZWxbaXRlbS52YWx1ZV0pO1xyXG4gICAgICB9XHJcbiAgICB9KVxyXG4gIH1cclxufVxyXG4iXX0=