@oneteme/jquery-organizer 0.0.1 → 0.0.2

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.
@@ -23,4 +23,130 @@ export function buildYFields(indicators) {
23
23
  export function resolveYKey(selectedY, selectedYAggregate) {
24
24
  return selectedYAggregate ?? selectedY;
25
25
  }
26
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3JnYW5pemVyLXV0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvb25ldGVtZS9qcXVlcnktb3JnYW5pemVyL3NyYy9saWIvbW9kZWxzL29yZ2FuaXplci11dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFRQSxNQUFNLFVBQVUsWUFBWSxDQUFDLFVBQWlDO0lBQzVELE1BQU0sT0FBTyxHQUFhLEVBQUUsQ0FBQztJQUM3QixNQUFNLEdBQUcsR0FBRyxJQUFJLEdBQUcsRUFBMkIsQ0FBQztJQUUvQyxLQUFLLE1BQU0sU0FBUyxJQUFJLFVBQVUsRUFBRTtRQUNsQyxNQUFNLFFBQVEsR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDO1FBQ2pDLElBQUksUUFBUSxFQUFFO1lBQ1osSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEVBQUU7Z0JBQ3RCLE9BQU8sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQ3ZCLEdBQUcsQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLEVBQUUsRUFBRSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO2FBQ3RFO1lBQ0QsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUNqQyxJQUFJLE1BQU0sRUFBRSxVQUFVLEVBQUU7Z0JBQ3RCLE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxFQUFFLFNBQVMsQ0FBQyxFQUFFLEVBQUUsS0FBSyxFQUFFLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO2FBQ3RFO1NBQ0Y7YUFBTTtZQUNMLE9BQU8sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQzNCLEdBQUcsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxTQUFTLENBQUMsRUFBRSxFQUFFLEtBQUssRUFBRSxTQUFTLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztTQUNyRTtLQUNGO0lBRUQsT0FBTyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBd0IsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMvRSxDQUFDO0FBRUQsTUFBTSxVQUFVLFdBQVcsQ0FDekIsU0FBNkIsRUFDN0Isa0JBQXNDO0lBRXRDLE9BQU8sa0JBQWtCLElBQUksU0FBUyxDQUFDO0FBQ3pDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBPcmdhbml6ZXJZRmllbGQgfSBmcm9tICcuL29yZ2FuaXplci1jb25maWcuaW50ZXJmYWNlJztcblxuZXhwb3J0IGludGVyZmFjZSBPcmdhbml6ZXJZSW5kaWNhdG9yIHtcbiAgaWQ6IHN0cmluZztcbiAgbGFiZWw6IHN0cmluZztcbiAgZ3JvdXA/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFlGaWVsZHMoaW5kaWNhdG9yczogT3JnYW5pemVyWUluZGljYXRvcltdKTogT3JnYW5pemVyWUZpZWxkW10ge1xuICBjb25zdCBvcmRlcmVkOiBzdHJpbmdbXSA9IFtdO1xuICBjb25zdCBtYXAgPSBuZXcgTWFwPHN0cmluZywgT3JnYW5pemVyWUZpZWxkPigpO1xuXG4gIGZvciAoY29uc3QgaW5kaWNhdG9yIG9mIGluZGljYXRvcnMpIHtcbiAgICBjb25zdCBncm91cEtleSA9IGluZGljYXRvci5ncm91cDtcbiAgICBpZiAoZ3JvdXBLZXkpIHtcbiAgICAgIGlmICghbWFwLmhhcyhncm91cEtleSkpIHtcbiAgICAgICAgb3JkZXJlZC5wdXNoKGdyb3VwS2V5KTtcbiAgICAgICAgbWFwLnNldChncm91cEtleSwgeyBpZDogZ3JvdXBLZXksIGxhYmVsOiBncm91cEtleSwgYWdncmVnYXRlczogW10gfSk7XG4gICAgICB9XG4gICAgICBjb25zdCBwYXJlbnQgPSBtYXAuZ2V0KGdyb3VwS2V5KTtcbiAgICAgIGlmIChwYXJlbnQ/LmFnZ3JlZ2F0ZXMpIHtcbiAgICAgICAgcGFyZW50LmFnZ3JlZ2F0ZXMucHVzaCh7IGlkOiBpbmRpY2F0b3IuaWQsIGxhYmVsOiBpbmRpY2F0b3IubGFiZWwgfSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIG9yZGVyZWQucHVzaChpbmRpY2F0b3IuaWQpO1xuICAgICAgbWFwLnNldChpbmRpY2F0b3IuaWQsIHsgaWQ6IGluZGljYXRvci5pZCwgbGFiZWw6IGluZGljYXRvci5sYWJlbCB9KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gb3JkZXJlZC5tYXAoayA9PiBtYXAuZ2V0KGspKS5maWx0ZXIoKGYpOiBmIGlzIE9yZ2FuaXplcllGaWVsZCA9PiAhIWYpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVlLZXkoXG4gIHNlbGVjdGVkWTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBzZWxlY3RlZFlBZ2dyZWdhdGU6IHN0cmluZyB8IHVuZGVmaW5lZFxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIHNlbGVjdGVkWUFnZ3JlZ2F0ZSA/PyBzZWxlY3RlZFk7XG59XG4iXX0=
26
+ export function normalizeOrganizerState(state, config) {
27
+ const base = state || {};
28
+ const normalizedY = normalizeYSelection(base.selectedY, base.selectedYAggregate, config.yFields);
29
+ const selectedX = hasOption(config.xFields, base.selectedX) ? base.selectedX : undefined;
30
+ const selectedGroupBy = hasOption(config.groups, base.selectedGroupBy) ? base.selectedGroupBy : undefined;
31
+ const selectedSlices = (base.selectedSlices || []).filter(sliceId => hasOption(config.slices, sliceId));
32
+ const normalized = {
33
+ ...base,
34
+ selectedX,
35
+ selectedY: normalizedY.selectedY,
36
+ selectedYAggregate: normalizedY.selectedYAggregate,
37
+ selectedGroupBy,
38
+ selectedSlices,
39
+ };
40
+ return {
41
+ ...normalized,
42
+ selectedTemplate: resolveMatchingTemplateId(config.templates, normalized, config)
43
+ };
44
+ }
45
+ export function normalizeTemplateToState(template, currentState, config) {
46
+ const base = normalizeOrganizerState(currentState, config);
47
+ const normalizedY = normalizeYSelection(template.yField, template.yAggregate, config.yFields, base);
48
+ const nextState = {
49
+ viewMode: base.viewMode,
50
+ visibleFields: base.visibleFields,
51
+ selectedX: hasOption(config.xFields, template.xField) ? template.xField : base.selectedX,
52
+ selectedY: normalizedY.selectedY,
53
+ selectedYAggregate: normalizedY.selectedYAggregate,
54
+ selectedGroupBy: hasOption(config.groups, template.groupBy) ? template.groupBy : base.selectedGroupBy,
55
+ selectedSlices: (template.selectedSlices || []).filter(sliceId => hasOption(config.slices, sliceId)),
56
+ };
57
+ const resolvedTemplateId = resolveMatchingTemplateId(config.templates, nextState, config);
58
+ return {
59
+ ...nextState,
60
+ selectedTemplate: resolvedTemplateId ?? template.id
61
+ };
62
+ }
63
+ export function resolveMatchingTemplateId(templates, state, config) {
64
+ if (!templates?.length)
65
+ return undefined;
66
+ const normalizedState = normalizeStateWithoutTemplate(state, config);
67
+ return templates.find(template => {
68
+ const templateState = normalizeStateWithoutTemplate(normalizeTemplateToComparableState(template, normalizedState, config), config);
69
+ return sameOrganizerState(templateState, normalizedState);
70
+ })?.id;
71
+ }
72
+ function normalizeTemplateToComparableState(template, baseState, config) {
73
+ const normalizedY = normalizeYSelection(template.yField, template.yAggregate, config.yFields, baseState);
74
+ return {
75
+ ...baseState,
76
+ selectedX: hasOption(config.xFields, template.xField) ? template.xField : baseState.selectedX,
77
+ selectedY: normalizedY.selectedY,
78
+ selectedYAggregate: normalizedY.selectedYAggregate,
79
+ selectedGroupBy: hasOption(config.groups, template.groupBy) ? template.groupBy : baseState.selectedGroupBy,
80
+ selectedSlices: template.selectedSlices
81
+ ? template.selectedSlices.filter(sliceId => hasOption(config.slices, sliceId))
82
+ : (baseState.selectedSlices || []),
83
+ selectedTemplate: undefined,
84
+ };
85
+ }
86
+ function normalizeStateWithoutTemplate(state, config) {
87
+ const base = state || {};
88
+ const normalizedY = normalizeYSelection(base.selectedY, base.selectedYAggregate, config.yFields);
89
+ return {
90
+ ...base,
91
+ selectedX: hasOption(config.xFields, base.selectedX) ? base.selectedX : undefined,
92
+ selectedY: normalizedY.selectedY,
93
+ selectedYAggregate: normalizedY.selectedYAggregate,
94
+ selectedGroupBy: hasOption(config.groups, base.selectedGroupBy) ? base.selectedGroupBy : undefined,
95
+ selectedSlices: (base.selectedSlices || []).filter(sliceId => hasOption(config.slices, sliceId)),
96
+ selectedTemplate: undefined,
97
+ };
98
+ }
99
+ function normalizeYSelection(selectedY, selectedYAggregate, yFields, fallbackState) {
100
+ if (!selectedY) {
101
+ return {
102
+ selectedY: fallbackState?.selectedY,
103
+ selectedYAggregate: fallbackState?.selectedYAggregate,
104
+ };
105
+ }
106
+ const directField = yFields?.find(field => field.id === selectedY);
107
+ if (directField) {
108
+ if (!directField.aggregates?.length) {
109
+ return { selectedY: directField.id, selectedYAggregate: undefined };
110
+ }
111
+ const matchedAggregate = selectedYAggregate
112
+ ? directField.aggregates.find(aggregate => aggregate.id === selectedYAggregate)
113
+ : undefined;
114
+ const fallbackAggregate = fallbackState?.selectedY === directField.id
115
+ ? directField.aggregates.find(aggregate => aggregate.id === fallbackState.selectedYAggregate)
116
+ : undefined;
117
+ const resolvedAggregate = matchedAggregate ?? fallbackAggregate ?? directField.aggregates[0];
118
+ return {
119
+ selectedY: directField.id,
120
+ selectedYAggregate: resolvedAggregate?.id,
121
+ };
122
+ }
123
+ const aggregateParent = yFields?.find(field => field.aggregates?.some(aggregate => aggregate.id === selectedY));
124
+ if (aggregateParent) {
125
+ return {
126
+ selectedY: aggregateParent.id,
127
+ selectedYAggregate: selectedY,
128
+ };
129
+ }
130
+ return {
131
+ selectedY: fallbackState?.selectedY,
132
+ selectedYAggregate: fallbackState?.selectedYAggregate,
133
+ };
134
+ }
135
+ function sameOrganizerState(left, right) {
136
+ return left.selectedX === right.selectedX
137
+ && left.selectedY === right.selectedY
138
+ && left.selectedYAggregate === right.selectedYAggregate
139
+ && left.selectedGroupBy === right.selectedGroupBy
140
+ && sameSlices(left.selectedSlices || [], right.selectedSlices || []);
141
+ }
142
+ function sameSlices(left, right) {
143
+ if (left.length !== right.length)
144
+ return false;
145
+ const sortedLeft = [...left].sort((a, b) => a.localeCompare(b));
146
+ const sortedRight = [...right].sort((a, b) => a.localeCompare(b));
147
+ return sortedLeft.every((value, index) => value === sortedRight[index]);
148
+ }
149
+ function hasOption(items, id) {
150
+ return !!id && !!items?.some(item => item.id === id);
151
+ }
152
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3JnYW5pemVyLXV0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvb25ldGVtZS9qcXVlcnktb3JnYW5pemVyL3NyYy9saWIvbW9kZWxzL29yZ2FuaXplci11dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFRQSxNQUFNLFVBQVUsWUFBWSxDQUFDLFVBQWlDO0lBQzVELE1BQU0sT0FBTyxHQUFhLEVBQUUsQ0FBQztJQUM3QixNQUFNLEdBQUcsR0FBRyxJQUFJLEdBQUcsRUFBMkIsQ0FBQztJQUUvQyxLQUFLLE1BQU0sU0FBUyxJQUFJLFVBQVUsRUFBRTtRQUNsQyxNQUFNLFFBQVEsR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDO1FBQ2pDLElBQUksUUFBUSxFQUFFO1lBQ1osSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEVBQUU7Z0JBQ3RCLE9BQU8sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQ3ZCLEdBQUcsQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLEVBQUUsRUFBRSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO2FBQ3RFO1lBQ0QsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUNqQyxJQUFJLE1BQU0sRUFBRSxVQUFVLEVBQUU7Z0JBQ3RCLE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxFQUFFLFNBQVMsQ0FBQyxFQUFFLEVBQUUsS0FBSyxFQUFFLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO2FBQ3RFO1NBQ0Y7YUFBTTtZQUNMLE9BQU8sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQzNCLEdBQUcsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLEVBQUUsRUFB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QUFJLENBQUMsZUFBZSxLQUFLLEtBQUssQ0FBQyxlQUFlO1dBQzlDLFVBQVUsQ0FBQyxJQUFJLENBQUMsY0FBYyxJQUFJLEVBQUUsRUFBRSxLQUFLLENBQUMsY0FBYyxJQUFJLEVBQUUsQ0FBQyxDQUFDO0FBQ3pFLENBQUM7QUFFRCxTQUFTLFVBQVUsQ0FBQyxJQUFjLEVBQUUsS0FBZTtJQUNqRCxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssS0FBSyxDQUFDLE1BQU07UUFBRSxPQUFPLEtBQUssQ0FBQztJQUMvQyxNQUFNLFVBQVUsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2hFLE1BQU0sV0FBVyxHQUFHLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbEUsT0FBTyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxLQUFLLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0FBQzFFLENBQUM7QUFFRCxTQUFTLFNBQVMsQ0FBQyxLQUF3QyxFQUFFLEVBQXNCO0lBQ2pGLE9BQU8sQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7QUFDdkQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE9yZ2FuaXplckNvbmZpZywgT3JnYW5pemVyU3RhdGUsIE9yZ2FuaXplclRlbXBsYXRlLCBPcmdhbml6ZXJZRmllbGQgfSBmcm9tICcuL29yZ2FuaXplci1jb25maWcuaW50ZXJmYWNlJztcblxuZXhwb3J0IGludGVyZmFjZSBPcmdhbml6ZXJZSW5kaWNhdG9yIHtcbiAgaWQ6IHN0cmluZztcbiAgbGFiZWw6IHN0cmluZztcbiAgZ3JvdXA/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFlGaWVsZHMoaW5kaWNhdG9yczogT3JnYW5pemVyWUluZGljYXRvcltdKTogT3JnYW5pemVyWUZpZWxkW10ge1xuICBjb25zdCBvcmRlcmVkOiBzdHJpbmdbXSA9IFtdO1xuICBjb25zdCBtYXAgPSBuZXcgTWFwPHN0cmluZywgT3JnYW5pemVyWUZpZWxkPigpO1xuXG4gIGZvciAoY29uc3QgaW5kaWNhdG9yIG9mIGluZGljYXRvcnMpIHtcbiAgICBjb25zdCBncm91cEtleSA9IGluZGljYXRvci5ncm91cDtcbiAgICBpZiAoZ3JvdXBLZXkpIHtcbiAgICAgIGlmICghbWFwLmhhcyhncm91cEtleSkpIHtcbiAgICAgICAgb3JkZXJlZC5wdXNoKGdyb3VwS2V5KTtcbiAgICAgICAgbWFwLnNldChncm91cEtleSwgeyBpZDogZ3JvdXBLZXksIGxhYmVsOiBncm91cEtleSwgYWdncmVnYXRlczogW10gfSk7XG4gICAgICB9XG4gICAgICBjb25zdCBwYXJlbnQgPSBtYXAuZ2V0KGdyb3VwS2V5KTtcbiAgICAgIGlmIChwYXJlbnQ/LmFnZ3JlZ2F0ZXMpIHtcbiAgICAgICAgcGFyZW50LmFnZ3JlZ2F0ZXMucHVzaCh7IGlkOiBpbmRpY2F0b3IuaWQsIGxhYmVsOiBpbmRpY2F0b3IubGFiZWwgfSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIG9yZGVyZWQucHVzaChpbmRpY2F0b3IuaWQpO1xuICAgICAgbWFwLnNldChpbmRpY2F0b3IuaWQsIHsgaWQ6IGluZGljYXRvci5pZCwgbGFiZWw6IGluZGljYXRvci5sYWJlbCB9KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gb3JkZXJlZC5tYXAoayA9PiBtYXAuZ2V0KGspKS5maWx0ZXIoKGYpOiBmIGlzIE9yZ2FuaXplcllGaWVsZCA9PiAhIWYpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVlLZXkoXG4gIHNlbGVjdGVkWTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBzZWxlY3RlZFlBZ2dyZWdhdGU6IHN0cmluZyB8IHVuZGVmaW5lZFxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIHNlbGVjdGVkWUFnZ3JlZ2F0ZSA/PyBzZWxlY3RlZFk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVPcmdhbml6ZXJTdGF0ZShcbiAgc3RhdGU6IE9yZ2FuaXplclN0YXRlIHwgdW5kZWZpbmVkLFxuICBjb25maWc6IFBpY2s8T3JnYW5pemVyQ29uZmlnLCAneEZpZWxkcycgfCAneUZpZWxkcycgfCAnZ3JvdXBzJyB8ICdzbGljZXMnIHwgJ3RlbXBsYXRlcyc+XG4pOiBPcmdhbml6ZXJTdGF0ZSB7XG4gIGNvbnN0IGJhc2UgPSBzdGF0ZSB8fCB7fTtcbiAgY29uc3Qgbm9ybWFsaXplZFkgPSBub3JtYWxpemVZU2VsZWN0aW9uKGJhc2Uuc2VsZWN0ZWRZLCBiYXNlLnNlbGVjdGVkWUFnZ3JlZ2F0ZSwgY29uZmlnLnlGaWVsZHMpO1xuICBjb25zdCBzZWxlY3RlZFggPSBoYXNPcHRpb24oY29uZmlnLnhGaWVsZHMsIGJhc2Uuc2VsZWN0ZWRYKSA/IGJhc2Uuc2VsZWN0ZWRYIDogdW5kZWZpbmVkO1xuICBjb25zdCBzZWxlY3RlZEdyb3VwQnkgPSBoYXNPcHRpb24oY29uZmlnLmdyb3VwcywgYmFzZS5zZWxlY3RlZEdyb3VwQnkpID8gYmFzZS5zZWxlY3RlZEdyb3VwQnkgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IHNlbGVjdGVkU2xpY2VzID0gKGJhc2Uuc2VsZWN0ZWRTbGljZXMgfHwgW10pLmZpbHRlcihzbGljZUlkID0+IGhhc09wdGlvbihjb25maWcuc2xpY2VzLCBzbGljZUlkKSk7XG5cbiAgY29uc3Qgbm9ybWFsaXplZDogT3JnYW5pemVyU3RhdGUgPSB7XG4gICAgLi4uYmFzZSxcbiAgICBzZWxlY3RlZFgsXG4gICAgc2VsZWN0ZWRZOiBub3JtYWxpemVkWS5zZWxlY3RlZFksXG4gICAgc2VsZWN0ZWRZQWdncmVnYXRlOiBub3JtYWxpemVkWS5zZWxlY3RlZFlBZ2dyZWdhdGUsXG4gICAgc2VsZWN0ZWRHcm91cEJ5LFxuICAgIHNlbGVjdGVkU2xpY2VzLFxuICB9O1xuXG4gIHJldHVybiB7XG4gICAgLi4ubm9ybWFsaXplZCxcbiAgICBzZWxlY3RlZFRlbXBsYXRlOiByZXNvbHZlTWF0Y2hpbmdUZW1wbGF0ZUlkKGNvbmZpZy50ZW1wbGF0ZXMsIG5vcm1hbGl6ZWQsIGNvbmZpZylcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZVRlbXBsYXRlVG9TdGF0ZShcbiAgdGVtcGxhdGU6IE9yZ2FuaXplclRlbXBsYXRlLFxuICBjdXJyZW50U3RhdGU6IE9yZ2FuaXplclN0YXRlIHwgdW5kZWZpbmVkLFxuICBjb25maWc6IFBpY2s8T3JnYW5pemVyQ29uZmlnLCAneEZpZWxkcycgfCAneUZpZWxkcycgfCAnZ3JvdXBzJyB8ICdzbGljZXMnIHwgJ3RlbXBsYXRlcyc+XG4pOiBPcmdhbml6ZXJTdGF0ZSB7XG4gIGNvbnN0IGJhc2UgPSBub3JtYWxpemVPcmdhbml6ZXJTdGF0ZShjdXJyZW50U3RhdGUsIGNvbmZpZyk7XG4gIGNvbnN0IG5vcm1hbGl6ZWRZID0gbm9ybWFsaXplWVNlbGVjdGlvbih0ZW1wbGF0ZS55RmllbGQsIHRlbXBsYXRlLnlBZ2dyZWdhdGUsIGNvbmZpZy55RmllbGRzLCBiYXNlKTtcblxuICBjb25zdCBuZXh0U3RhdGU6IE9yZ2FuaXplclN0YXRlID0ge1xuICAgIHZpZXdNb2RlOiBiYXNlLnZpZXdNb2RlLFxuICAgIHZpc2libGVGaWVsZHM6IGJhc2UudmlzaWJsZUZpZWxkcyxcbiAgICBzZWxlY3RlZFg6IGhhc09wdGlvbihjb25maWcueEZpZWxkcywgdGVtcGxhdGUueEZpZWxkKSA/IHRlbXBsYXRlLnhGaWVsZCA6IGJhc2Uuc2VsZWN0ZWRYLFxuICAgIHNlbGVjdGVkWTogbm9ybWFsaXplZFkuc2VsZWN0ZWRZLFxuICAgIHNlbGVjdGVkWUFnZ3JlZ2F0ZTogbm9ybWFsaXplZFkuc2VsZWN0ZWRZQWdncmVnYXRlLFxuICAgIHNlbGVjdGVkR3JvdXBCeTogaGFzT3B0aW9uKGNvbmZpZy5ncm91cHMsIHRlbXBsYXRlLmdyb3VwQnkpID8gdGVtcGxhdGUuZ3JvdXBCeSA6IGJhc2Uuc2VsZWN0ZWRHcm91cEJ5LFxuICAgIHNlbGVjdGVkU2xpY2VzOiAodGVtcGxhdGUuc2VsZWN0ZWRTbGljZXMgfHwgW10pLmZpbHRlcihzbGljZUlkID0+IGhhc09wdGlvbihjb25maWcuc2xpY2VzLCBzbGljZUlkKSksXG4gIH07XG5cbiAgY29uc3QgcmVzb2x2ZWRUZW1wbGF0ZUlkID0gcmVzb2x2ZU1hdGNoaW5nVGVtcGxhdGVJZChjb25maWcudGVtcGxhdGVzLCBuZXh0U3RhdGUsIGNvbmZpZyk7XG4gIHJldHVybiB7XG4gICAgLi4ubmV4dFN0YXRlLFxuICAgIHNlbGVjdGVkVGVtcGxhdGU6IHJlc29sdmVkVGVtcGxhdGVJZCA/PyB0ZW1wbGF0ZS5pZFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZU1hdGNoaW5nVGVtcGxhdGVJZChcbiAgdGVtcGxhdGVzOiBPcmdhbml6ZXJUZW1wbGF0ZVtdIHwgdW5kZWZpbmVkLFxuICBzdGF0ZTogT3JnYW5pemVyU3RhdGUgfCB1bmRlZmluZWQsXG4gIGNvbmZpZzogUGljazxPcmdhbml6ZXJDb25maWcsICd4RmllbGRzJyB8ICd5RmllbGRzJyB8ICdncm91cHMnIHwgJ3NsaWNlcycgfCAndGVtcGxhdGVzJz5cbik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmICghdGVtcGxhdGVzPy5sZW5ndGgpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgY29uc3Qgbm9ybWFsaXplZFN0YXRlID0gbm9ybWFsaXplU3RhdGVXaXRob3V0VGVtcGxhdGUoc3RhdGUsIGNvbmZpZyk7XG4gIHJldHVybiB0ZW1wbGF0ZXMuZmluZCh0ZW1wbGF0ZSA9PiB7XG4gICAgY29uc3QgdGVtcGxhdGVTdGF0ZSA9IG5vcm1hbGl6ZVN0YXRlV2l0aG91dFRlbXBsYXRlKFxuICAgICAgbm9ybWFsaXplVGVtcGxhdGVUb0NvbXBhcmFibGVTdGF0ZSh0ZW1wbGF0ZSwgbm9ybWFsaXplZFN0YXRlLCBjb25maWcpLFxuICAgICAgY29uZmlnXG4gICAgKTtcbiAgICByZXR1cm4gc2FtZU9yZ2FuaXplclN0YXRlKHRlbXBsYXRlU3RhdGUsIG5vcm1hbGl6ZWRTdGF0ZSk7XG4gIH0pPy5pZDtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplVGVtcGxhdGVUb0NvbXBhcmFibGVTdGF0ZShcbiAgdGVtcGxhdGU6IE9yZ2FuaXplclRlbXBsYXRlLFxuICBiYXNlU3RhdGU6IE9yZ2FuaXplclN0YXRlLFxuICBjb25maWc6IFBpY2s8T3JnYW5pemVyQ29uZmlnLCAneEZpZWxkcycgfCAneUZpZWxkcycgfCAnZ3JvdXBzJyB8ICdzbGljZXMnIHwgJ3RlbXBsYXRlcyc+XG4pOiBPcmdhbml6ZXJTdGF0ZSB7XG4gIGNvbnN0IG5vcm1hbGl6ZWRZID0gbm9ybWFsaXplWVNlbGVjdGlvbih0ZW1wbGF0ZS55RmllbGQsIHRlbXBsYXRlLnlBZ2dyZWdhdGUsIGNvbmZpZy55RmllbGRzLCBiYXNlU3RhdGUpO1xuICByZXR1cm4ge1xuICAgIC4uLmJhc2VTdGF0ZSxcbiAgICBzZWxlY3RlZFg6IGhhc09wdGlvbihjb25maWcueEZpZWxkcywgdGVtcGxhdGUueEZpZWxkKSA/IHRlbXBsYXRlLnhGaWVsZCA6IGJhc2VTdGF0ZS5zZWxlY3RlZFgsXG4gICAgc2VsZWN0ZWRZOiBub3JtYWxpemVkWS5zZWxlY3RlZFksXG4gICAgc2VsZWN0ZWRZQWdncmVnYXRlOiBub3JtYWxpemVkWS5zZWxlY3RlZFlBZ2dyZWdhdGUsXG4gICAgc2VsZWN0ZWRHcm91cEJ5OiBoYXNPcHRpb24oY29uZmlnLmdyb3VwcywgdGVtcGxhdGUuZ3JvdXBCeSkgPyB0ZW1wbGF0ZS5ncm91cEJ5IDogYmFzZVN0YXRlLnNlbGVjdGVkR3JvdXBCeSxcbiAgICBzZWxlY3RlZFNsaWNlczogdGVtcGxhdGUuc2VsZWN0ZWRTbGljZXNcbiAgICAgID8gdGVtcGxhdGUuc2VsZWN0ZWRTbGljZXMuZmlsdGVyKHNsaWNlSWQgPT4gaGFzT3B0aW9uKGNvbmZpZy5zbGljZXMsIHNsaWNlSWQpKVxuICAgICAgOiAoYmFzZVN0YXRlLnNlbGVjdGVkU2xpY2VzIHx8IFtdKSxcbiAgICBzZWxlY3RlZFRlbXBsYXRlOiB1bmRlZmluZWQsXG4gIH07XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVN0YXRlV2l0aG91dFRlbXBsYXRlKFxuICBzdGF0ZTogT3JnYW5pemVyU3RhdGUgfCB1bmRlZmluZWQsXG4gIGNvbmZpZzogUGljazxPcmdhbml6ZXJDb25maWcsICd4RmllbGRzJyB8ICd5RmllbGRzJyB8ICdncm91cHMnIHwgJ3NsaWNlcycgfCAndGVtcGxhdGVzJz5cbik6IE9yZ2FuaXplclN0YXRlIHtcbiAgY29uc3QgYmFzZSA9IHN0YXRlIHx8IHt9O1xuICBjb25zdCBub3JtYWxpemVkWSA9IG5vcm1hbGl6ZVlTZWxlY3Rpb24oYmFzZS5zZWxlY3RlZFksIGJhc2Uuc2VsZWN0ZWRZQWdncmVnYXRlLCBjb25maWcueUZpZWxkcyk7XG4gIHJldHVybiB7XG4gICAgLi4uYmFzZSxcbiAgICBzZWxlY3RlZFg6IGhhc09wdGlvbihjb25maWcueEZpZWxkcywgYmFzZS5zZWxlY3RlZFgpID8gYmFzZS5zZWxlY3RlZFggOiB1bmRlZmluZWQsXG4gICAgc2VsZWN0ZWRZOiBub3JtYWxpemVkWS5zZWxlY3RlZFksXG4gICAgc2VsZWN0ZWRZQWdncmVnYXRlOiBub3JtYWxpemVkWS5zZWxlY3RlZFlBZ2dyZWdhdGUsXG4gICAgc2VsZWN0ZWRHcm91cEJ5OiBoYXNPcHRpb24oY29uZmlnLmdyb3VwcywgYmFzZS5zZWxlY3RlZEdyb3VwQnkpID8gYmFzZS5zZWxlY3RlZEdyb3VwQnkgOiB1bmRlZmluZWQsXG4gICAgc2VsZWN0ZWRTbGljZXM6IChiYXNlLnNlbGVjdGVkU2xpY2VzIHx8IFtdKS5maWx0ZXIoc2xpY2VJZCA9PiBoYXNPcHRpb24oY29uZmlnLnNsaWNlcywgc2xpY2VJZCkpLFxuICAgIHNlbGVjdGVkVGVtcGxhdGU6IHVuZGVmaW5lZCxcbiAgfTtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplWVNlbGVjdGlvbihcbiAgc2VsZWN0ZWRZOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIHNlbGVjdGVkWUFnZ3JlZ2F0ZTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICB5RmllbGRzOiBPcmdhbml6ZXJZRmllbGRbXSB8IHVuZGVmaW5lZCxcbiAgZmFsbGJhY2tTdGF0ZT86IE9yZ2FuaXplclN0YXRlXG4pOiBQaWNrPE9yZ2FuaXplclN0YXRlLCAnc2VsZWN0ZWRZJyB8ICdzZWxlY3RlZFlBZ2dyZWdhdGUnPiB7XG4gIGlmICghc2VsZWN0ZWRZKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNlbGVjdGVkWTogZmFsbGJhY2tTdGF0ZT8uc2VsZWN0ZWRZLFxuICAgICAgc2VsZWN0ZWRZQWdncmVnYXRlOiBmYWxsYmFja1N0YXRlPy5zZWxlY3RlZFlBZ2dyZWdhdGUsXG4gICAgfTtcbiAgfVxuXG4gIGNvbnN0IGRpcmVjdEZpZWxkID0geUZpZWxkcz8uZmluZChmaWVsZCA9PiBmaWVsZC5pZCA9PT0gc2VsZWN0ZWRZKTtcbiAgaWYgKGRpcmVjdEZpZWxkKSB7XG4gICAgaWYgKCFkaXJlY3RGaWVsZC5hZ2dyZWdhdGVzPy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiB7IHNlbGVjdGVkWTogZGlyZWN0RmllbGQuaWQsIHNlbGVjdGVkWUFnZ3JlZ2F0ZTogdW5kZWZpbmVkIH07XG4gICAgfVxuXG4gICAgY29uc3QgbWF0Y2hlZEFnZ3JlZ2F0ZSA9IHNlbGVjdGVkWUFnZ3JlZ2F0ZVxuICAgICAgPyBkaXJlY3RGaWVsZC5hZ2dyZWdhdGVzLmZpbmQoYWdncmVnYXRlID0+IGFnZ3JlZ2F0ZS5pZCA9PT0gc2VsZWN0ZWRZQWdncmVnYXRlKVxuICAgICAgOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgZmFsbGJhY2tBZ2dyZWdhdGUgPSBmYWxsYmFja1N0YXRlPy5zZWxlY3RlZFkgPT09IGRpcmVjdEZpZWxkLmlkXG4gICAgICA/IGRpcmVjdEZpZWxkLmFnZ3JlZ2F0ZXMuZmluZChhZ2dyZWdhdGUgPT4gYWdncmVnYXRlLmlkID09PSBmYWxsYmFja1N0YXRlLnNlbGVjdGVkWUFnZ3JlZ2F0ZSlcbiAgICAgIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IHJlc29sdmVkQWdncmVnYXRlID0gbWF0Y2hlZEFnZ3JlZ2F0ZSA/PyBmYWxsYmFja0FnZ3JlZ2F0ZSA/PyBkaXJlY3RGaWVsZC5hZ2dyZWdhdGVzWzBdO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHNlbGVjdGVkWTogZGlyZWN0RmllbGQuaWQsXG4gICAgICBzZWxlY3RlZFlBZ2dyZWdhdGU6IHJlc29sdmVkQWdncmVnYXRlPy5pZCxcbiAgICB9O1xuICB9XG5cbiAgY29uc3QgYWdncmVnYXRlUGFyZW50ID0geUZpZWxkcz8uZmluZChmaWVsZCA9PiBmaWVsZC5hZ2dyZWdhdGVzPy5zb21lKGFnZ3JlZ2F0ZSA9PiBhZ2dyZWdhdGUuaWQgPT09IHNlbGVjdGVkWSkpO1xuICBpZiAoYWdncmVnYXRlUGFyZW50KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNlbGVjdGVkWTogYWdncmVnYXRlUGFyZW50LmlkLFxuICAgICAgc2VsZWN0ZWRZQWdncmVnYXRlOiBzZWxlY3RlZFksXG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgc2VsZWN0ZWRZOiBmYWxsYmFja1N0YXRlPy5zZWxlY3RlZFksXG4gICAgc2VsZWN0ZWRZQWdncmVnYXRlOiBmYWxsYmFja1N0YXRlPy5zZWxlY3RlZFlBZ2dyZWdhdGUsXG4gIH07XG59XG5cbmZ1bmN0aW9uIHNhbWVPcmdhbml6ZXJTdGF0ZShsZWZ0OiBPcmdhbml6ZXJTdGF0ZSwgcmlnaHQ6IE9yZ2FuaXplclN0YXRlKTogYm9vbGVhbiB7XG4gIHJldHVybiBsZWZ0LnNlbGVjdGVkWCA9PT0gcmlnaHQuc2VsZWN0ZWRYXG4gICAgJiYgbGVmdC5zZWxlY3RlZFkgPT09IHJpZ2h0LnNlbGVjdGVkWVxuICAgICYmIGxlZnQuc2VsZWN0ZWRZQWdncmVnYXRlID09PSByaWdodC5zZWxlY3RlZFlBZ2dyZWdhdGVcbiAgICAmJiBsZWZ0LnNlbGVjdGVkR3JvdXBCeSA9PT0gcmlnaHQuc2VsZWN0ZWRHcm91cEJ5XG4gICAgJiYgc2FtZVNsaWNlcyhsZWZ0LnNlbGVjdGVkU2xpY2VzIHx8IFtdLCByaWdodC5zZWxlY3RlZFNsaWNlcyB8fCBbXSk7XG59XG5cbmZ1bmN0aW9uIHNhbWVTbGljZXMobGVmdDogc3RyaW5nW10sIHJpZ2h0OiBzdHJpbmdbXSk6IGJvb2xlYW4ge1xuICBpZiAobGVmdC5sZW5ndGggIT09IHJpZ2h0Lmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuICBjb25zdCBzb3J0ZWRMZWZ0ID0gWy4uLmxlZnRdLnNvcnQoKGEsIGIpID0+IGEubG9jYWxlQ29tcGFyZShiKSk7XG4gIGNvbnN0IHNvcnRlZFJpZ2h0ID0gWy4uLnJpZ2h0XS5zb3J0KChhLCBiKSA9PiBhLmxvY2FsZUNvbXBhcmUoYikpO1xuICByZXR1cm4gc29ydGVkTGVmdC5ldmVyeSgodmFsdWUsIGluZGV4KSA9PiB2YWx1ZSA9PT0gc29ydGVkUmlnaHRbaW5kZXhdKTtcbn1cblxuZnVuY3Rpb24gaGFzT3B0aW9uKGl0ZW1zOiBBcnJheTx7IGlkOiBzdHJpbmcgfT4gfCB1bmRlZmluZWQsIGlkOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgcmV0dXJuICEhaWQgJiYgISFpdGVtcz8uc29tZShpdGVtID0+IGl0ZW0uaWQgPT09IGlkKTtcbn1cbiJdfQ==