@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.
package/css/styles.css ADDED
@@ -0,0 +1,229 @@
1
+ .statistics-mpo-header {
2
+ margin-top: 10px;
3
+ padding-bottom: 5px;
4
+ border-bottom: 1px solid var(--grey-2);
5
+ gap: 10px;
6
+ }
7
+
8
+ .statistics-mpo-header > * {
9
+ font-weight: bold;
10
+ }
11
+
12
+ .statistics-mpo-header > *:first-child {
13
+ width: 130px;
14
+ }
15
+
16
+ .statistics-mpo-header > *:nth-child(2) {
17
+ width: 120px;
18
+ min-width: 60px;
19
+ }
20
+
21
+ .statistics-mpo-header > *:nth-child(3) {
22
+ flex-grow: 1;
23
+ }
24
+
25
+ .statistics-mpo-property-cell {
26
+ width: 130px;
27
+ max-width: 130px;
28
+ align-self: flex-end;
29
+ margin-bottom: 20px !important;
30
+ }
31
+
32
+ .ui-form .statistics-mpo-property-cell > div:first-child {
33
+ padding-left: 4px;
34
+ }
35
+
36
+ .statistics-mpo-property-cell > div:first-child {
37
+ overflow: hidden;
38
+ text-overflow: ellipsis;
39
+ white-space: nowrap;
40
+ }
41
+
42
+ .statistics-mpo-weight-input {
43
+ width: 100px;
44
+ }
45
+
46
+ .statistics-mpo-weight-cell {
47
+ align-self: flex-end;
48
+ margin-bottom: 20px !important;
49
+ align-items: center;
50
+ gap: 4px;
51
+ }
52
+
53
+ .statistics-mpo-control-buttons {
54
+ gap: 10px;
55
+ margin-left: 10px;
56
+ color: var(--blue-1);
57
+ visibility: hidden;
58
+ white-space: nowrap;
59
+ flex-shrink: 0;
60
+ }
61
+
62
+ .statistics-mpo-row:hover .statistics-mpo-control-buttons,
63
+ .statistics-mpo-cat-row:hover .statistics-mpo-control-buttons {
64
+ visibility: visible;
65
+ }
66
+
67
+ .statistics-mpo-range-input {
68
+ width: 70px;
69
+ }
70
+
71
+ .statistics-mpo-row {
72
+ display: flex;
73
+ align-items: center;
74
+ justify-content: flex-start;
75
+ padding: 8px 0;
76
+ min-height: 70px;
77
+ gap: 10px;
78
+
79
+ flex-wrap: wrap;
80
+ }
81
+
82
+ .statistics-mpo-row > * {
83
+ flex: 0 0 auto;
84
+ }
85
+
86
+
87
+ .statistics-mpo-row .ui-input-choice .ui-input-editor {
88
+ width: 100px !important;
89
+ max-width: none !important;
90
+ }
91
+
92
+ .ui-form .statistics-mpo-row .ui-input-root {
93
+ margin-bottom: 0 !important;
94
+ padding: 0 !important;
95
+ }
96
+
97
+ .statistics-mpo-cat-editor {
98
+ width: 280px;
99
+ margin-left: 30px;
100
+ }
101
+
102
+ .statistics-mpo-cat-row {
103
+ display: flex;
104
+ align-items: center;
105
+ gap: 4px;
106
+ margin-bottom: 2px;
107
+ }
108
+
109
+ .statistics-mpo-cat-name {
110
+ width: 120px;
111
+ }
112
+
113
+ .statistics-mpo-cat-col-header {
114
+ font-size: 11px;
115
+ color: var(--grey-3);
116
+ text-transform: uppercase;
117
+ letter-spacing: 0.3px;
118
+ }
119
+
120
+ .statistics-mpo-desirability-dialog .statistics-mpo-cat-editor {
121
+ width: auto;
122
+ margin-left: 0;
123
+ }
124
+
125
+ .statistics-mpo-desirability-dialog .statistics-mpo-cat-name {
126
+ flex: 1;
127
+ width: auto;
128
+ }
129
+
130
+ .statistics-mpo-cat-desirability {
131
+ width: 70px;
132
+ }
133
+
134
+ .statistics-mpo-weight-toggle {
135
+ cursor: pointer;
136
+ color: var(--grey-3);
137
+ font-size: 12px;
138
+ }
139
+
140
+ .statistics-mpo-weight-toggle:hover {
141
+ color: var(--grey-5);
142
+ }
143
+
144
+ .statistics-mpo-weight-toggle-active {
145
+ color: var(--blue-1);
146
+ }
147
+
148
+ .statistics-mpo-weight-toggle-active:hover {
149
+ color: var(--blue-2);
150
+ }
151
+
152
+ .statistics-mpo-hidden {
153
+ display: none !important;
154
+ }
155
+
156
+ .statistics-mpo-empty-state {
157
+ text-align: center;
158
+ padding: 48px 24px;
159
+ color: var(--grey-4);
160
+ border: 1px dashed var(--grey-2);
161
+ border-radius: 8px;
162
+ margin: 16px 12px;
163
+ }
164
+
165
+ .statistics-mpo-empty-state i {
166
+ font-size: 48px;
167
+ margin-bottom: 16px;
168
+ display: block;
169
+ color: var(--blue-1);
170
+ opacity: 0.3;
171
+ cursor: default;
172
+ pointer-events: none;
173
+ }
174
+
175
+ .statistics-mpo-empty-state h3 {
176
+ color: var(--grey-5);
177
+ }
178
+
179
+ .statistics-mpo-empty-state p {
180
+ color: var(--grey-3);
181
+ max-width: 360px;
182
+ margin-inline: auto;
183
+ }
184
+
185
+ .statistics-mpo-dialog-header-row {
186
+ gap: 12px;
187
+ align-items: flex-end;
188
+ margin-bottom: 8px;
189
+ }
190
+
191
+ .statistics-mpo-dialog-header-row .ui-input-root {
192
+ flex: 0 1 auto;
193
+ }
194
+
195
+ .statistics-mpo-section-header {
196
+ font-size: 11px;
197
+ text-transform: uppercase;
198
+ color: var(--blue-1);
199
+ letter-spacing: 0.5px;
200
+ border-bottom: 1px solid var(--grey-2);
201
+ padding-bottom: 4px;
202
+ margin: 12px 0 8px;
203
+ }
204
+
205
+ .statistics-mpo-param-grid.ui-form {
206
+ display: grid;
207
+ grid-template-columns: 1fr 1fr;
208
+ gap: 0 8px;
209
+ }
210
+
211
+ .statistics-mpo-desirability-dialog .statistics-mpo-plot {
212
+ margin: 0 auto;
213
+ }
214
+
215
+ @media (max-width: 500px) {
216
+ .statistics-mpo-row {
217
+ flex-direction: column;
218
+ align-items: flex-start;
219
+ }
220
+
221
+ .statistics-mpo-row > * {
222
+ width: 100% !important;
223
+ margin-bottom: 5px;
224
+ }
225
+
226
+ .statistics-mpo-weight-cell {
227
+ margin-top: 0 !important;
228
+ }
229
+ }
package/package.json CHANGED
@@ -4,7 +4,7 @@
4
4
  "access": "public"
5
5
  },
6
6
  "friendlyName": "statistics",
7
- "version": "1.10.0",
7
+ "version": "1.12.0",
8
8
  "description": "Statistics utilities",
