@hestia-earth/ui-components 0.3.1 → 0.3.4

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/node/index.d.ts CHANGED
@@ -2,6 +2,7 @@ export * from './node-csv.service';
2
2
  export * from './node.module';
3
3
  export * from './node.service';
4
4
  export * from './node-diffs/node-diffs.model';
5
+ export * from './node-logs-models/node-logs-models.model';
5
6
  export { NodeCsvExportConfirmComponent } from './node-csv-export-confirm/node-csv-export-confirm.component';
6
7
  export { NodeCsvSelectHeadersComponent } from './node-csv-select-headers/node-csv-select-headers.component';
7
8
  export { NodeDiffsComponent } from './node-diffs/node-diffs.component';
@@ -1,6 +1,6 @@
1
1
  import { OnInit } from '@angular/core';
2
2
  import { Observable } from 'rxjs';
3
- import { IBlankNodeLogSubValue, IBlankNodeLog, LogStatus, IConfigModel } from '../node-logs.model';
3
+ import { IBlankNodeLogSubValue, IBlankNodeLog, LogStatus, IConfigModel } from './node-logs-models.model';
4
4
  import { HeNodeService } from '../node.service';
5
5
  import { HeEngineService } from '../../engine/engine.service';
6
6
  import { HeSearchService } from '../../search/search.service';
