@datagrok-libraries/statistics 1.10.0 → 1.12.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +5 -0
- package/css/styles.css +234 -0
- package/package.json +3 -2
- package/src/mpo/dialogs/desirability-mode-dialog.d.ts +14 -0
- package/src/mpo/dialogs/desirability-mode-dialog.d.ts.map +1 -0
- package/src/mpo/dialogs/desirability-mode-dialog.js +198 -0
- package/src/mpo/editors/desirability-editor-factory.d.ts +16 -0
- package/src/mpo/editors/desirability-editor-factory.d.ts.map +1 -0
- package/src/mpo/editors/desirability-editor-factory.js +11 -0
- package/src/mpo/editors/mpo-categorical-editor.d.ts +24 -0
- package/src/mpo/editors/mpo-categorical-editor.d.ts.map +1 -0
- package/src/mpo/editors/mpo-categorical-editor.js +113 -0
- package/src/mpo/editors/mpo-line-editor.d.ts +47 -0
- package/src/mpo/editors/mpo-line-editor.d.ts.map +1 -0
- package/src/mpo/editors/mpo-line-editor.js +600 -0
- package/src/mpo/mpo-profile-editor.d.ts +42 -6
- package/src/mpo/mpo-profile-editor.d.ts.map +1 -1
- package/src/mpo/mpo-profile-editor.js +369 -59
- package/src/mpo/mpo.d.ts +53 -3
- package/src/mpo/mpo.d.ts.map +1 -1
- package/src/mpo/mpo.js +92 -16
- package/src/mpo/utils.d.ts +6 -0
- package/src/mpo/utils.d.ts.map +1 -0
- package/src/mpo/utils.js +17 -0
- package/src/mpo/mpo-line-editor.d.ts +0 -10
- package/src/mpo/mpo-line-editor.d.ts.map +0 -1
- package/src/mpo/mpo-line-editor.js +0 -258
|
@@ -1,13 +1,49 @@
|
|
|
1
1
|
import * as DG from 'datagrok-api/dg';
|
|
2
|
-
import { DesirabilityProfile } from './mpo';
|
|
3
2
|
import { Subject } from 'rxjs';
|
|
3
|
+
import { DesirabilityProfile, WeightedAggregation } from './mpo';
|
|
4
|
+
import '../../css/styles.css';
|
|
4
5
|
export declare class MpoProfileEditor {
|
|
5
|
-
root: HTMLDivElement;
|
|
6
|
-
|
|
7
|
-
|
|
6
|
+
readonly root: HTMLDivElement;
|
|
7
|
+
readonly onChanged: Subject<void>;
|
|
8
|
+
readonly aggregationInput: DG.ChoiceInput<WeightedAggregation | null>;
|
|
8
9
|
profile?: DesirabilityProfile;
|
|
9
|
-
|
|
10
|
-
|
|
10
|
+
dataFrame?: DG.DataFrame;
|
|
11
|
+
design: boolean;
|
|
12
|
+
preview: boolean;
|
|
13
|
+
private rows;
|
|
14
|
+
private rowIds;
|
|
15
|
+
private rowSubs;
|
|
16
|
+
private propertyOrder;
|
|
17
|
+
columnMapping: Record<string, string | null>;
|
|
18
|
+
constructor(dataFrame?: DG.DataFrame, design?: boolean, preview?: boolean);
|
|
19
|
+
private newRowId;
|
|
11
20
|
setProfile(profile?: DesirabilityProfile): void;
|
|
21
|
+
getProfile(): DesirabilityProfile | undefined;
|
|
22
|
+
setDesignMode(on: boolean): void;
|
|
23
|
+
setPreviewMode(on: boolean): void;
|
|
24
|
+
private render;
|
|
25
|
+
private renderEmpty;
|
|
26
|
+
private renderDesignEmpty;
|
|
27
|
+
addProperty(): void;
|
|
28
|
+
private buildHeader;
|
|
29
|
+
private buildRow;
|
|
30
|
+
private buildPropertyCell;
|
|
31
|
+
private buildWeightCell;
|
|
32
|
+
private buildColumnSelector;
|
|
33
|
+
private getEligibleColumnNames;
|
|
34
|
+
private getNumericalColumnNames;
|
|
35
|
+
private resolveColumn;
|
|
36
|
+
private correctPropertyType;
|
|
37
|
+
private switchPropertyType;
|
|
38
|
+
private rebuildRow;
|
|
39
|
+
private buildModeGear;
|
|
40
|
+
private buildRowControls;
|
|
41
|
+
private openModeDialog;
|
|
42
|
+
private getPropertyNameByRowId;
|
|
43
|
+
private renameProperty;
|
|
44
|
+
private deleteRow;
|
|
45
|
+
private insertRowAfterRow;
|
|
46
|
+
private mutateProperty;
|
|
47
|
+
private emitChange;
|
|
12
48
|
}
|
|
13
49
|
//# sourceMappingURL=mpo-profile-editor.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mpo-profile-editor.d.ts","sourceRoot":"","sources":["mpo-profile-editor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"mpo-profile-editor.d.ts","sourceRoot":"","sources":["mpo-profile-editor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAItC,OAAO,EAAC,OAAO,EAAe,MAAM,MAAM,CAAC;AAC3C,OAAO,EAEL,mBAAmB,EAAwB,mBAAmB,EAE/D,MAAM,OAAO,CAAC;AAIf,OAAO,sBAAsB,CAAC;AAM9B,qBAAa,gBAAgB;IAC3B,QAAQ,CAAC,IAAI,iBAAc;IAC3B,QAAQ,CAAC,SAAS,gBAAuB;IACzC,QAAQ,CAAC,gBAAgB,EAAE,EAAE,CAAC,WAAW,CAAC,mBAAmB,GAAG,IAAI,CAAC,CAAC;IAEtE,OAAO,CAAC,EAAE,mBAAmB,CAAC;IAC9B,SAAS,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC;IACzB,MAAM,UAAS;IACf,OAAO,UAAS;IAEhB,OAAO,CAAC,IAAI,CAAmC;IAC/C,OAAO,CAAC,MAAM,CAA8B;IAC5C,OAAO,CAAC,OAAO,CAAmC;IAElD,OAAO,CAAC,aAAa,CAAgB;IACrC,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,CAAM;gBAEtC,SAAS,CAAC,EAAE,EAAE,CAAC,SAAS,EAAE,MAAM,UAAQ,EAAE,OAAO,UAAQ;IAiBrE,OAAO,CAAC,QAAQ;IAIhB,UAAU,CAAC,OAAO,CAAC,EAAE,mBAAmB,GAAG,IAAI;IA2B/C,UAAU,IAAI,mBAAmB,GAAG,SAAS;IAI7C,aAAa,CAAC,EAAE,EAAE,OAAO,GAAG,IAAI;IAQhC,cAAc,CAAC,EAAE,EAAE,OAAO,GAAG,IAAI;IAQjC,OAAO,CAAC,MAAM;IA0Bd,OAAO,CAAC,WAAW;IAInB,OAAO,CAAC,iBAAiB;IASzB,WAAW,IAAI,IAAI;IAgBnB,OAAO,CAAC,WAAW;IAQnB,OAAO,CAAC,QAAQ;IA4ChB,OAAO,CAAC,iBAAiB;IAoBzB,OAAO,CAAC,eAAe;IAmDvB,OAAO,CAAC,mBAAmB;IA2B3B,OAAO,CAAC,sBAAsB;IAQ9B,OAAO,CAAC,uBAAuB;IAM/B,OAAO,CAAC,aAAa;IAUrB,OAAO,CAAC,mBAAmB;IAY3B,OAAO,CAAC,kBAAkB;IAiB1B,OAAO,CAAC,UAAU;IAWlB,OAAO,CAAC,aAAa;IAkBrB,OAAO,CAAC,gBAAgB;IAMxB,OAAO,CAAC,cAAc;IA0BtB,OAAO,CAAC,sBAAsB;IAK9B,OAAO,CAAC,cAAc;IAqBtB,OAAO,CAAC,SAAS;IA0BjB,OAAO,CAAC,iBAAiB;IAyBzB,OAAO,CAAC,cAAc;IAYtB,OAAO,CAAC,UAAU;CAInB"}
|
|
@@ -1,79 +1,389 @@
|
|
|
1
1
|
import * as ui from 'datagrok-api/ui';
|
|
2
|
-
import
|
|
2
|
+
import * as grok from 'datagrok-api/grok';
|
|
3
3
|
import { Subject } from 'rxjs';
|
|
4
|
+
import { DEFAULT_AGGREGATION, WEIGHTED_AGGREGATIONS_LIST, createDefaultCategorical, createDefaultNumerical, isNumerical, migrateDesirability, } from './mpo';
|
|
5
|
+
import { DesirabilityEditorFactory } from './editors/desirability-editor-factory';
|
|
6
|
+
import { DesirabilityModeDialog } from './dialogs/desirability-mode-dialog';
|
|
7
|
+
import '../../css/styles.css';
|
|
8
|
+
import { MPO_SCORE_CHANGED_EVENT } from './utils';
|
|
9
|
+
const MAX_CATEGORICAL_CATEGORIES = 20;
|
|
4
10
|
export class MpoProfileEditor {
|
|
5
|
-
constructor(dataFrame) {
|
|
11
|
+
constructor(dataFrame, design = false, preview = false) {
|
|
6
12
|
this.root = ui.div([]);
|
|
7
13
|
this.onChanged = new Subject();
|
|
14
|
+
this.design = false;
|
|
15
|
+
this.preview = false;
|
|
16
|
+
this.rows = {};
|
|
17
|
+
this.rowIds = {};
|
|
18
|
+
this.rowSubs = new Map();
|
|
19
|
+
this.propertyOrder = [];
|
|
20
|
+
this.columnMapping = {};
|
|
8
21
|
this.dataFrame = dataFrame;
|
|
9
|
-
this.
|
|
22
|
+
this.design = design;
|
|
23
|
+
this.preview = preview;
|
|
24
|
+
this.aggregationInput = ui.input.choice('Aggregation', {
|
|
25
|
+
items: WEIGHTED_AGGREGATIONS_LIST,
|
|
26
|
+
value: DEFAULT_AGGREGATION,
|
|
27
|
+
nullable: false,
|
|
28
|
+
onValueChanged: (v) => {
|
|
29
|
+
if (this.profile)
|
|
30
|
+
this.profile.aggregation = v;
|
|
31
|
+
this.emitChange();
|
|
32
|
+
},
|
|
33
|
+
});
|
|
34
|
+
this.aggregationInput.setTooltip('Score aggregation method');
|
|
10
35
|
}
|
|
11
|
-
|
|
12
|
-
return
|
|
36
|
+
newRowId() {
|
|
37
|
+
return crypto.randomUUID();
|
|
13
38
|
}
|
|
14
39
|
setProfile(profile) {
|
|
40
|
+
var _a, _b;
|
|
41
|
+
if (profile) {
|
|
42
|
+
for (const key of Object.keys(profile.properties)) {
|
|
43
|
+
const prop = migrateDesirability(profile.properties[key]);
|
|
44
|
+
if (isNumerical(prop))
|
|
45
|
+
(_a = prop.mode) !== null && _a !== void 0 ? _a : (prop.mode = 'freeform');
|
|
46
|
+
profile.properties[key] = prop;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
for (const sub of this.rowSubs.values())
|
|
50
|
+
sub.unsubscribe();
|
|
51
|
+
this.rowSubs.clear();
|
|
15
52
|
this.profile = profile;
|
|
53
|
+
this.aggregationInput.value = (_b = profile === null || profile === void 0 ? void 0 : profile.aggregation) !== null && _b !== void 0 ? _b : DEFAULT_AGGREGATION;
|
|
54
|
+
this.columnMapping = {};
|
|
55
|
+
this.rows = {};
|
|
56
|
+
this.rowIds = {};
|
|
57
|
+
this.propertyOrder = profile ? Object.keys(profile.properties) : [];
|
|
58
|
+
for (const name of this.propertyOrder)
|
|
59
|
+
this.rowIds[name] = this.newRowId();
|
|
60
|
+
this.render();
|
|
61
|
+
}
|
|
62
|
+
getProfile() {
|
|
63
|
+
return this.profile;
|
|
64
|
+
}
|
|
65
|
+
setDesignMode(on) {
|
|
66
|
+
if (this.design === on)
|
|
67
|
+
return;
|
|
68
|
+
this.design = on;
|
|
69
|
+
this.rows = {};
|
|
70
|
+
this.render();
|
|
71
|
+
}
|
|
72
|
+
setPreviewMode(on) {
|
|
73
|
+
if (this.preview === on)
|
|
74
|
+
return;
|
|
75
|
+
this.preview = on;
|
|
76
|
+
this.rows = {};
|
|
77
|
+
this.render();
|
|
78
|
+
}
|
|
79
|
+
render() {
|
|
16
80
|
ui.empty(this.root);
|
|
17
|
-
if (!profile)
|
|
18
|
-
this.
|
|
81
|
+
if (!this.profile)
|
|
82
|
+
return this.renderEmpty('No profile specified.');
|
|
83
|
+
const rows = this.propertyOrder.map((name) => {
|
|
84
|
+
const rowId = this.rowIds[name];
|
|
85
|
+
if (!this.rows[rowId])
|
|
86
|
+
this.rows[rowId] = this.buildRow(name, rowId, this.profile.properties[name]);
|
|
87
|
+
return this.rows[rowId];
|
|
88
|
+
});
|
|
89
|
+
if (!rows.length) {
|
|
90
|
+
if (!this.preview)
|
|
91
|
+
this.root.append(this.buildHeader());
|
|
92
|
+
if (this.design)
|
|
93
|
+
return this.renderDesignEmpty();
|
|
94
|
+
return this.renderEmpty('No properties defined.');
|
|
95
|
+
}
|
|
96
|
+
if (!this.preview)
|
|
97
|
+
this.root.append(this.buildHeader());
|
|
98
|
+
this.root.append(ui.divV(rows));
|
|
99
|
+
}
|
|
100
|
+
renderEmpty(text) {
|
|
101
|
+
this.root.append(ui.divText(text));
|
|
102
|
+
}
|
|
103
|
+
renderDesignEmpty() {
|
|
104
|
+
const icon = ui.iconFA('chart-line');
|
|
105
|
+
const heading = ui.h3('No properties yet');
|
|
106
|
+
const msg = ui.p('Select a dataset to auto-populate properties from its numerical columns, or add them manually.');
|
|
107
|
+
const addBtn = ui.link('+ Add Property', () => this.addProperty());
|
|
108
|
+
const container = ui.divV([icon, heading, msg, addBtn], 'statistics-mpo-empty-state');
|
|
109
|
+
this.root.append(container);
|
|
110
|
+
}
|
|
111
|
+
addProperty() {
|
|
112
|
+
if (!this.profile)
|
|
19
113
|
return;
|
|
114
|
+
const newName = `NewProperty${Object.keys(this.profile.properties).length + 1}`;
|
|
115
|
+
const newRowId = this.newRowId();
|
|
116
|
+
this.profile.properties[newName] = createDefaultNumerical();
|
|
117
|
+
this.rowIds[newName] = newRowId;
|
|
118
|
+
this.propertyOrder.push(newName);
|
|
119
|
+
this.rows = {};
|
|
120
|
+
this.render();
|
|
121
|
+
this.emitChange();
|
|
122
|
+
}
|
|
123
|
+
buildHeader() {
|
|
124
|
+
return ui.divH([
|
|
125
|
+
ui.divText('Property', 'statistics-mpo-header-property'),
|
|
126
|
+
ui.divText('Weight', 'statistics-mpo-header-weight'),
|
|
127
|
+
ui.divText('Desirability', 'statistics-mpo-header-desirability'),
|
|
128
|
+
], 'statistics-mpo-header');
|
|
129
|
+
}
|
|
130
|
+
buildRow(name, rowId, prop) {
|
|
131
|
+
var _a;
|
|
132
|
+
const row = ui.divH([], 'statistics-mpo-row');
|
|
133
|
+
row.dataset.rowId = rowId;
|
|
134
|
+
const col = this.resolveColumn(name);
|
|
135
|
+
if (col) {
|
|
136
|
+
const corrected = this.correctPropertyType(prop, col);
|
|
137
|
+
if (corrected) {
|
|
138
|
+
prop = corrected;
|
|
139
|
+
this.profile.properties[name] = prop;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
const editor = DesirabilityEditorFactory.create(prop, 300, 80, this.design);
|
|
143
|
+
editor.root.classList.add('statistics-mpo-editor-fill');
|
|
144
|
+
(_a = this.rowSubs.get(rowId)) === null || _a === void 0 ? void 0 : _a.unsubscribe();
|
|
145
|
+
this.rowSubs.set(rowId, editor.onChanged.subscribe(() => this.emitChange()));
|
|
146
|
+
const propertyCell = this.buildPropertyCell(rowId, name);
|
|
147
|
+
const weightCell = this.buildWeightCell(rowId, prop);
|
|
148
|
+
const columnCell = this.buildColumnSelector(rowId, name, editor);
|
|
149
|
+
const modeGear = this.design ?
|
|
150
|
+
this.buildModeGear(rowId, prop, editor) :
|
|
151
|
+
null;
|
|
152
|
+
const controls = this.design ? this.buildRowControls(rowId) : null;
|
|
153
|
+
row.append(ui.divV([propertyCell, columnCell].filter(Boolean), 'statistics-mpo-property-cell'), weightCell, ui.divH([editor.root, modeGear].filter(Boolean)));
|
|
154
|
+
if (controls)
|
|
155
|
+
row.append(controls);
|
|
156
|
+
return row;
|
|
157
|
+
}
|
|
158
|
+
buildPropertyCell(rowId, name) {
|
|
159
|
+
if (this.dataFrame) {
|
|
160
|
+
const el = ui.divText(name);
|
|
161
|
+
ui.tooltip.bind(el, () => name);
|
|
162
|
+
return el;
|
|
20
163
|
}
|
|
21
|
-
|
|
22
|
-
const
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
164
|
+
let currentName = name;
|
|
165
|
+
const propNameInp = ui.input.string('', { value: name, onValueChanged: (v) => {
|
|
166
|
+
if (!v || v === currentName)
|
|
167
|
+
return;
|
|
168
|
+
this.renameProperty(currentName, v);
|
|
169
|
+
currentName = v;
|
|
170
|
+
} });
|
|
171
|
+
ui.tooltip.bind(propNameInp.input, () => currentName);
|
|
172
|
+
return propNameInp.root;
|
|
173
|
+
}
|
|
174
|
+
buildWeightCell(rowId, prop) {
|
|
175
|
+
var _a;
|
|
176
|
+
const name = this.getPropertyNameByRowId(rowId);
|
|
177
|
+
const children = [];
|
|
178
|
+
const weightInput = ui.input.float('', { value: prop.weight, min: 0, max: 1, format: '#0.000',
|
|
179
|
+
onValueChanged: (v) => {
|
|
180
|
+
if (name)
|
|
181
|
+
this.mutateProperty(name, (p) => p.weight = Math.max(0, Math.min(1, v !== null && v !== void 0 ? v : 0)));
|
|
30
182
|
},
|
|
31
183
|
});
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
const
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
nullable: true,
|
|
55
|
-
items: (_c = (_b = (_a = this.dataFrame) === null || _a === void 0 ? void 0 : _a.columns) === null || _b === void 0 ? void 0 : _b.names()) !== null && _c !== void 0 ? _c : [''],
|
|
56
|
-
value: matchedColumnName !== null && matchedColumnName !== void 0 ? matchedColumnName : ''
|
|
184
|
+
weightInput.root.classList.add('statistics-mpo-weight-input');
|
|
185
|
+
children.push(weightInput.root);
|
|
186
|
+
if (this.dataFrame) {
|
|
187
|
+
const numCols = this.getNumericalColumnNames();
|
|
188
|
+
let isColumn = !!prop.weightColumn && numCols.includes(prop.weightColumn);
|
|
189
|
+
const colInput = ui.input.choice('', { items: numCols, nullable: true, value: (_a = prop.weightColumn) !== null && _a !== void 0 ? _a : '',
|
|
190
|
+
onValueChanged: (v) => {
|
|
191
|
+
if (name)
|
|
192
|
+
this.mutateProperty(name, (p) => p.weightColumn = v || undefined);
|
|
193
|
+
}, });
|
|
194
|
+
const syncToggle = () => {
|
|
195
|
+
weightInput.root.classList.toggle('statistics-mpo-hidden', isColumn);
|
|
196
|
+
colInput.root.classList.toggle('statistics-mpo-hidden', !isColumn);
|
|
197
|
+
toggle.classList.toggle('statistics-mpo-weight-toggle-active', isColumn);
|
|
198
|
+
};
|
|
199
|
+
const toggle = ui.iconFA('columns', () => {
|
|
200
|
+
isColumn = !isColumn;
|
|
201
|
+
syncToggle();
|
|
202
|
+
if (!isColumn && name)
|
|
203
|
+
this.mutateProperty(name, (p) => { delete p.weightColumn; });
|
|
204
|
+
else if (isColumn && name && colInput.value)
|
|
205
|
+
this.mutateProperty(name, (p) => p.weightColumn = colInput.value || undefined);
|
|
57
206
|
});
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
]),
|
|
63
|
-
weightInput.root,
|
|
64
|
-
lineEditor.root, // Add the Konva container div
|
|
65
|
-
]);
|
|
66
|
-
rowDiv.style.alignItems = 'center'; // Vertically align items in the row
|
|
67
|
-
rowDiv.style.marginBottom = '5px'; // Space between rows
|
|
68
|
-
rowDiv.style.minHeight = '70px'; // Ensure consistent row height even if editor takes time
|
|
69
|
-
return rowDiv;
|
|
70
|
-
}).filter((el) => el !== null); // Filter out skipped properties
|
|
71
|
-
if (propertyRows.length > 0) {
|
|
72
|
-
this.root.append(header);
|
|
73
|
-
this.root.append(ui.divV(propertyRows)); // Cast needed after filter
|
|
207
|
+
toggle.classList.add('statistics-mpo-weight-toggle');
|
|
208
|
+
ui.tooltip.bind(toggle, () => isColumn ? 'Switch to manual weight' : 'Use weight from column');
|
|
209
|
+
syncToggle();
|
|
210
|
+
children.push(colInput.root, toggle);
|
|
74
211
|
}
|
|
212
|
+
return ui.divH(children, 'statistics-mpo-weight-cell');
|
|
213
|
+
}
|
|
214
|
+
buildColumnSelector(rowId, name, editor) {
|
|
215
|
+
var _a, _b;
|
|
216
|
+
if (!this.dataFrame)
|
|
217
|
+
return null;
|
|
218
|
+
const items = this.getEligibleColumnNames();
|
|
219
|
+
const matched = (_a = this.columnMapping[name]) !== null && _a !== void 0 ? _a : null;
|
|
220
|
+
if (matched) {
|
|
221
|
+
const col = this.dataFrame.col(matched);
|
|
222
|
+
(_b = editor.setColumn) === null || _b === void 0 ? void 0 : _b.call(editor, col);
|
|
223
|
+
}
|
|
224
|
+
const input = ui.input.choice('', { items, nullable: true, value: matched !== null && matched !== void 0 ? matched : '', onValueChanged: (v) => {
|
|
225
|
+
var _a;
|
|
226
|
+
this.columnMapping[name] = v !== null && v !== void 0 ? v : null;
|
|
227
|
+
const col = v ? this.dataFrame.col(v) : null;
|
|
228
|
+
if (col && this.switchPropertyType(name, rowId, col))
|
|
229
|
+
return;
|
|
230
|
+
(_a = editor.setColumn) === null || _a === void 0 ? void 0 : _a.call(editor, col);
|
|
231
|
+
this.emitChange();
|
|
232
|
+
} });
|
|
233
|
+
return input.root;
|
|
234
|
+
}
|
|
235
|
+
getEligibleColumnNames() {
|
|
236
|
+
if (!this.dataFrame)
|
|
237
|
+
return [];
|
|
238
|
+
return Array.from(this.dataFrame.columns)
|
|
239
|
+
.filter((c) => !c.isCategorical || c.categories.length <= MAX_CATEGORICAL_CATEGORIES)
|
|
240
|
+
.map((c) => c.name);
|
|
241
|
+
}
|
|
242
|
+
getNumericalColumnNames() {
|
|
243
|
+
if (!this.dataFrame)
|
|
244
|
+
return [];
|
|
245
|
+
return Array.from(this.dataFrame.columns.numerical).map((c) => c.name);
|
|
246
|
+
}
|
|
247
|
+
resolveColumn(name) {
|
|
248
|
+
var _a, _b, _c;
|
|
249
|
+
if (!this.dataFrame)
|
|
250
|
+
return null;
|
|
251
|
+
const eligible = this.getEligibleColumnNames();
|
|
252
|
+
const colName = (_b = (_a = this.columnMapping[name]) !== null && _a !== void 0 ? _a : eligible.find((c) => c.toLowerCase() === name.toLowerCase())) !== null && _b !== void 0 ? _b : null;
|
|
253
|
+
if (colName)
|
|
254
|
+
this.columnMapping[name] = colName;
|
|
255
|
+
return colName ? (_c = this.dataFrame.col(colName)) !== null && _c !== void 0 ? _c : null : null;
|
|
256
|
+
}
|
|
257
|
+
correctPropertyType(prop, col) {
|
|
258
|
+
if (isNumerical(prop) && col.isCategorical) {
|
|
259
|
+
const categories = col.categories.map((c) => ({ name: c, desirability: 1 }));
|
|
260
|
+
return createDefaultCategorical(prop.weight, categories);
|
|
261
|
+
}
|
|
262
|
+
if (!isNumerical(prop) && col.isNumerical)
|
|
263
|
+
return createDefaultNumerical(prop.weight, col.min, col.max);
|
|
264
|
+
return null;
|
|
265
|
+
}
|
|
266
|
+
switchPropertyType(name, rowId, col) {
|
|
267
|
+
if (!this.profile)
|
|
268
|
+
return false;
|
|
269
|
+
const corrected = this.correctPropertyType(this.profile.properties[name], col);
|
|
270
|
+
if (!corrected)
|
|
271
|
+
return false;
|
|
272
|
+
this.profile.properties[name] = corrected;
|
|
273
|
+
this.rebuildRow(name, rowId);
|
|
274
|
+
return true;
|
|
275
|
+
}
|
|
276
|
+
rebuildRow(name, rowId) {
|
|
277
|
+
const oldRow = this.rows[rowId];
|
|
278
|
+
const newRow = this.buildRow(name, rowId, this.profile.properties[name]);
|
|
279
|
+
this.rows[rowId] = newRow;
|
|
280
|
+
if (oldRow === null || oldRow === void 0 ? void 0 : oldRow.parentNode)
|
|
281
|
+
oldRow.replaceWith(newRow);
|
|
282
|
+
this.emitChange();
|
|
283
|
+
}
|
|
284
|
+
buildModeGear(rowId, prop, editor) {
|
|
285
|
+
const gear = ui.icons.settings(() => {
|
|
286
|
+
var _a, _b;
|
|
287
|
+
const name = this.getPropertyNameByRowId(rowId);
|
|
288
|
+
if (!name)
|
|
289
|
+
return;
|
|
290
|
+
const colName = this.columnMapping[name];
|
|
291
|
+
const col = colName ? (_b = (_a = this.dataFrame) === null || _a === void 0 ? void 0 : _a.col(colName)) !== null && _b !== void 0 ? _b : null : null;
|
|
292
|
+
this.openModeDialog(name, rowId, prop, editor, col);
|
|
293
|
+
});
|
|
294
|
+
gear.classList.add('statistics-mpo-gear');
|
|
295
|
+
return gear;
|
|
296
|
+
}
|
|
297
|
+
buildRowControls(rowId) {
|
|
298
|
+
const add = ui.icons.add(() => this.insertRowAfterRow(rowId));
|
|
299
|
+
const del = ui.icons.delete(() => this.deleteRow(rowId));
|
|
300
|
+
return ui.divH([add, del], 'statistics-mpo-control-buttons');
|
|
301
|
+
}
|
|
302
|
+
openModeDialog(name, rowId, prop, editor, mappedCol = null) {
|
|
303
|
+
new DesirabilityModeDialog(name, prop, (patch) => {
|
|
304
|
+
var _a;
|
|
305
|
+
const p = (_a = this.profile) === null || _a === void 0 ? void 0 : _a.properties[name];
|
|
306
|
+
if (p)
|
|
307
|
+
Object.assign(p, patch);
|
|
308
|
+
editor.redrawAll();
|
|
309
|
+
}, (newProp) => {
|
|
310
|
+
if (!this.profile)
|
|
311
|
+
return;
|
|
312
|
+
this.profile.properties[name] = newProp;
|
|
313
|
+
this.rebuildRow(name, rowId);
|
|
314
|
+
}, mappedCol).show();
|
|
315
|
+
}
|
|
316
|
+
getPropertyNameByRowId(rowId) {
|
|
317
|
+
var _a;
|
|
318
|
+
return (_a = Object.entries(this.rowIds)
|
|
319
|
+
.find(([, id]) => id === rowId)) === null || _a === void 0 ? void 0 : _a[0];
|
|
320
|
+
}
|
|
321
|
+
renameProperty(oldName, newName) {
|
|
322
|
+
var _a;
|
|
323
|
+
if (!this.profile || this.profile.properties[newName])
|
|
324
|
+
return;
|
|
325
|
+
const rowId = this.rowIds[oldName];
|
|
326
|
+
this.profile.properties[newName] = this.profile.properties[oldName];
|
|
327
|
+
delete this.profile.properties[oldName];
|
|
328
|
+
this.columnMapping[newName] = (_a = this.columnMapping[oldName]) !== null && _a !== void 0 ? _a : null;
|
|
329
|
+
delete this.columnMapping[oldName];
|
|
330
|
+
const idx = this.propertyOrder.indexOf(oldName);
|
|
331
|
+
if (idx >= 0)
|
|
332
|
+
this.propertyOrder[idx] = newName;
|
|
333
|
+
delete this.rowIds[oldName];
|
|
334
|
+
this.rowIds[newName] = rowId;
|
|
335
|
+
this.emitChange();
|
|
336
|
+
}
|
|
337
|
+
deleteRow(rowId) {
|
|
338
|
+
var _a;
|
|
339
|
+
const name = this.getPropertyNameByRowId(rowId);
|
|
340
|
+
if (!name || !this.profile)
|
|
341
|
+
return;
|
|
342
|
+
delete this.profile.properties[name];
|
|
343
|
+
delete this.columnMapping[name];
|
|
344
|
+
delete this.rowIds[name];
|
|
345
|
+
(_a = this.rowSubs.get(rowId)) === null || _a === void 0 ? void 0 : _a.unsubscribe();
|
|
346
|
+
this.rowSubs.delete(rowId);
|
|
347
|
+
const idx = this.propertyOrder.indexOf(name);
|
|
348
|
+
if (idx >= 0)
|
|
349
|
+
this.propertyOrder.splice(idx, 1);
|
|
350
|
+
const rowEl = this.rows[rowId];
|
|
351
|
+
delete this.rows[rowId];
|
|
352
|
+
if (this.propertyOrder.length === 0)
|
|
353
|
+
this.render();
|
|
75
354
|
else
|
|
76
|
-
|
|
355
|
+
rowEl === null || rowEl === void 0 ? void 0 : rowEl.remove();
|
|
356
|
+
this.emitChange();
|
|
357
|
+
}
|
|
358
|
+
insertRowAfterRow(rowId) {
|
|
359
|
+
var _a;
|
|
360
|
+
if (!this.profile)
|
|
361
|
+
return;
|
|
362
|
+
const afterName = this.getPropertyNameByRowId(rowId);
|
|
363
|
+
if (!afterName)
|
|
364
|
+
return;
|
|
365
|
+
const newName = `NewProperty${Object.keys(this.profile.properties).length + 1}`;
|
|
366
|
+
const newRowId = this.newRowId();
|
|
367
|
+
this.profile.properties[newName] = createDefaultNumerical();
|
|
368
|
+
this.rowIds[newName] = newRowId;
|
|
369
|
+
const idx = this.propertyOrder.indexOf(afterName);
|
|
370
|
+
this.propertyOrder.splice(idx + 1, 0, newName);
|
|
371
|
+
const newRow = this.buildRow(newName, newRowId, this.profile.properties[newName]);
|
|
372
|
+
this.rows[newRowId] = newRow;
|
|
373
|
+
(_a = this.rows[rowId]) === null || _a === void 0 ? void 0 : _a.after(newRow);
|
|
374
|
+
this.emitChange();
|
|
375
|
+
}
|
|
376
|
+
mutateProperty(name, updater) {
|
|
377
|
+
var _a;
|
|
378
|
+
const prop = (_a = this.profile) === null || _a === void 0 ? void 0 : _a.properties[name];
|
|
379
|
+
if (!prop)
|
|
380
|
+
return;
|
|
381
|
+
updater(prop);
|
|
382
|
+
this.emitChange();
|
|
383
|
+
}
|
|
384
|
+
emitChange() {
|
|
385
|
+
this.onChanged.next();
|
|
386
|
+
grok.events.fireCustomEvent(MPO_SCORE_CHANGED_EVENT, {});
|
|
77
387
|
}
|
|
78
388
|
}
|
|
79
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXBvLXByb2ZpbGUtZWRpdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsibXBvLXByb2ZpbGUtZWRpdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sS0FBSyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFHdEMsT0FBTyxFQUFDLHlCQUF5QixFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFDNUQsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUc3QixNQUFNLE9BQU8sZ0JBQWdCO0lBTTNCLFlBQVksU0FBd0I7UUFMcEMsU0FBSSxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7UUFFbEIsY0FBUyxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7UUFJeEIsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7UUFDM0IsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO0lBQ3BCLENBQUM7SUFFRCxVQUFVO1FBQ1IsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDO0lBQ3RCLENBQUM7SUFFRCxVQUFVLENBQUMsT0FBNkI7UUFDdEMsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7UUFDdkIsRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDcEIsSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUNaLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxDQUFDO1lBQ3RELE9BQU87U0FDUjtRQUVELGtDQUFrQztRQUNsQyxNQUFNLE1BQU0sR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDO1lBQ3JCLEVBQUUsQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLEVBQUMsS0FBSyxFQUFFLEVBQUMsVUFBVSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFDLEVBQUMsQ0FBQztZQUNyRSxFQUFFLENBQUMs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QVksRUFBRSxFQUFDLEtBQUssRUFBRSxFQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFDLEVBQUMsQ0FBQztvQkFDekYsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSTtpQkFDekMsQ0FBQztnQkFDRixXQUFXLENBQUMsSUFBSTtnQkFDaEIsVUFBVSxDQUFDLElBQUksRUFBRSw4QkFBOEI7YUFDaEQsQ0FBQyxDQUFDO1lBQ0gsTUFBTSxDQUFDLEtBQUssQ0FBQyxVQUFVLEdBQUcsUUFBUSxDQUFDLENBQUMsb0NBQW9DO1lBQ3hFLE1BQU0sQ0FBQyxLQUFLLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQyxDQUFDLHFCQUFxQjtZQUN4RCxNQUFNLENBQUMsS0FBSyxDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUMsQ0FBQyx5REFBeUQ7WUFFMUYsT0FBTyxNQUFNLENBQUM7UUFDaEIsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxnQ0FBZ0M7UUFFaEUsSUFBSSxZQUFZLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUMzQixJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUN6QixJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFlBQTZCLENBQUMsQ0FBQyxDQUFDLENBQUMsMkJBQTJCO1NBQ3RGOztZQUNDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsOERBQThELENBQUMsQ0FBQyxDQUFDO0lBQ2pHLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIERHIGZyb20gJ2RhdGFncm9rLWFwaS9kZyc7XG5pbXBvcnQgKiBhcyB1aSBmcm9tICdkYXRhZ3Jvay1hcGkvdWknO1xuXG5pbXBvcnQge0Rlc2lyYWJpbGl0eVByb2ZpbGV9IGZyb20gJy4vbXBvJztcbmltcG9ydCB7TXBvRGVzaXJhYmlsaXR5TGluZUVkaXRvcn0gZnJvbSAnLi9tcG8tbGluZS1lZGl0b3InO1xuaW1wb3J0IHtTdWJqZWN0fSBmcm9tICdyeGpzJztcblxuXG5leHBvcnQgY2xhc3MgTXBvUHJvZmlsZUVkaXRvciB7XG4gIHJvb3QgPSB1aS5kaXYoW10pO1xuICBkYXRhRnJhbWU/OiBERy5EYXRhRnJhbWU7XG4gIG9uQ2hhbmdlZCA9IG5ldyBTdWJqZWN0KCk7XG4gIHByb2ZpbGU/OiBEZXNpcmFiaWxpdHlQcm9maWxlO1xuXG4gIGNvbnN0cnVjdG9yKGRhdGFGcmFtZT86IERHLkRhdGFGcmFtZSkge1xuICAgIHRoaXMuZGF0YUZyYW1lID0gZGF0YUZyYW1lO1xuICAgIHRoaXMuc2V0UHJvZmlsZSgpO1xuICB9XG5cbiAgZ2V0UHJvZmlsZSgpOiBEZXNpcmFiaWxpdHlQcm9maWxlIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5wcm9maWxlO1xuICB9XG5cbiAgc2V0UHJvZmlsZShwcm9maWxlPzogRGVzaXJhYmlsaXR5UHJvZmlsZSkge1xuICAgIHRoaXMucHJvZmlsZSA9IHByb2ZpbGU7XG4gICAgdWkuZW1wdHkodGhpcy5yb290KTtcbiAgICBpZiAoIXByb2ZpbGUpIHtcbiAgICAgIHRoaXMucm9vdC5hcHBlbmQodWkuZGl2VGV4dCgnTm8gcHJvZmlsZSBzcGVjaWZpZWQuJykpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSBoZWFkZXIgcm93IGZvciB0aGUgdGFibGVcbiAgICBjb25zdCBoZWFkZXIgPSB1aS5kaXZIKFtcbiAgICAgIHVpLmRpdlRleHQoJ1Byb3BlcnR5Jywge3N0eWxlOiB7Zm9udFdlaWdodDogJ2JvbGQnLCB3aWR0aDogJzE1MHB4J319KSxcbiAgICAgIHVpLmRpdlRleHQoJ1dlaWdodCcsIHtzdHlsZToge2ZvbnRXZWlnaHQ6ICdib2xkJywgd2lkdGg6ICc2MHB4J319KSxcbiAgICAgIHVpLmRpdlRleHQoJ0Rlc2lyYWJpbGl0eScsIHtzdHlsZToge2ZvbnRXZWlnaHQ6ICdib2xkJywgZmxleEdyb3c6ICcxJ319KSwgLy8gTGV0IGVkaXRvciB0YWtlIHNwYWNlXG4gICAgXSwge3N0eWxlOiB7XG4gICAgICBtYXJnaW5Ub3A6ICcxMHB4JyxcbiAgICAgIHBhZGRpbmdCb3R0b206ICc1cHgnLFxuICAgICAgYm9yZGVyQm90dG9tOiAnMXB4IHNvbGlkICNjY2MnLFxuICAgIH0sXG4gICAgfSk7XG5cbiAgICBjb25zdCBwcm9wZXJ0eVJvd3MgPSBPYmplY3QuZW50cmllcyhwcm9maWxlLnByb3BlcnRpZXMpLm1hcCgoW3Byb3BlcnR5TmFtZSwgcHJvcF0pID0+IHtcbiAgICAgIGNvbnN0IGxpbmVFZGl0b3IgPSBuZXcgTXBvRGVzaXJhYmlsaXR5TGluZUVkaXRvcihwcm9wLCAzMDAsIDgwKTtcbiAgICAgIGxpbmVFZGl0b3Iub25DaGFuZ2VkLnN1YnNjcmliZSgoXykgPT4gdGhpcy5vbkNoYW5nZWQubmV4dCgpKTtcblxuICAgICAgLy8gSW5wdXQgZm9yIHdlaWdodCAtIHVwZGF0ZXMgdGhlICpjb3B5KiBvZiB0aGUgdGVtcGxhdGUgZGF0YVxuICAgICAgY29uc3Qgd2VpZ2h0SW5wdXQgPSB1aS5pbnB1dC5mbG9hdCgnJywgeyAvLyBObyBsYWJlbCBuZWVkZWQgaGVyZVxuICAgICAgICB2YWx1ZTogcHJvcC53ZWlnaHQsIG1pbjogMCwgbWF4OiAxLFxuICAgICAgICBvblZhbHVlQ2hhbmdlZDogKG5ld1ZhbHVlKSA9PiB7IC8vIENoYW5nZWQgcGFyYW1ldGVyIG5hbWUgZm9yIGNsYXJpdHlcbiAgICAgICAgICBpZiAocHJvZmlsZSAmJiBwcm9maWxlLnByb3BlcnRpZXNbcHJvcGVydHlOYW1lXSkge1xuICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSB3ZWlnaHQgaW4gdGhlIHRlbXBvcmFyeSB0ZW1wbGF0ZSBvYmplY3RcbiAgICAgICAgICAgIGxldCBjbGFtcGVkV2VpZ2h0ID0gbmV3VmFsdWUgPz8gMDtcbiAgICAgICAgICAgIGNsYW1wZWRXZWlnaHQgPSBNYXRoLm1heCgwLCBNYXRoLm1pbigxLCBjbGFtcGVkV2VpZ2h0KSk7IC8vIENsYW1wIDAtMVxuICAgICAgICAgICAgcHJvZmlsZS5wcm9wZXJ0aWVzW3Byb3BlcnR5TmFtZV0ud2VpZ2h0ID0gY2xhbXBlZFdlaWdodDtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICB9KTtcblxuICAgICAgd2VpZ2h0SW5wdXQucm9vdC5zdHlsZS53aWR0aCA9ICc2MHB4JztcbiAgICAgIHdlaWdodElucHV0LnJvb3Quc3R5bGUubWFyZ2luVG9wID0gJzIxcHgnO1xuXG4gICAgICBjb25zdCBtYXRjaGVkQ29sdW1uTmFtZSA9IHRoaXMuZGF0YUZyYW1lID9cbiAgICAgICAgdGhpcy5kYXRhRnJhbWUuY29sdW1ucy5uYW1lcygpLmZpbmQoKG5hbWUpID0+IG5hbWUudG9Mb3dlckNhc2UoKSA9PSBwcm9wZXJ0eU5hbWUudG9Mb3dlckNhc2UoKSkgOlxuICAgICAgICBudWxsO1xuXG4gICAgICBjb25zdCBjb2x1bW5JbnB1dCA9IHVpLmlucHV0LmNob2ljZSgnJywge1xuICAgICAgICBudWxsYWJsZTogdHJ1ZSxcbiAgICAgICAgaXRlbXM6IHRoaXMuZGF0YUZyYW1lPy5jb2x1bW5zPy5uYW1lcygpID8/IFsnJ10sXG4gICAgICAgIHZhbHVlOiBtYXRjaGVkQ29sdW1uTmFtZSA/PyAnJ30pO1xuXG4gICAgICBjb25zdCByb3dEaXYgPSB1aS5kaXZIKFtcbiAgICAgICAgdWkuZGl2VihbXG4gICAgICAgICAgdWkuZGl2VGV4dChwcm9wZXJ0eU5hbWUsIHtzdHlsZToge3dpZHRoOiAnMTUwcHgnLCBwYWRkaW5nVG9wOiAnNXB4JywgbWFyZ2luTGVmdDogJzRweCd9fSksXG4gICAgICAgICAgdGhpcy5kYXRhRnJhbWUgPyBjb2x1bW5JbnB1dC5yb290IDogbnVsbCxcbiAgICAgICAgXSksXG4gICAgICAgIHdlaWdodElucHV0LnJvb3QsXG4gICAgICAgIGxpbmVFZGl0b3Iucm9vdCwgLy8gQWRkIHRoZSBLb252YSBjb250YWluZXIgZGl2XG4gICAgICBdKTtcbiAgICAgIHJvd0Rpdi5zdHlsZS5hbGlnbkl0ZW1zID0gJ2NlbnRlcic7IC8vIFZlcnRpY2FsbHkgYWxpZ24gaXRlbXMgaW4gdGhlIHJvd1xuICAgICAgcm93RGl2LnN0eWxlLm1hcmdpbkJvdHRvbSA9ICc1cHgnOyAvLyBTcGFjZSBiZXR3ZWVuIHJvd3NcbiAgICAgIHJvd0Rpdi5zdHlsZS5taW5IZWlnaHQgPSAnNzBweCc7IC8vIEVuc3VyZSBjb25zaXN0ZW50IHJvdyBoZWlnaHQgZXZlbiBpZiBlZGl0b3IgdGFrZXMgdGltZVxuXG4gICAgICByZXR1cm4gcm93RGl2O1xuICAgIH0pLmZpbHRlcigoZWwpID0+IGVsICE9PSBudWxsKTsgLy8gRmlsdGVyIG91dCBza2lwcGVkIHByb3BlcnRpZXNcblxuICAgIGlmIChwcm9wZXJ0eVJvd3MubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5yb290LmFwcGVuZChoZWFkZXIpO1xuICAgICAgdGhpcy5yb290LmFwcGVuZCh1aS5kaXZWKHByb3BlcnR5Um93cyBhcyBIVE1MRWxlbWVudFtdKSk7IC8vIENhc3QgbmVlZGVkIGFmdGVyIGZpbHRlclxuICAgIH0gZWxzZVxuICAgICAgdGhpcy5yb290LmFwcGVuZCh1aS5kaXZUZXh0KCdObyBtYXRjaGluZyBwcm9wZXJ0aWVzIGZvdW5kIGluIHRoZSB0YWJsZSBmb3IgdGhpcyB0ZW1wbGF0ZS4nKSk7XG4gIH1cbn1cbiJdfQ==
|
|
389
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXBvLXByb2ZpbGUtZWRpdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsibXBvLXByb2ZpbGUtZWRpdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sS0FBSyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDdEMsT0FBTyxLQUFLLElBQUksTUFBTSxtQkFBbUIsQ0FBQztBQUUxQyxPQUFPLEVBQUMsT0FBTyxFQUFlLE1BQU0sTUFBTSxDQUFDO0FBQzNDLE9BQU8sRUFDTCxtQkFBbUIsRUFBRSwwQkFBMEIsRUFFL0Msd0JBQXdCLEVBQUUsc0JBQXNCLEVBQUUsV0FBVyxFQUFFLG1CQUFtQixHQUNuRixNQUFNLE9BQU8sQ0FBQztBQUNmLE9BQU8sRUFBcUIseUJBQXlCLEVBQUMsTUFBTSx1Q0FBdUMsQ0FBQztBQUNwRyxPQUFPLEVBQUMsc0JBQXNCLEVBQUMsTUFBTSxvQ0FBb0MsQ0FBQztBQUUxRSxPQUFPLHNCQUFzQixDQUFDO0FBRTlCLE9BQU8sRUFBQyx1QkFBdUIsRUFBQyxNQUFNLFNBQVMsQ0FBQztBQUVoRCxNQUFNLDBCQUEwQixHQUFHLEVBQUUsQ0FBQztBQUV0QyxNQUFNLE9BQU8sZ0JBQWdCO0lBaUIzQixZQUFZLFNBQXdCLEVBQUUsTUFBTSxHQUFHLEtBQUssRUFBRSxPQUFPLEdBQUcsS0FBSztRQWhCNUQsU0FBSSxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDbEIsY0FBUyxHQUFHLElBQUksT0FBTyxFQUFRLENBQUM7UUFLekMsV0FBTSxHQUFHLEtBQUssQ0FBQztRQUNmLFlBQU8sR0FBRyxLQUFLLENBQUM7UUFFUixTQUFJLEdBQWdDLEVBQUUsQ0FBQztRQUN2QyxXQUFNLEdBQTJCLEVBQUUsQ0FBQztRQUNwQyxZQUFPLEdBQUcsSUFBSSxHQUFHLEVBQXdCLENBQUM7UUFFMUMsa0JBQWEsR0FBYSxFQUFFLENBQUM7UUFDckMsa0JBQWEsR0FBa0MsRUFBRSxDQUFDO1FBR2hELElB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LE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ2xELElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBRS9DLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBQ2xGLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsTUFBTSxDQUFDO1FBRTdCLE1BQUEsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsMENBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2hDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUNwQixDQUFDO0lBRU8sY0FBYyxDQUNwQixJQUFZLEVBQ1osT0FBMEM7O1FBRTFDLE1BQU0sSUFBSSxHQUFHLE1BQUEsSUFBSSxDQUFDLE9BQU8sMENBQUUsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzVDLElBQUksQ0FBQyxJQUFJO1lBQ1AsT0FBTztRQUVULE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNkLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUNwQixDQUFDO0lBRU8sVUFBVTtRQUNoQixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3RCLElBQUksQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUFDLHVCQUF1QixFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQzNELENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIERHIGZyb20gJ2RhdGFncm9rLWFwaS9kZyc7XG5pbXBvcnQgKiBhcyB1aSBmcm9tICdkYXRhZ3Jvay1hcGkvdWknO1xuaW1wb3J0ICogYXMgZ3JvayBmcm9tICdkYXRhZ3Jvay1hcGkvZ3Jvayc7XG5cbmltcG9ydCB7U3ViamVjdCwgU3Vic2NyaXB0aW9ufSBmcm9tICdyeGpzJztcbmltcG9ydCB7XG4gIERFRkFVTFRfQUdHUkVHQVRJT04sIFdFSUdIVEVEX0FHR1JFR0FUSU9OU19MSVNULFxuICBEZXNpcmFiaWxpdHlQcm9maWxlLCBQcm9wZXJ0eURlc2lyYWJpbGl0eSwgV2VpZ2h0ZWRBZ2dyZWdhdGlvbixcbiAgY3JlYXRlRGVmYXVsdENhdGVnb3JpY2FsLCBjcmVhdGVEZWZhdWx0TnVtZXJpY2FsLCBpc051bWVyaWNhbCwgbWlncmF0ZURlc2lyYWJpbGl0eSxcbn0gZnJvbSAnLi9tcG8nO1xuaW1wb3J0IHtEZXNpcmFiaWxpdHlFZGl0b3IsIERlc2lyYWJpbGl0eUVkaXRvckZhY3Rvcnl9IGZyb20gJy4vZWRpdG9ycy9kZXNpcmFiaWxpdHktZWRpdG9yLWZhY3RvcnknO1xuaW1wb3J0IHtEZXNpcmFiaWxpdHlNb2RlRGlhbG9nfSBmcm9tICcuL2RpYWxvZ3MvZGVzaXJhYmlsaXR5LW1vZGUtZGlhbG9nJztcblxuaW1wb3J0ICcuLi8uLi9jc3Mvc3R5bGVzLmNzcyc7XG5cbmltcG9ydCB7TVBPX1NDT1JFX0NIQU5HRURfRVZFTlR9IGZyb20gJy4vdXRpbHMnO1xuXG5jb25zdCBNQVhfQ0FURUdPUklDQUxfQ0FURUdPUklFUyA9IDIwO1xuXG5leHBvcnQgY2xhc3MgTXBvUHJvZmlsZUVkaXRvciB7XG4gIHJlYWRvbmx5IHJvb3QgPSB1aS5kaXYoW10pO1xuICByZWFkb25seSBvbkNoYW5nZWQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuICByZWFkb25seSBhZ2dyZWdhdGlvbklucHV0OiBERy5DaG9pY2VJbnB1dDxXZWlnaHRlZEFnZ3JlZ2F0aW9uIHwgbnVsbD47XG5cbiAgcHJvZmlsZT86IERlc2lyYWJpbGl0eVByb2ZpbGU7XG4gIGRhdGFGcmFtZT86IERHLkRhdGFGcmFtZTtcbiAgZGVzaWduID0gZmFsc2U7XG4gIHByZXZpZXcgPSBmYWxzZTtcblxuICBwcml2YXRlIHJvd3M6IFJlY29yZDxzdHJpbmcsIEhUTUxFbGVtZW50PiA9IHt9O1xuICBwcml2YXRlIHJvd0lkczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICBwcml2YXRlIHJvd1N1YnMgPSBuZXcgTWFwPHN0cmluZywgU3Vic2NyaXB0aW9uPigpO1xuXG4gIHByaXZhdGUgcHJvcGVydHlPcmRlcjogc3RyaW5nW10gPSBbXTtcbiAgY29sdW1uTWFwcGluZzogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgbnVsbD4gPSB7fTtcblxuICBjb25zdHJ1Y3RvcihkYXRhRnJhbWU/OiBERy5EYXRhRnJhbWUsIGRlc2lnbiA9IGZhbHNlLCBwcmV2aWV3ID0gZmFsc2UpIHtcbiAgICB0aGlzLmRhdGFGcmFtZSA9IGRhdGFGcmFtZTtcbiAgICB0aGlzLmRlc2lnbiA9IGRlc2lnbjtcbiAgICB0aGlzLnByZXZpZXcgPSBwcmV2aWV3O1xuICAgIHRoaXMuYWdncmVnYXRpb25JbnB1dCA9IHVpLmlucHV0LmNob2ljZSgnQWdncmVnYXRpb24nLCB7XG4gICAgICBpdGVtczogV0VJR0hURURfQUdHUkVHQVRJT05TX0xJU1QsXG4gICAgICB2YWx1ZTogREVGQVVMVF9BR0dSRUdBVElPTixcbiAgICAgIG51bGxhYmxlOiBmYWxzZSxcbiAgICAgIG9uVmFsdWVDaGFuZ2VkOiAodikgPT4ge1xuICAgICAgICBpZiAodGhpcy5wcm9maWxlKVxuICAgICAgICAgIHRoaXMucHJvZmlsZS5hZ2dyZWdhdGlvbiA9IHY7XG4gICAgICAgIHRoaXMuZW1pdENoYW5nZSgpO1xuICAgICAgfSxcbiAgICB9KTtcbiAgICB0aGlzLmFnZ3JlZ2F0aW9uSW5wdXQuc2V0VG9vbHRpcCgnU2NvcmUgYWdncmVnYXRpb24gbWV0aG9kJyk7XG4gIH1cblxuICBwcml2YXRlIG5ld1Jvd0lkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGNyeXB0by5yYW5kb21VVUlEKCk7XG4gIH1cblxuICBzZXRQcm9maWxlKHByb2ZpbGU/OiBEZXNpcmFiaWxpdHlQcm9maWxlKTogdm9pZCB7XG4gICAgaWYgKHByb2ZpbGUpIHtcbiAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHByb2ZpbGUucHJvcGVydGllcykpIHtcbiAgICAgICAgY29uc3QgcHJvcCA9IG1pZ3JhdGVEZXNpcmFiaWxpdHkocHJvZmlsZS5wcm9wZXJ0aWVzW2tleV0pO1xuICAgICAgICBpZiAoaXNOdW1lcmljYWwocHJvcCkpXG4gICAgICAgICAgcHJvcC5tb2RlID8/PSAnZnJlZWZvcm0nO1xuICAgICAgICBwcm9maWxlLnByb3BlcnRpZXNba2V5XSA9IHByb3A7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBzdWIgb2YgdGhpcy5yb3dTdWJzLnZhbHVlcygpKVxuICAgICAgc3ViLnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5yb3dTdWJzLmNsZWFyKCk7XG5cbiAgICB0aGlzLnByb2ZpbGUgPSBwcm9maWxlO1xuICAgIHRoaXMuYWdncmVnYXRpb25JbnB1dC52YWx1ZSA9IHByb2ZpbGU/LmFnZ3JlZ2F0aW9uID8/IERFRkFVTFRfQUdHUkVHQVRJT047XG4gICAgdGhpcy5jb2x1bW5NYXBwaW5nID0ge307XG4gICAgdGhpcy5yb3dzID0ge307XG4gICAgdGhpcy5yb3dJZHMgPSB7fTtcbiAgICB0aGlzLnByb3BlcnR5T3JkZXIgPSBwcm9maWxlID8gT2JqZWN0LmtleXMocHJvZmlsZS5wcm9wZXJ0aWVzKSA6IFtdO1xuXG4gICAgZm9yIChjb25zdCBuYW1lIG9mIHRoaXMucHJvcGVydHlPcmRlcilcbiAgICAgIHRoaXMucm93SWRzW25hbWVdID0gdGhpcy5uZXdSb3dJZCgpO1xuXG4gICAgdGhpcy5yZW5kZXIoKTtcbiAgfVxuXG4gIGdldFByb2ZpbGUoKTogRGVzaXJhYmlsaXR5UHJvZmlsZSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMucHJvZmlsZTtcbiAgfVxuXG4gIHNldERlc2lnbk1vZGUob246IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5kZXNpZ24gPT09IG9uKVxuICAgICAgcmV0dXJuO1xuICAgIHRoaXMuZGVzaWduID0gb247XG4gICAgdGhpcy5yb3dzID0ge307XG4gICAgdGhpcy5yZW5kZXIoKTtcbiAgfVxuXG4gIHNldFByZXZpZXdNb2RlKG9uOiBib29sZWFuKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucHJldmlldyA9PT0gb24pXG4gICAgICByZXR1cm47XG4gICAgdGhpcy5wcmV2aWV3ID0gb247XG4gICAgdGhpcy5yb3dzID0ge307XG4gICAgdGhpcy5yZW5kZXIoKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVuZGVyKCk6IHZvaWQge1xuICAgIHVpLmVtcHR5KHRoaXMucm9vdCk7XG5cbiAgICBpZiAoIXRoaXMucHJvZmlsZSlcbiAgICAgIHJldHVybiB0aGlzLnJlbmRlckVtcHR5KCdObyBwcm9maWxlIHNwZWNpZmllZC4nKTtcblxuICAgIGNvbnN0IHJvd3MgPSB0aGlzLnByb3BlcnR5T3JkZXIubWFwKChuYW1lKSA9PiB7XG4gICAgICBjb25zdCByb3dJZCA9IHRoaXMucm93SWRzW25hbWVdO1xuICAgICAgaWYgKCF0aGlzLnJvd3Nbcm93SWRdKVxuICAgICAgICB0aGlzLnJvd3Nbcm93SWRdID0gdGhpcy5idWlsZFJvdyhuYW1lLCByb3dJZCwgdGhpcy5wcm9maWxlIS5wcm9wZXJ0aWVzW25hbWVdKTtcbiAgICAgIHJldHVybiB0aGlzLnJvd3Nbcm93SWRdO1xuICAgIH0pO1xuXG4gICAgaWYgKCFyb3dzLmxlbmd0aCkge1xuICAgICAgaWYgKCF0aGlzLnByZXZpZXcpXG4gICAgICAgIHRoaXMucm9vdC5hcHBlbmQodGhpcy5idWlsZEhlYWRlcigpKTtcbiAgICAgIGlmICh0aGlzLmRlc2lnbilcbiAgICAgICAgcmV0dXJuIHRoaXMucmVuZGVyRGVzaWduRW1wdHkoKTtcbiAgICAgIHJldHVybiB0aGlzLnJlbmRlckVtcHR5KCdObyBwcm9wZXJ0aWVzIGRlZmluZWQuJyk7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLnByZXZpZXcpXG4gICAgICB0aGlzLnJvb3QuYXBwZW5kKHRoaXMuYnVpbGRIZWFkZXIoKSk7XG4gICAgdGhpcy5yb290LmFwcGVuZCh1aS5kaXZWKHJvd3MpKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVuZGVyRW1wdHkodGV4dDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5yb290LmFwcGVuZCh1aS5kaXZUZXh0KHRleHQpKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVuZGVyRGVzaWduRW1wdHkoKTogdm9pZCB7XG4gICAgY29uc3QgaWNvbiA9IHVpLmljb25GQSgnY2hhcnQtbGluZScpO1xuICAgIGNvbnN0IGhlYWRpbmcgPSB1aS5oMygnTm8gcHJvcGVydGllcyB5ZXQnKTtcbiAgICBjb25zdCBtc2cgPSB1aS5wKCdTZWxlY3QgYSBkYXRhc2V0IHRvIGF1dG8tcG9wdWxhdGUgcHJvcGVydGllcyBmcm9tIGl0cyBudW1lcmljYWwgY29sdW1ucywgb3IgYWRkIHRoZW0gbWFudWFsbHkuJyk7XG4gICAgY29uc3QgYWRkQnRuID0gdWkubGluaygnKyBBZGQgUHJvcGVydHknLCAoKSA9PiB0aGlzLmFkZFByb3BlcnR5KCkpO1xuICAgIGNvbnN0IGNvbnRhaW5lciA9IHVpLmRpdlYoW2ljb24sIGhlYWRpbmcsIG1zZywgYWRkQnRuXSwgJ3N0YXRpc3RpY3MtbXBvLWVtcHR5LXN0YXRlJyk7XG4gICAgdGhpcy5yb290LmFwcGVuZChjb250YWluZXIpO1xuICB9XG5cbiAgYWRkUHJvcGVydHkoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnByb2ZpbGUpXG4gICAgICByZXR1cm47XG5cbiAgICBjb25zdCBuZXdOYW1lID0gYE5ld1Byb3BlcnR5JHtPYmplY3Qua2V5cyh0aGlzLnByb2ZpbGUucHJvcGVydGllcykubGVuZ3RoICsgMX1gO1xuICAgIGNvbnN0IG5ld1Jvd0lkID0gdGhpcy5uZXdSb3dJZCgpO1xuXG4gICAgdGhpcy5wcm9maWxlLnByb3BlcnRpZXNbbmV3TmFtZV0gPSBjcmVhdGVEZWZhdWx0TnVtZXJpY2FsKCk7XG4gICAgdGhpcy5yb3dJZHNbbmV3TmFtZV0gPSBuZXdSb3dJZDtcbiAgICB0aGlzLnByb3BlcnR5T3JkZXIucHVzaChuZXdOYW1lKTtcblxuICAgIHRoaXMucm93cyA9IHt9O1xuICAgIHRoaXMucmVuZGVyKCk7XG4gICAgdGhpcy5lbWl0Q2hhbmdlKCk7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkSGVhZGVyKCk6IEhUTUxFbGVtZW50IHtcbiAgICByZXR1cm4gdWkuZGl2SChbXG4gICAgICB1aS5kaXZUZXh0KCdQcm9wZXJ0eScsICdzdGF0aXN0aWNzLW1wby1oZWFkZXItcHJvcGVydHknKSxcbiAgICAgIHVpLmRpdlRleHQoJ1dlaWdodCcsICdzdGF0aXN0aWNzLW1wby1oZWFkZXItd2VpZ2h0JyksXG4gICAgICB1aS5kaXZUZXh0KCdEZXNpcmFiaWxpdHknLCAnc3RhdGlzdGljcy1tcG8taGVhZGVyLWRlc2lyYWJpbGl0eScpLFxuICAgIF0sICdzdGF0aXN0aWNzLW1wby1oZWFkZXInKTtcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRSb3coXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIHJvd0lkOiBzdHJpbmcsXG4gICAgcHJvcDogUHJvcGVydHlEZXNpcmFiaWxpdHksXG4gICk6IEhUTUxFbGVtZW50IHtcbiAgICBjb25zdCByb3cgPSB1aS5kaXZIKFtdLCAnc3RhdGlzdGljcy1tcG8tcm93Jyk7XG4gICAgcm93LmRhdGFzZXQucm93SWQgPSByb3dJZDtcblxuICAgIGNvbnN0IGNvbCA9IHRoaXMucmVzb2x2ZUNvbHVtbihuYW1lKTtcbiAgICBpZiAoY29sKSB7XG4gICAgICBjb25zdCBjb3JyZWN0ZWQgPSB0aGlzLmNvcnJlY3RQcm9wZXJ0eVR5cGUocHJvcCwgY29sKTtcbiAgICAgIGlmIChjb3JyZWN0ZWQpIHtcbiAgICAgICAgcHJvcCA9IGNvcnJlY3RlZDtcbiAgICAgICAgdGhpcy5wcm9maWxlIS5wcm9wZXJ0aWVzW25hbWVdID0gcHJvcDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBlZGl0b3IgPSBEZXNpcmFiaWxpdHlFZGl0b3JGYWN0b3J5LmNyZWF0ZShwcm9wLCAzMDAsIDgwLCB0aGlzLmRlc2lnbik7XG4gICAgZWRpdG9yLnJvb3QuY2xhc3NMaXN0LmFkZCgnc3RhdGlzdGljcy1tcG8tZWRpdG9yLWZpbGwnKTtcbiAgICB0aGlzLnJvd1N1YnMuZ2V0KHJvd0lkKT8udW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLnJvd1N1YnMuc2V0KHJvd0lkLCBlZGl0b3Iub25DaGFuZ2VkLnN1YnNjcmliZSgoKSA9PiB0aGlzLmVtaXRDaGFuZ2UoKSkpO1xuXG4gICAgY29uc3QgcHJvcGVydHlDZWxsID0gdGhpcy5idWlsZFByb3BlcnR5Q2VsbChyb3dJZCwgbmFtZSk7XG4gICAgY29uc3Qgd2VpZ2h0Q2VsbCA9IHRoaXMuYnVpbGRXZWlnaHRDZWxsKHJvd0lkLCBwcm9wKTtcbiAgICBjb25zdCBjb2x1bW5DZWxsID0gdGhpcy5idWlsZENvbHVtblNlbGVjdG9yKHJvd0lkLCBuYW1lLCBlZGl0b3IpO1xuXG4gICAgY29uc3QgbW9kZUdlYXIgPSB0aGlzLmRlc2lnbiA/XG4gICAgICB0aGlzLmJ1aWxkTW9kZUdlYXIocm93SWQsIHByb3AsIGVkaXRvcikgOlxuICAgICAgbnVsbDtcblxuICAgIGNvbnN0IGNvbnRyb2xzID0gdGhpcy5kZXNpZ24gPyB0aGlzLmJ1aWxkUm93Q29udHJvbHMocm93SWQpIDogbnVsbDtcblxuICAgIHJvdy5hcHBlbmQoXG4gICAgICB1aS5kaXZWKFtwcm9wZXJ0eUNlbGwsIGNvbHVtbkNlbGxdLmZpbHRlcihCb29sZWFuKSwgJ3N0YXRpc3RpY3MtbXBvLXByb3BlcnR5LWNlbGwnKSxcbiAgICAgIHdlaWdodENlbGwsXG4gICAgICB1aS5kaXZIKFtlZGl0b3Iucm9vdCwgbW9kZUdlYXJdLmZpbHRlcihCb29sZWFuKSksXG4gICAgKTtcblxuICAgIGlmIChjb250cm9scylcbiAgICAgIHJvdy5hcHBlbmQoY29udHJvbHMpO1xuXG4gICAgcmV0dXJuIHJvdztcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRQcm9wZXJ0eUNlbGwocm93SWQ6IHN0cmluZywgbmFtZTogc3RyaW5nKTogSFRNTEVsZW1lbnQgfCBudWxsIHtcbiAgICBpZiAodGhpcy5kYXRhRnJhbWUpIHtcbiAgICAgIGNvbnN0IGVsID0gdWkuZGl2VGV4dChuYW1lKTtcbiAgICAgIHVpLnRvb2x0aXAuYmluZChlbCwgKCkgPT4gbmFtZSk7XG4gICAgICByZXR1cm4gZWw7XG4gICAgfVxuXG4gICAgbGV0IGN1cnJlbnROYW1lID0gbmFtZTtcblxuICAgIGNvbnN0IHByb3BOYW1lSW5wID0gdWkuaW5wdXQuc3RyaW5nKCcnLCB7dmFsdWU6IG5hbWUsIG9uVmFsdWVDaGFuZ2VkOiAodikgPT4ge1xuICAgICAgaWYgKCF2IHx8IHYgPT09IGN1cnJlbnROYW1lKVxuICAgICAgICByZXR1cm47XG4gICAgICB0aGlzLnJlbmFtZVByb3BlcnR5KGN1cnJlbnROYW1lLCB2KTtcbiAgICAgIGN1cnJlbnROYW1lID0gdjtcbiAgICB9fSk7XG5cbiAgICB1aS50b29sdGlwLmJpbmQocHJvcE5hbWVJbnAuaW5wdXQsICgpID0+IGN1cnJlbnROYW1lKTtcbiAgICByZXR1cm4gcHJvcE5hbWVJbnAucm9vdDtcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRXZWlnaHRDZWxsKFxuICAgIHJvd0lkOiBzdHJpbmcsXG4gICAgcHJvcDogUHJvcGVydHlEZXNpcmFiaWxpdHksXG4gICk6IEhUTUxFbGVtZW50IHtcbiAgICBjb25zdCBuYW1lID0gdGhpcy5nZXRQcm9wZXJ0eU5hbWVCeVJvd0lkKHJvd0lkKTtcbiAgICBjb25zdCBjaGlsZHJlbjogSFRNTEVsZW1lbnRbXSA9IFtdO1xuXG4gICAgY29uc3Qgd2VpZ2h0SW5wdXQgPSB1aS5pbnB1dC5mbG9hdCgnJywge3ZhbHVlOiBwcm9wLndlaWdodCwgbWluOiAwLCBtYXg6IDEsIGZvcm1hdDogJyMwLjAwMCcsXG4gICAgICBvblZhbHVlQ2hhbmdlZDogKHYpID0+IHtcbiAgICAgICAgaWYgKG5hbWUpXG4gICAgICAgICAgdGhpcy5tdXRhdGVQcm9wZXJ0eShuYW1lLCAocCkgPT4gcC53ZWlnaHQgPSBNYXRoLm1heCgwLCBNYXRoLm1pbigxLCB2ID8/IDApKSk7XG4gICAgICB9LFxuICAgIH0pO1xuICAgIHdlaWdodElucHV0LnJvb3QuY2xhc3NMaXN0LmFkZCgnc3RhdGlzdGljcy1tcG8td2VpZ2h0LWlucHV0Jyk7XG4gICAgY2hpbGRyZW4ucHVzaCh3ZWlnaHRJbnB1dC5yb290KTtcblxuICAgIGlmICh0aGlzLmRhdGFGcmFtZSkge1xuICAgICAgY29uc3QgbnVtQ29scyA9IHRoaXMuZ2V0TnVtZXJpY2FsQ29sdW1uTmFtZXMoKTtcbiAgICAgIGxldCBpc0NvbHVtbiA9ICEhcHJvcC53ZWlnaHRDb2x1bW4gJiYgbnVtQ29scy5pbmNsdWRlcyhwcm9wLndlaWdodENvbHVtbik7XG5cbiAgICAgIGNvbnN0IGNvbElucHV0ID0gdWkuaW5wdXQuY2hvaWNlKCcnLCB7aXRlbXM6IG51bUNvbHMsIG51bGxhYmxlOiB0cnVlLCB2YWx1ZTogcHJvcC53ZWlnaHRDb2x1bW4gPz8gJycsXG4gICAgICAgIG9uVmFsdWVDaGFuZ2VkOiAodikgPT4ge1xuICAgICAgICAgIGlmIChuYW1lKVxuICAgICAgICAgICAgdGhpcy5tdXRhdGVQcm9wZXJ0eShuYW1lLCAocCkgPT4gcC53ZWlnaHRDb2x1bW4gPSB2IHx8IHVuZGVmaW5lZCk7XG4gICAgICAgIH0sXG4gICAgICB9KTtcblxuICAgICAgY29uc3Qgc3luY1RvZ2dsZSA9ICgpID0+IHtcbiAgICAgICAgd2VpZ2h0SW5wdXQucm9vdC5jbGFzc0xpc3QudG9nZ2xlKCdzdGF0aXN0aWNzLW1wby1oaWRkZW4nLCBpc0NvbHVtbik7XG4gICAgICAgIGNvbElucHV0LnJvb3QuY2xhc3NMaXN0LnRvZ2dsZSgnc3RhdGlzdGljcy1tcG8taGlkZGVuJywgIWlzQ29sdW1uKTtcbiAgICAgICAgdG9nZ2xlLmNsYXNzTGlzdC50b2dnbGUoJ3N0YXRpc3RpY3MtbXBvLXdlaWdodC10b2dnbGUtYWN0aXZlJywgaXNDb2x1bW4pO1xuICAgICAgfTtcblxuICAgICAgY29uc3QgdG9nZ2xlID0gdWkuaWNvbkZBKCdjb2x1bW5zJywgKCkgPT4ge1xuICAgICAgICBpc0NvbHVtbiA9ICFpc0NvbHVtbjtcbiAgICAgICAgc3luY1RvZ2dsZSgpO1xuICAgICAgICBpZiAoIWlzQ29sdW1uICYmIG5hbWUpXG4gICAgICAgICAgdGhpcy5tdXRhdGVQcm9wZXJ0eShuYW1lLCAocCkgPT4geyBkZWxldGUgcC53ZWlnaHRDb2x1bW47IH0pO1xuICAgICAgICBlbHNlIGlmIChpc0NvbHVtbiAmJiBuYW1lICYmIGNvbElucHV0LnZhbHVlKVxuICAgICAgICAgIHRoaXMubXV0YXRlUHJvcGVydHkobmFtZSwgKHApID0+IHAud2VpZ2h0Q29sdW1uID0gY29sSW5wdXQudmFsdWUgfHwgdW5kZWZpbmVkKTtcbiAgICAgIH0pO1xuICAgICAgdG9nZ2xlLmNsYXNzTGlzdC5hZGQoJ3N0YXRpc3RpY3MtbXBvLXdlaWdodC10b2dnbGUnKTtcbiAgICAgIHVpLnRvb2x0aXAuYmluZCh0b2dnbGUsICgpID0+IGlzQ29sdW1uID8gJ1N3aXRjaCB0byBtYW51YWwgd2VpZ2h0JyA6ICdVc2Ugd2VpZ2h0IGZyb20gY29sdW1uJyk7XG4gICAgICBzeW5jVG9nZ2xlKCk7XG5cbiAgICAgIGNoaWxkcmVuLnB1c2goY29sSW5wdXQucm9vdCwgdG9nZ2xlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdWkuZGl2SChjaGlsZHJlbiwgJ3N0YXRpc3RpY3MtbXBvLXdlaWdodC1jZWxsJyk7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkQ29sdW1uU2VsZWN0b3IoXG4gICAgcm93SWQ6IHN0cmluZyxcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgZWRpdG9yOiBEZXNpcmFiaWxpdHlFZGl0b3IsXG4gICk6IEhUTUxFbGVtZW50IHwgbnVsbCB7XG4gICAgaWYgKCF0aGlzLmRhdGFGcmFtZSlcbiAgICAgIHJldHVybiBudWxsO1xuXG4gICAgY29uc3QgaXRlbXMgPSB0aGlzLmdldEVsaWdpYmxlQ29sdW1uTmFtZXMoKTtcbiAgICBjb25zdCBtYXRjaGVkID0gdGhpcy5jb2x1bW5NYXBwaW5nW25hbWVdID8/IG51bGw7XG5cbiAgICBpZiAobWF0Y2hlZCkge1xuICAgICAgY29uc3QgY29sID0gdGhpcy5kYXRhRnJhbWUuY29sKG1hdGNoZWQpO1xuICAgICAgZWRpdG9yLnNldENvbHVtbj8uKGNvbCk7XG4gICAgfVxuXG4gICAgY29uc3QgaW5wdXQgPSB1aS5pbnB1dC5jaG9pY2UoJycsIHtpdGVtcywgbnVsbGFibGU6IHRydWUsIHZhbHVlOiBtYXRjaGVkID8/ICcnLCBvblZhbHVlQ2hhbmdlZDogKHYpID0+IHtcbiAgICAgIHRoaXMuY29sdW1uTWFwcGluZ1tuYW1lXSA9IHYgPz8gbnVsbDtcbiAgICAgIGNvbnN0IGNvbCA9IHYgPyB0aGlzLmRhdGFGcmFtZSEuY29sKHYpIDogbnVsbDtcbiAgICAgIGlmIChjb2wgJiYgdGhpcy5zd2l0Y2hQcm9wZXJ0eVR5cGUobmFtZSwgcm93SWQsIGNvbCkpXG4gICAgICAgIHJldHVybjtcbiAgICAgIGVkaXRvci5zZXRDb2x1bW4/Lihjb2wpO1xuICAgICAgdGhpcy5lbWl0Q2hhbmdlKCk7XG4gICAgfX0pO1xuICAgIHJldHVybiBpbnB1dC5yb290O1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRFbGlnaWJsZUNvbHVtbk5hbWVzKCk6IHN0cmluZ1tdIHtcbiAgICBpZiAoIXRoaXMuZGF0YUZyYW1lKVxuICAgICAgcmV0dXJuIFtdO1xuICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMuZGF0YUZyYW1lLmNvbHVtbnMpXG4gICAgICAuZmlsdGVyKChjKSA9PiAhYy5pc0NhdGVnb3JpY2FsIHx8IGMuY2F0ZWdvcmllcy5sZW5ndGggPD0gTUFYX0NBVEVHT1JJQ0FMX0NBVEVHT1JJRVMpXG4gICAgICAubWFwKChjKSA9PiBjLm5hbWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXROdW1lcmljYWxDb2x1bW5OYW1lcygpOiBzdHJpbmdbXSB7XG4gICAgaWYgKCF0aGlzLmRhdGFGcmFtZSlcbiAgICAgIHJldHVybiBbXTtcbiAgICByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLmRhdGFGcmFtZS5jb2x1bW5zLm51bWVyaWNhbCkubWFwKChjKSA9PiBjLm5hbWUpO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNvbHZlQ29sdW1uKG5hbWU6IHN0cmluZyk6IERHLkNvbHVtbiB8IG51bGwge1xuICAgIGlmICghdGhpcy5kYXRhRnJhbWUpXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBlbGlnaWJsZSA9IHRoaXMuZ2V0RWxpZ2libGVDb2x1bW5OYW1lcygpO1xuICAgIGNvbnN0IGNvbE5hbWUgPSB0aGlzLmNvbHVtbk1hcHBpbmdbbmFtZV0gPz8gZWxpZ2libGUuZmluZCgoYykgPT4gYy50b0xvd2VyQ2FzZSgpID09PSBuYW1lLnRvTG93ZXJDYXNlKCkpID8/IG51bGw7XG4gICAgaWYgKGNvbE5hbWUpXG4gICAgICB0aGlzLmNvbHVtbk1hcHBpbmdbbmFtZV0gPSBjb2xOYW1lO1xuICAgIHJldHVybiBjb2xOYW1lID8gdGhpcy5kYXRhRnJhbWUuY29sKGNvbE5hbWUpID8/IG51bGwgOiBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBjb3JyZWN0UHJvcGVydHlUeXBlKHByb3A6IFByb3BlcnR5RGVzaXJhYmlsaXR5LCBjb2w6IERHLkNvbHVtbik6IFByb3BlcnR5RGVzaXJhYmlsaXR5IHwgbnVsbCB7XG4gICAgaWYgKGlzTnVtZXJpY2FsKHByb3ApICYmIGNvbC5pc0NhdGVnb3JpY2FsKSB7XG4gICAgICBjb25zdCBjYXRlZ29yaWVzID0gY29sLmNhdGVnb3JpZXMubWFwKChjOiBzdHJpbmcpID0+ICh7bmFtZTogYywgZGVzaXJhYmlsaXR5OiAxfSkpO1xuICAgICAgcmV0dXJuIGNyZWF0ZURlZmF1bHRDYXRlZ29yaWNhbChwcm9wLndlaWdodCwgY2F0ZWdvcmllcyk7XG4gICAgfVxuXG4gICAgaWYgKCFpc051bWVyaWNhbChwcm9wKSAmJiBjb2wuaXNOdW1lcmljYWwpXG4gICAgICByZXR1cm4gY3JlYXRlRGVmYXVsdE51bWVyaWNhbChwcm9wLndlaWdodCwgY29sLm1pbiwgY29sLm1heCk7XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgc3dpdGNoUHJvcGVydHlUeXBlKFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICByb3dJZDogc3RyaW5nLFxuICAgIGNvbDogREcuQ29sdW1uLFxuICApOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMucHJvZmlsZSlcbiAgICAgIHJldHVybiBmYWxzZTtcblxuICAgIGNvbnN0IGNvcnJlY3RlZCA9IHRoaXMuY29ycmVjdFByb3BlcnR5VHlwZSh0aGlzLnByb2ZpbGUucHJvcGVydGllc1tuYW1lXSwgY29sKTtcbiAgICBpZiAoIWNvcnJlY3RlZClcbiAgICAgIHJldHVybiBmYWxzZTtcblxuICAgIHRoaXMucHJvZmlsZS5wcm9wZXJ0aWVzW25hbWVdID0gY29ycmVjdGVkO1xuICAgIHRoaXMucmVidWlsZFJvdyhuYW1lLCByb3dJZCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBwcml2YXRlIHJlYnVpbGRSb3cobmFtZTogc3RyaW5nLCByb3dJZDogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3Qgb2xkUm93ID0gdGhpcy5yb3dzW3Jvd0lkXTtcbiAgICBjb25zdCBuZXdSb3cgPSB0aGlzLmJ1aWxkUm93KG5hbWUsIHJvd0lkLCB0aGlzLnByb2ZpbGUhLnByb3BlcnRpZXNbbmFtZV0pO1xuICAgIHRoaXMucm93c1tyb3dJZF0gPSBuZXdSb3c7XG5cbiAgICBpZiAob2xkUm93Py5wYXJlbnROb2RlKVxuICAgICAgb2xkUm93LnJlcGxhY2VXaXRoKG5ld1Jvdyk7XG5cbiAgICB0aGlzLmVtaXRDaGFuZ2UoKTtcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRNb2RlR2VhcihcbiAgICByb3dJZDogc3RyaW5nLFxuICAgIHByb3A6IFByb3BlcnR5RGVzaXJhYmlsaXR5LFxuICAgIGVkaXRvcjogRGVzaXJhYmlsaXR5RWRpdG9yLFxuICApOiBIVE1MRWxlbWVudCB7XG4gICAgY29uc3QgZ2VhciA9IHVpLmljb25zLnNldHRpbmdzKCgpID0+IHtcbiAgICAgIGNvbnN0IG5hbWUgPSB0aGlzLmdldFByb3BlcnR5TmFtZUJ5Um93SWQocm93SWQpO1xuICAgICAgaWYgKCFuYW1lKVxuICAgICAgICByZXR1cm47XG4gICAgICBjb25zdCBjb2xOYW1lID0gdGhpcy5jb2x1bW5NYXBwaW5nW25hbWVdO1xuICAgICAgY29uc3QgY29sID0gY29sTmFtZSA/IHRoaXMuZGF0YUZyYW1lPy5jb2woY29sTmFtZSkgPz8gbnVsbCA6IG51bGw7XG4gICAgICB0aGlzLm9wZW5Nb2RlRGlhbG9nKG5hbWUsIHJvd0lkLCBwcm9wLCBlZGl0b3IsIGNvbCk7XG4gICAgfSk7XG5cbiAgICBnZWFyLmNsYXNzTGlzdC5hZGQoJ3N0YXRpc3RpY3MtbXBvLWdlYXInKTtcbiAgICByZXR1cm4gZ2VhcjtcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRSb3dDb250cm9scyhyb3dJZDogc3RyaW5nKTogSFRNTEVsZW1lbnQge1xuICAgIGNvbnN0IGFkZCA9IHVpLmljb25zLmFkZCgoKSA9PiB0aGlzLmluc2VydFJvd0FmdGVyUm93KHJvd0lkKSk7XG4gICAgY29uc3QgZGVsID0gdWkuaWNvbnMuZGVsZXRlKCgpID0+IHRoaXMuZGVsZXRlUm93KHJvd0lkKSk7XG4gICAgcmV0dXJuIHVpLmRpdkgoW2FkZCwgZGVsXSwgJ3N0YXRpc3RpY3MtbXBvLWNvbnRyb2wtYnV0dG9ucycpO1xuICB9XG5cbiAgcHJpdmF0ZSBvcGVuTW9kZURpYWxvZyhcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgcm93SWQ6IHN0cmluZyxcbiAgICBwcm9wOiBQcm9wZXJ0eURlc2lyYWJpbGl0eSxcbiAgICBlZGl0b3I6IERlc2lyYWJpbGl0eUVkaXRvcixcbiAgICBtYXBwZWRDb2w6IERHLkNvbHVtbiB8IG51bGwgPSBudWxsLFxuICApOiB2b2lkIHtcbiAgICBuZXcgRGVzaXJhYmlsaXR5TW9kZURpYWxvZyhcbiAgICAgIG5hbWUsXG4gICAgICBwcm9wLFxuICAgICAgKHBhdGNoKSA9PiB7XG4gICAgICAgIGNvbnN0IHAgPSB0aGlzLnByb2ZpbGU/LnByb3BlcnRpZXNbbmFtZV07XG4gICAgICAgIGlmIChwKVxuICAgICAgICAgIE9iamVjdC5hc3NpZ24ocCwgcGF0Y2gpO1xuICAgICAgICBlZGl0b3IucmVkcmF3QWxsKCk7XG4gICAgICB9LFxuICAgICAgKG5ld1Byb3ApID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLnByb2ZpbGUpXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB0aGlzLnByb2ZpbGUucHJvcGVydGllc1tuYW1lXSA9IG5ld1Byb3A7XG4gICAgICAgIHRoaXMucmVidWlsZFJvdyhuYW1lLCByb3dJZCk7XG4gICAgICB9LFxuICAgICAgbWFwcGVkQ29sLFxuICAgICkuc2hvdygpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRQcm9wZXJ0eU5hbWVCeVJvd0lkKHJvd0lkOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiBPYmplY3QuZW50cmllcyh0aGlzLnJvd0lkcylcbiAgICAgIC5maW5kKChbLCBpZF0pID0+IGlkID09PSByb3dJZCk/LlswXTtcbiAgfVxuXG4gIHByaXZhdGUgcmVuYW1lUHJvcGVydHkob2xkTmFtZTogc3RyaW5nLCBuZXdOYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMucHJvZmlsZSB8fCB0aGlzLnByb2ZpbGUucHJvcGVydGllc1tuZXdOYW1lXSlcbiAgICAgIHJldHVybjtcblxuICAgIGNvbnN0IHJvd0lkID0gdGhpcy5yb3dJZHNbb2xkTmFtZV07XG4gICAgdGhpcy5wcm9maWxlLnByb3BlcnRpZXNbbmV3TmFtZV0gPSB0aGlzLnByb2ZpbGUucHJvcGVydGllc1tvbGROYW1lXTtcbiAgICBkZWxldGUgdGhpcy5wcm9maWxlLnByb3BlcnRpZXNbb2xkTmFtZV07XG5cbiAgICB0aGlzLmNvbHVtbk1hcHBpbmdbbmV3TmFtZV0gPSB0aGlzLmNvbHVtbk1hcHBpbmdbb2xkTmFtZV0gPz8gbnVsbDtcbiAgICBkZWxldGUgdGhpcy5jb2x1bW5NYXBwaW5nW29sZE5hbWVdO1xuXG4gICAgY29uc3QgaWR4ID0gdGhpcy5wcm9wZXJ0eU9yZGVyLmluZGV4T2Yob2xkTmFtZSk7XG4gICAgaWYgKGlkeCA+PSAwKVxuICAgICAgdGhpcy5wcm9wZXJ0eU9yZGVyW2lkeF0gPSBuZXdOYW1lO1xuXG4gICAgZGVsZXRlIHRoaXMucm93SWRzW29sZE5hbWVdO1xuICAgIHRoaXMucm93SWRzW25ld05hbWVdID0gcm93SWQ7XG5cbiAgICB0aGlzLmVtaXRDaGFuZ2UoKTtcbiAgfVxuXG4gIHByaXZhdGUgZGVsZXRlUm93KHJvd0lkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBuYW1lID0gdGhpcy5nZXRQcm9wZXJ0eU5hbWVCeVJvd0lkKHJvd0lkKTtcbiAgICBpZiAoIW5hbWUgfHwgIXRoaXMucHJvZmlsZSlcbiAgICAgIHJldHVybjtcblxuICAgIGRlbGV0ZSB0aGlzLnByb2ZpbGUucHJvcGVydGllc1tuYW1lXTtcbiAgICBkZWxldGUgdGhpcy5jb2x1bW5NYXBwaW5nW25hbWVdO1xuICAgIGRlbGV0ZSB0aGlzLnJvd0lkc1tuYW1lXTtcbiAgICB0aGlzLnJvd1N1YnMuZ2V0KHJvd0lkKT8udW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLnJvd1N1YnMuZGVsZXRlKHJvd0lkKTtcblxuICAgIGNvbnN0IGlkeCA9IHRoaXMucHJvcGVydHlPcmRlci5pbmRleE9mKG5hbWUpO1xuICAgIGlmIChpZHggPj0gMClcbiAgICAgIHRoaXMucHJvcGVydHlPcmRlci5zcGxpY2UoaWR4LCAxKTtcblxuICAgIGNvbnN0IHJvd0VsID0gdGhpcy5yb3dzW3Jvd0lkXTtcbiAgICBkZWxldGUgdGhpcy5yb3dzW3Jvd0lkXTtcblxuICAgIGlmICh0aGlzLnByb3BlcnR5T3JkZXIubGVuZ3RoID09PSAwKVxuICAgICAgdGhpcy5yZW5kZXIoKTtcbiAgICBlbHNlXG4gICAgICByb3dFbD8ucmVtb3ZlKCk7XG5cbiAgICB0aGlzLmVtaXRDaGFuZ2UoKTtcbiAgfVxuXG4gIHByaXZhdGUgaW5zZXJ0Um93QWZ0ZXJSb3cocm93SWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICghdGhpcy5wcm9maWxlKVxuICAgICAgcmV0dXJuO1xuXG4gICAgY29uc3QgYWZ0ZXJOYW1lID0gdGhpcy5nZXRQcm9wZXJ0eU5hbWVCeVJvd0lkKHJvd0lkKTtcbiAgICBpZiAoIWFmdGVyTmFtZSlcbiAgICAgIHJldHVybjtcblxuICAgIGNvbnN0IG5ld05hbWUgPSBgTmV3UHJvcGVydHkke09iamVjdC5rZXlzKHRoaXMucHJvZmlsZS5wcm9wZXJ0aWVzKS5sZW5ndGggKyAxfWA7XG4gICAgY29uc3QgbmV3Um93SWQgPSB0aGlzLm5ld1Jvd0lkKCk7XG5cbiAgICB0aGlzLnByb2ZpbGUucHJvcGVydGllc1tuZXdOYW1lXSA9IGNyZWF0ZURlZmF1bHROdW1lcmljYWwoKTtcblxuICAgIHRoaXMucm93SWRzW25ld05hbWVdID0gbmV3Um93SWQ7XG5cbiAgICBjb25zdCBpZHggPSB0aGlzLnByb3BlcnR5T3JkZXIuaW5kZXhPZihhZnRlck5hbWUpO1xuICAgIHRoaXMucHJvcGVydHlPcmRlci5zcGxpY2UoaWR4ICsgMSwgMCwgbmV3TmFtZSk7XG5cbiAgICBjb25zdCBuZXdSb3cgPSB0aGlzLmJ1aWxkUm93KG5ld05hbWUsIG5ld1Jvd0lkLCB0aGlzLnByb2ZpbGUucHJvcGVydGllc1tuZXdOYW1lXSk7XG4gICAgdGhpcy5yb3dzW25ld1Jvd0lkXSA9IG5ld1JvdztcblxuICAgIHRoaXMucm93c1tyb3dJZF0/LmFmdGVyKG5ld1Jvdyk7XG4gICAgdGhpcy5lbWl0Q2hhbmdlKCk7XG4gIH1cblxuICBwcml2YXRlIG11dGF0ZVByb3BlcnR5KFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICB1cGRhdGVyOiAocDogUHJvcGVydHlEZXNpcmFiaWxpdHkpID0+IHZvaWQsXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IHByb3AgPSB0aGlzLnByb2ZpbGU/LnByb3BlcnRpZXNbbmFtZV07XG4gICAgaWYgKCFwcm9wKVxuICAgICAgcmV0dXJuO1xuXG4gICAgdXBkYXRlcihwcm9wKTtcbiAgICB0aGlzLmVtaXRDaGFuZ2UoKTtcbiAgfVxuXG4gIHByaXZhdGUgZW1pdENoYW5nZSgpOiB2b2lkIHtcbiAgICB0aGlzLm9uQ2hhbmdlZC5uZXh0KCk7XG4gICAgZ3Jvay5ldmVudHMuZmlyZUN1c3RvbUV2ZW50KE1QT19TQ09SRV9DSEFOR0VEX0VWRU5ULCB7fSk7XG4gIH1cbn1cbiJdfQ==
|