9
9
  "author": {
10
10
  "name": "Dmytro Kovalyov",
@@ -14,7 +14,7 @@
14
14
  "@datagrok-libraries/utils": "^4.5.7",
15
15
  "@types/seedrandom": "^3.0.8",
16
16
  "cash-dom": "^8.0.0",
17
- "datagrok-api": "^1.20.0",
17
+ "datagrok-api": "^1.27.0",
18
18
  "dayjs": "^1.11.7",
19
19
  "jstat": "^1.9.6",
20
20
  "konva": "^9.3.20",
@@ -28,6 +28,7 @@
28
28
  "eslint": "^8.57.1",
29
29
  "eslint-config-google": "^0.14.0",
30
30
  "ts-loader": "^9.2.6",
31
+ "css-loader": "^7.1.2",
31
32
  "typescript": "^4.2.3"
32
33
  },
33
34
  "scripts": {
@@ -0,0 +1,14 @@
1
+ import * as DG from 'datagrok-api/dg';
2
+ import { PropertyDesirability } from '../mpo';
3
+ export declare class DesirabilityModeDialog {
4
+ private propertyName;
5
+ private prop;
6
+ private onUpdate;
7
+ private onTypeChanged?;
8
+ private mappedCol?;
9
+ constructor(propertyName: string, prop: PropertyDesirability, onUpdate: (patch: Partial<PropertyDesirability>) => void, onTypeChanged?: ((newProp: PropertyDesirability) => void) | undefined, mappedCol?: DG.Column<any, any> | null | undefined);
10
+ private static strategyToLabel;
11
+ private buildDefaultScoreInput;
12
+ show(): void;
13
+ }
14
+ //# sourceMappingURL=desirability-mode-dialog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"desirability-mode-dialog.d.ts","sourceRoot":"","sources":["desirability-mode-dialog.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAGtC,OAAO,EACL,oBAAoB,EAErB,MAAM,QAAQ,CAAC;AAkBhB,qBAAa,sBAAsB;IAE/B,OAAO,CAAC,YAAY;IACpB,OAAO,CAAC,IAAI;IACZ,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,aAAa,CAAC;IACtB,OAAO,CAAC,SAAS,CAAC;gBAJV,YAAY,EAAE,MAAM,EACpB,IAAI,EAAE,oBAAoB,EAC1B,QAAQ,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC,oBAAoB,CAAC,KAAK,IAAI,EACxD,aAAa,CAAC,aAAY,oBAAoB,KAAK,IAAI,aAAA,EACvD,SAAS,CAAC,wCAAkB;IAGtC,OAAO,CAAC,MAAM,CAAC,eAAe;IAQ9B,OAAO,CAAC,sBAAsB;IAmC9B,IAAI,IAAI,IAAI;CAsKb"}
@@ -0,0 +1,198 @@
1
+ /* eslint-disable max-len */
2
+ import * as ui from 'datagrok-api/ui';
3
+ import { createDefaultCategorical, createDefaultNumerical, isNumerical, } from '../mpo';
4
+ import { MpoDesirabilityLineEditor } from '../editors/mpo-line-editor';
5
+ import { MpoCategoricalEditor } from '../editors/mpo-categorical-editor';
6
+ const DESIRABILITY_MODES = ['freeform', 'gaussian', 'sigmoid'];
7
+ const PROPERTY_TYPES = ['numerical', 'categorical'];
8
+ function sectionHeader(text) {
9
+ return ui.divText(text, 'statistics-mpo-section-header');
10
+ }
11
+ export class DesirabilityModeDialog {
12
+ constructor(propertyName, prop, onUpdate, onTypeChanged, mappedCol) {
13
+ this.propertyName = propertyName;
14
+ this.prop = prop;
15
+ this.onUpdate = onUpdate;
16
+ this.onTypeChanged = onTypeChanged;
17
+ this.mappedCol = mappedCol;
18
+ }
19
+ static strategyToLabel(strategy) {
20
+ switch (strategy) {
21
+ case 'default': return 'Use default score';
22
+ case 'skip': return 'Skip property';
23
+ default: return 'Exclude row';
24
+ }
25
+ }
26
+ buildDefaultScoreInput(prop) {
27
+ const mv = prop.missingValues;
28
+ const scoreInput = ui.input.float('Default score', { value: (mv === null || mv === void 0 ? void 0 : mv.strategy) === 'default' ? mv.score : 0, min: 0, max: 1, format: '#0.000',
29
+ onValueChanged: (v) => {
30
+ prop.missingValues = { strategy: 'default', score: v };
31
+ this.onUpdate({ missingValues: prop.missingValues });
32
+ }, });
33
+ scoreInput.root.style.display = (mv === null || mv === void 0 ? void 0 : mv.strategy) === 'default' ? '' : 'none';
34
+ const choiceInput = ui.input.choice('If missing', {
35
+ items: ['Exclude row', 'Use default score', 'Skip property'],
36
+ value: DesirabilityModeDialog.strategyToLabel(mv === null || mv === void 0 ? void 0 : mv.strategy),
37
+ onValueChanged: (v) => {
38
+ var _a;
39
+ const use = v === 'Use default score';
40
+ if (v === 'Skip property')
41
+ prop.missingValues = { strategy: 'skip' };
42
+ else if (use)
43
+ prop.missingValues = { strategy: 'default', score: (_a = scoreInput.value) !== null && _a !== void 0 ? _a : 0 };
44
+ else
45
+ prop.missingValues = { strategy: 'exclude' };
46
+ scoreInput.root.style.display = use ? '' : 'none';
47
+ this.onUpdate({ missingValues: prop.missingValues });
48
+ },
49
+ });
50
+ choiceInput.setTooltip('How to handle missing values:<br>' +
51
+ '• <b>Exclude row</b> — assign an MPO score of 0 to the row<br>' +
52
+ '• <b>Use default score</b> — use a fixed fallback desirability value<br>' +
53
+ '• <b>Skip property</b> — calculate the score from the remaining properties');
54
+ scoreInput.setTooltip('Desirability score (0–1) to use as fallback.');
55
+ return ui.form([choiceInput, scoreInput]);
56
+ }
57
+ show() {
58
+ const original = structuredClone(this.prop);
59
+ const dialog = ui.dialog({
60
+ title: this.propertyName,
61
+ });
62
+ dialog.root.classList.add('statistics-mpo-desirability-dialog');
63
+ const contentPanel = ui.divV([]);
64
+ const cached = { [original.functionType]: structuredClone(original) };
65
+ const subs = [];
66
+ let modeInputRoot;
67
+ const typeInput = ui.input.choice('Type', { items: [...PROPERTY_TYPES], value: this.prop.functionType, onValueChanged: (v) => {
68
+ var _a;
69
+ if (v === this.prop.functionType)
70
+ return;
71
+ cached[this.prop.functionType] = structuredClone(this.prop);
72
+ if (cached[v])
73
+ this.prop = structuredClone(cached[v]);
74
+ else if (v === 'categorical') {
75
+ const cats = ((_a = this.mappedCol) === null || _a === void 0 ? void 0 : _a.isCategorical) ?
76
+ this.mappedCol.categories.map((c) => ({ name: c, desirability: 1 })) : undefined;
77
+ this.prop = createDefaultCategorical(original.weight, cats);
78
+ }
79
+ else
80
+ this.prop = createDefaultNumerical(original.weight);
81
+ buildContent();
82
+ } });
83
+ const buildNumericalContent = () => {
84
+ var _a, _b, _c;
85
+ const prop = this.prop;
86
+ (_a = prop.mode) !== null && _a !== void 0 ? _a : (prop.mode = 'freeform');
87
+ const previewEditor = new MpoDesirabilityLineEditor(prop, 355, 103);
88
+ if ((_b = this.mappedCol) === null || _b === void 0 ? void 0 : _b.isNumerical)
89
+ previewEditor.setColumn(this.mappedCol);
90
+ const modeInput = ui.input.choice('Mode', { items: DESIRABILITY_MODES, value: prop.mode, onValueChanged: (v) => {
91
+ prop.mode = v;
92
+ this.onUpdate({ mode: prop.mode });
93
+ updateParams();
94
+ previewEditor.redrawAll(false);
95
+ } });
96
+ const configs = [
97
+ { key: 'min', label: 'Min', fallback: () => previewEditor.getMinX() },
98
+ { key: 'max', label: 'Max', fallback: () => previewEditor.getMaxX() },
99
+ { key: 'mean', label: 'Mean', fallback: () => previewEditor.getDefaultMean() },
100
+ { key: 'sigma', label: 'Sigma', fallback: () => previewEditor.getDefaultSigma(), transform: (v) => Math.max(0.01, v) },
101
+ { key: 'x0', label: 'x0', fallback: () => previewEditor.getDefaultX0() },
102
+ { key: 'k', label: 'k', fallback: () => previewEditor.getDefaultK(), transform: (v) => Math.max(0.1, v) },
103
+ ];
104
+ const inputs = new Map();
105
+ for (const cfg of configs) {
106
+ inputs.set(cfg.key, ui.input.float(cfg.label, { value: (_c = prop[cfg.key]) !== null && _c !== void 0 ? _c : cfg.fallback(), format: '#0.000', onValueChanged: (v) => {
107
+ const value = cfg.transform ? cfg.transform(v !== null && v !== void 0 ? v : cfg.fallback()) : (v !== null && v !== void 0 ? v : cfg.fallback());
108
+ prop[cfg.key] = value;
109
+ this.onUpdate({ [cfg.key]: value });
110
+ previewEditor.redrawAll(false);
111
+ } }));
112
+ }
113
+ const syncInputs = () => {
114
+ var _a;
115
+ for (const cfg of configs)
116
+ inputs.get(cfg.key).value = (_a = prop[cfg.key]) !== null && _a !== void 0 ? _a : cfg.fallback();
117
+ };
118
+ inputs.get('min').setTooltip('Minimum property value');
119
+ inputs.get('max').setTooltip('Maximum property value');
120
+ const paramForm = ui.form([
121
+ inputs.get('min'), inputs.get('max'),
122
+ inputs.get('mean'), inputs.get('sigma'),
123
+ inputs.get('x0'), inputs.get('k'),
124
+ ]);
125
+ paramForm.classList.add('statistics-mpo-param-grid');
126
+ const updateParams = () => {
127
+ inputs.get('mean').root.classList.toggle('statistics-mpo-hidden', prop.mode !== 'gaussian');
128
+ inputs.get('sigma').root.classList.toggle('statistics-mpo-hidden', prop.mode !== 'gaussian');
129
+ inputs.get('x0').root.classList.toggle('statistics-mpo-hidden', prop.mode !== 'sigmoid');
130
+ inputs.get('k').root.classList.toggle('statistics-mpo-hidden', prop.mode !== 'sigmoid');
131
+ };
132
+ updateParams();
133
+ previewEditor.onParamsChanged = (p) => {
134
+ Object.assign(prop, p);
135
+ syncInputs();
136
+ this.onUpdate(p);
137
+ };
138
+ subs.push(previewEditor.onChanged.subscribe((line) => {
139
+ prop.line = line;
140
+ if (prop.mode === 'freeform')
141
+ this.onUpdate({ line });
142
+ }));
143
+ modeInputRoot = modeInput.root;
144
+ previewEditor.root.classList.add('statistics-mpo-plot');
145
+ contentPanel.append(previewEditor.root, sectionHeader('PARAMETERS'), paramForm);
146
+ };
147
+ const buildCategoricalContent = () => {
148
+ var _a;
149
+ const prop = this.prop;
150
+ const catEditor = new MpoCategoricalEditor(prop, true, true);
151
+ if ((_a = this.mappedCol) === null || _a === void 0 ? void 0 : _a.isCategorical)
152
+ catEditor.setChoices([...this.mappedCol.categories]);
153
+ subs.push(catEditor.onChanged.subscribe(() => this.onUpdate(this.prop)));
154
+ contentPanel.append(sectionHeader('CATEGORIES'), catEditor.root);
155
+ };
156
+ const dispose = () => {
157
+ for (const s of subs)
158
+ s.unsubscribe();
159
+ subs.length = 0;
160
+ };
161
+ const buildContent = () => {
162
+ dispose();
163
+ ui.empty(contentPanel);
164
+ modeInputRoot = undefined;
165
+ if (isNumerical(this.prop))
166
+ buildNumericalContent();
167
+ else
168
+ buildCategoricalContent();
169
+ const headerItems = [];
170
+ if (!this.mappedCol)
171
+ headerItems.push(typeInput.root);
172
+ if (modeInputRoot)
173
+ headerItems.push(modeInputRoot);
174
+ if (headerItems.length > 0)
175
+ contentPanel.prepend(ui.divH(headerItems, 'statistics-mpo-dialog-header-row'));
176
+ contentPanel.append(sectionHeader('MISSING VALUES'), this.buildDefaultScoreInput(this.prop));
177
+ };
178
+ buildContent();
179
+ dialog.add(contentPanel);
180
+ dialog.onOK(() => {
181
+ var _a;
182
+ dispose();
183
+ if (this.prop.functionType !== original.functionType)
184
+ (_a = this.onTypeChanged) === null || _a === void 0 ? void 0 : _a.call(this, this.prop);
185
+ else
186
+ this.onUpdate(this.prop);
187
+ dialog.close();
188
+ });
189
+ dialog.onCancel(() => {
190
+ dispose();
191
+ this.prop = original;
192
+ this.onUpdate(original);
193
+ dialog.close();
194
+ });
195
+ dialog.show();
196
+ }
197
+ }
198
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVzaXJhYmlsaXR5LW1vZGUtZGlhbG9nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiZGVzaXJhYmlsaXR5LW1vZGUtZGlhbG9nLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLDRCQUE0QjtBQUM1QixPQUFPLEtBQUssRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBSXRDLE9BQU8sRUFFTCx3QkFBd0IsRUFBRSxzQkFBc0IsRUFBRSxXQUFXLEdBQzlELE1BQU0sUUFBUSxDQUFDO0FBQ2hCLE9BQU8sRUFBQyx5QkFBeUIsRUFBQyxNQUFNLDRCQUE0QixDQUFDO0FBQ3JFLE9BQU8sRUFBQyxvQkFBb0IsRUFBQyxNQUFNLG1DQUFtQyxDQUFDO0FBRXZFLE1BQU0sa0JBQWtCLEdBQXVCLENBQUMsVUFBVSxFQUFFLFVBQVUsRUFBRSxTQUFTLENBQUMsQ0FBQztBQUNuRixNQUFNLGNBQWMsR0FBRyxDQUFDLFdBQVcsRUFBRSxhQUFhLENBQVUsQ0FBQztBQVM3RCxTQUFTLGFBQWEsQ0FBQyxJQUFZO0lBQ2pDLE9BQU8sRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsK0JBQStCLENBQUMsQ0FBQztBQUMzRCxDQUFDO0FBRUQsTUFBTSxPQUFPLHNCQUFzQjtJQUNqQyxZQUNVLFlBQW9CLEVBQ3BCLElBQTBCLEVBQzFCLFFBQXdELEVBQ3hELGFBQXVELEVBQ3ZELFNBQTRCO1FBSjVCLGlCQUFZLEdBQVosWUFBWSxDQUFRO1FBQ3BCLFNBQUksR0FBSixJQUFJLENBQXNCO1FBQzFCLGFBQVEsR0FBUixRQUFRLENBQWdEO1FBQ3hELGtCQUFhLEdBQWIsYUFBYSxDQUEwQztRQUN2RCxjQUFTLEdBQVQsU0FBUyxDQUFtQjtJQUNuQyxDQUFDO0lBRUksTUFBTSxDQUFDLGVBQWUsQ0FBQyxRQUFpQjtRQUM5QyxRQUFRLFFBQVEsRUFBRTtZQUNsQixLQUFLLFNBQVMsQ0FBQyxDQUFDLE9BQU8sbUJBQW1CLENBQUM7WUFDM0MsS0FBSyxNQUFNLENBQUMsQ0FB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RSxJQUFJLENBQUMsc0JBQXNCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDL0YsQ0FBQyxDQUFDO1FBRUYsWUFBWSxFQUFFLENBQUM7UUFFZixNQUFNLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBRXpCLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFOztZQUNmLE9BQU8sRUFBRSxDQUFDO1lBQ1YsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksS0FBSyxRQUFRLENBQUMsWUFBWTtnQkFDbEQsTUFBQSxJQUFJLENBQUMsYUFBYSxxREFBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7O2dCQUVoQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUMzQixNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDakIsQ0FBQyxDQUFDLENBQUM7UUFFSCxNQUFNLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRTtZQUNuQixPQUFPLEVBQUUsQ0FBQztZQUNWLElBQUksQ0FBQyxJQUFJLEdBQUcsUUFBUSxDQUFDO1lBQ3JCLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDeEIsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ2pCLENBQUMsQ0FBQyxDQUFDO1FBRUgsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ2hCLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4gKi9cbmltcG9ydCAqIGFzIHVpIGZyb20gJ2RhdGFncm9rLWFwaS91aSc7XG5pbXBvcnQgKiBhcyBERyBmcm9tICdkYXRhZ3Jvay1hcGkvZGcnO1xuXG5pbXBvcnQge1N1YnNjcmlwdGlvbn0gZnJvbSAncnhqcyc7XG5pbXBvcnQge1xuICBQcm9wZXJ0eURlc2lyYWJpbGl0eSwgTnVtZXJpY2FsRGVzaXJhYmlsaXR5LCBDYXRlZ29yaWNhbERlc2lyYWJpbGl0eSwgRGVzaXJhYmlsaXR5TW9kZSxcbiAgY3JlYXRlRGVmYXVsdENhdGVnb3JpY2FsLCBjcmVhdGVEZWZhdWx0TnVtZXJpY2FsLCBpc051bWVyaWNhbCxcbn0gZnJvbSAnLi4vbXBvJztcbmltcG9ydCB7TXBvRGVzaXJhYmlsaXR5TGluZUVkaXRvcn0gZnJvbSAnLi4vZWRpdG9ycy9tcG8tbGluZS1lZGl0b3InO1xuaW1wb3J0IHtNcG9DYXRlZ29yaWNhbEVkaXRvcn0gZnJvbSAnLi4vZWRpdG9ycy9tcG8tY2F0ZWdvcmljYWwtZWRpdG9yJztcblxuY29uc3QgREVTSVJBQklMSVRZX01PREVTOiBEZXNpcmFiaWxpdHlNb2RlW10gPSBbJ2ZyZWVmb3JtJywgJ2dhdXNzaWFuJywgJ3NpZ21vaWQnXTtcbmNvbnN0IFBST1BFUlRZX1RZUEVTID0gWydudW1lcmljYWwnLCAnY2F0ZWdvcmljYWwnXSBhcyBjb25zdDtcblxudHlwZSBQYXJhbUNvbmZpZyA9IHtcbiAga2V5OiAnbWluJyB8ICdtYXgnIHwgJ21lYW4nIHwgJ3NpZ21hJyB8ICd4MCcgfCAnayc7XG4gIGxhYmVsOiBzdHJpbmc7XG4gIGZhbGxiYWNrOiAoKSA9PiBudW1iZXI7XG4gIHRyYW5zZm9ybT86ICh2OiBudW1iZXIpID0+IG51bWJlcjtcbn07XG5cbmZ1bmN0aW9uIHNlY3Rpb25IZWFkZXIodGV4dDogc3RyaW5nKTogSFRNTEVsZW1lbnQge1xuICByZXR1cm4gdWkuZGl2VGV4dCh0ZXh0LCAnc3RhdGlzdGljcy1tcG8tc2VjdGlvbi1oZWFkZXInKTtcbn1cblxuZXhwb3J0IGNsYXNzIERlc2lyYWJpbGl0eU1vZGVEaWFsb2cge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHByb3BlcnR5TmFtZTogc3RyaW5nLFxuICAgIHByaXZhdGUgcHJvcDogUHJvcGVydHlEZXNpcmFiaWxpdHksXG4gICAgcHJpdmF0ZSBvblVwZGF0ZTogKHBhdGNoOiBQYXJ0aWFsPFByb3BlcnR5RGVzaXJhYmlsaXR5PikgPT4gdm9pZCxcbiAgICBwcml2YXRlIG9uVHlwZUNoYW5nZWQ/OiAobmV3UHJvcDogUHJvcGVydHlEZXNpcmFiaWxpdHkpID0+IHZvaWQsXG4gICAgcHJpdmF0ZSBtYXBwZWRDb2w/OiBERy5Db2x1bW4gfCBudWxsLFxuICApIHt9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgc3RyYXRlZ3lUb0xhYmVsKHN0cmF0ZWd5Pzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBzd2l0Y2ggKHN0cmF0ZWd5KSB7XG4gICAgY2FzZSAnZGVmYXVsdCc6IHJldHVybiAnVXNlIGRlZmF1bHQgc2NvcmUnO1xuICAgIGNhc2UgJ3NraXAnOiByZXR1cm4gJ1NraXAgcHJvcGVydHknO1xuICAgIGRlZmF1bHQ6IHJldHVybiAnRXhjbHVkZSByb3cnO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYnVpbGREZWZhdWx0U2NvcmVJbnB1dChwcm9wOiBQcm9wZXJ0eURlc2lyYWJpbGl0eSk6IEhUTUxFbGVtZW50IHtcbiAgICBjb25zdCBtdiA9IHByb3AubWlzc2luZ1ZhbHVlcztcbiAgICBjb25zdCBzY29yZUlucHV0ID0gdWkuaW5wdXQuZmxvYXQoJ0RlZmF1bHQgc2NvcmUnLCB7dmFsdWU6IG12Py5zdHJhdGVneSA9PT0gJ2RlZmF1bHQnID8gbXYuc2NvcmUgOiAwLCBtaW46IDAsIG1heDogMSwgZm9ybWF0OiAnIzAuMDAwJyxcbiAgICAgIG9uVmFsdWVDaGFuZ2VkOiAodikgPT4ge1xuICAgICAgICBwcm9wLm1pc3NpbmdWYWx1ZXMgPSB7c3RyYXRlZ3k6ICdkZWZhdWx0Jywgc2NvcmU6IHZ9O1xuICAgICAgICB0aGlzLm9uVXBkYXRlKHttaXNzaW5nVmFsdWVzOiBwcm9wLm1pc3NpbmdWYWx1ZXN9KTtcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgc2NvcmVJbnB1dC5yb290LnN0eWxlLmRpc3BsYXkgPSBtdj8uc3RyYXRlZ3kgPT09ICdkZWZhdWx0JyA/ICcnIDogJ25vbmUnO1xuXG4gICAgY29uc3QgY2hvaWNlSW5wdXQgPSB1aS5pbnB1dC5jaG9pY2UoJ0lmIG1pc3NpbmcnLCB7XG4gICAgICBpdGVtczogWydFeGNsdWRlIHJvdycsICdVc2UgZGVmYXVsdCBzY29yZScsICdTa2lwIHByb3BlcnR5J10sXG4gICAgICB2YWx1ZTogRGVzaXJhYmlsaXR5TW9kZURpYWxvZy5zdHJhdGVneVRvTGFiZWwobXY/LnN0cmF0ZWd5KSxcbiAgICAgIG9uVmFsdWVDaGFuZ2VkOiAodikgPT4ge1xuICAgICAgICBjb25zdCB1c2UgPSB2ID09PSAnVXNlIGRlZmF1bHQgc2NvcmUnO1xuICAgICAgICBpZiAodiA9PT0gJ1NraXAgcHJvcGVydHknKVxuICAgICAgICAgIHByb3AubWlzc2luZ1ZhbHVlcyA9IHtzdHJhdGVneTogJ3NraXAnfTtcbiAgICAgICAgZWxzZSBpZiAodXNlKVxuICAgICAgICAgIHByb3AubWlzc2luZ1ZhbHVlcyA9IHtzdHJhdGVneTogJ2RlZmF1bHQnLCBzY29yZTogc2NvcmVJbnB1dC52YWx1ZSA/PyAwfTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgIHByb3AubWlzc2luZ1ZhbHVlcyA9IHtzdHJhdGVneTogJ2V4Y2x1ZGUnfTtcbiAgICAgICAgc2NvcmVJbnB1dC5yb290LnN0eWxlLmRpc3BsYXkgPSB1c2UgPyAnJyA6ICdub25lJztcbiAgICAgICAgdGhpcy5vblVwZGF0ZSh7bWlzc2luZ1ZhbHVlczogcHJvcC5taXNzaW5nVmFsdWVzfSBhcyBhbnkpO1xuICAgICAgfSxcbiAgICB9KTtcbiAgICBjaG9pY2VJbnB1dC5zZXRUb29sdGlwKFxuICAgICAgJ0hvdyB0byBoYW5kbGUgbWlzc2luZyB2YWx1ZXM6PGJyPicgK1xuICAgICAgJ+KAoiA8Yj5FeGNsdWRlIHJvdzwvYj4g4oCUIGFzc2lnbiBhbiBNUE8gc2NvcmUgb2YgMCB0byB0aGUgcm93PGJyPicgK1xuICAgICAgJ+KAoiA8Yj5Vc2UgZGVmYXVsdCBzY29yZTwvYj4g4oCUIHVzZSBhIGZpeGVkIGZhbGxiYWNrIGRlc2lyYWJpbGl0eSB2YWx1ZTxicj4nICtcbiAgICAgICfigKIgPGI+U2tpcCBwcm9wZXJ0eTwvYj4g4oCUIGNhbGN1bGF0ZSB0aGUgc2NvcmUgZnJvbSB0aGUgcmVtYWluaW5nIHByb3BlcnRpZXMnLFxuICAgICk7XG4gICAgc2NvcmVJbnB1dC5zZXRUb29sdGlwKCdEZXNpcmFiaWxpdHkgc2NvcmUgKDDigJMxKSB0byB1c2UgYXMgZmFsbGJhY2suJyk7XG4gICAgcmV0dXJuIHVpLmZvcm0oW2Nob2ljZUlucHV0LCBzY29yZUlucHV0XSk7XG4gIH1cblxuICBzaG93KCk6IHZvaWQge1xuICAgIGNvbnN0IG9yaWdpbmFsID0gc3RydWN0dXJlZENsb25lKHRoaXMucHJvcCk7XG5cbiAgICBjb25zdCBkaWFsb2cgPSB1aS5kaWFsb2coe1xuICAgICAgdGl0bGU6IHRoaXMucHJvcGVydHlOYW1lLFxuICAgIH0pO1xuICAgIGRpYWxvZy5yb290LmNsYXNzTGlzdC5hZGQoJ3N0YXRpc3RpY3MtbXBvLWRlc2lyYWJpbGl0eS1kaWFsb2cnKTtcblxuICAgIGNvbnN0IGNvbnRlbnRQYW5lbCA9IHVpLmRpdlYoW10pO1xuICAgIGNvbnN0IGNhY2hlZDogUmVjb3JkPHN0cmluZywgUHJvcGVydHlEZXNpcmFiaWxpdHk+ID0ge1tvcmlnaW5hbC5mdW5jdGlvblR5cGVdOiBzdHJ1Y3R1cmVkQ2xvbmUob3JpZ2luYWwpfTtcbiAgICBjb25zdCBzdWJzOiBTdWJzY3JpcHRpb25bXSA9IFtdO1xuXG4gICAgbGV0IG1vZGVJbnB1dFJvb3Q6IEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkO1xuXG4gICAgY29uc3QgdHlwZUlucHV0ID0gdWkuaW5wdXQuY2hvaWNlKCdUeXBlJywge2l0ZW1zOiBbLi4uUFJPUEVSVFlfVFlQRVNdLCB2YWx1ZTogdGhpcy5wcm9wLmZ1bmN0aW9uVHlwZSwgb25WYWx1ZUNoYW5nZWQ6ICh2KSA9PiB7XG4gICAgICBpZiAodiA9PT0gdGhpcy5wcm9wLmZ1bmN0aW9uVHlwZSlcbiAgICAgICAgcmV0dXJuO1xuXG4gICAgICBjYWNoZWRbdGhpcy5wcm9wLmZ1bmN0aW9uVHlwZV0gPSBzdHJ1Y3R1cmVkQ2xvbmUodGhpcy5wcm9wKTtcblxuICAgICAgaWYgKGNhY2hlZFt2XSlcbiAgICAgICAgdGhpcy5wcm9wID0gc3RydWN0dXJlZENsb25lKGNhY2hlZFt2XSk7XG4gICAgICBlbHNlIGlmICh2ID09PSAnY2F0ZWdvcmljYWwnKSB7XG4gICAgICAgIGNvbnN0IGNhdHMgPSB0aGlzLm1hcHBlZENvbD8uaXNDYXRlZ29yaWNhbCA/XG4gICAgICAgICAgdGhpcy5tYXBwZWRDb2wuY2F0ZWdvcmllcy5tYXAoKGM6IHN0cmluZykgPT4gKHtuYW1lOiBjLCBkZXNpcmFiaWxpdHk6IDF9KSkgOiB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMucHJvcCA9IGNyZWF0ZURlZmF1bHRDYXRlZ29yaWNhbChvcmlnaW5hbC53ZWlnaHQsIGNhdHMpO1xuICAgICAgfVxuICAgICAgZWxzZVxuICAgICAgICB0aGlzLnByb3AgPSBjcmVhdGVEZWZhdWx0TnVtZXJpY2FsKG9yaWdpbmFsLndlaWdodCk7XG5cbiAgICAgIGJ1aWxkQ29udGVudCgpO1xuICAgIH19KTtcblxuICAgIGNvbnN0IGJ1aWxkTnVtZXJpY2FsQ29udGVudCA9ICgpID0+IHtcbiAgICAgIGNvbnN0IHByb3AgPSB0aGlzLnByb3AgYXMgTnVtZXJpY2FsRGVzaXJhYmlsaXR5O1xuICAgICAgcHJvcC5tb2RlID8/PSAnZnJlZWZvcm0nO1xuXG4gICAgICBjb25zdCBwcmV2aWV3RWRpdG9yID0gbmV3IE1wb0Rlc2lyYWJpbGl0eUxpbmVFZGl0b3IocHJvcCwgMzU1LCAxMDMpO1xuICAgICAgaWYgKHRoaXMubWFwcGVkQ29sPy5pc051bWVyaWNhbClcbiAgICAgICAgcHJldmlld0VkaXRvci5zZXRDb2x1bW4odGhpcy5tYXBwZWRDb2wpO1xuXG4gICAgICBjb25zdCBtb2RlSW5wdXQgPSB1aS5pbnB1dC5jaG9pY2UoJ01vZGUnLCB7aXRlbXM6IERFU0lSQUJJTElUWV9NT0RFUywgdmFsdWU6IHByb3AubW9kZSwgb25WYWx1ZUNoYW5nZWQ6ICh2KSA9PiB7XG4gICAgICAgIHByb3AubW9kZSA9IHYgYXMgRGVzaXJhYmlsaXR5TW9kZTtcbiAgICAgICAgdGhpcy5vblVwZGF0ZSh7bW9kZTogcHJvcC5tb2RlfSBhcyBhbnkpO1xuICAgICAgICB1cGRhdGVQYXJhbXMoKTtcbiAgICAgICAgcHJldmlld0VkaXRvci5yZWRyYXdBbGwoZmFsc2UpO1xuICAgICAgfX0pO1xuXG4gICAgICBjb25zdCBjb25maWdzOiBQYXJhbUNvbmZpZ1tdID0gW1xuICAgICAgICB7a2V5OiAnbWluJywgbGFiZWw6ICdNaW4nLCBmYWxsYmFjazogKCkgPT4gcHJldmlld0VkaXRvci5nZXRNaW5YKCl9LFxuICAgICAgICB7a2V5OiAnbWF4JywgbGFiZWw6ICdNYXgnLCBmYWxsYmFjazogKCkgPT4gcHJldmlld0VkaXRvci5nZXRNYXhYKCl9LFxuICAgICAgICB7a2V5OiAnbWVhbicsIGxhYmVsOiAnTWVhbicsIGZhbGxiYWNrOiAoKSA9PiBwcmV2aWV3RWRpdG9yLmdldERlZmF1bHRNZWFuKCl9LFxuICAgICAgICB7a2V5OiAnc2lnbWEnLCBsYWJlbDogJ1NpZ21hJywgZmFsbGJhY2s6ICgpID0+IHByZXZpZXdFZGl0b3IuZ2V0RGVmYXVsdFNpZ21hKCksIHRyYW5zZm9ybTogKHYpID0+IE1hdGgubWF4KDAuMDEsIHYpfSxcbiAgICAgICAge2tleTogJ3gwJywgbGFiZWw6ICd4MCcsIGZhbGxiYWNrOiAoKSA9PiBwcmV2aWV3RWRpdG9yLmdldERlZmF1bHRYMCgpfSxcbiAgICAgICAge2tleTogJ2snLCBsYWJlbDogJ2snLCBmYWxsYmFjazogKCkgPT4gcHJldmlld0VkaXRvci5nZXREZWZhdWx0SygpLCB0cmFuc2Zvcm06ICh2KSA9PiBNYXRoLm1heCgwLjEsIHYpfSxcbiAgICAgIF07XG5cbiAgICAgIGNvbnN0IGlucHV0cyA9IG5ldyBNYXA8c3RyaW5nLCBERy5JbnB1dEJhc2U+KCk7XG4gICAgICBmb3IgKGNvbnN0IGNmZyBvZiBjb25maWdzKSB7XG4gICAgICAgIGlucHV0cy5zZXQoY2ZnLmtleSwgdWkuaW5wdXQuZmxvYXQoY2ZnLmxhYmVsLCB7dmFsdWU6IHByb3BbY2ZnLmtleV0gPz8gY2ZnLmZhbGxiYWNrKCksIGZvcm1hdDogJyMwLjAwMCcsIG9uVmFsdWVDaGFuZ2VkOiAodikgPT4ge1xuICAgICAgICAgIGNvbnN0IHZhbHVlID0gY2ZnLnRyYW5zZm9ybSA/IGNmZy50cmFuc2Zvcm0odiA/PyBjZmcuZmFsbGJhY2soKSkgOiAodiA/PyBjZmcuZmFsbGJhY2soKSk7XG4gICAgICAgICAgcHJvcFtjZmcua2V5XSA9IHZhbHVlO1xuICAgICAgICAgIHRoaXMub25VcGRhdGUoe1tjZmcua2V5XTogdmFsdWV9IGFzIGFueSk7XG4gICAgICAgICAgcHJldmlld0VkaXRvci5yZWRyYXdBbGwoZmFsc2UpO1xuICAgICAgICB9fSkpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBzeW5jSW5wdXRzID0gKCkgPT4ge1xuICAgICAgICBmb3IgKGNvbnN0IGNmZyBvZiBjb25maWdzKVxuICAgICAgICAgIGlucHV0cy5nZXQoY2ZnLmtleSkhLnZhbHVlID0gcHJvcFtjZmcua2V5XSA/PyBjZmcuZmFsbGJhY2soKTtcbiAgICAgIH07XG5cbiAgICAgIGlucHV0cy5nZXQoJ21pbicpIS5zZXRUb29sdGlwKCdNaW5pbXVtIHByb3BlcnR5IHZhbHVlJyk7XG4gICAgICBpbnB1dHMuZ2V0KCdtYXgnKSEuc2V0VG9vbHRpcCgnTWF4aW11bSBwcm9wZXJ0eSB2YWx1ZScpO1xuXG4gICAgICBjb25zdCBwYXJhbUZvcm0gPSB1aS5mb3JtKFtcbiAgICAgICAgaW5wdXRzLmdldCgnbWluJykhLCBpbnB1dHMuZ2V0KCdtYXgnKSEsXG4gICAgICAgIGlucHV0cy5nZXQoJ21lYW4nKSEsIGlucHV0cy5nZXQoJ3NpZ21hJykhLFxuICAgICAgICBpbnB1dHMuZ2V0KCd4MCcpISwgaW5wdXRzLmdldCgnaycpISxcbiAgICAgIF0pO1xuICAgICAgcGFyYW1Gb3JtLmNsYXNzTGlzdC5hZGQoJ3N0YXRpc3RpY3MtbXBvLXBhcmFtLWdyaWQnKTtcblxuICAgICAgY29uc3QgdXBkYXRlUGFyYW1zID0gKCkgPT4ge1xuICAgICAgICBpbnB1dHMuZ2V0KCdtZWFuJykhLnJvb3QuY2xhc3NMaXN0LnRvZ2dsZSgnc3RhdGlzdGljcy1tcG8taGlkZGVuJywgcHJvcC5tb2RlICE9PSAnZ2F1c3NpYW4nKTtcbiAgICAgICAgaW5wdXRzLmdldCgnc2lnbWEnKSEucm9vdC5jbGFzc0xpc3QudG9nZ2xlKCdzdGF0aXN0aWNzLW1wby1oaWRkZW4nLCBwcm9wLm1vZGUgIT09ICdnYXVzc2lhbicpO1xuICAgICAgICBpbnB1dHMuZ2V0KCd4MCcpIS5yb290LmNsYXNzTGlzdC50b2dnbGUoJ3N0YXRpc3RpY3MtbXBvLWhpZGRlbicsIHByb3AubW9kZSAhPT0gJ3NpZ21vaWQnKTtcbiAgICAgICAgaW5wdXRzLmdldCgnaycpIS5yb290LmNsYXNzTGlzdC50b2dnbGUoJ3N0YXRpc3RpY3MtbXBvLWhpZGRlbicsIHByb3AubW9kZSAhPT0gJ3NpZ21vaWQnKTtcbiAgICAgIH07XG5cbiAgICAgIHVwZGF0ZVBhcmFtcygpO1xuXG4gICAgICBwcmV2aWV3RWRpdG9yLm9uUGFyYW1zQ2hhbmdlZCA9IChwKSA9PiB7XG4gICAgICAgIE9iamVjdC5hc3NpZ24ocHJvcCwgcCk7XG4gICAgICAgIHN5bmNJbnB1dHMoKTtcbiAgICAgICAgdGhpcy5vblVwZGF0ZShwIGFzIGFueSk7XG4gICAgICB9O1xuXG4gICAgICBzdWJzLnB1c2gocHJldmlld0VkaXRvci5vbkNoYW5nZWQuc3Vic2NyaWJlKChsaW5lKSA9PiB7XG4gICAgICAgIHByb3AubGluZSA9IGxpbmU7XG4gICAgICAgIGlmIChwcm9wLm1vZGUgPT09ICdmcmVlZm9ybScpXG4gICAgICAgICAgdGhpcy5vblVwZGF0ZSh7bGluZX0gYXMgYW55KTtcbiAgICAgIH0pKTtcblxuICAgICAgbW9kZUlucHV0Um9vdCA9IG1vZGVJbnB1dC5yb290O1xuICAgICAgcHJldmlld0VkaXRvci5yb290LmNsYXNzTGlzdC5hZGQoJ3N0YXRpc3RpY3MtbXBvLXBsb3QnKTtcbiAgICAgIGNvbnRlbnRQYW5lbC5hcHBlbmQocHJldmlld0VkaXRvci5yb290LCBzZWN0aW9uSGVhZGVyKCdQQVJBTUVURVJTJyksIHBhcmFtRm9ybSk7XG4gICAgfTtcblxuICAgIGNvbnN0IGJ1aWxkQ2F0ZWdvcmljYWxDb250ZW50ID0gKCkgPT4ge1xuICAgICAgY29uc3QgcHJvcCA9IHRoaXMucHJvcCBhcyBDYXRlZ29yaWNhbERlc2lyYWJpbGl0eTtcbiAgICAgIGNvbnN0IGNhdEVkaXRvciA9IG5ldyBNcG9DYXRlZ29yaWNhbEVkaXRvcihwcm9wLCB0cnVlLCB0cnVlKTtcbiAgICAgIGlmICh0aGlzLm1hcHBlZENvbD8uaXNDYXRlZ29yaWNhbClcbiAgICAgICAgY2F0RWRpdG9yLnNldENob2ljZXMoWy4uLnRoaXMubWFwcGVkQ29sLmNhdGVnb3JpZXNdKTtcbiAgICAgIHN1YnMucHVzaChjYXRFZGl0b3Iub25DaGFuZ2VkLnN1YnNjcmliZSgoKSA9PiB0aGlzLm9uVXBkYXRlKHRoaXMucHJvcCkpKTtcbiAgICAgIGNvbnRlbnRQYW5lbC5hcHBlbmQoc2VjdGlvbkhlYWRlcignQ0FURUdPUklFUycpLCBjYXRFZGl0b3Iucm9vdCk7XG4gICAgfTtcblxuICAgIGNvbnN0IGRpc3Bvc2UgPSAoKSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IHMgb2Ygc3VicylcbiAgICAgICAgcy51bnN1YnNjcmliZSgpO1xuICAgICAgc3Vicy5sZW5ndGggPSAwO1xuICAgIH07XG5cbiAgICBjb25zdCBidWlsZENvbnRlbnQgPSAoKSA9PiB7XG4gICAgICBkaXNwb3NlKCk7XG4gICAgICB1aS5lbXB0eShjb250ZW50UGFuZWwpO1xuICAgICAgbW9kZUlucHV0Um9vdCA9IHVuZGVmaW5lZDtcblxuICAgICAgaWYgKGlzTnVtZXJpY2FsKHRoaXMucHJvcCkpXG4gICAgICAgIGJ1aWxkTnVtZXJpY2FsQ29udGVudCgpO1xuICAgICAgZWxzZVxuICAgICAgICBidWlsZENhdGVnb3JpY2FsQ29udGVudCgpO1xuXG4gICAgICBjb25zdCBoZWFkZXJJdGVtczogSFRNTEVsZW1lbnRbXSA9IFtdO1xuICAgICAgaWYgKCF0aGlzLm1hcHBlZENvbClcbiAgICAgICAgaGVhZGVySXRlbXMucHVzaCh0eXBlSW5wdXQucm9vdCk7XG4gICAgICBpZiAobW9kZUlucHV0Um9vdClcbiAgICAgICAgaGVhZGVySXRlbXMucHVzaChtb2RlSW5wdXRSb290KTtcbiAgICAgIGlmIChoZWFkZXJJdGVtcy5sZW5ndGggPiAwKVxuICAgICAgICBjb250ZW50UGFuZWwucHJlcGVuZCh1aS5kaXZIKGhlYWRlckl0ZW1zLCAnc3RhdGlzdGljcy1tcG8tZGlhbG9nLWhlYWRlci1yb3cnKSk7XG5cbiAgICAgIGNvbnRlbnRQYW5lbC5hcHBlbmQoc2VjdGlvbkhlYWRlcignTUlTU0lORyBWQUxVRVMnKSwgdGhpcy5idWlsZERlZmF1bHRTY29yZUlucHV0KHRoaXMucHJvcCkpO1xuICAgIH07XG5cbiAgICBidWlsZENvbnRlbnQoKTtcblxuICAgIGRpYWxvZy5hZGQoY29udGVudFBhbmVsKTtcblxuICAgIGRpYWxvZy5vbk9LKCgpID0+IHtcbiAgICAgIGRpc3Bvc2UoKTtcbiAgICAgIGlmICh0aGlzLnByb3AuZnVuY3Rpb25UeXBlICE9PSBvcmlnaW5hbC5mdW5jdGlvblR5cGUpXG4gICAgICAgIHRoaXMub25UeXBlQ2hhbmdlZD8uKHRoaXMucHJvcCk7XG4gICAgICBlbHNlXG4gICAgICAgIHRoaXMub25VcGRhdGUodGhpcy5wcm9wKTtcbiAgICAgIGRpYWxvZy5jbG9zZSgpO1xuICAgIH0pO1xuXG4gICAgZGlhbG9nLm9uQ2FuY2VsKCgpID0+IHtcbiAgICAgIGRpc3Bvc2UoKTtcbiAgICAgIHRoaXMucHJvcCA9IG9yaWdpbmFsO1xuICAgICAgdGhpcy5vblVwZGF0ZShvcmlnaW5hbCk7XG4gICAgICBkaWFsb2cuY2xvc2UoKTtcbiAgICB9KTtcblxuICAgIGRpYWxvZy5zaG93KCk7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,15 @@
1
+ import * as DG from 'datagrok-api/dg';
2
+ import { Subject } from 'rxjs';
3
+ import { PropertyDesirability } from '../mpo';
4
+ export interface DesirabilityEditor<T = any> {
5
+ supportsModeDialog: boolean;
6
+ root: HTMLElement;
7
+ onChanged: Subject<T>;
8
+ redrawAll(): void;
9
+ setRange?(min: number, max: number): void;
10
+ setColumn?(col: DG.Column | null): void;
11
+ }
12
+ export declare class DesirabilityEditorFactory {
13
+ static create(prop: PropertyDesirability, width?: number, height?: number, design?: boolean): DesirabilityEditor;
14
+ }
15
+ //# sourceMappingURL=desirability-editor-factory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"desirability-editor-factory.d.ts","sourceRoot":"","sources":["desirability-editor-factory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAEtC,OAAO,EAAC,OAAO,EAAC,MAAM,MAAM,CAAC;AAE7B,OAAO,EAAC,oBAAoB,EAAc,MAAM,QAAQ,CAAC;AAIzD,MAAM,WAAW,kBAAkB,CAAC,CAAC,GAAG,GAAG;IACzC,kBAAkB,EAAE,OAAO,CAAC;IAC5B,IAAI,EAAE,WAAW,CAAC;IAClB,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;IACtB,SAAS,IAAI,IAAI,CAAC;IAClB,QAAQ,CAAC,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1C,SAAS,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,GAAG,IAAI,GAAG,IAAI,CAAC;CACzC;AAED,qBAAa,yBAAyB;IACpC,MAAM,CAAC,MAAM,CACX,IAAI,EAAE,oBAAoB,EAC1B,KAAK,SAAM,EACX,MAAM,SAAK,EACX,MAAM,UAAQ,GACb,kBAAkB;CAMtB"}
@@ -0,0 +1,11 @@
1
+ import { isNumerical } from '../mpo';
2
+ import { MpoCategoricalEditor } from './mpo-categorical-editor';
3
+ import { MpoDesirabilityLineEditor } from './mpo-line-editor';
4
+ export class DesirabilityEditorFactory {
5
+ static create(prop, width = 300, height = 80, design = false) {
6
+ if (isNumerical(prop))
7
+ return new MpoDesirabilityLineEditor(prop, width, height);
8
+ return new MpoCategoricalEditor(prop, design, false);
9
+ }
10
+ }
11
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVzaXJhYmlsaXR5LWVkaXRvci1mYWN0b3J5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiZGVzaXJhYmlsaXR5LWVkaXRvci1mYWN0b3J5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUlBLE9BQU8sRUFBdUIsV0FBVyxFQUFDLE1BQU0sUUFBUSxDQUFDO0FBQ3pELE9BQU8sRUFBQyxvQkFBb0IsRUFBQyxNQUFNLDBCQUEwQixDQUFDO0FBQzlELE9BQU8sRUFBQyx5QkFBeUIsRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBVzVELE1BQU0sT0FBTyx5QkFBeUI7SUFDcEMsTUFBTSxDQUFDLE1BQU0sQ0FDWCxJQUEwQixFQUMxQixLQUFLLEdBQUcsR0FBRyxFQUNYLE1BQU0sR0FBRyxFQUFFLEVBQ1gsTUFBTSxHQUFHLEtBQUs7UUFFZCxJQUFJLFdBQVcsQ0FBQyxJQUFJLENBQUM7WUFDbkIsT0FBTyxJQUFJLHlCQUF5QixDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFFNUQsT0FBTyxJQUFJLG9CQUFvQixDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDdkQsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgREcgZnJvbSAnZGF0YWdyb2stYXBpL2RnJztcblxuaW1wb3J0IHtTdWJqZWN0fSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHtQcm9wZXJ0eURlc2lyYWJpbGl0eSwgaXNOdW1lcmljYWx9IGZyb20gJy4uL21wbyc7XG5pbXBvcnQge01wb0NhdGVnb3JpY2FsRWRpdG9yfSBmcm9tICcuL21wby1jYXRlZ29yaWNhbC1lZGl0b3InO1xuaW1wb3J0IHtNcG9EZXNpcmFiaWxpdHlMaW5lRWRpdG9yfSBmcm9tICcuL21wby1saW5lLWVkaXRvcic7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGVzaXJhYmlsaXR5RWRpdG9yPFQgPSBhbnk+IHtcbiAgc3VwcG9ydHNNb2RlRGlhbG9nOiBib29sZWFuO1xuICByb290OiBIVE1MRWxlbWVudDtcbiAgb25DaGFuZ2VkOiBTdWJqZWN0PFQ+O1xuICByZWRyYXdBbGwoKTogdm9pZDtcbiAgc2V0UmFuZ2U/KG1pbjogbnVtYmVyLCBtYXg6IG51bWJlcik6IHZvaWQ7XG4gIHNldENvbHVtbj8oY29sOiBERy5Db2x1bW4gfCBudWxsKTogdm9pZDtcbn1cblxuZXhwb3J0IGNsYXNzIERlc2lyYWJpbGl0eUVkaXRvckZhY3Rvcnkge1xuICBzdGF0aWMgY3JlYXRlKFxuICAgIHByb3A6IFByb3BlcnR5RGVzaXJhYmlsaXR5LFxuICAgIHdpZHRoID0gMzAwLFxuICAgIGhlaWdodCA9IDgwLFxuICAgIGRlc2lnbiA9IGZhbHNlLFxuICApOiBEZXNpcmFiaWxpdHlFZGl0b3Ige1xuICAgIGlmIChpc051bWVyaWNhbChwcm9wKSlcbiAgICAgIHJldHVybiBuZXcgTXBvRGVzaXJhYmlsaXR5TGluZUVkaXRvcihwcm9wLCB3aWR0aCwgaGVpZ2h0KTtcblxuICAgIHJldHVybiBuZXcgTXBvQ2F0ZWdvcmljYWxFZGl0b3IocHJvcCwgZGVzaWduLCBmYWxzZSk7XG4gIH1cbn1cblxuIl19
@@ -0,0 +1,24 @@
1
+ import * as DG from 'datagrok-api/dg';
2
+ import { Subject } from 'rxjs';
3
+ import { CategoricalDesirability } from '../mpo';
4
+ export declare class MpoCategoricalEditor {
5
+ root: HTMLDivElement;
6
+ onChanged: Subject<CategoricalDesirability>;
7
+ supportsModeDialog: boolean;
8
+ private _prop;
9
+ private design;
10
+ private showControls;
11
+ private desirabilityInputs;
12
+ private form;
13
+ private columnCategories;
14
+ constructor(prop: CategoricalDesirability, design?: boolean, showControls?: boolean);
15
+ private buildForm;
16
+ private createDesirabilityInput;
17
+ private buildViewForm;
18
+ private buildDesignForm;
19
+ private buildCategoryRow;
20
+ redrawAll(notify?: boolean): void;
21
+ setChoices(choices: string[]): void;
22
+ setColumn(col: DG.Column | null): void;
23
+ }
24
+ //# sourceMappingURL=mpo-categorical-editor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mpo-categorical-editor.d.ts","sourceRoot":"","sources":["mpo-categorical-editor.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAEtC,OAAO,EAAC,OAAO,EAAC,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAC,uBAAuB,EAAC,MAAM,QAAQ,CAAC;AAE/C,qBAAa,oBAAoB;IAC/B,IAAI,EAAE,cAAc,CAAC;IACrB,SAAS,mCAA0C;IACnD,kBAAkB,EAAE,OAAO,CAAQ;IAEnC,OAAO,CAAC,KAAK,CAA0B;IACvC,OAAO,CAAC,MAAM,CAAU;IACxB,OAAO,CAAC,YAAY,CAAU;IAC9B,OAAO,CAAC,kBAAkB,CAAsB;IAChD,OAAO,CAAC,IAAI,CAA4B;IACxC,OAAO,CAAC,gBAAgB,CAAyB;gBAErC,IAAI,EAAE,uBAAuB,EAAE,MAAM,UAAQ,EAAE,YAAY,UAAQ;IAQ/E,OAAO,CAAC,SAAS;IAejB,OAAO,CAAC,uBAAuB;IAc/B,OAAO,CAAC,aAAa;IAQrB,OAAO,CAAC,eAAe;IAavB,OAAO,CAAC,gBAAgB;IA0CxB,SAAS,CAAC,MAAM,GAAE,OAAc,GAAG,IAAI;IAMvC,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI;IAKnC,SAAS,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,GAAG,IAAI,GAAG,IAAI;CAYvC"}