@huntsman-cancer-institute/dictionary-editor 17.14.6 → 17.15.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/components/detail.component.d.ts +0 -1
- package/esm2022/components/detail.component.mjs +41 -9
- package/esm2022/grid-editors/select.editor.mjs +23 -130
- package/esm2022/grid-renderers/cell-renderer-validation.mjs +11 -12
- package/esm2022/grid-renderers/select.renderer.mjs +37 -105
- package/fesm2022/huntsman-cancer-institute-dictionary-editor.mjs +108 -252
- package/fesm2022/huntsman-cancer-institute-dictionary-editor.mjs.map +1 -1
- package/grid-editors/select.editor.d.ts +14 -20
- package/grid-renderers/cell-renderer-validation.d.ts +3 -4
- package/grid-renderers/select.renderer.d.ts +9 -7
- package/package.json +1 -1
|
@@ -2,176 +2,69 @@ import { Component } from "@angular/core";
|
|
|
2
2
|
import * as i0 from "@angular/core";
|
|
3
3
|
import * as i1 from "@angular/common";
|
|
4
4
|
import * as i2 from "@angular/forms";
|
|
5
|
-
//import {MatDialog, MatDialogConfig, MatDialogRef} from "@angular/material/dialog";
|
|
6
|
-
//import {SpinnerDialogComponent} from "../popup/spinner-dialog.component";
|
|
7
5
|
export class SelectEditor {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
return this._filteredOptions;
|
|
11
|
-
}
|
|
12
|
-
else {
|
|
13
|
-
return this._options;
|
|
14
|
-
}
|
|
15
|
-
}
|
|
16
|
-
set options(value) {
|
|
17
|
-
this._options = value;
|
|
18
|
-
}
|
|
19
|
-
// private spinnerDialogRefs: MatDialogRef<SpinnerDialogComponent>[] = [];
|
|
20
|
-
constructor() {
|
|
21
|
-
this.using_selectOptionsPerRowFilterFunction = false;
|
|
22
|
-
this._spinnerDialogIsOpen = false;
|
|
23
|
-
}
|
|
6
|
+
// variables used for the optional per-row-filtering
|
|
7
|
+
constructor() { }
|
|
24
8
|
agInit(params) {
|
|
25
9
|
this.params = params;
|
|
26
|
-
this.options =
|
|
27
|
-
this.
|
|
28
|
-
this.
|
|
29
|
-
if (this.params && this.params.column && this.params.column.colDef) {
|
|
30
|
-
this.gridValueField = this.params.column.colDef.field;
|
|
31
|
-
this.options = this.params.column.colDef.selectOptions;
|
|
32
|
-
this.optionsValueField = this.params.column.colDef.selectOptionsValueField;
|
|
33
|
-
this.optionsDisplayField = this.params.column.colDef.selectOptionsDisplayField;
|
|
34
|
-
if (this.params.column.colDef.selectOptionsPerRowFilterFunction) {
|
|
35
|
-
let backup = this.selectOptionsPerRowFilterFunction;
|
|
36
|
-
try {
|
|
37
|
-
this.selectOptionsPerRowFilterFunction = this.params.column.colDef.selectOptionsPerRowFilterFunction;
|
|
38
|
-
this.using_selectOptionsPerRowFilterFunction = !!this.selectOptionsPerRowFilterFunction;
|
|
39
|
-
}
|
|
40
|
-
catch (e) {
|
|
41
|
-
console.error("selectOptionsPerRowFilterFunction option has wrong signature for column : " + this.params.column.colDef.headerName + "\n"
|
|
42
|
-
+ " Requires signature (context:any, rowData: any, option: any) => boolean");
|
|
43
|
-
this.selectOptionsPerRowFilterFunction = backup;
|
|
44
|
-
this.using_selectOptionsPerRowFilterFunction = !!backup;
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
this.context = this.params.column.colDef.context;
|
|
48
|
-
this.fillGroupAttribute = this.params.column.colDef.fillGroupAttribute;
|
|
49
|
-
this.fillAll = this.params.column.colDef.fillAll && ("" + this.params.column.colDef.fillAll).toLowerCase() !== "false";
|
|
50
|
-
this.showFillButton = this.params.column.colDef.showFillButton && ("" + this.params.column.colDef.showFillButton).toLowerCase() !== "false";
|
|
51
|
-
if (this._options
|
|
52
|
-
&& this.params.node
|
|
53
|
-
&& this.params.node.data
|
|
54
|
-
&& this.using_selectOptionsPerRowFilterFunction) {
|
|
55
|
-
this._filteredOptions = this._options.filter((option) => {
|
|
56
|
-
return this.selectOptionsPerRowFilterFunction(this.context, this.params.node.data, option);
|
|
57
|
-
});
|
|
58
|
-
}
|
|
59
|
-
}
|
|
10
|
+
this.options = params.options;
|
|
11
|
+
this.valueField = params.valueField;
|
|
12
|
+
this.displayField = params.displayField;
|
|
60
13
|
if (this.params) {
|
|
61
|
-
this.value = this.params.value ?
|
|
62
|
-
}
|
|
63
|
-
if (this.showFillButton && !this.fillAll && (!this.fillGroupAttribute || this.fillGroupAttribute === "")) {
|
|
64
|
-
throw new Error("Invalid state, cannot use fill button without specifying the fillGroupAttribute or fillAll.");
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
ngOnDestroy() {
|
|
68
|
-
if (this.params && this.params.node && this.params.node[(this.gridValueField + "_originalValue")]) {
|
|
69
|
-
this.value = this.params.node[(this.gridValueField + "_originalValue")];
|
|
14
|
+
this.value = this.params.value ? String(this.params.value) : "";
|
|
70
15
|
}
|
|
71
16
|
}
|
|
72
17
|
onChange(event) {
|
|
73
|
-
if (event && event.currentTarget) {
|
|
74
|
-
if (this.params && this.params.node && !this.params.node[(this.gridValueField + "_originalValue")]) {
|
|
75
|
-
this.params.node[(this.gridValueField + "_originalValue")] = this.value;
|
|
76
|
-
}
|
|
77
|
-
// This looks unnecessary, since this.value is linked to the value of the select component, but
|
|
78
|
-
// because this also ends editing, it also queues the destruction of this component and the call to getValue.
|
|
79
|
-
// The problem was that this.value isn't updated with the new value before this event fires,
|
|
80
|
-
// so we need to update it manually here.
|
|
81
|
-
this.value = event.currentTarget.value;
|
|
82
|
-
this.params.node.setDataValue(this.gridValueField, this.value);
|
|
83
|
-
}
|
|
84
|
-
if (this.params) {
|
|
85
|
-
// If the fill button, which is part of the editor, is activated, don't stop editing
|
|
86
|
-
// immediately after making a selection.
|
|
87
|
-
if (!this.showFillButton) {
|
|
88
|
-
this.params.stopEditing();
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
18
|
}
|
|
92
19
|
getValue() {
|
|
93
|
-
return this.value ? this.value : "";
|
|
20
|
+
return this.params.value ? String(this.params.value) : "";
|
|
94
21
|
}
|
|
95
22
|
isPopup() {
|
|
96
23
|
return false;
|
|
97
24
|
}
|
|
98
|
-
onFillButtonClicked() {
|
|
99
|
-
if (!this.fillAll && (!this.fillGroupAttribute || this.fillGroupAttribute === "")) {
|
|
100
|
-
throw new Error('No column attribute "fillGroupAttribute" or "fillAll" specified. This is required to use the Fill functionality.');
|
|
101
|
-
}
|
|
102
|
-
if (this.params && this.params.column && this.params.column.gridApi && this.params.node && (this.fillAll || (this.fillGroupAttribute && this.fillGroupAttribute !== ""))) {
|
|
103
|
-
let thisRowNode = this.params.node;
|
|
104
|
-
//this.startSpinnerDialog();
|
|
105
|
-
this.params.column.gridApi.forEachNodeAfterFilter((rowNode) => {
|
|
106
|
-
if (rowNode && rowNode.data && thisRowNode && thisRowNode.data && (this.fillAll || rowNode.data[this.fillGroupAttribute] === thisRowNode.data[this.fillGroupAttribute])) {
|
|
107
|
-
let spoofedEvent = {
|
|
108
|
-
api: this.params.column.gridApi,
|
|
109
|
-
colDef: this.params.column.colDef,
|
|
110
|
-
column: this.params.column,
|
|
111
|
-
columnApi: this.params.column.columnApi,
|
|
112
|
-
context: undefined,
|
|
113
|
-
data: rowNode.data,
|
|
114
|
-
event: null,
|
|
115
|
-
newValue: this.value,
|
|
116
|
-
node: rowNode,
|
|
117
|
-
oldValue: rowNode.data[this.gridValueField],
|
|
118
|
-
rowIndex: rowNode.rowIndex,
|
|
119
|
-
rowPinned: undefined,
|
|
120
|
-
type: "cellValueChanged",
|
|
121
|
-
value: this.value
|
|
122
|
-
};
|
|
123
|
-
rowNode.data[this.gridValueField] = this.value;
|
|
124
|
-
rowNode.setDataValue(this.gridValueField, this.value);
|
|
125
|
-
this.params.column.gridApi.dispatchEvent(spoofedEvent);
|
|
126
|
-
}
|
|
127
|
-
});
|
|
128
|
-
this.params.column.gridApi.refreshCells();
|
|
129
|
-
setTimeout(() => {
|
|
130
|
-
//this.stopSpinnerDialogs();
|
|
131
|
-
});
|
|
132
|
-
}
|
|
133
|
-
}
|
|
134
25
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SelectEditor, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
135
26
|
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: SelectEditor, selector: "ng-component", ngImport: i0, template: `
|
|
136
27
|
<div class="full-width full-height flex-column-container">
|
|
137
28
|
<div class="full-height flex-stretch flex-row">
|
|
138
|
-
<select class="full-width full-height" [(
|
|
29
|
+
<select class="full-width full-height" [(ngModel)]="params.value" (change)="onChange($event)">
|
|
139
30
|
<option hidden>
|
|
140
31
|
Select An Option
|
|
32
|
+
</option>
|
|
33
|
+
<!-- Blank Option -->
|
|
34
|
+
<option value="">
|
|
35
|
+
|
|
141
36
|
</option>
|
|
142
37
|
<option
|
|
143
38
|
*ngFor="let option of options"
|
|
144
|
-
value="{{option.hasOwnProperty(
|
|
145
|
-
{{option.hasOwnProperty(
|
|
39
|
+
value="{{option.hasOwnProperty(valueField) ? option[valueField] : (option.value) ? option.value : option }}">
|
|
40
|
+
{{option.hasOwnProperty(displayField) ? option[displayField] : (option.display) ? option.display : option }}
|
|
146
41
|
</option>
|
|
147
42
|
</select>
|
|
148
43
|
</div>
|
|
149
|
-
<div *ngIf="showFillButton" class="full-height flex-row button-container">
|
|
150
|
-
<button riRippleEffectDict class="full-height" (click)="onFillButtonClicked()">Fill</button>
|
|
151
|
-
</div>
|
|
152
44
|
</div>
|
|
153
|
-
`, isInline: true, styles: [".full-width{width:100%}.full-height{height:100%}.flex-column-container{display:flex;flex-direction:row}.flex-row{display:flex}.flex-stretch{display:flex;flex:1}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type:
|
|
45
|
+
`, isInline: true, styles: [".full-width{width:100%}.full-height{height:100%}.flex-column-container{display:flex;flex-direction:row}.flex-row{display:flex}.flex-stretch{display:flex;flex:1}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }] }); }
|
|
154
46
|
}
|
|
155
47
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SelectEditor, decorators: [{
|
|
156
48
|
type: Component,
|
|
157
49
|
args: [{ template: `
|
|
158
50
|
<div class="full-width full-height flex-column-container">
|
|
159
51
|
<div class="full-height flex-stretch flex-row">
|
|
160
|
-
<select class="full-width full-height" [(
|
|
52
|
+
<select class="full-width full-height" [(ngModel)]="params.value" (change)="onChange($event)">
|
|
161
53
|
<option hidden>
|
|
162
54
|
Select An Option
|
|
55
|
+
</option>
|
|
56
|
+
<!-- Blank Option -->
|
|
57
|
+
<option value="">
|
|
58
|
+
|
|
163
59
|
</option>
|
|
164
60
|
<option
|
|
165
61
|
*ngFor="let option of options"
|
|
166
|
-
value="{{option.hasOwnProperty(
|
|
167
|
-
{{option.hasOwnProperty(
|
|
62
|
+
value="{{option.hasOwnProperty(valueField) ? option[valueField] : (option.value) ? option.value : option }}">
|
|
63
|
+
{{option.hasOwnProperty(displayField) ? option[displayField] : (option.display) ? option.display : option }}
|
|
168
64
|
</option>
|
|
169
65
|
</select>
|
|
170
66
|
</div>
|
|
171
|
-
<div *ngIf="showFillButton" class="full-height flex-row button-container">
|
|
172
|
-
<button riRippleEffectDict class="full-height" (click)="onFillButtonClicked()">Fill</button>
|
|
173
|
-
</div>
|
|
174
67
|
</div>
|
|
175
68
|
`, styles: [".full-width{width:100%}.full-height{height:100%}.flex-column-container{display:flex;flex-direction:row}.flex-row{display:flex}.flex-stretch{display:flex;flex:1}\n"] }]
|
|
176
69
|
}], ctorParameters: () => [] });
|
|
177
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0LmVkaXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2RpY3Rpb25hcnktZWRpdG9yL3NyYy9ncmlkLWVkaXRvcnMvc2VsZWN0LmVkaXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsU0FBUyxFQUFZLE1BQU0sZUFBZSxDQUFDOzs7O0FBRW5ELG9GQUFvRjtBQUNwRiwyRUFBMkU7QUFvRDNFLE1BQU0sT0FBTyxZQUFZO0lBSXJCLElBQVcsT0FBTztRQUNkLElBQUksSUFBSSxDQUFDLHVDQUF1QyxFQUFFLENBQUM7WUFDL0MsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUM7UUFDakMsQ0FBQzthQUFNLENBQUM7WUFDSixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUM7UUFDekIsQ0FBQztJQUNMLENBQUM7SUFDRCxJQUFXLE9BQU8sQ0FBQyxLQUFZO1FBQzNCLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDO0lBQzFCLENBQUM7SUF3QkwsNkVBQTZFO0lBRXpFO1FBbkJVLDRDQUF1QyxHQUFZLEtBQUssQ0FBQztRQWdCM0QseUJBQW9CLEdBQVksS0FBSyxDQUFDO0lBR0MsQ0FBQztJQUVoRCxNQUFNLENBQUMsTUFBVztRQUNkLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO1FBQ2xCLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxFQUFFLENBQUM7UUFDNUIsSUFBSSxDQUFDLG1CQUFtQixHQUFHLEVBQUUsQ0FBQztRQUU5QixJQUFJLElBQUksQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDakUsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FB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QU8sQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7b0JBQ3RELElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDLENBQUM7Z0JBQzNELENBQUM7WUFDTCxDQUFDLENBQUMsQ0FBQztZQUVILElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUMxQyxVQUFVLENBQUMsR0FBRyxFQUFFO2dCQUNaLDRCQUE0QjtZQUNoQyxDQUFDLENBQUMsQ0FBQztRQUNQLENBQUM7SUFDTCxDQUFDOytHQTVLUSxZQUFZO21HQUFaLFlBQVksb0RBL0NuQjs7Ozs7Ozs7Ozs7Ozs7Ozs7O09Ba0JDOzs0RkE2Qk0sWUFBWTtrQkFsRHhCLFNBQVM7K0JBR0o7Ozs7Ozs7Ozs7Ozs7Ozs7OztPQWtCQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Q29tcG9uZW50LCBPbkRlc3Ryb3l9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7SUNlbGxFZGl0b3JBbmd1bGFyQ29tcH0gZnJvbSBcImFnLWdyaWQtYW5ndWxhclwiO1xyXG4vL2ltcG9ydCB7TWF0RGlhbG9nLCBNYXREaWFsb2dDb25maWcsIE1hdERpYWxvZ1JlZn0gZnJvbSBcIkBhbmd1bGFyL21hdGVyaWFsL2RpYWxvZ1wiO1xyXG4vL2ltcG9ydCB7U3Bpbm5lckRpYWxvZ0NvbXBvbmVudH0gZnJvbSBcIi4uL3BvcHVwL3NwaW5uZXItZGlhbG9nLmNvbXBvbmVudFwiO1xyXG5cclxuQENvbXBvbmVudChcclxuICB7XHJcbiAgICB0ZW1wbGF0ZTpcclxuICAgICAgYFxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmdWxsLXdpZHRoIGZ1bGwtaGVpZ2h0IGZsZXgtY29sdW1uLWNvbnRhaW5lclwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZ1bGwtaGVpZ2h0IGZsZXgtc3RyZXRjaCBmbGV4LXJvd1wiPlxyXG4gICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwiZnVsbC13aWR0aCBmdWxsLWhlaWdodFwiIFsodmFsdWUpXT1cInZhbHVlXCIgKGNoYW5nZSk9XCJvbkNoYW5nZSgkZXZlbnQpXCI+XHJcbiAgICAgICAgICAgICAgPG9wdGlvbiBoaWRkZW4+XHJcbiAgICAgICAgICAgICAgICBTZWxlY3QgQW4gT3B0aW9uXHJcbiAgICAgICAgICAgICAgPC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgPG9wdGlvblxyXG4gICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IG9wdGlvbiBvZiBvcHRpb25zXCJcclxuICAgICAgICAgICAgICAgIHZhbHVlPVwie3tvcHRpb24uaGFzT3duUHJvcGVydHkob3B0aW9uc1ZhbHVlRmllbGQpID8gb3B0aW9uW29wdGlvbnNWYWx1ZUZpZWxkXSA6IChvcHRpb24udmFsdWUpID8gb3B0aW9uLnZhbHVlIDogb3B0aW9uIH19XCI+XHJcbiAgICAgICAgICAgICAgICB7e29wdGlvbi5oYXNPd25Qcm9wZXJ0eShvcHRpb25zRGlzcGxheUZpZWxkKSA/IG9wdGlvbltvcHRpb25zRGlzcGxheUZpZWxkXSA6IChvcHRpb24uZGlzcGxheSkgPyBvcHRpb24uZGlzcGxheSA6IG9wdGlvbiB9fVxyXG4gICAgICAgICAgICAgIDwvb3B0aW9uPlxyXG4gICAgICAgICAgICA8L3NlbGVjdD5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiAqbmdJZj1cInNob3dGaWxsQnV0dG9uXCIgY2xhc3M9XCJmdWxsLWhlaWdodCBmbGV4LXJvdyBidXR0b24tY29udGFpbmVyXCI+XHJcbiAgICAgICAgICAgIDxidXR0b24gcmlSaXBwbGVFZmZlY3REaWN0IGNsYXNzPVwiZnVsbC1oZWlnaHRcIiAoY2xpY2spPVwib25GaWxsQnV0dG9uQ2xpY2tlZCgpXCI+RmlsbDwvYnV0dG9uPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIGBcclxuICAgICxcclxuICAgIHN0eWxlczogW1xyXG4gICAgICBgXHJcbiAgICAgICAgLmZ1bGwtd2lkdGgge1xyXG4gICAgICAgICAgd2lkdGg6IDEwMCU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAuZnVsbC1oZWlnaHQge1xyXG4gICAgICAgICAgaGVpZ2h0OiAxMDAlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLmZsZXgtY29sdW1uLWNvbnRhaW5lciB7XHJcbiAgICAgICAgICBkaXNwbGF5OiBmbGV4O1xyXG4gICAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC5mbGV4LXJvdyB7XHJcbiAgICAgICAgICBkaXNwbGF5OiBmbGV4O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLmZsZXgtc3RyZXRjaCB7XHJcbiAgICAgICAgICBkaXNwbGF5OiBmbGV4O1xyXG4gICAgICAgICAgZmxleDogMTtcclxuICAgICAgICB9XHJcbiAgICAgIGBcclxuICAgIF1cclxuICB9XHJcbilcclxuZXhwb3J0IGNsYXNzIFNlbGVjdEVkaXRvciBpbXBsZW1lbnRzIElDZWxsRWRpdG9yQW5ndWxhckNvbXAsIE9uRGVzdHJveSB7XHJcbiAgICBwdWJsaWMgcGFyYW1zOiBhbnk7XHJcbiAgICBwdWJsaWMgdmFsdWU6IGFueTtcclxuICAgIHByaXZhdGUgX29wdGlvbnM6IGFueVtdO1xyXG4gICAgcHVibGljIGdldCBvcHRpb25zKCk6IGFueVtdIHtcclxuICAgICAgICBpZiAodGhpcy51c2luZ19zZWxlY3RPcHRpb25zUGVyUm93RmlsdGVyRnVuY3Rpb24pIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2ZpbHRlcmVkT3B0aW9ucztcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fb3B0aW9ucztcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc2V0IG9wdGlvbnModmFsdWU6IGFueVtdKSB7XHJcbiAgICAgICAgdGhpcy5fb3B0aW9ucyA9IHZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvcHRpb25zVmFsdWVGaWVsZDogc3RyaW5nO1xyXG4gICAgcHVibGljIG9wdGlvbnNEaXNwbGF5RmllbGQ6IHN0cmluZztcclxuXHJcbiAgICAvLyB2YXJpYWJsZXMgdXNlZCBmb3IgdGhlIG9wdGlvbmFsIHBlci1yb3ctZmlsdGVyaW5nXHJcbiAgICBwdWJsaWMgY29udGV4dDogYW55O1xyXG4gICAgcHJvdGVjdGVkIHVzaW5nX3NlbGVjdE9wdGlvbnNQZXJSb3dGaWx0ZXJGdW5jdGlvbjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgcHJvdGVjdGVkIHNlbGVjdE9wdGlvbnNQZXJSb3dGaWx0ZXJGdW5jdGlvbjogKGNvbnRleHQ6IGFueSwgcm93RGF0YTogYW55LCBvcHRpb246IGFueSkgPT4gYm9vbGVhbjtcclxuICAgIHByaXZhdGUgX2ZpbHRlcmVkT3B0aW9uczogYW55W107XHJcblxyXG5cclxuXHJcbiAgICBwdWJsaWMgZ3JpZFZhbHVlRmllbGQ6IHN0cmluZztcclxuXHJcbiAgICBwdWJsaWMgc2hvd0ZpbGxCdXR0b246IGJvb2xlYW47XHRcdC8vIFRoaXMgcmVwcmVzZW50cyB3aGV0aGVyIHRoZSBlZGl0b3Igc2hvdWxkIHNob3cgdGhlIFwiRmlsbFwiIGJ1dHRvbixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdoaWNoIGlzIHVzZWQgdG8gY29weSB0aGUgdmFsdWUgb2YgdGhpcyBjZWxsIHRvIG90aGVyIGNlbGxzIGluIHRoaXMgY29sdW1uIGluIHRoZSBncmlkXHJcbiAgICBwdWJsaWMgZmlsbEdyb3VwQXR0cmlidXRlOiBzdHJpbmc7XHRcdC8vIFRoaXMgYXR0cmlidXRlIGlzIHVzZWQgdG8gc3BlY2lmeSB3aGljaCBcIkdyb3VwXCIgYSBwYXJ0aWN1bGFyXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcm93IGJlbG9uZ3MgdG8sIHdoaWNoIGlzIHVzZWQgd2hlbiB0aGUgZmlsbCBidXR0b24gaXMgYWN0aXZlLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdoZW4gY2xpY2tlZCwgdGhlIGZpbGwgYnV0dG9uIHdpbGwgY29weSB0aGUgZGF0YSBpbiB0aGF0IGNlbGxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0byB0aGUgY29ycmVzcG9uZGluZyBjZWxscyBpbiByb3dzIG9mIHRoZSBzYW1lIGdyb3VwLlxyXG4gICAgcHVibGljIGZpbGxBbGw6IGJvb2xlYW47ICAgICAgICAgICAgICAgIC8vIElmIGZpbGxBbGwgaXMgc2V0LCBhbGwgZGF0YSB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgZ3JvdXBlZCB0b2dldGhlclxyXG5cclxuICAgIHByaXZhdGUgX3NwaW5uZXJEaWFsb2dJc09wZW46IGJvb2xlYW4gPSBmYWxzZTtcclxuLy8gICAgcHJpdmF0ZSBzcGlubmVyRGlhbG9nUmVmczogTWF0RGlhbG9nUmVmPFNwaW5uZXJEaWFsb2dDb21wb25lbnQ+W10gPSBbXTtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcigvKnByb3RlY3RlZCBkaWFsb2c6IE1hdERpYWxvZyovKSB7IH1cclxuXHJcbiAgICBhZ0luaXQocGFyYW1zOiBhbnkpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnBhcmFtcyA9IHBhcmFtcztcclxuICAgICAgICB0aGlzLm9wdGlvbnMgPSBbXTtcclxuICAgICAgICB0aGlzLm9wdGlvbnNWYWx1ZUZpZWxkID0gXCJcIjtcclxuICAgICAgICB0aGlzLm9wdGlvbnNEaXNwbGF5RmllbGQgPSBcIlwiO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5wYXJhbXMgJiYgdGhpcy5wYXJhbXMuY29sdW1uICYmIHRoaXMucGFyYW1zLmNvbHVtbi5jb2xEZWYpIHtcclxuICAgICAgICAgICAgdGhpcy5ncmlkVmFsdWVGaWVsZCA9IHRoaXMucGFyYW1zLmNvbHVtbi5jb2xEZWYuZmllbGQ7XHJcblxyXG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMgPSB0aGlzLnBhcmFtcy5jb2x1bW4uY29sRGVmLnNlbGVjdE9wdGlvbnM7XHJcbiAgICAgICAgICAgIHRoaXMub3B0aW9uc1ZhbHVlRmllbGQgPSB0aGlzLnBhcmFtcy5jb2x1bW4uY29sRGVmLnNlbGVjdE9wdGlvbnNWYWx1ZUZpZWxkO1xyXG4gICAgICAgICAgICB0aGlzLm9wdGlvbnNEaXNwbGF5RmllbGQgPSB0aGlzLnBhcmFtcy5jb2x1bW4uY29sRGVmLnNlbGVjdE9wdGlvbnNEaXNwbGF5RmllbGQ7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5wYXJhbXMuY29sdW1uLmNvbERlZi5zZWxlY3RPcHRpb25zUGVyUm93RmlsdGVyRnVuY3Rpb24pIHtcclxuICAgICAgICAgICAgICAgIGxldCBiYWNrdXAgPSB0aGlzLnNlbGVjdE9wdGlvbnNQZXJSb3dGaWx0ZXJGdW5jdGlvbjtcclxuICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RPcHRpb25zUGVyUm93RmlsdGVyRnVuY3Rpb24gPSB0aGlzLnBhcmFtcy5jb2x1bW4uY29sRGVmLnNlbGVjdE9wdGlvbnNQZXJSb3dGaWx0ZXJGdW5jdGlvbjtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnVzaW5nX3NlbGVjdE9wdGlvbnNQZXJSb3dGaWx0ZXJGdW5jdGlvbiA9ICEhdGhpcy5zZWxlY3RPcHRpb25zUGVyUm93RmlsdGVyRnVuY3Rpb247XHJcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcInNlbGVjdE9wdGlvbnNQZXJSb3dGaWx0ZXJGdW5jdGlvbiBvcHRpb24gaGFzIHdyb25nIHNpZ25hdHVyZSBmb3IgY29sdW1uIDogXCIgKyB0aGlzLnBhcmFtcy5jb2x1bW4uY29sRGVmLmhlYWRlck5hbWUgKyBcIlxcblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICsgXCIgIFJlcXVpcmVzIHNpZ25hdHVyZSAoY29udGV4dDphbnksIHJvd0RhdGE6IGFueSwgb3B0aW9uOiBhbnkpID0+IGJvb2xlYW5cIlxyXG4gICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RPcHRpb25zUGVyUm93RmlsdGVyRnVuY3Rpb24gPSBiYWNrdXA7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51c2luZ19zZWxlY3RPcHRpb25zUGVyUm93RmlsdGVyRnVuY3Rpb24gPSAhIWJhY2t1cDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5jb250ZXh0ID0gdGhpcy5wYXJhbXMuY29sdW1uLmNvbERlZi5jb250ZXh0O1xyXG5cclxuICAgICAgICAgICAgdGhpcy5maWxsR3JvdXBBdHRyaWJ1dGUgPSB0aGlzLnBhcmFtcy5jb2x1bW4uY29sRGVmLmZpbGxHcm91cEF0dHJpYnV0ZTtcclxuICAgICAgICAgICAgdGhpcy5maWxsQWxsID0gdGhpcy5wYXJhbXMuY29sdW1uLmNvbERlZi5maWxsQWxsICYmIChcIlwiICsgdGhpcy5wYXJhbXMuY29sdW1uLmNvbERlZi5maWxsQWxsKS50b0xvd2VyQ2FzZSgpICE9PSBcImZhbHNlXCI7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnNob3dGaWxsQnV0dG9uID0gdGhpcy5wYXJhbXMuY29sdW1uLmNvbERlZi5zaG93RmlsbEJ1dHRvbiAmJiAoXCJcIiArIHRoaXMucGFyYW1zLmNvbHVtbi5jb2xEZWYuc2hvd0ZpbGxCdXR0b24pLnRvTG93ZXJDYXNlKCkgIT09IFwiZmFsc2VcIjtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9vcHRpb25zXHJcbiAgICAgICAgICAgICAgICAmJiB0aGlzLnBhcmFtcy5ub2RlXHJcbiAgICAgICAgICAgICAgICAmJiB0aGlzLnBhcmFtcy5ub2RlLmRhdGFcclxuICAgICAgICAgICAgICAgICYmIHRoaXMudXNpbmdfc2VsZWN0T3B0aW9uc1BlclJvd0ZpbHRlckZ1bmN0aW9uKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5fZmlsdGVyZWRPcHRpb25zID0gdGhpcy5fb3B0aW9ucy5maWx0ZXIoKG9wdGlvbjogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0T3B0aW9uc1BlclJvd0ZpbHRlckZ1bmN0aW9uKHRoaXMuY29udGV4dCwgdGhpcy5wYXJhbXMubm9kZS5kYXRhLCBvcHRpb24pO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnBhcmFtcykge1xyXG4gICAgICAgICAgICB0aGlzLnZhbHVlID0gdGhpcy5wYXJhbXMudmFsdWUgPyBcIlwiICsgdGhpcy5wYXJhbXMudmFsdWUgOiBcIlwiO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuc2hvd0ZpbGxCdXR0b24gJiYgIXRoaXMuZmlsbEFsbCAmJiAoIXRoaXMuZmlsbEdyb3VwQXR0cmlidXRlIHx8IHRoaXMuZmlsbEdyb3VwQXR0cmlidXRlID09PSBcIlwiKSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIHN0YXRlLCBjYW5ub3QgdXNlIGZpbGwgYnV0dG9uIHdpdGhvdXQgc3BlY2lmeWluZyB0aGUgZmlsbEdyb3VwQXR0cmlidXRlIG9yIGZpbGxBbGwuXCIpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5wYXJhbXMgJiYgdGhpcy5wYXJhbXMubm9kZSAmJiB0aGlzLnBhcmFtcy5ub2RlWyh0aGlzLmdyaWRWYWx1ZUZpZWxkICsgXCJfb3JpZ2luYWxWYWx1ZVwiKV0pIHtcclxuICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHRoaXMucGFyYW1zLm5vZGVbKHRoaXMuZ3JpZFZhbHVlRmllbGQgKyBcIl9vcmlnaW5hbFZhbHVlXCIpXTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgb25DaGFuZ2UoZXZlbnQ6IGFueSk6IHZvaWQge1xyXG4gICAgICAgIGlmIChldmVudCAmJiBldmVudC5jdXJyZW50VGFyZ2V0KSB7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5wYXJhbXMgJiYgdGhpcy5wYXJhbXMubm9kZSAmJiAhdGhpcy5wYXJhbXMubm9kZVsodGhpcy5ncmlkVmFsdWVGaWVsZCArIFwiX29yaWdpbmFsVmFsdWVcIildKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnBhcmFtcy5ub2RlWyh0aGlzLmdyaWRWYWx1ZUZpZWxkICsgXCJfb3JpZ2luYWxWYWx1ZVwiKV0gPSB0aGlzLnZhbHVlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBUaGlzIGxvb2tzIHVubmVjZXNzYXJ5LCBzaW5jZSB0aGlzLnZhbHVlIGlzIGxpbmtlZCB0byB0aGUgdmFsdWUgb2YgdGhlIHNlbGVjdCBjb21wb25lbnQsIGJ1dFxyXG4gICAgICAgICAgICAvLyBiZWNhdXNlIHRoaXMgYWxzbyBlbmRzIGVkaXRpbmcsIGl0IGFsc28gcXVldWVzIHRoZSBkZXN0cnVjdGlvbiBvZiB0aGlzIGNvbXBvbmVudCBhbmQgdGhlIGNhbGwgdG8gZ2V0VmFsdWUuXHJcbiAgICAgICAgICAgIC8vIFRoZSBwcm9ibGVtIHdhcyB0aGF0IHRoaXMudmFsdWUgaXNuJ3QgdXBkYXRlZCB3aXRoIHRoZSBuZXcgdmFsdWUgYmVmb3JlIHRoaXMgZXZlbnQgZmlyZXMsXHJcbiAgICAgICAgICAgIC8vIHNvIHdlIG5lZWQgdG8gdXBkYXRlIGl0IG1hbnVhbGx5IGhlcmUuXHJcbiAgICAgICAgICAgIHRoaXMudmFsdWUgPSBldmVudC5jdXJyZW50VGFyZ2V0LnZhbHVlO1xyXG4gICAgICAgICAgICB0aGlzLnBhcmFtcy5ub2RlLnNldERhdGFWYWx1ZSh0aGlzLmdyaWRWYWx1ZUZpZWxkLCB0aGlzLnZhbHVlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMucGFyYW1zKSB7XHJcblxyXG4gICAgICAgICAgICAvLyAgSWYgdGhlIGZpbGwgYnV0dG9uLCB3aGljaCBpcyBwYXJ0IG9mIHRoZSBlZGl0b3IsIGlzIGFjdGl2YXRlZCwgZG9uJ3Qgc3RvcCBlZGl0aW5nXHJcbiAgICAgICAgICAgIC8vIGltbWVkaWF0ZWx5IGFmdGVyIG1ha2luZyBhIHNlbGVjdGlvbi5cclxuICAgICAgICAgICAgaWYgKCF0aGlzLnNob3dGaWxsQnV0dG9uKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnBhcmFtcy5zdG9wRWRpdGluZygpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGdldFZhbHVlKCk6IGFueSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMudmFsdWUgPyB0aGlzLnZhbHVlIDogXCJcIjtcclxuICAgIH1cclxuXHJcbiAgICBpc1BvcHVwKCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBvbkZpbGxCdXR0b25DbGlja2VkKCk6IHZvaWQge1xyXG4gICAgICAgIGlmICghdGhpcy5maWxsQWxsICYmICghdGhpcy5maWxsR3JvdXBBdHRyaWJ1dGUgfHwgdGhpcy5maWxsR3JvdXBBdHRyaWJ1dGUgPT09IFwiXCIpKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTm8gY29sdW1uIGF0dHJpYnV0ZSBcImZpbGxHcm91cEF0dHJpYnV0ZVwiIG9yIFwiZmlsbEFsbFwiIHNwZWNpZmllZC4gVGhpcyBpcyByZXF1aXJlZCB0byB1c2UgdGhlIEZpbGwgZnVuY3Rpb25hbGl0eS4nKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnBhcmFtcyAmJiB0aGlzLnBhcmFtcy5jb2x1bW4gJiYgdGhpcy5wYXJhbXMuY29sdW1uLmdyaWRBcGkgJiYgdGhpcy5wYXJhbXMubm9kZSAmJiAodGhpcy5maWxsQWxsIHx8ICh0aGlzLmZpbGxHcm91cEF0dHJpYnV0ZSAmJiB0aGlzLmZpbGxHcm91cEF0dHJpYnV0ZSAhPT0gXCJcIikpKSB7XHJcbiAgICAgICAgICAgIGxldCB0aGlzUm93Tm9kZSA9IHRoaXMucGFyYW1zLm5vZGU7XHJcblxyXG4gICAgICAgICAgICAvL3RoaXMuc3RhcnRTcGlubmVyRGlhbG9nKCk7XHJcbiAgICAgICAgICAgIHRoaXMucGFyYW1zLmNvbHVtbi5ncmlkQXBpLmZvckVhY2hOb2RlQWZ0ZXJGaWx0ZXIoKHJvd05vZGUpID0+IHtcclxuICAgICAgICAgICAgICAgIGlmIChyb3dOb2RlICYmIHJvd05vZGUuZGF0YSAmJiB0aGlzUm93Tm9kZSAmJiB0aGlzUm93Tm9kZS5kYXRhICYmICh0aGlzLmZpbGxBbGwgfHwgcm93Tm9kZS5kYXRhW3RoaXMuZmlsbEdyb3VwQXR0cmlidXRlXSA9PT0gdGhpc1Jvd05vZGUuZGF0YVt0aGlzLmZpbGxHcm91cEF0dHJpYnV0ZV0pKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHNwb29mZWRFdmVudDogYW55ID0ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhcGk6IHRoaXMucGFyYW1zLmNvbHVtbi5ncmlkQXBpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2xEZWY6IHRoaXMucGFyYW1zLmNvbHVtbi5jb2xEZWYsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbjogdGhpcy5wYXJhbXMuY29sdW1uLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5BcGk6IHRoaXMucGFyYW1zLmNvbHVtbi5jb2x1bW5BcGksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQ6IHVuZGVmaW5lZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogcm93Tm9kZS5kYXRhLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudDogbnVsbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgbmV3VmFsdWU6IHRoaXMudmFsdWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vZGU6IHJvd05vZGUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9sZFZhbHVlOiByb3dOb2RlLmRhdGFbdGhpcy5ncmlkVmFsdWVGaWVsZF0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvd0luZGV4OiByb3dOb2RlLnJvd0luZGV4LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICByb3dQaW5uZWQ6IHVuZGVmaW5lZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJjZWxsVmFsdWVDaGFuZ2VkXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiB0aGlzLnZhbHVlXHJcbiAgICAgICAgICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgcm93Tm9kZS5kYXRhW3RoaXMuZ3JpZFZhbHVlRmllbGRdID0gdGhpcy52YWx1ZTtcclxuICAgICAgICAgICAgICAgICAgICByb3dOb2RlLnNldERhdGFWYWx1ZSh0aGlzLmdyaWRWYWx1ZUZpZWxkLCB0aGlzLnZhbHVlKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnBhcmFtcy5jb2x1bW4uZ3JpZEFwaS5kaXNwYXRjaEV2ZW50KHNwb29mZWRFdmVudCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5wYXJhbXMuY29sdW1uLmdyaWRBcGkucmVmcmVzaENlbGxzKCk7XHJcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy90aGlzLnN0b3BTcGlubmVyRGlhbG9ncygpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG5cdC8qXHJcbiAgICBzdGFydFNwaW5uZXJEaWFsb2coKTogTWF0RGlhbG9nUmVmPFNwaW5uZXJEaWFsb2dDb21wb25lbnQ+IHtcclxuICAgICAgICBpZiAodGhpcy5fc3Bpbm5lckRpYWxvZ0lzT3Blbikge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuX3NwaW5uZXJEaWFsb2dJc09wZW4gPSB0cnVlO1xyXG5cclxuICAgICAgICBsZXQgY29uZmlndXJhdGlvbjogTWF0RGlhbG9nQ29uZmlnID0gbmV3IE1hdERpYWxvZ0NvbmZpZygpO1xyXG4gICAgICAgIGNvbmZpZ3VyYXRpb24uZGF0YSA9IHtcclxuICAgICAgICAgICAgbWVzc2FnZTogXCJQbGVhc2Ugd2FpdC4uLlwiLFxyXG4gICAgICAgICAgICBzdHJva2VXaWR0aDogMyxcclxuICAgICAgICAgICAgZGlhbWV0ZXI6IDMwXHJcbiAgICAgICAgfTtcclxuICAgICAgICBjb25maWd1cmF0aW9uLndpZHRoID0gXCIxM2VtXCI7XHJcbiAgICAgICAgY29uZmlndXJhdGlvbi5kaXNhYmxlQ2xvc2UgPSB0cnVlO1xyXG5cclxuICAgICAgICBsZXQgZGlhbG9nUmVmOiBNYXREaWFsb2dSZWY8U3Bpbm5lckRpYWxvZ0NvbXBvbmVudD4gPSB0aGlzLmRpYWxvZy5vcGVuKFNwaW5uZXJEaWFsb2dDb21wb25lbnQsIGNvbmZpZ3VyYXRpb24pO1xyXG4gICAgICAgIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnN1YnNjcmliZSgoKSA9PiB7IHRoaXMuX3NwaW5uZXJEaWFsb2dJc09wZW4gPSBmYWxzZTsgfSk7XHJcbiAgICAgICAgdGhpcy5zcGlubmVyRGlhbG9nUmVmcy5wdXNoKGRpYWxvZ1JlZik7XHJcblxyXG4gICAgICAgIHJldHVybiBkaWFsb2dSZWY7XHJcbiAgICB9XHJcblxyXG4gICAgc3RvcFNwaW5uZXJEaWFsb2dzKCk6IHZvaWQge1xyXG4gICAgICAgIGZvciAobGV0IGRpYWxvZ1JlZiBvZiB0aGlzLnNwaW5uZXJEaWFsb2dSZWZzKSB7XHJcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgZGlhbG9nUmVmLmNsb3NlKCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnNwaW5uZXJEaWFsb2dSZWZzID0gW107XHJcbiAgICB9XHJcblx0Ki9cclxufVxyXG4iXX0=
|
|
70
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0LmVkaXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2RpY3Rpb25hcnktZWRpdG9yL3NyYy9ncmlkLWVkaXRvcnMvc2VsZWN0LmVkaXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsU0FBUyxFQUFZLE1BQU0sZUFBZSxDQUFDOzs7O0FBd0RuRCxNQUFNLE9BQU8sWUFBWTtJQVFyQixvREFBb0Q7SUFFcEQsZ0JBQWdCLENBQUM7SUFFakIsTUFBTSxDQUFDLE1BUUY7UUFDRCxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUNyQixJQUFJLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUM7UUFDOUIsSUFBSSxDQUFDLFVBQVUsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDO1FBQ3BDLElBQUksQ0FBQyxZQUFZLEdBQUcsTUFBTSxDQUFDLFlBQVksQ0FBQztRQUV4QyxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNkLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDcEUsQ0FBQztJQUVMLENBQUM7SUFFRCxRQUFRLENBQUMsS0FBVTtJQUVuQixDQUFDO0lBRUQsUUFBUTtRQUNKLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDOUQsQ0FBQztJQUVELE9BQU87UUFDSCxPQUFPLEtBQUssQ0FBQztJQUNqQixDQUFDOytHQTFDUSxZQUFZO21HQUFaLFlBQVksb0RBaERiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O09BbUJMOzs0RkE2Qk0sWUFBWTtrQkFuRHhCLFNBQVM7K0JBR0U7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7T0FtQkwiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0NvbXBvbmVudCwgT25EZXN0cm95fSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQge0lDZWxsRWRpdG9yQW5ndWxhckNvbXB9IGZyb20gXCJhZy1ncmlkLWFuZ3VsYXJcIjtcclxuaW1wb3J0IHtFdmVudHMsIElDZWxsRWRpdG9yUGFyYW1zfSBmcm9tICdhZy1ncmlkLWNvbW11bml0eSc7XHJcblxyXG5cclxuQENvbXBvbmVudChcclxuICAgIHtcclxuICAgICAgICB0ZW1wbGF0ZTpcclxuICAgICAgICAgICAgYFxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmdWxsLXdpZHRoIGZ1bGwtaGVpZ2h0IGZsZXgtY29sdW1uLWNvbnRhaW5lclwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZ1bGwtaGVpZ2h0IGZsZXgtc3RyZXRjaCBmbGV4LXJvd1wiPlxyXG4gICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwiZnVsbC13aWR0aCBmdWxsLWhlaWdodFwiIFsobmdNb2RlbCldPVwicGFyYW1zLnZhbHVlXCIgKGNoYW5nZSk9XCJvbkNoYW5nZSgkZXZlbnQpXCI+XHJcbiAgICAgICAgICAgICAgPG9wdGlvbiBoaWRkZW4+XHJcbiAgICAgICAgICAgICAgICBTZWxlY3QgQW4gT3B0aW9uXHJcbiAgICAgICAgICAgICAgPC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgPCEtLSBCbGFuayBPcHRpb24gLS0+XHJcbiAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIlwiPlxyXG5cclxuICAgICAgICAgICAgICA8L29wdGlvbj5cclxuICAgICAgICAgICAgICA8b3B0aW9uXHJcbiAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIG9wdGlvbnNcIlxyXG4gICAgICAgICAgICAgICAgdmFsdWU9XCJ7e29wdGlvbi5oYXNPd25Qcm9wZXJ0eSh2YWx1ZUZpZWxkKSA/IG9wdGlvblt2YWx1ZUZpZWxkXSA6IChvcHRpb24udmFsdWUpID8gb3B0aW9uLnZhbHVlIDogb3B0aW9uIH19XCI+XHJcbiAgICAgICAgICAgICAgICB7e29wdGlvbi5oYXNPd25Qcm9wZXJ0eShkaXNwbGF5RmllbGQpID8gb3B0aW9uW2Rpc3BsYXlGaWVsZF0gOiAob3B0aW9uLmRpc3BsYXkpID8gb3B0aW9uLmRpc3BsYXkgOiBvcHRpb24gfX1cclxuICAgICAgICAgICAgICA8L29wdGlvbj5cclxuICAgICAgICAgICAgPC9zZWxlY3Q+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgYFxyXG4gICAgICAgICxcclxuICAgICAgICBzdHlsZXM6IFtcclxuICAgICAgICAgICAgYFxyXG4gICAgICAgIC5mdWxsLXdpZHRoIHtcclxuICAgICAgICAgIHdpZHRoOiAxMDAlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLmZ1bGwtaGVpZ2h0IHtcclxuICAgICAgICAgIGhlaWdodDogMTAwJTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC5mbGV4LWNvbHVtbi1jb250YWluZXIge1xyXG4gICAgICAgICAgZGlzcGxheTogZmxleDtcclxuICAgICAgICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAuZmxleC1yb3cge1xyXG4gICAgICAgICAgZGlzcGxheTogZmxleDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC5mbGV4LXN0cmV0Y2gge1xyXG4gICAgICAgICAgZGlzcGxheTogZmxleDtcclxuICAgICAgICAgIGZsZXg6IDE7XHJcbiAgICAgICAgfVxyXG4gICAgICBgXHJcbiAgICAgICAgXVxyXG4gICAgfVxyXG4pXHJcbmV4cG9ydCBjbGFzcyBTZWxlY3RFZGl0b3IgaW1wbGVtZW50cyBJQ2VsbEVkaXRvckFuZ3VsYXJDb21wIHtcclxuICAgIHB1YmxpYyBwYXJhbXM6IElDZWxsRWRpdG9yUGFyYW1zO1xyXG4gICAgcHVibGljIHZhbHVlOiBhbnk7XHJcbiAgICBwdWJsaWMgb3B0aW9uczogYW55W107XHJcblxyXG4gICAgcHVibGljIHZhbHVlRmllbGQ6IHN0cmluZztcclxuICAgIHB1YmxpYyBkaXNwbGF5RmllbGQ6IHN0cmluZztcclxuXHJcbiAgICAvLyB2YXJpYWJsZXMgdXNlZCBmb3IgdGhlIG9wdGlvbmFsIHBlci1yb3ctZmlsdGVyaW5nXHJcblxyXG4gICAgY29uc3RydWN0b3IoKSB7IH1cclxuXHJcbiAgICBhZ0luaXQocGFyYW1zOiBJQ2VsbEVkaXRvclBhcmFtcyAmXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBkaXNwbGF5RmllbGQ6IHN0cmluZyxcclxuICAgICAgICAgICAgdmFsdWVGaWVsZDogc3RyaW5nLFxyXG4gICAgICAgICAgICBvcHRpb25zOiBhbnlbXSxcclxuICAgICAgICAgICAgZGlzcGxheU9yZGVyOiBhbnksXHJcbiAgICAgICAgICAgIGRpY3Rpb25hcnlEaXNwbGF5OiBhbnksXHJcbiAgICAgICAgICAgIGRpY3Rpb25hcnlUb29sdGlwOiBhbnksXHJcbiAgICAgICAgfSk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMucGFyYW1zID0gcGFyYW1zO1xyXG4gICAgICAgIHRoaXMub3B0aW9ucyA9IHBhcmFtcy5vcHRpb25zO1xyXG4gICAgICAgIHRoaXMudmFsdWVGaWVsZCA9IHBhcmFtcy52YWx1ZUZpZWxkO1xyXG4gICAgICAgIHRoaXMuZGlzcGxheUZpZWxkID0gcGFyYW1zLmRpc3BsYXlGaWVsZDtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMucGFyYW1zKSB7XHJcbiAgICAgICAgICAgIHRoaXMudmFsdWUgPSB0aGlzLnBhcmFtcy52YWx1ZSA/IFN0cmluZyh0aGlzLnBhcmFtcy52YWx1ZSkgOiBcIlwiO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9XHJcblxyXG4gICAgb25DaGFuZ2UoZXZlbnQ6IGFueSk6IHZvaWQge1xyXG5cclxuICAgIH1cclxuXHJcbiAgICBnZXRWYWx1ZSgpOiBhbnkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnBhcmFtcy52YWx1ZSA/IFN0cmluZyh0aGlzLnBhcmFtcy52YWx1ZSkgOiBcIlwiO1xyXG4gICAgfVxyXG5cclxuICAgIGlzUG9wdXAoKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG59XHJcbiJdfQ==
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { FormBuilder, FormControl, FormGroup } from "@angular/forms";
|
|
2
2
|
/**
|
|
3
3
|
* This class' purpose is to place FormControls on cells in the grid, and to link them by rows, and rows to the grid as a whole.
|
|
4
4
|
* It allows you to add validators for a cells' value and link an error type to an error message to display in a tooltip, or
|
|
@@ -20,7 +20,7 @@ import { UntypedFormBuilder, UntypedFormControl, UntypedFormGroup } from "@angul
|
|
|
20
20
|
* headerName: "Name",
|
|
21
21
|
* editable: false,
|
|
22
22
|
* width: 600,
|
|
23
|
-
*
|
|
23
|
+
* cellRenderer: TextAlignLeftMiddleRenderer,
|
|
24
24
|
* setErrors: (value: any,
|
|
25
25
|
* data: any,
|
|
26
26
|
* node: any,
|
|
@@ -56,7 +56,7 @@ export class CellRendererValidation {
|
|
|
56
56
|
}
|
|
57
57
|
agInit(params) {
|
|
58
58
|
this.params = params;
|
|
59
|
-
this.formBuilder = new
|
|
59
|
+
this.formBuilder = new FormBuilder();
|
|
60
60
|
if (this.params
|
|
61
61
|
&& this.params.node
|
|
62
62
|
&& this.params.node.gridApi
|
|
@@ -73,7 +73,6 @@ export class CellRendererValidation {
|
|
|
73
73
|
}
|
|
74
74
|
}
|
|
75
75
|
this.getErrorMessage();
|
|
76
|
-
this.agInit2(params);
|
|
77
76
|
}
|
|
78
77
|
refresh(params) {
|
|
79
78
|
return false;
|
|
@@ -114,7 +113,7 @@ export class CellRendererValidation {
|
|
|
114
113
|
|| (this.params.node.gridApi.formGroup
|
|
115
114
|
&& this.params.node.gridApi.formGroup.controls
|
|
116
115
|
&& this.params.node.gridApi.formGroup.controls.length != allNodes.length)) {
|
|
117
|
-
this.params.node.gridApi.formGroup = new
|
|
116
|
+
this.params.node.gridApi.formGroup = new FormGroup({});
|
|
118
117
|
}
|
|
119
118
|
if (this.params.node.gridApi.columnController
|
|
120
119
|
&& this.params.node.gridApi.columnController.columnDefs) {
|
|
@@ -143,9 +142,9 @@ export class CellRendererValidation {
|
|
|
143
142
|
&& column.colDef.field
|
|
144
143
|
&& (column.colDef.validators || column.colDef.setErrors)) {
|
|
145
144
|
node[column.colDef.field + "_errorMessage"] = '';
|
|
146
|
-
let formControl = new
|
|
145
|
+
let formControl = new FormControl(column.colDef.field + '_formControl', []);
|
|
147
146
|
if (!node.formGroup) {
|
|
148
|
-
node.formGroup = new
|
|
147
|
+
node.formGroup = new FormGroup({});
|
|
149
148
|
}
|
|
150
149
|
node.formGroup.addControl(column.colDef.field + '_formControl', formControl);
|
|
151
150
|
if (!Array.isArray(column.colDef.validators)) {
|
|
@@ -157,7 +156,7 @@ export class CellRendererValidation {
|
|
|
157
156
|
}
|
|
158
157
|
if (!this.params.node.gridApi.formGroup.contains('RowGroup_' + node.rowIndex)) {
|
|
159
158
|
if (!node.formGroup) {
|
|
160
|
-
node.formGroup = new
|
|
159
|
+
node.formGroup = new FormGroup({});
|
|
161
160
|
}
|
|
162
161
|
this.params.node.gridApi.formGroup.addControl('RowGroup_' + node.rowIndex, node.formGroup);
|
|
163
162
|
}
|
|
@@ -290,11 +289,11 @@ export class CellRendererValidation {
|
|
|
290
289
|
&& this.params.colDef.field
|
|
291
290
|
&& (this.params.colDef.validators || this.params.colDef.setErrors)) {
|
|
292
291
|
this.params.node[this.params.colDef.field + "_errorMessage"] = '';
|
|
293
|
-
let formControl = new
|
|
292
|
+
let formControl = new FormControl(this.params.colDef.field + '_formControl', []);
|
|
294
293
|
if (!this.params.node.formGroup) {
|
|
295
|
-
this.params.node.formGroup = new
|
|
294
|
+
this.params.node.formGroup = new FormGroup({});
|
|
296
295
|
if (!this.params.node.gridApi.formGroup) {
|
|
297
|
-
this.params.node.gridApi.formGroup = new
|
|
296
|
+
this.params.node.gridApi.formGroup = new FormGroup({});
|
|
298
297
|
}
|
|
299
298
|
else {
|
|
300
299
|
// check for any removed nodes & remove their validators if needed.
|
|
@@ -342,4 +341,4 @@ export class CellRendererValidation {
|
|
|
342
341
|
// Might need to trigger cell validation to run with the new validation.
|
|
343
342
|
}
|
|
344
343
|
}
|
|
345
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2VsbC1yZW5kZXJlci12YWxpZGF0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvZGljdGlvbmFyeS1lZGl0b3Ivc3JjL2dyaWQtcmVuZGVyZXJzL2NlbGwtcmVuZGVyZXItdmFsaWRhdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUMsa0JBQWtCLEVBQUUsa0JBQWtCLEVBQUUsZ0JBQWdCLEVBQWEsTUFBTSxnQkFBZ0IsQ0FBQztBQUVwRzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FrREc7QUFDSCxNQUFNLE9BQWdCLHNCQUFzQjtJQUE1QztRQUlXLGlCQUFZLEdBQVcsRUFBRSxDQUFDO0lBZ1hyQyxDQUFDO0lBNVdHLE1BQU0sQ0FBQyxNQUFXO1FBQ2QsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFDckIsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLGtCQUFrQixFQUFFLENBQUM7UUFFNUMsSUFBSSxJQUFJLENBQUMsTUFBTTtlQUNSLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSTtlQUNoQixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPO2VBQ3hCLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLEtBQUssU0FBUyxFQUFFLENBQUM7WUFFdEQsSUFBSSw0QkFBNEIsR0FBWSxLQUFLLENBQUM7WUFFbEQsS0FBSyxJQUFJLFNBQVMsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLEVBQUUsQ0FBQztnQkFDcEUsSUFBSSxTQUFTLENBQUMsZUFBZSxJQUFJLFNBQVMsQ0FBQyxlQUFlLEtBQUssSUFBSSxFQUFFLENBQUM7b0JBQ2xFLDRCQUE0QixHQUFHLElBQUksQ0FBQztnQkFDeEMsQ0FBQztZQUNMLENBQUM7WUFFRCxJQUFJ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SUFDNUUsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtJQ2VsbFJlbmRlcmVyQW5ndWxhckNvbXB9IGZyb20gXCJhZy1ncmlkLWFuZ3VsYXJcIjtcclxuaW1wb3J0IHtVbnR5cGVkRm9ybUJ1aWxkZXIsIFVudHlwZWRGb3JtQ29udHJvbCwgVW50eXBlZEZvcm1Hcm91cCwgVmFsaWRhdG9yc30gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XHJcblxyXG4vKipcclxuICogVGhpcyBjbGFzcycgcHVycG9zZSBpcyB0byBwbGFjZSBGb3JtQ29udHJvbHMgb24gY2VsbHMgaW4gdGhlIGdyaWQsIGFuZCB0byBsaW5rIHRoZW0gYnkgcm93cywgYW5kIHJvd3MgdG8gdGhlIGdyaWQgYXMgYSB3aG9sZS5cclxuICogSXQgYWxsb3dzIHlvdSB0byBhZGQgdmFsaWRhdG9ycyBmb3IgYSBjZWxscycgdmFsdWUgYW5kIGxpbmsgYW4gZXJyb3IgdHlwZSB0byBhbiBlcnJvciBtZXNzYWdlIHRvIGRpc3BsYXkgaW4gYSB0b29sdGlwLCBvclxyXG4gKiB5b3UgY2FuIHByb3ZpZGUgYSBmdW5jdGlvbiB0byB0ZXN0IHNvbWUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHJvdyBhbmQgcHJvdmlkZSBhbiBlcnJvciBtZXNzYWdlLlxyXG4gKlxyXG4gKiBUaGUgY2xhc3Mgd29ya3Mgb2ZmIG9mIGEgbnVtYmVyIG9mIHByb3BlcnRpZXMgYWRkZWQgdG8gdGhlIGNvbHVtbkRlZnMgaW4gdGhlIGFnLWdyaWQuXHJcbiAqXHJcbiAqIFdlIGFyZSBsb29raW5nIGZvciB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XHJcbiAqICAgMS4gZXJyb3JNZXNzYWdlSGVhZGVyIDogYSBzdHJpbmcgdG8gZGlzcGxheSBhdCB0aGUgdG9wIG9mIHRoZSBsaXN0IG9mIGFueSBlcnJvcnMgZm91bmQgZm9yIHRoZSBjZWxsXHJcbiAqICAgMi4gdmFsaWRhdG9ycyA6IGFuIGFycmF5IG9mIGFuZ3VsYXIgdmFsaWRhdG9ycyB0byBkZXNjcmliZSB0aGUgY2VsbCB2YWx1ZVxyXG4gKiAgIDMuIGVycm9yTmFtZUVycm9yTWVzc2FnZU1hcCA6IGFuIGFycmF5IG9mIG9iamVjdHMgd2l0aCBcImVycm9yTmFtZVwicyBhbmQgXCJlcnJvck1lc3NhZ2VcInMgdGhhdCBhcmUgdXNlZCB0byBjcmVhdGUgYSBkaXNwbGF5ZWQgbGlzdCBmb3IgdGhlIHVzZXJcclxuICogICA0LiBzZXRFcnJvcnM6IGEgZnVuY3Rpb24gd2l0aCB0aGUgc2lnbmF0dXJlOlxyXG4gKiAgICAgICAgICAgICAgICAgKHZhbHVlOiBhbnksIGRhdGE6IGFueSwgbm9kZTogYW55LCBjb2xEZWY6IGFueSwgcm93SW5kZXg6IGFueSwgZ3JpZEFwaTogYW55KSA9PiBzdHJpbmdcclxuICogICAgICAgICAgICAgICAgIHdoaWNoIGlzIGNhbGxlZCB0byBnZW5lcmF0ZSBhIGN1c3RvbSBlcnJvciBtZXNzYWdlLCBpZiBuZWVkZWQuIEFuIGVtcHR5IG9yIG51bGwgc3RyaW5nXHJcbiAqICAgICAgICAgICAgICAgICBpcyB0cmVhdGVkIGFzIG5vdCBiZWluZyBhbiBlcnJvci5cclxuICpcclxuICogRXhhbXBsZSBjb2x1bW4gZGVmaW5pdGlvbjpcclxuICogICAgICB7XHJcbiAqICAgICAgICAgIGhlYWRlck5hbWU6IFwiTmFtZVwiLFxyXG4gKiAgICAgICAgICBlZGl0YWJsZTogZmFsc2UsXHJcbiAqICAgICAgICAgIHdpZHRoOiA2MDAsXHJcbiAqICAgICAgICAgIGNlbGxSZW5kZXJlckZyYW1ld29yazogVGV4dEFsaWduTGVmdE1pZGRsZVJlbmRlcmVyLFxyXG4gKiAgICAgICAgICBzZXRFcnJvcnM6ICh2YWx1ZTogYW55LFxyXG4gKiAgICAgICAgICAgICAgICAgICAgICBkYXRhOiBhbnksXHJcbiAqICAgICAgICAgICAgICAgICAgICAgIG5vZGU6IGFueSxcclxuICogICAgICAgICAgICAgICAgICAgICAgY29sRGVmOiBhbnksXHJcbiAqICAgICAgICAgICAgICAgICAgICAgIHJvd0luZGV4OiBhbnksXHJcbiAqICAgICAgICAgICAgICAgICAgICAgIGdyaWRBcGk6IGFueSkgPT4ge1xyXG4gKiAgICAgICAgICAgICAgcmV0dXJuICh2YWx1ZSAmJiB2YWx1ZSA9PT0gJ1RFU1QnKSA/ICdJbnZhbGlkIG5hbWUnIDogJyc7XHJcbiAqICAgICAgICAgIH0sXHJcbiAqICAgICAgICAgIHZhbGlkYXRvcnM6IFsgVmFsaWRhdG9ycy5taW5MZW5ndGgoMTApIF0sXHJcbiAqICAgICAgICAgIGVycm9yTWVzc2FnZUhlYWRlcjogJ1Rlc3RpbmdUZXN0aW5nVGVzdGluZycsXHJcbiAqICAgICAgICAgIGVycm9yTmFtZUVycm9yTWVzc2FnZU1hcDogW1xyXG4gKiAgICAgICAgICAgICAgeyBlcnJvck5hbWU6ICdtaW5sZW5ndGgnLCBlcnJvck1lc3NhZ2U6ICdOYW1lIGlzIHRvbyBzaG9ydCcgfVxyXG4gKiAgICAgICAgICBdLFxyXG4gKiAgICAgICAgICBmaWVsZDogXCJuYW1lXCJcclxuICogICAgICB9XHJcbiAqXHJcbiAqIFRvIHVzZSB3aXRoIGEgbmV3IHJlbmRlcmVyLCBleHRlbmQgdGhpcyBjbGFzcywgZG8gbm90IG92ZXJyaWRlIGFnSW5pdCwgb3IgY2FsbCBzdXBlci5hZ0luaXQocGFyYW1zKSBmaXJzdC5cclxuICogKFlvdSBjYW4gdXNlIGFnSW5pdDIgaW5zdGVhZCwgY2FsbGVkIHJpZ2h0IGFmdGVyIGFnSW5pdCkuXHJcbiAqXHJcbiAqIFRvIGRpc3BsYXkgYSB0b29sdGlwIHdpdGggdGhlIGVycm9yIG1lc3NhZ2VzLCBpbmNsdWRlIGFuIGVsZW1lbnQgd2l0aCBhIG1hdFRvb2x0aXAgcG9pbnRpbmcgdG8gdGhpcy5lcnJvck1lc3NhZ2UsIGxpa2U6XHJcbiAqICAgICAgPGRpdiBbbWF0VG9vbHRpcF09XCJ0aGlzLmVycm9yTWVzc2FnZVwiIFttYXRUb29sdGlwU2hvd0RlbGF5XT1cIjMwMFwiIFttYXRUb29sdGlwSGlkZURlbGF5XT1cIjMwMFwiIC4uLlxyXG4gKiBGb3IgY2VsbCBoaWdobGlnaHRpbmcsIHlvdSBjYW4gYWRkIGEgQ1NTIGNsYXNzIHNvbWV0aGluZyBsaWtlIDpcclxuICogICAgICAuZXJyb3Ige1xyXG4gKiAgICAgIFx0YmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KHJnYmEoMjU1LDAsMCwwLjI1KSwgcmdiYSgyNTUsMCwwLDAuMjUpLCByZ2JhKDI1NSwwLDAsMC4yNSkpO1xyXG4gKiAgICAgIFx0Ym9yZGVyOiBzb2xpZCByZWQgMnB4O1xyXG4gKiAgICAgIH1cclxuICogICBhbmQgYSBjb25kaXRpb25hbCBjbGFzcyBvbiBhbiBlbGVtZW50IGluIHRoZSB0ZW1wbGF0ZSwgbGlrZSA6XHJcbiAqICAgICAgY2xhc3M9XCJ7e3RoaXMuZXJyb3JNZXNzYWdlICYmIHRoaXMuZXJyb3JNZXNzYWdlICE9PSAnJyA/ICdlcnJvcicgOiAnJ319XCJcclxuICovXHJcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBDZWxsUmVuZGVyZXJWYWxpZGF0aW9uIGltcGxlbWVudHMgSUNlbGxSZW5kZXJlckFuZ3VsYXJDb21wIHtcclxuXHJcbiAgICBwcm90ZWN0ZWQgcGFyYW1zOiBhbnk7XHJcblxyXG4gICAgcHVibGljIGVycm9yTWVzc2FnZTogc3RyaW5nID0gXCJcIjtcclxuXHJcbiAgICBmb3JtQnVpbGRlcjogVW50eXBlZEZvcm1CdWlsZGVyO1xyXG5cclxuICAgIGFnSW5pdChwYXJhbXM6IGFueSk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMucGFyYW1zID0gcGFyYW1zO1xyXG4gICAgICAgIHRoaXMuZm9ybUJ1aWxkZXIgPSBuZXcgVW50eXBlZEZvcm1CdWlsZGVyKCk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnBhcmFtc1xyXG4gICAgICAgICAgICAmJiB0aGlzLnBhcmFtcy5ub2RlXHJcbiAgICAgICAgICAgICYmIHRoaXMucGFyYW1zLm5vZGUuZ3JpZEFwaVxyXG4gICAgICAgICAgICAmJiB0aGlzLnBhcmFtcy5ub2RlLmdyaWRBcGkuZm9ybUdyb3VwID09PSB1bmRlZmluZWQpIHtcclxuXHJcbiAgICAgICAgICAgIGxldCBmb3VuZERlbGF5VmFsaWRhdGlvblByb3BlcnR5OiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgICAgICAgICBmb3IgKGxldCBjb2x1bW5EZWYgb2YgcGFyYW1zLm5vZGUuZ3JpZEFwaS5jb2x1bW5Db250cm9sbGVyLmNvbHVtbkRlZnMpIHtcclxuICAgICAgICAgICAgICAgIGlmIChjb2x1bW5EZWYuZGVsYXlWYWxpZGF0aW9uICYmIGNvbHVtbkRlZi5kZWxheVZhbGlkYXRpb24gPT09IHRydWUpIHtcclxuICAgICAgICAgICAgICAgICAgICBmb3VuZERlbGF5VmFsaWRhdGlvblByb3BlcnR5ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKCFmb3VuZERlbGF5VmFsaWRhdGlvblByb3BlcnR5KSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmRldGVybWluZUlmQWxsUm93c05lZWRWYWxpZGF0aW9uSW5BZHZhbmNlKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZUFsbEZvcm1Db250cm9scygpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmdldEVycm9yTWVzc2FnZSgpO1xyXG5cclxuICAgICAgICB0aGlzLmFnSW5pdDIocGFyYW1zKTtcclxuICAgIH1cclxuXHJcbiAgICBhYnN0cmFjdCBhZ0luaXQyKHBhcmFtcyk6IHZvaWQ7XHJcblxyXG5cclxuICAgIHJlZnJlc2gocGFyYW1zOiBhbnkpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gVGhpcyBmdW5jdGlvbiBpdGVyYXRlcyBvdmVyIGV2ZXJ5IGNlbGwgaW4gdGhlIGdyaWQgYW5kIHByZXBhcmVzIGFsbCB0aGVpciBuZWVkZWQgZm9ybUdyb3VwcyBhbmQgZm9ybUNvbnRyb2xzLlxyXG4gICAgLy9cclxuICAgIC8vIFRoaXMgd2FzIGRvbmUgdGhpcyB3YXkgKGluIHRoZSBjZWxsIHJlbmRlcmVyKSBmb3IgdGhyZWUgcmVhc29ucyA6XHJcbiAgICAvLyAgIDEuIFdlIG5lZWQgdG8gd2FpdCB1bnRpbCB0aGUgY29sdW1uIGFuZCByb3cgZGF0YSBoYXZlIGJlZW4gcHJvdmlkZWQgdG8gdGhlIGdyaWRcclxuICAgIC8vICAgMi4gV2UgZG9uJ3Qgd2FudCB0aGUgcHJvZ3JhbW1lciB0byBoYXZlIHRvIGltcGxlbWVudCBpdCB0aGVtc2VsdmVzIGV2ZXJ5IHRpbWUgdGhleSBjcmVhdGUgYSBncmlkXHJcbiAgICAvLyAgIDMuIFRoZSBncmlkIGRvZXMgbm90IGNyZWF0ZSBhbGwgdGhlIGNlbGwgcmVuZGVyZXJzIGluIGFkdmFuY2UsIGp1c3QgdGhvc2UgdGhhdCBmaXQgb24gdGhlIHNjcmVlblxyXG4gICAgLy8gICAgICAocGx1cyBhIGZldyBuZWFyYnkpIG1lYW5pbmcgd2UgY2FuJ3QganVzdCB1c2UgdGhlIGNlbGwgcmVuZGVyZXIncyBjb25zdHJ1Y3Rvciwgc2luY2Ugd2UgZG9uJ3RcclxuICAgIC8vICAgICAga25vdyBpZiB0aGUgaW5mb3JtYXRpb24gd2Ugc3RhcnQgd2l0aCBpcyB2YWxpZCBvbiBldmVyeSBzY3JlZW4sIGFuZCBiZWNhdXNlIHdlIGhhdmUgc29tZSBjYWxsc1xyXG4gICAgLy8gICAgICB0aGF0IHNlbmQgYmFjayB0aGUgZW50aXJlIGdyaWQncyB3b3J0aCBvZiBkYXRhLlxyXG4gICAgLy9cclxuICAgIC8vIFRoZXJlIG1heSBiZSBhIGJldHRlciB3YXkgdG8gZG8gdGhpcywgaW4gd2hpY2ggY2FzZSB0aGlzIHNob3VsZCBwcm9iYWJseSBiZSByZXBsYWNlZCFcclxuICAgIGNyZWF0ZUFsbEZvcm1Db250cm9scygpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5wYXJhbXNcclxuICAgICAgICAgICAgJiYgdGhpcy5wYXJhbXMuY29sdW1uXHJcbiAgICAgICAgICAgICYmIHRoaXMucGFyYW1zLmNvbHVtbi5jb2xEZWZcclxuICAgICAgICAgICAgJiYgdGhpcy5wYXJhbXMuZGF0YVxyXG4gICAgICAgICAgICAmJiB0aGlzLnBhcmFtcy5ub2RlXHJcbiAgICAgICAgICAgICYmIHRoaXMucGFyYW1zLm5vZGUuZ3JpZEFwaVxyXG4gICAgICAgICAgICAmJiB0aGlzLnBhcmFtcy5ub2RlLmdyaWRBcGkuZ2V0TW9kZWwoKSkge1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMucGFyYW1zLm5vZGUuZ3JpZEFwaS5ncmlkT3B0aW9uc1dyYXBwZXJcclxuICAgICAgICAgICAgICAgICYmIHRoaXMucGFyYW1zLm5vZGUuZ3JpZEFwaS5ncmlkT3B0aW9uc1dyYXBwZXIuZ3JpZE9wdGlvbnNcclxuICAgICAgICAgICAgICAgICYmICF0aGlzLnBhcmFtcy5ub2RlLmdyaWRBcGkuZ3JpZE9wdGlvbnNXcmFwcGVyLmdyaWRPcHRpb25zLl9ldmVudHNDaGFuZ2VkQnlDZWxsUmVuZGVyZXJWYWxpZGF0aW9uKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5jaGFuZ2VHcmlkT3B0aW9uc0V2ZW50cygpO1xyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMucGFyYW1zLm5vZGUuZ3JpZEFwaS5ncmlkT3B0aW9uc1dyYXBwZXIuZ3JpZE9wdGlvbnMuX2V2ZW50c0NoYW5nZWRCeUNlbGxSZW5kZXJlclZhbGlkYXRpb24gPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBsZXQgYWxsTm9kZXMgPSBbXTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLnBhcmFtcy5ub2RlLmdyaWRBcGkubW9kZV9uZWVkVG9WYWxpZGF0ZU9ubHlSZW5kZXJlZENlbGxzKSB7XHJcbiAgICAgICAgICAgICAgICBhbGxOb2RlcyA9IHRoaXMucGFyYW1zLm5vZGUuZ3JpZEFwaS5nZXRSZW5kZXJlZE5vZGVzKCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBhbGxOb2RlcyA9IHRoaXMucGFyYW1zLm5vZGUuZ3JpZEFwaS5nZXRNb2RlbCgpLnJvd3NUb0Rpc3BsYXk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICghdGhpcy5wYXJhbXMubm9kZS5ncmlkQXBpLmZvcm1Hcm91cFxyXG4gICAgICAgICAgICAgICAgfHwgKHRoaXMucGFyYW1zLm5vZGUuZ3JpZEFwaS5mb3JtR3JvdXBcclxuICAgICAgICAgICAgICAgICAgICAmJiB0aGlzLnBhcmFtcy5ub2RlLmdyaWRBcGkuZm9ybUdyb3VwLmNvbnRyb2xzXHJcbiAgICAgICAgICAgICAgICAgICAgJiYgdGhpcy5wYXJhbXMubm9kZS5ncmlkQXBpLmZvcm1Hcm91cC5jb250cm9scy5sZW5ndGggIT0gYWxsTm9kZXMubGVuZ3RoKSkge1xyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMucGFyYW1zLm5vZGUuZ3JpZEFwaS5mb3JtR3JvdXAgPSBuZXcgVW50eXBlZEZvcm1Hcm91cCh7fSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLnBhcmFtcy5ub2RlLmdyaWRBcGkuY29sdW1uQ29udHJvbGxlclxyXG4gICAgICAgICAgICAgICAgJiYgdGhpcy5wYXJhbXMubm9kZS5ncmlkQXBpLmNvbHVtbkNvbnRyb2xsZXIuY29sdW1uRGVmcykge1xyXG5cclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGNvbHVtbkRlZiBvZiB0aGlzLnBhcmFtcy5ub2RlLmdyaWRBcGkuY29sdW1uQ29udHJvbGxlci5jb2x1bW5EZWZzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbHVtbkRlZi5vdXRlckZvcm0gJiYgY29sdW1uRGVmLmZvcm1OYW1lKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY29sdW1uRGVmLm91dGVyRm9ybS5nZXQoY29sdW1uRGVmLmZvcm1OYW1lKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uRGVmLm91dGVyRm9ybS5hZGRDb250cm9sKGNvbHVtbkRlZi5mb3JtTmFtZSwgdGhpcy5wYXJhbXMubm9kZS5ncmlkQXBpLmZvcm1Hcm91cCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5EZWYub3V0ZXJGb3JtLnNldENvbnRyb2woY29sdW1uRGVmLmZvcm1OYW1lLCB0aGlzLnBhcmFtcy5ub2RlLmdyaWRBcGkuZm9ybUdyb3VwKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgbGV0IGNvbHVtbnM6IGFueVtdO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMucGFyYW1zICYmIHRoaXMucGFyYW1zLmNvbHVtbkFwaSAmJiB0aGlzLnBhcmFtcy5jb2x1bW5BcGkuY29sdW1uQ29udHJvbGxlcikge1xyXG4gICAgICAgICAgICAgICAgY29sdW1ucyA9IHRoaXMucGFyYW1zLmNvbHVtbkFwaS5jb2x1bW5Db250cm9sbGVyLmdyaWRDb2x1bW5zLmZpbHRlcigoY29sdW1uKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbHVtbi5jb2xEZWZcclxuICAgICAgICAgICAgICAgICAgICAgICAgJiYgY29sdW1uLmNvbERlZi5maWVsZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAmJiAoY29sdW1uLmNvbERlZi52YWxpZGF0b3JzIHx8IGNvbHVtbi5jb2xEZWYuc2V0RXJyb3JzKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBmb3IgKGxldCBub2RlIG9mIGFsbE5vZGVzKSB7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBjb2x1bW4gb2YgY29sdW1ucykge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChjb2x1bW4uY29sRGVmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICYmIGNvbHVtbi5jb2xEZWYuZmllbGRcclxuICAgICAgICAgICAgICAgICAgICAgICAgJiYgKGNvbHVtbi5jb2xEZWYudmFsaWRhdG9ycyB8fCBjb2x1bW4uY29sRGVmLnNldEVycm9ycykpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbm9kZVtjb2x1bW4uY29sRGVmLmZpZWxkICsgXCJfZXJyb3JNZXNzYWdlXCJdID0gJyc7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZm9ybUNvbnRyb2w6IFVudHlwZWRGb3JtQ29udHJvbCA9IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2woY29sdW1uLmNvbERlZi5maWVsZCArICdfZm9ybUNvbnRyb2wnLCBbXSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW5vZGUuZm9ybUdyb3VwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLmZvcm1Hcm91cCA9IG5ldyBVbnR5cGVkRm9ybUdyb3VwKHt9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5mb3JtR3JvdXAuYWRkQ29udHJvbChjb2x1bW4uY29sRGVmLmZpZWxkICsgJ19mb3JtQ29udHJvbCcsIGZvcm1Db250cm9sKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghQXJyYXkuaXNBcnJheShjb2x1bW4uY29sRGVmLnZhbGlkYXRvcnMpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW4uY29sRGVmLnZhbGlkYXRvcnMgPSBbY29sdW1uLmNvbERlZi52YWxpZGF0b3JzXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2wuc2V0VmFsaWRhdG9ycyhjb2x1bW4uY29sRGVmLnZhbGlkYXRvcnMpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVFcnJvck1lc3NhZ2UoZm9ybUNvbnRyb2wsIG5vZGUsIGNvbHVtbi5jb2xEZWYpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMucGFyYW1zLm5vZGUuZ3JpZEFwaS5mb3JtR3JvdXAuY29udGFpbnMoJ1Jvd0dyb3VwXycgKyBub2RlLnJvd0luZGV4KSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghbm9kZS5mb3JtR3JvdXApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5mb3JtR3JvdXAgPSBuZXcgVW50eXBlZEZvcm1Hcm91cCh7fSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGFyYW1zLm5vZGUuZ3JpZEFwaS5mb3JtR3JvdXAuYWRkQ29udHJvbCgnUm93R3JvdXBfJyArIG5vZGUucm93SW5kZXgsIG5vZGUuZm9ybUdyb3VwKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGNoYW5nZUdyaWRPcHRpb25zRXZlbnRzKCk6IHZvaWQge1xyXG4gICAgICAgIGlmICghdGhpcy5wYXJhbXNcclxuICAgICAgICAgICAgfHwgIXRoaXMucGFyYW1zLm5vZGVcclxuICAgICAgICAgICAgfHwgIXRoaXMucGFyYW1zLm5vZGUuZ3JpZEFwaVxyXG4gICAgICAgICAgICB8fCAhdGhpcy5wYXJhbXMubm9kZS5ncmlkQXBpLmdyaWRPcHRpb25zV3JhcHBlclxyXG4gICAgICAgICAgICB8fCAhdGhpcy5wYXJhbXMubm9kZS5ncmlkQXBpLmdyaWRPcHRpb25zV3JhcHBlci5ncmlkT3B0aW9ucykge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5wYXJhbXMubm9kZS5ncmlkQXBpLmdyaWRPcHRpb25zV3JhcHBlci5ncmlkT3B0aW9ucy5vblJvd0RhdGFDaGFuZ2VkKSB7XHJcbiAgICAgICAgICAgIHRoaXMucGFyYW1zLm5vZGUuZ3JpZEFwaS5ncmlkT3B0aW9uc1dyYXBwZXIuZ3JpZE9wdGlvbnMub25Sb3dEYXRhQ2hhbmdlZDIgPSB0aGlzLnBhcmFtcy5ub2RlLmdyaWRBcGkuZ3JpZE9wdGlvbnNXcmFwcGVyLmdyaWRPcHRpb25zLm9uUm93RGF0YUNoYW5nZWQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnBhcmFtcy5ub2RlLmdyaWRBcGkuZ3JpZE9wdGlvbnNXcmFwcGVyLmdyaWRPcHRpb25zLm9uUm93RGF0YUNoYW5nZWQgPSAoKGV2ZW50OiBhbnkpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5jcmVhdGVBbGxGb3JtQ29udHJvbHMoKTtcclxuICAgICAgICAgICAgdGhpcy5mZXRjaEVycm9yTWVzc2FnZXNGb3JDdXJyZW50bHlSZW5kZXJlZENlbGxzKCk7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5wYXJhbXMubm9kZS5ncmlkQXBpLmdyaWRPcHRpb25zV3JhcHBlci5ncmlkT3B0aW9ucy5vblJvd0RhdGFDaGFuZ2VkMikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5wYXJhbXMubm9kZS5ncmlkQXBpLmdyaWRPcHRpb25zV3JhcHBlci5ncmlkT3B0aW9ucy5vblJvd0RhdGFDaGFuZ2VkMihldmVudCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcblxyXG4gICAgICAgIGlmICh0aGlzLnBhcmFtcy5ub2RlLmdyaWRBcGkuZ3JpZE9wdGlvbnNXcmFwcGVyLmdyaWRPcHRpb25zLm9uR3JpZENvbHVtbnNDaGFuZ2VkKSB7XHJcbiAgICAgICAgICAgIHRoaXMucGFyYW1zLm5vZGUuZ3JpZEFwaS5ncmlkT3B0aW9uc1dyYXBwZXIuZ3JpZE9wdGlvbnMub25HcmlkQ29sdW1uc0NoYW5nZWQyID0gdGhpcy5wYXJhbXMubm9kZS5ncmlkQXBpLmdyaWRPcHRpb25zV3JhcHBlci5ncmlkT3B0aW9ucy5vbkdyaWRDb2x1bW5zQ2hhbmdlZDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMucGFyYW1zLm5vZGUuZ3JpZEFwaS5ncmlkT3B0aW9uc1dyYXBwZXIuZ3JpZE9wdGlvbnMub25HcmlkQ29sdW1uc0NoYW5nZWQgPSAoKGV2ZW50OiBhbnkpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5kZXRlcm1pbmVJZkFsbFJvd3NOZWVkVmFsaWRhdGlvbkluQWR2YW5jZSgpO1xyXG4gICAgICAgICAgICB0aGlzLmNyZWF0ZUFsbEZvcm1Db250cm9scygpO1xyXG4gICAgICAgICAgICB0aGlzLmZldGNoRXJyb3JNZXNzYWdlc0ZvckN1cnJlbnRseVJlbmRlcmVkQ2VsbHMoKTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLnBhcmFtcy5ub2RlLmdyaWRBcGkuZ3JpZE9wdGlvbnNXcmFwcGVyLmdyaWRPcHRpb25zLm9uR3JpZENvbHVtbnNDaGFuZ2VkMikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5wYXJhbXMubm9kZS5ncmlkQXBpLmdyaWRPcHRpb25zV3JhcHBlci5ncmlkT3B0aW9ucy5vbkdyaWRDb2x1bW5zQ2hhbmdlZDIoZXZlbnQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBnZXRFcnJvck1lc3NhZ2UoKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMucGFyYW1zXHJcbiAgICAgICAgICAgICYmIHRoaXMucGFyYW1zLm5vZGVcclxuICAgICAgICAgICAgJiYgdGhpcy5wYXJhbXMubm9kZS5mb3JtR3JvdXBcclxuICAgICAgICAgICAgJiYgdGhpcy5wYXJhbXMuY29sdW1uXHJcbiAgICAgICAgICAgICYmIHRoaXMucGFyYW1zLmNvbHVtbi5jb2xEZWZcclxuICAgICAgICAgICAgJiYgdGhpcy5wYXJhbXMuY29sdW1uLmNvbERlZi5maWVsZCkge1xyXG5cclxuICAgICAgICAgICAgbGV0IGZvcm1Db250cm9sID0gdGhpcy5wYXJhbXMubm9kZS5mb3JtR3JvdXAuZ2V0KHRoaXMucGFyYW1zLmNvbHVtbi5jb2xEZWYuZmllbGQgKyAnX2Zvcm1Db250cm9sJyk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUVycm9yTWVzc2FnZShmb3JtQ29udHJvbCwgdGhpcy5wYXJhbXMubm9kZSwgdGhpcy5wYXJhbXMuY29sdW1uLmNvbERlZik7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmVycm9yTWVzc2FnZSA9IHRoaXMucGFyYW1zLm5vZGVbdGhpcy5wYXJhbXMuY29sdW1uLmNvbERlZi5maWVsZCArIFwiX2Vycm9yTWVzc2FnZVwiXTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSByZWZyZXNoRm9ybUNvbnRyb2xWYWx1ZShmb3JtQ29udHJvbDogVW50eXBlZEZvcm1Db250cm9sLCBkYXRhOiBhbnksIGZpZWxkTmFtZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKGZvcm1Db250cm9sICYmIGRhdGEgJiYgZmllbGROYW1lICYmIGRhdGFbZmllbGROYW1lXSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIGZvcm1Db250cm9sLnNldFZhbHVlKGRhdGFbZmllbGROYW1lXSk7XHJcbiAgICAgICAgICAgIGZvcm1Db250cm9sLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSB1cGRhdGVFcnJvck1lc3NhZ2UoZm9ybUNvbnRyb2w6IFVudHlwZWRGb3JtQ29udHJvbCwgbm9kZTogYW55LCBjb2x1bW5EZWZpbml0aW9uOiBhbnkpOiBzdHJpbmcge1xyXG4gICAgICAgIGlmICghZm9ybUNvbnRyb2wgfHwgIW5vZGUgfHwgIWNvbHVtbkRlZmluaXRpb24pIHtcclxuICAgICAgICAgICAgcmV0dXJuICcnO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IGN1c3RvbUVycm9yTWVzc2FnZTogc3RyaW5nID0gJyc7XHJcblxyXG4gICAgICAgIGlmIChjb2x1bW5EZWZpbml0aW9uLnNldEVycm9ycykge1xyXG4gICAgICAgICAgICBjdXN0b21FcnJvck1lc3NhZ2UgPSBjb2x1bW5EZWZpbml0aW9uLnNldEVycm9ycyhcclxuICAgICAgICAgICAgICAgIG5vZGUuZGF0YVtjb2x1bW5EZWZpbml0aW9uLmZpZWxkXSxcclxuICAgICAgICAgICAgICAgIG5vZGUuZGF0YSxcclxuICAgICAgICAgICAgICAgIG5vZGUsXHJcbiAgICAgICAgICAgICAgICBjb2x1bW5EZWZpbml0aW9uLFxyXG4gICAgICAgICAgICAgICAgbm9kZS5yb3dJbmRleCxcclxuICAgICAgICAgICAgICAgIG5vZGUuZ3JpZEFwaVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IGVycm9yTWVzc2FnZU5hbWU6IHN0cmluZyA9IGNvbHVtbkRlZmluaXRpb24uZmllbGQgKyBcIl9lcnJvck1lc3NhZ2VcIjtcclxuXHJcbiAgICAgICAgdGhpcy5yZWZyZXNoRm9ybUNvbnRyb2xWYWx1ZShmb3JtQ29udHJvbCwgbm9kZS5kYXRhLCBjb2x1bW5EZWZpbml0aW9uLmZpZWxkKTtcclxuXHJcbiAgICAgICAgbm9kZVtlcnJvck1lc3NhZ2VOYW1lXSA9ICcnO1xyXG5cclxuICAgICAgICBpZiAoZm9ybUNvbnRyb2wuaW52YWxpZCB8fCAoY3VzdG9tRXJyb3JNZXNzYWdlICYmIGN1c3RvbUVycm9yTWVzc2FnZSAhPT0gJycpKSB7XHJcbiAgICAgICAgICAgIGlmIChjb2x1bW5EZWZpbml0aW9uLmVycm9yTWVzc2FnZUhlYWRlcikge1xyXG4gICAgICAgICAgICAgICAgbm9kZVtlcnJvck1lc3NhZ2VOYW1lXSArPSAnJyArIGNvbHVtbkRlZmluaXRpb24uZXJyb3JNZXNzYWdlSGVhZGVyICsgJ1xcbic7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBub2RlW2Vycm9yTWVzc2FnZU5hbWVdICs9XHJcbiAgICAgICAgICAgICAgICAgICAgJ0ludmFsaWQgdmFsdWUgXCInICsgbm9kZS5kYXRhW2NvbHVtbkRlZmluaXRpb24uZmllbGRdICsgJ1wiIGZvciBmaWVsZCAoJyArIGNvbHVtbkRlZmluaXRpb24uZmllbGQgKyAnKVxcbic7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChjb2x1bW5EZWZpbml0aW9uLmVycm9yTmFtZUVycm9yTWVzc2FnZU1hcCkge1xyXG4gICAgICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoY29sdW1uRGVmaW5pdGlvbi5lcnJvck5hbWVFcnJvck1lc3NhZ2VNYXApKSB7XHJcbiAgICAgICAgICAgICAgICBjb2x1bW5EZWZpbml0aW9uLmVycm9yTmFtZUVycm9yTWVzc2FnZU1hcCA9IFtjb2x1bW5EZWZpbml0aW9uLmVycm9yTmFtZUVycm9yTWVzc2FnZU1hcF07XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGZvciAobGV0IGVycm9yTmFtZUVycm9yTWVzc2FnZVBhaXIgb2YgY29sdW1uRGVmaW5pdGlvbi5lcnJvck5hbWVFcnJvck1lc3NhZ2VNYXApIHtcclxuICAgICAgICAgICAgICAgIGlmICghIWVycm9yTmFtZUVycm9yTWVzc2FnZVBhaXIuZXJyb3JOYW1lICYmICEhZXJyb3JOYW1lRXJyb3JNZXNzYWdlUGFpci5lcnJvck1lc3NhZ2UpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZm9ybUNvbnRyb2wuaGFzRXJyb3IoZXJyb3JOYW1lRXJyb3JNZXNzYWdlUGFpci5lcnJvck5hbWUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVbZXJyb3JNZXNzYWdlTmFtZV0gKz0gZXJyb3JOYW1lRXJyb3JNZXNzYWdlUGFpci5lcnJvck1lc3NhZ2UgKydcXG4nO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbm9kZVtlcnJvck1lc3NhZ2VOYW1lXSArPSBjdXN0b21FcnJvck1lc3NhZ2U7XHJcblxyXG4gICAgICAgIHJldHVybiBub2RlW2Vycm9yTWVzc2FnZU5hbWVdO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBkZXRlcm1pbmVJZkFsbFJvd3NOZWVkVmFsaWRhdGlvbkluQWR2YW5jZSgpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5wYXJhbXNcclxuICAgICAgICAgICAgJiYgdGhpcy5wYXJhbXMubm9kZVxyXG4gICAgICAgICAgICAmJiB0aGlzLnBhcmFtcy5ub2RlLmdyaWRBcGlcclxuICAgICAgICAgICAgJiYgdGhpcy5wYXJhbXMuY29sdW1uQXBpXHJcbiAgICAgICAgICAgICYmIHRoaXMucGFyYW1zLmNvbHVtbkFwaS5jb2x1bW5Db250cm9sbGVyXHJcbiAgICAgICAgICAgICYmIHRoaXMucGFyYW1zLmNvbHVtbkFwaS5jb2x1bW5Db250cm9sbGVyLmdyaWRDb2x1bW5zKSB7XHJcblxyXG4gICAgICAgICAgICBsZXQgY29sdW1ucyA9IHRoaXMucGFyYW1zLmNvbHVtbkFwaS5jb2x1bW5Db250cm9sbGVyLmdyaWRDb2x1bW5zLmZpbHRlcigoY29sdW1uKSA9PiB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gY29sdW1uLmNvbERlZlxyXG4gICAgICAgICAgICAgICAgICAgICYmIGNvbHVtbi5jb2xEZWYuZmllbGRcclxuICAgICAgICAgICAgICAgICAgICAmJiAoY29sdW1uLmNvbERlZi52YWxpZGF0b3JzIHx8IGNvbHVtbi5jb2xEZWYuc2V0RXJyb3JzKVxyXG4gICAgICAgICAgICAgICAgICAgICYmIGNvbHVtbi5jb2xEZWYuZWRpdGFibGUgPT09IHRydWVcclxuICAgICAgICAgICAgICAgICAgICAmJiAhKGNvbHVtbi5jb2xEZWYudmFsaWRhdGVPbmx5UmVuZGVyZWRDZWxsc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAmJiBjb2x1bW4uY29sRGVmLnZhbGlkYXRlT25seVJlbmRlcmVkQ2VsbHMgPT09IHRydWUpO1xyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMucGFyYW1zLm5vZGUuZ3JpZEFwaS5tb2RlX25lZWRUb1ZhbGlkYXRlT25seVJlbmRlcmVkQ2VsbHMgPSBBcnJheS5pc0FycmF5KGNvbHVtbnMpICYmIGNvbHVtbnMubGVuZ3RoID09PSAwO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgZmV0Y2hFcnJvck1lc3NhZ2VzRm9yQ3VycmVudGx5UmVuZGVyZWRDZWxscygpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5wYXJhbXNcclxuICAgICAgICAgICAgJiYgdGhpcy5wYXJhbXMubm9kZVxyXG4gICAgICAgICAgICAmJiB0aGlzLnBhcmFtcy5ub2RlLmdyaWRBcGkpIHtcclxuXHJcbiAgICAgICAgICAgIGxldCBnZXRDZWxsUmVuZGVyZXJQYXJhbXM6IGFueSA9IHsgcm93Tm9kZXM6IHRoaXMucGFyYW1zLm5vZGUuZ3JpZEFwaS5nZXRSZW5kZXJlZE5vZGVzKCkgfTtcclxuXHJcbiAgICAgICAgICAgIGZvciAobGV0IGNlbGxSZW5kZXJlciBvZiB0aGlzLnBhcmFtcy5ub2RlLmdyaWRBcGkuZ2V0Q2VsbFJlbmRlcmVySW5zdGFuY2VzKGdldENlbGxSZW5kZXJlclBhcmFtcykpIHtcclxuICAgICAgICAgICAgICAgIGlmIChjZWxsUmVuZGVyZXIuX2FnQXdhcmVDb21wb25lbnQgJiYgY2VsbFJlbmRlcmVyLl9hZ0F3YXJlQ29tcG9uZW50LmdldEVycm9yTWVzc2FnZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNlbGxSZW5kZXJlci5fYWdBd2FyZUNvbXBvbmVudC5nZXRFcnJvck1lc3NhZ2UoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgdXBkYXRlVmFsaWRhdGlvbigpOiB2b2lkIHtcclxuICAgICAgICBjb25zb2xlLmxvZyhcIlN1Y2Nlc3NmdWxseSByZWFjaGVkIVwiKTtcclxuICAgICAgICAvLyBhZGQgdGhpcyBmb3JtIGNvbnRyb2xcclxuXHJcbiAgICAgICAgbGV0IGNvbHVtbnMgPSB0aGlzLnBhcmFtcy5jb2x1bW5BcGkuY29sdW1uQ29udHJvbGxlci5ncmlkQ29sdW1ucy5maWx0ZXIoKGNvbHVtbikgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gY29sdW1uLmNvbERlZlxyXG4gICAgICAgICAgICAgICAgJiYgY29sdW1uLmNvbERlZi5maWVsZFxyXG4gICAgICAgICAgICAgICAgJiYgKGNvbHVtbi5jb2xEZWYudmFsaWRhdG9ycyB8fCBjb2x1bW4uY29sRGVmLnNldEVycm9ycylcclxuICAgICAgICAgICAgICAgICYmIGNvbHVtbi5jb2xEZWYuZmllbGQgPT09IHRoaXMucGFyYW1zLmZpZWxkO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5wYXJhbXMuY29sRGVmXHJcbiAgICAgICAgICAgICYmIHRoaXMucGFyYW1zLmNvbERlZi5maWVsZFxyXG4gICAgICAgICAgICAmJiAodGhpcy5wYXJhbXMuY29sRGVmLnZhbGlkYXRvcnMgfHwgdGhpcy5wYXJhbXMuY29sRGVmLnNldEVycm9ycykpIHtcclxuXHJcbiAgICAgICAgICAgIHRoaXMucGFyYW1zLm5vZGVbdGhpcy5wYXJhbXMuY29sRGVmLmZpZWxkICsgXCJfZXJyb3JNZXNzYWdlXCJdID0gJyc7XHJcblxyXG4gICAgICAgICAgICBsZXQgZm9ybUNvbnRyb2w6IFVudHlwZWRGb3JtQ29udHJvbCA9IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2wodGhpcy5wYXJhbXMuY29sRGVmLmZpZWxkICsgJ19mb3JtQ29udHJvbCcsIFtdKTtcclxuXHJcbiAgICAgICAgICAgIGlmICghdGhpcy5wYXJhbXMubm9kZS5mb3JtR3JvdXApIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucGFyYW1zLm5vZGUuZm9ybUdyb3VwID0gbmV3IFVudHlwZWRGb3JtR3JvdXAoe30pO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5wYXJhbXMubm9kZS5ncmlkQXBpLmZvcm1Hcm91cCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGFyYW1zLm5vZGUuZ3JpZEFwaS5mb3JtR3JvdXAgPSBuZXcgVW50eXBlZEZvcm1Hcm91cCh7fSk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIGZvciBhbnkgcmVtb3ZlZCBub2RlcyAmIHJlbW92ZSB0aGVpciB2YWxpZGF0b3JzIGlmIG5lZWRlZC5cclxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBjb250cm9sTmFtZSBvZiBPYmplY3Qua2V5cyh0aGlzLnBhcmFtcy5ub2RlLmdyaWRBcGkuZm9ybUdyb3VwLmNvbnRyb2xzKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKCcnICsgY29udHJvbE5hbWUpLnRvTG93ZXJDYXNlKCkuc3Vic3RyKDAsIDkpID09PSAncm93Z3JvdXBfJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGZvdW5kOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBub2RlIG9mIHRoaXMucGFyYW1zLm5vZGUuZ3JpZEFwaS5nZXRNb2RlbCgpLnJvd3NUb0Rpc3BsYXkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKCcnICsgbm9kZS5yb3dJbmRleCkgPT09ICgnJyArIGNvbnRyb2xOYW1lKS5zdWJzdHIoOSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWZvdW5kKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXJhbXMubm9kZS5ncmlkQXBpLmZvcm1Hcm91cC5yZW1vdmVDb250cm9sKGNvbnRyb2xOYW1lKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5wYXJhbXMubm9kZS5ncmlkQXBpLmZvcm1Hcm91cC5hZGRDb250cm9sKCdSb3dHcm91cF8nICsgdGhpcy5wYXJhbXMubm9kZS5yb3dJbmRleCwgdGhpcy5wYXJhbXMubm9kZS5mb3JtR3JvdXApO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoIXRoaXMucGFyYW1zLm5vZGUuZm9ybUdyb3VwLmNvbnRyb2xzW3RoaXMucGFyYW1zLmNvbERlZi5maWVsZCArICdfZm9ybUNvbnRyb2wnXSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5wYXJhbXMubm9kZS5mb3JtR3JvdXAuYWRkQ29udHJvbCh0aGlzLnBhcmFtcy5jb2xEZWYuZmllbGQgKyAnX2Zvcm1Db250cm9sJywgZm9ybUNvbnRyb2wpO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMucGFyYW1zLmNvbERlZi52YWxpZGF0b3JzKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGFyYW1zLm5vZGUuZm9ybUdyb3VwLmNvbnRyb2xzW3RoaXMucGFyYW1zLmNvbERlZi5maWVsZCArICdfZm9ybUNvbnRyb2wnXS5zZXRWYWxpZGF0b3JzKHRoaXMucGFyYW1zLmNvbERlZi52YWxpZGF0b3JzKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5wYXJhbXMubm9kZS5ncmlkQXBpLmNvbHVtbkNvbnRyb2xsZXJcclxuICAgICAgICAgICAgICAgICAgICAmJiB0aGlzLnBhcmFtcy5ub2RlLmdyaWRBcGkuY29sdW1uQ29udHJvbGxlci5jb2x1bW5EZWZzKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGNvbHVtbkRlZiBvZiB0aGlzLnBhcmFtcy5ub2RlLmdyaWRBcGkuY29sdW1uQ29udHJvbGxlci5jb2x1bW5EZWZzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2x1bW5EZWYub3V0ZXJGb3JtICYmIGNvbHVtbkRlZi5mb3JtTmFtZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjb2x1bW5EZWYub3V0ZXJGb3JtLmdldChjb2x1bW5EZWYuZm9ybU5hbWUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uRGVmLm91dGVyRm9ybS5hZGRDb250cm9sKGNvbHVtbkRlZi5mb3JtTmFtZSwgdGhpcy5wYXJhbXMubm9kZS5ncmlkQXBpLmZvcm1Hcm91cCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbkRlZi5vdXRlckZvcm0uc2V0Q29udHJvbChjb2x1bW5EZWYuZm9ybU5hbWUsIHRoaXMucGFyYW1zLm5vZGUuZ3JpZEFwaS5mb3JtR3JvdXApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUVycm9yTWVzc2FnZShmb3JtQ29udHJvbCwgdGhpcy5wYXJhbXMubm9kZSwgdGhpcy5wYXJhbXMuY29sRGVmKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIGFkZCBjb2x1bW4gY29udHJvbCBncm91cHMgaWYgbmVlZGVkXHJcbiAgICAgICAgLy8gYWRkIHJvdyBjb250cm9sIGdyb3VwcyBpZiBuZWVkZWRcclxuICAgICAgICAvLyBzZXR1cCBncmlkIGNvbnRyb2wgZ3JvdXAgaWYgbmVlZGVkXHJcbiAgICAgICAgLy8gTWlnaHQgbmVlZCB0byB0cmlnZ2VyIGNlbGwgdmFsaWRhdGlvbiB0byBydW4gd2l0aCB0aGUgbmV3IHZhbGlkYXRpb24uXHJcbiAgICB9XHJcbn1cclxuIl19
|
|
344
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2VsbC1yZW5kZXJlci12YWxpZGF0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvZGljdGlvbmFyeS1lZGl0b3Ivc3JjL2dyaWQtcmVuZGVyZXJzL2NlbGwtcmVuZGVyZXItdmFsaWRhdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUMsV0FBVyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQWEsTUFBTSxnQkFBZ0IsQ0FBQztBQUMvRTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FrREc7QUFDSCxNQUFNLE9BQWdCLHNCQUFzQjtJQUE1QztRQUVXLGlCQUFZLEdBQVcsRUFBRSxDQUFDO0lBK1ZyQyxDQUFDO0lBN1ZHLE1BQU0sQ0FBQyxNQUFXO1FBQ2QsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFDckIsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLFdBQVcsRUFBRSxDQUFDO1FBQ3JDLElBQUksSUFBSSxDQUFDLE1BQU07ZUFDUixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUk7ZUFDaEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTztlQUN4QixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBRXRELElBQUksNEJBQTRCLEdBQVksS0FBSyxDQUFDO1lBQ2xELEtBQUssSUFBSSxTQUFTLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxFQUFFLENBQUM7Z0JBQ3BFLElBQUksU0FBUyxDQUFDLGVBQWUsSUFBSSxTQUFTLENBQUMsZUFBZSxLQUFLLElBQUksRUFBRSxDQUFDO29CQUNsRSw0QkFBNEIsR0FBRyxJQUFJLENBQUM7Z0JBQ3hDLENBQUM7WUFDTCxDQUFDO1lBQ0QsSUFBSSxDQUFDLDRC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ckNvbXB9IGZyb20gXCJhZy1ncmlkLWFuZ3VsYXJcIjtcclxuaW1wb3J0IHtGb3JtQnVpbGRlciwgRm9ybUNvbnRyb2wsIEZvcm1Hcm91cCwgVmFsaWRhdG9yc30gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XHJcbi8qKlxyXG4gKiBUaGlzIGNsYXNzJyBwdXJwb3NlIGlzIHRvIHBsYWNlIEZvcm1Db250cm9scyBvbiBjZWxscyBpbiB0aGUgZ3JpZCwgYW5kIHRvIGxpbmsgdGhlbSBieSByb3dzLCBhbmQgcm93cyB0byB0aGUgZ3JpZCBhcyBhIHdob2xlLlxyXG4gKiBJdCBhbGxvd3MgeW91IHRvIGFkZCB2YWxpZGF0b3JzIGZvciBhIGNlbGxzJyB2YWx1ZSBhbmQgbGluayBhbiBlcnJvciB0eXBlIHRvIGFuIGVycm9yIG1lc3NhZ2UgdG8gZGlzcGxheSBpbiBhIHRvb2x0aXAsIG9yXHJcbiAqIHlvdSBjYW4gcHJvdmlkZSBhIGZ1bmN0aW9uIHRvIHRlc3Qgc29tZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcm93IGFuZCBwcm92aWRlIGFuIGVycm9yIG1lc3NhZ2UuXHJcbiAqXHJcbiAqIFRoZSBjbGFzcyB3b3JrcyBvZmYgb2YgYSBudW1iZXIgb2YgcHJvcGVydGllcyBhZGRlZCB0byB0aGUgY29sdW1uRGVmcyBpbiB0aGUgYWctZ3JpZC5cclxuICpcclxuICogV2UgYXJlIGxvb2tpbmcgZm9yIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcclxuICogICAxLiBlcnJvck1lc3NhZ2VIZWFkZXIgOiBhIHN0cmluZyB0byBkaXNwbGF5IGF0IHRoZSB0b3Agb2YgdGhlIGxpc3Qgb2YgYW55IGVycm9ycyBmb3VuZCBmb3IgdGhlIGNlbGxcclxuICogICAyLiB2YWxpZGF0b3JzIDogYW4gYXJyYXkgb2YgYW5ndWxhciB2YWxpZGF0b3JzIHRvIGRlc2NyaWJlIHRoZSBjZWxsIHZhbHVlXHJcbiAqICAgMy4gZXJyb3JOYW1lRXJyb3JNZXNzYWdlTWFwIDogYW4gYXJyYXkgb2Ygb2JqZWN0cyB3aXRoIFwiZXJyb3JOYW1lXCJzIGFuZCBcImVycm9yTWVzc2FnZVwicyB0aGF0IGFyZSB1c2VkIHRvIGNyZWF0ZSBhIGRpc3BsYXllZCBsaXN0IGZvciB0aGUgdXNlclxyXG4gKiAgIDQuIHNldEVycm9yczogYSBmdW5jdGlvbiB3aXRoIHRoZSBzaWduYXR1cmU6XHJcbiAqICAgICAgICAgICAgICAgICAodmFsdWU6IGFueSwgZGF0YTogYW55LCBub2RlOiBhbnksIGNvbERlZjogYW55LCByb3dJbmRleDogYW55LCBncmlkQXBpOiBhbnkpID0+IHN0cmluZ1xyXG4gKiAgICAgICAgICAgICAgICAgd2hpY2ggaXMgY2FsbGVkIHRvIGdlbmVyYXRlIGEgY3VzdG9tIGVycm9yIG1lc3NhZ2UsIGlmIG5lZWRlZC4gQW4gZW1wdHkgb3IgbnVsbCBzdHJpbmdcclxuICogICAgICAgICAgICAgICAgIGlzIHRyZWF0ZWQgYXMgbm90IGJlaW5nIGFuIGVycm9yLlxyXG4gKlxyXG4gKiBFeGFtcGxlIGNvbHVtbiBkZWZpbml0aW9uOlxyXG4gKiAgICAgIHtcclxuICogICAgICAgICAgaGVhZGVyTmFtZTogXCJOYW1lXCIsXHJcbiAqICAgICAgICAgIGVkaXRhYmxlOiBmYWxzZSxcclxuICogICAgICAgICAgd2lkdGg6IDYwMCxcclxuICogICAgICAgICAgY2VsbFJlbmRlcmVyOiBUZXh0QWxpZ25MZWZ0TWlkZGxlUmVuZGVyZXIsXHJcbiAqICAgICAgICAgIHNldEVycm9yczogKHZhbHVlOiBhbnksXHJcbiAqICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IGFueSxcclxuICogICAgICAgICAgICAgICAgICAgICAgbm9kZTogYW55LFxyXG4gKiAgICAgICAgICAgICAgICAgICAgICBjb2xEZWY6IGFueSxcclxuICogICAgICAgICAgICAgICAgICAgICAgcm93SW5kZXg6IGFueSxcclxuICogICAgICAgICAgICAgICAgICAgICAgZ3JpZEFwaTogYW55KSA9PiB7XHJcbiAqICAgICAgICAgICAgICByZXR1cm4gKHZhbHVlICYmIHZhbHVlID09PSAnVEVTVCcpID8gJ0ludmFsaWQgbmFtZScgOiAnJztcclxuICogICAgICAgICAgfSxcclxuICogICAgICAgICAgdmFsaWRhdG9yczogWyBWYWxpZGF0b3JzLm1pbkxlbmd0aCgxMCkgXSxcclxuICogICAgICAgICAgZXJyb3JNZXNzYWdlSGVhZGVyOiAnVGVzdGluZ1Rlc3RpbmdUZXN0aW5nJyxcclxuICogICAgICAgICAgZXJyb3JOYW1lRXJyb3JNZXNzYWdlTWFwOiBbXHJcbiAqICAgICAgICAgICAgICB7IGVycm9yTmFtZTogJ21pbmxlbmd0aCcsIGVycm9yTWVzc2FnZTogJ05hbWUgaXMgdG9vIHNob3J0JyB9XHJcbiAqICAgICAgICAgIF0sXHJcbiAqICAgICAgICAgIGZpZWxkOiBcIm5hbWVcIlxyXG4gKiAgICAgIH1cclxuICpcclxuICogVG8gdXNlIHdpdGggYSBuZXcgcmVuZGVyZXIsIGV4dGVuZCB0aGlzIGNsYXNzLCBkbyBub3Qgb3ZlcnJpZGUgYWdJbml0LCBvciBjYWxsIHN1cGVyLmFnSW5pdChwYXJhbXMpIGZpcnN0LlxyXG4gKiAoWW91IGNhbiB1c2UgYWdJbml0MiBpbnN0ZWFkLCBjYWxsZWQgcmlnaHQgYWZ0ZXIgYWdJbml0KS5cclxuICpcclxuICogVG8gZGlzcGxheSBhIHRvb2x0aXAgd2l0aCB0aGUgZXJyb3IgbWVzc2FnZXMsIGluY2x1ZGUgYW4gZWxlbWVudCB3aXRoIGEgbWF0VG9vbHRpcCBwb2ludGluZyB0byB0aGlzLmVycm9yTWVzc2FnZSwgbGlrZTpcclxuICogICAgICA8ZGl2IFttYXRUb29sdGlwXT1cInRoaXMuZXJyb3JNZXNzYWdlXCIgW21hdFRvb2x0aXBTaG93RGVsYXldPVwiMzAwXCIgW21hdFRvb2x0aXBIaWRlRGVsYXldPVwiMzAwXCIgLi4uXHJcbiAqIEZvciBjZWxsIGhpZ2hsaWdodGluZywgeW91IGNhbiBhZGQgYSBDU1MgY2xhc3Mgc29tZXRoaW5nIGxpa2UgOlxyXG4gKiAgICAgIC5lcnJvciB7XHJcbiAqICAgICAgXHRiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQocmdiYSgyNTUsMCwwLDAuMjUpLCByZ2JhKDI1NSwwLDAsMC4yNSksIHJnYmEoMjU1LDAsMCwwLjI1KSk7XHJcbiAqICAgICAgXHRib3JkZXI6IHNvbGlkIHJlZCAycHg7XHJcbiAqICAgICAgfVxyXG4gKiAgIGFuZCBhIGNvbmRpdGlvbmFsIGNsYXNzIG9uIGFuIGVsZW1lbnQgaW4gdGhlIHRlbXBsYXRlLCBsaWtlIDpcclxuICogICAgICBjbGFzcz1cInt7dGhpcy5lcnJvck1lc3NhZ2UgJiYgdGhpcy5lcnJvck1lc3NhZ2UgIT09ICcnID8gJ2Vycm9yJyA6ICcnfX1cIlxyXG4gKi9cclxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIENlbGxSZW5kZXJlclZhbGlkYXRpb24gaW1wbGVtZW50cyBJQ2VsbFJlbmRlcmVyQW5ndWxhckNvbXAge1xyXG4gICAgcHJvdGVjdGVkIHBhcmFtczogYW55O1xyXG4gICAgcHVibGljIGVycm9yTWVzc2FnZTogc3RyaW5nID0gXCJcIjtcclxuICAgIGZvcm1CdWlsZGVyOiBGb3JtQnVpbGRlcjtcclxuICAgIGFnSW5pdChwYXJhbXM6IGFueSk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMucGFyYW1zID0gcGFyYW1zO1xyXG4gICAgICAgIHRoaXMuZm9ybUJ1aWxkZXIgPSBuZXcgRm9ybUJ1aWxkZXIoKTtcclxuICAgICAgICBpZiAodGhpcy5wYXJhbXNcclxuICAgICAgICAgICAgJiYgdGhpcy5wYXJhbXMubm9kZVxyXG4gICAgICAgICAgICAmJiB0aGlzLnBhcmFtcy5ub2RlLmdyaWRBcGlcclxuICAgICAgICAgICAgJiYgdGhpcy5wYXJhbXMubm9kZS5ncmlkQXBpLmZvcm1Hcm91cCA9PT0gdW5kZWZpbmVkKSB7XHJcblxyXG4gICAgICAgICAgICBsZXQgZm91bmREZWxheVZhbGlkYXRpb25Qcm9wZXJ0eTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgICAgICAgICBmb3IgKGxldCBjb2x1bW5EZWYgb2YgcGFyYW1zLm5vZGUuZ3JpZEFwaS5jb2x1bW5Db250cm9sbGVyLmNvbHVtbkRlZnMpIHtcclxuICAgICAgICAgICAgICAgIGlmIChjb2x1bW5EZWYuZGVsYXlWYWxpZGF0aW9uICYmIGNvbHVtbkRlZi5kZWxheVZhbGlkYXRpb24gPT09IHRydWUpIHtcclxuICAgICAgICAgICAgICAgICAgICBmb3VuZERlbGF5VmFsaWRhdGlvblByb3BlcnR5ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoIWZvdW5kRGVsYXlWYWxpZGF0aW9uUHJvcGVydHkpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZGV0ZXJtaW5lSWZBbGxSb3dzTmVlZFZhbGlkYXRpb25JbkFkdmFuY2UoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlQWxsRm9ybUNvbnRyb2xzKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5nZXRFcnJvck1lc3NhZ2UoKTtcclxuICAgIH1cclxuICAgIHJlZnJlc2gocGFyYW1zOiBhbnkpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICAvLyBUaGlzIGZ1bmN0aW9uIGl0ZXJhdGVzIG92ZXIgZXZlcnkgY2VsbCBpbiB0aGUgZ3JpZCBhbmQgcHJlcGFyZXMgYWxsIHRoZWlyIG5lZWRlZCBmb3JtR3JvdXBzIGFuZCBmb3JtQ29udHJvbHMuXHJcbiAgICAvL1xyXG4gICAgLy8gVGhpcyB3YXMgZG9uZSB0aGlzIHdheSAoaW4gdGhlIGNlbGwgcmVuZGVyZXIpIGZvciB0aHJlZSByZWFzb25zIDpcclxuICAgIC8vICAgMS4gV2UgbmVlZCB0byB3YWl0IHVudGlsIHRoZSBjb2x1bW4gYW5kIHJvdyBkYXRhIGhhdmUgYmVlbiBwcm92aWRlZCB0byB0aGUgZ3JpZFxyXG4gICAgLy8gICAyLiBXZSBkb24ndCB3YW50IHRoZSBwcm9ncmFtbWVyIHRvIGhhdmUgdG8gaW1wbGVtZW50IGl0IHRoZW1zZWx2ZXMgZXZlcnkgdGltZSB0aGV5IGNyZWF0ZSBhIGdyaWRcclxuICAgIC8vICAgMy4gVGhlIGdyaWQgZG9lcyBub3QgY3JlYXRlIGFsbCB0aGUgY2VsbCByZW5kZXJlcnMgaW4gYWR2YW5jZSwganVzdCB0aG9zZSB0aGF0IGZpdCBvbiB0aGUgc2NyZWVuXHJcbiAgICAvLyAgICAgIChwbHVzIGEgZmV3IG5lYXJieSkgbWVhbmluZyB3ZSBjYW4ndCBqdXN0IHVzZSB0aGUgY2VsbCByZW5kZXJlcidzIGNvbnN0cnVjdG9yLCBzaW5jZSB3ZSBkb24ndFxyXG4gICAgLy8gICAgICBrbm93IGlmIHRoZSBpbmZvcm1hdGlvbiB3ZSBzdGFydCB3aXRoIGlzIHZhbGlkIG9uIGV2ZXJ5IHNjcmVlbiwgYW5kIGJlY2F1c2Ugd2UgaGF2ZSBzb21lIGNhbGxzXHJcbiAgICAvLyAgICAgIHRoYXQgc2VuZCBiYWNrIHRoZSBlbnRpcmUgZ3JpZCdzIHdvcnRoIG9mIGRhdGEuXHJcbiAgICAvL1xyXG4gICAgLy8gVGhlcmUgbWF5IGJlIGEgYmV0dGVyIHdheSB0byBkbyB0aGlzLCBpbiB3aGljaCBjYXNlIHRoaXMgc2hvdWxkIHByb2JhYmx5IGJlIHJlcGxhY2VkIVxyXG4gICAgY3JlYXRlQWxsRm9ybUNvbnRyb2xzKCk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLnBhcmFtc1xyXG4gICAgICAgICAgICAmJiB0aGlzLnBhcmFtcy5jb2x1bW5cclxuICAgICAgICAgICAgJiYgdGhpcy5wYXJhbXMuY29sdW1uLmNvbERlZlxyXG4gICAgICAgICAgICAmJiB0aGlzLnBhcmFtcy5kYXRhXHJcbiAgICAgICAgICAgICYmIHRoaXMucGFyYW1zLm5vZGVcclxuICAgICAgICAgICAgJiYgdGhpcy5wYXJhbXMubm9kZS5ncmlkQXBpXHJcbiAgICAgICAgICAgICYmIHRoaXMucGFyYW1zLm5vZGUuZ3JpZEFwaS5nZXRNb2RlbCgpKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnBhcmFtcy5ub2RlLmdyaWRBcGkuZ3JpZE9wdGlvbnNXcmFwcGVyXHJcbiAgICAgICAgICAgICAgICAmJiB0aGlzLnBhcmFtcy5ub2RlLmdyaWRBcGkuZ3JpZE9wdGlvbnNXcmFwcGVyLmdyaWRPcHRpb25zXHJcbiAgICAgICAgICAgICAgICAmJiAhdGhpcy5wYXJhbXMubm9kZS5ncmlkQXBpLmdyaWRPcHRpb25zV3JhcHBlci5ncmlkT3B0aW9ucy5fZXZlbnRzQ2hhbmdlZEJ5Q2VsbFJlbmRlcmVyVmFsaWRhdGlvbikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jaGFuZ2VHcmlkT3B0aW9uc0V2ZW50cygpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5wYXJhbXMubm9kZS5ncmlkQXBpLmdyaWRPcHRpb25zV3JhcHBlci5ncmlkT3B0aW9ucy5fZXZlbnRzQ2hhbmdlZEJ5Q2VsbFJlbmRlcmVyVmFsaWRhdGlvbiA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgbGV0IGFsbE5vZGVzID0gW107XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnBhcmFtcy5ub2RlLmdyaWRBcGkubW9kZV9uZWVkVG9WYWxpZGF0ZU9ubHlSZW5kZXJlZENlbGxzKSB7XHJcbiAgICAgICAgICAgICAgICBhbGxOb2RlcyA9IHRoaXMucGFyYW1zLm5vZGUuZ3JpZEFwaS5nZXRSZW5kZXJlZE5vZGVzKCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBhbGxOb2RlcyA9IHRoaXMucGFyYW1zLm5vZGUuZ3JpZEFwaS5nZXRNb2RlbCgpLnJvd3NUb0Rpc3BsYXk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKCF0aGlzLnBhcmFtcy5ub2RlLmdyaWRBcGkuZm9ybUdyb3VwXHJcbiAgICAgICAgICAgICAgICB8fCAodGhpcy5wYXJhbXMubm9kZS5ncmlkQXBpLmZvcm1Hcm91cFxyXG4gICAgICAgICAgICAgICAgICAgICYmIHRoaXMucGFyYW1zLm5vZGUuZ3JpZEFwaS5mb3JtR3JvdXAuY29udHJvbHNcclxuICAgICAgICAgICAgICAgICAgICAmJiB0aGlzLnBhcmFtcy5ub2RlLmdyaWRBcGkuZm9ybUdyb3VwLmNvbnRyb2xzLmxlbmd0aCAhPSBhbGxOb2Rlcy5sZW5ndGgpKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnBhcmFtcy5ub2RlLmdyaWRBcGkuZm9ybUdyb3VwID0gbmV3IEZvcm1Hcm91cCh7fSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHRoaXMucGFyYW1zLm5vZGUuZ3JpZEFwaS5jb2x1bW5Db250cm9sbGVyXHJcbiAgICAgICAgICAgICAgICAmJiB0aGlzLnBhcmFtcy5ub2RlLmdyaWRBcGkuY29sdW1uQ29udHJvbGxlci5jb2x1bW5EZWZzKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgY29sdW1uRGVmIG9mIHRoaXMucGFyYW1zLm5vZGUuZ3JpZEFwaS5jb2x1bW5Db250cm9sbGVyLmNvbHVtbkRlZnMpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoY29sdW1uRGVmLm91dGVyRm9ybSAmJiBjb2x1bW5EZWYuZm9ybU5hbWUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjb2x1bW5EZWYub3V0ZXJGb3JtLmdldChjb2x1bW5EZWYuZm9ybU5hbWUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5EZWYub3V0ZXJGb3JtLmFkZENvbnRyb2woY29sdW1uRGVmLmZvcm1OYW1lLCB0aGlzLnBhcmFtcy5ub2RlLmdyaWRBcGkuZm9ybUdyb3VwKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbkRlZi5vdXRlckZvcm0uc2V0Q29udHJvbChjb2x1bW5EZWYuZm9ybU5hbWUsIHRoaXMucGFyYW1zLm5vZGUuZ3JpZEFwaS5mb3JtR3JvdXApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBsZXQgY29sdW1uczogYW55W107XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5wYXJhbXMgJiYgdGhpcy5wYXJhbXMuY29sdW1uQXBpICYmIHRoaXMucGFyYW1zLmNvbHVtbkFwaS5jb2x1bW5Db250cm9sbGVyKSB7XHJcbiAgICAgICAgICAgICAgICBjb2x1bW5zID0gdGhpcy5wYXJhbXMuY29sdW1uQXBpLmNvbHVtbkNvbnRyb2xsZXIuZ3JpZENvbHVtbnMuZmlsdGVyKChjb2x1bW4pID0+IHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29sdW1uLmNvbERlZlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAmJiBjb2x1bW4uY29sRGVmLmZpZWxkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICYmIChjb2x1bW4uY29sRGVmLnZhbGlkYXRvcnMgfHwgY29sdW1uLmNvbERlZi5zZXRFcnJvcnMpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGZvciAobGV0IG5vZGUgb2YgYWxsTm9kZXMpIHtcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGNvbHVtbiBvZiBjb2x1bW5zKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbHVtbi5jb2xEZWZcclxuICAgICAgICAgICAgICAgICAgICAgICAgJiYgY29sdW1uLmNvbERlZi5maWVsZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAmJiAoY29sdW1uLmNvbERlZi52YWxpZGF0b3JzIHx8IGNvbHVtbi5jb2xEZWYuc2V0RXJyb3JzKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBub2RlW2NvbHVtbi5jb2xEZWYuZmllbGQgKyBcIl9lcnJvck1lc3NhZ2VcIl0gPSAnJztcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBmb3JtQ29udHJvbDogRm9ybUNvbnRyb2wgPSBuZXcgRm9ybUNvbnRyb2woY29sdW1uLmNvbERlZi5maWVsZCArICdfZm9ybUNvbnRyb2wnLCBbXSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW5vZGUuZm9ybUdyb3VwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLmZvcm1Hcm91cCA9IG5ldyBGb3JtR3JvdXAoe30pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBub2RlLmZvcm1Hcm91cC5hZGRDb250cm9sKGNvbHVtbi5jb2xEZWYuZmllbGQgKyAnX2Zvcm1Db250cm9sJywgZm9ybUNvbnRyb2wpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGNvbHVtbi5jb2xEZWYudmFsaWRhdG9ycykpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbi5jb2xEZWYudmFsaWRhdG9ycyA9IFtjb2x1bW4uY29sRGVmLnZhbGlkYXRvcnNdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbC5zZXRWYWxpZGF0b3JzKGNvbHVtbi5jb2xEZWYudmFsaWRhdG9ycyk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUVycm9yTWVzc2FnZShmb3JtQ29udHJvbCwgbm9kZSwgY29sdW1uLmNvbERlZik7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5wYXJhbXMubm9kZS5ncmlkQXBpLmZvcm1Hcm91cC5jb250YWlucygnUm93R3JvdXBfJyArIG5vZGUucm93SW5kZXgpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFub2RlLmZvcm1Hcm91cCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBub2RlLmZvcm1Hcm91cCA9IG5ldyBGb3JtR3JvdXAoe30pO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnBhcmFtcy5ub2RlLmdyaWRBcGkuZm9ybUdyb3VwLmFkZENvbnRyb2woJ1Jvd0dyb3VwXycgKyBub2RlLnJvd0luZGV4LCBub2RlLmZvcm1Hcm91cCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBjaGFuZ2VHcmlkT3B0aW9uc0V2ZW50cygpOiB2b2lkIHtcclxuICAgICAgICBpZiAoIXRoaXMucGFyYW1zXHJcbiAgICAgICAgICAgIHx8ICF0aGlzLnBhcmFtcy5ub2RlXHJcbiAgICAgICAgICAgIHx8ICF0aGlzLnBhcmFtcy5ub2RlLmdyaWRBcGlcclxuICAgICAgICAgICAgfHwgIXRoaXMucGFyYW1zLm5vZGUuZ3JpZEFwaS5ncmlkT3B0aW9uc1dyYXBwZXJcclxuICAgICAgICAgICAgfHwgIXRoaXMucGFyYW1zLm5vZGUuZ3JpZEFwaS5ncmlkT3B0aW9uc1dyYXBwZXIuZ3JpZE9wdGlvbnMpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMucGFyYW1zLm5vZGUuZ3JpZEFwaS5ncmlkT3B0aW9uc1dyYXBwZXIuZ3JpZE9wdGlvbnMub25Sb3dEYXRhQ2hhbmdlZCkge1xyXG4gICAgICAgICAgICB0aGlzLnBhcmFtcy5ub2RlLmdyaWRBcGkuZ3JpZE9wdGlvbnNXcmFwcGVyLmdyaWRPcHRpb25zLm9uUm93RGF0YUNoYW5nZWQyID0gdGhpcy5wYXJhbXMubm9kZS5ncmlkQXBpLmdyaWRPcHRpb25zV3JhcHBlci5ncmlkT3B0aW9ucy5vblJvd0RhdGFDaGFuZ2VkO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5wYXJhbXMubm9kZS5ncmlkQXBpLmdyaWRPcHRpb25zV3JhcHBlci5ncmlkT3B0aW9ucy5vblJvd0RhdGFDaGFuZ2VkID0gKChldmVudDogYW55KSA9PiB7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmNyZWF0ZUFsbEZvcm1Db250cm9scygpO1xyXG4gICAgICAgICAgICB0aGlzLmZldGNoRXJyb3JNZXNzYWdlc0ZvckN1cnJlbnRseVJlbmRlcmVkQ2VsbHMoKTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLnBhcmFtcy5ub2RlLmdyaWRBcGkuZ3JpZE9wdGlvbnNXcmFwcGVyLmdyaWRPcHRpb25zLm9uUm93RGF0YUNoYW5nZWQyKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnBhcmFtcy5ub2RlLmdyaWRBcGkuZ3JpZE9wdGlvbnNXcmFwcGVyLmdyaWRPcHRpb25zLm9uUm93RGF0YUNoYW5nZWQyKGV2ZW50KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuXHJcbiAgICAgICAgaWYgKHRoaXMucGFyYW1zLm5vZGUuZ3JpZEFwaS5ncmlkT3B0aW9uc1dyYXBwZXIuZ3JpZE9wdGlvbnMub25HcmlkQ29sdW1uc0NoYW5nZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5wYXJhbXMubm9kZS5ncmlkQXBpLmdyaWRPcHRpb25zV3JhcHBlci5ncmlkT3B0aW9ucy5vbkdyaWRDb2x1bW5zQ2hhbmdlZDIgPSB0aGlzLnBhcmFtcy5ub2RlLmdyaWRBcGkuZ3JpZE9wdGlvbnNXcmFwcGVyLmdyaWRPcHRpb25zLm9uR3JpZENvbHVtbnNDaGFuZ2VkO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5wYXJhbXMubm9kZS5ncmlkQXBpLmdyaWRPcHRpb25zV3JhcHBlci5ncmlkT3B0aW9ucy5vbkdyaWRDb2x1bW5zQ2hhbmdlZCA9ICgoZXZlbnQ6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmRldGVybWluZUlmQWxsUm93c05lZWRWYWxpZGF0aW9uSW5BZHZhbmNlKCk7XHJcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlQWxsRm9ybUNvbnRyb2xzKCk7XHJcbiAgICAgICAgICAgIHRoaXMuZmV0Y2hFcnJvck1lc3NhZ2VzRm9yQ3VycmVudGx5UmVuZGVyZWRDZWxscygpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMucGFyYW1zLm5vZGUuZ3JpZEFwaS5ncmlkT3B0aW9uc1dyYXBwZXIuZ3JpZE9wdGlvbnMub25HcmlkQ29sdW1uc0NoYW5nZWQyKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnBhcmFtcy5ub2RlLmdyaWRBcGkuZ3JpZE9wdGlvbnNXcmFwcGVyLmdyaWRPcHRpb25zLm9uR3JpZENvbHVtbnNDaGFuZ2VkMihldmVudCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGdldEVycm9yTWVzc2FnZSgpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5wYXJhbXNcclxuICAgICAgICAgICAgJiYgdGhpcy5wYXJhbXMubm9kZVxyXG4gICAgICAgICAgICAmJiB0aGlzLnBhcmFtcy5ub2RlLmZvcm1Hcm91cFxyXG4gICAgICAgICAgICAmJiB0aGlzLnBhcmFtcy5jb2x1bW5cclxuICAgICAgICAgICAgJiYgdGhpcy5wYXJhbXMuY29sdW1uLmNvbERlZlxyXG4gICAgICAgICAgICAmJiB0aGlzLnBhcmFtcy5jb2x1bW4uY29sRGVmLmZpZWxkKSB7XHJcblxyXG4gICAgICAgICAgICBsZXQgZm9ybUNvbnRyb2wgPSB0aGlzLnBhcmFtcy5ub2RlLmZvcm1Hcm91cC5nZXQodGhpcy5wYXJhbXMuY29sdW1uLmNvbERlZi5maWVsZCArICdfZm9ybUNvbnRyb2wnKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlRXJyb3JNZXNzYWdlKGZvcm1Db250cm9sLCB0aGlzLnBhcmFtcy5ub2RlLCB0aGlzLnBhcmFtcy5jb2x1bW4uY29sRGVmKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuZXJyb3JNZXNzYWdlID0gdGhpcy5wYXJhbXMubm9kZVt0aGlzLnBhcmFtcy5jb2x1bW4uY29sRGVmLmZpZWxkICsgXCJfZXJyb3JNZXNzYWdlXCJdO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHJlZnJlc2hGb3JtQ29udHJvbFZhbHVlKGZvcm1Db250cm9sOiBGb3JtQ29udHJvbCwgZGF0YTogYW55LCBmaWVsZE5hbWU6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICAgIGlmIChmb3JtQ29udHJvbCAmJiBkYXRhICYmIGZpZWxkTmFtZSAmJiBkYXRhW2ZpZWxkTmFtZV0gIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBmb3JtQ29udHJvbC5zZXRWYWx1ZShkYXRhW2ZpZWxkTmFtZV0pO1xyXG4gICAgICAgICAgICBmb3JtQ29udHJvbC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgdXBkYXRlRXJyb3JNZXNzYWdlKGZvcm1Db250cm9sOiBGb3JtQ29udHJvbCwgbm9kZTogYW55LCBjb2x1bW5EZWZpbml0aW9uOiBhbnkpOiBzdHJpbmcge1xyXG4gICAgICAgIGlmICghZm9ybUNvbnRyb2wgfHwgIW5vZGUgfHwgIWNvbHVtbkRlZmluaXRpb24pIHtcclxuICAgICAgICAgICAgcmV0dXJuICcnO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IGN1c3RvbUVycm9yTWVzc2FnZTogc3RyaW5nID0gJyc7XHJcblxyXG4gICAgICAgIGlmIChjb2x1bW5EZWZpbml0aW9uLnNldEVycm9ycykge1xyXG4gICAgICAgICAgICBjdXN0b21FcnJvck1lc3NhZ2UgPSBjb2x1bW5EZWZpbml0aW9uLnNldEVycm9ycyhcclxuICAgICAgICAgICAgICAgIG5vZGUuZGF0YVtjb2x1bW5EZWZpbml0aW9uLmZpZWxkXSxcclxuICAgICAgICAgICAgICAgIG5vZGUuZGF0YSxcclxuICAgICAgICAgICAgICAgIG5vZGUsXHJcbiAgICAgICAgICAgICAgICBjb2x1bW5EZWZpbml0aW9uLFxyXG4gICAgICAgICAgICAgICAgbm9kZS5yb3dJbmRleCxcclxuICAgICAgICAgICAgICAgIG5vZGUuZ3JpZEFwaVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IGVycm9yTWVzc2FnZU5hbWU6IHN0cmluZyA9IGNvbHVtbkRlZmluaXRpb24uZmllbGQgKyBcIl9lcnJvck1lc3NhZ2VcIjtcclxuXHJcbiAgICAgICAgdGhpcy5yZWZyZXNoRm9ybUNvbnRyb2xWYWx1ZShmb3JtQ29udHJvbCwgbm9kZS5kYXRhLCBjb2x1bW5EZWZpbml0aW9uLmZpZWxkKTtcclxuXHJcbiAgICAgICAgbm9kZVtlcnJvck1lc3NhZ2VOYW1lXSA9ICcnO1xyXG5cclxuXHJcbiAgICAgICAgaWYgKGZvcm1Db250cm9sLmludmFsaWQgfHwgKGN1c3RvbUVycm9yTWVzc2FnZSAmJiBjdXN0b21FcnJvck1lc3NhZ2UgIT09ICcnKSkge1xyXG4gICAgICAgICAgICBpZiAoY29sdW1uRGVmaW5pdGlvbi5lcnJvck1lc3NhZ2VIZWFkZXIpIHtcclxuICAgICAgICAgICAgICAgIG5vZGVbZXJyb3JNZXNzYWdlTmFtZV0gKz0gJycgKyBjb2x1bW5EZWZpbml0aW9uLmVycm9yTWVzc2FnZUhlYWRlciArICdcXG4nO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgbm9kZVtlcnJvck1lc3NhZ2VOYW1lXSArPVxyXG4gICAgICAgICAgICAgICAgICAgICdJbnZhbGlkIHZhbHVlIFwiJyArIG5vZGUuZGF0YVtjb2x1bW5EZWZpbml0aW9uLmZpZWxkXSArICdcIiBmb3IgZmllbGQgKCcgKyBjb2x1bW5EZWZpbml0aW9uLmZpZWxkICsgJylcXG4nO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoY29sdW1uRGVmaW5pdGlvbi5lcnJvck5hbWVFcnJvck1lc3NhZ2VNYXApIHtcclxuICAgICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGNvbHVtbkRlZmluaXRpb24uZXJyb3JOYW1lRXJyb3JNZXNzYWdlTWFwKSkge1xyXG4gICAgICAgICAgICAgICAgY29sdW1uRGVmaW5pdGlvbi5lcnJvck5hbWVFcnJvck1lc3NhZ2VNYXAgPSBbY29sdW1uRGVmaW5pdGlvbi5lcnJvck5hbWVFcnJvck1lc3NhZ2VNYXBdO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBmb3IgKGxldCBlcnJvck5hbWVFcnJvck1lc3NhZ2VQYWlyIG9mIGNvbHVtbkRlZmluaXRpb24uZXJyb3JOYW1lRXJyb3JNZXNzYWdlTWFwKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoISFlcnJvck5hbWVFcnJvck1lc3NhZ2VQYWlyLmVycm9yTmFtZSAmJiAhIWVycm9yTmFtZUVycm9yTWVzc2FnZVBhaXIuZXJyb3JNZXNzYWdlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZvcm1Db250cm9sLmhhc0Vycm9yKGVycm9yTmFtZUVycm9yTWVzc2FnZVBhaXIuZXJyb3JOYW1lKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBub2RlW2Vycm9yTWVzc2FnZU5hbWVdICs9IGVycm9yTmFtZUVycm9yTWVzc2FnZVBhaXIuZXJyb3JNZXNzYWdlICsnXFxuJztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIG5vZGVbZXJyb3JNZXNzYWdlTmFtZV0gKz0gY3VzdG9tRXJyb3JNZXNzYWdlO1xyXG5cclxuICAgICAgICByZXR1cm4gbm9kZVtlcnJvck1lc3NhZ2VOYW1lXTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgZGV0ZXJtaW5lSWZBbGxSb3dzTmVlZFZhbGlkYXRpb25JbkFkdmFuY2UoKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMucGFyYW1zXHJcbiAgICAgICAgICAgICYmIHRoaXMucGFyYW1zLm5vZGVcclxuICAgICAgICAgICAgJiYgdGhpcy5wYXJhbXMubm9kZS5ncmlkQXBpXHJcbiAgICAgICAgICAgICYmIHRoaXMucGFyYW1zLmNvbHVtbkFwaVxyXG4gICAgICAgICAgICAmJiB0aGlzLnBhcmFtcy5jb2x1bW5BcGkuY29sdW1uQ29udHJvbGxlclxyXG4gICAgICAgICAgICAmJiB0aGlzLnBhcmFtcy5jb2x1bW5BcGkuY29sdW1uQ29udHJvbGxlci5ncmlkQ29sdW1ucykge1xyXG5cclxuICAgICAgICAgICAgbGV0IGNvbHVtbnMgPSB0aGlzLnBhcmFtcy5jb2x1bW5BcGkuY29sdW1uQ29udHJvbGxlci5ncmlkQ29sdW1ucy5maWx0ZXIoKGNvbHVtbikgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbHVtbi5jb2xEZWZcclxuICAgICAgICAgICAgICAgICAgICAmJiBjb2x1bW4uY29sRGVmLmZpZWxkXHJcbiAgICAgICAgICAgICAgICAgICAgJiYgKGNvbHVtbi5jb2xEZWYudmFsaWRhdG9ycyB8fCBjb2x1bW4uY29sRGVmLnNldEVycm9ycylcclxuICAgICAgICAgICAgICAgICAgICAmJiBjb2x1bW4uY29sRGVmLmVkaXRhYmxlID09PSB0cnVlXHJcbiAgICAgICAgICAgICAgICAgICAgJiYgIShjb2x1bW4uY29sRGVmLnZhbGlkYXRlT25seVJlbmRlcmVkQ2VsbHNcclxuICAgICAgICAgICAgICAgICAgICAgICAgJiYgY29sdW1uLmNvbERlZi52YWxpZGF0ZU9ubHlSZW5kZXJlZENlbGxzID09PSB0cnVlKTtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnBhcmFtcy5ub2RlLmdyaWRBcGkubW9kZV9uZWVkVG9WYWxpZGF0ZU9ubHlSZW5kZXJlZENlbGxzID0gQXJyYXkuaXNBcnJheShjb2x1bW5zKSAmJiBjb2x1bW5zLmxlbmd0aCA9PT0gMDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIGZldGNoRXJyb3JNZXNzYWdlc0ZvckN1cnJlbnRseVJlbmRlcmVkQ2VsbHMoKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMucGFyYW1zXHJcbiAgICAgICAgICAgICYmIHRoaXMucGFyYW1zLm5vZGVcclxuICAgICAgICAgICAgJiYgdGhpcy5wYXJhbXMubm9kZS5ncmlkQXBpKSB7XHJcblxyXG4gICAgICAgICAgICBsZXQgZ2V0Q2VsbFJlbmRlcmVyUGFyYW1zOiBhbnkgPSB7IHJvd05vZGVzOiB0aGlzLnBhcmFtcy5ub2RlLmdyaWRBcGkuZ2V0UmVuZGVyZWROb2RlcygpIH07XHJcblxyXG4gICAgICAgICAgICBmb3IgKGxldCBjZWxsUmVuZGVyZXIgb2YgdGhpcy5wYXJhbXMubm9kZS5ncmlkQXBpLmdldENlbGxSZW5kZXJlckluc3RhbmNlcyhnZXRDZWxsUmVuZGVyZXJQYXJhbXMpKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoY2VsbFJlbmRlcmVyLl9hZ0F3YXJlQ29tcG9uZW50ICYmIGNlbGxSZW5kZXJlci5fYWdBd2FyZUNvbXBvbmVudC5nZXRFcnJvck1lc3NhZ2UpIHtcclxuICAgICAgICAgICAgICAgICAgICBjZWxsUmVuZGVyZXIuX2FnQXdhcmVDb21wb25lbnQuZ2V0RXJyb3JNZXNzYWdlKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHVwZGF0ZVZhbGlkYXRpb24oKTogdm9pZCB7XHJcbiAgICAgICAgY29uc29sZS5sb2coXCJTdWNjZXNzZnVsbHkgcmVhY2hlZCFcIik7XHJcbiAgICAgICAgLy8gYWRkIHRoaXMgZm9ybSBjb250cm9sXHJcblxyXG4gICAgICAgIGxldCBjb2x1bW5zID0gdGhpcy5wYXJhbXMuY29sdW1uQXBpLmNvbHVtbkNvbnRyb2xsZXIuZ3JpZENvbHVtbnMuZmlsdGVyKChjb2x1bW4pID0+IHtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiBjb2x1bW4uY29sRGVmXHJcbiAgICAgICAgICAgICAgICAmJiBjb2x1bW4uY29sRGVmLmZpZWxkXHJcbiAgICAgICAgICAgICAgICAmJiAoY29sdW1uLmNvbERlZi52YWxpZGF0b3JzIHx8IGNvbHVtbi5jb2xEZWYuc2V0RXJyb3JzKVxyXG4gICAgICAgICAgICAgICAgJiYgY29sdW1uLmNvbERlZi5maWVsZCA9PT0gdGhpcy5wYXJhbXMuZmllbGQ7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnBhcmFtcy5jb2xEZWZcclxuICAgICAgICAgICAgJiYgdGhpcy5wYXJhbXMuY29sRGVmLmZpZWxkXHJcbiAgICAgICAgICAgICYmICh0aGlzLnBhcmFtcy5jb2xEZWYudmFsaWRhdG9ycyB8fCB0aGlzLnBhcmFtcy5jb2xEZWYuc2V0RXJyb3JzKSkge1xyXG5cclxuICAgICAgICAgICAgdGhpcy5wYXJhbXMubm9kZVt0aGlzLnBhcmFtcy5jb2xEZWYuZmllbGQgKyBcIl9lcnJvck1lc3NhZ2VcIl0gPSAnJztcclxuXHJcbiAgICAgICAgICAgIGxldCBmb3JtQ29udHJvbDogRm9ybUNvbnRyb2wgPSBuZXcgRm9ybUNvbnRyb2wodGhpcy5wYXJhbXMuY29sRGVmLmZpZWxkICsgJ19mb3JtQ29udHJvbCcsIFtdKTtcclxuXHJcbiAgICAgICAgICAgIGlmICghdGhpcy5wYXJhbXMubm9kZS5mb3JtR3JvdXApIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucGFyYW1zLm5vZGUuZm9ybUdyb3VwID0gbmV3IEZvcm1Hcm91cCh7fSk7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLnBhcmFtcy5ub2RlLmdyaWRBcGkuZm9ybUdyb3VwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXJhbXMubm9kZS5ncmlkQXBpLmZvcm1Hcm91cCA9IG5ldyBGb3JtR3JvdXAoe30pO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayBmb3IgYW55IHJlbW92ZWQgbm9kZXMgJiByZW1vdmUgdGhlaXIgdmFsaWRhdG9ycyBpZiBuZWVkZWQuXHJcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgY29udHJvbE5hbWUgb2YgT2JqZWN0LmtleXModGhpcy5wYXJhbXMubm9kZS5ncmlkQXBpLmZvcm1Hcm91cC5jb250cm9scykpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCgnJyArIGNvbnRyb2xOYW1lKS50b0xvd2VyQ2FzZSgpLnN1YnN0cigwLCA5KSA9PT0gJ3Jvd2dyb3VwXycpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBmb3VuZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgbm9kZSBvZiB0aGlzLnBhcmFtcy5ub2RlLmdyaWRBcGkuZ2V0TW9kZWwoKS5yb3dzVG9EaXNwbGF5KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCgnJyArIG5vZGUucm93SW5kZXgpID09PSAoJycgKyBjb250cm9sTmFtZSkuc3Vic3RyKDkpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmb3VuZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGFyYW1zLm5vZGUuZ3JpZEFwaS5mb3JtR3JvdXAucmVtb3ZlQ29udHJvbChjb250cm9sTmFtZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMucGFyYW1zLm5vZGUuZ3JpZEFwaS5mb3JtR3JvdXAuYWRkQ29udHJvbCgnUm93R3JvdXBfJyArIHRoaXMucGFyYW1zLm5vZGUucm93SW5kZXgsIHRoaXMucGFyYW1zLm5vZGUuZm9ybUdyb3VwKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKCF0aGlzLnBhcmFtcy5ub2RlLmZvcm1Hcm91cC5jb250cm9sc1t0aGlzLnBhcmFtcy5jb2xEZWYuZmllbGQgKyAnX2Zvcm1Db250cm9sJ10pIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucGFyYW1zLm5vZGUuZm9ybUdyb3VwLmFkZENvbnRyb2wodGhpcy5wYXJhbXMuY29sRGVmLmZpZWxkICsgJ19mb3JtQ29udHJvbCcsIGZvcm1Db250cm9sKTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLnBhcmFtcy5jb2xEZWYudmFsaWRhdG9ycykpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnBhcmFtcy5ub2RlLmZvcm1Hcm91cC5jb250cm9sc1t0aGlzLnBhcmFtcy5jb2xEZWYuZmllbGQgKyAnX2Zvcm1Db250cm9sJ10uc2V0VmFsaWRhdG9ycyh0aGlzLnBhcmFtcy5jb2xEZWYudmFsaWRhdG9ycyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucGFyYW1zLm5vZGUuZ3JpZEFwaS5jb2x1bW5Db250cm9sbGVyXHJcbiAgICAgICAgICAgICAgICAgICAgJiYgdGhpcy5wYXJhbXMubm9kZS5ncmlkQXBpLmNvbHVtbkNvbnRyb2xsZXIuY29sdW1uRGVmcykge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBjb2x1bW5EZWYgb2YgdGhpcy5wYXJhbXMubm9kZS5ncmlkQXBpLmNvbHVtbkNvbnRyb2xsZXIuY29sdW1uRGVmcykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29sdW1uRGVmLm91dGVyRm9ybSAmJiBjb2x1bW5EZWYuZm9ybU5hbWUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY29sdW1uRGVmLm91dGVyRm9ybS5nZXQoY29sdW1uRGVmLmZvcm1OYW1lKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbkRlZi5vdXRlckZvcm0uYWRkQ29udHJvbChjb2x1bW5EZWYuZm9ybU5hbWUsIHRoaXMucGFyYW1zLm5vZGUuZ3JpZEFwaS5mb3JtR3JvdXApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5EZWYub3V0ZXJGb3JtLnNldENvbnRyb2woY29sdW1uRGVmLmZvcm1OYW1lLCB0aGlzLnBhcmFtcy5ub2RlLmdyaWRBcGkuZm9ybUdyb3VwKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy51cGRhdGVFcnJvck1lc3NhZ2UoZm9ybUNvbnRyb2wsIHRoaXMucGFyYW1zLm5vZGUsIHRoaXMucGFyYW1zLmNvbERlZik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBhZGQgY29sdW1uIGNvbnRyb2wgZ3JvdXBzIGlmIG5lZWRlZFxyXG4gICAgICAgIC8vIGFkZCByb3cgY29udHJvbCBncm91cHMgaWYgbmVlZGVkXHJcbiAgICAgICAgLy8gc2V0dXAgZ3JpZCBjb250cm9sIGdyb3VwIGlmIG5lZWRlZFxyXG4gICAgICAgIC8vIE1pZ2h0IG5lZWQgdG8gdHJpZ2dlciBjZWxsIHZhbGlkYXRpb24gdG8gcnVuIHdpdGggdGhlIG5ldyB2YWxpZGF0aW9uLlxyXG5cclxuICAgIH1cclxufVxyXG5cclxuIl19
|