@@ -9,6 +9,7 @@ export declare class NodeLogsModelsComponent implements OnInit {
9
9
  private nodeService;
10
10
  private searchService;
11
11
  private engineService;
12
+ private logs;
12
13
  private allTerms;
13
14
  private allBlankNodes;
14
15
  private node?;
@@ -57,6 +58,7 @@ export declare class NodeLogsModelsComponent implements OnInit {
57
58
  suggestTerm: (text$: Observable<string>) => Observable<string[]>;
58
59
  constructor(nodeService: HeNodeService, searchService: HeSearchService, engineService: HeEngineService);
59
60
  ngOnInit(): Promise<void>;
61
+ private getLogs;
60
62
  private suggestByTerm;
61
63
  trackByBlankNode(_index: number, node: IBlankNodeLog): string;
62
64
  get filteredType(): string;
@@ -1,5 +1,5 @@
1
1
  import { Emission, ITermJSONLD, Product, Input as HestiaInput, NodeType, TermTermType, Property, SchemaType } from '@hestia-earth/schema';
2
- import { IOrchestratorConfig, IModel } from '../engine/engine.service';
2
+ import { IOrchestratorConfig, IModel } from '../../engine/engine.service';
3
3
  export interface INodeMissingLookupLog {
4
4
  filename: string;
5
5
  termId: string;
@@ -26,7 +26,8 @@ export interface INodeTermLog {
26
26
  export interface INodeTermLogs {
27
27
  [modelKey: string]: any | INodeTermLog;
28
28
  models: string[];
29
- isKey: boolean;
29
+ isKey?: boolean;
30
+ isProperty?: boolean;
30
31
  }
31
32
  export interface INodeLogs {
32
33
  [term: string]: INodeTermLogs;
@@ -1,6 +1,6 @@
1
1
  import { OnInit } from '@angular/core';
2
2
  import { JSONLD, NodeType } from '@hestia-earth/schema';
3
- import { INodeMissingLookupLog } from '../node-logs.model';
3
+ import { INodeMissingLookupLog } from '../node-logs-models/node-logs-models.model';
4
4
  import { HeNodeService } from '../node.service';
5
5
  import * as i0 from "@angular/core";
6
6
  export declare class NodeMissingLookupFactorsComponent implements OnInit {
@@ -10,8 +10,9 @@ export declare class NodeValueDetailsComponent<T> implements OnInit {
10
10
  keys: string[];
11
11
  additionalKeys: string[];
12
12
  tableKeys: string[];
13
- get type(): any;
14
13
  ngOnInit(): void;
14
+ get type(): any;
15
+ get showInline(): boolean;
15
16
  static ɵfac: i0.ɵɵFactoryDeclaration<NodeValueDetailsComponent<any>, never>;
16
17
  static ɵcmp: i0.ɵɵComponentDeclaration<NodeValueDetailsComponent<any>, "he-node-value-details", never, { "data": "data"; "nodeType": "nodeType"; "dataKey": "dataKey"; }, {}, never, never>;
17
18
  }
@@ -1,7 +1,7 @@
1
1
  import { HttpClient } from '@angular/common/http';
2
2
  import { DataState } from '@hestia-earth/api';
3
3
  import { ICycleJSONLD, IImpactAssessmentJSONLD, ISiteJSONLD, NodeType, TermTermType } from '@hestia-earth/schema';
4
- import { INodeMissingLookupLog } from './node-logs.model';
4
+ import { INodeMissingLookupLog } from './node-logs-models/node-logs-models.model';
5
5
  import { HeCommonService } from '../common/common.service';
6
6
  import { HeAuthService } from '../auth/auth.service';
7
7
  import * as i0 from "@angular/core";
@@ -33,6 +33,10 @@ export interface IJSONData {
33
33
  [NodeType.Site]?: ISiteJSONLD[];
34
34
  [NodeType.ImpactAssessment]?: IImpactAssessmentJSONLD[];
35
35
  }
36
+ export interface INodeErrorLog {
37
+ error: string;
38
+ stack?: string;
39
+ }
36
40
  export declare class HeNodeService {
37
41
  protected http: HttpClient;
38
42
  protected authService: HeAuthService;
@@ -42,7 +46,7 @@ export declare class HeNodeService {
42
46
  get<T>(node: IJSONNode, defaultForState?: boolean): Promise<T>;
43
47
  getLog({ dataState, ...node }: IJSONNode): import("rxjs").Observable<string>;
44
48
  getMissingLookupsLog({ dataState, ...node }: IJSONNode): Promise<INodeMissingLookupLog[]>;
45
- getModelsLog({ dataState, ...node }: IJSONNode): Promise<any>;
49
+ getErrorLog({ dataState, ...node }: IJSONNode): Promise<INodeErrorLog>;
46
50
  triggerPipeline({ dataState, ...node }: IJSONNode): Promise<Object>;
47
51
  downloadRaw<T = any>(url: string, responseType?: any): Promise<T>;
48
52
  nodeTypeUrl(type: any): string;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hestia-earth/ui-components",
3
- "version": "0.3.1",
3
+ "version": "0.3.4",
4
4
  "description": "Hestia reusable components",
5
5
  "repository": {
6
6
  "type": "git",
@@ -1,370 +0,0 @@
1
- import { __rest } from "tslib";
2
- /* eslint-disable complexity */
3
- import { from } from 'rxjs';
4
- import { distinct, toArray, map } from 'rxjs/operators';
5
- import { fileToExt, SupportedExtensions } from '@hestia-earth/api';
6
- import { EmissionMethodTier, TermTermType, SchemaType, isTypeNode } from '@hestia-earth/schema';
7
- import { unique, isUndefined } from '@hestia-earth/utils';
8
- import { propertyValue } from '@hestia-earth/utils/dist/term';
9
- const get = require('lodash.get');
10
- const set = require('lodash.set');
11
- const orderBy = require('lodash.orderby');
12
- import { findConfigModels, findModels, findMatchingModel, modelParams, modelKeyParams } from '../engine/engine.service';
13
- const termTypes = Object.values(TermTermType);
14
- const blankNodeTypes = Object.values(SchemaType).filter(t => !isTypeNode(t));
15
- const schemaTypesLowerCase = Object.values(SchemaType).map(v => v.toLowerCase());
16
- const blankNodeTypesLowerCase = blankNodeTypes.map(v => v.toLowerCase());
17
- const missingLookupPrefix = 'Missing lookup';
18
- const parseFilename = (filepath) => {
19
- const [filename] = filepath.split('.');
20
- const ext = termTypes.includes(filename) ? SupportedExtensions.xlsx : SupportedExtensions.csv;
21
- return fileToExt(filename, ext);
22
- };
23
- const parseLookup = ({ column, termid, [missingLookupPrefix]: missingLookup }) => ({
24
- filename: parseFilename(missingLookup), termId: termid, column
25
- });
26
- const csvValue = (value) => (value || '').replace('[', '').replace(']', '');
27
- const parseMessage = (message) => {
28
- try {
29
- const data = JSON.parse(message);
30
- return data.message.split(',').reduce((prev, parts) => {
31
- const [key, value] = parts.split('=');
32
- const val = csvValue(value);
33
- return Object.assign(Object.assign({}, prev), (key && val ? { [key.trim()]: val } : {}));
34
- }, { logger: data.logger });
35
- }
36
- catch (err) {
37
- // make sure it works even if one log is malformed
38
- return {};
39
- }
40
- };
41
- const omitLogKeys = (log) => Object.fromEntries(Object.entries(log).filter(([key]) => !schemaTypesLowerCase.includes(key)));
42
- const includeBlankNodes = (logs, log) => Object
43
- .keys(log)
44
- .filter(key => blankNodeTypesLowerCase.includes(key))
45
- .reduce((prev, key) => (Object.assign(Object.assign({}, prev), { [key]: unique([
46
- ...((typeof prev[key] === 'string' ? [prev[key]] : prev[key]) || []),
47
- log[key]
48
- ]) })), logs);
49
- const groupLog = (group, _a) => {
50
- var { logger, term, model, key, should_run, run_required, property } = _a, log = __rest(_a, ["logger", "term", "model", "key", "should_run", "run_required", "property"]);
51
- const isOrchestrator = logger.includes('orchestrator');
52
- const isKey = !isOrchestrator && !!key;
53
- const parentLogKey = [`["${term}"]`, !isOrchestrator && key || property].filter(Boolean).join('.');
54
- const logModelKey = [parentLogKey, model].filter(Boolean).join('.');
55
- set(group, `${parentLogKey}.models`, unique([
56
- ...get(group, `${parentLogKey}.models`, []),
57
- model
58
- ]));
59
- set(group, `${parentLogKey}.isKey`, isKey);
60
- let data = get(group, logModelKey, {});
61
- data = includeBlankNodes(data, log);
62
- if (typeof should_run !== 'undefined') {
63
- const shouldRun = should_run === 'True';
64
- data = isOrchestrator ? Object.assign(Object.assign({}, data), { shouldRunOrchestrator: shouldRun }) : Object.assign(Object.assign(Object.assign({}, data), omitLogKeys(log)), { shouldRun });
65
- }
66
- else if (typeof run_required !== 'undefined') {
67
- const runRequired = run_required === 'True';
68
- data = Object.assign(Object.assign(Object.assign({}, data), (runRequired ? {} : omitLogKeys(log))), { // no need to save logs if we need to run the model
69
- runRequired });
70
- }
71
- else if ('requirements' in log) {
72
- const { requirements } = log, logData = __rest(log, ["requirements"]);
73
- data.requirements = Object.assign(Object.assign({}, (data.requirements || {})), logData);
74
- }
75
- else if (missingLookupPrefix in log) {
76
- data.missingLookups = unique([
77
- ...(data.missingLookups || []),
78
- parseLookup(log)
79
- ]);
80
- }
81
- else if (!isOrchestrator) {
82
- data.logs = Object.assign(Object.assign({}, (data.logs || {})), omitLogKeys(log));
83
- }
84
- set(group, logModelKey, data);
85
- return group;
86
- };
87
- const groupLogSubValue = (group, log, key) => {
88
- const id = log[key];
89
- const data = groupLog(group[id] || {}, log);
90
- group[id] = data;
91
- if (key === 'transformation') {
92
- // add value to the same term/model on parent group
93
- Object.entries(group[id]).map(([term, models]) => Object.keys(models).map(model => {
94
- var _a;
95
- if ((_a = group === null || group === void 0 ? void 0 : group[term]) === null || _a === void 0 ? void 0 : _a[model]) {
96
- group[term][model][key] = unique([
97
- ...(group[term][model][key] || []),
98
- id
99
- ]);
100
- }
101
- }));
102
- }
103
- return group;
104
- };
105
- const subValueKeys = [
106
- 'transformation'
107
- ];
108
- export const groupLogsByModel = (data) => data.split('\n')
109
- .map(parseMessage)
110
- .filter(v => !!(v === null || v === void 0 ? void 0 : v.term) && (v === null || v === void 0 ? void 0 : v.term) !== 'None' && !!(v === null || v === void 0 ? void 0 : v.model))
111
- .reduce((group, log) => {
112
- const subValue = subValueKeys.find(v => !!log[v]);
113
- return subValue ?
114
- subValue === 'transformation' ?
115
- // for transformation, do not add to top-level model
116
- groupLogSubValue(group, log, subValue) :
117
- groupLog(groupLogSubValue(group, log, subValue), log)
118
- : groupLog(group, log);
119
- });
120
- export const computeTerms = (originalValues, recalculatedValues, terms, filterTermTypes) => from((terms === null || terms === void 0 ? void 0 : terms.length) ?
121
- terms :
122
- [
123
- ...(originalValues || []).map(({ term }) => term),
124
- ...(recalculatedValues || []).map(({ term }) => term)
125
- ].filter(node => !(filterTermTypes === null || filterTermTypes === void 0 ? void 0 : filterTermTypes.length) || filterTermTypes.includes(node.termType))).pipe(distinct(v => v['@id']), toArray(), map(v => orderBy(v, ['name'], ['asc']))).toPromise();
126
- export var LogStatus;
127
- (function (LogStatus) {
128
- LogStatus["success"] = "successful";
129
- LogStatus["error"] = "failed";
130
- LogStatus["skipHierarchy"] = "not run (model higher up hierarchy run instead)";
131
- LogStatus["dataProvided"] = "not run (user provided data retained)";
132
- LogStatus["notRequired"] = "not relevant";
133
- })(LogStatus || (LogStatus = {}));
134
- const hasLogDetails = (data, logs) => {
135
- var _a;
136
- return [
137
- LogStatus.success,
138
- LogStatus.error
139
- ].includes(logStatus(data, logs)) && ((logs === null || logs === void 0 ? void 0 : logs.requirements) || (logs === null || logs === void 0 ? void 0 : logs.logs) || ((_a = logs === null || logs === void 0 ? void 0 : logs.missingLookups) === null || _a === void 0 ? void 0 : _a.length));
140
- };
141
- const logStatus = (data, logs) => hasLog(logs)
142
- ? (!data.isRequired
143
- ? LogStatus.notRequired
144
- : isRunOrchestrator(logs)
145
- ? ('shouldRun' in logs
146
- ? logs.shouldRun
147
- ? data.isRecalculated
148
- ? LogStatus.success
149
- : LogStatus.dataProvided
150
- : LogStatus.error
151
- : LogStatus.dataProvided)
152
- : data.isRecalculated
153
- ? LogStatus.skipHierarchy
154
- : LogStatus.dataProvided)
155
- : ([
156
- typeof data.originalValue === 'undefined',
157
- data.isRecalculated // is recalculated
158
- ].every(Boolean)
159
- ? LogStatus.skipHierarchy
160
- : LogStatus.dataProvided);
161
- const reduceValues = (values, termId) => {
162
- const propertyValues = values
163
- .map(({ value }) => propertyValue(value, termId))
164
- // propertyValue may return null if the value is null or undefined, therefore remove them from total
165
- .filter(v => v !== null);
166
- return propertyValues.length ? propertyValues.reduce((p, v) => p + v, 0) : undefined;
167
- };
168
- const isRunOrchestrator = (log) => !('shouldRunOrchestrator' in log) || log.shouldRunOrchestrator;
169
- const isBackground = (log) => (log === null || log === void 0 ? void 0 : log.methodTier) === EmissionMethodTier.background;
170
- const hasLog = (log, withOrchestrator = true) => !!log && ('shouldRun' in log ||
171
- 'runRequired' in log ||
172
- (withOrchestrator && 'shouldRunOrchestrator' in log));
173
- const isRecalculated = (values, key = 'value') => values.some(v => ([
174
- ...(v.added || []),
175
- ...(v.updated || [])
176
- ]).includes(key));
177
- const blankNodeValueByKey = {
178
- property: (values, _k, id) => {
179
- var _a;
180
- return !!id && (values === null || values === void 0 ? void 0 : values.length)
181
- ? ((_a = (values[0].properties || []).find(p => p.term['@id'] === id)) === null || _a === void 0 ? void 0 : _a.value) || ''
182
- : '';
183
- },
184
- input: (values, _k, id) => {
185
- var _a;
186
- return !!id && (values === null || values === void 0 ? void 0 : values.length)
187
- ? propertyValue((_a = values.find(({ inputs }) => (inputs || []).some(input => input['@id'] === id))) === null || _a === void 0 ? void 0 : _a.value, id)
188
- : '';
189
- },
190
- default: (blankNodes, key) => {
191
- const value = (blankNodes === null || blankNodes === void 0 ? void 0 : blankNodes.length) ? blankNodes[0][key] : null;
192
- return ['string', 'number', 'boolean', 'undefined'].includes(typeof value)
193
- ? isUndefined(value)
194
- ? ''
195
- : value
196
- : null;
197
- }
198
- };
199
- const blankNodeValue = (blankNodes, key, id) => blankNodeValueByKey[key in blankNodeValueByKey ? key : 'default'](blankNodes, key, id);
200
- const logSubValue = (logs, key, prop) => logs[key][prop] ? (Array.isArray(logs[key][prop]) ?
201
- logs[key][prop].map(id => ({ key: prop, id })) :
202
- { key: prop, id: logs[key][prop] }) : undefined;
203
- const logProperties = (nodes, models) => nodes.flatMap(node => (node.properties || []).map(({ term }) => term['@id'])).map(id => ({ key: 'property', id, configModels: findModels(models, id).map(({ model }) => model) }));
204
- const logSubValues = (allLogs, logs, original, recalculated, models, { nodeType, type, termId }) => unique([
205
- ...Object.keys(logs).flatMap(key => [
206
- logSubValue(logs, key, 'input'),
207
- logSubValue(logs, key, 'property')
208
- ]
209
- .flat()
210
- .filter(Boolean)
211
- .map(v => (Object.assign(Object.assign({}, v), { configModels: [key] })))),
212
- ...logProperties(original, models),
213
- ...logProperties(recalculated, models)
214
- ])
215
- .map(v => {
216
- const originalValue = blankNodeValue(original, v.key, v.id);
217
- const recalculatedValue = blankNodeValue(recalculated, v.key, v.id);
218
- return Object.assign(Object.assign({}, v), { configModels: v.configModels.map(configModelWithDocs(models, { nodeType, type, termId }, v)), originalValue,
219
- recalculatedValue, isRecalculated: !isUndefined(recalculatedValue) && recalculatedValue !== originalValue, isRequired: true });
220
- })
221
- .filter(v => v.configModels.length > 0)
222
- .map(dataWithConfigModelLogs(allLogs));
223
- // const hasKey = (blankNodes: blankNode[], key: string) => (blankNodes || []).some(n => key in n);
224
- const logKeys = (logs, original, recalculated, models, { nodeType, type, termId }) => Object.keys(logs)
225
- .filter(key => logs[key].isKey)
226
- .map(key => ({
227
- key,
228
- configModels: (logs[key].models || [])
229
- .map(configModelWithDocs(models, { nodeType, type, termId }, { key }))
230
- // only take those we found a matching model (avoid matching key on wrong node type)
231
- .filter(v => !!v.model),
232
- originalValue: blankNodeValue(original, key),
233
- recalculatedValue: blankNodeValue(recalculated, key),
234
- isRecalculated: isRecalculated(recalculated, key),
235
- isRequired: true
236
- }))
237
- .filter(v => v.configModels.length > 0)
238
- .map(dataWithConfigModelLogs(logs));
239
- const isBackgroundNoInput = (logs) => logs.methodTier === EmissionMethodTier.background && !logs.input;
240
- const isModelLog = (logs) => [
241
- !isBackgroundNoInput(logs),
242
- !logs.isKey,
243
- !logs.input,
244
- !logs.property
245
- ].every(Boolean) && [
246
- 'shouldRun' in logs,
247
- 'shouldRunOrchestrator' in logs,
248
- 'runRequired' in logs
249
- ].some(Boolean);
250
- const modelConfigOrder = (models, termId, modelKey, model) => {
251
- const indexes = models.map((m, index) => {
252
- const arrayIndex = Array.isArray(m) ? modelConfigOrder(m, termId, modelKey, model) : '';
253
- return Array.isArray(m)
254
- ? arrayIndex
255
- ? [index, arrayIndex].join('.')
256
- : ''
257
- : [termId === m.value, modelKey === m.key, model === m.model].every(Boolean)
258
- ? `${index}`
259
- : '';
260
- }).filter(Boolean);
261
- return indexes.length ? indexes[0] : '';
262
- };
263
- const configModelWithDocs = (models, { nodeType, type, termId }, subValue) => (methodId) => {
264
- const node = {
265
- '@type': nodeType,
266
- term: { '@id': (subValue === null || subValue === void 0 ? void 0 : subValue.id) || termId },
267
- methodModel: { '@id': methodId }
268
- };
269
- return {
270
- methodId,
271
- model: findMatchingModel(models, modelParams(node)) ||
272
- findMatchingModel(models, modelKeyParams(node, `${subValue === null || subValue === void 0 ? void 0 : subValue.key}.${methodId}`)) ||
273
- // handle "input.price"
274
- findMatchingModel(models, modelKeyParams(node, `${type.toLowerCase()}.${subValue === null || subValue === void 0 ? void 0 : subValue.key}`)) ||
275
- // handle "input.hestiaAggregatedData"
276
- findMatchingModel(models, modelKeyParams(node, `${type.toLowerCase()}.${methodId}`))
277
- };
278
- };
279
- const configModelWithLogs = (data, logs) => (model) => (Object.assign(Object.assign({}, model), { logs: logs === null || logs === void 0 ? void 0 : logs[model.methodId], status: logStatus(data, logs === null || logs === void 0 ? void 0 : logs[model.methodId]), showLogs: hasLogDetails(data, logs === null || logs === void 0 ? void 0 : logs[model.methodId]) }));
280
- const dataWithConfigModelLogs = (logs) => (data) => {
281
- const subLogKey = data.id || data.key ?
282
- data.id || data.key : null;
283
- const log = subLogKey ? logs[subLogKey] : logs;
284
- return Object.assign(Object.assign({}, data), { configModels: data.configModels.map(model => Array.isArray(model) ? model.map(configModelWithLogs(data, log)) : configModelWithLogs(data, log)(model)) });
285
- };
286
- /**
287
- * Group models running in parallel under the same array, as they should appear vertically.
288
- *
289
- * @param config The configuration.
290
- * @param models The list of models
291
- */
292
- const groupParallelModels = (config, termId, modelKey, models) => {
293
- const modelsWithOrder = models.map(model => ({
294
- model,
295
- order: modelConfigOrder(config.models, termId, modelKey, model.methodId)
296
- }));
297
- return modelsWithOrder
298
- .reduce((prev, { model, order }) => {
299
- const isArray = order.includes('.');
300
- const arrayIndex = isArray ? order.split('.')[0] : prev.length;
301
- prev[arrayIndex] = isArray ? [...(prev[arrayIndex] || []), model] : model;
302
- return prev;
303
- }, [])
304
- .filter(Boolean)
305
- .map(v => v.length === 1 ? v[0] : v);
306
- };
307
- const allParallel = (models) => models.length === 1 && Array.isArray(models[0]) && models[0].length > 1;
308
- const valueByMethodId = (values, methodId, termId) => { var _a; return propertyValue((_a = values.find(v => { var _a; return ((_a = v.methodModel) === null || _a === void 0 ? void 0 : _a['@id']) === methodId; })) === null || _a === void 0 ? void 0 : _a.value, termId); };
309
- const groupParallelValues = (values, models, termId) => Array.isArray(models)
310
- ? Object.fromEntries(models.map(model => [model.methodId, valueByMethodId(values, model.methodId, termId)]))
311
- : {};
312
- export const groupLogsByTerm = (nodeType, logs, models, config, allOriginalValues, allRecalculatedValues, nodeKey) => {
313
- const originalValues = (allOriginalValues || []).filter(value => !value.deleted);
314
- const recalculatedValues = (allRecalculatedValues || []).filter(value => !value.deleted);
315
- const type = originalValues.length ?
316
- originalValues[0]['@type'] || originalValues[0].type :
317
- recalculatedValues.length ?
318
- recalculatedValues[0]['@type'] || recalculatedValues[0].type :
319
- undefined;
320
- return (term) => {
321
- const termId = term['@id'];
322
- const termLogs = get(logs, termId, {});
323
- const original = originalValues.filter(v => termId === v.term['@id']);
324
- const recalculated = recalculatedValues.filter(v => termId === v.term['@id']);
325
- const hasData = !!original.length || !!recalculated.length || Object.keys(termLogs).length > 0;
326
- const configModelsData = { nodeType, type, termId };
327
- const configModels = groupParallelModels(config, termId, nodeKey, unique([
328
- ...(termLogs.models || []).filter(key => isModelLog(termLogs[key])),
329
- ...findConfigModels(config, termId, nodeKey, models).map(({ model }) => model)
330
- ]).map(configModelWithDocs(models, configModelsData)));
331
- const keys = logKeys(termLogs, original, recalculated, models, configModelsData);
332
- const subValues = logSubValues(logs, termLogs, original, recalculated, models, configModelsData);
333
- const isRequired = !Object.values(termLogs)
334
- .filter(v => typeof v === 'object' && !Array.isArray(v))
335
- // ignore models that were never going to run
336
- .filter(isRunOrchestrator)
337
- .every(v => v.runRequired === false);
338
- return dataWithConfigModelLogs(termLogs)({
339
- isOpen: true,
340
- canOpen: keys.length > 0 || subValues.length > 0,
341
- termId,
342
- term,
343
- type,
344
- configModels,
345
- original,
346
- originalValue: reduceValues(original, termId),
347
- recalculated,
348
- recalculatedValue: reduceValues(recalculated, termId),
349
- isOriginal: !!original.length,
350
- isRecalculated: isRecalculated(recalculated),
351
- hasData,
352
- isRequired,
353
- logs: termLogs,
354
- keys,
355
- subValues,
356
- allParallel: allParallel(configModels),
357
- originalValueByMethodId: groupParallelValues(original, configModels[0], termId),
358
- recalculatedValueByMethodId: groupParallelValues(recalculated, configModels[0], termId)
359
- });
360
- };
361
- };
362
- export const modelCount = (blankNodeLogs) => Math.max.apply(Math.max, [
363
- 0,
364
- ...blankNodeLogs.flatMap(v => [
365
- v.configModels.length,
366
- ...v.subValues.map(s => { var _a, _b; return (_b = (_a = s.configModels) === null || _a === void 0 ? void 0 : _a.length) !== null && _b !== void 0 ? _b : 0; }),
367
- v.keys.length ? 1 : 0
368
- ])
369
- ]);
370
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9kZS1sb2dzLm1vZGVsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL25vZGUvbm9kZS1sb2dzLm1vZGVsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSwrQkFBK0I7QUFDL0IsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUM1QixPQUFPLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4RCxPQUFPLEVBQUUsU0FBUyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDbkUsT0FBTyxFQUNLLGtCQUFrQixFQUNsQixZQUFZLEVBQVksVUFBVSxFQUFFLFVBQVUsRUFDekQsTUFBTSxzQkFBc0IsQ0FBQztBQUM5QixPQUFPLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQzFELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUM5RCxNQUFNLEdBQUcsR0FBRyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUM7QUFDbEMsTUFBTSxHQUFHLEdBQUcsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDO0FBQ2xDLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0FBRTFDLE9BQU8sRUFDMEMsZ0JBQWdCLEVBQUUsVUFBVSxFQUMzRSxpQkFBaUIsRUFBRSxXQUFXLEVBQUUsY0FBYyxFQUMvQyxNQUFNLDBCQUEwQixDQUFDO0FBbUNsQyxNQUFNLFNBQVMsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDO0FBRTlDLE1BQU0sY0FBYyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUU3RSxNQUFNLG9CQUFv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QUUsTUFBTSxDQUFDO1NBQ3hGLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQztBQUNKLENBQUMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLFVBQVUsR0FBRyxDQUFDLGFBQThCLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUU7SUFDckYsQ0FBQztJQUNELEdBQUcsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQzVCLENBQUMsQ0FBQyxZQUFZLENBQUMsTUFBTTtRQUNyQixHQUFHLENBQUMsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLGVBQUMsT0FBQSxNQUFBLE1BQUEsQ0FBQyxDQUFDLFlBQVksMENBQUUsTUFBTSxtQ0FBSSxDQUFDLENBQUEsRUFBQSxDQUFDO1FBQ3BELENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7S0FDdEIsQ0FBQztDQUNILENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIGNvbXBsZXhpdHkgKi9cbmltcG9ydCB7IGZyb20gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGRpc3RpbmN0LCB0b0FycmF5LCBtYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBmaWxlVG9FeHQsIFN1cHBvcnRlZEV4dGVuc2lvbnMgfSBmcm9tICdAaGVzdGlhLWVhcnRoL2FwaSc7XG5pbXBvcnQge1xuICBFbWlzc2lvbiwgRW1pc3Npb25NZXRob2RUaWVyLCBJVGVybUpTT05MRCwgUHJvZHVjdCwgSW5wdXQgYXMgSGVzdGlhSW5wdXQsXG4gIE5vZGVUeXBlLCBUZXJtVGVybVR5cGUsIFByb3BlcnR5LCBTY2hlbWFUeXBlLCBpc1R5cGVOb2RlXG59IGZyb20gJ0BoZXN0aWEtZWFydGgvc2NoZW1hJztcbmltcG9ydCB7IHVuaXF1ZSwgaXNVbmRlZmluZWQgfSBmcm9tICdAaGVzdGlhLWVhcnRoL3V0aWxzJztcbmltcG9ydCB7IHByb3BlcnR5VmFsdWUgfSBmcm9tICdAaGVzdGlhLWVhcnRoL3V0aWxzL2Rpc3QvdGVybSc7XG5jb25zdCBnZXQgPSByZXF1aXJlKCdsb2Rhc2guZ2V0Jyk7XG5jb25zdCBzZXQgPSByZXF1aXJlKCdsb2Rhc2guc2V0Jyk7XG5jb25zdCBvcmRlckJ5ID0gcmVxdWlyZSgnbG9kYXNoLm9yZGVyYnknKTtcblxuaW1wb3J0IHtcbiAgSU9yY2hlc3RyYXRvckNvbmZpZywgSU9yY2hlc3RyYXRvck1vZGVsQ29uZmlnLCBmaW5kQ29uZmlnTW9kZWxzLCBmaW5kTW9kZWxzLCBJTW9kZWwsXG4gIGZpbmRNYXRjaGluZ01vZGVsLCBtb2RlbFBhcmFtcywgbW9kZWxLZXlQYXJhbXNcbn0gZnJvbSAnLi4vZW5naW5lL2VuZ2luZS5zZXJ2aWNlJztcblxuZXhwb3J0IGludGVyZmFjZSBJTm9kZU1pc3NpbmdMb29rdXBMb2cge1xuICBmaWxlbmFtZTogc3RyaW5nO1xuICB0ZXJtSWQ6IHN0cmluZztcbiAgY29sdW1uOiBzdHJpbmc7XG4gIC8vIGF0dHJpYnV0ZXMgbGlua2VkIHRvIHRoZSBtb2RlbHNcbiAgbW9kZWw/OiBzdHJpbmc7XG4gIHRlcm0/OiBzdHJpbmc7XG4gIGtleT86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJTm9kZVRlcm1Mb2cge1xuICBydW5SZXF1aXJlZD86IGJvb2xlYW47XG4gIHNob3VsZFJ1bj86IGJvb2xlYW47XG4gIHNob3VsZFJ1bk9yY2hlc3RyYXRvcj86IGJvb2xlYW47XG4gIG1pc3NpbmdMb29rdXBzPzogSU5vZGVNaXNzaW5nTG9va3VwTG9nW107XG4gIHJlcXVpcmVtZW50cz86IHsgW2tleTogc3RyaW5nXTogYW55IH07XG4gIGxvZ3M/OiB7IFtrZXk6IHN0cmluZ106IGFueSB9O1xuICBba2V5OiBzdHJpbmddOiBhbnk7XG4gIC8vIHBvc3NpYmxlIHN1YiB2YWx1ZXNcbiAgaW5wdXQ/OiBzdHJpbmcgfCBzdHJpbmdbXTtcbiAgcHJvcGVydHk/OiBzdHJpbmcgfCBzdHJpbmdbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJTm9kZVRlcm1Mb2dzIHtcbiAgW21vZGVsS2V5OiBzdHJpbmddOiBhbnkgfCBJTm9kZVRlcm1Mb2c7XG4gIG1vZGVsczogc3RyaW5nW107XG4gIGlzS2V5OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElOb2RlTG9ncyB7XG4gIFt0ZXJtOiBzdHJpbmddOiBJTm9kZVRlcm1Mb2dzO1xufVxuXG5jb25zdCB0ZXJtVHlwZXMgPSBPYmplY3QudmFsdWVzKFRlcm1UZXJtVHlwZSk7XG5cbmNvbnN0IGJsYW5rTm9kZVR5cGVzID0gT2JqZWN0LnZhbHVlcyhTY2hlbWFUeXBlKS5maWx0ZXIodCA9PiAhaXNUeXBlTm9kZSh0KSk7XG5cbmNvbnN0IHNjaGVtYVR5cGVzTG93ZXJDYXNlID0gT2JqZWN0LnZhbHVlcyhTY2hlbWFUeXBlKS5tYXAodiA9PiB2LnRvTG93ZXJDYXNlKCkpO1xuXG5jb25zdCBibGFua05vZGVUeXBlc0xvd2VyQ2FzZSA9IGJsYW5rTm9kZVR5cGVzLm1hcCh2ID0+IHYudG9Mb3dlckNhc2UoKSk7XG5cbmNvbnN0IG1pc3NpbmdMb29rdXBQcmVmaXggPSAnTWlzc2luZyBsb29rdXAnO1xuXG5jb25zdCBwYXJzZUZpbGVuYW1lID0gKGZpbGVwYXRoOiBzdHJpbmcpID0+IHtcbiAgY29uc3QgW2ZpbGVuYW1lXSA9IGZpbGVwYXRoLnNwbGl0KCcuJyk7XG4gIGNvbnN0IGV4dCA9IHRlcm1UeXBlcy5pbmNsdWRlcyhmaWxlbmFtZSBhcyBhbnkpID8gU3VwcG9ydGVkRXh0ZW5zaW9ucy54bHN4IDogU3VwcG9ydGVkRXh0ZW5zaW9ucy5jc3Y7XG4gIHJldHVybiBmaWxlVG9FeHQoZmlsZW5hbWUsIGV4dCk7XG59O1xuXG5jb25zdCBwYXJzZUxvb2t1cCA9ICh7IGNvbHVtbiwgdGVybWlkLCBbbWlzc2luZ0xvb2t1cFByZWZpeF06IG1pc3NpbmdMb29rdXAgfSkgPT4gKHtcbiAgZmlsZW5hbWU6IHBhcnNlRmlsZW5hbWUobWlzc2luZ0xvb2t1cCksIHRlcm1JZDogdGVybWlkLCBjb2x1bW5cbn0pO1xuXG5jb25zdCBjc3ZWYWx1ZSA9ICh2YWx1ZTogc3RyaW5nKSA9PiAodmFsdWUgfHwgJycpLnJlcGxhY2UoJ1snLCAnJykucmVwbGFjZSgnXScsICcnKTtcblxuY29uc3QgcGFyc2VNZXNzYWdlID0gKG1lc3NhZ2U6IHN0cmluZykgPT4ge1xuICB0cnkge1xuICAgIGNvbnN0IGRhdGEgPSBKU09OLnBhcnNlKG1lc3NhZ2UpO1xuICAgIHJldHVybiBkYXRhLm1lc3NhZ2Uuc3BsaXQoJywnKS5yZWR1Y2UoKHByZXYsIHBhcnRzKSA9PiB7XG4gICAgICBjb25zdCBba2V5LCB2YWx1ZV0gPSBwYXJ0cy5zcGxpdCgnPScpO1xuICAgICAgY29uc3QgdmFsID0gY3N2VmFsdWUodmFsdWUpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4ucHJldixcbiAgICAgICAgLi4uKGtleSAmJiB2YWwgPyB7IFtrZXkudHJpbSgpXTogdmFsIH0gOiB7fSlcbiAgICAgIH07XG4gICAgfSwgeyBsb2dnZXI6IGRhdGEubG9nZ2VyIH0pO1xuICB9XG4gIGNhdGNoIChlcnIpIHtcbiAgICAvLyBtYWtlIHN1cmUgaXQgd29ya3MgZXZlbiBpZiBvbmUgbG9nIGlzIG1hbGZvcm1lZFxuICAgIHJldHVybiB7fTtcbiAgfVxufTtcblxuY29uc3Qgb21pdExvZ0tleXMgPSAobG9nOiBhbnkpID0+XG4gIE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhsb2cpLmZpbHRlcigoW2tleV0pID0+ICFzY2hlbWFUeXBlc0xvd2VyQ2FzZS5pbmNsdWRlcyhrZXkpKSk7XG5cbmNvbnN0IGluY2x1ZGVCbGFua05vZGVzID0gKGxvZ3MsIGxvZykgPT5cbiAgT2JqZWN0XG4gICAgLmtleXMobG9nKVxuICAgIC5maWx0ZXIoa2V5ID0+IGJsYW5rTm9kZVR5cGVzTG93ZXJDYXNlLmluY2x1ZGVzKGtleSkpXG4gICAgLnJlZHVjZSgocHJldiwga2V5KSA9PiAoe1xuICAgICAgLi4ucHJldixcbiAgICAgIFtrZXldOiB1bmlxdWUoW1xuICAgICAgICAuLi4oKHR5cGVvZiBwcmV2W2tleV0gPT09ICdzdHJpbmcnID8gW3ByZXZba2V5XV0gOiBwcmV2W2tleV0pIHx8IFtdKSxcbiAgICAgICAgbG9nW2tleV1cbiAgICAgIF0pXG4gICAgfSksIGxvZ3MpO1xuXG5jb25zdCBncm91cExvZyA9IChncm91cCwgeyBsb2dnZXIsIHRlcm0sIG1vZGVsLCBrZXksIHNob3VsZF9ydW4sIHJ1bl9yZXF1aXJlZCwgcHJvcGVydHksIC4uLmxvZyB9OiBhbnkpID0+IHtcbiAgY29uc3QgaXNPcmNoZXN0cmF0b3IgPSBsb2dnZXIuaW5jbHVkZXMoJ29yY2hlc3RyYXRvcicpO1xuICBjb25zdCBpc0tleSA9ICFpc09yY2hlc3RyYXRvciAmJiAhIWtleTtcbiAgY29uc3QgcGFyZW50TG9nS2V5ID0gW2BbXCIke3Rlcm19XCJdYCwgIWlzT3JjaGVzdHJhdG9yICYmIGtleSB8fCBwcm9wZXJ0eV0uZmlsdGVyKEJvb2xlYW4pLmpvaW4oJy4nKTtcbiAgY29uc3QgbG9nTW9kZWxLZXkgPSBbcGFyZW50TG9nS2V5LCBtb2RlbF0uZmlsdGVyKEJvb2xlYW4pLmpvaW4oJy4nKTtcblxuICBzZXQoZ3JvdXAsIGAke3BhcmVudExvZ0tleX0ubW9kZWxzYCwgdW5pcXVlKFtcbiAgICAuLi5nZXQoZ3JvdXAsIGAke3BhcmVudExvZ0tleX0ubW9kZWxzYCwgW10pLFxuICAgIG1vZGVsXG4gIF0pKTtcbiAgc2V0KGdyb3VwLCBgJHtwYXJlbnRMb2dLZXl9LmlzS2V5YCwgaXNLZXkpO1xuXG4gIGxldCBkYXRhID0gZ2V0KGdyb3VwLCBsb2dNb2RlbEtleSwge30pO1xuXG4gIGRhdGEgPSBpbmNsdWRlQmxhbmtOb2RlcyhkYXRhLCBsb2cpO1xuXG4gIGlmICh0eXBlb2Ygc2hvdWxkX3J1biAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBjb25zdCBzaG91bGRSdW4gPSBzaG91bGRfcnVuID09PSAnVHJ1ZSc7XG5cbiAgICBkYXRhID0gaXNPcmNoZXN0cmF0b3IgP1xuICAgICAge1xuICAgICAgICAuLi5kYXRhLFxuICAgICAgICBzaG91bGRSdW5PcmNoZXN0cmF0b3I6IHNob3VsZFJ1blxuICAgICAgfSA6XG4gICAgICB7XG4gICAgICAgIC4uLmRhdGEsXG4gICAgICAgIC4uLm9taXRMb2dLZXlzKGxvZyksXG4gICAgICAgIHNob3VsZFJ1blxuICAgICAgfTtcbiAgfVxuICBlbHNlIGlmICh0eXBlb2YgcnVuX3JlcXVpcmVkICE9PSAndW5kZWZpbmVkJykge1xuICAgIGNvbnN0IHJ1blJlcXVpcmVkID0gcnVuX3JlcXVpcmVkID09PSAnVHJ1ZSc7XG5cbiAgICBkYXRhID0gIHtcbiAgICAgIC4uLmRhdGEsXG4gICAgICAuLi4ocnVuUmVxdWlyZWQgPyB7fSA6IG9taXRMb2dLZXlzKGxvZykpLCAvLyBubyBuZWVkIHRvIHNhdmUgbG9ncyBpZiB3ZSBuZWVkIHRvIHJ1biB0aGUgbW9kZWxcbiAgICAgIHJ1blJlcXVpcmVkXG4gICAgfTtcbiAgfVxuICBlbHNlIGlmICgncmVxdWlyZW1lbnRzJyBpbiBsb2cpIHtcbiAgICBjb25zdCB7IHJlcXVpcmVtZW50cywgLi4ubG9nRGF0YSB9ID0gbG9nO1xuXG4gICAgZGF0YS5yZXF1aXJlbWVudHMgPSB7XG4gICAgICAuLi4oZGF0YS5yZXF1aXJlbWVudHMgfHwge30pLFxuICAgICAgLi4ubG9nRGF0YVxuICAgIH07XG4gIH1cbiAgZWxzZSBpZiAobWlzc2luZ0xvb2t1cFByZWZpeCBpbiBsb2cpIHtcbiAgICBkYXRhLm1pc3NpbmdMb29rdXBzID0gdW5pcXVlKFtcbiAgICAgIC4uLihkYXRhLm1pc3NpbmdMb29rdXBzIHx8IFtdKSxcbiAgICAgIHBhcnNlTG9va3VwKGxvZylcbiAgICBdKTtcbiAgfVxuICBlbHNlIGlmICghaXNPcmNoZXN0cmF0b3IpIHtcbiAgICBkYXRhLmxvZ3MgPSB7XG4gICAgICAuLi4oZGF0YS5sb2dzIHx8IHt9KSxcbiAgICAgIC4uLm9taXRMb2dLZXlzKGxvZylcbiAgICB9O1xuICB9XG5cbiAgc2V0KGdyb3VwLCBsb2dNb2RlbEtleSwgZGF0YSk7XG4gIHJldHVybiBncm91cDtcbn07XG5cbmNvbnN0IGdyb3VwTG9nU3ViVmFsdWUgPSAoZ3JvdXAsIGxvZywga2V5OiBzdHJpbmcpID0+IHtcbiAgY29uc3QgaWQgPSBsb2dba2V5XTtcbiAgY29uc3QgZGF0YSA9IGdyb3VwTG9nKGdyb3VwW2lkXSB8fCB7fSwgbG9nKTtcbiAgZ3JvdXBbaWRdID0gZGF0YTtcblxuICBpZiAoa2V5ID09PSAndHJhbnNmb3JtYXRpb24nKSB7XG4gICAgLy8gYWRkIHZhbHVlIHRvIHRoZSBzYW1lIHRlcm0vbW9kZWwgb24gcGFyZW50IGdyb3VwXG4gICAgT2JqZWN0LmVudHJpZXMoZ3JvdXBbaWRdKS5tYXAoKFt0ZXJtLCBtb2RlbHNdKSA9PlxuICAgICAgT2JqZWN0LmtleXMobW9kZWxzKS5tYXAobW9kZWwgPT4ge1xuICAgICAgICBpZiAoZ3JvdXA/Llt0ZXJtXT8uW21vZGVsXSkge1xuICAgICAgICAgIGdyb3VwW3Rlcm1dW21vZGVsXVtrZXldID0gdW5pcXVlKFtcbiAgICAgICAgICAgIC4uLihncm91cFt0ZXJtXVttb2RlbF1ba2V5XSB8fCBbXSksXG4gICAgICAgICAgICBpZFxuICAgICAgICAgIF0pO1xuICAgICAgICB9XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICByZXR1cm4gZ3JvdXA7XG59O1xuXG5jb25zdCBzdWJWYWx1ZUtleXMgPSBbXG4gICd0cmFuc2Zvcm1hdGlvbidcbl07XG5cbmV4cG9ydCBjb25zdCBncm91cExvZ3NCeU1vZGVsID0gKGRhdGE6IHN0cmluZyk6IElOb2RlTG9ncyA9PlxuICBkYXRhLnNwbGl0KCdcXG4nKVxuICAgIC5tYXAocGFyc2VNZXNzYWdlKVxuICAgIC5maWx0ZXIodiA9PiAhIXY/LnRlcm0gJiYgdj8udGVybSAhPT0gJ05vbmUnICYmICEhdj8ubW9kZWwpXG4gICAgLnJlZHVjZSgoZ3JvdXAsIGxvZykgPT4ge1xuICAgICAgY29uc3Qgc3ViVmFsdWUgPSBzdWJWYWx1ZUtleXMuZmluZCh2ID0+ICEhbG9nW3ZdKTtcbiAgICAgIHJldHVybiBzdWJWYWx1ZSA/XG4gICAgICAgIHN1YlZhbHVlID09PSAndHJhbnNmb3JtYXRpb24nID9cbiAgICAgICAgICAvLyBmb3IgdHJhbnNmb3JtYXRpb24sIGRvIG5vdCBhZGQgdG8gdG9wLWxldmVsIG1vZGVsXG4gICAgICAgICAgZ3JvdXBMb2dTdWJWYWx1ZShncm91cCwgbG9nLCBzdWJWYWx1ZSkgOlxuICAgICAgICAgIGdyb3VwTG9nKGdyb3VwTG9nU3ViVmFsdWUoZ3JvdXAsIGxvZywgc3ViVmFsdWUpLCBsb2cpXG4gICAgICAgIDogZ3JvdXBMb2coZ3JvdXAsIGxvZyk7XG4gICAgfSk7XG5cbmV4cG9ydCBjb25zdCBjb21wdXRlVGVybXMgPSAoXG4gIG9yaWdpbmFsVmFsdWVzOiBibGFua05vZGVbXSwgcmVjYWxjdWxhdGVkVmFsdWVzOiBibGFua05vZGVbXSwgdGVybXM/OiBJVGVybUpTT05MRFtdLCBmaWx0ZXJUZXJtVHlwZXM/OiBUZXJtVGVybVR5cGVbXVxuKSA9PiBmcm9tKFxuICAgIHRlcm1zPy5sZW5ndGggP1xuICAgICAgdGVybXMgOlxuICAgICAgW1xuICAgICAgICAuLi4ob3JpZ2luYWxWYWx1ZXMgfHwgW10pLm1hcCgoeyB0ZXJtIH0pID0+IHRlcm0pLFxuICAgICAgICAuLi4ocmVjYWxjdWxhdGVkVmFsdWVzIHx8IFtdKS5tYXAoKHsgdGVybSB9KSA9PiB0ZXJtKVxuICAgICAgXS5maWx0ZXIobm9kZSA9PiAhZmlsdGVyVGVybVR5cGVzPy5sZW5ndGggfHwgZmlsdGVyVGVybVR5cGVzLmluY2x1ZGVzKG5vZGUudGVybVR5cGUpKVxuICApLnBpcGUoXG4gICAgZGlzdGluY3QodiA9PiB2IVsnQGlkJ10pLFxuICAgIHRvQXJyYXkoKSxcbiAgICBtYXAodiA9PiBvcmRlckJ5KHYsIFsnbmFtZSddLCBbJ2FzYyddKSlcbiAgKS50b1Byb21pc2UoKTtcblxuZXhwb3J0IHR5cGUgYmxhbmtOb2RlID0gRW1pc3Npb24gfCBQcm9kdWN0IHwgSGVzdGlhSW5wdXQgfCBQcm9wZXJ0eTtcblxuZXhwb3J0IGVudW0gTG9nU3RhdHVzIHtcbiAgc3VjY2VzcyA9ICdzdWNjZXNzZnVsJyxcbiAgZXJyb3IgPSAnZmFpbGVkJyxcbiAgc2tpcEhpZXJhcmNoeSA9ICdub3QgcnVuIChtb2RlbCBoaWdoZXIgdXAgaGllcmFyY2h5IHJ1biBpbnN0ZWFkKScsXG4gIGRhdGFQcm92aWRlZCA9ICdub3QgcnVuICh1c2VyIHByb3ZpZGVkIGRhdGEgcmV0YWluZWQpJyxcbiAgbm90UmVxdWlyZWQgPSAnbm90IHJlbGV2YW50J1xufVxuXG5jb25zdCBoYXNMb2dEZXRhaWxzID0gKGRhdGE6IElCbGFua05vZGVMb2dTdWJWYWx1ZSB8IElCbGFua05vZGVMb2csIGxvZ3M/OiBJTm9kZVRlcm1Mb2cpID0+XG4gIFtcbiAgICBMb2dTdGF0dXMuc3VjY2VzcyxcbiAgICBMb2dTdGF0dXMuZXJyb3JcbiAgXS5pbmNsdWRlcyhsb2dTdGF0dXMoZGF0YSwgbG9ncykpICYmIChcbiAgICBsb2dzPy5yZXF1aXJlbWVudHMgfHwgbG9ncz8ubG9ncyB8fCBsb2dzPy5taXNzaW5nTG9va3Vwcz8ubGVuZ3RoXG4gICk7XG5cbmNvbnN0IGxvZ1N0YXR1cyA9IChkYXRhOiBJQmxhbmtOb2RlTG9nU3ViVmFsdWUgfCBJQmxhbmtOb2RlTG9nLCBsb2dzPzogSU5vZGVUZXJtTG9nKSA9PlxuICBoYXNMb2cobG9ncylcbiAgICA/IChcbiAgICAgICFkYXRhLmlzUmVxdWlyZWRcbiAgICAgICAgPyBMb2dTdGF0dXMubm90UmVxdWlyZWRcbiAgICAgICAgOiBpc1J1bk9yY2hlc3RyYXRvcihsb2dzKVxuICAgICAgICAgID8gKFxuICAgICAgICAgICAgJ3Nob3VsZFJ1bicgaW4gbG9nc1xuICAgICAgICAgICAgICA/IGxvZ3Muc2hvdWxkUnVuXG4gICAgICAgICAgICAgICAgPyBkYXRhLmlzUmVjYWxjdWxhdGVkXG4gICAgICAgICAgICAgICAgICA/IExvZ1N0YXR1cy5zdWNjZXNzXG4gICAgICAgICAgICAgICAgICA6IExvZ1N0YXR1cy5kYXRhUHJvdmlkZWRcbiAgICAgICAgICAgICAgICA6IExvZ1N0YXR1cy5lcnJvclxuICAgICAgICAgICAgICA6IExvZ1N0YXR1cy5kYXRhUHJvdmlkZWRcbiAgICAgICAgICApXG4gICAgICAgICAgOiBkYXRhLmlzUmVjYWxjdWxhdGVkXG4gICAgICAgICAgICA/IExvZ1N0YXR1cy5za2lwSGllcmFyY2h5XG4gICAgICAgICAgICA6IExvZ1N0YXR1cy5kYXRhUHJvdmlkZWRcbiAgICApXG4gICAgOiAoXG4gICAgICBbXG4gICAgICAgIHR5cGVvZiBkYXRhLm9yaWdpbmFsVmFsdWUgPT09ICd1bmRlZmluZWQnLCAvLyBubyBvcmlnaW5hbCB2YWx1ZVxuICAgICAgICBkYXRhLmlzUmVjYWxjdWxhdGVkIC8vIGlzIHJlY2FsY3VsYXRlZFxuICAgICAgXS5ldmVyeShCb29sZWFuKVxuICAgICAgICA/IExvZ1N0YXR1cy5za2lwSGllcmFyY2h5XG4gICAgICAgIDogTG9nU3RhdHVzLmRhdGFQcm92aWRlZFxuICAgICk7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUNvbmZpZ01vZGVsIHtcbiAgbWV0aG9kSWQ6IHN0cmluZztcbiAgbG9ncz86IElOb2RlVGVybUxvZztcbiAgaGFzTG9ncz86IGJvb2xlYW47XG4gIHN0YXR1cz86IExvZ1N0YXR1cztcbiAgbW9kZWw/OiBJTW9kZWw7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUJsYW5rTm9kZUxvZ1N1YlZhbHVlIHtcbiAga2V5OiBzdHJpbmc7XG4gIG9yaWdpbmFsVmFsdWU6IG51bWJlciB8IHN0cmluZyB8IGJvb2xlYW47XG4gIHJlY2FsY3VsYXRlZFZhbHVlOiBudW1iZXIgfCBzdHJpbmcgfCBib29sZWFuO1xuICBpc1JlY2FsY3VsYXRlZDogYm9vbGVhbjtcbiAgaXNSZXF1aXJlZD86IGJvb2xlYW47XG4gIGlkPzogYW55O1xuICBjb25maWdNb2RlbHM/OiBJQ29uZmlnTW9kZWxbXTtcbiAgbG9ncz86IElOb2RlVGVybUxvZ3M7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUJsYW5rTm9kZUxvZyB7XG4gIGlzT3BlbjogYm9vbGVhbjtcbiAgY2FuT3BlbjogYm9vbGVhbjtcbiAgdGVybTogSVRlcm1KU09OTEQ7XG4gIHRlcm1JZDogc3RyaW5nO1xuICB0eXBlPzogU2NoZW1hVHlwZTtcbiAgY29uZmlnTW9kZWxzOiAoSUNvbmZpZ01vZGVsIHwgSUNvbmZpZ01vZGVsW10pW107XG4gIG9yaWdpbmFsOiBibGFua05vZGVbXTtcbiAgb3JpZ2luYWxWYWx1ZTogbnVtYmVyO1xuICAvLyB3aGVuIG11bHRpcGxlIG1vZGVscyBhcmUgcnVubmluZyBpbiBwYXJhbGxlbFxuICBvcmlnaW5hbFZhbHVlQnlNZXRob2RJZD86IHtcbiAgICBbbWV0aG9kSWQ6IHN0cmluZ106IG51bWJlcjtcbiAgfTtcbiAgcmVjYWxjdWxhdGVkOiBibGFua05vZGVbXTtcbiAgcmVjYWxjdWxhdGVkVmFsdWU6IG51bWJlcjtcbiAgLy8gd2hlbiBtdWx0aXBsZSBtb2RlbHMgYXJlIHJ1bm5pbmcgaW4gcGFyYWxsZWxcbiAgcmVjYWxjdWxhdGVkVmFsdWVCeU1ldGhvZElkPzoge1xuICAgIFttZXRob2RJZDogc3RyaW5nXTogbnVtYmVyO1xuICB9O1xuICBpc09yaWdpbmFsOiBib29sZWFuO1xuICBpc1JlY2FsY3VsYXRlZDogYm9vbGVhbjtcbiAgaGFzRGF0YTogYm9vbGVhbjtcbiAgaXNSZXF1aXJlZDogYm9vbGVhbjtcbiAgbG9ncz86IElOb2RlVGVybUxvZ3M7XG4gIGtleXM6IElCbGFua05vZGVMb2dTdWJWYWx1ZVtdO1xuICBzdWJWYWx1ZXM6IElCbGFua05vZGVMb2dTdWJWYWx1ZVtdO1xuICAvLyBjb250YWlucyBtdWx0aXBsZSBtb2RlbHMgYWxsIHJ1bm5pbmcgaW4gcGFyYWxsZWxcbiAgYWxsUGFyYWxsZWw/OiBib29sZWFuO1xufVxuXG5jb25zdCByZWR1Y2VWYWx1ZXMgPSAodmFsdWVzOiBhbnlbXSwgdGVybUlkOiBzdHJpbmcpID0+IHtcbiAgY29uc3QgcHJvcGVydHlWYWx1ZXMgPSB2YWx1ZXNcbiAgICAubWFwKCh7IHZhbHVlIH0pID0+IHByb3BlcnR5VmFsdWUodmFsdWUsIHRlcm1JZCkpXG4gICAgLy8gcHJvcGVydHlWYWx1ZSBtYXkgcmV0dXJuIG51bGwgaWYgdGhlIHZhbHVlIGlzIG51bGwgb3IgdW5kZWZpbmVkLCB0aGVyZWZvcmUgcmVtb3ZlIHRoZW0gZnJvbSB0b3RhbFxuICAgIC5maWx0ZXIodiA9PiB2ICE9PSBudWxsKTtcbiAgcmV0dXJuIHByb3BlcnR5VmFsdWVzLmxlbmd0aCA/IHByb3BlcnR5VmFsdWVzLnJlZHVjZSgocCwgdikgPT4gcCArIHYsIDApIDogdW5kZWZpbmVkO1xufTtcblxuY29uc3QgaXNSdW5PcmNoZXN0cmF0b3IgPSAobG9nOiBJTm9kZVRlcm1Mb2cpID0+ICEoJ3Nob3VsZFJ1bk9yY2hlc3RyYXRvcicgaW4gbG9nKSB8fCBsb2cuc2hvdWxkUnVuT3JjaGVzdHJhdG9yO1xuXG5jb25zdCBpc0JhY2tncm91bmQgPSAobG9nOiBJTm9kZVRlcm1Mb2cpID0+IGxvZz8ubWV0aG9kVGllciA9PT0gRW1pc3Npb25NZXRob2RUaWVyLmJhY2tncm91bmQ7XG5cbmNvbnN0IGhhc0xvZyA9IChsb2c6IElOb2RlVGVybUxvZywgd2l0aE9yY2hlc3RyYXRvciA9IHRydWUpID0+XG4gICEhbG9nICYmIChcbiAgICAnc2hvdWxkUnVuJyBpbiBsb2cgfHxcbiAgICAncnVuUmVxdWlyZWQnIGluIGxvZyB8fFxuICAgICh3aXRoT3JjaGVzdHJhdG9yICYmICdzaG91bGRSdW5PcmNoZXN0cmF0b3InIGluIGxvZylcbiAgKTtcblxuY29uc3QgaXNSZWNhbGN1bGF0ZWQgPSAodmFsdWVzOiBibGFua05vZGVbXSwga2V5ID0gJ3ZhbHVlJykgPT4gdmFsdWVzLnNvbWUodiA9PiAoW1xuICAuLi4odi5hZGRlZCB8fCBbXSksXG4gIC4uLih2LnVwZGF0ZWQgfHwgW10pXG5dKS5pbmNsdWRlcyhrZXkpKTtcblxuY29uc3QgYmxhbmtOb2RlVmFsdWVCeUtleToge1xuICBba2V5OiBzdHJpbmddOiAodmFsdWVzOiBibGFua05vZGVbXSwga2V5Pzogc3RyaW5nLCBpZD86IHN0cmluZykgPT4gbnVtYmVyIHwgc3RyaW5nIHwgYm9vbGVhbjtcbn0gPSB7XG4gIHByb3BlcnR5OiAodmFsdWVzOiAoRW1pc3Npb24gfCBQcm9kdWN0IHwgSGVzdGlhSW5wdXQpW10sIF9rLCBpZCkgPT4gISFpZCAmJiB2YWx1ZXM/Lmxlbmd0aFxuICAgID8gKHZhbHVlc1swXS5wcm9wZXJ0aWVzIHx8IFtdKS5maW5kKHAgPT4gcC50ZXJtWydAaWQnXSA9PT0gaWQpPy52YWx1ZSB8fCAnJ1xuICAgIDogJycsXG4gIGlucHV0OiAodmFsdWVzOiBFbWlzc2lvbltdLCBfaywgaWQpID0+ICEhaWQgJiYgdmFsdWVzPy5sZW5ndGhcbiAgICA/IHByb3BlcnR5VmFsdWUodmFsdWVzLmZpbmQoKHsgaW5wdXRzIH0pID0+IChpbnB1dHMgfHwgW10pLnNvbWUoaW5wdXQgPT4gaW5wdXRbJ0BpZCddID09PSBpZCkpPy52YWx1ZSwgaWQpXG4gICAgOiAnJyxcbiAgZGVmYXVsdDogKGJsYW5rTm9kZXMsIGtleSkgPT4ge1xuICAgIGNvbnN0IHZhbHVlID0gYmxhbmtOb2Rlcz8ubGVuZ3RoID8gYmxhbmtOb2Rlc1swXVtrZXldIDogbnVsbDtcbiAgICByZXR1cm4gWydzdHJpbmcnLCAnbnVtYmVyJywgJ2Jvb2xlYW4nLCAndW5kZWZpbmVkJ10uaW5jbHVkZXModHlwZW9mIHZhbHVlKVxuICAgICAgPyBpc1VuZGVmaW5lZCh2YWx1ZSlcbiAgICAgID8gJydcbiAgICAgIDogdmFsdWVcbiAgICAgIDogbnVsbDtcbiAgfVxufTtcblxuY29uc3QgYmxhbmtOb2RlVmFsdWUgPSAoYmxhbmtOb2RlczogYmxhbmtOb2RlW10sIGtleTogc3RyaW5nLCBpZD86IHN0cmluZykgPT5cbiAgYmxhbmtOb2RlVmFsdWVCeUtleVtrZXkgaW4gYmxhbmtOb2RlVmFsdWVCeUtleSA/IGtleSA6ICdkZWZhdWx0J10oYmxhbmtOb2Rlcywga2V5LCBpZCk7XG5cbmNvbnN0IGxvZ1N1YlZhbHVlID0gKGxvZ3M6IElOb2RlVGVybUxvZ3MsIGtleTogc3RyaW5nLCBwcm9wOiBzdHJpbmcpID0+XG4gIGxvZ3Nba2V5XVtwcm9wXSA/IChcbiAgICBBcnJheS5pc0FycmF5KGxvZ3Nba2V5XVtwcm9wXSkgP1xuICAgICAgKGxvZ3Nba2V5XVtwcm9wXSBhcyBzdHJpbmdbXSkubWFwKGlkID0+ICh7IGtleTogcHJvcCwgaWQgfSBhcyBJQmxhbmtOb2RlTG9nU3ViVmFsdWUpKSA6XG4gICAgICB7IGtleTogcHJvcCwgaWQ6IGxvZ3Nba2V5XVtwcm9wXSB9IGFzIElCbGFua05vZGVMb2dTdWJWYWx1ZVxuICApIDogdW5kZWZpbmVkO1xuXG5jb25zdCBsb2dQcm9wZXJ0aWVzID0gKG5vZGVzOiBibGFua05vZGVbXSwgbW9kZWxzOiBJTW9kZWxbXSkgPT5cbiAgbm9kZXMuZmxhdE1hcChub2RlID0+XG4gICAgKChub2RlIGFzIGFueSkucHJvcGVydGllcyB8fCBbXSkubWFwKCh7IHRlcm0gfSkgPT4gdGVybVsnQGlkJ10pXG4gICkubWFwKGlkID0+ICh7IGtleTogJ3Byb3BlcnR5JywgaWQsIGNvbmZpZ01vZGVsczogZmluZE1vZGVscyhtb2RlbHMsIGlkKS5tYXAoKHsgbW9kZWwgfSkgPT4gbW9kZWwpIH0pKTtcblxuY29uc3QgbG9nU3ViVmFsdWVzID0gKFxuICBhbGxMb2dzOiBJTm9kZUxvZ3MsIGxvZ3M6IElOb2RlVGVybUxvZ3MsIG9yaWdpbmFsOiBibGFua05vZGVbXSwgcmVjYWxjdWxhdGVkOiBibGFua05vZGVbXSwgbW9kZWxzOiBJTW9kZWxbXSwgeyBub2RlVHlwZSwgdHlwZSwgdGVybUlkIH1cbik6IElCbGFua05vZGVMb2dTdWJWYWx1ZVtdID0+XG4gIHVuaXF1ZShbXG4gICAgLi4uT2JqZWN0LmtleXMobG9ncykuZmxhdE1hcChrZXkgPT5cbiAgICAgIFtcbiAgICAgICAgbG9nU3ViVmFsdWUobG9ncywga2V5LCAnaW5wdXQnKSxcbiAgICAgICAgbG9nU3ViVmFsdWUobG9ncywga2V5LCAncHJvcGVydHknKVxuICAgICAgXVxuICAgICAgICAuZmxhdCgpXG4gICAgICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICAgICAgLm1hcCh2ID0+ICh7IC4uLnYsIGNvbmZpZ01vZGVsczogW2tleV0gfSkpXG4gICAgKSxcbiAgICAuLi5sb2dQcm9wZXJ0aWVzKG9yaWdpbmFsLCBtb2RlbHMpLFxuICAgIC4uLmxvZ1Byb3BlcnRpZXMocmVjYWxjdWxhdGVkLCBtb2RlbHMpXG4gIF0pXG4gICAgLm1hcCh2ID0+IHtcbiAgICAgIGNvbnN0IG9yaWdpbmFsVmFsdWUgPSBibGFua05vZGVWYWx1ZShvcmlnaW5hbCwgdi5rZXksIHYuaWQpO1xuICAgICAgY29uc3QgcmVjYWxjdWxhdGVkVmFsdWUgPSBibGFua05vZGVWYWx1ZShyZWNhbGN1bGF0ZWQsIHYua2V5LCB2LmlkKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLnYsXG4gICAgICAgIGNvbmZpZ01vZGVsczogdi5jb25maWdNb2RlbHMubWFwKGNvbmZpZ01vZGVsV2l0aERvY3MobW9kZWxzLCB7IG5vZGVUeXBlLCB0eXBlLCB0ZXJtSWQgfSwgdiBhcyBhbnkpKSxcbiAgICAgICAgb3JpZ2luYWxWYWx1ZSxcbiAgICAgICAgcmVjYWxjdWxhdGVkVmFsdWUsXG4gICAgICAgIGlzUmVjYWxjdWxhdGVkOiAhaXNVbmRlZmluZWQocmVjYWxjdWxhdGVkVmFsdWUpICYmIHJlY2FsY3VsYXRlZFZhbHVlICE9PSBvcmlnaW5hbFZhbHVlLFxuICAgICAgICBpc1JlcXVpcmVkOiB0cnVlXG4gICAgICB9O1xuICAgIH0pXG4gICAgLmZpbHRlcih2ID0+IHYuY29uZmlnTW9kZWxzLmxlbmd0aCA+IDApXG4gICAgLm1hcChkYXRhV2l0aENvbmZpZ01vZGVsTG9ncyhhbGxMb2dzKSk7XG5cbi8vIGNvbnN0IGhhc0tleSA9IChibGFua05vZGVzOiBibGFua05vZGVbXSwga2V5OiBzdHJpbmcpID0+IChibGFua05vZGVzIHx8IFtdKS5zb21lKG4gPT4ga2V5IGluIG4pO1xuXG5jb25zdCBsb2dLZXlzID0gKFxuICBsb2dzOiBJTm9kZVRlcm1Mb2dzLCBvcmlnaW5hbDogYmxhbmtOb2RlW10sIHJlY2FsY3VsYXRlZDogYmxhbmtOb2RlW10sIG1vZGVsczogSU1vZGVsW10sIHsgbm9kZVR5cGUsIHR5cGUsIHRlcm1JZCB9XG4pOiBJQmxhbmtOb2RlTG9nU3ViVmFsdWVbXSA9PlxuICBPYmplY3Qua2V5cyhsb2dzKVxuICAgIC5maWx0ZXIoa2V5ID0+IGxvZ3Nba2V5XS5pc0tleSlcbiAgICAubWFwKGtleSA9PiAoe1xuICAgICAga2V5LFxuICAgICAgY29uZmlnTW9kZWxzOiAobG9nc1trZXldLm1vZGVscyB8fCBbXSlcbiAgICAgICAgLm1hcChjb25maWdNb2RlbFdpdGhEb2NzKG1vZGVscywgeyBub2RlVHlwZSwgdHlwZSwgdGVybUlkIH0sIHsga2V5IH0gYXMgYW55KSlcbiAgICAgICAgLy8gb25seSB0YWtlIHRob3NlIHdlIGZvdW5kIGEgbWF0Y2hpbmcgbW9kZWwgKGF2b2lkIG1hdGNoaW5nIGtleSBvbiB3cm9uZyBub2RlIHR5cGUpXG4gICAgICAgIC5maWx0ZXIodiA9PiAhIXYubW9kZWwpLFxuICAgICAgb3JpZ2luYWxWYWx1ZTogYmxhbmtOb2RlVmFsdWUob3JpZ2luYWwsIGtleSksXG4gICAgICByZWNhbGN1bGF0ZWRWYWx1ZTogYmxhbmtOb2RlVmFsdWUocmVjYWxjdWxhdGVkLCBrZXkpLFxuICAgICAgaXNSZWNhbGN1bGF0ZWQ6IGlzUmVjYWxjdWxhdGVkKHJlY2FsY3VsYXRlZCwga2V5KSxcbiAgICAgIGlzUmVxdWlyZWQ6IHRydWVcbiAgICB9KSlcbiAgICAuZmlsdGVyKHYgPT4gdi5jb25maWdNb2RlbHMubGVuZ3RoID4gMClcbiAgICAubWFwKGRhdGFXaXRoQ29uZmlnTW9kZWxMb2dzKGxvZ3MpKTtcblxuY29uc3QgaXNCYWNrZ3JvdW5kTm9JbnB1dCA9IChsb2dzOiBJTm9kZVRlcm1Mb2cpID0+IGxvZ3MubWV0aG9kVGllciA9PT0gRW1pc3Npb25NZXRob2RUaWVyLmJhY2tncm91bmQgJiYgIWxvZ3MuaW5wdXQ7XG5cbmNvbnN0IGlzTW9kZWxMb2cgPSAobG9nczogSU5vZGVUZXJtTG9nKSA9PlxuICBbXG4gICAgIWlzQmFja2dyb3VuZE5vSW5wdXQobG9ncyksXG4gICAgIWxvZ3MuaXNLZXksXG4gICAgIWxvZ3MuaW5wdXQsXG4gICAgIWxvZ3MucHJvcGVydHlcbiAgXS5ldmVyeShCb29sZWFuKSAmJiBbXG4gICAgJ3Nob3VsZFJ1bicgaW4gbG9ncyxcbiAgICAnc2hvdWxkUnVuT3JjaGVzdHJhdG9yJyBpbiBsb2dzLFxuICAgICdydW5SZXF1aXJlZCcgaW4gbG9nc1xuICBdLnNvbWUoQm9vbGVhbik7XG5cbmNvbnN0IG1vZGVsQ29uZmlnT3JkZXIgPSAoXG4gIG1vZGVsczogKElPcmNoZXN0cmF0b3JNb2RlbENvbmZpZyB8IElPcmNoZXN0cmF0b3JNb2RlbENvbmZpZ1tdKVtdLCB0ZXJtSWQ6IHN0cmluZywgbW9kZWxLZXk6IHN0cmluZywgbW9kZWw6IHN0cmluZ1xuKTogc3RyaW5nID0+IHtcbiAgY29uc3QgaW5kZXhlcyA9IG1vZGVscy5tYXAoKG0sIGluZGV4KSA9PiB7XG4gICAgY29uc3QgYXJyYXlJbmRleCA9IEFycmF5LmlzQXJyYXkobSkgPyBtb2RlbENvbmZpZ09yZGVyKG0sIHRlcm1JZCwgbW9kZWxLZXksIG1vZGVsKSA6ICcnO1xuICAgIHJldHVybiBBcnJheS5pc0FycmF5KG0pXG4gICAgICA/IGFycmF5SW5kZXhcbiAgICAgICAgPyBbaW5kZXgsIGFycmF5SW5kZXhdLmpvaW4oJy4nKVxuICAgICAgICA6ICcnXG4gICAgICA6IFt0ZXJtSWQgPT09IG0udmFsdWUsIG1vZGVsS2V5ID09PSBtLmtleSwgbW9kZWwgPT09IG0ubW9kZWxdLmV2ZXJ5KEJvb2xlYW4pXG4gICAgICAgID8gYCR7aW5kZXh9YFxuICAgICAgICA6ICcnO1xuICB9KS5maWx0ZXIoQm9vbGVhbik7XG4gIHJldHVybiBpbmRleGVzLmxlbmd0aCA/IGluZGV4ZXNbMF0gOiAnJztcbn07XG5cbmNvbnN0IGNvbmZpZ01vZGVsV2l0aERvY3MgPSAoXG4gIG1vZGVsczogSU1vZGVsW10sIHsgbm9kZVR5cGUsIHR5cGUsIHRlcm1JZCB9LCBzdWJWYWx1ZT86IElCbGFua05vZGVMb2dTdWJWYWx1ZVxuKSA9PiAobWV0aG9kSWQ6IHN0cmluZykgPT4ge1xuICBjb25zdCBub2RlID0ge1xuICAgICdAdHlwZSc6IG5vZGVUeXBlLFxuICAgIHRlcm06IHsgJ0BpZCc6IHN1YlZhbHVlPy5pZCB8fCB0ZXJtSWQgfSxcbiAgICBtZXRob2RNb2RlbDogeyAnQGlkJzogbWV0aG9kSWQgfVxuICB9IGFzIGFueTtcbiAgcmV0dXJuIHtcbiAgICBtZXRob2RJZCxcbiAgICBtb2RlbDogZmluZE1hdGNoaW5nTW9kZWwobW9kZWxzLCBtb2RlbFBhcmFtcyhub2RlKSkgfHxcbiAgICAgIGZpbmRNYXRjaGluZ01vZGVsKG1vZGVscywgbW9kZWxLZXlQYXJhbXMobm9kZSwgYCR7c3ViVmFsdWU/LmtleX0uJHttZXRob2RJZH1gKSkgfHxcbiAgICAgIC8vIGhhbmRsZSBcImlucHV0LnByaWNlXCJcbiAgICAgIGZpbmRNYXRjaGluZ01vZGVsKG1vZGVscywgbW9kZWxLZXlQYXJhbXMobm9kZSwgYCR7dHlwZS50b0xvd2VyQ2FzZSgpfS4ke3N1YlZhbHVlPy5rZXl9YCkpIHx8XG4gICAgICAvLyBoYW5kbGUgXCJpbnB1dC5oZXN0aWFBZ2dyZWdhdGVkRGF0YVwiXG4gICAgICBmaW5kTWF0Y2hpbmdNb2RlbChtb2RlbHMsIG1vZGVsS2V5UGFyYW1zKG5vZGUsIGAke3R5cGUudG9Mb3dlckNhc2UoKX0uJHttZXRob2RJZH1gKSlcbiAgfTtcbn07XG5cbmNvbnN0IGNvbmZpZ01vZGVsV2l0aExvZ3MgPSAoZGF0YTogSUJsYW5rTm9kZUxvZyB8IElCbGFua05vZGVMb2dTdWJWYWx1ZSwgbG9nczogSU5vZGVUZXJtTG9ncykgPT4gKG1vZGVsOiBJQ29uZmlnTW9kZWwpID0+ICh7XG4gIC4uLm1vZGVsLFxuICBsb2dzOiBsb2dzPy5bbW9kZWwubWV0aG9kSWRdLFxuICBzdGF0dXM6IGxvZ1N0YXR1cyhkYXRhLCBsb2dzPy5bbW9kZWwubWV0aG9kSWRdKSxcbiAgc2hvd0xvZ3M6IGhhc0xvZ0RldGFpbHMoZGF0YSwgbG9ncz8uW21vZGVsLm1ldGhvZElkXSlcbn0gYXMgSUNvbmZpZ01vZGVsKTtcblxuY29uc3QgZGF0YVdpdGhDb25maWdNb2RlbExvZ3MgPSAoXG4gIGxvZ3M6IElOb2RlTG9ncyB8IElOb2RlVGVybUxvZ3NcbikgPT4gPFQgZXh0ZW5kcyAoSUJsYW5rTm9kZUxvZyB8IElCbGFua05vZGVMb2dTdWJWYWx1ZSk+KGRhdGE6IFQpID0+IHtcbiAgY29uc3Qgc3ViTG9nS2V5ID0gKGRhdGEgYXMgSUJsYW5rTm9kZUxvZ1N1YlZhbHVlKS5pZCB8fCAoZGF0YSBhcyBJQmxhbmtOb2RlTG9nU3ViVmFsdWUpLmtleSA/XG4gICAgKGRhdGEgYXMgSUJsYW5rTm9kZUxvZ1N1YlZhbHVlKS5pZCB8fCAoZGF0YSBhcyBJQmxhbmtOb2RlTG9nU3ViVmFsdWUpLmtleSA6IG51bGw7XG4gIGNvbnN0IGxvZyA9IHN1YkxvZ0tleSA/IGxvZ3Nbc3ViTG9nS2V5XSA6IGxvZ3M7XG4gIHJldHVybiB7XG4gICAgLi4uZGF0YSxcbiAgICBjb25maWdNb2RlbHM6IGRhdGEuY29uZmlnTW9kZWxzLm1hcChtb2RlbCA9PlxuICAgICAgQXJyYXkuaXNBcnJheShtb2RlbCkgPyBtb2RlbC5tYXAoY29uZmlnTW9kZWxXaXRoTG9ncyhkYXRhLCBsb2cpKSA6IGNvbmZpZ01vZGVsV2l0aExvZ3MoZGF0YSwgbG9nKShtb2RlbClcbiAgICApXG4gIH0gYXMgVDtcbn07XG5cbi8qKlxuICogR3JvdXAgbW9kZWxzIHJ1bm5pbmcgaW4gcGFyYWxsZWwgdW5kZXIgdGhlIHNhbWUgYXJyYXksIGFzIHRoZXkgc2hvdWxkIGFwcGVhciB2ZXJ0aWNhbGx5LlxuICpcbiAqIEBwYXJhbSBjb25maWcgVGhlIGNvbmZpZ3VyYXRpb24uXG4gKiBAcGFyYW0gbW9kZWxzIFRoZSBsaXN0IG9mIG1vZGVsc1xuICovXG5jb25zdCBncm91cFBhcmFsbGVsTW9kZWxzID0gKGNvbmZpZzogSU9yY2hlc3RyYXRvckNvbmZpZywgdGVybUlkOiBzdHJpbmcsIG1vZGVsS2V5OiBzdHJpbmcsIG1vZGVsczogSUNvbmZpZ01vZGVsW10pID0+IHtcbiAgY29uc3QgbW9kZWxzV2l0aE9yZGVyID0gbW9kZWxzLm1hcChtb2RlbCA9PiAoe1xuICAgIG1vZGVsLFxuICAgIG9yZGVyOiBtb2RlbENvbmZpZ09yZGVyKGNvbmZpZy5tb2RlbHMsIHRlcm1JZCwgbW9kZWxLZXksIG1vZGVsLm1ldGhvZElkKVxuICB9KSk7XG4gIHJldHVybiBtb2RlbHNXaXRoT3JkZXJcbiAgICAucmVkdWNlKChwcmV2LCB7IG1vZGVsLCBvcmRlciB9KSA9PiB7XG4gICAgICBjb25zdCBpc0FycmF5ID0gb3JkZXIuaW5jbHVkZXMoJy4nKTtcbiAgICAgIGNvbnN0IGFycmF5SW5kZXggPSBpc0FycmF5ID8gb3JkZXIuc3BsaXQoJy4nKVswXSA6IHByZXYubGVuZ3RoO1xuICAgICAgcHJldlthcnJheUluZGV4XSA9IGlzQXJyYXkgPyBbLi4uKHByZXZbYXJyYXlJbmRleF0gfHwgW10pLCBtb2RlbF0gOiBtb2RlbDtcbiAgICAgIHJldHVybiBwcmV2O1xuICAgIH0sIFtdIGFzIElDb25maWdNb2RlbFtdW10pXG4gICAgLmZpbHRlcihCb29sZWFuKVxuICAgIC5tYXAodiA9PiB2Lmxlbmd0aCA9PT0gMSA/IHZbMF0gOiB2KTtcbn07XG5cbmNvbnN0IGFsbFBhcmFsbGVsID0gKG1vZGVsczogKElDb25maWdNb2RlbCB8IElDb25maWdNb2RlbFtdKVtdKSA9PlxuICBtb2RlbHMubGVuZ3RoID09PSAxICYmIEFycmF5LmlzQXJyYXkobW9kZWxzWzBdKSAmJiBtb2RlbHNbMF0ubGVuZ3RoID4gMTtcblxuY29uc3QgdmFsdWVCeU1ldGhvZElkID0gKHZhbHVlczogYmxhbmtOb2RlW10sIG1ldGhvZElkOiBzdHJpbmcsIHRlcm1JZDogc3RyaW5nKSA9PlxuICBwcm9wZXJ0eVZhbHVlKHZhbHVlcy5maW5kKHYgPT4gdi5tZXRob2RNb2RlbD8uWydAaWQnXSA9PT0gbWV0aG9kSWQpPy52YWx1ZSBhcyBudW1iZXJbXSwgdGVybUlkKTtcblxuY29uc3QgZ3JvdXBQYXJhbGxlbFZhbHVlcyA9ICh2YWx1ZXM6IGJsYW5rTm9kZVtdLCBtb2RlbHM6IElDb25maWdNb2RlbCB8IElDb25maWdNb2RlbFtdLCB0ZXJtSWQ6IHN0cmluZykgPT5cbiAgQXJyYXkuaXNBcnJheShtb2RlbHMpXG4gICAgPyBPYmplY3QuZnJvbUVudHJpZXMobW9kZWxzLm1hcChtb2RlbCA9PiBbbW9kZWwubWV0aG9kSWQsIHZhbHVlQnlNZXRob2RJZCh2YWx1ZXMsIG1vZGVsLm1ldGhvZElkLCB0ZXJtSWQpXSkpXG4gICAgOiB7fTtcblxuZXhwb3J0IGNvbnN0IGdyb3VwTG9nc0J5VGVybSA9IChcbiAgbm9kZVR5cGU6IE5vZGVUeXBlLCBsb2dzOiBJTm9kZUxvZ3MsIG1vZGVsczogSU1vZGVsW10sIGNvbmZpZzogSU9yY2hlc3RyYXRvckNvbmZpZyxcbiAgYWxsT3JpZ2luYWxWYWx1ZXM6IGJsYW5rTm9kZVtdLCBhbGxSZWNhbGN1bGF0ZWRWYWx1ZXM6IGJsYW5rTm9kZVtdLFxuICBub2RlS2V5Pzogc3RyaW5nXG4pID0+IHtcbiAgY29uc3Qgb3JpZ2luYWxWYWx1ZXMgPSAoYWxsT3JpZ2luYWxWYWx1ZXMgfHwgW10pLmZpbHRlcih2YWx1ZSA9PiAhKHZhbHVlIGFzIGFueSkuZGVsZXRlZCk7XG4gIGNvbnN0IHJlY2FsY3VsYXRlZFZhbHVlcyA9IChhbGxSZWNhbGN1bGF0ZWRWYWx1ZXMgfHwgW10pLmZpbHRlcih2YWx1ZSA9PiAhKHZhbHVlIGFzIGFueSkuZGVsZXRlZCk7XG4gIGNvbnN0IHR5cGU6IFNjaGVtYVR5cGUgPSBvcmlnaW5hbFZhbHVlcy5sZW5ndGggP1xuICAgIG9yaWdpbmFsVmFsdWVzWzBdWydAdHlwZSddIHx8IG9yaWdpbmFsVmFsdWVzWzBdLnR5cGUgOlxuICAgIHJlY2FsY3VsYXRlZFZhbHVlcy5sZW5ndGggP1xuICAgICAgcmVjYWxjdWxhdGVkVmFsdWVzWzBdWydAdHlwZSddIHx8IHJlY2FsY3VsYXRlZFZhbHVlc1swXS50eXBlIDpcbiAgICAgIHVuZGVmaW5lZDtcblxuICByZXR1cm4gKHRlcm06IElUZXJtSlNPTkxEKTogSUJsYW5rTm9kZUxvZyA9PiB7XG4gICAgY29uc3QgdGVybUlkID0gdGVybVsnQGlkJ107XG4gICAgY29uc3QgdGVybUxvZ3MgPSBnZXQobG9ncywgdGVybUlkLCB7fSkgYXMgSU5vZGVUZXJtTG9ncztcbiAgICBjb25zdCBvcmlnaW5hbCA9IG9yaWdpbmFsVmFsdWVzLmZpbHRlcih2ID0+IHRlcm1JZCA9PT0gdi50ZXJtIVsnQGlkJ10pO1xuICAgIGNvbnN0IHJlY2FsY3VsYXRlZCA9IHJlY2FsY3VsYXRlZFZhbHVlcy5maWx0ZXIodiA9PiB0ZXJtSWQgPT09IHYudGVybSFbJ0BpZCddKTtcbiAgICBjb25zdCBoYXNEYXRhID0gISFvcmlnaW5hbC5sZW5ndGggfHwgISFyZWNhbGN1bGF0ZWQubGVuZ3RoIHx8IE9iamVjdC5rZXlzKHRlcm1Mb2dzKS5sZW5ndGggPiAwO1xuICAgIGNvbnN0IGNvbmZpZ01vZGVsc0RhdGEgPSB7IG5vZGVUeXBlLCB0eXBlLCB0ZXJtSWQgfTtcbiAgICBjb25zdCBjb25maWdNb2RlbHMgPSBncm91cFBhcmFsbGVsTW9kZWxzKFxuICAgICAgY29uZmlnLCB0ZXJtSWQsIG5vZGVLZXkhLFxuICAgICAgdW5pcXVlKFtcbiAgICAgICAgLi4uKHRlcm1Mb2dzLm1vZGVscyB8fCBbXSkuZmlsdGVyKGtleSA9PiBpc01vZGVsTG9nKHRlcm1Mb2dzW2tleV0pKSxcbiAgICAgICAgLi4uZmluZENvbmZpZ01vZGVscyhjb25maWcsIHRlcm1JZCwgbm9kZUtleSEsIG1vZGVscykubWFwKCh7IG1vZGVsIH0pID0+IG1vZGVsIGFzIHN0cmluZylcbiAgICAgIF0pLm1hcChjb25maWdNb2RlbFdpdGhEb2NzKG1vZGVscywgY29uZmlnTW9kZWxzRGF0YSkpXG4gICAgKTtcbiAgICBjb25zdCBrZXlzID0gbG9nS2V5cyh0ZXJtTG9ncywgb3JpZ2luYWwsIHJlY2FsY3VsYXRlZCwgbW9kZWxzLCBjb25maWdNb2RlbHNEYXRhKTtcbiAgICBjb25zdCBzdWJWYWx1ZXMgPSBsb2dTdWJWYWx1ZXMobG9ncywgdGVybUxvZ3MsIG9yaWdpbmFsLCByZWNhbGN1bGF0ZWQsIG1vZGVscywgY29uZmlnTW9kZWxzRGF0YSk7XG4gICAgY29uc3QgaXNSZXF1aXJlZCA9ICFPYmplY3QudmFsdWVzKHRlcm1Mb2dzKVxuICAgICAgLmZpbHRlcih2ID0+IHR5cGVvZiB2ID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheSh2KSlcbiAgICAgIC8vIGlnbm9yZSBtb2RlbHMgdGhhdCB3ZXJlIG5ldmVyIGdvaW5nIHRvIHJ1blxuICAgICAgLmZpbHRlcihpc1J1bk9yY2hlc3RyYXRvcilcbiAgICAgIC5ldmVyeSh2ID0+IHYucnVuUmVxdWlyZWQgPT09IGZhbHNlKTtcblxuICAgIHJldHVybiBkYXRhV2l0aENvbmZpZ01vZGVsTG9ncyh0ZXJtTG9ncykoe1xuICAgICAgaXNPcGVuOiB0cnVlLFxuICAgICAgY2FuT3Blbjoga2V5cy5sZW5ndGggPiAwIHx8IHN1YlZhbHVlcy5sZW5ndGggPiAwLFxuICAgICAgdGVybUlkLFxuICAgICAgdGVybSxcbiAgICAgIHR5cGUsXG4gICAgICBjb25maWdNb2RlbHMsXG4gICAgICBvcmlnaW5hbCxcbiAgICAgIG9yaWdpbmFsVmFsdWU6IHJlZHVjZVZhbHVlcyhvcmlnaW5hbCwgdGVybUlkKSxcbiAgICAgIHJlY2FsY3VsYXRlZCxcbiAgICAgIHJlY2FsY3VsYXRlZFZhbHVlOiByZWR1Y2VWYWx1ZXMocmVjYWxjdWxhdGVkLCB0ZXJtSWQpLFxuICAgICAgaXNPcmlnaW5hbDogISFvcmlnaW5hbC5sZW5ndGgsXG4gICAgICBpc1JlY2FsY3VsYXRlZDogaXNSZWNhbGN1bGF0ZWQocmVjYWxjdWxhdGVkKSxcbiAgICAgIGhhc0RhdGEsXG4gICAgICBpc1JlcXVpcmVkLFxuICAgICAgbG9nczogdGVybUxvZ3MsXG4gICAgICBrZXlzLFxuICAgICAgc3ViVmFsdWVzLFxuICAgICAgYWxsUGFyYWxsZWw6IGFsbFBhcmFsbGVsKGNvbmZpZ01vZGVscyksXG4gICAgICBvcmlnaW5hbFZhbHVlQnlNZXRob2RJZDogZ3JvdXBQYXJhbGxlbFZhbHVlcyhvcmlnaW5hbCwgY29uZmlnTW9kZWxzWzBdLCB0ZXJtSWQpLFxuICAgICAgcmVjYWxjdWxhdGVkVmFsdWVCeU1ldGhvZElkOiBncm91cFBhcmFsbGVsVmFsdWVzKHJlY2FsY3VsYXRlZCwgY29uZmlnTW9kZWxzWzBdLCB0ZXJtSWQpXG4gICAgfSk7XG4gIH07XG59O1xuXG5leHBvcnQgY29uc3QgbW9kZWxDb3VudCA9IChibGFua05vZGVMb2dzOiBJQmxhbmtOb2RlTG9nW10pID0+IE1hdGgubWF4LmFwcGx5KE1hdGgubWF4LCBbXG4gIDAsXG4gIC4uLmJsYW5rTm9kZUxvZ3MuZmxhdE1hcCh2ID0+IFtcbiAgICB2LmNvbmZpZ01vZGVscy5sZW5ndGgsXG4gICAgLi4udi5zdWJWYWx1ZXMubWFwKHMgPT4gcy5jb25maWdNb2RlbHM/Lmxlbmd0aCA/PyAwKSxcbiAgICB2LmtleXMubGVuZ3RoID8gMSA6IDBcbiAgXSlcbl0pO1xuIl19