@datagrok-libraries/statistics 1.10.0 → 1.12.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.
@@ -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
- dataFrame?: DG.DataFrame;
7
- onChanged: Subject<unknown>;
6
+ readonly root: HTMLDivElement;
7
+ readonly onChanged: Subject<void>;
8
+ readonly aggregationInput: DG.ChoiceInput<WeightedAggregation | null>;
8
9
  profile?: DesirabilityProfile;
9
- constructor(dataFrame?: DG.DataFrame);
10
- getProfile(): DesirabilityProfile | undefined;
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;AAGtC,OAAO,EAAC,mBAAmB,EAAC,MAAM,OAAO,CAAC;AAE1C,OAAO,EAAC,OAAO,EAAC,MAAM,MAAM,CAAC;AAG7B,qBAAa,gBAAgB;IAC3B,IAAI,iBAAc;IAClB,SAAS,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC;IACzB,SAAS,mBAAiB;IAC1B,OAAO,CAAC,EAAE,mBAAmB,CAAC;gBAElB,SAAS,CAAC,EAAE,EAAE,CAAC,SAAS;IAKpC,UAAU,IAAI,mBAAmB,GAAG,SAAS;IAI7C,UAAU,CAAC,OAAO,CAAC,EAAE,mBAAmB;CAsEzC"}
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;IA2ChB,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,388 @@
1
1
  import * as ui from 'datagrok-api/ui';
