@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 +229 -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 +15 -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 +46 -0
- package/src/mpo/editors/mpo-line-editor.d.ts.map +1 -0
- package/src/mpo/editors/mpo-line-editor.js +583 -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 +368 -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
package/src/mpo/mpo.d.ts
CHANGED
|
@@ -1,19 +1,69 @@
|
|
|
1
1
|
import * as DG from 'datagrok-api/dg';
|
|
2
2
|
export type DesirabilityLine = number[][];
|
|
3
|
-
export type
|
|
3
|
+
export type DesirabilityMode = 'freeform' | 'gaussian' | 'sigmoid';
|
|
4
|
+
export type MissingValueConfig = {
|
|
5
|
+
strategy: 'exclude';
|
|
6
|
+
} | {
|
|
7
|
+
strategy: 'default';
|
|
8
|
+
score: number;
|
|
9
|
+
} | {
|
|
10
|
+
strategy: 'skip';
|
|
11
|
+
};
|
|
12
|
+
type BasePropertyDesirability = {
|
|
13
|
+
weight: number;
|
|
14
|
+
weightColumn?: string;
|
|
15
|
+
missingValues?: MissingValueConfig;
|
|
16
|
+
};
|
|
17
|
+
export type NumericalDesirability = BasePropertyDesirability & {
|
|
18
|
+
functionType: 'numerical';
|
|
4
19
|
line: DesirabilityLine;
|
|
5
20
|
min?: number;
|
|
6
21
|
max?: number;
|
|
7
|
-
|
|
22
|
+
mode?: DesirabilityMode;
|
|
23
|
+
mean?: number;
|
|
24
|
+
sigma?: number;
|
|
25
|
+
x0?: number;
|
|
26
|
+
k?: number;
|
|
27
|
+
freeformLine?: DesirabilityLine;
|
|
8
28
|
};
|
|
29
|
+
export type CategoricalDesirability = BasePropertyDesirability & {
|
|
30
|
+
functionType: 'categorical';
|
|
31
|
+
categories: {
|
|
32
|
+
name: string;
|
|
33
|
+
desirability: number;
|
|
34
|
+
}[];
|
|
35
|
+
};
|
|
36
|
+
export type PropertyDesirability = NumericalDesirability | CategoricalDesirability;
|
|
37
|
+
export declare function isNumerical(p: PropertyDesirability): p is NumericalDesirability;
|
|
38
|
+
export declare function createDefaultNumerical(weight?: number, min?: number, max?: number): NumericalDesirability;
|
|
39
|
+
export declare function createDefaultCategorical(weight?: number, categories?: {
|
|
40
|
+
name: string;
|
|
41
|
+
desirability: number;
|
|
42
|
+
}[]): CategoricalDesirability;
|
|
43
|
+
export declare function migrateDesirability(raw: any): PropertyDesirability;
|
|
44
|
+
export declare const DESIRABILITY_PROFILE_TYPE = "MPO Desirability Profile";
|
|
9
45
|
export type DesirabilityProfile = {
|
|
46
|
+
type: typeof DESIRABILITY_PROFILE_TYPE;
|
|
10
47
|
name: string;
|
|
11
48
|
description: string;
|
|
49
|
+
aggregation?: WeightedAggregation;
|
|
12
50
|
properties: {
|
|
13
51
|
[key: string]: PropertyDesirability;
|
|
14
52
|
};
|
|
15
53
|
};
|
|
54
|
+
export declare function isDesirabilityProfile(x: any): x is DesirabilityProfile;
|
|
55
|
+
export declare const WEIGHTED_AGGREGATIONS: readonly ["Average", "Sum", "Product", "Geomean", "Min", "Max"];
|
|
56
|
+
export declare const WEIGHTED_AGGREGATIONS_LIST: WeightedAggregation[];
|
|
57
|
+
export type WeightedAggregation = typeof WEIGHTED_AGGREGATIONS[number];
|
|
58
|
+
export declare const DEFAULT_AGGREGATION: WeightedAggregation;
|
|
16
59
|
export declare function desirabilityScore(x: number, desirabilityLine: DesirabilityLine): number;
|
|
60
|
+
export declare function categoricalDesirabilityScore(value: string, prop: CategoricalDesirability): number | null;
|
|
61
|
+
export type MpoResult = {
|
|
62
|
+
scoreColumn: DG.Column;
|
|
63
|
+
desirabilityColumns?: DG.Column[];
|
|
64
|
+
};
|
|
17
65
|
/** Calculates the multi parameter optimization score, 0-100, 100 is the maximum */
|
|
18
|
-
export declare function mpo(dataFrame: DG.DataFrame, columns: DG.Column[]):
|
|
66
|
+
export declare function mpo(dataFrame: DG.DataFrame, columns: DG.Column[], profileName: string, aggregation: WeightedAggregation, isDifferent?: boolean, createDesirabilityColumns?: boolean): MpoResult;
|
|
67
|
+
export declare function aggregate(scores: number[], weights: number[], aggregation: WeightedAggregation): number;
|
|
68
|
+
export {};
|
|
19
69
|
//# sourceMappingURL=mpo.d.ts.map
|
package/src/mpo/mpo.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mpo.d.ts","sourceRoot":"","sources":["mpo.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAItC,MAAM,MAAM,gBAAgB,GAAG,MAAM,EAAE,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"mpo.d.ts","sourceRoot":"","sources":["mpo.ts"],"names":[],"mappings":"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"}
|
package/src/mpo/mpo.js
CHANGED
|
@@ -1,6 +1,29 @@
|
|
|
1
1
|
/* eslint-disable guard-for-in */
|
|
2
2
|
/* eslint-disable max-len */
|
|
3
3
|
import * as DG from 'datagrok-api/dg';
|
|
4
|
+
export function isNumerical(p) {
|
|
5
|
+
return p.functionType === 'numerical';
|
|
6
|
+
}
|
|
7
|
+
export function createDefaultNumerical(weight = 1, min = 0, max = 1) {
|
|
8
|
+
return { functionType: 'numerical', weight, mode: 'freeform', min, max, line: [] };
|
|
9
|
+
}
|
|
10
|
+
export function createDefaultCategorical(weight = 1, categories) {
|
|
11
|
+
return { functionType: 'categorical', weight, categories: categories !== null && categories !== void 0 ? categories : [{ name: 'Category 1', desirability: 1 }] };
|
|
12
|
+
}
|
|
13
|
+
export function migrateDesirability(raw) {
|
|
14
|
+
if (raw.functionType)
|
|
15
|
+
return raw;
|
|
16
|
+
if (raw.categories)
|
|
17
|
+
return { ...raw, functionType: 'categorical' };
|
|
18
|
+
return { ...raw, functionType: 'numerical' };
|
|
19
|
+
}
|
|
20
|
+
export const DESIRABILITY_PROFILE_TYPE = 'MPO Desirability Profile';
|
|
21
|
+
export function isDesirabilityProfile(x) {
|
|
22
|
+
return x != null && typeof x === 'object' && x.type === DESIRABILITY_PROFILE_TYPE;
|
|
23
|
+
}
|
|
24
|
+
export const WEIGHTED_AGGREGATIONS = ['Average', 'Sum', 'Product', 'Geomean', 'Min', 'Max'];
|
|
25
|
+
export const WEIGHTED_AGGREGATIONS_LIST = [...WEIGHTED_AGGREGATIONS];
|
|
26
|
+
export const DEFAULT_AGGREGATION = 'Average';
|
|
4
27
|
/// Calculates the desirability score for a given x value
|
|
5
28
|
/// Returns 0 if x is outside the range of the desirability line
|
|
6
29
|
/// Otherwise, returns the y value of the desirability line at x
|
|
@@ -23,30 +46,83 @@ export function desirabilityScore(x, desirabilityLine) {
|
|
|
23
46
|
// Should not happen if x is within bounds, but return 0 as fallback
|
|
24
47
|
return 0;
|
|
25
48
|
}
|
|
49
|
+
export function categoricalDesirabilityScore(value, prop) {
|
|
50
|
+
var _a;
|
|
51
|
+
const found = prop.categories.find((c) => c.name === value);
|
|
52
|
+
return (_a = found === null || found === void 0 ? void 0 : found.desirability) !== null && _a !== void 0 ? _a : null;
|
|
53
|
+
}
|
|
26
54
|
/** Calculates the multi parameter optimization score, 0-100, 100 is the maximum */
|
|
27
|
-
export function mpo(dataFrame, columns) {
|
|
55
|
+
export function mpo(dataFrame, columns, profileName, aggregation, isDifferent = false, createDesirabilityColumns = false) {
|
|
56
|
+
var _a, _b;
|
|
28
57
|
if (columns.length === 0)
|
|
29
58
|
throw new Error('No columns provided for MPO calculation.');
|
|
30
|
-
const
|
|
31
|
-
const resultColumn =
|
|
32
|
-
|
|
59
|
+
const rowCount = columns[0].length;
|
|
60
|
+
const resultColumn = isDifferent ?
|
|
61
|
+
DG.Column.float(profileName, rowCount) :
|
|
62
|
+
((_a = dataFrame.col(profileName)) !== null && _a !== void 0 ? _a : DG.Column.float(profileName, rowCount));
|
|
63
|
+
const desirabilityTemplates = [];
|
|
64
|
+
const weightColumns = [];
|
|
65
|
+
for (const column of columns) {
|
|
33
66
|
const tag = column.getTag('desirabilityTemplate');
|
|
34
|
-
|
|
35
|
-
|
|
67
|
+
const d = migrateDesirability(JSON.parse(tag));
|
|
68
|
+
desirabilityTemplates.push(d);
|
|
69
|
+
weightColumns.push(d.weightColumn ? (_b = dataFrame.col(d.weightColumn)) !== null && _b !== void 0 ? _b : null : null);
|
|
70
|
+
}
|
|
71
|
+
const desirabilityColumns = createDesirabilityColumns ?
|
|
72
|
+
columns.map((col) => DG.Column.float(`${col.name} (${profileName} desirability)`, rowCount)) : undefined;
|
|
36
73
|
resultColumn.init((i) => {
|
|
37
|
-
|
|
38
|
-
|
|
74
|
+
const scores = [];
|
|
75
|
+
const weights = [];
|
|
39
76
|
for (let j = 0; j < columns.length; j++) {
|
|
40
77
|
const desirability = desirabilityTemplates[j];
|
|
41
78
|
const value = columns[j].get(i);
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
79
|
+
let score;
|
|
80
|
+
if (columns[j].isNone(i)) {
|
|
81
|
+
const mv = desirability.missingValues;
|
|
82
|
+
if (!mv || mv.strategy === 'exclude')
|
|
83
|
+
return NaN;
|
|
84
|
+
if (mv.strategy === 'skip')
|
|
85
|
+
continue;
|
|
86
|
+
score = mv.score;
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
score = isNumerical(desirability) ?
|
|
90
|
+
desirabilityScore(value, desirability.line) :
|
|
91
|
+
categoricalDesirabilityScore(String(value), desirability);
|
|
92
|
+
}
|
|
93
|
+
if (score === null)
|
|
94
|
+
return NaN;
|
|
95
|
+
if (createDesirabilityColumns)
|
|
96
|
+
desirabilityColumns[j].set(i, score, false);
|
|
97
|
+
scores.push(score);
|
|
98
|
+
const wCol = weightColumns[j];
|
|
99
|
+
const w = wCol && !wCol.isNone(i) ? Math.max(0, Math.min(1, wCol.get(i))) : desirability.weight;
|
|
100
|
+
weights.push(w);
|
|
45
101
|
}
|
|
46
|
-
|
|
102
|
+
if (scores.length === 0)
|
|
103
|
+
return NaN;
|
|
104
|
+
return aggregate(scores, weights, aggregation);
|
|
47
105
|
});
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
106
|
+
return { scoreColumn: resultColumn, desirabilityColumns };
|
|
107
|
+
}
|
|
108
|
+
export function aggregate(scores, weights, aggregation) {
|
|
109
|
+
switch (aggregation) {
|
|
110
|
+
case 'Sum':
|
|
111
|
+
return scores.reduce((sum, s, idx) => sum + s * weights[idx], 0);
|
|
112
|
+
case 'Average':
|
|
113
|
+
const totalWeight = weights.reduce((sum, w) => sum + w, 0);
|
|
114
|
+
return scores.reduce((sum, s, idx) => sum + s * weights[idx], 0) / totalWeight;
|
|
115
|
+
case 'Product':
|
|
116
|
+
return scores.reduce((prod, s, idx) => prod * Math.pow(s, weights[idx]), 1);
|
|
117
|
+
case 'Geomean':
|
|
118
|
+
const totalW = weights.reduce((sum, w) => sum + w, 0);
|
|
119
|
+
return scores.reduce((prod, s, idx) => prod * Math.pow(s, weights[idx] / totalW), 1);
|
|
120
|
+
case 'Min':
|
|
121
|
+
return Math.min(...scores.map((s, idx) => Math.pow(s, weights[idx])));
|
|
122
|
+
case 'Max':
|
|
123
|
+
return Math.max(...scores.map((s, idx) => Math.pow(s, weights[idx])));
|
|
124
|
+
default:
|
|
125
|
+
throw new Error(`Unknown aggregation type: ${aggregation}`);
|
|
126
|
+
}
|
|
51
127
|
}
|
|
52
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXBvLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsibXBvLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGlDQUFpQztBQUNqQyw0QkFBNEI7QUFDNUIsT0FBTyxLQUFLLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQXFCdEMseURBQXlEO0FBQ3pELGdFQUFnRTtBQUNoRSxnRUFBZ0U7QUFDaEUsTUFBTSxVQUFVLGlCQUFpQixDQUFDLENBQVMsRUFBRSxnQkFBa0M7SUFDN0UsMkRBQTJEO0lBQzNELElBQUksZ0JBQWdCLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLGdCQUFnQixDQUFDLGdCQUFnQixDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDckgsT0FBTyxDQUFDLENBQUM7SUFFWCwwQ0FBMEM7SUFDMUMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLGdCQUFnQixDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDcEQsTUFBTSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsR0FBRyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNyQyxNQUFNLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxHQUFHLGdCQUFnQixDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUV6QyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUN0Qiw4Q0FBOEM7WUFDOUMsSUFBSSxFQUFFLEtBQUssRUFBRTtnQkFBRSxPQUFPLEVBQUUsQ0FBQztZQUN6QixNQUFNLEtBQUssR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztZQUNwQyxPQUFPLEVBQUUsR0FBRyxLQUFLLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7U0FDOUI7S0FDRjtJQUVELG9FQUFvRTtJQUNwRSxPQUFPLENBQUMsQ0FBQztBQUNYLENBQUM7QUFFRCxtRkFBbUY7QUFDbkYsTUFBTSxVQUFVLEdBQUcsQ0FBQyxTQUF1QixFQUFFLE9BQW9CO0lBQy9ELElBQUksT0FBTyxDQUFDLE1BQU0sS0FBSyxDQUFDO1FBQ3RCLE1BQU0sSUFBSSxLQUFLLENBQUMsMENBQTBDLENBQUMsQ0FBQztJQUU5RCxNQUFNLGdCQUFnQixHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMscUJBQXFCO0lBQ3RGLE1BQU0sWUFBWSxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLGdCQUFnQixFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUUxRSxNQUFNLHFCQUFxQixHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRTtRQUNuRCxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLHNCQUFzQixDQUFDLENBQUM7UUFDbEQsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBeUIsQ0FBQztJQUNqRCxDQUFDLENBQUMsQ0FBQztJQUVILFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtRQUN0QixJQUFJLFVBQVUsR0FBRyxDQUFDLENBQUM7UUFDbkIsSUFBSSxRQUFRLEdBQUcsQ0FBQyxDQUFDO1FBRWpCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ3ZDLE1BQU0sWUFBWSxHQUFHLHFCQUFxQixDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzlDLE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDaEMsTUFBTSxLQUFLLEdBQUcsaUJBQWlCLENBQUMsS0FBSyxFQUFFLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUMxRCxVQUFVLElBQUksWUFBWSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7WUFDMUMsUUFBUSxJQUFJLFlBQVksQ0FBQyxNQUFNLENBQUM7U0FDakM7UUFFRCxPQUFPLEdBQUcsR0FBRyxDQUFDLFVBQVUsR0FBRyxRQUFRLENBQUMsQ0FBQztJQUN2QyxDQUFDLENBQUMsQ0FBQztJQUVILDhCQUE4QjtJQUM5QixTQUFTLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUNwQyxPQUFPLFlBQVksQ0FBQztBQUN0QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgZ3VhcmQtZm9yLWluICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuICovXG5pbXBvcnQgKiBhcyBERyBmcm9tICdkYXRhZ3Jvay1hcGkvZGcnO1xuXG4vLy8gQW4gYXJyYXkgb2YgW3gsIHldIHBvaW50cyByZXByZXNlbnRpbmcgdGhlIGRlc2lyYWJpbGl0eSBsaW5lXG4vLy8gW3gsIHldIHBhaXJzIGFyZSBzb3J0ZWQgYnkgeCBpbiBhc2NlbmRpbmcgb3JkZXJcbmV4cG9ydCB0eXBlIERlc2lyYWJpbGl0eUxpbmUgPSBudW1iZXJbXVtdO1xuXG4vLy8gQSBkZXNpcmFiaWxpdHkgbGluZSB3aXRoIGl0cyB3ZWlnaHRcbmV4cG9ydCB0eXBlIFByb3BlcnR5RGVzaXJhYmlsaXR5ID0ge1xuICBsaW5lOiBEZXNpcmFiaWxpdHlMaW5lO1xuICBtaW4/OiBudW1iZXI7IC8vLyBtaW4gdmFsdWUgb2YgdGhlIHByb3BlcnR5IChvcHRpb25hbDsgdXNlZCBmb3IgZWRpdGluZyB0aGUgbGluZSlcbiAgbWF4PzogbnVtYmVyOyAvLy8gbWF4IHZhbHVlIG9mIHRoZSBwcm9wZXJ0eSAob3B0aW9uYWw7IHVzZWQgZm9yIGVkaXRpbmcgdGhlIGxpbmUpXG4gIHdlaWdodDogbnVtYmVyOyAvLy8gMC0xXG59XG5cbi8vLyBBIG1hcCBvZiBkZXNpcmFiaWxpdHkgbGluZXMgd2l0aCB0aGVpciB3ZWlnaHRzXG5leHBvcnQgdHlwZSBEZXNpcmFiaWxpdHlQcm9maWxlID0ge1xuICBuYW1lOiBzdHJpbmc7XG4gIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gIHByb3BlcnRpZXM6IHsgW2tleTogc3RyaW5nXTogUHJvcGVydHlEZXNpcmFiaWxpdHkgfTtcbn1cblxuLy8vIENhbGN1bGF0ZXMgdGhlIGRlc2lyYWJpbGl0eSBzY29yZSBmb3IgYSBnaXZlbiB4IHZhbHVlXG4vLy8gUmV0dXJucyAwIGlmIHggaXMgb3V0c2lkZSB0aGUgcmFuZ2Ugb2YgdGhlIGRlc2lyYWJpbGl0eSBsaW5lXG4vLy8gT3RoZXJ3aXNlLCByZXR1cm5zIHRoZSB5IHZhbHVlIG9mIHRoZSBkZXNpcmFiaWxpdHkgbGluZSBhdCB4XG5leHBvcnQgZnVuY3Rpb24gZGVzaXJhYmlsaXR5U2NvcmUoeDogbnVtYmVyLCBkZXNpcmFiaWxpdHlMaW5lOiBEZXNpcmFiaWxpdHlMaW5lKTogbnVtYmVyIHtcbiAgLy8gSWYgdGhlIGxpbmUgaXMgZW1wdHkgb3IgeCBpcyBvdXRzaWRlIHRoZSByYW5nZSwgcmV0dXJuIDBcbiAgaWYgKGRlc2lyYWJpbGl0eUxpbmUubGVuZ3RoID09PSAwIHx8IHggPCBkZXNpcmFiaWxpdHlMaW5lWzBdWzBdIHx8IHggPiBkZXNpcmFiaWxpdHlMaW5lW2Rlc2lyYWJpbGl0eUxpbmUubGVuZ3RoIC0gMV1bMF0pXG4gICAgcmV0dXJuIDA7XG5cbiAgLy8gRmluZCB0aGUgdHdvIHBvaW50cyB0aGF0IHggbGllcyBiZXR3ZWVuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgZGVzaXJhYmlsaXR5TGluZS5sZW5ndGggLSAxOyBpKyspIHtcbiAgICBjb25zdCBbeDEsIHkxXSA9IGRlc2lyYWJpbGl0eUxpbmVbaV07XG4gICAgY29uc3QgW3gyLCB5Ml0gPSBkZXNpcmFiaWxpdHlMaW5lW2kgKyAxXTtcblxuICAgIGlmICh4ID49IHgxICYmIHggPD0geDIpIHtcbiAgICAgIC8vIExpbmVhciBpbnRlcnBvbGF0aW9uIGJldHdlZW4gdGhlIHR3byBwb2ludHNcbiAgICAgIGlmICh4MSA9PT0geDIpIHJldHVybiB5MTtcbiAgICAgIGNvbnN0IHNsb3BlID0gKHkyIC0geTEpIC8gKHgyIC0geDEpO1xuICAgICAgcmV0dXJuIHkxICsgc2xvcGUgKiAoeCAtIHgxKTtcbiAgICB9XG4gIH1cblxuICAvLyBTaG91bGQgbm90IGhhcHBlbiBpZiB4IGlzIHdpdGhpbiBib3VuZHMsIGJ1dCByZXR1cm4gMCBhcyBmYWxsYmFja1xuICByZXR1cm4gMDtcbn1cblxuLyoqIENhbGN1bGF0ZXMgdGhlIG11bHRpIHBhcmFtZXRlciBvcHRpbWl6YXRpb24gc2NvcmUsIDAtMTAwLCAxMDAgaXMgdGhlIG1heGltdW0gKi9cbmV4cG9ydCBmdW5jdGlvbiBtcG8oZGF0YUZyYW1lOiBERy5EYXRhRnJhbWUsIGNvbHVtbnM6IERHLkNvbHVtbltdKTogREcuQ29sdW1uIHtcbiAgaWYgKGNvbHVtbnMubGVuZ3RoID09PSAwKVxuICAgIHRocm93IG5ldyBFcnJvcignTm8gY29sdW1ucyBwcm92aWRlZCBmb3IgTVBPIGNhbGN1bGF0aW9uLicpO1xuXG4gIGNvbnN0IHJlc3VsdENvbHVtbk5hbWUgPSBkYXRhRnJhbWUuY29sdW1ucy5nZXRVbnVzZWROYW1lKCdNUE8nKTsgLy8gRW5zdXJlIHVuaXF1ZSBuYW1lXG4gIGNvbnN0IHJlc3VsdENvbHVtbiA9IERHLkNvbHVtbi5mbG9hdChyZXN1bHRDb2x1bW5OYW1lLCBjb2x1bW5zWzBdLmxlbmd0aCk7XG5cbiAgY29uc3QgZGVzaXJhYmlsaXR5VGVtcGxhdGVzID0gY29sdW1ucy5tYXAoKGNvbHVtbikgPT4ge1xuICAgIGNvbnN0IHRhZyA9IGNvbHVtbi5nZXRUYWcoJ2Rlc2lyYWJpbGl0eVRlbXBsYXRlJyk7XG4gICAgcmV0dXJuIEpTT04ucGFyc2UodGFnKSBhcyBQcm9wZXJ0eURlc2lyYWJpbGl0eTtcbiAgfSk7XG5cbiAgcmVzdWx0Q29sdW1uLmluaXQoKGkpID0+IHtcbiAgICBsZXQgdG90YWxTY29yZSA9IDA7XG4gICAgbGV0IG1heFNjb3JlID0gMDtcblxuICAgIGZvciAobGV0IGogPSAwOyBqIDwgY29sdW1ucy5sZW5ndGg7IGorKykge1xuICAgICAgY29uc3QgZGVzaXJhYmlsaXR5ID0gZGVzaXJhYmlsaXR5VGVtcGxhdGVzW2pdO1xuICAgICAgY29uc3QgdmFsdWUgPSBjb2x1bW5zW2pdLmdldChpKTtcbiAgICAgIGNvbnN0IHNjb3JlID0gZGVzaXJhYmlsaXR5U2NvcmUodmFsdWUsIGRlc2lyYWJpbGl0eS5saW5lKTtcbiAgICAgIHRvdGFsU2NvcmUgKz0gZGVzaXJhYmlsaXR5LndlaWdodCAqIHNjb3JlO1xuICAgICAgbWF4U2NvcmUgKz0gZGVzaXJhYmlsaXR5LndlaWdodDtcbiAgICB9XG5cbiAgICByZXR1cm4gMTAwICogKHRvdGFsU2NvcmUgLyBtYXhTY29yZSk7XG4gIH0pO1xuXG4gIC8vIEFkZCB0aGUgY29sdW1uIHRvIHRoZSB0YWJsZVxuICBkYXRhRnJhbWUuY29sdW1ucy5hZGQocmVzdWx0Q29sdW1uKTtcbiAgcmV0dXJuIHJlc3VsdENvbHVtbjtcbn1cbiJdfQ==
|
|
128
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXBvLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsibXBvLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGlDQUFpQztBQUNqQyw0QkFBNEI7QUFDNUIsT0FBTyxLQUFLLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQTZDdEMsTUFBTSxVQUFVLFdBQVcsQ0FBQyxDQUF1QjtJQUNqRCxPQUFPLENBQUMsQ0FBQyxZQUFZLEtBQUssV0FBVyxDQUFDO0FBQ3hDLENBQUM7QUFFRCxNQUFNLFVBQVUsc0JBQXNCLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDO0lBQ2pFLE9BQU8sRUFBQyxZQUFZLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBQyxDQUFDO0FBQ25GLENBQUM7QUFFRCxNQUFNLFVBQVUsd0JBQXdCLENBQ3RDLE1BQU0sR0FBRyxDQUFDLEVBQ1YsVUFBbUQ7SUFFbkQsT0FBTyxFQUFDLFlBQVksRUFBRSxhQUFhLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxVQUFVLGFBQVYsVUFBVSxjQUFWLFVBQVUsR0FBSSxDQUFDLEVBQUMsSUFBSSxFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUUsQ0FBQyxFQUFDLENBQUMsRUFBQyxDQUFDO0FBQ2xILENBQUM7QUFFRCxNQUFNLFVBQVUsbUJBQW1CLENBQUMsR0FBUTtJQUMxQyxJQUFJLEdBQUcsQ0FBQyxZQUFZO1FBQ2xCLE9BQU8sR0FBRyxDQUFDO0lBQ2IsSUFBSSxHQUFHLENBQUMsVUFBVTtRQUNoQixPQUFPLEVBQUMsR0FBRyxHQUFHLEVBQUUsWUFBWSxFQUFFLGFBQWEsRUFBQyxDQUFDO0lBQy9DLE9BQU8sRUFBQyxHQUFHLEdBQUcsRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUFDLENBQUM7QUFDN0MsQ0FBQztBQUVELE1BQU0sQ0FBQyxN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Q29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBndWFyZC1mb3ItaW4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4gKi9cbmltcG9ydCAqIGFzIERHIGZyb20gJ2RhdGFncm9rLWFwaS9kZyc7XG5cbi8vLyBBbiBhcnJheSBvZiBbeCwgeV0gcG9pbnRzIHJlcHJlc2VudGluZyB0aGUgZGVzaXJhYmlsaXR5IGxpbmVcbi8vLyBbeCwgeV0gcGFpcnMgYXJlIHNvcnRlZCBieSB4IGluIGFzY2VuZGluZyBvcmRlclxuZXhwb3J0IHR5cGUgRGVzaXJhYmlsaXR5TGluZSA9IG51bWJlcltdW107XG5cbmV4cG9ydCB0eXBlIERlc2lyYWJpbGl0eU1vZGUgPSAnZnJlZWZvcm0nIHwgJ2dhdXNzaWFuJyB8ICdzaWdtb2lkJztcblxuZXhwb3J0IHR5cGUgTWlzc2luZ1ZhbHVlQ29uZmlnID1cbiAgfCB7IHN0cmF0ZWd5OiAnZXhjbHVkZScgfVxuICB8IHsgc3RyYXRlZ3k6ICdkZWZhdWx0Jzsgc2NvcmU6IG51bWJlciB9XG4gIHwgeyBzdHJhdGVneTogJ3NraXAnIH07XG5cbnR5cGUgQmFzZVByb3BlcnR5RGVzaXJhYmlsaXR5ID0ge1xuICB3ZWlnaHQ6IG51bWJlcjsgLy8vIDAtMVxuICB3ZWlnaHRDb2x1bW4/OiBzdHJpbmc7IC8vLyBvcHRpb25hbCBjb2x1bW4gbmFtZSB0byByZWFkIHBlci1yb3cgd2VpZ2h0cyBmcm9tICgwLTEpXG4gIG1pc3NpbmdWYWx1ZXM/OiBNaXNzaW5nVmFsdWVDb25maWc7XG59XG5cbmV4cG9ydCB0eXBlIE51bWVyaWNhbERlc2lyYWJpbGl0eSA9IEJhc2VQcm9wZXJ0eURlc2lyYWJpbGl0eSAmIHtcbiAgZnVuY3Rpb25UeXBlOiAnbnVtZXJpY2FsJztcbiAgbGluZTogRGVzaXJhYmlsaXR5TGluZTtcbiAgbWluPzogbnVtYmVyOyAvLy8gbWluIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eSAob3B0aW9uYWw7IHVzZWQgZm9yIGVkaXRpbmcgdGhlIGxpbmUpXG4gIG1heD86IG51bWJlcjsgLy8vIG1heCB2YWx1ZSBvZiB0aGUgcHJvcGVydHkgKG9wdGlvbmFsOyB1c2VkIGZvciBlZGl0aW5nIHRoZSBsaW5lKVxuXG4gIG1vZGU/OiBEZXNpcmFiaWxpdHlNb2RlO1xuXG4gIC8vLyBHYXVzc2lhbiBtb2RlIHBhcmFtZXRlcnNcbiAgbWVhbj86IG51bWJlcjtcbiAgc2lnbWE/OiBudW1iZXI7XG5cbiAgLy8vIFNpZ21vaWQgbW9kZSBwYXJhbWV0ZXJzXG4gIHgwPzogbnVtYmVyO1xuICBrPzogbnVtYmVyO1xuXG4gIGZyZWVmb3JtTGluZT86IERlc2lyYWJpbGl0eUxpbmU7XG59XG5cbmV4cG9ydCB0eXBlIENhdGVnb3JpY2FsRGVzaXJhYmlsaXR5ID0gQmFzZVByb3BlcnR5RGVzaXJhYmlsaXR5ICYge1xuICBmdW5jdGlvblR5cGU6ICdjYXRlZ29yaWNhbCc7XG4gIGNhdGVnb3JpZXM6IHsgbmFtZTogc3RyaW5nOyBkZXNpcmFiaWxpdHk6IG51bWJlciB9W107XG59XG5cbmV4cG9ydCB0eXBlIFByb3BlcnR5RGVzaXJhYmlsaXR5ID0gTnVtZXJpY2FsRGVzaXJhYmlsaXR5IHwgQ2F0ZWdvcmljYWxEZXNpcmFiaWxpdHk7XG5cbmV4cG9ydCBmdW5jdGlvbiBpc051bWVyaWNhbChwOiBQcm9wZXJ0eURlc2lyYWJpbGl0eSk6IHAgaXMgTnVtZXJpY2FsRGVzaXJhYmlsaXR5IHtcbiAgcmV0dXJuIHAuZnVuY3Rpb25UeXBlID09PSAnbnVtZXJpY2FsJztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZURlZmF1bHROdW1lcmljYWwod2VpZ2h0ID0gMSwgbWluID0gMCwgbWF4ID0gMSk6IE51bWVyaWNhbERlc2lyYWJpbGl0eSB7XG4gIHJldHVybiB7ZnVuY3Rpb25UeXBlOiAnbnVtZXJpY2FsJywgd2VpZ2h0LCBtb2RlOiAnZnJlZWZvcm0nLCBtaW4sIG1heCwgbGluZTogW119O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRGVmYXVsdENhdGVnb3JpY2FsKFxuICB3ZWlnaHQgPSAxLFxuICBjYXRlZ29yaWVzPzoge25hbWU6IHN0cmluZzsgZGVzaXJhYmlsaXR5OiBudW1iZXJ9W10sXG4pOiBDYXRlZ29yaWNhbERlc2lyYWJpbGl0eSB7XG4gIHJldHVybiB7ZnVuY3Rpb25UeXBlOiAnY2F0ZWdvcmljYWwnLCB3ZWlnaHQsIGNhdGVnb3JpZXM6IGNhdGVnb3JpZXMgPz8gW3tuYW1lOiAnQ2F0ZWdvcnkgMScsIGRlc2lyYWJpbGl0eTogMX1dfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1pZ3JhdGVEZXNpcmFiaWxpdHkocmF3OiBhbnkpOiBQcm9wZXJ0eURlc2lyYWJpbGl0eSB7XG4gIGlmIChyYXcuZnVuY3Rpb25UeXBlKVxuICAgIHJldHVybiByYXc7XG4gIGlmIChyYXcuY2F0ZWdvcmllcylcbiAgICByZXR1cm4gey4uLnJhdywgZnVuY3Rpb25UeXBlOiAnY2F0ZWdvcmljYWwnfTtcbiAgcmV0dXJuIHsuLi5yYXcsIGZ1bmN0aW9uVHlwZTogJ251bWVyaWNhbCd9O1xufVxuXG5leHBvcnQgY29uc3QgREVTSVJBQklMSVRZX1BST0ZJTEVfVFlQRSA9ICdNUE8gRGVzaXJhYmlsaXR5IFByb2ZpbGUnO1xuXG4vLy8gQSBtYXAgb2YgZGVzaXJhYmlsaXR5IGxpbmVzIHdpdGggdGhlaXIgd2VpZ2h0c1xuZXhwb3J0IHR5cGUgRGVzaXJhYmlsaXR5UHJvZmlsZSA9IHtcbiAgdHlwZTogdHlwZW9mIERFU0lSQUJJTElUWV9QUk9GSUxFX1RZUEU7XG4gIG5hbWU6IHN0cmluZztcbiAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgYWdncmVnYXRpb24/OiBXZWlnaHRlZEFnZ3JlZ2F0aW9uO1xuICBwcm9wZXJ0aWVzOiB7IFtrZXk6IHN0cmluZ106IFByb3BlcnR5RGVzaXJhYmlsaXR5IH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0Rlc2lyYWJpbGl0eVByb2ZpbGUoeDogYW55KTogeCBpcyBEZXNpcmFiaWxpdHlQcm9maWxlIHtcbiAgcmV0dXJuIHggIT0gbnVsbCAmJiB0eXBlb2YgeCA9PT0gJ29iamVjdCcgJiYgeC50eXBlID09PSBERVNJUkFCSUxJVFlfUFJPRklMRV9UWVBFO1xufVxuXG5leHBvcnQgY29uc3QgV0VJR0hURURfQUdHUkVHQVRJT05TID0gWydBdmVyYWdlJywgJ1N1bScsICdQcm9kdWN0JywgJ0dlb21lYW4nLCAnTWluJywgJ01heCddIGFzIGNvbnN0O1xuZXhwb3J0IGNvbnN0IFdFSUdIVEVEX0FHR1JFR0FUSU9OU19MSVNUOiBXZWlnaHRlZEFnZ3JlZ2F0aW9uW10gPSBbLi4uV0VJR0hURURfQUdHUkVHQVRJT05TXTtcbmV4cG9ydCB0eXBlIFdlaWdodGVkQWdncmVnYXRpb24gPSB0eXBlb2YgV0VJR0hURURfQUdHUkVHQVRJT05TW251bWJlcl07XG5leHBvcnQgY29uc3QgREVGQVVMVF9BR0dSRUdBVElPTjogV2VpZ2h0ZWRBZ2dyZWdhdGlvbiA9ICdBdmVyYWdlJztcblxuLy8vIENhbGN1bGF0ZXMgdGhlIGRlc2lyYWJpbGl0eSBzY29yZSBmb3IgYSBnaXZlbiB4IHZhbHVlXG4vLy8gUmV0dXJucyAwIGlmIHggaXMgb3V0c2lkZSB0aGUgcmFuZ2Ugb2YgdGhlIGRlc2lyYWJpbGl0eSBsaW5lXG4vLy8gT3RoZXJ3aXNlLCByZXR1cm5zIHRoZSB5IHZhbHVlIG9mIHRoZSBkZXNpcmFiaWxpdHkgbGluZSBhdCB4XG5leHBvcnQgZnVuY3Rpb24gZGVzaXJhYmlsaXR5U2NvcmUoeDogbnVtYmVyLCBkZXNpcmFiaWxpdHlMaW5lOiBEZXNpcmFiaWxpdHlMaW5lKTogbnVtYmVyIHtcbiAgLy8gSWYgdGhlIGxpbmUgaXMgZW1wdHkgb3IgeCBpcyBvdXRzaWRlIHRoZSByYW5nZSwgcmV0dXJuIDBcbiAgaWYgKGRlc2lyYWJpbGl0eUxpbmUubGVuZ3RoID09PSAwIHx8IHggPCBkZXNpcmFiaWxpdHlMaW5lWzBdWzBdIHx8IHggPiBkZXNpcmFiaWxpdHlMaW5lW2Rlc2lyYWJpbGl0eUxpbmUubGVuZ3RoIC0gMV1bMF0pXG4gICAgcmV0dXJuIDA7XG5cbiAgLy8gRmluZCB0aGUgdHdvIHBvaW50cyB0aGF0IHggbGllcyBiZXR3ZWVuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgZGVzaXJhYmlsaXR5TGluZS5sZW5ndGggLSAxOyBpKyspIHtcbiAgICBjb25zdCBbeDEsIHkxXSA9IGRlc2lyYWJpbGl0eUxpbmVbaV07XG4gICAgY29uc3QgW3gyLCB5Ml0gPSBkZXNpcmFiaWxpdHlMaW5lW2kgKyAxXTtcblxuICAgIGlmICh4ID49IHgxICYmIHggPD0geDIpIHtcbiAgICAgIC8vIExpbmVhciBpbnRlcnBvbGF0aW9uIGJldHdlZW4gdGhlIHR3byBwb2ludHNcbiAgICAgIGlmICh4MSA9PT0geDIpIHJldHVybiB5MTtcbiAgICAgIGNvbnN0IHNsb3BlID0gKHkyIC0geTEpIC8gKHgyIC0geDEpO1xuICAgICAgcmV0dXJuIHkxICsgc2xvcGUgKiAoeCAtIHgxKTtcbiAgICB9XG4gIH1cblxuICAvLyBTaG91bGQgbm90IGhhcHBlbiBpZiB4IGlzIHdpdGhpbiBib3VuZHMsIGJ1dCByZXR1cm4gMCBhcyBmYWxsYmFja1xuICByZXR1cm4gMDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNhdGVnb3JpY2FsRGVzaXJhYmlsaXR5U2NvcmUoXG4gIHZhbHVlOiBzdHJpbmcsXG4gIHByb3A6IENhdGVnb3JpY2FsRGVzaXJhYmlsaXR5LFxuKTogbnVtYmVyIHwgbnVsbCB7XG4gIGNvbnN0IGZvdW5kID0gcHJvcC5jYXRlZ29yaWVzLmZpbmQoKGMpID0+IGMubmFtZSA9PT0gdmFsdWUpO1xuICByZXR1cm4gZm91bmQ/LmRlc2lyYWJpbGl0eSA/PyBudWxsO1xufVxuXG5leHBvcnQgdHlwZSBNcG9SZXN1bHQgPSB7XG4gIHNjb3JlQ29sdW1uOiBERy5Db2x1bW47XG4gIGRlc2lyYWJpbGl0eUNvbHVtbnM/OiBERy5Db2x1bW5bXTtcbn1cblxuLyoqIENhbGN1bGF0ZXMgdGhlIG11bHRpIHBhcmFtZXRlciBvcHRpbWl6YXRpb24gc2NvcmUsIDAtMTAwLCAxMDAgaXMgdGhlIG1heGltdW0gKi9cbmV4cG9ydCBmdW5jdGlvbiBtcG8oXG4gIGRhdGFGcmFtZTogREcuRGF0YUZyYW1lLFxuICBjb2x1bW5zOiBERy5Db2x1bW5bXSxcbiAgcHJvZmlsZU5hbWU6IHN0cmluZyxcbiAgYWdncmVnYXRpb246IFdlaWdodGVkQWdncmVnYXRpb24sXG4gIGlzRGlmZmVyZW50OiBib29sZWFuID0gZmFsc2UsXG4gIGNyZWF0ZURlc2lyYWJpbGl0eUNvbHVtbnM6IGJvb2xlYW4gPSBmYWxzZSxcbik6IE1wb1Jlc3VsdCB7XG4gIGlmIChjb2x1bW5zLmxlbmd0aCA9PT0gMClcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIGNvbHVtbnMgcHJvdmlkZWQgZm9yIE1QTyBjYWxjdWxhdGlvbi4nKTtcblxuICBjb25zdCByb3dDb3VudCA9IGNvbHVtbnNbMF0ubGVuZ3RoO1xuICBjb25zdCByZXN1bHRDb2x1bW4gPSBpc0RpZmZlcmVudCA/XG4gICAgREcuQ29sdW1uLmZsb2F0KHByb2ZpbGVOYW1lLCByb3dDb3VudCkgOlxuICAgIChkYXRhRnJhbWUuY29sKHByb2ZpbGVOYW1lKSA/PyBERy5Db2x1bW4uZmxvYXQocHJvZmlsZU5hbWUsIHJvd0NvdW50KSk7XG5cbiAgY29uc3QgZGVzaXJhYmlsaXR5VGVtcGxhdGVzOiBQcm9wZXJ0eURlc2lyYWJpbGl0eVtdID0gW107XG4gIGNvbnN0IHdlaWdodENvbHVtbnM6IChERy5Db2x1bW4gfCBudWxsKVtdID0gW107XG4gIGZvciAoY29uc3QgY29sdW1uIG9mIGNvbHVtbnMpIHtcbiAgICBjb25zdCB0YWcgPSBjb2x1bW4uZ2V0VGFnKCdkZXNpcmFiaWxpdHlUZW1wbGF0ZScpO1xuICAgIGNvbnN0IGQgPSBtaWdyYXRlRGVzaXJhYmlsaXR5KEpTT04ucGFyc2UodGFnKSk7XG4gICAgZGVzaXJhYmlsaXR5VGVtcGxhdGVzLnB1c2goZCk7XG4gICAgd2VpZ2h0Q29sdW1ucy5wdXNoKGQud2VpZ2h0Q29sdW1uID8gZGF0YUZyYW1lLmNvbChkLndlaWdodENvbHVtbikgPz8gbnVsbCA6IG51bGwpO1xuICB9XG5cbiAgY29uc3QgZGVzaXJhYmlsaXR5Q29sdW1ucyA9IGNyZWF0ZURlc2lyYWJpbGl0eUNvbHVtbnMgP1xuICAgIGNvbHVtbnMubWFwKChjb2wpID0+IERHLkNvbHVtbi5mbG9hdChgJHtjb2wubmFtZX0gKCR7cHJvZmlsZU5hbWV9IGRlc2lyYWJpbGl0eSlgLCByb3dDb3VudCkpIDogdW5kZWZpbmVkO1xuXG4gIHJlc3VsdENvbHVtbi5pbml0KChpKSA9PiB7XG4gICAgY29uc3Qgc2NvcmVzOiBudW1iZXJbXSA9IFtdO1xuICAgIGNvbnN0IHdlaWdodHM6IG51bWJlcltdID0gW107XG5cbiAgICBmb3IgKGxldCBqID0gMDsgaiA8IGNvbHVtbnMubGVuZ3RoOyBqKyspIHtcbiAgICAgIGNvbnN0IGRlc2lyYWJpbGl0eSA9IGRlc2lyYWJpbGl0eVRlbXBsYXRlc1tqXTtcbiAgICAgIGNvbnN0IHZhbHVlID0gY29sdW1uc1tqXS5nZXQoaSk7XG5cbiAgICAgIGxldCBzY29yZTogbnVtYmVyIHwgbnVsbDtcblxuICAgICAgaWYgKGNvbHVtbnNbal0uaXNOb25lKGkpKSB7XG4gICAgICAgIGNvbnN0IG12ID0gZGVzaXJhYmlsaXR5Lm1pc3NpbmdWYWx1ZXM7XG4gICAgICAgIGlmICghbXYgfHwgbXYuc3RyYXRlZ3kgPT09ICdleGNsdWRlJylcbiAgICAgICAgICByZXR1cm4gTmFOO1xuICAgICAgICBpZiAobXYuc3RyYXRlZ3kgPT09ICdza2lwJylcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgc2NvcmUgPSBtdi5zY29yZTtcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBzY29yZSA9IGlzTnVtZXJpY2FsKGRlc2lyYWJpbGl0eSkgP1xuICAgICAgICAgIGRlc2lyYWJpbGl0eVNjb3JlKHZhbHVlLCBkZXNpcmFiaWxpdHkubGluZSkgOlxuICAgICAgICAgIGNhdGVnb3JpY2FsRGVzaXJhYmlsaXR5U2NvcmUoU3RyaW5nKHZhbHVlKSwgZGVzaXJhYmlsaXR5KTtcbiAgICAgIH1cblxuICAgICAgaWYgKHNjb3JlID09PSBudWxsKVxuICAgICAgICByZXR1cm4gTmFOO1xuXG4gICAgICBpZiAoY3JlYXRlRGVzaXJhYmlsaXR5Q29sdW1ucylcbiAgICAgICAgZGVzaXJhYmlsaXR5Q29sdW1ucyFbal0uc2V0KGksIHNjb3JlLCBmYWxzZSk7XG5cbiAgICAgIHNjb3Jlcy5wdXNoKHNjb3JlKTtcbiAgICAgIGNvbnN0IHdDb2wgPSB3ZWlnaHRDb2x1bW5zW2pdO1xuICAgICAgY29uc3QgdyA9IHdDb2wgJiYgIXdDb2wuaXNOb25lKGkpID8gTWF0aC5tYXgoMCwgTWF0aC5taW4oMSwgd0NvbC5nZXQoaSkpKSA6IGRlc2lyYWJpbGl0eS53ZWlnaHQ7XG4gICAgICB3ZWlnaHRzLnB1c2godyk7XG4gICAgfVxuXG4gICAgaWYgKHNjb3Jlcy5sZW5ndGggPT09IDApXG4gICAgICByZXR1cm4gTmFOO1xuXG4gICAgcmV0dXJuIGFnZ3JlZ2F0ZShzY29yZXMsIHdlaWdodHMsIGFnZ3JlZ2F0aW9uKTtcbiAgfSk7XG5cbiAgcmV0dXJuIHtzY29yZUNvbHVtbjogcmVzdWx0Q29sdW1uLCBkZXNpcmFiaWxpdHlDb2x1bW5zfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFnZ3JlZ2F0ZShzY29yZXM6IG51bWJlcltdLCB3ZWlnaHRzOiBudW1iZXJbXSwgYWdncmVnYXRpb246IFdlaWdodGVkQWdncmVnYXRpb24pOiBudW1iZXIge1xuICBzd2l0Y2ggKGFnZ3JlZ2F0aW9uKSB7XG4gIGNhc2UgJ1N1bSc6XG4gICAgcmV0dXJuIHNjb3Jlcy5yZWR1Y2UoKHN1bSwgcywgaWR4KSA9PiBzdW0gKyBzICogd2VpZ2h0c1tpZHhdLCAwKTtcblxuICBjYXNlICdBdmVyYWdlJzpcbiAgICBjb25zdCB0b3RhbFdlaWdodCA9IHdlaWdodHMucmVkdWNlKChzdW0sIHcpID0+IHN1bSArIHcsIDApO1xuICAgIHJldHVybiBzY29yZXMucmVkdWNlKChzdW0sIHMsIGlkeCkgPT4gc3VtICsgcyAqIHdlaWdodHNbaWR4XSwgMCkgLyB0b3RhbFdlaWdodDtcblxuICBjYXNlICdQcm9kdWN0JzpcbiAgICByZXR1cm4gc2NvcmVzLnJlZHVjZSgocHJvZCwgcywgaWR4KSA9PiBwcm9kICogTWF0aC5wb3cocywgd2VpZ2h0c1tpZHhdKSwgMSk7XG5cbiAgY2FzZSAnR2VvbWVhbic6XG4gICAgY29uc3QgdG90YWxXID0gd2VpZ2h0cy5yZWR1Y2UoKHN1bSwgdykgPT4gc3VtICsgdywgMCk7XG4gICAgcmV0dXJuIHNjb3Jlcy5yZWR1Y2UoKHByb2QsIHMsIGlkeCkgPT4gcHJvZCAqIE1hdGgucG93KHMsIHdlaWdodHNbaWR4XSAvIHRvdGFsVyksIDEpO1xuXG4gIGNhc2UgJ01pbic6XG4gICAgcmV0dXJuIE1hdGgubWluKC4uLnNjb3Jlcy5tYXAoKHMsIGlkeCkgPT4gTWF0aC5wb3cocywgd2VpZ2h0c1tpZHhdKSkpO1xuXG4gIGNhc2UgJ01heCc6XG4gICAgcmV0dXJuIE1hdGgubWF4KC4uLnNjb3Jlcy5tYXAoKHMsIGlkeCkgPT4gTWF0aC5wb3cocywgd2VpZ2h0c1tpZHhdKSkpO1xuXG4gIGRlZmF1bHQ6XG4gICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGFnZ3JlZ2F0aW9uIHR5cGU6ICR7YWdncmVnYXRpb259YCk7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export declare const MPO_SCORE_CHANGED_EVENT = "grok-mpo-score-changed";
|
|
2
|
+
export declare const MPO_PROFILE_CHANGED_EVENT = "chem-mpo-profile-changed";
|
|
3
|
+
export declare const MPO_PROFILE_DELETED_EVENT = "chem-mpo-profile-deleted";
|
|
4
|
+
export declare function getNextAvailable(base: string, existing: Set<string>, format: (base: string, num?: number) => string): string;
|
|
5
|
+
export declare function generateMpoFileName(profileName: string, existingFileNames: Set<string>): string;
|
|
6
|
+
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["utils.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,uBAAuB,2BAA2B,CAAC;AAChE,eAAO,MAAM,yBAAyB,6BAA6B,CAAC;AACpE,eAAO,MAAM,yBAAyB,6BAA6B,CAAC;AAEpE,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,GAAG,CAAC,MAAM,CAAC,EACrB,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,KAAK,MAAM,GAC7C,MAAM,CAUR;AAED,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,EAAE,iBAAiB,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,MAAM,CAG/F"}
|
package/src/mpo/utils.js
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export const MPO_SCORE_CHANGED_EVENT = 'grok-mpo-score-changed';
|
|
2
|
+
export const MPO_PROFILE_CHANGED_EVENT = 'chem-mpo-profile-changed';
|
|
3
|
+
export const MPO_PROFILE_DELETED_EVENT = 'chem-mpo-profile-deleted';
|
|
4
|
+
export function getNextAvailable(base, existing, format) {
|
|
5
|
+
const first = format(base);
|
|
6
|
+
if (!existing.has(first))
|
|
7
|
+
return first;
|
|
8
|
+
let num = 2;
|
|
9
|
+
while (existing.has(format(base, num)))
|
|
10
|
+
num++;
|
|
11
|
+
return format(base, num);
|
|
12
|
+
}
|
|
13
|
+
export function generateMpoFileName(profileName, existingFileNames) {
|
|
14
|
+
const base = profileName.trim().replace(/[\s/\\]+/g, '-').replace(/^-|-$/g, '') || 'profile';
|
|
15
|
+
return getNextAvailable(base, existingFileNames, (b, n) => n ? `${b}-${n}.json` : `${b}.json`);
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ1dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLENBQUMsTUFBTSx1QkFBdUIsR0FBRyx3QkFBd0IsQ0FBQztBQUNoRSxNQUFNLENBQUMsTUFBTSx5QkFBeUIsR0FBRywwQkFBMEIsQ0FBQztBQUNwRSxNQUFNLENBQUMsTUFBTSx5QkFBeUIsR0FBRywwQkFBMEIsQ0FBQztBQUVwRSxNQUFNLFVBQVUsZ0JBQWdCLENBQzlCLElBQVksRUFDWixRQUFxQixFQUNyQixNQUE4QztJQUU5QyxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDM0IsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDO1FBQ3RCLE9BQU8sS0FBSyxDQUFDO0lBRWYsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDO0lBQ1osT0FBTyxRQUFRLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDcEMsR0FBRyxFQUFFLENBQUM7SUFFUixPQUFPLE1BQU0sQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDM0IsQ0FBQztBQUVELE1BQU0sVUFBVSxtQkFBbUIsQ0FBQyxXQUFtQixFQUFFLGlCQUE4QjtJQUNyRixNQUFNLElBQUksR0FBRyxXQUFXLENBQUMsSUFBSSxFQUFFLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxJQUFJLFNBQVMsQ0FBQztJQUM3RixPQUFPLGdCQUFnQixDQUFDLElBQUksRUFBRSxpQkFBaUIsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUNqRyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGNvbnN0IE1QT19TQ09SRV9DSEFOR0VEX0VWRU5UID0gJ2dyb2stbXBvLXNjb3JlLWNoYW5nZWQnO1xuZXhwb3J0IGNvbnN0IE1QT19QUk9GSUxFX0NIQU5HRURfRVZFTlQgPSAnY2hlbS1tcG8tcHJvZmlsZS1jaGFuZ2VkJztcbmV4cG9ydCBjb25zdCBNUE9fUFJPRklMRV9ERUxFVEVEX0VWRU5UID0gJ2NoZW0tbXBvLXByb2ZpbGUtZGVsZXRlZCc7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXROZXh0QXZhaWxhYmxlKFxuICBiYXNlOiBzdHJpbmcsXG4gIGV4aXN0aW5nOiBTZXQ8c3RyaW5nPixcbiAgZm9ybWF0OiAoYmFzZTogc3RyaW5nLCBudW0/OiBudW1iZXIpID0+IHN0cmluZyxcbik6IHN0cmluZyB7XG4gIGNvbnN0IGZpcnN0ID0gZm9ybWF0KGJhc2UpO1xuICBpZiAoIWV4aXN0aW5nLmhhcyhmaXJzdCkpXG4gICAgcmV0dXJuIGZpcnN0O1xuXG4gIGxldCBudW0gPSAyO1xuICB3aGlsZSAoZXhpc3RpbmcuaGFzKGZvcm1hdChiYXNlLCBudW0pKSlcbiAgICBudW0rKztcblxuICByZXR1cm4gZm9ybWF0KGJhc2UsIG51bSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZU1wb0ZpbGVOYW1lKHByb2ZpbGVOYW1lOiBzdHJpbmcsIGV4aXN0aW5nRmlsZU5hbWVzOiBTZXQ8c3RyaW5nPik6IHN0cmluZyB7XG4gIGNvbnN0IGJhc2UgPSBwcm9maWxlTmFtZS50cmltKCkucmVwbGFjZSgvW1xccy9cXFxcXSsvZywgJy0nKS5yZXBsYWNlKC9eLXwtJC9nLCAnJykgfHwgJ3Byb2ZpbGUnO1xuICByZXR1cm4gZ2V0TmV4dEF2YWlsYWJsZShiYXNlLCBleGlzdGluZ0ZpbGVOYW1lcywgKGIsIG4pID0+IG4gPyBgJHtifS0ke259Lmpzb25gIDogYCR7Yn0uanNvbmApO1xufVxuIl19
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
import { DesirabilityLine, PropertyDesirability } from './mpo';
|
|
2
|
-
import { Subject } from 'rxjs';
|
|
3
|
-
export declare class MpoDesirabilityLineEditor {
|
|
4
|
-
root: HTMLDivElement;
|
|
5
|
-
onChanged: Subject<unknown>;
|
|
6
|
-
private _prop;
|
|
7
|
-
constructor(prop: PropertyDesirability, width: number, height: number);
|
|
8
|
-
get line(): DesirabilityLine;
|
|
9
|
-
}
|
|
10
|
-
//# sourceMappingURL=mpo-line-editor.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"mpo-line-editor.d.ts","sourceRoot":"","sources":["mpo-line-editor.ts"],"names":[],"mappings":"AAKA,OAAO,EAAC,gBAAgB,EAAE,oBAAoB,EAAC,MAAM,OAAO,CAAC;AAC7D,OAAO,EAAC,OAAO,EAAC,MAAM,MAAM,CAAC;AAO7B,qBAAa,yBAAyB;IACpC,IAAI,iBAAY;IAChB,SAAS,mBAAiB;IAC1B,OAAO,CAAC,KAAK,CAAuB;gBAExB,IAAI,EAAE,oBAAoB,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;IA6PrE,IAAI,IAAI,IAAI,gBAAgB,CAE3B;CACF"}
|