@datagrok-libraries/statistics 1.10.0 → 1.12.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/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 PropertyDesirability = {
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
- weight: number;
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[]): 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
@@ -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;AAG1C,MAAM,MAAM,oBAAoB,GAAG;IACjC,IAAI,EAAE,gBAAgB,CAAC;IACvB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB,CAAA;AAGD,MAAM,MAAM,mBAAmB,GAAG;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,oBAAoB,CAAA;KAAE,CAAC;CACrD,CAAA;AAKD,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,MAAM,EAAE,gBAAgB,EAAE,gBAAgB,GAAG,MAAM,CAoBvF;AAED,mFAAmF;AACnF,wBAAgB,GAAG,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,EAAE,OAAO,EAAE,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,MAAM,CA8B5E"}
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 resultColumnName = dataFrame.columns.getUnusedName('MPO'); // Ensure unique name
31
- const resultColumn = DG.Column.float(resultColumnName, columns[0].length);
32
- const desirabilityTemplates = columns.map((column) => {
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
- return JSON.parse(tag);
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
- let totalScore = 0;
38
- let maxScore = 0;
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
- const score = desirabilityScore(value, desirability.line);
43
- totalScore += desirability.weight * score;
44
- maxScore += desirability.weight;
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
- return 100 * (totalScore / maxScore);
102
+ if (scores.length === 0)
103
+ return NaN;
104
+ return aggregate(scores, weights, aggregation);
47
105
  });
48
- // Add the column to the table
49
- dataFrame.columns.add(resultColumn);
50
- return resultColumn;
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"}
@@ -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"}