2
- import { MpoDesirabilityLineEditor } from './mpo-line-editor';
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.setProfile();
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
- getProfile() {
12
- return this.profile;
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.root.append(ui.divText('No profile specified.'));
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
+ (_a = this.rowSubs.get(rowId)) === null || _a === void 0 ? void 0 : _a.unsubscribe();
144
+ this.rowSubs.set(rowId, editor.onChanged.subscribe(() => this.emitChange()));
145
+ const propertyCell = this.buildPropertyCell(rowId, name);
146
+ const weightCell = this.buildWeightCell(rowId, prop);
147
+ const columnCell = this.buildColumnSelector(rowId, name, editor);
148
+ const modeGear = this.design ?
149
+ this.buildModeGear(rowId, prop, editor) :
150
+ null;
151
+ const controls = this.design ? this.buildRowControls(rowId) : null;
152
+ row.append(ui.divV([propertyCell, columnCell].filter(Boolean), 'statistics-mpo-property-cell'), weightCell, ui.divH([editor.root, modeGear].filter(Boolean)));
153
+ if (controls)
154
+ row.append(controls);
155
+ return row;
156
+ }
157
+ buildPropertyCell(rowId, name) {
158
+ if (this.dataFrame) {
159
+ const el = ui.divText(name);
160
+ ui.tooltip.bind(el, () => name);
161
+ return el;
20
162
  }
21
- // Create header row for the table
22
- const header = ui.divH([
23
- ui.divText('Property', { style: { fontWeight: 'bold', width: '150px' } }),
24
- ui.divText('Weight', { style: { fontWeight: 'bold', width: '60px' } }),
25
- ui.divText('Desirability', { style: { fontWeight: 'bold', flexGrow: '1' } }), // Let editor take space
26
- ], { style: {
27
- marginTop: '10px',
28
- paddingBottom: '5px',
29
- borderBottom: '1px solid #ccc',
163
+ let currentName = name;
164
+ const propNameInp = ui.input.string('', { value: name, onValueChanged: (v) => {
165
+ if (!v || v === currentName)
166
+ return;
167
+ this.renameProperty(currentName, v);
168
+ currentName = v;
169
+ } });
170
+ ui.tooltip.bind(propNameInp.input, () => currentName);
171
+ return propNameInp.root;
172
+ }
173
+ buildWeightCell(rowId, prop) {
174
+ var _a;
175
+ const name = this.getPropertyNameByRowId(rowId);
176
+ const children = [];
177
+ const weightInput = ui.input.float('', { value: prop.weight, min: 0, max: 1, format: '#0.000',
178
+ onValueChanged: (v) => {
179
+ if (name)
180
+ this.mutateProperty(name, (p) => p.weight = Math.max(0, Math.min(1, v !== null && v !== void 0 ? v : 0)));
30
181
  },
31
182
  });
32
- const propertyRows = Object.entries(profile.properties).map(([propertyName, prop]) => {
33
- var _a, _b, _c;
34
- const lineEditor = new MpoDesirabilityLineEditor(prop, 300, 80);
35
- lineEditor.onChanged.subscribe((_) => this.onChanged.next());
36
- // Input for weight - updates the *copy* of the template data
37
- const weightInput = ui.input.float('', {
38
- value: prop.weight, min: 0, max: 1,
39
- onValueChanged: (newValue) => {
40
- if (profile && profile.properties[propertyName]) {
41
- // Update the weight in the temporary template object
42
- let clampedWeight = newValue !== null && newValue !== void 0 ? newValue : 0;
43
- clampedWeight = Math.max(0, Math.min(1, clampedWeight)); // Clamp 0-1
44
- profile.properties[propertyName].weight = clampedWeight;
45
- }
46
- },
47
- });
48
- weightInput.root.style.width = '60px';
49
- weightInput.root.style.marginTop = '21px';
50
- const matchedColumnName = this.dataFrame ?
51
- this.dataFrame.columns.names().find((name) => name.toLowerCase() == propertyName.toLowerCase()) :
52
- null;
53
- const columnInput = ui.input.choice('', {
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 : ''
183
+ weightInput.root.classList.add('statistics-mpo-weight-input');
184
+ children.push(weightInput.root);
185
+ if (this.dataFrame) {
186
+ const numCols = this.getNumericalColumnNames();
187
+ let isColumn = !!prop.weightColumn && numCols.includes(prop.weightColumn);
188
+ const colInput = ui.input.choice('', { items: numCols, nullable: true, value: (_a = prop.weightColumn) !== null && _a !== void 0 ? _a : '',
189
+ onValueChanged: (v) => {
190
+ if (name)
191
+ this.mutateProperty(name, (p) => p.weightColumn = v || undefined);
192
+ }, });
193
+ const syncToggle = () => {
194
+ weightInput.root.classList.toggle('statistics-mpo-hidden', isColumn);
195
+ colInput.root.classList.toggle('statistics-mpo-hidden', !isColumn);
196
+ toggle.classList.toggle('statistics-mpo-weight-toggle-active', isColumn);
197
+ };
198
+ const toggle = ui.iconFA('columns', () => {
199
+ isColumn = !isColumn;
200
+ syncToggle();
201
+ if (!isColumn && name)
202
+ this.mutateProperty(name, (p) => { delete p.weightColumn; });
203
+ else if (isColumn && name && colInput.value)
204
+ this.mutateProperty(name, (p) => p.weightColumn = colInput.value || undefined);
57
205
  });
58
- const rowDiv = ui.divH([
59
- ui.divV([
60
- ui.divText(propertyName, { style: { width: '150px', paddingTop: '5px', marginLeft: '4px' } }),
61
- this.dataFrame ? columnInput.root : null,
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
206
+ toggle.classList.add('statistics-mpo-weight-toggle');
207
+ ui.tooltip.bind(toggle, () => isColumn ? 'Switch to manual weight' : 'Use weight from column');
208
+ syncToggle();
209
+ children.push(colInput.root, toggle);
74
210
  }
211
+ return ui.divH(children, 'statistics-mpo-weight-cell');
212
+ }
213
+ buildColumnSelector(rowId, name, editor) {
214
+ var _a, _b;
215
+ if (!this.dataFrame)
216
+ return null;
217
+ const items = this.getEligibleColumnNames();
218
+ const matched = (_a = this.columnMapping[name]) !== null && _a !== void 0 ? _a : null;
219
+ if (matched) {
220
+ const col = this.dataFrame.col(matched);
221
+ (_b = editor.setColumn) === null || _b === void 0 ? void 0 : _b.call(editor, col);
222
+ }
223
+ const input = ui.input.choice('', { items, nullable: true, value: matched !== null && matched !== void 0 ? matched : '', onValueChanged: (v) => {
224
+ var _a;
225
+ this.columnMapping[name] = v !== null && v !== void 0 ? v : null;
226
+ const col = v ? this.dataFrame.col(v) : null;
227
+ if (col && this.switchPropertyType(name, rowId, col))
228
+ return;
229
+ (_a = editor.setColumn) === null || _a === void 0 ? void 0 : _a.call(editor, col);
230
+ this.emitChange();
231
+ } });
232
+ return input.root;
233
+ }
234
+ getEligibleColumnNames() {
235
+ if (!this.dataFrame)
236
+ return [];
237
+ return Array.from(this.dataFrame.columns)
238
+ .filter((c) => !c.isCategorical || c.categories.length <= MAX_CATEGORICAL_CATEGORIES)
239
+ .map((c) => c.name);
240
+ }
241
+ getNumericalColumnNames() {
242
+ if (!this.dataFrame)
243
+ return [];
244
+ return Array.from(this.dataFrame.columns.numerical).map((c) => c.name);
245
+ }
246
+ resolveColumn(name) {
247
+ var _a, _b, _c;
248
+ if (!this.dataFrame)
249
+ return null;
250
+ const eligible = this.getEligibleColumnNames();
251
+ 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;
252
+ if (colName)
253
+ this.columnMapping[name] = colName;
254
+ return colName ? (_c = this.dataFrame.col(colName)) !== null && _c !== void 0 ? _c : null : null;
255
+ }
256
+ correctPropertyType(prop, col) {
257
+ if (isNumerical(prop) && col.isCategorical) {
258
+ const categories = col.categories.map((c) => ({ name: c, desirability: 1 }));
259
+ return createDefaultCategorical(prop.weight, categories);
260
+ }
261
+ if (!isNumerical(prop) && col.isNumerical)
262
+ return createDefaultNumerical(prop.weight, col.min, col.max);
263
+ return null;
264
+ }
265
+ switchPropertyType(name, rowId, col) {
266
+ if (!this.profile)
267
+ return false;
268
+ const corrected = this.correctPropertyType(this.profile.properties[name], col);
269
+ if (!corrected)
270
+ return false;
271
+ this.profile.properties[name] = corrected;
272
+ this.rebuildRow(name, rowId);
273
+ return true;
274
+ }
275
+ rebuildRow(name, rowId) {
276
+ const oldRow = this.rows[rowId];
277
+ const newRow = this.buildRow(name, rowId, this.profile.properties[name]);
278
+ this.rows[rowId] = newRow;
279
+ if (oldRow === null || oldRow === void 0 ? void 0 : oldRow.parentNode)
280
+ oldRow.replaceWith(newRow);
281
+ this.emitChange();
282
+ }
283
+ buildModeGear(rowId, prop, editor) {
284
+ const gear = ui.icons.settings(() => {
285
+ var _a, _b;
286
+ const name = this.getPropertyNameByRowId(rowId);
287
+ if (!name)
288
+ return;
289
+ const colName = this.columnMapping[name];
290
+ const col = colName ? (_b = (_a = this.dataFrame) === null || _a === void 0 ? void 0 : _a.col(colName)) !== null && _b !== void 0 ? _b : null : null;
291
+ this.openModeDialog(name, rowId, prop, editor, col);
292
+ });
293
+ gear.classList.add('statistics-mpo-gear');
294
+ return gear;
295
+ }
296
+ buildRowControls(rowId) {
297
+ const add = ui.icons.add(() => this.insertRowAfterRow(rowId));
298
+ const del = ui.icons.delete(() => this.deleteRow(rowId));
299
+ return ui.divH([add, del], 'statistics-mpo-control-buttons');
300
+ }
301
+ openModeDialog(name, rowId, prop, editor, mappedCol = null) {
302
+ new DesirabilityModeDialog(name, prop, (patch) => {
303
+ var _a;
304
+ const p = (_a = this.profile) === null || _a === void 0 ? void 0 : _a.properties[name];
305
+ if (p)
306
+ Object.assign(p, patch);
307
+ editor.redrawAll();
308
+ }, (newProp) => {
309
+ if (!this.profile)
310
+ return;
311
+ this.profile.properties[name] = newProp;
312
+ this.rebuildRow(name, rowId);
313
+ }, mappedCol).show();
314
+ }
315
+ getPropertyNameByRowId(rowId) {
316
+ var _a;
317
+ return (_a = Object.entries(this.rowIds)
318
+ .find(([, id]) => id === rowId)) === null || _a === void 0 ? void 0 : _a[0];
319
+ }
320
+ renameProperty(oldName, newName) {
321
+ var _a;
322
+ if (!this.profile || this.profile.properties[newName])
323
+ return;
324
+ const rowId = this.rowIds[oldName];
325
+ this.profile.properties[newName] = this.profile.properties[oldName];
326
+ delete this.profile.properties[oldName];
327
+ this.columnMapping[newName] = (_a = this.columnMapping[oldName]) !== null && _a !== void 0 ? _a : null;
328
+ delete this.columnMapping[oldName];
329
+ const idx = this.propertyOrder.indexOf(oldName);
330
+ if (idx >= 0)
331
+ this.propertyOrder[idx] = newName;
332
+ delete this.rowIds[oldName];
333
+ this.rowIds[newName] = rowId;
334
+ this.emitChange();
335
+ }
336
+ deleteRow(rowId) {
337
+ var _a;
338
+ const name = this.getPropertyNameByRowId(rowId);
339
+ if (!name || !this.profile)
340
+ return;
341
+ delete this.profile.properties[name];
342
+ delete this.columnMapping[name];
343
+ delete this.rowIds[name];
344
+ (_a = this.rowSubs.get(rowId)) === null || _a === void 0 ? void 0 : _a.unsubscribe();
345
+ this.rowSubs.delete(rowId);
346
+ const idx = this.propertyOrder.indexOf(name);
347
+ if (idx >= 0)
348
+ this.propertyOrder.splice(idx, 1);
349
+ const rowEl = this.rows[rowId];
350
+ delete this.rows[rowId];
351
+ if (this.propertyOrder.length === 0)
352
+ this.render();
75
353
  else
76
- this.root.append(ui.divText('No matching properties found in the table for this template.'));
354
+ rowEl === null || rowEl === void 0 ? void 0 : rowEl.remove();
355
+ this.emitChange();
356
+ }
357
+ insertRowAfterRow(rowId) {
358
+ var _a;
359
+ if (!this.profile)
360
+ return;
361
+ const afterName = this.getPropertyNameByRowId(rowId);
362
+ if (!afterName)
363
+ return;
364
+ const newName = `NewProperty${Object.keys(this.profile.properties).length + 1}`;
365
+ const newRowId = this.newRowId();
366
+ this.profile.properties[newName] = createDefaultNumerical();
367
+ this.rowIds[newName] = newRowId;
368
+ const idx = this.propertyOrder.indexOf(afterName);
369
+ this.propertyOrder.splice(idx + 1, 0, newName);
370
+ const newRow = this.buildRow(newName, newRowId, this.profile.properties[newName]);
371
+ this.rows[newRowId] = newRow;
372
+ (_a = this.rows[rowId]) === null || _a === void 0 ? void 0 : _a.after(newRow);
373
+ this.emitChange();
374
+ }
375
+ mutateProperty(name, updater) {
376
+ var _a;
377
+ const prop = (_a = this.profile) === null || _a === void 0 ? void 0 : _a.properties[name];
378
+ if (!prop)
379
+ return;
380
+ updater(prop);
381
+ this.emitChange();
382
+ }
383
+ emitChange() {
384
+ this.onChanged.next();
385
+ grok.events.fireCustomEvent(MPO_SCORE_CHANGED_EVENT, {});
77
386
  }
78
387
  }
79
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXBvLXByb2ZpbGUtZWRpdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsibXBvLXByb2ZpbGUtZWRpdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sS0FBSyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFHdEMsT0FBTyxFQUFDLHlCQUF5QixFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFDNUQsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUc3QixNQUFNLE9BQU8sZ0JBQWdCO0lBTTNCLFlBQVksU0FBd0I7UUFMcEMsU0FBSSxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7UUFFbEIsY0FBUyxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7UUFJeEIsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7UUFDM0IsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO0lBQ3BCLENBQUM7SUFFRCxVQUFVO1FBQ1IsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDO0lBQ3RCLENBQUM7SUFFRCxVQUFVLENBQUMsT0FBNkI7UUFDdEMsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7UUFDdkIsRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDcEIsSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUNaLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxDQUFDO1lBQ3RELE9BQU87U0FDUjtRQUVELGtDQUFrQztRQUNsQyxNQUFNLE1BQU0sR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDO1lBQ3JCLEVBQUUsQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLEVBQUMsS0FBSyxFQUFFLEVBQUMsVUFBVSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFDLEVBQUMsQ0FBQztZQUNyRSxFQUFFLENBQUMs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QVksRUFBRSxFQUFDLEtBQUssRUFBRSxFQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFDLEVBQUMsQ0FBQztvQkFDekYsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSTtpQkFDekMsQ0FBQztnQkFDRixXQUFXLENBQUMsSUFBSTtnQkFDaEIsVUFBVSxDQUFDLElBQUksRUFBRSw4QkFBOEI7YUFDaEQsQ0FBQyxDQUFDO1lBQ0gsTUFBTSxDQUFDLEtBQUssQ0FBQyxVQUFVLEdBQUcsUUFBUSxDQUFDLENBQUMsb0NBQW9DO1lBQ3hFLE1BQU0sQ0FBQyxLQUFLLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQyxDQUFDLHFCQUFxQjtZQUN4RCxNQUFNLENBQUMsS0FBSyxDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUMsQ0FBQyx5REFBeUQ7WUFFMUYsT0FBTyxNQUFNLENBQUM7UUFDaEIsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxnQ0FBZ0M7UUFFaEUsSUFBSSxZQUFZLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUMzQixJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUN6QixJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFlBQTZCLENBQUMsQ0FBQyxDQUFDLENBQUMsMkJBQTJCO1NBQ3RGOztZQUNDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsOERBQThELENBQUMsQ0FBQyxDQUFDO0lBQ2pHLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIERHIGZyb20gJ2RhdGFncm9rLWFwaS9kZyc7XG5pbXBvcnQgKiBhcyB1aSBmcm9tICdkYXRhZ3Jvay1hcGkvdWknO1xuXG5pbXBvcnQge0Rlc2lyYWJpbGl0eVByb2ZpbGV9IGZyb20gJy4vbXBvJztcbmltcG9ydCB7TXBvRGVzaXJhYmlsaXR5TGluZUVkaXRvcn0gZnJvbSAnLi9tcG8tbGluZS1lZGl0b3InO1xuaW1wb3J0IHtTdWJqZWN0fSBmcm9tICdyeGpzJztcblxuXG5leHBvcnQgY2xhc3MgTXBvUHJvZmlsZUVkaXRvciB7XG4gIHJvb3QgPSB1aS5kaXYoW10pO1xuICBkYXRhRnJhbWU/OiBERy5EYXRhRnJhbWU7XG4gIG9uQ2hhbmdlZCA9IG5ldyBTdWJqZWN0KCk7XG4gIHByb2ZpbGU/OiBEZXNpcmFiaWxpdHlQcm9maWxlO1xuXG4gIGNvbnN0cnVjdG9yKGRhdGFGcmFtZT86IERHLkRhdGFGcmFtZSkge1xuICAgIHRoaXMuZGF0YUZyYW1lID0gZGF0YUZyYW1lO1xuICAgIHRoaXMuc2V0UHJvZmlsZSgpO1xuICB9XG5cbiAgZ2V0UHJvZmlsZSgpOiBEZXNpcmFiaWxpdHlQcm9maWxlIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5wcm9maWxlO1xuICB9XG5cbiAgc2V0UHJvZmlsZShwcm9maWxlPzogRGVzaXJhYmlsaXR5UHJvZmlsZSkge1xuICAgIHRoaXMucHJvZmlsZSA9IHByb2ZpbGU7XG4gICAgdWkuZW1wdHkodGhpcy5yb290KTtcbiAgICBpZiAoIXByb2ZpbGUpIHtcbiAgICAgIHRoaXMucm9vdC5hcHBlbmQodWkuZGl2VGV4dCgnTm8gcHJvZmlsZSBzcGVjaWZpZWQuJykpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSBoZWFkZXIgcm93IGZvciB0aGUgdGFibGVcbiAgICBjb25zdCBoZWFkZXIgPSB1aS5kaXZIKFtcbiAgICAgIHVpLmRpdlRleHQoJ1Byb3BlcnR5Jywge3N0eWxlOiB7Zm9udFdlaWdodDogJ2JvbGQnLCB3aWR0aDogJzE1MHB4J319KSxcbiAgICAgIHVpLmRpdlRleHQoJ1dlaWdodCcsIHtzdHlsZToge2ZvbnRXZWlnaHQ6ICdib2xkJywgd2lkdGg6ICc2MHB4J319KSxcbiAgICAgIHVpLmRpdlRleHQoJ0Rlc2lyYWJpbGl0eScsIHtzdHlsZToge2ZvbnRXZWlnaHQ6ICdib2xkJywgZmxleEdyb3c6ICcxJ319KSwgLy8gTGV0IGVkaXRvciB0YWtlIHNwYWNlXG4gICAgXSwge3N0eWxlOiB7XG4gICAgICBtYXJnaW5Ub3A6ICcxMHB4JyxcbiAgICAgIHBhZGRpbmdCb3R0b206ICc1cHgnLFxuICAgICAgYm9yZGVyQm90dG9tOiAnMXB4IHNvbGlkICNjY2MnLFxuICAgIH0sXG4gICAgfSk7XG5cbiAgICBjb25zdCBwcm9wZXJ0eVJvd3MgPSBPYmplY3QuZW50cmllcyhwcm9maWxlLnByb3BlcnRpZXMpLm1hcCgoW3Byb3BlcnR5TmFtZSwgcHJvcF0pID0+IHtcbiAgICAgIGNvbnN0IGxpbmVFZGl0b3IgPSBuZXcgTXBvRGVzaXJhYmlsaXR5TGluZUVkaXRvcihwcm9wLCAzMDAsIDgwKTtcbiAgICAgIGxpbmVFZGl0b3Iub25DaGFuZ2VkLnN1YnNjcmliZSgoXykgPT4gdGhpcy5vbkNoYW5nZWQubmV4dCgpKTtcblxuICAgICAgLy8gSW5wdXQgZm9yIHdlaWdodCAtIHVwZGF0ZXMgdGhlICpjb3B5KiBvZiB0aGUgdGVtcGxhdGUgZGF0YVxuICAgICAgY29uc3Qgd2VpZ2h0SW5wdXQgPSB1aS5pbnB1dC5mbG9hdCgnJywgeyAvLyBObyBsYWJlbCBuZWVkZWQgaGVyZVxuICAgICAgICB2YWx1ZTogcHJvcC53ZWlnaHQsIG1pbjogMCwgbWF4OiAxLFxuICAgICAgICBvblZhbHVlQ2hhbmdlZDogKG5ld1ZhbHVlKSA9PiB7IC8vIENoYW5nZWQgcGFyYW1ldGVyIG5hbWUgZm9yIGNsYXJpdHlcbiAgICAgICAgICBpZiAocHJvZmlsZSAmJiBwcm9maWxlLnByb3BlcnRpZXNbcHJvcGVydHlOYW1lXSkge1xuICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSB3ZWlnaHQgaW4gdGhlIHRlbXBvcmFyeSB0ZW1wbGF0ZSBvYmplY3RcbiAgICAgICAgICAgIGxldCBjbGFtcGVkV2VpZ2h0ID0gbmV3VmFsdWUgPz8gMDtcbiAgICAgICAgICAgIGNsYW1wZWRXZWlnaHQgPSBNYXRoLm1heCgwLCBNYXRoLm1pbigxLCBjbGFtcGVkV2VpZ2h0KSk7IC8vIENsYW1wIDAtMVxuICAgICAgICAgICAgcHJvZmlsZS5wcm9wZXJ0aWVzW3Byb3BlcnR5TmFtZV0ud2VpZ2h0ID0gY2xhbXBlZFdlaWdodDtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICB9KTtcblxuICAgICAgd2VpZ2h0SW5wdXQucm9vdC5zdHlsZS53aWR0aCA9ICc2MHB4JztcbiAgICAgIHdlaWdodElucHV0LnJvb3Quc3R5bGUubWFyZ2luVG9wID0gJzIxcHgnO1xuXG4gICAgICBjb25zdCBtYXRjaGVkQ29sdW1uTmFtZSA9IHRoaXMuZGF0YUZyYW1lID9cbiAgICAgICAgdGhpcy5kYXRhRnJhbWUuY29sdW1ucy5uYW1lcygpLmZpbmQoKG5hbWUpID0+IG5hbWUudG9Mb3dlckNhc2UoKSA9PSBwcm9wZXJ0eU5hbWUudG9Mb3dlckNhc2UoKSkgOlxuICAgICAgICBudWxsO1xuXG4gICAgICBjb25zdCBjb2x1bW5JbnB1dCA9IHVpLmlucHV0LmNob2ljZSgnJywge1xuICAgICAgICBudWxsYWJsZTogdHJ1ZSxcbiAgICAgICAgaXRlbXM6IHRoaXMuZGF0YUZyYW1lPy5jb2x1bW5zPy5uYW1lcygpID8/IFsnJ10sXG4gICAgICAgIHZhbHVlOiBtYXRjaGVkQ29sdW1uTmFtZSA/PyAnJ30pO1xuXG4gICAgICBjb25zdCByb3dEaXYgPSB1aS5kaXZIKFtcbiAgICAgICAgdWkuZGl2VihbXG4gICAgICAgICAgdWkuZGl2VGV4dChwcm9wZXJ0eU5hbWUsIHtzdHlsZToge3dpZHRoOiAnMTUwcHgnLCBwYWRkaW5nVG9wOiAnNXB4JywgbWFyZ2luTGVmdDogJzRweCd9fSksXG4gICAgICAgICAgdGhpcy5kYXRhRnJhbWUgPyBjb2x1bW5JbnB1dC5yb290IDogbnVsbCxcbiAgICAgICAgXSksXG4gICAgICAgIHdlaWdodElucHV0LnJvb3QsXG4gICAgICAgIGxpbmVFZGl0b3Iucm9vdCwgLy8gQWRkIHRoZSBLb252YSBjb250YWluZXIgZGl2XG4gICAgICBdKTtcbiAgICAgIHJvd0Rpdi5zdHlsZS5hbGlnbkl0ZW1zID0gJ2NlbnRlcic7IC8vIFZlcnRpY2FsbHkgYWxpZ24gaXRlbXMgaW4gdGhlIHJvd1xuICAgICAgcm93RGl2LnN0eWxlLm1hcmdpbkJvdHRvbSA9ICc1cHgnOyAvLyBTcGFjZSBiZXR3ZWVuIHJvd3NcbiAgICAgIHJvd0Rpdi5zdHlsZS5taW5IZWlnaHQgPSAnNzBweCc7IC8vIEVuc3VyZSBjb25zaXN0ZW50IHJvdyBoZWlnaHQgZXZlbiBpZiBlZGl0b3IgdGFrZXMgdGltZVxuXG4gICAgICByZXR1cm4gcm93RGl2O1xuICAgIH0pLmZpbHRlcigoZWwpID0+IGVsICE9PSBudWxsKTsgLy8gRmlsdGVyIG91dCBza2lwcGVkIHByb3BlcnRpZXNcblxuICAgIGlmIChwcm9wZXJ0eVJvd3MubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5yb290LmFwcGVuZChoZWFkZXIpO1xuICAgICAgdGhpcy5yb290LmFwcGVuZCh1aS5kaXZWKHByb3BlcnR5Um93cyBhcyBIVE1MRWxlbWVudFtdKSk7IC8vIENhc3QgbmVlZGVkIGFmdGVyIGZpbHRlclxuICAgIH0gZWxzZVxuICAgICAgdGhpcy5yb290LmFwcGVuZCh1aS5kaXZUZXh0KCdObyBtYXRjaGluZyBwcm9wZXJ0aWVzIGZvdW5kIGluIHRoZSB0YWJsZSBmb3IgdGhpcyB0ZW1wbGF0ZS4nKSk7XG4gIH1cbn1cbiJdfQ==
388
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXBvLXByb2ZpbGUtZWRpdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsibXBvLXByb2ZpbGUtZWRpdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sS0FBSyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDdEMsT0FBTyxLQUFLLElBQUksTUFBTSxtQkFBbUIsQ0FBQztBQUUxQyxPQUFPLEVBQUMsT0FBTyxFQUFlLE1BQU0sTUFBTSxDQUFDO0FBQzNDLE9BQU8sRUFDTCxtQkFBbUIsRUFBRSwwQkFBMEIsRUFFL0Msd0JBQXdCLEVBQUUsc0JBQXNCLEVBQUUsV0FBVyxFQUFFLG1CQUFtQixHQUNuRixNQUFNLE9BQU8sQ0FBQztBQUNmLE9BQU8sRUFBcUIseUJBQXlCLEVBQUMsTUFBTSx1Q0FBdUMsQ0FBQztBQUNwRyxPQUFPLEVBQUMsc0JBQXNCLEVBQUMsTUFBTSxvQ0FBb0MsQ0FBQztBQUUxRSxPQUFPLHNCQUFzQixDQUFDO0FBRTlCLE9BQU8sRUFBQyx1QkFBdUIsRUFBQyxNQUFNLFNBQVMsQ0FBQztBQUVoRCxNQUFNLDBCQUEwQixHQUFHLEVBQUUsQ0FBQztBQUV0QyxNQUFNLE9BQU8sZ0JBQWdCO0lBaUIzQixZQUFZLFNBQXdCLEVBQUUsTUFBTSxHQUFHLEtBQUssRUFBRSxPQUFPLEdBQUcsS0FBSztRQWhCNUQsU0FBSSxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDbEIsY0FBUyxHQUFHLElBQUksT0FBTyxFQUFRLENBQUM7UUFLekMsV0FBTSxHQUFHLEtBQUssQ0FBQztRQUNmLFlBQU8sR0FBRyxLQUFLLENBQUM7UUFFUixTQUFJLEdBQWdDLEVBQUUsQ0FBQztRQUN2QyxXQUFNLEdBQTJCLEVBQUUsQ0FBQztRQUNwQyxZQUFPLEdBQUcsSUFBSSxHQUFHLEVBQXdCLENBQUM7UUFFMUMsa0JBQWEsR0FBYSxFQUFFLENBQUM7UUFDckMsa0JBQWEsR0FBa0MsRUFBRSxDQUFDO1FBR2hELElB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Q2xELElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBRS9DLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBQ2xGLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsTUFBTSxDQUFDO1FBRTdCLE1BQUEsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsMENBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2hDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUNwQixDQUFDO0lBRU8sY0FBYyxDQUNwQixJQUFZLEVBQ1osT0FBMEM7O1FBRTFDLE1BQU0sSUFBSSxHQUFHLE1BQUEsSUFBSSxDQUFDLE9BQU8sMENBQUUsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzVDLElBQUksQ0FBQyxJQUFJO1lBQ1AsT0FBTztRQUVULE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNkLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUNwQixDQUFDO0lBRU8sVUFBVTtRQUNoQixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3RCLElBQUksQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUFDLHVCQUF1QixFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQzNELENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIERHIGZyb20gJ2RhdGFncm9rLWFwaS9kZyc7XG5pbXBvcnQgKiBhcyB1aSBmcm9tICdkYXRhZ3Jvay1hcGkvdWknO1xuaW1wb3J0ICogYXMgZ3JvayBmcm9tICdkYXRhZ3Jvay1hcGkvZ3Jvayc7XG5cbmltcG9ydCB7U3ViamVjdCwgU3Vic2NyaXB0aW9ufSBmcm9tICdyeGpzJztcbmltcG9ydCB7XG4gIERFRkFVTFRfQUdHUkVHQVRJT04sIFdFSUdIVEVEX0FHR1JFR0FUSU9OU19MSVNULFxuICBEZXNpcmFiaWxpdHlQcm9maWxlLCBQcm9wZXJ0eURlc2lyYWJpbGl0eSwgV2VpZ2h0ZWRBZ2dyZWdhdGlvbixcbiAgY3JlYXRlRGVmYXVsdENhdGVnb3JpY2FsLCBjcmVhdGVEZWZhdWx0TnVtZXJpY2FsLCBpc051bWVyaWNhbCwgbWlncmF0ZURlc2lyYWJpbGl0eSxcbn0gZnJvbSAnLi9tcG8nO1xuaW1wb3J0IHtEZXNpcmFiaWxpdHlFZGl0b3IsIERlc2lyYWJpbGl0eUVkaXRvckZhY3Rvcnl9IGZyb20gJy4vZWRpdG9ycy9kZXNpcmFiaWxpdHktZWRpdG9yLWZhY3RvcnknO1xuaW1wb3J0IHtEZXNpcmFiaWxpdHlNb2RlRGlhbG9nfSBmcm9tICcuL2RpYWxvZ3MvZGVzaXJhYmlsaXR5LW1vZGUtZGlhbG9nJztcblxuaW1wb3J0ICcuLi8uLi9jc3Mvc3R5bGVzLmNzcyc7XG5cbmltcG9ydCB7TVBPX1NDT1JFX0NIQU5HRURfRVZFTlR9IGZyb20gJy4vdXRpbHMnO1xuXG5jb25zdCBNQVhfQ0FURUdPUklDQUxfQ0FURUdPUklFUyA9IDIwO1xuXG5leHBvcnQgY2xhc3MgTXBvUHJvZmlsZUVkaXRvciB7XG4gIHJlYWRvbmx5IHJvb3QgPSB1aS5kaXYoW10pO1xuICByZWFkb25seSBvbkNoYW5nZWQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuICByZWFkb25seSBhZ2dyZWdhdGlvbklucHV0OiBERy5DaG9pY2VJbnB1dDxXZWlnaHRlZEFnZ3JlZ2F0aW9uIHwgbnVsbD47XG5cbiAgcHJvZmlsZT86IERlc2lyYWJpbGl0eVByb2ZpbGU7XG4gIGRhdGFGcmFtZT86IERHLkRhdGFGcmFtZTtcbiAgZGVzaWduID0gZmFsc2U7XG4gIHByZXZpZXcgPSBmYWxzZTtcblxuICBwcml2YXRlIHJvd3M6IFJlY29yZDxzdHJpbmcsIEhUTUxFbGVtZW50PiA9IHt9O1xuICBwcml2YXRlIHJvd0lkczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICBwcml2YXRlIHJvd1N1YnMgPSBuZXcgTWFwPHN0cmluZywgU3Vic2NyaXB0aW9uPigpO1xuXG4gIHByaXZhdGUgcHJvcGVydHlPcmRlcjogc3RyaW5nW10gPSBbXTtcbiAgY29sdW1uTWFwcGluZzogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgbnVsbD4gPSB7fTtcblxuICBjb25zdHJ1Y3RvcihkYXRhRnJhbWU/OiBERy5EYXRhRnJhbWUsIGRlc2lnbiA9IGZhbHNlLCBwcmV2aWV3ID0gZmFsc2UpIHtcbiAgICB0aGlzLmRhdGFGcmFtZSA9IGRhdGFGcmFtZTtcbiAgICB0aGlzLmRlc2lnbiA9IGRlc2lnbjtcbiAgICB0aGlzLnByZXZpZXcgPSBwcmV2aWV3O1xuICAgIHRoaXMuYWdncmVnYXRpb25JbnB1dCA9IHVpLmlucHV0LmNob2ljZSgnQWdncmVnYXRpb24nLCB7XG4gICAgICBpdGVtczogV0VJR0hURURfQUdHUkVHQVRJT05TX0xJU1QsXG4gICAgICB2YWx1ZTogREVGQVVMVF9BR0dSRUdBVElPTixcbiAgICAgIG51bGxhYmxlOiBmYWxzZSxcbiAgICAgIG9uVmFsdWVDaGFuZ2VkOiAodikgPT4ge1xuICAgICAgICBpZiAodGhpcy5wcm9maWxlKVxuICAgICAgICAgIHRoaXMucHJvZmlsZS5hZ2dyZWdhdGlvbiA9IHY7XG4gICAgICAgIHRoaXMuZW1pdENoYW5nZSgpO1xuICAgICAgfSxcbiAgICB9KTtcbiAgICB0aGlzLmFnZ3JlZ2F0aW9uSW5wdXQuc2V0VG9vbHRpcCgnU2NvcmUgYWdncmVnYXRpb24gbWV0aG9kJyk7XG4gIH1cblxuICBwcml2YXRlIG5ld1Jvd0lkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGNyeXB0by5yYW5kb21VVUlEKCk7XG4gIH1cblxuICBzZXRQcm9maWxlKHByb2ZpbGU/OiBEZXNpcmFiaWxpdHlQcm9maWxlKTogdm9pZCB7XG4gICAgaWYgKHByb2ZpbGUpIHtcbiAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHByb2ZpbGUucHJvcGVydGllcykpIHtcbiAgICAgICAgY29uc3QgcHJvcCA9IG1pZ3JhdGVEZXNpcmFiaWxpdHkocHJvZmlsZS5wcm9wZXJ0aWVzW2tleV0pO1xuICAgICAgICBpZiAoaXNOdW1lcmljYWwocHJvcCkpXG4gICAgICAgICAgcHJvcC5tb2RlID8/PSAnZnJlZWZvcm0nO1xuICAgICAgICBwcm9maWxlLnByb3BlcnRpZXNba2V5XSA9IHByb3A7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBzdWIgb2YgdGhpcy5yb3dTdWJzLnZhbHVlcygpKVxuICAgICAgc3ViLnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5yb3dTdWJzLmNsZWFyKCk7XG5cbiAgICB0aGlzLnByb2ZpbGUgPSBwcm9maWxlO1xuICAgIHRoaXMuYWdncmVnYXRpb25JbnB1dC52YWx1ZSA9IHByb2ZpbGU/LmFnZ3JlZ2F0aW9uID8/IERFRkFVTFRfQUdHUkVHQVRJT047XG4gICAgdGhpcy5jb2x1bW5NYXBwaW5nID0ge307XG4gICAgdGhpcy5yb3dzID0ge307XG4gICAgdGhpcy5yb3dJZHMgPSB7fTtcbiAgICB0aGlzLnByb3BlcnR5T3JkZXIgPSBwcm9maWxlID8gT2JqZWN0LmtleXMocHJvZmlsZS5wcm9wZXJ0aWVzKSA6IFtdO1xuXG4gICAgZm9yIChjb25zdCBuYW1lIG9mIHRoaXMucHJvcGVydHlPcmRlcilcbiAgICAgIHRoaXMucm93SWRzW25hbWVdID0gdGhpcy5uZXdSb3dJZCgpO1xuXG4gICAgdGhpcy5yZW5kZXIoKTtcbiAgfVxuXG4gIGdldFByb2ZpbGUoKTogRGVzaXJhYmlsaXR5UHJvZmlsZSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMucHJvZmlsZTtcbiAgfVxuXG4gIHNldERlc2lnbk1vZGUob246IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5kZXNpZ24gPT09IG9uKVxuICAgICAgcmV0dXJuO1xuICAgIHRoaXMuZGVzaWduID0gb247XG4gICAgdGhpcy5yb3dzID0ge307XG4gICAgdGhpcy5yZW5kZXIoKTtcbiAgfVxuXG4gIHNldFByZXZpZXdNb2RlKG9uOiBib29sZWFuKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucHJldmlldyA9PT0gb24pXG4gICAgICByZXR1cm47XG4gICAgdGhpcy5wcmV2aWV3ID0gb247XG4gICAgdGhpcy5yb3dzID0ge307XG4gICAgdGhpcy5yZW5kZXIoKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVuZGVyKCk6IHZvaWQge1xuICAgIHVpLmVtcHR5KHRoaXMucm9vdCk7XG5cbiAgICBpZiAoIXRoaXMucHJvZmlsZSlcbiAgICAgIHJldHVybiB0aGlzLnJlbmRlckVtcHR5KCdObyBwcm9maWxlIHNwZWNpZmllZC4nKTtcblxuICAgIGNvbnN0IHJvd3MgPSB0aGlzLnByb3BlcnR5T3JkZXIubWFwKChuYW1lKSA9PiB7XG4gICAgICBjb25zdCByb3dJZCA9IHRoaXMucm93SWRzW25hbWVdO1xuICAgICAgaWYgKCF0aGlzLnJvd3Nbcm93SWRdKVxuICAgICAgICB0aGlzLnJvd3Nbcm93SWRdID0gdGhpcy5idWlsZFJvdyhuYW1lLCByb3dJZCwgdGhpcy5wcm9maWxlIS5wcm9wZXJ0aWVzW25hbWVdKTtcbiAgICAgIHJldHVybiB0aGlzLnJvd3Nbcm93SWRdO1xuICAgIH0pO1xuXG4gICAgaWYgKCFyb3dzLmxlbmd0aCkge1xuICAgICAgaWYgKCF0aGlzLnByZXZpZXcpXG4gICAgICAgIHRoaXMucm9vdC5hcHBlbmQodGhpcy5idWlsZEhlYWRlcigpKTtcbiAgICAgIGlmICh0aGlzLmRlc2lnbilcbiAgICAgICAgcmV0dXJuIHRoaXMucmVuZGVyRGVzaWduRW1wdHkoKTtcbiAgICAgIHJldHVybiB0aGlzLnJlbmRlckVtcHR5KCdObyBwcm9wZXJ0aWVzIGRlZmluZWQuJyk7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLnByZXZpZXcpXG4gICAgICB0aGlzLnJvb3QuYXBwZW5kKHRoaXMuYnVpbGRIZWFkZXIoKSk7XG4gICAgdGhpcy5yb290LmFwcGVuZCh1aS5kaXZWKHJvd3MpKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVuZGVyRW1wdHkodGV4dDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5yb290LmFwcGVuZCh1aS5kaXZUZXh0KHRleHQpKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVuZGVyRGVzaWduRW1wdHkoKTogdm9pZCB7XG4gICAgY29uc3QgaWNvbiA9IHVpLmljb25GQSgnY2hhcnQtbGluZScpO1xuICAgIGNvbnN0IGhlYWRpbmcgPSB1aS5oMygnTm8gcHJvcGVydGllcyB5ZXQnKTtcbiAgICBjb25zdCBtc2cgPSB1aS5wKCdTZWxlY3QgYSBkYXRhc2V0IHRvIGF1dG8tcG9wdWxhdGUgcHJvcGVydGllcyBmcm9tIGl0cyBudW1lcmljYWwgY29sdW1ucywgb3IgYWRkIHRoZW0gbWFudWFsbHkuJyk7XG4gICAgY29uc3QgYWRkQnRuID0gdWkubGluaygnKyBBZGQgUHJvcGVydHknLCAoKSA9PiB0aGlzLmFkZFByb3BlcnR5KCkpO1xuICAgIGNvbnN0IGNvbnRhaW5lciA9IHVpLmRpdlYoW2ljb24sIGhlYWRpbmcsIG1zZywgYWRkQnRuXSwgJ3N0YXRpc3RpY3MtbXBvLWVtcHR5LXN0YXRlJyk7XG4gICAgdGhpcy5yb290LmFwcGVuZChjb250YWluZXIpO1xuICB9XG5cbiAgYWRkUHJvcGVydHkoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnByb2ZpbGUpXG4gICAgICByZXR1cm47XG5cbiAgICBjb25zdCBuZXdOYW1lID0gYE5ld1Byb3BlcnR5JHtPYmplY3Qua2V5cyh0aGlzLnByb2ZpbGUucHJvcGVydGllcykubGVuZ3RoICsgMX1gO1xuICAgIGNvbnN0IG5ld1Jvd0lkID0gdGhpcy5uZXdSb3dJZCgpO1xuXG4gICAgdGhpcy5wcm9maWxlLnByb3BlcnRpZXNbbmV3TmFtZV0gPSBjcmVhdGVEZWZhdWx0TnVtZXJpY2FsKCk7XG4gICAgdGhpcy5yb3dJZHNbbmV3TmFtZV0gPSBuZXdSb3dJZDtcbiAgICB0aGlzLnByb3BlcnR5T3JkZXIucHVzaChuZXdOYW1lKTtcblxuICAgIHRoaXMucm93cyA9IHt9O1xuICAgIHRoaXMucmVuZGVyKCk7XG4gICAgdGhpcy5lbWl0Q2hhbmdlKCk7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkSGVhZGVyKCk6IEhUTUxFbGVtZW50IHtcbiAgICByZXR1cm4gdWkuZGl2SChbXG4gICAgICB1aS5kaXZUZXh0KCdQcm9wZXJ0eScsICdzdGF0aXN0aWNzLW1wby1oZWFkZXItcHJvcGVydHknKSxcbiAgICAgIHVpLmRpdlRleHQoJ1dlaWdodCcsICdzdGF0aXN0aWNzLW1wby1oZWFkZXItd2VpZ2h0JyksXG4gICAgICB1aS5kaXZUZXh0KCdEZXNpcmFiaWxpdHknLCAnc3RhdGlzdGljcy1tcG8taGVhZGVyLWRlc2lyYWJpbGl0eScpLFxuICAgIF0sICdzdGF0aXN0aWNzLW1wby1oZWFkZXInKTtcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRSb3coXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIHJvd0lkOiBzdHJpbmcsXG4gICAgcHJvcDogUHJvcGVydHlEZXNpcmFiaWxpdHksXG4gICk6IEhUTUxFbGVtZW50IHtcbiAgICBjb25zdCByb3cgPSB1aS5kaXZIKFtdLCAnc3RhdGlzdGljcy1tcG8tcm93Jyk7XG4gICAgcm93LmRhdGFzZXQucm93SWQgPSByb3dJZDtcblxuICAgIGNvbnN0IGNvbCA9IHRoaXMucmVzb2x2ZUNvbHVtbihuYW1lKTtcbiAgICBpZiAoY29sKSB7XG4gICAgICBjb25zdCBjb3JyZWN0ZWQgPSB0aGlzLmNvcnJlY3RQcm9wZXJ0eVR5cGUocHJvcCwgY29sKTtcbiAgICAgIGlmIChjb3JyZWN0ZWQpIHtcbiAgICAgICAgcHJvcCA9IGNvcnJlY3RlZDtcbiAgICAgICAgdGhpcy5wcm9maWxlIS5wcm9wZXJ0aWVzW25hbWVdID0gcHJvcDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBlZGl0b3IgPSBEZXNpcmFiaWxpdHlFZGl0b3JGYWN0b3J5LmNyZWF0ZShwcm9wLCAzMDAsIDgwLCB0aGlzLmRlc2lnbik7XG4gICAgdGhpcy5yb3dTdWJzLmdldChyb3dJZCk/LnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5yb3dTdWJzLnNldChyb3dJZCwgZWRpdG9yLm9uQ2hhbmdlZC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5lbWl0Q2hhbmdlKCkpKTtcblxuICAgIGNvbnN0IHByb3BlcnR5Q2VsbCA9IHRoaXMuYnVpbGRQcm9wZXJ0eUNlbGwocm93SWQsIG5hbWUpO1xuICAgIGNvbnN0IHdlaWdodENlbGwgPSB0aGlzLmJ1aWxkV2VpZ2h0Q2VsbChyb3dJZCwgcHJvcCk7XG4gICAgY29uc3QgY29sdW1uQ2VsbCA9IHRoaXMuYnVpbGRDb2x1bW5TZWxlY3Rvcihyb3dJZCwgbmFtZSwgZWRpdG9yKTtcblxuICAgIGNvbnN0IG1vZGVHZWFyID0gdGhpcy5kZXNpZ24gP1xuICAgICAgdGhpcy5idWlsZE1vZGVHZWFyKHJvd0lkLCBwcm9wLCBlZGl0b3IpIDpcbiAgICAgIG51bGw7XG5cbiAgICBjb25zdCBjb250cm9scyA9IHRoaXMuZGVzaWduID8gdGhpcy5idWlsZFJvd0NvbnRyb2xzKHJvd0lkKSA6IG51bGw7XG5cbiAgICByb3cuYXBwZW5kKFxuICAgICAgdWkuZGl2VihbcHJvcGVydHlDZWxsLCBjb2x1bW5DZWxsXS5maWx0ZXIoQm9vbGVhbiksICdzdGF0aXN0aWNzLW1wby1wcm9wZXJ0eS1jZWxsJyksXG4gICAgICB3ZWlnaHRDZWxsLFxuICAgICAgdWkuZGl2SChbZWRpdG9yLnJvb3QsIG1vZGVHZWFyXS5maWx0ZXIoQm9vbGVhbikpLFxuICAgICk7XG5cbiAgICBpZiAoY29udHJvbHMpXG4gICAgICByb3cuYXBwZW5kKGNvbnRyb2xzKTtcblxuICAgIHJldHVybiByb3c7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkUHJvcGVydHlDZWxsKHJvd0lkOiBzdHJpbmcsIG5hbWU6IHN0cmluZyk6IEhUTUxFbGVtZW50IHwgbnVsbCB7XG4gICAgaWYgKHRoaXMuZGF0YUZyYW1lKSB7XG4gICAgICBjb25zdCBlbCA9IHVpLmRpdlRleHQobmFtZSk7XG4gICAgICB1aS50b29sdGlwLmJpbmQoZWwsICgpID0+IG5hbWUpO1xuICAgICAgcmV0dXJuIGVsO1xuICAgIH1cblxuICAgIGxldCBjdXJyZW50TmFtZSA9IG5hbWU7XG5cbiAgICBjb25zdCBwcm9wTmFtZUlucCA9IHVpLmlucHV0LnN0cmluZygnJywge3ZhbHVlOiBuYW1lLCBvblZhbHVlQ2hhbmdlZDogKHYpID0+IHtcbiAgICAgIGlmICghdiB8fCB2ID09PSBjdXJyZW50TmFtZSlcbiAgICAgICAgcmV0dXJuO1xuICAgICAgdGhpcy5yZW5hbWVQcm9wZXJ0eShjdXJyZW50TmFtZSwgdik7XG4gICAgICBjdXJyZW50TmFtZSA9IHY7XG4gICAgfX0pO1xuXG4gICAgdWkudG9vbHRpcC5iaW5kKHByb3BOYW1lSW5wLmlucHV0LCAoKSA9PiBjdXJyZW50TmFtZSk7XG4gICAgcmV0dXJuIHByb3BOYW1lSW5wLnJvb3Q7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkV2VpZ2h0Q2VsbChcbiAgICByb3dJZDogc3RyaW5nLFxuICAgIHByb3A6IFByb3BlcnR5RGVzaXJhYmlsaXR5LFxuICApOiBIVE1MRWxlbWVudCB7XG4gICAgY29uc3QgbmFtZSA9IHRoaXMuZ2V0UHJvcGVydHlOYW1lQnlSb3dJZChyb3dJZCk7XG4gICAgY29uc3QgY2hpbGRyZW46IEhUTUxFbGVtZW50W10gPSBbXTtcblxuICAgIGNvbnN0IHdlaWdodElucHV0ID0gdWkuaW5wdXQuZmxvYXQoJycsIHt2YWx1ZTogcHJvcC53ZWlnaHQsIG1pbjogMCwgbWF4OiAxLCBmb3JtYXQ6ICcjMC4wMDAnLFxuICAgICAgb25WYWx1ZUNoYW5nZWQ6ICh2KSA9PiB7XG4gICAgICAgIGlmIChuYW1lKVxuICAgICAgICAgIHRoaXMubXV0YXRlUHJvcGVydHkobmFtZSwgKHApID0+IHAud2VpZ2h0ID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oMSwgdiA/PyAwKSkpO1xuICAgICAgfSxcbiAgICB9KTtcbiAgICB3ZWlnaHRJbnB1dC5yb290LmNsYXNzTGlzdC5hZGQoJ3N0YXRpc3RpY3MtbXBvLXdlaWdodC1pbnB1dCcpO1xuICAgIGNoaWxkcmVuLnB1c2god2VpZ2h0SW5wdXQucm9vdCk7XG5cbiAgICBpZiAodGhpcy5kYXRhRnJhbWUpIHtcbiAgICAgIGNvbnN0IG51bUNvbHMgPSB0aGlzLmdldE51bWVyaWNhbENvbHVtbk5hbWVzKCk7XG4gICAgICBsZXQgaXNDb2x1bW4gPSAhIXByb3Aud2VpZ2h0Q29sdW1uICYmIG51bUNvbHMuaW5jbHVkZXMocHJvcC53ZWlnaHRDb2x1bW4pO1xuXG4gICAgICBjb25zdCBjb2xJbnB1dCA9IHVpLmlucHV0LmNob2ljZSgnJywge2l0ZW1zOiBudW1Db2xzLCBudWxsYWJsZTogdHJ1ZSwgdmFsdWU6IHByb3Aud2VpZ2h0Q29sdW1uID8/ICcnLFxuICAgICAgICBvblZhbHVlQ2hhbmdlZDogKHYpID0+IHtcbiAgICAgICAgICBpZiAobmFtZSlcbiAgICAgICAgICAgIHRoaXMubXV0YXRlUHJvcGVydHkobmFtZSwgKHApID0+IHAud2VpZ2h0Q29sdW1uID0gdiB8fCB1bmRlZmluZWQpO1xuICAgICAgICB9LFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHN5bmNUb2dnbGUgPSAoKSA9PiB7XG4gICAgICAgIHdlaWdodElucHV0LnJvb3QuY2xhc3NMaXN0LnRvZ2dsZSgnc3RhdGlzdGljcy1tcG8taGlkZGVuJywgaXNDb2x1bW4pO1xuICAgICAgICBjb2xJbnB1dC5yb290LmNsYXNzTGlzdC50b2dnbGUoJ3N0YXRpc3RpY3MtbXBvLWhpZGRlbicsICFpc0NvbHVtbik7XG4gICAgICAgIHRvZ2dsZS5jbGFzc0xpc3QudG9nZ2xlKCdzdGF0aXN0aWNzLW1wby13ZWlnaHQtdG9nZ2xlLWFjdGl2ZScsIGlzQ29sdW1uKTtcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHRvZ2dsZSA9IHVpLmljb25GQSgnY29sdW1ucycsICgpID0+IHtcbiAgICAgICAgaXNDb2x1bW4gPSAhaXNDb2x1bW47XG4gICAgICAgIHN5bmNUb2dnbGUoKTtcbiAgICAgICAgaWYgKCFpc0NvbHVtbiAmJiBuYW1lKVxuICAgICAgICAgIHRoaXMubXV0YXRlUHJvcGVydHkobmFtZSwgKHApID0+IHsgZGVsZXRlIHAud2VpZ2h0Q29sdW1uOyB9KTtcbiAgICAgICAgZWxzZSBpZiAoaXNDb2x1bW4gJiYgbmFtZSAmJiBjb2xJbnB1dC52YWx1ZSlcbiAgICAgICAgICB0aGlzLm11dGF0ZVByb3BlcnR5KG5hbWUsIChwKSA9PiBwLndlaWdodENvbHVtbiA9IGNvbElucHV0LnZhbHVlIHx8IHVuZGVmaW5lZCk7XG4gICAgICB9KTtcbiAgICAgIHRvZ2dsZS5jbGFzc0xpc3QuYWRkKCdzdGF0aXN0aWNzLW1wby13ZWlnaHQtdG9nZ2xlJyk7XG4gICAgICB1aS50b29sdGlwLmJpbmQodG9nZ2xlLCAoKSA9PiBpc0NvbHVtbiA/ICdTd2l0Y2ggdG8gbWFudWFsIHdlaWdodCcgOiAnVXNlIHdlaWdodCBmcm9tIGNvbHVtbicpO1xuICAgICAgc3luY1RvZ2dsZSgpO1xuXG4gICAgICBjaGlsZHJlbi5wdXNoKGNvbElucHV0LnJvb3QsIHRvZ2dsZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHVpLmRpdkgoY2hpbGRyZW4sICdzdGF0aXN0aWNzLW1wby13ZWlnaHQtY2VsbCcpO1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZENvbHVtblNlbGVjdG9yKFxuICAgIHJvd0lkOiBzdHJpbmcsXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGVkaXRvcjogRGVzaXJhYmlsaXR5RWRpdG9yLFxuICApOiBIVE1MRWxlbWVudCB8IG51bGwge1xuICAgIGlmICghdGhpcy5kYXRhRnJhbWUpXG4gICAgICByZXR1cm4gbnVsbDtcblxuICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5nZXRFbGlnaWJsZUNvbHVtbk5hbWVzKCk7XG4gICAgY29uc3QgbWF0Y2hlZCA9IHRoaXMuY29sdW1uTWFwcGluZ1tuYW1lXSA/PyBudWxsO1xuXG4gICAgaWYgKG1hdGNoZWQpIHtcbiAgICAgIGNvbnN0IGNvbCA9IHRoaXMuZGF0YUZyYW1lLmNvbChtYXRjaGVkKTtcbiAgICAgIGVkaXRvci5zZXRDb2x1bW4/Lihjb2wpO1xuICAgIH1cblxuICAgIGNvbnN0IGlucHV0ID0gdWkuaW5wdXQuY2hvaWNlKCcnLCB7aXRlbXMsIG51bGxhYmxlOiB0cnVlLCB2YWx1ZTogbWF0Y2hlZCA/PyAnJywgb25WYWx1ZUNoYW5nZWQ6ICh2KSA9PiB7XG4gICAgICB0aGlzLmNvbHVtbk1hcHBpbmdbbmFtZV0gPSB2ID8/IG51bGw7XG4gICAgICBjb25zdCBjb2wgPSB2ID8gdGhpcy5kYXRhRnJhbWUhLmNvbCh2KSA6IG51bGw7XG4gICAgICBpZiAoY29sICYmIHRoaXMuc3dpdGNoUHJvcGVydHlUeXBlKG5hbWUsIHJvd0lkLCBjb2wpKVxuICAgICAgICByZXR1cm47XG4gICAgICBlZGl0b3Iuc2V0Q29sdW1uPy4oY29sKTtcbiAgICAgIHRoaXMuZW1pdENoYW5nZSgpO1xuICAgIH19KTtcbiAgICByZXR1cm4gaW5wdXQucm9vdDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0RWxpZ2libGVDb2x1bW5OYW1lcygpOiBzdHJpbmdbXSB7XG4gICAgaWYgKCF0aGlzLmRhdGFGcmFtZSlcbiAgICAgIHJldHVybiBbXTtcbiAgICByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLmRhdGFGcmFtZS5jb2x1bW5zKVxuICAgICAgLmZpbHRlcigoYykgPT4gIWMuaXNDYXRlZ29yaWNhbCB8fCBjLmNhdGVnb3JpZXMubGVuZ3RoIDw9IE1BWF9DQVRFR09SSUNBTF9DQVRFR09SSUVTKVxuICAgICAgLm1hcCgoYykgPT4gYy5uYW1lKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0TnVtZXJpY2FsQ29sdW1uTmFtZXMoKTogc3RyaW5nW10ge1xuICAgIGlmICghdGhpcy5kYXRhRnJhbWUpXG4gICAgICByZXR1cm4gW107XG4gICAgcmV0dXJuIEFycmF5LmZyb20odGhpcy5kYXRhRnJhbWUuY29sdW1ucy5udW1lcmljYWwpLm1hcCgoYykgPT4gYy5uYW1lKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVzb2x2ZUNvbHVtbihuYW1lOiBzdHJpbmcpOiBERy5Db2x1bW4gfCBudWxsIHtcbiAgICBpZiAoIXRoaXMuZGF0YUZyYW1lKVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgY29uc3QgZWxpZ2libGUgPSB0aGlzLmdldEVsaWdpYmxlQ29sdW1uTmFtZXMoKTtcbiAgICBjb25zdCBjb2xOYW1lID0gdGhpcy5jb2x1bW5NYXBwaW5nW25hbWVdID8/IGVsaWdpYmxlLmZpbmQoKGMpID0+IGMudG9Mb3dlckNhc2UoKSA9PT0gbmFtZS50b0xvd2VyQ2FzZSgpKSA/PyBudWxsO1xuICAgIGlmIChjb2xOYW1lKVxuICAgICAgdGhpcy5jb2x1bW5NYXBwaW5nW25hbWVdID0gY29sTmFtZTtcbiAgICByZXR1cm4gY29sTmFtZSA/IHRoaXMuZGF0YUZyYW1lLmNvbChjb2xOYW1lKSA/PyBudWxsIDogbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgY29ycmVjdFByb3BlcnR5VHlwZShwcm9wOiBQcm9wZXJ0eURlc2lyYWJpbGl0eSwgY29sOiBERy5Db2x1bW4pOiBQcm9wZXJ0eURlc2lyYWJpbGl0eSB8IG51bGwge1xuICAgIGlmIChpc051bWVyaWNhbChwcm9wKSAmJiBjb2wuaXNDYXRlZ29yaWNhbCkge1xuICAgICAgY29uc3QgY2F0ZWdvcmllcyA9IGNvbC5jYXRlZ29yaWVzLm1hcCgoYzogc3RyaW5nKSA9PiAoe25hbWU6IGMsIGRlc2lyYWJpbGl0eTogMX0pKTtcbiAgICAgIHJldHVybiBjcmVhdGVEZWZhdWx0Q2F0ZWdvcmljYWwocHJvcC53ZWlnaHQsIGNhdGVnb3JpZXMpO1xuICAgIH1cblxuICAgIGlmICghaXNOdW1lcmljYWwocHJvcCkgJiYgY29sLmlzTnVtZXJpY2FsKVxuICAgICAgcmV0dXJuIGNyZWF0ZURlZmF1bHROdW1lcmljYWwocHJvcC53ZWlnaHQsIGNvbC5taW4sIGNvbC5tYXgpO1xuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBwcml2YXRlIHN3aXRjaFByb3BlcnR5VHlwZShcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgcm93SWQ6IHN0cmluZyxcbiAgICBjb2w6IERHLkNvbHVtbixcbiAgKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLnByb2ZpbGUpXG4gICAgICByZXR1cm4gZmFsc2U7XG5cbiAgICBjb25zdCBjb3JyZWN0ZWQgPSB0aGlzLmNvcnJlY3RQcm9wZXJ0eVR5cGUodGhpcy5wcm9maWxlLnByb3BlcnRpZXNbbmFtZV0sIGNvbCk7XG4gICAgaWYgKCFjb3JyZWN0ZWQpXG4gICAgICByZXR1cm4gZmFsc2U7XG5cbiAgICB0aGlzLnByb2ZpbGUucHJvcGVydGllc1tuYW1lXSA9IGNvcnJlY3RlZDtcbiAgICB0aGlzLnJlYnVpbGRSb3cobmFtZSwgcm93SWQpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcHJpdmF0ZSByZWJ1aWxkUm93KG5hbWU6IHN0cmluZywgcm93SWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IG9sZFJvdyA9IHRoaXMucm93c1tyb3dJZF07XG4gICAgY29uc3QgbmV3Um93ID0gdGhpcy5idWlsZFJvdyhuYW1lLCByb3dJZCwgdGhpcy5wcm9maWxlIS5wcm9wZXJ0aWVzW25hbWVdKTtcbiAgICB0aGlzLnJvd3Nbcm93SWRdID0gbmV3Um93O1xuXG4gICAgaWYgKG9sZFJvdz8ucGFyZW50Tm9kZSlcbiAgICAgIG9sZFJvdy5yZXBsYWNlV2l0aChuZXdSb3cpO1xuXG4gICAgdGhpcy5lbWl0Q2hhbmdlKCk7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkTW9kZUdlYXIoXG4gICAgcm93SWQ6IHN0cmluZyxcbiAgICBwcm9wOiBQcm9wZXJ0eURlc2lyYWJpbGl0eSxcbiAgICBlZGl0b3I6IERlc2lyYWJpbGl0eUVkaXRvcixcbiAgKTogSFRNTEVsZW1lbnQge1xuICAgIGNvbnN0IGdlYXIgPSB1aS5pY29ucy5zZXR0aW5ncygoKSA9PiB7XG4gICAgICBjb25zdCBuYW1lID0gdGhpcy5nZXRQcm9wZXJ0eU5hbWVCeVJvd0lkKHJvd0lkKTtcbiAgICAgIGlmICghbmFtZSlcbiAgICAgICAgcmV0dXJuO1xuICAgICAgY29uc3QgY29sTmFtZSA9IHRoaXMuY29sdW1uTWFwcGluZ1tuYW1lXTtcbiAgICAgIGNvbnN0IGNvbCA9IGNvbE5hbWUgPyB0aGlzLmRhdGFGcmFtZT8uY29sKGNvbE5hbWUpID8/IG51bGwgOiBudWxsO1xuICAgICAgdGhpcy5vcGVuTW9kZURpYWxvZyhuYW1lLCByb3dJZCwgcHJvcCwgZWRpdG9yLCBjb2wpO1xuICAgIH0pO1xuXG4gICAgZ2Vhci5jbGFzc0xpc3QuYWRkKCdzdGF0aXN0aWNzLW1wby1nZWFyJyk7XG4gICAgcmV0dXJuIGdlYXI7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkUm93Q29udHJvbHMocm93SWQ6IHN0cmluZyk6IEhUTUxFbGVtZW50IHtcbiAgICBjb25zdCBhZGQgPSB1aS5pY29ucy5hZGQoKCkgPT4gdGhpcy5pbnNlcnRSb3dBZnRlclJvdyhyb3dJZCkpO1xuICAgIGNvbnN0IGRlbCA9IHVpLmljb25zLmRlbGV0ZSgoKSA9PiB0aGlzLmRlbGV0ZVJvdyhyb3dJZCkpO1xuICAgIHJldHVybiB1aS5kaXZIKFthZGQsIGRlbF0sICdzdGF0aXN0aWNzLW1wby1jb250cm9sLWJ1dHRvbnMnKTtcbiAgfVxuXG4gIHByaXZhdGUgb3Blbk1vZGVEaWFsb2coXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIHJvd0lkOiBzdHJpbmcsXG4gICAgcHJvcDogUHJvcGVydHlEZXNpcmFiaWxpdHksXG4gICAgZWRpdG9yOiBEZXNpcmFiaWxpdHlFZGl0b3IsXG4gICAgbWFwcGVkQ29sOiBERy5Db2x1bW4gfCBudWxsID0gbnVsbCxcbiAgKTogdm9pZCB7XG4gICAgbmV3IERlc2lyYWJpbGl0eU1vZGVEaWFsb2coXG4gICAgICBuYW1lLFxuICAgICAgcHJvcCxcbiAgICAgIChwYXRjaCkgPT4ge1xuICAgICAgICBjb25zdCBwID0gdGhpcy5wcm9maWxlPy5wcm9wZXJ0aWVzW25hbWVdO1xuICAgICAgICBpZiAocClcbiAgICAgICAgICBPYmplY3QuYXNzaWduKHAsIHBhdGNoKTtcbiAgICAgICAgZWRpdG9yLnJlZHJhd0FsbCgpO1xuICAgICAgfSxcbiAgICAgIChuZXdQcm9wKSA9PiB7XG4gICAgICAgIGlmICghdGhpcy5wcm9maWxlKVxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgdGhpcy5wcm9maWxlLnByb3BlcnRpZXNbbmFtZV0gPSBuZXdQcm9wO1xuICAgICAgICB0aGlzLnJlYnVpbGRSb3cobmFtZSwgcm93SWQpO1xuICAgICAgfSxcbiAgICAgIG1hcHBlZENvbCxcbiAgICApLnNob3coKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0UHJvcGVydHlOYW1lQnlSb3dJZChyb3dJZDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gT2JqZWN0LmVudHJpZXModGhpcy5yb3dJZHMpXG4gICAgICAuZmluZCgoWywgaWRdKSA9PiBpZCA9PT0gcm93SWQpPy5bMF07XG4gIH1cblxuICBwcml2YXRlIHJlbmFtZVByb3BlcnR5KG9sZE5hbWU6IHN0cmluZywgbmV3TmFtZTogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnByb2ZpbGUgfHwgdGhpcy5wcm9maWxlLnByb3BlcnRpZXNbbmV3TmFtZV0pXG4gICAgICByZXR1cm47XG5cbiAgICBjb25zdCByb3dJZCA9IHRoaXMucm93SWRzW29sZE5hbWVdO1xuICAgIHRoaXMucHJvZmlsZS5wcm9wZXJ0aWVzW25ld05hbWVdID0gdGhpcy5wcm9maWxlLnByb3BlcnRpZXNbb2xkTmFtZV07XG4gICAgZGVsZXRlIHRoaXMucHJvZmlsZS5wcm9wZXJ0aWVzW29sZE5hbWVdO1xuXG4gICAgdGhpcy5jb2x1bW5NYXBwaW5nW25ld05hbWVdID0gdGhpcy5jb2x1bW5NYXBwaW5nW29sZE5hbWVdID8/IG51bGw7XG4gICAgZGVsZXRlIHRoaXMuY29sdW1uTWFwcGluZ1tvbGROYW1lXTtcblxuICAgIGNvbnN0IGlkeCA9IHRoaXMucHJvcGVydHlPcmRlci5pbmRleE9mKG9sZE5hbWUpO1xuICAgIGlmIChpZHggPj0gMClcbiAgICAgIHRoaXMucHJvcGVydHlPcmRlcltpZHhdID0gbmV3TmFtZTtcblxuICAgIGRlbGV0ZSB0aGlzLnJvd0lkc1tvbGROYW1lXTtcbiAgICB0aGlzLnJvd0lkc1tuZXdOYW1lXSA9IHJvd0lkO1xuXG4gICAgdGhpcy5lbWl0Q2hhbmdlKCk7XG4gIH1cblxuICBwcml2YXRlIGRlbGV0ZVJvdyhyb3dJZDogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgbmFtZSA9IHRoaXMuZ2V0UHJvcGVydHlOYW1lQnlSb3dJZChyb3dJZCk7XG4gICAgaWYgKCFuYW1lIHx8ICF0aGlzLnByb2ZpbGUpXG4gICAgICByZXR1cm47XG5cbiAgICBkZWxldGUgdGhpcy5wcm9maWxlLnByb3BlcnRpZXNbbmFtZV07XG4gICAgZGVsZXRlIHRoaXMuY29sdW1uTWFwcGluZ1tuYW1lXTtcbiAgICBkZWxldGUgdGhpcy5yb3dJZHNbbmFtZV07XG4gICAgdGhpcy5yb3dTdWJzLmdldChyb3dJZCk/LnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5yb3dTdWJzLmRlbGV0ZShyb3dJZCk7XG5cbiAgICBjb25zdCBpZHggPSB0aGlzLnByb3BlcnR5T3JkZXIuaW5kZXhPZihuYW1lKTtcbiAgICBpZiAoaWR4ID49IDApXG4gICAgICB0aGlzLnByb3BlcnR5T3JkZXIuc3BsaWNlKGlkeCwgMSk7XG5cbiAgICBjb25zdCByb3dFbCA9IHRoaXMucm93c1tyb3dJZF07XG4gICAgZGVsZXRlIHRoaXMucm93c1tyb3dJZF07XG5cbiAgICBpZiAodGhpcy5wcm9wZXJ0eU9yZGVyLmxlbmd0aCA9PT0gMClcbiAgICAgIHRoaXMucmVuZGVyKCk7XG4gICAgZWxzZVxuICAgICAgcm93RWw/LnJlbW92ZSgpO1xuXG4gICAgdGhpcy5lbWl0Q2hhbmdlKCk7XG4gIH1cblxuICBwcml2YXRlIGluc2VydFJvd0FmdGVyUm93KHJvd0lkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMucHJvZmlsZSlcbiAgICAgIHJldHVybjtcblxuICAgIGNvbnN0IGFmdGVyTmFtZSA9IHRoaXMuZ2V0UHJvcGVydHlOYW1lQnlSb3dJZChyb3dJZCk7XG4gICAgaWYgKCFhZnRlck5hbWUpXG4gICAgICByZXR1cm47XG5cbiAgICBjb25zdCBuZXdOYW1lID0gYE5ld1Byb3BlcnR5JHtPYmplY3Qua2V5cyh0aGlzLnByb2ZpbGUucHJvcGVydGllcykubGVuZ3RoICsgMX1gO1xuICAgIGNvbnN0IG5ld1Jvd0lkID0gdGhpcy5uZXdSb3dJZCgpO1xuXG4gICAgdGhpcy5wcm9maWxlLnByb3BlcnRpZXNbbmV3TmFtZV0gPSBjcmVhdGVEZWZhdWx0TnVtZXJpY2FsKCk7XG5cbiAgICB0aGlzLnJvd0lkc1tuZXdOYW1lXSA9IG5ld1Jvd0lkO1xuXG4gICAgY29uc3QgaWR4ID0gdGhpcy5wcm9wZXJ0eU9yZGVyLmluZGV4T2YoYWZ0ZXJOYW1lKTtcbiAgICB0aGlzLnByb3BlcnR5T3JkZXIuc3BsaWNlKGlkeCArIDEsIDAsIG5ld05hbWUpO1xuXG4gICAgY29uc3QgbmV3Um93ID0gdGhpcy5idWlsZFJvdyhuZXdOYW1lLCBuZXdSb3dJZCwgdGhpcy5wcm9maWxlLnByb3BlcnRpZXNbbmV3TmFtZV0pO1xuICAgIHRoaXMucm93c1tuZXdSb3dJZF0gPSBuZXdSb3c7XG5cbiAgICB0aGlzLnJvd3Nbcm93SWRdPy5hZnRlcihuZXdSb3cpO1xuICAgIHRoaXMuZW1pdENoYW5nZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBtdXRhdGVQcm9wZXJ0eShcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgdXBkYXRlcjogKHA6IFByb3BlcnR5RGVzaXJhYmlsaXR5KSA9PiB2b2lkLFxuICApOiB2b2lkIHtcbiAgICBjb25zdCBwcm9wID0gdGhpcy5wcm9maWxlPy5wcm9wZXJ0aWVzW25hbWVdO1xuICAgIGlmICghcHJvcClcbiAgICAgIHJldHVybjtcblxuICAgIHVwZGF0ZXIocHJvcCk7XG4gICAgdGhpcy5lbWl0Q2hhbmdlKCk7XG4gIH1cblxuICBwcml2YXRlIGVtaXRDaGFuZ2UoKTogdm9pZCB7XG4gICAgdGhpcy5vbkNoYW5nZWQubmV4dCgpO1xuICAgIGdyb2suZXZlbnRzLmZpcmVDdXN0b21FdmVudChNUE9fU0NPUkVfQ0hBTkdFRF9FVkVOVCwge30pO1xuICB9XG59XG4iXX0=